[hdf5] 07/26: Imported Upstream version 1.10.0~alpha0+docs

Gilles Filippini pini at debian.org
Sun Jan 24 15:33:09 UTC 2016


This is an automated email from the git hooks/post-receive script.

pini pushed a commit to branch master-1.10
in repository hdf5.

commit ffa09534a82280fded2cb9b813883ccbfb8007d8
Author: Gilles Filippini <pini at debian.org>
Date:   Sun Jan 17 23:26:30 2016 +0100

    Imported Upstream version 1.10.0~alpha0+docs
---
 BRANCH.txt                                         |    15 +
 CMakeInstallation.cmake                            |    36 +-
 CMakeLists.txt                                     |   195 +-
 COPYING                                            |     6 +
 CTestConfig.cmake                                  |    10 +-
 MANIFEST                                           |   756 +-
 Makefile.am                                        |     2 +-
 Makefile.in                                        |   100 +-
 README.txt                                         |     2 +-
 aclocal.m4                                         |  8659 +------
 acsite.m4                                          |    84 -
 autogen.sh                                         |   300 +
 bin/chkmanifest                                    |    16 +
 bin/cmakehdf5                                      |   521 +-
 bin/compile                                        |   370 +-
 bin/config.guess                                   |   738 +-
 bin/config.sub                                     |   351 +-
 bin/depcomp                                        |   636 +-
 bin/distdep                                        |     0
 bin/genparser                                      |   252 +
 bin/h5vers                                         |    52 +-
 bin/install-sh                                     |   385 +-
 bin/ltmain.sh                                      |    32 +-
 bin/make_vers                                      |   111 +-
 bin/missing                                        |     2 +-
 bin/mkinstalldirs                                  |   101 -
 bin/release                                        |    25 +-
 bin/test-driver                                    |    15 +-
 bin/trace                                          |    10 +-
 c++/Makefile.in                                    |    68 +-
 c++/examples/Makefile.am                           |     4 +-
 c++/examples/Makefile.in                           |    76 +-
 c++/examples/run-c++-ex.sh.in                      |     2 +-
 c++/examples/testh5c++.sh.in                       |     3 +-
 c++/src/CMakeLists.txt                             |     2 +-
 c++/src/H5Attribute.cpp                            |     4 +-
 c++/src/H5CommonFG.cpp                             |     1 +
 c++/src/H5DataSet.cpp                              |    10 +-
 c++/src/H5DataSet.h                                |     4 +-
 c++/src/H5DataType.cpp                             |    12 +-
 c++/src/H5DataType.h                               |     4 +-
 c++/src/H5Exception.cpp                            |     2 +-
 c++/src/H5FcreatProp.cpp                           |     2 +
 c++/src/H5FcreatProp.h                             |     2 +
 c++/src/H5File.cpp                                 |    26 +-
 c++/src/H5Group.cpp                                |    10 +-
 c++/src/H5Group.h                                  |     5 +-
 c++/src/H5IdComponent.cpp                          |     4 -
 c++/src/H5IdComponent.h                            |     1 -
 c++/src/H5Library.cpp                              |     4 -
 c++/src/H5Location.cpp                             |    25 +-
 c++/src/H5Location.h                               |    16 +-
 c++/src/H5OcreatProp.cpp                           |     2 +
 c++/src/H5VarLenType.h                             |     3 -
 c++/src/Makefile.am                                |     2 +-
 c++/src/Makefile.in                                |   101 +-
 c++/src/cpp_doc_config                             |     2 +-
 c++/test/Makefile.in                               |    72 +-
 c++/test/tattr.cpp                                 |     4 +-
 c++/test/tcompound.cpp                             |    57 +-
 c++/test/testhdf5.cpp                              |     1 +
 c++/test/tfile.cpp                                 |     4 +-
 c++/test/th5s.h5                                   |   Bin 2049 -> 2049 bytes
 c++/test/tlinks.cpp                                |     6 +-
 c++/test/trefer.cpp                                |    33 +-
 c++/test/ttypes.cpp                                |     5 +-
 config/cmake/CTestCustom.cmake                     |    20 +-
 config/cmake/ConfigureChecks.cmake                 |    13 +-
 config/cmake/H5pubconf.h.in                        |    27 +
 config/cmake/HDF518_Examples.cmake.in              |     9 +
 config/cmake/HDF5Macros.cmake                      |    11 +-
 config/cmake/HDF5UseFortran.cmake                  |   489 +
 config/cmake/HDF5_Examples.cmake.in                |   172 +
 config/cmake/HDF5_Process_Flex_Files.cmake         |    84 +
 config/cmake/HDFCompilerFlags.cmake                |     4 +-
 config/cmake/README.txt.cmake.in                   |    12 +-
 config/cmake/cacheinit.cmake                       |     2 +
 config/cmake/hdf5-config.cmake.in                  |     1 -
 config/cmake/libhdf5.settings.cmake.in             |     1 -
 config/cmake/mccacheinit.cmake                     |     6 +-
 config/cmake/scripts/CTestScript.cmake             |    56 +-
 config/cmake/scripts/HDF518config.cmake            |   261 -
 config/cmake/scripts/HDF5config.cmake              |   257 +
 config/cmake_ext_mod/ConfigureChecks.cmake         |    35 +-
 config/conclude_fc.am                              |    33 +
 config/lt_vers.am                                  |    30 +-
 config/pgi-fflags                                  |     1 +
 configure                                          | 25973 ++++++++++---------
 configure.ac                                       |   848 +-
 examples/CMakeLists.txt                            |     8 +
 examples/CMakeTests.cmake                          |    12 +
 examples/Makefile.am                               |    20 +-
 examples/Makefile.in                               |    92 +-
 examples/h5_extend_write.c                         |     6 +-
 examples/h5_ref2reg.c                              |     4 +-
 examples/h5_reference.c                            |     2 +-
 examples/h5_vds-eiger.c                            |   177 +
 examples/h5_vds-exc.c                              |   226 +
 examples/h5_vds-exclim.c                           |   222 +
 examples/h5_vds-percival-unlim-maxmin.c            |   309 +
 examples/h5_vds-percival-unlim.c                   |   353 +
 examples/h5_vds-percival.c                         |   242 +
 examples/h5_vds-simpleIO.c                         |   184 +
 examples/h5_vds.c                                  |   267 +
 examples/run-c-ex.sh.in                            |    20 +-
 examples/testh5cc.sh.in                            |     3 +-
 fortran/Makefile.in                                |    68 +-
 fortran/examples/CMakeLists.txt                    |    54 +-
 fortran/examples/Makefile.am                       |    18 +-
 fortran/examples/Makefile.in                       |   117 +-
 fortran/examples/nested_derived_type.f90           |    12 +-
 fortran/examples/run-fortran-ex.sh.in              |     2 +-
 fortran/examples/rwdset_fortran2003.f90            |    24 +-
 fortran/src/CMakeLists.txt                         |   246 +-
 fortran/src/H5Af.c                                 |  1478 +-
 fortran/src/H5Aff.F90                              |  1873 ++
 fortran/src/H5Aff.f90                              |  1673 --
 fortran/src/H5Aff_F03.f90                          |  1267 -
 fortran/src/H5Aff_F90.f90                          |  1618 --
 fortran/src/H5Df.c                                 |  1658 +-
 fortran/src/H5Dff.F90                              |  1877 ++
 fortran/src/H5Dff.f90                              |  1035 -
 fortran/src/H5Dff_F03.f90                          |  2389 --
 fortran/src/H5Dff_F90.f90                          |  3004 ---
 fortran/src/H5Ef.c                                 |    75 +-
 fortran/src/H5Eff.F90                              |   302 +
 fortran/src/H5Eff.f90                              |   251 -
 fortran/src/H5Eff_F03.f90                          |   108 -
 fortran/src/H5Eff_F90.f90                          |    89 -
 fortran/src/H5FDmpiof.c                            |   258 -
 fortran/src/H5FDmpioff.f90                         |   212 -
 fortran/src/H5Ff.c                                 |   238 +-
 fortran/src/H5Fff.F90                              |   871 +
 fortran/src/H5Fff.f90                              |   834 -
 fortran/src/H5Fff_F03.f90                          |    99 -
 fortran/src/H5Fff_F90.f90                          |    43 -
 fortran/src/H5Gf.c                                 |   393 +-
 fortran/src/H5Gff.F90                              |  1272 +
 fortran/src/H5Gff.f90                              |  1331 -
 fortran/src/H5If.c                                 |   104 +-
 fortran/src/H5Iff.F90                              |   345 +
 fortran/src/H5Iff.f90                              |   352 -
 fortran/src/H5Lf.c                                 |   324 +-
 fortran/src/H5Lff.F90                              |  1478 ++
 fortran/src/H5Lff.f90                              |  1300 -
 fortran/src/H5Lff_F03.f90                          |   243 -
 fortran/src/H5Lff_F90.f90                          |    39 -
 fortran/src/H5Of.c                                 |    94 +-
 fortran/src/H5Off.F90                              |  1149 +
 fortran/src/H5Off.f90                              |   775 -
 fortran/src/H5Off_F03.f90                          |   435 -
 fortran/src/H5Off_F90.f90                          |    39 -
 fortran/src/H5Pf.c                                 |  2663 +-
 fortran/src/H5Pff.F90                              |  7327 ++++++
 fortran/src/H5Pff.f90                              |  6400 -----
 fortran/src/H5Pff_F03.f90                          |  1267 -
 fortran/src/H5Pff_F90.f90                          |   949 -
 fortran/src/H5Rf.c                                 |   340 +-
 fortran/src/H5Rff.F90                              |   792 +
 fortran/src/H5Rff.f90                              |   128 -
 fortran/src/H5Rff_F03.f90                          |   719 -
 fortran/src/H5Rff_F90.f90                          |   514 -
 fortran/src/H5Sf.c                                 |   554 +-
 fortran/src/H5Sff.F90                              |  1754 ++
 fortran/src/H5Sff.f90                              |  1875 --
 fortran/src/H5Tf.c                                 |   684 +-
 fortran/src/H5Tff.F90                              |  3082 +++
 fortran/src/H5Tff.f90                              |  3105 ---
 fortran/src/H5Tff_F03.f90                          |   224 -
 fortran/src/H5Tff_F90.f90                          |    96 -
 fortran/src/H5Zf.c                                 |    44 +-
 fortran/src/H5Zff.F90                              |   189 +
 fortran/src/H5Zff.f90                              |   198 -
 fortran/src/H5_DBLE_InterfaceExclude.f90           |    39 -
 fortran/src/H5_DBLE_InterfaceInclude.f90           |  1859 --
 fortran/src/H5_buildiface.F90                      |  1024 +
 fortran/src/H5_f.c                                 |   297 +-
 fortran/src/H5_ff.F90                              |   462 +
 fortran/src/H5_ff.f90                              |   409 -
 fortran/src/H5_ff_F03.f90                          |    75 -
 fortran/src/H5_ff_F90.f90                          |    34 -
 fortran/src/H5config_f.inc.cmake                   |    87 +
 fortran/src/H5config_f.inc.in                      |    62 +
 fortran/src/H5f90global.F90                        |  1052 +
 fortran/src/H5f90global.f90                        |   946 -
 fortran/src/H5f90kit.c                             |    32 +-
 fortran/src/H5f90proto.h                           |  1479 +-
 fortran/src/H5fort_type_defines.h.in               |    16 +
 fortran/src/H5match_types.c                        |   567 +-
 fortran/src/H5test_kind.f90                        |   269 -
 fortran/src/H5test_kind_SIZEOF.f90                 |   228 -
 fortran/src/H5test_kind_STORAGE_SIZE.f90           |   230 -
 fortran/src/HDF5.F90                               |    46 +
 fortran/src/HDF5.f90                               |    56 -
 fortran/src/HDF5mpio.f90                           |    55 -
 fortran/src/Makefile.am                            |   166 +-
 fortran/src/Makefile.in                            |   385 +-
 fortran/src/hdf5_fortrandll.def.in                 |   275 +-
 fortran/test/CMakeLists.txt                        |   283 +-
 fortran/test/H5_test_buildiface.F90                |   306 +
 fortran/test/Makefile.am                           |    78 +-
 fortran/test/Makefile.in                           |   418 +-
 fortran/test/{fflush1.f90 => fflush1.F90}          |     0
 fortran/test/fflush2.F90                           |   177 +
 fortran/test/fflush2.f90                           |   178 -
 fortran/test/fortranlib_test.F90                   |   257 +
 fortran/test/fortranlib_test.f90                   |   249 -
 ...ranlib_test_1_8.f90 => fortranlib_test_1_8.F90} |     0
 fortran/test/fortranlib_test_F03.F90               |   193 +
 fortran/test/fortranlib_test_F03.f90               |   188 -
 fortran/test/tH5A.F90                              |   624 +
 fortran/test/tH5A.f90                              |   629 -
 fortran/test/tH5A_1_8.F90                          |  2779 ++
 fortran/test/tH5A_1_8.f90                          |  2816 --
 fortran/test/tH5D.F90                              |   630 +
 fortran/test/tH5D.f90                              |   538 -
 fortran/test/{tH5E.f90 => tH5E.F90}                |     0
 fortran/test/tH5E_F03.F90                          |   203 +
 fortran/test/tH5E_F03.f90                          |   206 -
 fortran/test/{tH5F.f90 => tH5F.F90}                |     0
 fortran/test/tH5F_F03.F90                          |   179 +
 fortran/test/tH5F_F03.f90                          |   178 -
 fortran/test/{tH5G.f90 => tH5G.F90}                |     0
 fortran/test/tH5G_1_8.F90                          |  2126 ++
 fortran/test/tH5G_1_8.f90                          |  2159 --
 fortran/test/tH5I.F90                              |   321 +
 fortran/test/tH5I.f90                              |   319 -
 fortran/test/tH5L_F03.F90                          |   318 +
 fortran/test/tH5L_F03.f90                          |   321 -
 fortran/test/tH5MISC_1_8.F90                       |   469 +
 fortran/test/tH5MISC_1_8.f90                       |   474 -
 fortran/test/tH5O.F90                              |   793 +
 fortran/test/tH5O.f90                              |   797 -
 fortran/test/tH5O_F03.F90                          |   555 +
 fortran/test/tH5O_F03.f90                          |   555 -
 fortran/test/tH5P.F90                              |   677 +
 fortran/test/tH5P.f90                              |   696 -
 fortran/test/tH5P_F03.F90                          |   620 +
 fortran/test/tH5P_F03.f90                          |   632 -
 fortran/test/tH5R.F90                              |   483 +
 fortran/test/tH5R.f90                              |   486 -
 fortran/test/tH5S.F90                              |   298 +
 fortran/test/tH5S.f90                              |   296 -
 fortran/test/tH5Sselect.F90                        |  1993 ++
 fortran/test/tH5Sselect.f90                        |  2000 --
 fortran/test/tH5T.F90                              |  1149 +
 fortran/test/tH5T.f90                              |  1160 -
 fortran/test/tH5T_F03.F90                          |  3425 +++
 fortran/test/tH5T_F03.f90                          |  3453 ---
 fortran/test/tH5VL.F90                             |   512 +
 fortran/test/tH5VL.f90                             |   518 -
 fortran/test/{tH5Z.f90 => tH5Z.F90}                |     0
 fortran/test/tHDF5.F90                             |    46 +
 fortran/test/tHDF5.f90                             |    45 -
 fortran/test/{tHDF5_1_8.f90 => tHDF5_1_8.F90}      |     0
 fortran/test/{tHDF5_F03.f90 => tHDF5_F03.F90}      |     0
 fortran/test/tf.F90                                |   412 +
 fortran/test/tf.f90                                |   393 -
 fortran/test/tf_F03.f90                            |   128 -
 fortran/test/tf_F08.f90                            |   128 -
 fortran/test/tf_F90.f90                            |    33 -
 fortran/testpar/Makefile.am                        |     2 +-
 fortran/testpar/Makefile.in                        |    90 +-
 hl/Makefile.in                                     |    68 +-
 hl/c++/Makefile.in                                 |    68 +-
 hl/c++/examples/Makefile.am                        |     4 +-
 hl/c++/examples/Makefile.in                        |    74 +-
 hl/c++/examples/run-hlc++-ex.sh.in                 |     2 +-
 hl/c++/src/CMakeLists.txt                          |     6 +-
 hl/c++/src/H5PacketTable.cpp                       |     6 +-
 hl/c++/src/H5PacketTable.h                         |     6 +-
 hl/c++/src/Makefile.am                             |     2 +-
 hl/c++/src/Makefile.in                             |   100 +-
 hl/c++/test/Makefile.in                            |    70 +-
 hl/examples/Makefile.am                            |     4 +-
 hl/examples/Makefile.in                            |    74 +-
 hl/examples/run-hlc-ex.sh.in                       |     2 +-
 hl/fortran/Makefile.in                             |    68 +-
 hl/fortran/examples/Makefile.am                    |     6 +-
 hl/fortran/examples/Makefile.in                    |    92 +-
 hl/fortran/examples/run-hlfortran-ex.sh.in         |     2 +-
 hl/fortran/src/CMakeLists.txt                      |    77 +-
 hl/fortran/src/H5DSfc.c                            |    36 +-
 hl/fortran/src/H5DSff.F90                          |   518 +
 hl/fortran/src/H5DSff.f90                          |   545 -
 hl/fortran/src/H5HL_buildiface.F90                 |   846 +
 hl/fortran/src/H5IMcc.c                            |     4 +-
 hl/fortran/src/H5IMfc.c                            |    54 +-
 hl/fortran/src/H5IMff.F90                          |   667 +
 hl/fortran/src/H5IMff.f90                          |   783 -
 hl/fortran/src/H5LTf90proto.h                      |  1382 +-
 hl/fortran/src/H5LTfc.c                            |  1474 +-
 hl/fortran/src/H5LTff.F90                          |  1878 ++
 hl/fortran/src/H5LTff.f90                          |  6490 -----
 hl/fortran/src/H5TBfc.c                            |   307 +-
 hl/fortran/src/H5TBff.F90                          |   848 +
 hl/fortran/src/H5TBff.f90                          |  1900 --
 hl/fortran/src/Makefile.am                         |    42 +-
 hl/fortran/src/Makefile.in                         |   225 +-
 hl/fortran/src/hdf5_hl_fortrandll.def.in           |    88 +
 hl/fortran/test/CMakeLists.txt                     |    16 +-
 hl/fortran/test/Makefile.am                        |    10 +-
 hl/fortran/test/Makefile.in                        |   117 +-
 hl/fortran/test/{tstds.f90 => tstds.F90}           |     0
 hl/fortran/test/{tstimage.f90 => tstimage.F90}     |     0
 hl/fortran/test/tstlite.F90                        |  1924 ++
 hl/fortran/test/tstlite.f90                        |  1628 --
 hl/fortran/test/tsttable.F90                       |   534 +
 hl/fortran/test/tsttable.f90                       |   466 -
 hl/src/CMakeLists.txt                              |     4 +-
 hl/src/H5DO.c                                      |   184 +
 hl/src/H5DOpublic.h                                |    13 +-
 hl/src/H5DS.c                                      |    14 +-
 hl/src/H5IM.c                                      |    26 +-
 hl/src/H5LD.c                                      |   639 +
 hl/src/H5LDprivate.h                               |    49 +
 hl/src/H5LDpublic.h                                |    33 +
 hl/src/H5LT.c                                      |    21 +-
 hl/src/H5LTanalyze.c                               |   191 +-
 hl/src/H5LTanalyze.l                               |    11 +
 hl/src/H5LTparse.c                                 |  1312 +-
 hl/src/H5LTparse.h                                 |   171 +-
 hl/src/H5LTparse.y                                 |    19 +-
 hl/src/H5TB.c                                      |     2 +-
 hl/src/Makefile.am                                 |     8 +-
 hl/src/Makefile.in                                 |   109 +-
 hl/src/hdf5_hl.h                                   |     3 +-
 hl/test/Makefile.am                                |     8 +-
 hl/test/Makefile.in                                |   138 +-
 hl/test/gen_test_ld.c                              |   379 +
 hl/test/test_ds.c                                  |    28 +-
 hl/test/test_dset_append.c                         |  1196 +
 hl/test/test_dset_opt.c                            |     2 +-
 hl/test/test_file_image.c                          |    44 +-
 hl/test/test_image.c                               |    31 +-
 hl/test/test_ld.c                                  |  1430 +
 hl/test/test_ld.h5                                 |   Bin 0 -> 42931 bytes
 hl/test/test_lite.c                                |    31 +-
 hl/test/test_packet.c                              |     4 +-
 hl/test/test_table.c                               |    37 +-
 hl/test/test_table_be.h5                           |   Bin 55912 -> 55912 bytes
 hl/test/test_table_cray.h5                         |   Bin 55912 -> 55912 bytes
 hl/test/test_table_le.h5                           |   Bin 53880 -> 53880 bytes
 hl/tools/Makefile.am                               |     4 +-
 hl/tools/Makefile.in                               |    71 +-
 hl/tools/gif2h5/Makefile.in                        |    72 +-
 hl/tools/gif2h5/hdf2gif.c                          |     2 +-
 hl/tools/gif2h5/testfiles/{REAMDE => README}       |     0
 hl/tools/h5watch/Makefile.am                       |    44 +
 hl/tools/h5watch/Makefile.in                       |  1458 ++
 hl/tools/h5watch/extend_dset.c                     |   489 +
 hl/tools/h5watch/h5watch.c                         |   977 +
 hl/tools/h5watch/h5watchgentest.c                  |   355 +
 hl/tools/h5watch/swmr_check_compat_vfd.c           |    59 +
 hl/tools/h5watch/testh5watch.sh.in                 |   395 +
 hl/tools/testfiles/w-err-cmpd1.ddl                 |     5 +
 hl/tools/testfiles/w-err-cmpd2.ddl                 |     5 +
 hl/tools/testfiles/w-err-cmpd3.ddl                 |     5 +
 hl/tools/testfiles/w-err-cmpd4.ddl                 |     5 +
 hl/tools/testfiles/w-err-cmpd5.ddl                 |     5 +
 hl/tools/testfiles/w-err-dset-nomax.ddl            |     5 +
 hl/tools/testfiles/w-err-dset-none.ddl             |     5 +
 hl/tools/testfiles/w-err-dset1.ddl                 |     5 +
 hl/tools/testfiles/w-err-dset2.ddl                 |     5 +
 hl/tools/testfiles/w-err-file.ddl                  |     4 +
 hl/tools/testfiles/w-err-poll.ddl                  |    38 +
 hl/tools/testfiles/w-err-poll0.ddl                 |    38 +
 hl/tools/testfiles/w-err-width.ddl                 |    38 +
 hl/tools/testfiles/w-ext-cmpd-esc-f1.ddl           |    14 +
 hl/tools/testfiles/w-ext-cmpd-esc-f3.ddl           |    13 +
 hl/tools/testfiles/w-ext-cmpd-esc-ff2.ddl          |    14 +
 hl/tools/testfiles/w-ext-cmpd-esc.ddl              |    16 +
 hl/tools/testfiles/w-ext-cmpd-f1.ddl               |    14 +
 hl/tools/testfiles/w-ext-cmpd-f2.ddl               |    14 +
 hl/tools/testfiles/w-ext-cmpd-ff3.ddl              |    13 +
 hl/tools/testfiles/w-ext-cmpd-label.ddl            |    21 +
 hl/tools/testfiles/w-ext-cmpd-two-f1.ddl           |    50 +
 hl/tools/testfiles/w-ext-cmpd-two-f3.ddl           |    44 +
 hl/tools/testfiles/w-ext-cmpd-two-ff2.ddl          |    50 +
 hl/tools/testfiles/w-ext-cmpd-two.ddl              |    70 +
 hl/tools/testfiles/w-ext-cmpd.ddl                  |    16 +
 hl/tools/testfiles/w-ext-early.ddl                 |    13 +
 hl/tools/testfiles/w-ext-late.ddl                  |    13 +
 hl/tools/testfiles/w-ext-one-d.ddl                 |     9 +
 hl/tools/testfiles/w-ext-one-simple.ddl            |    16 +
 hl/tools/testfiles/w-ext-one.ddl                   |    13 +
 hl/tools/testfiles/w-ext-two-d.ddl                 |    21 +
 hl/tools/testfiles/w-ext-two-width.ddl             |    44 +
 hl/tools/testfiles/w-ext-two.ddl                   |    40 +
 hl/tools/testfiles/w-help1.ddl                     |    38 +
 html/ADGuide.html                                  |     4 +-
 html/ADGuide/Changes.html                          |   123 +-
 html/ADGuide/Changes_1_4-1_6.html                  |     0
 html/ADGuide/Changes_1_8_x.html                    |     0
 html/ADGuide/Compatibility_Report/CR_1.8.14.html   |  1176 -
 html/ADGuide/Compatibility_Report/CR_1.8.15.html   |  1841 --
 html/ADGuide/Compatibility_Report/CR_1.8.16.html   |  6684 -----
 html/ADGuide/HISTORY.txt                           |  9468 ++++---
 html/ADGuide/RELEASE.txt                           |  1357 +-
 ...hNote-HDF5-ImprovingCompressionPerformance.docx |   Bin 0 -> 947458 bytes
 html/Advanced.html                                 |    16 +-
 html/Advanced/Chunking/index.html                  |     6 +-
 .../AdvancedTopicsPageNotesLink.txt                |    43 +
 ...opyingCommittedDatatypesWithH5Ocopy_120320.docx |   Bin 0 -> 106707 bytes
 ...opyingCommittedDatatypesWithH5Ocopy_120321.docx |   Bin 0 -> 145324 bytes
 .../HDF5CommittedDatatypeCopying_120320.docx       |   Bin 0 -> 143896 bytes
 .../HDF5CommittedDatatypesCopying_120316-QAK.docx  |   Bin 0 -> 144064 bytes
 .../HDF5CommittedDatatypesCopying_120316.docx      |   Bin 0 -> 104266 bytes
 .../RFC_H5Ocopy_Named_DT_v3.docx                   |   Bin 0 -> 47302 bytes
 .../RMentriesMergeCommittedDatatypes.html          |  1462 ++
 .../TimeEstimateNotes_120316.txt                   |    30 +
 .../Using Direct Chunk Write 130227.docx           |   Bin 201489 -> 241583 bytes
 html/Advanced/DirectChunkWrite/index.html          |     2 +-
 ...F5-Programmatic_Control_of_Dynamic_Plugins.docx |   Bin 0 -> 100618 bytes
 .../HDF5DynamicallyLoadedFilters_130521.docx       |   Bin 0 -> 158693 bytes
 ...ic_Plugin_Programatic_Control(Preliminary).docx |   Bin 0 -> 111087 bytes
 html/Advanced/DynamicallyLoadedFilters/index.html  |     4 +-
 .../FileFreeSpace/FileSpaceManagement.docx         |   Bin 0 -> 57889 bytes
 .../load_core_file_driver_from_image_RFC_v17.docx  |   Bin 0 -> 238870 bytes
 .../load_core_file_driver_from_image_RFC_v18.docx  |   Bin 0 -> 238612 bytes
 .../FileSpaceManagement/FileSpaceManagement.docx   |   Bin 0 -> 57889 bytes
 .../FileSpaceManagement_120425.docx                |   Bin 0 -> 142096 bytes
 .../FreeingMemoryAllocatedByTheHdf5Library.docx    |   Bin 0 -> 176841 bytes
 html/Advanced/HDF5_Metadata/index.html             |     4 +-
 html/Advanced/UsingIdentifiers/index.html          |     2 +-
 html/Advanced/UsingUnicode/index.html              |     2 +-
 .../Advanced/UsingUnicode/index_FullQuestions.html |   314 +
 html/Glossary.html                                 |    23 +
 html/H5.format.test.html                           | 14386 ++++++++++
 html/H5.intro.html                                 |     4 +-
 html/H5.user.html                                  |     2 +-
 html/H5.user/Attributes.html                       |     4 +-
 html/H5.user/Caching.html                          |     2 +-
 html/H5.user/Chunking.html                         |     2 +-
 html/H5.user/Datasets.html                         |     2 +-
 html/H5.user/Dataspaces.html                       |     2 +-
 html/H5.user/Datatypes.html                        |     2 +-
 html/H5.user/Debugging.html                        |     2 +-
 html/H5.user/Environment.html                      |     2 +-
 html/H5.user/Errors.html                           |     2 +-
 html/H5.user/Files.html                            |     2 +-
 html/H5.user/Filters.html                          |     2 +-
 html/H5.user/Groups.html                           |     2 +-
 html/H5.user/MountingFiles.html                    |     2 +-
 html/H5.user/Performance.html                      |     3 +-
 html/H5.user/Properties.html                       |     2 +-
 html/H5.user/References.html                       |     2 +-
 html/HL/RM_H5LT.html                               |     2 +-
 html/HL/RM_HDF5Optimized.html                      |     2 +-
 html/Intro/IntroExamples.html                      |     4 +-
 html/RM/APICompatMacros.html                       |    12 +-
 html/RM/CollectiveCalls.html                       |    12 +-
 html/RM/H5/H5check_version.htm                     |     3 +-
 html/RM/H5/H5dont_atexit.htm                       |     2 +-
 html/RM/H5/H5is_library_threadsafe.htm             |     4 +-
 html/RM/H5A/H5Aget_name_by_idx.htm                 |    38 +-
 html/RM/H5D/H5Dget_type.htm                        |     2 +-
 html/RM/H5F/H5Fget_file_image.htm                  |     6 +-
 html/RM/H5F/H5Fget_free_sections.htm               |   258 +
 html/RM/H5F/H5Fget_info.htm                        |    57 +-
 html/RM/H5F/H5Fget_intent.htm                      |     5 +-
 html/RM/H5F/H5Fget_obj_count.htm                   |     2 +-
 html/RM/H5F/H5Fget_obj_ids.htm                     |     6 +-
 html/RM/H5G/H5Gget_info.htm                        |     1 +
 html/RM/H5G/H5Gget_info_by_idx.htm                 |     6 +-
 html/RM/H5G/H5Gget_info_by_name.htm                |     2 +-
 html/RM/H5L/H5Lget_name_by_idx.htm                 |    85 +-
 html/RM/H5L/H5Literate.htm                         |     2 +-
 html/RM/H5L/H5Lvisit.htm                           |    25 +
 html/RM/H5L/H5Lvisit_by_name.htm                   |    25 +
 html/RM/H5O/H5Oincr_refcount.htm                   |     2 +-
 html/RM/H5P/H5Pdecode.htm                          |   124 +
 html/RM/H5P/H5Pencode.htm                          |   160 +
 html/RM/H5P/H5Pget_char_encoding.htm               |     2 +-
 html/RM/H5P/H5Pget_data_transform.htm              |    17 +-
 html/RM/H5P/H5Pget_elink_fapl.htm                  |    96 +-
 html/RM/H5P/H5Pget_est_link_info.htm               |    18 +-
 html/RM/H5P/H5Pget_fapl_direct.htm                 |    10 +-
 html/RM/H5P/H5Pget_file_image.htm                  |     4 -
 html/RM/H5P/H5Pget_file_image_callbacks.htm        |     4 -
 html/RM/H5P/H5Pget_file_space.htm                  |   195 +
 html/RM/H5P/H5Pget_libver_bounds.htm               |    81 +-
 html/RM/H5P/H5Pget_link_creation_order.htm         |    13 +-
 html/RM/H5P/H5Pget_link_phase_change.htm           |     2 +-
 html/RM/H5P/H5Pget_local_heap_size_hint.htm        |    15 +-
 html/RM/H5P/H5Pget_obj_track_time.htm              |     2 +-
 html/RM/H5P/H5Pget_version.htm                     |     5 +
 html/RM/H5P/H5Pset_attr_phase_change.htm           |     2 +-
 html/RM/H5P/H5Pset_char_encoding.htm               |     2 +-
 html/RM/H5P/H5Pset_data_transform.htm              |     2 +-
 html/RM/H5P/H5Pset_elink_cb.htm                    |     2 +-
 html/RM/H5P/H5Pset_elink_fapl.htm                  |    19 +-
 html/RM/H5P/H5Pset_elink_file_cache_size.htm       |     1 +
 html/RM/H5P/H5Pset_est_link_info.htm               |     6 +-
 html/RM/H5P/H5Pset_fapl_direct.htm                 |     8 +-
 html/RM/H5P/H5Pset_fapl_stdio.htm                  |     1 -
 html/RM/H5P/H5Pset_file_image.htm                  |     6 -
 html/RM/H5P/H5Pset_file_image_callbacks.htm        |     8 +-
 html/RM/H5P/H5Pset_file_space.htm                  |   284 +
 html/RM/H5P/H5Pset_istore_k.htm                    |    10 +-
 html/RM/H5P/H5Pset_libver_bounds.htm               |   140 +-
 html/RM/H5P/H5Pset_link_creation_order.htm         |     2 +-
 html/RM/H5P/H5Pset_link_phase_change.htm           |     4 +-
 html/RM/H5P/H5Pset_local_heap_size_hint.htm        |    13 +-
 html/RM/H5P/H5Pset_mdc_config.htm                  |     4 +-
 html/RM/H5P/H5Pset_sym_k.htm                       |     3 +-
 html/RM/H5R/H5Rget_name.htm                        |     1 +
 html/RM/H5R/H5Rget_region-before.htm               |    81 +
 html/RM/H5S/H5Screate.htm                          |     2 +-
 html/RM/H5S/H5Sdecode.htm                          |    12 -
 html/RM/H5S/H5Sencode.htm                          |    13 -
 html/RM/H5S/H5Sextent_equal.htm                    |    13 -
 html/RM/H5S/H5Sset_extent_simple.htm               |     1 +
 html/RM/H5T/H5Tcommit.htm                          |    13 +-
 html/RM/H5T/H5Tcommit1.htm                         |    14 +-
 html/RM/H5T/H5Tcommit2.htm                         |    21 +-
 html/RM/H5T/H5Tcommit_anon.htm                     |     1 +
 html/RM/H5T/H5Tcommitted.htm                       |    10 +-
 html/RM/H5T/H5Tget_create_plist.htm                |    14 +-
 html/RM/H5T/H5Tget_precision.htm                   |    24 +-
 html/RM/H5T/H5Tget_strpad.htm                      |     1 -
 html/RM/H5T/H5Tget_super.htm                       |     1 -
 html/RM/H5T/H5Tget_tag.htm                         |     1 -
 html/RM/H5T/H5Tinsert.htm                          |     1 -
 html/RM/H5T/H5Tis_variable_str.htm                 |     1 -
 html/RM/H5T/H5Topen.htm                            |    35 +-
 html/RM/H5T/H5Topen1.htm                           |    15 +-
 html/RM/H5T/H5Topen2.htm                           |    43 +-
 html/RM/PredefDTypes.html                          |    12 +-
 html/RM/Properties_ReferenceTable.html             |  8581 ++++++
 html/RM/Properties_ReferenceTable.xlsx             |   Bin 0 -> 79923 bytes
 html/RM/RM_H5.html                                 |     9 +-
 html/RM/RM_H5A.html                                |    12 +-
 html/RM/RM_H5D.html                                |    12 +-
 html/RM/RM_H5E.html                                |    12 +-
 html/RM/RM_H5F.html                                |    22 +-
 html/RM/RM_H5Front.html                            |    17 +-
 html/RM/RM_H5G.html                                |    12 +-
 html/RM/RM_H5I.html                                |    14 +-
 html/RM/RM_H5L.html                                |    16 +-
 html/RM/RM_H5O.html                                |    13 +-
 html/RM/RM_H5P.html                                |    69 +-
 html/RM/RM_H5R.html                                |    14 +-
 html/RM/RM_H5S.html                                |    15 +-
 html/RM/RM_H5T.html                                |    23 +-
 html/RM/RM_H5Z.html                                |     6 +-
 html/RM/Tools.html                                 |    12 +-
 html/RM/Tools/h5diff.htm                           |    10 +
 html/RM/Tools/h5ls.htm                             |     2 -
 html/RM/Tools/h5perf_serial.htm                    |     2 +-
 html/RM/Tools/h5repack.htm                         |    32 +
 html/RM/Tools/h5stat.htm                           |    15 +-
 html/Supplements/._H5_CompatFormat180 070730 v.xls |   Bin 0 -> 82 bytes
 html/TechNotes.html                                |     7 +-
 html/TechNotes/VFL.html                            |     4 +-
 html/TechNotes/VLTypes.html                        |     2 +-
 html/UG/FmSource/AdditionalResources.fm            |   Bin 123904 -> 0 bytes
 html/UG/FmSource/Attributes.fm                     |   Bin 167936 -> 0 bytes
 html/UG/FmSource/Copyrights.fm                     |   Bin 76800 -> 0 bytes
 html/UG/FmSource/DataModelAndFileStructure.fm      |   Bin 169984 -> 0 bytes
 html/UG/FmSource/Datasets.fm                       |   Bin 376832 -> 0 bytes
 html/UG/FmSource/Dataspaces.fm                     |   Bin 245760 -> 0 bytes
 html/UG/FmSource/Datatypes.fm                      |   Bin 436224 -> 0 bytes
 html/UG/FmSource/ErrorHandling.fm                  |   Bin 169984 -> 0 bytes
 html/UG/FmSource/Groups.fm                         |   Bin 211968 -> 0 bytes
 html/UG/FmSource/HDF5_UG_LOCE.fm                   |   Bin 225280 -> 0 bytes
 html/UG/FmSource/HDF5_UG_LOF.fm                    |   Bin 220160 -> 0 bytes
 html/UG/FmSource/HDF5_UG_LOFL.fm                   |   Bin 211968 -> 0 bytes
 html/UG/FmSource/HDF5_UG_LOT.fm                    |   Bin 212992 -> 0 bytes
 html/UG/FmSource/HDF5_UG_TOC.fm                    |   Bin 140288 -> 0 bytes
 html/UG/FmSource/HDF5_UG_Title.fm                  |   Bin 207872 -> 0 bytes
 html/UG/FmSource/HDF5_Users_Guide.book             |   Bin 36864 -> 0 bytes
 html/UG/FmSource/HDF5_Users_GuideIX.fm             |   Bin 367616 -> 0 bytes
 html/UG/FmSource/HDF_favicon_16x16.png             |   Bin 3209 -> 0 bytes
 html/UG/FmSource/LibraryAndProgrammingModel.fm     |   Bin 195584 -> 0 bytes
 html/UG/FmSource/PropertyLists.fm                  |   Bin 191488 -> 0 bytes
 html/UG/FmSource/TheFile.fm                        |   Bin 253952 -> 0 bytes
 html/UG/FmSource/ThgUgTemplate.fm                  |   Bin 151552 -> 0 bytes
 html/UG/FmSource/UpdateStatus.fm                   |   Bin 121856 -> 0 bytes
 html/UG/FmSource/back.png                          |   Bin 790 -> 0 bytes
 html/UG/FmSource/forward.png                       |   Bin 793 -> 0 bytes
 html/UG/FmSource/html_and_xml_tags.fm              |   Bin 40960 -> 0 bytes
 html/UG/Images/1ImageDrawingWorkspace.docx         |   Bin 234140 -> 0 bytes
 html/UG/Images/ChunkingFig001.png                  |   Bin 3702 -> 0 bytes
 html/UG/Images/ChunkingFig002.png                  |   Bin 4530 -> 0 bytes
 html/UG/Images/ChunkingFig003.png                  |   Bin 4996 -> 0 bytes
 html/UG/Images/ChunkingFig004.png                  |   Bin 18759 -> 0 bytes
 html/UG/Images/ChunkingFig005.png                  |   Bin 6127 -> 0 bytes
 html/UG/Images/ChunkingFig006.png                  |   Bin 25583 -> 0 bytes
 html/UG/Images/ChunkingFig007.png                  |   Bin 14721 -> 0 bytes
 html/UG/Images/Dmodel_fig1.JPG                     |   Bin 50868 -> 0 bytes
 html/UG/Images/Dmodel_fig1.psd                     |   Bin 391554 -> 0 bytes
 html/UG/Images/Dmodel_fig10.JPG                    |   Bin 52969 -> 0 bytes
 html/UG/Images/Dmodel_fig10.PSD                    |   Bin 360061 -> 0 bytes
 html/UG/Images/Dmodel_fig11_a.PSD                  |   Bin 12192 -> 0 bytes
 html/UG/Images/Dmodel_fig11_a.jpg                  |   Bin 11356 -> 0 bytes
 html/UG/Images/Dmodel_fig11_b.jpg                  |   Bin 19118 -> 0 bytes
 html/UG/Images/Dmodel_fig12.JPG                    |   Bin 36330 -> 0 bytes
 html/UG/Images/Dmodel_fig12.PSD                    |   Bin 520467 -> 0 bytes
 html/UG/Images/Dmodel_fig18_a.JPG                  |   Bin 37705 -> 0 bytes
 html/UG/Images/Dmodel_fig18_a.PSD                  |   Bin 368251 -> 0 bytes
 html/UG/Images/Dmodel_fig18_b.JPG                  |   Bin 39226 -> 0 bytes
 html/UG/Images/Dmodel_fig18_b.PSD                  |   Bin 384553 -> 0 bytes
 html/UG/Images/Dmodel_fig18_c.JPG                  |   Bin 47733 -> 0 bytes
 html/UG/Images/Dmodel_fig18_c.PSD                  |   Bin 401084 -> 0 bytes
 html/UG/Images/Dmodel_fig18_d.JPG                  |   Bin 47064 -> 0 bytes
 html/UG/Images/Dmodel_fig18_d.PSD                  |   Bin 420918 -> 0 bytes
 html/UG/Images/Dmodel_fig18_e.JPG                  |   Bin 15754 -> 0 bytes
 html/UG/Images/Dmodel_fig18_e.PSD                  |   Bin 382135 -> 0 bytes
 html/UG/Images/Dmodel_fig2.JPG                     |   Bin 33566 -> 0 bytes
 html/UG/Images/Dmodel_fig2.PSD                     |   Bin 41841 -> 0 bytes
 html/UG/Images/Dmodel_fig37.JPG                    |   Bin 37128 -> 0 bytes
 html/UG/Images/Dmodel_fig37.PSD                    |   Bin 86973 -> 0 bytes
 html/UG/Images/Dmodel_fig38_a.JPG                  |   Bin 13790 -> 0 bytes
 html/UG/Images/Dmodel_fig38_a.PSD                  |   Bin 14692 -> 0 bytes
 html/UG/Images/Dmodel_fig38_b.JPG                  |   Bin 16439 -> 0 bytes
 html/UG/Images/Dmodel_fig38_b.PSD                  |   Bin 21747 -> 0 bytes
 html/UG/Images/Dmodel_fig3_a.JPG                   |   Bin 32066 -> 0 bytes
 html/UG/Images/Dmodel_fig3_a.PSD                   |   Bin 474195 -> 0 bytes
 html/UG/Images/Dmodel_fig3_b.JPG                   |   Bin 44917 -> 0 bytes
 html/UG/Images/Dmodel_fig3_b.PSD                   |   Bin 497461 -> 0 bytes
 html/UG/Images/Dmodel_fig3_c.JPG                   |   Bin 40875 -> 0 bytes
 html/UG/Images/Dmodel_fig3_c.PSD                   |   Bin 489583 -> 0 bytes
 html/UG/Images/Dmodel_fig40_a.JPG                  |   Bin 27526 -> 0 bytes
 html/UG/Images/Dmodel_fig40_a.PSD                  |   Bin 31625 -> 0 bytes
 html/UG/Images/Dmodel_fig40_b.JPG                  |   Bin 29891 -> 0 bytes
 html/UG/Images/Dmodel_fig40_b.PSD                  |   Bin 37040 -> 0 bytes
 html/UG/Images/Dmodel_fig40_c.JPG                  |   Bin 33310 -> 0 bytes
 html/UG/Images/Dmodel_fig40_c.PSD                  |   Bin 32965 -> 0 bytes
 html/UG/Images/Dmodel_fig40_d+g3.jpg               |   Bin 39149 -> 0 bytes
 html/UG/Images/Dmodel_fig40_d.JPG                  |   Bin 39518 -> 0 bytes
 html/UG/Images/Dmodel_fig40_d.PSD                  |   Bin 42581 -> 0 bytes
 html/UG/Images/Dmodel_fig4_a.JPG                   |   Bin 18347 -> 0 bytes
 html/UG/Images/Dmodel_fig4_a.PSD                   |   Bin 368892 -> 0 bytes
 html/UG/Images/Dmodel_fig4_b.JPG                   |   Bin 23653 -> 0 bytes
 html/UG/Images/Dmodel_fig5.JPG                     |   Bin 24910 -> 0 bytes
 html/UG/Images/Dmodel_fig5.PSD                     |   Bin 39575 -> 0 bytes
 html/UG/Images/Dmodel_fig6.JPG                     |   Bin 24270 -> 0 bytes
 html/UG/Images/Dmodel_fig6.PSD                     |   Bin 32427 -> 0 bytes
 html/UG/Images/Dmodel_fig7_b.JPG                   |   Bin 77536 -> 0 bytes
 html/UG/Images/Dmodel_fig7_b.PSD                   |   Bin 103714 -> 0 bytes
 html/UG/Images/Dmodel_fig8.JPG                     |   Bin 15646 -> 0 bytes
 html/UG/Images/Dmodel_fig9.JPG                     |   Bin 72024 -> 0 bytes
 html/UG/Images/Dmodel_fig9.PSD                     |   Bin 397812 -> 0 bytes
 html/UG/Images/Dsets_NbitFloating1.JPG             |   Bin 12680 -> 0 bytes
 html/UG/Images/Dsets_NbitFloating2.JPG             |   Bin 14527 -> 0 bytes
 html/UG/Images/Dsets_NbitInteger1.JPG              |   Bin 12481 -> 0 bytes
 html/UG/Images/Dsets_NbitInteger2.JPG              |   Bin 14772 -> 0 bytes
 html/UG/Images/Dsets_fig1.JPG                      |   Bin 31625 -> 0 bytes
 html/UG/Images/Dsets_fig1.PSD                      |   Bin 23108 -> 0 bytes
 html/UG/Images/Dsets_fig10.JPG                     |   Bin 66182 -> 0 bytes
 html/UG/Images/Dsets_fig10.PSD                     |   Bin 629705 -> 0 bytes
 html/UG/Images/Dsets_fig12.JPG                     |   Bin 21887 -> 0 bytes
 html/UG/Images/Dsets_fig12.PSD                     |   Bin 352082 -> 0 bytes
 html/UG/Images/Dsets_fig13.JPG                     |   Bin 23088 -> 0 bytes
 html/UG/Images/Dsets_fig13.PSD                     |   Bin 353028 -> 0 bytes
 html/UG/Images/Dsets_fig14.JPG                     |   Bin 19556 -> 0 bytes
 html/UG/Images/Dsets_fig14.PSD                     |   Bin 329696 -> 0 bytes
 html/UG/Images/Dsets_fig15.JPG                     |   Bin 28077 -> 0 bytes
 html/UG/Images/Dsets_fig15.PSD                     |   Bin 363237 -> 0 bytes
 html/UG/Images/Dsets_fig16.JPG                     |   Bin 37547 -> 0 bytes
 html/UG/Images/Dsets_fig16.PSD                     |   Bin 406959 -> 0 bytes
 html/UG/Images/Dsets_fig19.JPG                     |   Bin 27544 -> 0 bytes
 html/UG/Images/Dsets_fig19.PSD                     |   Bin 87771 -> 0 bytes
 html/UG/Images/Dsets_fig2.JPG                      |   Bin 64474 -> 0 bytes
 html/UG/Images/Dsets_fig2.PSD                      |   Bin 665971 -> 0 bytes
 html/UG/Images/Dsets_fig20.jpg                     |   Bin 136463 -> 0 bytes
 html/UG/Images/Dsets_fig20.ppt                     |   Bin 16896 -> 0 bytes
 html/UG/Images/Dsets_fig20.psd                     |   Bin 467807 -> 0 bytes
 html/UG/Images/Dsets_fig21.GIF                     |   Bin 4054 -> 0 bytes
 html/UG/Images/Dsets_fig5.JPG                      |   Bin 102880 -> 0 bytes
 html/UG/Images/Dsets_fig5.PSD                      |   Bin 184649 -> 0 bytes
 html/UG/Images/Dsets_fig9.JPG                      |   Bin 139280 -> 0 bytes
 html/UG/Images/Dsets_fig9.PSD                      |   Bin 151835 -> 0 bytes
 html/UG/Images/Dspace_fig02-UNUSED.JPG             |   Bin 51096 -> 0 bytes
 html/UG/Images/Dspace_fig02.PSD                    |   Bin 36699 -> 0 bytes
 html/UG/Images/Dspace_fig03.JPG                    |   Bin 20126 -> 0 bytes
 html/UG/Images/Dspace_fig03.PSD                    |   Bin 13195 -> 0 bytes
 html/UG/Images/Dspace_fig1.JPG                     |   Bin 31625 -> 0 bytes
 html/UG/Images/Dspace_fig1.PSD                     |   Bin 23108 -> 0 bytes
 html/UG/Images/Dspace_fig10-2.JPG                  |   Bin 130330 -> 0 bytes
 html/UG/Images/Dspace_fig10-2.PSD                  |   Bin 393537 -> 0 bytes
 html/UG/Images/Dspace_fig10.JPG                    |   Bin 77604 -> 0 bytes
 html/UG/Images/Dspace_fig10.PSD                    |   Bin 186415 -> 0 bytes
 html/UG/Images/Dspace_fig11.JPG                    |   Bin 94962 -> 0 bytes
 html/UG/Images/Dspace_fig11.PSD                    |   Bin 275393 -> 0 bytes
 html/UG/Images/Dspace_fig14.JPG                    |   Bin 79366 -> 0 bytes
 html/UG/Images/Dspace_fig14.PSD                    |   Bin 61464 -> 0 bytes
 html/UG/Images/Dspace_fig16a.jpg                   |   Bin 38362 -> 0 bytes
 html/UG/Images/Dspace_fig16a.psd                   |   Bin 73337 -> 0 bytes
 html/UG/Images/Dspace_fig16b.jpg                   |   Bin 11616 -> 0 bytes
 html/UG/Images/Dspace_fig16b.ppt                   |   Bin 7680 -> 0 bytes
 html/UG/Images/Dspace_fig16c.jpg                   |   Bin 36382 -> 0 bytes
 html/UG/Images/Dspace_fig16c.psd                   |   Bin 65663 -> 0 bytes
 html/UG/Images/Dspace_fig19.JPG                    |   Bin 44333 -> 0 bytes
 html/UG/Images/Dspace_fig19.PSD                    |   Bin 135418 -> 0 bytes
 html/UG/Images/Dspace_fig19a.PSD                   |   Bin 429108 -> 0 bytes
 html/UG/Images/Dspace_fig19a.jpg                   |   Bin 13702 -> 0 bytes
 html/UG/Images/Dspace_fig19b.jpg                   |   Bin 11703 -> 0 bytes
 html/UG/Images/Dspace_fig19b.ppt                   |   Bin 7680 -> 0 bytes
 html/UG/Images/Dspace_fig19c.jpg                   |   Bin 35627 -> 0 bytes
 html/UG/Images/Dspace_fig19c.psd                   |   Bin 454907 -> 0 bytes
 html/UG/Images/Dspace_fig1new.JPG                  |   Bin 14595 -> 0 bytes
 html/UG/Images/Dspace_fig21.JPG                    |   Bin 172937 -> 0 bytes
 html/UG/Images/Dspace_fig21.PSD                    |   Bin 682787 -> 0 bytes
 html/UG/Images/Dspace_fig22.JPG                    |   Bin 128097 -> 0 bytes
 html/UG/Images/Dspace_fig22.PSD                    |   Bin 465992 -> 0 bytes
 html/UG/Images/Dspace_fig23.JPG                    |   Bin 44163 -> 0 bytes
 html/UG/Images/Dspace_fig23.PSD                    |   Bin 379427 -> 0 bytes
 html/UG/Images/Dspace_fig24.JPG                    |   Bin 92818 -> 0 bytes
 html/UG/Images/Dspace_fig24.PSD                    |   Bin 320038 -> 0 bytes
 html/UG/Images/Dspace_fig2a.JPG                    |   Bin 14033 -> 0 bytes
 html/UG/Images/Dspace_fig2b.JPG                    |   Bin 13757 -> 0 bytes
 html/UG/Images/Dspace_fig2c.JPG                    |   Bin 13992 -> 0 bytes
 html/UG/Images/Dspace_fig2d.JPG                    |   Bin 15144 -> 0 bytes
 html/UG/Images/Dspace_fig4-2.JPG                   |   Bin 82048 -> 0 bytes
 html/UG/Images/Dspace_fig4-2.PSD                   |   Bin 247910 -> 0 bytes
 html/UG/Images/Dspace_fig4.JPG                     |   Bin 63552 -> 0 bytes
 html/UG/Images/Dspace_fig4.PSD                     |   Bin 539649 -> 0 bytes
 html/UG/Images/Dspace_fig4a.gif                    |   Bin 8403 -> 0 bytes
 html/UG/Images/Dspace_fig5.JPG                     |   Bin 58971 -> 0 bytes
 html/UG/Images/Dspace_fig5.PSD                     |   Bin 536035 -> 0 bytes
 html/UG/Images/Dspace_fig6.JPG                     |   Bin 44125 -> 0 bytes
 html/UG/Images/Dspace_fig6.PSD                     |   Bin 66309 -> 0 bytes
 html/UG/Images/Dspace_fig7-2.JPG                   |   Bin 46974 -> 0 bytes
 html/UG/Images/Dspace_fig7-2.PSD                   |   Bin 133225 -> 0 bytes
 html/UG/Images/Dspace_fig7.JPG                     |   Bin 56685 -> 0 bytes
 html/UG/Images/Dspace_fig7.PSD                     |   Bin 111060 -> 0 bytes
 html/UG/Images/Dspace_fig8.JPG                     |   Bin 42602 -> 0 bytes
 html/UG/Images/Dspace_fig8.PSD                     |   Bin 71152 -> 0 bytes
 html/UG/Images/Dspace_fig9.JPG                     |   Bin 60211 -> 0 bytes
 html/UG/Images/Dspace_fig9.PSD                     |   Bin 90798 -> 0 bytes
 html/UG/Images/Dtypes_fig1.JPG                     |   Bin 44841 -> 0 bytes
 html/UG/Images/Dtypes_fig1.PSD                     |   Bin 444830 -> 0 bytes
 html/UG/Images/Dtypes_fig10.JPG                    |   Bin 40694 -> 0 bytes
 html/UG/Images/Dtypes_fig11.JPG                    |   Bin 71840 -> 0 bytes
 html/UG/Images/Dtypes_fig14.JPG                    |   Bin 23258 -> 0 bytes
 html/UG/Images/Dtypes_fig14.PSD                    |   Bin 363482 -> 0 bytes
 html/UG/Images/Dtypes_fig16.JPG                    |   Bin 26518 -> 0 bytes
 html/UG/Images/Dtypes_fig16.PSD                    |   Bin 360378 -> 0 bytes
 html/UG/Images/Dtypes_fig16a.JPG                   |   Bin 17255 -> 0 bytes
 html/UG/Images/Dtypes_fig16b.JPG                   |   Bin 13096 -> 0 bytes
 html/UG/Images/Dtypes_fig16c.JPG                   |   Bin 12907 -> 0 bytes
 html/UG/Images/Dtypes_fig16d.JPG                   |   Bin 15799 -> 0 bytes
 html/UG/Images/Dtypes_fig17a.JPG                   |   Bin 18893 -> 0 bytes
 html/UG/Images/Dtypes_fig17b.JPG                   |   Bin 32479 -> 0 bytes
 html/UG/Images/Dtypes_fig18.JPG                    |   Bin 78509 -> 0 bytes
 html/UG/Images/Dtypes_fig18.PSD                    |   Bin 402369 -> 0 bytes
 html/UG/Images/Dtypes_fig18_a.PSD                  |   Bin 306599 -> 0 bytes
 html/UG/Images/Dtypes_fig18_a.jpg                  |   Bin 15917 -> 0 bytes
 html/UG/Images/Dtypes_fig18_b.PSD                  |   Bin 312793 -> 0 bytes
 html/UG/Images/Dtypes_fig18_b.jpg                  |   Bin 16625 -> 0 bytes
 html/UG/Images/Dtypes_fig19.JPG                    |   Bin 148321 -> 0 bytes
 html/UG/Images/Dtypes_fig19.PSD                    |   Bin 642756 -> 0 bytes
 html/UG/Images/Dtypes_fig19_a.PSD                  |   Bin 333835 -> 0 bytes
 html/UG/Images/Dtypes_fig19_a.jpg                  |   Bin 20349 -> 0 bytes
 html/UG/Images/Dtypes_fig19_b.PSD                  |   Bin 312911 -> 0 bytes
 html/UG/Images/Dtypes_fig19_b.jpg                  |   Bin 15301 -> 0 bytes
 html/UG/Images/Dtypes_fig19_c.PSD                  |   Bin 333787 -> 0 bytes
 html/UG/Images/Dtypes_fig19_c.jpg                  |   Bin 20679 -> 0 bytes
 html/UG/Images/Dtypes_fig19_d.PSD                  |   Bin 312747 -> 0 bytes
 html/UG/Images/Dtypes_fig19_d.jpg                  |   Bin 16006 -> 0 bytes
 html/UG/Images/Dtypes_fig2.JPG                     |   Bin 34043 -> 0 bytes
 html/UG/Images/Dtypes_fig2.PSD                     |   Bin 450623 -> 0 bytes
 html/UG/Images/Dtypes_fig20a.JPG                   |   Bin 37492 -> 0 bytes
 html/UG/Images/Dtypes_fig20b.JPG                   |   Bin 24569 -> 0 bytes
 html/UG/Images/Dtypes_fig20c.JPG                   |   Bin 33698 -> 0 bytes
 html/UG/Images/Dtypes_fig20d.JPG                   |   Bin 24543 -> 0 bytes
 html/UG/Images/Dtypes_fig23.JPG                    |   Bin 72751 -> 0 bytes
 html/UG/Images/Dtypes_fig23.PSD                    |   Bin 1029253 -> 0 bytes
 html/UG/Images/Dtypes_fig25.JPG                    |   Bin 66815 -> 0 bytes
 html/UG/Images/Dtypes_fig25.PSD                    |   Bin 931521 -> 0 bytes
 html/UG/Images/Dtypes_fig26_pic1of4.JPG            |   Bin 12189 -> 0 bytes
 html/UG/Images/Dtypes_fig26_pic1of4.PSD            |   Bin 13987 -> 0 bytes
 html/UG/Images/Dtypes_fig26_pic2of4.JPG            |   Bin 9359 -> 0 bytes
 html/UG/Images/Dtypes_fig26_pic2of4.PSD            |   Bin 11907 -> 0 bytes
 html/UG/Images/Dtypes_fig26_pic3of4.JPG            |   Bin 10573 -> 0 bytes
 html/UG/Images/Dtypes_fig26_pic3of4.PSD            |   Bin 22345 -> 0 bytes
 html/UG/Images/Dtypes_fig26_pic4of4.JPG            |   Bin 9303 -> 0 bytes
 html/UG/Images/Dtypes_fig26_pic4of4.PSD            |   Bin 21681 -> 0 bytes
 html/UG/Images/Dtypes_fig28.JPG                    |   Bin 166447 -> 0 bytes
 html/UG/Images/Dtypes_fig28.PSD                    |   Bin 1424783 -> 0 bytes
 html/UG/Images/Dtypes_fig3.JPG                     |   Bin 30789 -> 0 bytes
 html/UG/Images/Dtypes_fig3.PSD                     |   Bin 417393 -> 0 bytes
 html/UG/Images/Dtypes_fig33.JPG                    |   Bin 113197 -> 0 bytes
 html/UG/Images/Dtypes_fig33.PSD                    |   Bin 1234582 -> 0 bytes
 html/UG/Images/Dtypes_fig34.JPG                    |   Bin 32012 -> 0 bytes
 html/UG/Images/Dtypes_fig34.PSD                    |   Bin 410002 -> 0 bytes
 html/UG/Images/Dtypes_fig4.JPG                     |   Bin 68806 -> 0 bytes
 html/UG/Images/Dtypes_fig4.PSD                     |   Bin 91938 -> 0 bytes
 html/UG/Images/Dtypes_fig40.JPG                    |   Bin 64221 -> 0 bytes
 html/UG/Images/Dtypes_fig40.PSD                    |   Bin 613595 -> 0 bytes
 html/UG/Images/Dtypes_fig45.JPG                    |   Bin 46385 -> 0 bytes
 html/UG/Images/Dtypes_fig45.PSD                    |   Bin 584863 -> 0 bytes
 html/UG/Images/Dtypes_fig47.JPG                    |   Bin 57367 -> 0 bytes
 html/UG/Images/Dtypes_fig47.PSD                    |   Bin 699480 -> 0 bytes
 html/UG/Images/Dtypes_fig5.JPG                     |   Bin 21714 -> 0 bytes
 html/UG/Images/Dtypes_fig50.JPG                    |   Bin 186823 -> 0 bytes
 html/UG/Images/Dtypes_fig50.PSD                    |   Bin 920523 -> 0 bytes
 html/UG/Images/Dtypes_fig51.JPG                    |   Bin 88876 -> 0 bytes
 html/UG/Images/Dtypes_fig51.PSD                    |   Bin 741635 -> 0 bytes
 html/UG/Images/Dtypes_fig53.JPG                    |   Bin 41509 -> 0 bytes
 html/UG/Images/Dtypes_fig53.PSD                    |   Bin 523553 -> 0 bytes
 html/UG/Images/Dtypes_fig54.JPG                    |   Bin 22383 -> 0 bytes
 html/UG/Images/Dtypes_fig54.PSD                    |   Bin 52276 -> 0 bytes
 html/UG/Images/Dtypes_fig57_arrow.jpg              |   Bin 12260 -> 0 bytes
 html/UG/Images/Dtypes_fig57_arrow.psd              |   Bin 12774 -> 0 bytes
 html/UG/Images/Dtypes_fig57a.JPG                   |   Bin 23832 -> 0 bytes
 html/UG/Images/Dtypes_fig57b.JPG                   |   Bin 24393 -> 0 bytes
 html/UG/Images/Dtypes_fig58.JPG                    |   Bin 17196 -> 0 bytes
 html/UG/Images/Dtypes_fig58_arrow.PSD              |   Bin 9898 -> 0 bytes
 html/UG/Images/Dtypes_fig58_arrow.jpg              |   Bin 10925 -> 0 bytes
 html/UG/Images/Dtypes_fig6.JPG                     |   Bin 47774 -> 0 bytes
 html/UG/Images/Dtypes_fig60.JPG                    |   Bin 186991 -> 0 bytes
 html/UG/Images/Dtypes_fig60.PSD                    |   Bin 1335055 -> 0 bytes
 html/UG/Images/Dtypes_fig62.JPG                    |   Bin 168756 -> 0 bytes
 html/UG/Images/Dtypes_fig62.PSD                    |   Bin 847860 -> 0 bytes
 html/UG/Images/Dtypes_fig7.JPG                     |   Bin 49643 -> 0 bytes
 html/UG/Images/Dtypes_fig8.JPG                     |   Bin 25196 -> 0 bytes
 html/UG/Images/Dtypes_fig9.JPG                     |   Bin 26011 -> 0 bytes
 html/UG/Images/Files_fig3.JPG                      |   Bin 55720 -> 0 bytes
 html/UG/Images/Files_fig4.JPG                      |   Bin 46063 -> 0 bytes
 html/UG/Images/Group_fig1.PSD                      |   Bin 451228 -> 0 bytes
 html/UG/Images/Group_fig1.jpg                      |   Bin 34485 -> 0 bytes
 html/UG/Images/Group_fig2,8.PSD                    |   Bin 437134 -> 0 bytes
 html/UG/Images/Group_fig2,8.jpg                    |   Bin 36633 -> 0 bytes
 html/UG/Images/Group_fig3.jpg                      |   Bin 32818 -> 0 bytes
 html/UG/Images/Group_fig3.psd                      |   Bin 413446 -> 0 bytes
 html/UG/Images/Groups_fig5a.JPG                    |   Bin 32978 -> 0 bytes
 html/UG/Images/Groups_fig6.JPG                     |   Bin 16657 -> 0 bytes
 html/UG/Images/Pmodel_fig2.JPG                     |   Bin 11039 -> 0 bytes
 html/UG/Images/Pmodel_fig26.JPG                    |   Bin 48920 -> 0 bytes
 html/UG/Images/Pmodel_fig26.PSD                    |   Bin 391514 -> 0 bytes
 html/UG/Images/Pmodel_fig3.JPG                     |   Bin 36902 -> 0 bytes
 html/UG/Images/Pmodel_fig5_a.jpg                   |   Bin 58621 -> 0 bytes
 html/UG/Images/Pmodel_fig5_a.ppt                   |   Bin 13824 -> 0 bytes
 html/UG/Images/Pmodel_fig5_a.psd                   |   Bin 354533 -> 0 bytes
 html/UG/Images/Pmodel_fig5_b.jpg                   |   Bin 63231 -> 0 bytes
 html/UG/Images/Pmodel_fig5_b.ppt                   |   Bin 19968 -> 0 bytes
 html/UG/Images/Pmodel_fig5_b.psd                   |   Bin 365791 -> 0 bytes
 html/UG/Images/Pmodel_fig5_c.jpg                   |   Bin 73718 -> 0 bytes
 html/UG/Images/Pmodel_fig5_c.ppt                   |   Bin 27648 -> 0 bytes
 html/UG/Images/Pmodel_fig5_c.psd                   |   Bin 374623 -> 0 bytes
 html/UG/Images/Pmodel_fig5_d.jpg                   |   Bin 72977 -> 0 bytes
 html/UG/Images/Pmodel_fig5_d.ppt                   |   Bin 22016 -> 0 bytes
 html/UG/Images/Pmodel_fig5_d.psd                   |   Bin 398783 -> 0 bytes
 html/UG/Images/Pmodel_fig5_e.jpg                   |   Bin 20117 -> 0 bytes
 html/UG/Images/Pmodel_fig5_e.ppt                   |   Bin 11776 -> 0 bytes
 html/UG/Images/Pmodel_fig5_e.psd                   |   Bin 304688 -> 0 bytes
 html/UG/Images/PropListClassInheritance.png        |   Bin 172255 -> 0 bytes
 html/UG/Images/PropListEcosystem.png               |   Bin 36997 -> 0 bytes
 html/UG/Images/Shared_Attribute.jpg                |   Bin 37209 -> 0 bytes
 html/UG/Images/Shared_Attribute.psd                |   Bin 439042 -> 0 bytes
 html/UG/Images/UML_Attribute.PSD                   |   Bin 504928 -> 0 bytes
 html/UG/Images/UML_Attribute.jpg                   |   Bin 36134 -> 0 bytes
 html/UG/Images/UML_FileAndProps.gif                |   Bin 6161 -> 0 bytes
 html/UG/Images/VFL_Drivers.gif                     |   Bin 17638 -> 0 bytes
 html/UG/Images/VFL_Drivers.jpg                     |   Bin 71945 -> 0 bytes
 html/UG/Images/VFL_Drivers.psd                     |   Bin 688429 -> 0 bytes
 html/UG/Images/back.png                            |   Bin 790 -> 0 bytes
 html/UG/Images/dtypes_fig51new.JPG                 |   Bin 32119 -> 0 bytes
 html/UG/Images/dtypes_fig57_arrowWithText.JPG      |   Bin 11881 -> 0 bytes
 html/UG/Images/forward.png                         |   Bin 793 -> 0 bytes
 html/UG/Images/groups_fig1a.JPG                    |   Bin 17331 -> 0 bytes
 html/UG/Images/groups_fig20.JPG                    |   Bin 66230 -> 0 bytes
 html/UG/Images/groups_fig20.PSD                    |   Bin 96656 -> 0 bytes
 html/UG/Images/groups_fig21.JPG                    |   Bin 58472 -> 0 bytes
 html/UG/Images/groups_fig21.PSD                    |   Bin 84227 -> 0 bytes
 html/UG/Images/groups_fig22.JPG                    |   Bin 45978 -> 0 bytes
 html/UG/Images/groups_fig22.PSD                    |   Bin 69696 -> 0 bytes
 html/UG/Images/groups_fig23.JPG                    |   Bin 58616 -> 0 bytes
 html/UG/Images/groups_fig23.PSD                    |   Bin 77489 -> 0 bytes
 html/UG/Images/groups_fig24.JPG                    |   Bin 92884 -> 0 bytes
 html/UG/Images/groups_fig24.PSD                    |   Bin 163410 -> 0 bytes
 html/UG/Images/groups_fig25_a.JPG                  |   Bin 35116 -> 0 bytes
 html/UG/Images/groups_fig25_a.PSD                  |   Bin 54893 -> 0 bytes
 html/UG/Images/groups_fig25_b.JPG                  |   Bin 19609 -> 0 bytes
 html/UG/Images/groups_fig25_b.PSD                  |   Bin 30676 -> 0 bytes
 html/UG/Images/groups_fig25_c.JPG                  |   Bin 19074 -> 0 bytes
 html/UG/Images/groups_fig25_c.PSD                  |   Bin 28084 -> 0 bytes
 html/UG/Images/groups_fig26.JPG                    |   Bin 42258 -> 0 bytes
 html/UG/Images/groups_fig26.PSD                    |   Bin 53436 -> 0 bytes
 html/UG/Images/groups_fig27_a.JPG                  |   Bin 14834 -> 0 bytes
 html/UG/Images/groups_fig27_a.PSD                  |   Bin 23747 -> 0 bytes
 html/UG/Images/groups_fig27_aa.JPG                 |   Bin 19074 -> 0 bytes
 html/UG/Images/groups_fig27_aa.PSD                 |   Bin 28744 -> 0 bytes
 html/UG/Images/groups_fig27_b.JPG                  |   Bin 17658 -> 0 bytes
 html/UG/Images/groups_fig27_b.PSD                  |   Bin 28032 -> 0 bytes
 html/UG/Images/groups_fig27_bb.JPG                 |   Bin 17549 -> 0 bytes
 html/UG/Images/groups_fig27_bb.PSD                 |   Bin 27532 -> 0 bytes
 html/UG/Images/groups_fig28_a.JPG                  |   Bin 18691 -> 0 bytes
 html/UG/Images/groups_fig28_a.PSD                  |   Bin 27930 -> 0 bytes
 html/UG/Images/groups_fig28_b.JPG                  |   Bin 15020 -> 0 bytes
 html/UG/Images/groups_fig28_b.PSD                  |   Bin 23871 -> 0 bytes
 html/UG/Images/groups_fig28_c.JPG                  |   Bin 20111 -> 0 bytes
 html/UG/Images/groups_fig28_c.PSD                  |   Bin 29607 -> 0 bytes
 html/UG/Images/groups_fig28_d.JPG                  |   Bin 33071 -> 0 bytes
 html/UG/Images/groups_fig28_d.PSD                  |   Bin 197408 -> 0 bytes
 html/UG/Images/groups_fig29_a.JPG                  |   Bin 17647 -> 0 bytes
 html/UG/Images/groups_fig29_a.PSD                  |   Bin 27038 -> 0 bytes
 html/UG/Images/groups_fig29_b.JPG                  |   Bin 19057 -> 0 bytes
 html/UG/Images/groups_fig29_b.PSD                  |   Bin 29060 -> 0 bytes
 html/UG/Images/groups_fig29_c.JPG                  |   Bin 20951 -> 0 bytes
 html/UG/Images/groups_fig29_c.PSD                  |   Bin 31781 -> 0 bytes
 html/UG/Images/groups_fig29_d.JPG                  |   Bin 22942 -> 0 bytes
 html/UG/Images/groups_fig29_d.PSD                  |   Bin 34461 -> 0 bytes
 html/UG/Images/groups_fig2a.JPG                    |   Bin 19350 -> 0 bytes
 html/UG/Images/groups_fig2a_Ex5.JPG                |   Bin 36598 -> 0 bytes
 html/UG/Images/groups_fig2a_Ex8.JPG                |   Bin 36488 -> 0 bytes
 html/UG/Images/groups_fig3a.JPG                    |   Bin 16694 -> 0 bytes
 html/UG/Images/groups_fig3b.JPG                    |   Bin 23952 -> 0 bytes
 html/UG/Images/groups_fig4.JPG                     |   Bin 18961 -> 0 bytes
 html/UG/Images/groups_fig4.PSD                     |   Bin 22321 -> 0 bytes
 html/UG/Images/groups_fig5.JPG                     |   Bin 31879 -> 0 bytes
 html/UG/Images/groups_fig5.PSD                     |   Bin 64319 -> 0 bytes
 html/UG/Images/logo_bluegreen_txt.jpg              |   Bin 413520 -> 0 bytes
 html/UG/OldHtmlSource/03_DataModel.html            |  1217 -
 html/UG/OldHtmlSource/04_ProgModel.html            |  1921 --
 html/UG/OldHtmlSource/08_TheFile.html              |  3068 ---
 html/UG/OldHtmlSource/09_Groups.html               |  3005 ---
 html/UG/OldHtmlSource/10_Datasets.html             |  5085 ----
 html/UG/OldHtmlSource/11_Datatypes.html            |  7494 ------
 html/UG/OldHtmlSource/12_Dataspaces.html           |  3001 ---
 html/UG/OldHtmlSource/13_Attributes.html           |  1255 -
 html/UG/OldHtmlSource/13_ErrorHandling.html        |  1121 -
 html/UG/OldHtmlSource/14_PropertyLists.html        |  2828 --
 html/UG/OldHtmlSource/17_Additional.html           |  1445 --
 html/UG/OldHtmlSource/99_SelectedPassages.html     |   114 -
 html/UG/OldHtmlSource/H5_newUG.book                |    15 -
 html/UG/OldHtmlSource/H5_newUG_Front.book          |     5 -
 html/UG/OldHtmlSource/H5_newUG_TOC.html            |   170 -
 html/UG/OldHtmlSource/H5_newUG_Title.html          |    47 -
 html/UG/OldHtmlSource/ObjectsIdentifiers.html      |  2016 --
 .../OldHtmlSource/UG_nav11Datatypes.html           |   298 -
 html/UG/OldHtmlSource/Part1SplitterPg.html         |    20 -
 html/UG/OldHtmlSource/Part2SplitterPg.html         |    20 -
 html/UG/OldHtmlSource/Part3SplitterPg.html         |    21 -
 html/UG/OldHtmlSource/UG_UpdateStatus.html         |    46 -
 html/UG/OldHtmlSource/UG_UseWith18.html            |    70 -
 html/UG/OldHtmlSource/UG_feedback.html             |    55 -
 html/UG/OldHtmlSource/UG_frame.html                |    37 -
 html/UG/OldHtmlSource/UG_frame03DataModel.html     |    37 -
 html/UG/OldHtmlSource/UG_frame04ProgModel.html     |    37 -
 html/UG/OldHtmlSource/UG_frame08TheFile.html       |    37 -
 html/UG/OldHtmlSource/UG_frame09Groups.html        |    37 -
 html/UG/OldHtmlSource/UG_frame10Datasets.html      |    37 -
 html/UG/OldHtmlSource/UG_frame11Datatypes.html     |    37 -
 html/UG/OldHtmlSource/UG_frame12Dataspaces.html    |    37 -
 html/UG/OldHtmlSource/UG_frame13Attributes.html    |    37 -
 html/UG/OldHtmlSource/UG_frame13ErrorHandling.html |    37 -
 html/UG/OldHtmlSource/UG_frame14PropertyLists.html |    37 -
 html/UG/OldHtmlSource/UG_frame17SpecialTopics.html |    37 -
 .../OldHtmlSource/UG_frameObjectsIdentifiers.html  |    37 -
 html/UG/OldHtmlSource/UG_front.html                |    70 -
 html/UG/OldHtmlSource/UG_nav00.html                |   270 -
 html/UG/OldHtmlSource/UG_nav03DataModel.html       |   275 -
 html/UG/OldHtmlSource/UG_nav04ProgModel.html       |   306 -
 html/UG/OldHtmlSource/UG_nav08TheFile.html         |   296 -
 html/UG/OldHtmlSource/UG_nav09Groups.html          |   275 -
 html/UG/OldHtmlSource/UG_nav10Datasets.html        |   290 -
 html/UG/OldHtmlSource/UG_nav11Datatypes.html       |   298 -
 html/UG/OldHtmlSource/UG_nav12Dataspaces.html      |   286 -
 html/UG/OldHtmlSource/UG_nav13Attributes.html      |   277 -
 html/UG/OldHtmlSource/UG_nav13ErrorHandling.html   |   286 -
 html/UG/OldHtmlSource/UG_nav14PropertyLists.html   |   284 -
 html/UG/OldHtmlSource/UG_nav17SpecialTopics.html   |   268 -
 .../UG/OldHtmlSource/UG_navObjectsIdentifiers.html |   282 -
 html/UG/OldHtmlSource/index.html                   |     1 -
 html/UG/OldHtmlSource/process.txt                  |   530 -
 html/UG/ed_libs/NavBar_UG.lbi                      |    39 -
 html/UG/ed_libs/styles_NewUG.lbi                   |     1 -
 html/UG/ed_libs/styles_UG.lbi                      |     1 -
 html/UG/ed_styles/NewUGelect.css                   |   318 -
 html/UG/ed_styles/UGelect.css                      |    35 -
 html/UG/ed_styles/UGprint.css                      |    58 -
 html/_topic/UG_string_datatypes.htm                |   335 +
 html/_topic/loc_id+name_attr.htm                   |     3 +-
 html/cpplus/CppInterfaces.html                     |     1 -
 html/ddl.html                                      |     8 +-
 html/ed_libs/Footer-THGonly.htm                    |     2 +-
 html/ed_libs/Footer-THGonly.lbi                    |     2 +-
 html/ed_libs/Footer-THGonly2.htm                   |     2 +-
 html/ed_libs/Footer-THGonly3.htm                   |     2 +-
 html/ed_libs/Footer.htm                            |     2 +-
 html/ed_libs/Footer.lbi                            |     4 +-
 html/ed_libs/Footer2.htm                           |     2 +-
 html/ed_libs/Footer3.htm                           |     2 +-
 html/ed_libs/Footer_Null.htm                       |     4 +-
 html/ed_libs/Footer_Null.lbi                       |     2 +-
 html/ed_libs/NavBar_RM.lbi                         |     4 +-
 html/ed_libs/styles_UG.lbi                         |     2 +-
 html/index.html                                    |     4 +-
 m4/aclocal_fc.m4                                   |   347 +-
 m4/libtool.m4                                      |  7997 ++++++
 m4/ltoptions.m4                                    |   384 +
 m4/ltsugar.m4                                      |   123 +
 m4/ltversion.m4                                    |    23 +
 m4/lt~obsolete.m4                                  |    98 +
 release_docs/HISTORY-1_0-1_8_0_rc3.txt             |     8 +-
 release_docs/HISTORY-1_8.txt                       | 10947 --------
 release_docs/HISTORY-1_9.txt                       |     6 +
 release_docs/INSTALL                               |   250 +-
 release_docs/INSTALL_CMake.txt                     |    28 +-
 release_docs/INSTALL_Cygwin.txt                    |     5 +
 release_docs/INSTALL_Windows.txt                   |     6 +-
 release_docs/RELEASE.txt                           |   543 +-
 release_docs/USING_CMake_Examples.txt              |    10 +-
 release_docs/USING_HDF5_CMake.txt                  |    15 +-
 release_docs/USING_HDF5_VS.txt                     |    58 +-
 src/CMakeLists.txt                                 |   407 +-
 src/H5.c                                           |    73 +-
 src/H5A.c                                          |   142 +-
 src/H5AC.c                                         |  4429 +---
 src/H5AClog.c                                      |   892 +
 src/H5ACmodule.h                                   |    35 +
 src/H5ACmpio.c                                     |  2245 ++
 src/H5ACpkg.h                                      |   158 +-
 src/H5ACprivate.h                                  |   320 +-
 src/H5ACpublic.h                                   |     9 +-
 src/H5Abtree2.c                                    |   146 +-
 src/H5Adense.c                                     |    28 +-
 src/H5Adeprec.c                                    |    54 +-
 src/H5Aint.c                                       |   422 +-
 src/H5Amodule.h                                    |    35 +
 src/H5Apkg.h                                       |    25 +-
 src/H5Atest.c                                      |     4 +-
 src/H5B.c                                          |   240 +-
 src/H5B2.c                                         |   292 +-
 src/H5B2cache.c                                    |  1386 +-
 src/H5B2dbg.c                                      |   127 +-
 src/H5B2hdr.c                                      |   191 +-
 src/H5B2int.c                                      |  1844 +-
 src/H5B2module.h                                   |    36 +
 src/H5B2pkg.h                                      |   152 +-
 src/H5B2private.h                                  |    17 +-
 src/H5B2stat.c                                     |     4 +-
 src/H5B2test.c                                     |   156 +-
 src/H5Bcache.c                                     |   393 +-
 src/H5Bdbg.c                                       |    29 +-
 src/H5Bmodule.h                                    |    35 +
 src/H5Bpkg.h                                       |    10 +-
 src/H5Bprivate.h                                   |     5 +-
 src/H5C.c                                          |  8365 +++---
 src/H5CS.c                                         |   167 +-
 src/H5CSprivate.h                                  |    22 +-
 src/H5Cmodule.h                                    |    35 +
 src/H5Cmpio.c                                      |  1220 +
 src/H5Cpkg.h                                       |  6637 ++---
 src/H5Cprivate.h                                   |  1950 +-
 src/H5D.c                                          |   257 +-
 src/H5Dbtree.c                                     |   387 +-
 src/H5Dbtree2.c                                    |  1657 ++
 src/H5Dchunk.c                                     |  2564 +-
 src/H5Dcompact.c                                   |    56 +-
 src/H5Dcontig.c                                    |   105 +-
 src/H5Ddbg.c                                       |    25 +-
 src/H5Ddeprec.c                                    |   171 +-
 src/H5Dearray.c                                    |  1807 ++
 src/H5Defl.c                                       |    24 +-
 src/H5Dfarray.c                                    |  1700 ++
 src/H5Dfill.c                                      |     3 +-
 src/H5Dint.c                                       |  1254 +-
 src/H5Dio.c                                        |    32 +-
 src/H5Dlayout.c                                    |   441 +-
 src/H5Dmodule.h                                    |    35 +
 src/H5Dmpio.c                                      |    25 +-
 src/H5Dnone.c                                      |   497 +
 src/H5Doh.c                                        |    92 +-
 src/H5Dpkg.h                                       |   171 +-
 src/H5Dprivate.h                                   |    33 +-
 src/H5Dpublic.h                                    |    31 +-
 src/H5Dscatgath.c                                  |     2 +-
 src/H5Dselect.c                                    |     2 +-
 src/H5Dsingle.c                                    |   557 +
 src/H5Dtest.c                                      |    43 +-
 src/H5Dvirtual.c                                   |  2946 +++
 src/H5E.c                                          |   148 +-
 src/H5EA.c                                         |  1117 +
 src/H5EAcache.c                                    |  2204 ++
 src/H5EAdbg.c                                      |   478 +
 src/H5EAdblkpage.c                                 |   322 +
 src/H5EAdblock.c                                   |   491 +
 src/H5EAhdr.c                                      |   810 +
 src/H5EAiblock.c                                   |   479 +
 src/H5EAint.c                                      |   141 +
 src/H5EAmodule.h                                   |    35 +
 src/H5EApkg.h                                      |   491 +
 src/H5EAprivate.h                                  |   158 +
 src/H5EAsblock.c                                   |   446 +
 src/H5EAstat.c                                     |   116 +
 src/H5EAtest.c                                     |   487 +
 src/H5Edefin.h                                     |   232 +-
 src/H5Edeprec.c                                    |    50 +-
 src/H5Einit.h                                      |   850 +-
 src/H5Eint.c                                       |    30 +-
 src/H5Emodule.h                                    |    36 +
 src/H5Epkg.h                                       |     2 +-
 src/H5Eprivate.h                                   |    81 +-
 src/H5Epubgen.h                                    |   410 +-
 src/H5Eterm.h                                      |   234 +-
 src/H5F.c                                          |   593 +-
 src/H5FA.c                                         |   852 +
 src/H5FAcache.c                                    |  1271 +
 src/H5FAdbg.c                                      |   285 +
 src/H5FAdblkpage.c                                 |   315 +
 src/H5FAdblock.c                                   |   443 +
 src/H5FAhdr.c                                      |   565 +
 src/H5FAint.c                                      |   139 +
 src/H5FAmodule.h                                   |    35 +
 src/H5FApkg.h                                      |   331 +
 src/H5FAprivate.h                                  |   143 +
 src/H5FAstat.c                                     |   113 +
 src/H5FAtest.c                                     |   422 +
 src/H5FD.c                                         |   524 +-
 src/H5FDcore.c                                     |   377 +-
 src/H5FDcore.h                                     |     6 +-
 src/H5FDdirect.c                                   |   169 +-
 src/H5FDdirect.h                                   |     4 +-
 src/H5FDdrvr_module.h                              |    35 +
 src/H5FDfamily.c                                   |   228 +-
 src/H5FDfamily.h                                   |     4 +-
 src/H5FDint.c                                      |    52 +-
 src/H5FDlog.c                                      |   142 +-
 src/H5FDlog.h                                      |     3 -
 src/H5FDmodule.h                                   |    35 +
 src/H5FDmpi.c                                      |    13 +-
 src/H5FDmpio.c                                     |  1077 +-
 src/H5FDmpio.h                                     |     2 +-
 src/H5FDmulti.c                                    |   288 +-
 src/H5FDmulti.h                                    |     6 +-
 src/H5FDpkg.h                                      |     7 +-
 src/H5FDprivate.h                                  |    16 +-
 src/H5FDpublic.h                                   |    77 +-
 src/H5FDsec2.c                                     |   114 +-
 src/H5FDsec2.h                                     |     3 -
 src/H5FDspace.c                                    |    33 +-
 src/H5FDstdio.c                                    |   158 +-
 src/H5FDstdio.h                                    |     1 -
 src/H5FDtest.c                                     |   119 +
 src/H5FDwindows.h                                  |    20 +-
 src/H5FL.c                                         |   690 +-
 src/H5FLmodule.h                                   |    35 +
 src/H5FLprivate.h                                  |     2 +-
 src/H5FO.c                                         |     2 +-
 src/H5FS.c                                         |   633 +-
 src/H5FScache.c                                    |  1564 +-
 src/H5FSdbg.c                                      |   127 +-
 src/H5FSint.c                                      |   145 +
 src/H5FSmodule.h                                   |    35 +
 src/H5FSpkg.h                                      |    37 +-
 src/H5FSprivate.h                                  |    32 +-
 src/H5FSpublic.h                                   |     2 +-
 src/H5FSsection.c                                  |   453 +-
 src/H5FSstat.c                                     |    16 +-
 src/H5FStest.c                                     |    31 +-
 src/H5Faccum.c                                     |    17 +-
 src/H5Fcwfs.c                                      |    14 +-
 src/H5Fdbg.c                                       |     6 +-
 src/H5Fdeprec.c                                    |   149 +
 src/H5Fefc.c                                       |    13 +-
 src/H5Ffake.c                                      |    29 +-
 src/H5Fint.c                                       |   534 +-
 src/H5Fio.c                                        |   243 +-
 src/H5Fmodule.h                                    |    35 +
 src/H5Fmount.c                                     |    29 +-
 src/H5Fmpi.c                                       |     2 +-
 src/H5Fpkg.h                                       |   162 +-
 src/H5Fprivate.h                                   |   180 +-
 src/H5Fpublic.h                                    |   118 +-
 src/H5Fquery.c                                     |    57 +-
 src/H5Fsfile.c                                     |     2 +-
 src/H5Fsuper.c                                     |   769 +-
 src/H5Fsuper_cache.c                               |  1535 +-
 src/H5Ftest.c                                      |     8 +-
 src/H5G.c                                          |   282 +-
 src/H5Gbtree2.c                                    |    32 +-
 src/H5Gcache.c                                     |   421 +-
 src/H5Gcompact.c                                   |    12 +-
 src/H5Gdense.c                                     |    20 +-
 src/H5Gdeprec.c                                    |    58 +-
 src/H5Gent.c                                       |    14 +-
 src/H5Gint.c                                       |   150 +-
 src/H5Glink.c                                      |     6 +-
 src/H5Gloc.c                                       |    16 +-
 src/H5Gmodule.h                                    |    35 +
 src/H5Gname.c                                      |    13 +-
 src/H5Gnode.c                                      |    47 +-
 src/H5Gobj.c                                       |    52 +-
 src/H5Goh.c                                        |    38 +-
 src/H5Gpkg.h                                       |     7 +-
 src/H5Gprivate.h                                   |    15 +-
 src/H5Gpublic.h                                    |     2 +
 src/H5Groot.c                                      |     4 +-
 src/H5Gstab.c                                      |    70 +-
 src/H5Gtest.c                                      |    41 +-
 src/H5Gtraverse.c                                  |    25 +-
 src/H5HF.c                                         |   180 +-
 src/H5HFbtree2.c                                   |   445 +-
 src/H5HFcache.c                                    |  3519 ++-
 src/H5HFdbg.c                                      |    91 +-
 src/H5HFdblock.c                                   |    36 +-
 src/H5HFdtable.c                                   |     9 +-
 src/H5HFhdr.c                                      |    41 +-
 src/H5HFhuge.c                                     |   147 +-
 src/H5HFiblock.c                                   |    83 +-
 src/H5HFint.c                                      |   146 +
 src/H5HFiter.c                                     |     5 +-
 src/H5HFman.c                                      |    98 +-
 src/H5HFmodule.h                                   |    35 +
 src/H5HFpkg.h                                      |   153 +-
 src/H5HFprivate.h                                  |     6 +
 src/H5HFsection.c                                  |    85 +-
 src/H5HFspace.c                                    |    11 +-
 src/H5HFstat.c                                     |     3 +-
 src/H5HFtest.c                                     |    19 +-
 src/H5HFtiny.c                                     |   174 +-
 src/H5HG.c                                         |   118 +-
 src/H5HGcache.c                                    |   543 +-
 src/H5HGdbg.c                                      |     4 +-
 src/H5HGmodule.h                                   |    35 +
 src/H5HGpkg.h                                      |    10 +-
 src/H5HGprivate.h                                  |     7 +-
 src/H5HGquery.c                                    |     2 +-
 src/H5HL.c                                         |   916 +-
 src/H5HLcache.c                                    |   974 +-
 src/H5HLdbg.c                                      |    77 +-
 src/H5HLdblk.c                                     |   282 +
 src/H5HLint.c                                      |   323 +-
 src/H5HLmodule.h                                   |    35 +
 src/H5HLpkg.h                                      |   104 +-
 src/H5HLprfx.c                                     |   166 +
 src/H5HLprivate.h                                  |    45 +-
 src/H5HLpublic.h                                   |     2 -
 src/H5I.c                                          |   430 +-
 src/H5Imodule.h                                    |    35 +
 src/H5Ipkg.h                                       |     2 +-
 src/H5Iprivate.h                                   |     4 +-
 src/H5Ipublic.h                                    |     4 +-
 src/H5Itest.c                                      |     4 +-
 src/H5L.c                                          |    49 +-
 src/H5Lexternal.c                                  |   100 +-
 src/H5Lmodule.h                                    |    36 +
 src/H5Lpkg.h                                       |     2 +-
 src/H5MF.c                                         |   416 +-
 src/H5MFaggr.c                                     |    18 +-
 src/H5MFdbg.c                                      |    70 +-
 src/H5MFmodule.h                                   |    35 +
 src/H5MFpkg.h                                      |     2 +-
 src/H5MFprivate.h                                  |     6 +-
 src/H5MFsection.c                                  |    16 +-
 src/H5MM.c                                         |    41 +-
 src/H5MP.c                                         |    11 +-
 src/H5MPmodule.h                                   |    35 +
 src/H5MPpkg.h                                      |     2 +-
 src/H5MPtest.c                                     |     2 +-
 src/H5O.c                                          |   417 +-
 src/H5Oainfo.c                                     |    34 +-
 src/H5Oalloc.c                                     |   103 +-
 src/H5Oattr.c                                      |    16 +-
 src/H5Oattribute.c                                 |    88 +-
 src/H5Obogus.c                                     |     3 +-
 src/H5Obtreek.c                                    |     7 +-
 src/H5Ocache.c                                     |  1370 +-
 src/H5Ochunk.c                                     |    49 +-
 src/H5Ocont.c                                      |     7 +-
 src/H5Ocopy.c                                      |    75 +-
 src/H5Odbg.c                                       |    30 +-
 src/H5Odrvinfo.c                                   |     9 +-
 src/H5Odtype.c                                     |    46 +-
 src/H5Oefl.c                                       |    95 +-
 src/H5Ofill.c                                      |    17 +-
 src/H5Oflush.c                                     |   427 +
 src/H5Ofsinfo.c                                    |   310 +
 src/H5Oginfo.c                                     |     9 +-
 src/H5Olayout.c                                    |   863 +-
 src/H5Olinfo.c                                     |    31 +-
 src/H5Olink.c                                      |    23 +-
 src/H5Omessage.c                                   |   129 +-
 src/H5Omodule.h                                    |    35 +
 src/H5Omtime.c                                     |   127 +-
 src/H5Oname.c                                      |    13 +-
 src/H5Onull.c                                      |     3 +-
 src/H5Opkg.h                                       |   133 +-
 src/H5Opline.c                                     |    11 +-
 src/H5Oprivate.h                                   |   244 +-
 src/H5Oproxy.c                                     |   952 +
 src/H5Opublic.h                                    |     7 +-
 src/H5Orefcount.c                                  |    13 +-
 src/H5Osdspace.c                                   |    16 +-
 src/H5Oshared.c                                    |    14 +-
 src/H5Oshared.h                                    |     6 +-
 src/H5Oshmesg.c                                    |    11 +-
 src/H5Ostab.c                                      |    27 +-
 src/H5Otest.c                                      |    68 +-
 src/H5Ounknown.c                                   |     3 +-
 src/H5P.c                                          |   145 +-
 src/H5PL.c                                         |   165 +-
 src/H5PLmodule.h                                   |    36 +
 src/H5PLpublic.h                                   |     2 +-
 src/H5Pacpl.c                                      |     4 +-
 src/H5Pdapl.c                                      |   653 +-
 src/H5Pdcpl.c                                      |  2815 +-
 src/H5Pdeprec.c                                    |   109 +-
 src/H5Pdxpl.c                                      |   929 +-
 src/H5Pencdec.c                                    |   791 +
 src/H5Pfapl.c                                      |  2372 +-
 src/H5Pfcpl.c                                      |   536 +-
 src/H5Pfmpl.c                                      |    17 +-
 src/H5Pgcpl.c                                      |   205 +-
 src/H5Pint.c                                       |  1690 +-
 src/H5Plapl.c                                      |   657 +-
 src/H5Plcpl.c                                      |    14 +-
 src/H5Pmodule.h                                    |    35 +
 src/H5Pocpl.c                                      |   558 +-
 src/H5Pocpypl.c                                    |   340 +-
 src/H5Ppkg.h                                       |    37 +-
 src/H5Pprivate.h                                   |    17 +-
 src/H5Ppublic.h                                    |    39 +-
 src/H5Pstrcpl.c                                    |    91 +-
 src/H5Ptest.c                                      |    62 +-
 src/H5R.c                                          |   185 +-
 src/H5RC.c                                         |   127 -
 src/H5RCprivate.h                                  |    63 -
 src/H5Rdeprec.c                                    |   103 +-
 src/H5Rmodule.h                                    |    36 +
 src/H5Rpkg.h                                       |     6 +-
 src/H5Rpublic.h                                    |     5 +-
 src/H5S.c                                          |   257 +-
 src/H5SL.c                                         |   155 +-
 src/H5SLmodule.h                                   |    35 +
 src/H5SM.c                                         |   216 +-
 src/H5SMbtree2.c                                   |    80 +-
 src/H5SMcache.c                                    |   923 +-
 src/H5SMmessage.c                                  |    34 +-
 src/H5SMmodule.h                                   |    35 +
 src/H5SMpkg.h                                      |     8 +-
 src/H5SMprivate.h                                  |     4 +-
 src/H5SMtest.c                                     |     8 +-
 src/H5Sall.c                                       |    87 +-
 src/H5Sdbg.c                                       |     2 +-
 src/H5Shyper.c                                     |  1908 +-
 src/H5Smodule.h                                    |    35 +
 src/H5Smpio.c                                      |    13 +-
 src/H5Snone.c                                      |    80 +-
 src/H5Spkg.h                                       |    35 +-
 src/H5Spoint.c                                     |   129 +-
 src/H5Sprivate.h                                   |    31 +-
 src/H5Spublic.h                                    |     7 +-
 src/H5Sselect.c                                    |   414 +-
 src/H5Stest.c                                      |     6 +-
 src/H5T.c                                          |   612 +-
 src/H5TS.c                                         |     7 +-
 src/H5Tarray.c                                     |    31 +-
 src/H5Tbit.c                                       |    16 +-
 src/H5Tcommit.c                                    |    43 +-
 src/H5Tcompound.c                                  |    27 +-
 src/H5Tconv.c                                      |   230 +-
 src/H5Tcset.c                                      |    27 +-
 src/H5Tdbg.c                                       |    48 +-
 src/H5Tdeprec.c                                    |    50 +-
 src/H5Tenum.c                                      |    30 +-
 src/H5Tfields.c                                    |    31 +-
 src/H5Tfixed.c                                     |    45 +-
 src/H5Tfloat.c                                     |    26 +-
 src/H5Tmodule.h                                    |    35 +
 src/H5Tnative.c                                    |    34 +-
 src/H5Toffset.c                                    |    28 +-
 src/H5Toh.c                                        |    12 +-
 src/H5Topaque.c                                    |    46 +-
 src/H5Torder.c                                     |    26 +-
 src/H5Tpad.c                                       |    44 +-
 src/H5Tpkg.h                                       |     4 +-
 src/H5Tprecis.c                                    |    60 +-
 src/H5Tprivate.h                                   |     9 +-
 src/H5Tpublic.h                                    |     2 +
 src/H5Tstrpad.c                                    |    42 +-
 src/H5Tvisit.c                                     |    15 +-
 src/H5Tvlen.c                                      |    70 +-
 src/H5UC.c                                         |   130 +
 src/H5UCprivate.h                                  |    66 +
 src/H5VM.c                                         |   189 +-
 src/H5VMprivate.h                                  |    70 +-
 src/H5Z.c                                          |   150 +-
 src/H5Zdeflate.c                                   |     4 +-
 src/H5Zfletcher32.c                                |     7 +-
 src/H5Zmodule.h                                    |    35 +
 src/H5Znbit.c                                      |   125 +-
 src/H5Zpkg.h                                       |     2 +-
 src/H5Zscaleoffset.c                               |     8 +-
 src/H5Zshuffle.c                                   |     5 +-
 src/H5Zszip.c                                      |     8 +-
 src/H5Ztrans.c                                     |   233 +-
 src/H5api_adpt.h                                   |    22 -
 src/H5config.h.in                                  |    88 +-
 src/H5detect.c                                     |   313 +-
 src/H5err.txt                                      |    10 +
 src/H5overflow.h                                   |   315 +
 src/H5overflow.txt                                 |     1 +
 src/H5private.h                                    |   750 +-
 src/H5public.h                                     |    24 +-
 src/H5system.c                                     |   216 +-
 src/H5trace.c                                      |   295 +-
 src/H5vers.txt                                     |     2 +
 src/H5version.h                                    |   487 +-
 src/H5win32defs.h                                  |     8 +-
 src/Makefile.am                                    |    67 +-
 src/Makefile.in                                    |   416 +-
 src/hdf5.h                                         |     2 +-
 src/libhdf5.settings.in                            |     3 +-
 test/AtomicWriterReader.txt                        |    48 +
 test/CMakeLists.txt                                |    56 +-
 test/CMakeTests.cmake                              |   194 +-
 test/Makefile.am                                   |    95 +-
 test/Makefile.in                                   |   720 +-
 test/POSIX_Order_Write_Test_Report.docx            |   Bin 0 -> 145445 bytes
 test/SWMR_POSIX_Order_UG.txt                       |    94 +
 test/SWMR_UseCase_UG.txt                           |   223 +
 test/accum.c                                       |   348 +-
 test/accum_swmr_reader.c                           |    99 +
 test/app_ref.c                                     |     4 +
 test/atomic_reader.c                               |   347 +
 test/atomic_writer.c                               |   230 +
 test/bad_compound.h5                               |   Bin 2208 -> 2208 bytes
 test/be_data.h5                                    |   Bin 72368 -> 72368 bytes
 test/big.c                                         |    30 +-
 test/bittests.c                                    |     2 +-
 test/btree2.c                                      |   198 +-
 test/btree_idx_1_6.h5                              |   Bin 0 -> 6350 bytes
 test/btree_idx_1_8.h5                              |   Bin 0 -> 5065 bytes
 test/cache.c                                       | 17344 +++++++++----
 test/cache_api.c                                   |   404 +-
 test/cache_common.c                                |  3379 ++-
 test/cache_common.h                                |   194 +-
 test/cache_logging.c                               |   176 +
 test/cache_tagging.c                               |  4017 +++
 test/chunk_info.c                                  |   153 +
 test/cmpd_dset.c                                   |    38 +-
 test/cork.c                                        |  2191 ++
 test/corrupt_stab_msg.h5                           |   Bin 2928 -> 2928 bytes
 test/cross_read.c                                  |     2 +-
 test/dangle.c                                      |   129 +
 test/deflate.h5                                    |   Bin 6240 -> 6240 bytes
 test/dsets.c                                       |  3423 ++-
 test/dt_arith.c                                    |   143 +-
 test/dtransform.c                                  |     2 +-
 test/dtypes.c                                      |   229 +-
 test/earray.c                                      |  2902 +++
 test/efc.c                                         |     4 +-
 test/enc_dec_plist.c                               |   580 +
 test/enc_dec_plist_cross_platform.c                |   235 +
 test/err_compat.c                                  |     3 +-
 test/error_test.c                                  |     2 +-
 test/external.c                                    |    11 +-
 test/family_v16_00000.h5                           |   Bin 5120 -> 5120 bytes
 test/farray.c                                      |  1811 ++
 test/fheap.c                                       |   809 +-
 test/file_image.c                                  |   116 +-
 test/filespace_1_6.h5                              |   Bin 0 -> 2448 bytes
 test/filespace_1_8.h5                              |   Bin 0 -> 2448 bytes
 test/fill_old.h5                                   |   Bin 2560 -> 2560 bytes
 test/fillval.c                                     |    31 +-
 test/fixed_idx.h5                                  |   Bin 2158 -> 0 bytes
 test/flush2.c                                      |   205 +-
 test/flushrefresh.c                                |  1279 +
 test/freespace.c                                   |     6 +-
 test/gen_bogus.c                                   |    14 +-
 test/gen_cross.c                                   |    68 +-
 test/gen_filespace.c                               |    82 +
 test/gen_idx.c                                     |    22 +-
 test/gen_plist.c                                   |   482 +
 test/gen_specmetaread.c                            |    96 +
 test/gen_udlinks.c                                 |     4 +
 test/getname.c                                     |    43 +-
 test/group_old.h5                                  |   Bin 1952 -> 1952 bytes
 test/h5test.c                                      |   266 +-
 test/h5test.h                                      |    70 +-
 test/hyperslab.c                                   |     2 +-
 test/istore.c                                      |     2 +-
 test/le_data.h5                                    |   Bin 72368 -> 72368 bytes
 test/lheap.c                                       |    99 +-
 test/links.c                                       |   205 +-
 test/links_env.c                                   |     2 +-
 test/mergemsg.h5                                   |   Bin 3472 -> 3472 bytes
 test/mf.c                                          |  1697 +-
 test/mtime.c                                       |    16 +-
 test/multi_file_v16-s.h5                           |   Bin 2048 -> 2048 bytes
 test/noencoder.h5                                  |   Bin 8088 -> 8088 bytes
 test/ntypes.c                                      |     4 +-
 test/objcopy.c                                     |  1331 +-
 test/ohdr.c                                        |   246 +-
 test/plugin.c                                      |    10 +-
 test/pool.c                                        |     2 +-
 test/set_extent.c                                  |   450 +-
 test/stab.c                                        |     4 +-
 test/swmr.c                                        |  6785 +++++
 test/swmr_addrem_writer.c                          |   458 +
 test/swmr_check_compat_vfd.c                       |    59 +
 test/swmr_common.c                                 |   292 +
 test/swmr_common.h                                 |    78 +
 test/swmr_generator.c                              |   355 +
 test/swmr_reader.c                                 |   509 +
 test/swmr_remove_reader.c                          |   522 +
 test/swmr_remove_writer.c                          |   383 +
 test/swmr_sparse_reader.c                          |   451 +
 test/swmr_sparse_writer.c                          |   460 +
 test/swmr_start_write.c                            |   739 +
 test/swmr_writer.c                                 |   431 +
 test/tarray.c                                      |    45 +-
 test/tarrold.h5                                    |   Bin 6032 -> 6032 bytes
 test/tattr.c                                       |   146 +-
 test/tbogus.h5                                     |   Bin 1944 -> 2216 bytes
 test/test_filters_be.h5                            |   Bin 5720 -> 5720 bytes
 test/test_filters_le.h5                            |   Bin 5720 -> 5720 bytes
 test/test_plugin.sh.in                             |     2 +-
 test/test_usecases.sh.in                           |   169 +
 test/testfiles/plist_files/acpl_32be               |   Bin 0 -> 23 bytes
 test/testfiles/plist_files/acpl_32le               |   Bin 0 -> 23 bytes
 test/testfiles/plist_files/acpl_64be               |   Bin 0 -> 23 bytes
 test/testfiles/plist_files/acpl_64le               |   Bin 0 -> 23 bytes
 test/testfiles/plist_files/dapl_32be               |   Bin 0 -> 136 bytes
 test/testfiles/plist_files/dapl_32le               |   Bin 0 -> 136 bytes
 test/testfiles/plist_files/dapl_64be               |   Bin 0 -> 136 bytes
 test/testfiles/plist_files/dapl_64le               |   Bin 0 -> 136 bytes
 test/testfiles/plist_files/dcpl_32be               |   Bin 0 -> 221 bytes
 test/testfiles/plist_files/dcpl_32le               |   Bin 0 -> 221 bytes
 test/testfiles/plist_files/dcpl_64be               |   Bin 0 -> 221 bytes
 test/testfiles/plist_files/dcpl_64le               |   Bin 0 -> 221 bytes
 test/testfiles/plist_files/def_acpl_32be           |   Bin 0 -> 23 bytes
 test/testfiles/plist_files/def_acpl_32le           |   Bin 0 -> 23 bytes
 test/testfiles/plist_files/def_acpl_64be           |   Bin 0 -> 23 bytes
 test/testfiles/plist_files/def_acpl_64le           |   Bin 0 -> 23 bytes
 test/testfiles/plist_files/def_dapl_32be           |   Bin 0 -> 131 bytes
 test/testfiles/plist_files/def_dapl_32le           |   Bin 0 -> 131 bytes
 test/testfiles/plist_files/def_dapl_64be           |   Bin 0 -> 131 bytes
 test/testfiles/plist_files/def_dapl_64le           |   Bin 0 -> 131 bytes
 test/testfiles/plist_files/def_dcpl_32be           |   Bin 0 -> 132 bytes
 test/testfiles/plist_files/def_dcpl_32le           |   Bin 0 -> 132 bytes
 test/testfiles/plist_files/def_dcpl_64be           |   Bin 0 -> 132 bytes
 test/testfiles/plist_files/def_dcpl_64le           |   Bin 0 -> 132 bytes
 test/testfiles/plist_files/def_dxpl_32be           |   Bin 0 -> 225 bytes
 test/testfiles/plist_files/def_dxpl_32le           |   Bin 0 -> 225 bytes
 test/testfiles/plist_files/def_dxpl_64be           |   Bin 0 -> 225 bytes
 test/testfiles/plist_files/def_dxpl_64le           |   Bin 0 -> 225 bytes
 test/testfiles/plist_files/def_fapl_32be           |   Bin 0 -> 1460 bytes
 test/testfiles/plist_files/def_fapl_32le           |   Bin 0 -> 1460 bytes
 test/testfiles/plist_files/def_fapl_64be           |   Bin 0 -> 1460 bytes
 test/testfiles/plist_files/def_fapl_64le           |   Bin 0 -> 1460 bytes
 test/testfiles/plist_files/def_fcpl_32be           |   Bin 0 -> 412 bytes
 test/testfiles/plist_files/def_fcpl_32le           |   Bin 0 -> 412 bytes
 test/testfiles/plist_files/def_fcpl_64be           |   Bin 0 -> 412 bytes
 test/testfiles/plist_files/def_fcpl_64le           |   Bin 0 -> 412 bytes
 test/testfiles/plist_files/def_gcpl_32be           |   Bin 0 -> 113 bytes
 test/testfiles/plist_files/def_gcpl_32le           |   Bin 0 -> 113 bytes
 test/testfiles/plist_files/def_gcpl_64be           |   Bin 0 -> 113 bytes
 test/testfiles/plist_files/def_gcpl_64le           |   Bin 0 -> 113 bytes
 test/testfiles/plist_files/def_lapl_32be           |   Bin 0 -> 88 bytes
 test/testfiles/plist_files/def_lapl_32le           |   Bin 0 -> 88 bytes
 test/testfiles/plist_files/def_lapl_64be           |   Bin 0 -> 88 bytes
 test/testfiles/plist_files/def_lapl_64le           |   Bin 0 -> 88 bytes
 test/testfiles/plist_files/def_lcpl_32be           |   Bin 0 -> 47 bytes
 test/testfiles/plist_files/def_lcpl_32le           |   Bin 0 -> 47 bytes
 test/testfiles/plist_files/def_lcpl_64be           |   Bin 0 -> 47 bytes
 test/testfiles/plist_files/def_lcpl_64le           |   Bin 0 -> 47 bytes
 test/testfiles/plist_files/def_ocpl_32be           |   Bin 0 -> 75 bytes
 test/testfiles/plist_files/def_ocpl_32le           |   Bin 0 -> 75 bytes
 test/testfiles/plist_files/def_ocpl_64be           |   Bin 0 -> 75 bytes
 test/testfiles/plist_files/def_ocpl_64le           |   Bin 0 -> 75 bytes
 test/testfiles/plist_files/def_ocpypl_32be         |   Bin 0 -> 48 bytes
 test/testfiles/plist_files/def_ocpypl_32le         |   Bin 0 -> 48 bytes
 test/testfiles/plist_files/def_ocpypl_64be         |   Bin 0 -> 48 bytes
 test/testfiles/plist_files/def_ocpypl_64le         |   Bin 0 -> 48 bytes
 test/testfiles/plist_files/def_strcpl_32be         |   Bin 0 -> 23 bytes
 test/testfiles/plist_files/def_strcpl_32le         |   Bin 0 -> 23 bytes
 test/testfiles/plist_files/def_strcpl_64be         |   Bin 0 -> 23 bytes
 test/testfiles/plist_files/def_strcpl_64le         |   Bin 0 -> 23 bytes
 test/testfiles/plist_files/dxpl_32be               |   Bin 0 -> 229 bytes
 test/testfiles/plist_files/dxpl_32le               |   Bin 0 -> 229 bytes
 test/testfiles/plist_files/dxpl_64be               |   Bin 0 -> 229 bytes
 test/testfiles/plist_files/dxpl_64le               |   Bin 0 -> 229 bytes
 test/testfiles/plist_files/fapl_32be               |   Bin 0 -> 1462 bytes
 test/testfiles/plist_files/fapl_32le               |   Bin 0 -> 1462 bytes
 test/testfiles/plist_files/fapl_64be               |   Bin 0 -> 1462 bytes
 test/testfiles/plist_files/fapl_64le               |   Bin 0 -> 1462 bytes
 test/testfiles/plist_files/fcpl_32be               |   Bin 0 -> 413 bytes
 test/testfiles/plist_files/fcpl_32le               |   Bin 0 -> 413 bytes
 test/testfiles/plist_files/fcpl_64be               |   Bin 0 -> 413 bytes
 test/testfiles/plist_files/fcpl_64le               |   Bin 0 -> 413 bytes
 test/testfiles/plist_files/gcpl_32be               |   Bin 0 -> 113 bytes
 test/testfiles/plist_files/gcpl_32le               |   Bin 0 -> 113 bytes
 test/testfiles/plist_files/gcpl_64be               |   Bin 0 -> 113 bytes
 test/testfiles/plist_files/gcpl_64le               |   Bin 0 -> 113 bytes
 test/testfiles/plist_files/lapl_32be               |   Bin 0 -> 1565 bytes
 test/testfiles/plist_files/lapl_32le               |   Bin 0 -> 1565 bytes
 test/testfiles/plist_files/lapl_64be               |   Bin 0 -> 1565 bytes
 test/testfiles/plist_files/lapl_64le               |   Bin 0 -> 1565 bytes
 test/testfiles/plist_files/lcpl_32be               |   Bin 0 -> 47 bytes
 test/testfiles/plist_files/lcpl_32le               |   Bin 0 -> 47 bytes
 test/testfiles/plist_files/lcpl_64be               |   Bin 0 -> 47 bytes
 test/testfiles/plist_files/lcpl_64le               |   Bin 0 -> 47 bytes
 test/testfiles/plist_files/ocpl_32be               |   Bin 0 -> 86 bytes
 test/testfiles/plist_files/ocpl_32le               |   Bin 0 -> 86 bytes
 test/testfiles/plist_files/ocpl_64be               |   Bin 0 -> 86 bytes
 test/testfiles/plist_files/ocpl_64le               |   Bin 0 -> 86 bytes
 test/testfiles/plist_files/ocpypl_32be             |   Bin 0 -> 56 bytes
 test/testfiles/plist_files/ocpypl_32le             |   Bin 0 -> 56 bytes
 test/testfiles/plist_files/ocpypl_64be             |   Bin 0 -> 56 bytes
 test/testfiles/plist_files/ocpypl_64le             |   Bin 0 -> 56 bytes
 test/testfiles/plist_files/strcpl_32be             |   Bin 0 -> 23 bytes
 test/testfiles/plist_files/strcpl_32le             |   Bin 0 -> 23 bytes
 test/testfiles/plist_files/strcpl_64be             |   Bin 0 -> 23 bytes
 test/testfiles/plist_files/strcpl_64le             |   Bin 0 -> 23 bytes
 test/testflushrefresh.sh.in                        |   196 +
 test/testframe.c                                   |    45 +-
 test/testlinks_env.sh.in                           |     1 +
 test/testswmr.sh.in                                |   497 +
 test/testvdsswmr.sh.in                             |   199 +
 test/tfile.c                                       |   914 +-
 test/tgenprop.c                                    |   127 +-
 test/th5o.c                                        |     5 +-
 test/th5s.c                                        |    33 +-
 test/th5s.h5                                       |   Bin 2049 -> 2049 bytes
 test/tid.c                                         |   138 +-
 test/titerate.c                                    |     4 +-
 test/tlayouto.h5                                   |   Bin 1576 -> 1576 bytes
 test/tmisc.c                                       |   221 +-
 test/tmtimen.h5                                    |   Bin 1576 -> 1576 bytes
 test/tmtimeo.h5                                    |   Bin 2052 -> 2052 bytes
 test/trefer.c                                      |   203 +-
 test/tselect.c                                     |  1011 +-
 test/tsohm.c                                       |    18 +-
 test/ttst.c                                        |     6 +-
 test/tunicode.c                                    |     4 +-
 test/tvltypes.c                                    |    68 +-
 test/twriteorder.c                                 |   438 +
 test/unlink.c                                      |     4 +-
 test/use.h                                         |    69 +
 test/use_append_chunk.c                            |   214 +
 test/use_append_mchunks.c                          |   207 +
 test/use_common.c                                  |   631 +
 test/use_disable_mdc_flushes.c                     |   531 +
 test/vds.c                                         | 11150 ++++++++
 test/vds_swmr.h                                    |   165 +
 test/vds_swmr_gen.c                                |   178 +
 test/vds_swmr_reader.c                             |   144 +
 test/vds_swmr_writer.c                             |   159 +
 test/vfd.c                                         |   380 +-
 testpar/CMakeLists.txt                             |     1 +
 testpar/Makefile.am                                |     3 +-
 testpar/Makefile.in                                |    77 +-
 testpar/t_cache.c                                  |  1730 +-
 testpar/t_chunk_alloc.c                            |   171 +-
 testpar/t_dset.c                                   |   220 +-
 testpar/t_file_image.c                             |     6 +-
 testpar/t_filter_read.c                            |   127 +-
 testpar/t_mpi.c                                    |    27 +-
 testpar/t_pflush2.c                                |    24 +-
 testpar/t_prop.c                                   |   462 +
 testpar/t_shapesame.c                              |     5 +-
 testpar/testphdf5.c                                |     7 +-
 testpar/testphdf5.h                                |     1 +
 tools/Makefile.am                                  |     3 +-
 tools/Makefile.in                                  |    72 +-
 tools/h5copy/Makefile.in                           |    72 +-
 tools/h5copy/h5copy.c                              |     4 +-
 tools/h5copy/h5copygentest.c                       |    44 +-
 tools/h5copy/testfiles/h5copytst.h5                |   Bin 30448 -> 30480 bytes
 tools/h5copy/testfiles/h5copytst_new.h5            |   Bin 0 -> 15029 bytes
 tools/h5copy/testfiles/h5copytst_new.out.ls        |   502 +
 tools/h5diff/CMakeTests.cmake                      |    46 +
 tools/h5diff/Makefile.in                           |    72 +-
 tools/h5diff/h5diffgentest.c                       |   230 +-
 tools/h5diff/testfiles/h5diff_19.txt               |    26 +
 tools/h5diff/testfiles/h5diff_attr1.h5             |   Bin 25616 -> 26000 bytes
 tools/h5diff/testfiles/h5diff_attr2.h5             |   Bin 25616 -> 26000 bytes
 tools/h5diff/testfiles/h5diff_basic2.h5            |   Bin 9008 -> 9008 bytes
 tools/h5diff/testfiles/h5diff_dset1.h5             |   Bin 23624 -> 23624 bytes
 tools/h5diff/testfiles/h5diff_dset2.h5             |   Bin 23624 -> 23624 bytes
 tools/h5diff/testfiles/h5diff_dset_idx1.h5         |   Bin 0 -> 5974 bytes
 tools/h5diff/testfiles/h5diff_dset_idx2.h5         |   Bin 0 -> 2206 bytes
 tools/h5diff/testfiles/h5diff_hyper1.h5            |   Bin 1052072 -> 1052720 bytes
 tools/h5diff/testfiles/h5diff_hyper2.h5            |   Bin 1052072 -> 1052720 bytes
 tools/h5diff/testfiles/h5diff_idx.txt              |    14 +
 tools/h5diff/testfiles/h5diff_types.h5             |   Bin 4714 -> 4778 bytes
 tools/h5diff/testfiles/h5diff_v1.txt               |    18 +
 tools/h5diff/testfiles/h5diff_v2.txt               |     7 +
 tools/h5diff/testfiles/h5diff_v3.txt               |     4 +
 tools/h5diff/testfiles/tmptest.he5                 |   Bin 4740424 -> 4740424 bytes
 tools/h5diff/testfiles/tmptest2.he5                |   Bin 4734280 -> 4734280 bytes
 tools/h5diff/testh5diff.sh.in                      |   140 +-
 tools/h5dump/CMakeLists.txt                        |     2 +
 tools/h5dump/CMakeTests.cmake                      |     5 +
 tools/h5dump/CMakeTestsVDS.cmake                   |   238 +
 tools/h5dump/Makefile.am                           |     2 +-
 tools/h5dump/Makefile.in                           |    81 +-
 tools/h5dump/errfiles/tall-1.err                   |     4 +-
 tools/h5dump/errfiles/tall-2A.err                  |     4 +-
 tools/h5dump/errfiles/tall-2A0.err                 |     4 +-
 tools/h5dump/errfiles/tall-2B.err                  |     4 +-
 tools/h5dump/errfiles/tarray1_big.err              |     6 +-
 tools/h5dump/errfiles/tattrregR.err                |     4 +-
 tools/h5dump/errfiles/tdataregR.err                |     4 +-
 tools/h5dump/errfiles/tdset-2.err                  |    13 +-
 tools/h5dump/errfiles/textlink.err                 |     8 +-
 tools/h5dump/errfiles/textlinkfar.err              |    22 +-
 tools/h5dump/errfiles/textlinksrc.err              |    22 +-
 tools/h5dump/errfiles/torderlinks1.err             |     4 +-
 tools/h5dump/errfiles/torderlinks2.err             |     4 +-
 tools/h5dump/errfiles/tperror.err                  |    13 +-
 tools/h5dump/errfiles/tslink-D.err                 |    19 +-
 tools/h5dump/h5dump.c                              |     4 +-
 tools/h5dump/h5dump.h                              |    19 +-
 tools/h5dump/h5dump_ddl.c                          |    60 +-
 tools/h5dump/h5dump_ddl.h                          |     4 +
 tools/h5dump/h5dump_defines.h                      |    33 +-
 tools/h5dump/h5dump_xml.c                          |   262 +-
 tools/h5dump/h5dumpgentest.c                       |   163 +-
 tools/h5dump/testh5dump.sh.in                      |     3 +
 tools/h5dump/testh5dumpvds.sh.in                   |   505 +
 tools/h5format_convert/Makefile.am                 |    49 +
 tools/h5format_convert/Makefile.in                 |  1459 ++
 tools/h5format_convert/h5fc_chk_idx.c              |   101 +
 tools/h5format_convert/h5fc_gentest.c              |   635 +
 tools/h5format_convert/h5format_convert.c          |   438 +
 tools/h5format_convert/testfiles/h5fc_d_file.ddl   |    22 +
 tools/h5format_convert/testfiles/h5fc_dname.ddl    |    22 +
 tools/h5format_convert/testfiles/h5fc_edge_v3.h5   |   Bin 0 -> 2526 bytes
 tools/h5format_convert/testfiles/h5fc_help.ddl     |    21 +
 tools/h5format_convert/testfiles/h5fc_latest_v3.h5 |   Bin 0 -> 6130 bytes
 tools/h5format_convert/testfiles/h5fc_non_v3.h5    |   Bin 0 -> 4336 bytes
 .../testfiles/h5fc_nonexistdset_file.ddl           |     1 +
 .../testfiles/h5fc_nonexistfile.ddl                |     1 +
 tools/h5format_convert/testfiles/h5fc_nooption.ddl |    21 +
 tools/h5format_convert/testfiles/h5fc_v1.h5        |   Bin 0 -> 8252 bytes
 tools/h5format_convert/testfiles/h5fc_v_all.ddl    |    26 +
 tools/h5format_convert/testfiles/h5fc_v_bt1.ddl    |    11 +
 tools/h5format_convert/testfiles/h5fc_v_n_1d.ddl   |    13 +
 tools/h5format_convert/testfiles/h5fc_v_n_all.ddl  |    47 +
 .../testfiles/h5fc_v_ndata_bt1.ddl                 |    12 +
 .../testfiles/h5fc_v_non_chunked.ddl               |     9 +
 tools/h5format_convert/testh5fc.sh.in              |   400 +
 tools/h5import/Makefile.in                         |    72 +-
 tools/h5import/h5import.c                          |    22 +-
 tools/h5import/testfiles/binfp64.h5                |   Bin 10760 -> 10760 bytes
 tools/h5import/testfiles/binin16.h5                |   Bin 10760 -> 10760 bytes
 tools/h5import/testfiles/binin32.h5                |   Bin 9472 -> 9472 bytes
 tools/h5import/testfiles/binin8.h5                 |   Bin 10760 -> 10760 bytes
 tools/h5import/testfiles/binuin16.h5               |   Bin 10760 -> 10760 bytes
 tools/h5import/testfiles/binuin32.h5               |   Bin 6384 -> 6384 bytes
 tools/h5import/testfiles/txtfp32.h5                |   Bin 4192 -> 4192 bytes
 tools/h5import/testfiles/txtfp64.h5                |   Bin 9784 -> 9784 bytes
 tools/h5import/testfiles/txtin16.h5                |   Bin 9784 -> 9784 bytes
 tools/h5import/testfiles/txtin32.h5                |   Bin 4192 -> 4192 bytes
 tools/h5import/testfiles/txtin8.h5                 |   Bin 9784 -> 9784 bytes
 tools/h5import/testfiles/txtuin16.h5               |   Bin 10240 -> 10240 bytes
 tools/h5import/testfiles/txtuin32.h5               |   Bin 6240 -> 6240 bytes
 tools/h5jam/Makefile.in                            |    72 +-
 tools/h5jam/getub.c                                |   213 +-
 tools/h5jam/h5jam.c                                |   199 +-
 tools/h5jam/h5jamgentest.c                         |     8 +-
 tools/h5jam/h5unjam.c                              |     2 -
 tools/h5ls/CMakeLists.txt                          |     2 +
 tools/h5ls/CMakeTestsVDS.cmake                     |   149 +
 tools/h5ls/Makefile.am                             |     2 +-
 tools/h5ls/Makefile.in                             |    78 +-
 tools/h5ls/h5ls.c                                  |    41 +-
 tools/h5ls/testh5ls.sh.in                          |     5 +
 tools/h5ls/testh5lsvds.sh.in                       |   258 +
 tools/h5repack/CMakeLists.txt                      |     8 +-
 tools/h5repack/CMakeTests.cmake                    |   199 +-
 tools/h5repack/Makefile.in                         |    72 +-
 tools/h5repack/dynlib_rpk.c                        |    16 +-
 tools/h5repack/h5repack.c                          |    10 +-
 tools/h5repack/h5repack.h                          |     9 +-
 tools/h5repack/h5repack.sh.in                      |   171 +-
 tools/h5repack/h5repack_copy.c                     |    35 +-
 tools/h5repack/h5repack_main.c                     |    58 +-
 tools/h5repack/h5repack_refs.c                     |     6 +-
 tools/h5repack/h5repack_verify.c                   |    93 +-
 tools/h5repack/h5repacktst.c                       |   294 +-
 tools/h5repack/testfiles/h5repack-help.txt         |    15 +
 tools/h5repack/testfiles/h5repack_attr.h5          |   Bin 20056 -> 20056 bytes
 tools/h5repack/testfiles/h5repack_deflate.h5       |   Bin 5962 -> 5962 bytes
 tools/h5repack/testfiles/h5repack_early.h5         |   Bin 2067224 -> 2067224 bytes
 tools/h5repack/testfiles/h5repack_fill.h5          |   Bin 2072 -> 2072 bytes
 tools/h5repack/testfiles/h5repack_filters.h5       |   Bin 29744 -> 29744 bytes
 tools/h5repack/testfiles/h5repack_fletcher.h5      |   Bin 7880 -> 7880 bytes
 tools/h5repack/testfiles/h5repack_hlink.h5         |   Bin 6576 -> 6576 bytes
 tools/h5repack/testfiles/h5repack_layouto.h5       |   Bin 1576 -> 1576 bytes
 tools/h5repack/testfiles/h5repack_nbit.h5          |   Bin 13776 -> 13776 bytes
 tools/h5repack/testfiles/h5repack_shuffle.h5       |   Bin 7864 -> 7864 bytes
 tools/h5repack/testfiles/h5repack_soffset.h5       |   Bin 11052 -> 11052 bytes
 tools/h5repack/testfiles/h5repack_szip.h5          |   Bin 5588 -> 5588 bytes
 tools/h5stat/Makefile.in                           |    72 +-
 tools/h5stat/h5stat.c                              |   202 +-
 tools/h5stat/h5stat_gentest.c                      |   146 +-
 tools/h5stat/testfiles/h5stat_dims1.ddl            |     1 +
 tools/h5stat/testfiles/h5stat_dims2.ddl            |     1 +
 tools/h5stat/testfiles/h5stat_filters-F.ddl        |     4 +
 tools/h5stat/testfiles/h5stat_filters-d.ddl        |     1 +
 tools/h5stat/testfiles/h5stat_filters-dT.ddl       |     1 +
 tools/h5stat/testfiles/h5stat_filters.ddl          |    16 +-
 tools/h5stat/testfiles/h5stat_filters.h5           |   Bin 46272 -> 46272 bytes
 tools/h5stat/testfiles/h5stat_help1.ddl            |     1 +
 tools/h5stat/testfiles/h5stat_help2.ddl            |     1 +
 tools/h5stat/testfiles/h5stat_idx.ddl              |    93 +
 tools/h5stat/testfiles/h5stat_idx.h5               |   Bin 0 -> 2206 bytes
 tools/h5stat/testfiles/h5stat_links2.ddl           |    16 +-
 tools/h5stat/testfiles/h5stat_newgrat.ddl          |    23 +-
 tools/h5stat/testfiles/h5stat_newgrat.h5           |   Bin 6367891 -> 6362168 bytes
 tools/h5stat/testfiles/h5stat_nofile.ddl           |     1 +
 tools/h5stat/testfiles/h5stat_numattrs1.ddl        |     6 +-
 tools/h5stat/testfiles/h5stat_numattrs2.ddl        |    16 +-
 tools/h5stat/testfiles/h5stat_threshold.h5         |   Bin 16312 -> 16312 bytes
 tools/h5stat/testfiles/h5stat_tsohm.ddl            |    16 +-
 tools/h5stat/testh5stat.sh.in                      |     4 +
 tools/lib/CMakeLists.txt                           |    18 +-
 tools/lib/Makefile.in                              |    70 +-
 tools/lib/h5diff.c                                 |    47 +-
 tools/lib/h5diff_array.c                           |    93 +-
 tools/lib/h5diff_attr.c                            |     8 +-
 tools/lib/h5diff_dset.c                            |    58 +-
 tools/lib/h5diff_util.c                            |    49 +-
 tools/lib/h5tools.c                                |    34 +-
 tools/lib/h5tools.h                                |    44 +-
 tools/lib/h5tools_dump.c                           |   808 +-
 tools/lib/h5tools_error.h                          |     2 +-
 tools/lib/h5tools_ref.c                            |     6 +-
 tools/lib/h5tools_str.c                            |   196 +-
 tools/lib/h5tools_str.h                            |     5 +-
 tools/lib/h5tools_type.c                           |   193 +-
 tools/lib/h5tools_utils.c                          |     6 +-
 tools/lib/io_timer.c                               |    12 +-
 tools/misc/CMakeLists.txt                          |     3 +
 tools/misc/Makefile.am                             |    18 +-
 tools/misc/Makefile.in                             |   350 +-
 tools/misc/clear_open_chk.c                        |    72 +
 tools/misc/h5clear.c                               |   137 +
 tools/misc/h5clear_gentest.c                       |   174 +
 tools/misc/h5debug.c                               |   320 +-
 tools/misc/h5mkgrp.c                               |     2 +-
 tools/misc/h5perf_gentest.c                        |   598 +
 tools/misc/h5repart.c                              |    73 +-
 tools/misc/talign.c                                |    21 +-
 tools/misc/testh5clear.sh.in                       |   130 +
 tools/misc/vds/CMakeLists.txt                      |    28 +
 tools/misc/vds/Makefile.am                         |    38 +
 tools/misc/vds/Makefile.in                         |  1436 +
 tools/misc/vds/UC_1.h                              |   150 +
 tools/misc/vds/UC_1_one_dim_gen.c                  |   239 +
 tools/misc/vds/UC_2.h                              |   151 +
 tools/misc/vds/UC_2_two_dims_gen.c                 |   230 +
 tools/misc/vds/UC_3.h                              |    78 +
 tools/misc/vds/UC_3_gaps_gen.c                     |   255 +
 tools/misc/vds/UC_4.h                              |    86 +
 tools/misc/vds/UC_4_printf_gen.c                   |   219 +
 tools/misc/vds/UC_5.h                              |    83 +
 tools/misc/vds/UC_5_stride_gen.c                   |   243 +
 tools/misc/vds/UC_common.h                         |    41 +
 tools/perform/Makefile.in                          |    71 +-
 tools/perform/chunk.c                              |     6 +-
 tools/perform/overhead.c                           |     2 +-
 tools/perform/perf_meta.c                          |     2 +-
 tools/perform/pio_perf.c                           |    59 +-
 tools/perform/pio_standalone.h                     |     4 +-
 tools/perform/sio_engine.c                         |     2 +-
 tools/perform/sio_perf.c                           |    65 +-
 tools/perform/sio_standalone.h                     |     4 +-
 tools/testfiles/family_file00000.h5                |   Bin 1024 -> 1024 bytes
 tools/testfiles/file_space.ddl                     |    20 +
 tools/testfiles/file_space.h5                      |   Bin 0 -> 792 bytes
 tools/testfiles/taindices.h5                       |   Bin 17160 -> 17160 bytes
 tools/testfiles/tarray1.h5                         |   Bin 2112 -> 2112 bytes
 tools/testfiles/tarray2.h5                         |   Bin 3008 -> 3008 bytes
 tools/testfiles/tarray3.h5                         |   Bin 3200 -> 3200 bytes
 tools/testfiles/tarray4.h5                         |   Bin 2176 -> 2176 bytes
 tools/testfiles/tarray5.h5                         |   Bin 2368 -> 2368 bytes
 tools/testfiles/tarray6.h5                         |   Bin 6400 -> 6400 bytes
 tools/testfiles/tarray7.h5                         |   Bin 6400 -> 6400 bytes
 tools/testfiles/tattr.h5                           |   Bin 3024 -> 3024 bytes
 tools/testfiles/tattr2.h5                          |   Bin 33840 -> 33840 bytes
 tools/testfiles/tbigdims.h5                        |   Bin 6192 -> 6192 bytes
 tools/testfiles/tbitfields.h5                      |   Bin 2704 -> 2704 bytes
 tools/testfiles/tboot1.ddl                         |     2 +
 tools/testfiles/tboot2.ddl                         |     2 +
 tools/testfiles/tboot2A.ddl                        |     2 +
 tools/testfiles/tboot2B.ddl                        |     2 +
 tools/testfiles/tchar.h5                           |   Bin 2356 -> 2356 bytes
 tools/testfiles/tcompound.h5                       |   Bin 8192 -> 8192 bytes
 tools/testfiles/tcompound2.h5                      |   Bin 13640 -> 13640 bytes
 tools/testfiles/tcompound_complex.h5               |   Bin 8192 -> 8192 bytes
 tools/testfiles/tdatareg.h5                        |   Bin 5652 -> 5652 bytes
 tools/testfiles/tdset.h5                           |   Bin 7648 -> 7648 bytes
 tools/testfiles/tdset2.h5                          |   Bin 9936 -> 9936 bytes
 tools/testfiles/tdset_idx.ddl                      |    61 +
 tools/testfiles/tdset_idx.h5                       |   Bin 0 -> 10562 bytes
 tools/testfiles/tdset_idx.ls                       |    36 +
 tools/testfiles/tempty.h5                          |   Bin 4304 -> 4304 bytes
 tools/testfiles/tenum.h5                           |   Bin 2128 -> 2128 bytes
 tools/testfiles/tfamily00000.h5                    |   Bin 256 -> 256 bytes
 tools/testfiles/tfcontents2.h5                     |   Bin 792 -> 792 bytes
 tools/testfiles/tfilters.h5                        |   Bin 46496 -> 46496 bytes
 tools/testfiles/tfvalues.h5                        |   Bin 9552 -> 9552 bytes
 tools/testfiles/tgroup.h5                          |   Bin 11096 -> 11096 bytes
 tools/testfiles/thlink.h5                          |   Bin 5536 -> 5536 bytes
 tools/testfiles/thyperslab.h5                      |   Bin 1050880 -> 1050880 bytes
 tools/testfiles/tlarge_objname.h5                  |   Bin 40008 -> 40008 bytes
 tools/testfiles/tlonglinks.h5                      |   Bin 203168 -> 203168 bytes
 tools/testfiles/tloop.h5                           |   Bin 3168 -> 3168 bytes
 tools/testfiles/tloop2.h5                          |   Bin 3168 -> 3168 bytes
 tools/testfiles/tmulti-s.h5                        |   Bin 2048 -> 2048 bytes
 tools/testfiles/tname-amp.h5                       |   Bin 2880 -> 2880 bytes
 tools/testfiles/tname-apos.h5                      |   Bin 2880 -> 2880 bytes
 tools/testfiles/tname-gt.h5                        |   Bin 2880 -> 2880 bytes
 tools/testfiles/tname-lt.h5                        |   Bin 2880 -> 2880 bytes
 tools/testfiles/tname-quot.h5                      |   Bin 2880 -> 2880 bytes
 tools/testfiles/tname-sp.h5                        |   Bin 2880 -> 2880 bytes
 tools/testfiles/tnestedcomp.h5                     |   Bin 2072 -> 2072 bytes
 tools/testfiles/tnodata.h5                         |   Bin 1412 -> 1412 bytes
 tools/testfiles/tnullspace.h5                      |   Bin 3624 -> 3624 bytes
 tools/testfiles/tobjref.h5                         |   Bin 2900 -> 2900 bytes
 tools/testfiles/topaque.h5                         |   Bin 1744 -> 1744 bytes
 tools/testfiles/tref-escapes-at.h5                 |   Bin 5849 -> 5849 bytes
 tools/testfiles/tref-escapes.h5                    |   Bin 5536 -> 5536 bytes
 tools/testfiles/tref.h5                            |   Bin 3004 -> 3004 bytes
 tools/testfiles/tsaf.h5                            |   Bin 769444 -> 769444 bytes
 tools/testfiles/tslink.h5                          |   Bin 1168 -> 1168 bytes
 tools/testfiles/tsplit_file-m.h5                   |   Bin 2048 -> 2048 bytes
 tools/testfiles/tstr.h5                            |   Bin 15608 -> 15608 bytes
 tools/testfiles/tstr2.h5                           |   Bin 11096 -> 11096 bytes
 tools/testfiles/tstr3.h5                           |   Bin 8736 -> 8736 bytes
 tools/testfiles/tstring-at.h5                      |   Bin 1672 -> 1672 bytes
 tools/testfiles/tstring.h5                         |   Bin 2160 -> 2160 bytes
 tools/testfiles/tvldtypes1.h5                      |   Bin 8336 -> 8336 bytes
 tools/testfiles/tvldtypes2.h5                      |   Bin 6208 -> 6208 bytes
 tools/testfiles/tvldtypes3.h5                      |   Bin 6240 -> 6240 bytes
 tools/testfiles/tvldtypes4.h5                      |   Bin 8192 -> 8192 bytes
 tools/testfiles/tvldtypes5.h5                      |   Bin 8192 -> 8192 bytes
 tools/testfiles/tvms.h5                            |   Bin 2288 -> 2288 bytes
 tools/testfiles/vds/1_a.h5                         |   Bin 0 -> 4856 bytes
 tools/testfiles/vds/1_b.h5                         |   Bin 0 -> 4611 bytes
 tools/testfiles/vds/1_c.h5                         |   Bin 0 -> 4856 bytes
 tools/testfiles/vds/1_d.h5                         |   Bin 0 -> 4611 bytes
 tools/testfiles/vds/1_e.h5                         |   Bin 0 -> 4856 bytes
 tools/testfiles/vds/1_f.h5                         |   Bin 0 -> 4611 bytes
 tools/testfiles/vds/1_vds.h5                       |   Bin 0 -> 5496 bytes
 tools/testfiles/vds/2_a.h5                         |   Bin 0 -> 4576 bytes
 tools/testfiles/vds/2_b.h5                         |   Bin 0 -> 4578 bytes
 tools/testfiles/vds/2_c.h5                         |   Bin 0 -> 4576 bytes
 tools/testfiles/vds/2_d.h5                         |   Bin 0 -> 4578 bytes
 tools/testfiles/vds/2_e.h5                         |   Bin 0 -> 4578 bytes
 tools/testfiles/vds/2_vds.h5                       |   Bin 0 -> 5496 bytes
 tools/testfiles/vds/3_1_vds.h5                     |   Bin 0 -> 5496 bytes
 tools/testfiles/vds/3_2_vds.h5                     |   Bin 0 -> 5496 bytes
 tools/testfiles/vds/4_0.h5                         |   Bin 0 -> 4581 bytes
 tools/testfiles/vds/4_1.h5                         |   Bin 0 -> 4581 bytes
 tools/testfiles/vds/4_2.h5                         |   Bin 0 -> 4581 bytes
 tools/testfiles/vds/4_vds.h5                       |   Bin 0 -> 5496 bytes
 tools/testfiles/vds/5_a.h5                         |   Bin 0 -> 4581 bytes
 tools/testfiles/vds/5_b.h5                         |   Bin 0 -> 4581 bytes
 tools/testfiles/vds/5_c.h5                         |   Bin 0 -> 4581 bytes
 tools/testfiles/vds/5_vds.h5                       |   Bin 0 -> 5496 bytes
 tools/testfiles/vds/tvds-1.ddl                     |   100 +
 tools/testfiles/vds/tvds-1.ls                      |    14 +
 tools/testfiles/vds/tvds-2.ddl                     |    58 +
 tools/testfiles/vds/tvds-2.ls                      |    13 +
 tools/testfiles/vds/tvds-3_1.ddl                   |   135 +
 tools/testfiles/vds/tvds-3_1.ls                    |    14 +
 tools/testfiles/vds/tvds-3_2.ddl                   |   166 +
 tools/testfiles/vds/tvds-3_2.ls                    |    13 +
 tools/testfiles/vds/tvds-4.ddl                     |    46 +
 tools/testfiles/vds/tvds-4.ls                      |     9 +
 tools/testfiles/vds/tvds-5.ddl                     |    46 +
 tools/testfiles/vds/tvds-5.ls                      |    11 +
 tools/testfiles/vds/tvds_layout-1.ddl              |   232 +
 tools/testfiles/vds/tvds_layout-2.ddl              |   170 +
 tools/testfiles/vds/tvds_layout-3_1.ddl            |   267 +
 tools/testfiles/vds/tvds_layout-3_2.ddl            |   278 +
 tools/testfiles/vds/tvds_layout-4.ddl              |    78 +
 tools/testfiles/vds/tvds_layout-5.ddl              |   118 +
 1979 files changed, 301802 insertions(+), 213602 deletions(-)

diff --git a/BRANCH.txt b/BRANCH.txt
new file mode 100644
index 0000000..2cbc975
--- /dev/null
+++ b/BRANCH.txt
@@ -0,0 +1,15 @@
+autotools_rework
+
+The purpose of this branch is to make changes to the autotools files,
+particularly configure.ac. This will remove a lot of old cruft and update
+the input files. This effort was started in January 2015 and should be
+completed within the year.
+
+This branch tracks the trunk.
+
+Dana Robinson and Allen Byrne are the owners of this branch.
+
+This branch should be closed when the bulk of the autotools work is
+complete and has been merged into the trunk and 1.8 branch. This
+work should be completed by mid-2015.
+
diff --git a/CMakeInstallation.cmake b/CMakeInstallation.cmake
index 4798c7d..bb5f046 100644
--- a/CMakeInstallation.cmake
+++ b/CMakeInstallation.cmake
@@ -144,16 +144,34 @@ install (
 )
 
 #-----------------------------------------------------------------------------
+# Create pkgconfig files
+#-----------------------------------------------------------------------------
+#foreach (libs ${LINK_LIBS})
+#  set (LIBS "${LIBS} -l${libs}")
+#endforeach (libs ${LINK_LIBS})
+#foreach (libs ${HDF5_LIBRARIES_TO_EXPORT})
+#  set (HDF5LIBS "${HDF5LIBS} -l${libs}")
+#endforeach (libs ${HDF5_LIBRARIES_TO_EXPORT})
+#configure_file (
+#    ${HDF_RESOURCES_DIR}/libhdf5.pc.in
+#    ${HDF5_BINARY_DIR}/CMakeFiles/libhdf5.pc @ONLY
+#)
+#install (
+#    FILES ${HDF5_BINARY_DIR}/CMakeFiles/libhdf5.pc
+#    DESTINATION ${HDF5_INSTALL_LIB_DIR}/pkgconfig
+#)
+
+#-----------------------------------------------------------------------------
 # Configure the HDF518_Examples.cmake file and the examples
 #-----------------------------------------------------------------------------
 option (HDF5_PACK_EXAMPLES  "Package the HDF5 Library Examples Compressed File" OFF)
 if (HDF5_PACK_EXAMPLES)
   configure_file (
-      ${HDF_RESOURCES_DIR}/HDF518_Examples.cmake.in
-      ${HDF5_BINARY_DIR}/HDF518_Examples.cmake @ONLY
+      ${HDF_RESOURCES_DIR}/HDF5_Examples.cmake.in
+      ${HDF5_BINARY_DIR}/HDF5_Examples.cmake @ONLY
   )
   install (
-      FILES ${HDF5_BINARY_DIR}/HDF518_Examples.cmake
+      FILES ${HDF5_BINARY_DIR}/HDF5_Examples.cmake
       DESTINATION ${HDF5_INSTALL_DATA_DIR}
       COMPONENT hdfdocuments
   )
@@ -277,7 +295,11 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED AND NOT HDF5_NO_PACKAGES)
     set (CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/release_docs/RELEASE.txt")
   endif (EXISTS "${HDF5_SOURCE_DIR}/release_docs")
   set (CPACK_PACKAGE_RELOCATABLE TRUE)
-  set (CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_VENDOR}/${CPACK_PACKAGE_NAME}/${CPACK_PACKAGE_VERSION}")
+  if (OVERRIDE_INSTALL_VERSION)
+    set (CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_VENDOR}/${CPACK_PACKAGE_NAME}/${OVERRIDE_INSTALL_VERSION}")
+  else (OVERRIDE_INSTALL_VERSION)
+    set (CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_VENDOR}/${CPACK_PACKAGE_NAME}/${CPACK_PACKAGE_VERSION}")
+  endif (OVERRIDE_INSTALL_VERSION)
   set (CPACK_PACKAGE_ICON "${HDF_RESOURCES_EXT_DIR}/hdf.bmp")
 
   set (CPACK_GENERATOR "TGZ")
@@ -306,7 +328,11 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED AND NOT HDF5_NO_PACKAGES)
     # set the package header icon for MUI
     set (CPACK_PACKAGE_ICON "${HDF_RESOURCES_EXT_DIR}\\\\hdf.bmp")
     set (CPACK_NSIS_DISPLAY_NAME "${CPACK_NSIS_PACKAGE_NAME}")
-    set (CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_VENDOR}\\\\${CPACK_PACKAGE_NAME}\\\\${CPACK_PACKAGE_VERSION}")
+    if (OVERRIDE_INSTALL_VERSION)
+      set (CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_VENDOR}\\\\${CPACK_PACKAGE_NAME}\\\\${OVERRIDE_INSTALL_VERSION}")
+    else (OVERRIDE_INSTALL_VERSION)
+      set (CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_VENDOR}\\\\${CPACK_PACKAGE_NAME}\\\\${CPACK_PACKAGE_VERSION}")
+    endif (OVERRIDE_INSTALL_VERSION)
     set (CPACK_NSIS_CONTACT "${HDF5_PACKAGE_BUGREPORT}")
     set (CPACK_NSIS_MODIFY_PATH ON)
 
diff --git a/CMakeLists.txt b/CMakeLists.txt
index fa3c971..65124ab 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -212,6 +212,10 @@ if (NOT HDF5_INSTALL_DATA_DIR)
   endif (NOT WIN32)
 endif (NOT HDF5_INSTALL_DATA_DIR)
 
+if(DEFINED ADDITIONAL_CMAKE_PREFIX_PATH AND EXISTS "${ADDITIONAL_CMAKE_PREFIX_PATH}")
+  set (CMAKE_PREFIX_PATH ${ADDITIONAL_CMAKE_PREFIX_PATH} ${CMAKE_PREFIX_PATH})
+endif(DEFINED ADDITIONAL_CMAKE_PREFIX_PATH AND EXISTS "${ADDITIONAL_CMAKE_PREFIX_PATH}")
+
 #-----------------------------------------------------------------------------
 # parse the full version number from H5public.h and include in H5_VERS_INFO
 #-----------------------------------------------------------------------------
@@ -238,54 +242,6 @@ string (REGEX REPLACE ".*LT_VERS_AGE[ \t]+=[ \t]+([0-9]*).*$"
     "\\1" H5_SOVERS_RELEASE ${_lt_vers_am_contents})
 MATH (EXPR H5_SOVERS_MAJOR ${H5_SOVERS_INTERFACE}-${H5_SOVERS_RELEASE})
 message (STATUS "SOVERSION: ${H5_SOVERS_MAJOR}.${H5_SOVERS_RELEASE}.${H5_SOVERS_MINOR}")
-string (REGEX REPLACE ".*LT_TOOLS_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$"
-    "\\1" H5_TOOLS_SOVERS_INTERFACE ${_lt_vers_am_contents})
-string (REGEX REPLACE ".*LT_TOOLS_VERS_REVISION[ \t]+=[ \t]+([0-9]*).*$"
-    "\\1" H5_TOOLS_SOVERS_MINOR ${_lt_vers_am_contents})
-string (REGEX REPLACE ".*LT_TOOLS_VERS_AGE[ \t]+=[ \t]+([0-9]*).*$"
-    "\\1" H5_TOOLS_SOVERS_RELEASE ${_lt_vers_am_contents})
-MATH (EXPR H5_TOOLS_SOVERS_MAJOR ${H5_TOOLS_SOVERS_INTERFACE}-${H5_TOOLS_SOVERS_RELEASE})
-message (STATUS "SOVERSION_TOOLS: ${H5_TOOLS_SOVERS_MAJOR}.${H5_TOOLS_SOVERS_RELEASE}.${H5_TOOLS_SOVERS_MINOR}")
-string (REGEX REPLACE ".*LT_CXX_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$"
-    "\\1" H5_CXX_SOVERS_INTERFACE ${_lt_vers_am_contents})
-string (REGEX REPLACE ".*LT_CXX_VERS_REVISION[ \t]+=[ \t]+([0-9]*).*$"
-    "\\1" H5_CXX_SOVERS_MINOR ${_lt_vers_am_contents})
-string (REGEX REPLACE ".*LT_CXX_VERS_AGE[ \t]+=[ \t]+([0-9]*).*$"
-    "\\1" H5_CXX_SOVERS_RELEASE ${_lt_vers_am_contents})
-MATH (EXPR H5_CXX_SOVERS_MAJOR ${H5_CXX_SOVERS_INTERFACE}-${H5_CXX_SOVERS_RELEASE})
-message (STATUS "SOVERSION_CXX: ${H5_CXX_SOVERS_MAJOR}.${H5_CXX_SOVERS_RELEASE}.${H5_CXX_SOVERS_MINOR}")
-string (REGEX REPLACE ".*LT_F_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$"
-    "\\1" H5_F_SOVERS_INTERFACE ${_lt_vers_am_contents})
-string (REGEX REPLACE ".*LT_F_VERS_REVISION[ \t]+=[ \t]+([0-9]*).*$"
-    "\\1" H5_F_SOVERS_MINOR ${_lt_vers_am_contents})
-string (REGEX REPLACE ".*LT_F_VERS_AGE[ \t]+=[ \t]+([0-9]*).*$"
-    "\\1" H5_F_SOVERS_RELEASE ${_lt_vers_am_contents})
-MATH (EXPR H5_F_SOVERS_MAJOR ${H5_F_SOVERS_INTERFACE}-${H5_F_SOVERS_RELEASE})
-message (STATUS "SOVERSION_F: ${H5_F_SOVERS_MAJOR}.${H5_F_SOVERS_RELEASE}.${H5_F_SOVERS_MINOR}")
-string (REGEX REPLACE ".*LT_HL_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$"
-    "\\1" H5_HL_SOVERS_INTERFACE ${_lt_vers_am_contents})
-string (REGEX REPLACE ".*LT_HL_VERS_REVISION[ \t]+=[ \t]+([0-9]*).*$"
-    "\\1" H5_HL_SOVERS_MINOR ${_lt_vers_am_contents})
-string (REGEX REPLACE ".*LT_HL_VERS_AGE[ \t]+=[ \t]+([0-9]*).*$"
-    "\\1" H5_HL_SOVERS_RELEASE ${_lt_vers_am_contents})
-MATH (EXPR H5_HL_SOVERS_MAJOR ${H5_HL_SOVERS_INTERFACE}-${H5_HL_SOVERS_RELEASE})
-message (STATUS "SOVERSION_HL: ${H5_HL_SOVERS_MAJOR}.${H5_HL_SOVERS_RELEASE}.${H5_HL_SOVERS_MINOR}")
-string (REGEX REPLACE ".*LT_HL_CXX_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$"
-    "\\1" H5_HL_CXX_SOVERS_INTERFACE ${_lt_vers_am_contents})
-string (REGEX REPLACE ".*LT_HL_CXX_VERS_REVISION[ \t]+=[ \t]+([0-9]*).*$"
-    "\\1" H5_HL_CXX_SOVERS_MINOR ${_lt_vers_am_contents})
-string (REGEX REPLACE ".*LT_HL_CXX_VERS_AGE[ \t]+=[ \t]+([0-9]*).*$"
-    "\\1" H5_HL_CXX_SOVERS_RELEASE ${_lt_vers_am_contents})
-MATH (EXPR H5_HL_CXX_SOVERS_MAJOR ${H5_HL_CXX_SOVERS_INTERFACE}-${H5_HL_CXX_SOVERS_RELEASE})
-message (STATUS "SOVERSION_HL_CXX: ${H5_HL_CXX_SOVERS_MAJOR}.${H5_HL_CXX_SOVERS_RELEASE}.${H5_HL_CXX_SOVERS_MINOR}")
-string (REGEX REPLACE ".*LT_HL_F_VERS_INTERFACE[ \t]+=[ \t]+([0-9]*).*$"
-    "\\1" H5_HL_F_SOVERS_INTERFACE ${_lt_vers_am_contents})
-string (REGEX REPLACE ".*LT_HL_F_VERS_REVISION[ \t]+=[ \t]+([0-9]*).*$"
-    "\\1" H5_HL_F_SOVERS_MINOR ${_lt_vers_am_contents})
-string (REGEX REPLACE ".*LT_HL_F_VERS_AGE[ \t]+=[ \t]+([0-9]*).*$"
-    "\\1" H5_HL_F_SOVERS_RELEASE ${_lt_vers_am_contents})
-MATH (EXPR H5_HL_F_SOVERS_MAJOR ${H5_HL_F_SOVERS_INTERFACE}-${H5_HL_F_SOVERS_RELEASE})
-message (STATUS "SOVERSION_HL_F: ${H5_HL_F_SOVERS_MAJOR}.${H5_HL_F_SOVERS_RELEASE}.${H5_HL_F_SOVERS_MINOR}")
 
 #-----------------------------------------------------------------------------
 # Basic HDF5 stuff here
@@ -301,12 +257,6 @@ else (NOT "${H5_VERS_SUBRELEASE}" STREQUAL "")
   set (HDF5_PACKAGE_VERSION_STRING "${HDF5_PACKAGE_VERSION}")
 endif (NOT "${H5_VERS_SUBRELEASE}" STREQUAL "")
 set (HDF5_PACKAGE_SOVERSION "${H5_SOVERS_MAJOR}.${H5_SOVERS_RELEASE}.${H5_SOVERS_MINOR}")
-set (HDF5_TOOLS_PACKAGE_SOVERSION "${H5_TOOLS_SOVERS_MAJOR}.${H5_TOOLS_SOVERS_RELEASE}.${H5_TOOLS_SOVERS_MINOR}")
-set (HDF5_CXX_PACKAGE_SOVERSION "${H5_CXX_SOVERS_MAJOR}.${H5_CXX_SOVERS_RELEASE}.${H5_CXX_SOVERS_MINOR}")
-set (HDF5_F_PACKAGE_SOVERSION "${H5_F_SOVERS_MAJOR}.${H5_F_SOVERS_RELEASE}.${H5_F_SOVERS_MINOR}")
-set (HDF5_HL_PACKAGE_SOVERSION "${H5_HL_SOVERS_MAJOR}.${H5_HL_SOVERS_RELEASE}.${H5_HL_SOVERS_MINOR}")
-set (HDF5_HL_CXX_PACKAGE_SOVERSION "${H5_HL_CXX_SOVERS_MAJOR}.${H5_HL_CXX_SOVERS_RELEASE}.${H5_HL_CXX_SOVERS_MINOR}")
-set (HDF5_HL_F_PACKAGE_SOVERSION "${H5_HL_F_SOVERS_MAJOR}.${H5_HL_F_SOVERS_RELEASE}.${H5_HL_F_SOVERS_MINOR}")
 set (HDF5_PACKAGE_STRING "${HDF5_PACKAGE_NAME} ${HDF5_PACKAGE_VERSION_STRING}")
 set (HDF5_PACKAGE_TARNAME "${HDF5_PACKAGE}${HDF_PACKAGE_EXT}")
 set (HDF5_PACKAGE_URL "http://www.hdfgroup.org")
@@ -484,10 +434,6 @@ if (CMAKE_BUILD_TYPE MATCHES Debug)
     set (H5_HAVE_INSTRUMENTED_LIBRARY 1)
   endif (HDF5_ENABLE_INSTRUMENT)
   mark_as_advanced (HDF5_ENABLE_INSTRUMENT)
-  #-- NMake Makefiles will overwhelm the console with warnings if -Wall is used.
-  if (NOT WIN32)
-    add_definitions (-Wall)
-  endif (NOT WIN32)
 else (CMAKE_BUILD_TYPE MATCHES Debug)
   add_definitions (-DNDEBUG)
   if (HDF5_ENABLE_TRACE)
@@ -540,7 +486,7 @@ if (H5_HAVE_PARALLEL)
   endif (MPI_C_LINK_FLAGS)
 endif (H5_HAVE_PARALLEL)
 
-set (DEFAULT_API_VERSION "v18")
+set (DEFAULT_API_VERSION "v110")
 #-----------------------------------------------------------------------------
 # Option to use 1.6.x API
 #-----------------------------------------------------------------------------
@@ -552,6 +498,16 @@ if (HDF5_USE_16_API_DEFAULT)
 endif (HDF5_USE_16_API_DEFAULT)
 
 #-----------------------------------------------------------------------------
+# Option to use 1.8.x API
+#-----------------------------------------------------------------------------
+option (HDF5_USE_18_API_DEFAULT "Use the HDF5 1.8.x API by default" OFF)
+set (H5_USE_18_API_DEFAULT 0)
+if (HDF5_USE_18_API_DEFAULT)
+  set (H5_USE_18_API_DEFAULT 1)
+  set (DEFAULT_API_VERSION "v18")
+endif (HDF5_USE_18_API_DEFAULT)
+
+#-----------------------------------------------------------------------------
 # Include user macros
 #-----------------------------------------------------------------------------
 include (UserMacros.cmake)
@@ -579,53 +535,60 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED)
 endif (NOT HDF5_EXTERNALLY_CONFIGURED)
 #-----------------------------------------------------------------------------
 # Option to use threadsafe
-# Note: Currently CMake only allows configuring of threadsafe on
-# non-Cygwin WINDOWS.
 #-----------------------------------------------------------------------------
-if (WIN32)
-  option (HDF5_ENABLE_THREADSAFE "Enable thread-safety" OFF)
-  if (HDF5_ENABLE_THREADSAFE)
-    # check for unsupported options
-    message (STATUS " **** thread-safety option not supported with static library **** ")
-    message (STATUS " **** thread-safety option will not be used building static library **** ")
-    if (HDF5_ENABLE_PARALLEL)
-      if (NOT ALLOW_UNSUPPORTED)
-        message (FATAL_ERROR " **** parallel and thread-safety options are not supported **** ")
-      else (NOT ALLOW_UNSUPPORTED)
-        message (STATUS " **** Allowing unsupported parallel and thread-safety options **** ")
-      endif (NOT ALLOW_UNSUPPORTED)
-    endif (HDF5_ENABLE_PARALLEL)
-    if (HDF5_BUILD_FORTRAN)
-      if (NOT ALLOW_UNSUPPORTED)
-        message (FATAL_ERROR " **** Fortran and thread-safety options are not supported **** ")
-      else (NOT ALLOW_UNSUPPORTED)
-        message (STATUS " **** Allowing unsupported Fortran and thread-safety options **** ")
-      endif (NOT ALLOW_UNSUPPORTED)
-    endif (HDF5_BUILD_FORTRAN)
-    if (HDF5_BUILD_CPP_LIB)
-      if (NOT ALLOW_UNSUPPORTED)
-        message (FATAL_ERROR " **** C++ and thread-safety options are not supported **** ")
-      else (NOT ALLOW_UNSUPPORTED)
-        message (STATUS " **** Allowing unsupported C++ and thread-safety options **** ")
-      endif (NOT ALLOW_UNSUPPORTED)
-    endif (HDF5_BUILD_CPP_LIB)
-    if (HDF5_BUILD_HL_LIB)
-      if (NOT ALLOW_UNSUPPORTED)
-        message (FATAL_ERROR " **** HL and thread-safety options are not supported **** ")
-      else (NOT ALLOW_UNSUPPORTED)
-        message (STATUS " **** Allowing unsupported HL and thread-safety options **** ")
-      endif (NOT ALLOW_UNSUPPORTED)
-    endif (HDF5_BUILD_HL_LIB)
-    if (H5_HAVE_IOEO)
-      message (STATUS " **** Win32 threads requires WINVER>=0x600 (Windows Vista/7/8) **** ")
-      set (H5_HAVE_WIN_THREADS 1)
-    else (H5_HAVE_IOEO)
-      if (NOT H5_HAVE_PTHREAD_H)
-        message (FATAL_ERROR " **** thread-safe option requires Win32 threads or Pthreads **** ")
-      endif (NOT H5_HAVE_PTHREAD_H)
-    endif (H5_HAVE_IOEO)
-  endif (HDF5_ENABLE_THREADSAFE)
-endif (WIN32)
+option (HDF5_ENABLE_THREADSAFE "Enable thread-safety" OFF)
+if (HDF5_ENABLE_THREADSAFE)
+  # check for unsupported options
+  message (STATUS " **** thread-safety option not supported with static library **** ")
+  message (STATUS " **** thread-safety option will not be used building static library **** ")
+  if (HDF5_ENABLE_PARALLEL)
+    if (NOT ALLOW_UNSUPPORTED)
+      message (FATAL_ERROR " **** parallel and thread-safety options are not supported **** ")
+    else (NOT ALLOW_UNSUPPORTED)
+      message (STATUS " **** Allowing unsupported parallel and thread-safety options **** ")
+    endif (NOT ALLOW_UNSUPPORTED)
+  endif (HDF5_ENABLE_PARALLEL)
+  if (HDF5_BUILD_FORTRAN)
+    if (NOT ALLOW_UNSUPPORTED)
+      message (FATAL_ERROR " **** Fortran and thread-safety options are not supported **** ")
+    else (NOT ALLOW_UNSUPPORTED)
+      message (STATUS " **** Allowing unsupported Fortran and thread-safety options **** ")
+    endif (NOT ALLOW_UNSUPPORTED)
+  endif (HDF5_BUILD_FORTRAN)
+  if (HDF5_BUILD_CPP_LIB)
+    if (NOT ALLOW_UNSUPPORTED)
+      message (FATAL_ERROR " **** C++ and thread-safety options are not supported **** ")
+    else (NOT ALLOW_UNSUPPORTED)
+      message (STATUS " **** Allowing unsupported C++ and thread-safety options **** ")
+    endif (NOT ALLOW_UNSUPPORTED)
+  endif (HDF5_BUILD_CPP_LIB)
+  if (HDF5_BUILD_HL_LIB)
+    if (NOT ALLOW_UNSUPPORTED)
+      message (FATAL_ERROR " **** HL and thread-safety options are not supported **** ")
+    else (NOT ALLOW_UNSUPPORTED)
+      message (STATUS " **** Allowing unsupported HL and thread-safety options **** ")
+    endif (NOT ALLOW_UNSUPPORTED)
+  endif (HDF5_BUILD_HL_LIB)
+  if (H5_HAVE_IOEO)
+    message (STATUS " **** Win32 threads requires WINVER>=0x600 (Windows Vista/7/8) **** ")
+    set (H5_HAVE_WIN_THREADS 1)
+  else (H5_HAVE_IOEO)
+    if (NOT H5_HAVE_PTHREAD_H)
+      message (FATAL_ERROR " **** thread-safe option requires Win32 threads or Pthreads **** ")
+    endif (NOT H5_HAVE_PTHREAD_H)
+  endif (H5_HAVE_IOEO)
+  set(THREADS_PREFER_PTHREAD_FLAG ON)
+  find_package(Threads)
+  if (NOT Threads_FOUND)
+    message (STATUS " **** thread-safe package not found - threads still might work **** ")
+  endif (NOT Threads_FOUND)
+endif (HDF5_ENABLE_THREADSAFE)
+
+# -----------------------------------------------------------------------
+# wrapper script variables
+#
+#set (CFLAGS "${C_DEFINES}")
+#set (CXXFLAGS "${CXX_DEFINES}")
 
 #-----------------------------------------------------------------------------
 # Add the HDF5 Library Target to the build
@@ -667,12 +630,12 @@ if (BUILD_TESTING)
   option (HDF_TEST_EXPRESS "Control testing framework (0-3)" "0")
   mark_as_advanced (HDF_TEST_EXPRESS)
 
-  include (${HDF5_SOURCE_DIR}/CTestConfig.cmake)
-  configure_file (${HDF_RESOURCES_DIR}/CTestCustom.cmake ${HDF5_BINARY_DIR}/CTestCustom.ctest @ONLY)
-
   enable_testing ()
   include (CTest)
 
+  include (${HDF5_SOURCE_DIR}/CTestConfig.cmake)
+  configure_file (${HDF_RESOURCES_DIR}/CTestCustom.cmake ${HDF5_BINARY_DIR}/CTestCustom.ctest @ONLY)
+
   if (NOT HDF5_EXTERNALLY_CONFIGURED)
     if (EXISTS "${HDF5_SOURCE_DIR}/test" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/test")
       add_subdirectory (${HDF5_SOURCE_DIR}/tools/lib ${PROJECT_BINARY_DIR}/tools/lib)
@@ -738,13 +701,29 @@ if (EXISTS "${HDF5_SOURCE_DIR}/fortran" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/for
       endif (NOT ALLOW_UNSUPPORTED)
     endif (BUILD_SHARED_LIBS AND APPLE)
     option (HDF5_ENABLE_F2003 "Enable FORTRAN 2003 Standard" ON)
+
     include (${HDF_RESOURCES_EXT_DIR}/HDFUseFortran.cmake)
+
+    message (STATUS "Fortran compiler ID is ${CMAKE_Fortran_COMPILER_ID}")
+    # Building with PGI requires CMake 3.3 or greater  because previous versions
+    # of CMake add the wrong compiler flag for the PGI Fortran compiler.
+    if ("${CMAKE_Fortran_COMPILER_ID}" MATCHES "PGI" AND "${CMAKE_VERSION}" VERSION_LESS "3.3")
+      message (FATAL_ERROR " **** PGI FORTRAN REQUIRES CMAKE VERSION 3.3 OR GREATER **** ")
+    endif ()
+
+    include (${HDF_RESOURCES_DIR}/HDF5UseFortran.cmake)
+
     if (HDF5_ENABLE_F2003)
       if (NOT FORTRAN_HAVE_ISO_C_BINDING)
         set (HDF5_ENABLE_F2003 OFF)
       endif (NOT FORTRAN_HAVE_ISO_C_BINDING)
     endif (HDF5_ENABLE_F2003)
 
+    # -----------------------------------------------------------------------
+    # wrapper script variables
+    #
+#    set (FCFLAGS "${Fortran_DEFINES}")
+
     add_subdirectory (${HDF5_SOURCE_DIR}/fortran ${PROJECT_BINARY_DIR}/fortran)
     if (HDF5_BUILD_HL_LIB)
       if (EXISTS "${HDF5_SOURCE_DIR}/hl/fortran" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/hl/fortran")
diff --git a/COPYING b/COPYING
index b6eee1e..8428f33 100644
--- a/COPYING
+++ b/COPYING
@@ -87,6 +87,12 @@ and/or accompanying materials:
    opinions of authors expressed herein do not necessarily state or reflect 
    those of the United States Government or the University of California, 
    and shall not be used for advertising or product endorsement purposes.
+
 -----------------------------------------------------------------------------
 
+HDF5 is available with the SZIP compression library but SZIP is not part 
+of HDF5 and has separate copyright and license terms. See “Szip Compression 
+in HDF Products” (www.hdfgroup.org/doc_resource/SZIP/) for further details.
+
+-----------------------------------------------------------------------------
 
diff --git a/CTestConfig.cmake b/CTestConfig.cmake
index 0410953..bd97834 100644
--- a/CTestConfig.cmake
+++ b/CTestConfig.cmake
@@ -10,10 +10,10 @@ set (CTEST_NIGHTLY_START_TIME "18:00:00 CST")
 set (CTEST_DROP_METHOD "http")
 if (CDASH_LOCAL)
   set (CTEST_DROP_SITE "10.10.10.82")
-  set (CTEST_DROP_LOCATION "/submit.php?project=HDF5.1.8")
+  set (CTEST_DROP_LOCATION "/submit.php?project=HDF5110")
 else (CDASH_LOCAL)
   set (CTEST_DROP_SITE "cdash.hdfgroup.org")
-  set (CTEST_DROP_LOCATION "/submit.php?project=HDF518")
+  set (CTEST_DROP_LOCATION "/submit.php?project=HDF5110")
 endif (CDASH_LOCAL)
 set (CTEST_DROP_SITE_CDASH TRUE)
 
@@ -23,9 +23,9 @@ set (VALGRIND_COMMAND_OPTIONS "-v --tool=memcheck --leak-check=full --track-fds=
 set (CTEST_MEMORYCHECK_COMMAND "/usr/bin/valgrind")
 set (CTEST_MEMORYCHECK_COMMAND_OPTIONS "-v --tool=memcheck --leak-check=full --track-fds=yes --num-callers=50 --show-reachable=yes --track-origins=yes --malloc-fill=0xff --free-fill=0xfe")
 
-set (CTEST_TEST_TIMEOUT 1200 CACHE STRING 
-    "Maximum time allowed before CTest will kill the test.") 
-set (DART_TESTING_TIMEOUT 1200 CACHE STRING 
+set (CTEST_TEST_TIMEOUT 600 CACHE STRING
+    "Maximum time allowed before CTest will kill the test.")
+set (DART_TESTING_TIMEOUT 600 CACHE STRING
     "Maximum time allowed before CTest will kill the test." FORCE)
 
 SET(CTEST_SUBMIT_RETRY_DELAY 20 CACHE STRING
diff --git a/MANIFEST b/MANIFEST
index 955f30b..b151cf7 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -27,67 +27,46 @@
 ./MANIFEST
 ./Makefile.dist
 ./Makefile.am
-./Makefile.in
-./m4/ltsugar.m4                         _DO_NOT_DISTRIBUTE_
-./m4/libtool.m4                         _DO_NOT_DISTRIBUTE_
-./m4/ltversion.m4                       _DO_NOT_DISTRIBUTE_
-./m4/lt~obsolete.m4                     _DO_NOT_DISTRIBUTE_
-./m4/ltoptions.m4                       _DO_NOT_DISTRIBUTE_
-./m4/aclocal_cxx.m4
 ./m4/aclocal_fc.m4
+./m4/aclocal_cxx.m4
 ./README.txt
-./aclocal.m4
+./BRANCH.txt
 ./acsite.m4
-./configure
+./autogen.sh
 ./configure.ac
 
 ./bin/COPYING
-./bin/bbrelease       _DO_NOT_DISTRIBUTE_
+./bin/bbrelease         _DO_NOT_DISTRIBUTE_
 ./bin/buildhdf5
-./bin/pkgscrpts/build_and_package_hdf5_binaries.sh  _DO_NOT_DISTRIBUTE_
 ./bin/checkapi        _DO_NOT_DISTRIBUTE_
 ./bin/checkposix      _DO_NOT_DISTRIBUTE_
 ./bin/chkconfigure      _DO_NOT_DISTRIBUTE_
 ./bin/chkcopyright      _DO_NOT_DISTRIBUTE_
 ./bin/chkmanifest
 ./bin/cmakehdf5
-./bin/compile
-./bin/config.guess
-./bin/config.sub
-./bin/debug-ohdr             _DO_NOT_DISTRIBUTE_
+./bin/debug-ohdr      _DO_NOT_DISTRIBUTE_
 ./bin/dependencies
-./bin/depcomp
 ./bin/deploy
 ./bin/distdep
-./bin/errors                 _DO_NOT_DISTRIBUTE_
+./bin/errors              _DO_NOT_DISTRIBUTE_
+./bin/genparser
 ./bin/gcov_script            _DO_NOT_DISTRIBUTE_
-./bin/genltanalyze           _DO_NOT_DISTRIBUTE_
 ./bin/h5vers
-./bin/install-sh
 ./bin/iostats
 ./bin/locate_sw
-./bin/ltmain.sh
 ./bin/make_err
 ./bin/make_overflow
 ./bin/make_vers
 ./bin/makehelp
-./bin/pkgscrpts/make1816TarFiles.pl       _DO_NOT_DISTRIBUTE_
-./bin/pkgscrpts/makeInternal1816README.pl _DO_NOT_DISTRIBUTE_
-./bin/pkgscrpts/makeOuter1816README.pl    _DO_NOT_DISTRIBUTE_
-./bin/pkgscrpts/h5rmflags                 _DO_NOT_DISTRIBUTE_
-./bin/missing
 ./bin/mkdirs
-./bin/mkinstalldirs
 ./bin/newer
-./bin/reconfigure                   _DO_NOT_DISTRIBUTE_
 ./bin/output_filter.sh
+./bin/README        _DO_NOT_DISTRIBUTE_
 ./bin/release
-./bin/runtest                       _DO_NOT_DISTRIBUTE_
+./bin/runtest        _DO_NOT_DISTRIBUTE_
 ./bin/snapshot
-./bin/snapshot_version              _DO_NOT_DISTRIBUTE_
-./bin/test-driver
-./bin/pkgscrpts/testbinaries.sh     _DO_NOT_DISTRIBUTE_
-./bin/timekeeper                    _DO_NOT_DISTRIBUTE_
+./bin/snapshot_version      _DO_NOT_DISTRIBUTE_
+./bin/timekeeper      _DO_NOT_DISTRIBUTE_
 ./bin/trace
 ./bin/yodconfigure
 
@@ -98,6 +77,7 @@
 ./config/cce-flags
 ./config/commence.am
 ./config/conclude.am
+./config/conclude_fc.am
 ./config/examples.am
 ./config/freebsd
 ./config/gnu-fflags
@@ -123,7 +103,6 @@
 
 ./examples/Attributes.txt
 ./examples/Makefile.am
-./examples/Makefile.in
 ./examples/h5_chunk_read.c
 ./examples/h5_compound.c
 ./examples/h5_crtgrpd.c
@@ -151,6 +130,14 @@
 ./examples/h5_ref2reg.c
 ./examples/h5_shared_mesg.c
 ./examples/ph5example.c
+./examples/h5_vds.c
+./examples/h5_vds-exc.c
+./examples/h5_vds-exclim.c
+./examples/h5_vds-eiger.c
+./examples/h5_vds-simpleIO.c
+./examples/h5_vds-percival.c
+./examples/h5_vds-percival-unlim.c
+./examples/h5_vds-percival-unlim-maxmin.c
 ./examples/testh5cc.sh.in
 ./examples/README
 
@@ -163,12 +150,9 @@
 
 ./fortran/COPYING
 ./fortran/Makefile.am
-./fortran/Makefile.in
-
 ./fortran/robodoc.rc
 
 ./fortran/examples/Makefile.am
-./fortran/examples/Makefile.in
 ./fortran/examples/compound.f90
 ./fortran/examples/compound_fortran2003.f90
 ./fortran/examples/compound_complex_fortran2003.f90
@@ -178,7 +162,9 @@
 ./fortran/examples/h5_crtgrp.f90
 ./fortran/examples/h5_crtgrpar.f90
 ./fortran/examples/h5_crtgrpd.f90
+./hl/fortran/examples/exlite.f90
 ./fortran/examples/h5_extend.f90
+./hl/fortran/examples/ex_ds1.f90
 ./fortran/examples/h5_rdwt.f90
 ./fortran/examples/h5_subset.f90
 ./fortran/examples/hyperslab.f90
@@ -192,118 +178,90 @@
 ./fortran/examples/nested_derived_type.f90
 ./fortran/examples/rwdset_fortran2003.f90
 
+./fortran/src/H5_buildiface.F90
 ./fortran/src/H5_f.c
-./fortran/src/H5_ff.f90
-./fortran/src/H5_ff_F90.f90
-./fortran/src/H5_ff_F03.f90
-./fortran/src/H5_DBLE_InterfaceInclude.f90
-./fortran/src/H5_DBLE_InterfaceExclude.f90
+./fortran/src/H5_ff.F90
 ./fortran/src/H5Af.c
-./fortran/src/H5Aff.f90
-./fortran/src/H5Aff_F90.f90
-./fortran/src/H5Aff_F03.f90
+./fortran/src/H5Aff.F90
 ./fortran/src/H5Df.c
-./fortran/src/H5Dff.f90
-./fortran/src/H5Dff_F90.f90
-./fortran/src/H5Dff_F03.f90
+./fortran/src/H5Dff.F90
 ./fortran/src/H5Ef.c
-./fortran/src/H5Eff.f90
-./fortran/src/H5Eff_F90.f90
-./fortran/src/H5Eff_F03.f90
-./fortran/src/H5FDmpiof.c
-./fortran/src/H5FDmpioff.f90
+./fortran/src/H5Eff.F90
 ./fortran/src/H5Ff.c
-./fortran/src/H5Fff.f90
-./fortran/src/H5Fff_F90.f90
-./fortran/src/H5Fff_F03.f90
+./fortran/src/H5Fff.F90
 ./fortran/src/H5Gf.c
-./fortran/src/H5Gff.f90
+./fortran/src/H5Gff.F90
 ./fortran/src/H5If.c
-./fortran/src/H5Iff.f90
+./fortran/src/H5Iff.F90
 ./fortran/src/H5Lf.c
-./fortran/src/H5Lff.f90
-./fortran/src/H5Lff_F90.f90
-./fortran/src/H5Lff_F03.f90
+./fortran/src/H5Lff.F90
 ./fortran/src/H5Of.c
-./fortran/src/H5Off.f90
-./fortran/src/H5Off_F90.f90
-./fortran/src/H5Off_F03.f90
+./fortran/src/H5Off.F90
 ./fortran/src/H5Pf.c
-./fortran/src/H5Pff.f90
-./fortran/src/H5Pff_F90.f90
-./fortran/src/H5Pff_F03.f90
+./fortran/src/H5Pff.F90
 ./fortran/src/H5Rf.c
-./fortran/src/H5Rff.f90
-./fortran/src/H5Rff_F90.f90
-./fortran/src/H5Rff_F03.f90
+./fortran/src/H5Rff.F90
 ./fortran/src/H5Sf.c
-./fortran/src/H5Sff.f90
+./fortran/src/H5Sff.F90
 ./fortran/src/H5Tf.c
-./fortran/src/H5Tff.f90
-./fortran/src/H5Tff_F90.f90
-./fortran/src/H5Tff_F03.f90
+./fortran/src/H5Tff.F90
 ./fortran/src/H5Zf.c
-./fortran/src/H5Zff.f90
+./fortran/src/H5Zff.F90
+./fortran/src/H5config_f.inc.cmake
+./fortran/src/H5config_f.inc.in
+./fortran/src/H5fort_type_defines.h.in
 ./fortran/src/H5f90.h
-./fortran/src/H5f90global.f90
+./fortran/src/H5f90global.F90
 ./fortran/src/H5f90i.h
 ./fortran/src/H5f90kit.c
 ./fortran/src/H5f90proto.h
-./fortran/src/H5test_kind.f90
-./fortran/src/H5test_kind_SIZEOF.f90
-./fortran/src/H5test_kind_STORAGE_SIZE.f90
 ./fortran/src/H5match_types.c
-./fortran/src/HDF5.f90
-./fortran/src/HDF5mpio.f90
+./fortran/src/HDF5.F90
 ./fortran/src/Makefile.am
-./fortran/src/Makefile.in
 ./fortran/src/README
 ./fortran/src/README_DEVELOPEMENT   _DO_NOT_DISTRIBUTE_
 ./fortran/src/h5fc.in
 ./fortran/src/hdf5_fortrandll.def.in
 
+
 ./fortran/test/Makefile.am
-./fortran/test/Makefile.in
-./fortran/test/fflush1.f90
-./fortran/test/fflush2.f90
-./fortran/test/fortranlib_test.f90
-./fortran/test/fortranlib_test_1_8.f90
-./fortran/test/fortranlib_test_F03.f90
+./fortran/test/fflush1.F90
+./fortran/test/fflush2.F90
+./fortran/test/fortranlib_test.F90
+./fortran/test/fortranlib_test_1_8.F90
+./fortran/test/fortranlib_test_F03.F90
 ./fortran/test/t.c
 ./fortran/test/t.h
-./fortran/test/tf.f90
-./fortran/test/tf_F90.f90
-./fortran/test/tf_F03.f90
-./fortran/test/tf_F08.f90
-./fortran/test/tH5A.f90
-./fortran/test/tH5A_1_8.f90
-./fortran/test/tH5D.f90
-./fortran/test/tH5E_F03.f90
-./fortran/test/tH5E.f90
-./fortran/test/tH5F.f90
-./fortran/test/tH5F_F03.f90
-./fortran/test/tH5G.f90
-./fortran/test/tH5G_1_8.f90
-./fortran/test/tH5I.f90
-./fortran/test/tH5L_F03.f90
-./fortran/test/tH5MISC_1_8.f90
-./fortran/test/tH5O.f90
-./fortran/test/tH5O_F03.f90
-./fortran/test/tH5P_F03.f90
-./fortran/test/tH5P.f90
-./fortran/test/tH5R.f90
-./fortran/test/tH5S.f90
-./fortran/test/tH5Sselect.f90
-./fortran/test/tH5T_F03.f90
-./fortran/test/tH5T.f90
-./fortran/test/tH5VL.f90
-./fortran/test/tH5Z.f90
-./fortran/test/tHDF5_1_8.f90
-./fortran/test/tHDF5_F03.f90
-./fortran/test/tHDF5.f90
+./fortran/test/tf.F90
+./fortran/test/tH5A.F90
+./fortran/test/tH5A_1_8.F90
+./fortran/test/tH5D.F90
+./fortran/test/tH5E_F03.F90
+./fortran/test/tH5E.F90
+./fortran/test/tH5F.F90
+./fortran/test/tH5F_F03.F90
+./fortran/test/tH5G.F90
+./fortran/test/tH5G_1_8.F90
+./fortran/test/tH5I.F90
+./fortran/test/tH5L_F03.F90
+./fortran/test/tH5MISC_1_8.F90
+./fortran/test/tH5O.F90
+./fortran/test/tH5O_F03.F90
+./fortran/test/tH5P_F03.F90
+./fortran/test/tH5P.F90
+./fortran/test/tH5R.F90
+./fortran/test/tH5S.F90
+./fortran/test/tH5Sselect.F90
+./fortran/test/tH5T_F03.F90
+./fortran/test/tH5T.F90
+./fortran/test/tH5VL.F90
+./fortran/test/tH5Z.F90
+./fortran/test/tHDF5_1_8.F90
+./fortran/test/tHDF5_F03.F90
+./fortran/test/tHDF5.F90
+./fortran/test/H5_test_buildiface.F90
 
 ./fortran/testpar/Makefile.am
-./fortran/testpar/Makefile.in
 ./fortran/testpar/ptest.f90
 ./fortran/testpar/hyper.f90
 ./fortran/testpar/mdset.f90
@@ -322,7 +280,6 @@
 
 ./c++/COPYING
 ./c++/Makefile.am
-./c++/Makefile.in
 
 ./c++/examples/chunks.cpp
 ./c++/examples/compound.cpp
@@ -343,7 +300,6 @@
 ./c++/examples/testh5c++.sh.in
 ./c++/examples/writedata.cpp
 ./c++/examples/Makefile.am
-./c++/examples/Makefile.in
 ./c++/examples/run-c++-ex.sh.in
 
 ./c++/src/H5AbstractDs.cpp
@@ -408,11 +364,10 @@
 ./c++/src/H5VarLenType.cpp
 ./c++/src/H5VarLenType.h
 ./c++/src/Makefile.am
-./c++/src/Makefile.in
 ./c++/src/RM_stylesheet.css
 ./c++/src/cpp_doc_config
-./c++/src/footer.html
 ./c++/src/h5c++.in
+./c++/src/footer.html
 ./c++/src/header.html
 ./c++/src/header_files/filelist.xml
 ./c++/src/header_files/hdf_logo.jpg
@@ -422,7 +377,6 @@
 
 ./c++/test/H5srcdir_str.h.in
 ./c++/test/Makefile.am
-./c++/test/Makefile.in
 ./c++/test/dsets.cpp
 ./c++/test/h5cpputil.cpp
 ./c++/test/h5cpputil.h
@@ -448,7 +402,7 @@
 
 ./release_docs/COPYING
 ./release_docs/HISTORY-1_0-1_8_0_rc3.txt
-./release_docs/HISTORY-1_8.txt
+./release_docs/HISTORY-1_9.txt
 ./release_docs/INSTALL
 ./release_docs/INSTALL_CMake.txt
 ./release_docs/INSTALL_Cygwin.txt
@@ -468,34 +422,36 @@
 ./src/H5dbg.c
 ./src/H5api_adpt.h
 ./src/H5err.txt
-./src/H5config.h.in
 ./src/H5detect.c
 ./src/H5make_libsettings.c
 ./src/H5overflow.txt
-./src/H5overflow.h
 ./src/H5private.h
 ./src/H5public.h
 ./src/H5system.c
 ./src/H5timer.c
 ./src/H5trace.c
 ./src/H5vers.txt
-./src/H5version.h
 ./src/H5A.c
 ./src/H5Abtree2.c
 ./src/H5Adense.c
 ./src/H5Adeprec.c
 ./src/H5Aint.c
+./src/H5Amodule.h
 ./src/H5Atest.c
 ./src/H5Apkg.h
 ./src/H5Aprivate.h
 ./src/H5Apublic.h
 ./src/H5AC.c
+./src/H5AClog.c
+./src/H5ACmodule.h
+./src/H5ACmpio.c
 ./src/H5ACpkg.h
 ./src/H5ACprivate.h
 ./src/H5ACpublic.h
 ./src/H5B.c
 ./src/H5Bcache.c
 ./src/H5Bdbg.c
+./src/H5Bmodule.h
 ./src/H5Bpkg.h
 ./src/H5Bprivate.h
 ./src/H5Bpublic.h
@@ -504,12 +460,15 @@
 ./src/H5B2dbg.c
 ./src/H5B2hdr.c
 ./src/H5B2int.c
+./src/H5B2module.h
 ./src/H5B2pkg.h
 ./src/H5B2private.h
 ./src/H5B2public.h
 ./src/H5B2stat.c
 ./src/H5B2test.c
 ./src/H5C.c
+./src/H5Cmodule.h
+./src/H5Cmpio.c
 ./src/H5Cpkg.h
 ./src/H5Cprivate.h
 ./src/H5Cpublic.h
@@ -517,42 +476,62 @@
 ./src/H5CSprivate.h
 ./src/H5D.c
 ./src/H5Dbtree.c
+./src/H5Dbtree2.c
 ./src/H5Dchunk.c
 ./src/H5Dcompact.c
 ./src/H5Dcontig.c
 ./src/H5Ddbg.c
 ./src/H5Ddeprec.c
+./src/H5Dearray.c
 ./src/H5Defl.c
+./src/H5Dfarray.c
 ./src/H5Dfill.c
 ./src/H5Dint.c
 ./src/H5Dio.c
 ./src/H5Dlayout.c
+./src/H5Dmodule.h
 ./src/H5Dmpio.c
+./src/H5Dnone.c
 ./src/H5Doh.c
 ./src/H5Dpkg.h
 ./src/H5Dprivate.h
 ./src/H5Dpublic.h
 ./src/H5Dscatgath.c
 ./src/H5Dselect.c
+./src/H5Dsingle.c
 ./src/H5Dtest.c
+./src/H5Dvirtual.c
 ./src/H5E.c
-./src/H5Edefin.h
 ./src/H5Edeprec.c
-./src/H5Einit.h
 ./src/H5Eint.c
+./src/H5Emodule.h
 ./src/H5Epkg.h
 ./src/H5Eprivate.h
-./src/H5Epubgen.h
 ./src/H5Epublic.h
-./src/H5Eterm.h
+./src/H5EA.c
+./src/H5EAcache.c
+./src/H5EAdbg.c
+./src/H5EAdblkpage.c
+./src/H5EAdblock.c
+./src/H5EAhdr.c
+./src/H5EAiblock.c
+./src/H5EAint.c
+./src/H5EAmodule.h
+./src/H5EApkg.h
+./src/H5EAprivate.h
+./src/H5EAsblock.c
+./src/H5EAstat.c
+./src/H5EAtest.c
 ./src/H5F.c
 ./src/H5Faccum.c
 ./src/H5Fcwfs.c
 ./src/H5Fdbg.c
+./src/H5Fdeprec.c
 ./src/H5Fefc.c
 ./src/H5Ffake.c
 ./src/H5Fint.c
 ./src/H5Fio.c
+./src/H5Fmodule.h
 ./src/H5Fmount.c
 ./src/H5Fmpi.c
 ./src/H5Fquery.c
@@ -563,16 +542,30 @@
 ./src/H5Fprivate.h
 ./src/H5Fpublic.h
 ./src/H5Ftest.c
+./src/H5FA.c
+./src/H5FAcache.c
+./src/H5FAdbg.c
+./src/H5FAdblkpage.c
+./src/H5FAdblock.c
+./src/H5FAhdr.c
+./src/H5FAint.c
+./src/H5FAmodule.h
+./src/H5FApkg.h
+./src/H5FAprivate.h
+./src/H5FAstat.c
+./src/H5FAtest.c
 ./src/H5FD.c
 ./src/H5FDcore.c
 ./src/H5FDcore.h
 ./src/H5FDdirect.c
 ./src/H5FDdirect.h
+./src/H5FDdrvr_module.h
 ./src/H5FDfamily.c
 ./src/H5FDfamily.h
 ./src/H5FDint.c
 ./src/H5FDlog.c
 ./src/H5FDlog.h
+./src/H5FDmodule.h
 ./src/H5FDmpi.c
 ./src/H5FDmpi.h
 ./src/H5FDmpio.c
@@ -587,21 +580,25 @@
 ./src/H5FDspace.c
 ./src/H5FDstdio.c
 ./src/H5FDstdio.h
+./src/H5FDtest.c
 ./src/H5FDwindows.c
 ./src/H5FDwindows.h
 ./src/H5FL.c
+./src/H5FLmodule.h
 ./src/H5FLprivate.h
 ./src/H5FO.c
 ./src/H5FOprivate.h
 ./src/H5FS.c
 ./src/H5FScache.c
 ./src/H5FSdbg.c
-./src/H5FStest.c
-./src/H5FSstat.c
+./src/H5FSint.c
+./src/H5FSmodule.h
 ./src/H5FSpkg.h
 ./src/H5FSprivate.h
 ./src/H5FSpublic.h
 ./src/H5FSsection.c
+./src/H5FSstat.c
+./src/H5FStest.c
 ./src/H5G.c
 ./src/H5Gbtree2.c
 ./src/H5Gcache.c
@@ -612,6 +609,7 @@
 ./src/H5Gint.c
 ./src/H5Glink.c
 ./src/H5Gloc.c
+./src/H5Gmodule.h
 ./src/H5Gname.c
 ./src/H5Gnode.c
 ./src/H5Gobj.c
@@ -632,8 +630,10 @@
 ./src/H5HFhdr.c
 ./src/H5HFhuge.c
 ./src/H5HFiblock.c
+./src/H5HFint.c
 ./src/H5HFiter.c
 ./src/H5HFman.c
+./src/H5HFmodule.h
 ./src/H5HFpkg.h
 ./src/H5HFprivate.h
 ./src/H5HFpublic.h
@@ -645,6 +645,7 @@
 ./src/H5HG.c
 ./src/H5HGcache.c
 ./src/H5HGdbg.c
+./src/H5HGmodule.h
 ./src/H5HGpkg.h
 ./src/H5HGprivate.h
 ./src/H5HGpublic.h
@@ -652,25 +653,31 @@
 ./src/H5HL.c
 ./src/H5HLcache.c
 ./src/H5HLdbg.c
+./src/H5HLdblk.c
 ./src/H5HLint.c
+./src/H5HLmodule.h
 ./src/H5HLpkg.h
+./src/H5HLprfx.c
 ./src/H5HLprivate.h
 ./src/H5HLpublic.h
 ./src/H5HP.c
 ./src/H5HPprivate.h
 ./src/H5I.c
+./src/H5Imodule.h
 ./src/H5Ipkg.h
 ./src/H5Iprivate.h
 ./src/H5Ipublic.h
 ./src/H5Itest.c
 ./src/H5L.c
 ./src/H5Lexternal.c
+./src/H5Lmodule.h
 ./src/H5Lpkg.h
 ./src/H5Lprivate.h
 ./src/H5Lpublic.h
 ./src/H5MF.c
 ./src/H5MFaggr.c
 ./src/H5MFdbg.c
+./src/H5MFmodule.h
 ./src/H5MFsection.c
 ./src/H5MFpkg.h
 ./src/H5MFprivate.h
@@ -678,6 +685,7 @@
 ./src/H5MMprivate.h
 ./src/H5MMpublic.h
 ./src/H5MP.c
+./src/H5MPmodule.h
 ./src/H5MPpkg.h
 ./src/H5MPprivate.h
 ./src/H5MPtest.c
@@ -697,17 +705,21 @@
 ./src/H5Odtype.c
 ./src/H5Oefl.c
 ./src/H5Ofill.c
+./src/H5Oflush.c
+./src/H5Ofsinfo.c
 ./src/H5Oginfo.c
 ./src/H5Olayout.c
 ./src/H5Olinfo.c
 ./src/H5Olink.c
 ./src/H5Omessage.c
+./src/H5Omodule.h
 ./src/H5Omtime.c
 ./src/H5Oname.c
 ./src/H5Onull.c
 ./src/H5Opkg.h
 ./src/H5Opline.c
 ./src/H5Oprivate.h
+./src/H5Oproxy.c
 ./src/H5Opublic.h
 ./src/H5Orefcount.c
 ./src/H5Osdspace.c
@@ -723,6 +735,7 @@
 ./src/H5Pdcpl.c
 ./src/H5Pdeprec.c
 ./src/H5Pdxpl.c
+./src/H5Pencdec.c
 ./src/H5Pfapl.c
 ./src/H5Pfcpl.c
 ./src/H5Pfmpl.c
@@ -730,6 +743,7 @@
 ./src/H5Pint.c
 ./src/H5Plapl.c
 ./src/H5Plcpl.c
+./src/H5Pmodule.h
 ./src/H5Pocpl.c
 ./src/H5Pocpypl.c
 ./src/H5Ppkg.h
@@ -738,22 +752,25 @@
 ./src/H5Pstrcpl.c
 ./src/H5Ptest.c
 ./src/H5PL.c
+./src/H5PLmodule.h
 ./src/H5PLprivate.h
 ./src/H5PLpublic.h
 ./src/H5PLextern.h
 ./src/H5R.c
 ./src/H5Rdeprec.c
+./src/H5Rmodule.h
 ./src/H5Rpkg.h
 ./src/H5Rprivate.h
 ./src/H5Rpublic.h
-./src/H5RC.c
-./src/H5RCprivate.h
+./src/H5UC.c
+./src/H5UCprivate.h
 ./src/H5RS.c
 ./src/H5RSprivate.h
 ./src/H5S.c
 ./src/H5Sall.c
 ./src/H5Sdbg.c
 ./src/H5Shyper.c
+./src/H5Smodule.h
 ./src/H5Smpio.c
 ./src/H5Snone.c
 ./src/H5Spkg.h
@@ -763,11 +780,13 @@
 ./src/H5Sselect.c
 ./src/H5Stest.c
 ./src/H5SL.c
+./src/H5SLmodule.h
 ./src/H5SLprivate.h
 ./src/H5SM.c
 ./src/H5SMbtree2.c
 ./src/H5SMcache.c
 ./src/H5SMmessage.c
+./src/H5SMmodule.h
 ./src/H5SMpkg.h
 ./src/H5SMprivate.h
 ./src/H5SMtest.c
@@ -786,6 +805,7 @@
 ./src/H5Tfields.c
 ./src/H5Tfixed.c
 ./src/H5Tfloat.c
+./src/H5Tmodule.h
 ./src/H5Tnative.c
 ./src/H5Toffset.c
 ./src/H5Topaque.c
@@ -808,6 +828,7 @@
 ./src/H5Z.c
 ./src/H5Zdeflate.c
 ./src/H5Zfletcher32.c
+./src/H5Zmodule.h
 ./src/H5Znbit.c
 ./src/H5Zpkg.h
 ./src/H5Zprivate.h
@@ -817,30 +838,41 @@
 ./src/H5Zszip.c
 ./src/H5Ztrans.c
 ./src/Makefile.am
-./src/Makefile.in
 ./src/hdf5.h
 ./src/libhdf5.settings.in
 ./src/H5win32defs.h
 
+./test/AtomicWriterReader.txt
 ./test/COPYING
 ./test/H5srcdir.h
 ./test/H5srcdir_str.h.in
 ./test/Makefile.am
-./test/Makefile.in
+./test/POSIX_Order_Write_Test_Report.docx
+./test/POSIX_Order_Write_Test_Report.pdf
+./test/SWMR_POSIX_Order_UG.txt
+./test/SWMR_UseCase_UG.txt
 ./test/accum.c
+./test/accum_swmr_reader.c
 ./test/app_ref.c
+./test/atomic_reader.c
+./test/atomic_writer.c
 ./test/bad_compound.h5
 ./test/be_data.h5
 ./test/be_extlink1.h5
 ./test/be_extlink2.h5
 ./test/big.c
 ./test/bittests.c
+./test/btree_idx_1_6.h5
+./test/btree_idx_1_8.h5
 ./test/btree2.c
 ./test/cache.c
 ./test/cache_api.c
 ./test/cache_common.c
 ./test/cache_common.h
+./test/cache_logging.c
+./test/cache_tagging.c
 ./test/cmpd_dset.c
+./test/cork.c
 ./test/corrupt_stab_msg.h5
 ./test/cross_read.c
 ./test/dangle.c
@@ -852,7 +884,10 @@
 ./test/dynlib1.c
 ./test/dynlib2.c
 ./test/dynlib3.c
+./test/earray.c
 ./test/efc.c
+./test/enc_dec_plist.c
+./test/enc_dec_plist_cross_platform.c
 ./test/enum.c
 ./test/extend.c
 ./test/external.c
@@ -864,22 +899,26 @@
 ./test/family_v16_00001.h5
 ./test/family_v16_00002.h5
 ./test/family_v16_00003.h5
+./test/farray.c
 ./test/fheap.c
+./test/filespace_1_8.h5
+./test/filespace_1_6.h5
 ./test/freespace.c
 ./test/file_image.c
 ./test/file_image_core_test.h5
 ./test/fill_old.h5
 ./test/fillval.c
 ./test/filter_fail.c
-./test/fixed_idx.h5
 ./test/flush1.c
 ./test/flush2.c
+./test/flushrefresh.c
 ./test/gen_bad_ohdr.c
 ./test/gen_bad_compound.c
 ./test/gen_bogus.c
 ./test/gen_cross.c
 ./test/gen_deflate.c
 ./test/gen_file_image.c
+./test/gen_filespace.c
 ./test/gen_idx.c
 ./test/gen_mergemsg.c
 ./test/gen_new_array.c
@@ -893,7 +932,9 @@
 ./test/gen_old_group.c
 ./test/gen_old_layout.c
 ./test/gen_old_mtime.c
+./test/gen_plist.c
 ./test/gen_sizes_lheap.c
+./test/gen_specmetaread.c
 ./test/gen_udlinks.c
 ./test/getname.c
 ./test/gheap.c
@@ -926,6 +967,19 @@
 # ====end distribute this for now. See HDFFV-8236====
 ./test/specmetaread.h5
 ./test/stab.c
+./test/swmr.c
+./test/swmr_addrem_writer.c
+./test/swmr_check_compat_vfd.c
+./test/swmr_common.c
+./test/swmr_common.h
+./test/swmr_generator.c
+./test/swmr_reader.c
+./test/swmr_remove_reader.c
+./test/swmr_remove_writer.c
+./test/swmr_sparse_reader.c
+./test/swmr_sparse_writer.c
+./test/swmr_start_write.c
+./test/swmr_writer.c
 ./test/tarray.c
 ./test/tarrold.h5
 ./test/tattr.c
@@ -938,12 +992,16 @@
 ./test/testcheck_version.sh.in
 ./test/testerror.sh.in
 ./test/testlinks_env.sh.in
+./test/testflushrefresh.sh.in
 ./test/testframe.c
 ./test/testhdf5.c
 ./test/testhdf5.h
 ./test/testlibinfo.sh.in
 ./test/test_plugin.sh.in
+./test/test_usecases.sh.in
 ./test/testmeta.c
+./test/testswmr.sh.in
+./test/testvdsswmr.sh.in
 ./test/tfile.c
 ./test/tgenprop.c
 ./test/th5o.c
@@ -974,34 +1032,142 @@
 ./test/tunicode.c
 ./test/tvlstr.c
 ./test/tvltypes.c
+./test/twriteorder.c
 ./test/unlink.c
 ./test/unregister.c
+./test/use_append_chunk.c
+./test/use_append_mchunks.c
+./test/use_common.c
+./test/use_disable_mdc_flushes.c
+./test/use.h
 ./test/vfd.c
 ./test/test_filters_le.h5
 ./test/test_filters_be.h5
 ./test/gen_filters.c
+./test/chunk_info.c
+./test/vds.c
+./test/vds_swmr.h
+./test/vds_swmr_gen.c
+./test/vds_swmr_reader.c
+./test/vds_swmr_writer.c
 
 ./test/testfiles/err_compat_1
 ./test/testfiles/err_compat_2
 ./test/testfiles/error_test_1
 ./test/testfiles/error_test_2
 ./test/testfiles/links_env.out
+./test/testfiles/plist_files/acpl_32be
+./test/testfiles/plist_files/acpl_32le
+./test/testfiles/plist_files/acpl_64be
+./test/testfiles/plist_files/acpl_64le
+./test/testfiles/plist_files/dapl_32be
+./test/testfiles/plist_files/dapl_32le
+./test/testfiles/plist_files/dapl_64be
+./test/testfiles/plist_files/dapl_64le
+./test/testfiles/plist_files/dcpl_32be
+./test/testfiles/plist_files/dcpl_32le
+./test/testfiles/plist_files/dcpl_64be
+./test/testfiles/plist_files/dcpl_64le
+./test/testfiles/plist_files/def_acpl_32be
+./test/testfiles/plist_files/def_acpl_32le
+./test/testfiles/plist_files/def_acpl_64be
+./test/testfiles/plist_files/def_acpl_64le
+./test/testfiles/plist_files/def_dapl_32be
+./test/testfiles/plist_files/def_dapl_32le
+./test/testfiles/plist_files/def_dapl_64be
+./test/testfiles/plist_files/def_dapl_64le
+./test/testfiles/plist_files/def_dcpl_32be
+./test/testfiles/plist_files/def_dcpl_32le
+./test/testfiles/plist_files/def_dcpl_64be
+./test/testfiles/plist_files/def_dcpl_64le
+./test/testfiles/plist_files/def_dxpl_32be
+./test/testfiles/plist_files/def_dxpl_32le
+./test/testfiles/plist_files/def_dxpl_64be
+./test/testfiles/plist_files/def_dxpl_64le
+./test/testfiles/plist_files/def_fapl_32be
+./test/testfiles/plist_files/def_fapl_32le
+./test/testfiles/plist_files/def_fapl_64be
+./test/testfiles/plist_files/def_fapl_64le
+./test/testfiles/plist_files/def_fcpl_32be
+./test/testfiles/plist_files/def_fcpl_32le
+./test/testfiles/plist_files/def_fcpl_64be
+./test/testfiles/plist_files/def_fcpl_64le
+./test/testfiles/plist_files/def_gcpl_32be
+./test/testfiles/plist_files/def_gcpl_32le
+./test/testfiles/plist_files/def_gcpl_64be
+./test/testfiles/plist_files/def_gcpl_64le
+./test/testfiles/plist_files/def_lapl_32be
+./test/testfiles/plist_files/def_lapl_32le
+./test/testfiles/plist_files/def_lapl_64be
+./test/testfiles/plist_files/def_lapl_64le
+./test/testfiles/plist_files/def_lcpl_32be
+./test/testfiles/plist_files/def_lcpl_32le
+./test/testfiles/plist_files/def_lcpl_64be
+./test/testfiles/plist_files/def_lcpl_64le
+./test/testfiles/plist_files/def_ocpl_32be
+./test/testfiles/plist_files/def_ocpl_32le
+./test/testfiles/plist_files/def_ocpl_64be
+./test/testfiles/plist_files/def_ocpl_64le
+./test/testfiles/plist_files/def_ocpypl_32be
+./test/testfiles/plist_files/def_ocpypl_32le
+./test/testfiles/plist_files/def_ocpypl_64be
+./test/testfiles/plist_files/def_ocpypl_64le
+./test/testfiles/plist_files/def_strcpl_32be
+./test/testfiles/plist_files/def_strcpl_32le
+./test/testfiles/plist_files/def_strcpl_64be
+./test/testfiles/plist_files/def_strcpl_64le
+./test/testfiles/plist_files/dxpl_32be
+./test/testfiles/plist_files/dxpl_32le
+./test/testfiles/plist_files/dxpl_64be
+./test/testfiles/plist_files/dxpl_64le
+./test/testfiles/plist_files/fapl_32be
+./test/testfiles/plist_files/fapl_32le
+./test/testfiles/plist_files/fapl_64be
+./test/testfiles/plist_files/fapl_64le
+./test/testfiles/plist_files/fcpl_32be
+./test/testfiles/plist_files/fcpl_32le
+./test/testfiles/plist_files/fcpl_64be
+./test/testfiles/plist_files/fcpl_64le
+./test/testfiles/plist_files/gcpl_32be
+./test/testfiles/plist_files/gcpl_32le
+./test/testfiles/plist_files/gcpl_64be
+./test/testfiles/plist_files/gcpl_64le
+./test/testfiles/plist_files/lapl_32be
+./test/testfiles/plist_files/lapl_32le
+./test/testfiles/plist_files/lapl_64be
+./test/testfiles/plist_files/lapl_64le
+./test/testfiles/plist_files/lcpl_32be
+./test/testfiles/plist_files/lcpl_32le
+./test/testfiles/plist_files/lcpl_64be
+./test/testfiles/plist_files/lcpl_64le
+./test/testfiles/plist_files/ocpl_32be
+./test/testfiles/plist_files/ocpl_32le
+./test/testfiles/plist_files/ocpl_64be
+./test/testfiles/plist_files/ocpl_64le
+./test/testfiles/plist_files/ocpypl_32be
+./test/testfiles/plist_files/ocpypl_32le
+./test/testfiles/plist_files/ocpypl_64be
+./test/testfiles/plist_files/ocpypl_64le
+./test/testfiles/plist_files/strcpl_32be
+./test/testfiles/plist_files/strcpl_32le
+./test/testfiles/plist_files/strcpl_64be
+./test/testfiles/plist_files/strcpl_64le
 
 ./testpar/COPYING
 ./testpar/Makefile.am
-./testpar/Makefile.in
 ./testpar/t_cache.c
+./testpar/t_chunk_alloc.c
+./testpar/t_coll_chunk.c
 ./testpar/t_dset.c
 ./testpar/t_file.c
 ./testpar/t_file_image.c
+./testpar/t_filter_read.c
 ./testpar/t_mdset.c
 ./testpar/t_mpi.c
 ./testpar/t_ph5basic.c
 ./testpar/t_pflush1.c
 ./testpar/t_pflush2.c
-./testpar/t_chunk_alloc.c
-./testpar/t_coll_chunk.c
-./testpar/t_filter_read.c
+./testpar/t_prop.c
 ./testpar/t_shapesame.c
 ./testpar/t_pshutdown.c
 ./testpar/t_prestart.c
@@ -1013,10 +1179,8 @@
 
 ./tools/COPYING
 ./tools/Makefile.am
-./tools/Makefile.in
 
 ./tools/h5dump/Makefile.am
-./tools/h5dump/Makefile.in
 ./tools/h5dump/h5dump.c
 ./tools/h5dump/h5dump.h
 ./tools/h5dump/h5dump_defines.h
@@ -1029,11 +1193,10 @@
 ./tools/h5dump/testh5dump.sh.in
 ./tools/h5dump/testh5dumppbits.sh.in
 ./tools/h5dump/testh5dumpxml.sh.in
+./tools/h5dump/testh5dumpvds.sh.in
 ./tools/h5dump/binread.c
 
-
 ./tools/h5import/Makefile.am
-./tools/h5import/Makefile.in
 ./tools/h5import/h5import.h
 ./tools/h5import/h5import.c
 ./tools/h5import/h5importtest.c
@@ -1092,7 +1255,6 @@
 
 # h5diff sources
 ./tools/h5diff/Makefile.am
-./tools/h5diff/Makefile.in
 ./tools/h5diff/h5diff_common.c
 ./tools/h5diff/h5diff_common.h
 ./tools/h5diff/h5diff_main.c
@@ -1101,9 +1263,31 @@
 ./tools/h5diff/testh5diff.sh.in
 ./tools/h5diff/testph5diff.sh.in
 
+# h5format_convert sources
+./tools/h5format_convert/Makefile.am
+./tools/h5format_convert/h5fc_chk_idx.c
+./tools/h5format_convert/h5fc_gentest.c
+./tools/h5format_convert/h5format_convert.c
+./tools/h5format_convert/testfiles/h5fc_v_n_all.ddl
+./tools/h5format_convert/testfiles/h5fc_v_bt1.ddl
+./tools/h5format_convert/testfiles/h5fc_v_non_chunked.ddl
+./tools/h5format_convert/testfiles/h5fc_d_file.ddl
+./tools/h5format_convert/testfiles/h5fc_v_ndata_bt1.ddl
+./tools/h5format_convert/testfiles/h5fc_dname.ddl
+./tools/h5format_convert/testfiles/h5fc_nonexistdset_file.ddl
+./tools/h5format_convert/testfiles/h5fc_help.ddl
+./tools/h5format_convert/testfiles/h5fc_v_all.ddl
+./tools/h5format_convert/testfiles/h5fc_nooption.ddl
+./tools/h5format_convert/testfiles/h5fc_v_n_1d.ddl
+./tools/h5format_convert/testfiles/h5fc_nonexistfile.ddl
+./tools/h5format_convert/testfiles/h5fc_non_v3.h5
+./tools/h5format_convert/testfiles/h5fc_latest_v3.h5
+./tools/h5format_convert/testfiles/h5fc_edge_v3.h5
+./tools/h5format_convert/testfiles/h5fc_v1.h5
+./tools/h5format_convert/testh5fc.sh.in
+
 # h5repack sources
 ./tools/h5repack/Makefile.am
-./tools/h5repack/Makefile.in
 ./tools/h5repack/dynlib_rpk.c
 ./tools/h5repack/h5repack.sh.in
 ./tools/h5repack/h5repack_plugin.sh.in
@@ -1120,21 +1304,20 @@
 ./tools/h5repack/testh5repack_detect_szip.c
 
 # h5ls sources
+./tools/h5ls/CMakeTestsVDS.cmake
 ./tools/h5ls/Makefile.am
-./tools/h5ls/Makefile.in
 ./tools/h5ls/h5ls.c
 ./tools/h5ls/testh5ls.sh.in
+./tools/h5ls/testh5lsvds.sh.in
 
 # h5copy sources
 ./tools/h5copy/testh5copy.sh.in
-./tools/h5copy/Makefile.in
 ./tools/h5copy/h5copy.c
 ./tools/h5copy/h5copygentest.c
 ./tools/h5copy/Makefile.am
 
 
 ./tools/lib/Makefile.am
-./tools/lib/Makefile.in
 ./tools/lib/h5diff.c
 ./tools/lib/h5diff.h
 ./tools/lib/h5diff_array.c
@@ -1161,8 +1344,11 @@
 ./tools/lib/io_timer.h
 
 ./tools/misc/Makefile.am
-./tools/misc/Makefile.in
 ./tools/misc/h5cc.in
+./tools/misc/h5clear.c
+./tools/misc/h5clear_gentest.c
+./tools/misc/clear_open_chk.c
+./tools/misc/testh5clear.sh.in
 ./tools/misc/h5debug.c
 ./tools/misc/h5mkgrp.c
 ./tools/misc/h5redeploy.in
@@ -1174,10 +1360,22 @@
 ./tools/misc/talign.c
 ./tools/misc/testfiles/h5mkgrp_help.txt
 ./tools/misc/testfiles/h5mkgrp_version.txt.in
+./tools/misc/h5perf_gentest.c
+./tools/misc/vds/Makefile.am
+./tools/misc/vds/UC_1.h
+./tools/misc/vds/UC_1_one_dim_gen.c
+./tools/misc/vds/UC_2.h
+./tools/misc/vds/UC_2_two_dims_gen.c
+./tools/misc/vds/UC_3.h
+./tools/misc/vds/UC_3_gaps_gen.c
+./tools/misc/vds/UC_4.h
+./tools/misc/vds/UC_4_printf_gen.c
+./tools/misc/vds/UC_5.h
+./tools/misc/vds/UC_5_stride_gen.c
+./tools/misc/vds/UC_common.h
 
 # h5stat sources
 ./tools/h5stat/Makefile.am
-./tools/h5stat/Makefile.in
 ./tools/h5stat/h5stat.c
 
 # h5stat test files
@@ -1200,6 +1398,8 @@
 ./tools/h5stat/testfiles/h5stat_filters.h5
 ./tools/h5stat/testfiles/h5stat_help1.ddl
 ./tools/h5stat/testfiles/h5stat_help2.ddl
+./tools/h5stat/testfiles/h5stat_idx.h5
+./tools/h5stat/testfiles/h5stat_idx.ddl
 ./tools/h5stat/testfiles/h5stat_links1.ddl
 ./tools/h5stat/testfiles/h5stat_links2.ddl
 ./tools/h5stat/testfiles/h5stat_links3.ddl
@@ -1240,6 +1440,8 @@
 ./tools/testfiles/family_file00015.h5
 ./tools/testfiles/family_file00016.h5
 ./tools/testfiles/family_file00017.h5
+./tools/testfiles/file_space.h5
+./tools/testfiles/file_space.ddl
 ./tools/testfiles/filter_fail.h5
 ./tools/testfiles/filter_fail.ddl
 ./tools/testfiles/h5dump-help.txt
@@ -1337,6 +1539,9 @@
 ./tools/testfiles/tdset-3s.ddl
 ./tools/testfiles/tdset.h5
 ./tools/testfiles/tdset2.h5
+./tools/testfiles/tdset_idx.ls
+./tools/testfiles/tdset_idx.ddl
+./tools/testfiles/tdset_idx.h5
 ./tools/testfiles/tempty.ddl
 ./tools/testfiles/tempty.h5
 ./tools/testfiles/tenum.h5
@@ -1592,6 +1797,43 @@
 ./tools/testfiles/pbits/tpbitsOverlapped.ddl
 ./tools/testfiles/packedbits.h5
 
+# h5dump vds validation
+./tools/testfiles/vds/tvds-1.ddl
+./tools/testfiles/vds/tvds-2.ddl
+./tools/testfiles/vds/tvds-3_1.ddl
+./tools/testfiles/vds/tvds-3_2.ddl
+./tools/testfiles/vds/tvds-4.ddl
+./tools/testfiles/vds/tvds-5.ddl
+./tools/testfiles/vds/tvds_layout-1.ddl
+./tools/testfiles/vds/tvds_layout-2.ddl
+./tools/testfiles/vds/tvds_layout-3_1.ddl
+./tools/testfiles/vds/tvds_layout-3_2.ddl
+./tools/testfiles/vds/tvds_layout-4.ddl
+./tools/testfiles/vds/tvds_layout-5.ddl
+./tools/testfiles/vds/1_a.h5
+./tools/testfiles/vds/1_b.h5
+./tools/testfiles/vds/1_c.h5
+./tools/testfiles/vds/1_d.h5
+./tools/testfiles/vds/1_e.h5
+./tools/testfiles/vds/1_f.h5
+./tools/testfiles/vds/1_vds.h5
+./tools/testfiles/vds/2_a.h5
+./tools/testfiles/vds/2_b.h5
+./tools/testfiles/vds/2_c.h5
+./tools/testfiles/vds/2_d.h5
+./tools/testfiles/vds/2_e.h5
+./tools/testfiles/vds/2_vds.h5
+./tools/testfiles/vds/3_1_vds.h5
+./tools/testfiles/vds/3_2_vds.h5
+./tools/testfiles/vds/4_0.h5
+./tools/testfiles/vds/4_1.h5
+./tools/testfiles/vds/4_2.h5
+./tools/testfiles/vds/4_vds.h5
+./tools/testfiles/vds/5_a.h5
+./tools/testfiles/vds/5_b.h5
+./tools/testfiles/vds/5_c.h5
+./tools/testfiles/vds/5_vds.h5
+
 # h5dump h5import validation
 ./tools/testfiles/out3.h5import
 ./tools/testfiles/tordergr.h5
@@ -1668,7 +1910,13 @@
 ./tools/testfiles/thlinks-nodangle-1.ls
 ./tools/testfiles/tudlink-1.ls
 
-
+# h5ls vds validation
+./tools/testfiles/vds/tvds-1.ls
+./tools/testfiles/vds/tvds-2.ls
+./tools/testfiles/vds/tvds-3_1.ls
+./tools/testfiles/vds/tvds-3_2.ls
+./tools/testfiles/vds/tvds-4.ls
+./tools/testfiles/vds/tvds-5.ls
 
 #additional test input and output for h5dump XML
 ./tools/testfiles/tall.h5.xml
@@ -1763,6 +2011,7 @@
 ./tools/h5diff/testfiles/h5diff_172.txt
 ./tools/h5diff/testfiles/h5diff_18.txt
 ./tools/h5diff/testfiles/h5diff_18_1.txt
+./tools/h5diff/testfiles/h5diff_19.txt
 ./tools/h5diff/testfiles/h5diff_20.txt
 ./tools/h5diff/testfiles/h5diff_21.txt
 ./tools/h5diff/testfiles/h5diff_22.txt
@@ -1894,6 +2143,7 @@
 ./tools/h5diff/testfiles/h5diff_457.txt
 ./tools/h5diff/testfiles/h5diff_458.txt
 ./tools/h5diff/testfiles/h5diff_459.txt
+./tools/h5diff/testfiles/h5diff_idx.txt
 ./tools/h5diff/testfiles/h5diff_465.txt
 ./tools/h5diff/testfiles/h5diff_466.txt
 ./tools/h5diff/testfiles/h5diff_467.txt
@@ -1942,6 +2192,8 @@
 ./tools/h5diff/testfiles/h5diff_basic2.h5
 ./tools/h5diff/testfiles/h5diff_dset1.h5
 ./tools/h5diff/testfiles/h5diff_dset2.h5
+./tools/h5diff/testfiles/h5diff_dset_idx1.h5
+./tools/h5diff/testfiles/h5diff_dset_idx2.h5
 ./tools/h5diff/testfiles/h5diff_dtypes.h5
 ./tools/h5diff/testfiles/h5diff_empty.h5
 ./tools/h5diff/testfiles/h5diff_hyper1.h5
@@ -1982,6 +2234,10 @@
 ./tools/h5diff/testfiles/tmptest.he5
 ./tools/h5diff/testfiles/h5diff_tmp2.txt
 ./tools/h5diff/testfiles/tmpSingleSiteBethe.output.h5
+#vds
+./tools/h5diff/testfiles/h5diff_v1.txt
+./tools/h5diff/testfiles/h5diff_v2.txt
+./tools/h5diff/testfiles/h5diff_v3.txt
 
 #test files for h5repack
 ./tools/h5repack/testfiles/README
@@ -2024,7 +2280,6 @@
 ./tools/h5jam/h5jam.c
 ./tools/h5jam/h5unjam.c
 ./tools/h5jam/Makefile.am
-./tools/h5jam/Makefile.in
 ./tools/h5jam/h5jamgentest.c
 ./tools/h5jam/testh5jam.sh.in
 ./tools/h5jam/tellub.c
@@ -2051,6 +2306,8 @@
 ./tools/h5copy/testfiles/h5copy_extlinks_trg.h5
 ./tools/h5copy/testfiles/h5copy_extlinks_src.out.ls
 ./tools/h5copy/testfiles/h5copy_misc1.out
+./tools/h5copy/testfiles/h5copytst_new.h5
+./tools/h5copy/testfiles/h5copytst_new.out.ls
 
 # test files for h5mkgrp
 ./tools/testfiles/h5mkgrp_nested_p.ls
@@ -2068,7 +2325,6 @@
 
 ./tools/perform/COPYING
 ./tools/perform/Makefile.am
-./tools/perform/Makefile.in
 ./tools/perform/build_h5perf_alone.sh
 ./tools/perform/build_h5perf_serial_alone.sh
 ./tools/perform/chunk.c
@@ -2089,13 +2345,10 @@
 ./tools/perform/sio_standalone.h
 ./tools/perform/zip_perf.c
 
-
 # high level libraries
 ./hl/COPYING
 ./hl/Makefile.am
-./hl/Makefile.in
 ./hl/examples/Makefile.am
-./hl/examples/Makefile.in
 ./hl/examples/ex_ds1.c
 ./hl/examples/ex_lite1.c
 ./hl/examples/ex_lite2.c
@@ -2122,7 +2375,6 @@
 ./hl/examples/run-hlc-ex.sh.in
 ./hl/src/COPYING
 ./hl/src/Makefile.am
-./hl/src/Makefile.in
 ./hl/src/H5DO.c
 ./hl/src/H5DOpublic.h
 ./hl/src/H5DS.c
@@ -2132,12 +2384,15 @@
 ./hl/src/H5IM.c
 ./hl/src/H5IMprivate.h
 ./hl/src/H5IMpublic.h
+./hl/src/H5LD.c
+./hl/src/H5LDprivate.h
+./hl/src/H5LDpublic.h
 ./hl/src/H5LT.c
-./hl/src/H5LTanalyze.l
 ./hl/src/H5LTanalyze.c
-./hl/src/H5LTparse.y
+./hl/src/H5LTanalyze.l
 ./hl/src/H5LTparse.c
 ./hl/src/H5LTparse.h
+./hl/src/H5LTparse.y
 ./hl/src/H5LTprivate.h
 ./hl/src/H5LTpublic.h
 ./hl/src/H5PT.c
@@ -2148,43 +2403,44 @@
 ./hl/src/H5TBpublic.h
 ./hl/src/hdf5_hl.h
 ./hl/test/COPYING
-./hl/test/H5srcdir_str.h.in
-./hl/test/Makefile.am
-./hl/test/Makefile.in
+./hl/test/dectris_hl_perf.c
 ./hl/test/dsdata.txt
 ./hl/test/dslat.txt
 ./hl/test/dslon.txt
-./hl/test/dtype_file.txt
 ./hl/test/dtype_file_readable.txt
+./hl/test/dtype_file.txt
 ./hl/test/earth.pal
+./hl/test/gen_test_ds.c
+./hl/test/gen_test_ld.c
 ./hl/test/h5hltest.h
-./hl/test/image8.txt
+./hl/test/H5srcdir_str.h.in
 ./hl/test/image24pixel.txt
 ./hl/test/image24plane.txt
+./hl/test/image8.txt
+./hl/test/Makefile.am
 ./hl/test/pal_rgb.h
 ./hl/test/sepia.pal
-./hl/test/dectris_hl_perf.c
-./hl/test/gen_test_ds.c
+./hl/test/test_ds_be.h5
 ./hl/test/test_ds.c
+./hl/test/test_dset_append.c
 ./hl/test/test_dset_opt.c
+./hl/test/test_ds_le.h5
 ./hl/test/test_file_image.c
 ./hl/test/test_image.c
+./hl/test/test_ld.c
+./hl/test/test_ld.h5
 ./hl/test/test_lite.c
 ./hl/test/test_packet.c
-./hl/test/test_table.c
-./hl/test/test_ds_le.h5
-./hl/test/test_ds_be.h5
-./hl/test/test_table_le.h5
 ./hl/test/test_table_be.h5
+./hl/test/test_table.c
 ./hl/test/test_table_cray.h5
+./hl/test/test_table_le.h5
 ./hl/test/usa.wri
 
 # tools
 ./hl/tools/COPYING
 ./hl/tools/Makefile.am
-./hl/tools/Makefile.in
 ./hl/tools/gif2h5/Makefile.am
-./hl/tools/gif2h5/Makefile.in
 ./hl/tools/gif2h5/decompress.c
 ./hl/tools/gif2h5/gif.h
 ./hl/tools/gif2h5/gif2hdf.c
@@ -2195,56 +2451,94 @@
 ./hl/tools/gif2h5/writehdf.c
 ./hl/tools/gif2h5/h52gifgentst.c
 ./hl/tools/gif2h5/h52giftest.sh.in
-./hl/tools/gif2h5/testfiles/REAMDE
+./hl/tools/gif2h5/testfiles/README
 ./hl/tools/gif2h5/testfiles/ex_image2.h5
 ./hl/tools/gif2h5/testfiles/image1.gif
 ./hl/tools/gif2h5/testfiles/h52giftst.h5
+#
+./hl/tools/h5watch/Makefile.am
+./hl/tools/h5watch/extend_dset.c
+./hl/tools/h5watch/h5watch.c
+./hl/tools/h5watch/h5watchgentest.c
+./hl/tools/h5watch/swmr_check_compat_vfd.c
+./hl/tools/h5watch/testh5watch.sh.in
+
+# expected test output from testing h5watch
+#
+./hl/tools/testfiles/w-err-cmpd1.ddl
+./hl/tools/testfiles/w-err-cmpd2.ddl
+./hl/tools/testfiles/w-err-cmpd3.ddl
+./hl/tools/testfiles/w-err-cmpd4.ddl
+./hl/tools/testfiles/w-err-cmpd5.ddl
+./hl/tools/testfiles/w-err-dset1.ddl
+./hl/tools/testfiles/w-err-dset2.ddl
+./hl/tools/testfiles/w-err-dset-nomax.ddl
+./hl/tools/testfiles/w-err-dset-none.ddl
+./hl/tools/testfiles/w-err-file.ddl
+./hl/tools/testfiles/w-err-poll0.ddl
+./hl/tools/testfiles/w-err-poll.ddl
+./hl/tools/testfiles/w-err-width.ddl
+./hl/tools/testfiles/w-ext-cmpd.ddl
+./hl/tools/testfiles/w-ext-cmpd-esc.ddl
+./hl/tools/testfiles/w-ext-cmpd-esc-f1.ddl
+./hl/tools/testfiles/w-ext-cmpd-esc-f3.ddl
+./hl/tools/testfiles/w-ext-cmpd-esc-ff2.ddl
+./hl/tools/testfiles/w-ext-cmpd-f1.ddl
+./hl/tools/testfiles/w-ext-cmpd-f2.ddl
+./hl/tools/testfiles/w-ext-cmpd-ff3.ddl
+./hl/tools/testfiles/w-ext-cmpd-label.ddl
+./hl/tools/testfiles/w-ext-cmpd-two.ddl
+./hl/tools/testfiles/w-ext-cmpd-two-f1.ddl
+./hl/tools/testfiles/w-ext-cmpd-two-f3.ddl
+./hl/tools/testfiles/w-ext-cmpd-two-ff2.ddl
+./hl/tools/testfiles/w-ext-early.ddl
+./hl/tools/testfiles/w-ext-late.ddl
+./hl/tools/testfiles/w-ext-one-d.ddl
+./hl/tools/testfiles/w-ext-one.ddl
+./hl/tools/testfiles/w-ext-one-simple.ddl
+./hl/tools/testfiles/w-ext-two-d.ddl
+./hl/tools/testfiles/w-ext-two.ddl
+./hl/tools/testfiles/w-ext-two-width.ddl
+./hl/tools/testfiles/w-help1.ddl
 
+#
 # hl fortran
 ./hl/fortran/COPYING
 ./hl/fortran/Makefile.am
-./hl/fortran/Makefile.in
 ./hl/fortran/examples/Makefile.am
-./hl/fortran/examples/Makefile.in
-./hl/fortran/examples/ex_ds1.f90
-./hl/fortran/examples/exlite.f90
 ./hl/fortran/examples/run-hlfortran-ex.sh.in
+./hl/fortran/src/hdf5_hl_fortrandll.def.in
 ./hl/fortran/src/H5DSfc.c
-./hl/fortran/src/H5DSff.f90
+./hl/fortran/src/H5DSff.F90
+./hl/fortran/src/H5HL_buildiface.F90
 ./hl/fortran/src/H5IMcc.c
 ./hl/fortran/src/H5IMcc.h
 ./hl/fortran/src/H5IMfc.c
-./hl/fortran/src/H5IMff.f90
+./hl/fortran/src/H5IMff.F90
 ./hl/fortran/src/H5LTf90proto.h
 ./hl/fortran/src/H5LTfc.c
-./hl/fortran/src/H5LTff.f90
+./hl/fortran/src/H5LTff.F90
 ./hl/fortran/src/H5TBfc.c
-./hl/fortran/src/H5TBff.f90
+./hl/fortran/src/H5TBff.F90
 ./hl/fortran/src/Makefile.am
-./hl/fortran/src/Makefile.in
 ./hl/fortran/test/Makefile.am
-./hl/fortran/test/Makefile.in
-./hl/fortran/test/tstds.f90
-./hl/fortran/test/tstimage.f90
-./hl/fortran/test/tstlite.f90
-./hl/fortran/test/tsttable.f90
+./hl/fortran/test/tstds.F90
+./hl/fortran/test/tstimage.F90
+./hl/fortran/test/tstlite.F90
+./hl/fortran/test/tsttable.F90
 
 # hl c++
 ./hl/c++/COPYING
 ./hl/c++/Makefile.am
-./hl/c++/Makefile.in
 ./hl/c++/examples/Makefile.am
-./hl/c++/examples/Makefile.in
 ./hl/c++/examples/ptExampleFL.cpp
 ./hl/c++/examples/run-hlc++-ex.sh.in
 ./hl/c++/src/H5PacketTable.h
 ./hl/c++/src/H5PacketTable.cpp
 ./hl/c++/src/Makefile.am
-./hl/c++/src/Makefile.in
 ./hl/c++/test/ptableTest.h
 ./hl/c++/test/ptableTest.cpp
 ./hl/c++/test/Makefile.am
-./hl/c++/test/Makefile.in
 
 # CMake-specific Files
 ./config/cmake/cacheinit.cmake
@@ -2258,7 +2552,9 @@
 ./config/cmake/hdf5-config.cmake.in
 ./config/cmake/hdf5-config-version.cmake.in
 ./config/cmake/HDFCompilerFlags.cmake
+./config/cmake/HDF5_Process_Flex_Files.cmake
 ./config/cmake/HDF5Macros.cmake
+./config/cmake/HDF5UseFortran.cmake
 ./config/cmake/libhdf5.settings.cmake.in
 ./config/cmake/mccacheinit.cmake
 ./config/cmake/patch.xml
@@ -2292,6 +2588,7 @@
 ./config/cmake/UserMacros/Windows_MT.cmake
 
 # CMake-specific Examples Files
+./config/cmake/HDF5_Examples.cmake.in
 ./config/cmake/HDF518_Examples.cmake.in
 ./release_docs/USING_CMake_Examples.txt
 
@@ -2352,6 +2649,7 @@
 ./tools/h5dump/CMakeTests.cmake
 ./tools/h5dump/CMakeTestsPBITS.cmake
 ./tools/h5dump/CMakeTestsXML.cmake
+./tools/h5dump/CMakeTestsVDS.cmake
 ./tools/h5import/CMakeLists.txt
 ./tools/h5import/CMakeTests.cmake
 ./tools/h5jam/CMakeLists.txt
@@ -2365,9 +2663,77 @@
 ./tools/lib/CMakeLists.txt
 ./tools/misc/CMakeLists.txt
 ./tools/misc/CMakeTests.cmake
+./tools/misc/vds/CMakeLists.txt
 ./tools/perform/CMakeLists.txt
 ./tools/perform/CMakeTests.cmake
 
 # CMake-specific User Scripts
 ./config/cmake/scripts/CTestScript.cmake
-./config/cmake/scripts/HDF518config.cmake
+./config/cmake/scripts/HDF5config.cmake
+
+# Files generated by autogen
+./aclocal.m4
+./bin/compile
+./bin/config.guess
+./bin/config.sub
+./bin/depcomp
+./bin/install-sh
+./bin/ltmain.sh
+./bin/missing
+./bin/test-driver
+./c++/examples/Makefile.in
+./c++/Makefile.in
+./configure
+./c++/src/Makefile.in
+./c++/test/Makefile.in
+./examples/Makefile.in
+./fortran/examples/Makefile.in
+./fortran/Makefile.in
+./fortran/src/Makefile.in
+./fortran/test/Makefile.in
+./fortran/testpar/Makefile.in
+./hl/c++/examples/Makefile.in
+./hl/c++/Makefile.in
+./hl/c++/src/Makefile.in
+./hl/c++/test/Makefile.in
+./hl/examples/Makefile.in
+./hl/fortran/examples/Makefile.in
+./hl/fortran/Makefile.in
+./hl/fortran/src/Makefile.in
+./hl/fortran/test/Makefile.in
+./hl/Makefile.in
+./hl/src/Makefile.in
+./hl/test/Makefile.in
+./hl/tools/gif2h5/Makefile.in
+./hl/tools/h5watch/Makefile.in
+./hl/tools/Makefile.in
+./m4/libtool.m4
+./m4/lt~obsolete.m4
+./m4/ltoptions.m4
+./m4/ltsugar.m4
+./m4/ltversion.m4
+./Makefile.in
+./src/H5config.h.in
+./src/H5Edefin.h
+./src/H5Einit.h
+./src/H5Epubgen.h
+./src/H5Eterm.h
+./src/H5overflow.h
+./src/H5version.h
+./src/Makefile.in
+./test/Makefile.in
+./testpar/Makefile.in
+./tools/h5copy/Makefile.in
+./tools/h5diff/Makefile.in
+./tools/h5dump/Makefile.in
+./tools/h5format_convert/Makefile.in
+./tools/h5import/Makefile.in
+./tools/h5jam/Makefile.in
+./tools/h5ls/Makefile.in
+./tools/h5repack/Makefile.in
+./tools/h5stat/Makefile.in
+./tools/lib/Makefile.in
+./tools/Makefile.in
+./tools/misc/Makefile.in
+./tools/misc/vds/Makefile.in
+./tools/perform/Makefile.in
diff --git a/Makefile.am b/Makefile.am
index 50e7928..c34f2cd 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -99,7 +99,7 @@ tests:
 	  if test $$d != .; then                                        \
 	   (cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1;            \
 	  fi;                                                           \
-	done
+	  done
 
 # Check-clean also recurses into examples directory
 check-clean:
diff --git a/Makefile.in b/Makefile.in
index b46cdd8..6a824f6 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -43,11 +43,21 @@
 # Configure should set AM_MAKEFLAGS to -V to solve this problem in
 # subdirectories.
 # NOTE: This means that invoking pmake in a subdirectory will not work.
-.MAKEFLAGS:@AM_MAKEFLAGS@
-	$(MAKE) all
-
+#xxx.MAKEFLAGS:@AM_MAKEFLAGS@
+#xxx	$(MAKE) all
+#xxx
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -110,25 +120,22 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/configure \
-	$(am__configure_deps) $(top_srcdir)/bin/mkinstalldirs COPYING \
-	bin/COPYING bin/compile bin/config.guess bin/config.sub \
-	bin/depcomp bin/install-sh bin/missing bin/mkinstalldirs \
-	bin/ltmain.sh $(top_srcdir)/bin/compile \
-	$(top_srcdir)/bin/config.guess $(top_srcdir)/bin/config.sub \
-	$(top_srcdir)/bin/install-sh $(top_srcdir)/bin/ltmain.sh \
-	$(top_srcdir)/bin/missing
 subdir = .
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+	$(am__configure_deps) $(am__DIST_COMMON)
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
  configure.lineno config.status.lineno
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_P = $(am__v_P_ at AM_V@)
@@ -186,6 +193,13 @@ am__define_uniq_tagged_files = \
 ETAGS = etags
 CTAGS = ctags
 CSCOPE = cscope
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/compile \
+	$(top_srcdir)/bin/config.guess $(top_srcdir)/bin/config.sub \
+	$(top_srcdir)/bin/install-sh $(top_srcdir)/bin/ltmain.sh \
+	$(top_srcdir)/bin/missing $(top_srcdir)/config/commence.am \
+	COPYING bin/COPYING bin/README bin/compile bin/config.guess \
+	bin/config.sub bin/depcomp bin/install-sh bin/ltmain.sh \
+	bin/missing
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
 top_distdir = $(distdir)
@@ -243,7 +257,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -288,14 +301,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -305,13 +326,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -353,9 +373,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -539,7 +570,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -549,7 +579,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am:
+$(top_srcdir)/config/commence.am $(am__empty):
 
 $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 	$(am__cd) $(srcdir) && $(AUTOCONF)
@@ -753,15 +783,15 @@ dist-xz: distdir
 	$(am__post_remove_distdir)
 
 dist-tarZ: distdir
-	@echo WARNING: "Support for shar distribution archives is" \
-	               "deprecated." >&2
+	@echo WARNING: "Support for distribution archives compressed with" \
+		       "legacy program 'compress' is deprecated." >&2
 	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
 	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
 	$(am__post_remove_distdir)
 
 dist-shar: distdir
-	@echo WARNING: "Support for distribution archives compressed with" \
-		       "legacy program 'compress' is deprecated." >&2
+	@echo WARNING: "Support for shar distribution archives is" \
+	               "deprecated." >&2
 	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
 	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
 	$(am__post_remove_distdir)
@@ -797,17 +827,17 @@ distcheck: dist
 	esac
 	chmod -R a-w $(distdir)
 	chmod u+w $(distdir)
-	mkdir $(distdir)/_build $(distdir)/_inst
+	mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
 	chmod a-w $(distdir)
 	test -d $(distdir)/_build || exit 0; \
 	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
 	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
 	  && am__cwd=`pwd` \
-	  && $(am__cd) $(distdir)/_build \
-	  && ../configure \
+	  && $(am__cd) $(distdir)/_build/sub \
+	  && ../../configure \
 	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
 	    $(DISTCHECK_CONFIGURE_FLAGS) \
-	    --srcdir=.. --prefix="$$dc_install_base" \
+	    --srcdir=../.. --prefix="$$dc_install_base" \
 	  && $(MAKE) $(AM_MAKEFLAGS) \
 	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
 	  && $(MAKE) $(AM_MAKEFLAGS) check \
@@ -984,6 +1014,8 @@ uninstall-am:
 	mostlyclean-libtool mostlyclean-local pdf pdf-am ps ps-am tags \
 	tags-am uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
@@ -1013,7 +1045,7 @@ tests:
 	  if test $$d != .; then                                        \
 	   (cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1;            \
 	  fi;                                                           \
-	done
+	  done
 
 # Check-clean also recurses into examples directory
 check-clean:
diff --git a/README.txt b/README.txt
index 31646fb..72e1fca 100644
--- a/README.txt
+++ b/README.txt
@@ -1,4 +1,4 @@
-HDF5 version 1.8.16 released on 2015-11-10
+HDF5 version 1.10.0-alpha0 released on 2015-12-29
 Please refer to the release_docs/INSTALL file for installation instructions.
 ------------------------------------------------------------------------------
 
diff --git a/aclocal.m4 b/aclocal.m4
index e10c539..dfc9cdc 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.14.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.15 -*- Autoconf -*-
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -20,7 +20,7 @@ You have another version of autoconf.  It may work, but is not guaranteed to.
 If you have problems, you may need to regenerate the build system entirely.
 To do so, use the procedure documented by the package, typically 'autoreconf'.])])
 
-# Copyright (C) 2002-2013 Free Software Foundation, Inc.
+# Copyright (C) 2002-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -32,10 +32,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.])
 # generated from the m4 files accompanying Automake X.Y.
 # (This private macro should not be called outside this file.)
 AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.14'
+[am__api_version='1.15'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.14.1], [],
+m4_if([$1], [1.15], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -51,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.14.1])dnl
+[AM_AUTOMAKE_VERSION([1.15])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -103,15 +103,14 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 # configured tree to be moved without reconfiguration.
 
 AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
 ])
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2013 Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -142,7 +141,7 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -333,7 +332,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -409,7 +408,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -499,8 +498,8 @@ AC_REQUIRE([AC_PROG_MKDIR_P])dnl
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
 AC_REQUIRE([AC_PROG_AWK])dnl
 AC_REQUIRE([AC_PROG_MAKE_SET])dnl
 AC_REQUIRE([AM_SET_LEADING_DOT])dnl
@@ -573,7 +572,11 @@ to "yes", and re-run configure.
 END
     AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
   fi
-fi])
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
 
 dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
 dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
@@ -602,7 +605,7 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -613,7 +616,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co
 # Define $install_sh.
 AC_DEFUN([AM_PROG_INSTALL_SH],
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
+if test x"${install_sh+set}" != xset; then
   case $am_aux_dir in
   *\ * | *\	*)
     install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
@@ -623,7 +626,7 @@ if test x"${install_sh}" != xset; then
 fi
 AC_SUBST([install_sh])])
 
-# Copyright (C) 2003-2013 Free Software Foundation, Inc.
+# Copyright (C) 2003-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -645,7 +648,7 @@ AC_SUBST([am__leading_dot])])
 # Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
 # From Jim Meyering
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -680,7 +683,7 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
 
 # Check to see how 'make' treats includes.	            -*- Autoconf -*-
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -730,7 +733,7 @@ rm -f confinc confmf
 
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2013 Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -769,7 +772,7 @@ fi
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -798,7 +801,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -845,7 +848,7 @@ AC_LANG_POP([C])])
 # For backward compatibility.
 AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -864,7 +867,7 @@ AC_DEFUN([AM_RUN_LOG],
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -945,7 +948,7 @@ AC_CONFIG_COMMANDS_PRE(
 rm -f conftest.file
 ])
 
-# Copyright (C) 2009-2013 Free Software Foundation, Inc.
+# Copyright (C) 2009-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1005,7 +1008,7 @@ AC_SUBST([AM_BACKSLASH])dnl
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1033,7 +1036,7 @@ fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2013 Free Software Foundation, Inc.
+# Copyright (C) 2006-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1052,7 +1055,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2013 Free Software Foundation, Inc.
+# Copyright (C) 2004-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1185,8590 +1188,8 @@ AC_SUBST([am__untar])
 
 m4_include([m4/aclocal_cxx.m4])
 m4_include([m4/aclocal_fc.m4])
-# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
-#
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-m4_define([_LT_COPYING], [dnl
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
-#
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-])
-
-# serial 57 LT_INIT
-
-
-# LT_PREREQ(VERSION)
-# ------------------
-# Complain and exit if this libtool version is less that VERSION.
-m4_defun([LT_PREREQ],
-[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
-       [m4_default([$3],
-		   [m4_fatal([Libtool version $1 or higher is required],
-		             63)])],
-       [$2])])
-
-
-# _LT_CHECK_BUILDDIR
-# ------------------
-# Complain if the absolute build directory name contains unusual characters
-m4_defun([_LT_CHECK_BUILDDIR],
-[case `pwd` in
-  *\ * | *\	*)
-    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
-esac
-])
-
-
-# LT_INIT([OPTIONS])
-# ------------------
-AC_DEFUN([LT_INIT],
-[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
-AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
-AC_BEFORE([$0], [LT_LANG])dnl
-AC_BEFORE([$0], [LT_OUTPUT])dnl
-AC_BEFORE([$0], [LTDL_INIT])dnl
-m4_require([_LT_CHECK_BUILDDIR])dnl
-
-dnl Autoconf doesn't catch unexpanded LT_ macros by default:
-m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
-m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
-dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
-dnl unless we require an AC_DEFUNed macro:
-AC_REQUIRE([LTOPTIONS_VERSION])dnl
-AC_REQUIRE([LTSUGAR_VERSION])dnl
-AC_REQUIRE([LTVERSION_VERSION])dnl
-AC_REQUIRE([LTOBSOLETE_VERSION])dnl
-m4_require([_LT_PROG_LTMAIN])dnl
-
-_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
-
-dnl Parse OPTIONS
-_LT_SET_OPTIONS([$0], [$1])
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-AC_SUBST(LIBTOOL)dnl
-
-_LT_SETUP
-
-# Only expand once:
-m4_define([LT_INIT])
-])# LT_INIT
-
-# Old names:
-AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
-AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
-dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
-
-
-# _LT_CC_BASENAME(CC)
-# -------------------
-# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
-m4_defun([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
-  case $cc_temp in
-    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
-    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
-])
-
-
-# _LT_FILEUTILS_DEFAULTS
-# ----------------------
-# It is okay to use these file commands and assume they have been set
-# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
-m4_defun([_LT_FILEUTILS_DEFAULTS],
-[: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
-])# _LT_FILEUTILS_DEFAULTS
-
-
-# _LT_SETUP
-# ---------
-m4_defun([_LT_SETUP],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
-AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
-
-_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
-dnl
-_LT_DECL([], [host_alias], [0], [The host system])dnl
-_LT_DECL([], [host], [0])dnl
-_LT_DECL([], [host_os], [0])dnl
-dnl
-_LT_DECL([], [build_alias], [0], [The build system])dnl
-_LT_DECL([], [build], [0])dnl
-_LT_DECL([], [build_os], [0])dnl
-dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-dnl
-AC_REQUIRE([AC_PROG_LN_S])dnl
-test -z "$LN_S" && LN_S="ln -s"
-_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
-dnl
-AC_REQUIRE([LT_CMD_MAX_LEN])dnl
-_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
-_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
-dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
-m4_require([_LT_CMD_RELOAD])dnl
-m4_require([_LT_CHECK_MAGIC_METHOD])dnl
-m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
-m4_require([_LT_CMD_OLD_ARCHIVE])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-m4_require([_LT_WITH_SYSROOT])dnl
-
-_LT_CONFIG_LIBTOOL_INIT([
-# See if we are running on zsh, and set the options which allow our
-# commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-])
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
-
-_LT_CHECK_OBJDIR
-
-m4_require([_LT_TAG_COMPILER])dnl
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
-  fi
-  ;;
-esac
-
-# Global variables:
-ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
-
-_LT_CC_BASENAME([$compiler])
-
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    _LT_PATH_MAGIC
-  fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-LT_SUPPORTED_TAG([CC])
-_LT_LANG_C_CONFIG
-_LT_LANG_DEFAULT_CONFIG
-_LT_CONFIG_COMMANDS
-])# _LT_SETUP
-
-
-# _LT_PREPARE_SED_QUOTE_VARS
-# --------------------------
-# Define a few sed substitution that help us do robust quoting.
-m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
-[# Backslashify metacharacters that are still active within
-# double-quoted strings.
-sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([["`\\]]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
-])
-
-# _LT_PROG_LTMAIN
-# ---------------
-# Note that this code is called both from `configure', and `config.status'
-# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
-# `config.status' has no value for ac_aux_dir unless we are using Automake,
-# so we pass a copy along to make sure it has a sensible value anyway.
-m4_defun([_LT_PROG_LTMAIN],
-[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
-_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
-ltmain="$ac_aux_dir/ltmain.sh"
-])# _LT_PROG_LTMAIN
-
-
-
-# So that we can recreate a full libtool script including additional
-# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
-# in macros and then make a single call at the end using the `libtool'
-# label.
-
-
-# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
-# ----------------------------------------
-# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL_INIT],
-[m4_ifval([$1],
-          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
-                     [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_INIT])
-
-
-# _LT_CONFIG_LIBTOOL([COMMANDS])
-# ------------------------------
-# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-m4_define([_LT_CONFIG_LIBTOOL],
-[m4_ifval([$1],
-          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
-                     [$1
-])])])
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
-
-
-# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
-# -----------------------------------------------------
-m4_defun([_LT_CONFIG_SAVE_COMMANDS],
-[_LT_CONFIG_LIBTOOL([$1])
-_LT_CONFIG_LIBTOOL_INIT([$2])
-])
-
-
-# _LT_FORMAT_COMMENT([COMMENT])
-# -----------------------------
-# Add leading comment marks to the start of each line, and a trailing
-# full-stop to the whole comment if one is not present already.
-m4_define([_LT_FORMAT_COMMENT],
-[m4_ifval([$1], [
-m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
-              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
-)])
-
-
-
-
-
-# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
-# -------------------------------------------------------------------
-# CONFIGNAME is the name given to the value in the libtool script.
-# VARNAME is the (base) name used in the configure script.
-# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
-# VARNAME.  Any other value will be used directly.
-m4_define([_LT_DECL],
-[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
-    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
-	[m4_ifval([$1], [$1], [$2])])
-    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
-    m4_ifval([$4],
-	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
-    lt_dict_add_subkey([lt_decl_dict], [$2],
-	[tagged?], [m4_ifval([$5], [yes], [no])])])
-])
-
-
-# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
-# --------------------------------------------------------
-m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
-
-
-# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_tag_varnames],
-[_lt_decl_filter([tagged?], [yes], $@)])
-
-
-# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
-# ---------------------------------------------------------
-m4_define([_lt_decl_filter],
-[m4_case([$#],
-  [0], [m4_fatal([$0: too few arguments: $#])],
-  [1], [m4_fatal([$0: too few arguments: $#: $1])],
-  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
-  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
-  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
-])
-
-
-# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
-# --------------------------------------------------
-m4_define([lt_decl_quote_varnames],
-[_lt_decl_filter([value], [1], $@)])
-
-
-# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_dquote_varnames],
-[_lt_decl_filter([value], [2], $@)])
-
-
-# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
-# ---------------------------------------------------
-m4_define([lt_decl_varnames_tagged],
-[m4_assert([$# <= 2])dnl
-_$0(m4_quote(m4_default([$1], [[, ]])),
-    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
-    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
-m4_define([_lt_decl_varnames_tagged],
-[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
-
-
-# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
-# ------------------------------------------------
-m4_define([lt_decl_all_varnames],
-[_$0(m4_quote(m4_default([$1], [[, ]])),
-     m4_if([$2], [],
-	   m4_quote(lt_decl_varnames),
-	m4_quote(m4_shift($@))))[]dnl
-])
-m4_define([_lt_decl_all_varnames],
-[lt_join($@, lt_decl_varnames_tagged([$1],
-			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
-])
-
-
-# _LT_CONFIG_STATUS_DECLARE([VARNAME])
-# ------------------------------------
-# Quote a variable value, and forward it to `config.status' so that its
-# declaration there will have the same value as in `configure'.  VARNAME
-# must have a single quote delimited value for this to work.
-m4_define([_LT_CONFIG_STATUS_DECLARE],
-[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
-
-
-# _LT_CONFIG_STATUS_DECLARATIONS
-# ------------------------------
-# We delimit libtool config variables with single quotes, so when
-# we write them to config.status, we have to be sure to quote all
-# embedded single quotes properly.  In configure, this macro expands
-# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
-#
-#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
-m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
-    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAGS
-# ----------------
-# Output comment and list of tags supported by the script
-m4_defun([_LT_LIBTOOL_TAGS],
-[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
-available_tags="_LT_TAGS"dnl
-])
-
-
-# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
-# -----------------------------------
-# Extract the dictionary values for VARNAME (optionally with TAG) and
-# expand to a commented shell variable setting:
-#
-#    # Some comment about what VAR is for.
-#    visible_name=$lt_internal_name
-m4_define([_LT_LIBTOOL_DECLARE],
-[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
-					   [description])))[]dnl
-m4_pushdef([_libtool_name],
-    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
-m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
-    [0], [_libtool_name=[$]$1],
-    [1], [_libtool_name=$lt_[]$1],
-    [2], [_libtool_name=$lt_[]$1],
-    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
-m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
-])
-
-
-# _LT_LIBTOOL_CONFIG_VARS
-# -----------------------
-# Produce commented declarations of non-tagged libtool config variables
-# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
-# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
-# section) are produced by _LT_LIBTOOL_TAG_VARS.
-m4_defun([_LT_LIBTOOL_CONFIG_VARS],
-[m4_foreach([_lt_var],
-    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
-    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
-
-
-# _LT_LIBTOOL_TAG_VARS(TAG)
-# -------------------------
-m4_define([_LT_LIBTOOL_TAG_VARS],
-[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
-    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
-
-
-# _LT_TAGVAR(VARNAME, [TAGNAME])
-# ------------------------------
-m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
-
-
-# _LT_CONFIG_COMMANDS
-# -------------------
-# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
-# variables for single and double quote escaping we saved from calls
-# to _LT_DECL, we can put quote escaped variables declarations
-# into `config.status', and then the shell code to quote escape them in
-# for loops in `config.status'.  Finally, any additional code accumulated
-# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
-m4_defun([_LT_CONFIG_COMMANDS],
-[AC_PROVIDE_IFELSE([LT_OUTPUT],
-	dnl If the libtool generation code has been placed in $CONFIG_LT,
-	dnl instead of duplicating it all over again into config.status,
-	dnl then we will have config.status run $CONFIG_LT later, so it
-	dnl needs to know what name is stored there:
-        [AC_CONFIG_COMMANDS([libtool],
-            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
-    dnl If the libtool generation code is destined for config.status,
-    dnl expand the accumulated commands and init code now:
-    [AC_CONFIG_COMMANDS([libtool],
-        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
-])#_LT_CONFIG_COMMANDS
-
-
-# Initialize.
-m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
-[
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-sed_quote_subst='$sed_quote_subst'
-double_quote_subst='$double_quote_subst'
-delay_variable_subst='$delay_variable_subst'
-_LT_CONFIG_STATUS_DECLARATIONS
-LTCC='$LTCC'
-LTCFLAGS='$LTCFLAGS'
-compiler='$compiler_DEFAULT'
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-\$[]1
-_LTECHO_EOF'
-}
-
-# Quote evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_quote_varnames); do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-# Double-quote double-evaled strings.
-for var in lt_decl_all_varnames([[ \
-]], lt_decl_dquote_varnames); do
-    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
-    *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
-      ;;
-    *)
-      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
-      ;;
-    esac
-done
-
-_LT_OUTPUT_LIBTOOL_INIT
-])
-
-# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
-# ------------------------------------
-# Generate a child script FILE with all initialization necessary to
-# reuse the environment learned by the parent script, and make the
-# file executable.  If COMMENT is supplied, it is inserted after the
-# `#!' sequence but before initialization text begins.  After this
-# macro, additional text can be appended to FILE to form the body of
-# the child script.  The macro ends with non-zero status if the
-# file could not be fully written (such as if the disk is full).
-m4_ifdef([AS_INIT_GENERATED],
-[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
-[m4_defun([_LT_GENERATED_FILE_INIT],
-[m4_require([AS_PREPARE])]dnl
-[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
-[lt_write_fail=0
-cat >$1 <<_ASEOF || lt_write_fail=1
-#! $SHELL
-# Generated by $as_me.
-$2
-SHELL=\${CONFIG_SHELL-$SHELL}
-export SHELL
-_ASEOF
-cat >>$1 <<\_ASEOF || lt_write_fail=1
-AS_SHELL_SANITIZE
-_AS_PREPARE
-exec AS_MESSAGE_FD>&1
-_ASEOF
-test $lt_write_fail = 0 && chmod +x $1[]dnl
-m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
-
-# LT_OUTPUT
-# ---------
-# This macro allows early generation of the libtool script (before
-# AC_OUTPUT is called), incase it is used in configure for compilation
-# tests.
-AC_DEFUN([LT_OUTPUT],
-[: ${CONFIG_LT=./config.lt}
-AC_MSG_NOTICE([creating $CONFIG_LT])
-_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
-[# Run this file to recreate a libtool stub with the current configuration.])
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-lt_cl_silent=false
-exec AS_MESSAGE_LOG_FD>>config.log
-{
-  echo
-  AS_BOX([Running $as_me.])
-} >&AS_MESSAGE_LOG_FD
-
-lt_cl_help="\
-\`$as_me' creates a local libtool stub from the current configuration,
-for use in further configure time tests before the real libtool is
-generated.
-
-Usage: $[0] [[OPTIONS]]
-
-  -h, --help      print this help, then exit
-  -V, --version   print version number, then exit
-  -q, --quiet     do not print progress messages
-  -d, --debug     don't remove temporary files
-
-Report bugs to <bug-libtool at gnu.org>."
-
-lt_cl_version="\
-m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
-m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
-configured by $[0], generated by m4_PACKAGE_STRING.
-
-Copyright (C) 2011 Free Software Foundation, Inc.
-This config.lt script is free software; the Free Software Foundation
-gives unlimited permision to copy, distribute and modify it."
-
-while test $[#] != 0
-do
-  case $[1] in
-    --version | --v* | -V )
-      echo "$lt_cl_version"; exit 0 ;;
-    --help | --h* | -h )
-      echo "$lt_cl_help"; exit 0 ;;
-    --debug | --d* | -d )
-      debug=: ;;
-    --quiet | --q* | --silent | --s* | -q )
-      lt_cl_silent=: ;;
-
-    -*) AC_MSG_ERROR([unrecognized option: $[1]
-Try \`$[0] --help' for more information.]) ;;
-
-    *) AC_MSG_ERROR([unrecognized argument: $[1]
-Try \`$[0] --help' for more information.]) ;;
-  esac
-  shift
-done
-
-if $lt_cl_silent; then
-  exec AS_MESSAGE_FD>/dev/null
-fi
-_LTEOF
-
-cat >>"$CONFIG_LT" <<_LTEOF
-_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
-_LTEOF
-
-cat >>"$CONFIG_LT" <<\_LTEOF
-AC_MSG_NOTICE([creating $ofile])
-_LT_OUTPUT_LIBTOOL_COMMANDS
-AS_EXIT(0)
-_LTEOF
-chmod +x "$CONFIG_LT"
-
-# configure is writing to config.log, but config.lt does its own redirection,
-# appending to config.log, which fails on DOS, as config.log is still kept
-# open by configure.  Here we exec the FD to /dev/null, effectively closing
-# config.log, so it can be properly (re)opened and appended to by config.lt.
-lt_cl_success=:
-test "$silent" = yes &&
-  lt_config_lt_args="$lt_config_lt_args --quiet"
-exec AS_MESSAGE_LOG_FD>/dev/null
-$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
-exec AS_MESSAGE_LOG_FD>>config.log
-$lt_cl_success || AS_EXIT(1)
-])# LT_OUTPUT
-
-
-# _LT_CONFIG(TAG)
-# ---------------
-# If TAG is the built-in tag, create an initial libtool script with a
-# default configuration from the untagged config vars.  Otherwise add code
-# to config.status for appending the configuration named by TAG from the
-# matching tagged config vars.
-m4_defun([_LT_CONFIG],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_CONFIG_SAVE_COMMANDS([
-  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
-  m4_if(_LT_TAG, [C], [
-    # See if we are running on zsh, and set the options which allow our
-    # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
-      setopt NO_GLOB_SUBST
-    fi
-
-    cfgfile="${ofile}T"
-    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-    $RM "$cfgfile"
-
-    cat <<_LT_EOF >> "$cfgfile"
-#! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-_LT_COPYING
-_LT_LIBTOOL_TAGS
-
-# ### BEGIN LIBTOOL CONFIG
-_LT_LIBTOOL_CONFIG_VARS
-_LT_LIBTOOL_TAG_VARS
-# ### END LIBTOOL CONFIG
-
-_LT_EOF
-
-  case $host_os in
-  aix3*)
-    cat <<\_LT_EOF >> "$cfgfile"
-# AIX sometimes has problems with the GCC collect2 program.  For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
-  COLLECT_NAMES=
-  export COLLECT_NAMES
-fi
-_LT_EOF
-    ;;
-  esac
-
-  _LT_PROG_LTMAIN
-
-  # We use sed instead of cat because bash on DJGPP gets confused if
-  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
-  # text mode, it properly converts lines to CR/LF.  This bash problem
-  # is reportedly fixed, but why not run on old versions too?
-  sed '$q' "$ltmain" >> "$cfgfile" \
-     || (rm -f "$cfgfile"; exit 1)
-
-  _LT_PROG_REPLACE_SHELLFNS
-
-   mv -f "$cfgfile" "$ofile" ||
-    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-  chmod +x "$ofile"
-],
-[cat <<_LT_EOF >> "$ofile"
-
-dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
-dnl in a comment (ie after a #).
-# ### BEGIN LIBTOOL TAG CONFIG: $1
-_LT_LIBTOOL_TAG_VARS(_LT_TAG)
-# ### END LIBTOOL TAG CONFIG: $1
-_LT_EOF
-])dnl /m4_if
-],
-[m4_if([$1], [], [
-    PACKAGE='$PACKAGE'
-    VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
-    RM='$RM'
-    ofile='$ofile'], [])
-])dnl /_LT_CONFIG_SAVE_COMMANDS
-])# _LT_CONFIG
-
-
-# LT_SUPPORTED_TAG(TAG)
-# ---------------------
-# Trace this macro to discover what tags are supported by the libtool
-# --tag option, using:
-#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
-AC_DEFUN([LT_SUPPORTED_TAG], [])
-
-
-# C support is built-in for now
-m4_define([_LT_LANG_C_enabled], [])
-m4_define([_LT_TAGS], [])
-
-
-# LT_LANG(LANG)
-# -------------
-# Enable libtool support for the given language if not already enabled.
-AC_DEFUN([LT_LANG],
-[AC_BEFORE([$0], [LT_OUTPUT])dnl
-m4_case([$1],
-  [C],			[_LT_LANG(C)],
-  [C++],		[_LT_LANG(CXX)],
-  [Go],			[_LT_LANG(GO)],
-  [Java],		[_LT_LANG(GCJ)],
-  [Fortran 77],		[_LT_LANG(F77)],
-  [Fortran],		[_LT_LANG(FC)],
-  [Windows Resource],	[_LT_LANG(RC)],
-  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
-    [_LT_LANG($1)],
-    [m4_fatal([$0: unsupported language: "$1"])])])dnl
-])# LT_LANG
-
-
-# _LT_LANG(LANGNAME)
-# ------------------
-m4_defun([_LT_LANG],
-[m4_ifdef([_LT_LANG_]$1[_enabled], [],
-  [LT_SUPPORTED_TAG([$1])dnl
-  m4_append([_LT_TAGS], [$1 ])dnl
-  m4_define([_LT_LANG_]$1[_enabled], [])dnl
-  _LT_LANG_$1_CONFIG($1)])dnl
-])# _LT_LANG
-
-
-m4_ifndef([AC_PROG_GO], [
-# NOTE: This macro has been submitted for inclusion into   #
-#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
-#  a released version of Autoconf we should remove this    #
-#  macro and use it instead.                               #
-m4_defun([AC_PROG_GO],
-[AC_LANG_PUSH(Go)dnl
-AC_ARG_VAR([GOC],     [Go compiler command])dnl
-AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
-_AC_ARG_VAR_LDFLAGS()dnl
-AC_CHECK_TOOL(GOC, gccgo)
-if test -z "$GOC"; then
-  if test -n "$ac_tool_prefix"; then
-    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
-  fi
-fi
-if test -z "$GOC"; then
-  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
-fi
-])#m4_defun
-])#m4_ifndef
-
-
-# _LT_LANG_DEFAULT_CONFIG
-# -----------------------
-m4_defun([_LT_LANG_DEFAULT_CONFIG],
-[AC_PROVIDE_IFELSE([AC_PROG_CXX],
-  [LT_LANG(CXX)],
-  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_F77],
-  [LT_LANG(F77)],
-  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
-
-AC_PROVIDE_IFELSE([AC_PROG_FC],
-  [LT_LANG(FC)],
-  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
-
-dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
-dnl pulling things in needlessly.
-AC_PROVIDE_IFELSE([AC_PROG_GCJ],
-  [LT_LANG(GCJ)],
-  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
-    [LT_LANG(GCJ)],
-    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
-      [LT_LANG(GCJ)],
-      [m4_ifdef([AC_PROG_GCJ],
-	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
-       m4_ifdef([A][M_PROG_GCJ],
-	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
-       m4_ifdef([LT_PROG_GCJ],
-	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
-
-AC_PROVIDE_IFELSE([AC_PROG_GO],
-  [LT_LANG(GO)],
-  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
-
-AC_PROVIDE_IFELSE([LT_PROG_RC],
-  [LT_LANG(RC)],
-  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
-])# _LT_LANG_DEFAULT_CONFIG
-
-# Obsolete macros:
-AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
-AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
-AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
-AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
-AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
-dnl AC_DEFUN([AC_LIBTOOL_F77], [])
-dnl AC_DEFUN([AC_LIBTOOL_FC], [])
-dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
-dnl AC_DEFUN([AC_LIBTOOL_RC], [])
-
-
-# _LT_TAG_COMPILER
-# ----------------
-m4_defun([_LT_TAG_COMPILER],
-[AC_REQUIRE([AC_PROG_CC])dnl
-
-_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
-_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
-_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
-_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
-
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
-
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
-# Allow CC to be a program name with arguments.
-compiler=$CC
-])# _LT_TAG_COMPILER
-
-
-# _LT_COMPILER_BOILERPLATE
-# ------------------------
-# Check for compiler boilerplate output or warnings with
-# the simple compiler test code.
-m4_defun([_LT_COMPILER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
-])# _LT_COMPILER_BOILERPLATE
-
-
-# _LT_LINKER_BOILERPLATE
-# ----------------------
-# Check for linker boilerplate output or warnings with
-# the simple link test code.
-m4_defun([_LT_LINKER_BOILERPLATE],
-[m4_require([_LT_DECL_SED])dnl
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
-])# _LT_LINKER_BOILERPLATE
-
-# _LT_REQUIRED_DARWIN_CHECKS
-# -------------------------
-m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
-  case $host_os in
-    rhapsody* | darwin*)
-    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
-    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
-    AC_CHECK_TOOL([LIPO], [lipo], [:])
-    AC_CHECK_TOOL([OTOOL], [otool], [:])
-    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
-    _LT_DECL([], [DSYMUTIL], [1],
-      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
-    _LT_DECL([], [NMEDIT], [1],
-      [Tool to change global to local symbols on Mac OS X])
-    _LT_DECL([], [LIPO], [1],
-      [Tool to manipulate fat objects and archives on Mac OS X])
-    _LT_DECL([], [OTOOL], [1],
-      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
-    _LT_DECL([], [OTOOL64], [1],
-      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
-
-    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
-      [lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	# If there is a non-empty error log, and "single_module"
-	# appears in it, assume the flag caused a linker warning
-        if test -s conftest.err && $GREP single_module conftest.err; then
-	  cat conftest.err >&AS_MESSAGE_LOG_FD
-	# Otherwise, if the output was created with a 0 exit code from
-	# the compiler, it worked.
-	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&AS_MESSAGE_LOG_FD
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi])
-
-    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
-      [lt_cv_ld_exported_symbols_list],
-      [lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-	[lt_cv_ld_exported_symbols_list=yes],
-	[lt_cv_ld_exported_symbols_list=no])
-	LDFLAGS="$save_LDFLAGS"
-    ])
-
-    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
-      [lt_cv_ld_force_load=no
-      cat > conftest.c << _LT_EOF
-int forced_loaded() { return 2;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
-      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
-      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
-      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
-      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
-      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
-      cat > conftest.c << _LT_EOF
-int main() { return 0;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
-      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
-      _lt_result=$?
-      if test -s conftest.err && $GREP force_load conftest.err; then
-	cat conftest.err >&AS_MESSAGE_LOG_FD
-      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
-	lt_cv_ld_force_load=yes
-      else
-	cat conftest.err >&AS_MESSAGE_LOG_FD
-      fi
-        rm -f conftest.err libconftest.a conftest conftest.c
-        rm -rf conftest.dSYM
-    ])
-    case $host_os in
-    rhapsody* | darwin1.[[012]])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[[012]]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
-])
-
-
-# _LT_DARWIN_LINKER_FEATURES([TAG])
-# ---------------------------------
-# Checks for linker and compiler features on darwin
-m4_defun([_LT_DARWIN_LINKER_FEATURES],
-[
-  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
-  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-  _LT_TAGVAR(hardcode_direct, $1)=no
-  _LT_TAGVAR(hardcode_automatic, $1)=yes
-  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
-                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
-  else
-    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
-  fi
-  _LT_TAGVAR(link_all_deplibs, $1)=yes
-  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=func_echo_all
-    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-    m4_if([$1], [CXX],
-[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
-    fi
-],[])
-  else
-  _LT_TAGVAR(ld_shlibs, $1)=no
-  fi
-])
-
-# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
-# ----------------------------------
-# Links a minimal program and checks the executable
-# for the system default hardcoded library path. In most cases,
-# this is /usr/lib:/lib, but when the MPI compilers are used
-# the location of the communication and MPI libs are included too.
-# If we don't find anything, use the default library path according
-# to the aix ld manual.
-# Store the results from the different compilers for each TAGNAME.
-# Allow to override them for all tags through lt_cv_aix_libpath.
-m4_defun([_LT_SYS_MODULE_PATH_AIX],
-[m4_require([_LT_DECL_SED])dnl
-if test "${lt_cv_aix_libpath+set}" = set; then
-  aix_libpath=$lt_cv_aix_libpath
-else
-  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
-  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
-  lt_aix_libpath_sed='[
-      /Import File Strings/,/^$/ {
-	  /^0/ {
-	      s/^0  *\([^ ]*\) *$/\1/
-	      p
-	  }
-      }]'
-  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  # Check for a 64-bit object if we didn't find anything.
-  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
-    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  fi],[])
-  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
-    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
-  fi
-  ])
-  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
-fi
-])# _LT_SYS_MODULE_PATH_AIX
-
-
-# _LT_SHELL_INIT(ARG)
-# -------------------
-m4_define([_LT_SHELL_INIT],
-[m4_divert_text([M4SH-INIT], [$1
-])])# _LT_SHELL_INIT
-
-
-
-# _LT_PROG_ECHO_BACKSLASH
-# -----------------------
-# Find how we can fake an echo command that does not interpret backslash.
-# In particular, with Autoconf 2.60 or later we add some code to the start
-# of the generated configure script which will find a shell with a builtin
-# printf (which we can use as an echo command).
-m4_defun([_LT_PROG_ECHO_BACKSLASH],
-[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-
-AC_MSG_CHECKING([how to print strings])
-# Test print first, because it will be a builtin if present.
-if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
-   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='print -r --'
-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='printf %s\n'
-else
-  # Use this function as a fallback that always works.
-  func_fallback_echo ()
-  {
-    eval 'cat <<_LTECHO_EOF
-$[]1
-_LTECHO_EOF'
-  }
-  ECHO='func_fallback_echo'
-fi
-
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO "$*" 
-}
-
-case "$ECHO" in
-  printf*) AC_MSG_RESULT([printf]) ;;
-  print*) AC_MSG_RESULT([print -r]) ;;
-  *) AC_MSG_RESULT([cat]) ;;
-esac
-
-m4_ifdef([_AS_DETECT_SUGGESTED],
-[_AS_DETECT_SUGGESTED([
-  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
-    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
-    PATH=/empty FPATH=/empty; export PATH FPATH
-    test "X`printf %s $ECHO`" = "X$ECHO" \
-      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
-
-_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
-_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
-])# _LT_PROG_ECHO_BACKSLASH
-
-
-# _LT_WITH_SYSROOT
-# ----------------
-AC_DEFUN([_LT_WITH_SYSROOT],
-[AC_MSG_CHECKING([for sysroot])
-AC_ARG_WITH([sysroot],
-[  --with-sysroot[=DIR] Search for dependent libraries within DIR
-                        (or the compiler's sysroot if not specified).],
-[], [with_sysroot=no])
-
-dnl lt_sysroot will always be passed unquoted.  We quote it here
-dnl in case the user passed a directory name.
-lt_sysroot=
-case ${with_sysroot} in #(
- yes)
-   if test "$GCC" = yes; then
-     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
-   fi
-   ;; #(
- /*)
-   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
-   ;; #(
- no|'')
-   ;; #(
- *)
-   AC_MSG_RESULT([${with_sysroot}])
-   AC_MSG_ERROR([The sysroot must be an absolute path.])
-   ;;
-esac
-
- AC_MSG_RESULT([${lt_sysroot:-no}])
-_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
-[dependent libraries, and in which our libraries should be installed.])])
-
-# _LT_ENABLE_LOCK
-# ---------------
-m4_defun([_LT_ENABLE_LOCK],
-[AC_ARG_ENABLE([libtool-lock],
-  [AS_HELP_STRING([--disable-libtool-lock],
-    [avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
-  ;;
-
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_i386"
-	    ;;
-	  ppc64-*linux*|powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  ppc*-*linux*|powerpc*-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
-    [AC_LANG_PUSH(C)
-     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
-     AC_LANG_POP])
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if AC_TRY_EVAL(ac_compile); then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*)
-        case $host in
-        i?86-*-solaris*)
-          LD="${LD-ld} -m elf_x86_64"
-          ;;
-        sparc*-*-solaris*)
-          LD="${LD-ld} -m elf64_sparc"
-          ;;
-        esac
-        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
-        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
-          LD="${LD-ld}_sol2"
-        fi
-        ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
-esac
-
-need_locks="$enable_libtool_lock"
-])# _LT_ENABLE_LOCK
-
-
-# _LT_PROG_AR
-# -----------
-m4_defun([_LT_PROG_AR],
-[AC_CHECK_TOOLS(AR, [ar], false)
-: ${AR=ar}
-: ${AR_FLAGS=cru}
-_LT_DECL([], [AR], [1], [The archiver])
-_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
-
-AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
-  [lt_cv_ar_at_file=no
-   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
-     [echo conftest.$ac_objext > conftest.lst
-      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
-      AC_TRY_EVAL([lt_ar_try])
-      if test "$ac_status" -eq 0; then
-	# Ensure the archiver fails upon bogus file names.
-	rm -f conftest.$ac_objext libconftest.a
-	AC_TRY_EVAL([lt_ar_try])
-	if test "$ac_status" -ne 0; then
-          lt_cv_ar_at_file=@
-        fi
-      fi
-      rm -f conftest.* libconftest.a
-     ])
-  ])
-
-if test "x$lt_cv_ar_at_file" = xno; then
-  archiver_list_spec=
-else
-  archiver_list_spec=$lt_cv_ar_at_file
-fi
-_LT_DECL([], [archiver_list_spec], [1],
-  [How to feed a file listing to the archiver])
-])# _LT_PROG_AR
-
-
-# _LT_CMD_OLD_ARCHIVE
-# -------------------
-m4_defun([_LT_CMD_OLD_ARCHIVE],
-[_LT_PROG_AR
-
-AC_CHECK_TOOL(STRIP, strip, :)
-test -z "$STRIP" && STRIP=:
-_LT_DECL([], [STRIP], [1], [A symbol stripping program])
-
-AC_CHECK_TOOL(RANLIB, ranlib, :)
-test -z "$RANLIB" && RANLIB=:
-_LT_DECL([], [RANLIB], [1],
-    [Commands used to install an old-style archive])
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
-fi
-
-case $host_os in
-  darwin*)
-    lock_old_archive_extraction=yes ;;
-  *)
-    lock_old_archive_extraction=no ;;
-esac
-_LT_DECL([], [old_postinstall_cmds], [2])
-_LT_DECL([], [old_postuninstall_cmds], [2])
-_LT_TAGDECL([], [old_archive_cmds], [2],
-    [Commands used to build an old-style archive])
-_LT_DECL([], [lock_old_archive_extraction], [0],
-    [Whether to use a lock for old archive extraction])
-])# _LT_CMD_OLD_ARCHIVE
-
-
-# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------------------
-# Check whether the given compiler option works
-AC_DEFUN([_LT_COMPILER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$3"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       $2=yes
-     fi
-   fi
-   $RM conftest*
-])
-
-if test x"[$]$2" = xyes; then
-    m4_if([$5], , :, [$5])
-else
-    m4_if([$6], , :, [$6])
-fi
-])# _LT_COMPILER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
-
-
-# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
-#                  [ACTION-SUCCESS], [ACTION-FAILURE])
-# ----------------------------------------------------
-# Check whether the given linker option works
-AC_DEFUN([_LT_LINKER_OPTION],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_SED])dnl
-AC_CACHE_CHECK([$1], [$2],
-  [$2=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $3"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&AS_MESSAGE_LOG_FD
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         $2=yes
-       fi
-     else
-       $2=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
-])
-
-if test x"[$]$2" = xyes; then
-    m4_if([$4], , :, [$4])
-else
-    m4_if([$5], , :, [$5])
-fi
-])# _LT_LINKER_OPTION
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
-
-
-# LT_CMD_MAX_LEN
-#---------------
-AC_DEFUN([LT_CMD_MAX_LEN],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-# find the maximum length of command line arguments
-AC_MSG_CHECKING([the maximum length of command line arguments])
-AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
-  i=0
-  teststring="ABCD"
-
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
-
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
-
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  mint*)
-    # On MiNT this can take a long time and run out of memory.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
-
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
-
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
-
-  os2*)
-    # The test takes a long time on OS/2.
-    lt_cv_sys_max_cmd_len=8192
-    ;;
-
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
-	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
-])
-if test -n $lt_cv_sys_max_cmd_len ; then
-  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
-else
-  AC_MSG_RESULT(none)
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
-_LT_DECL([], [max_cmd_len], [0],
-    [What is the maximum length of a command?])
-])# LT_CMD_MAX_LEN
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
-
-
-# _LT_HEADER_DLFCN
-# ----------------
-m4_defun([_LT_HEADER_DLFCN],
-[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
-])# _LT_HEADER_DLFCN
-
-
-# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
-#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
-# ----------------------------------------------------------------
-m4_defun([_LT_TRY_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
-  [$4]
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-[#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
-
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-int fnord () __attribute__((visibility("default")));
-#endif
-
-int fnord () { return 42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
-
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
-
-  return status;
-}]
-_LT_EOF
-  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) $1 ;;
-      x$lt_dlneed_uscore) $2 ;;
-      x$lt_dlunknown|x*) $3 ;;
-    esac
-  else :
-    # compilation failed
-    $3
-  fi
-fi
-rm -fr conftest*
-])# _LT_TRY_DLOPEN_SELF
-
-
-# LT_SYS_DLOPEN_SELF
-# ------------------
-AC_DEFUN([LT_SYS_DLOPEN_SELF],
-[m4_require([_LT_HEADER_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
-
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
-
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
-
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
-
-  darwin*)
-  # if libdl is installed we need to link against it
-    AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ])
-    ;;
-
-  *)
-    AC_CHECK_FUNC([shl_load],
-	  [lt_cv_dlopen="shl_load"],
-      [AC_CHECK_LIB([dld], [shl_load],
-	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
-	[AC_CHECK_FUNC([dlopen],
-	      [lt_cv_dlopen="dlopen"],
-	  [AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
-	    [AC_CHECK_LIB([svld], [dlopen],
-		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
-	      [AC_CHECK_LIB([dld], [dld_link],
-		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
-	      ])
-	    ])
-	  ])
-	])
-      ])
-    ;;
-  esac
-
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
-
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
-
-    AC_CACHE_CHECK([whether a program can dlopen itself],
-	  lt_cv_dlopen_self, [dnl
-	  _LT_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
-	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
-    ])
-
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
-	  lt_cv_dlopen_self_static, [dnl
-	  _LT_TRY_DLOPEN_SELF(
-	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
-	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
-      ])
-    fi
-
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
-    ;;
-  esac
-
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-_LT_DECL([dlopen_support], [enable_dlopen], [0],
-	 [Whether dlopen is supported])
-_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
-	 [Whether dlopen of programs is supported])
-_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
-	 [Whether dlopen of statically linked programs is supported])
-])# LT_SYS_DLOPEN_SELF
-
-# Old name:
-AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
-
-
-# _LT_COMPILER_C_O([TAGNAME])
-# ---------------------------
-# Check to see if options -c and -o are simultaneously supported by compiler.
-# This macro does not hard code the compiler like AC_PROG_CC_C_O.
-m4_defun([_LT_COMPILER_C_O],
-[m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
-  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
-  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&AS_MESSAGE_LOG_FD
-   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-     fi
-   fi
-   chmod u+w . 2>&AS_MESSAGE_LOG_FD
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
-])
-_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
-	[Does compiler simultaneously support -c and -o options?])
-])# _LT_COMPILER_C_O
-
-
-# _LT_COMPILER_FILE_LOCKS([TAGNAME])
-# ----------------------------------
-# Check to see if we can do hard links to lock some files if needed
-m4_defun([_LT_COMPILER_FILE_LOCKS],
-[m4_require([_LT_ENABLE_LOCK])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-_LT_COMPILER_C_O([$1])
-
-hard_links="nottested"
-if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  AC_MSG_CHECKING([if we can lock with hard links])
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  AC_MSG_RESULT([$hard_links])
-  if test "$hard_links" = no; then
-    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
-    need_locks=warn
-  fi
-else
-  need_locks=no
-fi
-_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
-])# _LT_COMPILER_FILE_LOCKS
-
-
-# _LT_CHECK_OBJDIR
-# ----------------
-m4_defun([_LT_CHECK_OBJDIR],
-[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
-[rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null])
-objdir=$lt_cv_objdir
-_LT_DECL([], [objdir], [0],
-         [The name of the directory that contains temporary libtool files])dnl
-m4_pattern_allow([LT_OBJDIR])dnl
-AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
-  [Define to the sub-directory in which libtool stores uninstalled libraries.])
-])# _LT_CHECK_OBJDIR
-
-
-# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
-# --------------------------------------
-# Check hardcoding attributes.
-m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
-[AC_MSG_CHECKING([how to hardcode library paths into programs])
-_LT_TAGVAR(hardcode_action, $1)=
-if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
-   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
-   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
-
-  # We can hardcode non-existent directories.
-  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
-     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
-    # Linking always hardcodes the temporary library directory.
-    _LT_TAGVAR(hardcode_action, $1)=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    _LT_TAGVAR(hardcode_action, $1)=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  _LT_TAGVAR(hardcode_action, $1)=unsupported
-fi
-AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
-
-if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
-   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
-_LT_TAGDECL([], [hardcode_action], [0],
-    [How to hardcode a shared library path into an executable])
-])# _LT_LINKER_HARDCODE_LIBPATH
-
-
-# _LT_CMD_STRIPLIB
-# ----------------
-m4_defun([_LT_CMD_STRIPLIB],
-[m4_require([_LT_DECL_EGREP])
-striplib=
-old_striplib=
-AC_MSG_CHECKING([whether stripping libraries is possible])
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  AC_MSG_RESULT([yes])
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      AC_MSG_RESULT([yes])
-    else
-      AC_MSG_RESULT([no])
-    fi
-    ;;
-  *)
-    AC_MSG_RESULT([no])
-    ;;
-  esac
-fi
-_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
-_LT_DECL([], [striplib], [1])
-])# _LT_CMD_STRIPLIB
-
-
-# _LT_SYS_DYNAMIC_LINKER([TAG])
-# -----------------------------
-# PORTME Fill in your ld.so characteristics
-m4_defun([_LT_SYS_DYNAMIC_LINKER],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_OBJDUMP])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-AC_MSG_CHECKING([dynamic linker characteristics])
-m4_if([$1],
-	[], [
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
-  case $lt_search_path_spec in
-  *\;*)
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
-    ;;
-  *)
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
-    ;;
-  esac
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
-  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
-}'`
-  # AWK program above erroneously prepends '/' to C:/dos/paths
-  # for these hosts.
-  case $host_os in
-    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
-  esac
-  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
-else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-fi])
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[[4-9]]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[[01]] | aix4.[[01]].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
-      else
-	can_build_shared=no
-      fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
-
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
-
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
-
-bsdi[[45]]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
-
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
-
-  case $GCC,$cc_basename in
-  yes,*)
-    # gcc
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-m4_if([$1], [],[
-      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    dynamic_linker='Win32 ld.exe'
-    ;;
-
-  *,cl*)
-    # Native MSVC
-    libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
-
-    case $build_os in
-    mingw*)
-      sys_lib_search_path_spec=
-      lt_save_ifs=$IFS
-      IFS=';'
-      for lt_path in $LIB
-      do
-        IFS=$lt_save_ifs
-        # Let DOS variable expansion print the short 8.3 style file name.
-        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
-        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
-      done
-      IFS=$lt_save_ifs
-      # Convert to MSYS style.
-      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
-      ;;
-    cygwin*)
-      # Convert to unix form, then to dos form, then back to unix form
-      # but this time dos style (no spaces!) so that the unix form looks
-      # like /cygdrive/c/PROGRA~1:/cygdr...
-      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
-      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
-      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
-      ;;
-    *)
-      sys_lib_search_path_spec="$LIB"
-      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
-        # It is most probably a Windows format PATH.
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      # FIXME: find the short name or the path components, as spaces are
-      # common. (e.g. "Program Files" -> "PROGRA~1")
-      ;;
-    esac
-
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-    dynamic_linker='Win32 link.exe'
-    ;;
-
-  *)
-    # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    dynamic_linker='Win32 ld.exe'
-    ;;
-  esac
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
-
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
-m4_if([$1], [],[
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
-
-dgux*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[[23]].*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2.*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
-  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
-
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-haiku*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
-  hardcode_into_libs=yes
-  ;;
-
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
-  postinstall_cmds='chmod 555 $lib'
-  # or fails outright, so override atomically:
-  install_override_mode=555
-  ;;
-
-interix[[3-9]]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux # correct to gnu/linux during the next big refactor
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-
-  # Some binutils ld are patched to set DT_RUNPATH
-  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
-    [lt_cv_shlibpath_overrides_runpath=no
-    save_LDFLAGS=$LDFLAGS
-    save_libdir=$libdir
-    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
-	 LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
-    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
-	 [lt_cv_shlibpath_overrides_runpath=yes])])
-    LDFLAGS=$save_LDFLAGS
-    libdir=$save_libdir
-    ])
-  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
-
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
-
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
-
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
-
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
-
-newsos6)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
-
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
-
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[[89]] | openbsd2.[[89]].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
-
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
-
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
-
-rdos*)
-  dynamic_linker=no
-  ;;
-
-solaris*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
-
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
-
-sysv4 | sysv4.3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
-
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
-
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
-uts4*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
-
-*)
-  dynamic_linker=no
-  ;;
-esac
-AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
-
-_LT_DECL([], [variables_saved_for_relink], [1],
-    [Variables whose values should be saved in libtool wrapper scripts and
-    restored at link time])
-_LT_DECL([], [need_lib_prefix], [0],
-    [Do we need the "lib" prefix for modules?])
-_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
-_LT_DECL([], [version_type], [0], [Library versioning type])
-_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
-_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
-_LT_DECL([], [shlibpath_overrides_runpath], [0],
-    [Is shlibpath searched before the hard-coded library search path?])
-_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
-_LT_DECL([], [library_names_spec], [1],
-    [[List of archive names.  First name is the real one, the rest are links.
-    The last name is the one that the linker finds with -lNAME]])
-_LT_DECL([], [soname_spec], [1],
-    [[The coded name of the library, if different from the real name]])
-_LT_DECL([], [install_override_mode], [1],
-    [Permission mode override for installation of shared libraries])
-_LT_DECL([], [postinstall_cmds], [2],
-    [Command to use after installation of a shared archive])
-_LT_DECL([], [postuninstall_cmds], [2],
-    [Command to use after uninstallation of a shared archive])
-_LT_DECL([], [finish_cmds], [2],
-    [Commands used to finish a libtool library installation in a directory])
-_LT_DECL([], [finish_eval], [1],
-    [[As "finish_cmds", except a single script fragment to be evaled but
-    not shown]])
-_LT_DECL([], [hardcode_into_libs], [0],
-    [Whether we should hardcode library paths into libraries])
-_LT_DECL([], [sys_lib_search_path_spec], [2],
-    [Compile-time system search path for libraries])
-_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
-    [Run-time system search path for libraries])
-])# _LT_SYS_DYNAMIC_LINKER
-
-
-# _LT_PATH_TOOL_PREFIX(TOOL)
-# --------------------------
-# find a file program which can recognize shared library
-AC_DEFUN([_LT_PATH_TOOL_PREFIX],
-[m4_require([_LT_DECL_EGREP])dnl
-AC_MSG_CHECKING([for $1])
-AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
-[case $MAGIC_CMD in
-[[\\/*] |  ?:[\\/]*])
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-dnl $ac_dummy forces splitting on constant user-supplied paths.
-dnl POSIX.2 word splitting is done only on the output of word expansions,
-dnl not every word.  This closes a longstanding sh security hole.
-  ac_dummy="m4_if([$2], , $PATH, [$2])"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$1; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
-  done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  AC_MSG_RESULT($MAGIC_CMD)
-else
-  AC_MSG_RESULT(no)
-fi
-_LT_DECL([], [MAGIC_CMD], [0],
-	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
-])# _LT_PATH_TOOL_PREFIX
-
-# Old name:
-AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
-
-
-# _LT_PATH_MAGIC
-# --------------
-# find a file program which can recognize a shared library
-m4_defun([_LT_PATH_MAGIC],
-[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
-  else
-    MAGIC_CMD=:
-  fi
-fi
-])# _LT_PATH_MAGIC
-
-
-# LT_PATH_LD
-# ----------
-# find the pathname to the GNU or non-GNU linker
-AC_DEFUN([LT_PATH_LD],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
-
-AC_ARG_WITH([gnu-ld],
-    [AS_HELP_STRING([--with-gnu-ld],
-	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
-    [test "$withval" = no || with_gnu_ld=yes],
-    [with_gnu_ld=no])dnl
-
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  AC_MSG_CHECKING([for ld used by $CC])
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [[\\/]]* | ?:[[\\/]]*)
-      re_direlt='/[[^/]][[^/]]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  AC_MSG_CHECKING([for GNU ld])
-else
-  AC_MSG_CHECKING([for non-GNU ld])
-fi
-AC_CACHE_VAL(lt_cv_path_LD,
-[if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi])
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  AC_MSG_RESULT($LD)
-else
-  AC_MSG_RESULT(no)
-fi
-test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
-_LT_PATH_LD_GNU
-AC_SUBST([LD])
-
-_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
-])# LT_PATH_LD
-
-# Old names:
-AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
-AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_LD], [])
-dnl AC_DEFUN([AC_PROG_LD], [])
-
-
-# _LT_PATH_LD_GNU
-#- --------------
-m4_defun([_LT_PATH_LD_GNU],
-[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
-[# I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac])
-with_gnu_ld=$lt_cv_prog_gnu_ld
-])# _LT_PATH_LD_GNU
-
-
-# _LT_CMD_RELOAD
-# --------------
-# find reload flag for linker
-#   -- PORTME Some linkers may need a different reload flag.
-m4_defun([_LT_CMD_RELOAD],
-[AC_CACHE_CHECK([for $LD option to reload object files],
-  lt_cv_ld_reload_flag,
-  [lt_cv_ld_reload_flag='-r'])
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    if test "$GCC" != yes; then
-      reload_cmds=false
-    fi
-    ;;
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
-    fi
-    ;;
-esac
-_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
-_LT_TAGDECL([], [reload_cmds], [2])dnl
-])# _LT_CMD_RELOAD
-
-
-# _LT_CHECK_MAGIC_METHOD
-# ----------------------
-# how to check for library dependencies
-#  -- PORTME fill in with the dynamic library characteristics
-m4_defun([_LT_CHECK_MAGIC_METHOD],
-[m4_require([_LT_DECL_EGREP])
-m4_require([_LT_DECL_OBJDUMP])
-AC_CACHE_CHECK([how to recognize dependent libraries],
-lt_cv_deplibs_check_method,
-[lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix[[4-9]]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[[45]]*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    # Keep this pattern in sync with the one in func_win32_libid.
-    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc*)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
-
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
-
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-haiku*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
-
-interix[[3-9]]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
-  ;;
-
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-netbsd*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
-  fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
-  else
-    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
-  fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
-
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
-])
-
-file_magic_glob=
-want_nocaseglob=no
-if test "$build" = "$host"; then
-  case $host_os in
-  mingw* | pw32*)
-    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
-      want_nocaseglob=yes
-    else
-      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
-    fi
-    ;;
-  esac
-fi
-
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-_LT_DECL([], [deplibs_check_method], [1],
-    [Method to check whether dependent libraries are shared objects])
-_LT_DECL([], [file_magic_cmd], [1],
-    [Command to use when deplibs_check_method = "file_magic"])
-_LT_DECL([], [file_magic_glob], [1],
-    [How to find potential files when deplibs_check_method = "file_magic"])
-_LT_DECL([], [want_nocaseglob], [1],
-    [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
-])# _LT_CHECK_MAGIC_METHOD
-
-
-# LT_PATH_NM
-# ----------
-# find the pathname to a BSD- or MS-compatible name lister
-AC_DEFUN([LT_PATH_NM],
-[AC_REQUIRE([AC_PROG_CC])dnl
-AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
-[if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
-else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
-fi])
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  if test -n "$DUMPBIN"; then :
-    # Let the user override the test.
-  else
-    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
-    *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
-      ;;
-    *)
-      DUMPBIN=:
-      ;;
-    esac
-  fi
-  AC_SUBST([DUMPBIN])
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
-AC_SUBST([NM])
-_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
-
-AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
-  [lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
-  cat conftest.out >&AS_MESSAGE_LOG_FD
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*])
-])# LT_PATH_NM
-
-# Old names:
-AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
-AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_PROG_NM], [])
-dnl AC_DEFUN([AC_PROG_NM], [])
-
-# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
-# --------------------------------
-# how to determine the name of the shared library
-# associated with a specific link library.
-#  -- PORTME fill in with the dynamic library characteristics
-m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
-[m4_require([_LT_DECL_EGREP])
-m4_require([_LT_DECL_OBJDUMP])
-m4_require([_LT_DECL_DLLTOOL])
-AC_CACHE_CHECK([how to associate runtime and link libraries],
-lt_cv_sharedlib_from_linklib_cmd,
-[lt_cv_sharedlib_from_linklib_cmd='unknown'
-
-case $host_os in
-cygwin* | mingw* | pw32* | cegcc*)
-  # two different shell functions defined in ltmain.sh
-  # decide which to use based on capabilities of $DLLTOOL
-  case `$DLLTOOL --help 2>&1` in
-  *--identify-strict*)
-    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
-    ;;
-  *)
-    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
-    ;;
-  esac
-  ;;
-*)
-  # fallback: assume linklib IS sharedlib
-  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
-  ;;
-esac
-])
-sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
-test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
-
-_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
-    [Command to associate shared and link libraries])
-])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
-
-
-# _LT_PATH_MANIFEST_TOOL
-# ----------------------
-# locate the manifest tool
-m4_defun([_LT_PATH_MANIFEST_TOOL],
-[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
-test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
-AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
-  [lt_cv_path_mainfest_tool=no
-  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
-  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
-  cat conftest.err >&AS_MESSAGE_LOG_FD
-  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
-    lt_cv_path_mainfest_tool=yes
-  fi
-  rm -f conftest*])
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
-  MANIFEST_TOOL=:
-fi
-_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
-])# _LT_PATH_MANIFEST_TOOL
-
-
-# LT_LIB_M
-# --------
-# check for math library
-AC_DEFUN([LT_LIB_M],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-LIBM=
-case $host in
-*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
-  # These system don't have libm, or don't need it
-  ;;
-*-ncr-sysv4.3*)
-  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
-  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
-  ;;
-*)
-  AC_CHECK_LIB(m, cos, LIBM="-lm")
-  ;;
-esac
-AC_SUBST([LIBM])
-])# LT_LIB_M
-
-# Old name:
-AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_CHECK_LIBM], [])
-
-
-# _LT_COMPILER_NO_RTTI([TAGNAME])
-# -------------------------------
-m4_defun([_LT_COMPILER_NO_RTTI],
-[m4_require([_LT_TAG_COMPILER])dnl
-
-_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-
-if test "$GCC" = yes; then
-  case $cc_basename in
-  nvcc*)
-    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
-  *)
-    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
-  esac
-
-  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
-    lt_cv_prog_compiler_rtti_exceptions,
-    [-fno-rtti -fno-exceptions], [],
-    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
-fi
-_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
-	[Compiler flag to turn off builtin functions])
-])# _LT_COMPILER_NO_RTTI
-
-
-# _LT_CMD_GLOBAL_SYMBOLS
-# ----------------------
-m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-AC_REQUIRE([LT_PATH_LD])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-AC_MSG_CHECKING([command to parse $NM output from $compiler object])
-AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
-[
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[[BCDEGRST]]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
-
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[[BCDT]]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[[ABCDGISTW]]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[[ABCDEGRST]]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[[BCDEGRST]]'
-  ;;
-osf*)
-  symcode='[[BCDEGQRST]]'
-  ;;
-solaris*)
-  symcode='[[BDRT]]'
-  ;;
-sco3.2v5*)
-  symcode='[[DT]]'
-  ;;
-sysv4.2uw2*)
-  symcode='[[DT]]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[[ABDT]]'
-  ;;
-sysv4)
-  symcode='[[DFNSTU]]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[[ABCDGIRSTW]]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
-  ;;
-esac
-
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK ['"\
-"     {last_section=section; section=\$ 3};"\
-"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx]"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
-
-  if AC_TRY_EVAL(ac_compile); then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
-
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
-   relocations are performed -- see ld's documentation on pseudo-relocs.  */
-# define LT@&t at _DLSYM_CONST
-#elif defined(__osf__)
-/* This system does not cope well with relocations in const data.  */
-# define LT@&t at _DLSYM_CONST
-#else
-# define LT@&t at _DLSYM_CONST const
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
-
-	  cat <<_LT_EOF >> conftest.$ac_ext
-
-/* The mapping between symbol names and symbols.  */
-LT@&t at _DLSYM_CONST struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[[]] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_globsym_save_LIBS=$LIBS
-	  lt_globsym_save_CFLAGS=$CFLAGS
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
-	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS=$lt_globsym_save_LIBS
-	  CFLAGS=$lt_globsym_save_CFLAGS
-	else
-	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
-    fi
-  else
-    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
-    cat conftest.$ac_ext >&5
-  fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
-  else
-    lt_cv_sys_global_symbol_pipe=
-  fi
-done
-])
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
-fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  AC_MSG_RESULT(failed)
-else
-  AC_MSG_RESULT(ok)
-fi
-
-# Response file support.
-if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-  nm_file_list_spec='@'
-elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
-  nm_file_list_spec='@'
-fi
-
-_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
-    [Take the output of nm and produce a listing of raw symbols and C names])
-_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
-    [Transform the output of nm in a proper C declaration])
-_LT_DECL([global_symbol_to_c_name_address],
-    [lt_cv_sys_global_symbol_to_c_name_address], [1],
-    [Transform the output of nm in a C name address pair])
-_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
-    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
-    [Transform the output of nm in a C name address pair when lib prefix is needed])
-_LT_DECL([], [nm_file_list_spec], [1],
-    [Specify filename containing input files for $NM])
-]) # _LT_CMD_GLOBAL_SYMBOLS
-
-
-# _LT_COMPILER_PIC([TAGNAME])
-# ---------------------------
-m4_defun([_LT_COMPILER_PIC],
-[m4_require([_LT_TAG_COMPILER])dnl
-_LT_TAGVAR(lt_prog_compiler_wl, $1)=
-_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-_LT_TAGVAR(lt_prog_compiler_static, $1)=
-
-m4_if([$1], [CXX], [
-  # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
-    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-    aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-    mingw* | cygwin* | os2* | pw32* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-    *djgpp*)
-      # DJGPP does not support shared libraries at all
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-      ;;
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)=
-      ;;
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-    *qnx* | *nto*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-    *)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-  else
-    case $host_os in
-      aix[[4-9]]*)
-	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
-	  # AIX 5 now supports IA64 processor
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	else
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-	fi
-	;;
-      chorus*)
-	case $cc_basename in
-	cxch68*)
-	  # Green Hills C++ Compiler
-	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
-	  ;;
-	esac
-	;;
-      mingw* | cygwin* | os2* | pw32* | cegcc*)
-	# This hack is so that the source file can tell whether it is being
-	# built for inclusion in a dll (and should export symbols for example).
-	m4_if([$1], [GCJ], [],
-	  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-	;;
-      dgux*)
-	case $cc_basename in
-	  ec++*)
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  ghcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      freebsd* | dragonfly*)
-	# FreeBSD uses GNU C++
-	;;
-      hpux9* | hpux10* | hpux11*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	    fi
-	    ;;
-	  aCC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    case $host_cpu in
-	    hppa*64*|ia64*)
-	      # +Z the default
-	      ;;
-	    *)
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	      ;;
-	    esac
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      interix*)
-	# This is c89, which is MS Visual C++ (no shared libs)
-	# Anyone wants to do a port?
-	;;
-      irix5* | irix6* | nonstopux*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    # CC pic flag -KPIC is the default.
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-	case $cc_basename in
-	  KCC*)
-	    # KAI C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    ;;
-	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  icpc* )
-	    # Intel C++, used to be incompatible with GCC.
-	    # ICC 10 doesn't accept -KPIC any more.
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	    ;;
-	  pgCC* | pgcpp*)
-	    # Portland Group C++ compiler
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  cxx*)
-	    # Compaq C++
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
-	    # IBM XL 8.0, 9.0 on PPC and BlueGene
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-      lynxos*)
-	;;
-      m88k*)
-	;;
-      mvs*)
-	case $cc_basename in
-	  cxx*)
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      netbsd*)
-	;;
-      *qnx* | *nto*)
-        # QNX uses GNU C++, but need to define -shared option too, otherwise
-        # it will coredump.
-        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-        ;;
-      osf3* | osf4* | osf5*)
-	case $cc_basename in
-	  KCC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
-	    ;;
-	  RCC*)
-	    # Rational C++ 2.4.1
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  cxx*)
-	    # Digital/Compaq C++
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    # Make sure the PIC flag is empty.  It appears that all Alpha
-	    # Linux and Compaq Tru64 Unix objects are PIC.
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      psos*)
-	;;
-      solaris*)
-	case $cc_basename in
-	  CC* | sunCC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	    ;;
-	  gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sunos4*)
-	case $cc_basename in
-	  CC*)
-	    # Sun C++ 4.x
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	  lcc*)
-	    # Lucid
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-	case $cc_basename in
-	  CC*)
-	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	    ;;
-	esac
-	;;
-      tandem*)
-	case $cc_basename in
-	  NCC*)
-	    # NonStop-UX NCC 3.20
-	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	    ;;
-	  *)
-	    ;;
-	esac
-	;;
-      vxworks*)
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-	;;
-    esac
-  fi
-],
-[
-  if test "$GCC" = yes; then
-    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
-
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
-      ;;
-
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)=
-      ;;
-
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	;;
-      esac
-      ;;
-
-    interix[[3-9]]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
-
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      enable_shared=no
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
-      fi
-      ;;
-
-    *)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-      ;;
-    esac
-
-    case $cc_basename in
-    nvcc*) # Cuda Compiler Driver 2.2
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
-      if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
-        _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
-      fi
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      else
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
-
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      m4_if([$1], [GCJ], [],
-	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
-      ;;
-
-    hpux9* | hpux10* | hpux11*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # PIC (with -KPIC) is the default.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
-	;;
-      nagfor*)
-	# NAG Fortran compiler
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-        ;;
-      ccc*)
-        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-        # All Alpha code is PIC.
-        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-        ;;
-      xl* | bgxl* | bgf* | mpixl*)
-	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
-	  ;;
-	*Sun\ F* | *Sun*Fortran*)
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-	  ;;
-	*Sun\ C*)
-	  # Sun C 5.9
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	  ;;
-        *Intel*\ [[CF]]*Compiler*)
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
-	  ;;
-	*Portland\ Group*)
-	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
-	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-	  ;;
-	esac
-	;;
-      esac
-      ;;
-
-    newsos6)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
-      ;;
-
-    osf3* | osf4* | osf5*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      # All OSF/1 code is PIC.
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    rdos*)
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
-      ;;
-
-    solaris*)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
-      *)
-	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
-	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      fi
-      ;;
-
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    unicos*)
-      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-
-    uts4*)
-      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
-      ;;
-
-    *)
-      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
-      ;;
-    esac
-  fi
-])
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
-    ;;
-  *)
-    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
-    ;;
-esac
-
-AC_CACHE_CHECK([for $compiler option to produce PIC],
-  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
-  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
-_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
-
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
-  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
-    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
-    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
-    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
-     "" | " "*) ;;
-     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
-     esac],
-    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
-     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
-fi
-_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
-	[Additional compiler flags for building library objects])
-
-_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
-	[How to pass a linker flag through the compiler])
-#
-# Check to make sure the static flag actually works.
-#
-wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
-_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
-  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
-  $lt_tmp_static_flag,
-  [],
-  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
-_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
-	[Compiler flag to prevent dynamic linking])
-])# _LT_COMPILER_PIC
-
-
-# _LT_LINKER_SHLIBS([TAGNAME])
-# ----------------------------
-# See if the linker supports building shared libraries.
-m4_defun([_LT_LINKER_SHLIBS],
-[AC_REQUIRE([LT_PATH_LD])dnl
-AC_REQUIRE([LT_PATH_NM])dnl
-m4_require([_LT_PATH_MANIFEST_TOOL])dnl
-m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_DECL_SED])dnl
-m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-m4_require([_LT_TAG_COMPILER])dnl
-AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-m4_if([$1], [CXX], [
-  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-  case $host_os in
-  aix[[4-9]]*)
-    # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    # Also, AIX nm treats weak defined symbols like other global defined
-    # symbols, whereas GNU nm marks them as "W".
-    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    else
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-    fi
-    ;;
-  pw32*)
-    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
-    ;;
-  cygwin* | mingw* | cegcc*)
-    case $cc_basename in
-    cl*)
-      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
-      ;;
-    *)
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
-      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
-      ;;
-    esac
-    ;;
-  *)
-    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-    ;;
-  esac
-], [
-  runpath_var=
-  _LT_TAGVAR(allow_undefined_flag, $1)=
-  _LT_TAGVAR(always_export_symbols, $1)=no
-  _LT_TAGVAR(archive_cmds, $1)=
-  _LT_TAGVAR(archive_expsym_cmds, $1)=
-  _LT_TAGVAR(compiler_needs_object, $1)=no
-  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
-  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  _LT_TAGVAR(hardcode_automatic, $1)=no
-  _LT_TAGVAR(hardcode_direct, $1)=no
-  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
-  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-  _LT_TAGVAR(hardcode_libdir_separator, $1)=
-  _LT_TAGVAR(hardcode_minus_L, $1)=no
-  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  _LT_TAGVAR(inherit_rpath, $1)=no
-  _LT_TAGVAR(link_all_deplibs, $1)=unknown
-  _LT_TAGVAR(module_cmds, $1)=
-  _LT_TAGVAR(module_expsym_cmds, $1)=
-  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
-  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
-  _LT_TAGVAR(thread_safe_flag_spec, $1)=
-  _LT_TAGVAR(whole_archive_flag_spec, $1)=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  _LT_TAGVAR(include_expsyms, $1)=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-dnl Note also adjust exclude_expsyms for C++ above.
-  extract_expsyms_cmds=
-
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
-
-  _LT_TAGVAR(ld_shlibs, $1)=yes
-
-  # On some targets, GNU ld is compatible enough with the native linker
-  # that we're better off using the native interface for both.
-  lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
-    case $host_os in
-      aix*)
-	# The AIX port of GNU ld has always aspired to compatibility
-	# with the native linker.  However, as the warning in the GNU ld
-	# block says, versions before 2.19.5* couldn't really create working
-	# shared libraries, regardless of the interface used.
-	case `$LD -v 2>&1` in
-	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
-	  *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
-	  *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
-	  *)
-	    lt_use_gnu_ld_interface=yes
-	    ;;
-	esac
-	;;
-      *)
-	lt_use_gnu_ld_interface=yes
-	;;
-    esac
-  fi
-
-  if test "$lt_use_gnu_ld_interface" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      _LT_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[[3-9]]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            _LT_TAGVAR(archive_expsym_cmds, $1)=''
-        ;;
-      m68k)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-      # as there is no search path for DLLs.
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(always_export_symbols, $1)=no
-      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
-      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    haiku*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    interix[[3-9]]*)
-      _LT_TAGVAR(hardcode_direct, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=' $pic_flag'
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95* | pgfortran*)
-					# Portland Group f77 and f90 compilers
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
-	  tmp_sharedflag='--shared' ;;
-	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	nvcc*)	# Cuda Compiler Driver 2.2
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  _LT_TAGVAR(compiler_needs_object, $1)=yes
-	  ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  _LT_TAGVAR(compiler_needs_object, $1)=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf* | bgf* | bgxlf* | mpixlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        _LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-    esac
-
-    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
-      runpath_var=
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
-      _LT_TAGVAR(whole_archive_flag_spec, $1)=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(always_export_symbols, $1)=yes
-      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	_LT_TAGVAR(hardcode_direct, $1)=unsupported
-      fi
-      ;;
-
-    aix[[4-9]]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      _LT_TAGVAR(archive_cmds, $1)=''
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[[012]]|aix4.[[012]].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      _LT_TAGVAR(always_export_symbols, $1)=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        _LT_SYS_MODULE_PATH_AIX([$1])
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 _LT_SYS_MODULE_PATH_AIX([$1])
-	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
-	    # We only use this code for GNU lds that support --whole-archive.
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	  else
-	    # Exported symbols can be pulled into shared objects from archives
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	  fi
-	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            _LT_TAGVAR(archive_expsym_cmds, $1)=''
-        ;;
-      m68k)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes
-        ;;
-      esac
-      ;;
-
-    bsdi[[45]]*)
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      case $cc_basename in
-      cl*)
-	# Native MSVC
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
-	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	_LT_TAGVAR(always_export_symbols, $1)=yes
-	_LT_TAGVAR(file_list_spec, $1)='@'
-	# Tell ltmain to make .lib files, not .a files.
-	libext=lib
-	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
-	# FIXME: Setting linknames here is a bad hack.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	  else
-	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	  fi~
-	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	  linknames='
-	# The linker will not automatically build a static lib if we build a DLL.
-	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
-	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-	_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
-	_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
-	# Don't use ranlib
-	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
-	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
-	  lt_tool_outputfile="@TOOL_OUTPUT@"~
-	  case $lt_outputfile in
-	    *.exe|*.EXE) ;;
-	    *)
-	      lt_outputfile="$lt_outputfile.exe"
-	      lt_tool_outputfile="$lt_tool_outputfile.exe"
-	      ;;
-	  esac~
-	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	    $RM "$lt_outputfile.manifest";
-	  fi'
-	;;
-      *)
-	# Assume MSVC wrapper
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
-	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	# Tell ltmain to make .lib files, not .a files.
-	libext=lib
-	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
-	# FIXME: Setting linknames here is a bad hack.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
-	# The linker will automatically build a .lib file if we build a DLL.
-	_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
-	# FIXME: Should let the user specify the lib program.
-	_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
-	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-	;;
-      esac
-      ;;
-
-    darwin* | rhapsody*)
-      _LT_DARWIN_LINKER_FEATURES($1)
-      ;;
-
-    dgux*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2.*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
-	_LT_TAGVAR(hardcode_direct, $1)=yes
-	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	_LT_TAGVAR(hardcode_minus_L, $1)=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	m4_if($1, [], [
-	  # Older versions of the 11.00 compiler do not understand -b yet
-	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
-	  _LT_LINKER_OPTION([if $CC understands -b],
-	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
-	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
-	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
-	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  _LT_TAGVAR(hardcode_direct, $1)=no
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  ;;
-	*)
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-	# This should be the same for all languages, so no per-tag cache variable.
-	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
-	  [lt_cv_irix_exported_symbol],
-	  [save_LDFLAGS="$LDFLAGS"
-	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-	   AC_LINK_IFELSE(
-	     [AC_LANG_SOURCE(
-	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
-			      [C++], [[int foo (void) { return 0; }]],
-			      [Fortran 77], [[
-      subroutine foo
-      end]],
-			      [Fortran], [[
-      subroutine foo
-      end]])])],
-	      [lt_cv_irix_exported_symbol=yes],
-	      [lt_cv_irix_exported_symbol=no])
-           LDFLAGS="$save_LDFLAGS"])
-	if test "$lt_cv_irix_exported_symbol" = yes; then
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-	fi
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(inherit_rpath, $1)=yes
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    newsos6)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *nto* | *qnx*)
-      ;;
-
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	_LT_TAGVAR(hardcode_direct, $1)=yes
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
-	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	     ;;
-	   *)
-	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	_LT_TAGVAR(ld_shlibs, $1)=no
-      fi
-      ;;
-
-    os2*)
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
-
-    osf3*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-      else
-	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-      fi
-      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-      ;;
-
-    solaris*)
-      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      case $host_os in
-      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      ;;
-
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
-	  _LT_TAGVAR(hardcode_direct, $1)=no
-        ;;
-	motorola)
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    sysv4.3*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
-      ;;
-
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	_LT_TAGVAR(ld_shlibs, $1)=yes
-      fi
-      ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
-      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-      _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
-
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
-
-    uts4*)
-      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      ;;
-
-    *)
-      _LT_TAGVAR(ld_shlibs, $1)=no
-      ;;
-    esac
-
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
-])
-AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
-
-_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
-_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
-_LT_DECL([], [extract_expsyms_cmds], [2],
-    [The commands to extract the exported symbol list from a shared archive])
-
-#
-# Do we need to explicitly link libc?
-#
-case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
-x|xyes)
-  # Assume -lc should be added
-  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $_LT_TAGVAR(archive_cmds, $1) in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
-	[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
-	[$RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-
-	if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
-	  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
-	  _LT_TAGVAR(allow_undefined_flag, $1)=
-	  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
-	  then
-	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	  else
-	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  fi
-	  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
-	fi
-	$RM conftest*
-	])
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
-    [Whether or not to add -lc for building shared libraries])
-_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
-    [enable_shared_with_static_runtimes], [0],
-    [Whether or not to disallow shared libs when runtime libs are static])
-_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
-    [Compiler flag to allow reflexive dlopens])
-_LT_TAGDECL([], [whole_archive_flag_spec], [1],
-    [Compiler flag to generate shared objects directly from archives])
-_LT_TAGDECL([], [compiler_needs_object], [1],
-    [Whether the compiler copes with passing no objects directly])
-_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
-    [Create an old-style archive from a shared archive])
-_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
-    [Create a temporary old-style archive to link instead of a shared archive])
-_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
-_LT_TAGDECL([], [archive_expsym_cmds], [2])
-_LT_TAGDECL([], [module_cmds], [2],
-    [Commands used to build a loadable module if different from building
-    a shared archive.])
-_LT_TAGDECL([], [module_expsym_cmds], [2])
-_LT_TAGDECL([], [with_gnu_ld], [1],
-    [Whether we are building with GNU ld or not])
-_LT_TAGDECL([], [allow_undefined_flag], [1],
-    [Flag that allows shared libraries with undefined symbols to be built])
-_LT_TAGDECL([], [no_undefined_flag], [1],
-    [Flag that enforces no undefined symbols])
-_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
-    [Flag to hardcode $libdir into a binary during linking.
-    This must work even if $libdir does not exist])
-_LT_TAGDECL([], [hardcode_libdir_separator], [1],
-    [Whether we need a single "-rpath" flag with a separated argument])
-_LT_TAGDECL([], [hardcode_direct], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
-    DIR into the resulting binary])
-_LT_TAGDECL([], [hardcode_direct_absolute], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
-    DIR into the resulting binary and the resulting library dependency is
-    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
-    library is relocated])
-_LT_TAGDECL([], [hardcode_minus_L], [0],
-    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
-    into the resulting binary])
-_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
-    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
-    into the resulting binary])
-_LT_TAGDECL([], [hardcode_automatic], [0],
-    [Set to "yes" if building a shared library automatically hardcodes DIR
-    into the library and all subsequent libraries and executables linked
-    against it])
-_LT_TAGDECL([], [inherit_rpath], [0],
-    [Set to yes if linker adds runtime paths of dependent libraries
-    to runtime path list])
-_LT_TAGDECL([], [link_all_deplibs], [0],
-    [Whether libtool must link a program against all its dependency libraries])
-_LT_TAGDECL([], [always_export_symbols], [0],
-    [Set to "yes" if exported symbols are required])
-_LT_TAGDECL([], [export_symbols_cmds], [2],
-    [The commands to list exported symbols])
-_LT_TAGDECL([], [exclude_expsyms], [1],
-    [Symbols that should not be listed in the preloaded symbols])
-_LT_TAGDECL([], [include_expsyms], [1],
-    [Symbols that must always be exported])
-_LT_TAGDECL([], [prelink_cmds], [2],
-    [Commands necessary for linking programs (against libraries) with templates])
-_LT_TAGDECL([], [postlink_cmds], [2],
-    [Commands necessary for finishing linking programs])
-_LT_TAGDECL([], [file_list_spec], [1],
-    [Specify filename containing input files])
-dnl FIXME: Not yet implemented
-dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
-dnl    [Compiler flag to generate thread safe objects])
-])# _LT_LINKER_SHLIBS
-
-
-# _LT_LANG_C_CONFIG([TAG])
-# ------------------------
-# Ensure that the configuration variables for a C compiler are suitably
-# defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_C_CONFIG],
-[m4_require([_LT_DECL_EGREP])dnl
-lt_save_CC="$CC"
-AC_LANG_PUSH(C)
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-_LT_TAG_COMPILER
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_SYS_DYNAMIC_LINKER($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-  LT_SYS_DLOPEN_SELF
-  _LT_CMD_STRIPLIB
-
-  # Report which library types will actually be built
-  AC_MSG_CHECKING([if libtool supports shared libraries])
-  AC_MSG_RESULT([$can_build_shared])
-
-  AC_MSG_CHECKING([whether to build shared libraries])
-  test "$can_build_shared" = "no" && enable_shared=no
-
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
-  case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
-    ;;
-
-  aix[[4-9]]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
-    ;;
-  esac
-  AC_MSG_RESULT([$enable_shared])
-
-  AC_MSG_CHECKING([whether to build static libraries])
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  AC_MSG_RESULT([$enable_static])
-
-  _LT_CONFIG($1)
-fi
-AC_LANG_POP
-CC="$lt_save_CC"
-])# _LT_LANG_C_CONFIG
-
-
-# _LT_LANG_CXX_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a C++ compiler are suitably
-# defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_CXX_CONFIG],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-m4_require([_LT_DECL_EGREP])dnl
-m4_require([_LT_PATH_MANIFEST_TOOL])dnl
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  AC_PROG_CXXCPP
-else
-  _lt_caught_CXX_error=yes
-fi
-
-AC_LANG_PUSH(C++)
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(compiler_needs_object, $1)=no
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for C++ test sources.
-ac_ext=cpp
-
-# Object file extension for compiled C++ test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the CXX compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="int some_variable = 0;"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC=$CC
-  lt_save_CFLAGS=$CFLAGS
-  lt_save_LD=$LD
-  lt_save_GCC=$GCC
-  GCC=$GXX
-  lt_save_with_gnu_ld=$with_gnu_ld
-  lt_save_path_LD=$lt_cv_path_LD
-  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
-  else
-    $as_unset lt_cv_prog_gnu_ld
-  fi
-  if test -n "${lt_cv_path_LDCXX+set}"; then
-    lt_cv_path_LD=$lt_cv_path_LDCXX
-  else
-    $as_unset lt_cv_path_LD
-  fi
-  test -z "${LDCXX+set}" || LD=$LDCXX
-  CC=${CXX-"c++"}
-  CFLAGS=$CXXFLAGS
-  compiler=$CC
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-
-  if test -n "$compiler"; then
-    # We don't want -fno-exception when compiling C++ code, so set the
-    # no_builtin_flag separately
-    if test "$GXX" = yes; then
-      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
-    else
-      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
-    fi
-
-    if test "$GXX" = yes; then
-      # Set up default GNU C++ configuration
-
-      LT_PATH_LD
-
-      # Check if GNU C++ uses GNU ld as the underlying linker, since the
-      # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-        # If archive_cmds runs LD, not CC, wlarc should be empty
-        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-        #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
-
-        # ancient GNU ld didn't support --whole-archive et. al.
-        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
-	  $GREP 'no-whole-archive' > /dev/null; then
-          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-        else
-          _LT_TAGVAR(whole_archive_flag_spec, $1)=
-        fi
-      else
-        with_gnu_ld=no
-        wlarc=
-
-        # A generic and very simple default shared library creation
-        # command for GNU C++ for the case where it uses the native
-        # linker, instead of GNU ld.  If possible, this setting should
-        # overridden to take advantage of the native linker features on
-        # the platform it is being used on.
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-      fi
-
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-    else
-      GXX=no
-      with_gnu_ld=no
-      wlarc=
-    fi
-
-    # PORTME: fill in a description of your system's C++ link characteristics
-    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
-    _LT_TAGVAR(ld_shlibs, $1)=yes
-    case $host_os in
-      aix3*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-      aix[[4-9]]*)
-        if test "$host_cpu" = ia64; then
-          # On IA64, the linker does run time linking by default, so we don't
-          # have to do anything special.
-          aix_use_runtimelinking=no
-          exp_sym_flag='-Bexport'
-          no_entry_flag=""
-        else
-          aix_use_runtimelinking=no
-
-          # Test if we are trying to use run time linking or normal
-          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
-          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
-	    for ld_flag in $LDFLAGS; do
-	      case $ld_flag in
-	      *-brtl*)
-	        aix_use_runtimelinking=yes
-	        break
-	        ;;
-	      esac
-	    done
-	    ;;
-          esac
-
-          exp_sym_flag='-bexport'
-          no_entry_flag='-bnoentry'
-        fi
-
-        # When large executables or shared objects are built, AIX ld can
-        # have problems creating the table of contents.  If linking a library
-        # or program results in "error TOC overflow" add -mminimal-toc to
-        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-        _LT_TAGVAR(archive_cmds, $1)=''
-        _LT_TAGVAR(hardcode_direct, $1)=yes
-        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-        _LT_TAGVAR(link_all_deplibs, $1)=yes
-        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
-
-        if test "$GXX" = yes; then
-          case $host_os in aix4.[[012]]|aix4.[[012]].*)
-          # We only want to do this on AIX 4.2 and lower, the check
-          # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	    # We have reworked collect2
-	    :
-	  else
-	    # We have old collect2
-	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
-	    # It fails to find uninstalled libraries when the uninstalled
-	    # path is not listed in the libpath.  Setting hardcode_minus_L
-	    # to unsupported forces relinking
-	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
-	  fi
-          esac
-          shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
-	  fi
-        else
-          # not using gcc
-          if test "$host_cpu" = ia64; then
-	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	  # chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-          else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
-	    else
-	      shared_flag='${wl}-bM:SRE'
-	    fi
-          fi
-        fi
-
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
-        # It seems that -bexpall does not export symbols beginning with
-        # underscore (_), so it is better to generate a list of symbols to
-	# export.
-        _LT_TAGVAR(always_export_symbols, $1)=yes
-        if test "$aix_use_runtimelinking" = yes; then
-          # Warning - without using the other runtime loading flags (-brtl),
-          # -berok will link without error, but may produce a broken library.
-          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
-          # Determine the default libpath from the value encoded in an empty
-          # executable.
-          _LT_SYS_MODULE_PATH_AIX([$1])
-          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-        else
-          if test "$host_cpu" = ia64; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
-	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-          else
-	    # Determine the default libpath from the value encoded in an
-	    # empty executable.
-	    _LT_SYS_MODULE_PATH_AIX([$1])
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-	    # Warning - without using the other run time loading flags,
-	    # -berok will link without error, but may produce a broken library.
-	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	    if test "$with_gnu_ld" = yes; then
-	      # We only use this code for GNU lds that support --whole-archive.
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    else
-	      # Exported symbols can be pulled into shared objects from archives
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
-	    fi
-	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-          fi
-        fi
-        ;;
-
-      beos*)
-	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	  # support --undefined.  This deserves some investigation.  FIXME
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	else
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-
-      chorus*)
-        case $cc_basename in
-          *)
-	  # FIXME: insert proper C++ library support
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	  ;;
-        esac
-        ;;
-
-      cygwin* | mingw* | pw32* | cegcc*)
-	case $GXX,$cc_basename in
-	,cl* | no,cl*)
-	  # Native MSVC
-	  # hardcode_libdir_flag_spec is actually meaningless, as there is
-	  # no search path for DLLs.
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
-	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	  _LT_TAGVAR(always_export_symbols, $1)=yes
-	  _LT_TAGVAR(file_list_spec, $1)='@'
-	  # Tell ltmain to make .lib files, not .a files.
-	  libext=lib
-	  # Tell ltmain to make .dll files, not .so files.
-	  shrext_cmds=".dll"
-	  # FIXME: Setting linknames here is a bad hack.
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	    else
-	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	    fi~
-	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	    linknames='
-	  # The linker will not automatically build a static lib if we build a DLL.
-	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
-	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-	  # Don't use ranlib
-	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
-	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
-	    lt_tool_outputfile="@TOOL_OUTPUT@"~
-	    case $lt_outputfile in
-	      *.exe|*.EXE) ;;
-	      *)
-		lt_outputfile="$lt_outputfile.exe"
-		lt_tool_outputfile="$lt_tool_outputfile.exe"
-		;;
-	    esac~
-	    func_to_tool_file "$lt_outputfile"~
-	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	      $RM "$lt_outputfile.manifest";
-	    fi'
-	  ;;
-	*)
-	  # g++
-	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
-	  # as there is no search path for DLLs.
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
-	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-	  _LT_TAGVAR(always_export_symbols, $1)=no
-	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
-
-	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	    # If the export-symbols file already is a .def file (1st line
-	    # is EXPORTS), use it as is; otherwise, prepend...
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      cp $export_symbols $output_objdir/$soname.def;
-	    else
-	      echo EXPORTS > $output_objdir/$soname.def;
-	      cat $export_symbols >> $output_objdir/$soname.def;
-	    fi~
-	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	  else
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	  fi
-	  ;;
-	esac
-	;;
-      darwin* | rhapsody*)
-        _LT_DARWIN_LINKER_FEATURES($1)
-	;;
-
-      dgux*)
-        case $cc_basename in
-          ec++*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          ghcx*)
-	    # Green Hills C++ Compiler
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      freebsd2.*)
-        # C++ shared libraries reported to be fairly broken before
-	# switch to ELF
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      freebsd-elf*)
-        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-        ;;
-
-      freebsd* | dragonfly*)
-        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
-        # conventions
-        _LT_TAGVAR(ld_shlibs, $1)=yes
-        ;;
-
-      gnu*)
-        ;;
-
-      haiku*)
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(link_all_deplibs, $1)=yes
-        ;;
-
-      hpux9*)
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-        _LT_TAGVAR(hardcode_direct, $1)=yes
-        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-				             # but as the default
-				             # location of the library.
-
-        case $cc_basename in
-          CC*)
-            # FIXME: insert proper C++ library support
-            _LT_TAGVAR(ld_shlibs, $1)=no
-            ;;
-          aCC*)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            # Commands to make compiler produce verbose output that lists
-            # what "hidden" libraries, object files and flags are used when
-            # linking a shared library.
-            #
-            # There doesn't appear to be a way to prevent this compiler from
-            # explicitly linking system object files so we need to strip them
-            # from the output so that they don't get included in the library
-            # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-            ;;
-          *)
-            if test "$GXX" = yes; then
-              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-            else
-              # FIXME: insert proper C++ library support
-              _LT_TAGVAR(ld_shlibs, $1)=no
-            fi
-            ;;
-        esac
-        ;;
-
-      hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
-	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-          case $host_cpu in
-            hppa*64*|ia64*)
-              ;;
-            *)
-	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-              ;;
-          esac
-        fi
-        case $host_cpu in
-          hppa*64*|ia64*)
-            _LT_TAGVAR(hardcode_direct, $1)=no
-            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-            ;;
-          *)
-            _LT_TAGVAR(hardcode_direct, $1)=yes
-            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
-					         # but as the default
-					         # location of the library.
-            ;;
-        esac
-
-        case $cc_basename in
-          CC*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          aCC*)
-	    case $host_cpu in
-	      hppa*64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      ia64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	      *)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	        ;;
-	    esac
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
-	        case $host_cpu in
-	          hppa*64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          ia64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	          *)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	            ;;
-	        esac
-	      fi
-	    else
-	      # FIXME: insert proper C++ library support
-	      _LT_TAGVAR(ld_shlibs, $1)=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      interix[[3-9]]*)
-	_LT_TAGVAR(hardcode_direct, $1)=no
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-	# Instead, shared libraries are loaded at an image base (0x10000000 by
-	# default) and relocated if they conflict, which is a slow very memory
-	# consuming and fragmenting process.  To avoid this, we pick a random,
-	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	;;
-      irix5* | irix6*)
-        case $cc_basename in
-          CC*)
-	    # SGI C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	      else
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
-	      fi
-	    fi
-	    _LT_TAGVAR(link_all_deplibs, $1)=yes
-	    ;;
-        esac
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(inherit_rpath, $1)=yes
-        ;;
-
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
-	    ;;
-	  icpc* | ecpc* )
-	    # Intel C++
-	    with_gnu_ld=yes
-	    # version 8.0 and above of icpc choke on multiply defined symbols
-	    # if we add $predep_objects and $postdep_objects, however 7.1 and
-	    # earlier do not add the objects themselves.
-	    case `$CC -V 2>&1` in
-	      *"Version 7."*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	      *)  # Version 8.0 or newer
-	        tmp_idyn=
-	        case $host_cpu in
-		  ia64*) tmp_idyn=' -i_dynamic';;
-		esac
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-		;;
-	    esac
-	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    ;;
-          pgCC* | pgcpp*)
-            # Portland Group C++ compiler
-	    case `$CC -V` in
-	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
-	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
-	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
-		$RANLIB $oldlib'
-	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    *) # Version 6 and above use weak symbols
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
-	      ;;
-	    esac
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-            ;;
-	  cxx*)
-	    # Compaq C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
-
-	    runpath_var=LD_RUN_PATH
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
-	    ;;
-	  xl* | mpixl* | bgxl*)
-	    # IBM XL 8.0 on PPC, with GNU ld
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-	    fi
-	    ;;
-	  *)
-	    case `$CC -V 2>&1 | sed 5q` in
-	    *Sun\ C*)
-	      # Sun C++ 5.9
-	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	      _LT_TAGVAR(compiler_needs_object, $1)=yes
-
-	      # Not sure whether something based on
-	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
-	      # would be better.
-	      output_verbose_link_cmd='func_echo_all'
-
-	      # Archives containing C++ object files must be created using
-	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	      # necessary to make sure instantiated templates are included
-	      # in the archive.
-	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	      ;;
-	    esac
-	    ;;
-	esac
-	;;
-
-      lynxos*)
-        # FIXME: insert proper C++ library support
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      m88k*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      mvs*)
-        case $cc_basename in
-          cxx*)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-	  *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-	esac
-	;;
-
-      netbsd*)
-        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
-	  wlarc=
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	fi
-	# Workaround some broken pre-1.5 toolchains
-	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
-	;;
-
-      *nto* | *qnx*)
-        _LT_TAGVAR(ld_shlibs, $1)=yes
-	;;
-
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      openbsd*)
-	if test -f /usr/libexec/ld.so; then
-	  _LT_TAGVAR(hardcode_direct, $1)=yes
-	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-	  fi
-	  output_verbose_link_cmd=func_echo_all
-	else
-	  _LT_TAGVAR(ld_shlibs, $1)=no
-	fi
-	;;
-
-      osf3* | osf4* | osf5*)
-        case $cc_basename in
-          KCC*)
-	    # Kuck and Associates, Inc. (KAI) C++ Compiler
-
-	    # KCC will only create a shared library if the output file
-	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
-	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Archives containing C++ object files must be created using
-	    # the KAI C++ compiler.
-	    case $host in
-	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
-	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
-	    esac
-	    ;;
-          RCC*)
-	    # Rational C++ 2.4.1
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          cxx*)
-	    case $host in
-	      osf3*)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-		;;
-	      *)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
-		;;
-	    esac
-
-	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	    # Commands to make compiler produce verbose output that lists
-	    # what "hidden" libraries, object files and flags are used when
-	    # linking a shared library.
-	    #
-	    # There doesn't appear to be a way to prevent this compiler from
-	    # explicitly linking system object files so we need to strip them
-	    # from the output so that they don't get included in the library
-	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
-	    ;;
-	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	      case $host in
-	        osf3*)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	        *)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-		  ;;
-	      esac
-
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-
-	      # Commands to make compiler produce verbose output that lists
-	      # what "hidden" libraries, object files and flags are used when
-	      # linking a shared library.
-	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-
-	    else
-	      # FIXME: insert proper C++ library support
-	      _LT_TAGVAR(ld_shlibs, $1)=no
-	    fi
-	    ;;
-        esac
-        ;;
-
-      psos*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      sunos4*)
-        case $cc_basename in
-          CC*)
-	    # Sun C++ 4.x
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          lcc*)
-	    # Lucid
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      solaris*)
-        case $cc_basename in
-          CC* | sunCC*)
-	    # Sun C++ 4.2, 5.x and Centerline C++
-            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
-	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	    case $host_os in
-	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-	      *)
-		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
-	        # Supported since Solaris 2.6 (maybe 2.5.1?)
-		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
-	        ;;
-	    esac
-	    _LT_TAGVAR(link_all_deplibs, $1)=yes
-
-	    output_verbose_link_cmd='func_echo_all'
-
-	    # Archives containing C++ object files must be created using
-	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
-	    # necessary to make sure instantiated templates are included
-	    # in the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
-	    ;;
-          gcx*)
-	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-
-	    # The C++ compiler must be used to create the archive.
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
-	    ;;
-          *)
-	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
-	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
-	        # platform.
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
-	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
-
-	        # Commands to make compiler produce verbose output that lists
-	        # what "hidden" libraries, object files and flags are used when
-	        # linking a shared library.
-	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
-	      fi
-
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
-	      case $host_os in
-		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
-		*)
-		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-		  ;;
-	      esac
-	    fi
-	    ;;
-        esac
-        ;;
-
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      runpath_var='LD_RUN_PATH'
-
-      case $cc_basename in
-        CC*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-      esac
-      ;;
-
-      sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
-	# link with -lc, and that would cause any symbols used from libc to
-	# always be unresolved, which means just about no library would
-	# ever link correctly.  If we're not using GNU ld we use -z text
-	# though, which does catch some bad symbols but isn't as heavy-handed
-	# as -z defs.
-	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
-	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
-	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
-	_LT_TAGVAR(link_all_deplibs, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
-	runpath_var='LD_RUN_PATH'
-
-	case $cc_basename in
-          CC*)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
-	      '"$_LT_TAGVAR(old_archive_cmds, $1)"
-	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
-	      '"$_LT_TAGVAR(reload_cmds, $1)"
-	    ;;
-	  *)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    ;;
-	esac
-      ;;
-
-      tandem*)
-        case $cc_basename in
-          NCC*)
-	    # NonStop-UX NCC 3.20
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-          *)
-	    # FIXME: insert proper C++ library support
-	    _LT_TAGVAR(ld_shlibs, $1)=no
-	    ;;
-        esac
-        ;;
-
-      vxworks*)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-
-      *)
-        # FIXME: insert proper C++ library support
-        _LT_TAGVAR(ld_shlibs, $1)=no
-        ;;
-    esac
-
-    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
-
-    _LT_TAGVAR(GCC, $1)="$GXX"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_SYS_HIDDEN_LIBDEPS($1)
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  CC=$lt_save_CC
-  CFLAGS=$lt_save_CFLAGS
-  LDCXX=$LD
-  LD=$lt_save_LD
-  GCC=$lt_save_GCC
-  with_gnu_ld=$lt_save_with_gnu_ld
-  lt_cv_path_LDCXX=$lt_cv_path_LD
-  lt_cv_path_LD=$lt_save_path_LD
-  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
-  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
-
-AC_LANG_POP
-])# _LT_LANG_CXX_CONFIG
-
-
-# _LT_FUNC_STRIPNAME_CNF
-# ----------------------
-# func_stripname_cnf prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-#
-# This function is identical to the (non-XSI) version of func_stripname,
-# except this one can be used by m4 code that may be executed by configure,
-# rather than the libtool script.
-m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
-AC_REQUIRE([_LT_DECL_SED])
-AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
-func_stripname_cnf ()
-{
-  case ${2} in
-  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-  esac
-} # func_stripname_cnf
-])# _LT_FUNC_STRIPNAME_CNF
-
-# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
-# ---------------------------------
-# Figure out "hidden" library dependencies from verbose
-# compiler output when linking a shared library.
-# Parse the compiler output and extract the necessary
-# objects, libraries and library flags.
-m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
-[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
-# Dependencies to place before and after the object being linked:
-_LT_TAGVAR(predep_objects, $1)=
-_LT_TAGVAR(postdep_objects, $1)=
-_LT_TAGVAR(predeps, $1)=
-_LT_TAGVAR(postdeps, $1)=
-_LT_TAGVAR(compiler_lib_search_path, $1)=
-
-dnl we can't use the lt_simple_compile_test_code here,
-dnl because it contains code intended for an executable,
-dnl not a library.  It's possible we should let each
-dnl tag define a new lt_????_link_test_code variable,
-dnl but it's only used here...
-m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
-int a;
-void foo (void) { a = 0; }
-_LT_EOF
-], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
-class Foo
-{
-public:
-  Foo (void) { a = 0; }
-private:
-  int a;
-};
-_LT_EOF
-], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
-      subroutine foo
-      implicit none
-      integer*4 a
-      a=0
-      return
-      end
-_LT_EOF
-], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
-      subroutine foo
-      implicit none
-      integer a
-      a=0
-      return
-      end
-_LT_EOF
-], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
-public class foo {
-  private int a;
-  public void bar (void) {
-    a = 0;
-  }
-};
-_LT_EOF
-], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
-package foo
-func foo() {
-}
-_LT_EOF
-])
-
-_lt_libdeps_save_CFLAGS=$CFLAGS
-case "$CC $CFLAGS " in #(
-*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
-*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
-*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
-esac
-
-dnl Parse the compiler output and extract the necessary
-dnl objects, libraries and library flags.
-if AC_TRY_EVAL(ac_compile); then
-  # Parse the compiler output and extract the necessary
-  # objects, libraries and library flags.
-
-  # Sentinel used to keep track of whether or not we are before
-  # the conftest object file.
-  pre_test_object_deps_done=no
-
-  for p in `eval "$output_verbose_link_cmd"`; do
-    case ${prev}${p} in
-
-    -L* | -R* | -l*)
-       # Some compilers place space between "-{L,R}" and the path.
-       # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
-	 prev=$p
-	 continue
-       fi
-
-       # Expand the sysroot to ease extracting the directories later.
-       if test -z "$prev"; then
-         case $p in
-         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
-         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
-         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
-         esac
-       fi
-       case $p in
-       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
-       esac
-       if test "$pre_test_object_deps_done" = no; then
-	 case ${prev} in
-	 -L | -R)
-	   # Internal compiler library paths should come after those
-	   # provided the user.  The postdeps already come after the
-	   # user supplied libs so there is no need to process them.
-	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
-	   else
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
-	   fi
-	   ;;
-	 # The "-l" case would never come before the object being
-	 # linked, so don't bother handling this case.
-	 esac
-       else
-	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
-	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
-	 else
-	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
-	 fi
-       fi
-       prev=
-       ;;
-
-    *.lto.$objext) ;; # Ignore GCC LTO objects
-    *.$objext)
-       # This assumes that the test object file only shows up
-       # once in the compiler output.
-       if test "$p" = "conftest.$objext"; then
-	 pre_test_object_deps_done=yes
-	 continue
-       fi
-
-       if test "$pre_test_object_deps_done" = no; then
-	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
-	   _LT_TAGVAR(predep_objects, $1)="$p"
-	 else
-	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
-	 fi
-       else
-	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
-	   _LT_TAGVAR(postdep_objects, $1)="$p"
-	 else
-	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
-	 fi
-       fi
-       ;;
-
-    *) ;; # Ignore the rest.
-
-    esac
-  done
-
-  # Clean up.
-  rm -f a.out a.exe
-else
-  echo "libtool.m4: error: problem compiling $1 test program"
-fi
-
-$RM -f confest.$objext
-CFLAGS=$_lt_libdeps_save_CFLAGS
-
-# PORTME: override above test on systems where it is broken
-m4_if([$1], [CXX],
-[case $host_os in
-interix[[3-9]]*)
-  # Interix 3.5 installs completely hosed .la files for C++, so rather than
-  # hack all around it, let's just trust "g++" to DTRT.
-  _LT_TAGVAR(predep_objects,$1)=
-  _LT_TAGVAR(postdep_objects,$1)=
-  _LT_TAGVAR(postdeps,$1)=
-  ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC* | sunCC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-esac
-])
-
-case " $_LT_TAGVAR(postdeps, $1) " in
-*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
-esac
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=
-if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
-fi
-_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
-    [The directories searched by this compiler when creating a shared library])
-_LT_TAGDECL([], [predep_objects], [1],
-    [Dependencies to place before and after the objects being linked to
-    create a shared library])
-_LT_TAGDECL([], [postdep_objects], [1])
-_LT_TAGDECL([], [predeps], [1])
-_LT_TAGDECL([], [postdeps], [1])
-_LT_TAGDECL([], [compiler_lib_search_path], [1],
-    [The library search path used internally by the compiler when linking
-    a shared library])
-])# _LT_SYS_HIDDEN_LIBDEPS
-
-
-# _LT_LANG_F77_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for a Fortran 77 compiler are
-# suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_F77_CONFIG],
-[AC_LANG_PUSH(Fortran 77)
-if test -z "$F77" || test "X$F77" = "Xno"; then
-  _lt_disable_F77=yes
-fi
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for f77 test sources.
-ac_ext=f
-
-# Object file extension for compiled f77 test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the F77 compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_F77" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="\
-      subroutine t
-      return
-      end
-"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code="\
-      program t
-      end
-"
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
-  lt_save_GCC=$GCC
-  lt_save_CFLAGS=$CFLAGS
-  CC=${F77-"f77"}
-  CFLAGS=$FFLAGS
-  compiler=$CC
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-  GCC=$G77
-  if test -n "$compiler"; then
-    AC_MSG_CHECKING([if libtool supports shared libraries])
-    AC_MSG_RESULT([$can_build_shared])
-
-    AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
-
-    # On AIX, shared libraries and static libraries use the same namespace, and
-    # are all built from PIC.
-    case $host_os in
-      aix3*)
-        test "$enable_shared" = yes && enable_static=no
-        if test -n "$RANLIB"; then
-          archive_cmds="$archive_cmds~\$RANLIB \$lib"
-          postinstall_cmds='$RANLIB $lib'
-        fi
-        ;;
-      aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
-	fi
-        ;;
-    esac
-    AC_MSG_RESULT([$enable_shared])
-
-    AC_MSG_CHECKING([whether to build static libraries])
-    # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
-    AC_MSG_RESULT([$enable_static])
-
-    _LT_TAGVAR(GCC, $1)="$G77"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-  CFLAGS="$lt_save_CFLAGS"
-fi # test "$_lt_disable_F77" != yes
-
-AC_LANG_POP
-])# _LT_LANG_F77_CONFIG
-
-
-# _LT_LANG_FC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for a Fortran compiler are
-# suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_FC_CONFIG],
-[AC_LANG_PUSH(Fortran)
-
-if test -z "$FC" || test "X$FC" = "Xno"; then
-  _lt_disable_FC=yes
-fi
-
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-_LT_TAGVAR(allow_undefined_flag, $1)=
-_LT_TAGVAR(always_export_symbols, $1)=no
-_LT_TAGVAR(archive_expsym_cmds, $1)=
-_LT_TAGVAR(export_dynamic_flag_spec, $1)=
-_LT_TAGVAR(hardcode_direct, $1)=no
-_LT_TAGVAR(hardcode_direct_absolute, $1)=no
-_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
-_LT_TAGVAR(hardcode_libdir_separator, $1)=
-_LT_TAGVAR(hardcode_minus_L, $1)=no
-_LT_TAGVAR(hardcode_automatic, $1)=no
-_LT_TAGVAR(inherit_rpath, $1)=no
-_LT_TAGVAR(module_cmds, $1)=
-_LT_TAGVAR(module_expsym_cmds, $1)=
-_LT_TAGVAR(link_all_deplibs, $1)=unknown
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-_LT_TAGVAR(no_undefined_flag, $1)=
-_LT_TAGVAR(whole_archive_flag_spec, $1)=
-_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
-
-# Source file extension for fc test sources.
-ac_ext=${ac_fc_srcext-f}
-
-# Object file extension for compiled fc test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# No sense in running all these tests if we already determined that
-# the FC compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_FC" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="\
-      subroutine t
-      return
-      end
-"
-
-  # Code to be used in simple link tests
-  lt_simple_link_test_code="\
-      program t
-      end
-"
-
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
-  _LT_TAG_COMPILER
-
-  # save warnings/boilerplate of simple test code
-  _LT_COMPILER_BOILERPLATE
-  _LT_LINKER_BOILERPLATE
-
-  # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
-  lt_save_GCC=$GCC
-  lt_save_CFLAGS=$CFLAGS
-  CC=${FC-"f95"}
-  CFLAGS=$FCFLAGS
-  compiler=$CC
-  GCC=$ac_cv_fc_compiler_gnu
-
-  _LT_TAGVAR(compiler, $1)=$CC
-  _LT_CC_BASENAME([$compiler])
-
-  if test -n "$compiler"; then
-    AC_MSG_CHECKING([if libtool supports shared libraries])
-    AC_MSG_RESULT([$can_build_shared])
-
-    AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
-
-    # On AIX, shared libraries and static libraries use the same namespace, and
-    # are all built from PIC.
-    case $host_os in
-      aix3*)
-        test "$enable_shared" = yes && enable_static=no
-        if test -n "$RANLIB"; then
-          archive_cmds="$archive_cmds~\$RANLIB \$lib"
-          postinstall_cmds='$RANLIB $lib'
-        fi
-        ;;
-      aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
-	fi
-        ;;
-    esac
-    AC_MSG_RESULT([$enable_shared])
-
-    AC_MSG_CHECKING([whether to build static libraries])
-    # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
-    AC_MSG_RESULT([$enable_static])
-
-    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
-    _LT_TAGVAR(LD, $1)="$LD"
-
-    ## CAVEAT EMPTOR:
-    ## There is no encapsulation within the following macros, do not change
-    ## the running order or otherwise move them around unless you know exactly
-    ## what you are doing...
-    _LT_SYS_HIDDEN_LIBDEPS($1)
-    _LT_COMPILER_PIC($1)
-    _LT_COMPILER_C_O($1)
-    _LT_COMPILER_FILE_LOCKS($1)
-    _LT_LINKER_SHLIBS($1)
-    _LT_SYS_DYNAMIC_LINKER($1)
-    _LT_LINKER_HARDCODE_LIBPATH($1)
-
-    _LT_CONFIG($1)
-  fi # test -n "$compiler"
-
-  GCC=$lt_save_GCC
-  CC=$lt_save_CC
-  CFLAGS=$lt_save_CFLAGS
-fi # test "$_lt_disable_FC" != yes
-
-AC_LANG_POP
-])# _LT_LANG_FC_CONFIG
-
-
-# _LT_LANG_GCJ_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for the GNU Java Compiler compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_GCJ_CONFIG],
-[AC_REQUIRE([LT_PROG_GCJ])dnl
-AC_LANG_SAVE
-
-# Source file extension for Java test sources.
-ac_ext=java
-
-# Object file extension for compiled Java test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="class foo {}"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC=$CC
-lt_save_CFLAGS=$CFLAGS
-lt_save_GCC=$GCC
-GCC=yes
-CC=${GCJ-"gcj"}
-CFLAGS=$GCJFLAGS
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
-_LT_CC_BASENAME([$compiler])
-
-# GCJ did not exist at the time GCC didn't implicitly link libc in.
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-
-  _LT_CONFIG($1)
-fi
-
-AC_LANG_RESTORE
-
-GCC=$lt_save_GCC
-CC=$lt_save_CC
-CFLAGS=$lt_save_CFLAGS
-])# _LT_LANG_GCJ_CONFIG
-
-
-# _LT_LANG_GO_CONFIG([TAG])
-# --------------------------
-# Ensure that the configuration variables for the GNU Go compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_GO_CONFIG],
-[AC_REQUIRE([LT_PROG_GO])dnl
-AC_LANG_SAVE
-
-# Source file extension for Go test sources.
-ac_ext=go
-
-# Object file extension for compiled Go test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="package main; func main() { }"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='package main; func main() { }'
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC=$CC
-lt_save_CFLAGS=$CFLAGS
-lt_save_GCC=$GCC
-GCC=yes
-CC=${GOC-"gccgo"}
-CFLAGS=$GOFLAGS
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
-_LT_CC_BASENAME([$compiler])
-
-# Go did not exist at the time GCC didn't implicitly link libc in.
-_LT_TAGVAR(archive_cmds_need_lc, $1)=no
-
-_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
-_LT_TAGVAR(reload_flag, $1)=$reload_flag
-_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
-
-if test -n "$compiler"; then
-  _LT_COMPILER_NO_RTTI($1)
-  _LT_COMPILER_PIC($1)
-  _LT_COMPILER_C_O($1)
-  _LT_COMPILER_FILE_LOCKS($1)
-  _LT_LINKER_SHLIBS($1)
-  _LT_LINKER_HARDCODE_LIBPATH($1)
-
-  _LT_CONFIG($1)
-fi
-
-AC_LANG_RESTORE
-
-GCC=$lt_save_GCC
-CC=$lt_save_CC
-CFLAGS=$lt_save_CFLAGS
-])# _LT_LANG_GO_CONFIG
-
-
-# _LT_LANG_RC_CONFIG([TAG])
-# -------------------------
-# Ensure that the configuration variables for the Windows resource compiler
-# are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
-m4_defun([_LT_LANG_RC_CONFIG],
-[AC_REQUIRE([LT_PROG_RC])dnl
-AC_LANG_SAVE
-
-# Source file extension for RC test sources.
-ac_ext=rc
-
-# Object file extension for compiled RC test sources.
-objext=o
-_LT_TAGVAR(objext, $1)=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
-
-# Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
-
-# ltmain only uses $CC for tagged configurations so make sure $CC is set.
-_LT_TAG_COMPILER
-
-# save warnings/boilerplate of simple test code
-_LT_COMPILER_BOILERPLATE
-_LT_LINKER_BOILERPLATE
-
-# Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
-lt_save_CFLAGS=$CFLAGS
-lt_save_GCC=$GCC
-GCC=
-CC=${RC-"windres"}
-CFLAGS=
-compiler=$CC
-_LT_TAGVAR(compiler, $1)=$CC
-_LT_CC_BASENAME([$compiler])
-_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-
-if test -n "$compiler"; then
-  :
-  _LT_CONFIG($1)
-fi
-
-GCC=$lt_save_GCC
-AC_LANG_RESTORE
-CC=$lt_save_CC
-CFLAGS=$lt_save_CFLAGS
-])# _LT_LANG_RC_CONFIG
-
-
-# LT_PROG_GCJ
-# -----------
-AC_DEFUN([LT_PROG_GCJ],
-[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
-  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
-    [AC_CHECK_TOOL(GCJ, gcj,)
-      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
-      AC_SUBST(GCJFLAGS)])])[]dnl
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
-
-
-# LT_PROG_GO
-# ----------
-AC_DEFUN([LT_PROG_GO],
-[AC_CHECK_TOOL(GOC, gccgo,)
-])
-
-
-# LT_PROG_RC
-# ----------
-AC_DEFUN([LT_PROG_RC],
-[AC_CHECK_TOOL(RC, windres,)
-])
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_RC], [])
-
-
-# _LT_DECL_EGREP
-# --------------
-# If we don't have a new enough Autoconf to choose the best grep
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_EGREP],
-[AC_REQUIRE([AC_PROG_EGREP])dnl
-AC_REQUIRE([AC_PROG_FGREP])dnl
-test -z "$GREP" && GREP=grep
-_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
-_LT_DECL([], [EGREP], [1], [An ERE matcher])
-_LT_DECL([], [FGREP], [1], [A literal string matcher])
-dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
-AC_SUBST([GREP])
-])
-
-
-# _LT_DECL_OBJDUMP
-# --------------
-# If we don't have a new enough Autoconf to choose the best objdump
-# available, choose the one first in the user's PATH.
-m4_defun([_LT_DECL_OBJDUMP],
-[AC_CHECK_TOOL(OBJDUMP, objdump, false)
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
-AC_SUBST([OBJDUMP])
-])
-
-# _LT_DECL_DLLTOOL
-# ----------------
-# Ensure DLLTOOL variable is set.
-m4_defun([_LT_DECL_DLLTOOL],
-[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
-AC_SUBST([DLLTOOL])
-])
-
-# _LT_DECL_SED
-# ------------
-# Check for a fully-functional sed program, that truncates
-# as few characters as possible.  Prefer GNU sed if found.
-m4_defun([_LT_DECL_SED],
-[AC_PROG_SED
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
-_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
-_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
-    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
-])# _LT_DECL_SED
-
-m4_ifndef([AC_PROG_SED], [
-# NOTE: This macro has been submitted for inclusion into   #
-#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
-#  a released version of Autoconf we should remove this    #
-#  macro and use it instead.                               #
-
-m4_defun([AC_PROG_SED],
-[AC_MSG_CHECKING([for a sed that does not truncate output])
-AC_CACHE_VAL(lt_cv_path_SED,
-[# Loop through the user's path and test for sed and gsed.
-# Then use that list of sed's as ones to test for truncation.
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for lt_ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
-        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
-      fi
-    done
-  done
-done
-IFS=$as_save_IFS
-lt_ac_max=0
-lt_ac_count=0
-# Add /usr/xpg4/bin/sed as it is typically found on Solaris
-# along with /bin/sed that truncates output.
-for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
-  cat /dev/null > conftest.in
-  lt_ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
-  # Check for GNU sed and select it if it is found.
-  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
-    lt_cv_path_SED=$lt_ac_sed
-    break
-  fi
-  while true; do
-    cat conftest.in conftest.in >conftest.tmp
-    mv conftest.tmp conftest.in
-    cp conftest.in conftest.nl
-    echo >>conftest.nl
-    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
-    cmp -s conftest.out conftest.nl || break
-    # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
-    lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
-      lt_ac_max=$lt_ac_count
-      lt_cv_path_SED=$lt_ac_sed
-    fi
-  done
-done
-])
-SED=$lt_cv_path_SED
-AC_SUBST([SED])
-AC_MSG_RESULT([$SED])
-])#AC_PROG_SED
-])#m4_ifndef
-
-# Old name:
-AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([LT_AC_PROG_SED], [])
-
-
-# _LT_CHECK_SHELL_FEATURES
-# ------------------------
-# Find out whether the shell is Bourne or XSI compatible,
-# or has some other useful features.
-m4_defun([_LT_CHECK_SHELL_FEATURES],
-[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,b/c, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-AC_MSG_RESULT([$xsi_shell])
-_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
-
-AC_MSG_CHECKING([whether the shell understands "+="])
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-AC_MSG_RESULT([$lt_shell_append])
-_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
-_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
-
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
-_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
-_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
-])# _LT_CHECK_SHELL_FEATURES
-
-
-# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
-# ------------------------------------------------------
-# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
-# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
-m4_defun([_LT_PROG_FUNCTION_REPLACE],
-[dnl {
-sed -e '/^$1 ()$/,/^} # $1 /c\
-$1 ()\
-{\
-m4_bpatsubsts([$2], [$], [\\], [^\([	 ]\)], [\\\1])
-} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-])
-
-
-# _LT_PROG_REPLACE_SHELLFNS
-# -------------------------
-# Replace existing portable implementations of several shell functions with
-# equivalent extended shell implementations where those features are available..
-m4_defun([_LT_PROG_REPLACE_SHELLFNS],
-[if test x"$xsi_shell" = xyes; then
-  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
-    case ${1} in
-      */*) func_dirname_result="${1%/*}${2}" ;;
-      *  ) func_dirname_result="${3}" ;;
-    esac])
-
-  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
-    func_basename_result="${1##*/}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
-    case ${1} in
-      */*) func_dirname_result="${1%/*}${2}" ;;
-      *  ) func_dirname_result="${3}" ;;
-    esac
-    func_basename_result="${1##*/}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
-    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-    # positional parameters, so assign one to ordinary parameter first.
-    func_stripname_result=${3}
-    func_stripname_result=${func_stripname_result#"${1}"}
-    func_stripname_result=${func_stripname_result%"${2}"}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
-    func_split_long_opt_name=${1%%=*}
-    func_split_long_opt_arg=${1#*=}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
-    func_split_short_opt_arg=${1#??}
-    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
-    case ${1} in
-      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-      *)    func_lo2o_result=${1} ;;
-    esac])
-
-  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
-
-  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
-
-  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
-fi
-
-if test x"$lt_shell_append" = xyes; then
-  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
-    func_quote_for_eval "${2}"
-dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
-    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
-
-  # Save a `func_append' function call where possible by direct use of '+='
-  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-else
-  # Save a `func_append' function call even when '+=' is not available
-  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
-  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
-fi
-])
-
-# _LT_PATH_CONVERSION_FUNCTIONS
-# -----------------------------
-# Determine which file name conversion functions should be used by
-# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
-# for certain cross-compile configurations and native mingw.
-m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_MSG_CHECKING([how to convert $build file names to $host format])
-AC_CACHE_VAL(lt_cv_to_host_file_cmd,
-[case $host in
-  *-*-mingw* )
-    case $build in
-      *-*-mingw* ) # actually msys
-        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
-        ;;
-      *-*-cygwin* )
-        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
-        ;;
-      * ) # otherwise, assume *nix
-        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
-        ;;
-    esac
-    ;;
-  *-*-cygwin* )
-    case $build in
-      *-*-mingw* ) # actually msys
-        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
-        ;;
-      *-*-cygwin* )
-        lt_cv_to_host_file_cmd=func_convert_file_noop
-        ;;
-      * ) # otherwise, assume *nix
-        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
-        ;;
-    esac
-    ;;
-  * ) # unhandled hosts (and "normal" native builds)
-    lt_cv_to_host_file_cmd=func_convert_file_noop
-    ;;
-esac
-])
-to_host_file_cmd=$lt_cv_to_host_file_cmd
-AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
-_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
-         [0], [convert $build file names to $host format])dnl
-
-AC_MSG_CHECKING([how to convert $build file names to toolchain format])
-AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
-[#assume ordinary cross tools, or native build.
-lt_cv_to_tool_file_cmd=func_convert_file_noop
-case $host in
-  *-*-mingw* )
-    case $build in
-      *-*-mingw* ) # actually msys
-        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
-        ;;
-    esac
-    ;;
-esac
-])
-to_tool_file_cmd=$lt_cv_to_tool_file_cmd
-AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
-_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
-         [0], [convert $build files to toolchain format])dnl
-])# _LT_PATH_CONVERSION_FUNCTIONS
-
-# Helper functions for option handling.                    -*- Autoconf -*-
-#
-#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
-#   Inc.
-#   Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 7 ltoptions.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
-
-
-# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
-# ------------------------------------------
-m4_define([_LT_MANGLE_OPTION],
-[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
-
-
-# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
-# ---------------------------------------
-# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
-# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
-# saved as a flag.
-m4_define([_LT_SET_OPTION],
-[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
-m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
-        _LT_MANGLE_DEFUN([$1], [$2]),
-    [m4_warning([Unknown $1 option `$2'])])[]dnl
-])
-
-
-# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
-# ------------------------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-m4_define([_LT_IF_OPTION],
-[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
-
-
-# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
-# -------------------------------------------------------
-# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
-# are set.
-m4_define([_LT_UNLESS_OPTIONS],
-[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
-	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
-		      [m4_define([$0_found])])])[]dnl
-m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
-])[]dnl
-])
-
-
-# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
-# ----------------------------------------
-# OPTION-LIST is a space-separated list of Libtool options associated
-# with MACRO-NAME.  If any OPTION has a matching handler declared with
-# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
-# the unknown option and exit.
-m4_defun([_LT_SET_OPTIONS],
-[# Set options
-m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
-    [_LT_SET_OPTION([$1], _LT_Option)])
-
-m4_if([$1],[LT_INIT],[
-  dnl
-  dnl Simply set some default values (i.e off) if boolean options were not
-  dnl specified:
-  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
-  ])
-  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
-  ])
-  dnl
-  dnl If no reference was made to various pairs of opposing options, then
-  dnl we run the default mode handler for the pair.  For example, if neither
-  dnl `shared' nor `disable-shared' was passed, we enable building of shared
-  dnl archives by default:
-  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
-  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
-  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
-  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
-  		   [_LT_ENABLE_FAST_INSTALL])
-  ])
-])# _LT_SET_OPTIONS
-
-
-
-# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
-# -----------------------------------------
-m4_define([_LT_MANGLE_DEFUN],
-[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
-
-
-# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
-# -----------------------------------------------
-m4_define([LT_OPTION_DEFINE],
-[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
-])# LT_OPTION_DEFINE
-
-
-# dlopen
-# ------
-LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
-])
-
-AU_DEFUN([AC_LIBTOOL_DLOPEN],
-[_LT_SET_OPTION([LT_INIT], [dlopen])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `dlopen' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
-
-
-# win32-dll
-# ---------
-# Declare package support for building win32 dll's.
-LT_OPTION_DEFINE([LT_INIT], [win32-dll],
-[enable_win32_dll=yes
-
-case $host in
-*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
-  AC_CHECK_TOOL(AS, as, false)
-  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
-  AC_CHECK_TOOL(OBJDUMP, objdump, false)
-  ;;
-esac
-
-test -z "$AS" && AS=as
-_LT_DECL([], [AS],      [1], [Assembler program])dnl
-
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
-
-test -z "$OBJDUMP" && OBJDUMP=objdump
-_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
-])# win32-dll
-
-AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-_LT_SET_OPTION([LT_INIT], [win32-dll])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `win32-dll' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
-
-
-# _LT_ENABLE_SHARED([DEFAULT])
-# ----------------------------
-# implement the --enable-shared flag, and supports the `shared' and
-# `disable-shared' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_SHARED],
-[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([shared],
-    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
-	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
-
-    _LT_DECL([build_libtool_libs], [enable_shared], [0],
-	[Whether or not to build shared libraries])
-])# _LT_ENABLE_SHARED
-
-LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
-])
-
-AC_DEFUN([AC_DISABLE_SHARED],
-[_LT_SET_OPTION([LT_INIT], [disable-shared])
-])
-
-AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
-AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_SHARED], [])
-dnl AC_DEFUN([AM_DISABLE_SHARED], [])
-
-
-
-# _LT_ENABLE_STATIC([DEFAULT])
-# ----------------------------
-# implement the --enable-static flag, and support the `static' and
-# `disable-static' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_STATIC],
-[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([static],
-    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
-	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
-
-    _LT_DECL([build_old_libs], [enable_static], [0],
-	[Whether or not to build static libraries])
-])# _LT_ENABLE_STATIC
-
-LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
-
-# Old names:
-AC_DEFUN([AC_ENABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
-])
-
-AC_DEFUN([AC_DISABLE_STATIC],
-[_LT_SET_OPTION([LT_INIT], [disable-static])
-])
-
-AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
-AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AM_ENABLE_STATIC], [])
-dnl AC_DEFUN([AM_DISABLE_STATIC], [])
-
-
-
-# _LT_ENABLE_FAST_INSTALL([DEFAULT])
-# ----------------------------------
-# implement the --enable-fast-install flag, and support the `fast-install'
-# and `disable-fast-install' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
-m4_define([_LT_ENABLE_FAST_INSTALL],
-[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
-AC_ARG_ENABLE([fast-install],
-    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
-    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
-    [p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
-
-_LT_DECL([fast_install], [enable_fast_install], [0],
-	 [Whether or not to optimize for fast installation])dnl
-])# _LT_ENABLE_FAST_INSTALL
-
-LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
-LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
-
-# Old names:
-AU_DEFUN([AC_ENABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `fast-install' option into LT_INIT's first parameter.])
-])
-
-AU_DEFUN([AC_DISABLE_FAST_INSTALL],
-[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `disable-fast-install' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
-dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
-
-
-# _LT_WITH_PIC([MODE])
-# --------------------
-# implement the --with-pic flag, and support the `pic-only' and `no-pic'
-# LT_INIT options.
-# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
-m4_define([_LT_WITH_PIC],
-[AC_ARG_WITH([pic],
-    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
-	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
-    [lt_p=${PACKAGE-default}
-    case $withval in
-    yes|no) pic_mode=$withval ;;
-    *)
-      pic_mode=default
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for lt_pkg in $withval; do
-	IFS="$lt_save_ifs"
-	if test "X$lt_pkg" = "X$lt_p"; then
-	  pic_mode=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac],
-    [pic_mode=default])
-
-test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
-
-_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
-])# _LT_WITH_PIC
-
-LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
-LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
-
-# Old name:
-AU_DEFUN([AC_LIBTOOL_PICMODE],
-[_LT_SET_OPTION([LT_INIT], [pic-only])
-AC_DIAGNOSE([obsolete],
-[$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `pic-only' option into LT_INIT's first parameter.])
-])
-
-dnl aclocal-1.4 backwards compatibility:
-dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
-
-
-m4_define([_LTDL_MODE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
-		 [m4_define([_LTDL_MODE], [nonrecursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [recursive],
-		 [m4_define([_LTDL_MODE], [recursive])])
-LT_OPTION_DEFINE([LTDL_INIT], [subproject],
-		 [m4_define([_LTDL_MODE], [subproject])])
-
-m4_define([_LTDL_TYPE], [])
-LT_OPTION_DEFINE([LTDL_INIT], [installable],
-		 [m4_define([_LTDL_TYPE], [installable])])
-LT_OPTION_DEFINE([LTDL_INIT], [convenience],
-		 [m4_define([_LTDL_TYPE], [convenience])])
-
-# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
-#
-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
-# Written by Gary V. Vaughan, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 6 ltsugar.m4
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
-
-
-# lt_join(SEP, ARG1, [ARG2...])
-# -----------------------------
-# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
-# associated separator.
-# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
-# versions in m4sugar had bugs.
-m4_define([lt_join],
-[m4_if([$#], [1], [],
-       [$#], [2], [[$2]],
-       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
-m4_define([_lt_join],
-[m4_if([$#$2], [2], [],
-       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
-
-
-# lt_car(LIST)
-# lt_cdr(LIST)
-# ------------
-# Manipulate m4 lists.
-# These macros are necessary as long as will still need to support
-# Autoconf-2.59 which quotes differently.
-m4_define([lt_car], [[$1]])
-m4_define([lt_cdr],
-[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
-       [$#], 1, [],
-       [m4_dquote(m4_shift($@))])])
-m4_define([lt_unquote], $1)
-
-
-# lt_append(MACRO-NAME, STRING, [SEPARATOR])
-# ------------------------------------------
-# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
-# Note that neither SEPARATOR nor STRING are expanded; they are appended
-# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
-# No SEPARATOR is output if MACRO-NAME was previously undefined (different
-# than defined and empty).
-#
-# This macro is needed until we can rely on Autoconf 2.62, since earlier
-# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
-m4_define([lt_append],
-[m4_define([$1],
-	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
-
-
-
-# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
-# ----------------------------------------------------------
-# Produce a SEP delimited list of all paired combinations of elements of
-# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
-# has the form PREFIXmINFIXSUFFIXn.
-# Needed until we can rely on m4_combine added in Autoconf 2.62.
-m4_define([lt_combine],
-[m4_if(m4_eval([$# > 3]), [1],
-       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
-[[m4_foreach([_Lt_prefix], [$2],
-	     [m4_foreach([_Lt_suffix],
-		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
-	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
-
-
-# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
-# -----------------------------------------------------------------------
-# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
-# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
-m4_define([lt_if_append_uniq],
-[m4_ifdef([$1],
-	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
-		 [lt_append([$1], [$2], [$3])$4],
-		 [$5])],
-	  [lt_append([$1], [$2], [$3])$4])])
-
-
-# lt_dict_add(DICT, KEY, VALUE)
-# -----------------------------
-m4_define([lt_dict_add],
-[m4_define([$1($2)], [$3])])
-
-
-# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
-# --------------------------------------------
-m4_define([lt_dict_add_subkey],
-[m4_define([$1($2:$3)], [$4])])
-
-
-# lt_dict_fetch(DICT, KEY, [SUBKEY])
-# ----------------------------------
-m4_define([lt_dict_fetch],
-[m4_ifval([$3],
-	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
-    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
-
-
-# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
-# -----------------------------------------------------------------
-m4_define([lt_if_dict_fetch],
-[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
-	[$5],
-    [$6])])
-
-
-# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
-# --------------------------------------------------------------
-m4_define([lt_dict_filter],
-[m4_if([$5], [], [],
-  [lt_join(m4_quote(m4_default([$4], [[, ]])),
-           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
-		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
-])
-
-# ltversion.m4 -- version numbers			-*- Autoconf -*-
-#
-#   Copyright (C) 2004 Free Software Foundation, Inc.
-#   Written by Scott James Remnant, 2004
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# @configure_input@
-
-# serial 3337 ltversion.m4
-# This file is part of GNU Libtool
-
-m4_define([LT_PACKAGE_VERSION], [2.4.2])
-m4_define([LT_PACKAGE_REVISION], [1.3337])
-
-AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.4.2'
-macro_revision='1.3337'
-_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
-_LT_DECL(, macro_revision, 0)
-])
-
-# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
-#
-#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
-#   Written by Scott James Remnant, 2004.
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-
-# serial 5 lt~obsolete.m4
-
-# These exist entirely to fool aclocal when bootstrapping libtool.
-#
-# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
-# which have later been changed to m4_define as they aren't part of the
-# exported API, or moved to Autoconf or Automake where they belong.
-#
-# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
-# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
-# using a macro with the same name in our local m4/libtool.m4 it'll
-# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
-# and doesn't know about Autoconf macros at all.)
-#
-# So we provide this file, which has a silly filename so it's always
-# included after everything else.  This provides aclocal with the
-# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
-# because those macros already exist, or will be overwritten later.
-# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
-#
-# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
-# Yes, that means every name once taken will need to remain here until
-# we give up compatibility with versions before 1.7, at which point
-# we need to keep only those names which we still refer to.
-
-# This is to help aclocal find these macros, as it can't see m4_define.
-AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
-
-m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
-m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
-m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
-m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
-m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
-m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
-m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
-m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
-m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
-m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
-m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
-m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
-m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
-m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
-m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
-m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
-m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
-m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
-m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
-m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
-m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
-m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
-m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
-m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
-m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
-m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
-m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
-m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
-m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
-m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
-m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
-m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
-m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
-m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
-m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
-m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
-m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
-m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
-m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
-m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
-m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
-m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
-m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
-m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
-m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
-m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
-m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
-m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
-m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
-m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
-m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
-m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
-m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
-m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
-m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
-m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
-
+m4_include([m4/libtool.m4])
+m4_include([m4/ltoptions.m4])
+m4_include([m4/ltsugar.m4])
+m4_include([m4/ltversion.m4])
+m4_include([m4/lt~obsolete.m4])
diff --git a/acsite.m4 b/acsite.m4
index eaab535..b144962 100644
--- a/acsite.m4
+++ b/acsite.m4
@@ -53,87 +53,3 @@ esac
 rm -rf conftest*[]dnl
 ])# _AC_SYS_LARGEFILE_MACRO_VALUE
 
-dnl -------------------------------------------------------------------------
-dnl AC_F9X_MODS()
-dnl
-dnl	Check how F9X handles modules. This macro also checks which
-dnl	command-line option to use to include the module once it's built.
-dnl
-AC_DEFUN(AC_F9X_MODS,
-[AC_MSG_CHECKING(what $FC does with modules)
-AC_LANG_PUSH(Fortran)
-
-test -d conftestdir || mkdir conftestdir
-cd conftestdir
-rm -rf *
-
-cat >conftest.$ac_ext <<EOF
-      module module
-         integer foo
-      end module module
-EOF
-
-eval $ac_compile
-modfiles=""
-F9XMODEXT=""
-
-for f in conftest.o module.mod MODULE.mod module.M MODULE.M; do
-  if test -f "$f" ; then
-    modfiles="$f"
-
-    case "$f" in
-      *.o)   F9XMODEXT="o" ;;
-      *.mod) F9XMODEXT="mod" ;;
-      *.M)   F9XMODEXT="M" ;;
-    esac
-  fi
-done
-
-echo $modfiles 6>&1
-if test "$modfiles" = file.o; then
-  echo $ac_n "checking whether $FC -em is saner""... $ac_c" 1>&6
-  OLD_FCFLAGS=$FCFLAGS
-  FCFLAGS="$FCFLAGS -em"
-  eval $ac_compile
-  modfiles=""
-  for f in file.o module.mod MODULE.mod module.M MODULE.M; do
-    test -f $f && modfiles="$f"
-  done
-  if test "$modfiles" = "file.o"; then
-    FCFLAGS=$OLD_FCFLAGS
-    echo no 6>&1
-  else
-    echo yes 6>&1
-  fi
-fi
-cd ..
-
-AC_MSG_CHECKING(how $FC finds modules)
-
-for flag in "-I" "-M" "-p"; do
-  cat >conftest.$ac_ext <<EOF
-      program conftest
-          use module
-      end program conftest
-EOF
-
-  ac_compile='${FC-f90} $FCFLAGS ${flag}conftestdir -c conftest.$ac_ext 1>&AS_MESSAGE_LOG_FD'
-
-  if AC_TRY_EVAL(ac_compile); then
-    F9XMODFLAG=$flag
-    break
-  fi
-done
-
-if test -n "$F9XMODFLAG"; then
-  echo $F9XMODFLAG 1>&6
-  FCFLAGS="$F9XMODFLAG. $FCFLAGS"
-else
-  echo unknown 1>&6
-fi
-AC_SUBST(F9XMODFLAG)
-AC_SUBST(F9XMODEXT)
-rm -rf conftest*
-AC_LANG_POP(Fortran)
-])
-
diff --git a/autogen.sh b/autogen.sh
new file mode 100755
index 0000000..3c0ad7b
--- /dev/null
+++ b/autogen.sh
@@ -0,0 +1,300 @@
+#! /bin/bash
+#
+# Copyright by The HDF Group.                                              
+# All rights reserved.                                                     
+#                                                                          
+# This file is part of HDF5. The full HDF5 copyright notice, including     
+# terms governing use, modification, and redistribution, is contained in   
+# the files COPYING and Copyright.html.  COPYING can be found at the root  
+# of the source code distribution tree; Copyright.html can be found at the 
+# root level of an installed copy of the electronic document set and is    
+# linked from the top-level documents page.  It can also be found at       
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have access  
+# to either file, you may request a copy from help at hdfgroup.org.           
+#
+
+# A script to reconfigure autotools for HDF5, and to recreate other
+# generated files specifc to HDF5.
+#
+# IMPORTANT OS X NOTE
+#
+# If you are using OS X, you will probably not have the autotools
+# installed, even if you have the Xcode command-line tools.
+#
+# The easiest way to fix this is to install everything via Homebrew:
+#
+#   http://brew.sh/
+#
+# After you install the base packages, install autoconf, automake,
+# and libtool.
+#
+#   brew install autoconf
+#   brew install automake
+#   brew install libtool
+#
+# This only takes a few minutes. Note that libtool and libtoolize will
+# be glibtool and glibtoolize so as not to conflict with Apple's non-gnu
+# tools. This autogen.sh script handles this for you.
+#
+# END IMPORTANT OS X NOTE
+#
+# If you want to use a particular version of the autotools, the paths
+# to each tool can be overridden using the following environment
+# variables:
+#
+#   HDF5_ACLOCAL
+#   HDF5_AUTOHEADER
+#   HDF5_AUTOMAKE
+#   HDF5_AUTOCONF
+#   HDF5_LIBTOOL
+#   HDF5_M4
+#
+# Note that aclocal will attempt to include libtool's share/aclocal
+# directory.
+#
+# This script takes two potential options:
+#
+# -p
+#
+# When this is selected, the autotools versions are set to the paths
+# and versions used by The HDF Group to produce the released versions
+# of the library.
+#
+# NOTE: This is probably temporary. Once we update our dev machines
+# to have recent versions of the autotools this option will probably
+# be removed.
+#
+# -v
+#
+# This emits some extra information, mainly tool versions.
+
+echo
+echo "**************************"
+echo "* HDF5 autogen.sh script *"
+echo "**************************"
+echo
+
+# Default is not production
+production=false
+
+# Default is not verbose output
+verbose=false
+
+optspec=":hpv-"
+while getopts "$optspec" optchar; do
+    case "${optchar}" in
+    h)
+        echo "usage: $0 [OPTIONS]"
+        echo
+        echo "      -h      Print this help message."
+        echo
+        echo "      -p      Used by THG to use hard-codes autotools"
+        echo "              paths on THG machines. Not for non-HDF-Group"
+        echo "              users!"
+        echo
+        echo "      -v      Show more verbose output."
+        echo
+        echo "  NOTE: Each tool can be set via an environment variable."
+        echo "        These are documented inside this autogen.sh script."
+        echo
+        exit 0
+        ;;
+    p)
+        echo "Setting THG production mode..."
+        echo
+        production=true
+        ;;
+    v)
+        echo "Setting verbosity: high"
+        echo
+        verbose=true
+        ;;
+    *)
+        if [ "$OPTERR" != 1 ] || [ "${optspec:0:1}" = ":" ]; then
+            echo "Non-option argument: '-${OPTARG}'" >&2
+        fi
+        ;;
+    esac
+done
+
+if [ "$production" = true ] ; then
+
+    # Production mode
+    #
+    # Hard-code canonical HDF Group tool locations.
+
+    # If paths to tools are not specified, assume they are
+    # located in /usr/hdf/bin/AUTOTOOLS and set paths accordingly.
+    if test -z ${HDF5_AUTOCONF}; then
+        HDF5_AUTOCONF=/usr/hdf/bin/AUTOTOOLS/autoconf
+    fi
+    if test -z ${HDF5_AUTOMAKE}; then
+        HDF5_AUTOMAKE=/usr/hdf/bin/AUTOTOOLS/automake
+    fi
+    if test -z ${HDF5_AUTOHEADER}; then
+        HDF5_AUTOHEADER=/usr/hdf/bin/AUTOTOOLS/autoheader
+    fi
+    if test -z ${HDF5_ACLOCAL}; then
+        HDF5_ACLOCAL=/usr/hdf/bin/AUTOTOOLS/aclocal
+    fi
+    if test -z ${HDF5_LIBTOOL}; then
+        HDF5_LIBTOOL=/usr/hdf/bin/AUTOTOOLS/libtool
+    fi
+    if test -z ${HDF5_M4}; then
+        HDF5_M4=/usr/hdf/bin/AUTOTOOLS/m4
+    fi
+
+else
+
+    # Not in production mode
+    #
+    # If paths to autotools are not specified, use whatever the system
+    # has installed as the default. We use 'which <tool>' to
+    # show exactly what's being used.
+    if test -z ${HDF5_AUTOCONF}; then
+        HDF5_AUTOCONF=$(which autoconf)
+    fi
+    if test -z ${HDF5_AUTOMAKE}; then
+        HDF5_AUTOMAKE=$(which automake)
+    fi
+    if test -z ${HDF5_AUTOHEADER}; then
+        HDF5_AUTOHEADER=$(which autoheader)
+    fi
+    if test -z ${HDF5_ACLOCAL}; then
+        HDF5_ACLOCAL=$(which aclocal)
+    fi
+    if test -z ${HDF5_LIBTOOL}; then
+        case "`uname`" in
+        Darwin*)
+            # libtool on OS-X is non-gnu
+            HDF5_LIBTOOL=$(which glibtool)
+            ;;
+        *)
+            HDF5_LIBTOOL=$(which libtool)
+            ;;
+        esac
+    fi
+    if test -z ${HDF5_M4}; then
+        HDF5_M4=$(which m4)
+    fi
+
+fi # production
+
+
+# Make sure that these versions of the autotools are in the path
+AUTOCONF_DIR=`dirname ${HDF5_AUTOCONF}`
+LIBTOOL_DIR=`dirname ${HDF5_LIBTOOL}`
+M4_DIR=`dirname ${HDF5_M4}`
+PATH=${AUTOCONF_DIR}:${LIBTOOL_DIR}:${M4_DIR}:$PATH
+
+# Make libtoolize match the specified libtool
+case "`uname`" in
+Darwin*)
+    # On OS X, libtoolize could be named glibtoolize or
+    # libtoolize. Try the former first, then fall back
+    # to the latter if it's not found.
+    HDF5_LIBTOOLIZE="${LIBTOOL_DIR}/glibtoolize"
+    if [ ! -f $HDF5_LIBTOOLIZE ] ; then
+        HDF5_LIBTOOLIZE="${LIBTOOL_DIR}/libtoolize"
+    fi
+    ;;
+*)
+    HDF5_LIBTOOLIZE="${LIBTOOL_DIR}/libtoolize"
+    ;;
+esac
+
+# Run autotools in order
+#
+# When available, we use the --force option to ensure all files are
+# updated. This prevents the autotools from re-running to fix dependencies
+# during the 'make' step, which can be a problem if environment variables
+# were set on the command line during autogen invocation.
+
+# Some versions of libtoolize will suggest that we add ACLOCAL_AMFLAGS
+# = '-I m4'. This is already done in commence.am, which is included
+# in Makefile.am. You can ignore this suggestion.
+
+# LIBTOOLIZE
+libtoolize_cmd="${HDF5_LIBTOOLIZE} --copy --force"
+echo ${libtoolize_cmd}
+if [ "$verbose" = true ] ; then
+    ${HDF5_LIBTOOLIZE} --version
+fi
+${libtoolize_cmd} || exit 1
+echo
+echo "NOTE: You can ignore the warning about adding -I m4."
+echo "      We already do this in an included file."
+echo
+
+# ACLOCAL
+if test -e "${LIBTOOL_DIR}/../share/aclocal" ; then
+    aclocal_include="-I ${LIBTOOL_DIR}/../share/aclocal"
+fi
+aclocal_cmd="${HDF5_ACLOCAL} --force -I m4 ${aclocal_include}"
+echo ${aclocal_cmd}
+if [ "$verbose" = true ] ; then
+    ${HDF5_ACLOCAL} --version
+fi
+${aclocal_cmd} || exit 1
+echo
+
+# AUTOHEADER
+autoheader_cmd="${HDF5_AUTOHEADER} --force"
+echo ${autoheader_cmd}
+if [ "$verbose" = true ] ; then
+    ${HDF5_AUTOHEADER} --version
+fi
+${autoheader_cmd} || exit 1
+echo
+
+# AUTOMAKE
+automake_cmd="${HDF5_AUTOMAKE} --copy --add-missing --force-missing"
+echo ${automake_cmd}
+if [ "$verbose" = true ] ; then
+    ${HDF5_AUTOMAKE} --version
+fi
+${automake_cmd} || exit 1
+echo
+
+# AUTOCONF
+autoconf_cmd="${HDF5_AUTOCONF} --force"
+echo ${autoconf_cmd}
+if [ "$verbose" = true ] ; then
+    ${HDF5_AUTOCONF} --version
+fi
+${autoconf_cmd} || exit 1
+echo
+
+# Run scripts that process source.
+
+# Run trace script
+# The trace script adds H5TRACE macros to library source files.  It should
+# have no effect on files that don't have HDF5 API macros in them.
+echo
+echo "Running trace script:"
+bin/trace src/H5*.c || exit 1
+
+# Run make_err
+# make_err automatically generates the H5E headers that create error message
+# types for HDF5.
+echo
+echo "Running error generation script:"
+bin/make_err src/H5err.txt || exit 1
+
+# Run make_vers
+# make_vers automatically generates the public headers that define the API version
+# macros for HDF5.
+echo
+echo "Running API version generation script:"
+bin/make_vers src/H5vers.txt || exit 1
+
+# Run make_overflow
+# make_overflow automatically generates macros for detecting overflows for type
+# conversion.
+echo
+echo "Running overflow macro generation script:"
+bin/make_overflow src/H5overflow.txt || exit 1
+
+echo
+exit 0
+
diff --git a/bin/chkmanifest b/bin/chkmanifest
index 646f815..701b6c4 100755
--- a/bin/chkmanifest
+++ b/bin/chkmanifest
@@ -17,9 +17,12 @@
 # Check that all the files in MANIFEST exist and that (if this is a
 # SVN checkout) that all the SVN-managed files appear in the
 # MANIFEST.
+# 
 
 verbose=yes
 MANIFEST=/tmp/HD_MANIFEST.$$
+AUTOGEN=./autogen.sh
+AUTOGEN_LOG=/tmp/autogen.log.$$
 
 # Main
 test "$verbose" && echo "   Checking MANIFEST..." 1>&2
@@ -49,6 +52,19 @@ else
     fi
 fi
 
+# Do an autogen if generated files (e.g., configure) is not present
+if [ ! -f configure ]; then
+    echo "   running $AUTOGEN -p"
+    $AUTOGEN -p > $AUTOGEN_LOG 2>&1
+    if [ $? -ne 0 ]; then
+	echo $AUTOGEN encountered error. Abort.
+	echo output from $AUTOGEN:
+	cat $AUTOGEN_LOG
+	exit 1
+    fi
+    rm $AUTOGEN_LOG
+fi
+
 # Check for duplicate entries.  This can be done at any time, but it may as 
 # well be sooner so that if something else fails the presence of duplicates
 # will already be known.
diff --git a/bin/cmakehdf5 b/bin/cmakehdf5
index 715d6d7..48869cf 100755
--- a/bin/cmakehdf5
+++ b/bin/cmakehdf5
@@ -12,8 +12,6 @@
 DPRINT=:
 #DPRINT=echo
 
-# use the ctest scripting method if --script is given
-if [ "$1" != "--script" ]; then
 # variable names
 # The "extra" number is the step number and easier to see all logfiles in
 # the sorted order of steps
@@ -23,6 +21,7 @@ makelog="#${progname}_2build.log"
 testlog="#${progname}_3test.log"
 packlog="#${progname}_4pack.log"
 installlog="#${progname}_5install.log"
+vflag=1		# verbose flag default to on.
 config_summary=libhdf5.settings
 exit_code=0
 
@@ -46,14 +45,17 @@ fi
 cacheinit=$srcdir/config/cmake/cacheinit.cmake
 build_cpp_lib=-DHDF5_BUILD_CPP_LIB:BOOL=OFF	# C++ interface default off
 build_fortran=-DHDF5_BUILD_FORTRAN:BOOL=OFF	# Fortran interface default off
-enable_f2003=-DHDF5_ENABLE_F2003:BOOL=OFF	# Fortran2003 interface default off
 build_hl_lib=-DHDF5_BUILD_HL_LIB:BOOL=ON	# High Level interface default on
 build_testing=-DBUILD_TESTING:BOOL=ON		# Build tests default on
 build_tools=-DHDF5_BUILD_TOOLS:BOOL=ON		# Build tools default on
 with_zlib=-DHDF5_ENABLE_Z_LIB_SUPPORT=ON	# enable zlib filter default on
-with_szlib=-DHDF5_ENABLE_SZIP_SUPPORT=OFF	# enables zlib filter default off
+with_szlib=-DHDF5_ENABLE_SZIP_SUPPORT=OFF	# enables szip filter default off
+szlib_path=""					# szip lib path default off
 shared_lib=-DBUILD_SHARED_LIBS:BOOL=ON		# enables shared lib; default on
-
+njobs=""					# number of jobs (commands) to
+						# run simultaneously; default is
+						# value from $MAKE if defined,
+						# otherwise none (1)
 
 #=============
 # Function definitions
@@ -76,8 +78,6 @@ Usage: $progname [<options>]
   where options are:
   --enable-fortran | --disable-fortran:
     enable or disable fortran API. Default is off.
-  --enable-fortran2003 | --disable-fortran2003:
-    enable or disable fortran2003 API. Default is off.
   --enable-cxx | --disable-cxx:
     enable or disable c++ API. Default is off.
   --enable-hl | --disable-hl:
@@ -88,9 +88,18 @@ Usage: $progname [<options>]
     enable or disable building tools. Default is on.
   --enable-testing | --disable-testing:
     enable or disable building tests. Default is on.
-  --with-zlib | --without-zlib:
+  --with-zlib | --with-zlib=<libpath> | --without-zlib:
     Use zlib library for external deflate I/O filter. Default is on.
+  --with-szlib | --with-szlib=<libpath> | --without-szlib:
+    Use szlib library for external deflate I/O filter. Default is on.
+  --njobs=<-j N>:
+    number of jobs (commands) to run simultaneously; default is value from
+    $MAKE if defined, otherwise none
+  --enable-verbose | --disable-verbose:
+    enable or disable verbose output. Default is on.
   --help: shows details help page
+
+  <libpath>: the file path to the library, expect <libpath>/lib and <libpath>/include.
 EOF
 }
 
@@ -115,12 +124,12 @@ STEP()
 
     echo "$banner" with output saved in $logfile
     (TIMESTAMP; nerror=0 ;
-	echo "eval $command"
-	eval $command || nerror=1 ;
-	TIMESTAMP; exit $nerror) < /dev/null > "$logfile" 2>&1
+  echo "eval $command"
+  eval $command || nerror=1 ;
+  TIMESTAMP; exit $nerror) < /dev/null > "$logfile" 2>&1
     if [ $? -ne 0 ]; then
-	echo "error in '$banner'.  $progname aborted."
-	exit 1
+  echo "error in '$banner'.  $progname aborted."
+  exit 1
     fi
 }
 
@@ -134,28 +143,44 @@ INSTALL_HDF5()
 {
     myos="`uname -s`"
     case "$myos" in
-	Linux)
-	    install_file=./HDF5-${version}-Linux.sh
-	    $install_file  --skip-license $*
-	    ;;
-	Darwin)		# Mac OSX DMG file
-	    install_file=HDF5-${version}-Darwin.dmg
-	    test -d hdf5 || mkdir hdf5
-	    basename=`basename $install_file .dmg`
-	    # mount the DMG file as /Volumes/$basename
-	    # echo 'Y' as yes for license.
-	    echo Y | hdiutil mount $install_file
-	    # copy the contents to the install location
-	    cp -R "/Volumes/$basename/HDF_Group" hdf5
-	    # unmount the DMG file
-	    hdiutil unmount /Volumes/$basename
-	    ;;
-	*) 		# unknown/unsupported OS.
-	    echo "INSTALL_HDF5: Error--unknown/unsupported OS($myos)"
-	    return 1
-	    ;;
+  Linux)
+      install_file=./HDF5-${version}-Linux.sh
+      $install_file  --skip-license $*
+      ;;
+  Darwin)		# Mac OSX DMG file
+      install_file=HDF5-${version}-Darwin.dmg
+      test -d hdf5 || mkdir hdf5
+      basename=`basename $install_file .dmg`
+      # mount the DMG file as /Volumes/$basename
+      # echo 'Y' as yes for license.
+      echo Y | hdiutil mount $install_file
+      # copy the contents to the install location
+      cp -R "/Volumes/$basename/HDF_Group" hdf5
+      # unmount the DMG file
+      hdiutil unmount /Volumes/$basename
+      ;;
+  *) 		# unknown/unsupported OS.
+      echo "INSTALL_HDF5: Error--unknown/unsupported OS($myos)"
+      return 1
+      ;;
     esac
-    return 0
+}
+
+
+# Print logfiles.
+# $*: logfiles
+DUMP_LOGFILE()
+{
+    for x in $*; do
+  if [ -f $x ]; then
+      echo "=================================="
+      echo "Dumping $x"
+      echo "=================================="
+      cat $x
+      echo "==== END $x ====="
+      echo
+  fi
+    done
 }
 
 
@@ -166,6 +191,12 @@ INSTALL_HDF5()
 # Show a start time stamp
 TIMESTAMP
 
+# Initialize njobs if $AMKE is defined
+if [ -n "$MAKE" ]; then
+    # assume all arguments are for --jobs
+    njobs=`echo $MAKE | cut -s -d' ' -f2-`
+fi
+
 # Parse Cmake configure options
 # --enable-XXX or --disable-XXX will enable or disable feature XXX.
 # XXX can be:
@@ -176,67 +207,88 @@ TIMESTAMP
 # tools		Build tools
 while [ $# -gt 0 ]; do
     case "$1" in
-	--enable-fortran)
-	    build_fortran=-DHDF5_BUILD_FORTRAN:BOOL=ON
-	    ;;
-	--disable-fortran)
-	    build_fortran=-DHDF5_BUILD_FORTRAN:BOOL=OFF
-	    ;;
-	--enable-fortran2003)
-	    enable_f2003=-DHDF5_ENABLE_F2003:BOOL=ON
-	    ;;
-	--disable-fortran2003)
-	    enable_f2003=-DHDF5_ENABLE_F2003:BOOL=OFF
-	    ;;
-	--enable-cxx)
-	    build_cpp_lib=-DHDF5_BUILD_CPP_LIB:BOOL=ON
-	    ;;
-	--disable-cxx)
-	    build_cpp_lib=-DHDF5_BUILD_CPP_LIB:BOOL=OFF
-	    ;;
-	--enable-hl)
-	    build_hl_lib=-DHDF5_BUILD_HL_LIB:BOOL=ON
-	    ;;
-	--disable-hl)
-	    build_hl_lib=-DHDF5_BUILD_HL_LIB:BOOL=OFF
-	    ;;
-	--enable-shared)
-	    shared_lib=-DBUILD_SHARED_LIBS:BOOL=ON
-	    ;;
-	--disable-shared)
-	    shared_lib=-DBUILD_SHARED_LIBS:BOOL=OFF
-	    ;;
-	--enable-tools)
-	    build_tools=-DHDF5_BUILD_TOOLS:BOOL=ON
-	    ;;
-	--disable-tools)
-	    build_tools=-DHDF5_BUILD_TOOLS:BOOL=OFF
-	    ;;
-	--enable-testing)
-	    build_testing=-DBUILD_TESTING:BOOL=ON
-	    ;;
-	--disable-testing)
-	    build_testing=-DBUILD_TESTING:BOOL=OFF
-	    ;;
-	--with-zlib)
-	    with_zlib=-DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=ON
-	    ;;
-	--without-zlib)
-	    with_zlib=-DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=OFF
-	    ;;
-	--help)
-	    # print the detail help page and exit
-	    HELP
-	    exit 0
-	    ;;
-	*)
-	    echo "Unknown options: $1"
-	    HELP
-	    exit 1
-	    ;;
+  --enable-fortran)
+      build_fortran=-DHDF5_BUILD_FORTRAN:BOOL=ON
+      ;;
+  --disable-fortran)
+      build_fortran=-DHDF5_BUILD_FORTRAN:BOOL=OFF
+      ;;
+  --enable-cxx)
+      build_cpp_lib=-DHDF5_BUILD_CPP_LIB:BOOL=ON
+      ;;
+  --disable-cxx)
+      build_cpp_lib=-DHDF5_BUILD_CPP_LIB:BOOL=OFF
+      ;;
+  --enable-hl)
+      build_hl_lib=-DHDF5_BUILD_HL_LIB:BOOL=ON
+      ;;
+  --disable-hl)
+      build_hl_lib=-DHDF5_BUILD_HL_LIB:BOOL=OFF
+      ;;
+  --enable-shared)
+      shared_lib=-DBUILD_SHARED_LIBS:BOOL=ON
+      ;;
+  --disable-shared)
+      shared_lib=-DBUILD_SHARED_LIBS:BOOL=OFF
+      ;;
+  --enable-tools)
+      build_tools=-DHDF5_BUILD_TOOLS:BOOL=ON
+      ;;
+  --disable-tools)
+      build_tools=-DHDF5_BUILD_TOOLS:BOOL=OFF
+      ;;
+  --enable-testing)
+      build_testing=-DBUILD_TESTING:BOOL=ON
+      ;;
+  --disable-testing)
+      build_testing=-DBUILD_TESTING:BOOL=OFF
+      ;;
+  --with-zlib)
+      with_zlib=-DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=ON
+      ;;
+  --with-zlib=*)
+      xarg=`echo $1 | cut -d= -f2-`
+      with_zlib="-DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=ON -DZLIB_ROOT=$xarg"
+      ;;
+  --without-zlib)
+      with_zlib=-DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=OFF
+      ;;
+  --with-szlib)
+      with_szlib=-DHDF5_ENABLE_SZIP_SUPPORT:BOOL=ON
+      szlib_path=""	# szlib is in default paths
+      ;;
+  --with-szlib=*)
+      xarg=`echo $1 | cut -d= -f2-`
+      with_szlib="-DHDF5_ENABLE_SZIP_SUPPORT:BOOL=ON"
+      szlib_path="SZIP_INSTALL=$xarg"
+      ;;
+  --without-szlib)
+      with_szlib=-DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF
+      szlib_path=""	# reset the path
+      ;;
+  --njobs=*)
+      njobs=`echo $1 | cut -d= -f2-`
+      ;;
+  --enable-verbose)
+      vflag=1
+      ;;
+  --disable-verbose)
+      vflag=0
+      ;;
+  --help)
+      # print the detail help page and exit
+      HELP
+      exit 0
+      ;;
+  *)
+      echo "Unknown options: $1"
+      HELP
+      exit 1
+      ;;
     esac
     shift
 done
+$DPRINT after option parsing vflag=$vflag
 
 # Always display the brief help page
 HELP_BRIEF
@@ -258,14 +310,21 @@ if [ $? != 0 ]; then
     echo $vers failed. Aborted.
     exit 1
 fi
-echo Running Cmake for HDF5-${version} ...  
+
+# setup output of all the log files if verbose is on upon exit
+trap \
+"if [ $vflag -ne 0 ]; then DUMP_LOGFILE \$configlog \$makelog \$testlog \$packlog \$installlog; fi" \
+0
+
+echo Running Cmake for HDF5-${version} ...
 #      4. Configure the C library, tools and tests with this command:
 #         If successful, append the configure summary to the configure logfile.
-STEP "Configure..." "cmake \
+STEP "Configure..." \
+   "env ${szlib_path} \
+    cmake \
     -C $cacheinit \
     $build_cpp_lib \
     $build_fortran \
-    $enable_f2003 \
     $build_hl_lib \
     $shared_lib \
     $build_testing \
@@ -274,18 +333,17 @@ STEP "Configure..." "cmake \
     $with_szlib \
     $srcdir" $configlog &&\
     cat $config_summary >> $configlog
-      
+
 #      5. Build the C library, tools and tests with this command:
-STEP "Build the library, tools and tests, ..." "cmake --build . --config Release" $makelog
-      
+STEP "Build the library, tools and tests, ..." "cmake --build . --config Release -- $njobs" $makelog
+
 #      6. Test the C library and tools with this command:
-STEP "Test the library and tools..." "ctest . -C Release" $testlog
-      
+STEP "Test the library and tools..." "ctest . -C Release $njobs" $testlog
+
 #      7. Create an install image with this command:
 STEP "Create an install image..." "cpack -C Release CPackConfig.cmake" $packlog
-      
+
 #      8. Install with this command:
-#STEP "Install..." "./HDF5-${version}-Linux.sh --skip-license" $installlog
 STEP "Install..." "INSTALL_HDF5" $installlog
 # save the last exit code
 exit_code=$?
@@ -293,262 +351,3 @@ exit_code=$?
 # Show a closing time stamp
 TIMESTAMP
 exit $exit_code
-
-else
-# ---------------
-# older version
-# ---------------
-
-# variable names
-progname=`basename $0`	# program name
-cminfile="cmakemin.$$" # Cmake minimum file
-cfgfile=$progname.$$	# configure file
-ctest_log=ctest.log    # output of ctest script
-install_log=install.log  # output of installation
-$DPRINT $cfgfile
-
-# Remove temporary generated files if exit 0
-trap "rm -f $cminfile $cfgfile" 0
-
-#=============
-# Function definitions
-#=============
-TIMESTAMP()
-{
-    echo "=====" "`date`" "====="
-}
-
-
-#==========
-# main
-#==========
-# Show a start time stamp
-TIMESTAMP
-
-# Explain what and where log files are.
-cat <<EOF
-$ctest_log: output of ctest script.
-$install_log: output of installation
-Log files will be stored in Testing/Temporary:
-    LastConfigure_<timestamp>.log: output of configure
-    LastBuild_<timestamp>.log: output of build
-    LastTest_<timestamp>.log: output of testing
-    LastTestsFailed_<timestamp>.log: list of failed tests
-
-EOF
-
-# First generate the two needed input files, the $cimnfile and $cfgfile.
-# Then use ctest to use the two input files.
-
-#==========
-# create the configure file
-#==========
-# Create the cmake minimum required file to be used by the following
-# configure file. Though not absolute needed, it is better to generate
-# this file before the configure file.  Quote the EOF to preven substitution
-# in the text.
-#==========
-#==========
-cat > $cfgfile <<'EOF'
-cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
-########################################################
-# This dashboard is maintained by The HDF Group
-# For any comments please contact cdashhelp at hdfgroup.org
-#
-########################################################
-
-set (CTEST_DASHBOARD_ROOT ${CTEST_SCRIPT_DIRECTORY})
-set (CTEST_SOURCE_DIRECTORY "../hdf5")
-set (CTEST_BINARY_DIRECTORY ".")
-set (CTEST_CMAKE_GENERATOR "Unix Makefiles")
-set (CTEST_BUILD_CONFIGURATION "Release")
-set (CTEST_MAX_N 8)
-
-# -- CDash variables
-set (LOCAL_NO_SUBMIT TRUE)	# No CDash submit.
-set (MODEL "Experimental")
-set (CDASH_LOCAL TRUE)
-set (SITE_BUILDNAME_SUFFIX "cmakehdf5")
-
-# -- URL set for internal check, default is to not update
-set (LOCAL_SKIP_UPDATE TRUE)
-set (REPOSITORY_URL "http://svn.${hdfgroup_url}/hdf5/branches/hdf5_1_8")
-# -- Standard build options  
-set (ADD_BUILD_OPTIONS "-DCMAKE_INSTALL_PREFIX:PATH=${CTEST_BINARY_DIRECTORY} -DHDF5_ALLOW_EXTERNAL_SUPPORT:STRING=\"SVN\" -DHDF5_PACKAGE_EXTLIBS:BOOL=ON")
-
-# Use multiple CPU cores to build
-include(ProcessorCount)
-ProcessorCount(N)
-if(NOT N EQUAL 0)
-  if(N GREATER ${CTEST_MAX_N})
-    set(N ${CTEST_MAX_N})
-  endif(N GREATER ${CTEST_MAX_N})
-  set(CTEST_BUILD_FLAGS -j${N})
-  set(ctest_test_args ${ctest_test_args} PARALLEL_LEVEL ${N})
-endif()
-
-# -----------------------------------------------------------  
-# -- Get environment
-# -----------------------------------------------------------  
-  ## -- set hostname
-  ## --------------------------
-  find_program (HOSTNAME_CMD NAMES hostname)
-  exec_program (${HOSTNAME_CMD} ARGS OUTPUT_VARIABLE HOSTNAME)
-  set (CTEST_SITE "${HOSTNAME}${CTEST_SITE_EXT}")
-  find_program (UNAME NAMES uname)
-  macro (getuname name flag)
-    exec_program ("${UNAME}" ARGS "${flag}" OUTPUT_VARIABLE "${name}")
-  endmacro (getuname)
-
-  getuname (osname -s)
-  getuname (osrel  -r)
-  getuname (cpu    -m)
-
-  if (SITE_BUILDNAME_SUFFIX)
-    set (CTEST_BUILD_NAME  "${osname}-${osrel}-${cpu}-${SITE_BUILDNAME_SUFFIX}")
-  else (SITE_BUILDNAME_SUFFIX)
-    set (CTEST_BUILD_NAME  "${osname}-${osrel}-${cpu}")
-  endif (SITE_BUILDNAME_SUFFIX)
-# -----------------------------------------------------------  
-  
-set (BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DSITE:STRING=${CTEST_SITE} -DBUILDNAME:STRING=${CTEST_BUILD_NAME}")
- 
-#-----------------------------------------------------------------------------
-# MAC machines need special option
-#-----------------------------------------------------------------------------
-if (APPLE)
-  # Compiler choice
-  execute_process(COMMAND xcrun --find cc OUTPUT_VARIABLE XCODE_CC OUTPUT_STRIP_TRAILING_WHITESPACE)
-  execute_process(COMMAND xcrun --find c++ OUTPUT_VARIABLE XCODE_CXX OUTPUT_STRIP_TRAILING_WHITESPACE)
-  SET(ENV{CC} "${XCODE_CC}")
-  SET(ENV{CXX} "${XCODE_CXX}")
-  # Shared fortran is not supported, build static 
-  set (BUILD_OPTIONS "${BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=OFF -DCMAKE_ANSI_CFLAGS:STRING=-fPIC")
-  set (BUILD_OPTIONS "${BUILD_OPTIONS} -DCTEST_USE_LAUNCHERS:BOOL=ON -DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=OFF")
-endif (APPLE)
-
-
-# -----------------------------------------------------------  
-find_package (Subversion)
-set (CTEST_UPDATE_COMMAND "${Subversion_SVN_EXECUTABLE}")
-# -- Only clean build folder if LOCAL_CLEAR_BUILD is set  
-if (LOCAL_CLEAR_BUILD)
-  set (CTEST_START_WITH_EMPTY_BINARY_DIRECTORY TRUE)
-  ctest_empty_binary_directory (${CTEST_BINARY_DIRECTORY})
-endif (LOCAL_CLEAR_BUILD)
-
-#-----------------------------------------------------------------------------
-# Send the main script as a note.
-list (APPEND CTEST_NOTES_FILES
-  "${CMAKE_CURRENT_LIST_FILE}"
-  "${CTEST_SOURCE_DIRECTORY}/config/cmake/cacheinit.cmake"
-  )
-
-# Check for required variables.
-foreach (req
-    CTEST_CMAKE_GENERATOR
-    CTEST_SITE
-    CTEST_BUILD_NAME
-    )
-  if (NOT DEFINED ${req})
-    message(FATAL_ERROR "The containing script must set ${req}")
-  endif (NOT DEFINED ${req})
-endforeach (req)
-
-## -- set output to english
-set($ENV{LC_MESSAGES}  "en_EN")
- 
-#-----------------------------------------------------------------------------
-# Initialize the CTEST commands
-#------------------------------
-set (CTEST_CMAKE_COMMAND "\"${CMAKE_COMMAND}\"")
-set (CTEST_CONFIGURE_COMMAND
-    "${CTEST_CMAKE_COMMAND} -C \"${CTEST_SOURCE_DIRECTORY}/config/cmake/cacheinit.cmake\" -DCMAKE_BUILD_TYPE:STRING=${CTEST_BUILD_CONFIGURATION} ${BUILD_OPTIONS} \"-G${CTEST_CMAKE_GENERATOR}\" \"${CTEST_SOURCE_DIRECTORY}\"")
-
-# Print summary information.
-foreach (v
-    CTEST_SITE
-    CTEST_BUILD_NAME
-    CTEST_SOURCE_DIRECTORY
-    CTEST_BINARY_DIRECTORY
-    CTEST_CMAKE_GENERATOR
-    CTEST_BUILD_CONFIGURATION
-    CTEST_CONFIGURE_COMMAND
-    CTEST_SCRIPT_DIRECTORY
-    )
-  set (vars "${vars}  ${v}=[${${v}}]\n")
-endforeach (v)
-message ("Dashboard script configuration:\n${vars}\n")
-
-CTEST_START (${MODEL} TRACK ${MODEL})
-if (NOT LOCAL_SKIP_UPDATE)
-  CTEST_UPDATE (SOURCE "${CTEST_SOURCE_DIRECTORY}")
-endif (NOT LOCAL_SKIP_UPDATE)
-CTEST_CONFIGURE (BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res)
-if(NOT res STREQUAL "0")
-  message (FATAL_ERROR "Configure FAILED")
-endif()
-message ("Configure DONE")
-CTEST_READ_CUSTOM_FILES ("${CTEST_BINARY_DIRECTORY}")
-if (NOT LOCAL_NO_SUBMIT)
-  CTEST_SUBMIT (PARTS Update Configure Notes)
-endif (NOT LOCAL_NO_SUBMIT)
-CTEST_BUILD (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND RETURN_VALUE res)
-if (NOT LOCAL_NO_SUBMIT)
-  CTEST_SUBMIT (PARTS Build)
-endif (NOT LOCAL_NO_SUBMIT)
-if(NOT res STREQUAL "0")
-  message (FATAL_ERROR "Build FAILED")
-endif()
-message ("build DONE")
-if (NOT LOCAL_SKIP_TEST)
-  CTEST_TEST (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND ${ctest_test_args} RETURN_VALUE res)
-  if (NOT LOCAL_NO_SUBMIT)
-    CTEST_SUBMIT (PARTS Test)
-  endif (NOT LOCAL_NO_SUBMIT)
-  if(NOT res STREQUAL "0")
-    message (FATAL_ERROR "Test FAILED")
-  endif()
-  message ("test DONE")
-endif (NOT LOCAL_SKIP_TEST)
-if(NOT LOCAL_MEMCHECK_TEST)
-  ##-----------------------------------------------
-  ## Package the product
-  ##-----------------------------------------------
-  execute_process(COMMAND cpack -C ${CTEST_BUILD_CONFIGURATION} -V
-    WORKING_DIRECTORY ${CTEST_BINARY_DIRECTORY}
-    RESULT_VARIABLE cpackResult
-    OUTPUT_VARIABLE cpackLog
-    ERROR_VARIABLE cpackLog.err
-  )
-  file(WRITE ${CTEST_BINARY_DIRECTORY}/cpack.log "${cpackLog.err}" "${cpackLog}")
-endif(NOT LOCAL_MEMCHECK_TEST)
-#-----------------------------------------------------------------------------
-
-message ("DONE")
-EOF
-
-
-# Run ctest
-ctest -S $cfgfile -C Release -V -O $ctest_log
-exit_code=$?
-if [ $exit_code = 0 ]; then
-    echo CTest script completed without error
-else
-    echo Error encountered CTest script
-fi
-# Using HDF5-*.sh because actual name is unavailable
-install_sh=HDF5-*.sh
-echo installing with $install_sh ...
-./$install_sh --skip-license > $install_log
-exit_code=$?
-if [ $exit_code = 0 ]; then
-    echo Complete without error
-else
-    echo Error encountered
-fi
-TIMESTAMP
-exit $exit_code
-
-fi
-
diff --git a/bin/compile b/bin/compile
index 9bc8e49..a85b723 100755
--- a/bin/compile
+++ b/bin/compile
@@ -1,22 +1,9 @@
 #! /bin/sh
-#
-# Copyright by The HDF Group.
-# Copyright by the Board of Trustees of the University of Illinois.
-# All rights reserved.
-#
-# This file is part of HDF5.  The full HDF5 copyright notice, including
-# terms governing use, modification, and redistribution, is contained in
-# the files COPYING and Copyright.html.  COPYING can be found at the root
-# of the source code distribution tree; Copyright.html can be found at the
-# root level of an installed copy of the electronic HDF5 document set and
-# is linked from the top-level documents page.  It can also be found at
-# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
-# access to either file, you may request a copy from help at hdfgroup.org.
-#
+# Wrapper for compilers which do not understand '-c -o'.
 
-# Wrapper for compilers which do not understand `-c -o'.
+scriptversion=2012-10-14.11; # UTC
 
-# Copyright 1999, 2000 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 # Written by Tom Tromey <tromey at cygnus.com>.
 #
 # This program is free software; you can redistribute it and/or modify
@@ -30,84 +17,331 @@
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
 # the same distribution terms that you use for the rest of that program.
 
-# Usage:
-# compile PROGRAM [ARGS]...
-# `-o FOO.o' is removed from the args passed to the actual compile.
+# This file is maintained in Automake, please report
+# bugs to <bug-automake at gnu.org> or send patches to
+# <automake-patches at gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" ""	$nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+  file=$1
+  case $file in
+    / | /[!/]*) # absolute file, and not a UNC file
+      if test -z "$file_conv"; then
+	# lazily determine how to convert abs files
+	case `uname -s` in
+	  MINGW*)
+	    file_conv=mingw
+	    ;;
+	  CYGWIN*)
+	    file_conv=cygwin
+	    ;;
+	  *)
+	    file_conv=wine
+	    ;;
+	esac
+      fi
+      case $file_conv/,$2, in
+	*,$file_conv,*)
+	  ;;
+	mingw/*)
+	  file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+	  ;;
+	cygwin/*)
+	  file=`cygpath -m "$file" || echo "$file"`
+	  ;;
+	wine/*)
+	  file=`winepath -w "$file" || echo "$file"`
+	  ;;
+      esac
+      ;;
+  esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+  func_file_conv "$1"
+  if test -z "$lib_path"; then
+    lib_path=$file
+  else
+    lib_path="$lib_path;$file"
+  fi
+  linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+  lib=$1
+  found=no
+  save_IFS=$IFS
+  IFS=';'
+  for dir in $lib_path $LIB
+  do
+    IFS=$save_IFS
+    if $shared && test -f "$dir/$lib.dll.lib"; then
+      found=yes
+      lib=$dir/$lib.dll.lib
+      break
+    fi
+    if test -f "$dir/$lib.lib"; then
+      found=yes
+      lib=$dir/$lib.lib
+      break
+    fi
+    if test -f "$dir/lib$lib.a"; then
+      found=yes
+      lib=$dir/lib$lib.a
+      break
+    fi
+  done
+  IFS=$save_IFS
 
-prog=$1
-shift
+  if test "$found" != yes; then
+    lib=$lib.lib
+  fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+  # Assume a capable shell
+  lib_path=
+  shared=:
+  linker_opts=
+  for arg
+  do
+    if test -n "$eat"; then
+      eat=
+    else
+      case $1 in
+	-o)
+	  # configure might choose to run compile as 'compile cc -o foo foo.c'.
+	  eat=1
+	  case $2 in
+	    *.o | *.[oO][bB][jJ])
+	      func_file_conv "$2"
+	      set x "$@" -Fo"$file"
+	      shift
+	      ;;
+	    *)
+	      func_file_conv "$2"
+	      set x "$@" -Fe"$file"
+	      shift
+	      ;;
+	  esac
+	  ;;
+	-I)
+	  eat=1
+	  func_file_conv "$2" mingw
+	  set x "$@" -I"$file"
+	  shift
+	  ;;
+	-I*)
+	  func_file_conv "${1#-I}" mingw
+	  set x "$@" -I"$file"
+	  shift
+	  ;;
+	-l)
+	  eat=1
+	  func_cl_dashl "$2"
+	  set x "$@" "$lib"
+	  shift
+	  ;;
+	-l*)
+	  func_cl_dashl "${1#-l}"
+	  set x "$@" "$lib"
+	  shift
+	  ;;
+	-L)
+	  eat=1
+	  func_cl_dashL "$2"
+	  ;;
+	-L*)
+	  func_cl_dashL "${1#-L}"
+	  ;;
+	-static)
+	  shared=false
+	  ;;
+	-Wl,*)
+	  arg=${1#-Wl,}
+	  save_ifs="$IFS"; IFS=','
+	  for flag in $arg; do
+	    IFS="$save_ifs"
+	    linker_opts="$linker_opts $flag"
+	  done
+	  IFS="$save_ifs"
+	  ;;
+	-Xlinker)
+	  eat=1
+	  linker_opts="$linker_opts $2"
+	  ;;
+	-*)
+	  set x "$@" "$1"
+	  shift
+	  ;;
+	*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+	  func_file_conv "$1"
+	  set x "$@" -Tp"$file"
+	  shift
+	  ;;
+	*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+	  func_file_conv "$1" mingw
+	  set x "$@" "$file"
+	  shift
+	  ;;
+	*)
+	  set x "$@" "$1"
+	  shift
+	  ;;
+      esac
+    fi
+    shift
+  done
+  if test -n "$linker_opts"; then
+    linker_opts="-link$linker_opts"
+  fi
+  exec "$@" $linker_opts
+  exit 1
+}
+
+eat=
+
+case $1 in
+  '')
+     echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake at gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "compile $scriptversion"
+    exit $?
+    ;;
+  cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
+    func_cl_wrapper "$@"      # Doesn't return...
+    ;;
+esac
 
 ofile=
 cfile=
-args=
-while test $# -gt 0; do
-   case "$1" in
-    -o)
-       # configure might choose to run compile as `compile cc -o foo foo.c'.
-       # So we do something ugly here.
-       ofile=$2
-       shift
-       case "$ofile" in
-	*.o | *.obj)
-	   ;;
-	*)
-	   args="$args -o $ofile"
-	   ofile=
-	   ;;
-       esac
-       ;;
-    *.c)
-       cfile=$1
-       args="$args $1"
-       ;;
-    *)
-       args="$args $1"
-       ;;
-   esac
-   shift
+
+for arg
+do
+  if test -n "$eat"; then
+    eat=
+  else
+    case $1 in
+      -o)
+	# configure might choose to run compile as 'compile cc -o foo foo.c'.
+	# So we strip '-o arg' only if arg is an object.
+	eat=1
+	case $2 in
+	  *.o | *.obj)
+	    ofile=$2
+	    ;;
+	  *)
+	    set x "$@" -o "$2"
+	    shift
+	    ;;
+	esac
+	;;
+      *.c)
+	cfile=$1
+	set x "$@" "$1"
+	shift
+	;;
+      *)
+	set x "$@" "$1"
+	shift
+	;;
+    esac
+  fi
+  shift
 done
 
 if test -z "$ofile" || test -z "$cfile"; then
-   # If no `-o' option was seen then we might have been invoked from a
-   # pattern rule where we don't need one.  That is ok -- this is a
-   # normal compilation that the losing compiler can handle.  If no
-   # `.c' file was seen then we are probably linking.  That is also
-   # ok.
-   exec "$prog" $args
+  # If no '-o' option was seen then we might have been invoked from a
+  # pattern rule where we don't need one.  That is ok -- this is a
+  # normal compilation that the losing compiler can handle.  If no
+  # '.c' file was seen then we are probably linking.  That is also
+  # ok.
+  exec "$@"
 fi
 
 # Name of file we expect compiler to create.
-cofile=`echo $cfile | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
 
 # Create the lock directory.
-# Note: use `[/.-]' here to ensure that we don't use the same name
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
 # that we are using for the .o file.  Also, base the name on the expected
 # object file name, since that is what matters with a parallel build.
-lockdir=`echo $cofile | sed -e 's|[/.-]|_|g'`.d
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
 while true; do
-   if mkdir $lockdir > /dev/null 2>&1; then
-      break
-   fi
-   sleep 1
+  if mkdir "$lockdir" >/dev/null 2>&1; then
+    break
+  fi
+  sleep 1
 done
 # FIXME: race condition here if user kills between mkdir and trap.
-trap "rmdir $lockdir; exit 1" 1 2 15
+trap "rmdir '$lockdir'; exit 1" 1 2 15
 
 # Run the compile.
-"$prog" $args
-status=$?
+"$@"
+ret=$?
 
 if test -f "$cofile"; then
-   mv "$cofile" "$ofile"
+  test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+  test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
 fi
 
-rmdir $lockdir
-exit $status
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/bin/config.guess b/bin/config.guess
index 03fe473..1f5c50c 100755
--- a/bin/config.guess
+++ b/bin/config.guess
@@ -1,14 +1,12 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
-#   Free Software Foundation, Inc.
+#   Copyright 1992-2014 Free Software Foundation, Inc.
 
-timestamp='2008-01-23'
+timestamp='2014-03-23'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
+# the Free Software Foundation; either version 3 of the License, or
 # (at your option) any later version.
 #
 # This program is distributed in the hope that it will be useful, but
@@ -17,26 +15,22 @@ timestamp='2008-01-23'
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner <per at bothner.com>.
-# Please send patches to <config-patches at gnu.org>.  Submit a context
-# diff and a properly formatted ChangeLog entry.
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner.
 #
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
 #
-# The plan is that this can be called by configure scripts if you
-# don't specify an explicit build system type.
+# Please send patches with a ChangeLog entry to config-patches at gnu.org.
+
 
 me=`echo "$0" | sed -e 's,.*/,,'`
 
@@ -56,8 +50,7 @@ version="\
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+Copyright 1992-2014 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -139,12 +132,33 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
 UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
 UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
 
+case "${UNAME_SYSTEM}" in
+Linux|GNU|GNU/*)
+	# If the system lacks a compiler, then just pick glibc.
+	# We could probably try harder.
+	LIBC=gnu
+
+	eval $set_cc_for_build
+	cat <<-EOF > $dummy.c
+	#include <features.h>
+	#if defined(__UCLIBC__)
+	LIBC=uclibc
+	#elif defined(__dietlibc__)
+	LIBC=dietlibc
+	#else
+	LIBC=gnu
+	#endif
+	EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+	;;
+esac
+
 # Note: order is significant - the case branches are not exclusive.
 
 case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     *:NetBSD:*:*)
 	# NetBSD (nbsd) targets should (where applicable) match one or
-	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
 	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
 	# switched to ELF, *-*-netbsd* would select the old
 	# object file format.  This provides both forward
@@ -170,7 +184,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
 		eval $set_cc_for_build
 		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-			| grep __ELF__ >/dev/null
+			| grep -q __ELF__
 		then
 		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
 		    # Return netbsd for either.  FIX?
@@ -180,7 +194,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 		fi
 		;;
 	    *)
-	        os=netbsd
+		os=netbsd
 		;;
 	esac
 	# The OS release
@@ -201,6 +215,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
 	echo "${machine}-${os}${release}"
 	exit ;;
+    *:Bitrig:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
+	exit ;;
     *:OpenBSD:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
 	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
@@ -223,7 +241,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
 		;;
 	*5.*)
-	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
 		;;
 	esac
 	# According to Compaq, /usr/sbin/psrinfo has been available on
@@ -269,7 +287,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	# A Xn.n version is an unreleased experimental baselevel.
 	# 1.2 uses "1.2" for uname -r.
 	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	exit ;;
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	exitcode=$?
+	trap '' 0
+	exit $exitcode ;;
     Alpha\ *:Windows_NT*:*)
 	# How do we know it's Interix rather than the generic POSIX subsystem?
 	# Should we change UNAME_MACHINE based on the output of uname instead
@@ -295,12 +316,12 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	echo s390-ibm-zvmoe
 	exit ;;
     *:OS400:*:*)
-        echo powerpc-ibm-os400
+	echo powerpc-ibm-os400
 	exit ;;
     arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
 	echo arm-acorn-riscix${UNAME_RELEASE}
 	exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
+    arm*:riscos:*:*|arm*:RISCOS:*:*)
 	echo arm-unknown-riscos
 	exit ;;
     SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
@@ -324,14 +345,33 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	case `/usr/bin/uname -p` in
 	    sparc) echo sparc-icl-nx7; exit ;;
 	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
     sun4H:SunOS:5.*:*)
 	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
 	exit ;;
     sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
 	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
 	exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+	echo i386-pc-auroraux${UNAME_RELEASE}
+	exit ;;
     i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
-	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
 	exit ;;
     sun4*:SunOS:6*:*)
 	# According to config.sub, this is the proper way to canonicalize
@@ -375,23 +415,23 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     # MiNT.  But MiNT is downward compatible to TOS, so this should
     # be no problem.
     atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
+	echo m68k-atari-mint${UNAME_RELEASE}
 	exit ;;
     atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
 	echo m68k-atari-mint${UNAME_RELEASE}
-        exit ;;
+	exit ;;
     *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
+	echo m68k-atari-mint${UNAME_RELEASE}
 	exit ;;
     milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit ;;
+	echo m68k-milan-mint${UNAME_RELEASE}
+	exit ;;
     hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit ;;
+	echo m68k-hades-mint${UNAME_RELEASE}
+	exit ;;
     *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit ;;
+	echo m68k-unknown-mint${UNAME_RELEASE}
+	exit ;;
     m68k:machten:*:*)
 	echo m68k-apple-machten${UNAME_RELEASE}
 	exit ;;
@@ -461,8 +501,8 @@ EOF
 	echo m88k-motorola-sysv3
 	exit ;;
     AViiON:dgux:*:*)
-        # DG/UX returns AViiON for all architectures
-        UNAME_PROCESSOR=`/usr/bin/uname -p`
+	# DG/UX returns AViiON for all architectures
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
 	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
 	then
 	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
@@ -475,7 +515,7 @@ EOF
 	else
 	    echo i586-dg-dgux${UNAME_RELEASE}
 	fi
- 	exit ;;
+	exit ;;
     M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
 	echo m88k-dolphin-sysv3
 	exit ;;
@@ -532,7 +572,7 @@ EOF
 		echo rs6000-ibm-aix3.2
 	fi
 	exit ;;
-    *:AIX:*:[456])
+    *:AIX:*:[4567])
 	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
 	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
 		IBM_ARCH=rs6000
@@ -575,52 +615,52 @@ EOF
 	    9000/[678][0-9][0-9])
 		if [ -x /usr/bin/getconf ]; then
 		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
-                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
-                    case "${sc_cpu_version}" in
-                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
-                      532)                      # CPU_PA_RISC2_0
-                        case "${sc_kernel_bits}" in
-                          32) HP_ARCH="hppa2.0n" ;;
-                          64) HP_ARCH="hppa2.0w" ;;
+		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+		    case "${sc_cpu_version}" in
+		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+		      532)                      # CPU_PA_RISC2_0
+			case "${sc_kernel_bits}" in
+			  32) HP_ARCH="hppa2.0n" ;;
+			  64) HP_ARCH="hppa2.0w" ;;
 			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
-                        esac ;;
-                    esac
+			esac ;;
+		    esac
 		fi
 		if [ "${HP_ARCH}" = "" ]; then
 		    eval $set_cc_for_build
-		    sed 's/^              //' << EOF >$dummy.c
+		    sed 's/^		//' << EOF >$dummy.c
 
-              #define _HPUX_SOURCE
-              #include <stdlib.h>
-              #include <unistd.h>
+		#define _HPUX_SOURCE
+		#include <stdlib.h>
+		#include <unistd.h>
 
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
+		int main ()
+		{
+		#if defined(_SC_KERNEL_BITS)
+		    long bits = sysconf(_SC_KERNEL_BITS);
+		#endif
+		    long cpu  = sysconf (_SC_CPU_VERSION);
 
-                  switch (cpu)
-              	{
-              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-              	case CPU_PA_RISC2_0:
-              #if defined(_SC_KERNEL_BITS)
-              	    switch (bits)
-              		{
-              		case 64: puts ("hppa2.0w"); break;
-              		case 32: puts ("hppa2.0n"); break;
-              		default: puts ("hppa2.0"); break;
-              		} break;
-              #else  /* !defined(_SC_KERNEL_BITS) */
-              	    puts ("hppa2.0"); break;
-              #endif
-              	default: puts ("hppa1.0"); break;
-              	}
-                  exit (0);
-              }
+		    switch (cpu)
+			{
+			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+			case CPU_PA_RISC2_0:
+		#if defined(_SC_KERNEL_BITS)
+			    switch (bits)
+				{
+				case 64: puts ("hppa2.0w"); break;
+				case 32: puts ("hppa2.0n"); break;
+				default: puts ("hppa2.0"); break;
+				} break;
+		#else  /* !defined(_SC_KERNEL_BITS) */
+			    puts ("hppa2.0"); break;
+		#endif
+			default: puts ("hppa1.0"); break;
+			}
+		    exit (0);
+		}
 EOF
 		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
 		    test -z "$HP_ARCH" && HP_ARCH=hppa
@@ -640,7 +680,7 @@ EOF
 	    # => hppa64-hp-hpux11.23
 
 	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
-		grep __LP64__ >/dev/null
+		grep -q __LP64__
 	    then
 		HP_ARCH="hppa2.0w"
 	    else
@@ -711,22 +751,22 @@ EOF
 	exit ;;
     C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
 	echo c1-convex-bsd
-        exit ;;
+	exit ;;
     C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
 	if getsysinfo -f scalar_acc
 	then echo c32-convex-bsd
 	else echo c2-convex-bsd
 	fi
-        exit ;;
+	exit ;;
     C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
 	echo c34-convex-bsd
-        exit ;;
+	exit ;;
     C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
 	echo c38-convex-bsd
-        exit ;;
+	exit ;;
     C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
 	echo c4-convex-bsd
-        exit ;;
+	exit ;;
     CRAY*Y-MP:*:*:*)
 	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
 	exit ;;
@@ -750,14 +790,14 @@ EOF
 	exit ;;
     F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
 	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-        exit ;;
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
     5000:UNIX_System_V:4.*:*)
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
-        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
 	exit ;;
     i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
 	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
@@ -769,34 +809,39 @@ EOF
 	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
 	exit ;;
     *:FreeBSD:*:*)
-	case ${UNAME_MACHINE} in
-	    pc98)
-		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	case ${UNAME_PROCESSOR} in
 	    amd64)
 		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
 	    *)
-		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
 	esac
 	exit ;;
-    i*:CYGWIN*:* | x*:CYGWIN*:*)
-    echo ${UNAME_MACHINE}-pc-cygwin
-    exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW64*:*)
+	echo ${UNAME_MACHINE}-pc-mingw64
+	exit ;;
     *:MINGW*:*)
 	echo ${UNAME_MACHINE}-pc-mingw32
 	exit ;;
+    *:MSYS*:*)
+	echo ${UNAME_MACHINE}-pc-msys
+	exit ;;
     i*:windows32*:*)
-    	# uname -m includes "-pc" on this system.
-    	echo ${UNAME_MACHINE}-mingw32
+	# uname -m includes "-pc" on this system.
+	echo ${UNAME_MACHINE}-mingw32
 	exit ;;
     i*:PW*:*)
 	echo ${UNAME_MACHINE}-pc-pw32
 	exit ;;
-    *:Interix*:[3456]*)
-    	case ${UNAME_MACHINE} in
+    *:Interix*:*)
+	case ${UNAME_MACHINE} in
 	    x86)
 		echo i586-pc-interix${UNAME_RELEASE}
 		exit ;;
-	    EM64T | authenticamd)
+	    authenticamd | genuineintel | EM64T)
 		echo x86_64-unknown-interix${UNAME_RELEASE}
 		exit ;;
 	    IA64)
@@ -806,6 +851,9 @@ EOF
     [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
 	echo i${UNAME_MACHINE}-pc-mks
 	exit ;;
+    8664:Windows_NT:*)
+	echo x86_64-pc-mks
+	exit ;;
     i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
 	# How do we know it's Interix rather than the generic POSIX subsystem?
 	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
@@ -815,7 +863,7 @@ EOF
     i*:UWIN*:*)
 	echo ${UNAME_MACHINE}-pc-uwin
 	exit ;;
-    amd64:CYGWIN*:*:*)
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
 	echo x86_64-unknown-cygwin
 	exit ;;
     p*:CYGWIN*:*)
@@ -826,210 +874,157 @@ EOF
 	exit ;;
     *:GNU:*:*)
 	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
 	exit ;;
     *:GNU/*:*:*)
 	# other systems with GNU libc and userland
-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
 	exit ;;
     i*86:Minix:*:*)
 	echo ${UNAME_MACHINE}-pc-minix
 	exit ;;
+    aarch64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+	esac
+	objdump --private-headers /bin/sh | grep -q ld.so.1
+	if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    arc:Linux:*:* | arceb:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     arm*:Linux:*:*)
 	eval $set_cc_for_build
 	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
 	    | grep -q __ARM_EABI__
 	then
-	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	else
-	    echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+		| grep -q __ARM_PCS_VFP
+	    then
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
+	    else
+		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
+	    fi
 	fi
 	exit ;;
     avr32*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     cris:Linux:*:*)
-	echo cris-axis-linux-gnu
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
 	exit ;;
     crisv32:Linux:*:*)
-	echo crisv32-axis-linux-gnu
+	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
 	exit ;;
     frv:Linux:*:*)
-    	echo frv-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    hexagon:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    i*86:Linux:*:*)
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
 	exit ;;
     ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
-    mips:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef mips
-	#undef mipsel
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=mipsel
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=mips
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
-	    /^CPU/{
-		s: ::g
-		p
-	    }'`"
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
-	;;
-    mips64:Linux:*:*)
+    mips:Linux:*:* | mips64:Linux:*:*)
 	eval $set_cc_for_build
 	sed 's/^	//' << EOF >$dummy.c
 	#undef CPU
-	#undef mips64
-	#undef mips64el
+	#undef ${UNAME_MACHINE}
+	#undef ${UNAME_MACHINE}el
 	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=mips64el
+	CPU=${UNAME_MACHINE}el
 	#else
 	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=mips64
+	CPU=${UNAME_MACHINE}
 	#else
 	CPU=
 	#endif
 	#endif
 EOF
-	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
-	    /^CPU/{
-		s: ::g
-		p
-	    }'`"
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
 	;;
-    or32:Linux:*:*)
-	echo or32-unknown-linux-gnu
+    openrisc*:Linux:*:*)
+	echo or1k-unknown-linux-${LIBC}
 	exit ;;
-    ppc:Linux:*:*)
-	echo powerpc-unknown-linux-gnu
+    or32:Linux:*:* | or1k*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
-    ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-gnu
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-${LIBC}
 	exit ;;
-    alpha:Linux:*:*)
-	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
-	  EV5)   UNAME_MACHINE=alphaev5 ;;
-	  EV56)  UNAME_MACHINE=alphaev56 ;;
-	  PCA56) UNAME_MACHINE=alphapca56 ;;
-	  PCA57) UNAME_MACHINE=alphapca56 ;;
-	  EV6)   UNAME_MACHINE=alphaev6 ;;
-	  EV67)  UNAME_MACHINE=alphaev67 ;;
-	  EV68*) UNAME_MACHINE=alphaev68 ;;
-        esac
-	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-${LIBC}
 	exit ;;
     parisc:Linux:*:* | hppa:Linux:*:*)
 	# Look for CPU level
 	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
-	  *)    echo hppa-unknown-linux-gnu ;;
+	  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
+	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
+	  *)    echo hppa-unknown-linux-${LIBC} ;;
 	esac
 	exit ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-gnu
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-${LIBC}
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-${LIBC}
+	exit ;;
+    ppc64le:Linux:*:*)
+	echo powerpc64le-unknown-linux-${LIBC}
+	exit ;;
+    ppcle:Linux:*:*)
+	echo powerpcle-unknown-linux-${LIBC}
 	exit ;;
     s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux
+	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
 	exit ;;
     sh64*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
+    tile*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-gnu
+	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
 	exit ;;
     x86_64:Linux:*:*)
-	echo x86_64-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     xtensa*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
-    i*86:Linux:*:*)
-	# The BFD linker knows what the default object file format is, so
-	# first see if it will tell us. cd to the root directory to prevent
-	# problems with other programs or directories called `ld' in the path.
-	# Set LC_ALL=C to ensure ld outputs messages in English.
-	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
-			 | sed -ne '/supported targets:/!d
-				    s/[ 	][ 	]*/ /g
-				    s/.*supported targets: *//
-				    s/ .*//
-				    p'`
-        case "$ld_supported_targets" in
-	  elf32-i386)
-		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
-		;;
-	  a.out-i386-linux)
-		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
-		exit ;;
-	  coff-i386)
-		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
-		exit ;;
-	  "")
-		# Either a pre-BFD a.out linker (linux-gnuoldld) or
-		# one that does not give us useful --help.
-		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
-		exit ;;
-	esac
-	# Determine whether the default compiler is a.out or elf
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <features.h>
-	#ifdef __ELF__
-	# ifdef __GLIBC__
-	#  if __GLIBC__ >= 2
-	LIBC=gnu
-	#  else
-	LIBC=gnulibc1
-	#  endif
-	# else
-	LIBC=gnulibc1
-	# endif
-	#else
-	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
-	LIBC=gnu
-	#else
-	LIBC=gnuaout
-	#endif
-	#endif
-	#ifdef __dietlibc__
-	LIBC=dietlibc
-	#endif
-EOF
-	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
-	    /^LIBC/{
-		s: ::g
-		p
-	    }'`"
-	test x"${LIBC}" != x && {
-		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
-		exit
-	}
-	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
-	;;
     i*86:DYNIX/ptx:4*:*)
 	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
 	# earlier versions are messed up and put the nodename in both
@@ -1037,11 +1032,11 @@ EOF
 	echo i386-sequent-sysv4
 	exit ;;
     i*86:UNIX_SV:4.2MP:2.*)
-        # Unixware is an offshoot of SVR4, but it has its own version
-        # number series starting with 2...
-        # I am not positive that other SVR4 systems won't match this,
+	# Unixware is an offshoot of SVR4, but it has its own version
+	# number series starting with 2...
+	# I am not positive that other SVR4 systems won't match this,
 	# I just have to hope.  -- rms.
-        # Use sysv4.2uw... so that sysv4* matches it.
+	# Use sysv4.2uw... so that sysv4* matches it.
 	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
 	exit ;;
     i*86:OS/2:*:*)
@@ -1058,7 +1053,7 @@ EOF
     i*86:syllable:*:*)
 	echo ${UNAME_MACHINE}-pc-syllable
 	exit ;;
-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
 	echo i386-unknown-lynxos${UNAME_RELEASE}
 	exit ;;
     i*86:*DOS:*:*)
@@ -1073,7 +1068,7 @@ EOF
 	fi
 	exit ;;
     i*86:*:5:[678]*)
-    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	# UnixWare 7.x, OpenUNIX and OpenServer 6.
 	case `/bin/uname -X | grep "^Machine"` in
 	    *486*)	     UNAME_MACHINE=i486 ;;
 	    *Pentium)	     UNAME_MACHINE=i586 ;;
@@ -1101,10 +1096,13 @@ EOF
 	exit ;;
     pc:*:*:*)
 	# Left here for compatibility:
-        # uname -m prints for DJGPP always 'pc', but it prints nothing about
-        # the processor, so we play safe by assuming i386.
-	echo i386-pc-msdosdjgpp
-        exit ;;
+	# uname -m prints for DJGPP always 'pc', but it prints nothing about
+	# the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+	exit ;;
     Intel:Mach:3*:*)
 	echo i386-pc-mach3
 	exit ;;
@@ -1139,8 +1137,18 @@ EOF
 	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
 	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
     3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && { echo i486-ncr-sysv4; exit; } ;;
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
     m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
 	echo m68k-unknown-lynxos${UNAME_RELEASE}
 	exit ;;
@@ -1153,7 +1161,7 @@ EOF
     rs6000:LynxOS:2.*:*)
 	echo rs6000-unknown-lynxos${UNAME_RELEASE}
 	exit ;;
-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
 	echo powerpc-unknown-lynxos${UNAME_RELEASE}
 	exit ;;
     SM[BE]S:UNIX_SV:*:*)
@@ -1173,10 +1181,10 @@ EOF
 		echo ns32k-sni-sysv
 	fi
 	exit ;;
-    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                      # says <Richard.M.Bartel at ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit ;;
+    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+			# says <Richard.M.Bartel at ccMail.Census.GOV>
+	echo i586-unisys-sysv4
+	exit ;;
     *:UNIX_System_V:4*:FTX*)
 	# From Gerald Hewes <hewes at openmarket.com>.
 	# How about differentiating between stratus architectures? -djm
@@ -1202,11 +1210,11 @@ EOF
 	exit ;;
     R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
 	if [ -d /usr/nec ]; then
-	        echo mips-nec-sysv${UNAME_RELEASE}
+		echo mips-nec-sysv${UNAME_RELEASE}
 	else
-	        echo mips-unknown-sysv${UNAME_RELEASE}
+		echo mips-unknown-sysv${UNAME_RELEASE}
 	fi
-        exit ;;
+	exit ;;
     BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
 	echo powerpc-be-beos
 	exit ;;
@@ -1216,6 +1224,12 @@ EOF
     BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
 	echo i586-pc-beos
 	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    x86_64:Haiku:*:*)
+	echo x86_64-unknown-haiku
+	exit ;;
     SX-4:SUPER-UX:*:*)
 	echo sx4-nec-superux${UNAME_RELEASE}
 	exit ;;
@@ -1242,9 +1256,31 @@ EOF
 	exit ;;
     *:Darwin:*:*)
 	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	case $UNAME_PROCESSOR in
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
+	eval $set_cc_for_build
+	if test "$UNAME_PROCESSOR" = unknown ; then
+	    UNAME_PROCESSOR=powerpc
+	fi
+	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+	    if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		    (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		    grep IS_64BIT_ARCH >/dev/null
+		then
+		    case $UNAME_PROCESSOR in
+			i386) UNAME_PROCESSOR=x86_64 ;;
+			powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		    esac
+		fi
+	    fi
+	elif test "$UNAME_PROCESSOR" = i386 ; then
+	    # Avoid executing cc on OS X 10.9, as it ships with a stub
+	    # that puts up a graphical alert prompting to install
+	    # developer tools.  Any system running Mac OS X 10.7 or
+	    # later (Darwin 11 and later) is required to have a 64-bit
+	    # processor. This is not true of the ARM version of Darwin
+	    # that Apple uses in portable devices.
+	    UNAME_PROCESSOR=x86_64
+	fi
 	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
 	exit ;;
     *:procnto*:*:* | *:QNX:[0123456789]*:*)
@@ -1258,7 +1294,10 @@ EOF
     *:QNX:*:4*)
 	echo i386-pc-qnx
 	exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
+    NEO-?:NONSTOP_KERNEL:*:*)
+	echo neo-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSE-*:NONSTOP_KERNEL:*:*)
 	echo nse-tandem-nsk${UNAME_RELEASE}
 	exit ;;
     NSR-?:NONSTOP_KERNEL:*:*)
@@ -1303,13 +1342,13 @@ EOF
 	echo pdp10-unknown-its
 	exit ;;
     SEI:*:*:SEIUX)
-        echo mips-sei-seiux${UNAME_RELEASE}
+	echo mips-sei-seiux${UNAME_RELEASE}
 	exit ;;
     *:DragonFly:*:*)
 	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
 	exit ;;
     *:*VMS:*:*)
-    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	UNAME_MACHINE=`(uname -p) 2>/dev/null`
 	case "${UNAME_MACHINE}" in
 	    A*) echo alpha-dec-vms ; exit ;;
 	    I*) echo ia64-dec-vms ; exit ;;
@@ -1324,158 +1363,13 @@ EOF
     i*86:rdos:*:*)
 	echo ${UNAME_MACHINE}-pc-rdos
 	exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-          "4"
-#else
-	  ""
-#endif
-         ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
 	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
+    x86_64:VMkernel:*:*)
+	echo ${UNAME_MACHINE}-unknown-esx
 	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
+esac
 
 cat >&2 <<EOF
 $0: unable to guess system type
diff --git a/bin/config.sub b/bin/config.sub
index 6759825..bba4efb 100755
--- a/bin/config.sub
+++ b/bin/config.sub
@@ -1,44 +1,40 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
-#   Free Software Foundation, Inc.
+#   Copyright 1992-2014 Free Software Foundation, Inc.
 
-timestamp='2008-01-16'
+timestamp='2014-09-11'
 
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
 # (at your option) any later version.
 #
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
 # configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
+# the same distribution terms that you use for the rest of that
+# program.  This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
 
 
-# Please send patches to <config-patches at gnu.org>.  Submit a context
-# diff and a properly formatted ChangeLog entry.
+# Please send patches with a ChangeLog entry to config-patches at gnu.org.
 #
 # Configuration subroutine to validate and canonicalize a configuration type.
 # Supply the specified configuration type as an argument.
 # If it is invalid, we print an error message on stderr and exit with code 1.
 # Otherwise, we print the canonical config type on stdout and succeed.
 
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
 # This file is supposed to be the same for all GNU packages
 # and recognize all the CPU types, system types and aliases
 # that are meaningful with *any* GNU software.
@@ -72,8 +68,7 @@ Report bugs and patches to <config-patches at gnu.org>."
 version="\
 GNU config.sub ($timestamp)
 
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+Copyright 1992-2014 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -120,12 +115,18 @@ esac
 # Here we must recognize all the valid KERNEL-OS combinations.
 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
-  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
     ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
   *)
     basic_machine=`echo $1 | sed 's/-[^-]*$//'`
     if [ $basic_machine != $1 ]
@@ -148,10 +149,13 @@ case $os in
 	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
 	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
 	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray)
+	-apple | -axis | -knuth | -cray | -microblaze*)
 		os=
 		basic_machine=$1
 		;;
+	-bluegene*)
+		os=-cnk
+		;;
 	-sim | -cisco | -oki | -wec | -winbond)
 		os=
 		basic_machine=$1
@@ -166,10 +170,10 @@ case $os in
 		os=-chorusos
 		basic_machine=$1
 		;;
- 	-chorusrdb)
- 		os=-chorusrdb
+	-chorusrdb)
+		os=-chorusrdb
 		basic_machine=$1
- 		;;
+		;;
 	-hiux*)
 		os=-hiuxwe2
 		;;
@@ -214,6 +218,12 @@ case $os in
 	-isc*)
 		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
 		;;
+	-lynx*178)
+		os=-lynxos178
+		;;
+	-lynx*5)
+		os=-lynxos5
+		;;
 	-lynx*)
 		os=-lynxos
 		;;
@@ -238,59 +248,86 @@ case $basic_machine in
 	# Some are omitted here because they have special meanings below.
 	1750a | 580 \
 	| a29k \
+	| aarch64 | aarch64_be \
 	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
 	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
 	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+	| arc | arceb \
+	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
+	| avr | avr32 \
+	| be32 | be64 \
 	| bfin \
-	| c4x | clipper \
+	| c4x | c8051 | clipper \
 	| d10v | d30v | dlx | dsp16xx \
+	| epiphany \
 	| fido | fr30 | frv \
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| hexagon \
 	| i370 | i860 | i960 | ia64 \
 	| ip2k | iq2000 \
+	| k1om \
+	| le32 | le64 \
+	| lm32 \
 	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | mcore | mep \
+	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
 	| mips | mipsbe | mipseb | mipsel | mipsle \
 	| mips16 \
 	| mips64 | mips64el \
-	| mips64vr | mips64vrel \
+	| mips64octeon | mips64octeonel \
 	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
 	| mips64vr4100 | mips64vr4100el \
 	| mips64vr4300 | mips64vr4300el \
 	| mips64vr5000 | mips64vr5000el \
 	| mips64vr5900 | mips64vr5900el \
 	| mipsisa32 | mipsisa32el \
 	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa32r6 | mipsisa32r6el \
 	| mipsisa64 | mipsisa64el \
 	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64r6 | mipsisa64r6el \
 	| mipsisa64sb1 | mipsisa64sb1el \
 	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipsr5900 | mipsr5900el \
 	| mipstx39 | mipstx39el \
 	| mn10200 | mn10300 \
+	| moxie \
 	| mt \
 	| msp430 \
-	| nios | nios2 \
+	| nds32 | nds32le | nds32be \
+	| nios | nios2 | nios2eb | nios2el \
 	| ns16k | ns32k \
-	| or32 \
+	| open8 | or1k | or1knd | or32 \
 	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| powerpc | powerpc64 | powerpc64le | powerpcle \
 	| pyramid \
+	| riscv32 | riscv64 \
+	| rl78 | rx \
 	| score \
-	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
 	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| spu | strongarm \
-	| tahoe | thumb | tic4x | tic80 | tron \
-	| v850 | v850e \
+	| spu \
+	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+	| ubicom32 \
+	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
 	| we32k \
-	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
-	| z8k)
+	| x86 | xc16x | xstormy16 | xtensa \
+	| z8k | z80)
 		basic_machine=$basic_machine-unknown
 		;;
-	m6811 | m68hc11 | m6812 | m68hc12)
-		# Motorola 68HC11/12.
+	c54x)
+		basic_machine=tic54x-unknown
+		;;
+	c55x)
+		basic_machine=tic55x-unknown
+		;;
+	c6x)
+		basic_machine=tic6x-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
 		basic_machine=$basic_machine-unknown
 		os=-none
 		;;
@@ -300,6 +337,21 @@ case $basic_machine in
 		basic_machine=mt-unknown
 		;;
 
+	strongarm | thumb | xscale)
+		basic_machine=arm-unknown
+		;;
+	xgate)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	xscaleeb)
+		basic_machine=armeb-unknown
+		;;
+
+	xscaleel)
+		basic_machine=armel-unknown
+		;;
+
 	# We use `pc' rather than `unknown'
 	# because (1) that's what they normally are, and
 	# (2) the word "unknown" tends to confuse beginning users.
@@ -314,64 +366,82 @@ case $basic_machine in
 	# Recognize the basic CPU types with company name.
 	580-* \
 	| a29k-* \
+	| aarch64-* | aarch64_be-* \
 	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
 	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 	| avr-* | avr32-* \
+	| be32-* | be64-* \
 	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
-	| clipper-* | craynv-* | cydra-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* \
+	| c8051-* | clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
 	| elxsi-* \
 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 	| h8300-* | h8500-* \
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| hexagon-* \
 	| i*86-* | i860-* | i960-* | ia64-* \
 	| ip2k-* | iq2000-* \
+	| k1om-* \
+	| le32-* | le64-* \
+	| lm32-* \
 	| m32c-* | m32r-* | m32rle-* \
 	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+	| microblaze-* | microblazeel-* \
 	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
 	| mips16-* \
 	| mips64-* | mips64el-* \
-	| mips64vr-* | mips64vrel-* \
+	| mips64octeon-* | mips64octeonel-* \
 	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
 	| mips64vr4100-* | mips64vr4100el-* \
 	| mips64vr4300-* | mips64vr4300el-* \
 	| mips64vr5000-* | mips64vr5000el-* \
 	| mips64vr5900-* | mips64vr5900el-* \
 	| mipsisa32-* | mipsisa32el-* \
 	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa32r6-* | mipsisa32r6el-* \
 	| mipsisa64-* | mipsisa64el-* \
 	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64r6-* | mipsisa64r6el-* \
 	| mipsisa64sb1-* | mipsisa64sb1el-* \
 	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipsr5900-* | mipsr5900el-* \
 	| mipstx39-* | mipstx39el-* \
 	| mmix-* \
 	| mt-* \
 	| msp430-* \
-	| nios-* | nios2-* \
+	| nds32-* | nds32le-* | nds32be-* \
+	| nios-* | nios2-* | nios2eb-* | nios2el-* \
 	| none-* | np1-* | ns16k-* | ns32k-* \
+	| open8-* \
+	| or1k*-* \
 	| orion-* \
 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
 	| pyramid-* \
-	| romp-* | rs6000-* \
-	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| rl78-* | romp-* | rs6000-* | rx-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
-	| tahoe-* | thumb-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+	| tahoe-* \
 	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tile*-* \
 	| tron-* \
-	| v850-* | v850e-* | vax-* \
+	| ubicom32-* \
+	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+	| vax-* \
 	| we32k-* \
-	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* \
 	| xstormy16-* | xtensa*-* \
 	| ymp-* \
-	| z8k-*)
+	| z8k-* | z80-*)
 		;;
 	# Recognize the basic CPU types without company name, with glob match.
 	xtensa*)
@@ -393,7 +463,7 @@ case $basic_machine in
 		basic_machine=a29k-amd
 		os=-udi
 		;;
-    	abacus)
+	abacus)
 		basic_machine=abacus-unknown
 		;;
 	adobe68k)
@@ -439,6 +509,10 @@ case $basic_machine in
 		basic_machine=m68k-apollo
 		os=-bsd
 		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
 	aux)
 		basic_machine=m68k-apple
 		os=-aux
@@ -455,10 +529,27 @@ case $basic_machine in
 		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
 		os=-linux
 		;;
+	bluegene*)
+		basic_machine=powerpc-ibm
+		os=-cnk
+		;;
+	c54x-*)
+		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c55x-*)
+		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c6x-*)
+		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
 	c90)
 		basic_machine=c90-cray
 		os=-unicos
 		;;
+	cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
 	convex-c1)
 		basic_machine=c1-convex
 		os=-bsd
@@ -487,7 +578,7 @@ case $basic_machine in
 		basic_machine=craynv-cray
 		os=-unicosmp
 		;;
-	cr16)
+	cr16 | cr16-*)
 		basic_machine=cr16-unknown
 		os=-elf
 		;;
@@ -526,6 +617,10 @@ case $basic_machine in
 		basic_machine=m88k-motorola
 		os=-sysv3
 		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
 	djgpp)
 		basic_machine=i586-pc
 		os=-msdosdjgpp
@@ -641,7 +736,6 @@ case $basic_machine in
 	i370-ibm* | ibm*)
 		basic_machine=i370-ibm
 		;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
 	i*86v32)
 		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
 		os=-sysv32
@@ -699,8 +793,15 @@ case $basic_machine in
 		basic_machine=ns32k-utek
 		os=-sysv
 		;;
+	microblaze*)
+		basic_machine=microblaze-xilinx
+		;;
+	mingw64)
+		basic_machine=x86_64-pc
+		os=-mingw64
+		;;
 	mingw32)
-		basic_machine=i386-pc
+		basic_machine=i686-pc
 		os=-mingw32
 		;;
 	mingw32ce)
@@ -728,6 +829,10 @@ case $basic_machine in
 		basic_machine=powerpc-unknown
 		os=-morphos
 		;;
+	moxiebox)
+		basic_machine=moxie-unknown
+		os=-moxiebox
+		;;
 	msdos)
 		basic_machine=i386-pc
 		os=-msdos
@@ -735,10 +840,18 @@ case $basic_machine in
 	ms1-*)
 		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
 		;;
+	msys)
+		basic_machine=i686-pc
+		os=-msys
+		;;
 	mvs)
 		basic_machine=i370-ibm
 		os=-mvs
 		;;
+	nacl)
+		basic_machine=le32-unknown
+		os=-nacl
+		;;
 	ncr3000)
 		basic_machine=i486-ncr
 		os=-sysv4
@@ -803,6 +916,12 @@ case $basic_machine in
 	np1)
 		basic_machine=np1-gould
 		;;
+	neo-tandem)
+		basic_machine=neo-tandem
+		;;
+	nse-tandem)
+		basic_machine=nse-tandem
+		;;
 	nsr-tandem)
 		basic_machine=nsr-tandem
 		;;
@@ -885,9 +1004,10 @@ case $basic_machine in
 		;;
 	power)	basic_machine=power-ibm
 		;;
-	ppc)	basic_machine=powerpc-unknown
+	ppc | ppcbe)	basic_machine=powerpc-unknown
 		;;
-	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+	ppc-* | ppcbe-*)
+		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
 		;;
 	ppcle | powerpclittle | ppc-le | powerpc-little)
 		basic_machine=powerpcle-unknown
@@ -912,7 +1032,11 @@ case $basic_machine in
 		basic_machine=i586-unknown
 		os=-pw32
 		;;
-	rdos)
+	rdos | rdos64)
+		basic_machine=x86_64-pc
+		os=-rdos
+		;;
+	rdos32)
 		basic_machine=i386-pc
 		os=-rdos
 		;;
@@ -981,6 +1105,9 @@ case $basic_machine in
 		basic_machine=i860-stratus
 		os=-sysv4
 		;;
+	strongarm-* | thumb-*)
+		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
 	sun2)
 		basic_machine=m68000-sun
 		;;
@@ -1037,20 +1164,8 @@ case $basic_machine in
 		basic_machine=t90-cray
 		os=-unicos
 		;;
-	tic54x | c54x*)
-		basic_machine=tic54x-unknown
-		os=-coff
-		;;
-	tic55x | c55x*)
-		basic_machine=tic55x-unknown
-		os=-coff
-		;;
-	tic6x | c6x*)
-		basic_machine=tic6x-unknown
-		os=-coff
-		;;
 	tile*)
-		basic_machine=tile-unknown
+		basic_machine=$basic_machine-unknown
 		os=-linux-gnu
 		;;
 	tx39)
@@ -1120,6 +1235,9 @@ case $basic_machine in
 	xps | xps100)
 		basic_machine=xps100-honeywell
 		;;
+	xscale-* | xscalee[bl]-*)
+		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+		;;
 	ymp)
 		basic_machine=ymp-cray
 		os=-unicos
@@ -1128,6 +1246,10 @@ case $basic_machine in
 		basic_machine=z8k-unknown
 		os=-sim
 		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
 	none)
 		basic_machine=none-none
 		os=-none
@@ -1166,7 +1288,7 @@ case $basic_machine in
 	we32k)
 		basic_machine=we32k-att
 		;;
-	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
 		basic_machine=sh-unknown
 		;;
 	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
@@ -1213,9 +1335,12 @@ esac
 if [ x"$os" != x"" ]
 then
 case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
+	# First match some system type aliases
+	# that might get confused with valid system types.
 	# -solaris* is a basic system type, with this one exception.
+	-auroraux)
+		os=-auroraux
+		;;
 	-solaris1 | -solaris1.*)
 		os=`echo $os | sed -e 's|solaris1|sunos4|'`
 		;;
@@ -1236,29 +1361,31 @@ case $os in
 	# Each alternative MUST END IN A *, to match a version number.
 	# -sysv* is not here because it comes later, after sysvr4.
 	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+	      | -sym* | -kopensolaris* | -plan9* \
 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* \
+	      | -aos* | -aros* \
 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -openbsd* | -solidbsd* \
+	      | -bitrig* | -openbsd* | -solidbsd* \
 	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
 	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* \
-	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
 	-qnx*)
@@ -1297,7 +1424,7 @@ case $os in
 	-opened*)
 		os=-openedition
 		;;
-        -os400*)
+	-os400*)
 		os=-os400
 		;;
 	-wince*)
@@ -1346,7 +1473,7 @@ case $os in
 	-sinix*)
 		os=-sysv4
 		;;
-        -tpf*)
+	-tpf*)
 		os=-tpf
 		;;
 	-triton*)
@@ -1382,12 +1509,14 @@ case $os in
 	-aros*)
 		os=-aros
 		;;
-	-kaos*)
-		os=-kaos
-		;;
 	-zvmoe)
 		os=-zvmoe
 		;;
+	-dicos*)
+		os=-dicos
+		;;
+	-nacl*)
+		;;
 	-none)
 		;;
 	*)
@@ -1410,10 +1539,10 @@ else
 # system, and we'll never get to this point.
 
 case $basic_machine in
-        score-*)
+	score-*)
 		os=-elf
 		;;
-        spu-*)
+	spu-*)
 		os=-elf
 		;;
 	*-acorn)
@@ -1425,8 +1554,23 @@ case $basic_machine in
 	arm*-semi)
 		os=-aout
 		;;
-        c4x-* | tic4x-*)
-        	os=-coff
+	c4x-* | tic4x-*)
+		os=-coff
+		;;
+	c8051-*)
+		os=-elf
+		;;
+	hexagon-*)
+		os=-elf
+		;;
+	tic54x-*)
+		os=-coff
+		;;
+	tic55x-*)
+		os=-coff
+		;;
+	tic6x-*)
+		os=-coff
 		;;
 	# This must come before the *-dec entry.
 	pdp10-*)
@@ -1446,14 +1590,11 @@ case $basic_machine in
 		;;
 	m68000-sun)
 		os=-sunos3
-		# This also exists in the configure program, but was not the
-		# default.
-		# os=-sunos4
 		;;
 	m68*-cisco)
 		os=-aout
 		;;
-        mep-*)
+	mep-*)
 		os=-elf
 		;;
 	mips*-cisco)
@@ -1480,7 +1621,7 @@ case $basic_machine in
 	*-ibm)
 		os=-aix
 		;;
-    	*-knuth)
+	*-knuth)
 		os=-mmixware
 		;;
 	*-wec)
@@ -1585,7 +1726,7 @@ case $basic_machine in
 			-sunos*)
 				vendor=sun
 				;;
-			-aix*)
+			-cnk*|-aix*)
 				vendor=ibm
 				;;
 			-beos*)
diff --git a/bin/depcomp b/bin/depcomp
index ffcd540..fc98710 100755
--- a/bin/depcomp
+++ b/bin/depcomp
@@ -1,9 +1,9 @@
 #! /bin/sh
 # depcomp - compile a program generating dependencies as side-effects
 
-scriptversion=2005-02-09.22
+scriptversion=2013-05-30.07; # UTC
 
-# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -16,9 +16,7 @@ scriptversion=2005-02-09.22
 # GNU General Public License for more details.
 
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
@@ -29,9 +27,9 @@ scriptversion=2005-02-09.22
 
 case $1 in
   '')
-     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
+    echo "$0: No command.  Try '$0 --help' for more information." 1>&2
+    exit 1;
+    ;;
   -h | --h*)
     cat <<\EOF
 Usage: depcomp [--help] [--version] PROGRAM [ARGS]
@@ -41,11 +39,11 @@ as side-effects.
 
 Environment variables:
   depmode     Dependency tracking mode.
-  source      Source file read by `PROGRAMS ARGS'.
-  object      Object file output by `PROGRAMS ARGS'.
+  source      Source file read by 'PROGRAMS ARGS'.
+  object      Object file output by 'PROGRAMS ARGS'.
   DEPDIR      directory where to store dependencies.
   depfile     Dependency file to output.
-  tmpdepfile  Temporary file to use when outputing dependencies.
+  tmpdepfile  Temporary file to use when outputting dependencies.
   libtool     Whether libtool is used (yes/no).
 
 Report bugs to <bug-automake at gnu.org>.
@@ -58,6 +56,66 @@ EOF
     ;;
 esac
 
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'.  Note that this directory component will
+# be either empty or ending with a '/' character.  This is deliberate.
+set_dir_from ()
+{
+  case $1 in
+    */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+      *) dir=;;
+  esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+  base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+  echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+  # If the compiler actually managed to produce a dependency file,
+  # post-process it.
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form 'foo.o: dependency.h'.
+    # Do two passes, one to just change these to
+    #   $object: dependency.h
+    # and one to simply output
+    #   dependency.h:
+    # which is needed to avoid the deleted-header problem.
+    { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+      sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+    } > "$depfile"
+    rm -f "$tmpdepfile"
+  else
+    make_dummy_depfile
+  fi
+}
+
+# A tabulation character.
+tab='	'
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
 if test -z "$depmode" || test -z "$source" || test -z "$object"; then
   echo "depcomp: Variables source, object and depmode must be set" 1>&2
   exit 1
@@ -70,6 +128,9 @@ tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
 
 rm -f "$tmpdepfile"
 
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
 # Some modes work just like other modes, but use different flags.  We
 # parameterize here, but still list the modes in the big case below,
 # to make depend.m4 easier to write.  Note that we *cannot* use a case
@@ -81,9 +142,32 @@ if test "$depmode" = hp; then
 fi
 
 if test "$depmode" = dashXmstdout; then
-   # This is just like dashmstdout with a different argument.
-   dashmflag=-xM
-   depmode=dashmstdout
+  # This is just like dashmstdout with a different argument.
+  dashmflag=-xM
+  depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+  # This is just like msvisualcpp but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+  # This is just like msvc7 but w/o cygpath translation.
+  # Just convert the backslash-escaped backslashes to single forward
+  # slashes to satisfy depend.m4
+  cygpath_u='sed s,\\\\,/,g'
+  depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+  gccflag=-qmakedep=gcc,-MF
+  depmode=gcc
 fi
 
 case "$depmode" in
@@ -91,10 +175,22 @@ gcc3)
 ## gcc 3 implements dependency tracking that does exactly what
 ## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
 ## it if -MD -MP comes after the -MF stuff.  Hmm.
-  "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
   stat=$?
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile"
     exit $stat
   fi
@@ -102,13 +198,17 @@ gcc3)
   ;;
 
 gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
 ## There are various ways to get dependency output from gcc.  Here's
 ## why we pick this rather obscure method:
 ## - Don't want to use -MD because we'd like the dependencies to end
 ##   up in a subdir.  Having to rename by hand is ugly.
 ##   (We might end up doing this anyway to support other compilers.)
 ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-##   -MM, not -M (despite what the docs say).
+##   -MM, not -M (despite what the docs say).  Also, it might not be
+##   supported by the other compilers which use the 'gcc' depmode.
 ## - Using -M directly means running the compiler twice (even worse
 ##   than renaming).
   if test -z "$gccflag"; then
@@ -116,31 +216,31 @@ gcc)
   fi
   "$@" -Wp,"$gccflag$tmpdepfile"
   stat=$?
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile"
     exit $stat
   fi
   rm -f "$depfile"
   echo "$object : \\" > "$depfile"
-  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-## The second -e expression handles DOS-style file names with drive letters.
+  # The second -e expression handles DOS-style file names with drive
+  # letters.
   sed -e 's/^[^:]*: / /' \
       -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the `deleted header file' problem.
+## This next piece of magic avoids the "deleted header file" problem.
 ## The problem is that when a header file which appears in a .P file
 ## is deleted, the dependency causes make to die (because there is
 ## typically no way to rebuild the header).  We avoid this by adding
 ## dummy dependencies for each header file.  Too bad gcc doesn't do
 ## this for us directly.
-  tr ' ' '
-' < "$tmpdepfile" |
-## Some versions of gcc put a space before the `:'.  On the theory
+## Some versions of gcc put a space before the ':'.  On the theory
 ## that the space means something, we add a space to the output as
-## well.
+## well.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
 ## Some versions of the HPUX 10.20 sed can't process this invocation
 ## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
@@ -158,8 +258,7 @@ sgi)
     "$@" -MDupdate "$tmpdepfile"
   fi
   stat=$?
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile"
     exit $stat
   fi
@@ -167,99 +266,156 @@ sgi)
 
   if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
     echo "$object : \\" > "$depfile"
-
     # Clip off the initial element (the dependent).  Don't try to be
     # clever and replace this with sed code, as IRIX sed won't handle
     # lines with more than a fixed number of characters (4096 in
     # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
-    # the IRIX cc adds comments like `#:fec' to the end of the
+    # the IRIX cc adds comments like '#:fec' to the end of the
     # dependency line.
-    tr ' ' '
-' < "$tmpdepfile" \
-    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
-    tr '
-' ' ' >> $depfile
-    echo >> $depfile
-
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+      | tr "$nl" ' ' >> "$depfile"
+    echo >> "$depfile"
     # The second pass generates a dummy entry for each header file.
-    tr ' ' '
-' < "$tmpdepfile" \
-   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
-   >> $depfile
+    tr ' ' "$nl" < "$tmpdepfile" \
+      | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+      >> "$depfile"
   else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
+    make_dummy_depfile
   fi
   rm -f "$tmpdepfile"
   ;;
 
+xlc)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
 aix)
   # The C for AIX Compiler uses -M and outputs the dependencies
   # in a .u file.  In older versions, this file always lives in the
-  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # current directory.  Also, the AIX compiler puts '$object:' at the
   # start of each line; $object doesn't have directory information.
   # Version 6 uses the directory in both cases.
-  stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
-  tmpdepfile="$stripped.u"
+  set_dir_from "$object"
+  set_base_from "$object"
   if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
     "$@" -Wc,-M
   else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
     "$@" -M
   fi
   stat=$?
-
-  if test -f "$tmpdepfile"; then :
-  else
-    stripped=`echo "$stripped" | sed 's,^.*/,,'`
-    tmpdepfile="$stripped.u"
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
   fi
 
-  if test $stat -eq 0; then :
-  else
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  aix_post_process_depfile
+  ;;
+
+tcc)
+  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+  # FIXME: That version still under development at the moment of writing.
+  #        Make that this statement remains true also for stable, released
+  #        versions.
+  # It will wrap lines (doesn't matter whether long or short) with a
+  # trailing '\', as in:
+  #
+  #   foo.o : \
+  #    foo.c \
+  #    foo.h \
+  #
+  # It will put a trailing '\' even on the last line, and will use leading
+  # spaces rather than leading tabs (at least since its commit 0394caf7
+  # "Emit spaces for -MD").
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile"
     exit $stat
   fi
-
-  if test -f "$tmpdepfile"; then
-    outname="$stripped.o"
-    # Each line is of the form `foo.o: dependent.h'.
-    # Do two passes, one to just change these to
-    # `$object: dependent.h' and one to simply `dependent.h:'.
-    sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
-    sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
+  rm -f "$depfile"
+  # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+  # We have to change lines of the first kind to '$object: \'.
+  sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+  # And for each line of the second kind, we have to emit a 'dep.h:'
+  # dummy dependency, to avoid the deleted-header problem.
+  sed -n -e 's|^  *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
-icc)
-  # Intel's C compiler understands `-MD -MF file'.  However on
-  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
-  # ICC 7.0 will fill foo.d with something like
-  #    foo.o: sub/foo.c
-  #    foo.o: sub/foo.h
-  # which is wrong.  We want:
-  #    sub/foo.o: sub/foo.c
-  #    sub/foo.o: sub/foo.h
-  #    sub/foo.c:
-  #    sub/foo.h:
-  # ICC 7.1 will output
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file.  A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+  # Portland's C compiler understands '-MD'.
+  # Will always output deps to 'file.d' where file is the root name of the
+  # source file under compilation, even if file resides in a subdirectory.
+  # The object file name does not affect the name of the '.d' file.
+  # pgcc 10.2 will output
   #    foo.o: sub/foo.c sub/foo.h
-  # and will wrap long lines using \ :
+  # and will wrap long lines using '\' :
   #    foo.o: sub/foo.c ... \
   #     sub/foo.h ... \
   #     ...
+  set_dir_from "$object"
+  # Use the source, not the object, to determine the base name, since
+  # that's sadly what pgcc will do too.
+  set_base_from "$source"
+  tmpdepfile=$base.d
+
+  # For projects that build the same source file twice into different object
+  # files, the pgcc approach of using the *source* file root name can cause
+  # problems in parallel builds.  Use a locking strategy to avoid stomping on
+  # the same $tmpdepfile.
+  lockdir=$base.d-lock
+  trap "
+    echo '$0: caught signal, cleaning up...' >&2
+    rmdir '$lockdir'
+    exit 1
+  " 1 2 13 15
+  numtries=100
+  i=$numtries
+  while test $i -gt 0; do
+    # mkdir is a portable test-and-set.
+    if mkdir "$lockdir" 2>/dev/null; then
+      # This process acquired the lock.
+      "$@" -MD
+      stat=$?
+      # Release the lock.
+      rmdir "$lockdir"
+      break
+    else
+      # If the lock is being held by a different process, wait
+      # until the winning process is done or we timeout.
+      while test -d "$lockdir" && test $i -gt 0; do
+        sleep 1
+        i=`expr $i - 1`
+      done
+    fi
+    i=`expr $i - 1`
+  done
+  trap - 1 2 13 15
+  if test $i -le 0; then
+    echo "$0: failed to acquire lock after $numtries attempts" >&2
+    echo "$0: check lockdir '$lockdir'" >&2
+    exit 1
+  fi
 
-  "$@" -MD -MF "$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
+  if test $stat -ne 0; then
     rm -f "$tmpdepfile"
     exit $stat
   fi
@@ -271,68 +427,141 @@ icc)
   sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
   # Some versions of the HPUX 10.20 sed can't process this invocation
   # correctly.  Breaking it into two sed invocations is a workaround.
-  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
-    sed -e 's/$/ :/' >> "$depfile"
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+    | sed -e 's/$/ :/' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  set_dir_from  "$object"
+  set_base_from "$object"
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -ne 0; then
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add 'dependent.h:' lines.
+    sed -ne '2,${
+               s/^ *//
+               s/ \\*$//
+               s/$/:/
+               p
+             }' "$tmpdepfile" >> "$depfile"
+  else
+    make_dummy_depfile
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
 tru64)
-   # The Tru64 compiler uses -MD to generate dependencies as a side
-   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
-   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
-   # dependencies in `foo.d' instead, so we check for that too.
-   # Subdirectories are respected.
-   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-   test "x$dir" = "x$object" && dir=
-   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-
-   if test "$libtool" = yes; then
-      # With Tru64 cc, shared objects can also be used to make a
-      # static library.  This mecanism is used in libtool 1.4 series to
-      # handle both shared and static libraries in a single compilation.
-      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
-      #
-      # With libtool 1.5 this exception was removed, and libtool now
-      # generates 2 separate objects for the 2 libraries.  These two
-      # compilations output dependencies in in $dir.libs/$base.o.d and
-      # in $dir$base.o.d.  We have to check for both files, because
-      # one of the two compilations can be disabled.  We should prefer
-      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
-      # automatically cleaned when .libs/ is deleted, while ignoring
-      # the former would cause a distcleancheck panic.
-      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
-      tmpdepfile2=$dir$base.o.d          # libtool 1.5
-      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
-      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
-      "$@" -Wc,-MD
-   else
-      tmpdepfile1=$dir$base.o.d
-      tmpdepfile2=$dir$base.d
-      tmpdepfile3=$dir$base.d
-      tmpdepfile4=$dir$base.d
-      "$@" -MD
-   fi
-
-   stat=$?
-   if test $stat -eq 0; then :
-   else
-      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-      exit $stat
-   fi
-
-   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-   do
-     test -f "$tmpdepfile" && break
-   done
-   if test -f "$tmpdepfile"; then
-      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-      # That's a tab and a space in the [].
-      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-   else
-      echo "#dummy" > "$depfile"
-   fi
-   rm -f "$tmpdepfile"
-   ;;
+  # The Tru64 compiler uses -MD to generate dependencies as a side
+  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+  # dependencies in 'foo.d' instead, so we check for that too.
+  # Subdirectories are respected.
+  set_dir_from  "$object"
+  set_base_from "$object"
+
+  if test "$libtool" = yes; then
+    # Libtool generates 2 separate objects for the 2 libraries.  These
+    # two compilations output dependencies in $dir.libs/$base.o.d and
+    # in $dir$base.o.d.  We have to check for both files, because
+    # one of the two compilations can be disabled.  We should prefer
+    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+    # automatically cleaned when .libs/ is deleted, while ignoring
+    # the former would cause a distcleancheck panic.
+    tmpdepfile1=$dir$base.o.d          # libtool 1.5
+    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.
+    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504
+    "$@" -Wc,-MD
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    tmpdepfile3=$dir$base.d
+    "$@" -MD
+  fi
+
+  stat=$?
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  # Same post-processing that is required for AIX mode.
+  aix_post_process_depfile
+  ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test $stat -ne 0; then
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/'"$tab"'/
+  G
+  p
+}' >> "$depfile"
+  echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
 
 #nosideeffect)
   # This comment above is used by automake to tell side-effect
@@ -345,13 +574,13 @@ dashmstdout)
 
   # Remove the call to Libtool.
   if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
+    while test "X$1" != 'X--mode=compile'; do
       shift
     done
     shift
   fi
 
-  # Remove `-o $object'.
+  # Remove '-o $object'.
   IFS=" "
   for arg
   do
@@ -371,18 +600,18 @@ dashmstdout)
   done
 
   test -z "$dashmflag" && dashmflag=-M
-  # Require at least two characters before searching for `:'
+  # Require at least two characters before searching for ':'
   # in the target name.  This is to cope with DOS-style filenames:
-  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
   "$@" $dashmflag |
-    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+    sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
   rm -f "$depfile"
   cat < "$tmpdepfile" > "$depfile"
-  tr ' ' '
-' < "$tmpdepfile" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this sed invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  tr ' ' "$nl" < "$tmpdepfile" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
@@ -396,41 +625,51 @@ makedepend)
   "$@" || exit $?
   # Remove any Libtool call
   if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
+    while test "X$1" != 'X--mode=compile'; do
       shift
     done
     shift
   fi
   # X makedepend
   shift
-  cleared=no
-  for arg in "$@"; do
+  cleared=no eat=no
+  for arg
+  do
     case $cleared in
     no)
       set ""; shift
       cleared=yes ;;
     esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
     case "$arg" in
     -D*|-I*)
       set fnord "$@" "$arg"; shift ;;
     # Strip any option that makedepend may not understand.  Remove
     # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
     -*|$object)
       ;;
     *)
       set fnord "$@" "$arg"; shift ;;
     esac
   done
-  obj_suffix="`echo $object | sed 's/^.*\././'`"
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
   touch "$tmpdepfile"
   ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
   rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  sed '1,2d' "$tmpdepfile" | tr ' ' '
-' | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process the last invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed '1,2d' "$tmpdepfile" \
+    | tr ' ' "$nl" \
+    | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+    | sed -e 's/$/ :/' >> "$depfile"
   rm -f "$tmpdepfile" "$tmpdepfile".bak
   ;;
 
@@ -441,13 +680,13 @@ cpp)
 
   # Remove the call to Libtool.
   if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
+    while test "X$1" != 'X--mode=compile'; do
       shift
     done
     shift
   fi
 
-  # Remove `-o $object'.
+  # Remove '-o $object'.
   IFS=" "
   for arg
   do
@@ -466,9 +705,10 @@ cpp)
     esac
   done
 
-  "$@" -E |
-    sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
-    sed '$ s: \\$::' > "$tmpdepfile"
+  "$@" -E \
+    | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+             -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+    | sed '$ s: \\$::' > "$tmpdepfile"
   rm -f "$depfile"
   echo "$object : \\" > "$depfile"
   cat < "$tmpdepfile" >> "$depfile"
@@ -478,35 +718,56 @@ cpp)
 
 msvisualcpp)
   # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o,
-  # because we must use -o when running libtool.
+  # always write the preprocessed file to stdout.
   "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
   IFS=" "
   for arg
   do
     case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
     "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
-	set fnord "$@"
-	shift
-	shift
-	;;
+        set fnord "$@"
+        shift
+        shift
+        ;;
     *)
-	set fnord "$@" "$arg"
-	shift
-	shift
-	;;
+        set fnord "$@" "$arg"
+        shift
+        shift
+        ;;
     esac
   done
-  "$@" -E |
-  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
   rm -f "$depfile"
   echo "$object : \\" > "$depfile"
-  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
-  echo "	" >> "$depfile"
-  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+  echo "$tab" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
   rm -f "$tmpdepfile"
   ;;
 
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
 none)
   exec "$@"
   ;;
@@ -525,5 +786,6 @@ exit 0
 # eval: (add-hook 'write-file-hooks 'time-stamp)
 # time-stamp-start: "scriptversion="
 # time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
 # End:
diff --git a/bin/distdep b/bin/distdep
old mode 100644
new mode 100755
diff --git a/bin/genparser b/bin/genparser
new file mode 100755
index 0000000..71a8ae2
--- /dev/null
+++ b/bin/genparser
@@ -0,0 +1,252 @@
+#! /bin/bash
+#
+# Copyright by The HDF Group.                                              
+# All rights reserved.                                                     
+#                                                                          
+# This file is part of HDF5. The full HDF5 copyright notice, including     
+# terms governing use, modification, and redistribution, is contained in   
+# the files COPYING and Copyright.html.  COPYING can be found at the root  
+# of the source code distribution tree; Copyright.html can be found at the 
+# root level of an installed copy of the electronic document set and is    
+# linked from the top-level documents page.  It can also be found at       
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have access  
+# to either file, you may request a copy from help at hdfgroup.org.           
+#
+
+# This script runs flex/lex and bison/yacc to generate parser code for
+# the high-level library. It used to be a part of autogen.sh, but many
+# people encountered problems with installing flex and bison on their
+# system and the parser code rarely changes, so those parts of the
+# script were moved to their own file.
+#
+# NOTE CAREFULLY!
+#
+# There is NO dependency in either the autotools or CMake to regenerate
+# the parser code. If you modify H5LT analyze.l or H5LTparse.y, you
+# will need to run this scrpit manually on a system with a suitable
+# lexer and parser generator.
+#
+# IMPORTANT OS X NOTE
+#
+# If you are using OS X, you will probably not have flex or bison
+# installed. In addtion, even if you do have bison installed, the bison
+# version you have installed may also have a bug that makes it unable to
+# process our input files.
+#
+# The easiest way to fix this is to install everything via Homebrew:
+#
+#   http://brew.sh/
+#
+# After you install the base packages, install flex/bison.
+#
+#   brew install flex
+#   brew install bison
+#
+# END IMPORTANT OS X NOTE
+#
+# If you want to use a particular version of flex or bison, the paths
+# to each tool can be overridden using the following environment
+# variables:
+#
+#   HDF5_FLEX
+#   HDF5_BISON
+#
+# This script takes two potential options:
+#
+# -p
+#
+# When this is selected, the flex/bison versions are set to the paths
+# and versions used by The HDF Group to produce the released versions
+# of the library.
+#
+# NOTE: This is probably temporary. Once we update our dev machines
+# to have recent versions of the autotools this option will probably
+# be removed.
+#
+# -v
+#
+# This emits some extra information, mainly tool versions.
+
+echo
+echo "*******************************************"
+echo "* HDF5 high-level parser generator script *"
+echo "*******************************************"
+echo
+
+# Default is not verbose output
+verbose=false
+
+optspec=":hpv-"
+while getopts "$optspec" optchar; do
+    case "${optchar}" in
+    h)
+        echo "usage: $0 [OPTIONS] /path/to/hl/src/directory"
+        echo
+        echo "      -h      Print this help message."
+        echo
+        echo "      -p      Used by THG to use hard-codes flex/bison"
+        echo "              paths on THG machines. Not for non-HDF-Group"
+        echo "              users!"
+        echo
+        echo "      -v      Show more verbose output."
+        echo
+        echo "  NOTE: Each tool can be set via an environment variable."
+        echo "        These are documented inside this script."
+        echo
+        exit 0
+        ;;
+    p)
+        echo "Setting THG production mode..."
+        echo
+        production=true
+        ;;
+    v)
+        echo "Setting verbosity: high"
+        echo
+        verbose=true
+        ;;
+    *)
+        if [ "$OPTERR" != 1 ] || [ "${optspec:0:1}" = ":" ]; then
+            echo "Non-option argument: '-${OPTARG}'" >&2
+        fi
+        ;;
+    esac
+done
+
+# Get the path to the hl src directory
+shift $(($OPTIND - 1))
+path_to_hl_src=$1
+if test -z ${path_to_hl_src}; then
+    echo "*** ERROR *** - Path to hl/src not set"
+    echo "Please add the path to the hl/src directory as a parameter"
+    echo "See $0 -h for more help."
+    echo
+    exit -1
+fi
+
+if [ "$production" = true ] ; then
+
+    # Production mode
+    #
+    # Hard-code canonical HDF Group tool locations.
+
+    # If paths to tools are not specified, assume they are
+    # located in /usr/hdf/bin/AUTOTOOLS and set paths accordingly.
+    if test -z ${HDF5_BISON}; then
+        HDF5_BISON=/usr/hdf/bin/AUTOTOOLS/bison
+    fi
+    if test -z ${HDF5_FLEX}; then
+        HDF5_FLEX=/usr/hdf/bin/AUTOTOOLS/flex
+    fi
+
+else
+
+    # Not in production mode
+    #
+    # If paths to autotools are not specified, use whatever the system
+    # has installed as the default. We use 'which <tool>' to
+    # show exactly what's being used.
+    if test -z ${HDF5_BISON}; then
+        HDF5_BISON=$(which bison)
+    fi
+    if test -z ${HDF5_FLEX}; then
+        HDF5_FLEX=$(which flex)
+    fi
+
+fi # production
+
+# Make sure that these versions of the tools are in the path
+BISON_DIR=`dirname ${HDF5_BISON}`
+FLEX_DIR=`dirname ${HDF5_FLEX}`
+PATH=${FLEX_DIR}:${BISON_DIR}:$PATH
+
+# Run flex and bison
+# automatically generates hl/src/H5LTanalyze.c and hl/src/H5LTparse.c
+# Note that, as of Xcode 6.1 (2015), the default bison version on OS X
+# is old enough to have the circular dependency bug. You'll have
+# to install a later version of bison. See the OS X note at the top
+# of this script.
+echo
+echo "Generating H5LT parser code (requires yacc/bison):"
+echo "Generate hl/src/H5LTparse.c from hl/src/H5LTparse.y"
+# HDF5_BISON is set via the environment or 'which bison', above
+if test -z ${HDF5_BISON}; then
+    echo
+    echo "*************************"
+    echo " ERROR - bison not found"
+    echo "*************************"
+    echo "bison is required to generate parser code in H5LT"
+    echo
+    exit 127
+fi
+if [ "$verbose" = true ] ; then
+    ${HDF5_BISON} --version
+fi
+${HDF5_BISON} -pH5LTyy -o ${path_to_hl_src}/H5LTparse.c -d ${path_to_hl_src}/H5LTparse.y
+
+echo
+echo "Generating H5LT lexer code (requires lex/flex):"
+echo "Generate hl/src/H5LTanalyze.c from hl/src/H5LTanalyze.l"
+# HDF5_FLEX is set via the environment or 'which flex', above
+if test -z ${HDF5_FLEX}; then
+    echo
+    echo "************************"
+    echo " ERROR - flex not found"
+    echo "************************"
+    echo "flex is required to generate lexer code in H5LT"
+    echo
+    exit 127
+fi
+if [ "$verbose" = true ] ; then
+    ${HDF5_FLEX} --version
+fi
+${HDF5_FLEX} --nounistd -PH5LTyy -o ${path_to_hl_src}/H5LTanalyze.c ${path_to_hl_src}/H5LTanalyze.l
+
+# fix H5LTparse.c to declare H5LTyyparse return type as an hid_t
+# instead of int.  Currently the generated function H5LTyyparse is
+# generated with a return value of type int, which is a mapping to the
+# flex yyparse function.  The return value in the HL library should be
+# an hid_t. 
+# I propose to not use flex to generate this function, but for now I am 
+# adding a perl command to find and replace this function declaration in
+# H5LTparse.c.
+perl -0777 -pi -e 's/int yyparse/hid_t yyparse/igs' ${path_to_hl_src}/H5LTparse.c
+perl -0777 -pi -e 's/int\nyyparse/hid_t\nyyparse/igs' ${path_to_hl_src}/H5LTparse.c
+perl -0777 -pi -e 's/int H5LTyyparse/hid_t H5LTyyparse/igs' ${path_to_hl_src}/H5LTparse.c
+
+# Add code that disables warnings in the flex/bison-generated code.
+#
+# Note that the GCC pragmas did not exist until gcc 4.2. Earlier versions
+# will simply ignore them, but we want to avoid those warnings.
+for f in ${path_to_hl_src}/H5LTparse.c ${path_to_hl_src}/H5LTanalyze.c
+do
+    echo '#if __GNUC__ >= 4 && __GNUC_MINOR__ >=2                           ' >> tmp.out
+    echo '#pragma GCC diagnostic ignored "-Wconversion"                     ' >> tmp.out
+    echo '#pragma GCC diagnostic ignored "-Wimplicit-function-declaration"  ' >> tmp.out
+    echo '#pragma GCC diagnostic ignored "-Wlarger-than="                   ' >> tmp.out
+    echo '#pragma GCC diagnostic ignored "-Wmissing-prototypes"             ' >> tmp.out
+    echo '#pragma GCC diagnostic ignored "-Wnested-externs"                 ' >> tmp.out
+    echo '#pragma GCC diagnostic ignored "-Wold-style-definition"           ' >> tmp.out
+    echo '#pragma GCC diagnostic ignored "-Wredundant-decls"                ' >> tmp.out
+    echo '#pragma GCC diagnostic ignored "-Wsign-compare"                   ' >> tmp.out
+    echo '#pragma GCC diagnostic ignored "-Wsign-conversion"                ' >> tmp.out
+    echo '#pragma GCC diagnostic ignored "-Wstrict-overflow"                ' >> tmp.out
+    echo '#pragma GCC diagnostic ignored "-Wstrict-prototypes"              ' >> tmp.out
+    echo '#pragma GCC diagnostic ignored "-Wsuggest-attribute=pure"         ' >> tmp.out
+    echo '#pragma GCC diagnostic ignored "-Wswitch-default"                 ' >> tmp.out
+    echo '#pragma GCC diagnostic ignored "-Wunused-function"                ' >> tmp.out
+    echo '#pragma GCC diagnostic ignored "-Wunused-macros"                  ' >> tmp.out
+    echo '#pragma GCC diagnostic ignored "-Wunused-parameter"               ' >> tmp.out
+    echo '#elif defined __SUNPRO_CC                                         ' >> tmp.out
+    echo '#pragma disable_warn                                              ' >> tmp.out
+    echo '#elif defined _MSC_VER                                            ' >> tmp.out
+    echo '#pragma warning(push, 1)                                          ' >> tmp.out
+    echo '#endif                                                            ' >> tmp.out
+
+    cat $f >> tmp.out
+    mv tmp.out $f
+done
+
+echo
+exit 0
+
diff --git a/bin/h5vers b/bin/h5vers
index 169f89b..7e61dc8 100755
--- a/bin/h5vers
+++ b/bin/h5vers
@@ -243,14 +243,6 @@ if ($set) {
   @newver = @curver;
 }
 
-# Note if the new version is for an official release.
-# if the fourth version field is empty or contains "patch",
-# "currently under development" shouldn't be printed as 
-# part of the version string.
-my $is_official_release="";
-if ($newver[3] eq "" || $newver[3] =~ /patch\d/) {
-    $is_official_release="true";
-}
 # Note if the version increased or decreased
 my $version_increased="";
 # Print a warning if the version got smaller (don't check annot field)
@@ -284,29 +276,25 @@ if ($LT_VERS && $version_increased) {
   close FILE;
 
   local($_) = $contentsy;
-  
-  # As of the HDF5 v1.8.16 release, h5vers should not increment
-  # the LT_VERS numbers, so the next 6 lines are commented out.
-  # A future version may copy the numbers to H5public.h, so this
-  # section is retained for future reference.
-  #my ($lt_revision) = /^LT_VERS_REVISION\s*=\s*(\d+)/m;
-  #my $new_lt_revision = $lt_revision+1;
-  #($contentsy) =~ s/^(LT_VERS_REVISION\s*=\s*)\d+/$1$new_lt_revision/m;
-
-  #open FILE, ">$LT_VERS" or die "$LT_VERS: $!\n";
-  #print FILE $contentsy;
-  #close FILE;
-}
 
+  my ($lt_revision) = /^LT_VERS_REVISION\s*=\s*(\d+)/m;
+  my $new_lt_revision = $lt_revision+1;
+  ($contentsy) =~ s/^(LT_VERS_REVISION\s*=\s*)\d+/$1$new_lt_revision/m;
+
+  open FILE, ">$LT_VERS" or die "$LT_VERS: $!\n";
+  print FILE $contentsy;
+  close FILE;
+}
 
 # Update the README.txt file
 if ($README) {
   open FILE, $README or die "$README: $!\n";
   my @contents = <FILE>;
   close FILE;
-  $contents[0] = sprintf("HDF5 version %d.%d.%d%s\n",
+  $contents[0] = sprintf("HDF5 version %d.%d.%d%s %s",
 			 @newver[0,1,2],
-			 $is_official_release ? $newver[3] eq "" ? "" : "-".$newver[3] : "-".$newver[3]." currently under development");
+			 $newver[3] eq "" ? "" : "-".$newver[3],
+			 "currently under development\n");
   open FILE, ">$README" or die "$README: $!\n";
   print FILE @contents;
   close FILE;
@@ -317,9 +305,10 @@ if ($RELEASE) {
   open FILE, $RELEASE or die "$RELEASE: $!\n";
   my @contents = <FILE>;
   close FILE;
-  $contents[0] = sprintf("HDF5 version %d.%d.%d%s\n",
+  $contents[0] = sprintf("HDF5 version %d.%d.%d%s %s",
 			 @newver[0,1,2],
-                         $is_official_release ? $newver[3] eq "" ? "" : "-".$newver[3] : "-".$newver[3]." currently under development");
+			 $newver[3] eq "" ? "" : "-".$newver[3],
+			 "currently under development\n");
   open FILE, ">$RELEASE" or die "$RELEASE: $!\n";
   print FILE @contents;
   close FILE;
@@ -328,9 +317,10 @@ if ($RELEASE) {
 # Update the c++/src/cpp_doc_config file
 if ($CPP_DOC_CONFIG) {
   my $data = read_file($CPP_DOC_CONFIG);
-  my $version_string = sprintf("\"%d.%d.%d%s\"",
-                           @newver[0,1,2],
-                           $is_official_release ? $newver[3] eq "" ? "" : "-".$newver[3] : "-".$newver[3]." currently under development");
+  my $version_string = sprintf("\"%d.%d.%d%s %s\"",
+                               @newver[0,1,2],
+                               $newver[3] eq "" ? "" : "-".$newver[3],
+                               "currently under development");
 
   $data =~ s/PROJECT_NUMBER\s*=.*/PROJECT_NUMBER         = $version_string/;
 
@@ -387,12 +377,12 @@ sub gen_configure {
   $conf =~ /^(.*?)\/?configure.ac$/;
 
   if ($1) {
-    $rc = system("cd $1 && bin/reconfigure >/dev/null 2>/dev/null && rm -rf autom4te.cache");
+    $rc = system("cd $1 && ./autogen.sh -p >/dev/null 2>/dev/null && rm -rf autom4te.cache");
   } else {
-    $rc = system("bin/reconfigure >/dev/null 2>/dev/null && rm -rf autom4te.cache");
+    $rc = system("./autogen.sh -p >/dev/null 2>/dev/null && rm -rf autom4te.cache");
   }
   if ($rc) {
-    printf("bin/reconfigure failed with exit code %d. Aborted.\n", $rc);
+    printf("./autogen.sh -p failed with exit code %d. Aborted.\n", $rc);
     exit 1;
   }
 }
diff --git a/bin/install-sh b/bin/install-sh
index 6781b98..0b0fdcb 100755
--- a/bin/install-sh
+++ b/bin/install-sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2009-04-28.21; # UTC
+scriptversion=2013-12-25.23; # UTC
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -35,25 +35,21 @@ scriptversion=2009-04-28.21; # UTC
 # FSF changes to this file are in the public domain.
 #
 # Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
+# 'make' implicit rules from creating a file called install from it
 # when there is no Makefile.
 #
 # This script is compatible with the BSD install script, but was written
 # from scratch.
 
+tab='	'
 nl='
 '
-IFS=" ""	$nl"
+IFS=" $tab$nl"
 
-# set DOITPROG to echo to test this script
+# Set DOITPROG to "echo" to test this script.
 
-# Don't use :- since 4.3BSD and earlier shells don't like it.
 doit=${DOITPROG-}
-if test -z "$doit"; then
-  doit_exec=exec
-else
-  doit_exec=$doit
-fi
+doit_exec=${doit:-exec}
 
 # Put in absolute file names if you don't have them in your path;
 # or use environment vars.
@@ -68,17 +64,6 @@ mvprog=${MVPROG-mv}
 rmprog=${RMPROG-rm}
 stripprog=${STRIPPROG-strip}
 
-posix_glob='?'
-initialize_posix_glob='
-  test "$posix_glob" != "?" || {
-    if (set -f) 2>/dev/null; then
-      posix_glob=
-    else
-      posix_glob=:
-    fi
-  }
-'
-
 posix_mkdir=
 
 # Desired mode of installed file.
@@ -97,7 +82,7 @@ dir_arg=
 dst_arg=
 
 copy_on_change=false
-no_target_directory=
+is_target_a_directory=possibly
 
 usage="\
 Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
@@ -137,42 +122,57 @@ while test $# -ne 0; do
     -d) dir_arg=true;;
 
     -g) chgrpcmd="$chgrpprog $2"
-	shift;;
+        shift;;
 
     --help) echo "$usage"; exit $?;;
 
     -m) mode=$2
-	case $mode in
-	  *' '* | *'	'* | *'
-'*	  | *'*'* | *'?'* | *'['*)
-	    echo "$0: invalid mode: $mode" >&2
-	    exit 1;;
-	esac
-	shift;;
+        case $mode in
+          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+            echo "$0: invalid mode: $mode" >&2
+            exit 1;;
+        esac
+        shift;;
 
     -o) chowncmd="$chownprog $2"
-	shift;;
+        shift;;
 
     -s) stripcmd=$stripprog;;
 
-    -t) dst_arg=$2
-	shift;;
+    -t)
+        is_target_a_directory=always
+        dst_arg=$2
+        # Protect names problematic for 'test' and other utilities.
+        case $dst_arg in
+          -* | [=\(\)!]) dst_arg=./$dst_arg;;
+        esac
+        shift;;
 
-    -T) no_target_directory=true;;
+    -T) is_target_a_directory=never;;
 
     --version) echo "$0 $scriptversion"; exit $?;;
 
-    --)	shift
-	break;;
+    --) shift
+        break;;
 
-    -*)	echo "$0: invalid option: $1" >&2
-	exit 1;;
+    -*) echo "$0: invalid option: $1" >&2
+        exit 1;;
 
     *)  break;;
   esac
   shift
 done
 
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+  if test -n "$dst_arg"; then
+    echo "$0: target directory not allowed when installing a directory." >&2
+    exit 1
+  fi
+fi
+
 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
   # When -d is used, all remaining arguments are directories to create.
   # When -t is used, the destination is already specified.
@@ -186,6 +186,10 @@ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
     fi
     shift # arg
     dst_arg=$arg
+    # Protect names problematic for 'test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
   done
 fi
 
@@ -194,13 +198,26 @@ if test $# -eq 0; then
     echo "$0: no input file specified." >&2
     exit 1
   fi
-  # It's OK to call `install-sh -d' without argument.
+  # It's OK to call 'install-sh -d' without argument.
   # This can happen when creating conditional directories.
   exit 0
 fi
 
 if test -z "$dir_arg"; then
-  trap '(exit $?); exit' 1 2 13 15
+  if test $# -gt 1 || test "$is_target_a_directory" = always; then
+    if test ! -d "$dst_arg"; then
+      echo "$0: $dst_arg: Is not a directory." >&2
+      exit 1
+    fi
+  fi
+fi
+
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
 
   # Set umask so as not to create temps with too-generous modes.
   # However, 'strip' requires both read and write access to temps.
@@ -211,16 +228,16 @@ if test -z "$dir_arg"; then
 
     *[0-7])
       if test -z "$stripcmd"; then
-	u_plus_rw=
+        u_plus_rw=
       else
-	u_plus_rw='% 200'
+        u_plus_rw='% 200'
       fi
       cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
     *)
       if test -z "$stripcmd"; then
-	u_plus_rw=
+        u_plus_rw=
       else
-	u_plus_rw=,u+rw
+        u_plus_rw=,u+rw
       fi
       cp_umask=$mode$u_plus_rw;;
   esac
@@ -228,9 +245,9 @@ fi
 
 for src
 do
-  # Protect names starting with `-'.
+  # Protect names problematic for 'test' and other utilities.
   case $src in
-    -*) src=./$src;;
+    -* | [=\(\)!]) src=./$src;;
   esac
 
   if test -n "$dir_arg"; then
@@ -252,51 +269,20 @@ do
       echo "$0: no destination specified." >&2
       exit 1
     fi
-
     dst=$dst_arg
-    # Protect names starting with `-'.
-    case $dst in
-      -*) dst=./$dst;;
-    esac
 
     # If destination is a directory, append the input filename; won't work
     # if double slashes aren't ignored.
     if test -d "$dst"; then
-      if test -n "$no_target_directory"; then
-	echo "$0: $dst_arg: Is a directory" >&2
-	exit 1
+      if test "$is_target_a_directory" = never; then
+        echo "$0: $dst_arg: Is a directory" >&2
+        exit 1
       fi
       dstdir=$dst
       dst=$dstdir/`basename "$src"`
       dstdir_status=0
     else
-      # Prefer dirname, but fall back on a substitute if dirname fails.
-      dstdir=`
-	(dirname "$dst") 2>/dev/null ||
-	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	     X"$dst" : 'X\(//\)[^/]' \| \
-	     X"$dst" : 'X\(//\)$' \| \
-	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
-	echo X"$dst" |
-	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)[^/].*/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\).*/{
-		   s//\1/
-		   q
-		 }
-		 s/.*/./; q'
-      `
-
+      dstdir=`dirname "$dst"`
       test -d "$dstdir"
       dstdir_status=$?
     fi
@@ -307,74 +293,74 @@ do
   if test $dstdir_status != 0; then
     case $posix_mkdir in
       '')
-	# Create intermediate dirs using mode 755 as modified by the umask.
-	# This is like FreeBSD 'install' as of 1997-10-28.
-	umask=`umask`
-	case $stripcmd.$umask in
-	  # Optimize common cases.
-	  *[2367][2367]) mkdir_umask=$umask;;
-	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-	  *[0-7])
-	    mkdir_umask=`expr $umask + 22 \
-	      - $umask % 100 % 40 + $umask % 20 \
-	      - $umask % 10 % 4 + $umask % 2
-	    `;;
-	  *) mkdir_umask=$umask,go-w;;
-	esac
-
-	# With -d, create the new directory with the user-specified mode.
-	# Otherwise, rely on $mkdir_umask.
-	if test -n "$dir_arg"; then
-	  mkdir_mode=-m$mode
-	else
-	  mkdir_mode=
-	fi
-
-	posix_mkdir=false
-	case $umask in
-	  *[123567][0-7][0-7])
-	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
-	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-	    ;;
-	  *)
-	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-	    if (umask $mkdir_umask &&
-		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
-	    then
-	      if test -z "$dir_arg" || {
-		   # Check for POSIX incompatibilities with -m.
-		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-		   # other-writeable bit of parent directory when it shouldn't.
-		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
-		   case $ls_ld_tmpdir in
-		     d????-?r-*) different_mode=700;;
-		     d????-?--*) different_mode=755;;
-		     *) false;;
-		   esac &&
-		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
-		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
-		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-		   }
-		 }
-	      then posix_mkdir=:
-	      fi
-	      rmdir "$tmpdir/d" "$tmpdir"
-	    else
-	      # Remove any dirs left behind by ancient mkdir implementations.
-	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
-	    fi
-	    trap '' 0;;
-	esac;;
+        # Create intermediate dirs using mode 755 as modified by the umask.
+        # This is like FreeBSD 'install' as of 1997-10-28.
+        umask=`umask`
+        case $stripcmd.$umask in
+          # Optimize common cases.
+          *[2367][2367]) mkdir_umask=$umask;;
+          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+          *[0-7])
+            mkdir_umask=`expr $umask + 22 \
+              - $umask % 100 % 40 + $umask % 20 \
+              - $umask % 10 % 4 + $umask % 2
+            `;;
+          *) mkdir_umask=$umask,go-w;;
+        esac
+
+        # With -d, create the new directory with the user-specified mode.
+        # Otherwise, rely on $mkdir_umask.
+        if test -n "$dir_arg"; then
+          mkdir_mode=-m$mode
+        else
+          mkdir_mode=
+        fi
+
+        posix_mkdir=false
+        case $umask in
+          *[123567][0-7][0-7])
+            # POSIX mkdir -p sets u+wx bits regardless of umask, which
+            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+            ;;
+          *)
+            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+            trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+            if (umask $mkdir_umask &&
+                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+            then
+              if test -z "$dir_arg" || {
+                   # Check for POSIX incompatibilities with -m.
+                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                   # other-writable bit of parent directory when it shouldn't.
+                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+                   case $ls_ld_tmpdir in
+                     d????-?r-*) different_mode=700;;
+                     d????-?--*) different_mode=755;;
+                     *) false;;
+                   esac &&
+                   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+                     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                   }
+                 }
+              then posix_mkdir=:
+              fi
+              rmdir "$tmpdir/d" "$tmpdir"
+            else
+              # Remove any dirs left behind by ancient mkdir implementations.
+              rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+            fi
+            trap '' 0;;
+        esac;;
     esac
 
     if
       $posix_mkdir && (
-	umask $mkdir_umask &&
-	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+        umask $mkdir_umask &&
+        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
       )
     then :
     else
@@ -384,53 +370,51 @@ do
       # directory the slow way, step by step, checking for races as we go.
 
       case $dstdir in
-	/*) prefix='/';;
-	-*) prefix='./';;
-	*)  prefix='';;
+        /*) prefix='/';;
+        [-=\(\)!]*) prefix='./';;
+        *)  prefix='';;
       esac
 
-      eval "$initialize_posix_glob"
-
       oIFS=$IFS
       IFS=/
-      $posix_glob set -f
+      set -f
       set fnord $dstdir
       shift
-      $posix_glob set +f
+      set +f
       IFS=$oIFS
 
       prefixes=
 
       for d
       do
-	test -z "$d" && continue
-
-	prefix=$prefix$d
-	if test -d "$prefix"; then
-	  prefixes=
-	else
-	  if $posix_mkdir; then
-	    (umask=$mkdir_umask &&
-	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-	    # Don't fail if two instances are running concurrently.
-	    test -d "$prefix" || exit 1
-	  else
-	    case $prefix in
-	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-	      *) qprefix=$prefix;;
-	    esac
-	    prefixes="$prefixes '$qprefix'"
-	  fi
-	fi
-	prefix=$prefix/
+        test X"$d" = X && continue
+
+        prefix=$prefix$d
+        if test -d "$prefix"; then
+          prefixes=
+        else
+          if $posix_mkdir; then
+            (umask=$mkdir_umask &&
+             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+            # Don't fail if two instances are running concurrently.
+            test -d "$prefix" || exit 1
+          else
+            case $prefix in
+              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+              *) qprefix=$prefix;;
+            esac
+            prefixes="$prefixes '$qprefix'"
+          fi
+        fi
+        prefix=$prefix/
       done
 
       if test -n "$prefixes"; then
-	# Don't fail if two instances are running concurrently.
-	(umask $mkdir_umask &&
-	 eval "\$doit_exec \$mkdirprog $prefixes") ||
-	  test -d "$dstdir" || exit 1
-	obsolete_mkdir_used=true
+        # Don't fail if two instances are running concurrently.
+        (umask $mkdir_umask &&
+         eval "\$doit_exec \$mkdirprog $prefixes") ||
+          test -d "$dstdir" || exit 1
+        obsolete_mkdir_used=true
       fi
     fi
   fi
@@ -465,15 +449,12 @@ do
 
     # If -C, don't bother to copy if it wouldn't change the file.
     if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
-
-       eval "$initialize_posix_glob" &&
-       $posix_glob set -f &&
+       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
+       set -f &&
        set X $old && old=:$2:$4:$5:$6 &&
        set X $new && new=:$2:$4:$5:$6 &&
-       $posix_glob set +f &&
-
+       set +f &&
        test "$old" = "$new" &&
        $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
     then
@@ -486,24 +467,24 @@ do
       # to itself, or perhaps because mv is so ancient that it does not
       # support -f.
       {
-	# Now remove or move aside any old file at destination location.
-	# We try this two ways since rm can't unlink itself on some
-	# systems and the destination file might be busy for other
-	# reasons.  In this case, the final cleanup might fail but the new
-	# file should still install successfully.
-	{
-	  test ! -f "$dst" ||
-	  $doit $rmcmd -f "$dst" 2>/dev/null ||
-	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-	  } ||
-	  { echo "$0: cannot unlink or rename $dst" >&2
-	    (exit 1); exit 1
-	  }
-	} &&
-
-	# Now rename the file to the real destination.
-	$doit $mvcmd "$dsttmp" "$dst"
+        # Now remove or move aside any old file at destination location.
+        # We try this two ways since rm can't unlink itself on some
+        # systems and the destination file might be busy for other
+        # reasons.  In this case, the final cleanup might fail but the new
+        # file should still install successfully.
+        {
+          test ! -f "$dst" ||
+          $doit $rmcmd -f "$dst" 2>/dev/null ||
+          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+          } ||
+          { echo "$0: cannot unlink or rename $dst" >&2
+            (exit 1); exit 1
+          }
+        } &&
+
+        # Now rename the file to the real destination.
+        $doit $mvcmd "$dsttmp" "$dst"
       }
     fi || exit 1
 
diff --git a/bin/ltmain.sh b/bin/ltmain.sh
index 63ae69d..bffda54 100644
--- a/bin/ltmain.sh
+++ b/bin/ltmain.sh
@@ -70,7 +70,7 @@
 #         compiler:		$LTCC
 #         compiler flags:		$LTCFLAGS
 #         linker:		$LD (gnu? $with_gnu_ld)
-#         $progname:	(GNU libtool) 2.4.2
+#         $progname:	(GNU libtool) 2.4.2 Debian-2.4.2-1.11
 #         automake:	$automake_version
 #         autoconf:	$autoconf_version
 #
@@ -80,7 +80,7 @@
 
 PROGRAM=libtool
 PACKAGE=libtool
-VERSION=2.4.2
+VERSION="2.4.2 Debian-2.4.2-1.11"
 TIMESTAMP=""
 package_revision=1.3337
 
@@ -6124,7 +6124,10 @@ func_mode_link ()
 	case $pass in
 	dlopen) libs="$dlfiles" ;;
 	dlpreopen) libs="$dlprefiles" ;;
-	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+	link)
+	  libs="$deplibs %DEPLIBS%"
+	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+	  ;;
 	esac
       fi
       if test "$linkmode,$pass" = "lib,dlpreopen"; then
@@ -6444,19 +6447,19 @@ func_mode_link ()
 	    # It is a libtool convenience library, so add in its objects.
 	    func_append convenience " $ladir/$objdir/$old_library"
 	    func_append old_convenience " $ladir/$objdir/$old_library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+	      if $opt_preserve_dup_deps ; then
+		case "$tmp_libs " in
+		*" $deplib "*) func_append specialdeplibs " $deplib" ;;
+		esac
+	      fi
+	      func_append tmp_libs " $deplib"
+	    done
 	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
 	    func_fatal_error "\`$lib' is not a convenience library"
 	  fi
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    deplibs="$deplib $deplibs"
-	    if $opt_preserve_dup_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
-	      esac
-	    fi
-	    func_append tmp_libs " $deplib"
-	  done
 	  continue
 	fi # $pass = conv
 
@@ -7349,6 +7352,9 @@ func_mode_link ()
 	    revision="$number_minor"
 	    lt_irix_increment=no
 	    ;;
+	  *)
+	    func_fatal_configuration "$modename: unknown library version type \`$version_type'"
+	    ;;
 	  esac
 	  ;;
 	no)
diff --git a/bin/make_vers b/bin/make_vers
index 2cfad4c..0bc3b62 100755
--- a/bin/make_vers
+++ b/bin/make_vers
@@ -2,13 +2,20 @@
 require 5.003;
 
 # Global settings
+# (The max_idx parameter is the only thing that needs to be changed when adding
+#       support for a new major release.  If support for a prior major release
+#       is added (like support for 1.4, etc), the min_sup_idx parameter will
+#       need to be decremented. - QAK)
 
 # Max. library "index" (0 = v1.0, 1 = 1.2, etc)
-$max_idx = 4;
+$max_idx = 5;
 
 # Min. supported previous library version "index" (0 = v1.0, 1 = 1.2, etc)
 $min_sup_idx = 3;
 
+# Number of spaces to indent preprocessor commands inside ifdefs
+$indent = 2;
+
 #
 # Copyright by The HDF Group.
 # Copyright by the Board of Trustees of the University of Illinois.
@@ -82,13 +89,34 @@ sub print_startprotect ($$) {
 # Print check for conflicting version macro settings
 #
 sub print_checkoptions ($) {
-    my $fh = shift;
+    my $fh = shift;             # File handle for output file
+    my $curr_idx;               # Current API version index
 
     # Print the option checking
     print $fh "\n/* Issue error if contradicting macros have been defined. */\n";
-    print $fh "#if defined(H5_USE_16_API) && defined(H5_NO_DEPRECATED_SYMBOLS)\n";
-    print $fh "#error \"Can't choose old API versions when deprecated APIs are disabled\"\n";
-    print $fh "#endif /* defined(H5_USE_16_API) && defined(H5_NO_DEPRECATED_SYMBOLS) */\n";
+
+    # Print the #ifdef
+    print $fh "#if (";
+    for $curr_idx ($min_sup_idx .. ($max_idx - 1)) {
+        print $fh "defined(H5_USE_1", ($curr_idx * 2), "_API)";
+        if($curr_idx < ($max_idx - 1)) {
+            print $fh " || ";
+        }
+    }
+    print $fh ") && defined(H5_NO_DEPRECATED_SYMBOLS)\n";
+
+    # Print the error for bad API version chosen
+    print $fh ' ' x $indent, "#error \"Can't choose old API versions when deprecated APIs are disabled\"\n";
+
+    # Print the #endif
+    print $fh "#endif /* (";
+    for $curr_idx ($min_sup_idx .. ($max_idx - 1)) {
+        print $fh "defined(H5_USE_1", ($curr_idx * 2), "_API)";
+        if($curr_idx < ($max_idx - 1)) {
+            print $fh " || ";
+        }
+    }
+    print $fh ") && defined(H5_NO_DEPRECATED_SYMBOLS) */\n";
 }
 
 ##############################################################################
@@ -110,7 +138,7 @@ sub print_globalapivers ($) {
         # Print API version ifdef
         print $fh "#if defined(H5_USE_1", ($curr_idx * 2), "_API_DEFAULT) && !defined(H5_USE_1", ($curr_idx * 2), "_API)\n";
         # Print API version definition
-        print $fh "#define H5_USE_1", ($curr_idx * 2), "_API 1\n";
+        print $fh " " x $indent, "#define H5_USE_1", ($curr_idx * 2), "_API 1\n";
         # Print API version endif
         print $fh "#endif /* H5_USE_1", ($curr_idx * 2), "_API_DEFAULT && !H5_USE_1", ($curr_idx * 2), "_API */\n\n";
     }
@@ -118,7 +146,7 @@ sub print_globalapivers ($) {
     # Loop over supported older library APIs and define the appropriate macros
     for $curr_idx ($min_sup_idx .. ($max_idx - 1)) {
         # Print API version ifdef
-        print $fh "#ifdef H5_USE_1", ($curr_idx * 2), "_API\n";
+        print $fh "\n#ifdef H5_USE_1", ($curr_idx * 2), "_API\n";
 
         # Print the version macro info for each function that is defined for
         # this API version
@@ -127,7 +155,7 @@ sub print_globalapivers ($) {
         print $fh "/*************/\n";
         for $name (sort keys %{$func_vers[$curr_idx]}) {
             print $fh "\n#if !defined(", $name, "_vers)\n";
-            print $fh  "#define ", $name, "_vers $func_vers[$curr_idx]{$name}\n";
+            print $fh  " " x $indent, "#define ", $name, "_vers $func_vers[$curr_idx]{$name}\n";
             print $fh  "#endif /* !defined(", $name, "_vers) */\n";
         }
 
@@ -138,7 +166,7 @@ sub print_globalapivers ($) {
         print $fh "/************/\n";
         for $name (sort keys %{$type_vers[$curr_idx]}) {
             print $fh "\n#if !defined(", $name, "_t_vers)\n";
-            print $fh  "#define ", $name, "_t_vers $type_vers[$curr_idx]{$name}\n";
+            print $fh  " " x $indent, "#define ", $name, "_t_vers $type_vers[$curr_idx]{$name}\n";
             print $fh  "#endif /* !defined(", $name, "_t_vers) */\n";
         }
 
@@ -180,25 +208,25 @@ sub print_defaultapivers ($) {
 
         # Set up default/latest version name mapping
         print $fh "\n#if !defined($curr_vers_name) || $curr_vers_name == $curr_vers\n";
-        print $fh "#ifndef $curr_vers_name\n";
-        print $fh "#define $curr_vers_name $curr_vers\n";
-        print $fh "#endif /* $curr_vers_name */\n";
-        print $fh "#define $curr_name $curr_name$curr_vers\n";
+        print $fh " " x $indent, "#ifndef $curr_vers_name\n";
+        print $fh " " x ($indent * 2), "#define $curr_vers_name $curr_vers\n";
+        print $fh " " x $indent, "#endif /* $curr_vers_name */\n";
+        print $fh " " x $indent, "#define $curr_name $curr_name$curr_vers\n";
 
         # Print function's dependent parameter types
         foreach(sort(@param_list)) {
-            print $fh "#define ${_}_t $_${curr_vers}_t\n";
+            print $fh " " x $indent, "#define ${_}_t $_${curr_vers}_t\n";
         }
 
         # Loop to print earlier version name mappings
         $curr_vers--;
         while($curr_vers > 0) {
             print $fh "#elif $curr_vers_name == $curr_vers\n";
-            print $fh "#define $curr_name $curr_name$curr_vers\n";
+            print $fh " " x $indent, "#define $curr_name $curr_name$curr_vers\n";
 
             # Print function's dependent parameter types
             foreach(sort(@param_list)) {
-                print $fh "#define ${_}_t $_${curr_vers}_t\n";
+                print $fh " " x $indent, "#define ${_}_t $_${curr_vers}_t\n";
             }
 
             $curr_vers--;
@@ -206,7 +234,7 @@ sub print_defaultapivers ($) {
 
         # Finish up with error for unknown version and endif
         print $fh "#else /* $curr_vers_name */\n";
-        print $fh "#error \"$curr_vers_name set to invalid value\"\n";
+        print $fh " " x $indent, "#error \"$curr_vers_name set to invalid value\"\n";
         print $fh "#endif /* $curr_vers_name */\n";
     }
 
@@ -224,22 +252,22 @@ sub print_defaultapivers ($) {
 
         # Set up default/latest version name mapping
         print $fh "\n#if !defined($curr_vers_name) || $curr_vers_name == $curr_vers\n";
-        print $fh "#ifndef $curr_vers_name\n";
-        print $fh "#define $curr_vers_name $curr_vers\n";
-        print $fh "#endif /* $curr_vers_name */\n";
-        print $fh "#define ${curr_name}_t $curr_name${curr_vers}_t\n";
+        print $fh " " x $indent, "#ifndef $curr_vers_name\n";
+        print $fh " " x ($indent * 2), "#define $curr_vers_name $curr_vers\n";
+        print $fh " " x $indent, "#endif /* $curr_vers_name */\n";
+        print $fh " " x $indent, "#define ${curr_name}_t $curr_name${curr_vers}_t\n";
 
         # Loop to print earlier version name mappings
         $curr_vers--;
         while($curr_vers > 0) {
             print $fh "#elif $curr_vers_name == $curr_vers\n";
-            print $fh "#define ${curr_name}_t $curr_name${curr_vers}_t\n";
+            print $fh " " x $indent, "#define ${curr_name}_t $curr_name${curr_vers}_t\n";
             $curr_vers--;
         }
 
         # Finish up with error for unknown version and endif
         print $fh "#else /* $curr_vers_name */\n";
-        print $fh "#error \"$curr_vers_name set to invalid value\"\n";
+        print $fh " " x $indent, "#error \"$curr_vers_name set to invalid value\"\n";
         print $fh "#endif /* $curr_vers_name */\n\n";
     }
 }
@@ -271,6 +299,7 @@ sub parse_line ($) {
         my $params;         # Typedefs for function parameters
         my $vers;           # The version info for the function
         my @vers_list;      # Version info, as a list
+        my @vers_nums;      # Version info, as a numeric list
         my $num_versions;   # Number of versions for function
         my %sym_versions;   # Versions for a symbol
         my $last_idx;       # The previous version index seen for a function
@@ -308,15 +337,12 @@ sub parse_line ($) {
         @vers_list = split(/\s*,\s*/, $vers);
 #print "parse_line: vers_list=(@vers_list)\n";
 
-        # Check for invalid version info given
-        $last_idx = -1;
-        $last_vers = 1;
-        foreach(sort(@vers_list)) {
+        # Parse the version list into numbers, checking for invalid input
+        foreach(@vers_list) {
             my $vers_idx;       # Index of version in array
 
-#print "parse_line: _=$_ last_idx='$last_idx'\n";
             # Do some validation on the input
-            if(!($_ =~ /v1[02468]/)) {
+            if(!( $_ =~ /v1[02468]/ || $_ =~ /v11[02468]/ )) {
                 die "bad version information: $name";
             }
             if(exists($sym_versions{$_})) {
@@ -326,18 +352,29 @@ sub parse_line ($) {
             # Store the versions for the function in a local hash table, indexed by the version
             $sym_versions{$_}=$_;
 
+#print "parse_line: _=$_\n";
             # Get the index of the version
-            ($vers_idx) = ($_ =~ /v1(\d)/);
+            ($vers_idx) = ($_ =~ /v1(\d+)/);
             $vers_idx /= 2;
 #print "parse_line: vers_idx='$vers_idx'\n";
+            push(@vers_nums, $vers_idx);
+        }
+#print "parse_line: vers_nums=(@vers_nums)\n";
 
+        # Check for invalid version info given
+        $last_idx = -1;
+        $last_vers = 1;
+        foreach(sort(@vers_nums)) {
+#print "parse_line: _=$_ last_idx='$last_idx'\n";
             # Update intermediate versions of the library that included the API routine
             if($last_idx >= 0) {
+#print "parse_line: name='$name'\n";
+#print "parse_line: last_vers='$last_vers'\n";
 #print "parse_line: last_idx='$last_idx'\n";
 
                 # Add the function to the list of API routines available in
                 # different versions of the library
-                while($last_idx < $vers_idx) {
+                while($last_idx <= $_) {
                     if($line_type == 1) {
                         $func_vers[$last_idx]{$name} = $last_vers;
                     } elsif($line_type == 2) {
@@ -353,7 +390,7 @@ sub parse_line ($) {
             }
 
             # Keep track of last version index seen
-            $last_idx = $vers_idx;
+            $last_idx = $_;
         }
 
         # Finish updating versions of the library that included the API routine
@@ -427,7 +464,13 @@ for $file (@ARGV) {
     my $prefix;         # Local prefix for generated files
 
 #print "file = '$file'\n";
-    ($prefix) = ($file =~ /(^.*\/)/);
+    # Check for directory prefix on input file
+    if($file =~ /\//) {
+        ($prefix) = ($file =~ /(^.*\/)/);
+    }
+    else {
+        $prefix = "";
+    }
 #print "prefix = '$prefix'\n";
     # Read in the entire file
     open SOURCE, $file or die "$file: $!\n";
@@ -441,7 +484,7 @@ for $file (@ARGV) {
     close SOURCE;
   
     # Create header files
-    print "Generating 'H5version.h'\n";
+    print "Generating '", $prefix, "H5version.h'\n";
     create_public($prefix);
 
 #for $name (sort keys %functions) {
diff --git a/bin/missing b/bin/missing
index db98974..f62bbae 100755
--- a/bin/missing
+++ b/bin/missing
@@ -3,7 +3,7 @@
 
 scriptversion=2013-10-28.13; # UTC
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 # Originally written by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
 
 # This program is free software; you can redistribute it and/or modify
diff --git a/bin/mkinstalldirs b/bin/mkinstalldirs
deleted file mode 100755
index 2901d5b..0000000
--- a/bin/mkinstalldirs
+++ /dev/null
@@ -1,101 +0,0 @@
-#! /bin/sh
-# mkinstalldirs --- make directory hierarchy
-# Author: Noah Friedman <friedman at prep.ai.mit.edu>
-# Created: 1993-05-16
-# Public domain
-
-# $Id: mkinstalldirs 9902 2005-02-01 04:17:02Z jlaird $
-
-errstatus=0
-dirmode=""
-
-usage="\
-Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..."
-
-# process command line arguments
-while test $# -gt 0 ; do
-   case "${1}" in
-     -h | --help | --h* )			# -h for help
-	echo "${usage}" 1>&2; exit 0 ;;
-     -m )					# -m PERM arg
-	shift
-	test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; }
-	dirmode="${1}"
-	shift ;;
-     -- ) shift; break ;;			# stop option processing
-     -* ) echo "${usage}" 1>&2; exit 1 ;;	# unknown option
-     * )  break ;;				# first non-opt arg
-   esac
-done
-
-for file
-do
-  if test -d "$file"; then
-    shift
-  else
-    break
-  fi
-done
-
-case $# in
-0) exit 0 ;;
-esac
-
-case $dirmode in
-'')
-  if mkdir -p -- . 2>/dev/null; then
-    echo "mkdir -p -- $*"
-    exec mkdir -p -- "$@"
-  fi ;;
-*)
-  if mkdir -m "$dirmode" -p -- . 2>/dev/null; then
-    echo "mkdir -m $dirmode -p -- $*"
-    exec mkdir -m "$dirmode" -p -- "$@"
-  fi ;;
-esac
-
-for file
-do
-   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
-   shift
-
-   pathcomp=
-   for d
-   do
-     pathcomp="$pathcomp$d"
-     case "$pathcomp" in
-       -* ) pathcomp=./$pathcomp ;;
-     esac
-
-     if test ! -d "$pathcomp"; then
-	echo "mkdir $pathcomp"
-
-	mkdir "$pathcomp" || lasterr=$?
-
-	if test ! -d "$pathcomp"; then
-	  errstatus=$lasterr
-	else
-	  if test ! -z "$dirmode"; then
-	     echo "chmod $dirmode $pathcomp"
-
-	     lasterr=""
-	     chmod "$dirmode" "$pathcomp" || lasterr=$?
-
-	     if test ! -z "$lasterr"; then
-	       errstatus=$lasterr
-	     fi
-	  fi
-	fi
-     fi
-
-     pathcomp="$pathcomp/"
-   done
-done
-
-exit $errstatus
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 3
-# End:
-# mkinstalldirs ends here
diff --git a/bin/release b/bin/release
index add2b39..703916b 100755
--- a/bin/release
+++ b/bin/release
@@ -40,12 +40,9 @@
 USAGE()
 {
 cat << EOF
-Usage: $0 -d <dir> [--docver BRANCHNAME] [-h] [--nocheck] [--private] <methods> ...
+Usage: $0 -d <dir> [-h] [--nocheck] [--private] <methods> ...
    -d DIR	The name of the directory where the releas(es) should be
                 placed.
-   --docver BRANCHNAME  This is added for 1.8 and beyond to get the correct
-                        version of documentation files from the hdf5docs
-                        repository.  BRANCHNAME for v1.8 should be hdf5_1_8.
    -h           print the help page.
    --nocheck	Ignore errors in MANIFEST file.
    --private	Make a private release with today's date in version information.
@@ -206,10 +203,6 @@ while [ -n "$1" ]; do
 	--private)
 	    pmode=yes
 	    ;;
-        --docver)
-            DOCVERSION=$1
-            shift
-            ;;
 	-*)
 	    echo "Unknown switch: $arg" 1>&2
 	    USAGE
@@ -289,11 +282,6 @@ for f in README.txt release_docs/RELEASE.txt; do
     chmod 644 $f
 done
 
-# trunk is different than branches.
-if [ "${DOCVERSION}" ]; then
-    DOC_URL=http://svn.hdfgroup.uiuc.edu/hdf5doc/branches/${DOCVERSION}
-fi
-
 # Create the tar file
 test "$verbose" && echo "   Running tar..." 1>&2
 ( \
@@ -327,19 +315,16 @@ for comp in $methods; do
 	    (cd $DEST; md5sum $HDF5_VERS.zip >> $MD5file) 
 	    ;;
 	doc)
-            if [ "${DOCVERSION}" = "" ]; then
-                DOCVERSION=trunk
-            fi
 	    test "$verbose" && echo "   Creating docs..." 1>&2
 	    # Check out docs from svn repo
 	    (cd $tmpdir; svn co $DOC_URL > /dev/null) || exit 1
 	    # Create doxygen C++ RM
 	    (cd c++/src && doxygen cpp_doc_config > /dev/null ) || exit 1
 	    # Replace version of C++ RM with just-created version
-            rm -rf $tmpdir/${DOCVERSION}/html/$CPPLUS_RM_NAME
-            mv c++/src/$CPPLUS_RM_NAME $tmpdir/${DOCVERSION}/html/$CPPLUS_RM_NAME
-            # Compress the docs and move them to the release area
-            mv $tmpdir/$DOCVERSION $tmpdir/${HDF5_VERS}_docs
+	    rm -rf $tmpdir/trunk/html/$CPPLUS_RM_NAME
+	    mv c++/src/$CPPLUS_RM_NAME $tmpdir/trunk/html/$CPPLUS_RM_NAME
+	    # Compress the docs and move them to the release area
+	    mv $tmpdir/trunk $tmpdir/${HDF5_VERS}_docs
 	    (cd $tmpdir && tar cf ${HDF5_VERS}_docs.tar ${HDF5_VERS}_docs)
 	    mv $tmpdir/${HDF5_VERS}_docs.tar $DEST
 	    ;;
diff --git a/bin/test-driver b/bin/test-driver
old mode 100644
new mode 100755
index d306056..8e575b0
--- a/bin/test-driver
+++ b/bin/test-driver
@@ -3,7 +3,7 @@
 
 scriptversion=2013-07-13.22; # UTC
 
-# Copyright (C) 2011-2013 Free Software Foundation, Inc.
+# Copyright (C) 2011-2014 Free Software Foundation, Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -106,11 +106,14 @@ trap "st=143; $do_exit" 15
 # Test script is run here.
 "$@" >$log_file 2>&1
 estatus=$?
+
 if test $enable_hard_errors = no && test $estatus -eq 99; then
-  estatus=1
+  tweaked_estatus=1
+else
+  tweaked_estatus=$estatus
 fi
 
-case $estatus:$expect_failure in
+case $tweaked_estatus:$expect_failure in
   0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
   0:*)   col=$grn res=PASS  recheck=no  gcopy=no;;
   77:*)  col=$blu res=SKIP  recheck=no  gcopy=yes;;
@@ -119,6 +122,12 @@ case $estatus:$expect_failure in
   *:*)   col=$red res=FAIL  recheck=yes gcopy=yes;;
 esac
 
+# Report the test outcome and exit status in the logs, so that one can
+# know whether the test passed or failed simply by looking at the '.log'
+# file, without the need of also peaking into the corresponding '.trs'
+# file (automake bug#11814).
+echo "$res $test_name (exit status: $estatus)" >>$log_file
+
 # Report outcome to console.
 echo "${col}${res}${std}: $test_name"
 
diff --git a/bin/trace b/bin/trace
index 3f23a26..05d3186 100755
--- a/bin/trace
+++ b/bin/trace
@@ -37,16 +37,20 @@ $Source = "";
                "H5D_fill_value_t"           => "DF",
 	       "H5FD_mpio_chunk_opt_t"      => "Dh",
                "H5D_mpio_actual_io_mode_t"  => "Di",
+               "H5D_chunk_index_t"          => "Dk",
                "H5D_layout_t"               => "Dl",
                "H5D_mpio_no_collective_cause_t" => "Dn",
                "H5D_mpio_actual_chunk_opt_mode_t" => "Do",
                "H5D_space_status_t"         => "Ds",
+               "H5D_vds_view_t"             => "Dv",
                "H5FD_mpio_xfer_t"           => "Dt",
                "herr_t"                     => "e",
                "H5E_direction_t"            => "Ed",
                "H5E_error_t"                => "Ee",
 	       "H5E_type_t"                 => "Et",
 	       "H5F_close_degree_t"         => "Fd",
+	       "H5F_file_space_type_t"      => "Ff",
+	       "H5F_mem_t"                  => "Fm",
                "H5F_scope_t"                => "Fs",
 	       "H5F_libver_t"               => "Fv",
                "H5G_obj_t"                  => "Go",
@@ -98,6 +102,7 @@ $Source = "";
 	       "H5A_operator2_t"            => "x",
 	       "H5A_info_t"                 => "x",
                "H5AC_cache_config_t"        => "x",
+               "H5D_append_cb_t"            => "x",
                "H5D_gather_func_t"          => "x",
                "H5D_operator_t"             => "x",
                "H5D_scatter_func_t"         => "x",
@@ -107,7 +112,10 @@ $Source = "";
                "H5E_walk_t"                 => "x",
                "H5E_walk1_t"                => "x",
                "H5E_walk2_t"                => "x",
-	       "H5F_info_t"                 => "x",
+               "H5F_flush_cb_t"             => "x",
+	       "H5F_info1_t"                => "x",
+	       "H5F_info2_t"                => "x",
+               "H5F_retry_info_t"           => "x",
                "H5FD_t"                     => "x",
                "H5FD_class_t"               => "x",
                "H5FD_stream_fapl_t"         => "x",
diff --git a/c++/Makefile.in b/c++/Makefile.in
index c964e95..7f4a7b2 100644
--- a/c++/Makefile.in
+++ b/c++/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -31,7 +31,17 @@
 # Top-level HDF5-C++ Makefile(.in)
 # 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -94,19 +104,20 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(top_srcdir)/bin/test-driver COPYING
 TESTS =
 subdir = c++
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_P = $(am__v_P_ at AM_V@)
@@ -362,6 +373,9 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am COPYING
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 am__relativize = \
   dir0=`pwd`; \
@@ -403,7 +417,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -448,14 +461,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -465,13 +486,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -513,9 +533,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -691,7 +722,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign c++/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign c++/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -700,7 +730,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -846,7 +876,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1138,6 +1168,8 @@ uninstall-am:
 	mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/c++/examples/Makefile.am b/c++/examples/Makefile.am
index 61b72ce..2408217 100644
--- a/c++/examples/Makefile.am
+++ b/c++/examples/Makefile.am
@@ -51,8 +51,8 @@ CXX_API=yes
 
 # Where to install examples
 # Note: no '/' after DESTDIR.  Explanation in commence.am
-EXAMPLEDIR=${DESTDIR}$(datarootdir)/hdf5_examples/c++
-EXAMPLETOPDIR=${DESTDIR}$(datarootdir)/hdf5_examples
+EXAMPLEDIR=${DESTDIR}$(exec_prefix)/share/hdf5_examples/c++
+EXAMPLETOPDIR=${DESTDIR}$(exec_prefix)/share/hdf5_examples
 
 # How to build programs using h5c++
 $(EXTRA_PROG): $(H5CPP)
diff --git a/c++/examples/Makefile.in b/c++/examples/Makefile.in
index 698ad4b..87e35bb 100644
--- a/c++/examples/Makefile.in
+++ b/c++/examples/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -35,7 +35,17 @@
 # built using h5cc (or h5fc, etc.) instead of the standard compilers.
 # This creates some extra work for us.
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -98,21 +108,20 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/examples.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/run-c++-ex.sh.in $(srcdir)/testh5c++.sh.in \
-	$(top_srcdir)/bin/test-driver
 TESTS = $(TEST_SCRIPT)
 subdir = c++/examples
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES = run-c++-ex.sh testh5c++.sh
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_P = $(am__v_P_ at AM_V@)
@@ -335,6 +344,11 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/run-c++-ex.sh.in \
+	$(srcdir)/testh5c++.sh.in $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am \
+	$(top_srcdir)/config/examples.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -351,7 +365,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -396,14 +409,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -413,13 +434,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -461,9 +481,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -626,8 +657,8 @@ CXX_API = yes
 
 # Where to install examples
 # Note: no '/' after DESTDIR.  Explanation in commence.am
-EXAMPLEDIR = ${DESTDIR}$(datarootdir)/hdf5_examples/c++
-EXAMPLETOPDIR = ${DESTDIR}$(datarootdir)/hdf5_examples
+EXAMPLEDIR = ${DESTDIR}$(exec_prefix)/share/hdf5_examples/c++
+EXAMPLETOPDIR = ${DESTDIR}$(exec_prefix)/share/hdf5_examples
 
 # Assume that all tests in this directory are examples, and tell
 # conclude.am when to build them.
@@ -672,7 +703,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign c++/examples/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign c++/examples/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -681,7 +711,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/examples.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/examples.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -738,7 +768,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1006,6 +1036,8 @@ uninstall-am: uninstall-local
 	pdf-am ps ps-am recheck tags-am uninstall uninstall-am \
 	uninstall-local
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/c++/examples/run-c++-ex.sh.in b/c++/examples/run-c++-ex.sh.in
index c291bb2..eae2782 100644
--- a/c++/examples/run-c++-ex.sh.in
+++ b/c++/examples/run-c++-ex.sh.in
@@ -34,7 +34,7 @@ EXIT_FAILURE=1
 
 # Where the tool is installed.
 # default is relative path to installed location of the tools
-prefix="${prefix:-../../..}"
+prefix="${prefix:- at prefix@}"
 AR="@AR@"
 RANLIB="@RANLIB@"
 H5TOOL="h5c++"                  # The tool name
diff --git a/c++/examples/testh5c++.sh.in b/c++/examples/testh5c++.sh.in
index ca4fc56..40d503f 100644
--- a/c++/examples/testh5c++.sh.in
+++ b/c++/examples/testh5c++.sh.in
@@ -27,8 +27,7 @@ EXIT_SUCCESS=0
 EXIT_FAILURE=1
 
 # Where the tool is installed.
-# Note: no '/' after DESTDIR.  Explanation in commence.am
-prefix="${prefix:-${DESTDIR}@prefix@}"
+prefix="${prefix:- at prefix@}"
 AR="@AR@"
 RANLIB="@RANLIB@"
 H5TOOL="h5c++"           	# The tool name
diff --git a/c++/src/CMakeLists.txt b/c++/src/CMakeLists.txt
index 1a182e3..473605a 100644
--- a/c++/src/CMakeLists.txt
+++ b/c++/src/CMakeLists.txt
@@ -94,7 +94,7 @@ if (BUILD_SHARED_LIBS)
   TARGET_C_PROPERTIES (${HDF5_CPP_LIBSH_TARGET} SHARED " " " ")
   target_link_libraries (${HDF5_CPP_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
   set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_CPP_LIBSH_TARGET}")
-  H5_SET_LIB_OPTIONS (${HDF5_CPP_LIBSH_TARGET} ${HDF5_CPP_LIB_NAME} SHARED ${HDF5_CXX_PACKAGE_SOVERSION})
+  H5_SET_LIB_OPTIONS (${HDF5_CPP_LIBSH_TARGET} ${HDF5_CPP_LIB_NAME} SHARED)
   set_target_properties (${HDF5_CPP_LIBSH_TARGET} PROPERTIES
       FOLDER libraries/cpp
       COMPILE_DEFINITIONS "H5_BUILT_AS_DYNAMIC_LIB"
diff --git a/c++/src/H5Attribute.cpp b/c++/src/H5Attribute.cpp
index 6705739..ea8c5bb 100644
--- a/c++/src/H5Attribute.cpp
+++ b/c++/src/H5Attribute.cpp
@@ -496,9 +496,9 @@ hsize_t Attribute::getStorageSize() const
 ///\exception	H5::AttributeIException
 ///\par Description
 ///		This attribute is used to identify the file to be flushed.
-// Programmer	Binh-Minh Ribler - 2013
+// Programmer	Binh-Minh Ribler - 2012
 // Modification
-//	Mar 2013 - BMR
+//	Sep 2012 - BMR
 //		Duplicated from H5Location
 //--------------------------------------------------------------------------
 void Attribute::flush(H5F_scope_t scope) const
diff --git a/c++/src/H5CommonFG.cpp b/c++/src/H5CommonFG.cpp
index a482fc2..c88f6c1 100644
--- a/c++/src/H5CommonFG.cpp
+++ b/c++/src/H5CommonFG.cpp
@@ -49,6 +49,7 @@
 
 #ifndef H5_NO_NAMESPACE
 namespace H5 {
+using namespace std;
 #endif
 
 //--------------------------------------------------------------------------
diff --git a/c++/src/H5DataSet.cpp b/c++/src/H5DataSet.cpp
index af1277a..059da85 100644
--- a/c++/src/H5DataSet.cpp
+++ b/c++/src/H5DataSet.cpp
@@ -93,6 +93,7 @@ DataSet::DataSet(const DataSet& original) : H5Object(), AbstractDs()
 ///			  object that the dataset is located within.
 ///\param	ref - IN: Reference pointer
 ///\param	ref_type - IN: Reference type - default to H5R_OBJECT
+///\param	plist - IN: Property list - default to PropList::DEFAULT
 ///\exception	H5::DataSetIException
 ///\par Description
 ///		\c loc can be DataSet, Group, H5File, or named DataType, that
@@ -102,9 +103,9 @@ DataSet::DataSet(const DataSet& original) : H5Object(), AbstractDs()
 //	Jul, 2008
 //		Added for application convenience.
 //--------------------------------------------------------------------------
-DataSet::DataSet(const H5Location& loc, const void* ref, H5R_type_t ref_type) : AbstractDs(), H5Object(), id(H5I_INVALID_HID)
+DataSet::DataSet(const H5Location& loc, const void* ref, H5R_type_t ref_type, const PropList& plist) : H5Object(), AbstractDs(), id(H5I_INVALID_HID)
 {
-    id = H5Location::p_dereference(loc.getId(), ref, ref_type, "constructor - by dereferenced");
+    id = H5Location::p_dereference(loc.getId(), ref, ref_type, plist, "constructor - by dereferenced");
 }
 
 //--------------------------------------------------------------------------
@@ -114,15 +115,16 @@ DataSet::DataSet(const H5Location& loc, const void* ref, H5R_type_t ref_type) :
 ///\param	attr - IN: Specifying location where the referenced object is in
 ///\param	ref - IN: Reference pointer
 ///\param	ref_type - IN: Reference type - default to H5R_OBJECT
+///\param	plist - IN: Property list - default to PropList::DEFAULT
 ///\exception	H5::ReferenceException
 // Programmer	Binh-Minh Ribler - Oct, 2006
 // Modification
 //	Jul, 2008
 //		Added for application convenience.
 //--------------------------------------------------------------------------
-DataSet::DataSet(const Attribute& attr, const void* ref, H5R_type_t ref_type) : AbstractDs(), H5Object(), id(H5I_INVALID_HID)
+DataSet::DataSet(const Attribute& attr, const void* ref, H5R_type_t ref_type, const PropList& plist) : H5Object(), AbstractDs(), id(H5I_INVALID_HID)
 {
-    id = H5Location::p_dereference(attr.getId(), ref, ref_type, "constructor - by dereference");
+    id = H5Location::p_dereference(attr.getId(), ref, ref_type, plist, "constructor - by dereference");
 }
 
 //--------------------------------------------------------------------------
diff --git a/c++/src/H5DataSet.h b/c++/src/H5DataSet.h
index a539d6b..b2544a2 100644
--- a/c++/src/H5DataSet.h
+++ b/c++/src/H5DataSet.h
@@ -90,8 +90,8 @@ class H5_DLLCPP DataSet : public H5Object, public AbstractDs {
 	virtual H5std_string fromClass () const { return("DataSet"); }
 
 	// Creates a dataset by way of dereference.
-	DataSet(const H5Location& loc, const void* ref, H5R_type_t ref_type = H5R_OBJECT);
-	DataSet(const Attribute& attr, const void* ref, H5R_type_t ref_type = H5R_OBJECT);
+	DataSet(const H5Location& loc, const void* ref, H5R_type_t ref_type = H5R_OBJECT, const PropList& plist = PropList::DEFAULT);
+	DataSet(const Attribute& attr, const void* ref, H5R_type_t ref_type = H5R_OBJECT, const PropList& plist = PropList::DEFAULT);
 
 	// Default constructor.
 	DataSet();
diff --git a/c++/src/H5DataType.cpp b/c++/src/H5DataType.cpp
index d98a0cf..1bbabe3 100644
--- a/c++/src/H5DataType.cpp
+++ b/c++/src/H5DataType.cpp
@@ -100,15 +100,16 @@ DataType::DataType( const H5T_class_t type_class, size_t size ) : H5Object()
 ///\param       loc - IN: Location referenced object is in
 ///\param	ref - IN: Reference pointer
 ///\param	ref_type - IN: Reference type - default to H5R_OBJECT
+///\param	plist - IN: Property list - default to PropList::DEFAULT
 ///\exception	H5::ReferenceException
 // Programmer	Binh-Minh Ribler - Oct, 2006
 // Modification
 //	Jul, 2008
 //		Added for application convenience.
 //--------------------------------------------------------------------------
-DataType::DataType(const H5Location& loc, const void* ref, H5R_type_t ref_type) : H5Object(), id(H5I_INVALID_HID)
+DataType::DataType(const H5Location& loc, const void* ref, H5R_type_t ref_type, const PropList& plist) : H5Object()
 {
-    id = H5Location::p_dereference(loc.getId(), ref, ref_type, "constructor - by dereference");
+    id = H5Location::p_dereference(loc.getId(), ref, ref_type, plist, "constructor - by dereference");
 }
 
 //--------------------------------------------------------------------------
@@ -118,15 +119,16 @@ DataType::DataType(const H5Location& loc, const void* ref, H5R_type_t ref_type)
 ///\param       attr - IN: Specifying location where the referenced object is in
 ///\param	ref - IN: Reference pointer
 ///\param	ref_type - IN: Reference type - default to H5R_OBJECT
+///\param	plist - IN: Property list - default to PropList::DEFAULT
 ///\exception	H5::ReferenceException
 // Programmer	Binh-Minh Ribler - Oct, 2006
 // Modification
 //	Jul, 2008
 //		Added for application convenience.
 //--------------------------------------------------------------------------
-DataType::DataType(const Attribute& attr, const void* ref, H5R_type_t ref_type) : H5Object()
+DataType::DataType(const Attribute& attr, const void* ref, H5R_type_t ref_type, const PropList& plist) : H5Object(), id(H5I_INVALID_HID)
 {
-    id = H5Location::p_dereference(attr.getId(), ref, ref_type, "constructor - by dereference");
+    id = H5Location::p_dereference(attr.getId(), ref, ref_type, plist, "constructor - by dereference");
 }
 
 //--------------------------------------------------------------------------
@@ -295,7 +297,7 @@ void DataType::p_commit(hid_t loc_id, const char* name)
 ///\param	loc - IN: A location (file, dataset, datatype, or group)
 ///\param	name - IN: Name of the datatype
 ///\exception	H5::DataTypeIException
-// Programmer	Binh-Minh Ribler - 2000
+// Programmer	Binh-Minh Ribler - Jan, 2007
 //--------------------------------------------------------------------------
 void DataType::commit(const H5Location& loc, const char* name)
 {
diff --git a/c++/src/H5DataType.h b/c++/src/H5DataType.h
index 69f59b1..5705b83 100644
--- a/c++/src/H5DataType.h
+++ b/c++/src/H5DataType.h
@@ -43,8 +43,8 @@ class H5_DLLCPP DataType : public H5Object {
 	DataType(const PredType& pred_type);
 
 	// Creates a datatype by way of dereference.
-	DataType(const H5Location& loc, const void* ref, H5R_type_t ref_type = H5R_OBJECT);
-	DataType(const Attribute& attr, const void* ref, H5R_type_t ref_type = H5R_OBJECT);
+	DataType(const H5Location& loc, const void* ref, H5R_type_t ref_type = H5R_OBJECT, const PropList& plist = PropList::DEFAULT);
+	DataType(const Attribute& attr, const void* ref, H5R_type_t ref_type = H5R_OBJECT, const PropList& plist = PropList::DEFAULT);
 
 	// Closes this datatype.
 	virtual void close();
diff --git a/c++/src/H5Exception.cpp b/c++/src/H5Exception.cpp
index f2aa38a..1ca059b 100644
--- a/c++/src/H5Exception.cpp
+++ b/c++/src/H5Exception.cpp
@@ -305,7 +305,7 @@ const char* Exception::getCFuncName() const
 ///\brief	Prints the error stack in a default manner.
 ///\param	stream    - IN: File pointer, default to stderr
 ///\param	err_stack - IN: Error stack ID, default to H5E_DEFAULT(0)
-// Programmer	Binh-Minh Ribler - Apr, 2014 (1.8.13)
+// Programmer	Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void Exception::printErrorStack(FILE* stream, hid_t err_stack)
 {
diff --git a/c++/src/H5FcreatProp.cpp b/c++/src/H5FcreatProp.cpp
index 661c94b..af51677 100644
--- a/c++/src/H5FcreatProp.cpp
+++ b/c++/src/H5FcreatProp.cpp
@@ -106,6 +106,7 @@ FileCreatPropList::FileCreatPropList( const FileCreatPropList& original ) : Prop
 //--------------------------------------------------------------------------
 FileCreatPropList::FileCreatPropList(const hid_t plist_id) : PropList(plist_id) {}
 
+#ifndef H5_NO_DEPRECATED_SYMBOLS
 //--------------------------------------------------------------------------
 // Function:	FileCreatPropList::getVersion
 ///\brief	Retrieves version information for various parts of a file.
@@ -127,6 +128,7 @@ void FileCreatPropList::getVersion(unsigned& super, unsigned& freelist, unsigned
 		"H5Pget_version failed");
    }
 }
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
 
 //--------------------------------------------------------------------------
 // Function:	FileCreatPropList::setUserblock
diff --git a/c++/src/H5FcreatProp.h b/c++/src/H5FcreatProp.h
index ae32134..5d81078 100644
--- a/c++/src/H5FcreatProp.h
+++ b/c++/src/H5FcreatProp.h
@@ -30,8 +30,10 @@ class H5_DLLCPP FileCreatPropList : public PropList {
 	// Creates a file create property list.
 	FileCreatPropList();
 
+#ifndef H5_NO_DEPRECATED_SYMBOLS
 	// Retrieves version information for various parts of a file.
 	void getVersion( unsigned& super, unsigned& freelist, unsigned& stab, unsigned& shhdr ) const;
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
 
 	// Sets the userblock size field of a file creation property list.
 	void setUserblock( hsize_t size ) const;
diff --git a/c++/src/H5File.cpp b/c++/src/H5File.cpp
index 4b81f3f..b169472 100644
--- a/c++/src/H5File.cpp
+++ b/c++/src/H5File.cpp
@@ -49,8 +49,6 @@ namespace H5 {
 //--------------------------------------------------------------------------
 // Function	H5File default constructor
 ///\brief	Default constructor: creates a stub H5File object.
-///\par Description
-///		The data member \a id will be initialized to H5I_INVALID_HID.
 // Programmer	Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 H5File::H5File() : H5Location(), CommonFG(), id(H5I_INVALID_HID) {}
@@ -80,7 +78,7 @@ H5File::H5File() : H5Location(), CommonFG(), id(H5I_INVALID_HID) {}
 ///		For info on file creation in the case of an already-open file,
 ///		please refer to the \b Special \b case section in the C layer
 ///		Reference Manual at:
-/// https://www.hdfgroup.org/HDF5/doc/RM/RM_H5F.html#File-Create
+/// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5F.html#File-Create
 // Notes	With a PGI compiler (~2012-2013), the exception thrown by p_get_file
 //		could not be caught in the applications.  Added try block here
 //		to catch then re-throw it. -BMR 2013/03/21
@@ -231,14 +229,15 @@ bool H5File::isHdf5(const H5std_string& name )
 ///\param	flags        - IN: File access flags
 ///\param	access_plist - IN: File access property list.  Default to
 ///		FileAccPropList::DEFAULT
-///\exception	H5::FileIException
 ///\par Description
 ///		Valid values of \a flags include:
-///		\li \c H5F_ACC_RDONLY - Open with read-only.
-///		\li \c H5F_ACC_RDWR - Open with read/write access.
-///		For more information about file access, please refer to the
-///		C layer Reference Manual page at:
-///		https://www.hdfgroup.org/HDF5/doc/RM/RM_H5F.html#File-Open
+///		H5F_ACC_RDWR:   Open with read/write access. If the file is
+///				currently open for read-only access then it
+///				will be reopened. Absence of this flag
+///				implies read-only access.
+///
+///		H5F_ACC_RDONLY: Open with read only access. - default
+///
 // Programmer	Binh-Minh Ribler - Oct, 2005
 //--------------------------------------------------------------------------
 void H5File::openFile(const char* name, unsigned int flags, const FileAccPropList& access_plist)
@@ -266,11 +265,6 @@ void H5File::openFile(const char* name, unsigned int flags, const FileAccPropLis
 ///\param	flags        - IN: File access flags
 ///\param	access_plist - IN: File access property list.  Default to
 ///		FileAccPropList::DEFAULT
-///\exception	H5::FileIException
-///\par Description
-///		Valid values of \a flags include:
-///		\li \c H5F_ACC_RDONLY - Open with read-only.
-///		\li \c H5F_ACC_RDWR - Open with read/write access.
 // Programmer	Binh-Minh Ribler - 2000
 //--------------------------------------------------------------------------
 void H5File::openFile(const H5std_string& name, unsigned int flags, const FileAccPropList& access_plist)
@@ -304,9 +298,9 @@ void H5File::reOpen()
         throw FileIException("H5File::reOpen", close_error.getDetailMsg());
     }
 
-   // call C routine to reopen the file
+   // call C routine to reopen the file - Note: not sure about this,
    // which id to be the parameter when closing?
-   id = H5Freopen(id);
+   id = H5Freopen( id );
    if( id < 0 ) // Raise exception when H5Freopen returns a neg value
       throw FileIException("H5File::reOpen", "H5Freopen failed");
 }
diff --git a/c++/src/H5Group.cpp b/c++/src/H5Group.cpp
index 174dd1e..0823d0e 100644
--- a/c++/src/H5Group.cpp
+++ b/c++/src/H5Group.cpp
@@ -95,15 +95,16 @@ Group::Group(const hid_t existing_id) : H5Object(), CommonFG()
 ///\param	loc - IN: Specifying location referenced object is in
 ///\param	ref - IN: Reference pointer
 ///\param	ref_type - IN: Reference type - default to H5R_OBJECT
+///\param	plist - IN: Property list - default to PropList::DEFAULT
 ///\exception	H5::ReferenceException
 ///\par Description
 ///		\c obj can be DataSet, Group, or named DataType, that
 ///		is a datatype that has been named by DataType::commit.
 // Programmer	Binh-Minh Ribler - Oct, 2006
 //--------------------------------------------------------------------------
-Group::Group(const H5Location& loc, const void* ref, H5R_type_t ref_type) : H5Object(), id(H5I_INVALID_HID)
+Group::Group(const H5Location& loc, const void* ref, H5R_type_t ref_type, const PropList& plist) : H5Object(), CommonFG(), id(H5I_INVALID_HID)
 {
-    id = H5Location::p_dereference(loc.getId(), ref, ref_type, "constructor - by dereference");
+    id = H5Location::p_dereference(loc.getId(), ref, ref_type, plist, "constructor - by dereference");
 }
 
 //--------------------------------------------------------------------------
@@ -112,12 +113,13 @@ Group::Group(const H5Location& loc, const void* ref, H5R_type_t ref_type) : H5Ob
 ///\param	attr - IN: Specifying location where the referenced object is in
 ///\param	ref - IN: Reference pointer
 ///\param	ref_type - IN: Reference type - default to H5R_OBJECT
+///\param	plist - IN: Property list - default to PropList::DEFAULT
 ///\exception	H5::ReferenceException
 // Programmer	Binh-Minh Ribler - Oct, 2006
 //--------------------------------------------------------------------------
-Group::Group(const Attribute& attr, const void* ref, H5R_type_t ref_type) : H5Object(), id(H5I_INVALID_HID)
+Group::Group(const Attribute& attr, const void* ref, H5R_type_t ref_type, const PropList& plist) : H5Object(), CommonFG(), id(H5I_INVALID_HID)
 {
-    id = H5Location::p_dereference(attr.getId(), ref, ref_type, "constructor - by dereference");
+    id = H5Location::p_dereference(attr.getId(), ref, ref_type, plist, "constructor - by dereference");
 }
 
 //--------------------------------------------------------------------------
diff --git a/c++/src/H5Group.h b/c++/src/H5Group.h
index 100b214..1bd9882 100644
--- a/c++/src/H5Group.h
+++ b/c++/src/H5Group.h
@@ -41,8 +41,8 @@ class H5_DLLCPP Group : public H5Object, public CommonFG {
 	virtual hid_t getLocId() const;
 
 	// Creates a group by way of dereference.
-	Group(const H5Location& loc, const void* ref, H5R_type_t ref_type = H5R_OBJECT);
-        Group(const Attribute& attr, const void* ref, H5R_type_t ref_type = H5R_OBJECT);
+	Group(const H5Location& loc, const void* ref, H5R_type_t ref_type = H5R_OBJECT, const PropList& plist = PropList::DEFAULT);
+        Group(const Attribute& attr, const void* ref, H5R_type_t ref_type = H5R_OBJECT, const PropList& plist = PropList::DEFAULT);
 
 	// default constructor
 	Group();
@@ -67,7 +67,6 @@ class H5_DLLCPP Group : public H5Object, public CommonFG {
 
    private:
 	hid_t id;	// HDF5 group id
-
 };
 #ifndef H5_NO_NAMESPACE
 }
diff --git a/c++/src/H5IdComponent.cpp b/c++/src/H5IdComponent.cpp
index 75b0125..60735f0 100644
--- a/c++/src/H5IdComponent.cpp
+++ b/c++/src/H5IdComponent.cpp
@@ -26,9 +26,6 @@
 namespace H5 {
 #endif
 
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-// For internal use only
-
 // This flag indicates whether H5Library::initH5cpp has been called to register
 // the terminating functions with atexit()
 bool IdComponent::H5cppinit = false;
@@ -37,7 +34,6 @@ bool IdComponent::H5cppinit = false;
 // Subclasses that have global constants use it.  This is a temporary
 // work-around in 1.8.16.  It will be removed after HDFFV-9540 is fixed.
 bool IdComponent::H5dontAtexit_called = false;
-#endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
 // Function:	IdComponent overloaded constructor
diff --git a/c++/src/H5IdComponent.h b/c++/src/H5IdComponent.h
index 34f2da8..61c8bd6 100644
--- a/c++/src/H5IdComponent.h
+++ b/c++/src/H5IdComponent.h
@@ -95,7 +95,6 @@ class H5_DLLCPP IdComponent {
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
 
     protected:
-
 	// Default constructor.
 	IdComponent();
 
diff --git a/c++/src/H5Library.cpp b/c++/src/H5Library.cpp
index b87abdc..40c766a 100644
--- a/c++/src/H5Library.cpp
+++ b/c++/src/H5Library.cpp
@@ -261,15 +261,11 @@ void H5Library::setFreeListLimits(int reg_global_lim, int reg_list_lim,
    }
 }
 
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-// Applications don't need to instantiate H5Library
-
 // Default constructor - private
 H5Library::H5Library(){};
 
 // Destructor - private
 H5Library::~H5Library(){};
-#endif // DOXYGEN_SHOULD_SKIP_THIS
 
 #ifndef H5_NO_NAMESPACE
 } // end namespace
diff --git a/c++/src/H5Location.cpp b/c++/src/H5Location.cpp
index 30a7bc5..b4c88ed 100644
--- a/c++/src/H5Location.cpp
+++ b/c++/src/H5Location.cpp
@@ -716,15 +716,23 @@ void H5Location::reference(void* ref, const H5std_string& name, H5R_type_t ref_t
 //			 referenced object
 //		ref - IN: Reference pointer
 //		ref_type - IN: Reference type
+//		plist - IN: Property list - default to PropList::DEFAULT
+//		from_func - IN: Name of the calling function
 // Exception	H5::ReferenceException
 // Programmer	Binh-Minh Ribler - Oct, 2006
 // Modification
 //	May 2008 - BMR
 //		Moved from IdComponent.
 //--------------------------------------------------------------------------
-hid_t H5Location::p_dereference(hid_t loc_id, const void* ref, H5R_type_t ref_type, const char* from_func)
+hid_t H5Location::p_dereference(hid_t loc_id, const void* ref, H5R_type_t ref_type, const PropList& plist, const char* from_func)
 {
-   hid_t temp_id = H5Rdereference(loc_id, ref_type, ref);
+   hid_t plist_id;
+   if (p_valid_id(plist.getId()))
+	plist_id = plist.getId();
+   else
+	plist_id = H5P_DEFAULT;
+
+   hid_t temp_id = H5Rdereference2(loc_id, plist_id, ref_type, ref);
    if (temp_id < 0)
    {
       throw ReferenceException(inMemFunc(from_func), "H5Rdereference failed");
@@ -740,15 +748,16 @@ hid_t H5Location::p_dereference(hid_t loc_id, const void* ref, H5R_type_t ref_ty
 ///\param	loc - IN: Location of the referenced object
 ///\param	ref - IN: Reference pointer
 ///\param	ref_type - IN: Reference type
+///\param	plist - IN: Property list - default to PropList::DEFAULT
 ///\exception	H5::ReferenceException
 // Programmer	Binh-Minh Ribler - Oct, 2006
 // Modification
 //	May, 2008
 //		Corrected missing parameters. - BMR
 //--------------------------------------------------------------------------
-void H5Location::dereference(const H5Location& loc, const void* ref, H5R_type_t ref_type)
+void H5Location::dereference(const H5Location& loc, const void* ref, H5R_type_t ref_type, const PropList& plist)
 {
-   p_setId(p_dereference(loc.getId(), ref, ref_type, "dereference"));
+   p_setId(p_dereference(loc.getId(), ref, ref_type, plist, "dereference"));
 }
 
 //--------------------------------------------------------------------------
@@ -757,15 +766,16 @@ void H5Location::dereference(const H5Location& loc, const void* ref, H5R_type_t
 ///\param	attr - IN: Attribute specifying the location of the referenced object
 ///\param	ref - IN: Reference pointer
 ///\param	ref_type - IN: Reference type
+///\param	plist - IN: Property list - default to PropList::DEFAULT
 ///\exception	H5::ReferenceException
 // Programmer	Binh-Minh Ribler - Oct, 2006
 // Modification
 //	May, 2008
 //		Corrected missing parameters. - BMR
 //--------------------------------------------------------------------------
-void H5Location::dereference(const Attribute& attr, const void* ref, H5R_type_t ref_type)
+void H5Location::dereference(const Attribute& attr, const void* ref, H5R_type_t ref_type, const PropList& plist)
 {
-   p_setId(p_dereference(attr.getId(), ref, ref_type, "dereference"));
+   p_setId(p_dereference(attr.getId(), ref, ref_type, plist, "dereference"));
 }
 
 #ifndef H5_NO_DEPRECATED_SYMBOLS
@@ -885,7 +895,6 @@ H5O_type_t H5Location::p_get_ref_obj_type(void *ref, H5R_type_t ref_type) const
    return(obj_type);
 }
 
-#endif // DOXYGEN_SHOULD_SKIP_THIS
 
 //--------------------------------------------------------------------------
 // Function:	H5Location::getRegion
@@ -958,6 +967,8 @@ void f_DataSpace_setId(DataSpace* dspace, hid_t new_id)
     dspace->p_setId(new_id);
 }
 
+#endif // DOXYGEN_SHOULD_SKIP_THIS
+
 #ifndef H5_NO_NAMESPACE
 } // end namespace
 #endif
diff --git a/c++/src/H5Location.h b/c++/src/H5Location.h
index 37571c5..9e4ec05 100644
--- a/c++/src/H5Location.h
+++ b/c++/src/H5Location.h
@@ -30,7 +30,8 @@ typedef void (*attr_operator_t)( H5Location& loc/*in*/,
                                  const H5std_string attr_name/*in*/,
                                  void *operator_data/*in,out*/);
 
-class UserData4Aiterate { // user data for attribute iteration
+//! User data for attribute iteration
+class UserData4Aiterate {
    public:
 	attr_operator_t op;
 	void* opData;
@@ -115,7 +116,7 @@ class H5_DLLCPP H5Location : public IdComponent {
 	// in this object.
 	void reference(void* ref, const char* name, 
 			H5R_type_t ref_type = H5R_OBJECT) const;
-	void reference(void* ref, const H5std_string& name, 
+	void reference(void* ref, const H5std_string& name,
 			H5R_type_t ref_type = H5R_OBJECT) const;
 	void reference(void* ref, const char* name, const DataSpace& dataspace,
 			H5R_type_t ref_type = H5R_DATASET_REGION) const;
@@ -124,8 +125,8 @@ class H5_DLLCPP H5Location : public IdComponent {
 
 	// Open a referenced object whose location is specified by either
 	// a file, an HDF5 object, or an attribute.
-	void dereference(const H5Location& loc, const void* ref, H5R_type_t ref_type = H5R_OBJECT);
-	void dereference(const Attribute& attr, const void* ref, H5R_type_t ref_type = H5R_OBJECT);
+	void dereference(const H5Location& loc, const void* ref, H5R_type_t ref_type = H5R_OBJECT, const PropList& plist = PropList::DEFAULT);
+	void dereference(const Attribute& attr, const void* ref, H5R_type_t ref_type = H5R_OBJECT, const PropList& plist = PropList::DEFAULT);
 
 	// Retrieves a dataspace with the region pointed to selected.
 	DataSpace getRegion(void *ref, H5R_type_t ref_type = H5R_DATASET_REGION) const;
@@ -134,10 +135,11 @@ class H5_DLLCPP H5Location : public IdComponent {
 	virtual hid_t getId() const = 0;
 
    protected:
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-	// Default constructor,
+	// Default constructor
 	H5Location();
 
+#ifndef DOXYGEN_SHOULD_SKIP_THIS
+
 	// *** Deprecation warning ***
 	// The following two constructors are no longer appropriate after the
 	// data member "id" had been moved to the sub-classes.
@@ -152,7 +154,7 @@ class H5_DLLCPP H5Location : public IdComponent {
 	void p_reference(void* ref, const char* name, hid_t space_id, H5R_type_t ref_type) const;
 
 	// Dereferences a ref into an HDF5 id.
-	hid_t p_dereference(hid_t loc_id, const void* ref, H5R_type_t ref_type, const char* from_func);
+	hid_t p_dereference(hid_t loc_id, const void* ref, H5R_type_t ref_type, const PropList& plist, const char* from_func);
 
 #ifndef H5_NO_DEPRECATED_SYMBOLS
 	// Retrieves the type of object that an object reference points to.
diff --git a/c++/src/H5OcreatProp.cpp b/c++/src/H5OcreatProp.cpp
index cd7bf0f..635ffe9 100644
--- a/c++/src/H5OcreatProp.cpp
+++ b/c++/src/H5OcreatProp.cpp
@@ -188,6 +188,8 @@ void ObjCreatPropList::setAttrCrtOrder(unsigned crt_order_flags) const
 // Function:	ObjCreatPropList::getAttrCrtOrder
 ///\brief	Gets tracking and indexing settings for attribute
 ///		creation order.
+///\param	crt_order_flags - OUT: Flags specifying whether to track and
+///					index attribute creation order
 ///\exception	H5::PropListIException
 ///\par Description
 ///		When no flag is set, i.e. crt_order_flags = 0, attribute
diff --git a/c++/src/H5VarLenType.h b/c++/src/H5VarLenType.h
index 0a67d12..672b3db 100644
--- a/c++/src/H5VarLenType.h
+++ b/c++/src/H5VarLenType.h
@@ -14,9 +14,6 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-// Class VarLenType inherits from DataType and provides wrappers for
-// the HDF5 C's Variable-length Datatypes.
-
 #ifndef __H5VarLenType_H
 #define __H5VarLenType_H
 
diff --git a/c++/src/Makefile.am b/c++/src/Makefile.am
index 6cd4768..84af348 100644
--- a/c++/src/Makefile.am
+++ b/c++/src/Makefile.am
@@ -28,7 +28,7 @@ AM_CPPFLAGS+=-I$(top_srcdir)/src
 lib_LTLIBRARIES=libhdf5_cpp.la
 
 # Add libtool numbers to the HDF5 C++ library (from config/lt_vers.am)
-libhdf5_cpp_la_LDFLAGS= -version-info $(LT_CXX_VERS_INTERFACE):$(LT_CXX_VERS_REVISION):$(LT_CXX_VERS_AGE) $(AM_LDFLAGS)
+libhdf5_cpp_la_LDFLAGS= -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
 
 bin_SCRIPTS=h5c++
 
diff --git a/c++/src/Makefile.in b/c++/src/Makefile.in
index 466e529..00787f7 100644
--- a/c++/src/Makefile.in
+++ b/c++/src/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -34,7 +34,17 @@
 
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -97,21 +107,21 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/lt_vers.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/h5c++.in $(top_srcdir)/bin/depcomp \
-	$(include_HEADERS) $(top_srcdir)/bin/test-driver
 TESTS =
 subdir = c++/src
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \
+	$(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES = h5c++
 CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
@@ -175,7 +185,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -397,6 +407,11 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/h5c++.in \
+	$(top_srcdir)/bin/depcomp $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am \
+	$(top_srcdir)/config/lt_vers.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -415,7 +430,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -460,14 +474,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -477,13 +499,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -525,9 +546,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -670,33 +702,15 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2
 # See libtool versioning documentation online.
 # After making changes, run bin/reconfigure to update other configure related
 # files like Makefile.in.
-LT_VERS_INTERFACE = 11
-LT_VERS_REVISION = 0
-LT_VERS_AGE = 1
-LT_CXX_VERS_INTERFACE = 11
-LT_CXX_VERS_REVISION = 0
-LT_CXX_VERS_AGE = 0
-LT_F_VERS_INTERFACE = 10
-LT_F_VERS_REVISION = 2
-LT_F_VERS_AGE = 0
-LT_HL_VERS_INTERFACE = 10
-LT_HL_VERS_REVISION = 2
-LT_HL_VERS_AGE = 0
-LT_HL_CXX_VERS_INTERFACE = 11
-LT_HL_CXX_VERS_REVISION = 0
-LT_HL_CXX_VERS_AGE = 0
-LT_HL_F_VERS_INTERFACE = 10
-LT_HL_F_VERS_REVISION = 2
-LT_HL_F_VERS_AGE = 0
-LT_TOOLS_VERS_INTERFACE = 10
-LT_TOOLS_VERS_REVISION = 2
-LT_TOOLS_VERS_AGE = 0
+LT_VERS_INTERFACE = 100
+LT_VERS_REVISION = 900
+LT_VERS_AGE = 0
 
 # This is our main target
 lib_LTLIBRARIES = libhdf5_cpp.la
 
 # Add libtool numbers to the HDF5 C++ library (from config/lt_vers.am)
-libhdf5_cpp_la_LDFLAGS = -version-info $(LT_CXX_VERS_INTERFACE):$(LT_CXX_VERS_REVISION):$(LT_CXX_VERS_AGE) $(AM_LDFLAGS)
+libhdf5_cpp_la_LDFLAGS = -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
 bin_SCRIPTS = h5c++
 
 # Source files for the library
@@ -764,7 +778,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign c++/src/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign c++/src/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -773,7 +786,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/lt_vers.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/lt_vers.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -1024,7 +1037,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1303,6 +1316,8 @@ uninstall-am: uninstall-binSCRIPTS uninstall-includeHEADERS \
 	uninstall-binSCRIPTS uninstall-includeHEADERS \
 	uninstall-libLTLIBRARIES
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/c++/src/cpp_doc_config b/c++/src/cpp_doc_config
index 6b2ee51..69f4d12 100644
--- a/c++/src/cpp_doc_config
+++ b/c++/src/cpp_doc_config
@@ -38,7 +38,7 @@ PROJECT_NAME           = "HDF5 C++ API"
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = "1.8.16"
+PROJECT_NUMBER         = "1.10.0-alpha0 currently under development"
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
diff --git a/c++/test/Makefile.in b/c++/test/Makefile.in
index 8711eef..0baf827 100644
--- a/c++/test/Makefile.in
+++ b/c++/test/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -31,7 +31,17 @@
 # HDF5-C++ Makefile(.in)
 #
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -94,21 +104,21 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/H5srcdir_str.h.in $(top_srcdir)/bin/depcomp \
-	$(top_srcdir)/bin/test-driver
 check_PROGRAMS = $(am__EXEEXT_1)
 TESTS = $(am__EXEEXT_1)
 subdir = c++/test
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES = H5srcdir_str.h
 CONFIG_CLEAN_VPATH_FILES =
 am__EXEEXT_1 = testhdf5$(EXEEXT)
@@ -136,7 +146,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -386,6 +396,10 @@ am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
 TEST_LOGS = $(am__test_logs2:.sh.log=.log)
 SH_LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
 SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/H5srcdir_str.h.in $(srcdir)/Makefile.in \
+	$(top_srcdir)/bin/depcomp $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -405,7 +419,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -450,14 +463,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -467,13 +488,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -515,9 +535,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -708,7 +739,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign c++/test/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign c++/test/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -717,7 +747,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -873,7 +903,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1151,6 +1181,8 @@ uninstall-am:
 	mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/c++/test/tattr.cpp b/c++/test/tattr.cpp
index 0fefe22..936ee63 100644
--- a/c++/test/tattr.cpp
+++ b/c++/test/tattr.cpp
@@ -1132,7 +1132,6 @@ static void test_attr_mult_read()
 static void test_attr_delete()
 {
     H5std_string  attr_name; // Buffer for attribute names
-    int ii;
 
     // Output message about test being performed
     SUBTEST("Removing Attribute Function");
@@ -1771,7 +1770,6 @@ extern "C"
 void test_attr()
 {
     // Output message about test being performed
-    //MESSAGE("Testing Attributes\n");
     MESSAGE(5, ("Testing Attributes\n"));
 
     try
@@ -1796,7 +1794,7 @@ void test_attr()
         // use_shared test
 
         // Loop over using new group format
-        hbool_t new_format;
+        unsigned new_format;
         for (new_format = FALSE; new_format <= TRUE; new_format++)
         {
             FileAccPropList curr_fapl;
diff --git a/c++/test/tcompound.cpp b/c++/test/tcompound.cpp
index de4a9b8..dbf2f0c 100644
--- a/c++/test/tcompound.cpp
+++ b/c++/test/tcompound.cpp
@@ -122,9 +122,9 @@ static void test_compound_2()
     SUBTEST("Compound Element Reordering");
     try {
 	// Sizes should be the same, but be careful just in case
-	buf = (unsigned char*)malloc(nelmts * MAX(sizeof(src_typ_t), sizeof(dst_typ_t)));
-	bkg = (unsigned char*)malloc(nelmts * sizeof(dst_typ_t));
-	orig = (unsigned char*)malloc(nelmts * sizeof(src_typ_t));
+	buf = (unsigned char*)HDmalloc(nelmts * MAX(sizeof(src_typ_t), sizeof(dst_typ_t)));
+	bkg = (unsigned char*)HDmalloc(nelmts * sizeof(dst_typ_t));
+	orig = (unsigned char*)HDmalloc(nelmts * sizeof(src_typ_t));
 	for (i=0; i<nelmts; i++) {
 	    s_ptr = ((src_typ_t*)orig) + i;
 	    s_ptr->a    = i*8+0;
@@ -190,9 +190,9 @@ static void test_compound_2()
 	    }
     	}
 	// Release resources
-	free(buf);
-	free(bkg);
-	free(orig);
+	HDfree(buf);
+	HDfree(bkg);
+	HDfree(orig);
 	s_ptr = NULL;
 	d_ptr = NULL;
 	st.close();
@@ -247,9 +247,9 @@ static void test_compound_3()
     SUBTEST("Compound Datatype Subset Conversions");
     try {
 	/* Initialize */
-	buf = (unsigned char*)malloc(nelmts * MAX(sizeof(src_typ_t), sizeof(dst_typ_t)));
-	bkg = (unsigned char*)malloc(nelmts * sizeof(dst_typ_t));
-	orig = (unsigned char*)malloc(nelmts * sizeof(src_typ_t));
+	buf = (unsigned char*)HDmalloc(nelmts * MAX(sizeof(src_typ_t), sizeof(dst_typ_t)));
+	bkg = (unsigned char*)HDmalloc(nelmts * sizeof(dst_typ_t));
+	orig = (unsigned char*)HDmalloc(nelmts * sizeof(src_typ_t));
 	for (i=0; i<nelmts; i++) {
 	    s_ptr = ((src_typ_t*)orig) + i;
 	    s_ptr->a    = i*8+0;
@@ -312,9 +312,9 @@ static void test_compound_3()
 	} // for
 
 	/* Release resources */
-	free(buf);
-	free(bkg);
-	free(orig);
+	HDfree(buf);
+	HDfree(bkg);
+	HDfree(orig);
 	s_ptr = NULL;
 	d_ptr = NULL;
 	st.close();
@@ -374,9 +374,9 @@ static void test_compound_4()
     SUBTEST("Compound Element Shrinking & Reordering");
     try {
 	/* Sizes should be the same, but be careful just in case */
-	buf = (unsigned char*)malloc(nelmts * MAX(sizeof(src_typ_t), sizeof(dst_typ_t)));
-	bkg = (unsigned char*)malloc(nelmts * sizeof(dst_typ_t));
-	orig = (unsigned char*)malloc(nelmts * sizeof(src_typ_t));
+	buf = (unsigned char*)HDmalloc(nelmts * MAX(sizeof(src_typ_t), sizeof(dst_typ_t)));
+	bkg = (unsigned char*)HDmalloc(nelmts * sizeof(dst_typ_t));
+	orig = (unsigned char*)HDmalloc(nelmts * sizeof(src_typ_t));
 	for (i=0; i<nelmts; i++) {
 	    s_ptr = ((src_typ_t*)orig) + i;
 	    s_ptr->a    = i*8+0;
@@ -444,9 +444,9 @@ static void test_compound_4()
 	} // for
 
 	/* Release resources */
-	free(buf);
-	free(bkg);
-	free(orig);
+	HDfree(buf);
+	HDfree(bkg);
+	HDfree(orig);
 	s_ptr = NULL;
 	d_ptr = NULL;
 	st.close();
@@ -499,8 +499,8 @@ static void test_compound_5()
     src_typ_t  src[2] = {{"one", 102, {104, 105, 106, 107}},
                           {"two", 202, {204, 205, 206, 207}}};
     dst_typ_t  *dst;
-    void        *buf = calloc(2, sizeof(dst_typ_t));
-    void        *bkg = calloc(2, sizeof(dst_typ_t));
+    void        *buf = HDcalloc(2, sizeof(dst_typ_t));
+    void        *bkg = HDcalloc(2, sizeof(dst_typ_t));
     ArrayType* array_dt = NULL;
 
     // Output message about test being performed
@@ -552,8 +552,8 @@ static void test_compound_5()
 	{ H5_FAILED(); }
 
 	/* Free memory buffers */
-	free(buf);
-	free(bkg);
+	HDfree(buf);
+	HDfree(bkg);
 	dst = NULL;
 	PASSED();
     }   // end of try block
@@ -606,9 +606,9 @@ static void test_compound_6()
     SUBTEST("Compound Element Growing");
     try {
 	/* Sizes should be the same, but be careful just in case */
-	buf = (unsigned char*)malloc(nelmts * MAX(sizeof(src_typ_t), sizeof(dst_typ_t)));
-	bkg = (unsigned char*)malloc(nelmts * sizeof(dst_typ_t));
-	orig = (unsigned char*)malloc(nelmts * sizeof(src_typ_t));
+	buf = (unsigned char*)HDmalloc(nelmts * MAX(sizeof(src_typ_t), sizeof(dst_typ_t)));
+	bkg = (unsigned char*)HDmalloc(nelmts * sizeof(dst_typ_t));
+	orig = (unsigned char*)HDmalloc(nelmts * sizeof(src_typ_t));
 	for (i=0; i<nelmts; i++) {
 	    s_ptr = ((src_typ_t*)orig) + i;
 	    s_ptr->b    = (i*8+1) & 0x7fff;
@@ -645,9 +645,9 @@ static void test_compound_6()
 	} // for
 
 	/* Release resources */
-	free(buf);
-	free(bkg);
-	free(orig);
+	HDfree(buf);
+	HDfree(bkg);
+	HDfree(orig);
 	s_ptr = NULL;
 	d_ptr = NULL;
 	st.close();
@@ -837,7 +837,6 @@ extern "C"
 void test_compound()
 {
     // Output message about test being performed
-    //MESSAGE("Testing Compound Data Type operations\n");
     MESSAGE(5, ("Testing Compound Data Type operations\n"));
 
     test_compound_1();	// various things about compound data types
diff --git a/c++/test/testhdf5.cpp b/c++/test/testhdf5.cpp
index 19b4f0d..59b16cf 100644
--- a/c++/test/testhdf5.cpp
+++ b/c++/test/testhdf5.cpp
@@ -134,3 +134,4 @@ Comment out tests that are not done yet */
 
     return (GetTestNumErrs());
 }
+
diff --git a/c++/test/tfile.cpp b/c++/test/tfile.cpp
index 78b3611..6871f06 100644
--- a/c++/test/tfile.cpp
+++ b/c++/test/tfile.cpp
@@ -108,7 +108,7 @@ static void test_file_create()
 	// Create file FILE1
 	file1 = new H5File (FILE1, H5F_ACC_EXCL);
 
-	// try to create the same file with H5F_ACC_TRUNC. This should fail
+	// Try to create the same file with H5F_ACC_TRUNC. This should fail
 	// because file1 is the same file and is currently open.
 	try {
 	    H5File file2 (FILE1, H5F_ACC_TRUNC);  // should throw E
@@ -732,7 +732,7 @@ static void test_libver_bounds()
 
     /* Run the tests */
     test_libver_bounds_real(H5F_LIBVER_EARLIEST, H5O_VERSION_1, H5F_LIBVER_LATEST, H5O_VERSION_2);
-    test_libver_bounds_real(H5F_LIBVER_LATEST, H5O_VERSION_2, H5F_LIBVER_EARLIEST, H5O_VERSION_1);
+    test_libver_bounds_real(H5F_LIBVER_LATEST, H5O_VERSION_2, H5F_LIBVER_EARLIEST, H5O_VERSION_2);
     PASSED();
 } /* end test_libver_bounds() */
 

diff --git a/c++/test/th5s.h5 b/c++/test/th5s.h5
index 7a0bfb3..bc2b666 100644
Binary files a/c++/test/th5s.h5 and b/c++/test/th5s.h5 differ
diff --git a/c++/test/tlinks.cpp b/c++/test/tlinks.cpp
index 33d10ea..57738d7 100644
--- a/c++/test/tlinks.cpp
+++ b/c++/test/tlinks.cpp
@@ -47,7 +47,7 @@
  * This file needs to access private information from the H5G package.
  * This file also needs to access the group testing code.
  */
-//#define H5G_PACKAGE
+//#define H5G_FRIEND
 //#define H5G_TESTING
 
 //#include "h5test.h"
@@ -466,7 +466,7 @@ extern "C"
 void test_links()
 {
     hid_t	fapl_id, fapl2_id;    /* File access property lists */
-    hbool_t new_format;     /* Whether to use the new format or not */
+    unsigned new_format;     /* Whether to use the new format or not */
     const char  *envval;
 
     envval = HDgetenv("HDF5_DRIVER");
@@ -622,7 +622,7 @@ void test_links()
 	/* Close 2nd FAPL */
 	H5Pclose(fapl2_id);
 
-	h5_cleanup(FILENAME, fapl_id);
+	h5_clean_files(FILENAME, fapl_id);
 
 	/* Test that external links can be used after a library reset.  MUST be
 	* called last so the reset doesn't interfere with the property lists.  This
diff --git a/c++/test/trefer.cpp b/c++/test/trefer.cpp
index 0331c8d..9d072be 100644
--- a/c++/test/trefer.cpp
+++ b/c++/test/trefer.cpp
@@ -35,17 +35,13 @@
 
 #include "h5cpputil.h"  // C++ utilility header file
 
-// File names
 const H5std_string      FILE1("trefer1.h5");
 const H5std_string      FILE2("trefer2.h5");
 
-// Dataset and datatype names
+// Dataset 1
 const H5std_string      DSET1_NAME("Dataset1");
 const H5std_string      DSET2_NAME("Dataset2");
-const H5std_string      DSET3_NAME("Dataset3");
-const H5std_string      DTYPE_NAME("Datatype1");
 
-// Compound type member names
 const H5std_string MEMBER1( "a_name" );
 const H5std_string MEMBER2( "b_name" );
 const H5std_string MEMBER3( "c_name" );
@@ -122,7 +118,7 @@ test_reference_params(void)
 	dataset.close();
 
 	// Create another dataset (inside /Group1)
-	dataset = group.createDataSet(DSET2_NAME, PredType::NATIVE_UCHAR, sid1);
+	dataset = group.createDataSet("Dataset2", PredType::NATIVE_UCHAR, sid1);
 
 	// Close Dataset
 	dataset.close();
@@ -136,14 +132,14 @@ test_reference_params(void)
 	dtype1.insertMember(MEMBER3, HOFFSET(s1_t, c), PredType::NATIVE_FLOAT);
 
 	// Save datatype for later
-	dtype1.commit(group, DTYPE_NAME);
+	dtype1.commit(group, "Datatype1");
 
 	// Close datatype and group
 	dtype1.close();
 	group.close();
 
 	// Create a dataset
-	dataset = file1->createDataSet(DSET3_NAME, PredType::STD_REF_OBJ, sid1);
+	dataset = file1->createDataSet("Dataset3", PredType::STD_REF_OBJ, sid1);
 
 	/* Test parameters to H5Location::reference */
 	try {
@@ -216,6 +212,9 @@ static void test_reference_obj(void)
 	hsize_t	dims1[] = {SPACE1_DIM1};
 	DataSpace sid1(SPACE1_RANK, dims1);
 
+	// Create dataset access property list
+	PropList dapl(H5P_DATASET_ACCESS);
+
 	// Create a group
 	Group group = file1->createGroup("Group1");
 
@@ -236,7 +235,7 @@ static void test_reference_obj(void)
 	dataset.close();
 
 	// Create another dataset (inside /Group1)
-	dataset = group.createDataSet(DSET2_NAME, PredType::NATIVE_UCHAR, sid1);
+	dataset = group.createDataSet("Dataset2", PredType::NATIVE_UCHAR, sid1);
 
 	// Close Dataset
 	dataset.close();
@@ -250,14 +249,14 @@ static void test_reference_obj(void)
 	dtype1.insertMember(MEMBER3, HOFFSET(s1_t, c), PredType::NATIVE_FLOAT);
 
 	// Save datatype for later
-	dtype1.commit(group, DTYPE_NAME);
+	dtype1.commit(group, "Datatype1");
 
 	// Close datatype and group
 	dtype1.close();
 	group.close();
 
 	// Create a dataset
-	dataset = file1->createDataSet(DSET3_NAME, PredType::STD_REF_OBJ, sid1);
+	dataset = file1->createDataSet("Dataset3", PredType::STD_REF_OBJ, sid1);
 
 	// Create reference to dataset and test getRefObjType
 	file1->reference(&wbuf[0], "/Group1/Dataset1");
@@ -291,14 +290,14 @@ static void test_reference_obj(void)
 	file1 = new H5File(FILE1, H5F_ACC_RDWR);
 
 	// Open the dataset
-	dataset = file1->openDataSet(DSET3_NAME);
+	dataset = file1->openDataSet("/Dataset3");
 
 	// Read selection from disk
 	dataset.read(rbuf, PredType::STD_REF_OBJ);
 
 	// Dereference dataset object by ctor, from the location where
 	// 'dataset' is located
-	DataSet dset2(dataset, &rbuf[0], H5R_OBJECT);
+	DataSet dset2(dataset, &rbuf[0], H5R_OBJECT, dapl);
 
 	// Check information in the referenced dataset
 	sid1 = dset2.getSpace();
@@ -540,6 +539,9 @@ test_reference_region_1D(void)
 	hsize_t	dims3[] = {SPACE3_DIM1};
 	DataSpace sid3(SPACE3_RANK, dims3);
 
+	// Create dataset access property list
+	PropList dapl(H5P_DATASET_ACCESS);
+
 	// Create a dataset
 	DataSet dset3 = file1.createDataSet(DSET2_NAME, PredType::STD_U8LE, sid3);
 
@@ -629,7 +631,7 @@ test_reference_region_1D(void)
 	dset1.read(rbuf, PredType::STD_REF_DSETREG);
 
 	{ // Test DataSet::dereference
-	    dset3.dereference(dset1, &rbuf[0], H5R_DATASET_REGION);
+	    dset3.dereference(dset1, &rbuf[0], H5R_DATASET_REGION, dapl);
 
 	    // Get and verify object type
 	    obj_type = dset1.getRefObjType(&rbuf[0], H5R_DATASET_REGION);
@@ -644,7 +646,7 @@ test_reference_region_1D(void)
 	{ // Test DataSet constructor -by dereference
 	    // Dereference dataset object by ctor, from the location where
 	    // 'dset1' is located
-	    DataSet newds(dset1, &rbuf[0], H5R_DATASET_REGION);
+	    DataSet newds(dset1, &rbuf[0], H5R_DATASET_REGION, dapl);
 
 	    // Get dataspace of newds then verify number of elements
 	    sid1 = newds.getSpace();
@@ -808,7 +810,6 @@ extern "C"
 void test_reference(void)
 {
     // Output message about test being performed
-    //MESSAGE("Testing References\n");
     MESSAGE(5, ("Testing References\n"));
 
     test_reference_params();    // Test basic parameters of reference functionality
diff --git a/c++/test/ttypes.cpp b/c++/test/ttypes.cpp
index 9f85613..aae5d86 100644
--- a/c++/test/ttypes.cpp
+++ b/c++/test/ttypes.cpp
@@ -57,12 +57,14 @@
 
 /* Alignment test stuff */
 #ifdef TEST_ALIGNMENT
-#define H5T_PACKAGE
+#define H5T_FRIEND
 #include "H5Tpkg.h"
 #endif
 #define SET_ALIGNMENT(TYPE,VAL) \
     H5T_NATIVE_##TYPE##_ALIGN_g=MAX(H5T_NATIVE_##TYPE##_ALIGN_g, VAL)
 #endif
+ /* #include "H5Tpkg.h"
+ */ 
 
 const char *FILENAME[] = {
     "dtypes1.h5",
@@ -145,6 +147,7 @@ static void test_classes()
  */
 static void test_copy()
 {
+
     SUBTEST("DataType::copy() and DataType::operator=");
     try {
 	// Test copying from a predefined datatype using DataType::operator=
diff --git a/config/cmake/CTestCustom.cmake b/config/cmake/CTestCustom.cmake
index 8d80f19..41cb488 100644
--- a/config/cmake/CTestCustom.cmake
+++ b/config/cmake/CTestCustom.cmake
@@ -2,18 +2,18 @@ set (CTEST_CUSTOM_MAXIMUM_NUMBER_OF_WARNINGS 3000)
  
 set (CTEST_CUSTOM_WARNING_EXCEPTION
     ${CTEST_CUSTOM_WARNING_EXCEPTION}
-    "H5detect.c.[0-9]+.[ \t]*:[ \t]*warning C4090:"
-    "H5detect.c.[0-9]+.[ \t]*:[ \t]*warning:[ \t]*passing argument"
-    "H5detect.c[0-9 \t:]*warning:[ \t]*passing argument"
-    "note.*expected.*void.*but argument is of type.*volatile"
-    "H5Tconv.c[0-9 \t:]*warning:[ \t]*comparison is always false due to limited range of data type"
-    "H5Ztrans.c.[0-9]+.[ \t]*:[ \t]*warning C4244"
-    "SZIP.src.*:[ \t]*warning"
-    "POSIX name for this item is deprecated"
+#    "H5detect.c.[0-9]+.[ \t]*:[ \t]*warning C4090:"
+#    "H5detect.c.[0-9]+.[ \t]*:[ \t]*warning:[ \t]*passing argument"
+#    "H5detect.c[0-9 \t:]*warning:[ \t]*passing argument"
+#    "note.*expected.*void.*but argument is of type.*volatile"
+#    "H5Tconv.c[0-9 \t:]*warning:[ \t]*comparison is always false due to limited range of data type"
+#    "H5Ztrans.c.[0-9]+.[ \t]*:[ \t]*warning C4244"
+#    "SZIP.src.*:[ \t]*warning"
+#    "POSIX name for this item is deprecated"
     "disabling jobserver mode"
     "config.cmake.xlatefile.c"
-    "warning.*implicit declaration of function"
-    "note: expanded from macro"
+#    "warning.*implicit declaration of function"
+#    "note: expanded from macro"
 #    "fpp:[ \t]*warning:[ \t]*cannot remove H5_DEBUG_API - not a predefined macro"
 )
  
diff --git a/config/cmake/ConfigureChecks.cmake b/config/cmake/ConfigureChecks.cmake
index 09f1caf..8bd6f45 100644
--- a/config/cmake/ConfigureChecks.cmake
+++ b/config/cmake/ConfigureChecks.cmake
@@ -126,7 +126,7 @@ endif (NOT WINDOWS)
 #  Check if Direct I/O driver works
 #-----------------------------------------------------------------------------
 if (NOT WINDOWS)
-  option (HDF5_ENABLE_DIRECT_VFD "Build the Direct I/O Virtual File Driver" ON)
+  option (HDF5_ENABLE_DIRECT_VFD "Build the Direct I/O Virtual File Driver" OFF)
   if (HDF5_ENABLE_DIRECT_VFD)
     set (msg "Performing TEST_DIRECT_VFD_WORKS")
     set (MACRO_CHECK_FUNCTION_DEFINITIONS "-DTEST_DIRECT_VFD_WORKS -D_GNU_SOURCE ${CMAKE_REQUIRED_FLAGS}")
@@ -158,6 +158,17 @@ if (NOT WINDOWS)
   endif (HDF5_ENABLE_DIRECT_VFD)
 endif (NOT WINDOWS)
 
+#-----------------------------------------------------------------------------
+# Check if C has __float128 extension
+#-----------------------------------------------------------------------------
+
+CHECK_TYPE_SIZE("__float128" SIZEOF___FLOAT128)
+if(${HAVE_SIZEOF___FLOAT128})
+  SET(H5_HAVE_FLOAT128 1)
+else (${HAVE_SIZEOF___FLOAT128})
+  SET(H5_HAVE_FLOAT128 0)
+  SET(SIZEOF___FLOAT128 0)
+endif(${HAVE_SIZEOF___FLOAT128})
 
 #-----------------------------------------------------------------------------
 # Macro to determine the various conversion capabilities
diff --git a/config/cmake/H5pubconf.h.in b/config/cmake/H5pubconf.h.in
index 13740ea..ce8219f 100644
--- a/config/cmake/H5pubconf.h.in
+++ b/config/cmake/H5pubconf.h.in
@@ -45,6 +45,18 @@
 /* As FC_FUNC, but for C identifiers containing underscores. */
 #define @H5_FC_FUNC_@
 
+/* Define Fortran Maximum Real Decimal Precision */
+#cmakedefine H5_PAC_FC_MAX_REAL_PRECISION @H5_PAC_FC_MAX_REAL_PRECISION@
+
+/* Define C Maximum Real Decimal Precision */
+#cmakedefine H5_PAC_C_MAX_REAL_PRECISION @H5_PAC_C_MAX_REAL_PRECISION@
+
+/* Define if we have Fortran C_LONG_DOUBLE */
+#cmakedefine H5_FORTRAN_HAVE_C_LONG_DOUBLE @H5_FORTRAN_HAVE_C_LONG_DOUBLE@
+
+/* Determine if __float128 is available */
+#cmakedefine H5_HAVE_FLOAT128 @H5_HAVE_FLOAT128@
+
 /* Define to 1 if you have the `alarm' function. */
 #cmakedefine H5_HAVE_ALARM @H5_HAVE_ALARM@
 
@@ -88,6 +100,9 @@
 /* Define if library information should be embedded in the executables */
 #cmakedefine H5_HAVE_EMBEDDED_LIBINFO @H5_HAVE_EMBEDDED_LIBINFO@
 
+/* Define to 1 if you have the `fcntl' function. */
+#cmakedefine H5_HAVE_FCNTL @H5_HAVE_FCNTL@
+
 /* Define to 1 if you have the <features.h> header file. */
 #cmakedefine H5_HAVE_FEATURES_H @H5_HAVE_FEATURES_H@
 
@@ -97,6 +112,9 @@
 /* Define if support for szip filter is enabled */
 #cmakedefine H5_HAVE_FILTER_SZIP @H5_HAVE_FILTER_SZIP@
 
+/* Define to 1 if you have the `flock' function. */
+#cmakedefine H5_HAVE_FLOCK @H5_HAVE_FLOCK@
+
 /* Define to 1 if you have the `fork' function. */
 #cmakedefine H5_HAVE_FORK @H5_HAVE_FORK@
 
@@ -560,6 +578,12 @@
 /* The size of `__int64', as computed by sizeof. */
 #define H5_SIZEOF___INT64 @H5_SIZEOF___INT64@
 
+/* Define to 1 if you have the <stdbool.h> header file. */
+#cmakedefine H5_HAVE_STDBOOL_H @H5_HAVE_STDBOOL_H@
+
+/* The size of `bool', as computed by sizeof. */
+#cmakedefine H5_SIZEOF_BOOL @H5_SIZEOF_BOOL@
+
 /* Define to 1 if you have the ANSI C header files. */
 #cmakedefine H5_STDC_HEADERS @H5_STDC_HEADERS@
 
@@ -576,6 +600,9 @@
 /* Define using v1.6 public API symbols by default */
 #cmakedefine H5_USE_16_API_DEFAULT @H5_USE_16_API_DEFAULT@
 
+/* Define using v1.8 public API symbols by default */
+#cmakedefine H5_USE_18_API_DEFAULT @H5_USE_18_API_DEFAULT@
+
 /* Define if a memory checking tool will be used on the library, to cause
    library to be very picky about memory operations and also disable the
    internal free list manager code. */
diff --git a/config/cmake/HDF518_Examples.cmake.in b/config/cmake/HDF518_Examples.cmake.in
index 0e3b26d..1be5c65 100644
--- a/config/cmake/HDF518_Examples.cmake.in
+++ b/config/cmake/HDF518_Examples.cmake.in
@@ -153,8 +153,17 @@ ctest_read_custom_files ("${CTEST_BINARY_DIRECTORY}")
 ## --------------------------
 ctest_start (Experimental)
 ctest_configure (BUILD "${CTEST_BINARY_DIRECTORY}")
+if(LOCAL_SUBMIT)
+  ctest_submit (PARTS Configure Notes)
+endif()
 ctest_build (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND)
+if(LOCAL_SUBMIT)
+  ctest_submit (PARTS Build)
+endif()
 ctest_test (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND ${ctest_test_args} RETURN_VALUE res)
+if(LOCAL_SUBMIT)
+  ctest_submit (PARTS Test)
+endif()
 if(res GREATER 0)
   message (FATAL_ERROR "tests FAILED")
 endif()
diff --git a/config/cmake/HDF5Macros.cmake b/config/cmake/HDF5Macros.cmake
index d88e672..bd86f34 100644
--- a/config/cmake/HDF5Macros.cmake
+++ b/config/cmake/HDF5Macros.cmake
@@ -1,13 +1,7 @@
 #-------------------------------------------------------------------------------
 macro (H5_SET_LIB_OPTIONS libtarget libname libtype)
   set (LIB_OUT_NAME "${libname}")
-  # SOVERSION passed in ARGN when shared
   if (${libtype} MATCHES "SHARED")
-    if (ARGN)
-      set (PACKAGE_SOVERSION ${ARGN})
-    else (ARGN)
-      set (PACKAGE_SOVERSION ${HDF5_PACKAGE_SOVERSION})
-    endif (ARGN)
     if (WIN32)
       set (LIBHDF_VERSION ${HDF5_PACKAGE_VERSION_MAJOR})
     else (WIN32)
@@ -15,9 +9,9 @@ macro (H5_SET_LIB_OPTIONS libtarget libname libtype)
     endif (WIN32)
     set_target_properties (${libtarget} PROPERTIES VERSION ${LIBHDF_VERSION})
     if (WIN32)
-        set (${LIB_OUT_NAME} "${LIB_OUT_NAME}-${PACKAGE_SOVERSION}")
+        set (${LIB_OUT_NAME} "${LIB_OUT_NAME}-${HDF5_PACKAGE_SOVERSION}")
     else (WIN32)
-        set_target_properties (${libtarget} PROPERTIES SOVERSION ${PACKAGE_SOVERSION})
+        set_target_properties (${libtarget} PROPERTIES SOVERSION ${HDF5_PACKAGE_SOVERSION})
     endif (WIN32)
   endif (${libtype} MATCHES "SHARED")
   HDF_SET_LIB_OPTIONS (${libtarget} ${LIB_OUT_NAME} ${libtype})
@@ -45,5 +39,4 @@ macro (H5_SET_LIB_OPTIONS libtarget libname libtype)
       endif (${libtype} MATCHES "SHARED")
     endif (HDF5_BUILD_FRAMEWORKS)
   endif (APPLE)
-
 endmacro (H5_SET_LIB_OPTIONS)
diff --git a/config/cmake/HDF5UseFortran.cmake b/config/cmake/HDF5UseFortran.cmake
new file mode 100644
index 0000000..c3e5a24
--- /dev/null
+++ b/config/cmake/HDF5UseFortran.cmake
@@ -0,0 +1,489 @@
+
+## Check for non-standard extenstion quadmath.h
+
+CHECK_INCLUDE_FILES(quadmath.h C_HAVE_QUADMATH)
+
+if (${C_HAVE_QUADMATH})
+  set(HAVE_QUADMATH 1)
+else ()
+  set(HAVE_QUADMATH 0)
+endif()
+
+#
+# This file provides functions for HDF5 specific Fortran support.
+#
+#-------------------------------------------------------------------------------
+ENABLE_LANGUAGE (Fortran)
+
+# The provided CMake Fortran macros don't provide a general compile/run function
+# so this one is used.
+#-----------------------------------------------------------------------------
+MACRO (FORTRAN_RUN FUNCTION CODE RUN_RESULT_VAR1 COMPILE_RESULT_VAR RETURN)
+# MSB CHECK WHY THIS CHECK?
+#  if (NOT DEFINED ${RUN_RESULT_VAR}) 
+    message (STATUS "Detecting Fortran ${FUNCTION}")
+    if (CMAKE_REQUIRED_LIBRARIES)
+      set (CHECK_FUNCTION_EXISTS_ADD_LIBRARIES
+          "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
+    else (CMAKE_REQUIRED_LIBRARIES)
+      set (CHECK_FUNCTION_EXISTS_ADD_LIBRARIES)
+    endif (CMAKE_REQUIRED_LIBRARIES)
+    file (WRITE
+        ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testFortranCompiler1.f90
+        "${CODE}"
+    )
+    TRY_RUN (RUN_RESULT_VAR COMPILE_RESULT_VAR
+        ${CMAKE_BINARY_DIR}
+        ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testFortranCompiler1.f90
+        CMAKE_FLAGS "${CHECK_FUNCTION_EXISTS_ADD_LIBRARIES}"
+        RUN_OUTPUT_VARIABLE OUTPUT
+    )
+
+	
+
+    set(${RETURN} ${OUTPUT})
+	
+    #message ( "Test result1 ${RETURN} ")
+    #message ( "Test result3 ${RESULT} ")
+    #message ( "Test result2 ${CMAKE_MATCH_0} ")
+    #message ( "Test result4 ${CMAKE_MATCH_1} ")
+    #message ( "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ")
+    #message ( "Test result2 ${COMPILE_RESULT_VAR} ")
+    #message ( "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ")
+    #message ( "Test result1 ${RUN_RESULT_VAR} ")
+    #message ( "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ")
+
+    if (${COMPILE_RESULT_VAR})
+      if (${RUN_RESULT_VAR} MATCHES 0)
+        message (STATUS "Testing Fortran ${FUNCTION} - OK")
+        file (APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
+          "Determining if the Fortran ${FUNCTION} exists passed with the following output:\n"
+          "${OUTPUT}\n\n"
+        )
+      else ()
+        message (STATUS "Testing Fortran ${FUNCTION} - Fail")
+        file (APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
+          "Determining if the Fortran ${FUNCTION} exists failed with the following output:\n"
+          "${OUTPUT}\n\n")
+      endif ()
+    endif ()
+#  endif (NOT DEFINED ${RUN_RESULT_VAR})
+ENDMACRO (FORTRAN_RUN)
+
+#-----------------------------------------------------------------------------
+#  Check to see C_LONG_DOUBLE is available
+CHECK_FORTRAN_FEATURE(c_long_double
+  "
+       PROGRAM main
+         USE ISO_C_BINDING
+         REAL(KIND=C_LONG_DOUBLE) :: d
+       END PROGRAM
+  "
+  FORTRAN_HAVE_C_LONG_DOUBLE
+)
+if (${FORTRAN_HAVE_C_LONG_DOUBLE})
+  set(FORTRAN_HAVE_C_LONG_DOUBLE 1)
+else ()
+  set(FORTRAN_HAVE_C_LONG_DOUBLE 0)
+endif()
+
+# Check to see C_LONG_DOUBLE is different from C_DOUBLE
+
+CHECK_FORTRAN_FEATURE(c_long_double
+  "
+     MODULE type_mod
+       USE ISO_C_BINDING
+       INTERFACE h5t	
+         MODULE PROCEDURE h5t_c_double
+         MODULE PROCEDURE h5t_c_long_double
+       END INTERFACE
+     CONTAINS
+       SUBROUTINE h5t_c_double(r)
+         REAL(KIND=C_DOUBLE) :: r
+       END SUBROUTINE h5t_c_double
+       SUBROUTINE h5t_c_long_double(d)
+         REAL(KIND=C_LONG_DOUBLE) :: d
+       END SUBROUTINE h5t_c_long_double
+     END MODULE type_mod
+     PROGRAM main
+       USE ISO_C_BINDING
+       USE type_mod
+       REAL(KIND=C_DOUBLE)      :: r
+       REAL(KIND=C_LONG_DOUBLE) :: d
+       CALL h5t(r)
+       CALL h5t(d)
+     END PROGRAM main
+  "
+  FORTRAN_C_LONG_DOUBLE_IS_UNIQUE
+)
+if (${FORTRAN_C_LONG_DOUBLE_IS_UNIQUE})
+  set(FORTRAN_C_LONG_DOUBLE_IS_UNIQUE 1)
+else ()
+  set(FORTRAN_C_LONG_DOUBLE_IS_UNIQUE 0)
+endif()
+
+## Set the sizeof function for use later in the fortran tests
+if(FORTRAN_HAVE_STORAGE_SIZE)
+  set(FC_SIZEOF_A "STORAGE_SIZE(a, c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)")
+  set(FC_SIZEOF_B "STORAGE_SIZE(b, c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)")
+  set(FC_SIZEOF_C "STORAGE_SIZE(c, c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)")
+elseif(FORTRAN_HAVE_C_SIZEOF)
+  set(FC_SIZEOF_A "SIZEOF(a)")
+  set(FC_SIZEOF_B "SIZEOF(b)")
+  set(FC_SIZEOF_C "SIZEOF(c)")
+else(FORTRAN_HAVE_STORAGE_SIZE)
+  message (FATAL_ERROR "Fortran compiler requires either intrinsic functions SIZEOF or STORAGE_SIZE")
+endif(FORTRAN_HAVE_STORAGE_SIZE)
+
+#-----------------------------------------------------------------------------
+# Determine the available KINDs for REALs and INTEGERs
+#-----------------------------------------------------------------------------
+
+FORTRAN_RUN("REAL and INTEGER KINDs"
+  "  
+       PROGRAM main
+           IMPLICIT NONE
+           INTEGER :: ik, k, lastkind, max_decimal_prec
+	   INTEGER :: num_rkinds, num_ikinds
+           num_ikinds = 0
+           lastkind=SELECTED_INT_KIND(1)
+           ! Find integer KINDs
+           DO ik=2,36
+                k = SELECTED_INT_KIND(ik)
+                IF (k .NE. lastkind) THEN
+	             num_ikinds = num_ikinds + 1	
+                     WRITE(*,'(I0)',ADVANCE='NO') lastkind
+                     lastkind = k
+             	     IF(k.GT.0) WRITE(*,'(A)',ADVANCE='NO') ','	
+                ENDIF
+                IF (k .LE. 0) EXIT
+           ENDDO
+      	   IF (lastkind.NE.-1) THEN
+	      num_ikinds = num_ikinds + 1	
+              WRITE(*,'(I0)') lastkind
+	   ELSE
+              WRITE(*,'()')
+           ENDIF
+           ! Find real KINDs
+           num_rkinds = 0
+           lastkind=SELECTED_REAL_KIND(1)
+	   max_decimal_prec = 1
+           DO ik=2,36
+                k = SELECTED_REAL_KIND(ik)
+                IF (k .NE. lastkind) THEN
+                     num_rkinds = num_rkinds + 1
+                     WRITE(*,'(I0)',ADVANCE='NO') lastkind
+                     lastkind = k
+             	     IF(k.GT.0) WRITE(*,'(A)',ADVANCE='NO') ','
+	             max_decimal_prec = ik
+                ENDIF
+                IF (k .LE. 0) EXIT
+           ENDDO
+           IF (lastkind.NE.-1)THEN
+	       num_rkinds = num_rkinds + 1
+               WRITE(*,'(I0)') lastkind
+	   ELSE
+              WRITE(*,'()')
+           ENDIF
+	   WRITE(*,'(I0)') max_decimal_prec
+	   WRITE(*,'(I0)') num_ikinds
+	   WRITE(*,'(I0)') num_rkinds
+       END
+  "
+  XX
+  YY
+  PROG_OUTPUT
+)
+# dnl The output from the above program will be:
+# dnl    -- LINE 1 --  valid integer kinds (comma seperated list)
+# dnl    -- LINE 2 --  valid real kinds (comma seperated list)
+# dnl    -- LINE 3 --  max decimal precision for reals
+# dnl    -- LINE 4 --  number of valid integer kinds
+# dnl    -- LINE 5 --  number of valid real kinds
+
+# Convert the string to a list of strings by replacing the carriage return with a semicolon
+string(REGEX REPLACE "\n" ";" PROG_OUTPUT "${PROG_OUTPUT}")
+
+list(GET PROG_OUTPUT 0 pac_validIntKinds)
+list(GET PROG_OUTPUT 1 pac_validRealKinds)
+list(GET PROG_OUTPUT 2 H5_PAC_FC_MAX_REAL_PRECISION)
+
+set(PAC_FC_ALL_INTEGER_KINDS "\{${pac_validIntKinds}\}")
+set(PAC_FC_ALL_REAL_KINDS "\{${pac_validRealKinds}\}")
+
+list(GET PROG_OUTPUT 3 NUM_IKIND)
+list(GET PROG_OUTPUT 4 NUM_RKIND)
+
+set(H5CONFIG_F_NUM_IKIND "INTEGER, PARAMETER :: num_ikinds = ${NUM_IKIND}")
+set(H5CONFIG_F_IKIND "INTEGER, DIMENSION(1:num_ikinds) :: ikind = (/${pac_validIntKinds}/)")
+
+message (STATUS "....REAL KINDS FOUND ${PAC_FC_ALL_REAL_KINDS}")
+message (STATUS "....INTEGER KINDS FOUND ${PAC_FC_ALL_REAL_KINDS}")
+message (STATUS "....MAX DECIMAL PRECISION ${H5_PAC_FC_MAX_REAL_PRECISION}")
+
+#-----------------------------------------------------------------------------
+# Determine the available KINDs for REALs and INTEGERs
+#-----------------------------------------------------------------------------
+# **********
+# INTEGERS
+# **********
+string(REGEX REPLACE "," ";" VAR "${pac_validIntKinds}")
+
+foreach( KIND ${VAR} )
+  set(PROG_SRC 
+    "
+        PROGRAM main
+        USE ISO_C_BINDING
+        IMPLICIT NONE
+        INTEGER (KIND=${KIND}) a
+        WRITE(*,'(I0)') ${FC_SIZEOF_A}
+        END
+     "
+  )
+  FORTRAN_RUN("INTEGER KIND SIZEOF" ${PROG_SRC}
+  XX
+  YY
+  PROG_OUTPUT1
+  )
+  string(REGEX REPLACE "\n" "" PROG_OUTPUT1 "${PROG_OUTPUT1}")
+  set(pack_int_sizeof "${pack_int_sizeof} ${PROG_OUTPUT1},")
+endforeach(KIND)
+string(STRIP ${pack_int_sizeof} pack_int_sizeof)
+
+
+#Remove trailing comma
+string(REGEX REPLACE ",$" "" pack_int_sizeof "${pack_int_sizeof}")
+#Remove spaces
+string(REGEX REPLACE " " "" pack_int_sizeof "${pack_int_sizeof}")
+
+set(PAC_FC_ALL_INTEGER_KINDS_SIZEOF "\{${pack_int_sizeof}\}")
+
+message(STATUS "....FOUND SIZEOF for INTEGER KINDs ${PAC_FC_ALL_INTEGER_KINDS_SIZEOF}")
+# **********
+# REALS
+# **********
+string(REGEX REPLACE "," ";" VAR "${pac_validRealKinds}")
+
+#find the maximum kind of the real
+list(LENGTH VAR LEN_VAR)
+MATH (EXPR _LEN "${LEN_VAR}-1")
+list(GET VAR ${_LEN} max_real_fortran_kind)
+
+foreach( KIND ${VAR} )
+  set(PROG_SRC 
+    "
+        PROGRAM main
+        USE ISO_C_BINDING
+        IMPLICIT NONE
+        REAL (KIND=${KIND}) a
+        WRITE(*,'(I0)') ${FC_SIZEOF_A}
+        END
+     "
+  )
+  FORTRAN_RUN("REAL KIND SIZEOF" ${PROG_SRC}
+  XX
+  YY
+  PROG_OUTPUT1
+  )
+  string(REGEX REPLACE "\n" "" PROG_OUTPUT1 "${PROG_OUTPUT1}")
+  set(pack_real_sizeof "${pack_real_sizeof} ${PROG_OUTPUT1},")
+endforeach(KIND)
+string(STRIP ${pack_real_sizeof} pack_real_sizeof)
+
+#Remove trailing comma
+string(REGEX REPLACE ",$" "" pack_real_sizeof "${pack_real_sizeof}")
+#Remove spaces
+string(REGEX REPLACE " " "" pack_real_sizeof "${pack_real_sizeof}")
+
+set(H5CONFIG_F_RKIND_SIZEOF "INTEGER, DIMENSION(1:num_rkinds) :: rkind_sizeof = (/${pack_real_sizeof}/)")
+
+message(STATUS "....FOUND SIZEOF for REAL KINDs \{${pack_real_sizeof}\}")
+
+set(PAC_FC_ALL_REAL_KINDS_SIZEOF "\{${pack_real_sizeof}\}")
+
+#find the maximum kind of the real
+string(REGEX REPLACE "," ";" VAR "${pack_real_sizeof}")
+list(LENGTH VAR LEN_VAR)
+MATH (EXPR _LEN "${LEN_VAR}-1")
+list(GET VAR ${_LEN} max_real_fortran_sizeof)
+
+#-----------------------------------------------------------------------------
+# Find sizeof of native kinds
+#-----------------------------------------------------------------------------
+FORTRAN_RUN("SIZEOF NATIVE KINDs"
+  "
+       PROGRAM main
+          USE ISO_C_BINDING
+          IMPLICIT NONE
+          INTEGER a
+          REAL b
+          DOUBLE PRECISION c
+          WRITE(*,*) ${FC_SIZEOF_A}
+	  WRITE(*,*) kind(a)
+	  WRITE(*,*) ${FC_SIZEOF_B}
+	  WRITE(*,*) kind(b)
+          WRITE(*,*) ${FC_SIZEOF_C}
+          WRITE(*,*) kind(c)
+       END
+  "
+  XX
+  YY
+  PROG_OUTPUT
+)
+# dnl The output from the above program will be:
+# dnl    -- LINE 1 --  sizeof INTEGER
+# dnl    -- LINE 2 --  kind of INTEGER
+# dnl    -- LINE 3 --  sizeof REAL
+# dnl    -- LINE 4 --  kind of REAL
+# dnl    -- LINE 5 --  sizeof DOUBLE PRECISION
+# dnl    -- LINE 6 --  kind of DOUBLE PRECISION
+
+# Convert the string to a list of strings by replacing the carriage return with a semicolon
+string(REGEX REPLACE "\n" ";" PROG_OUTPUT "${PROG_OUTPUT}")
+
+list(GET PROG_OUTPUT 0 PAC_FORTRAN_NATIVE_INTEGER_SIZEOF)
+list(GET PROG_OUTPUT 1 PAC_FORTRAN_NATIVE_INTEGER_KIND)
+list(GET PROG_OUTPUT 2 PAC_FORTRAN_NATIVE_REAL_SIZEOF)
+list(GET PROG_OUTPUT 3 PAC_FORTRAN_NATIVE_REAL_KIND)
+list(GET PROG_OUTPUT 4 PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF)
+list(GET PROG_OUTPUT 5 PAC_FORTRAN_NATIVE_DOUBLE_KIND)
+
+set(FORTRAN_SIZEOF_LONG_DOUBLE ${${HDF_PREFIX}_SIZEOF_LONG_DOUBLE})
+#set(H5_SIZEOF_LONG_DOUBLE ${${HDF_PREFIX}_SIZEOF_LONG_DOUBLE})
+
+# remove the invalid kind from the list
+if(NOT(${SIZEOF___FLOAT128} EQUAL 0))
+   if(NOT(${SIZEOF___FLOAT128} EQUAL ${max_real_fortran_sizeof}) 
+     AND NOT(${FORTRAN_SIZEOF_LONG_DOUBLE} EQUAL ${max_real_fortran_sizeof})
+     # account for the fact that the C compiler can have 16-byte __float128 and the fortran compiler only has 8-byte doubles,
+     # so we don't want to remove the 8-byte fortran doubles.
+     AND NOT(${PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF} EQUAL ${max_real_fortran_sizeof}))
+     message(WARNING "
+          Fortran REAL(KIND=${max_real_fortran_kind}) is $max_real_fortran_sizeof Bytes, but no corresponding C float type exists of that size
+                                           !!! Fortran interfaces will not be generated for REAL(KIND=${max_real_fortran_kind}) !!!")
+     string(REGEX REPLACE ",[0-9]+}" "}" PAC_FC_ALL_REAL_KINDS ${PAC_FC_ALL_REAL_KINDS})
+     string(REGEX REPLACE ",[0-9]+}" "}" PAC_FC_ALL_REAL_KINDS_SIZEOF ${PAC_FC_ALL_REAL_KINDS_SIZEOF})
+     MATH (EXPR NUM_RKIND "${NUM_RKIND} - 1")
+   endif()
+endif(NOT(${SIZEOF___FLOAT128} EQUAL 0))
+
+set(H5CONFIG_F_NUM_RKIND "INTEGER, PARAMETER :: num_rkinds = ${NUM_RKIND}")
+
+string(REGEX REPLACE "{" "" OUT_VAR ${PAC_FC_ALL_REAL_KINDS})
+string(REGEX REPLACE "}" "" OUT_VAR ${OUT_VAR})
+set(H5CONFIG_F_RKIND "INTEGER, DIMENSION(1:num_rkinds) :: rkind = (/${OUT_VAR}/)")
+
+string(REGEX REPLACE "{" "" OUT_VAR ${PAC_FC_ALL_REAL_KINDS_SIZEOF})
+string(REGEX REPLACE "}" "" OUT_VAR ${OUT_VAR})
+set(H5CONFIG_F_RKIND_SIZEOF "INTEGER, DIMENSION(1:num_rkinds) :: rkind_sizeof = (/${OUT_VAR}/)")
+
+ENABLE_LANGUAGE (C)
+
+#-----------------------------------------------------------------------------
+# The provided CMake C macros don't provide a general compile/run function
+# so this one is used.
+#-----------------------------------------------------------------------------
+MACRO (C_RUN FUNCTION CODE RETURN)
+    message (STATUS "Detecting C ${FUNCTION}")
+    if (CMAKE_REQUIRED_LIBRARIES)
+      set (CHECK_FUNCTION_EXISTS_ADD_LIBRARIES
+          "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}")
+    else (CMAKE_REQUIRED_LIBRARIES)
+      set (CHECK_FUNCTION_EXISTS_ADD_LIBRARIES)
+    endif (CMAKE_REQUIRED_LIBRARIES)
+    file (WRITE
+        ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testCCompiler1.c
+        ${CODE}
+    )
+    TRY_RUN (RUN_RESULT_VAR COMPILE_RESULT_VAR
+        ${CMAKE_BINARY_DIR}
+        ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testCCompiler1.c
+        CMAKE_FLAGS "${CHECK_FUNCTION_EXISTS_ADD_LIBRARIES}"
+        RUN_OUTPUT_VARIABLE OUTPUT
+    )
+
+    set(${RETURN} ${OUTPUT})
+	
+    #message ( "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ")
+    #message ( "Test COMPILE_RESULT_VAR ${COMPILE_RESULT_VAR} ")
+    #message ( "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ")
+    #message ( "Test RUN_RESULT_VAR ${RUN_RESULT_VAR} ")
+    #message ( "* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ")
+
+    if (${COMPILE_RESULT_VAR})
+      if (${RUN_RESULT_VAR} MATCHES 1)
+        set (${RUN_RESULT_VAR} 1 CACHE INTERNAL "Have C function ${FUNCTION}")
+        message (STATUS "Testing C ${FUNCTION} - OK")
+        file (APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
+            "Determining if the C ${FUNCTION} exists passed with the following output:\n"
+            "${OUTPUT}\n\n"
+        )
+      else ()
+        message (STATUS "Testing C ${FUNCTION} - Fail")
+        set (${RUN_RESULT_VAR} 0 CACHE INTERNAL "Have C function ${FUNCTION}")
+        file (APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
+            "Determining if the C ${FUNCTION} exists failed with the following output:\n"
+            "${OUTPUT}\n\n")
+      endif ()
+    else ()
+        message (FATAL_ERROR "Compilation of C ${FUNCTION} - Failed")
+    endif()
+ENDMACRO (C_RUN)
+
+set(PROG_SRC 
+    "
+#include <float.h>
+#include <stdio.h>
+#define CHECK_FLOAT128 ${SIZEOF___FLOAT128}
+#if CHECK_FLOAT128!=0
+# if ${HAVE_QUADMATH}!=0
+#include <quadmath.h>
+# endif
+# ifdef FLT128_DIG
+#define C_FLT128_DIG FLT128_DIG
+# else
+#define C_FLT128_DIG 0
+# endif
+#else
+#define C_FLT128_DIG 0
+#endif
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#define C_LDBL_DIG DECIMAL_DIG 
+#else
+#define C_LDBL_DIG LDBL_DIG
+#endif
+   int main() {
+       printf(\"%d\\\\n%d\\\\n\", C_LDBL_DIG, C_FLT128_DIG)\\\;
+       return 1\\\;
+   }
+     "
+  )
+
+C_RUN("maximum decimal precision for C" ${PROG_SRC} PROG_OUTPUT)
+
+# dnl The output from the above program will be:
+# dnl    -- LINE 1 --  long double decimal precision
+# dnl    -- LINE 2 --  __float128 decimal precision
+
+# Convert the string to a list of strings by replacing the carriage return with a semicolon
+string(REGEX REPLACE "\n" ";" PROG_OUTPUT "${PROG_OUTPUT}")
+
+list(GET PROG_OUTPUT 0 LDBL_DIG)
+list(GET PROG_OUTPUT 1 FLT128_DIG)
+
+if(SIZEOF___FLOAT128 EQUAL 0 OR FLT128_DIG EQUAL 0)
+  SET(H5_HAVE_FLOAT128 0)
+  SET(SIZEOF___FLOAT128 0)
+  set(H5_PAC_C_MAX_REAL_PRECISION ${LDBL_DIG})
+else ()
+  set(H5_PAC_C_MAX_REAL_PRECISION ${FLT128_DIG})
+endif()
+
+
+# Setting definition if there is a 16 byte fortran integer
+string(FIND ${PAC_FC_ALL_INTEGER_KINDS_SIZEOF} "16" pos)
+if(${pos} EQUAL -1)
+  set(HAVE_Fortran_INTEGER_SIZEOF_16 0)
+else ()
+  set(HAVE_Fortran_INTEGER_SIZEOF_16 1)
+endif ()
diff --git a/config/cmake/HDF5_Examples.cmake.in b/config/cmake/HDF5_Examples.cmake.in
new file mode 100644
index 0000000..40e2b32
--- /dev/null
+++ b/config/cmake/HDF5_Examples.cmake.in
@@ -0,0 +1,172 @@
+cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
+###############################################################################################################
+# This script will build and run the examples from a folder
+# Execute from a command line:
+#     ctest -S HDF5_Examples.cmake,OPTION=VALUE -C Release -V -O test.log
+###############################################################################################################
+
+set(CTEST_CMAKE_GENERATOR "@CMAKE_GENERATOR@")
+set(CTEST_DASHBOARD_ROOT ${CTEST_SCRIPT_DIRECTORY})
+
+# handle input parameters to script.
+#INSTALLDIR - HDF5 root folder
+#CTEST_BUILD_CONFIGURATION - Release, Debug, RelWithDebInfo
+#CTEST_SOURCE_NAME - name of source folder; HDF4Examples
+#STATIC_LIBRARIES - Default is YES
+#FORTRAN_LIBRARIES - Default is NO
+##NO_MAC_FORTRAN - set to TRUE to allow shared libs on a Mac)
+if(DEFINED CTEST_SCRIPT_ARG)
+    # transform ctest script arguments of the form
+    # script.ctest,var1=value1,var2=value2
+    # to variables with the respective names set to the respective values
+    string(REPLACE "," ";" script_args "${CTEST_SCRIPT_ARG}")
+    foreach(current_var ${script_args})
+        if ("${current_var}" MATCHES "^([^=]+)=(.+)$")
+            set("${CMAKE_MATCH_1}" "${CMAKE_MATCH_2}")
+        endif()
+    endforeach()
+endif()
+if(NOT DEFINED INSTALLDIR)
+    set(INSTALLDIR "@CMAKE_INSTALL_PREFIX@")
+endif()
+if(NOT DEFINED CTEST_BUILD_CONFIGURATION)
+    set(CTEST_BUILD_CONFIGURATION "Release")
+endif()
+if(NOT DEFINED CTEST_SOURCE_NAME)
+    set(CTEST_SOURCE_NAME "HDF5Examples")
+endif()
+if(NOT DEFINED STATIC_LIBRARIES)
+    set(STATICLIBRARIES "YES")
+endif()
+if(NOT DEFINED FORTRAN_LIBRARIES)
+    set(FORTRANLIBRARIES "NO")
+endif()
+
+#TAR_SOURCE - name of tarfile
+#if(NOT DEFINED TAR_SOURCE)
+#  set(CTEST_USE_TAR_SOURCE "HDF5Examples-1.10.1-Source")
+#endif()
+
+###############################################################################################################
+#     Adjust the following SET Commands as needed
+###############################################################################################################
+if(WIN32)
+  if(${STATICLIBRARIES})
+    set(BUILD_OPTIONS "${BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=OFF")
+  endif()
+  set(ENV{HDF5_DIR} "${INSTALLDIR}/cmake")
+  set(CTEST_BINARY_NAME ${CTEST_SOURCE_NAME}\\build)
+  set(CTEST_SOURCE_DIRECTORY "${CTEST_DASHBOARD_ROOT}\\${CTEST_SOURCE_NAME}")
+  set(CTEST_BINARY_DIRECTORY "${CTEST_DASHBOARD_ROOT}\\${CTEST_BINARY_NAME}")
+else(WIN32)
+  if(${STATICLIBRARIES})
+    set(BUILD_OPTIONS "${BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=OFF -DCMAKE_ANSI_CFLAGS:STRING=-fPIC")
+  endif()
+  set(ENV{HDF5_DIR} "${INSTALLDIR}/share/cmake")
+  set(ENV{LD_LIBRARY_PATH} "${INSTALLDIR}/lib")
+  set(CTEST_BINARY_NAME ${CTEST_SOURCE_NAME}/build)
+  set(CTEST_SOURCE_DIRECTORY "${CTEST_DASHBOARD_ROOT}/${CTEST_SOURCE_NAME}")
+  set(CTEST_BINARY_DIRECTORY "${CTEST_DASHBOARD_ROOT}/${CTEST_BINARY_NAME}")
+endif(WIN32)
+if(${FORTRANLIBRARIES})
+  set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF_BUILD_FORTRAN:BOOL=ON")
+else()
+  set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF_BUILD_FORTRAN:BOOL=OFF")
+endif()
+set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF5_PACKAGE_NAME:STRING=@HDF5_PACKAGE@@HDF_PACKAGE_EXT@")
+
+###############################################################################################################
+# For any comments please contact cdashhelp at hdfgroup.org
+#
+###############################################################################################################
+
+#-----------------------------------------------------------------------------
+# MAC machines need special option
+#-----------------------------------------------------------------------------
+if(APPLE)
+  # Compiler choice
+  execute_process(COMMAND xcrun --find cc OUTPUT_VARIABLE XCODE_CC OUTPUT_STRIP_TRAILING_WHITESPACE)
+  execute_process(COMMAND xcrun --find c++ OUTPUT_VARIABLE XCODE_CXX OUTPUT_STRIP_TRAILING_WHITESPACE)
+  set(ENV{CC} "${XCODE_CC}")
+  set(ENV{CXX} "${XCODE_CXX}")
+  if(NOT NO_MAC_FORTRAN)
+    # Shared fortran is not supported, build static
+    set(BUILD_OPTIONS "${BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=OFF -DCMAKE_ANSI_CFLAGS:STRING=-fPIC")
+  else()
+    set(BUILD_OPTIONS "${BUILD_OPTIONS} -DHDF_BUILD_FORTRAN:BOOL=OFF")
+  endif()
+  set(BUILD_OPTIONS "${BUILD_OPTIONS} -DCTEST_USE_LAUNCHERS:BOOL=ON -DCMAKE_BUILD_WITH_INSTALL_RPATH:BOOL=OFF")
+endif()
+
+#-----------------------------------------------------------------------------
+set(CTEST_CMAKE_COMMAND "\"${CMAKE_COMMAND}\"")
+## --------------------------
+if(CTEST_USE_TAR_SOURCE)
+  ## Uncompress source if tar or zip file provided
+  ## --------------------------
+  if(WIN32)
+    message(STATUS "extracting... [${CMAKE_EXECUTABLE_NAME} -E tar -xvf ${CTEST_USE_TAR_SOURCE}.zip]")
+    execute_process(COMMAND ${CMAKE_EXECUTABLE_NAME} -E tar -xvf ${CTEST_DASHBOARD_ROOT}\\${CTEST_USE_TAR_SOURCE}.zip RESULT_VARIABLE rv)
+  else()
+    message(STATUS "extracting... [${CMAKE_EXECUTABLE_NAME} -E tar -xvf ${CTEST_USE_TAR_SOURCE}.tar]")
+    execute_process(COMMAND ${CMAKE_EXECUTABLE_NAME} -E tar -xvf ${CTEST_DASHBOARD_ROOT}/${CTEST_USE_TAR_SOURCE}.tar RESULT_VARIABLE rv)
+  endif()
+
+  if(NOT rv EQUAL 0)
+    message(STATUS "extracting... [error-(${rv}) clean up]")
+    file(REMOVE_RECURSE "${CTEST_SOURCE_DIRECTORY}")
+    message(FATAL_ERROR "error: extract of ${CTEST_SOURCE_NAME} failed")
+  endif()
+endif(CTEST_USE_TAR_SOURCE)
+
+#-----------------------------------------------------------------------------
+## Clear the build directory
+## --------------------------
+set(CTEST_START_WITH_EMPTY_BINARY_DIRECTORY TRUE)
+if (EXISTS "${CTEST_BINARY_DIRECTORY}" AND IS_DIRECTORY "${CTEST_BINARY_DIRECTORY}")
+  ctest_empty_binary_directory(${CTEST_BINARY_DIRECTORY})
+else ()
+  file(MAKE_DIRECTORY "${CTEST_BINARY_DIRECTORY}")
+endif ()
+
+# Use multiple CPU cores to build
+include(ProcessorCount)
+ProcessorCount(N)
+if(NOT N EQUAL 0)
+  if(NOT WIN32)
+    set(CTEST_BUILD_FLAGS -j${N})
+  endif()
+  set(ctest_test_args ${ctest_test_args} PARALLEL_LEVEL ${N})
+endif()
+set (CTEST_CONFIGURE_COMMAND
+    "${CTEST_CMAKE_COMMAND} -C \"${CTEST_SOURCE_DIRECTORY}/config/cmake/cacheinit.cmake\" -DCMAKE_BUILD_TYPE:STRING=${CTEST_BUILD_CONFIGURATION} ${BUILD_OPTIONS} \"-G${CTEST_CMAKE_GENERATOR}\" \"${CTEST_SOURCE_DIRECTORY}\""
+)
+
+#-----------------------------------------------------------------------------
+## -- set output to english
+set($ENV{LC_MESSAGES}  "en_EN")
+
+#-----------------------------------------------------------------------------
+configure_file(${CTEST_SOURCE_DIRECTORY}/config/cmake/CTestCustom.cmake ${CTEST_BINARY_DIRECTORY}/CTestCustom.cmake)
+ctest_read_custom_files ("${CTEST_BINARY_DIRECTORY}")
+## NORMAL process
+## --------------------------
+ctest_start (Experimental)
+ctest_configure (BUILD "${CTEST_BINARY_DIRECTORY}")
+if(LOCAL_SUBMIT)
+  ctest_submit (PARTS Configure Notes)
+endif()
+ctest_build (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND)
+if(LOCAL_SUBMIT)
+  ctest_submit (PARTS Build)
+endif()
+ctest_test (BUILD "${CTEST_BINARY_DIRECTORY}" APPEND ${ctest_test_args} RETURN_VALUE res)
+if(LOCAL_SUBMIT)
+  ctest_submit (PARTS Test)
+endif()
+if(res GREATER 0)
+  message (FATAL_ERROR "tests FAILED")
+endif()
+#-----------------------------------------------------------------------------
+##############################################################################################################
+message(STATUS "DONE")
\ No newline at end of file
diff --git a/config/cmake/HDF5_Process_Flex_Files.cmake b/config/cmake/HDF5_Process_Flex_Files.cmake
new file mode 100644
index 0000000..2306e93
--- /dev/null
+++ b/config/cmake/HDF5_Process_Flex_Files.cmake
@@ -0,0 +1,84 @@
+# post process flex/bison files
+
+message (STATUS "File: ${GEN_DIR} ${FILE_PARSE} ${FILE_ANALYZE}")
+
+if (FILE_PARSE)
+  # fix H5LTparse.c to declare H5LTyyparse return type as an hid_t
+  # instead of int.  Currently the generated function H5LTyyparse is
+  # generated with a return value of type int, which is a mapping to the
+  # flex yyparse function.  The return value in the HL library should be
+  # an hid_t.
+  # I propose to not use flex to generate this function, but for now I am
+  # adding a perl command to find and replace this function declaration in
+  # H5LTparse.c.
+    file (READ ${GEN_DIR}/${FILE_PARSE}.c TEST_STREAM)
+    string (REGEX REPLACE "int yyparse" "hid_t yyparse" TEST_STREAM "${TEST_STREAM}")
+    string (REGEX REPLACE "int\nyyparse" "hid_t\nyyparse" TEST_STREAM "${TEST_STREAM}")
+    string (REGEX REPLACE "int H5LTyyparse" "hid_t H5LTyyparse" TEST_STREAM "${TEST_STREAM}")
+    file (WRITE ${FILE_PARSE}.c "${TEST_STREAM}")
+    message (STATUS "replacing signature in H5LTparse.c")
+
+  # Add code that disables warnings in the flex/bison-generated code.
+  #
+  # Note that the GCC pragmas did not exist until gcc 4.2. Earlier versions
+  # will simply ignore them, but we want to avoid those warnings.
+    file (READ ${FILE_PARSE}.c TEST_STREAM)
+    file (WRITE ${FILE_PARSE}.c "
+#if __GNUC__ >= 4 && __GNUC_MINOR__ >=2\n
+#pragma GCC diagnostic ignored \"-Wconversion\"\n
+#pragma GCC diagnostic ignored \"-Wimplicit-function-declaration\"\n
+#pragma GCC diagnostic ignored \"-Wlarger-than=\"\n
+#pragma GCC diagnostic ignored \"-Wmissing-prototypes\"\n
+#pragma GCC diagnostic ignored \"-Wnested-externs\"\n
+#pragma GCC diagnostic ignored \"-Wold-style-definition\"\n
+#pragma GCC diagnostic ignored \"-Wsign-compare\"\n
+#pragma GCC diagnostic ignored \"-Wsign-conversion\"\n
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"\n
+#pragma GCC diagnostic ignored \"-Wswitch-default\"\n
+#pragma GCC diagnostic ignored \"-Wunused-function\"\n
+#pragma GCC diagnostic ignored \"-Wunused-macros\"\n
+#pragma GCC diagnostic ignored \"-Wunused-parameter\"\n
+#pragma GCC diagnostic ignored \"-Wredundant-decls\"\n
+#elif defined __SUNPRO_CC\n
+#pragma disable_warn\n
+#elif defined _MSC_VER\n
+#pragma warning(push, 1)\n
+#endif\n
+    ")
+    file (APPEND ${FILE_PARSE}.c "${TEST_STREAM}")
+    message (STATUS "processed pragma in ${FILE_PARSE}")
+    file (READ ${GEN_DIR}/${FILE_PARSE}.h TEST_STREAM)
+    file (WRITE ${FILE_PARSE}.h "${TEST_STREAM}")
+endif (FILE_PARSE)
+
+if (FILE_ANALYZE)
+  # Add code that disables warnings in the flex/bison-generated code.
+  #
+  # Note that the GCC pragmas did not exist until gcc 4.2. Earlier versions
+  # will simply ignore them, but we want to avoid those warnings.
+    file (READ ${GEN_DIR}/${FILE_ANALYZE} TEST_STREAM)
+    file (WRITE ${FILE_ANALYZE} "
+#if __GNUC__ >= 4 && __GNUC_MINOR__ >=2\n
+#pragma GCC diagnostic ignored \"-Wconversion\"\n
+#pragma GCC diagnostic ignored \"-Wimplicit-function-declaration\"\n
+#pragma GCC diagnostic ignored \"-Wlarger-than=\"\n
+#pragma GCC diagnostic ignored \"-Wmissing-prototypes\"\n
+#pragma GCC diagnostic ignored \"-Wnested-externs\"\n
+#pragma GCC diagnostic ignored \"-Wold-style-definition\"\n
+#pragma GCC diagnostic ignored \"-Wsign-compare\"\n
+#pragma GCC diagnostic ignored \"-Wsign-conversion\"\n
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"\n
+#pragma GCC diagnostic ignored \"-Wswitch-default\"\n
+#pragma GCC diagnostic ignored \"-Wunused-function\"\n
+#pragma GCC diagnostic ignored \"-Wunused-macros\"\n
+#pragma GCC diagnostic ignored \"-Wunused-parameter\"\n
+#pragma GCC diagnostic ignored \"-Wredundant-decls\"\n
+#elif defined __SUNPRO_CC\n
+#pragma disable_warn\n
+#elif defined _MSC_VER\n
+#pragma warning(push, 1)\n
+#endif\n
+    ")
+    file (APPEND ${FILE_ANALYZE} "${TEST_STREAM}")
+    message (STATUS "processed pragma in ${FILE_ANALYZE}")
+endif (FILE_ANALYZE)
diff --git a/config/cmake/HDFCompilerFlags.cmake b/config/cmake/HDFCompilerFlags.cmake
index c637c73..665db32 100644
--- a/config/cmake/HDFCompilerFlags.cmake
+++ b/config/cmake/HDFCompilerFlags.cmake
@@ -16,12 +16,12 @@ if (CMAKE_COMPILER_IS_GNUCC)
 endif (CMAKE_COMPILER_IS_GNUCC)
 if (CMAKE_COMPILER_IS_GNUCXX)
   if (CMAKE_BUILD_TYPE MATCHES Debug)
-    set (CMAKE_CXX_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_CXX_FLAGS} -std=c99")
+    set (CMAKE_CXX_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_CXX_FLAGS}")
     if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
       set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Og -ftrapv -fno-common")
     endif ()
   else (CMAKE_BUILD_TYPE MATCHES Debug)
-    set (CMAKE_CXX_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_CXX_FLAGS} -std=c99")
+    set (CMAKE_CXX_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_CXX_FLAGS}")
     if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
       set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstdarg-opt")
     endif ()
diff --git a/config/cmake/README.txt.cmake.in b/config/cmake/README.txt.cmake.in
index b03f6d0..ec40abe 100644
--- a/config/cmake/README.txt.cmake.in
+++ b/config/cmake/README.txt.cmake.in
@@ -26,14 +26,14 @@ After Installation
 ===========================================================================
 The examples folder, HDF5Examples, located in the
 HDF5 install folder, can be built and tested with CMake and the supplied
-HDF518_Examples.cmake file. The HDF518_Examples.cmake expects HDF5 to have
-been installed in the default location with above compilers. Also, the CMake 
+HDF5_Examples.cmake file. The HDF5_Examples.cmake expects HDF5 to have
+been installed in the default location with above compilers. Also, the CMake
 utility should be installed.
 
 To test the installation with the examples;
     Create a directory to run the examples.
     Copy HDF5Examples folder to this directory.
-    Copy HDF518_Examples.cmake to this directory.
+    Copy HDF5_Examples.cmake to this directory.
     The default source folder is defined as "HDF5Examples". It can be changed
         with the CTEST_SOURCE_NAME script option.
     The default installation folder is defined as "@CMAKE_INSTALL_PREFIX@".
@@ -43,12 +43,12 @@ To test the installation with the examples;
         be the same as the value used with the -C command line option.
     The default build configuration is defined to build and use static libraries.
         Shared libraries can be used with the STATICLIBRARIES script option set to "NO".
-    Other options can be changed by editing the HDF518_Examples.cmake file.
+    Other options can be changed by editing the HDF5_Examples.cmake file.
 
     If the defaults are okay, execute from this directory:
-        ctest -S HDF518_Examples.cmake -C Release -V -O test.log
+        ctest -S HDF5_Examples.cmake -C Release -V -O test.log
     If the defaults need change, execute from this directory:
-        ctest -S HDF518_Examples.cmake,CTEST_SOURCE_NAME=MyExamples,INSTALLDIR=MyLocation -C Release -V -O test.log
+        ctest -S HDF5_Examples.cmake,CTEST_SOURCE_NAME=MyExamples,INSTALLDIR=MyLocation -C Release -V -O test.log
 
 When executed, the ctest script will save the results to the log file, test.log, as
 indicated by the ctest command. If you wish the to see more build and test information,
diff --git a/config/cmake/cacheinit.cmake b/config/cmake/cacheinit.cmake
index d571837..4bef99f 100644
--- a/config/cmake/cacheinit.cmake
+++ b/config/cmake/cacheinit.cmake
@@ -42,6 +42,8 @@ set (HDF5_USE_FOLDERS ON CACHE BOOL "Enable folder grouping of projects in IDEs.
 
 set (HDF5_USE_16_API_DEFAULT OFF CACHE BOOL "Use the HDF5 1.6.x API by default" FORCE)
 
+set (HDF5_USE_18_API_DEFAULT OFF CACHE BOOL "Use the HDF5 1.8.x API by default" FORCE)
+
 set (HDF5_ENABLE_THREADSAFE OFF CACHE BOOL "(WINDOWS)Enable Threadsafety" FORCE)
 
 set (HDF_TEST_EXPRESS "2" CACHE STRING "Control testing framework (0-3)" FORCE)
diff --git a/config/cmake/hdf5-config.cmake.in b/config/cmake/hdf5-config.cmake.in
index 52d6baf..3577e40 100644
--- a/config/cmake/hdf5-config.cmake.in
+++ b/config/cmake/hdf5-config.cmake.in
@@ -22,7 +22,6 @@ set (${HDF5_PACKAGE_NAME}_VALID_COMPONENTS
 #-----------------------------------------------------------------------------
 set (${HDF5_PACKAGE_NAME}_ENABLE_PARALLEL @HDF5_ENABLE_PARALLEL@)
 set (${HDF5_PACKAGE_NAME}_BUILD_FORTRAN   @HDF5_BUILD_FORTRAN@)
-set (${HDF5_PACKAGE_NAME}_ENABLE_F2003    @HDF5_ENABLE_F2003@)
 set (${HDF5_PACKAGE_NAME}_BUILD_CPP_LIB   @HDF5_BUILD_CPP_LIB@)
 set (${HDF5_PACKAGE_NAME}_BUILD_TOOLS     @HDF5_BUILD_TOOLS@)
 set (${HDF5_PACKAGE_NAME}_BUILD_HL_LIB    @HDF5_BUILD_HL_LIB@)
diff --git a/config/cmake/libhdf5.settings.cmake.in b/config/cmake/libhdf5.settings.cmake.in
index 8ef67a5..ba764a4 100644
--- a/config/cmake/libhdf5.settings.cmake.in
+++ b/config/cmake/libhdf5.settings.cmake.in
@@ -38,7 +38,6 @@ Languages:
 ----------
                         Fortran: @HDF5_BUILD_FORTRAN@
 @BUILD_FORTRAN_CONDITIONAL_TRUE@               Fortran Compiler: @CMAKE_Fortran_COMPILER@
- at BUILD_FORTRAN_CONDITIONAL_TRUE@          Fortran 2003 Compiler: @HDF5_ENABLE_F2003@
 @BUILD_FORTRAN_CONDITIONAL_TRUE@                  Fortran Flags: @CMAKE_Fortran_FLAGS@
 @BUILD_FORTRAN_CONDITIONAL_TRUE@               H5 Fortran Flags: @H5_FCFLAGS@
 @BUILD_FORTRAN_CONDITIONAL_TRUE@               AM Fortran Flags: @AM_FCFLAGS@
diff --git a/config/cmake/mccacheinit.cmake b/config/cmake/mccacheinit.cmake
index 5646c99..19ecc15 100644
--- a/config/cmake/mccacheinit.cmake
+++ b/config/cmake/mccacheinit.cmake
@@ -4,6 +4,8 @@
 # EXTERNAL cache entries
 ########################
 
+set (CMAKE_INSTALL_FRAMEWORK_PREFIX "Library/Frameworks" CACHE STRING "Frameworks installation directory" FORCE)
+
 set (BUILD_SHARED_LIBS OFF CACHE BOOL "Build Shared Libraries" FORCE)
 
 set (BUILD_TESTING ON CACHE BOOL "Build HDF5 Unit Testing" FORCE)
@@ -16,8 +18,6 @@ set (HDF5_BUILD_EXAMPLES ON CACHE BOOL "Build HDF5 Library Examples" FORCE)
 
 set (HDF5_BUILD_FORTRAN ON CACHE BOOL "Build FORTRAN support" FORCE)
 
-set (HDF5_ENABLE_F2003 ON CACHE BOOL "Enable FORTRAN 2003 Standard" FORCE)
-
 set (HDF5_BUILD_HL_LIB ON CACHE BOOL "Build HIGH Level HDF5 Library" FORCE)
 
 set (HDF5_BUILD_TOOLS ON CACHE BOOL "Build HDF5 Tools" FORCE)
@@ -54,6 +54,8 @@ set (HDF5_USE_FOLDERS ON CACHE BOOL "Enable folder grouping of projects in IDEs.
 
 set (HDF5_USE_16_API_DEFAULT OFF CACHE BOOL "Use the HDF5 1.6.x API by default" FORCE)
 
+set (HDF5_USE_18_API_DEFAULT OFF CACHE BOOL "Use the HDF5 1.8.x API by default" FORCE)
+
 set (HDF5_ENABLE_THREADSAFE OFF CACHE BOOL "(WINDOWS)Enable Threadsafety" FORCE)
 
 set (HDF5_PACKAGE_EXTLIBS OFF CACHE BOOL "(WINDOWS)CPACK - include external libraries" FORCE)
diff --git a/config/cmake/scripts/CTestScript.cmake b/config/cmake/scripts/CTestScript.cmake
index abe252e..403eedd 100755
--- a/config/cmake/scripts/CTestScript.cmake
+++ b/config/cmake/scripts/CTestScript.cmake
@@ -79,7 +79,7 @@ if(CTEST_USE_TAR_SOURCE)
     message(STATUS "extracting... [${CMAKE_EXECUTABLE_NAME} -E tar -xvf ${CTEST_DASHBOARD_ROOT}/${CTEST_USE_TAR_SOURCE}.tar]")
     execute_process(COMMAND ${CMAKE_EXECUTABLE_NAME} -E tar -xvf ${CTEST_DASHBOARD_ROOT}/${CTEST_USE_TAR_SOURCE}.tar RESULT_VARIABLE rv)
   endif()
-
+ 
   if(NOT rv EQUAL 0)
     message(STATUS "extracting... [error-(${rv}) clean up]")
     file(REMOVE_RECURSE "${CTEST_SOURCE_DIRECTORY}")
@@ -166,12 +166,23 @@ endif()
 
 #-----------------------------------------------------------------------------
 # Send the main script as a note.
-list(APPEND CTEST_NOTES_FILES
-    "${CTEST_SCRIPT_DIRECTORY}/${CTEST_SCRIPT_NAME}"
-    "${CMAKE_CURRENT_LIST_FILE}"
-    "${CTEST_SOURCE_DIRECTORY}/config/cmake/cacheinit.cmake"
-)
-
+if(USE_AUTOTOOLS)
+  ## autotools builds need to use make and does not use the cacheinit.cmake file
+  ## -- make command
+  ## -----------------
+  find_program(MAKE NAMES make)
+  list(APPEND CTEST_NOTES_FILES
+      "${CTEST_SCRIPT_DIRECTORY}/${CTEST_SCRIPT_NAME}"
+      "${CMAKE_CURRENT_LIST_FILE}"
+  )
+else()
+  list(APPEND CTEST_NOTES_FILES
+      "${CTEST_SCRIPT_DIRECTORY}/${CTEST_SCRIPT_NAME}"
+      "${CMAKE_CURRENT_LIST_FILE}"
+      "${CTEST_SOURCE_DIRECTORY}/config/cmake/cacheinit.cmake"
+  )
+endif()
+ 
 #-----------------------------------------------------------------------------
 # Check for required variables.
 # --------------------------
@@ -188,20 +199,27 @@ endforeach(req)
 #-----------------------------------------------------------------------------
 # Initialize the CTEST commands
 #------------------------------
-if(LOCAL_MEMCHECK_TEST)
-  find_program(CTEST_MEMORYCHECK_COMMAND NAMES valgrind)
-  set (CTEST_CONFIGURE_COMMAND
-      "${CTEST_CMAKE_COMMAND} -C \"${CTEST_SOURCE_DIRECTORY}/config/cmake/mccacheinit.cmake\" -DCMAKE_BUILD_TYPE:STRING=${CTEST_BUILD_CONFIGURATION} ${BUILD_OPTIONS} \"-G${CTEST_CMAKE_GENERATOR}\" \"${CTEST_SOURCE_DIRECTORY}\""
-  )
-else()
-  if(LOCAL_COVERAGE_TEST)
-    find_program(CTEST_COVERAGE_COMMAND NAMES gcov)
+if(USE_AUTOTOOLS)
+  set(CTEST_CONFIGURE_COMMAND  "${CTEST_SOURCE_DIRECTORY}/configure ${ADD_BUILD_OPTIONS}")
+  set(CTEST_BUILD_COMMAND      "${MAKE} ${CTEST_BUILD_FLAGS}")
+  configure_file(${CTEST_SOURCE_DIRECTORY}/config/cmake/CTestCustom.cmake ${CTEST_BINARY_DIRECTORY}/CTestCustom.cmake)
+  file(WRITE ${CTEST_BINARY_DIRECTORY}/CTestTestfile.cmake "ADD_TEST(makecheck \"${MAKE}\" \"${CTEST_BUILD_FLAGS}\" \"-i\" \"check\")")
+else(USE_AUTOTOOLS)
+  if(LOCAL_MEMCHECK_TEST)
+    find_program(CTEST_MEMORYCHECK_COMMAND NAMES valgrind)
+    set (CTEST_CONFIGURE_COMMAND
+        "${CTEST_CMAKE_COMMAND} -C \"${CTEST_SOURCE_DIRECTORY}/config/cmake/mccacheinit.cmake\" -DCMAKE_BUILD_TYPE:STRING=${CTEST_BUILD_CONFIGURATION} ${BUILD_OPTIONS} \"-G${CTEST_CMAKE_GENERATOR}\" \"${CTEST_SOURCE_DIRECTORY}\""
+    )
+  else()
+    if(LOCAL_COVERAGE_TEST)
+      find_program(CTEST_COVERAGE_COMMAND NAMES gcov)
+    endif()
+    set (CTEST_CONFIGURE_COMMAND
+        "${CTEST_CMAKE_COMMAND} -C \"${CTEST_SOURCE_DIRECTORY}/config/cmake/cacheinit.cmake\" -DCMAKE_BUILD_TYPE:STRING=${CTEST_BUILD_CONFIGURATION} ${BUILD_OPTIONS} \"-G${CTEST_CMAKE_GENERATOR}\" \"${CTEST_SOURCE_DIRECTORY}\""
+    )
   endif()
-  set (CTEST_CONFIGURE_COMMAND
-      "${CTEST_CMAKE_COMMAND} -C \"${CTEST_SOURCE_DIRECTORY}/config/cmake/cacheinit.cmake\" -DCMAKE_BUILD_TYPE:STRING=${CTEST_BUILD_CONFIGURATION} ${BUILD_OPTIONS} \"-G${CTEST_CMAKE_GENERATOR}\" \"${CTEST_SOURCE_DIRECTORY}\""
-  )
 endif()
-
+ 
 #-----------------------------------------------------------------------------
 ## -- set output to english
 set($ENV{LC_MESSAGES}  "en_EN")
diff --git a/config/cmake/scripts/HDF518config.cmake b/config/cmake/scripts/HDF518config.cmake
deleted file mode 100755
index 5cc73cf..0000000
--- a/config/cmake/scripts/HDF518config.cmake
+++ /dev/null
@@ -1,261 +0,0 @@
-#############################################################################################
-### ${CTEST_SCRIPT_ARG} is of the form OPTION=VALUE                                       ###
-### BUILD_GENERATOR required [Unix, VS2015, VS201564, VS2013, VS201364, VS2012, VS201264] ###
-### ctest -S HDF518config.cmake,BUILD_GENERATOR=VS201264 -C Release -V -O hdf518.log      ###
-#############################################################################################
-
-cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
-############################################################################
-# Usage:
-#     ctest -S HDF518config.cmake,OPTION=VALUE -C Release -VV -O test.log
-# where valid options for OPTION are:
-#     BUILD_GENERATOR - The cmake build generator:
-#            Unix    * Unix Makefiles
-#            VS2015    * Visual Studio 14 2015
-#            VS201564 * Visual Studio 14 2015 Win64
-#            VS2013    * Visual Studio 12 2013
-#            VS201364 * Visual Studio 12 2013 Win64
-#            VS2012    * Visual Studio 11 2012
-#            VS201264 * Visual Studio 11 2012 Win64
-#
-#     INSTALLDIR  -  root folder where hdf5 is installed
-#     CTEST_BUILD_CONFIGURATION  - Release, Debug, etc
-#     CTEST_SOURCE_NAME  -  source folder
-#     STATIC_LIBRARIES  -  Build/use static libraries
-#     FORTRAN_LIBRARIES -  Build/use fortran libraries
-#     NO_MAC_FORTRAN  - Yes to be SHARED on a Mac
-##############################################################################
-
-set(CTEST_SOURCE_VERSION 1.8.16)
-set(CTEST_SOURCE_VERSEXT "")
-
-##############################################################################
-# handle input parameters to script.
-#BUILD_GENERATOR - which CMake generator to use, required
-#INSTALLDIR - HDF5-1.8 root folder
-#CTEST_BUILD_CONFIGURATION - Release, Debug, RelWithDebInfo
-#CTEST_SOURCE_NAME - name of source folder; HDF5-1.8.16
-#STATIC_LIBRARIES - Default is YES
-#FORTRAN_LIBRARIES - Default is NO
-#NO_MAC_FORTRAN - set to TRUE to allow shared libs on a Mac
-if(DEFINED CTEST_SCRIPT_ARG)
-    # transform ctest script arguments of the form
-    # script.ctest,var1=value1,var2=value2
-    # to variables with the respective names set to the respective values
-    string(REPLACE "," ";" script_args "${CTEST_SCRIPT_ARG}")
-    foreach(current_var ${script_args})
-        if ("${current_var}" MATCHES "^([^=]+)=(.+)$")
-            set("${CMAKE_MATCH_1}" "${CMAKE_MATCH_2}")
-        endif()
-    endforeach()
-endif()
-
-# build generator must be defined
-if(NOT DEFINED BUILD_GENERATOR)
-  message(FATAL_ERROR "BUILD_GENERATOR must be defined - Unix, VS2013, VS201364, VS2012, or VS201264")
-else()
-  if(${BUILD_GENERATOR} STREQUAL "Unix")
-    set(CTEST_CMAKE_GENERATOR "Unix Makefiles")
-  elseif(${BUILD_GENERATOR} STREQUAL "VS2015")
-    set(CTEST_CMAKE_GENERATOR "Visual Studio 14 2015")
-  elseif(${BUILD_GENERATOR} STREQUAL "VS201564")
-    set(CTEST_CMAKE_GENERATOR "Visual Studio 14 2015 Win64")
-  elseif(${BUILD_GENERATOR} STREQUAL "VS2013")
-    set(CTEST_CMAKE_GENERATOR "Visual Studio 12 2013")
-  elseif(${BUILD_GENERATOR} STREQUAL "VS201364")
-    set(CTEST_CMAKE_GENERATOR "Visual Studio 12 2013 Win64")
-  elseif(${BUILD_GENERATOR} STREQUAL "VS2012")
-    set(CTEST_CMAKE_GENERATOR "Visual Studio 11 2012")
-  elseif(${BUILD_GENERATOR} STREQUAL "VS201264")
-    set(CTEST_CMAKE_GENERATOR "Visual Studio 11 2012 Win64")
-  else()
-    message(FATAL_ERROR "Invalid BUILD_GENERATOR must be - Unix, VS2013, VS201364, VS2012, or VS201264")
-  endif()
-endif()
-
-if(NOT DEFINED INSTALLDIR)
-  if(WIN32)
-    set(INSTALLDIR "C:\\Program\ Files\\myhdf5")
-  else()
-    set(INSTALLDIR "/usr/local/myhdf5")
-  endif()
-endif()
-if(NOT DEFINED CTEST_BUILD_CONFIGURATION)
-    set(CTEST_BUILD_CONFIGURATION "Release")
-endif()
-if(NOT DEFINED CTEST_SOURCE_NAME)
-    set(CTEST_SOURCE_NAME "hdf5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}")
-endif()
-if(NOT DEFINED STATIC_LIBRARIES)
-    set(STATICLIBRARIES "YES")
-endif()
-if(NOT DEFINED FORTRAN_LIBRARIES)
-    set(FORTRANLIBRARIES "NO")
-endif()
-
-set(CTEST_BINARY_NAME "build")
-set(CTEST_DASHBOARD_ROOT "${CTEST_SCRIPT_DIRECTORY}")
-if(WIN32)
-  set(CTEST_SOURCE_DIRECTORY "${CTEST_DASHBOARD_ROOT}\\${CTEST_SOURCE_NAME}")
-  set(CTEST_BINARY_DIRECTORY "${CTEST_DASHBOARD_ROOT}\\${CTEST_BINARY_NAME}")
-else()
-  set(CTEST_SOURCE_DIRECTORY "${CTEST_DASHBOARD_ROOT}/${CTEST_SOURCE_NAME}")
-  set(CTEST_BINARY_DIRECTORY "${CTEST_DASHBOARD_ROOT}/${CTEST_BINARY_NAME}")
-endif()
-
-###################################################################
-#########       Following describes compiler           ############
-if(WIN32)
-  set(SITE_OS_NAME "Windows")
-  set(SITE_OS_VERSION "WIN7")
-  if(${BUILD_GENERATOR} STREQUAL "VS201564")
-    set(SITE_OS_BITS "64")
-    set(SITE_COMPILER_NAME "vs2015")
-    set(SITE_COMPILER_VERSION "14")
-  elseif(${BUILD_GENERATOR} STREQUAL "VS2015")
-    set(SITE_OS_BITS "32")
-    set(SITE_COMPILER_NAME "vs2015")
-    set(SITE_COMPILER_VERSION "14")
-  elseif(${BUILD_GENERATOR} STREQUAL "VS201364")
-    set(SITE_OS_BITS "64")
-    set(SITE_COMPILER_NAME "vs2013")
-    set(SITE_COMPILER_VERSION "12")
-  elseif(${BUILD_GENERATOR} STREQUAL "VS2013")
-    set(SITE_OS_BITS "32")
-    set(SITE_COMPILER_NAME "vs2013")
-    set(SITE_COMPILER_VERSION "12")
-  elseif(${BUILD_GENERATOR} STREQUAL "VS201264")
-    set(SITE_OS_BITS "64")
-    set(SITE_COMPILER_NAME "vs2012")
-    set(SITE_COMPILER_VERSION "11")
-  elseif(${BUILD_GENERATOR} STREQUAL "VS2012")
-    set(SITE_OS_BITS "32")
-    set(SITE_COMPILER_NAME "vs2012")
-    set(SITE_COMPILER_VERSION "11")
-  endif()
-##  Set the following to unique id your computer  ##
-  set(CTEST_SITE "WIN7${BUILD_GENERATOR}.XXXX")
-else()
-##  Set the following to unique id your computer  ##
-  if(APPLE)
-    set(CTEST_SITE "MAC.XXXX")
-  else()
-    set(CTEST_SITE "LINUX.XXXX")
-  endif()
-endif()
-###################################################################
-
-###################################################################
-#########       Following is for submission to CDash   ############
-###################################################################
-set(MODEL "Experimental")
-###################################################################
-
-###################################################################
-#####       Following controls CDash submission               #####
-#set(LOCAL_SUBMIT "TRUE")
-#####       Following controls test process                   #####
-#set(LOCAL_SKIP_TEST "TRUE")
-#set(LOCAL_MEMCHECK_TEST "TRUE")
-#set(LOCAL_COVERAGE_TEST "TRUE")
-#####       Following controls cpack command                  #####
-#set(LOCAL_NO_PACKAGE "TRUE")
-#####       Following controls source update                  #####
-#set(LOCAL_UPDATE "TRUE")
-set(REPOSITORY_URL "http://svn.hdfgroup.uiuc.edu/hdf5/branches/hdf5_1_8_16")
-#uncomment to use a compressed source file: *.tar on linux or mac *.zip on windows
-#set(CTEST_USE_TAR_SOURCE "${CTEST_SOURCE_VERSION}")
-###################################################################
-
-###################################################################
-####  Change default configuration of options in config/cmake/cacheinit.cmake file ###
-####  format: set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DXXX:YY=ZZZZ")
-
-###################################################################
-if(${STATICLIBRARIES})
-  set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=OFF")
-  #########       Following describes computer           ############
-  ## following is optional to describe build                       ##
-  set(SITE_BUILDNAME_SUFFIX "STATIC")
-endif()
-###################################################################
-
-### uncomment/comment and change the following lines for other configuration options
-
-####      ext libraries       ####
-### ext libs from tgz
-set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ALLOW_EXTERNAL_SUPPORT:STRING=TGZ -DTGZPATH:PATH=${CTEST_SCRIPT_DIRECTORY}")
-### ext libs from svn
-#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ALLOW_EXTERNAL_SUPPORT:STRING=SVN")
-### ext libs on system
-#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DZLIB_LIBRARY:FILEPATH=some_location/lib/zlib.lib -DZLIB_INCLUDE_DIR:PATH=some_location/include")
-#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DSZIP_LIBRARY:FILEPATH=some_location/lib/szlib.lib -DSZIP_INCLUDE_DIR:PATH=some_location/include")
-### disable ext libs building
-#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=OFF")
-#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF")
-#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=OFF")
-####      fortran       ####
-if(${FORTRANLIBRARIES})
-  set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=ON")
-  ### enable Fortran 2003 depends on HDF5_BUILD_FORTRAN
-  set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_F2003:BOOL=ON")
-else()
-  set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF")
-  ### enable Fortran 2003 depends on HDF5_BUILD_FORTRAN
-  set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_F2003:BOOL=OFF")
-endif()
-
-### disable test program builds
-#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DBUILD_TESTING:BOOL=OFF")
-
-### disable packaging
-#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_NO_PACKAGES:BOOL=ON")
-### Create install package with external libraries (szip, zlib, jpeg)
-set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_PACKAGE_EXTLIBS:BOOL=ON")
-
-### change install prefix
-set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DCMAKE_INSTALL_PREFIX:PATH=${INSTALLDIR}")
-
-###################################################################
-
-if(WIN32)
-  include(${CTEST_SCRIPT_DIRECTORY}\\CTestScript.cmake)
-  if(EXISTS "${CTEST_BINARY_DIRECTORY}\\HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}.exe")
-    file(COPY "${CTEST_BINARY_DIRECTORY}\\HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}.exe" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
-  endif()
-  if(EXISTS "${CTEST_BINARY_DIRECTORY}\\HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}.msi")
-    file(COPY "${CTEST_BINARY_DIRECTORY}\\HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}.msi" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
-  endif()
-  if(EXISTS "${CTEST_BINARY_DIRECTORY}\\HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}.zip")
-    file(COPY "${CTEST_BINARY_DIRECTORY}\\HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}.zip" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
-  endif()
-else()
-  include(${CTEST_SCRIPT_DIRECTORY}/CTestScript.cmake)
-  if(APPLE)
-    if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Darwin.dmg")
-      file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Darwin.dmg" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
-    endif()
-    if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Darwin.tar.gz")
-      file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Darwin.tar.gz" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
-    endif()
-    if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Darwin.sh")
-      file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Darwin.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
-    endif()
-  else()
-    if(CYGWIN)
-      if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-CYGWIN.sh")
-        file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-CYGWIN.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
-      endif()
-      if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-CYGWIN.tar.gz")
-        file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-CYGWIN.tar.gz" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
-      endif()
-    else()
-      if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Linux.sh")
-        file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Linux.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
-      endif()
-      if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Linux.tar.gz")
-        file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Linux.tar.gz" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
-      endif()
-    endif()
-  endif()
-endif()
diff --git a/config/cmake/scripts/HDF5config.cmake b/config/cmake/scripts/HDF5config.cmake
new file mode 100755
index 0000000..8bcc56b
--- /dev/null
+++ b/config/cmake/scripts/HDF5config.cmake
@@ -0,0 +1,257 @@
+#############################################################################################
+### ${CTEST_SCRIPT_ARG} is of the form OPTION=VALUE                                       ###
+### BUILD_GENERATOR required [Unix, VS2015, VS201564, VS2013, VS201364, VS2012, VS201264] ###
+### ctest -S HDF5config.cmake,BUILD_GENERATOR=VS201264 -C Release -V -O hdf519.log        ###
+#############################################################################################
+
+cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
+############################################################################
+# Usage:
+#     ctest -S HDF518config.cmake,OPTION=VALUE -C Release -VV -O test.log
+# where valid options for OPTION are:
+#     BUILD_GENERATOR - The cmake build generator:
+#            Unix    * Unix Makefiles
+#            VS2015    * Visual Studio 14 2015
+#            VS201564 * Visual Studio 14 2015 Win64
+#            VS2013    * Visual Studio 12 2013
+#            VS201364 * Visual Studio 12 2013 Win64
+#            VS2012    * Visual Studio 11 2012
+#            VS201264 * Visual Studio 11 2012 Win64
+#
+#     INSTALLDIR  -  root folder where hdf5 is installed
+#     CTEST_BUILD_CONFIGURATION  - Release, Debug, etc
+#     CTEST_SOURCE_NAME  -  source folder
+#     STATIC_LIBRARIES  -  Build/use static libraries
+#     FORTRAN_LIBRARIES -  Build/use fortran libraries
+#     NO_MAC_FORTRAN  - Yes to be SHARED on a Mac
+##############################################################################
+
+set(CTEST_SOURCE_VERSION 1.9)
+set(CTEST_SOURCE_VERSEXT "")
+
+##############################################################################
+# handle input parameters to script.
+#BUILD_GENERATOR - which CMake generator to use, required
+#INSTALLDIR - HDF5-1.9 root folder
+#CTEST_BUILD_CONFIGURATION - Release, Debug, RelWithDebInfo
+#CTEST_SOURCE_NAME - name of source folder; HDF5-1.9
+#STATIC_LIBRARIES - Default is YES
+#FORTRAN_LIBRARIES - Default is NO
+#NO_MAC_FORTRAN - set to TRUE to allow shared libs on a Mac
+if(DEFINED CTEST_SCRIPT_ARG)
+    # transform ctest script arguments of the form
+    # script.ctest,var1=value1,var2=value2
+    # to variables with the respective names set to the respective values
+    string(REPLACE "," ";" script_args "${CTEST_SCRIPT_ARG}")
+    foreach(current_var ${script_args})
+        if ("${current_var}" MATCHES "^([^=]+)=(.+)$")
+            set("${CMAKE_MATCH_1}" "${CMAKE_MATCH_2}")
+        endif()
+    endforeach()
+endif()
+
+# build generator must be defined
+if(NOT DEFINED BUILD_GENERATOR)
+  message(FATAL_ERROR "BUILD_GENERATOR must be defined - Unix, VS2015, VS201564, VS2013, VS201364, VS2012, or VS201264")
+else()
+  if(${BUILD_GENERATOR} STREQUAL "Unix")
+    set(CTEST_CMAKE_GENERATOR "Unix Makefiles")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS2015")
+    set(CTEST_CMAKE_GENERATOR "Visual Studio 14 2015")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS201564")
+    set(CTEST_CMAKE_GENERATOR "Visual Studio 14 2015 Win64")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS2013")
+    set(CTEST_CMAKE_GENERATOR "Visual Studio 12 2013")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS201364")
+    set(CTEST_CMAKE_GENERATOR "Visual Studio 12 2013 Win64")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS2012")
+    set(CTEST_CMAKE_GENERATOR "Visual Studio 11 2012")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS201264")
+    set(CTEST_CMAKE_GENERATOR "Visual Studio 11 2012 Win64")
+  else()
+    message(FATAL_ERROR "Invalid BUILD_GENERATOR must be - Unix, VS2015, VS201564, VS2013, VS201364, VS2012, or VS201264")
+  endif()
+endif()
+
+if(NOT DEFINED INSTALLDIR)
+  if(WIN32)
+    set(INSTALLDIR "C:\\Program\ Files\\myhdf5")
+  else()
+    set(INSTALLDIR "/usr/local/myhdf5")
+  endif()
+endif()
+if(NOT DEFINED CTEST_BUILD_CONFIGURATION)
+    set(CTEST_BUILD_CONFIGURATION "Release")
+endif()
+if(NOT DEFINED CTEST_SOURCE_NAME)
+    set(CTEST_SOURCE_NAME "hdf5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}")
+endif()
+if(NOT DEFINED STATIC_LIBRARIES)
+    set(STATICLIBRARIES "YES")
+endif()
+if(NOT DEFINED FORTRAN_LIBRARIES)
+    set(FORTRANLIBRARIES "NO")
+endif()
+
+set(CTEST_BINARY_NAME "build")
+set(CTEST_DASHBOARD_ROOT "${CTEST_SCRIPT_DIRECTORY}")
+if(WIN32)
+  set(CTEST_SOURCE_DIRECTORY "${CTEST_DASHBOARD_ROOT}\\${CTEST_SOURCE_NAME}")
+  set(CTEST_BINARY_DIRECTORY "${CTEST_DASHBOARD_ROOT}\\${CTEST_BINARY_NAME}")
+else()
+  set(CTEST_SOURCE_DIRECTORY "${CTEST_DASHBOARD_ROOT}/${CTEST_SOURCE_NAME}")
+  set(CTEST_BINARY_DIRECTORY "${CTEST_DASHBOARD_ROOT}/${CTEST_BINARY_NAME}")
+endif()
+
+###################################################################
+#########       Following describes compiler           ############
+if(WIN32)
+  set(SITE_OS_NAME "Windows")
+  set(SITE_OS_VERSION "WIN7")
+  if(${BUILD_GENERATOR} STREQUAL "VS201564")
+    set(SITE_OS_BITS "64")
+    set(SITE_COMPILER_NAME "vs2015")
+    set(SITE_COMPILER_VERSION "14")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS2015")
+    set(SITE_OS_BITS "32")
+    set(SITE_COMPILER_NAME "vs2015")
+    set(SITE_COMPILER_VERSION "14")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS201364")
+    set(SITE_OS_BITS "64")
+    set(SITE_COMPILER_NAME "vs2013")
+    set(SITE_COMPILER_VERSION "12")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS2013")
+    set(SITE_OS_BITS "32")
+    set(SITE_COMPILER_NAME "vs2013")
+    set(SITE_COMPILER_VERSION "12")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS201264")
+    set(SITE_OS_BITS "64")
+    set(SITE_COMPILER_NAME "vs2012")
+    set(SITE_COMPILER_VERSION "11")
+  elseif(${BUILD_GENERATOR} STREQUAL "VS2012")
+    set(SITE_OS_BITS "32")
+    set(SITE_COMPILER_NAME "vs2012")
+    set(SITE_COMPILER_VERSION "11")
+  endif()
+##  Set the following to unique id your computer  ##
+  set(CTEST_SITE "WIN7${BUILD_GENERATOR}.XXXX")
+else()
+##  Set the following to unique id your computer  ##
+  if(APPLE)
+    set(CTEST_SITE "MAC.XXXX")
+  else()
+    set(CTEST_SITE "LINUX.XXXX")
+  endif()
+endif()
+###################################################################
+
+###################################################################
+#########       Following is for submission to CDash   ############
+###################################################################
+set(MODEL "Experimental")
+###################################################################
+
+###################################################################
+#####       Following controls CDash submission               #####
+#set(LOCAL_SUBMIT "TRUE")
+#####       Following controls test process                   #####
+#set(LOCAL_SKIP_TEST "TRUE")
+#set(LOCAL_MEMCHECK_TEST "TRUE")
+#set(LOCAL_COVERAGE_TEST "TRUE")
+#####       Following controls cpack command                  #####
+#set(LOCAL_NO_PACKAGE "TRUE")
+#####       Following controls source update                  #####
+#set(LOCAL_UPDATE "TRUE")
+set(REPOSITORY_URL "http://svn.hdfgroup.uiuc.edu/hdf5/trunk")
+#uncomment to use a compressed source file: *.tar on linux or mac *.zip on windows
+#set(CTEST_USE_TAR_SOURCE "${CTEST_SOURCE_VERSION}")
+###################################################################
+
+###################################################################
+####  Change default configuration of options in config/cmake/cacheinit.cmake file ###
+####  format: set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DXXX:YY=ZZZZ")
+
+###################################################################
+if(${STATICLIBRARIES})
+  set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=OFF")
+  #########       Following describes computer           ############
+  ## following is optional to describe build                       ##
+  set(SITE_BUILDNAME_SUFFIX "STATIC")
+endif()
+###################################################################
+
+### uncomment/comment and change the following lines for other configuration options
+
+####      ext libraries       ####
+### ext libs from tgz
+set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ALLOW_EXTERNAL_SUPPORT:STRING=TGZ -DTGZPATH:PATH=${CTEST_SCRIPT_DIRECTORY}")
+### ext libs from svn
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ALLOW_EXTERNAL_SUPPORT:STRING=SVN")
+### ext libs on system
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DZLIB_LIBRARY:FILEPATH=some_location/lib/zlib.lib -DZLIB_INCLUDE_DIR:PATH=some_location/include")
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DSZIP_LIBRARY:FILEPATH=some_location/lib/szlib.lib -DSZIP_INCLUDE_DIR:PATH=some_location/include")
+### disable ext libs building
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=OFF")
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF")
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=OFF")
+####      fortran       ####
+if(${FORTRANLIBRARIES})
+  set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=ON")
+else()
+  set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF")
+endif()
+
+### disable test program builds
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DBUILD_TESTING:BOOL=OFF")
+
+### disable packaging
+#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_NO_PACKAGES:BOOL=ON")
+### Create install package with external libraries (szip, zlib, jpeg)
+set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_PACKAGE_EXTLIBS:BOOL=ON")
+
+### change install prefix
+set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DCMAKE_INSTALL_PREFIX:PATH=${INSTALLDIR}")
+
+###################################################################
+
+if(WIN32)
+  include(${CTEST_SCRIPT_DIRECTORY}\\CTestScript.cmake)
+  if(EXISTS "${CTEST_BINARY_DIRECTORY}\\HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}.exe")
+    file(COPY "${CTEST_BINARY_DIRECTORY}\\HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}.exe" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+  endif()
+  if(EXISTS "${CTEST_BINARY_DIRECTORY}\\HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}.msi")
+    file(COPY "${CTEST_BINARY_DIRECTORY}\\HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}.msi" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+  endif()
+  if(EXISTS "${CTEST_BINARY_DIRECTORY}\\HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}.zip")
+    file(COPY "${CTEST_BINARY_DIRECTORY}\\HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-win${SITE_OS_BITS}.zip" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+  endif()
+else()
+  include(${CTEST_SCRIPT_DIRECTORY}/CTestScript.cmake)
+  if(APPLE)
+    if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Darwin.dmg")
+      file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Darwin.dmg" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+    endif()
+    if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Darwin.tar.gz")
+      file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Darwin.tar.gz" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+    endif()
+    if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Darwin.sh")
+      file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Darwin.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+    endif()
+  else()
+    if(CYGWIN)
+      if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-CYGWIN.sh")
+        file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-CYGWIN.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+      endif()
+      if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-CYGWIN.tar.gz")
+        file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-CYGWIN.tar.gz" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+      endif()
+    else()
+      if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Linux.sh")
+        file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Linux.sh" DESTINATION ${CTEST_SCRIPT_DIRECTORY})
+      endif()
+      if(EXISTS "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Linux.tar.gz")
+        file(COPY "${CTEST_BINARY_DIRECTORY}/HDF5-${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}-Linux.tar.gz" DESTINATION  ${CTEST_SCRIPT_DIRECTORY})
+      endif()
+    endif()
+  endif()
+endif()
diff --git a/config/cmake_ext_mod/ConfigureChecks.cmake b/config/cmake_ext_mod/ConfigureChecks.cmake
index fd502e5..cfda66b 100644
--- a/config/cmake_ext_mod/ConfigureChecks.cmake
+++ b/config/cmake_ext_mod/ConfigureChecks.cmake
@@ -262,27 +262,23 @@ set (LINUX_LFS 0)
 set (HDF_EXTRA_C_FLAGS)
 set (HDF_EXTRA_FLAGS)
 if (NOT WINDOWS)
-  if (NOT ${HDF_PREFIX}_HAVE_SOLARIS)
+  # Might want to check explicitly for Linux and possibly Cygwin
+  # instead of checking for not Solaris or Darwin.
+  if (NOT ${HDF_PREFIX}_HAVE_SOLARIS AND NOT ${HDF_PREFIX}_HAVE_DARWIN)
   # Linux Specific flags
   # This was originally defined as _POSIX_SOURCE which was updated to
   # _POSIX_C_SOURCE=199506L to expose a greater amount of POSIX
   # functionality so clock_gettime and CLOCK_MONOTONIC are defined
-  # correctly.
+  # correctly. This was later updated to 200112L so that
+  # posix_memalign() is visible for the direct VFD code on Linux
+  # systems.
   # POSIX feature information can be found in the gcc manual at:
   # http://www.gnu.org/s/libc/manual/html_node/Feature-Test-Macros.html
-  set (HDF_EXTRA_C_FLAGS -D_POSIX_C_SOURCE=199506L)
-  # _BSD_SOURCE deprecated in GLIBC >= 2.20
-  TRY_RUN (HAVE_DEFAULT_SOURCE_RUN HAVE_DEFAULT_SOURCE_COMPILE
-        ${CMAKE_BINARY_DIR}
-        ${HDF_RESOURCES_EXT_DIR}/HDFTests.c
-        CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=-DHAVE_DEFAULT_SOURCE
-        OUTPUT_VARIABLE OUTPUT
-    )
-  if (HAVE_DEFAULT_SOURCE_COMPILE AND HAVE_DEFAULT_SOURCE_RUN)
-    set (HDF_EXTRA_FLAGS -D_DEFAULT_SOURCE)
-  else (HAVE_DEFAULT_SOURCE_COMPILE AND HAVE_DEFAULT_SOURCE_RUN)
-    set (HDF_EXTRA_FLAGS -D_BSD_SOURCE)
-  endif (HAVE_DEFAULT_SOURCE_COMPILE AND HAVE_DEFAULT_SOURCE_RUN)
+  set (HDF_EXTRA_C_FLAGS -D_POSIX_C_SOURCE=200112L)
+
+  # Need to add this so that O_DIRECT is visible for the direct
+  # VFD on Linux systems.
+  set (HDF_EXTRA_C_FLAGS -D_GNU_SOURCE)
 
   option (HDF_ENABLE_LARGE_FILE "Enable support for large (64-bit) files on Linux." ON)
   if (HDF_ENABLE_LARGE_FILE)
@@ -293,6 +289,11 @@ if (NOT WINDOWS)
         CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=-DTEST_LFS_WORKS
         OUTPUT_VARIABLE OUTPUT
     )
+
+    # The LARGEFILE definitions were from the transition period
+    # and are probably no longer needed. The FILE_OFFSET_BITS
+    # check should be generalized for all POSIX systems as it
+    # is in the Autotools.
     if (TEST_LFS_WORKS_COMPILE)
       if (TEST_LFS_WORKS_RUN  MATCHES 0)
         set (TEST_LFS_WORKS 1 CACHE INTERNAL ${msg})
@@ -315,7 +316,7 @@ if (NOT WINDOWS)
     endif (TEST_LFS_WORKS_COMPILE)
   endif (HDF_ENABLE_LARGE_FILE)
   set (CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} ${HDF_EXTRA_FLAGS})
-  endif (NOT ${HDF_PREFIX}_HAVE_SOLARIS)
+  endif (NOT ${HDF_PREFIX}_HAVE_SOLARIS AND NOT ${HDF_PREFIX}_HAVE_DARWIN)
 endif (NOT WINDOWS)
 
 add_definitions (${HDF_EXTRA_FLAGS})
@@ -489,6 +490,8 @@ endif (NOT WINDOWS)
 # Check for some functions that are used
 #
 CHECK_FUNCTION_EXISTS (alarm             ${HDF_PREFIX}_HAVE_ALARM)
+CHECK_FUNCTION_EXISTS (fcntl             ${HDF_PREFIX}_HAVE_FCNTL)
+CHECK_FUNCTION_EXISTS (flock             ${HDF_PREFIX}_HAVE_FLOCK)
 CHECK_FUNCTION_EXISTS (fork              ${HDF_PREFIX}_HAVE_FORK)
 CHECK_FUNCTION_EXISTS (frexpf            ${HDF_PREFIX}_HAVE_FREXPF)
 CHECK_FUNCTION_EXISTS (frexpl            ${HDF_PREFIX}_HAVE_FREXPL)
diff --git a/config/conclude_fc.am b/config/conclude_fc.am
new file mode 100644
index 0000000..d9e7b56
--- /dev/null
+++ b/config/conclude_fc.am
@@ -0,0 +1,33 @@
+## config/conclude_fc.am
+## (Use double hashes for copyright notice so that automake treats it as
+## comments and does not pass it to Makefile.in)
+## Copyright by The HDF Group.
+## Copyright by the Board of Trustees of the University of Illinois.
+## All rights reserved.
+##
+## This file is part of HDF5.  The full HDF5 copyright notice, including
+## terms governing use, modification, and redistribution, is contained in
+## the files COPYING and Copyright.html.  COPYING can be found at the root
+## of the source code distribution tree; Copyright.html can be found at the
+## root level of an installed copy of the electronic HDF5 document set and
+## is linked from the top-level documents page.  It can also be found at
+## http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+## access to either file, you may request a copy from help at hdfgroup.org.
+
+
+## Textually included at the end of the Fortran HDF5 Makefiles.am.
+
+# Makefile.am include fragment with Fortran helper rules and macros.
+
+# AM_FCCPPFLAGS, FCCPPFLAGS are currently not used.
+
+PPFCCOMPILE = $(FC) $(FCDEFS) $(DEFAULT_INCLUDES)  $(FCINCLUDES) $(AM_FCCPPFLAGS) $(FCCPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)
+LTPPFCCOMPILE = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(PPFCCOMPILE)
+
+# Treat all .f90 and .F90 files as preprocessed Fortran.
+.f90.o:
+	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+.F90.o:
+	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+
+include $(top_srcdir)/config/conclude.am
diff --git a/config/lt_vers.am b/config/lt_vers.am
index 0ab7b2b..1c45e3f 100644
--- a/config/lt_vers.am
+++ b/config/lt_vers.am
@@ -18,9 +18,9 @@
 # See libtool versioning documentation online.
 # After making changes, run bin/reconfigure to update other configure related
 # files like Makefile.in.
-LT_VERS_INTERFACE = 11
-LT_VERS_REVISION = 0
-LT_VERS_AGE = 1
+LT_VERS_INTERFACE = 100
+LT_VERS_REVISION = 900
+LT_VERS_AGE = 0
 
 ## If the API changes *at all*, increment LT_VERS_INTERFACE and
 ## reset LT_VERS_REVISION to 0.
@@ -44,30 +44,6 @@ LT_VERS_AGE = 1
 ## bin/h5vers, don't move LT_VERS_REVISION from the fourth line
 ## without also editing the script!
 
-## Version numbers for wrapper shared library files.
-LT_CXX_VERS_INTERFACE = 11
-LT_CXX_VERS_REVISION = 0
-LT_CXX_VERS_AGE = 0
-
-LT_F_VERS_INTERFACE = 10
-LT_F_VERS_REVISION = 2
-LT_F_VERS_AGE = 0
-
-LT_HL_VERS_INTERFACE = 10
-LT_HL_VERS_REVISION = 2
-LT_HL_VERS_AGE = 0
-
-LT_HL_CXX_VERS_INTERFACE = 11
-LT_HL_CXX_VERS_REVISION = 0
-LT_HL_CXX_VERS_AGE = 0
-
-LT_HL_F_VERS_INTERFACE = 10
-LT_HL_F_VERS_REVISION = 2
-LT_HL_F_VERS_AGE = 0
-
-LT_TOOLS_VERS_INTERFACE = 10
-LT_TOOLS_VERS_REVISION = 2
-LT_TOOLS_VERS_AGE = 0
 
 # Copyright by The HDF Group.
 # Copyright by the Board of Trustees of the University of Illinois.
diff --git a/config/pgi-fflags b/config/pgi-fflags
index 6cb8930..8e574e4 100644
--- a/config/pgi-fflags
+++ b/config/pgi-fflags
@@ -69,6 +69,7 @@ if test "X-pgf90" = "X-$f9x_vendor"; then
 
     # General
     FC_BASENAME=pgf90
+    Fortran_COMPILER_ID=PGI
     F9XSUFFIXFLAG=""
     FSEARCH_DIRS=""
     # Uncomment the following to add something specific for FCFLAGS.
diff --git a/configure b/configure
index 89151b5..a20e69e 100755
--- a/configure
+++ b/configure
@@ -1,7 +1,7 @@
 #! /bin/sh
-# From configure.ac Id: configure.ac 28279 2015-11-04 22:29:54Z lrknox .
+# From configure.ac Id: configure.ac 22697 2012-08-19 14:35:47Z hdftest .
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for HDF5 1.8.16.
+# Generated by GNU Autoconf 2.69 for HDF5 1.10.0-alpha0.
 #
 # Report bugs to <help at hdfgroup.org>.
 #
@@ -199,6 +199,7 @@ test -x / || exit 1"
   as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
   eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
   test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1
 
   test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
     ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
@@ -206,8 +207,7 @@ test -x / || exit 1"
     ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
     PATH=/empty FPATH=/empty; export PATH FPATH
     test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
-      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
-test \$(( 1 + 1 )) = 2 || exit 1"
+      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1"
   if (eval "$as_required") 2>/dev/null; then :
   as_have_required=yes
 else
@@ -591,8 +591,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='HDF5'
 PACKAGE_TARNAME='hdf5'
-PACKAGE_VERSION='1.8.16'
-PACKAGE_STRING='HDF5 1.8.16'
+PACKAGE_VERSION='1.10.0-alpha0'
+PACKAGE_STRING='HDF5 1.10.0-alpha0'
 PACKAGE_BUGREPORT='help at hdfgroup.org'
 PACKAGE_URL=''
 
@@ -678,11 +678,9 @@ BUILD_SHARED_SZIP_CONDITIONAL_TRUE
 LL_PATH
 USE_FILTER_SZIP
 USE_FILTER_DEFLATE
-AM_MAKEFLAGS
 LT_STATIC_EXEC
 USE_PLUGINS_CONDITIONAL_FALSE
 USE_PLUGINS_CONDITIONAL_TRUE
-CPP
 OTOOL64
 OTOOL
 LIPO
@@ -699,8 +697,6 @@ ac_ct_DUMPBIN
 DUMPBIN
 LD
 FGREP
-EGREP
-GREP
 SED
 LIBTOOL
 FORTRAN_SHARED_CONDITIONAL_FALSE
@@ -713,7 +709,6 @@ PARALLEL
 TIME
 TR
 AR
-PERL
 HL_FOR
 HL
 CXXCPP
@@ -722,16 +717,26 @@ am__fastdepCXX_TRUE
 CXXDEPMODE
 ac_ct_CXX
 CXXFLAGS
-FORTRAN_DEFAULT_REALisDBLE_F_FALSE
-FORTRAN_DEFAULT_REALisDBLE_F_TRUE
-FORTRAN_2003_CONDITIONAL_F_FALSE
-FORTRAN_2003_CONDITIONAL_F_TRUE
-FORTRAN_HAVE_STORAGE_SIZE_FALSE
-FORTRAN_HAVE_STORAGE_SIZE_TRUE
-FORTRAN_HAVE_C_SIZEOF_FALSE
-FORTRAN_HAVE_C_SIZEOF_TRUE
-FORTRAN_HAVE_SIZEOF_FALSE
-FORTRAN_HAVE_SIZEOF_TRUE
+H5CONFIG_F_IKIND
+H5CONFIG_F_NUM_IKIND
+H5CONFIG_F_RKIND_SIZEOF
+H5CONFIG_F_RKIND
+H5CONFIG_F_NUM_RKIND
+FORTRAN_SIZEOF_LONG_DOUBLE
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE
+FORTRAN_HAVE_C_LONG_DOUBLE
+HAVE_Fortran_INTEGER_SIZEOF_16
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF
+PAC_FORTRAN_NATIVE_DOUBLE_KIND
+PAC_FORTRAN_NATIVE_REAL_SIZEOF
+PAC_FORTRAN_NATIVE_REAL_KIND
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF
+PAC_FORTRAN_NATIVE_INTEGER_KIND
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF
+PAC_FC_ALL_REAL_KINDS_SIZEOF
+PAC_FC_ALL_INTEGER_KINDS
+PAC_FC_MAX_REAL_PRECISION
+PAC_FC_ALL_REAL_KINDS
 FCLIBS
 F9XMODEXT
 F9XMODFLAG
@@ -748,8 +753,10 @@ HSIZE_T
 HADDR_T
 R_INTEGER
 R_LARGE
-HAVE_FORTRAN_2003
 HDF5_INTERFACES
+EGREP
+GREP
+CPP
 am__fastdepCC_FALSE
 am__fastdepCC_TRUE
 CCDEPMODE
@@ -766,6 +773,8 @@ ac_ct_CC
 LDFLAGS
 CFLAGS
 CC
+Fortran_COMPILER_ID
+PAC_C_MAX_REAL_PRECISION
 UNAME_INFO
 enable_static
 enable_shared
@@ -778,9 +787,7 @@ INSTRUMENT
 HDF5_HL
 CXX
 HDF_CXX
-FC2003
 FC
-HDF_FORTRAN2003
 HDF_FORTRAN
 STATIC_EXEC
 MPE
@@ -880,7 +887,6 @@ enable_maintainer_mode
 enable_dependency_tracking
 enable_unsupported
 enable_fortran
-enable_fortran2003
 enable_cxx
 enable_hl
 enable_shared
@@ -926,13 +932,13 @@ CFLAGS
 LDFLAGS
 LIBS
 CPPFLAGS
+CPP
 FC
 FCFLAGS
 CXX
 CXXFLAGS
 CCC
-CXXCPP
-CPP'
+CXXCPP'
 
 
 # Initialize some variables set by options.
@@ -1473,7 +1479,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures HDF5 1.8.16 to adapt to many kinds of systems.
+\`configure' configures HDF5 1.10.0-alpha0 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1543,7 +1549,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of HDF5 1.8.16:";;
+     short | recursive ) echo "Configuration of HDF5 1.10.0-alpha0:";;
    esac
   cat <<\_ACEOF
 
@@ -1561,9 +1567,7 @@ Optional Features:
   --disable-dependency-tracking
                           speeds up one-time build
   --enable-unsupported    Allow unsupported combinations of configure options
-  --enable-fortran        Compile the Fortran 90/95 interface [default=no]
-  --enable-fortran2003    Compile the Fortran 2003 interface, must also
-                          specify --enable-fortran [default=no]
+  --enable-fortran        Compile the Fortran interface [default=no]
   --enable-cxx            Compile the C++ interface [default=no]
   --enable-hl             Enable the high level library [default=yes]
   --enable-shared[=PKGS]  build shared libraries [default=yes]
@@ -1643,14 +1647,14 @@ Optional Packages:
   --with-szlib=DIR        Use szlib library for external szlib I/O filter
                           [default=no]
   --with-pthread=DIR      Specify alternative path to Pthreads library when
-                          thread-safe capability is built
+                          thread-safe capability is built.
   --with-mpe=DIR          Use MPE instrumentation [default=no]
   --with-default-plugindir=location
                           Specify default location for plugins
                           [default="/usr/local/hdf5/lib/plugin"]
   --with-default-api-version=(v16|v18|v110)
                           Specify default release version of public symbols
-                          [default=v18]
+                          [default=v110]
 
 Some influential environment variables:
   CC          C compiler command
@@ -1660,12 +1664,12 @@ Some influential environment variables:
   LIBS        libraries to pass to the linker, e.g. -l<library>
   CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
               you have headers in a nonstandard directory <include dir>
+  CPP         C preprocessor
   FC          Fortran compiler command
   FCFLAGS     Fortran compiler flags
   CXX         C++ compiler command
   CXXFLAGS    C++ compiler flags
   CXXCPP      C++ preprocessor
-  CPP         C preprocessor
 
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
@@ -1733,7 +1737,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-HDF5 configure 1.8.16
+HDF5 configure 1.10.0-alpha0
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1785,178 +1789,64 @@ fi
 
 } # ac_fn_c_try_compile
 
-# ac_fn_fc_try_compile LINENO
-# ---------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_fc_try_compile ()
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
+# -------------------------------------------
+# Tests whether TYPE exists after having included INCLUDES, setting cache
+# variable VAR accordingly.
+ac_fn_c_check_type ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
-  if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_fc_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
-  ac_retval=0
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_fc_try_compile
-
-# ac_fn_c_try_link LINENO
-# -----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_link ()
+  eval "$3=no"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
 {
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 test -x conftest$ac_exeext
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_link
-
-# ac_fn_fc_try_link LINENO
-# ------------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_fc_try_link ()
+if (sizeof ($2))
+	 return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
 {
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_fc_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 test -x conftest$ac_exeext
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
-fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_fc_try_link
+if (sizeof (($2)))
+	    return 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
 
-# ac_fn_cxx_try_compile LINENO
-# ----------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_compile ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext
-  if { { ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compile") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_cxx_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then :
-  ac_retval=0
 else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_retval=1
+  eval "$3=yes"
 fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
 
-} # ac_fn_cxx_try_compile
+} # ac_fn_c_check_type
 
-# ac_fn_cxx_try_cpp LINENO
-# ------------------------
+# ac_fn_c_try_cpp LINENO
+# ----------------------
 # Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_cpp ()
+ac_fn_c_try_cpp ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
   if { { ac_try="$ac_cpp conftest.$ac_ext"
@@ -1975,7 +1865,7 @@ $as_echo "$ac_try_echo"; } >&5
   fi
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; } > conftest.i && {
-	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        }; then :
   ac_retval=0
@@ -1988,15 +1878,15 @@ fi
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
   as_fn_set_status $ac_retval
 
-} # ac_fn_cxx_try_cpp
+} # ac_fn_c_try_cpp
 
-# ac_fn_cxx_try_link LINENO
-# -------------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded.
-ac_fn_cxx_try_link ()
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  rm -f conftest.$ac_objext conftest$ac_exeext
   if { { ac_try="$ac_link"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
@@ -2004,37 +1894,33 @@ case "(($ac_try" in
 esac
 eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
 $as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>conftest.err
+  (eval "$ac_link") 2>&5
   ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && {
-	 test -z "$ac_cxx_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext && {
-	 test "$cross_compiling" = yes ||
-	 test -x conftest$ac_exeext
-       }; then :
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
   ac_retval=0
 else
-  $as_echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-	ac_retval=1
+       ac_retval=$ac_status
 fi
-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
-  # interfere with the next link command; also delete a directory that is
-  # left behind by Apple's compiler.  We do this before executing the actions.
   rm -rf conftest.dSYM conftest_ipa8_conftest.oo
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
   as_fn_set_status $ac_retval
 
-} # ac_fn_cxx_try_link
+} # ac_fn_c_try_run
 
 # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
 # -------------------------------------------------------
@@ -2067,321 +1953,6 @@ $as_echo "$ac_res" >&6; }
 
 } # ac_fn_c_check_header_compile
 
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    grep -v '^ *+' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-    mv -f conftest.er1 conftest.err
-  fi
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } > conftest.i && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-    ac_retval=1
-fi
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_cpp
-
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if { { ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then :
-  ac_retval=0
-else
-  $as_echo "$as_me: program exited with status $ac_status" >&5
-       $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-       ac_retval=$ac_status
-fi
-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-  as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_run
-
-# ac_fn_c_check_func LINENO FUNC VAR
-# ----------------------------------
-# Tests whether FUNC exists, setting the cache variable VAR accordingly
-ac_fn_c_check_func ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
-#define $2 innocuous_$2
-
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $2 (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-
-#undef $2
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $2 ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined __stub_$2 || defined __stub___$2
-choke me
-#endif
-
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-return $2 ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_func
-
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  if eval \${$3+:} false; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
-  # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_header_compiler=yes
-else
-  ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <$2>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  ac_header_preproc=yes
-else
-  ac_header_preproc=no
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
-  yes:no: )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-    ;;
-  no:yes:* )
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## -------------------------------- ##
-## Report this to help at hdfgroup.org ##
-## -------------------------------- ##"
-     ) | sed "s/^/$as_me: WARNING:     /" >&2
-    ;;
-esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_mongrel
-
-# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
-# -------------------------------------------
-# Tests whether TYPE exists after having included INCLUDES, setting cache
-# variable VAR accordingly.
-ac_fn_c_check_type ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  eval "$3=no"
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-if (sizeof ($2))
-	 return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-if (sizeof (($2)))
-	    return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-
-else
-  eval "$3=yes"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_type
-
 # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
 # --------------------------------------------
 # Tries to find the compile-time value of EXPR in a program that includes
@@ -2395,14 +1966,6 @@ ac_fn_c_compute_int ()
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 $4
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
 int
 main ()
 {
@@ -2420,14 +1983,6 @@ if ac_fn_c_try_compile "$LINENO"; then :
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 $4
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
 int
 main ()
 {
@@ -2455,14 +2010,6 @@ else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 $4
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
 int
 main ()
 {
@@ -2480,14 +2027,6 @@ if ac_fn_c_try_compile "$LINENO"; then :
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 $4
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
 int
 main ()
 {
@@ -2523,14 +2062,6 @@ while test "x$ac_lo" != "x$ac_hi"; do
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 $4
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
 int
 main ()
 {
@@ -2561,14 +2092,6 @@ static long int longval () { return $2; }
 static unsigned long int ulongval () { return $2; }
 #include <stdio.h>
 #include <stdlib.h>
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
 int
 main ()
 {
@@ -2613,78 +2136,537 @@ rm -f conftest.val
 
 } # ac_fn_c_compute_int
 
-# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
-# ---------------------------------------------
-# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists, giving a warning if it cannot be compiled using
+# the include files in INCLUDES and setting the cache variable VAR
 # accordingly.
-ac_fn_c_check_decl ()
+ac_fn_c_check_header_mongrel ()
 {
   as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  as_decl_name=`echo $2|sed 's/ *(.*//'`
-  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
-$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+  if eval \${$3+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
 if eval \${$3+:} false; then :
   $as_echo_n "(cached) " >&6
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
 else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  # Is the header compilable?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
+$as_echo_n "checking $2 usability... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 $4
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-#ifndef $as_decl_name
-#ifdef __cplusplus
-  (void) $as_decl_use;
-#else
-  (void) $as_decl_name;
-#endif
-#endif
-
-  ;
-  return 0;
-}
+#include <$2>
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  eval "$3=yes"
+  ac_header_compiler=yes
 else
-  eval "$3=no"
+  ac_header_compiler=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
+
+# Is the header present?
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
+$as_echo_n "checking $2 presence... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <$2>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  ac_header_preproc=yes
+else
+  ac_header_preproc=no
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
+
+# So?  What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
+  yes:no: )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+    ;;
+  no:yes:* )
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
+( $as_echo "## -------------------------------- ##
+## Report this to help at hdfgroup.org ##
+## -------------------------------- ##"
+     ) | sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
+esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  eval "$3=\$ac_header_compiler"
 fi
 eval ac_res=\$$3
 	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
 $as_echo "$ac_res" >&6; }
+fi
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
-} # ac_fn_c_check_decl
-cat >config.log <<_ACEOF
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-
-It was created by HDF5 $as_me 1.8.16, which was
-generated by GNU Autoconf 2.69.  Invocation command line was
-
-  $ $0 $@
+} # ac_fn_c_check_header_mongrel
 
-_ACEOF
-exec 5>>config.log
+# ac_fn_fc_try_compile LINENO
+# ---------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_fc_try_compile ()
 {
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_fc_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
 
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_fc_try_compile
+
+# ac_fn_fc_try_link LINENO
+# ------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_fc_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_fc_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_fc_try_link
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_fc_try_run LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_fc_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_fc_try_run
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_cxx_try_cpp LINENO
+# ------------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_cpp
+
+# ac_fn_cxx_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 test -x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_link
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
+# ---------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_c_check_decl ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  as_decl_name=`echo $2|sed 's/ *(.*//'`
+  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+  (void) $as_decl_use;
+#else
+  (void) $as_decl_name;
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_decl
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by HDF5 $as_me 1.10.0-alpha0, which was
+generated by GNU Autoconf 2.69.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
 uname -r = `(uname -r) 2>/dev/null || echo unknown`
 uname -s = `(uname -s) 2>/dev/null || echo unknown`
 uname -v = `(uname -v) 2>/dev/null || echo unknown`
@@ -3019,6 +3001,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
+
 ac_config_headers="$ac_config_headers src/H5config.h"
 
 
@@ -3055,7 +3038,7 @@ ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
 
 ## AM_INIT_AUTOMAKE takes a list of options that should be applied to
 ## every Makefile.am when automake is run.
-am__api_version='1.14'
+am__api_version='1.15'
 
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
@@ -3227,8 +3210,8 @@ test "$program_suffix" != NONE &&
 ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
 program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
 
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
 
 if test x"${MISSING+set}" != xset; then
   case $am_aux_dir in
@@ -3247,7 +3230,7 @@ else
 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
 fi
 
-if test x"${install_sh}" != xset; then
+if test x"${install_sh+set}" != xset; then
   case $am_aux_dir in
   *\ * | *\	*)
     install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
@@ -3541,7 +3524,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='hdf5'
- VERSION='1.8.16'
+ VERSION='1.10.0-alpha0'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -3575,8 +3558,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 mkdir_p='$(MKDIR_P)'
 
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
 # Always define AMTAR for backward compatibility.  Yes, it's still used
 # in the wild :-(  We should find a proper way to deprecate it ...
 AMTAR='$${TAR-tar}'
@@ -3633,6 +3616,7 @@ END
     as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
   fi
 fi
+
 # Check whether --enable-silent-rules was given.
 if test "${enable_silent_rules+set}" = set; then :
   enableval=$enable_silent_rules;
@@ -3674,15 +3658,19 @@ AM_BACKSLASH='\'
 
 
 ## AM_MAINTAINER_MODE turns off "rebuild rules" that contain dependencies
-## for Makefiles, configure, src/H5config.h, etc.  If AM_MAINTAINER_MODE
-## is *not* included here, these files will be rebuilt if out of date.
-## This is a problem because if users try to build on a machine with
+## for Makefiles, configure, src/H5config.h, etc. If AM_MAINTAINER_MODE
+## is enabled, these files will be rebuilt if out of date. This is a
+## problem because if users try to build on a machine with
 ## the wrong versions of autoconf and automake, these files will be
 ## rebuilt with the wrong versions and bad things can happen.
 ## Also, CVS doesn't preserve dependencies between timestamps, so
 ## Makefiles will often think rebuilding needs to occur when it doesn't.
-## Developers should './configure --enable-maintainer-mode' to turn on
-## rebuild rules.
+##
+## By default, it is enabled. Users can configure with
+## --disable-maintainer-mode to prevent running the autotools.
+## AM_MAINTAINER_MODE([enable])
+##
+## Maintainer mode is disabled in releases.
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
@@ -3868,7 +3856,6 @@ $as_echo "done" >&6; }
 ## MPE: whether MPE option is enabled. Default no.
 ## STATIC_EXEC: whether static-exec is enabled. Default no.
 ## HDF_FORTRAN: whether Fortran is enabled. Default no.
-## HDF_FORTRAN2003: whether Fortran 2003 is enabled. Default no.
 ## FC: Fortran compiler.
 ## HDF_CXX: whether C++ is enabled. Default no.
 ## CXX: C++ compiler.
@@ -3876,6 +3863,7 @@ $as_echo "done" >&6; }
 ## INSTRUMENT: whether INSTRUMENT is enabled. No default set here.
 ## CODESTACK: whether CODESTACK is enabled. Default no.
 ## HAVE_DMALLOC: whether system has dmalloc support. Default no.
+## HAVE_FLOAT128: whether system has Quad-Precision Math Library. Default no.
 ## DIRECT_VFD: whether DIRECT_VFD is enabled. Default no.
 ## THREADSAFE: whether THREADSAFE is enabled. Default no.
 ## STATIC_SHARED: whether static and/or shared libraries are requested.
@@ -3887,9 +3875,7 @@ $as_echo "done" >&6; }
  MPE=no
  STATIC_EXEC=no
  HDF_FORTRAN=no
- HDF_FORTRAN2003=no
  HDF_FORTRAN=no
- HDF_FORTRAN2003=no
  HDF_CXX=no
  HDF_CXX=no
  HDF5_HL=yes
@@ -3903,6 +3889,9 @@ $as_echo "done" >&6; }
 
  UNAME_INFO=`uname -a`
 
+
+Fortran_COMPILER_ID=none
+
 ## ----------------------------------------------------------------------
 ## Some platforms have broken basename, and/or xargs programs. Check
 ## that it actually does what it's supposed to do. Catch this early
@@ -5120,1583 +5109,1509 @@ $as_echo "yes" >&6; }
 esac
 
 ## ----------------------------------------------------------------------
-## Check if they would like the Fortran interface compiled
+## Data types and their sizes.
 ##
- HDF5_INTERFACES=""
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran interface enabled" >&5
-$as_echo_n "checking if Fortran interface enabled... " >&6; }
-# Check whether --enable-fortran was given.
-if test "${enable_fortran+set}" = set; then :
-  enableval=$enable_fortran; HDF_FORTRAN=$enableval
-fi
 
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
 
-if test "X$HDF_FORTRAN" = "Xyes"; then
-  echo "yes"
 else
-  echo "no"
+  # Broken: fails on valid input.
+continue
 fi
+rm -f conftest.err conftest.i conftest.$ac_ext
 
-
-## ----------------------------------------------------------------------
-## Check if they would like the Fortran 2003 interface compiled
-##
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran 2003 interface enabled" >&5
-$as_echo_n "checking if Fortran 2003 interface enabled... " >&6; }
-# Check whether --enable-fortran2003 was given.
-if test "${enable_fortran2003+set}" = set; then :
-  enableval=$enable_fortran2003; HDF_FORTRAN2003=$enableval
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
 fi
+rm -f conftest.err conftest.i conftest.$ac_ext
 
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
 
-## ----------------------------------------------------------------------
-## Check to make sure --enable-fortran is present if --enable-fortran2003
-## was specified
+    done
+    ac_cv_prog_CPP=$CPP
 
-if test "X$HDF_FORTRAN2003" = "Xyes" && test "X$HDF_FORTRAN" = "Xno"; then
-  echo "no"
-  as_fn_error $? "--enable-fortran must be used with --enable-fortran2003" "$LINENO" 5
+fi
+  CPP=$ac_cv_prog_CPP
 else
-  if test "X$HDF_FORTRAN2003" = "Xyes" && test "X$HDF_FORTRAN" = "Xyes"; then
-    echo "yes"
-  else
-    echo "no"
-  fi
+  ac_cv_prog_CPP=$CPP
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
 
-if test "X$HDF_FORTRAN" = "Xyes"; then
-
-   HDF_FORTRAN=yes
-
-
-  HDF5_INTERFACES="$HDF5_INTERFACES fortran"
-
-  ## --------------------------------------------------------------------
-  ## HDF5 integer variables for the H5fortran_types.f90 file.
-  ##
-
-
-
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
 
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
 
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
 
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
 
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-  ## --------------------------------------------------------------------
-  ## Fortran source extention
-  ##
-  ac_ext=${ac_fc_srcext-f}
-ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
-ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_fc_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_FC+:} false; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$FC"; then
-  ac_cv_prog_FC="$FC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_FC="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
   done
-IFS=$as_save_IFS
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
 
-fi
-fi
-FC=$ac_cv_prog_FC
-if test -n "$FC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5
-$as_echo "$FC" >&6; }
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  ac_cv_path_GREP=$GREP
 fi
 
-
-    test -n "$FC" && break
-  done
 fi
-if test -z "$FC"; then
-  ac_ct_FC=$FC
-  for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_FC+:} false; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$ac_ct_FC"; then
-  ac_cv_prog_ac_ct_FC="$ac_ct_FC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
     for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_FC="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
   done
-IFS=$as_save_IFS
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
 
-fi
-fi
-ac_ct_FC=$ac_cv_prog_ac_ct_FC
-if test -n "$ac_ct_FC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FC" >&5
-$as_echo "$ac_ct_FC" >&6; }
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  ac_cv_path_EGREP=$EGREP
 fi
 
-
-  test -n "$ac_ct_FC" && break
-done
-
-  if test "x$ac_ct_FC" = x; then
-    FC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    FC=$ac_ct_FC
-  fi
+   fi
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
 
 
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-  fi
-  rm -f conftest.er1 conftest.err
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-rm -f a.out
-
-# If we don't use `.F' as extension, the preprocessor is not run on the
-# input file.  (Note that this only needs to work for GNU compilers.)
-ac_save_ext=$ac_ext
-ac_ext=F
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran compiler" >&5
-$as_echo_n "checking whether we are using the GNU Fortran compiler... " >&6; }
-if ${ac_cv_fc_compiler_gnu+:} false; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  cat > conftest.$ac_ext <<_ACEOF
-      program main
-#ifndef __GNUC__
-       choke me
-#endif
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
 
-      end
+int
+main ()
+{
+
+  ;
+  return 0;
+}
 _ACEOF
-if ac_fn_fc_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
 else
-  ac_compiler_gnu=no
+  ac_cv_header_stdc=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_fc_compiler_gnu=$ac_compiler_gnu
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_compiler_gnu" >&5
-$as_echo "$ac_cv_fc_compiler_gnu" >&6; }
-ac_ext=$ac_save_ext
-ac_test_FCFLAGS=${FCFLAGS+set}
-ac_save_FCFLAGS=$FCFLAGS
-FCFLAGS=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $FC accepts -g" >&5
-$as_echo_n "checking whether $FC accepts -g... " >&6; }
-if ${ac_cv_prog_fc_g+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  FCFLAGS=-g
-cat > conftest.$ac_ext <<_ACEOF
-      program main
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
 
-      end
 _ACEOF
-if ac_fn_fc_try_compile "$LINENO"; then :
-  ac_cv_prog_fc_g=yes
-else
-  ac_cv_prog_fc_g=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_g" >&5
-$as_echo "$ac_cv_prog_fc_g" >&6; }
-if test "$ac_test_FCFLAGS" = set; then
-  FCFLAGS=$ac_save_FCFLAGS
-elif test $ac_cv_prog_fc_g = yes; then
-  if test "x$ac_cv_fc_compiler_gnu" = xyes; then
-    FCFLAGS="-g -O2"
-  else
-    FCFLAGS="-g"
-  fi
 else
-  if test "x$ac_cv_fc_compiler_gnu" = xyes; then
-    FCFLAGS="-O2"
-  else
-    FCFLAGS=
-  fi
+  ac_cv_header_stdc=no
 fi
+rm -f conftest*
 
-if test $ac_compiler_gnu = yes; then
-  GFC=yes
-else
-  GFC=
 fi
-ac_ext=${ac_fc_srcext-f}
-ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
-ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_fc_compiler_gnu
-
 
-ac_ext=${ac_fc_srcext-f}
-ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
-ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_fc_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran flag to compile .f90 files" >&5
-$as_echo_n "checking for Fortran flag to compile .f90 files... " >&6; }
-if ${ac_cv_fc_srcext_f90+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_ext=f90
-ac_fcflags_srcext_save=$ac_fcflags_srcext
-ac_fcflags_srcext=
-ac_cv_fc_srcext_f90=unknown
-case $ac_ext in #(
-  [fF]77) ac_try=f77;; #(
-  *) ac_try=f95;;
-esac
-for ac_flag in none -qsuffix=f=f90 -Tf "-x $ac_try"; do
-  test "x$ac_flag" != xnone && ac_fcflags_srcext="$ac_flag"
-  cat > conftest.$ac_ext <<_ACEOF
-      program main
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
 
-      end
 _ACEOF
-if ac_fn_fc_try_compile "$LINENO"; then :
-  ac_cv_fc_srcext_f90=$ac_flag; break
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest.$ac_objext conftest.f90
-ac_fcflags_srcext=$ac_fcflags_srcext_save
+rm -f conftest*
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_srcext_f90" >&5
-$as_echo "$ac_cv_fc_srcext_f90" >&6; }
-if test "x$ac_cv_fc_srcext_f90" = xunknown; then
-  as_fn_error $? "Fortran could not compile .f90 files" "$LINENO" 5
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
 else
-  ac_fc_srcext=f90
-  if test "x$ac_cv_fc_srcext_f90" = xnone; then
-    ac_fcflags_srcext=""
-    FCFLAGS_f90=""
-  else
-    ac_fcflags_srcext=$ac_cv_fc_srcext_f90
-    FCFLAGS_f90=$ac_cv_fc_srcext_f90
-  fi
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
 
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
 
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
 
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
 
+fi
 
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
 
-  ## --------------------------------------------------------------------
-  ## Check for a Fortran compiler and how to include modules.
-  ##
-  ac_ext=${ac_fc_srcext-f}
-ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
-ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_fc_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  for ac_prog in gfortran ifort pgf90 pathf90 pathf95 xlf90 xlf95 xlf2003 f90 epcf90 f95 fort lf95 g95 ifc efc gfc
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_FC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$FC"; then
-  ac_cv_prog_FC="$FC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_FC="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
 done
-  done
-IFS=$as_save_IFS
 
-fi
-fi
-FC=$ac_cv_prog_FC
-if test -n "$FC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5
-$as_echo "$FC" >&6; }
+
+ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default"
+if test "x$ac_cv_type_off_t" = xyes; then :
+
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
 
+cat >>confdefs.h <<_ACEOF
+#define off_t long int
+_ACEOF
 
-    test -n "$FC" && break
-  done
 fi
-if test -z "$FC"; then
-  ac_ct_FC=$FC
-  for ac_prog in gfortran ifort pgf90 pathf90 pathf95 xlf90 xlf95 xlf2003 f90 epcf90 f95 fort lf95 g95 ifc efc gfc
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_FC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_FC"; then
-  ac_cv_prog_ac_ct_FC="$ac_ct_FC" # Let the user override the test.
+
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes; then :
+
 else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_FC="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
+
+cat >>confdefs.h <<_ACEOF
+#define size_t unsigned long
+_ACEOF
 
 fi
+
+ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default"
+if test "x$ac_cv_type_ssize_t" = xyes; then :
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define ssize_t long
+_ACEOF
+
 fi
-ac_ct_FC=$ac_cv_prog_ac_ct_FC
-if test -n "$ac_ct_FC"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FC" >&5
-$as_echo "$ac_ct_FC" >&6; }
+
+ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
+if test "x$ac_cv_type_ptrdiff_t" = xyes; then :
+
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+
+cat >>confdefs.h <<_ACEOF
+#define ptrdiff_t long
+_ACEOF
+
 fi
 
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
+$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
+if ${ac_cv_c_bigendian+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_c_bigendian=unknown
+    # See if we're dealing with a universal compiler.
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifndef __APPLE_CC__
+	       not a universal capable compiler
+	     #endif
+	     typedef int dummy;
 
-  test -n "$ac_ct_FC" && break
-done
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
 
-  if test "x$ac_ct_FC" = x; then
-    FC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    FC=$ac_ct_FC
-  fi
+	# Check for potential -arch flags.  It is not universal unless
+	# there are at least two -arch flags with different values.
+	ac_arch=
+	ac_prev=
+	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
+	 if test -n "$ac_prev"; then
+	   case $ac_word in
+	     i?86 | x86_64 | ppc | ppc64)
+	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
+		 ac_arch=$ac_word
+	       else
+		 ac_cv_c_bigendian=universal
+		 break
+	       fi
+	       ;;
+	   esac
+	   ac_prev=
+	 elif test "x$ac_word" = "x-arch"; then
+	   ac_prev=arch
+	 fi
+       done
 fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if sys/param.h defines the BYTE_ORDER macro.
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+	     #include <sys/param.h>
 
+int
+main ()
+{
+#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
+		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
+		     && LITTLE_ENDIAN)
+	      bogus endian macros
+	     #endif
 
-# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran compiler version" >&5
-set X $ac_compile
-ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
-  { { ac_try="$ac_compiler $ac_option >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
-  ac_status=$?
-  if test -s conftest.err; then
-    sed '10a\
-... rest of stderr output deleted ...
-         10q' conftest.err >conftest.er1
-    cat conftest.er1 >&5
-  fi
-  rm -f conftest.er1 conftest.err
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-done
-rm -f a.out
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  # It does; now see whether it defined to BIG_ENDIAN or not.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+		#include <sys/param.h>
 
-# If we don't use `.F' as extension, the preprocessor is not run on the
-# input file.  (Note that this only needs to work for GNU compilers.)
-ac_save_ext=$ac_ext
-ac_ext=F
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran compiler" >&5
-$as_echo_n "checking whether we are using the GNU Fortran compiler... " >&6; }
-if ${ac_cv_fc_compiler_gnu+:} false; then :
-  $as_echo_n "(cached) " >&6
+int
+main ()
+{
+#if BYTE_ORDER != BIG_ENDIAN
+		 not big endian
+		#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_bigendian=yes
 else
-  cat > conftest.$ac_ext <<_ACEOF
-      program main
-#ifndef __GNUC__
-       choke me
-#endif
+  ac_cv_c_bigendian=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
 
-      end
+int
+main ()
+{
+#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
+	      bogus endian macros
+	     #endif
+
+  ;
+  return 0;
+}
 _ACEOF
-if ac_fn_fc_try_compile "$LINENO"; then :
-  ac_compiler_gnu=yes
+if ac_fn_c_try_compile "$LINENO"; then :
+  # It does; now see whether it defined to _BIG_ENDIAN or not.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <limits.h>
+
+int
+main ()
+{
+#ifndef _BIG_ENDIAN
+		 not big endian
+		#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_c_bigendian=yes
 else
-  ac_compiler_gnu=no
+  ac_cv_c_bigendian=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_fc_compiler_gnu=$ac_compiler_gnu
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    fi
+    if test $ac_cv_c_bigendian = unknown; then
+      # Compile a test program.
+      if test "$cross_compiling" = yes; then :
+  # Try to guess by grepping values from an object file.
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+short int ascii_mm[] =
+		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+		short int ascii_ii[] =
+		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+		int use_ascii (int i) {
+		  return ascii_mm[i] + ascii_ii[i];
+		}
+		short int ebcdic_ii[] =
+		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+		short int ebcdic_mm[] =
+		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+		int use_ebcdic (int i) {
+		  return ebcdic_mm[i] + ebcdic_ii[i];
+		}
+		extern int foo;
 
+int
+main ()
+{
+return use_ascii (foo) == use_ebcdic (foo);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
+	      ac_cv_c_bigendian=yes
+	    fi
+	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+	      if test "$ac_cv_c_bigendian" = unknown; then
+		ac_cv_c_bigendian=no
+	      else
+		# finding both strings is unlikely to happen, but who knows?
+		ac_cv_c_bigendian=unknown
+	      fi
+	    fi
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_compiler_gnu" >&5
-$as_echo "$ac_cv_fc_compiler_gnu" >&6; }
-ac_ext=$ac_save_ext
-ac_test_FCFLAGS=${FCFLAGS+set}
-ac_save_FCFLAGS=$FCFLAGS
-FCFLAGS=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $FC accepts -g" >&5
-$as_echo_n "checking whether $FC accepts -g... " >&6; }
-if ${ac_cv_prog_fc_g+:} false; then :
-  $as_echo_n "(cached) " >&6
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 else
-  FCFLAGS=-g
-cat > conftest.$ac_ext <<_ACEOF
-      program main
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
 
-      end
+	     /* Are we little or big endian?  From Harbison&Steele.  */
+	     union
+	     {
+	       long int l;
+	       char c[sizeof (long int)];
+	     } u;
+	     u.l = 1;
+	     return u.c[sizeof (long int) - 1] == 1;
+
+  ;
+  return 0;
+}
 _ACEOF
-if ac_fn_fc_try_compile "$LINENO"; then :
-  ac_cv_prog_fc_g=yes
+if ac_fn_c_try_run "$LINENO"; then :
+  ac_cv_c_bigendian=no
 else
-  ac_cv_prog_fc_g=no
+  ac_cv_c_bigendian=yes
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
+    fi
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_g" >&5
-$as_echo "$ac_cv_prog_fc_g" >&6; }
-if test "$ac_test_FCFLAGS" = set; then
-  FCFLAGS=$ac_save_FCFLAGS
-elif test $ac_cv_prog_fc_g = yes; then
-  if test "x$ac_cv_fc_compiler_gnu" = xyes; then
-    FCFLAGS="-g -O2"
-  else
-    FCFLAGS="-g"
-  fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
+$as_echo "$ac_cv_c_bigendian" >&6; }
+ case $ac_cv_c_bigendian in #(
+   yes)
+     $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
+;; #(
+   no)
+      ;; #(
+   universal)
+
+$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+
+     ;; #(
+   *)
+     as_fn_error $? "unknown endianness
+ presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
+ esac
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5
+$as_echo_n "checking size of char... " >&6; }
+if ${ac_cv_sizeof_char+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  if test "x$ac_cv_fc_compiler_gnu" = xyes; then
-    FCFLAGS="-O2"
-  else
-    FCFLAGS=
-  fi
-fi
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char"        "$ac_includes_default"; then :
 
-if test $ac_compiler_gnu = yes; then
-  GFC=yes
 else
-  GFC=
+  if test "$ac_cv_type_char" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (char)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_char=0
+   fi
 fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking what $FC does with modules" >&5
-$as_echo_n "checking what $FC does with modules... " >&6; }
-ac_ext=${ac_fc_srcext-f}
-ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
-ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5
+$as_echo "$ac_cv_sizeof_char" >&6; }
 
 
-test -d conftestdir || mkdir conftestdir
-cd conftestdir
-rm -rf *
 
-cat >conftest.$ac_ext <<EOF
-      module module
-         integer foo
-      end module module
-EOF
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_CHAR $ac_cv_sizeof_char
+_ACEOF
 
-eval $ac_compile
-modfiles=""
-F9XMODEXT=""
 
-for f in conftest.o module.mod MODULE.mod module.M MODULE.M; do
-  if test -f "$f" ; then
-    modfiles="$f"
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
+$as_echo_n "checking size of short... " >&6; }
+if ${ac_cv_sizeof_short+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short"        "$ac_includes_default"; then :
 
-    case "$f" in
-      *.o)   F9XMODEXT="o" ;;
-      *.mod) F9XMODEXT="mod" ;;
-      *.M)   F9XMODEXT="M" ;;
-    esac
-  fi
-done
+else
+  if test "$ac_cv_type_short" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (short)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_short=0
+   fi
+fi
 
-echo $modfiles 6>&1
-if test "$modfiles" = file.o; then
-  echo $ac_n "checking whether $FC -em is saner""... $ac_c" 1>&6
-  OLD_FCFLAGS=$FCFLAGS
-  FCFLAGS="$FCFLAGS -em"
-  eval $ac_compile
-  modfiles=""
-  for f in file.o module.mod MODULE.mod module.M MODULE.M; do
-    test -f $f && modfiles="$f"
-  done
-  if test "$modfiles" = "file.o"; then
-    FCFLAGS=$OLD_FCFLAGS
-    echo no 6>&1
-  else
-    echo yes 6>&1
-  fi
 fi
-cd ..
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5
+$as_echo "$ac_cv_sizeof_short" >&6; }
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how $FC finds modules" >&5
-$as_echo_n "checking how $FC finds modules... " >&6; }
 
-for flag in "-I" "-M" "-p"; do
-  cat >conftest.$ac_ext <<EOF
-      program conftest
-          use module
-      end program conftest
-EOF
 
-  ac_compile='${FC-f90} $FCFLAGS ${flag}conftestdir -c conftest.$ac_ext 1>&5'
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SHORT $ac_cv_sizeof_short
+_ACEOF
 
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    F9XMODFLAG=$flag
-    break
-  fi
-done
 
-if test -n "$F9XMODFLAG"; then
-  echo $F9XMODFLAG 1>&6
-  FCFLAGS="$F9XMODFLAG. $FCFLAGS"
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
+$as_echo_n "checking size of int... " >&6; }
+if ${ac_cv_sizeof_int+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  echo unknown 1>&6
-fi
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int"        "$ac_includes_default"; then :
 
+else
+  if test "$ac_cv_type_int" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (int)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_int=0
+   fi
+fi
 
-rm -rf conftest*
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
+$as_echo "$ac_cv_sizeof_int" >&6; }
 
 
 
-  ## Change to the Fortran 90 language
-  ac_ext=${ac_fc_srcext-f}
-ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
-ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+_ACEOF
 
 
-  ## --------------------------------------------------------------------
-  ## Define wrappers for the C compiler to use Fortran function names
-  ##
-  ac_ext=${ac_fc_srcext-f}
-ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
-ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_fc_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to get verbose linking output from $FC" >&5
-$as_echo_n "checking how to get verbose linking output from $FC... " >&6; }
-if ${ac_cv_prog_fc_v+:} false; then :
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned" >&5
+$as_echo_n "checking size of unsigned... " >&6; }
+if ${ac_cv_sizeof_unsigned+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  cat > conftest.$ac_ext <<_ACEOF
-      program main
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned))" "ac_cv_sizeof_unsigned"        "$ac_includes_default"; then :
 
-      end
-_ACEOF
-if ac_fn_fc_try_compile "$LINENO"; then :
-  ac_cv_prog_fc_v=
-# Try some options frequently used verbose output
-for ac_verb in -v -verbose --verbose -V -\#\#\#; do
-  cat > conftest.$ac_ext <<_ACEOF
-      program main
+else
+  if test "$ac_cv_type_unsigned" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (unsigned)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_unsigned=0
+   fi
+fi
 
-      end
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned" >&5
+$as_echo "$ac_cv_sizeof_unsigned" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED $ac_cv_sizeof_unsigned
 _ACEOF
 
-# Compile and link our simple test program by passing a flag (argument
-# 1 to this macro) to the Fortran compiler in order to get
-# "verbose" output that we can then parse for the Fortran linker
-# flags.
-ac_save_FCFLAGS=$FCFLAGS
-FCFLAGS="$FCFLAGS $ac_verb"
-eval "set x $ac_link"
-shift
-$as_echo "$as_me:${as_lineno-$LINENO}: $*" >&5
-# gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH,
-# LIBRARY_PATH; skip all such settings.
-ac_fc_v_output=`eval $ac_link 5>&1 2>&1 |
-  sed '/^Driving:/d; /^Configured with:/d;
-      '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"`
-$as_echo "$ac_fc_v_output" >&5
-FCFLAGS=$ac_save_FCFLAGS
 
-rm -rf conftest*
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
+$as_echo_n "checking size of long... " >&6; }
+if ${ac_cv_sizeof_long+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long"        "$ac_includes_default"; then :
 
-# On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where
-# /foo, /bar, and /baz are search directories for the Fortran linker.
-# Here, we change these into -L/foo -L/bar -L/baz (and put it first):
-ac_fc_v_output="`echo $ac_fc_v_output |
-	grep 'LPATH is:' |
-	sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_fc_v_output"
+else
+  if test "$ac_cv_type_long" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (long)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_long=0
+   fi
+fi
 
-# FIXME: we keep getting bitten by quoted arguments; a more general fix
-#        that detects unbalanced quotes in FLIBS should be implemented
-#        and (ugh) tested at some point.
-case $ac_fc_v_output in
-  # With xlf replace commas with spaces,
-  # and remove "-link" and closing parenthesis.
-  *xlfentry*)
-    ac_fc_v_output=`echo $ac_fc_v_output |
-      sed '
-        s/,/ /g
-        s/ -link / /g
-        s/) *$//
-      '
-    ` ;;
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
+$as_echo "$ac_cv_sizeof_long" >&6; }
 
-  # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted
-  # $LIBS confuse us, and the libraries appear later in the output anyway).
-  *mGLOB_options_string*)
-    ac_fc_v_output=`echo $ac_fc_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;;
 
-  # Portland Group compiler has singly- or doubly-quoted -cmdline argument
-  # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4.
-  # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2".
-  *-cmdline\ * | *-ignore\ * | *-def\ *)
-    ac_fc_v_output=`echo $ac_fc_v_output | sed "\
-	s/-cmdline  *'[^']*'/ /g; s/-cmdline  *\"[^\"]*\"/ /g
-	s/-ignore  *'[^']*'/ /g; s/-ignore  *\"[^\"]*\"/ /g
-	s/-def  *'[^']*'/ /g; s/-def  *\"[^\"]*\"/ /g"` ;;
 
-  # If we are using fort77 (the f2c wrapper) then filter output and delete quotes.
-  *fort77*f2c*gcc*)
-    ac_fc_v_output=`echo "$ac_fc_v_output" | sed -n '
-        /:[	 ]\+Running[	 ]\{1,\}"gcc"/{
-          /"-c"/d
-          /[.]c"*/d
-          s/^.*"gcc"/"gcc"/
-          s/"//gp
-        }'` ;;
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+_ACEOF
 
-  # If we are using Cray Fortran then delete quotes.
-  *cft90*)
-    ac_fc_v_output=`echo $ac_fc_v_output | sed 's/"//g'` ;;
-esac
 
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5
+$as_echo_n "checking size of long long... " >&6; }
+if ${ac_cv_sizeof_long_long+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long"        "$ac_includes_default"; then :
 
-  # look for -l* and *.a constructs in the output
-  for ac_arg in $ac_fc_v_output; do
-     case $ac_arg in
-	[\\/]*.a | ?:[\\/]*.a | -[lLRu]*)
-	  ac_cv_prog_fc_v=$ac_verb
-	  break 2 ;;
-     esac
-  done
-done
-if test -z "$ac_cv_prog_fc_v"; then
-   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot determine how to obtain linking information from $FC" >&5
-$as_echo "$as_me: WARNING: cannot determine how to obtain linking information from $FC" >&2;}
-fi
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: compilation failed" >&5
-$as_echo "$as_me: WARNING: compilation failed" >&2;}
+  if test "$ac_cv_type_long_long" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (long long)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_long_long=0
+   fi
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_v" >&5
-$as_echo "$ac_cv_prog_fc_v" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran libraries of $FC" >&5
-$as_echo_n "checking for Fortran libraries of $FC... " >&6; }
-if ${ac_cv_fc_libs+:} false; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5
+$as_echo "$ac_cv_sizeof_long_long" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of __int64" >&5
+$as_echo_n "checking size of __int64... " >&6; }
+if ${ac_cv_sizeof___int64+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test "x$FCLIBS" != "x"; then
-  ac_cv_fc_libs="$FCLIBS" # Let the user override the test.
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int64))" "ac_cv_sizeof___int64"        "$ac_includes_default"; then :
+
 else
+  if test "$ac_cv_type___int64" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (__int64)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof___int64=0
+   fi
+fi
 
-cat > conftest.$ac_ext <<_ACEOF
-      program main
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof___int64" >&5
+$as_echo "$ac_cv_sizeof___int64" >&6; }
 
-      end
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF___INT64 $ac_cv_sizeof___int64
 _ACEOF
 
-# Compile and link our simple test program by passing a flag (argument
-# 1 to this macro) to the Fortran compiler in order to get
-# "verbose" output that we can then parse for the Fortran linker
-# flags.
-ac_save_FCFLAGS=$FCFLAGS
-FCFLAGS="$FCFLAGS $ac_cv_prog_fc_v"
-eval "set x $ac_link"
-shift
-$as_echo "$as_me:${as_lineno-$LINENO}: $*" >&5
-# gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH,
-# LIBRARY_PATH; skip all such settings.
-ac_fc_v_output=`eval $ac_link 5>&1 2>&1 |
-  sed '/^Driving:/d; /^Configured with:/d;
-      '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"`
-$as_echo "$ac_fc_v_output" >&5
-FCFLAGS=$ac_save_FCFLAGS
 
-rm -rf conftest*
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5
+$as_echo_n "checking size of float... " >&6; }
+if ${ac_cv_sizeof_float+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float"        "$ac_includes_default"; then :
 
-# On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where
-# /foo, /bar, and /baz are search directories for the Fortran linker.
-# Here, we change these into -L/foo -L/bar -L/baz (and put it first):
-ac_fc_v_output="`echo $ac_fc_v_output |
-	grep 'LPATH is:' |
-	sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_fc_v_output"
+else
+  if test "$ac_cv_type_float" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (float)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_float=0
+   fi
+fi
 
-# FIXME: we keep getting bitten by quoted arguments; a more general fix
-#        that detects unbalanced quotes in FLIBS should be implemented
-#        and (ugh) tested at some point.
-case $ac_fc_v_output in
-  # With xlf replace commas with spaces,
-  # and remove "-link" and closing parenthesis.
-  *xlfentry*)
-    ac_fc_v_output=`echo $ac_fc_v_output |
-      sed '
-        s/,/ /g
-        s/ -link / /g
-        s/) *$//
-      '
-    ` ;;
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_float" >&5
+$as_echo "$ac_cv_sizeof_float" >&6; }
 
-  # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted
-  # $LIBS confuse us, and the libraries appear later in the output anyway).
-  *mGLOB_options_string*)
-    ac_fc_v_output=`echo $ac_fc_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;;
 
-  # Portland Group compiler has singly- or doubly-quoted -cmdline argument
-  # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4.
-  # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2".
-  *-cmdline\ * | *-ignore\ * | *-def\ *)
-    ac_fc_v_output=`echo $ac_fc_v_output | sed "\
-	s/-cmdline  *'[^']*'/ /g; s/-cmdline  *\"[^\"]*\"/ /g
-	s/-ignore  *'[^']*'/ /g; s/-ignore  *\"[^\"]*\"/ /g
-	s/-def  *'[^']*'/ /g; s/-def  *\"[^\"]*\"/ /g"` ;;
 
-  # If we are using fort77 (the f2c wrapper) then filter output and delete quotes.
-  *fort77*f2c*gcc*)
-    ac_fc_v_output=`echo "$ac_fc_v_output" | sed -n '
-        /:[	 ]\+Running[	 ]\{1,\}"gcc"/{
-          /"-c"/d
-          /[.]c"*/d
-          s/^.*"gcc"/"gcc"/
-          s/"//gp
-        }'` ;;
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_FLOAT $ac_cv_sizeof_float
+_ACEOF
 
-  # If we are using Cray Fortran then delete quotes.
-  *cft90*)
-    ac_fc_v_output=`echo $ac_fc_v_output | sed 's/"//g'` ;;
-esac
 
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5
+$as_echo_n "checking size of double... " >&6; }
+if ${ac_cv_sizeof_double+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double"        "$ac_includes_default"; then :
 
+else
+  if test "$ac_cv_type_double" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (double)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_double=0
+   fi
+fi
 
-ac_cv_fc_libs=
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5
+$as_echo "$ac_cv_sizeof_double" >&6; }
 
-# Save positional arguments (if any)
-ac_save_positional="$@"
 
-set X $ac_fc_v_output
-while test $# != 1; do
-  shift
-  ac_arg=$1
-  case $ac_arg in
-	[\\/]*.a | ?:[\\/]*.a)
-	    ac_exists=false
-  for ac_i in $ac_cv_fc_libs; do
-    if test x"$ac_arg" = x"$ac_i"; then
-      ac_exists=true
-      break
-    fi
-  done
 
-  if test x"$ac_exists" = xtrue; then :
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_DOUBLE $ac_cv_sizeof_double
+_ACEOF
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5
+$as_echo_n "checking size of long double... " >&6; }
+if ${ac_cv_sizeof_long_double+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double"        "$ac_includes_default"; then :
 
 else
-  ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg"
+  if test "$ac_cv_type_long_double" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (long double)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_long_double=0
+   fi
 fi
-	  ;;
-	-bI:*)
-	    ac_exists=false
-  for ac_i in $ac_cv_fc_libs; do
-    if test x"$ac_arg" = x"$ac_i"; then
-      ac_exists=true
-      break
-    fi
-  done
 
-  if test x"$ac_exists" = xtrue; then :
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_double" >&5
+$as_echo "$ac_cv_sizeof_long_double" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double
+_ACEOF
+
 
+
+## Check for non-standard extenstion __FLOAT128
+HAVE_FLOAT128=0
+HAVE_QUADMATH=0
+FLT128_DIG=0
+LDBL_DIG=0
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of __float128" >&5
+$as_echo_n "checking size of __float128... " >&6; }
+if ${ac_cv_sizeof___float128+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  if test "$ac_compiler_gnu" = yes; then
-  for ac_link_opt in $ac_arg; do
-    ac_cv_fc_libs="$ac_cv_fc_libs -Xlinker $ac_link_opt"
-  done
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__float128))" "ac_cv_sizeof___float128"        "$ac_includes_default"; then :
+
 else
-  ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg"
+  if test "$ac_cv_type___float128" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (__float128)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof___float128=0
+   fi
 fi
+
 fi
-	  ;;
-	  # Ignore these flags.
-	-lang* | -lcrt*.o | -lc | -lgcc* | -lSystem | -libmil | -little \
-	  |-LANG:=* | -LIST:* | -LNO:* | -link)
-	  ;;
-	-lkernel32)
-	  case $host_os in
-	  *cygwin*) ;;
-	  *) ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg"
-	    ;;
-	  esac
-	  ;;
-	-[LRuYz])
-	  # These flags, when seen by themselves, take an argument.
-	  # We remove the space between option and argument and re-iterate
-	  # unless we find an empty arg or a new option (starting with -)
-	  case $2 in
-	     "" | -*);;
-	     *)
-		ac_arg="$ac_arg$2"
-		shift; shift
-		set X $ac_arg "$@"
-		;;
-	  esac
-	  ;;
-	-YP,*)
-	  for ac_j in `$as_echo "$ac_arg" | sed -e 's/-YP,/-L/;s/:/ -L/g'`; do
-	      ac_exists=false
-  for ac_i in $ac_cv_fc_libs; do
-    if test x"$ac_j" = x"$ac_i"; then
-      ac_exists=true
-      break
-    fi
-  done
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof___float128" >&5
+$as_echo "$ac_cv_sizeof___float128" >&6; }
 
-  if test x"$ac_exists" = xtrue; then :
 
-else
-  ac_arg="$ac_arg $ac_j"
-			       ac_cv_fc_libs="$ac_cv_fc_libs $ac_j"
-fi
-	  done
-	  ;;
-	-[lLR]*)
-	    ac_exists=false
-  for ac_i in $ac_cv_fc_libs; do
-    if test x"$ac_arg" = x"$ac_i"; then
-      ac_exists=true
-      break
-    fi
-  done
 
-  if test x"$ac_exists" = xtrue; then :
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF___FLOAT128 $ac_cv_sizeof___float128
+_ACEOF
+
 
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of _Quad" >&5
+$as_echo_n "checking size of _Quad... " >&6; }
+if ${ac_cv_sizeof__Quad+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg"
-fi
-	  ;;
-	-zallextract*| -zdefaultextract)
-	  ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg"
-	  ;;
-	  # Ignore everything else.
-  esac
-done
-# restore positional arguments
-set X $ac_save_positional; shift
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (_Quad))" "ac_cv_sizeof__Quad"        "$ac_includes_default"; then :
 
-# We only consider "LD_RUN_PATH" on Solaris systems.  If this is seen,
-# then we insist that the "run path" must be an absolute path (i.e. it
-# must begin with a "/").
-case `(uname -sr) 2>/dev/null` in
-   "SunOS 5"*)
-      ac_ld_run_path=`$as_echo "$ac_fc_v_output" |
-			sed -n 's,^.*LD_RUN_PATH *= *\(/[^ ]*\).*$,-R\1,p'`
-      test "x$ac_ld_run_path" != x &&
-	if test "$ac_compiler_gnu" = yes; then
-  for ac_link_opt in $ac_ld_run_path; do
-    ac_cv_fc_libs="$ac_cv_fc_libs -Xlinker $ac_link_opt"
-  done
 else
-  ac_cv_fc_libs="$ac_cv_fc_libs $ac_ld_run_path"
+  if test "$ac_cv_type__Quad" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (_Quad)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof__Quad=0
+   fi
 fi
-      ;;
-esac
-fi # test "x$[]_AC_LANG_PREFIX[]LIBS" = "x"
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_libs" >&5
-$as_echo "$ac_cv_fc_libs" >&6; }
-FCLIBS="$ac_cv_fc_libs"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof__Quad" >&5
+$as_echo "$ac_cv_sizeof__Quad" >&6; }
 
 
-ac_ext=${ac_fc_srcext-f}
-ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
-ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF__QUAD $ac_cv_sizeof__Quad
+_ACEOF
 
-ac_ext=${ac_fc_srcext-f}
-ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
-ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dummy main to link with Fortran libraries" >&5
-$as_echo_n "checking for dummy main to link with Fortran libraries... " >&6; }
-if ${ac_cv_fc_dummy_main+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_fc_dm_save_LIBS=$LIBS
- LIBS="$LIBS $FCLIBS"
- ac_fortran_dm_var=FC_DUMMY_MAIN
- ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
+for ac_header in quadmath.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "quadmath.h" "ac_cv_header_quadmath_h" "$ac_includes_default"
+if test "x$ac_cv_header_quadmath_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_QUADMATH_H 1
+_ACEOF
+ HAVE_QUADMATH=1
+fi
 
- # First, try linking without a dummy main:
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+done
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking maximum decimal precision for C" >&5
+$as_echo_n "checking maximum decimal precision for C... " >&6; }
+rm -f pac_Cconftest.out
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_fortran_dummy_main=none
-else
-  ac_cv_fortran_dummy_main=unknown
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
+                #include <float.h>
+                #include <stdio.h>
+                #define CHECK_FLOAT128 $ac_cv_sizeof___float128
+                #if CHECK_FLOAT128!=0
+                # if $HAVE_QUADMATH!=0
+                #include <quadmath.h>
+                # endif
+                # ifdef FLT128_DIG
+                #define C_FLT128_DIG FLT128_DIG
+                # else
+                #define C_FLT128_DIG 0
+                # endif
+                #else
+                #define C_FLT128_DIG 0
+                #endif
+                #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+                #define C_LDBL_DIG DECIMAL_DIG
+                #else
+                #define C_LDBL_DIG LDBL_DIG
+                #endif
 
- if test $ac_cv_fortran_dummy_main = unknown; then
-   for ac_func in MAIN__ MAIN_ __main MAIN _MAIN __MAIN main_ main__ _main; do
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#define $ac_fortran_dm_var $ac_func
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
 int
 main ()
 {
 
+                  FILE * pFile;
+                  pFile = fopen("pac_Cconftest.out","w");
+                  fprintf(pFile, "%d\n%d\n", C_LDBL_DIG, C_FLT128_DIG);
+
   ;
   return 0;
 }
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_fortran_dummy_main=$ac_func; break
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-   done
- fi
- ac_ext=${ac_fc_srcext-f}
-ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
-ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_fc_compiler_gnu
- ac_cv_fc_dummy_main=$ac_cv_fortran_dummy_main
- rm -rf conftest*
- LIBS=$ac_fc_dm_save_LIBS
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_dummy_main" >&5
-$as_echo "$ac_cv_fc_dummy_main" >&6; }
-FC_DUMMY_MAIN=$ac_cv_fc_dummy_main
-if test "$FC_DUMMY_MAIN" != unknown; then :
-  if test $FC_DUMMY_MAIN != none; then
-
-cat >>confdefs.h <<_ACEOF
-#define FC_DUMMY_MAIN $FC_DUMMY_MAIN
 _ACEOF
-
-  if test "x$ac_cv_fc_dummy_main" = "x$ac_cv_f77_dummy_main"; then
-
-$as_echo "#define FC_DUMMY_MAIN_EQ_F77 1" >>confdefs.h
-
-  fi
-fi
-else
+        if test "$cross_compiling" = yes; then :
   { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "linking to Fortran libraries from C fails
+as_fn_error $? "cannot run test program while cross compiling
 See \`config.log' for more details" "$LINENO" 5; }
-fi
+else
+  if ac_fn_c_try_run "$LINENO"; then :
 
-ac_ext=${ac_fc_srcext-f}
-ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
-ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+            if test -s pac_Cconftest.out ; then
+	        LDBL_DIG="`sed -n '1p' pac_Cconftest.out`"
+	        FLT128_DIG="`sed -n '2p' pac_Cconftest.out`"
+            else
+                { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No output from test program!" >&5
+$as_echo "$as_me: WARNING: No output from test program!" >&2;}
+            fi
+            rm -f pac_Cconftest.out
 
-ac_ext=${ac_fc_srcext-f}
-ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
-ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_fc_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran name-mangling scheme" >&5
-$as_echo_n "checking for Fortran name-mangling scheme... " >&6; }
-if ${ac_cv_fc_mangling+:} false; then :
-  $as_echo_n "(cached) " >&6
 else
-  cat > conftest.$ac_ext <<_ACEOF
-      subroutine foobar()
-      return
-      end
-      subroutine foo_bar()
-      return
-      end
-_ACEOF
-if ac_fn_fc_try_compile "$LINENO"; then :
-  mv conftest.$ac_objext cfortran_test.$ac_objext
-
-  ac_save_LIBS=$LIBS
-  LIBS="cfortran_test.$ac_objext $LIBS $FCLIBS"
 
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-  ac_success=no
-  for ac_foobar in foobar FOOBAR; do
-    for ac_underscore in "" "_"; do
-      ac_func="$ac_foobar$ac_underscore"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
+            as_fn_error $? "C program fails to build or run!" "$LINENO" 5
 
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $ac_func ();
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-return $ac_func ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_success=yes; break 2
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-    done
-  done
-  ac_ext=${ac_fc_srcext-f}
-ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
-ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam
+fi
 
-  if test "$ac_success" = "yes"; then
-     case $ac_foobar in
-	foobar)
-	   ac_case=lower
-	   ac_foo_bar=foo_bar
-	   ;;
-	FOOBAR)
-	   ac_case=upper
-	   ac_foo_bar=FOO_BAR
-	   ;;
-     esac
 
-     ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-     ac_success_extra=no
-     for ac_extra in "" "_"; do
-	ac_func="$ac_foo_bar$ac_underscore$ac_extra"
-	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
 
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char $ac_func ();
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-return $ac_func ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_success_extra=yes; break
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-     done
-     ac_ext=${ac_fc_srcext-f}
-ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
-ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+if test "$ac_cv_sizeof___float128" != 0 && test "$FLT128_DIG" != 0 ; then
 
-     if test "$ac_success_extra" = "yes"; then
-	ac_cv_fc_mangling="$ac_case case"
-	if test -z "$ac_underscore"; then
-	   ac_cv_fc_mangling="$ac_cv_fc_mangling, no underscore"
-	else
-	   ac_cv_fc_mangling="$ac_cv_fc_mangling, underscore"
-	fi
-	if test -z "$ac_extra"; then
-	   ac_cv_fc_mangling="$ac_cv_fc_mangling, no extra underscore"
-	else
-	   ac_cv_fc_mangling="$ac_cv_fc_mangling, extra underscore"
-	fi
-      else
-	ac_cv_fc_mangling="unknown"
-      fi
-  else
-     ac_cv_fc_mangling="unknown"
-  fi
+$as_echo "#define HAVE_FLOAT128 1" >>confdefs.h
 
-  LIBS=$ac_save_LIBS
-  rm -rf conftest*
-  rm -f cfortran_test*
+  PAC_C_MAX_REAL_PRECISION=$FLT128_DIG
 else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot compile a simple Fortran program
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
+  PAC_C_MAX_REAL_PRECISION=$LDBL_DIG
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_mangling" >&5
-$as_echo "$ac_cv_fc_mangling" >&6; }
-
-ac_ext=${ac_fc_srcext-f}
-ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
-ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
-ac_ext=${ac_fc_srcext-f}
-ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
-ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_fc_compiler_gnu
-case $ac_cv_fc_mangling in
-  "lower case, no underscore, no extra underscore")
-	  $as_echo "#define FC_FUNC(name,NAME) name" >>confdefs.h
+cat >>confdefs.h <<_ACEOF
+#define PAC_C_MAX_REAL_PRECISION $PAC_C_MAX_REAL_PRECISION
+_ACEOF
 
-	  $as_echo "#define FC_FUNC_(name,NAME) name" >>confdefs.h
- ;;
-  "lower case, no underscore, extra underscore")
-	  $as_echo "#define FC_FUNC(name,NAME) name" >>confdefs.h
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PAC_C_MAX_REAL_PRECISION" >&5
+$as_echo "$PAC_C_MAX_REAL_PRECISION" >&6; }
+## ----------------------------------------------------------------------
+## Check if they would like the Fortran interface compiled
+##
+ HDF5_INTERFACES=""
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran interface enabled" >&5
+$as_echo_n "checking if Fortran interface enabled... " >&6; }
+# Check whether --enable-fortran was given.
+if test "${enable_fortran+set}" = set; then :
+  enableval=$enable_fortran; HDF_FORTRAN=$enableval
+fi
 
-	  $as_echo "#define FC_FUNC_(name,NAME) name ## _" >>confdefs.h
- ;;
-  "lower case, underscore, no extra underscore")
-	  $as_echo "#define FC_FUNC(name,NAME) name ## _" >>confdefs.h
 
-	  $as_echo "#define FC_FUNC_(name,NAME) name ## _" >>confdefs.h
- ;;
-  "lower case, underscore, extra underscore")
-	  $as_echo "#define FC_FUNC(name,NAME) name ## _" >>confdefs.h
+if test "X$HDF_FORTRAN" = "Xyes"; then
+  echo "yes"
+else
+  echo "no"
+fi
 
-	  $as_echo "#define FC_FUNC_(name,NAME) name ## __" >>confdefs.h
- ;;
-  "upper case, no underscore, no extra underscore")
-	  $as_echo "#define FC_FUNC(name,NAME) NAME" >>confdefs.h
+if test "X$HDF_FORTRAN" = "Xyes"; then
 
-	  $as_echo "#define FC_FUNC_(name,NAME) NAME" >>confdefs.h
- ;;
-  "upper case, no underscore, extra underscore")
-	  $as_echo "#define FC_FUNC(name,NAME) NAME" >>confdefs.h
+## We will output an include file for Fortran, H5config_f.inc which
+## contains various configure definitions used by the Fortran Library.
+## Prepend H5_ to all macro names. This avoids name conflict between HDF5 macro
+## names and those generated by another software package that uses the HDF5 library.
+  ac_config_headers="$ac_config_headers fortran/src/H5config_f.inc"
 
-	  $as_echo "#define FC_FUNC_(name,NAME) NAME ## _" >>confdefs.h
- ;;
-  "upper case, underscore, no extra underscore")
-	  $as_echo "#define FC_FUNC(name,NAME) NAME ## _" >>confdefs.h
 
-	  $as_echo "#define FC_FUNC_(name,NAME) NAME ## _" >>confdefs.h
- ;;
-  "upper case, underscore, extra underscore")
-	  $as_echo "#define FC_FUNC(name,NAME) NAME ## _" >>confdefs.h
+   HDF_FORTRAN=yes
 
-	  $as_echo "#define FC_FUNC_(name,NAME) NAME ## __" >>confdefs.h
- ;;
-  *)
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unknown Fortran name-mangling scheme" >&5
-$as_echo "$as_me: WARNING: unknown Fortran name-mangling scheme" >&2;}
-	  ;;
-esac
+  HDF5_INTERFACES="$HDF5_INTERFACES fortran"
 
-ac_ext=${ac_fc_srcext-f}
-ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
-ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+  ## --------------------------------------------------------------------
+  ## HDF5 integer variables for the H5fortran_types.f90 file.
+  ##
 
 
-  ## --------------------------------------------------------------------
-  ## See if the fortran compiler supports the intrinsic function "SIZEOF"
 
-  HAVE_SIZEOF_FORTRAN="no"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran compiler supports intrinsic SIZEOF" >&5
-$as_echo_n "checking if Fortran compiler supports intrinsic SIZEOF... " >&6; }
-  cat > conftest.$ac_ext <<_ACEOF
 
-   PROGRAM main
-     i = sizeof(x)
-   END PROGRAM
 
-_ACEOF
-if ac_fn_fc_try_link "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-     	HAVE_SIZEOF_FORTRAN="yes"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
 
 
-  ## See if the fortran compiler supports the intrinsic function "C_SIZEOF"
 
-  HAVE_C_SIZEOF_FORTRAN="no"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran compiler supports intrinsic C_SIZEOF" >&5
-$as_echo_n "checking if Fortran compiler supports intrinsic C_SIZEOF... " >&6; }
-  cat > conftest.$ac_ext <<_ACEOF
 
-   PROGRAM main
-     USE ISO_C_BINDING
-     INTEGER(C_INT) :: a
-     INTEGER(C_SIZE_T) :: result
-     result = C_SIZEOF(a)
-   END PROGRAM
+  ## --------------------------------------------------------------------
+  ## Fortran source extention
+  ##
+  ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$FC"; then
+  ac_cv_prog_FC="$FC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_FC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
-_ACEOF
-if ac_fn_fc_try_link "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-     	HAVE_C_SIZEOF_FORTRAN="yes"
+fi
+fi
+FC=$ac_cv_prog_FC
+if test -n "$FC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5
+$as_echo "$FC" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
-
-  ## See if the fortran compiler supports the intrinsic function "STORAGE_SIZE"
 
-  HAVE_STORAGE_SIZE_FORTRAN="no"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran compiler supports intrinsic STORAGE_SIZE" >&5
-$as_echo_n "checking if Fortran compiler supports intrinsic STORAGE_SIZE... " >&6; }
-  cat > conftest.$ac_ext <<_ACEOF
 
-   PROGRAM main
-     INTEGER :: a
-     INTEGER :: result
-     result = STORAGE_SIZE(a)
-   END PROGRAM
+    test -n "$FC" && break
+  done
+fi
+if test -z "$FC"; then
+  ac_ct_FC=$FC
+  for ac_prog in gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn nagfor xlf90 f90 pgf90 pghpf epcf90 g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_FC"; then
+  ac_cv_prog_ac_ct_FC="$ac_ct_FC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_FC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
-_ACEOF
-if ac_fn_fc_try_link "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-     	HAVE_STORAGE_SIZE_FORTRAN="yes"
+fi
+fi
+ac_ct_FC=$ac_cv_prog_ac_ct_FC
+if test -n "$ac_ct_FC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FC" >&5
+$as_echo "$ac_ct_FC" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
 
 
+  test -n "$ac_ct_FC" && break
+done
+
+  if test "x$ac_ct_FC" = x; then
+    FC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    FC=$ac_ct_FC
+  fi
+fi
 
-  ## Check to see if -r8 was specified to determine if we need to
-  ## compile the DOUBLE PRECISION interfaces.
 
-  FORTRAN_DEFAULT_REALisDBLE="no"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran default REAL is DOUBLE PRECISION" >&5
-$as_echo_n "checking if Fortran default REAL is DOUBLE PRECISION... " >&6; }
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+rm -f a.out
 
+# If we don't use `.F' as extension, the preprocessor is not run on the
+# input file.  (Note that this only needs to work for GNU compilers.)
+ac_save_ext=$ac_ext
+ac_ext=F
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran compiler" >&5
+$as_echo_n "checking whether we are using the GNU Fortran compiler... " >&6; }
+if ${ac_cv_fc_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
   cat > conftest.$ac_ext <<_ACEOF
+      program main
+#ifndef __GNUC__
+       choke me
+#endif
 
-     MODULE type_mod
-       INTERFACE h5t
-         MODULE PROCEDURE h5t_real
-         MODULE PROCEDURE h5t_dble
-       END INTERFACE
-     CONTAINS
-       SUBROUTINE h5t_real(r)
-         REAL :: r
-       END SUBROUTINE h5t_real
-       SUBROUTINE h5t_dble(d)
-         DOUBLE PRECISION :: d
-       END SUBROUTINE h5t_dble
-     END MODULE type_mod
-     PROGRAM main
-       USE type_mod
-       REAL :: r
-       DOUBLE PRECISION :: d
-       CALL h5t(r)
-       CALL h5t(d)
-     END PROGRAM main
-
+      end
 _ACEOF
 if ac_fn_fc_try_compile "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  ac_compiler_gnu=yes
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-            FORTRAN_DEFAULT_REALisDBLE="yes"
+  ac_compiler_gnu=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_fc_compiler_gnu=$ac_compiler_gnu
 
-
-  if test "X$HDF_FORTRAN2003" = "Xyes"; then
-
-    ## Checking if the compiler supports the required Fortran 2003 features and
-    ## disable Fortran 2003 if it does not.
-
-   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran compiler version compatible with Fortran 2003 HDF" >&5
-$as_echo_n "checking if Fortran compiler version compatible with Fortran 2003 HDF... " >&6; }
-    HAVE_FORTRAN_2003="no"
-    HAVE_F2003_REQUIREMENTS="no"
-    cat > conftest.$ac_ext <<_ACEOF
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_compiler_gnu" >&5
+$as_echo "$ac_cv_fc_compiler_gnu" >&6; }
+ac_ext=$ac_save_ext
+ac_test_FCFLAGS=${FCFLAGS+set}
+ac_save_FCFLAGS=$FCFLAGS
+FCFLAGS=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $FC accepts -g" >&5
+$as_echo_n "checking whether $FC accepts -g... " >&6; }
+if ${ac_cv_prog_fc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  FCFLAGS=-g
+cat > conftest.$ac_ext <<_ACEOF
       program main
 
-
-        USE iso_c_binding
-        IMPLICIT NONE
-        TYPE(C_PTR) :: ptr
-        TYPE(C_FUNPTR) :: funptr
-        CHARACTER(LEN=80, KIND=c_char), TARGET :: ichr
-
-        ptr = C_LOC(ichr(1:1))
-
-
       end
 _ACEOF
-if ac_fn_fc_try_link "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-        HAVE_F2003_REQUIREMENTS=yes
+if ac_fn_fc_try_compile "$LINENO"; then :
+  ac_cv_prog_fc_g=yes
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  ac_cv_prog_fc_g=no
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
-    if test "X$HAVE_F2003_REQUIREMENTS" = "Xno"; then
-      as_fn_error $? "Fortran compiler lacks required Fortran 2003 features; unsupported Fortran 2003 compiler, remove --enable-fortran2003" "$LINENO" 5
-    else
-      HAVE_FORTRAN_2003="yes"
-    fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_g" >&5
+$as_echo "$ac_cv_prog_fc_g" >&6; }
+if test "$ac_test_FCFLAGS" = set; then
+  FCFLAGS=$ac_save_FCFLAGS
+elif test $ac_cv_prog_fc_g = yes; then
+  if test "x$ac_cv_fc_compiler_gnu" = xyes; then
+    FCFLAGS="-g -O2"
+  else
+    FCFLAGS="-g"
   fi
 else
-  FC="no"
+  if test "x$ac_cv_fc_compiler_gnu" = xyes; then
+    FCFLAGS="-O2"
+  else
+    FCFLAGS=
+  fi
 fi
 
-## Change back to the C language
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
- if test "X$HAVE_SIZEOF_FORTRAN" = "Xyes"; then
-  FORTRAN_HAVE_SIZEOF_TRUE=
-  FORTRAN_HAVE_SIZEOF_FALSE='#'
+if test $ac_compiler_gnu = yes; then
+  GFC=yes
 else
-  FORTRAN_HAVE_SIZEOF_TRUE='#'
-  FORTRAN_HAVE_SIZEOF_FALSE=
+  GFC=
 fi
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
- if test "X$HAVE_C_SIZEOF_FORTRAN" = "Xyes"; then
-  FORTRAN_HAVE_C_SIZEOF_TRUE=
-  FORTRAN_HAVE_C_SIZEOF_FALSE='#'
-else
-  FORTRAN_HAVE_C_SIZEOF_TRUE='#'
-  FORTRAN_HAVE_C_SIZEOF_FALSE=
-fi
 
- if test "X$HAVE_STORAGE_SIZE_FORTRAN" = "Xyes"; then
-  FORTRAN_HAVE_STORAGE_SIZE_TRUE=
-  FORTRAN_HAVE_STORAGE_SIZE_FALSE='#'
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran flag to compile .f90 files" >&5
+$as_echo_n "checking for Fortran flag to compile .f90 files... " >&6; }
+if ${ac_cv_fc_srcext_f90+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  FORTRAN_HAVE_STORAGE_SIZE_TRUE='#'
-  FORTRAN_HAVE_STORAGE_SIZE_FALSE=
-fi
+  ac_ext=f90
+ac_fcflags_srcext_save=$ac_fcflags_srcext
+ac_fcflags_srcext=
+ac_cv_fc_srcext_f90=unknown
+case $ac_ext in #(
+  [fF]77) ac_try=f77;; #(
+  *) ac_try=f95;;
+esac
+for ac_flag in none -qsuffix=f=f90 -Tf "-x $ac_try"; do
+  test "x$ac_flag" != xnone && ac_fcflags_srcext="$ac_flag"
+  cat > conftest.$ac_ext <<_ACEOF
+      program main
 
- if test "X$HAVE_FORTRAN_2003" = "Xyes"; then
-  FORTRAN_2003_CONDITIONAL_F_TRUE=
-  FORTRAN_2003_CONDITIONAL_F_FALSE='#'
-else
-  FORTRAN_2003_CONDITIONAL_F_TRUE='#'
-  FORTRAN_2003_CONDITIONAL_F_FALSE=
+      end
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+  ac_cv_fc_srcext_f90=$ac_flag; break
 fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest.$ac_objext conftest.f90
+ac_fcflags_srcext=$ac_fcflags_srcext_save
 
- if test "X$FORTRAN_DEFAULT_REALisDBLE" = "Xyes"; then
-  FORTRAN_DEFAULT_REALisDBLE_F_TRUE=
-  FORTRAN_DEFAULT_REALisDBLE_F_FALSE='#'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_srcext_f90" >&5
+$as_echo "$ac_cv_fc_srcext_f90" >&6; }
+if test "x$ac_cv_fc_srcext_f90" = xunknown; then
+  as_fn_error $? "Fortran could not compile .f90 files" "$LINENO" 5
 else
-  FORTRAN_DEFAULT_REALisDBLE_F_TRUE='#'
-  FORTRAN_DEFAULT_REALisDBLE_F_FALSE=
+  ac_fc_srcext=f90
+  if test "x$ac_cv_fc_srcext_f90" = xnone; then
+    ac_fcflags_srcext=""
+    FCFLAGS_f90=""
+  else
+    ac_fcflags_srcext=$ac_cv_fc_srcext_f90
+    FCFLAGS_f90=$ac_cv_fc_srcext_f90
+  fi
+
+
 fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-## ----------------------------------------------------------------------
-## Check if they would like the C++ interface compiled
-##
-## We need to check for a C++ compiler unconditionally, since
-## AC_PROG_CXX defines some macros that Automake 1.9.x uses and will
-## miss even if c++ is not enabled.
-  ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if test -z "$CXX"; then
-  if test -n "$CCC"; then
-    CXX=$CCC
-  else
-    if test -n "$ac_tool_prefix"; then
-  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+
+
+
+  ## --------------------------------------------------------------------
+  ## Check for a Fortran compiler and how to include modules.
+  ##
+  ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in gfortran ifort pgf90 pathf90 pathf95 xlf90 xlf95 xlf2003 f90 epcf90 f95 fort lf95 g95 ifc efc gfc
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CXX+:} false; then :
+if ${ac_cv_prog_FC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$CXX"; then
-  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+  if test -n "$FC"; then
+  ac_cv_prog_FC="$FC" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -6705,7 +6620,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    ac_cv_prog_FC="$ac_tool_prefix$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -6715,32 +6630,32 @@ IFS=$as_save_IFS
 
 fi
 fi
-CXX=$ac_cv_prog_CXX
-if test -n "$CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
-$as_echo "$CXX" >&6; }
+FC=$ac_cv_prog_FC
+if test -n "$FC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FC" >&5
+$as_echo "$FC" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 fi
 
 
-    test -n "$CXX" && break
+    test -n "$FC" && break
   done
 fi
-if test -z "$CXX"; then
-  ac_ct_CXX=$CXX
-  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+if test -z "$FC"; then
+  ac_ct_FC=$FC
+  for ac_prog in gfortran ifort pgf90 pathf90 pathf95 xlf90 xlf95 xlf2003 f90 epcf90 f95 fort lf95 g95 ifc efc gfc
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+if ${ac_cv_prog_ac_ct_FC+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$ac_ct_CXX"; then
-  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+  if test -n "$ac_ct_FC"; then
+  ac_cv_prog_ac_ct_FC="$ac_ct_FC" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -6749,7 +6664,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    ac_cv_prog_ac_ct_FC="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -6759,21 +6674,21 @@ IFS=$as_save_IFS
 
 fi
 fi
-ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
-if test -n "$ac_ct_CXX"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
-$as_echo "$ac_ct_CXX" >&6; }
+ac_ct_FC=$ac_cv_prog_ac_ct_FC
+if test -n "$ac_ct_FC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FC" >&5
+$as_echo "$ac_ct_FC" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 fi
 
 
-  test -n "$ac_ct_CXX" && break
+  test -n "$ac_ct_FC" && break
 done
 
-  if test "x$ac_ct_CXX" = x; then
-    CXX="g++"
+  if test "x$ac_ct_FC" = x; then
+    FC=""
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
@@ -6781,14 +6696,13 @@ yes:)
 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
-    CXX=$ac_ct_CXX
+    FC=$ac_ct_FC
   fi
 fi
 
-  fi
-fi
+
 # Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran compiler version" >&5
 set X $ac_compile
 ac_compiler=$2
 for ac_option in --version -v -V -qversion; do
@@ -6811,1984 +6725,1762 @@ $as_echo "$ac_try_echo"; } >&5
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }
 done
+rm -f a.out
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
-$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
-if ${ac_cv_cxx_compiler_gnu+:} false; then :
+# If we don't use `.F' as extension, the preprocessor is not run on the
+# input file.  (Note that this only needs to work for GNU compilers.)
+ac_save_ext=$ac_ext
+ac_ext=F
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran compiler" >&5
+$as_echo_n "checking whether we are using the GNU Fortran compiler... " >&6; }
+if ${ac_cv_fc_compiler_gnu+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
+  cat > conftest.$ac_ext <<_ACEOF
+      program main
 #ifndef __GNUC__
        choke me
 #endif
 
-  ;
-  return 0;
-}
+      end
 _ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_fc_try_compile "$LINENO"; then :
   ac_compiler_gnu=yes
 else
   ac_compiler_gnu=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+ac_cv_fc_compiler_gnu=$ac_compiler_gnu
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
-$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
-if test $ac_compiler_gnu = yes; then
-  GXX=yes
-else
-  GXX=
-fi
-ac_test_CXXFLAGS=${CXXFLAGS+set}
-ac_save_CXXFLAGS=$CXXFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
-$as_echo_n "checking whether $CXX accepts -g... " >&6; }
-if ${ac_cv_prog_cxx_g+:} false; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_compiler_gnu" >&5
+$as_echo "$ac_cv_fc_compiler_gnu" >&6; }
+ac_ext=$ac_save_ext
+ac_test_FCFLAGS=${FCFLAGS+set}
+ac_save_FCFLAGS=$FCFLAGS
+FCFLAGS=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $FC accepts -g" >&5
+$as_echo_n "checking whether $FC accepts -g... " >&6; }
+if ${ac_cv_prog_fc_g+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
-   ac_cxx_werror_flag=yes
-   ac_cv_prog_cxx_g=no
-   CXXFLAGS="-g"
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_cv_prog_cxx_g=yes
-else
-  CXXFLAGS=""
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
+  FCFLAGS=-g
+cat > conftest.$ac_ext <<_ACEOF
+      program main
 
-  ;
-  return 0;
-}
+      end
 _ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-
+if ac_fn_fc_try_compile "$LINENO"; then :
+  ac_cv_prog_fc_g=yes
 else
-  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
-	 CXXFLAGS="-g"
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  ac_cv_prog_cxx_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_prog_fc_g=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
-$as_echo "$ac_cv_prog_cxx_g" >&6; }
-if test "$ac_test_CXXFLAGS" = set; then
-  CXXFLAGS=$ac_save_CXXFLAGS
-elif test $ac_cv_prog_cxx_g = yes; then
-  if test "$GXX" = yes; then
-    CXXFLAGS="-g -O2"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_g" >&5
+$as_echo "$ac_cv_prog_fc_g" >&6; }
+if test "$ac_test_FCFLAGS" = set; then
+  FCFLAGS=$ac_save_FCFLAGS
+elif test $ac_cv_prog_fc_g = yes; then
+  if test "x$ac_cv_fc_compiler_gnu" = xyes; then
+    FCFLAGS="-g -O2"
   else
-    CXXFLAGS="-g"
+    FCFLAGS="-g"
   fi
 else
-  if test "$GXX" = yes; then
-    CXXFLAGS="-O2"
+  if test "x$ac_cv_fc_compiler_gnu" = xyes; then
+    FCFLAGS="-O2"
   else
-    CXXFLAGS=
+    FCFLAGS=
   fi
 fi
+
+if test $ac_compiler_gnu = yes; then
+  GFC=yes
+else
+  GFC=
+fi
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-depcc="$CXX"  am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named 'D' -- because '-MD' means "put the output
-  # in D".
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CXX_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  am__universal=false
-  case " $depcc " in #(
-     *\ -arch\ *\ -arch\ *) am__universal=true ;;
-     esac
-
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
-      # Solaris 10 /bin/sh.
-      echo '/* dummy */' > sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    # We check with '-c' and '-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle '-M -o', and we need to detect this.  Also, some Intel
-    # versions had trouble with output in subdirs.
-    am__obj=sub/conftest.${OBJEXT-o}
-    am__minus_obj="-o $am__obj"
-    case $depmode in
-    gcc)
-      # This depmode causes a compiler race in universal mode.
-      test "$am__universal" = false || continue
-      ;;
-    nosideeffect)
-      # After this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested.
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
-      # This compiler won't grok '-c -o', but also, the minuso test has
-      # not run yet.  These depmodes are late enough in the game, and
-      # so weak that their functioning should not be impacted.
-      am__obj=conftest.${OBJEXT-o}
-      am__minus_obj=
-      ;;
-    none) break ;;
-    esac
-    if depmode=$depmode \
-       source=sub/conftest.c object=$am__obj \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CXX_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CXX_dependencies_compiler_type=none
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
-CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking what $FC does with modules" >&5
+$as_echo_n "checking what $FC does with modules... " >&6; }
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
- if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
-  am__fastdepCXX_TRUE=
-  am__fastdepCXX_FALSE='#'
-else
-  am__fastdepCXX_TRUE='#'
-  am__fastdepCXX_FALSE=
-fi
 
+test -d conftestdir || mkdir conftestdir
+cd conftestdir
+rm -rf *
 
-  ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
-$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
-if test -z "$CXXCPP"; then
-  if ${ac_cv_prog_CXXCPP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CXXCPP needs to be expanded
-    for CXXCPP in "$CXX -E" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
+cat >conftest.$ac_ext <<EOF
+      module module
+         integer foo
+      end module module
+EOF
 
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
+eval $ac_compile
+modfiles=""
+F9XMODEXT=""
 
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
+for f in conftest.o module.mod MODULE.mod module.M MODULE.M; do
+  if test -f "$f" ; then
+    modfiles="$f"
 
+    case "$f" in
+      *.o)   F9XMODEXT="o" ;;
+      *.mod) F9XMODEXT="mod" ;;
+      *.M)   F9XMODEXT="M" ;;
+    esac
+  fi
 done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
 
-    done
-    ac_cv_prog_CXXCPP=$CXXCPP
-
-fi
-  CXXCPP=$ac_cv_prog_CXXCPP
-else
-  ac_cv_prog_CXXCPP=$CXXCPP
+echo $modfiles 6>&1
+if test "$modfiles" = file.o; then
+  echo $ac_n "checking whether $FC -em is saner""... $ac_c" 1>&6
+  OLD_FCFLAGS=$FCFLAGS
+  FCFLAGS="$FCFLAGS -em"
+  eval $ac_compile
+  modfiles=""
+  for f in file.o module.mod MODULE.mod module.M MODULE.M; do
+    test -f $f && modfiles="$f"
+  done
+  if test "$modfiles" = "file.o"; then
+    FCFLAGS=$OLD_FCFLAGS
+    echo no 6>&1
+  else
+    echo yes 6>&1
+  fi
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
-$as_echo "$CXXCPP" >&6; }
-ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
+cd ..
 
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how $FC finds modules" >&5
+$as_echo_n "checking how $FC finds modules... " >&6; }
 
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
+for flag in "-I" "-M" "-p"; do
+  cat >conftest.$ac_ext <<EOF
+      program conftest
+          use module
+      end program conftest
+EOF
+
+  ac_compile='${FC-f90} $FCFLAGS ${flag}conftestdir -c conftest.$ac_ext 1>&5'
 
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    F9XMODFLAG=$flag
+    break
+  fi
 done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
 
+if test -n "$F9XMODFLAG"; then
+  echo $F9XMODFLAG 1>&6
+  FCFLAGS="$F9XMODFLAG. $FCFLAGS"
 else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
+  echo unknown 1>&6
 fi
 
+
+rm -rf conftest*
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
-	## this is checked for when AC_HEADER_STDC is done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if c++ interface enabled" >&5
-$as_echo_n "checking if c++ interface enabled... " >&6; }
-
-# Check whether --enable-cxx was given.
-if test "${enable_cxx+set}" = set; then :
-  enableval=$enable_cxx; HDF_CXX=$enableval
-fi
-
-
-if test "X$HDF_CXX" = "Xyes"; then
-  echo "yes"
-  HDF5_INTERFACES="$HDF5_INTERFACES c++"
-
-  ## Change to the C++ language
-  ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-  # Checking if C++ needs old style header files in includes
 
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX needs old style header files in includes" >&5
-$as_echo_n "checking if $CXX needs old style header files in includes... " >&6; }
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
 
-#include <iostream>
+  ## Change to the Fortran 90 language
+  ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
-int main(void) { return 0; }
 
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-    CXXFLAGS="${CXXFLAGS} -DOLD_HEADER_FILENAME"
-    AM_CXXFLAGS="${AM_CXXFLAGS} -DOLD_HEADER_FILENAME"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
+  ## Checking if the compiler supports the required Fortran 2003 features and
+  ## stopping if it does not.
 
+   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran compiler version compatible with Fortran 2003 HDF" >&5
+$as_echo_n "checking if Fortran compiler version compatible with Fortran 2003 HDF... " >&6; }
+    HAVE_F2003_REQUIREMENTS="no"
+    cat > conftest.$ac_ext <<_ACEOF
+      program main
 
-  # Checking if C++ can handle namespaces
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX can handle namespaces" >&5
-$as_echo_n "checking if $CXX can handle namespaces... " >&6; }
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
+        USE iso_c_binding
+        IMPLICIT NONE
+        TYPE(C_PTR) :: ptr
+        TYPE(C_FUNPTR) :: funptr
+        CHARACTER(LEN=80, KIND=c_char), TARGET :: ichr
 
-namespace H5 {
-int fnord;
-}
+        ptr = C_LOC(ichr(1:1))
 
-int main(void) {
-   using namespace H5;
-   fnord = 37;
-   return 0;
-}
 
+      end
 _ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
+if ac_fn_fc_try_link "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
+        HAVE_F2003_REQUIREMENTS=yes
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-     CXXFLAGS="${CXXFLAGS} -DH5_NO_NAMESPACE"
-     AM_CXXFLAGS="${AM_CXXFLAGS} -DH5_NO_NAMESPACE"
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 
 
-  # Checking if C++ has offsetof extension
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX has offsetof extension" >&5
-$as_echo_n "checking if $CXX has offsetof extension... " >&6; }
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-  #include <stdio.h>
-  #include <stddef.h>
+  if test "X$HAVE_F2003_REQUIREMENTS" = "Xno"; then
+    as_fn_error $? "Fortran compiler lacks required Fortran 2003 features; unsupported Fortran 2003 compiler, remove --enable-fortran" "$LINENO" 5
+  fi
 
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
+  ## --------------------------------------------------------------------
+  ## Define wrappers for the C compiler to use Fortran function names
+  ##
+  ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to get verbose linking output from $FC" >&5
+$as_echo_n "checking how to get verbose linking output from $FC... " >&6; }
+if ${ac_cv_prog_fc_v+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      program main
 
-    struct index_st
-    {
-      unsigned char type;
-      unsigned char num;
-      unsigned int len;
-    };
-    typedef struct index_st index_t;
-    int x,y;
-    x = offsetof(struct index_st, len);
-    y = offsetof(index_t, num)
+      end
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+  ac_cv_prog_fc_v=
+# Try some options frequently used verbose output
+for ac_verb in -v -verbose --verbose -V -\#\#\#; do
+  cat > conftest.$ac_ext <<_ACEOF
+      program main
 
-  ;
-  return 0;
-}
+      end
 _ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
 
-$as_echo "#define CXX_HAVE_OFFSETOF 1" >>confdefs.h
+# Compile and link our simple test program by passing a flag (argument
+# 1 to this macro) to the Fortran compiler in order to get
+# "verbose" output that we can then parse for the Fortran linker
+# flags.
+ac_save_FCFLAGS=$FCFLAGS
+FCFLAGS="$FCFLAGS $ac_verb"
+eval "set x $ac_link"
+shift
+$as_echo "$as_me:${as_lineno-$LINENO}: $*" >&5
+# gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH,
+# LIBRARY_PATH; skip all such settings.
+ac_fc_v_output=`eval $ac_link 5>&1 2>&1 |
+  sed '/^Driving:/d; /^Configured with:/d;
+      '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"`
+$as_echo "$ac_fc_v_output" >&5
+FCFLAGS=$ac_save_FCFLAGS
 
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
+rm -rf conftest*
 
+# On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where
+# /foo, /bar, and /baz are search directories for the Fortran linker.
+# Here, we change these into -L/foo -L/bar -L/baz (and put it first):
+ac_fc_v_output="`echo $ac_fc_v_output |
+	grep 'LPATH is:' |
+	sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_fc_v_output"
 
-  # if C++ can handle static cast
+# FIXME: we keep getting bitten by quoted arguments; a more general fix
+#        that detects unbalanced quotes in FLIBS should be implemented
+#        and (ugh) tested at some point.
+case $ac_fc_v_output in
+  # With xlf replace commas with spaces,
+  # and remove "-link" and closing parenthesis.
+  *xlfentry*)
+    ac_fc_v_output=`echo $ac_fc_v_output |
+      sed '
+        s/,/ /g
+        s/ -link / /g
+        s/) *$//
+      '
+    ` ;;
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX can handle static cast" >&5
-$as_echo_n "checking if $CXX can handle static cast... " >&6; }
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
+  # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted
+  # $LIBS confuse us, and the libraries appear later in the output anyway).
+  *mGLOB_options_string*)
+    ac_fc_v_output=`echo $ac_fc_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;;
 
-int main(void) {
-   float test_float;
-   int test_int;
-   test_float = 37.0;
-   test_int = static_cast <int> (test_float);
-   return 0;
-}
+  # Portland Group compiler has singly- or doubly-quoted -cmdline argument
+  # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4.
+  # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2".
+  *-cmdline\ * | *-ignore\ * | *-def\ *)
+    ac_fc_v_output=`echo $ac_fc_v_output | sed "\
+	s/-cmdline  *'[^']*'/ /g; s/-cmdline  *\"[^\"]*\"/ /g
+	s/-ignore  *'[^']*'/ /g; s/-ignore  *\"[^\"]*\"/ /g
+	s/-def  *'[^']*'/ /g; s/-def  *\"[^\"]*\"/ /g"` ;;
 
-_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    CXXFLAGS="${CXXFLAGS} -DNO_STATIC_CAST"
-    AM_CXXFLAGS="${AM_CXXFLAGS} -DNO_STATIC_CAST"
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
+  # If we are using fort77 (the f2c wrapper) then filter output and delete quotes.
+  *fort77*f2c*gcc*)
+    ac_fc_v_output=`echo "$ac_fc_v_output" | sed -n '
+        /:[	 ]\+Running[	 ]\{1,\}"gcc"/{
+          /"-c"/d
+          /[.]c"*/d
+          s/^.*"gcc"/"gcc"/
+          s/"//gp
+        }'` ;;
+
+  # If we are using Cray Fortran then delete quotes.
+  *cft90*)
+    ac_fc_v_output=`echo $ac_fc_v_output | sed 's/"//g'` ;;
+esac
 
 
+  # look for -l* and *.a constructs in the output
+  for ac_arg in $ac_fc_v_output; do
+     case $ac_arg in
+	[\\/]*.a | ?:[\\/]*.a | -[lLRu]*)
+	  ac_cv_prog_fc_v=$ac_verb
+	  break 2 ;;
+     esac
+  done
+done
+if test -z "$ac_cv_prog_fc_v"; then
+   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cannot determine how to obtain linking information from $FC" >&5
+$as_echo "$as_me: WARNING: cannot determine how to obtain linking information from $FC" >&2;}
+fi
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-  CXX="no"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: compilation failed" >&5
+$as_echo "$as_me: WARNING: compilation failed" >&2;}
 fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
-## Change back to the C language
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_fc_v" >&5
+$as_echo "$ac_cv_prog_fc_v" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran libraries of $FC" >&5
+$as_echo_n "checking for Fortran libraries of $FC... " >&6; }
+if ${ac_cv_fc_libs+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$FCLIBS" != "x"; then
+  ac_cv_fc_libs="$FCLIBS" # Let the user override the test.
+else
 
+cat > conftest.$ac_ext <<_ACEOF
+      program main
 
+      end
+_ACEOF
 
-## ----------------------------------------------------------------------
-## Check if they would like the High Level library  compiled
-##
+# Compile and link our simple test program by passing a flag (argument
+# 1 to this macro) to the Fortran compiler in order to get
+# "verbose" output that we can then parse for the Fortran linker
+# flags.
+ac_save_FCFLAGS=$FCFLAGS
+FCFLAGS="$FCFLAGS $ac_cv_prog_fc_v"
+eval "set x $ac_link"
+shift
+$as_echo "$as_me:${as_lineno-$LINENO}: $*" >&5
+# gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH,
+# LIBRARY_PATH; skip all such settings.
+ac_fc_v_output=`eval $ac_link 5>&1 2>&1 |
+  sed '/^Driving:/d; /^Configured with:/d;
+      '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"`
+$as_echo "$ac_fc_v_output" >&5
+FCFLAGS=$ac_save_FCFLAGS
 
- HL=""
-## name of fortran folder inside "hl", if FORTRAN compile is requested
- HL_FOR=""
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if high level library is enabled" >&5
-$as_echo_n "checking if high level library is enabled... " >&6; }
-# Check whether --enable-hl was given.
-if test "${enable_hl+set}" = set; then :
-  enableval=$enable_hl; HDF5_HL=$enableval
-else
-  HDF5_HL=yes
-fi
+rm -rf conftest*
 
+# On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where
+# /foo, /bar, and /baz are search directories for the Fortran linker.
+# Here, we change these into -L/foo -L/bar -L/baz (and put it first):
+ac_fc_v_output="`echo $ac_fc_v_output |
+	grep 'LPATH is:' |
+	sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_fc_v_output"
 
-if test "X$HDF5_HL" = "Xyes"; then
- echo "yes"
- HL="hl"
+# FIXME: we keep getting bitten by quoted arguments; a more general fix
+#        that detects unbalanced quotes in FLIBS should be implemented
+#        and (ugh) tested at some point.
+case $ac_fc_v_output in
+  # With xlf replace commas with spaces,
+  # and remove "-link" and closing parenthesis.
+  *xlfentry*)
+    ac_fc_v_output=`echo $ac_fc_v_output |
+      sed '
+        s/,/ /g
+        s/ -link / /g
+        s/) *$//
+      '
+    ` ;;
 
-$as_echo "#define INCLUDE_HL 1" >>confdefs.h
+  # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted
+  # $LIBS confuse us, and the libraries appear later in the output anyway).
+  *mGLOB_options_string*)
+    ac_fc_v_output=`echo $ac_fc_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;;
 
+  # Portland Group compiler has singly- or doubly-quoted -cmdline argument
+  # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4.
+  # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2".
+  *-cmdline\ * | *-ignore\ * | *-def\ *)
+    ac_fc_v_output=`echo $ac_fc_v_output | sed "\
+	s/-cmdline  *'[^']*'/ /g; s/-cmdline  *\"[^\"]*\"/ /g
+	s/-ignore  *'[^']*'/ /g; s/-ignore  *\"[^\"]*\"/ /g
+	s/-def  *'[^']*'/ /g; s/-def  *\"[^\"]*\"/ /g"` ;;
 
-  ## If Fortran's default real is double precision and HL is being built then configure
-  ## should fail due to bug HDFFV-889.
-  if test "X$FORTRAN_DEFAULT_REALisDBLE" = "Xyes"; then
-    as_fn_error $? "Fortran high-level routines are not supported when the default REAL is DOUBLE PRECISION, use configure option --disable-hl." "$LINENO" 5
-  fi
-else
- echo "no"
-fi
+  # If we are using fort77 (the f2c wrapper) then filter output and delete quotes.
+  *fort77*f2c*gcc*)
+    ac_fc_v_output=`echo "$ac_fc_v_output" | sed -n '
+        /:[	 ]\+Running[	 ]\{1,\}"gcc"/{
+          /"-c"/d
+          /[.]c"*/d
+          s/^.*"gcc"/"gcc"/
+          s/"//gp
+        }'` ;;
 
+  # If we are using Cray Fortran then delete quotes.
+  *cft90*)
+    ac_fc_v_output=`echo $ac_fc_v_output | sed 's/"//g'` ;;
+esac
 
-## ----------------------------------------------------------------------
-## Check if they have Perl installed on their system. We only need Perl
-## if they're using a GNU compiler.
-##
- PERL=""
-if test "X$GCC" = "Xyes"; then
-  for ac_prog in perl
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_PERL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$PERL"; then
-  ac_cv_prog_PERL="$PERL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_PERL="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
 
-fi
-fi
-PERL=$ac_cv_prog_PERL
-if test -n "$PERL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
-$as_echo "$PERL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
 
+ac_cv_fc_libs=
 
-  test -n "$PERL" && break
-done
+# Save positional arguments (if any)
+ac_save_positional="$@"
 
-fi
+set X $ac_fc_v_output
+while test $# != 1; do
+  shift
+  ac_arg=$1
+  case $ac_arg in
+	[\\/]*.a | ?:[\\/]*.a)
+	    ac_exists=false
+  for ac_i in $ac_cv_fc_libs; do
+    if test x"$ac_arg" = x"$ac_i"; then
+      ac_exists=true
+      break
+    fi
+  done
 
-## ----------------------------------------------------------------------
-## Check which archiving tool to use. This needs to be done before
-## the AM_PROG_LIBTOOL macro.
-##
+  if test x"$ac_exists" = xtrue; then :
 
-if test -z "$AR"; then
-  for ac_prog in ar xar
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AR+:} false; then :
-  $as_echo_n "(cached) " >&6
 else
-  if test -n "$AR"; then
-  ac_cv_prog_AR="$AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_AR="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
+  ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg"
+fi
+	  ;;
+	-bI:*)
+	    ac_exists=false
+  for ac_i in $ac_cv_fc_libs; do
+    if test x"$ac_arg" = x"$ac_i"; then
+      ac_exists=true
+      break
+    fi
   done
-IFS=$as_save_IFS
 
-fi
-fi
-AR=$ac_cv_prog_AR
-if test -n "$AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
+  if test x"$ac_exists" = xtrue; then :
+
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  if test "$ac_compiler_gnu" = yes; then
+  for ac_link_opt in $ac_arg; do
+    ac_cv_fc_libs="$ac_cv_fc_libs -Xlinker $ac_link_opt"
+  done
+else
+  ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg"
 fi
+fi
+	  ;;
+	  # Ignore these flags.
+	-lang* | -lcrt*.o | -lc | -lgcc* | -lSystem | -libmil | -little \
+	  |-LANG:=* | -LIST:* | -LNO:* | -link)
+	  ;;
+	-lkernel32)
+	  case $host_os in
+	  *cygwin*) ;;
+	  *) ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg"
+	    ;;
+	  esac
+	  ;;
+	-[LRuYz])
+	  # These flags, when seen by themselves, take an argument.
+	  # We remove the space between option and argument and re-iterate
+	  # unless we find an empty arg or a new option (starting with -)
+	  case $2 in
+	     "" | -*);;
+	     *)
+		ac_arg="$ac_arg$2"
+		shift; shift
+		set X $ac_arg "$@"
+		;;
+	  esac
+	  ;;
+	-YP,*)
+	  for ac_j in `$as_echo "$ac_arg" | sed -e 's/-YP,/-L/;s/:/ -L/g'`; do
+	      ac_exists=false
+  for ac_i in $ac_cv_fc_libs; do
+    if test x"$ac_j" = x"$ac_i"; then
+      ac_exists=true
+      break
+    fi
+  done
 
+  if test x"$ac_exists" = xtrue; then :
 
-  test -n "$AR" && break
-done
-test -n "$AR" || AR=":"
-
+else
+  ac_arg="$ac_arg $ac_j"
+			       ac_cv_fc_libs="$ac_cv_fc_libs $ac_j"
 fi
+	  done
+	  ;;
+	-[lLR]*)
+	    ac_exists=false
+  for ac_i in $ac_cv_fc_libs; do
+    if test x"$ac_arg" = x"$ac_i"; then
+      ac_exists=true
+      break
+    fi
+  done
 
+  if test x"$ac_exists" = xtrue; then :
 
-## Export the AR macro so that it will be placed in the libtool file
-## correctly.
-export AR
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
-set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
-  $as_echo_n "(cached) " >&6
 else
-  cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
-	@echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
-  *@@@%%%=?*=@@@%%%*)
-    eval ac_cv_prog_make_${ac_make}_set=yes;;
-  *)
-    eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
+  ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg"
 fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-  SET_MAKE=
+	  ;;
+	-zallextract*| -zdefaultextract)
+	  ac_cv_fc_libs="$ac_cv_fc_libs $ac_arg"
+	  ;;
+	  # Ignore everything else.
+  esac
+done
+# restore positional arguments
+set X $ac_save_positional; shift
+
+# We only consider "LD_RUN_PATH" on Solaris systems.  If this is seen,
+# then we insist that the "run path" must be an absolute path (i.e. it
+# must begin with a "/").
+case `(uname -sr) 2>/dev/null` in
+   "SunOS 5"*)
+      ac_ld_run_path=`$as_echo "$ac_fc_v_output" |
+			sed -n 's,^.*LD_RUN_PATH *= *\(/[^ ]*\).*$,-R\1,p'`
+      test "x$ac_ld_run_path" != x &&
+	if test "$ac_compiler_gnu" = yes; then
+  for ac_link_opt in $ac_ld_run_path; do
+    ac_cv_fc_libs="$ac_cv_fc_libs -Xlinker $ac_link_opt"
+  done
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-  SET_MAKE="MAKE=${MAKE-make}"
+  ac_cv_fc_libs="$ac_cv_fc_libs $ac_ld_run_path"
 fi
+      ;;
+esac
+fi # test "x$[]_AC_LANG_PREFIX[]LIBS" = "x"
 
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_libs" >&5
+$as_echo "$ac_cv_fc_libs" >&6; }
+FCLIBS="$ac_cv_fc_libs"
 
 
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
-## ----------------------------------------------------------------------
-## Set up ${TR} which is used to process DEBUG_PKG.
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
-# Extract the first word of "tr", so it can be a program name with args.
-set dummy tr; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_TR+:} false; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dummy main to link with Fortran libraries" >&5
+$as_echo_n "checking for dummy main to link with Fortran libraries... " >&6; }
+if ${ac_cv_fc_dummy_main+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  case $TR in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_TR="$TR" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_TR="$as_dir/$ac_word$ac_exec_ext"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
+  ac_fc_dm_save_LIBS=$LIBS
+ LIBS="$LIBS $FCLIBS"
+ ac_fortran_dm_var=FC_DUMMY_MAIN
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-  ;;
-esac
-fi
-TR=$ac_cv_path_TR
-if test -n "$TR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TR" >&5
-$as_echo "$TR" >&6; }
+ # First, try linking without a dummy main:
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_fortran_dummy_main=none
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  ac_cv_fortran_dummy_main=unknown
 fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 
+ if test $ac_cv_fortran_dummy_main = unknown; then
+   for ac_func in MAIN__ MAIN_ __main MAIN _MAIN __MAIN main_ main__ _main; do
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define $ac_fortran_dm_var $ac_func
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
 
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_fortran_dummy_main=$ac_func; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+   done
+ fi
+ ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+ ac_cv_fc_dummy_main=$ac_cv_fortran_dummy_main
+ rm -rf conftest*
+ LIBS=$ac_fc_dm_save_LIBS
 
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_dummy_main" >&5
+$as_echo "$ac_cv_fc_dummy_main" >&6; }
+FC_DUMMY_MAIN=$ac_cv_fc_dummy_main
+if test "$FC_DUMMY_MAIN" != unknown; then :
+  if test $FC_DUMMY_MAIN != none; then
 
-## ----------------------------------------------------------------------
-## Check that time can be used with srcdir.  This is okay on most systems,
-## but seems to cause problems on Cygwin.
-## The solution on Cygwin is not to record execution time for tests.
-##
-## Note: This is still true as of Cygwin 1.7.32 (Aug 2014) on both 32-
-## and 64-bit platforms. Given how long this has been true, it seems
-## unlikely to change, but we should probably re-test this periodically.
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if srcdir= and time commands work together" >&5
-$as_echo_n "checking if srcdir= and time commands work together... " >&6; }
+cat >>confdefs.h <<_ACEOF
+#define FC_DUMMY_MAIN $FC_DUMMY_MAIN
+_ACEOF
 
+  if test "x$ac_cv_fc_dummy_main" = "x$ac_cv_f77_dummy_main"; then
 
-TIME=time
-TIME_TEST=`foo="bar" ${TIME} echo 'baz' 2> /dev/null | grep baz`
+$as_echo "#define FC_DUMMY_MAIN_EQ_F77 1" >>confdefs.h
 
-if test "X${TIME_TEST}" = "Xbaz"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+  fi
+fi
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-  TIME=
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "linking to Fortran libraries from C fails
+See \`config.log' for more details" "$LINENO" 5; }
 fi
 
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
-## The following variables are used to distinguish between building a
-## serial and parallel library.
-##
-##    HAVE_PARALLEL	-- defined in H5config.h if we are building
-##			   a parallel library even if configure wasn't
-##			   able to find some header file or library that
-##			   might be required. This is defined if the
-##			   user explicitly states
-##			   that a parallel library is being built by supplying
-##			   the `--enable-parallel' configure switch.
-##
-##    PARALLEL		-- This variable is set to a non-null value if
-##			   we're building a parallel version of the library.
-##
-##    RUNSERIAL	        -- This is a command which will be prepended to
-##			   the executable name to run the executable using
-##			   a single process. For serial versions of the
-##			   library this will normally be empty. For parallel
-##			   versions it might be something like `mpiexec -n 1'.
-##			   The value of this variable is substituted in *.in
-##			   files.
-##
-##    RUNPARALLEL	-- This is a command which will be prepended to
-##			   the executable name to run the executable on
-##			   multiple processors. For the serial library the
-##			   value will normally be the empty string. For
-##			   parallel library it should be something like
-##			   "mpiexec -n \$\${NPROCS:=6}" where NPROCS will
-##			   eventually contain the number of processors on which
-##			   to run the executable (the double dollarsigns are to
-##			   protect the expansion until make executes the
-##			   command).  The value of this variable is
-##			   substituted in *.in files.
-##
-
-
-
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran name-mangling scheme" >&5
+$as_echo_n "checking for Fortran name-mangling scheme... " >&6; }
+if ${ac_cv_fc_mangling+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      subroutine foobar()
+      return
+      end
+      subroutine foo_bar()
+      return
+      end
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+  mv conftest.$ac_objext cfortran_test.$ac_objext
 
+  ac_save_LIBS=$LIBS
+  LIBS="cfortran_test.$ac_objext $LIBS $FCLIBS"
 
-## ----------------------------------------------------------------------
-## Fortran libraries are not currently supported on Mac. Disable them.
-## (this is overridable with --enable-unsupported).
-##
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+  ac_success=no
+  for ac_foobar in foobar FOOBAR; do
+    for ac_underscore in "" "_"; do
+      ac_func="$ac_foobar$ac_underscore"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-H5_FORTRAN_SHARED="no"
-if test "X${HDF_FORTRAN}" = "Xyes" && test "X${enable_shared}" != "Xno"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if shared Fortran libraries are supported" >&5
-$as_echo_n "checking if shared Fortran libraries are supported... " >&6; }
-  H5_FORTRAN_SHARED="yes"
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_success=yes; break 2
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    done
+  done
+  ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
-  ## Disable fortran shared libraries on Mac. (MAM - 03/30/11)
+  if test "$ac_success" = "yes"; then
+     case $ac_foobar in
+	foobar)
+	   ac_case=lower
+	   ac_foo_bar=foo_bar
+	   ;;
+	FOOBAR)
+	   ac_case=upper
+	   ac_foo_bar=FOO_BAR
+	   ;;
+     esac
 
-  case "`uname`" in
-    Darwin*)
-    H5_FORTRAN_SHARED="no"
-    CHECK_WARN="Shared Fortran libraries not currently supported on Mac."
-      ;;
-  esac
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+     ac_success_extra=no
+     for ac_extra in "" "_"; do
+	ac_func="$ac_foo_bar$ac_underscore$ac_extra"
+	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-  ## Report results of check(s)
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $ac_func ();
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+return $ac_func ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_success_extra=yes; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     done
+     ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
-  if test "X${H5_FORTRAN_SHARED}" = "Xno"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $CHECK_WARN" >&5
-$as_echo "$as_me: WARNING: $CHECK_WARN" >&2;}
-    if test "X${ALLOW_UNSUPPORTED}" != "Xyes"; then
-      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disabling shared Fortran libraries." >&5
-$as_echo "$as_me: WARNING: Disabling shared Fortran libraries." >&2;}
-      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: To override this behavior, please use --enable-unsupported configure option." >&5
-$as_echo "$as_me: WARNING: To override this behavior, please use --enable-unsupported configure option." >&2;}
-        if test "X${enable_static}" = "Xno"; then
-          as_fn_error $? "both static and shared Fortran libraries are disabled" "$LINENO" 5
-        fi
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Allowing unsupported Fortran shared libraries due to use of --enable-unsupported flag" >&5
-$as_echo "$as_me: WARNING: Allowing unsupported Fortran shared libraries due to use of --enable-unsupported flag" >&2;}
-      H5_FORTRAN_SHARED="yes"
-    fi
+     if test "$ac_success_extra" = "yes"; then
+	ac_cv_fc_mangling="$ac_case case"
+	if test -z "$ac_underscore"; then
+	   ac_cv_fc_mangling="$ac_cv_fc_mangling, no underscore"
+	else
+	   ac_cv_fc_mangling="$ac_cv_fc_mangling, underscore"
+	fi
+	if test -z "$ac_extra"; then
+	   ac_cv_fc_mangling="$ac_cv_fc_mangling, no extra underscore"
+	else
+	   ac_cv_fc_mangling="$ac_cv_fc_mangling, extra underscore"
+	fi
+      else
+	ac_cv_fc_mangling="unknown"
+      fi
   else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+     ac_cv_fc_mangling="unknown"
   fi
-fi
 
- if test "X$H5_FORTRAN_SHARED" = "Xyes"; then
-  FORTRAN_SHARED_CONDITIONAL_TRUE=
-  FORTRAN_SHARED_CONDITIONAL_FALSE='#'
+  LIBS=$ac_save_LIBS
+  rm -rf conftest*
+  rm -f cfortran_test*
 else
-  FORTRAN_SHARED_CONDITIONAL_TRUE='#'
-  FORTRAN_SHARED_CONDITIONAL_FALSE=
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compile a simple Fortran program
+See \`config.log' for more details" "$LINENO" 5; }
 fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_fc_mangling" >&5
+$as_echo "$ac_cv_fc_mangling" >&6; }
 
-## ----------------------------------------------------------------------
-## Create libtool.  If shared/static libraries are going to be enabled
-## or disabled, it should happen before these macros.
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+case $ac_cv_fc_mangling in
+  "lower case, no underscore, no extra underscore")
+	  $as_echo "#define FC_FUNC(name,NAME) name" >>confdefs.h
 
-## ----------------------------------------------------------------------
-## dlopen - This will use an improved version of libtool
-## win32-dll - This will build clean dlls on win32 platforms.
-case `pwd` in
-  *\ * | *\	*)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
-$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
-esac
+	  $as_echo "#define FC_FUNC_(name,NAME) name" >>confdefs.h
+ ;;
+  "lower case, no underscore, extra underscore")
+	  $as_echo "#define FC_FUNC(name,NAME) name" >>confdefs.h
 
+	  $as_echo "#define FC_FUNC_(name,NAME) name ## _" >>confdefs.h
+ ;;
+  "lower case, underscore, no extra underscore")
+	  $as_echo "#define FC_FUNC(name,NAME) name ## _" >>confdefs.h
 
+	  $as_echo "#define FC_FUNC_(name,NAME) name ## _" >>confdefs.h
+ ;;
+  "lower case, underscore, extra underscore")
+	  $as_echo "#define FC_FUNC(name,NAME) name ## _" >>confdefs.h
 
-macro_version='2.4.2'
-macro_revision='1.3337'
+	  $as_echo "#define FC_FUNC_(name,NAME) name ## __" >>confdefs.h
+ ;;
+  "upper case, no underscore, no extra underscore")
+	  $as_echo "#define FC_FUNC(name,NAME) NAME" >>confdefs.h
 
+	  $as_echo "#define FC_FUNC_(name,NAME) NAME" >>confdefs.h
+ ;;
+  "upper case, no underscore, extra underscore")
+	  $as_echo "#define FC_FUNC(name,NAME) NAME" >>confdefs.h
 
+	  $as_echo "#define FC_FUNC_(name,NAME) NAME ## _" >>confdefs.h
+ ;;
+  "upper case, underscore, no extra underscore")
+	  $as_echo "#define FC_FUNC(name,NAME) NAME ## _" >>confdefs.h
 
+	  $as_echo "#define FC_FUNC_(name,NAME) NAME ## _" >>confdefs.h
+ ;;
+  "upper case, underscore, extra underscore")
+	  $as_echo "#define FC_FUNC(name,NAME) NAME ## _" >>confdefs.h
 
+	  $as_echo "#define FC_FUNC_(name,NAME) NAME ## __" >>confdefs.h
+ ;;
+  *)
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unknown Fortran name-mangling scheme" >&5
+$as_echo "$as_me: WARNING: unknown Fortran name-mangling scheme" >&2;}
+	  ;;
+esac
 
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
 
+  ## --------------------------------------------------------------------
+  ## See if the fortran compiler supports the intrinsic function "SIZEOF"
 
+  HAVE_SIZEOF_FORTRAN="no"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran compiler supports intrinsic SIZEOF" >&5
+$as_echo_n "checking if Fortran compiler supports intrinsic SIZEOF... " >&6; }
+  cat > conftest.$ac_ext <<_ACEOF
 
+   PROGRAM main
+     i = sizeof(x)
+   END PROGRAM
 
+_ACEOF
+if ac_fn_fc_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+     	HAVE_SIZEOF_FORTRAN="yes"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 
 
+  ## See if the fortran compiler supports the intrinsic function "C_SIZEOF"
 
-ltmain="$ac_aux_dir/ltmain.sh"
+  HAVE_C_SIZEOF_FORTRAN="no"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran compiler supports intrinsic C_SIZEOF" >&5
+$as_echo_n "checking if Fortran compiler supports intrinsic C_SIZEOF... " >&6; }
+  cat > conftest.$ac_ext <<_ACEOF
 
-# Backslashify metacharacters that are still active within
-# double-quoted strings.
-sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+   PROGRAM main
+     USE ISO_C_BINDING
+     INTEGER(C_INT) :: a
+     INTEGER(C_SIZE_T) :: result
+     result = C_SIZEOF(a)
+   END PROGRAM
 
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
+_ACEOF
+if ac_fn_fc_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+     	HAVE_C_SIZEOF_FORTRAN="yes"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
 
-# Sed substitution to delay expansion of an escaped single quote.
-delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+  ## See if the fortran compiler supports the intrinsic function "STORAGE_SIZE"
 
-# Sed substitution to avoid accidental globbing in evaled expressions
-no_glob_subst='s/\*/\\\*/g'
+  HAVE_STORAGE_SIZE_FORTRAN="no"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran compiler supports intrinsic STORAGE_SIZE" >&5
+$as_echo_n "checking if Fortran compiler supports intrinsic STORAGE_SIZE... " >&6; }
+  cat > conftest.$ac_ext <<_ACEOF
 
-ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
-ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+   PROGRAM main
+     INTEGER :: a
+     INTEGER :: result
+     result = STORAGE_SIZE(a)
+   END PROGRAM
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
-$as_echo_n "checking how to print strings... " >&6; }
-# Test print first, because it will be a builtin if present.
-if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
-   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='print -r --'
-elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
-  ECHO='printf %s\n'
+_ACEOF
+if ac_fn_fc_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+     	HAVE_STORAGE_SIZE_FORTRAN="yes"
 else
-  # Use this function as a fallback that always works.
-  func_fallback_echo ()
-  {
-    eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-  }
-  ECHO='func_fallback_echo'
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO ""
-}
 
-case "$ECHO" in
-  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
-$as_echo "printf" >&6; } ;;
-  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
-$as_echo "print -r" >&6; } ;;
-  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
-$as_echo "cat" >&6; } ;;
-esac
 
+  ## Set the sizeof function for use later in the fortran tests
+  if test "X$HAVE_STORAGE_SIZE_FORTRAN" = "Xyes";then
+    FC_SIZEOF_A="STORAGE_SIZE(a, c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)"
+    FC_SIZEOF_B="STORAGE_SIZE(b, c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)"
+    FC_SIZEOF_C="STORAGE_SIZE(c, c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)"
+  else
+    if test "X$HAVE_SIZEOF_FORTRAN" = "Xyes";then
+      FC_SIZEOF_A="SIZEOF(a)"
+      FC_SIZEOF_B="SIZEOF(b)"
+      FC_SIZEOF_C="SIZEOF(c)"
+    else
+      ## If neither intrinsic functions SIZEOF or STORAGE_SIZE is available then stop configure with an error
+      as_fn_error $? "Fortran compiler requires either intrinsic functions SIZEOF or STORAGE_SIZE" "$LINENO" 5
+    fi
+  fi
 
+  ## See if the fortran compiler supports the intrinsic module "ISO_FORTRAN_ENV"
 
+  HAVE_ISO_FORTRAN_ENV="no"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran compiler supports intrinsic module ISO_FORTRAN_ENV" >&5
+$as_echo_n "checking if Fortran compiler supports intrinsic module ISO_FORTRAN_ENV... " >&6; }
+  cat > conftest.$ac_ext <<_ACEOF
 
+   PROGRAM main
+     USE, INTRINSIC :: ISO_FORTRAN_ENV
+   END PROGRAM
 
+_ACEOF
+if ac_fn_fc_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+     	HAVE_ISO_FORTRAN_ENV="yes"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 
+  ## Check KIND and size of native integer
 
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
+rm -f pac_fconftest.out
 
+if test "$cross_compiling" = yes; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  cat > conftest.$ac_ext <<_ACEOF
 
 
+    PROGRAM main
+        IMPLICIT NONE
+        INTEGER :: ik, k, lastkind, max_decimal_prec
+	INTEGER :: num_rkinds, num_ikinds
+        num_ikinds = 0
+        lastkind=SELECTED_INT_KIND(1)
+        OPEN(8, FILE='pac_fconftest.out', form='formatted')
+        ! Find integer KINDs
+        DO ik=2,36
+             k = SELECTED_INT_KIND(ik)
+             IF (k .NE. lastkind) THEN
+	          num_ikinds = num_ikinds + 1
+                  WRITE(8,'(I0)',ADVANCE='NO') lastkind
+                  lastkind = k
+             	  IF(k.GT.0) WRITE(8,'(A)',ADVANCE='NO') ','
+             ENDIF
+             IF (k .LE. 0) EXIT
+        ENDDO
+	IF (lastkind.NE.-1) THEN
+	   num_ikinds = num_ikinds + 1
+           WRITE(8,'(I0)') lastkind
+	ELSE
+           WRITE(8,'()')
+        ENDIF
+        ! Find real KINDs
+        num_rkinds = 0
+        lastkind=SELECTED_REAL_KIND(1)
+	max_decimal_prec = 1
+        DO ik=2,36
+             k = SELECTED_REAL_KIND(ik)
+             IF (k .NE. lastkind) THEN
+                  num_rkinds = num_rkinds + 1
+                  WRITE(8,'(I0)',ADVANCE='NO') lastkind
+                  lastkind = k
+             	  IF(k.GT.0) WRITE(8,'(A)',ADVANCE='NO') ','
+	          max_decimal_prec = ik
+             ENDIF
+             IF (k .LE. 0) EXIT
+        ENDDO
+        IF (lastkind.NE.-1)THEN
+	    num_rkinds = num_rkinds + 1
+            WRITE(8,'(I0)') lastkind
+	ELSE
+           WRITE(8,'()')
+        ENDIF
+	WRITE(8,'(I0)') max_decimal_prec
+	WRITE(8,'(I0)') num_ikinds
+	WRITE(8,'(I0)') num_rkinds
+    END
+
+
+_ACEOF
+if ac_fn_fc_try_run "$LINENO"; then :
+
+    if test -s pac_fconftest.out ; then
+
+
+        pac_validIntKinds="`sed -n '1p' pac_fconftest.out`"
+	pac_validRealKinds="`sed -n '2p' pac_fconftest.out`"
+        PAC_FC_MAX_REAL_PRECISION="`sed -n '3p' pac_fconftest.out`"
 
+cat >>confdefs.h <<_ACEOF
+#define PAC_FC_MAX_REAL_PRECISION $PAC_FC_MAX_REAL_PRECISION
+_ACEOF
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
-$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if ${ac_cv_path_SED+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
-     for ac_i in 1 2 3 4 5 6 7; do
-       ac_script="$ac_script$as_nl$ac_script"
-     done
-     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
-     { ac_script=; unset ac_script;}
-     if test -z "$SED"; then
-  ac_path_SED_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in sed gsed; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
-      as_fn_executable_p "$ac_path_SED" || continue
-# Check for GNU ac_path_SED and select it if it is found.
-  # Check for GNU $ac_path_SED
-case `"$ac_path_SED" --version 2>&1` in
-*GNU*)
-  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo '' >> "conftest.nl"
-    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_SED_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_SED="$ac_path_SED"
-      ac_path_SED_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
+        PAC_FC_ALL_INTEGER_KINDS="{`echo $pac_validIntKinds`}"
+        PAC_FC_ALL_REAL_KINDS="{`echo $pac_validRealKinds`}"
 
-      $ac_path_SED_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_SED"; then
-    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
-  fi
-else
-  ac_cv_path_SED=$SED
-fi
+	H5CONFIG_F_NUM_IKIND="INTEGER, PARAMETER :: num_ikinds = `sed -n '4p' pac_fconftest.out`"
+	H5CONFIG_F_IKIND="INTEGER, DIMENSION(1:num_ikinds) :: ikind = (/`echo $pac_validIntKinds`/)"
+	H5CONFIG_F_NUM_RKIND="INTEGER, PARAMETER :: num_rkinds = `sed -n '5p' pac_fconftest.out`"
+	H5CONFIG_F_RKIND="INTEGER, DIMENSION(1:num_rkinds) :: rkind = (/`echo $pac_validRealKinds`/)"
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
-$as_echo "$ac_cv_path_SED" >&6; }
- SED="$ac_cv_path_SED"
-  rm -f conftest.sed
 
-test -z "$SED" && SED=sed
-Xsed="$SED -e 1s/^X//"
+cat >>confdefs.h <<_ACEOF
+#define H5CONFIG_F_NUM_RKIND $H5CONFIG_F_NUM_RKIND
+_ACEOF
 
 
+cat >>confdefs.h <<_ACEOF
+#define H5CONFIG_F_NUM_IKIND $H5CONFIG_F_NUM_IKIND
+_ACEOF
 
 
+cat >>confdefs.h <<_ACEOF
+#define H5CONFIG_F_RKIND $H5CONFIG_F_RKIND
+_ACEOF
 
 
+cat >>confdefs.h <<_ACEOF
+#define H5CONFIG_F_IKIND $H5CONFIG_F_IKIND
+_ACEOF
+
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran INTEGER KINDs" >&5
+$as_echo_n "checking for Fortran INTEGER KINDs... " >&6; }
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PAC_FC_ALL_INTEGER_KINDS" >&5
+$as_echo "$PAC_FC_ALL_INTEGER_KINDS" >&6; }
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran REAL KINDs" >&5
+$as_echo_n "checking for Fortran REAL KINDs... " >&6; }
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PAC_FC_ALL_REAL_KINDS" >&5
+$as_echo "$PAC_FC_ALL_REAL_KINDS" >&6; }
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran REALs maximum decimal precision" >&5
+$as_echo_n "checking for Fortran REALs maximum decimal precision... " >&6; }
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PAC_FC_MAX_REAL_PRECISION" >&5
+$as_echo "$PAC_FC_MAX_REAL_PRECISION" >&6; }
+    else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: Error" >&5
+$as_echo "Error" >&6; }
+        { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No output from test program!" >&5
+$as_echo "$as_me: WARNING: No output from test program!" >&2;}
+    fi
+    rm -f pac_fconftest.out
 
+else
 
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: Error" >&5
+$as_echo "Error" >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Failed to run program to determine available KINDs" >&5
+$as_echo "$as_me: WARNING: Failed to run program to determine available KINDs" >&2;}
 
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$GREP"; then
-  ac_path_GREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in grep ggrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-      as_fn_executable_p "$ac_path_GREP" || continue
-# Check for GNU ac_path_GREP and select it if it is found.
-  # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'GREP' >> "conftest.nl"
-    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_GREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_GREP="$ac_path_GREP"
-      ac_path_GREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
-      $ac_path_GREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_GREP"; then
-    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_GREP=$GREP
-fi
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
-   then ac_cv_path_EGREP="$GREP -E"
-   else
-     if test -z "$EGREP"; then
-  ac_path_EGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in egrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-      as_fn_executable_p "$ac_path_EGREP" || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
-  # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'EGREP' >> "conftest.nl"
-    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_EGREP="$ac_path_EGREP"
-      ac_path_EGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sizeof of native KINDS" >&5
+$as_echo_n "checking sizeof of native KINDS... " >&6; }
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
-      $ac_path_EGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_EGREP"; then
-    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
-else
-  ac_cv_path_EGREP=$EGREP
-fi
+pack_int_sizeof=""
+rm -f pac_fconftest.out
+  cat > conftest.$ac_ext <<_ACEOF
 
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
 
+                PROGRAM main
+                USE ISO_C_BINDING
+                IMPLICIT NONE
+                INTEGER a
+                REAL b
+                DOUBLE PRECISION c
+                OPEN(8, FILE='pac_fconftest.out', FORM='formatted')
+                WRITE(8,*) $FC_SIZEOF_A
+	        WRITE(8,*) kind(a)
+	        WRITE(8,*) $FC_SIZEOF_B
+	        WRITE(8,*) kind(b)
+                WRITE(8,*) $FC_SIZEOF_C
+                WRITE(8,*) kind(c)
+                CLOSE(8)
+                END
+
+
+_ACEOF
+        if test "$cross_compiling" = yes; then :
+
+            pack_int_sizeof=""
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
-$as_echo_n "checking for fgrep... " >&6; }
-if ${ac_cv_path_FGREP+:} false; then :
-  $as_echo_n "(cached) " >&6
 else
-  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
-   then ac_cv_path_FGREP="$GREP -F"
-   else
-     if test -z "$FGREP"; then
-  ac_path_FGREP_found=false
-  # Loop through the user's path and test for each of PROGNAME-LIST
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_prog in fgrep; do
-    for ac_exec_ext in '' $ac_executable_extensions; do
-      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
-      as_fn_executable_p "$ac_path_FGREP" || continue
-# Check for GNU ac_path_FGREP and select it if it is found.
-  # Check for GNU $ac_path_FGREP
-case `"$ac_path_FGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
-*)
-  ac_count=0
-  $as_echo_n 0123456789 >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    $as_echo 'FGREP' >> "conftest.nl"
-    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    as_fn_arith $ac_count + 1 && ac_count=$as_val
-    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_FGREP="$ac_path_FGREP"
-      ac_path_FGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
+  if ac_fn_fc_try_run "$LINENO"; then :
+
+            if test -s pac_fconftest.out ; then
+                PAC_FORTRAN_NATIVE_INTEGER_KIND="`sed -n '1p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_INTEGER_SIZEOF="`sed -n '2p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_REAL_KIND="`sed -n '3p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_REAL_SIZEOF="`sed -n '4p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_DOUBLE_KIND="`sed -n '5p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF="`sed -n '6p' pac_fconftest.out`"
+            else
+                { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No output from test program!" >&5
+$as_echo "$as_me: WARNING: No output from test program!" >&2;}
+            fi
+            rm -f pac_fconftest.out
 
-      $ac_path_FGREP_found && break 3
-    done
-  done
-  done
-IFS=$as_save_IFS
-  if test -z "$ac_cv_path_FGREP"; then
-    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
-  fi
 else
-  ac_cv_path_FGREP=$FGREP
-fi
 
-   fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
-$as_echo "$ac_cv_path_FGREP" >&6; }
- FGREP="$ac_cv_path_FGREP"
+            { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Fortran program fails to build or run!" >&5
+$as_echo "$as_me: WARNING: Fortran program fails to build or run!" >&2;}
 
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam
+fi
 
-test -z "$GREP" && GREP=grep
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pack_int_sizeof" >&5
+$as_echo "$pack_int_sizeof" >&6; }
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
 
 
+  ## Find all available KINDs
 
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
+rm -f pac_fconftest.out
 
+if test "$cross_compiling" = yes; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run test program while cross compiling
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  cat > conftest.$ac_ext <<_ACEOF
 
 
+    PROGRAM main
+        IMPLICIT NONE
+        INTEGER :: ik, k, lastkind, max_decimal_prec
+	INTEGER :: num_rkinds, num_ikinds
+        num_ikinds = 0
+        lastkind=SELECTED_INT_KIND(1)
+        OPEN(8, FILE='pac_fconftest.out', form='formatted')
+        ! Find integer KINDs
+        DO ik=2,36
+             k = SELECTED_INT_KIND(ik)
+             IF (k .NE. lastkind) THEN
+	          num_ikinds = num_ikinds + 1
+                  WRITE(8,'(I0)',ADVANCE='NO') lastkind
+                  lastkind = k
+             	  IF(k.GT.0) WRITE(8,'(A)',ADVANCE='NO') ','
+             ENDIF
+             IF (k .LE. 0) EXIT
+        ENDDO
+	IF (lastkind.NE.-1) THEN
+	   num_ikinds = num_ikinds + 1
+           WRITE(8,'(I0)') lastkind
+	ELSE
+           WRITE(8,'()')
+        ENDIF
+        ! Find real KINDs
+        num_rkinds = 0
+        lastkind=SELECTED_REAL_KIND(1)
+	max_decimal_prec = 1
+        DO ik=2,36
+             k = SELECTED_REAL_KIND(ik)
+             IF (k .NE. lastkind) THEN
+                  num_rkinds = num_rkinds + 1
+                  WRITE(8,'(I0)',ADVANCE='NO') lastkind
+                  lastkind = k
+             	  IF(k.GT.0) WRITE(8,'(A)',ADVANCE='NO') ','
+	          max_decimal_prec = ik
+             ENDIF
+             IF (k .LE. 0) EXIT
+        ENDDO
+        IF (lastkind.NE.-1)THEN
+	    num_rkinds = num_rkinds + 1
+            WRITE(8,'(I0)') lastkind
+	ELSE
+           WRITE(8,'()')
+        ENDIF
+	WRITE(8,'(I0)') max_decimal_prec
+	WRITE(8,'(I0)') num_ikinds
+	WRITE(8,'(I0)') num_rkinds
+    END
+
+
+_ACEOF
+if ac_fn_fc_try_run "$LINENO"; then :
+
+    if test -s pac_fconftest.out ; then
+
+
+        pac_validIntKinds="`sed -n '1p' pac_fconftest.out`"
+	pac_validRealKinds="`sed -n '2p' pac_fconftest.out`"
+        PAC_FC_MAX_REAL_PRECISION="`sed -n '3p' pac_fconftest.out`"
 
+cat >>confdefs.h <<_ACEOF
+#define PAC_FC_MAX_REAL_PRECISION $PAC_FC_MAX_REAL_PRECISION
+_ACEOF
 
 
+        PAC_FC_ALL_INTEGER_KINDS="{`echo $pac_validIntKinds`}"
+        PAC_FC_ALL_REAL_KINDS="{`echo $pac_validRealKinds`}"
 
+	H5CONFIG_F_NUM_IKIND="INTEGER, PARAMETER :: num_ikinds = `sed -n '4p' pac_fconftest.out`"
+	H5CONFIG_F_IKIND="INTEGER, DIMENSION(1:num_ikinds) :: ikind = (/`echo $pac_validIntKinds`/)"
+	H5CONFIG_F_NUM_RKIND="INTEGER, PARAMETER :: num_rkinds = `sed -n '5p' pac_fconftest.out`"
+	H5CONFIG_F_RKIND="INTEGER, DIMENSION(1:num_rkinds) :: rkind = (/`echo $pac_validRealKinds`/)"
 
 
+cat >>confdefs.h <<_ACEOF
+#define H5CONFIG_F_NUM_RKIND $H5CONFIG_F_NUM_RKIND
+_ACEOF
 
 
+cat >>confdefs.h <<_ACEOF
+#define H5CONFIG_F_NUM_IKIND $H5CONFIG_F_NUM_IKIND
+_ACEOF
 
 
+cat >>confdefs.h <<_ACEOF
+#define H5CONFIG_F_RKIND $H5CONFIG_F_RKIND
+_ACEOF
 
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi
 
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if ${lt_cv_path_LD+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
+cat >>confdefs.h <<_ACEOF
+#define H5CONFIG_F_IKIND $H5CONFIG_F_IKIND
+_ACEOF
+
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran INTEGER KINDs" >&5
+$as_echo_n "checking for Fortran INTEGER KINDs... " >&6; }
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PAC_FC_ALL_INTEGER_KINDS" >&5
+$as_echo "$PAC_FC_ALL_INTEGER_KINDS" >&6; }
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran REAL KINDs" >&5
+$as_echo_n "checking for Fortran REAL KINDs... " >&6; }
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PAC_FC_ALL_REAL_KINDS" >&5
+$as_echo "$PAC_FC_ALL_REAL_KINDS" >&6; }
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran REALs maximum decimal precision" >&5
+$as_echo_n "checking for Fortran REALs maximum decimal precision... " >&6; }
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PAC_FC_MAX_REAL_PRECISION" >&5
+$as_echo "$PAC_FC_MAX_REAL_PRECISION" >&6; }
+    else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: Error" >&5
+$as_echo "Error" >&6; }
+        { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No output from test program!" >&5
+$as_echo "$as_me: WARNING: No output from test program!" >&2;}
     fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
+    rm -f pac_fconftest.out
 
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: Error" >&5
+$as_echo "Error" >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Failed to run program to determine available KINDs" >&5
+$as_echo "$as_me: WARNING: Failed to run program to determine available KINDs" >&2;}
+
 fi
-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if ${lt_cv_prog_gnu_ld+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
 
 
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+
+
+  ## Find all sizeofs for available KINDs
+
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sizeof of available INTEGER KINDs" >&5
+$as_echo_n "checking sizeof of available INTEGER KINDs... " >&6; }
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
+pack_int_sizeof=""
+rm -f pac_fconftest.out
 
+for kind in `echo $pac_validIntKinds | sed -e 's/,/ /g'`; do
+  cat > conftest.$ac_ext <<_ACEOF
 
 
+                PROGRAM main
+                USE ISO_C_BINDING
+                IMPLICIT NONE
+                INTEGER (KIND=$kind) a
+                OPEN(8, FILE='pac_fconftest.out', FORM='formatted')
+                WRITE(8,'(I0)') $FC_SIZEOF_A
+                CLOSE(8)
+                END
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
-$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
-if ${lt_cv_path_NM+:} false; then :
-  $as_echo_n "(cached) " >&6
+_ACEOF
+        if test "$cross_compiling" = yes; then :
+
+            pack_int_sizeof=""
+
 else
-  if test -n "$NM"; then
-  # Let the user override the test.
-  lt_cv_path_NM="$NM"
+  if ac_fn_fc_try_run "$LINENO"; then :
+
+            if test -s pac_fconftest.out ; then
+                sizes="`cat pac_fconftest.out`"
+                pack_int_sizeof="$pack_int_sizeof $sizes,"
+            else
+                { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No output from test program!" >&5
+$as_echo "$as_me: WARNING: No output from test program!" >&2;}
+            fi
+            rm -f pac_fconftest.out
+
 else
-  lt_nm_to_check="${ac_tool_prefix}nm"
-  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
-    lt_nm_to_check="$lt_nm_to_check nm"
-  fi
-  for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
-      test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
-	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
-	#   nm: unknown option "B" ignored
-	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
-	  lt_cv_path_NM="$tmp_nm -B"
-	  break
-	  ;;
-	*)
-	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
-	  */dev/null*)
-	    lt_cv_path_NM="$tmp_nm -p"
-	    break
-	    ;;
-	  *)
-	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
-	    continue # so that we can try to find one that supports BSD flags
-	    ;;
-	  esac
-	  ;;
-	esac
-      fi
-    done
-    IFS="$lt_save_ifs"
-  done
-  : ${lt_cv_path_NM=no}
+
+            { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Fortran program fails to build or run!" >&5
+$as_echo "$as_me: WARNING: Fortran program fails to build or run!" >&2;}
+
 fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
-$as_echo "$lt_cv_path_NM" >&6; }
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
-else
-  # Didn't find any BSD compatible name lister, look for dumpbin.
-  if test -n "$DUMPBIN"; then :
-    # Let the user override the test.
-  else
-    if test -n "$ac_tool_prefix"; then
-  for ac_prog in dumpbin "link -dump"
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DUMPBIN+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$DUMPBIN"; then
-  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
+
 done
-  done
-IFS=$as_save_IFS
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF="{`echo $pack_int_sizeof | sed -e 's/,$//' | sed -e 's/ //g'`}"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PAC_FC_ALL_INTEGER_KINDS_SIZEOF" >&5
+$as_echo "$PAC_FC_ALL_INTEGER_KINDS_SIZEOF" >&6; }
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
-fi
-fi
-DUMPBIN=$ac_cv_prog_DUMPBIN
-if test -n "$DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
-$as_echo "$DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
 
 
-    test -n "$DUMPBIN" && break
-  done
-fi
-if test -z "$DUMPBIN"; then
-  ac_ct_DUMPBIN=$DUMPBIN
-  for ac_prog in dumpbin "link -dump"
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
-  $as_echo_n "(cached) " >&6
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sizeof of available REAL KINDs" >&5
+$as_echo_n "checking sizeof of available REAL KINDs... " >&6; }
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
+
+pack_real_sizeof=""
+rm -f pac_fconftest.out
+for kind in `echo  $pac_validRealKinds | sed -e 's/,/ /g'`; do
+  cat > conftest.$ac_ext <<_ACEOF
+
+
+                PROGRAM main
+                USE ISO_C_BINDING
+                IMPLICIT NONE
+                REAL (KIND=$kind) :: a
+                OPEN(8, FILE='pac_fconftest.out', FORM='formatted')
+                WRITE(8,'(I0)') $FC_SIZEOF_A
+                CLOSE(8)
+                END
+
+
+_ACEOF
+        if test "$cross_compiling" = yes; then :
+
+            pack_real_sizeof=""
+
 else
-  if test -n "$ac_ct_DUMPBIN"; then
-  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+  if ac_fn_fc_try_run "$LINENO"; then :
+
+            if test -s pac_fconftest.out ; then
+                sizes="`cat pac_fconftest.out`"
+                pack_real_sizeof="$pack_real_sizeof $sizes,"
+            else
+                { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No output from test program!" >&5
+$as_echo "$as_me: WARNING: No output from test program!" >&2;}
+            fi
+            rm -f pac_fconftest.out
+
 else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
+
+            { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Fortran program fails to build or run!" >&5
+$as_echo "$as_me: WARNING: Fortran program fails to build or run!" >&2;}
 
 fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam
 fi
-ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
-if test -n "$ac_ct_DUMPBIN"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
-$as_echo "$ac_ct_DUMPBIN" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
 
-  test -n "$ac_ct_DUMPBIN" && break
 done
+PAC_FC_ALL_REAL_KINDS_SIZEOF="{`echo $pack_real_sizeof | sed -e 's/,$//' | sed -e 's/ //g'`}"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $PAC_FC_ALL_REAL_KINDS_SIZEOF" >&5
+$as_echo "$PAC_FC_ALL_REAL_KINDS_SIZEOF" >&6; }
+ac_ext=${ac_fc_srcext-f}
+ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5'
+ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_fc_compiler_gnu
 
-  if test "x$ac_ct_DUMPBIN" = x; then
-    DUMPBIN=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DUMPBIN=$ac_ct_DUMPBIN
-  fi
-fi
 
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
-    *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
-      ;;
-    *)
-      DUMPBIN=:
-      ;;
-    esac
-  fi
 
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
-  fi
-fi
-test -z "$NM" && NM=nm
 
 
 
 
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
-$as_echo_n "checking the name lister ($NM) interface... " >&6; }
-if ${lt_cv_nm_interface+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_nm_interface="BSD nm"
-  echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
-  (eval "$ac_compile" 2>conftest.err)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
-  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
-  cat conftest.err >&5
-  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
-  cat conftest.out >&5
-  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
-    lt_cv_nm_interface="MS dumpbin"
-  fi
-  rm -f conftest*
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
-$as_echo "$lt_cv_nm_interface" >&6; }
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
-$as_echo_n "checking whether ln -s works... " >&6; }
-LN_S=$as_ln_s
-if test "$LN_S" = "ln -s"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
-$as_echo "no, using $LN_S" >&6; }
-fi
 
-# find the maximum length of command line arguments
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
-$as_echo_n "checking the maximum length of command line arguments... " >&6; }
-if ${lt_cv_sys_max_cmd_len+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-    i=0
-  teststring="ABCD"
 
-  case $build_os in
-  msdosdjgpp*)
-    # On DJGPP, this test can blow up pretty badly due to problems in libc
-    # (any single argument exceeding 2000 bytes causes a buffer overrun
-    # during glob expansion).  Even if it were fixed, the result of this
-    # check would be larger than it should be.
-    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
-    ;;
 
-  gnu*)
-    # Under GNU Hurd, this test is not required because there is
-    # no limit to the length of command line arguments.
-    # Libtool will interpret -1 as no limit whatsoever
-    lt_cv_sys_max_cmd_len=-1;
-    ;;
 
-  cygwin* | mingw* | cegcc*)
-    # On Win9x/ME, this test blows up -- it succeeds, but takes
-    # about 5 minutes as the teststring grows exponentially.
-    # Worse, since 9x/ME are not pre-emptively multitasking,
-    # you end up with a "frozen" computer, even though with patience
-    # the test eventually succeeds (with a max line length of 256k).
-    # Instead, let's just punt: use the minimum linelength reported by
-    # all of the supported platforms: 8192 (on NT/2K/XP).
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
 
-  mint*)
-    # On MiNT this can take a long time and run out of memory.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
 
-  amigaos*)
-    # On AmigaOS with pdksh, this test takes hours, literally.
-    # So we just punt and use a minimum line length of 8192.
-    lt_cv_sys_max_cmd_len=8192;
-    ;;
 
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-    # This has been around since 386BSD, at least.  Likely further.
-    if test -x /sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-    elif test -x /usr/sbin/sysctl; then
-      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-    else
-      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
-    fi
-    # And add a safety zone
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    ;;
 
-  interix*)
-    # We know the value 262144 and hardcode it with a safety zone (like BSD)
-    lt_cv_sys_max_cmd_len=196608
-    ;;
 
-  os2*)
-    # The test takes a long time on OS/2.
-    lt_cv_sys_max_cmd_len=8192
-    ;;
 
-  osf*)
-    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-    # nice to cause kernel panics so lets avoid the loop below.
-    # First set a reasonable default.
-    lt_cv_sys_max_cmd_len=16384
-    #
-    if test -x /sbin/sysconfig; then
-      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-        *1*) lt_cv_sys_max_cmd_len=-1 ;;
-      esac
-    fi
-    ;;
-  sco3.2v5*)
-    lt_cv_sys_max_cmd_len=102400
-    ;;
-  sysv5* | sco5v6* | sysv4.2uw2*)
-    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-    if test -n "$kargmax"; then
-      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
-    else
-      lt_cv_sys_max_cmd_len=32768
-    fi
-    ;;
-  *)
-    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-    else
-      # Make teststring a little bigger before we do anything with it.
-      # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
-        teststring=$teststring$teststring
-      done
-      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-      # If test is not a shell built-in, we'll probably end up computing a
-      # maximum length that is only half of the actual maximum length, but
-      # we can't tell.
-      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
-	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
-      do
-        i=`expr $i + 1`
-        teststring=$teststring$teststring
-      done
-      # Only check the string length outside the loop.
-      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
-      teststring=
-      # Add a significant safety factor because C++ compilers can tack on
-      # massive amounts of additional arguments before passing them to the
-      # linker.  It appears as though 1/2 is a usable value.
-      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-    fi
-    ;;
-  esac
 
-fi
 
-if test -n $lt_cv_sys_max_cmd_len ; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
-$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
-$as_echo "none" >&6; }
-fi
-max_cmd_len=$lt_cv_sys_max_cmd_len
 
 
+cat >>confdefs.h <<_ACEOF
+#define Fortran_COMPILER_ID $Fortran_COMPILER_ID
+_ACEOF
 
 
+  ## Setting definition if there is a 16 byte fortran integer
+  if `echo $PAC_FC_ALL_INTEGER_KINDS_SIZEOF | grep '16' >/dev/null`; then
+    HAVE_Fortran_INTEGER_SIZEOF_16="1"
 
+$as_echo "#define HAVE_Fortran_INTEGER_SIZEOF_16 1" >>confdefs.h
 
-: ${CP="cp -f"}
-: ${MV="mv -f"}
-: ${RM="rm -f"}
+  else
+    HAVE_Fortran_INTEGER_SIZEOF_16="0"
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,b/c, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
-$as_echo "$xsi_shell" >&6; }
+$as_echo "#define HAVE_Fortran_INTEGER_SIZEOF_16 0" >>confdefs.h
 
+  fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
-$as_echo "$lt_shell_append" >&6; }
+  if test "X$HAVE_STORAGE_SIZE_FORTRAN" = "Xyes"; then
 
+$as_echo "#define FORTRAN_HAVE_STORAGE_SIZE 1" >>confdefs.h
 
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  lt_unset=unset
-else
-  lt_unset=false
-fi
+  fi
 
+  if  test "X$HAVE_C_SIZEOF_FORTRAN" = "Xyes"; then
 
+$as_echo "#define FORTRAN_HAVE_C_SIZEOF 1" >>confdefs.h
 
+  fi
 
+  if  test "X$HAVE_SIZEOF_FORTRAN" = "Xyes"; then
 
-# test EBCDIC or ASCII
-case `echo X|tr X '\101'` in
- A) # ASCII based system
-    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
-  lt_SP2NL='tr \040 \012'
-  lt_NL2SP='tr \015\012 \040\040'
-  ;;
- *) # EBCDIC based system
-  lt_SP2NL='tr \100 \n'
-  lt_NL2SP='tr \r\n \100\100'
-  ;;
-esac
+$as_echo "#define FORTRAN_HAVE_SIZEOF 1" >>confdefs.h
 
+  fi
 
+  ## See if C_LONG_DOUBLE is available
 
+  HAVE_C_LONG_DOUBLE_FORTRAN="no"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran compiler supports intrinsic C_LONG_DOUBLE" >&5
+$as_echo_n "checking if Fortran compiler supports intrinsic C_LONG_DOUBLE... " >&6; }
+  cat > conftest.$ac_ext <<_ACEOF
 
+   PROGRAM main
+     USE ISO_C_BINDING
+     REAL(KIND=C_LONG_DOUBLE) :: d
+   END PROGRAM
 
+_ACEOF
+if ac_fn_fc_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+     	HAVE_C_LONG_DOUBLE_FORTRAN="yes"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 
 
+  FORTRAN_HAVE_C_LONG_DOUBLE="0"
+  if test "X$HAVE_C_LONG_DOUBLE_FORTRAN" = "Xyes"; then
+    FORTRAN_HAVE_C_LONG_DOUBLE="1"
 
+$as_echo "#define FORTRAN_HAVE_C_LONG_DOUBLE 1" >>confdefs.h
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
-$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
-if ${lt_cv_to_host_file_cmd+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  case $host in
-  *-*-mingw* )
-    case $build in
-      *-*-mingw* ) # actually msys
-        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
-        ;;
-      *-*-cygwin* )
-        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
-        ;;
-      * ) # otherwise, assume *nix
-        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
-        ;;
-    esac
-    ;;
-  *-*-cygwin* )
-    case $build in
-      *-*-mingw* ) # actually msys
-        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
-        ;;
-      *-*-cygwin* )
-        lt_cv_to_host_file_cmd=func_convert_file_noop
-        ;;
-      * ) # otherwise, assume *nix
-        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
-        ;;
-    esac
-    ;;
-  * ) # unhandled hosts (and "normal" native builds)
-    lt_cv_to_host_file_cmd=func_convert_file_noop
-    ;;
-esac
+  fi
 
-fi
+  ## Is C_LONG_DOUBLE different from C_DOUBLE
+  FORTRAN_C_LONG_DOUBLE_IS_UNIQUE="0"
+  if test "X$FORTRAN_HAVE_C_LONG_DOUBLE"; then
 
-to_host_file_cmd=$lt_cv_to_host_file_cmd
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
-$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+  C_LONG_DOUBLE_IS_UNIQUE_FORTRAN="no"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Fortran C_LONG_DOUBLE is different from C_DOUBLE" >&5
+$as_echo_n "checking if Fortran C_LONG_DOUBLE is different from C_DOUBLE... " >&6; }
 
+  cat > conftest.$ac_ext <<_ACEOF
 
+     MODULE type_mod
+       USE ISO_C_BINDING
+       INTERFACE h5t
+         MODULE PROCEDURE h5t_c_double
+         MODULE PROCEDURE h5t_c_long_double
+       END INTERFACE
+     CONTAINS
+       SUBROUTINE h5t_c_double(r)
+         REAL(KIND=C_DOUBLE) :: r
+       END SUBROUTINE h5t_c_double
+       SUBROUTINE h5t_c_long_double(d)
+         REAL(KIND=C_LONG_DOUBLE) :: d
+       END SUBROUTINE h5t_c_long_double
+     END MODULE type_mod
+     PROGRAM main
+       USE ISO_C_BINDING
+       USE type_mod
+       REAL(KIND=C_DOUBLE)      :: r
+       REAL(KIND=C_LONG_DOUBLE) :: d
+       CALL h5t(r)
+       CALL h5t(d)
+     END PROGRAM main
 
+_ACEOF
+if ac_fn_fc_try_compile "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+            C_LONG_DOUBLE_IS_UNIQUE_FORTRAN="yes"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
+    if test "X$C_LONG_DOUBLE_IS_UNIQUE_FORTRAN" = "Xyes"; then
+      FORTRAN_C_LONG_DOUBLE_IS_UNIQUE="1"
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
-$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
-if ${lt_cv_to_tool_file_cmd+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  #assume ordinary cross tools, or native build.
-lt_cv_to_tool_file_cmd=func_convert_file_noop
-case $host in
-  *-*-mingw* )
-    case $build in
-      *-*-mingw* ) # actually msys
-        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
-        ;;
-    esac
-    ;;
-esac
+$as_echo "#define FORTRAN_C_LONG_DOUBLE_IS_UNIQUE 1" >>confdefs.h
 
-fi
+    else
+      FORTRAN_C_LONG_DOUBLE_IS_UNIQUE="0"
+    fi
+  fi
 
-to_tool_file_cmd=$lt_cv_to_tool_file_cmd
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
-$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+  FORTRAN_SIZEOF_LONG_DOUBLE=${ac_cv_sizeof_long_double}
 
+cat >>confdefs.h <<_ACEOF
+#define FORTRAN_SIZEOF_LONG_DOUBLE "${ac_cv_sizeof_long_double}"
+_ACEOF
 
 
 
+    max_real_fortran_sizeof="`echo $PAC_FC_ALL_REAL_KINDS_SIZEOF | sed -ne 's/.*,\([0-9]*\)\}/\1/p'`"
+  max_real_fortran_kind="`echo \"$PAC_FC_ALL_REAL_KINDS\" | sed -ne 's/.*,\([0-9]*\)\}/\1/p'`"
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
-$as_echo_n "checking for $LD option to reload object files... " >&6; }
-if ${lt_cv_ld_reload_flag+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_reload_flag='-r'
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
-$as_echo "$lt_cv_ld_reload_flag" >&6; }
-reload_flag=$lt_cv_ld_reload_flag
-case $reload_flag in
-"" | " "*) ;;
-*) reload_flag=" $reload_flag" ;;
-esac
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    if test "$GCC" != yes; then
-      reload_cmds=false
-    fi
-    ;;
-  darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
-    else
-      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    if test "$ac_cv_sizeof___float128" != 0;then
+    if test "$ac_cv_sizeof___float128" != "$max_real_fortran_sizeof" &&
+       test "${ac_cv_sizeof_long_double}" != "$max_real_fortran_sizeof" &&
+                            test "${ac_cv_sizeof_double}" != "$max_real_fortran_sizeof" ; then
+          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
+           Fortran REAL(KIND=$max_real_fortran_kind) is $max_real_fortran_sizeof Bytes, but no corresponding C float type exists of that size
+                     !!! Fortran interfaces will not be generated for REAL(KIND=$max_real_fortran_kind) !!!
+          " >&5
+$as_echo "$as_me: WARNING:
+           Fortran REAL(KIND=$max_real_fortran_kind) is $max_real_fortran_sizeof Bytes, but no corresponding C float type exists of that size
+                     !!! Fortran interfaces will not be generated for REAL(KIND=$max_real_fortran_kind) !!!
+          " >&2;}
+      PAC_FC_ALL_REAL_KINDS="`echo $PAC_FC_ALL_REAL_KINDS | sed -e 's/,[0-9]\+}/}/g'`"
+      PAC_FC_ALL_REAL_KINDS_SIZEOF="`echo $PAC_FC_ALL_REAL_KINDS_SIZEOF | sed -e 's/,[0-9]\+}/}/g'`"
     fi
-    ;;
-esac
+  fi
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Fortran interoperable KINDS with C" >&5
+$as_echo_n "checking for Fortran interoperable KINDS with C... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PAC_FC_ALL_REAL_KINDS" >&5
+$as_echo "$PAC_FC_ALL_REAL_KINDS" >&6; }
 
+    H5CONFIG_F_NUM_RKIND="INTEGER, PARAMETER :: num_rkinds = `echo \"$PAC_FC_ALL_REAL_KINDS\" |  tr -d -c ',\n' | awk '{ print length + 1; }'`"
+  H5CONFIG_F_RKIND="INTEGER, DIMENSION(1:num_rkinds) :: rkind = (/`echo $PAC_FC_ALL_REAL_KINDS | sed -e 's/{//g' | sed -e 's/}//g' | sed -e 's/ /,/g'`/)"
+  H5CONFIG_F_RKIND_SIZEOF="INTEGER, DIMENSION(1:num_rkinds) :: rkind_sizeof = (/`echo $PAC_FC_ALL_REAL_KINDS_SIZEOF | sed -e 's/{//g' | sed -e 's/}//g'| sed -e 's/ /,/g'`/)"
 
 
+cat >>confdefs.h <<_ACEOF
+#define H5CONFIG_F_NUM_RKIND $H5CONFIG_F_NUM_RKIND
+_ACEOF
 
 
+cat >>confdefs.h <<_ACEOF
+#define H5CONFIG_F_RKIND $H5CONFIG_F_RKIND
+_ACEOF
 
 
+cat >>confdefs.h <<_ACEOF
+#define H5CONFIG_F_RKIND_SIZEOF $H5CONFIG_F_RKIND_SIZEOF
+_ACEOF
 
 
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
-set dummy ${ac_tool_prefix}objdump; ac_word=$2
+## Change back to the C language
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+else
+  FC="no"
+fi
+
+## ----------------------------------------------------------------------
+## Check if they would like the C++ interface compiled
+##
+## We need to check for a C++ compiler unconditionally, since
+## AC_PROG_CXX defines some macros that Automake 1.9.x uses and will
+## miss even if c++ is not enabled.
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OBJDUMP+:} false; then :
+if ${ac_cv_prog_CXX+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$OBJDUMP"; then
-  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -8797,7 +8489,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -8807,28 +8499,32 @@ IFS=$as_save_IFS
 
 fi
 fi
-OBJDUMP=$ac_cv_prog_OBJDUMP
-if test -n "$OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
-$as_echo "$OBJDUMP" >&6; }
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 fi
 
 
+    test -n "$CXX" && break
+  done
 fi
-if test -z "$ac_cv_prog_OBJDUMP"; then
-  ac_ct_OBJDUMP=$OBJDUMP
-  # Extract the first word of "objdump", so it can be a program name with args.
-set dummy objdump; ac_word=$2
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$ac_ct_OBJDUMP"; then
-  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -8837,7 +8533,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -8847,17 +8543,21 @@ IFS=$as_save_IFS
 
 fi
 fi
-ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
-if test -n "$ac_ct_OBJDUMP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
-$as_echo "$ac_ct_OBJDUMP" >&6; }
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 fi
 
-  if test "x$ac_ct_OBJDUMP" = x; then
-    OBJDUMP="false"
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
@@ -8865,412 +8565,663 @@ yes:)
 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
-    OBJDUMP=$ac_ct_OBJDUMP
+    CXX=$ac_ct_CXX
   fi
-else
-  OBJDUMP="$ac_cv_prog_OBJDUMP"
 fi
 
-test -z "$OBJDUMP" && OBJDUMP=objdump
-
-
-
-
-
-
-
-
+  fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
-$as_echo_n "checking how to recognize dependent libraries... " >&6; }
-if ${lt_cv_deplibs_check_method+:} false; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-case $host_os in
-aix[4-9]*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-beos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-bsdi[45]*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
-  lt_cv_file_magic_cmd='/usr/bin/file -L'
-  lt_cv_file_magic_test_file=/shlib/libc.so
-  ;;
-
-cygwin*)
-  # func_win32_libid is a shell function defined in ltmain.sh
-  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-  lt_cv_file_magic_cmd='func_win32_libid'
-  ;;
-
-mingw* | pw32*)
-  # Base MSYS/MinGW do not provide the 'file' command needed by
-  # func_win32_libid shell function, so use a weaker test based on 'objdump',
-  # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
-    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
-    lt_cv_file_magic_cmd='func_win32_libid'
-  else
-    # Keep this pattern in sync with the one in func_win32_libid.
-    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
-    lt_cv_file_magic_cmd='$OBJDUMP -f'
-  fi
-  ;;
-
-cegcc*)
-  # use the weaker test based on 'objdump'. See mingw*.
-  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
-  lt_cv_file_magic_cmd='$OBJDUMP -f'
-  ;;
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
 
-darwin* | rhapsody*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
 
-freebsd* | dragonfly*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    case $host_cpu in
-    i*86 )
-      # Not sure whether the presence of OpenBSD here was a mistake.
-      # Let's accept both of them until this is cleared up.
-      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
-      lt_cv_file_magic_cmd=/usr/bin/file
-      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
-      ;;
-    esac
-  else
-    lt_cv_deplibs_check_method=pass_all
-  fi
-  ;;
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GXX=yes
+else
+  GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
 
-haiku*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+else
+  CXXFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-hpux10.20* | hpux11*)
-  lt_cv_file_magic_cmd=/usr/bin/file
-  case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
-  hppa*64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
-    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
-    ;;
-  *)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
-    lt_cv_file_magic_test_file=/usr/lib/libc.sl
-    ;;
-  esac
-  ;;
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
 
-interix[3-9]*)
-  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
-  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
-  ;;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
 
-irix5* | irix6* | nonstopux*)
-  case $LD in
-  *-32|*"-32 ") libmagic=32-bit;;
-  *-n32|*"-n32 ") libmagic=N32;;
-  *-64|*"-64 ") libmagic=64-bit;;
-  *) libmagic=never-match;;
-  esac
-  lt_cv_deplibs_check_method=pass_all
-  ;;
+else
+  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+	 CXXFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
 
-netbsd*)
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
   else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+    CXXFLAGS="-g"
   fi
-  ;;
-
-newos6*)
-  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
-  lt_cv_file_magic_cmd=/usr/bin/file
-  lt_cv_file_magic_test_file=/usr/lib/libnls.so
-  ;;
-
-*nto* | *qnx*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
   else
-    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+    CXXFLAGS=
   fi
-  ;;
-
-osf3* | osf4* | osf5*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-rdos*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
+depcc="$CXX"  am_compiler_list=
 
-solaris*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named 'D' -- because '-MD' means "put the output
+  # in D".
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
 
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
 
-sysv4 | sysv4.3*)
-  case $host_vendor in
-  motorola)
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
-    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
-    ;;
-  ncr)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  sequent)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
-    ;;
-  sni)
-    lt_cv_file_magic_cmd='/bin/file'
-    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
-    lt_cv_file_magic_test_file=/lib/libc.so
-    ;;
-  siemens)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  pc)
-    lt_cv_deplibs_check_method=pass_all
-    ;;
-  esac
-  ;;
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+      # Solaris 10 /bin/sh.
+      echo '/* dummy */' > sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
 
-tpf*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-esac
+    # We check with '-c' and '-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle '-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs.
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # After this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested.
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok '-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
 
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
-$as_echo "$lt_cv_deplibs_check_method" >&6; }
 
-file_magic_glob=
-want_nocaseglob=no
-if test "$build" = "$host"; then
-  case $host_os in
-  mingw* | pw32*)
-    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
-      want_nocaseglob=yes
-    else
-      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
-    fi
-    ;;
-  esac
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
 
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
 
 
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dlltool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DLLTOOL+:} false; then :
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+  if ${ac_cv_prog_CXXCPP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$DLLTOOL"; then
-  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
 do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
 
-fi
-fi
-DLLTOOL=$ac_cv_prog_DLLTOOL
-if test -n "$DLLTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
-$as_echo "$DLLTOOL" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+  # Broken: fails on valid input.
+continue
 fi
+rm -f conftest.err conftest.i conftest.$ac_ext
 
-
-fi
-if test -z "$ac_cv_prog_DLLTOOL"; then
-  ac_ct_DLLTOOL=$DLLTOOL
-  # Extract the first word of "dlltool", so it can be a program name with args.
-set dummy dlltool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
-  $as_echo_n "(cached) " >&6
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
 else
-  if test -n "$ac_ct_DLLTOOL"; then
-  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
 else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+$as_echo "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
 do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
 
+else
+  # Broken: fails on valid input.
+continue
 fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
 fi
-ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
-if test -n "$ac_ct_DLLTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
-$as_echo "$ac_ct_DLLTOOL" >&6; }
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
 else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+	## this is checked for when AC_HEADER_STDC is done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if c++ interface enabled" >&5
+$as_echo_n "checking if c++ interface enabled... " >&6; }
+
+# Check whether --enable-cxx was given.
+if test "${enable_cxx+set}" = set; then :
+  enableval=$enable_cxx; HDF_CXX=$enableval
+fi
+
+
+if test "X$HDF_CXX" = "Xyes"; then
+  echo "yes"
+  HDF5_INTERFACES="$HDF5_INTERFACES c++"
+
+  ## Change to the C++ language
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+  # Checking if C++ needs old style header files in includes
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX needs old style header files in includes" >&5
+$as_echo_n "checking if $CXX needs old style header files in includes... " >&6; }
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#include <iostream>
+
+int main(void) { return 0; }
+
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    CXXFLAGS="${CXXFLAGS} -DOLD_HEADER_FILENAME"
+    AM_CXXFLAGS="${AM_CXXFLAGS} -DOLD_HEADER_FILENAME"
 fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 
-  if test "x$ac_ct_DLLTOOL" = x; then
-    DLLTOOL="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    DLLTOOL=$ac_ct_DLLTOOL
-  fi
+
+  # Checking if C++ can handle namespaces
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX can handle namespaces" >&5
+$as_echo_n "checking if $CXX can handle namespaces... " >&6; }
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+namespace H5 {
+int fnord;
+}
+
+int main(void) {
+   using namespace H5;
+   fnord = 37;
+   return 0;
+}
+
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
 else
-  DLLTOOL="$ac_cv_prog_DLLTOOL"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+     CXXFLAGS="${CXXFLAGS} -DH5_NO_NAMESPACE"
+     AM_CXXFLAGS="${AM_CXXFLAGS} -DH5_NO_NAMESPACE"
 fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 
-test -z "$DLLTOOL" && DLLTOOL=dlltool
 
+  # Checking if C++ has offsetof extension
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX has offsetof extension" >&5
+$as_echo_n "checking if $CXX has offsetof extension... " >&6; }
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+  #include <stdio.h>
+  #include <stddef.h>
+
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
 
+    struct index_st
+    {
+      unsigned char type;
+      unsigned char num;
+      unsigned int len;
+    };
+    typedef struct index_st index_t;
+    int x,y;
+    x = offsetof(struct index_st, len);
+    y = offsetof(index_t, num)
 
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
 
+$as_echo "#define CXX_HAVE_OFFSETOF 1" >>confdefs.h
 
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 
 
+  # if C++ can handle static cast
 
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CXX can handle static cast" >&5
+$as_echo_n "checking if $CXX can handle static cast... " >&6; }
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
+int main(void) {
+   float test_float;
+   int test_int;
+   test_float = 37.0;
+   test_int = static_cast <int> (test_float);
+   return 0;
+}
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
-$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
-if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
-  $as_echo_n "(cached) " >&6
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
 else
-  lt_cv_sharedlib_from_linklib_cmd='unknown'
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    CXXFLAGS="${CXXFLAGS} -DNO_STATIC_CAST"
+    AM_CXXFLAGS="${AM_CXXFLAGS} -DNO_STATIC_CAST"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 
-case $host_os in
-cygwin* | mingw* | pw32* | cegcc*)
-  # two different shell functions defined in ltmain.sh
-  # decide which to use based on capabilities of $DLLTOOL
-  case `$DLLTOOL --help 2>&1` in
-  *--identify-strict*)
-    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
-    ;;
-  *)
-    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
-    ;;
-  esac
-  ;;
-*)
-  # fallback: assume linklib IS sharedlib
-  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
-  ;;
-esac
 
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  CXX="no"
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
-$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
-sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
-test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
 
+## Change back to the C language
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
+## ----------------------------------------------------------------------
+## Check if they would like the High Level library  compiled
+##
 
+ HL=""
+## name of fortran folder inside "hl", if FORTRAN compile is requested
+ HL_FOR=""
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if high level library is enabled" >&5
+$as_echo_n "checking if high level library is enabled... " >&6; }
+# Check whether --enable-hl was given.
+if test "${enable_hl+set}" = set; then :
+  enableval=$enable_hl; HDF5_HL=$enableval
+else
+  HDF5_HL=yes
+fi
 
 
-if test -n "$ac_tool_prefix"; then
-  for ac_prog in ar
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+if test "X$HDF5_HL" = "Xyes"; then
+ echo "yes"
+ HL="hl"
+
+$as_echo "#define INCLUDE_HL 1" >>confdefs.h
+
+else
+ echo "no"
+fi
+
+
+## ----------------------------------------------------------------------
+## Check which archiving tool to use. This needs to be done before
+## the AM_PROG_LIBTOOL macro.
+##
+
+if test -z "$AR"; then
+  for ac_prog in ar xar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_prog_AR+:} false; then :
@@ -9286,7 +9237,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+    ac_cv_prog_AR="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -9306,31 +9257,74 @@ $as_echo "no" >&6; }
 fi
 
 
-    test -n "$AR" && break
-  done
+  test -n "$AR" && break
+done
+test -n "$AR" || AR=":"
+
 fi
-if test -z "$AR"; then
-  ac_ct_AR=$AR
-  for ac_prog in ar
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
+
+
+## Export the AR macro so that it will be placed in the libtool file
+## correctly.
+export AR
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+
+
+## ----------------------------------------------------------------------
+## Set up ${TR} which is used to process DEBUG_PKG.
+
+# Extract the first word of "tr", so it can be a program name with args.
+set dummy tr; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_AR+:} false; then :
+if ${ac_cv_path_TR+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$ac_ct_AR"; then
-  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+  case $TR in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_TR="$TR" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_AR="$ac_prog"
+    ac_cv_path_TR="$as_dir/$ac_word$ac_exec_ext"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -9338,334 +9332,246 @@ done
   done
 IFS=$as_save_IFS
 
+  ;;
+esac
 fi
-fi
-ac_ct_AR=$ac_cv_prog_ac_ct_AR
-if test -n "$ac_ct_AR"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
-$as_echo "$ac_ct_AR" >&6; }
+TR=$ac_cv_path_TR
+if test -n "$TR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TR" >&5
+$as_echo "$TR" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 fi
 
 
-  test -n "$ac_ct_AR" && break
-done
 
-  if test "x$ac_ct_AR" = x; then
-    AR="false"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    AR=$ac_ct_AR
-  fi
-fi
 
-: ${AR=ar}
-: ${AR_FLAGS=cru}
+## ----------------------------------------------------------------------
+## Check that time can be used with srcdir.  This is okay on most systems,
+## but seems to cause problems on Cygwin.
+## The solution on Cygwin is not to record execution time for tests.
+##
+## Note: This is still true as of Cygwin 1.7.32 (Aug 2014) on both 32-
+## and 64-bit platforms. Given how long this has been true, it seems
+## unlikely to change, but we should probably re-test this periodically.
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if srcdir= and time commands work together" >&5
+$as_echo_n "checking if srcdir= and time commands work together... " >&6; }
 
 
+TIME=time
+TIME_TEST=`foo="bar" ${TIME} echo 'baz' 2> /dev/null | grep baz`
 
+if test "X${TIME_TEST}" = "Xbaz"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  TIME=
+fi
 
 
+## The following variables are used to distinguish between building a
+## serial and parallel library.
+##
+##    HAVE_PARALLEL	-- defined in H5config.h if we are building
+##			   a parallel library even if configure wasn't
+##			   able to find some header file or library that
+##			   might be required. This is defined if the
+##			   user explicitly states
+##			   that a parallel library is being built by supplying
+##			   the `--enable-parallel' configure switch.
+##
+##    PARALLEL		-- This variable is set to a non-null value if
+##			   we're building a parallel version of the library.
+##
+##    RUNSERIAL	        -- This is a command which will be prepended to
+##			   the executable name to run the executable using
+##			   a single process. For serial versions of the
+##			   library this will normally be empty. For parallel
+##			   versions it might be something like `mpiexec -n 1'.
+##			   The value of this variable is substituted in *.in
+##			   files.
+##
+##    RUNPARALLEL	-- This is a command which will be prepended to
+##			   the executable name to run the executable on
+##			   multiple processors. For the serial library the
+##			   value will normally be the empty string. For
+##			   parallel library it should be something like
+##			   "mpiexec -n \$\${NPROCS:=6}" where NPROCS will
+##			   eventually contain the number of processors on which
+##			   to run the executable (the double dollarsigns are to
+##			   protect the expansion until make executes the
+##			   command).  The value of this variable is
+##			   substituted in *.in files.
+##
 
 
 
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
-$as_echo_n "checking for archiver @FILE support... " >&6; }
-if ${lt_cv_ar_at_file+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ar_at_file=no
-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
+## ----------------------------------------------------------------------
+## Disable shared libraries on CYGWIN. (LK - 04/16/15)
+## A number of tests run by "make check" fail on CYGWIN, so for HDF5 v1.8.15
+## we will change the default for shared libraries to disabled.
 
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  echo conftest.$ac_objext > conftest.lst
-      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
-      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
-  (eval $lt_ar_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-      if test "$ac_status" -eq 0; then
-	# Ensure the archiver fails upon bogus file names.
-	rm -f conftest.$ac_objext libconftest.a
-	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
-  (eval $lt_ar_try) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-	if test "$ac_status" -ne 0; then
-          lt_cv_ar_at_file=@
-        fi
-      fi
-      rm -f conftest.* libconftest.a
+case "`uname`" in
+  CYGWIN*)
+    enable_shared="no"
+    CHECK_WARN="Shared libraries are not currently supported on CYGWIN."
+    ;;
+esac
 
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+## ----------------------------------------------------------------------
+## Fortran libraries are not currently supported on Mac. Disable them.
+## (this is overridable with --enable-unsupported).
+##
+
+H5_FORTRAN_SHARED="no"
+if test "X${HDF_FORTRAN}" = "Xyes" && test "X${enable_shared}" != "Xno"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if shared Fortran libraries are supported" >&5
+$as_echo_n "checking if shared Fortran libraries are supported... " >&6; }
+  H5_FORTRAN_SHARED="yes"
+
+  ## Disable fortran shared libraries on Mac. (MAM - 03/30/11)
+
+  case "`uname`" in
+    Darwin*)
+    H5_FORTRAN_SHARED="no"
+    CHECK_WARN="Shared Fortran libraries not currently supported on Mac."
+      ;;
+  esac
+
+  ## Report results of check(s)
 
+  if test "X${H5_FORTRAN_SHARED}" = "Xno"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $CHECK_WARN" >&5
+$as_echo "$as_me: WARNING: $CHECK_WARN" >&2;}
+    if test "X${ALLOW_UNSUPPORTED}" != "Xyes"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disabling shared Fortran libraries." >&5
+$as_echo "$as_me: WARNING: Disabling shared Fortran libraries." >&2;}
+      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: To override this behavior, please use --enable-unsupported configure option." >&5
+$as_echo "$as_me: WARNING: To override this behavior, please use --enable-unsupported configure option." >&2;}
+        if test "X${enable_static}" = "Xno"; then
+          as_fn_error $? "both static and shared Fortran libraries are disabled" "$LINENO" 5
+        fi
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Allowing unsupported Fortran shared libraries due to use of --enable-unsupported flag" >&5
+$as_echo "$as_me: WARNING: Allowing unsupported Fortran shared libraries due to use of --enable-unsupported flag" >&2;}
+      H5_FORTRAN_SHARED="yes"
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  fi
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
-$as_echo "$lt_cv_ar_at_file" >&6; }
 
-if test "x$lt_cv_ar_at_file" = xno; then
-  archiver_list_spec=
+ if test "X$H5_FORTRAN_SHARED" = "Xyes"; then
+  FORTRAN_SHARED_CONDITIONAL_TRUE=
+  FORTRAN_SHARED_CONDITIONAL_FALSE='#'
 else
-  archiver_list_spec=$lt_cv_ar_at_file
+  FORTRAN_SHARED_CONDITIONAL_TRUE='#'
+  FORTRAN_SHARED_CONDITIONAL_FALSE=
 fi
 
 
+## ----------------------------------------------------------------------
+## Create libtool.  If shared/static libraries are going to be enabled
+## or disabled, it should happen before these macros.
 
 
+## ----------------------------------------------------------------------
+## dlopen - This will use an improved version of libtool
+## win32-dll - This will build clean dlls on win32 platforms.
+case `pwd` in
+  *\ * | *\	*)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
 
 
 
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_STRIP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
+macro_version='2.4.2'
+macro_revision='1.3337'
 
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
-$as_echo "$STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
 
 
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
 
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
-$as_echo "$ac_ct_STRIP" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
 
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
 
-test -z "$STRIP" && STRIP=:
 
 
 
 
 
 
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_RANLIB+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
 
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
+ltmain="$ac_aux_dir/ltmain.sh"
 
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
 
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
 
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
 
-  if test "x$ac_ct_RANLIB" = x; then
-    RANLIB=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    RANLIB=$ac_ct_RANLIB
-  fi
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
 
-test -z "$RANLIB" && RANLIB=:
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
 
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
 
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO ""
+}
 
+case "$ECHO" in
+  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
 
 
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
 
-if test -n "$RANLIB"; then
-  case $host_os in
-  openbsd*)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
-    ;;
-  *)
-    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
-    ;;
-  esac
-  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
-fi
 
-case $host_os in
-  darwin*)
-    lock_old_archive_extraction=yes ;;
-  *)
-    lock_old_archive_extraction=no ;;
-esac
 
 
 
@@ -9676,9 +9582,77 @@ esac
 
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_SED" || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
 
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
 
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
 
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
 
 
 
@@ -9690,10 +9664,74 @@ esac
 
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if ${ac_cv_path_FGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     if test -z "$FGREP"; then
+  ac_path_FGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in fgrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_FGREP" || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
 
+      $ac_path_FGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_FGREP"; then
+    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_FGREP=$FGREP
+fi
 
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
 
 
+test -z "$GREP" && GREP=grep
 
 
 
@@ -9705,552 +9743,664 @@ esac
 
 
 
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
 
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
 
-# Allow CC to be a program name with arguments.
-compiler=$CC
 
 
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
-$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
-if ${lt_cv_sys_global_symbol_pipe+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
 
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
 
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRST]'
 
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
 
-# Define system-specific variables.
-case $host_os in
-aix*)
-  symcode='[BCDT]'
-  ;;
-cygwin* | mingw* | pw32* | cegcc*)
-  symcode='[ABCDGISTW]'
-  ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[ABCDEGRST]'
-  fi
-  ;;
-irix* | nonstopux*)
-  symcode='[BCDEGRST]'
-  ;;
-osf*)
-  symcode='[BCDEGQRST]'
-  ;;
-solaris*)
-  symcode='[BDRT]'
-  ;;
-sco3.2v5*)
-  symcode='[DT]'
-  ;;
-sysv4.2uw2*)
-  symcode='[DT]'
-  ;;
-sysv5* | sco5v6* | unixware* | OpenUNIX*)
-  symcode='[ABDT]'
-  ;;
-sysv4)
-  symcode='[DFNSTU]'
-  ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-case `$NM -V 2>&1` in
-*GNU* | *'with BFD'*)
-  symcode='[ABCDGIRSTW]' ;;
-esac
-
-# Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
-# so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
 
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
 
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $build_os in
-mingw*)
-  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
   ;;
 esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
 
-# Try without a prefix underscore, then with it.
-for ac_symprfx in "" "_"; do
-
-  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
-  symxfrm="\\1 $ac_symprfx\\2 \\2"
-
-  # Write the raw and C identifiers.
-  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
-    # Also find C++ and __fastcall symbols from MSVC++,
-    # which start with @ or ?.
-    lt_cv_sys_global_symbol_pipe="$AWK '"\
-"     {last_section=section; section=\$ 3};"\
-"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
-"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
-"     \$ 0!~/External *\|/{next};"\
-"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
-"     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
-"     ' prfx=^$ac_symprfx"
-  else
-    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
-  fi
-  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
-
-  # Check to see that the pipe works correctly.
-  pipe_works=no
-
-  rm -f conftest*
-  cat > conftest.$ac_ext <<_LT_EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(void);
-void nm_test_func(void){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-_LT_EOF
 
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    # Now try to grab the symbols.
-    nlist=conftest.nm
-    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
-  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s "$nlist"; then
-      # Try sorting and uniquifying the output.
-      if sort "$nlist" | uniq > "$nlist"T; then
-	mv -f "$nlist"T "$nlist"
-      else
-	rm -f "$nlist"T
-      fi
 
-      # Make sure that we snagged all the symbols we need.
-      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
-	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
-	  cat <<_LT_EOF > conftest.$ac_ext
-/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
-   relocations are performed -- see ld's documentation on pseudo-relocs.  */
-# define LT_DLSYM_CONST
-#elif defined(__osf__)
-/* This system does not cope well with relocations in const data.  */
-# define LT_DLSYM_CONST
-#else
-# define LT_DLSYM_CONST const
-#endif
 
-#ifdef __cplusplus
-extern "C" {
-#endif
 
-_LT_EOF
-	  # Now generate the symbol file.
-	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
 
-	  cat <<_LT_EOF >> conftest.$ac_ext
 
-/* The mapping between symbol names and symbols.  */
-LT_DLSYM_CONST struct {
-  const char *name;
-  void       *address;
-}
-lt__PROGRAM__LTX_preloaded_symbols[] =
-{
-  { "@PROGRAM@", (void *) 0 },
-_LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
-	  cat <<\_LT_EOF >> conftest.$ac_ext
-  {0, (void *) 0}
-};
 
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
-  return lt__PROGRAM__LTX_preloaded_symbols;
-}
-#endif
 
-#ifdef __cplusplus
-}
-#endif
-_LT_EOF
-	  # Now try linking the two files.
-	  mv conftest.$ac_objext conftstm.$ac_objext
-	  lt_globsym_save_LIBS=$LIBS
-	  lt_globsym_save_CFLAGS=$CFLAGS
-	  LIBS="conftstm.$ac_objext"
-	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
-	    pipe_works=yes
-	  fi
-	  LIBS=$lt_globsym_save_LIBS
-	  CFLAGS=$lt_globsym_save_CFLAGS
-	else
-	  echo "cannot find nm_test_func in $nlist" >&5
-	fi
-      else
-	echo "cannot find nm_test_var in $nlist" >&5
-      fi
-    else
-      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
-    fi
-  else
-    echo "$progname: failed program was:" >&5
-    cat conftest.$ac_ext >&5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if ${lt_cv_path_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
   fi
-  rm -rf conftest* conftst*
-
-  # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
-    break
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
   else
-    lt_cv_sys_global_symbol_pipe=
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in dumpbin "link -dump"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
   fi
 done
+  done
+IFS=$as_save_IFS
 
 fi
-
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
-  lt_cv_sys_global_symbol_to_cdecl=
 fi
-if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
-$as_echo "failed" >&6; }
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
-$as_echo "ok" >&6; }
-fi
-
-# Response file support.
-if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-  nm_file_list_spec='@'
-elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
-  nm_file_list_spec='@'
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in dumpbin "link -dump"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
 
 
+  test -n "$ac_ct_DUMPBIN" && break
+done
 
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
 
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
 
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
 
 
 
 
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if ${lt_cv_nm_interface+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
 
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if ${lt_cv_sys_max_cmd_len+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+    i=0
+  teststring="ABCD"
 
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
 
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
 
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
 
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
 
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
 
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
 
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
 
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
 
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len" && \
+	test undefined != "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
 
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
-$as_echo_n "checking for sysroot... " >&6; }
-
-# Check whether --with-sysroot was given.
-if test "${with_sysroot+set}" = set; then :
-  withval=$with_sysroot;
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
 else
-  with_sysroot=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
 fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
 
 
-lt_sysroot=
-case ${with_sysroot} in #(
- yes)
-   if test "$GCC" = yes; then
-     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
-   fi
-   ;; #(
- /*)
-   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
-   ;; #(
- no|'')
-   ;; #(
- *)
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
-$as_echo "${with_sysroot}" >&6; }
-   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
-   ;;
-esac
 
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
-$as_echo "${lt_sysroot:-no}" >&6; }
 
 
 
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
+$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
+$as_echo "$xsi_shell" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
+$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
+$as_echo "$lt_shell_append" >&6; }
 
 
-# Check whether --enable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then :
-  enableval=$enable_libtool_lock;
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
 fi
 
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
 
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
   ;;
-*-*-irix6*)
-  # Find out which ABI we are using.
-  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -melf32bsmip"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -melf32bmipn32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -melf64bmip"
-	;;
-      esac
-    else
-      case `/usr/bin/file conftest.$ac_objext` in
-	*32-bit*)
-	  LD="${LD-ld} -32"
-	  ;;
-	*N32*)
-	  LD="${LD-ld} -n32"
-	  ;;
-	*64-bit*)
-	  LD="${LD-ld} -64"
-	  ;;
-      esac
-    fi
-  fi
-  rm -rf conftest*
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
   ;;
+esac
 
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-      *32-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_i386_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_i386"
-	    ;;
-	  ppc64-*linux*|powerpc64-*linux*)
-	    LD="${LD-ld} -m elf32ppclinux"
-	    ;;
-	  s390x-*linux*)
-	    LD="${LD-ld} -m elf_s390"
-	    ;;
-	  sparc64-*linux*)
-	    LD="${LD-ld} -m elf32_sparc"
-	    ;;
-	esac
-	;;
-      *64-bit*)
-	case $host in
-	  x86_64-*kfreebsd*-gnu)
-	    LD="${LD-ld} -m elf_x86_64_fbsd"
-	    ;;
-	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_x86_64"
-	    ;;
-	  ppc*-*linux*|powerpc*-*linux*)
-	    LD="${LD-ld} -m elf64ppc"
-	    ;;
-	  s390*-*linux*|s390*-*tpf*)
-	    LD="${LD-ld} -m elf64_s390"
-	    ;;
-	  sparc*-*linux*)
-	    LD="${LD-ld} -m elf64_sparc"
-	    ;;
-	esac
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
 
-*-*-sco3.2v5*)
-  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -belf"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
-$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
-if ${lt_cv_cc_needs_belf+:} false; then :
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
+  case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
 
-     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
+fi
 
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_cc_needs_belf=yes
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  lt_cv_cc_needs_belf=no
+  #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-     ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if ${lt_cv_ld_reload_flag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_reload_flag='-r'
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
-$as_echo "$lt_cv_cc_needs_belf" >&6; }
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
-  fi
-  ;;
-*-*solaris*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.o` in
-    *64-bit*)
-      case $lt_cv_prog_gnu_ld in
-      yes*)
-        case $host in
-        i?86-*-solaris*)
-          LD="${LD-ld} -m elf_x86_64"
-          ;;
-        sparc*-*-solaris*)
-          LD="${LD-ld} -m elf64_sparc"
-          ;;
-        esac
-        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
-        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
-          LD="${LD-ld}_sol2"
-        fi
-        ;;
-      *)
-	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-	  LD="${LD-ld} -64"
-	fi
-	;;
-      esac
-      ;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
 esac
 
-need_locks="$enable_libtool_lock"
+
+
+
+
+
+
+
 
 if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
-set dummy ${ac_tool_prefix}mt; ac_word=$2
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+if ${ac_cv_prog_OBJDUMP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$MANIFEST_TOOL"; then
-  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -10259,7 +10409,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -10269,10 +10419,10 @@ IFS=$as_save_IFS
 
 fi
 fi
-MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
-if test -n "$MANIFEST_TOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
-$as_echo "$MANIFEST_TOOL" >&6; }
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
@@ -10280,17 +10430,17 @@ fi
 
 
 fi
-if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
-  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
-  # Extract the first word of "mt", so it can be a program name with args.
-set dummy mt; ac_word=$2
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$ac_ct_MANIFEST_TOOL"; then
-  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -10299,7 +10449,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -10309,17 +10459,17 @@ IFS=$as_save_IFS
 
 fi
 fi
-ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
-if test -n "$ac_ct_MANIFEST_TOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
-$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 fi
 
-  if test "x$ac_ct_MANIFEST_TOOL" = x; then
-    MANIFEST_TOOL=":"
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
@@ -10327,50 +10477,272 @@ yes:)
 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
-    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+    OBJDUMP=$ac_ct_OBJDUMP
   fi
 else
-  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
 fi
 
-test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
-$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
-if ${lt_cv_path_mainfest_tool+:} false; then :
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if ${lt_cv_deplibs_check_method+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  lt_cv_path_mainfest_tool=no
-  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
-  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
-  cat conftest.err >&5
-  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
-    lt_cv_path_mainfest_tool=yes
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
   fi
-  rm -f conftest*
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
-$as_echo "$lt_cv_path_mainfest_tool" >&6; }
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
-  MANIFEST_TOOL=:
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+    fi
+    ;;
+  esac
 fi
 
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
 
 
 
 
 
-  case $host_os in
-    rhapsody* | darwin*)
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
-set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DSYMUTIL+:} false; then :
+if ${ac_cv_prog_DLLTOOL+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$DSYMUTIL"; then
-  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -10379,7 +10751,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -10389,10 +10761,10 @@ IFS=$as_save_IFS
 
 fi
 fi
-DSYMUTIL=$ac_cv_prog_DSYMUTIL
-if test -n "$DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
-$as_echo "$DSYMUTIL" >&6; }
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
@@ -10400,17 +10772,17 @@ fi
 
 
 fi
-if test -z "$ac_cv_prog_DSYMUTIL"; then
-  ac_ct_DSYMUTIL=$DSYMUTIL
-  # Extract the first word of "dsymutil", so it can be a program name with args.
-set dummy dsymutil; ac_word=$2
+if test -z "$ac_cv_prog_DLLTOOL"; then
+  ac_ct_DLLTOOL=$DLLTOOL
+  # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$ac_ct_DSYMUTIL"; then
-  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+  if test -n "$ac_ct_DLLTOOL"; then
+  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -10419,7 +10791,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -10429,17 +10801,17 @@ IFS=$as_save_IFS
 
 fi
 fi
-ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
-if test -n "$ac_ct_DSYMUTIL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
-$as_echo "$ac_ct_DSYMUTIL" >&6; }
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 fi
 
-  if test "x$ac_ct_DSYMUTIL" = x; then
-    DSYMUTIL=":"
+  if test "x$ac_ct_DLLTOOL" = x; then
+    DLLTOOL="false"
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
@@ -10447,22 +10819,73 @@ yes:)
 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
-    DSYMUTIL=$ac_ct_DSYMUTIL
+    DLLTOOL=$ac_ct_DLLTOOL
   fi
 else
-  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+  DLLTOOL="$ac_cv_prog_DLLTOOL"
 fi
 
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
-set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ar
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_NMEDIT+:} false; then :
+if ${ac_cv_prog_AR+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$NMEDIT"; then
-  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -10471,7 +10894,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -10481,28 +10904,32 @@ IFS=$as_save_IFS
 
 fi
 fi
-NMEDIT=$ac_cv_prog_NMEDIT
-if test -n "$NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
-$as_echo "$NMEDIT" >&6; }
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 fi
 
 
+    test -n "$AR" && break
+  done
 fi
-if test -z "$ac_cv_prog_NMEDIT"; then
-  ac_ct_NMEDIT=$NMEDIT
-  # Extract the first word of "nmedit", so it can be a program name with args.
-set dummy nmedit; ac_word=$2
+if test -z "$AR"; then
+  ac_ct_AR=$AR
+  for ac_prog in ar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$ac_ct_NMEDIT"; then
-  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -10511,7 +10938,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    ac_cv_prog_ac_ct_AR="$ac_prog"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -10521,17 +10948,21 @@ IFS=$as_save_IFS
 
 fi
 fi
-ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
-if test -n "$ac_ct_NMEDIT"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
-$as_echo "$ac_ct_NMEDIT" >&6; }
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 fi
 
-  if test "x$ac_ct_NMEDIT" = x; then
-    NMEDIT=":"
+
+  test -n "$ac_ct_AR" && break
+done
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
@@ -10539,22 +10970,99 @@ yes:)
 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
-    NMEDIT=$ac_ct_NMEDIT
+    AR=$ac_ct_AR
   fi
+fi
+
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  NMEDIT="$ac_cv_prog_NMEDIT"
+  lt_cv_ar_at_file=no
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+      if test "$ac_status" -eq 0; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+
 fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
-set dummy ${ac_tool_prefix}lipo; ac_word=$2
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_LIPO+:} false; then :
+if ${ac_cv_prog_STRIP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$LIPO"; then
-  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -10563,7 +11071,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -10573,10 +11081,10 @@ IFS=$as_save_IFS
 
 fi
 fi
-LIPO=$ac_cv_prog_LIPO
-if test -n "$LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
-$as_echo "$LIPO" >&6; }
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
@@ -10584,17 +11092,17 @@ fi
 
 
 fi
-if test -z "$ac_cv_prog_LIPO"; then
-  ac_ct_LIPO=$LIPO
-  # Extract the first word of "lipo", so it can be a program name with args.
-set dummy lipo; ac_word=$2
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$ac_ct_LIPO"; then
-  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -10603,7 +11111,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_LIPO="lipo"
+    ac_cv_prog_ac_ct_STRIP="strip"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -10613,17 +11121,17 @@ IFS=$as_save_IFS
 
 fi
 fi
-ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
-if test -n "$ac_ct_LIPO"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
-$as_echo "$ac_ct_LIPO" >&6; }
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 fi
 
-  if test "x$ac_ct_LIPO" = x; then
-    LIPO=":"
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
@@ -10631,114 +11139,29 @@ yes:)
 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
-    LIPO=$ac_ct_LIPO
+    STRIP=$ac_ct_STRIP
   fi
 else
-  LIPO="$ac_cv_prog_LIPO"
+  STRIP="$ac_cv_prog_STRIP"
 fi
 
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OTOOL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$OTOOL"; then
-  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
+test -z "$STRIP" && STRIP=:
 
-fi
-fi
-OTOOL=$ac_cv_prog_OTOOL
-if test -n "$OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
-$as_echo "$OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
 
 
-fi
-if test -z "$ac_cv_prog_OTOOL"; then
-  ac_ct_OTOOL=$OTOOL
-  # Extract the first word of "otool", so it can be a program name with args.
-set dummy otool; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -n "$ac_ct_OTOOL"; then
-  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-    for ac_exec_ext in '' $ac_executable_extensions; do
-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_OTOOL="otool"
-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-  done
-IFS=$as_save_IFS
 
-fi
-fi
-ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
-if test -n "$ac_ct_OTOOL"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
-$as_echo "$ac_ct_OTOOL" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
 
-  if test "x$ac_ct_OTOOL" = x; then
-    OTOOL=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
-ac_tool_warned=yes ;;
-esac
-    OTOOL=$ac_ct_OTOOL
-  fi
-else
-  OTOOL="$ac_cv_prog_OTOOL"
-fi
 
-    if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
-set dummy ${ac_tool_prefix}otool64; ac_word=$2
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_OTOOL64+:} false; then :
+if ${ac_cv_prog_RANLIB+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$OTOOL64"; then
-  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -10747,7 +11170,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -10757,10 +11180,10 @@ IFS=$as_save_IFS
 
 fi
 fi
-OTOOL64=$ac_cv_prog_OTOOL64
-if test -n "$OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
-$as_echo "$OTOOL64" >&6; }
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
@@ -10768,17 +11191,17 @@ fi
 
 
 fi
-if test -z "$ac_cv_prog_OTOOL64"; then
-  ac_ct_OTOOL64=$OTOOL64
-  # Extract the first word of "otool64", so it can be a program name with args.
-set dummy otool64; ac_word=$2
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if test -n "$ac_ct_OTOOL64"; then
-  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
 else
 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -10787,7 +11210,7 @@ do
   test -z "$as_dir" && as_dir=.
     for ac_exec_ext in '' $ac_executable_extensions; do
   if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
     $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
@@ -10797,17 +11220,17 @@ IFS=$as_save_IFS
 
 fi
 fi
-ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
-if test -n "$ac_ct_OTOOL64"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
-$as_echo "$ac_ct_OTOOL64" >&6; }
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 fi
 
-  if test "x$ac_ct_OTOOL64" = x; then
-    OTOOL64=":"
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
@@ -10815,20 +11238,42 @@ yes:)
 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
-    OTOOL64=$ac_ct_OTOOL64
+    RANLIB=$ac_ct_RANLIB
   fi
 else
-  OTOOL64="$ac_cv_prog_OTOOL64"
+  RANLIB="$ac_cv_prog_RANLIB"
 fi
 
+test -z "$RANLIB" && RANLIB=:
 
 
 
 
 
 
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
 
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
 
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
 
 
 
@@ -10847,604 +11292,285 @@ fi
 
 
 
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
-$as_echo_n "checking for -single_module linker flag... " >&6; }
-if ${lt_cv_apple_cc_single_mod+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
-	# By default we will add the -single_module flag. You can override
-	# by either setting the environment variable LT_MULTI_MODULE
-	# non-empty at configure time, or by adding -multi_module to the
-	# link flags.
-	rm -rf libconftest.dylib*
-	echo "int foo(void){return 1;}" > conftest.c
-	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
--dynamiclib -Wl,-single_module conftest.c" >&5
-	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-        _lt_result=$?
-	# If there is a non-empty error log, and "single_module"
-	# appears in it, assume the flag caused a linker warning
-        if test -s conftest.err && $GREP single_module conftest.err; then
-	  cat conftest.err >&5
-	# Otherwise, if the output was created with a 0 exit code from
-	# the compiler, it worked.
-	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
-	  lt_cv_apple_cc_single_mod=yes
-	else
-	  cat conftest.err >&5
-	fi
-	rm -rf libconftest.dylib*
-	rm -f conftest.*
-      fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
-$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
 
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
-$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
-if ${lt_cv_ld_exported_symbols_list+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_exported_symbols_list=no
-      save_LDFLAGS=$LDFLAGS
-      echo "_main" > conftest.sym
-      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
 
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_ld_exported_symbols_list=yes
-else
-  lt_cv_ld_exported_symbols_list=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-	LDFLAGS="$save_LDFLAGS"
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
-$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
 
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
-$as_echo_n "checking for -force_load linker flag... " >&6; }
-if ${lt_cv_ld_force_load+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_ld_force_load=no
-      cat > conftest.c << _LT_EOF
-int forced_loaded() { return 2;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
-      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
-      echo "$AR cru libconftest.a conftest.o" >&5
-      $AR cru libconftest.a conftest.o 2>&5
-      echo "$RANLIB libconftest.a" >&5
-      $RANLIB libconftest.a 2>&5
-      cat > conftest.c << _LT_EOF
-int main() { return 0;}
-_LT_EOF
-      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
-      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
-      _lt_result=$?
-      if test -s conftest.err && $GREP force_load conftest.err; then
-	cat conftest.err >&5
-      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
-	lt_cv_ld_force_load=yes
-      else
-	cat conftest.err >&5
-      fi
-        rm -f conftest.err libconftest.a conftest conftest.c
-        rm -rf conftest.dSYM
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
-$as_echo "$lt_cv_ld_force_load" >&6; }
-    case $host_os in
-    rhapsody* | darwin1.[012])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-    darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-    darwin*) # darwin 5.x on
-      # if running on 10.5 or later, the deployment target defaults
-      # to the OS version, if on x86, and 10.4, the deployment
-      # target defaults to 10.4. Don't you love it?
-      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[012]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-      esac
-    ;;
-  esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-      _lt_dar_single_mod='$single_module'
-    fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-    else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-    fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
-      _lt_dsymutil='~$DSYMUTIL $lib || :'
-    else
-      _lt_dsymutil=
-    fi
-    ;;
-  esac
 
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if ${ac_cv_prog_CPP+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
 
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
 
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
 
-    done
-    ac_cv_prog_CPP=$CPP
 
-fi
-  CPP=$ac_cv_prog_CPP
-else
-  ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
 
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
 
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
 
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
 
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
 
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
 
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
 
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
 
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
+# Allow CC to be a program name with arguments.
+compiler=$CC
 
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
-
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
 
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
 
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-		  inttypes.h stdint.h unistd.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
 
-fi
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
 
-done
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
 
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
 
-for ac_header in dlfcn.h
-do :
-  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
-"
-if test "x$ac_cv_header_dlfcn_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DLFCN_H 1
-_ACEOF
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
 
-fi
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
 
-done
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
 
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
 
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
 
-func_stripname_cnf ()
-{
-  case ${2} in
-  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-  esac
-} # func_stripname_cnf
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
 
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
 
+  # Check to see that the pipe works correctly.
+  pipe_works=no
 
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
 
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
 
-# Set options
-enable_dlopen=yes
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
 
+#ifdef __cplusplus
+extern "C" {
+#endif
 
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
 
+	  cat <<_LT_EOF >> conftest.$ac_ext
 
-  enable_win32_dll=no
+/* The mapping between symbol names and symbols.  */
+LT_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
 
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
 
-            # Check whether --enable-shared was given.
-if test "${enable_shared+set}" = set; then :
-  enableval=$enable_shared; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_shared=yes ;;
-    no) enable_shared=no ;;
-    *)
-      enable_shared=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_shared=yes
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
 	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_shared=yes
-fi
-
-
-
-
-
-
-
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
 
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
 
-  # Check whether --enable-static was given.
-if test "${enable_static+set}" = set; then :
-  enableval=$enable_static; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_static=yes ;;
-    no) enable_static=no ;;
-    *)
-     enable_static=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_static=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  enable_static=yes
 fi
 
-
-
-
-
-
-
-
-
-
-# Check whether --with-pic was given.
-if test "${with_pic+set}" = set; then :
-  withval=$with_pic; lt_p=${PACKAGE-default}
-    case $withval in
-    yes|no) pic_mode=$withval ;;
-    *)
-      pic_mode=default
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for lt_pkg in $withval; do
-	IFS="$lt_save_ifs"
-	if test "X$lt_pkg" = "X$lt_p"; then
-	  pic_mode=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
-else
-  pic_mode=default
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
 fi
-
-
-test -z "$pic_mode" && pic_mode=default
-
-
-
-
-
-
-
-  # Check whether --enable-fast-install was given.
-if test "${enable_fast_install+set}" = set; then :
-  enableval=$enable_fast_install; p=${PACKAGE-default}
-    case $enableval in
-    yes) enable_fast_install=yes ;;
-    no) enable_fast_install=no ;;
-    *)
-      enable_fast_install=no
-      # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
-      for pkg in $enableval; do
-	IFS="$lt_save_ifs"
-	if test "X$pkg" = "X$p"; then
-	  enable_fast_install=yes
-	fi
-      done
-      IFS="$lt_save_ifs"
-      ;;
-    esac
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
 else
-  enable_fast_install=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
 fi
 
-
-
-
-
-
-
-
-
-
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-
-
-
-
-
-
-
-
-
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
 
 
 
@@ -11466,783 +11592,1085 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool'
 
 
 
-test -z "$LN_S" && LN_S="ln -s"
 
 
 
 
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
 
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+  withval=$with_sysroot;
+else
+  with_sysroot=no
+fi
 
 
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
+$as_echo "${with_sysroot}" >&6; }
+   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+   ;;
+esac
 
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
 
 
 
 
-if test -n "${ZSH_VERSION+set}" ; then
-   setopt NO_GLOB_SUBST
-fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
-$as_echo_n "checking for objdir... " >&6; }
-if ${lt_cv_objdir+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
-  lt_cv_objdir=.libs
-else
-  # MS-DOS does not allow filenames that begin with a dot.
-  lt_cv_objdir=_libs
-fi
-rmdir .libs 2>/dev/null
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+  enableval=$enable_libtool_lock;
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
-$as_echo "$lt_cv_objdir" >&6; }
-objdir=$lt_cv_objdir
 
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
 
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define LT_OBJDIR "$lt_cv_objdir/"
-_ACEOF
-
-
-
-
-case $host_os in
-aix3*)
-  # AIX sometimes has problems with the GCC collect2 program.  For some
-  # reason, if we set the COLLECT_NAMES environment variable, the problems
-  # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
-    COLLECT_NAMES=
-    export COLLECT_NAMES
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
   fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
   ;;
-esac
 
-# Global variables:
-ofile=libtool
-can_build_shared=yes
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    case `/usr/bin/file conftest.o` in
+	      *x86-64*)
+		LD="${LD-ld} -m elf32_x86_64"
+		;;
+	      *)
+		LD="${LD-ld} -m elf_i386"
+		;;
+	    esac
+	    ;;
+	  powerpc64le-*)
+	    LD="${LD-ld} -m elf32lppclinux"
+	    ;;
+	  powerpc64-*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  powerpcle-*)
+	    LD="${LD-ld} -m elf64lppc"
+	    ;;
+	  powerpc-*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
 
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if ${lt_cv_cc_needs_belf+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-with_gnu_ld="$lt_cv_prog_gnu_ld"
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
 
-# Set sane defaults for various variables
-test -z "$CC" && CC=cc
-test -z "$LTCC" && LTCC=$CC
-test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
-test -z "$LD" && LD=ld
-test -z "$ac_objext" && ac_objext=o
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_cc_needs_belf=yes
+else
+  lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
 
+need_locks="$enable_libtool_lock"
 
-# Only perform the check for file, if the check method requires it
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-case $deplibs_check_method in
-file_magic*)
-  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
-$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
-if ${lt_cv_path_MAGIC_CMD+:} false; then :
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/${ac_tool_prefix}file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
+  if test -n "$MANIFEST_TOOL"; then
+  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
   done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
+IFS=$as_save_IFS
 
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 fi
 
 
-
-
-
-if test -z "$lt_cv_path_MAGIC_CMD"; then
-  if test -n "$ac_tool_prefix"; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
-$as_echo_n "checking for file... " >&6; }
-if ${lt_cv_path_MAGIC_CMD+:} false; then :
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+  # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  case $MAGIC_CMD in
-[\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
-  ;;
-*)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
-  for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/file"
-      if test -n "$file_magic_test_file"; then
-	case $deplibs_check_method in
-	"file_magic "*)
-	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
-	    $EGREP "$file_magic_regex" > /dev/null; then
-	    :
-	  else
-	    cat <<_LT_EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such.  This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem.  Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool at gnu.org
-
-_LT_EOF
-	  fi ;;
-	esac
-      fi
-      break
-    fi
+  if test -n "$ac_ct_MANIFEST_TOOL"; then
+  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
   done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
-  ;;
-esac
-fi
+IFS=$as_save_IFS
 
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
-$as_echo "$MAGIC_CMD" >&6; }
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 fi
 
-
+  if test "x$ac_ct_MANIFEST_TOOL" = x; then
+    MANIFEST_TOOL=":"
   else
-    MAGIC_CMD=:
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
   fi
+else
+  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
 fi
 
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&5
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
   fi
-  ;;
-esac
-
-# Use C for the default configuration in the libtool script
-
-lt_save_CC="$CC"
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-# Source file extension for C test sources.
-ac_ext=c
-
-# Object file extension for compiled C test sources.
-objext=o
-objext=$objext
-
-# Code to be used in simple compile tests
-lt_simple_compile_test_code="int some_variable = 0;"
-
-# Code to be used in simple link tests
-lt_simple_link_test_code='int main(){return(0);}'
-
-
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
 
 
 
 
 
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
 
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
-# Allow CC to be a program name with arguments.
-compiler=$CC
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
 
-# Save the default compiler, since it gets overwritten when the other
-# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
-compiler_DEFAULT=$CC
 
-# save warnings/boilerplate of simple test code
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
-ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
 
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
 
-if test -n "$compiler"; then
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
-lt_prog_compiler_no_builtin_flag=
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
 
-if test "$GCC" = yes; then
-  case $cc_basename in
-  nvcc*)
-    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
-  *)
-    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
-  esac
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
-if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  lt_cv_prog_compiler_rtti_exceptions=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_rtti_exceptions=yes
-     fi
-   fi
-   $RM conftest*
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
-
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
-    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
 else
-    :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
 fi
 
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
 
 
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_LIPO="lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
 
-  lt_prog_compiler_wl=
-lt_prog_compiler_pic=
-lt_prog_compiler_static=
-
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
 
-  if test "$GCC" = yes; then
-    lt_prog_compiler_wl='-Wl,'
-    lt_prog_compiler_static='-static'
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
-    case $host_os in
-      aix*)
-      # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
 
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            lt_prog_compiler_pic='-fPIC'
-        ;;
-      m68k)
-            # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
-            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
-        ;;
-      esac
-      ;;
 
-    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
-      # PIC is the default for these OSes.
-      ;;
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL="otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      # Although the cygwin gcc ignores -fPIC, still need this for old-style
-      # (--disable-auto-import) libraries
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
 
-    darwin* | rhapsody*)
-      # PIC is the default on this platform
-      # Common symbols not allowed in MH_DYLIB files
-      lt_prog_compiler_pic='-fno-common'
-      ;;
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
 
-    haiku*)
-      # PIC is the default for Haiku.
-      # The "-static" flag exists, but is broken.
-      lt_prog_compiler_static=
-      ;;
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
-    hpux*)
-      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
-      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
-      # sets the default TLS model and affects inlining.
-      case $host_cpu in
-      hppa*64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='-fPIC'
-	;;
-      esac
-      ;;
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
 
-    interix[3-9]*)
-      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
-      # Instead, we relocate shared libraries at runtime.
-      ;;
 
-    msdosdjgpp*)
-      # Just because we use GCC doesn't mean we suddenly get shared libraries
-      # on systems that don't support them.
-      lt_prog_compiler_can_build_shared=no
-      enable_shared=no
-      ;;
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
 
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
 
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	lt_prog_compiler_pic=-Kconform_pic
-      fi
-      ;;
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
 
-    *)
-      lt_prog_compiler_pic='-fPIC'
-      ;;
-    esac
 
-    case $cc_basename in
-    nvcc*) # Cuda Compiler Driver 2.2
-      lt_prog_compiler_wl='-Xlinker '
-      if test -n "$lt_prog_compiler_pic"; then
-        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
-      fi
-      ;;
-    esac
-  else
-    # PORTME Check for flag to pass linker flags through the system compiler.
-    case $host_os in
-    aix*)
-      lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      else
-	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
-      fi
-      ;;
 
-    mingw* | cygwin* | pw32* | os2* | cegcc*)
-      # This hack is so that the source file can tell whether it is being
-      # built for inclusion in a dll (and should export symbols for example).
-      lt_prog_compiler_pic='-DDLL_EXPORT'
-      ;;
 
-    hpux9* | hpux10* | hpux11*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
-      # not for PA HP-UX.
-      case $host_cpu in
-      hppa*64*|ia64*)
-	# +Z the default
-	;;
-      *)
-	lt_prog_compiler_pic='+Z'
-	;;
-      esac
-      # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static='${wl}-a ${wl}archive'
-      ;;
 
-    irix5* | irix6* | nonstopux*)
-      lt_prog_compiler_wl='-Wl,'
-      # PIC (with -KPIC) is the default.
-      lt_prog_compiler_static='-non_shared'
-      ;;
 
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
-      case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
-      ecc*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-KPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # icc used to be incompatible with GCC.
-      # ICC 10 doesn't accept -KPIC any more.
-      icc* | ifort*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fPIC'
-	lt_prog_compiler_static='-static'
-        ;;
-      # Lahey Fortran 8.1.
-      lf95*)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='--shared'
-	lt_prog_compiler_static='--static'
-	;;
-      nagfor*)
-	# NAG Fortran compiler
-	lt_prog_compiler_wl='-Wl,-Wl,,'
-	lt_prog_compiler_pic='-PIC'
-	lt_prog_compiler_static='-Bstatic'
-	;;
-      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
-        # Portland Group compilers (*not* the Pentium gcc compiler,
-	# which looks to be a dead project)
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-fpic'
-	lt_prog_compiler_static='-Bstatic'
-        ;;
-      ccc*)
-        lt_prog_compiler_wl='-Wl,'
-        # All Alpha code is PIC.
-        lt_prog_compiler_static='-non_shared'
-        ;;
-      xl* | bgxl* | bgf* | mpixl*)
-	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
-	lt_prog_compiler_wl='-Wl,'
-	lt_prog_compiler_pic='-qpic'
-	lt_prog_compiler_static='-qstaticlink'
-	;;
-      *)
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
-	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl=''
-	  ;;
-	*Sun\ F* | *Sun*Fortran*)
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl='-Qoption ld '
-	  ;;
-	*Sun\ C*)
-	  # Sun C 5.9
-	  lt_prog_compiler_pic='-KPIC'
-	  lt_prog_compiler_static='-Bstatic'
-	  lt_prog_compiler_wl='-Wl,'
-	  ;;
-        *Intel*\ [CF]*Compiler*)
-	  lt_prog_compiler_wl='-Wl,'
-	  lt_prog_compiler_pic='-fPIC'
-	  lt_prog_compiler_static='-static'
-	  ;;
-	*Portland\ Group*)
-	  lt_prog_compiler_wl='-Wl,'
-	  lt_prog_compiler_pic='-fpic'
-	  lt_prog_compiler_static='-Bstatic'
-	  ;;
-	esac
-	;;
-      esac
-      ;;
 
-    newsos6)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
 
-    *nto* | *qnx*)
-      # QNX uses GNU C++, but need to define -shared option too, otherwise
-      # it will coredump.
-      lt_prog_compiler_pic='-fPIC -shared'
-      ;;
 
-    osf3* | osf4* | osf5*)
-      lt_prog_compiler_wl='-Wl,'
-      # All OSF/1 code is PIC.
-      lt_prog_compiler_static='-non_shared'
-      ;;
 
-    rdos*)
-      lt_prog_compiler_static='-non_shared'
-      ;;
 
-    solaris*)
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      case $cc_basename in
-      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
-	lt_prog_compiler_wl='-Qoption ld ';;
-      *)
-	lt_prog_compiler_wl='-Wl,';;
-      esac
-      ;;
 
-    sunos4*)
-      lt_prog_compiler_wl='-Qoption ld '
-      lt_prog_compiler_pic='-PIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
 
-    sysv4 | sysv4.2uw2* | sysv4.3*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
 
-    sysv4*MP*)
-      if test -d /usr/nec ;then
-	lt_prog_compiler_pic='-Kconform_pic'
-	lt_prog_compiler_static='-Bstatic'
-      fi
-      ;;
 
-    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_pic='-KPIC'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
 
-    unicos*)
-      lt_prog_compiler_wl='-Wl,'
-      lt_prog_compiler_can_build_shared=no
-      ;;
 
-    uts4*)
-      lt_prog_compiler_pic='-pic'
-      lt_prog_compiler_static='-Bstatic'
-      ;;
 
-    *)
-      lt_prog_compiler_can_build_shared=no
-      ;;
-    esac
-  fi
 
-case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
-  *djgpp*)
-    lt_prog_compiler_pic=
-    ;;
-  *)
-    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
-    ;;
-esac
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
-$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
-if ${lt_cv_prog_compiler_pic+:} false; then :
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+  lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&5
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&5
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
-$as_echo "$lt_cv_prog_compiler_pic" >&6; }
-lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
 
-#
-# Check to make sure the PIC flag actually works.
-#
-if test -n "$lt_prog_compiler_pic"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
-$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
-if ${lt_cv_prog_compiler_pic_works+:} false; then :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  lt_cv_prog_compiler_pic_works=no
-   ac_outfile=conftest.$ac_objext
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   # The option is referenced via a variable to avoid confusing sed.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>conftest.err)
-   ac_status=$?
-   cat conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s "$ac_outfile"; then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings other than the usual output.
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
-     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_pic_works=yes
-     fi
-   fi
-   $RM conftest*
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
+else
+  lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	LDFLAGS="$save_LDFLAGS"
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
-$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
 
-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
-    case $lt_prog_compiler_pic in
-     "" | " "*) ;;
-     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
-     esac
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-    lt_prog_compiler_pic=
-     lt_prog_compiler_can_build_shared=no
+  lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+      echo "$AR cru libconftest.a conftest.o" >&5
+      $AR cru libconftest.a conftest.o 2>&5
+      echo "$RANLIB libconftest.a" >&5
+      $RANLIB libconftest.a 2>&5
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&5
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&5
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[012]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+for ac_header in dlfcn.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
 
 fi
 
+done
 
 
 
+func_stripname_cnf ()
+{
+  case ${2} in
+  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+} # func_stripname_cnf
 
 
 
 
 
+# Set options
+enable_dlopen=yes
 
 
-#
-# Check to make sure the static flag actually works.
-#
-wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
-if ${lt_cv_prog_compiler_static_works+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_static_works=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler_static_works=yes
-       fi
-     else
-       lt_cv_prog_compiler_static_works=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
-$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
 
-if test x"$lt_cv_prog_compiler_static_works" = xyes; then
-    :
+  enable_win32_dll=no
+
+
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
 else
-    lt_prog_compiler_static=
+  enable_shared=yes
 fi
 
 
@@ -12251,134 +12679,92 @@ fi
 
 
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
 
+  # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_static=yes
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
 
 
 
 
 
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
-$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
-if ${lt_cv_prog_compiler_c_o+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_prog_compiler_c_o=no
-   $RM -r conftest 2>/dev/null
-   mkdir conftest
-   cd conftest
-   mkdir out
-   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
-   lt_compiler_flag="-o out/conftest2.$ac_objext"
-   # Insert the option either (1) after the last *FLAGS variable, or
-   # (2) before a word containing "conftest.", or (3) at the end.
-   # Note that $ac_compile itself does not contain backslashes and begins
-   # with a dollar sign (not a hyphen), so the echo should work correctly.
-   lt_compile=`echo "$ac_compile" | $SED \
-   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-   -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
-   (eval "$lt_compile" 2>out/conftest.err)
-   ac_status=$?
-   cat out/conftest.err >&5
-   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-   if (exit $ac_status) && test -s out/conftest2.$ac_objext
-   then
-     # The compiler can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
-     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-       lt_cv_prog_compiler_c_o=yes
-     fi
-   fi
-   chmod u+w . 2>&5
-   $RM conftest*
-   # SGI C++ compiler will create directory out/ii_files/ for
-   # template instantiation
-   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
-   $RM out/* && rmdir out
-   cd ..
-   $RM -r conftest
-   $RM conftest*
 
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+  withval=$with_pic; lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+	IFS="$lt_save_ifs"
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  pic_mode=default
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
-$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
 
 
+test -z "$pic_mode" && pic_mode=default
 
 
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
-  # do not overwrite the value of need_locks provided by the user
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
-$as_echo_n "checking if we can lock with hard links... " >&6; }
-  hard_links=yes
-  $RM conftest*
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  touch conftest.a
-  ln conftest.a conftest.b 2>&5 || hard_links=no
-  ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
-$as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
-    need_locks=warn
-  fi
+
+
+
+
+
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
 else
-  need_locks=no
+  enable_fast_install=yes
 fi
 
 
@@ -12386,1305 +12772,777 @@ fi
 
 
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
 
-  runpath_var=
-  allow_undefined_flag=
-  always_export_symbols=no
-  archive_cmds=
-  archive_expsym_cmds=
-  compiler_needs_object=no
-  enable_shared_with_static_runtimes=no
-  export_dynamic_flag_spec=
-  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
-  hardcode_automatic=no
-  hardcode_direct=no
-  hardcode_direct_absolute=no
-  hardcode_libdir_flag_spec=
-  hardcode_libdir_separator=
-  hardcode_minus_L=no
-  hardcode_shlibpath_var=unsupported
-  inherit_rpath=no
-  link_all_deplibs=unknown
-  module_cmds=
-  module_expsym_cmds=
-  old_archive_from_new_cmds=
-  old_archive_from_expsyms_cmds=
-  thread_safe_flag_spec=
-  whole_archive_flag_spec=
-  # include_expsyms should be a list of space-separated symbols to be *always*
-  # included in the symbol list
-  include_expsyms=
-  # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
-  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
-  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-  # platforms (ab)use it in PIC code, but their linkers get confused if
-  # the symbol is explicitly referenced.  Since portable code cannot
-  # rely on this symbol name, it's probably fine to never include it in
-  # preloaded symbol tables.
-  # Exclude shared library initialization/finalization symbols.
-  extract_expsyms_cmds=
 
-  case $host_os in
-  cygwin* | mingw* | pw32* | cegcc*)
-    # FIXME: the MSVC++ port hasn't been tested in a loooong time
-    # When not using gcc, we currently assume that we are using
-    # Microsoft Visual C++.
-    if test "$GCC" != yes; then
-      with_gnu_ld=no
-    fi
-    ;;
-  interix*)
-    # we just hope/assume this is gcc and not c89 (= MSVC++)
-    with_gnu_ld=yes
-    ;;
-  openbsd*)
-    with_gnu_ld=no
-    ;;
-  esac
 
-  ld_shlibs=yes
 
-  # On some targets, GNU ld is compatible enough with the native linker
-  # that we're better off using the native interface for both.
-  lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
-    case $host_os in
-      aix*)
-	# The AIX port of GNU ld has always aspired to compatibility
-	# with the native linker.  However, as the warning in the GNU ld
-	# block says, versions before 2.19.5* couldn't really create working
-	# shared libraries, regardless of the interface used.
-	case `$LD -v 2>&1` in
-	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
-	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
-	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
-	  *)
-	    lt_use_gnu_ld_interface=yes
-	    ;;
-	esac
-	;;
-      *)
-	lt_use_gnu_ld_interface=yes
-	;;
-    esac
-  fi
 
-  if test "$lt_use_gnu_ld_interface" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
 
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-    export_dynamic_flag_spec='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      whole_archive_flag_spec=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
 
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[3-9]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
 
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
 
-_LT_EOF
-      fi
-      ;;
 
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
 
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	allow_undefined_flag=unsupported
-	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
 
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
-      # as there is no search path for DLLs.
-      hardcode_libdir_flag_spec='-L$libdir'
-      export_dynamic_flag_spec='${wl}--export-all-symbols'
-      allow_undefined_flag=unsupported
-      always_export_symbols=no
-      enable_shared_with_static_runtimes=yes
-      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
-      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
 
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
 
-    haiku*)
-      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      link_all_deplibs=yes
-      ;;
 
-    interix[3-9]*)
-      hardcode_direct=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
 
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=' $pic_flag'
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95* | pgfortran*)
-					# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  whole_archive_flag_spec=
-	  tmp_sharedflag='--shared' ;;
-	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	nvcc*)	# Cuda Compiler Driver 2.2
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object=yes
-	  ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
 
-        if test "x$supports_anon_versioning" = xyes; then
-          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
 
-	case $cc_basename in
-	xlf* | bgf* | bgxlf* | mpixlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
-	  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        ld_shlibs=no
-      fi
-      ;;
 
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
 
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
 
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
 
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
 
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-	ld_shlibs=no
-	cat <<_LT_EOF 1>&2
 
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
 
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    ld_shlibs=no
-	  fi
-	;;
-      esac
-      ;;
 
-    sunos4*)
-      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
 
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs=no
-      fi
-      ;;
-    esac
 
-    if test "$ld_shlibs" = no; then
-      runpath_var=
-      hardcode_libdir_flag_spec=
-      export_dynamic_flag_spec=
-      whole_archive_flag_spec=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      allow_undefined_flag=unsupported
-      always_export_symbols=yes
-      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	hardcode_direct=unsupported
-      fi
-      ;;
 
-    aix[4-9]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
 
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
 
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
 
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
 
-      archive_cmds=''
-      hardcode_direct=yes
-      hardcode_direct_absolute=yes
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      file_list_spec='${wl}-f,'
 
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[012]|aix4.[012].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  hardcode_direct=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  hardcode_minus_L=yes
-	  hardcode_libdir_flag_spec='-L$libdir'
-	  hardcode_libdir_separator=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
 
-      export_dynamic_flag_spec='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      always_export_symbols=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	allow_undefined_flag='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        if test "${lt_cv_aix_libpath+set}" = set; then
-  aix_libpath=$lt_cv_aix_libpath
-else
-  if ${lt_cv_aix_libpath_+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
 
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
+test -z "$LN_S" && LN_S="ln -s"
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
 
-  lt_aix_libpath_sed='
-      /Import File Strings/,/^$/ {
-	  /^0/ {
-	      s/^0  *\([^ ]*\) *$/\1/
-	      p
-	  }
-      }'
-  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  # Check for a 64-bit object if we didn't find anything.
-  if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_="/usr/lib:/lib"
-  fi
 
-fi
 
-  aix_libpath=$lt_cv_aix_libpath_
-fi
 
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag="-z nodefs"
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 if test "${lt_cv_aix_libpath+set}" = set; then
-  aix_libpath=$lt_cv_aix_libpath
-else
-  if ${lt_cv_aix_libpath_+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
 
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
 
-  lt_aix_libpath_sed='
-      /Import File Strings/,/^$/ {
-	  /^0/ {
-	      s/^0  *\([^ ]*\) *$/\1/
-	      p
-	  }
-      }'
-  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  # Check for a 64-bit object if we didn't find anything.
-  if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_="/usr/lib:/lib"
-  fi
 
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
 fi
 
-  aix_libpath=$lt_cv_aix_libpath_
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if ${lt_cv_objdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
 fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
 
-	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag=' ${wl}-bernotok'
-	  allow_undefined_flag=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
-	    # We only use this code for GNU lds that support --whole-archive.
-	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	  else
-	    # Exported symbols can be pulled into shared objects from archives
-	    whole_archive_flag_spec='$convenience'
-	  fi
-	  archive_cmds_need_lc=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
-      fi
-      ;;
 
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds=''
-        ;;
-      m68k)
-            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_minus_L=yes
-        ;;
-      esac
-      ;;
 
-    bsdi[45]*)
-      export_dynamic_flag_spec=-rdynamic
-      ;;
 
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      case $cc_basename in
-      cl*)
-	# Native MSVC
-	hardcode_libdir_flag_spec=' '
-	allow_undefined_flag=unsupported
-	always_export_symbols=yes
-	file_list_spec='@'
-	# Tell ltmain to make .lib files, not .a files.
-	libext=lib
-	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
-	# FIXME: Setting linknames here is a bad hack.
-	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	  else
-	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	  fi~
-	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	  linknames='
-	# The linker will not automatically build a static lib if we build a DLL.
-	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
-	enable_shared_with_static_runtimes=yes
-	exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
-	export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
-	# Don't use ranlib
-	old_postinstall_cmds='chmod 644 $oldlib'
-	postlink_cmds='lt_outputfile="@OUTPUT@"~
-	  lt_tool_outputfile="@TOOL_OUTPUT@"~
-	  case $lt_outputfile in
-	    *.exe|*.EXE) ;;
-	    *)
-	      lt_outputfile="$lt_outputfile.exe"
-	      lt_tool_outputfile="$lt_tool_outputfile.exe"
-	      ;;
-	  esac~
-	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	    $RM "$lt_outputfile.manifest";
-	  fi'
-	;;
-      *)
-	# Assume MSVC wrapper
-	hardcode_libdir_flag_spec=' '
-	allow_undefined_flag=unsupported
-	# Tell ltmain to make .lib files, not .a files.
-	libext=lib
-	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
-	# FIXME: Setting linknames here is a bad hack.
-	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
-	# The linker will automatically build a .lib file if we build a DLL.
-	old_archive_from_new_cmds='true'
-	# FIXME: Should let the user specify the lib program.
-	old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
-	enable_shared_with_static_runtimes=yes
-	;;
-      esac
-      ;;
 
-    darwin* | rhapsody*)
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
 
 
-  archive_cmds_need_lc=no
-  hardcode_direct=no
-  hardcode_automatic=yes
-  hardcode_shlibpath_var=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
 
-  else
-    whole_archive_flag_spec=''
-  fi
-  link_all_deplibs=yes
-  allow_undefined_flag="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=func_echo_all
-    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
 
-  else
-  ld_shlibs=no
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
   fi
+  ;;
+esac
 
-      ;;
-
-    dgux*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
+# Global variables:
+ofile=libtool
+can_build_shared=yes
 
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2.*)
-      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
 
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
+with_gnu_ld="$lt_cv_prog_gnu_ld"
 
-    hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_direct=yes
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
 
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L=yes
-      export_dynamic_flag_spec='${wl}-E'
-      ;;
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
 
-    hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator=:
-	hardcode_direct=yes
-	hardcode_direct_absolute=yes
-	export_dynamic_flag_spec='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	hardcode_minus_L=yes
-      fi
-      ;;
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
 
-    hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
 
-	  # Older versions of the 11.00 compiler do not understand -b yet
-	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
-	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
-$as_echo_n "checking if $CC understands -b... " >&6; }
-if ${lt_cv_prog_compiler__b+:} false; then :
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  lt_cv_prog_compiler__b=no
-   save_LDFLAGS="$LDFLAGS"
-   LDFLAGS="$LDFLAGS -b"
-   echo "$lt_simple_link_test_code" > conftest.$ac_ext
-   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-     # The linker can only warn and ignore the option if not recognized
-     # So say no if there are warnings
-     if test -s conftest.err; then
-       # Append any errors to the config.log.
-       cat conftest.err 1>&5
-       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
-       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-       if diff conftest.exp conftest.er2 >/dev/null; then
-         lt_cv_prog_compiler__b=yes
-       fi
-     else
-       lt_cv_prog_compiler__b=yes
-     fi
-   fi
-   $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
-$as_echo "$lt_cv_prog_compiler__b" >&6; }
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
 
-if test x"$lt_cv_prog_compiler__b" = xyes; then
-    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
 else
-    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator=:
 
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  hardcode_direct=no
-	  hardcode_shlibpath_var=no
-	  ;;
-	*)
-	  hardcode_direct=yes
-	  hardcode_direct_absolute=yes
-	  export_dynamic_flag_spec='${wl}-E'
 
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  hardcode_minus_L=yes
-	  ;;
-	esac
-      fi
-      ;;
 
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-	# This should be the same for all languages, so no per-tag cache variable.
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
-$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
-if ${lt_cv_irix_exported_symbol+:} false; then :
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  save_LDFLAGS="$LDFLAGS"
-	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-int foo (void) { return 0; }
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  lt_cv_irix_exported_symbol=yes
-else
-  lt_cv_irix_exported_symbol=no
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-           LDFLAGS="$save_LDFLAGS"
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
-$as_echo "$lt_cv_irix_exported_symbol" >&6; }
-	if test "$lt_cv_irix_exported_symbol" = yes; then
-          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-	fi
-      else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      inherit_rpath=yes
-      link_all_deplibs=yes
-      ;;
 
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
-      else
-	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_direct=yes
-      hardcode_shlibpath_var=no
-      ;;
 
-    newsos6)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      hardcode_shlibpath_var=no
-      ;;
+  else
+    MAGIC_CMD=:
+  fi
+fi
 
-    *nto* | *qnx*)
-      ;;
+  fi
+  ;;
+esac
 
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	hardcode_direct=yes
-	hardcode_shlibpath_var=no
-	hardcode_direct_absolute=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	  export_dynamic_flag_spec='${wl}-E'
-	else
-	  case $host_os in
-	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     hardcode_libdir_flag_spec='-R$libdir'
-	     ;;
-	   *)
-	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
-      else
-	ld_shlibs=no
-      fi
-      ;;
+# Use C for the default configuration in the libtool script
 
-    os2*)
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_minus_L=yes
-      allow_undefined_flag=unsupported
-      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
-      ;;
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-    osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator=:
-      ;;
 
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-      else
-	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+# Source file extension for C test sources.
+ac_ext=c
 
-	# Both c and cxx compiler support -rpath directly
-	hardcode_libdir_flag_spec='-rpath $libdir'
-      fi
-      archive_cmds_need_lc='no'
-      hardcode_libdir_separator=:
-      ;;
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
 
-    solaris*)
-      no_undefined_flag=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
-	  ;;
-	*)
-	  wlarc='${wl}'
-	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-	  ;;
-	esac
-      fi
-      hardcode_libdir_flag_spec='-R$libdir'
-      hardcode_shlibpath_var=no
-      case $host_os in
-      solaris2.[0-5] | solaris2.[0-5].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      link_all_deplibs=yes
-      ;;
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
 
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_direct=yes
-      hardcode_minus_L=yes
-      hardcode_shlibpath_var=no
-      ;;
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
 
-    sysv4)
-      case $host_vendor in
-	sni)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  reload_cmds='$CC -r -o $output$reload_objs'
-	  hardcode_direct=no
-        ;;
-	motorola)
-	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      hardcode_shlibpath_var=no
-      ;;
 
-    sysv4.3*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_shlibpath_var=no
-      export_dynamic_flag_spec='-Bexport'
-      ;;
 
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	hardcode_shlibpath_var=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	ld_shlibs=yes
-      fi
-      ;;
 
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag='${wl}-z,text'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
 
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      no_undefined_flag='${wl}-z,text'
-      allow_undefined_flag='${wl}-z,nodefs'
-      archive_cmds_need_lc=no
-      hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-R,$libdir'
-      hardcode_libdir_separator=':'
-      link_all_deplibs=yes
-      export_dynamic_flag_spec='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
-      ;;
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
 
-    uts4*)
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec='-L$libdir'
-      hardcode_shlibpath_var=no
-      ;;
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
 
-    *)
-      ld_shlibs=no
-      ;;
-    esac
+# Allow CC to be a program name with arguments.
+compiler=$CC
 
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	export_dynamic_flag_spec='${wl}-Blargedynsym'
-	;;
-      esac
-    fi
-  fi
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
-$as_echo "$ld_shlibs" >&6; }
-test "$ld_shlibs" = no && can_build_shared=no
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
 
-with_gnu_ld=$with_gnu_ld
 
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
 
+lt_prog_compiler_no_builtin_flag=
 
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+  *)
+    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+  esac
 
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
 
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
 
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
 
+fi
 
 
 
 
 
 
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
 
 
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc=yes
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
       ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if ${lt_cv_archive_cmds_need_lc+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  $RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
-	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$lt_prog_compiler_wl
-	  pic_flag=$lt_prog_compiler_pic
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$allow_undefined_flag
-	  allow_undefined_flag=
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
-  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
-	  then
-	    lt_cv_archive_cmds_need_lc=no
-	  else
-	    lt_cv_archive_cmds_need_lc=yes
-	  fi
-	  allow_undefined_flag=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
-	fi
-	$RM conftest*
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
-      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
       ;;
-    esac
-  fi
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-
 
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
 
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
 
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static=
+      ;;
 
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
+	;;
+      esac
+      ;;
 
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
 
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
 
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
 
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
 
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
 
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl='-Xlinker '
+      if test -n "$lt_prog_compiler_pic"; then
+        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
 
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
 
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      ;;
 
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
 
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='--shared'
+	lt_prog_compiler_static='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	lt_prog_compiler_wl='-Wl,-Wl,,'
+	lt_prog_compiler_pic='-PIC'
+	lt_prog_compiler_static='-Bstatic'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-qpic'
+	lt_prog_compiler_static='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Wl,'
+	  ;;
+        *Intel*\ [CF]*Compiler*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fPIC'
+	  lt_prog_compiler_static='-static'
+	  ;;
+	*Portland\ Group*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fpic'
+	  lt_prog_compiler_static='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
 
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
 
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
 
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
 
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
 
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
 
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
 
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
 
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
 
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
 
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
 
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
 
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
 
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
 
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
 
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
 
+if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
 
+fi
 
 
 
@@ -13696,8 +13554,46 @@ esac
 
 
 
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
 
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
 
+if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+    :
+else
+    lt_prog_compiler_static=
+fi
 
 
 
@@ -13705,852 +13601,1418 @@ esac
 
 
 
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
 
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
 
 
 
 
 
 
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
 
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
 
 
 
 
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
 
 
 
 
 
 
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
 
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
 
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs=no
+    ;;
+  esac
 
+  ld_shlibs=yes
 
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
 
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
 
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
 
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
 
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
 
+_LT_EOF
+      fi
+      ;;
 
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
 
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
 
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      export_dynamic_flag_spec='${wl}--export-all-symbols'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
 
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
 
+    haiku*)
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      link_all_deplibs=yes
+      ;;
 
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
 
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec=
+	  tmp_sharedflag='--shared' ;;
+	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
 
+        if test "x$supports_anon_versioning" = xyes; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
 
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs=no
+      fi
+      ;;
 
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
 
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
 
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
 
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
 
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
 
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
 
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
+      ;;
 
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
 
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+    esac
 
+    if test "$ld_shlibs" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
 
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
 
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
 
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
 
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
 
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='${wl}-f,'
 
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L=yes
+	  hardcode_libdir_flag_spec='-L$libdir'
+	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+	link_all_deplibs=no
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
 
+      export_dynamic_flag_spec='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
 
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
 
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
 
+fi
 
+  aix_libpath=$lt_cv_aix_libpath_
+fi
 
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
 
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
 
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
 
+fi
 
+  aix_libpath=$lt_cv_aix_libpath_
+fi
 
+	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' ${wl}-bernotok'
+	  allow_undefined_flag=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec='$convenience'
+	  fi
+	  archive_cmds_need_lc=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
 
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
 
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
 
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	always_export_symbols=yes
+	file_list_spec='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+	enable_shared_with_static_runtimes=yes
+	exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	old_postinstall_cmds='chmod 644 $oldlib'
+	postlink_cmds='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	old_archive_from_new_cmds='true'
+	# FIXME: Should let the user specify the lib program.
+	old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	enable_shared_with_static_runtimes=yes
+	;;
+      esac
+      ;;
 
+    darwin* | rhapsody*)
 
 
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
 
+  else
+    whole_archive_flag_spec=''
+  fi
+  link_all_deplibs=yes
+  allow_undefined_flag="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
 
+  else
+  ld_shlibs=no
+  fi
 
+      ;;
 
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
 
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
 
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
 
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
 
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
 
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='${wl}-E'
+      ;;
 
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+	hardcode_direct=yes
+	hardcode_direct_absolute=yes
+	export_dynamic_flag_spec='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
 
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
 
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler__b=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS -b"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler__b=yes
+       fi
+     else
+       lt_cv_prog_compiler__b=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
 
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
 
+if test x"$lt_cv_prog_compiler__b" = xyes; then
+    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
 
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
 
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  hardcode_direct_absolute=yes
+	  export_dynamic_flag_spec='${wl}-E'
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
 
-if test "$GCC" = yes; then
-  case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
-  esac
-  case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
-  esac
-  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
-  case $lt_search_path_spec in
-  *\;*)
-    # if the path contains ";" then we assume it to be the separator
-    # otherwise default to the standard path separator (i.e. ":") - it is
-    # assumed that no part of a normal pathname contains ";" but that should
-    # okay in the real world where ";" in dirpaths is itself problematic.
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
-    ;;
-  *)
-    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
-    ;;
-  esac
-  # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
-  lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
-  for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
-      test -d "$lt_sys_path" && \
-	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
-    fi
-  done
-  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
-  for (lt_i = NF; lt_i > 0; lt_i--) {
-    if ($lt_i != "" && $lt_i != ".") {
-      if ($lt_i == "..") {
-        lt_count++;
-      } else {
-        if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
-        } else {
-          lt_count--;
-        }
-      }
-    }
-  }
-  if (lt_foo != "") { lt_freq[lt_foo]++; }
-  if (lt_freq[lt_foo] == 1) { print lt_foo; }
-}'`
-  # AWK program above erroneously prepends '/' to C:/dos/paths
-  # for these hosts.
-  case $host_os in
-    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
-  esac
-  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
-  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
 fi
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+           LDFLAGS="$save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
 
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
 
-case $host_os in
-aix3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
 
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
+    *nto* | *qnx*)
+      ;;
 
-aix[4-9]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct=yes
+	hardcode_shlibpath_var=no
+	hardcode_direct_absolute=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	  export_dynamic_flag_spec='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     hardcode_libdir_flag_spec='-R$libdir'
+	     ;;
+	   *)
+	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
       else
-	can_build_shared=no
+	ld_shlibs=no
       fi
       ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
-  fi
-  ;;
 
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
 
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
 
-bsdi[45]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
 
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
 
-  case $GCC,$cc_basename in
-  yes,*)
-    # gcc
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs=yes
+      ;;
 
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
 
-      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
       ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
       ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
       ;;
-    esac
-    dynamic_linker='Win32 ld.exe'
-    ;;
 
-  *,cl*)
-    # Native MSVC
-    libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='${wl}-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
 
-    case $build_os in
-    mingw*)
-      sys_lib_search_path_spec=
-      lt_save_ifs=$IFS
-      IFS=';'
-      for lt_path in $LIB
-      do
-        IFS=$lt_save_ifs
-        # Let DOS variable expansion print the short 8.3 style file name.
-        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
-        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
-      done
-      IFS=$lt_save_ifs
-      # Convert to MSYS style.
-      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
-      ;;
-    cygwin*)
-      # Convert to unix form, then to dos form, then back to unix form
-      # but this time dos style (no spaces!) so that the unix form looks
-      # like /cygdrive/c/PROGRA~1:/cygdr...
-      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
-      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
-      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
       ;;
-    *)
-      sys_lib_search_path_spec="$LIB"
-      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
-        # It is most probably a Windows format PATH.
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='${wl}-z,text'
+      allow_undefined_flag='${wl}-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
-      # FIXME: find the short name or the path components, as spaces are
-      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
       ;;
     esac
 
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-    dynamic_linker='Win32 link.exe'
-    ;;
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
 
-  *)
-    # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    dynamic_linker='Win32 ld.exe'
-    ;;
-  esac
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test "$ld_shlibs" = no && can_build_shared=no
 
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+with_gnu_ld=$with_gnu_ld
 
-  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
 
-dgux*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
 
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[23].*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
-      ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
-      ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2.*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
 
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
 
-haiku*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
-  hardcode_into_libs=yes
-  ;;
 
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
-  postinstall_cmds='chmod 555 $lib'
-  # or fails outright, so override atomically:
-  install_override_mode=555
-  ;;
 
-interix[3-9]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
 
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux # correct to gnu/linux during the next big refactor
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
 
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
 
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
 
-  # Some binutils ld are patched to set DT_RUNPATH
-  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  lt_cv_shlibpath_overrides_runpath=no
-    save_LDFLAGS=$LDFLAGS
-    save_libdir=$libdir
-    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
-	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
-  lt_cv_shlibpath_overrides_runpath=yes
-fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-    LDFLAGS=$save_LDFLAGS
-    libdir=$save_libdir
 
-fi
 
-  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
 
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
 
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl
+	  pic_flag=$lt_prog_compiler_pic
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag
+	  allow_undefined_flag=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc=no
+	  else
+	    lt_cv_archive_cmds_need_lc=yes
+	  fi
+	  allow_undefined_flag=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
 
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+      ;;
+    esac
   fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
   ;;
+esac
 
-newsos6)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
 
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
 
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
 
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
 
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
 
-rdos*)
-  dynamic_linker=no
-  ;;
 
-solaris*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
 
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
-  fi
-  need_version=yes
-  ;;
 
-sysv4 | sysv4.3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
-      ;;
-  esac
-  ;;
 
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
 
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
-    esac
-  fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
-  ;;
 
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
 
-uts4*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
 
-*)
-  dynamic_linker=no
-  ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
 
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
 
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
 
 
 
@@ -14643,1068 +15105,817 @@ fi
 
 
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" ||
-   test -n "$runpath_var" ||
-   test "X$hardcode_automatic" = "Xyes" ; then
 
-  # We can hardcode non-existent directories.
-  if test "$hardcode_direct" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
-     test "$hardcode_minus_L" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
-$as_echo "$hardcode_action" >&6; }
 
-if test "$hardcode_action" = relink ||
-   test "$inherit_rpath" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
 
 
 
 
 
 
-  if test "x$enable_dlopen" != xyes; then
-  enable_dlopen=unknown
-  enable_dlopen_self=unknown
-  enable_dlopen_self_static=unknown
-else
-  lt_cv_dlopen=no
-  lt_cv_dlopen_libs=
 
-  case $host_os in
-  beos*)
-    lt_cv_dlopen="load_add_on"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
-    ;;
 
-  mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
-    lt_cv_dlopen_libs=
-    ;;
 
-  cygwin*)
-    lt_cv_dlopen="dlopen"
-    lt_cv_dlopen_libs=
-    ;;
 
-  darwin*)
-  # if libdl is installed we need to link against it
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if ${ac_cv_lib_dl_dlopen+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
 
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
 
-    lt_cv_dlopen="dyld"
-    lt_cv_dlopen_libs=
-    lt_cv_dlopen_self=yes
 
-fi
 
-    ;;
 
-  *)
-    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
-if test "x$ac_cv_func_shl_load" = xyes; then :
-  lt_cv_dlopen="shl_load"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
-$as_echo_n "checking for shl_load in -ldld... " >&6; }
-if ${ac_cv_lib_dld_shl_load+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
 
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char shl_load ();
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-return shl_load ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_shl_load=yes
-else
-  ac_cv_lib_dld_shl_load=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
-$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
-if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
-  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
-else
-  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
-if test "x$ac_cv_func_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if ${ac_cv_lib_dl_dlopen+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
 
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
-$as_echo_n "checking for dlopen in -lsvld... " >&6; }
-if ${ac_cv_lib_svld_dlopen+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsvld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_svld_dlopen=yes
-else
-  ac_cv_lib_svld_dlopen=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
-$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
-if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
-$as_echo_n "checking for dld_link in -ldld... " >&6; }
-if ${ac_cv_lib_dld_dld_link+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dld_link ();
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-return dld_link ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dld_dld_link=yes
-else
-  ac_cv_lib_dld_dld_link=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
-$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
-if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
-  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
-fi
 
 
-fi
-
 
-fi
 
 
-fi
 
 
-fi
 
 
-fi
 
-    ;;
-  esac
 
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
-    enable_dlopen=no
-  fi
 
-  case $lt_cv_dlopen in
-  dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
 
-    save_LDFLAGS="$LDFLAGS"
-    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
 
-    save_LIBS="$LIBS"
-    LIBS="$lt_cv_dlopen_libs $LIBS"
 
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
-$as_echo_n "checking whether a program can dlopen itself... " >&6; }
-if ${lt_cv_dlopen_self+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self=cross
-else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line $LINENO "configure"
-#include "confdefs.h"
 
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
 
-#include <stdio.h>
 
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
 
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
 
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-int fnord () __attribute__((visibility("default")));
-#endif
 
-int fnord () { return 42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
 
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
-  else
-    puts (dlerror ());
 
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
-    esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self=no
-  fi
-fi
-rm -fr conftest*
 
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
-$as_echo "$lt_cv_dlopen_self" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
 
-    if test "x$lt_cv_dlopen_self" = xyes; then
-      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
-$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
-if ${lt_cv_dlopen_self_static+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  	  if test "$cross_compiling" = yes; then :
-  lt_cv_dlopen_self_static=cross
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
 else
-  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-  lt_status=$lt_dlunknown
-  cat > conftest.$ac_ext <<_LT_EOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-#  define LT_DLGLOBAL		RTLD_GLOBAL
-#else
-#  ifdef DL_GLOBAL
-#    define LT_DLGLOBAL		DL_GLOBAL
-#  else
-#    define LT_DLGLOBAL		0
-#  endif
-#endif
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
 
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-   find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-#  ifdef RTLD_LAZY
-#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
-#  else
-#    ifdef DL_LAZY
-#      define LT_DLLAZY_OR_NOW		DL_LAZY
-#    else
-#      ifdef RTLD_NOW
-#        define LT_DLLAZY_OR_NOW	RTLD_NOW
-#      else
-#        ifdef DL_NOW
-#          define LT_DLLAZY_OR_NOW	DL_NOW
-#        else
-#          define LT_DLLAZY_OR_NOW	0
-#        endif
-#      endif
-#    endif
-#  endif
-#endif
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
 
-/* When -fvisbility=hidden is used, assume the code has been annotated
-   correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
-int fnord () __attribute__((visibility("default")));
-#endif
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
 
-int fnord () { return 42; }
-int main ()
-{
-  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-  int status = $lt_dlunknown;
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
 
-  if (self)
-    {
-      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
-      else
-        {
-	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
-          else puts (dlerror ());
-	}
-      /* dlclose (self); */
-    }
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
   else
-    puts (dlerror ());
-
-  return status;
-}
-_LT_EOF
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
-  (eval $ac_link) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
-    (./conftest; exit; ) >&5 2>/dev/null
-    lt_status=$?
-    case x$lt_status in
-      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
-      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
     esac
-  else :
-    # compilation failed
-    lt_cv_dlopen_self_static=no
-  fi
-fi
-rm -fr conftest*
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
-$as_echo "$lt_cv_dlopen_self_static" >&6; }
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
     fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
 
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
     ;;
   esac
+  ;;
 
-  case $lt_cv_dlopen_self in
-  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-  *) enable_dlopen_self=unknown ;;
-  esac
-
-  case $lt_cv_dlopen_self_static in
-  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-  *) enable_dlopen_self_static=unknown ;;
-  esac
-fi
-
-
-
-
-
-
-
-
-
-
-
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
 
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
 
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
 
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
 
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
 
-
-striplib=
-old_striplib=
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
-$as_echo_n "checking whether stripping libraries is possible... " >&6; }
-if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
-  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-# FIXME - insert some real tests, host_os isn't really good enough
-  case $host_os in
-  darwin*)
-    if test -n "$STRIP" ; then
-      striplib="$STRIP -x"
-      old_striplib="$STRIP -S"
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-    else
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    fi
-    ;;
-  *)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
     ;;
-  esac
-fi
-
-
-
-
-
-
 
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
 
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
 
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
 
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
 
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
 
-  # Report which library types will actually be built
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
-$as_echo_n "checking if libtool supports shared libraries... " >&6; }
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
-$as_echo "$can_build_shared" >&6; }
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
-$as_echo_n "checking whether to build shared libraries... " >&6; }
-  test "$can_build_shared" = "no" && enable_shared=no
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
 
-  # On AIX, shared libraries and static libraries use the same namespace, and
-  # are all built from PIC.
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
   case $host_os in
-  aix3*)
-    test "$enable_shared" = yes && enable_static=no
-    if test -n "$RANLIB"; then
-      archive_cmds="$archive_cmds~\$RANLIB \$lib"
-      postinstall_cmds='$RANLIB $lib'
-    fi
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
     ;;
-
-  aix[4-9]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
-    fi
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
     ;;
   esac
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
-$as_echo "$enable_shared" >&6; }
+  ;;
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
-$as_echo_n "checking whether to build static libraries... " >&6; }
-  # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
-$as_echo "$enable_static" >&6; }
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
 
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
 
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
 
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
 
-fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
 
-CC="$lt_save_CC"
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
 
-      if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
-  ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
-$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
-if test -z "$CXXCPP"; then
-  if ${ac_cv_prog_CXXCPP+:} false; then :
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-      # Double quotes because CXXCPP needs to be expanded
-    for CXXCPP in "$CXX -E" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
 
-else
-  # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
 
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
+  ;
+  return 0;
+}
 _ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-  break
-fi
-
-    done
-    ac_cv_prog_CXXCPP=$CXXCPP
-
-fi
-  CXXCPP=$ac_cv_prog_CXXCPP
-else
-  ac_cv_prog_CXXCPP=$CXXCPP
+if ac_fn_c_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
-$as_echo "$CXXCPP" >&6; }
-ac_preproc_ok=false
-for ac_cxx_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-
-else
-  # Broken: fails on valid input.
-continue
 fi
-rm -f conftest.err conftest.i conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
 
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_cxx_try_cpp "$LINENO"; then :
-  # Broken: success on invalid input.
-continue
-else
-  # Passes both tests.
-ac_preproc_ok=:
-break
 fi
-rm -f conftest.err conftest.i conftest.$ac_ext
 
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
 
-else
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
 
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
 
-else
-  _lt_caught_CXX_error=yes
-fi
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
 
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
 
-archive_cmds_need_lc_CXX=no
-allow_undefined_flag_CXX=
-always_export_symbols_CXX=no
-archive_expsym_cmds_CXX=
-compiler_needs_object_CXX=no
-export_dynamic_flag_spec_CXX=
-hardcode_direct_CXX=no
-hardcode_direct_absolute_CXX=no
-hardcode_libdir_flag_spec_CXX=
-hardcode_libdir_separator_CXX=
-hardcode_minus_L_CXX=no
-hardcode_shlibpath_var_CXX=unsupported
-hardcode_automatic_CXX=no
-inherit_rpath_CXX=no
-module_cmds_CXX=
-module_expsym_cmds_CXX=
-link_all_deplibs_CXX=unknown
-old_archive_cmds_CXX=$old_archive_cmds
-reload_flag_CXX=$reload_flag
-reload_cmds_CXX=$reload_cmds
-no_undefined_flag_CXX=
-whole_archive_flag_spec_CXX=
-enable_shared_with_static_runtimes_CXX=no
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
 
-# Source file extension for C++ test sources.
-ac_ext=cpp
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
 
-# Object file extension for compiled C++ test sources.
-objext=o
-objext_CXX=$objext
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
 
-# No sense in running all these tests if we already determined that
-# the CXX compiler isn't working.  Some variables (like enable_shared)
-# are currently assumed to apply to all compilers on this platform,
-# and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
-  # Code to be used in simple compile tests
-  lt_simple_compile_test_code="int some_variable = 0;"
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
 
-  # Code to be used in simple link tests
-  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
 
-  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
 
+rdos*)
+  dynamic_linker=no
+  ;;
 
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
 
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
 
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
 
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
 
-# If no C compiler was specified, use CC.
-LTCC=${LTCC-"$CC"}
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
 
-# If no C compiler flags were specified, use CFLAGS.
-LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
 
-# Allow CC to be a program name with arguments.
-compiler=$CC
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
 
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
 
-  # save warnings/boilerplate of simple test code
-  ac_outfile=conftest.$ac_objext
-echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_compiler_boilerplate=`cat conftest.err`
-$RM conftest*
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
 
-  ac_outfile=conftest.$ac_objext
-echo "$lt_simple_link_test_code" >conftest.$ac_ext
-eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-_lt_linker_boilerplate=`cat conftest.err`
-$RM -r conftest*
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
 
 
-  # Allow CC to be a program name with arguments.
-  lt_save_CC=$CC
-  lt_save_CFLAGS=$CFLAGS
-  lt_save_LD=$LD
-  lt_save_GCC=$GCC
-  GCC=$GXX
-  lt_save_with_gnu_ld=$with_gnu_ld
-  lt_save_path_LD=$lt_cv_path_LD
-  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
-    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
-  else
-    $as_unset lt_cv_prog_gnu_ld
-  fi
-  if test -n "${lt_cv_path_LDCXX+set}"; then
-    lt_cv_path_LD=$lt_cv_path_LDCXX
-  else
-    $as_unset lt_cv_path_LD
-  fi
-  test -z "${LDCXX+set}" || LD=$LDCXX
-  CC=${CXX-"c++"}
-  CFLAGS=$CXXFLAGS
-  compiler=$CC
-  compiler_CXX=$CC
-  for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
 
 
-  if test -n "$compiler"; then
-    # We don't want -fno-exception when compiling C++ code, so set the
-    # no_builtin_flag separately
-    if test "$GXX" = yes; then
-      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
-    else
-      lt_prog_compiler_no_builtin_flag_CXX=
-    fi
 
-    if test "$GXX" = yes; then
-      # Set up default GNU C++ configuration
 
 
 
-# Check whether --with-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
-else
-  with_gnu_ld=no
-fi
 
-ac_prog=ld
-if test "$GCC" = yes; then
-  # Check if gcc -print-prog-name=ld gives a path.
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
-$as_echo_n "checking for ld used by $CC... " >&6; }
-  case $host in
-  *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
-    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
-  *)
-    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
-  esac
-  case $ac_prog in
-    # Accept absolute paths.
-    [\\/]* | ?:[\\/]*)
-      re_direlt='/[^/][^/]*/\.\./'
-      # Canonicalize the pathname of ld
-      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
-      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
-	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
-      done
-      test -z "$LD" && LD="$ac_prog"
-      ;;
-  "")
-    # If it fails, then pretend we aren't using GCC.
-    ac_prog=ld
-    ;;
-  *)
-    # If it is relative, then search for the first ld in PATH.
-    with_gnu_ld=unknown
-    ;;
-  esac
-elif test "$with_gnu_ld" = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
-$as_echo_n "checking for GNU ld... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
-$as_echo_n "checking for non-GNU ld... " >&6; }
-fi
-if ${lt_cv_path_LD+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-  for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
-    test -z "$ac_dir" && ac_dir=.
-    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
-      # Check to see if the program is GNU ld.  I'd rather use --version,
-      # but apparently some variants of GNU ld only accept -v.
-      # Break only if it was the GNU/non-GNU ld that we prefer.
-      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
-      *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
-	;;
-      *)
-	test "$with_gnu_ld" != yes && break
-	;;
-      esac
-    fi
-  done
-  IFS="$lt_save_ifs"
-else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
 
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
-$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
-if ${lt_cv_prog_gnu_ld+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  # I'd rather use --version here, but apparently some GNU lds only accept -v.
-case `$LD -v 2>&1 </dev/null` in
-*GNU* | *'with BFD'*)
-  lt_cv_prog_gnu_ld=yes
-  ;;
-*)
-  lt_cv_prog_gnu_ld=no
-  ;;
-esac
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
-$as_echo "$lt_cv_prog_gnu_ld" >&6; }
-with_gnu_ld=$lt_cv_prog_gnu_ld
 
 
 
@@ -15712,161 +15923,168 @@ with_gnu_ld=$lt_cv_prog_gnu_ld
 
 
 
-      # Check if GNU C++ uses GNU ld as the underlying linker, since the
-      # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
 
-        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
-        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
 
-        # If archive_cmds runs LD, not CC, wlarc should be empty
-        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
-        #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
 
-        # ancient GNU ld didn't support --whole-archive et. al.
-        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
-	  $GREP 'no-whole-archive' > /dev/null; then
-          whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-        else
-          whole_archive_flag_spec_CXX=
-        fi
-      else
-        with_gnu_ld=no
-        wlarc=
 
-        # A generic and very simple default shared library creation
-        # command for GNU C++ for the case where it uses the native
-        # linker, instead of GNU ld.  If possible, this setting should
-        # overridden to take advantage of the native linker features on
-        # the platform it is being used on.
-        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-      fi
 
-      # Commands to make compiler produce verbose output that lists
-      # what "hidden" libraries, object files and flags are used when
-      # linking a shared library.
-      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
 
-    else
-      GXX=no
-      with_gnu_ld=no
-      wlarc=
-    fi
 
-    # PORTME: fill in a description of your system's C++ link characteristics
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
-    ld_shlibs_CXX=yes
-    case $host_os in
-      aix3*)
-        # FIXME: insert proper C++ library support
-        ld_shlibs_CXX=no
-        ;;
-      aix[4-9]*)
-        if test "$host_cpu" = ia64; then
-          # On IA64, the linker does run time linking by default, so we don't
-          # have to do anything special.
-          aix_use_runtimelinking=no
-          exp_sym_flag='-Bexport'
-          no_entry_flag=""
-        else
-          aix_use_runtimelinking=no
 
-          # Test if we are trying to use run time linking or normal
-          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
-          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-	    for ld_flag in $LDFLAGS; do
-	      case $ld_flag in
-	      *-brtl*)
-	        aix_use_runtimelinking=yes
-	        break
-	        ;;
-	      esac
-	    done
-	    ;;
-          esac
 
-          exp_sym_flag='-bexport'
-          no_entry_flag='-bnoentry'
-        fi
 
-        # When large executables or shared objects are built, AIX ld can
-        # have problems creating the table of contents.  If linking a library
-        # or program results in "error TOC overflow" add -mminimal-toc to
-        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
 
-        archive_cmds_CXX=''
-        hardcode_direct_CXX=yes
-        hardcode_direct_absolute_CXX=yes
-        hardcode_libdir_separator_CXX=':'
-        link_all_deplibs_CXX=yes
-        file_list_spec_CXX='${wl}-f,'
 
-        if test "$GXX" = yes; then
-          case $host_os in aix4.[012]|aix4.[012].*)
-          # We only want to do this on AIX 4.2 and lower, the check
-          # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	    # We have reworked collect2
-	    :
-	  else
-	    # We have old collect2
-	    hardcode_direct_CXX=unsupported
-	    # It fails to find uninstalled libraries when the uninstalled
-	    # path is not listed in the libpath.  Setting hardcode_minus_L
-	    # to unsupported forces relinking
-	    hardcode_minus_L_CXX=yes
-	    hardcode_libdir_flag_spec_CXX='-L$libdir'
-	    hardcode_libdir_separator_CXX=
-	  fi
-          esac
-          shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
-	  fi
-        else
-          # not using gcc
-          if test "$host_cpu" = ia64; then
-	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	  # chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-          else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
-	    else
-	      shared_flag='${wl}-bM:SRE'
-	    fi
-          fi
-        fi
 
-        export_dynamic_flag_spec_CXX='${wl}-bexpall'
-        # It seems that -bexpall does not export symbols beginning with
-        # underscore (_), so it is better to generate a list of symbols to
-	# export.
-        always_export_symbols_CXX=yes
-        if test "$aix_use_runtimelinking" = yes; then
-          # Warning - without using the other runtime loading flags (-brtl),
-          # -berok will link without error, but may produce a broken library.
-          allow_undefined_flag_CXX='-berok'
-          # Determine the default libpath from the value encoded in an empty
-          # executable.
-          if test "${lt_cv_aix_libpath+set}" = set; then
-  aix_libpath=$lt_cv_aix_libpath
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test "X$hardcode_automatic" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
 else
-  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test "$hardcode_action" = relink ||
+   test "$inherit_rpath" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+  if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
 #ifdef FC_DUMMY_MAIN
 #ifndef FC_DUMMY_MAIN_EQ_F77
 #  ifdef __cplusplus
@@ -15878,57 +16096,107 @@ else
 int
 main ()
 {
-
+return dlopen ();
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
-
-  lt_aix_libpath_sed='
-      /Import File Strings/,/^$/ {
-	  /^0/ {
-	      s/^0  *\([^ ]*\) *$/\1/
-	      p
-	  }
-      }'
-  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  # Check for a 64-bit object if we didn't find anything.
-  if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  fi
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-  if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
-  fi
-
+LIBS=$ac_check_lib_save_LIBS
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
 
-  aix_libpath=$lt_cv_aix_libpath__CXX
 fi
 
-          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+    ;;
 
-          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-        else
-          if test "$host_cpu" = ia64; then
-	    hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
-	    allow_undefined_flag_CXX="-z nodefs"
-	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-          else
-	    # Determine the default libpath from the value encoded in an
-	    # empty executable.
-	    if test "${lt_cv_aix_libpath+set}" = set; then
-  aix_libpath=$lt_cv_aix_libpath
+  *)
+    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load"
 else
-  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if ${ac_cv_lib_dld_shl_load+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_shl_load=yes
+else
+  ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
 #ifdef FC_DUMMY_MAIN
 #ifndef FC_DUMMY_MAIN_EQ_F77
 #  ifdef __cplusplus
@@ -15940,159 +16208,1246 @@ else
 int
 main ()
 {
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if ${ac_cv_lib_svld_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+return dlopen ();
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_svld_dlopen=yes
+else
+  ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if ${ac_cv_lib_dld_dld_link+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-  lt_aix_libpath_sed='
-      /Import File Strings/,/^$/ {
-	  /^0/ {
-	      s/^0  *\([^ ]*\) *$/\1/
-	      p
-	  }
-      }'
-  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  # Check for a 64-bit object if we didn't find anything.
-  if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  fi
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_dld_link=yes
+else
+  ac_cv_lib_dld_dld_link=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-  if test -z "$lt_cv_aix_libpath__CXX"; then
-    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
-  fi
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+fi
+
 
 fi
 
-  aix_libpath=$lt_cv_aix_libpath__CXX
+
 fi
 
-	    hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
-	    # Warning - without using the other run time loading flags,
-	    # -berok will link without error, but may produce a broken library.
-	    no_undefined_flag_CXX=' ${wl}-bernotok'
-	    allow_undefined_flag_CXX=' ${wl}-berok'
-	    if test "$with_gnu_ld" = yes; then
-	      # We only use this code for GNU lds that support --whole-archive.
-	      whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	    else
-	      # Exported symbols can be pulled into shared objects from archives
-	      whole_archive_flag_spec_CXX='$convenience'
-	    fi
-	    archive_cmds_need_lc_CXX=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-          fi
-        fi
-        ;;
 
-      beos*)
-	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	  allow_undefined_flag_CXX=unsupported
-	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	  # support --undefined.  This deserves some investigation.  FIXME
-	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	else
-	  ld_shlibs_CXX=no
-	fi
-	;;
+fi
 
-      chorus*)
-        case $cc_basename in
-          *)
-	  # FIXME: insert proper C++ library support
-	  ld_shlibs_CXX=no
-	  ;;
-        esac
-        ;;
 
-      cygwin* | mingw* | pw32* | cegcc*)
-	case $GXX,$cc_basename in
-	,cl* | no,cl*)
-	  # Native MSVC
-	  # hardcode_libdir_flag_spec is actually meaningless, as there is
-	  # no search path for DLLs.
-	  hardcode_libdir_flag_spec_CXX=' '
-	  allow_undefined_flag_CXX=unsupported
-	  always_export_symbols_CXX=yes
-	  file_list_spec_CXX='@'
-	  # Tell ltmain to make .lib files, not .a files.
-	  libext=lib
-	  # Tell ltmain to make .dll files, not .so files.
-	  shrext_cmds=".dll"
-	  # FIXME: Setting linknames here is a bad hack.
-	  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	  archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	    else
-	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	    fi~
-	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	    linknames='
-	  # The linker will not automatically build a static lib if we build a DLL.
-	  # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
-	  enable_shared_with_static_runtimes_CXX=yes
-	  # Don't use ranlib
-	  old_postinstall_cmds_CXX='chmod 644 $oldlib'
-	  postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
-	    lt_tool_outputfile="@TOOL_OUTPUT@"~
-	    case $lt_outputfile in
-	      *.exe|*.EXE) ;;
-	      *)
-		lt_outputfile="$lt_outputfile.exe"
-		lt_tool_outputfile="$lt_tool_outputfile.exe"
-		;;
-	    esac~
-	    func_to_tool_file "$lt_outputfile"~
-	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	      $RM "$lt_outputfile.manifest";
-	    fi'
-	  ;;
-	*)
-	  # g++
-	  # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
-	  # as there is no search path for DLLs.
-	  hardcode_libdir_flag_spec_CXX='-L$libdir'
-	  export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'
-	  allow_undefined_flag_CXX=unsupported
-	  always_export_symbols_CXX=no
-	  enable_shared_with_static_runtimes_CXX=yes
+fi
 
-	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	    # If the export-symbols file already is a .def file (1st line
-	    # is EXPORTS), use it as is; otherwise, prepend...
-	    archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      cp $export_symbols $output_objdir/$soname.def;
-	    else
-	      echo EXPORTS > $output_objdir/$soname.def;
-	      cat $export_symbols >> $output_objdir/$soname.def;
-	    fi~
-	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	  else
-	    ld_shlibs_CXX=no
-	  fi
-	  ;;
-	esac
-	;;
-      darwin* | rhapsody*)
 
+fi
 
-  archive_cmds_need_lc_CXX=no
-  hardcode_direct_CXX=no
-  hardcode_automatic_CXX=yes
-  hardcode_shlibpath_var_CXX=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    ;;
+  esac
 
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
   else
-    whole_archive_flag_spec_CXX=''
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self_static+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+  # Report which library types will actually be built
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[4-9]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+CC="$lt_save_CC"
+
+      if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+  if ${ac_cv_prog_CXXCPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+$as_echo "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+else
+  _lt_caught_CXX_error=yes
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+compiler_needs_object_CXX=no
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_direct_absolute_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+inherit_rpath_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+reload_flag_CXX=$reload_flag
+reload_cmds_CXX=$reload_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+  # save warnings/boilerplate of simple test code
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  compiler_CXX=$CC
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+    else
+      lt_prog_compiler_no_builtin_flag_CXX=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          whole_archive_flag_spec_CXX=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+    ld_shlibs_CXX=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+      aix[4-9]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        archive_cmds_CXX=''
+        hardcode_direct_CXX=yes
+        hardcode_direct_absolute_CXX=yes
+        hardcode_libdir_separator_CXX=':'
+        link_all_deplibs_CXX=yes
+        file_list_spec_CXX='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[012]|aix4.[012].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    hardcode_direct_CXX=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    hardcode_minus_L_CXX=yes
+	    hardcode_libdir_flag_spec_CXX='-L$libdir'
+	    hardcode_libdir_separator_CXX=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        export_dynamic_flag_spec_CXX='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        always_export_symbols_CXX=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          allow_undefined_flag_CXX='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+	    allow_undefined_flag_CXX="-z nodefs"
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+	    hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    no_undefined_flag_CXX=' ${wl}-bernotok'
+	    allow_undefined_flag_CXX=' ${wl}-berok'
+	    if test "$with_gnu_ld" = yes; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      whole_archive_flag_spec_CXX='$convenience'
+	    fi
+	    archive_cmds_need_lc_CXX=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  allow_undefined_flag_CXX=unsupported
+	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  ld_shlibs_CXX=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  ld_shlibs_CXX=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  hardcode_libdir_flag_spec_CXX=' '
+	  allow_undefined_flag_CXX=unsupported
+	  always_export_symbols_CXX=yes
+	  file_list_spec_CXX='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=".dll"
+	  # FIXME: Setting linknames here is a bad hack.
+	  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	  archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	    else
+	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	    fi~
+	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	    linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
+	  enable_shared_with_static_runtimes_CXX=yes
+	  # Don't use ranlib
+	  old_postinstall_cmds_CXX='chmod 644 $oldlib'
+	  postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
+	    lt_tool_outputfile="@TOOL_OUTPUT@"~
+	    case $lt_outputfile in
+	      *.exe|*.EXE) ;;
+	      *)
+		lt_outputfile="$lt_outputfile.exe"
+		lt_tool_outputfile="$lt_tool_outputfile.exe"
+		;;
+	    esac~
+	    func_to_tool_file "$lt_outputfile"~
+	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	      $RM "$lt_outputfile.manifest";
+	    fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  hardcode_libdir_flag_spec_CXX='-L$libdir'
+	  export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'
+	  allow_undefined_flag_CXX=unsupported
+	  always_export_symbols_CXX=no
+	  enable_shared_with_static_runtimes_CXX=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file (1st line
+	    # is EXPORTS), use it as is; otherwise, prepend...
+	    archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      cp $export_symbols $output_objdir/$soname.def;
+	    else
+	      echo EXPORTS > $output_objdir/$soname.def;
+	      cat $export_symbols >> $output_objdir/$soname.def;
+	    fi~
+	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    ld_shlibs_CXX=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc_CXX=no
+  hardcode_direct_CXX=no
+  hardcode_automatic_CXX=yes
+  hardcode_shlibpath_var_CXX=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec_CXX=''
   fi
   link_all_deplibs_CXX=yes
   allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
@@ -16151,9 +17506,6 @@ fi
         ld_shlibs_CXX=yes
         ;;
 
-      gnu*)
-        ;;
-
       haiku*)
         archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
         link_all_deplibs_CXX=yes
@@ -16315,7 +17667,7 @@ fi
         inherit_rpath_CXX=yes
         ;;
 
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
         case $cc_basename in
           KCC*)
 	    # Kuck and Associates, Inc. (KAI) C++ Compiler
@@ -17175,7 +18527,7 @@ lt_prog_compiler_static_CXX=
 	    ;;
 	esac
 	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
 	case $cc_basename in
 	  KCC*)
 	    # KAI C++ Compiler
@@ -17239,7 +18591,7 @@ lt_prog_compiler_static_CXX=
 	    ;;
 	esac
 	;;
-      netbsd*)
+      netbsd* | netbsdelf*-gnu)
 	;;
       *qnx* | *nto*)
         # QNX uses GNU C++, but need to define -shared option too, otherwise
@@ -17610,6 +18962,9 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
       ;;
     esac
     ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs_CXX=no
+    ;;
   *)
     export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
     ;;
@@ -18044,17 +19399,6 @@ freebsd* | dragonfly*)
   esac
   ;;
 
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
 haiku*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
@@ -18171,7 +19515,7 @@ linux*oldld* | linux*aout* | linux*coff*)
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
@@ -18243,6 +19587,18 @@ fi
   dynamic_linker='GNU/Linux ld.so'
   ;;
 
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
 netbsd*)
   version_type=sunos
   need_lib_prefix=no
@@ -18998,7 +20354,7 @@ lt_prog_compiler_static_FC=
       lt_prog_compiler_static_FC='-non_shared'
       ;;
 
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
       # old Intel for x86_64 which still supported -KPIC.
       ecc*)
@@ -19461,6 +20817,9 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   openbsd*)
     with_gnu_ld=no
     ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs_FC=no
+    ;;
   esac
 
   ld_shlibs_FC=yes
@@ -19484,506 +20843,54 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
 	    ;;
 	esac
 	;;
-      *)
-	lt_use_gnu_ld_interface=yes
-	;;
-    esac
-  fi
-
-  if test "$lt_use_gnu_ld_interface" = yes; then
-    # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
-
-    # Set some defaults for GNU ld with shared library support. These
-    # are reset later if shared libraries are not supported. Putting them
-    # here allows them to be overridden if necessary.
-    runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
-    export_dynamic_flag_spec_FC='${wl}--export-dynamic'
-    # ancient GNU ld didn't support --whole-archive et. al.
-    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec_FC="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
-    else
-      whole_archive_flag_spec_FC=
-    fi
-    supports_anon_versioning=no
-    case `$LD -v 2>&1` in
-      *GNU\ gold*) supports_anon_versioning=yes ;;
-      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
-      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
-      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
-      *\ 2.11.*) ;; # other 2.11 versions
-      *) supports_anon_versioning=yes ;;
-    esac
-
-    # See if GNU ld supports shared libraries.
-    case $host_os in
-    aix[3-9]*)
-      # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-	ld_shlibs_FC=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.19, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support.  If you
-*** really care for shared libraries, you may want to install binutils
-*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
-*** You will then need to restart the configuration process.
-
-_LT_EOF
-      fi
-      ;;
-
-    amigaos*)
-      case $host_cpu in
-      powerpc)
-            # see comment about AmigaOS4 .so support
-            archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-            archive_expsym_cmds_FC=''
-        ;;
-      m68k)
-            archive_cmds_FC='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
-            hardcode_libdir_flag_spec_FC='-L$libdir'
-            hardcode_minus_L_FC=yes
-        ;;
-      esac
-      ;;
-
-    beos*)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	allow_undefined_flag_FC=unsupported
-	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
-	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds_FC='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      else
-	ld_shlibs_FC=no
-      fi
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # _LT_TAGVAR(hardcode_libdir_flag_spec, FC) is actually meaningless,
-      # as there is no search path for DLLs.
-      hardcode_libdir_flag_spec_FC='-L$libdir'
-      export_dynamic_flag_spec_FC='${wl}--export-all-symbols'
-      allow_undefined_flag_FC=unsupported
-      always_export_symbols_FC=no
-      enable_shared_with_static_runtimes_FC=yes
-      export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
-      exclude_expsyms_FC='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
-
-      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds_FC='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-      else
-	ld_shlibs_FC=no
-      fi
-      ;;
-
-    haiku*)
-      archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-      link_all_deplibs_FC=yes
-      ;;
-
-    interix[3-9]*)
-      hardcode_direct_FC=no
-      hardcode_shlibpath_var_FC=no
-      hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec_FC='${wl}-E'
-      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
-      # Instead, shared libraries are loaded at an image base (0x10000000 by
-      # default) and relocated if they conflict, which is a slow very memory
-      # consuming and fragmenting process.  To avoid this, we pick a random,
-      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
-      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds_FC='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      ;;
-
-    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
-      tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
-	case $cc_basename in
-	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
-	esac
-      fi
-      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
-      then
-	tmp_addflag=' $pic_flag'
-	tmp_sharedflag='-shared'
-	case $cc_basename,$host_cpu in
-        pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag'
-	  ;;
-	pgf77* | pgf90* | pgf95* | pgfortran*)
-					# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
-	ifc* | ifort*)			# Intel Fortran compiler
-	  tmp_addflag=' -nofor_main' ;;
-	lf95*)				# Lahey Fortran 8.1
-	  whole_archive_flag_spec_FC=
-	  tmp_sharedflag='--shared' ;;
-	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
-	  tmp_sharedflag='-qmkshrobj'
-	  tmp_addflag= ;;
-	nvcc*)	# Cuda Compiler Driver 2.2
-	  whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object_FC=yes
-	  ;;
-	esac
-	case `$CC -V 2>&1 | sed 5q` in
-	*Sun\ C*)			# Sun C 5.9
-	  whole_archive_flag_spec_FC='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
-	  compiler_needs_object_FC=yes
-	  tmp_sharedflag='-G' ;;
-	*Sun\ F*)			# Sun Fortran 8.3
-	  tmp_sharedflag='-G' ;;
-	esac
-	archive_cmds_FC='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-
-        if test "x$supports_anon_versioning" = xyes; then
-          archive_expsym_cmds_FC='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
-        fi
-
-	case $cc_basename in
-	xlf* | bgf* | bgxlf* | mpixlf*)
-	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
-	  whole_archive_flag_spec_FC='--whole-archive$convenience --no-whole-archive'
-	  hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
-	  archive_cmds_FC='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
-	    archive_expsym_cmds_FC='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
-	  fi
-	  ;;
-	esac
-      else
-        ld_shlibs_FC=no
-      fi
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds_FC='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
-	wlarc=
-      else
-	archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      fi
-      ;;
-
-    solaris*)
-      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
-	ld_shlibs_FC=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs_FC=no
-      fi
-      ;;
-
-    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
-      case `$LD -v 2>&1` in
-        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
-	ld_shlibs_FC=no
-	cat <<_LT_EOF 1>&2
-
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
-*** reliably create shared libraries on SCO systems.  Therefore, libtool
-*** is disabling shared libraries support.  We urge you to upgrade GNU
-*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-_LT_EOF
-	;;
-	*)
-	  # For security reasons, it is highly recommended that you always
-	  # use absolute paths for naming shared libraries, and exclude the
-	  # DT_RUNPATH tag from executables and libraries.  But doing so
-	  # requires that you compile everything twice, which is a pain.
-	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
-	    archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-	  else
-	    ld_shlibs_FC=no
-	  fi
-	;;
-      esac
-      ;;
-
-    sunos4*)
-      archive_cmds_FC='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      wlarc=
-      hardcode_direct_FC=yes
-      hardcode_shlibpath_var_FC=no
-      ;;
-
-    *)
-      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
-      else
-	ld_shlibs_FC=no
-      fi
-      ;;
-    esac
-
-    if test "$ld_shlibs_FC" = no; then
-      runpath_var=
-      hardcode_libdir_flag_spec_FC=
-      export_dynamic_flag_spec_FC=
-      whole_archive_flag_spec_FC=
-    fi
-  else
-    # PORTME fill in a description of your system's linker (not GNU ld)
-    case $host_os in
-    aix3*)
-      allow_undefined_flag_FC=unsupported
-      always_export_symbols_FC=yes
-      archive_expsym_cmds_FC='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
-      # Note: this linker hardcodes the directories in LIBPATH if there
-      # are no directories specified by -L.
-      hardcode_minus_L_FC=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
-	# Neither direct hardcoding nor static linking is supported with a
-	# broken collect2.
-	hardcode_direct_FC=unsupported
-      fi
-      ;;
-
-    aix[4-9]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
-	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
-	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  export_symbols_cmds_FC='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	else
-	  export_symbols_cmds_FC='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
-	fi
-	aix_use_runtimelinking=no
-
-	# Test if we are trying to use run time linking or normal
-	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
-	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
-	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
-	    aix_use_runtimelinking=yes
-	    break
-	  fi
-	  done
-	  ;;
-	esac
-
-	exp_sym_flag='-bexport'
-	no_entry_flag='-bnoentry'
-      fi
-
-      # When large executables or shared objects are built, AIX ld can
-      # have problems creating the table of contents.  If linking a library
-      # or program results in "error TOC overflow" add -mminimal-toc to
-      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
-      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
-      archive_cmds_FC=''
-      hardcode_direct_FC=yes
-      hardcode_direct_absolute_FC=yes
-      hardcode_libdir_separator_FC=':'
-      link_all_deplibs_FC=yes
-      file_list_spec_FC='${wl}-f,'
-
-      if test "$GCC" = yes; then
-	case $host_os in aix4.[012]|aix4.[012].*)
-	# We only want to do this on AIX 4.2 and lower, the check
-	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
-	  if test -f "$collect2name" &&
-	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
-	  then
-	  # We have reworked collect2
-	  :
-	  else
-	  # We have old collect2
-	  hardcode_direct_FC=unsupported
-	  # It fails to find uninstalled libraries when the uninstalled
-	  # path is not listed in the libpath.  Setting hardcode_minus_L
-	  # to unsupported forces relinking
-	  hardcode_minus_L_FC=yes
-	  hardcode_libdir_flag_spec_FC='-L$libdir'
-	  hardcode_libdir_separator_FC=
-	  fi
-	  ;;
-	esac
-	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
-	fi
-      else
-	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
-	  else
-	    shared_flag='${wl}-bM:SRE'
-	  fi
-	fi
-      fi
-
-      export_dynamic_flag_spec_FC='${wl}-bexpall'
-      # It seems that -bexpall does not export symbols beginning with
-      # underscore (_), so it is better to generate a list of symbols to export.
-      always_export_symbols_FC=yes
-      if test "$aix_use_runtimelinking" = yes; then
-	# Warning - without using the other runtime loading flags (-brtl),
-	# -berok will link without error, but may produce a broken library.
-	allow_undefined_flag_FC='-berok'
-        # Determine the default libpath from the value encoded in an
-        # empty executable.
-        if test "${lt_cv_aix_libpath+set}" = set; then
-  aix_libpath=$lt_cv_aix_libpath
-else
-  if ${lt_cv_aix_libpath__FC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat > conftest.$ac_ext <<_ACEOF
-      program main
-
-      end
-_ACEOF
-if ac_fn_fc_try_link "$LINENO"; then :
-
-  lt_aix_libpath_sed='
-      /Import File Strings/,/^$/ {
-	  /^0/ {
-	      s/^0  *\([^ ]*\) *$/\1/
-	      p
-	  }
-      }'
-  lt_cv_aix_libpath__FC=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  # Check for a 64-bit object if we didn't find anything.
-  if test -z "$lt_cv_aix_libpath__FC"; then
-    lt_cv_aix_libpath__FC=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  if test -z "$lt_cv_aix_libpath__FC"; then
-    lt_cv_aix_libpath__FC="/usr/lib:/lib"
-  fi
-
-fi
-
-  aix_libpath=$lt_cv_aix_libpath__FC
-fi
-
-        hardcode_libdir_flag_spec_FC='${wl}-blibpath:$libdir:'"$aix_libpath"
-        archive_expsym_cmds_FC='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
-      else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec_FC='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag_FC="-z nodefs"
-	  archive_expsym_cmds_FC="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
-	 # Determine the default libpath from the value encoded in an
-	 # empty executable.
-	 if test "${lt_cv_aix_libpath+set}" = set; then
-  aix_libpath=$lt_cv_aix_libpath
-else
-  if ${lt_cv_aix_libpath__FC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat > conftest.$ac_ext <<_ACEOF
-      program main
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
 
-      end
-_ACEOF
-if ac_fn_fc_try_link "$LINENO"; then :
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
 
-  lt_aix_libpath_sed='
-      /Import File Strings/,/^$/ {
-	  /^0/ {
-	      s/^0  *\([^ ]*\) *$/\1/
-	      p
-	  }
-      }'
-  lt_cv_aix_libpath__FC=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  # Check for a 64-bit object if we didn't find anything.
-  if test -z "$lt_cv_aix_libpath__FC"; then
-    lt_cv_aix_libpath__FC=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-  fi
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-  if test -z "$lt_cv_aix_libpath__FC"; then
-    lt_cv_aix_libpath__FC="/usr/lib:/lib"
-  fi
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
+    export_dynamic_flag_spec_FC='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec_FC="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec_FC=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
 
-fi
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs_FC=no
+	cat <<_LT_EOF 1>&2
 
-  aix_libpath=$lt_cv_aix_libpath__FC
-fi
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
 
-	 hardcode_libdir_flag_spec_FC='${wl}-blibpath:$libdir:'"$aix_libpath"
-	  # Warning - without using the other run time loading flags,
-	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag_FC=' ${wl}-bernotok'
-	  allow_undefined_flag_FC=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
-	    # We only use this code for GNU lds that support --whole-archive.
-	    whole_archive_flag_spec_FC='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-	  else
-	    # Exported symbols can be pulled into shared objects from archives
-	    whole_archive_flag_spec_FC='$convenience'
-	  fi
-	  archive_cmds_need_lc_FC=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds_FC="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
+_LT_EOF
       fi
       ;;
 
@@ -20002,1326 +20909,1046 @@ fi
       esac
       ;;
 
-    bsdi[45]*)
-      export_dynamic_flag_spec_FC=-rdynamic
-      ;;
-
-    cygwin* | mingw* | pw32* | cegcc*)
-      # When not using gcc, we currently assume that we are using
-      # Microsoft Visual C++.
-      # hardcode_libdir_flag_spec is actually meaningless, as there is
-      # no search path for DLLs.
-      case $cc_basename in
-      cl*)
-	# Native MSVC
-	hardcode_libdir_flag_spec_FC=' '
-	allow_undefined_flag_FC=unsupported
-	always_export_symbols_FC=yes
-	file_list_spec_FC='@'
-	# Tell ltmain to make .lib files, not .a files.
-	libext=lib
-	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
-	# FIXME: Setting linknames here is a bad hack.
-	archive_cmds_FC='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	archive_expsym_cmds_FC='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	  else
-	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	  fi~
-	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	  linknames='
-	# The linker will not automatically build a static lib if we build a DLL.
-	# _LT_TAGVAR(old_archive_from_new_cmds, FC)='true'
-	enable_shared_with_static_runtimes_FC=yes
-	exclude_expsyms_FC='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
-	export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
-	# Don't use ranlib
-	old_postinstall_cmds_FC='chmod 644 $oldlib'
-	postlink_cmds_FC='lt_outputfile="@OUTPUT@"~
-	  lt_tool_outputfile="@TOOL_OUTPUT@"~
-	  case $lt_outputfile in
-	    *.exe|*.EXE) ;;
-	    *)
-	      lt_outputfile="$lt_outputfile.exe"
-	      lt_tool_outputfile="$lt_tool_outputfile.exe"
-	      ;;
-	  esac~
-	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	    $RM "$lt_outputfile.manifest";
-	  fi'
-	;;
-      *)
-	# Assume MSVC wrapper
-	hardcode_libdir_flag_spec_FC=' '
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
 	allow_undefined_flag_FC=unsupported
-	# Tell ltmain to make .lib files, not .a files.
-	libext=lib
-	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
-	# FIXME: Setting linknames here is a bad hack.
-	archive_cmds_FC='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
-	# The linker will automatically build a .lib file if we build a DLL.
-	old_archive_from_new_cmds_FC='true'
-	# FIXME: Should let the user specify the lib program.
-	old_archive_cmds_FC='lib -OUT:$oldlib$oldobjs$old_deplibs'
-	enable_shared_with_static_runtimes_FC=yes
-	;;
-      esac
-      ;;
-
-    darwin* | rhapsody*)
-
-
-  archive_cmds_need_lc_FC=no
-  hardcode_direct_FC=no
-  hardcode_automatic_FC=yes
-  hardcode_shlibpath_var_FC=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec_FC='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
-    compiler_needs_object_FC=yes
-  else
-    whole_archive_flag_spec_FC=''
-  fi
-  link_all_deplibs_FC=yes
-  allow_undefined_flag_FC="$_lt_dar_allow_undefined"
-  case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
-     *) _lt_dar_can_shared=$GCC ;;
-  esac
-  if test "$_lt_dar_can_shared" = "yes"; then
-    output_verbose_link_cmd=func_echo_all
-    archive_cmds_FC="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds_FC="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds_FC="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds_FC="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-
-  else
-  ld_shlibs_FC=no
-  fi
-
-      ;;
-
-    dgux*)
-      archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec_FC='-L$libdir'
-      hardcode_shlibpath_var_FC=no
-      ;;
-
-    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
-    # support.  Future versions do this automatically, but an explicit c++rt0.o
-    # does not break anything, and helps significantly (at the cost of a little
-    # extra space).
-    freebsd2.2*)
-      archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
-      hardcode_libdir_flag_spec_FC='-R$libdir'
-      hardcode_direct_FC=yes
-      hardcode_shlibpath_var_FC=no
-      ;;
-
-    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
-    freebsd2.*)
-      archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct_FC=yes
-      hardcode_minus_L_FC=yes
-      hardcode_shlibpath_var_FC=no
-      ;;
-
-    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
-    freebsd* | dragonfly*)
-      archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-      hardcode_libdir_flag_spec_FC='-R$libdir'
-      hardcode_direct_FC=yes
-      hardcode_shlibpath_var_FC=no
-      ;;
-
-    hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds_FC='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      else
-	archive_cmds_FC='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
-      fi
-      hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir'
-      hardcode_libdir_separator_FC=:
-      hardcode_direct_FC=yes
-
-      # hardcode_minus_L: Not really in the search PATH,
-      # but as the default location of the library.
-      hardcode_minus_L_FC=yes
-      export_dynamic_flag_spec_FC='${wl}-E'
-      ;;
-
-    hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_FC='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator_FC=:
-	hardcode_direct_FC=yes
-	hardcode_direct_absolute_FC=yes
-	export_dynamic_flag_spec_FC='${wl}-E'
-	# hardcode_minus_L: Not really in the search PATH,
-	# but as the default location of the library.
-	hardcode_minus_L_FC=yes
-      fi
-      ;;
-
-    hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds_FC='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	  archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      else
-	case $host_cpu in
-	hppa*64*)
-	  archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	ia64*)
-	  archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	*)
-	archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
-	esac
-      fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir'
-	hardcode_libdir_separator_FC=:
-
-	case $host_cpu in
-	hppa*64*|ia64*)
-	  hardcode_direct_FC=no
-	  hardcode_shlibpath_var_FC=no
-	  ;;
-	*)
-	  hardcode_direct_FC=yes
-	  hardcode_direct_absolute_FC=yes
-	  export_dynamic_flag_spec_FC='${wl}-E'
-
-	  # hardcode_minus_L: Not really in the search PATH,
-	  # but as the default location of the library.
-	  hardcode_minus_L_FC=yes
-	  ;;
-	esac
-      fi
-      ;;
-
-    irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	# Try to use the -exported_symbol ld option, if it does not
-	# work, assume that -exports_file does not work either and
-	# implicitly export all symbols.
-	# This should be the same for all languages, so no per-tag cache variable.
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
-$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
-if ${lt_cv_irix_exported_symbol+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  save_LDFLAGS="$LDFLAGS"
-	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
-	   cat > conftest.$ac_ext <<_ACEOF
-
-      subroutine foo
-      end
-_ACEOF
-if ac_fn_fc_try_link "$LINENO"; then :
-  lt_cv_irix_exported_symbol=yes
-else
-  lt_cv_irix_exported_symbol=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-           LDFLAGS="$save_LDFLAGS"
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
-$as_echo "$lt_cv_irix_exported_symbol" >&6; }
-	if test "$lt_cv_irix_exported_symbol" = yes; then
-          archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
-	fi
-      else
-	archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
-      fi
-      archive_cmds_need_lc_FC='no'
-      hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator_FC=:
-      inherit_rpath_FC=yes
-      link_all_deplibs_FC=yes
-      ;;
-
-    netbsd*)
-      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-	archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds_FC='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
       else
-	archive_cmds_FC='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+	ld_shlibs_FC=no
       fi
-      hardcode_libdir_flag_spec_FC='-R$libdir'
-      hardcode_direct_FC=yes
-      hardcode_shlibpath_var_FC=no
-      ;;
-
-    newsos6)
-      archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct_FC=yes
-      hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator_FC=:
-      hardcode_shlibpath_var_FC=no
       ;;
 
-    *nto* | *qnx*)
-      ;;
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, FC) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec_FC='-L$libdir'
+      export_dynamic_flag_spec_FC='${wl}--export-all-symbols'
+      allow_undefined_flag_FC=unsupported
+      always_export_symbols_FC=no
+      enable_shared_with_static_runtimes_FC=yes
+      export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms_FC='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
 
-    openbsd*)
-      if test -f /usr/libexec/ld.so; then
-	hardcode_direct_FC=yes
-	hardcode_shlibpath_var_FC=no
-	hardcode_direct_absolute_FC=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	  archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir'
-	  export_dynamic_flag_spec_FC='${wl}-E'
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds_FC='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
 	else
-	  case $host_os in
-	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	     archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     hardcode_libdir_flag_spec_FC='-R$libdir'
-	     ;;
-	   *)
-	     archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir'
-	     ;;
-	  esac
-	fi
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       else
 	ld_shlibs_FC=no
       fi
       ;;
 
-    os2*)
-      hardcode_libdir_flag_spec_FC='-L$libdir'
-      hardcode_minus_L_FC=yes
-      allow_undefined_flag_FC=unsupported
-      archive_cmds_FC='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_from_new_cmds_FC='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+    haiku*)
+      archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      link_all_deplibs_FC=yes
       ;;
 
-    osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag_FC=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-      else
-	allow_undefined_flag_FC=' -expect_unresolved \*'
-	archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-      fi
-      archive_cmds_need_lc_FC='no'
-      hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
-      hardcode_libdir_separator_FC=:
+    interix[3-9]*)
+      hardcode_direct_FC=no
+      hardcode_shlibpath_var_FC=no
+      hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec_FC='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds_FC='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       ;;
 
-    osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag_FC=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds_FC='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
-      else
-	allow_undefined_flag_FC=' -expect_unresolved \*'
-	archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds_FC='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
-
-	# Both c and cxx compiler support -rpath directly
-	hardcode_libdir_flag_spec_FC='-rpath $libdir'
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
       fi
-      archive_cmds_need_lc_FC='no'
-      hardcode_libdir_separator_FC=:
-      ;;
-
-    solaris*)
-      no_undefined_flag_FC=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds_FC='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
-      else
-	case `$CC -V 2>&1` in
-	*"Compilers 5.0"*)
-	  wlarc=''
-	  archive_cmds_FC='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
 	  ;;
-	*)
-	  wlarc='${wl}'
-	  archive_cmds_FC='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec_FC=
+	  tmp_sharedflag='--shared' ;;
+	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  whole_archive_flag_spec_FC='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object_FC=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec_FC='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object_FC=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	archive_cmds_FC='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          archive_expsym_cmds_FC='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec_FC='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
+	  archive_cmds_FC='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    archive_expsym_cmds_FC='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
 	  ;;
 	esac
+      else
+        ld_shlibs_FC=no
       fi
-      hardcode_libdir_flag_spec_FC='-R$libdir'
-      hardcode_shlibpath_var_FC=no
-      case $host_os in
-      solaris2.[0-5] | solaris2.[0-5].*) ;;
-      *)
-	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
-	# but is careful enough not to reorder.
-	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  whole_archive_flag_spec_FC='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
-	else
-	  whole_archive_flag_spec_FC='-z allextract$convenience -z defaultextract'
-	fi
-	;;
-      esac
-      link_all_deplibs_FC=yes
       ;;
 
-    sunos4*)
-      if test "x$host_vendor" = xsequent; then
-	# Use $CC to link under sequent, because it throws in some extra .o
-	# files that make .init and .fini sections work.
-	archive_cmds_FC='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds_FC='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
       else
-	archive_cmds_FC='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+	archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
       fi
-      hardcode_libdir_flag_spec_FC='-L$libdir'
-      hardcode_direct_FC=yes
-      hardcode_minus_L_FC=yes
-      hardcode_shlibpath_var_FC=no
-      ;;
-
-    sysv4)
-      case $host_vendor in
-	sni)
-	  archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct_FC=yes # is this really true???
-	;;
-	siemens)
-	  ## LD is ld it makes a PLAMLIB
-	  ## CC just makes a GrossModule.
-	  archive_cmds_FC='$LD -G -o $lib $libobjs $deplibs $linker_flags'
-	  reload_cmds_FC='$CC -r -o $output$reload_objs'
-	  hardcode_direct_FC=no
-        ;;
-	motorola)
-	  archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	  hardcode_direct_FC=no #Motorola manual says yes, but my tests say they lie
-	;;
-      esac
-      runpath_var='LD_RUN_PATH'
-      hardcode_shlibpath_var_FC=no
-      ;;
-
-    sysv4.3*)
-      archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_shlibpath_var_FC=no
-      export_dynamic_flag_spec_FC='-Bexport'
       ;;
 
-    sysv4*MP*)
-      if test -d /usr/nec; then
-	archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-	hardcode_shlibpath_var_FC=no
-	runpath_var=LD_RUN_PATH
-	hardcode_runpath_var=yes
-	ld_shlibs_FC=yes
-      fi
-      ;;
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs_FC=no
+	cat <<_LT_EOF 1>&2
 
-    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag_FC='${wl}-z,text'
-      archive_cmds_need_lc_FC=no
-      hardcode_shlibpath_var_FC=no
-      runpath_var='LD_RUN_PATH'
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
 
-      if test "$GCC" = yes; then
-	archive_cmds_FC='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_FC='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
       else
-	archive_cmds_FC='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_FC='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	ld_shlibs_FC=no
       fi
       ;;
 
-    sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
-      # link with -lc, and that would cause any symbols used from libc to
-      # always be unresolved, which means just about no library would
-      # ever link correctly.  If we're not using GNU ld we use -z text
-      # though, which does catch some bad symbols but isn't as heavy-handed
-      # as -z defs.
-      no_undefined_flag_FC='${wl}-z,text'
-      allow_undefined_flag_FC='${wl}-z,nodefs'
-      archive_cmds_need_lc_FC=no
-      hardcode_shlibpath_var_FC=no
-      hardcode_libdir_flag_spec_FC='${wl}-R,$libdir'
-      hardcode_libdir_separator_FC=':'
-      link_all_deplibs_FC=yes
-      export_dynamic_flag_spec_FC='${wl}-Bexport'
-      runpath_var='LD_RUN_PATH'
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs_FC=no
+	cat <<_LT_EOF 1>&2
 
-      if test "$GCC" = yes; then
-	archive_cmds_FC='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_FC='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      else
-	archive_cmds_FC='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds_FC='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-      fi
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
+	    archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs_FC=no
+	  fi
+	;;
+      esac
       ;;
 
-    uts4*)
-      archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_libdir_flag_spec_FC='-L$libdir'
+    sunos4*)
+      archive_cmds_FC='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct_FC=yes
       hardcode_shlibpath_var_FC=no
       ;;
 
     *)
-      ld_shlibs_FC=no
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs_FC=no
+      fi
       ;;
     esac
 
-    if test x$host_vendor = xsni; then
-      case $host in
-      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	export_dynamic_flag_spec_FC='${wl}-Blargedynsym'
-	;;
-      esac
+    if test "$ld_shlibs_FC" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec_FC=
+      export_dynamic_flag_spec_FC=
+      whole_archive_flag_spec_FC=
     fi
-  fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_FC" >&5
-$as_echo "$ld_shlibs_FC" >&6; }
-test "$ld_shlibs_FC" = no && can_build_shared=no
-
-with_gnu_ld_FC=$with_gnu_ld
-
-
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag_FC=unsupported
+      always_export_symbols_FC=yes
+      archive_expsym_cmds_FC='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L_FC=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct_FC=unsupported
+      fi
+      ;;
 
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds_FC='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds_FC='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
 
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
 
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
 
-#
-# Do we need to explicitly link libc?
-#
-case "x$archive_cmds_need_lc_FC" in
-x|xyes)
-  # Assume -lc should be added
-  archive_cmds_need_lc_FC=yes
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
-    case $archive_cmds_FC in
-    *'~'*)
-      # FIXME: we may have to deal with multi-command sequences.
-      ;;
-    '$CC '*)
-      # Test whether the compiler implicitly links with -lc since on some
-      # systems, -lgcc has to come before -lc. If gcc already passes -lc
-      # to ld, don't add -lc before -lgcc.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
-$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
-if ${lt_cv_archive_cmds_need_lc_FC+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  $RM conftest*
-	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+      archive_cmds_FC=''
+      hardcode_direct_FC=yes
+      hardcode_direct_absolute_FC=yes
+      hardcode_libdir_separator_FC=':'
+      link_all_deplibs_FC=yes
+      file_list_spec_FC='${wl}-f,'
 
-	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } 2>conftest.err; then
-	  soname=conftest
-	  lib=conftest
-	  libobjs=conftest.$ac_objext
-	  deplibs=
-	  wl=$lt_prog_compiler_wl_FC
-	  pic_flag=$lt_prog_compiler_pic_FC
-	  compiler_flags=-v
-	  linker_flags=-v
-	  verstring=
-	  output_objdir=.
-	  libname=conftest
-	  lt_save_allow_undefined_flag=$allow_undefined_flag_FC
-	  allow_undefined_flag_FC=
-	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_FC 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
-  (eval $archive_cmds_FC 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
 	  then
-	    lt_cv_archive_cmds_need_lc_FC=no
+	  # We have reworked collect2
+	  :
 	  else
-	    lt_cv_archive_cmds_need_lc_FC=yes
+	  # We have old collect2
+	  hardcode_direct_FC=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L_FC=yes
+	  hardcode_libdir_flag_spec_FC='-L$libdir'
+	  hardcode_libdir_separator_FC=
 	  fi
-	  allow_undefined_flag_FC=$lt_save_allow_undefined_flag
-	else
-	  cat conftest.err 1>&5
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
 	fi
-	$RM conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_FC" >&5
-$as_echo "$lt_cv_archive_cmds_need_lc_FC" >&6; }
-      archive_cmds_need_lc_FC=$lt_cv_archive_cmds_need_lc_FC
-      ;;
-    esac
-  fi
-  ;;
-esac
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
-$as_echo_n "checking dynamic linker characteristics... " >&6; }
-
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-shrext_cmds=".so"
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-need_lib_prefix=unknown
-hardcode_into_libs=no
-
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-need_version=unknown
-
-case $host_os in
-aix3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-  shlibpath_var=LIBPATH
-
-  # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
-  ;;
-
-aix[4-9]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
-    # With GCC up to 2.95.x, collect2 would create an import file
-    # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
-    # development snapshots of GCC prior to 3.0.
-    case $host_os in
-      aix4 | aix4.[01] | aix4.[01].*)
-      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
-	:
+	link_all_deplibs_FC=no
       else
-	can_build_shared=no
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
       fi
-      ;;
-    esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-    # soname into executable. Probably we can add versioning support to
-    # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
-      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-      # instead of lib<name>.a to let people know that these are not
-      # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
-      # We preserve .a as extension for shared libraries through AIX4.2
-      # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
-    shlibpath_var=LIBPATH
+
+      export_dynamic_flag_spec_FC='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols_FC=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag_FC='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      program main
+
+      end
+_ACEOF
+if ac_fn_fc_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__FC=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__FC"; then
+    lt_cv_aix_libpath__FC=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__FC"; then
+    lt_cv_aix_libpath__FC="/usr/lib:/lib"
   fi
-  ;;
 
-amigaos*)
-  case $host_cpu in
-  powerpc)
-    # Since July 2007 AmigaOS4 officially supports .so libraries.
-    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    ;;
-  m68k)
-    library_names_spec='$libname.ixlibrary $libname.a'
-    # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-    ;;
-  esac
-  ;;
+fi
 
-beos*)
-  library_names_spec='${libname}${shared_ext}'
-  dynamic_linker="$host_os ld.so"
-  shlibpath_var=LIBRARY_PATH
-  ;;
+  aix_libpath=$lt_cv_aix_libpath__FC
+fi
 
-bsdi[45]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-  # the default ld.so.conf also contains /usr/contrib/lib and
-  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-  # libtool to hard-code these into programs
-  ;;
+        hardcode_libdir_flag_spec_FC='${wl}-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds_FC='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec_FC='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag_FC="-z nodefs"
+	  archive_expsym_cmds_FC="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.$ac_ext <<_ACEOF
+      program main
 
-cygwin* | mingw* | pw32* | cegcc*)
-  version_type=windows
-  shrext_cmds=".dll"
-  need_version=no
-  need_lib_prefix=no
+      end
+_ACEOF
+if ac_fn_fc_try_link "$LINENO"; then :
 
-  case $GCC,$cc_basename in
-  yes,*)
-    # gcc
-    library_names_spec='$libname.dll.a'
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname~
-      chmod a+x \$dldir/$dlname~
-      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
-        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
-      fi'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__FC=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__FC"; then
+    lt_cv_aix_libpath__FC=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__FC"; then
+    lt_cv_aix_libpath__FC="/usr/lib:/lib"
+  fi
 
-    case $host_os in
-    cygwin*)
-      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+fi
 
-      ;;
-    mingw* | cegcc*)
-      # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    pw32*)
-      # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-      ;;
-    esac
-    dynamic_linker='Win32 ld.exe'
-    ;;
+  aix_libpath=$lt_cv_aix_libpath__FC
+fi
 
-  *,cl*)
-    # Native MSVC
-    libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
+	 hardcode_libdir_flag_spec_FC='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag_FC=' ${wl}-bernotok'
+	  allow_undefined_flag_FC=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    whole_archive_flag_spec_FC='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec_FC='$convenience'
+	  fi
+	  archive_cmds_need_lc_FC=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds_FC="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
 
-    case $build_os in
-    mingw*)
-      sys_lib_search_path_spec=
-      lt_save_ifs=$IFS
-      IFS=';'
-      for lt_path in $LIB
-      do
-        IFS=$lt_save_ifs
-        # Let DOS variable expansion print the short 8.3 style file name.
-        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
-        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
-      done
-      IFS=$lt_save_ifs
-      # Convert to MSYS style.
-      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds_FC=''
+        ;;
+      m68k)
+            archive_cmds_FC='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec_FC='-L$libdir'
+            hardcode_minus_L_FC=yes
+        ;;
+      esac
       ;;
-    cygwin*)
-      # Convert to unix form, then to dos form, then back to unix form
-      # but this time dos style (no spaces!) so that the unix form looks
-      # like /cygdrive/c/PROGRA~1:/cygdr...
-      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
-      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
-      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+
+    bsdi[45]*)
+      export_dynamic_flag_spec_FC=-rdynamic
       ;;
-    *)
-      sys_lib_search_path_spec="$LIB"
-      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
-        # It is most probably a Windows format PATH.
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-      else
-        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
-      fi
-      # FIXME: find the short name or the path components, as spaces are
-      # common. (e.g. "Program Files" -> "PROGRA~1")
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	hardcode_libdir_flag_spec_FC=' '
+	allow_undefined_flag_FC=unsupported
+	always_export_symbols_FC=yes
+	file_list_spec_FC='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds_FC='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	archive_expsym_cmds_FC='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, FC)='true'
+	enable_shared_with_static_runtimes_FC=yes
+	exclude_expsyms_FC='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	export_symbols_cmds_FC='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	old_postinstall_cmds_FC='chmod 644 $oldlib'
+	postlink_cmds_FC='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	hardcode_libdir_flag_spec_FC=' '
+	allow_undefined_flag_FC=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds_FC='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	old_archive_from_new_cmds_FC='true'
+	# FIXME: Should let the user specify the lib program.
+	old_archive_cmds_FC='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	enable_shared_with_static_runtimes_FC=yes
+	;;
+      esac
       ;;
-    esac
 
-    # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
-      dldir=$destdir/`dirname \$dlpath`~
-      test -d \$dldir || mkdir -p \$dldir~
-      $install_prog $dir/$dlname \$dldir/$dlname'
-    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-      dlpath=$dir/\$dldll~
-       $RM \$dlpath'
-    shlibpath_overrides_runpath=yes
-    dynamic_linker='Win32 link.exe'
-    ;;
+    darwin* | rhapsody*)
 
-  *)
-    # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
-    dynamic_linker='Win32 ld.exe'
-    ;;
+
+  archive_cmds_need_lc_FC=no
+  hardcode_direct_FC=no
+  hardcode_automatic_FC=yes
+  hardcode_shlibpath_var_FC=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec_FC='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    compiler_needs_object_FC=yes
+  else
+    whole_archive_flag_spec_FC=''
+  fi
+  link_all_deplibs_FC=yes
+  allow_undefined_flag_FC="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
   esac
-  # FIXME: first we should search . and the directory the executable is in
-  shlibpath_var=PATH
-  ;;
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds_FC="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds_FC="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds_FC="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds_FC="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
 
-darwin* | rhapsody*)
-  dynamic_linker="$host_os dyld"
-  version_type=darwin
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
-  shlibpath_overrides_runpath=yes
-  shlibpath_var=DYLD_LIBRARY_PATH
-  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+  else
+  ld_shlibs_FC=no
+  fi
 
-  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
-  ;;
+      ;;
 
-dgux*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
+    dgux*)
+      archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_FC='-L$libdir'
+      hardcode_shlibpath_var_FC=no
+      ;;
 
-freebsd* | dragonfly*)
-  # DragonFly does not have aout.  When/if they implement a new
-  # versioning mechanism, adjust this.
-  if test -x /usr/bin/objformat; then
-    objformat=`/usr/bin/objformat`
-  else
-    case $host_os in
-    freebsd[23].*) objformat=aout ;;
-    *) objformat=elf ;;
-    esac
-  fi
-  version_type=freebsd-$objformat
-  case $version_type in
-    freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-      need_version=no
-      need_lib_prefix=no
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec_FC='-R$libdir'
+      hardcode_direct_FC=yes
+      hardcode_shlibpath_var_FC=no
       ;;
-    freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
-      need_version=yes
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_FC=yes
+      hardcode_minus_L_FC=yes
+      hardcode_shlibpath_var_FC=no
       ;;
-  esac
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_os in
-  freebsd2.*)
-    shlibpath_overrides_runpath=yes
-    ;;
-  freebsd3.[01]* | freebsdelf3.[01]*)
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
-  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
-    shlibpath_overrides_runpath=no
-    hardcode_into_libs=yes
-    ;;
-  *) # from 4.6 on, and DragonFly
-    shlibpath_overrides_runpath=yes
-    hardcode_into_libs=yes
-    ;;
-  esac
-  ;;
 
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec_FC='-R$libdir'
+      hardcode_direct_FC=yes
+      hardcode_shlibpath_var_FC=no
+      ;;
 
-haiku*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
-  hardcode_into_libs=yes
-  ;;
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds_FC='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds_FC='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator_FC=:
+      hardcode_direct_FC=yes
 
-hpux9* | hpux10* | hpux11*)
-  # Give a soname corresponding to the major version so that dld.sl refuses to
-  # link against other versions.
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  hppa*64*)
-    shrext_cmds='.sl'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
-  *)
-    shrext_cmds='.sl'
-    dynamic_linker="$host_os dld.sl"
-    shlibpath_var=SHLIB_PATH
-    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    ;;
-  esac
-  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
-  postinstall_cmds='chmod 555 $lib'
-  # or fails outright, so override atomically:
-  install_override_mode=555
-  ;;
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L_FC=yes
+      export_dynamic_flag_spec_FC='${wl}-E'
+      ;;
 
-interix[3-9]*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_FC='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator_FC=:
+	hardcode_direct_FC=yes
+	hardcode_direct_absolute_FC=yes
+	export_dynamic_flag_spec_FC='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L_FC=yes
+      fi
+      ;;
 
-irix5* | irix6* | nonstopux*)
-  case $host_os in
-    nonstopux*) version_type=nonstopux ;;
-    *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
-		version_type=linux # correct to gnu/linux during the next big refactor
-	else
-		version_type=irix
-	fi ;;
-  esac
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
-  case $host_os in
-  irix5* | nonstopux*)
-    libsuff= shlibsuff=
-    ;;
-  *)
-    case $LD in # libtool.m4 will add one of these switches to LD
-    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
-      libsuff= shlibsuff= libmagic=32-bit;;
-    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
-      libsuff=32 shlibsuff=N32 libmagic=N32;;
-    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
-      libsuff=64 shlibsuff=64 libmagic=64-bit;;
-    *) libsuff= shlibsuff= libmagic=never-match;;
-    esac
-    ;;
-  esac
-  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
-  shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
-  hardcode_into_libs=yes
-  ;;
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_FC='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_FC='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	archive_cmds_FC='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec_FC='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator_FC=:
 
-# No shared lib support for Linux oldld, aout, or coff.
-linux*oldld* | linux*aout* | linux*coff*)
-  dynamic_linker=no
-  ;;
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct_FC=no
+	  hardcode_shlibpath_var_FC=no
+	  ;;
+	*)
+	  hardcode_direct_FC=yes
+	  hardcode_direct_absolute_FC=yes
+	  export_dynamic_flag_spec_FC='${wl}-E'
 
-# This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L_FC=yes
+	  ;;
+	esac
+      fi
+      ;;
 
-  # Some binutils ld are patched to set DT_RUNPATH
-  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  lt_cv_shlibpath_overrides_runpath=no
-    save_LDFLAGS=$LDFLAGS
-    save_libdir=$libdir
-    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_FC\"; \
-	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_FC\""
-    cat > conftest.$ac_ext <<_ACEOF
-      program main
+  save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   cat > conftest.$ac_ext <<_ACEOF
 
+      subroutine foo
       end
 _ACEOF
 if ac_fn_fc_try_link "$LINENO"; then :
-  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
-  lt_cv_shlibpath_overrides_runpath=yes
-fi
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-    LDFLAGS=$save_LDFLAGS
-    libdir=$save_libdir
-
+           LDFLAGS="$save_LDFLAGS"
 fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          archive_expsym_cmds_FC='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	archive_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds_FC='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc_FC='no'
+      hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_FC=:
+      inherit_rpath_FC=yes
+      link_all_deplibs_FC=yes
+      ;;
 
-  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds_FC='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec_FC='-R$libdir'
+      hardcode_direct_FC=yes
+      hardcode_shlibpath_var_FC=no
+      ;;
 
-  # This implies no fast_install, which is unacceptable.
-  # Some rework will be needed to allow for fast_install
-  # before this can be enabled.
-  hardcode_into_libs=yes
+    newsos6)
+      archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct_FC=yes
+      hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_FC=:
+      hardcode_shlibpath_var_FC=no
+      ;;
 
-  # Append ld.so.conf contents to the search path
-  if test -f /etc/ld.so.conf; then
-    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
-    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
-  fi
+    *nto* | *qnx*)
+      ;;
 
-  # We used to test for /lib/ld.so.1 and disable shared libraries on
-  # powerpc, because MkLinux only supported shared libraries with the
-  # GNU dynamic linker.  Since this was broken with cross compilers,
-  # most powerpc-linux boxes support dynamic linking these days and
-  # people can always --disable-shared, the test was removed, and we
-  # assume the GNU/Linux dynamic linker is in use.
-  dynamic_linker='GNU/Linux ld.so'
-  ;;
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct_FC=yes
+	hardcode_shlibpath_var_FC=no
+	hardcode_direct_absolute_FC=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir'
+	  export_dynamic_flag_spec_FC='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	     archive_cmds_FC='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     hardcode_libdir_flag_spec_FC='-R$libdir'
+	     ;;
+	   *)
+	     archive_cmds_FC='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     hardcode_libdir_flag_spec_FC='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	ld_shlibs_FC=no
+      fi
+      ;;
 
-netbsd*)
-  version_type=sunos
-  need_lib_prefix=no
-  need_version=no
-  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-    dynamic_linker='NetBSD (a.out) ld.so'
-  else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    dynamic_linker='NetBSD ld.elf_so'
-  fi
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  ;;
+    os2*)
+      hardcode_libdir_flag_spec_FC='-L$libdir'
+      hardcode_minus_L_FC=yes
+      allow_undefined_flag_FC=unsupported
+      archive_cmds_FC='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_from_new_cmds_FC='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
 
-newsos6)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  ;;
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag_FC=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag_FC=' -expect_unresolved \*'
+	archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc_FC='no'
+      hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator_FC=:
+      ;;
 
-*nto* | *qnx*)
-  version_type=qnx
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  dynamic_linker='ldqnx.so'
-  ;;
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag_FC=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds_FC='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec_FC='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag_FC=' -expect_unresolved \*'
+	archive_cmds_FC='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds_FC='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
 
-openbsd*)
-  version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
-  need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec_FC='-rpath $libdir'
+      fi
+      archive_cmds_need_lc_FC='no'
+      hardcode_libdir_separator_FC=:
+      ;;
+
+    solaris*)
+      no_undefined_flag_FC=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds_FC='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds_FC='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  archive_cmds_FC='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_FC='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec_FC='-R$libdir'
+      hardcode_shlibpath_var_FC=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
       *)
-	shlibpath_overrides_runpath=yes
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  whole_archive_flag_spec_FC='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec_FC='-z allextract$convenience -z defaultextract'
+	fi
 	;;
       esac
-  else
-    shlibpath_overrides_runpath=yes
-  fi
-  ;;
+      link_all_deplibs_FC=yes
+      ;;
 
-os2*)
-  libname_spec='$name'
-  shrext_cmds=".dll"
-  need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
-  dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
-  ;;
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds_FC='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_FC='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec_FC='-L$libdir'
+      hardcode_direct_FC=yes
+      hardcode_minus_L_FC=yes
+      hardcode_shlibpath_var_FC=no
+      ;;
 
-osf3* | osf4* | osf5*)
-  version_type=osf
-  need_lib_prefix=no
-  need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
-  ;;
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_FC=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds_FC='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds_FC='$CC -r -o $output$reload_objs'
+	  hardcode_direct_FC=no
+        ;;
+	motorola)
+	  archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct_FC=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var_FC=no
+      ;;
 
-rdos*)
-  dynamic_linker=no
-  ;;
+    sysv4.3*)
+      archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var_FC=no
+      export_dynamic_flag_spec_FC='-Bexport'
+      ;;
 
-solaris*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  # ldd complains unless libraries are executable
-  postinstall_cmds='chmod +x $lib'
-  ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var_FC=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs_FC=yes
+      fi
+      ;;
 
-sunos4*)
-  version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
-    need_lib_prefix=no
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag_FC='${wl}-z,text'
+      archive_cmds_need_lc_FC=no
+      hardcode_shlibpath_var_FC=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds_FC='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_FC='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_FC='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_FC='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag_FC='${wl}-z,text'
+      allow_undefined_flag_FC='${wl}-z,nodefs'
+      archive_cmds_need_lc_FC=no
+      hardcode_shlibpath_var_FC=no
+      hardcode_libdir_flag_spec_FC='${wl}-R,$libdir'
+      hardcode_libdir_separator_FC=':'
+      link_all_deplibs_FC=yes
+      export_dynamic_flag_spec_FC='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds_FC='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_FC='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds_FC='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds_FC='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds_FC='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec_FC='-L$libdir'
+      hardcode_shlibpath_var_FC=no
+      ;;
+
+    *)
+      ld_shlibs_FC=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec_FC='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
   fi
-  need_version=yes
-  ;;
 
-sysv4 | sysv4.3*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  case $host_vendor in
-    sni)
-      shlibpath_overrides_runpath=no
-      need_lib_prefix=no
-      runpath_var=LD_RUN_PATH
-      ;;
-    siemens)
-      need_lib_prefix=no
-      ;;
-    motorola)
-      need_lib_prefix=no
-      need_version=no
-      shlibpath_overrides_runpath=no
-      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_FC" >&5
+$as_echo "$ld_shlibs_FC" >&6; }
+test "$ld_shlibs_FC" = no && can_build_shared=no
+
+with_gnu_ld_FC=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_FC" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_FC=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds_FC in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
       ;;
-  esac
-  ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc_FC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
-sysv4*MP*)
-  if test -d /usr/nec ;then
-    version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
-    shlibpath_var=LD_LIBRARY_PATH
-  fi
-  ;;
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl_FC
+	  pic_flag=$lt_prog_compiler_pic_FC
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag_FC
+	  allow_undefined_flag_FC=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_FC 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds_FC 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc_FC=no
+	  else
+	    lt_cv_archive_cmds_need_lc_FC=yes
+	  fi
+	  allow_undefined_flag_FC=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
 
-sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
-  hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
-    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
-  else
-    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
-    case $host_os in
-      sco3.2v5*)
-        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
-	;;
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_FC" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc_FC" >&6; }
+      archive_cmds_need_lc_FC=$lt_cv_archive_cmds_need_lc_FC
+      ;;
     esac
   fi
-  sys_lib_dlsearch_path_spec='/usr/lib'
   ;;
+esac
 
-tpf*)
-  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
 
-uts4*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  ;;
 
-*)
-  dynamic_linker=no
-  ;;
-esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
-$as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
 
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
-  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
 
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
-fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
-fi
 
 
 
@@ -21360,43 +21987,8 @@ fi
 
 
 
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
-$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
-hardcode_action_FC=
-if test -n "$hardcode_libdir_flag_spec_FC" ||
-   test -n "$runpath_var_FC" ||
-   test "X$hardcode_automatic_FC" = "Xyes" ; then
 
-  # We can hardcode non-existent directories.
-  if test "$hardcode_direct_FC" != no &&
-     # If the only mechanism to avoid hardcoding is shlibpath_var, we
-     # have to relink, otherwise we might link with an installed library
-     # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, FC)" != no &&
-     test "$hardcode_minus_L_FC" != no; then
-    # Linking always hardcodes the temporary library directory.
-    hardcode_action_FC=relink
-  else
-    # We can link without hardcoding, and we can hardcode nonexisting dirs.
-    hardcode_action_FC=immediate
-  fi
-else
-  # We cannot hardcode anything, or else we can only hardcode existing
-  # directories.
-  hardcode_action_FC=unsupported
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_FC" >&5
-$as_echo "$hardcode_action_FC" >&6; }
 
-if test "$hardcode_action_FC" = relink ||
-   test "$inherit_rpath_FC" = yes; then
-  # Fast installation is not supported
-  enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
-  # Fast installation is not necessary
-  enable_fast_install=needless
-fi
 
 
 
@@ -21404,18 +21996,8 @@ fi
 
 
 
-  fi # test -n "$compiler"
 
-  GCC=$lt_save_GCC
-  CC=$lt_save_CC
-  CFLAGS=$lt_save_CFLAGS
-fi # test "$_lt_disable_FC" != yes
 
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
@@ -21424,1099 +22006,946 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
 
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
 
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
 
-        ac_config_commands="$ac_config_commands libtool"
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
 
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
 
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
 
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
 
-# Only expand once:
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
 
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
 
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
 
-## ----------------------------------------------------------------------
-## Check if we should install only statically linked executables.
-##   This check needs to occur after libtool is initialized because
-##   we check a libtool cache value and may issue a warning based
-##   on its result.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we should install only statically linked executables" >&5
-$as_echo_n "checking if we should install only statically linked executables... " >&6; }
-# Check whether --enable-static_exec was given.
-if test "${enable_static_exec+set}" = set; then :
-  enableval=$enable_static_exec; STATIC_EXEC=$enableval
-fi
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
 
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
 
-if test "X$STATIC_EXEC" = "Xyes"; then
-  echo "yes"
-  ## Issue a warning if -static flag is not supported.
-  if test "X$lt_cv_prog_compiler_static_works" = "Xno"; then
-      echo "    warning: -static flag not supported on this system; executable won't statically link shared system libraries."
-      LT_STATIC_EXEC=""
-  else
-    LT_STATIC_EXEC="-all-static"
-  fi
-else
-  echo "no"
-  LT_STATIC_EXEC=""
-fi
- if test "X$LT_STATIC_EXEC" = X; then
-  USE_PLUGINS_CONDITIONAL_TRUE=
-  USE_PLUGINS_CONDITIONAL_FALSE='#'
-else
-  USE_PLUGINS_CONDITIONAL_TRUE='#'
-  USE_PLUGINS_CONDITIONAL_FALSE=
-fi
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
 
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
 
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
 
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
 
-## Fix up the INSTALL macro if it's a relative path. We want the
-## full-path to the binary instead.
-case "$INSTALL" in
-  *install-sh*)
-    INSTALL='\${top_srcdir}/bin/install-sh -c'
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
     ;;
-esac
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
 
-## ----------------------------------------------------------------------
-## Some users have reported problems with libtool's use of '-Wl,-rpath' to
-## link shared libraries in nondefault directories. Allow users to
-## disable embedding the rpath information in the executables and to
-## instead solely rely on the information in LD_LIBRARY_PATH.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if -Wl,-rpath should be used to link shared libs in nondefault directories" >&5
-$as_echo_n "checking if -Wl,-rpath should be used to link shared libs in nondefault directories... " >&6; }
-# Check whether --enable-sharedlib-rpath was given.
-if test "${enable_sharedlib_rpath+set}" = set; then :
-  enableval=$enable_sharedlib_rpath; RPATH=$enableval
-fi
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
 
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
 
-case "X-$RPATH" in
-  X-no)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-    runpath_var=
-    hardcode_libdir_flag_spec=
-    hardcode_libdir_flag_spec_ld=
-    hardcode_into_libs=no
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
-  X-|X-yes)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
   *)
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: error" >&5
-$as_echo "error" >&6; }
-    as_fn_error $? "\'$enableval\' is not a valid rpath type" "$LINENO" 5
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
     ;;
-esac
-
-## ----------------------------------------------------------------------
-## pmake will throw an error if variables are undefined in a Makefile.
-## These errors can be changed to warnings using the -V flag.
-##
- AM_MAKEFLAGS=""
-
-## Don't run test if MAKE is defined but is the empty string
-if test -n "${MAKE-make}"; then
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether make will build with undefined variables" >&5
-$as_echo_n "checking whether make will build with undefined variables... " >&6; }
-
-  cat >maketest <<EOF
-foo: \$(UNDEFINED) \$(UNDEFINED2)
-	@echo \$(UNDEFINED3) works
-EOF
-
-  if (${MAKE-make} -f maketest foo) >/dev/null 2>&1; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-  else
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, setting -V flag" >&5
-$as_echo "no, setting -V flag" >&6; }
-    AM_MAKEFLAGS="\-V"
-  fi
-
-  rm maketest
-fi
-
-## ----------------------------------------------------------------------
-## Production flags?  Save the value in $CONFIG_MODE so we have it for
-## the record.
-##
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for production mode" >&5
-$as_echo_n "checking for production mode... " >&6; }
-# Check whether --enable-production was given.
-if test "${enable_production+set}" = set; then :
-  enableval=$enable_production;
-fi
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
 
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
 
-case "X-$enable_production" in
-  X-|X-yes)
-    enable_production="yes"
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: production" >&5
-$as_echo "production" >&6; }
-    CONFIG_MODE=production
-    H5_CFLAGS="$H5_CFLAGS $PROD_CFLAGS"
-    H5_CPPFLAGS="$H5_CPPFLAGS $PROD_CPPFLAGS"
-    H5_CXXFLAGS="$H5_CXXFLAGS $PROD_CXXFLAGS"
-    H5_FCFLAGS="$H5_FCFLAGS $PROD_FCFLAGS"
-    ;;
-  X-no)
-    enable_production="no"
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: development" >&5
-$as_echo "development" >&6; }
-    CONFIG_MODE=development
-    H5_CFLAGS="$H5_CFLAGS $DEBUG_CFLAGS"
-    H5_CPPFLAGS="$H5_CPPFLAGS $DEBUG_CPPFLAGS"
-    H5_CXXFLAGS="$H5_CXXFLAGS $DEBUG_CXXFLAGS"
-    H5_FCFLAGS="$H5_FCFLAGS $DEBUG_FCFLAGS"
-    ;;
-  X-pg|X-profile)
-    enable_production="profile"
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: profile" >&5
-$as_echo "profile" >&6; }
-    CONFIG_MODE=profile
-    H5_CFLAGS="$H5_CFLAGS $PROFILE_CFLAGS"
-    H5_CPPFLAGS="$H5_CPPFLAGS $PROFILE_CPPFLAGS"
-    H5_CXXFLAGS="$H5_CXXFLAGS $PROFILE_CXXFLAGS"
-    H5_FCFLAGS="$H5_FCFLAGS $PROFILE_FCFLAGS"
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
     ;;
   *)
-    enable_production="user-defined"
-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: user-defined" >&5
-$as_echo "user-defined" >&6; }
-    CONFIG_MODE="$enableval"
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
     ;;
-esac
-
-## ----------------------------------------------------------------------
-## Check for system libraries. "dl" stands for dynamically loaded library
-##
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ceil in -lm" >&5
-$as_echo_n "checking for ceil in -lm... " >&6; }
-if ${ac_cv_lib_m_ceil+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lm  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char ceil ();
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-return ceil ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_m_ceil=yes
-else
-  ac_cv_lib_m_ceil=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_ceil" >&5
-$as_echo "$ac_cv_lib_m_ceil" >&6; }
-if test "x$ac_cv_lib_m_ceil" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBM 1
-_ACEOF
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
 
-  LIBS="-lm $LIBS"
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
 
-fi
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if ${ac_cv_lib_dl_dlopen+:} false; then :
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_FC\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_FC\""
+    cat > conftest.$ac_ext <<_ACEOF
+      program main
 
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char dlopen ();
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-return dlopen ();
-  ;
-  return 0;
-}
+      end
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_dl_dlopen=yes
-else
-  ac_cv_lib_dl_dlopen=no
+if ac_fn_fc_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBDL 1
-_ACEOF
-
-  LIBS="-ldl $LIBS"
-
-fi
-
-
-## ----------------------------------------------------------------------
-## Check for system header files.
-##
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_stdc=yes
-else
-  ac_cv_header_stdc=no
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <string.h>
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
 
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then :
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
 
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
 
-fi
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
 
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdlib.h>
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
 
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then :
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
 
-else
-  ac_cv_header_stdc=no
-fi
-rm -f conftest*
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
 
-fi
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
 
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then :
-  :
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
 
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
 
-else
-  ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
 
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
+rdos*)
+  dynamic_linker=no
+  ;;
 
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
 
-fi
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5
-$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; }
-if ${ac_cv_header_time+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-#include <sys/time.h>
-#include <time.h>
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
 
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-if ((struct tm *) 0)
-return 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_header_time=yes
-else
-  ac_cv_header_time=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5
-$as_echo "$ac_cv_header_time" >&6; }
-if test $ac_cv_header_time = yes; then
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
 
-$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
 
-fi
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
 
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
 
-## Unix
-for ac_header in sys/resource.h sys/time.h unistd.h sys/ioctl.h sys/stat.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
 
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
-done
-
-for ac_header in sys/socket.h sys/types.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
 fi
 
-done
 
-for ac_header in stddef.h setjmp.h features.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
 
-fi
 
-done
 
-for ac_header in dirent.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "dirent.h" "ac_cv_header_dirent_h" "$ac_includes_default"
-if test "x$ac_cv_header_dirent_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_DIRENT_H 1
-_ACEOF
 
-fi
 
-done
 
-for ac_header in stdint.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default"
-if test "x$ac_cv_header_stdint_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_STDINT_H 1
-_ACEOF
- C9x=yes
-fi
 
-done
 
 
-## Darwin
-for ac_header in mach/mach_time.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "mach/mach_time.h" "ac_cv_header_mach_mach_time_h" "$ac_includes_default"
-if test "x$ac_cv_header_mach_mach_time_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_MACH_MACH_TIME_H 1
-_ACEOF
 
-fi
 
-done
 
-## Also need to detect Darwin for pubconf
-case $host_os in
-  darwin*)
 
-$as_echo "#define HAVE_DARWIN 1" >>confdefs.h
 
-  ;;
-esac
 
-## Windows
-case "`uname`" in
-  CYGWIN*)
-    for ac_header in io.h sys/timeb.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
 
-fi
 
-done
 
-    ;;
-  MINGW*)
-    for ac_header in io.h winsock2.h sys/timeb.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
 
-fi
 
-done
 
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lws2_32" >&5
-$as_echo_n "checking for main in -lws2_32... " >&6; }
-if ${ac_cv_lib_ws2_32_main+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lws2_32  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
 
 
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-return main ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_ws2_32_main=yes
-else
-  ac_cv_lib_ws2_32_main=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ws2_32_main" >&5
-$as_echo "$ac_cv_lib_ws2_32_main" >&6; }
-if test "x$ac_cv_lib_ws2_32_main" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBWS2_32 1
-_ACEOF
 
-  LIBS="-lws2_32 $LIBS"
 
-fi
-ac_cv_lib_ws2_32=ac_cv_lib_ws2_32_main
 
-    ;;
-  *)
-    for ac_header in io.h winsock2.h sys/timeb.h
-do :
-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
 
-fi
 
-done
 
-    ;;
-esac
 
-## ----------------------------------------------------------------------
-## Some platforms require that all symbols are resolved when a library
-## is linked. We can use the -no-undefined flag to tell libtool that
-## it will be able to build shared libraries on these architectures,
-## as it will not do so by default.
-##
-if test "X${enable_shared}" = "Xyes"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool needs -no-undefined flag to build shared libraries" >&5
-$as_echo_n "checking if libtool needs -no-undefined flag to build shared libraries... " >&6; }
-  case "`uname`" in
-    CYGWIN*|MINGW*|AIX*)
-      ## Add in the -no-undefined flag to LDFLAGS for libtool.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-      H5_LDFLAGS="$H5_LDFLAGS -no-undefined"
-      ;;
-    *)
-      ## Don't add in anything.
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-      ;;
-  esac
-fi
 
-## ----------------------------------------------------------------------
-## Use the macro _AC_SYS_LARGEFILE_MACRO_VALUE to test defines
-## that might need to be set for largefile support to behave
-## correctly. This macro is defined in acsite.m4 and overrides
-## the version provided by Autoconf (as of v2.65). The custom
-## macro additionally adds the appropriate defines to AM_CPPFLAGS
-## so that later configure checks have them visible.
 
-## Check for _FILE_OFFSET_BITS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
-$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
-if ${ac_cv_sys_file_offset_bits+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  while :; do
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
-    We can't simply define LARGE_OFF_T to be 9223372036854775807,
-    since some C++ compilers masquerading as C compilers
-    incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
-  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
-		       && LARGE_OFF_T % 2147483647 == 1)
-		      ? 1 : -1];
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_sys_file_offset_bits=no; break
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#define _FILE_OFFSET_BITS 64
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
-    We can't simply define LARGE_OFF_T to be 9223372036854775807,
-    since some C++ compilers masquerading as C compilers
-    incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
-  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
-		       && LARGE_OFF_T % 2147483647 == 1)
-		      ? 1 : -1];
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_sys_file_offset_bits=64; break
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  ac_cv_sys_file_offset_bits=unknown
-  break
-done
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
-$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
-case $ac_cv_sys_file_offset_bits in #(
-  no | unknown) ;;
-  *)
-cat >>confdefs.h <<_ACEOF
-#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
-_ACEOF
 
-     AM_CPPFLAGS="-D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits $AM_CPPFLAGS";;
-esac
-rm -rf conftest*
 
-## Check for _LARGE_FILES
-if test "$ac_cv_sys_file_offset_bits" = unknown; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
-$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
-if ${ac_cv_sys_large_files+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  while :; do
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
-    We can't simply define LARGE_OFF_T to be 9223372036854775807,
-    since some C++ compilers masquerading as C compilers
-    incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
-  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
-		       && LARGE_OFF_T % 2147483647 == 1)
-		      ? 1 : -1];
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_FC=
+if test -n "$hardcode_libdir_flag_spec_FC" ||
+   test -n "$runpath_var_FC" ||
+   test "X$hardcode_automatic_FC" = "Xyes" ; then
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_sys_large_files=no; break
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct_FC" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, FC)" != no &&
+     test "$hardcode_minus_L_FC" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_FC=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_FC=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_FC=unsupported
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#define _LARGE_FILES 1
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
-    We can't simply define LARGE_OFF_T to be 9223372036854775807,
-    since some C++ compilers masquerading as C compilers
-    incorrectly reject 9223372036854775807.  */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
-  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
-		       && LARGE_OFF_T % 2147483647 == 1)
-		      ? 1 : -1];
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_FC" >&5
+$as_echo "$hardcode_action_FC" >&6; }
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_sys_large_files=1; break
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  ac_cv_sys_large_files=unknown
-  break
-done
+if test "$hardcode_action_FC" = relink ||
+   test "$inherit_rpath_FC" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
-$as_echo "$ac_cv_sys_large_files" >&6; }
-case $ac_cv_sys_large_files in #(
-  no | unknown) ;;
-  *)
-cat >>confdefs.h <<_ACEOF
-#define _LARGE_FILES $ac_cv_sys_large_files
-_ACEOF
 
-     AM_CPPFLAGS="-D_LARGE_FILES=$ac_cv_sys_large_files $AM_CPPFLAGS";;
-esac
-rm -rf conftest*
-fi
 
-## ----------------------------------------------------------------------
-## Add necessary defines for Linux Systems.
-##
-case "$host_cpu-$host_vendor-$host_os" in
-  *linux*)
-    ## Make available various LFS-related routines using the following
-    ## _LARGEFILE*_SOURCE macros.
-    AM_CPPFLAGS="-D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE $AM_CPPFLAGS"
 
-    ## Add POSIX support on Linux systems, so <features.h> defines
-    ## __USE_POSIX, which is required to get the prototype for fdopen
-    ## defined correctly in <stdio.h>.
-    ##
-    ## This flag was removed from h5cc as of 2009-10-17 when it was found
-    ## that the flag broke compiling netCDF-4 code with h5cc, but kept in
-    ## H5_CPPFLAGS because fdopen and HDfdopen fail without it. HDfdopen
-    ## is used only by H5_debug_mask which is used only when debugging in
-    ## H5_init_library (all in H5.c).  When the flag was removed this was
-    ## the only compile failure noted.
-    ##
-    ## This was originally defined as _POSIX_SOURCE which was updated to
-    ## _POSIX_C_SOURCE=199506L to expose a greater amount of POSIX
-    ## functionality so clock_gettime and CLOCK_MONOTONIC are defined
-    ## correctly. This was later updated to 200112L so that
-    ## posix_memalign() is visible for the direct VFD code on Linux
-    ## systems.
-    ##
-    ## POSIX feature information can be found in the gcc manual at:
-    ## http://www.gnu.org/s/libc/manual/html_node/Feature-Test-Macros.html
-    H5_CPPFLAGS="-D_POSIX_C_SOURCE=200112L $H5_CPPFLAGS"
 
-    ## Need to add this so that O_DIRECT is visible for the direct
-    ## VFD on Linux systems.
-    H5_CPPFLAGS="-D_GNU_SOURCE $H5_CPPFLAGS"
-    ;;
-esac
 
-## Need to add the AM_ and H5_ into CFLAGS/CPPFLAGS to make them visible
-## for configure checks.
-## Note: Both will be restored by the end of configure.
-CPPFLAGS="$H5_CPPFLAGS $AM_CPPFLAGS $CPPFLAGS"
-CFLAGS="$H5_CFLAGS $AM_CFLAGS $CFLAGS"
 
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-off64_t n = 0;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  for ac_func in lseek64 fseeko64 ftello64 ftruncate64
-do :
-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
 
-fi
-done
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test "$_lt_disable_FC" != yes
 
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: skipping test for lseek64(), fseeko64 , ftello64, ftruncate64() because off64_t is not defined" >&5
-$as_echo "skipping test for lseek64(), fseeko64 , ftello64, ftruncate64() because off64_t is not defined" >&6; }
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-for ac_func in fseeko ftello
-do :
-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-fi
-done
 
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
 
-#include <sys/types.h>
-#include <sys/stat.h>
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-struct stat64 sb;
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  for ac_func in stat64 fstat64
-do :
-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-  cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
 
-fi
-done
 
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: skipping test for stat64() and fstat64()" >&5
-$as_echo "skipping test for stat64() and fstat64()" >&6; }
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
-## ----------------------------------------------------------------------
-## Data types and their sizes.
-##
-ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default"
-if test "x$ac_cv_type_off_t" = xyes; then :
 
-else
 
-cat >>confdefs.h <<_ACEOF
-#define off_t long int
-_ACEOF
 
-fi
 
-ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
-if test "x$ac_cv_type_size_t" = xyes; then :
 
-else
+        ac_config_commands="$ac_config_commands libtool"
 
-cat >>confdefs.h <<_ACEOF
-#define size_t unsigned long
-_ACEOF
 
-fi
 
-ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default"
-if test "x$ac_cv_type_ssize_t" = xyes; then :
 
-else
+# Only expand once:
+
 
-cat >>confdefs.h <<_ACEOF
-#define ssize_t long
-_ACEOF
 
+## ----------------------------------------------------------------------
+## Check if we should install only statically linked executables.
+##   This check needs to occur after libtool is initialized because
+##   we check a libtool cache value and may issue a warning based
+##   on its result.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we should install only statically linked executables" >&5
+$as_echo_n "checking if we should install only statically linked executables... " >&6; }
+# Check whether --enable-static_exec was given.
+if test "${enable_static_exec+set}" = set; then :
+  enableval=$enable_static_exec; STATIC_EXEC=$enableval
 fi
 
-ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default"
-if test "x$ac_cv_type_ptrdiff_t" = xyes; then :
 
+if test "X$STATIC_EXEC" = "Xyes"; then
+  echo "yes"
+  ## Issue a warning if -static flag is not supported.
+  if test "X$lt_cv_prog_compiler_static_works" = "Xno"; then
+      echo "    warning: -static flag not supported on this system; executable won't statically link shared system libraries."
+      LT_STATIC_EXEC=""
+  else
+    LT_STATIC_EXEC="-all-static"
+  fi
+else
+  echo "no"
+  LT_STATIC_EXEC=""
+fi
+ if test "X$LT_STATIC_EXEC" = X; then
+  USE_PLUGINS_CONDITIONAL_TRUE=
+  USE_PLUGINS_CONDITIONAL_FALSE='#'
 else
+  USE_PLUGINS_CONDITIONAL_TRUE='#'
+  USE_PLUGINS_CONDITIONAL_FALSE=
+fi
 
-cat >>confdefs.h <<_ACEOF
-#define ptrdiff_t long
-_ACEOF
 
+
+
+## Fix up the INSTALL macro if it's a relative path. We want the
+## full-path to the binary instead.
+case "$INSTALL" in
+  *install-sh*)
+    INSTALL='\${top_srcdir}/bin/install-sh -c'
+    ;;
+esac
+
+## ----------------------------------------------------------------------
+## Some users have reported problems with libtool's use of '-Wl,-rpath' to
+## link shared libraries in nondefault directories. Allow users to
+## disable embedding the rpath information in the executables and to
+## instead solely rely on the information in LD_LIBRARY_PATH.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if -Wl,-rpath should be used to link shared libs in nondefault directories" >&5
+$as_echo_n "checking if -Wl,-rpath should be used to link shared libs in nondefault directories... " >&6; }
+# Check whether --enable-sharedlib-rpath was given.
+if test "${enable_sharedlib_rpath+set}" = set; then :
+  enableval=$enable_sharedlib_rpath; RPATH=$enableval
 fi
 
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
-$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
-if ${ac_cv_c_bigendian+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_cv_c_bigendian=unknown
-    # See if we're dealing with a universal compiler.
-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#ifndef __APPLE_CC__
-	       not a universal capable compiler
-	     #endif
-	     typedef int dummy;
 
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+case "X-$RPATH" in
+  X-no)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    runpath_var=
+    hardcode_libdir_flag_spec=
+    hardcode_libdir_flag_spec_ld=
+    hardcode_into_libs=no
+    ;;
+  X-|X-yes)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: error" >&5
+$as_echo "error" >&6; }
+    as_fn_error $? "\'$enableval\' is not a valid rpath type" "$LINENO" 5
+    ;;
+esac
 
-	# Check for potential -arch flags.  It is not universal unless
-	# there are at least two -arch flags with different values.
-	ac_arch=
-	ac_prev=
-	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
-	 if test -n "$ac_prev"; then
-	   case $ac_word in
-	     i?86 | x86_64 | ppc | ppc64)
-	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
-		 ac_arch=$ac_word
-	       else
-		 ac_cv_c_bigendian=universal
-		 break
-	       fi
-	       ;;
-	   esac
-	   ac_prev=
-	 elif test "x$ac_word" = "x-arch"; then
-	   ac_prev=arch
-	 fi
-       done
+## ----------------------------------------------------------------------
+## Production flags?  Save the value in $CONFIG_MODE so we have it for
+## the record.
+##
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for production mode" >&5
+$as_echo_n "checking for production mode... " >&6; }
+# Check whether --enable-production was given.
+if test "${enable_production+set}" = set; then :
+  enableval=$enable_production;
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    if test $ac_cv_c_bigendian = unknown; then
-      # See if sys/param.h defines the BYTE_ORDER macro.
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <sys/types.h>
-	     #include <sys/param.h>
 
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
-		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
-		     && LITTLE_ENDIAN)
-	      bogus endian macros
-	     #endif
 
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  # It does; now see whether it defined to BIG_ENDIAN or not.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+case "X-$enable_production" in
+  X-yes)
+    enable_production="yes"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: production" >&5
+$as_echo "production" >&6; }
+    CONFIG_MODE=production
+    H5_CFLAGS="$H5_CFLAGS $PROD_CFLAGS"
+    H5_CPPFLAGS="$H5_CPPFLAGS $PROD_CPPFLAGS"
+    H5_CXXFLAGS="$H5_CXXFLAGS $PROD_CXXFLAGS"
+    H5_FCFLAGS="$H5_FCFLAGS $PROD_FCFLAGS"
+    ;;
+  X-|X-no)
+    enable_production="no"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: development" >&5
+$as_echo "development" >&6; }
+    CONFIG_MODE=development
+    H5_CFLAGS="$H5_CFLAGS $DEBUG_CFLAGS"
+    H5_CPPFLAGS="$H5_CPPFLAGS $DEBUG_CPPFLAGS"
+    H5_CXXFLAGS="$H5_CXXFLAGS $DEBUG_CXXFLAGS"
+    H5_FCFLAGS="$H5_FCFLAGS $DEBUG_FCFLAGS"
+    ;;
+  X-pg|X-profile)
+    enable_production="profile"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: profile" >&5
+$as_echo "profile" >&6; }
+    CONFIG_MODE=profile
+    H5_CFLAGS="$H5_CFLAGS $PROFILE_CFLAGS"
+    H5_CPPFLAGS="$H5_CPPFLAGS $PROFILE_CPPFLAGS"
+    H5_CXXFLAGS="$H5_CXXFLAGS $PROFILE_CXXFLAGS"
+    H5_FCFLAGS="$H5_FCFLAGS $PROFILE_FCFLAGS"
+    ;;
+  *)
+    enable_production="user-defined"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: user-defined" >&5
+$as_echo "user-defined" >&6; }
+    CONFIG_MODE="$enableval"
+    ;;
+esac
+
+## ----------------------------------------------------------------------
+## Check for system libraries. "dl" stands for dynamically loaded library
+##
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ceil in -lm" >&5
+$as_echo_n "checking for ceil in -lm... " >&6; }
+if ${ac_cv_lib_m_ceil+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lm  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <sys/types.h>
-		#include <sys/param.h>
 
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ceil ();
 #ifdef FC_DUMMY_MAIN
 #ifndef FC_DUMMY_MAIN_EQ_F77
 #  ifdef __cplusplus
@@ -22528,29 +22957,48 @@ if ac_fn_c_try_compile "$LINENO"; then :
 int
 main ()
 {
-#if BYTE_ORDER != BIG_ENDIAN
-		 not big endian
-		#endif
-
+return ceil ();
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_bigendian=yes
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_m_ceil=yes
 else
-  ac_cv_c_bigendian=no
+  ac_cv_lib_m_ceil=no
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    fi
-    if test $ac_cv_c_bigendian = unknown; then
-      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_ceil" >&5
+$as_echo "$ac_cv_lib_m_ceil" >&6; }
+if test "x$ac_cv_lib_m_ceil" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBM 1
+_ACEOF
+
+  LIBS="-lm $LIBS"
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <limits.h>
 
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
 #ifdef FC_DUMMY_MAIN
 #ifndef FC_DUMMY_MAIN_EQ_F77
 #  ifdef __cplusplus
@@ -22562,19 +23010,46 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 int
 main ()
 {
-#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
-	      bogus endian macros
-	     #endif
-
+return dlopen ();
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  # It does; now see whether it defined to _BIG_ENDIAN or not.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBDL 1
+_ACEOF
+
+  LIBS="-ldl $LIBS"
+
+fi
+
+
+## ----------------------------------------------------------------------
+## Check for system header files.
+##
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <limits.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
 
 #ifdef FC_DUMMY_MAIN
 #ifndef FC_DUMMY_MAIN_EQ_F77
@@ -22587,79 +23062,114 @@ if ac_fn_c_try_compile "$LINENO"; then :
 int
 main ()
 {
-#ifndef _BIG_ENDIAN
-		 not big endian
-		#endif
 
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  ac_cv_c_bigendian=yes
+  ac_cv_header_stdc=yes
 else
-  ac_cv_c_bigendian=no
+  ac_cv_header_stdc=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-    fi
-    if test $ac_cv_c_bigendian = unknown; then
-      # Compile a test program.
-      if test "$cross_compiling" = yes; then :
-  # Try to guess by grepping values from an object file.
-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-short int ascii_mm[] =
-		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
-		short int ascii_ii[] =
-		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
-		int use_ascii (int i) {
-		  return ascii_mm[i] + ascii_ii[i];
-		}
-		short int ebcdic_ii[] =
-		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
-		short int ebcdic_mm[] =
-		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
-		int use_ebcdic (int i) {
-		  return ebcdic_mm[i] + ebcdic_ii[i];
-		}
-		extern int foo;
+#include <stdlib.h>
 
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
 #endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
 int
 main ()
 {
-return use_ascii (foo) == use_ebcdic (foo);
-  ;
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
-	      ac_cv_c_bigendian=yes
-	    fi
-	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
-	      if test "$ac_cv_c_bigendian" = unknown; then
-		ac_cv_c_bigendian=no
-	      else
-		# finding both strings is unlikely to happen, but who knows?
-		ac_cv_c_bigendian=unknown
-	      fi
-	    fi
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
 fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5
+$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; }
+if ${ac_cv_header_time+:} false; then :
+  $as_echo_n "(cached) " >&6
 else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-$ac_includes_default
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
 #ifdef FC_DUMMY_MAIN
 #ifndef FC_DUMMY_MAIN_EQ_F77
 #  ifdef __cplusplus
@@ -22671,379 +23181,568 @@ $ac_includes_default
 int
 main ()
 {
-
-	     /* Are we little or big endian?  From Harbison&Steele.  */
-	     union
-	     {
-	       long int l;
-	       char c[sizeof (long int)];
-	     } u;
-	     u.l = 1;
-	     return u.c[sizeof (long int) - 1] == 1;
-
+if ((struct tm *) 0)
+return 0;
   ;
   return 0;
 }
 _ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  ac_cv_c_bigendian=no
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_time=yes
 else
-  ac_cv_c_bigendian=yes
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
+  ac_cv_header_time=no
 fi
-
-    fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
-$as_echo "$ac_cv_c_bigendian" >&6; }
- case $ac_cv_c_bigendian in #(
-   yes)
-     $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
-;; #(
-   no)
-      ;; #(
-   universal)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5
+$as_echo "$ac_cv_header_time" >&6; }
+if test $ac_cv_header_time = yes; then
 
-$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h
+$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h
 
-     ;; #(
-   *)
-     as_fn_error $? "unknown endianness
- presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
- esac
+fi
 
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5
-$as_echo_n "checking size of char... " >&6; }
-if ${ac_cv_sizeof_char+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char"        "$ac_includes_default"; then :
 
-else
-  if test "$ac_cv_type_char" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (char)
-See \`config.log' for more details" "$LINENO" 5; }
-   else
-     ac_cv_sizeof_char=0
-   fi
-fi
+## Unix
+for ac_header in sys/resource.h sys/time.h unistd.h sys/ioctl.h sys/stat.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5
-$as_echo "$ac_cv_sizeof_char" >&6; }
-
 
+done
 
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_CHAR $ac_cv_sizeof_char
+for ac_header in sys/socket.h sys/types.h sys/file.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
 _ACEOF
 
+fi
 
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
-$as_echo_n "checking size of short... " >&6; }
-if ${ac_cv_sizeof_short+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short"        "$ac_includes_default"; then :
+done
 
-else
-  if test "$ac_cv_type_short" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (short)
-See \`config.log' for more details" "$LINENO" 5; }
-   else
-     ac_cv_sizeof_short=0
-   fi
-fi
+for ac_header in stddef.h setjmp.h features.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5
-$as_echo "$ac_cv_sizeof_short" >&6; }
-
 
+done
 
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_SHORT $ac_cv_sizeof_short
+for ac_header in dirent.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "dirent.h" "ac_cv_header_dirent_h" "$ac_includes_default"
+if test "x$ac_cv_header_dirent_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DIRENT_H 1
 _ACEOF
 
+fi
 
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
-$as_echo_n "checking size of int... " >&6; }
-if ${ac_cv_sizeof_int+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int"        "$ac_includes_default"; then :
+done
 
-else
-  if test "$ac_cv_type_int" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (int)
-See \`config.log' for more details" "$LINENO" 5; }
-   else
-     ac_cv_sizeof_int=0
-   fi
+for ac_header in stdint.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdint_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_STDINT_H 1
+_ACEOF
+ C9x=yes
 fi
 
+done
+
+for ac_header in stdbool.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "stdbool.h" "ac_cv_header_stdbool_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdbool_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_STDBOOL_H 1
+_ACEOF
+
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
-$as_echo "$ac_cv_sizeof_int" >&6; }
 
+done
 
 
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_INT $ac_cv_sizeof_int
+## Darwin
+for ac_header in mach/mach_time.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "mach/mach_time.h" "ac_cv_header_mach_mach_time_h" "$ac_includes_default"
+if test "x$ac_cv_header_mach_mach_time_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_MACH_MACH_TIME_H 1
 _ACEOF
 
+fi
 
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of unsigned" >&5
-$as_echo_n "checking size of unsigned... " >&6; }
-if ${ac_cv_sizeof_unsigned+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (unsigned))" "ac_cv_sizeof_unsigned"        "$ac_includes_default"; then :
+done
 
-else
-  if test "$ac_cv_type_unsigned" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (unsigned)
-See \`config.log' for more details" "$LINENO" 5; }
-   else
-     ac_cv_sizeof_unsigned=0
-   fi
-fi
+## Also need to detect Darwin for pubconf
+case $host_os in
+  darwin*)
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_unsigned" >&5
-$as_echo "$ac_cv_sizeof_unsigned" >&6; }
+$as_echo "#define HAVE_DARWIN 1" >>confdefs.h
+
+  ;;
+esac
+
+## Windows
+case "`uname`" in
+  CYGWIN*)
+    for ac_header in io.h sys/timeb.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
 
+fi
 
+done
 
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_UNSIGNED $ac_cv_sizeof_unsigned
+    ;;
+  MINGW*)
+    for ac_header in io.h winsock2.h sys/timeb.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
 _ACEOF
 
+fi
+
+done
 
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
-$as_echo_n "checking size of long... " >&6; }
-if ${ac_cv_sizeof_long+:} false; then :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lws2_32" >&5
+$as_echo_n "checking for main in -lws2_32... " >&6; }
+if ${ac_cv_lib_ws2_32_main+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long"        "$ac_includes_default"; then :
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lws2_32  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
 
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+return main ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_ws2_32_main=yes
 else
-  if test "$ac_cv_type_long" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (long)
-See \`config.log' for more details" "$LINENO" 5; }
-   else
-     ac_cv_sizeof_long=0
-   fi
+  ac_cv_lib_ws2_32_main=no
 fi
-
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
-$as_echo "$ac_cv_sizeof_long" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG $ac_cv_sizeof_long
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ws2_32_main" >&5
+$as_echo "$ac_cv_lib_ws2_32_main" >&6; }
+if test "x$ac_cv_lib_ws2_32_main" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBWS2_32 1
 _ACEOF
 
+  LIBS="-lws2_32 $LIBS"
 
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5
-$as_echo_n "checking size of long long... " >&6; }
-if ${ac_cv_sizeof_long_long+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long"        "$ac_includes_default"; then :
-
-else
-  if test "$ac_cv_type_long_long" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (long long)
-See \`config.log' for more details" "$LINENO" 5; }
-   else
-     ac_cv_sizeof_long_long=0
-   fi
 fi
+ac_cv_lib_ws2_32=ac_cv_lib_ws2_32_main
+
+    ;;
+  *)
+    for ac_header in io.h winsock2.h sys/timeb.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5
-$as_echo "$ac_cv_sizeof_long_long" >&6; }
 
+done
 
+    ;;
+esac
 
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
-_ACEOF
+## ----------------------------------------------------------------------
+## Some platforms require that all symbols are resolved when a library
+## is linked. We can use the -no-undefined flag to tell libtool that
+## it will be able to build shared libraries on these architectures,
+## as it will not do so by default.
+##
+if test "X${enable_shared}" = "Xyes"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool needs -no-undefined flag to build shared libraries" >&5
+$as_echo_n "checking if libtool needs -no-undefined flag to build shared libraries... " >&6; }
+  case "`uname`" in
+    CYGWIN*|MINGW*|AIX*)
+      ## Add in the -no-undefined flag to LDFLAGS for libtool.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+      H5_LDFLAGS="$H5_LDFLAGS -no-undefined"
+      ;;
+    *)
+      ## Don't add in anything.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      ;;
+  esac
+fi
 
+## ----------------------------------------------------------------------
+## Use the macro _AC_SYS_LARGEFILE_MACRO_VALUE to test defines
+## that might need to be set for largefile support to behave
+## correctly. This macro is defined in acsite.m4 and overrides
+## the version provided by Autoconf (as of v2.65). The custom
+## macro additionally adds the appropriate defines to AM_CPPFLAGS
+## so that later configure checks have them visible.
 
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of __int64" >&5
-$as_echo_n "checking size of __int64... " >&6; }
-if ${ac_cv_sizeof___int64+:} false; then :
+## Check for _FILE_OFFSET_BITS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
+$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
+if ${ac_cv_sys_file_offset_bits+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int64))" "ac_cv_sizeof___int64"        "$ac_includes_default"; then :
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
 
-else
-  if test "$ac_cv_type___int64" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (__int64)
-See \`config.log' for more details" "$LINENO" 5; }
-   else
-     ac_cv_sizeof___int64=0
-   fi
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=no; break
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _FILE_OFFSET_BITS 64
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_file_offset_bits=64; break
 fi
-
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_file_offset_bits=unknown
+  break
+done
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof___int64" >&5
-$as_echo "$ac_cv_sizeof___int64" >&6; }
-
-
-
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
+$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
+case $ac_cv_sys_file_offset_bits in #(
+  no | unknown) ;;
+  *)
 cat >>confdefs.h <<_ACEOF
-#define SIZEOF___INT64 $ac_cv_sizeof___int64
+#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
 _ACEOF
 
+     AM_CPPFLAGS="-D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits $AM_CPPFLAGS";;
+esac
+rm -rf conftest*
 
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5
-$as_echo_n "checking size of float... " >&6; }
-if ${ac_cv_sizeof_float+:} false; then :
+## Check for _LARGE_FILES
+if test "$ac_cv_sys_file_offset_bits" = unknown; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
+$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
+if ${ac_cv_sys_large_files+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float"        "$ac_includes_default"; then :
+  while :; do
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
 
-else
-  if test "$ac_cv_type_float" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (float)
-See \`config.log' for more details" "$LINENO" 5; }
-   else
-     ac_cv_sizeof_float=0
-   fi
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=no; break
 fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#define _LARGE_FILES 1
+#include <sys/types.h>
+ /* Check that off_t can represent 2**63 - 1 correctly.
+    We can't simply define LARGE_OFF_T to be 9223372036854775807,
+    since some C++ compilers masquerading as C compilers
+    incorrectly reject 9223372036854775807.  */
+#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
+  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
+		       && LARGE_OFF_T % 2147483647 == 1)
+		      ? 1 : -1];
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
 
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_sys_large_files=1; break
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_float" >&5
-$as_echo "$ac_cv_sizeof_float" >&6; }
-
-
-
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  ac_cv_sys_large_files=unknown
+  break
+done
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
+$as_echo "$ac_cv_sys_large_files" >&6; }
+case $ac_cv_sys_large_files in #(
+  no | unknown) ;;
+  *)
 cat >>confdefs.h <<_ACEOF
-#define SIZEOF_FLOAT $ac_cv_sizeof_float
+#define _LARGE_FILES $ac_cv_sys_large_files
 _ACEOF
 
+     AM_CPPFLAGS="-D_LARGE_FILES=$ac_cv_sys_large_files $AM_CPPFLAGS";;
+esac
+rm -rf conftest*
+fi
 
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5
-$as_echo_n "checking size of double... " >&6; }
-if ${ac_cv_sizeof_double+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double"        "$ac_includes_default"; then :
+## ----------------------------------------------------------------------
+## Add necessary defines for Linux Systems.
+##
+case "$host_cpu-$host_vendor-$host_os" in
+  *linux*)
+    ## Make available various LFS-related routines using the following
+    ## _LARGEFILE*_SOURCE macros.
+    AM_CPPFLAGS="-D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE $AM_CPPFLAGS"
 
-else
-  if test "$ac_cv_type_double" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (double)
-See \`config.log' for more details" "$LINENO" 5; }
-   else
-     ac_cv_sizeof_double=0
-   fi
-fi
+    ## Add POSIX support on Linux systems, so <features.h> defines
+    ## __USE_POSIX, which is required to get the prototype for fdopen
+    ## defined correctly in <stdio.h>.
+    ##
+    ## This flag was removed from h5cc as of 2009-10-17 when it was found
+    ## that the flag broke compiling netCDF-4 code with h5cc, but kept in
+    ## H5_CPPFLAGS because fdopen and HDfdopen fail without it. HDfdopen
+    ## is used only by H5_debug_mask which is used only when debugging in
+    ## H5_init_library (all in H5.c).  When the flag was removed this was
+    ## the only compile failure noted.
+    ##
+    ## This was originally defined as _POSIX_SOURCE which was updated to
+    ## _POSIX_C_SOURCE=199506L to expose a greater amount of POSIX
+    ## functionality so clock_gettime and CLOCK_MONOTONIC are defined
+    ## correctly. This was later updated to 200112L so that
+    ## posix_memalign() is visible for the direct VFD code on Linux
+    ## systems.
+    ##
+    ## POSIX feature information can be found in the gcc manual at:
+    ## http://www.gnu.org/s/libc/manual/html_node/Feature-Test-Macros.html
+    H5_CPPFLAGS="-D_POSIX_C_SOURCE=200112L $H5_CPPFLAGS"
 
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_double" >&5
-$as_echo "$ac_cv_sizeof_double" >&6; }
+    ## Need to add this so that O_DIRECT is visible for the direct
+    ## VFD on Linux systems.
+    H5_CPPFLAGS="-D_GNU_SOURCE $H5_CPPFLAGS"
+    ;;
+esac
 
+## Need to add the AM_ and H5_ into CFLAGS/CPPFLAGS to make them visible
+## for configure checks.
+## Note: Both will be restored by the end of configure.
+CPPFLAGS="$H5_CPPFLAGS $AM_CPPFLAGS $CPPFLAGS"
+CFLAGS="$H5_CFLAGS $AM_CFLAGS $CFLAGS"
 
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_DOUBLE $ac_cv_sizeof_double
-_ACEOF
+#include <sys/types.h>
 
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+off64_t n = 0;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  for ac_func in lseek64 fseeko64 ftello64 ftruncate64
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
 
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5
-$as_echo_n "checking size of long double... " >&6; }
-if ${ac_cv_sizeof_long_double+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double"        "$ac_includes_default"; then :
+fi
+done
 
 else
-  if test "$ac_cv_type_long_double" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (long double)
-See \`config.log' for more details" "$LINENO" 5; }
-   else
-     ac_cv_sizeof_long_double=0
-   fi
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: skipping test for lseek64, fseeko64 , ftello64, ftruncate64 because off64_t is not defined" >&5
+$as_echo "skipping test for lseek64, fseeko64 , ftello64, ftruncate64 because off64_t is not defined" >&6; }
 fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+for ac_func in fseeko ftello
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
 
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_double" >&5
-$as_echo "$ac_cv_sizeof_long_double" >&6; }
+done
 
 
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
 
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+struct stat64 sb;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  for ac_func in stat64 fstat64
+do :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
 _ACEOF
 
+fi
+done
 
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: skipping test for stat64 and fstat64" >&5
+$as_echo "skipping test for stat64 and fstat64" >&6; }
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
 ## Checkpoint the cache
 cat >confcache <<\_ACEOF
@@ -24109,6 +24808,49 @@ _ACEOF
 
 
 
+if test "X$C9x" = "Xyes"; then
+  cat >>confdefs.h <<\EOF
+#ifdef HAVE_STDBOOL_H
+#include <stdbool.h> /* for bool definition */
+#else
+#define bool _Bool
+#endif
+EOF
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of bool" >&5
+$as_echo_n "checking size of bool... " >&6; }
+if ${ac_cv_sizeof_bool+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (bool))" "ac_cv_sizeof_bool"        "$ac_includes_default"; then :
+
+else
+  if test "$ac_cv_type_bool" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (bool)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_bool=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_bool" >&5
+$as_echo "$ac_cv_sizeof_bool" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_BOOL $ac_cv_sizeof_bool
+_ACEOF
+
+
+fi
+
 ## Checkpoint the cache
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -24233,7 +24975,6 @@ $as_echo "yes" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
@@ -24919,7 +25660,7 @@ $as_echo_n "checking for szlib encoder... " >&6; }
   if test -z "$LD_LIBRARY_PATH"; then
     export LD_LIBRARY_PATH="$szlib_lib"
   else
-    export LD_LIBRARY_PATH="$szlib_lib:$LD_LIBRARY_PATH"
+    export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$szlib_lib"
   fi
 
    LL_PATH="$LD_LIBRARY_PATH"
@@ -24936,16 +25677,29 @@ else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-        #include <szlib.h>
+                #include "szlib.h"
+
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
 
-        int main(void)
-        {
                 /* SZ_encoder_enabled returns 1 if encoder is present */
-            if(SZ_encoder_enabled() == 1)
-                exit(0);
-            else
-                exit(1);
-        }
+                if(SZ_encoder_enabled() == 1)
+                    exit(0);
+                else
+                    exit(1);
+
+  ;
+  return 0;
+}
 
 _ACEOF
 if ac_fn_c_try_run "$LINENO"; then :
@@ -24957,6 +25711,7 @@ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
   conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
 
+
 fi
 
 
@@ -25097,6 +25852,10 @@ if test "${enable_threadsafe+set}" = set; then :
 fi
 
 
+## NOTE: The high-level, C++, and Fortran interfaces are not compatible
+## with the thread-safety option because the lock is not hoisted
+## into the higher-level API calls.
+
 ## --enable-threadsafe is incompatible with --enable-hl unless
 ## --enable-unsupported has been specified on the configure line.
 ##
@@ -25117,7 +25876,7 @@ if test "X${ALLOW_UNSUPPORTED}" != "Xyes"; then
   fi
 fi
 
-## --enable-threadsafe is also incompatible with --enable-fortran, unless
+## --enable-threadsafe is also incompatible with --enable-fortran unless
 ## --enable-unsupported has been specified on the configure line.
 if test "X${ALLOW_UNSUPPORTED}" != "Xyes"; then
   if test "X${HDF_FORTRAN}" = "Xyes" -a "X${enable_threadsafe}" = "Xyes"; then
@@ -25125,6 +25884,7 @@ if test "X${ALLOW_UNSUPPORTED}" != "Xyes"; then
   fi
 fi
 
+
 case "X-$THREADSAFE" in
   X-|X-no)
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
@@ -25148,14 +25908,14 @@ $as_echo "#define HAVE_THREADSAFE 1" >>confdefs.h
 
 
     ## ----------------------------------------------------------------------
-    ## Is the pthreads library present?  It has a header file `pthread.h' and
+    ## Is the Pthreads library present?  It has a header file `pthread.h' and
     ## a library `-lpthread' and their locations might be specified with the
     ## `--with-pthread' command-line switch.  The value is an include path
     ## and/or a library path.  If the library path is specified then it must
     ## be preceded by a comma.
     ##
     ## Thread-safety in HDF5 only uses Pthreads via configure, so the
-    ## default is "yes", though this only has an effect when
+    ## default is "check", though this only has an effect when
     ## --enable-threadsafe is specified.
      HAVE_PTHREAD=yes
 
@@ -25163,12 +25923,12 @@ $as_echo "#define HAVE_THREADSAFE 1" >>confdefs.h
 if test "${with_pthread+set}" = set; then :
   withval=$with_pthread;
 else
-  withval=yes
+  withval=check
 fi
 
 
     case "$withval" in
-      yes)
+      check | yes)
         for ac_header in pthread.h
 do :
   ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
@@ -25241,86 +26001,208 @@ fi
 
         fi
         ;;
-      no)
-        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread" >&5
-$as_echo_n "checking for pthread... " >&6; }
-        { $as_echo "$as_me:${as_lineno-$LINENO}: result: suppressed" >&5
-$as_echo "suppressed" >&6; }
-        unset HAVE_PTHREAD
-        ;;
-      *)
-        case "$withval" in
-          *,*)
-            pthread_inc="`echo $withval | cut -f1 -d,`"
-            pthread_lib="`echo $withval | cut -f2 -d, -s`"
-            ;;
-          *)
-            if test -n "$withval"; then
-              pthread_inc="$withval/include"
-              pthread_lib="$withval/lib"
-            fi
-            ;;
-        esac
-
-        if test -n "$pthread_inc"; then
-          saved_CPPFLAGS="$CPPFLAGS"
-          saved_AM_CPPFLAGS="$AM_CPPFLAGS"
-          CPPFLAGS="$CPPFLAGS -I$pthread_inc"
-          AM_CPPFLAGS="$AM_CPPFLAGS -I$pthread_inc"
-          for ac_header in pthread.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
-if test "x$ac_cv_header_pthread_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_PTHREAD_H 1
-_ACEOF
-
-else
-  CPPFLAGS="$saved_CPPFLAGS"; AM_CPPFLAGS="$saved_AM_CPPFLAGS"; unset HAVE_PTHREAD
-fi
-
-done
-
-        else
-          for ac_header in pthread.h
-do :
-  ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
-if test "x$ac_cv_header_pthread_h" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_PTHREAD_H 1
-_ACEOF
-
-else
-  unset HAVE_PTHREAD
-fi
-
-done
-
-        fi
+      no)
+        as_fn_error $? "Must use Pthreads with thread safety" "$LINENO" 5
+        ;;
+      *)
+        case "$withval" in
+          *,*)
+            pthread_inc="`echo $withval | cut -f1 -d,`"
+            pthread_lib="`echo $withval | cut -f2 -d, -s`"
+            ;;
+          *)
+            if test -n "$withval"; then
+              pthread_inc="$withval/include"
+              pthread_lib="$withval/lib"
+            fi
+            ;;
+        esac
+
+        if test -n "$pthread_inc"; then
+          saved_CPPFLAGS="$CPPFLAGS"
+          saved_AM_CPPFLAGS="$AM_CPPFLAGS"
+          CPPFLAGS="$CPPFLAGS -I$pthread_inc"
+          AM_CPPFLAGS="$AM_CPPFLAGS -I$pthread_inc"
+          for ac_header in pthread.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_pthread_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_PTHREAD_H 1
+_ACEOF
+
+else
+  CPPFLAGS="$saved_CPPFLAGS"; AM_CPPFLAGS="$saved_AM_CPPFLAGS"; unset HAVE_PTHREAD
+fi
+
+done
+
+        else
+          for ac_header in pthread.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_pthread_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_PTHREAD_H 1
+_ACEOF
+
+else
+  unset HAVE_PTHREAD
+fi
+
+done
+
+        fi
+
+        if test "x$HAVE_PTHREAD" = "xyes"; then
+          if test -n "$pthread_lib"; then
+            saved_LDFLAGS="$LDFLAGS"
+            saved_AM_LDFLAGS="$AM_LDFLAGS"
+            LDFLAGS="$LDFLAGS -L$pthread_lib"
+            AM_LDFLAGS="$AM_LDFLAGS -L$pthread_lib"
+            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_self in -lpthread" >&5
+$as_echo_n "checking for pthread_self in -lpthread... " >&6; }
+if ${ac_cv_lib_pthread_pthread_self+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pthread_self ();
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+return pthread_self ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_pthread_pthread_self=yes
+else
+  ac_cv_lib_pthread_pthread_self=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_self" >&5
+$as_echo "$ac_cv_lib_pthread_pthread_self" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_self" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBPTHREAD 1
+_ACEOF
+
+  LIBS="-lpthread $LIBS"
+
+else
+  LDFLAGS="$saved_LDFLAGS"; AM_LDFLAGS="$saved_AM_LDFLAGS"; unset HAVE_PTHREAD
+fi
+
+          else
+            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_self in -lpthread" >&5
+$as_echo_n "checking for pthread_self in -lpthread... " >&6; }
+if ${ac_cv_lib_pthread_pthread_self+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pthread_self ();
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+return pthread_self ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_pthread_pthread_self=yes
+else
+  ac_cv_lib_pthread_pthread_self=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_self" >&5
+$as_echo "$ac_cv_lib_pthread_pthread_self" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_self" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBPTHREAD 1
+_ACEOF
+
+  LIBS="-lpthread $LIBS"
+
+else
+  unset HAVE_PTHREAD
+fi
+
+          fi
+        fi
+        ;;
+    esac
 
-        if test "x$HAVE_PTHREAD" = "xyes"; then
-          if test -n "$pthread_lib"; then
-            saved_LDFLAGS="$LDFLAGS"
-            saved_AM_LDFLAGS="$AM_LDFLAGS"
-            LDFLAGS="$LDFLAGS -L$pthread_lib"
-            AM_LDFLAGS="$AM_LDFLAGS -L$pthread_lib"
-            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_self in -lpthread" >&5
-$as_echo_n "checking for pthread_self in -lpthread... " >&6; }
-if ${ac_cv_lib_pthread_pthread_self+:} false; then :
+    ## ----------------------------------------------------------------------
+    ## Check if pthread_attr_setscope(&attribute, PTHREAD_SCOPE_SYSTEM)
+    ## is supported on this system
+    ##
+    ## Unfortunately, this probably needs to be an AC_RUN_IFELSE since
+    ## it's impossible to determine if PTHREAD_SCOPE_SYSTEM is
+    ## supported a priori. POSIX.1-2001 requires that a conformant
+    ## system need only support one of SYSTEM or PROCESS scopes.
+    ##
+    ## For cross-compiling, we've added a pessimistic 'no'. You can
+    ## hand-hack the config file if you know otherwise.
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking Pthreads supports system scope" >&5
+$as_echo_n "checking Pthreads supports system scope... " >&6; }
+    if ${hdf5_cv_system_scope_threads+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lpthread  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+  if test "$cross_compiling" = yes; then :
+  hdf5_cv_system_scope_threads=no
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char pthread_self ();
+            #if STDC_HEADERS
+            #include <stdlib.h>
+            #include <pthread.h>
+            #endif
+
 #ifdef FC_DUMMY_MAIN
 #ifndef FC_DUMMY_MAIN_EQ_F77
 #  ifdef __cplusplus
@@ -25332,93 +26214,43 @@ char pthread_self ();
 int
 main ()
 {
-return pthread_self ();
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_pthread_pthread_self=yes
-else
-  ac_cv_lib_pthread_pthread_self=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_self" >&5
-$as_echo "$ac_cv_lib_pthread_pthread_self" >&6; }
-if test "x$ac_cv_lib_pthread_pthread_self" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBPTHREAD 1
-_ACEOF
-
-  LIBS="-lpthread $LIBS"
 
-else
-  LDFLAGS="$saved_LDFLAGS"; AM_LDFLAGS="$saved_AM_LDFLAGS"; unset HAVE_PTHREAD
-fi
+              pthread_attr_t attribute;
+              int ret;
 
-          else
-            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_self in -lpthread" >&5
-$as_echo_n "checking for pthread_self in -lpthread... " >&6; }
-if ${ac_cv_lib_pthread_pthread_self+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lpthread  $LIBS"
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
+              pthread_attr_init(&attribute);
+              ret=pthread_attr_setscope(&attribute, PTHREAD_SCOPE_SYSTEM);
+              exit(ret==0 ? 0 : 1);
 
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char pthread_self ();
-#ifdef FC_DUMMY_MAIN
-#ifndef FC_DUMMY_MAIN_EQ_F77
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int FC_DUMMY_MAIN() { return 1; }
-#endif
-#endif
-int
-main ()
-{
-return pthread_self ();
   ;
   return 0;
 }
+
 _ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_pthread_pthread_self=yes
+if ac_fn_c_try_run "$LINENO"; then :
+  hdf5_cv_system_scope_threads=yes
 else
-  ac_cv_lib_pthread_pthread_self=no
+  hdf5_cv_system_scope_threads=no
 fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_self" >&5
-$as_echo "$ac_cv_lib_pthread_pthread_self" >&6; }
-if test "x$ac_cv_lib_pthread_pthread_self" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBPTHREAD 1
-_ACEOF
-
-  LIBS="-lpthread $LIBS"
 
-else
-  unset HAVE_PTHREAD
 fi
 
-          fi
-        fi
-        ;;
-    esac
+
+    if test ${hdf5_cv_system_scope_threads} = "yes"; then
+
+$as_echo "#define SYSTEM_SCOPE_THREADS 1" >>confdefs.h
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+      { $as_echo "$as_me:${as_lineno-$LINENO}: Always 'no' if cross-compiling. Edit the config file if your platform supports pthread_attr_setscope(&attribute, PTHREAD_SCOPE_SYSTEM)." >&5
+$as_echo "$as_me: Always 'no' if cross-compiling. Edit the config file if your platform supports pthread_attr_setscope(&attribute, PTHREAD_SCOPE_SYSTEM)." >&6;}
+    fi
 fi
 
 ## ----------------------------------------------------------------------
@@ -25447,6 +26279,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 
   #include <sys/time.h>
   #include <time.h>
+
 #ifdef FC_DUMMY_MAIN
 #ifndef FC_DUMMY_MAIN_EQ_F77
 #  ifdef __cplusplus
@@ -25530,7 +26363,6 @@ $as_echo_n "checking for st_blocks in struct stat... " >&6; }
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-  #include <sys/stat.h>
 #ifdef FC_DUMMY_MAIN
 #ifndef FC_DUMMY_MAIN_EQ_F77
 #  ifdef __cplusplus
@@ -25542,10 +26374,11 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 int
 main ()
 {
-struct stat sb; sb.st_blocks=0;
+
   ;
   return 0;
-}
+}[
+  #include <sys/stat.h>],[struct stat sb; sb.st_blocks=0;])
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
 
@@ -25674,7 +26507,9 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 $as_echo_n "checking for TIOCGWINSZ... " >&6; }
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
+
 #include <sys/ioctl.h>
+
 #ifdef FC_DUMMY_MAIN
 #ifndef FC_DUMMY_MAIN_EQ_F77
 #  ifdef __cplusplus
@@ -25707,7 +26542,9 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 $as_echo_n "checking for TIOCGETD... " >&6; }
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
+
 #include <sys/ioctl.h>
+
 #ifdef FC_DUMMY_MAIN
 #ifndef FC_DUMMY_MAIN_EQ_F77
 #  ifdef __cplusplus
@@ -25806,7 +26643,7 @@ if test "$ac_res" != no; then :
 
 fi
 
-for ac_func in alarm clock_gettime difftime fork frexpf frexpl
+for ac_func in alarm clock_gettime difftime fcntl flock fork frexpf
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -25818,7 +26655,7 @@ _ACEOF
 fi
 done
 
-for ac_func in gethostname getpwuid getrusage gettimeofday
+for ac_func in frexpl gethostname getpwuid getrusage gettimeofday
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -26107,7 +26944,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 int
 main ()
 {
- const char *fname = __FUNCTION__;
+
   ;
   return 0;
 }
@@ -26183,17 +27020,30 @@ else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
-     #include <stdio.h>
-     #include <stdlib.h>
-     #include <string.h>
+            #include <stdio.h>
+            #include <stdlib.h>
+            #include <string.h>
 
-     int main(void)
-     {
-	char *s = malloc(128);
-	long long x = (long long)1048576 * (long long)1048576;
-	sprintf(s,"%${hdf5_cv_printf_ll}d",x);
-	exit(strcmp(s,"1099511627776"));
-     }
+#ifdef FC_DUMMY_MAIN
+#ifndef FC_DUMMY_MAIN_EQ_F77
+#  ifdef __cplusplus
+     extern "C"
+#  endif
+   int FC_DUMMY_MAIN() { return 1; }
+#endif
+#endif
+int
+main ()
+{
+
+            char *s = malloc(128);
+            long long x = (long long)1048576 * (long long)1048576;
+            sprintf(s,"%${hdf5_cv_printf_ll}d",x);
+            exit(strcmp(s,"1099511627776"));
+
+  ;
+  return 0;
+}
 
 _ACEOF
 if ac_fn_c_try_run "$LINENO"; then :
@@ -26215,62 +27065,6 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
-## ----------------------------------------------------------------------
-## Check if pthread_attr_setscope(&attribute, PTHREAD_SCOPE_SYSTEM)
-## is supported on this system
-##
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking Threads support system scope" >&5
-$as_echo_n "checking Threads support system scope... " >&6; }
-if ${hdf5_cv_system_scope_threads+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run test program while cross compiling
-See \`config.log' for more details" "$LINENO" 5; }
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-    #if STDC_HEADERS
-    #include <stdlib.h>
-    #include <pthread.h>
-    #endif
-
-    int main(void)
-    {
-      pthread_attr_t attribute;
-      int ret;
-
-      pthread_attr_init(&attribute);
-      ret=pthread_attr_setscope(&attribute, PTHREAD_SCOPE_SYSTEM);
-      exit(ret==0 ? 0 : 1);
-    }
-
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  hdf5_cv_system_scope_threads=yes
-else
-  hdf5_cv_system_scope_threads=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-
-
-if test ${hdf5_cv_system_scope_threads} = "yes"; then
-
-$as_echo "#define SYSTEM_SCOPE_THREADS 1" >>confdefs.h
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
 
 ## ----------------------------------------------------------------------
 ## Turn on debugging by setting compiler flags
@@ -26298,13 +27092,13 @@ all_packages="ac,b,b2,d,e,f,g,hg,hl,i,mf,mm,o,p,s,t,v,z"
 case "X-$DEBUG_PKG" in
   X-yes)
     DEBUG_PKG="d,e,f,g,hg,i,mm,o,p,s,t,v,z"
-    H5_CPPFLAGS="$H5_CPPFLAGS -UNDEBUG"
+##    H5_CPPFLAGS="$H5_CPPFLAGS -UNDEBUG"
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: default ($DEBUG_PKG)" >&5
 $as_echo "default ($DEBUG_PKG)" >&6; }
     ;;
   X-all)
     DEBUG_PKG=$all_packages
-    H5_CPPFLAGS="$H5_CPPFLAGS -UNDEBUG"
+##    H5_CPPFLAGS="$H5_CPPFLAGS -UNDEBUG"
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: all ($DEBUG_PKG)" >&5
 $as_echo "all ($DEBUG_PKG)" >&6; }
     ;;
@@ -26312,7 +27106,7 @@ $as_echo "all ($DEBUG_PKG)" >&6; }
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
 $as_echo "none" >&6; }
     DEBUG_PKG=
-    H5_CPPFLAGS="$H5_CPPFLAGS -DNDEBUG"
+##    H5_CPPFLAGS="$H5_CPPFLAGS -DNDEBUG"
     ;;
   *)
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DEBUG_PKG" >&5
@@ -26693,7 +27487,7 @@ $as_echo_n "checking whether a simple MPI-IO Fortran program can be linked... "
       cat > conftest.$ac_ext <<_ACEOF
 
           PROGRAM main
-          USE mpi
+          INCLUDE 'mpif.h'
           INTEGER :: comm, amode, info, fh, ierror
           CHARACTER(LEN=1) :: filename
           CALL MPI_File_open( comm, filename, amode, info, fh, ierror)
@@ -26779,7 +27573,9 @@ $as_echo_n "checking for MPI_Comm_c2f and MPI_Comm_f2c functions... " >&6; }
 
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <mpi.h>
+
+    #include <mpi.h>
+
 #ifdef FC_DUMMY_MAIN
 #ifndef FC_DUMMY_MAIN_EQ_F77
 #  ifdef __cplusplus
@@ -26800,7 +27596,7 @@ if ac_fn_c_try_link "$LINENO"; then :
 
 $as_echo "#define HAVE_MPI_MULTI_LANG_Comm 1" >>confdefs.h
 
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+                 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
@@ -26835,7 +27631,7 @@ if ac_fn_c_try_link "$LINENO"; then :
 
 $as_echo "#define HAVE_MPI_MULTI_LANG_Info 1" >>confdefs.h
 
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+                { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
@@ -27121,10 +27917,9 @@ fi
 ## ----------------------------------------------------------------------
 ## Check if Direct I/O driver is enabled by --enable-direct-vfd
 ##
-
-## Check these regardless. If the checks are moved inside the main
-## direct VFD block, the output is nested.
-
+## ----------------------------------------------------------------------
+## Check if Direct I/O driver is enabled by --enable-direct-vfd
+##
 if ${hdf5_cv_direct_io+:} false; then :
   $as_echo_n "(cached) " >&6
 else
@@ -27541,11 +28336,9 @@ fi
 
 ## ----------------------------------------------------------------------
 ## Set the flag to indicate that the machine can accurately convert
-## 'long double' to '(unsigned) long long' values. This flag should
-## be set for all machines, except for IBM XL C compilers. Historically,
-## this has also been a problem with OS X (version 10.4) but not current
-## versions of that OS.
-##
+## 'long double' to '(unsigned) long long' values.  (This flag should
+## be set for all machines, except for Mac OS 10.4, SGI IRIX64 6.5 and
+## Powerpc Linux using XL compilers.
 ## When the bit sequence of long double is 0x4351ccf385ebc8a0bfcc2a3c...,
 ## the values of (unsigned)long long start to go wrong on these
 ## two machines.  Adjusting it higher to 0x4351ccf385ebc8a0dfcc... or
@@ -27635,11 +28428,9 @@ fi
 
 ## ----------------------------------------------------------------------
 ## Set the flag to indicate that the machine can accurately convert
-## '(unsigned) long long' to 'long double' values. This flag should
-## be set for all machines, except for IBM XL C compilers. Historically,
-## this has also been a problem with OS X (version 10.4) but not current
-## versions of that OS.
-##
+## '(unsigned) long long' to 'long double' values.  (This flag should be
+## set for all machines, except for Mac OS 10.4 and Powerpc Linux using
+## XL compilers.
 ## When the bit sequences are 003fff..., 007fff..., 00ffff..., 01ffff...,
 ## ..., 7fffff..., the converted values are twice as big as they should be.
 ##
@@ -27910,7 +28701,7 @@ $as_echo_n "checking which version of public symbols to use by default... " >&6;
 if test "${with_default_api_version+set}" = set; then :
   withval=$with_default_api_version;
 else
-  withval=v18
+  withval=v110
 fi
 
 
@@ -27925,6 +28716,10 @@ elif test "X$withval" = "Xv18"; then
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: v18" >&5
 $as_echo "v18" >&6; }
     DEFAULT_API_VERSION=v18
+elif test "X$withval" = "Xv110"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: v110" >&5
+$as_echo "v110" >&6; }
+    DEFAULT_API_VERSION=v110
 else
     as_fn_error $? "invalid version of public symbols given" "$LINENO" 5
 fi
@@ -27934,7 +28729,7 @@ fi
 ## if the user insists on doing this via the --enable-unsupported configure
 ## flag, we'll let them.
 if test "X${ALLOW_UNSUPPORTED}" != "Xyes"; then
-  if test "X${DEFAULT_API_VERSION}" != "Xv18" -a "X${DEPRECATED_SYMBOLS}" = "Xno" ; then
+  if test "X${DEFAULT_API_VERSION}" != "Xv110" -a "X${DEPRECATED_SYMBOLS}" = "Xno" ; then
     as_fn_error $? "Removing old public API symbols not allowed when using them as default public API symbols. Use --enable-unsupported to override this error." "$LINENO" 5
   fi
 fi
@@ -28573,7 +29368,7 @@ Usage: $0 [OPTIONS]
 Report bugs to <bug-libtool at gnu.org>."
 
 lt_cl_version="\
-HDF5 config.lt 1.8.16
+HDF5 config.lt 1.10.0-alpha0
 configured by $0, generated by GNU Autoconf 2.69.
 
 Copyright (C) 2011 Free Software Foundation, Inc.
@@ -30087,7 +30882,7 @@ else
 fi
 
 
-ac_config_files="$ac_config_files src/libhdf5.settings Makefile src/Makefile test/Makefile test/testcheck_version.sh test/testerror.sh test/H5srcdir_str.h test/testlibinfo.sh test/testlinks_env.sh test/test_plugin.sh testpar/Makefile tools/Makefile tools/h5dump/Makefile tools/h5dump/testh5dump.sh tools/h5dump/testh5dumppbits.sh tools/h5dump/testh5dumpxml.sh tools/h5ls/testh5ls.sh tools/h5import/Makefile tools/h5import/h5importtestutil.sh tools/h5diff/Makefile tools/h5diff/testh5diff.sh t [...]
+ac_config_files="$ac_config_files src/libhdf5.settings Makefile src/Makefile test/Makefile test/testcheck_version.sh test/testerror.sh test/testflushrefresh.sh test/H5srcdir_str.h test/testlibinfo.sh test/testlinks_env.sh test/testswmr.sh test/test_plugin.sh test/test_usecases.sh test/testvdsswmr.sh testpar/Makefile tools/Makefile tools/h5dump/Makefile tools/h5dump/testh5dump.sh tools/h5dump/testh5dumppbits.sh tools/h5dump/testh5dumpvds.sh tools/h5dump/testh5dumpxml.sh tools/h5ls/testh5l [...]
 
 
 cat >confcache <<\_ACEOF
@@ -30227,26 +31022,7 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
   as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${FORTRAN_HAVE_SIZEOF_TRUE}" && test -z "${FORTRAN_HAVE_SIZEOF_FALSE}"; then
-  as_fn_error $? "conditional \"FORTRAN_HAVE_SIZEOF\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${FORTRAN_HAVE_C_SIZEOF_TRUE}" && test -z "${FORTRAN_HAVE_C_SIZEOF_FALSE}"; then
-  as_fn_error $? "conditional \"FORTRAN_HAVE_C_SIZEOF\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${FORTRAN_HAVE_STORAGE_SIZE_TRUE}" && test -z "${FORTRAN_HAVE_STORAGE_SIZE_FALSE}"; then
-  as_fn_error $? "conditional \"FORTRAN_HAVE_STORAGE_SIZE\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${FORTRAN_2003_CONDITIONAL_F_TRUE}" && test -z "${FORTRAN_2003_CONDITIONAL_F_FALSE}"; then
-  as_fn_error $? "conditional \"FORTRAN_2003_CONDITIONAL_F\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
-if test -z "${FORTRAN_DEFAULT_REALisDBLE_F_TRUE}" && test -z "${FORTRAN_DEFAULT_REALisDBLE_F_FALSE}"; then
-  as_fn_error $? "conditional \"FORTRAN_DEFAULT_REALisDBLE_F\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
+
 if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
   as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -30259,7 +31035,6 @@ if test -z "${USE_PLUGINS_CONDITIONAL_TRUE}" && test -z "${USE_PLUGINS_CONDITION
   as_fn_error $? "conditional \"USE_PLUGINS_CONDITIONAL\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-
 if test -z "${BUILD_SHARED_SZIP_CONDITIONAL_TRUE}" && test -z "${BUILD_SHARED_SZIP_CONDITIONAL_FALSE}"; then
   as_fn_error $? "conditional \"BUILD_SHARED_SZIP_CONDITIONAL\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -30689,7 +31464,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by HDF5 $as_me 1.8.16, which was
+This file was extended by HDF5 $as_me 1.10.0-alpha0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -30755,7 +31530,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-HDF5 config.status 1.8.16
+HDF5 config.status 1.10.0-alpha0
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -31349,6 +32124,7 @@ do
     "src/H5config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/H5config.h" ;;
     "pubconf") CONFIG_COMMANDS="$CONFIG_COMMANDS pubconf" ;;
     "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "fortran/src/H5config_f.inc") CONFIG_HEADERS="$CONFIG_HEADERS fortran/src/H5config_f.inc" ;;
     "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
     "src/libhdf5.settings") CONFIG_FILES="$CONFIG_FILES src/libhdf5.settings" ;;
     "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
@@ -31356,17 +32132,23 @@ do
     "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;;
     "test/testcheck_version.sh") CONFIG_FILES="$CONFIG_FILES test/testcheck_version.sh" ;;
     "test/testerror.sh") CONFIG_FILES="$CONFIG_FILES test/testerror.sh" ;;
+    "test/testflushrefresh.sh") CONFIG_FILES="$CONFIG_FILES test/testflushrefresh.sh" ;;
     "test/H5srcdir_str.h") CONFIG_FILES="$CONFIG_FILES test/H5srcdir_str.h" ;;
     "test/testlibinfo.sh") CONFIG_FILES="$CONFIG_FILES test/testlibinfo.sh" ;;
     "test/testlinks_env.sh") CONFIG_FILES="$CONFIG_FILES test/testlinks_env.sh" ;;
+    "test/testswmr.sh") CONFIG_FILES="$CONFIG_FILES test/testswmr.sh" ;;
     "test/test_plugin.sh") CONFIG_FILES="$CONFIG_FILES test/test_plugin.sh" ;;
+    "test/test_usecases.sh") CONFIG_FILES="$CONFIG_FILES test/test_usecases.sh" ;;
+    "test/testvdsswmr.sh") CONFIG_FILES="$CONFIG_FILES test/testvdsswmr.sh" ;;
     "testpar/Makefile") CONFIG_FILES="$CONFIG_FILES testpar/Makefile" ;;
     "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;;
     "tools/h5dump/Makefile") CONFIG_FILES="$CONFIG_FILES tools/h5dump/Makefile" ;;
     "tools/h5dump/testh5dump.sh") CONFIG_FILES="$CONFIG_FILES tools/h5dump/testh5dump.sh" ;;
     "tools/h5dump/testh5dumppbits.sh") CONFIG_FILES="$CONFIG_FILES tools/h5dump/testh5dumppbits.sh" ;;
+    "tools/h5dump/testh5dumpvds.sh") CONFIG_FILES="$CONFIG_FILES tools/h5dump/testh5dumpvds.sh" ;;
     "tools/h5dump/testh5dumpxml.sh") CONFIG_FILES="$CONFIG_FILES tools/h5dump/testh5dumpxml.sh" ;;
     "tools/h5ls/testh5ls.sh") CONFIG_FILES="$CONFIG_FILES tools/h5ls/testh5ls.sh" ;;
+    "tools/h5ls/testh5lsvds.sh") CONFIG_FILES="$CONFIG_FILES tools/h5ls/testh5lsvds.sh" ;;
     "tools/h5import/Makefile") CONFIG_FILES="$CONFIG_FILES tools/h5import/Makefile" ;;
     "tools/h5import/h5importtestutil.sh") CONFIG_FILES="$CONFIG_FILES tools/h5import/h5importtestutil.sh" ;;
     "tools/h5diff/Makefile") CONFIG_FILES="$CONFIG_FILES tools/h5diff/Makefile" ;;
@@ -31383,10 +32165,14 @@ do
     "tools/lib/Makefile") CONFIG_FILES="$CONFIG_FILES tools/lib/Makefile" ;;
     "tools/misc/Makefile") CONFIG_FILES="$CONFIG_FILES tools/misc/Makefile" ;;
     "tools/misc/h5cc") CONFIG_FILES="$CONFIG_FILES tools/misc/h5cc" ;;
+    "tools/misc/testh5clear.sh") CONFIG_FILES="$CONFIG_FILES tools/misc/testh5clear.sh" ;;
     "tools/misc/testh5mkgrp.sh") CONFIG_FILES="$CONFIG_FILES tools/misc/testh5mkgrp.sh" ;;
     "tools/misc/testh5repart.sh") CONFIG_FILES="$CONFIG_FILES tools/misc/testh5repart.sh" ;;
+    "tools/misc/vds/Makefile") CONFIG_FILES="$CONFIG_FILES tools/misc/vds/Makefile" ;;
     "tools/h5stat/testh5stat.sh") CONFIG_FILES="$CONFIG_FILES tools/h5stat/testh5stat.sh" ;;
     "tools/h5stat/Makefile") CONFIG_FILES="$CONFIG_FILES tools/h5stat/Makefile" ;;
+    "tools/h5format_convert/Makefile") CONFIG_FILES="$CONFIG_FILES tools/h5format_convert/Makefile" ;;
+    "tools/h5format_convert/testh5fc.sh") CONFIG_FILES="$CONFIG_FILES tools/h5format_convert/testh5fc.sh" ;;
     "tools/perform/Makefile") CONFIG_FILES="$CONFIG_FILES tools/perform/Makefile" ;;
     "examples/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;;
     "examples/run-c-ex.sh") CONFIG_FILES="$CONFIG_FILES examples/run-c-ex.sh" ;;
@@ -31402,6 +32188,7 @@ do
     "fortran/Makefile") CONFIG_FILES="$CONFIG_FILES fortran/Makefile" ;;
     "fortran/src/h5fc") CONFIG_FILES="$CONFIG_FILES fortran/src/h5fc" ;;
     "fortran/src/Makefile") CONFIG_FILES="$CONFIG_FILES fortran/src/Makefile" ;;
+    "fortran/src/H5fort_type_defines.h") CONFIG_FILES="$CONFIG_FILES fortran/src/H5fort_type_defines.h" ;;
     "fortran/test/Makefile") CONFIG_FILES="$CONFIG_FILES fortran/test/Makefile" ;;
     "fortran/testpar/Makefile") CONFIG_FILES="$CONFIG_FILES fortran/testpar/Makefile" ;;
     "fortran/examples/Makefile") CONFIG_FILES="$CONFIG_FILES fortran/examples/Makefile" ;;
@@ -31414,6 +32201,8 @@ do
     "hl/tools/Makefile") CONFIG_FILES="$CONFIG_FILES hl/tools/Makefile" ;;
     "hl/tools/gif2h5/Makefile") CONFIG_FILES="$CONFIG_FILES hl/tools/gif2h5/Makefile" ;;
     "hl/tools/gif2h5/h52giftest.sh") CONFIG_FILES="$CONFIG_FILES hl/tools/gif2h5/h52giftest.sh" ;;
+    "hl/tools/h5watch/Makefile") CONFIG_FILES="$CONFIG_FILES hl/tools/h5watch/Makefile" ;;
+    "hl/tools/h5watch/testh5watch.sh") CONFIG_FILES="$CONFIG_FILES hl/tools/h5watch/testh5watch.sh" ;;
     "hl/examples/Makefile") CONFIG_FILES="$CONFIG_FILES hl/examples/Makefile" ;;
     "hl/examples/run-hlc-ex.sh") CONFIG_FILES="$CONFIG_FILES hl/examples/run-hlc-ex.sh" ;;
     "hl/c++/Makefile") CONFIG_FILES="$CONFIG_FILES hl/c++/Makefile" ;;
@@ -32131,6 +32920,7 @@ $as_echo X"$file" |
   done
 }
  ;;
+    "fortran/src/H5config_f.inc":H) cat fortran/src/H5config_f.inc | sed '1d;s%^/\* \(.*\) \*/%\1%;s/#define /#define H5_/;s/#undef /#undef H5_/' >fortran/src/H5config_f.inc.tmp; mv -f fortran/src/H5config_f.inc.tmp fortran/src/H5config_f.inc ;;
     "libtool":C)
 
     # See if we are running on zsh, and set the options which allow our
@@ -33134,10 +33924,7 @@ fi
 ## linker flags:  -l with no library name; -l <libname>, specifically gfortran or m.
 ## This sed script corrects "-l <libname>" first and then "-l " with no library name.
 ## If the order is not preserved, all instances of "-l " will be removed.
-## The -i option for sed doesn't work on some systems, so a temporary file is used
-## and used to overwrite the original libtool file.
-sed -e '/^postdeps/ s/-l \(a-zA-Z\)/-l\1/g' -e '/^postdeps/ s/-l //g' libtool > libtool_rev
-mv -f libtool_rev libtool
+sed -e '/^postdeps/ s/-l \(a-zA-Z\)/-l\1/g' -e '/^postdeps/ s/-l //g' -i libtool
 
 ## show the configure settings
 cat src/libhdf5.settings
diff --git a/configure.ac b/configure.ac
index e85fa50..8e6a0bd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -16,7 +16,7 @@
 ## ----------------------------------------------------------------------
 ## Initialize configure.
 ##
-AC_REVISION($Id: configure.ac 28279 2015-11-04 22:29:54Z lrknox $)
+AC_REVISION($Id: configure.ac 22697 2012-08-19 14:35:47Z hdftest $)
 AC_PREREQ([2.69])
 
 ## AC_INIT takes the name of the package, the version number, and an
@@ -26,7 +26,8 @@ AC_PREREQ([2.69])
 ## NOTE: Do not forget to change the version number here when we do a
 ## release!!!
 ##
-AC_INIT([HDF5], [1.8.16], [help at hdfgroup.org])
+AC_INIT([HDF5], [1.10.0-alpha0], [help at hdfgroup.org])
+
 AC_CONFIG_SRCDIR([src/H5.c])
 AC_CONFIG_HEADERS([src/H5config.h])
 
@@ -39,15 +40,19 @@ AM_INIT_AUTOMAKE([foreign])
 AM_SILENT_RULES([yes])
 
 ## AM_MAINTAINER_MODE turns off "rebuild rules" that contain dependencies
-## for Makefiles, configure, src/H5config.h, etc.  If AM_MAINTAINER_MODE
-## is *not* included here, these files will be rebuilt if out of date.
-## This is a problem because if users try to build on a machine with
+## for Makefiles, configure, src/H5config.h, etc. If AM_MAINTAINER_MODE
+## is enabled, these files will be rebuilt if out of date. This is a
+## problem because if users try to build on a machine with
 ## the wrong versions of autoconf and automake, these files will be
 ## rebuilt with the wrong versions and bad things can happen.
 ## Also, CVS doesn't preserve dependencies between timestamps, so
 ## Makefiles will often think rebuilding needs to occur when it doesn't.
-## Developers should './configure --enable-maintainer-mode' to turn on
-## rebuild rules.
+##
+## By default, it is enabled. Users can configure with
+## --disable-maintainer-mode to prevent running the autotools.
+## AM_MAINTAINER_MODE([enable])
+##
+## Maintainer mode is disabled in releases.
 AM_MAINTAINER_MODE
 
 ## ----------------------------------------------------------------------
@@ -154,7 +159,6 @@ AC_MSG_RESULT([done])
 ## MPE: whether MPE option is enabled. Default no.
 ## STATIC_EXEC: whether static-exec is enabled. Default no.
 ## HDF_FORTRAN: whether Fortran is enabled. Default no.
-## HDF_FORTRAN2003: whether Fortran 2003 is enabled. Default no.
 ## FC: Fortran compiler.
 ## HDF_CXX: whether C++ is enabled. Default no.
 ## CXX: C++ compiler.
@@ -162,6 +166,7 @@ AC_MSG_RESULT([done])
 ## INSTRUMENT: whether INSTRUMENT is enabled. No default set here.
 ## CODESTACK: whether CODESTACK is enabled. Default no.
 ## HAVE_DMALLOC: whether system has dmalloc support. Default no.
+## HAVE_FLOAT128: whether system has Quad-Precision Math Library. Default no.
 ## DIRECT_VFD: whether DIRECT_VFD is enabled. Default no.
 ## THREADSAFE: whether THREADSAFE is enabled. Default no.
 ## STATIC_SHARED: whether static and/or shared libraries are requested.
@@ -173,9 +178,7 @@ AC_SUBST([EXTERNAL_FILTERS])
 AC_SUBST([MPE]) MPE=no
 AC_SUBST([STATIC_EXEC]) STATIC_EXEC=no
 AC_SUBST([HDF_FORTRAN]) HDF_FORTRAN=no
-AC_SUBST([HDF_FORTRAN2003]) HDF_FORTRAN2003=no
 AC_SUBST([FC]) HDF_FORTRAN=no
-AC_SUBST([FC2003]) HDF_FORTRAN2003=no
 AC_SUBST([HDF_CXX]) HDF_CXX=no
 AC_SUBST([CXX]) HDF_CXX=no
 AC_SUBST([HDF5_HL]) HDF5_HL=yes
@@ -188,11 +191,14 @@ AC_SUBST([STATIC_SHARED])
 AC_SUBST([enable_shared])
 AC_SUBST([enable_static])
 AC_SUBST([UNAME_INFO]) UNAME_INFO=`uname -a`
+AC_SUBST([PAC_C_MAX_REAL_PRECISION])
+AC_SUBST([Fortran_COMPILER_ID])
+Fortran_COMPILER_ID=none
 
 ## ----------------------------------------------------------------------
 ## Some platforms have broken basename, and/or xargs programs. Check
 ## that it actually does what it's supposed to do. Catch this early
-## since configure and scripts relies upon them heavily and there's 
+## since configure and scripts relies upon them heavily and there's
 ## no use continuing if it's broken.
 ##
 AC_MSG_CHECKING([if basename works])
@@ -334,7 +340,7 @@ AC_ARG_ENABLE([unsupported],
                               [Allow unsupported combinations of configure options])],
               [ALLOW_UNSUPPORTED=$enableval])
 
-case "X-$ALLOW_UNSUPPORTED" in 
+case "X-$ALLOW_UNSUPPORTED" in
   X-|X-no)
     AC_MSG_RESULT([no])
     ;;
@@ -346,13 +352,57 @@ case "X-$ALLOW_UNSUPPORTED" in
 esac
 
 ## ----------------------------------------------------------------------
+## Data types and their sizes.
+##
+AC_TYPE_OFF_T
+AC_CHECK_TYPE([size_t], [],
+        [AC_DEFINE_UNQUOTED([size_t], [unsigned long],
+                [Define to `unsigned long' if <sys/types.h> does not define.])])
+AC_CHECK_TYPE([ssize_t], [],
+        [AC_DEFINE_UNQUOTED([ssize_t], [long],
+                [Define to `long' if <sys/types.h> does not define.])])
+AC_CHECK_TYPE([ptrdiff_t], [],
+        [AC_DEFINE_UNQUOTED([ptrdiff_t], [long],
+                [Define to `long' if <sys/types.h> does not define.])])
+AC_C_BIGENDIAN
+AC_CHECK_SIZEOF([char])
+AC_CHECK_SIZEOF([short])
+AC_CHECK_SIZEOF([int])
+AC_CHECK_SIZEOF([unsigned])
+AC_CHECK_SIZEOF([long])
+AC_CHECK_SIZEOF([long long])
+AC_CHECK_SIZEOF([__int64])
+AC_CHECK_SIZEOF([float])
+AC_CHECK_SIZEOF([double])
+AC_CHECK_SIZEOF([long double])
+
+## Check for non-standard extenstion __FLOAT128
+HAVE_FLOAT128=0
+HAVE_QUADMATH=0
+FLT128_DIG=0
+LDBL_DIG=0
+
+AC_CHECK_SIZEOF([__float128])
+AC_CHECK_SIZEOF([_Quad])
+AC_CHECK_HEADERS([quadmath.h], [HAVE_QUADMATH=1], [])
+PAC_FC_LDBL_DIG
+
+if test "$ac_cv_sizeof___float128" != 0 && test "$FLT128_DIG" != 0 ; then
+  AC_DEFINE([HAVE_FLOAT128], [1], [Determine if __float128 is available])
+  PAC_C_MAX_REAL_PRECISION=$FLT128_DIG
+else
+  PAC_C_MAX_REAL_PRECISION=$LDBL_DIG
+fi
+AC_DEFINE_UNQUOTED([PAC_C_MAX_REAL_PRECISION], $PAC_C_MAX_REAL_PRECISION, [Determine the maximum decimal precision in C])
+AC_MSG_RESULT([$PAC_C_MAX_REAL_PRECISION])
+## ----------------------------------------------------------------------
 ## Check if they would like the Fortran interface compiled
 ##
 AC_SUBST([HDF5_INTERFACES]) HDF5_INTERFACES=""
 AC_MSG_CHECKING([if Fortran interface enabled])
 AC_ARG_ENABLE([fortran],
               [AS_HELP_STRING([--enable-fortran],
-                              [Compile the Fortran 90/95 interface [default=no]])],
+                              [Compile the Fortran interface [default=no]])],
               [HDF_FORTRAN=$enableval])
 
 if test "X$HDF_FORTRAN" = "Xyes"; then
@@ -361,36 +411,17 @@ else
   echo "no"
 fi
 
-
-## ----------------------------------------------------------------------
-## Check if they would like the Fortran 2003 interface compiled
-##
-AC_MSG_CHECKING([if Fortran 2003 interface enabled])
-AC_ARG_ENABLE([fortran2003],
-              [AS_HELP_STRING([--enable-fortran2003],
-                              [Compile the Fortran 2003 interface, must also specify --enable-fortran [default=no]])],
-              [HDF_FORTRAN2003=$enableval])
-
-## ----------------------------------------------------------------------
-## Check to make sure --enable-fortran is present if --enable-fortran2003 
-## was specified
-
-if test "X$HDF_FORTRAN2003" = "Xyes" && test "X$HDF_FORTRAN" = "Xno"; then
-  echo "no"
-  AC_MSG_ERROR([--enable-fortran must be used with --enable-fortran2003])
-else
-  if test "X$HDF_FORTRAN2003" = "Xyes" && test "X$HDF_FORTRAN" = "Xyes"; then
-    echo "yes"
-  else
-    echo "no"
-  fi
-fi
-
 if test "X$HDF_FORTRAN" = "Xyes"; then
 
+## We will output an include file for Fortran, H5config_f.inc which 
+## contains various configure definitions used by the Fortran Library. 
+## Prepend H5_ to all macro names. This avoids name conflict between HDF5 macro 
+## names and those generated by another software package that uses the HDF5 library.
+  AC_CONFIG_HEADERS([fortran/src/H5config_f.inc], 
+    [cat fortran/src/H5config_f.inc | sed '1d;s%^/\* \(.*\) \*/%\1%;s/#define /#define H5_/;s/#undef /#undef H5_/' >fortran/src/H5config_f.inc.tmp; mv -f fortran/src/H5config_f.inc.tmp fortran/src/H5config_f.inc])
+
   AC_SUBST([FC]) HDF_FORTRAN=yes
-  AC_SUBST([HAVE_FORTRAN_2003])
-		
+
   HDF5_INTERFACES="$HDF5_INTERFACES fortran"
 
   ## --------------------------------------------------------------------
@@ -415,13 +446,21 @@ if test "X$HDF_FORTRAN" = "Xyes"; then
 
   ## --------------------------------------------------------------------
   ## Check for a Fortran compiler and how to include modules.
-  ## 
+  ##
   AC_PROG_FC([PAC_FC_SEARCH_LIST],)
   AC_F9X_MODS
 
   ## Change to the Fortran 90 language
   AC_LANG_PUSH(Fortran)
 
+  ## Checking if the compiler supports the required Fortran 2003 features and
+  ## stopping if it does not.
+  PAC_PROG_FC_HAVE_F2003_REQUIREMENTS
+ 
+  if test "X$HAVE_F2003_REQUIREMENTS" = "Xno"; then
+    AC_MSG_ERROR([Fortran compiler lacks required Fortran 2003 features; unsupported Fortran 2003 compiler, remove --enable-fortran])
+  fi
+
   ## --------------------------------------------------------------------
   ## Define wrappers for the C compiler to use Fortran function names
   ##
@@ -433,39 +472,143 @@ if test "X$HDF_FORTRAN" = "Xyes"; then
 
   ## See if the fortran compiler supports the intrinsic function "C_SIZEOF"
   PAC_PROG_FC_C_SIZEOF
-
+	
   ## See if the fortran compiler supports the intrinsic function "STORAGE_SIZE"
-  PAC_PROG_FC_STORAGE_SIZE	
+  PAC_PROG_FC_STORAGE_SIZE
+
+  ## Set the sizeof function for use later in the fortran tests
+  if test "X$HAVE_STORAGE_SIZE_FORTRAN" = "Xyes";then
+    FC_SIZEOF_A="STORAGE_SIZE(a, c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)"
+    FC_SIZEOF_B="STORAGE_SIZE(b, c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)"
+    FC_SIZEOF_C="STORAGE_SIZE(c, c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)"
+  else 
+    if test "X$HAVE_SIZEOF_FORTRAN" = "Xyes";then
+      FC_SIZEOF_A="SIZEOF(a)"
+      FC_SIZEOF_B="SIZEOF(b)"
+      FC_SIZEOF_C="SIZEOF(c)"
+    else	
+      ## If neither intrinsic functions SIZEOF or STORAGE_SIZE is available then stop configure with an error
+      AC_MSG_ERROR([Fortran compiler requires either intrinsic functions SIZEOF or STORAGE_SIZE])
+    fi
+  fi
 
-  ## Check to see if -r8 was specified to determine if we need to
-  ## compile the DOUBLE PRECISION interfaces.
-  PAC_PROG_FC_DEFAULT_REALisDBLE	
+  ## See if the fortran compiler supports the intrinsic module "ISO_FORTRAN_ENV"
+  PAC_PROG_FC_ISO_FORTRAN_ENV
+  ## Check KIND and size of native integer
+  PAC_FC_NATIVE_INTEGER
+ 
+  ## Find all available KINDs
+  PAC_FC_AVAIL_KINDS
+  ## Find all sizeofs for available KINDs
+  PAC_FC_SIZEOF_INT_KINDS
+  PAC_FC_SIZEOF_REAL_KINDS
+
+  AC_SUBST([PAC_FC_ALL_REAL_KINDS])
+  AC_SUBST([PAC_FC_MAX_REAL_PRECISION])
+  AC_SUBST([PAC_FC_ALL_INTEGER_KINDS])
+  AC_SUBST([PAC_FC_ALL_REAL_KINDS_SIZEOF])
+  AC_SUBST([PAC_FC_ALL_INTEGER_KINDS_SIZEOF])  
+  AC_SUBST([PAC_FORTRAN_NATIVE_INTEGER_KIND])
+  AC_SUBST([PAC_FORTRAN_NATIVE_INTEGER_SIZEOF])
+  AC_SUBST([PAC_FORTRAN_NATIVE_REAL_KIND])
+  AC_SUBST([PAC_FORTRAN_NATIVE_REAL_SIZEOF])
+  AC_SUBST([PAC_FORTRAN_NATIVE_DOUBLE_KIND])
+  AC_SUBST([PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF])
+  AC_SUBST([HAVE_Fortran_INTEGER_SIZEOF_16])
+  AC_SUBST([FORTRAN_HAVE_C_LONG_DOUBLE])
+  AC_SUBST([FORTRAN_C_LONG_DOUBLE_IS_UNIQUE])
+  AC_SUBST([FORTRAN_SIZEOF_LONG_DOUBLE])
+  AC_SUBST([H5CONFIG_F_NUM_RKIND])
+  AC_SUBST([H5CONFIG_F_RKIND])	
+  AC_SUBST([H5CONFIG_F_RKIND_SIZEOF])	
+  AC_SUBST([H5CONFIG_F_NUM_IKIND])
+  AC_SUBST([H5CONFIG_F_IKIND])
+  AC_DEFINE_UNQUOTED([Fortran_COMPILER_ID], $Fortran_COMPILER_ID, [Define Fortran compiler ID])
+
+  ## Setting definition if there is a 16 byte fortran integer
+  if `echo $PAC_FC_ALL_INTEGER_KINDS_SIZEOF | grep '16' >/dev/null`; then
+    HAVE_Fortran_INTEGER_SIZEOF_16="1" 	
+    AC_DEFINE([HAVE_Fortran_INTEGER_SIZEOF_16], [1], [Determine if INTEGER*16 is available])
+  else
+    HAVE_Fortran_INTEGER_SIZEOF_16="0"
+    AC_DEFINE([HAVE_Fortran_INTEGER_SIZEOF_16], [0], [Determine if INTEGER*16 is available])
+  fi
 
-  if test "X$HDF_FORTRAN2003" = "Xyes"; then
+  if test "X$HAVE_STORAGE_SIZE_FORTRAN" = "Xyes"; then
+    AC_DEFINE([FORTRAN_HAVE_STORAGE_SIZE], [1], [Define if we have Fortran intrinsic STORAGE_SIZE])
+  fi
 
-    ## Checking if the compiler supports the required Fortran 2003 features and
-    ## disable Fortran 2003 if it does not.
-    PAC_PROG_FC_HAVE_F2003_REQUIREMENTS
- 
-    if test "X$HAVE_F2003_REQUIREMENTS" = "Xno"; then
-      AC_MSG_ERROR([Fortran compiler lacks required Fortran 2003 features; unsupported Fortran 2003 compiler, remove --enable-fortran2003])
+  if  test "X$HAVE_C_SIZEOF_FORTRAN" = "Xyes"; then
+    AC_DEFINE([FORTRAN_HAVE_C_SIZEOF], [1], [Define if we have Fortran intrinsic C_SIZEOF])
+  fi
+	
+  if  test "X$HAVE_SIZEOF_FORTRAN" = "Xyes"; then
+    AC_DEFINE([FORTRAN_HAVE_SIZEOF], [1], [Define if we have Fortran intrinsic SIZEOF])
+  fi
+
+  ## See if C_LONG_DOUBLE is available
+  PAC_PROG_FC_HAVE_C_LONG_DOUBLE
+
+  FORTRAN_HAVE_C_LONG_DOUBLE="0" 
+  if test "X$HAVE_C_LONG_DOUBLE_FORTRAN" = "Xyes"; then
+    FORTRAN_HAVE_C_LONG_DOUBLE="1" 
+    AC_DEFINE([FORTRAN_HAVE_C_LONG_DOUBLE], [1], [Define if we have Fortran C_LONG_DOUBLE])
+  fi
+
+  ## Is C_LONG_DOUBLE different from C_DOUBLE
+  FORTRAN_C_LONG_DOUBLE_IS_UNIQUE="0"
+  if test "X$FORTRAN_HAVE_C_LONG_DOUBLE"; then
+    PAC_PROG_FC_C_LONG_DOUBLE_EQ_C_DOUBLE
+    if test "X$C_LONG_DOUBLE_IS_UNIQUE_FORTRAN" = "Xyes"; then
+      FORTRAN_C_LONG_DOUBLE_IS_UNIQUE="1"
+      AC_DEFINE([FORTRAN_C_LONG_DOUBLE_IS_UNIQUE], [1], [Define if Fortran C_LONG_DOUBLE is different from C_DOUBLE])
     else
-      HAVE_FORTRAN_2003="yes"
+      FORTRAN_C_LONG_DOUBLE_IS_UNIQUE="0"
+    fi
+  fi
+  
+  FORTRAN_SIZEOF_LONG_DOUBLE=${ac_cv_sizeof_long_double}
+  AC_DEFINE_UNQUOTED([FORTRAN_SIZEOF_LONG_DOUBLE], ["${ac_cv_sizeof_long_double}"], [Determine the size of C long double])
+
+
+  dnl get the largest sizeof for REAL kinds
+  max_real_fortran_sizeof="`echo $PAC_FC_ALL_REAL_KINDS_SIZEOF | sed -ne 's/.*,\([[0-9]]*\)\}/\1/p'`"
+  max_real_fortran_kind="`echo \"[$]PAC_FC_ALL_REAL_KINDS\" | sed -ne 's/.*,\([[0-9]]*\)\}/\1/p'`"
+
+  dnl remove the invalid kind from the list
+  if test "$ac_cv_sizeof___float128" != 0;then
+    if test "$ac_cv_sizeof___float128" != "$max_real_fortran_sizeof" && 
+       test "${ac_cv_sizeof_long_double}" != "$max_real_fortran_sizeof" &&
+       dnl account for the fact that the C compiler can have 16-byte __float128 and the Fortran compiler only has 8-byte doubles,
+       dnl so we don't want to remove the 8-byte Fortran doubles. This is sometimes the case if different C and Fortran vendors
+       dnl are used (for example gnu and pgi).
+       test "${ac_cv_sizeof_double}" != "$max_real_fortran_sizeof" ; then
+          AC_MSG_WARN([
+           Fortran REAL(KIND=$max_real_fortran_kind) is $max_real_fortran_sizeof Bytes, but no corresponding C float type exists of that size
+                     !!! Fortran interfaces will not be generated for REAL(KIND=$max_real_fortran_kind) !!!
+          ])
+      PAC_FC_ALL_REAL_KINDS="`echo $PAC_FC_ALL_REAL_KINDS | sed -e 's/,[[0-9]]\+}/}/g'`"
+      PAC_FC_ALL_REAL_KINDS_SIZEOF="`echo $PAC_FC_ALL_REAL_KINDS_SIZEOF | sed -e 's/,[[0-9]]\+}/}/g'`"
     fi
   fi
+  AC_MSG_CHECKING([for Fortran interoperable KINDS with C])
+  AC_MSG_RESULT([$PAC_FC_ALL_REAL_KINDS])	
+
+  dnl count the number of real kinds
+  H5CONFIG_F_NUM_RKIND="INTEGER, PARAMETER :: num_rkinds = `echo \"[$]PAC_FC_ALL_REAL_KINDS\" |  tr -d -c ',\n' | awk '{ print length + 1; }'`"
+  H5CONFIG_F_RKIND="INTEGER, DIMENSION(1:num_rkinds) :: rkind = (/`echo $PAC_FC_ALL_REAL_KINDS | sed -e 's/{//g' | sed -e 's/}//g' | sed -e 's/ /,/g'`/)"
+  H5CONFIG_F_RKIND_SIZEOF="INTEGER, DIMENSION(1:num_rkinds) :: rkind_sizeof = (/`echo $PAC_FC_ALL_REAL_KINDS_SIZEOF | sed -e 's/{//g' | sed -e 's/}//g'| sed -e 's/ /,/g'`/)"
+
+  AC_DEFINE_UNQUOTED([H5CONFIG_F_NUM_RKIND], $H5CONFIG_F_NUM_RKIND, [Define number of valid Fortran REAL KINDs])
+  AC_DEFINE_UNQUOTED([H5CONFIG_F_RKIND], $H5CONFIG_F_RKIND, [Define valid Fortran REAL KINDs])
+  AC_DEFINE_UNQUOTED([H5CONFIG_F_RKIND_SIZEOF], $H5CONFIG_F_RKIND_SIZEOF, [Define valid Fortran REAL KINDs Sizeof])
+
+## Change back to the C language
+  AC_LANG_POP(Fortran)
 else
   FC="no"
 fi
 
-## Change back to the C language
-AC_LANG_POP(Fortran)
-
-AM_CONDITIONAL([FORTRAN_HAVE_SIZEOF], [test "X$HAVE_SIZEOF_FORTRAN" = "Xyes"])
-AM_CONDITIONAL([FORTRAN_HAVE_C_SIZEOF], [test "X$HAVE_C_SIZEOF_FORTRAN" = "Xyes"])
-AM_CONDITIONAL([FORTRAN_HAVE_STORAGE_SIZE], [test "X$HAVE_STORAGE_SIZE_FORTRAN" = "Xyes"])
-AM_CONDITIONAL([FORTRAN_2003_CONDITIONAL_F], [test "X$HAVE_FORTRAN_2003" = "Xyes"])
-AM_CONDITIONAL([FORTRAN_DEFAULT_REALisDBLE_F], [test "X$FORTRAN_DEFAULT_REALisDBLE" = "Xyes"])
-
 ## ----------------------------------------------------------------------
 ## Check if they would like the C++ interface compiled
 ##
@@ -494,8 +637,8 @@ if test "X$HDF_CXX" = "Xyes"; then
 
   # Checking if C++ can handle namespaces
   PAC_PROG_CXX_NAMESPACE
-  
-  # Checking if C++ has offsetof extension 
+
+  # Checking if C++ has offsetof extension
   PAC_PROG_CXX_OFFSETOF
 
   # if C++ can handle static cast
@@ -529,27 +672,12 @@ if test "X$HDF5_HL" = "Xyes"; then
  HL="hl"
  AC_DEFINE([INCLUDE_HL], [1],
            [Define if HDF5's high-level library headers should be included in hdf5.h])
-
-  ## If Fortran's default real is double precision and HL is being built then configure
-  ## should fail due to bug HDFFV-889.
-  if test "X$FORTRAN_DEFAULT_REALisDBLE" = "Xyes"; then
-    AC_MSG_ERROR([Fortran high-level routines are not supported when the default REAL is DOUBLE PRECISION, use configure option --disable-hl.])
-  fi
 else
  echo "no"
 fi
 
 
 ## ----------------------------------------------------------------------
-## Check if they have Perl installed on their system. We only need Perl
-## if they're using a GNU compiler.
-##
-AC_SUBST([PERL]) PERL=""
-if test "X$GCC" = "Xyes"; then
-  AC_CHECK_PROGS([PERL], [perl],, [$PATH])
-fi
-
-## ----------------------------------------------------------------------
 ## Check which archiving tool to use. This needs to be done before
 ## the AM_PROG_LIBTOOL macro.
 ##
@@ -636,6 +764,19 @@ AC_SUBST([RUNPARALLEL])
 AC_SUBST([TESTPARALLEL])
 
 ## ----------------------------------------------------------------------
+## Disable shared libraries on CYGWIN. (LK - 04/16/15)
+## A number of tests run by "make check" fail on CYGWIN, so for HDF5 v1.8.15
+## we will change the default for shared libraries to disabled.
+
+
+case "`uname`" in
+  CYGWIN*)
+    enable_shared="no"
+    CHECK_WARN="Shared libraries are not currently supported on CYGWIN."
+    ;;
+esac
+
+## ----------------------------------------------------------------------
 ## Fortran libraries are not currently supported on Mac. Disable them.
 ## (this is overridable with --enable-unsupported).
 ##
@@ -646,7 +787,7 @@ if test "X${HDF_FORTRAN}" = "Xyes" && test "X${enable_shared}" != "Xno"; then
   H5_FORTRAN_SHARED="yes"
 
   ## Disable fortran shared libraries on Mac. (MAM - 03/30/11)
-  
+
   case "`uname`" in
     Darwin*)
     H5_FORTRAN_SHARED="no"
@@ -655,7 +796,7 @@ if test "X${HDF_FORTRAN}" = "Xyes" && test "X${enable_shared}" != "Xno"; then
   esac
 
   ## Report results of check(s)
-  
+
   if test "X${H5_FORTRAN_SHARED}" = "Xno"; then
     AC_MSG_RESULT([no])
     AC_MSG_WARN([$CHECK_WARN])
@@ -689,7 +830,7 @@ LT_INIT([dlopen,win32-dll])
 ## ----------------------------------------------------------------------
 ## Check if we should install only statically linked executables.
 ##   This check needs to occur after libtool is initialized because
-##   we check a libtool cache value and may issue a warning based 
+##   we check a libtool cache value and may issue a warning based
 ##   on its result.
 AC_MSG_CHECKING([if we should install only statically linked executables])
 AC_ARG_ENABLE([static_exec],
@@ -752,32 +893,6 @@ case "X-$RPATH" in
 esac
 
 ## ----------------------------------------------------------------------
-## pmake will throw an error if variables are undefined in a Makefile.
-## These errors can be changed to warnings using the -V flag.
-##
-AC_SUBST([AM_MAKEFLAGS]) AM_MAKEFLAGS=""
-
-## Don't run test if MAKE is defined but is the empty string
-if test -n "${MAKE-make}"; then 
-
-  AC_MSG_CHECKING([whether make will build with undefined variables])
-
-  cat >maketest <<EOF
-foo: \$(UNDEFINED) \$(UNDEFINED2)
-	@echo \$(UNDEFINED3) works
-EOF
-
-  if (${MAKE-make} -f maketest foo) >/dev/null 2>&1; then
-    AC_MSG_RESULT([yes])
-  else
-    AC_MSG_RESULT([no, setting -V flag])
-    AM_MAKEFLAGS="\-V"
-  fi
-
-  rm maketest
-fi
-
-## ----------------------------------------------------------------------
 ## Production flags?  Save the value in $CONFIG_MODE so we have it for
 ## the record.
 ##
@@ -787,7 +902,7 @@ AC_ARG_ENABLE([production],
                               [Determines how to run the compiler.])])
 
 case "X-$enable_production" in
-  X-|X-yes)
+  X-yes)
     enable_production="yes"
     AC_MSG_RESULT([production])
     CONFIG_MODE=production
@@ -796,7 +911,7 @@ case "X-$enable_production" in
     H5_CXXFLAGS="$H5_CXXFLAGS $PROD_CXXFLAGS"
     H5_FCFLAGS="$H5_FCFLAGS $PROD_FCFLAGS"
     ;;
-  X-no)
+  X-|X-no)
     enable_production="no"
     AC_MSG_RESULT([development])
     CONFIG_MODE=development
@@ -835,10 +950,11 @@ AC_HEADER_TIME
 
 ## Unix
 AC_CHECK_HEADERS([sys/resource.h sys/time.h unistd.h sys/ioctl.h sys/stat.h])
-AC_CHECK_HEADERS([sys/socket.h sys/types.h])
+AC_CHECK_HEADERS([sys/socket.h sys/types.h sys/file.h])
 AC_CHECK_HEADERS([stddef.h setjmp.h features.h])
 AC_CHECK_HEADERS([dirent.h])
 AC_CHECK_HEADERS([stdint.h], [C9x=yes])
+AC_CHECK_HEADERS([stdbool.h])
 
 ## Darwin
 AC_CHECK_HEADERS([mach/mach_time.h])
@@ -886,11 +1002,11 @@ fi
 
 ## ----------------------------------------------------------------------
 ## Use the macro _AC_SYS_LARGEFILE_MACRO_VALUE to test defines
-## that might need to be set for largefile support to behave 
+## that might need to be set for largefile support to behave
 ## correctly. This macro is defined in acsite.m4 and overrides
 ## the version provided by Autoconf (as of v2.65). The custom
-## macro additionally adds the appropriate defines to AM_CPPFLAGS 
-## so that later configure checks have them visible. 
+## macro additionally adds the appropriate defines to AM_CPPFLAGS
+## so that later configure checks have them visible.
 
 ## Check for _FILE_OFFSET_BITS
 _AC_SYS_LARGEFILE_MACRO_VALUE([_FILE_OFFSET_BITS], [64],
@@ -911,16 +1027,16 @@ fi
 ##
 case "$host_cpu-$host_vendor-$host_os" in
   *linux*)
-    ## Make available various LFS-related routines using the following 
+    ## Make available various LFS-related routines using the following
     ## _LARGEFILE*_SOURCE macros.
     AM_CPPFLAGS="-D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE $AM_CPPFLAGS"
 
     ## Add POSIX support on Linux systems, so <features.h> defines
     ## __USE_POSIX, which is required to get the prototype for fdopen
-    ## defined correctly in <stdio.h>. 
+    ## defined correctly in <stdio.h>.
     ##
     ## This flag was removed from h5cc as of 2009-10-17 when it was found
-    ## that the flag broke compiling netCDF-4 code with h5cc, but kept in 
+    ## that the flag broke compiling netCDF-4 code with h5cc, but kept in
     ## H5_CPPFLAGS because fdopen and HDfdopen fail without it. HDfdopen
     ## is used only by H5_debug_mask which is used only when debugging in
     ## H5_init_library (all in H5.c).  When the flag was removed this was
@@ -943,48 +1059,28 @@ case "$host_cpu-$host_vendor-$host_os" in
     ;;
 esac
 
-## Need to add the AM_ and H5_ into CFLAGS/CPPFLAGS to make them visible 
+## Need to add the AM_ and H5_ into CFLAGS/CPPFLAGS to make them visible
 ## for configure checks.
 ## Note: Both will be restored by the end of configure.
 CPPFLAGS="$H5_CPPFLAGS $AM_CPPFLAGS $CPPFLAGS"
 CFLAGS="$H5_CFLAGS $AM_CFLAGS $CFLAGS"
 
-AC_TRY_COMPILE([#include <sys/types.h>],
-               [off64_t n = 0;],
-               [AC_CHECK_FUNCS([lseek64 fseeko64 ftello64 ftruncate64])],
-               [AC_MSG_RESULT([skipping test for lseek64(), fseeko64 , ftello64, ftruncate64() because off64_t is not defined])])
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/types.h>
+]],
+    [[off64_t n = 0;]])],
+    [AC_CHECK_FUNCS([lseek64 fseeko64 ftello64 ftruncate64])],
+    [AC_MSG_RESULT([skipping test for lseek64, fseeko64 , ftello64, ftruncate64 because off64_t is not defined])])
+
 AC_CHECK_FUNCS([fseeko ftello])
-AC_TRY_COMPILE([
+
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
 #include <sys/types.h>
-#include <sys/stat.h>],
-[struct stat64 sb;],
+#include <sys/stat.h>
+]],
+[[struct stat64 sb;]])],
 [AC_CHECK_FUNCS([stat64 fstat64])],
-[AC_MSG_RESULT([skipping test for stat64() and fstat64()])])
-
-## ----------------------------------------------------------------------
-## Data types and their sizes.
-##
-AC_TYPE_OFF_T
-AC_CHECK_TYPE([size_t], [],
-        [AC_DEFINE_UNQUOTED([size_t], [unsigned long],
-                [Define to `unsigned long' if <sys/types.h> does not define.])])
-AC_CHECK_TYPE([ssize_t], [],
-        [AC_DEFINE_UNQUOTED([ssize_t], [long],
-                [Define to `long' if <sys/types.h> does not define.])])
-AC_CHECK_TYPE([ptrdiff_t], [],
-        [AC_DEFINE_UNQUOTED([ptrdiff_t], [long],
-                [Define to `long' if <sys/types.h> does not define.])])
-AC_C_BIGENDIAN
-AC_CHECK_SIZEOF([char], [1])
-AC_CHECK_SIZEOF([short], [2])
-AC_CHECK_SIZEOF([int], [4])
-AC_CHECK_SIZEOF([unsigned], [4])
-AC_CHECK_SIZEOF([long], [4])
-AC_CHECK_SIZEOF([long long], [8])
-AC_CHECK_SIZEOF([__int64], [8])
-AC_CHECK_SIZEOF([float], [4])
-AC_CHECK_SIZEOF([double], [8])
-AC_CHECK_SIZEOF([long double], [8])
+[AC_MSG_RESULT([skipping test for stat64 and fstat64])])
 
 ## Checkpoint the cache
 AC_CACHE_SAVE
@@ -1000,43 +1096,54 @@ if test "X$C9x" = "Xyes"; then
 EOF
 fi
 
-AC_CHECK_SIZEOF(        [int8_t], [1])
-AC_CHECK_SIZEOF(       [uint8_t], [1])
-AC_CHECK_SIZEOF(  [int_least8_t], [1])
-AC_CHECK_SIZEOF( [uint_least8_t], [1])
-AC_CHECK_SIZEOF(   [int_fast8_t], [1])
-AC_CHECK_SIZEOF(  [uint_fast8_t], [1])
-
-AC_CHECK_SIZEOF(       [int16_t], [2])
-AC_CHECK_SIZEOF(      [uint16_t], [2])
-AC_CHECK_SIZEOF( [int_least16_t], [2])
-AC_CHECK_SIZEOF([uint_least16_t], [2])
-AC_CHECK_SIZEOF(  [int_fast16_t], [2])
-AC_CHECK_SIZEOF( [uint_fast16_t], [2])
-
-AC_CHECK_SIZEOF(       [int32_t], [4])
-AC_CHECK_SIZEOF(      [uint32_t], [4])
-AC_CHECK_SIZEOF( [int_least32_t], [4])
-AC_CHECK_SIZEOF([uint_least32_t], [4])
-AC_CHECK_SIZEOF(  [int_fast32_t], [4])
-AC_CHECK_SIZEOF( [uint_fast32_t], [4])
-
-AC_CHECK_SIZEOF(       [int64_t], [8])
-AC_CHECK_SIZEOF(      [uint64_t], [8])
-AC_CHECK_SIZEOF( [int_least64_t], [8])
-AC_CHECK_SIZEOF([uint_least64_t], [8])
-AC_CHECK_SIZEOF(  [int_fast64_t], [8])
-AC_CHECK_SIZEOF( [uint_fast64_t], [8])
-
-AC_CHECK_SIZEOF([size_t], [4])
-AC_CHECK_SIZEOF([ssize_t], [4])
-AC_CHECK_SIZEOF([ptrdiff_t], [4])
+AC_CHECK_SIZEOF(        [int8_t])
+AC_CHECK_SIZEOF(       [uint8_t])
+AC_CHECK_SIZEOF(  [int_least8_t])
+AC_CHECK_SIZEOF( [uint_least8_t])
+AC_CHECK_SIZEOF(   [int_fast8_t])
+AC_CHECK_SIZEOF(  [uint_fast8_t])
+
+AC_CHECK_SIZEOF(       [int16_t])
+AC_CHECK_SIZEOF(      [uint16_t])
+AC_CHECK_SIZEOF( [int_least16_t])
+AC_CHECK_SIZEOF([uint_least16_t])
+AC_CHECK_SIZEOF(  [int_fast16_t])
+AC_CHECK_SIZEOF( [uint_fast16_t])
+
+AC_CHECK_SIZEOF(       [int32_t])
+AC_CHECK_SIZEOF(      [uint32_t])
+AC_CHECK_SIZEOF( [int_least32_t])
+AC_CHECK_SIZEOF([uint_least32_t])
+AC_CHECK_SIZEOF(  [int_fast32_t])
+AC_CHECK_SIZEOF( [uint_fast32_t])
+
+AC_CHECK_SIZEOF(       [int64_t])
+AC_CHECK_SIZEOF(      [uint64_t])
+AC_CHECK_SIZEOF( [int_least64_t])
+AC_CHECK_SIZEOF([uint_least64_t])
+AC_CHECK_SIZEOF(  [int_fast64_t])
+AC_CHECK_SIZEOF( [uint_fast64_t])
+
+AC_CHECK_SIZEOF([size_t])
+AC_CHECK_SIZEOF([ssize_t])
+AC_CHECK_SIZEOF([ptrdiff_t])
 
 cat >>confdefs.h <<\EOF
 #include <sys/types.h> /*for off_t definition*/
 EOF
-AC_CHECK_SIZEOF([off_t], [4])
-AC_CHECK_SIZEOF([off64_t], [8])
+AC_CHECK_SIZEOF([off_t])
+AC_CHECK_SIZEOF([off64_t])
+
+if test "X$C9x" = "Xyes"; then
+  cat >>confdefs.h <<\EOF
+#ifdef HAVE_STDBOOL_H
+#include <stdbool.h> /* for bool definition */
+#else
+#define bool _Bool
+#endif
+EOF
+AC_CHECK_SIZEOF([bool])
+fi
 
 ## Checkpoint the cache
 AC_CACHE_SAVE
@@ -1045,17 +1152,16 @@ AC_CACHE_SAVE
 ## Check if the dev_t type is a scalar type (must come after the check for
 ## sys/types.h)
 AC_MSG_CHECKING([if dev_t is scalar])
-AC_TRY_COMPILE([
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
 #ifdef HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
-  ],
-  [dev_t d1, d2; if(d1==d2) return 0;],
-  AC_DEFINE([DEV_T_IS_SCALAR], [1],
-            [Define if `dev_t' is a scalar])
-  AC_MSG_RESULT([yes]),
-  AC_MSG_RESULT([no])
-)
+  ]],
+  [[dev_t d1, d2; if(d1==d2) return 0;]])],
+  [AC_DEFINE([DEV_T_IS_SCALAR], [1],
+            [Define if dev_t is a scalar])
+  AC_MSG_RESULT([yes])],
+  [AC_MSG_RESULT([no])])
 
 ## ----------------------------------------------------------------------
 ## Fake --with-xxx option to allow us to create a help message for the
@@ -1279,17 +1385,17 @@ case $withval in
         fi
         ;;
     esac
-    
+
     saved_CPPFLAGS="$CPPFLAGS"
     saved_AM_CPPFLAGS="$AM_CPPFLAGS"
     saved_LDFLAGS="$LDFLAGS"
     saved_AM_LDFLAGS="$AM_LDFLAGS"
-    
+
     if test -n "$szlib_inc"; then
       CPPFLAGS="$CPPFLAGS -I$szlib_inc"
       AM_CPPFLAGS="$AM_CPPFLAGS -I$szlib_inc"
     fi
-    
+
     AC_CHECK_HEADERS([szlib.h],
                      [HAVE_SZLIB_H="yes"],
                      [CPPFLAGS="$saved_CPPFLAGS"; AM_CPPFLAGS="$saved_AM_CPPFLAGS"] [unset HAVE_SZLIB])
@@ -1298,7 +1404,7 @@ case $withval in
       LDFLAGS="$LDFLAGS -L$szlib_lib"
       AM_LDFLAGS="$AM_LDFLAGS -L$szlib_lib"
     fi
-    
+
     if test "x$HAVE_SZLIB" = "xyes" -a "x$HAVE_SZLIB_H" = "xyes"; then
       AC_CHECK_LIB([sz], [SZ_BufftoBuffCompress],,
                    [LDFLAGS="$saved_LDFLAGS"; AM_LDFLAGS="$saved_AM_LDFLAGS"; unset HAVE_SZLIB])
@@ -1315,48 +1421,48 @@ if test "x$HAVE_SZLIB" = "xyes" -a "x$HAVE_SZLIB_H" = "xyes"; then
   AC_MSG_CHECKING([for szlib encoder])
 
   ## Set LD_LIBRARY_PATH so encoder test can find the library and run.
-  ## Also add LL_PATH substitution to Makefiles so they can use the 
+  ## Also add LL_PATH substitution to Makefiles so they can use the
   ## path as well, for testing examples.
   if test -z "$LD_LIBRARY_PATH"; then
     export LD_LIBRARY_PATH="$szlib_lib"
   else
-    export LD_LIBRARY_PATH="$szlib_lib:$LD_LIBRARY_PATH"
+    export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$szlib_lib"
   fi
 
   AC_SUBST([LL_PATH]) LL_PATH="$LD_LIBRARY_PATH"
 
   AC_CACHE_VAL([hdf5_cv_szlib_can_encode],
-        [AC_TRY_RUN([
-        #include <szlib.h>
-        
-        int main(void)
-        {       
+        [AC_RUN_IFELSE(
+            [AC_LANG_PROGRAM([
+                #include "szlib.h"
+            ],[[
                 /* SZ_encoder_enabled returns 1 if encoder is present */
-            if(SZ_encoder_enabled() == 1)
-                exit(0);
-            else
-                exit(1);
-        }
-        ], [hdf5_cv_szlib_can_encode=yes], [hdf5_cv_szlib_can_encode=no],)])
-    
-  AC_DEFINE([HAVE_FILTER_SZIP], [1], 
+                if(SZ_encoder_enabled() == 1)
+                    exit(0);
+                else
+                    exit(1);
+            ]])]
+        , [hdf5_cv_szlib_can_encode=yes], [hdf5_cv_szlib_can_encode=no],)]
+   )
+
+  AC_DEFINE([HAVE_FILTER_SZIP], [1],
             [Define if support for szip filter is enabled])
   USE_FILTER_SZIP="yes"
 
   if test ${hdf5_cv_szlib_can_encode} = "yes"; then
     AC_MSG_RESULT([yes])
-  fi 
+  fi
   if test ${hdf5_cv_szlib_can_encode} = "no"; then
     AC_MSG_RESULT([no])
-  fi 
-    
+  fi
+
   ## Add "szip" to external filter list
   if test ${hdf5_cv_szlib_can_encode} = "yes"; then
     if test "X$EXTERNAL_FILTERS" != "X"; then
       EXTERNAL_FILTERS="${EXTERNAL_FILTERS},"
     fi
     EXTERNAL_FILTERS="${EXTERNAL_FILTERS}szip(encoder)"
-  fi 
+  fi
   if test ${hdf5_cv_szlib_can_encode} = "no"; then
     if test "X$EXTERNAL_FILTERS" != "X"; then
       EXTERNAL_FILTERS="${EXTERNAL_FILTERS},"
@@ -1381,6 +1487,10 @@ AC_ARG_ENABLE([threadsafe],
                               [default=no]])],
               [THREADSAFE=$enableval])
 
+## NOTE: The high-level, C++, and Fortran interfaces are not compatible
+## with the thread-safety option because the lock is not hoisted
+## into the higher-level API calls.
+
 ## --enable-threadsafe is incompatible with --enable-hl unless
 ## --enable-unsupported has been specified on the configure line.
 ##
@@ -1401,7 +1511,7 @@ if test "X${ALLOW_UNSUPPORTED}" != "Xyes"; then
   fi
 fi
 
-## --enable-threadsafe is also incompatible with --enable-fortran, unless
+## --enable-threadsafe is also incompatible with --enable-fortran unless
 ## --enable-unsupported has been specified on the configure line.
 if test "X${ALLOW_UNSUPPORTED}" != "Xyes"; then
   if test "X${HDF_FORTRAN}" = "Xyes" -a "X${enable_threadsafe}" = "Xyes"; then
@@ -1409,12 +1519,13 @@ if test "X${ALLOW_UNSUPPORTED}" != "Xyes"; then
   fi
 fi
 
+
 case "X-$THREADSAFE" in
   X-|X-no)
     AC_MSG_RESULT([no])
     ;;
   X-yes)
-    THREADSAFE=yes 
+    THREADSAFE=yes
     AC_MSG_RESULT([yes])
     ;;
   *)
@@ -1427,32 +1538,31 @@ if test "X$THREADSAFE" = "Xyes"; then
     AC_DEFINE([HAVE_THREADSAFE], [1], [Define if we have thread safe support])
 
     ## ----------------------------------------------------------------------
-    ## Is the pthreads library present?  It has a header file `pthread.h' and
+    ## Is the Pthreads library present?  It has a header file `pthread.h' and
     ## a library `-lpthread' and their locations might be specified with the
     ## `--with-pthread' command-line switch.  The value is an include path
     ## and/or a library path.  If the library path is specified then it must
     ## be preceded by a comma.
     ##
     ## Thread-safety in HDF5 only uses Pthreads via configure, so the
-    ## default is "yes", though this only has an effect when
+    ## default is "check", though this only has an effect when
     ## --enable-threadsafe is specified.
     AC_SUBST([HAVE_PTHREAD]) HAVE_PTHREAD=yes
     AC_ARG_WITH([pthread],
                 [AS_HELP_STRING([--with-pthread=DIR],
-                                [Specify alternative path to Pthreads library when thread-safe capability is built])],,
-                [withval=yes])
+                                [Specify alternative path to Pthreads library when
+                                thread-safe capability is built.])],,
+                [withval=check])
 
     case "$withval" in
-      yes)
+      check | yes)
         AC_CHECK_HEADERS([pthread.h],, [unset HAVE_PTHREAD])
         if test "x$HAVE_PTHREAD" = "xyes"; then
           AC_CHECK_LIB([pthread], [pthread_self],, [unset HAVE_PTHREAD])
         fi
         ;;
       no)
-        AC_MSG_CHECKING([for pthread])
-        AC_MSG_RESULT([suppressed])
-        unset HAVE_PTHREAD
+        AC_MSG_ERROR([Must use Pthreads with thread safety])
         ;;
       *)
         case "$withval" in
@@ -1492,6 +1602,44 @@ if test "X$THREADSAFE" = "Xyes"; then
         fi
         ;;
     esac
+
+    ## ----------------------------------------------------------------------
+    ## Check if pthread_attr_setscope(&attribute, PTHREAD_SCOPE_SYSTEM)
+    ## is supported on this system
+    ##
+    ## Unfortunately, this probably needs to be an AC_RUN_IFELSE since
+    ## it's impossible to determine if PTHREAD_SCOPE_SYSTEM is
+    ## supported a priori. POSIX.1-2001 requires that a conformant
+    ## system need only support one of SYSTEM or PROCESS scopes.
+    ##
+    ## For cross-compiling, we've added a pessimistic 'no'. You can
+    ## hand-hack the config file if you know otherwise.
+    AC_MSG_CHECKING([Pthreads supports system scope])
+    AC_CACHE_VAL([hdf5_cv_system_scope_threads],
+      [AC_RUN_IFELSE(
+        [AC_LANG_PROGRAM([
+            #if STDC_HEADERS
+            #include <stdlib.h>
+            #include <pthread.h>
+            #endif
+        ],[
+              pthread_attr_t attribute;
+              int ret;
+
+              pthread_attr_init(&attribute);
+              ret=pthread_attr_setscope(&attribute, PTHREAD_SCOPE_SYSTEM);
+              exit(ret==0 ? 0 : 1);
+        ])]
+      , [hdf5_cv_system_scope_threads=yes], [hdf5_cv_system_scope_threads=no], [hdf5_cv_system_scope_threads=no])])
+
+    if test ${hdf5_cv_system_scope_threads} = "yes"; then
+      AC_DEFINE([SYSTEM_SCOPE_THREADS], [1],
+                [Define if your system supports pthread_attr_setscope(&attribute, PTHREAD_SCOPE_SYSTEM) call.])
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+      AC_MSG_NOTICE([Always 'no' if cross-compiling. Edit the config file if your platform supports pthread_attr_setscope(&attribute, PTHREAD_SCOPE_SYSTEM).])
+    fi
 fi
 
 ## ----------------------------------------------------------------------
@@ -1507,11 +1655,12 @@ AC_CHECK_DECL([CLOCK_MONOTONIC],[have_clock_monotonic="yes"],[have_clock_monoton
 
 ## First check if `struct tm' has a `tm_gmtoff' member.
 AC_MSG_CHECKING([for tm_gmtoff in struct tm])
-AC_TRY_COMPILE([
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
   #include <sys/time.h>
-  #include <time.h>], [struct tm tm; tm.tm_gmtoff=0;],
+  #include <time.h>
+]], [[struct tm tm; tm.tm_gmtoff=0;]])],
   [AC_DEFINE([HAVE_TM_GMTOFF], [1],
-          [Define if `tm_gmtoff' is a member of `struct tm'])
+          [Define if tm_gmtoff is a member of struct tm])
     AC_MSG_RESULT([yes])],
   [AC_MSG_RESULT([no])])
 
@@ -1523,11 +1672,11 @@ case "`uname`" in
     AC_MSG_RESULT([disabled in CYGWIN])
     ;;
   *)
-    AC_TRY_LINK([
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([[
     #include <sys/time.h>
-    #include <time.h>], [timezone=0;],
+    #include <time.h>]], [[timezone=0;]])],
     [AC_DEFINE([HAVE_TIMEZONE], [1],
-              [Define if `timezone' is a global variable])
+              [Define if timezone is a global variable])
       AC_MSG_RESULT([yes])],
     [AC_MSG_RESULT([no])])
     ;;
@@ -1538,10 +1687,10 @@ esac
 ## Does the struct stat have the st_blocks field?  This field is not Posix.
 ##
 AC_MSG_CHECKING([for st_blocks in struct stat])
-AC_TRY_COMPILE([
-  #include <sys/stat.h>],[struct stat sb; sb.st_blocks=0;],
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM[[
+  #include <sys/stat.h>]],[[struct stat sb; sb.st_blocks=0;]])],
   [AC_DEFINE([HAVE_STAT_ST_BLOCKS], [1],
-          [Define if `struct stat' has the `st_blocks' field])
+          [Define if struct stat has the st_blocks field])
     AC_MSG_RESULT([yes])],
   [AC_MSG_RESULT([no])])
 
@@ -1559,28 +1708,32 @@ esac
 AC_CHECK_FUNCS([_scrsize ioctl])
 
 AC_MSG_CHECKING([for struct videoconfig])
-AC_TRY_COMPILE(,[struct videoconfig w; w.numtextcols=0;],
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],[[struct videoconfig w; w.numtextcols=0;]])],
   [AC_DEFINE([HAVE_STRUCT_VIDEOCONFIG], [1],
-          [Define if `struct videoconfig' is defined])
+          [Define if struct videoconfig is defined])
     AC_MSG_RESULT([yes])],
   [AC_MSG_RESULT([no])])
 
 AC_MSG_CHECKING([for struct text_info])
-AC_TRY_COMPILE(, [struct text_info w; w.screenwidth=0;],
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[struct text_info w; w.screenwidth=0;]])],
   [AC_DEFINE([HAVE_STRUCT_TEXT_INFO], [1],
-          [Define if `struct text_info' is defined])
+          [Define if struct text_info is defined])
     AC_MSG_RESULT([yes])],
   [AC_MSG_RESULT([no])])
 
 AC_MSG_CHECKING([for TIOCGWINSZ])
-AC_TRY_COMPILE([#include <sys/ioctl.h>],[int w=TIOCGWINSZ;],
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/ioctl.h>
+]],[[int w=TIOCGWINSZ;]])],
   [AC_DEFINE([HAVE_TIOCGWINSZ], [1],
           [Define if the ioctl TIOGWINSZ is defined])
     AC_MSG_RESULT([yes])],
   [AC_MSG_RESULT([no])])
 
 AC_MSG_CHECKING([for TIOCGETD])
-AC_TRY_COMPILE([#include <sys/ioctl.h>],[int w=TIOCGETD;],
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+#include <sys/ioctl.h>
+]],[[int w=TIOCGETD;]])],
   [AC_DEFINE([HAVE_TIOCGETD], [1],
           [Define if the ioctl TIOCGETD is defined])
     AC_MSG_RESULT([yes])],
@@ -1593,8 +1746,8 @@ AC_TRY_COMPILE([#include <sys/ioctl.h>],[int w=TIOCGETD;],
 ## NOTE: clock_gettime may require linking to the rt or posix4 library
 ##       so we'll search for it before calling AC_CHECK_FUNCS.
 AC_SEARCH_LIBS([clock_gettime], [rt posix4])
-AC_CHECK_FUNCS([alarm clock_gettime difftime fork frexpf frexpl])
-AC_CHECK_FUNCS([gethostname getpwuid getrusage gettimeofday])
+AC_CHECK_FUNCS([alarm clock_gettime difftime fcntl flock fork frexpf])
+AC_CHECK_FUNCS([frexpl gethostname getpwuid getrusage gettimeofday])
 AC_CHECK_FUNCS([lstat rand_r random setsysinfo])
 AC_CHECK_FUNCS([signal longjmp setjmp siglongjmp sigsetjmp sigprocmask])
 AC_CHECK_FUNCS([snprintf srandom strdup symlink system])
@@ -1627,26 +1780,26 @@ AC_COMPILE_IFELSE(
 )
 
 AC_MSG_CHECKING([for __attribute__ extension])
-AC_TRY_COMPILE(,[int __attribute__((unused)) x],
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],[[int __attribute__((unused)) x]])],
                [AC_DEFINE([HAVE_ATTRIBUTE], [1],
                          [Define if the __attribute__(()) extension is present])
                  AC_MSG_RESULT([yes])],
                [AC_MSG_RESULT([no])])
 
 AC_MSG_CHECKING([for __func__ extension])
-AC_TRY_COMPILE(,[ const char *fname = __func__; ],
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],[[ const char *fname = __func__; ]])],
                [AC_DEFINE([HAVE_C99_FUNC], [1],
                          [Define if the compiler understands the __func__ keyword])
                  AC_MSG_RESULT([yes])],
                [AC_MSG_RESULT([no])])
 AC_MSG_CHECKING([for __FUNCTION__ extension])
-AC_TRY_COMPILE(,[ const char *fname = __FUNCTION__; ],
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],,[[ const char *fname = __FUNCTION__; ]])],
                [AC_DEFINE([HAVE_FUNCTION], [1],
                          [Define if the compiler understands the __FUNCTION__ keyword])
                  AC_MSG_RESULT([yes])],
                [AC_MSG_RESULT([no])])
 AC_MSG_CHECKING([for C99 designated initialization support])
-AC_TRY_COMPILE(,[
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
                 typedef struct {
                     int x;
                     union {
@@ -1654,7 +1807,7 @@ AC_TRY_COMPILE(,[
                         double d;
                     } u;
                 } di_struct_t;
-                di_struct_t x = {0, { .d = 0.0}}; ],
+                di_struct_t x = {0, { .d = 0.0}}; ]])], 
                [AC_DEFINE([HAVE_C99_DESIGNATED_INITIALIZER], [1],
                          [Define if the compiler understands C99 designated initialization of structs and unions])
                  AC_MSG_RESULT([yes])],
@@ -1669,55 +1822,24 @@ AC_MSG_CHECKING([how to print long long])
 AC_CACHE_VAL([hdf5_cv_printf_ll], [
 
 for hdf5_cv_printf_ll in l ll L q unknown; do
-   AC_TRY_RUN([
-     #include <stdio.h>
-     #include <stdlib.h>
-     #include <string.h>
-
-     int main(void)
-     {
-	char *s = malloc(128);
-	long long x = (long long)1048576 * (long long)1048576;
-	sprintf(s,"%${hdf5_cv_printf_ll}d",x);
-	exit(strcmp(s,"1099511627776"));
-     }
-   ], [break],,[continue])
+   AC_RUN_IFELSE(
+        [AC_LANG_PROGRAM([
+            #include <stdio.h>
+            #include <stdlib.h>
+            #include <string.h>
+        ],[[
+            char *s = malloc(128);
+            long long x = (long long)1048576 * (long long)1048576;
+            sprintf(s,"%${hdf5_cv_printf_ll}d",x);
+            exit(strcmp(s,"1099511627776"));
+        ]])]
+   , [break],,[continue])
 done])
 
 AC_MSG_RESULT([%${hdf5_cv_printf_ll}d and %${hdf5_cv_printf_ll}u])
-AC_DEFINE_UNQUOTED([PRINTF_LL_WIDTH], ["$hdf5_cv_printf_ll"], 
+AC_DEFINE_UNQUOTED([PRINTF_LL_WIDTH], ["$hdf5_cv_printf_ll"],
                    [Width for printf() for type `long long' or `__int64', use `ll'])
 
-## ----------------------------------------------------------------------
-## Check if pthread_attr_setscope(&attribute, PTHREAD_SCOPE_SYSTEM)
-## is supported on this system
-##
-AC_MSG_CHECKING([Threads support system scope])
-AC_CACHE_VAL([hdf5_cv_system_scope_threads],
-  [AC_TRY_RUN([
-    #if STDC_HEADERS
-    #include <stdlib.h>
-    #include <pthread.h>
-    #endif
-
-    int main(void)
-    {
-      pthread_attr_t attribute;
-      int ret;
-
-      pthread_attr_init(&attribute);
-      ret=pthread_attr_setscope(&attribute, PTHREAD_SCOPE_SYSTEM);
-      exit(ret==0 ? 0 : 1);
-    }
-  ], [hdf5_cv_system_scope_threads=yes], [hdf5_cv_system_scope_threads=no],)])
-
-if test ${hdf5_cv_system_scope_threads} = "yes"; then
-  AC_DEFINE([SYSTEM_SCOPE_THREADS], [1],
-            [Define if your system supports pthread_attr_setscope(&attribute, PTHREAD_SCOPE_SYSTEM) call.])
-  AC_MSG_RESULT([yes])
-else
-  AC_MSG_RESULT([no])
-fi
 
 ## ----------------------------------------------------------------------
 ## Turn on debugging by setting compiler flags
@@ -1748,18 +1870,18 @@ all_packages="ac,b,b2,d,e,f,g,hg,hl,i,mf,mm,o,p,s,t,v,z"
 case "X-$DEBUG_PKG" in
   X-yes)
     DEBUG_PKG="d,e,f,g,hg,i,mm,o,p,s,t,v,z"
-    H5_CPPFLAGS="$H5_CPPFLAGS -UNDEBUG"
+##    H5_CPPFLAGS="$H5_CPPFLAGS -UNDEBUG"
     AC_MSG_RESULT([default ($DEBUG_PKG)])
     ;;
   X-all)
     DEBUG_PKG=$all_packages
-    H5_CPPFLAGS="$H5_CPPFLAGS -UNDEBUG"
+##    H5_CPPFLAGS="$H5_CPPFLAGS -UNDEBUG"
     AC_MSG_RESULT([all ($DEBUG_PKG)])
     ;;
   X-no|X-none)
     AC_MSG_RESULT([none])
     DEBUG_PKG=
-    H5_CPPFLAGS="$H5_CPPFLAGS -DNDEBUG"
+##    H5_CPPFLAGS="$H5_CPPFLAGS -DNDEBUG"
     ;;
   *)
     AC_MSG_RESULT([$DEBUG_PKG])
@@ -2034,7 +2156,7 @@ if test -n "$PARALLEL"; then
   fi
 
   ## If RUNSERIAL or RUNPARALLEL is the word `none' then replace it with
-  ## the empty string. This means that no launch commands were requested, 
+  ## the empty string. This means that no launch commands were requested,
   ## so we will not use any launch commands.
   if test "X$RUNSERIAL" = "Xnone"; then
     RUNSERIAL=""
@@ -2047,21 +2169,23 @@ if test -n "$PARALLEL"; then
     ADD_PARALLEL_FILES="yes"
     AC_MSG_CHECKING([for MPI_Comm_c2f and MPI_Comm_f2c functions])
 
-    AC_TRY_LINK([#include <mpi.h>],
-      [MPI_Comm c_comm; MPI_Comm_c2f(c_comm)],
-      AC_DEFINE([HAVE_MPI_MULTI_LANG_Comm], [1],
-                [Define if `MPI_Comm_c2f' and `MPI_Comm_f2c' exists])
-      AC_MSG_RESULT([yes]),
-      AC_MSG_RESULT([no])
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+    #include <mpi.h>
+    ]],
+      [[MPI_Comm c_comm; MPI_Comm_c2f(c_comm)]])],
+      [AC_DEFINE([HAVE_MPI_MULTI_LANG_Comm], [1],
+                 [Define if MPI_Comm_c2f and MPI_Comm_f2c exist])
+                 AC_MSG_RESULT([yes])],
+                 [AC_MSG_RESULT([no])]
     )
 
     AC_MSG_CHECKING([for MPI_Info_c2f and MPI_Info_f2c functions])
-    AC_TRY_LINK([#include <mpi.h>],
-      [MPI_Info c_info; MPI_Info_c2f(c_info)],
-      AC_DEFINE([HAVE_MPI_MULTI_LANG_Info], [1],
-                [Define if `MPI_Info_c2f' and `MPI_Info_f2c' exists])
-      AC_MSG_RESULT([yes]),
-      AC_MSG_RESULT([no])
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <mpi.h>]],
+      [[MPI_Info c_info; MPI_Info_c2f(c_info)]])],
+      [AC_DEFINE([HAVE_MPI_MULTI_LANG_Info], [1],
+                [Define if MPI_Info_c2f and MPI_Info_f2c exist])
+                AC_MSG_RESULT([yes])],
+                [AC_MSG_RESULT([no])]
     )
   fi
 
@@ -2100,7 +2224,7 @@ if test -n "$PARALLEL"; then
           fi
           ;;
       esac
-  
+
       if test -n "$mpe_inc"; then
         saved_CPPFLAGS="$CPPFLAGS"
         saved_AM_CPPFLAGS="$AM_CPPFLAGS"
@@ -2110,7 +2234,7 @@ if test -n "$PARALLEL"; then
       else
         AC_CHECK_HEADERS([mpe.h],, [unset MPE])
       fi
-  
+
       if test -n "$mpe_lib"; then
         saved_LDFLAGS="$LDFLAGS"
         saved_AM_LDFLAGS="$AM_LDFLAGS"
@@ -2132,10 +2256,9 @@ fi
 ## ----------------------------------------------------------------------
 ## Check if Direct I/O driver is enabled by --enable-direct-vfd
 ##
-
-## Check these regardless. If the checks are moved inside the main
-## direct VFD block, the output is nested.
-
+## ----------------------------------------------------------------------
+## Check if Direct I/O driver is enabled by --enable-direct-vfd
+##
 AC_CACHE_VAL([hdf5_cv_direct_io],
     AC_CHECK_DECL([O_DIRECT], [hdf5_cv_direct_io=yes], [hdf5_cv_direct_io=no], [[#include <fcntl.h>]]))
 AC_CACHE_VAL([hdf5_cv_posix_memalign],
@@ -2195,12 +2318,12 @@ AC_DEFINE_UNQUOTED([DEFAULT_PLUGINDIR], ["$default_plugindir"],
 ## Decide whether the presence of user's exception handling functions is
 ## checked and data conversion exceptions are returned.  This is mainly
 ## for the speed optimization of hard conversions.  Soft conversions can
-## actually benefit little.  
+## actually benefit little.
 ##
 AC_MSG_CHECKING([whether exception handling functions is checked during data conversions])
 AC_ARG_ENABLE([dconv-exception],
               [AS_HELP_STRING([--enable-dconv-exception],
-                              [if exception handling functions is checked during 
+                              [if exception handling functions is checked during
                               data conversions [default=yes]])],
               [DCONV_EXCEPTION=$enableval], [DCONV_EXCEPTION=yes])
 
@@ -2254,9 +2377,9 @@ esac
 
 ## ----------------------------------------------------------------------
 ## Set the flag to indicate that the machine is using a special algorithm to convert
-## 'long double' to '(unsigned) long' values.  (This flag should only be set for 
-## the IBM Power6 Linux.  When the bit sequence of long double is 
-## 0x4351ccf385ebc8a0bfcc2a3c3d855620, the converted value of (unsigned)long 
+## 'long double' to '(unsigned) long' values.  (This flag should only be set for
+## the IBM Power6 Linux.  When the bit sequence of long double is
+## 0x4351ccf385ebc8a0bfcc2a3c3d855620, the converted value of (unsigned)long
 ## is 0x004733ce17af227f, not the same as the library's conversion to 0x004733ce17af2282.
 ## The machine's conversion gets the correct value.  We define the macro and disable
 ## this kind of test until we figure out what algorithm they use.
@@ -2277,12 +2400,12 @@ else
                 unsigned char       s[16];
                 unsigned char       s2[8];
                 int                 ret = 1;
-                
+
                 if(sizeof(long double) == 16 && sizeof(long) == 8) {
-                    /*make sure the long double type has 16 bytes in size and 
+                    /*make sure the long double type has 16 bytes in size and
                      * 11 bits of exponent.  If it is,
-                     *the bit sequence should be like below.  It's not 
-                     *a decent way to check but this info isn't available. */   
+                     *the bit sequence should be like below.  It's not
+                     *a decent way to check but this info isn't available. */
                     memcpy(s, &ld, 16);
                     if(s[0]==0x43 && s[1]==0x51 && s[2]==0xcc && s[3]==0xf3 &&
                         s[4]==0x85 && s[5]==0xeb && s[6]==0xc8 && s[7]==0xa0 &&
@@ -2316,8 +2439,8 @@ else
                         if(s2[0]==0x00 && s2[1]==0x47 && s2[2]==0x33 && s2[3]==0xce &&
                            s2[4]==0x17 && s2[5]==0xaf && s2[6]==0x22 && s2[7]==0x7f)
                             ret = 0;
-                    }    
-                }   
+                    }
+                }
                 exit(ret);
         ]])]
     , [hdf5_cv_ldouble_to_long_special=yes], [hdf5_cv_ldouble_to_long_special=no],)])
@@ -2333,10 +2456,10 @@ fi
 
 ## ----------------------------------------------------------------------
 ## Set the flag to indicate that the machine is using a special algorithm
-## to convert some values of '(unsigned) long' to 'long double' values.  
-## (This flag should be off for all machines, except for IBM Power6 Linux, 
-## when the bit sequences are 003fff..., 007fff..., 00ffff..., 01ffff..., 
-## ..., 7fffff..., the compiler uses a unknown algorithm.  We define a 
+## to convert some values of '(unsigned) long' to 'long double' values.
+## (This flag should be off for all machines, except for IBM Power6 Linux,
+## when the bit sequences are 003fff..., 007fff..., 00ffff..., 01ffff...,
+## ..., 7fffff..., the compiler uses a unknown algorithm.  We define a
 ## macro and skip the test for now until we know about the algorithm.
 ##
 AC_MSG_CHECKING([if using special algorithm to convert (unsigned) long to long double values])
@@ -2354,17 +2477,17 @@ else
                 unsigned long       ull;
                 unsigned char       s[16];
                 int                 flag=0, ret=1;
-            
+
                 /*Determine if long double has 16 byte in size, 11 bit exponent, and
-                 *the bias is 0x3ff */ 
-                if(sizeof(long double) == 16) { 
+                 *the bias is 0x3ff */
+                if(sizeof(long double) == 16) {
                     ld = 1.0L;
                     memcpy(s, &ld, 16);
                     if(s[0]==0x3f && s[1]==0xf0 && s[2]==0x00 && s[3]==0x00 &&
-                        s[4]==0x00 && s[5]==0x00 && s[6]==0x00 && s[7]==0x00) 
-                        flag = 1; 
+                        s[4]==0x00 && s[5]==0x00 && s[6]==0x00 && s[7]==0x00)
+                        flag = 1;
                 }
-                 
+
                 if(flag==1 && sizeof(long)==8) {
                     ll = 0x003fffffffffffffL;
                     ld = (long double)ll;
@@ -2380,7 +2503,7 @@ else
                         s[8]==0xbf && s[9]==0xf0 && s[10]==0x00 && s[11]==0x00 &&
                         s[12]==0x00 && s[13]==0x00 && s[14]==0x00 && s[15]==0x00)
                         ret = 0;
-                }        
+                }
                 if(flag==1 && sizeof(unsigned long)==8) {
                     ull = 0xffffffffffffffffUL;
                     ld = (long double)ull;
@@ -2398,7 +2521,7 @@ else
                         s[8]==0xbf && s[9]==0xf0 && s[10]==0x00 && s[11]==0x00 &&
                         s[12]==0x00 && s[13]==0x00 && s[14]==0x00 && s[15]==0x00)
                         ret = 0;
-                }        
+                }
                 exit(ret);
         ]])]
     , [hdf5_cv_long_to_ldouble_special=yes], [hdf5_cv_long_to_ldouble_special=no],)])
@@ -2414,11 +2537,9 @@ fi
 
 ## ----------------------------------------------------------------------
 ## Set the flag to indicate that the machine can accurately convert
-## 'long double' to '(unsigned) long long' values. This flag should
-## be set for all machines, except for IBM XL C compilers. Historically,
-## this has also been a problem with OS X (version 10.4) but not current
-## versions of that OS.
-##
+## 'long double' to '(unsigned) long long' values.  (This flag should
+## be set for all machines, except for Mac OS 10.4, SGI IRIX64 6.5 and
+## Powerpc Linux using XL compilers.
 ## When the bit sequence of long double is 0x4351ccf385ebc8a0bfcc2a3c...,
 ## the values of (unsigned)long long start to go wrong on these
 ## two machines.  Adjusting it higher to 0x4351ccf385ebc8a0dfcc... or
@@ -2431,7 +2552,7 @@ if test ${ac_cv_sizeof_long_double} = 0; then
    hdf5_cv_ldouble_to_llong_accurate=${hdf5_cv_ldouble_to_llong_accurate=no}
 else
    AC_CACHE_VAL([hdf5_cv_ldouble_to_llong_accurate],
-        [AC_TRY_RUN([
+        [AC_RUN_IFELSE([AC_LANG_SOURCE([[
         int main(void)
         {
             long double         ld = 20041683600089727.779961L;
@@ -2468,7 +2589,7 @@ else
     done:
             exit(ret);
         }
-        ], [hdf5_cv_ldouble_to_llong_accurate=yes], [hdf5_cv_ldouble_to_llong_accurate=no],)])
+        ]])], [hdf5_cv_ldouble_to_llong_accurate=yes], [hdf5_cv_ldouble_to_llong_accurate=no],[])])
 fi
 
 if test ${hdf5_cv_ldouble_to_llong_accurate} = "yes"; then
@@ -2482,11 +2603,9 @@ fi
 
 ## ----------------------------------------------------------------------
 ## Set the flag to indicate that the machine can accurately convert
-## '(unsigned) long long' to 'long double' values. This flag should
-## be set for all machines, except for IBM XL C compilers. Historically,
-## this has also been a problem with OS X (version 10.4) but not current
-## versions of that OS.
-##
+## '(unsigned) long long' to 'long double' values.  (This flag should be
+## set for all machines, except for Mac OS 10.4 and Powerpc Linux using
+## XL compilers.
 ## When the bit sequences are 003fff..., 007fff..., 00ffff..., 01ffff...,
 ## ..., 7fffff..., the converted values are twice as big as they should be.
 ##
@@ -2496,7 +2615,7 @@ if test ${ac_cv_sizeof_long_double} = 0; then
    hdf5_cv_llong_to_ldouble_correct=${hdf5_cv_llong_to_ldouble_correct=no}
 else
    AC_CACHE_VAL([hdf5_cv_llong_to_ldouble_correct],
-        [AC_TRY_RUN([
+        [AC_RUN_IFELSE([AC_LANG_SOURCE([[
         int main(void)
         {
             long double         ld;
@@ -2537,7 +2656,7 @@ else
     done:
             exit(ret);
         }
-        ], [hdf5_cv_llong_to_ldouble_correct=yes], [hdf5_cv_llong_to_ldouble_correct=no],)])
+        ]])],[hdf5_cv_llong_to_ldouble_correct=yes], [hdf5_cv_llong_to_ldouble_correct=no],[])]) 
 fi
 
 if test ${hdf5_cv_llong_to_ldouble_correct} = "yes"; then
@@ -2712,8 +2831,8 @@ AC_MSG_CHECKING([which version of public symbols to use by default])
 AC_ARG_WITH([default-api-version],
             [AS_HELP_STRING([--with-default-api-version=(v16|v18|v110)],
                             [Specify default release version of public symbols
-                             [default=v18]])],,
-            withval=v18)
+                             [default=v110]])],,
+            [withval=v110])
 
 if test "X$withval" = "Xv16"; then
     AC_MSG_RESULT([v16])
@@ -2723,6 +2842,9 @@ if test "X$withval" = "Xv16"; then
 elif test "X$withval" = "Xv18"; then
     AC_MSG_RESULT([v18])
     DEFAULT_API_VERSION=v18
+elif test "X$withval" = "Xv110"; then
+    AC_MSG_RESULT([v110])
+    DEFAULT_API_VERSION=v110
 else
     AC_MSG_ERROR([invalid version of public symbols given])
 fi
@@ -2732,7 +2854,7 @@ fi
 ## if the user insists on doing this via the --enable-unsupported configure
 ## flag, we'll let them.
 if test "X${ALLOW_UNSUPPORTED}" != "Xyes"; then
-  if test "X${DEFAULT_API_VERSION}" != "Xv18" -a "X${DEPRECATED_SYMBOLS}" = "Xno" ; then
+  if test "X${DEFAULT_API_VERSION}" != "Xv110" -a "X${DEPRECATED_SYMBOLS}" = "Xno" ; then
     AC_MSG_ERROR([Removing old public API symbols not allowed when using them as default public API symbols. Use --enable-unsupported to override this error.])
   fi
 fi
@@ -2939,17 +3061,23 @@ AC_CONFIG_FILES([src/libhdf5.settings
                  test/Makefile
                  test/testcheck_version.sh
                  test/testerror.sh
+		        test/testflushrefresh.sh
                  test/H5srcdir_str.h
                  test/testlibinfo.sh
                  test/testlinks_env.sh
+                 test/testswmr.sh
                  test/test_plugin.sh
+                 test/test_usecases.sh
+                 test/testvdsswmr.sh
                  testpar/Makefile
                  tools/Makefile
                  tools/h5dump/Makefile
                  tools/h5dump/testh5dump.sh
                  tools/h5dump/testh5dumppbits.sh
+                 tools/h5dump/testh5dumpvds.sh
                  tools/h5dump/testh5dumpxml.sh
                  tools/h5ls/testh5ls.sh
+                 tools/h5ls/testh5lsvds.sh
                  tools/h5import/Makefile
                  tools/h5import/h5importtestutil.sh
                  tools/h5diff/Makefile
@@ -2966,10 +3094,14 @@ AC_CONFIG_FILES([src/libhdf5.settings
                  tools/lib/Makefile
                  tools/misc/Makefile
                  tools/misc/h5cc
+		 tools/misc/testh5clear.sh
                  tools/misc/testh5mkgrp.sh
                  tools/misc/testh5repart.sh
+                 tools/misc/vds/Makefile
                  tools/h5stat/testh5stat.sh
                  tools/h5stat/Makefile
+                 tools/h5format_convert/Makefile
+                 tools/h5format_convert/testh5fc.sh
                  tools/perform/Makefile
                  examples/Makefile
                  examples/run-c-ex.sh
@@ -2985,6 +3117,7 @@ AC_CONFIG_FILES([src/libhdf5.settings
                  fortran/Makefile
                  fortran/src/h5fc
                  fortran/src/Makefile
+                 fortran/src/H5fort_type_defines.h
                  fortran/test/Makefile
                  fortran/testpar/Makefile
                  fortran/examples/Makefile
@@ -2997,6 +3130,8 @@ AC_CONFIG_FILES([src/libhdf5.settings
                  hl/tools/Makefile
                  hl/tools/gif2h5/Makefile
                  hl/tools/gif2h5/h52giftest.sh
+		 hl/tools/h5watch/Makefile
+                 hl/tools/h5watch/testh5watch.sh
                  hl/examples/Makefile
                  hl/examples/run-hlc-ex.sh
                  hl/c++/Makefile
@@ -3026,10 +3161,7 @@ fi
 ## linker flags:  -l with no library name; -l <libname>, specifically gfortran or m.
 ## This sed script corrects "-l <libname>" first and then "-l " with no library name.
 ## If the order is not preserved, all instances of "-l " will be removed.
-## The -i option for sed doesn't work on some systems, so a temporary file is used
-## and used to overwrite the original libtool file.
-sed -e '/^postdeps/ s/-l \([a-zA-Z]\)/-l\1/g' -e '/^postdeps/ s/-l //g' libtool > libtool_rev
-mv -f libtool_rev libtool
+sed -e '/^postdeps/ s/-l \([a-zA-Z]\)/-l\1/g' -e '/^postdeps/ s/-l //g' -i libtool
 
 ## show the configure settings
 cat src/libhdf5.settings
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index 7953161..8849ce7 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -34,6 +34,14 @@ set (examples
     h5_extlink
     h5_elink_unix2win
     h5_shared_mesg
+    h5_vds
+    h5_vds-exc
+    h5_vds-exclim
+    h5_vds-eiger
+    h5_vds-simpleIO
+    h5_vds-percival
+    h5_vds-percival-unlim
+    h5_vds-percival-unlim-maxmin
 )
 
 foreach (example ${examples})
diff --git a/examples/CMakeTests.cmake b/examples/CMakeTests.cmake
index 42b42b3..2cf82b8 100644
--- a/examples/CMakeTests.cmake
+++ b/examples/CMakeTests.cmake
@@ -46,6 +46,18 @@
           blue/prefix_target.h5
           red/prefix_target.h5
           u2w/u2w_target.h5
+          vds.h5
+          vds-excalibur.h5
+          vds-exclim.h5
+          vds-percival.h5
+          vds-percival-unlim.h5
+          vds-percival-unlim-maxmin.h5
+          a.h5
+          b.h5
+          c.h5
+          d.h5
+          vds-simpleIO.h5
+          vds-eiger.h5
   )
   if (NOT "${last_test}" STREQUAL "")
     set_tests_properties (EXAMPLES-clear-objects PROPERTIES DEPENDS ${last_test})
diff --git a/examples/Makefile.am b/examples/Makefile.am
index 450f9fb..883b99d 100644
--- a/examples/Makefile.am
+++ b/examples/Makefile.am
@@ -37,7 +37,9 @@ EXAMPLE_PROG = h5_write h5_read h5_extend_write h5_chunk_read h5_compound \
            h5_crtgrpd h5_subset h5_cmprss h5_rdwt h5_crtgrpar h5_extend \
            h5_crtatt h5_crtgrp h5_crtdat \
            h5_group h5_select h5_attribute h5_mount h5_reference h5_drivers \
-           h5_ref2reg h5_extlink h5_elink_unix2win h5_shared_mesg
+           h5_ref2reg h5_extlink h5_elink_unix2win h5_shared_mesg h5_vds h5_vds-exc \
+           h5_vds-exclim h5_vds-eiger h5_vds-simpleIO h5_vds-percival \
+           h5_vds-percival-unlim h5_vds-percival-unlim-maxmin
 TEST_SCRIPT=testh5cc.sh 
 TEST_EXAMPLES_SCRIPT=$(INSTALL_SCRIPT_FILES)
 
@@ -48,7 +50,9 @@ INSTALL_FILES = h5_write.c h5_read.c h5_extend_write.c h5_chunk_read.c   \
           h5_extend.c h5_crtatt.c h5_crtgrp.c h5_crtdat.c \
           h5_compound.c h5_group.c h5_select.c h5_attribute.c h5_mount.c \
           h5_reference.c h5_drivers.c h5_extlink.c h5_elink_unix2win.c   \
-          h5_ref2reg.c h5_shared_mesg.c ph5example.c
+          h5_ref2reg.c h5_shared_mesg.c ph5example.c h5_vds.c h5_vds-exc.c \
+          h5_vds-exclim.c h5_vds-eiger.c h5_vds-simpleIO.c h5_vds-percival.c \
+          h5_vds-percival-unlim.c h5_vds-percival-unlim-maxmin.c
 
 
 
@@ -82,8 +86,8 @@ CHECK_CLEANFILES+=$(EXTLINK_DIRS)
 
 # Example directory
 # Note: no '/' after DESTDIR.  Explanation in commence.am
-EXAMPLEDIR=${DESTDIR}$(datarootdir)/hdf5_examples/c
-EXAMPLETOPDIR=${DESTDIR}$(datarootdir)/hdf5_examples
+EXAMPLEDIR=${DESTDIR}$(exec_prefix)/share/hdf5_examples/c
+EXAMPLETOPDIR=${DESTDIR}$(exec_prefix)/share/hdf5_examples
 
 # List dependencies for each program.  Normally, automake would take
 # care of this for us, but if we tell automake about the programs it
@@ -117,6 +121,14 @@ h5_dtransform: $(srcdir)/h5_dtransform.c
 h5_extlink: $(srcdir)/h5_extlink.c $(EXTLINK_DIRS)
 h5_elink_unix2win: $(srcdir)/h5_elink_unix2win.c $(EXTLINK_DIRS)
 h5_shared_mesg: $(srcdir)/h5_shared_mesg.c
+h5_vds: $(srcdir)/h5_vds.c
+h5_vds-exc: $(srcdir)/h5_vds-exc.c
+h5_vds-exclim: $(srcdir)/h5_vds-exclim.c
+h5_vds-eiger: $(srcdir)/h5_vds-eiger.c
+h5_vds-simpleIO: $(srcdir)/h5_vds-simpleIO.c
+h5_vds-percival: $(srcdir)/h5_vds-percival.c
+h5_vds-percival-unlim: $(srcdir)/h5_vds-percival-unlim.c
+h5_vds-percival-unlim-maxmin: $(srcdir)/h5_vds-percival-unlim-maxmin.c
 
 if BUILD_SHARED_SZIP_CONDITIONAL
 LD_LIBRARY_PATH=$(LL_PATH)
diff --git a/examples/Makefile.in b/examples/Makefile.in
index ce54e93..11b9e6a 100644
--- a/examples/Makefile.in
+++ b/examples/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -35,7 +35,17 @@
 # built using h5cc (or h5fc, etc.) instead of the standard compilers.
 # This creates some extra work for us.
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -98,21 +108,20 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/examples.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/run-c-ex.sh.in $(srcdir)/testh5cc.sh.in \
-	$(top_srcdir)/bin/test-driver README
 TESTS = $(TEST_SCRIPT)
 subdir = examples
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES = run-c-ex.sh testh5cc.sh
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_P = $(am__v_P_ at AM_V@)
@@ -335,6 +344,11 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/run-c-ex.sh.in \
+	$(srcdir)/testh5cc.sh.in $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am \
+	$(top_srcdir)/config/examples.am README
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -351,7 +365,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -396,14 +409,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -413,13 +434,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -461,9 +481,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -615,7 +646,9 @@ EXAMPLE_PROG = h5_write h5_read h5_extend_write h5_chunk_read h5_compound \
            h5_crtgrpd h5_subset h5_cmprss h5_rdwt h5_crtgrpar h5_extend \
            h5_crtatt h5_crtgrp h5_crtdat \
            h5_group h5_select h5_attribute h5_mount h5_reference h5_drivers \
-           h5_ref2reg h5_extlink h5_elink_unix2win h5_shared_mesg
+           h5_ref2reg h5_extlink h5_elink_unix2win h5_shared_mesg h5_vds h5_vds-exc \
+           h5_vds-exclim h5_vds-eiger h5_vds-simpleIO h5_vds-percival \
+           h5_vds-percival-unlim h5_vds-percival-unlim-maxmin
 
 TEST_SCRIPT = testh5cc.sh 
 TEST_EXAMPLES_SCRIPT = $(INSTALL_SCRIPT_FILES)
@@ -627,7 +660,9 @@ INSTALL_FILES = h5_write.c h5_read.c h5_extend_write.c h5_chunk_read.c   \
           h5_extend.c h5_crtatt.c h5_crtgrp.c h5_crtdat.c \
           h5_compound.c h5_group.c h5_select.c h5_attribute.c h5_mount.c \
           h5_reference.c h5_drivers.c h5_extlink.c h5_elink_unix2win.c   \
-          h5_ref2reg.c h5_shared_mesg.c ph5example.c
+          h5_ref2reg.c h5_shared_mesg.c ph5example.c h5_vds.c h5_vds-exc.c \
+          h5_vds-exclim.c h5_vds-eiger.c h5_vds-simpleIO.c h5_vds-percival.c \
+          h5_vds-percival-unlim.c h5_vds-percival-unlim-maxmin.c
 
 
 # The external link examples demonstrate how to use paths; they need
@@ -636,8 +671,8 @@ EXTLINK_DIRS = red blue u2w
 
 # Example directory
 # Note: no '/' after DESTDIR.  Explanation in commence.am
-EXAMPLEDIR = ${DESTDIR}$(datarootdir)/hdf5_examples/c
-EXAMPLETOPDIR = ${DESTDIR}$(datarootdir)/hdf5_examples
+EXAMPLEDIR = ${DESTDIR}$(exec_prefix)/share/hdf5_examples/c
+EXAMPLETOPDIR = ${DESTDIR}$(exec_prefix)/share/hdf5_examples
 @BUILD_SHARED_SZIP_CONDITIONAL_TRUE at LD_LIBRARY_PATH = $(LL_PATH)
 
 # Assume that all tests in this directory are examples, and tell
@@ -683,7 +718,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign examples/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign examples/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -692,7 +726,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/examples.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/examples.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -749,7 +783,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1017,6 +1051,8 @@ uninstall-am: uninstall-local
 	pdf-am ps ps-am recheck tags-am uninstall uninstall-am \
 	uninstall-local
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
@@ -1080,6 +1116,14 @@ h5_dtransform: $(srcdir)/h5_dtransform.c
 h5_extlink: $(srcdir)/h5_extlink.c $(EXTLINK_DIRS)
 h5_elink_unix2win: $(srcdir)/h5_elink_unix2win.c $(EXTLINK_DIRS)
 h5_shared_mesg: $(srcdir)/h5_shared_mesg.c
+h5_vds: $(srcdir)/h5_vds.c
+h5_vds-exc: $(srcdir)/h5_vds-exc.c
+h5_vds-exclim: $(srcdir)/h5_vds-exclim.c
+h5_vds-eiger: $(srcdir)/h5_vds-eiger.c
+h5_vds-simpleIO: $(srcdir)/h5_vds-simpleIO.c
+h5_vds-percival: $(srcdir)/h5_vds-percival.c
+h5_vds-percival-unlim: $(srcdir)/h5_vds-percival-unlim.c
+h5_vds-percival-unlim-maxmin: $(srcdir)/h5_vds-percival-unlim-maxmin.c
 
 # How to create EXAMPLEDIR if it doesn't already exist
 $(EXAMPLEDIR):
diff --git a/examples/h5_extend_write.c b/examples/h5_extend_write.c
index 495b49d..56bd025 100644
--- a/examples/h5_extend_write.c
+++ b/examples/h5_extend_write.c
@@ -165,9 +165,9 @@ main (void)
     /*
      * Resulting dataset
      *
-     *   1 1 1 3 3
-     *   1 1 1 3 3
-     *   1 1 1 0 0
+     *	 1 1 1 3 3 
+     *	 1 1 1 3 3
+     *	 1 1 1 0 0
      *	 2 0 0 0 0
      *	 2 0 0 0 0
      *	 2 0 0 0 0
diff --git a/examples/h5_ref2reg.c b/examples/h5_ref2reg.c
index 17ec724..c4e8d3d 100644
--- a/examples/h5_ref2reg.c
+++ b/examples/h5_ref2reg.c
@@ -130,7 +130,7 @@ int main(void)
     /*
      * Dereference the first reference.
      */
-    dsetv_id = H5Rdereference(dsetr_id, H5R_DATASET_REGION, &ref_out[0]);
+    dsetv_id = H5Rdereference2(dsetr_id, H5P_DEFAULT, H5R_DATASET_REGION, &ref_out[0]);
     /*
      * Get name of the dataset the first region reference points to
      * using H5Rget_name
@@ -177,7 +177,7 @@ int main(void)
     /*
      * Dereference the second reference.
      */
-    dsetv_id = H5Rdereference(dsetr_id, H5R_DATASET_REGION, &ref_out[1]);
+    dsetv_id = H5Rdereference2(dsetr_id, H5P_DEFAULT, H5R_DATASET_REGION, &ref_out[1]);
     space_id = H5Rget_region(dsetv_id, H5R_DATASET_REGION,&ref_out[1]);
 
     /*
diff --git a/examples/h5_reference.c b/examples/h5_reference.c
index afd550c..38e6146 100644
--- a/examples/h5_reference.c
+++ b/examples/h5_reference.c
@@ -128,7 +128,7 @@ main(void) {
    /*
     *  Get datatype of the dataset "B"
     */
-   did_b = H5Rdereference(did_r, H5R_OBJECT, &rbuf[1]);
+   did_b = H5Rdereference2(did_r, H5P_DEFAULT, H5R_OBJECT, &rbuf[1]);
    tid_b = H5Dget_type(did_b);
    if(H5Tequal(tid_b, H5T_NATIVE_FLOAT))
      printf("Datatype of the dataset is H5T_NATIVE_FLOAT.\n");
diff --git a/examples/h5_vds-eiger.c b/examples/h5_vds-eiger.c
new file mode 100644
index 0000000..ea22243
--- /dev/null
+++ b/examples/h5_vds-eiger.c
@@ -0,0 +1,177 @@
+/************************************************************
+
+  This example illustrates the concept of the virtual dataset.
+  Eiger use case. Every 5 frames 10x10 are in the source 
+  dataset "/A" in file with the name f-<#>.h5
+  This file is intended for use with HDF5 Library version 1.10
+
+ ************************************************************/
+/* EIP Add link to the picture */
+
+#include "hdf5.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#define FILE         "vds-eiger.h5"
+#define DATASET      "VDS-Eiger"
+#define VDSDIM0       5 
+#define VDSDIM1       10 
+#define VDSDIM2       10 
+#define DIM0          5 
+#define DIM1          10 
+#define DIM2          10 
+#define RANK          3 
+
+int
+main (void)
+{
+    hid_t        file, src_space, vspace,
+                 dset;                       /* Handles */
+    hid_t        dcpl;
+    herr_t       status;
+    hsize_t      vdsdims[3] = {VDSDIM0, VDSDIM1, VDSDIM2},
+                 vdsdims_max[3] = {H5S_UNLIMITED, VDSDIM1, VDSDIM1},
+                 dims[3] = {DIM0, DIM1, DIM2},
+                 start[3],                   /* Hyperslab parameters */
+                 stride[3],
+                 count[3],
+                 block[3];
+    hsize_t      start_out[3],               /* Hyperslab parameter out */
+                 stride_out[3],
+                 count_out[3],
+                 block_out[3];
+    int          i;
+    H5D_layout_t layout;                     /* Storage layout */
+    size_t       num_map;                    /* Number of mappings */
+    ssize_t      len;                        /* Length of the string; also a return value */
+    char         *filename;
+    char         *dsetname;
+
+
+    file = H5Fcreate (FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create VDS dataspace.  */
+    vspace = H5Screate_simple (RANK, vdsdims, vdsdims_max);
+
+    /* Create dataspaces for the source dataset. */
+    src_space = H5Screate_simple (RANK, dims, NULL);
+
+    /* Create VDS creation property */
+    dcpl = H5Pcreate (H5P_DATASET_CREATE);
+     
+    /* Initialize hyperslab values */
+
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 0;
+    stride[0] = DIM0;
+    stride[1] = 1;
+    stride[2] = 1;
+    count[0] = H5S_UNLIMITED;
+    count[1] = 1;
+    count[2] = 1;
+    block[0] = DIM0;
+    block[1] = DIM1;
+    block[2] = DIM2;
+
+   /* 
+    * Build the mappings 
+    *
+    */
+      status = H5Sselect_hyperslab (vspace, H5S_SELECT_SET, start, stride, count, block);
+      status = H5Pset_virtual (dcpl, vspace, "f-%b.h5", "/A", src_space);
+   
+
+
+   /* Create a virtual dataset */
+      dset = H5Dcreate2 (file, DATASET, H5T_NATIVE_INT, vspace, H5P_DEFAULT,
+                  dcpl, H5P_DEFAULT);
+      status = H5Sclose (vspace);
+      status = H5Sclose (src_space);
+      status = H5Dclose (dset);
+      status = H5Fclose (file);    
+     
+
+    /*
+     * Now we begin the read section of this example.
+     */
+
+    /*
+     * Open file and dataset using the default properties.
+     */
+    file = H5Fopen (FILE, H5F_ACC_RDONLY, H5P_DEFAULT);
+    dset = H5Dopen2 (file, DATASET, H5P_DEFAULT);
+
+    /*
+     * Get creation property list and mapping properties.
+     */
+    dcpl = H5Dget_create_plist (dset);
+
+    /*
+     * Get storage layout.
+     */
+    layout = H5Pget_layout (dcpl);
+
+    if (H5D_VIRTUAL == layout) 
+        printf(" Dataset has a virtual layout \n");
+    else
+        printf(" Wrong layout found \n");
+
+     /*
+      * Find number of mappings.
+      */
+     status = H5Pget_virtual_count (dcpl, &num_map);
+     printf(" Number of mappings is %d\n", (int)num_map);
+
+     /* 
+      * Get mapping parameters for each mapping.
+      */
+      for (i = 0; i < (int)num_map; i++) {   
+      printf(" Mapping %d \n", i);
+      printf("         Selection in the virtual dataset \n");
+      /* Get selection in the virttual  dataset */
+          vspace = H5Pget_virtual_vspace (dcpl, (size_t)i);
+          if (H5Sget_select_type(vspace) == H5S_SEL_HYPERSLABS) { 
+              if (H5Sis_regular_hyperslab(vspace)) {
+                   status = H5Sget_regular_hyperslab (vspace, start_out, stride_out, count_out, block_out);
+                   printf("         start  = [%llu, %llu, %llu] \n", (unsigned long long)start_out[0], (unsigned long long)start_out[1], (unsigned long long)start_out[2]);
+                   printf("         stride = [%llu, %llu, %llu] \n", (unsigned long long)stride_out[0], (unsigned long long)stride_out[1], (unsigned long long)stride_out[2]);
+                   printf("         count  = [%llu, %llu, %llu] \n", (unsigned long long)count_out[0], (unsigned long long)count_out[1], (unsigned long long)count_out[2]);
+                   printf("         block  = [%llu, %llu, %llu] \n", (unsigned long long)block_out[0], (unsigned long long)block_out[1], (unsigned long long)block_out[2]);
+               }
+          }
+      /* Get source file name */
+          len = H5Pget_virtual_filename (dcpl, (size_t)i, NULL, 0);
+          filename = (char *)malloc((size_t)len*sizeof(char)+1);
+          H5Pget_virtual_filename (dcpl, (size_t)i, filename, len+1);
+          printf("         Source filename %s\n", filename);
+
+      /* Get source dataset name */
+          len = H5Pget_virtual_dsetname (dcpl, (size_t)i, NULL, 0);
+          dsetname = (char *)malloc((size_t)len*sizeof(char)+1);
+          H5Pget_virtual_dsetname (dcpl, (size_t)i, dsetname, len+1);
+          printf("         Source dataset name %s\n", dsetname);
+
+      /* Get selection in the source dataset */
+          printf("         Selection in the source dataset ");
+          src_space = H5Pget_virtual_srcspace (dcpl, (size_t)i);
+          if(H5Sget_select_type(src_space) == H5S_SEL_ALL) {
+                  printf("H5S_ALL \n");
+          }
+/* EIP read data back */
+          H5Sclose(vspace);
+          H5Sclose(src_space);
+          free(filename);
+          free(dsetname);
+      }
+
+    /*
+     * Close and release resources.
+     */
+    status = H5Pclose (dcpl);
+    status = H5Dclose (dset);
+    status = H5Fclose (file);
+
+    return 0;
+}
+
diff --git a/examples/h5_vds-exc.c b/examples/h5_vds-exc.c
new file mode 100644
index 0000000..039cdb8
--- /dev/null
+++ b/examples/h5_vds-exc.c
@@ -0,0 +1,226 @@
+/************************************************************
+
+  This example illustrates the concept of the virtual dataset.
+  Excalibur use case with k=2 and m=3.
+  This file is intended for use with HDF5 Library version 1.10
+
+ ************************************************************/
+/* EIP Add link to the picture */
+
+#include "hdf5.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#define FILE         "vds-exc.h5"
+#define DATASET      "VDS-Excalibur"
+#define VDSDIM0         0 
+#define VDSDIM1         15 
+#define VDSDIM2         6 
+#define KDIM0           0 
+#define KDIM1           2 
+#define KDIM2           6 
+#define NDIM0           0 
+#define NDIM1           3 
+#define NDIM2           6 
+#define RANK            3 
+
+const char *SRC_FILE[] = {
+    "a.h5",
+    "b.h5",
+    "c.h5",
+    "d.h5",
+    "e.h5",
+    "f.h5"
+};
+
+const char *SRC_DATASET[] = {
+    "A",
+    "B",
+    "C",
+    "D",
+    "E",
+    "F"
+};
+
+int
+main (void)
+{
+    hid_t        file, space, ksrc_space, nsrc_space, vspace,
+                 src_space,
+                 dset;                       /* Handles */
+    hid_t        dcpl;
+    herr_t       status;
+    hsize_t      vdsdims[3] = {VDSDIM0, VDSDIM1, VDSDIM2},
+                 vdsdims_max[3] = {H5S_UNLIMITED,VDSDIM1, VDSDIM2},
+                 kdims[3] = {KDIM0, KDIM1, KDIM2},
+                 kdims_max[3] = {H5S_UNLIMITED, KDIM1, KDIM2},
+                 ndims[3] = {NDIM0, NDIM1, NDIM2},
+                 ndims_max[3] = {H5S_UNLIMITED, NDIM1, NDIM2},
+                 start[3],                   /* Hyperslab parameters */
+                 stride[3],
+                 count[3],
+                 block[3];
+    hsize_t      start_out[3],
+                 stride_out[3],
+                 count_out[3],
+                 block_out[3];
+    int          k = 2;
+    int          n = 3;
+    int          i;
+    H5D_layout_t layout;                     /* Storage layout */
+    size_t       num_map;                    /* Number of mappings */
+    ssize_t      len;                        /* Length of the string; also a return value */
+    char         *filename;
+    char         *dsetname;
+
+
+    file = H5Fcreate (FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create VDS dataspace.  */
+    space = H5Screate_simple (RANK, vdsdims, vdsdims_max);
+    /* Create dataspaces for A, C, and E datasets. */
+    ksrc_space = H5Screate_simple (RANK, kdims, kdims_max);
+    /* Create dataspaces for B, D, and F datasets. */
+    nsrc_space = H5Screate_simple (RANK, ndims, ndims_max);
+
+    /* Create VDS creation property */
+    dcpl = H5Pcreate (H5P_DATASET_CREATE);
+     
+    /* Initialize hyperslab values */
+
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 0;
+    count[0] = H5S_UNLIMITED;
+    count[1] = 1;
+    count[2] = 1;
+    block[0] = 1;
+    block[1] = k;
+    block[2] = VDSDIM2;
+
+   /* 
+    * Build the mappings for A, C and E source datasets.
+    * Unlimited hyperslab selection is the same in the source datasets.
+    * Unlimited hyperslab selections in the virtual dataset have different offsets.
+    */
+   status = H5Sselect_hyperslab (ksrc_space, H5S_SELECT_SET, start, NULL, count, block);
+   for (i = 0; i < 3; i++) {
+      start[1] = (hsize_t)((k+n)*i);
+      status = H5Sselect_hyperslab (space, H5S_SELECT_SET, start, NULL, count, block);
+      status = H5Pset_virtual (dcpl, space, SRC_FILE[2*i], SRC_DATASET[2*i], ksrc_space);
+   }
+
+   /* Reinitialize start[1] and block[1] to build the second set of mappings. */
+   start[1] = 0;
+   block[1] = n;
+   /* 
+    * Build the mappings for B, D and F source datasets.
+    * Unlimited hyperslab selection is the same in the source datasets.
+    * Unlimited hyperslab selections in the virtual dataset have different offsets.
+    */
+   status = H5Sselect_hyperslab (nsrc_space, H5S_SELECT_SET, start, NULL, count, block);
+   for (i = 0; i < 3; i++) {
+      start[1] = (hsize_t)(k+(k+n)*i);
+      status = H5Sselect_hyperslab (space, H5S_SELECT_SET, start, NULL, count, block);
+      status = H5Pset_virtual (dcpl, space, SRC_FILE[2*i+1], SRC_DATASET[2*i+1], nsrc_space);
+   }
+
+   /* Create a virtual dataset */
+      dset = H5Dcreate2 (file, DATASET, H5T_NATIVE_INT, space, H5P_DEFAULT,
+                  dcpl, H5P_DEFAULT);
+      status = H5Sclose (space);
+      status = H5Sclose (nsrc_space);
+      status = H5Sclose (ksrc_space);
+      status = H5Dclose (dset);
+      status = H5Fclose (file);    
+     
+
+    /*
+     * Now we begin the read section of this example.
+     */
+
+    /*
+     * Open file and dataset using the default properties.
+     */
+    file = H5Fopen (FILE, H5F_ACC_RDONLY, H5P_DEFAULT);
+    dset = H5Dopen2 (file, DATASET, H5P_DEFAULT);
+
+    /*
+     * Get creation property list and mapping properties.
+     */
+    dcpl = H5Dget_create_plist (dset);
+
+    /*
+     * Get storage layout.
+     */
+    layout = H5Pget_layout (dcpl);
+
+    if (H5D_VIRTUAL == layout) 
+        printf(" Dataset has a virtual layout \n");
+    else
+        printf("Wrong layout found \n");
+
+     /*
+      * Find number of mappings.
+      */
+     status = H5Pget_virtual_count (dcpl, &num_map);
+     printf(" Number of mappings is %lu\n", (unsigned long)num_map);
+
+     /* 
+      * Get mapping parameters for each mapping.
+      */
+      for (i = 0; i < (int)num_map; i++) {   
+      printf(" Mapping %d \n", i);
+      printf("         Selection in the virtual dataset \n");
+      /* Get selection in the virttual  dataset */
+          vspace = H5Pget_virtual_vspace (dcpl, (size_t)i);
+          if (H5Sget_select_type(vspace) == H5S_SEL_HYPERSLABS) { 
+              if (H5Sis_regular_hyperslab(vspace)) {
+                   status = H5Sget_regular_hyperslab (vspace, start_out, stride_out, count_out, block_out);
+                   printf("         start  = [%llu, %llu, %llu] \n", (unsigned long long)start_out[0], (unsigned long long)start_out[1], (unsigned long long)start_out[2]);
+                   printf("         stride = [%llu, %llu, %llu] \n", (unsigned long long)stride_out[0], (unsigned long long)stride_out[1], (unsigned long long)stride_out[2]);
+                   printf("         count  = [%llu, %llu, %llu] \n", (unsigned long long)count_out[0], (unsigned long long)count_out[1], (unsigned long long)count_out[2]);
+                   printf("         block  = [%llu, %llu, %llu] \n", (unsigned long long)block_out[0], (unsigned long long)block_out[1], (unsigned long long)block_out[2]);
+               }
+          }
+      /* Get source file name */
+          len = H5Pget_virtual_filename (dcpl, (size_t)i, NULL, 0);
+          filename = (char *)malloc((size_t)len*sizeof(char)+1);
+          H5Pget_virtual_filename (dcpl, (size_t)i, filename, len+1);
+          printf("         Source filename %s\n", filename);
+
+      /* Get source dataset name */
+          len = H5Pget_virtual_dsetname (dcpl, (size_t)i, NULL, 0);
+          dsetname = (char *)malloc((size_t)len*sizeof(char)+1);
+          H5Pget_virtual_dsetname (dcpl, (size_t)i, dsetname, len+1);
+          printf("         Source dataset name %s\n", dsetname);
+
+      /* Get selection in the source dataset */
+          printf("         Selection in the source dataset \n");
+          src_space = H5Pget_virtual_srcspace (dcpl, (size_t)i);
+          if (H5Sget_select_type(src_space) == H5S_SEL_HYPERSLABS) { 
+              if (H5Sis_regular_hyperslab(vspace)) {
+                   status = H5Sget_regular_hyperslab (src_space, start_out, stride_out, count_out, block_out);
+                   printf("         start  = [%llu, %llu, %llu] \n", (unsigned long long)start_out[0], (unsigned long long)start_out[1], (unsigned long long)start_out[2]);
+                   printf("         stride = [%llu, %llu, %llu] \n", (unsigned long long)stride_out[0], (unsigned long long)stride_out[1], (unsigned long long)stride_out[2]);
+                   printf("         count  = [%llu, %llu, %llu] \n", (unsigned long long)count_out[0], (unsigned long long)count_out[1], (unsigned long long)count_out[2]);
+                   printf("         block  = [%llu, %llu, %llu] \n", (unsigned long long)block_out[0], (unsigned long long)block_out[1], (unsigned long long)block_out[2]);
+               }
+          }
+          H5Sclose(vspace);
+          H5Sclose(src_space);
+          free(filename);
+          free(dsetname);
+      }
+/* EIP read data back */
+
+    /*
+     * Close and release resources.
+     */
+    status = H5Pclose (dcpl);
+    status = H5Dclose (dset);
+    status = H5Fclose (file);
+
+    return 0;
+}
+
diff --git a/examples/h5_vds-exclim.c b/examples/h5_vds-exclim.c
new file mode 100644
index 0000000..4933471
--- /dev/null
+++ b/examples/h5_vds-exclim.c
@@ -0,0 +1,222 @@
+/************************************************************
+
+  This example illustrates the concept of the virtual dataset.
+  Excalibur use case with k=2 and m=3 and only 3 planes in
+  Z-direction (i.e., not unlimited).
+  This file is intended for use with HDF5 Library version 1.10
+
+ ************************************************************/
+/* EIP Add link to the picture */
+
+#include "hdf5.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#define FILE         "vds-exclim.h5"
+#define DATASET      "VDS-Excaliburlim"
+#define VDSDIM0         3 
+#define VDSDIM1         15 
+#define VDSDIM2         6 
+#define KDIM0           3 
+#define KDIM1           2 
+#define KDIM2           6 
+#define NDIM0           3 
+#define NDIM1           3 
+#define NDIM2           6 
+#define RANK            3 
+
+const char *SRC_FILE[] = {
+    "a.h5",
+    "b.h5",
+    "c.h5",
+    "d.h5",
+    "e.h5",
+    "f.h5"
+};
+
+const char *SRC_DATASET[] = {
+    "A",
+    "B",
+    "C",
+    "D",
+    "E",
+    "F"
+};
+
+int
+main (void)
+{
+    hid_t        file, space, ksrc_space, nsrc_space, vspace,
+                 src_space,
+                 dset;                       /* Handles */
+    hid_t        dcpl;
+    herr_t       status;
+    hsize_t      vdsdims[3] = {VDSDIM0, VDSDIM1, VDSDIM2},
+                 kdims[3] = {KDIM0, KDIM1, KDIM2},
+                 ndims[3] = {NDIM0, NDIM1, NDIM2},
+                 start[3],                   /* Hyperslab parameters */
+                 stride[3],
+                 count[3],
+                 block[3];
+    hsize_t      start_out[3],
+                 stride_out[3],
+                 count_out[3],
+                 block_out[3];
+    int          k = 2;
+    int          n = 3;
+    int          i;
+    H5D_layout_t layout;                     /* Storage layout */
+    size_t       num_map;                    /* Number of mappings */
+    ssize_t      len;                        /* Length of the string; also a return value */
+    char         *filename;
+    char         *dsetname;
+
+
+    file = H5Fcreate (FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create VDS dataspace.  */
+    space = H5Screate_simple (RANK, vdsdims, NULL);
+    /* Create dataspaces for A, C, and E datasets. */
+    ksrc_space = H5Screate_simple (RANK, kdims, NULL);
+    /* Create dataspaces for B, D, and F datasets. */
+    nsrc_space = H5Screate_simple (RANK, ndims, NULL);
+
+    /* Create VDS creation property */
+    dcpl = H5Pcreate (H5P_DATASET_CREATE);
+     
+    /* Initialize hyperslab values */
+
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 0;
+    count[0] = VDSDIM0;
+    count[1] = 1;
+    count[2] = 1;
+    block[0] = 1;
+    block[1] = k;
+    block[2] = VDSDIM2;
+
+   /* 
+    * Build the mappings for A, C and E source datasets.
+    *
+    */
+   status = H5Sselect_hyperslab (ksrc_space, H5S_SELECT_SET, start, NULL, count, block);
+   for (i = 0; i < 3; i++) {
+      start[1] = (hsize_t)((k+n)*i);
+      status = H5Sselect_hyperslab (space, H5S_SELECT_SET, start, NULL, count, block);
+      status = H5Pset_virtual (dcpl, space, SRC_FILE[2*i], SRC_DATASET[2*i], ksrc_space);
+   }
+
+   /* Reinitialize start[0] and block[1] */
+   start[0] = 0;
+   block[1] = n;
+   /* 
+    * Build the mappings for B, D and F source datasets.
+    *
+    */
+   status = H5Sselect_hyperslab (nsrc_space, H5S_SELECT_SET, start, NULL, count, block);
+   for (i = 0; i < 3; i++) {
+      start[1] = (hsize_t)(k+(k+n)*i);
+      status = H5Sselect_hyperslab (space, H5S_SELECT_SET, start, NULL, count, block);
+      status = H5Pset_virtual (dcpl, space, SRC_FILE[2*i+1], SRC_DATASET[2*i+1], nsrc_space);
+   }
+
+   /* Create a virtual dataset */
+      dset = H5Dcreate2 (file, DATASET, H5T_NATIVE_INT, space, H5P_DEFAULT,
+                  dcpl, H5P_DEFAULT);
+      status = H5Sclose (space);
+      status = H5Sclose (nsrc_space);
+      status = H5Sclose (ksrc_space);
+      status = H5Dclose (dset);
+      status = H5Fclose (file);    
+     
+
+    /*
+     * Now we begin the read section of this example.
+     */
+
+    /*
+     * Open file and dataset using the default properties.
+     */
+    file = H5Fopen (FILE, H5F_ACC_RDONLY, H5P_DEFAULT);
+    dset = H5Dopen2 (file, DATASET, H5P_DEFAULT);
+
+    /*
+     * Get creation property list and mapping properties.
+     */
+    dcpl = H5Dget_create_plist (dset);
+
+    /*
+     * Get storage layout.
+     */
+    layout = H5Pget_layout (dcpl);
+
+    if (H5D_VIRTUAL == layout) 
+        printf(" Dataset has a virtual layout \n");
+    else
+        printf("Wrong layout found \n");
+
+     /*
+      * Find number of mappings.
+      */
+     status = H5Pget_virtual_count (dcpl, &num_map);
+     printf(" Number of mappings is %lu\n", (unsigned long)num_map);
+
+     /* 
+      * Get mapping parameters for each mapping.
+      */
+      for (i = 0; i < (int)num_map; i++) {   
+      printf(" Mapping %d \n", i);
+      printf("         Selection in the virtual dataset \n");
+      /* Get selection in the virttual  dataset */
+          vspace = H5Pget_virtual_vspace (dcpl, (size_t)i);
+          if (H5Sget_select_type(vspace) == H5S_SEL_HYPERSLABS) { 
+              if (H5Sis_regular_hyperslab(vspace)) {
+                   status = H5Sget_regular_hyperslab (vspace, start_out, stride_out, count_out, block_out);
+                   printf("         start  = [%llu, %llu, %llu] \n", (unsigned long long)start_out[0], (unsigned long long)start_out[1], (unsigned long long)start_out[2]);
+                   printf("         stride = [%llu, %llu, %llu] \n", (unsigned long long)stride_out[0], (unsigned long long)stride_out[1], (unsigned long long)stride_out[2]);
+                   printf("         count  = [%llu, %llu, %llu] \n", (unsigned long long)count_out[0], (unsigned long long)count_out[1], (unsigned long long)count_out[2]);
+                   printf("         block  = [%llu, %llu, %llu] \n", (unsigned long long)block_out[0], (unsigned long long)block_out[1], (unsigned long long)block_out[2]);
+               }
+          }
+      /* Get source file name */
+          len = H5Pget_virtual_filename (dcpl, (size_t)i, NULL, 0);
+          filename = (char *)malloc((size_t)len*sizeof(char)+1);
+          H5Pget_virtual_filename (dcpl, (size_t)i, filename, len+1);
+          printf("         Source filename %s\n", filename);
+
+      /* Get source dataset name */
+          len = H5Pget_virtual_dsetname (dcpl, (size_t)i, NULL, 0);
+          dsetname = (char *)malloc((size_t)len*sizeof(char)+1);
+          H5Pget_virtual_dsetname (dcpl, (size_t)i, dsetname, len+1);
+          printf("         Source dataset name %s\n", dsetname);
+
+      /* Get selection in the source dataset */
+          printf("         Selection in the source dataset \n");
+          src_space = H5Pget_virtual_srcspace (dcpl, (size_t)i);
+          if(H5Sget_select_type(src_space) == H5S_SEL_HYPERSLABS) {
+              if (H5Sis_regular_hyperslab(vspace)) {
+                   status = H5Sget_regular_hyperslab (vspace, start_out, stride_out, count_out, block_out);
+                   printf("         start  = [%d, %d, %d] \n", (int)start_out[0], (int)start_out[1], (int)start_out[2]);
+                   printf("         stride = [%d, %d, %d] \n", (int)stride_out[0], (int)stride_out[1], (int)stride_out[2]);
+                   printf("         count  = [%d, %d, %d] \n", (int)count_out[0], (int)count_out[1], (int)count_out[2]);
+                   printf("         block  = [%d, %d, %d] \n", (int)block_out[0], (int)block_out[1], (int)block_out[2]);
+               }
+          }
+          H5Sclose(vspace);
+          H5Sclose(src_space);
+          free(filename);
+          free(dsetname);
+      }
+/* EIP read data back */
+
+    /*
+     * Close and release resources.
+     */
+    status = H5Pclose (dcpl);
+    status = H5Dclose (dset);
+    status = H5Fclose (file);
+
+    return 0;
+}
+
diff --git a/examples/h5_vds-percival-unlim-maxmin.c b/examples/h5_vds-percival-unlim-maxmin.c
new file mode 100644
index 0000000..a6eecfb
--- /dev/null
+++ b/examples/h5_vds-percival-unlim-maxmin.c
@@ -0,0 +1,309 @@
+/************************************************************
+
+  This example illustrates the concept of the virtual dataset.
+  Percival use case. Every fifth 10x10 plane in VDS is stored in 
+  the corresponding 3D unlimited dataset. 
+  There are 4 source datasets total.
+  Each of the source datasets is extended to different sizes.
+  VDS access property can be used to get max and min extent.
+  This file is intended for use with HDF5 Library version 1.10
+
+ ************************************************************/
+/* EIP Add link to the picture */
+
+#include "hdf5.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#define VFILE        "vds-percival-unlim-maxmin.h5"
+#define DATASET      "VDS-Percival-unlim-maxmin"
+#define VDSDIM0       H5S_UNLIMITED 
+#define VDSDIM1       10 
+#define VDSDIM2       10 
+
+#define DIM0          H5S_UNLIMITED 
+#define DIM0_1        4  /* Initial size of the source datasets */
+#define DIM1          10 
+#define DIM2          10 
+#define RANK          3 
+#define PLANE_STRIDE  4
+
+const char *SRC_FILE[] = {
+    "a.h5",
+    "b.h5",
+    "c.h5",
+    "d.h5"
+};
+
+const char *SRC_DATASET[] = {
+    "A",
+    "B",
+    "C",
+    "D"
+};
+
+int
+main (void)
+{
+    hid_t        vfile, file, src_space, mem_space, vspace,
+                 vdset, dset;                       /* Handles */
+    hid_t        dcpl, dapl;
+    herr_t       status;
+    hsize_t      vdsdims[3] = {4*DIM0_1, VDSDIM1, VDSDIM2},
+                 vdsdims_max[3] = {VDSDIM0, VDSDIM1, VDSDIM2}, 
+                 dims[3] = {DIM0_1, DIM1, DIM2},
+                 memdims[3] = {DIM0_1, DIM1, DIM2},
+                 extdims[3] = {0, DIM1, DIM2}, /* Dimensions of the extended source datasets */
+                 chunk_dims[3] = {DIM0_1, DIM1, DIM2},
+                 dims_max[3] = {DIM0, DIM1, DIM2},
+                 vdsdims_out[3],
+                 vdsdims_max_out[3],
+                 start[3],                   /* Hyperslab parameters */
+                 stride[3],
+                 count[3],
+                 src_count[3],
+                 block[3];
+    hsize_t      start_out[3],               /* Hyperslab parameter out */
+                 stride_out[3],
+                 count_out[3],
+                 block_out[3];
+    int          i, j;
+    H5D_layout_t layout;                     /* Storage layout */
+    size_t       num_map;                    /* Number of mappings */
+    ssize_t      len;                        /* Length of the string; also a return value */
+    char         *filename;
+    char         *dsetname;
+    int          wdata[DIM0_1*DIM1*DIM2];
+
+    /*
+     * Create source files and datasets. This step is optional.
+     */
+    for (i=0; i < PLANE_STRIDE; i++) {
+        /*
+         * Initialize data for i-th source dataset.
+         */
+        for (j = 0; j < DIM0_1*DIM1*DIM2; j++) wdata[j] = i+1;
+
+        /*
+         * Create the source files and  datasets. Write data to each dataset and 
+         * close all resources.
+         */
+
+        file = H5Fcreate (SRC_FILE[i], H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+        src_space = H5Screate_simple (RANK, dims, dims_max);
+        dcpl = H5Pcreate(H5P_DATASET_CREATE);
+        status = H5Pset_chunk (dcpl, RANK, chunk_dims);
+        dset = H5Dcreate2 (file, SRC_DATASET[i], H5T_NATIVE_INT, src_space, H5P_DEFAULT,
+                    dcpl, H5P_DEFAULT);
+        status = H5Dwrite (dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+                    wdata);
+        status = H5Sclose (src_space);
+        status = H5Pclose (dcpl);
+        status = H5Dclose (dset);
+        status = H5Fclose (file);
+    }    
+
+    vfile = H5Fcreate (VFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create VDS dataspace.  */
+    vspace = H5Screate_simple (RANK, vdsdims, vdsdims_max);
+
+    /* Create dataspaces for the source dataset. */
+    src_space = H5Screate_simple (RANK, dims, dims_max);
+
+    /* Create VDS creation property */
+    dcpl = H5Pcreate (H5P_DATASET_CREATE);
+     
+    /* Initialize hyperslab values */
+
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 0;
+    stride[0] = PLANE_STRIDE; /* we will select every fifth plane in VDS */
+    stride[1] = 1;
+    stride[2] = 1;
+    count[0] = H5S_UNLIMITED;
+    count[1] = 1;
+    count[2] = 1;
+    src_count[0] = H5S_UNLIMITED;
+    src_count[1] = 1;
+    src_count[2] = 1;
+    block[0] = 1;
+    block[1] = DIM1;
+    block[2] = DIM2;
+
+    /* 
+     * Build the mappings 
+     *
+     */
+    status = H5Sselect_hyperslab (src_space, H5S_SELECT_SET, start, NULL, src_count, block);
+    for (i=0; i < PLANE_STRIDE; i++) {
+        status = H5Sselect_hyperslab (vspace, H5S_SELECT_SET, start, stride, count, block);
+        status = H5Pset_virtual (dcpl, vspace, SRC_FILE[i], SRC_DATASET[i], src_space);
+        start[0]++; 
+    } 
+
+    H5Sselect_none(vspace); 
+
+    /* Create a virtual dataset */
+    vdset = H5Dcreate2 (vfile, DATASET, H5T_NATIVE_INT, vspace, H5P_DEFAULT,
+                dcpl, H5P_DEFAULT);
+    status = H5Sclose (vspace);
+    status = H5Sclose (src_space);
+    status = H5Pclose (dcpl);
+
+    /* Let's add data to the source datasets and check new dimensions for VDS */
+    /* We will add only one plane to the first source dataset, two planes to the
+       second one, three to the third, and four to the forth.                 */
+
+    for (i=0; i < PLANE_STRIDE; i++) {
+        /*
+         * Initialize data for i-th source dataset.
+         */
+        for (j = 0; j < (i+1)*DIM1*DIM2; j++) wdata[j] = 10*(i+1);
+
+        /*
+         * Open the source files and datasets. Appen data to each dataset and 
+         * close all resources.
+         */
+
+        file = H5Fopen (SRC_FILE[i], H5F_ACC_RDWR, H5P_DEFAULT);
+        dset = H5Dopen2 (file, SRC_DATASET[i], H5P_DEFAULT);
+        extdims[0] = DIM0_1+i+1;
+        status = H5Dset_extent (dset, extdims);       
+        src_space = H5Dget_space (dset);
+        start[0] = DIM0_1;
+        start[1] = 0;
+        start[2] = 0;
+        count[0] = 1;
+        count[1] = 1;
+        count[2] = 1;
+        block[0] = i+1;
+        block[1] = DIM1;
+        block[2] = DIM2;
+
+        memdims[0] = i+1;
+        mem_space = H5Screate_simple(RANK, memdims, NULL); 
+        status = H5Sselect_hyperslab (src_space, H5S_SELECT_SET, start, NULL, count, block);
+        status = H5Dwrite (dset, H5T_NATIVE_INT, mem_space, src_space, H5P_DEFAULT,
+                    wdata);
+        status = H5Sclose (src_space);
+        status = H5Dclose (dset);
+        status = H5Fclose (file);
+      }
+
+    status = H5Dclose (vdset);
+    status = H5Fclose (vfile);    
+     
+    /*
+     * Now we begin the read section of this example.
+     */
+
+    /*
+     * Open file and dataset using the default properties.
+     */
+    vfile = H5Fopen (VFILE, H5F_ACC_RDONLY, H5P_DEFAULT);
+    
+    /* 
+     * Open VDS using different access properties to use max or
+     * min extents depending on the sizes of the underlying datasets
+     */
+    dapl = H5Pcreate (H5P_DATASET_ACCESS);
+
+    for(i = 0; i < 2; i++) {
+        status = H5Pset_virtual_view (dapl, i ? H5D_VDS_LAST_AVAILABLE : H5D_VDS_FIRST_MISSING);
+        vdset = H5Dopen2 (vfile, DATASET, dapl);
+
+        /* Let's get space of the VDS and its dimension; we should get 32(or 20)x10x10 */
+        vspace = H5Dget_space (vdset);
+        H5Sget_simple_extent_dims (vspace, vdsdims_out, vdsdims_max_out);
+        printf ("VDS dimensions, bounds = H5D_VDS_%s: ", i ? "LAST_AVAILABLE" : "FIRST_MISSING");
+        for (j=0; j<RANK; j++)
+            printf (" %d ", (int)vdsdims_out[j]);
+        printf ("\n");
+
+        /* Close */
+        status = H5Dclose (vdset);
+        status = H5Sclose (vspace);
+    }
+
+    status = H5Pclose (dapl);
+
+    vdset = H5Dopen2 (vfile, DATASET, H5P_DEFAULT);
+
+    /*
+     * Get creation property list and mapping properties.
+     */
+    dcpl = H5Dget_create_plist (vdset);
+
+    /*
+     * Get storage layout.
+     */
+    layout = H5Pget_layout (dcpl);
+
+    if (H5D_VIRTUAL == layout) 
+        printf(" Dataset has a virtual layout \n");
+    else
+        printf(" Wrong layout found \n");
+
+     /*
+      * Find number of mappings.
+      */
+     status = H5Pget_virtual_count (dcpl, &num_map);
+     printf(" Number of mappings is %lu\n", (unsigned long)num_map);
+
+     /* 
+      * Get mapping parameters for each mapping.
+      */
+      for (i = 0; i < (int)num_map; i++) {   
+      printf(" Mapping %d \n", i);
+      printf("         Selection in the virtual dataset \n");
+      /* Get selection in the virttual  dataset */
+          vspace = H5Pget_virtual_vspace (dcpl, (size_t)i);
+          if (H5Sget_select_type(vspace) == H5S_SEL_HYPERSLABS) { 
+              if (H5Sis_regular_hyperslab(vspace)) {
+                   status = H5Sget_regular_hyperslab (vspace, start_out, stride_out, count_out, block_out);
+                   printf("         start  = [%llu, %llu, %llu] \n", (unsigned long long)start_out[0], (unsigned long long)start_out[1], (unsigned long long)start_out[2]);
+                   printf("         stride = [%llu, %llu, %llu] \n", (unsigned long long)stride_out[0], (unsigned long long)stride_out[1], (unsigned long long)stride_out[2]);
+                   printf("         count  = [%llu, %llu, %llu] \n", (unsigned long long)count_out[0], (unsigned long long)count_out[1], (unsigned long long)count_out[2]);
+                   printf("         block  = [%llu, %llu, %llu] \n", (unsigned long long)block_out[0], (unsigned long long)block_out[1], (unsigned long long)block_out[2]);
+               }
+          }
+      /* Get source file name */
+          len = H5Pget_virtual_filename (dcpl, (size_t)i, NULL, 0);
+          filename = (char *)malloc((size_t)len*sizeof(char)+1);
+          H5Pget_virtual_filename (dcpl, (size_t)i, filename, len+1);
+          printf("         Source filename %s\n", filename);
+
+      /* Get source dataset name */
+          len = H5Pget_virtual_dsetname (dcpl, (size_t)i, NULL, 0);
+          dsetname = (char *)malloc((size_t)len*sizeof(char)+1);
+          H5Pget_virtual_dsetname (dcpl, (size_t)i, dsetname, len+1);
+          printf("         Source dataset name %s\n", dsetname);
+
+      /* Get selection in the source dataset */
+          printf("         Selection in the source dataset \n");
+          src_space = H5Pget_virtual_srcspace (dcpl, (size_t)i);
+          if (H5Sget_select_type(src_space) == H5S_SEL_HYPERSLABS) {
+              if (H5Sis_regular_hyperslab(src_space)) {
+                   status = H5Sget_regular_hyperslab (src_space, start_out, stride_out, count_out, block_out);
+                   printf("         start  = [%llu, %llu, %llu] \n", (unsigned long long)start_out[0], (unsigned long long)start_out[1], (unsigned long long)start_out[2]);
+                   printf("         stride = [%llu, %llu, %llu] \n", (unsigned long long)stride_out[0], (unsigned long long)stride_out[1], (unsigned long long)stride_out[2]);
+                   printf("         count  = [%llu, %llu, %llu] \n", (unsigned long long)count_out[0], (unsigned long long)count_out[1], (unsigned long long)count_out[2]);
+                   printf("         block  = [%llu, %llu, %llu] \n", (unsigned long long)block_out[0], (unsigned long long)block_out[1], (unsigned long long)block_out[2]);
+               }
+          }
+          H5Sclose(vspace);
+          H5Sclose(src_space);
+          free(filename);
+          free(dsetname);
+      }
+    /*
+     * Close and release resources.
+     */
+    status = H5Pclose (dcpl);
+    status = H5Dclose (vdset);
+    status = H5Fclose (vfile);
+    return 0;
+}
+
diff --git a/examples/h5_vds-percival-unlim.c b/examples/h5_vds-percival-unlim.c
new file mode 100644
index 0000000..2496c37
--- /dev/null
+++ b/examples/h5_vds-percival-unlim.c
@@ -0,0 +1,353 @@
+/************************************************************
+
+  This example illustrates the concept of the virtual dataset.
+  Percival use case. Every fifth 10x10 plane in VDS is stored in 
+  the corresponding 3D unlimited dataset. 
+  There are 4 source datasets total.
+  This file is intended for use with HDF5 Library version 1.10
+
+ ************************************************************/
+/* EIP Add link to the picture */
+
+#include "hdf5.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#define VFILE        "vds-percival-unlim.h5"
+#define DATASET      "VDS-Percival-unlim"
+#define VDSDIM0       H5S_UNLIMITED 
+#define VDSDIM1       10 
+#define VDSDIM2       10 
+
+#define DIM0          H5S_UNLIMITED 
+#define DIM0_1        10  /* Initial size of the datasets */
+#define DIM1          10 
+#define DIM2          10 
+#define RANK          3 
+#define PLANE_STRIDE  4
+
+const char *SRC_FILE[] = {
+    "a.h5",
+    "b.h5",
+    "c.h5",
+    "d.h5"
+};
+
+const char *SRC_DATASET[] = {
+    "A",
+    "B",
+    "C",
+    "D"
+};
+
+int
+main (void)
+{
+    hid_t        vfile, file, src_space, mem_space, vspace,
+                 vdset, dset;                       /* Handles */
+    hid_t        dcpl;
+    herr_t       status;
+    hsize_t      vdsdims[3] = {4*DIM0_1, VDSDIM1, VDSDIM2},
+                 vdsdims_max[3] = {VDSDIM0, VDSDIM1, VDSDIM2}, 
+                 dims[3] = {DIM0_1, DIM1, DIM2},
+                 extdims[3] = {2*DIM0_1, DIM1, DIM2},
+                 chunk_dims[3] = {DIM0_1, DIM1, DIM2},
+                 dims_max[3] = {DIM0, DIM1, DIM2},
+                 vdsdims_out[3],
+                 vdsdims_max_out[3],
+                 start[3],                   /* Hyperslab parameters */
+                 stride[3],
+                 count[3],
+                 src_count[3],
+                 block[3];
+    hsize_t      start_out[3],               /* Hyperslab parameter out */
+                 stride_out[3],
+                 count_out[3],
+                 block_out[3];
+    int          i, j, k;
+    H5D_layout_t layout;                     /* Storage layout */
+    size_t       num_map;                    /* Number of mappings */
+    ssize_t      len;                        /* Length of the string; also a return value */
+    char         *filename;
+    char         *dsetname;
+    int          wdata[DIM0_1*DIM1*DIM2];
+    int          rdata[80][10][10];
+    int          a_rdata[20][10][10];
+
+    /*
+     * Create source files and datasets. This step is optional.
+     */
+    for (i=0; i < PLANE_STRIDE; i++) {
+        /*
+         * Initialize data for i-th source dataset.
+         */
+        for (j = 0; j < DIM0_1*DIM1*DIM2; j++) wdata[j] = i+1;
+
+        /*
+         * Create the source files and  datasets. Write data to each dataset and 
+         * close all resources.
+         */
+
+        file = H5Fcreate (SRC_FILE[i], H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+        src_space = H5Screate_simple (RANK, dims, dims_max);
+        dcpl = H5Pcreate(H5P_DATASET_CREATE);
+        status = H5Pset_chunk (dcpl, RANK, chunk_dims);
+        dset = H5Dcreate2 (file, SRC_DATASET[i], H5T_NATIVE_INT, src_space, H5P_DEFAULT,
+                    dcpl, H5P_DEFAULT);
+        status = H5Dwrite (dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+                    wdata);
+        status = H5Sclose (src_space);
+        status = H5Pclose (dcpl);
+        status = H5Dclose (dset);
+        status = H5Fclose (file);
+    }    
+
+    vfile = H5Fcreate (VFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create VDS dataspace.  */
+    vspace = H5Screate_simple (RANK, vdsdims, vdsdims_max);
+
+    /* Create dataspaces for the source dataset. */
+    src_space = H5Screate_simple (RANK, dims, dims_max);
+
+    /* Create VDS creation property */
+    dcpl = H5Pcreate (H5P_DATASET_CREATE);
+     
+    /* Initialize hyperslab values */
+
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 0;
+    stride[0] = PLANE_STRIDE; /* we will select every fifth plane in VDS */
+    stride[1] = 1;
+    stride[2] = 1;
+    count[0] = H5S_UNLIMITED;
+    count[1] = 1;
+    count[2] = 1;
+    src_count[0] = H5S_UNLIMITED;
+    src_count[1] = 1;
+    src_count[2] = 1;
+    block[0] = 1;
+    block[1] = DIM1;
+    block[2] = DIM2;
+
+    /* 
+     * Build the mappings 
+     *
+     */
+    status = H5Sselect_hyperslab (src_space, H5S_SELECT_SET, start, NULL, src_count, block);
+    for (i=0; i < PLANE_STRIDE; i++) {
+        status = H5Sselect_hyperslab (vspace, H5S_SELECT_SET, start, stride, count, block);
+        status = H5Pset_virtual (dcpl, vspace, SRC_FILE[i], SRC_DATASET[i], src_space);
+        start[0]++; 
+    } 
+
+    H5Sselect_none(vspace); 
+
+    /* Create a virtual dataset */
+    vdset = H5Dcreate2 (vfile, DATASET, H5T_NATIVE_INT, vspace, H5P_DEFAULT,
+                dcpl, H5P_DEFAULT);
+    status = H5Sclose (vspace);
+    status = H5Sclose (src_space);
+    status = H5Pclose (dcpl);
+    /* Let's get space of the VDS and its dimension; we should get 40x10x10 */
+    vspace = H5Dget_space (vdset);
+    H5Sget_simple_extent_dims (vspace, vdsdims_out, vdsdims_max_out);
+    printf ("VDS dimensions first time \n");
+    printf (" Current: ");
+    for (i=0; i<RANK; i++)
+        printf (" %d ", (int)vdsdims_out[i]);
+    printf ("\n");
+
+    /* Let's add data to the source datasets and check new dimensions for VDS */
+
+    for (i=0; i < PLANE_STRIDE; i++) {
+        /*
+         * Initialize data for i-th source dataset.
+         */
+        for (j = 0; j < DIM0_1*DIM1*DIM2; j++) wdata[j] = 10*(i+1);
+
+        /*
+         * Create the source files and  datasets. Write data to each dataset and 
+         * close all resources.
+         */
+
+        file = H5Fopen (SRC_FILE[i], H5F_ACC_RDWR, H5P_DEFAULT);
+        dset = H5Dopen2 (file, SRC_DATASET[i], H5P_DEFAULT);
+        status = H5Dset_extent (dset, extdims);       
+        src_space = H5Dget_space (dset);
+        start[0] = DIM0_1;
+        start[1] = 0;
+        start[2] = 0;
+        count[0] = 1;
+        count[1] = 1;
+        count[2] = 1;
+        block[0] = DIM0_1;
+        block[1] = DIM1;
+        block[2] = DIM2;
+
+        mem_space = H5Screate_simple(RANK, dims, NULL); 
+        status = H5Sselect_hyperslab (src_space, H5S_SELECT_SET, start, NULL, count, block);
+        status = H5Dwrite (dset, H5T_NATIVE_INT, mem_space, src_space, H5P_DEFAULT,
+                    wdata);
+        status = H5Sclose (src_space);
+        status = H5Dclose (dset);
+        status = H5Fclose (file);
+      }
+
+    status = H5Dclose (vdset);
+    status = H5Fclose (vfile);    
+     
+    /*
+     * Now we begin the read section of this example.
+     */
+
+    /*
+     * Open file and dataset using the default properties.
+     */
+    vfile = H5Fopen (VFILE, H5F_ACC_RDONLY, H5P_DEFAULT);
+    vdset = H5Dopen2 (vfile, DATASET, H5P_DEFAULT);
+
+    /*
+     * Get creation property list and mapping properties.
+     */
+    dcpl = H5Dget_create_plist (vdset);
+
+    /*
+     * Get storage layout.
+     */
+    layout = H5Pget_layout (dcpl);
+
+    if (H5D_VIRTUAL == layout) 
+        printf(" Dataset has a virtual layout \n");
+    else
+        printf(" Wrong layout found \n");
+
+     /*
+      * Find number of mappings.
+      */
+     status = H5Pget_virtual_count (dcpl, &num_map);
+     printf(" Number of mappings is %lu\n", (unsigned long)num_map);
+
+     /* 
+      * Get mapping parameters for each mapping.
+      */
+      for (i = 0; i < (int)num_map; i++) {   
+      printf(" Mapping %d \n", i);
+      printf("         Selection in the virtual dataset \n");
+      /* Get selection in the virttual  dataset */
+          vspace = H5Pget_virtual_vspace (dcpl, (size_t)i);
+          if (H5Sget_select_type(vspace) == H5S_SEL_HYPERSLABS) { 
+              if (H5Sis_regular_hyperslab(vspace)) {
+                   status = H5Sget_regular_hyperslab (vspace, start_out, stride_out, count_out, block_out);
+                   printf("         start  = [%llu, %llu, %llu] \n", (unsigned long long)start_out[0], (unsigned long long)start_out[1], (unsigned long long)start_out[2]);
+                   printf("         stride = [%llu, %llu, %llu] \n", (unsigned long long)stride_out[0], (unsigned long long)stride_out[1], (unsigned long long)stride_out[2]);
+                   printf("         count  = [%llu, %llu, %llu] \n", (unsigned long long)count_out[0], (unsigned long long)count_out[1], (unsigned long long)count_out[2]);
+                   printf("         block  = [%llu, %llu, %llu] \n", (unsigned long long)block_out[0], (unsigned long long)block_out[1], (unsigned long long)block_out[2]);
+               }
+          }
+      /* Get source file name */
+          len = H5Pget_virtual_filename (dcpl, (size_t)i, NULL, 0);
+          filename = (char *)malloc((size_t)len*sizeof(char)+1);
+          H5Pget_virtual_filename (dcpl, (size_t)i, filename, len+1);
+          printf("         Source filename %s\n", filename);
+
+      /* Get source dataset name */
+          len = H5Pget_virtual_dsetname (dcpl, (size_t)i, NULL, 0);
+          dsetname = (char *)malloc((size_t)len*sizeof(char)+1);
+          H5Pget_virtual_dsetname (dcpl, (size_t)i, dsetname, len+1);
+          printf("         Source dataset name %s\n", dsetname);
+
+      /* Get selection in the source dataset */
+          printf("         Selection in the source dataset \n");
+          src_space = H5Pget_virtual_srcspace (dcpl, (size_t)i);
+          if (H5Sget_select_type(src_space) == H5S_SEL_HYPERSLABS) {
+              if (H5Sis_regular_hyperslab(src_space)) {
+                   status = H5Sget_regular_hyperslab (src_space, start_out, stride_out, count_out, block_out);
+                   printf("         start  = [%llu, %llu, %llu] \n", (unsigned long long)start_out[0], (unsigned long long)start_out[1], (unsigned long long)start_out[2]);
+                   printf("         stride = [%llu, %llu, %llu] \n", (unsigned long long)stride_out[0], (unsigned long long)stride_out[1], (unsigned long long)stride_out[2]);
+                   printf("         count  = [%llu, %llu, %llu] \n", (unsigned long long)count_out[0], (unsigned long long)count_out[1], (unsigned long long)count_out[2]);
+                   printf("         block  = [%llu, %llu, %llu] \n", (unsigned long long)block_out[0], (unsigned long long)block_out[1], (unsigned long long)block_out[2]);
+               }
+          }
+          H5Sclose(vspace);
+          H5Sclose(src_space);
+          free(filename);
+          free(dsetname);
+      }
+    /*
+     * Read data from VDS.
+     */
+    vspace = H5Dget_space (vdset);
+    H5Sget_simple_extent_dims (vspace, vdsdims_out, vdsdims_max_out);
+    printf ("VDS dimensions second time \n");
+    printf (" Current: ");
+    for (i=0; i<RANK; i++)
+        printf (" %d ", (int)vdsdims_out[i]);
+    printf ("\n");
+
+    /* Read all VDS data */
+
+    /* EIP We should be able to do it by using H5S_ALL instead of making selection
+     * or using H5Sselect_all from vspace. 
+     */
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 0;
+    count[0] = 1;
+    count[1] = 1;
+    count[2] = 1;
+    block[0] = vdsdims_out[0];
+    block[1] = vdsdims_out[1];
+    block[2] = vdsdims_out[2];
+
+    status = H5Sselect_hyperslab (vspace, H5S_SELECT_SET, start, NULL, count, block);
+    mem_space = H5Screate_simple(RANK, vdsdims_out, NULL);
+    status = H5Dread (vdset, H5T_NATIVE_INT, mem_space, vspace, H5P_DEFAULT,
+                    rdata);   
+    printf (" All data: \n");
+    for (i=0; i < (int)vdsdims_out[0]; i++) {
+        for (j=0; j < (int)vdsdims_out[1]; j++) {
+             printf ("(%d, %d, 0)", i, j);
+             for (k=0; k < (int)vdsdims_out[2]; k++) 
+                 printf (" %d ", rdata[i][j][k]);
+             printf ("\n");
+        }
+    }
+    /* Read VDS, but only data mapeed to dataset a.h5 */
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 0;
+    stride[0] = PLANE_STRIDE;
+    stride[1] = 1;
+    stride[2] = 1;
+    count[0] = 2*DIM0_1;
+    count[1] = 1;
+    count[2] = 1;
+    block[0] = 1;
+    block[1] = vdsdims_out[1];
+    block[2] = vdsdims_out[2];
+    dims[0] = 2*DIM0_1; 
+    status = H5Sselect_hyperslab (vspace, H5S_SELECT_SET, start, stride, count, block);
+    mem_space = H5Screate_simple(RANK, dims,  NULL);
+    status = H5Dread (vdset, H5T_NATIVE_INT, mem_space, vspace, H5P_DEFAULT,
+                    a_rdata);   
+    printf (" All data: \n");
+    for (i=0; i < 2*DIM0_1; i++) {
+        for (j=0; j < (int)vdsdims_out[1]; j++) {
+             printf ("(%d, %d, 0)", i, j);
+             for (k=0; k < (int)vdsdims_out[2]; k++) 
+                 printf (" %d ", a_rdata[i][j][k]);
+             printf ("\n");
+        }
+    }
+    /*
+     * Close and release resources.
+     */
+    status = H5Sclose(mem_space);
+    status = H5Pclose (dcpl);
+    status = H5Dclose (vdset);
+    status = H5Fclose (vfile);
+    return 0;
+}
+
diff --git a/examples/h5_vds-percival.c b/examples/h5_vds-percival.c
new file mode 100644
index 0000000..757bb69
--- /dev/null
+++ b/examples/h5_vds-percival.c
@@ -0,0 +1,242 @@
+/************************************************************
+
+  This example illustrates the concept of the virtual dataset.
+  Percival use case. Every fifth 10x10 plane in VDS is stored in 
+  the corresponding 3D unlimited dataset. 
+  EIP: For now we will use finite dimension.
+  There are 4 source datasets total.
+  This file is intended for use with HDF5 Library version 1.10
+
+ ************************************************************/
+/* EIP Add link to the picture */
+
+#include "hdf5.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#define FILE         "vds-percival.h5"
+#define DATASET      "VDS-Percival"
+/* later
+#define VDSDIM0       H5S_UNLIMITED 
+*/
+#define VDSDIM0       40
+#define VDSDIM1       10 
+#define VDSDIM2       10 
+/* later
+#define DIM0          H5S_UNLIMITED 
+*/
+#define DIM0          10 
+#define DIM1          10 
+#define DIM2          10 
+#define RANK          3 
+#define PLANE_STRIDE  4
+
+const char *SRC_FILE[] = {
+    "a.h5",
+    "b.h5",
+    "c.h5",
+    "d.h5"
+};
+
+const char *SRC_DATASET[] = {
+    "A",
+    "B",
+    "C",
+    "D"
+};
+
+int
+main (void)
+{
+    hid_t        file, src_space, vspace,
+                 dset;                       /* Handles */
+    hid_t        dcpl;
+    herr_t       status;
+    hsize_t      vdsdims[3] = {VDSDIM0, VDSDIM1, VDSDIM2},
+                 vdsdims_max[3] = {VDSDIM0, VDSDIM1, VDSDIM2}, 
+                 dims[3] = {DIM0, DIM1, DIM2},
+                 dims_max[3] = {DIM0, DIM1, DIM2},
+                 start[3],                   /* Hyperslab start parameter for VDS */
+                 stride[3],
+                 count[3],
+                 src_count[3],
+                 block[3];
+    hsize_t      start_out[3],               /* Hyperslab parameter out */
+                 stride_out[3],
+                 count_out[3],
+                 block_out[3];
+    int          i, j;
+    H5D_layout_t layout;                     /* Storage layout */
+    size_t       num_map;                    /* Number of mappings */
+    ssize_t      len;                        /* Length of the string; also a return value */
+    char         *filename;
+    char         *dsetname;
+    int          wdata[DIM0*DIM1*DIM2];
+
+    /*
+     * Create source files and datasets. This step is optional.
+     */
+    for (i=0; i < PLANE_STRIDE; i++) {
+        /*
+         * Initialize data for i-th source dataset.
+         */
+        for (j = 0; j < DIM0*DIM1*DIM2; j++) wdata[j] = i+1;
+
+        /*
+         * Create the source files and  datasets. Write data to each dataset and 
+         * close all resources.
+         */
+
+        file = H5Fcreate (SRC_FILE[i], H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+        src_space = H5Screate_simple (RANK, dims, NULL);
+        dset = H5Dcreate2 (file, SRC_DATASET[i], H5T_NATIVE_INT, src_space, H5P_DEFAULT,
+                    H5P_DEFAULT, H5P_DEFAULT);
+        status = H5Dwrite (dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+                    wdata);
+        status = H5Sclose (src_space);
+        status = H5Dclose (dset);
+        status = H5Fclose (file);
+    }    
+
+    file = H5Fcreate (FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create VDS dataspace.  */
+    vspace = H5Screate_simple (RANK, vdsdims, vdsdims_max);
+
+    /* Create dataspaces for the source dataset. */
+    src_space = H5Screate_simple (RANK, dims, dims_max);
+
+    /* Create VDS creation property */
+    dcpl = H5Pcreate (H5P_DATASET_CREATE);
+     
+    /* Initialize hyperslab values */
+
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 0;
+    stride[0] = PLANE_STRIDE; /* we will select every fifth plane in VDS */
+    stride[1] = 1;
+    stride[2] = 1;
+/* later
+    count[0] = H5S_UNLIMITED;
+*/
+    count[0] = VDSDIM0/4;
+    count[1] = 1;
+    count[2] = 1;
+/* later
+    src_count[0] = H5S_UNLIMITED;
+*/
+    src_count[0] = DIM0;
+    src_count[1] = 1;
+    src_count[2] = 1;
+    block[0] = 1;
+    block[1] = DIM1;
+    block[2] = DIM2;
+
+    /* 
+     * Build the mappings 
+     *
+     */
+    status = H5Sselect_hyperslab (src_space, H5S_SELECT_SET, start, NULL, src_count, block);
+    for (i=0; i < PLANE_STRIDE; i++) {
+        status = H5Sselect_hyperslab (vspace, H5S_SELECT_SET, start, stride, count, block);
+        status = H5Pset_virtual (dcpl, vspace, SRC_FILE[i], SRC_DATASET[i], src_space);
+        start[0]++; 
+    } 
+
+    H5Sselect_none(vspace); 
+
+    /* Create a virtual dataset */
+    dset = H5Dcreate2 (file, DATASET, H5T_NATIVE_INT, vspace, H5P_DEFAULT,
+                dcpl, H5P_DEFAULT);
+    status = H5Sclose (vspace);
+    status = H5Sclose (src_space);
+    status = H5Dclose (dset);
+    status = H5Fclose (file);    
+     
+    /*
+     * Now we begin the read section of this example.
+     */
+
+    /*
+     * Open file and dataset using the default properties.
+     */
+    file = H5Fopen (FILE, H5F_ACC_RDONLY, H5P_DEFAULT);
+    dset = H5Dopen2 (file, DATASET, H5P_DEFAULT);
+
+    /*
+     * Get creation property list and mapping properties.
+     */
+    dcpl = H5Dget_create_plist (dset);
+
+    /*
+     * Get storage layout.
+     */
+    layout = H5Pget_layout (dcpl);
+
+    if (H5D_VIRTUAL == layout) 
+        printf(" Dataset has a virtual layout \n");
+    else
+        printf(" Wrong layout found \n");
+
+     /*
+      * Find number of mappings.
+      */
+     status = H5Pget_virtual_count (dcpl, &num_map);
+     printf(" Number of mappings is %lu\n", (unsigned long)num_map);
+
+     /* 
+      * Get mapping parameters for each mapping.
+      */
+      for (i = 0; i < (int)num_map; i++) {   
+      printf(" Mapping %d \n", i);
+      printf("         Selection in the virtual dataset \n");
+      /* Get selection in the virttual  dataset */
+          vspace = H5Pget_virtual_vspace (dcpl, (size_t)i);
+          if (H5Sget_select_type(vspace) == H5S_SEL_HYPERSLABS) { 
+              if (H5Sis_regular_hyperslab(vspace)) {
+                   status = H5Sget_regular_hyperslab (vspace, start_out, stride_out, count_out, block_out);
+                   printf("         start  = [%llu, %llu, %llu] \n", (unsigned long long)start_out[0], (unsigned long long)start_out[1], (unsigned long long)start_out[2]);
+                   printf("         stride = [%llu, %llu, %llu] \n", (unsigned long long)stride_out[0], (unsigned long long)stride_out[1], (unsigned long long)stride_out[2]);
+                   printf("         count  = [%llu, %llu, %llu] \n", (unsigned long long)count_out[0], (unsigned long long)count_out[1], (unsigned long long)count_out[2]);
+                   printf("         block  = [%llu, %llu, %llu] \n", (unsigned long long)block_out[0], (unsigned long long)block_out[1], (unsigned long long)block_out[2]);
+               }
+          }
+      /* Get source file name */
+          len = H5Pget_virtual_filename (dcpl, (size_t)i, NULL, 0);
+          filename = (char *)malloc((size_t)len*sizeof(char)+1);
+          H5Pget_virtual_filename (dcpl, (size_t)i, filename, len+1);
+          printf("         Source filename %s\n", filename);
+
+      /* Get source dataset name */
+          len = H5Pget_virtual_dsetname (dcpl, (size_t)i, NULL, 0);
+          dsetname = (char *)malloc((size_t)len*sizeof(char)+1);
+          H5Pget_virtual_dsetname (dcpl, (size_t)i, dsetname, len+1);
+          printf("         Source dataset name %s\n", dsetname);
+
+      /* Get selection in the source dataset */
+          printf("         Selection in the source dataset \n");
+          src_space = H5Pget_virtual_srcspace (dcpl, (size_t)i);
+          if (H5Sget_select_type(src_space) == H5S_SEL_HYPERSLABS) {
+              if (H5Sis_regular_hyperslab(src_space)) {
+                   status = H5Sget_regular_hyperslab (src_space, start_out, stride_out, count_out, block_out);
+                   printf("         start  = [%llu, %llu, %llu] \n", (unsigned long long)start_out[0], (unsigned long long)start_out[1], (unsigned long long)start_out[2]);
+                   printf("         stride = [%llu, %llu, %llu] \n", (unsigned long long)stride_out[0], (unsigned long long)stride_out[1], (unsigned long long)stride_out[2]);
+                   printf("         count  = [%llu, %llu, %llu] \n", (unsigned long long)count_out[0], (unsigned long long)count_out[1], (unsigned long long)count_out[2]);
+                   printf("         block  = [%llu, %llu, %llu] \n", (unsigned long long)block_out[0], (unsigned long long)block_out[1], (unsigned long long)block_out[2]);
+               }
+          }
+          H5Sclose(vspace);
+          H5Sclose(src_space);
+          free(filename);
+          free(dsetname);
+      }
+    /*
+     * Close and release resources.
+     */
+    status = H5Pclose (dcpl);
+    status = H5Dclose (dset);
+    status = H5Fclose (file);
+    return 0;
+}
+
diff --git a/examples/h5_vds-simpleIO.c b/examples/h5_vds-simpleIO.c
new file mode 100644
index 0000000..6b12dc2
--- /dev/null
+++ b/examples/h5_vds-simpleIO.c
@@ -0,0 +1,184 @@
+/************************************************************
+
+  This example illustrates the concept of virtual dataset I/O
+  The program  creates 2-dim source dataset and writes
+  data to it. Then it creates 2-dim virtual dataset that has
+  the same dimension sizes and maps the all elements of the 
+  virtual dataset to all elements of the source dataset.
+  Then VDS is read back.
+
+  This file is intended for use with HDF5 Library version 1.10
+
+ ************************************************************/
+/* EIP Add link to the picture */
+
+#include "hdf5.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#define FILE         "vds-simpleIO.h5"
+#define DATASET      "VDS"
+#define DIM1            6
+#define DIM0            4 
+#define RANK            2
+
+#define SRC_FILE      "a.h5"
+#define SRC_DATASET    "/A"
+
+
+int
+main (void)
+{
+    hid_t        file, space, src_space, vspace, dset; /* Handles */ 
+    hid_t        dcpl;
+    herr_t       status;
+    hsize_t      vdsdims[2] = {DIM0, DIM1},     /* Virtual dataset dimension */
+                 dims[2] = {DIM0, DIM1};        /* Source dataset dimensions */
+    int          wdata[DIM0][DIM1],             /* Write buffer for source dataset */
+                 rdata[DIM0][DIM1],             /* Read buffer for virtual dataset */
+                 i, j;  
+    H5D_layout_t layout;                        /* Storage layout */
+    size_t       num_map;                       /* Number of mappings */
+    ssize_t      len;                           /* Length of the string; also a return value */
+    char         *filename;                  
+    char         *dsetname;
+    /*
+     * Initialize data.
+     */
+        for (i = 0; i < DIM0; i++) 
+            for (j = 0; j < DIM1; j++) wdata[i][j] = i+1;
+         
+     /*
+      * Create the source file and the dataset. Write data to the source dataset 
+      * and close all resources.
+      */
+
+     file = H5Fcreate (SRC_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+     space = H5Screate_simple (RANK, dims, NULL);
+     dset = H5Dcreate2 (file, SRC_DATASET, H5T_NATIVE_INT, space, H5P_DEFAULT,
+                 H5P_DEFAULT, H5P_DEFAULT);
+     status = H5Dwrite (dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+                 wdata[0]);
+     status = H5Sclose (space);
+     status = H5Dclose (dset);
+     status = H5Fclose (file);
+
+    /* Create file in which virtual dataset will be stored. */
+    file = H5Fcreate (FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create VDS dataspace.  */
+    vspace = H5Screate_simple (RANK, vdsdims, NULL);
+
+    /* Set VDS creation property. */
+    dcpl = H5Pcreate (H5P_DATASET_CREATE);
+     
+    /* 
+     * Build the mappings.
+     * Selections in the source datasets are H5S_ALL.
+     * In the virtual dataset we select the first, the second and the third rows 
+     * and map each row to the data in the corresponding source dataset. 
+     */
+    src_space = H5Screate_simple (RANK, dims, NULL);
+    status = H5Pset_virtual (dcpl, vspace, SRC_FILE, SRC_DATASET, src_space);
+
+    /* Create a virtual dataset. */
+    dset = H5Dcreate2 (file, DATASET, H5T_NATIVE_INT, vspace, H5P_DEFAULT,
+                dcpl, H5P_DEFAULT);
+    status = H5Sclose (vspace);
+    status = H5Sclose (src_space);
+    status = H5Dclose (dset);
+    status = H5Fclose (file);    
+     
+    /*
+     * Now we begin the read section of this example.
+     */
+
+    /*
+     * Open the file and virtual dataset.
+     */
+    file = H5Fopen (FILE, H5F_ACC_RDONLY, H5P_DEFAULT);
+    dset = H5Dopen2 (file, DATASET, H5P_DEFAULT);
+    /*
+     * Get creation property list and mapping properties.
+     */
+    dcpl = H5Dget_create_plist (dset);
+
+    /*
+     * Get storage layout.
+     */
+    layout = H5Pget_layout (dcpl);
+    if (H5D_VIRTUAL == layout) 
+        printf(" Dataset has a virtual layout \n");
+    else
+        printf(" Wrong layout found \n");
+
+     /*
+      * Find the number of mappings.
+      */
+     status = H5Pget_virtual_count (dcpl, &num_map);
+     printf(" Number of mappings is %lu\n", (unsigned long)num_map);
+
+     /* 
+      * Get mapping parameters for each mapping.
+      */
+    for (i = 0; i < (int)num_map; i++) {   
+        printf(" Mapping %d \n", i);
+        printf("         Selection in the virtual dataset ");
+        /* Get selection in the virttual  dataset */
+        vspace = H5Pget_virtual_vspace (dcpl, (size_t)i);
+
+        /* Make sure it is ALL selection and then print selection. */
+        if(H5Sget_select_type(vspace) == H5S_SEL_ALL) {
+                printf("Selection is H5S_ALL \n");
+        }
+        /* Get source file name. */
+        len = H5Pget_virtual_filename (dcpl, (size_t)i, NULL, 0);
+        filename = (char *)malloc((size_t)len*sizeof(char)+1);
+        H5Pget_virtual_filename (dcpl, (size_t)i, filename, len+1);
+        printf("         Source filename %s\n", filename);
+
+        /* Get source dataset name. */
+        len = H5Pget_virtual_dsetname (dcpl, (size_t)i, NULL, 0);
+        dsetname = (char *)malloc((size_t)len*sizeof(char)+1);
+        H5Pget_virtual_dsetname (dcpl, (size_t)i, dsetname, len+1);
+        printf("         Source dataset name %s\n", dsetname);
+
+        /* Get selection in the source dataset. */
+        printf("         Selection in the source dataset ");
+        src_space = H5Pget_virtual_srcspace (dcpl, (size_t)i);
+
+        /* Make sure it is ALL selection and then print selection. */
+        if(H5Sget_select_type(src_space) == H5S_SEL_ALL) {
+                printf("Selection is H5S_ALL \n");
+        }
+        H5Sclose(vspace);
+        H5Sclose(src_space);
+        free(filename);
+        free(dsetname);
+    }
+    /*
+     * Read the data using the default properties.
+     */
+    status = H5Dread (dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+                rdata[0]);
+
+    /*
+     * Output the data to the screen.
+     */
+    printf (" VDS Data:\n");
+    for (i=0; i<DIM0; i++) {
+        printf (" [");
+        for (j=0; j<DIM1; j++)
+            printf (" %3d", rdata[i][j]);
+        printf ("]\n");
+    }
+    /*
+     * Close and release resources.
+     */
+    status = H5Pclose (dcpl);
+    status = H5Dclose (dset);
+    status = H5Fclose (file);
+
+    return 0;
+}
+
diff --git a/examples/h5_vds.c b/examples/h5_vds.c
new file mode 100644
index 0000000..1e502c6
--- /dev/null
+++ b/examples/h5_vds.c
@@ -0,0 +1,267 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/************************************************************
+
+  This example illustrates the concept of virtual dataset.
+  The program  creates three 1-dim source datasets and writes
+  data to them. Then it creates a 2-dim virtual dataset and
+  maps the first three rows of the virtual dataset to the data 
+  in the source datasets. Elements of a row are mapped to all 
+  elements of the corresponding source dataset.
+  The fourth row is not mapped and will be filled with the fill 
+  values when virtual dataset is read back. 
+   
+  The program closes all datasets, and then reopens the virtual
+  dataset, and finds and prints its creation properties.
+  Then it reads the values. 
+
+  This file is intended for use with HDF5 Library version 1.10
+
+ ************************************************************/
+/* EIP Add link to the picture */
+
+#include "hdf5.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#define FILE         "vds.h5"
+#define DATASET      "VDS"
+#define VDSDIM1         6 
+#define VDSDIM0         4 
+#define DIM0            6 
+#define RANK1           1
+#define RANK2           2
+
+const char *SRC_FILE[] = {
+    "a.h5",
+    "b.h5",
+    "c.h5"
+};
+
+const char *SRC_DATASET[] = {
+    "A",
+    "B",
+    "C"
+};
+
+int
+main (void)
+{
+    hid_t        file, space, src_space, vspace, dset; /* Handles */ 
+    hid_t        dcpl;
+    herr_t       status;
+    hsize_t      vdsdims[2] = {VDSDIM0, VDSDIM1},      /* Virtual datasets dimension */
+                 dims[1] = {DIM0},                     /* Source datasets dimensions */
+                 start[2],                             /* Hyperslab parameters */
+                 stride[2],
+                 count[2],
+                 block[2];
+    hsize_t      start_out[2],
+                 stride_out[2],
+                 count_out[2],
+                 block_out[2];
+    int          wdata[DIM0],                /* Write buffer for source dataset */
+                 rdata[VDSDIM0][VDSDIM1],    /* Read buffer for virtual dataset */
+                 i, j, k, l;  
+    int          fill_value = -1;            /* Fill value for VDS */
+    H5D_layout_t layout;                     /* Storage layout */
+    size_t       num_map;                    /* Number of mappings */
+    ssize_t      len;                        /* Length of the string; also a return value */
+    char         *filename;                  
+    char         *dsetname;
+    hsize_t      nblocks;
+    hsize_t      *buf;                       /* Buffer to hold hyperslab coordinates */
+
+    /*
+     * Create source files and datasets. This step is optional.
+     */
+    for (i=0; i < 3; i++) {
+        /*
+         * Initialize data for i-th source dataset.
+         */
+        for (j = 0; j < DIM0; j++) wdata[j] = i+1;
+        
+        /*
+         * Create the source files and  datasets. Write data to each dataset and 
+         * close all resources.
+         */
+
+        file = H5Fcreate (SRC_FILE[i], H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+        space = H5Screate_simple (RANK1, dims, NULL);
+        dset = H5Dcreate2 (file, SRC_DATASET[i], H5T_NATIVE_INT, space, H5P_DEFAULT,
+                    H5P_DEFAULT, H5P_DEFAULT);
+        status = H5Dwrite (dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+                    wdata);
+        status = H5Sclose (space);
+        status = H5Dclose (dset);
+        status = H5Fclose (file);
+    }
+
+    /* Create file in which virtual dataset will be stored. */
+    file = H5Fcreate (FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* Create VDS dataspace.  */
+    space = H5Screate_simple (RANK2, vdsdims, NULL);
+
+    /* Set VDS creation property. */
+    dcpl = H5Pcreate (H5P_DATASET_CREATE);
+    status = H5Pset_fill_value (dcpl, H5T_NATIVE_INT, &fill_value);
+     
+    /* Initialize hyperslab values. */
+    start[0] = 0;
+    start[1] = 0;
+    count[0] = 1;
+    count[1] = 1;
+    block[0] = 1;
+    block[1] = VDSDIM1;
+
+    /* 
+     * Build the mappings.
+     * Selections in the source datasets are H5S_ALL.
+     * In the virtual dataset we select the first, the second and the third rows 
+     * and map each row to the data in the corresponding source dataset. 
+     */
+    src_space = H5Screate_simple (RANK1, dims, NULL);
+    for (i = 0; i < 3; i++) {
+        start[0] = (hsize_t)i;
+        /* Select i-th row in the virtual dataset; selection in the source datasets is the same. */
+        status = H5Sselect_hyperslab (space, H5S_SELECT_SET, start, NULL, count, block);
+        status = H5Pset_virtual (dcpl, space, SRC_FILE[i], SRC_DATASET[i], src_space);
+    }
+
+    /* Create a virtual dataset. */
+    dset = H5Dcreate2 (file, DATASET, H5T_NATIVE_INT, space, H5P_DEFAULT,
+                dcpl, H5P_DEFAULT);
+    status = H5Sclose (space);
+    status = H5Sclose (src_space);
+    status = H5Dclose (dset);
+    status = H5Fclose (file);    
+     
+    /*
+     * Now we begin the read section of this example.
+     */
+
+    /*
+     * Open the file and virtual dataset.
+     */
+    file = H5Fopen (FILE, H5F_ACC_RDONLY, H5P_DEFAULT);
+    dset = H5Dopen2 (file, DATASET, H5P_DEFAULT);
+
+    /*
+     * Get creation property list and mapping properties.
+     */
+    dcpl = H5Dget_create_plist (dset);
+
+    /*
+     * Get storage layout.
+     */
+    layout = H5Pget_layout (dcpl);
+    if (H5D_VIRTUAL == layout) 
+        printf(" Dataset has a virtual layout \n");
+    else
+        printf(" Wrong layout found \n");
+
+     /*
+      * Find the number of mappings.
+      */
+     status = H5Pget_virtual_count (dcpl, &num_map);
+     printf(" Number of mappings is %lu\n", (unsigned long)num_map);
+
+     /* 
+      * Get mapping parameters for each mapping.
+      */
+    for (i = 0; i < (int)num_map; i++) {   
+        printf(" Mapping %d \n", i);
+        printf("         Selection in the virtual dataset ");
+        /* Get selection in the virttual  dataset */
+        vspace = H5Pget_virtual_vspace (dcpl, (size_t)i);
+
+        /* Make sure that this is a hyperslab selection and then print information. */
+        if (H5Sget_select_type(vspace) == H5S_SEL_HYPERSLABS) { 
+            nblocks = H5Sget_select_hyper_nblocks (vspace);
+            buf = (hsize_t *)malloc(sizeof(hsize_t)*2*RANK2*nblocks);
+            status = H5Sget_select_hyper_blocklist (vspace, (hsize_t)0, nblocks, buf);
+            for (l=0; l<nblocks; l++) {
+                printf("(");
+                for (k=0; k<RANK2-1; k++) 
+                    printf("%d,", (int)buf[k]);
+                printf("%d ) - (", (int)buf[k]);
+                for (k=0; k<RANK2-1; k++) 
+                    printf("%d,", (int)buf[RANK2+k]);
+                printf("%d)\n", (int)buf[RANK2+k]);
+            }
+        /* We also can use new APIs to get start, stride, count and block */
+            if (H5Sis_regular_hyperslab(vspace)) {
+                status = H5Sget_regular_hyperslab (vspace, start_out, stride_out, count_out, block_out);
+                printf("         start  = [%llu, %llu] \n", (unsigned long long)start_out[0], (unsigned long long)start_out[1]);
+                printf("         stride = [%llu, %llu] \n", (unsigned long long)stride_out[0], (unsigned long long)stride_out[1]);
+                printf("         count  = [%llu, %llu] \n", (unsigned long long)count_out[0], (unsigned long long)count_out[1]);
+                printf("         block  = [%llu, %llu] \n", (unsigned long long)block_out[0], (unsigned long long)block_out[1]);
+            }
+        }
+        /* Get source file name. */
+        len = H5Pget_virtual_filename (dcpl, (size_t)i, NULL, 0);
+        filename = (char *)malloc((size_t)len*sizeof(char)+1);
+        H5Pget_virtual_filename (dcpl, (size_t)i, filename, len+1);
+        printf("         Source filename %s\n", filename);
+
+        /* Get source dataset name. */
+        len = H5Pget_virtual_dsetname (dcpl, (size_t)i, NULL, 0);
+        dsetname = (char *)malloc((size_t)len*sizeof(char)+1);
+        H5Pget_virtual_dsetname (dcpl, (size_t)i, dsetname, len+1);
+        printf("         Source dataset name %s\n", dsetname);
+
+        /* Get selection in the source dataset. */
+        printf("         Selection in the source dataset ");
+        src_space = H5Pget_virtual_srcspace (dcpl, (size_t)i);
+
+        /* Make sure it is ALL selection and then print the coordinates. */
+        if(H5Sget_select_type(src_space) == H5S_SEL_ALL) {
+                printf("(0) - (%d) \n", DIM0-1);
+        }
+        H5Sclose(vspace);
+        H5Sclose(src_space);
+        free(filename);
+        free(dsetname);
+        free(buf);
+    }
+
+    /*
+     * Read the data using the default properties.
+     */
+    status = H5Dread (dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT,
+                rdata[0]);
+
+    /*
+     * Output the data to the screen.
+     */
+    printf (" VDS Data:\n");
+    for (i=0; i<VDSDIM0; i++) {
+        printf (" [");
+        for (j=0; j<VDSDIM1; j++)
+            printf (" %3d", rdata[i][j]);
+        printf ("]\n");
+    }
+    /*
+     * Close and release resources.
+     */
+    status = H5Pclose (dcpl);
+    status = H5Dclose (dset);
+    status = H5Fclose (file);
+
+    return 0;
+}
+
diff --git a/examples/run-c-ex.sh.in b/examples/run-c-ex.sh.in
index bac8073..1661344 100644
--- a/examples/run-c-ex.sh.in
+++ b/examples/run-c-ex.sh.in
@@ -33,7 +33,7 @@ EXIT_FAILURE=1
  
 # Where the tool is installed.
 # default is relative path to installed location of the tools 
-prefix="${prefix:-../../..}"
+prefix="${prefix:- at prefix@}"
 PARALLEL=@PARALLEL@             # Am I in parallel mode?
 AR="@AR@"
 RANLIB="@RANLIB@"
@@ -125,7 +125,23 @@ then
         RunTest h5_elink_unix2win &&\
         rm h5_elink_unix2win &&\
         RunTest h5_shared_mesg &&\
-        rm h5_shared_mesg); then
+        rm h5_shared_mesg &&\
+        RunTest h5_vds-eiger &&\
+        rm h5_vds-eiger &&\
+        RunTest h5_vds-exclim &&\
+        rm h5_vds-exclim &&\
+        RunTest h5_vds-exc &&\
+        rm h5_vds-exc &&\
+        RunTest h5_vds-simpleIO &&\
+        rm h5_vds-simpleIO &&\
+        RunTest h5_vds-percival &&\
+        rm h5_vds-percival &&\
+        RunTest h5_vds-percival-unlim &&\
+        rm h5_vds-percival-unlim &&\
+        RunTest h5_vds-percival-unlim-maxmin&&\
+        rm h5_vds-percival-unlim-maxmin &&\
+        RunTest h5_vds &&\
+        rm h5_vds); then
         EXIT_VALUE=${EXIT_SUCCESS}
     else
         EXIT_VALUE=${EXIT_FAILURE}
diff --git a/examples/testh5cc.sh.in b/examples/testh5cc.sh.in
index b5f33b5..d3f1cfc 100644
--- a/examples/testh5cc.sh.in
+++ b/examples/testh5cc.sh.in
@@ -31,8 +31,7 @@ EXIT_SUCCESS=0
 EXIT_FAILURE=1
 
 # Where the tool is installed.
-# Note: no '/' after DESTDIR.  Explanation in commence.am
-prefix="${prefix:-${DESTDIR}@prefix@}"
+prefix="${prefix:- at prefix@}"
 PARALLEL=@PARALLEL@		# Am I in parallel mode?
 AR="@AR@"
 RANLIB="@RANLIB@"
diff --git a/fortran/Makefile.in b/fortran/Makefile.in
index 55ede05..831587a 100644
--- a/fortran/Makefile.in
+++ b/fortran/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -35,7 +35,17 @@
 # Top-level HDF5-Fortran Makefile(.in)
 #
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -98,19 +108,20 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(top_srcdir)/bin/test-driver COPYING
 TESTS =
 subdir = fortran
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_P = $(am__v_P_ at AM_V@)
@@ -366,6 +377,9 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am COPYING
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 am__relativize = \
   dir0=`pwd`; \
@@ -407,7 +421,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -452,14 +465,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -469,13 +490,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -517,9 +537,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -700,7 +731,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign fortran/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign fortran/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -709,7 +739,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -855,7 +885,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1147,6 +1177,8 @@ uninstall-am:
 	mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/fortran/examples/CMakeLists.txt b/fortran/examples/CMakeLists.txt
index 5241286..aad5f33 100644
--- a/fortran/examples/CMakeLists.txt
+++ b/fortran/examples/CMakeLists.txt
@@ -69,38 +69,36 @@ foreach (example ${examples})
   endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 endforeach (example ${examples})
 
-if (HDF5_ENABLE_F2003)
-  foreach (example ${F2003_examples})
-    add_executable (f03_ex_${example} ${HDF5_F90_EXAMPLES_SOURCE_DIR}/${example}.f90)
-    TARGET_NAMING (f03_ex_${example} STATIC)
-    TARGET_FORTRAN_PROPERTIES (f03_ex_${example} STATIC " " " ")
-    target_link_libraries (f03_ex_${example}
-        ${HDF5_F90_LIB_TARGET}
-        ${HDF5_LIB_TARGET}
+foreach (example ${F2003_examples})
+  add_executable (f03_ex_${example} ${HDF5_F90_EXAMPLES_SOURCE_DIR}/${example}.f90)
+  TARGET_NAMING (f03_ex_${example} STATIC)
+  TARGET_FORTRAN_PROPERTIES (f03_ex_${example} STATIC " " " ")
+  target_link_libraries (f03_ex_${example}
+      ${HDF5_F90_LIB_TARGET}
+      ${HDF5_LIB_TARGET}
+  )
+  target_include_directories (f03_ex_${example} PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/static)
+  set_target_properties (f03_ex_${example} PROPERTIES
+      LINKER_LANGUAGE Fortran
+      FOLDER examples/fortran03
+      Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}
+  )
+  if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+    add_executable (f03_ex_${example}-shared ${HDF5_F90_EXAMPLES_SOURCE_DIR}/${example}.f90)
+    TARGET_NAMING (f03_ex_${example}-shared SHARED)
+    TARGET_FORTRAN_PROPERTIES (f03_ex_${example}-shared SHARED " " " ")
+    target_link_libraries (f03_ex_${example}-shared
+        ${HDF5_F90_LIBSH_TARGET}
+        ${HDF5_LIBSH_TARGET}
     )
-    target_include_directories (f03_ex_${example} PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/static)
-    set_target_properties (f03_ex_${example} PROPERTIES
+    target_include_directories (f03_ex_${example}-shared PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/shared)
+    set_target_properties (f03_ex_${example}-shared PROPERTIES
         LINKER_LANGUAGE Fortran
         FOLDER examples/fortran03
-        Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/static
+        Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/shared
     )
-    if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-      add_executable (f03_ex_${example}-shared ${HDF5_F90_EXAMPLES_SOURCE_DIR}/${example}.f90)
-      TARGET_NAMING (f03_ex_${example}-shared SHARED)
-      TARGET_FORTRAN_PROPERTIES (f03_ex_${example}-shared SHARED " " " ")
-      target_link_libraries (f03_ex_${example}-shared
-          ${HDF5_F90_LIBSH_TARGET}
-          ${HDF5_LIBSH_TARGET}
-      )
-      target_include_directories (f03_ex_${example}-shared PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/shared)
-      set_target_properties (f03_ex_${example}-shared PROPERTIES
-          LINKER_LANGUAGE Fortran
-          FOLDER examples/fortran03
-          Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/shared
-      )
-    endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-  endforeach (example ${F2003_examples})
-endif (HDF5_ENABLE_F2003)
+  endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+endforeach (example ${F2003_examples})
 
 if (H5_HAVE_PARALLEL AND MPI_Fortran_FOUND)
   add_executable (f90_ex_ph5example ${HDF5_F90_EXAMPLES_SOURCE_DIR}/ph5example.f90)
diff --git a/fortran/examples/Makefile.am b/fortran/examples/Makefile.am
index 183476d..5a3b09e 100644
--- a/fortran/examples/Makefile.am
+++ b/fortran/examples/Makefile.am
@@ -46,12 +46,10 @@ INSTALL_FILES=h5_crtdat.f90 h5_rdwt.f90 \
 
 
 # Add attention tests for Fortran 2003 features
-if FORTRAN_2003_CONDITIONAL_F
-  EXAMPLE_PROG +=  rwdset_fortran2003 nested_derived_type \
-      compound_fortran2003 compound_complex_fortran2003
-  INSTALL_FILES +=  rwdset_fortran2003.f90 nested_derived_type.f90 \
-      compound_fortran2003.f90 compound_complex_fortran2003.f90
-endif
+EXAMPLE_PROG +=  rwdset_fortran2003 nested_derived_type \
+    compound_fortran2003 compound_complex_fortran2003
+INSTALL_FILES +=  rwdset_fortran2003.f90 nested_derived_type.f90 \
+    compound_fortran2003.f90 compound_complex_fortran2003.f90
 TEST_SCRIPT=testh5fc.sh
 TEST_EXAMPLES_SCRIPT=$(INSTALL_SCRIPT_FILES)
 
@@ -78,8 +76,8 @@ endif
 
 # Tell automake how to install examples
 # Note: no '/' after DESTDIR.  Explanation in commence.am
-EXAMPLEDIR=${DESTDIR}$(datarootdir)/hdf5_examples/fortran
-EXAMPLETOPDIR=${DESTDIR}$(datarootdir)/hdf5_examples
+EXAMPLEDIR=${DESTDIR}$(exec_prefix)/share/hdf5_examples/fortran
+EXAMPLETOPDIR=${DESTDIR}$(exec_prefix)/share/hdf5_examples
 
 # List dependencies for each example.  Normally, automake would take
 # care of this for us, but if we tell automake about the programs it
@@ -103,12 +101,10 @@ refregexample: refregexample.f90
 mountexample: mountexample.f90
 compound: compound.f90
 ph5example: ph5example.f90
-if FORTRAN_2003_CONDITIONAL_F
 rwdset_fortran2003: rwdset_fortran2003.f90
 nested_derived_type: nested_derived_type.f90
 compound_fortran2003: compound_fortran2003.f90
 compound_complex_fortran2003: compound_complex_fortran2003.f90
-endif
 
 include $(top_srcdir)/config/examples.am
-include $(top_srcdir)/config/conclude.am
+include $(top_srcdir)/config/conclude_fc.am
diff --git a/fortran/examples/Makefile.in b/fortran/examples/Makefile.in
index de33643..bc374ec 100644
--- a/fortran/examples/Makefile.in
+++ b/fortran/examples/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -34,8 +34,22 @@
 # We can't tell automake about example programs, because they need to be
 # built using h5cc (or h5fc, etc.) instead of the standard compilers.
 # This creates some extra work for us.
+
+# Makefile.am include fragment with Fortran helper rules and macros.
+
+# AM_FCCPPFLAGS, FCCPPFLAGS are currently not used.
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -98,29 +112,20 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/examples.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/run-fortran-ex.sh.in $(srcdir)/testh5fc.sh.in \
-	$(top_srcdir)/bin/test-driver
-
-# Add attention tests for Fortran 2003 features
- at FORTRAN_2003_CONDITIONAL_F_TRUE@am__append_1 = rwdset_fortran2003 nested_derived_type \
- at FORTRAN_2003_CONDITIONAL_F_TRUE@      compound_fortran2003 compound_complex_fortran2003
-
- at FORTRAN_2003_CONDITIONAL_F_TRUE@am__append_2 = rwdset_fortran2003.f90 nested_derived_type.f90 \
- at FORTRAN_2003_CONDITIONAL_F_TRUE@      compound_fortran2003.f90 compound_complex_fortran2003.f90
-
 TESTS = $(TEST_SCRIPT)
 subdir = fortran/examples
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES = run-fortran-ex.sh testh5fc.sh
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_P = $(am__v_P_ at AM_V@)
@@ -343,6 +348,12 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/run-fortran-ex.sh.in \
+	$(srcdir)/testh5fc.sh.in $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am \
+	$(top_srcdir)/config/conclude_fc.am \
+	$(top_srcdir)/config/examples.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -359,7 +370,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -404,14 +414,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -421,13 +439,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -469,9 +486,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -619,17 +647,21 @@ INSTALL_SCRIPT_FILES = run-fortran-ex.sh
 # be run.
 # We don't tell automake about these programs so that it doesn't try to
 # compile them with the regular fortran compiler.
+
+# Add attention tests for Fortran 2003 features
 EXAMPLE_PROG = h5_crtdat h5_rdwt h5_crtatt h5_crtgrp h5_crtgrpar \
 	h5_crtgrpd h5_extend h5_subset h5_cmprss hyperslab selectele \
 	refobjexample refregexample mountexample compound \
-	$(am__append_1)
+	rwdset_fortran2003 nested_derived_type compound_fortran2003 \
+	compound_complex_fortran2003
 
 # List files to be installed here
 INSTALL_FILES = h5_crtdat.f90 h5_rdwt.f90 h5_crtatt.f90 h5_crtgrp.f90 \
 	h5_crtgrpar.f90 h5_crtgrpd.f90 h5_extend.f90 h5_subset.f90 \
 	h5_cmprss.f90 hyperslab.f90 selectele.f90 refobjexample.f90 \
 	refregexample.f90 mountexample.f90 compound.f90 ph5example.f90 \
-	$(am__append_2)
+	rwdset_fortran2003.f90 nested_derived_type.f90 \
+	compound_fortran2003.f90 compound_complex_fortran2003.f90
 TEST_SCRIPT = testh5fc.sh
 TEST_EXAMPLES_SCRIPT = $(INSTALL_SCRIPT_FILES)
 
@@ -638,8 +670,8 @@ FORTRAN_API = yes
 
 # Tell automake how to install examples
 # Note: no '/' after DESTDIR.  Explanation in commence.am
-EXAMPLEDIR = ${DESTDIR}$(datarootdir)/hdf5_examples/fortran
-EXAMPLETOPDIR = ${DESTDIR}$(datarootdir)/hdf5_examples
+EXAMPLEDIR = ${DESTDIR}$(exec_prefix)/share/hdf5_examples/fortran
+EXAMPLETOPDIR = ${DESTDIR}$(exec_prefix)/share/hdf5_examples
 
 # Assume that all tests in this directory are examples, and tell
 # conclude.am when to build them.
@@ -648,6 +680,8 @@ EXTRA_PROG = $(EXAMPLE_PROG) $(EXAMPLE_PROG_PARA)
 # We need to tell automake what to clean
 MOSTLYCLEANFILES = *.raw *.meta *.o
 CLEANFILES = $(EXAMPLE_PROG) $(EXAMPLE_PROG_PARA)
+PPFCCOMPILE = $(FC) $(FCDEFS) $(DEFAULT_INCLUDES)  $(FCINCLUDES) $(AM_FCCPPFLAGS) $(FCCPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)
+LTPPFCCOMPILE = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(PPFCCOMPILE)
 
 # Automake needs to be taught how to build lib, progs, and tests targets.
 # These will be filled in automatically for the most part (e.g.,
@@ -671,8 +705,8 @@ TEST_SCRIPT_PARA_CHKSH = $(TEST_SCRIPT_PARA:=.chkexe_)
 all: all-am
 
 .SUFFIXES:
-.SUFFIXES: .log .sh .sh$(EXEEXT) .trs
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/examples.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
+.SUFFIXES: .F90 .f90 .log .o .sh .sh$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/examples.am $(top_srcdir)/config/conclude_fc.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
@@ -684,7 +718,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign fortran/examples/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign fortran/examples/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -693,7 +726,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/examples.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/examples.am $(top_srcdir)/config/conclude_fc.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -750,7 +783,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1018,6 +1051,8 @@ uninstall-am: uninstall-local
 	pdf-am ps ps-am recheck tags-am uninstall uninstall-am \
 	uninstall-local
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
@@ -1067,10 +1102,10 @@ refregexample: refregexample.f90
 mountexample: mountexample.f90
 compound: compound.f90
 ph5example: ph5example.f90
- at FORTRAN_2003_CONDITIONAL_F_TRUE@rwdset_fortran2003: rwdset_fortran2003.f90
- at FORTRAN_2003_CONDITIONAL_F_TRUE@nested_derived_type: nested_derived_type.f90
- at FORTRAN_2003_CONDITIONAL_F_TRUE@compound_fortran2003: compound_fortran2003.f90
- at FORTRAN_2003_CONDITIONAL_F_TRUE@compound_complex_fortran2003: compound_complex_fortran2003.f90
+rwdset_fortran2003: rwdset_fortran2003.f90
+nested_derived_type: nested_derived_type.f90
+compound_fortran2003: compound_fortran2003.f90
+compound_complex_fortran2003: compound_complex_fortran2003.f90
 
 # How to create EXAMPLEDIR if it doesn't already exist
 $(EXAMPLEDIR):
@@ -1141,6 +1176,12 @@ installcheck-local:
 	     /bin/sh ./$(TEST_EXAMPLES_SCRIPT);)                                                   \
 	fi
 
+# Treat all .f90 and .F90 files as preprocessed Fortran.
+.f90.o:
+	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+.F90.o:
+	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
 build-lib: $(LIB)
diff --git a/fortran/examples/nested_derived_type.f90 b/fortran/examples/nested_derived_type.f90
index f806110..65e7e75 100644
--- a/fortran/examples/nested_derived_type.f90
+++ b/fortran/examples/nested_derived_type.f90
@@ -23,13 +23,13 @@ PROGRAM main
   IMPLICIT NONE
 
 ! KIND parameters
-  INTEGER, PARAMETER :: int_k1 = SELECTED_INT_KIND(Fortran_INTEGER_1)  ! This should map to INTEGER*1 on most modern processors
-  INTEGER, PARAMETER :: int_k4 = SELECTED_INT_KIND(Fortran_INTEGER_2)  ! This should map to INTEGER*2 on most modern processors
-  INTEGER, PARAMETER :: int_k8 = SELECTED_INT_KIND(Fortran_INTEGER_4)  ! This should map to INTEGER*4 on most modern processors
-  INTEGER, PARAMETER :: int_k16 = SELECTED_INT_KIND(Fortran_INTEGER_8) ! This should map to INTEGER*8 on most modern processors
+  INTEGER, PARAMETER :: int_k1 = SELECTED_INT_KIND(2)  ! This should map to INTEGER*1 on most modern processors
+  INTEGER, PARAMETER :: int_k4 = SELECTED_INT_KIND(4)  ! This should map to INTEGER*2 on most modern processors
+  INTEGER, PARAMETER :: int_k8 = SELECTED_INT_KIND(9)  ! This should map to INTEGER*4 on most modern processors
+  INTEGER, PARAMETER :: int_k16 = SELECTED_INT_KIND(18) ! This should map to INTEGER*8 on most modern processors
 
-  INTEGER, PARAMETER :: r_k4 = SELECTED_REAL_KIND(Fortran_REAL_4) ! This should map to REAL*4 on most modern processors
-  INTEGER, PARAMETER :: r_k8 = SELECTED_REAL_KIND(Fortran_REAL_8) ! This should map to REAL*8 on most modern processors
+  INTEGER, PARAMETER :: r_k4 = SELECTED_REAL_KIND(6,37) ! This should map to REAL*4 on most modern processors
+  INTEGER, PARAMETER :: r_k8 = SELECTED_REAL_KIND(15,307) ! This should map to REAL*8 on most modern processors
 
 ! FILES
 
diff --git a/fortran/examples/run-fortran-ex.sh.in b/fortran/examples/run-fortran-ex.sh.in
index ce1798d..a4d4550 100644
--- a/fortran/examples/run-fortran-ex.sh.in
+++ b/fortran/examples/run-fortran-ex.sh.in
@@ -34,7 +34,7 @@ EXIT_FAILURE=1
 
 # Where the tool is installed.
 # default is relative path to installed location of the tools
-prefix="${prefix:-../../..}"
+prefix="${prefix:- at prefix@}"
 PARALLEL=@PARALLEL@             # Am I in parallel mode?
 AR="@AR@"
 RANLIB="@RANLIB@"
diff --git a/fortran/examples/rwdset_fortran2003.f90 b/fortran/examples/rwdset_fortran2003.f90
index d65db9e..682676f 100644
--- a/fortran/examples/rwdset_fortran2003.f90
+++ b/fortran/examples/rwdset_fortran2003.f90
@@ -28,13 +28,13 @@ PROGRAM RWDSET_FORTRAN2003
         
   IMPLICIT NONE
 
-  INTEGER, PARAMETER :: int_kind_1 = SELECTED_INT_KIND(Fortran_INTEGER_1)  !should map to INTEGER*1 on most modern processors
-  INTEGER, PARAMETER :: int_kind_4 = SELECTED_INT_KIND(Fortran_INTEGER_2)  !should map to INTEGER*2 on most modern processors
-  INTEGER, PARAMETER :: int_kind_8 = SELECTED_INT_KIND(Fortran_INTEGER_4)  !should map to INTEGER*4 on most modern processors
-  INTEGER, PARAMETER :: int_kind_16 = SELECTED_INT_KIND(Fortran_INTEGER_8) !should map to INTEGER*8 on most modern processors
+  INTEGER, PARAMETER :: int_kind_1 = SELECTED_INT_KIND(2)  !should map to INTEGER*1 on most modern processors
+  INTEGER, PARAMETER :: int_kind_4 = SELECTED_INT_KIND(4)  !should map to INTEGER*2 on most modern processors
+  INTEGER, PARAMETER :: int_kind_8 = SELECTED_INT_KIND(9)  !should map to INTEGER*4 on most modern processors
+  INTEGER, PARAMETER :: int_kind_16 = SELECTED_INT_KIND(18) !should map to INTEGER*8 on most modern processors
 
-  INTEGER, PARAMETER :: real_kind_7 = SELECTED_REAL_KIND(Fortran_REAL_4) !should map to REAL*4 on most modern processors
-  INTEGER, PARAMETER :: real_kind_15 = SELECTED_REAL_KIND(Fortran_REAL_8) !should map to REAL*8 on most modern processors
+  INTEGER, PARAMETER :: real_kind_7 = SELECTED_REAL_KIND(6,37) !should map to REAL*4 on most modern processors
+  INTEGER, PARAMETER :: real_kind_15 = SELECTED_REAL_KIND(15,307) !should map to REAL*8 on most modern processors
 
   CHARACTER(LEN=8), PARAMETER :: filename = "dsetf.h5" ! File name
   CHARACTER(LEN=5), PARAMETER :: dsetname1 = "dset1"     ! Dataset name
@@ -148,12 +148,12 @@ PROGRAM RWDSET_FORTRAN2003
   CALL h5dread_f(dset_idr8, h5kind_to_type(real_kind_15,H5_REAL_KIND), f_ptr,  error)
 
 ! memory type
-  WRITE(*,'(A,4i8)' )'SELECTED_INT_KIND(Fortran_INTEGER_1):  ',data_out_i8a
-  WRITE(*,'(A,4i8)' )'SELECTED_INT_KIND(Fortran_INTEGER_4):  ',data_out_i4
-  WRITE(*,'(A,4i8)' )'SELECTED_INT_KIND(Fortran_INTEGER_8):  ',data_out_i8
-  WRITE(*,'(A,4i8)' )'SELECTED_INT_KIND(Fortran_INTEGER_16): ',data_out_i16
-  WRITE(*,'(A,4(1x,f9.4))' )'SELECTED_REAL_KIND(Fortran_REAL_7):  ',data_out_r7
-  WRITE(*,'(A,4(1x,f16.10))' )'SELECTED_REAL_KIND(Fortran_REAL_15):  ',data_out_r15
+  WRITE(*,'(A,4i8)' )'SELECTED_INT_KIND(2):  ',data_out_i8a
+  WRITE(*,'(A,4i8)' )'SELECTED_INT_KIND(4):  ',data_out_i4
+  WRITE(*,'(A,4i8)' )'SELECTED_INT_KIND(9):  ',data_out_i8
+  WRITE(*,'(A,4i8)' )'SELECTED_INT_KIND(18): ',data_out_i16
+  WRITE(*,'(A,4(1x,f9.4))' )'SELECTED_REAL_KIND(6,37):  ',data_out_r7
+  WRITE(*,'(A,4(1x,f16.10))' )'SELECTED_REAL_KIND(15,307):  ',data_out_r15
   !
   ! Close the dataset.
   !
diff --git a/fortran/src/CMakeLists.txt b/fortran/src/CMakeLists.txt
index 1922893..dc884d5 100644
--- a/fortran/src/CMakeLists.txt
+++ b/fortran/src/CMakeLists.txt
@@ -19,100 +19,49 @@ if (WIN32)
   endif (BUILD_SHARED_LIBS)
 endif (WIN32)
 
+# configure for Fortran preprocessor
+
+# Define Parallel variable for passing to H5config_f.inc.cmake
+set (CMAKE_H5_HAVE_PARALLEL 0)
+if (H5_HAVE_PARALLEL)
+  set (CMAKE_H5_HAVE_PARALLEL 1)
+endif (H5_HAVE_PARALLEL)
+
+set (CMAKE_H5_HAVE_FLOAT128 0)
+if (HAVE_FLOAT128)
+  set (CMAKE_H5_HAVE_FLOAT128 1)
+endif(HAVE_FLOAT128)
+
+configure_file (${HDF5_F90_SRC_SOURCE_DIR}/H5config_f.inc.cmake ${CMAKE_BINARY_DIR}/H5config_f.inc @ONLY)
+configure_file (${HDF5_F90_SRC_SOURCE_DIR}/H5fort_type_defines.h.in ${HDF5_F90_BINARY_DIR}/H5fort_type_defines.h @ONLY)
+
+set (Fortran_COMPILER_ID CMAKE_Fortran_COMPILER_ID)
+
 #-----------------------------------------------------------------------------
 # Setup the Fortran auto-detection utilities
-# H5test_kind(_SIZEOF,_STORAGE_SIZE).f90 used to generate H5fortran_detect.f90
-# H5fortran_detect.f90     used to generate H5fort_type_defines.h
-# H5fort_type_defines.h    used to generate H5f90i_gen.h + H5fortran_types.f90
+# H5_buildiface.F90      used to generate various KIND interfaces
+# H5fort_type_defines.h   used to generate H5f90i_gen.h + H5fortran_types.F90
 #-----------------------------------------------------------------------------
-if (FORTRAN_HAVE_STORAGE_SIZE)
-  add_executable (H5test_FortranHavekind
-      ${HDF5_F90_SRC_SOURCE_DIR}/H5test_kind_STORAGE_SIZE.f90
-  )
-  if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-    add_executable (H5test_FortranHavekind-shared
-        ${HDF5_F90_SRC_SOURCE_DIR}/H5test_kind_STORAGE_SIZE.f90
-    )
-  endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-  set (H5_TEST_KIND_NAME "h5test_kind_storage_size_mod")
-else (FORTRAN_HAVE_STORAGE_SIZE)
-    if (FORTRAN_HAVE_SIZEOF)
-      add_executable (H5test_FortranHavekind
-          ${HDF5_F90_SRC_SOURCE_DIR}/H5test_kind_SIZEOF.f90
-      )
-      if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-        add_executable (H5test_FortranHavekind-shared
-            ${HDF5_F90_SRC_SOURCE_DIR}/H5test_kind_SIZEOF.f90
-        )
-      endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-      set (H5_TEST_KIND_NAME "h5test_kind_sizeof_mod")
-    else (FORTRAN_HAVE_SIZEOF)
-      add_executable (H5test_FortranHavekind
-          ${HDF5_F90_SRC_SOURCE_DIR}/H5test_kind.f90
-      )
-      if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-        add_executable (H5test_FortranHavekind-shared
-            ${HDF5_F90_SRC_SOURCE_DIR}/H5test_kind.f90
-        )
-      endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-    endif (FORTRAN_HAVE_SIZEOF)
-endif (FORTRAN_HAVE_STORAGE_SIZE)
-if (WIN32 AND MSVC)
-  if (BUILD_SHARED_LIBS)
-    set_target_properties (H5test_FortranHavekind-shared
-        PROPERTIES
-            COMPILE_FLAGS "/MT"
-    )
-  endif (BUILD_SHARED_LIBS)
-  set_target_properties (H5test_FortranHavekind
-      PROPERTIES
-          LINK_FLAGS "/SUBSYSTEM:CONSOLE"
-  )
-endif (WIN32 AND MSVC)
-set_target_properties (H5test_FortranHavekind PROPERTIES
-    LINKER_LANGUAGE Fortran
-    Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/static
-)
-if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-  set_target_properties (H5test_FortranHavekind-shared PROPERTIES
-      LINKER_LANGUAGE Fortran
-      Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/shared
+
+add_executable (H5_buildiface
+      ${HDF5_F90_SRC_SOURCE_DIR}/H5_buildiface.F90
   )
-endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 
-set (CMD $<TARGET_FILE:H5test_FortranHavekind>)
-add_custom_command (
-    OUTPUT ${HDF5_F90_BINARY_DIR}/H5fortran_detect.f90
-    COMMAND ${CMD}
-    ARGS > ${HDF5_F90_BINARY_DIR}/H5fortran_detect.f90
-    WORKING_DIRECTORY ${HDF5_F90_BINARY_DIR}
-    DEPENDS H5test_FortranHavekind
-)
-#-----------------------------------------------------------------------------
-add_executable (H5fortran_detect
-    ${HDF5_F90_BINARY_DIR}/H5fortran_detect.f90
-)
 if (WIN32 AND MSVC)
   if (BUILD_SHARED_LIBS)
-    set_target_properties (H5fortran_detect
+    set_target_properties (H5_buildiface
         PROPERTIES
             COMPILE_FLAGS "/MT"
     )
   endif (BUILD_SHARED_LIBS)
-  set_target_properties (H5fortran_detect
+  set_target_properties (H5_buildiface
       PROPERTIES
           LINK_FLAGS "/SUBSYSTEM:CONSOLE"
   )
 endif (WIN32 AND MSVC)
-set_target_properties (H5fortran_detect PROPERTIES LINKER_LANGUAGE Fortran)
-
-set (CMD $<TARGET_FILE:H5fortran_detect>)
-add_custom_command (
-    OUTPUT ${HDF5_F90_BINARY_DIR}/H5fort_type_defines.h
-    COMMAND ${CMD}
-    ARGS > ${HDF5_F90_BINARY_DIR}/H5fort_type_defines.h
-    WORKING_DIRECTORY ${HDF5_F90_BINARY_DIR}
-    DEPENDS H5fortran_detect
+set_target_properties (H5_buildiface PROPERTIES
+    LINKER_LANGUAGE Fortran
+    Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}
 )
 
 if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
@@ -138,7 +87,7 @@ add_executable (H5match_types
 set (CMD $<TARGET_FILE:H5match_types>)
 add_custom_command (
     OUTPUT ${HDF5_F90_BINARY_DIR}/H5f90i_gen.h
-           ${HDF5_F90_BINARY_DIR}/H5fortran_types.f90
+           ${HDF5_F90_BINARY_DIR}/H5fortran_types.F90
     COMMAND ${CMD}
     WORKING_DIRECTORY ${HDF5_F90_BINARY_DIR}
     DEPENDS H5match_types
@@ -166,12 +115,6 @@ set (f90CStub_C_SRCS
     ${HDF5_F90_SRC_SOURCE_DIR}/H5Zf.c
 )
 
-if (H5_HAVE_PARALLEL)
-  set (f90CStub_C_SRCS
-      ${f90CStub_C_SRCS}
-      ${HDF5_F90_SRC_SOURCE_DIR}/H5FDmpiof.c
-  )
-endif (H5_HAVE_PARALLEL)
 set_source_files_properties (${f90CStub_C_SRCS} PROPERTIES LANGUAGE C)
 
 set (f90CStub_C_HDRS
@@ -196,7 +139,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   TARGET_C_PROPERTIES (${HDF5_F90_C_LIBSH_TARGET} SHARED " " " ")
   target_link_libraries (${HDF5_F90_C_LIBSH_TARGET} ${HDF5_LIBSH_TARGET} ${LINK_SHARED_LIBS})
   set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_F90_C_LIBSH_TARGET}")
-  H5_SET_LIB_OPTIONS (${HDF5_F90_C_LIBSH_TARGET} ${HDF5_F90_C_LIB_NAME} SHARED ${HDF5_F_PACKAGE_SOVERSION})
+  H5_SET_LIB_OPTIONS (${HDF5_F90_C_LIBSH_TARGET} ${HDF5_F90_C_LIB_NAME} SHARED)
   set_target_properties (${HDF5_F90_C_LIBSH_TARGET} PROPERTIES
       FOLDER libraries/fortran
       LINKER_LANGUAGE C
@@ -207,79 +150,51 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   set (install_targets ${install_targets} ${HDF5_F90_C_LIBSH_TARGET})
 endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 
-#-----------------------------------------------------------------------------
-# Fortran 2003 standard
-#-----------------------------------------------------------------------------
-if (HDF5_ENABLE_F2003)
-  # F2003 features are enabled
-  set (F_STATUS "_F03")
-else (HDF5_ENABLE_F2003)
-  # F2003 features are not enabled
-  set (F_STATUS "_F90")
-endif (HDF5_ENABLE_F2003)
-
-#-----------------------------------------------------------------------------
-# Fortran Real Size
-#-----------------------------------------------------------------------------
-if (FORTRAN_DEFAULT_REAL_NOT_DOUBLE)
-  # default real is 4 bytes, so include double signatures
-  set (F_DBLE "Include")
-else (FORTRAN_DEFAULT_REAL_NOT_DOUBLE)
-  # default real is 8 bytes, so exclude double signatures
-  set (F_DBLE "Exclude")
-endif (FORTRAN_DEFAULT_REAL_NOT_DOUBLE)
+set_source_files_properties (${HDF5_F90_BINARY_DIR}/H5_gen.F90 PROPERTIES GENERATED TRUE)
 
 #-----------------------------------------------------------------------------
 # Fortran Modules
 #-----------------------------------------------------------------------------
-set (f90_F_SRCS
+set (f90_F_BASE_SRCS
     # generated files
-    ${HDF5_F90_BINARY_DIR}/H5fortran_types.f90
+    ${HDF5_F90_BINARY_DIR}/H5fortran_types.F90
 
     # normal distribution
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5f90global.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5_ff${F_STATUS}.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5_ff.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Aff.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Dff.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Eff.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Fff.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Gff.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Iff.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Lff.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Off.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Pff.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Rff.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Sff.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Tff.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Zff.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Aff${F_STATUS}.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Dff${F_STATUS}.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Eff${F_STATUS}.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Fff${F_STATUS}.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Lff${F_STATUS}.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Off${F_STATUS}.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Pff${F_STATUS}.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Rff${F_STATUS}.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5Tff${F_STATUS}.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5_DBLE_Interface${F_DBLE}.f90
+    ${HDF5_F90_SRC_SOURCE_DIR}/H5f90global.F90
+    ${HDF5_F90_SRC_SOURCE_DIR}/H5_ff.F90
+    ${HDF5_F90_SRC_SOURCE_DIR}/H5Aff.F90
+    ${HDF5_F90_SRC_SOURCE_DIR}/H5Dff.F90
+    ${HDF5_F90_SRC_SOURCE_DIR}/H5Eff.F90
+    ${HDF5_F90_SRC_SOURCE_DIR}/H5Fff.F90
+    ${HDF5_F90_SRC_SOURCE_DIR}/H5Gff.F90
+    ${HDF5_F90_SRC_SOURCE_DIR}/H5Iff.F90
+    ${HDF5_F90_SRC_SOURCE_DIR}/H5Lff.F90
+    ${HDF5_F90_SRC_SOURCE_DIR}/H5Off.F90
+    ${HDF5_F90_SRC_SOURCE_DIR}/H5Pff.F90
+    ${HDF5_F90_SRC_SOURCE_DIR}/H5Rff.F90
+    ${HDF5_F90_SRC_SOURCE_DIR}/H5Sff.F90
+    ${HDF5_F90_SRC_SOURCE_DIR}/H5Tff.F90
+    ${HDF5_F90_SRC_SOURCE_DIR}/H5Zff.F90
+)
+
+set (f90_F_SRCS
+    ${f90_F_BASE_SRCS}
+
+    # generated file
+    ${HDF5_F90_BINARY_DIR}/H5_gen.F90
+
+    # normal distribution
+    ${HDF5_F90_SRC_SOURCE_DIR}/HDF5.F90
+)
+
+set (CMD $<TARGET_FILE:H5_buildiface>)
+add_custom_target (H5gen ALL
+    COMMAND ${CMD}
+#v3.2    BYPRODUCT ${HDF5_F90_BINARY_DIR}/H5_gen.F90
+    WORKING_DIRECTORY ${HDF5_F90_BINARY_DIR}
+    DEPENDS ${f90_F_BASE_SRCS}
 )
 
-#-----------------------------------------------------------------------------
-# Add H5FDMPIO if parallel
-#-----------------------------------------------------------------------------
-if (H5_HAVE_PARALLEL AND MPI_Fortran_FOUND)
-  set (f90_F_SRCS
-    ${f90_F_SRCS}
-    ${HDF5_F90_SRC_SOURCE_DIR}/HDF5mpio.f90
-    ${HDF5_F90_SRC_SOURCE_DIR}/H5FDmpioff.f90
-  )
-else (H5_HAVE_PARALLEL AND MPI_Fortran_FOUND)
-  set (f90_F_SRCS
-    ${f90_F_SRCS}
-    ${HDF5_F90_SRC_SOURCE_DIR}/HDF5.f90
-  )
-endif (H5_HAVE_PARALLEL AND MPI_Fortran_FOUND)
 set_source_files_properties (${f90_F_SRCS} PROPERTIES LANGUAGE Fortran)
 
 #-----------------------------------------------------------------------------
@@ -319,7 +234,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
     target_link_libraries (${HDF5_F90_LIBSH_TARGET} ${MPI_Fortran_LIBRARIES})
   endif (H5_HAVE_PARALLEL AND MPI_Fortran_FOUND)
   set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_F90_LIBSH_TARGET}")
-  H5_SET_LIB_OPTIONS (${HDF5_F90_LIBSH_TARGET} ${HDF5_F90_LIB_NAME} SHARED ${HDF5_F_PACKAGE_SOVERSION})
+  H5_SET_LIB_OPTIONS (${HDF5_F90_LIBSH_TARGET} ${HDF5_F90_LIB_NAME} SHARED)
   set_target_properties (${HDF5_F90_LIBSH_TARGET} PROPERTIES
       FOLDER libraries/fortran
       LINKER_LANGUAGE Fortran
@@ -345,7 +260,7 @@ install (
         ${HDF5_F90_SRC_SOURCE_DIR}/H5f90i.h
         ${HDF5_F90_SRC_SOURCE_DIR}/H5f90proto.h
         ${HDF5_F90_BINARY_DIR}/H5f90i_gen.h
-        ${HDF5_F90_BINARY_DIR}/H5fortran_types.f90
+        ${HDF5_F90_BINARY_DIR}/H5fortran_types.F90
     DESTINATION
         ${HDF5_INSTALL_INCLUDE_DIR}
     COMPONENT
@@ -370,17 +285,7 @@ set (mod_files
     ${MOD_BUILD_DIR}/h5s.mod
     ${MOD_BUILD_DIR}/h5t.mod
     ${MOD_BUILD_DIR}/h5z.mod
-    ${MOD_BUILD_DIR}/h5a_provisional.mod
-    ${MOD_BUILD_DIR}/h5d_provisional.mod
-    ${MOD_BUILD_DIR}/h5e_provisional.mod
-    ${MOD_BUILD_DIR}/h5f_provisional.mod
-    ${MOD_BUILD_DIR}/h5l_provisional.mod
-    ${MOD_BUILD_DIR}/h5lib_provisional.mod
-    ${MOD_BUILD_DIR}/h5o_provisional.mod
-    ${MOD_BUILD_DIR}/h5p_provisional.mod
-    ${MOD_BUILD_DIR}/h5r_provisional.mod
-    ${MOD_BUILD_DIR}/h5t_provisional.mod
-    ${MOD_BUILD_DIR}/h5_dble_interface.mod
+    ${MOD_BUILD_DIR}/h5_gen.mod
 )
 install (
     FILES
@@ -410,17 +315,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
       ${MODSH_BUILD_DIR}/h5s.mod
       ${MODSH_BUILD_DIR}/h5t.mod
       ${MODSH_BUILD_DIR}/h5z.mod
-      ${MODSH_BUILD_DIR}/h5a_provisional.mod
-      ${MODSH_BUILD_DIR}/h5d_provisional.mod
-      ${MODSH_BUILD_DIR}/h5e_provisional.mod
-      ${MODSH_BUILD_DIR}/h5f_provisional.mod
-      ${MODSH_BUILD_DIR}/h5l_provisional.mod
-      ${MODSH_BUILD_DIR}/h5lib_provisional.mod
-      ${MODSH_BUILD_DIR}/h5o_provisional.mod
-      ${MODSH_BUILD_DIR}/h5p_provisional.mod
-      ${MODSH_BUILD_DIR}/h5r_provisional.mod
-      ${MODSH_BUILD_DIR}/h5t_provisional.mod
-      ${MODSH_BUILD_DIR}/h5_dble_interface.mod
+      ${MODSH_BUILD_DIR}/h5_gen.mod
   )
   install (
       FILES
@@ -432,7 +327,6 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   )
 endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 
-
 #-----------------------------------------------------------------------------
 # Add Target(s) to CMake Install for import into other projects
 #-----------------------------------------------------------------------------
diff --git a/fortran/src/H5Af.c b/fortran/src/H5Af.c
index bc2e9f1..8f012cf 100644
--- a/fortran/src/H5Af.c
+++ b/fortran/src/H5Af.c
@@ -1,6 +1,6 @@
 /****h* H5Af/H5Af
  * PURPOSE
- *   This file contains C stubs for H5A Fortran APIs
+ *  This file contains C stubs for H5A Fortran APIs
  *
  * COPYRIGHT
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -26,942 +26,31 @@
 
 /****if* H5Af/h5acreate_c
  * NAME
- *        h5acreate_c
+ *  h5acreate_c
  * PURPOSE
- *     Call H5Acreate2 to create an attribute
+ *  Call H5Acreate2 to create an attribute
  * INPUTS
- *      obj_id - object identifier
- *              name - name of the attribute
- *              namelen - name length
- *              type_id - datatype identifier
- *              space_id - dataspace identifier
- *              crt_pr  - identifier of creation property list
+ *  obj_id - object identifier
+ *  name - name of the attribute
+ *  namelen - name length
+ *  type_id - datatype identifier
+ *  space_id - dataspace identifier
+ *  crt_pr  - identifier of creation property list
  * OUTPUTS
- *     attr_id - attribute identifier
+ *  attr_id - attribute identifier
  * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              Thursday, August 12, 1999
- * HISTORY
- *
- * SOURCE
-*/
-int_f
-nh5acreate_c(hid_t_f *obj_id, _fcd name, size_t_f *namelen, hid_t_f *type_id,
-    hid_t_f *space_id, hid_t_f *crt_prp, hid_t_f *aapl, hid_t_f *attr_id)
-/*******/
-{
-    char *c_name = NULL;        /* Buffer to hold C string */
-    int_f ret_value = 0;        /* Return value */
-
-     /*
-      * Convert FORTRAN name to C name
-      */
-    if(NULL == (c_name = HD5f2cstring(name, (size_t)*namelen)))
-        HGOTO_DONE(FAIL);
-
-     /*
-      * Call H5Acreate2 function.
-      */
-    if((*attr_id = (hid_t_f)H5Acreate2((hid_t)*obj_id, c_name, (hid_t)*type_id, (hid_t)*space_id, (hid_t)*crt_prp, (hid_t)*aapl)) < 0)
-        HGOTO_DONE(FAIL);
-
-done:
-    if(c_name)
-        HDfree(c_name);
-    return ret_value;
-}
-
-/****if* H5Af/h5aopen_name_c
- * NAME
- *        h5aopen_name_c
- * PURPOSE
- *     Call H5Aopen to open an attribute
- * INPUTS
- *      obj_id - object identifier
- *              name - name of the attribute
- *              namelen - name length
- * OUTPUTS
- *     attr_id - dataset identifier
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              Thursday, August 12, 1999
- * HISTORY
- *
- * SOURCE
-*/
-int_f
-nh5aopen_name_c (hid_t_f *obj_id, _fcd name, size_t_f *namelen, hid_t_f *attr_id)
-/*******/
-{
-    char *c_name = NULL;          /* Buffer to hold C string */
-    int_f ret_value = 0;          /* Return value */
-
-     /*
-      * Convert FORTRAN name to C name
-      */
-     if((c_name = HD5f2cstring(name, (size_t)*namelen)) == NULL)
-        HGOTO_DONE(FAIL);
-
-     /*
-      * Call H5Aopen function.
-      */
-     if((*attr_id = (hid_t_f)H5Aopen((hid_t)*obj_id, c_name, H5P_DEFAULT)) < 0)
-         HGOTO_DONE(FAIL);
-
-done:
-    if(c_name)
-        HDfree(c_name);
-    return ret_value;
-}
-
-/****if* H5Af/h5awritec_c
- * NAME
- *        h5awritec_c
- * PURPOSE
- *     Call h5awrite_c to write a character  attribute
- * INPUTS
- *      attr_id - dataset identifier
- *              mem_type_id - memory datatype identifier
- *              buf      - character data buffer
- *              dims     - array to store dimensions sizes of buf; used only
- *                         by Fortran routine.
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              Thursday , August 12, 1999
- * HISTORY
- * dims paramete added.
- *                April 4, 2001
- * SOURCE
-*/
-int_f
-nh5awritec_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, _fcdtocp(buf), dims);
-}
-int_f
-nh5awritec_s_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, _fcdtocp(buf), dims);
-}
-
-int_f
-nh5awritec_1_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, _fcdtocp(buf), dims);
-}
-
-int_f
-nh5awritec_2_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, _fcdtocp(buf), dims);
-}
-
-int_f
-nh5awritec_3_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, _fcdtocp(buf), dims);
-}
-
-int_f
-nh5awritec_4_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, _fcdtocp(buf), dims);
-}
-
-int_f
-nh5awritec_5_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, _fcdtocp(buf), dims);
-}
-
-int_f
-nh5awritec_6_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, _fcdtocp(buf), dims);
-}
-
-int_f
-nh5awritec_7_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, _fcdtocp(buf), dims);
-}
-
-
-
-/****if* H5Af/h5awrite_c
- * NAME
- *        h5awrite_c
- * PURPOSE
- *     Call H5Awrite to write a attribute
- * INPUTS
- *      attr_id - attribute identifier
- *              mem_type_id - memory datatype identifier
- *              buf      - data buffer
- *              dims     - array to store dimensions sizes of buf; used only
- *                         by Fortran routine.
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              Thursday, August 12, 1999
- * HISTORY
- * dims parameter added
- *                                           April 4, 2001
- *                Added nh5awrite_integer(real,double)_s,1-7 functions to eliminate
- *                complains about wrong parameters types in h5awrite_c function
- *                called by Fortran routines.
- *                                           October 9, 2006 EIP
- * SOURCE
-*/
-int_f
-nh5awrite_integer_s_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_integer_1_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_integer_2_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_integer_3_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_integer_4_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_integer_5_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_integer_6_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_integer_7_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_real_s_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_real_1_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_real_2_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_real_3_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_real_4_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_real_5_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_real_6_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_real_7_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_double_s_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_double_1_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_double_2_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_double_3_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_double_4_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_double_5_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_double_6_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_double_7_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-     /*
-      * Call h5awrite_c  function.
-      */
-     return nh5awrite_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5awrite_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED *dims)
-/******/
-{
-    int_f ret_value=0;          /* Return value */
-
-     /*
-      * Call H5Awrite function.
-      */
-     if (H5Awrite((hid_t)*attr_id, (hid_t)*mem_type_id, buf) < 0)
-        HGOTO_DONE(FAIL);
-
-done:
-     return ret_value;
-}
-
-
-/****if* H5Af/h5areadc_c
- * NAME
- *        h5areadc_c
- * PURPOSE
- *     Call h5aread_c to read character  attribute
- * INPUTS
- *      dset_id - dataset identifier
- *              mem_type_id - memory datatype identifier
- *              dims     - array to store dimensions sizes of buf; used only
- *                         by Fortran routine.
- * OUTPUTS
- *     buf      - character data buffer
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              Thursday, August 12, 1999
- * HISTORY
- * dims parameter added.
- *                April 4, 2001
- *                Added nh5areadc_s,1-7 functions to eliminate
- *                complains about wrong parameters types in h5awrite_c function
- *                called by Fortran routines.
- *                                           October 9, 2006 EIP
- * SOURCE
-*/
-int_f
-nh5areadc_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, _fcdtocp(buf), dims);
-}
-int_f
-nh5areadc_s_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, _fcdtocp(buf), dims);
-}
-
-int_f
-nh5areadc_1_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, _fcdtocp(buf), dims);
-}
-
-int_f
-nh5areadc_2_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, _fcdtocp(buf), dims);
-}
-
-int_f
-nh5areadc_3_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, _fcdtocp(buf), dims);
-}
-
-int_f
-nh5areadc_4_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, _fcdtocp(buf), dims);
-}
-
-int_f
-nh5areadc_5_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, _fcdtocp(buf), dims);
-}
-
-int_f
-nh5areadc_6_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, _fcdtocp(buf), dims);
-}
-int_f
-nh5areadc_7_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, _fcdtocp(buf), dims);
-}
-
-
-
-/****if* H5Af/h5aread_c
- * NAME
- *        h5aread_c
- * PURPOSE
- *     Call H5Aread to read an attribute
- * INPUTS
- *      dset_id - dataset identifier
- *              mem_type_id - memory datatype identifier
- *              dims     - array to store dimensions sizes of buf; used only
- *                         by Fortran routine.
- * OUTPUTS
- *     buf      - data buffer
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              Thursday, August 12, 1999
- * HISTORY
- * dims paramete added.
- *                April 4, 2001
- *                Added nh5aread_integer(real,double)_s,1-7 functions to eliminate
- *                complains about wrong parameters types in h5awrite_c function
- *                called by Fortran routines.
- *                                           October 9, 2006 EIP
- * SOURCE
-*/
-int_f
-nh5aread_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-    int_f ret_value=0;          /* Return value */
-
-     /*
-      * Call H5Aread function.
-      */
-     if (H5Aread((hid_t)*attr_id, (hid_t)*mem_type_id, buf) < 0)
-         HGOTO_DONE(FAIL);
-
-done:
-     return ret_value;
-}
-
-int_f
-nh5aread_integer_s_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_integer_1_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_integer_2_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_integer_3_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_integer_4_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_integer_5_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_integer_6_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_integer_7_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_real_s_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_real_1_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_real_2_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_real_3_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_real_4_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_real_5_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_real_6_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_real_7_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_double_s_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_double_1_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_double_2_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_double_3_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_double_4_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_double_5_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_double_6_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-int_f
-nh5aread_double_7_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void H5_ATTR_UNUSED * dims)
-/******/
-{
-     /*
-      * Call h5aread_c  function.
-      */
-     return nh5aread_c(attr_id, mem_type_id, buf, dims);
-}
-
-
-/****if* H5Af/h5aclose_c
- * NAME
- *        h5aclose_c
- * PURPOSE
- *     Call H5Aclose to close an attribute
- * INPUTS
- *      attr_id - identifier of an attribute to be closed
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              Thursday, August 12, 1999
- * HISTORY
- *
- * SOURCE
-*/
-
-int_f
-nh5aclose_c ( hid_t_f *attr_id )
-/******/
-{
-    int_f ret_value=0;          /* Return value */
-
-    if (H5Aclose((hid_t)*attr_id) < 0)
-        HGOTO_DONE(FAIL);
-
-done:
-    return ret_value;
-}
-
-/****if* H5Af/h5adelete_c
- * NAME
- *        h5adelete_c
- * PURPOSE
- *     Call H5Adelete to delete an attribute
- * INPUTS
- *      obj_id - object identifier
- *              name - name of the attribute
- *              namelen - name length
- * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Thursday, August 12, 1999
+ *  Thursday, August 12, 1999
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5adelete_c (hid_t_f *obj_id, _fcd name, size_t_f *namelen)
-/******/
+h5acreate_c(hid_t_f *obj_id, _fcd name, size_t_f *namelen, hid_t_f *type_id,
+    hid_t_f *space_id, hid_t_f *crt_prp, hid_t_f *aapl, hid_t_f *attr_id)
+/*******/
 {
     char *c_name = NULL;        /* Buffer to hold C string */
     int_f ret_value = 0;        /* Return value */
@@ -969,147 +58,85 @@ nh5adelete_c (hid_t_f *obj_id, _fcd name, size_t_f *namelen)
      /*
       * Convert FORTRAN name to C name
       */
-     if((c_name = HD5f2cstring(name, (size_t)*namelen)) == NULL)
+    if(NULL == (c_name = HD5f2cstring(name, (size_t)*namelen)))
         HGOTO_DONE(FAIL);
 
      /*
-      * Call H5Adelete function.
+      * Call H5Acreate2 function.
       */
-     if(H5Adelete((hid_t)*obj_id, c_name) < 0)
-         HGOTO_DONE(FAIL);
+    if((*attr_id = (hid_t_f)H5Acreate2((hid_t)*obj_id, c_name, (hid_t)*type_id, (hid_t)*space_id, (hid_t)*crt_prp, (hid_t)*aapl)) < 0)
+        HGOTO_DONE(FAIL);
 
 done:
     if(c_name)
         HDfree(c_name);
-
     return ret_value;
 }
 
-
-/****if* H5Af/h5aopen_idx_c
+/****if* H5Af/h5adelete_c
  * NAME
- *        h5aopen_idx_c
+ *  h5adelete_c
  * PURPOSE
- *     Call H5Aopen_by_idx to open an attribute
+ *  Call H5Adelete to delete an attribute
  * INPUTS
- *      obj_id - object identifier
- *              idx    - attribute index ( zero based)
- * OUTPUTS
- *     attr_id - attribute identifier
+ *  obj_id - object identifier
+ *  name - name of the attribute
+ *  namelen - name length
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Thursday, August 12, 1999
+ *  Thursday, August 12, 1999
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5aopen_idx_c (hid_t_f *obj_id, int_f *idx, hid_t_f *attr_id)
+h5adelete_c (hid_t_f *obj_id, _fcd name, size_t_f *namelen)
 /******/
 {
-    int_f ret_value = 0;          /* Return value */
+    char *c_name = NULL;        /* Buffer to hold C string */
+    int_f ret_value = 0;        /* Return value */
 
      /*
-      * Call H5Aopen_by_idx function.
+      * Convert FORTRAN name to C name
       */
-     if((*attr_id = (hid_t_f)H5Aopen_by_idx((hid_t)*obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)*idx, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+     if((c_name = HD5f2cstring(name, (size_t)*namelen)) == NULL)
         HGOTO_DONE(FAIL);
 
-done:
-     return ret_value;
-}
-
-
-/****if* H5Af/h5aget_space_c
- * NAME
- *        h5aget_space_c
- * PURPOSE
- *     Call H5Aget_space to get attribute's dataspace
- * INPUTS
- *      attr_id - attribute identifier
- * OUTPUTS
- *     space_id - dataspace identifier
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              Thursday, August 12, 1999
- * HISTORY
- *
- * SOURCE
-*/
-int_f
-nh5aget_space_c (hid_t_f *attr_id, hid_t_f *space_id)
-/******/
-{
-    int_f ret_value=0;          /* Return value */
-
      /*
-      * Call H5Aget_space function.
+      * Call H5Adelete function.
       */
-     if ((*space_id = (hid_t_f)H5Aget_space((hid_t)*attr_id)) < 0)
+     if(H5Adelete((hid_t)*obj_id, c_name) < 0)
          HGOTO_DONE(FAIL);
 
 done:
-     return ret_value;
-}
-
-/****if* H5Af/h5aget_type_c
- * NAME
- *        h5aget_type_c
- * PURPOSE
- *     Call H5Aget_space to get attribute's datatype
- * INPUTS
- *      attr_id - attribute identifier
- * OUTPUTS
- *     type_id - datatype identifier
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              Thursday, August 12, 1999
- * HISTORY
- *
- * SOURCE
-*/
-int_f
-nh5aget_type_c (hid_t_f *attr_id, hid_t_f *type_id)
-/******/
-{
-    int_f ret_value=0;          /* Return value */
-
-     /*
-      * Call H5Aget_type function.
-      */
-     if ((*type_id = (hid_t_f)H5Aget_type((hid_t)*attr_id)) < 0)
-         HGOTO_DONE(FAIL);
+    if(c_name)
+        HDfree(c_name);
 
-done:
-     return ret_value;
+    return ret_value;
 }
 
 /****if* H5Af/h5aget_num_attrs_c
  * NAME
- *        h5aget_num_attrs_c
+ *  h5aget_num_attrs_c
  * PURPOSE
- *     Call H5Oget_info to determine number of
- *              attributes of an object
+ *  Call H5Oget_info to determine number of
+ *  attributes of an object
  * INPUTS
- *      obj_id - object identifier
- *              attr_num - number of attributes
+ *  obj_id - object identifier
+ *  attr_num - number of attributes
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Thursday, August 12, 1999
+ *  Thursday, August 12, 1999
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5aget_num_attrs_c (hid_t_f *obj_id, int_f *attr_num)
+h5aget_num_attrs_c (hid_t_f *obj_id, int_f *attr_num)
 /******/
 {
     H5O_info_t oinfo;           /* Object info */
@@ -1130,25 +157,25 @@ done:
 
 /****if* H5Af/h5aget_name_c
  * NAME
- *        h5aget_name_c
+ *  h5aget_name_c
  * PURPOSE
- *     Call H5Aget_name to get attribute's name
+ *  Call H5Aget_name to get attribute's name
  * INPUTS
- *      attr_id - attribute identifier
- *              bufsize - size of the buffer
+ *  attr_id - attribute identifier
+ *  bufsize - size of the buffer
  * OUTPUTS
- *     buf - buffer to hold the name
+ *  buf - buffer to hold the name
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Thursday, August 12, 1999
+ *  Thursday, August 12, 1999
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5aget_name_c(hid_t_f *attr_id, size_t_f *bufsize, _fcd buf)
+h5aget_name_c(hid_t_f *attr_id, size_t_f *bufsize, _fcd buf)
 /******/
 {
   size_t c_bufsize;
@@ -1179,99 +206,36 @@ done:
   return ret_value;
 }
 
-/****if* H5Af/h5aget_storage_size_c
- * NAME
- *        h5aget_storage_size_c
- * PURPOSE
- *     Call H5Aget_storage_size
- * INPUTS
- *      attr_id - identifier of an attribute
- * OUTPUTS
- *     size    - attributes storage requirements
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  M. Scot Breitenfeld
- *              January, 2008
- * HISTORY
- * N/A
- * SOURCE
-*/
-
-int_f
-nh5aget_storage_size_c ( hid_t_f *attr_id,  hsize_t_f *size)
-/******/
-{
-    int_f ret_value=0;          /* Return value */
-
-    if ((*size = (hsize_t_f)H5Aget_storage_size((hid_t)*attr_id)) < 0)
-        HGOTO_DONE(FAIL);
-
-done:
-    return ret_value;
-}
-
-/****if* H5Af/h5aget_create_plist_c
- * NAME
- *        h5aget_create_plist_c
- * PURPOSE
- *     Call H5Aget_create_plist
- * INPUTS
- *      attr_id - identifier of an attribute
- * OUTPUTS
- *     creation_prop_id - Identifier for the attribute’s creation property
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  M. Scot Breitenfeld
- *              January, 2008
- * HISTORY
- * N/A
- * SOURCE
-*/
-
-int_f
-nh5aget_create_plist_c ( hid_t_f *attr_id,  hid_t_f *creation_prop_id)
-/******/
-{
-    int_f ret_value=0;          /* Return value */
-
-    if ((*creation_prop_id = (hid_t_f)H5Aget_create_plist((hid_t)*attr_id)) < 0)
-        HGOTO_DONE(FAIL);
-
-done:
-    return ret_value;
-}
 
 /****if* H5Af/h5arename_by_name_c
  * NAME
- *      h5arename_by_name_c
+ *  h5arename_by_name_c
  * PURPOSE
- *   Calls H5Arename_by_name
+ *  Calls H5Arename_by_name
  * INPUTS
- *    loc_id        - Object identifier
- *            obj_name      - Name of object, relative to location,
- *                             whose attribute is to be renamed
- *            obj_name_len      - Object name length
- *            old_attr_name     - Prior attribute name
- *            old_attr_name_len - Prior attribute name length
- *            new_attr_name     - New attribute name
- *            new_attr_name_len - New attribute name length
- *            lapl_id       - Link access property list identifier
+ *  loc_id        - Object identifier
+ *  obj_name      - Name of object, relative to location,
+ *  whose attribute is to be renamed
+ *  obj_name_len      - Object name length
+ *  old_attr_name     - Prior attribute name
+ *  old_attr_name_len - Prior attribute name length
+ *  new_attr_name     - New attribute name
+ *  new_attr_name_len - New attribute name length
+ *  lapl_id       - Link access property list identifier
  * OUTPUTS
  *     N/A
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              January, 2008
+ *  January, 2008
  * HISTORY
  * N/A
  * SOURCE
 */
 
 int_f
-nh5arename_by_name_c( hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
+h5arename_by_name_c( hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
 		      _fcd old_attr_name, size_t_f *old_attr_namelen,
 		      _fcd new_attr_name, size_t_f *new_attr_namelen,
 		      hid_t_f *lapl_id )
@@ -1306,27 +270,27 @@ done:
 
 /****if* H5Af/h5aopen_c
  * NAME
- *        h5aopen_c
+ *  h5aopen_c
  * PURPOSE
- *     Call H5Aopen to open an attribute
+ *  Call H5Aopen to open an attribute
  * INPUTS
- *      obj_id       - Identifer for object to which attribute is attached
+ *  obj_id       - Identifer for object to which attribute is attached
  *	        attr_name    - Attribute access property list
- *              attr_namelen - size of attr_name
- *              aapl_id      - Link access property list
+ *  attr_namelen - size of attr_name
+ *  aapl_id      - Link access property list
  * OUTPUTS
- *     attr_id - dataset identifier
+ *  attr_id - dataset identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              January, 2008
+ *  January, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5aopen_c (hid_t_f *obj_id, _fcd attr_name, size_t_f *attr_namelen, hid_t_f *aapl_id, hid_t_f *attr_id)
+h5aopen_c (hid_t_f *obj_id, _fcd attr_name, size_t_f *attr_namelen, hid_t_f *aapl_id, hid_t_f *attr_id)
 /******/
 {
     char *c_attr_name = NULL;          /* Buffer to hold C string */
@@ -1351,30 +315,30 @@ done:
 }
 /****if* H5Af/h5adelete_by_name_c
  * NAME
- *        h5adelete_by_name_c
+ *  h5adelete_by_name_c
  * PURPOSE
- *     Call h5adelete_by_name to remove an attribute from a specified location
+ *  Call h5adelete_by_name to remove an attribute from a specified location
  * INPUTS
- *      loc_id - identifer for object to which attribute is attached
- *              obj_name - object identifier
- *              obj_namelen - name length
- *              attr_name - name of the attribute
- *              attr_namelen - name length
- *              lapl_id - link access property list
+ *  loc_id - identifer for object to which attribute is attached
+ *  obj_name - object identifier
+ *  obj_namelen - name length
+ *  attr_name - name of the attribute
+ *  attr_namelen - name length
+ *  lapl_id - link access property list
  *
  * OUTPUTS
  *     N/A
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              January, 2008
+ *  January, 2008
  * HISTORY
  * N/A
  * SOURCE
 */
 int_f
-nh5adelete_by_name_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, _fcd attr_name, size_t_f *attr_namelen, hid_t_f *lapl_id)
+h5adelete_by_name_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, _fcd attr_name, size_t_f *attr_namelen, hid_t_f *lapl_id)
 /******/
 {
     char *c_obj_name = NULL;          /* Buffer to hold C string */
@@ -1404,30 +368,30 @@ done:
 }
 /****if* H5Af/h5adelete_by_idx_c
  * NAME
- *        h5adelete_by_idx_c
+ *  h5adelete_by_idx_c
  * PURPOSE
- *     Call h5adelete_by_idx
+ *  Call h5adelete_by_idx
  * INPUTS
- *      loc_id - Location or object identifier; may be dataset or group
- *              obj_name - object identifier
- *              obj_namelen - name length
- *              attr_name - name of the attribute
- *              attr_namelen - name length
- *              lapl_id - link access property list
+ *  loc_id - Location or object identifier; may be dataset or group
+ *  obj_name - object identifier
+ *  obj_namelen - name length
+ *  attr_name - name of the attribute
+ *  attr_namelen - name length
+ *  lapl_id - link access property list
  *
  * OUTPUTS
  *     N/A
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              January, 2008
+ *  January, 2008
  * HISTORY
  * N/A
  * SOURCE
 */
 int_f
-nh5adelete_by_idx_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
+h5adelete_by_idx_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
 		     int_f *idx_type, int_f *order, hsize_t_f *n, hid_t_f *lapl_id)
 /******/
 {
@@ -1454,50 +418,50 @@ done:
 }
 /****if* H5Af/h5aget_name_by_idx_c
  * NAME
- *        h5aget_name_by_idx_c
+ *  h5aget_name_by_idx_c
  * PURPOSE
- *     Call h5aget_name_by_idx
+ *  Call h5aget_name_by_idx
  * INPUTS
  *
  *
- *        loc_id - Identifer for object to which attribute is attached
- *      obj_name - Name of object, relative to location,
- *                  from which attribute is to be removed *TEST* check NULL
- *      idx_type - Type of index; Possible values are:
+ *  loc_id - Identifer for object to which attribute is attached
+ *  obj_name - Name of object, relative to location,
+ *  from which attribute is to be removed *TEST* check NULL
+ *  idx_type - Type of index; Possible values are:
  *                         H5_INDEX_UNKNOWN   - Unknown index type
  *                         H5_INDEX_NAME      - Index on names
  *                         H5_INDEX_CRT_ORDER - Index on creation order
  *                         H5_INDEX_N	      - Number of indices defined
  *
- *      order    - Order in which to iterate over index; Possible values are:
+ *  order    - Order in which to iterate over index; Possible values are:
  *                          H5_ITER_UNKNOWN  - Unknown order
  *                          H5_ITER_INC      - Increasing order
  *                          H5_ITER_DEC      - Decreasing order
  *                          H5_ITER_NATIVE   - No particular order, whatever is fastest
  *                          H5_ITER_N	     - Number of iteration orders
  *
- *            n  - Attribute’s position in index
- *      attr_id  - Attribute identifier
- *         size  - Buffer size ! *TEST* check for 0 value *CHECK* should this return the correct value
+ *  n  - Attribute’s position in index
+ *  attr_id  - Attribute identifier
+ *  size  - Buffer size ! *TEST* check for 0 value *CHECK* should this return the correct value
  *
- *     lapl_id   - Link access property list
- *      hdferr   - Error code:
- *                            Returns attribute name size, -1 if fail
+ *  lapl_id   - Link access property list
+ *  hdferr   - Error code:
+ *  Returns attribute name size, -1 if fail
  *
  * OUTPUTS
- *     name - Attribute name
+ *  name - Attribute name
  *
  * RETURNS
- *     Size of buffer on success, -1 on failure
+ *  Size of buffer on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              January, 2008
+ *  January, 2008
  * HISTORY
  * N/A
  * SOURCE
 */
 int_f
-nh5aget_name_by_idx_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
+h5aget_name_by_idx_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
 		       int_f *idx_type, int_f *order, hsize_t_f *n, _fcd name,
 		       size_t_f *size, hid_t_f *lapl_id)
 /******/
@@ -1545,42 +509,42 @@ done:
 
 /****if* H5Af/h5aopen_by_idx_c
  * NAME
- *        h5aopen_by_idx_c
+ *  h5aopen_by_idx_c
  * PURPOSE
- *     Call H5Aopen_by_idx
+ *  Call H5Aopen_by_idx
  * INPUTS
- *   loc_id    - Object identifier
- *            obj_name - Name of object to which attribute is attached
- *         obj_namelen - name length
- *            idx_type - Type of index; Possible values are:
+ *  loc_id    - Object identifier
+ *  obj_name - Name of object to which attribute is attached
+ *  obj_namelen - name length
+ *  idx_type - Type of index; Possible values are:
  *                         H5_INDEX_UNKNOWN   - Unknown index type
  *                         H5_INDEX_NAME      - Index on names
  *                         H5_INDEX_CRT_ORDER - Index on creation order
  *                         H5_INDEX_N	      - Number of indices defined
  *
- *               order - Order in which to iterate over index; Possible values are:
+ *  order - Order in which to iterate over index; Possible values are:
  *                          H5_ITER_UNKNOWN  - Unknown order
  *                          H5_ITER_INC      - Increasing order
  *                          H5_ITER_DEC      - Decreasing order
  *                          H5_ITER_NATIVE   - No particular order, whatever is fastest
  *                          H5_ITER_N	     - Number of iteration orders
  *
- *                   n - Attribute’s position in index
- *             aapl_id - Attribute access property list
- *             lapl_id - Link access property list
+ *  n - Attribute’s position in index
+ *  aapl_id - Attribute access property list
+ *  lapl_id - Link access property list
  * OUTPUTS
- *    attr_id - attribute identifer
+ *  attr_id - attribute identifer
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              January, 2008
+ *  January, 2008
  * HISTORY
  * N/A
  * SOURCE
 */
 int_f
-nh5aopen_by_idx_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
+h5aopen_by_idx_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
 		   int_f *idx_type, int_f *order, hsize_t_f *n, hid_t_f *aapl_id, hid_t_f *lapl_id, hid_t_f *attr_id )
 /******/
 {
@@ -1608,29 +572,29 @@ done:
 
 /****if* H5Af/h5aget_info_c
  * NAME
- *        h5aget_info_c
+ *  h5aget_info_c
  * PURPOSE
- *     Call H5Aget_info
+ *  Call H5Aget_info
  * INPUTS
- *     loc_id  - Object identifier
+ *  loc_id  - Object identifier
  * OUTPUTS
  *
- *        corder_valid - Indicates whether the the creation order data is valid for this attribute
- *              corder - Is a positive integer containing the creation order of the attribute
- *                cset - Indicates the character set used for the attribute’s name
- *           data_size - indicates the size, in the number of characters, of the attribute
+ *  corder_valid - Indicates whether the the creation order data is valid for this attribute
+ *  corder - Is a positive integer containing the creation order of the attribute
+ *  cset - Indicates the character set used for the attribute’s name
+ *  data_size - indicates the size, in the number of characters, of the attribute
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              January, 2008
+ *  January, 2008
  * HISTORY
  * N/A
  * SOURCE
 */
 int_f
-nh5aget_info_c (hid_t_f *loc_id, int_f *corder_valid, int_f *corder,
+h5aget_info_c (hid_t_f *loc_id, int_f *corder_valid, int_f *corder,
 		int_f *cset, hsize_t_f *data_size )
 /******/
 {
@@ -1660,46 +624,46 @@ done:
 
 /****if* H5Af/h5aget_info_by_idx_c
  * NAME
- *        h5aget_info_by_idx_c
+ *  h5aget_info_by_idx_c
  * PURPOSE
- *     Call  H5Aget_info_by_idx
+ *  Call  H5Aget_info_by_idx
  * INPUTS
- *    loc_id  - Object identifier
- *            obj_name - Name of object to which attribute is attached
- *         obj_namelen - name length
- *            idx_type - Type of index; Possible values are:
+ *  loc_id  - Object identifier
+ *  obj_name - Name of object to which attribute is attached
+ *  obj_namelen - name length
+ *  idx_type - Type of index; Possible values are:
  *                         H5_INDEX_UNKNOWN   - Unknown index type
  *                         H5_INDEX_NAME      - Index on names
  *                         H5_INDEX_CRT_ORDER - Index on creation order
  *                         H5_INDEX_N	      - Number of indices defined
  *
- *               order - Order in which to iterate over index; Possible values are:
+ *  order - Order in which to iterate over index; Possible values are:
  *                          H5_ITER_UNKNOWN  - Unknown order
  *                          H5_ITER_INC      - Increasing order
  *                          H5_ITER_DEC      - Decreasing order
  *                          H5_ITER_NATIVE   - No particular order, whatever is fastest
  *                          H5_ITER_N	     - Number of iteration orders
  *
- *                   n - Attribute’s position in index
- *             lapl_id - Link access property list
+ *  n - Attribute’s position in index
+ *  lapl_id - Link access property list
  * OUTPUTS
  *
- *        corder_valid - Indicates whether the the creation order data is valid for this attribute
- *              corder - Is a positive integer containing the creation order of the attribute
- *                cset - Indicates the character set used for the attribute’s name
- *           data_size - indicates the size, in the number of characters, of the attribute
+ *  corder_valid - Indicates whether the the creation order data is valid for this attribute
+ *  corder - Is a positive integer containing the creation order of the attribute
+ *  cset - Indicates the character set used for the attribute’s name
+ *  data_size - indicates the size, in the number of characters, of the attribute
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              January, 2008
+ *  January, 2008
  * HISTORY
  * N/A
  * SOURCE
 */
 int_f
-nh5aget_info_by_idx_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
+h5aget_info_by_idx_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
 		int_f *idx_type, int_f *order, hsize_t_f *n, hid_t_f *lapl_id,
 		int_f *corder_valid, int_f *corder,
 		int_f *cset, hsize_t_f *data_size )
@@ -1739,34 +703,34 @@ done:
 
 /****if* H5Af/h5aget_info_by_name_c
  * NAME
- *        h5aget_info_by_name_c
+ *  h5aget_info_by_name_c
  * PURPOSE
- *     Call  H5Aget_info_by_name
+ *  Call  H5Aget_info_by_name
  * INPUTS
- *      loc_id - Object identifier
- *            obj_name - Name of object to which attribute is attached
- *         obj_namelen - name length
- *           attr_name - Attribute name
- *        attr_namelen - attribute name length
- *             lapl_id - Link access property list
+ *  loc_id - Object identifier
+ *  obj_name - Name of object to which attribute is attached
+ *  obj_namelen - name length
+ *  attr_name - Attribute name
+ *  attr_namelen - attribute name length
+ *  lapl_id - Link access property list
  * OUTPUTS
  *
- *        corder_valid - Indicates whether the the creation order data is valid for this attribute
- *              corder - Is a positive integer containing the creation order of the attribute
- *                cset - Indicates the character set used for the attribute’s name
- *           data_size - indicates the size, in the number of characters, of the attribute
+ *  corder_valid - Indicates whether the the creation order data is valid for this attribute
+ *  corder - Is a positive integer containing the creation order of the attribute
+ *  cset - Indicates the character set used for the attribute’s name
+ *  data_size - indicates the size, in the number of characters, of the attribute
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              January, 2008
+ *  January, 2008
  * HISTORY
  * N/A
  * SOURCE
 */
 int_f
-nh5aget_info_by_name_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
+h5aget_info_by_name_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
 			_fcd attr_name, size_t_f *attr_namelen, hid_t_f *lapl_id,
 			int_f *corder_valid, int_f *corder,
 			int_f *cset, hsize_t_f *data_size )
@@ -1810,38 +774,38 @@ done:
 
 /****if* H5Af/h5acreate_by_name_c
  * NAME
- *        h5acreate_by_name_c
+ *  h5acreate_by_name_c
  * PURPOSE
- *     Call h5acreate_by_name
+ *  Call h5acreate_by_name
 
  * INPUTS
  *
- *         loc_id  - Object identifier
- *        obj_name - Name of object to which attribute is attached
- *     obj_namelen - name length
- *       attr_name - Attribute name
- *    attr_namelen - attribute name length
- *         type_id - Attribute datatype identifier
- *       space_id  - Attribute dataspace identifier
- *         acpl_id - Attribute creation property list identifier (Currently not used.)
- *         aapl_id - Attribute access property list identifier (Currently not used.)
- *         lapl_id - Link access property list
+ *  loc_id  - Object identifier
+ *  obj_name - Name of object to which attribute is attached
+ *  obj_namelen - name length
+ *  attr_name - Attribute name
+ *  attr_namelen - attribute name length
+ *  type_id - Attribute datatype identifier
+ *  space_id  - Attribute dataspace identifier
+ *  acpl_id - Attribute creation property list identifier (Currently not used.)
+ *  aapl_id - Attribute access property list identifier (Currently not used.)
+ *  lapl_id - Link access property list
  *
  * OUTPUTS
  *
- *            attr - an attribute identifier
+ *  attr - an attribute identifier
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              February, 2008
+ *  February, 2008
  * HISTORY
  * N/A
  * SOURCE
 */
 int_f
-nh5acreate_by_name_c(hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
+h5acreate_by_name_c(hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
 		     _fcd attr_name, size_t_f *attr_namelen,  hid_t_f *type_id,
 		     hid_t_f *space_id, hid_t_f *acpl_id, hid_t_f *aapl_id,
 		     hid_t_f *lapl_id, hid_t_f *attr_id )
@@ -1876,27 +840,27 @@ done:
 
 /****if* H5Af/h5aexists_c
  * NAME
- *        h5aexists_c
+ *  h5aexists_c
  * PURPOSE
  *     CAll h5aexists
  * INPUTS
  *
- *             obj_id - Object identifier
- *          attr_name - Attribute name
+ *  obj_id - Object identifier
+ *  attr_name - Attribute name
  * OUTPUTS
  *
- *     attr_exists_c  - returns a positive value, for TRUE, or 0 (zero), for FALSE.
+ *  attr_exists_c  - returns a positive value, for TRUE, or 0 (zero), for FALSE.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              February, 2008
+ *  February, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5aexists_c (hid_t_f *obj_id, _fcd name, size_t_f *namelen, hid_t_f *attr_exists)
+h5aexists_c (hid_t_f *obj_id, _fcd name, size_t_f *namelen, hid_t_f *attr_exists)
 /******/
 {
   char *c_name = NULL;          /* Buffer to hold C string */
@@ -1922,29 +886,29 @@ done:
 
 /****if* H5Af/h5aexists_by_name_c
  * NAME
- *        h5aexists_by_name_c
+ *  h5aexists_by_name_c
  * PURPOSE
  *     CAll H5Aexists_by_name
  * INPUTS
  *
- *     loc_id - Location identifier
- *   obj_name - Object name either relative to loc_id, absolute from the file’s root group, or '.' (a dot)
+ *  loc_id - Location identifier
+ *  obj_name - Object name either relative to loc_id, absolute from the file’s root group, or '.' (a dot)
  *  attr_name - Attribute name
- *    lapl_id - Link access property list identifier
+ *  lapl_id - Link access property list identifier
  * OUTPUTS
  *
- *     attr_exists_c  - returns a positive value, for TRUE, or 0 (zero), for FALSE.
+ *  attr_exists_c  - returns a positive value, for TRUE, or 0 (zero), for FALSE.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              February, 2008
+ *  February, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5aexists_by_name_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, _fcd attr_name, size_t_f *attr_namelen,
+h5aexists_by_name_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, _fcd attr_name, size_t_f *attr_namelen,
 		      hid_t_f *lapl_id, int_f *attr_exists)
 /******/
 {
@@ -1976,30 +940,30 @@ done:
 
 /****if* H5Af/h5aopen_by_name_c
  * NAME
- *        h5aopen_by_name_c
+ *  h5aopen_by_name_c
  * PURPOSE
- *     Call H5Aopen_by_name
+ *  Call H5Aopen_by_name
  * INPUTS
  *
- *     loc_id - Location identifier
- *   obj_name - Object name either relative to loc_id, absolute from the file’s root group, or '.' (a dot)
+ *  loc_id - Location identifier
+ *  obj_name - Object name either relative to loc_id, absolute from the file’s root group, or '.' (a dot)
  *  attr_name - Attribute name
- *    aapl_id - Attribute access property list (Currently unused; should be passed in as H5P_DEFAULT.)
- *    lapl_id - Link access property list identifier
+ *  aapl_id - Attribute access property list (Currently unused; should be passed in as H5P_DEFAULT.)
+ *  lapl_id - Link access property list identifier
  * OUTPUTS
  *
- *     attr_id  - attribute identifier
+ *  attr_id  - attribute identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              February, 2008
+ *  February, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5aopen_by_name_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, _fcd attr_name, size_t_f *attr_namelen,
+h5aopen_by_name_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, _fcd attr_name, size_t_f *attr_namelen,
 		    hid_t_f *aapl_id, hid_t_f *lapl_id, hid_t_f *attr_id)
 /******/
 {
@@ -2031,29 +995,29 @@ nh5aopen_by_name_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, _fcd
 
 /****if* H5Af/h5arename_c
  * NAME
- *      h5arename_c
+ *  h5arename_c
  * PURPOSE
- *   Calls H5Arename
+ *  Calls H5Arename
  * INPUTS
- *    loc_id            - Object identifier
- *            old_attr_name     - Prior attribute name
- *            old_attr_name_len - Prior attribute name length
- *            new_attr_name     - New attribute name
- *            new_attr_name_len - New attribute name length
+ *  loc_id            - Object identifier
+ *  old_attr_name     - Prior attribute name
+ *  old_attr_name_len - Prior attribute name length
+ *  new_attr_name     - New attribute name
+ *  new_attr_name_len - New attribute name length
  * OUTPUTS
  *     N/A
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              January, 2008
+ *  January, 2008
  * HISTORY
  * N/A
  * SOURCE
 */
 
 int_f
-nh5arename_c( hid_t_f *loc_id,
+h5arename_c( hid_t_f *loc_id,
 		      _fcd old_attr_name, size_t_f *old_attr_namelen,
 		      _fcd new_attr_name, size_t_f *new_attr_namelen)
 /******/
diff --git a/fortran/src/H5Aff.F90 b/fortran/src/H5Aff.F90
new file mode 100644
index 0000000..132bf41
--- /dev/null
+++ b/fortran/src/H5Aff.F90
@@ -0,0 +1,1873 @@
+!****h* ROBODoc/H5A
+!
+! NAME
+!  MODULE H5A
+!
+! PURPOSE
+!  This file contains Fortran interfaces for H5A functions. It includes
+!  all the functions that are independent on whether the Fortran 2003 functions
+!  are enabled or disabled.
+!
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! NOTES
+!
+!  (A) C_LOC and character strings according to the Fortran 2003 standard:
+!
+!  15.1.2.5 C_LOC(X)
+!
+!  Argument. X shall either
+!
+!  (1) have interoperable type and type parameters and be
+!    (a) a variable that has the TARGET attribute and is interoperable,
+!    (b) an allocated allocatable variable that has the TARGET attribute
+!        and is not an array of zero size, or
+!    (c) an associated scalar pointer, or
+!  (2) be a nonpolymorphic scalar, have no length type parameters, and be
+!    (a) a nonallocatable, nonpointer variable that has the TARGET attribute,
+!    (b) an allocated allocatable variable that has the TARGET attribute, or
+!    (c) an associated pointer.
+!
+!  - When X is a character, for interoperability the standard is:
+!
+!  15.2.1 Interoperability of intrinsic types
+!
+!  ...if the type is character, interoperability also requires that the length type parameter
+!  be omitted or be specified by an initialization expression whose value is one.
+!
+!  THEREFORE compilers that have not extended the standard  require
+!
+!  CHARACTER(LEN=1), TARGET :: chr
+!  or
+!  CHARACTER, TARGET :: chr
+!
+!  (B)
+!       _____ __  __ _____   ____  _____ _______       _   _ _______
+!      |_   _|  \/  |  __ \ / __ \|  __ \__   __|/\   | \ | |__   __|
+! ****   | | | \  / | |__) | |  | | |__) | | |  /  \  |  \| |  | |    ****
+! ****   | | | |\/| |  ___/| |  | |  _  /  | | / /\ \ | . ` |  | |    ****
+! ****  _| |_| |  | | |    | |__| | | \ \  | |/ ____ \| |\  |  | |    ****
+!      |_____|_|  |_|_|     \____/|_|  \_\ |_/_/    \_\_| \_|  |_|
+!
+!  If you add a new H5A function you must add the function name to the
+!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
+!  This is needed for Windows based operating systems.
+!
+!*****
+
+#include <H5config_f.inc>
+
+MODULE H5A
+
+  USE, INTRINSIC :: ISO_C_BINDING
+
+  USE H5GLOBAL
+
+  INTERFACE h5awrite_f
+     MODULE PROCEDURE h5awrite_char_scalar
+     ! This is the preferred way to call h5awrite
+     ! by passing an address
+     MODULE PROCEDURE h5awrite_ptr
+  END INTERFACE
+
+  INTERFACE h5aread_f
+     MODULE PROCEDURE h5aread_char_scalar
+     ! This is the preferred way to call h5aread
+     ! by passing an address
+     MODULE PROCEDURE h5aread_ptr
+  END INTERFACE
+
+!  Interface for the function used to pass the C pointer of the buffer
+!  to the C H5Awrite routine
+  INTERFACE
+     INTEGER FUNCTION h5awrite_f_c(attr_id, mem_type_id, buf) BIND(C, NAME='h5awrite_f_c')
+       IMPORT :: c_ptr
+       IMPORT :: HID_T
+       IMPLICIT NONE
+       INTEGER(HID_T), INTENT(IN) :: attr_id
+       INTEGER(HID_T), INTENT(IN) :: mem_type_id
+       TYPE(C_PTR), VALUE :: buf
+     END FUNCTION h5awrite_f_c
+  END INTERFACE
+
+!  Interface for the function used to pass the C pointer of the buffer
+!  to the C H5Aread routine
+  INTERFACE
+     INTEGER FUNCTION h5aread_f_c(attr_id, mem_type_id, buf) BIND(C, NAME='h5aread_f_c')
+       IMPORT :: c_ptr
+       IMPORT :: HID_T
+       IMPLICIT NONE
+       INTEGER(HID_T), INTENT(IN) :: attr_id
+       INTEGER(HID_T), INTENT(IN) :: mem_type_id
+       TYPE(C_PTR), VALUE :: buf
+     END FUNCTION h5aread_f_c
+  END INTERFACE
+
+CONTAINS
+
+!
+!****s* H5A/h5acreate_f
+!
+! NAME
+!  h5acreate_f
+!
+! PURPOSE
+!  Creates a dataset as an attribute of a group, dataset, or named datatype
+!
+! INPUTS
+!  loc_id 	 - identifier of an object (group, dataset,
+!                  or named datatype) attribute is attached to
+!  name 	 - attribute name
+!  type_id 	 - attribute datatype identifier
+!  space_id 	 - attribute dataspace identifier
+!
+! OUTPUTS
+!  attr_id 	 - attribute identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  acpl_id 	 - Attribute creation property list identifier
+!  appl_id 	 - Attribute access property list identifier
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces are added for
+!  called C functions (it is needed for Windows
+!  port).  February 27, 2001
+!
+!
+! SOURCE
+  SUBROUTINE h5acreate_f(loc_id, name, type_id, space_id, attr_id, &
+       hdferr, acpl_id, aapl_id )
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id   ! Object identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Attribute name
+    INTEGER(HID_T), INTENT(IN) :: type_id  ! Attribute datatype identifier
+    INTEGER(HID_T), INTENT(IN) :: space_id ! Attribute dataspace identifier
+    INTEGER(HID_T), INTENT(OUT) :: attr_id ! Attribute identifier
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code:
+                                           ! 0 on success and -1 on failure
+!*****
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: acpl_id ! Attribute creation property list identifier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: aapl_id ! Attribute access property list identifier
+
+    INTEGER(HID_T) :: acpl_id_default
+    INTEGER(HID_T) :: aapl_id_default
+    CHARACTER(LEN=LEN_TRIM(name)+1,KIND=C_CHAR) :: c_name
+    INTERFACE
+       INTEGER(HID_T) FUNCTION H5Acreate2(loc_id, name, type_id, &
+            space_id, acpl_id_default, aapl_id_default) BIND(C,NAME='H5Acreate2')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN), VALUE :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER(HID_T), INTENT(IN), VALUE :: type_id
+         INTEGER(HID_T), INTENT(IN), VALUE :: space_id
+         INTEGER(HID_T), INTENT(IN), VALUE :: acpl_id_default
+         INTEGER(HID_T), INTENT(IN), VALUE :: aapl_id_default
+       END FUNCTION H5Acreate2
+    END INTERFACE
+
+    acpl_id_default = H5P_DEFAULT_F
+    aapl_id_default = H5P_DEFAULT_F
+    IF (PRESENT(acpl_id)) acpl_id_default = acpl_id
+    IF (PRESENT(aapl_id)) aapl_id_default = aapl_id
+
+    c_name = TRIM(name)//C_NULL_CHAR
+    attr_id = h5acreate2(loc_id, c_name, type_id, space_id, &
+         acpl_id_default, aapl_id_default)
+
+    hdferr = 0
+    IF(attr_id.LT.0) hdferr = -1
+
+  END SUBROUTINE h5acreate_f
+
+!
+!****s* H5A/h5aopen_name_f
+!
+! NAME
+!  h5aopen_name_f
+!
+! PURPOSE
+!  Opens an attribute specified by name.
+!
+! INPUTS
+!  obj_id 	 - identifier of a group, dataset, or named
+!                  datatype atttribute to be attached to
+!  name 	 - attribute name
+! OUTPUTS
+!  attr_id 	 - attribute identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces are added for
+!  called C functions (it is needed for Windows
+!  port).  February 27, 2001
+!
+! SOURCE
+  SUBROUTINE H5Aopen_name_f(obj_id, name, attr_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: obj_id    ! Object identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name    ! Attribute name
+    INTEGER(HID_T), INTENT(OUT) :: attr_id  ! Attribute identifier
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+!*****
+    CHARACTER(LEN=LEN_TRIM(name)+1,KIND=C_CHAR) :: c_name
+
+! H5Aopen_name is deprecated
+    INTERFACE
+       INTEGER(HID_T) FUNCTION H5Aopen(obj_id, name, aapl_id) BIND(C,NAME='H5Aopen')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN), VALUE :: obj_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER(HID_T), INTENT(IN), VALUE :: aapl_id
+       END FUNCTION H5Aopen
+    END INTERFACE
+
+    c_name = TRIM(name)//C_NULL_CHAR
+    attr_id = H5Aopen(obj_id, c_name, H5P_DEFAULT_F)
+
+    hdferr = 0
+    IF(attr_id.LT.0) hdferr = -1
+
+  END SUBROUTINE H5Aopen_name_f
+!
+!****s* H5A/H5Aopen_idx_f
+!
+! NAME
+!  H5Aopen_idx_f
+!
+! PURPOSE
+!  Opens the attribute specified by its index.
+!
+! INPUTS
+!  obj_id 	 - identifier of a group, dataset, or named
+!                  datatype an attribute to be attached to
+!  index 	 - index of the attribute to open (zero-based)
+! OUTPUTS
+!  attr_id 	 - attribute identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces are added for
+!  called C functions (it is needed for Windows
+!  port).  February 27, 2001
+!
+! SOURCE
+  SUBROUTINE H5Aopen_idx_f(obj_id, index, attr_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: obj_id    ! Object identifier
+    INTEGER, INTENT(IN) :: index            ! Attribute index
+    INTEGER(HID_T), INTENT(OUT) :: attr_id  ! Attribute identifier
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+!*****
+!   H5Aopen_idx is deprecated in favor of the function H5Aopen_by_idx.
+    INTERFACE
+       INTEGER(HID_T) FUNCTION H5Aopen_by_idx(obj_id, index) BIND(C,NAME='H5Aopen_by_idx')
+         IMPORT :: HID_T
+         IMPORT :: C_INT
+         INTEGER(HID_T), INTENT(IN) :: obj_id
+         INTEGER(C_INT), INTENT(IN) :: index
+       END FUNCTION H5Aopen_by_idx
+    END INTERFACE
+
+    attr_id = H5Aopen_by_idx(obj_id, INT(index, C_INT))
+
+    hdferr = 0
+    IF(attr_id.LT.0) hdferr = -1
+
+  END SUBROUTINE H5Aopen_idx_f
+!
+!****s* H5A/H5Aget_space_f
+!
+! NAME
+!  H5Aget_space_f
+!
+! PURPOSE
+!  Gets a copy of the dataspace for an attribute.
+!
+! INPUTS
+!  attr_id 	 - attribute identifier
+!
+! OUTPUTS
+!  space_id 	 - attribite dataspace identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces are added for
+!  called C functions (it is needed for Windows
+!  port).  February 27, 2001
+!
+!
+! SOURCE
+  SUBROUTINE H5Aget_space_f(attr_id, space_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: attr_id   ! Attribute identifier
+    INTEGER(HID_T), INTENT(OUT) :: space_id ! Attribute dataspace identifier
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+!*****
+    INTERFACE
+       INTEGER(HID_T) FUNCTION H5Aget_space(attr_id) BIND(C,NAME='H5Aget_space')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN), VALUE :: attr_id
+       END FUNCTION H5Aget_space
+    END INTERFACE
+    
+    space_id = H5Aget_space(attr_id)
+
+    hdferr = 0
+    IF(space_id.LT.0) hdferr = -1
+
+  END SUBROUTINE H5Aget_space_f
+!
+!****s* H5A/H5Aget_type_f
+!
+! NAME
+!  H5Aget_type_f
+!
+! PURPOSE
+!  Gets an attribute datatype.
+!
+! INPUTS
+!  attr_id 	 - attribute identifier
+! OUTPUTS
+!  type_id 	 - attribute datatype identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces are added for
+!  called C functions (it is needed for Windows
+!  port).  February 27, 2001
+!
+! SOURCE
+  SUBROUTINE H5Aget_type_f(attr_id, type_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: attr_id  ! Attribute identifier
+    INTEGER(HID_T), INTENT(OUT) :: type_id ! Attribute datatype identifier
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!*****
+    INTERFACE
+       INTEGER(HID_T) FUNCTION H5Aget_type(attr_id) BIND(C,NAME='H5Aget_type')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN), VALUE :: attr_id
+       END FUNCTION H5Aget_type
+    END INTERFACE
+    
+    type_id = H5Aget_type(attr_id)
+
+    hdferr = 0
+    IF(type_id.LT.0) hdferr = -1
+
+  END SUBROUTINE H5Aget_type_f
+!
+!****s* H5A/H5Aget_name_f
+!
+! NAME
+!  H5Aget_name_f
+!
+! PURPOSE
+!  Gets an attribute name.
+!
+! INPUTS
+!  attr_id 	 - attribute identifier
+!  size 	 - size of a buffer to read name in
+! OUTPUTS
+!  buf 	         - buffer to read name in
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces are added for
+!  called C functions (it is needed for Windows
+!  port).  February 27, 2001
+!
+!
+! SOURCE
+  SUBROUTINE h5aget_name_f(attr_id, size, buf, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: attr_id  ! Attribute identifier
+    INTEGER(SIZE_T), INTENT(IN) :: size    ! Buffer size
+    CHARACTER(LEN=*), INTENT(INOUT) :: buf ! Buffer to hold attribute name
+    INTEGER, INTENT(OUT) :: hdferr ! Error code:
+                                   ! name length is successful, -1 if fail
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5aget_name_c(attr_id, size, buf) &
+            BIND(C,NAME='h5aget_name_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         INTEGER(HID_T), INTENT(IN) :: attr_id
+         INTEGER(SIZE_T), INTENT(IN) :: size
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: buf
+       END FUNCTION h5aget_name_c
+    END INTERFACE
+
+    hdferr = h5aget_name_c(attr_id, size, buf)
+  END SUBROUTINE h5aget_name_f
+!
+!****s* H5A/H5Aget_name_by_idx_f
+!
+! NAME
+!  H5Aget_name_by_idx_f
+!
+! PURPOSE
+!  Gets an attribute name, by attribute index position.
+!
+! INPUTS
+!  loc_id 	 - Location of object to which attribute is attached
+!  obj_name 	 - Name of object to which attribute is attached, relative to location
+!  idx_type 	 - Type of index; Possible values are:
+!                   H5_INDEX_UNKNOWN_F = -1  - Unknown index type
+!                   H5_INDEX_NAME_F 	     - Index on names
+!                   H5_INDEX_CRT_ORDER_F     - Index on creation order
+!                   H5_INDEX_N_F 	     - Number of indices defined
+!
+!  order 	 - Order in which to iterate over index; Possible values are:
+!                   H5_ITER_UNKNOWN_F 	 - Unknown order
+!                   H5_ITER_INC_F 	 - Increasing order
+!                   H5_ITER_DEC_F 	 - Decreasing order
+!                   H5_ITER_NATIVE_F 	 - No particular order, whatever is fastest
+!                   H5_ITER_N_F 	 - Number of iteration orders
+!  order 	 - Index traversal order
+!  n 	         - Attribute’s position in index
+!
+! OUTPUTS
+!  name 	 - Attribute name
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! OPTIONAL PARAMETERS
+!  lapl_id 	 - Link access property list
+!  size 	 - Size, in bytes, of attribute name
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  January, 2008
+!
+! SOURCE
+  SUBROUTINE h5aget_name_by_idx_f(loc_id, obj_name, idx_type, order, &
+       n, name, hdferr, size, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id      ! Identifer for object to which attribute is attached
+    CHARACTER(LEN=*), INTENT(IN) :: obj_name  ! Name of object, relative to location,
+                                              !  from which attribute is to be removed *TEST* check NULL
+    INTEGER, INTENT(IN) :: idx_type ! Type of index; Possible values are:
+                                    !    H5_INDEX_UNKNOWN_F   - Unknown index type
+                                    !    H5_INDEX_NAME_F       - Index on names
+                                    !    H5_INDEX_CRT_ORDER_F  - Index on creation order
+                                    !    H5_INDEX_N_F 	      - Number of indices defined
+
+    INTEGER, INTENT(IN) :: order    ! Order in which to iterate over index; Possible values are:
+                                    !    H5_ITER_UNKNOWN_F   - Unknown order
+                                    !    H5_ITER_INC_F      - Increasing order
+                                    !    H5_ITER_DEC_F       - Decreasing order
+                                    !    H5_ITER_NATIVE_F    - No particular order, whatever is fastest
+                                    !    H5_ITER_N_F 	    - Number of iteration orders
+    INTEGER(HSIZE_T), INTENT(IN) :: n !  Attribute’s position in index
+    CHARACTER(LEN=*), INTENT(OUT) :: name ! Attribute name
+    INTEGER, INTENT(OUT) :: hdferr    ! Error code:
+                                      ! Returns attribute name size,
+                                      ! -1 if fail
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list
+    INTEGER(SIZE_T), OPTIONAL, INTENT(OUT) :: size  ! Indicates the size, in the number of characters, 
+                                                    ! of the attribute
+!*****
+    INTEGER(HID_T) :: lapl_id_default
+    INTEGER(SIZE_T) :: obj_namelen
+    INTEGER(SIZE_T) :: size_default
+
+    INTERFACE
+       INTEGER FUNCTION h5aget_name_by_idx_c(loc_id, obj_name, obj_namelen, idx_type, order, &
+            n, name, size_default, lapl_id_default) BIND(C,NAME='h5aget_name_by_idx_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: obj_name
+         INTEGER, INTENT(IN) :: idx_type
+         INTEGER, INTENT(IN) :: order
+         INTEGER(HSIZE_T), INTENT(IN) :: n
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: name
+         INTEGER(SIZE_T) :: size_default
+         INTEGER(HID_T) :: lapl_id_default
+         INTEGER(SIZE_T) :: obj_namelen
+       END FUNCTION h5aget_name_by_idx_c
+    END INTERFACE
+
+    obj_namelen = LEN(obj_name)
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    size_default = LEN(name)
+
+    hdferr = h5aget_name_by_idx_c(loc_id, obj_name, obj_namelen, idx_type, order, &
+         n, name, size_default, lapl_id_default)
+
+    IF(PRESENT(size)) size = size_default
+
+
+  END SUBROUTINE h5aget_name_by_idx_f
+!
+!****s* H5A/H5Aget_num_attrs_f
+!
+! NAME
+!  H5Aget_num_attrs_f
+!
+! PURPOSE
+!  Determines the number of attributes attached to an object.
+!
+! INPUTS
+!  obj_id 	 - object (group, dataset, or named datatype)
+!  identifier
+! OUTPUTS
+!  attr_num 	 - number of attributes attached to the object
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces are added for
+!  called C functions (it is needed for Windows
+!  port).  February 27, 2001
+!
+! SOURCE
+  SUBROUTINE h5aget_num_attrs_f(obj_id, attr_num, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: obj_id  ! Object identifier
+    INTEGER, INTENT(OUT) :: attr_num      ! Number of attributes of the object
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5aget_num_attrs_c(obj_id, attr_num) BIND(C,name='h5aget_num_attrs_c')
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN) :: obj_id
+         INTEGER, INTENT(OUT) :: attr_num
+       END FUNCTION h5aget_num_attrs_c
+    END INTERFACE
+
+    hdferr = h5aget_num_attrs_c(obj_id, attr_num)
+  END SUBROUTINE h5aget_num_attrs_f
+
+!
+!****s* H5A/H5Adelete_f
+!
+! NAME
+!  H5Adelete_f
+!
+! PURPOSE
+!  Deletes an attribute of an object (group, dataset or
+!  named datatype)
+!
+! INPUTS
+!  obj_id 	 - object identifier
+!  name 	 - attribute name
+! OUTPUTS
+!
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces are added for
+!  called C functions (it is needed for Windows
+!  port).  February 27, 2001
+!
+! SOURCE
+  SUBROUTINE H5Adelete_f(obj_id, name, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: obj_id  ! Object identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name  ! Attribute name
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+!*****
+    INTEGER(SIZE_T) :: namelen
+
+    INTERFACE
+       INTEGER FUNCTION H5Adelete_c(obj_id, name, namelen) BIND(C,NAME='h5adelete_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         INTEGER(HID_T), INTENT(IN) :: obj_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER(SIZE_T) :: namelen
+       END FUNCTION H5Adelete_c
+    END INTERFACE
+
+    namelen = LEN(name)
+    hdferr = H5Adelete_c(obj_id, name, namelen)
+  END SUBROUTINE H5Adelete_f
+
+!
+!****s* H5A/H5Aclose_f
+!
+! NAME
+!  H5Aclose_f
+!
+! PURPOSE
+!  Closes the specified attribute.
+!
+! INPUTS
+!  attr_id  - attribute identifier
+! OUTPUTS
+!
+!  hdferr   - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces are added for
+!  called C functions (it is needed for Windows
+!  port).  February 27, 2001
+! SOURCE
+
+  SUBROUTINE H5Aclose_f(attr_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: attr_id  ! Attribute identifier
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION H5Aclose(attr_id) BIND(C, NAME='H5Aclose')
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN), VALUE :: attr_id
+       END FUNCTION H5Aclose
+    END INTERFACE
+
+    hdferr = INT(H5Aclose(attr_id))
+  END SUBROUTINE H5Aclose_f
+
+!
+!****s* H5A/H5Aget_storage_size_f
+!
+! NAME
+!  H5Aget_storage_size_f
+!
+! PURPOSE
+!  Returns the amount of storage required for an attribute.
+!
+! INPUTS
+!  attr_id 	 - attribute identifier
+! OUTPUTS
+!  size 	 - attribute storage size
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  M. Scot Breitenfeld
+!  January, 2008
+!
+! SOURCE
+  SUBROUTINE H5Aget_storage_size_f(attr_id, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: attr_id  ! Attribute identifier
+    INTEGER(HSIZE_T), INTENT(OUT) :: size  ! Attribute storage requirement
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!*****
+
+    INTERFACE
+       INTEGER(HSIZE_T) FUNCTION H5Aget_storage_size(attr_id) BIND(C,NAME='H5Aget_storage_size')
+         IMPORT :: HID_T, HSIZE_T
+         INTEGER(HID_T),  INTENT(IN), VALUE :: attr_id
+       END FUNCTION H5Aget_storage_size
+    END INTERFACE
+
+    size = H5Aget_storage_size(attr_id)
+
+    hdferr = 0
+    IF(size.LT.0) hdferr = -1
+
+  END SUBROUTINE H5Aget_storage_size_f
+
+!
+!****s* H5A/H5Aget_create_plist_f
+!
+! NAME
+!  H5Aget_create_plist_f
+!
+! PURPOSE
+!  Gets an attribute creation property list identifier
+!
+! INPUTS
+!  attr_id 	    - Identifier of the attribute
+! OUTPUTS
+!  creation_prop_id - Identifier for the attribute’s creation property
+!  hdferr 	    - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  January, 2008
+!
+! SOURCE
+  SUBROUTINE H5Aget_create_plist_f(attr_id, creation_prop_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: attr_id  ! Identifier of the attribute
+    INTEGER(HID_T), INTENT(OUT) :: creation_prop_id   ! Identifier for the attribute’s creation property
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER(HID_T) FUNCTION H5Aget_create_plist(attr_id) BIND(C,NAME='H5Aget_create_plist')
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN), VALUE :: attr_id
+       END FUNCTION H5Aget_create_plist
+    END INTERFACE
+
+    creation_prop_id = H5Aget_create_plist(attr_id)
+
+    hdferr = 0
+    IF(creation_prop_id.LT.0) hdferr = -1
+
+  END SUBROUTINE H5Aget_create_plist_f
+
+!
+!****s* H5A/H5Arename_by_name_f
+!
+! NAME
+!  H5Arename_by_name_f
+!
+! PURPOSE
+!  Renames an attribute
+!
+! INPUTS
+!  loc_id 	 - Location or object identifier; may be dataset or group
+!  obj_name 	 - Name of object, relative to location,
+!                  whose attribute is to be renamed
+!  old_attr_name - Prior attribute name
+!  new_attr_name - New attribute name
+!  lapl_id 	 - Link access property list identifier
+!
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  January, 2008
+!
+! SOURCE
+  SUBROUTINE H5Arename_by_name_f(loc_id, obj_name, old_attr_name, new_attr_name, &
+        hdferr, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id    ! Object identifier
+    CHARACTER(LEN=*), INTENT(IN) :: obj_name  ! Name of object, relative to location,
+                                              !  whose attribute is to be renamed
+    CHARACTER(LEN=*), INTENT(IN) :: old_attr_name ! Prior attribute name
+    CHARACTER(LEN=*), INTENT(IN) :: new_attr_name ! New attribute name
+
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
+                                         ! 0 on success and -1 on failure
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list identifier
+!*****
+    INTEGER(HID_T) :: lapl_id_default
+    INTEGER(SIZE_T) :: obj_namelen
+    INTEGER(SIZE_T) :: old_attr_namelen
+    INTEGER(SIZE_T) :: new_attr_namelen
+
+    INTERFACE
+       INTEGER FUNCTION H5Arename_by_name_c(loc_id, obj_name, obj_namelen, &
+            old_attr_name, old_attr_namelen, new_attr_name, new_attr_namelen, &
+            lapl_id_default) BIND(C,NAME='h5arename_by_name_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: obj_name
+         INTEGER(SIZE_T) :: obj_namelen
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: old_attr_name
+         INTEGER(SIZE_T) :: old_attr_namelen
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: new_attr_name
+         INTEGER(SIZE_T) :: new_attr_namelen
+         INTEGER(HID_T) :: lapl_id_default
+
+       END FUNCTION H5Arename_by_name_c
+    END INTERFACE
+
+    obj_namelen = LEN(obj_name)
+    old_attr_namelen = LEN(old_attr_name)
+    new_attr_namelen = LEN(new_attr_name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default=lapl_id
+
+    hdferr = H5Arename_by_name_c(loc_id, obj_name, obj_namelen, &
+         old_attr_name, old_attr_namelen, new_attr_name, new_attr_namelen, &
+         lapl_id_default)
+
+  END SUBROUTINE H5Arename_by_name_f
+
+!
+!****s* H5A/H5Aopen_f
+!
+! NAME
+!  H5Aopen_f
+!
+! PURPOSE
+!  Opens an attribute for an object specified by object
+!  identifier and attribute name
+!
+! INPUTS
+!  obj_id 	 - Identifer for object to which attribute is attached
+!  attr_name 	 - Name of attribute to open
+! OUTPUTS
+!  attr_id 	 - attribute identifier
+
+! OPTIONAL PARAMETERS
+!  aapl_id 	 - Attribute access property list
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  January, 2008
+!
+! SOURCE
+  SUBROUTINE H5Aopen_f(obj_id, attr_name, attr_id, hdferr, aapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: obj_id      ! Object identifier
+    CHARACTER(LEN=*), INTENT(IN) :: attr_name ! Attribute name
+    INTEGER(HID_T), INTENT(OUT) :: attr_id    ! Attribute identifier
+    INTEGER, INTENT(OUT) :: hdferr            ! Error code
+                                              !   Success:  0
+                                              !   Failure: -1
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: aapl_id     ! Attribute access property list
+!*****
+    INTEGER(HID_T) :: aapl_id_default
+
+    INTEGER(SIZE_T) :: attr_namelen
+
+    INTERFACE
+       INTEGER FUNCTION H5Aopen_c(obj_id, attr_name, attr_namelen, aapl_id_default, attr_id) &
+            BIND(C,NAME='h5aopen_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         INTEGER(HID_T), INTENT(IN) :: obj_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: attr_name
+         INTEGER(HID_T) :: aapl_id_default
+         INTEGER(SIZE_T) :: attr_namelen
+         INTEGER(HID_T), INTENT(OUT) :: attr_id
+       END FUNCTION H5Aopen_c
+    END INTERFACE
+
+    attr_namelen = LEN(attr_name)
+
+    aapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(aapl_id)) aapl_id_default = aapl_id
+
+    hdferr = H5Aopen_c(obj_id, attr_name, attr_namelen, aapl_id_default, attr_id)
+
+  END SUBROUTINE H5Aopen_f
+
+!
+!****s* H5A/H5Adelete_by_idx_f
+!
+! NAME
+!  H5Adelete_by_idx_f
+!
+! PURPOSE
+!  Deletes an attribute from an object according to index order
+!
+! INPUTS
+!  loc_id 	 - Location or object identifier; may be dataset or group
+!  obj_name 	 - Name of object, relative to location, from which attribute is to be removed
+!  idx_type 	 - Type of index; Possible values are:
+!                   H5_INDEX_UNKNOWN_F = -1  - Unknown index type
+!                   H5_INDEX_NAME_F 	     - Index on names
+!                   H5_INDEX_CRT_ORDER_F     - Index on creation order
+!                   H5_INDEX_N_F 	     - Number of indices defined
+!
+!  order 	 - Order in which to iterate over index; Possible values are:
+!                   H5_ITER_UNKNOWN_F 	 - Unknown order
+!                   H5_ITER_INC_F 	 - Increasing order
+!                   H5_ITER_DEC_F 	 - Decreasing order
+!                   H5_ITER_NATIVE_F 	 - No particular order, whatever is fastest
+!                   H5_ITER_N_F 	 - Number of iteration orders
+!
+!  n 	         - Offset within index
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  lapl_id 	 - Link access property list
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  January, 2008
+!
+! SOURCE
+  SUBROUTINE H5Adelete_by_idx_f(loc_id, obj_name, idx_type, order, n, hdferr, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id      ! Identifer for object to which attribute is attached
+    CHARACTER(LEN=*), INTENT(IN) :: obj_name  ! Name of object, relative to location,
+                                              !  from which attribute is to be removed
+    INTEGER, INTENT(IN) :: idx_type           ! Type of index; Possible values are:
+                                              !    H5_INDEX_UNKNOWN_F   - Unknown index type
+                                              !    H5_INDEX_NAME_F      - Index on names
+                                              !    H5_INDEX_CRT_ORDER_F - Index on creation order
+                                              !    H5_INDEX_N_F	      - Number of indices defined
+
+    INTEGER, INTENT(IN) :: order              ! Order in which to iterate over index; Possible values are:
+                                              !    H5_ITER_UNKNOWN_F  - Unknown order
+                                              !    H5_ITER_INC_F      - Increasing order
+                                              !    H5_ITER_DEC_F      - Decreasing order
+                                              !    H5_ITER_NATIVE_F   - No particular order, whatever is fastest
+                                              !    H5_ITER_N_F	    - Number of iteration orders
+    INTEGER(HSIZE_T), INTENT(IN) :: n         ! Offset within index
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code:
+                                           ! 0 on success and -1 on failure
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list
+!*****
+    INTEGER(SIZE_T) :: obj_namelen
+    INTEGER(HID_T) :: lapl_id_default
+
+    INTERFACE
+       INTEGER FUNCTION H5Adelete_by_idx_c(loc_id, obj_name, obj_namelen, idx_type, order, n, lapl_id_default) &
+            BIND(C,NAME='h5adelete_by_idx_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: obj_name
+         INTEGER, INTENT(IN) :: idx_type
+         INTEGER, INTENT(IN) :: order
+         INTEGER(HSIZE_T), INTENT(IN) :: n
+         INTEGER(HID_T) :: lapl_id_default
+         INTEGER(SIZE_T) :: obj_namelen
+       END FUNCTION H5Adelete_by_idx_c
+    END INTERFACE
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    obj_namelen = LEN(obj_name)
+    hdferr = H5Adelete_by_idx_c(loc_id, obj_name, obj_namelen, idx_type, order, n, lapl_id_default)
+
+  END SUBROUTINE H5Adelete_by_idx_f
+
+!
+!****s* H5A/H5Adelete_by_name_f
+!
+! NAME
+!  H5Adelete_by_name_f
+!
+! PURPOSE
+!  Removes an attribute from a specified location
+!
+! INPUTS
+!  loc_id 	 - Identifer for object to which attribute is attached
+!  obj_name 	 - Name of attribute to open
+!  attr_name 	 - Attribute access property list
+!  lapl_id 	 - Link access property list
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  January, 2008
+!
+! SOURCE
+  SUBROUTINE H5Adelete_by_name_f(loc_id, obj_name, attr_name, hdferr, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id      ! Identifer for object to which attribute is attached
+    CHARACTER(LEN=*), INTENT(IN) :: obj_name  ! Name of object, relative to location,
+                                              !  from which attribute is to be removed
+    CHARACTER(LEN=*), INTENT(IN) :: attr_name ! Name of attribute to delete
+    INTEGER, INTENT(OUT) :: hdferr            ! Error code:
+                                              ! 0 on success and -1 on failure
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list
+!*****
+    INTEGER(SIZE_T) :: attr_namelen
+    INTEGER(SIZE_T) :: obj_namelen
+
+    INTEGER(HID_T) :: lapl_id_default
+
+    INTERFACE
+       INTEGER FUNCTION H5Adelete_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, lapl_id_default) &
+            BIND(C,NAME='h5adelete_by_name_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: obj_name
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: attr_name
+         INTEGER(HID_T) :: lapl_id_default
+         INTEGER(SIZE_T) :: attr_namelen
+         INTEGER(SIZE_T) :: obj_namelen
+       END FUNCTION H5Adelete_by_name_c
+    END INTERFACE
+
+    obj_namelen = LEN(obj_name)
+    attr_namelen = LEN(attr_name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = H5Adelete_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, lapl_id_default)
+
+  END SUBROUTINE H5Adelete_by_name_f
+
+!
+!****s* H5A/H5Aopen_by_idx_f
+!
+! NAME
+!  H5Aopen_by_idx_f
+!
+! PURPOSE
+!  Opens an existing attribute that is attached to an object specified by location and name
+!
+! INPUTS
+!  loc_id 	 - Location of object to which attribute is attached
+!  obj_name 	 - Name of object to which attribute is attached, relative to location
+!  idx_type 	 - Type of index
+!  order 	 - Index traversal order
+!  n 	         - Attribute’s position in index
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  aapl_id 	 - Attribute access property list
+!  lapl_id 	 - Link access property list
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  January, 2008
+!
+! SOURCE
+  SUBROUTINE H5Aopen_by_idx_f(loc_id, obj_name, idx_type, order, n, attr_id, hdferr, aapl_id, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id      ! Object identifier
+    CHARACTER(LEN=*), INTENT(IN) :: obj_name  ! Name of object to which attribute is attached
+    INTEGER, INTENT(IN) :: idx_type           ! Type of index; Possible values are:
+                                              !    H5_INDEX_UNKNOWN_F   - Unknown index type
+                                              !    H5_INDEX_NAME_F      - Index on names
+                                              !    H5_INDEX_CRT_ORDER_F - Index on creation order
+                                              !    H5_INDEX_N_F	      - Number of indices defined
+    INTEGER, INTENT(IN) :: order              ! Order in which to iterate over index; Possible values are:
+                                              !    H5_ITER_UNKNOWN_F  - Unknown order
+                                              !    H5_ITER_INC_F      - Increasing order
+                                              !    H5_ITER_DEC_F      - Decreasing order
+                                              !    H5_ITER_NATIVE_F   - No particular order, whatever is fastest
+
+    INTEGER(HSIZE_T), INTENT(IN) :: n       ! Attribute’s position in index
+
+    INTEGER(HID_T), INTENT(OUT) :: attr_id  ! Attribute identifier
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code:
+                                            ! 0 on success and -1 on failure
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: aapl_id  ! Attribute access property list
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id  ! Link access property list
+!*****
+    INTEGER(SIZE_T) :: obj_namelen
+    INTEGER(HID_T) :: aapl_id_default
+    INTEGER(HID_T) :: lapl_id_default
+
+    INTERFACE
+       INTEGER FUNCTION H5Aopen_by_idx_c(loc_id, obj_name, obj_namelen, idx_type, order, n, &
+            aapl_id_default, lapl_id_default, attr_id) BIND(C,NAME='h5aopen_by_idx_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: obj_name
+         INTEGER, INTENT(IN) :: idx_type
+         INTEGER, INTENT(IN) :: order
+         INTEGER(HSIZE_T), INTENT(IN) :: n
+         INTEGER(HID_T) :: aapl_id_default
+         INTEGER(HID_T) :: lapl_id_default
+         INTEGER(SIZE_T) :: obj_namelen
+         INTEGER(HID_T), INTENT(OUT) :: attr_id  ! Attribute identifier
+       END FUNCTION H5Aopen_by_idx_c
+    END INTERFACE
+
+    obj_namelen = LEN(obj_name)
+
+    aapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(aapl_id)) aapl_id_default = aapl_id
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = H5Aopen_by_idx_c(loc_id, obj_name, obj_namelen, idx_type, order, n, &
+         aapl_id_default, lapl_id_default, attr_id)
+
+  END SUBROUTINE H5Aopen_by_idx_f
+
+!
+!****s* H5A/H5Aget_info_f
+!
+! NAME
+!  H5Aget_info_f
+!
+! PURPOSE
+!  Retrieves attribute information, by attribute identifier
+!
+! INPUTS
+!  attr_id 	 - attribute identifier
+!
+! OUTPUTS
+!  NOTE: In C it is defined as a structure: H5A_info_t
+!
+!  corder_valid  - indicates whether the creation order data is valid for this attribute
+!  corder 	 - is a positive integer containing the creation order of the attribute
+!  cset 	 - indicates the character set used for the attribute’s name
+!  data_size 	 - indicates the size, in the number of characters, of the attribute
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  M. Scot Breitenfeld
+!  January, 2008
+! SOURCE
+  SUBROUTINE H5Aget_info_f(attr_id, f_corder_valid, corder, cset, data_size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: attr_id  ! Attribute identifier
+
+    LOGICAL, INTENT(OUT) :: f_corder_valid ! Indicates whether the creation order data is valid for this attribute
+    INTEGER, INTENT(OUT) :: corder ! Is a positive integer containing the creation order of the attribute
+    INTEGER, INTENT(OUT) :: cset   ! Indicates the character set used for the attribute’s name
+    INTEGER(HSIZE_T), INTENT(OUT) :: data_size ! Indicates the size, in the number of characters, of the attribute
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
+                                         ! 0 on success and -1 on failure
+!*****
+    INTEGER :: corder_valid
+
+    INTERFACE
+       INTEGER FUNCTION H5Aget_info_c(attr_id, corder_valid, corder, cset, data_size) BIND(C,NAME='h5aget_info_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: attr_id
+
+         INTEGER, INTENT(OUT) :: corder_valid
+         INTEGER, INTENT(OUT) :: corder
+         INTEGER, INTENT(OUT) :: cset
+         INTEGER(HSIZE_T), INTENT(OUT) :: data_size
+       END FUNCTION H5Aget_info_c
+    END INTERFACE
+
+    hdferr = H5Aget_info_c(attr_id, corder_valid, corder, cset, data_size)
+
+    f_corder_valid =.FALSE.
+    IF (corder_valid .EQ. 1) f_corder_valid =.TRUE.
+
+
+  END SUBROUTINE H5Aget_info_f
+
+!
+!****s* H5A/H5Aget_info_by_idx_f
+!
+! NAME
+!  H5Aget_info_by_idx_f
+!
+! PURPOSE
+!  Retrieves attribute information, by attribute index position
+!
+! INPUTS
+!  loc_id 	 - Location of object to which attribute is attached
+!  obj_name 	 - Name of object to which attribute is attached, relative to location
+!  idx_type 	 - Type of index
+!  order 	 - Index traversal order
+!  n 	         - Attribute’s position in index
+!
+! OUTPUTS  NOTE: In C it is defined as a structure: H5A_info_t
+!  corder_valid  - indicates whether the creation order data is valid for this attribute
+!  corder 	 - is a positive integer containing the creation order of the attribute
+!  cset 	 - indicates the character set used for the attribute’s name
+!  data_size 	 - indicates the size, in the number of characters, of the attribute
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  lapl_id 	 - Link access property list
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  January, 2008
+!
+! SOURCE
+  SUBROUTINE H5Aget_info_by_idx_f(loc_id, obj_name, idx_type, order, n, &
+       f_corder_valid, corder, cset, data_size, hdferr, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id      ! Object identifier
+    CHARACTER(LEN=*), INTENT(IN) :: obj_name  ! Name of object to which attribute is attached
+    INTEGER, INTENT(IN) :: idx_type           ! Type of index; Possible values are:
+                                              !    H5_INDEX_UNKNOWN_F   - Unknown index type
+                                              !    H5_INDEX_NAME_F      - Index on names
+                                              !    H5_INDEX_CRT_ORDER_F - Index on creation order
+                                              !    H5_INDEX_N_F	      - Number of indices defined
+    INTEGER, INTENT(IN) :: order              ! Order in which to iterate over index; Possible values are:
+                                              !    H5_ITER_UNKNOWN_F  - Unknown order
+                                              !    H5_ITER_INC_F      - Increasing order
+                                              !    H5_ITER_DEC_F      - Decreasing order
+                                              !    H5_ITER_NATIVE_F   - No particular order, whatever is fastest
+
+    INTEGER(HSIZE_T), INTENT(IN) :: n         ! Attribute’s position in index
+
+
+    LOGICAL, INTENT(OUT) :: f_corder_valid ! Indicates whether the creation order data is valid for this attribute
+    INTEGER, INTENT(OUT) :: corder ! Is a positive integer containing the creation order of the attribute
+    INTEGER, INTENT(OUT) :: cset   ! Indicates the character set used for the attribute’s name
+    INTEGER(HSIZE_T), INTENT(OUT) :: data_size ! Indicates the size, in the number of characters, of the attribute
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
+                                         ! 0 on success and -1 on failure
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id  ! Link access property list
+!*****
+    INTEGER :: corder_valid
+    INTEGER(SIZE_T)  :: obj_namelen
+    INTEGER(HID_T) :: lapl_id_default
+
+    INTERFACE
+       INTEGER FUNCTION h5aget_info_by_idx_c(loc_id, obj_name, obj_namelen, idx_type, order, n, lapl_id_default, &
+            corder_valid, corder, cset, data_size) BIND(C,NAME='h5aget_info_by_idx_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: obj_name
+         INTEGER, INTENT(IN) :: idx_type
+         INTEGER, INTENT(IN) :: order
+         INTEGER(HSIZE_T), INTENT(IN) :: n
+         INTEGER(HID_T) :: lapl_id_default
+         INTEGER, INTENT(OUT) :: corder_valid
+         INTEGER, INTENT(OUT) :: corder
+         INTEGER, INTENT(OUT) :: cset
+         INTEGER(HSIZE_T), INTENT(OUT) :: data_size
+
+         INTEGER(SIZE_T)  :: obj_namelen
+       END FUNCTION H5Aget_info_by_idx_c
+    END INTERFACE
+
+    obj_namelen = LEN(obj_name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(present(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = H5Aget_info_by_idx_c(loc_id, obj_name, obj_namelen, idx_type, order, n, lapl_id_default, &
+            corder_valid, corder, cset, data_size)
+
+    f_corder_valid =.FALSE.
+    IF (corder_valid .EQ. 1) f_corder_valid =.TRUE.
+
+  END SUBROUTINE H5Aget_info_by_idx_f
+
+!
+!****s* H5A/H5Aget_info_by_name_f
+!
+! NAME
+!  H5Aget_info_by_name_f
+!
+! PURPOSE
+!  Retrieves attribute information, by attribute name
+!
+! INPUTS
+!  loc_id 	 - Location of object to which attribute is attached
+!  obj_name 	 - Name of object to which attribute is attached, relative to location
+!  attr_name 	 - Attribute name
+!
+! OUTPUTS  NOTE: In C it is defined as a structure: H5A_info_t
+!  corder_valid  - indicates whether the creation order data is valid for this attribute
+!  corder 	 - is a positive integer containing the creation order of the attribute
+!  cset 	 - indicates the character set used for the attribute’s name
+!  data_size 	 - indicates the size, in the number of characters, of the attribute
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  lapl_id 	 - Link access property list
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  January, 2008
+!
+! SOURCE
+  SUBROUTINE H5Aget_info_by_name_f(loc_id, obj_name, attr_name, &
+       f_corder_valid, corder, cset, data_size, hdferr, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id    ! Object identifier
+    CHARACTER(LEN=*), INTENT(IN) :: obj_name ! Name of object to which attribute is attached
+    CHARACTER(LEN=*), INTENT(IN) :: attr_name ! Attribute name
+
+
+    LOGICAL, INTENT(OUT) :: f_corder_valid ! Indicates whether the creation order data is valid for this attribute
+    INTEGER, INTENT(OUT) :: corder ! Is a positive integer containing the creation order of the attribute
+    INTEGER, INTENT(OUT) :: cset ! Indicates the character set used for the attribute’s name
+    INTEGER(HSIZE_T), INTENT(OUT) :: data_size   ! Indicates the size, in the number of characters, of the attribute
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code:
+                                           ! 0 on success and -1 on failure
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id  ! Link access property list
+!*****
+    INTEGER :: corder_valid
+    INTEGER(SIZE_T)  :: obj_namelen
+    INTEGER(SIZE_T)  :: attr_namelen
+    INTEGER(HID_T) :: lapl_id_default
+
+    INTERFACE
+       INTEGER FUNCTION H5Aget_info_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, lapl_id_default, &
+            corder_valid, corder, cset, data_size) BIND(C,NAME='h5aget_info_by_name_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: obj_name
+         INTEGER(SIZE_T), INTENT(IN) :: obj_namelen
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: attr_name
+         INTEGER(SIZE_T), INTENT(IN) :: attr_namelen
+         INTEGER(HID_T) :: lapl_id_default
+         INTEGER, INTENT(OUT) :: corder_valid
+         INTEGER, INTENT(OUT) :: corder
+         INTEGER, INTENT(OUT) :: cset
+         INTEGER(HSIZE_T), INTENT(OUT) :: data_size
+
+       END FUNCTION H5Aget_info_by_name_c
+    END INTERFACE
+
+    obj_namelen = LEN(obj_name)
+    attr_namelen = LEN(attr_name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = H5Aget_info_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, lapl_id_default, &
+            corder_valid, corder, cset, data_size)
+
+    f_corder_valid =.FALSE.
+    IF (corder_valid .EQ. 1) f_corder_valid =.TRUE.
+
+  END SUBROUTINE H5Aget_info_by_name_f
+
+!
+!****s* H5A/H5Acreate_by_name_f
+!
+! NAME
+!  H5Acreate_by_name_f
+!
+! PURPOSE
+!  Creates an attribute attached to a specified object
+!
+! INPUTS
+!  loc_id 	 - Location or object identifier; may be dataset or group
+!  obj_name 	 - Name, relative to loc_id, of object that attribute is to be attached to
+!  attr_name 	 - Attribute name
+!  type_id 	 - Attribute datatype identifier
+!  space_id 	 - Attribute dataspace identifier
+!
+! OUTPUTS
+!  attr 	 - an attribute identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  acpl_id 	 - Attribute creation property list identifier (Currently not used.)
+!  aapl_id 	 - Attribute access property list identifier (Currently not used.)
+!  lapl_id 	 - Link access property list
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February, 2008
+! SOURCE
+  SUBROUTINE H5Acreate_by_name_f(loc_id, obj_name, attr_name, type_id, space_id, attr, hdferr, &
+       acpl_id, aapl_id, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T),   INTENT(IN)  :: loc_id
+    CHARACTER(LEN=*), INTENT(IN)  :: obj_name
+    CHARACTER(LEN=*), INTENT(IN)  :: attr_name
+    INTEGER(HID_T),   INTENT(IN)  :: type_id
+    INTEGER(HID_T),   INTENT(IN)  :: space_id
+    INTEGER(HID_T),   INTENT(OUT) :: attr
+    INTEGER,          INTENT(OUT) :: hdferr
+
+    INTEGER(HID_T),   INTENT(IN), OPTIONAL :: acpl_id
+    INTEGER(HID_T),   INTENT(IN), OPTIONAL :: aapl_id
+    INTEGER(HID_T),   INTENT(IN), OPTIONAL :: lapl_id
+!*****
+    INTEGER(SIZE_T)  :: obj_namelen
+    INTEGER(SIZE_T)  :: attr_namelen
+
+    INTEGER(HID_T) :: acpl_id_default
+    INTEGER(HID_T) :: aapl_id_default
+    INTEGER(HID_T) :: lapl_id_default
+
+    INTERFACE
+       INTEGER FUNCTION H5Acreate_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, &
+            type_id, space_id, acpl_id_default, aapl_id_default, lapl_id_default, attr) &
+            BIND(C,NAME='h5acreate_by_name_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: obj_name
+         INTEGER(SIZE_T), INTENT(IN) :: obj_namelen
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: attr_name
+         INTEGER(SIZE_T), INTENT(IN) :: attr_namelen
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER(HID_T) :: acpl_id_default
+         INTEGER(HID_T) :: aapl_id_default
+         INTEGER(HID_T) :: lapl_id_default
+         INTEGER(HID_T), INTENT(OUT) :: attr
+
+       END FUNCTION H5Acreate_by_name_c
+    END INTERFACE
+
+    obj_namelen = LEN(obj_name)
+    attr_namelen = LEN(attr_name)
+
+    acpl_id_default = H5P_DEFAULT_F
+    aapl_id_default = H5P_DEFAULT_F
+    lapl_id_default = H5P_DEFAULT_F
+
+    IF(PRESENT(acpl_id)) acpl_id_default = acpl_id
+    IF(PRESENT(aapl_id)) aapl_id_default = aapl_id
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = H5Acreate_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, &
+            type_id, space_id, acpl_id_default, aapl_id_default, lapl_id_default, attr)
+  END SUBROUTINE H5Acreate_by_name_f
+
+!
+!****s* H5A/H5Aexists_f
+!
+! NAME
+!  H5Aexists_f
+!
+! PURPOSE
+!  Determines whether an attribute with a given name exists on an object
+!
+! INPUTS
+!  obj_id 	 - Object identifier
+!  attr_name 	 - Attribute name
+!
+! OUTPUTS
+!  attr_exists 	 - attribute exists status
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February, 2008
+!
+! SOURCE
+  SUBROUTINE H5Aexists_f(obj_id, attr_name, attr_exists, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: obj_id      ! Object identifier
+    CHARACTER(LEN=*), INTENT(IN) :: attr_name ! Attribute name
+    LOGICAL, INTENT(OUT) :: attr_exists  ! .TRUE. if exists, .FALSE. otherwise
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
+                                         ! 0 on success and -1 on failure
+!*****
+    INTEGER(HID_T) :: attr_exists_c
+    INTEGER(SIZE_T) :: attr_namelen
+
+    INTERFACE
+       INTEGER FUNCTION H5Aexists_c(obj_id, attr_name, attr_namelen, attr_exists_c) BIND(C,NAME='h5aexists_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: obj_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: attr_name
+         INTEGER(SIZE_T) :: attr_namelen
+         INTEGER(HID_T) :: attr_exists_c
+       END FUNCTION H5Aexists_c
+    END INTERFACE
+
+    attr_namelen = LEN(attr_name)
+
+    hdferr = H5Aexists_c(obj_id, attr_name, attr_namelen, attr_exists_c)
+
+    attr_exists = .FALSE.
+    IF(attr_exists_c.GT.0) attr_exists = .TRUE.
+
+  END SUBROUTINE H5Aexists_f
+
+!
+!****s* H5A/H5Aexists_by_name_f
+!
+! NAME
+!  H5Aexists_by_name_f
+!
+! PURPOSE
+!  Determines whether an attribute with a given name exists on an object
+!
+! INPUTS
+!  loc_id 	 - Location identifier
+!  obj_name 	 - Object name either relative to loc_id, absolute from the file’s root group, or '.' (a dot)
+!  attr_name 	 - Attribute name
+!
+! OUTPUTS
+!  attr_exists 	 - attribute exists status
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  lapl_id 	 - Link access property list identifier
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February, 2008
+!
+! SOURCE
+  SUBROUTINE H5Aexists_by_name_f(loc_id, obj_name, attr_name, attr_exists, hdferr, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id     ! Location identifier
+    CHARACTER(LEN=*), INTENT(IN) :: obj_name ! Object name either relative to loc_id,
+                                             ! absolute from the file’s root group, or '.'
+    CHARACTER(LEN=*), INTENT(IN) :: attr_name ! Attribute name
+    LOGICAL, INTENT(OUT) :: attr_exists ! .TRUE. if exists, .FALSE. otherwise
+    INTEGER, INTENT(OUT) :: hdferr      ! Error code:
+                                        ! 0 on success and -1 on failure
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list identifier
+!*****
+    INTEGER :: attr_exists_c
+    INTEGER(SIZE_T)  :: obj_namelen
+    INTEGER(SIZE_T)  :: attr_namelen
+
+    INTEGER(HID_T) :: lapl_id_default
+
+    INTERFACE
+       INTEGER FUNCTION H5Aexists_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, &
+            lapl_id_default, attr_exists_c) BIND(C,NAME='h5aexists_by_name_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: obj_name
+         INTEGER(SIZE_T), INTENT(IN) :: obj_namelen
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: attr_name
+         INTEGER(SIZE_T), INTENT(IN) :: attr_namelen
+         INTEGER(HID_T), INTENT(IN) :: lapl_id_default
+         INTEGER, INTENT(OUT) :: attr_exists_c
+       END FUNCTION H5Aexists_by_name_c
+    END INTERFACE
+
+    attr_namelen = LEN(attr_name)
+    obj_namelen = LEN(obj_name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = H5Aexists_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, lapl_id_default, attr_exists_c)
+
+    attr_exists = .FALSE.
+    IF(attr_exists_c.GT.0) attr_exists = .TRUE.
+
+  END SUBROUTINE H5Aexists_by_name_f
+!
+!****s* H5A/H5Aopen_by_name_f
+!
+! NAME
+!  H5Aopen_by_name_f
+!
+! PURPOSE
+!  Opens an attribute for an object by object name and attribute name.
+!
+! INPUTS
+!  loc_id 	 - Location from which to find object to which attribute is attached
+!  obj_name 	 - Object name either relative to loc_id, absolute from the file’s root group, or '.' (a dot)
+!  attr_name 	 - Attribute name
+!
+! OUTPUTS
+!  attr_id 	 - attribute identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  aapl_id 	 - Attribute access property list (Currently unused; should be passed in as H5P_DEFAULT.)
+!  lapl_id 	 - Link access property list identifier
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February, 2008
+! SOURCE
+  SUBROUTINE H5Aopen_by_name_f(loc_id, obj_name, attr_name, attr_id, hdferr, aapl_id, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id    ! Location identifier
+    CHARACTER(LEN=*), INTENT(IN) :: obj_name ! Object name either relative to loc_id,
+                                             ! absolute from the file’s root group, or '.'
+    CHARACTER(LEN=*), INTENT(IN) :: attr_name ! Attribute name
+    INTEGER(HID_T), INTENT(OUT) :: attr_id ! Attribute identifier
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code:
+                                           ! 0 on success and -1 on failure
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: aapl_id ! Attribute access property list
+                                                    ! (Currently unused; should be passed in as H5P_DEFAULT_F)
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list identifier
+!*****
+    INTEGER(HID_T) :: aapl_id_default
+    INTEGER(HID_T) :: lapl_id_default
+
+    INTEGER(SIZE_T) :: obj_namelen
+    INTEGER(SIZE_T) :: attr_namelen
+
+    INTERFACE
+       INTEGER FUNCTION H5Aopen_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, &
+            aapl_id_default, lapl_id_default, attr_id) BIND(C,NAME='h5aopen_by_name_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: obj_name
+         INTEGER(SIZE_T), INTENT(IN) :: obj_namelen
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: attr_name
+         INTEGER(SIZE_T), INTENT(IN) :: attr_namelen
+         INTEGER(HID_T) :: aapl_id_default
+         INTEGER(HID_T) :: lapl_id_default
+         INTEGER(HID_T), INTENT(OUT) :: attr_id
+       END FUNCTION H5Aopen_by_name_c
+    END INTERFACE
+
+    attr_namelen = LEN(attr_name)
+    obj_namelen = LEN(obj_name)
+
+    aapl_id_default = H5P_DEFAULT_F
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(aapl_id)) aapl_id_default = aapl_id
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = H5Aopen_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, &
+         aapl_id_default, lapl_id_default, attr_id)
+
+  END SUBROUTINE H5Aopen_by_name_f
+
+!
+!****s* H5A/H5Arename_f
+!
+! NAME
+!  H5Arename_f
+!
+! PURPOSE
+!  Renames an attribute
+!
+! INPUTS
+!  loc_id 	 - Location or object identifier; may be dataset or group
+!  old_attr_name - Prior attribute name
+!  new_attr_name - New attribute name
+!
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  January, 2008
+!
+! HISTORY
+!  N/A
+!
+!
+
+! SOURCE
+  SUBROUTINE H5Arename_f(loc_id, old_attr_name, new_attr_name, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id    ! Object identifier
+    CHARACTER(LEN=*), INTENT(IN) :: old_attr_name ! Prior attribute name
+    CHARACTER(LEN=*), INTENT(IN) :: new_attr_name ! New attribute name
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
+                                         ! 0 on success and -1 on failure
+!*****
+    INTEGER(SIZE_T) :: old_attr_namelen
+    INTEGER(SIZE_T) :: new_attr_namelen
+
+    INTERFACE
+       INTEGER FUNCTION H5Arename_c(loc_id, &
+            old_attr_name, old_attr_namelen, new_attr_name, new_attr_namelen) BIND(C,NAME='h5arename_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: old_attr_name
+         INTEGER(SIZE_T) :: old_attr_namelen
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: new_attr_name
+         INTEGER(SIZE_T) :: new_attr_namelen
+       END FUNCTION H5Arename_c
+    END INTERFACE
+
+    old_attr_namelen = LEN(old_attr_name)
+    new_attr_namelen = LEN(new_attr_name)
+
+    hdferr = H5Arename_c(loc_id, &
+         old_attr_name, old_attr_namelen, new_attr_name, new_attr_namelen)
+
+  END SUBROUTINE H5Arename_f
+
+  SUBROUTINE H5Awrite_char_scalar(attr_id, memtype_id, buf, dims, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: attr_id               ! Attribute identifier
+    INTEGER(HID_T), INTENT(IN) :: memtype_id            ! Attribute datatype
+                                                        !  identifier  (in memory)
+    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims  ! Array to story buf dimension sizes
+    CHARACTER(LEN=*), INTENT(IN) :: buf                 ! Attribute data
+    INTEGER, INTENT(OUT) :: hdferr                      ! Error code
+
+    CALL H5Awrite_char_scalar_fix(attr_id, memtype_id, buf, LEN(buf), dims, hdferr)
+
+  END SUBROUTINE H5Awrite_char_scalar
+
+  SUBROUTINE H5Awrite_char_scalar_fix(attr_id, memtype_id, buf, buf_len, dims, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: attr_id               ! Attribute identifier
+    INTEGER(HID_T), INTENT(IN) :: memtype_id            ! Attribute datatype
+                                                        !  identifier  (in memory)
+    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims  ! Array to story buf dimension sizes
+    INTEGER, INTENT(IN)  :: buf_len
+    CHARACTER(LEN=buf_len), INTENT(IN), TARGET :: buf   ! Attribute data
+    INTEGER, INTENT(OUT) :: hdferr                      ! Error code
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1:1))
+
+    hdferr = H5Awrite_f_c(attr_id, memtype_id, f_ptr)
+
+  END SUBROUTINE H5Awrite_char_scalar_fix
+
+
+!****s* H5A (F03)/H5Awrite_f_F03
+!
+! NAME
+!  H5Awrite_f_F03
+!
+! PURPOSE
+!  Writes an attribute.
+!
+! Inputs:
+!  attr_id     - Attribute identifier
+!  memtype_id  - Attribute datatype identifier  (in memory)
+!  buf 	       - Data buffer; may be a scalar or an array
+!
+! Outputs:
+!  hdferr      - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces are added for
+!  called C functions (it is needed for Windows
+!  port).  February 27, 2001
+!
+! NOTES
+!  This function is overloaded to write INTEGER,
+!  REAL, REAL(KIND=C_DOUBLE) and CHARACTER buffers
+!  up to 7 dimensions.
+!
+! Fortran2003 Interface:
+!!  SUBROUTINE H5Awrite_f(attr_id, memtype_id, buf, hdferr) 
+!!    INTEGER(HID_T)  , INTENT(IN)  :: attr_id
+!!    INTEGER(HID_T)  , INTENT(IN)  :: memtype_id
+!!    TYPE(C_PTR)     , INTENT(IN)  :: buf
+!!    INTEGER         , INTENT(OUT) :: hdferr
+!*****
+
+  SUBROUTINE H5Awrite_ptr(attr_id, mem_type_id, buf, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: attr_id     ! Attribute identifier
+    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
+    TYPE(C_PTR), INTENT(IN), TARGET :: buf
+    INTEGER, INTENT(OUT) :: hdferr            ! Error code
+
+    hdferr = H5Awrite_f_c(attr_id, mem_type_id, buf)
+
+  END SUBROUTINE H5Awrite_ptr
+
+  SUBROUTINE H5Aread_char_scalar(attr_id, memtype_id, buf, dims, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
+    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
+                                             ! identifier  (in memory)
+    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
+    CHARACTER(LEN=*), INTENT(INOUT) :: buf ! Attribute data
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+
+    CALL H5Aread_char_scalar_fix(attr_id, memtype_id, buf, LEN(buf), hdferr)
+
+  END SUBROUTINE H5Aread_char_scalar
+
+  SUBROUTINE H5Aread_char_scalar_fix(attr_id, memtype_id, buf, buf_len, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
+    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
+                                             ! identifier  (in memory)
+    INTEGER, INTENT(IN)  :: buf_len
+    CHARACTER(LEN=buf_len), INTENT(INOUT), TARGET :: buf ! Attribute data
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1:1))
+
+    hdferr = H5Aread_f_c(attr_id, memtype_id, f_ptr)
+
+  END SUBROUTINE H5Aread_char_scalar_fix
+
+!****s* H5A (F03)/H5Aread_f_F03
+!
+! NAME
+!  H5Aread_f_F03
+!
+! PURPOSE
+!  Reads an attribute.
+!
+! Inputs:
+!  attr_id     - Attribute identifier
+!  memtype_id  - Attribute datatype identifier  (in memory)
+!
+! Outputs:
+!  buf 	       - Data buffer; may be a scalar or an array
+!  hdferr      - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces are added for
+!  called C functions (it is needed for Windows
+!  port).  February 27, 2001
+!
+!  dims parameter was added to make code portable;
+!  Aprile 4, 2001
+!
+!  Changed buf intent to INOUT to be consistant
+!  with how the C functions handles it. The pg
+!  compiler will return 0 if a buf value is not set.
+!  February, 2008
+!
+! NOTES
+!  This function is overloaded to write INTEGER,
+!  REAL, REAL(KIND=C_DOUBLE) and CHARACTER buffers
+!  up to 7 dimensions.
+! Fortran2003 Interface:
+!!  SUBROUTINE H5Aread_f(attr_id, memtype_id, buf, hdferr) 
+!!    INTEGER(HID_T)  , INTENT(IN)    :: attr_id
+!!    INTEGER(HID_T)  , INTENT(IN)    :: memtype_id
+!!    TYPE(C_PTR)     , INTENT(INOUT) :: buf
+!!    INTEGER         , INTENT(OUT)   :: hdferr
+!*****
+
+  SUBROUTINE H5Aread_ptr(attr_id, mem_type_id, buf, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: attr_id     ! Attribute identifier
+    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
+    TYPE(C_PTR), INTENT(INOUT), TARGET :: buf
+    INTEGER, INTENT(OUT) :: hdferr            ! Error code
+
+    hdferr = H5Aread_f_c(attr_id, mem_type_id, buf)
+
+  END SUBROUTINE H5Aread_ptr
+
+END MODULE H5A
+
+
diff --git a/fortran/src/H5Aff.f90 b/fortran/src/H5Aff.f90
deleted file mode 100644
index 25f7fa7..0000000
--- a/fortran/src/H5Aff.f90
+++ /dev/null
@@ -1,1673 +0,0 @@
-!****h* ROBODoc/H5A
-!
-! NAME
-!  MODULE H5A
-!
-! PURPOSE
-!  This file contains Fortran interfaces for H5A functions. It includes
-!  all the functions that are independent on whether the Fortran 2003 functions
-!  are enabled or disabled.
-!
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5A function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5A
-
-  USE H5GLOBAL
-!
-!  On Windows there are no big (integer*8) integers, so overloading
-!  for bug #670 does not work. I have to use DEC compilation directives to make
-!  Windows DEC Visual Fortran and OSF compilers happy and do right things.
-!  05/01/02 EP
-!
-
-CONTAINS
-
-!
-!****s* H5A/h5acreate_f
-!
-! NAME
-!  h5acreate_f
-!
-! PURPOSE
-!  Creates a dataset as an attribute of a group, dataset, or named datatype
-!
-! INPUTS
-!  loc_id 	 - identifier of an object (group, dataset,
-!                  or named datatype) attribute is attached to
-!  name 	 - attribute name
-!  type_id 	 - attribute datatype identifier
-!  space_id 	 - attribute dataspace identifier
-!
-! OUTPUTS
-!  attr_id 	 - attribute identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  acpl_id 	 - Attribute creation property list identifier
-!  appl_id 	 - Attribute access property list identifier
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces are added for
-!  called C functions (it is needed for Windows
-!  port).  February 27, 2001
-!
-!
-! SOURCE
-  SUBROUTINE h5acreate_f(loc_id, name, type_id, space_id, attr_id, &
-                                 hdferr, acpl_id, aapl_id )
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! Object identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Attribute name
-    INTEGER(HID_T), INTENT(IN) :: type_id  ! Attribute datatype identifier
-    INTEGER(HID_T), INTENT(IN) :: space_id ! Attribute dataspace identifier
-    INTEGER(HID_T), INTENT(OUT) :: attr_id ! Attribute identifier
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code:
-                                           ! 0 on success and -1 on failure
-!*****
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: acpl_id ! Attribute creation property list identifier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: aapl_id ! Attribute access property list identifier
-
-    INTEGER(HID_T) :: acpl_id_default
-    INTEGER(HID_T) :: aapl_id_default
-    INTEGER(SIZE_T) :: namelen
-    INTERFACE
-       INTEGER FUNCTION h5acreate_c(loc_id, name, namelen, type_id, &
-            space_id, acpl_id_default, aapl_id_default, attr_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5ACREATE_C'::h5acreate_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER(SIZE_T) :: namelen
-         INTEGER(HID_T), INTENT(IN) :: type_id
-         INTEGER(HID_T), INTENT(IN) :: space_id
-         INTEGER(HID_T) :: acpl_id_default
-         INTEGER(HID_T) :: aapl_id_default
-         INTEGER(HID_T), INTENT(OUT) :: attr_id
-       END FUNCTION h5acreate_c
-    END INTERFACE
-
-    acpl_id_default = H5P_DEFAULT_F
-    aapl_id_default = H5P_DEFAULT_F
-    namelen = LEN(name)
-    IF (PRESENT(acpl_id)) acpl_id_default = acpl_id
-    IF (PRESENT(aapl_id)) aapl_id_default = aapl_id
-
-    hdferr = h5acreate_c(loc_id, name, namelen, type_id, space_id, &
-         acpl_id_default, aapl_id_default, attr_id)
-
-  END SUBROUTINE h5acreate_f
-
-
-!
-!****s* H5A/h5aopen_name_f
-!
-! NAME
-!  h5aopen_name_f
-!
-! PURPOSE
-!  Opens an attribute specified by name.
-!
-! INPUTS
-!  obj_id 	 - identifier of a group, dataset, or named
-!                  datatype atttribute to be attached to
-!  name 	 - attribute name
-! OUTPUTS
-!  attr_id 	 - attribute identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces are added for
-!  called C functions (it is needed for Windows
-!  port).  February 27, 2001
-!
-! SOURCE
-  SUBROUTINE h5aopen_name_f(obj_id, name, attr_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: obj_id    ! Object identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name    ! Attribute name
-    INTEGER(HID_T), INTENT(OUT) :: attr_id  ! Attribute identifier
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-!*****
-    INTEGER(SIZE_T) :: namelen
-
-    INTERFACE
-       INTEGER FUNCTION h5aopen_name_c(obj_id, name, namelen, attr_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AOPEN_NAME_C'::h5aopen_name_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: obj_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER(SIZE_T) :: namelen
-         INTEGER(HID_T), INTENT(OUT) :: attr_id
-       END FUNCTION h5aopen_name_c
-    END INTERFACE
-
-    namelen = LEN(name)
-    hdferr = h5aopen_name_c(obj_id, name, namelen, attr_id)
-  END SUBROUTINE h5aopen_name_f
-!
-!****s* H5A/h5aopen_idx_f
-!
-! NAME
-!  h5aopen_idx_f
-!
-! PURPOSE
-!  Opens the attribute specified by its index.
-!
-! INPUTS
-!  obj_id 	 - identifier of a group, dataset, or named
-!                  datatype an attribute to be attached to
-!  index 	 - index of the attribute to open (zero-based)
-! OUTPUTS
-!  attr_id 	 - attribute identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces are added for
-!  called C functions (it is needed for Windows
-!  port).  February 27, 2001
-!
-! SOURCE
-  SUBROUTINE h5aopen_idx_f(obj_id, index, attr_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: obj_id    ! Object identifier
-    INTEGER, INTENT(IN) :: index            ! Attribute index
-    INTEGER(HID_T), INTENT(OUT) :: attr_id  ! Attribute identifier
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5aopen_idx_c(obj_id, index, attr_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AOPEN_IDX_C'::h5aopen_idx_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: obj_id
-         INTEGER, INTENT(IN) :: index
-         INTEGER(HID_T), INTENT(OUT) :: attr_id
-       END FUNCTION h5aopen_idx_c
-    END INTERFACE
-
-    hdferr = h5aopen_idx_c(obj_id, index, attr_id)
-  END SUBROUTINE h5aopen_idx_f
-!
-!****s* H5A/h5aget_space_f
-!
-! NAME
-!  h5aget_space_f
-!
-! PURPOSE
-!  Gets a copy of the dataspace for an attribute.
-!
-! INPUTS
-!  attr_id 	 - attribute identifier
-!
-! OUTPUTS
-!  space_id 	 - attribite dataspace identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces are added for
-!  called C functions (it is needed for Windows
-!  port).  February 27, 2001
-!
-!
-! SOURCE
-  SUBROUTINE h5aget_space_f(attr_id, space_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id   ! Attribute identifier
-    INTEGER(HID_T), INTENT(OUT) :: space_id ! Attribute dataspace identifier
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5aget_space_c(attr_id, space_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AGET_SPACE_C'::h5aget_space_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(OUT) :: space_id
-       END FUNCTION h5aget_space_c
-    END INTERFACE
-    
-    hdferr = h5aget_space_c(attr_id, space_id)
-  END SUBROUTINE h5aget_space_f
-!
-!****s* H5A/h5aget_type_f
-!
-! NAME
-!  h5aget_type_f
-!
-! PURPOSE
-!  Gets an attribute datatype.
-!
-! INPUTS
-!  attr_id 	 - attribute identifier
-! OUTPUTS
-!  type_id 	 - attribute datatype identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces are added for
-!  called C functions (it is needed for Windows
-!  port).  February 27, 2001
-!
-! SOURCE
-  SUBROUTINE h5aget_type_f(attr_id, type_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id  ! Attribute identifier
-    INTEGER(HID_T), INTENT(OUT) :: type_id ! Attribute datatype identifier
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5aget_type_c(attr_id, type_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AGET_TYPE_C'::h5aget_type_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(OUT) :: type_id
-       END FUNCTION h5aget_type_c
-    END INTERFACE
-    
-    hdferr = h5aget_type_c(attr_id, type_id)
-  END SUBROUTINE h5aget_type_f
-!
-!****s* H5A/h5aget_name_f
-!
-! NAME
-!  h5aget_name_f
-!
-! PURPOSE
-!  Gets an attribute name.
-!
-! INPUTS
-!  attr_id 	 - attribute identifier
-!  size 	 - size of a buffer to read name in
-! OUTPUTS
-!  buf 	         - buffer to read name in
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces are added for
-!  called C functions (it is needed for Windows
-!  port).  February 27, 2001
-!
-!
-! SOURCE
-  SUBROUTINE h5aget_name_f(attr_id, size, buf, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id  ! Attribute identifier
-    INTEGER(SIZE_T), INTENT(IN) :: size    ! Buffer size
-    CHARACTER(LEN=*), INTENT(INOUT) :: buf ! Buffer to hold attribute name
-    INTEGER, INTENT(OUT) :: hdferr ! Error code:
-                                   ! name length is successful, -1 if fail
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5aget_name_c(attr_id, size, buf)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AGET_NAME_C'::h5aget_name_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(SIZE_T), INTENT(IN) :: size
-         CHARACTER(LEN=*), INTENT(OUT) :: buf
-       END FUNCTION h5aget_name_c
-    END INTERFACE
-
-    hdferr = h5aget_name_c(attr_id, size, buf)
-  END SUBROUTINE h5aget_name_f
-
-!
-!****s* H5A/h5aget_name_by_idx_f
-!
-! NAME
-!  h5aget_name_by_idx_f
-!
-! PURPOSE
-!  Gets an attribute name, by attribute index position.
-!
-! INPUTS
-!  loc_id 	 - Location of object to which attribute is attached
-!  obj_name 	 - Name of object to which attribute is attached, relative to location
-!  idx_type 	 - Type of index; Possible values are:
-!                   H5_INDEX_UNKNOWN_F = -1  - Unknown index type
-!                   H5_INDEX_NAME_F 	     - Index on names
-!                   H5_INDEX_CRT_ORDER_F     - Index on creation order
-!                   H5_INDEX_N_F 	     - Number of indices defined
-!
-!  order 	 - Order in which to iterate over index; Possible values are:
-!                   H5_ITER_UNKNOWN_F 	 - Unknown order
-!                   H5_ITER_INC_F 	 - Increasing order
-!                   H5_ITER_DEC_F 	 - Decreasing order
-!                   H5_ITER_NATIVE_F 	 - No particular order, whatever is fastest
-!                   H5_ITER_N_F 	 - Number of iteration orders
-!  order 	 - Index traversal order
-!  n 	         - Attribute’s position in index
-!
-! OUTPUTS
-!  name 	 - Attribute name
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! OPTIONAL PARAMETERS
-!  lapl_id 	 - Link access property list
-!  size 	 - Size, in bytes, of attribute name
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  January, 2008
-!
-! SOURCE
-  SUBROUTINE h5aget_name_by_idx_f(loc_id, obj_name, idx_type, order, &
-       n, name, hdferr, size, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id      ! Identifer for object to which attribute is attached
-    CHARACTER(LEN=*), INTENT(IN) :: obj_name  ! Name of object, relative to location,
-                                              !  from which attribute is to be removed *TEST* check NULL
-    INTEGER, INTENT(IN) :: idx_type ! Type of index; Possible values are:
-                                    !    H5_INDEX_UNKNOWN_F   - Unknown index type
-                                    !    H5_INDEX_NAME_F       - Index on names
-                                    !    H5_INDEX_CRT_ORDER_F  - Index on creation order
-                                    !    H5_INDEX_N_F 	      - Number of indices defined
-
-    INTEGER, INTENT(IN) :: order    ! Order in which to iterate over index; Possible values are:
-                                    !    H5_ITER_UNKNOWN_F   - Unknown order
-                                    !    H5_ITER_INC_F      - Increasing order
-                                    !    H5_ITER_DEC_F       - Decreasing order
-                                    !    H5_ITER_NATIVE_F    - No particular order, whatever is fastest
-                                    !    H5_ITER_N_F 	    - Number of iteration orders
-    INTEGER(HSIZE_T), INTENT(IN) :: n !  Attribute’s position in index
-    CHARACTER(LEN=*), INTENT(OUT) :: name ! Attribute name
-    INTEGER, INTENT(OUT) :: hdferr    ! Error code:
-                                      ! Returns attribute name size,
-                                      ! -1 if fail
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list
-    INTEGER(SIZE_T), OPTIONAL, INTENT(OUT) :: size  ! Indicates the size, in the number of characters, 
-                                                    ! of the attribute
-!*****
-    INTEGER(HID_T) :: lapl_id_default
-    INTEGER(SIZE_T) :: obj_namelen
-    INTEGER(SIZE_T) :: size_default
-
-    INTERFACE
-       INTEGER FUNCTION h5aget_name_by_idx_c(loc_id, obj_name, obj_namelen, idx_type, order, &
-            n, name, size_default, lapl_id_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AGET_NAME_BY_IDX_C'::h5aget_name_by_idx_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: obj_name, name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: obj_name
-         INTEGER, INTENT(IN) :: idx_type
-         INTEGER, INTENT(IN) :: order
-         INTEGER(HSIZE_T), INTENT(IN) :: n
-
-         CHARACTER(LEN=*), INTENT(OUT) :: name
-         INTEGER(SIZE_T) :: size_default
-         INTEGER(HID_T) :: lapl_id_default
-         INTEGER(SIZE_T) :: obj_namelen
-       END FUNCTION h5aget_name_by_idx_c
-    END INTERFACE
-
-    obj_namelen = LEN(obj_name)
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    size_default = LEN(name)
-
-    hdferr = h5aget_name_by_idx_c(loc_id, obj_name, obj_namelen, idx_type, order, &
-         n, name, size_default, lapl_id_default)
-
-    IF(PRESENT(size)) size = size_default
-
-
-  END SUBROUTINE h5aget_name_by_idx_f
-!
-!****s* H5A/h5aget_num_attrs_f
-!
-! NAME
-!  h5aget_num_attrs_f
-!
-! PURPOSE
-!  Determines the number of attributes attached to an object.
-!
-! INPUTS
-!  obj_id 	 - object (group, dataset, or named datatype)
-!  identifier
-! OUTPUTS
-!  attr_num 	 - number of attributes attached to the object
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces are added for
-!  called C functions (it is needed for Windows
-!  port).  February 27, 2001
-!
-! SOURCE
-  SUBROUTINE h5aget_num_attrs_f(obj_id, attr_num, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: obj_id  ! Object identifier
-    INTEGER, INTENT(OUT) :: attr_num      ! Number of attributes of the object
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5aget_num_attrs_c(obj_id, attr_num)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AGET_NUM_ATTRS_C'::h5aget_num_attrs_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: obj_id
-         INTEGER, INTENT(OUT) :: attr_num
-       END FUNCTION h5aget_num_attrs_c
-    END INTERFACE
-
-    hdferr = h5aget_num_attrs_c(obj_id, attr_num)
-  END SUBROUTINE h5aget_num_attrs_f
-
-!
-!****s* H5A/h5adelete_f
-!
-! NAME
-!  h5adelete_f
-!
-! PURPOSE
-!  Deletes an attribute of an object (group, dataset or
-!  named datatype)
-!
-! INPUTS
-!  obj_id 	 - object identifier
-!  name 	 - attribute name
-! OUTPUTS
-!
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces are added for
-!  called C functions (it is needed for Windows
-!  port).  February 27, 2001
-!
-! SOURCE
-  SUBROUTINE h5adelete_f(obj_id, name, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: obj_id  ! Object identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Attribute name
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTEGER(SIZE_T) :: namelen
-
-    INTERFACE
-       INTEGER FUNCTION h5adelete_c(obj_id, name, namelen)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5ADELETE_C'::h5adelete_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: obj_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER(SIZE_T) :: namelen
-       END FUNCTION h5adelete_c
-    END INTERFACE
-
-    namelen = LEN(name)
-    hdferr = h5adelete_c(obj_id, name, namelen)
-  END SUBROUTINE h5adelete_f
-
-!
-!****s* H5A/h5aclose_f
-!
-! NAME
-!  h5aclose_f
-!
-! PURPOSE
-!  Closes the specified attribute.
-!
-! INPUTS
-!  attr_id  - attribute identifier
-! OUTPUTS
-!
-!  hdferr   - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces are added for
-!  called C functions (it is needed for Windows
-!  port).  February 27, 2001
-! SOURCE
-  SUBROUTINE h5aclose_f(attr_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id  ! Attribute identifier
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5aclose_c(attr_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5ACLOSE_C'::h5aclose_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-       END FUNCTION h5aclose_c
-    END INTERFACE
-
-    hdferr = h5aclose_c(attr_id)
-  END SUBROUTINE h5aclose_f
-
-!
-!****s* H5A/h5aget_storage_size_f
-!
-! NAME
-!  h5aget_storage_size_f
-!
-! PURPOSE
-!  Returns the amount of storage required for an attribute.
-!
-! INPUTS
-!  attr_id 	 - attribute identifier
-! OUTPUTS
-!  size 	 - attribute storage size
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  M. Scot Breitenfeld
-!  January, 2008
-!
-! SOURCE
-  SUBROUTINE h5aget_storage_size_f(attr_id, size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id  ! Attribute identifier
-    INTEGER(HSIZE_T), INTENT(OUT) :: size  ! Attribute storage requirement
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5aget_storage_size_c(attr_id, size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AGET_STORAGE_SIZE_C'::h5aget_storage_size_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HSIZE_T), INTENT(OUT) :: size
-       END FUNCTION h5aget_storage_size_c
-    END INTERFACE
-
-    hdferr = h5aget_storage_size_c(attr_id, size)
-  END SUBROUTINE h5aget_storage_size_f
-
-!
-!****s* H5A/h5aget_create_plist_f
-!
-! NAME
-!  h5aget_create_plist_f
-!
-! PURPOSE
-!  Gets an attribute creation property list identifier
-!
-! INPUTS
-!  attr_id 	    - Identifier of the attribute
-! OUTPUTS
-!  creation_prop_id - Identifier for the attribute’s creation property
-!  hdferr 	    - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  January, 2008
-!
-! SOURCE
-  SUBROUTINE h5aget_create_plist_f(attr_id, creation_prop_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id  ! Identifier of the attribute
-    INTEGER(HID_T), INTENT(OUT) :: creation_prop_id   ! Identifier for the attribute’s creation property
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5aget_create_plist_c(attr_id, creation_prop_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AGET_CREATE_PLIST_C'::h5aget_create_plist_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(OUT) :: creation_prop_id
-       END FUNCTION h5aget_create_plist_c
-    END INTERFACE
-
-    hdferr = h5aget_create_plist_c(attr_id, creation_prop_id)
-  END SUBROUTINE h5aget_create_plist_f
-
-!
-!****s* H5A/h5arename_by_name_f
-!
-! NAME
-!  h5arename_by_name_f
-!
-! PURPOSE
-!  Renames an attribute
-!
-! INPUTS
-!  loc_id 	 - Location or object identifier; may be dataset or group
-!  obj_name 	 - Name of object, relative to location,
-!                  whose attribute is to be renamed
-!  old_attr_name - Prior attribute name
-!  new_attr_name - New attribute name
-!  lapl_id 	 - Link access property list identifier
-!
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  January, 2008
-!
-! SOURCE
-  SUBROUTINE h5arename_by_name_f(loc_id, obj_name, old_attr_name, new_attr_name, &
-        hdferr, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id    ! Object identifier
-    CHARACTER(LEN=*), INTENT(IN) :: obj_name  ! Name of object, relative to location,
-                                              !  whose attribute is to be renamed
-    CHARACTER(LEN=*), INTENT(IN) :: old_attr_name ! Prior attribute name
-    CHARACTER(LEN=*), INTENT(IN) :: new_attr_name ! New attribute name
-
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
-                                         ! 0 on success and -1 on failure
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list identifier
-!*****
-    INTEGER(HID_T) :: lapl_id_default
-    INTEGER(SIZE_T) :: obj_namelen
-    INTEGER(SIZE_T) :: old_attr_namelen
-    INTEGER(SIZE_T) :: new_attr_namelen
-
-    INTERFACE
-       INTEGER FUNCTION h5arename_by_name_c(loc_id, obj_name, obj_namelen, &
-            old_attr_name, old_attr_namelen, new_attr_name, new_attr_namelen, &
-            lapl_id_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5ARENAME_BY_NAME_C'::h5arename_by_name_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: obj_name, old_attr_name, new_attr_name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: obj_name
-         INTEGER(SIZE_T) :: obj_namelen
-         CHARACTER(LEN=*), INTENT(IN) :: old_attr_name
-         INTEGER(SIZE_T) :: old_attr_namelen
-         CHARACTER(LEN=*), INTENT(IN) :: new_attr_name
-         INTEGER(SIZE_T) :: new_attr_namelen
-         INTEGER(HID_T) :: lapl_id_default
-
-       END FUNCTION h5arename_by_name_c
-    END INTERFACE
-
-    obj_namelen = LEN(obj_name)
-    old_attr_namelen = LEN(old_attr_name)
-    new_attr_namelen = LEN(new_attr_name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default=lapl_id
-
-    hdferr = h5arename_by_name_c(loc_id, obj_name, obj_namelen, &
-         old_attr_name, old_attr_namelen, new_attr_name, new_attr_namelen, &
-         lapl_id_default)
-
-  END SUBROUTINE h5arename_by_name_f
-
-!
-!****s* H5A/h5aopen_f
-!
-! NAME
-!  h5aopen_f
-!
-! PURPOSE
-!  Opens an attribute for an object specified by object
-!  identifier and attribute name
-!
-! INPUTS
-!  obj_id 	 - Identifer for object to which attribute is attached
-!  attr_name 	 - Name of attribute to open
-! OUTPUTS
-!  attr_id 	 - attribute identifier
-
-! OPTIONAL PARAMETERS
-!  aapl_id 	 - Attribute access property list
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  January, 2008
-!
-! SOURCE
-  SUBROUTINE h5aopen_f(obj_id, attr_name, attr_id, hdferr, aapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: obj_id      ! Object identifier
-    CHARACTER(LEN=*), INTENT(IN) :: attr_name ! Attribute name
-    INTEGER(HID_T), INTENT(OUT) :: attr_id    ! Attribute identifier
-    INTEGER, INTENT(OUT) :: hdferr            ! Error code
-                                              !   Success:  0
-                                              !   Failure: -1
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: aapl_id     ! Attribute access property list
-!*****
-    INTEGER(HID_T) :: aapl_id_default
-
-    INTEGER(SIZE_T) :: attr_namelen
-
-    INTERFACE
-       INTEGER FUNCTION h5aopen_c(obj_id, attr_name, attr_namelen, aapl_id_default, attr_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AOPEN_C'::h5aopen_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: attr_name
-         INTEGER(HID_T), INTENT(IN) :: obj_id
-         CHARACTER(LEN=*), INTENT(IN) :: attr_name
-         INTEGER(HID_T) :: aapl_id_default
-         INTEGER(SIZE_T) :: attr_namelen
-         INTEGER(HID_T), INTENT(OUT) :: attr_id
-       END FUNCTION h5aopen_c
-    END INTERFACE
-
-    attr_namelen = LEN(attr_name)
-
-    aapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(aapl_id)) aapl_id_default = aapl_id
-
-    hdferr = h5aopen_c(obj_id, attr_name, attr_namelen, aapl_id_default, attr_id)
-
-  END SUBROUTINE h5aopen_f
-
-!
-!****s* H5A/h5adelete_by_idx_f
-!
-! NAME
-!  h5adelete_by_idx_f
-!
-! PURPOSE
-!  Deletes an attribute from an object according to index order
-!
-! INPUTS
-!  loc_id 	 - Location or object identifier; may be dataset or group
-!  obj_name 	 - Name of object, relative to location, from which attribute is to be removed
-!  idx_type 	 - Type of index; Possible values are:
-!                   H5_INDEX_UNKNOWN_F = -1  - Unknown index type
-!                   H5_INDEX_NAME_F 	     - Index on names
-!                   H5_INDEX_CRT_ORDER_F     - Index on creation order
-!                   H5_INDEX_N_F 	     - Number of indices defined
-!
-!  order 	 - Order in which to iterate over index; Possible values are:
-!                   H5_ITER_UNKNOWN_F 	 - Unknown order
-!                   H5_ITER_INC_F 	 - Increasing order
-!                   H5_ITER_DEC_F 	 - Decreasing order
-!                   H5_ITER_NATIVE_F 	 - No particular order, whatever is fastest
-!                   H5_ITER_N_F 	 - Number of iteration orders
-!
-!  n 	         - Offset within index
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  lapl_id 	 - Link access property list
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  January, 2008
-!
-! SOURCE
-  SUBROUTINE h5adelete_by_idx_f(loc_id, obj_name, idx_type, order, n, hdferr, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id      ! Identifer for object to which attribute is attached
-    CHARACTER(LEN=*), INTENT(IN) :: obj_name  ! Name of object, relative to location,
-                                              !  from which attribute is to be removed
-    INTEGER, INTENT(IN) :: idx_type           ! Type of index; Possible values are:
-                                              !    H5_INDEX_UNKNOWN_F   - Unknown index type
-                                              !    H5_INDEX_NAME_F      - Index on names
-                                              !    H5_INDEX_CRT_ORDER_F - Index on creation order
-                                              !    H5_INDEX_N_F	      - Number of indices defined
-
-    INTEGER, INTENT(IN) :: order              ! Order in which to iterate over index; Possible values are:
-                                              !    H5_ITER_UNKNOWN_F  - Unknown order
-                                              !    H5_ITER_INC_F      - Increasing order
-                                              !    H5_ITER_DEC_F      - Decreasing order
-                                              !    H5_ITER_NATIVE_F   - No particular order, whatever is fastest
-                                              !    H5_ITER_N_F	    - Number of iteration orders
-    INTEGER(HSIZE_T), INTENT(IN) :: n         ! Offset within index
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code:
-                                           ! 0 on success and -1 on failure
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list
-!*****
-    INTEGER(SIZE_T) :: obj_namelen
-    INTEGER(HID_T) :: lapl_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5adelete_by_idx_c(loc_id, obj_name, obj_namelen, idx_type, order, n, lapl_id_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5ADELETE_BY_IDX_C'::h5adelete_by_idx_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: obj_name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: obj_name
-         INTEGER, INTENT(IN) :: idx_type
-         INTEGER, INTENT(IN) :: order
-         INTEGER(HSIZE_T), INTENT(IN) :: n
-         INTEGER(HID_T) :: lapl_id_default
-         INTEGER(SIZE_T) :: obj_namelen
-       END FUNCTION h5adelete_by_idx_c
-    END INTERFACE
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    obj_namelen = LEN(obj_name)
-    hdferr = h5adelete_by_idx_c(loc_id, obj_name, obj_namelen, idx_type, order, n, lapl_id_default)
-
-  END SUBROUTINE h5adelete_by_idx_f
-
-!
-!****s* H5A/h5adelete_by_name_f
-!
-! NAME
-!  h5adelete_by_name_f
-!
-! PURPOSE
-!  Removes an attribute from a specified location
-!
-! INPUTS
-!  loc_id 	 - Identifer for object to which attribute is attached
-!  obj_name 	 - Name of attribute to open
-!  attr_name 	 - Attribute access property list
-!  lapl_id 	 - Link access property list
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  January, 2008
-!
-! SOURCE
-  SUBROUTINE h5adelete_by_name_f(loc_id, obj_name, attr_name, hdferr, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id      ! Identifer for object to which attribute is attached
-    CHARACTER(LEN=*), INTENT(IN) :: obj_name  ! Name of object, relative to location,
-                                              !  from which attribute is to be removed
-    CHARACTER(LEN=*), INTENT(IN) :: attr_name ! Name of attribute to delete
-    INTEGER, INTENT(OUT) :: hdferr            ! Error code:
-                                              ! 0 on success and -1 on failure
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list
-!*****
-    INTEGER(SIZE_T) :: attr_namelen
-    INTEGER(SIZE_T) :: obj_namelen
-
-    INTEGER(HID_T) :: lapl_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5adelete_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, lapl_id_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5ADELETE_BY_NAME_C'::h5adelete_by_name_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: obj_name, attr_name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: obj_name
-         CHARACTER(LEN=*), INTENT(IN) :: attr_name
-         INTEGER(HID_T) :: lapl_id_default
-         INTEGER(SIZE_T) :: attr_namelen
-         INTEGER(SIZE_T) :: obj_namelen
-       END FUNCTION h5adelete_by_name_c
-    END INTERFACE
-
-    obj_namelen = LEN(obj_name)
-    attr_namelen = LEN(attr_name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5adelete_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, lapl_id_default)
-
-  END SUBROUTINE h5adelete_by_name_f
-
-!
-!****s* H5A/h5aopen_by_idx_f
-!
-! NAME
-!  h5aopen_by_idx_f
-!
-! PURPOSE
-!  Opens an existing attribute that is attached to an object specified by location and name
-!
-! INPUTS
-!  loc_id 	 - Location of object to which attribute is attached
-!  obj_name 	 - Name of object to which attribute is attached, relative to location
-!  idx_type 	 - Type of index
-!  order 	 - Index traversal order
-!  n 	         - Attribute’s position in index
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  aapl_id 	 - Attribute access property list
-!  lapl_id 	 - Link access property list
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  January, 2008
-!
-! SOURCE
-  SUBROUTINE h5aopen_by_idx_f(loc_id, obj_name, idx_type, order, n, attr_id, hdferr, aapl_id, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id      ! Object identifier
-    CHARACTER(LEN=*), INTENT(IN) :: obj_name  ! Name of object to which attribute is attached
-    INTEGER, INTENT(IN) :: idx_type           ! Type of index; Possible values are:
-                                              !    H5_INDEX_UNKNOWN_F   - Unknown index type
-                                              !    H5_INDEX_NAME_F      - Index on names
-                                              !    H5_INDEX_CRT_ORDER_F - Index on creation order
-                                              !    H5_INDEX_N_F	      - Number of indices defined
-    INTEGER, INTENT(IN) :: order              ! Order in which to iterate over index; Possible values are:
-                                              !    H5_ITER_UNKNOWN_F  - Unknown order
-                                              !    H5_ITER_INC_F      - Increasing order
-                                              !    H5_ITER_DEC_F      - Decreasing order
-                                              !    H5_ITER_NATIVE_F   - No particular order, whatever is fastest
-
-    INTEGER(HSIZE_T), INTENT(IN) :: n       ! Attribute’s position in index
-
-    INTEGER(HID_T), INTENT(OUT) :: attr_id  ! Attribute identifier
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code:
-                                            ! 0 on success and -1 on failure
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: aapl_id  ! Attribute access property list
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id  ! Link access property list
-!*****
-    INTEGER(SIZE_T) :: obj_namelen
-    INTEGER(HID_T) :: aapl_id_default
-    INTEGER(HID_T) :: lapl_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5aopen_by_idx_c(loc_id, obj_name, obj_namelen, idx_type, order, n, &
-            aapl_id_default, lapl_id_default, attr_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AOPEN_BY_IDX_C'::h5aopen_by_idx_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: obj_name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: obj_name
-         INTEGER, INTENT(IN) :: idx_type
-         INTEGER, INTENT(IN) :: order
-         INTEGER(HSIZE_T), INTENT(IN) :: n
-         INTEGER(HID_T) :: aapl_id_default
-         INTEGER(HID_T) :: lapl_id_default
-         INTEGER(SIZE_T) :: obj_namelen
-         INTEGER(HID_T), INTENT(OUT) :: attr_id  ! Attribute identifier
-       END FUNCTION h5aopen_by_idx_c
-    END INTERFACE
-
-    obj_namelen = LEN(obj_name)
-
-    aapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(aapl_id)) aapl_id_default = aapl_id
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5aopen_by_idx_c(loc_id, obj_name, obj_namelen, idx_type, order, n, &
-         aapl_id_default, lapl_id_default, attr_id)
-
-  END SUBROUTINE h5aopen_by_idx_f
-
-!
-!****s* H5A/h5aget_info_f
-!
-! NAME
-!  h5aget_info_f
-!
-! PURPOSE
-!  Retrieves attribute information, by attribute identifier
-!
-! INPUTS
-!  attr_id 	 - attribute identifier
-!
-! OUTPUTS
-!  NOTE: In C it is defined as a structure: H5A_info_t
-!
-!  corder_valid  - indicates whether the creation order data is valid for this attribute
-!  corder 	 - is a positive integer containing the creation order of the attribute
-!  cset 	 - indicates the character set used for the attribute’s name
-!  data_size 	 - indicates the size, in the number of characters, of the attribute
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  M. Scot Breitenfeld
-!  January, 2008
-! SOURCE
-  SUBROUTINE h5aget_info_f(attr_id, f_corder_valid, corder, cset, data_size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id  ! Attribute identifier
-
-    LOGICAL, INTENT(OUT) :: f_corder_valid ! Indicates whether the creation order data is valid for this attribute
-    INTEGER, INTENT(OUT) :: corder ! Is a positive integer containing the creation order of the attribute
-    INTEGER, INTENT(OUT) :: cset   ! Indicates the character set used for the attribute’s name
-    INTEGER(HSIZE_T), INTENT(OUT) :: data_size ! Indicates the size, in the number of characters, of the attribute
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
-                                         ! 0 on success and -1 on failure
-!*****
-    INTEGER :: corder_valid
-
-    INTERFACE
-       INTEGER FUNCTION h5aget_info_c(attr_id, corder_valid, corder, cset, data_size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AGET_INFO_C'::h5aget_info_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-
-         INTEGER, INTENT(OUT) :: corder_valid
-         INTEGER, INTENT(OUT) :: corder
-         INTEGER, INTENT(OUT) :: cset
-         INTEGER(HSIZE_T), INTENT(OUT) :: data_size
-       END FUNCTION h5aget_info_c
-    END INTERFACE
-
-    hdferr = h5aget_info_c(attr_id, corder_valid, corder, cset, data_size)
-
-    f_corder_valid =.FALSE.
-    IF (corder_valid .EQ. 1) f_corder_valid =.TRUE.
-
-
-  END SUBROUTINE h5aget_info_f
-
-!
-!****s* H5A/h5aget_info_by_idx_f
-!
-! NAME
-!  h5aget_info_by_idx_f
-!
-! PURPOSE
-!  Retrieves attribute information, by attribute index position
-!
-! INPUTS
-!  loc_id 	 - Location of object to which attribute is attached
-!  obj_name 	 - Name of object to which attribute is attached, relative to location
-!  idx_type 	 - Type of index
-!  order 	 - Index traversal order
-!  n 	         - Attribute’s position in index
-!
-! OUTPUTS  NOTE: In C it is defined as a structure: H5A_info_t
-!  corder_valid  - indicates whether the creation order data is valid for this attribute
-!  corder 	 - is a positive integer containing the creation order of the attribute
-!  cset 	 - indicates the character set used for the attribute’s name
-!  data_size 	 - indicates the size, in the number of characters, of the attribute
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  lapl_id 	 - Link access property list
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  January, 2008
-!
-! SOURCE
-  SUBROUTINE h5aget_info_by_idx_f(loc_id, obj_name, idx_type, order, n, &
-       f_corder_valid, corder, cset, data_size, hdferr, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id      ! Object identifier
-    CHARACTER(LEN=*), INTENT(IN) :: obj_name  ! Name of object to which attribute is attached
-    INTEGER, INTENT(IN) :: idx_type           ! Type of index; Possible values are:
-                                              !    H5_INDEX_UNKNOWN_F   - Unknown index type
-                                              !    H5_INDEX_NAME_F      - Index on names
-                                              !    H5_INDEX_CRT_ORDER_F - Index on creation order
-                                              !    H5_INDEX_N_F	      - Number of indices defined
-    INTEGER, INTENT(IN) :: order              ! Order in which to iterate over index; Possible values are:
-                                              !    H5_ITER_UNKNOWN_F  - Unknown order
-                                              !    H5_ITER_INC_F      - Increasing order
-                                              !    H5_ITER_DEC_F      - Decreasing order
-                                              !    H5_ITER_NATIVE_F   - No particular order, whatever is fastest
-
-    INTEGER(HSIZE_T), INTENT(IN) :: n         ! Attribute’s position in index
-
-
-    LOGICAL, INTENT(OUT) :: f_corder_valid ! Indicates whether the creation order data is valid for this attribute
-    INTEGER, INTENT(OUT) :: corder ! Is a positive integer containing the creation order of the attribute
-    INTEGER, INTENT(OUT) :: cset   ! Indicates the character set used for the attribute’s name
-    INTEGER(HSIZE_T), INTENT(OUT) :: data_size ! Indicates the size, in the number of characters, of the attribute
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
-                                         ! 0 on success and -1 on failure
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id  ! Link access property list
-!*****
-    INTEGER :: corder_valid
-    INTEGER(SIZE_T)  :: obj_namelen
-    INTEGER(HID_T) :: lapl_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5aget_info_by_idx_c(loc_id, obj_name, obj_namelen, idx_type, order, n, lapl_id_default, &
-            corder_valid, corder, cset, data_size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AGET_INFO_BY_IDX_C'::h5aget_info_by_idx_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: obj_name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: obj_name
-         INTEGER, INTENT(IN) :: idx_type
-         INTEGER, INTENT(IN) :: order
-         INTEGER(HSIZE_T), INTENT(IN) :: n
-         INTEGER(HID_T) :: lapl_id_default
-         INTEGER, INTENT(OUT) :: corder_valid
-         INTEGER, INTENT(OUT) :: corder
-         INTEGER, INTENT(OUT) :: cset
-         INTEGER(HSIZE_T), INTENT(OUT) :: data_size
-
-         INTEGER(SIZE_T)  :: obj_namelen
-       END FUNCTION h5aget_info_by_idx_c
-    END INTERFACE
-
-    obj_namelen = LEN(obj_name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(present(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5aget_info_by_idx_c(loc_id, obj_name, obj_namelen, idx_type, order, n, lapl_id_default, &
-            corder_valid, corder, cset, data_size)
-
-    f_corder_valid =.FALSE.
-    IF (corder_valid .EQ. 1) f_corder_valid =.TRUE.
-
-  END SUBROUTINE h5aget_info_by_idx_f
-
-!
-!****s* H5A/h5aget_info_by_name_f
-!
-! NAME
-!  h5aget_info_by_name_f
-!
-! PURPOSE
-!  Retrieves attribute information, by attribute name
-!
-! INPUTS
-!  loc_id 	 - Location of object to which attribute is attached
-!  obj_name 	 - Name of object to which attribute is attached, relative to location
-!  attr_name 	 - Attribute name
-!
-! OUTPUTS  NOTE: In C it is defined as a structure: H5A_info_t
-!  corder_valid  - indicates whether the creation order data is valid for this attribute
-!  corder 	 - is a positive integer containing the creation order of the attribute
-!  cset 	 - indicates the character set used for the attribute’s name
-!  data_size 	 - indicates the size, in the number of characters, of the attribute
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  lapl_id 	 - Link access property list
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  January, 2008
-!
-! SOURCE
-  SUBROUTINE h5aget_info_by_name_f(loc_id, obj_name, attr_name, &
-       f_corder_valid, corder, cset, data_size, hdferr, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id    ! Object identifier
-    CHARACTER(LEN=*), INTENT(IN) :: obj_name ! Name of object to which attribute is attached
-    CHARACTER(LEN=*), INTENT(IN) :: attr_name ! Attribute name
-
-
-    LOGICAL, INTENT(OUT) :: f_corder_valid ! Indicates whether the creation order data is valid for this attribute
-    INTEGER, INTENT(OUT) :: corder ! Is a positive integer containing the creation order of the attribute
-    INTEGER, INTENT(OUT) :: cset ! Indicates the character set used for the attribute’s name
-    INTEGER(HSIZE_T), INTENT(OUT) :: data_size   ! Indicates the size, in the number of characters, of the attribute
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code:
-                                           ! 0 on success and -1 on failure
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id  ! Link access property list
-!*****
-    INTEGER :: corder_valid
-    INTEGER(SIZE_T)  :: obj_namelen
-    INTEGER(SIZE_T)  :: attr_namelen
-    INTEGER(HID_T) :: lapl_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5aget_info_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, lapl_id_default, &
-            corder_valid, corder, cset, data_size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AGET_INFO_BY_NAME_C'::h5aget_info_by_name_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: obj_name, attr_name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: obj_name
-         INTEGER(SIZE_T), INTENT(IN) :: obj_namelen
-         CHARACTER(LEN=*), INTENT(IN) :: attr_name
-         INTEGER(SIZE_T), INTENT(IN) :: attr_namelen
-         INTEGER(HID_T) :: lapl_id_default
-         INTEGER, INTENT(OUT) :: corder_valid
-         INTEGER, INTENT(OUT) :: corder
-         INTEGER, INTENT(OUT) :: cset
-         INTEGER(HSIZE_T), INTENT(OUT) :: data_size
-
-       END FUNCTION h5aget_info_by_name_c
-    END INTERFACE
-
-    obj_namelen = LEN(obj_name)
-    attr_namelen = LEN(attr_name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5aget_info_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, lapl_id_default, &
-            corder_valid, corder, cset, data_size)
-
-    f_corder_valid =.FALSE.
-    IF (corder_valid .EQ. 1) f_corder_valid =.TRUE.
-
-  END SUBROUTINE h5aget_info_by_name_f
-
-!
-!****s* H5A/h5acreate_by_name_f
-!
-! NAME
-!  h5acreate_by_name_f
-!
-! PURPOSE
-!  Creates an attribute attached to a specified object
-!
-! INPUTS
-!  loc_id 	 - Location or object identifier; may be dataset or group
-!  obj_name 	 - Name, relative to loc_id, of object that attribute is to be attached to
-!  attr_name 	 - Attribute name
-!  type_id 	 - Attribute datatype identifier
-!  space_id 	 - Attribute dataspace identifier
-!
-! OUTPUTS
-!  attr 	 - an attribute identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  acpl_id 	 - Attribute creation property list identifier (Currently not used.)
-!  aapl_id 	 - Attribute access property list identifier (Currently not used.)
-!  lapl_id 	 - Link access property list
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February, 2008
-! SOURCE
-  SUBROUTINE h5acreate_by_name_f(loc_id, obj_name, attr_name, type_id, space_id, attr, hdferr, &
-       acpl_id, aapl_id, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T),   INTENT(IN)  :: loc_id
-    CHARACTER(LEN=*), INTENT(IN)  :: obj_name
-    CHARACTER(LEN=*), INTENT(IN)  :: attr_name
-    INTEGER(HID_T),   INTENT(IN)  :: type_id
-    INTEGER(HID_T),   INTENT(IN)  :: space_id
-    INTEGER(HID_T),   INTENT(OUT) :: attr
-    INTEGER,          INTENT(OUT) :: hdferr
-
-    INTEGER(HID_T),   INTENT(IN), OPTIONAL :: acpl_id
-    INTEGER(HID_T),   INTENT(IN), OPTIONAL :: aapl_id
-    INTEGER(HID_T),   INTENT(IN), OPTIONAL :: lapl_id
-!*****
-    INTEGER(SIZE_T)  :: obj_namelen
-    INTEGER(SIZE_T)  :: attr_namelen
-
-    INTEGER(HID_T) :: acpl_id_default
-    INTEGER(HID_T) :: aapl_id_default
-    INTEGER(HID_T) :: lapl_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5acreate_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, &
-            type_id, space_id, acpl_id_default, aapl_id_default, lapl_id_default, attr)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5ACREATE_BY_NAME_C'::h5acreate_by_name_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: obj_name, attr_name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: obj_name
-         INTEGER(SIZE_T), INTENT(IN) :: obj_namelen
-         CHARACTER(LEN=*), INTENT(IN) :: attr_name
-         INTEGER(SIZE_T), INTENT(IN) :: attr_namelen
-         INTEGER(HID_T), INTENT(IN) :: type_id
-         INTEGER(HID_T), INTENT(IN) :: space_id
-         INTEGER(HID_T) :: acpl_id_default
-         INTEGER(HID_T) :: aapl_id_default
-         INTEGER(HID_T) :: lapl_id_default
-         INTEGER(HID_T), INTENT(OUT) :: attr
-
-       END FUNCTION h5acreate_by_name_c
-    END INTERFACE
-
-    obj_namelen = LEN(obj_name)
-    attr_namelen = LEN(attr_name)
-
-    acpl_id_default = H5P_DEFAULT_F
-    aapl_id_default = H5P_DEFAULT_F
-    lapl_id_default = H5P_DEFAULT_F
-
-    IF(PRESENT(acpl_id)) acpl_id_default = acpl_id
-    IF(PRESENT(aapl_id)) aapl_id_default = aapl_id
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5acreate_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, &
-            type_id, space_id, acpl_id_default, aapl_id_default, lapl_id_default, attr)
-  END SUBROUTINE h5acreate_by_name_f
-
-!
-!****s* H5A/H5Aexists_f
-!
-! NAME
-!  H5Aexists_f
-!
-! PURPOSE
-!  Determines whether an attribute with a given name exists on an object
-!
-! INPUTS
-!  obj_id 	 - Object identifier
-!  attr_name 	 - Attribute name
-!
-! OUTPUTS
-!  attr_exists 	 - attribute exists status
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February, 2008
-!
-! SOURCE
-  SUBROUTINE h5aexists_f(obj_id, attr_name, attr_exists, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: obj_id      ! Object identifier
-    CHARACTER(LEN=*), INTENT(IN) :: attr_name ! Attribute name
-    LOGICAL, INTENT(OUT) :: attr_exists  ! .TRUE. if exists, .FALSE. otherwise
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
-                                         ! 0 on success and -1 on failure
-!*****
-    INTEGER(HID_T) :: attr_exists_c
-    INTEGER(SIZE_T) :: attr_namelen
-
-    INTERFACE
-       INTEGER FUNCTION h5aexists_c(obj_id, attr_name, attr_namelen, attr_exists_c)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AEXISTS_C'::h5aexists_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: attr_name
-         INTEGER(HID_T), INTENT(IN) :: obj_id
-         CHARACTER(LEN=*), INTENT(IN) :: attr_name
-         INTEGER(SIZE_T) :: attr_namelen
-         INTEGER(HID_T) :: attr_exists_c
-       END FUNCTION h5aexists_c
-    END INTERFACE
-
-    attr_namelen = LEN(attr_name)
-
-    hdferr = h5aexists_c(obj_id, attr_name, attr_namelen, attr_exists_c)
-
-    attr_exists = .FALSE.
-    IF(attr_exists_c.GT.0) attr_exists = .TRUE.
-
-  END SUBROUTINE h5aexists_f
-
-!
-!****s* H5A/H5Aexists_by_name_f
-!
-! NAME
-!  H5Aexists_by_name_f
-!
-! PURPOSE
-!  Determines whether an attribute with a given name exists on an object
-!
-! INPUTS
-!  loc_id 	 - Location identifier
-!  obj_name 	 - Object name either relative to loc_id, absolute from the file’s root group, or '.' (a dot)
-!  attr_name 	 - Attribute name
-!
-! OUTPUTS
-!  attr_exists 	 - attribute exists status
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  lapl_id 	 - Link access property list identifier
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February, 2008
-!
-! SOURCE
-  SUBROUTINE h5aexists_by_name_f(loc_id, obj_name, attr_name, attr_exists, hdferr, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id     ! Location identifier
-    CHARACTER(LEN=*), INTENT(IN) :: obj_name ! Object name either relative to loc_id,
-                                             ! absolute from the file’s root group, or '.'
-    CHARACTER(LEN=*), INTENT(IN) :: attr_name ! Attribute name
-    LOGICAL, INTENT(OUT) :: attr_exists ! .TRUE. if exists, .FALSE. otherwise
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code:
-                                        ! 0 on success and -1 on failure
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list identifier
-!*****
-    INTEGER :: attr_exists_c
-    INTEGER(SIZE_T)  :: obj_namelen
-    INTEGER(SIZE_T)  :: attr_namelen
-
-    INTEGER(HID_T) :: lapl_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5aexists_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, lapl_id_default, attr_exists_c)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AEXISTS_BY_NAME_C'::h5aexists_by_name_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: obj_name, attr_name 
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: obj_name
-         INTEGER(SIZE_T), INTENT(IN) :: obj_namelen
-         CHARACTER(LEN=*), INTENT(IN) :: attr_name
-         INTEGER(SIZE_T), INTENT(IN) :: attr_namelen
-         INTEGER(HID_T), INTENT(IN) :: lapl_id_default
-         INTEGER, INTENT(OUT) :: attr_exists_c
-       END FUNCTION h5aexists_by_name_c
-    END INTERFACE
-
-    attr_namelen = LEN(attr_name)
-    obj_namelen = LEN(obj_name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5aexists_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, lapl_id_default, attr_exists_c)
-
-    attr_exists = .FALSE.
-    IF(attr_exists_c.GT.0) attr_exists = .TRUE.
-
-  END SUBROUTINE h5aexists_by_name_f
-!
-!****s* H5A/H5Aopen_by_name_f
-!
-! NAME
-!  H5Aopen_by_name_f
-!
-! PURPOSE
-!  Opens an attribute for an object by object name and attribute name.
-!
-! INPUTS
-!  loc_id 	 - Location from which to find object to which attribute is attached
-!  obj_name 	 - Object name either relative to loc_id, absolute from the file’s root group, or '.' (a dot)
-!  attr_name 	 - Attribute name
-!
-! OUTPUTS
-!  attr_id 	 - attribute identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  aapl_id 	 - Attribute access property list (Currently unused; should be passed in as H5P_DEFAULT.)
-!  lapl_id 	 - Link access property list identifier
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February, 2008
-! SOURCE
-  SUBROUTINE h5aopen_by_name_f(loc_id, obj_name, attr_name, attr_id, hdferr, aapl_id, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id    ! Location identifier
-    CHARACTER(LEN=*), INTENT(IN) :: obj_name ! Object name either relative to loc_id,
-                                             ! absolute from the file’s root group, or '.'
-    CHARACTER(LEN=*), INTENT(IN) :: attr_name ! Attribute name
-    INTEGER(HID_T), INTENT(OUT) :: attr_id ! Attribute identifier
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code:
-                                           ! 0 on success and -1 on failure
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: aapl_id ! Attribute access property list
-                                                    ! (Currently unused; should be passed in as H5P_DEFAULT_F)
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list identifier
-!*****
-    INTEGER(HID_T) :: aapl_id_default
-    INTEGER(HID_T) :: lapl_id_default
-
-    INTEGER(SIZE_T) :: obj_namelen
-    INTEGER(SIZE_T) :: attr_namelen
-
-    INTERFACE
-       INTEGER FUNCTION h5aopen_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, &
-            aapl_id_default, lapl_id_default, attr_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AOPEN_BY_NAME_C'::h5aopen_by_name_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: obj_name, attr_name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: obj_name
-         INTEGER(SIZE_T), INTENT(IN) :: obj_namelen
-         CHARACTER(LEN=*), INTENT(IN) :: attr_name
-         INTEGER(SIZE_T), INTENT(IN) :: attr_namelen
-         INTEGER(HID_T) :: aapl_id_default
-         INTEGER(HID_T) :: lapl_id_default
-         INTEGER(HID_T), INTENT(OUT) :: attr_id
-       END FUNCTION h5aopen_by_name_c
-    END INTERFACE
-
-    attr_namelen = LEN(attr_name)
-    obj_namelen = LEN(obj_name)
-
-    aapl_id_default = H5P_DEFAULT_F
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(aapl_id)) aapl_id_default = aapl_id
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5aopen_by_name_c(loc_id, obj_name, obj_namelen, attr_name, attr_namelen, &
-         aapl_id_default, lapl_id_default, attr_id)
-
-  END SUBROUTINE h5aopen_by_name_f
-
-!
-!****s* H5A/h5arename_f
-!
-! NAME
-!  h5arename_f
-!
-! PURPOSE
-!  Renames an attribute
-!
-! INPUTS
-!  loc_id 	 - Location or object identifier; may be dataset or group
-!  old_attr_name - Prior attribute name
-!  new_attr_name - New attribute name
-!
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  January, 2008
-!
-! HISTORY
-!  N/A
-!
-!
-
-! SOURCE
-  SUBROUTINE h5arename_f(loc_id, old_attr_name, new_attr_name, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id    ! Object identifier
-    CHARACTER(LEN=*), INTENT(IN) :: old_attr_name ! Prior attribute name
-    CHARACTER(LEN=*), INTENT(IN) :: new_attr_name ! New attribute name
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
-                                         ! 0 on success and -1 on failure
-!*****
-    INTEGER(SIZE_T) :: old_attr_namelen
-    INTEGER(SIZE_T) :: new_attr_namelen
-
-    INTERFACE
-       INTEGER FUNCTION h5arename_c(loc_id, &
-            old_attr_name, old_attr_namelen, new_attr_name, new_attr_namelen)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5ARENAME_C'::h5arename_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: old_attr_name, new_attr_name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: old_attr_name
-         INTEGER(SIZE_T) :: old_attr_namelen
-         CHARACTER(LEN=*), INTENT(IN) :: new_attr_name
-         INTEGER(SIZE_T) :: new_attr_namelen
-
-       END FUNCTION h5arename_c
-    END INTERFACE
-
-    old_attr_namelen = LEN(old_attr_name)
-    new_attr_namelen = LEN(new_attr_name)
-
-    hdferr = h5arename_c(loc_id, &
-         old_attr_name, old_attr_namelen, new_attr_name, new_attr_namelen)
-
-  END SUBROUTINE h5arename_f
-
-END MODULE H5A
-
-
diff --git a/fortran/src/H5Aff_F03.f90 b/fortran/src/H5Aff_F03.f90
deleted file mode 100644
index 5278280..0000000
--- a/fortran/src/H5Aff_F03.f90
+++ /dev/null
@@ -1,1267 +0,0 @@
-!****h* ROBODoc/H5A (F03)
-! NAME
-!  H5A_PROVISIONAL
-!
-! FILE
-!  src/fortran/src/H5Aff_F03.f90
-!
-! PURPOSE
-!  This file contains Fortran 90 and Fortran 2003 interfaces for H5A functions.
-!  It contains the same functions as H5Aff_F90.f90 but includes the
-!  Fortran 2003 functions and the interface listings. This file will be compiled
-!  instead of H5Aff_F90.f90 if Fortran 2003 functions are enabled.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!
-!  (A) C_LOC and character strings according to the Fortran 2003 standard:
-!
-!  15.1.2.5 C_LOC(X)
-!
-!  Argument. X shall either
-!
-!  (1) have interoperable type and type parameters and be
-!    (a) a variable that has the TARGET attribute and is interoperable,
-!    (b) an allocated allocatable variable that has the TARGET attribute
-!        and is not an array of zero size, or
-!    (c) an associated scalar pointer, or
-!  (2) be a nonpolymorphic scalar, have no length type parameters, and be
-!    (a) a nonallocatable, nonpointer variable that has the TARGET attribute,
-!    (b) an allocated allocatable variable that has the TARGET attribute, or
-!    (c) an associated pointer.
-!
-!  - When X is a character, for interoperability the standard is:
-!
-!  15.2.1 Interoperability of intrinsic types
-!
-!  ...if the type is character, interoperability also requires that the length type parameter
-!  be omitted or be specified by an initialization expression whose value is one.
-!
-!  THEREFORE compilers that have not extended the standard  require
-!
-!  CHARACTER(LEN=1), TARGET :: chr
-!  or
-!  CHARACTER, TARGET :: chr
-!
-!  (B)
-!                         *** IMPORTANT ***
-!  If you add a new H5A function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5A_PROVISIONAL
-
-  USE H5GLOBAL
-!
-!  On Windows there are no big (integer*8) integers, so overloading
-!  for bug #670 does not work. I have to use DEC compilation directives to make
-!  Windows DEC Visual Fortran and OSF compilers happy and do right things.
-!  05/01/02 EP
-!
-  INTERFACE h5awrite_f
-     MODULE PROCEDURE h5awrite_integer_scalar
-     MODULE PROCEDURE h5awrite_integer_1
-     MODULE PROCEDURE h5awrite_integer_2
-     MODULE PROCEDURE h5awrite_integer_3
-     MODULE PROCEDURE h5awrite_integer_4
-     MODULE PROCEDURE h5awrite_integer_5
-     MODULE PROCEDURE h5awrite_integer_6
-     MODULE PROCEDURE h5awrite_integer_7
-     MODULE PROCEDURE h5awrite_char_scalar
-     MODULE PROCEDURE h5awrite_char_1
-     MODULE PROCEDURE h5awrite_char_2
-     MODULE PROCEDURE h5awrite_char_3
-     MODULE PROCEDURE h5awrite_char_4
-     MODULE PROCEDURE h5awrite_char_5
-     MODULE PROCEDURE h5awrite_char_6
-     MODULE PROCEDURE h5awrite_char_7
-     MODULE PROCEDURE h5awrite_real_scalar
-     MODULE PROCEDURE h5awrite_real_1
-     MODULE PROCEDURE h5awrite_real_2
-     MODULE PROCEDURE h5awrite_real_3
-     MODULE PROCEDURE h5awrite_real_4
-     MODULE PROCEDURE h5awrite_real_5
-     MODULE PROCEDURE h5awrite_real_6
-     MODULE PROCEDURE h5awrite_real_7
-     ! This is the preferred way to call h5awrite
-     ! by passing an address
-     MODULE PROCEDURE h5awrite_ptr
-
-  END INTERFACE
-
-  INTERFACE h5aread_f
-
-     MODULE PROCEDURE h5aread_integer_scalar
-     MODULE PROCEDURE h5aread_integer_1
-     MODULE PROCEDURE h5aread_integer_2
-     MODULE PROCEDURE h5aread_integer_3
-     MODULE PROCEDURE h5aread_integer_4
-     MODULE PROCEDURE h5aread_integer_5
-     MODULE PROCEDURE h5aread_integer_6
-     MODULE PROCEDURE h5aread_integer_7
-     MODULE PROCEDURE h5aread_char_scalar
-     MODULE PROCEDURE h5aread_char_1
-     MODULE PROCEDURE h5aread_char_2
-     MODULE PROCEDURE h5aread_char_3
-     MODULE PROCEDURE h5aread_char_4
-     MODULE PROCEDURE h5aread_char_5
-     MODULE PROCEDURE h5aread_char_6
-     MODULE PROCEDURE h5aread_char_7
-     MODULE PROCEDURE h5aread_real_scalar
-     MODULE PROCEDURE h5aread_real_1
-     MODULE PROCEDURE h5aread_real_2
-     MODULE PROCEDURE h5aread_real_3
-     MODULE PROCEDURE h5aread_real_4
-     MODULE PROCEDURE h5aread_real_5
-     MODULE PROCEDURE h5aread_real_6
-     MODULE PROCEDURE h5aread_real_7
-
-     ! This is the preferred way to call h5aread
-     ! by passing an address
-     MODULE PROCEDURE h5aread_ptr
-
-  END INTERFACE
-
-!  Interface for the function used to pass the C pointer of the buffer
-!  to the C H5Awrite routine
-
-  INTERFACE
-     INTEGER FUNCTION h5awrite_f_c(attr_id, mem_type_id, buf) BIND(C, NAME='h5awrite_f_c')
-       USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
-       USE H5GLOBAL
-       INTEGER(HID_T), INTENT(IN) :: attr_id
-       INTEGER(HID_T), INTENT(IN) :: mem_type_id
-       TYPE(C_PTR), VALUE :: buf
-     END FUNCTION h5awrite_f_c
-  END INTERFACE
-
-!  Interface for the function used to pass the C pointer of the buffer
-!  to the C H5Aread routine
-
-  INTERFACE
-     INTEGER FUNCTION h5aread_f_c(attr_id, mem_type_id, buf) BIND(C, NAME='h5aread_f_c')
-       USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
-       USE H5GLOBAL
-       INTEGER(HID_T), INTENT(IN) :: attr_id
-       INTEGER(HID_T), INTENT(IN) :: mem_type_id
-       TYPE(C_PTR), VALUE :: buf
-     END FUNCTION h5aread_f_c
-  END INTERFACE
-
-CONTAINS
-
-!****s* H5A (F03)/h5awrite_f_F90
-!
-! NAME
-!  h5awrite_f_F90
-!
-! PURPOSE
-!  Writes an attribute.
-!
-! Inputs:
-!  attr_id     - Attribute identifier
-!  memtype_id  - Attribute datatype identifier  (in memory)
-!  dims        - Array to hold corresponding dimension sizes of data buffer buf;
-!                dim(k) has value of the k-th dimension of buffer buf;
-!                values are ignored if buf is a scalar
-!  buf 	       - Data buffer; may be a scalar or an array
-!
-! Outputs:
-!  hdferr      - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces are added for
-!  called C functions (it is needed for Windows
-!  port).  February 27, 2001
-!
-!  dims parameter was added to make code portable;
-!  Aprile 4, 2001
-!
-!  Changed buf intent to INOUT to be consistant
-!  with how the C functions handles it. The pg
-!  compiler will return 0 if a buf value is not set.
-!  February, 2008
-!
-! NOTES
-!  This function is overloaded to write INTEGER,
-!  REAL, DOUBLE PRECISION and CHARACTER buffers
-!  up to 7 dimensions.
-!
-! Fortran90 Interface:
-!!  SUBROUTINE h5awrite_f(attr_id, memtype_id, buf, dims, hdferr) 
-!!    INTEGER(HID_T)  , INTENT(IN)               :: attr_id
-!!    INTEGER(HID_T)  , INTENT(IN)               :: memtype_id
-!!    TYPE            , INTENT(IN)               :: buf
-!!    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-!!    INTEGER         , INTENT(OUT)              :: hdferr
-!*****
-
-
-  SUBROUTINE h5awrite_integer_scalar(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(IN), TARGET :: buf                 ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr                     ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf)
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5awrite_integer_scalar
-
-  SUBROUTINE h5awrite_integer_1(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(IN) , &
-         DIMENSION(dims(1)), TARGET :: buf  ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    TYPE(C_PTR) :: f_ptr
-    
-    f_ptr = C_LOC(buf(1))
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5awrite_integer_1
-
-
-  SUBROUTINE h5awrite_integer_2(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(IN) , &
-         DIMENSION(dims(1),dims(2)), TARGET :: buf
-                                            ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1))
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5awrite_integer_2
-
-  SUBROUTINE h5awrite_integer_3(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    INTEGER, INTENT(IN), DIMENSION(dims(1),dims(2),dims(3)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1))
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5awrite_integer_3
-
-
-  SUBROUTINE h5awrite_integer_4(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims! Array to story buf dimension sizes
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1))
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5awrite_integer_4
-
-
-  SUBROUTINE h5awrite_integer_5(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1,1))
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5awrite_integer_5
-
-
-  SUBROUTINE h5awrite_integer_6(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1,1,1))
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5awrite_integer_6
-
-
-  SUBROUTINE h5awrite_integer_7(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(IN), DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)), &
-         TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1,1,1,1))
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5awrite_integer_7
-
-
-  SUBROUTINE h5awrite_real_scalar(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(IN), TARGET :: buf          ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf)
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5awrite_real_scalar
-
-  SUBROUTINE h5awrite_real_1(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1)), TARGET :: buf  ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1))
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5awrite_real_1
-
-
-  SUBROUTINE h5awrite_real_2(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2)), TARGET :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1))
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5awrite_real_2
-
-
-  SUBROUTINE h5awrite_real_3(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3)), TARGET :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1))
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5awrite_real_3
-
-
-  SUBROUTINE h5awrite_real_4(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)), TARGET :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1))
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5awrite_real_4
-
-
-  SUBROUTINE h5awrite_real_5(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)), TARGET :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf)
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5awrite_real_5
-
-
-  SUBROUTINE h5awrite_real_6(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)), TARGET :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1,1,1))
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5awrite_real_6
-
-
-  SUBROUTINE h5awrite_real_7(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1,1,1,1))
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5awrite_real_7
-
-  SUBROUTINE h5awrite_char_scalar(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id               ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id            ! Attribute datatype
-                                                        !  identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims  ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(IN) :: buf                 ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr                      ! Error code
-
-    CALL h5awrite_char_scalar_fix(attr_id, memtype_id, buf, LEN(buf), dims, hdferr)
-
-  END SUBROUTINE h5awrite_char_scalar
-
-  SUBROUTINE h5awrite_char_scalar_fix(attr_id, memtype_id, buf, buf_len, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id               ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id            ! Attribute datatype
-                                                        !  identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims  ! Array to story buf dimension sizes
-    INTEGER, INTENT(IN)  :: buf_len
-    CHARACTER(LEN=buf_len), INTENT(IN), TARGET :: buf   ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr                      ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1:1))
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5awrite_char_scalar_fix
-
-  SUBROUTINE h5awrite_char_1(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(IN), DIMENSION(dims(1)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1)(1:1))
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5awrite_char_1
-
-  SUBROUTINE h5awrite_char_2(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims  ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2)), TARGET :: buf  ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1)(1:1))
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5awrite_char_2
-
-  SUBROUTINE h5awrite_char_3(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1)(1:1))
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5awrite_char_3
-
-  SUBROUTINE h5awrite_char_4(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1)(1:1))
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5awrite_char_4
-
-  SUBROUTINE h5awrite_char_5(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1,1)(1:1))
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5awrite_char_5
-
-
-  SUBROUTINE h5awrite_char_6(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1,1,1)(1:1))
-
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5awrite_char_6
-
-  SUBROUTINE h5awrite_char_7(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1,1,1,1)(1:1))
-    hdferr = h5awrite_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5awrite_char_7
-
-!****s* H5A (F03)/h5awrite_f_F03
-!
-! NAME
-!  h5awrite_f_F03
-!
-! PURPOSE
-!  Writes an attribute.
-!
-! Inputs:
-!  attr_id     - Attribute identifier
-!  memtype_id  - Attribute datatype identifier  (in memory)
-!  buf 	       - Data buffer; may be a scalar or an array
-!
-! Outputs:
-!  hdferr      - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces are added for
-!  called C functions (it is needed for Windows
-!  port).  February 27, 2001
-!
-! NOTES
-!  This function is overloaded to write INTEGER,
-!  REAL, DOUBLE PRECISION and CHARACTER buffers
-!  up to 7 dimensions.
-!
-! Fortran2003 Interface:
-!!  SUBROUTINE h5awrite_f(attr_id, memtype_id, buf, hdferr) 
-!!    INTEGER(HID_T)  , INTENT(IN)  :: attr_id
-!!    INTEGER(HID_T)  , INTENT(IN)  :: memtype_id
-!!    TYPE(C_PTR)     , INTENT(IN)  :: buf
-!!    INTEGER         , INTENT(OUT) :: hdferr
-!*****
-
-  SUBROUTINE h5awrite_ptr(attr_id, mem_type_id, buf, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id     ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    TYPE(C_PTR), INTENT(IN), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr            ! Error code
-
-    hdferr = h5awrite_f_c(attr_id, mem_type_id, buf)
-
-  END SUBROUTINE h5awrite_ptr
-
-!****s* H5A (F03)/h5aread_f_F90
-!
-! NAME
-!  h5aread_f_F90
-!
-! PURPOSE
-!  Reads an attribute.
-!
-! Inputs:
-!  attr_id     - Attribute identifier
-!  memtype_id  - Attribute datatype identifier  (in memory)
-!  dims        - Array to hold corresponding dimension sizes of data buffer buf;
-!                dim(k) has value of the k-th dimension of buffer buf;
-!                values are ignored if buf is a scalar
-!
-! Outputs:
-!  buf 	       - Data buffer; may be a scalar or an array
-!  hdferr      - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces are added for
-!  called C functions (it is needed for Windows
-!  port).  February 27, 2001
-!
-!  dims parameter was added to make code portable;
-!  Aprile 4, 2001
-!
-!  Changed buf intent to INOUT to be consistant
-!  with how the C functions handles it. The pg
-!  compiler will return 0 if a buf value is not set.
-!  February, 2008
-!
-! NOTES
-!  This function is overloaded to write INTEGER,
-!  REAL, DOUBLE PRECISION and CHARACTER buffers
-!  up to 7 dimensions.
-! Fortran90 Interface:
-!!  SUBROUTINE h5aread_f(attr_id, memtype_id, buf, dims, hdferr) 
-!!    INTEGER(HID_T)  , INTENT(IN)               :: attr_id
-!!    INTEGER(HID_T)  , INTENT(IN)               :: memtype_id
-!!    TYPE            , INTENT(INOUT)            :: buf
-!!    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-!!    INTEGER         , INTENT(OUT)              :: hdferr
-!*****
-  SUBROUTINE h5aread_integer_scalar(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(INOUT), TARGET :: buf              ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code 
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf)
-
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5aread_integer_scalar
-
-  SUBROUTINE h5aread_integer_1(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(INOUT), DIMENSION(dims(1)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1))
-
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5aread_integer_1
-
-
-  SUBROUTINE h5aread_integer_2(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(INOUT),DIMENSION(dims(1),dims(2)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1))
-
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5aread_integer_2
-
-
-  SUBROUTINE h5aread_integer_3(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1))
-
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5aread_integer_3
-
-
-  SUBROUTINE h5aread_integer_4(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1))
-
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5aread_integer_4
-
-
-  SUBROUTINE h5aread_integer_5(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1,1))
-
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5aread_integer_5
-
-
-  SUBROUTINE h5aread_integer_6(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1,1,1))
-
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5aread_integer_6
-
-
-  SUBROUTINE h5aread_integer_7(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1,1,1,1))
-
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5aread_integer_7
-
-
-  SUBROUTINE h5aread_real_scalar(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(INOUT), TARGET :: buf                 ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf)
-
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5aread_real_scalar
-
-  SUBROUTINE h5aread_real_1(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1)), TARGET :: buf  ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1))
-
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5aread_real_1
-
-
-  SUBROUTINE h5aread_real_2(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1))
-
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5aread_real_2
-
-
-  SUBROUTINE h5aread_real_3(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3)), TARGET :: buf
-                                            ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1))
-
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5aread_real_3
-
-
-  SUBROUTINE h5aread_real_4(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1))
-
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5aread_real_4
-
-
-  SUBROUTINE h5aread_real_5(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1,1))
-
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5aread_real_5
-
-
-  SUBROUTINE h5aread_real_6(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1,1,1))
-
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5aread_real_6
-
-
-  SUBROUTINE h5aread_real_7(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1,1,1,1))
-
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-  END SUBROUTINE h5aread_real_7
-
-  SUBROUTINE h5aread_char_scalar(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(INOUT) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-
-    CALL h5aread_char_scalar_fix(attr_id, memtype_id, buf, LEN(buf), hdferr)
-
-  END SUBROUTINE h5aread_char_scalar
-
-  SUBROUTINE h5aread_char_scalar_fix(attr_id, memtype_id, buf, buf_len, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER, INTENT(IN)  :: buf_len
-    CHARACTER(LEN=buf_len), INTENT(INOUT), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1:1))
-
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5aread_char_scalar_fix
-
-  SUBROUTINE h5aread_char_1(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1)), TARGET :: buf  ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1)(1:1))
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5aread_char_1
-
-
-  SUBROUTINE h5aread_char_2(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2)), TARGET :: buf  ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1)(1:1))
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5aread_char_2
-
-
-  SUBROUTINE h5aread_char_3(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1)(1:1))
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5aread_char_3
-
-  SUBROUTINE h5aread_char_4(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1)(1:1))
-
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5aread_char_4
-
-  SUBROUTINE h5aread_char_5(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1,1)(1:1))
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5aread_char_5
-
-
-  SUBROUTINE h5aread_char_6(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1,1,1)(1:1))
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5aread_char_6
-
-
-  SUBROUTINE h5aread_char_7(attr_id, memtype_id, buf, dims, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)), TARGET :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1,1,1,1,1,1,1)(1:1))
-    hdferr = h5aread_f_c(attr_id, memtype_id, f_ptr)
-
-  END SUBROUTINE h5aread_char_7
-
-
-!****s* H5A (F03)/h5aread_f_F03
-!
-! NAME
-!  h5aread_f_F03
-!
-! PURPOSE
-!  Reads an attribute.
-!
-! Inputs:
-!  attr_id     - Attribute identifier
-!  memtype_id  - Attribute datatype identifier  (in memory)
-!
-! Outputs:
-!  buf 	       - Data buffer; may be a scalar or an array
-!  hdferr      - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces are added for
-!  called C functions (it is needed for Windows
-!  port).  February 27, 2001
-!
-!  dims parameter was added to make code portable;
-!  Aprile 4, 2001
-!
-!  Changed buf intent to INOUT to be consistant
-!  with how the C functions handles it. The pg
-!  compiler will return 0 if a buf value is not set.
-!  February, 2008
-!
-! NOTES
-!  This function is overloaded to write INTEGER,
-!  REAL, DOUBLE PRECISION and CHARACTER buffers
-!  up to 7 dimensions.
-! Fortran2003 Interface:
-!!  SUBROUTINE h5aread_f(attr_id, memtype_id, buf, hdferr) 
-!!    INTEGER(HID_T)  , INTENT(IN)    :: attr_id
-!!    INTEGER(HID_T)  , INTENT(IN)    :: memtype_id
-!!    TYPE(C_PTR)     , INTENT(INOUT) :: buf
-!!    INTEGER         , INTENT(OUT)   :: hdferr
-!*****
-
-  SUBROUTINE h5aread_ptr(attr_id, mem_type_id, buf, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id     ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    TYPE(C_PTR), INTENT(INOUT), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr            ! Error code
-
-    hdferr = h5aread_f_c(attr_id, mem_type_id, buf)
-
-  END SUBROUTINE h5aread_ptr
-
-END MODULE H5A_PROVISIONAL
-
-
diff --git a/fortran/src/H5Aff_F90.f90 b/fortran/src/H5Aff_F90.f90
deleted file mode 100644
index 974b023..0000000
--- a/fortran/src/H5Aff_F90.f90
+++ /dev/null
@@ -1,1618 +0,0 @@
-!****h* ROBODoc/H5A (F90)
-!
-! NAME
-!  H5A_PROVISIONAL
-!
-! FILE
-!  fortran/src/H5Aff_F90.f90
-!
-! PURPOSE
-!
-!  This file contains Fortran 90 interfaces for H5A functions. It contains
-!  the same functions as H5Aff_F03.f90 but excludes the Fortran 2003 functions
-!  and the interface listings. This file will be compiled instead of H5Aff_F03.f90
-!  if Fortran 2003 functions are not enabled.
-!
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5A function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5A_PROVISIONAL
-
-  USE H5GLOBAL
-  !
-  !On Windows there are no big (integer*8) integers, so overloading
-  !for bug #670 does not work. I have to use DEC compilation directives to make
-  !Windows DEC Visual Fortran and OSF compilers happy and do right things.
-  !						05/01/02 EP
-  !
-  INTERFACE h5awrite_f
-
-     MODULE PROCEDURE h5awrite_integer_scalar
-     MODULE PROCEDURE h5awrite_integer_1
-     MODULE PROCEDURE h5awrite_integer_2
-     MODULE PROCEDURE h5awrite_integer_3
-     MODULE PROCEDURE h5awrite_integer_4
-     MODULE PROCEDURE h5awrite_integer_5
-     MODULE PROCEDURE h5awrite_integer_6
-     MODULE PROCEDURE h5awrite_integer_7
-     MODULE PROCEDURE h5awrite_char_scalar
-     MODULE PROCEDURE h5awrite_char_1
-     MODULE PROCEDURE h5awrite_char_2
-     MODULE PROCEDURE h5awrite_char_3
-     MODULE PROCEDURE h5awrite_char_4
-     MODULE PROCEDURE h5awrite_char_5
-     MODULE PROCEDURE h5awrite_char_6
-     MODULE PROCEDURE h5awrite_char_7
-     MODULE PROCEDURE h5awrite_real_scalar
-     MODULE PROCEDURE h5awrite_real_1
-     MODULE PROCEDURE h5awrite_real_2
-     MODULE PROCEDURE h5awrite_real_3
-     MODULE PROCEDURE h5awrite_real_4
-     MODULE PROCEDURE h5awrite_real_5
-     MODULE PROCEDURE h5awrite_real_6
-     MODULE PROCEDURE h5awrite_real_7
-
-  END INTERFACE
-
-  INTERFACE h5aread_f
-
-     MODULE PROCEDURE h5aread_integer_scalar
-     MODULE PROCEDURE h5aread_integer_1
-     MODULE PROCEDURE h5aread_integer_2
-     MODULE PROCEDURE h5aread_integer_3
-     MODULE PROCEDURE h5aread_integer_4
-     MODULE PROCEDURE h5aread_integer_5
-     MODULE PROCEDURE h5aread_integer_6
-     MODULE PROCEDURE h5aread_integer_7
-     MODULE PROCEDURE h5aread_char_scalar
-     MODULE PROCEDURE h5aread_char_1
-     MODULE PROCEDURE h5aread_char_2
-     MODULE PROCEDURE h5aread_char_3
-     MODULE PROCEDURE h5aread_char_4
-     MODULE PROCEDURE h5aread_char_5
-     MODULE PROCEDURE h5aread_char_6
-     MODULE PROCEDURE h5aread_char_7
-     MODULE PROCEDURE h5aread_real_scalar
-     MODULE PROCEDURE h5aread_real_1
-     MODULE PROCEDURE h5aread_real_2
-     MODULE PROCEDURE h5aread_real_3
-     MODULE PROCEDURE h5aread_real_4
-     MODULE PROCEDURE h5aread_real_5
-     MODULE PROCEDURE h5aread_real_6
-     MODULE PROCEDURE h5aread_real_7
-  END INTERFACE
-
-CONTAINS
-
-  SUBROUTINE h5awrite_integer_scalar(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims  ! Array to story buf dimension sizes
-    INTEGER, INTENT(IN) :: buf              ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    INTERFACE
-       INTEGER FUNCTION h5awrite_integer_s_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_INTEGER_S_C'::h5awrite_integer_s_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         INTEGER, INTENT(IN)::buf
-       END FUNCTION h5awrite_integer_s_c
-    END INTERFACE
-
-    hdferr = h5awrite_integer_s_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_integer_scalar
-
-  SUBROUTINE h5awrite_integer_1(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(IN) , &
-         DIMENSION(dims(1)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr ! Error code
-    !            INTEGER, EXTERNAL :: h5awrite_integer_1_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_integer_1_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_INTEGER_1_C'::h5awrite_integer_1_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         INTEGER, INTENT(IN), DIMENSION(dims(1)) :: buf
-       END FUNCTION h5awrite_integer_1_c
-    END INTERFACE
-
-    hdferr = h5awrite_integer_1_c(attr_id, memtype_id, buf, dims)
-
-  END SUBROUTINE h5awrite_integer_1
-
-
-  SUBROUTINE h5awrite_integer_2(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(IN) , &
-         DIMENSION(dims(1),dims(2)) :: buf  ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_integer_2_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_integer_2_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_INTEGER_2_C'::h5awrite_integer_2_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         INTEGER, INTENT(IN), DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5awrite_integer_2_c
-    END INTERFACE
-
-    hdferr = h5awrite_integer_2_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_integer_2
-
-
-  SUBROUTINE h5awrite_integer_3(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(IN), DIMENSION(dims(1),dims(2),dims(3)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_integer_3_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_integer_3_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_INTEGER_3_C'::h5awrite_integer_3_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         INTEGER, INTENT(IN), DIMENSION(dims(1),dims(2),dims(3)) :: buf
-       END FUNCTION h5awrite_integer_3_c
-    END INTERFACE
-
-    hdferr = h5awrite_integer_3_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_integer_3
-
-
-  SUBROUTINE h5awrite_integer_4(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_integer_4_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_integer_4_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_INTEGER_4_C'::h5awrite_integer_4_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         INTEGER, INTENT(IN), DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-       END FUNCTION h5awrite_integer_4_c
-    END INTERFACE
-
-    hdferr = h5awrite_integer_4_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_integer_4
-
-
-  SUBROUTINE h5awrite_integer_5(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    INTEGER, INTENT(IN), DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_integer_5_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_integer_5_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_INTEGER_5_C'::h5awrite_integer_5_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         INTEGER, INTENT(IN), DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-       END FUNCTION h5awrite_integer_5_c
-    END INTERFACE
-
-    hdferr = h5awrite_integer_5_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_integer_5
-
-
-  SUBROUTINE h5awrite_integer_6(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_integer_6_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_integer_6_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_INTEGER_6_C'::h5awrite_integer_6_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         INTEGER, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-       END FUNCTION h5awrite_integer_6_c
-    END INTERFACE
-
-    hdferr = h5awrite_integer_6_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_integer_6
-
-
-  SUBROUTINE h5awrite_integer_7(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_integer_7_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_integer_7_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_INTEGER_7_C'::h5awrite_integer_7_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         INTEGER, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-       END FUNCTION h5awrite_integer_7_c
-    END INTERFACE
-
-    hdferr = h5awrite_integer_7_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_integer_7
-
-
-  SUBROUTINE h5awrite_real_scalar(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    REAL, INTENT(IN) :: buf                  ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_real_s_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_real_s_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_REAL_S_C'::h5awrite_real_s_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         REAL, INTENT(IN)::buf
-       END FUNCTION h5awrite_real_s_c
-    END INTERFACE
-
-    hdferr = h5awrite_real_s_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_real_scalar
-
-  SUBROUTINE h5awrite_real_1(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1)) :: buf  ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_real_1_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_real_1_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_REAL_1_C'::h5awrite_real_1_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         REAL, INTENT(IN), &
-              DIMENSION(dims(1)) :: buf
-       END FUNCTION h5awrite_real_1_c
-    END INTERFACE
-
-    hdferr = h5awrite_real_1_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_real_1
-
-
-  SUBROUTINE h5awrite_real_2(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_real_2_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_real_2_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_REAL_2_C'::h5awrite_real_2_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         REAL, INTENT(IN), &
-              DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5awrite_real_2_c
-    END INTERFACE
-
-    hdferr = h5awrite_real_2_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_real_2
-
-
-  SUBROUTINE h5awrite_real_3(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_real_3_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_real_3_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_REAL_3_C'::h5awrite_real_3_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         REAL, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf
-       END FUNCTION h5awrite_real_3_c
-    END INTERFACE
-
-    hdferr = h5awrite_real_3_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_real_3
-
-
-  SUBROUTINE h5awrite_real_4(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_real_4_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_real_4_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_REAL_4_C'::h5awrite_real_4_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         REAL, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-       END FUNCTION h5awrite_real_4_c
-    END INTERFACE
-
-    hdferr = h5awrite_real_4_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_real_4
-
-
-  SUBROUTINE h5awrite_real_5(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_real_5_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_real_5_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_REAL_5_C'::h5awrite_real_5_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         REAL, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-       END FUNCTION h5awrite_real_5_c
-    END INTERFACE
-
-    hdferr = h5awrite_real_5_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_real_5
-
-
-  SUBROUTINE h5awrite_real_6(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_real_6_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_real_6_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_REAL_6_C'::h5awrite_real_6_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         REAL, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-       END FUNCTION h5awrite_real_6_c
-    END INTERFACE
-
-    hdferr = h5awrite_real_6_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_real_6
-
-
-  SUBROUTINE h5awrite_real_7(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_real_7_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_real_7_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_REAL_7_C'::h5awrite_real_7_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         REAL, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-       END FUNCTION h5awrite_real_7_c
-    END INTERFACE
-
-    hdferr = h5awrite_real_7_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_real_7
-
-  SUBROUTINE h5awrite_char_scalar(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*),INTENT(IN) :: buf
-                                             ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    !            INTEGER, EXTERNAL :: h5awritec_s_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awritec_s_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITEC_S_C'::h5awritec_s_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         CHARACTER(LEN=*), INTENT(IN)::buf
-       END FUNCTION h5awritec_s_c
-    END INTERFACE
-
-    hdferr = h5awritec_s_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_char_scalar
-
-  SUBROUTINE h5awrite_char_1(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr ! Error code
-    !            INTEGER, EXTERNAL :: h5awritec_1_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awritec_1_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITEC_1_C'::h5awritec_1_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         CHARACTER(LEN=*), INTENT(IN), DIMENSION(dims(1))::buf
-       END FUNCTION h5awritec_1_c
-    END INTERFACE
-
-    hdferr = h5awritec_1_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_char_1
-
-
-  SUBROUTINE h5awrite_char_2(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2)) :: buf   ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awritec_2_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awritec_2_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITEC_2_C'::h5awritec_2_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         CHARACTER(LEN=*), INTENT(IN), &
-              DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5awritec_2_c
-    END INTERFACE
-
-    hdferr = h5awritec_2_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_char_2
-
-
-  SUBROUTINE h5awrite_char_3(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr ! Error code
-    !            INTEGER, EXTERNAL :: h5awritec_3_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awritec_3_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITEC_3_C'::h5awritec_3_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         CHARACTER(LEN=*), INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf
-       END FUNCTION h5awritec_3_c
-    END INTERFACE
-
-    hdferr = h5awritec_3_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_char_3
-
-
-  SUBROUTINE h5awrite_char_4(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    !            INTEGER, EXTERNAL :: h5awritec_4_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awritec_4_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITEC_4_C'::h5awritec_4_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         CHARACTER(LEN=*), INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-       END FUNCTION h5awritec_4_c
-    END INTERFACE
-
-    hdferr = h5awritec_4_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_char_4
-
-
-  SUBROUTINE h5awrite_char_5(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    !            INTEGER, EXTERNAL :: h5awritec_5_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awritec_5_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITEC_5_C'::h5awritec_5_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         CHARACTER(LEN=*), INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-       END FUNCTION h5awritec_5_c
-    END INTERFACE
-
-    hdferr = h5awritec_5_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_char_5
-
-
-  SUBROUTINE h5awrite_char_6(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    !            INTEGER, EXTERNAL :: h5awritec_6_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awritec_6_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITEC_6_C'::h5awritec_6_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         CHARACTER(LEN=*), INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-       END FUNCTION h5awritec_6_c
-    END INTERFACE
-
-    hdferr = h5awritec_6_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_char_6
-
-
-  SUBROUTINE h5awrite_char_7(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    !            INTEGER, EXTERNAL :: h5awritec_7_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awritec_7_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITEC_7_C'::h5awritec_7_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         CHARACTER(LEN=*), INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-       END FUNCTION h5awritec_7_c
-    END INTERFACE
-
-    hdferr = h5awritec_7_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5awrite_char_7
-
-!
-! NAME
-!  h5aread_f
-!
-! PURPOSE
-!  Reads an attribute.
-!
-! INPUTS
-!		attr_id		- attribute identifier
-!		memtype_id	- attribute memory type identifier
-!		dims		- 1D array of size 7, stores sizes of the
-!				- buf array dimensions.
-! OUTPUTS
-!		buf		- buffer to read attribute data in
-!		hdferr:		- error code
-!				 	Success:  0
-!				 	Failure: -1
-! OPTIONAL PARAMETERS
-!   NONE
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!
-!  Explicit Fortran interfaces are added for
-!  called C functions (it is needed for Windows
-!  port).  February 27, 2001
-!
-!  dims parameter was added to make code portable;
-!  April 4, 2001
-!
-!  Changed buf intent to INOUT to be consistant
-!  with how the C functions handles it. The pg
-!  compiler will return 0 if a buf value is not set.
-!  February, 2008
-!
-! NOTES
-!  This function is overloaded to write INTEGER,
-!  REAL, DOUBLE PRECISION and CHARACTER buffers
-!  up to 7 dimensions.
-!
-
-  SUBROUTINE h5aread_integer_scalar(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(INOUT) :: buf            ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_integer_s_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_integer_s_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_INTEGER_S_C'::h5aread_integer_s_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         INTEGER, INTENT(INOUT)::buf
-       END FUNCTION h5aread_integer_s_c
-    END INTERFACE
-    hdferr = h5aread_integer_s_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_integer_scalar
-
-  SUBROUTINE h5aread_integer_1(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(INOUT), DIMENSION(dims(1)) :: buf  ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_integer_1_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_integer_1_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_INTEGER_1_C'::h5aread_integer_1_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         INTEGER, INTENT(INOUT), DIMENSION(dims(1)) :: buf
-       END FUNCTION h5aread_integer_1_c
-    END INTERFACE
-
-    hdferr = h5aread_integer_1_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_integer_1
-
-
-  SUBROUTINE h5aread_integer_2(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(INOUT),DIMENSION(dims(1),dims(2)) :: buf  ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_integer_2_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_integer_2_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_INTEGER_2_C'::h5aread_integer_2_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         INTEGER, INTENT(INOUT), DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5aread_integer_2_c
-    END INTERFACE
-
-    hdferr = h5aread_integer_2_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_integer_2
-
-
-  SUBROUTINE h5aread_integer_3(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_integer_3_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_integer_3_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_INTEGER_3_C'::h5aread_integer_3_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         INTEGER, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf
-       END FUNCTION h5aread_integer_3_c
-    END INTERFACE
-
-    hdferr = h5aread_integer_3_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_integer_3
-
-
-  SUBROUTINE h5aread_integer_4(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf ! Attribute data
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_integer_4_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_integer_4_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_INTEGER_4_C'::h5aread_integer_4_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         INTEGER, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-       END FUNCTION h5aread_integer_4_c
-    END INTERFACE
-
-    hdferr = h5aread_integer_4_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_integer_4
-
-
-  SUBROUTINE h5aread_integer_5(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_integer_5_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_integer_5_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_INTEGER_5_C'::h5aread_integer_5_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         INTEGER, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-       END FUNCTION h5aread_integer_5_c
-    END INTERFACE
-
-    hdferr = h5aread_integer_5_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_integer_5
-
-
-  SUBROUTINE h5aread_integer_6(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_integer_6_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_integer_6_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_INTEGER_6_C'::h5aread_integer_6_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         INTEGER, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-       END FUNCTION h5aread_integer_6_c
-    END INTERFACE
-
-    hdferr = h5aread_integer_6_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_integer_6
-
-
-  SUBROUTINE h5aread_integer_7(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_integer_7_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_integer_7_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_INTEGER_7_C'::h5aread_integer_7_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         INTEGER, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-       END FUNCTION h5aread_integer_7_c
-    END INTERFACE
-
-    hdferr = h5aread_integer_7_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_integer_7
-
-
-  SUBROUTINE h5aread_real_scalar(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(INOUT) :: buf               ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_real_s_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_real_s_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_REAL_S_C'::h5aread_real_s_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         REAL, INTENT(INOUT)::buf
-       END FUNCTION h5aread_real_s_c
-    END INTERFACE
-
-    hdferr = h5aread_real_s_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_real_scalar
-
-  SUBROUTINE h5aread_real_1(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_real_1_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_real_1_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_REAL_1_C'::h5aread_real_1_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         REAL, INTENT(INOUT), &
-              DIMENSION(dims(1)) :: buf
-       END FUNCTION h5aread_real_1_c
-    END INTERFACE
-
-    hdferr = h5aread_real_1_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_real_1
-
-
-  SUBROUTINE h5aread_real_2(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2)) :: buf  ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_real_2_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_real_2_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_REAL_2_C'::h5aread_real_2_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         REAL, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5aread_real_2_c
-    END INTERFACE
-
-    hdferr = h5aread_real_2_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_real_2
-
-
-  SUBROUTINE h5aread_real_3(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf  ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr                  ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_real_3_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_real_3_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_REAL_3_C'::h5aread_real_3_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         REAL, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf
-       END FUNCTION h5aread_real_3_c
-    END INTERFACE
-
-    hdferr = h5aread_real_3_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_real_3
-
-
-  SUBROUTINE h5aread_real_4(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_real_4_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_real_4_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_REAL_4_C'::h5aread_real_4_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         REAL, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-       END FUNCTION h5aread_real_4_c
-    END INTERFACE
-
-    hdferr = h5aread_real_4_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_real_4
-
-
-  SUBROUTINE h5aread_real_5(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_real_5_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_real_5_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_REAL_5_C'::h5aread_real_5_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         REAL, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-       END FUNCTION h5aread_real_5_c
-    END INTERFACE
-
-    hdferr = h5aread_real_5_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_real_5
-
-
-  SUBROUTINE h5aread_real_6(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_real_6_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_real_6_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_REAL_6_C'::h5aread_real_6_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         REAL, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-       END FUNCTION h5aread_real_6_c
-    END INTERFACE
-
-    hdferr = h5aread_real_6_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_real_6
-
-
-  SUBROUTINE h5aread_real_7(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_real_7_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_real_7_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_REAL_7_C'::h5aread_real_7_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         REAL, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-       END FUNCTION h5aread_real_7_c
-    END INTERFACE
-
-    hdferr = h5aread_real_7_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_real_7
-
-  SUBROUTINE h5aread_char_scalar(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(INOUT) :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5areadc_s_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5areadc_s_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREADC_S_C'::h5areadc_s_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         CHARACTER(LEN=*), INTENT(INOUT) :: buf
-       END FUNCTION h5areadc_s_c
-    END INTERFACE
-
-    hdferr = h5areadc_s_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_char_scalar
-
-  SUBROUTINE h5aread_char_1(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr ! Error code
-
-    !            INTEGER, EXTERNAL :: h5areadc_1_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5areadc_1_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREADC_1_C'::h5areadc_1_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         CHARACTER(LEN=*), INTENT(INOUT), &
-              DIMENSION(dims(1)) :: buf
-       END FUNCTION h5areadc_1_c
-    END INTERFACE
-
-    hdferr = h5areadc_1_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_char_1
-
-
-  SUBROUTINE h5aread_char_2(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr ! Error code
-
-    !            INTEGER, EXTERNAL :: h5areadc_2_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5areadc_2_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREADC_2_C'::h5areadc_2_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         CHARACTER(LEN=*), INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5areadc_2_c
-    END INTERFACE
-
-    hdferr = h5areadc_2_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_char_2
-
-
-  SUBROUTINE h5aread_char_3(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5areadc_3_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5areadc_3_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREADC_3_C'::h5areadc_3_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         CHARACTER(LEN=*), INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf
-       END FUNCTION h5areadc_3_c
-    END INTERFACE
-
-    hdferr = h5areadc_3_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_char_3
-
-
-  SUBROUTINE h5aread_char_4(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5areadc_4_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5areadc_4_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREADC_4_C'::h5areadc_4_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         CHARACTER(LEN=*), INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-       END FUNCTION h5areadc_4_c
-    END INTERFACE
-
-    hdferr = h5areadc_4_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_char_4
-
-
-  SUBROUTINE h5aread_char_5(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5areadc_5_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5areadc_5_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREADC_5_C'::h5areadc_5_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         CHARACTER(LEN=*), INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-       END FUNCTION h5areadc_5_c
-    END INTERFACE
-
-    hdferr = h5areadc_5_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_char_5
-
-
-  SUBROUTINE h5aread_char_6(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5areadc_6_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5areadc_6_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREADC_6_C'::h5areadc_6_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         CHARACTER(LEN=*), INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-       END FUNCTION h5areadc_6_c
-    END INTERFACE
-
-    hdferr = h5areadc_6_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_char_6
-
-
-  SUBROUTINE h5aread_char_7(attr_id, memtype_id, buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                             ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-
-    !            INTEGER, EXTERNAL :: h5areadc_7_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5areadc_7_c(attr_id, memtype_id, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREADC_7_C'::h5areadc_7_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         CHARACTER(LEN=*), INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-       END FUNCTION h5areadc_7_c
-    END INTERFACE
-
-    hdferr = h5areadc_7_c(attr_id, memtype_id, buf, dims)
-  END SUBROUTINE h5aread_char_7
-
-END MODULE H5A_PROVISIONAL
-
-
diff --git a/fortran/src/H5Df.c b/fortran/src/H5Df.c
index 0d32dac..57b4d4d 100644
--- a/fortran/src/H5Df.c
+++ b/fortran/src/H5Df.c
@@ -1,6 +1,6 @@
 /****h* H5Df/H5Df
  * PURPOSE
- *   This file contains C stubs for H5D Fortran APIs
+ *  This file contains C stubs for H5D Fortran APIs
  *
  * COPYRIGHT
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -48,7 +48,7 @@
  * SOURCE
 */
 int_f
-nh5dcreate_c (hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *type_id, hid_t_f *space_id,
+h5dcreate_c (hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *type_id, hid_t_f *space_id,
 	      hid_t_f *lcpl_id, hid_t_f *dcpl_id, hid_t_f *dapl_id, hid_t_f *dset_id)
 /******/
 {
@@ -84,1161 +84,118 @@ DONE:
  * PURPOSE
  *  Call H5Dopen2 to open a dataset
  * INPUTS
- *      loc_id - file or group identifier
- *              name - name of the dataset
- *              namelen - name length
- *              dapl_id	- Dataset access property list
+ *  loc_id - file or group identifier
+ *  name - name of the dataset
+ *  namelen - name length
+ *  dapl_id	- Dataset access property list
  * OUTPUTS
- *     dset_id - dataset identifier
+ *  dset_id - dataset identifier
  * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              Wednesday, August 4, 1999
- * HISTORY
- * Added 1.8 parameter: dapl_id
- * SOURCE
-*/
-int_f
-nh5dopen_c(hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *dapl_id, hid_t_f *dset_id)
-/******/
-{
-     char *c_name = NULL;
-     hid_t c_dset_id;
-     int ret_value = -1;
-
-     /*
-      * Convert FORTRAN name to C name
-      */
-     if(NULL == (c_name = (char *)HD5f2cstring(name, (size_t)*namelen)))
-         goto DONE;
-
-     /*
-      * Call H5Dopen2 function.
-      */
-     if((c_dset_id = H5Dopen2((hid_t)*loc_id, c_name, (hid_t)*dapl_id)) < 0)
-         goto DONE;
-
-     *dset_id = (hid_t_f)c_dset_id;
-     ret_value = 0;
-
-DONE:
-     if(c_name)
-         HDfree(c_name);
-     return ret_value;
-}
-
-
-/****if* H5Df/h5dwritec_c
- * NAME
- *  h5dwritec_c
- * PURPOSE
- *  Call h5dwrite_c to write a dataset of characters
- * INPUTS
- *      dset_id - dataset identifier
- *              mem_type_id - memory datatype identifier
- *              mem_space_id - memory dataspace identifier
- *              file_space_id - memory dataspace identifier
- *              xfer_pr  - identifier of transfer property list
- *              buf      - character data buffer
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              Tuesday, May 14, 2002
- * HISTORY
- * This function is added to accomodate oveloaded h5dwrite_f
- *                with the dims argument being of INTEGER(HSIZE_T) type
-
- * SOURCE
-*/
-int_f
-nh5dwritec_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims)
-/******/
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5dwrite_c  function.
-      */
-     ret_value = nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, _fcdtocp(buf), dims);
-
-     return ret_value;
-}
-
-int_f
-nh5dwritec_s_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims)
-
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5dwrite_c  function.
-      */
-     ret_value = nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, _fcdtocp(buf), dims);
-
-     return ret_value;
-}
-
-int_f
-nh5dwritec_1_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims)
-
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5dwrite_c  function.
-      */
-     ret_value = nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, _fcdtocp(buf), dims);
-
-     return ret_value;
-}
-
-int_f
-nh5dwritec_2_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims)
-
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5dwrite_c  function.
-      */
-     ret_value = nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, _fcdtocp(buf), dims);
-
-     return ret_value;
-}
-
-int_f
-nh5dwritec_3_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims)
-
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5dwrite_c  function.
-      */
-     ret_value = nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, _fcdtocp(buf), dims);
-
-     return ret_value;
-}
-
-int_f
-nh5dwritec_4_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims)
-
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5dwrite_c  function.
-      */
-     ret_value = nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, _fcdtocp(buf), dims);
-
-     return ret_value;
-}
-
-int_f
-nh5dwritec_5_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims)
-
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5dwrite_c  function.
-      */
-     ret_value = nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, _fcdtocp(buf), dims);
-
-     return ret_value;
-}
-
-int_f
-nh5dwritec_6_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims)
-
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5dwrite_c  function.
-      */
-     ret_value = nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, _fcdtocp(buf), dims);
-
-     return ret_value;
-}
-
-int_f
-nh5dwritec_7_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims)
-
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5dwrite_c  function.
-      */
-     ret_value = nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, _fcdtocp(buf), dims);
-
-     return ret_value;
-}
-
-/****if* H5Df/h5dwrite_c
- * NAME
- *  h5dwrite_c
- * PURPOSE
- *  Call H5Dwrite to write a dataset
- * INPUTS
- *      dset_id - dataset identifier
- *              mem_type_id - memory datatype identifier
- *              mem_space_id - memory dataspace identifier
- *              file_space_id - memory dataspace identifier
- *              xfer_pr  - identifier of transfer property list
- *              buf      - data buffer
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              Tuesday, May 14, 2002
- * HISTORY
- * This function is added to accomodate oveloaded h5dwrite_f
- *                with the dims argument being of INTEGER(HSIZE_T) type
- *
- *                Added nh5dwrite_integer(real,double)_s,1-7_c functions to eliminate
- *                complains about wrong parameter types in h5dwrite_c function
- *                called by Fortran rouitnes
- *                                           October 10, 2006 EIP
- *
- * SOURCE
-*/
-int_f
-nh5dwrite_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f H5_ATTR_UNUSED *dims)
-/******/
-{
-     int ret_value = -1;
-     herr_t ret;
-     hid_t c_dset_id;
-     hid_t c_mem_type_id;
-     hid_t c_mem_space_id;
-     hid_t c_file_space_id;
-     hid_t c_xfer_prp;
-
-     /*
-      * Define transfer property
-      */
-     c_xfer_prp = (hid_t)*xfer_prp;
-
-     /*
-      * Call H5Dwrite function.
-      */
-     c_dset_id = (hid_t)*dset_id;
-     c_mem_type_id = (hid_t)*mem_type_id;
-     c_mem_space_id = (hid_t)*mem_space_id;
-     c_file_space_id = (hid_t)*file_space_id;
-     ret = H5Dwrite(c_dset_id, c_mem_type_id, c_mem_space_id, c_file_space_id, c_xfer_prp, buf);
-
-     if (ret < 0) return ret_value;
-     ret_value = 0;
-     return ret_value;
-}
-
-int_f
-nh5dwrite_integer_s_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-
-int_f
-nh5dwrite_integer_1_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-
-int_f
-nh5dwrite_integer_2_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-
-int_f
-nh5dwrite_integer_3_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-
-int_f
-nh5dwrite_integer_4_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-
-int_f
-nh5dwrite_integer_5_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-
-int_f
-nh5dwrite_integer_6_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-
-int_f
-nh5dwrite_integer_7_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-
-int_f
-nh5dwrite_real_s_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dwrite_real_1_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dwrite_real_2_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dwrite_real_3_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dwrite_real_4_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dwrite_real_5_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dwrite_real_6_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dwrite_real_7_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dwrite_double_s_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dwrite_double_1_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dwrite_double_2_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dwrite_double_3_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dwrite_double_4_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dwrite_double_5_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dwrite_double_6_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dwrite_double_7_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dwrite_c  function.
-      */
-     return nh5dwrite_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-
-/****if* H5Df/h5dwrite_ref_obj_c
- * NAME
- *  h5dwrite_ref_obj_c
- * PURPOSE
- *  Call H5Dwrite to write a dataset  of object references
- * INPUTS
- *      dset_id - dataset identifier
- *              mem_type_id - memory datatype identifier
- *              mem_space_id - memory dataspace identifier
- *              file_space_id - memory dataspace identifier
- *              xfer_pr  - identifier of transfer property list
- *              buf      - data buffer with references to the objects.
- *              n - number of references to be stored.
- * RETURNS
- *     0 on success,e-1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              Tuesday, May 14, 2002
- * HISTORY
- * This function was added to accomodate h5dwrite_f with the
- *                dims argumnet being of INTEGER(HSIZE_T) type.
- * SOURCE
-*/
-int_f
-nh5dwrite_ref_obj_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, haddr_t_f *buf, hsize_t_f *dims)
-/******/
-{
-    int ret_value = -1;
-    herr_t ret;
-    hid_t c_dset_id;
-    hid_t c_mem_type_id;
-    hid_t c_mem_space_id;
-    hid_t c_file_space_id;
-    hid_t c_xfer_prp;
-    hobj_ref_t *buf_c;
-    unsigned int i, n;
-
-    /*
-     * Define transfer property
-     */
-    c_xfer_prp = (hid_t)*xfer_prp;
-
-    /*
-     * Allocate temporary buffer and copy references from Fortran.
-     */
-    n = (unsigned int)*dims;
-    buf_c = (hobj_ref_t*)HDmalloc(sizeof(hobj_ref_t)*n);
-    if ( buf_c != NULL ) {
-        for (i = 0; i < n; i++)
-             HDmemcpy(&buf_c[i], &buf[i], sizeof(haddr_t));
-    }
-    else return ret_value;
-
-    /*
-     * Call H5Dwrite function.
-     */
-    c_dset_id = (hid_t)*dset_id;
-    c_mem_type_id = (hid_t)*mem_type_id;
-    c_mem_space_id = (hid_t)*mem_space_id;
-    c_file_space_id = (hid_t)*file_space_id;
-    ret = H5Dwrite(c_dset_id, c_mem_type_id, c_mem_space_id, c_file_space_id, c_xfer_prp, buf_c);
-    HDfree(buf_c);
-    if (ret < 0) return ret_value;
-    ret_value = 0;
-    return ret_value;
-}
-
-/****if* H5Df/h5dwrite_ref_reg_c
- * NAME
- *  h5dwrite_ref_reg_c
- * PURPOSE
- *  Call H5Dwrite to write a dataset of dataset region references
- * INPUTS
- *  dset_id       - dataset identifier
- *  mem_type_id   - memory datatype identifier
- *  mem_space_id  - memory dataspace identifier
- *  file_space_id - memory dataspace identifier
- *  xfer_pr       - identifier of transfer property list
- *  buf           - data buffer with references to the objects.
- *  n             - number of references to be stored.
- * RETURNS
- *  0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *  Tuesday, May 14, 2002
- * HISTORY
- *  This function was added to accomodate h5dwrite_f with the
- *  dims argument being of INTEGER(HSIZE_T) type
- * SOURCE
-*/
-int_f
-nh5dwrite_ref_reg_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, int_f *buf, hsize_t_f *dims)
-/******/
-{
-     int ret_value = -1;
-     herr_t ret;
-     hid_t c_dset_id;
-     hid_t c_mem_type_id;
-     hid_t c_mem_space_id;
-     hid_t c_file_space_id;
-     hid_t c_xfer_prp;
-     hdset_reg_ref_t *buf_c = NULL;
-     unsigned int i, n;
-
-      n = (unsigned int)*dims;
-     /*
-      * Define transfer property
-      */
-     c_xfer_prp = (hid_t)*xfer_prp;
-
-     /*
-      * Allocate temporary buffer and copy references from Fortran.
-      */
-     buf_c = (hdset_reg_ref_t *)HDmalloc(sizeof(hdset_reg_ref_t)*n);
-      if ( buf_c != NULL ) {
-      for (i = 0; i < n; i++) {
-           HDmemcpy(&buf_c[i], buf, H5R_DSET_REG_REF_BUF_SIZE);
-           buf = buf + REF_REG_BUF_LEN_F;
-      }
-      }
-      else return ret_value;
-
-
-     /*
-      * Call H5Dwrite function.
-      */
-     c_dset_id = (hid_t)*dset_id;
-     c_mem_type_id = (hid_t)*mem_type_id;
-     c_mem_space_id = (hid_t)*mem_space_id;
-     c_file_space_id = (hid_t)*file_space_id;
-     ret = H5Dwrite(c_dset_id, c_mem_type_id, c_mem_space_id, c_file_space_id, c_xfer_prp, buf_c);
-     HDfree(buf_c);
-     if (ret < 0) return ret_value;
-     ret_value = 0;
-     return ret_value;
-}
-
-
-
-/****if* H5Df/h5dreadc_c
- * NAME
- *  h5dreadc_c
- * PURPOSE
- *  Call h5dread_c to read a dataset of characters
- * INPUTS
- *      dset_id - dataset identifier
- *              mem_type_id - memory datatype identifier
- *              mem_space_id - memory dataspace identifier
- *              file_space_id - memory dataspace identifier
- *              xfer_pr  - identifier of transfer property list
- * OUTPUTS
- *     buf      - character data buffer
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              Wednesday, May 15, 2002
- * HISTORY
- * This function was added to accomodate h5dread_f subroutine
- *                with the dims parameter being of INTEGER(HSIZE_T_F) size.
- * SOURCE
-*/
-int_f
-nh5dreadc_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims)
-/******/
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5dread_c  function.
-      */
-     ret_value = nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, _fcdtocp(buf), dims);
-
-     return ret_value;
-}
-
-int_f
-nh5dreadc_s_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims)
-
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5dread_c  function.
-      */
-     ret_value = nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, _fcdtocp(buf), dims);
-
-     return ret_value;
-}
-
-int_f
-nh5dreadc_1_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims)
-
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5dread_c  function.
-      */
-     ret_value = nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, _fcdtocp(buf), dims);
-
-     return ret_value;
-}
-
-int_f
-nh5dreadc_2_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims)
-
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5dread_c  function.
-      */
-     ret_value = nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, _fcdtocp(buf), dims);
-
-     return ret_value;
-}
-
-int_f
-nh5dreadc_3_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims)
-
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5dread_c  function.
-      */
-     ret_value = nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, _fcdtocp(buf), dims);
-
-     return ret_value;
-}
-
-int_f
-nh5dreadc_4_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims)
-
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5dread_c  function.
-      */
-     ret_value = nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, _fcdtocp(buf), dims);
-
-     return ret_value;
-}
-
-int_f
-nh5dreadc_5_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims)
-
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5dread_c  function.
-      */
-     ret_value = nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, _fcdtocp(buf), dims);
-
-     return ret_value;
-}
-
-int_f
-nh5dreadc_6_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims)
-
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5dread_c  function.
-      */
-     ret_value = nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, _fcdtocp(buf), dims);
-
-     return ret_value;
-}
-
-int_f
-nh5dreadc_7_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims)
-
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5dread_c  function.
-      */
-     ret_value = nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, _fcdtocp(buf), dims);
-
-     return ret_value;
-}
-
-/****if* H5Df/h5dread_c
- * NAME
- *  h5dread_c
- * PURPOSE
- *  Call H5Draed to read a dataset
- * INPUTS
- *      dset_id - dataset identifier
- *              mem_type_id - memory datatype identifier
- *              mem_space_id - memory dataspace identifier
- *              file_space_id - memory dataspace identifier
- *              xfer_pr  - identifier of transfer property list
- * OUTPUTS
- *     buf      - data buffer
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              Wednesday, May 15, 2002
- * HISTORY
- * This function was added to accomodate h5dread_f subroutine
- *                with the dims parameter being of INTEGER(HSIZE_T_F) size.
- *
- *                Added nh5dread_integer(real,double)_s,1-7_c functions to eliminate
- *                complains about wrong parameter types in h5dwrite_c function
- *                called by Fortran rouitnes
- *                                           October 10, 2006 EIP
- *
- * SOURCE
-*/
-int_f
-nh5dread_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f H5_ATTR_UNUSED *dims)
-/******/
-{
-     int ret_value = -1;
-     herr_t ret;
-     hid_t c_dset_id;
-     hid_t c_mem_type_id;
-     hid_t c_mem_space_id;
-     hid_t c_file_space_id;
-     hid_t c_xfer_prp;
-
-     /*
-      * Define transfer property
-      */
-     c_xfer_prp = (hid_t)*xfer_prp;
-
-     /*
-      * Call H5Dread function.
-      */
-     c_dset_id = (hid_t)*dset_id;
-     c_mem_type_id = (hid_t)*mem_type_id;
-     c_mem_space_id = (hid_t)*mem_space_id;
-     c_file_space_id = (hid_t)*file_space_id;
-     ret = H5Dread(c_dset_id, c_mem_type_id, c_mem_space_id, c_file_space_id, c_xfer_prp, buf);
-
-     if (ret < 0) return ret_value;
-     ret_value = 0;
-     return ret_value;
-}
-
-int_f
-nh5dread_integer_s_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_integer_1_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_integer_2_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_integer_3_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_integer_4_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_integer_5_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_integer_6_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_integer_7_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_real_s_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_real_1_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_real_2_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_real_3_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_real_4_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_real_5_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_real_6_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_real_7_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_double_s_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_double_1_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_double_2_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_double_3_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
+ *  0 on success, -1 on failure
+ * AUTHOR
+ *  Elena Pourmal
+ *  Wednesday, August 4, 1999
+ * HISTORY
+ *  Added 1.8 parameter: dapl_id
+ * SOURCE
+*/
 int_f
-nh5dread_double_4_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
-
+h5dopen_c(hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *dapl_id, hid_t_f *dset_id)
+/******/
 {
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_double_5_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
+     char *c_name = NULL;
+     hid_t c_dset_id;
+     int ret_value = -1;
 
-{
      /*
-      * Call h5dread_c  function.
+      * Convert FORTRAN name to C name
       */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
-
-int_f
-nh5dread_double_6_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
+     if(NULL == (c_name = (char *)HD5f2cstring(name, (size_t)*namelen)))
+         goto DONE;
 
-{
      /*
-      * Call h5dread_c  function.
+      * Call H5Dopen2 function.
       */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
-}
+     if((c_dset_id = H5Dopen2((hid_t)*loc_id, c_name, (hid_t)*dapl_id)) < 0)
+         goto DONE;
 
-int_f
-nh5dread_double_7_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims)
+     *dset_id = (hid_t_f)c_dset_id;
+     ret_value = 0;
 
-{
-     /*
-      * Call h5dread_c  function.
-      */
-     return nh5dread_c(dset_id, mem_type_id, mem_space_id, file_space_id, xfer_prp, buf, dims);
+DONE:
+     if(c_name)
+         HDfree(c_name);
+     return ret_value;
 }
 
-/****if* H5Df/h5dread_ref_obj_c
+/****if* H5Df/h5dwrite_ref_reg_c
  * NAME
- *  h5dread_ref_obj_c
+ *  h5dwrite_ref_reg_c
  * PURPOSE
- *  Call H5Dread to read a dataset  of object references
+ *  Call H5Dwrite to write a dataset of dataset region references
  * INPUTS
- *      dset_id - dataset identifier
- *              mem_type_id - memory datatype identifier
- *              mem_space_id - memory dataspace identifier
- *              file_space_id - memory dataspace identifier
- *              xfer_pr  - identifier of transfer property list
- *              buf      - data buffer to store references to the objects.
- *              n - number of references to be stored.
+ *  dset_id       - dataset identifier
+ *  mem_type_id   - memory datatype identifier
+ *  mem_space_id  - memory dataspace identifier
+ *  file_space_id - memory dataspace identifier
+ *  xfer_pr       - identifier of transfer property list
+ *  buf           - data buffer with references to the objects.
+ *  n             - number of references to be stored.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, May 15, 2002
+ *  Tuesday, May 14, 2002
  * HISTORY
- * This function was added to accomodate h5dread_f subroutine
- *                with the dims parameter being of INTEGER(HSIZE_T_F) size.
+ *  This function was added to accomodate h5dwrite_f with the
+ *  dims argument being of INTEGER(HSIZE_T) type
  * SOURCE
 */
 int_f
-nh5dread_ref_obj_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, haddr_t_f * buf, hsize_t_f *dims)
+h5dwrite_ref_reg_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, int_f *buf, hsize_t_f *dims)
 /******/
 {
-    int ret_value = -1;
-    herr_t ret = -1;
-    hid_t c_dset_id;
-    hid_t c_mem_type_id;
-    hid_t c_mem_space_id;
-    hid_t c_file_space_id;
-    hid_t c_xfer_prp;
-    hobj_ref_t *buf_c = NULL;
-    hsize_t i,n;
-
-    /*
-     * Define transfer property
-     */
-    c_xfer_prp = (hid_t)*xfer_prp;
-
-    /*
-     * Allocate temporary buffer.
-     */
-    n = (hsize_t)*dims;
-    buf_c = (hobj_ref_t*)HDmalloc(sizeof(hobj_ref_t)*(size_t)n);
-    if ( buf_c != NULL ) {
-        /*
-         * Call H5Dread function.
-         */
-        c_dset_id = (hid_t)*dset_id;
-        c_mem_type_id = (hid_t)*mem_type_id;
-        c_mem_space_id = (hid_t)*mem_space_id;
-        c_file_space_id = (hid_t)*file_space_id;
-        ret = H5Dread(c_dset_id, c_mem_type_id, c_mem_space_id, c_file_space_id, c_xfer_prp, buf_c);
-        if (ret >=0) {
-           for (i = 0; i < n; i++)
-              HDmemcpy(&buf[i], &buf_c[i], sizeof(haddr_t));
-        }
-        if ( buf_c != NULL ) HDfree(buf_c);
-    }
-    if (ret < 0) return ret_value;
-    ret_value = 0;
-    return ret_value;
+     int ret_value = -1;
+     herr_t ret;
+     hid_t c_dset_id;
+     hid_t c_mem_type_id;
+     hid_t c_mem_space_id;
+     hid_t c_file_space_id;
+     hid_t c_xfer_prp;
+     hdset_reg_ref_t *buf_c = NULL;
+     unsigned int i, n;
+
+      n = (unsigned int)*dims;
+     /*
+      * Define transfer property
+      */
+     c_xfer_prp = (hid_t)*xfer_prp;
+
+     /*
+      * Allocate temporary buffer and copy references from Fortran.
+      */
+     buf_c = (hdset_reg_ref_t *)HDmalloc(sizeof(hdset_reg_ref_t)*n);
+      if ( buf_c != NULL ) {
+      for (i = 0; i < n; i++) {
+           HDmemcpy(&buf_c[i], buf, H5R_DSET_REG_REF_BUF_SIZE);
+           buf = buf + REF_REG_BUF_LEN_F;
+      }
+      }
+      else return ret_value;
+
+
+     /*
+      * Call H5Dwrite function.
+      */
+     c_dset_id = (hid_t)*dset_id;
+     c_mem_type_id = (hid_t)*mem_type_id;
+     c_mem_space_id = (hid_t)*mem_space_id;
+     c_file_space_id = (hid_t)*file_space_id;
+     ret = H5Dwrite(c_dset_id, c_mem_type_id, c_mem_space_id, c_file_space_id, c_xfer_prp, buf_c);
+     HDfree(buf_c);
+     if (ret < 0) return ret_value;
+     ret_value = 0;
+     return ret_value;
 }
 
 /****if* H5Df/h5dread_ref_reg_c
@@ -1247,25 +204,25 @@ nh5dread_ref_obj_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_i
  * PURPOSE
  *  Call H5Dread to read a dataset of dataset region references
  * INPUTS
- *      dset_id - dataset identifier
- *              mem_type_id - memory datatype identifier
- *              mem_space_id - memory dataspace identifier
- *              file_space_id - memory dataspace identifier
- *              xfer_pr  - identifier of transfer property list
- *              buf      - data buffer to store references to the objects.
- *              n - number of references to be stored.
+ *  dset_id - dataset identifier
+ *  mem_type_id - memory datatype identifier
+ *  mem_space_id - memory dataspace identifier
+ *  file_space_id - memory dataspace identifier
+ *  xfer_pr  - identifier of transfer property list
+ *  buf      - data buffer to store references to the objects.
+ *  n - number of references to be stored.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, May 15, 2002
+ *  Wednesday, May 15, 2002
  * HISTORY
- * This function was added to accomodate h5dread_f subroutine
- *                with the dims parameter being of INTEGER(HSIZE_T_F) size.
+ *  This function was added to accomodate h5dread_f subroutine
+ *  with the dims parameter being of INTEGER(HSIZE_T_F) size.
  * SOURCE
 */
 int_f
-nh5dread_ref_reg_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, int_f * buf, hsize_t_f *dims)
+h5dread_ref_reg_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, int_f * buf, hsize_t_f *dims)
 /******/
 {
      int ret_value = -1;
@@ -1317,19 +274,19 @@ nh5dread_ref_reg_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_i
  * PURPOSE
  *  Call H5Dclose to close a dataset
  * INPUTS
- *      dset_id - identifier of the dataset to be closed
+ *  dset_id - identifier of the dataset to be closed
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 4, 1999
+ *  Wednesday, August 4, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5dclose_c ( hid_t_f *dset_id )
+h5dclose_c ( hid_t_f *dset_id )
 /******/
 {
   int ret_value = 0;
@@ -1345,21 +302,21 @@ nh5dclose_c ( hid_t_f *dset_id )
  * PURPOSE
  *  Call H5Dget_space to obtain dataspace of a dataset
  * INPUTS
- *      dset_id - identifier of the dataset
+ *  dset_id - identifier of the dataset
  * OUTPUTS
- *     space_id - identifier of the dataset's dataspace
+ *  space_id - identifier of the dataset's dataspace
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Thursday, August 19, 1999
+ *  Thursday, August 19, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5dget_space_c ( hid_t_f *dset_id , hid_t_f *space_id)
+h5dget_space_c ( hid_t_f *dset_id , hid_t_f *space_id)
 /******/
 {
   int ret_value = -1;
@@ -1380,21 +337,21 @@ nh5dget_space_c ( hid_t_f *dset_id , hid_t_f *space_id)
  * PURPOSE
  *  Call H5Dget_type to obtain datatype of a dataset
  * INPUTS
- *      dset_id - identifier of the dataset
+ *  dset_id - identifier of the dataset
  * OUTPUTS
- *     type_id - identifier of the dataset's datatype
+ *  type_id - identifier of the dataset's datatype
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Thursday, August 19, 1999
+ *  Thursday, August 19, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5dget_type_c ( hid_t_f *dset_id , hid_t_f *type_id)
+h5dget_type_c ( hid_t_f *dset_id , hid_t_f *type_id)
 /******/
 {
   int ret_value = -1;
@@ -1416,23 +373,23 @@ nh5dget_type_c ( hid_t_f *dset_id , hid_t_f *type_id)
  *  h5dget_create_plist_c
  * PURPOSE
  *  Call H5Dget_create_plist to obtain creation property list
- *              of a dataset
+ *  of a dataset
  * INPUTS
- *      dset_id - identifier of the dataset
+ *  dset_id - identifier of the dataset
  * OUTPUTS
- *     plist_id - identifier of he dataset creation property list
+ *  plist_id - identifier of he dataset creation property list
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Thursday, August 19, 1999
+ *  Thursday, August 19, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5dget_create_plist_c ( hid_t_f *dset_id , hid_t_f *plist_id)
+h5dget_create_plist_c ( hid_t_f *dset_id , hid_t_f *plist_id)
 /******/
 {
   int ret_value = -1;
@@ -1456,24 +413,24 @@ nh5dget_create_plist_c ( hid_t_f *dset_id , hid_t_f *plist_id)
  * PURPOSE
  *  Call H5Dset_extent to extend dataset with unlimited dimensions
  * INPUTS
- *      dset_id - identifier of the dataset
+ *  dset_id - identifier of the dataset
  * OUTPUTS
- *     dims - array with the dimension sizes
+ *  dims - array with the dimension sizes
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Thursday, August 19, 1999
+ *  Thursday, August 19, 1999
  *
  * HISTORY
- * Changed name from the now obsolete h5dextend
- *                to h5dset_extent in order to match new fortran interface.
+ *  Changed name from the now obsolete h5dextend
+ *  to h5dset_extent in order to match new fortran interface.
  *                -MSB- March 14, 2008
  * SOURCE
 */
 
 int_f
-nh5dset_extent_c ( hid_t_f *dset_id , hsize_t_f *dims)
+h5dset_extent_c ( hid_t_f *dset_id , hsize_t_f *dims)
 /******/
 {
   hid_t c_space_id;
@@ -1503,28 +460,28 @@ nh5dset_extent_c ( hid_t_f *dset_id , hsize_t_f *dims)
   return ret_value;
 }
 
-/****if* H5Df/nh5dget_storage_size_c
+/****if* H5Df/h5dget_storage_size_c
  * NAME
- *  nh5dget_storage_size_c
+ *  h5dget_storage_size_c
  * PURPOSE
  *  Call H5Dget_storage_size to return the amount of storage
- *              required for a dataset
+ *  required for a dataset
  * INPUTS
- *      dset_id - identifier of the dataset
+ *  dset_id - identifier of the dataset
  * OUTPUTS
- *     size    - the amount of storage required for a dataset
+ *  size    - the amount of storage required for a dataset
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Tuesday, October 22, 2002
+ *  Tuesday, October 22, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5dget_storage_size_c ( hid_t_f *dset_id , hsize_t_f *size)
+h5dget_storage_size_c ( hid_t_f *dset_id , hsize_t_f *size)
 /******/
 {
   int ret_value = -1;
@@ -1539,29 +496,29 @@ nh5dget_storage_size_c ( hid_t_f *dset_id , hsize_t_f *size)
   return ret_value;
 }
 
-/****if* H5Df/nh5dvlen_get_max_len_c
+/****if* H5Df/h5dvlen_get_max_len_c
  * NAME
- *  nh5dvlen_get_max_len_c
+ *  h5dvlen_get_max_len_c
  * PURPOSE
  *  Get the maximum size of the VL dataset element
  * INPUTS
- *      dset_id - identifier of the dataset
- *              type_id - datatype identifier
- *              space_id - dataspace identifier
+ *  dset_id - identifier of the dataset
+ *  type_id - datatype identifier
+ *  space_id - dataspace identifier
  * OUTPUTS
- *     len      - maximum length of the VL dataset element
+ *  len      - maximum length of the VL dataset element
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Tuesday, October 22, 2002
+ *  Tuesday, October 22, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5dvlen_get_max_len_c ( hid_t_f *dset_id ,  hid_t_f *type_id, hid_t_f *space_id, size_t_f *len)
+h5dvlen_get_max_len_c ( hid_t_f *dset_id ,  hid_t_f *type_id, hid_t_f *space_id, size_t_f *len)
 /******/
 {
   int ret_value = -1;
@@ -1597,34 +554,34 @@ DONE:
   HDfree(c_buf);
   return ret_value;
 }
-/****if* H5Df/nh5dwrite_vl_integer_c
+/****if* H5Df/h5dwrite_vl_integer_c
  * NAME
- *  nh5dwrite_vl_integer_c
+ *  h5dwrite_vl_integer_c
  * PURPOSE
  *  Write variable length dataset
  * INPUTS
- *      dset_id - identifier of the dataset
- *              mem_type_id - datatype identifier
- *              mem_space_id - dataspace identifier
- *              file_space_id - file dataspace identifier
- *              xfer          - file transfer property
- *              buf           - data buffer
- *              dims          - one-demnsional array of size 2
- *                              dims[0] = MAXLENGTH
- *                              dims[1] = number of elements of VL type
- *              len           - array element lenghts
+ *  dset_id - identifier of the dataset
+ *  mem_type_id - datatype identifier
+ *  mem_space_id - dataspace identifier
+ *  file_space_id - file dataspace identifier
+ *  xfer          - file transfer property
+ *  buf           - data buffer
+ *  dims          - one-demnsional array of size 2
+ *  dims[0] = MAXLENGTH
+ *  dims[1] = number of elements of VL type
+ *  len           - array element lenghts
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, October 23, 2002
+ *  Wednesday, October 23, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5dwrite_vl_integer_c ( hid_t_f *dset_id ,  hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, int_f *buf, hsize_t_f *dims, size_t_f *len)
+h5dwrite_vl_integer_c ( hid_t_f *dset_id ,  hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, int_f *buf, hsize_t_f *dims, size_t_f *len)
 /******/
 {
   int ret_value = -1;
@@ -1670,35 +627,35 @@ DONE:
   return ret_value;
 }
 
-/****if* H5Df/nh5dread_vl_integer_c
+/****if* H5Df/h5dread_vl_integer_c
  * NAME
- *  nh5dread_vl_integer_c
+ *  h5dread_vl_integer_c
  * PURPOSE
  *  Read variable length dataset
  * INPUTS
- *      dset_id - identifier of the dataset
- *              mem_type_id - datatype identifier
- *              mem_space_id - dataspace identifier
- *              file_space_id - file dataspace identifier
- *              xfer          - file transfer property
- *              dims          - one-demnsional array of size 2
- *                              dims[0] = MAXLENGTH
- *                              dims[1] = number of elements of VL type
+ *  dset_id - identifier of the dataset
+ *  mem_type_id - datatype identifier
+ *  mem_space_id - dataspace identifier
+ *  file_space_id - file dataspace identifier
+ *  xfer          - file transfer property
+ *  dims          - one-demnsional array of size 2
+ *  dims[0] = MAXLENGTH
+ *  dims[1] = number of elements of VL type
  * OUTPUTS
- *     buf           - data buffer
- *              len           - array element lenghts
+ *  buf           - data buffer
+ *  len           - array element lenghts
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, October 24, 2002
+ *  Wednesday, October 24, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5dread_vl_integer_c ( hid_t_f *dset_id ,  hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, int_f *buf, hsize_t_f *dims, size_t_f *len)
+h5dread_vl_integer_c ( hid_t_f *dset_id ,  hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, int_f *buf, hsize_t_f *dims, size_t_f *len)
 /******/
 {
   int ret_value = -1;
@@ -1742,33 +699,33 @@ DONE:
   return ret_value;
 }
 
-/****if* H5Df/nh5dwrite_vl_string_c
+/****if* H5Df/h5dwrite_vl_string_c
  * NAME
- *  nh5dwrite_vl_string_c
+ *  h5dwrite_vl_string_c
  * PURPOSE
  *  Write variable length strings from Fortran program
  * INPUTS
- *      dset_id - identifier of the dataset
- *              mem_type_id - datatype identifier
- *              mem_space_id - dataspace identifier
- *              file_space_id - file dataspace identifier
- *              xfer          - file transfer property
- *              buf           - data buffer
- *              dims          - one-demnsional array of size 2
- *                              dims[0] = number of strings of size max_len
- *              len           - array of strings lengths
+ *  dset_id - identifier of the dataset
+ *  mem_type_id - datatype identifier
+ *  mem_space_id - dataspace identifier
+ *  file_space_id - file dataspace identifier
+ *  xfer          - file transfer property
+ *  buf           - data buffer
+ *  dims          - one-demnsional array of size 2
+ *  dims[0] = number of strings of size max_len
+ *  len           - array of strings lengths
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, October 28, 2002
+ *  Monday, October 28, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5dwrite_vl_string_c( hid_t_f *dset_id ,  hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims, size_t_f *len)
+h5dwrite_vl_string_c( hid_t_f *dset_id ,  hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims, size_t_f *len)
 /******/
 {
   int ret_value = -1;
@@ -1829,33 +786,33 @@ DONE:
   HDfree(tmp);
   return ret_value;
 }
-/****if* H5Df/nh5dread_vl_string_c
+/****if* H5Df/h5dread_vl_string_c
  * NAME
- *  nh5dread_vl_string_c
+ *  h5dread_vl_string_c
  * PURPOSE
  *  Read variable length strings from Fortran program
  * INPUTS
- *      dset_id - identifier of the dataset
- *              mem_type_id - datatype identifier
- *              mem_space_id - dataspace identifier
- *              file_space_id - file dataspace identifier
- *              xfer          - file transfer property
- *              dims          - one-demnsional array of size 2
- *                              dims[0] = number of strings of size max_len
- * Output:      buf           - data buffer
- *              len           - array of strings lengths
+ *  dset_id - identifier of the dataset
+ *  mem_type_id - datatype identifier
+ *  mem_space_id - dataspace identifier
+ *  file_space_id - file dataspace identifier
+ *  xfer          - file transfer property
+ *  dims          - one-demnsional array of size 2
+ *  dims[0] = number of strings of size max_len
+ *  Output:      buf           - data buffer
+ *  len           - array of strings lengths
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Friday, November 1, 2002
+ *  Friday, November 1, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5dread_vl_string_c( hid_t_f *dset_id ,  hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims, size_t_f *len)
+h5dread_vl_string_c( hid_t_f *dset_id ,  hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims, size_t_f *len)
 /******/
 {
   int ret_value = -1;
@@ -1912,34 +869,34 @@ nh5dread_vl_string_c( hid_t_f *dset_id ,  hid_t_f *mem_type_id, hid_t_f *mem_spa
   return ret_value;
 }
 
-/****if* H5Df/nh5dwrite_vl_real_c
+/****if* H5Df/h5dwrite_vl_real_c
  * NAME
- *  nh5dwrite_vl_real_c
+ *  h5dwrite_vl_real_c
  * PURPOSE
  *  Write variable length dataset
  * INPUTS
- *      dset_id - identifier of the dataset
- *              mem_type_id - datatype identifier
- *              mem_space_id - dataspace identifier
- *              file_space_id - file dataspace identifier
- *              xfer          - file transfer property
- *              buf           - data buffer
- *              dims          - one-demnsional array of size 2
- *                              dims[0] = MAXLENGTH
- *                              dims[1] = number of elements of VL type
- *              len           - array element lenghts
+ *  dset_id - identifier of the dataset
+ *  mem_type_id - datatype identifier
+ *  mem_space_id - dataspace identifier
+ *  file_space_id - file dataspace identifier
+ *  xfer          - file transfer property
+ *  buf           - data buffer
+ *  dims          - one-demnsional array of size 2
+ *  dims[0] = MAXLENGTH
+ *  dims[1] = number of elements of VL type
+ *  len           - array element lenghts
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, November 11, 2002
+ *  Monday, November 11, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5dwrite_vl_real_c ( hid_t_f *dset_id ,  hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, real_f *buf, hsize_t_f *dims, size_t_f *len)
+h5dwrite_vl_real_c ( hid_t_f *dset_id ,  hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, real_f *buf, hsize_t_f *dims, size_t_f *len)
 /******/
 {
   int ret_value = -1;
@@ -1985,35 +942,35 @@ DONE:
   return ret_value;
 }
 
-/****if* H5Df/nh5dread_vl_real_c
+/****if* H5Df/h5dread_vl_real_c
  * NAME
- *  nh5dread_vl_real_c
+ *  h5dread_vl_real_c
  * PURPOSE
  *  Read variable length dataset
  * INPUTS
- *      dset_id - identifier of the dataset
- *              mem_type_id - datatype identifier
- *              mem_space_id - dataspace identifier
- *              file_space_id - file dataspace identifier
- *              xfer          - file transfer property
- *              dims          - one-demnsional array of size 2
- *                              dims[0] = MAXLENGTH
- *                              dims[1] = number of elements of VL type
+ *  dset_id - identifier of the dataset
+ *  mem_type_id - datatype identifier
+ *  mem_space_id - dataspace identifier
+ *  file_space_id - file dataspace identifier
+ *  xfer          - file transfer property
+ *  dims          - one-demnsional array of size 2
+ *  dims[0] = MAXLENGTH
+ *  dims[1] = number of elements of VL type
  * OUTPUTS
- *     buf           - data buffer
- *              len           - array element lenghts
+ *  buf           - data buffer
+ *  len           - array element lenghts
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, November 11, 2002
+ *  Monday, November 11, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5dread_vl_real_c ( hid_t_f *dset_id ,  hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, real_f *buf, hsize_t_f *dims, size_t_f *len)
+h5dread_vl_real_c ( hid_t_f *dset_id ,  hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, real_f *buf, hsize_t_f *dims, size_t_f *len)
 /******/
 {
   int ret_value = -1;
@@ -2058,39 +1015,6 @@ DONE:
   return ret_value;
 }
 
-/****if* H5Df/h5dfillc_c
- * NAME
- *  h5dfillc_c
- * PURPOSE
- *  Call h5fill_c to fill memory buffer with a fill value
- * INPUTS
- *  fill_value   - fill value
- *  fill_type_id - fill value datatype identifier
- *  space_id     - memory space selection identifier
- *  buf          - memory buffer to fill
- *  mem_type_id  - memory buffer dtatype identifier
- * RETURNS
- *  0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *  Wednesday, March 12, 2003
- * HISTORY
- *
- * SOURCE
-*/
-int_f
-nh5dfillc_c (_fcd fill_value, hid_t_f *fill_type_id, hid_t_f *space_id, _fcd buf, hid_t_f *mem_type_id)
-/******/
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5dfill_c  function.
-      */
-     ret_value = h5dfill_c(_fcdtocp(fill_value), fill_type_id, space_id, _fcdtocp(buf), mem_type_id);
-
-     return ret_value;
-}
 /****if* H5Df/h5dfill_c
  * NAME
  *  h5dfill_c
@@ -2135,98 +1059,26 @@ h5dfill_c (void * fill_value, hid_t_f *fill_type_id, hid_t_f *space_id, void * b
      return ret_value;
 }
 
-int_f
-nh5dfill_integer_c (void * fill_value, hid_t_f *fill_type_id, hid_t_f *space_id, void * buf, hid_t_f *mem_type_id)
-
-{
-     int ret_value = -1;
-     herr_t ret;
-     hid_t c_fill_type_id;
-     hid_t c_mem_type_id;
-     hid_t c_space_id;
-
-     c_fill_type_id = (hid_t)*fill_type_id;
-     c_mem_type_id = (hid_t)*mem_type_id;
-     c_space_id = (hid_t)*space_id;
-
-     /*
-      * Call H5Dfill function.
-      */
-     ret = H5Dfill(fill_value, c_fill_type_id, buf, c_mem_type_id, c_space_id);
-
-     if (ret < 0) return ret_value;
-     ret_value = 0;
-     return ret_value;
-}
-
-int_f
-nh5dfill_real_c (void * fill_value, hid_t_f *fill_type_id, hid_t_f *space_id, void * buf, hid_t_f *mem_type_id)
-
-{
-     int ret_value = -1;
-     herr_t ret;
-     hid_t c_fill_type_id;
-     hid_t c_mem_type_id;
-     hid_t c_space_id;
-
-     c_fill_type_id = (hid_t)*fill_type_id;
-     c_mem_type_id = (hid_t)*mem_type_id;
-     c_space_id = (hid_t)*space_id;
-
-     /*
-      * Call H5Dfill function.
-      */
-     ret = H5Dfill(fill_value, c_fill_type_id, buf, c_mem_type_id, c_space_id);
-
-     if (ret < 0) return ret_value;
-     ret_value = 0;
-     return ret_value;
-}
-
-int_f
-nh5dfill_double_c (void * fill_value, hid_t_f *fill_type_id, hid_t_f *space_id, void * buf, hid_t_f *mem_type_id)
-
-{
-     int ret_value = -1;
-     herr_t ret;
-     hid_t c_fill_type_id;
-     hid_t c_mem_type_id;
-     hid_t c_space_id;
-
-     c_fill_type_id = (hid_t)*fill_type_id;
-     c_mem_type_id = (hid_t)*mem_type_id;
-     c_space_id = (hid_t)*space_id;
-
-     /*
-      * Call H5Dfill function.
-      */
-     ret = H5Dfill(fill_value, c_fill_type_id, buf, c_mem_type_id, c_space_id);
-
-     if (ret < 0) return ret_value;
-     ret_value = 0;
-     return ret_value;
-}
-
 /****if* H5Df/h5dget_space_status_c
  * NAME
  *  h5dget_space_status_c
  * PURPOSE
  *  Call H5Dget_space_status to request dataspace allocation status
  * INPUTS
- *      dset_id - dataset identifier
+ *  dset_id - dataset identifier
  * OUTPUTS
- *     flag - status flag
+ *  flag - status flag
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, March 12, 2003
+ *  Wednesday, March 12, 2003
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5dget_space_status_c ( hid_t_f *dset_id, int_f *flag)
+h5dget_space_status_c ( hid_t_f *dset_id, int_f *flag)
 /******/
 {
      int ret_value = -1;
@@ -2256,21 +1108,21 @@ nh5dget_space_status_c ( hid_t_f *dset_id, int_f *flag)
  *		loc_id	   - Identifier of the file or group within which to create the dataset.
  *		type_id	   - Identifier of the datatype to use when creating the dataset.
  *		space_id   - Identifier of the dataspace to use when creating the dataset.
- *              dcpl_id    - Dataset creation property list identifier.
- *              dapl_id    - Dataset access property list identifier.
+ *  dcpl_id    - Dataset creation property list identifier.
+ *  dapl_id    - Dataset access property list identifier.
  * OUTPUTS
  *
- *              dset_id - dataset identifier
+ *  dset_id - dataset identifier
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              February, 2008
+ *  February, 2008
  * SOURCE
 */
 int_f
-nh5dcreate_anon_c (hid_t_f *loc_id, hid_t_f *type_id, hid_t_f *space_id,
+h5dcreate_anon_c (hid_t_f *loc_id, hid_t_f *type_id, hid_t_f *space_id,
 		   hid_t_f *dcpl_id, hid_t_f *dapl_id, hid_t_f *dset_id)
 /******/
 {
@@ -2355,8 +1207,8 @@ h5dwrite_f_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id,
  *  file_space_id - file dataspace identifier
  *  xfer          - file transfer property
  *  dims          - one-demnsional array of size 2
- *                   dims[0] = MAXLENGTH
- *                   dims[1] = number of elements of VL type
+ *  dims[0] = MAXLENGTH
+ *  dims[1] = number of elements of VL type
  * OUTPUTS
  *  buf - data buffer
  *  len - array element lenghts
@@ -2396,9 +1248,9 @@ h5dread_f_c ( hid_t_f *dset_id ,  hid_t_f *mem_type_id, hid_t_f *mem_space_id,
   ret_value = 0;
   return ret_value;
 }
-/****if* H5Df/nh5dget_access_plist_c
+/****if* H5Df/h5dget_access_plist_c
  * NAME
- *  nh5dget_access_plist_c
+ *  h5dget_access_plist_c
  * PURPOSE
  *  Call H5Dget_access_plist
  * INPUTS
@@ -2414,7 +1266,7 @@ h5dread_f_c ( hid_t_f *dset_id ,  hid_t_f *mem_type_id, hid_t_f *mem_space_id,
  * SOURCE
 */
 int_f
-nh5dget_access_plist_c (hid_t_f *dset_id, hid_t_f *plist_id)
+h5dget_access_plist_c (hid_t_f *dset_id, hid_t_f *plist_id)
 /******/
 {
   int ret_value = -1;
@@ -2430,22 +1282,22 @@ nh5dget_access_plist_c (hid_t_f *dset_id, hid_t_f *plist_id)
   return ret_value;
 }
 
-/****if* H5Df/nh5dvlen_reclaim_c
+/****if* H5Df/h5dvlen_reclaim_c
  * NAME
  *  h5dvlen_reclaim_c
  * PURPOSE
  *  Call H5Dvlen_reclaim
  * INPUTS
- *   type_id   - Identifier of the datatype. 
- *   space_id  - Identifier of the dataspace. 
- *   plist_id  - Identifier of the property list used to create the buffer. 
- *   buf       - Pointer to the buffer to be reclaimed.    
+ *  type_id   - Identifier of the datatype. 
+ *  space_id  - Identifier of the dataspace. 
+ *  plist_id  - Identifier of the property list used to create the buffer. 
+ *  buf       - Pointer to the buffer to be reclaimed.    
  *
  * RETURNS
- *   0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *   M. Scot Breitenfeld
- *   January 15, 2011 
+ *  January 15, 2011 
  *
  * SOURCE
 */
diff --git a/fortran/src/H5Dff.F90 b/fortran/src/H5Dff.F90
new file mode 100644
index 0000000..e44d90e
--- /dev/null
+++ b/fortran/src/H5Dff.F90
@@ -0,0 +1,1877 @@
+!****h* ROBODoc/H5D
+!
+! NAME
+!  MODULE H5D
+!
+! FILE
+!  fortran/src/H5Dff.f90
+!
+! PURPOSE
+!  This file contains Fortran interfaces for H5D functions.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! NOTES
+!  (1) The maximum rank of an array allowed in Fortran is 7, therefore
+!  we only provide an interface for arrays up to and including rank 7.
+!
+!  (2) Unfortunately we are using a generic interface and one of the factors
+!  used in determining the proper routine to select is that of the array
+!  rank being passed. Therefore, we can not create just one subroutine for
+!  each array type (integer, real, etc...) and use a
+!  rank 1 array of assumed size to handle multiple ranks, i.e.
+!  (i.e. integer, dimension(*) :: ... )
+!  (i.e. real   , dimension(*) :: ... ) etc...
+!
+!  (3) Could not place the USE, INTRINSIC :: ISO_C_BINDING in the module header because it may
+!  conflict with the USE, INTRINSIC :: ISO_C_BINDING included in the user's program. Moved
+!  the statement instead to each subroutine.
+!
+!
+!  (4) C_LOC and character strings according to the Fortran 2003 standard:
+!
+!  15.1.2.5 C_LOC(X)
+!
+!  Argument. X shall either
+!
+!  (A) have interoperable type and type parameters and be
+!  (a) a variable that has the TARGET attribute and is interoperable,
+!  (b) an allocated allocatable variable that has the TARGET attribute
+!  and is not an array of zero size, or
+!  (c) an associated scalar pointer, or
+!  (B) be a nonpolymorphic scalar, have no length type parameters, and be
+!  (a) a nonallocatable, nonpointer variable that has the TARGET attribute,
+!  (b) an allocated allocatable variable that has the TARGET attribute, or
+!  (c) an associated pointer.
+!
+!   	 - When X is a character, for interoperability the standard is:
+!
+!  15.2.1 Interoperability of intrinsic types
+!
+!  ...if the type is character, interoperability also requires that the length type parameter
+!  be omitted or be specified by an initialization expression whose value is one.
+!
+!  THEREFORE compilers that have not extended the standard require the
+!  argument in C_LOC to be of the variant:
+!
+!  CHARACTER(LEN=1), TARGET :: chr
+!  or
+!  CHARACTER, TARGET :: chr
+!
+!       _____ __  __ _____   ____  _____ _______       _   _ _______
+!      |_   _|  \/  |  __ \ / __ \|  __ \__   __|/\   | \ | |__   __|
+! ****   | | | \  / | |__) | |  | | |__) | | |  /  \  |  \| |  | |    ****
+! ****   | | | |\/| |  ___/| |  | |  _  /  | | / /\ \ | . ` |  | |    ****
+! ****  _| |_| |  | | |    | |__| | | \ \  | |/ ____ \| |\  |  | |    ****
+!      |_____|_|  |_|_|     \____/|_|  \_\ |_/_/    \_\_| \_|  |_|
+!
+!  If you add a new H5D function you must add the function name to the
+!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
+!  This is needed for Windows based operating systems.
+!
+!*****
+
+#include <H5config_f.inc>
+
+MODULE H5D
+  
+  USE, INTRINSIC :: ISO_C_BINDING
+  USE H5GLOBAL
+
+  INTERFACE h5dextend_f
+     MODULE PROCEDURE h5dset_extent_f
+  END INTERFACE
+
+  INTERFACE h5dread_vl_f
+     MODULE PROCEDURE h5dread_vl_integer
+     MODULE PROCEDURE h5dread_vl_real
+     MODULE PROCEDURE h5dread_vl_string
+  END INTERFACE
+
+  INTERFACE h5dwrite_vl_f
+     MODULE PROCEDURE h5dwrite_vl_integer
+     MODULE PROCEDURE h5dwrite_vl_real
+     MODULE PROCEDURE h5dwrite_vl_string
+  END INTERFACE
+
+  INTERFACE h5dwrite_f
+     MODULE PROCEDURE h5dwrite_reference_obj
+     MODULE PROCEDURE h5dwrite_reference_dsetreg
+     MODULE PROCEDURE h5dwrite_char_scalar
+     ! This is the preferred way to call h5dwrite
+     ! by passing an address
+     MODULE PROCEDURE h5dwrite_ptr
+  END INTERFACE
+
+  INTERFACE h5dread_f
+     MODULE PROCEDURE h5dread_reference_obj
+     MODULE PROCEDURE h5dread_reference_dsetreg
+     MODULE PROCEDURE h5dread_char_scalar
+     ! This is the preferred way to call h5dread
+     ! by passing an address
+     MODULE PROCEDURE h5dread_ptr
+
+  END INTERFACE
+
+
+!  Interface for the function used to pass the C pointer of the buffer
+!  to the C H5Dwrite routine
+
+  INTERFACE
+     INTEGER FUNCTION h5dwrite_f_c(dset_id, mem_type_id, &
+          mem_space_id_default ,                         &
+          file_space_id_default,                         &
+          xfer_prp_default, buf ) BIND(C, NAME='h5dwrite_f_c')
+       IMPORT :: c_ptr
+       IMPORT :: HID_T
+       IMPLICIT NONE
+       INTEGER(HID_T), INTENT(IN) :: dset_id
+       INTEGER(HID_T), INTENT(IN) :: mem_type_id
+       INTEGER(HID_T) :: mem_space_id_default
+       INTEGER(HID_T) :: file_space_id_default
+       INTEGER(HID_T) :: xfer_prp_default
+       TYPE(C_PTR), VALUE :: buf
+     END FUNCTION h5dwrite_f_c
+  END INTERFACE
+
+!  Interface for the function used to pass the C pointer of the buffer
+!  to the C H5Dread routine
+
+  INTERFACE
+     INTEGER FUNCTION h5dread_f_c(dset_id, mem_type_id, &
+          mem_space_id_default,                         &
+          file_space_id_default,                        &
+          xfer_prp_default, buf) BIND(C, NAME='h5dread_f_c')
+       IMPORT :: c_ptr
+       IMPORT :: HID_T
+       IMPLICIT NONE
+       INTEGER(HID_T), INTENT(IN) :: dset_id
+       INTEGER(HID_T), INTENT(IN) :: mem_type_id
+       INTEGER(HID_T) :: mem_space_id_default
+       INTEGER(HID_T) :: file_space_id_default
+       INTEGER(HID_T) :: xfer_prp_default
+       TYPE(C_PTR), VALUE :: buf
+     END FUNCTION h5dread_f_c
+  END INTERFACE
+
+  INTERFACE h5dfill_f
+     MODULE PROCEDURE h5dfill_integer
+     MODULE PROCEDURE h5dfill_c_float
+     MODULE PROCEDURE h5dfill_c_double
+#ifdef H5_FORTRAN_HAVE_C_LONG_DOUBLE
+     MODULE PROCEDURE h5dfill_c_long_double
+#endif
+     MODULE PROCEDURE h5dfill_char
+  END INTERFACE
+
+!  Interface for the function used to pass the C pointer of the buffer
+!  to the C H5Dfill routine
+
+  INTERFACE
+     INTEGER FUNCTION h5dfill_c(f_ptr_fill_value, fill_type_id, space_id, &
+          f_ptr_buf, mem_type_id) BIND(C, NAME='h5dfill_c')
+       IMPORT :: c_ptr
+       IMPORT :: HID_T
+       IMPLICIT NONE
+       TYPE(C_PTR), VALUE :: f_ptr_fill_value
+       INTEGER(HID_T) :: fill_type_id ! Fill value datatype identifier
+       INTEGER(HID_T), INTENT(IN) :: space_id ! Memory dataspace selection identifier
+       TYPE(C_PTR), VALUE :: f_ptr_buf
+       INTEGER(HID_T) :: mem_type_id
+     END FUNCTION h5dfill_c
+  END INTERFACE
+
+CONTAINS
+
+!
+!****s* H5D/h5dcreate_f
+!
+! NAME
+!  h5dcreate_f
+!
+! PURPOSE
+!  Creates a dataset at the specified location
+!
+! INPUTS
+!  loc_id 	 - file or group identifier
+!  name 	 - dataset name
+!  type_id 	 - dataset datatype identifier
+!  space_id 	 - dataset dataspace identifier
+! OUTPUTS
+!  dset_id 	 - dataset identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  creation_prp  - Dataset creation property list
+!  lcpl_id 	 - Link creation property list
+!  dapl_id 	 - Dataset access property list
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!
+!  - Explicit Fortran interfaces were added for
+!    called C functions (it is needed for Windows
+!    port).  February 28, 2001
+!
+!  - Added version's 1.8 new optional parameters
+!    February, 2008
+!
+! SOURCE
+  SUBROUTINE h5dcreate_f(loc_id, name, type_id, space_id, dset_id, &
+       hdferr, dcpl_id, lcpl_id, dapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the dataset
+    INTEGER(HID_T), INTENT(IN) :: type_id  ! Datatype identifier
+    INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier
+    INTEGER(HID_T), INTENT(OUT) :: dset_id ! Dataset identifier
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!*****
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: dcpl_id ! Dataset creation property list
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lcpl_id ! Link creation property list
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: dapl_id ! Dataset access property list
+
+    INTEGER(HID_T) :: lcpl_id_default
+    INTEGER(HID_T) :: dcpl_id_default
+    INTEGER(HID_T) :: dapl_id_default
+
+    INTEGER :: namelen ! Name length
+
+    INTERFACE
+       INTEGER FUNCTION h5dcreate_c(loc_id, name, namelen, type_id, &
+            space_id, lcpl_id_default, dcpl_id_default, dapl_id_default, dset_id) &
+            BIND(C,NAME='h5dcreate_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER :: namelen
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER(HID_T), INTENT(IN) :: space_id
+
+         INTEGER(HID_T) :: lcpl_id_default
+         INTEGER(HID_T) :: dcpl_id_default
+         INTEGER(HID_T) :: dapl_id_default
+
+         INTEGER(HID_T), INTENT(OUT) :: dset_id
+       END FUNCTION h5dcreate_c
+    END INTERFACE
+
+    lcpl_id_default = H5P_DEFAULT_F
+    dcpl_id_default = H5P_DEFAULT_F
+    dapl_id_default = H5P_DEFAULT_F
+
+    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
+    IF(PRESENT(dcpl_id)) dcpl_id_default = dcpl_id
+    IF(PRESENT(dapl_id)) dapl_id_default = dapl_id
+
+    namelen = LEN(name)
+    hdferr = h5dcreate_c(loc_id, name, namelen, type_id, space_id, &
+         lcpl_id_default, dcpl_id_default, dapl_id_default, dset_id)
+
+  END SUBROUTINE h5dcreate_f
+
+!
+!****s* H5D/h5dopen_f
+!
+! NAME
+!  h5dopen_f
+!
+! PURPOSE
+!  Opens an existing dataset.
+!
+! INPUTS
+!  loc_id 	 - file or group identifier
+!  name 	 - dataset name
+! OUTPUTS
+!  dset_id 	 - dataset identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  dapl_id 	 - Dataset access property list
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  -Explicit Fortran interfaces were added for
+!   called C functions (it is needed for Windows
+!   port).  February 28, 2001
+!
+!  -Added 1.8 (optional) parameter dapl_id
+!   February, 2008, M. Scot Breitenfeld
+!
+! SOURCE
+  SUBROUTINE h5dopen_f(loc_id, name, dset_id, hdferr, dapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the dataset
+    INTEGER(HID_T), INTENT(OUT) :: dset_id ! Dataset identifier
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: dapl_id ! Dataset access property list
+!*****
+    INTEGER :: namelen                     ! Name length
+
+    INTEGER(HID_T) :: dapl_id_default
+
+    INTERFACE
+       INTEGER FUNCTION h5dopen_c(loc_id, name, namelen, dapl_id_default, dset_id) &
+            BIND(C,NAME='h5dopen_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER :: namelen
+         INTEGER(HID_T), INTENT(IN) :: dapl_id_default
+         INTEGER(HID_T), INTENT(OUT) :: dset_id
+       END FUNCTION h5dopen_c
+    END INTERFACE
+
+    dapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(dapl_id)) dapl_id_default = dapl_id
+
+    namelen = LEN(name)
+    hdferr = h5dopen_c(loc_id, name, namelen, dapl_id_default, dset_id)
+
+  END SUBROUTINE h5dopen_f
+
+!
+!****s* H5D/h5dclose_f
+!
+! NAME
+!  h5dclose_f
+!
+! PURPOSE
+!  Closes a dataset.
+!
+! INPUTS
+!  dset_id 	 - dataset identifier
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! SOURCE
+  SUBROUTINE h5dclose_f(dset_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id ! Dataset identifier
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5dclose_c(dset_id) &
+            BIND(C,NAME='h5dclose_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dset_id
+       END FUNCTION h5dclose_c
+    END INTERFACE
+
+    hdferr = h5dclose_c(dset_id)
+
+  END SUBROUTINE h5dclose_f
+
+!
+!****s* H5D/h5dget_type_f
+!
+! NAME
+!  h5dget_type_f
+!
+! PURPOSE
+!  Returns an identifier for a copy of the datatype for a
+!  dataset.
+!
+! INPUTS
+!  dataset_id 	 - dataset identifier
+! OUTPUTS
+!  datatype_id 	 - dataspace identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! NOTES
+!
+! SOURCE
+  SUBROUTINE h5dget_type_f(dataset_id, datatype_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dataset_id      ! Dataset identifier
+    INTEGER(HID_T), INTENT(OUT) :: datatype_id    ! Datatype identifier
+    INTEGER, INTENT(OUT) :: hdferr                ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5dget_type_c(dataset_id, datatype_id) &
+            BIND(C,NAME='h5dget_type_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dataset_id
+         INTEGER(HID_T), INTENT(OUT) :: datatype_id
+       END FUNCTION h5dget_type_c
+    END INTERFACE
+
+    hdferr = h5dget_type_c (dataset_id, datatype_id)
+  END SUBROUTINE h5dget_type_f
+
+!
+!****s* H5D/h5dset_extent
+!
+! NAME
+!  h5dset_extent (instead of obsolete name: h5dextend_f)
+!
+! PURPOSE
+!  Extends a dataset with unlimited dimension.
+!
+! INPUTS
+!  dataset_id 	 - dataset identifier
+!  size 	 - array containing the new magnitude of
+!                  each dimension
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+!  Changed name from the now obsolete h5dextend_f
+!  to h5dset_extent_f. Provided interface to old name
+!  for backward compatability. -MSB- March 14, 2008
+!
+! SOURCE
+  SUBROUTINE h5dset_extent_f(dataset_id, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dataset_id      ! Dataset identifier
+    INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN)  :: size
+    ! Array containing
+    ! dimensions' sizes
+    INTEGER, INTENT(OUT) :: hdferr                ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5dset_extent_c(dataset_id, size) &
+            BIND(C,NAME='h5dset_extent_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dataset_id
+         INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN)  :: size
+       END FUNCTION h5dset_extent_c
+    END INTERFACE
+
+    hdferr = H5Dset_extent_c(dataset_id, size)
+  END SUBROUTINE h5dset_extent_f
+
+!****s* H5D/h5dget_create_plist_f
+!
+! NAME
+!  h5dget_create_plist_f
+!
+! PURPOSE
+!  Returns an identifier for a copy of the dataset creation
+!  property list for a dataset.
+!
+! INPUTS
+!  dataset_id 	 - dataset identifier
+! OUTPUTS
+!  plist_id 	 - creation property list identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+! SOURCE
+  SUBROUTINE h5dget_create_plist_f(dataset_id, plist_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dataset_id   ! Dataset identifier
+    INTEGER(HID_T), INTENT(OUT) :: plist_id    ! Dataset creation
+                                               ! property list identifier
+    INTEGER, INTENT(OUT) :: hdferr             ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5dget_create_plist_c(dataset_id, plist_id) &
+            BIND(C,NAME='h5dget_create_plist_c')
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN) :: dataset_id
+         INTEGER(HID_T), INTENT(OUT) :: plist_id
+       END FUNCTION h5dget_create_plist_c
+    END INTERFACE
+
+    hdferr = h5dget_create_plist_c(dataset_id, plist_id)
+  END SUBROUTINE h5dget_create_plist_f
+
+!
+!****s* H5D/h5dget_storage_size_f
+!
+! NAME
+!  h5dget_storage_size_f
+!
+! PURPOSE
+!  Returns the amount of storage requires by a dataset
+!
+! INPUTS
+!  dataset_id 	 - dataset identifier
+! OUTPUTS
+!  size 	 - datastorage size
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 15, 2002
+! SOURCE
+  SUBROUTINE h5dget_storage_size_f(dataset_id, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dataset_id ! Dataset identifier
+    INTEGER(HSIZE_T),  INTENT(OUT)  :: size  ! Amount of storage
+                                             ! allocated for dataset
+    INTEGER, INTENT(OUT) :: hdferr           ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5dget_storage_size_c(dataset_id, size) &
+            BIND(C,NAME='h5dget_storage_size_c')
+         IMPORT :: HID_T, HSIZE_T
+         INTEGER(HID_T), INTENT(IN) :: dataset_id
+         INTEGER(HSIZE_T), INTENT(OUT)  :: size
+       END FUNCTION h5dget_storage_size_c
+    END INTERFACE
+
+    hdferr = h5dget_storage_size_c(dataset_id, size)
+  END SUBROUTINE h5dget_storage_size_f
+
+!
+!****s* H5D/h5dvlen_get_max_len_f
+!
+! NAME
+!  h5dvlen_get_max_len_f
+!
+! PURPOSE
+!  Returns maximum length of the VL array elements
+!
+! INPUTS
+!  dataset_id 	 - dataset identifier
+!  type_id 	 - datatype identifier
+!  space_id 	 - dataspace identifier
+! OUTPUTS
+!  size 	 - buffer size
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  NONE
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 15, 2002
+!
+! SOURCE
+  SUBROUTINE h5dvlen_get_max_len_f(dataset_id, type_id, space_id, len,  hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dataset_id      ! Dataset identifier
+    INTEGER(HID_T), INTENT(IN) :: type_id         ! Datatype identifier
+    INTEGER(HID_T), INTENT(IN) :: space_id        ! Dataspace identifier
+    INTEGER(SIZE_T),  INTENT(OUT)  :: len         ! Maximum length of the element
+    INTEGER, INTENT(OUT) :: hdferr                ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5dvlen_get_max_len_c(dataset_id, type_id, space_id, len) &
+            BIND(C,NAME='h5dvlen_get_max_len_c')
+         IMPORT :: HID_T, SIZE_T
+         INTEGER(HID_T), INTENT(IN) :: dataset_id
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER(SIZE_T), INTENT(OUT)  :: len
+       END FUNCTION h5dvlen_get_max_len_c
+    END INTERFACE
+
+    hdferr = h5dvlen_get_max_len_c(dataset_id, type_id,  space_id, len)
+  END SUBROUTINE h5dvlen_get_max_len_f
+
+!
+!****s* H5D/h5dget_space_status_f
+!
+! NAME
+!  h5dget_space_status_f
+!
+! PURPOSE
+!  Returns the status of data space allocation.
+!
+! INPUTS
+!  dset_id	 - dataset identifier
+! OUTPUTS
+!  flag          - status; may have one of the following values:
+!		    H5D_SPACE_STS_ERROR_F
+!		    H5D_SPACE_STS_NOT_ALLOCATED_F
+!		    H5D_SPACE_STS_PART_ALLOCATED_F
+!		    H5D_SPACE_STS_ALLOCATED_F
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  March 12, 2003
+!
+! SOURCE
+  SUBROUTINE h5dget_space_status_f(dset_id, flag, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id  ! Dataspace identifier
+    INTEGER, INTENT(OUT)       :: flag     ! Memory buffer to fill in
+    INTEGER, INTENT(OUT)       :: hdferr   ! Error code
+  !*****
+    INTERFACE
+       INTEGER FUNCTION h5dget_space_status_c(dset_id, flag) &
+            BIND(C,NAME='h5dget_space_status_c')
+         IMPORT :: HID_T
+         INTEGER(HID_T) :: dset_id
+         INTEGER        :: flag
+       END FUNCTION h5dget_space_status_c
+    END INTERFACE
+
+    hdferr = h5dget_space_status_c(dset_id, flag)
+  END SUBROUTINE h5dget_space_status_f
+
+!
+!****s* H5D/h5dcreate_anon_f
+!
+! NAME
+!  h5dcreate_anon_f
+!
+! PURPOSE
+!  Creates a dataset in a file without linking it into the file structure
+!
+! INPUTS
+!  loc_id	 - Identifier of the file or group within which to create the dataset.
+!  type_id	 - Identifier of the datatype to use when creating the dataset.
+!  space_id	 - Identifier of the dataspace to use when creating the dataset.
+! OUTPUTS
+!  dset_id	 - dataset identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  dcpl_id       - Dataset creation property list identifier.
+!  dapl_id  	 - Dataset access property list identifier.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 11, 2008
+!
+! SOURCE
+  SUBROUTINE h5dcreate_anon_f(loc_id, type_id, space_id, dset_id, hdferr, dcpl_id, dapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier.
+    INTEGER(HID_T), INTENT(IN) :: type_id  ! Datatype identifier.
+    INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier.
+    INTEGER(HID_T), INTENT(OUT) :: dset_id ! Dataset identifier.
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code.
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: dcpl_id  ! Dataset creation property list identifier.
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: dapl_id  ! Dataset access property list identifier.
+!*****
+    INTEGER(HID_T) :: dcpl_id_default
+    INTEGER(HID_T) :: dapl_id_default
+
+    !
+    !  MS FORTRAN needs explicit interface for C functions called here.
+    !
+    INTERFACE
+       INTEGER FUNCTION h5dcreate_anon_c(loc_id, type_id, space_id, dcpl_id_default, dapl_id_default, dset_id) &
+            BIND(C,NAME='h5dcreate_anon_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER(HID_T) :: dcpl_id_default
+         INTEGER(HID_T) :: dapl_id_default
+         INTEGER(HID_T), INTENT(OUT) :: dset_id
+       END FUNCTION h5dcreate_anon_c
+    END INTERFACE
+
+    dcpl_id_default = H5P_DEFAULT_F
+    dapl_id_default = H5P_DEFAULT_F
+
+    IF(PRESENT(dcpl_id)) dcpl_id_default = dcpl_id
+    IF(PRESENT(dapl_id)) dapl_id_default = dapl_id
+
+    hdferr = h5dcreate_anon_c(loc_id, type_id, space_id, dcpl_id_default, dapl_id_default, dset_id)
+
+  END SUBROUTINE h5dcreate_anon_f
+
+  SUBROUTINE h5dwrite_vl_integer(dset_id, mem_type_id, buf, dims, len, &
+       hdferr, &
+       mem_space_id, file_space_id, xfer_prp)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
+    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
+    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims ! MAX len x num_elem
+    INTEGER(SIZE_T), INTENT(IN), DIMENSION(*) :: len ! Array to store
+                                                     ! the length of each
+                                                     ! element
+    INTEGER, INTENT(IN), DIMENSION(dims(1),dims(2)), TARGET :: buf   ! Data buffer
+    INTEGER, INTENT(OUT) :: hdferr      ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
+    INTEGER(HID_T) :: xfer_prp_default
+    INTEGER(HID_T) :: mem_space_id_default
+    INTEGER(HID_T) :: file_space_id_default
+
+    INTERFACE
+       INTEGER FUNCTION h5dwrite_vl_integer_c(dset_id, mem_type_id, &
+            mem_space_id_default, &
+            file_space_id_default, &
+            xfer_prp_default, buf, dims, len) &
+            BIND(C,NAME='h5dwrite_vl_integer_c')
+         IMPORT :: HID_T, HSIZE_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dset_id
+         INTEGER(HID_T), INTENT(IN) :: mem_type_id
+         INTEGER(HID_T)  :: mem_space_id_default
+         INTEGER(HID_T) :: file_space_id_default
+         INTEGER(HID_T) :: xfer_prp_default
+         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
+         INTEGER(SIZE_T), INTENT(IN), DIMENSION(*) :: len
+         INTEGER, INTENT(IN), DIMENSION(dims(1),dims(2)) :: buf
+       END FUNCTION h5dwrite_vl_integer_c
+    END INTERFACE
+
+    xfer_prp_default = H5P_DEFAULT_F
+    mem_space_id_default = H5S_ALL_F
+    file_space_id_default = H5S_ALL_F
+
+    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
+    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
+    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
+
+    hdferr = h5dwrite_vl_integer_c(dset_id, mem_type_id, mem_space_id_default, &
+         file_space_id_default, xfer_prp_default, &
+         buf, dims, len)
+
+  END SUBROUTINE h5dwrite_vl_integer
+
+  SUBROUTINE h5dread_vl_integer(dset_id, mem_type_id, buf, dims, len, &
+       hdferr, &
+       mem_space_id, file_space_id, xfer_prp)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
+    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
+    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims  ! MAX len x num_elem
+    INTEGER(SIZE_T), INTENT(INOUT), DIMENSION(*) :: len ! Array to store
+                                                        ! the length of each
+                                                        ! element
+    INTEGER, INTENT(INOUT), &
+         DIMENSION(dims(1),dims(2)), TARGET :: buf   ! Data buffer
+    INTEGER, INTENT(OUT) :: hdferr ! Error code
+                                   ! -1 if failed, 0 otherwise
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
+    INTEGER(HID_T) :: xfer_prp_default
+    INTEGER(HID_T)  :: mem_space_id_default
+    INTEGER(HID_T) :: file_space_id_default
+    INTEGER(HID_T) :: tmp
+    INTEGER :: error
+
+    INTERFACE
+       INTEGER FUNCTION h5dread_vl_integer_c(dset_id, mem_type_id, &
+            mem_space_id_default, &
+            file_space_id_default, &
+            xfer_prp_default, buf, dims, len) &
+            BIND(C,NAME='h5dread_vl_integer_c')
+         IMPORT :: HID_T, HSIZE_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dset_id
+         INTEGER(HID_T), INTENT(IN) :: mem_type_id
+         INTEGER(HID_T)  :: mem_space_id_default
+         INTEGER(HID_T) :: file_space_id_default
+         INTEGER(HID_T) :: xfer_prp_default
+         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
+         INTEGER(SIZE_T), INTENT(INOUT), DIMENSION(*) :: len
+         INTEGER, INTENT(INOUT), DIMENSION(dims(1),dims(2)) :: buf
+       END FUNCTION h5dread_vl_integer_c
+    END INTERFACE
+
+    CALL h5dget_space_f(dset_id, tmp, error)
+    xfer_prp_default = H5P_DEFAULT_F
+    mem_space_id_default = tmp
+    file_space_id_default = tmp
+
+    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
+    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
+    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
+
+    hdferr = h5dread_vl_integer_c(dset_id, mem_type_id, mem_space_id_default, &
+         file_space_id_default, xfer_prp_default, &
+         buf, dims, len)
+
+  END SUBROUTINE h5dread_vl_integer
+
+  SUBROUTINE h5dwrite_vl_real(dset_id, mem_type_id, buf, dims, len, &
+       hdferr, &
+       mem_space_id, file_space_id, xfer_prp)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
+    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
+    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims ! MAX len x num_elem
+    INTEGER(SIZE_T), INTENT(IN), DIMENSION(*) :: len   ! Array to store
+                                                       ! the length of each
+                                                       ! element
+    REAL, INTENT(IN), &
+         DIMENSION(dims(1),dims(2)) :: buf ! Data buffer
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
+
+    INTEGER(HID_T) :: xfer_prp_default
+    INTEGER(HID_T) :: mem_space_id_default
+    INTEGER(HID_T) :: file_space_id_default
+
+    INTERFACE
+       INTEGER FUNCTION h5dwrite_vl_real_c(dset_id, mem_type_id, &
+            mem_space_id_default, &
+            file_space_id_default, &
+            xfer_prp_default, buf, dims, len) &
+            BIND(C,NAME='h5dwrite_vl_real_c')
+         IMPORT :: HID_T, HSIZE_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dset_id
+         INTEGER(HID_T), INTENT(IN) :: mem_type_id
+         INTEGER(HID_T)  :: mem_space_id_default
+         INTEGER(HID_T) :: file_space_id_default
+         INTEGER(HID_T) :: xfer_prp_default
+         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
+         INTEGER(SIZE_T), INTENT(IN), DIMENSION(*) :: len
+         REAL, INTENT(IN), &
+              DIMENSION(dims(1),dims(2)) :: buf
+       END FUNCTION h5dwrite_vl_real_c
+    END INTERFACE
+
+
+    xfer_prp_default = H5P_DEFAULT_F
+    mem_space_id_default = H5S_ALL_F
+    file_space_id_default = H5S_ALL_F
+
+    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
+    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
+    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
+
+    hdferr = h5dwrite_vl_real_c(dset_id, mem_type_id, mem_space_id_default, &
+         file_space_id_default, xfer_prp_default, &
+         buf, dims, len)
+
+  END SUBROUTINE h5dwrite_vl_real
+
+  SUBROUTINE h5dread_vl_real(dset_id, mem_type_id, buf, dims, len, &
+       hdferr, &
+       mem_space_id, file_space_id, xfer_prp)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
+    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
+    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims  ! MAX len x num_elem
+    INTEGER(SIZE_T), INTENT(INOUT), DIMENSION(*) :: len ! Array to store the length of each element
+    REAL, INTENT(INOUT), &
+         DIMENSION(dims(1),dims(2)) :: buf ! Data buffer
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+                                           ! -1 if failed, 0 otherwise
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
+
+    INTEGER(HID_T) :: xfer_prp_default
+    INTEGER(HID_T)  :: mem_space_id_default
+    INTEGER(HID_T) :: file_space_id_default
+    INTEGER(HID_T) :: tmp
+    INTEGER :: error
+
+    INTERFACE
+       INTEGER FUNCTION h5dread_vl_real_c(dset_id, mem_type_id, &
+            mem_space_id_default, &
+            file_space_id_default, &
+            xfer_prp_default, buf, dims, len) &
+            BIND(C,NAME='h5dread_vl_real_c')
+         IMPORT :: HID_T, HSIZE_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dset_id
+         INTEGER(HID_T), INTENT(IN) :: mem_type_id
+         INTEGER(HID_T)  :: mem_space_id_default
+         INTEGER(HID_T) :: file_space_id_default
+         INTEGER(HID_T) :: xfer_prp_default
+         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
+         INTEGER(SIZE_T), INTENT(INOUT), DIMENSION(*) :: len
+         REAL, INTENT(INOUT), &
+              DIMENSION(dims(1),dims(2)) :: buf
+       END FUNCTION h5dread_vl_real_c
+    END INTERFACE
+
+    CALL h5dget_space_f(dset_id, tmp, error)
+    xfer_prp_default = H5P_DEFAULT_F
+    mem_space_id_default = tmp
+    file_space_id_default = tmp
+
+    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
+    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
+    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
+
+    hdferr = h5dread_vl_real_c(dset_id, mem_type_id, mem_space_id_default, &
+         file_space_id_default, xfer_prp_default, &
+         buf, dims, len)
+
+  END SUBROUTINE h5dread_vl_real
+
+  SUBROUTINE h5dwrite_vl_string(dset_id, mem_type_id, buf, dims, str_len, &
+       hdferr, &
+       mem_space_id, file_space_id, xfer_prp)
+    USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_char
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
+    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
+    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims   ! Number of strings
+    INTEGER(SIZE_T), INTENT(IN), DIMENSION(*) :: str_len ! Array to store the length of each element
+    CHARACTER(LEN=*), INTENT(IN), DIMENSION(dims(2)) :: buf  ! Data buffer
+    INTEGER, INTENT(OUT) :: hdferr  ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
+
+    INTEGER(HID_T) :: xfer_prp_default
+    INTEGER(HID_T)  :: mem_space_id_default
+    INTEGER(HID_T) :: file_space_id_default
+
+    INTERFACE
+       INTEGER FUNCTION h5dwrite_vl_string_c(dset_id, mem_type_id, &
+            mem_space_id_default, &
+            file_space_id_default, &
+            ! xfer_prp_default, tmp_buf, dims, str_len)
+            xfer_prp_default, buf, dims, str_len) &
+            BIND(C,NAME='h5dwrite_vl_string_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, HSIZE_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dset_id
+         INTEGER(HID_T), INTENT(IN) :: mem_type_id
+         INTEGER(HID_T)  :: mem_space_id_default
+         INTEGER(HID_T) :: file_space_id_default
+         INTEGER(HID_T) :: xfer_prp_default
+         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims
+         INTEGER(SIZE_T), INTENT(IN), DIMENSION(*) :: str_len
+         CHARACTER(KIND=C_CHAR), DIMENSION(dims(2)) :: buf
+       END FUNCTION
+    END INTERFACE
+
+
+    xfer_prp_default = H5P_DEFAULT_F
+    mem_space_id_default = H5S_ALL_F
+    file_space_id_default = H5S_ALL_F
+
+    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
+    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
+    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
+
+    hdferr = h5dwrite_vl_string_c(dset_id, mem_type_id, mem_space_id_default, &
+         file_space_id_default, xfer_prp_default, &
+         buf, dims, str_len)
+
+  END SUBROUTINE h5dwrite_vl_string
+
+  SUBROUTINE h5dread_vl_string(dset_id, mem_type_id, buf, dims, str_len, &
+       hdferr, mem_space_id, file_space_id, xfer_prp)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
+    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
+    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims ! number of strings
+    INTEGER(SIZE_T), INTENT(OUT), DIMENSION(*) :: str_len ! Array to store
+    ! the length of each
+    ! element
+    CHARACTER(LEN=*), INTENT(OUT), &
+         DIMENSION(dims(2)) :: buf      ! Data buffer
+    INTEGER, INTENT(OUT) :: hdferr      ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
+
+    INTEGER(HID_T) :: xfer_prp_default
+    INTEGER(HID_T)  :: mem_space_id_default
+    INTEGER(HID_T) :: file_space_id_default
+
+    INTERFACE
+       INTEGER FUNCTION h5dread_vl_string_c(dset_id, mem_type_id, &
+            mem_space_id_default, &
+            file_space_id_default, &
+            xfer_prp_default, buf, dims, str_len) &
+            BIND(C,NAME='h5dread_vl_string_c')
+         IMPORT :: c_char
+         IMPORT :: HID_T, HSIZE_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dset_id
+         INTEGER(HID_T), INTENT(IN) :: mem_type_id
+         INTEGER(HID_T)  :: mem_space_id_default
+         INTEGER(HID_T) :: file_space_id_default
+         INTEGER(HID_T) :: xfer_prp_default
+         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims
+         INTEGER(SIZE_T), INTENT(OUT), DIMENSION(*) :: str_len
+         CHARACTER(KIND=C_CHAR), DIMENSION(dims(2)) :: buf
+       END FUNCTION h5dread_vl_string_c
+    END INTERFACE
+
+    xfer_prp_default = H5P_DEFAULT_F
+    mem_space_id_default = H5S_ALL_F
+    file_space_id_default = H5S_ALL_F
+
+    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
+    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
+    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
+
+    hdferr = h5dread_vl_string_c(dset_id, mem_type_id, mem_space_id_default, &
+         file_space_id_default, xfer_prp_default, &
+         buf, dims, str_len)
+    RETURN
+  END SUBROUTINE h5dread_vl_string
+
+!
+!****s* H5D/h5dget_offset_f
+!
+! NAME
+!  h5dget_offset_f
+!
+! PURPOSE
+!  Returns dataset address in file.
+!
+! INPUTS
+!  dataset_id  - Dataset identifier.
+! OUTPUTS
+!  offset      - The offset in bytes.
+!  hdferr      - Returns 0 if successful and -1 if fails.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  April 16, 2015
+!
+! SOURCE
+  SUBROUTINE h5dget_offset_f(dset_id, offset, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN)    :: dset_id
+    INTEGER(HADDR_T), INTENT(OUT) :: offset 
+    INTEGER, INTENT(OUT)          :: hdferr
+!*****
+    INTERFACE
+       INTEGER(HADDR_T) FUNCTION h5dget_offset(dset_id) BIND(C,NAME='H5Dget_offset')
+         IMPORT :: HID_T, HADDR_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN), VALUE :: dset_id
+       END FUNCTION h5dget_offset
+    END INTERFACE
+
+    offset = h5dget_offset(dset_id)
+    
+    hdferr = 0 ! never returns a function error because C API never returns a function error.
+
+  END SUBROUTINE h5dget_offset_f
+
+!
+!****s* H5D/h5dget_space_f
+!
+! NAME
+!  h5dget_space_f
+!
+! PURPOSE
+!  Returns an identifier for a copy of the dataspace for a
+!  dataset.
+!
+! INPUTS
+!  dataset_id 	 - dataset identifier
+! OUTPUTS
+!  dataspace_id  - dataspace identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! SOURCE
+  SUBROUTINE h5dget_space_f(dataset_id, dataspace_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dataset_id      ! Dataset identifier
+    INTEGER(HID_T), INTENT(OUT) :: dataspace_id   ! Dataspace identifier
+    INTEGER, INTENT(OUT) :: hdferr                ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5dget_space_c(dataset_id, dataspace_id) BIND(C,NAME='h5dget_space_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dataset_id
+         INTEGER(HID_T), INTENT(OUT) :: dataspace_id
+       END FUNCTION h5dget_space_c
+    END INTERFACE
+
+    hdferr = h5dget_space_c(dataset_id, dataspace_id)
+  END SUBROUTINE h5dget_space_f
+
+!****s* H5D/h5dget_access_plist_f
+!
+! NAME
+!  h5dget_access_plist_f
+!
+! PURPOSE
+!  Returns a copy of the dataset creation property list.
+!
+! INPUTS
+!  dset_id       - Dataset identifier
+!
+! OUTPUTS
+!  plist_id	 - Dataset access property list identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR   
+!  M. Scot Breitenfeld
+!  April 13, 2009
+!
+! SOURCE
+  SUBROUTINE h5dget_access_plist_f(dset_id, plist_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN)  :: dset_id
+    INTEGER(HID_T), INTENT(OUT) :: plist_id 
+    INTEGER       , INTENT(OUT) :: hdferr  
+    !*****
+    INTERFACE
+       INTEGER FUNCTION h5dget_access_plist_c(dset_id, plist_id) BIND(C,NAME='h5dget_access_plist_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dset_id
+         INTEGER(HID_T), INTENT(OUT) :: plist_id
+       END FUNCTION h5dget_access_plist_c
+    END INTERFACE
+    
+    hdferr = h5dget_access_plist_c(dset_id, plist_id)
+  
+  END SUBROUTINE h5dget_access_plist_f
+
+
+  SUBROUTINE h5dwrite_reference_obj(dset_id, mem_type_id, buf, dims, hdferr, &
+       mem_space_id, file_space_id, xfer_prp)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
+    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
+    INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: dims ! size of the bufffer buf
+    TYPE(hobj_ref_t_f), DIMENSION(dims(1)), INTENT(IN), TARGET :: buf ! Data buffer
+    INTEGER, INTENT(OUT) :: hdferr      ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
+
+    INTEGER(HID_T) :: xfer_prp_default
+    INTEGER(HID_T) :: mem_space_id_default
+    INTEGER(HID_T) :: file_space_id_default
+    TYPE(C_PTR) :: f_ptr
+
+    xfer_prp_default = H5P_DEFAULT_F
+    mem_space_id_default = H5S_ALL_F
+    file_space_id_default = H5S_ALL_F
+
+    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
+    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
+    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
+    f_ptr = C_LOC(buf(1))
+
+    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
+         file_space_id_default, xfer_prp_default, f_ptr)
+
+  END SUBROUTINE h5dwrite_reference_obj
+
+  SUBROUTINE h5dwrite_reference_dsetreg(dset_id, mem_type_id, buf, dims, hdferr, &
+       mem_space_id, file_space_id, xfer_prp)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
+    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
+    INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: dims ! size of the bufffer buf
+    TYPE(hdset_reg_ref_t_f), DIMENSION(dims(1)), INTENT(IN), TARGET :: buf ! Data buffer
+    INTEGER, INTENT(OUT) :: hdferr      ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
+
+    INTEGER(HID_T) :: xfer_prp_default
+    INTEGER(HID_T) :: mem_space_id_default
+    INTEGER(HID_T) :: file_space_id_default
+    INTEGER, ALLOCATABLE, DIMENSION(:) :: ref_buf
+    INTEGER :: i
+    INTEGER(HSIZE_T) :: j
+    TYPE(C_PTR) :: f_ptr
+    INTERFACE
+       INTEGER FUNCTION h5dwrite_ref_reg_c(dset_id, mem_type_id,&
+            mem_space_id_default, &
+            file_space_id_default, xfer_prp_default, ref_buf, dims) &
+            BIND(C,NAME='h5dwrite_ref_reg_c')
+         IMPORT :: HID_T, HSIZE_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dset_id
+         INTEGER(HID_T), INTENT(IN) :: mem_type_id
+         INTEGER(HID_T) :: xfer_prp_default
+         INTEGER(HID_T)  :: mem_space_id_default
+         INTEGER(HID_T) :: file_space_id_default
+         INTEGER, DIMENSION(*) :: ref_buf
+         INTEGER(HSIZE_T), DIMENSION(*) ::  dims
+       END FUNCTION h5dwrite_ref_reg_c
+    END INTERFACE
+    xfer_prp_default = H5P_DEFAULT_F
+    mem_space_id_default = H5S_ALL_F
+    file_space_id_default = H5S_ALL_F
+
+    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
+    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
+    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
+    f_ptr = C_LOC(buf(1))
+
+    ALLOCATE(ref_buf(REF_REG_BUF_LEN*dims(1)), stat=hdferr)
+    IF (hdferr .NE. 0 ) THEN
+       hdferr = -1
+       RETURN
+    ELSE
+       DO j = 1, dims(1)
+          DO i = 1, REF_REG_BUF_LEN
+             ref_buf(REF_REG_BUF_LEN*(j-1) + i) = buf(j)%ref(i)
+          ENDDO
+       ENDDO
+    ENDIF
+    hdferr = h5dwrite_ref_reg_c(dset_id, mem_type_id, mem_space_id_default, &
+         file_space_id_default, xfer_prp_default, ref_buf, dims)
+    DEALLOCATE(ref_buf)
+
+  END SUBROUTINE h5dwrite_reference_dsetreg
+
+  SUBROUTINE h5dwrite_char_scalar(dset_id, mem_type_id, buf, dims, hdferr, &
+       mem_space_id, file_space_id, xfer_prp)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
+    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
+    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
+    CHARACTER(*), INTENT(IN), TARGET :: buf ! Data buffer
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
+                                 
+    CALL h5dwrite_char_scalar_fix(dset_id, mem_type_id, buf, LEN(buf), dims, hdferr, &
+       mem_space_id, file_space_id, xfer_prp)
+
+  END SUBROUTINE h5dwrite_char_scalar
+
+  SUBROUTINE h5dwrite_char_scalar_fix(dset_id, mem_type_id, buf, buf_len, dims, hdferr, &
+       mem_space_id, file_space_id, xfer_prp)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
+    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
+    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
+    INTEGER, INTENT(IN) :: buf_len
+    CHARACTER(LEN=buf_len), INTENT(IN), TARGET :: buf ! Data buffer
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
+    INTEGER(HID_T) :: xfer_prp_default
+    INTEGER(HID_T) :: mem_space_id_default
+    INTEGER(HID_T) :: file_space_id_default
+    TYPE(C_PTR) :: f_ptr
+
+    xfer_prp_default = H5P_DEFAULT_F
+    mem_space_id_default = H5S_ALL_F
+    file_space_id_default = H5S_ALL_F
+
+    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
+    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
+    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
+
+    f_ptr = C_LOC(buf(1:1))
+
+    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
+         file_space_id_default, xfer_prp_default, f_ptr)
+
+  END SUBROUTINE h5dwrite_char_scalar_fix
+
+  SUBROUTINE h5dread_reference_obj(dset_id, mem_type_id, buf, dims, hdferr, &
+       mem_space_id, file_space_id, xfer_prp)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
+    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
+    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
+    TYPE(hobj_ref_t_f), INTENT(INOUT) , &
+         DIMENSION(dims(1)), TARGET :: buf
+    INTEGER, INTENT(OUT) :: hdferr      ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
+
+    INTEGER(HID_T) :: xfer_prp_default
+    INTEGER(HID_T) :: mem_space_id_default
+    INTEGER(HID_T) :: file_space_id_default
+    TYPE(C_PTR) :: f_ptr
+
+    xfer_prp_default = H5P_DEFAULT_F
+    mem_space_id_default = H5S_ALL_F
+    file_space_id_default = H5S_ALL_F
+
+    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
+    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
+    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
+    f_ptr = C_LOC(buf(1))
+
+    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
+         file_space_id_default, xfer_prp_default, f_ptr)
+
+  END SUBROUTINE h5dread_reference_obj
+
+  SUBROUTINE h5dread_reference_dsetreg(dset_id, mem_type_id, buf, dims, hdferr, &
+       mem_space_id, file_space_id, xfer_prp)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
+    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
+    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
+    TYPE(hdset_reg_ref_t_f), INTENT(INOUT), &
+         DIMENSION(dims(1)), TARGET :: buf
+    INTEGER, INTENT(OUT) :: hdferr      ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
+    INTEGER(HID_T) :: xfer_prp_default
+    INTEGER(HID_T) :: mem_space_id_default
+    INTEGER(HID_T) :: file_space_id_default
+
+    INTEGER, ALLOCATABLE, DIMENSION(:) :: ref_buf
+    INTEGER :: i
+    INTEGER(HSIZE_T) :: j
+    INTERFACE
+       INTEGER FUNCTION h5dread_ref_reg_c(dset_id, mem_type_id,&
+            mem_space_id_default, &
+            file_space_id_default, xfer_prp_default, ref_buf, dims) &
+            BIND(C,NAME='h5dread_ref_reg_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dset_id
+         INTEGER(HID_T), INTENT(IN) :: mem_type_id
+         INTEGER(HID_T) :: xfer_prp_default
+         INTEGER(HID_T)  :: mem_space_id_default
+         INTEGER(HID_T) :: file_space_id_default
+         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
+         INTEGER, DIMENSION(*) :: ref_buf
+       END FUNCTION h5dread_ref_reg_c
+    END INTERFACE
+
+    ALLOCATE(ref_buf(REF_REG_BUF_LEN*dims(1)), stat=hdferr)
+    IF (hdferr .NE. 0) THEN
+       hdferr = -1
+       RETURN
+    ENDIF
+
+    xfer_prp_default = H5P_DEFAULT_F
+    mem_space_id_default = H5S_ALL_F
+    file_space_id_default = H5S_ALL_F
+
+    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
+    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
+    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
+
+    hdferr = h5dread_ref_reg_c(dset_id, mem_type_id, mem_space_id_default, &
+         file_space_id_default, xfer_prp_default, ref_buf, dims)
+
+    DO j = 1, dims(1)
+       DO i = 1, REF_REG_BUF_LEN
+          buf(j)%ref(i) = ref_buf(REF_REG_BUF_LEN*(j-1) + i)
+       ENDDO
+    ENDDO
+    DEALLOCATE(ref_buf)
+
+  END SUBROUTINE h5dread_reference_dsetreg
+
+  SUBROUTINE h5dread_char_scalar(dset_id, mem_type_id, buf, dims, hdferr, &
+       mem_space_id, file_space_id, xfer_prp)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id         ! Dataset identifier
+    INTEGER(HID_T), INTENT(IN) :: mem_type_id   ! Memory datatype identifier
+    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
+    CHARACTER(LEN=*), INTENT(INOUT) :: buf     ! Data buffer
+    INTEGER, INTENT(OUT) :: hdferr             ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
+
+    INTEGER(HID_T) :: xfer_prp_default
+    INTEGER(HID_T) :: mem_space_id_default
+    INTEGER(HID_T) :: file_space_id_default
+
+    xfer_prp_default = H5P_DEFAULT_F
+    mem_space_id_default = H5S_ALL_F
+    file_space_id_default = H5S_ALL_F
+
+    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
+    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
+    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
+
+    CALL h5dread_char_scalar_fix(dset_id, mem_type_id, buf, LEN(buf), hdferr, &
+         mem_space_id_default, file_space_id_default, xfer_prp_default)
+
+  END SUBROUTINE h5dread_char_scalar
+
+  SUBROUTINE h5dread_char_scalar_fix(dset_id, mem_type_id, buf, buf_len, hdferr, &
+       mem_space_id, file_space_id, xfer_prp)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
+    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
+    INTEGER, INTENT(IN)  :: buf_len
+    CHARACTER(LEN=buf_len), INTENT(INOUT), TARGET :: buf ! Data buffer
+    INTEGER, INTENT(OUT) :: hdferr      ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
+
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1:1))
+
+    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id, &
+         file_space_id, xfer_prp, f_ptr)
+
+  END SUBROUTINE h5dread_char_scalar_fix
+
+!****s* H5D (F03)/h5dwrite_f_F03
+!
+! NAME		
+!  h5dwrite_f_F03
+!
+! PURPOSE
+!  Writes raw data from a dataset into a buffer. 
+!
+! Inputs:
+!  dset_id	 - Identifier of the dataset to write to.
+!  mem_type_id	 - Identifier of the memory datatype.
+!  buf		 - Buffer with data to be written to the file.
+!  
+! Outputs:
+!  hdferr        - Returns 0 if successful and -1 if fails
+!
+! Optional parameters:
+!  mem_space_id	 - Identifier of the memory dataspace.
+!  file_space_id - Identifier of the dataset's dataspace in the file.
+!  xfer_prp	 - Identifier of a transfer property list for this I/O operation.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  September 17, 2011
+!
+! Fortran2003 Interface:
+!!  SUBROUTINE h5dwrite_f(dset_id, mem_type_id, buf, hdferr, &
+!!                        mem_space_id, file_space_id, xfer_prp)
+!!    INTEGER(HID_T), INTENT(IN)              :: dset_id
+!!    INTEGER(HID_T), INTENT(IN)              :: mem_type_id
+!!    TYPE(C_PTR)   , INTENT(IN)              :: buf
+!!    INTEGER       , INTENT(OUT)             :: hdferr
+!!    INTEGER(HID_T), INTENT(IN)   , OPTIONAL :: mem_space_id
+!!    INTEGER(HID_T), INTENT(IN)   , OPTIONAL :: file_space_id
+!!    INTEGER(HID_T), INTENT(IN)   , OPTIONAL :: xfer_prp
+!*****
+  SUBROUTINE h5dwrite_ptr(dset_id, mem_type_id, buf, hdferr, &
+       mem_space_id, file_space_id, xfer_prp)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
+    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
+    TYPE(C_PTR), INTENT(IN) :: buf
+    INTEGER, INTENT(OUT) :: hdferr      ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
+
+    INTEGER(HID_T) :: xfer_prp_default
+    INTEGER(HID_T) :: mem_space_id_default
+    INTEGER(HID_T) :: file_space_id_default
+
+    xfer_prp_default = H5P_DEFAULT_F
+    mem_space_id_default = H5S_ALL_F
+    file_space_id_default = H5S_ALL_F
+
+    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
+    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
+    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
+
+    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
+         file_space_id_default, xfer_prp_default, buf)
+
+  END SUBROUTINE h5dwrite_ptr
+
+!****s* H5D (F03)/h5dread_f_F03
+!
+! NAME		
+!  h5dread_f_F03
+!
+! PURPOSE
+!  Reads raw data from a dataset into a buffer. 
+!
+! Inputs:
+!  dset_id	 - Identifier of the dataset read from.
+!  mem_type_id	 - Identifier of the memory datatype.
+!  
+! Outputs:
+!  buf		 - Buffer to receive data read from file.
+!  hdferr        - Returns 0 if successful and -1 if fails
+!
+! Optional parameters:
+!  mem_space_id	 - Identifier of the memory dataspace.
+!  file_space_id - Identifier of the dataset's dataspace in the file.
+!  xfer_prp	 - Identifier of a transfer property list for this I/O operation.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  September 17, 2011
+!
+! Fortran2003 Interface:
+!!  SUBROUTINE h5dread_f(dset_id, mem_type_id, buf, hdferr, &
+!!                       mem_space_id, file_space_id, xfer_prp)
+!!    INTEGER(HID_T), INTENT(IN)              :: dset_id
+!!    INTEGER(HID_T), INTENT(IN)              :: mem_type_id
+!!    TYPE(C_PTR)   , INTENT(INOUT)           :: buf
+!!    INTEGER       , INTENT(OUT)             :: hdferr
+!!    INTEGER(HID_T), INTENT(IN)   , OPTIONAL :: mem_space_id
+!!    INTEGER(HID_T), INTENT(IN)   , OPTIONAL :: file_space_id
+!!    INTEGER(HID_T), INTENT(IN)   , OPTIONAL :: xfer_prp
+!*****
+  SUBROUTINE h5dread_ptr(dset_id, mem_type_id, buf, hdferr, &
+       mem_space_id, file_space_id, xfer_prp)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
+    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
+    TYPE(C_PTR), INTENT(INOUT) :: buf
+    INTEGER, INTENT(OUT) :: hdferr      ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
+
+    INTEGER(HID_T) :: xfer_prp_default
+    INTEGER(HID_T) :: mem_space_id_default
+    INTEGER(HID_T) :: file_space_id_default
+
+    xfer_prp_default = H5P_DEFAULT_F
+    mem_space_id_default = H5S_ALL_F
+    file_space_id_default = H5S_ALL_F
+
+    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
+    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
+    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
+
+    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
+         file_space_id_default, xfer_prp_default, buf)
+
+  END SUBROUTINE h5dread_ptr
+
+!
+! NAME		
+!  h5dfill_integer
+!
+! PURPOSE 
+!  Fills dataspace elements with a fill value in a memory buffer.
+!  Only INTEGER, CHARACTER, REAL and DOUBLE PRECISION datatypes
+!  of the fillvalues and buffers are supported. Buffer and fillvalue
+!  are assumed to have the same datatype.
+!  Only one-dimesional buffers are supported.
+!
+! Inputs:
+!		fill_value	- fill value
+!		space_id	- memory space selection identifier
+!		buf		- data buffer iin memory ro apply selection to
+!				- of k-th dimension of the buf array
+! Outputs:
+!		hdferr:		- error code
+!				 	Success:  0
+!				 	Failure: -1
+! AUTHOR
+!  Elena Pourmal
+!  March 12, 2003
+!
+!
+
+  SUBROUTINE h5dfill_integer(fill_value, space_id, buf,  hdferr)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER, INTENT(IN), TARGET :: fill_value  ! Fill value
+    INTEGER(HID_T), INTENT(IN) :: space_id ! Memory dataspace selection identifier
+    INTEGER, INTENT(IN), DIMENSION(*), TARGET :: buf ! Memory buffer to fill in
+    INTEGER, INTENT(OUT) :: hdferr      ! Error code
+
+    INTEGER(HID_T) :: fill_type_id ! Fill value datatype identifier
+    INTEGER(HID_T) :: mem_type_id  ! Buffer dadtype identifier
+
+    TYPE(C_PTR) :: f_ptr_fill_value ! C pointer to fill_value
+    TYPE(C_PTR) :: f_ptr_buf        ! C pointer to buf
+
+    f_ptr_fill_value = C_LOC(fill_value)
+    f_ptr_buf = C_LOC(buf(1))
+
+    fill_type_id = H5T_NATIVE_INTEGER
+    mem_type_id  = H5T_NATIVE_INTEGER
+
+    hdferr = h5dfill_c(f_ptr_fill_value, fill_type_id, space_id, &
+         f_ptr_buf, mem_type_id)
+
+  END SUBROUTINE h5dfill_integer
+
+!
+! NAME
+!  h5dfill_c_float
+!
+! PURPOSE
+!  Fills dataspace elements with a fill value in a memory buffer.
+!  Only INTEGER, CHARACTER, REAL and DOUBLE PRECISION datatypes
+!  of the fillvalues and buffers are supported. Buffer and fillvalue
+!  are assumed to have the same datatype.
+!  Only one-dimesional buffers are supported.
+!
+! Inputs:
+!		fill_value	- fill value
+!		space_id	- memory space selection identifier
+!		buf		- data buffer iin memory ro apply selection to
+!				- of k-th dimension of the buf array
+! Outputs:
+!		hdferr:		- error code
+!				 	Success:  0
+!				 	Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  March 12, 2003
+!
+  SUBROUTINE h5dfill_c_float(fill_valuer, space_id, buf,  hdferr)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    REAL(KIND=C_FLOAT), INTENT(IN), TARGET :: fill_valuer  ! Fill value
+    INTEGER(HID_T), INTENT(IN) :: space_id ! Memory dataspace selection identifier
+    REAL(KIND=C_FLOAT), INTENT(IN), DIMENSION(*), TARGET :: buf ! Memory buffer to fill in
+    INTEGER, INTENT(OUT) :: hdferr      ! Error code
+
+    INTEGER(HID_T) :: fill_type_id ! Fill value datatype identifier
+    INTEGER(HID_T) :: mem_type_id !  Buffer dadtype identifier
+
+    TYPE(C_PTR) :: f_ptr_fill_valuer ! C pointer to fill_value
+    TYPE(C_PTR) :: f_ptr_buf ! C pointer to buf
+
+    f_ptr_fill_valuer = C_LOC(fill_valuer)
+    f_ptr_buf = C_LOC(buf(1))
+
+    fill_type_id = H5T_NATIVE_REAL
+    mem_type_id  = H5T_NATIVE_REAL
+
+    hdferr = h5dfill_c(f_ptr_fill_valuer, fill_type_id, space_id, &
+         f_ptr_buf, mem_type_id)
+
+  END SUBROUTINE h5dfill_c_float
+
+  !----------------------------------------------------------------------
+  ! Name:	  h5dfill_c_double
+  !
+  ! Purpose:      Fills dataspace elements with a fill value in a memory buffer.
+  !               Only INTEGER, CHARACTER, REAL and DOUBLE PRECISION datatypes
+  !               of the fillvalues and buffers are supported. Buffer and fillvalue
+  !               are assumed to have the same datatype.
+  !               Only one-dimesional buffers are supported.
+  !
+  ! Inputs:
+  !		fill_value	- fill value
+  !		space_id	- memory space selection identifier
+  !		buf		- data buffer iin memory ro apply selection to
+  !				- of k-th dimension of the buf array
+  ! Outputs:
+  !		hdferr:		- error code
+  !				 	Success:  0
+  !				 	Failure: -1
+  !
+  ! Programmer:	Elena Pourmal
+  !		March 12, 2003
+  !
+  !----------------------------------------------------------------------
+
+  SUBROUTINE h5dfill_c_double(fill_value, space_id, buf,  hdferr)
+    IMPLICIT NONE
+    REAL(KIND=C_DOUBLE), INTENT(IN), TARGET :: fill_value  ! Fill value
+    INTEGER(HID_T), INTENT(IN) :: space_id ! Memory dataspace selection identifier
+    REAL(KIND=C_DOUBLE), INTENT(IN), DIMENSION(*), TARGET :: buf ! Memory buffer to fill in
+    INTEGER, INTENT(OUT) :: hdferr      ! Error code
+
+    INTEGER(HID_T) :: fill_type_id ! Fill value datatype identifier
+    INTEGER(HID_T) :: mem_type_id !  Buffer dadtype identifier
+
+    TYPE(C_PTR) :: f_ptr_fill_valuer ! C pointer to fill_value
+    TYPE(C_PTR) :: f_ptr_buf ! C pointer to buf
+
+    f_ptr_fill_valuer = C_LOC(fill_value)
+    f_ptr_buf = C_LOC(buf(1))
+
+    fill_type_id = H5T_NATIVE_DOUBLE
+    mem_type_id  = H5T_NATIVE_DOUBLE
+
+    hdferr = h5dfill_c(f_ptr_fill_valuer, fill_type_id, space_id, &
+         f_ptr_buf, mem_type_id)
+
+  END SUBROUTINE h5dfill_c_double
+
+#ifdef H5_FORTRAN_HAVE_C_LONG_DOUBLE
+  SUBROUTINE h5dfill_c_long_double(fill_value, space_id, buf,  hdferr)
+    IMPLICIT NONE
+    REAL(KIND=C_LONG_DOUBLE), INTENT(IN), TARGET :: fill_value  ! Fill value
+    INTEGER(HID_T), INTENT(IN) :: space_id ! Memory dataspace selection identifier
+    REAL(KIND=C_LONG_DOUBLE), INTENT(IN), DIMENSION(*), TARGET :: buf ! Memory buffer to fill in
+    INTEGER, INTENT(OUT) :: hdferr      ! Error code
+
+    INTEGER(HID_T) :: fill_type_id ! Fill value datatype identifier
+    INTEGER(HID_T) :: mem_type_id !  Buffer dadtype identifier
+
+    TYPE(C_PTR) :: f_ptr_fill_valuer ! C pointer to fill_value
+    TYPE(C_PTR) :: f_ptr_buf ! C pointer to buf
+
+    f_ptr_fill_valuer = C_LOC(fill_value)
+    f_ptr_buf = C_LOC(buf(1))
+
+    fill_type_id = H5T_NATIVE_DOUBLE
+    mem_type_id  = H5T_NATIVE_DOUBLE
+
+    hdferr = h5dfill_c(f_ptr_fill_valuer, fill_type_id, space_id, &
+         f_ptr_buf, mem_type_id)
+
+  END SUBROUTINE h5dfill_c_long_double
+#endif
+!
+! NAME		
+!  h5dfill_char
+!
+! PURPOSE 
+!  Fills dataspace elements with a fill value in a memory buffer.
+!  Only INTEGER, CHARACTER, REAL and DOUBLE PRECISION datatypes
+!  of the fillvalues and buffers are supported. Buffer and fillvalue
+!  are assumed to have the same datatype.
+!  Only one-dimesional buffers are supported.
+!
+! Inputs:
+!		fill_value	- fill value
+!		space_id	- memory space selection identifier
+!		buf		- data buffer iin memory ro apply selection to
+!				- of k-th dimension of the buf array
+! Outputs:
+!		hdferr:		- error code
+!				 	Success:  0
+!				 	Failure: -1
+! AUTHOR
+!  Elena Pourmal
+!  March 12, 2003
+!
+  SUBROUTINE h5dfill_char(fill_value, space_id, buf,  hdferr)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    CHARACTER, INTENT(IN), TARGET :: fill_value  ! Fill value
+    INTEGER(HID_T), INTENT(IN) :: space_id ! Memory dataspace selection identifier
+    CHARACTER, INTENT(IN), DIMENSION(*), TARGET :: buf ! Memory buffer to fill in
+    INTEGER, INTENT(OUT) :: hdferr      ! Error code
+
+    INTEGER(HID_T) :: fill_type_id ! Fill value datatype identifier
+    INTEGER(HID_T) :: mem_type_id !  Buffer dadtype identifier
+
+    TYPE(C_PTR) :: f_ptr_fill_value ! C pointer to fill_value
+    TYPE(C_PTR) :: f_ptr_buf ! C pointer to buf
+
+    f_ptr_fill_value = C_LOC(fill_value)
+    f_ptr_buf = C_LOC(buf(1))
+
+    hdferr = h5dfill_c(f_ptr_fill_value, fill_type_id, space_id, &
+         f_ptr_buf, mem_type_id)
+
+  END SUBROUTINE h5dfill_char
+!
+!****s* H5D (F03)/h5dvlen_reclaim_f
+! NAME
+!  h5dvlen_reclaim_f
+!
+! PURPOSE 
+!  Reclaims VL datatype memory buffers. 
+!
+! Inputs:
+!
+!  type_id  - Identifier of the datatype. 
+!  space_id - Identifier of the dataspace. 
+!  plist_id - Identifier of the property list used to create the buffer. 
+!  buf      - Pointer to the buffer to be reclaimed. 
+!
+! Outputs:
+!  hdferr   - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+! M. Scot Breitenfeld
+! January 11, 2011
+!
+! Fortran2003 Interface:
+  SUBROUTINE h5dvlen_reclaim_f(type_id, space_id, plist_id, buf, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN)    :: type_id
+    INTEGER(HID_T), INTENT(IN)    :: space_id
+    INTEGER(HID_T), INTENT(IN)    :: plist_id
+    TYPE(C_PTR)   , INTENT(INOUT) :: buf
+    INTEGER       , INTENT(OUT)   :: hdferr
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5dvlen_reclaim_c(type_id, space_id, plist_id, buf) BIND(C, NAME='h5dvlen_reclaim_c')
+         IMPORT :: C_PTR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T) :: type_id
+         INTEGER(HID_T) :: space_id
+         INTEGER(HID_T) :: plist_id
+         TYPE(C_PTR), VALUE :: buf
+       END FUNCTION h5dvlen_reclaim_c
+    END INTERFACE
+
+    hdferr = H5Dvlen_reclaim_c(type_id, space_id, plist_id, buf)
+
+  END SUBROUTINE H5Dvlen_reclaim_f
+
+
+END MODULE H5D
+
+
diff --git a/fortran/src/H5Dff.f90 b/fortran/src/H5Dff.f90
deleted file mode 100644
index 3ad868c..0000000
--- a/fortran/src/H5Dff.f90
+++ /dev/null
@@ -1,1035 +0,0 @@
-!****h* ROBODoc/H5D
-!
-! NAME
-!  MODULE H5D
-!
-! FILE
-!  fortran/src/H5Dff.f90
-!
-! PURPOSE
-!  This file contains Fortran interfaces for H5D functions. It includes
-!  all the functions that are independent on whether the Fortran 2003 functions
-!  are enabled or disabled.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5D function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5D
-  USE H5GLOBAL
-
-  INTERFACE h5dextend_f
-     MODULE PROCEDURE h5dset_extent_f
-  END INTERFACE
-
-  INTERFACE h5dread_vl_f
-     MODULE PROCEDURE h5dread_vl_integer
-     MODULE PROCEDURE h5dread_vl_real
-     MODULE PROCEDURE h5dread_vl_string
-  END INTERFACE
-
-  INTERFACE h5dwrite_vl_f
-     MODULE PROCEDURE h5dwrite_vl_integer
-     MODULE PROCEDURE h5dwrite_vl_real
-     MODULE PROCEDURE h5dwrite_vl_string
-  END INTERFACE
-
-CONTAINS
-
-!
-!****s* H5D/h5dcreate_f
-!
-! NAME
-!  h5dcreate_f
-!
-! PURPOSE
-!  Creates a dataset at the specified location
-!
-! INPUTS
-!  loc_id 	 - file or group identifier
-!  name 	 - dataset name
-!  type_id 	 - dataset datatype identifier
-!  space_id 	 - dataset dataspace identifier
-! OUTPUTS
-!  dset_id 	 - dataset identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  creation_prp  - Dataset creation property list
-!  lcpl_id 	 - Link creation property list
-!  dapl_id 	 - Dataset access property list
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!
-!  - Explicit Fortran interfaces were added for
-!    called C functions (it is needed for Windows
-!    port).  February 28, 2001
-!
-!  - Added version's 1.8 new optional parameters
-!    February, 2008
-!
-! SOURCE
-  SUBROUTINE h5dcreate_f(loc_id, name, type_id, space_id, dset_id, &
-       hdferr, dcpl_id, lcpl_id, dapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the dataset
-    INTEGER(HID_T), INTENT(IN) :: type_id  ! Datatype identifier
-    INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier
-    INTEGER(HID_T), INTENT(OUT) :: dset_id ! Dataset identifier
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: dcpl_id ! Dataset creation property list
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lcpl_id ! Link creation property list
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: dapl_id ! Dataset access property list
-
-    INTEGER(HID_T) :: lcpl_id_default
-    INTEGER(HID_T) :: dcpl_id_default
-    INTEGER(HID_T) :: dapl_id_default
-
-    INTEGER :: namelen ! Name length
-
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5dcreate_c(loc_id, name, namelen, type_id, &
-            space_id, lcpl_id_default, dcpl_id_default, dapl_id_default, dset_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DCREATE_C'::h5dcreate_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER :: namelen
-         INTEGER(HID_T), INTENT(IN) :: type_id
-         INTEGER(HID_T), INTENT(IN) :: space_id
-
-         INTEGER(HID_T) :: lcpl_id_default
-         INTEGER(HID_T) :: dcpl_id_default
-         INTEGER(HID_T) :: dapl_id_default
-
-         INTEGER(HID_T), INTENT(OUT) :: dset_id
-       END FUNCTION h5dcreate_c
-    END INTERFACE
-
-    lcpl_id_default = H5P_DEFAULT_F
-    dcpl_id_default = H5P_DEFAULT_F
-    dapl_id_default = H5P_DEFAULT_F
-
-    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
-    IF(PRESENT(dcpl_id)) dcpl_id_default = dcpl_id
-    IF(PRESENT(dapl_id)) dapl_id_default = dapl_id
-
-    namelen = LEN(name)
-    hdferr = h5dcreate_c(loc_id, name, namelen, type_id, space_id, &
-         lcpl_id_default, dcpl_id_default, dapl_id_default, dset_id)
-
-  END SUBROUTINE h5dcreate_f
-
-!
-!****s* H5D/h5dopen_f
-!
-! NAME
-!  h5dopen_f
-!
-! PURPOSE
-!  Opens an existing dataset.
-!
-! INPUTS
-!  loc_id 	 - file or group identifier
-!  name 	 - dataset name
-! OUTPUTS
-!  dset_id 	 - dataset identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  dapl_id 	 - Dataset access property list
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  -Explicit Fortran interfaces were added for
-!   called C functions (it is needed for Windows
-!   port).  February 28, 2001
-!
-!  -Added 1.8 (optional) parameter dapl_id
-!   February, 2008, M. Scot Breitenfeld
-!
-! SOURCE
-  SUBROUTINE h5dopen_f(loc_id, name, dset_id, hdferr, dapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the dataset
-    INTEGER(HID_T), INTENT(OUT) :: dset_id ! Dataset identifier
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: dapl_id ! Dataset access property list
-!*****
-    INTEGER :: namelen                     ! Name length
-
-    INTEGER(HID_T) :: dapl_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dopen_c(loc_id, name, namelen, dapl_id_default, dset_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DOPEN_C'::h5dopen_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER :: namelen
-         INTEGER(HID_T), INTENT(IN) :: dapl_id_default
-         INTEGER(HID_T), INTENT(OUT) :: dset_id
-       END FUNCTION h5dopen_c
-    END INTERFACE
-
-    dapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(dapl_id)) dapl_id_default = dapl_id
-
-    namelen = LEN(name)
-    hdferr = h5dopen_c(loc_id, name, namelen, dapl_id_default, dset_id)
-
-  END SUBROUTINE h5dopen_f
-
-!
-!****s* H5D/h5dclose_f
-!
-! NAME
-!  h5dclose_f
-!
-! PURPOSE
-!  Closes a dataset.
-!
-! INPUTS
-!  dset_id 	 - dataset identifier
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! SOURCE
-  SUBROUTINE h5dclose_f(dset_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id ! Dataset identifier
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5dclose_c(dset_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DCLOSE_C'::h5dclose_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-       END FUNCTION h5dclose_c
-    END INTERFACE
-
-    hdferr = h5dclose_c(dset_id)
-
-  END SUBROUTINE h5dclose_f
-
-!
-!****s* H5D/h5dget_type_f
-!
-! NAME
-!  h5dget_type_f
-!
-! PURPOSE
-!  Returns an identifier for a copy of the datatype for a
-!  dataset.
-!
-! INPUTS
-!  dataset_id 	 - dataset identifier
-! OUTPUTS
-!  datatype_id 	 - dataspace identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! NOTES
-!
-! SOURCE
-  SUBROUTINE h5dget_type_f(dataset_id, datatype_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dataset_id      ! Dataset identifier
-    INTEGER(HID_T), INTENT(OUT) :: datatype_id    ! Datatype identifier
-    INTEGER, INTENT(OUT) :: hdferr                ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5dget_type_c (dataset_id, datatype_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DGET_TYPE_C'::h5dget_type_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dataset_id
-         INTEGER(HID_T), INTENT(OUT) :: datatype_id
-       END FUNCTION h5dget_type_c
-    END INTERFACE
-
-    hdferr = h5dget_type_c (dataset_id, datatype_id)
-  END SUBROUTINE h5dget_type_f
-
-!
-!****s* H5D/h5dset_extent
-!
-! NAME
-!  h5dset_extent (instead of obsolete name: h5dextend_f)
-!
-! PURPOSE
-!  Extends a dataset with unlimited dimension.
-!
-! INPUTS
-!  dataset_id 	 - dataset identifier
-!  size 	 - array containing the new magnitude of
-!                  each dimension
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-!  Changed name from the now obsolete h5dextend_f
-!  to h5dset_extent_f. Provided interface to old name
-!  for backward compatability. -MSB- March 14, 2008
-!
-! SOURCE
-  SUBROUTINE h5dset_extent_f(dataset_id, size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dataset_id      ! Dataset identifier
-    INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN)  :: size
-    ! Array containing
-    ! dimensions' sizes
-    INTEGER, INTENT(OUT) :: hdferr                ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5dset_extent_c(dataset_id, size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DSET_EXTENT_C'::h5dset_extent_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dataset_id
-         INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN)  :: size
-       END FUNCTION h5dset_extent_c
-    END INTERFACE
-
-    hdferr = H5Dset_extent_c(dataset_id, size)
-  END SUBROUTINE h5dset_extent_f
-
-!****s* H5D/h5dget_create_plist_f
-!
-! NAME
-!  h5dget_create_plist_f
-!
-! PURPOSE
-!  Returns an identifier for a copy of the dataset creation
-!  property list for a dataset.
-!
-! INPUTS
-!  dataset_id 	 - dataset identifier
-! OUTPUTS
-!  plist_id 	 - creation property list identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-! SOURCE
-  SUBROUTINE h5dget_create_plist_f(dataset_id, plist_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dataset_id   ! Dataset identifier
-    INTEGER(HID_T), INTENT(OUT) :: plist_id    ! Dataset creation
-                                               ! property list identifier
-    INTEGER, INTENT(OUT) :: hdferr             ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5dget_create_plist_c(dataset_id, plist_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DGET_CREATE_PLIST_C'::h5dget_create_plist_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dataset_id
-         INTEGER(HID_T), INTENT(OUT) :: plist_id
-       END FUNCTION h5dget_create_plist_c
-    END INTERFACE
-
-    hdferr = h5dget_create_plist_c(dataset_id, plist_id)
-  END SUBROUTINE h5dget_create_plist_f
-
-!
-!****s* H5D/h5dget_storage_size_f
-!
-! NAME
-!  h5dget_storage_size_f
-!
-! PURPOSE
-!  Returns the amount of storage requires by a dataset
-!
-! INPUTS
-!  dataset_id 	 - dataset identifier
-! OUTPUTS
-!  size 	 - datastorage size
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 15, 2002
-! SOURCE
-  SUBROUTINE h5dget_storage_size_f(dataset_id, size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dataset_id ! Dataset identifier
-    INTEGER(HSIZE_T),  INTENT(OUT)  :: size  ! Amount of storage
-                                             ! allocated for dataset
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5dget_storage_size_c(dataset_id, size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DGET_STORAGE_SIZE_C'::h5dget_storage_size_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dataset_id
-         INTEGER(HSIZE_T), INTENT(OUT)  :: size
-       END FUNCTION h5dget_storage_size_c
-    END INTERFACE
-
-    hdferr = h5dget_storage_size_c(dataset_id, size)
-  END SUBROUTINE h5dget_storage_size_f
-
-!
-!****s* H5D/h5dvlen_get_max_len_f
-!
-! NAME
-!  h5dvlen_get_max_len_f
-!
-! PURPOSE
-!  Returns maximum length of the VL array elements
-!
-! INPUTS
-!  dataset_id 	 - dataset identifier
-!  type_id 	 - datatype identifier
-!  space_id 	 - dataspace identifier
-! OUTPUTS
-!  size 	 - buffer size
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  NONE
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 15, 2002
-!
-! SOURCE
-  SUBROUTINE h5dvlen_get_max_len_f(dataset_id, type_id, space_id, len,  hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dataset_id      ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: type_id         ! Datatype identifier
-    INTEGER(HID_T), INTENT(IN) :: space_id        ! Dataspace identifier
-    INTEGER(SIZE_T),  INTENT(OUT)  :: len         ! Maximum length of the element
-    INTEGER, INTENT(OUT) :: hdferr                ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5dvlen_get_max_len_c(dataset_id, type_id, space_id, len)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DVLEN_GET_MAX_LEN_C'::h5dvlen_get_max_len_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dataset_id
-         INTEGER(HID_T), INTENT(IN) :: type_id
-         INTEGER(HID_T), INTENT(IN) :: space_id
-         INTEGER(SIZE_T), INTENT(OUT)  :: len
-       END FUNCTION h5dvlen_get_max_len_c
-    END INTERFACE
-
-    hdferr = h5dvlen_get_max_len_c(dataset_id, type_id,  space_id, len)
-  END SUBROUTINE h5dvlen_get_max_len_f
-
-!
-!****s* H5D/h5dget_space_status_f
-!
-! NAME
-!  h5dget_space_status_f
-!
-! PURPOSE
-!  Returns the status of data space allocation.
-!
-! INPUTS
-!  dset_id	 - dataset identifier
-! OUTPUTS
-!  flag          - status; may have one of the following values:
-!		    H5D_SPACE_STS_ERROR_F
-!		    H5D_SPACE_STS_NOT_ALLOCATED_F
-!		    H5D_SPACE_STS_PART_ALLOCATED_F
-!		    H5D_SPACE_STS_ALLOCATED_F
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  March 12, 2003
-!
-! SOURCE
-  SUBROUTINE h5dget_space_status_f(dset_id, flag, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id  ! Dataspace identifier
-    INTEGER, INTENT(OUT)       :: flag     ! Memory buffer to fill in
-    INTEGER, INTENT(OUT)       :: hdferr   ! Error code
-  !*****
-    INTERFACE
-       INTEGER FUNCTION h5dget_space_status_c(dset_id, flag)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DGET_SPACE_STATUS_C'::h5dget_space_status_c
-         !DEC$ENDIF
-         INTEGER(HID_T) :: dset_id
-         INTEGER        :: flag
-       END FUNCTION h5dget_space_status_c
-    END INTERFACE
-
-    hdferr = h5dget_space_status_c(dset_id, flag)
-  END SUBROUTINE h5dget_space_status_f
-
-!
-!****s* H5D/h5dcreate_anon_f
-!
-! NAME
-!  h5dcreate_anon_f
-!
-! PURPOSE
-!  Creates a dataset in a file without linking it into the file structure
-!
-! INPUTS
-!  loc_id	 - Identifier of the file or group within which to create the dataset.
-!  type_id	 - Identifier of the datatype to use when creating the dataset.
-!  space_id	 - Identifier of the dataspace to use when creating the dataset.
-! OUTPUTS
-!  dset_id	 - dataset identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  dcpl_id       - Dataset creation property list identifier.
-!  dapl_id  	 - Dataset access property list identifier.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 11, 2008
-!
-! SOURCE
-  SUBROUTINE h5dcreate_anon_f(loc_id, type_id, space_id, dset_id, hdferr, dcpl_id, dapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier.
-    INTEGER(HID_T), INTENT(IN) :: type_id  ! Datatype identifier.
-    INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier.
-    INTEGER(HID_T), INTENT(OUT) :: dset_id ! Dataset identifier.
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code.
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: dcpl_id  ! Dataset creation property list identifier.
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: dapl_id  ! Dataset access property list identifier.
-!*****
-    INTEGER(HID_T) :: dcpl_id_default
-    INTEGER(HID_T) :: dapl_id_default
-
-    !
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dcreate_anon_c(loc_id, type_id, space_id, dcpl_id_default, dapl_id_default, dset_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DCREATE_ANON_C'::h5dcreate_anon_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         INTEGER(HID_T), INTENT(IN) :: type_id
-         INTEGER(HID_T), INTENT(IN) :: space_id
-         INTEGER(HID_T) :: dcpl_id_default
-         INTEGER(HID_T) :: dapl_id_default
-         INTEGER(HID_T), INTENT(OUT) :: dset_id
-       END FUNCTION h5dcreate_anon_c
-    END INTERFACE
-
-    dcpl_id_default = H5P_DEFAULT_F
-    dapl_id_default = H5P_DEFAULT_F
-
-    IF(PRESENT(dcpl_id)) dcpl_id_default = dcpl_id
-    IF(PRESENT(dapl_id)) dapl_id_default = dapl_id
-
-    hdferr = h5dcreate_anon_c(loc_id, type_id, space_id, dcpl_id_default, dapl_id_default, dset_id)
-
-  END SUBROUTINE h5dcreate_anon_f
-
-  SUBROUTINE h5dwrite_vl_integer(dset_id, mem_type_id, buf, dims, len, &
-       hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims ! MAX len x num_elem
-    INTEGER(SIZE_T), INTENT(IN), DIMENSION(*) :: len ! Array to store
-                                                     ! the length of each
-                                                     ! element
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1),dims(2)), TARGET :: buf   ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_vl_integer_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims, len)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_VL_INTEGER_C'::h5dwrite_vl_integer_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER(SIZE_T), INTENT(IN), DIMENSION(*) :: len
-         INTEGER, INTENT(IN), &
-              DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5dwrite_vl_integer_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_vl_integer_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, &
-         buf, dims, len)
-
-  END SUBROUTINE h5dwrite_vl_integer
-
-  SUBROUTINE h5dread_vl_integer(dset_id, mem_type_id, buf, dims, len, &
-       hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims  ! MAX len x num_elem
-    INTEGER(SIZE_T), INTENT(INOUT), DIMENSION(*) :: len ! Array to store
-                                                        ! the length of each
-                                                        ! element
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2)), TARGET :: buf   ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr ! Error code
-                                   ! -1 if failed, 0 otherwise
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    INTEGER(HID_T) :: tmp
-    INTEGER :: error
-
-    INTERFACE
-       INTEGER FUNCTION h5dread_vl_integer_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims, len)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_VL_INTEGER_C'::h5dread_vl_integer_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER(SIZE_T), INTENT(INOUT), DIMENSION(*) :: len
-         INTEGER, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5dread_vl_integer_c
-    END INTERFACE
-
-    CALL h5dget_space_f(dset_id, tmp, error)
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = tmp
-    file_space_id_default = tmp
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_vl_integer_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, &
-         buf, dims, len)
-
-  END SUBROUTINE h5dread_vl_integer
-
-  SUBROUTINE h5dwrite_vl_real(dset_id, mem_type_id, buf, dims, len, &
-       hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims ! MAX len x num_elem
-    INTEGER(SIZE_T), INTENT(IN), DIMENSION(*) :: len   ! Array to store
-                                                       ! the length of each
-                                                       ! element
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2)) :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_vl_real_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims, len)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_VL_REAL_C'::h5dwrite_vl_real_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER(SIZE_T), INTENT(IN), DIMENSION(*) :: len
-         REAL, INTENT(IN), &
-              DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5dwrite_vl_real_c
-    END INTERFACE
-
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_vl_real_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, &
-         buf, dims, len)
-
-  END SUBROUTINE h5dwrite_vl_real
-
-  SUBROUTINE h5dread_vl_real(dset_id, mem_type_id, buf, dims, len, &
-       hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims  ! MAX len x num_elem
-    INTEGER(SIZE_T), INTENT(INOUT), DIMENSION(*) :: len ! Array to store the length of each element
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2)) :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-                                           ! -1 if failed, 0 otherwise
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    INTEGER(HID_T) :: tmp
-    INTEGER :: error
-
-    INTERFACE
-       INTEGER FUNCTION h5dread_vl_real_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims, len)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_VL_REAL_C'::h5dread_vl_real_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER(SIZE_T), INTENT(INOUT), DIMENSION(*) :: len
-         REAL, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5dread_vl_real_c
-    END INTERFACE
-
-    CALL h5dget_space_f(dset_id, tmp, error)
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = tmp
-    file_space_id_default = tmp
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_vl_real_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, &
-         buf, dims, len)
-
-  END SUBROUTINE h5dread_vl_real
-
-  SUBROUTINE h5dwrite_vl_string(dset_id, mem_type_id, buf, dims, str_len, &
-       hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims   ! Number of strings
-    INTEGER(SIZE_T), INTENT(IN), DIMENSION(*) :: str_len ! Array to store the length of each element
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(2)) :: buf  ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_vl_string_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            ! xfer_prp_default, tmp_buf, dims, str_len)
-            xfer_prp_default, buf, dims, str_len)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_VL_STRING_C'::h5dwrite_vl_string_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims
-         INTEGER(SIZE_T), INTENT(IN), DIMENSION(*) :: str_len
-         CHARACTER(LEN=*), DIMENSION(dims(2)) :: buf
-       END FUNCTION
-    END INTERFACE
-
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_vl_string_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, &
-         buf, dims, str_len)
-
-  END SUBROUTINE h5dwrite_vl_string
-
-  SUBROUTINE h5dread_vl_string(dset_id, mem_type_id, buf, dims, str_len, &
-                                         hdferr, &
-                                         mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims ! number of strings
-    INTEGER(SIZE_T), INTENT(OUT), DIMENSION(*) :: str_len ! Array to store
-    ! the length of each
-    ! element
-    CHARACTER(LEN=*), INTENT(OUT), &
-         DIMENSION(dims(2)) :: buf      ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dread_vl_string_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims, str_len)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_VL_STRING_C'::h5dread_vl_string_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(2) :: dims
-         INTEGER(SIZE_T), INTENT(OUT), DIMENSION(*) :: str_len
-         CHARACTER(LEN=*), DIMENSION(dims(2)) :: buf
-       END FUNCTION h5dread_vl_string_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_vl_string_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, &
-         buf, dims, str_len)
-    RETURN
-  END SUBROUTINE h5dread_vl_string
-
-!
-!****s* H5D/h5dget_space_f
-!
-! NAME
-!  h5dget_space_f
-!
-! PURPOSE
-!  Returns an identifier for a copy of the dataspace for a
-!  dataset.
-!
-! INPUTS
-!  dataset_id 	 - dataset identifier
-! OUTPUTS
-!  dataspace_id  - dataspace identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! SOURCE
-  SUBROUTINE h5dget_space_f(dataset_id, dataspace_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dataset_id      ! Dataset identifier
-    INTEGER(HID_T), INTENT(OUT) :: dataspace_id   ! Dataspace identifier
-    INTEGER, INTENT(OUT) :: hdferr                ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5dget_space_c(dataset_id, dataspace_id)
-       USE H5GLOBAL
-       !DEC$IF DEFINED(HDF5F90_WINDOWS)
-       !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DGET_SPACE_C'::h5dget_space_c
-       !DEC$ENDIF
-       INTEGER(HID_T), INTENT(IN) :: dataset_id
-       INTEGER(HID_T), INTENT(OUT) :: dataspace_id
-     END FUNCTION h5dget_space_c
-  END INTERFACE
-
-  hdferr = h5dget_space_c(dataset_id, dataspace_id)
-END SUBROUTINE h5dget_space_f
-
-!****s* H5D/h5dget_access_plist_f
-!
-! NAME
-!  h5dget_access_plist_f
-!
-! PURPOSE
-!  Returns a copy of the dataset creation property list.
-!
-! INPUTS
-!  dset_id       - Dataset identifier
-!
-! OUTPUTS
-!  plist_id	 - Dataset access property list identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR   
-!  M. Scot Breitenfeld
-!  April 13, 2009
-!
-! SOURCE
-SUBROUTINE h5dget_access_plist_f(dset_id, plist_id, hdferr)
-  IMPLICIT NONE
-  INTEGER(HID_T), INTENT(IN)  :: dset_id
-  INTEGER(HID_T), INTENT(OUT) :: plist_id 
-  INTEGER       , INTENT(OUT) :: hdferr  
-!*****
-  INTERFACE
-     INTEGER FUNCTION h5dget_access_plist_c(dset_id, plist_id)
-       USE H5GLOBAL
-       !DEC$IF DEFINED(HDF5F90_WINDOWS)
-       !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DGET_ACCESS_PLIST_C'::h5dget_access_plist_c
-       !DEC$ENDIF
-       INTEGER(HID_T), INTENT(IN) :: dset_id
-       INTEGER(HID_T), INTENT(OUT) :: plist_id
-     END FUNCTION h5dget_access_plist_c
-  END INTERFACE
-  
-  hdferr = h5dget_access_plist_c(dset_id, plist_id)
-  
-END SUBROUTINE h5dget_access_plist_f
-
-END MODULE H5D
-
-
diff --git a/fortran/src/H5Dff_F03.f90 b/fortran/src/H5Dff_F03.f90
deleted file mode 100644
index 7026ae3..0000000
--- a/fortran/src/H5Dff_F03.f90
+++ /dev/null
@@ -1,2389 +0,0 @@
-!****h* ROBODoc/H5D (F03)
-!
-! NAME
-!  H5D_PROVISIONAL
-!
-! PURPOSE
-!  This file contains Fortran 90 and Fortran 2003 interfaces for H5D functions.
-!  It contains the same functions as H5Dff_F90.f90 but includes the
-!  Fortran 2003 functions and the interface listings. This file will be compiled
-!  instead of H5Dff_F90.f90 if Fortran 2003 functions are enabled.
-!
-! COPYRIGHT
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!  Copyright by The HDF Group.                                                 *
-!  Copyright by the Board of Trustees of the University of Illinois.           *
-!  All rights reserved.                                                        *
-!                                                                              *
-!  This file is part of HDF5.  The full HDF5 copyright notice, including       *
-!  terms governing use, modification, and redistribution, is contained in      *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root     *
-!  of the source code distribution tree; Copyright.html can be found at the    *
-!  root level of an installed copy of the electronic HDF5 document set and     *
-!  is linked from the top-level documents page.  It can also be found at       *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have            *
-!  access to either file, you may request a copy from help at hdfgroup.org.       *
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!  (1) The maximum rank of an array allowed in Fortran is 7, therefore
-!  we only provide an interface for arrays up to and including rank 7.
-!
-!  (2) Unfortunately we are using a generic interface and one of the factors
-!  used in determining the proper routine to select is that of the array
-!  rank being passed. Therefore, we can not create just one subroutine for
-!  each array type (integer, real, etc...) and use a
-!  rank 1 array of assumed size to handle multiple ranks, i.e.
-!  (i.e. integer, dimension(*) :: ... )
-!  (i.e. real   , dimension(*) :: ... ) etc...
-!
-!  (3) Could not place the USE, INTRINSIC :: ISO_C_BINDING in the module header because it may
-!  conflict with the USE, INTRINSIC :: ISO_C_BINDING included in the user's program. Moved
-!  the statement instead to each subroutine.
-!
-!
-!  (4) C_LOC and character strings according to the Fortran 2003 standard:
-!
-!  15.1.2.5 C_LOC(X)
-!
-!  Argument. X shall either
-!
-!  (A) have interoperable type and type parameters and be
-!  (a) a variable that has the TARGET attribute and is interoperable,
-!  (b) an allocated allocatable variable that has the TARGET attribute
-!  and is not an array of zero size, or
-!  (c) an associated scalar pointer, or
-!  (B) be a nonpolymorphic scalar, have no length type parameters, and be
-!  (a) a nonallocatable, nonpointer variable that has the TARGET attribute,
-!  (b) an allocated allocatable variable that has the TARGET attribute, or
-!  (c) an associated pointer.
-!
-!   	 - When X is a character, for interoperability the standard is:
-!
-!  15.2.1 Interoperability of intrinsic types
-!
-!  ...if the type is character, interoperability also requires that the length type parameter
-!  be omitted or be specified by an initialization expression whose value is one.
-!
-!  THEREFORE compilers that have not extended the standard require the
-!  argument in C_LOC to be of the variant:
-!
-!  CHARACTER(LEN=1), TARGET :: chr
-!  or
-!  CHARACTER, TARGET :: chr
-!  
-!                         *** IMPORTANT ***
-!  If you add a new H5D function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5D_PROVISIONAL
-  USE H5GLOBAL
-
-  INTERFACE h5dwrite_f
-
-     MODULE PROCEDURE h5dwrite_reference_obj
-     MODULE PROCEDURE h5dwrite_reference_dsetreg
-     MODULE PROCEDURE h5dwrite_integer_scalar
-     MODULE PROCEDURE h5dwrite_integer_1
-     MODULE PROCEDURE h5dwrite_integer_2
-     MODULE PROCEDURE h5dwrite_integer_3
-     MODULE PROCEDURE h5dwrite_integer_4
-     MODULE PROCEDURE h5dwrite_integer_5
-     MODULE PROCEDURE h5dwrite_integer_6
-     MODULE PROCEDURE h5dwrite_integer_7
-     MODULE PROCEDURE h5dwrite_char_scalar
-     MODULE PROCEDURE h5dwrite_char_1
-     MODULE PROCEDURE h5dwrite_char_2
-     MODULE PROCEDURE h5dwrite_char_3
-     MODULE PROCEDURE h5dwrite_char_4
-     MODULE PROCEDURE h5dwrite_char_5
-     MODULE PROCEDURE h5dwrite_char_6
-     MODULE PROCEDURE h5dwrite_char_7
-     MODULE PROCEDURE h5dwrite_real_scalar
-     MODULE PROCEDURE h5dwrite_real_1
-     MODULE PROCEDURE h5dwrite_real_2
-     MODULE PROCEDURE h5dwrite_real_3
-     MODULE PROCEDURE h5dwrite_real_4
-     MODULE PROCEDURE h5dwrite_real_5
-     MODULE PROCEDURE h5dwrite_real_6
-     MODULE PROCEDURE h5dwrite_real_7
-
-     ! This is the preferred way to call h5dwrite
-     ! by passing an address
-     MODULE PROCEDURE h5dwrite_ptr
-
-  END INTERFACE
-
-  INTERFACE h5dread_f
-
-     MODULE PROCEDURE h5dread_reference_obj
-     MODULE PROCEDURE h5dread_reference_dsetreg
-     MODULE PROCEDURE h5dread_integer_scalar
-     MODULE PROCEDURE h5dread_integer_1
-     MODULE PROCEDURE h5dread_integer_2
-     MODULE PROCEDURE h5dread_integer_3
-     MODULE PROCEDURE h5dread_integer_4
-     MODULE PROCEDURE h5dread_integer_5
-     MODULE PROCEDURE h5dread_integer_6
-     MODULE PROCEDURE h5dread_integer_7
-     MODULE PROCEDURE h5dread_char_scalar
-     MODULE PROCEDURE h5dread_char_1
-     MODULE PROCEDURE h5dread_char_2
-     MODULE PROCEDURE h5dread_char_3
-     MODULE PROCEDURE h5dread_char_4
-     MODULE PROCEDURE h5dread_char_5
-     MODULE PROCEDURE h5dread_char_6
-     MODULE PROCEDURE h5dread_char_7
-     MODULE PROCEDURE h5dread_real_scalar
-     MODULE PROCEDURE h5dread_real_1
-     MODULE PROCEDURE h5dread_real_2
-     MODULE PROCEDURE h5dread_real_3
-     MODULE PROCEDURE h5dread_real_4
-     MODULE PROCEDURE h5dread_real_5
-     MODULE PROCEDURE h5dread_real_6
-     MODULE PROCEDURE h5dread_real_7
-
-     ! This is the preferred way to call h5dread
-     ! by passing an address
-     MODULE PROCEDURE h5dread_ptr
-
-  END INTERFACE
-
-!  Interface for the function used to pass the C pointer of the buffer
-!  to the C H5Dwrite routine
-
-  INTERFACE
-     INTEGER FUNCTION h5dwrite_f_c(dset_id, mem_type_id, &
-          mem_space_id_default ,                         &
-          file_space_id_default,                         &
-          xfer_prp_default, buf ) BIND(C, NAME='h5dwrite_f_c')
-       USE H5GLOBAL
-       USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
-       INTEGER(HID_T), INTENT(IN) :: dset_id
-       INTEGER(HID_T), INTENT(IN) :: mem_type_id
-       INTEGER(HID_T) :: mem_space_id_default
-       INTEGER(HID_T) :: file_space_id_default
-       INTEGER(HID_T) :: xfer_prp_default
-       TYPE(C_PTR), VALUE :: buf
-     END FUNCTION h5dwrite_f_c
-  END INTERFACE
-
-!  Interface for the function used to pass the C pointer of the buffer
-!  to the C H5Dread routine
-
-  INTERFACE
-     INTEGER FUNCTION h5dread_f_c(dset_id, mem_type_id, &
-          mem_space_id_default,                         &
-          file_space_id_default,                        &
-          xfer_prp_default, buf) BIND(C, NAME='h5dread_f_c')
-       USE H5GLOBAL
-       USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
-       INTEGER(HID_T), INTENT(IN) :: dset_id
-       INTEGER(HID_T), INTENT(IN) :: mem_type_id
-       INTEGER(HID_T) :: mem_space_id_default
-       INTEGER(HID_T) :: file_space_id_default
-       INTEGER(HID_T) :: xfer_prp_default
-       TYPE(C_PTR), VALUE :: buf
-     END FUNCTION h5dread_f_c
-  END INTERFACE
-
-  INTERFACE h5dfill_f
-     MODULE PROCEDURE h5dfill_integer
-     MODULE PROCEDURE h5dfill_real
-     MODULE PROCEDURE h5dfill_char
-  END INTERFACE
-
-!  Interface for the function used to pass the C pointer of the buffer
-!  to the C H5Dfill routine
-
-  INTERFACE
-     INTEGER FUNCTION h5dfill_c(f_ptr_fill_value, fill_type_id, space_id, &
-          f_ptr_buf, mem_type_id) BIND(C, NAME='h5dfill_c')
-       USE H5GLOBAL
-       USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
-       TYPE(C_PTR), VALUE :: f_ptr_fill_value
-       INTEGER(HID_T) :: fill_type_id ! Fill value datatype identifier
-       INTEGER(HID_T), INTENT(IN) :: space_id ! Memory dataspace selection identifier
-       TYPE(C_PTR), VALUE :: f_ptr_buf
-       INTEGER(HID_T) :: mem_type_id
-     END FUNCTION h5dfill_c
-  END INTERFACE
-
-CONTAINS
-
-  SUBROUTINE h5dwrite_reference_obj(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: dims ! size of the bufffer buf
-    TYPE(hobj_ref_t_f), DIMENSION(dims(1)), INTENT(IN), TARGET :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-
-  END SUBROUTINE h5dwrite_reference_obj
-
-  SUBROUTINE h5dwrite_reference_dsetreg(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: dims ! size of the bufffer buf
-    TYPE(hdset_reg_ref_t_f), DIMENSION(dims(1)), INTENT(IN), TARGET :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    INTEGER, ALLOCATABLE, DIMENSION(:) :: ref_buf
-    INTEGER :: i
-    INTEGER(HSIZE_T) :: j
-    TYPE(C_PTR) :: f_ptr
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_ref_reg_c(dset_id, mem_type_id,&
-            mem_space_id_default, &
-            file_space_id_default, xfer_prp_default, ref_buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_REF_REG_C'::h5dwrite_ref_reg_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER, DIMENSION(*) :: ref_buf
-         INTEGER(HSIZE_T), DIMENSION(*) ::  dims
-       END FUNCTION h5dwrite_ref_reg_c
-    END INTERFACE
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1))
-
-    ALLOCATE(ref_buf(REF_REG_BUF_LEN*dims(1)), stat=hdferr)
-    IF (hdferr .NE. 0 ) THEN
-       hdferr = -1
-       RETURN
-    ELSE
-       DO j = 1, dims(1)
-          DO i = 1, REF_REG_BUF_LEN
-             ref_buf(REF_REG_BUF_LEN*(j-1) + i) = buf(j)%ref(i)
-          ENDDO
-       ENDDO
-    ENDIF
-    hdferr = h5dwrite_ref_reg_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, ref_buf, dims)
-    DEALLOCATE(ref_buf)
-
-  END SUBROUTINE h5dwrite_reference_dsetreg
-
-
-  SUBROUTINE h5dwrite_integer_scalar(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER, INTENT(IN), TARGET :: buf  ! Data buffer
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf)
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_integer_scalar
-
-  SUBROUTINE h5dwrite_integer_1(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_integer_1
-
-  SUBROUTINE h5dwrite_integer_2(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1),dims(2)),TARGET :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_integer_2
-
-  SUBROUTINE h5dwrite_integer_3(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_integer_3
-
-  SUBROUTINE h5dwrite_integer_4(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr            ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1,1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_integer_4
-
-  SUBROUTINE h5dwrite_integer_5(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1,1,1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_integer_5
-
-  SUBROUTINE h5dwrite_integer_6(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1,1,1,1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_integer_6
-
-  SUBROUTINE h5dwrite_integer_7(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1,1,1,1,1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_integer_7
-
-  SUBROUTINE h5dwrite_char_scalar(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(*), INTENT(IN), TARGET :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-                                 
-    CALL h5dwrite_char_scalar_fix(dset_id, mem_type_id, buf, LEN(buf), dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-
-  END SUBROUTINE h5dwrite_char_scalar
-
-  SUBROUTINE h5dwrite_char_scalar_fix(dset_id, mem_type_id, buf, buf_len, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(IN) :: buf_len
-    CHARACTER(LEN=buf_len), INTENT(IN), TARGET :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    f_ptr = C_LOC(buf(1:1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_char_scalar_fix
-
-  SUBROUTINE h5dwrite_char_1(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(IN), DIMENSION(dims(1)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    f_ptr = C_LOC(buf(1)(1:1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_char_1
-
-  SUBROUTINE h5dwrite_char_2(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    f_ptr = C_LOC(buf(1,1)(1:1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_char_2
-
-  SUBROUTINE h5dwrite_char_3(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    f_ptr = C_LOC(buf(1,1,1)(1:1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_char_3
-
-  SUBROUTINE h5dwrite_char_4(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    f_ptr = C_LOC(buf(1,1,1,1)(1:1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_char_4
-
-  SUBROUTINE h5dwrite_char_5(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    f_ptr = C_LOC(buf(1,1,1,1,1)(1:1))
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_char_5
-
-  SUBROUTINE h5dwrite_char_6(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    f_ptr = C_LOC(buf(1,1,1,1,1,1)(1:1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_char_6
-
-  SUBROUTINE h5dwrite_char_7(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    f_ptr = C_LOC(buf(1,1,1,1,1,1,1)(1:1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_char_7
-
-
-  SUBROUTINE h5dwrite_real_scalar(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(IN), TARGET :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default  = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf)
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_real_scalar
-
-
-  SUBROUTINE h5dwrite_real_1(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_real_1
-
-  SUBROUTINE h5dwrite_real_2(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_real_2
-
-  SUBROUTINE h5dwrite_real_3(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_real_3
-
-  SUBROUTINE h5dwrite_real_4(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1,1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_real_4
-
-  SUBROUTINE h5dwrite_real_5(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1,1,1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_real_5
-
-  SUBROUTINE h5dwrite_real_6(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1,1,1,1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_real_6
-
-  SUBROUTINE h5dwrite_real_7(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1,1,1,1,1))
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dwrite_real_7
-
-!
-! NAME		
-!  h5dread_f
-!
-! PURPOSE
-!  Reads raw data from the specified dataset into buf,
-!  converting from file datatype and dataspace to memory
-!  datatype and dataspace.
-!
-! Inputs:
-!		dset_id		- dataset identifier
-!		mem_type_id	- memory type identifier
-!		dims		- 1-dim array of size 7; dims(k) has the size
-!				- of k-th dimension of the buf array
-! Outputs:
-!		buf		- buffer to read data in
-!		hdferr:		- error code
-!				 	Success:  0
-!				 	Failure: -1
-! Optional parameters:
-!		mem_space_id	- memory dataspace identifier
-!		file_space_id 	- file dataspace identifier
-!		xfer_prp	- trasfer property list identifier
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY 	
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-!  dims parameter was added to make code portable;
-!  n parameter was replaced with dims parameter in
-!  the h5dwrite_reference_obj and h5dwrite_reference_dsetreg
-!  functions.  April 2, 2001
-!
-! NOTES	
-!  This function is overloaded to read INTEGER,
-!  REAL, DOUBLE PRECISION and CHARACTER buffers
-!  up to 7 dimensions, and one dimensional buffers
-!  of the TYPE(hobj_ref_t_f) and TYPE(hdset_reg_ref_t_f)
-!  types.
-!
-  SUBROUTINE h5dread_reference_obj(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    TYPE(hobj_ref_t_f), INTENT(INOUT) , &
-         DIMENSION(dims(1)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_reference_obj
-
-  SUBROUTINE h5dread_reference_dsetreg(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    TYPE(hdset_reg_ref_t_f), INTENT(INOUT), &
-         DIMENSION(dims(1)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTEGER, ALLOCATABLE, DIMENSION(:) :: ref_buf
-    INTEGER :: i
-    INTEGER(HSIZE_T) :: j
-    INTERFACE
-       INTEGER FUNCTION h5dread_ref_reg_c(dset_id, mem_type_id,&
-            mem_space_id_default, &
-            file_space_id_default, xfer_prp_default, ref_buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_REF_REG_C'::h5dread_ref_reg_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER, DIMENSION(*) :: ref_buf
-       END FUNCTION h5dread_ref_reg_c
-    END INTERFACE
-
-    ALLOCATE(ref_buf(REF_REG_BUF_LEN*dims(1)), stat=hdferr)
-    IF (hdferr .NE. 0) THEN
-       hdferr = -1
-       RETURN
-    ENDIF
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_ref_reg_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, ref_buf, dims)
-
-    DO j = 1, dims(1)
-       DO i = 1, REF_REG_BUF_LEN
-          buf(j)%ref(i) = ref_buf(REF_REG_BUF_LEN*(j-1) + i)
-       ENDDO
-    ENDDO
-    DEALLOCATE(ref_buf)
-
-  END SUBROUTINE h5dread_reference_dsetreg
-
-
-  SUBROUTINE h5dread_integer_scalar(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(INOUT) , TARGET :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf)
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-
-  END SUBROUTINE h5dread_integer_scalar
-
-  SUBROUTINE h5dread_integer_1(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1)) , TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_integer_1
-
-  SUBROUTINE h5dread_integer_2(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2)) , TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_integer_2
-
-  SUBROUTINE h5dread_integer_3(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3)) , TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_integer_3
-
-  SUBROUTINE h5dread_integer_4(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) , TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1,1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_integer_4
-
-  SUBROUTINE h5dread_integer_5(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) , TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1,1,1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_integer_5
-
-  SUBROUTINE h5dread_integer_6(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) , TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1,1,1,1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_integer_6
-
-  SUBROUTINE h5dread_integer_7(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) , TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1,1,1,1,1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_integer_7
-
-  SUBROUTINE h5dread_char_scalar(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id         ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id   ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(INOUT) :: buf     ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr             ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    CALL h5dread_char_scalar_fix(dset_id, mem_type_id, buf, LEN(buf), hdferr, &
-         mem_space_id_default, file_space_id_default, xfer_prp_default)
-
-  END SUBROUTINE h5dread_char_scalar
-
-  SUBROUTINE h5dread_char_scalar_fix(dset_id, mem_type_id, buf, buf_len, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER, INTENT(IN)  :: buf_len
-    CHARACTER(LEN=buf_len), INTENT(INOUT), TARGET :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(buf(1:1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id, &
-         file_space_id, xfer_prp, f_ptr)
-
-  END SUBROUTINE h5dread_char_scalar_fix
-
-  SUBROUTINE h5dread_char_1(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    f_ptr = C_LOC(buf(1)(1:1))
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_char_1
-
-  SUBROUTINE h5dread_char_2(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    f_ptr = C_LOC(buf(1,1)(1:1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_char_2
-
-  SUBROUTINE h5dread_char_3(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    f_ptr = C_LOC(buf(1,1,1)(1:1))
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_char_3
-
-  SUBROUTINE h5dread_char_4(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    f_ptr = C_LOC(buf(1,1,1,1)(1:1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_char_4
-
-  SUBROUTINE h5dread_char_5(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    f_ptr = C_LOC(buf(1,1,1,1,1)(1:1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_char_5
-
-  SUBROUTINE h5dread_char_6(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    f_ptr = C_LOC(buf(1,1,1,1,1,1)(1:1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_char_6
-
-  SUBROUTINE h5dread_char_7(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)), TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    f_ptr = C_LOC(buf(1,1,1,1,1,1,1)(1:1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_char_7
-
-  SUBROUTINE h5dread_real_scalar(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(INOUT) , TARGET :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf)
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_real_scalar
-
-  SUBROUTINE h5dread_real_1(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1)) , TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_real_1
-
-  SUBROUTINE h5dread_real_2(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2)) , TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_real_2
-
-  SUBROUTINE h5dread_real_3(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3)) , TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_real_3
-
-  SUBROUTINE h5dread_real_4(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3), dims(4)) , TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1,1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_real_4
-
-  SUBROUTINE h5dread_real_5(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) , TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1,1,1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_real_5
-
-  SUBROUTINE h5dread_real_6(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) , TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1,1,1,1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_real_6
-
-  SUBROUTINE h5dread_real_7(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) , TARGET :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    TYPE(C_PTR) :: f_ptr
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id
-    f_ptr = C_LOC(buf(1,1,1,1,1,1,1))
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, f_ptr)
-
-  END SUBROUTINE h5dread_real_7
-
-!****s* H5D (F03)/h5dwrite_f_F03
-!
-! NAME		
-!  h5dwrite_f_F03
-!
-! PURPOSE
-!  Writes raw data from a dataset into a buffer. 
-!
-! Inputs:
-!  dset_id	 - Identifier of the dataset to write to.
-!  mem_type_id	 - Identifier of the memory datatype.
-!  buf		 - Buffer with data to be written to the file.
-!  
-! Outputs:
-!  hdferr        - Returns 0 if successful and -1 if fails
-!
-! Optional parameters:
-!  mem_space_id	 - Identifier of the memory dataspace.
-!  file_space_id - Identifier of the dataset's dataspace in the file.
-!  xfer_prp	 - Identifier of a transfer property list for this I/O operation.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  September 17, 2011
-!
-! Fortran2003 Interface:
-!!  SUBROUTINE h5dwrite_f(dset_id, mem_type_id, buf, hdferr, &
-!!                        mem_space_id, file_space_id, xfer_prp)
-!!    INTEGER(HID_T), INTENT(IN)              :: dset_id
-!!    INTEGER(HID_T), INTENT(IN)              :: mem_type_id
-!!    TYPE(C_PTR)   , INTENT(IN)              :: buf
-!!    INTEGER       , INTENT(OUT)             :: hdferr
-!!    INTEGER(HID_T), INTENT(IN)   , OPTIONAL :: mem_space_id
-!!    INTEGER(HID_T), INTENT(IN)   , OPTIONAL :: file_space_id
-!!    INTEGER(HID_T), INTENT(IN)   , OPTIONAL :: xfer_prp
-!*****
-  SUBROUTINE h5dwrite_ptr(dset_id, mem_type_id, buf, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    TYPE(C_PTR), INTENT(IN) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf)
-
-  END SUBROUTINE h5dwrite_ptr
-!****s* H5D (F03)/h5dread_f_F03
-!
-! NAME		
-!  h5dread_f_F03
-!
-! PURPOSE
-!  Reads raw data from a dataset into a buffer. 
-!
-! Inputs:
-!  dset_id	 - Identifier of the dataset read from.
-!  mem_type_id	 - Identifier of the memory datatype.
-!  
-! Outputs:
-!  buf		 - Buffer to receive data read from file.
-!  hdferr        - Returns 0 if successful and -1 if fails
-!
-! Optional parameters:
-!  mem_space_id	 - Identifier of the memory dataspace.
-!  file_space_id - Identifier of the dataset's dataspace in the file.
-!  xfer_prp	 - Identifier of a transfer property list for this I/O operation.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  September 17, 2011
-!
-! Fortran2003 Interface:
-!!  SUBROUTINE h5dread_f(dset_id, mem_type_id, buf, hdferr, &
-!!                       mem_space_id, file_space_id, xfer_prp)
-!!    INTEGER(HID_T), INTENT(IN)              :: dset_id
-!!    INTEGER(HID_T), INTENT(IN)              :: mem_type_id
-!!    TYPE(C_PTR)   , INTENT(INOUT)           :: buf
-!!    INTEGER       , INTENT(OUT)             :: hdferr
-!!    INTEGER(HID_T), INTENT(IN)   , OPTIONAL :: mem_space_id
-!!    INTEGER(HID_T), INTENT(IN)   , OPTIONAL :: file_space_id
-!!    INTEGER(HID_T), INTENT(IN)   , OPTIONAL :: xfer_prp
-!*****
-  SUBROUTINE h5dread_ptr(dset_id, mem_type_id, buf, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    TYPE(C_PTR), INTENT(INOUT) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf)
-
-  END SUBROUTINE h5dread_ptr
-
-!
-! NAME		
-!  h5dfill_integer
-!
-! PURPOSE 
-!  Fills dataspace elements with a fill value in a memory buffer.
-!  Only INTEGER, CHARACTER, REAL and DOUBLE PRECISION datatypes
-!  of the fillvalues and buffers are supported. Buffer and fillvalue
-!  are assumed to have the same datatype.
-!  Only one-dimesional buffers are supported.
-!
-! Inputs:
-!		fill_value	- fill value
-!		space_id	- memory space selection identifier
-!		buf		- data buffer iin memory ro apply selection to
-!				- of k-th dimension of the buf array
-! Outputs:
-!		hdferr:		- error code
-!				 	Success:  0
-!				 	Failure: -1
-! AUTHOR
-!  Elena Pourmal
-!  March 12, 2003
-!
-!
-
-  SUBROUTINE h5dfill_integer(fill_value, space_id, buf,  hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER, INTENT(IN), TARGET :: fill_value  ! Fill value
-    INTEGER(HID_T), INTENT(IN) :: space_id ! Memory dataspace selection identifier
-    INTEGER, INTENT(IN), DIMENSION(*), TARGET :: buf ! Memory buffer to fill in
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-
-    INTEGER(HID_T) :: fill_type_id ! Fill value datatype identifier
-    INTEGER(HID_T) :: mem_type_id  ! Buffer dadtype identifier
-
-    TYPE(C_PTR) :: f_ptr_fill_value ! C pointer to fill_value
-    TYPE(C_PTR) :: f_ptr_buf        ! C pointer to buf
-
-    f_ptr_fill_value = C_LOC(fill_value)
-    f_ptr_buf = C_LOC(buf(1))
-
-    fill_type_id = H5T_NATIVE_INTEGER
-    mem_type_id  = H5T_NATIVE_INTEGER
-
-    hdferr = h5dfill_c(f_ptr_fill_value, fill_type_id, space_id, &
-         f_ptr_buf, mem_type_id)
-
-  END SUBROUTINE h5dfill_integer
-
-!
-! NAME
-!  h5dfill_real
-!
-! PURPOSE
-!  Fills dataspace elements with a fill value in a memory buffer.
-!  Only INTEGER, CHARACTER, REAL and DOUBLE PRECISION datatypes
-!  of the fillvalues and buffers are supported. Buffer and fillvalue
-!  are assumed to have the same datatype.
-!  Only one-dimesional buffers are supported.
-!
-! Inputs:
-!		fill_value	- fill value
-!		space_id	- memory space selection identifier
-!		buf		- data buffer iin memory ro apply selection to
-!				- of k-th dimension of the buf array
-! Outputs:
-!		hdferr:		- error code
-!				 	Success:  0
-!				 	Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  March 12, 2003
-!
-  SUBROUTINE h5dfill_real(fill_valuer, space_id, buf,  hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    REAL, INTENT(IN), TARGET :: fill_valuer  ! Fill value
-    INTEGER(HID_T), INTENT(IN) :: space_id ! Memory dataspace selection identifier
-    REAL, INTENT(IN), DIMENSION(*), TARGET :: buf ! Memory buffer to fill in
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-
-    INTEGER(HID_T) :: fill_type_id ! Fill value datatype identifier
-    INTEGER(HID_T) :: mem_type_id !  Buffer dadtype identifier
-
-    TYPE(C_PTR) :: f_ptr_fill_valuer ! C pointer to fill_value
-    TYPE(C_PTR) :: f_ptr_buf ! C pointer to buf
-
-    f_ptr_fill_valuer = C_LOC(fill_valuer)
-    f_ptr_buf = C_LOC(buf(1))
-
-    fill_type_id = H5T_NATIVE_REAL
-    mem_type_id  = H5T_NATIVE_REAL
-
-    hdferr = h5dfill_c(f_ptr_fill_valuer, fill_type_id, space_id, &
-         f_ptr_buf, mem_type_id)
-
-  END SUBROUTINE h5dfill_real
-
-!
-! NAME		
-!  h5dfill_char
-!
-! PURPOSE 
-!  Fills dataspace elements with a fill value in a memory buffer.
-!  Only INTEGER, CHARACTER, REAL and DOUBLE PRECISION datatypes
-!  of the fillvalues and buffers are supported. Buffer and fillvalue
-!  are assumed to have the same datatype.
-!  Only one-dimesional buffers are supported.
-!
-! Inputs:
-!		fill_value	- fill value
-!		space_id	- memory space selection identifier
-!		buf		- data buffer iin memory ro apply selection to
-!				- of k-th dimension of the buf array
-! Outputs:
-!		hdferr:		- error code
-!				 	Success:  0
-!				 	Failure: -1
-! AUTHOR
-!  Elena Pourmal
-!  March 12, 2003
-!
-  SUBROUTINE h5dfill_char(fill_value, space_id, buf,  hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    CHARACTER, INTENT(IN), TARGET :: fill_value  ! Fill value
-    INTEGER(HID_T), INTENT(IN) :: space_id ! Memory dataspace selection identifier
-    CHARACTER, INTENT(IN), DIMENSION(*), TARGET :: buf ! Memory buffer to fill in
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-
-    INTEGER(HID_T) :: fill_type_id ! Fill value datatype identifier
-    INTEGER(HID_T) :: mem_type_id !  Buffer dadtype identifier
-
-    TYPE(C_PTR) :: f_ptr_fill_value ! C pointer to fill_value
-    TYPE(C_PTR) :: f_ptr_buf ! C pointer to buf
-
-    f_ptr_fill_value = C_LOC(fill_value)
-    f_ptr_buf = C_LOC(buf(1))
-
-    hdferr = h5dfill_c(f_ptr_fill_value, fill_type_id, space_id, &
-         f_ptr_buf, mem_type_id)
-
-  END SUBROUTINE h5dfill_char
-!
-!****s* H5D (F03)/h5dvlen_reclaim_f
-! NAME
-!  h5dvlen_reclaim_f
-!
-! PURPOSE 
-!  Reclaims VL datatype memory buffers. 
-!
-! Inputs:
-!
-!  type_id  - Identifier of the datatype. 
-!  space_id - Identifier of the dataspace. 
-!  plist_id - Identifier of the property list used to create the buffer. 
-!  buf      - Pointer to the buffer to be reclaimed. 
-!
-! Outputs:
-!  hdferr   - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-! M. Scot Breitenfeld
-! January 11, 2011
-!
-! Fortran2003 Interface:
-  SUBROUTINE h5dvlen_reclaim_f(type_id, space_id, plist_id, buf, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN)    :: type_id
-    INTEGER(HID_T), INTENT(IN)    :: space_id
-    INTEGER(HID_T), INTENT(IN)    :: plist_id
-    TYPE(C_PTR)   , INTENT(INOUT) :: buf
-    INTEGER       , INTENT(OUT)   :: hdferr
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5dvlen_reclaim_c(type_id, space_id, plist_id, buf) BIND(C, NAME='h5dvlen_reclaim_c')
-         USE H5GLOBAL
-         USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR
-         INTEGER(HID_T) :: type_id
-         INTEGER(HID_T) :: space_id
-         INTEGER(HID_T) :: plist_id
-         TYPE(C_PTR), VALUE :: buf
-       END FUNCTION h5dvlen_reclaim_c
-    END INTERFACE
-
-    hdferr = H5Dvlen_reclaim_c(type_id, space_id, plist_id, buf)
-
-  END SUBROUTINE H5Dvlen_reclaim_f
-
-END MODULE H5D_PROVISIONAL
-
-
diff --git a/fortran/src/H5Dff_F90.f90 b/fortran/src/H5Dff_F90.f90
deleted file mode 100644
index 66cfe62..0000000
--- a/fortran/src/H5Dff_F90.f90
+++ /dev/null
@@ -1,3004 +0,0 @@
-!****h* ROBODoc/H5D (F90)
-!
-! NAME
-!
-!  H5D_PROVISIONAL
-!
-! PURPOSE
-!
-!  This file contains Fortran 90 interfaces for H5D functions. It contains
-!  the same functions as H5Dff_F03.f90 but excludes the Fortran 2003 functions
-!  and the interface listings. This file will be compiled instead of H5Dff_F03.f90
-!  if Fortran 2003 functions are not enabled.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!  (1) The maximum rank of an array allowed in Fortran is 7, therefore
-!  we only provide an interface for arrays up to and including rank 7.
-!
-!  (2) Unfortunately we are using a generic interface and one of the factors
-!  used in determining the proper routine to select is that of the array
-!  rank being passed, therefore we can not create just one subroutine for
-!  each array type (integer, real, etc...) of various ranks and then use a
-!  rank 1 array of assumed size in the just one subroutine,
-!  (i.e. integer, dimension(*) :: ... )
-!  (i.e. real   , dimension(*) :: ... ) etc...
-!
-!  (3)
-!                         *** IMPORTANT ***
-!  If you add a new H5D function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!*****
-
-MODULE H5D_PROVISIONAL
-  USE H5GLOBAL
-
-  INTERFACE h5dwrite_f
-
-     MODULE PROCEDURE h5dwrite_reference_obj
-     MODULE PROCEDURE h5dwrite_reference_dsetreg
-     MODULE PROCEDURE h5dwrite_integer_scalar
-     MODULE PROCEDURE h5dwrite_integer_1
-     MODULE PROCEDURE h5dwrite_integer_2
-     MODULE PROCEDURE h5dwrite_integer_3
-     MODULE PROCEDURE h5dwrite_integer_4
-     MODULE PROCEDURE h5dwrite_integer_5
-     MODULE PROCEDURE h5dwrite_integer_6
-     MODULE PROCEDURE h5dwrite_integer_7
-     MODULE PROCEDURE h5dwrite_char_scalar
-     MODULE PROCEDURE h5dwrite_char_1
-     MODULE PROCEDURE h5dwrite_char_2
-     MODULE PROCEDURE h5dwrite_char_3
-     MODULE PROCEDURE h5dwrite_char_4
-     MODULE PROCEDURE h5dwrite_char_5
-     MODULE PROCEDURE h5dwrite_char_6
-     MODULE PROCEDURE h5dwrite_char_7
-     MODULE PROCEDURE h5dwrite_real_scalar
-     MODULE PROCEDURE h5dwrite_real_1
-     MODULE PROCEDURE h5dwrite_real_2
-     MODULE PROCEDURE h5dwrite_real_3
-     MODULE PROCEDURE h5dwrite_real_4
-     MODULE PROCEDURE h5dwrite_real_5
-     MODULE PROCEDURE h5dwrite_real_6
-     MODULE PROCEDURE h5dwrite_real_7
-
-  END INTERFACE
-
-  INTERFACE h5dread_f
-
-     MODULE PROCEDURE h5dread_reference_obj
-     MODULE PROCEDURE h5dread_reference_dsetreg
-     MODULE PROCEDURE h5dread_integer_scalar
-     MODULE PROCEDURE h5dread_integer_1
-     MODULE PROCEDURE h5dread_integer_2
-     MODULE PROCEDURE h5dread_integer_3
-     MODULE PROCEDURE h5dread_integer_4
-     MODULE PROCEDURE h5dread_integer_5
-     MODULE PROCEDURE h5dread_integer_6
-     MODULE PROCEDURE h5dread_integer_7
-     MODULE PROCEDURE h5dread_char_scalar
-     MODULE PROCEDURE h5dread_char_1
-     MODULE PROCEDURE h5dread_char_2
-     MODULE PROCEDURE h5dread_char_3
-     MODULE PROCEDURE h5dread_char_4
-     MODULE PROCEDURE h5dread_char_5
-     MODULE PROCEDURE h5dread_char_6
-     MODULE PROCEDURE h5dread_char_7
-     MODULE PROCEDURE h5dread_real_scalar
-     MODULE PROCEDURE h5dread_real_1
-     MODULE PROCEDURE h5dread_real_2
-     MODULE PROCEDURE h5dread_real_3
-     MODULE PROCEDURE h5dread_real_4
-     MODULE PROCEDURE h5dread_real_5
-     MODULE PROCEDURE h5dread_real_6
-     MODULE PROCEDURE h5dread_real_7
-  END INTERFACE
-
-  INTERFACE h5dfill_f
-     MODULE PROCEDURE h5dfill_integer
-     MODULE PROCEDURE h5dfill_real
-     MODULE PROCEDURE h5dfill_char
-  END INTERFACE
-
-CONTAINS
-
-!****s* H5D/h5dread_f
-!
-! NAME
-!  h5dread_f
-!
-! PURPOSE
-!  Reads raw data from the specified dataset into buf,
-!  converting from file datatype and dataspace to memory
-!  datatype and dataspace.
-!
-! INPUTS
-!  dset_id 	 - dataset identifier
-!  mem_type_id 	 - memory type identifier
-!  dims 	 - 1-dim array of size 7; dims(k) has the size
-!   	           of k-th dimension of the buf array
-! OUTPUTS
-!  buf 	   - buffer to read data in
-!  hdferr: - error code
-!             Success:  0
-!             Failure: -1
-!
-! OPTIONAL PARAMETERS
-!  mem_space_id  - memory dataspace identifier
-!  file_space_id - file dataspace identifier
-!  xfer_prp 	 - trasfer property list identifier
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-!  dims parameter was added to make code portable;
-!  n parameter was replaced with dims parameter in
-!  the h5dwrite_reference_obj and h5dwrite_reference_dsetreg
-!  functions.  April 2, 2001
-!
-! NOTES
-!  This function is overloaded to read INTEGER,
-!  REAL, DOUBLE PRECISION and CHARACTER buffers
-!  up to 7 dimensions, and one dimensional buffers
-!  of the TYPE(hobj_ref_t_f) and TYPE(hdset_reg_ref_t_f) types.
-!*****
-  SUBROUTINE h5dread_reference_obj(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    TYPE(hobj_ref_t_f), INTENT(INOUT) , &
-         DIMENSION(dims(1)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    INTEGER(HADDR_T), ALLOCATABLE, DIMENSION(:) :: ref_buf
-    INTEGER(HSIZE_T) :: j
-
-    INTERFACE
-       INTEGER FUNCTION h5dread_ref_obj_c(dset_id, mem_type_id,&
-            mem_space_id_default, &
-            file_space_id_default, xfer_prp_default, ref_buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_REF_OBJ_C'::h5dread_ref_obj_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER(HADDR_T), DIMENSION(*) :: ref_buf
-       END FUNCTION h5dread_ref_obj_c
-    END INTERFACE
-
-    ALLOCATE(ref_buf(dims(1)), stat=hdferr)
-    IF (hdferr .NE. 0) THEN
-       hdferr = -1
-       RETURN
-    ENDIF
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_ref_obj_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, ref_buf, dims)
-    DO j = 1, dims(1)
-       buf(j)%ref = ref_buf(j)
-    ENDDO
-    DEALLOCATE(ref_buf)
-  END SUBROUTINE h5dread_reference_obj
-
-  SUBROUTINE h5dread_reference_dsetreg(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    TYPE(hdset_reg_ref_t_f), INTENT(INOUT), &
-         DIMENSION(dims(1)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    INTEGER, ALLOCATABLE, DIMENSION(:) :: ref_buf
-    INTEGER :: i
-    INTEGER(HSIZE_T) :: j
-
-    INTERFACE
-       INTEGER FUNCTION h5dread_ref_reg_c(dset_id, mem_type_id,&
-            mem_space_id_default, &
-            file_space_id_default, xfer_prp_default, ref_buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_REF_REG_C'::h5dread_ref_reg_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER, DIMENSION(*) :: ref_buf
-       END FUNCTION h5dread_ref_reg_c
-    END INTERFACE
-
-    ALLOCATE(ref_buf(REF_REG_BUF_LEN*dims(1)), stat=hdferr)
-    IF (hdferr .NE. 0) THEN
-       hdferr = -1
-       RETURN
-    ENDIF
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_ref_reg_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, ref_buf, dims)
-
-    DO j = 1, dims(1)
-       DO i = 1, REF_REG_BUF_LEN
-          buf(j)%ref(i) = ref_buf(REF_REG_BUF_LEN*(j-1) + i)
-       ENDDO
-    ENDDO
-    DEALLOCATE(ref_buf)
-  END SUBROUTINE h5dread_reference_dsetreg
-
-  SUBROUTINE h5dread_integer_scalar(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(INOUT) :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dread_integer_s_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_INTEGER_S_C'::h5dread_integer_s_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER, INTENT(OUT) :: buf
-       END FUNCTION h5dread_integer_s_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_integer_s_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_integer_scalar
-
-  SUBROUTINE h5dread_integer_1(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(INOUT), DIMENSION(dims(1)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dread_integer_1_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_INTEGER_1_C'::h5dread_integer_1_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER, INTENT(OUT), DIMENSION(dims(1)) :: buf
-       END FUNCTION h5dread_integer_1_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_integer_1_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_integer_1
-
-  SUBROUTINE h5dread_integer_2(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(INOUT), DIMENSION(dims(1),dims(2)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dread_integer_2_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_INTEGER_2_C'::h5dread_integer_2_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER, INTENT(OUT), DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5dread_integer_2_c
-    END INTERFACE
-
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_integer_2_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, &
-         buf, dims)
-
-  END SUBROUTINE h5dread_integer_2
-
-  SUBROUTINE h5dread_integer_3(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dread_integer_3_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_INTEGER_3_C'::h5dread_integer_3_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER, INTENT(OUT), DIMENSION(dims(1),dims(2),dims(3)) :: buf
-       END FUNCTION h5dread_integer_3_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_integer_3_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, &
-         buf, dims)
-
-  END SUBROUTINE h5dread_integer_3
-
-  SUBROUTINE h5dread_integer_4(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(INOUT), DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dread_integer_4_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_INTEGER_4_C'::h5dread_integer_4_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER, INTENT(OUT), DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-       END FUNCTION h5dread_integer_4_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_integer_4_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, &
-         buf, dims)
-
-  END SUBROUTINE h5dread_integer_4
-
-  SUBROUTINE h5dread_integer_5(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(INOUT), DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dread_integer_5_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_INTEGER_5_C'::h5dread_integer_5_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-       END FUNCTION h5dread_integer_5_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_integer_5_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, &
-         buf, dims)
-
-  END SUBROUTINE h5dread_integer_5
-
-  SUBROUTINE h5dread_integer_6(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-
-    INTERFACE
-       INTEGER FUNCTION h5dread_integer_6_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_INTEGER_6_C'::h5dread_integer_6_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-       END FUNCTION h5dread_integer_6_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_integer_6_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, &
-         buf, dims)
-
-  END SUBROUTINE h5dread_integer_6
-
-  SUBROUTINE h5dread_integer_7(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dread_integer_7_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_INTEGER_7_C'::h5dread_integer_7_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-       END FUNCTION h5dread_integer_7_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_integer_7_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, &
-         buf, dims)
-
-  END SUBROUTINE h5dread_integer_7
-
-  SUBROUTINE h5dread_char_scalar(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(INOUT) :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dreadc_s_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREADC_S_C'::h5dreadc_s_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         CHARACTER(LEN=*), INTENT(OUT) :: buf
-       END FUNCTION h5dreadc_s_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dreadc_s_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_char_scalar
-
-  SUBROUTINE h5dread_char_1(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dreadc_1_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREADC_1_C'::h5dreadc_1_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         CHARACTER(LEN=*), INTENT(INOUT), &
-              DIMENSION(dims(1)) :: buf
-       END FUNCTION h5dreadc_1_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dreadc_1_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_char_1
-
-  SUBROUTINE h5dread_char_2(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-
-    INTERFACE
-       INTEGER FUNCTION h5dreadc_2_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREADC_2_C'::h5dreadc_2_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         CHARACTER(LEN=*), INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5dreadc_2_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dreadc_2_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_char_2
-
-  SUBROUTINE h5dread_char_3(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dreadc_3_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREADC_3_C'::h5dreadc_3_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         CHARACTER(LEN=*), INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf
-       END FUNCTION h5dreadc_3_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dreadc_3_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_char_3
-
-  SUBROUTINE h5dread_char_4(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dreadc_4_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREADC_4_C'::h5dreadc_4_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         CHARACTER(LEN=*), INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-       END FUNCTION h5dreadc_4_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dreadc_4_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_char_4
-
-  SUBROUTINE h5dread_char_5(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dreadc_5_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREADC_5_C'::h5dreadc_5_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         CHARACTER(LEN=*), INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-       END FUNCTION h5dreadc_5_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dreadc_5_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_char_5
-
-  SUBROUTINE h5dread_char_6(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dreadc_6_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREADC_6_C'::h5dreadc_6_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         CHARACTER(LEN=*), INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-       END FUNCTION h5dreadc_6_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dreadc_6_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_char_6
-
-  SUBROUTINE h5dread_char_7(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dreadc_7_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREADC_7_C'::h5dreadc_7_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         CHARACTER(LEN=*), INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-       END FUNCTION h5dreadc_7_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dreadc_7_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_char_7
-
-  SUBROUTINE h5dread_real_scalar(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(INOUT) :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dread_real_s_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_REAL_S_C'::h5dread_real_s_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         REAL, INTENT(OUT) :: buf
-       END FUNCTION h5dread_real_s_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_real_s_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_real_scalar
-
-  SUBROUTINE h5dread_real_1(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !            INTEGER, EXTERNAL :: h5dread_real_1_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dread_real_1_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_REAL_1_C'::h5dread_real_1_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         REAL, INTENT(INOUT), &
-              DIMENSION(dims(1)) :: buf
-       END FUNCTION h5dread_real_1_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_real_1_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_real_1
-
-  SUBROUTINE h5dread_real_2(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dread_real_2_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_REAL_2_C'::h5dread_real_2_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         REAL, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5dread_real_2_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_real_2_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_real_2
-
-  SUBROUTINE h5dread_real_3(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dread_real_3_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_REAL_3_C'::h5dread_real_3_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         REAL, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf
-       END FUNCTION h5dread_real_3_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_real_3_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_real_3
-
-  SUBROUTINE h5dread_real_4(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3), dims(4)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dread_real_4_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_REAL_4_C'::h5dread_real_4_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         REAL, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3), dims(4)) :: buf
-       END FUNCTION h5dread_real_4_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_real_4_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_real_4
-
-  SUBROUTINE h5dread_real_5(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dread_real_5_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_REAL_5_C'::h5dread_real_5_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         REAL, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-       END FUNCTION h5dread_real_5_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_real_5_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_real_5
-
-  SUBROUTINE h5dread_real_6(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dread_real_6_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_REAL_6_C'::h5dread_real_6_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         REAL, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-       END FUNCTION h5dread_real_6_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_real_6_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_real_6
-
-  SUBROUTINE h5dread_real_7(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dread_real_7_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_REAL_7_C'::h5dread_real_7_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         REAL, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-       END FUNCTION h5dread_real_7_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_real_7_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_real_7
-
-  SUBROUTINE h5dwrite_reference_obj(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: dims ! size of the bufffer buf
-    TYPE(hobj_ref_t_f), DIMENSION(dims(1)), INTENT(IN) :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    INTEGER(HADDR_T), ALLOCATABLE, DIMENSION(:) :: ref_buf
-    INTEGER(HSIZE_T) :: j
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_ref_obj_c(dset_id, mem_type_id,&
-            mem_space_id_default, &
-            file_space_id_default, xfer_prp_default, ref_buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_REF_OBJ_C'::h5dwrite_ref_obj_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HADDR_T), DIMENSION(*) :: ref_buf
-         INTEGER(HSIZE_T), DIMENSION(*) :: dims
-       END FUNCTION h5dwrite_ref_obj_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    ALLOCATE(ref_buf(dims(1)), stat=hdferr)
-    IF (hdferr .NE. 0 ) THEN
-       hdferr = -1
-       RETURN
-    ELSE
-       DO j = 1, dims(1)
-          ref_buf(j) = buf(j)%ref
-       ENDDO
-    ENDIF
-    hdferr = h5dwrite_ref_obj_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, ref_buf, dims(1))
-    DEALLOCATE(ref_buf)
-
-  END SUBROUTINE h5dwrite_reference_obj
-
-  SUBROUTINE h5dwrite_reference_dsetreg(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: dims ! size of the bufffer buf
-    TYPE(hdset_reg_ref_t_f), DIMENSION(dims(1)), INTENT(IN) :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-    INTEGER, ALLOCATABLE, DIMENSION(:) :: ref_buf
-    INTEGER :: i
-    INTEGER(HSIZE_T) :: j
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_ref_reg_c(dset_id, mem_type_id,&
-            mem_space_id_default, &
-            file_space_id_default, xfer_prp_default, ref_buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_REF_REG_C'::h5dwrite_ref_reg_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER, DIMENSION(*) :: ref_buf
-         INTEGER(HSIZE_T), DIMENSION(*) ::  dims
-       END FUNCTION h5dwrite_ref_reg_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    ALLOCATE(ref_buf(REF_REG_BUF_LEN*dims(1)), stat=hdferr)
-    IF (hdferr .NE. 0 ) THEN
-       hdferr = -1
-       RETURN
-    ELSE
-       DO j = 1, dims(1)
-          DO i = 1, REF_REG_BUF_LEN
-             ref_buf(REF_REG_BUF_LEN*(j-1) + i) = buf(j)%ref(i)
-          ENDDO
-       ENDDO
-    ENDIF
-    hdferr = h5dwrite_ref_reg_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, ref_buf, dims)
-    DEALLOCATE(ref_buf)
-
-  END SUBROUTINE h5dwrite_reference_dsetreg
-
-  SUBROUTINE h5dwrite_integer_scalar(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER, INTENT(IN) :: buf ! Data buffer
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_integer_s_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_INTEGER_S_C'::h5dwrite_integer_s_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER, INTENT(IN) :: buf
-       END FUNCTION h5dwrite_integer_s_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_integer_s_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_integer_scalar
-
-  SUBROUTINE h5dwrite_integer_1(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_integer_1_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_INTEGER_1_C'::h5dwrite_integer_1_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER, INTENT(IN), &
-              DIMENSION(dims(1)) :: buf
-       END FUNCTION h5dwrite_integer_1_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_integer_1_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_integer_1
-
-  SUBROUTINE h5dwrite_integer_2(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1),dims(2)) :: buf   ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_integer_2_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_INTEGER_2_C'::h5dwrite_integer_2_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER, INTENT(IN), &
-              DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5dwrite_integer_2_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-    hdferr = h5dwrite_integer_2_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, &
-         buf, dims)
-
-  END SUBROUTINE h5dwrite_integer_2
-
-  SUBROUTINE h5dwrite_integer_3(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_integer_3_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_INTEGER_3_C'::h5dwrite_integer_3_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf
-       END FUNCTION h5dwrite_integer_3_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_integer_3_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, &
-         buf, dims)
-
-  END SUBROUTINE h5dwrite_integer_3
-
-  SUBROUTINE h5dwrite_integer_4(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_integer_4_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_INTEGER_4_C'::h5dwrite_integer_4_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-       END FUNCTION h5dwrite_integer_4_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_integer_4_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, &
-         buf, dims)
-
-  END SUBROUTINE h5dwrite_integer_4
-
-  SUBROUTINE h5dwrite_integer_5(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_integer_5_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_INTEGER_5_C'::h5dwrite_integer_5_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-       END FUNCTION h5dwrite_integer_5_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_integer_5_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, &
-         buf, dims)
-
-  END SUBROUTINE h5dwrite_integer_5
-
-  SUBROUTINE h5dwrite_integer_6(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_integer_6_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_INTEGER_6_C'::h5dwrite_integer_6_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-       END FUNCTION h5dwrite_integer_6_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_integer_6_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, &
-         buf, dims)
-
-  END SUBROUTINE h5dwrite_integer_6
-
-  SUBROUTINE h5dwrite_integer_7(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    INTEGER, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T)  :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_integer_7_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_INTEGER_7_C'::h5dwrite_integer_7_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         INTEGER, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-       END FUNCTION h5dwrite_integer_7_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_integer_7_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, &
-         buf, dims)
-
-  END SUBROUTINE h5dwrite_integer_7
-
-
-  SUBROUTINE h5dwrite_char_scalar(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(IN) :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwritec_s_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITEC_S_C'::h5dwritec_s_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         CHARACTER(LEN=*), INTENT(IN) :: buf
-       END FUNCTION h5dwritec_s_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwritec_s_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_char_scalar
-
-  SUBROUTINE h5dwrite_char_1(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwritec_1_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITEC_1_C'::h5dwritec_1_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         CHARACTER(LEN=*), INTENT(IN), &
-              DIMENSION(dims(1)) :: buf
-       END FUNCTION h5dwritec_1_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwritec_1_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_char_1
-
-  SUBROUTINE h5dwrite_char_2(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwritec_2_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITEC_2_C'::h5dwritec_2_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         CHARACTER(LEN=*), INTENT(IN), &
-              DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5dwritec_2_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwritec_2_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_char_2
-
-  SUBROUTINE h5dwrite_char_3(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwritec_3_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITEC_3_C'::h5dwritec_3_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         CHARACTER(LEN=*), INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf
-       END FUNCTION h5dwritec_3_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwritec_3_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_char_3
-
-  SUBROUTINE h5dwrite_char_4(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwritec_4_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITEC_4_C'::h5dwritec_4_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         CHARACTER(LEN=*), INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-       END FUNCTION h5dwritec_4_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwritec_4_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_char_4
-
-  SUBROUTINE h5dwrite_char_5(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwritec_5_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITEC_5_C'::h5dwritec_5_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         CHARACTER(LEN=*), INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-       END FUNCTION h5dwritec_5_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwritec_5_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_char_5
-
-  SUBROUTINE h5dwrite_char_6(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwritec_6_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITEC_6_C'::h5dwritec_6_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         CHARACTER(LEN=*), INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-       END FUNCTION h5dwritec_6_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwritec_6_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_char_6
-
-  SUBROUTINE h5dwrite_char_7(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    CHARACTER(LEN=*), INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwritec_7_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITEC_7_C'::h5dwritec_7_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         CHARACTER(LEN=*), INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-       END FUNCTION h5dwritec_7_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwritec_7_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_char_7
-
-  SUBROUTINE h5dwrite_real_scalar(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(IN) :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_real_s_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_REAL_S_C'::h5dwrite_real_s_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         REAL, INTENT(IN) :: buf
-       END FUNCTION h5dwrite_real_s_c
-    END INTERFACE
-
-    xfer_prp_default  = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_real_s_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_real_scalar
-
-  SUBROUTINE h5dwrite_real_1(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_real_1_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_REAL_1_C'::h5dwrite_real_1_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         REAL, INTENT(IN), &
-              DIMENSION(dims(1)) :: buf
-       END FUNCTION h5dwrite_real_1_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_real_1_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_real_1
-
-  SUBROUTINE h5dwrite_real_2(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_real_2_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_REAL_2_C'::h5dwrite_real_2_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         REAL, INTENT(IN), &
-              DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5dwrite_real_2_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_real_2_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_real_2
-
-  SUBROUTINE h5dwrite_real_3(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_real_3_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_REAL_3_C'::h5dwrite_real_3_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         REAL, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf
-       END FUNCTION h5dwrite_real_3_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_real_3_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_real_3
-
-  SUBROUTINE h5dwrite_real_4(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_real_4_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_REAL_4_C'::h5dwrite_real_4_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         REAL, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-       END FUNCTION h5dwrite_real_4_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_real_4_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_real_4
-
-  SUBROUTINE h5dwrite_real_5(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_real_5_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_REAL_5_C'::h5dwrite_real_5_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         REAL, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-       END FUNCTION h5dwrite_real_5_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_real_5_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_real_5
-
-  SUBROUTINE h5dwrite_real_6(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_real_6_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_REAL_6_C'::h5dwrite_real_6_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         REAL, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-       END FUNCTION h5dwrite_real_6_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_real_6_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_real_6
-
-  SUBROUTINE h5dwrite_real_7(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id     ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    REAL, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id  ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp      ! Transfer property list identifier
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_real_7_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_REAL_7_C'::h5dwrite_real_7_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         REAL, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-       END FUNCTION h5dwrite_real_7_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    IF (PRESENT(xfer_prp)) xfer_prp_default = xfer_prp
-    IF (PRESENT(mem_space_id))  mem_space_id_default = mem_space_id
-    IF (PRESENT(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_real_7_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_real_7
-
-!
-! NAME
-!  h5dfill_integer
-!
-! PURPOSE
-!  Fills dataspace elements with a fill value in a memory buffer.
-!  Only INTEGER, CHARACTER, REAL and DOUBLE PRECISION datatypes
-!  of the fillvalues and buffers are supported. Buffer and fillvalue
-!  are assumed to have the same datatype.
-!  Only one-dimesional buffers are supported.
-!
-! INPUTS
-!		fill_value	- fill value
-!		space_id	- memory space selection identifier
-!		buf		- data buffer iin memory ro apply selection to
-!				- of k-th dimension of the buf array
-! OUTPUTS
-!		hdferr:		- error code
-!				 	Success:  0
-!				 	Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  March 12, 2003
-!
-!
-
-  SUBROUTINE h5dfill_integer(fill_value, space_id, buf, hdferr)
-    IMPLICIT NONE
-    INTEGER, INTENT(IN) :: fill_value  ! Fill value
-    INTEGER(HID_T), INTENT(IN) :: space_id ! Memory dataspace selection identifier
-    INTEGER, INTENT(IN), DIMENSION(*) :: buf ! Memory buffer to fill in
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-
-    INTEGER(HID_T) :: fill_type_id ! Fill value datatype identifier
-    INTEGER(HID_T) :: mem_type_id !  Buffer dadtype identifier
-
-    !            INTEGER, EXTERNAL :: h5dfill_integer_c
-    ! MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dfill_integer_c(fill_value, fill_type_id, space_id, &
-            buf, mem_type_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DFILL_INTEGER_C'::h5dfill_integer_c
-         !DEC$ENDIF
-         INTEGER, INTENT(IN) :: fill_value  ! Fill value
-         INTEGER(HID_T) :: fill_type_id ! Fill value datatype identifier
-         INTEGER(HID_T), INTENT(IN) :: space_id ! Memory dataspace selection identifier
-         INTEGER, INTENT(IN), DIMENSION(*) :: buf ! Memory buffer to fill in
-         INTEGER(HID_T) :: mem_type_id !  Buffer dadtype identifier
-       END FUNCTION h5dfill_integer_c
-    END INTERFACE
-    fill_type_id = H5T_NATIVE_INTEGER
-    mem_type_id  = H5T_NATIVE_INTEGER
-
-    hdferr = h5dfill_integer_c(fill_value, fill_type_id, space_id, &
-         buf, mem_type_id)
-
-  END SUBROUTINE h5dfill_integer
-
-!
-! NAME
-!  h5dfill_real
-!
-! PURPOSE
-!  Fills dataspace elements with a fill value in a memory buffer.
-!  Only INTEGER, CHARACTER, REAL and DOUBLE PRECISION datatypes
-!  of the fillvalues and buffers are supported. Buffer and fillvalue
-!  are assumed to have the same datatype.
-!  Only one-dimesional buffers are supported.
-!
-! INPUTS
-!		fill_value	- fill value
-!		space_id	- memory space selection identifier
-!		buf		- data buffer iin memory ro apply selection to
-!				- of k-th dimension of the buf array
-! OUTPUTS
-!		hdferr:		- error code
-!				 	Success:  0
-!				 	Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  March 12, 2003
-!
-!
-
-  SUBROUTINE h5dfill_real(fill_valuer, space_id, buf, hdferr)
-    IMPLICIT NONE
-    REAL, INTENT(IN) :: fill_valuer  ! Fill value
-    INTEGER(HID_T), INTENT(IN) :: space_id ! Memory dataspace selection identifier
-    REAL, INTENT(IN), DIMENSION(*) :: buf ! Memory buffer to fill in
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-
-    INTEGER(HID_T) :: fill_type_id ! Fill value datatype identifier
-    INTEGER(HID_T) :: mem_type_id !  Buffer dadtype identifier
-
-    !            INTEGER, EXTERNAL :: h5dfill_real_c
-    ! MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dfill_real_c(fill_valuer, fill_type_id, space_id, &
-            buf, mem_type_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DFILL_REAL_C'::h5dfill_real_c
-         !DEC$ENDIF
-         REAL, INTENT(IN) :: fill_valuer  ! Fill value
-         INTEGER(HID_T) :: fill_type_id ! Fill value datatype identifier
-         INTEGER(HID_T), INTENT(IN) :: space_id ! Memory dataspace selection identifier
-         REAL, INTENT(IN), DIMENSION(*) :: buf ! Memory buffer to fill in
-         INTEGER(HID_T) :: mem_type_id !  Buffer dadtype identifier
-       END FUNCTION h5dfill_real_c
-    END INTERFACE
-    fill_type_id = H5T_NATIVE_REAL
-    mem_type_id  = H5T_NATIVE_REAL
-
-    hdferr = h5dfill_real_c(fill_valuer, fill_type_id, space_id, &
-         buf, mem_type_id)
-  END SUBROUTINE h5dfill_real
-
-!
-! NAME
-!  h5dfill_char
-!
-! PURPOSE
-!  Fills dataspace elements with a fill value in a memory buffer.
-!  Only INTEGER, CHARACTER, REAL and DOUBLE PRECISION datatypes
-!  of the fillvalues and buffers are supported. Buffer and fillvalue
-!  are assumed to have the same datatype.
-!  Only one-dimesional buffers are supported.
-!
-! INPUTS
-!		fill_value	- fill value
-!		space_id	- memory space selection identifier
-!		buf		- data buffer iin memory ro apply selection to
-!				- of k-th dimension of the buf array
-! OUTPUTS
-!		hdferr:		- error code
-!				 	Success:  0
-!				 	Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  March 12, 2003
-!
-!
-
-  SUBROUTINE h5dfill_char(fill_value, space_id, buf, hdferr)
-    IMPLICIT NONE
-    CHARACTER, INTENT(IN) :: fill_value    ! Fill value
-    INTEGER(HID_T), INTENT(IN) :: space_id ! Memory dataspace selection identifier
-    CHARACTER, INTENT(IN), DIMENSION(*) :: buf ! Memory buffer to fill in
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-
-    INTEGER(HID_T) :: fill_type_id ! Fill value datatype identifier
-    INTEGER(HID_T) :: mem_type_id  ! Buffer dadtype identifier
-
-    !            INTEGER, EXTERNAL :: h5dfillc_c
-    ! MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dfillc_c(fill_value, fill_type_id, space_id, &
-            buf, mem_type_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DFILLC_C'::h5dfillc_c
-         !DEC$ENDIF
-         CHARACTER, INTENT(IN) :: fill_value  ! Fill value
-         INTEGER(HID_T) :: fill_type_id ! Fill value datatype identifier
-         INTEGER(HID_T), INTENT(IN) :: space_id ! Memory dataspace selection identifier
-         CHARACTER, INTENT(IN), DIMENSION(*) :: buf ! Memory buffer to fill in
-         INTEGER(HID_T) :: mem_type_id !  Buffer dadtype identifier
-       END FUNCTION h5dfillc_c
-    END INTERFACE
-    fill_type_id = H5T_NATIVE_CHARACTER
-    mem_type_id  = H5T_NATIVE_CHARACTER
-
-    hdferr = h5dfillc_c(fill_value, fill_type_id, space_id, &
-         buf, mem_type_id)
-
-  END SUBROUTINE h5dfill_char
-
-
-END MODULE H5D_PROVISIONAL
diff --git a/fortran/src/H5Ef.c b/fortran/src/H5Ef.c
index 6e476ea..4b1d4c9 100644
--- a/fortran/src/H5Ef.c
+++ b/fortran/src/H5Ef.c
@@ -1,6 +1,6 @@
 /****h* H5Ef/H5Ef
  * PURPOSE
- *   This file contains C stubs for H5E Fortran APIs
+ *  This file contains C stubs for H5E Fortran APIs
  *
  * COPYRIGHT
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -42,7 +42,7 @@
  * SOURCE
 */
 int_f
-nh5eclear_c(hid_t_f *estack_id )
+h5eclear_c(hid_t_f *estack_id )
 /******/
 {
   int_f ret_value = 0;
@@ -78,7 +78,7 @@ done:
  * SOURCE
 */
 int_f
-nh5eprint_c1(_fcd name, int_f* namelen)
+h5eprint_c1(_fcd name, int_f* namelen)
 /******/
 {
     FILE *file = NULL;
@@ -124,7 +124,7 @@ done:
  * SOURCE
 */
 int_f
-nh5eprint_c2(void)
+h5eprint_c2(void)
 /******/
 {
     int_f ret_value = 0;
@@ -159,7 +159,7 @@ done:
  * SOURCE
 */
 int_f
-nh5eget_major_c(int_f* error_no, _fcd name, size_t_f* namelen)
+h5eget_major_c(int_f* error_no, _fcd name, size_t_f* namelen)
 /******/
 {
     char *c_name = NULL;
@@ -207,7 +207,7 @@ done:
  * SOURCE
 */
 int_f
-nh5eget_minor_c(int_f* error_no, _fcd name, size_t_f* namelen)
+h5eget_minor_c(int_f* error_no, _fcd name, size_t_f* namelen)
 /******/
 {
     char *c_name = NULL;
@@ -235,60 +235,34 @@ done:
     return ret_value;
 }
 
-/****if* H5Ef/h5eset_auto_c
- * NAME
- *  h5eset_auto_c
- * PURPOSE
- *  Call H5Eset_auto to turn automatic error printing on or off.
- * INPUTS
- *  printflag - flag to turn automatic error printing on or off.
- * OUTPUTS
- *
- * RETURNS
- *  0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *  Friday, November 17, 2000
- * HISTORY
- *  Major bug fix: Function never disabled printing.
- * SOURCE
-*/
-int_f
-nh5eset_auto_c(int_f* printflag)
-/******/
-{
-    herr_t status = -1;
-    int_f ret_value = 0;
-
-    if(*printflag == 1)
-        status = H5Eset_auto2(H5E_DEFAULT, (H5E_auto2_t)H5Eprint2, stderr);
-    else if(*printflag == 0)
-        status = H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
-    if(status < 0)
-        HGOTO_DONE(FAIL)
-
-done:
-    return ret_value;
-}
-
-
 /****if* H5Ef/h5eset_auto2_c
  * NAME
- *   h5eset_auto2_c
+ *  h5eset_auto2_c
  * PURPOSE
- *   Calls H5Eset_auto2
+ *  Calls H5Eset_auto2
  * INPUTS
- *   estack_id    - Error stack identifier.
- *   func 	 - Function to be called upon an error condition.
- *   client_data - Data passed to the error function.
+ *  estack_id   - Error stack identifier.
+ *  func 	- Function to be called upon an error condition.
+ *  client_data - Data passed to the error function.
  *   
  * RETURNS
- *   0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *   M. Scot Breitenfeld
- *   July 22, 2009
+ *  July 22, 2009
  * SOURCE
 */
+/* int_f */
+/* h5eset_auto2_c(hid_t_f *estack_id, H5E_auto2_t *func, void *client_data) */
+/* /\******\/ */
+/* { */
+/*   int ret_val = -1; */
+/*   herr_t status = -1; */
+
+/*   status = H5Eset_auto2((hid_t)*estack_id, *func, client_data); */
+/*   if (status >= 0) ret_val = 0; */
+/*   return ret_val; */
+/* } */
 
 int_f
 h5eset_auto2_c(int_f *printflag, hid_t_f *estack_id, H5E_auto2_t func, void *client_data)
@@ -307,3 +281,4 @@ h5eset_auto2_c(int_f *printflag, hid_t_f *estack_id, H5E_auto2_t func, void *cli
 
   return ret_val;
 }
+
diff --git a/fortran/src/H5Eff.F90 b/fortran/src/H5Eff.F90
new file mode 100644
index 0000000..a2efe61
--- /dev/null
+++ b/fortran/src/H5Eff.F90
@@ -0,0 +1,302 @@
+!****h* ROBODoc/H5E
+!
+! NAME
+!  MODULE H5E
+!
+! FILE
+!  fortran/src/H5Eff.f90
+!
+! PURPOSE
+!  This Module contains Fortran interfaces for H5E functions.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! NOTES
+!       _____ __  __ _____   ____  _____ _______       _   _ _______
+!      |_   _|  \/  |  __ \ / __ \|  __ \__   __|/\   | \ | |__   __|
+! ****   | | | \  / | |__) | |  | | |__) | | |  /  \  |  \| |  | |    ****
+! ****   | | | |\/| |  ___/| |  | |  _  /  | | / /\ \ | . ` |  | |    ****
+! ****  _| |_| |  | | |    | |__| | | \ \  | |/ ____ \| |\  |  | |    ****
+!      |_____|_|  |_|_|     \____/|_|  \_\ |_/_/    \_\_| \_|  |_|
+!
+!  If you add a new H5E function to the module you must add the function name
+!  to the Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
+!  This is needed for Windows based operating systems.
+!
+!*****
+
+MODULE H5E
+
+  USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR, C_FUNPTR, C_CHAR
+  USE H5GLOBAL
+
+  !Turn on automatic printing of errors
+  INTEGER, PARAMETER :: PRINTON = 1
+
+  !Turn off automatic printing of errors
+  INTEGER, PARAMETER :: PRINTOFF = 0
+
+CONTAINS
+
+!****s* H5E/h5eclear_f
+!
+! NAME
+!  h5eclear_f
+!
+! PURPOSE
+!  Clears the error stack for the current thread.
+!
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  estack_id     - Error Stack id
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  April 6, 2001
+!
+!  Added optional error stack identifier in order to bring
+!  the function in line with the h5eclear2 routine.
+!  MSB, July 9, 2009
+!
+! SOURCE
+  SUBROUTINE h5eclear_f(hdferr, estack_id)
+    IMPLICIT NONE
+    INTEGER, INTENT(OUT) :: hdferr  ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: estack_id
+!*****
+    INTEGER(HID_T) :: estack_id_default
+
+    INTERFACE
+       INTEGER FUNCTION h5eclear_c(estack_id_default) BIND(C,NAME='h5eclear_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T) :: estack_id_default
+       END FUNCTION h5eclear_c
+    END INTERFACE
+
+    estack_id_default = H5E_DEFAULT_F
+    IF(PRESENT(estack_id)) estack_id_default = estack_id
+
+    hdferr = h5eclear_c(estack_id_default)
+  END SUBROUTINE h5eclear_f
+
+!****s* H5E/h5eprint_f
+!
+! NAME
+!  h5eprint_f
+!
+! PURPOSE
+!  Prints the error stack in a default manner.
+!
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! OPTIONAL PARAMETERS
+!  name 	 - name of the file that contains print output
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  April 6, 2001
+!
+! SOURCE
+  SUBROUTINE h5eprint_f(hdferr, name)
+    CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: name
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTEGER :: namelen
+
+    INTERFACE
+       INTEGER FUNCTION h5eprint_c1(name, namelen) BIND(C,NAME='h5eprint_c1')
+         IMPORT :: C_CHAR
+         IMPLICIT NONE
+         INTEGER :: namelen
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+       END FUNCTION h5eprint_c1
+    END INTERFACE
+
+    INTERFACE
+       INTEGER FUNCTION h5eprint_c2()  BIND(C,NAME='h5eprint_c2')
+       END FUNCTION h5eprint_c2
+    END INTERFACE
+    namelen = LEN(NAME)
+    IF (PRESENT(name)) THEN
+       hdferr = h5eprint_c1(name, namelen)
+    ELSE
+       hdferr = h5eprint_c2()
+    ENDIF
+  END SUBROUTINE h5eprint_f
+!****s* H5E/h5eget_major_f
+!
+! NAME
+!  h5eget_major_f
+!
+! PURPOSE
+!  Returns a character string describing an error specified
+!  by a major error number.
+!
+! INPUTS
+!  error_no 	 - major error number
+!
+! OUTPUTS
+!  name 	 - character string describing the error
+!  namelen 	 - number of characters in the name buffer
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  April 6, 2001
+!
+! SOURCE
+  SUBROUTINE h5eget_major_f(error_no, name, namelen, hdferr)
+    INTEGER, INTENT(IN) :: error_no        ! Major error number
+    CHARACTER(LEN=*), INTENT(OUT) :: name  ! Character string describing
+                                           ! the error.
+    INTEGER(SIZE_T), INTENT(IN) :: namelen ! Anticipated number of characters
+                                           ! in name.
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5eget_major_c(error_no, name, namelen)  BIND(C,NAME='h5eget_major_c')
+         IMPORT :: C_CHAR
+         IMPORT :: SIZE_T
+         IMPLICIT NONE
+         INTEGER :: error_no
+         CHARACTER(KIND=C_CHAR), DIMENSION(*) :: name
+         INTEGER(SIZE_T), INTENT(IN) :: namelen
+       END FUNCTION h5eget_major_c
+    END INTERFACE
+
+    hdferr = h5eget_major_c(error_no, name, namelen)
+  END SUBROUTINE h5eget_major_f
+!****s* H5E/h5eget_minor_f
+!
+! NAME
+!  h5eget_minor_f
+!
+! PURPOSE
+!  Returns a character string describing an error specified
+!  by a minor error number.
+!
+! INPUTS
+!  error_no 	 - minor error number
+!
+! OUTPUTS
+!  name 	 - character string describing the error
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  April 6, 2001
+!
+! SOURCE
+  SUBROUTINE h5eget_minor_f(error_no, name, hdferr)
+    INTEGER, INTENT(IN) :: error_no       ! Major error number
+    CHARACTER(LEN=*), INTENT(OUT) :: name ! Character string describing
+                                          ! the error
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5eget_minor_c(error_no, name) BIND(C,NAME='h5eget_minor_c')
+         IMPORT :: C_CHAR
+         INTEGER :: error_no
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: name
+       END FUNCTION h5eget_minor_c
+    END INTERFACE
+
+    hdferr = h5eget_minor_c(error_no, name)
+  END SUBROUTINE h5eget_minor_f
+
+!****s* H5E/h5eset_auto_f
+!
+! NAME
+!  h5eset_auto_f
+!
+! PURPOSE
+!  Returns settings for automatic error stack traversal function and its data.
+!
+! Inputs:
+!  printflag   - Flag to turn automatic error printing on or off;
+!                possible values are:
+!                  printon (1)
+!                  printoff(0)
+!  estack_id   - Error stack identifier.
+!  func        - Function to be called upon an error condition.
+!  client_data - Data passed to the error function
+!  
+! Outputs:
+!  hdferr      - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  July 10, 2009
+!
+! Fortran2003 Interface:
+  SUBROUTINE h5eset_auto_f(printflag, hdferr, estack_id, func, client_data)
+    USE, INTRINSIC :: ISO_C_BINDING
+    INTEGER       , INTENT(IN)            :: printflag
+    INTEGER       , INTENT(OUT)           :: hdferr
+    INTEGER(HID_T), INTENT(IN) , OPTIONAL :: estack_id
+    TYPE(C_FUNPTR), INTENT(IN) , OPTIONAL :: func
+    TYPE(C_PTR)   , INTENT(IN) , OPTIONAL :: client_data
+!*****
+    INTEGER(HID_T) :: estack_id_default
+    TYPE(C_FUNPTR) :: func_default
+    TYPE(C_PTR)    :: client_data_default
+    INTERFACE
+       INTEGER FUNCTION h5eset_auto2_c(printflag, estack_id, func, client_data) &
+            BIND(C, NAME='h5eset_auto2_c')
+         IMPORT :: c_ptr, c_funptr
+         IMPORT :: HID_T
+         INTEGER :: printflag
+         INTEGER(HID_T) :: estack_id
+         TYPE(C_FUNPTR), VALUE :: func
+         TYPE(C_PTR), VALUE :: client_data
+       END FUNCTION h5eset_auto2_c
+    END INTERFACE
+
+    estack_id_default = -1
+    func_default = C_NULL_FUNPTR
+    client_data_default = C_NULL_PTR
+
+    IF(PRESENT(estack_id)) estack_id_default = estack_id
+    IF(PRESENT(func)) func_default = func
+    IF(PRESENT(client_data)) client_data_default = client_data
+
+    hdferr = h5eset_auto2_c(printflag, estack_id_default, func_default, client_data_default)
+  END SUBROUTINE h5eset_auto_f
+
+END MODULE H5E
+
diff --git a/fortran/src/H5Eff.f90 b/fortran/src/H5Eff.f90
deleted file mode 100644
index 7b56376..0000000
--- a/fortran/src/H5Eff.f90
+++ /dev/null
@@ -1,251 +0,0 @@
-!****h* ROBODoc/H5E
-!
-! NAME
-!  MODULE H5E
-!
-! FILE
-!  fortran/src/H5Eff.f90
-!
-! PURPOSE
-!  This Module contains Fortran interfaces for H5E functions.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5E function to the module you must add the function name
-!  to the Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5E
-
-  USE H5GLOBAL
-
-  !Turn on automatic printing of errors
-  INTEGER, PARAMETER :: PRINTON = 1
-
-  !Turn off automatic printing of errors
-  INTEGER, PARAMETER :: PRINTOFF = 0
-
-CONTAINS
-
-!****s* H5E/h5eclear_f
-!
-! NAME
-!  h5eclear_f
-!
-! PURPOSE
-!  Clears the error stack for the current thread.
-!
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  estack_id     - Error Stack id
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  April 6, 2001
-!
-!  Added optional error stack identifier in order to bring
-!  the function in line with the h5eclear2 routine.
-!  MSB, July 9, 2009
-!
-! SOURCE
-  SUBROUTINE h5eclear_f(hdferr, estack_id)
-    IMPLICIT NONE
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: estack_id
-!*****
-    INTEGER(HID_T) :: estack_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5eclear_c(estack_id_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5ECLEAR_C'::h5eclear_c
-         !DEC$ENDIF
-         INTEGER(HID_T) :: estack_id_default
-       END FUNCTION h5eclear_c
-    END INTERFACE
-
-    estack_id_default = H5E_DEFAULT_F
-    IF(PRESENT(estack_id)) estack_id_default = estack_id
-
-    hdferr = h5eclear_c(estack_id_default)
-  END SUBROUTINE h5eclear_f
-
-!****s* H5E/h5eprint_f
-!
-! NAME
-!  h5eprint_f
-!
-! PURPOSE
-!  Prints the error stack in a default manner.
-!
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! OPTIONAL PARAMETERS
-!  name 	 - name of the file that contains print output
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  April 6, 2001
-!
-! SOURCE
-  SUBROUTINE h5eprint_f(hdferr, name)
-    CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: name ! File name
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-!*****
-    INTEGER :: namelen
-
-    INTERFACE
-       INTEGER FUNCTION h5eprint_c1(name, namelen)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5EPRINT_C1'::h5eprint_c1
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER :: namelen
-         CHARACTER(LEN=*),INTENT(IN) :: name
-       END FUNCTION h5eprint_c1
-    END INTERFACE
-
-    INTERFACE
-       INTEGER FUNCTION h5eprint_c2()
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5EPRINT_C2'::h5eprint_c2
-         !DEC$ENDIF
-       END FUNCTION h5eprint_c2
-    END INTERFACE
-    namelen = LEN(NAME)
-    IF (PRESENT(name)) THEN
-       hdferr = h5eprint_c1(name, namelen)
-    ELSE
-       hdferr = h5eprint_c2()
-    ENDIF
-  END SUBROUTINE h5eprint_f
-!****s* H5E/h5eget_major_f
-!
-! NAME
-!  h5eget_major_f
-!
-! PURPOSE
-!  Returns a character string describing an error specified
-!  by a major error number.
-!
-! INPUTS
-!  error_no 	 - major error number
-!
-! OUTPUTS
-!  name 	 - character string describing the error
-!  namelen 	 - number of characters in the name buffer
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  April 6, 2001
-!
-! SOURCE
-  SUBROUTINE h5eget_major_f(error_no, name, namelen, hdferr)
-    INTEGER, INTENT(IN) :: error_no        ! Major error number
-    CHARACTER(LEN=*), INTENT(OUT) :: name  ! Character string describing
-                                           ! the error.
-    INTEGER(SIZE_T), INTENT(IN) :: namelen ! Anticipated number of characters
-                                           ! in name.
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5eget_major_c(error_no, name, namelen)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5EGET_MAJOR_C'::h5eget_major_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER :: error_no
-         CHARACTER(LEN=*) :: name
-         INTEGER(SIZE_T), INTENT(IN) :: namelen
-       END FUNCTION h5eget_major_c
-    END INTERFACE
-
-    hdferr = h5eget_major_c(error_no, name, namelen)
-  END SUBROUTINE h5eget_major_f
-!****s* H5E/h5eget_minor_f
-!
-! NAME
-!  h5eget_minor_f
-!
-! PURPOSE
-!  Returns a character string describing an error specified
-!  by a minor error number.
-!
-! INPUTS
-!  error_no 	 - minor error number
-!
-! OUTPUTS
-!  name 	 - character string describing the error
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  April 6, 2001
-!
-! SOURCE
-  SUBROUTINE h5eget_minor_f(error_no, name, hdferr)
-    INTEGER, INTENT(IN) :: error_no       ! Major error number
-    CHARACTER(LEN=*), INTENT(OUT) :: name ! Character string describing
-                                          ! the error
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5eget_minor_c(error_no, name)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5EGET_MINOR_C'::h5eget_minor_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER :: error_no
-         CHARACTER(LEN=*) :: name
-       END FUNCTION h5eget_minor_c
-    END INTERFACE
-
-    hdferr = h5eget_minor_c(error_no, name)
-  END SUBROUTINE h5eget_minor_f
-
-END MODULE H5E
-
diff --git a/fortran/src/H5Eff_F03.f90 b/fortran/src/H5Eff_F03.f90
deleted file mode 100644
index ff8d11c..0000000
--- a/fortran/src/H5Eff_F03.f90
+++ /dev/null
@@ -1,108 +0,0 @@
-!****h* ROBODoc/H5E (F03)
-!
-! NAME
-!  H5E_PROVISIONAL
-!
-! FILE
-!  src/fortran/src/H5Eff_F03.f90 
-!
-! PURPOSE
-!
-!  This file contains Fortran 90 and Fortran 2003 interfaces for H5E functions.
-!  It contains the same functions as H5Eff_F90.f90 but includes the
-!  Fortran 2003 functions and the interface listings. This file will be compiled
-!  instead of H5Eff_F90.f90 if Fortran 2003 functions are enabled.
-!
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5E function to the module you must add the function name
-!  to the Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5E_PROVISIONAL
-
-  USE H5GLOBAL
-
-CONTAINS
-
-!****s* H5E/h5eset_auto_f
-!
-! NAME
-!  h5eset_auto_f
-!
-! PURPOSE
-!  Returns settings for automatic error stack traversal function and its data.
-!
-! Inputs:
-!  printflag   - Flag to turn automatic error printing on or off;
-!                possible values are:
-!                  printon (1)
-!                  printoff(0)
-!  estack_id   - Error stack identifier.
-!  func        - Function to be called upon an error condition.
-!  client_data - Data passed to the error function
-!  
-! Outputs:
-!  hdferr      - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  July 10, 2009
-!
-! Fortran2003 Interface:
-  SUBROUTINE h5eset_auto_f(printflag, hdferr, estack_id, func, client_data)
-    USE, INTRINSIC :: ISO_C_BINDING
-    INTEGER       , INTENT(IN)            :: printflag
-    INTEGER       , INTENT(OUT)           :: hdferr
-    INTEGER(HID_T), INTENT(IN) , OPTIONAL :: estack_id
-    TYPE(C_FUNPTR), INTENT(IN) , OPTIONAL :: func
-    TYPE(C_PTR)   , INTENT(IN) , OPTIONAL :: client_data
-!*****
-    INTEGER(HID_T) :: estack_id_default
-    TYPE(C_FUNPTR) :: func_default
-    TYPE(C_PTR)    :: client_data_default
-    INTERFACE
-       INTEGER FUNCTION h5eset_auto2_c(printflag, estack_id, func, client_data) &
-            BIND(C, NAME='h5eset_auto2_c')
-         USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr, c_funptr
-         USE H5GLOBAL
-         INTEGER :: printflag
-         INTEGER(HID_T) :: estack_id
-!!$         TYPE(C_FUNPTR) :: func
-!!$         TYPE(C_PTR), VALUE :: client_data
-         TYPE(C_FUNPTR), VALUE :: func
-         TYPE(C_PTR), VALUE :: client_data
-       END FUNCTION h5eset_auto2_c
-    END INTERFACE
-
-    estack_id_default = -1
-    func_default = C_NULL_FUNPTR
-    client_data_default = C_NULL_PTR
-
-    IF(PRESENT(estack_id)) estack_id_default = estack_id
-    IF(PRESENT(func)) func_default = func
-    IF(PRESENT(client_data)) client_data_default = client_data
-
-    hdferr = h5eset_auto2_c(printflag, estack_id_default, func_default, client_data_default)
-  END SUBROUTINE h5eset_auto_f
-
-END MODULE H5E_PROVISIONAL
diff --git a/fortran/src/H5Eff_F90.f90 b/fortran/src/H5Eff_F90.f90
deleted file mode 100644
index 158ec12..0000000
--- a/fortran/src/H5Eff_F90.f90
+++ /dev/null
@@ -1,89 +0,0 @@
-!****h* ROBODoc/H5E (F90)
-!
-! NAME
-!  MODULE H5E_PROVISIONAL
-!
-! PURPOSE
-!  This file contains Fortran 90 interfaces for H5E functions. It contains
-!  the same functions as H5Eff_F03.f90 but excludes the Fortran 2003 functions
-!  and the interface listings. This file will be compiled instead of H5Eff_F03.f90
-!  if Fortran 2003 functions are not enabled.
-!
-!
-! COPYRIGHT
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!  Copyright by The HDF Group.                                               *
-!  Copyright by the Board of Trustees of the University of Illinois.         *
-!  All rights reserved.                                                      *
-!  *
-!  This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!  terms governing use, modification, and redistribution, is contained in    *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!  of the source code distribution tree; Copyright.html can be found at the  *
-!  root level of an installed copy of the electronic HDF5 document set and   *
-!  is linked from the top-level documents page.  It can also be found at     *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!  access to either file, you may request a copy from help at hdfgroup.org.     *
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!                         *** IMPORTANT ***
-!  If you add a new H5D function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!*****
-
-MODULE H5E_PROVISIONAL
-
-  USE H5GLOBAL
-
-CONTAINS
-
-!****s* H5E/h5eset_auto_f
-!
-! NAME
-!  h5eset_auto_f
-!
-! PURPOSE
-!  Turns automatic error printing on or off.
-!
-! INPUTS
-!  printflag 	 - Flag to turn automatic error printing on or off;
-!                  possible values are:
-!                    printon (1)
-!                    printoff(0)
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  April 6, 2001
-!
-! SOURCE
-  SUBROUTINE h5eset_auto_f(printflag, hdferr)
-    INTEGER, INTENT(IN) :: printflag  ! flag to turn automatic error
-                                      ! printing on or off
-                                      ! possible values are:
-                                      !     printon (1)
-                                      !     printoff(0)
-    INTEGER, INTENT(OUT) :: hdferr    ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5eset_auto_c(printflag)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5ESET_AUTO_C'::h5eset_auto_c
-         !DEC$ENDIF
-         INTEGER :: printflag
-       END FUNCTION h5eset_auto_c
-    END INTERFACE
-
-    hdferr = h5eset_auto_c(printflag)
-  END SUBROUTINE h5eset_auto_f
-
-
-END MODULE H5E_PROVISIONAL
diff --git a/fortran/src/H5FDmpiof.c b/fortran/src/H5FDmpiof.c
deleted file mode 100644
index bbdb170..0000000
--- a/fortran/src/H5FDmpiof.c
+++ /dev/null
@@ -1,258 +0,0 @@
-/****h* H5FDmpiof/H5FDmpiof
- *
- * PURPOSE
- *   This file contains C stubs for Parallel Fortran APIs
- *
- * COPYRIGHT
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group.                                               *
- * Copyright by the Board of Trustees of the University of Illinois.         *
- * All rights reserved.                                                      *
- *                                                                           *
- * This file is part of HDF5.  The full HDF5 copyright notice, including     *
- * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- *
- ******
-*/
-
-#include "H5f90.h"
-#include <mpi.h>
-#include "H5public.h"
-
-
-/* Support for C to Fortran translation in MPI */
-#ifndef H5_HAVE_MPI_MULTI_LANG_Comm
-#define MPI_Comm_c2f(comm) (int_f)(comm)
-#define MPI_Comm_f2c(comm) (MPI_Comm)(comm)
-#endif /*MPI Comm*/
-#ifndef H5_HAVE_MPI_MULTI_LANG_Info
-#define MPI_Info_c2f(info) (int_f)(info)
-#define MPI_Info_f2c(info) (MPI_Info)(info)
-#endif /*MPI Info*/
-
-/****if* H5FDmpiof/h5pset_fapl_mpio_c
- * NAME
- *        h5pset_fapl_mpio_c
- * PURPOSE
- *     Call H5Pset_fapl_mpio to set mode for parallel I/O and the user
- *              supplied communicator and info object
- * INPUTS
- *      prp_id - property list identifier
- *              comm   - MPI communicator
- *              info   - MPI info object
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              Thursday, October 26, 2000
- * HISTORY
- *
- * SOURCE
-*/
-int_f
-nh5pset_fapl_mpio_c(hid_t_f *prp_id, int_f* comm, int_f* info)
-/******/
-{
-     int ret_value = -1;
-     hid_t c_prp_id;
-     herr_t ret;
-     MPI_Comm c_comm;
-     MPI_Info c_info;
-     c_comm = MPI_Comm_f2c(*comm);
-     c_info = MPI_Info_f2c(*info);
-
-     /*
-      * Call H5Pset_mpi function.
-      */
-     c_prp_id = *prp_id;
-     ret = H5Pset_fapl_mpio(c_prp_id, c_comm, c_info);
-     if (ret < 0) return ret_value;
-     ret_value = 0;
-     return ret_value;
-}
-/****if* H5FDmpiof/h5pget_fapl_mpio_c
- * NAME
- *        h5pget_fapl_mpio_c
- * PURPOSE
- *     Call H5Pget_fapl_mpio to retrieve communicator and info object
- * INPUTS
- *      prp_id - property list identifier
- *              comm   - buffer to return MPI communicator
- *              info   - buffer to return MPI info object
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              Thursday, October 26, 2000
- * HISTORY
- *
- * SOURCE
-*/
-int_f
-nh5pget_fapl_mpio_c(hid_t_f *prp_id, int_f* comm, int_f* info)
-/******/
-{
-     int ret_value = -1;
-     hid_t c_prp_id;
-     herr_t ret;
-     MPI_Comm c_comm;
-     MPI_Info c_info;
-
-     /*
-      * Call H5Pget_mpi function.
-      */
-     c_prp_id = *prp_id;
-     ret = H5Pget_fapl_mpio(c_prp_id, &c_comm, &c_info);
-     if (ret < 0) return ret_value;
-     *comm = (int_f) MPI_Comm_c2f(c_comm);
-     *info = (int_f) MPI_Info_c2f(c_info);
-     ret_value = 0;
-     return ret_value;
-}
-/****if* H5FDmpiof/h5pset_dxpl_mpio_c
- * NAME
- *        h5pset_dxpl_mpio_c
- * PURPOSE
- *     Call H5Pset_dxpl_mpio to set transfer mode of the dataset
- *              trasfer property list
- * INPUTS
- *      prp_id - property list identifier
- *              data_xfer_mode - transfer mode
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              Thursday, October 26, 2000
- * HISTORY
- *
- * SOURCE
-*/
-int_f
-nh5pset_dxpl_mpio_c(hid_t_f *prp_id, int_f* data_xfer_mode)
-/******/
-{
-     int ret_value = -1;
-     hid_t c_prp_id;
-     herr_t ret;
-     H5FD_mpio_xfer_t c_data_xfer_mode;
-/*
-     switch (*data_xfer_mode) {
-
-        case H5FD_MPIO_INDEPENDENT_F:
-             c_data_xfer_mode = H5FD_MPIO_INDEPENDENT;
-             break;
-
-        case H5FD_MPIO_COLLECTIVE_F:
-             c_data_xfer_mode = H5FD_MPIO_COLLECTIVE;
-             break;
-        default:
-          return ret_value;
-      }
-*/
-     c_data_xfer_mode = (H5FD_mpio_xfer_t)*data_xfer_mode;
-     /*
-      * Call H5Pset_dxpl_mpio function.
-      */
-     c_prp_id = *prp_id;
-     ret = H5Pset_dxpl_mpio(c_prp_id, c_data_xfer_mode);
-     if (ret < 0) return ret_value;
-     ret_value = 0;
-     return ret_value;
-}
-
-/****if* H5FDmpiof/h5pget_dxpl_mpio_c
- * NAME
- *        h5pget_dxpl_mpio_c
- * PURPOSE
- *     Call H5Pget_dxpl_mpio to get transfer mode of the dataset
- *              trasfer property list
- * INPUTS
- *      prp_id - property list identifier
- *              data_xfer_mode  - buffer to retrieve transfer mode
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              Thursday, June 15, 2000
- * HISTORY
- *
- * SOURCE
-*/
-int_f
-nh5pget_dxpl_mpio_c(hid_t_f *prp_id, int_f* data_xfer_mode)
-/******/
-{
-     int ret_value = -1;
-     hid_t c_prp_id;
-     herr_t ret;
-     H5FD_mpio_xfer_t c_data_xfer_mode;
-
-     /*
-      * Call H5Pget_xfer function.
-      */
-     c_prp_id = *prp_id;
-     ret = H5Pget_dxpl_mpio(c_prp_id, &c_data_xfer_mode);
-     if (ret < 0) return ret_value;
-     *data_xfer_mode = (int_f)c_data_xfer_mode;
-/*
-     switch (c_data_xfer_mode) {
-
-        case H5FD_MPIO_INDEPENDENT:
-             *data_xfer_mode = H5FD_MPIO_INDEPENDENT_F;
-             break;
-
-        case H5FD_MPIO_COLLECTIVE:
-             *data_xfer_mode = H5FD_MPIO_COLLECTIVE_F;
-             break;
-
-        default:
-          return ret_value;
-      }
-*/
-     ret_value = 0;
-     return ret_value;
-}
-
-/****if* H5Pf/h5pget_mpio_actual_io_mode_c
- * NAME
- *  h5pget_mpio_actual_io_mode_c
- * PURPOSE
- *  Calls H5Pget_mpio_actual_io_mode
- *
- * INPUTS
- *  dxpl_id        - Dataset transfer property list identifier.
- * OUTPUTS
- *  actual_io_mode - The type of I/O performed by this process.
- *
- * RETURNS
- *  0 on success, -1 on failure
- * AUTHOR
- *  M. Scot Breitenfeld
- *  July 27, 2012
- * SOURCE
-*/
-int_f
-nh5pget_mpio_actual_io_mode_c(hid_t_f *dxpl_id, int_f *actual_io_mode)
-/******/
-{
-  int ret_value = -1;
-  H5D_mpio_actual_io_mode_t c_actual_io_mode;
-
-  /*
-   * Call H5Pget_mpio_actual_io_mode_f function.
-   */
-  if( (H5Pget_mpio_actual_io_mode((hid_t)*dxpl_id, &c_actual_io_mode)) <0 )
-    return ret_value; /* error occurred */
-
-  *actual_io_mode =(int_f)c_actual_io_mode;
-
-  ret_value = 0;
-  return ret_value;
-}
diff --git a/fortran/src/H5FDmpioff.f90 b/fortran/src/H5FDmpioff.f90
deleted file mode 100644
index 50a77d9..0000000
--- a/fortran/src/H5FDmpioff.f90
+++ /dev/null
@@ -1,212 +0,0 @@
-!****h* ROBODoc/H5FDMPIO
-!
-! NAME
-!  MODULE H5FDMPIO
-!
-! PURPOSE
-!  This file contains Fortran interfaces for H5P functions needed by
-!  parallel MPI programs.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5P function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5FDMPIO
-  USE H5GLOBAL
-CONTAINS
-
-!****s* H5FDMPIO/h5pset_fapl_mpio_f
-!
-! NAME
-!  h5pset_fapl_mpio_f
-!
-! PURPOSE
-!  Stores MPI IO communicator information to the file
-!  access property list.
-!
-! INPUTS
-!  prp_id 	 - file access property list identifier
-!  comm 	 - MPI-2 communicator
-!  info 	 - MPI-2 info object
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  November, 2000
-!
-! SOURCE
-  SUBROUTINE h5pset_fapl_mpio_f(prp_id, comm, info, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
-    INTEGER, INTENT(IN) :: comm ! MPI communicator to be used for file open
-                                ! as defined in MPI_FILE_OPEN of MPI-2
-    INTEGER, INTENT(IN) :: info ! MPI info object to be used for file open
-                                ! as defined in MPI_FILE_OPEN of MPI-2
-    INTEGER, INTENT(OUT) :: hdferr ! Error code
-!*****
-    INTEGER, EXTERNAL :: h5pset_fapl_mpio_c
-    hdferr = h5pset_fapl_mpio_c(prp_id, comm, info)
-  END SUBROUTINE h5pset_fapl_mpio_f
-
-!****s* H5FDMPIO/h5pget_fapl_mpio_f
-!
-! NAME
-!  h5pget_fapl_mpio_f
-!
-! PURPOSE
-!  Returns MPI communicator information.
-!
-! INPUTS
-!  prp_id 	 - file access property list identifier
-! OUTPUTS
-!  comm 	 - MPI-2 communicator
-!  info 	 - MPI-2 info object
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  November, 2000
-!
-! SOURCE
-  SUBROUTINE h5pget_fapl_mpio_f(prp_id, comm, info, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
-    INTEGER, INTENT(OUT) :: comm ! buffer to return communicator
-    INTEGER, INTENT(OUT) :: info ! buffer to return info object
-                                 ! as defined in MPI_FILE_OPEN of MPI-2
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code
-!*****
-    INTEGER, EXTERNAL :: h5pget_fapl_mpio_c
-    hdferr = h5pget_fapl_mpio_c(prp_id, comm, info)
-  END SUBROUTINE h5pget_fapl_mpio_f
-
-!****s* H5FDMPIO/h5pset_dxpl_mpio_f
-!
-! NAME
-!  h5pset_dxpl_mpio_f
-!
-! PURPOSE
-!  Sets data transfer mode.
-!
-! INPUTS
-!  prp_id 	  - data transfer property list identifier
-!  data_xfer_mode - transfer mode; possible values are:
-!                     H5FD_MPIO_INDEPENDENT_F
-!                     H5FD_MPIO_COLLECTIVE_F
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  November, 2000
-!
-! SOURCE
-  SUBROUTINE h5pset_dxpl_mpio_f(prp_id, data_xfer_mode, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    INTEGER, INTENT(IN) :: data_xfer_mode ! Data transfer mode. Possible values are:
-                                          ! H5FD_MPIO_INDEPENDENT_F
-                                          ! H5FD_MPIO_COLLECTIVE_F
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTEGER, EXTERNAL :: h5pset_dxpl_mpio_c
-    hdferr = h5pset_dxpl_mpio_c(prp_id, data_xfer_mode)
-  END SUBROUTINE h5pset_dxpl_mpio_f
-
-!****s* H5FDMPIO/h5pget_dxpl_mpio_f
-!
-! NAME
-!  h5pget_dxpl_mpio_f
-!
-! PURPOSE
-!  Returns the data transfer mode.
-!
-! INPUTS
-!  prp_id 	 - data transfer property list identifier
-! OUTPUTS
-!  data_xfer_mode- transfer mode; possible values are:
-!                     H5FD_MPIO_INDEPENDENT_F
-!                     H5FD_MPIO_COLLECTIVE_F
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  November, 2000
-!
-! SOURCE
-  SUBROUTINE h5pget_dxpl_mpio_f(prp_id, data_xfer_mode, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id   ! Property list identifier
-    INTEGER, INTENT(OUT) :: data_xfer_mode ! Data transfer mode. Possible values are:
-                                           ! H5FD_MPIO_INDEPENDENT_F
-                                           ! H5FD_MPIO_COLLECTIVE_F
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-    INTEGER, EXTERNAL :: h5pget_dxpl_mpio_c
-    hdferr = h5pget_dxpl_mpio_c(prp_id, data_xfer_mode)
-  END SUBROUTINE h5pget_dxpl_mpio_f
-
-!****s* H5P/h5pget_mpio_actual_io_mode_f
-! NAME
-!  h5pget_mpio_actual_io_mode_f
-!
-! PURPOSE
-!  Retrieves the type of I/O that HDF5 actually performed on the last 
-!  parallel I/O call. This is not necessarily the type of I/O requested. 
-!
-! INPUTS
-!  dxpl_id        - Dataset transfer property list identifier.
-! OUTPUTS
-!  actual_io_mode - The type of I/O performed by this process.
-!  hdferr         - Returns 0 if successful and -1 if fails.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  July 27, 2012
-!
-! HISTORY
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pget_mpio_actual_io_mode_f(dxpl_id, actual_io_mode, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN)  :: dxpl_id
-    INTEGER       , INTENT(OUT) :: actual_io_mode
-    INTEGER       , INTENT(OUT) :: hdferr
-!***** 
-    INTERFACE
-       INTEGER FUNCTION h5pget_mpio_actual_io_mode_c(dxpl_id, actual_io_mode)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_MPIO_ACTUAL_IO_MODE_C'::h5pget_mpio_actual_io_mode_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN)  :: dxpl_id
-         INTEGER       , INTENT(OUT) :: actual_io_mode
-       END FUNCTION h5pget_mpio_actual_io_mode_c
-    END INTERFACE
-
-    actual_io_mode = -1
-
-    hdferr = h5pget_mpio_actual_io_mode_c(dxpl_id, actual_io_mode)
-
-  END SUBROUTINE h5pget_mpio_actual_io_mode_f
-
-END MODULE H5FDMPIO
diff --git a/fortran/src/H5Ff.c b/fortran/src/H5Ff.c
index 1696672..c1cdb91 100644
--- a/fortran/src/H5Ff.c
+++ b/fortran/src/H5Ff.c
@@ -1,6 +1,6 @@
 /****h* H5Ff/H5Ff
  * PURPOSE
- *   This file contains C stubs for H5F Fortran APIs
+ *  This file contains C stubs for H5F Fortran APIs
  *
  * COPYRIGHT
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -26,26 +26,26 @@
 
 /****if* H5Ff/h5fcreate_c
  * NAME
- *        h5fcreate_c
+ *  h5fcreate_c
  * PURPOSE
- *     Call H5Fcreate to create the file
+ *  Call H5Fcreate to create the file
  * INPUTS
- *      name - name of the file
- *              namelen - name length
- *              access_flags - file access  flags
- *              crt_pr  - identifier of creation property list
- *              acc_prp - identifier of access property list
+ *  name - name of the file
+ *  namelen - name length
+ *  access_flags - file access  flags
+ *  crt_pr  - identifier of creation property list
+ *  acc_prp - identifier of access property list
  * OUTPUTS
- *     file_id - file identifier
+ *  file_id - file identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, July 26, 1999
+ *  Monday, July 26, 1999
  * SOURCE
 */
 int_f
-nh5fcreate_c(_fcd name, int_f *namelen, int_f *access_flags, hid_t_f* crt_prp, hid_t_f *acc_prp, hid_t_f *file_id)
+h5fcreate_c(_fcd name, int_f *namelen, int_f *access_flags, hid_t_f* crt_prp, hid_t_f *acc_prp, hid_t_f *file_id)
 /******/
 {
      int ret_value = -1;
@@ -95,23 +95,23 @@ nh5fcreate_c(_fcd name, int_f *namelen, int_f *access_flags, hid_t_f* crt_prp, h
 
 /****if* H5Ff/h5fflush_c
  * NAME
- *        h5fflush_c
+ *  h5fflush_c
  * PURPOSE
- *     Call H5Fflush to flush the object
+ *  Call H5Fflush to flush the object
  * INPUTS
- *      object_id - identifier of either a file, a dataset,
- *                          a group, an attribute or a named data type
- *              scope - integer to specify the flushing action, either
+ *  object_id - identifier of either a file, a dataset,
+ *  a group, an attribute or a named data type
+ *  scope - integer to specify the flushing action, either
  *                      H5F_SCOPE_GLOBAL or H5F_SCOPE_LOCAL
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, November 5, 1999
+ *  Friday, November 5, 1999
  * SOURCE
 */
 int_f
-nh5fflush_c (hid_t_f *object_id, int_f *scope)
+h5fflush_c (hid_t_f *object_id, int_f *scope)
 /******/
 {
      int ret_value = -1;
@@ -136,24 +136,24 @@ nh5fflush_c (hid_t_f *object_id, int_f *scope)
 
 /****if* H5Ff/h5fmount_c
  * NAME
- *        h5fmount_c
+ *  h5fmount_c
  * PURPOSE
- *     Call H5Fmount to mount the file
+ *  Call H5Fmount to mount the file
  * INPUTS
- *      loc_id - Identifier for file or group
- *              dsetname - name of dataset
- *              namelen - dsetname length
- *              file_id - file identifier for the file to be mounted
- *              acc_prp - identifier of access property list
+ *  loc_id - Identifier for file or group
+ *  dsetname - name of dataset
+ *  namelen - dsetname length
+ *  file_id - file identifier for the file to be mounted
+ *  acc_prp - identifier of access property list
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Monday, October 25, 1999
+ *  Monday, October 25, 1999
  * HISTORY
 */
 int_f
-nh5fmount_c (hid_t_f *loc_id, _fcd dsetname, int_f *namelen, hid_t_f *file_id, hid_t_f *acc_prp)
+h5fmount_c (hid_t_f *loc_id, _fcd dsetname, int_f *namelen, hid_t_f *file_id, hid_t_f *acc_prp)
 /******/
 {
      int ret_value = -1;
@@ -194,22 +194,22 @@ nh5fmount_c (hid_t_f *loc_id, _fcd dsetname, int_f *namelen, hid_t_f *file_id, h
 
 /****if* H5Ff/h5funmount_c
  * NAME
- *        h5funmount_c
+ *  h5funmount_c
  * PURPOSE
- *     Call H5Funmount to unmount the file
+ *  Call H5Funmount to unmount the file
  * INPUTS
- *      loc_id - Identifier for file or group
- *              dsetname - name of dataset
- *              namelen - dsetname length
+ *  loc_id - Identifier for file or group
+ *  dsetname - name of dataset
+ *  namelen - dsetname length
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Monday, October 25, 1999
+ *  Monday, October 25, 1999
  * SOURCE
 */
 int_f
-nh5funmount_c (hid_t_f *loc_id, _fcd dsetname, int_f *namelen)
+h5funmount_c (hid_t_f *loc_id, _fcd dsetname, int_f *namelen)
 /******/
 {
      int ret_value = -1;
@@ -242,25 +242,25 @@ nh5funmount_c (hid_t_f *loc_id, _fcd dsetname, int_f *namelen)
 
 /****if* H5Ff/h5fopen_c
  * NAME
- *        h5fopen_c
+ *  h5fopen_c
  * PURPOSE
- *     Call H5Fopen to open the file
+ *  Call H5Fopen to open the file
  * INPUTS
- *      name - name of the file
- *              namelen - name length
- *              access_flags - file access  flags
- *              acc_prp - identifier of access property list
+ *  name - name of the file
+ *  namelen - name length
+ *  access_flags - file access  flags
+ *  acc_prp - identifier of access property list
  * OUTPUTS
- *     file_id - file identifier
+ *  file_id - file identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Tuesday, August 3, 1999
+ *  Tuesday, August 3, 1999
  * SOURCE
 */
 int_f
-nh5fopen_c (_fcd name, int_f *namelen, int_f *access_flags, hid_t_f *acc_prp, hid_t_f *file_id)
+h5fopen_c (_fcd name, int_f *namelen, int_f *access_flags, hid_t_f *acc_prp, hid_t_f *file_id)
 /******/
 {
      int ret_value = -1;
@@ -305,22 +305,22 @@ nh5fopen_c (_fcd name, int_f *namelen, int_f *access_flags, hid_t_f *acc_prp, hi
 
 /****if* H5Ff/h5freopen_c
  * NAME
- *        h5freopen_c
+ *  h5freopen_c
  * PURPOSE
- *     Call H5Freopen to open the file
+ *  Call H5Freopen to open the file
  * INPUTS
- *      file_id1 - file identifier
+ *  file_id1 - file identifier
  * OUTPUTS
- *     file_id2 - file identifier
+ *  file_id2 - file identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Wednesday, November 3, 1999
+ *  Wednesday, November 3, 1999
  * SOURCE
 */
 int_f
-nh5freopen_c (hid_t_f *file_id1, hid_t_f *file_id2)
+h5freopen_c (hid_t_f *file_id1, hid_t_f *file_id2)
 /******/
 {
      int ret_value = -1;
@@ -338,22 +338,22 @@ nh5freopen_c (hid_t_f *file_id1, hid_t_f *file_id2)
 
 /****if* H5Ff/h5fget_create_plist_c
  * NAME
- *        h5fget_create_plist_c
+ *  h5fget_create_plist_c
  * PURPOSE
- *     Call H5Fget_create_plist to get the file creation property list
+ *  Call H5Fget_create_plist to get the file creation property list
  * INPUTS
- *      file_id - file identifier
+ *  file_id - file identifier
  * OUTPUTS
- *     prop_id - creation property list identifier
+ *  prop_id - creation property list identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal, Xiangyang Su
- *              Wednesday, November 3, 1999
+ *  Wednesday, November 3, 1999
  * SOURCE
 */
 int_f
-nh5fget_create_plist_c (hid_t_f *file_id, hid_t_f *prop_id)
+h5fget_create_plist_c (hid_t_f *file_id, hid_t_f *prop_id)
 /******/
 {
      int ret_value = -1;
@@ -371,24 +371,24 @@ nh5fget_create_plist_c (hid_t_f *file_id, hid_t_f *prop_id)
 
 /****if* H5Ff/h5fget_access_plist_c
  * NAME
- *        h5fget_access_plist_c
+ *  h5fget_access_plist_c
  * PURPOSE
- *     Call H5Fget_access_plist to get the file access property list
+ *  Call H5Fget_access_plist to get the file access property list
  * INPUTS
- *      file_id - file identifier
+ *  file_id - file identifier
  * OUTPUTS
- *     access_id - access property list identifier
+ *  access_id - access property list identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, September 30, 2002
+ *  Monday, September 30, 2002
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5fget_access_plist_c (hid_t_f *file_id, hid_t_f *access_id)
+h5fget_access_plist_c (hid_t_f *file_id, hid_t_f *access_id)
 /******/
 {
      int ret_value = -1;
@@ -406,26 +406,26 @@ nh5fget_access_plist_c (hid_t_f *file_id, hid_t_f *access_id)
 
 /****if* H5Ff/h5fis_hdf5_c
  * NAME
- *        h5fis_hdf5_c
+ *  h5fis_hdf5_c
  * PURPOSE
- *     Call H5Fis_hdf5 to determone if the file is an HDF5 file
+ *  Call H5Fis_hdf5 to determone if the file is an HDF5 file
  * INPUTS
- *      name - name of the file
- *              namelen - name length
+ *  name - name of the file
+ *  namelen - name length
  * OUTPUTS
- *     flag - 0 if file is not HDF5 file , positive if a file
- *                     is an HDF5 file, and negative on failure.
+ *  flag - 0 if file is not HDF5 file , positive if a file
+ *  is an HDF5 file, and negative on failure.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Tuesday, August 3, 1999
+ *  Tuesday, August 3, 1999
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5fis_hdf5_c (_fcd name, int_f *namelen, int_f *flag)
+h5fis_hdf5_c (_fcd name, int_f *namelen, int_f *flag)
 /******/
 {
      int ret_value = -1;
@@ -452,23 +452,23 @@ nh5fis_hdf5_c (_fcd name, int_f *namelen, int_f *flag)
 }
 /****if* H5Ff/h5fclose_c
  * NAME
- *        h5fclose_c
+ *  h5fclose_c
  * PURPOSE
- *     Call H5Fclose to close the file
+ *  Call H5Fclose to close the file
  * INPUTS
- *      file_id - identifier of the file to be closed
+ *  file_id - identifier of the file to be closed
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, July 26, 1999
+ *  Monday, July 26, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5fclose_c ( hid_t_f *file_id )
+h5fclose_c ( hid_t_f *file_id )
 /******/
 {
   int ret_value = 0;
@@ -480,27 +480,27 @@ nh5fclose_c ( hid_t_f *file_id )
 }
 /****if* H5Ff/h5fget_obj_count_c
  * NAME
- *        h5fget_obj_count_c
+ *  h5fget_obj_count_c
  * PURPOSE
- *     Call H5Fget_obj_count to get number of open objects within a file
+ *  Call H5Fget_obj_count to get number of open objects within a file
  * INPUTS
- *      file_id - identifier of the file to be closed
- *              obj_type - type of the object
+ *  file_id - identifier of the file to be closed
+ *  obj_type - type of the object
  * RETURNS
- *     obj_count - number of objects
- *              0 on success, -1 on failure
+ *  obj_count - number of objects
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, September 30, 2002
+ *  Monday, September 30, 2002
  * HISTORY
  *
- *              Changed type of obj_count to size_t_f
- *              Thursday, September 25, 2008
+ *  Changed type of obj_count to size_t_f
+ *  Thursday, September 25, 2008
  * SOURCE
 */
 
 int_f
-nh5fget_obj_count_c ( hid_t_f *file_id , int_f *obj_type, size_t_f * obj_count)
+h5fget_obj_count_c ( hid_t_f *file_id , int_f *obj_type, size_t_f * obj_count)
 /******/
 {
   int ret_value = 0;
@@ -525,7 +525,7 @@ nh5fget_obj_count_c ( hid_t_f *file_id , int_f *obj_type, size_t_f * obj_count)
  *  obj_type - type of the object
  * RETURNS
  *  obj_ids  - iarray of open objects identifiers
- *              0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
  *  Monday, September 30, 2002
@@ -538,7 +538,7 @@ nh5fget_obj_count_c ( hid_t_f *file_id , int_f *obj_type, size_t_f * obj_count)
  * SOURCE
 */
 int_f
-nh5fget_obj_ids_c ( hid_t_f *file_id , int_f *obj_type, size_t_f *max_objs, 
+h5fget_obj_ids_c ( hid_t_f *file_id , int_f *obj_type, size_t_f *max_objs, 
     hid_t_f *obj_ids, size_t_f *num_objs)
 /******/
 {
@@ -569,22 +569,22 @@ nh5fget_obj_ids_c ( hid_t_f *file_id , int_f *obj_type, size_t_f *max_objs,
 
 /****if* H5Ff/h5fget_freespace_c
  * NAME
- *        h5fget_freespace_c
+ *  h5fget_freespace_c
  * PURPOSE
- *     Call H5Fget_freespace to get amount of free space within a file
+ *  Call H5Fget_freespace to get amount of free space within a file
  * INPUTS
- *      file_id - identifier of the file to query
+ *  file_id - identifier of the file to query
  * RETURNS
- *     free_space  - amount of free space in file
- *              0 on success, -1 on failure
+ *  free_space  - amount of free space in file
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Quincey Koziol
- *              Tuesday, October 7, 2003
+ *  Tuesday, October 7, 2003
  * SOURCE
 */
 
 int_f
-nh5fget_freespace_c ( hid_t_f *file_id , hssize_t_f *free_space)
+h5fget_freespace_c ( hid_t_f *file_id , hssize_t_f *free_space)
 /******/
 {
   int ret_value = 0;
@@ -599,24 +599,24 @@ nh5fget_freespace_c ( hid_t_f *file_id , hssize_t_f *free_space)
 
 /****if* H5Ff/h5fget_name_c
  * NAME
- *        h5fget_name_c
+ *  h5fget_name_c
  * PURPOSE
- *     Call H5Fget_name to get file's name
+ *  Call H5Fget_name to get file's name
  * INPUTS
- *      obj_id - object identifier
- *              buflen -size of the buffer
+ *  obj_id - object identifier
+ *  buflen -size of the buffer
  * OUTPUTS
- *     buf - buffer to hold the name
- *              size - size of the file's name
+ *  buf - buffer to hold the name
+ *  size - size of the file's name
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Tuesday, July 6, 2004
+ *  Tuesday, July 6, 2004
  * SOURCE
 */
 int_f
-nh5fget_name_c(hid_t_f *obj_id, size_t_f *size, _fcd buf, size_t_f *buflen)
+h5fget_name_c(hid_t_f *obj_id, size_t_f *size, _fcd buf, size_t_f *buflen)
 /******/
 {
     char *c_buf = NULL;           /* Buffer to hold C string */
@@ -648,22 +648,22 @@ done:
 
 /****if* H5Ff/h5fget_filesize_c
  * NAME
- *        h5fget_filesize_c
+ *  h5fget_filesize_c
  * PURPOSE
- *     Call H5Fget_filesize to get file size
+ *  Call H5Fget_filesize to get file size
  * INPUTS
- *      file_id - file identifier
+ *  file_id - file identifier
  * OUTPUTS
- *     size - size of the file
+ *  size - size of the file
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, July 7, 2004
+ *  Wednesday, July 7, 2004
  * SOURCE
 */
 int_f
-nh5fget_filesize_c(hid_t_f *file_id, hsize_t_f *size)
+h5fget_filesize_c(hid_t_f *file_id, hsize_t_f *size)
 /******/
 {
     hsize_t size_c;
diff --git a/fortran/src/H5Fff.F90 b/fortran/src/H5Fff.F90
new file mode 100644
index 0000000..c69ad82
--- /dev/null
+++ b/fortran/src/H5Fff.F90
@@ -0,0 +1,871 @@
+!****h* ROBODoc/H5F
+!
+! NAME
+!  MODULE H5F
+!
+! FILE
+!  H5Fff.f90
+!
+! PURPOSE
+!  This file contains Fortran interfaces for H5F functions.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! NOTES
+!       _____ __  __ _____   ____  _____ _______       _   _ _______
+!      |_   _|  \/  |  __ \ / __ \|  __ \__   __|/\   | \ | |__   __|
+! ****   | | | \  / | |__) | |  | | |__) | | |  /  \  |  \| |  | |    ****
+! ****   | | | |\/| |  ___/| |  | |  _  /  | | / /\ \ | . ` |  | |    ****
+! ****  _| |_| |  | | |    | |__| | | \ \  | |/ ____ \| |\  |  | |    ****
+!      |_____|_|  |_|_|     \____/|_|  \_\ |_/_/    \_\_| \_|  |_|
+!
+!  If you add a new H5F function you must add the function name to the
+!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
+!  This is needed for Windows based operating systems.
+!
+!*****
+
+MODULE H5F
+  USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR, C_CHAR, C_NULL_PTR
+  USE H5GLOBAL
+  IMPLICIT NONE
+
+CONTAINS
+!****s* H5F/h5fcreate_f
+!
+! NAME
+!  h5fcreate_f
+!
+! PURPOSE
+!  Creates HDF5 files.
+!
+! INPUTS
+!  name 	 - name of the file to create
+!  access_flags  - File access flags. Allowable values are:
+!                   H5F_ACC_TRUNC_F
+!                   H5F_ACC_EXCL_F
+! OUTPUTS
+!  file_id 	 - file identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! OPTIONAL PARAMETERS
+!  creation_prp  - file creation property list identifier
+!  access_prp 	 - file access property list identifier
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! SOURCE
+  SUBROUTINE h5fcreate_f(name, access_flags, file_id, hdferr, &
+       creation_prp, access_prp)
+    IMPLICIT NONE
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the file
+    INTEGER, INTENT(IN) :: access_flags    ! File access flags
+    INTEGER(HID_T), INTENT(OUT) :: file_id ! File identifier
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: creation_prp
+                                           ! File creation propertly
+                                           ! list identifier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: access_prp
+                                           ! File access property list
+                                           ! identifier
+!*****
+    INTEGER(HID_T) :: creation_prp_default
+    INTEGER(HID_T) :: access_prp_default
+    INTEGER :: namelen ! Length of the name character string
+
+    INTERFACE
+       INTEGER FUNCTION h5fcreate_c(name, namelen, access_flags, &
+            creation_prp_default, access_prp_default, file_id) BIND(C,NAME='h5fcreate_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER, INTENT(IN) :: access_flags
+         INTEGER(HID_T), INTENT(OUT) :: file_id
+         INTEGER(HID_T), INTENT(IN) :: creation_prp_default
+         INTEGER(HID_T), INTENT(IN) :: access_prp_default
+         INTEGER :: namelen
+       END FUNCTION h5fcreate_c
+    END INTERFACE
+
+    creation_prp_default = H5P_DEFAULT_F
+    access_prp_default = H5P_DEFAULT_F
+
+    IF (PRESENT(creation_prp)) creation_prp_default = creation_prp
+    IF (PRESENT(access_prp))   access_prp_default   = access_prp
+    namelen = LEN_TRIM(name)
+    hdferr = h5fcreate_c(name, namelen, access_flags, &
+         creation_prp_default, access_prp_default, file_id)
+
+  END SUBROUTINE h5fcreate_f
+!****s* H5F/h5fflush_f
+!
+! NAME
+!  h5fflush_f
+!
+! PURPOSE
+!  Flushes all buffers associated WITH a file to disk
+!
+! INPUTS
+!  object_id 	 - identifier of object used to identify the file.
+!  scope 	 - specifies the scope of the flushing action.
+!                  Possible values are:
+!                    H5F_SCOPE_GLOBAL_F
+!                    H5F_SCOPE_LOCAL_F
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! OPTIONAL PARAMETERS
+!  creation_prp  - file creation property list identifier
+!  access_prp 	 - file access property list identifier
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! SOURCE
+  SUBROUTINE h5fflush_f(object_id, scope, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: object_id !identifier for any object
+                                            !associate with a file,
+                                            !including the file itself,
+                                            !a dataset, a group, an
+                                            !attribute, or a named
+                                            !data type
+
+    INTEGER, INTENT(IN) :: scope            !scope of the flushing
+                                            !action, possible values
+                                            !are: H5F_SCOPE_GLOBAL_F
+                                            ! which flushes the entire
+                                            !virtual file,
+                                            !and H5F_SCOPE_LOCAL_F
+                                            !which flushes only the
+                                            !specified file.
+
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5fflush_c(object_id, scope) BIND(C,NAME='h5fflush_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: object_id
+         INTEGER, INTENT(IN) :: scope
+       END FUNCTION h5fflush_c
+    END INTERFACE
+
+    hdferr = h5fflush_c(object_id, scope)
+
+  END SUBROUTINE h5fflush_f
+!****s* H5F/h5fmount_f
+!
+! NAME
+!  h5fmount_f
+!
+! PURPOSE
+!  Mounts a file.
+!
+! INPUTS
+!  loc_id 	 - the identifier for of file or group in
+!                  which name is defined
+!  name 	 - the name of the group onto which the file
+!                  specified by child_id is to be mounted.
+!  child_id 	 - the identifier of the file to be mounted.
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  access_prp 	 - the identifier of the property list to be used
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! SOURCE
+  SUBROUTINE h5fmount_f(loc_id, name, child_id, hdferr, access_prp)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id   ! Identifier for file or group
+                                           ! in which dsetname is defined
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the group
+    INTEGER(HID_T), INTENT(IN) :: child_id ! File identifier for the
+                                           ! file to be mounted
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: access_prp
+                                           ! File access property list
+                                           ! identifier
+!*****
+    INTEGER(HID_T) :: access_prp_default
+    INTEGER :: namelen ! Length of the name character string
+
+    INTERFACE
+       INTEGER FUNCTION h5fmount_c(loc_id, name, namelen, &
+            child_id, access_prp_default) BIND(C,NAME='h5fmount_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER(HID_T), INTENT(IN) :: child_id
+         INTEGER(HID_T), INTENT(IN) :: access_prp_default
+         INTEGER :: namelen
+       END FUNCTION h5fmount_c
+    END INTERFACE
+
+    access_prp_default = H5P_DEFAULT_F
+    IF (PRESENT(access_prp))   access_prp_default   = access_prp
+    namelen = LEN_TRIM(name)
+    hdferr = h5fmount_c(loc_id, name, namelen, child_id, access_prp_default)
+
+  END SUBROUTINE h5fmount_f
+
+!****s* H5F/h5funmount_f
+!
+! NAME
+!  h5funmount_f
+!
+! PURPOSE
+!  Unmounts a file.
+!
+! INPUTS
+!  loc_id 	 - the identifier for of file or group in
+!                  which name is defined
+!  name 	 - the name of the mount point
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! SOURCE
+  SUBROUTINE h5funmount_f(loc_id, name, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id   ! Identifier for file or group
+                                           ! at which the specified file
+                                           ! is to be unmounted
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the mount point
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!*****
+    INTEGER :: namelen ! Length of the name character string
+
+    INTERFACE
+       INTEGER FUNCTION h5funmount_c(loc_id, name, namelen) BIND(C,NAME='h5funmount_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER :: namelen
+       END FUNCTION h5funmount_c
+    END INTERFACE
+
+    namelen = LEN_TRIM(name)
+    hdferr = h5funmount_c(loc_id, name, namelen)
+
+  END SUBROUTINE h5funmount_f
+!****s* H5F/h5fopen_f
+!
+! NAME
+!  h5fopen_f
+!
+! PURPOSE
+!  Opens HDF5 file.
+!
+! INPUTS
+!  name 	 - name of the file to acecss
+!  access_flags  - File access flags. Allowable values are:
+!                   H5F_ACC_RDWR_F
+!                   H5F_ACC_RDONLY_F
+! OUTPUTS
+!  file_id 	 - file identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  access_prp 	 - file access property list identifier
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! SOURCE
+  SUBROUTINE h5fopen_f(name, access_flags, file_id, hdferr, access_prp)
+    IMPLICIT NONE
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the file
+    INTEGER, INTENT(IN) :: access_flags    ! File access flags
+    INTEGER(HID_T), INTENT(OUT) :: file_id ! File identifier
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: access_prp
+                                           ! File access property list
+                                           ! identifier
+!*****
+    INTEGER(HID_T) :: access_prp_default
+    INTEGER :: namelen ! Length of the name character string
+
+    INTERFACE
+       INTEGER FUNCTION h5fopen_c(name, namelen, access_flags, &
+            access_prp_default, file_id) BIND(C,NAME='h5fopen_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER :: namelen
+         INTEGER, INTENT(IN) :: access_flags
+         INTEGER(HID_T), INTENT(IN) :: access_prp_default
+         INTEGER(HID_T), INTENT(OUT) :: file_id
+       END FUNCTION h5fopen_c
+    END INTERFACE
+
+    access_prp_default = H5P_DEFAULT_F
+    IF (PRESENT(access_prp))   access_prp_default   = access_prp
+    namelen = LEN_TRIM(name)
+    hdferr = h5fopen_c(name, namelen, access_flags, &
+                               access_prp_default, file_id)
+  END SUBROUTINE h5fopen_f
+!****s* H5F/h5freopen_f
+!
+! NAME
+!  h5freopen_f
+!
+! PURPOSE
+!  Reopens HDF5 file.
+!
+! INPUTS
+!  file_id 	 - identifier of a file for which an
+!                  additional identifier is required
+! OUTPUTS
+!  ret_file_id 	 - new file identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! SOURCE
+  SUBROUTINE h5freopen_f(file_id, ret_file_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: file_id      ! File identifier
+    INTEGER(HID_T), INTENT(OUT) :: ret_file_id ! New File identifier
+    INTEGER, INTENT(OUT) :: hdferr             ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5freopen_c(file_id, ret_file_id) BIND(C,NAME='h5freopen_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: file_id
+         INTEGER(HID_T), INTENT(OUT) :: ret_file_id
+       END FUNCTION h5freopen_c
+    END INTERFACE
+
+    hdferr = h5freopen_c(file_id, ret_file_id)
+
+  END SUBROUTINE h5freopen_f
+!****s* H5F/h5fget_create_plist_f
+!
+! NAME
+!  h5fget_create_plist_f
+!
+! PURPOSE
+!  Returns a file creation property list identifier.
+!
+! INPUTS
+!  file_id 	 - identifier of a file to creation property list of
+! OUTPUTS
+!  prop_id 	 - creation property list identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! SOURCE
+  SUBROUTINE h5fget_create_plist_f(file_id, prop_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: file_id    ! File identifier
+    INTEGER(HID_T), INTENT(OUT) :: prop_id   ! File creation property
+                                             ! list identifier
+    INTEGER, INTENT(OUT) :: hdferr           ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5fget_create_plist_c(file_id, prop_id) BIND(C,NAME='h5fget_create_plist_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: file_id
+         INTEGER(HID_T), INTENT(OUT) :: prop_id
+       END FUNCTION h5fget_create_plist_c
+    END INTERFACE
+
+    hdferr = h5fget_create_plist_c(file_id, prop_id)
+
+  END SUBROUTINE h5fget_create_plist_f
+!****s* H5F/h5fget_access_plist_f
+!
+! NAME
+!  h5fget_access_plist_f
+!
+! PURPOSE
+!  Returns a file access property list identifier.
+!
+! INPUTS
+!  file_id 	 - identifier of a file to creation property list of
+! OUTPUTS
+!  access_id 	 - access property list identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! SOURCE
+  SUBROUTINE h5fget_access_plist_f(file_id, access_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: file_id      ! File identifier
+    INTEGER(HID_T), INTENT(OUT) :: access_id   ! File access property
+                                               ! list identifier
+    INTEGER, INTENT(OUT) :: hdferr             ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5fget_access_plist_c(file_id, access_id) BIND(C,NAME='h5fget_access_plist_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: file_id
+         INTEGER(HID_T), INTENT(OUT) :: access_id
+       END FUNCTION h5fget_access_plist_c
+    END INTERFACE
+
+    hdferr = h5fget_access_plist_c(file_id, access_id)
+
+  END SUBROUTINE h5fget_access_plist_f
+
+!****s* H5F/h5fis_hdf5_f
+!
+! NAME
+!  h5fis_hdf5_f
+!
+! PURPOSE
+!  Determines whether a file is in the HDF5 format.
+!
+! INPUTS
+!  name 	 - name of the file to check
+! OUTPUTS
+!  status 	 - indicates if file is and HDF5 file
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! SOURCE
+  SUBROUTINE h5fis_hdf5_f(name, status, hdferr)
+    IMPLICIT NONE
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the file
+    LOGICAL, INTENT(OUT) :: status         ! Indicates if file
+                                           ! is an HDF5 file
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!*****
+    INTEGER :: namelen ! Length of the name character string
+    INTEGER :: flag    ! "TRUE/FALSE" flag from C routine
+                       ! to define status value.
+
+    INTERFACE
+       INTEGER FUNCTION h5fis_hdf5_c(name, namelen, flag) BIND(C,NAME='h5fis_hdf5_c')
+         IMPORT :: C_CHAR
+         IMPLICIT NONE
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER :: namelen
+         INTEGER :: flag
+       END FUNCTION h5fis_hdf5_c
+    END INTERFACE
+
+    namelen = LEN_TRIM(name)
+    hdferr = h5fis_hdf5_c(name, namelen, flag)
+    status = .TRUE.
+    IF (flag .EQ. 0) status = .FALSE.
+
+  END SUBROUTINE h5fis_hdf5_f
+!****s* H5F/h5fclose_f
+!
+! NAME
+!  h5fclose_f
+!
+! PURPOSE
+!  Closes HDF5 file.
+!
+! INPUTS
+!  file_id 	 - file identifier
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! SOURCE
+  SUBROUTINE h5fclose_f(file_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: file_id ! File identifier
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5fclose_c(file_id) BIND(C,NAME='h5fclose_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: file_id
+       END FUNCTION h5fclose_c
+    END INTERFACE
+
+    hdferr = h5fclose_c(file_id)
+
+  END SUBROUTINE h5fclose_f
+
+!****s* H5F/h5fget_obj_count_f
+!
+! NAME
+!  h5fget_obj_count_f
+!
+! PURPOSE
+!  Gets number of the objects open within a file
+!
+! INPUTS
+!  file_id 	 - file identifier
+!  obj_type 	 - type of the object; possible values are:
+!                    H5F_OBJ_FILE_F
+!                    H5F_OBJ_DATASET_F
+!                    H5F_OBJ_GROUP_F
+!                    H5F_OBJ_DATATYPE_F
+!                    H5F_OBJ_ALL_F
+! OUTPUTS
+!  obj_count 	 - number of open objects
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  September 30, 2002
+!
+! HISTORY
+!  Changed the type of obj_count to INTEGER(SIZE_T)
+!  September 25, 2008 EIP
+!
+! SOURCE
+  SUBROUTINE h5fget_obj_count_f(file_id, obj_type, obj_count, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: file_id
+    INTEGER, INTENT(IN)  :: obj_type
+    INTEGER(SIZE_T), INTENT(OUT) :: obj_count
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5fget_obj_count_c(file_id, obj_type, obj_count) BIND(C,NAME='h5fget_obj_count_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: file_id
+         INTEGER, INTENT(IN)  :: obj_type
+         INTEGER(SIZE_T), INTENT(OUT) :: obj_count
+       END FUNCTION h5fget_obj_count_c
+    END INTERFACE
+
+    hdferr = h5fget_obj_count_c(file_id, obj_type, obj_count)
+
+  END SUBROUTINE h5fget_obj_count_f
+
+!****s* H5F/h5fget_obj_ids_f
+!
+! NAME
+!  h5fget_obj_ids_f
+!
+! PURPOSE
+!  Get list of open objects identifiers within a file
+!
+! INPUTS
+!  file_id 	 - file identifier
+!  obj_type 	 - type of the object; possible values are:
+!                    H5F_OBJ_FILE_F
+!                    H5F_OBJ_DATASET_F
+!                    H5F_OBJ_GROUP_F
+!                    H5F_OBJ_DATATYPE_F
+!                    H5F_OBJ_ALL_F
+! OUTPUTS
+!  obj_ids 	 - array of open object identifiers
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! OPTIONAL PARAMETERS
+!  num_objs 	 - number of open objects
+!
+! AUTHOR
+!  Elena Pourmal
+!  September 30, 2002
+!
+! HISTORY
+!  Added optional parameter num_objs for number of open objects
+!  of the specified type and changed type of max_obj to
+!  INTEGER(SIZE_T)
+!  September 25, 2008 EIP
+!
+! SOURCE
+  SUBROUTINE h5fget_obj_ids_f(file_id, obj_type, max_objs, obj_ids, hdferr, num_objs)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: file_id      ! File identifier
+    INTEGER, INTENT(IN)  :: obj_type           ! Object type
+    INTEGER(SIZE_T), INTENT(IN)  :: max_objs   ! Maximum # of objects to retrieve
+    INTEGER(HID_T), DIMENSION(*), INTENT(INOUT) :: obj_ids
+                                               ! Array of open objects iidentifiers
+    INTEGER, INTENT(OUT) :: hdferr             ! Error code
+    INTEGER(SIZE_T), INTENT(OUT), OPTIONAL :: num_objs ! number of open objects
+!*****
+    INTEGER(SIZE_T) :: c_num_objs ! Number of open objects of the specified type
+
+    INTERFACE
+       INTEGER FUNCTION h5fget_obj_ids_c(file_id, obj_type, max_objs, obj_ids, c_num_objs) &
+            BIND(C,NAME='h5fget_obj_ids_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: file_id
+         INTEGER, INTENT(IN)  :: obj_type
+         INTEGER(SIZE_T), INTENT(IN)  :: max_objs
+         INTEGER(HID_T), DIMENSION(*), INTENT(INOUT) :: obj_ids
+         INTEGER(SIZE_T), INTENT(OUT) :: c_num_objs
+       END FUNCTION h5fget_obj_ids_c
+    END INTERFACE
+
+    hdferr = h5fget_obj_ids_c(file_id, obj_type, max_objs, obj_ids, c_num_objs)
+    IF (PRESENT(num_objs)) num_objs= c_num_objs
+
+  END SUBROUTINE h5fget_obj_ids_f
+!****s* H5F/h5fget_freespace_f
+!
+! NAME
+!  h5fget_freespace_f
+!
+! PURPOSE
+!  Get amount of free space within a file
+!
+! INPUTS
+!  file_id 	 - file identifier
+! OUTPUTS
+!  free_space 	 - amount of free space in file
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Quincey Koziol
+!  October 7, 2003
+!
+! SOURCE
+  SUBROUTINE h5fget_freespace_f(file_id, free_space, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: file_id ! File identifier
+    INTEGER(HSSIZE_T), INTENT(OUT) :: free_space
+                                          ! amount of free space in file
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5fget_freespace_c(file_id, free_space) &
+            BIND(C,NAME='h5fget_freespace_c')
+         IMPORT :: HID_T, HSSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: file_id
+         INTEGER(HSSIZE_T), INTENT(OUT) :: free_space
+       END FUNCTION h5fget_freespace_c
+    END INTERFACE
+
+    hdferr = h5fget_freespace_c(file_id, free_space)
+
+  END SUBROUTINE h5fget_freespace_f
+!****s* H5F/h5fget_name_f
+!
+! NAME
+!  h5fget_name_f
+!
+! PURPOSE
+!  Gets the name of the file from the object identifier
+!
+! INPUTS
+!  obj_id 	 - object identifier
+! OUTPUTS
+!  buf 	         - buffer to store the read name
+!  size 	 - actual size of the name
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  July 6, 2004
+!
+! SOURCE
+  SUBROUTINE h5fget_name_f(obj_id, buf, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: obj_id   ! Object identifier
+    CHARACTER(LEN=*), INTENT(INOUT) :: buf
+                                           ! Buffer to hold file name
+    INTEGER(SIZE_T), INTENT(OUT) :: size   ! Size of the file name
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code: 0 on success,
+                                           !   	 -1 if fail
+!*****
+    INTEGER(SIZE_T) :: buflen
+
+    INTERFACE
+       INTEGER FUNCTION h5fget_name_c(obj_id, size, buf, buflen) &
+            BIND(C,NAME='h5fget_name_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: obj_id
+         INTEGER(SIZE_T), INTENT(OUT) :: size
+         INTEGER(SIZE_T) :: buflen
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: buf
+       END FUNCTION h5fget_name_c
+    END INTERFACE
+    buflen = LEN_TRIM(buf)
+    hdferr = h5fget_name_c(obj_id, size, buf, buflen)
+  END SUBROUTINE h5fget_name_f
+!****s* H5F/h5fget_filesize_f
+!
+! NAME
+!  h5fget_filesize_f
+!
+! PURPOSE
+!  Retrieves the file size of the HDF5 file.
+!
+! INPUTS
+!  file_id 	 - file identifier
+! OUTPUTS
+!  size 	 - file size
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  July 7, 2004
+!
+! SOURCE
+  SUBROUTINE h5fget_filesize_f(file_id, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: file_id  ! file identifier
+    INTEGER(HSIZE_T), INTENT(OUT) :: size  ! Size of the file
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code: 0 on success,
+                                           !   	 -1 if fail
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5fget_filesize_c(file_id, size) &
+            BIND(C,NAME='h5fget_filesize_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: file_id
+         INTEGER(HSIZE_T), INTENT(OUT) :: size
+       END FUNCTION h5fget_filesize_c
+    END INTERFACE
+    hdferr = h5fget_filesize_c(file_id, size)
+  END SUBROUTINE h5fget_filesize_f
+
+!****s* H5F (F03)/h5fget_file_image_f_F03
+!
+! NAME
+!  h5fget_file_image_f
+!
+! PURPOSE
+!  Retrieves a copy of the image of an existing, open file. 
+!
+! INPUTS
+!  file_id    - Target file identifier.
+!  buf_ptr    - Pointer to the buffer into which the image of the HDF5 file is to be copied.
+!  buf_len    - Size of the supplied buffer.
+!
+! OUTPUTS
+!  hdferr     - error code:
+!                 0 on success and -1 on failure
+! OPTIONAL PARAMETERS  
+!  buf_size   - Returns the size in bytes of the buffer required to store the file image,
+!               no data will be copied.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  November 26, 2012
+!
+! Fortran2003 Interface:
+  SUBROUTINE h5fget_file_image_f(file_id, buf_ptr, buf_len, hdferr, buf_size)
+    IMPLICIT NONE
+    INTEGER(HID_T) , INTENT(IN)              :: file_id
+    TYPE(C_PTR)    , INTENT(INOUT)           :: buf_ptr
+    INTEGER(SIZE_T), INTENT(IN)              :: buf_len
+    INTEGER        , INTENT(OUT)             :: hdferr
+    INTEGER(SIZE_T), INTENT(OUT)  , OPTIONAL :: buf_size
+!*****
+
+    INTEGER(SIZE_T) :: buf_size_default
+
+    INTERFACE
+       INTEGER FUNCTION h5fget_file_image_c(file_id, buf_ptr, buf_len, buf_size) BIND(C, NAME='h5fget_file_image_c')
+         IMPORT :: C_PTR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T) , INTENT(IN) :: file_id
+         TYPE(C_PTR)    , VALUE      :: buf_ptr
+         INTEGER(SIZE_T), INTENT(IN) :: buf_len
+         INTEGER(SIZE_T), INTENT(IN) :: buf_size
+       END FUNCTION h5fget_file_image_c
+    END INTERFACE
+
+    IF(PRESENT(buf_size))THEN
+       buf_ptr = C_NULL_PTR
+    ENDIF
+
+    hdferr = h5fget_file_image_c(file_id, buf_ptr, buf_len, buf_size_default)
+
+    IF(PRESENT(buf_size))THEN
+       buf_size = buf_size_default
+    ENDIF
+
+  END SUBROUTINE h5fget_file_image_f
+
+END MODULE H5F
diff --git a/fortran/src/H5Fff.f90 b/fortran/src/H5Fff.f90
deleted file mode 100644
index faa1967..0000000
--- a/fortran/src/H5Fff.f90
+++ /dev/null
@@ -1,834 +0,0 @@
-!****h* ROBODoc/H5F
-!
-! NAME
-!  MODULE H5F
-!
-! FILE
-!  H5Fff.f90
-!
-! PURPOSE
-!  This file contains Fortran interfaces for H5F functions.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5F function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5F
-  USE H5GLOBAL
-
-CONTAINS
-!****s* H5F/h5fcreate_f
-!
-! NAME
-!  h5fcreate_f
-!
-! PURPOSE
-!  Creates HDF5 files.
-!
-! INPUTS
-!  name 	 - name of the file to create
-!  access_flags  - File access flags. Allowable values are:
-!                   H5F_ACC_TRUNC_F
-!                   H5F_ACC_EXCL_F
-! OUTPUTS
-!  file_id 	 - file identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! OPTIONAL PARAMETERS
-!  creation_prp  - file creation property list identifier
-!  access_prp 	 - file access property list identifier
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! SOURCE
-  SUBROUTINE h5fcreate_f(name, access_flags, file_id, hdferr, &
-       creation_prp, access_prp)
-    IMPLICIT NONE
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the file
-    INTEGER, INTENT(IN) :: access_flags    ! File access flags
-    INTEGER(HID_T), INTENT(OUT) :: file_id ! File identifier
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: creation_prp
-                                           ! File creation propertly
-                                           ! list identifier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: access_prp
-                                           ! File access property list
-                                           ! identifier
-!*****
-    INTEGER(HID_T) :: creation_prp_default
-    INTEGER(HID_T) :: access_prp_default
-    INTEGER :: namelen ! Length of the name character string
-
-    INTERFACE
-       INTEGER FUNCTION h5fcreate_c(name, namelen, access_flags, &
-            creation_prp_default, access_prp_default, file_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5FCREATE_C':: h5fcreate_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN) :: access_flags
-         INTEGER(HID_T), INTENT(OUT) :: file_id
-         INTEGER(HID_T), INTENT(IN) :: creation_prp_default
-         INTEGER(HID_T), INTENT(IN) :: access_prp_default
-         INTEGER :: namelen
-       END FUNCTION h5fcreate_c
-    END INTERFACE
-
-    creation_prp_default = H5P_DEFAULT_F
-    access_prp_default = H5P_DEFAULT_F
-
-    IF (PRESENT(creation_prp)) creation_prp_default = creation_prp
-    IF (PRESENT(access_prp))   access_prp_default   = access_prp
-    namelen = LEN_TRIM(name)
-    hdferr = h5fcreate_c(name, namelen, access_flags, &
-         creation_prp_default, access_prp_default, file_id)
-
-  END SUBROUTINE h5fcreate_f
-!****s* H5F/h5fflush_f
-!
-! NAME
-!  h5fflush_f
-!
-! PURPOSE
-!  Flushes all buffers associated WITH a file to disk
-!
-! INPUTS
-!  object_id 	 - identifier of object used to identify the file.
-!  scope 	 - specifies the scope of the flushing action.
-!                  Possible values are:
-!                    H5F_SCOPE_GLOBAL_F
-!                    H5F_SCOPE_LOCAL_F
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! OPTIONAL PARAMETERS
-!  creation_prp  - file creation property list identifier
-!  access_prp 	 - file access property list identifier
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! SOURCE
-  SUBROUTINE h5fflush_f(object_id, scope, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: object_id !identifier for any object
-                                            !associate with a file,
-                                            !including the file itself,
-                                            !a dataset, a group, an
-                                            !attribute, or a named
-                                            !data type
-
-    INTEGER, INTENT(IN) :: scope            !scope of the flushing
-                                            !action, possible values
-                                            !are: H5F_SCOPE_GLOBAL_F
-                                            ! which flushes the entire
-                                            !virtual file,
-                                            !and H5F_SCOPE_LOCAL_F
-                                            !which flushes only the
-                                            !specified file.
-
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5fflush_c(object_id, scope)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5FFLUSH_C':: h5fflush_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: object_id
-         INTEGER, INTENT(IN) :: scope
-       END FUNCTION h5fflush_c
-    END INTERFACE
-
-    hdferr = h5fflush_c(object_id, scope)
-
-  END SUBROUTINE h5fflush_f
-!****s* H5F/h5fmount_f
-!
-! NAME
-!  h5fmount_f
-!
-! PURPOSE
-!  Mounts a file.
-!
-! INPUTS
-!  loc_id 	 - the identifier for of file or group in
-!                  which name is defined
-!  name 	 - the name of the group onto which the file
-!                  specified by child_id is to be mounted.
-!  child_id 	 - the identifier of the file to be mounted.
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  access_prp 	 - the identifier of the property list to be used
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! SOURCE
-  SUBROUTINE h5fmount_f(loc_id, name, child_id, hdferr, access_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! Identifier for file or group
-                                           ! in which dsetname is defined
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the group
-    INTEGER(HID_T), INTENT(IN) :: child_id ! File identifier for the
-                                           ! file to be mounted
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: access_prp
-                                           ! File access property list
-                                           ! identifier
-!*****
-    INTEGER(HID_T) :: access_prp_default
-    INTEGER :: namelen ! Length of the name character string
-
-    INTERFACE
-       INTEGER FUNCTION h5fmount_c(loc_id, name, namelen, &
-            child_id, access_prp_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5FMOUNT_C':: h5fmount_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER(HID_T), INTENT(IN) :: child_id
-         INTEGER(HID_T), INTENT(IN) :: access_prp_default
-         INTEGER :: namelen
-       END FUNCTION h5fmount_c
-    END INTERFACE
-
-    access_prp_default = H5P_DEFAULT_F
-    IF (PRESENT(access_prp))   access_prp_default   = access_prp
-    namelen = LEN_TRIM(name)
-    hdferr = h5fmount_c(loc_id, name, namelen, child_id, access_prp_default)
-
-  END SUBROUTINE h5fmount_f
-
-!****s* H5F/h5funmount_f
-!
-! NAME
-!  h5funmount_f
-!
-! PURPOSE
-!  Unmounts a file.
-!
-! INPUTS
-!  loc_id 	 - the identifier for of file or group in
-!                  which name is defined
-!  name 	 - the name of the mount point
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! SOURCE
-  SUBROUTINE h5funmount_f(loc_id, name, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! Identifier for file or group
-                                           ! at which the specified file
-                                           ! is to be unmounted
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the mount point
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-    INTEGER :: namelen ! Length of the name character string
-
-    INTERFACE
-       INTEGER FUNCTION h5funmount_c(loc_id, name, namelen)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5FUNMOUNT_C':: h5funmount_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER :: namelen
-       END FUNCTION h5funmount_c
-    END INTERFACE
-
-    namelen = LEN_TRIM(name)
-    hdferr = h5funmount_c(loc_id, name, namelen)
-
-  END SUBROUTINE h5funmount_f
-!****s* H5F/h5fopen_f
-!
-! NAME
-!  h5fopen_f
-!
-! PURPOSE
-!  Opens HDF5 file.
-!
-! INPUTS
-!  name 	 - name of the file to acecss
-!  access_flags  - File access flags. Allowable values are:
-!                   H5F_ACC_RDWR_F
-!                   H5F_ACC_RDONLY_F
-! OUTPUTS
-!  file_id 	 - file identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  access_prp 	 - file access property list identifier
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! SOURCE
-  SUBROUTINE h5fopen_f(name, access_flags, file_id, hdferr, access_prp)
-    IMPLICIT NONE
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the file
-    INTEGER, INTENT(IN) :: access_flags    ! File access flags
-    INTEGER(HID_T), INTENT(OUT) :: file_id ! File identifier
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: access_prp
-                                           ! File access property list
-                                           ! identifier
-!*****
-    INTEGER(HID_T) :: access_prp_default
-    INTEGER :: namelen ! Length of the name character string
-
-    INTERFACE
-       INTEGER FUNCTION h5fopen_c(name, namelen, access_flags, &
-            access_prp_default, file_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5FOPEN_C':: h5fopen_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER :: namelen
-         INTEGER, INTENT(IN) :: access_flags
-         INTEGER(HID_T), INTENT(IN) :: access_prp_default
-         INTEGER(HID_T), INTENT(OUT) :: file_id
-       END FUNCTION h5fopen_c
-    END INTERFACE
-
-    access_prp_default = H5P_DEFAULT_F
-    IF (PRESENT(access_prp))   access_prp_default   = access_prp
-    namelen = LEN_TRIM(name)
-    hdferr = h5fopen_c(name, namelen, access_flags, &
-                               access_prp_default, file_id)
-  END SUBROUTINE h5fopen_f
-!****s* H5F/h5freopen_f
-!
-! NAME
-!  h5freopen_f
-!
-! PURPOSE
-!  Reopens HDF5 file.
-!
-! INPUTS
-!  file_id 	 - identifier of a file for which an
-!                  additional identifier is required
-! OUTPUTS
-!  ret_file_id 	 - new file identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! SOURCE
-  SUBROUTINE h5freopen_f(file_id, ret_file_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: file_id      ! File identifier
-    INTEGER(HID_T), INTENT(OUT) :: ret_file_id ! New File identifier
-    INTEGER, INTENT(OUT) :: hdferr             ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5freopen_c(file_id, ret_file_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5FREOPEN_C':: h5freopen_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: file_id
-         INTEGER(HID_T), INTENT(OUT) :: ret_file_id
-       END FUNCTION h5freopen_c
-    END INTERFACE
-
-    hdferr = h5freopen_c(file_id, ret_file_id)
-
-  END SUBROUTINE h5freopen_f
-!****s* H5F/h5fget_create_plist_f
-!
-! NAME
-!  h5fget_create_plist_f
-!
-! PURPOSE
-!  Returns a file creation property list identifier.
-!
-! INPUTS
-!  file_id 	 - identifier of a file to creation property list of
-! OUTPUTS
-!  prop_id 	 - creation property list identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! SOURCE
-  SUBROUTINE h5fget_create_plist_f(file_id, prop_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: file_id    ! File identifier
-    INTEGER(HID_T), INTENT(OUT) :: prop_id   ! File creation property
-                                             ! list identifier
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5fget_create_plist_c(file_id, prop_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5FGET_CREATE_PLIST_C':: h5fget_create_plist_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: file_id
-         INTEGER(HID_T), INTENT(OUT) :: prop_id
-       END FUNCTION h5fget_create_plist_c
-    END INTERFACE
-
-    hdferr = h5fget_create_plist_c(file_id, prop_id)
-
-  END SUBROUTINE h5fget_create_plist_f
-!****s* H5F/h5fget_access_plist_f
-!
-! NAME
-!  h5fget_access_plist_f
-!
-! PURPOSE
-!  Returns a file access property list identifier.
-!
-! INPUTS
-!  file_id 	 - identifier of a file to creation property list of
-! OUTPUTS
-!  access_id 	 - access property list identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! SOURCE
-  SUBROUTINE h5fget_access_plist_f(file_id, access_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: file_id      ! File identifier
-    INTEGER(HID_T), INTENT(OUT) :: access_id   ! File access property
-                                               ! list identifier
-    INTEGER, INTENT(OUT) :: hdferr             ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5fget_access_plist_c(file_id, access_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5FGET_CREATE_PLIST_C':: h5fget_access_plist_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: file_id
-         INTEGER(HID_T), INTENT(OUT) :: access_id
-       END FUNCTION h5fget_access_plist_c
-    END INTERFACE
-
-    hdferr = h5fget_access_plist_c(file_id, access_id)
-
-  END SUBROUTINE h5fget_access_plist_f
-
-!****s* H5F/h5fis_hdf5_f
-!
-! NAME
-!  h5fis_hdf5_f
-!
-! PURPOSE
-!  Determines whether a file is in the HDF5 format.
-!
-! INPUTS
-!  name 	 - name of the file to check
-! OUTPUTS
-!  status 	 - indicates if file is and HDF5 file
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! SOURCE
-  SUBROUTINE h5fis_hdf5_f(name, status, hdferr)
-    IMPLICIT NONE
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the file
-    LOGICAL, INTENT(OUT) :: status         ! Indicates if file
-                                           ! is an HDF5 file
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-    INTEGER :: namelen ! Length of the name character string
-    INTEGER :: flag    ! "TRUE/FALSE" flag from C routine
-                       ! to define status value.
-
-    INTERFACE
-       INTEGER FUNCTION h5fis_hdf5_c(name, namelen, flag)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5FIS_HDF5_C':: h5fis_hdf5_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER :: namelen
-         INTEGER :: flag
-       END FUNCTION h5fis_hdf5_c
-    END INTERFACE
-
-    namelen = LEN_TRIM(name)
-    hdferr = h5fis_hdf5_c(name, namelen, flag)
-    status = .TRUE.
-    IF (flag .EQ. 0) status = .FALSE.
-
-  END SUBROUTINE h5fis_hdf5_f
-!****s* H5F/h5fclose_f
-!
-! NAME
-!  h5fclose_f
-!
-! PURPOSE
-!  Closes HDF5 file.
-!
-! INPUTS
-!  file_id 	 - file identifier
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! SOURCE
-  SUBROUTINE h5fclose_f(file_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: file_id ! File identifier
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5fclose_c(file_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5FCLOSE_C':: h5fclose_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: file_id
-       END FUNCTION h5fclose_c
-    END INTERFACE
-
-    hdferr = h5fclose_c(file_id)
-
-  END SUBROUTINE h5fclose_f
-
-!****s* H5F/h5fget_obj_count_f
-!
-! NAME
-!  h5fget_obj_count_f
-!
-! PURPOSE
-!  Gets number of the objects open within a file
-!
-! INPUTS
-!  file_id 	 - file identifier
-!  obj_type 	 - type of the object; possible values are:
-!                    H5F_OBJ_FILE_F
-!                    H5F_OBJ_DATASET_F
-!                    H5F_OBJ_GROUP_F
-!                    H5F_OBJ_DATATYPE_F
-!                    H5F_OBJ_ALL_F
-! OUTPUTS
-!  obj_count 	 - number of open objects
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  September 30, 2002
-!
-! HISTORY
-!  Changed the type of obj_count to INTEGER(SIZE_T)
-!  September 25, 2008 EIP
-!
-! SOURCE
-  SUBROUTINE h5fget_obj_count_f(file_id, obj_type, obj_count, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: file_id ! File identifier
-    INTEGER, INTENT(IN)  :: obj_type      ! Object type
-    INTEGER(SIZE_T), INTENT(OUT) :: obj_count
-                                          ! Number of open objects
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5fget_obj_count_c(file_id, obj_type, obj_count)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5FGET_OBJ_COUNT_C':: h5fget_obj_count_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: file_id
-         INTEGER, INTENT(IN)  :: obj_type      ! Object type
-         INTEGER(SIZE_T), INTENT(OUT) :: obj_count
-         ! Number of open objects
-       END FUNCTION h5fget_obj_count_c
-    END INTERFACE
-
-    hdferr = h5fget_obj_count_c(file_id, obj_type, obj_count)
-
-  END SUBROUTINE h5fget_obj_count_f
-
-!****s* H5F/h5fget_obj_ids_f
-!
-! NAME
-!  h5fget_obj_ids_f
-!
-! PURPOSE
-!  Get list of open objects identifiers within a file
-!
-! INPUTS
-!  file_id 	 - file identifier
-!  obj_type 	 - type of the object; possible values are:
-!                    H5F_OBJ_FILE_F
-!                    H5F_OBJ_DATASET_F
-!                    H5F_OBJ_GROUP_F
-!                    H5F_OBJ_DATATYPE_F
-!                    H5F_OBJ_ALL_F
-! OUTPUTS
-!  obj_ids 	 - array of open object identifiers
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! OPTIONAL PARAMETERS
-!  num_objs 	 - number of open objects
-!
-! AUTHOR
-!  Elena Pourmal
-!  September 30, 2002
-!
-! HISTORY
-!  Added optional parameter num_objs for number of open objects
-!  of the specified type and changed type of max_obj to
-!  INTEGER(SIZE_T)
-!  September 25, 2008 EIP
-!
-! SOURCE
-  SUBROUTINE h5fget_obj_ids_f(file_id, obj_type, max_objs, obj_ids, hdferr, num_objs)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: file_id      ! File identifier
-    INTEGER, INTENT(IN)  :: obj_type           ! Object type
-    INTEGER(SIZE_T), INTENT(IN)  :: max_objs   ! Maximum # of objects to retrieve
-    INTEGER(HID_T), DIMENSION(*), INTENT(INOUT) :: obj_ids
-                                               ! Array of open objects iidentifiers
-    INTEGER, INTENT(OUT) :: hdferr             ! Error code
-    INTEGER(SIZE_T), INTENT(OUT), OPTIONAL :: num_objs ! number of open objects
-!*****
-    INTEGER(SIZE_T) :: c_num_objs ! Number of open objects of the specified type
-
-    INTERFACE
-       INTEGER FUNCTION h5fget_obj_ids_c(file_id, obj_type, max_objs, obj_ids, c_num_objs)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5FGET_OBJ_IDS_C':: h5fget_obj_ids_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: file_id
-         INTEGER, INTENT(IN)  :: obj_type
-         INTEGER(SIZE_T), INTENT(IN)  :: max_objs
-         INTEGER(HID_T), DIMENSION(*), INTENT(INOUT) :: obj_ids
-         INTEGER(SIZE_T), INTENT(OUT) :: c_num_objs
-       END FUNCTION h5fget_obj_ids_c
-    END INTERFACE
-
-    hdferr = h5fget_obj_ids_c(file_id, obj_type, max_objs, obj_ids, c_num_objs)
-    IF (PRESENT(num_objs)) num_objs= c_num_objs
-
-  END SUBROUTINE h5fget_obj_ids_f
-!****s* H5F/h5fget_freespace_f
-!
-! NAME
-!  h5fget_freespace_f
-!
-! PURPOSE
-!  Get amount of free space within a file
-!
-! INPUTS
-!  file_id 	 - file identifier
-! OUTPUTS
-!  free_space 	 - amount of free space in file
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Quincey Koziol
-!  October 7, 2003
-!
-! SOURCE
-  SUBROUTINE h5fget_freespace_f(file_id, free_space, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: file_id ! File identifier
-    INTEGER(HSSIZE_T), INTENT(OUT) :: free_space
-                                          ! amount of free space in file
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5fget_freespace_c(file_id, free_space)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5FGET_FREESPACE_C':: h5fget_freespace_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: file_id
-         INTEGER(HSSIZE_T), INTENT(OUT) :: free_space
-       END FUNCTION h5fget_freespace_c
-    END INTERFACE
-
-    hdferr = h5fget_freespace_c(file_id, free_space)
-
-  END SUBROUTINE h5fget_freespace_f
-!****s* H5F/h5fget_name_f
-!
-! NAME
-!  h5fget_name_f
-!
-! PURPOSE
-!  Gets the name of the file from the object identifier
-!
-! INPUTS
-!  obj_id 	 - object identifier
-! OUTPUTS
-!  buf 	         - buffer to store the read name
-!  size 	 - actual size of the name
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  July 6, 2004
-!
-! SOURCE
-  SUBROUTINE h5fget_name_f(obj_id, buf, size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: obj_id   ! Object identifier
-    CHARACTER(LEN=*), INTENT(INOUT) :: buf
-                                           ! Buffer to hold file name
-    INTEGER(SIZE_T), INTENT(OUT) :: size   ! Size of the file name
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code: 0 on success,
-                                           !   	 -1 if fail
-!*****
-    INTEGER(SIZE_T) :: buflen
-
-    INTERFACE
-       INTEGER FUNCTION h5fget_name_c(obj_id, size, buf, buflen)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5FGET_NAME_C'::h5fget_name_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: obj_id
-         INTEGER(SIZE_T), INTENT(OUT) :: size
-         INTEGER(SIZE_T) :: buflen
-         CHARACTER(LEN=*), INTENT(OUT) :: buf
-       END FUNCTION h5fget_name_c
-    END INTERFACE
-    buflen = LEN_TRIM(buf)
-    hdferr = h5fget_name_c(obj_id, size, buf, buflen)
-  END SUBROUTINE h5fget_name_f
-!****s* H5F/h5fget_filesize_f
-!
-! NAME
-!  h5fget_filesize_f
-!
-! PURPOSE
-!  Retrieves the file size of the HDF5 file.
-!
-! INPUTS
-!  file_id 	 - file identifier
-! OUTPUTS
-!  size 	 - file size
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  July 7, 2004
-!
-! SOURCE
-  SUBROUTINE h5fget_filesize_f(file_id, size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: file_id  ! file identifier
-    INTEGER(HSIZE_T), INTENT(OUT) :: size  ! Size of the file
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code: 0 on success,
-                                           !   	 -1 if fail
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5fget_filesize_c(file_id, size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5FGET_FILESIZE_C'::h5fget_filesize_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: file_id
-         INTEGER(HSIZE_T), INTENT(OUT) :: size
-       END FUNCTION h5fget_filesize_c
-    END INTERFACE
-    hdferr = h5fget_filesize_c(file_id, size)
-  END SUBROUTINE h5fget_filesize_f
-
-
-END MODULE H5F
diff --git a/fortran/src/H5Fff_F03.f90 b/fortran/src/H5Fff_F03.f90
deleted file mode 100644
index 8544870..0000000
--- a/fortran/src/H5Fff_F03.f90
+++ /dev/null
@@ -1,99 +0,0 @@
-!****h* ROBODoc/H5F (F03)
-!
-! NAME
-!  H5F_PROVISIONAL
-!
-! PURPOSE
-!  This file contains Fortran 2003 interfaces for H5F functions.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5T function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5F_PROVISIONAL
-
-  USE H5GLOBAL
-  USE, INTRINSIC :: ISO_C_BINDING
-
-CONTAINS
-!****s* H5F (F03)/h5fget_file_image_f_F03
-!
-! NAME
-!  h5fget_file_image_f
-!
-! PURPOSE
-!  Retrieves a copy of the image of an existing, open file. 
-!
-! INPUTS
-!  file_id    - Target file identifier.
-!  buf_ptr    - Pointer to the buffer into which the image of the HDF5 file is to be copied.
-!  buf_len    - Size of the supplied buffer.
-!
-! OUTPUTS
-!  hdferr     - error code:
-!                 0 on success and -1 on failure
-! OPTIONAL PARAMETERS  
-!  buf_size   - Returns the size in bytes of the buffer required to store the file image,
-!               no data will be copied.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  November 26, 2012
-!
-! Fortran2003 Interface:
-  SUBROUTINE h5fget_file_image_f(file_id, buf_ptr, buf_len, hdferr, buf_size)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T) , INTENT(IN)              :: file_id
-    TYPE(C_PTR)    , INTENT(INOUT)           :: buf_ptr
-    INTEGER(SIZE_T), INTENT(IN)              :: buf_len
-    INTEGER        , INTENT(OUT)             :: hdferr
-    INTEGER(SIZE_T), INTENT(OUT)  , OPTIONAL :: buf_size
-!*****
-
-    INTEGER(SIZE_T) :: buf_size_default
-
-    INTERFACE
-       INTEGER FUNCTION h5fget_file_image_c(file_id, buf_ptr, buf_len, buf_size) BIND(C, NAME='h5fget_file_image_c')
-         USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR
-         USE H5GLOBAL
-         INTEGER(HID_T) , INTENT(IN) :: file_id
-         TYPE(C_PTR)    , VALUE      :: buf_ptr
-         INTEGER(SIZE_T), INTENT(IN) :: buf_len
-         INTEGER(SIZE_T), INTENT(IN) :: buf_size
-       END FUNCTION h5fget_file_image_c
-    END INTERFACE
-
-    IF(PRESENT(buf_size))THEN
-       buf_ptr = C_NULL_PTR
-    ENDIF
-
-    hdferr = h5fget_file_image_c(file_id, buf_ptr, buf_len, buf_size_default)
-
-    IF(PRESENT(buf_size))THEN
-       buf_size = buf_size_default
-    ENDIF
-
-  END SUBROUTINE h5fget_file_image_f
-
-END MODULE H5F_PROVISIONAL
diff --git a/fortran/src/H5Fff_F90.f90 b/fortran/src/H5Fff_F90.f90
deleted file mode 100644
index b6e659b..0000000
--- a/fortran/src/H5Fff_F90.f90
+++ /dev/null
@@ -1,43 +0,0 @@
-!****h* ROBODoc/H5F (F90)
-!
-! NAME
-!  H5F_PROVISIONAL
-!
-! PURPOSE
-!  This file contains Fortran 90 interfaces for H5F functions. It 
-!  containsthe same functions as H5Fff_F03.f90, when applicable,
-!  but excludes the Fortran 2003 functions and the interface listings. 
-!  This file will be compiled instead of H5Fff_F03.f90 if Fortran 2003 
-!  functions are not enabled.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5F function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-
-MODULE H5F_PROVISIONAL
-
-  USE H5GLOBAL
-  IMPLICIT NONE
-
-END MODULE H5F_PROVISIONAL
diff --git a/fortran/src/H5Gf.c b/fortran/src/H5Gf.c
index 7f755b3..b9c44bb 100644
--- a/fortran/src/H5Gf.c
+++ b/fortran/src/H5Gf.c
@@ -1,6 +1,6 @@
 /****h* H5Gf/H5Gf
  * PURPOSE
- *   This file contains C stubs for H5G Fortran APIs
+ *  This file contains C stubs for H5G Fortran APIs
  *
  * COPYRIGHT
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -26,30 +26,29 @@
 
 /****if* H5Gf/h5gcreate_c
  * NAME
- *        h5gcreate_c
+ *  h5gcreate_c
  * PURPOSE
- *     Call H5Gcreate to create a group
+ *  Call H5Gcreate to create a group
  * INPUTS
- *      loc_id - file or group identifier
- *              name - name of the group
- *              namelen - name length
- *              size_hint - length of names in the group
+ *  loc_id - file or group identifier
+ *  name - name of the group
+ *  namelen - name length
+ *  size_hint - length of names in the group
  * OUTPUTS
- *     grp_id - group identifier
+ *  grp_id - group identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 5, 1999
+ *  Wednesday, August 5, 1999
  * HISTORY
- *
- *              Changed to call H5Gcreate2 because H5Gcreate flip-flops and
- *              H5Gcreate1 can be compiled out of the library
- *              QAK - 2007/08/23
+ *  Changed to call H5Gcreate2 because H5Gcreate flip-flops and
+ *  H5Gcreate1 can be compiled out of the library
+ *  QAK - 2007/08/23
  * SOURCE
 */
 int_f
-nh5gcreate_c(hid_t_f *loc_id, _fcd name, int_f *namelen, size_t_f *size_hint,
+h5gcreate_c(hid_t_f *loc_id, _fcd name, int_f *namelen, size_t_f *size_hint,
 	     hid_t_f *grp_id, hid_t_f *lcpl_id, hid_t_f *gcpl_id, hid_t_f *gapl_id )
 /******/
 {
@@ -98,26 +97,26 @@ DONE:
 
 /****if* H5Gf/h5gopen_c
  * NAME
- *        h5gopen_c
+ *  h5gopen_c
  * PURPOSE
- *     Call H5Gopen to open a dataset
+ *  Call H5Gopen to open a dataset
  * INPUTS
- *      loc_id - file or group identifier
- *              name - name of the group
- *              namelen - name length
- *              gapl_id - Group access property list identifier
+ *  loc_id - file or group identifier
+ *  name - name of the group
+ *  namelen - name length
+ *  gapl_id - Group access property list identifier
  * OUTPUTS
- *     grp_id - group identifier
+ *  grp_id - group identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 5, 1999
+ *  Wednesday, August 5, 1999
  *
  * SOURCE
 */
 int_f
-nh5gopen_c(hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *gapl_id, hid_t_f *grp_id)
+h5gopen_c(hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *gapl_id, hid_t_f *grp_id)
 /******/
 {
      char *c_name = NULL;
@@ -148,28 +147,28 @@ DONE:
 
 /****if* H5Gf/h5gget_obj_info_idx_c
  * NAME
- *        h5gget_obj_info_idx_c
+ *  h5gget_obj_info_idx_c
  * PURPOSE
- *     Call H5Gget_obj_info to return name and the type of group
- *              member
+ *  Call H5Gget_obj_info to return name and the type of group
+ *  member
  * INPUTS
- *      loc_id - file or group identifier
- *              name - name of the group
- *              namelen - name length
- *              idx - index of the group member
+ *  loc_id - file or group identifier
+ *  name - name of the group
+ *  namelen - name length
+ *  idx - index of the group member
  * OUTPUTS
- *     obj_name - buffer to store member's name
- *              obj_namelen - length of the buffer
- *              obj_type - type of the object
+ *  obj_name - buffer to store member's name
+ *  obj_namelen - length of the buffer
+ *  obj_type - type of the object
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 5, 1999
+ *  Wednesday, August 5, 1999
  * SOURCE
 */
 int_f
-nh5gget_obj_info_idx_c(hid_t_f *loc_id, _fcd name, int_f *namelen, int_f *idx,
+h5gget_obj_info_idx_c(hid_t_f *loc_id, _fcd name, int_f *namelen, int_f *idx,
     _fcd obj_name, int_f *obj_namelen, int_f *obj_type)
 /******/
 {
@@ -207,7 +206,7 @@ nh5gget_obj_info_idx_c(hid_t_f *loc_id, _fcd name, int_f *namelen, int_f *idx,
         goto DONE;
 
 /* XXX: Switch from using H5Gget_objtype_by_idx() means that this routine won't
- *      work on non-hard links - QAK
+ *  work on non-hard links - QAK
  */
     *obj_type = oinfo.type;
 
@@ -231,24 +230,24 @@ DONE:
 
 /****if* H5Gf/h5gn_members_c
  * NAME
- *        h5gn_members_c
+ *  h5gn_members_c
  * PURPOSE
- *     Call H5Gget_info_by_name to find number of objects in the group
+ *  Call H5Gget_info_by_name to find number of objects in the group
  * INPUTS
- *      loc_id - file or group identifier
- *              name - name of the group
- *              namelen - name length
+ *  loc_id - file or group identifier
+ *  name - name of the group
+ *  namelen - name length
  * OUTPUTS
- *     nmemebers - number of members
+ *  nmemebers - number of members
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 5, 1999
+ *  Wednesday, August 5, 1999
  * SOURCE
 */
 int_f
-nh5gn_members_c(hid_t_f *loc_id, _fcd name, int_f *namelen, int_f *nmembers)
+h5gn_members_c(hid_t_f *loc_id, _fcd name, int_f *namelen, int_f *nmembers)
 /******/
 {
     char *c_name = NULL;
@@ -276,21 +275,21 @@ DONE:
 
 /****if* H5Gf/h5gclose_c
  * NAME
- *        h5gclose_c
+ *  h5gclose_c
  * PURPOSE
- *     Call H5Gclose to close the group
+ *  Call H5Gclose to close the group
  * INPUTS
- *      grp_id - identifier of the group to be closed
+ *  grp_id - identifier of the group to be closed
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 5, 1999
+ *  Wednesday, August 5, 1999
  * SOURCE
 */
 
 int_f
-nh5gclose_c(hid_t_f *grp_id)
+h5gclose_c(hid_t_f *grp_id)
 /******/
 {
     int ret_value = 0;
@@ -303,19 +302,19 @@ nh5gclose_c(hid_t_f *grp_id)
 
 /****if* H5Gf/h5glink_c
  * NAME
- *        h5glink_c
+ *  h5glink_c
  * PURPOSE
- *     Call H5Glink to link the specified type
+ *  Call H5Glink to link the specified type
  * INPUTS
- *      loc_id - identifier of file or group
- *              link_type - link type
- *              current_name - name of the existing object for hard link,
- *                             anything for the soft link
- *              current_namelen - current name lenghth
- *              new_name - new name for the object
- *              new_namelen - new_name lenghth
+ *  loc_id - identifier of file or group
+ *  link_type - link type
+ *  current_name - name of the existing object for hard link,
+ *  anything for the soft link
+ *  current_namelen - current name lenghth
+ *  new_name - new name for the object
+ *  new_namelen - new_name lenghth
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Mingshi Chen
  *  Friday, August 6, 1999
@@ -323,7 +322,7 @@ nh5gclose_c(hid_t_f *grp_id)
 */
 
 int_f
-nh5glink_c(hid_t_f *loc_id, int_f *link_type, _fcd current_name,
+h5glink_c(hid_t_f *loc_id, int_f *link_type, _fcd current_name,
     int_f *current_namelen, _fcd new_name, int_f *new_namelen)
 /******/
 {
@@ -385,32 +384,32 @@ DONE:
 
 /****if* H5Gf/h5glink2_c
  * NAME
- *        h5glink2_c
+ *  h5glink2_c
  * PURPOSE
- *     Call H5Glink2 to link the specified type
+ *  Call H5Glink2 to link the specified type
  * INPUTS
- *      cur_loc_id - identifier of file or group
- *              cur_name - name of the existing object for hard link releative
- *                         to cur_loc_id location,
- *                         anything for the soft link
- *              current_namelen - current name lenghth
- *              link_type - link type
- *              new_loc_id - location identifier
- *              new_name - new name for the object releative to the new_loc_id
- *                         location
- *              new_namelen - new_name lenghth
+ *  cur_loc_id - identifier of file or group
+ *  cur_name - name of the existing object for hard link releative
+ *  to cur_loc_id location,
+ *  anything for the soft link
+ *  current_namelen - current name lenghth
+ *  link_type - link type
+ *  new_loc_id - location identifier
+ *  new_name - new name for the object releative to the new_loc_id
+ *  location
+ *  new_namelen - new_name lenghth
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, September 25, 2002
+ *  Wednesday, September 25, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5glink2_c(hid_t_f *cur_loc_id, _fcd cur_name, int_f *cur_namelen,
+h5glink2_c(hid_t_f *cur_loc_id, _fcd cur_name, int_f *cur_namelen,
     int_f *link_type, hid_t_f *new_loc_id, _fcd new_name, int_f *new_namelen)
 /******/
 {
@@ -470,14 +469,14 @@ DONE:
 
 /****if* H5Gf/h5gunlink_c
  * NAME
- *        h5gunlink_c
+ *  h5gunlink_c
  * PURPOSE
- *     Call H5Gunlink to remove  the specified name
+ *  Call H5Gunlink to remove  the specified name
  * INPUTS
- *      loc_id - identifier of file or group
- *              name - name of the object to unlink
+ *  loc_id - identifier of file or group
+ *  name - name of the object to unlink
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Mingshi Chen
  *  Friday, August 6, 1999
@@ -485,7 +484,7 @@ DONE:
 */
 
 int_f
-nh5gunlink_c(hid_t_f *loc_id, _fcd name, int_f *namelen)
+h5gunlink_c(hid_t_f *loc_id, _fcd name, int_f *namelen)
 /******/
 {
     char *c_name = NULL;
@@ -512,17 +511,17 @@ DONE:
 
 /****if* H5Gf/h5gmove_c
  * NAME
- *        h5gmove_c
+ *  h5gmove_c
  * PURPOSE
- *     Call H5Gmove to rename an object within an HDF5 file
+ *  Call H5Gmove to rename an object within an HDF5 file
  * INPUTS
- *      loc_id - identifier of file or group
- *              src_name - name of the original object
- *              src_namelen - original name lenghth
- *              dst_name - new name for the object
- *              dst_namelen - new name lenghth
+ *  loc_id - identifier of file or group
+ *  src_name - name of the original object
+ *  src_namelen - original name lenghth
+ *  dst_name - new name for the object
+ *  dst_namelen - new name lenghth
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Mingshi Chen
  *  Friday, August 6, 1999
@@ -530,7 +529,7 @@ DONE:
 */
 
 int_f
-nh5gmove_c(hid_t_f *loc_id, _fcd src_name, int_f *src_namelen, _fcd dst_name, int_f*dst_namelen)
+h5gmove_c(hid_t_f *loc_id, _fcd src_name, int_f *src_namelen, _fcd dst_name, int_f*dst_namelen)
 /******/
 {
     char *c_src_name = NULL, *c_dst_name = NULL;
@@ -562,18 +561,18 @@ DONE:
 
 /****if* H5Gf/h5gmove2_c
  * NAME
- *        h5gmove2_c
+ *  h5gmove2_c
  * PURPOSE
- *     Call H5Gmove2 to rename an object within an HDF5 file
+ *  Call H5Gmove2 to rename an object within an HDF5 file
  * INPUTS
- *      src_loc_id - identifier of file or group
- *              src_name - name of the original object relative to src_loc_id
- *              src_namelen - original name lenghth
- *              dst_loc_id - new location identifier
- *              dst_name - new name for the object relative to dst_loc_id
- *              dst_namelen - new name lenghth
+ *  src_loc_id - identifier of file or group
+ *  src_name - name of the original object relative to src_loc_id
+ *  src_namelen - original name lenghth
+ *  dst_loc_id - new location identifier
+ *  dst_name - new name for the object relative to dst_loc_id
+ *  dst_namelen - new name lenghth
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
  *  Wednesday, September 25, 2002
@@ -582,7 +581,7 @@ DONE:
 */
 
 int_f
-nh5gmove2_c(hid_t_f *src_loc_id, _fcd src_name, int_f *src_namelen, hid_t_f *dst_loc_id, _fcd dst_name, int_f*dst_namelen)
+h5gmove2_c(hid_t_f *src_loc_id, _fcd src_name, int_f *src_namelen, hid_t_f *dst_loc_id, _fcd dst_name, int_f*dst_namelen)
 /******/
 {
     char *c_src_name = NULL, *c_dst_name = NULL;
@@ -614,18 +613,18 @@ DONE:
 
 /****if* H5Gf/h5gget_linkval_c
  * NAME
- *        h5gget_linkval_c
+ *  h5gget_linkval_c
  * PURPOSE
- *     Call H5Gget_linkval to return the name of object
+ *  Call H5Gget_linkval to return the name of object
  * INPUTS
- *      loc_id - identifier of file or group
- *              name - name of the object that symbolic link points to
- *              namelen - the name lenghth
- *              size - lenghth of retrurned value
+ *  loc_id - identifier of file or group
+ *  name - name of the object that symbolic link points to
+ *  namelen - the name lenghth
+ *  size - lenghth of retrurned value
  * OUTPUTS
- *     value - name to be returned
+ *  value - name to be returned
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Mingshi Chen
  *  Friday, August 6, 1999
@@ -633,7 +632,7 @@ DONE:
 */
 
 int_f
-nh5gget_linkval_c(hid_t_f *loc_id, _fcd name, int_f *namelen, size_t_f *size,
+h5gget_linkval_c(hid_t_f *loc_id, _fcd name, int_f *namelen, size_t_f *size,
     _fcd value)
 /******/
 {
@@ -678,26 +677,26 @@ DONE:
 
 /****if* H5Gf/h5gset_comment_c
  * NAME
- *        h5gset_comment_c
+ *  h5gset_comment_c
  * PURPOSE
- *     Call H5Oset_comment_by_name to set comments for the specified object
+ *  Call H5Oset_comment_by_name to set comments for the specified object
  * INPUTS
- *      loc_id - identifier of file or group
- *              name - name of object whose comment is to be set or reset
- *              namelen - the name lenghth
- *              comment - the new comment
- *              commentlen - new comment lenghth
+ *  loc_id - identifier of file or group
+ *  name - name of object whose comment is to be set or reset
+ *  namelen - the name lenghth
+ *  comment - the new comment
+ *  commentlen - new comment lenghth
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Mingshi Chen
- *              Friday, August 6, 1999
+ *  Friday, August 6, 1999
  * HISTORY
- * Elena Pourmal
+ *  Elena Pourmal
  * SOURCE
 */
 int_f
-nh5gset_comment_c(hid_t_f *loc_id, _fcd name, int_f *namelen, _fcd comment,
+h5gset_comment_c(hid_t_f *loc_id, _fcd name, int_f *namelen, _fcd comment,
     int_f *commentlen)
 /******/
 {
@@ -729,24 +728,24 @@ DONE:
 
 /****if* H5Gf/h5gget_comment_c
  * NAME
- *        h5gget_comment_c
+ *  h5gget_comment_c
  * PURPOSE
- *     Call H5Oget_comment_by_name to retrieve comments for the specified object
+ *  Call H5Oget_comment_by_name to retrieve comments for the specified object
  * INPUTS
- *      loc_id - identifier of file or group
- *              name - name of object whose comment is to be set or reset
- *              namelen - the name lenghth
- *              bufsize - at most bufsize characters
- *              comment - the new comment
+ *  loc_id - identifier of file or group
+ *  name - name of object whose comment is to be set or reset
+ *  namelen - the name lenghth
+ *  bufsize - at most bufsize characters
+ *  comment - the new comment
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Mingshi Chen
- *              Friday, August 6, 1999
+ *  Friday, August 6, 1999
  * SOURCE
 */
 int_f
-nh5gget_comment_c(hid_t_f *loc_id, _fcd name, int_f *namelen, size_t_f *bufsize,
+h5gget_comment_c(hid_t_f *loc_id, _fcd name, int_f *namelen, size_t_f *bufsize,
     _fcd comment)
 /******/
 {
@@ -791,26 +790,26 @@ DONE:
 
 /****if* H5Gf/h5gcreate_anon_c
  * NAME
- *        h5gcreate_anon_c
+ *  h5gcreate_anon_c
  * PURPOSE
- *     Call H5Gcreate_anon
+ *  Call H5Gcreate_anon
  * INPUTS
  *
- *              loc_id  - Location identifier
- *              gcpl_id - Group creation property list identifier
- *              gapl_id - Group access property list identifier
+ *  loc_id  - Location identifier
+ *  gcpl_id - Group creation property list identifier
+ *  gapl_id - Group access property list identifier
  *
  * OUTPUTS
- *     grp_id - group identifier
+ *  grp_id - group identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
  *  February 15, 2008
  * SOURCE
 */
 int_f
-nh5gcreate_anon_c(hid_t_f *loc_id, hid_t_f *gcpl_id, hid_t_f *gapl_id, hid_t_f *grp_id)
+h5gcreate_anon_c(hid_t_f *loc_id, hid_t_f *gcpl_id, hid_t_f *gapl_id, hid_t_f *grp_id)
 /******/
 {
 
@@ -825,24 +824,24 @@ done:
 
 /****if* H5Gf/h5gget_create_plist_c
  * NAME
- *        h5gget_create_plist_c
+ *  h5gget_create_plist_c
  * PURPOSE
- *     Call H5Gget_create_plist
+ *  Call H5Gget_create_plist
  * INPUTS
  *
- *              grp_id - group identifier
+ *  grp_id - group identifier
  *
  * OUTPUTS
- *     gcpl_id - Group creation property list identifier
+ *  gcpl_id - Group creation property list identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
  *  February 15, 2008
  * SOURCE
 */
 int_f
-nh5gget_create_plist_c(hid_t_f *grp_id, hid_t_f *gcpl_id )
+h5gget_create_plist_c(hid_t_f *grp_id, hid_t_f *gcpl_id )
 /******/
 {
   int_f ret_value=0; /* Return value */
@@ -857,36 +856,36 @@ done:
 
 /****if* H5Gf/h5gget_info_c
  * NAME
- *      h5gget_info_c
+ *  h5gget_info_c
  * PURPOSE
- *   Call H5Gget_info
+ *  Call H5Gget_info
  * INPUTS
- *    group_id - Group identifier
+ *  group_id - Group identifier
  * OUTPUTS
  *
- *            storage_type - Type of storage for links in group:
+ *  storage_type - Type of storage for links in group:
  *                             H5G_STORAGE_TYPE_COMPACT: Compact storage
  *                             H5G_STORAGE_TYPE_DENSE: Indexed storage
  *                             H5G_STORAGE_TYPE_SYMBOL_TABLE: Symbol tables, the original HDF5 structure
  *
- *                  nlinks - Number of links in group
- *              max_corder - Current maximum creation order value for group
- *                 mounted - Whether group has a file mounted on it (0 = false, 1 = true)
+ *  nlinks - Number of links in group
+ *  max_corder - Current maximum creation order value for group
+ *  mounted - Whether group has a file mounted on it (0 = false, 1 = true)
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              February 15, 2008
+ *  February 15, 2008
  * HISTORY
  *
- *          - Added 'mounted' paramater
- *            M. Scot Breitenfeld
- *            July 16, 2008
+ *  - Added 'mounted' paramater
+ *  M. Scot Breitenfeld
+ *  July 16, 2008
  * SOURCE
 */
 int_f
-nh5gget_info_c (hid_t_f *group_id, int_f *storage_type, int_f *nlinks, int_f *max_corder, int_f *mounted )
+h5gget_info_c (hid_t_f *group_id, int_f *storage_type, int_f *nlinks, int_f *max_corder, int_f *mounted )
 /******/
 {
 
@@ -914,43 +913,43 @@ done:
 
 /****if* H5Gf/h5gget_info_by_idx_c
  * NAME
- *      h5gget_info_by_idx_c
+ *  h5gget_info_by_idx_c
  * PURPOSE
- *   Call H5Gget_info_by_idx
+ *  Call H5Gget_info_by_idx
  * INPUTS
  *
- *          loc_id - File or group identifier
- *      group_name - Name of group containing group for which information is to be retrieved
- *   group_namelen - name length
- *      index_type - Index type
- *           order - Order of the count in the index
- *               n - Position in the index of the group for which information is retrieved
- *         lapl_id - Link access property list
+ *  loc_id - File or group identifier
+ *  group_name - Name of group containing group for which information is to be retrieved
+ *  group_namelen - name length
+ *  index_type - Index type
+ *  order - Order of the count in the index
+ *  n - Position in the index of the group for which information is retrieved
+ *  lapl_id - Link access property list
  * OUTPUTS
  *
- *            storage_type - Type of storage for links in group:
+ *  storage_type - Type of storage for links in group:
  *                             H5G_STORAGE_TYPE_COMPACT: Compact storage
  *                             H5G_STORAGE_TYPE_DENSE: Indexed storage
  *                             H5G_STORAGE_TYPE_SYMBOL_TABLE: Symbol tables, the original HDF5 structure
  *
- *                  nlinks - Number of links in group
- *              max_corder - Current maximum creation order value for group
- *                 mounted - Whether group has a file mounted on it (0 = false, 1 = true)
+ *  nlinks - Number of links in group
+ *  max_corder - Current maximum creation order value for group
+ *  mounted - Whether group has a file mounted on it (0 = false, 1 = true)
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              February 18, 2008
+ *  February 18, 2008
  * HISTORY
  *
- *          - Added 'mounted' paramater
- *            M. Scot Breitenfeld
- *            July 16, 2008
+ *  - Added 'mounted' parameter
+ *    M. Scot Breitenfeld
+ *    July 16, 2008
  * SOURCE
 */
 int_f
-nh5gget_info_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen,
+h5gget_info_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen,
 		      int_f *index_type, int_f *order, hsize_t_f *n, hid_t_f *lapl_id,
 		      int_f *storage_type, int_f *nlinks, int_f *max_corder, int_f *mounted )
 /******/
@@ -987,40 +986,40 @@ nh5gget_info_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen,
 
 /****if* H5Gf/h5gget_info_by_name_c
  * NAME
- *      h5gget_info_by_name_c
+ *  h5gget_info_by_name_c
  * PURPOSE
- *   Call H5Gget_info_by_name
+ *  Call H5Gget_info_by_name
  * INPUTS
  *
- *          loc_id - File or group identifier
- *      group_name - Name of group containing group for which information is to be retrieved
- *   group_namelen - name length
- *         lapl_id - Link access property list
+ *  loc_id - File or group identifier
+ *  group_name - Name of group containing group for which information is to be retrieved
+ *  group_namelen - name length
+ *  lapl_id - Link access property list
  * OUTPUTS
  *
- *            storage_type - Type of storage for links in group:
+ *  storage_type - Type of storage for links in group:
  *                             H5G_STORAGE_TYPE_COMPACT: Compact storage
  *                             H5G_STORAGE_TYPE_DENSE: Indexed storage
  *                             H5G_STORAGE_TYPE_SYMBOL_TABLE: Symbol tables, the original HDF5 structure
  *
- *                  nlinks - Number of links in group
- *              max_corder - Current maximum creation order value for group
- *                 mounted - Whether group has a file mounted on it (0 = false, 1 = true)
+ *  nlinks - Number of links in group
+ *  max_corder - Current maximum creation order value for group
+ *  mounted - Whether group has a file mounted on it (0 = false, 1 = true)
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              February 18, 2008
+ *  February 18, 2008
  * HISTORY
  *
- *          - Added 'mounted' paramater
- *            M. Scot Breitenfeld
- *            July 16, 2008
+ *  - Added 'mounted' paramater
+ *    M. Scot Breitenfeld
+ *    July 16, 2008
  * SOURCE
 */
 int_f
-nh5gget_info_by_name_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen, hid_t_f *lapl_id,
+h5gget_info_by_name_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen, hid_t_f *lapl_id,
 		       int_f *storage_type, int_f *nlinks, int_f *max_corder, int_f *mounted)
 /******/
 {
diff --git a/fortran/src/H5Gff.F90 b/fortran/src/H5Gff.F90
new file mode 100644
index 0000000..2e002b5
--- /dev/null
+++ b/fortran/src/H5Gff.F90
@@ -0,0 +1,1272 @@
+!****h* ROBODoc/H5G
+!
+! NAME
+!  MODULE H5G
+!
+! FILE
+!  fortran/src/H5Gff.f90
+!
+! PURPOSE
+!  This file contains Fortran interfaces for H5G functions.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! NOTES
+!       _____ __  __ _____   ____  _____ _______       _   _ _______
+!      |_   _|  \/  |  __ \ / __ \|  __ \__   __|/\   | \ | |__   __|
+! ****   | | | \  / | |__) | |  | | |__) | | |  /  \  |  \| |  | |    ****
+! ****   | | | |\/| |  ___/| |  | |  _  /  | | / /\ \ | . ` |  | |    ****
+! ****  _| |_| |  | | |    | |__| | | \ \  | |/ ____ \| |\  |  | |    ****
+!      |_____|_|  |_|_|     \____/|_|  \_\ |_/_/    \_\_| \_|  |_|
+!
+!  If you add a new H5G function you must add the function name to the
+!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
+!  This is needed for Windows based operating systems.
+!
+!*****
+
+MODULE H5G
+  USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_CHAR
+  USE H5GLOBAL
+
+CONTAINS
+
+!****s* H5G/h5gcreate_f
+!
+! NAME
+!  h5gcreate_f
+!
+! PURPOSE
+!  Creates a new group.
+!
+! INPUTS
+!  loc_id 	 - location identifier
+!  name 	 - group name at the specified location
+! OUTPUTS
+!  grp_id 	 - group identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  size_hint 	 - a parameter indicating the number of bytes to
+!                  reserve for the names that will appear in the group
+!  lcpl_id 	 - Property list for link creation
+!  gcpl_id 	 - Property list for group creation
+!  gapl_id 	 - Property list for group access
+!
+! AUTHOR	
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY 	
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 5, 2001
+!
+!  Added additional optional paramaters in 1.8
+!  MSB - February 27, 2008
+!
+! SOURCE
+  SUBROUTINE h5gcreate_f(loc_id, name, grp_id, hdferr, size_hint, lcpl_id, gcpl_id, gapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the group
+    INTEGER(HID_T), INTENT(OUT) :: grp_id  ! Group identifier
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+    INTEGER(SIZE_T), OPTIONAL, INTENT(IN) :: size_hint
+                                           ! Parameter indicating
+                                           ! the number of bytes
+                                           ! to reserve for the
+                                           ! names that will appear
+                                           ! in the group. Set to OBJECT_NAMELEN_DEFAULT_F
+                                           ! if using any of the optional
+                                           ! parameters lcpl_id, gcpl_id, and/or gapl_id when not
+                                           ! using keywords in specifying the optional parameters
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lcpl_id  ! Property list for link creation
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: gcpl_id  ! Property list for group creation
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: gapl_id  ! Property list for group access
+!*****
+    INTEGER(HID_T) :: lcpl_id_default
+    INTEGER(HID_T) :: gcpl_id_default
+    INTEGER(HID_T) :: gapl_id_default
+
+    INTEGER :: namelen ! Length of the name character string
+    INTEGER(SIZE_T) :: size_hint_default
+
+    INTERFACE
+       INTEGER FUNCTION h5gcreate_c(loc_id, name, namelen, &
+            size_hint_default, grp_id, lcpl_id_default, gcpl_id_default, gapl_id_default) &
+            BIND(C,NAME='h5gcreate_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER :: namelen
+         INTEGER(SIZE_T) :: size_hint_default
+         INTEGER(HID_T), INTENT(OUT) :: grp_id
+         INTEGER(HID_T) :: lcpl_id_default
+         INTEGER(HID_T) :: gcpl_id_default
+         INTEGER(HID_T) :: gapl_id_default
+       END FUNCTION h5gcreate_c
+    END INTERFACE
+
+    size_hint_default = OBJECT_NAMELEN_DEFAULT_F
+    IF (PRESENT(size_hint)) size_hint_default = size_hint
+    lcpl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
+    gcpl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(gcpl_id)) gcpl_id_default = gcpl_id
+    gapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(gapl_id)) gapl_id_default = gapl_id
+
+    namelen = LEN(name)
+
+    hdferr = h5gcreate_c(loc_id, name, namelen, size_hint_default, grp_id, &
+         lcpl_id_default, gcpl_id_default, gapl_id_default)
+
+  END SUBROUTINE h5gcreate_f
+
+!!$!
+!!$!****s* H5G/
+!!$!
+!!$! NAME
+!!$!  h5gcreate2_f
+!!$!
+!!$! PURPOSE
+!!$!	Creates a new group.
+!!$!
+!!$! INPUTS
+!!$!		loc_id		- location identifier
+!!$!		name		- group name at the specified location
+!!$! OUTPUTS
+!!$!		grp_id		- group identifier
+!!$!		hdferr:		- error code
+!!$!				 	Success:  0
+!!$!				 	Failure: -1
+!!$! OPTIONAL PARAMETERS
+!!$!
+!!$!    lcpl_id  - Property list for link creation
+!!$!    gcpl_id  - Property list for group creation
+!!$!    gapl_id  - Property list for group access
+!!$!
+!!$! AUTHOR	M. Scot Breitenfeld
+!!$!		February 27, 2008
+!!$!
+!!$! HISTORY
+!!$!
+!!$! NOTES Needed to switch the first 2 arguments to avoid conflect
+!!$!          with h5gcreate1_f
+!!$!
+!!$
+!!$  SUBROUTINE h5gcreate2_f(name, loc_id, grp_id, hdferr, &
+!!$        lcpl_id, gcpl_id, gapl_id)
+!!$    IMPLICIT NONE
+!!$    CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name   ! Name of the group
+!!$    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
+!!$    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!!$    INTEGER(HID_T), INTENT(OUT) :: grp_id  ! Group identifier
+!!$
+!!$    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lcpl_id  ! Property list for link creation
+!!$    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: gcpl_id  ! Property list for group creation
+!!$    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: gapl_id  ! Property list for group access
+!!$
+!!$    INTEGER(HID_T) :: lcpl_id_default
+!!$    INTEGER(HID_T) :: gcpl_id_default
+!!$    INTEGER(HID_T) :: gapl_id_default
+!!$
+!!$    INTEGER(SIZE_T) :: OBJECT_NAME
+!  LEN_DEFAULT ! Dummy argument to pass to c call
+!!$    INTEGER :: namelen ! Length of the name character string
+!!$
+!!$!  MS FORTRAN needs explicit interface for C functions called here.
+!!$!
+!!$    INTERFACE
+!!$       INTEGER FUNCTION h5gcreate_c(loc_id, name, namelen, &
+!!$            OBJECT_NAME
+!  LEN_DEFAULT, grp_id, lcpl_id_default, gcpl_id_default, gapl_id_default)
+!!$         USE H5GLOBAL
+!!$         !DEC$IF DEFINED(HDF5F90_WINDOWS)
+!!$         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GCREATE_C'::h5gcreate_c
+!!$         !DEC$ENDIF
+!!$         !DEC$ATTRIBUTES reference :: name
+!!$         INTEGER(HID_T), INTENT(IN) :: loc_id
+!!$         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+!!$         INTEGER :: namelen
+!!$         INTEGER(SIZE_T) :: OBJECT_NAME
+!  LEN_DEFAULT
+!!$         INTEGER(HID_T) :: lcpl_id_default
+!!$         INTEGER(HID_T) :: gcpl_id_default
+!!$         INTEGER(HID_T) :: gapl_id_default
+!!$         INTEGER(HID_T), INTENT(OUT) :: grp_id
+!!$       END FUNCTION h5gcreate_c
+!!$    END INTERFACE
+!!$
+!!$    namelen = LEN(name)
+!!$    OBJECT_NAME
+!  LEN_DEFAULT = OBJECT_NAME
+!  LEN_DEFAULT_F
+!!$
+!!$    lcpl_id_default = H5P_DEFAULT_F
+!!$    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
+!!$    gcpl_id_default = H5P_DEFAULT_F
+!!$    IF(PRESENT(gcpl_id)) gcpl_id_default = gcpl_id
+!!$    gapl_id_default = H5P_DEFAULT_F
+!!$    IF(PRESENT(gapl_id)) gapl_id_default = gapl_id
+!!$
+!!$
+!!$    hdferr = h5gcreate_c(loc_id, name, namelen, OBJECT_NAME
+!  LEN_DEFAULT, grp_id, &
+!!$         lcpl_id_default, gcpl_id_default, gapl_id_default)
+!!$
+!!$  END SUBROUTINE h5gcreate2_f
+
+!
+!****s* H5G/h5gopen_f
+!
+! NAME
+!  h5gopen_f
+!
+! PURPOSE
+!  Opens an existing group.
+!
+! INPUTS
+!  loc_id 	 - location identifier
+!  name 	 - name of the group to open
+! OUTPUTS
+!  grp_id 	 - group identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  gapl_id 	 - Group access property list identifier
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 5, 2001
+!
+!  Added 1.8 (optional) parameter gapl_id
+!  February, 2008 M. Scot Breitenfeld
+!
+! SOURCE
+  SUBROUTINE h5gopen_f(loc_id, name, grp_id, hdferr, gapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the group
+    INTEGER(HID_T), INTENT(OUT) :: grp_id  ! File identifier
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: gapl_id  ! Group access property list identifier
+!*****
+    INTEGER(HID_T) :: gapl_id_default
+    INTEGER :: namelen ! Length of the name character string
+
+    INTERFACE
+       INTEGER FUNCTION h5gopen_c(loc_id, name, namelen, gapl_id_default, grp_id) &
+            BIND(C,NAME='h5gopen_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER :: namelen
+         INTEGER(HID_T), INTENT(IN) :: gapl_id_default
+         INTEGER(HID_T), INTENT(OUT) :: grp_id
+       END FUNCTION h5gopen_c
+    END INTERFACE
+
+    gapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(gapl_id)) gapl_id_default = gapl_id
+
+    namelen = LEN(name)
+    hdferr = h5gopen_c(loc_id, name, namelen, gapl_id_default, grp_id)
+
+  END SUBROUTINE h5gopen_f
+!
+!****s* H5G/h5gclose_f
+!
+! NAME
+!  h5gclose_f
+!
+! PURPOSE
+!  Closes the specified group.
+!
+! INPUTS
+!  grp_id 	 - group identifier
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 5, 2001
+!
+! SOURCE
+  SUBROUTINE h5gclose_f(grp_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: grp_id  ! Group identifier
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5gclose_c(grp_id) BIND(C,NAME='h5gclose_c')
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN) :: grp_id
+       END FUNCTION h5gclose_c
+    END INTERFACE
+
+    hdferr = h5gclose_c(grp_id)
+
+  END SUBROUTINE h5gclose_f
+!
+!****s* H5G/h5gget_obj_info_idx_f
+!
+! NAME
+!  h5gget_obj_info_idx_f
+!
+! PURPOSE
+!  Returns name and type of the group member identified by
+!  its index.
+!
+! INPUTS
+!  loc_id 	 - location identifier
+!  name 	 - name of the group at the specified location
+!  idx 	         - object index (zero-based)
+! OUTPUTS
+!  obj_name 	 - object name
+!  obj_type 	 - object type
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 5, 2001
+!
+! SOURCE
+  SUBROUTINE h5gget_obj_info_idx_f(loc_id, name, idx, &
+       obj_name, obj_type, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the group
+    INTEGER, INTENT(IN) :: idx             ! Index of member object
+    CHARACTER(LEN=*), INTENT(OUT) :: obj_name   ! Name of the object
+    INTEGER, INTENT(OUT) :: obj_type       ! Object type
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!*****
+    INTEGER :: namelen ! Length of the name character string
+    INTEGER :: obj_namelen ! Length of the obj_name character string
+
+    INTERFACE
+       INTEGER FUNCTION h5gget_obj_info_idx_c(loc_id, name, &
+            namelen, idx, &
+            obj_name, obj_namelen, obj_type) BIND(C,NAME='h5gget_obj_info_idx_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER :: namelen
+         INTEGER, INTENT(IN) :: idx
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: obj_name
+         INTEGER :: obj_namelen
+         INTEGER, INTENT(OUT) :: obj_type
+       END FUNCTION h5gget_obj_info_idx_c
+    END INTERFACE
+
+    namelen = LEN(name)
+    obj_namelen = LEN(obj_name)
+    hdferr = h5gget_obj_info_idx_c(loc_id, name, namelen, idx, &
+                                           obj_name, obj_namelen, obj_type)
+  END SUBROUTINE h5gget_obj_info_idx_f
+
+!
+!****s* H5G/h5gn_members_f
+!
+! NAME
+!  h5gn_members_f
+!
+! PURPOSE
+!  Returns the number of group members.
+!
+! INPUTS
+!  loc_id 	 - location identifier
+!  name 	 - name of the group at the specified location
+! OUTPUTS
+!  nmembers 	 - number of group members
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 5, 2001
+!
+! SOURCE
+  SUBROUTINE h5gn_members_f(loc_id, name, nmembers, hdferr)
+            IMPLICIT NONE
+            INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
+            CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the group
+            INTEGER, INTENT(OUT) :: nmembers       ! Number of members in the
+                                                   ! group
+            INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!*****
+            INTEGER :: namelen ! Length of the name character string
+
+            INTERFACE
+               INTEGER FUNCTION h5gn_members_c(loc_id, name, namelen, nmembers) &
+                    BIND(C,NAME='h5gn_members_c')
+                 IMPORT :: C_CHAR
+                 IMPORT :: HID_T
+                 INTEGER(HID_T), INTENT(IN) :: loc_id
+                 CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+                 INTEGER :: namelen
+                 INTEGER, INTENT(OUT) :: nmembers
+               END FUNCTION h5gn_members_c
+            END INTERFACE
+
+            namelen = LEN(name)
+            hdferr = h5gn_members_c(loc_id, name, namelen, nmembers)
+
+          END SUBROUTINE h5gn_members_f
+!
+!****s* H5G/h5glink_f
+!
+! NAME
+!  h5glink_f
+!
+! PURPOSE
+!  Creates a link of the specified type from new_name
+!  to current_name.
+!
+! INPUTS
+!  loc_id 	 - location identifier
+!  link_type 	 - link type; possible values are:
+!                    H5G_LINK_HARD_F (0)
+!                    H5G_LINK_SOFT_F (1)
+!  current_name  - name of the existing object if link is a
+!                  hard link. Can be anything for the soft link
+!  new_name 	 - new name for the object
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 5, 2001
+!
+! SOURCE
+  SUBROUTINE h5glink_f(loc_id, link_type, current_name, &
+       new_name, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
+    INTEGER, INTENT(IN) :: link_type       ! link type
+                                                   ! Possible values are:
+                                                   ! H5G_LINK_HARD_F (0) or
+                                                   ! H5G_LINK_SOFT_F (1)
+
+    CHARACTER(LEN=*), INTENT(IN) :: current_name
+                                                   ! Current name of an object
+    CHARACTER(LEN=*), INTENT(IN) :: new_name ! New name of an object
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!*****
+
+    INTEGER :: current_namelen ! Lenghth of the current_name string
+    INTEGER :: new_namelen     ! Lenghth of the new_name string
+
+    INTERFACE
+       INTEGER FUNCTION h5glink_c(loc_id, link_type, current_name, &
+            current_namelen, new_name, new_namelen) &
+                   BIND(C,NAME='h5glink_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         INTEGER, INTENT(IN) :: link_type
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: current_name
+         INTEGER :: current_namelen
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: new_name
+         INTEGER :: new_namelen
+       END FUNCTION h5glink_c
+    END INTERFACE
+
+    current_namelen = LEN(current_name)
+    new_namelen = LEN(new_name)
+    hdferr = h5glink_c(loc_id, link_type, current_name, &
+         current_namelen, new_name, new_namelen)
+  END SUBROUTINE h5glink_f
+
+!
+!****s* H5G/h5glink2_f
+!
+! NAME
+!  h5glink2_f
+!
+! PURPOSE
+!  Creates a link of the specified type from new_name
+!  to current_name. current_name and new_name are interpreted
+!  releative to current and new location identifiers.
+!
+! INPUTS
+!  cur_loc_id 	 - location identifier
+!  cur_name 	 - name of the existing object if link is a
+!                  hard link. Can be anything for the soft link.
+!  link_type 	 - link type; possible values are:
+!                    H5G_LINK_HARD_F (0)
+!                    H5G_LINK_SOFT_F (1)
+!  new_loc_id 	 - new location identifier
+!  new_name 	 - new name for the object
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  September 25, 2002
+!
+! SOURCE
+  SUBROUTINE h5glink2_f(cur_loc_id, cur_name, link_type, new_loc_id, &
+       new_name, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: cur_loc_id ! File or group identifier
+    CHARACTER(LEN=*), INTENT(IN) :: cur_name
+                                             ! Current name of an object
+    INTEGER, INTENT(IN) :: link_type         ! link type
+                                                 ! Possible values are:
+                                                 ! H5G_LINK_HARD_F (0) or
+                                                 ! H5G_LINK_SOFT_F (1)
+
+    INTEGER(HID_T), INTENT(IN) :: new_loc_id ! File or group identifier
+    CHARACTER(LEN=*), INTENT(IN) :: new_name ! New name of an object
+    INTEGER, INTENT(OUT) :: hdferr           ! Error code
+!*****
+
+    INTEGER :: cur_namelen ! Lenghth of the current_name string
+    INTEGER :: new_namelen ! Lenghth of the new_name string
+
+    INTERFACE
+       INTEGER FUNCTION h5glink2_c(cur_loc_id, cur_name, cur_namelen, &
+            link_type, new_loc_id, &
+            new_name, new_namelen) BIND(C,NAME='h5glink2_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN) :: cur_loc_id
+         INTEGER(HID_T), INTENT(IN) :: new_loc_id
+         INTEGER, INTENT(IN) :: link_type
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: cur_name
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: new_name
+         INTEGER :: cur_namelen
+         INTEGER :: new_namelen
+       END FUNCTION h5glink2_c
+    END INTERFACE
+
+    cur_namelen = LEN(cur_name)
+    new_namelen = LEN(new_name)
+    hdferr = h5glink2_c(cur_loc_id, cur_name, cur_namelen, link_type, &
+         new_loc_id, new_name, new_namelen)
+  END SUBROUTINE h5glink2_f
+
+!
+!****s* H5G/h5gunlink_f
+!
+! NAME
+!  h5gunlink_f
+!
+! PURPOSE
+!  Removes the specified name from the group graph and
+!  decrements the link count for the object to which name
+!  points
+!
+! INPUTS
+!  loc_id - location identifier
+!  name   - name of the object to unlink
+! OUTPUTS
+!  hdferr - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 5, 2001
+!
+! SOURCE
+  SUBROUTINE h5gunlink_f(loc_id, name, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of an object
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!*****
+    INTEGER :: namelen ! Lenghth of the name character string
+
+    INTERFACE
+       INTEGER FUNCTION h5gunlink_c(loc_id, name, namelen) BIND(C,NAME='h5gunlink_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER :: namelen
+       END FUNCTION h5gunlink_c
+    END INTERFACE
+
+    namelen = LEN(name)
+    hdferr = h5gunlink_c(loc_id, name, namelen)
+  END SUBROUTINE h5gunlink_f
+
+!
+!****s* H5G/h5gmove_f
+!
+! NAME
+!  h5gmove_f
+!
+! PURPOSE
+!  Renames an object within an HDF5 file.
+!
+! INPUTS
+!  loc_id 	 - location identifier
+!  name 	 - object's name at specified location
+!  new_name 	 - object's new name
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 5, 2001
+!
+! SOURCE
+  SUBROUTINE h5gmove_f(loc_id, name, new_name, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id     ! File or group identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name     ! Current name of an object
+    CHARACTER(LEN=*), INTENT(IN) :: new_name ! New name of an object
+    INTEGER, INTENT(OUT) :: hdferr           ! Error code
+!*****
+    INTEGER :: namelen         ! Lenghth of the current_name string
+    INTEGER :: new_namelen     ! Lenghth of the new_name string
+    
+    INTERFACE
+       INTEGER FUNCTION h5gmove_c(loc_id, name, namelen, new_name, new_namelen) BIND(C,NAME='h5gmove_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER :: namelen
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: new_name
+         INTEGER :: new_namelen
+       END FUNCTION h5gmove_c
+    END INTERFACE
+    
+    namelen = LEN(name)
+    new_namelen = LEN(new_name)
+    hdferr = h5gmove_c(loc_id, name, namelen, new_name, new_namelen)
+  END SUBROUTINE h5gmove_f
+!
+!****s* H5G/h5gmove2_f
+!
+! NAME
+!  h5gmove2_f
+!
+! PURPOSE
+!  Renames an object within an HDF5 file.
+!
+! INPUTS
+!  src_loc_id 	 - original location identifier
+!  src_name 	 - object's name at specified original location
+!  dst_loc_id 	 - original location identifier
+!  dst_name 	 - object's new name
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  September 25, 2002
+!
+! SOURCE
+  SUBROUTINE h5gmove2_f(src_loc_id, src_name, dst_loc_id, dst_name, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN)   :: src_loc_id  ! File or group identifier
+    CHARACTER(LEN=*), INTENT(IN) :: src_name    ! Original name of an object
+    INTEGER(HID_T), INTENT(IN)   :: dst_loc_id  ! File or group identifier
+    CHARACTER(LEN=*), INTENT(IN) :: dst_name    ! New name of an object
+    INTEGER, INTENT(OUT)         :: hdferr      ! Error code
+!*****
+    INTEGER :: src_namelen         ! Length of the current_name string
+    INTEGER :: dst_namelen         ! Lenghth of the new_name string
+    
+    INTERFACE
+       INTEGER FUNCTION h5gmove2_c(src_loc_id, src_name, src_namelen, &
+            dst_loc_id, dst_name, dst_namelen) BIND(C,NAME='h5gmove2_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN) :: src_loc_id
+         INTEGER(HID_T), INTENT(IN) :: dst_loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: src_name
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: dst_name
+         INTEGER :: src_namelen
+         INTEGER :: dst_namelen
+       END FUNCTION h5gmove2_c
+    END INTERFACE
+    
+    src_namelen = LEN(src_name)
+    dst_namelen = LEN(dst_name)
+    hdferr = h5gmove2_c(src_loc_id, src_name, src_namelen, dst_loc_id, dst_name, dst_namelen)
+  END SUBROUTINE h5gmove2_f
+!
+!****s* H5G/h5gget_linkval_f
+!
+! NAME
+!  h5gget_linkval_f
+!
+! PURPOSE
+!  Returns the name of the object that the symbolic link
+!  points to.
+!
+! INPUTS
+!  loc_id 	 - location identifier
+!  name 	 - symbolic link to the object whose name
+!                  is to be returned.
+!  size 	 - maximum number of characters to be returned
+! OUTPUTS
+!  buffer 	 - a buffer to hold the name of the object
+!  being sought
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 5, 2001
+!
+! SOURCE
+  SUBROUTINE h5gget_linkval_f(loc_id, name, size, buffer, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Current name of an object
+    INTEGER(SIZE_T), INTENT(IN) :: size    ! Maximum number of buffer
+    CHARACTER(LEN=size), INTENT(OUT) :: buffer
+                                           ! Buffer to hold a name of
+                                           ! the object symbolic link
+                                           ! points to
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!*****
+    INTEGER :: namelen ! Lenghth of the current_name string
+    
+    INTERFACE
+       INTEGER FUNCTION h5gget_linkval_c(loc_id, name, namelen, size, buffer) BIND(C,NAME='h5gget_linkval_c')
+         IMPORT :: C_CHAR, SIZE_T
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER :: namelen
+         INTEGER(SIZE_T), INTENT(IN) :: size
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: buffer
+       END FUNCTION h5gget_linkval_c
+    END INTERFACE
+    
+    namelen = LEN(name)
+    hdferr = h5gget_linkval_c(loc_id, name, namelen, size, buffer)
+  END SUBROUTINE h5gget_linkval_f
+
+!
+!****s* H5G/h5gset_comment_f
+!
+! NAME
+!  h5gset_comment_f
+!
+! PURPOSE
+!  Sets comment for specified object.
+!
+! INPUTS
+!  loc_id 	 - location identifier
+!  name 	 - name of the object
+!  comment 	 - comment to set for the object
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 5, 2001
+!
+! SOURCE
+  SUBROUTINE h5gset_comment_f(loc_id, name, comment, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Current name of an object
+    CHARACTER(LEN=*), INTENT(IN) :: comment ! New name of an object
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!*****
+    INTEGER :: namelen ! Lenghth of the current_name string
+    INTEGER :: commentlen     ! Lenghth of the comment string
+    
+    INTERFACE
+       INTEGER FUNCTION h5gset_comment_c(loc_id, name, namelen, &
+            comment, commentlen) BIND(C,NAME='h5gset_comment_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER :: namelen
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: comment
+         INTEGER :: commentlen
+       END FUNCTION h5gset_comment_c
+    END INTERFACE
+    
+    namelen = LEN(name)
+    commentlen = LEN(comment)
+    hdferr = h5gset_comment_c(loc_id, name, namelen, comment, commentlen)
+  END SUBROUTINE h5gset_comment_f
+!
+!****s* H5G/h5gget_comment_f
+!
+! NAME
+!  h5gget_comment_f
+!
+! PURPOSE
+!  Retrieves comment for specified object.
+!
+! INPUTS
+!  loc_id 	 - location identifier
+!  name 	 - name of the object at specified location
+!  size 	 - size of the buffer required to hold comment
+! OUTPUTS
+!  buffer 	 - buffer to hold object's comment
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 5, 2001
+!
+! SOURCE
+  SUBROUTINE h5gget_comment_f(loc_id, name, size, buffer, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Current name of an object
+    INTEGER(SIZE_T), INTENT(IN) :: size    ! Maximum number of buffer
+    CHARACTER(LEN=size), INTENT(OUT) :: buffer
+                                           ! Buffer to hold a comment
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!*****
+    INTEGER :: namelen ! Length of the current_name string
+
+    INTERFACE
+       INTEGER FUNCTION h5gget_comment_c(loc_id, name, namelen, size, buffer) BIND(C,NAME='h5gget_comment_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER :: namelen
+         INTEGER(SIZE_T), INTENT(IN) :: size
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: buffer
+       END FUNCTION h5gget_comment_c
+    END INTERFACE
+
+    namelen = LEN(name)
+    hdferr = h5gget_comment_c(loc_id, name, namelen, size, buffer)
+
+  END SUBROUTINE h5gget_comment_f
+!
+!****s* H5G/H5Gcreate_anon_f
+!
+! NAME
+!  H5Gcreate_anon_f
+!
+! PURPOSE
+!  Creates a new empty group without linking it into the file structure.
+!
+! INPUTS
+!  loc_id 	 - Location identifier
+! OUTPUTS
+!  grp_id 	 - group identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  gcpl_id 	 - Group creation property list identifier
+!  gapl_id 	 - Group access property list identifier
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 15, 2008
+!
+! SOURCE
+  SUBROUTINE h5Gcreate_anon_f(loc_id, grp_id, hdferr, gcpl_id, gapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
+    INTEGER(HID_T), INTENT(OUT) :: grp_id  ! Group identifier
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: gcpl_id  ! Property list for group creation
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: gapl_id  ! Property list for group access
+!*****
+    INTEGER(HID_T) :: gcpl_id_default
+    INTEGER(HID_T) :: gapl_id_default
+
+    INTERFACE
+       INTEGER FUNCTION h5gcreate_anon_c(loc_id, gcpl_id_default, gapl_id_default, grp_id) &
+            BIND(C,NAME='h5gcreate_anon_c')
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
+         INTEGER(HID_T), INTENT(IN) :: gcpl_id_default  ! Property list for group creation
+         INTEGER(HID_T), INTENT(IN) :: gapl_id_default  ! Property list for group access
+         INTEGER(HID_T), INTENT(OUT) :: grp_id  ! Group identifier
+       END FUNCTION h5gcreate_anon_c
+    END INTERFACE
+
+    gcpl_id_default = H5P_DEFAULT_F
+    gapl_id_default = H5P_DEFAULT_F
+
+    IF(PRESENT(gcpl_id)) gcpl_id_default = gcpl_id
+    IF(PRESENT(gapl_id)) gapl_id_default = gapl_id
+
+    hdferr = h5gcreate_anon_c(loc_id, gcpl_id_default, gapl_id_default, grp_id)
+
+  END SUBROUTINE h5Gcreate_anon_f
+!
+!****s* H5G/H5Gget_create_plist_f
+!
+! NAME
+!  H5Gget_create_plist_f
+!
+! PURPOSE
+!  Gets a group creation property list identifier.
+!
+! INPUTS
+!  grp_id 	 - group identifier
+! OUTPUTS
+!  gcpl_id 	 - Group creation property list identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 15, 2008
+!
+! SOURCE
+  SUBROUTINE h5gget_create_plist_f(grp_id, gcpl_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN)  :: grp_id  ! Group identifier
+    INTEGER(HID_T), INTENT(OUT) :: gcpl_id ! Property list for group creation
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5gget_create_plist_c(grp_id, gcpl_id ) BIND(C,NAME='h5gget_create_plist_c')
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN)  :: grp_id
+         INTEGER(HID_T), INTENT(OUT) :: gcpl_id
+       END FUNCTION h5gget_create_plist_c
+    END INTERFACE
+
+    hdferr = h5gget_create_plist_c(grp_id, gcpl_id )
+
+  END SUBROUTINE h5gget_create_plist_f
+
+!
+!****s* H5G/h5gget_info_f
+!
+! NAME
+!  h5gget_info_f
+!
+! PURPOSE
+!  Retrieves information about a group
+!
+! INPUTS
+!  group_id 	 - Group identifier
+!
+! OUTPUTS  
+!  storage_type  - Type of storage for links in group
+!                    H5G_STORAGE_TYPE_COMPACT: Compact storage
+!                    H5G_STORAGE_TYPE_DENSE: Indexed storage
+!                    H5G_STORAGE_TYPE_SYMBOL_TABLE: Symbol tables, the original HDF5 structure
+!  nlinks 	 - Number of links in group
+!  max_corder 	 - Current maximum creation order value for group
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  mounted 	 - Whether group has a file mounted on it
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 15, 2008
+!
+! NOTES
+!  In C the output is defined as a structure: H5G_info_t
+!
+! HISTORY
+!
+!  - Added 'mounted' paramater
+!    M. Scot Breitenfeld
+!    July 16, 2008
+!
+! SOURCE
+  SUBROUTINE h5gget_info_f(group_id, storage_type, nlinks, max_corder, hdferr, mounted)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: group_id ! Group identifier
+
+    INTEGER, INTENT(OUT) :: storage_type  ! Type of storage for links in group:
+                                          ! H5G_STORAGE_TYPE_COMPACT_F: Compact storage
+                                          ! H5G_STORAGE_TYPE_DENSE_F: Indexed storage
+                                          ! H5G_STORAGE_TYPE_SYMBOL_TABLE_F: Symbol tables, the original HDF5 structure
+    INTEGER, INTENT(OUT) :: nlinks        ! Number of links in group
+    INTEGER, INTENT(OUT) :: max_corder    ! Current maximum creation order value for group
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code:
+                                          ! 0 on success and -1 on failure
+    LOGICAL, INTENT(OUT), OPTIONAL :: mounted  ! Whether group has a file mounted on it
+!*****
+    INTEGER :: mounted_c
+
+    INTERFACE
+       INTEGER FUNCTION h5gget_info_c(group_id, storage_type, nlinks, max_corder, mounted_c) &
+            BIND(C,NAME='h5gget_info_c')
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN) :: group_id
+         INTEGER, INTENT(OUT) :: storage_type
+         INTEGER, INTENT(OUT) :: nlinks
+         INTEGER, INTENT(OUT) :: max_corder
+         INTEGER :: mounted_c
+       END FUNCTION h5gget_info_c
+    END INTERFACE
+
+    hdferr = h5gget_info_c(group_id, storage_type, nlinks, max_corder, mounted_c)
+
+    IF(PRESENT(mounted))THEN
+       IF(mounted_c.EQ.0) THEN
+          mounted = .FALSE.
+       ELSE
+          mounted = .TRUE.
+       ENDIF
+    ENDIF
+
+  END SUBROUTINE h5gget_info_f
+!
+!****s* H5G/h5gget_info_by_idx_f
+!
+! NAME
+!  h5gget_info_by_idx_f
+!
+! PURPOSE
+!  Retrieves information about a group, according to the group’s position within an index.
+!
+! INPUTS
+!  loc_id 	 - File or group identifier
+!  group_name 	 - Name of group containing group for which information is to be retrieved
+!  index_type 	 - Index type
+!  order 	 - Order of the count in the index
+!  n 	         - Position in the index of the group for which information is retrieved
+!
+! OUTPUTS
+!  storage_type  - Type of storage for links in group
+!                    H5G_STORAGE_TYPE_COMPACT: Compact storage
+!                    H5G_STORAGE_TYPE_DENSE: Indexed storage
+!                    H5G_STORAGE_TYPE_SYMBOL_TABLE: Symbol tables, the original HDF5 structure
+!  nlinks 	 - Number of links in group
+!  max_corder 	 - Current maximum creation order value for group
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  lapl_id 	 - Link access property list
+!  mounted 	 - Whether group has a file mounted on it
+!
+! NOTES
+!  In C the output is defined as a structure: H5G_info_t
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 18, 2008
+!
+! HISTORY
+!  Added 'mounted' paramater
+!  M. Scot Breitenfeld
+!  July 16, 2008
+!
+! SOURCE
+  SUBROUTINE h5gget_info_by_idx_f(loc_id, group_name, index_type, order, n, &
+       storage_type, nlinks, max_corder, hdferr, lapl_id, mounted)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id       ! File or group identifier
+    CHARACTER(LEN=*), INTENT(IN) :: group_name ! Name of group containing group for which information is to be retrieved
+    INTEGER, INTENT(IN) :: index_type ! Index type
+    INTEGER, INTENT(IN) :: order      ! Order of the count in the index
+    INTEGER(HSIZE_T), INTENT(IN) :: n ! Position in the index of the group for which information is retrieved
+
+    INTEGER, INTENT(OUT) :: storage_type ! Type of storage for links in group:
+                                         !   H5G_STORAGE_TYPE_COMPACT_F: Compact storage
+                                         !   H5G_STORAGE_TYPE_DENSE_F: Indexed storage
+                                         !   H5G_STORAGE_TYPE_SYMBOL_TABLE_F: Symbol tables, the original HDF5 structure
+    INTEGER, INTENT(OUT) :: nlinks      ! Number of links in group
+    INTEGER, INTENT(OUT) :: max_corder  ! Current maximum creation order value for group
+    INTEGER, INTENT(OUT) :: hdferr      ! Error code:
+                                        ! 0 on success and -1 on failure
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list
+    LOGICAL, INTENT(OUT), OPTIONAL :: mounted       ! Whether group has a file mounted on it
+!*****
+    INTEGER :: mounted_c
+    INTEGER(HID_T) :: lapl_id_default
+    INTEGER(SIZE_T) :: group_name_len ! length of group name
+
+    INTERFACE
+       INTEGER FUNCTION h5gget_info_by_idx_c(loc_id, group_name, group_name_len, index_type, order, n, lapl_id_default, &
+            storage_type, nlinks, max_corder, mounted_c) BIND(C,NAME='h5gget_info_by_idx_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: group_name
+         INTEGER, INTENT(IN) :: index_type
+         INTEGER, INTENT(IN) :: order
+         INTEGER(HSIZE_T), INTENT(IN) :: n
+         INTEGER(HID_T) :: lapl_id_default
+         INTEGER, INTENT(OUT) :: storage_type
+         INTEGER, INTENT(OUT) :: nlinks
+         INTEGER, INTENT(OUT) :: max_corder
+
+         INTEGER(SIZE_T) :: group_name_len
+         INTEGER :: mounted_c
+
+       END FUNCTION h5gget_info_by_idx_c
+    END INTERFACE
+
+    group_name_len = LEN(group_name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = h5gget_info_by_idx_c(loc_id, group_name, group_name_len, &
+         index_type, order, n, lapl_id_default, &
+         storage_type, nlinks, max_corder, mounted_c)
+
+    IF(PRESENT(mounted))THEN
+       IF(mounted_c.EQ.0) THEN
+          mounted = .FALSE.
+       ELSE
+          mounted = .TRUE.
+       ENDIF
+    ENDIF
+
+  END SUBROUTINE h5gget_info_by_idx_f
+!
+!****s* H5G/h5gget_info_by_name_f
+!
+! NAME
+!  h5gget_info_by_name_f
+!
+! PURPOSE
+!  Retrieves information about a group.
+!
+! INPUTS
+!  loc_id 	 - File or group identifier
+!  group_name 	 - Name of group containing group for which information is to be retrieved
+!
+! OUTPUTS
+!
+!  storage_type  - Type of storage for links in group
+!                    H5G_STORAGE_TYPE_COMPACT: Compact storage
+!                    H5G_STORAGE_TYPE_DENSE: Indexed storage
+!                    H5G_STORAGE_TYPE_SYMBOL_TABLE: Symbol tables, the original HDF5 structure
+!  nlinks 	 - Number of links in group
+!  max_corder 	 - Current maximum creation order value for group
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  lapl_id 	 - Link access property list
+!  mounted 	 - Whether group has a file mounted on it
+!
+! NOTES
+!  In C the output is defined as a structure: H5G_info_t
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 18, 2008
+!
+! HISTORY
+!  Added 'mounted' paramater
+!  M. Scot Breitenfeld
+!  July 16, 2008
+! SOURCE
+  SUBROUTINE h5gget_info_by_name_f(loc_id, group_name, &
+       storage_type, nlinks, max_corder, hdferr, lapl_id, mounted)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id       ! File or group identifier
+    CHARACTER(LEN=*), INTENT(IN) :: group_name ! Name of group containing group for which information is to be retrieved
+
+    INTEGER, INTENT(OUT) :: storage_type  ! Type of storage for links in group:
+                                          ! H5G_STORAGE_TYPE_COMPACT_F: Compact storage
+                                          ! H5G_STORAGE_TYPE_DENSE_F: Indexed storage
+                                          ! H5G_STORAGE_TYPE_SYMBOL_TABLE_F: Symbol tables, the original HDF5 structure
+    INTEGER, INTENT(OUT) :: nlinks        ! Number of links in group
+    INTEGER, INTENT(OUT) :: max_corder    ! Current maximum creation order value for group
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code:
+                                          !   0 on success and -1 on failure
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list
+    LOGICAL, INTENT(OUT), OPTIONAL :: mounted       ! Whether group has a file mounted on it
+!*****
+    INTEGER :: mounted_c
+    INTEGER(HID_T) :: lapl_id_default
+    INTEGER(SIZE_T) :: group_name_len ! length of group name
+
+    INTERFACE
+       INTEGER FUNCTION h5gget_info_by_name_c(loc_id, group_name, group_name_len, lapl_id_default, &
+            storage_type, nlinks, max_corder, mounted_c) BIND(C,NAME='h5gget_info_by_name_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: group_name
+         INTEGER(HID_T), INTENT(IN) :: lapl_id_default
+         INTEGER, INTENT(OUT) :: storage_type
+         INTEGER, INTENT(OUT) :: nlinks
+         INTEGER, INTENT(OUT) :: max_corder
+
+         INTEGER(SIZE_T) :: group_name_len
+         INTEGER :: mounted_c
+
+       END FUNCTION h5gget_info_by_name_c
+    END INTERFACE
+
+    group_name_len = LEN(group_name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = h5gget_info_by_name_c(loc_id, group_name, group_name_len, lapl_id_default, &
+         storage_type, nlinks, max_corder, mounted_c)
+
+    IF(PRESENT(mounted))THEN
+       IF(mounted_c.EQ.0) THEN
+          mounted = .FALSE.
+       ELSE
+          mounted = .TRUE.
+       ENDIF
+    ENDIF
+
+  END SUBROUTINE h5gget_info_by_name_f
+
+END MODULE H5G
diff --git a/fortran/src/H5Gff.f90 b/fortran/src/H5Gff.f90
deleted file mode 100644
index d4d7496..0000000
--- a/fortran/src/H5Gff.f90
+++ /dev/null
@@ -1,1331 +0,0 @@
-!****h* ROBODoc/H5G
-!
-! NAME
-!  MODULE H5G
-!
-! FILE
-!  fortran/src/H5Gff.f90
-!
-! PURPOSE
-!  This file contains Fortran interfaces for H5G functions.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5G function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5G
-  USE H5GLOBAL
-
-!  PRIVATE :: h5gcreate1_f
-!  PRIVATE :: h5gcreate2_f
-
-!  INTERFACE h5gcreate_f
-!  MODULE PROCEDURE h5gcreate1_f
-!  MODULE PROCEDURE h5gcreate2_f
-!  END INTERFACE
-
-CONTAINS
-
-!****s* H5G/h5gcreate_f
-!
-! NAME
-!  h5gcreate_f
-!
-! PURPOSE
-!  Creates a new group.
-!
-! INPUTS
-!  loc_id 	 - location identifier
-!  name 	 - group name at the specified location
-! OUTPUTS
-!  grp_id 	 - group identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  size_hint 	 - a parameter indicating the number of bytes to
-!                  reserve for the names that will appear in the group
-!  lcpl_id 	 - Property list for link creation
-!  gcpl_id 	 - Property list for group creation
-!  gapl_id 	 - Property list for group access
-!
-! AUTHOR	
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY 	
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 5, 2001
-!
-!  Added additional optional paramaters in 1.8
-!  MSB - February 27, 2008
-!
-! SOURCE
-  SUBROUTINE h5gcreate_f(loc_id, name, grp_id, hdferr, size_hint, lcpl_id, gcpl_id, gapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the group
-    INTEGER(HID_T), INTENT(OUT) :: grp_id  ! Group identifier
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-    INTEGER(SIZE_T), OPTIONAL, INTENT(IN) :: size_hint
-                                           ! Parameter indicating
-                                           ! the number of bytes
-                                           ! to reserve for the
-                                           ! names that will appear
-                                           ! in the group. Set to OBJECT_NAMELEN_DEFAULT_F
-                                           ! if using any of the optional
-                                           ! parameters lcpl_id, gcpl_id, and/or gapl_id when not
-                                           ! using keywords in specifying the optional parameters
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lcpl_id  ! Property list for link creation
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: gcpl_id  ! Property list for group creation
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: gapl_id  ! Property list for group access
-!*****
-    INTEGER(HID_T) :: lcpl_id_default
-    INTEGER(HID_T) :: gcpl_id_default
-    INTEGER(HID_T) :: gapl_id_default
-
-    INTEGER :: namelen ! Length of the name character string
-    INTEGER(SIZE_T) :: size_hint_default
-
-    INTERFACE
-       INTEGER FUNCTION h5gcreate_c(loc_id, name, namelen, &
-            size_hint_default, grp_id, lcpl_id_default, gcpl_id_default, gapl_id_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GCREATE_C'::h5gcreate_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER :: namelen
-         INTEGER(SIZE_T) :: size_hint_default
-         INTEGER(HID_T), INTENT(OUT) :: grp_id
-         INTEGER(HID_T) :: lcpl_id_default
-         INTEGER(HID_T) :: gcpl_id_default
-         INTEGER(HID_T) :: gapl_id_default
-       END FUNCTION h5gcreate_c
-    END INTERFACE
-
-    size_hint_default = OBJECT_NAMELEN_DEFAULT_F
-    IF (PRESENT(size_hint)) size_hint_default = size_hint
-    lcpl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
-    gcpl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(gcpl_id)) gcpl_id_default = gcpl_id
-    gapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(gapl_id)) gapl_id_default = gapl_id
-
-    namelen = LEN(name)
-
-    hdferr = h5gcreate_c(loc_id, name, namelen, size_hint_default, grp_id, &
-         lcpl_id_default, gcpl_id_default, gapl_id_default)
-
-  END SUBROUTINE h5gcreate_f
-
-!!$!
-!!$!****s* H5G/
-!!$!
-!!$! NAME
-!!$!  h5gcreate2_f
-!!$!
-!!$! PURPOSE
-!!$!	Creates a new group.
-!!$!
-!!$! INPUTS
-!!$!		loc_id		- location identifier
-!!$!		name		- group name at the specified location
-!!$! OUTPUTS
-!!$!		grp_id		- group identifier
-!!$!		hdferr:		- error code
-!!$!				 	Success:  0
-!!$!				 	Failure: -1
-!!$! OPTIONAL PARAMETERS
-!!$!
-!!$!    lcpl_id  - Property list for link creation
-!!$!    gcpl_id  - Property list for group creation
-!!$!    gapl_id  - Property list for group access
-!!$!
-!!$! AUTHOR	M. Scot Breitenfeld
-!!$!		February 27, 2008
-!!$!
-!!$! HISTORY
-!!$!
-!!$! NOTES Needed to switch the first 2 arguments to avoid conflect
-!!$!          with h5gcreate1_f
-!!$!
-!!$
-!!$  SUBROUTINE h5gcreate2_f(name, loc_id, grp_id, hdferr, &
-!!$        lcpl_id, gcpl_id, gapl_id)
-!!$    IMPLICIT NONE
-!!$    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the group
-!!$    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
-!!$    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!!$    INTEGER(HID_T), INTENT(OUT) :: grp_id  ! Group identifier
-!!$
-!!$    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lcpl_id  ! Property list for link creation
-!!$    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: gcpl_id  ! Property list for group creation
-!!$    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: gapl_id  ! Property list for group access
-!!$
-!!$    INTEGER(HID_T) :: lcpl_id_default
-!!$    INTEGER(HID_T) :: gcpl_id_default
-!!$    INTEGER(HID_T) :: gapl_id_default
-!!$
-!!$    INTEGER(SIZE_T) :: OBJECT_NAME
-!  LEN_DEFAULT ! Dummy argument to pass to c call
-!!$    INTEGER :: namelen ! Length of the name character string
-!!$
-!!$!  MS FORTRAN needs explicit interface for C functions called here.
-!!$!
-!!$    INTERFACE
-!!$       INTEGER FUNCTION h5gcreate_c(loc_id, name, namelen, &
-!!$            OBJECT_NAME
-!  LEN_DEFAULT, grp_id, lcpl_id_default, gcpl_id_default, gapl_id_default)
-!!$         USE H5GLOBAL
-!!$         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-!!$         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GCREATE_C'::h5gcreate_c
-!!$         !DEC$ENDIF
-!!$         !DEC$ATTRIBUTES reference :: name
-!!$         INTEGER(HID_T), INTENT(IN) :: loc_id
-!!$         CHARACTER(LEN=*), INTENT(IN) :: name
-!!$         INTEGER :: namelen
-!!$         INTEGER(SIZE_T) :: OBJECT_NAME
-!  LEN_DEFAULT
-!!$         INTEGER(HID_T) :: lcpl_id_default
-!!$         INTEGER(HID_T) :: gcpl_id_default
-!!$         INTEGER(HID_T) :: gapl_id_default
-!!$         INTEGER(HID_T), INTENT(OUT) :: grp_id
-!!$       END FUNCTION h5gcreate_c
-!!$    END INTERFACE
-!!$
-!!$    namelen = LEN(name)
-!!$    OBJECT_NAME
-!  LEN_DEFAULT = OBJECT_NAME
-!  LEN_DEFAULT_F
-!!$
-!!$    lcpl_id_default = H5P_DEFAULT_F
-!!$    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
-!!$    gcpl_id_default = H5P_DEFAULT_F
-!!$    IF(PRESENT(gcpl_id)) gcpl_id_default = gcpl_id
-!!$    gapl_id_default = H5P_DEFAULT_F
-!!$    IF(PRESENT(gapl_id)) gapl_id_default = gapl_id
-!!$
-!!$
-!!$    hdferr = h5gcreate_c(loc_id, name, namelen, OBJECT_NAME
-!  LEN_DEFAULT, grp_id, &
-!!$         lcpl_id_default, gcpl_id_default, gapl_id_default)
-!!$
-!!$  END SUBROUTINE h5gcreate2_f
-
-!
-!****s* H5G/h5gopen_f
-!
-! NAME
-!  h5gopen_f
-!
-! PURPOSE
-!  Opens an existing group.
-!
-! INPUTS
-!  loc_id 	 - location identifier
-!  name 	 - name of the group to open
-! OUTPUTS
-!  grp_id 	 - group identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  gapl_id 	 - Group access property list identifier
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 5, 2001
-!
-!  Added 1.8 (optional) parameter gapl_id
-!  February, 2008 M. Scot Breitenfeld
-!
-! SOURCE
-  SUBROUTINE h5gopen_f(loc_id, name, grp_id, hdferr, gapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the group
-    INTEGER(HID_T), INTENT(OUT) :: grp_id  ! File identifier
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: gapl_id  ! Group access property list identifier
-!*****
-    INTEGER(HID_T) :: gapl_id_default
-    INTEGER :: namelen ! Length of the name character string
-
-    INTERFACE
-       INTEGER FUNCTION h5gopen_c(loc_id, name, namelen, gapl_id_default, grp_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GOPEN_C'::h5gopen_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER :: namelen
-         INTEGER(HID_T), INTENT(IN) :: gapl_id_default
-         INTEGER(HID_T), INTENT(OUT) :: grp_id
-       END FUNCTION h5gopen_c
-    END INTERFACE
-
-    gapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(gapl_id)) gapl_id_default = gapl_id
-
-    namelen = LEN(name)
-    hdferr = h5gopen_c(loc_id, name, namelen, gapl_id_default, grp_id)
-
-  END SUBROUTINE h5gopen_f
-!
-!****s* H5G/h5gclose_f
-!
-! NAME
-!  h5gclose_f
-!
-! PURPOSE
-!  Closes the specified group.
-!
-! INPUTS
-!  grp_id 	 - group identifier
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 5, 2001
-!
-! SOURCE
-  SUBROUTINE h5gclose_f(grp_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: grp_id  ! Group identifier
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5gclose_c(grp_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GCLOSE_C'::h5gclose_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: grp_id
-       END FUNCTION h5gclose_c
-    END INTERFACE
-
-    hdferr = h5gclose_c(grp_id)
-
-  END SUBROUTINE h5gclose_f
-!
-!****s* H5G/h5gget_obj_info_idx_f
-!
-! NAME
-!  h5gget_obj_info_idx_f
-!
-! PURPOSE
-!  Returns name and type of the group member identified by
-!  its index.
-!
-! INPUTS
-!  loc_id 	 - location identifier
-!  name 	 - name of the group at the specified location
-!  idx 	         - object index (zero-based)
-! OUTPUTS
-!  obj_name 	 - object name
-!  obj_type 	 - object type
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 5, 2001
-!
-! SOURCE
-  SUBROUTINE h5gget_obj_info_idx_f(loc_id, name, idx, &
-       obj_name, obj_type, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the group
-    INTEGER, INTENT(IN) :: idx             ! Index of member object
-    CHARACTER(LEN=*), INTENT(OUT) :: obj_name   ! Name of the object
-    INTEGER, INTENT(OUT) :: obj_type       ! Object type
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-    INTEGER :: namelen ! Length of the name character string
-    INTEGER :: obj_namelen ! Length of the obj_name character string
-
-    INTERFACE
-       INTEGER FUNCTION h5gget_obj_info_idx_c(loc_id, name, &
-            namelen, idx, &
-            obj_name, obj_namelen, obj_type)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GGET_OBJ_INFO_IDX_C'::h5gget_obj_info_idx_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         !DEC$ATTRIBUTES reference :: obj_name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER :: namelen
-         INTEGER, INTENT(IN) :: idx
-         CHARACTER(LEN=*), INTENT(OUT) :: obj_name
-         INTEGER :: obj_namelen
-         INTEGER, INTENT(OUT) :: obj_type
-       END FUNCTION h5gget_obj_info_idx_c
-    END INTERFACE
-
-    namelen = LEN(name)
-    obj_namelen = LEN(obj_name)
-    hdferr = h5gget_obj_info_idx_c(loc_id, name, namelen, idx, &
-                                           obj_name, obj_namelen, obj_type)
-  END SUBROUTINE h5gget_obj_info_idx_f
-
-!
-!****s* H5G/h5gn_members_f
-!
-! NAME
-!  h5gn_members_f
-!
-! PURPOSE
-!  Returns the number of group members.
-!
-! INPUTS
-!  loc_id 	 - location identifier
-!  name 	 - name of the group at the specified location
-! OUTPUTS
-!  nmembers 	 - number of group members
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 5, 2001
-!
-! SOURCE
-  SUBROUTINE h5gn_members_f(loc_id, name, nmembers, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
-            CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the group
-            INTEGER, INTENT(OUT) :: nmembers       ! Number of members in the
-                                                   ! group
-            INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-            INTEGER :: namelen ! Length of the name character string
-
-            INTERFACE
-              INTEGER FUNCTION h5gn_members_c(loc_id, name, namelen, nmembers)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GN_MEMBERS_C'::h5gn_members_c
-              !DEC$ENDIF
-              !DEC$ATTRIBUTES reference :: name
-              INTEGER(HID_T), INTENT(IN) :: loc_id
-              CHARACTER(LEN=*), INTENT(IN) :: name
-              INTEGER :: namelen
-              INTEGER, INTENT(OUT) :: nmembers
-              END FUNCTION h5gn_members_c
-            END INTERFACE
-
-            namelen = LEN(name)
-            hdferr = h5gn_members_c(loc_id, name, namelen, nmembers)
-
-          END SUBROUTINE h5gn_members_f
-!
-!****s* H5G/h5glink_f
-!
-! NAME
-!  h5glink_f
-!
-! PURPOSE
-!  Creates a link of the specified type from new_name
-!  to current_name.
-!
-! INPUTS
-!  loc_id 	 - location identifier
-!  link_type 	 - link type; possible values are:
-!                    H5G_LINK_HARD_F (0)
-!                    H5G_LINK_SOFT_F (1)
-!  current_name  - name of the existing object if link is a
-!                  hard link. Can be anything for the soft link
-!  new_name 	 - new name for the object
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 5, 2001
-!
-! SOURCE
-  SUBROUTINE h5glink_f(loc_id, link_type, current_name, &
-       new_name, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
-    INTEGER, INTENT(IN) :: link_type       ! link type
-                                                   ! Possible values are:
-                                                   ! H5G_LINK_HARD_F (0) or
-                                                   ! H5G_LINK_SOFT_F (1)
-
-    CHARACTER(LEN=*), INTENT(IN) :: current_name
-                                                   ! Current name of an object
-    CHARACTER(LEN=*), INTENT(IN) :: new_name ! New name of an object
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-
-    INTEGER :: current_namelen ! Lenghth of the current_name string
-    INTEGER :: new_namelen     ! Lenghth of the new_name string
-
-    INTERFACE
-       INTEGER FUNCTION h5glink_c(loc_id, link_type, current_name, &
-            current_namelen, new_name, new_namelen)
-
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GLINK_C'::h5glink_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: current_name
-         !DEC$ATTRIBUTES reference :: new_name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         INTEGER, INTENT(IN) :: link_type
-         CHARACTER(LEN=*), INTENT(IN) :: current_name
-         INTEGER :: current_namelen
-         CHARACTER(LEN=*), INTENT(IN) :: new_name
-         INTEGER :: new_namelen
-       END FUNCTION h5glink_c
-    END INTERFACE
-
-    current_namelen = LEN(current_name)
-    new_namelen = LEN(new_name)
-    hdferr = h5glink_c(loc_id, link_type, current_name, &
-         current_namelen, new_name, new_namelen)
-  END SUBROUTINE h5glink_f
-
-!
-!****s* H5G/h5glink2_f
-!
-! NAME
-!  h5glink2_f
-!
-! PURPOSE
-!  Creates a link of the specified type from new_name
-!  to current_name. current_name and new_name are interpreted
-!  releative to current and new location identifiers.
-!
-! INPUTS
-!  cur_loc_id 	 - location identifier
-!  cur_name 	 - name of the existing object if link is a
-!                  hard link. Can be anything for the soft link.
-!  link_type 	 - link type; possible values are:
-!                    H5G_LINK_HARD_F (0)
-!                    H5G_LINK_SOFT_F (1)
-!  new_loc_id 	 - new location identifier
-!  new_name 	 - new name for the object
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  September 25, 2002
-!
-! SOURCE
-  SUBROUTINE h5glink2_f(cur_loc_id, cur_name, link_type, new_loc_id, &
-       new_name, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: cur_loc_id ! File or group identifier
-    CHARACTER(LEN=*), INTENT(IN) :: cur_name
-                                             ! Current name of an object
-    INTEGER, INTENT(IN) :: link_type         ! link type
-                                                 ! Possible values are:
-                                                 ! H5G_LINK_HARD_F (0) or
-                                                 ! H5G_LINK_SOFT_F (1)
-
-    INTEGER(HID_T), INTENT(IN) :: new_loc_id ! File or group identifier
-    CHARACTER(LEN=*), INTENT(IN) :: new_name ! New name of an object
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-!*****
-
-    INTEGER :: cur_namelen ! Lenghth of the current_name string
-    INTEGER :: new_namelen ! Lenghth of the new_name string
-
-    INTERFACE
-       INTEGER FUNCTION h5glink2_c(cur_loc_id, cur_name, cur_namelen, &
-            link_type, new_loc_id, &
-            new_name, new_namelen)
-
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GLINK2_C'::h5glink2_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: cur_name
-         !DEC$ATTRIBUTES reference :: new_name
-         INTEGER(HID_T), INTENT(IN) :: cur_loc_id
-         INTEGER(HID_T), INTENT(IN) :: new_loc_id
-         INTEGER, INTENT(IN) :: link_type
-         CHARACTER(LEN=*), INTENT(IN) :: cur_name
-         CHARACTER(LEN=*), INTENT(IN) :: new_name
-         INTEGER :: cur_namelen
-         INTEGER :: new_namelen
-       END FUNCTION h5glink2_c
-    END INTERFACE
-
-    cur_namelen = LEN(cur_name)
-    new_namelen = LEN(new_name)
-    hdferr = h5glink2_c(cur_loc_id, cur_name, cur_namelen, link_type, &
-         new_loc_id, new_name, new_namelen)
-  END SUBROUTINE h5glink2_f
-
-!
-!****s* H5G/h5gunlink_f
-!
-! NAME
-!  h5gunlink_f
-!
-! PURPOSE
-!  Removes the specified name from the group graph and
-!  decrements the link count for the object to which name
-!  points
-!
-! INPUTS
-!  loc_id 	 - location identifier
-!  name 	 - name of the object to unlink
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 5, 2001
-!
-! SOURCE
-  SUBROUTINE h5gunlink_f(loc_id, name, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of an object
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-    INTEGER :: namelen ! Lenghth of the name character string
-
-    INTERFACE
-       INTEGER FUNCTION h5gunlink_c(loc_id, name, namelen)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GUNLINK_C'::h5gunlink_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER :: namelen
-       END FUNCTION h5gunlink_c
-    END INTERFACE
-
-    namelen = LEN(name)
-    hdferr = h5gunlink_c(loc_id, name, namelen)
-  END SUBROUTINE h5gunlink_f
-
-!
-!****s* H5G/h5gmove_f
-!
-! NAME
-!  h5gmove_f
-!
-! PURPOSE
-!  Renames an object within an HDF5 file.
-!
-! INPUTS
-!  loc_id 	 - location identifier
-!  name 	 - object's name at specified location
-!  new_name 	 - object's new name
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 5, 2001
-!
-! SOURCE
-  SUBROUTINE h5gmove_f(loc_id, name, new_name, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id     ! File or group identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name     ! Current name of an object
-    CHARACTER(LEN=*), INTENT(IN) :: new_name ! New name of an object
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-!*****
-    INTEGER :: namelen         ! Lenghth of the current_name string
-    INTEGER :: new_namelen     ! Lenghth of the new_name string
-    
-    INTERFACE
-       INTEGER FUNCTION h5gmove_c(loc_id, name, namelen, new_name, new_namelen)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GMOVE_C'::h5gmove_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         !DEC$ATTRIBUTES reference :: new_name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER :: namelen
-         CHARACTER(LEN=*), INTENT(IN) :: new_name
-         INTEGER :: new_namelen
-       END FUNCTION h5gmove_c
-    END INTERFACE
-    
-    namelen = LEN(name)
-    new_namelen = LEN(new_name)
-    hdferr = h5gmove_c(loc_id, name, namelen, new_name, new_namelen)
-  END SUBROUTINE h5gmove_f
-!
-!****s* H5G/h5gmove2_f
-!
-! NAME
-!  h5gmove2_f
-!
-! PURPOSE
-!  Renames an object within an HDF5 file.
-!
-! INPUTS
-!  src_loc_id 	 - original location identifier
-!  src_name 	 - object's name at specified original location
-!  dst_loc_id 	 - original location identifier
-!  dst_name 	 - object's new name
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  September 25, 2002
-!
-! SOURCE
-  SUBROUTINE h5gmove2_f(src_loc_id, src_name, dst_loc_id, dst_name, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN)   :: src_loc_id  ! File or group identifier
-    CHARACTER(LEN=*), INTENT(IN) :: src_name    ! Original name of an object
-    INTEGER(HID_T), INTENT(IN)   :: dst_loc_id  ! File or group identifier
-    CHARACTER(LEN=*), INTENT(IN) :: dst_name    ! New name of an object
-    INTEGER, INTENT(OUT)         :: hdferr      ! Error code
-!*****
-    INTEGER :: src_namelen         ! Length of the current_name string
-    INTEGER :: dst_namelen         ! Lenghth of the new_name string
-    
-    INTERFACE
-       INTEGER FUNCTION h5gmove2_c(src_loc_id, src_name, src_namelen, &
-            dst_loc_id, dst_name, dst_namelen)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GMOVE2_C'::h5gmove2_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: src_name
-         !DEC$ATTRIBUTES reference :: dst_name
-         INTEGER(HID_T), INTENT(IN) :: src_loc_id
-         INTEGER(HID_T), INTENT(IN) :: dst_loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: src_name
-         CHARACTER(LEN=*), INTENT(IN) :: dst_name
-         INTEGER :: src_namelen
-         INTEGER :: dst_namelen
-       END FUNCTION h5gmove2_c
-    END INTERFACE
-    
-    src_namelen = LEN(src_name)
-    dst_namelen = LEN(dst_name)
-    hdferr = h5gmove2_c(src_loc_id, src_name, src_namelen, dst_loc_id, dst_name, dst_namelen)
-  END SUBROUTINE h5gmove2_f
-!
-!****s* H5G/h5gget_linkval_f
-!
-! NAME
-!  h5gget_linkval_f
-!
-! PURPOSE
-!  Returns the name of the object that the symbolic link
-!  points to.
-!
-! INPUTS
-!  loc_id 	 - location identifier
-!  name 	 - symbolic link to the object whose name
-!                  is to be returned.
-!  size 	 - maximum number of characters to be returned
-! OUTPUTS
-!  buffer 	 - a buffer to hold the name of the object
-!  being sought
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 5, 2001
-!
-! SOURCE
-  SUBROUTINE h5gget_linkval_f(loc_id, name, size, buffer, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Current name of an object
-    INTEGER(SIZE_T), INTENT(IN) :: size    ! Maximum number of buffer
-    CHARACTER(LEN=size), INTENT(OUT) :: buffer
-                                           ! Buffer to hold a name of
-                                           ! the object symbolic link
-                                           ! points to
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-    INTEGER :: namelen ! Lenghth of the current_name string
-    
-    INTERFACE
-       INTEGER FUNCTION h5gget_linkval_c(loc_id, name, namelen, size, buffer)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GGET_LINKVAL_C'::h5gget_linkval_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         !DEC$ATTRIBUTES reference :: buffer
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER :: namelen
-         INTEGER(SIZE_T), INTENT(IN) :: size
-         CHARACTER(LEN=*), INTENT(OUT) :: buffer
-       END FUNCTION h5gget_linkval_c
-    END INTERFACE
-    
-    namelen = LEN(name)
-    hdferr = h5gget_linkval_c(loc_id, name, namelen, size, buffer)
-  END SUBROUTINE h5gget_linkval_f
-
-!
-!****s* H5G/h5gset_comment_f
-!
-! NAME
-!  h5gset_comment_f
-!
-! PURPOSE
-!  Sets comment for specified object.
-!
-! INPUTS
-!  loc_id 	 - location identifier
-!  name 	 - name of the object
-!  comment 	 - comment to set for the object
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 5, 2001
-!
-! SOURCE
-  SUBROUTINE h5gset_comment_f(loc_id, name, comment, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Current name of an object
-    CHARACTER(LEN=*), INTENT(IN) :: comment ! New name of an object
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-    INTEGER :: namelen ! Lenghth of the current_name string
-    INTEGER :: commentlen     ! Lenghth of the comment string
-    
-    INTERFACE
-       INTEGER FUNCTION h5gset_comment_c(loc_id, name, namelen, &
-            comment, commentlen)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GSET_COMMENT_C'::h5gset_comment_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         !DEC$ATTRIBUTES reference :: comment
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER :: namelen
-         CHARACTER(LEN=*), INTENT(IN) :: comment
-         INTEGER :: commentlen
-       END FUNCTION h5gset_comment_c
-    END INTERFACE
-    
-    namelen = LEN(name)
-    commentlen = LEN(comment)
-    hdferr = h5gset_comment_c(loc_id, name, namelen, comment, commentlen)
-  END SUBROUTINE h5gset_comment_f
-!
-!****s* H5G/h5gget_comment_f
-!
-! NAME
-!  h5gget_comment_f
-!
-! PURPOSE
-!  Retrieves comment for specified object.
-!
-! INPUTS
-!  loc_id 	 - location identifier
-!  name 	 - name of the object at specified location
-!  size 	 - size of the buffer required to hold comment
-! OUTPUTS
-!  buffer 	 - buffer to hold object's comment
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 5, 2001
-!
-! SOURCE
-  SUBROUTINE h5gget_comment_f(loc_id, name, size, buffer, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Current name of an object
-    INTEGER(SIZE_T), INTENT(IN) :: size    ! Maximum number of buffer
-    CHARACTER(LEN=size), INTENT(OUT) :: buffer
-                                           ! Buffer to hold a comment
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-    INTEGER :: namelen ! Length of the current_name string
-
-    INTERFACE
-       INTEGER FUNCTION h5gget_comment_c(loc_id, name, namelen, size, buffer)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GGET_COMMENT_C'::h5gget_comment_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name, buffer
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER :: namelen
-         INTEGER(SIZE_T), INTENT(IN) :: size
-         CHARACTER(LEN=*), INTENT(OUT) :: buffer
-       END FUNCTION h5gget_comment_c
-    END INTERFACE
-
-    namelen = LEN(name)
-    hdferr = h5gget_comment_c(loc_id, name, namelen, size, buffer)
-
-  END SUBROUTINE h5gget_comment_f
-!
-!****s* H5G/H5Gcreate_anon_f
-!
-! NAME
-!  H5Gcreate_anon_f
-!
-! PURPOSE
-!  Creates a new empty group without linking it into the file structure.
-!
-! INPUTS
-!  loc_id 	 - Location identifier
-! OUTPUTS
-!  grp_id 	 - group identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  gcpl_id 	 - Group creation property list identifier
-!  gapl_id 	 - Group access property list identifier
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 15, 2008
-!
-! SOURCE
-  SUBROUTINE h5Gcreate_anon_f(loc_id, grp_id, hdferr, gcpl_id, gapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
-    INTEGER(HID_T), INTENT(OUT) :: grp_id  ! Group identifier
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: gcpl_id  ! Property list for group creation
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: gapl_id  ! Property list for group access
-!*****
-    INTEGER(HID_T) :: gcpl_id_default
-    INTEGER(HID_T) :: gapl_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5gcreate_anon_c(loc_id, gcpl_id_default, gapl_id_default, grp_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GCREATE_ANON_C'::h5gcreate_anon_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier
-         INTEGER(HID_T), INTENT(IN) :: gcpl_id_default  ! Property list for group creation
-         INTEGER(HID_T), INTENT(IN) :: gapl_id_default  ! Property list for group access
-         INTEGER(HID_T), INTENT(OUT) :: grp_id  ! Group identifier
-       END FUNCTION h5gcreate_anon_c
-    END INTERFACE
-
-    gcpl_id_default = H5P_DEFAULT_F
-    gapl_id_default = H5P_DEFAULT_F
-
-    IF(PRESENT(gcpl_id)) gcpl_id_default = gcpl_id
-    IF(PRESENT(gapl_id)) gapl_id_default = gapl_id
-
-    hdferr = h5gcreate_anon_c(loc_id, gcpl_id_default, gapl_id_default, grp_id)
-
-  END SUBROUTINE h5Gcreate_anon_f
-!
-!****s* H5G/H5Gget_create_plist_f
-!
-! NAME
-!  H5Gget_create_plist_f
-!
-! PURPOSE
-!  Gets a group creation property list identifier.
-!
-! INPUTS
-!  grp_id 	 - group identifier
-! OUTPUTS
-!  gcpl_id 	 - Group creation property list identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 15, 2008
-!
-! SOURCE
-  SUBROUTINE h5gget_create_plist_f(grp_id, gcpl_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN)  :: grp_id  ! Group identifier
-    INTEGER(HID_T), INTENT(OUT) :: gcpl_id ! Property list for group creation
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5gget_create_plist_c(grp_id, gcpl_id )
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GGET_CREATE_PLIST_C'::h5gget_create_plist_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN)  :: grp_id
-         INTEGER(HID_T), INTENT(OUT) :: gcpl_id
-       END FUNCTION h5gget_create_plist_c
-    END INTERFACE
-
-    hdferr = h5gget_create_plist_c(grp_id, gcpl_id )
-
-  END SUBROUTINE h5gget_create_plist_f
-
-!
-!****s* H5G/h5gget_info_f
-!
-! NAME
-!  h5gget_info_f
-!
-! PURPOSE
-!  Retrieves information about a group
-!
-! INPUTS
-!  group_id 	 - Group identifier
-!
-! OUTPUTS  
-!  storage_type  - Type of storage for links in group
-!                    H5G_STORAGE_TYPE_COMPACT: Compact storage
-!                    H5G_STORAGE_TYPE_DENSE: Indexed storage
-!                    H5G_STORAGE_TYPE_SYMBOL_TABLE: Symbol tables, the original HDF5 structure
-!  nlinks 	 - Number of links in group
-!  max_corder 	 - Current maximum creation order value for group
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  mounted 	 - Whether group has a file mounted on it
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 15, 2008
-!
-! NOTES
-!  In C the output is defined as a structure: H5G_info_t
-!
-! HISTORY
-!
-!  - Added 'mounted' paramater
-!    M. Scot Breitenfeld
-!    July 16, 2008
-!
-! SOURCE
-  SUBROUTINE h5gget_info_f(group_id, storage_type, nlinks, max_corder, hdferr, mounted)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: group_id ! Group identifier
-
-    INTEGER, INTENT(OUT) :: storage_type  ! Type of storage for links in group:
-                                          ! H5G_STORAGE_TYPE_COMPACT_F: Compact storage
-                                          ! H5G_STORAGE_TYPE_DENSE_F: Indexed storage
-                                          ! H5G_STORAGE_TYPE_SYMBOL_TABLE_F: Symbol tables, the original HDF5 structure
-    INTEGER, INTENT(OUT) :: nlinks        ! Number of links in group
-    INTEGER, INTENT(OUT) :: max_corder    ! Current maximum creation order value for group
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code:
-                                          ! 0 on success and -1 on failure
-    LOGICAL, INTENT(OUT), OPTIONAL :: mounted  ! Whether group has a file mounted on it
-!*****
-    INTEGER :: mounted_c
-
-    INTERFACE
-       INTEGER FUNCTION h5gget_info_c(group_id, storage_type, nlinks, max_corder, mounted_c)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GGET_INFO_C'::h5gget_info_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: group_id
-         INTEGER, INTENT(OUT) :: storage_type
-         INTEGER, INTENT(OUT) :: nlinks
-         INTEGER, INTENT(OUT) :: max_corder
-         INTEGER :: mounted_c
-       END FUNCTION h5gget_info_c
-    END INTERFACE
-
-    hdferr = h5gget_info_c(group_id, storage_type, nlinks, max_corder, mounted_c)
-
-    IF(PRESENT(mounted))THEN
-       IF(mounted_c.EQ.0) THEN
-          mounted = .FALSE.
-       ELSE
-          mounted = .TRUE.
-       ENDIF
-    ENDIF
-
-  END SUBROUTINE h5gget_info_f
-!
-!****s* H5G/h5gget_info_by_idx_f
-!
-! NAME
-!  h5gget_info_by_idx_f
-!
-! PURPOSE
-!  Retrieves information about a group, according to the group’s position within an index.
-!
-! INPUTS
-!  loc_id 	 - File or group identifier
-!  group_name 	 - Name of group containing group for which information is to be retrieved
-!  index_type 	 - Index type
-!  order 	 - Order of the count in the index
-!  n 	         - Position in the index of the group for which information is retrieved
-!
-! OUTPUTS
-!  storage_type  - Type of storage for links in group
-!                    H5G_STORAGE_TYPE_COMPACT: Compact storage
-!                    H5G_STORAGE_TYPE_DENSE: Indexed storage
-!                    H5G_STORAGE_TYPE_SYMBOL_TABLE: Symbol tables, the original HDF5 structure
-!  nlinks 	 - Number of links in group
-!  max_corder 	 - Current maximum creation order value for group
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  lapl_id 	 - Link access property list
-!  mounted 	 - Whether group has a file mounted on it
-!
-! NOTES
-!  In C the output is defined as a structure: H5G_info_t
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 18, 2008
-!
-! HISTORY
-!  Added 'mounted' paramater
-!  M. Scot Breitenfeld
-!  July 16, 2008
-!
-! SOURCE
-  SUBROUTINE h5gget_info_by_idx_f(loc_id, group_name, index_type, order, n, &
-       storage_type, nlinks, max_corder, hdferr, lapl_id, mounted)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id       ! File or group identifier
-    CHARACTER(LEN=*), INTENT(IN) :: group_name ! Name of group containing group for which information is to be retrieved
-    INTEGER, INTENT(IN) :: index_type ! Index type
-    INTEGER, INTENT(IN) :: order      ! Order of the count in the index
-    INTEGER(HSIZE_T), INTENT(IN) :: n ! Position in the index of the group for which information is retrieved
-
-    INTEGER, INTENT(OUT) :: storage_type ! Type of storage for links in group:
-                                         !   H5G_STORAGE_TYPE_COMPACT_F: Compact storage
-                                         !   H5G_STORAGE_TYPE_DENSE_F: Indexed storage
-                                         !   H5G_STORAGE_TYPE_SYMBOL_TABLE_F: Symbol tables, the original HDF5 structure
-    INTEGER, INTENT(OUT) :: nlinks      ! Number of links in group
-    INTEGER, INTENT(OUT) :: max_corder  ! Current maximum creation order value for group
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code:
-                                        ! 0 on success and -1 on failure
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list
-    LOGICAL, INTENT(OUT), OPTIONAL :: mounted       ! Whether group has a file mounted on it
-!*****
-    INTEGER :: mounted_c
-    INTEGER(HID_T) :: lapl_id_default
-    INTEGER(SIZE_T) :: group_name_len ! length of group name
-
-    INTERFACE
-       INTEGER FUNCTION h5gget_info_by_idx_c(loc_id, group_name, group_name_len, index_type, order, n, lapl_id_default, &
-            storage_type, nlinks, max_corder, mounted_c)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GGET_INFO_BY_IDX_C'::h5gget_info_by_idx_c
-         !DEC$ENDIF
-         
-         !DEC$ATTRIBUTES reference :: group_name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: group_name
-         INTEGER, INTENT(IN) :: index_type
-         INTEGER, INTENT(IN) :: order
-         INTEGER(HSIZE_T), INTENT(IN) :: n
-         INTEGER(HID_T) :: lapl_id_default
-         INTEGER, INTENT(OUT) :: storage_type
-         INTEGER, INTENT(OUT) :: nlinks
-         INTEGER, INTENT(OUT) :: max_corder
-
-         INTEGER(SIZE_T) :: group_name_len
-         INTEGER :: mounted_c
-
-       END FUNCTION h5gget_info_by_idx_c
-    END INTERFACE
-
-    group_name_len = LEN(group_name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5gget_info_by_idx_c(loc_id, group_name, group_name_len, &
-         index_type, order, n, lapl_id_default, &
-         storage_type, nlinks, max_corder, mounted_c)
-
-    IF(PRESENT(mounted))THEN
-       IF(mounted_c.EQ.0) THEN
-          mounted = .FALSE.
-       ELSE
-          mounted = .TRUE.
-       ENDIF
-    ENDIF
-
-  END SUBROUTINE h5gget_info_by_idx_f
-!
-!****s* H5G/h5gget_info_by_name_f
-!
-! NAME
-!  h5gget_info_by_name_f
-!
-! PURPOSE
-!  Retrieves information about a group.
-!
-! INPUTS
-!  loc_id 	 - File or group identifier
-!  group_name 	 - Name of group containing group for which information is to be retrieved
-!
-! OUTPUTS
-!
-!  storage_type  - Type of storage for links in group
-!                    H5G_STORAGE_TYPE_COMPACT: Compact storage
-!                    H5G_STORAGE_TYPE_DENSE: Indexed storage
-!                    H5G_STORAGE_TYPE_SYMBOL_TABLE: Symbol tables, the original HDF5 structure
-!  nlinks 	 - Number of links in group
-!  max_corder 	 - Current maximum creation order value for group
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  lapl_id 	 - Link access property list
-!  mounted 	 - Whether group has a file mounted on it
-!
-! NOTES
-!  In C the output is defined as a structure: H5G_info_t
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 18, 2008
-!
-! HISTORY
-!  Added 'mounted' paramater
-!  M. Scot Breitenfeld
-!  July 16, 2008
-! SOURCE
-  SUBROUTINE h5gget_info_by_name_f(loc_id, group_name, &
-       storage_type, nlinks, max_corder, hdferr, lapl_id, mounted)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id       ! File or group identifier
-    CHARACTER(LEN=*), INTENT(IN) :: group_name ! Name of group containing group for which information is to be retrieved
-
-    INTEGER, INTENT(OUT) :: storage_type  ! Type of storage for links in group:
-                                          ! H5G_STORAGE_TYPE_COMPACT_F: Compact storage
-                                          ! H5G_STORAGE_TYPE_DENSE_F: Indexed storage
-                                          ! H5G_STORAGE_TYPE_SYMBOL_TABLE_F: Symbol tables, the original HDF5 structure
-    INTEGER, INTENT(OUT) :: nlinks        ! Number of links in group
-    INTEGER, INTENT(OUT) :: max_corder    ! Current maximum creation order value for group
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code:
-                                          !   0 on success and -1 on failure
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list
-    LOGICAL, INTENT(OUT), OPTIONAL :: mounted       ! Whether group has a file mounted on it
-!*****
-    INTEGER :: mounted_c
-    INTEGER(HID_T) :: lapl_id_default
-    INTEGER(SIZE_T) :: group_name_len ! length of group name
-
-    INTERFACE
-       INTEGER FUNCTION h5gget_info_by_name_c(loc_id, group_name, group_name_len, lapl_id_default, &
-            storage_type, nlinks, max_corder, mounted_c)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GGET_INFO_BY_NAME_C'::h5gget_info_by_name_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: group_name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: group_name
-         INTEGER(HID_T), INTENT(IN) :: lapl_id_default
-         INTEGER, INTENT(OUT) :: storage_type
-         INTEGER, INTENT(OUT) :: nlinks
-         INTEGER, INTENT(OUT) :: max_corder
-
-         INTEGER(SIZE_T) :: group_name_len
-         INTEGER :: mounted_c
-
-       END FUNCTION h5gget_info_by_name_c
-    END INTERFACE
-
-    group_name_len = LEN(group_name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5gget_info_by_name_c(loc_id, group_name, group_name_len, lapl_id_default, &
-         storage_type, nlinks, max_corder, mounted_c)
-
-    IF(PRESENT(mounted))THEN
-       IF(mounted_c.EQ.0) THEN
-          mounted = .FALSE.
-       ELSE
-          mounted = .TRUE.
-       ENDIF
-    ENDIF
-
-  END SUBROUTINE h5gget_info_by_name_f
-
-END MODULE H5G
diff --git a/fortran/src/H5If.c b/fortran/src/H5If.c
index 55868dd..fdab0b6 100644
--- a/fortran/src/H5If.c
+++ b/fortran/src/H5If.c
@@ -1,6 +1,6 @@
 /****h* H5If/H5If
  * PURPOSE
- *   This file contains C stubs for H5I Fortran APIs
+ *  This file contains C stubs for H5I Fortran APIs
  *
  * COPYRIGHT
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -25,15 +25,15 @@
 
 /****if* H5If/h5iget_type_c
  * NAME
- *        h5iget_type_c
+ *  h5iget_type_c
  * PURPOSE
- *     Call H5Iget_type to get the type of an object
+ *  Call H5Iget_type to get the type of an object
  * INPUTS
- *      obj_id - object identifier
+ *  obj_id - object identifier
  * OUTPUTS
- *     type - object type
+ *  type - object type
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
  *  Thursday, March 24, 2000
@@ -42,7 +42,7 @@
  * SOURCE
 */
 int_f
-nh5iget_type_c (hid_t_f *obj_id, int_f *type)
+h5iget_type_c (hid_t_f *obj_id, int_f *type)
 /******/
 {
      int ret_value = -1;
@@ -61,29 +61,29 @@ nh5iget_type_c (hid_t_f *obj_id, int_f *type)
 }
 /****if* H5If/h5iget_name_c
  * NAME
- *        h5iget_name_c
+ *  h5iget_name_c
  * PURPOSE
- *     Call H5Iget_name to get object's name
+ *  Call H5Iget_name to get object's name
  * INPUTS
- *      obj_id - object identifier
- *              buf_size - size of the buffer
+ *  obj_id - object identifier
+ *  buf_size - size of the buffer
  * OUTPUTS
- *     buf - buffer to hold the name
+ *  buf - buffer to hold the name
  * RETURNS
- *     length of the name on success, -1 on failure
+ *  length of the name on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, March 12, 2003
+ *  Wednesday, March 12, 2003
  * HISTORY
  *
- *               Changed the size of c_buf_size to c_buf_size + 1, which
- *               fixes the problem of truncating the string by 1 if the
- *               exact size of the string (buf_size) is passed in.
+ *  Changed the size of c_buf_size to c_buf_size + 1, which
+ *  fixes the problem of truncating the string by 1 if the
+ *  exact size of the string (buf_size) is passed in.
  *               M. Scot Breitenfeld, April 21, 2008
  * SOURCE
 */
 int_f
-nh5iget_name_c(hid_t_f *obj_id, _fcd buf, size_t_f *buf_size, size_t_f *name_size)
+h5iget_name_c(hid_t_f *obj_id, _fcd buf, size_t_f *buf_size, size_t_f *name_size)
 /******/
 {
      int ret_value = -1;
@@ -120,22 +120,22 @@ DONE:
 
 /****if* H5If/h5iinc_ref_c
  * NAME
- *        h5iinc_ref_c
+ *  h5iinc_ref_c
  * PURPOSE
- *     Call H5Iinc_ref to increment object's reference count
+ *  Call H5Iinc_ref to increment object's reference count
  * INPUTS
- *      obj_id - object identifier
+ *  obj_id - object identifier
  * OUTPUTS
- *     ref_count - Reference count of ID
+ *  ref_count - Reference count of ID
  * RETURNS
- *     current reference count on success, -1 on failure
+ *  current reference count on success, -1 on failure
  * AUTHOR
  *  Quincey Koziol
  *  Tuesday, December  9, 2003
  * SOURCE
 */
 int_f
-nh5iinc_ref_c(hid_t_f *obj_id, int_f *ref_count)
+h5iinc_ref_c(hid_t_f *obj_id, int_f *ref_count)
 /******/
 {
      int ret_value;
@@ -156,22 +156,22 @@ done:
 
 /****if* H5If/h5idec_ref_c
  * NAME
- *        h5idec_ref_c
+ *  h5idec_ref_c
  * PURPOSE
- *     Call H5Idec_ref to decrement object's reference count
+ *  Call H5Idec_ref to decrement object's reference count
  * INPUTS
- *      obj_id - object identifier
+ *  obj_id - object identifier
  * OUTPUTS
- *     ref_count - Reference count of ID
+ *  ref_count - Reference count of ID
  * RETURNS
- *     current reference count on success, -1 on failure
+ *  current reference count on success, -1 on failure
  * AUTHOR
  *  Quincey Koziol
- *              Tuesday, December  9, 2003
+ *  Tuesday, December  9, 2003
  * SOURCE
 */
 int_f
-nh5idec_ref_c(hid_t_f *obj_id, int_f *ref_count)
+h5idec_ref_c(hid_t_f *obj_id, int_f *ref_count)
 /******/
 {
      int ret_value;
@@ -192,15 +192,15 @@ done:
 
 /****if* H5If/h5iget_ref_c
  * NAME
- *        h5iget_ref_c
+ *  h5iget_ref_c
  * PURPOSE
- *     Call H5Iget_ref to retrieve object's reference count
+ *  Call H5Iget_ref to retrieve object's reference count
  * INPUTS
- *      obj_id - object identifier
+ *  obj_id - object identifier
  * OUTPUTS
- *     ref_count - Reference count of ID
+ *  ref_count - Reference count of ID
  * RETURNS
- *     current reference count on success, -1 on failure
+ *  current reference count on success, -1 on failure
  * AUTHOR
  *  Quincey Koziol
  *  Tuesday, December  9, 2003
@@ -208,7 +208,7 @@ done:
  * SOURCE
 */
 int_f
-nh5iget_ref_c(hid_t_f *obj_id, int_f *ref_count)
+h5iget_ref_c(hid_t_f *obj_id, int_f *ref_count)
 /******/
 {
      int ret_value;
@@ -229,15 +229,15 @@ done:
 
 /****if* H5If/h5iget_file_id_c
  * NAME
- *        h5iget_file_id_c
+ *  h5iget_file_id_c
  * PURPOSE
- *     Call H5Iget_file_id to obtain file identifier from object identifier
+ *  Call H5Iget_file_id to obtain file identifier from object identifier
  * INPUTS
- *      obj_id - object identifier
+ *  obj_id - object identifier
  * OUTPUTS
- *     file_id - file identifier
+ *  file_id - file identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
  *  Tuesday, August 24, 2004
@@ -245,7 +245,7 @@ done:
  * SOURCE
 */
 int_f
-nh5iget_file_id_c(hid_t_f *obj_id, hid_t_f *file_id)
+h5iget_file_id_c(hid_t_f *obj_id, hid_t_f *file_id)
 /******/
 {
      int ret_value;
@@ -266,17 +266,17 @@ done:
 }
 
 /*----------------------------------------------------------------------------
- * Name:        h5iis_valid_c
- * Purpose:     Calls H5Iis_valid
- * Inputs:      obj_id - object identifier
- * Outputs:     0 = false, 1 = true
- * Returns:     0 on success, -1 on failure
- * Programmer:  Elena Pourmal
- *              Tuesday, August 24, 2004
- * Modifications:
+ *  Name:        h5iis_valid_c
+ *  Purpose:     Calls H5Iis_valid
+ *  Inputs:      obj_id - object identifier
+ *  Outputs:     0 = false, 1 = true
+ *  Returns:     0 on success, -1 on failure
+ *  Programmer:  Elena Pourmal
+ *  Tuesday, August 24, 2004
+ *  Modifications:
  *---------------------------------------------------------------------------*/
 int_f
-nh5iis_valid_c(hid_t_f *obj_id, int_f *c_valid)
+h5iis_valid_c(hid_t_f *obj_id, int_f *c_valid)
 {
      int ret_value;
      htri_t c_ret_value;
diff --git a/fortran/src/H5Iff.F90 b/fortran/src/H5Iff.F90
new file mode 100644
index 0000000..c91a8aa
--- /dev/null
+++ b/fortran/src/H5Iff.F90
@@ -0,0 +1,345 @@
+!****h* ROBODoc/H5I
+!
+! NAME
+!  MODULE H5I
+!
+!  FILE
+!  fortran/src/H5Iff.F90
+!
+! PURPOSE
+!  This file contains Fortran interfaces for H5I functions.
+!
+! COPYRIGHT
+!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!  Copyright by The HDF Group.                                               *
+!  Copyright by the Board of Trustees of the University of Illinois.         *
+!  All rights reserved.                                                      *
+!  *
+!  This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!  terms governing use, modification, and redistribution, is contained in    *
+!  the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!  of the source code distribution tree; Copyright.html can be found at the  *
+!  root level of an installed copy of the electronic HDF5 document set and   *
+!  is linked from the top-level documents page.  It can also be found at     *
+!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!  access to either file, you may request a copy from help at hdfgroup.org.     *
+!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! NOTES
+!       _____ __  __ _____   ____  _____ _______       _   _ _______
+!      |_   _|  \/  |  __ \ / __ \|  __ \__   __|/\   | \ | |__   __|
+! ****   | | | \  / | |__) | |  | | |__) | | |  /  \  |  \| |  | |    ****
+! ****   | | | |\/| |  ___/| |  | |  _  /  | | / /\ \ | . ` |  | |    ****
+! ****  _| |_| |  | | |    | |__| | | \ \  | |/ ____ \| |\  |  | |    ****
+!      |_____|_|  |_|_|     \____/|_|  \_\ |_/_/    \_\_| \_|  |_|
+!
+!  If you add a new H5I function you must add the function name to the
+!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
+!  This is needed for Windows based operating systems.
+!
+!*****
+
+MODULE H5I
+  
+  USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR, C_CHAR
+  USE H5GLOBAL
+
+CONTAINS
+
+!****s* H5I/h5iget_type_f
+!
+! NAME
+!  h5iget_type_f
+!
+! PURPOSE
+!  Retrieves the type of an object.
+!
+! INPUTS
+!  obj_id   - object identifier
+! OUTPUTS
+!  type     - type of the object, possible values:
+!              H5I_FILE_F
+!              H5I_GROUP_F
+!              H5I_DATATYPE_F
+!              H5I_DATASPACE_F
+!              H5I_DATASET_F
+!              H5I_ATTR_F
+!              H5I_BADID_F
+!  hdferr:  - error code
+!              Success:  0
+!              Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 5, 2001
+!
+! SOURCE
+  SUBROUTINE h5iget_type_f(obj_id, TYPE, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: obj_id  ! Object identifier
+    INTEGER, INTENT(OUT) :: TYPE ! type of an object.
+                                 ! possible values are:
+                                 !   H5I_FILE_F
+                                 !   H5I_GROUP_F
+                                 !   H5I_DATATYPE_F
+                                 !   H5I_DATASPACE_F
+                                 !   H5I_DATASET_F
+                                 !   H5I_ATTR_F
+                                 !   H5I_BADID_F
+    INTEGER, INTENT(OUT) :: hdferr  ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5iget_type_c(obj_id, TYPE) BIND(C, NAME='h5iget_type_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: obj_id
+         INTEGER, INTENT(OUT) :: TYPE
+       END FUNCTION h5iget_type_c
+    END INTERFACE
+    hdferr = h5iget_type_c(obj_id, TYPE)
+  END SUBROUTINE h5iget_type_f
+
+!****s* H5I/h5iget_name_f
+!
+! NAME
+!  h5iget_name_f
+!
+! PURPOSE
+!  Gets a name of an object specified by its idetifier.
+!
+! INPUTS
+!  obj_id    - attribute identifier
+!  buf_size  - size of a buffer to read name in
+! OUTPUTS
+!  buf 	     - buffer to read name in, name will be truncated if
+!              buffer is not big enough
+!  name_size - name size
+!  hdferr:   - error code
+!               Success:  0
+!               Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  March 12, 2003
+! SOURCE
+  SUBROUTINE h5iget_name_f(obj_id, buf, buf_size, name_size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: obj_id      ! Object identifier
+    INTEGER(SIZE_T), INTENT(IN) :: buf_size   ! Buffer size
+    CHARACTER(LEN=*), INTENT(OUT) :: buf      ! Buffer to hold object name
+    INTEGER(SIZE_T), INTENT(OUT) :: name_size ! Actual name size
+    INTEGER, INTENT(OUT) :: hdferr            ! Error code:
+                                              !   0 if successful,
+                                              !   -1 if fail
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5iget_name_c(obj_id, buf, buf_size, name_size) BIND(C, NAME='h5iget_name_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: obj_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: buf
+         INTEGER(SIZE_T), INTENT(IN) :: buf_size
+         INTEGER(SIZE_T), INTENT(OUT) :: name_size
+       END FUNCTION h5iget_name_c
+    END INTERFACE
+
+    hdferr = h5iget_name_c(obj_id, buf, buf_size, name_size)
+  END SUBROUTINE h5iget_name_f
+
+!****s* H5I/h5iinc_ref_f
+!
+! NAME
+!  h5iinc_ref_f
+!
+! PURPOSE
+!  Increments the reference count of an ID
+!
+! INPUTS
+!  obj_id 	 - object identifier
+! OUTPUTS
+!  ref_count 	 - Current reference count of the ID
+!  hdferr:		- error code
+!  Success:  0
+!  Failure: -1
+! AUTHOR
+!  Quincey Koziol
+!  December  9, 2003
+!
+! SOURCE
+  SUBROUTINE h5iinc_ref_f(obj_id, ref_count, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: obj_id ! Object identifier
+    INTEGER, INTENT(OUT) :: ref_count    ! Current reference count of ID
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5iinc_ref_c(obj_id, ref_count) BIND(C, NAME='h5iinc_ref_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: obj_id
+         INTEGER, INTENT(OUT) :: ref_count
+       END FUNCTION h5iinc_ref_c
+    END INTERFACE
+    hdferr = h5iinc_ref_c(obj_id, ref_count)
+  END SUBROUTINE h5iinc_ref_f
+
+!****s* H5I/h5idec_ref_f
+!
+! NAME
+!  h5idec_ref_f
+!
+! PURPOSE
+!  Decrements the reference count of an ID
+!
+! INPUTS
+!  obj_id 	 - Object identifier
+! OUTPUTS
+!  ref_count 	 - Current reference count of the ID
+!  hdferr:	 - Error code
+!                   Success:  0
+!                   Failure: -1
+! AUTHOR
+!  Quincey Koziol
+!  December  9, 2003
+!
+! SOURCE
+  SUBROUTINE h5idec_ref_f(obj_id, ref_count, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: obj_id ! Object identifier
+    INTEGER, INTENT(OUT) :: ref_count    ! Current reference count of ID
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5idec_ref_c(obj_id, ref_count) BIND(C, NAME='h5idec_ref_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: obj_id
+         INTEGER, INTENT(OUT) :: ref_count
+       END FUNCTION h5idec_ref_c
+    END INTERFACE
+    hdferr = h5idec_ref_c(obj_id, ref_count)
+  END SUBROUTINE h5idec_ref_f
+
+!****s* H5I/h5iget_ref_f
+! NAME
+!  h5iget_ref_f
+!
+! PURPOSE
+!  Retrieves the reference count of an ID
+!
+! INPUTS
+!  obj_id 	 - object identifier
+!
+! OUTPUTS
+!  ref_count 	 - Current reference count of the ID
+!  hdferr:	   - error code
+!  Success:  0
+!  Failure: -1
+! AUTHOR
+!  Quincey Koziol
+!  December  9, 2003
+!
+! SOURCE
+  SUBROUTINE h5iget_ref_f(obj_id, ref_count, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: obj_id ! Object identifier
+    INTEGER, INTENT(OUT) :: ref_count    ! Current reference count of ID
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5iget_ref_c(obj_id, ref_count) BIND(C, NAME='h5iget_ref_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: obj_id
+         INTEGER, INTENT(OUT) :: ref_count
+       END FUNCTION h5iget_ref_c
+    END INTERFACE
+    hdferr = h5iget_ref_c(obj_id, ref_count)
+  END SUBROUTINE h5iget_ref_f
+!
+!****s* H5I/h5iget_file_id_f
+! NAME
+!  h5iget_file_id_f
+!
+! PURPOSE
+!  Obtains file identifier from the object identifier
+!
+! INPUTS
+!  obj_id 	 - object identifier
+! OUTPUTS
+!  file_id 	 - file identifier
+!  hdferr:       - error code
+!                    Success:  0
+!                    Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 23, 2004
+! SOURCE
+  SUBROUTINE h5iget_file_id_f(obj_id, file_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN)  :: obj_id   ! Object identifier
+    INTEGER(HID_T), INTENT(OUT) :: file_id  ! File identifier
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5iget_file_id_c(obj_id, file_id) BIND(C, NAME='h5iget_file_id_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN)  :: obj_id
+         INTEGER(HID_T), INTENT(OUT) :: file_id
+       END FUNCTION h5iget_file_id_c
+    END INTERFACE
+    hdferr = h5iget_file_id_c(obj_id, file_id)
+  END SUBROUTINE h5iget_file_id_f
+!
+!****s* H5I/h5iis_valid_f
+! NAME
+!  h5iget_file_id_f
+!
+! PURPOSE
+!  Check if an ID is valid without producing an error message
+!
+! INPUTS
+!  id		- identifier 
+! OUTPUTS       
+!  valid        - status of id as a valid identifier
+!  hdferr:	- error code		
+!		   Success:  0
+!		   Failure: -1
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  April 13, 2009
+! SOURCE
+  SUBROUTINE h5iis_valid_f(id, valid, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN)  :: id ! Identifier 
+    LOGICAL, INTENT(OUT) :: valid     ! Status of id as a valid identifier
+    INTEGER, INTENT(OUT) :: hdferr    ! Error code
+!*****
+    INTEGER  :: c_valid ! 0 = .false, 1 = .true.
+    
+    INTERFACE
+       INTEGER FUNCTION h5iis_valid_c(id, c_valid) BIND(C, NAME='h5iis_valid_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN)  :: id   ! Identifier 
+         INTEGER  :: c_valid
+       END FUNCTION h5iis_valid_c
+    END INTERFACE
+    
+    hdferr = h5iis_valid_c(id, c_valid)
+    
+    valid = .FALSE. ! Default
+    IF(c_valid.EQ.1) valid = .TRUE.
+    
+  END SUBROUTINE h5iis_valid_f
+END MODULE H5I
+
diff --git a/fortran/src/H5Iff.f90 b/fortran/src/H5Iff.f90
deleted file mode 100644
index 7c9a843..0000000
--- a/fortran/src/H5Iff.f90
+++ /dev/null
@@ -1,352 +0,0 @@
-!****h* ROBODoc/H5I
-!
-! NAME
-!  MODULE H5I
-!
-!  FILE
-!  fortran/src/H5Iff.f90
-!
-! PURPOSE
-!  This file contains Fortran interfaces for H5I functions.
-!
-! COPYRIGHT
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!  Copyright by The HDF Group.                                               *
-!  Copyright by the Board of Trustees of the University of Illinois.         *
-!  All rights reserved.                                                      *
-!  *
-!  This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!  terms governing use, modification, and redistribution, is contained in    *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!  of the source code distribution tree; Copyright.html can be found at the  *
-!  root level of an installed copy of the electronic HDF5 document set and   *
-!  is linked from the top-level documents page.  It can also be found at     *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!  access to either file, you may request a copy from help at hdfgroup.org.     *
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5I function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5I
-
-  USE H5GLOBAL
-
-CONTAINS
-
-!****s* H5I/h5iget_type_f
-!
-! NAME
-!  h5iget_type_f
-!
-! PURPOSE
-!  Retrieves the type of an object.
-!
-! INPUTS
-!  obj_id   - object identifier
-! OUTPUTS
-!  type     - type of the object, possible values:
-!              H5I_FILE_F
-!              H5I_GROUP_F
-!              H5I_DATATYPE_F
-!              H5I_DATASPACE_F
-!              H5I_DATASET_F
-!              H5I_ATTR_F
-!              H5I_BADID_F
-!  hdferr:  - error code
-!              Success:  0
-!              Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 5, 2001
-!
-! SOURCE
-  SUBROUTINE h5iget_type_f(obj_id, TYPE, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: obj_id  ! Object identifier
-    INTEGER, INTENT(OUT) :: TYPE ! type of an object.
-                                 ! possible values are:
-                                 !   H5I_FILE_F
-                                 !   H5I_GROUP_F
-                                 !   H5I_DATATYPE_F
-                                 !   H5I_DATASPACE_F
-                                 !   H5I_DATASET_F
-                                 !   H5I_ATTR_F
-                                 !   H5I_BADID_F
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5iget_type_c(obj_id, TYPE)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IGET_TYPE_C':: h5iget_type_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: obj_id
-         INTEGER, INTENT(OUT) :: TYPE
-       END FUNCTION h5iget_type_c
-    END INTERFACE
-    hdferr = h5iget_type_c(obj_id, TYPE)
-  END SUBROUTINE h5iget_type_f
-
-!****s* H5I/h5iget_name_f
-!
-! NAME
-!  h5iget_name_f
-!
-! PURPOSE
-!  Gets a name of an object specified by its idetifier.
-!
-! INPUTS
-!  obj_id    - attribute identifier
-!  buf_size  - size of a buffer to read name in
-! OUTPUTS
-!  buf 	     - buffer to read name in, name will be truncated if
-!              buffer is not big enough
-!  name_size - name size
-!  hdferr:   - error code
-!               Success:  0
-!               Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  March 12, 2003
-! SOURCE
-  SUBROUTINE h5iget_name_f(obj_id, buf, buf_size, name_size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: obj_id      ! Object identifier
-    INTEGER(SIZE_T), INTENT(IN) :: buf_size   ! Buffer size
-    CHARACTER(LEN=*), INTENT(OUT) :: buf      ! Buffer to hold object name
-    INTEGER(SIZE_T), INTENT(OUT) :: name_size ! Actual name size
-    INTEGER, INTENT(OUT) :: hdferr            ! Error code:
-                                              !   0 if successful,
-                                              !   -1 if fail
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5iget_name_c(obj_id, buf, buf_size, name_size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IGET_NAME_C'::h5iget_name_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: obj_id
-         CHARACTER(LEN=*), INTENT(OUT) :: buf
-         INTEGER(SIZE_T), INTENT(IN) :: buf_size
-         INTEGER(SIZE_T), INTENT(OUT) :: name_size
-       END FUNCTION h5iget_name_c
-    END INTERFACE
-
-    hdferr = h5iget_name_c(obj_id, buf, buf_size, name_size)
-  END SUBROUTINE h5iget_name_f
-
-!****s* H5I/h5iinc_ref_f
-!
-! NAME
-!  h5iinc_ref_f
-!
-! PURPOSE
-!  Increments the reference count of an ID
-!
-! INPUTS
-!  obj_id 	 - object identifier
-! OUTPUTS
-!  ref_count 	 - Current reference count of the ID
-!  hdferr:		- error code
-!  Success:  0
-!  Failure: -1
-! AUTHOR
-!  Quincey Koziol
-!  December  9, 2003
-!
-! SOURCE
-  SUBROUTINE h5iinc_ref_f(obj_id, ref_count, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: obj_id ! Object identifier
-    INTEGER, INTENT(OUT) :: ref_count    ! Current reference count of ID
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5iinc_ref_c(obj_id, ref_count)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IINC_REF_C':: h5iinc_ref_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: obj_id
-         INTEGER, INTENT(OUT) :: ref_count
-       END FUNCTION h5iinc_ref_c
-    END INTERFACE
-    hdferr = h5iinc_ref_c(obj_id, ref_count)
-  END SUBROUTINE h5iinc_ref_f
-
-!****s* H5I/h5idec_ref_f
-!
-! NAME
-!  h5idec_ref_f
-!
-! PURPOSE
-!  Decrements the reference count of an ID
-!
-! INPUTS
-!  obj_id 	 - Object identifier
-! OUTPUTS
-!  ref_count 	 - Current reference count of the ID
-!  hdferr:	 - Error code
-!                   Success:  0
-!                   Failure: -1
-! AUTHOR
-!  Quincey Koziol
-!  December  9, 2003
-!
-! SOURCE
-  SUBROUTINE h5idec_ref_f(obj_id, ref_count, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: obj_id ! Object identifier
-    INTEGER, INTENT(OUT) :: ref_count    ! Current reference count of ID
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5idec_ref_c(obj_id, ref_count)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IDEC_REF_C':: h5idec_ref_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: obj_id
-         INTEGER, INTENT(OUT) :: ref_count
-       END FUNCTION h5idec_ref_c
-    END INTERFACE
-    hdferr = h5idec_ref_c(obj_id, ref_count)
-  END SUBROUTINE h5idec_ref_f
-
-!****s* H5I/h5iget_ref_f
-! NAME
-!  h5iget_ref_f
-!
-! PURPOSE
-!  Retrieves the reference count of an ID
-!
-! INPUTS
-!  obj_id 	 - object identifier
-!
-! OUTPUTS
-!  ref_count 	 - Current reference count of the ID
-!  hdferr:	   - error code
-!  Success:  0
-!  Failure: -1
-! AUTHOR
-!  Quincey Koziol
-!  December  9, 2003
-!
-! SOURCE
-  SUBROUTINE h5iget_ref_f(obj_id, ref_count, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: obj_id ! Object identifier
-    INTEGER, INTENT(OUT) :: ref_count    ! Current reference count of ID
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5iget_ref_c(obj_id, ref_count)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IGET_REF_C':: h5iget_ref_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: obj_id
-         INTEGER, INTENT(OUT) :: ref_count
-       END FUNCTION h5iget_ref_c
-    END INTERFACE
-    hdferr = h5iget_ref_c(obj_id, ref_count)
-  END SUBROUTINE h5iget_ref_f
-!
-!****s* H5I/h5iget_file_id_f
-! NAME
-!  h5iget_file_id_f
-!
-! PURPOSE
-!  Obtains file identifier from the object identifier
-!
-! INPUTS
-!  obj_id 	 - object identifier
-! OUTPUTS
-!  file_id 	 - file identifier
-!  hdferr:       - error code
-!                    Success:  0
-!                    Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 23, 2004
-! SOURCE
-  SUBROUTINE h5iget_file_id_f(obj_id, file_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN)  :: obj_id   ! Object identifier
-    INTEGER(HID_T), INTENT(OUT) :: file_id  ! File identifier
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5iget_file_id_c(obj_id, file_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IGET_FILE_ID_C':: h5iget_file_id_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN)  :: obj_id
-         INTEGER(HID_T), INTENT(OUT) :: file_id
-       END FUNCTION h5iget_file_id_c
-    END INTERFACE
-    hdferr = h5iget_file_id_c(obj_id, file_id)
-  END SUBROUTINE h5iget_file_id_f
-!
-!****s* H5I/h5iis_valid_f
-! NAME
-!  h5iget_file_id_f
-!
-! PURPOSE
-!  Check if an ID is valid without producing an error message
-!
-! INPUTS
-!  id		- identifier 
-! OUTPUTS       
-!  valid        - status of id as a valid identifier
-!  hdferr:	- error code		
-!		   Success:  0
-!		   Failure: -1
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  April 13, 2009
-! SOURCE
-  SUBROUTINE h5iis_valid_f(id, valid, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN)  :: id ! Identifier 
-    LOGICAL, INTENT(OUT) :: valid     ! Status of id as a valid identifier
-    INTEGER, INTENT(OUT) :: hdferr    ! Error code
-!*****
-    INTEGER  :: c_valid ! 0 = .false, 1 = .true.
-    
-    INTERFACE
-       INTEGER FUNCTION h5iis_valid_c(id, c_valid)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IIS_VALID_C':: h5iis_valid_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN)  :: id   ! Identifier 
-         INTEGER  :: c_valid
-       END FUNCTION h5iis_valid_c
-    END INTERFACE
-    
-    hdferr = h5iis_valid_c(id, c_valid)
-    
-    valid = .FALSE. ! Default
-    IF(c_valid.EQ.1) valid = .TRUE.
-    
-  END SUBROUTINE h5iis_valid_f
-END MODULE H5I
-
diff --git a/fortran/src/H5Lf.c b/fortran/src/H5Lf.c
index 6523ab4..0d3aac2 100644
--- a/fortran/src/H5Lf.c
+++ b/fortran/src/H5Lf.c
@@ -1,6 +1,6 @@
 /****h* H5Lf/H5Lf
  * PURPOSE
- *   This file contains C stubs for H5L Fortran APIs
+ *  This file contains C stubs for H5L Fortran APIs
  *
  * COPYRIGHT
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -26,34 +26,34 @@
 
 /****if* H5Lf/h5lcopy_c
  * NAME
- *        h5lcopy_c
+ *  h5lcopy_c
  * PURPOSE
- *     Call H5Lcopy
+ *  Call H5Lcopy
  * INPUTS
  *
- *     src_loc_id - Location identifier of the source link
- *       src_name - Name of the link to be copied
- *    src_namelen - length of the name
- *    dest_loc_id - Location identifier specifying the destination of the copy
- *      dest_name - Name to be assigned to the NEW copy
- *   dest_namelen - Length of the name
- *         loc_id - Identifier of the file or group containing the object
- *           name - Name of the link to delete
- *        lcpl_id - Link creation property list identifier
- *        lapl_id - Link access property list identifier
+ *  src_loc_id - Location identifier of the source link
+ *  src_name - Name of the link to be copied
+ *  src_namelen - length of the name
+ *  dest_loc_id - Location identifier specifying the destination of the copy
+ *  dest_name - Name to be assigned to the NEW copy
+ *  dest_namelen - Length of the name
+ *  loc_id - Identifier of the file or group containing the object
+ *  name - Name of the link to delete
+ *  lcpl_id - Link creation property list identifier
+ *  lapl_id - Link access property list identifier
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              January, 2008
+ *  January, 2008
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5lcopy_c(hid_t_f *src_loc_id, _fcd src_name, size_t_f *src_namelen, hid_t_f *dest_loc_id,
+h5lcopy_c(hid_t_f *src_loc_id, _fcd src_name, size_t_f *src_namelen, hid_t_f *dest_loc_id,
 	     _fcd dest_name, size_t_f *dest_namelen,
 	     hid_t_f *lcpl_id, hid_t_f *lapl_id)
 /******/
@@ -88,21 +88,21 @@ done:
 
 /****if* H5Lf/h5lcreate_external_c
  * NAME
- *        h5lcreate_external_c
+ *  h5lcreate_external_c
  * PURPOSE
- *     Call H5Lcreate_external_c
+ *  Call H5Lcreate_external_c
  * INPUTS
  *
- *    file_name - Name of the file containing the target object. Neither the file nor the target object is
- *                required to exist. May be the file the link is being created in.
- *     obj_name - Path within the target file to the target object.
+ *  file_name - Name of the file containing the target object. Neither the file nor the target object is
+ *  required to exist. May be the file the link is being created in.
+ *  obj_name - Path within the target file to the target object.
  *  link_loc_id - The file or group identifier for the new link.
- *    link_name - The name of the new link.
- *      lcpl_id - Link creation property list identifier.
- *      lapl_id - Link access property list identifier.
+ *  link_name - The name of the new link.
+ *  lcpl_id - Link creation property list identifier.
+ *  lapl_id - Link access property list identifier.
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
  *  February 29, 2008
@@ -110,7 +110,7 @@ done:
 */
 
 int_f
-nh5lcreate_external_c(_fcd file_name, size_t_f *file_namelen, _fcd obj_name, size_t_f *obj_namelen,
+h5lcreate_external_c(_fcd file_name, size_t_f *file_namelen, _fcd obj_name, size_t_f *obj_namelen,
 		      hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen,
 		      hid_t_f *lcpl_id, hid_t_f *lapl_id)
 /******/
@@ -150,27 +150,27 @@ done:
 
 /****if* H5Lf/h5ldelete_c
  * NAME
- *        h5ldelete_c
+ *  h5ldelete_c
  * PURPOSE
- *     Call H5Ldelete
+ *  Call H5Ldelete
  * INPUTS
  *
  *
- *    loc_id  - Identifier of the file or group containing the object
- *    name    - Name of the link to delete
- *    lapl_id - Link access property list identifier
- *    namelen - length of name
+ *  loc_id  - Identifier of the file or group containing the object
+ *  name    - Name of the link to delete
+ *  lapl_id - Link access property list identifier
+ *  namelen - length of name
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              January, 2008
+ *  January, 2008
  * SOURCE
 */
 
 int_f
-nh5ldelete_c ( hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id )
+h5ldelete_c ( hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id )
 /******/
 {
   char *c_name = NULL;
@@ -197,28 +197,28 @@ done:
 
 /****if* H5Lf/h5lcreate_soft_c
  * NAME
- *        h5lcreate_soft_c
+ *  h5lcreate_soft_c
  * PURPOSE
- *     Call H5Lcreate_soft
+ *  Call H5Lcreate_soft
  * INPUTS
  *
  *
- *       target_path - Path to the target object, which is not required to exist.
- *       link_loc_id - The file or group identifier for the new link.
- *       link_name   - The name of the new link.
- *       lcpl_id     - Link creation property list identifier.
- *       lapl_id     - Link access property list identifier.
+ *  target_path - Path to the target object, which is not required to exist.
+ *  link_loc_id - The file or group identifier for the new link.
+ *  link_name   - The name of the new link.
+ *  lcpl_id     - Link creation property list identifier.
+ *  lapl_id     - Link access property list identifier.
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              February 20, 2008
+ *  February 20, 2008
  * SOURCE
 */
 
 int_f
-nh5lcreate_soft_c(_fcd target_path, size_t_f *target_path_len,
+h5lcreate_soft_c(_fcd target_path, size_t_f *target_path_len,
 		  hid_t_f *link_loc_id,
 		  _fcd link_name, size_t_f *link_name_len,
 		  hid_t_f *lcpl_id, hid_t_f *lapl_id )
@@ -253,29 +253,29 @@ nh5lcreate_soft_c(_fcd target_path, size_t_f *target_path_len,
 
 /****if* H5Lf/h5lcreate_hard_c
  * NAME
- *        h5lcreate_hard_c
+ *  h5lcreate_hard_c
  * PURPOSE
- *     Call H5Lcreate_hard
+ *  Call H5Lcreate_hard
  * INPUTS
  *
- *       obj_loc_id  - The file or group identifier for the target object.
- *       obj_name    - Name of the target object, which must already exist.
- *       obj_namelen - Name length
- *       link_loc_id - The file or group identifier for the new link.
- *       link_name   - The name of the new link.
- *       link_namelen- Name length
- *       lcpl_id     - Link creation property list identifier.
- *       lapl_id     - Link access property list identifier.
+ *  obj_loc_id  - The file or group identifier for the target object.
+ *  obj_name    - Name of the target object, which must already exist.
+ *  obj_namelen - Name length
+ *  link_loc_id - The file or group identifier for the new link.
+ *  link_name   - The name of the new link.
+ *  link_namelen- Name length
+ *  lcpl_id     - Link creation property list identifier.
+ *  lapl_id     - Link access property list identifier.
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
  *  February 27, 2008
  * SOURCE
 */
 int_f
-nh5lcreate_hard_c(hid_t_f *obj_loc_id, _fcd obj_name, size_t_f *obj_namelen,
+h5lcreate_hard_c(hid_t_f *obj_loc_id, _fcd obj_name, size_t_f *obj_namelen,
 		  hid_t_f *link_loc_id,
 		  _fcd link_name, size_t_f *link_namelen,
 		  hid_t_f *lcpl_id, hid_t_f *lapl_id )
@@ -310,41 +310,41 @@ nh5lcreate_hard_c(hid_t_f *obj_loc_id, _fcd obj_name, size_t_f *obj_namelen,
 
 /****if* H5Lf/h5ldelete_by_idx_c
  * NAME
- *        h5ldelete_by_idx_c
+ *  h5ldelete_by_idx_c
  * PURPOSE
- *     Calls h5ldelete_by_idx
+ *  Calls h5ldelete_by_idx
  * INPUTS
  *
- *          loc_id - File or group identifier specifying location of subject group
- *      group_name - Name of subject group
- *   group_namelen - Name length
- *     index_field - Type of index; Possible values are:
+ *  loc_id - File or group identifier specifying location of subject group
+ *  group_name - Name of subject group
+ *  group_namelen - Name length
+ *  index_field - Type of index; Possible values are:
  *                    H5_INDEX_UNKNOWN_F = -1  - Unknown index type
  *                    H5_INDEX_NAME_F          - Index on names
  *                    H5_INDEX_CRT_ORDER_F     - Index on creation order
  *                    H5_INDEX_N_F	       - Number of indices defined
- *           order - Order within field or index; Possible values are:
+ *  order - Order within field or index; Possible values are:
  *                    H5_ITER_UNKNOWN_F   - Unknown order
  *                    H5_ITER_INC_F       - Increasing order
  *                    H5_ITER_DEC_F       - Decreasing order
  *                    H5_ITER_NATIVE_F    - No particular order, whatever is fastest
  *                    H5_ITER_N_F	  - Number of iteration orders
- *               n - Link for which to retrieve information
- *         lapl_id - Link access property list
+ *  n - Link for which to retrieve information
+ *  lapl_id - Link access property list
  *
  * OUTPUTS
  *     N/A
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              February 29, 2008
+ *  February 29, 2008
  * HISTORY
  * N/A
  * SOURCE
 */
 int_f
-nh5ldelete_by_idx_c (hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen,
+h5ldelete_by_idx_c (hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen,
 		     int_f *index_field, int_f *order, hsize_t_f *n, hid_t_f *lapl_id)
 /******/
 {
@@ -376,28 +376,28 @@ done:
 
 /****if* H5Lf/h5lexists_c
  * NAME
- *        h5lexists_c
+ *  h5lexists_c
  * PURPOSE
- *     Calls H5Lexists
+ *  Calls H5Lexists
  * INPUTS
  *
- *      loc_id - Identifier of the file or group to query.
- *        name - Link name to check
- *     lapl_id - Link access property list identifier.
+ *  loc_id - Identifier of the file or group to query.
+ *  name - Link name to check
+ *  lapl_id - Link access property list identifier.
  * OUTPUTS
  *
- *     link_exists_c  - returns a positive value, for TRUE, or 0 (zero), for FALSE.
+ *  link_exists_c  - returns a positive value, for TRUE, or 0 (zero), for FALSE.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              February 29, 2008
+ *  February 29, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5lexists_c (hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id, int_f *link_exists)
+h5lexists_c (hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id, int_f *link_exists)
 /******/
 {
   char *c_name = NULL;          /* Buffer to hold C string */
@@ -423,40 +423,40 @@ done:
 
 /****if* H5Lf/h5lget_info_c
  * NAME
- *        h5lget_info_c
+ *  h5lget_info_c
  * PURPOSE
- *     Call  H5Lget_info
+ *  Call  H5Lget_info
  * INPUTS
  *
  *		link_loc_id - File or group identifier.
- *                link_name - Name of the link for which information is being sought
- *             link_namelen - Name length
- *                  lapl_id - Link access property list
+ *  link_name - Name of the link for which information is being sought
+ *  link_namelen - Name length
+ *  lapl_id - Link access property list
  * OUTPUTS
  *
  *
- *              cset - indicates the character set used for link’s name.
- *            corder - specifies the link’s creation order position.
- *      corder_valid - indicates whether the value in corder is valid.
- *         link_type -  specifies the link class:
+ *  cset - indicates the character set used for link’s name.
+ *  corder - specifies the link’s creation order position.
+ *  corder_valid - indicates whether the value in corder is valid.
+ *  link_type -  specifies the link class:
  *     	                H5L_LINK_HARD_F      - Hard link
  *     	                H5L_LINK_SOFT_F      - Soft link
  *     	                H5L_LINK_EXTERNAL_F  - External link
  *     	                H5L_LINK_ERROR_F     - Error
- *           address - If the link is a hard link, address specifies the file address that the link points to
- *          val_size - If the link is a symbolic link, val_size will be the length of the link value
+ *  address - If the link is a hard link, address specifies the file address that the link points to
+ *  val_size - If the link is a symbolic link, val_size will be the length of the link value
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              January, 2008
+ *  January, 2008
  * HISTORY
  * N/A
  * SOURCE
 */
 int_f
-nh5lget_info_c(hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen,
+h5lget_info_c(hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen,
 		int_f *cset, int_f *corder, int_f *corder_valid, int_f *link_type,
 		haddr_t_f *address, size_t_f *val_size,
 		hid_t_f *lapl_id)
@@ -496,36 +496,36 @@ done:
 
 /****if* H5Lf/h5lget_info_by_idx_c
  * NAME
- *        h5lget_info_by_idx_c
+ *  h5lget_info_by_idx_c
  * PURPOSE
- *     Call  H5Lget_info_by_idx
+ *  Call  H5Lget_info_by_idx
  * INPUTS
  *
  *	loc_id  - File or group identifier specifying location of subject group
- *   group_name - Name of subject group
- *group_namelen - Name length
+ *  group_name - Name of subject group
+ *  group_namelen - Name length
  *  index_field - Index or field which determines the order
- *        order - Order within field or index
- *            n - Link for which to retrieve information
- *      lapl_id - Link access property list
+ *  order - Order within field or index
+ *  n - Link for which to retrieve information
+ *  lapl_id - Link access property list
  * OUTPUTS
  *
- *        corder_valid - Indicates whether the the creation order data is valid for this attribute
- *              corder - Is a positive integer containing the creation order of the attribute
- *                cset - Indicates the character set used for the attribute’s name
- *           data_size - indicates the size, in the number of characters, of the attribute
+ *  corder_valid - Indicates whether the the creation order data is valid for this attribute
+ *  corder - Is a positive integer containing the creation order of the attribute
+ *  cset - Indicates the character set used for the attribute’s name
+ *  data_size - indicates the size, in the number of characters, of the attribute
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              January, 2008
+ *  January, 2008
  * HISTORY
  * N/A
  * SOURCE
 */
 int_f
-nh5lget_info_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen,
+h5lget_info_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen,
 		      int_f *index_field, int_f *order, hsize_t_f *n,
 		      int_f *link_type, int_f *corder_valid, int_f *corder, int_f *cset,  haddr_t_f *address, size_t_f *val_size, hid_t_f *lapl_id)
 /******/
@@ -570,7 +570,7 @@ done:
  * NAME
  *        H5Lis_registered_c
  * PURPOSE
- *     Call H5Lis_registered
+ *  Call H5Lis_registered
  * INPUTS
  *
  *  link_cls_id - User-defined link class identifier
@@ -578,17 +578,17 @@ done:
  *     NONE
  *
  * RETURNS
- *     Returns a positive value if the link class has been registered
- *              and zero if it is unregistered. Otherwise returns a negative value
+ *  Returns a positive value if the link class has been registered
+ *  and zero if it is unregistered. Otherwise returns a negative value
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 3, 2008
+ *  March 3, 2008
  * HISTORY
  * N/A
  * SOURCE
 */
 int_f
-nh5lis_registered_c(int_f *link_cls_id)
+h5lis_registered_c(int_f *link_cls_id)
 /******/
 {
     int_f ret_value;      /* Return value */
@@ -621,29 +621,29 @@ nh5lis_registered_c(int_f *link_cls_id)
 
 /****if* H5Lf/h5lmove_c
  * NAME
- *        h5lmove_c
+ *  h5lmove_c
  * PURPOSE
- *     Call  H5Lmove
+ *  Call  H5Lmove
  * INPUTS
  *
- *    src_loc_id   - Original file or group identifier.
- *    src_name     - Original link name.
- *    src_namelen  - name length
- *    dest_loc_id  - Destination file or group identifier.
- *    dest_name    - NEW link name.
- *    dest_namelen - name length
+ *  src_loc_id   - Original file or group identifier.
+ *  src_name     - Original link name.
+ *  src_namelen  - name length
+ *  dest_loc_id  - Destination file or group identifier.
+ *  dest_name    - NEW link name.
+ *  dest_namelen - name length
  * OUTPUTS
  *
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 3, 2008
+ *  March 3, 2008
  * SOURCE
 */
 int_f
-nh5lmove_c(hid_t_f *src_loc_id, _fcd src_name, size_t_f *src_namelen, hid_t_f *dest_loc_id,
+h5lmove_c(hid_t_f *src_loc_id, _fcd src_name, size_t_f *src_namelen, hid_t_f *dest_loc_id,
 	   _fcd dest_name, size_t_f *dest_namelen, hid_t_f *lcpl_id, hid_t_f *lapl_id)
 /******/
 {
@@ -682,17 +682,17 @@ done:
  *  Call  H5Lget_name_by_idx
  * INPUTS
  *
- *   loc_id      - File or group identifier specifying location of subject group
- *   group_name  - Name of subject group
- *   index_field - Index or field which determines the order
- *   order       - Order within field or index
- *   n           - Link for which to retrieve information
- *   size        - Maximum number of characters of link value to be returned.
- *   lapl_id     - Link access property list
+ *  loc_id      - File or group identifier specifying location of subject group
+ *  group_name  - Name of subject group
+ *  index_field - Index or field which determines the order
+ *  order       - Order within field or index
+ *  n           - Link for which to retrieve information
+ *  size        - Maximum number of characters of link value to be returned.
+ *  lapl_id     - Link access property list
  * OUTPUTS
  *
- *   name        - Buffer in which link value is returned
- *   size        - The size of the link name on success
+ *  name        - Buffer in which link value is returned
+ *  size        - The size of the link name on success
  * RETURNS
  *  0 on success, -1 on failure
  * AUTHOR
@@ -701,7 +701,7 @@ done:
  * SOURCE
 */
 int_f
-nh5lget_name_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen,
+h5lget_name_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen,
 		      int_f *index_field, int_f *order, hsize_t_f *n,
 		      size_t_f *size, _fcd name, hid_t_f *lapl_id)
 /******/
@@ -774,7 +774,7 @@ done:
 /*  * SOURCE */
 /* *\/ */
 /* int_f */
-/* nh5lget_val_c (hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen, */
+/* h5lget_val_c (hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen, */
 /* 	       size_t_f *size, _fcd linkval_buff, */
 /* 	       hid_t_f *lapl_id) */
 /* { */
@@ -842,7 +842,7 @@ done:
 
 /* int_f */
 
-/* nh5lregistered_c(int_f *version, int_f *class_id, */
+/* h5lregistered_c(int_f *version, int_f *class_id, */
 /* 		 _fcd comment, size_t_f *comment_len, */
 /* 		 _fcd create_func, size_t_f *create_func_len, */
 /* 		 _fcd move_func, size_t_f *move_func_len, */
@@ -916,29 +916,29 @@ done:
 
 /****if* H5Lf/h5lget_val_c
  * NAME
- *        h5lget_val_c
+ *  h5lget_val_c
  * PURPOSE
- *     Call H5Lget_val
+ *  Call H5Lget_val
  * INPUTS
  *
- *               link_loc_id - File or group identifier.
- *                 link_name - Link whose value is to be returned.
- *             link_name_len - length of link_name
- *                      size - Maximum number of characters of link value to be returned.
- *                  lapl_id  - List access property list identifier
+ *  link_loc_id - File or group identifier.
+ *  link_name - Link whose value is to be returned.
+ *  link_name_len - length of link_name
+ *  size - Maximum number of characters of link value to be returned.
+ *  lapl_id  - List access property list identifier
  * OUTPUTS
  *
- *             linkval_buff  - The buffer to hold the returned link value.
+ *  linkval_buff  - The buffer to hold the returned link value.
  *
  * RETURNS
- *      0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              April 11, 2008
+ *  April 11, 2008
  * SOURCE
 */
 int_f
-nh5lget_val_c(hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen, size_t_f *size,
+h5lget_val_c(hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen, size_t_f *size,
 	      void *linkval_buff, hid_t_f *lapl_id)
 /******/
 {    
@@ -971,16 +971,16 @@ done:
  *  Calls H5Literate
  * INPUTS
  *
- *     group_id - Identifier specifying subject group
- *   index_type - Type of index which determines the order
- *        order - Order within index
- *          idx - Iteration position at which to start
- *           op - Callback function passing data regarding the link to the calling application
- *      op_data - User-defined pointer to data required by the application for its processing of the link
+ *  group_id - Identifier specifying subject group
+ *  index_type - Type of index which determines the order
+ *  order - Order within index
+ *  idx - Iteration position at which to start
+ *  op - Callback function passing data regarding the link to the calling application
+ *  op_data - User-defined pointer to data required by the application for its processing of the link
  *
  * OUTPUTS
  *
- *          idx - Position at which an interrupted iteration may be restarted
+ *  idx - Position at which an interrupted iteration may be restarted
  *
  * RETURNS
  *  >0 on success, 0< on failure
@@ -1018,19 +1018,19 @@ h5literate_c(hid_t_f *group_id, int_f *index_type, int_f *order, hsize_t_f *idx,
  *  Call H5Literate_by_name
  * INPUTS
  *
- *      loc_id - Identifier specifying subject group
- *         name - Name of subject group
- *      namelen - Name length
- *   index_type - Type of index which determines the order
- *        order - Order within index
- *          idx - Iteration position at which to start
- *           op - Callback function passing data regarding the link to the calling application
- *      op_data - User-defined pointer to data required by the application for its processing of the link
- *      lapl_id - List access property list identifier
+ *  loc_id - Identifier specifying subject group
+ *  name - Name of subject group
+ *  namelen - Name length
+ *  index_type - Type of index which determines the order
+ *  order - Order within index
+ *  idx - Iteration position at which to start
+ *  op - Callback function passing data regarding the link to the calling application
+ *  op_data - User-defined pointer to data required by the application for its processing of the link
+ *  lapl_id - List access property list identifier
  *
  * OUTPUTS
  *
- *          idx - Position at which an interrupted iteration may be restarted
+ *  idx - Position at which an interrupted iteration may be restarted
  *
  * RETURNS
  *  >0 on success, 0< on failure
diff --git a/fortran/src/H5Lff.F90 b/fortran/src/H5Lff.F90
new file mode 100644
index 0000000..bc91072
--- /dev/null
+++ b/fortran/src/H5Lff.F90
@@ -0,0 +1,1478 @@
+!****h* ROBODoc/H5L
+!
+! NAME
+!  MODULE H5L
+!
+! PURPOSE
+!  This file contains Fortran interfaces for H5L functions.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! NOTES
+!       _____ __  __ _____   ____  _____ _______       _   _ _______
+!      |_   _|  \/  |  __ \ / __ \|  __ \__   __|/\   | \ | |__   __|
+! ****   | | | \  / | |__) | |  | | |__) | | |  /  \  |  \| |  | |    ****
+! ****   | | | |\/| |  ___/| |  | |  _  /  | | / /\ \ | . ` |  | |    ****
+! ****  _| |_| |  | | |    | |__| | | \ \  | |/ ____ \| |\  |  | |    ****
+!      |_____|_|  |_|_|     \____/|_|  \_\ |_/_/    \_\_| \_|  |_|
+!
+!  If you add a new H5L function you must add the function name to the
+!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
+!  This is needed for Windows based operating systems.
+!
+!*****
+
+MODULE H5L
+
+  USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR, C_FUNPTR, C_CHAR, C_INT64_T, C_INT
+  USE H5GLOBAL
+
+  IMPLICIT NONE
+
+!****t* H5L (F03)/h5l_info_t
+!
+! Fortran2003 Derived Type:
+!
+  TYPE, bind(c) :: union_t
+     INTEGER(haddr_t) :: address
+     INTEGER(size_t)  :: val_size
+  END TYPE union_t
+
+  TYPE, bind(c) :: h5l_info_t
+     INTEGER(c_int) :: type ! H5L_type_t     type
+!       LOGICAL(c_bool) :: corder_valid ! hbool_t        corder_valid
+     INTEGER(c_int64_t) :: corder ! int64_t        corder;
+     INTEGER(c_int) :: cset ! H5T_cset_t     cset;
+     TYPE(union_t) :: u
+  END TYPE h5l_info_t
+
+!*****
+
+!type specifies the link class. Valid values include the following:
+!     	H5L_TYPE_HARD 	  Hard link
+!     	H5L_TYPE_SOFT 	  Soft link
+!     	H5L_TYPE_EXTERNAL External link
+!     	H5L_TYPE_ERROR 	  Error 
+!cset specifies the character set in which the link name is encoded. Valid values include the following:
+!     	H5T_CSET_ASCII 	US ASCII
+!     	H5T_CSET_UTF8   UTF-8 Unicode encoding 
+
+CONTAINS
+
+!
+!****s* H5L/h5lcopy_f
+!
+! NAME
+!  h5lcopy_f
+!
+! PURPOSE
+!  Copies a link from one location to another.
+!
+! INPUTS
+!  src_loc_id 	 - Location identifier of the source link
+!  src_name 	 - Name of the link to be copied
+!  dest_loc_id 	 - Location identifier specifying the destination of the copy
+!  dest_name 	 - Name to be assigned to the NEW copy
+!  loc_id 	 - Identifier of the file or group containing the object
+!  name 	 - Name of the link to delete
+!
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  lcpl_id 	 - Link creation property list identifier
+!  lapl_id 	 - Link access property list identifier
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 27, 2008
+!
+! SOURCE
+  SUBROUTINE h5lcopy_f(src_loc_id, src_name, dest_loc_id, dest_name, hdferr, &
+       lcpl_id, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: src_loc_id  ! Location identifier of the source link
+    CHARACTER(LEN=*), INTENT(IN) :: src_name   ! Name of the link to be copied
+    INTEGER(HID_T), INTENT(IN) :: dest_loc_id ! Location identifier specifying the destination of the copy
+    CHARACTER(LEN=*), INTENT(IN) :: dest_name ! Name to be assigned to the NEW copy
+
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code:
+                                          ! 0 on success and -1 on failure
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lcpl_id ! Link creation property list identifier
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list identifier
+!*****
+    INTEGER(HID_T) :: lcpl_id_default
+    INTEGER(HID_T) :: lapl_id_default
+
+    INTEGER(SIZE_T) :: src_namelen
+    INTEGER(SIZE_T) :: dest_namelen
+
+    INTERFACE
+       INTEGER FUNCTION h5lcopy_c(src_loc_id, src_name, src_namelen, dest_loc_id, dest_name, dest_namelen, &
+            lcpl_id_default, lapl_id_default) BIND(C,name='h5lcopy_c')
+         IMPORT ::  c_char
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: src_loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: src_name
+         INTEGER(HID_T), INTENT(IN) :: dest_loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: dest_name
+
+         INTEGER(HID_T) :: lcpl_id_default
+         INTEGER(HID_T) :: lapl_id_default
+
+         INTEGER(SIZE_T) :: src_namelen
+         INTEGER(SIZE_T) :: dest_namelen
+       END FUNCTION h5lcopy_c
+    END INTERFACE
+
+    src_namelen  = LEN(src_name)
+    dest_namelen = LEN(dest_name)
+
+    lcpl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = h5lcopy_c(src_loc_id, src_name, src_namelen, dest_loc_id, dest_name, dest_namelen, &
+         lcpl_id_default, lapl_id_default)
+
+  END SUBROUTINE h5lcopy_f
+
+!
+!****s* H5L/h5ldelete_f
+!
+! NAME
+!  h5ldelete_f
+!
+! PURPOSE
+!  Removes a link from a group.
+!
+! INPUTS
+!  loc_id 	 - Identifier of the file or group containing the object
+!  name 	 - Name of the link to delete
+!
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  lapl_id 	 - Link access property list identifier
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  January, 2008
+!
+! SOURCE
+  SUBROUTINE h5ldelete_f(loc_id, name, hdferr, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id  ! Identifier of the file or group containing the object
+    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of the link to delete
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code:
+                                          ! 0 on success and -1 on failure
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list identifier
+!*****
+    INTEGER(HID_T) :: lapl_id_default
+    INTEGER(SIZE_T) :: namelen
+
+    INTERFACE
+       INTEGER FUNCTION h5ldelete_c(loc_id, name, namelen, lapl_id_default) BIND(C,name='h5ldelete_c')
+         IMPORT :: c_char
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER(HID_T) :: lapl_id_default
+         INTEGER(SIZE_T) :: namelen
+       END FUNCTION h5ldelete_c
+    END INTERFACE
+
+    namelen = LEN(name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = h5ldelete_c(loc_id, name, namelen, lapl_id_default)
+
+  END SUBROUTINE h5ldelete_f
+
+!
+!****s* H5L/H5Lcreate_soft_f
+!
+! NAME
+!  H5Lcreate_soft_f
+!
+! PURPOSE
+!  Creates a soft link to an object.
+!
+! INPUTS
+!  target_path 	 - Path to the target object, which is not required to exist.
+!  link_loc_id 	 - The file or group identifier for the new link.
+!  link_name 	 - The name of the new link.
+!
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  lcpl_id 	 - Link creation property list identifier.
+!  lapl_id 	 - Link access property list identifier.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 20, 2008
+!
+! SOURCE
+  SUBROUTINE h5lcreate_soft_f(target_path, link_loc_id, link_name, hdferr, lcpl_id, lapl_id)
+    IMPLICIT NONE
+    CHARACTER(LEN=*), INTENT(IN) :: target_path   ! Path to the target object, which is not required to exist.
+    INTEGER(HID_T), INTENT(IN) :: link_loc_id     ! The file or group identifier for the new link.
+    CHARACTER(LEN=*), INTENT(IN) :: link_name     ! The name of the new link.
+    INTEGER, INTENT(OUT) :: hdferr                ! Error code:
+                                                  !   0 on success and -1 on failure
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lcpl_id ! Link creation property list identifier.
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list identifier.
+!*****
+    INTEGER(HID_T) :: lcpl_id_default
+    INTEGER(HID_T) :: lapl_id_default
+    INTEGER(SIZE_T) :: target_path_len
+    INTEGER(SIZE_T) :: link_name_len
+
+    INTERFACE
+       INTEGER FUNCTION h5lcreate_soft_c(target_path, target_path_len, &
+            link_loc_id, &
+            link_name,link_name_len, &
+            lcpl_id_default, lapl_id_default ) BIND(C,NAME='h5lcreate_soft_c')
+         IMPORT :: c_char
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: target_path
+         INTEGER(SIZE_T) :: target_path_len
+         INTEGER(HID_T), INTENT(IN) ::   link_loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: link_name
+         INTEGER(SIZE_T) :: link_name_len
+         INTEGER(HID_T) :: lcpl_id_default
+         INTEGER(HID_T) :: lapl_id_default
+       END FUNCTION h5lcreate_soft_c
+    END INTERFACE
+
+    target_path_len = LEN(target_path)
+    link_name_len = LEN(link_name)
+
+    lcpl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = h5lcreate_soft_c(target_path, target_path_len,&
+         link_loc_id, &
+         link_name, link_name_len, &
+         lcpl_id_default, lapl_id_default )
+
+  END SUBROUTINE h5lcreate_soft_f
+
+!
+!****s* H5L/H5Lcreate_hard_f
+!
+! NAME
+!  H5Lcreate_hard_f
+!
+! PURPOSE
+!  Creates a hard link to an object.
+!
+! INPUTS
+!
+!  obj_loc_id 	 - The file or group identifier for the target object.
+!  obj_name 	 - Name of the target object, which must already exist.
+!  link_loc_id 	 - The file or group identifier for the new link.
+!  link_name 	 - The name of the new link.
+!
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  lcpl_id 	 - Link creation property list identifier.
+!  lapl_id 	 - Link access property list identifier.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 27, 2008
+!
+! SOURCE
+  SUBROUTINE h5lcreate_hard_f(obj_loc_id, obj_name, link_loc_id, link_name, hdferr, lcpl_id, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: obj_loc_id  ! The file or group identifier for the target object.
+    CHARACTER(LEN=*), INTENT(IN) :: obj_name  ! Name of the target object, which must already exist.
+    INTEGER(HID_T), INTENT(IN) :: link_loc_id ! The file or group identifier for the new link.
+    CHARACTER(LEN=*), INTENT(IN) :: link_name ! The name of the new link.
+
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code:
+                                          ! 0 on success and -1 on failure
+
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) ::   lcpl_id         ! Link creation property list identifier.
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) ::   lapl_id         ! Link access property list identifier.
+!*****
+    INTEGER(HID_T) :: lcpl_id_default
+    INTEGER(HID_T) :: lapl_id_default
+
+    INTEGER(SIZE_T) :: obj_namelen
+    INTEGER(SIZE_T) :: link_namelen
+
+    INTERFACE
+       INTEGER FUNCTION h5lcreate_hard_c(obj_loc_id, obj_name, obj_namelen, &
+            link_loc_id, link_name, link_namelen, lcpl_id_default, lapl_id_default) BIND(C,NAME='h5lcreate_hard_c')
+         IMPORT :: c_char
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: obj_loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: obj_name
+         INTEGER(HID_T), INTENT(IN) :: link_loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: link_name
+         INTEGER(SIZE_T) :: obj_namelen
+         INTEGER(SIZE_T) :: link_namelen
+         INTEGER(HID_T) :: lcpl_id_default
+         INTEGER(HID_T) :: lapl_id_default
+       END FUNCTION h5lcreate_hard_c
+    END INTERFACE
+    obj_namelen = LEN(obj_name)
+    link_namelen = LEN(link_name)
+
+    lcpl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = h5lcreate_hard_c(obj_loc_id, obj_name, obj_namelen, &
+            link_loc_id, link_name, link_namelen, lcpl_id_default, lapl_id_default)
+
+  END SUBROUTINE h5lcreate_hard_f
+
+!
+!****s* H5L/H5Lcreate_external_f
+!
+! NAME
+!  H5Lcreate_external_f
+!
+! PURPOSE
+!  Creates a soft link to an object in a different file.
+!
+! INPUTS
+!
+!  file_name 	 - Name of the file containing the target object. Neither the file nor the target object is
+!  required to exist. May be the file the link is being created in.
+!  obj_name 	 - Path within the target file to the target object.
+!  link_loc_id 	 - The file or group identifier for the new link.
+!  link_name 	 - The name of the new link.
+!
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  lcpl_id 	 - Link creation property list identifier.
+!  lapl_id 	 - Link access property list identifier.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 27, 2008
+! SOURCE
+  SUBROUTINE h5lcreate_external_f(file_name, obj_name, link_loc_id, link_name, hdferr, lcpl_id, lapl_id)
+    IMPLICIT NONE
+    CHARACTER(LEN=*), INTENT(IN) :: file_name ! Name of the file containing the target object. Neither
+                                              ! the file nor the target object is required to exist.
+                                              ! May be the file the link is being created in.
+    CHARACTER(LEN=*), INTENT(IN) :: obj_name  ! Name of the target object, which must already exist.
+    INTEGER(HID_T), INTENT(IN) :: link_loc_id ! The file or group identifier for the new link.
+    CHARACTER(LEN=*), INTENT(IN) :: link_name ! The name of the new link.
+
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code:
+                                          ! 0 on success and -1 on failure
+
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lcpl_id ! Link creation property list identifier.
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list identifier.
+!*****
+    INTEGER(HID_T) :: lcpl_id_default
+    INTEGER(HID_T) :: lapl_id_default
+
+    INTEGER(SIZE_T) :: file_namelen
+    INTEGER(SIZE_T) :: obj_namelen
+    INTEGER(SIZE_T) :: link_namelen
+
+    INTERFACE
+       INTEGER FUNCTION h5lcreate_external_c(file_name, file_namelen, obj_name, obj_namelen, &
+            link_loc_id, link_name, link_namelen, lcpl_id_default, lapl_id_default) BIND(C,NAME='h5lcreate_external_c')
+         IMPORT :: c_char
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: file_name
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: obj_name
+         INTEGER(HID_T), INTENT(IN) :: link_loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: link_name
+         INTEGER(SIZE_T) :: file_namelen
+         INTEGER(SIZE_T) :: obj_namelen
+         INTEGER(SIZE_T) :: link_namelen
+         INTEGER(HID_T) :: lcpl_id_default
+         INTEGER(HID_T) :: lapl_id_default
+       END FUNCTION h5lcreate_external_c
+    END INTERFACE
+    file_namelen = LEN(file_name)
+    obj_namelen = LEN(obj_name)
+    link_namelen = LEN(link_name)
+
+    lcpl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = h5lcreate_external_c(file_name, file_namelen, obj_name, obj_namelen, &
+            link_loc_id, link_name, link_namelen, lcpl_id_default, lapl_id_default)
+
+  END SUBROUTINE h5lcreate_external_f
+
+!
+!****s* H5L/h5ldelete_by_idx_f
+!
+! NAME
+!  h5ldelete_by_idx_f
+!
+! PURPOSE
+!  Removes the nth link in a group.
+! INPUTS
+!  loc_id 	 - File or group identifier specifying location of subject group
+!  group_name 	 - Name of subject group
+!  index_field 	 - Type of index; Possible values are:
+!                    H5_INDEX_UNKNOWN_F = -1  - Unknown index type
+!                    H5_INDEX_NAME_F 	      - Index on names
+!                    H5_INDEX_CRT_ORDER_F     - Index on creation order
+!                    H5_INDEX_N_F 	      - Number of indices defined
+!
+!  order 	 - Order within field or index; Possible values are:
+!                    H5_ITER_UNKNOWN_F 	 - Unknown order
+!                    H5_ITER_INC_F 	 - Increasing order
+!                    H5_ITER_DEC_F 	 - Decreasing order
+!                    H5_ITER_NATIVE_F 	 - No particular order, whatever is fastest
+!                    H5_ITER_N_F 	 - Number of iteration orders
+!
+!  n 	         - Link for which to retrieve information
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  lapl_id 	 - Link access property list
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 29, 2008
+! SOURCE
+  SUBROUTINE h5ldelete_by_idx_f(loc_id, group_name, index_field, order, n, hdferr, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id       ! Identifer for object to which attribute is attached
+    CHARACTER(LEN=*), INTENT(IN) :: group_name ! Name of object, relative to location,
+                                               !  from which attribute is to be removed
+    INTEGER, INTENT(IN) :: index_field         ! Type of index; Possible values are:
+                                               !    H5_INDEX_UNKNOWN_F   - Unknown index type
+                                               !    H5_INDEX_NAME_F      - Index on names
+                                               !    H5_INDEX_CRT_ORDER_F - Index on creation order
+                                               !    H5_INDEX_N_F	      - Number of indices defined
+    INTEGER, INTENT(IN) :: order               ! Order in which to iterate over index; Possible values are:
+                                               !    H5_ITER_UNKNOWN_F  - Unknown order
+                                               !    H5_ITER_INC_F      - Increasing order
+                                               !    H5_ITER_DEC_F      - Decreasing order
+                                               !    H5_ITER_NATIVE_F   - No particular order, whatever is fastest
+                                               !    H5_ITER_N_F	    - Number of iteration orders
+    INTEGER(HSIZE_T), INTENT(IN) :: n      ! Offset within index
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code:
+                                           ! 0 on success and -1 on failure
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id     ! Link access property list
+!*****
+    INTEGER(HID_T) :: lapl_id_default
+    INTEGER(SIZE_T) :: group_namelen
+
+    INTERFACE
+       INTEGER FUNCTION h5ldelete_by_idx_c(loc_id, group_name, group_namelen, index_field, order, n, lapl_id_default) &
+            BIND(C,NAME='h5ldelete_by_idx_c')
+         IMPORT :: c_char
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: group_name
+         INTEGER, INTENT(IN) :: index_field
+         INTEGER, INTENT(IN) :: order
+         INTEGER(HSIZE_T), INTENT(IN) :: n
+         INTEGER(HID_T) :: lapl_id_default
+         INTEGER(SIZE_T) :: group_namelen
+       END FUNCTION h5ldelete_by_idx_c
+    END INTERFACE
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    group_namelen = LEN(group_name)
+    hdferr = h5ldelete_by_idx_c(loc_id, group_name, group_namelen, index_field, order, n, lapl_id_default)
+
+  END SUBROUTINE h5ldelete_by_idx_f
+
+!
+!****s* H5L/H5Lexists_f
+!
+! NAME
+!  H5Lexists_f
+!
+! PURPOSE
+!  Check if a link with a particular name exists in a group.
+!
+! INPUTS
+!  loc_id 	 - Identifier of the file or group to query.
+!  name 	 - Link name to check
+!
+! OUTPUTS
+!  link_exists 	 - link exists status (.TRUE.,.FALSE.)
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  lapl_id 	 - Link access property list identifier.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 29, 2008
+!
+! SOURCE
+  SUBROUTINE h5lexists_f(loc_id, name, link_exists, hdferr, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id  ! Identifier of the file or group to query.
+    CHARACTER(LEN=*), INTENT(IN) :: name  ! Link name to check.
+    LOGICAL, INTENT(OUT) :: link_exists   ! .TRUE. if exists, .FALSE. otherwise
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code:
+                                          ! 0 on success and -1 on failure
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id
+                                          ! Link access property list identifier.
+!*****
+    INTEGER :: link_exists_c
+    INTEGER(HID_T)  :: lapl_id_default
+    INTEGER(SIZE_T) :: namelen
+
+    INTERFACE
+       INTEGER FUNCTION h5lexists_c(loc_id, name, namelen, lapl_id_default, link_exists_c) &
+            BIND(C,NAME='h5lexists_c')
+         IMPORT :: c_char
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER(SIZE_T), INTENT(IN) :: namelen
+         INTEGER, INTENT(OUT) :: link_exists_c
+         INTEGER(HID_T) :: lapl_id_default
+
+       END FUNCTION h5lexists_c
+    END INTERFACE
+
+    namelen = LEN(name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = h5lexists_c(loc_id, name, namelen, lapl_id_default, link_exists_c)
+
+    link_exists = .FALSE.
+    IF(link_exists_c.GT.0) link_exists = .TRUE.
+
+  END SUBROUTINE h5lexists_f
+
+!
+!****s* H5L/h5lget_info_f
+!
+! NAME
+!  h5lget_info_f
+!
+! PURPOSE
+!  Returns information about a link.
+!
+! INPUTS
+!  link_loc_id 	 - File or group identifier.
+!  link_name 	 - Name of the link for which information is being sought
+!
+! OUTPUTS  
+!            NOTE: In C these are contained in the structure H5L_info_t
+!
+!  cset 	 - indicates the character set used for link’s name.
+!  corder 	 - specifies the link’s creation order position.
+!  corder_valid  - indicates whether the value in corder is valid.
+!  link_type 	 - specifies the link class:
+!                    H5L_TYPE_HARD_F 	 - Hard link
+!                    H5L_TYPE_SOFT_F 	 - Soft link
+!                    H5L_TYPE_EXTERNAL_F - External link
+!                    H5L_TYPE_ERROR_ F   - Error
+!  address 	 - If the link is a hard link, address specifies the file address that the link points to
+!  val_size 	 - If the link is a symbolic link, val_size will be the length of the link value, e.g., 
+!                  the length of the name of the pointed-to object with a null terminator. 
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! OPTIONAL PARAMETERS
+!  lapl_id 	 - Link access property list
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 29, 2008
+!
+! HISTORY
+!   Changed the link_type names to match those in C (bug 1720) from,
+!   H5L_LINK_HARD_F, H5L_LINK_SOFT_F,H5L_LINK_EXTERNAL_F,H5L_LINK_ERROR_F
+!   to
+!   H5L_TYPE_HARD_F, H5L_TYPE_SOFT_F,H5L_TYPE_EXTERNAL_F,H5L_TYPE_ERROR_F
+!   MSB January 8, 2010.
+!
+! SOURCE
+  SUBROUTINE h5lget_info_f(link_loc_id, link_name, &
+       cset, corder, f_corder_valid, link_type, address, val_size, &
+       hdferr, lapl_id)
+    IMPLICIT NONE
+
+    INTEGER(HID_T), INTENT(IN) :: link_loc_id ! File or group identifier.
+    CHARACTER(LEN=*), INTENT(IN) :: link_name ! Name of the link for which information is being sought
+
+! OUTPUTS  NOTE: In C these are contained in the structure H5L_info_t
+    INTEGER, INTENT(OUT) :: cset ! Indicates the character set used for the link’s name.
+    INTEGER, INTENT(OUT) :: corder ! Specifies the link’s creation order position.
+    LOGICAL, INTENT(OUT) :: f_corder_valid ! Indicates whether the value in corder is valid.
+    INTEGER, INTENT(OUT) :: link_type ! Specifies the link class:
+     	                              !  H5L_TYPE_HARD_F      - Hard link
+     	                              !  H5L_TYPE_SOFT_F      - Soft link
+     	                              !  H5L_TYPE_EXTERNAL_F  - External link
+     	                              !  H5L_TYPE_ERROR _F    - Error
+    INTEGER(HADDR_T), INTENT(OUT) :: address ! If the link is a hard link, address specifies the file address that the link points to
+    INTEGER(SIZE_T), INTENT(OUT) :: val_size ! If the link is a symbolic link, val_size will be the length of the link value, e.g., 
+                                             ! the length of the name of the pointed-to object with a null terminator. 
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
+                                         ! 0 on success and -1 on failure
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id  ! Link access property list
+!*****
+    INTEGER(SIZE_T) :: link_namelen
+    INTEGER(HID_T) :: lapl_id_default
+    INTEGER :: corder_valid
+
+    INTERFACE
+       INTEGER FUNCTION h5lget_info_c(link_loc_id, link_name, link_namelen, &
+            cset, corder, corder_valid, link_type, address, val_size, &
+            lapl_id_default) BIND(C,NAME='h5lget_info_c')
+         IMPORT :: c_char
+         IMPORT :: HID_T, SIZE_T, HADDR_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: link_loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: link_name
+         INTEGER, INTENT(OUT) :: cset
+         INTEGER, INTENT(OUT) :: corder
+         INTEGER, INTENT(OUT) :: link_type
+         INTEGER(HADDR_T), INTENT(OUT) :: address
+         INTEGER(SIZE_T), INTENT(OUT) :: val_size
+         INTEGER(HID_T) :: lapl_id_default
+         INTEGER(SIZE_T) :: link_namelen
+         INTEGER :: corder_valid
+       END FUNCTION h5lget_info_c
+    END INTERFACE
+
+    link_namelen = LEN(link_name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = h5lget_info_c(link_loc_id, link_name, link_namelen, &
+         cset, corder, corder_valid, link_type, &
+         address, val_size, &
+         lapl_id_default)
+
+    f_corder_valid =.FALSE.
+    IF(corder_valid .EQ. 1) f_corder_valid =.TRUE.
+
+  END SUBROUTINE h5lget_info_f
+
+!
+!****s* H5L/h5lget_info_by_idx_f
+!
+! NAME
+!  h5lget_info_by_idx_f
+!
+! PURPOSE
+!  Retrieves metadata for a link in a group, according to the order within a field or index.
+!
+! INPUTS
+!  loc_id 	 - File or group identifier specifying location of subject group
+!  group_name 	 - Name of subject group
+!  index_field 	 - Index or field which determines the order
+!  order 	 - Order within field or index
+!  n 	         - Link for which to retrieve information
+!
+! OUTPUTS  
+!            NOTE: In C these are defined as a structure: H5L_info_t
+!  corder_valid  - Indicates whether the creation order data is valid for this attribute
+!  corder 	 - Is a positive integer containing the creation order of the attribute
+!  cset 	 - Indicates the character set used for the attribute’s name 
+! address        - If the link is a hard link, address specifies the file address that the link points to
+! val_size       - If the link is a symbolic link, val_size will be the length of the link value, e.g., 
+!                  the length of the name of the pointed-to object with a null terminator.
+! hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! OPTIONAL PARAMETERS
+!  lapl_id 	 - Link access property list
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 29, 2008
+!
+! HISTORY
+!   Changed the link_type names to match those in C (bug 1720) from,
+!   H5L_LINK_HARD_F, H5L_LINK_SOFT_F,H5L_LINK_EXTERNAL_F,H5L_LINK_ERROR_F
+!   to
+!   H5L_TYPE_HARD_F, H5L_TYPE_SOFT_F,H5L_TYPE_EXTERNAL_F,H5L_TYPE_ERROR_F
+!   MSB January 8, 2010.  
+!
+! SOURCE
+  SUBROUTINE h5lget_info_by_idx_f(loc_id, group_name, index_field, order, n, &
+       link_type, f_corder_valid, corder, cset, address, val_size, hdferr, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id       ! File or group identifier specifying location of subject group  
+    CHARACTER(LEN=*), INTENT(IN) :: group_name ! Name of subject group
+    INTEGER, INTENT(IN) :: index_field  ! Index or field which determines the order
+                                        !    H5_INDEX_UNKNOWN_F   - Unknown index type
+                                        !    H5_INDEX_NAME_F      - Index on names
+                                        !    H5_INDEX_CRT_ORDER_F - Index on creation order
+                                        !    H5_INDEX_N_F	      - Number of indices defined
+    INTEGER, INTENT(IN) :: order        ! Order in which to iterate over index; Possible values are:
+                                        !    H5_ITER_UNKNOWN_F  - Unknown order
+                                        !    H5_ITER_INC_F      - Increasing order
+                                        !    H5_ITER_DEC_F      - Decreasing order
+                                        !    H5_ITER_NATIVE_F   - No particular order, whatever is fastest
+    INTEGER(HSIZE_T), INTENT(IN) :: n   ! Attribute’s position in index
+    INTEGER, INTENT(OUT) :: link_type ! Specifies the link class:
+     	                              !  H5L_TYPE_HARD_F      - Hard link
+     	                              !  H5L_TYPE_SOFT_F      - Soft link
+     	                              !  H5L_TYPE_EXTERNAL_F  - External link
+     	                              !  H5L_TYPE_ERROR _F    - Error
+    LOGICAL, INTENT(OUT) :: f_corder_valid ! Indicates whether the creation order data is valid for this attribute 
+    INTEGER, INTENT(OUT) :: corder         ! Is a positive integer containing the creation order of the attribute
+    INTEGER, INTENT(OUT) :: cset           ! Indicates the character set used for the attribute’s name
+    INTEGER(HADDR_T), INTENT(OUT) :: address  ! If the link is a hard link, address specifies the file address that the link points to
+    INTEGER(SIZE_T), INTENT(OUT) :: val_size  ! If the link is a symbolic link, val_size will be the length of the link value, e.g., 
+                                              ! the length of the name of the pointed-to object with a null terminator. 
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
+                                         ! 0 on success and -1 on failure
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id  ! Link access property list
+!*****
+    INTEGER :: corder_valid
+    INTEGER(SIZE_T)  :: group_namelen
+    INTEGER(HID_T) :: lapl_id_default
+
+!  MS FORTRAN needs explicit interface for C functions called here.
+!
+    INTERFACE
+       INTEGER FUNCTION h5lget_info_by_idx_c(loc_id, group_name, group_namelen, index_field, order, n, &
+            link_type, corder_valid, corder, cset, address, val_size, lapl_id_default) &
+            BIND(C,NAME='h5lget_info_by_idx_c')
+         IMPORT :: c_char
+         IMPORT :: HID_T, SIZE_T, HSIZE_T, HADDR_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: group_name
+         INTEGER(SIZE_T)  :: group_namelen
+         INTEGER, INTENT(IN) :: index_field
+         INTEGER, INTENT(IN) :: order
+         INTEGER(HSIZE_T), INTENT(IN) :: n
+         INTEGER, INTENT(OUT) :: link_type
+         INTEGER :: corder_valid 
+         INTEGER, INTENT(OUT) :: corder
+         INTEGER, INTENT(OUT) :: cset
+         INTEGER(HADDR_T), INTENT(OUT) :: address
+         INTEGER(SIZE_T), INTENT(OUT) :: val_size
+         INTEGER(HID_T) :: lapl_id_default
+       END FUNCTION h5lget_info_by_idx_c
+    END INTERFACE
+
+    group_namelen = LEN(group_name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = h5lget_info_by_idx_c(loc_id, group_name, group_namelen, index_field, order, n, &
+         link_type, corder_valid, corder, cset, address, val_size, lapl_id_default)
+
+    f_corder_valid =.FALSE.
+    IF (corder_valid .EQ. 1) f_corder_valid =.TRUE.
+
+  END SUBROUTINE h5lget_info_by_idx_f
+
+!
+!****s* H5L/h5lis_registered_f
+!
+! NAME
+!  h5lis_registered_f
+!
+! PURPOSE
+!  Determines whether a class of user-defined links is registered.
+!
+! INPUTS
+!  link_cls_id 	 - User-defined link class identifier
+!
+! OUTPUTS
+!  registered 	 - .TRUE.  - if the link class has been registered
+!                  .FALSE. - if it is unregistered
+!  hdferr 	 - Error code
+!  Success:  0
+!  Failure: -1
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 29, 2008
+!
+! SOURCE
+  SUBROUTINE h5lis_registered_f(link_cls_id, registered, hdferr)
+    IMPLICIT NONE
+    INTEGER, INTENT(IN) :: link_cls_id  ! User-defined link class identifier
+    LOGICAL, INTENT(OUT) :: registered  ! .TRUE. - if the link class has been registered and
+                                        ! .FALSE. - if it is unregistered
+    INTEGER, INTENT(OUT) :: hdferr      ! Error code:
+                                        ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5lis_registered_c(link_cls_id) BIND(C,NAME='h5lis_registered_c')
+         IMPLICIT NONE
+         INTEGER, INTENT(IN) :: link_cls_id  ! User-defined link class identifier
+       END FUNCTION h5lis_registered_c
+    END INTERFACE
+
+    hdferr = h5lis_registered_c(link_cls_id)
+
+    IF(hdferr.GT.0)THEN
+       registered = .TRUE.
+    ELSE IF(hdferr.EQ.0)THEN
+       registered = .FALSE.
+    ENDIF
+
+  END SUBROUTINE h5lis_registered_f
+
+!
+!****s* H5L/h5lmove_f
+!
+! NAME
+!  h5lmove_f
+!
+! PURPOSE
+!  Renames a link within an HDF5 file.
+!
+! INPUTS
+!  src_loc_id 	 - Original file or group identifier.
+!  src_name 	 - Original link name.
+!  dest_loc_id 	 - Destination file or group identifier.
+!  dest_name 	 - NEW link name.
+!
+! OUTPUTS
+!  hdferr 	 - Error code:
+!                   0 on success and -1 on failure
+!
+! OPTIONAL PARAMETERS
+!  lcpl_id 	 - Link creation property list identifier to be associated WITH the NEW link.
+!  lapl_id 	 - Link access property list identifier to be associated WITH the NEW link.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 3, 2008
+!
+! SOURCE
+  SUBROUTINE h5lmove_f(src_loc_id, src_name, dest_loc_id, dest_name, hdferr, lcpl_id, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: src_loc_id  ! Original file or group identifier.
+    CHARACTER(LEN=*), INTENT(IN) :: src_name  ! Original link name.
+    INTEGER(HID_T), INTENT(IN) :: dest_loc_id ! Destination file or group identifier.
+    CHARACTER(LEN=*), INTENT(IN) :: dest_name ! NEW link name.
+    INTEGER, INTENT(OUT) :: hdferr     ! Error code:
+                                              ! 0 on success and -1 on failure
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lcpl_id ! Link creation property list identifier
+                                                    ! to be associated WITH the NEW link.
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list identifier
+                                                    ! to be associated WITH the NEW link.
+!*****
+    INTEGER(SIZE_T) :: src_namelen
+    INTEGER(SIZE_T) :: dest_namelen
+
+    INTEGER(HID_T) :: lcpl_id_default
+    INTEGER(HID_T) :: lapl_id_default
+
+    INTERFACE
+       INTEGER FUNCTION h5lmove_c(src_loc_id, src_name, src_namelen, dest_loc_id, &
+            dest_name, dest_namelen, lcpl_id_default, lapl_id_default) BIND(C,NAME='h5lmove_c')
+         IMPORT :: c_char
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: src_loc_id
+
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: src_name
+         INTEGER(SIZE_T) :: src_namelen
+         INTEGER(HID_T), INTENT(IN) :: dest_loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: dest_name
+         INTEGER(SIZE_T) :: dest_namelen
+
+         INTEGER(HID_T) :: lcpl_id_default
+         INTEGER(HID_T) :: lapl_id_default
+
+       END FUNCTION h5lmove_c
+    END INTERFACE
+
+    lcpl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    src_namelen = LEN(src_name)
+    dest_namelen = LEN(dest_name)
+
+    hdferr = H5Lmove_c(src_loc_id, src_name, src_namelen, dest_loc_id, &
+         dest_name, dest_namelen, lcpl_id_default, lapl_id_default)
+
+  END SUBROUTINE h5lmove_f
+
+!
+!****s* H5L/h5lget_name_by_idx_f
+!
+! NAME
+!  h5lget_name_by_idx_f
+!
+! PURPOSE
+!  Retrieves name of the nth link in a group, according to the order within a specified field or index.
+!
+! INPUTS
+!  loc_id 	 - File or group identifier specifying location of subject group
+!  group_name 	 - Name of subject group
+!  index_field 	 - Index or field which determines the order
+!  order 	 - Order within field or index
+!  n 	         - Link for which to retrieve information
+!
+! OUTPUTS
+!  name 	 - Buffer in which link value is returned
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! OPTIONAL PARAMETERS
+!  lapl_id 	 - List access property list identifier.
+!  size 	 - Maximum number of characters of link value to be returned.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 10, 2008
+!
+! SOURCE
+  SUBROUTINE h5lget_name_by_idx_f(loc_id, group_name, index_field, order, n, &
+        name, hdferr, size, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id       ! File or group identifier specifying location of subject group
+    CHARACTER(LEN=*), INTENT(IN) :: group_name ! Name of subject group
+    INTEGER, INTENT(IN) :: index_field  ! Index or field which determines the order
+                                        !    H5_INDEX_UNKNOWN_F   - Unknown index type
+                                        !    H5_INDEX_NAME_F      - Index on names
+                                        !    H5_INDEX_CRT_ORDER_F - Index on creation order
+                                        !    H5_INDEX_N_F	      - Number of indices defined
+    INTEGER, INTENT(IN) :: order        ! Order in which to iterate over index; Possible values are:
+                                        !    H5_ITER_UNKNOWN_F  - Unknown order
+                                        !    H5_ITER_INC_F      - Increasing order
+                                        !    H5_ITER_DEC_F      - Decreasing order
+                                        !    H5_ITER_NATIVE_F   - No particular order, whatever is fastest
+    INTEGER(HSIZE_T), INTENT(IN) :: n   ! Attribute’s position in index
+    CHARACTER(LEN=*), INTENT(OUT) :: name ! Buffer in which link value is returned
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code:
+                                          ! 0 on success and -1 on failure
+!*****
+    INTEGER(SIZE_T)  :: group_namelen
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id  ! Link access property list
+    INTEGER(HID_T) :: lapl_id_default
+    INTEGER(SIZE_T), OPTIONAL, INTENT(OUT) :: size   ! Indicates the size, in the number of characters, of the link
+    INTEGER(SIZE_T) :: size_default
+
+    INTERFACE
+       INTEGER FUNCTION h5lget_name_by_idx_c(loc_id, group_name, group_namelen, index_field, order, n, &
+             size_default, name, lapl_id_default) BIND(C,NAME='h5lget_name_by_idx_c')
+         IMPORT :: c_char
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: group_name
+         INTEGER(SIZE_T)  :: group_namelen
+         INTEGER, INTENT(IN) :: index_field
+         INTEGER, INTENT(IN) :: order
+         INTEGER(HSIZE_T), INTENT(IN) :: n
+         INTEGER(SIZE_T) :: size_default
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: name
+         INTEGER(HID_T) :: lapl_id_default
+       END FUNCTION h5lget_name_by_idx_c
+    END INTERFACE
+
+    group_namelen = LEN(group_name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    size_default = LEN(name)
+
+    hdferr = h5lget_name_by_idx_c(loc_id, group_name, group_namelen, index_field, order, n, &
+             size_default, name, lapl_id_default)
+
+    IF(PRESENT(size)) size = size_default
+
+
+  END SUBROUTINE h5lget_name_by_idx_f
+
+
+!  HAS PROBLEM WITH void pointer in C
+!!$!
+!!$!****s* H5L/
+!!$!
+!!$! NAME
+!!$!		h5lget_val_by_idx_f
+!!$!
+!!$! PURPOSE
+!!$!      Returns the link value of a link, according to the order of
+!!$!               an index.  For symbolic links, this is the path to which the
+!!$!               link points, including the null terminator.  For user-defined
+!!$!               links, it is the link buffer.
+!!$! INPUTS
+!!$!   loc_id      - File or group identifier specifying location of subject group
+!!$!   group_name  - Name of subject group
+!!$!   index_field - Index or field which determines the order
+!!$!   order       - Order within field or index
+!!$!   n           - Link for which to retrieve information
+!!$!   size        - Maximum number of characters of link value to be returned.
+!!$!
+!!$! OUTPUTS  NOTE: In C these are defined as a structure: H5L_info_t
+!!$!    corder_valid   - indicates whether the creation order data is valid for this attribute
+!!$!    corder         - is a positive integer containing the creation order of the attribute
+!!$!    cset           - indicates the character set used for the attribute’s name
+!!$!    data_size      - indicates the size, in the number of characters, of the attribute
+!!$!    hdferr         - error code
+!!$!				 Success:  0
+!!$!				 Failure: -1
+!!$! OPTIONAL PARAMETERS
+!!$!    lapl_id      - List access property list identifier.
+!!$!
+!!$! AUTHOR
+!!$!	M. Scot Breitenfeld
+!!$!		March 3, 2008
+!!$!
+!!$! HISTORY  N/A
+!!$!
+!!$!
+!!$! SOURCE
+!!$  SUBROUTINE h5lget_val_by_idx_f(loc_id, group_name, index_field, order, n, &
+!!$       f_corder_valid, corder, cset, data_size, hdferr, lapl_id)
+!!$    IMPLICIT NONE
+!!$    INTEGER(HID_T), INTENT(IN) :: loc_id  ! File or group identifier specifying location of subject group
+!!$    CHARACTER(LEN=*), INTENT(IN) :: group_name ! Name of subject group
+!!$    INTEGER, INTENT(IN) :: index_field  ! Index or field which determines the order
+!!$                                        !    H5_INDEX_UNKNOWN_F   - Unknown index type
+!!$                                        !    H5_INDEX_NAME_F      - Index on names
+!!$                                        !    H5_INDEX_CRT_ORDER_F - Index on creation order
+!!$                                        !    H5_INDEX_N_F	      - Number of indices defined
+!!$    INTEGER, INTENT(IN) :: order        ! Order in which to iterate over index; Possible values are:
+!!$                                        !    H5_ITER_UNKNOWN_F  - Unknown order
+!!$                                        !    H5_ITER_INC_F      - Increasing order
+!!$                                        !    H5_ITER_DEC_F      - Decreasing order
+!!$                                        !    H5_ITER_NATIVE_F   - No particular order, whatever is fastest
+!!$    INTEGER(HSIZE_T), INTENT(IN) :: n   ! Attribute’s position in index
+!!$    LOGICAL, INTENT(OUT) :: f_corder_valid ! Indicates whether the creation order data is valid for this attribute
+!!$    INTEGER, INTENT(OUT) :: corder ! Is a positive integer containing the creation order of the attribute
+!!$    INTEGER, INTENT(OUT) :: cset ! Indicates the character set used for the attribute’s name
+!!$    INTEGER(HSIZE_T), INTENT(OUT) :: data_size   ! Indicates the size, in the number of characters, of the attribute
+!!$    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
+!!$                                         ! 0 on success and -1 on failure
+!!$    INTEGER :: corder_valid
+!!$    INTEGER(SIZE_T)  :: group_namelen
+!!$    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id  ! Link access property list
+!!$    INTEGER(HID_T) :: lapl_id_default
+!!$
+!!$    INTERFACE
+!!$       INTEGER FUNCTION h5lget_val_by_idx_c(loc_id, group_name, group_namelen, index_field, order, n, &
+!!$            corder_valid, corder, cset, data_size, lapl_id_default)
+!!$         USE H5GLOBAL
+!!$         !DEC$IF DEFINED(HDF5F90_WINDOWS)
+!!$         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LGET_VAL_BY_IDX_C'::h5lget_val_by_idx_c
+!!$         !DEC$ENDIF
+!!$         INTEGER(HID_T), INTENT(IN) :: loc_id
+!!$         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: group_name
+!!$         INTEGER(SIZE_T)  :: group_namelen
+!!$         INTEGER, INTENT(IN) :: index_field
+!!$         INTEGER, INTENT(IN) :: order
+!!$         INTEGER(HSIZE_T), INTENT(IN) :: n
+!!$         INTEGER :: corder_valid
+!!$         INTEGER, INTENT(OUT) :: corder
+!!$         INTEGER, INTENT(OUT) :: cset
+!!$         INTEGER(HSIZE_T), INTENT(OUT) :: data_size
+!!$         INTEGER(HID_T) :: lapl_id_default
+!!$       END FUNCTION h5lget_val_by_idx_c
+!!$    END INTERFACE
+!!$
+!!$    group_namelen = LEN(group_name)
+!!$
+!!$    lapl_id_default = H5P_DEFAULT_F
+!!$    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+!!$
+!!$    hdferr = h5lget_info_by_idx_c(loc_id, group_name, group_namelen, index_field, order, n, &
+!!$         corder_valid, corder, cset, data_size, lapl_id_default)
+!!$
+!!$    f_corder_valid =.FALSE.
+!!$    IF (corder_valid .EQ. 1) f_corder_valid =.TRUE.
+!!$
+!!$  END SUBROUTINE h5lget_val_by_idx_f
+
+!!$!
+!!$!****s* H5L/h5lget_val_f
+!!$!
+!!$! NAME
+!!$!		h5lget_val_f
+!!$!
+!!$! PURPOSE
+!!$!  	Returns the value of a symbolic link.
+!!$!
+!!$! INPUTS
+!!$!   link_loc_id  - File or group identifier.
+!!$!   link_name    - Link whose value is to be returned.
+!!$!   size         - Maximum number of characters of link value to be returned.
+!!$!
+!!$! OUTPUTS
+!!$!   linkval_buff - The buffer to hold the returned link value.
+!!$!         hdferr - error code
+!!$!				 Success:  0
+!!$!				 Failure: -1
+!!$! OPTIONAL PARAMETERS
+!!$!    lapl_id      - List access property list identifier.
+!!$!
+!!$! AUTHOR
+!!$!	M. Scot Breitenfeld
+!!$!	March 3, 2008
+!!$! SOURCE
+!!$  SUBROUTINE h5lget_val_f(link_loc_id, link_name, size, linkval_buff,   &
+!!$       hdferr, lapl_id)
+!!$    IMPLICIT NONE
+!!$    INTEGER(HID_T), INTENT(IN) :: link_loc_id  ! File or group identifier.
+!!$    CHARACTER(LEN=*), INTENT(IN) :: link_name  ! Link whose value is to be returned.
+!!$    INTEGER(SIZE_T), INTENT(IN) :: size        !  Maximum number of characters of link value to be returned.
+!!$
+!!$    CHARACTER(LEN=size), INTENT(OUT) :: linkval_buff ! The buffer to hold the returned link value.
+!!$    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
+!!$    ! 0 on success and -1 on failure
+!!$    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id  ! Link access property list
+!!$
+!!$    INTEGER :: link_namelen
+!!$    INTEGER(HID_T) :: lapl_id_default
+!!$    INTEGER :: corder_valid
+!!$
+!!$    INTEGER :: link_namelen
+!!$    INTEGER(HID_T) :: lapl_id_default
+!!$
+!!$!  MS FORTRAN needs explicit interface for C functions called here.
+!!$!
+!!$    INTERFACE
+!!$       INTEGER FUNCTION h5lget_val_c(link_loc_id, link_name, link_namelen, size, linkval_buff, &
+!!$            lapl_id_default)
+!!$         USE H5GLOBAL
+!!$         !DEC$IF DEFINED(HDF5F90_WINDOWS)
+!!$         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LGET_VAL_C'::h5lget_val_c
+!!$         !DEC$ENDIF
+!!$         INTEGER(HID_T), INTENT(IN) :: link_loc_id  ! File or group identifier.
+!!$         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: link_name  ! Link whose value is to be returned.
+!!$         INTEGER :: link_namelen
+!!$         INTEGER(SIZE_T), INTENT(IN) :: size        !  Maximum number of characters of link value to be returned.
+!!$
+!!$         CHARACTER(LEN=size), INTENT(OUT) :: linkval_buff ! The buffer to hold the returned link value.
+!!$
+!!$         INTEGER :: link_namelen
+!!$         INTEGER(HID_T) :: lapl_id_default
+!!$
+!!$       END FUNCTION h5lget_val_c
+!!$    END INTERFACE
+!!$
+!!$    link_namelen = LEN(link_name)
+!!$
+!!$    lapl_id_default = H5P_DEFAULT_F
+!!$    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+!!$
+!!$    hdferr = h5lget_val_c(link_loc_id, link_name, link_namelen, size, linkval_buff, &
+!!$         lapl_id_default)
+!!$
+!!$  END SUBROUTINE h5lget_val_f
+
+!!$!
+!!$!****s* H5L/H5Lregistered_f
+!!$!
+!!$! NAME
+!!$!	    H5Lregistered_f
+!!$!
+!!$! PURPOSE
+!!$!  Registers user-defined link class or changes behavior of existing class.
+!!$!
+!!$! INPUTS NOTE: In C the following represents struct H5L_class_t:
+!!$!     version      - Version number of this struct
+!!$!     class_id     - Link class identifier
+!!$!     comment      - Comment for debugging
+!!$!     create_func  - Callback during link creation
+!!$!     move_func    - Callback after moving link
+!!$!     copy_func    - Callback after copying link
+!!$!     trav_func    - The main traversal function
+!!$!     del_func     - Callback for link deletion
+!!$!     query_func   - Callback for queries
+!!$!
+!!$! OUTPUTS
+!!$!           hdferr - Error code
+!!$!		       Success:  0
+!!$!	               Failure: -1
+!!$! OPTIONAL PARAMETERS
+!!$!                      None
+!!$!
+!!$! AUTHOR
+!!$! M. Scot Breitenfeld
+!!$!	      February 29, 2008
+!!$!
+!!$! HISTORY  N/A
+!!$!
+!!$!
+!!$! SOURCE
+!!$  SUBROUTINE H5Lregistered_f(version, class_id, comment, create_func, &
+!!$       move_func, copy_func, trav_func, del_func, query_func, hdferr)
+!!$    IMPLICIT NONE
+!!$    INTEGER, INTENT(IN) :: version      ! Version number of this struct
+!!$    INTEGER, INTENT(IN) :: class_id     ! Link class identifier
+!!$    CHARACTER(LEN=*), INTENT(IN) :: comment      ! Comment for debugging
+!!$    CHARACTER(LEN=*), INTENT(IN) :: create_func  ! Callback during link creation
+!!$    CHARACTER(LEN=*), INTENT(IN) :: move_func    ! Callback after moving link
+!!$    CHARACTER(LEN=*), INTENT(IN) :: copy_func    ! Callback after copying link
+!!$    CHARACTER(LEN=*), INTENT(IN) :: trav_func    ! The main traversal function
+!!$    CHARACTER(LEN=*), INTENT(IN) :: del_func     ! Callback for link deletion
+!!$    CHARACTER(LEN=*), INTENT(IN) :: query_func   ! Callback for queries
+!!$    INTEGER, INTENT(OUT) :: hdferr      ! Error code:
+!!$                                        ! 0 on success and -1 on failure
+!!$    INTEGER :: comment_len
+!!$    INTEGER :: create_func_len
+!!$    INTEGER :: move_func_len
+!!$    INTEGER :: copy_func_len
+!!$    INTEGER :: trav_func_len
+!!$    INTEGER :: del_func_len
+!!$    INTEGER :: query_func_len
+!!$
+!!$    INTERFACE
+!!$       INTEGER FUNCTION H5Lregistered_c(version, class_id, comment, &
+!!$            create_func, create_func_len, &
+!!$            move_func, move_func_len, &
+!!$            copy_func, copy_func_len, &
+!!$            trav_func, trav_func_len, &
+!!$            del_func, del_func_len, &
+!!$            query_func,query_func_len)
+!!$         USE H5GLOBAL
+!!$         !DEC$IF DEFINED(HDF5F90_WINDOWS)
+!!$         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LREGISTERED_C'::H5Lregistered_c
+!!$         !DEC$ENDIF
+!!$         INTEGER, INTENT(IN) :: version      ! Version number of this struct
+!!$         INTEGER, INTENT(IN) :: class_id     ! Link class identifier
+!!$         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: comment      ! Comment for debugging
+!!$         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: create_func  ! Callback during link creation
+!!$         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: move_func    ! Callback after moving link
+!!$         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: copy_func    ! Callback after copying link
+!!$         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: trav_func    ! The main traversal function
+!!$         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: del_func     ! Callback for link deletion
+!!$         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: query_func   ! Callback for queries
+!!$         INTEGER, INTENT(OUT) :: hdferr   ! Error code:
+!!$                                          ! 0 on success and -1 on failure
+!!$         INTEGER :: comment_len
+!!$         INTEGER :: create_func_len
+!!$         INTEGER :: move_func_len
+!!$         INTEGER :: copy_func_len
+!!$         INTEGER :: trav_func_len
+!!$         INTEGER :: del_func_len
+!!$         INTEGER :: query_func_len
+!!$
+!!$       END FUNCTION H5Lregistered_c
+!!$    END INTERFACE
+!!$
+!!$    comment_len     = LEN(comment)
+!!$    create_func_len = LEN(create_func)
+!!$    move_func_len   = LEN(move_func)
+!!$    copy_func_len   = LEN(copy_func)
+!!$    trav_func_len   = LEN(trav_func)
+!!$    del_func_len    = LEN(del_func)
+!!$    query_func_len  = LEN(query_func)
+!!$
+!!$    hdferr = H5Lregistered_c(version, class_id, comment, &
+!!$         create_func, create_func_len, &
+!!$         move_func, move_func_len, &
+!!$         copy_func, copy_func_len, &
+!!$         trav_func, trav_func_len, &
+!!$         del_func, del_func_len, &
+!!$         query_func, query_func_len)
+!!$
+!!$  END SUBROUTINE H5Lregistered_f
+
+!****s* H5L (F03)/h5literate_f
+!
+! NAME
+!  h5literate_f
+!
+! PURPOSE
+!  Iterates through links in a group.
+!
+! Inputs:
+!  group_id   - Identifier specifying subject group
+!  index_type - Type of index which determines the order:
+!                H5_INDEX_NAME_F      - Alpha-numeric index on name
+!                H5_INDEX_CRT_ORDER_F - Index on creation order
+!  order      - Order within index:
+!                H5_ITER_INC_F    - Increasing order
+!                H5_ITER_DEC_F    - Decreasing order
+!                H5_ITER_NATIVE_F - Fastest available order
+!  idx 	      - IN: Iteration position at which to start
+!  op 	      - Callback function passing data regarding the link to the calling application
+!  op_data    - User-defined pointer to data required by the application for its processing of the link
+!
+! Outputs:
+!  idx 	        - OUT: Position at which an interrupted iteration may be restarted
+!  return_value - Success: The return value of the first operator that
+! 			   returns non-zero, or zero if all members were
+! 			   processed with no operator returning non-zero.
+!
+! 		  Failure: Negative if something goes wrong within the
+! 			   library, or the negative value returned by one
+! 			   of the operators.
+!
+!  hdferr     - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  July 8, 2008
+!
+! Fortran2003 Interface:
+  SUBROUTINE h5literate_f(group_id, index_type, order, idx, op, op_data, return_value, hdferr)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T)  , INTENT(IN)    :: group_id
+    INTEGER         , INTENT(IN)    :: index_type
+    INTEGER         , INTENT(IN)    :: order
+    INTEGER(HSIZE_T), INTENT(INOUT) :: idx
+    TYPE(C_FUNPTR)  , INTENT(IN)    :: op
+    TYPE(C_PTR)     , INTENT(IN)    :: op_data
+    INTEGER         , INTENT(OUT)   :: return_value
+    INTEGER         , INTENT(OUT)   :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5literate_c(group_id, index_type, order, idx, op, op_data) &
+            BIND(C, NAME='h5literate_c')
+         IMPORT :: c_ptr, c_funptr
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: group_id
+         INTEGER, INTENT(IN) :: index_type
+         INTEGER, INTENT(IN) :: order
+         INTEGER(HSIZE_T), INTENT(INOUT) :: idx
+         TYPE(C_FUNPTR), VALUE :: op
+         TYPE(C_PTR), VALUE :: op_data
+       END FUNCTION h5literate_c
+    END INTERFACE
+
+    return_value = h5literate_c(group_id, index_type, order, idx, op, op_data)
+
+    IF(return_value.GE.0)THEN
+       hdferr = 0
+    ELSE
+       hdferr = -1
+    END IF
+
+  END SUBROUTINE h5literate_f
+
+!****s* H5L (F03)/h5literate_by_name_f
+!
+! NAME
+!  h5literate_by_name_f
+!
+! PURPOSE
+!  Iterates through links in a group.
+!
+! Inputs:
+!  loc_id     - File or group identifier specifying location of subject group
+!  group_name - Name of subject group
+!  index_type - Type of index which determines the order:
+!                H5_INDEX_NAME_F      - Alpha-numeric index on name
+!                H5_INDEX_CRT_ORDER_F - Index on creation order
+!  order      - Order within index:
+!                H5_ITER_INC_F    - Increasing order
+!                H5_ITER_DEC_F    - Decreasing order
+!                H5_ITER_NATIVE_F - Fastest available order
+!  idx 	      - IN: Iteration position at which to start
+!  op 	      - Callback function passing data regarding the link to the calling application
+!  op_data    - User-defined pointer to data required by the application for its processing of the link
+!
+! Outputs:
+!  idx 	        - OUT: Position at which an interrupted iteration may be restarted
+!  return_value - Success: The return value of the first operator that
+! 			   returns non-zero, or zero if all members were
+! 			   processed with no operator returning non-zero.
+!
+! 		  Failure: Negative if something goes wrong within the
+! 			   library, or the negative value returned by one
+! 			   of the operators.
+!
+!  hdferr        - Returns 0 if successful and -1 if fails
+!
+! Optional parameters:
+!  lapl_id    - Link access property list
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  Augest 18, 2008
+!
+! Fortran2003 Interface:
+  SUBROUTINE h5literate_by_name_f(loc_id, group_name, index_type, order, &
+       idx, op, op_data, return_value, hdferr, lapl_id)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T)  , INTENT(IN)           :: loc_id
+    CHARACTER(LEN=*), INTENT(IN)           :: group_name 
+    INTEGER         , INTENT(IN)           :: index_type
+    INTEGER         , INTENT(IN)           :: order
+    INTEGER(HSIZE_T), INTENT(INOUT)        :: idx
+    TYPE(C_FUNPTR)  , INTENT(IN)           :: op  
+    TYPE(C_PTR)     , INTENT(IN)           :: op_data
+    INTEGER         , INTENT(OUT)          :: return_value
+    INTEGER         , INTENT(OUT)          :: hdferr
+    INTEGER(HID_T)  , INTENT(IN), OPTIONAL :: lapl_id
+!*****
+    INTEGER(HID_T) :: lapl_id_default
+    INTEGER(SIZE_T) :: namelen
+
+    INTERFACE
+       INTEGER FUNCTION h5literate_by_name_c(loc_id, name, namelen, index_type, order,&
+            idx, op, op_data, lapl_id_default) BIND(C, NAME='h5literate_by_name_c')
+         IMPORT :: c_char, c_ptr, c_funptr
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T)  , INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER(SIZE_T) , INTENT(IN) :: namelen
+         INTEGER         , INTENT(IN) :: index_type
+         INTEGER         , INTENT(IN) :: order
+         INTEGER(HSIZE_T), INTENT(INOUT) :: idx
+         TYPE(C_FUNPTR), VALUE :: op
+         TYPE(C_PTR), VALUE :: op_data
+         INTEGER(HID_T)  , INTENT(IN) :: lapl_id_default
+       END FUNCTION
+    END INTERFACE
+
+    namelen  = LEN(group_name)
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    return_value = h5literate_by_name_c(loc_id, group_name, namelen, index_type, order, idx, op, op_data, lapl_id_default)
+
+    IF(return_value.GE.0)THEN
+       hdferr = 0
+    ELSE
+       hdferr = -1
+    END IF
+
+  END SUBROUTINE h5literate_by_name_f
+
+END MODULE H5L
diff --git a/fortran/src/H5Lff.f90 b/fortran/src/H5Lff.f90
deleted file mode 100644
index 4660e52..0000000
--- a/fortran/src/H5Lff.f90
+++ /dev/null
@@ -1,1300 +0,0 @@
-!****h* ROBODoc/H5L
-!
-! NAME
-!  MODULE H5L
-!
-! PURPOSE
-!  This file contains Fortran interfaces for H5L functions. It includes
-!  all the functions that are independent on whether the Fortran 2003 functions
-!  are enabled or disabled.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5L function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5L
-
-  USE H5GLOBAL
-
-CONTAINS
-
-!
-!****s* H5L/h5lcopy_f
-!
-! NAME
-!  h5lcopy_f
-!
-! PURPOSE
-!  Copies a link from one location to another.
-!
-! INPUTS
-!  src_loc_id 	 - Location identifier of the source link
-!  src_name 	 - Name of the link to be copied
-!  dest_loc_id 	 - Location identifier specifying the destination of the copy
-!  dest_name 	 - Name to be assigned to the NEW copy
-!  loc_id 	 - Identifier of the file or group containing the object
-!  name 	 - Name of the link to delete
-!
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  lcpl_id 	 - Link creation property list identifier
-!  lapl_id 	 - Link access property list identifier
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 27, 2008
-!
-! SOURCE
-  SUBROUTINE h5lcopy_f(src_loc_id, src_name, dest_loc_id, dest_name, hdferr, &
-       lcpl_id, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: src_loc_id  ! Location identifier of the source link
-    CHARACTER(LEN=*), INTENT(IN) :: src_name   ! Name of the link to be copied
-    INTEGER(HID_T), INTENT(IN) :: dest_loc_id ! Location identifier specifying the destination of the copy
-    CHARACTER(LEN=*), INTENT(IN) :: dest_name ! Name to be assigned to the NEW copy
-
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code:
-                                          ! 0 on success and -1 on failure
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lcpl_id ! Link creation property list identifier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list identifier
-!*****
-    INTEGER(HID_T) :: lcpl_id_default
-    INTEGER(HID_T) :: lapl_id_default
-
-    INTEGER(SIZE_T) :: src_namelen
-    INTEGER(SIZE_T) :: dest_namelen
-
-    INTERFACE
-       INTEGER FUNCTION h5lcopy_c(src_loc_id, src_name, src_namelen, dest_loc_id, dest_name, dest_namelen, &
-            lcpl_id_default, lapl_id_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LCOPY_C'::h5lcopy_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: src_name, dest_name
-         INTEGER(HID_T), INTENT(IN) :: src_loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: src_name
-         INTEGER(HID_T), INTENT(IN) :: dest_loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: dest_name
-
-         INTEGER(HID_T) :: lcpl_id_default
-         INTEGER(HID_T) :: lapl_id_default
-
-         INTEGER(SIZE_T) :: src_namelen
-         INTEGER(SIZE_T) :: dest_namelen
-       END FUNCTION h5lcopy_c
-    END INTERFACE
-
-    src_namelen  = LEN(src_name)
-    dest_namelen = LEN(dest_name)
-
-    lcpl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5lcopy_c(src_loc_id, src_name, src_namelen, dest_loc_id, dest_name, dest_namelen, &
-         lcpl_id_default, lapl_id_default)
-
-  END SUBROUTINE h5lcopy_f
-
-!
-!****s* H5L/h5ldelete_f
-!
-! NAME
-!  h5ldelete_f
-!
-! PURPOSE
-!  Removes a link from a group.
-!
-! INPUTS
-!  loc_id 	 - Identifier of the file or group containing the object
-!  name 	 - Name of the link to delete
-!
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  lapl_id 	 - Link access property list identifier
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  January, 2008
-!
-! SOURCE
-  SUBROUTINE h5ldelete_f(loc_id, name, hdferr, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id  ! Identifier of the file or group containing the object
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of the link to delete
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code:
-                                          ! 0 on success and -1 on failure
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list identifier
-!*****
-    INTEGER(HID_T) :: lapl_id_default
-    INTEGER(SIZE_T) :: namelen
-
-    INTERFACE
-       INTEGER FUNCTION h5ldelete_c(loc_id, name, namelen, lapl_id_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LDELETE_C'::h5ldelete_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER(HID_T) :: lapl_id_default
-         INTEGER(SIZE_T) :: namelen
-       END FUNCTION h5ldelete_c
-    END INTERFACE
-
-    namelen = LEN(name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5ldelete_c(loc_id, name, namelen, lapl_id_default)
-
-  END SUBROUTINE h5ldelete_f
-
-!
-!****s* H5L/H5Lcreate_soft_f
-!
-! NAME
-!  H5Lcreate_soft_f
-!
-! PURPOSE
-!  Creates a soft link to an object.
-!
-! INPUTS
-!  target_path 	 - Path to the target object, which is not required to exist.
-!  link_loc_id 	 - The file or group identifier for the new link.
-!  link_name 	 - The name of the new link.
-!
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  lcpl_id 	 - Link creation property list identifier.
-!  lapl_id 	 - Link access property list identifier.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 20, 2008
-!
-! SOURCE
-  SUBROUTINE h5lcreate_soft_f(target_path, link_loc_id, link_name, hdferr, lcpl_id, lapl_id)
-    IMPLICIT NONE
-    CHARACTER(LEN=*), INTENT(IN) :: target_path   ! Path to the target object, which is not required to exist.
-    INTEGER(HID_T), INTENT(IN) :: link_loc_id     ! The file or group identifier for the new link.
-    CHARACTER(LEN=*), INTENT(IN) :: link_name     ! The name of the new link.
-    INTEGER, INTENT(OUT) :: hdferr                ! Error code:
-                                                  !   0 on success and -1 on failure
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lcpl_id ! Link creation property list identifier.
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list identifier.
-!*****
-    INTEGER(HID_T) :: lcpl_id_default
-    INTEGER(HID_T) :: lapl_id_default
-    INTEGER(SIZE_T) :: target_path_len
-    INTEGER(SIZE_T) :: link_name_len
-
-    INTERFACE
-       INTEGER FUNCTION h5lcreate_soft_c(target_path, target_path_len, &
-            link_loc_id, &
-            link_name,link_name_len, &
-            lcpl_id_default, lapl_id_default )
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LCREATE_SOFT_C'::h5lcreate_soft_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: target_path, link_name
-         CHARACTER(LEN=*), INTENT(IN) :: target_path
-         INTEGER(SIZE_T) :: target_path_len
-         INTEGER(HID_T), INTENT(IN) ::   link_loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: link_name
-         INTEGER(SIZE_T) :: link_name_len
-         INTEGER(HID_T) :: lcpl_id_default
-         INTEGER(HID_T) :: lapl_id_default
-       END FUNCTION h5lcreate_soft_c
-    END INTERFACE
-
-    target_path_len = LEN(target_path)
-    link_name_len = LEN(link_name)
-
-    lcpl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5lcreate_soft_c(target_path, target_path_len,&
-         link_loc_id, &
-         link_name, link_name_len, &
-         lcpl_id_default, lapl_id_default )
-
-  END SUBROUTINE h5lcreate_soft_f
-
-!
-!****s* H5L/H5Lcreate_hard_f
-!
-! NAME
-!  H5Lcreate_hard_f
-!
-! PURPOSE
-!  Creates a hard link to an object.
-!
-! INPUTS
-!
-!  obj_loc_id 	 - The file or group identifier for the target object.
-!  obj_name 	 - Name of the target object, which must already exist.
-!  link_loc_id 	 - The file or group identifier for the new link.
-!  link_name 	 - The name of the new link.
-!
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  lcpl_id 	 - Link creation property list identifier.
-!  lapl_id 	 - Link access property list identifier.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 27, 2008
-!
-! SOURCE
-  SUBROUTINE h5lcreate_hard_f(obj_loc_id, obj_name, link_loc_id, link_name, hdferr, lcpl_id, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: obj_loc_id  ! The file or group identifier for the target object.
-    CHARACTER(LEN=*), INTENT(IN) :: obj_name  ! Name of the target object, which must already exist.
-    INTEGER(HID_T), INTENT(IN) :: link_loc_id ! The file or group identifier for the new link.
-    CHARACTER(LEN=*), INTENT(IN) :: link_name ! The name of the new link.
-
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code:
-                                          ! 0 on success and -1 on failure
-
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) ::   lcpl_id         ! Link creation property list identifier.
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) ::   lapl_id         ! Link access property list identifier.
-!*****
-    INTEGER(HID_T) :: lcpl_id_default
-    INTEGER(HID_T) :: lapl_id_default
-
-    INTEGER(SIZE_T) :: obj_namelen
-    INTEGER(SIZE_T) :: link_namelen
-
-    INTERFACE
-       INTEGER FUNCTION h5lcreate_hard_c(obj_loc_id, obj_name, obj_namelen, &
-            link_loc_id, link_name, link_namelen, lcpl_id_default, lapl_id_default)
-
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LCREATE_HARD_C'::h5lcreate_hard_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: obj_name, link_name
-         INTEGER(HID_T), INTENT(IN) :: obj_loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: obj_name
-         INTEGER(HID_T), INTENT(IN) :: link_loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: link_name
-         INTEGER(SIZE_T) :: obj_namelen
-         INTEGER(SIZE_T) :: link_namelen
-         INTEGER(HID_T) :: lcpl_id_default
-         INTEGER(HID_T) :: lapl_id_default
-       END FUNCTION h5lcreate_hard_c
-    END INTERFACE
-    obj_namelen = LEN(obj_name)
-    link_namelen = LEN(link_name)
-
-    lcpl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5lcreate_hard_c(obj_loc_id, obj_name, obj_namelen, &
-            link_loc_id, link_name, link_namelen, lcpl_id_default, lapl_id_default)
-
-  END SUBROUTINE h5lcreate_hard_f
-
-!
-!****s* H5L/H5Lcreate_external_f
-!
-! NAME
-!  H5Lcreate_external_f
-!
-! PURPOSE
-!  Creates a soft link to an object in a different file.
-!
-! INPUTS
-!
-!  file_name 	 - Name of the file containing the target object. Neither the file nor the target object is
-!  required to exist. May be the file the link is being created in.
-!  obj_name 	 - Path within the target file to the target object.
-!  link_loc_id 	 - The file or group identifier for the new link.
-!  link_name 	 - The name of the new link.
-!
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  lcpl_id 	 - Link creation property list identifier.
-!  lapl_id 	 - Link access property list identifier.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 27, 2008
-! SOURCE
-  SUBROUTINE h5lcreate_external_f(file_name, obj_name, link_loc_id, link_name, hdferr, lcpl_id, lapl_id)
-    IMPLICIT NONE
-    CHARACTER(LEN=*), INTENT(IN) :: file_name ! Name of the file containing the target object. Neither
-                                              ! the file nor the target object is required to exist.
-                                              ! May be the file the link is being created in.
-    CHARACTER(LEN=*), INTENT(IN) :: obj_name  ! Name of the target object, which must already exist.
-    INTEGER(HID_T), INTENT(IN) :: link_loc_id ! The file or group identifier for the new link.
-    CHARACTER(LEN=*), INTENT(IN) :: link_name ! The name of the new link.
-
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code:
-                                          ! 0 on success and -1 on failure
-
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lcpl_id ! Link creation property list identifier.
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list identifier.
-!*****
-    INTEGER(HID_T) :: lcpl_id_default
-    INTEGER(HID_T) :: lapl_id_default
-
-    INTEGER(SIZE_T) :: file_namelen
-    INTEGER(SIZE_T) :: obj_namelen
-    INTEGER(SIZE_T) :: link_namelen
-
-    INTERFACE
-       INTEGER FUNCTION h5lcreate_external_c(file_name, file_namelen, obj_name, obj_namelen, &
-            link_loc_id, link_name, link_namelen, lcpl_id_default, lapl_id_default)
-
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LCREATE_EXTERNAL_C'::h5lcreate_external_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: file_name, obj_name, link_name
-         CHARACTER(LEN=*), INTENT(IN) :: file_name
-         CHARACTER(LEN=*), INTENT(IN) :: obj_name
-         INTEGER(HID_T), INTENT(IN) :: link_loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: link_name
-         INTEGER(SIZE_T) :: file_namelen
-         INTEGER(SIZE_T) :: obj_namelen
-         INTEGER(SIZE_T) :: link_namelen
-         INTEGER(HID_T) :: lcpl_id_default
-         INTEGER(HID_T) :: lapl_id_default
-       END FUNCTION h5lcreate_external_c
-    END INTERFACE
-    file_namelen = LEN(file_name)
-    obj_namelen = LEN(obj_name)
-    link_namelen = LEN(link_name)
-
-    lcpl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5lcreate_external_c(file_name, file_namelen, obj_name, obj_namelen, &
-            link_loc_id, link_name, link_namelen, lcpl_id_default, lapl_id_default)
-
-  END SUBROUTINE h5lcreate_external_f
-
-!
-!****s* H5L/h5ldelete_by_idx_f
-!
-! NAME
-!  h5ldelete_by_idx_f
-!
-! PURPOSE
-!  Removes the nth link in a group.
-! INPUTS
-!  loc_id 	 - File or group identifier specifying location of subject group
-!  group_name 	 - Name of subject group
-!  index_field 	 - Type of index; Possible values are:
-!                    H5_INDEX_UNKNOWN_F = -1  - Unknown index type
-!                    H5_INDEX_NAME_F 	      - Index on names
-!                    H5_INDEX_CRT_ORDER_F     - Index on creation order
-!                    H5_INDEX_N_F 	      - Number of indices defined
-!
-!  order 	 - Order within field or index; Possible values are:
-!                    H5_ITER_UNKNOWN_F 	 - Unknown order
-!                    H5_ITER_INC_F 	 - Increasing order
-!                    H5_ITER_DEC_F 	 - Decreasing order
-!                    H5_ITER_NATIVE_F 	 - No particular order, whatever is fastest
-!                    H5_ITER_N_F 	 - Number of iteration orders
-!
-!  n 	         - Link for which to retrieve information
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  lapl_id 	 - Link access property list
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 29, 2008
-! SOURCE
-  SUBROUTINE h5ldelete_by_idx_f(loc_id, group_name, index_field, order, n, hdferr, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id       ! Identifer for object to which attribute is attached
-    CHARACTER(LEN=*), INTENT(IN) :: group_name ! Name of object, relative to location,
-                                               !  from which attribute is to be removed
-    INTEGER, INTENT(IN) :: index_field         ! Type of index; Possible values are:
-                                               !    H5_INDEX_UNKNOWN_F   - Unknown index type
-                                               !    H5_INDEX_NAME_F      - Index on names
-                                               !    H5_INDEX_CRT_ORDER_F - Index on creation order
-                                               !    H5_INDEX_N_F	      - Number of indices defined
-    INTEGER, INTENT(IN) :: order               ! Order in which to iterate over index; Possible values are:
-                                               !    H5_ITER_UNKNOWN_F  - Unknown order
-                                               !    H5_ITER_INC_F      - Increasing order
-                                               !    H5_ITER_DEC_F      - Decreasing order
-                                               !    H5_ITER_NATIVE_F   - No particular order, whatever is fastest
-                                               !    H5_ITER_N_F	    - Number of iteration orders
-    INTEGER(HSIZE_T), INTENT(IN) :: n      ! Offset within index
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code:
-                                           ! 0 on success and -1 on failure
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id     ! Link access property list
-!*****
-    INTEGER(HID_T) :: lapl_id_default
-    INTEGER(SIZE_T) :: group_namelen
-
-    INTERFACE
-       INTEGER FUNCTION h5ldelete_by_idx_c(loc_id, group_name, group_namelen, index_field, order, n, lapl_id_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LDELETE_BY_IDX_C'::h5ldelete_by_idx_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: group_name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: group_name
-         INTEGER, INTENT(IN) :: index_field
-         INTEGER, INTENT(IN) :: order
-         INTEGER(HSIZE_T), INTENT(IN) :: n
-         INTEGER(HID_T) :: lapl_id_default
-         INTEGER(SIZE_T) :: group_namelen
-       END FUNCTION h5ldelete_by_idx_c
-    END INTERFACE
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    group_namelen = LEN(group_name)
-    hdferr = h5ldelete_by_idx_c(loc_id, group_name, group_namelen, index_field, order, n, lapl_id_default)
-
-  END SUBROUTINE h5ldelete_by_idx_f
-
-!
-!****s* H5L/H5Lexists_f
-!
-! NAME
-!  H5Lexists_f
-!
-! PURPOSE
-!  Check if a link with a particular name exists in a group.
-!
-! INPUTS
-!  loc_id 	 - Identifier of the file or group to query.
-!  name 	 - Link name to check
-!
-! OUTPUTS
-!  link_exists 	 - link exists status (.TRUE.,.FALSE.)
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  lapl_id 	 - Link access property list identifier.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 29, 2008
-!
-! SOURCE
-  SUBROUTINE h5lexists_f(loc_id, name, link_exists, hdferr, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id  ! Identifier of the file or group to query.
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Link name to check.
-    LOGICAL, INTENT(OUT) :: link_exists   ! .TRUE. if exists, .FALSE. otherwise
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code:
-                                          ! 0 on success and -1 on failure
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id
-                                          ! Link access property list identifier.
-!*****
-    INTEGER :: link_exists_c
-    INTEGER(HID_T) :: lapl_id_default
-    INTEGER(SIZE_T)  :: namelen
-
-    INTERFACE
-       INTEGER FUNCTION h5lexists_c(loc_id, name, namelen, lapl_id_default, link_exists_c)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LEXISTS_C'::h5lexists_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER(SIZE_T), INTENT(IN) :: namelen
-         INTEGER, INTENT(OUT) :: link_exists_c
-         INTEGER(HID_T) :: lapl_id_default
-
-       END FUNCTION h5lexists_c
-    END INTERFACE
-
-    namelen = LEN(name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5lexists_c(loc_id, name, namelen, lapl_id_default, link_exists_c)
-
-    link_exists = .FALSE.
-    IF(link_exists_c.GT.0) link_exists = .TRUE.
-
-  END SUBROUTINE h5lexists_f
-
-!
-!****s* H5L/h5lget_info_f
-!
-! NAME
-!  h5lget_info_f
-!
-! PURPOSE
-!  Returns information about a link.
-!
-! INPUTS
-!  link_loc_id 	 - File or group identifier.
-!  link_name 	 - Name of the link for which information is being sought
-!
-! OUTPUTS  
-!            NOTE: In C these are contained in the structure H5L_info_t
-!
-!  cset 	 - indicates the character set used for link’s name.
-!  corder 	 - specifies the link’s creation order position.
-!  corder_valid  - indicates whether the value in corder is valid.
-!  link_type 	 - specifies the link class:
-!                    H5L_TYPE_HARD_F 	 - Hard link
-!                    H5L_TYPE_SOFT_F 	 - Soft link
-!                    H5L_TYPE_EXTERNAL_F - External link
-!                    H5L_TYPE_ERROR_ F   - Error
-!  address 	 - If the link is a hard link, address specifies the file address that the link points to
-!  val_size 	 - If the link is a symbolic link, val_size will be the length of the link value, e.g., 
-!                  the length of the name of the pointed-to object with a null terminator. 
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! OPTIONAL PARAMETERS
-!  lapl_id 	 - Link access property list
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 29, 2008
-!
-! HISTORY
-!   Changed the link_type names to match those in C (bug 1720) from,
-!   H5L_LINK_HARD_F, H5L_LINK_SOFT_F,H5L_LINK_EXTERNAL_F,H5L_LINK_ERROR_F
-!   to
-!   H5L_TYPE_HARD_F, H5L_TYPE_SOFT_F,H5L_TYPE_EXTERNAL_F,H5L_TYPE_ERROR_F
-!   MSB January 8, 2010.
-!
-! SOURCE
-  SUBROUTINE h5lget_info_f(link_loc_id, link_name, &
-       cset, corder, f_corder_valid, link_type, address, val_size, &
-       hdferr, lapl_id)
-    IMPLICIT NONE
-
-    INTEGER(HID_T), INTENT(IN) :: link_loc_id ! File or group identifier.
-    CHARACTER(LEN=*), INTENT(IN) :: link_name ! Name of the link for which information is being sought
-
-! OUTPUTS  NOTE: In C these are contained in the structure H5L_info_t
-    INTEGER, INTENT(OUT) :: cset ! Indicates the character set used for the link’s name.
-    INTEGER, INTENT(OUT) :: corder ! Specifies the link’s creation order position.
-    LOGICAL, INTENT(OUT) :: f_corder_valid ! Indicates whether the value in corder is valid.
-    INTEGER, INTENT(OUT) :: link_type ! Specifies the link class:
-     	                              !  H5L_TYPE_HARD_F      - Hard link
-     	                              !  H5L_TYPE_SOFT_F      - Soft link
-     	                              !  H5L_TYPE_EXTERNAL_F  - External link
-     	                              !  H5L_TYPE_ERROR _F    - Error
-    INTEGER(HADDR_T), INTENT(OUT) :: address ! If the link is a hard link, address specifies the file address that the link points to
-    INTEGER(SIZE_T), INTENT(OUT) :: val_size ! If the link is a symbolic link, val_size will be the length of the link value, e.g., 
-                                             ! the length of the name of the pointed-to object with a null terminator. 
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
-                                         ! 0 on success and -1 on failure
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id  ! Link access property list
-!*****
-    INTEGER(SIZE_T) :: link_namelen
-    INTEGER(HID_T) :: lapl_id_default
-    INTEGER :: corder_valid
-
-    INTERFACE
-       INTEGER FUNCTION h5lget_info_c(link_loc_id, link_name, link_namelen, &
-            cset, corder, corder_valid, link_type, address, val_size, &
-            lapl_id_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LGET_INFO_C'::h5lget_info_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: link_name
-         INTEGER(HID_T), INTENT(IN) :: link_loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: link_name
-         INTEGER, INTENT(OUT) :: cset
-         INTEGER, INTENT(OUT) :: corder
-         INTEGER, INTENT(OUT) :: link_type
-         INTEGER(HADDR_T), INTENT(OUT) :: address
-         INTEGER(SIZE_T), INTENT(OUT) :: val_size
-         INTEGER(HID_T) :: lapl_id_default
-         INTEGER(SIZE_T) :: link_namelen
-         INTEGER :: corder_valid
-       END FUNCTION h5lget_info_c
-    END INTERFACE
-
-    link_namelen = LEN(link_name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5lget_info_c(link_loc_id, link_name, link_namelen, &
-         cset, corder, corder_valid, link_type, &
-         address, val_size, &
-         lapl_id_default)
-
-    f_corder_valid =.FALSE.
-    IF(corder_valid .EQ. 1) f_corder_valid =.TRUE.
-
-  END SUBROUTINE h5lget_info_f
-
-!
-!****s* H5L/h5lget_info_by_idx_f
-!
-! NAME
-!  h5lget_info_by_idx_f
-!
-! PURPOSE
-!  Retrieves metadata for a link in a group, according to the order within a field or index.
-!
-! INPUTS
-!  loc_id 	 - File or group identifier specifying location of subject group
-!  group_name 	 - Name of subject group
-!  index_field 	 - Index or field which determines the order
-!  order 	 - Order within field or index
-!  n 	         - Link for which to retrieve information
-!
-! OUTPUTS  
-!            NOTE: In C these are defined as a structure: H5L_info_t
-!  corder_valid  - Indicates whether the creation order data is valid for this attribute
-!  corder 	 - Is a positive integer containing the creation order of the attribute
-!  cset 	 - Indicates the character set used for the attribute’s name 
-! address        - If the link is a hard link, address specifies the file address that the link points to
-! val_size       - If the link is a symbolic link, val_size will be the length of the link value, e.g., 
-!                  the length of the name of the pointed-to object with a null terminator.
-! hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! OPTIONAL PARAMETERS
-!  lapl_id 	 - Link access property list
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 29, 2008
-!
-! HISTORY
-!   Changed the link_type names to match those in C (bug 1720) from,
-!   H5L_LINK_HARD_F, H5L_LINK_SOFT_F,H5L_LINK_EXTERNAL_F,H5L_LINK_ERROR_F
-!   to
-!   H5L_TYPE_HARD_F, H5L_TYPE_SOFT_F,H5L_TYPE_EXTERNAL_F,H5L_TYPE_ERROR_F
-!   MSB January 8, 2010.  
-!
-! SOURCE
-  SUBROUTINE h5lget_info_by_idx_f(loc_id, group_name, index_field, order, n, &
-       link_type, f_corder_valid, corder, cset, address, val_size, hdferr, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id       ! File or group identifier specifying location of subject group  
-    CHARACTER(LEN=*), INTENT(IN) :: group_name ! Name of subject group
-    INTEGER, INTENT(IN) :: index_field  ! Index or field which determines the order
-                                        !    H5_INDEX_UNKNOWN_F   - Unknown index type
-                                        !    H5_INDEX_NAME_F      - Index on names
-                                        !    H5_INDEX_CRT_ORDER_F - Index on creation order
-                                        !    H5_INDEX_N_F	      - Number of indices defined
-    INTEGER, INTENT(IN) :: order        ! Order in which to iterate over index; Possible values are:
-                                        !    H5_ITER_UNKNOWN_F  - Unknown order
-                                        !    H5_ITER_INC_F      - Increasing order
-                                        !    H5_ITER_DEC_F      - Decreasing order
-                                        !    H5_ITER_NATIVE_F   - No particular order, whatever is fastest
-    INTEGER(HSIZE_T), INTENT(IN) :: n   ! Attribute’s position in index
-    INTEGER, INTENT(OUT) :: link_type ! Specifies the link class:
-     	                              !  H5L_TYPE_HARD_F      - Hard link
-     	                              !  H5L_TYPE_SOFT_F      - Soft link
-     	                              !  H5L_TYPE_EXTERNAL_F  - External link
-     	                              !  H5L_TYPE_ERROR _F    - Error
-    LOGICAL, INTENT(OUT) :: f_corder_valid ! Indicates whether the creation order data is valid for this attribute 
-    INTEGER, INTENT(OUT) :: corder         ! Is a positive integer containing the creation order of the attribute
-    INTEGER, INTENT(OUT) :: cset           ! Indicates the character set used for the attribute’s name
-    INTEGER(HADDR_T), INTENT(OUT) :: address  ! If the link is a hard link, address specifies the file address that the link points to
-    INTEGER(SIZE_T), INTENT(OUT) :: val_size  ! If the link is a symbolic link, val_size will be the length of the link value, e.g., 
-                                              ! the length of the name of the pointed-to object with a null terminator. 
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
-                                         ! 0 on success and -1 on failure
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id  ! Link access property list
-!*****
-    INTEGER :: corder_valid
-    INTEGER(SIZE_T)  :: group_namelen
-    INTEGER(HID_T) :: lapl_id_default
-
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5lget_info_by_idx_c(loc_id, group_name, group_namelen, index_field, order, n, &
-            link_type, corder_valid, corder, cset, address, val_size, lapl_id_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LGET_INFO_BY_IDX_C'::h5lget_info_by_idx_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: group_name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: group_name
-         INTEGER(SIZE_T)  :: group_namelen
-         INTEGER, INTENT(IN) :: index_field
-         INTEGER, INTENT(IN) :: order
-         INTEGER(HSIZE_T), INTENT(IN) :: n
-         INTEGER, INTENT(OUT) :: link_type
-         INTEGER :: corder_valid 
-         INTEGER, INTENT(OUT) :: corder
-         INTEGER, INTENT(OUT) :: cset
-         INTEGER(HADDR_T), INTENT(OUT) :: address
-         INTEGER(SIZE_T), INTENT(OUT) :: val_size
-         INTEGER(HID_T) :: lapl_id_default
-       END FUNCTION h5lget_info_by_idx_c
-    END INTERFACE
-
-    group_namelen = LEN(group_name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5lget_info_by_idx_c(loc_id, group_name, group_namelen, index_field, order, n, &
-         link_type, corder_valid, corder, cset, address, val_size, lapl_id_default)
-
-    f_corder_valid =.FALSE.
-    IF (corder_valid .EQ. 1) f_corder_valid =.TRUE.
-
-  END SUBROUTINE h5lget_info_by_idx_f
-
-!
-!****s* H5L/h5lis_registered_f
-!
-! NAME
-!  h5lis_registered_f
-!
-! PURPOSE
-!  Determines whether a class of user-defined links is registered.
-!
-! INPUTS
-!  link_cls_id 	 - User-defined link class identifier
-!
-! OUTPUTS
-!  registered 	 - .TRUE.  - if the link class has been registered
-!                  .FALSE. - if it is unregistered
-!  hdferr 	 - Error code
-!  Success:  0
-!  Failure: -1
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 29, 2008
-!
-! SOURCE
-  SUBROUTINE h5lis_registered_f(link_cls_id, registered, hdferr)
-    IMPLICIT NONE
-    INTEGER, INTENT(IN) :: link_cls_id  ! User-defined link class identifier
-    LOGICAL, INTENT(OUT) :: registered  ! .TRUE. - if the link class has been registered and
-                                        ! .FALSE. - if it is unregistered
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code:
-                                        ! 0 on success and -1 on failure
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5lis_registered_c(link_cls_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LIS_REGISTERED_C'::h5lis_registered_c
-         !DEC$ENDIF
-         INTEGER, INTENT(IN) :: link_cls_id  ! User-defined link class identifier
-       END FUNCTION h5lis_registered_c
-    END INTERFACE
-
-    hdferr = h5lis_registered_c(link_cls_id)
-
-    IF(hdferr.GT.0)THEN
-       registered = .TRUE.
-    ELSE IF(hdferr.EQ.0)THEN
-       registered = .FALSE.
-    ENDIF
-
-  END SUBROUTINE h5lis_registered_f
-
-!
-!****s* H5L/h5lmove_f
-!
-! NAME
-!  h5lmove_f
-!
-! PURPOSE
-!  Renames a link within an HDF5 file.
-!
-! INPUTS
-!  src_loc_id 	 - Original file or group identifier.
-!  src_name 	 - Original link name.
-!  dest_loc_id 	 - Destination file or group identifier.
-!  dest_name 	 - NEW link name.
-!
-! OUTPUTS
-!  hdferr 	 - Error code:
-!                   0 on success and -1 on failure
-!
-! OPTIONAL PARAMETERS
-!  lcpl_id 	 - Link creation property list identifier to be associated WITH the NEW link.
-!  lapl_id 	 - Link access property list identifier to be associated WITH the NEW link.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 3, 2008
-!
-! SOURCE
-  SUBROUTINE h5lmove_f(src_loc_id, src_name, dest_loc_id, dest_name, hdferr, lcpl_id, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: src_loc_id  ! Original file or group identifier.
-    CHARACTER(LEN=*), INTENT(IN) :: src_name  ! Original link name.
-    INTEGER(HID_T), INTENT(IN) :: dest_loc_id ! Destination file or group identifier.
-    CHARACTER(LEN=*), INTENT(IN) :: dest_name ! NEW link name.
-    INTEGER, INTENT(OUT) :: hdferr     ! Error code:
-                                              ! 0 on success and -1 on failure
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lcpl_id ! Link creation property list identifier
-                                                    ! to be associated WITH the NEW link.
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id ! Link access property list identifier
-                                                    ! to be associated WITH the NEW link.
-!*****
-    INTEGER(SIZE_T) :: src_namelen
-    INTEGER(SIZE_T) :: dest_namelen
-
-    INTEGER(HID_T) :: lcpl_id_default
-    INTEGER(HID_T) :: lapl_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5lmove_c(src_loc_id, src_name, src_namelen, dest_loc_id, &
-            dest_name, dest_namelen, lcpl_id_default, lapl_id_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LMOVE_C'::h5lmove_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: src_name, dest_name
-         INTEGER(HID_T), INTENT(IN) :: src_loc_id
-
-         CHARACTER(LEN=*), INTENT(IN) :: src_name
-         INTEGER(SIZE_T) :: src_namelen
-         INTEGER(HID_T), INTENT(IN) :: dest_loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: dest_name
-         INTEGER(SIZE_T) :: dest_namelen
-
-         INTEGER(HID_T) :: lcpl_id_default
-         INTEGER(HID_T) :: lapl_id_default
-
-       END FUNCTION h5lmove_c
-    END INTERFACE
-
-    lcpl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    src_namelen = LEN(src_name)
-    dest_namelen = LEN(dest_name)
-
-    hdferr = H5Lmove_c(src_loc_id, src_name, src_namelen, dest_loc_id, &
-         dest_name, dest_namelen, lcpl_id_default, lapl_id_default)
-
-  END SUBROUTINE h5lmove_f
-
-!
-!****s* H5L/h5lget_name_by_idx_f
-!
-! NAME
-!  h5lget_name_by_idx_f
-!
-! PURPOSE
-!  Retrieves name of the nth link in a group, according to the order within a specified field or index.
-!
-! INPUTS
-!  loc_id 	 - File or group identifier specifying location of subject group
-!  group_name 	 - Name of subject group
-!  index_field 	 - Index or field which determines the order
-!  order 	 - Order within field or index
-!  n 	         - Link for which to retrieve information
-!
-! OUTPUTS
-!  name 	 - Buffer in which link value is returned
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! OPTIONAL PARAMETERS
-!  lapl_id 	 - List access property list identifier.
-!  size 	 - Maximum number of characters of link value to be returned.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 10, 2008
-!
-! SOURCE
-  SUBROUTINE h5lget_name_by_idx_f(loc_id, group_name, index_field, order, n, &
-        name, hdferr, size, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id       ! File or group identifier specifying location of subject group
-    CHARACTER(LEN=*), INTENT(IN) :: group_name ! Name of subject group
-    INTEGER, INTENT(IN) :: index_field  ! Index or field which determines the order
-                                        !    H5_INDEX_UNKNOWN_F   - Unknown index type
-                                        !    H5_INDEX_NAME_F      - Index on names
-                                        !    H5_INDEX_CRT_ORDER_F - Index on creation order
-                                        !    H5_INDEX_N_F	      - Number of indices defined
-    INTEGER, INTENT(IN) :: order        ! Order in which to iterate over index; Possible values are:
-                                        !    H5_ITER_UNKNOWN_F  - Unknown order
-                                        !    H5_ITER_INC_F      - Increasing order
-                                        !    H5_ITER_DEC_F      - Decreasing order
-                                        !    H5_ITER_NATIVE_F   - No particular order, whatever is fastest
-    INTEGER(HSIZE_T), INTENT(IN) :: n   ! Attribute’s position in index
-    CHARACTER(LEN=*), INTENT(OUT) :: name ! Buffer in which link value is returned
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code:
-                                          ! 0 on success and -1 on failure
-!*****
-    INTEGER(SIZE_T)  :: group_namelen
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id  ! Link access property list
-    INTEGER(HID_T) :: lapl_id_default
-    INTEGER(SIZE_T), OPTIONAL, INTENT(OUT) :: size   ! Indicates the size, in the number of characters, of the link
-    INTEGER(SIZE_T) :: size_default
-
-    INTERFACE
-       INTEGER FUNCTION h5lget_name_by_idx_c(loc_id, group_name, group_namelen, index_field, order, n, &
-             size_default, name, lapl_id_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LGET_NAME_BY_IDX_C'::h5lget_name_by_idx_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: group_name, name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-
-         CHARACTER(LEN=*), INTENT(IN) :: group_name
-         INTEGER(SIZE_T)  :: group_namelen
-         INTEGER, INTENT(IN) :: index_field
-         INTEGER, INTENT(IN) :: order
-         INTEGER(HSIZE_T), INTENT(IN) :: n
-         INTEGER(SIZE_T) :: size_default
-         CHARACTER(LEN=*), INTENT(OUT) :: name
-         INTEGER(HID_T) :: lapl_id_default
-       END FUNCTION h5lget_name_by_idx_c
-    END INTERFACE
-
-    group_namelen = LEN(group_name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    size_default = LEN(name)
-
-    hdferr = h5lget_name_by_idx_c(loc_id, group_name, group_namelen, index_field, order, n, &
-             size_default, name, lapl_id_default)
-
-    IF(PRESENT(size)) size = size_default
-
-
-  END SUBROUTINE h5lget_name_by_idx_f
-
-
-!  HAS PROBLEM WITH void pointer in C
-!!$!
-!!$!****s* H5L/
-!!$!
-!!$! NAME
-!!$!		h5lget_val_by_idx_f
-!!$!
-!!$! PURPOSE
-!!$!      Returns the link value of a link, according to the order of
-!!$!               an index.  For symbolic links, this is the path to which the
-!!$!               link points, including the null terminator.  For user-defined
-!!$!               links, it is the link buffer.
-!!$! INPUTS
-!!$!   loc_id      - File or group identifier specifying location of subject group
-!!$!   group_name  - Name of subject group
-!!$!   index_field - Index or field which determines the order
-!!$!   order       - Order within field or index
-!!$!   n           - Link for which to retrieve information
-!!$!   size        - Maximum number of characters of link value to be returned.
-!!$!
-!!$! OUTPUTS  NOTE: In C these are defined as a structure: H5L_info_t
-!!$!    corder_valid   - indicates whether the creation order data is valid for this attribute
-!!$!    corder         - is a positive integer containing the creation order of the attribute
-!!$!    cset           - indicates the character set used for the attribute’s name
-!!$!    data_size      - indicates the size, in the number of characters, of the attribute
-!!$!    hdferr         - error code
-!!$!				 Success:  0
-!!$!				 Failure: -1
-!!$! OPTIONAL PARAMETERS
-!!$!    lapl_id      - List access property list identifier.
-!!$!
-!!$! AUTHOR
-!!$!	M. Scot Breitenfeld
-!!$!		March 3, 2008
-!!$!
-!!$! HISTORY  N/A
-!!$!
-!!$!
-!!$! SOURCE
-!!$  SUBROUTINE h5lget_val_by_idx_f(loc_id, group_name, index_field, order, n, &
-!!$       f_corder_valid, corder, cset, data_size, hdferr, lapl_id)
-!!$    IMPLICIT NONE
-!!$    INTEGER(HID_T), INTENT(IN) :: loc_id  ! File or group identifier specifying location of subject group
-!!$    CHARACTER(LEN=*), INTENT(IN) :: group_name ! Name of subject group
-!!$    INTEGER, INTENT(IN) :: index_field  ! Index or field which determines the order
-!!$                                        !    H5_INDEX_UNKNOWN_F   - Unknown index type
-!!$                                        !    H5_INDEX_NAME_F      - Index on names
-!!$                                        !    H5_INDEX_CRT_ORDER_F - Index on creation order
-!!$                                        !    H5_INDEX_N_F	      - Number of indices defined
-!!$    INTEGER, INTENT(IN) :: order        ! Order in which to iterate over index; Possible values are:
-!!$                                        !    H5_ITER_UNKNOWN_F  - Unknown order
-!!$                                        !    H5_ITER_INC_F      - Increasing order
-!!$                                        !    H5_ITER_DEC_F      - Decreasing order
-!!$                                        !    H5_ITER_NATIVE_F   - No particular order, whatever is fastest
-!!$    INTEGER(HSIZE_T), INTENT(IN) :: n   ! Attribute’s position in index
-!!$    LOGICAL, INTENT(OUT) :: f_corder_valid ! Indicates whether the creation order data is valid for this attribute
-!!$    INTEGER, INTENT(OUT) :: corder ! Is a positive integer containing the creation order of the attribute
-!!$    INTEGER, INTENT(OUT) :: cset ! Indicates the character set used for the attribute’s name
-!!$    INTEGER(HSIZE_T), INTENT(OUT) :: data_size   ! Indicates the size, in the number of characters, of the attribute
-!!$    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
-!!$                                         ! 0 on success and -1 on failure
-!!$    INTEGER :: corder_valid
-!!$    INTEGER(SIZE_T)  :: group_namelen
-!!$    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id  ! Link access property list
-!!$    INTEGER(HID_T) :: lapl_id_default
-!!$
-!!$    INTERFACE
-!!$       INTEGER FUNCTION h5lget_val_by_idx_c(loc_id, group_name, group_namelen, index_field, order, n, &
-!!$            corder_valid, corder, cset, data_size, lapl_id_default)
-!!$         USE H5GLOBAL
-!!$         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-!!$         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LGET_VAL_BY_IDX_C'::h5lget_val_by_idx_c
-!!$         !DEC$ENDIF
-!!$         INTEGER(HID_T), INTENT(IN) :: loc_id
-!!$         CHARACTER(LEN=*), INTENT(IN) :: group_name
-!!$         INTEGER(SIZE_T)  :: group_namelen
-!!$         INTEGER, INTENT(IN) :: index_field
-!!$         INTEGER, INTENT(IN) :: order
-!!$         INTEGER(HSIZE_T), INTENT(IN) :: n
-!!$         INTEGER :: corder_valid
-!!$         INTEGER, INTENT(OUT) :: corder
-!!$         INTEGER, INTENT(OUT) :: cset
-!!$         INTEGER(HSIZE_T), INTENT(OUT) :: data_size
-!!$         INTEGER(HID_T) :: lapl_id_default
-!!$       END FUNCTION h5lget_val_by_idx_c
-!!$    END INTERFACE
-!!$
-!!$    group_namelen = LEN(group_name)
-!!$
-!!$    lapl_id_default = H5P_DEFAULT_F
-!!$    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-!!$
-!!$    hdferr = h5lget_info_by_idx_c(loc_id, group_name, group_namelen, index_field, order, n, &
-!!$         corder_valid, corder, cset, data_size, lapl_id_default)
-!!$
-!!$    f_corder_valid =.FALSE.
-!!$    IF (corder_valid .EQ. 1) f_corder_valid =.TRUE.
-!!$
-!!$  END SUBROUTINE h5lget_val_by_idx_f
-
-!!$!
-!!$!****s* H5L/h5lget_val_f
-!!$!
-!!$! NAME
-!!$!		h5lget_val_f
-!!$!
-!!$! PURPOSE
-!!$!  	Returns the value of a symbolic link.
-!!$!
-!!$! INPUTS
-!!$!   link_loc_id  - File or group identifier.
-!!$!   link_name    - Link whose value is to be returned.
-!!$!   size         - Maximum number of characters of link value to be returned.
-!!$!
-!!$! OUTPUTS
-!!$!   linkval_buff - The buffer to hold the returned link value.
-!!$!         hdferr - error code
-!!$!				 Success:  0
-!!$!				 Failure: -1
-!!$! OPTIONAL PARAMETERS
-!!$!    lapl_id      - List access property list identifier.
-!!$!
-!!$! AUTHOR
-!!$!	M. Scot Breitenfeld
-!!$!	March 3, 2008
-!!$! SOURCE
-!!$  SUBROUTINE h5lget_val_f(link_loc_id, link_name, size, linkval_buff,   &
-!!$       hdferr, lapl_id)
-!!$    IMPLICIT NONE
-!!$    INTEGER(HID_T), INTENT(IN) :: link_loc_id  ! File or group identifier.
-!!$    CHARACTER(LEN=*), INTENT(IN) :: link_name  ! Link whose value is to be returned.
-!!$    INTEGER(SIZE_T), INTENT(IN) :: size        !  Maximum number of characters of link value to be returned.
-!!$
-!!$    CHARACTER(LEN=size), INTENT(OUT) :: linkval_buff ! The buffer to hold the returned link value.
-!!$    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
-!!$    ! 0 on success and -1 on failure
-!!$    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id  ! Link access property list
-!!$
-!!$    INTEGER :: link_namelen
-!!$    INTEGER(HID_T) :: lapl_id_default
-!!$    INTEGER :: corder_valid
-!!$
-!!$    INTEGER :: link_namelen
-!!$    INTEGER(HID_T) :: lapl_id_default
-!!$
-!!$!  MS FORTRAN needs explicit interface for C functions called here.
-!!$!
-!!$    INTERFACE
-!!$       INTEGER FUNCTION h5lget_val_c(link_loc_id, link_name, link_namelen, size, linkval_buff, &
-!!$            lapl_id_default)
-!!$         USE H5GLOBAL
-!!$         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-!!$         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LGET_VAL_C'::h5lget_val_c
-!!$         !DEC$ENDIF
-!!$         INTEGER(HID_T), INTENT(IN) :: link_loc_id  ! File or group identifier.
-!!$         CHARACTER(LEN=*), INTENT(IN) :: link_name  ! Link whose value is to be returned.
-!!$         INTEGER :: link_namelen
-!!$         INTEGER(SIZE_T), INTENT(IN) :: size        !  Maximum number of characters of link value to be returned.
-!!$
-!!$         CHARACTER(LEN=size), INTENT(OUT) :: linkval_buff ! The buffer to hold the returned link value.
-!!$
-!!$         INTEGER :: link_namelen
-!!$         INTEGER(HID_T) :: lapl_id_default
-!!$
-!!$       END FUNCTION h5lget_val_c
-!!$    END INTERFACE
-!!$
-!!$    link_namelen = LEN(link_name)
-!!$
-!!$    lapl_id_default = H5P_DEFAULT_F
-!!$    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-!!$
-!!$    hdferr = h5lget_val_c(link_loc_id, link_name, link_namelen, size, linkval_buff, &
-!!$         lapl_id_default)
-!!$
-!!$  END SUBROUTINE h5lget_val_f
-
-!!$!
-!!$!****s* H5L/H5Lregistered_f
-!!$!
-!!$! NAME
-!!$!	    H5Lregistered_f
-!!$!
-!!$! PURPOSE
-!!$!  Registers user-defined link class or changes behavior of existing class.
-!!$!
-!!$! INPUTS NOTE: In C the following represents struct H5L_class_t:
-!!$!     version      - Version number of this struct
-!!$!     class_id     - Link class identifier
-!!$!     comment      - Comment for debugging
-!!$!     create_func  - Callback during link creation
-!!$!     move_func    - Callback after moving link
-!!$!     copy_func    - Callback after copying link
-!!$!     trav_func    - The main traversal function
-!!$!     del_func     - Callback for link deletion
-!!$!     query_func   - Callback for queries
-!!$!
-!!$! OUTPUTS
-!!$!           hdferr - Error code
-!!$!		       Success:  0
-!!$!	               Failure: -1
-!!$! OPTIONAL PARAMETERS
-!!$!                      None
-!!$!
-!!$! AUTHOR
-!!$! M. Scot Breitenfeld
-!!$!	      February 29, 2008
-!!$!
-!!$! HISTORY  N/A
-!!$!
-!!$!
-!!$! SOURCE
-!!$  SUBROUTINE H5Lregistered_f(version, class_id, comment, create_func, &
-!!$       move_func, copy_func, trav_func, del_func, query_func, hdferr)
-!!$    IMPLICIT NONE
-!!$    INTEGER, INTENT(IN) :: version      ! Version number of this struct
-!!$    INTEGER, INTENT(IN) :: class_id     ! Link class identifier
-!!$    CHARACTER(LEN=*), INTENT(IN) :: comment      ! Comment for debugging
-!!$    CHARACTER(LEN=*), INTENT(IN) :: create_func  ! Callback during link creation
-!!$    CHARACTER(LEN=*), INTENT(IN) :: move_func    ! Callback after moving link
-!!$    CHARACTER(LEN=*), INTENT(IN) :: copy_func    ! Callback after copying link
-!!$    CHARACTER(LEN=*), INTENT(IN) :: trav_func    ! The main traversal function
-!!$    CHARACTER(LEN=*), INTENT(IN) :: del_func     ! Callback for link deletion
-!!$    CHARACTER(LEN=*), INTENT(IN) :: query_func   ! Callback for queries
-!!$    INTEGER, INTENT(OUT) :: hdferr      ! Error code:
-!!$                                        ! 0 on success and -1 on failure
-!!$    INTEGER :: comment_len
-!!$    INTEGER :: create_func_len
-!!$    INTEGER :: move_func_len
-!!$    INTEGER :: copy_func_len
-!!$    INTEGER :: trav_func_len
-!!$    INTEGER :: del_func_len
-!!$    INTEGER :: query_func_len
-!!$
-!!$    INTERFACE
-!!$       INTEGER FUNCTION H5Lregistered_c(version, class_id, comment, &
-!!$            create_func, create_func_len, &
-!!$            move_func, move_func_len, &
-!!$            copy_func, copy_func_len, &
-!!$            trav_func, trav_func_len, &
-!!$            del_func, del_func_len, &
-!!$            query_func,query_func_len)
-!!$         USE H5GLOBAL
-!!$         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-!!$         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LREGISTERED_C'::H5Lregistered_c
-!!$         !DEC$ENDIF
-!!$         INTEGER, INTENT(IN) :: version      ! Version number of this struct
-!!$         INTEGER, INTENT(IN) :: class_id     ! Link class identifier
-!!$         CHARACTER(LEN=*), INTENT(IN) :: comment      ! Comment for debugging
-!!$         CHARACTER(LEN=*), INTENT(IN) :: create_func  ! Callback during link creation
-!!$         CHARACTER(LEN=*), INTENT(IN) :: move_func    ! Callback after moving link
-!!$         CHARACTER(LEN=*), INTENT(IN) :: copy_func    ! Callback after copying link
-!!$         CHARACTER(LEN=*), INTENT(IN) :: trav_func    ! The main traversal function
-!!$         CHARACTER(LEN=*), INTENT(IN) :: del_func     ! Callback for link deletion
-!!$         CHARACTER(LEN=*), INTENT(IN) :: query_func   ! Callback for queries
-!!$         INTEGER, INTENT(OUT) :: hdferr   ! Error code:
-!!$                                          ! 0 on success and -1 on failure
-!!$         INTEGER :: comment_len
-!!$         INTEGER :: create_func_len
-!!$         INTEGER :: move_func_len
-!!$         INTEGER :: copy_func_len
-!!$         INTEGER :: trav_func_len
-!!$         INTEGER :: del_func_len
-!!$         INTEGER :: query_func_len
-!!$
-!!$       END FUNCTION H5Lregistered_c
-!!$    END INTERFACE
-!!$
-!!$    comment_len     = LEN(comment)
-!!$    create_func_len = LEN(create_func)
-!!$    move_func_len   = LEN(move_func)
-!!$    copy_func_len   = LEN(copy_func)
-!!$    trav_func_len   = LEN(trav_func)
-!!$    del_func_len    = LEN(del_func)
-!!$    query_func_len  = LEN(query_func)
-!!$
-!!$    hdferr = H5Lregistered_c(version, class_id, comment, &
-!!$         create_func, create_func_len, &
-!!$         move_func, move_func_len, &
-!!$         copy_func, copy_func_len, &
-!!$         trav_func, trav_func_len, &
-!!$         del_func, del_func_len, &
-!!$         query_func, query_func_len)
-!!$
-!!$  END SUBROUTINE H5Lregistered_f
-
-END MODULE H5L
diff --git a/fortran/src/H5Lff_F03.f90 b/fortran/src/H5Lff_F03.f90
deleted file mode 100644
index 0fe7243..0000000
--- a/fortran/src/H5Lff_F03.f90
+++ /dev/null
@@ -1,243 +0,0 @@
-!****h* ROBODoc/H5L (F03)
-!
-! NAME
-!  H5L_PROVISIONAL
-!
-! FILE
-!  src/fortran/src/H5Lff_F03.f90
-!
-! PURPOSE
-!
-!  This file contains Fortran 90 and Fortran 2003 interfaces for H5L functions.
-!  It contains the same functions as H5Lff_F90.f90 but includes the
-!  Fortran 2003 functions and the interface listings. This file will be compiled
-!  instead of H5Lff_F90.f90 if Fortran 2003 functions are enabled.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5A function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5L_PROVISIONAL
-
-  USE H5GLOBAL
-  USE ISO_C_BINDING
-
-  IMPLICIT NONE
-
-!****t* H5L (F03)/h5l_info_t
-!
-! Fortran2003 Derived Type:
-!
-  TYPE, bind(c) :: union_t
-     INTEGER(haddr_t) :: address
-     INTEGER(size_t)  :: val_size
-  END TYPE union_t
-
-  TYPE, bind(c) :: h5l_info_t
-     INTEGER(c_int) :: type ! H5L_type_t     type
-!       LOGICAL(c_bool) :: corder_valid ! hbool_t        corder_valid
-     INTEGER(c_int64_t) :: corder ! int64_t        corder;
-     INTEGER(c_int) :: cset ! H5T_cset_t     cset;
-     TYPE(union_t) :: u
-  END TYPE h5l_info_t
-
-!*****
-
-!type specifies the link class. Valid values include the following:
-!     	H5L_TYPE_HARD 	Hard link
-!     	H5L_TYPE_SOFT 	Soft link
-!     	H5L_TYPE_EXTERNAL     	External link
-!     	H5L_TYPE_ERROR 	Error 
-!cset specifies the character set in which the link name is encoded. Valid values include the following:
-!     	H5T_CSET_ASCII 	US ASCII
-!     	H5T_CSET_UTF8     	UTF-8 Unicode encoding
-
-
-CONTAINS
-
-!****s* H5L (F03)/h5literate_f
-!
-! NAME
-!  h5literate_f
-!
-! PURPOSE
-!  Iterates through links in a group.
-!
-! Inputs:
-!  group_id   - Identifier specifying subject group
-!  index_type - Type of index which determines the order:
-!                H5_INDEX_NAME_F      - Alpha-numeric index on name
-!                H5_INDEX_CRT_ORDER_F - Index on creation order
-!  order      - Order within index:
-!                H5_ITER_INC_F    - Increasing order
-!                H5_ITER_DEC_F    - Decreasing order
-!                H5_ITER_NATIVE_F - Fastest available order
-!  idx 	      - IN: Iteration position at which to start
-!  op 	      - Callback function passing data regarding the link to the calling application
-!  op_data    - User-defined pointer to data required by the application for its processing of the link
-!
-! Outputs:
-!  idx 	        - OUT: Position at which an interrupted iteration may be restarted
-!  return_value - Success: The return value of the first operator that
-! 			   returns non-zero, or zero if all members were
-! 			   processed with no operator returning non-zero.
-!
-! 		  Failure: Negative if something goes wrong within the
-! 			   library, or the negative value returned by one
-! 			   of the operators.
-!
-!  hdferr     - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  July 8, 2008
-!
-! Fortran2003 Interface:
-  SUBROUTINE h5literate_f(group_id, index_type, order, idx, op, op_data, return_value, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T)  , INTENT(IN)    :: group_id
-    INTEGER         , INTENT(IN)    :: index_type
-    INTEGER         , INTENT(IN)    :: order
-    INTEGER(HSIZE_T), INTENT(INOUT) :: idx
-    TYPE(C_FUNPTR)  , INTENT(IN)    :: op
-    TYPE(C_PTR)     , INTENT(IN)    :: op_data
-    INTEGER         , INTENT(OUT)   :: return_value
-    INTEGER         , INTENT(OUT)   :: hdferr
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5literate_c(group_id, index_type, order, idx, op, op_data) &
-            BIND(C, NAME='h5literate_c')
-         USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr, c_funptr
-         USE H5GLOBAL
-         INTEGER(HID_T), INTENT(IN) :: group_id
-         INTEGER, INTENT(IN) :: index_type
-         INTEGER, INTENT(IN) :: order
-         INTEGER(HSIZE_T), INTENT(INOUT) :: idx
-         TYPE(C_FUNPTR), VALUE :: op
-         TYPE(C_PTR), VALUE :: op_data
-       END FUNCTION h5literate_c
-    END INTERFACE
-
-    return_value = h5literate_c(group_id, index_type, order, idx, op, op_data)
-
-    IF(return_value.GE.0)THEN
-       hdferr = 0
-    ELSE
-       hdferr = -1
-    END IF
-
-  END SUBROUTINE h5literate_f
-
-!****s* H5L (F03)/h5literate_by_name_f
-!
-! NAME
-!  h5literate_by_name_f
-!
-! PURPOSE
-!  Iterates through links in a group.
-!
-! Inputs:
-!  loc_id     - File or group identifier specifying location of subject group
-!  group_name - Name of subject group
-!  index_type - Type of index which determines the order:
-!                H5_INDEX_NAME_F      - Alpha-numeric index on name
-!                H5_INDEX_CRT_ORDER_F - Index on creation order
-!  order      - Order within index:
-!                H5_ITER_INC_F    - Increasing order
-!                H5_ITER_DEC_F    - Decreasing order
-!                H5_ITER_NATIVE_F - Fastest available order
-!  idx 	      - IN: Iteration position at which to start
-!  op 	      - Callback function passing data regarding the link to the calling application
-!  op_data    - User-defined pointer to data required by the application for its processing of the link
-!
-! Outputs:
-!  idx 	        - OUT: Position at which an interrupted iteration may be restarted
-!  return_value - Success: The return value of the first operator that
-! 			   returns non-zero, or zero if all members were
-! 			   processed with no operator returning non-zero.
-!
-! 		  Failure: Negative if something goes wrong within the
-! 			   library, or the negative value returned by one
-! 			   of the operators.
-!
-!  hdferr        - Returns 0 if successful and -1 if fails
-!
-! Optional parameters:
-!  lapl_id    - Link access property list
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  Augest 18, 2008
-!
-! Fortran2003 Interface:
-  SUBROUTINE h5literate_by_name_f(loc_id, group_name, index_type, order, &
-       idx, op, op_data, return_value, hdferr, lapl_id)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T)  , INTENT(IN)           :: loc_id
-    CHARACTER(LEN=*), INTENT(IN)           :: group_name 
-    INTEGER         , INTENT(IN)           :: index_type
-    INTEGER         , INTENT(IN)           :: order
-    INTEGER(HSIZE_T), INTENT(INOUT)        :: idx
-    TYPE(C_FUNPTR)  , INTENT(IN)           :: op  
-    TYPE(C_PTR)     , INTENT(IN)           :: op_data
-    INTEGER         , INTENT(OUT)          :: return_value
-    INTEGER         , INTENT(OUT)          :: hdferr
-    INTEGER(HID_T)  , INTENT(IN), OPTIONAL :: lapl_id
-!*****
-    INTEGER(HID_T) :: lapl_id_default
-    INTEGER(SIZE_T) :: namelen
-
-    INTERFACE
-       INTEGER FUNCTION h5literate_by_name_c(loc_id, name, namelen, index_type, order,&
-            idx, op, op_data, lapl_id_default) BIND(C, NAME='h5literate_by_name_c')
-         USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_char, c_ptr, c_funptr
-         USE H5GLOBAL
-         INTEGER(HID_T)  , INTENT(IN) :: loc_id
-         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
-         INTEGER(SIZE_T) , INTENT(IN) :: namelen
-         INTEGER         , INTENT(IN) :: index_type
-         INTEGER         , INTENT(IN) :: order
-         INTEGER(HSIZE_T), INTENT(INOUT) :: idx
-         TYPE(C_FUNPTR), VALUE :: op
-         TYPE(C_PTR), VALUE :: op_data
-         INTEGER(HID_T)  , INTENT(IN) :: lapl_id_default
-       END FUNCTION
-    END INTERFACE
-
-    namelen  = LEN(group_name)
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    return_value = h5literate_by_name_c(loc_id, group_name, namelen, index_type, order, idx, op, op_data, lapl_id_default)
-
-    IF(return_value.GE.0)THEN
-       hdferr = 0
-    ELSE
-       hdferr = -1
-    END IF
-
-  END SUBROUTINE h5literate_by_name_f
-
-END MODULE H5L_PROVISIONAL
diff --git a/fortran/src/H5Lff_F90.f90 b/fortran/src/H5Lff_F90.f90
deleted file mode 100644
index dd62b7b..0000000
--- a/fortran/src/H5Lff_F90.f90
+++ /dev/null
@@ -1,39 +0,0 @@
-!****h* ROBODoc/H5L (F90)
-!
-! NAME
-!  MODULE H5L_PROVISIONAL
-!
-! PURPOSE
-!  This file contains Fortran 90 interfaces for H5L functions. It contains
-!  the same functions as H5Lff_F03.f90 but excludes the Fortran 2003 functions
-!  and the interface listings. This file will be compiled instead of H5Lff_F03.f90
-!  if Fortran 2003 functions are not enabled.
-!
-! NOTE
-!  Currently contains no functions.
-!
-! COPYRIGHT
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!  Copyright by The HDF Group.                                               *
-!  Copyright by the Board of Trustees of the University of Illinois.         *
-!  All rights reserved.                                                      *
-!  *
-!  This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!  terms governing use, modification, and redistribution, is contained in    *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!  of the source code distribution tree; Copyright.html can be found at the  *
-!  root level of an installed copy of the electronic HDF5 document set and   *
-!  is linked from the top-level documents page.  It can also be found at     *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!  access to either file, you may request a copy from help at hdfgroup.org.     *
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!                         *** IMPORTANT ***
-!  If you add a new H5D function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!*****
-
-MODULE H5L_PROVISIONAL
-
-END MODULE H5L_PROVISIONAL
diff --git a/fortran/src/H5Of.c b/fortran/src/H5Of.c
index ae344a5..9e3ddc4 100644
--- a/fortran/src/H5Of.c
+++ b/fortran/src/H5Of.c
@@ -1,6 +1,6 @@
 /****h* H5Of/H5Of
  * PURPOSE
- *   This file contains C stubs for H5O Fortran APIs
+ *  This file contains C stubs for H5O Fortran APIs
  *
  * COPYRIGHT
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -109,12 +109,12 @@ fill_h5o_info_t_f(H5O_info_t Oinfo, H5O_info_t_f *object_info) {
  * PURPOSE
  *  Calls H5Olink
  * INPUTS
- *      object_id        - Object to be linked.
- *      new_loc_id       - File or group identifier specifying location at which object is to be linked.
- *      name             - Name of link to be created, relative to new_loc_id.
- *      namelen          - Length of buffer for link to be created.
- *      lcpl_id          - Link creation property list identifier.
- *      lapl_id          - Link access property list identifier.
+ *  object_id        - Object to be linked.
+ *  new_loc_id       - File or group identifier specifying location at which object is to be linked.
+ *  name             - Name of link to be created, relative to new_loc_id.
+ *  namelen          - Length of buffer for link to be created.
+ *  lcpl_id          - Link creation property list identifier.
+ *  lapl_id          - Link access property list identifier.
  * RETURNS
  *  0 on success, -1 on failure
  * AUTHOR
@@ -123,7 +123,7 @@ fill_h5o_info_t_f(H5O_info_t Oinfo, H5O_info_t_f *object_info) {
  * SOURCE
 */
 int_f
-nh5olink_c (hid_t_f *object_id, hid_t_f *new_loc_id, _fcd name, size_t_f *namelen,
+h5olink_c (hid_t_f *object_id, hid_t_f *new_loc_id, _fcd name, size_t_f *namelen,
             hid_t_f *lcpl_id, hid_t_f *lapl_id)
 /******/
 {
@@ -169,7 +169,7 @@ nh5olink_c (hid_t_f *object_id, hid_t_f *new_loc_id, _fcd name, size_t_f *namele
  * SOURCE
 */
 int_f
-nh5oopen_c (hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id, hid_t_f *obj_id)
+h5oopen_c (hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id, hid_t_f *obj_id)
 /******/
 {
   char *c_name = NULL;          /* Buffer to hold C string */
@@ -194,20 +194,20 @@ nh5oopen_c (hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id, hid
 }
 /****if* H5Of/h5oclose_c
  * NAME
- *   h5oclose_c
+ *  h5oclose_c
  * PURPOSE
- *   Call H5Oclose
+ *  Call H5Oclose
  * INPUTS
- *   object_id   - Object identifier  
+ *  object_id   - Object identifier  
  * RETURNS
- *   0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *   M. Scot Breitenfeld
- *   December 17, 2008
+ *  December 17, 2008
  * SOURCE
 */
 int_f
-nh5oclose_c ( hid_t_f *object_id )
+h5oclose_c ( hid_t_f *object_id )
 /******/
 {
   int_f ret_value=0;          /* Return value */
@@ -225,15 +225,15 @@ nh5oclose_c ( hid_t_f *object_id )
  * PURPOSE
  *  Calls H5Ovisit
  * INPUTS
- *    object_id - Identifier specifying subject group
- *   index_type - Type of index which determines the order
- *        order - Order within index
- *          idx - Iteration position at which to start
- *           op - Callback function passing data regarding the link to the calling application
- *      op_data - User-defined pointer to data required by the application for its processing of the link
+ *  object_id - Identifier specifying subject group
+ *  index_type - Type of index which determines the order
+ *  order - Order within index
+ *  idx - Iteration position at which to start
+ *  op - Callback function passing data regarding the link to the calling application
+ *  op_data - User-defined pointer to data required by the application for its processing of the link
  *
  * OUTPUTS
- *          idx - Position at which an interrupted iteration may be restarted
+ *  idx - Position at which an interrupted iteration may be restarted
  *
  * RETURNS
  *     >0 on success, 0< on failure
@@ -266,20 +266,20 @@ h5ovisit_c(hid_t_f *group_id, int_f *index_type, int_f *order, H5O_iterate_t op,
  *  Calls H5open_by_addr
  * INPUTS
  *  loc_id  - File or group identifier
- *    addr  - Object’s address in the file
+ *  addr  - Object’s address in the file
  *
  * OUTPUTS
  *  obj_id  - Dataset identifier      
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
  *  September 14, 2009
  * SOURCE
 */
 int_f
-nh5oopen_by_addr_c (hid_t_f *loc_id, haddr_t_f *addr, hid_t_f *obj_id)
+h5oopen_by_addr_c (hid_t_f *loc_id, haddr_t_f *addr, hid_t_f *obj_id)
 /******/
 {
   int_f ret_value = 0;          /* Return value */
@@ -458,7 +458,7 @@ h5oget_info_c (hid_t_f *object_id, H5O_info_t_f *object_info)
  * SOURCE
 */
 int_f
-nh5ocopy_c (hid_t_f *src_loc_id, _fcd src_name, size_t_f *src_name_len,
+h5ocopy_c (hid_t_f *src_loc_id, _fcd src_name, size_t_f *src_name_len,
 	    hid_t_f *dst_loc_id, _fcd dst_name, size_t_f *dst_name_len, 
 	    hid_t_f *ocpypl_id, hid_t_f *lcpl_id )
 /******/
@@ -499,15 +499,15 @@ nh5ocopy_c (hid_t_f *src_loc_id, _fcd src_name, size_t_f *src_name_len,
  * PURPOSE
  *  Calls H5Ovisit_by_name
  * INPUTS
- *    object_id - Identifier specifying subject group
- *   index_type - Type of index which determines the order
- *        order - Order within index
- *          idx - Iteration position at which to start
- *           op - Callback function passing data regarding the link to the calling application
- *      op_data - User-defined pointer to data required by the application for its processing of the link
+ *  object_id - Identifier specifying subject group
+ *  index_type - Type of index which determines the order
+ *  order - Order within index
+ *  idx - Iteration position at which to start
+ *  op - Callback function passing data regarding the link to the calling application
+ *  op_data - User-defined pointer to data required by the application for its processing of the link
  *
  * OUTPUTS
- *          idx - Position at which an interrupted iteration may be restarted
+ *  idx - Position at which an interrupted iteration may be restarted
  *
  * RETURNS
  *  >0 on success, 0< on failure
@@ -560,7 +560,7 @@ h5ovisit_by_name_c(hid_t_f *loc_id,  _fcd object_name, size_t_f *namelen, int_f
  * SOURCE
 */
 int_f
-nh5odecr_refcount_c (hid_t_f *object_id)
+h5odecr_refcount_c (hid_t_f *object_id)
 /******/
 {
   int_f ret_value = 0;  /* Return value */
@@ -594,7 +594,7 @@ nh5odecr_refcount_c (hid_t_f *object_id)
  * SOURCE
 */
 int_f
-nh5oexists_by_name_c (hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id)
+h5oexists_by_name_c (hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id)
 /******/
 {
   char *c_name = NULL;          /* Buffer to hold C string */
@@ -633,7 +633,7 @@ nh5oexists_by_name_c (hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *la
  * SOURCE
 */
 int_f
-nh5oincr_refcount_c (hid_t_f *object_id)
+h5oincr_refcount_c (hid_t_f *object_id)
 /******/
 {
   int_f ret_value = 0;  /* Return value */
@@ -665,7 +665,7 @@ nh5oincr_refcount_c (hid_t_f *object_id)
  * SOURCE
 */
 int_f
-nh5oset_comment_c (hid_t_f *object_id, _fcd comment, size_t_f *commentlen)
+h5oset_comment_c (hid_t_f *object_id, _fcd comment, size_t_f *commentlen)
 /******/
 {
   char *c_comment = NULL;   /* Buffer to hold C string */
@@ -697,7 +697,7 @@ nh5oset_comment_c (hid_t_f *object_id, _fcd comment, size_t_f *commentlen)
  * INPUTS
  *  object_id  - Identifier of the target object.
  *  name       - Name of the object whose comment is to be set or reset, 
- *               specified as a path relative to loc_id. 
+ *  specified as a path relative to loc_id. 
  *  namelen    - Length of the name.
  *  comment    - The new comment.
  *  commentlen - Length of the comment.
@@ -710,7 +710,7 @@ nh5oset_comment_c (hid_t_f *object_id, _fcd comment, size_t_f *commentlen)
  * SOURCE
 */
 int_f
-nh5oset_comment_by_name_c (hid_t_f *object_id, _fcd name, size_t_f *namelen,  _fcd comment, size_t_f *commentlen, hid_t_f *lapl_id)
+h5oset_comment_by_name_c (hid_t_f *object_id, _fcd name, size_t_f *namelen,  _fcd comment, size_t_f *commentlen, hid_t_f *lapl_id)
 /******/
 {
   char *c_comment = NULL;   /* Buffer to hold C string */
@@ -755,7 +755,7 @@ nh5oset_comment_by_name_c (hid_t_f *object_id, _fcd name, size_t_f *namelen,  _f
  *  n             - Object to open.
  *  lapl_id       - Link access property list.
  * OUTPUTS
- *   obj_id       - An object identifier for the opened object.
+ *  obj_id       - An object identifier for the opened object.
  * RETURNS
  *  0 on success, -1 on failure
  * AUTHOR
@@ -764,7 +764,7 @@ nh5oset_comment_by_name_c (hid_t_f *object_id, _fcd name, size_t_f *namelen,  _f
  * SOURCE
 */
 int_f
-nh5oopen_by_idx_c (hid_t_f *loc_id, _fcd  group_name, size_t_f *group_namelen, 
+h5oopen_by_idx_c (hid_t_f *loc_id, _fcd  group_name, size_t_f *group_namelen, 
 		       int_f *index_type, int_f *order, hsize_t_f *n, hid_t_f *obj_id, hid_t_f *lapl_id)
 /******/
 {
@@ -813,7 +813,7 @@ nh5oopen_by_idx_c (hid_t_f *loc_id, _fcd  group_name, size_t_f *group_namelen,
  * SOURCE
 */
 int_f
-nh5oget_comment_c (hid_t_f *object_id, _fcd comment, size_t_f *commentsize,  hssize_t_f *bufsize)
+h5oget_comment_c (hid_t_f *object_id, _fcd comment, size_t_f *commentsize,  hssize_t_f *bufsize)
 /******/
 {
   char *c_comment = NULL;  /* Buffer to hold C string */
@@ -869,7 +869,7 @@ nh5oget_comment_c (hid_t_f *object_id, _fcd comment, size_t_f *commentsize,  hss
  * SOURCE
 */
 int_f
-nh5oget_comment_by_name_c (hid_t_f *loc_id, _fcd name, size_t_f *name_size, 
+h5oget_comment_by_name_c (hid_t_f *loc_id, _fcd name, size_t_f *name_size, 
 			   _fcd comment, size_t_f *commentsize, size_t_f *bufsize, hid_t_f *lapl_id)
 /******/
 {
@@ -901,13 +901,19 @@ nh5oget_comment_by_name_c (hid_t_f *loc_id, _fcd name, size_t_f *name_size,
   if((c_bufsize = H5Oget_comment_by_name((hid_t)*loc_id, c_name, c_comment, (size_t)*commentsize,(hid_t)*lapl_id )) < 0)
     HGOTO_DONE(FAIL);
 
+  if(c_name)
+    HDfree(c_name);
+
   *bufsize = (size_t_f)c_bufsize;
 
   /*
    * Convert C name to FORTRAN and place it in the given buffer
    */
-  if(c_comment)
+  if(c_comment) {
     HD5packFstring(c_comment, _fcdtocp(comment), c_commentsize - 1);
+    HDfree(c_comment);
+  }
+
   return ret_value;
 
  done:
diff --git a/fortran/src/H5Off.F90 b/fortran/src/H5Off.F90
new file mode 100644
index 0000000..da940df
--- /dev/null
+++ b/fortran/src/H5Off.F90
@@ -0,0 +1,1149 @@
+!****h* ROBODoc/H5O
+!
+! NAME
+!  MODULE H5O
+!
+! FILE
+!  fortran/src/H5Off.f90
+!
+! PURPOSE
+!  This file contains Fortran interfaces for H5O functions.
+!
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! NOTES
+!       _____ __  __ _____   ____  _____ _______       _   _ _______
+!      |_   _|  \/  |  __ \ / __ \|  __ \__   __|/\   | \ | |__   __|
+! ****   | | | \  / | |__) | |  | | |__) | | |  /  \  |  \| |  | |    ****
+! ****   | | | |\/| |  ___/| |  | |  _  /  | | / /\ \ | . ` |  | |    ****
+! ****  _| |_| |  | | |    | |__| | | \ \  | |/ ____ \| |\  |  | |    ****
+!      |_____|_|  |_|_|     \____/|_|  \_\ |_/_/    \_\_| \_|  |_|
+!
+!  If you add a new H5O function you must add the function name to the
+!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
+!  This is needed for Windows based operating systems.
+!
+!*****
+
+MODULE H5O
+
+  USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR, C_FUNPTR, C_CHAR, C_INT64_T, C_LONG, C_INT, C_LOC
+  USE H5GLOBAL
+  IMPLICIT NONE
+
+!****t* H5T (F03)/h5o_info_t
+!
+! Fortran2003 Derived Type:
+!
+  TYPE, BIND(C) :: space_t
+     INTEGER(hsize_t) :: total ! Total space for storing object header in file
+     INTEGER(hsize_t) :: meta  ! Space within header for object header metadata information
+     INTEGER(hsize_t) :: mesg  ! Space within header for actual message information
+     INTEGER(hsize_t) :: free  ! Free space within object header
+  END TYPE space_t
+
+  TYPE, BIND(C) :: mesg_t
+     INTEGER(c_int64_t) :: present ! Flags to indicate presence of message type in header 
+     INTEGER(c_int64_t) :: shared  ! Flags to indicate message type is shared in header
+  END TYPE mesg_t
+  
+  TYPE, BIND(C) :: hdr_t
+     INTEGER :: version ! Version number of header format in file
+     INTEGER :: nmesgs  ! Number of object header messages
+     INTEGER :: nchunks ! Number of object header chunks
+     INTEGER :: flags   ! Object header status flags
+     TYPE(space_t)  :: space   
+     TYPE(mesg_t)   :: mesg
+  END TYPE hdr_t
+
+  ! Extra metadata storage for obj & attributes
+  TYPE, BIND(C) :: H5_ih_info_t
+     INTEGER(hsize_t) :: index_size ! btree and/or list
+     INTEGER(hsize_t) :: heap_size
+  END TYPE H5_ih_info_t
+
+  TYPE, BIND(C) :: meta_size_t
+     TYPE(H5_ih_info_t) :: obj  ! v1/v2 B-tree & local/fractal heap for groups, B-tree for chunked datasets
+     TYPE(H5_ih_info_t) :: attr ! v2 B-tree & heap for attributes
+  ENDTYPE meta_size_t
+  
+  TYPE, BIND(C) :: h5o_info_t
+     INTEGER(C_LONG)  :: fileno     ! File number that object is located in
+     INTEGER(haddr_t) :: addr       ! Object address in file  
+     INTEGER(C_INT)   :: type       ! Basic object type (group, dataset, etc.) 
+     INTEGER          :: rc         ! Reference count of object
+
+     INTEGER, DIMENSION(8) :: atime ! Access time         !    -- NOTE --
+     INTEGER, DIMENSION(8) :: mtime ! Modification time   ! Returns an integer array    
+     INTEGER, DIMENSION(8) :: ctime ! Change time         ! as specified in the Fortran 
+     INTEGER, DIMENSION(8) :: btime ! Birth time          ! intrinsic DATE_AND_TIME(VALUES)
+
+     INTEGER(hsize_t) :: num_attrs  ! # of attributes attached to object
+
+     TYPE(hdr_t) :: hdr
+
+     TYPE(meta_size_t) :: meta_size
+  END TYPE h5o_info_t
+
+!*****
+
+CONTAINS
+
+!****s* H5O/h5olink_f
+!
+! NAME
+!  h5olink_f
+!
+! PURPOSE
+!  Creates a hard link to an object in an HDF5 file.
+!
+! Inputs:
+!  object_id 	 - Object to be linked.
+!  new_loc_id 	 - File or group identifier specifying location at which object is to be linked.
+!  new_link_name - Name of link to be created, relative to new_loc_id.
+!
+! Outputs:
+!  hdferr        - Returns 0 if successful and -1 if fails.
+!
+! Optional parameters:
+!  lcpl_id 	 - Link creation property list identifier.
+!  lapl_id 	 - Link access property list identifier.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  April 21, 2008
+!
+! Fortran90 Interface:
+  SUBROUTINE h5olink_f(object_id, new_loc_id, new_link_name, hdferr, lcpl_id, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T)  , INTENT(IN)  :: object_id
+    INTEGER(HID_T)  , INTENT(IN)  :: new_loc_id
+    CHARACTER(LEN=*), INTENT(IN)  :: new_link_name
+    INTEGER         , INTENT(OUT) :: hdferr
+    INTEGER(HID_T)  , INTENT(IN), OPTIONAL :: lcpl_id
+    INTEGER(HID_T)  , INTENT(IN), OPTIONAL :: lapl_id
+!*****
+    INTEGER(HID_T) :: lapl_id_default
+    INTEGER(HID_T) :: lcpl_id_default
+
+    INTEGER(SIZE_T) :: new_link_namelen
+
+    INTERFACE
+       INTEGER FUNCTION h5olink_c(object_id, new_loc_id, new_link_name, new_link_namelen, &
+            lcpl_id_default, lapl_id_default) BIND(C,NAME='h5olink_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: object_id
+         INTEGER(HID_T), INTENT(IN) :: new_loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: new_link_name
+         INTEGER(SIZE_T) :: new_link_namelen
+         INTEGER(HID_T) :: lapl_id_default
+         INTEGER(HID_T) :: lcpl_id_default
+       END FUNCTION h5olink_c
+    END INTERFACE
+
+    new_link_namelen = LEN(new_link_name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+    lcpl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
+
+    hdferr = h5olink_c(object_id, new_loc_id, new_link_name, new_link_namelen, &
+         lcpl_id_default, lapl_id_default)
+
+  END SUBROUTINE h5olink_f
+
+!****s* H5O/h5oopen_f
+!
+! NAME
+!  h5oopen_f
+!
+! PURPOSE
+!  Opens an object in an HDF5 file by location identifier and path name.
+!
+! Inputs:
+!  loc_id  - File or group identifier.
+!  name    - Path to the object, relative to loc_id.
+!
+! Outputs:
+!  obj_id  - Object identifier for the opened object.
+!  hdferr  - Returns 0 if successful and -1 if fails.
+!
+! Optional parameters:
+!  lapl_id - Access property list identifier for the link pointing to the object.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  April 18, 2008
+!
+! Fortran90 Interface:
+  SUBROUTINE h5oopen_f(loc_id, name, obj_id, hdferr, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T)  , INTENT(IN)  :: loc_id
+    CHARACTER(LEN=*), INTENT(IN)  :: name
+    INTEGER(HID_T)  , INTENT(OUT) :: obj_id
+    INTEGER         , INTENT(OUT) :: hdferr
+    INTEGER(HID_T)  , INTENT(IN), OPTIONAL :: lapl_id
+!*****
+    INTEGER(HID_T) :: lapl_id_default
+    INTEGER(SIZE_T) :: namelen
+
+    INTERFACE
+       INTEGER FUNCTION h5oopen_c(loc_id, name, namelen, lapl_id_default, obj_id) BIND(C,NAME='h5oopen_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER(HID_T) :: lapl_id_default
+         INTEGER(SIZE_T) :: namelen
+         INTEGER(HID_T), INTENT(OUT) :: obj_id
+       END FUNCTION h5oopen_c
+    END INTERFACE
+
+    namelen = LEN(name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = h5oopen_c(loc_id, name, namelen, lapl_id_default, obj_id)
+
+  END SUBROUTINE h5oopen_f
+!
+!****s* H5O/h5oclose_f
+!
+! NAME
+!  h5oclose_f
+!
+! PURPOSE
+!  Closes an object in an HDF5 file.
+!
+! Inputs:
+!  object_id - Object identifier.
+!
+! Outputs:
+!  hdferr    - Returns 0 if successful and -1 if fails.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  December 17, 2008
+!
+! Fortran90 Interface:
+  SUBROUTINE h5oclose_f(object_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN)   :: object_id
+    INTEGER       , INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5oclose_c(object_id) BIND(C,NAME='h5oclose_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: object_id
+       END FUNCTION h5oclose_c
+    END INTERFACE
+
+    hdferr = h5oclose_c(object_id)
+  END SUBROUTINE h5oclose_f
+
+!
+!****s* H5O/h5open_by_addr_f
+! NAME		
+!  h5oopen_by_addr_f 
+!
+! PURPOSE
+!  Opens an object using its address within an HDF5 file. 
+!
+! Inputs:  
+!  loc_id - File or group identifier.
+!  addr   - Object’s address in the file.
+!
+! Outputs:
+!  obj_id - Object identifier for the opened object.
+!  hdferr - Returns 0 if successful and -1 if fails.
+!
+! AUTHOR	
+!  M. Scot Breitenfeld
+!  September 14, 2009
+! 
+! Fortran90 Interface:
+  SUBROUTINE h5oopen_by_addr_f(loc_id, addr, obj_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T)  , INTENT(IN)  :: loc_id
+    INTEGER(HADDR_T), INTENT(IN)  :: addr
+    INTEGER(HID_T)  , INTENT(OUT) :: obj_id
+    INTEGER         , INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5oopen_by_addr_c(loc_id, addr, obj_id) BIND(C,NAME='h5oopen_by_addr_c')
+         IMPORT :: HID_T, HADDR_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         INTEGER(HADDR_T), INTENT(IN) :: addr
+         INTEGER(HID_T), INTENT(OUT) :: obj_id
+       END FUNCTION h5oopen_by_addr_c
+    END INTERFACE
+
+    hdferr = h5oopen_by_addr_c(loc_id, addr, obj_id)
+
+  END SUBROUTINE h5oopen_by_addr_f
+!
+!****s* H5O/h5ocopy_f
+! NAME		
+!  h5ocopy_f 
+!
+! PURPOSE
+!  Copies an object in an HDF5 file.
+!
+! Inputs:  
+!  src_loc_id - Object identifier indicating the location of the source object to be copied.
+!  src_name   - Name of the source object to be copied.
+!  dst_loc_id - Location identifier specifying the destination.
+!  dst_name   - Name to be assigned to the new copy.
+!
+! Optional parameters:
+!  ocpypl_id  - Object copy property list.
+!  lcpl_id    - Link creation property list for the new hard link.
+!
+! Outputs: 
+!  hdferr     - Returns 0 if successful and -1 if fails.
+!
+! AUTHOR	
+!  M. Scot Breitenfeld
+!  March 14, 2012
+! 
+! Fortran90 Interface:
+  SUBROUTINE h5ocopy_f(src_loc_id, src_name, dst_loc_id, dst_name, hdferr, ocpypl_id, lcpl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T)  , INTENT(IN)  :: src_loc_id
+    CHARACTER(LEN=*), INTENT(IN)  :: src_name
+    INTEGER(HID_T)  , INTENT(IN)  :: dst_loc_id
+    CHARACTER(LEN=*), INTENT(IN)  :: dst_name
+    INTEGER         , INTENT(OUT) :: hdferr
+    INTEGER(HID_T)  , INTENT(IN), OPTIONAL :: ocpypl_id
+    INTEGER(HID_T)  , INTENT(IN), OPTIONAL :: lcpl_id
+!*****
+
+    INTEGER(SIZE_T) :: src_name_len, dst_name_len
+    INTEGER(HID_T)  :: ocpypl_id_default, lcpl_id_default
+
+    INTERFACE
+       INTEGER FUNCTION h5ocopy_c(src_loc_id, src_name, src_name_len, &
+            dst_loc_id, dst_name, dst_name_len, ocpypl_id_default, lcpl_id_default) &
+            BIND(C,NAME='h5ocopy_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T)  , INTENT(IN) :: src_loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: src_name
+         INTEGER(HID_T)  , INTENT(IN) :: dst_loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: dst_name
+         INTEGER(HID_T)  , INTENT(IN) :: ocpypl_id_default
+         INTEGER(HID_T)  , INTENT(IN) :: lcpl_id_default
+         INTEGER(SIZE_T)              :: src_name_len, dst_name_len
+
+       END FUNCTION h5ocopy_c
+    END INTERFACE
+
+    src_name_len = LEN(src_name)
+    dst_name_len = LEN(dst_name)
+
+    ocpypl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(ocpypl_id)) ocpypl_id_default = ocpypl_id
+    lcpl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
+
+    hdferr = h5ocopy_c(src_loc_id, src_name, src_name_len, &
+         dst_loc_id, dst_name, dst_name_len, ocpypl_id_default, lcpl_id_default)
+
+  END SUBROUTINE h5ocopy_f
+
+!****s* H5O/h5odecr_refcount_f
+! NAME		
+!  h5odecr_refcount_f
+!
+! PURPOSE
+!  Decrements an object reference count. 
+!
+! Inputs:  
+!  object_id - Object identifier.
+!
+! Outputs: 
+!  hdferr    - Returns 0 if successful and -1 if fails.
+!
+! AUTHOR	
+!  M. Scot Breitenfeld
+!  May 11, 2012
+! 
+! Fortran90 Interface:
+  SUBROUTINE h5odecr_refcount_f(object_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN)  :: object_id
+    INTEGER       , INTENT(OUT) :: hdferr
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5odecr_refcount_c(object_id) BIND(C,NAME='h5odecr_refcount_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T)  , INTENT(IN) :: object_id
+       END FUNCTION h5odecr_refcount_c
+    END INTERFACE
+
+    hdferr = h5odecr_refcount_c(object_id)  
+
+  END SUBROUTINE h5odecr_refcount_f
+
+!****s* H5O/h5oexists_by_name_f
+! NAME		
+!  h5oexists_by_name_f
+!
+! PURPOSE
+!  Determines whether a link resolves to an actual object.
+!
+! Inputs:
+!  loc_id   - Identifier of the file or group to query. 
+!  name     - The name of the link to check. 
+!    
+!
+! Optional parameters:
+!  lapl_id  - Link access property list identifier.
+!
+! Outputs: 
+!  link_exists - Existing link resolves to an object.
+!  hdferr      - Returns 0 if successful and -1 if fails.
+!
+! AUTHOR	
+!  M. Scot Breitenfeld
+!  May 11, 2012
+! 
+! Fortran90 Interface:
+  SUBROUTINE h5oexists_by_name_f(loc_id, name, link_exists, hdferr, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T)  , INTENT(IN)  :: loc_id
+    CHARACTER(LEN=*), INTENT(IN)  :: name
+    LOGICAL         , INTENT(OUT) :: link_exists
+    INTEGER         , INTENT(OUT) :: hdferr
+    INTEGER(HID_T)  , INTENT(IN), OPTIONAL :: lapl_id
+!*****
+
+    INTEGER(size_t) :: namelen
+    INTEGER :: status
+    INTEGER(HID_T) :: lapl_id_default
+
+    INTERFACE
+       INTEGER FUNCTION h5oexists_by_name_c(loc_id, name, namelen, lapl_id) &
+            BIND(C,NAME='h5oexists_by_name_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T)  , INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER(SIZE_T) , INTENT(IN) :: namelen
+         INTEGER(HID_T)  , INTENT(IN) :: lapl_id
+
+       END FUNCTION h5oexists_by_name_c
+    END INTERFACE
+
+    namelen = LEN(name)
+    
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    status = h5oexists_by_name_c(loc_id, name, namelen, lapl_id_default)
+
+    link_exists = .FALSE.
+    IF(status.EQ.1)THEN
+       link_exists = .TRUE.
+    ENDIF
+
+    hdferr = 0
+    IF(status.LT.0)THEN
+       hdferr = -1
+    ENDIF
+
+  END SUBROUTINE h5oexists_by_name_f
+
+!****s* H5O/h5oget_comment_f
+! NAME		
+!  h5oget_comment_f
+!
+! PURPOSE
+!  Retrieves comment for specified object. 
+!
+! Inputs:
+!  obj_id - Identifier for the target object.
+!
+! Optional parameters:
+!  bufsize - Size of the comment buffer.
+!
+! Outputs: 
+!  comment - The comment.
+!  hdferr  - Returns 0 if successful and -1 if fails.
+!
+! AUTHOR	
+!  M. Scot Breitenfeld
+!  May 11, 2012
+! 
+! Fortran90 Interface:
+  SUBROUTINE h5oget_comment_f(obj_id, comment, hdferr, bufsize)
+    IMPLICIT NONE
+    INTEGER(HID_T)   , INTENT(IN)            :: obj_id
+    CHARACTER(LEN=*) , INTENT(OUT)           :: comment
+    INTEGER          , INTENT(OUT)           :: hdferr
+    INTEGER(HSSIZE_T), INTENT(OUT), OPTIONAL :: bufsize 
+!*****
+
+    INTEGER(SIZE_T)   :: commentsize_default
+    INTEGER(HSSIZE_T) :: bufsize_default
+
+    INTERFACE
+       INTEGER FUNCTION h5oget_comment_c(obj_id, comment, commentsize_default, bufsize) &
+            BIND(C,NAME='h5oget_comment_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T)  , INTENT(IN)  :: obj_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: comment
+         INTEGER(SIZE_T) , INTENT(IN)  :: commentsize_default
+         INTEGER(HSSIZE_T) , INTENT(OUT) :: bufsize
+       END FUNCTION h5oget_comment_c
+    END INTERFACE
+
+    commentsize_default = LEN(comment)
+
+    hdferr = h5oget_comment_c(obj_id, comment, commentsize_default, bufsize_default)
+    
+    IF(PRESENT(bufsize)) bufsize = bufsize_default
+
+  END SUBROUTINE h5oget_comment_f
+
+!****s* H5O/h5oget_comment_by_name_f
+! NAME		
+!  h5oget_comment_by_name_f
+!
+! PURPOSE
+!  Retrieves comment for specified object.
+!
+! Inputs:
+!  loc_id   - Identifier of a file, group, dataset, or named datatype.
+!  name     - Name of the object whose comment is to be retrieved, 
+!             specified as a path relative to loc_id. 
+!
+! Optional parameters:
+!  bufsize  - Size of the comment buffer.
+!
+! Outputs: 
+!  comment  - The comment.
+!  hdferr   - Returns 0 if successful and -1 if fails.
+!
+! AUTHOR	
+!  M. Scot Breitenfeld
+!  July 6, 2012
+! 
+! Fortran90 Interface:
+  SUBROUTINE h5oget_comment_by_name_f(loc_id, name, comment, hdferr, bufsize, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T)  , INTENT(IN)            :: loc_id
+    CHARACTER(LEN=*), INTENT(IN)            :: name
+    CHARACTER(LEN=*), INTENT(OUT)           :: comment
+    INTEGER         , INTENT(OUT)           :: hdferr
+    INTEGER(SIZE_T) , INTENT(OUT), OPTIONAL :: bufsize 
+    INTEGER(HID_T)  , INTENT(IN) , OPTIONAL :: lapl_id 
+!*****
+
+    INTEGER(SIZE_T) :: commentsize_default
+    INTEGER(SIZE_T) :: name_size
+    INTEGER(SIZE_T) :: bufsize_default
+    INTEGER(HID_T)  :: lapl_id_default
+    INTERFACE
+       INTEGER FUNCTION h5oget_comment_by_name_c(loc_id, name, name_size, &
+            comment, commentsize_default, bufsize_default, lapl_id) BIND(C,NAME='h5oget_comment_by_name_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T)  , INTENT(IN)  :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN)  :: name
+         INTEGER(SIZE_T) , INTENT(IN)  :: name_size
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: comment
+         INTEGER(SIZE_T) , INTENT(IN)  :: commentsize_default
+         INTEGER(SIZE_T) , INTENT(OUT) :: bufsize_default
+         INTEGER(HID_T)  , INTENT(IN)  :: lapl_id
+       END FUNCTION h5oget_comment_by_name_c
+    END INTERFACE
+
+    commentsize_default = LEN(comment)
+    name_size = LEN(name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = h5oget_comment_by_name_c(loc_id, name, name_size, &
+         comment, commentsize_default, bufsize_default, lapl_id_default)
+    
+    IF(PRESENT(bufsize)) bufsize = bufsize_default
+
+  END SUBROUTINE h5oget_comment_by_name_f
+
+!****s* H5O/h5oincr_refcount_f
+! NAME		
+!  h5oincr_refcount_f
+!
+! PURPOSE
+!  Increments an object reference count.
+!
+! Inputs:  
+!  obj_id  - Object identifier.
+!
+! Outputs: 
+!  hdferr  - Returns 0 if successful and -1 if fails.
+!
+! AUTHOR	
+!  M. Scot Breitenfeld
+!  May 15, 2012
+! 
+! Fortran90 Interface:
+  SUBROUTINE h5oincr_refcount_f(obj_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN)  :: obj_id
+    INTEGER       , INTENT(OUT) :: hdferr
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5oincr_refcount_c(obj_id) BIND(C,NAME='h5oincr_refcount_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T)  , INTENT(IN) :: obj_id
+       END FUNCTION h5oincr_refcount_c
+    END INTERFACE
+
+    hdferr = h5oincr_refcount_c(obj_id) 
+
+  END SUBROUTINE h5oincr_refcount_f
+
+!****s* H5O/h5oopen_by_idx_f
+!
+! NAME
+!  h5oopen_by_idx_f
+!
+! PURPOSE
+!  Open the nth object in a group. 
+!
+! Inputs:
+!  loc_id      - A file or group identifier.
+!  group_name  - Name of group, relative to loc_id, in which object is located.
+!  index_type  - Type of index by which objects are ordered.
+!  order       - Order of iteration within index, NOTE: zero-based.
+!  n           - Object to open.
+!
+! Outputs:
+!  obj_id      - An object identifier for the opened object.
+!  hdferr      - Returns 0 if successful and -1 if fails.
+!
+! Optional parameters:
+!  lapl_id     - Link access property list.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  May 17, 2012
+!
+! Fortran90 Interface:
+  SUBROUTINE h5oopen_by_idx_f(loc_id, group_name, index_type, order, n, obj_id, &
+       hdferr, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T)  , INTENT(IN)            :: loc_id
+    CHARACTER(LEN=*), INTENT(IN)            :: group_name
+    INTEGER         , INTENT(IN)            :: index_type
+    INTEGER         , INTENT(IN)            :: order
+    INTEGER(HSIZE_T), INTENT(IN)            :: n
+    INTEGER(HID_T)  , INTENT(OUT)           :: obj_id
+    INTEGER         , INTENT(OUT)           :: hdferr
+    INTEGER(HID_T)  , INTENT(IN) , OPTIONAL :: lapl_id
+!*****
+    INTEGER(SIZE_T) :: group_namelen
+    INTEGER(HID_T)  :: lapl_id_default
+    
+    INTERFACE
+       INTEGER FUNCTION h5oopen_by_idx_c(loc_id, group_name, group_namelen, index_type, order, n, obj_id, lapl_id_default) &
+            BIND(C,NAME='h5oopen_by_idx_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T)  , INTENT(IN)  :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN)  :: group_name
+         INTEGER(SIZE_T) , INTENT(IN)  :: group_namelen
+         INTEGER         , INTENT(IN)  :: index_type
+         INTEGER         , INTENT(IN)  :: order
+         INTEGER(HSIZE_T), INTENT(IN)  :: n
+         INTEGER(HID_T)  , INTENT(OUT) :: obj_id
+         INTEGER(HID_T)  , INTENT(IN)  :: lapl_id_default
+
+       END FUNCTION h5oopen_by_idx_c
+    END INTERFACE
+
+    group_namelen = LEN(group_name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    hdferr = h5oopen_by_idx_c(loc_id, group_name, group_namelen, index_type, order, n, obj_id, lapl_id_default)
+
+  END SUBROUTINE H5Oopen_by_idx_f
+
+!****s* H5O/h5oset_comment_f
+! NAME		
+!  h5oset_comment_f
+!
+! PURPOSE
+!  Sets comment for specified object.
+!
+! Inputs:  
+!  obj_id    - Identifier of the target object.
+!  comment   - The new comment.
+!
+! Outputs: 
+!  hdferr    - Returns 0 if successful and -1 if fails.
+!
+! AUTHOR	
+!  M. Scot Breitenfeld
+!  May 15, 2012
+! 
+! Fortran90 Interface:
+  SUBROUTINE h5oset_comment_f(obj_id, comment, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T)  , INTENT(IN)  :: obj_id
+    CHARACTER(LEN=*), INTENT(IN)  :: comment
+    INTEGER         , INTENT(OUT) :: hdferr
+!*****
+    INTEGER(SIZE_T) :: commentlen
+
+    INTERFACE
+       INTEGER FUNCTION h5oset_comment_c(obj_id, comment, commentlen) BIND(C,NAME='h5oset_comment_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T)  , INTENT(IN) :: obj_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: comment
+         INTEGER(SIZE_T) , INTENT(IN) :: commentlen
+
+       END FUNCTION h5oset_comment_c
+    END INTERFACE
+
+    commentlen = LEN(comment)
+    
+    hdferr = h5oset_comment_c(obj_id, comment, commentlen)
+
+  END SUBROUTINE h5oset_comment_f
+
+!****s* H5O/h5oset_comment_by_name_f
+! NAME		
+!  h5oset_comment_by_name_f
+!
+! PURPOSE
+!  Sets comment for specified object. 
+!
+! Inputs:  
+!  loc_id   - Identifier of a file, group, dataset, or named datatype.
+!  name     - Name of the object whose comment is to be set or reset, 
+!              specified as a path relative to loc_id. 
+!  comment  - The new comment.
+!
+! Outputs: 
+!  hdferr   - Returns 0 if successful and -1 if fails.
+!
+! Optional parameters:
+!  lapl_id  - Link access property list identifier.
+!
+! AUTHOR	
+!  M. Scot Breitenfeld
+!  May 15, 2012
+! 
+! Fortran90 Interface:
+  SUBROUTINE h5oset_comment_by_name_f(loc_id, name, comment, hdferr, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T)  , INTENT(IN)  :: loc_id
+    CHARACTER(LEN=*), INTENT(IN)  :: name
+    CHARACTER(LEN=*), INTENT(IN)  :: comment
+    INTEGER         , INTENT(OUT) :: hdferr
+    INTEGER(HID_T)  , INTENT(IN), OPTIONAL :: lapl_id
+!*****
+    INTEGER(SIZE_T) :: commentlen
+    INTEGER(SIZE_T) :: namelen
+    INTEGER(HID_T) :: lapl_id_default
+
+    INTERFACE
+       INTEGER FUNCTION h5oset_comment_by_name_c(loc_id, name, namelen, comment, commentlen, lapl_id) &
+            BIND(C,NAME='h5oset_comment_by_name_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T)  , INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: comment
+         INTEGER(SIZE_T) , INTENT(IN) :: commentlen
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER(SIZE_T) , INTENT(IN) :: namelen
+         INTEGER(HID_T)  , INTENT(IN) :: lapl_id
+       END FUNCTION h5oset_comment_by_name_c
+    END INTERFACE
+
+    commentlen = LEN(comment)
+    namelen = LEN(name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+    
+    hdferr = h5oset_comment_by_name_c(loc_id, name, namelen, comment, commentlen, lapl_id_default)
+
+  END SUBROUTINE h5oset_comment_by_name_f
+
+!****s* H5O (F03)/h5ovisit_f_F03
+!
+! NAME
+!  h5ovisit_f
+!
+! PURPOSE
+!  Recursively visits all objects starting from a specified object.
+!
+! Inputs:
+!  object_id  - Identifier of the object at which the recursive iteration begins.
+!  index_type - Type of index; valid values include:
+!                H5_INDEX_NAME_F
+!                H5_INDEX_CRT_ORDER_F
+!  order      - Order in which index is traversed; valid values include:
+!                H5_ITER_DEC_F
+!                H5_ITER_INC_F
+!                H5_ITER_NATIVE_F
+!  op 	      - Callback function passing data regarding the group to the calling application
+!  op_data    - User-defined pointer to data required by the application for its processing of the group
+!
+! Outputs:
+!  return_value - returns the return value of the first operator that returns a positive value, or 
+!                 zero if all members were processed with no operator returning non-zero.
+!  hdferr       - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  M. Scot Breitenfeld
+!  November 19, 2008
+!
+! Fortran2003 Interface:
+  SUBROUTINE h5ovisit_f(object_id, index_type, order, op, op_data, return_value, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: object_id
+    INTEGER, INTENT(IN) :: index_type 
+    INTEGER, INTENT(IN) :: order
+
+    TYPE(C_FUNPTR):: op
+    TYPE(C_PTR)   :: op_data
+    INTEGER, INTENT(OUT) :: return_value
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5ovisit_c(object_id, index_type, order, op, op_data) &
+            BIND(C, NAME='h5ovisit_c')
+         IMPORT :: C_FUNPTR, C_PTR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: object_id
+         INTEGER, INTENT(IN) :: index_type
+         INTEGER, INTENT(IN) :: order
+         TYPE(C_FUNPTR), VALUE :: op
+         TYPE(C_PTR), VALUE :: op_data
+       END FUNCTION h5ovisit_c
+    END INTERFACE
+
+    return_value = h5ovisit_c(object_id, index_type, order, op, op_data)
+
+    IF(return_value.GE.0)THEN
+       hdferr = 0
+    ELSE
+       hdferr = -1
+    END IF
+
+  END SUBROUTINE h5ovisit_f
+
+!****s* H5O (F03)/h5oget_info_by_name_f_F03
+!
+! NAME
+!  h5oget_info_by_name_f
+!
+! PURPOSE
+!  Retrieves the metadata for an object, identifying the object by location and relative name.
+!
+! Inputs:
+!  loc_id      - File or group identifier specifying location of group 
+!                in which object is located.
+!  name        - Name of group, relative to loc_id.
+!
+! Outputs:  
+!  object_info - Buffer in which to return object information.
+!  hdferr      - Returns 0 if successful and -1 if fails.
+!
+! Optional parameters:
+!  lapl_id     - Link access property list.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  December 1, 2008
+!
+! Fortran2003 Interface:
+  SUBROUTINE h5oget_info_by_name_f(loc_id, name, object_info, hdferr, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T)  , INTENT(IN)            :: loc_id
+    CHARACTER(LEN=*), INTENT(IN)            :: name
+    TYPE(h5o_info_t), INTENT(OUT), TARGET   :: object_info
+    INTEGER         , INTENT(OUT)           :: hdferr
+    INTEGER(HID_T)  , INTENT(IN) , OPTIONAL :: lapl_id
+!*****
+    INTEGER(SIZE_T) :: namelen
+    INTEGER(HID_T)  :: lapl_id_default
+    TYPE(C_PTR)     :: ptr
+    
+    INTERFACE
+       INTEGER FUNCTION h5oget_info_by_name_c(loc_id, name, namelen, lapl_id_default, object_info) &
+            BIND(C, NAME='h5oget_info_by_name_c')
+         IMPORT :: c_char, c_ptr
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T)  , INTENT(IN)  :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER(SIZE_T) , INTENT(IN)  :: namelen
+         INTEGER(HID_T)  , INTENT(IN)  :: lapl_id_default
+         TYPE(C_PTR),VALUE             :: object_info
+
+       END FUNCTION h5oget_info_by_name_c
+    END INTERFACE
+
+    namelen = LEN(name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    ptr = C_LOC(object_info)
+
+    hdferr = H5Oget_info_by_name_c(loc_id, name, namelen, lapl_id_default, ptr)
+
+  END SUBROUTINE H5Oget_info_by_name_f
+
+!****s* H5O (F03)/h5oget_info_f_F03
+!
+! NAME
+!  h5oget_info_f
+!
+! PURPOSE
+!  Retrieves the metadata for an object specified by an identifier.
+!
+! Inputs:
+!  object_id   - Identifier for target object.
+!
+! Outputs:
+!  object_info - Buffer in which to return object information.
+!  hdferr      - Returns 0 if successful and -1 if fails.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  May 11, 2012
+!
+! Fortran2003 Interface:
+  SUBROUTINE h5oget_info_f(object_id, object_info, hdferr)
+
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T)  , INTENT(IN)            :: object_id
+    TYPE(h5o_info_t), INTENT(OUT), TARGET   :: object_info
+    INTEGER         , INTENT(OUT)           :: hdferr
+!*****
+    TYPE(C_PTR) :: ptr
+    
+    INTERFACE
+       INTEGER FUNCTION h5oget_info_c(object_id, object_info) &
+            BIND(C, NAME='h5oget_info_c')
+         IMPORT :: C_PTR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN)  :: object_id
+         TYPE(C_PTR), VALUE          :: object_info
+       END FUNCTION h5oget_info_c
+    END INTERFACE
+
+    ptr = C_LOC(object_info)
+    hdferr = H5Oget_info_c(object_id, ptr)
+
+  END SUBROUTINE H5Oget_info_f
+
+!****s* H5O (F03)/h5oget_info_by_idx_f_F03
+!
+! NAME
+!  h5oget_info_by_idx_f
+!
+! PURPOSE
+!  Retrieves the metadata for an object, identifying the object by an index position.
+!
+! Inputs:
+!  loc_id      - File or group identifier specifying location of group 
+!                in which object is located.
+!  group_name  - Name of group in which object is located.
+!  index_field - Index or field that determines the order.
+!  order       - Order within field or index.
+!  n           - Object for which information is to be returned
+!
+! Outputs:  
+!  object_info - Buffer in which to return object information.
+!  hdferr      - Returns 0 if successful and -1 if fails.
+!
+! Optional parameters:
+!  lapl_id     - Link access property list. (Not currently used.)
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  May 11, 2012
+!
+! Fortran2003 Interface:
+  SUBROUTINE h5oget_info_by_idx_f(loc_id, group_name, index_field, order, n, &
+       object_info, hdferr, lapl_id)
+
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T)  , INTENT(IN)            :: loc_id
+    CHARACTER(LEN=*), INTENT(IN)            :: group_name
+    INTEGER         , INTENT(IN)            :: index_field
+    INTEGER         , INTENT(IN)            :: order
+    INTEGER(HSIZE_T), INTENT(IN)            :: n
+    TYPE(h5o_info_t), INTENT(OUT), TARGET   :: object_info
+    INTEGER         , INTENT(OUT)           :: hdferr
+    INTEGER(HID_T)  , INTENT(IN) , OPTIONAL :: lapl_id
+!*****
+    INTEGER(SIZE_T) :: namelen
+    INTEGER(HID_T)  :: lapl_id_default
+    TYPE(C_PTR)     :: ptr
+    
+    INTERFACE
+       INTEGER FUNCTION h5oget_info_by_idx_c(loc_id, group_name, namelen, &
+            index_field, order, n, lapl_id_default, object_info) BIND(C, NAME='h5oget_info_by_idx_c')
+         IMPORT :: c_char, c_ptr, c_funptr
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         INTEGER(HID_T)  , INTENT(IN)  :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: group_name
+         INTEGER(SIZE_T) , INTENT(IN)  :: namelen
+         INTEGER         , INTENT(IN)  :: index_field
+         INTEGER         , INTENT(IN)  :: order
+         INTEGER(HSIZE_T), INTENT(IN)  :: n
+         INTEGER(HID_T)  , INTENT(IN)  :: lapl_id_default
+         TYPE(C_PTR), VALUE            :: object_info
+
+       END FUNCTION h5oget_info_by_idx_c
+    END INTERFACE
+
+    namelen = LEN(group_name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    ptr = C_LOC(object_info)
+    hdferr = H5Oget_info_by_idx_c(loc_id, group_name, namelen, index_field, order, n, lapl_id_default, ptr)
+
+  END SUBROUTINE H5Oget_info_by_idx_f
+
+
+!****s* H5O (F03)/h5ovisit_by_name_f_F03
+!
+! NAME
+!  h5ovisit_by_name_f
+!
+! PURPOSE
+!  Recursively visits all objects starting from a specified object.
+!
+! Inputs:
+!  loc_id      - Identifier of a file or group.
+!  object_name - Name of the object, generally relative to loc_id, that will serve as root of the iteration 
+!  index_type  - Type of index; valid values include:
+!                 H5_INDEX_NAME_F
+!                 H5_INDEX_CRT_ORDER_F
+!  order       - Order in which index is traversed; valid values include:
+!                 H5_ITER_DEC_F
+!                 H5_ITER_INC_F
+!                 H5_ITER_NATIVE_F
+!  op 	       - Callback function passing data regarding the group to the calling application
+!  op_data     - User-defined pointer to data required by the application for its processing of the group
+!
+! Outputs:
+!  return_value - Returns the return value of the first operator that returns a positive value, or 
+!                 zero if all members were processed with no operator returning non-zero.
+!  hdferr       - Returns 0 if successful and -1 if fails
+!
+! Optional parameters:
+!  lapl_id      - Link access property list identifier.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  November 19, 2008
+!
+! Fortran2003 Interface:
+  SUBROUTINE h5ovisit_by_name_f(loc_id, object_name, index_type, order, op, op_data, &
+       return_value, hdferr, lapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T)  , INTENT(IN)             :: loc_id
+    CHARACTER(LEN=*), INTENT(IN)             :: object_name
+    INTEGER         , INTENT(IN)             :: index_type 
+    INTEGER         , INTENT(IN)             :: order
+
+    TYPE(C_FUNPTR)                           :: op
+    TYPE(C_PTR)                              :: op_data
+    INTEGER         , INTENT(OUT)            :: return_value
+    INTEGER         , INTENT(OUT)            :: hdferr
+    INTEGER(HID_T)  , INTENT(IN) , OPTIONAL  :: lapl_id
+!*****
+
+    INTEGER(SIZE_T) :: namelen
+    INTEGER(HID_T)  :: lapl_id_default
+
+    INTERFACE
+       INTEGER FUNCTION h5ovisit_by_name_c(loc_id, object_name, namelen, index_type, order, &
+            op, op_data, lapl_id) BIND(C, NAME='h5ovisit_by_name_c')
+         IMPORT :: C_CHAR, C_PTR, C_FUNPTR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T)  , INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: object_name
+         INTEGER(SIZE_T)              :: namelen
+         INTEGER         , INTENT(IN) :: index_type
+         INTEGER         , INTENT(IN) :: order
+         TYPE(C_FUNPTR)  , VALUE      :: op
+         TYPE(C_PTR)     , VALUE      :: op_data
+         INTEGER(HID_T)  , INTENT(IN) :: lapl_id
+       END FUNCTION h5ovisit_by_name_c
+    END INTERFACE
+
+    namelen = LEN(object_name)
+
+    lapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
+
+    return_value = h5ovisit_by_name_c(loc_id, object_name, namelen, index_type, order, &
+         op, op_data, lapl_id_default)
+
+    IF(return_value.GE.0)THEN
+       hdferr = 0
+    ELSE
+       hdferr = -1
+    END IF
+
+  END SUBROUTINE h5ovisit_by_name_f
+
+END MODULE H5O
+
diff --git a/fortran/src/H5Off.f90 b/fortran/src/H5Off.f90
deleted file mode 100644
index 8a40079..0000000
--- a/fortran/src/H5Off.f90
+++ /dev/null
@@ -1,775 +0,0 @@
-!****h* ROBODoc/H5O
-!
-! NAME
-!  MODULE H5O
-!
-! FILE
-!  fortran/src/H5Off.f90
-!
-! PURPOSE
-!  This file contains Fortran interfaces for H5O functions. It includes
-!  all the functions that are independent on whether the Fortran 2003 functions
-!  are enabled or disabled.
-!
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5O function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5O
-
-  USE H5GLOBAL
-
-CONTAINS
-
-!****s* H5O/h5olink_f
-!
-! NAME
-!  h5olink_f
-!
-! PURPOSE
-!  Creates a hard link to an object in an HDF5 file.
-!
-! Inputs:
-!  object_id 	 - Object to be linked.
-!  new_loc_id 	 - File or group identifier specifying location at which object is to be linked.
-!  new_link_name - Name of link to be created, relative to new_loc_id.
-!
-! Outputs:
-!  hdferr        - Returns 0 if successful and -1 if fails.
-!
-! Optional parameters:
-!  lcpl_id 	 - Link creation property list identifier.
-!  lapl_id 	 - Link access property list identifier.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  April 21, 2008
-!
-! Fortran90 Interface:
-  SUBROUTINE h5olink_f(object_id, new_loc_id, new_link_name, hdferr, lcpl_id, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T)  , INTENT(IN)  :: object_id
-    INTEGER(HID_T)  , INTENT(IN)  :: new_loc_id
-    CHARACTER(LEN=*), INTENT(IN)  :: new_link_name
-    INTEGER         , INTENT(OUT) :: hdferr
-    INTEGER(HID_T)  , INTENT(IN), OPTIONAL :: lcpl_id
-    INTEGER(HID_T)  , INTENT(IN), OPTIONAL :: lapl_id
-!*****
-    INTEGER(HID_T) :: lapl_id_default
-    INTEGER(HID_T) :: lcpl_id_default
-
-    INTEGER(SIZE_T) :: new_link_namelen
-
-    INTERFACE
-       INTEGER FUNCTION h5olink_c(object_id, new_loc_id, new_link_name, new_link_namelen, &
-            lcpl_id_default, lapl_id_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5OLINK_C'::h5olink_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: new_link_name
-         INTEGER(HID_T), INTENT(IN) :: object_id
-         INTEGER(HID_T), INTENT(IN) :: new_loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: new_link_name
-         INTEGER(SIZE_T) :: new_link_namelen
-         INTEGER(HID_T) :: lapl_id_default
-         INTEGER(HID_T) :: lcpl_id_default
-       END FUNCTION h5olink_c
-    END INTERFACE
-
-    new_link_namelen = LEN(new_link_name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-    lcpl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
-
-    hdferr = h5olink_c(object_id, new_loc_id, new_link_name, new_link_namelen, &
-         lcpl_id_default, lapl_id_default)
-
-  END SUBROUTINE h5olink_f
-
-!****s* H5O/h5oopen_f
-!
-! NAME
-!  h5oopen_f
-!
-! PURPOSE
-!  Opens an object in an HDF5 file by location identifier and path name.
-!
-! Inputs:
-!  loc_id  - File or group identifier.
-!  name    - Path to the object, relative to loc_id.
-!
-! Outputs:
-!  obj_id  - Object identifier for the opened object.
-!  hdferr  - Returns 0 if successful and -1 if fails.
-!
-! Optional parameters:
-!  lapl_id - Access property list identifier for the link pointing to the object.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  April 18, 2008
-!
-! Fortran90 Interface:
-  SUBROUTINE h5oopen_f(loc_id, name, obj_id, hdferr, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T)  , INTENT(IN)  :: loc_id
-    CHARACTER(LEN=*), INTENT(IN)  :: name
-    INTEGER(HID_T)  , INTENT(OUT) :: obj_id
-    INTEGER         , INTENT(OUT) :: hdferr
-    INTEGER(HID_T)  , INTENT(IN), OPTIONAL :: lapl_id
-!*****
-    INTEGER(HID_T) :: lapl_id_default
-    INTEGER(SIZE_T) :: namelen
-
-    INTERFACE
-       INTEGER FUNCTION h5oopen_c(loc_id, name, namelen, lapl_id_default, obj_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5OOPEN_C'::h5oopen_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER(HID_T) :: lapl_id_default
-         INTEGER(SIZE_T) :: namelen
-         INTEGER(HID_T), INTENT(OUT) :: obj_id
-       END FUNCTION h5oopen_c
-    END INTERFACE
-
-    namelen = LEN(name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5oopen_c(loc_id, name, namelen, lapl_id_default, obj_id)
-
-  END SUBROUTINE h5oopen_f
-!
-!****s* H5O/h5oclose_f
-!
-! NAME
-!  h5oclose_f
-!
-! PURPOSE
-!  Closes an object in an HDF5 file.
-!
-! Inputs:
-!  object_id - Object identifier.
-!
-! Outputs:
-!  hdferr    - Returns 0 if successful and -1 if fails.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  December 17, 2008
-!
-! Fortran90 Interface:
-  SUBROUTINE h5oclose_f(object_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN)   :: object_id
-    INTEGER       , INTENT(OUT) :: hdferr
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5oclose_c(object_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5OCLOSE_C'::h5oclose_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: object_id
-       END FUNCTION h5oclose_c
-    END INTERFACE
-
-    hdferr = h5oclose_c(object_id)
-  END SUBROUTINE h5oclose_f
-
-!
-!****s* H5O/h5open_by_addr_f
-! NAME		
-!  h5oopen_by_addr_f 
-!
-! PURPOSE
-!  Opens an object using its address within an HDF5 file. 
-!
-! Inputs:  
-!  loc_id - File or group identifier.
-!  addr   - Object’s address in the file.
-!
-! Outputs:
-!  obj_id - Object identifier for the opened object.
-!  hdferr - Returns 0 if successful and -1 if fails.
-!
-! AUTHOR	
-!  M. Scot Breitenfeld
-!  September 14, 2009
-! 
-! Fortran90 Interface:
-  SUBROUTINE h5oopen_by_addr_f(loc_id, addr, obj_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T)  , INTENT(IN)  :: loc_id
-    INTEGER(HADDR_T), INTENT(IN)  :: addr
-    INTEGER(HID_T)  , INTENT(OUT) :: obj_id
-    INTEGER         , INTENT(OUT) :: hdferr
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5oopen_by_addr_c(loc_id, addr, obj_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5OOPEN_BY_ADDR_C'::h5oopen_by_addr_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         INTEGER(HADDR_T), INTENT(IN) :: addr
-         INTEGER(HID_T), INTENT(OUT) :: obj_id
-       END FUNCTION h5oopen_by_addr_c
-    END INTERFACE
-
-    hdferr = h5oopen_by_addr_c(loc_id, addr, obj_id)
-
-  END SUBROUTINE h5oopen_by_addr_f
-!
-!****s* H5O/h5ocopy_f
-! NAME		
-!  h5ocopy_f 
-!
-! PURPOSE
-!  Copies an object in an HDF5 file.
-!
-! Inputs:  
-!  src_loc_id - Object identifier indicating the location of the source object to be copied.
-!  src_name   - Name of the source object to be copied.
-!  dst_loc_id - Location identifier specifying the destination.
-!  dst_name   - Name to be assigned to the new copy.
-!
-! Optional parameters:
-!  ocpypl_id  - Object copy property list.
-!  lcpl_id    - Link creation property list for the new hard link.
-!
-! Outputs: 
-!  hdferr     - Returns 0 if successful and -1 if fails.
-!
-! AUTHOR	
-!  M. Scot Breitenfeld
-!  March 14, 2012
-! 
-! Fortran90 Interface:
-  SUBROUTINE h5ocopy_f(src_loc_id, src_name, dst_loc_id, dst_name, hdferr, ocpypl_id, lcpl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T)  , INTENT(IN)  :: src_loc_id
-    CHARACTER(LEN=*), INTENT(IN)  :: src_name
-    INTEGER(HID_T)  , INTENT(IN)  :: dst_loc_id
-    CHARACTER(LEN=*), INTENT(IN)  :: dst_name
-    INTEGER         , INTENT(OUT) :: hdferr
-    INTEGER(HID_T)  , INTENT(IN), OPTIONAL :: ocpypl_id
-    INTEGER(HID_T)  , INTENT(IN), OPTIONAL :: lcpl_id
-!*****
-
-    INTEGER(SIZE_T) :: src_name_len, dst_name_len
-    INTEGER(HID_T)  :: ocpypl_id_default, lcpl_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5ocopy_c(src_loc_id, src_name, src_name_len, &
-            dst_loc_id, dst_name, dst_name_len, ocpypl_id_default, lcpl_id_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5OCOPY_C'::h5ocopy_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: src_name, dst_name
-         INTEGER(HID_T)  , INTENT(IN) :: src_loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: src_name
-         INTEGER(HID_T)  , INTENT(IN) :: dst_loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: dst_name
-         INTEGER(HID_T)  , INTENT(IN) :: ocpypl_id_default
-         INTEGER(HID_T)  , INTENT(IN) :: lcpl_id_default
-         INTEGER(SIZE_T)              :: src_name_len, dst_name_len
-
-       END FUNCTION h5ocopy_c
-    END INTERFACE
-
-    src_name_len = LEN(src_name)
-    dst_name_len = LEN(dst_name)
-
-    ocpypl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(ocpypl_id)) ocpypl_id_default = ocpypl_id
-    lcpl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
-
-    hdferr = h5ocopy_c(src_loc_id, src_name, src_name_len, &
-         dst_loc_id, dst_name, dst_name_len, ocpypl_id_default, lcpl_id_default)
-
-  END SUBROUTINE h5ocopy_f
-
-!****s* H5O/h5odecr_refcount_f
-! NAME		
-!  h5odecr_refcount_f
-!
-! PURPOSE
-!  Decrements an object reference count. 
-!
-! Inputs:  
-!  object_id - Object identifier.
-!
-! Outputs: 
-!  hdferr    - Returns 0 if successful and -1 if fails.
-!
-! AUTHOR	
-!  M. Scot Breitenfeld
-!  May 11, 2012
-! 
-! Fortran90 Interface:
-  SUBROUTINE h5odecr_refcount_f(object_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN)  :: object_id
-    INTEGER       , INTENT(OUT) :: hdferr
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5odecr_refcount_c(object_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5ODECR_REFCOUNT_C'::h5odecr_refcount_c
-         !DEC$ENDIF
-         INTEGER(HID_T)  , INTENT(IN) :: object_id
-       END FUNCTION h5odecr_refcount_c
-    END INTERFACE
-
-    hdferr = h5odecr_refcount_c(object_id)  
-
-  END SUBROUTINE h5odecr_refcount_f
-
-!****s* H5O/h5oexists_by_name_f
-! NAME		
-!  h5oexists_by_name_f
-!
-! PURPOSE
-!  Determines whether a link resolves to an actual object.
-!
-! Inputs:
-!  loc_id   - Identifier of the file or group to query. 
-!  name     - The name of the link to check. 
-!    
-!
-! Optional parameters:
-!  lapl_id  - Link access property list identifier.
-!
-! Outputs: 
-!  link_exists - Existing link resolves to an object.
-!  hdferr      - Returns 0 if successful and -1 if fails.
-!
-! AUTHOR	
-!  M. Scot Breitenfeld
-!  May 11, 2012
-! 
-! Fortran90 Interface:
-  SUBROUTINE h5oexists_by_name_f(loc_id, name, link_exists, hdferr, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T)  , INTENT(IN)  :: loc_id
-    CHARACTER(LEN=*), INTENT(IN)  :: name
-    LOGICAL         , INTENT(OUT) :: link_exists
-    INTEGER         , INTENT(OUT) :: hdferr
-    INTEGER(HID_T)  , INTENT(IN), OPTIONAL :: lapl_id
-!*****
-
-    INTEGER(size_t) :: namelen
-    INTEGER :: status
-    INTEGER(HID_T) :: lapl_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5oexists_by_name_c(loc_id, name, namelen, lapl_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5OEXISTS_BY_NAME_C'::h5oexists_by_name_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T)  , INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER(SIZE_T) , INTENT(IN) :: namelen
-         INTEGER(HID_T)  , INTENT(IN) :: lapl_id
-
-       END FUNCTION h5oexists_by_name_c
-    END INTERFACE
-
-    namelen = LEN(name)
-    
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    status = h5oexists_by_name_c(loc_id, name, namelen, lapl_id_default)
-
-    link_exists = .FALSE.
-    IF(status.EQ.1)THEN
-       link_exists = .TRUE.
-    ENDIF
-
-    hdferr = 0
-    IF(status.LT.0)THEN
-       hdferr = -1
-    ENDIF
-
-  END SUBROUTINE h5oexists_by_name_f
-
-!****s* H5O/h5oget_comment_f
-! NAME		
-!  h5oget_comment_f
-!
-! PURPOSE
-!  Retrieves comment for specified object. 
-!
-! Inputs:
-!  obj_id - Identifier for the target object.
-!
-! Optional parameters:
-!  bufsize - Size of the comment buffer.
-!
-! Outputs: 
-!  comment - The comment.
-!  hdferr  - Returns 0 if successful and -1 if fails.
-!
-! AUTHOR	
-!  M. Scot Breitenfeld
-!  May 11, 2012
-! 
-! Fortran90 Interface:
-  SUBROUTINE h5oget_comment_f(obj_id, comment, hdferr, bufsize)
-    IMPLICIT NONE
-    INTEGER(HID_T)   , INTENT(IN)            :: obj_id
-    CHARACTER(LEN=*) , INTENT(OUT)           :: comment
-    INTEGER          , INTENT(OUT)           :: hdferr
-    INTEGER(HSSIZE_T), INTENT(OUT), OPTIONAL :: bufsize 
-!*****
-
-    INTEGER(SIZE_T)   :: commentsize_default
-    INTEGER(HSSIZE_T) :: bufsize_default
-
-    INTERFACE
-       INTEGER FUNCTION h5oget_comment_c(obj_id, comment, commentsize_default, bufsize)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5OGET_COMMENT_C'::h5oget_comment_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: comment
-         INTEGER(HID_T)  , INTENT(IN)  :: obj_id
-         CHARACTER(LEN=*), INTENT(OUT) :: comment
-         INTEGER(SIZE_T) , INTENT(IN)  :: commentsize_default
-         INTEGER(HSSIZE_T) , INTENT(OUT) :: bufsize
-       END FUNCTION h5oget_comment_c
-    END INTERFACE
-
-    commentsize_default = LEN(comment)
-
-    hdferr = h5oget_comment_c(obj_id, comment, commentsize_default, bufsize_default)
-    
-    IF(PRESENT(bufsize)) bufsize = bufsize_default
-
-  END SUBROUTINE h5oget_comment_f
-
-!****s* H5O/h5oget_comment_by_name_f
-! NAME		
-!  h5oget_comment_by_name_f
-!
-! PURPOSE
-!  Retrieves comment for specified object.
-!
-! Inputs:
-!  loc_id   - Identifier of a file, group, dataset, or named datatype.
-!  name     - Name of the object whose comment is to be retrieved, 
-!             specified as a path relative to loc_id. 
-!
-! Optional parameters:
-!  bufsize  - Size of the comment buffer.
-!
-! Outputs: 
-!  comment  - The comment.
-!  hdferr   - Returns 0 if successful and -1 if fails.
-!
-! AUTHOR	
-!  M. Scot Breitenfeld
-!  July 6, 2012
-! 
-! Fortran90 Interface:
-  SUBROUTINE h5oget_comment_by_name_f(loc_id, name, comment, hdferr, bufsize, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T)  , INTENT(IN)            :: loc_id
-    CHARACTER(LEN=*), INTENT(IN)            :: name
-    CHARACTER(LEN=*), INTENT(OUT)           :: comment
-    INTEGER         , INTENT(OUT)           :: hdferr
-    INTEGER(SIZE_T) , INTENT(OUT), OPTIONAL :: bufsize 
-    INTEGER(HID_T)  , INTENT(IN) , OPTIONAL :: lapl_id 
-!*****
-
-    INTEGER(SIZE_T) :: commentsize_default
-    INTEGER(SIZE_T) :: name_size
-    INTEGER(SIZE_T) :: bufsize_default
-    INTEGER(HID_T)  :: lapl_id_default
-    INTERFACE
-       INTEGER FUNCTION h5oget_comment_by_name_c(loc_id, name, name_size, &
-            comment, commentsize_default, bufsize_default, lapl_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5OGET_COMMENT_BY_NAME_C'::h5oget_comment_by_name_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: comment, name
-         INTEGER(HID_T)  , INTENT(IN)  :: loc_id
-         CHARACTER(LEN=*), INTENT(IN)  :: name
-         INTEGER(SIZE_T) , INTENT(IN)  :: name_size
-         CHARACTER(LEN=*), INTENT(OUT) :: comment
-         INTEGER(SIZE_T) , INTENT(IN)  :: commentsize_default
-         INTEGER(SIZE_T) , INTENT(OUT) :: bufsize_default
-         INTEGER(HID_T)  , INTENT(IN)  :: lapl_id
-       END FUNCTION h5oget_comment_by_name_c
-    END INTERFACE
-
-    commentsize_default = LEN(comment)
-    name_size = LEN(name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5oget_comment_by_name_c(loc_id, name, name_size, &
-         comment, commentsize_default, bufsize_default, lapl_id_default)
-    
-    IF(PRESENT(bufsize)) bufsize = bufsize_default
-
-  END SUBROUTINE h5oget_comment_by_name_f
-
-!****s* H5O/h5oincr_refcount_f
-! NAME		
-!  h5oincr_refcount_f
-!
-! PURPOSE
-!  Increments an object reference count.
-!
-! Inputs:  
-!  obj_id  - Object identifier.
-!
-! Outputs: 
-!  hdferr  - Returns 0 if successful and -1 if fails.
-!
-! AUTHOR	
-!  M. Scot Breitenfeld
-!  May 15, 2012
-! 
-! Fortran90 Interface:
-  SUBROUTINE h5oincr_refcount_f(obj_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN)  :: obj_id
-    INTEGER       , INTENT(OUT) :: hdferr
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5oincr_refcount_c(obj_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5OINCR_REFCOUNT_C'::h5oincr_refcount_c
-         !DEC$ENDIF
-         INTEGER(HID_T)  , INTENT(IN) :: obj_id
-       END FUNCTION h5oincr_refcount_c
-    END INTERFACE
-
-    hdferr = h5oincr_refcount_c(obj_id) 
-
-  END SUBROUTINE h5oincr_refcount_f
-
-!****s* H5O/h5oopen_by_idx_f
-!
-! NAME
-!  h5oopen_by_idx_f
-!
-! PURPOSE
-!  Open the nth object in a group. 
-!
-! Inputs:
-!  loc_id      - A file or group identifier.
-!  group_name  - Name of group, relative to loc_id, in which object is located.
-!  index_type  - Type of index by which objects are ordered.
-!  order       - Order of iteration within index, NOTE: zero-based.
-!  n           - Object to open.
-!
-! Outputs:
-!  obj_id      - An object identifier for the opened object.
-!  hdferr      - Returns 0 if successful and -1 if fails.
-!
-! Optional parameters:
-!  lapl_id     - Link access property list.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  May 17, 2012
-!
-! Fortran90 Interface:
-  SUBROUTINE h5oopen_by_idx_f(loc_id, group_name, index_type, order, n, obj_id, &
-       hdferr, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T)  , INTENT(IN)            :: loc_id
-    CHARACTER(LEN=*), INTENT(IN)            :: group_name
-    INTEGER         , INTENT(IN)            :: index_type
-    INTEGER         , INTENT(IN)            :: order
-    INTEGER(HSIZE_T), INTENT(IN)            :: n
-    INTEGER(HID_T)  , INTENT(OUT)           :: obj_id
-    INTEGER         , INTENT(OUT)           :: hdferr
-    INTEGER(HID_T)  , INTENT(IN) , OPTIONAL :: lapl_id
-!*****
-    INTEGER(SIZE_T) :: group_namelen
-    INTEGER(HID_T)  :: lapl_id_default
-    
-    INTERFACE
-       INTEGER FUNCTION h5oopen_by_idx_c(loc_id, group_name, group_namelen, index_type, order, n, obj_id, lapl_id_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5OOPEN_BY_IDX_C'::h5oopen_by_idx_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: group_name
-         INTEGER(HID_T)  , INTENT(IN)  :: loc_id
-         CHARACTER(LEN=*), INTENT(IN)  :: group_name
-         INTEGER(SIZE_T) , INTENT(IN)  :: group_namelen
-         INTEGER         , INTENT(IN)  :: index_type
-         INTEGER         , INTENT(IN)  :: order
-         INTEGER(HSIZE_T), INTENT(IN)  :: n
-         INTEGER(HID_T)  , INTENT(OUT) :: obj_id
-         INTEGER(HID_T)  , INTENT(IN)  :: lapl_id_default
-
-       END FUNCTION h5oopen_by_idx_c
-    END INTERFACE
-
-    group_namelen = LEN(group_name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    hdferr = h5oopen_by_idx_c(loc_id, group_name, group_namelen, index_type, order, n, obj_id, lapl_id_default)
-
-  END SUBROUTINE H5Oopen_by_idx_f
-
-!****s* H5O/h5oset_comment_f
-! NAME		
-!  h5oset_comment_f
-!
-! PURPOSE
-!  Sets comment for specified object.
-!
-! Inputs:  
-!  obj_id    - Identifier of the target object.
-!  comment   - The new comment.
-!
-! Outputs: 
-!  hdferr    - Returns 0 if successful and -1 if fails.
-!
-! AUTHOR	
-!  M. Scot Breitenfeld
-!  May 15, 2012
-! 
-! Fortran90 Interface:
-  SUBROUTINE h5oset_comment_f(obj_id, comment, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T)  , INTENT(IN)  :: obj_id
-    CHARACTER(LEN=*), INTENT(IN)  :: comment
-    INTEGER         , INTENT(OUT) :: hdferr
-!*****
-    INTEGER(SIZE_T) :: commentlen
-
-    INTERFACE
-       INTEGER FUNCTION h5oset_comment_c(obj_id, comment, commentlen)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5OSET_COMMENT_C'::h5oset_comment_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: comment
-         INTEGER(HID_T)  , INTENT(IN) :: obj_id
-         CHARACTER(LEN=*), INTENT(IN) :: comment
-         INTEGER(SIZE_T) , INTENT(IN) :: commentlen
-
-       END FUNCTION h5oset_comment_c
-    END INTERFACE
-
-    commentlen = LEN(comment)
-    
-    hdferr = h5oset_comment_c(obj_id, comment, commentlen)
-
-  END SUBROUTINE h5oset_comment_f
-
-!****s* H5O/h5oset_comment_by_name_f
-! NAME		
-!  h5oset_comment_by_name_f
-!
-! PURPOSE
-!  Sets comment for specified object. 
-!
-! Inputs:  
-!  loc_id   - Identifier of a file, group, dataset, or named datatype.
-!  name     - Name of the object whose comment is to be set or reset, 
-!              specified as a path relative to loc_id. 
-!  comment  - The new comment.
-!
-! Outputs: 
-!  hdferr   - Returns 0 if successful and -1 if fails.
-!
-! Optional parameters:
-!  lapl_id  - Link access property list identifier.
-!
-! AUTHOR	
-!  M. Scot Breitenfeld
-!  May 15, 2012
-! 
-! Fortran90 Interface:
-  SUBROUTINE h5oset_comment_by_name_f(loc_id, name, comment, hdferr, lapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T)  , INTENT(IN)  :: loc_id
-    CHARACTER(LEN=*), INTENT(IN)  :: name
-    CHARACTER(LEN=*), INTENT(IN)  :: comment
-    INTEGER         , INTENT(OUT) :: hdferr
-    INTEGER(HID_T)  , INTENT(IN), OPTIONAL :: lapl_id
-!*****
-    INTEGER(SIZE_T) :: commentlen
-    INTEGER(SIZE_T) :: namelen
-    INTEGER(HID_T) :: lapl_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5oset_comment_by_name_c(loc_id, name, namelen, comment, commentlen, lapl_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5OSET_COMMENT_BY_NAME_C'::h5oset_comment_by_name_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name, comment
-         INTEGER(HID_T)  , INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: comment
-         INTEGER(SIZE_T) , INTENT(IN) :: commentlen
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER(SIZE_T) , INTENT(IN) :: namelen
-         INTEGER(HID_T)  , INTENT(IN) :: lapl_id
-       END FUNCTION h5oset_comment_by_name_c
-    END INTERFACE
-
-    commentlen = LEN(comment)
-    namelen = LEN(name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-    
-    hdferr = h5oset_comment_by_name_c(loc_id, name, namelen, comment, commentlen, lapl_id_default)
-
-  END SUBROUTINE h5oset_comment_by_name_f
-
-END MODULE H5O
-
diff --git a/fortran/src/H5Off_F03.f90 b/fortran/src/H5Off_F03.f90
deleted file mode 100644
index 36b6246..0000000
--- a/fortran/src/H5Off_F03.f90
+++ /dev/null
@@ -1,435 +0,0 @@
-!****h* ROBODoc/H5O (F03)
-!
-! NAME
-!  H5O_PROVISIONAL
-!
-! PURPOSE
-!  This file contains Fortran 90 and Fortran 2003 interfaces for H5O functions.
-!  It contains the same functions as H5Off_F90.f90 but includes the
-!  Fortran 2003 functions and the interface listings. This file will be compiled
-!  instead of H5Off_F90.f90 if Fortran 2003 functions are enabled.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5P function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5O_PROVISIONAL
-
-  USE H5GLOBAL
-  USE, INTRINSIC :: ISO_C_BINDING
-
-  IMPLICIT NONE
-
-!****t* H5T (F03)/h5o_info_t
-!
-! Fortran2003 Derived Type:
-!
-  TYPE, BIND(C) :: space_t
-     INTEGER(hsize_t) :: total ! Total space for storing object header in file
-     INTEGER(hsize_t) :: meta  ! Space within header for object header metadata information
-     INTEGER(hsize_t) :: mesg  ! Space within header for actual message information
-     INTEGER(hsize_t) :: free  ! Free space within object header
-  END TYPE space_t
-
-  TYPE, BIND(C) :: mesg_t
-     INTEGER(c_int64_t) :: present ! Flags to indicate presence of message type in header 
-     INTEGER(c_int64_t) :: shared  ! Flags to indicate message type is shared in header
-  END TYPE mesg_t
-  
-  TYPE, BIND(C) :: hdr_t
-     INTEGER :: version ! Version number of header format in file
-     INTEGER :: nmesgs  ! Number of object header messages
-     INTEGER :: nchunks ! Number of object header chunks
-     INTEGER :: flags   ! Object header status flags
-     TYPE(space_t)  :: space   
-     TYPE(mesg_t)   :: mesg
-  END TYPE hdr_t
-
-  ! Extra metadata storage for obj & attributes
-  TYPE, BIND(C) :: H5_ih_info_t
-     INTEGER(hsize_t) :: index_size ! btree and/or list
-     INTEGER(hsize_t) :: heap_size
-  END TYPE H5_ih_info_t
-
-  TYPE, BIND(C) :: meta_size_t
-     TYPE(H5_ih_info_t) :: obj  ! v1/v2 B-tree & local/fractal heap for groups, B-tree for chunked datasets
-     TYPE(H5_ih_info_t) :: attr ! v2 B-tree & heap for attributes
-  ENDTYPE meta_size_t
-  
-  TYPE, BIND(C) :: h5o_info_t
-     INTEGER(C_LONG)  :: fileno     ! File number that object is located in
-     INTEGER(haddr_t) :: addr       ! Object address in file  
-     INTEGER(C_INT)   :: type       ! Basic object type (group, dataset, etc.) 
-     INTEGER          :: rc         ! Reference count of object
-
-     INTEGER, DIMENSION(8) :: atime ! Access time         !    -- NOTE --
-     INTEGER, DIMENSION(8) :: mtime ! Modification time   ! Returns an integer array    
-     INTEGER, DIMENSION(8) :: ctime ! Change time         ! as specified in the Fortran 
-     INTEGER, DIMENSION(8) :: btime ! Birth time          ! intrinsic DATE_AND_TIME(VALUES)
-
-     INTEGER(hsize_t) :: num_attrs  ! # of attributes attached to object
-
-     TYPE(hdr_t) :: hdr
-
-     TYPE(meta_size_t) :: meta_size
-  END TYPE h5o_info_t
-
-!*****
-
-CONTAINS
-
-!****s* H5O (F03)/h5ovisit_f_F03
-!
-! NAME
-!  h5ovisit_f
-!
-! PURPOSE
-!  Recursively visits all objects starting from a specified object.
-!
-! Inputs:
-!  object_id  - Identifier of the object at which the recursive iteration begins.
-!  index_type - Type of index; valid values include:
-!                H5_INDEX_NAME_F
-!                H5_INDEX_CRT_ORDER_F
-!  order      - Order in which index is traversed; valid values include:
-!                H5_ITER_DEC_F
-!                H5_ITER_INC_F
-!                H5_ITER_NATIVE_F
-!  op 	      - Callback function passing data regarding the group to the calling application
-!  op_data    - User-defined pointer to data required by the application for its processing of the group
-!
-! Outputs:
-!  return_value - returns the return value of the first operator that returns a positive value, or 
-!                 zero if all members were processed with no operator returning non-zero.
-!  hdferr       - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  M. Scot Breitenfeld
-!  November 19, 2008
-!
-! Fortran2003 Interface:
-  SUBROUTINE h5ovisit_f(object_id, index_type, order, op, op_data, return_value, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: object_id
-    INTEGER, INTENT(IN) :: index_type 
-    INTEGER, INTENT(IN) :: order
-
-    TYPE(C_FUNPTR):: op
-    TYPE(C_PTR)   :: op_data
-    INTEGER, INTENT(OUT) :: return_value
-    INTEGER, INTENT(OUT) :: hdferr
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5ovisit_c(object_id, index_type, order, op, op_data) &
-            BIND(C, NAME='h5ovisit_c')
-         USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr, c_funptr
-         USE H5GLOBAL
-         INTEGER(HID_T), INTENT(IN) :: object_id
-         INTEGER, INTENT(IN) :: index_type
-         INTEGER, INTENT(IN) :: order
-         TYPE(C_FUNPTR), VALUE :: op
-         TYPE(C_PTR), VALUE :: op_data
-       END FUNCTION h5ovisit_c
-    END INTERFACE
-
-    return_value = h5ovisit_c(object_id, index_type, order, op, op_data)
-
-    IF(return_value.GE.0)THEN
-       hdferr = 0
-    ELSE
-       hdferr = -1
-    END IF
-
-  END SUBROUTINE h5ovisit_f
-
-!****s* H5O (F03)/h5oget_info_by_name_f_F03
-!
-! NAME
-!  h5oget_info_by_name_f
-!
-! PURPOSE
-!  Retrieves the metadata for an object, identifying the object by location and relative name.
-!
-! Inputs:
-!  loc_id      - File or group identifier specifying location of group 
-!                in which object is located.
-!  name        - Name of group, relative to loc_id.
-!
-! Outputs:  
-!  object_info - Buffer in which to return object information.
-!  hdferr      - Returns 0 if successful and -1 if fails.
-!
-! Optional parameters:
-!  lapl_id     - Link access property list.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  December 1, 2008
-!
-! Fortran2003 Interface:
-  SUBROUTINE h5oget_info_by_name_f(loc_id, name, object_info, hdferr, lapl_id)
-
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T)  , INTENT(IN)            :: loc_id
-    CHARACTER(LEN=*), INTENT(IN)            :: name
-    TYPE(h5o_info_t), INTENT(OUT), TARGET   :: object_info
-    INTEGER         , INTENT(OUT)           :: hdferr
-    INTEGER(HID_T)  , INTENT(IN) , OPTIONAL :: lapl_id
-!*****
-    INTEGER(SIZE_T) :: namelen
-    INTEGER(HID_T)  :: lapl_id_default
-    TYPE(C_PTR)     :: ptr
-    
-    INTERFACE
-       INTEGER FUNCTION h5oget_info_by_name_c(loc_id, name, namelen, lapl_id_default, object_info) &
-            BIND(C, NAME='h5oget_info_by_name_c')
-         USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_char, c_ptr
-         USE H5GLOBAL
-         INTEGER(HID_T)  , INTENT(IN)  :: loc_id
-         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
-         INTEGER(SIZE_T) , INTENT(IN)  :: namelen
-         INTEGER(HID_T)  , INTENT(IN)  :: lapl_id_default
-         TYPE(C_PTR),VALUE             :: object_info
-
-       END FUNCTION h5oget_info_by_name_c
-    END INTERFACE
-
-    namelen = LEN(name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    ptr = C_LOC(object_info)
-
-    hdferr = H5Oget_info_by_name_c(loc_id, name, namelen, lapl_id_default, ptr)
-
-  END SUBROUTINE H5Oget_info_by_name_f
-
-!****s* H5O (F03)/h5oget_info_f_F03
-!
-! NAME
-!  h5oget_info_f
-!
-! PURPOSE
-!  Retrieves the metadata for an object specified by an identifier.
-!
-! Inputs:
-!  object_id   - Identifier for target object.
-!
-! Outputs:
-!  object_info - Buffer in which to return object information.
-!  hdferr      - Returns 0 if successful and -1 if fails.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  May 11, 2012
-!
-! Fortran2003 Interface:
-  SUBROUTINE h5oget_info_f(object_id, object_info, hdferr)
-
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T)  , INTENT(IN)            :: object_id
-    TYPE(h5o_info_t), INTENT(OUT), TARGET   :: object_info
-    INTEGER         , INTENT(OUT)           :: hdferr
-!*****
-    TYPE(C_PTR) :: ptr
-    
-    INTERFACE
-       INTEGER FUNCTION h5oget_info_c(object_id, object_info) &
-            BIND(C, NAME='h5oget_info_c')
-         USE H5GLOBAL
-         USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
-         INTEGER(HID_T), INTENT(IN)  :: object_id
-         TYPE(C_PTR), VALUE          :: object_info
-       END FUNCTION h5oget_info_c
-    END INTERFACE
-
-    ptr = C_LOC(object_info)
-    hdferr = H5Oget_info_c(object_id, ptr)
-
-  END SUBROUTINE H5Oget_info_f
-
-!****s* H5O (F03)/h5oget_info_by_idx_f_F03
-!
-! NAME
-!  h5oget_info_by_idx_f
-!
-! PURPOSE
-!  Retrieves the metadata for an object, identifying the object by an index position.
-!
-! Inputs:
-!  loc_id      - File or group identifier specifying location of group 
-!                in which object is located.
-!  group_name  - Name of group in which object is located.
-!  index_field - Index or field that determines the order.
-!  order       - Order within field or index.
-!  n           - Object for which information is to be returned
-!
-! Outputs:  
-!  object_info - Buffer in which to return object information.
-!  hdferr      - Returns 0 if successful and -1 if fails.
-!
-! Optional parameters:
-!  lapl_id     - Link access property list. (Not currently used.)
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  May 11, 2012
-!
-! Fortran2003 Interface:
-  SUBROUTINE h5oget_info_by_idx_f(loc_id, group_name, index_field, order, n, &
-       object_info, hdferr, lapl_id)
-
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T)  , INTENT(IN)            :: loc_id
-    CHARACTER(LEN=*), INTENT(IN)            :: group_name
-    INTEGER         , INTENT(IN)            :: index_field
-    INTEGER         , INTENT(IN)            :: order
-    INTEGER(HSIZE_T), INTENT(IN)            :: n
-    TYPE(h5o_info_t), INTENT(OUT), TARGET   :: object_info
-    INTEGER         , INTENT(OUT)           :: hdferr
-    INTEGER(HID_T)  , INTENT(IN) , OPTIONAL :: lapl_id
-!*****
-    INTEGER(SIZE_T) :: namelen
-    INTEGER(HID_T)  :: lapl_id_default
-    TYPE(C_PTR)     :: ptr
-    
-    INTERFACE
-       INTEGER FUNCTION h5oget_info_by_idx_c(loc_id, group_name, namelen, &
-            index_field, order, n, lapl_id_default, object_info) BIND(C, NAME='h5oget_info_by_idx_c')
-         USE H5GLOBAL
-         USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_char, c_ptr, c_funptr
-         INTEGER(HID_T)  , INTENT(IN)  :: loc_id
-         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: group_name
-         INTEGER(SIZE_T) , INTENT(IN)  :: namelen
-         INTEGER         , INTENT(IN)  :: index_field
-         INTEGER         , INTENT(IN)  :: order
-         INTEGER(HSIZE_T), INTENT(IN)  :: n
-         INTEGER(HID_T)  , INTENT(IN)  :: lapl_id_default
-         TYPE(C_PTR), VALUE            :: object_info
-
-       END FUNCTION h5oget_info_by_idx_c
-    END INTERFACE
-
-    namelen = LEN(group_name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    ptr = C_LOC(object_info)
-    hdferr = H5Oget_info_by_idx_c(loc_id, group_name, namelen, index_field, order, n, lapl_id_default, ptr)
-
-  END SUBROUTINE H5Oget_info_by_idx_f
-
-
-!****s* H5O (F03)/h5ovisit_by_name_f_F03
-!
-! NAME
-!  h5ovisit_by_name_f
-!
-! PURPOSE
-!  Recursively visits all objects starting from a specified object.
-!
-! Inputs:
-!  loc_id      - Identifier of a file or group.
-!  object_name - Name of the object, generally relative to loc_id, that will serve as root of the iteration 
-!  index_type  - Type of index; valid values include:
-!                 H5_INDEX_NAME_F
-!                 H5_INDEX_CRT_ORDER_F
-!  order       - Order in which index is traversed; valid values include:
-!                 H5_ITER_DEC_F
-!                 H5_ITER_INC_F
-!                 H5_ITER_NATIVE_F
-!  op 	       - Callback function passing data regarding the group to the calling application
-!  op_data     - User-defined pointer to data required by the application for its processing of the group
-!
-! Outputs:
-!  return_value - Returns the return value of the first operator that returns a positive value, or 
-!                 zero if all members were processed with no operator returning non-zero.
-!  hdferr       - Returns 0 if successful and -1 if fails
-!
-! Optional parameters:
-!  lapl_id      - Link access property list identifier.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  November 19, 2008
-!
-! Fortran2003 Interface:
-  SUBROUTINE h5ovisit_by_name_f(loc_id, object_name, index_type, order, op, op_data, &
-       return_value, hdferr, lapl_id)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T)  , INTENT(IN)             :: loc_id
-    CHARACTER(LEN=*), INTENT(IN)             :: object_name
-    INTEGER         , INTENT(IN)             :: index_type 
-    INTEGER         , INTENT(IN)             :: order
-
-    TYPE(C_FUNPTR)                           :: op
-    TYPE(C_PTR)                              :: op_data
-    INTEGER         , INTENT(OUT)            :: return_value
-    INTEGER         , INTENT(OUT)            :: hdferr
-    INTEGER(HID_T)  , INTENT(IN) , OPTIONAL  :: lapl_id
-!*****
-
-    INTEGER(SIZE_T) :: namelen
-    INTEGER(HID_T)  :: lapl_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5ovisit_by_name_c(loc_id, object_name, namelen, index_type, order, &
-            op, op_data, lapl_id) BIND(C, NAME='h5ovisit_by_name_c')
-         USE, INTRINSIC :: ISO_C_BINDING
-         USE H5GLOBAL
-         INTEGER(HID_T)  , INTENT(IN) :: loc_id
-         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: object_name
-         INTEGER(SIZE_T)              :: namelen
-         INTEGER         , INTENT(IN) :: index_type
-         INTEGER         , INTENT(IN) :: order
-         TYPE(C_FUNPTR)  , VALUE      :: op
-         TYPE(C_PTR)     , VALUE      :: op_data
-         INTEGER(HID_T)  , INTENT(IN) :: lapl_id
-       END FUNCTION h5ovisit_by_name_c
-    END INTERFACE
-
-    namelen = LEN(object_name)
-
-    lapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(lapl_id)) lapl_id_default = lapl_id
-
-    return_value = h5ovisit_by_name_c(loc_id, object_name, namelen, index_type, order, &
-         op, op_data, lapl_id_default)
-
-    IF(return_value.GE.0)THEN
-       hdferr = 0
-    ELSE
-       hdferr = -1
-    END IF
-
-  END SUBROUTINE h5ovisit_by_name_f
-
-END MODULE H5O_PROVISIONAL
-
diff --git a/fortran/src/H5Off_F90.f90 b/fortran/src/H5Off_F90.f90
deleted file mode 100644
index 5688c5d..0000000
--- a/fortran/src/H5Off_F90.f90
+++ /dev/null
@@ -1,39 +0,0 @@
-!****h* ROBODoc/H5O (F90)
-!
-! NAME
-!  MODULE H5O_PROVISIONAL
-!
-! PURPOSE
-!  This file contains Fortran 90 interfaces for H5O functions. It contains
-!  the same functions as H5Off_F03.f90 but excludes the Fortran 2003 functions
-!  and the interface listings. This file will be compiled instead of H5Off_F03.f90
-!  if Fortran 2003 functions are not enabled.
-!
-! NOTE
-!  Currently contains no functions.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!                         *** IMPORTANT ***
-!  If you add a new H5D function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!*****
-
-MODULE H5O_PROVISIONAL
-
-END MODULE H5O_PROVISIONAL
diff --git a/fortran/src/H5Pf.c b/fortran/src/H5Pf.c
index fe2f21a..523ed0b 100644
--- a/fortran/src/H5Pf.c
+++ b/fortran/src/H5Pf.c
@@ -1,6 +1,6 @@
 /****h* H5Pf/H5Pf
  * PURPOSE
- *   This file contains C stubs for H5P Fortran APIs
+ *  This file contains C stubs for H5P Fortran APIs
  *
  * COPYRIGHT
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -23,18 +23,35 @@
 
 #include "H5f90.h"
 #include "H5Eprivate.h"
+#include "H5public.h"
+
+#ifdef H5_HAVE_PARALLEL
+
+#include <mpi.h>
+/* Support for C to Fortran translation in MPI */
+#ifndef H5_HAVE_MPI_MULTI_LANG_Comm
+#define MPI_Comm_c2f(comm) (int_f)(comm)
+#define MPI_Comm_f2c(comm) (MPI_Comm)(comm)
+#endif /*MPI Comm*/
+
+#ifndef H5_HAVE_MPI_MULTI_LANG_Info
+#define MPI_Info_c2f(info) (int_f)(info)
+#define MPI_Info_f2c(info) (MPI_Info)(info)
+#endif /*MPI Info*/
+
+#endif /*H5_HAVE_PARALLEL*/
 
 /****if* H5Pf/h5pcreate_c
  * NAME
- *        h5pcreate_c
+ *  h5pcreate_c
  * PURPOSE
- *     Call H5Pcreate to create a property list
+ *  Call H5Pcreate to create a property list
  * INPUTS
- *      cls - property list class identifier
+ *  cls - property list class identifier
  * OUTPUTS
- *     prp_id - identifier of the created property list
+ *  prp_id - identifier of the created property list
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
  *  Wednesday, October 9, 2002
@@ -43,7 +60,7 @@
 */
 
 int_f
-nh5pcreate_c ( hid_t_f *cls, hid_t_f *prp_id )
+h5pcreate_c ( hid_t_f *cls, hid_t_f *prp_id )
 /******/
 {
     hid_t c_prp_id;
@@ -61,22 +78,22 @@ done:
 
 /****if* H5Pf/h5pclose_c
  * NAME
- *        h5pclose_c
+ *  h5pclose_c
  * PURPOSE
- *     Call H5Pclose to close property lis
+ *  Call H5Pclose to close property lis
  * INPUTS
- *      prp_id - identifier of the property list to be closed
+ *  prp_id - identifier of the property list to be closed
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Saturday, August 14, 1999
+ *  Saturday, August 14, 1999
  *
  * SOURCE
 */
 
 int_f
-nh5pclose_c ( hid_t_f *prp_id )
+h5pclose_c ( hid_t_f *prp_id )
 /******/
 {
     int_f ret_value = 0;
@@ -90,23 +107,23 @@ nh5pclose_c ( hid_t_f *prp_id )
 
 /****if* H5Pf/h5pcopy_c
  * NAME
- *        h5pcopy_c
+ *  h5pcopy_c
  * PURPOSE
- *     Call H5Pcopy to copy property list
+ *  Call H5Pcopy to copy property list
  * INPUTS
- *      prp_id - identifier of the property list to be copied
+ *  prp_id - identifier of the property list to be copied
  * OUTPUTS
- *     new_prp_id - identifier of the new property list
+ *  new_prp_id - identifier of the new property list
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Saturday, August 14, 1999
+ *  Saturday, August 14, 1999
  *
  * SOURCE
 */
 int_f
-nh5pcopy_c ( hid_t_f *prp_id , hid_t_f *new_prp_id)
+h5pcopy_c ( hid_t_f *prp_id , hid_t_f *new_prp_id)
 /******/
 {
     hid_t c_new_prp_id;
@@ -124,24 +141,24 @@ done:
 
 /****if* H5Pf/h5pequal_c
  * NAME
- *        h5pequal_c
+ *  h5pequal_c
  * PURPOSE
- *     Call H5Pequal to check if two property lists are equal
+ *  Call H5Pequal to check if two property lists are equal
  * INPUTS
- *      plist1_id - property list identifier
- *              plist2_id - property list identifier
+ *  plist1_id - property list identifier
+ *  plist2_id - property list identifier
  * OUTPUTS
- *     c_flag    - flag to indicate that lists are eqaul
+ *  c_flag    - flag to indicate that lists are eqaul
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, September 30, 2002
+ *  Monday, September 30, 2002
  *
  * SOURCE
 */
 int_f
-nh5pequal_c ( hid_t_f *plist1_id , hid_t_f *plist2_id, int_f * c_flag)
+h5pequal_c ( hid_t_f *plist1_id , hid_t_f *plist2_id, int_f * c_flag)
 /******/
 {
     htri_t c_c_flag;
@@ -176,7 +193,7 @@ done:
 */
 
 int_f
-nh5pget_class_c ( hid_t_f *prp_id , hid_t_f *classtype)
+h5pget_class_c ( hid_t_f *prp_id , hid_t_f *classtype)
 /******/
 {
     hid_t c_classtype;
@@ -193,15 +210,15 @@ done:
 
 /****if* H5Pf/h5pset_preserve_c
  * NAME
- *        h5pset_preserve_c
+ *  h5pset_preserve_c
  * PURPOSE
- *     Call H5Pset_preserve to set  transfer property for compound
- *              datatype
+ *  Call H5Pset_preserve to set  transfer property for compound
+ *  datatype
  * INPUTS
- *      prp_id - property list identifier
- *              flag - TRUE/FALSE flag
+ *  prp_id - property list identifier
+ *  flag - TRUE/FALSE flag
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
  *  Thursday, February 17, 2000
@@ -209,7 +226,7 @@ done:
 */
 
 int_f
-nh5pset_preserve_c ( hid_t_f *prp_id , int_f *flag)
+h5pset_preserve_c ( hid_t_f *prp_id , int_f *flag)
 /******/
 {
   int ret_value = 0;
@@ -227,16 +244,16 @@ nh5pset_preserve_c ( hid_t_f *prp_id , int_f *flag)
 
 /****if* H5Pf/h5pget_preserve_c
  * NAME
- *        h5pget_preserve_c
+ *  h5pget_preserve_c
  * PURPOSE
- *     Call H5Pget_preserve to set  transfer property for compound
- *              datatype
+ *  Call H5Pget_preserve to set  transfer property for compound
+ *  datatype
  * INPUTS
- *      prp_id - property list identifier
+ *  prp_id - property list identifier
  * OUTPUTS
- *     flag - TRUE/FALSE flag
+ *  flag - TRUE/FALSE flag
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
  *  Thursday, February 17, 2000
@@ -244,7 +261,7 @@ nh5pset_preserve_c ( hid_t_f *prp_id , int_f *flag)
 */
 
 int_f
-nh5pget_preserve_c ( hid_t_f *prp_id , int_f *flag)
+h5pget_preserve_c ( hid_t_f *prp_id , int_f *flag)
 /******/
 {
   int ret_value = 0;
@@ -260,22 +277,22 @@ nh5pget_preserve_c ( hid_t_f *prp_id , int_f *flag)
 
 /****if* H5Pf/h5pset_deflate_c
  * NAME
- *        h5pset_deflate_c
+ *  h5pset_deflate_c
  * PURPOSE
- *     Call H5Pset_deflate to set deflate level
+ *  Call H5Pset_deflate to set deflate level
  * INPUTS
- *      prp_id - property list identifier
- *              level - level of deflation
+ *  prp_id - property list identifier
+ *  level - level of deflation
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Saturday, August 14, 1999
+ *  Saturday, August 14, 1999
  * SOURCE
 */
 
 int_f
-nh5pset_deflate_c ( hid_t_f *prp_id , int_f *level)
+h5pset_deflate_c ( hid_t_f *prp_id , int_f *level)
 /******/
 {
   int ret_value = 0;
@@ -294,24 +311,24 @@ nh5pset_deflate_c ( hid_t_f *prp_id , int_f *level)
 
 /****if* H5Pf/h5pset_chunk_c
  * NAME
- *        h5pset_chunk_c
+ *  h5pset_chunk_c
  * PURPOSE
- *     Call H5Pset_chunk to set the sizes of chunks for a chunked
- *              layout dataset
+ *  Call H5Pset_chunk to set the sizes of chunks for a chunked
+ *  layout dataset
  * INPUTS
- *      prp_id - property list identifier
- *              rank - number of dimensions of each chunk
- *              dims - array of the size of each chunk
+ *  prp_id - property list identifier
+ *  rank - number of dimensions of each chunk
+ *  dims - array of the size of each chunk
  * RETURNS
- *     0 on success, -1 on failure
- *              Saturday, August 14, 1999
+ *  0 on success, -1 on failure
+ *  Saturday, August 14, 1999
  * AUTHOR
  *  Elena Pourmal
  * SOURCE
 */
 
 int_f
-nh5pset_chunk_c ( hid_t_f *prp_id, int_f *rank, hsize_t_f *dims )
+h5pset_chunk_c ( hid_t_f *prp_id, int_f *rank, hsize_t_f *dims )
 /******/
 {
   int ret_value = -1;
@@ -338,24 +355,24 @@ DONE:
 
 /****if* H5Pf/h5pget_chunk_c
  * NAME
- *        h5pget_chunk_c
+ *  h5pget_chunk_c
  * PURPOSE
- *     Call H5Pget_chunk to get the sizes of chunks for a chunked
- *              layout dataset  for at list max_rank number of dimensions
+ *  Call H5Pget_chunk to get the sizes of chunks for a chunked
+ *  layout dataset  for at list max_rank number of dimensions
  * INPUTS
- *      prp_id - property list identifier
- *              max rank - maximum number of dimensions to return
- *              dims - array of the size of each chunk
+ *  prp_id - property list identifier
+ *  max rank - maximum number of dimensions to return
+ *  dims - array of the size of each chunk
  * RETURNS
- *     number of chunk's dimnesion on success, -1 on failure
- *              Saturday, August 14, 1999
+ *  number of chunk's dimnesion on success, -1 on failure
+ *  Saturday, August 14, 1999
  * AUTHOR
  *  Elena Pourmal
  * SOURCE
 */
 
 int_f
-nh5pget_chunk_c ( hid_t_f *prp_id, int_f *max_rank, hsize_t_f *dims )
+h5pget_chunk_c ( hid_t_f *prp_id, int_f *max_rank, hsize_t_f *dims )
 /******/
 {
   int ret_value = -1;
@@ -377,36 +394,6 @@ nh5pget_chunk_c ( hid_t_f *prp_id, int_f *max_rank, hsize_t_f *dims )
   return ret_value;
 }
 
-/****if* H5Pf/h5pset_fill_valuec_c
- * NAME
- *  h5pset_fill_valuec_c
- * PURPOSE
- *  Call h5pset_fill_value_c to a character fill value
- * INPUTS
- *  prp_id - property list identifier
- *  type_id - datatype identifier (fill value is of type type_id)
- *  fillvalue  - character value
- * RETURNS
- *  0 on success, -1 on failure
- *  Saturday, August 14, 1999
- * AUTHOR
- *  Elena Pourmal
- * SOURCE
-*/
-int_f
-nh5pset_fill_valuec_c (hid_t_f *prp_id, hid_t_f *type_id, _fcd fillvalue)
-/******/
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5pset_fill_value_c  function.
-      */
-     ret_value = h5pset_fill_value_c(prp_id, type_id, _fcdtocp(fillvalue));
-
-     return ret_value;
-}
-
 /****if* H5Pf/h5pset_fill_value_c
  * NAME
  *  h5pset_fill_value_c
@@ -444,68 +431,6 @@ h5pset_fill_value_c (hid_t_f *prp_id, hid_t_f *type_id, void *fillvalue)
      return ret_value;
 }
 
-int_f
-nh5pset_fill_value_integer_c (hid_t_f *prp_id, hid_t_f *type_id, void *fillvalue)
-/******/
-{
-     /*
-      * Call h5pset_fill_value_c  function.
-      */
-     return h5pset_fill_value_c(prp_id, type_id, fillvalue);
-}
-
-int_f
-nh5pset_fill_value_real_c (hid_t_f *prp_id, hid_t_f *type_id, void *fillvalue)
-{
-     /*
-      * Call h5pset_fill_value_c  function.
-      */
-     return h5pset_fill_value_c(prp_id, type_id, fillvalue);
-}
-
-int_f
-nh5pset_fill_value_double_c (hid_t_f *prp_id, hid_t_f *type_id, void *fillvalue)
-{
-     /*
-      * Call h5pset_fill_value_c  function.
-      */
-     return h5pset_fill_value_c(prp_id, type_id, fillvalue);
-}
-
-/****if* H5Pf/h5pget_fill_valuec_c
- * NAME
- *  h5pget_fill_valuec_c
- * PURPOSE
- *  Call h5pget_fill_value_c to a character fill value
- * INPUTS
- *  prp_id     - property list identifier
- *  type_id    - datatype identifier (fill value is of type type_id)
- *  fillvalue - character value
- * RETURNS
- *  0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *  Saturday, August 14, 1999
- * HISTORY
- *  Fixed wrong call to C wrapper, was nh5pset_fill_value_c, changed
- *  to nh5pget_fill_value_c. MSB - 7/21/2014
- *
- * SOURCE
-*/
-int_f
-nh5pget_fill_valuec_c (hid_t_f *prp_id, hid_t_f *type_id, _fcd fillvalue)
-/******/
-{
-     int ret_value = -1;
-
-     /*
-      * Call h5pget_fill_value_c function.
-      */
-     ret_value = h5pget_fill_value_c(prp_id, type_id, _fcdtocp(fillvalue));
-
-     return ret_value;
-}
-
 /****if* H5Pf/h5pget_fill_value_c
  * NAME
  *  h5pget_fill_value_c
@@ -543,57 +468,30 @@ h5pget_fill_value_c (hid_t_f *prp_id, hid_t_f *type_id, void *fillvalue)
      return ret_value;
 }
 
-int_f
-nh5pget_fill_value_integer_c (hid_t_f *prp_id, hid_t_f *type_id, void *fillvalue)
-{
-     /*
-      * Call h5pget_fill_value_c  function.
-      */
-     return h5pget_fill_value_c(prp_id, type_id, fillvalue);
-}
-
-int_f
-nh5pget_fill_value_real_c (hid_t_f *prp_id, hid_t_f *type_id, void *fillvalue)
-{
-     /*
-      * Call h5pget_fill_value_c  function.
-      */
-     return h5pget_fill_value_c(prp_id, type_id, fillvalue);
-}
-
-int_f
-nh5pget_fill_value_double_c (hid_t_f *prp_id, hid_t_f *type_id, void *fillvalue)
-{
-     /*
-      * Call h5pget_fill_value_c  function.
-      */
-     return h5pget_fill_value_c(prp_id, type_id, fillvalue);
-}
-
 /****if* H5Pf/h5pget_version_c
  * NAME
- *        h5pget_version_c
+ *  h5pget_version_c
  * PURPOSE
- *     Call H5Pget_version to get the version information
- *              of various objects for a file creation property list
+ *  Call H5Pget_version to get the version information
+ *  of various objects for a file creation property list
  * INPUTS
- *      prp_id - property list identifier
+ *  prp_id - property list identifier
  * OUTPUTS
- *     boot - array to put boot block version number
- *              freelist - array to put global freelist version number
- *              stab - array to put symbol table version number
- *              shhdr - array to put shared object header version number
+ *  boot - array to put boot block version number
+ *  freelist - array to put global freelist version number
+ *  stab - array to put symbol table version number
+ *  shhdr - array to put shared object header version number
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Wednesday, February 23, 2000
+ *  Wednesday, February 23, 2000
  * HISTORY
- * Removed extra length parameters EP 7/6/00
+ *  Removed extra length parameters EP 7/6/00
  * SOURCE
 */
 int_f
-nh5pget_version_c (hid_t_f *prp_id, int_f * boot,int_f * freelist, int_f * stab, int_f *shhdr)
+h5pget_version_c (hid_t_f *prp_id, int_f * boot,int_f * freelist, int_f * stab, int_f *shhdr)
 /******/
 {
      int ret_value = -1;
@@ -630,22 +528,22 @@ nh5pget_version_c (hid_t_f *prp_id, int_f * boot,int_f * freelist, int_f * stab,
 
 /****if* H5Pf/h5pget_userblock_c
  * NAME
- *        h5pget_userblock_c
+ *  h5pget_userblock_c
  * PURPOSE
- *     Call H5Pget_userblock to get the size of a user block in
- *              a file creation property list
+ *  Call H5Pget_userblock to get the size of a user block in
+ *  a file creation property list
  * INPUTS
- *      prp_id - property list identifier
- * Outputs      size - Size of the user-block in bytes
+ *  prp_id - property list identifier
+ *  Outputs      size - Size of the user-block in bytes
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Wednesday, February 23, 2000
+ *  Wednesday, February 23, 2000
  * SOURCE
 */
 int_f
-nh5pget_userblock_c (hid_t_f *prp_id, hsize_t_f * size)
+h5pget_userblock_c (hid_t_f *prp_id, hsize_t_f * size)
 /******/
 {
      int ret_value = -1;
@@ -668,22 +566,22 @@ nh5pget_userblock_c (hid_t_f *prp_id, hsize_t_f * size)
 
 /****if* H5Pf/h5pset_userblock_c
  * NAME
- *        h5pset_userblock_c
+ *  h5pset_userblock_c
  * PURPOSE
- *     Call H5Pset_userblock to set the size of a user block in
- *              a file creation property list
+ *  Call H5Pset_userblock to set the size of a user block in
+ *  a file creation property list
  * INPUTS
- *      prp_id - property list identifier
- *              size - Size of the user-block in bytes
+ *  prp_id - property list identifier
+ *  size - Size of the user-block in bytes
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Wednesday, February 23, 2000
+ *  Wednesday, February 23, 2000
  * SOURCE
 */
 int_f
-nh5pset_userblock_c (hid_t_f *prp_id, hsize_t_f * size)
+h5pset_userblock_c (hid_t_f *prp_id, hsize_t_f * size)
 /******/
 {
      int ret_value = -1;
@@ -705,25 +603,25 @@ nh5pset_userblock_c (hid_t_f *prp_id, hsize_t_f * size)
 
 /****if* H5Pf/h5pget_sizes_c
  * NAME
- *        h5pget_sizes_c
+ *  h5pget_sizes_c
  * PURPOSE
- *     Call H5Pget_sizes to get the size of the offsets
- *              and lengths used in an HDF5 file
+ *  Call H5Pget_sizes to get the size of the offsets
+ *  and lengths used in an HDF5 file
  * INPUTS
- *      prp_id - property list identifier
- * Outputs      sizeof_addr - Size of an object offset in bytes
- *              sizeof_size - Size of an object length in bytes
+ *  prp_id - property list identifier
+ *  Outputs      sizeof_addr - Size of an object offset in bytes
+ *  sizeof_size - Size of an object length in bytes
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Wednesday, February 23, 2000
+ *  Wednesday, February 23, 2000
  * HISTORY
- * Deleted extra length parameters. EP 6/7/00
+ *  Deleted extra length parameters. EP 6/7/00
  * SOURCE
 */
 int_f
-nh5pget_sizes_c (hid_t_f *prp_id, size_t_f * sizeof_addr, size_t_f * sizeof_size)
+h5pget_sizes_c (hid_t_f *prp_id, size_t_f * sizeof_addr, size_t_f * sizeof_size)
 /******/
 {
      int ret_value = -1;
@@ -748,24 +646,24 @@ nh5pget_sizes_c (hid_t_f *prp_id, size_t_f * sizeof_addr, size_t_f * sizeof_size
 
 /****if* H5Pf/h5pset_sizes_c
  * NAME
- *        h5pset_sizes_c
+ *  h5pset_sizes_c
  * PURPOSE
- *     Call H5Pset_sizes to set the size of the offsets
+ *  Call H5Pset_sizes to set the size of the offsets
  * INPUTS
- *      prp_id - property list identifier
- *              sizeof_addr - Size of an object offset in bytes
- *              sizeof_size - Size of an object length in bytes
+ *  prp_id - property list identifier
+ *  sizeof_addr - Size of an object offset in bytes
+ *  sizeof_size - Size of an object length in bytes
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Wednesday, February 23, 2000
+ *  Wednesday, February 23, 2000
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_sizes_c (hid_t_f *prp_id, size_t_f * sizeof_addr, size_t_f * sizeof_size)
+h5pset_sizes_c (hid_t_f *prp_id, size_t_f * sizeof_addr, size_t_f * sizeof_size)
 /******/
 {
      int ret_value = -1;
@@ -788,23 +686,23 @@ nh5pset_sizes_c (hid_t_f *prp_id, size_t_f * sizeof_addr, size_t_f * sizeof_size
 
 /****if* H5Pf/h5pset_sym_k_c
  * NAME
- *        h5pset_sym_k_c
+ *  h5pset_sym_k_c
  * PURPOSE
- *     Call H5Pset_sym_k to set the size of parameters used
- *              to control the symbol table node
+ *  Call H5Pset_sym_k to set the size of parameters used
+ *  to control the symbol table node
  * INPUTS
- *      prp_id - property list identifier
- *              ik - Symbol table tree rank
- *              lk - Symbol table node size
+ *  prp_id - property list identifier
+ *  ik - Symbol table tree rank
+ *  lk - Symbol table node size
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, February 25, 2000
+ *  Friday, February 25, 2000
  * SOURCE
 */
 int_f
-nh5pset_sym_k_c (hid_t_f *prp_id, int_f* ik, int_f* lk)
+h5pset_sym_k_c (hid_t_f *prp_id, int_f* ik, int_f* lk)
 /******/
 {
      int ret_value = -1;
@@ -828,26 +726,26 @@ nh5pset_sym_k_c (hid_t_f *prp_id, int_f* ik, int_f* lk)
 
 /****if* H5Pf/h5pget_sym_k_c
  * NAME
- *        h5pget_sym_k_c
+ *  h5pget_sym_k_c
  * PURPOSE
- *     Call H5Pget_sym_k to get the size of parameters used
- *              to control the symbol table node
+ *  Call H5Pget_sym_k to get the size of parameters used
+ *  to control the symbol table node
  * INPUTS
- *      prp_id - property list identifier
+ *  prp_id - property list identifier
  * OUTPUTS
- *     ik - Symbol table tree rank
- *              lk - Symbol table node size
+ *  ik - Symbol table tree rank
+ *  lk - Symbol table node size
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, February 25, 2000
+ *  Friday, February 25, 2000
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_sym_k_c (hid_t_f *prp_id, int_f* ik, int_f* lk)
+h5pget_sym_k_c (hid_t_f *prp_id, int_f* ik, int_f* lk)
 /******/
 {
      int ret_value = -1;
@@ -870,24 +768,24 @@ nh5pget_sym_k_c (hid_t_f *prp_id, int_f* ik, int_f* lk)
 
 /****if* H5Pf/h5pset_istore_k_c
  * NAME
- *        h5pset_istore_k_c
+ *  h5pset_istore_k_c
  * PURPOSE
- *     Call H5Pset_istore_k to set the size of the parameter
- *              used to control the B-trees for indexing chunked datasets
+ *  Call H5Pset_istore_k to set the size of the parameter
+ *  used to control the B-trees for indexing chunked datasets
  * INPUTS
- *      prp_id - property list identifier
- *              ik - Symbol table tree rank
+ *  prp_id - property list identifier
+ *  ik - Symbol table tree rank
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, February 25, 2000
+ *  Friday, February 25, 2000
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_istore_k_c (hid_t_f *prp_id, int_f* ik)
+h5pset_istore_k_c (hid_t_f *prp_id, int_f* ik)
 /******/
 {
      int ret_value = -1;
@@ -909,25 +807,25 @@ nh5pset_istore_k_c (hid_t_f *prp_id, int_f* ik)
 
 /****if* H5Pf/h5pget_istore_k_c
  * NAME
- *        h5pget_istore_k_c
+ *  h5pget_istore_k_c
  * PURPOSE
- *     Call H5Pget_istore_k to get the size of parameters used
- *              to control the B-trees for indexing chunked datasets
+ *  Call H5Pget_istore_k to get the size of parameters used
+ *  to control the B-trees for indexing chunked datasets
  * INPUTS
- *      prp_id - property list identifier
+ *  prp_id - property list identifier
  * OUTPUTS
- *     ik - Symbol table tree rank
+ *  ik - Symbol table tree rank
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, February 25, 2000
+ *  Friday, February 25, 2000
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_istore_k_c (hid_t_f *prp_id, int_f* ik)
+h5pget_istore_k_c (hid_t_f *prp_id, int_f* ik)
 /******/
 {
      int ret_value = -1;
@@ -948,24 +846,24 @@ nh5pget_istore_k_c (hid_t_f *prp_id, int_f* ik)
 
 /****if* H5Pf/h5pget_driver_c
  * NAME
- *        h5pget_driver_c
+ *  h5pget_driver_c
  * PURPOSE
- *     Call H5Pget_driver to get low-level file driver identifier
+ *  Call H5Pget_driver to get low-level file driver identifier
  * INPUTS
- *      prp_id - property list identifier
+ *  prp_id - property list identifier
  * OUTPUTS
- *     driver - low-level file driver identifier
+ *  driver - low-level file driver identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, February 25, 2000
+ *  Friday, February 25, 2000
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_driver_c (hid_t_f *prp_id, hid_t_f* driver)
+h5pget_driver_c (hid_t_f *prp_id, hid_t_f* driver)
 /******/
 {
      int ret_value = -1;
@@ -986,23 +884,23 @@ DONE:
 
 /****if* H5Pf/h5pset_fapl_stdio_c
  * NAME
- *        h5pset_fapl_stdio_c
+ *  h5pset_fapl_stdio_c
  * PURPOSE
- *     Call H5Pset_stdio to set the low level file driver to
- *              use the functions declared in the stdio.h
+ *  Call H5Pset_stdio to set the low level file driver to
+ *  use the functions declared in the stdio.h
  * INPUTS
- *      prp_id - property list identifier
+ *  prp_id - property list identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              March 7, 2001
+ *  March 7, 2001
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_fapl_stdio_c (hid_t_f *prp_id)
+h5pset_fapl_stdio_c (hid_t_f *prp_id)
 /******/
 {
      int ret_value = -1;
@@ -1020,26 +918,26 @@ nh5pset_fapl_stdio_c (hid_t_f *prp_id)
 #ifdef NO_SUCH_F90_FUNCTION
 /****if* H5Pf/h5pget_fapl_stdio_c
  * NAME
- *        h5pget_fapl_stdio_c
+ *  h5pget_fapl_stdio_c
  * PURPOSE
- *     Call H5Pget_fapl_stdio to determine whther the low level file driver
- *              uses the functions declared in the stdio.h
+ *  Call H5Pget_fapl_stdio to determine whther the low level file driver
+ *  uses the functions declared in the stdio.h
  * INPUTS
- *      prp_id - property list identifier
+ *  prp_id - property list identifier
  * OUTPUTS
- *     io - value indicates whether the file driver uses
- *                   the functions declared in the stdio.h
+ *  io - value indicates whether the file driver uses
+ *  the functions declared in the stdio.h
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              March 9, 2001
+ *  March 9, 2001
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_fapl_stdio_c (hid_t_f *prp_id, int_f* io)
+h5pget_fapl_stdio_c (hid_t_f *prp_id, int_f* io)
 /******/
 {
      int ret_value = -1;
@@ -1060,23 +958,23 @@ nh5pget_fapl_stdio_c (hid_t_f *prp_id, int_f* io)
 
 /****if* H5Pf/h5pset_fapl_sec2_c
  * NAME
- *        h5pset_fapl_sec2_c
+ *  h5pset_fapl_sec2_c
  * PURPOSE
- *     Call H5Pset_fapl_sec2 to set the low level file driver to
- *              use the functions declared in the  unistd.h
+ *  Call H5Pset_fapl_sec2 to set the low level file driver to
+ *  use the functions declared in the  unistd.h
  * INPUTS
- *      prp_id - property list identifier
+ *  prp_id - property list identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              March 9, 2001
+ *  March 9, 2001
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_fapl_sec2_c (hid_t_f *prp_id)
+h5pset_fapl_sec2_c (hid_t_f *prp_id)
 /******/
 {
      int ret_value = -1;
@@ -1095,26 +993,26 @@ nh5pset_fapl_sec2_c (hid_t_f *prp_id)
 #ifdef NO_SUCH_F90_FUNCTION
 /****if* H5Pf/h5pget_fapl_sec2_c
  * NAME
- *        h5pget_fapl_sec2_c
+ *  h5pget_fapl_sec2_c
  * PURPOSE
- *     Call H5Pget_fapl_stdio to determine whther the low level file driver
- *              uses the functions declared in the  unistd.h
+ *  Call H5Pget_fapl_stdio to determine whther the low level file driver
+ *  uses the functions declared in the  unistd.h
  * INPUTS
- *      prp_id - property list identifier
+ *  prp_id - property list identifier
  * OUTPUTS
- *     sec2 - value indicates whether the file driver uses
- *                   the functions declared in the  unistd.h
+ *  sec2 - value indicates whether the file driver uses
+ *  the functions declared in the  unistd.h
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              March 9, 2001
+ *  March 9, 2001
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_fapl_sec2_c (hid_t_f *prp_id, int_f* sec2)
+h5pget_fapl_sec2_c (hid_t_f *prp_id, int_f* sec2)
 /******/
 {
      int ret_value = -1;
@@ -1134,25 +1032,25 @@ nh5pget_fapl_sec2_c (hid_t_f *prp_id, int_f* sec2)
 
 /****if* H5Pf/h5pset_alignment_c
  * NAME
- *        h5pset_alignment_c
+ *  h5pset_alignment_c
  * PURPOSE
- *     Call H5Pset_alignment to set alignment properties of
- *              a file access property list
+ *  Call H5Pset_alignment to set alignment properties of
+ *  a file access property list
  * INPUTS
- *      prp_id - property list identifier
- *              threshold - Threshold value
- *              alignment - Alignment value
+ *  prp_id - property list identifier
+ *  threshold - Threshold value
+ *  alignment - Alignment value
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, February 25, 2000
+ *  Friday, February 25, 2000
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_alignment_c (hid_t_f *prp_id, hsize_t_f* threshold, hsize_t_f* alignment)
+h5pset_alignment_c (hid_t_f *prp_id, hsize_t_f* threshold, hsize_t_f* alignment)
 /******/
 {
      int ret_value = -1;
@@ -1173,25 +1071,25 @@ nh5pset_alignment_c (hid_t_f *prp_id, hsize_t_f* threshold, hsize_t_f* alignment
 
 /****if* H5Pf/h5pget_alignment_c
  * NAME
- *        h5pget_alignment_c
+ *  h5pget_alignment_c
  * PURPOSE
- *     Call H5Pget_alignment to get alignment properties of
- *              a file access property list
+ *  Call H5Pget_alignment to get alignment properties of
+ *  a file access property list
  * INPUTS
- *      prp_id - property list identifier
- *              threshold - Threshold value
- *              alignment - Alignment value
+ *  prp_id - property list identifier
+ *  threshold - Threshold value
+ *  alignment - Alignment value
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, February 25, 2000
+ *  Friday, February 25, 2000
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_alignment_c (hid_t_f *prp_id, hsize_t_f* threshold, hsize_t_f* alignment)
+h5pget_alignment_c (hid_t_f *prp_id, hsize_t_f* threshold, hsize_t_f* alignment)
 /******/
 {
      int ret_value = -1;
@@ -1213,26 +1111,26 @@ nh5pget_alignment_c (hid_t_f *prp_id, hsize_t_f* threshold, hsize_t_f* alignment
 
 /****if* H5Pf/h5pset_fapl_core_c
  * NAME
- *        h5pset_fapl_core_c
+ *  h5pset_fapl_core_c
  * PURPOSE
- *     Call H5Pset_fapl_core to set the low-level file driver
- *              to use malloc() and free()
+ *  Call H5Pset_fapl_core to set the low-level file driver
+ *  to use malloc() and free()
  * INPUTS
- *      prp_id - property list identifier
- *              increment - File block size in bytes
- *              flag - Boolean flag indicating whether to write the
- *              file contents to disk when the file is closed.
+ *  prp_id - property list identifier
+ *  increment - File block size in bytes
+ *  flag - Boolean flag indicating whether to write the
+ *  file contents to disk when the file is closed.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              March 9, 2001
+ *  March 9, 2001
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_fapl_core_c (hid_t_f *prp_id, size_t_f* increment, int_f *flag)
+h5pset_fapl_core_c (hid_t_f *prp_id, size_t_f* increment, int_f *flag)
 /******/
 {
      int ret_value = -1;
@@ -1255,24 +1153,24 @@ nh5pset_fapl_core_c (hid_t_f *prp_id, size_t_f* increment, int_f *flag)
 
 /****if* H5Pf/h5pget_fapl_core_c
  * NAME
- *        h5pget_fapl_core_c
+ *  h5pget_fapl_core_c
  * PURPOSE
- *     Call H5Pget_fapl_core to determine whether the file access
- *              property list is set to the core drive
+ *  Call H5Pget_fapl_core to determine whether the file access
+ *  property list is set to the core drive
  * INPUTS
- *      prp_id - property list identifier
- * Outputs      increment - File block size in bytes
+ *  prp_id - property list identifier
+ *  Outputs      increment - File block size in bytes
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              March 9, 2001
+ *  March 9, 2001
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_fapl_core_c (hid_t_f *prp_id, size_t_f* increment, int_f *flag)
+h5pget_fapl_core_c (hid_t_f *prp_id, size_t_f* increment, int_f *flag)
 /******/
 {
      int ret_value = -1;
@@ -1295,26 +1193,26 @@ nh5pget_fapl_core_c (hid_t_f *prp_id, size_t_f* increment, int_f *flag)
 
 /****if* H5Pf/h5pset_fapl_family_c
  * NAME
- *        h5pset_fapl_family_c
+ *  h5pset_fapl_family_c
  * PURPOSE
- *     Call H5Pset_fapl_family to set the file access properties list
- *              to the family driver
+ *  Call H5Pset_fapl_family to set the file access properties list
+ *  to the family driver
  * INPUTS
- *      prp_id - property list identifier
- *              memb_size -  Logical size, in bytes, of each family member.
- *              memb_plist - Identifier of the file access property list
- *                           for each member of the family
+ *  prp_id - property list identifier
+ *  memb_size -  Logical size, in bytes, of each family member.
+ *  memb_plist - Identifier of the file access property list
+ *  for each member of the family
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              March 9, 2001
+ *  March 9, 2001
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_fapl_family_c(hid_t_f *prp_id, hsize_t_f* memb_size, hid_t_f* memb_plist )
+h5pset_fapl_family_c(hid_t_f *prp_id, hsize_t_f* memb_size, hid_t_f* memb_plist )
 /******/
 {
      int ret_value = -1;
@@ -1336,26 +1234,26 @@ nh5pset_fapl_family_c(hid_t_f *prp_id, hsize_t_f* memb_size, hid_t_f* memb_plist
 
 /****if* H5Pf/h5pget_fapl_family_c
  * NAME
- *        h5pget_fapl_family_c
+ *  h5pget_fapl_family_c
  * PURPOSE
- *     Call H5Pget_fapl_family to determine whether the file access
- *              property list is set to the family driver
+ *  Call H5Pget_fapl_family to determine whether the file access
+ *  property list is set to the family driver
  * INPUTS
- *      prp_id - property list identifier
- *              memb_size -  Logical size, in bytes, of each family member.
- *              memb_plist - Identifier of the file access property list
- *                           for each member of the family
+ *  prp_id - property list identifier
+ *  memb_size -  Logical size, in bytes, of each family member.
+ *  memb_plist - Identifier of the file access property list
+ *  for each member of the family
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              March 9, 2001
+ *  March 9, 2001
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_fapl_family_c(hid_t_f *prp_id, hsize_t_f* memb_size, hid_t_f* memb_plist)
+h5pget_fapl_family_c(hid_t_f *prp_id, hsize_t_f* memb_size, hid_t_f* memb_plist)
 /******/
 {
      int ret_value = -1;
@@ -1378,29 +1276,29 @@ nh5pget_fapl_family_c(hid_t_f *prp_id, hsize_t_f* memb_size, hid_t_f* memb_plist
 
 /****if* H5Pf/h5pset_cache_c
  * NAME
- *        h5pset_cache_c
+ *  h5pset_cache_c
  * PURPOSE
- *     Call H5Pset_cache to set he number of elements in
- *              the meta data cache and the total number of bytes in
- *              the raw data chunk cache
+ *  Call H5Pset_cache to set he number of elements in
+ *  the meta data cache and the total number of bytes in
+ *  the raw data chunk cache
  * INPUTS
- *      prp_id - property list identifier
- *              mdc_nelmts - Number of elements (objects) in the
- *                           meta data cache
- *              rdcc_nbytes - Total size of the raw data chunk cache, in bytes
- *              rdcc_w0 - Preemption policy
+ *  prp_id - property list identifier
+ *  mdc_nelmts - Number of elements (objects) in the
+ *  meta data cache
+ *  rdcc_nbytes - Total size of the raw data chunk cache, in bytes
+ *  rdcc_w0 - Preemption policy
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, February 25, 2000
+ *  Friday, February 25, 2000
  * HISTORY
- * Changed the type of the rdcc_w0 parameter to be real_f EP 7/7/00
- *                instead of double
+ *  Changed the type of the rdcc_w0 parameter to be real_f EP 7/7/00
+ *  instead of double
  * SOURCE
 */
 int_f
-nh5pset_cache_c(hid_t_f *prp_id, int_f* mdc_nelmts, size_t_f* rdcc_nelmts,  size_t_f* rdcc_nbytes , real_f* rdcc_w0 )
+h5pset_cache_c(hid_t_f *prp_id, int_f* mdc_nelmts, size_t_f* rdcc_nelmts,  size_t_f* rdcc_nbytes , real_f* rdcc_w0 )
 /******/
 {
      int ret_value = -1;
@@ -1427,32 +1325,32 @@ nh5pset_cache_c(hid_t_f *prp_id, int_f* mdc_nelmts, size_t_f* rdcc_nelmts,  size
 
 /****if* H5Pf/h5pget_cache_c
  * NAME
- *        h5pget_cache_c
+ *  h5pget_cache_c
  * PURPOSE
- *     Call H5Pget_cache to get he number of elements in
- *              the meta data cache and the total number of bytes in
- *              the raw data chunk cache
+ *  Call H5Pget_cache to get he number of elements in
+ *  the meta data cache and the total number of bytes in
+ *  the raw data chunk cache
  * INPUTS
- *      prp_id - property list identifier
+ *  prp_id - property list identifier
  * OUTPUTS
- *     mdc_nelmts - Number of elements (objects) in the
- *                           meta data cache
- *              rdcc_nelmts - Number of elements in the raw data chunk
- *              rdcc_nbytes - Total size of the raw data chunk cache, in bytes
- *              rdcc_w0 - Preemption policy
+ *  mdc_nelmts - Number of elements (objects) in the
+ *  meta data cache
+ *  rdcc_nelmts - Number of elements in the raw data chunk
+ *  rdcc_nbytes - Total size of the raw data chunk cache, in bytes
+ *  rdcc_w0 - Preemption policy
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, February 25, 2000
+ *  Friday, February 25, 2000
  * HISTORY
- * Changed type of the rdcc_w0 parameter to be real_f instead of double
- *                Changed type of the rdcc_nelmts parameter to be int_f.
+ *  Changed type of the rdcc_w0 parameter to be real_f instead of double
+ *  Changed type of the rdcc_nelmts parameter to be int_f.
  *                                                          EIP  October 10, 2003
  * SOURCE
 */
 int_f
-nh5pget_cache_c(hid_t_f *prp_id, int_f* mdc_nelmts, size_t_f* rdcc_nelmts, size_t_f* rdcc_nbytes , real_f* rdcc_w0)
+h5pget_cache_c(hid_t_f *prp_id, int_f* mdc_nelmts, size_t_f* rdcc_nelmts, size_t_f* rdcc_nbytes , real_f* rdcc_w0)
 /******/
 {
      int ret_value = -1;
@@ -1479,29 +1377,29 @@ nh5pget_cache_c(hid_t_f *prp_id, int_f* mdc_nelmts, size_t_f* rdcc_nelmts, size_
 
 /****if* H5Pf/h5pset_fapl_split_c
  * NAME
- *        h5pset_fapl_split_c
+ *  h5pset_fapl_split_c
  * PURPOSE
- *     Call H5Pset_fapl_split to set he low-level driver to split meta data
- *              from raw data
+ *  Call H5Pset_fapl_split to set he low-level driver to split meta data
+ *  from raw data
  * INPUTS
- *      prp_id - property list identifier
- *              meta_len - Length of meta_ext
- *              meta_ext - Name of the extension for the metafile filename.
- *              meta_plist - Identifier of the meta file access property list
- *              raw_len - Length of raw _ext
- *              raw_ext - Name of the extension for the raw file filename.
- *              raw_plist - Identifier of the raw  file access property list
+ *  prp_id - property list identifier
+ *  meta_len - Length of meta_ext
+ *  meta_ext - Name of the extension for the metafile filename.
+ *  meta_plist - Identifier of the meta file access property list
+ *  raw_len - Length of raw _ext
+ *  raw_ext - Name of the extension for the raw file filename.
+ *  raw_plist - Identifier of the raw  file access property list
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              March 9, 2001
+ *  March 9, 2001
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_fapl_split_c(hid_t_f *prp_id, int_f* meta_len, _fcd meta_ext, hid_t_f* meta_plist, int_f* raw_len, _fcd raw_ext, hid_t_f * raw_plist)
+h5pset_fapl_split_c(hid_t_f *prp_id, int_f* meta_len, _fcd meta_ext, hid_t_f* meta_plist, int_f* raw_len, _fcd raw_ext, hid_t_f * raw_plist)
 /******/
 {
      int ret_value = -1;
@@ -1540,32 +1438,32 @@ DONE:
 #ifdef NO_SUCH_F90_FUNCTION
 /****if* H5Pf/h5pget_fapl_split_c
  * NAME
- *        h5pget_fapl_split_c
+ *  h5pget_fapl_split_c
  * PURPOSE
- *     Call H5Pget_fapl_split to determine whether the file access
- *              property list is set to the split driver
+ *  Call H5Pget_fapl_split to determine whether the file access
+ *  property list is set to the split driver
  * INPUTS
- *      prp_id - property list identifier
- *              meta_ext_size - Number of characters of the meta file extension
- *                              to be copied to the meta_ext buffer
- *              raw_ext_size - Number of characters of the raw file extension
- *                              to be copied to the raw_ext buffer
+ *  prp_id - property list identifier
+ *  meta_ext_size - Number of characters of the meta file extension
+ *  to be copied to the meta_ext buffer
+ *  raw_ext_size - Number of characters of the raw file extension
+ *  to be copied to the raw_ext buffer
  *OUTPUT
- *      meta_ext - Name of the extension for the metafile filename.
- *              meta_plist - Identifier of the meta file access property list
- *              raw_ext - Name of the extension for the raw file filename.
- *              raw_plist - Identifier of the raw  file access property list
+ *  meta_ext - Name of the extension for the metafile filename.
+ *  meta_plist - Identifier of the meta file access property list
+ *  raw_ext - Name of the extension for the raw file filename.
+ *  raw_plist - Identifier of the raw  file access property list
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              March 9 , 2001
+ *  March 9 , 2001
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_fapl_split_c(hid_t_f *prp_id, size_t_f* meta_ext_size , _fcd meta_ext, hid_t_f* meta_plist, size_t_f* raw_ext_size, _fcd raw_ext, hid_t_f * raw_plist)
+h5pget_fapl_split_c(hid_t_f *prp_id, size_t_f* meta_ext_size , _fcd meta_ext, hid_t_f* meta_plist, size_t_f* raw_ext_size, _fcd raw_ext, hid_t_f * raw_plist)
 /******/
 {
      int ret_value = -1;
@@ -1603,25 +1501,25 @@ nh5pget_fapl_split_c(hid_t_f *prp_id, size_t_f* meta_ext_size , _fcd meta_ext, h
 
 /****if* H5Pf/h5pset_gc_references_c
  * NAME
- *        h5pset_gc_references_c
+ *  h5pset_gc_references_c
  * PURPOSE
- *     Call H5Pset_gc_references to set garbage
- *              collecting references flag
+ *  Call H5Pset_gc_references to set garbage
+ *  collecting references flag
  * INPUTS
- *      prp_id - property list identifier
- *              gc_reference - flag for garbage collecting references
- *                             for the file
+ *  prp_id - property list identifier
+ *  gc_reference - flag for garbage collecting references
+ *  for the file
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, February 25, 2000
+ *  Friday, February 25, 2000
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_gc_references_c (hid_t_f *prp_id, int_f* gc_references)
+h5pset_gc_references_c (hid_t_f *prp_id, int_f* gc_references)
 /******/
 {
      int ret_value = -1;
@@ -1643,25 +1541,25 @@ nh5pset_gc_references_c (hid_t_f *prp_id, int_f* gc_references)
 
 /****if* H5Pf/h5pget_gc_references_c
  * NAME
- *        h5pget_gc_references_c
+ *  h5pget_gc_references_c
  * PURPOSE
- *     Call H5Pget_gc_references to set garbage
- *              collecting references flag
+ *  Call H5Pget_gc_references to set garbage
+ *  collecting references flag
  * INPUTS
- *      prp_id - property list identifier
- * Outputs      gc_reference - flag for garbage collecting references
- *                             for the file
+ *  prp_id - property list identifier
+ *  Outputs      gc_reference - flag for garbage collecting references
+ *  for the file
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, February 25, 2000
+ *  Friday, February 25, 2000
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_gc_references_c (hid_t_f *prp_id, int_f* gc_references)
+h5pget_gc_references_c (hid_t_f *prp_id, int_f* gc_references)
 /******/
 {
      int ret_value = -1;
@@ -1681,24 +1579,24 @@ nh5pget_gc_references_c (hid_t_f *prp_id, int_f* gc_references)
 
 /****if* H5Pf/h5pset_layout_c
  * NAME
- *        h5pset_layout_c
+ *  h5pset_layout_c
  * PURPOSE
- *     Call H5Pset_layout to the type of storage used
- *              store the raw data for a dataset
+ *  Call H5Pset_layout to the type of storage used
+ *  store the raw data for a dataset
  * INPUTS
- *      prp_id - property list identifier
- *              layout - Type of storage layout for raw data.
+ *  prp_id - property list identifier
+ *  layout - Type of storage layout for raw data.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, February 25, 2000
+ *  Friday, February 25, 2000
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_layout_c (hid_t_f *prp_id, int_f* layout)
+h5pset_layout_c (hid_t_f *prp_id, int_f* layout)
 /******/
 {
      int ret_value = -1;
@@ -1719,25 +1617,25 @@ nh5pset_layout_c (hid_t_f *prp_id, int_f* layout)
 
 /****if* H5Pf/h5pget_layout_c
  * NAME
- *        h5pget_layout_c
+ *  h5pget_layout_c
  * PURPOSE
- *     Call H5Pget_layout to the type of storage used
- *              store the raw data for a dataset
+ *  Call H5Pget_layout to the type of storage used
+ *  store the raw data for a dataset
  * INPUTS
- *      prp_id - property list identifier
+ *  prp_id - property list identifier
  * OUTPUTS
- *     layout - Type of storage layout for raw data.
+ *  layout - Type of storage layout for raw data.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, February 25, 2000
+ *  Friday, February 25, 2000
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_layout_c (hid_t_f *prp_id, int_f* layout)
+h5pget_layout_c (hid_t_f *prp_id, int_f* layout)
 /******/
 {
      int ret_value = -1;
@@ -1756,27 +1654,27 @@ nh5pget_layout_c (hid_t_f *prp_id, int_f* layout)
 
 /****if* H5Pf/h5pset_filter_c
  * NAME
- *        h5pset_filter_c
+ *  h5pset_filter_c
  * PURPOSE
- *     Call H5Pset_filter to add a filter to the filter pipeline.
+ *  Call H5Pset_filter to add a filter to the filter pipeline.
  * INPUTS
- *      prp_id - property list identifier
- *              filter - Filter to be added to the pipeline.
- *              flags - Bit vector specifying certain general
- *                      properties of the filter.
- *              cd_nelmts - Number of elements in cd_values.
- *              cd_values - Auxiliary data for the filter.
+ *  prp_id - property list identifier
+ *  filter - Filter to be added to the pipeline.
+ *  flags - Bit vector specifying certain general
+ *  properties of the filter.
+ *  cd_nelmts - Number of elements in cd_values.
+ *  cd_values - Auxiliary data for the filter.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Wednesday, February 23, 2000
+ *  Wednesday, February 23, 2000
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_filter_c (hid_t_f *prp_id, int_f* filter, int_f* flags, size_t_f* cd_nelmts, int_f* cd_values )
+h5pset_filter_c (hid_t_f *prp_id, int_f* filter, int_f* flags, size_t_f* cd_nelmts, int_f* cd_values )
 /******/
 {
      int ret_value = -1;
@@ -1824,7 +1722,7 @@ DONE:
  * SOURCE
 */
 int_f
-nh5pget_nfilters_c (hid_t_f *prp_id, int_f* nfilters)
+h5pget_nfilters_c (hid_t_f *prp_id, int_f* nfilters)
 /******/
 {
      int ret_value = -1;
@@ -1844,30 +1742,30 @@ nh5pget_nfilters_c (hid_t_f *prp_id, int_f* nfilters)
 }
 
 /*----------------------------------------------------------------------------
- * Name:        h5pget_filter_c
- * Purpose:     Call H5Pget_filter2 to get information about a filter
- *              in a pipeline
- * Inputs:      prp_id - property list identifier
- *              filter_number - Sequence number within the filter
- *                              pipeline of the filter for which
- *                              information is sought.
- *              namelen - Anticipated number of characters in name.
- *Outputs:      flags - Bit vector specifying certain general
- *                      properties of the filter.
- *              cd_nelmts - Number of elements in cd_value
- *              cd_values - Auxiliary data for the filter.
- *              name - Name of the filter
- *              filter_id - filter identification number
- * Returns:     0 on success, -1 on failure
- * Programmer:  Xiangyang Su
- *              Friday, February 25, 2000
- * Modifications:
- *              Since cd_nelmts has IN/OUT attributes, fixed the input and
- *              returned value of cd_nelmnts to satisfy this specification.
+ *  Name:        h5pget_filter_c
+ *  Purpose:     Call H5Pget_filter2 to get information about a filter
+ *  in a pipeline
+ *  Inputs:      prp_id - property list identifier
+ *  filter_number - Sequence number within the filter
+ *  pipeline of the filter for which
+ *  information is sought.
+ *  namelen - Anticipated number of characters in name.
+ *  Outputs:      flags - Bit vector specifying certain general
+ *  properties of the filter.
+ *  cd_nelmts - Number of elements in cd_value
+ *  cd_values - Auxiliary data for the filter.
+ *  name - Name of the filter
+ *  filter_id - filter identification number
+ *  Returns:     0 on success, -1 on failure
+ *  Programmer:  Xiangyang Su
+ *  Friday, February 25, 2000
+ *  Modifications:
+ *  Since cd_nelmts has IN/OUT attributes, fixed the input and
+ *  returned value of cd_nelmnts to satisfy this specification.
  *              MSB January 27, 2009
  *---------------------------------------------------------------------------*/
 int_f
-nh5pget_filter_c(hid_t_f *prp_id, int_f* filter_number, int_f* flags, size_t_f* cd_nelmts, int_f* cd_values, size_t_f *namelen, _fcd name, int_f* filter_id)
+h5pget_filter_c(hid_t_f *prp_id, int_f* filter_number, int_f* flags, size_t_f* cd_nelmts, int_f* cd_values, size_t_f *namelen, _fcd name, int_f* filter_id)
 /******/
 {
     unsigned int  c_flags;
@@ -1921,7 +1819,7 @@ DONE:
  *  name    - Name of an external file
  *  namelen - length of name
  *  offset  - Offset, in bytes, from the beginning of the file
- *            to the location in the file where the data starts.
+ *  to the location in the file where the data starts.
  *  bytes   - Number of bytes reserved in the file for the data.
  * RETURNS
  *  0 on success, -1 on failure
@@ -1934,7 +1832,7 @@ DONE:
  * SOURCE
 */
 int_f
-nh5pset_external_c (hid_t_f *prp_id, _fcd name, int_f* namelen, off_t_f* offset, hsize_t_f*bytes)
+h5pset_external_c (hid_t_f *prp_id, _fcd name, int_f* namelen, off_t_f* offset, hsize_t_f*bytes)
 /******/
 {
      int ret_value = -1;
@@ -1967,25 +1865,25 @@ DONE:
 
 /****if* H5Pf/h5pget_external_count_c
  * NAME
- *        h5pget_external_count_c
+ *  h5pget_external_count_c
  * PURPOSE
- *     Call H5Pget_external_count to get the number of external
- *              files for the specified dataset.
+ *  Call H5Pget_external_count to get the number of external
+ *  files for the specified dataset.
  * INPUTS
- *      prp_id - property list identifier
+ *  prp_id - property list identifier
  * OUTPUTS
- *     count - number of external files
+ *  count - number of external files
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, February 25, 2000
+ *  Friday, February 25, 2000
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_external_count_c (hid_t_f *prp_id, int_f* count)
+h5pget_external_count_c (hid_t_f *prp_id, int_f* count)
 /******/
 {
      int ret_value = -1;
@@ -2008,14 +1906,14 @@ nh5pget_external_count_c (hid_t_f *prp_id, int_f* count)
  * PURPOSE
  *  Call H5Pget_external to get nformation about an external file.
  * INPUTS
- *    prp_id - property list identifier
- * name_size - length of name
- *       idx - External file index.
+ *  prp_id - property list identifier
+ *  name_size - length of name
+ *  idx - External file index.
  * OUTPUT
- *      name - Name of an external file
- *    offset - Offset, in bytes, from the beginning of the file
- *             to the location in the file where the data starts.
- *     bytes - Number of bytes reserved in the file for the data.
+ *  name - Name of an external file
+ *  offset - Offset, in bytes, from the beginning of the file
+ *  to the location in the file where the data starts.
+ *  bytes - Number of bytes reserved in the file for the data.
  * RETURNS
  *  on success, -1 on failure
  * AUTHOR
@@ -2027,7 +1925,7 @@ nh5pget_external_count_c (hid_t_f *prp_id, int_f* count)
  * SOURCE
 */
 int_f
-nh5pget_external_c(hid_t_f *prp_id, int_f *idx, size_t_f* name_size, _fcd name, off_t_f* offset, hsize_t_f*bytes)
+h5pget_external_c(hid_t_f *prp_id, int_f *idx, size_t_f* name_size, _fcd name, off_t_f* offset, hsize_t_f*bytes)
 /******/
 {
      int ret_value = -1;
@@ -2071,27 +1969,27 @@ DONE:
 
 /****if* H5Pf/h5pset_btree_ratios_c
  * NAME
- *        h5pset_btree_ratios_c
+ *  h5pset_btree_ratios_c
  * PURPOSE
- *     Call H5Pset_btree_ratios to set B-tree split ratios for B-tree split ratios for a dataset transfer property list. a
- *              dataset transfer property list.
+ *  Call H5Pset_btree_ratios to set B-tree split ratios for B-tree split ratios for a dataset transfer property list. a
+ *  dataset transfer property list.
  * INPUTS
- *      prp_id - property list identifier
- *              left - The B-tree split ratio for left-most nodes.
- *              middle - The B-tree split ratio for all other nodes
- *              right - The B-tree split ratio for right-most nodes
- *                      and lone nodes.
+ *  prp_id - property list identifier
+ *  left - The B-tree split ratio for left-most nodes.
+ *  middle - The B-tree split ratio for all other nodes
+ *  right - The B-tree split ratio for right-most nodes
+ *  and lone nodes.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, February 25, 2000
+ *  Friday, February 25, 2000
  * HISTORY
- * Changed the type of the last three parameters from double to real_f
+ *  Changed the type of the last three parameters from double to real_f
  * SOURCE
 */
 int_f
-nh5pset_btree_ratios_c(hid_t_f *prp_id, real_f* left, real_f* middle, real_f* right)
+h5pset_btree_ratios_c(hid_t_f *prp_id, real_f* left, real_f* middle, real_f* right)
 /******/
 {
      int ret_value = -1;
@@ -2116,27 +2014,27 @@ nh5pset_btree_ratios_c(hid_t_f *prp_id, real_f* left, real_f* middle, real_f* ri
 
 /****if* H5Pf/h5pget_btree_ratios_c
  * NAME
- *        h5pget_btree_ratios_c
+ *  h5pget_btree_ratios_c
  * PURPOSE
- *     Call H5Pget_btree_ratios to Gets B-tree split ratios
- *              for a dataset transfer property list.
+ *  Call H5Pget_btree_ratios to Gets B-tree split ratios
+ *  for a dataset transfer property list.
  * INPUTS
- *      prp_id - property list identifier
- *              left - The B-tree split ratio for left-most nodes.
- *              middle - The B-tree split ratio for all other nodes
- *              right - The B-tree split ratio for right-most nodes
- *                      and lone nodes.
+ *  prp_id - property list identifier
+ *  left - The B-tree split ratio for left-most nodes.
+ *  middle - The B-tree split ratio for all other nodes
+ *  right - The B-tree split ratio for right-most nodes
+ *  and lone nodes.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, February 25, 2000
+ *  Friday, February 25, 2000
  * HISTORY
- * Changed the type of the last three parameters from double to real_f
+ *  Changed the type of the last three parameters from double to real_f
  * SOURCE
 */
 int_f
-nh5pget_btree_ratios_c(hid_t_f *prp_id, real_f* left, real_f* middle, real_f* right)
+h5pget_btree_ratios_c(hid_t_f *prp_id, real_f* left, real_f* middle, real_f* right)
 /******/
 {
      int ret_value = -1;
@@ -2158,30 +2056,30 @@ nh5pget_btree_ratios_c(hid_t_f *prp_id, real_f* left, real_f* middle, real_f* ri
 }
 /****if* H5Pf/h5pget_fclose_degree_c
  * NAME
- *        h5pget_fclose_degree_c
+ *  h5pget_fclose_degree_c
  * PURPOSE
- *     Call H5Pget_fclose_degree to determine file close behavior
+ *  Call H5Pget_fclose_degree to determine file close behavior
  * INPUTS
- *      fapl_id - file access identifier
+ *  fapl_id - file access identifier
  * OUTPUTS
  *
- *              degree  - possible values are:
+ *  degree  - possible values are:
  *              		H5F_CLOSE_DEFAULT
  *              		H5F_CLOSE_WEAK
  *              		H5F_CLOSE_SEMI
  *              		H5F_CLOSE_STRONG
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Thursday, September 26, 2002
+ *  Thursday, September 26, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pget_fclose_degree_c ( hid_t_f *fapl_id , int_f *degree)
+h5pget_fclose_degree_c ( hid_t_f *fapl_id , int_f *degree)
 /******/
 {
   int ret_value = -1;
@@ -2198,28 +2096,28 @@ nh5pget_fclose_degree_c ( hid_t_f *fapl_id , int_f *degree)
 
 /****if* H5Pf/h5pset_fclose_degree_c
  * NAME
- *        h5pset_fclose_degree_c
+ *  h5pset_fclose_degree_c
  * PURPOSE
- *     Call H5Pset_fclose_degree to set file close behavior
+ *  Call H5Pset_fclose_degree to set file close behavior
  * INPUTS
- *      fapl_id - file access identifier
- *              degree  - possible values are:
+ *  fapl_id - file access identifier
+ *  degree  - possible values are:
  *              		H5F_CLOSE_DEFAULT
  *              		H5F_CLOSE_WEAK
  *              		H5F_CLOSE_SEMI
  *              		H5F_CLOSE_STRONG
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Thursday, September 26, 2002
+ *  Thursday, September 26, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pset_fclose_degree_c ( hid_t_f *fapl_id , int_f *degree)
+h5pset_fclose_degree_c ( hid_t_f *fapl_id , int_f *degree)
 /******/
 {
   int ret_value = -1;
@@ -2236,26 +2134,26 @@ nh5pset_fclose_degree_c ( hid_t_f *fapl_id , int_f *degree)
 
 /****if* H5Pf/h5pset_buffer_c
  * NAME
- *        h5pset_buffer_c
+ *  h5pset_buffer_c
  * PURPOSE
- *     Call H5Pset_buffer to set size of conversion buffer
+ *  Call H5Pset_buffer to set size of conversion buffer
  * INPUTS
- *      prp_id - t`dataset trasfer property list identifier
- *              size   - size of the buffer
+ *  prp_id - t`dataset trasfer property list identifier
+ *  size   - size of the buffer
  * OUTPUTS
  *     NONE
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, October 2, 2002
+ *  Wednesday, October 2, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pset_buffer_c ( hid_t_f *prp_id , hsize_t_f *size)
+h5pset_buffer_c ( hid_t_f *prp_id , hsize_t_f *size)
 /******/
 {
   int ret_value = 0;
@@ -2270,25 +2168,25 @@ nh5pset_buffer_c ( hid_t_f *prp_id , hsize_t_f *size)
 
 /****if* H5Pf/h5pget_buffer_c
  * NAME
- *        h5pget_buffer_c
+ *  h5pget_buffer_c
  * PURPOSE
- *     Call H5Pget_buffer to get size of conversion buffer
+ *  Call H5Pget_buffer to get size of conversion buffer
  * INPUTS
- *      prp_id - t`dataset trasfer property list identifier
+ *  prp_id - t`dataset trasfer property list identifier
  * OUTPUTS
- *     size - size of conversion buffer
+ *  size - size of conversion buffer
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, October 2, 2002
+ *  Wednesday, October 2, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pget_buffer_c ( hid_t_f *prp_id , hsize_t_f *size)
+h5pget_buffer_c ( hid_t_f *prp_id , hsize_t_f *size)
 /******/
 {
   int ret_value = -1;
@@ -2304,25 +2202,25 @@ nh5pget_buffer_c ( hid_t_f *prp_id , hsize_t_f *size)
 }
 /****if* H5Pf/h5pfill_value_defined_c
  * NAME
- *        h5pfill_value_defined_c
+ *  h5pfill_value_defined_c
  * PURPOSE
- *     Call H5Pfill_value_defined to check if fill value is defined
+ *  Call H5Pfill_value_defined to check if fill value is defined
  * INPUTS
- *      prp_id - dataset creation property list identifier
+ *  prp_id - dataset creation property list identifier
  * OUTPUTS
- *     flag - fill value status flag
+ *  flag - fill value status flag
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Friday, October 4, 2002
+ *  Friday, October 4, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pfill_value_defined_c ( hid_t_f *prp_id , int_f *flag)
+h5pfill_value_defined_c ( hid_t_f *prp_id , int_f *flag)
 /******/
 {
   int ret_value = -1;
@@ -2337,26 +2235,26 @@ nh5pfill_value_defined_c ( hid_t_f *prp_id , int_f *flag)
 }
 /****if* H5Pf/h5pget_alloc_time_c
  * NAME
- *        h5pget_alloc_time_c
+ *  h5pget_alloc_time_c
  * PURPOSE
- *     Call H5Pget_alloc_time to get space allocation
- *              time for dataset during creation
+ *  Call H5Pget_alloc_time to get space allocation
+ *  time for dataset during creation
  * INPUTS
- *      prp_id - dataset creation property list identifier
+ *  prp_id - dataset creation property list identifier
  * OUTPUTS
- *     flag - allocation time flag
+ *  flag - allocation time flag
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Friday, October 4, 2002
+ *  Friday, October 4, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pget_alloc_time_c ( hid_t_f *prp_id , int_f *flag)
+h5pget_alloc_time_c ( hid_t_f *prp_id , int_f *flag)
 /******/
 {
   int ret_value = -1;
@@ -2371,25 +2269,25 @@ nh5pget_alloc_time_c ( hid_t_f *prp_id , int_f *flag)
 }
 /****if* H5Pf/h5pset_alloc_time_c
  * NAME
- *        h5pset_alloc_time_c
+ *  h5pset_alloc_time_c
  * PURPOSE
- *     Call H5Pset_alloc_time to get space allocation
- *              time for dataset during creation
+ *  Call H5Pset_alloc_time to get space allocation
+ *  time for dataset during creation
  * INPUTS
- *      prp_id - dataset creation property list identifier
- *              flag - allocation time flag
+ *  prp_id - dataset creation property list identifier
+ *  flag - allocation time flag
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Friday, October 4, 2002
+ *  Friday, October 4, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pset_alloc_time_c ( hid_t_f *prp_id , int_f *flag)
+h5pset_alloc_time_c ( hid_t_f *prp_id , int_f *flag)
 /******/
 {
   int ret_value = -1;
@@ -2404,26 +2302,26 @@ nh5pset_alloc_time_c ( hid_t_f *prp_id , int_f *flag)
 }
 /****if* H5Pf/h5pget_fill_time_c
  * NAME
- *        h5pget_fill_time_c
+ *  h5pget_fill_time_c
  * PURPOSE
- *     Call H5Pget_fill_time to get fill value writing
- *              time for dataset during creation
+ *  Call H5Pget_fill_time to get fill value writing
+ *  time for dataset during creation
  * INPUTS
- *      prp_id - dataset creation property list identifier
+ *  prp_id - dataset creation property list identifier
  * OUTPUTS
- *     flag - fill value writing  time flag
+ *  flag - fill value writing  time flag
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Friday, October 4, 2002
+ *  Friday, October 4, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pget_fill_time_c ( hid_t_f *prp_id , int_f *flag)
+h5pget_fill_time_c ( hid_t_f *prp_id , int_f *flag)
 /******/
 {
   int ret_value = -1;
@@ -2438,25 +2336,25 @@ nh5pget_fill_time_c ( hid_t_f *prp_id , int_f *flag)
 }
 /****if* H5Pf/h5pset_fill_time_c
  * NAME
- *        h5pset_fill_time_c
+ *  h5pset_fill_time_c
  * PURPOSE
- *     Call H5Pset_fill_time to set fill value writing
- *              time for dataset during creation
+ *  Call H5Pset_fill_time to set fill value writing
+ *  time for dataset during creation
  * INPUTS
- *      prp_id - dataset creation property list identifier
- *              flag - fill value writing  time flag
+ *  prp_id - dataset creation property list identifier
+ *  flag - fill value writing  time flag
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Friday, October 4, 2002
+ *  Friday, October 4, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pset_fill_time_c ( hid_t_f *prp_id , int_f *flag)
+h5pset_fill_time_c ( hid_t_f *prp_id , int_f *flag)
 /******/
 {
   int ret_value = -1;
@@ -2471,26 +2369,26 @@ nh5pset_fill_time_c ( hid_t_f *prp_id , int_f *flag)
 }
 /****if* H5Pf/h5pset_meta_block_size_c
  * NAME
- *        h5pset_meta_block_size_c
+ *  h5pset_meta_block_size_c
  * PURPOSE
- *     Call H5Pset_meta_block_size to set size of  metadata block
+ *  Call H5Pset_meta_block_size to set size of  metadata block
  * INPUTS
- *      prp_id - file access  property list identifier
- *              size   - size of the metadata block
+ *  prp_id - file access  property list identifier
+ *  size   - size of the metadata block
  * OUTPUTS
  *     NONE
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, October 7, 2002
+ *  Monday, October 7, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pset_meta_block_size_c ( hid_t_f *prp_id , hsize_t_f *size)
+h5pset_meta_block_size_c ( hid_t_f *prp_id , hsize_t_f *size)
 /******/
 {
   int ret_value = 0;
@@ -2504,26 +2402,26 @@ nh5pset_meta_block_size_c ( hid_t_f *prp_id , hsize_t_f *size)
 }
 /****if* H5Pf/h5pget_meta_block_size_c
  * NAME
- *        h5pget_meta_block_size_c
+ *  h5pget_meta_block_size_c
  * PURPOSE
- *     Call H5Pget_meta_block_size to get size of  metadata block
+ *  Call H5Pget_meta_block_size to get size of  metadata block
  * INPUTS
- *      prp_id - file access  property list identifier
+ *  prp_id - file access  property list identifier
  * OUTPUTS
  *
- *              size   - size of the metadata block
+ *  size   - size of the metadata block
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, October 7, 2002
+ *  Monday, October 7, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pget_meta_block_size_c ( hid_t_f *prp_id , hsize_t_f *size)
+h5pget_meta_block_size_c ( hid_t_f *prp_id , hsize_t_f *size)
 /******/
 {
   int ret_value = 0;
@@ -2537,26 +2435,26 @@ nh5pget_meta_block_size_c ( hid_t_f *prp_id , hsize_t_f *size)
 }
 /****if* H5Pf/h5pset_sieve_buf_size_c
  * NAME
- *        h5pset_sieve_buf_size_c
+ *  h5pset_sieve_buf_size_c
  * PURPOSE
- *     Call H5Pset_sieve_buf_size to set size of datasieve buffer
+ *  Call H5Pset_sieve_buf_size to set size of datasieve buffer
  * INPUTS
- *      prp_id - file access  property list identifier
- *              size   - size of the buffer
+ *  prp_id - file access  property list identifier
+ *  size   - size of the buffer
  * OUTPUTS
  *     NONE
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, October 7, 2002
+ *  Monday, October 7, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pset_sieve_buf_size_c ( hid_t_f *prp_id , size_t_f *size)
+h5pset_sieve_buf_size_c ( hid_t_f *prp_id , size_t_f *size)
 /******/
 {
   int ret_value = 0;
@@ -2570,26 +2468,26 @@ nh5pset_sieve_buf_size_c ( hid_t_f *prp_id , size_t_f *size)
 }
 /****if* H5Pf/h5pget_sieve_buf_size_c
  * NAME
- *        h5pget_sieve_buf_size_c
+ *  h5pget_sieve_buf_size_c
  * PURPOSE
- *     Call H5Pget_sieve_buf_size to get size of datasieve buffer
+ *  Call H5Pget_sieve_buf_size to get size of datasieve buffer
  * INPUTS
- *      prp_id - file access  property list identifier
+ *  prp_id - file access  property list identifier
  * OUTPUTS
  *
- *              size   - size of the buffer
+ *  size   - size of the buffer
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, October 7, 2002
+ *  Monday, October 7, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pget_sieve_buf_size_c ( hid_t_f *prp_id , size_t_f *size)
+h5pget_sieve_buf_size_c ( hid_t_f *prp_id , size_t_f *size)
 /******/
 {
   int ret_value = 0;
@@ -2603,26 +2501,26 @@ nh5pget_sieve_buf_size_c ( hid_t_f *prp_id , size_t_f *size)
 }
 /****if* H5Pf/h5pset_small_data_block_size_c
  * NAME
- *        h5pset_small_data_block_size_c
+ *  h5pset_small_data_block_size_c
  * PURPOSE
- *     Call H5Pset_small_data_block_size to set size of raw small data block
+ *  Call H5Pset_small_data_block_size to set size of raw small data block
  * INPUTS
- *      prp_id - file access  property list identifier
- *              size   - size of the block
+ *  prp_id - file access  property list identifier
+ *  size   - size of the block
  * OUTPUTS
  *     NONE
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, October 7, 2002
+ *  Monday, October 7, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pset_small_data_block_size_c ( hid_t_f *prp_id , hsize_t_f *size)
+h5pset_small_data_block_size_c ( hid_t_f *prp_id , hsize_t_f *size)
 /******/
 {
   int ret_value = 0;
@@ -2636,26 +2534,26 @@ nh5pset_small_data_block_size_c ( hid_t_f *prp_id , hsize_t_f *size)
 }
 /****if* H5Pf/h5pget_small_data_block_size_c
  * NAME
- *        h5pget_small_data_block_size_c
+ *  h5pget_small_data_block_size_c
  * PURPOSE
- *     Call H5Pget_small_data_block_size to get size of raw small data block
+ *  Call H5Pget_small_data_block_size to get size of raw small data block
  * INPUTS
- *      prp_id - file access  property list identifier
+ *  prp_id - file access  property list identifier
  * OUTPUTS
  *
- *              size   - size of the block
+ *  size   - size of the block
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, October 7, 2002
+ *  Monday, October 7, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pget_small_data_block_size_c ( hid_t_f *prp_id , hsize_t_f *size)
+h5pget_small_data_block_size_c ( hid_t_f *prp_id , hsize_t_f *size)
 /******/
 {
   int ret_value = 0;
@@ -2669,26 +2567,26 @@ nh5pget_small_data_block_size_c ( hid_t_f *prp_id , hsize_t_f *size)
 }
 /****if* H5Pf/h5pset_hyper_vector_size_c
  * NAME
- *        h5pset_hyper_vector_size_c
+ *  h5pset_hyper_vector_size_c
  * PURPOSE
- *     Call H5Pset_hyper_vector_size to set size of the hyper vector
+ *  Call H5Pset_hyper_vector_size to set size of the hyper vector
  * INPUTS
- *      prp_id - dataset transfer property list identifier
- *              size   - size of the vector
+ *  prp_id - dataset transfer property list identifier
+ *  size   - size of the vector
  * OUTPUTS
  *     NONE
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, October 7, 2002
+ *  Monday, October 7, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pset_hyper_vector_size_c ( hid_t_f *prp_id , size_t_f *size)
+h5pset_hyper_vector_size_c ( hid_t_f *prp_id , size_t_f *size)
 /******/
 {
   int ret_value = 0;
@@ -2702,26 +2600,26 @@ nh5pset_hyper_vector_size_c ( hid_t_f *prp_id , size_t_f *size)
 }
 /****if* H5Pf/h5pget_hyper_vector_size_c
  * NAME
- *        h5pget_hyper_vector_size_c
+ *  h5pget_hyper_vector_size_c
  * PURPOSE
- *     Call H5Pget_hyper_vector_size to get size of the hyper vector
+ *  Call H5Pget_hyper_vector_size to get size of the hyper vector
  * INPUTS
- *      prp_id - dataset transfer property list identifier
+ *  prp_id - dataset transfer property list identifier
  * OUTPUTS
  *
- *              size   - size of the vector
+ *  size   - size of the vector
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, October 7, 2002
+ *  Monday, October 7, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pget_hyper_vector_size_c ( hid_t_f *prp_id , size_t_f *size)
+h5pget_hyper_vector_size_c ( hid_t_f *prp_id , size_t_f *size)
 /******/
 {
   int ret_value = 0;
@@ -2733,36 +2631,6 @@ nh5pget_hyper_vector_size_c ( hid_t_f *prp_id , size_t_f *size)
   *size = (size_t_f)c_size;
   return ret_value;
 }
-/****if* H5Pf/h5pcreate_class_c
- * NAME
- *  h5pcreate_class_c
- * PURPOSE
- *  Call H5Pcreate_class to create a new property class
- * INPUTS
- *  parent - property list class identifier
- *  name   - name of the new class
- *  name_len - lenght of the "name" buffer
- * OUTPUTS
- *  cls - new class identifier
- * RETURNS
- *  0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *  October 11, 2002
- *
- * HISTORY
- * SOURCE
-*/
-int_f
-nh5pcreate_class_f90_c(hid_t_f *parent, _fcd name, int_f *name_len, hid_t_f *cls)
-/******/
-{
-     int ret_value = -1;
-
-     ret_value = h5pcreate_class_c(parent, name, name_len, cls, NULL, NULL, NULL, NULL, NULL, NULL);
-     return  ret_value;
-}
-
 
 /****if* H5Pf/h5pcreate_class_c
  * NAME
@@ -2814,18 +2682,17 @@ DONE:
      return ret_value;
 }
 
-
-/****if* H5Pf/h5pregisterc_c
+/****if* H5Pf/h5pregister_c
  * NAME
- *  h5pregisterc_c
+ *  h5pregister_c
  * PURPOSE
- *  Call h5pregister_c to registers a permanent property
+ *  Call H5Pregister2 to registers a permanent property
  * INPUTS
  *  class - property list class identifier
  *  name   - name of the new property
  *  name_len - length of the "name" buffer
  *  size - property size
- *  value - property value of character type
+ *  value - property value
  * RETURNS
  *  0 on success, -1 on failure
  * AUTHOR
@@ -2836,54 +2703,21 @@ DONE:
  * SOURCE
 */
 int_f
-nh5pregisterc_c(hid_t_f *cls, _fcd name, int_f *name_len, size_t_f *size, _fcd value, int_f H5_ATTR_UNUSED *value_len)
+h5pregister_c(hid_t_f *cls, _fcd name, int_f *name_len, size_t_f *size, void H5_ATTR_UNUSED *value)
 /******/
 {
-     int ret_value = -1;
+     char* c_name = NULL;
+     int_f ret_value = -1;
+
+     if(NULL == (c_name = (char *)HD5f2cstring(name, (size_t)*name_len)))
+         goto DONE;
 
      /*
-      * Call h5pregister_c function
+      * Call H5Pregister2 function.
       */
-      ret_value = h5pregister_c(cls, name, name_len, size, _fcdtocp(value));
-      return ret_value;
-}
-
-/****if* H5Pf/h5pregister_c
- * NAME
- *  h5pregister_c
- * PURPOSE
- *  Call H5Pregister2 to registers a permanent property
- * INPUTS
- *  class - property list class identifier
- *  name   - name of the new property
- *  name_len - length of the "name" buffer
- *  size - property size
- *  value - property value
- * RETURNS
- *  0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *  October 11, 2002
- * HISTORY
- *
- * SOURCE
-*/
-int_f
-h5pregister_c(hid_t_f *cls, _fcd name, int_f *name_len, size_t_f *size, void H5_ATTR_UNUSED *value)
-/******/
-{
-     char* c_name = NULL;
-     int_f ret_value = -1;
-
-     if(NULL == (c_name = (char *)HD5f2cstring(name, (size_t)*name_len)))
-         goto DONE;
-
-     /*
-      * Call H5Pregister2 function.
-      */
-     if(H5Pregister2((hid_t)*cls, c_name, (size_t)*size, value, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
-         goto DONE;
-     ret_value = 0;
+     if(H5Pregister2((hid_t)*cls, c_name, (size_t)*size, value, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+         goto DONE;
+     ret_value = 0;
 
 DONE:
      if(c_name != NULL)
@@ -2891,66 +2725,6 @@ DONE:
      return ret_value;
 }
 
-int_f
-nh5pregister_integer_c(hid_t_f *cls, _fcd name, int_f *name_len, size_t_f *size, void *value)
-{
-     /*
-      * Call h5pregister_c function
-      */
-     return h5pregister_c(cls, name, name_len, size, value);
-}
-
-int_f
-nh5pregister_real_c(hid_t_f *cls, _fcd name, int_f *name_len, size_t_f *size, void *value)
-{
-     /*
-      * Call h5pregister_c function
-      */
-     return h5pregister_c(cls, name, name_len, size, value);
-}
-
-int_f
-nh5pregister_double_c(hid_t_f *cls, _fcd name, int_f *name_len, size_t_f *size, void *value)
-{
-     /*
-      * Call h5pregister_c function
-      */
-     return h5pregister_c(cls, name, name_len, size, value);
-}
-
-/****if* H5Pf/h5pinsertc_c
- * NAME
- *  h5pinsertc_c
- * PURPOSE
- *  Call h5pinsert_c to register a temporary property
- * INPUTS
- *  plist - property list identifier
- *  name   - name of the new property
- *  name_len - length of the "name" buffer
- *  size - property size
- *  value - property value of character type
- * RETURNS
- *  0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *  October 11, 2002
- * HISTORY
- *
- * SOURCE
-*/
-int_f
-nh5pinsertc_c(hid_t_f *plist, _fcd name, int_f *name_len, size_t_f *size, _fcd value, int_f H5_ATTR_UNUSED *value_len)
-/******/
-{
-     int_f ret_value = -1;
-
-     /*
-      * Call h5pinsert_c function
-      */
-      ret_value = h5pinsert_c(plist, name, name_len, size, _fcdtocp(value));
-      return ret_value;
-}
-
 /****if* H5Pf/h5pinsert_c
  * NAME
  *  h5pinsert_c
@@ -2994,54 +2768,27 @@ DONE:
      return ret_value;
 }
 
-int_f
-nh5pinsert_integer_c(hid_t_f *plist, _fcd name, int_f *name_len, size_t_f *size, void *value)
-{
-     /*
-      * Call h5pinsert_c function
-      */
-     return h5pinsert_c(plist, name, name_len, size, value);
-}
-
-int_f
-nh5pinsert_real_c(hid_t_f *plist, _fcd name, int_f *name_len, size_t_f *size, void *value)
-{
-     /*
-      * Call h5pinsert_c function
-      */
-     return h5pinsert_c(plist, name, name_len, size, value);
-}
-
-int_f
-nh5pinsert_double_c(hid_t_f *plist, _fcd name, int_f *name_len, size_t_f *size, void *value)
-{
-     /*
-      * Call h5pinsert_c function
-      */
-     return h5pinsert_c(plist, name, name_len, size, value);
-}
-
 /****if* H5Pf/h5pexist_c
  * NAME
- *        h5pexist_c
+ *  h5pexist_c
  * PURPOSE
- *     Call H5Pexist to querie whether a property name exists
- *              in a property list or class
+ *  Call H5Pexist to querie whether a property name exists
+ *  in a property list or class
  * INPUTS
- *      plist - property list or property class identifier
- *              name   - name of the new property
- *              name_len - length of the "name" buffer
+ *  plist - property list or property class identifier
+ *  name   - name of the new property
+ *  name_len - length of the "name" buffer
  * RETURNS
- *     nonnegative on success, -1 on failure
+ *  nonnegative on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              October 11, 2002
+ *  October 11, 2002
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pexist_c(hid_t_f *cls, _fcd name, int_f *name_len)
+h5pexist_c(hid_t_f *cls, _fcd name, int_f *name_len)
 /******/
 {
      int_f ret_value = -1;
@@ -3065,24 +2812,24 @@ DONE:
 }
 /****if* H5Pf/h5pisa_class_c
  * NAME
- *        h5pisa_class_c
+ *  h5pisa_class_c
  * PURPOSE
- *     Call H5Pisa_class to querie whether a property is a
- *              member of a class
+ *  Call H5Pisa_class to querie whether a property is a
+ *  member of a class
  * INPUTS
- *      plist - property list identifier
- *              cls - property class identifier
+ *  plist - property list identifier
+ *  cls - property class identifier
  * RETURNS
- *     nonnegative on success, -1 on failure
+ *  nonnegative on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              October 11, 2002
+ *  October 11, 2002
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pisa_class_c(hid_t_f *plist, hid_t_f *cls)
+h5pisa_class_c(hid_t_f *plist, hid_t_f *cls)
 /******/
 {
      int_f ret_value = -1;
@@ -3102,26 +2849,26 @@ nh5pisa_class_c(hid_t_f *plist, hid_t_f *cls)
 }
 /****if* H5Pf/h5pget_size_c
  * NAME
- *        h5pget_size_c
+ *  h5pget_size_c
  * PURPOSE
- *     Call H5Pget_size to querie the size of the property
+ *  Call H5Pget_size to querie the size of the property
  * INPUTS
- *      plist - property list to query
- *              name   - name of the property
- *              name_len - length of the "name" buffer
+ *  plist - property list to query
+ *  name   - name of the property
+ *  name_len - length of the "name" buffer
  * OUTPUTS
- *     size - size of the property in bytes
+ *  size - size of the property in bytes
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              October 11, 2002
+ *  October 11, 2002
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_size_c(hid_t_f *plist, _fcd name, int_f *name_len, size_t_f *size)
+h5pget_size_c(hid_t_f *plist, _fcd name, int_f *name_len, size_t_f *size)
 /******/
 {
      int_f ret_value = -1;
@@ -3146,24 +2893,24 @@ DONE:
 }
 /****if* H5Pf/h5pget_nprops_c
  * NAME
- *        h5pget_nprops_c
+ *  h5pget_nprops_c
  * PURPOSE
- *     Call H5Pget_nporps to get number of the properties in the list
+ *  Call H5Pget_nporps to get number of the properties in the list
  * INPUTS
- *      plist - property list to query
+ *  plist - property list to query
  * OUTPUTS
- *     nprops - number of properties in the list
+ *  nprops - number of properties in the list
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              October 11, 2002
+ *  October 11, 2002
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_nprops_c(hid_t_f *plist, size_t_f *nprops)
+h5pget_nprops_c(hid_t_f *plist, size_t_f *nprops)
 /******/
 {
      int_f ret_value = -1;
@@ -3183,25 +2930,25 @@ nh5pget_nprops_c(hid_t_f *plist, size_t_f *nprops)
 }
 /****if* H5Pf/h5pget_class_parent_c
  * NAME
- *        h5pget_class_parent_c
+ *  h5pget_class_parent_c
  * PURPOSE
- *     Call H5Pget_class_parent to get the parent class of
- *              a genereic property class
+ *  Call H5Pget_class_parent to get the parent class of
+ *  a genereic property class
  * INPUTS
- *      prp_id - property list to query
+ *  prp_id - property list to query
  * OUTPUTS
- *     parent_id - parent classs identifier
+ *  parent_id - parent classs identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              October 11, 2002
+ *  October 11, 2002
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_class_parent_c(hid_t_f *prp_id, hid_t_f *parent_id)
+h5pget_class_parent_c(hid_t_f *prp_id, hid_t_f *parent_id)
 /******/
 {
      int_f ret_value = -1;
@@ -3222,26 +2969,26 @@ nh5pget_class_parent_c(hid_t_f *prp_id, hid_t_f *parent_id)
 }
 /****if* H5Pf/h5pcopy_prop_c
  * NAME
- *        h5pcopy_prop_c
+ *  h5pcopy_prop_c
  * PURPOSE
- *     Call H5Pcopy_prop to copy a property from one list or
- *              class to another
+ *  Call H5Pcopy_prop to copy a property from one list or
+ *  class to another
  * INPUTS
- *      dst_id - identifier of destination property list
- *              src_id - identifier of source property list
- *              name   - name of the property
- *              name_len - length of the "name" buffer
+ *  dst_id - identifier of destination property list
+ *  src_id - identifier of source property list
+ *  name   - name of the property
+ *  name_len - length of the "name" buffer
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              October 11, 2002
+ *  October 11, 2002
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pcopy_prop_c(hid_t_f *dst_id, hid_t_f *src_id, _fcd name, int_f *name_len)
+h5pcopy_prop_c(hid_t_f *dst_id, hid_t_f *src_id, _fcd name, int_f *name_len)
 /******/
 {
      int_f ret_value = -1;
@@ -3265,24 +3012,24 @@ DONE:
 }
 /****if* H5Pf/h5premove_c
  * NAME
- *        h5premove_c
+ *  h5premove_c
  * PURPOSE
- *     Call H5Premove to remove a property from a list
+ *  Call H5Premove to remove a property from a list
  * INPUTS
- *      plid - identifier of property list
- *              name   - name of the property to remove
- *              name_len - length of the "name" buffer
+ *  plid - identifier of property list
+ *  name   - name of the property to remove
+ *  name_len - length of the "name" buffer
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              October 11, 2002
+ *  October 11, 2002
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5premove_c(hid_t_f *plid, _fcd name, int_f *name_len)
+h5premove_c(hid_t_f *plid, _fcd name, int_f *name_len)
 /******/
 {
      int_f ret_value = -1;
@@ -3305,15 +3052,15 @@ DONE:
 }
 /****if* H5Pf/h5punregister_c
  * NAME
- *        h5punregister_c
+ *  h5punregister_c
  * PURPOSE
- *     Call H5Punregister to remove a property from a property class
+ *  Call H5Punregister to remove a property from a property class
  * INPUTS
- *      cls - identifier of property class
- *              name   - name of the property to unregister
- *              name_len - length of the "name" buffer
+ *  cls - identifier of property class
+ *  name   - name of the property to unregister
+ *  name_len - length of the "name" buffer
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
  *  October 11, 2002
@@ -3322,7 +3069,7 @@ DONE:
  * SOURCE
 */
 int_f
-nh5punregister_c(hid_t_f *cls, _fcd name, int_f *name_len)
+h5punregister_c(hid_t_f *cls, _fcd name, int_f *name_len)
 /******/
 {
      int_f ret_value = -1;
@@ -3345,13 +3092,13 @@ DONE:
 }
 /****if* H5Pf/h5pclose_class_c
  * NAME
- *        h5pclose_class_c
+ *  h5pclose_class_c
  * PURPOSE
- *     Call H5Pclose_class to close property class
+ *  Call H5Pclose_class to close property class
  * INPUTS
- *      class - identifier of property class to close
+ *  class - identifier of property class to close
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
  *  October 11, 2002
@@ -3360,7 +3107,7 @@ DONE:
  * SOURCE
 */
 int_f
-nh5pclose_class_c(hid_t_f *cls)
+h5pclose_class_c(hid_t_f *cls)
 /******/
 {
      int_f ret_value = -1;
@@ -3377,15 +3124,15 @@ nh5pclose_class_c(hid_t_f *cls)
 
 /****if* H5Pf/h5pget_class_name_c
  * NAME
- *        h5pget_class_name_c
+ *  h5pget_class_name_c
  * PURPOSE
- *     Call H5Pget_class_name to get property class name
+ *  Call H5Pget_class_name to get property class name
  * INPUTS
- *              cls - identifier of property class
- *              name - buffer to retrieve name in
- *              name_len - length of the "name" buffer
+ *  cls - identifier of property class
+ *  name - buffer to retrieve name in
+ *  name_len - length of the "name" buffer
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
  *  October 11, 2002
@@ -3394,7 +3141,7 @@ nh5pclose_class_c(hid_t_f *cls)
  * SOURCE
 */
 int_f
-nh5pget_class_name_c(hid_t_f *cls, _fcd name, int_f *name_len)
+h5pget_class_name_c(hid_t_f *cls, _fcd name, int_f *name_len)
 /******/
 {
      int_f ret_value = -1;
@@ -3417,38 +3164,6 @@ DONE:
      return ret_value;
 }
 
-/****if* H5Pf/h5psetc_c
- * NAME
- *        h5psetc_c
- * PURPOSE
- *     Call h5setc_c to set property with the character string value
- * INPUTS
- *      plist - property list identifier
- *              name   - name of property
- *              name_len - length of the "name" buffer
- *              value - property value of character type
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              October 11, 2002
- * HISTORY
- *
- * SOURCE
-*/
-int_f
-nh5psetc_c(hid_t_f *plist, _fcd name, int_f *name_len, _fcd value, int_f H5_ATTR_UNUSED *value_len)
-/******/
-{
-     int_f ret_value = -1;
-
-     /*
-      * Call h5pset_c function
-      */
-      ret_value = h5pset_c(plist, name, name_len, _fcdtocp(value));
-      return ret_value;
-}
-
 /****if* H5Pf/h5pset_c
  * NAME
  *  h5pset_c
@@ -3489,64 +3204,6 @@ DONE:
      return ret_value;
 }
 
-int_f
-nh5pset_integer_c(hid_t_f *plist, _fcd name, int_f *name_len, void *value)
-{
-     /*
-      * Call h5pset_c function
-      */
-     return h5pset_c(plist, name, name_len, value);
-}
-
-int_f
-nh5pset_real_c(hid_t_f *plist, _fcd name, int_f *name_len, void *value)
-{
-     /*
-      * Call h5pset_c function
-      */
-     return h5pset_c(plist, name, name_len, value);
-}
-
-int_f
-nh5pset_double_c(hid_t_f *plist, _fcd name, int_f *name_len, void *value)
-{
-     /*
-      * Call h5pset_c function
-      */
-     return h5pset_c(plist, name, name_len, value);
-}
-/****if* H5Pf/h5pgetc_c
- * NAME
- *        h5pgetc_c
- * PURPOSE
- *     Call h5set_c to set property with the character string value
- * INPUTS
- *      plist - property list identifier
- *              name   - name of property
- *              name_len - length of the "name" buffer
- * Output:      value - property value of character type
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *              October 11, 2002
- * HISTORY
- *
- * SOURCE
-*/
-int_f
-nh5pgetc_c(hid_t_f *plist, _fcd name, int_f *name_len, _fcd value, int_f H5_ATTR_UNUSED *value_len)
-/******/
-{
-     int_f ret_value = -1;
-
-     /*
-      * Call h5pget_c function
-      */
-      ret_value = h5pget_c(plist, name, name_len, _fcdtocp(value));
-      return ret_value;
-}
-
 /****if* H5Pf/h5pget_c
  * NAME
  *  h5pget_c
@@ -3556,7 +3213,7 @@ nh5pgetc_c(hid_t_f *plist, _fcd name, int_f *name_len, _fcd value, int_f H5_ATTR
  *  plist   - property list class identifier
  *  name     - name of the new property
  *  name_len - length of the "name" buffer
- * Output:  
+ *  Output:  
  *  value - property value
  * RETURNS
  *  0 on success, -1 on failure
@@ -3588,54 +3245,26 @@ DONE:
      return ret_value;
 }
 
-int_f
-nh5pget_integer_c(hid_t_f *plist, _fcd name, int_f *name_len, void *value)
-{
-     /*
-      * Call h5pget_c function
-      */
-     return h5pget_c(plist, name, name_len, value);
-}
-
-int_f
-nh5pget_real_c(hid_t_f *plist, _fcd name, int_f *name_len, void *value)
-{
-     /*
-      * Call h5pget_c function
-      */
-     return h5pget_c(plist, name, name_len, value);
-}
-
-int_f
-nh5pget_double_c(hid_t_f *plist, _fcd name, int_f *name_len, void *value)
-{
-     /*
-      * Call h5pget_c function
-      */
-     return h5pget_c(plist, name, name_len, value);
-}
-
-
 /****if* H5Pf/h5pset_shuffle_c
  * NAME
- *        h5pset_shuffle_c
+ *  h5pset_shuffle_c
  * PURPOSE
- *     Call H5Pset_shuffle
+ *  Call H5Pset_shuffle
  * INPUTS
- *      prp_id - property list identifier
- *              type_size - size of the datatype in bytes
+ *  prp_id - property list identifier
+ *  type_size - size of the datatype in bytes
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, March 12, 2003
+ *  Wednesday, March 12, 2003
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pset_shuffle_c ( hid_t_f *prp_id )
+h5pset_shuffle_c ( hid_t_f *prp_id )
 /******/
 {
   int_f ret_value = 0;
@@ -3649,23 +3278,23 @@ nh5pset_shuffle_c ( hid_t_f *prp_id )
 }
 /****if* H5Pf/h5pset_fletcher32_c
  * NAME
- *        h5pset_fletcher32_c
+ *  h5pset_fletcher32_c
  * PURPOSE
- *     Call H5Pset_fletcher32 to enable EDC
+ *  Call H5Pset_fletcher32 to enable EDC
  * INPUTS
- *      prp_id - dataset creation property list identifier
+ *  prp_id - dataset creation property list identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Thursday, March 13, 2003
+ *  Thursday, March 13, 2003
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pset_fletcher32_c ( hid_t_f *prp_id )
+h5pset_fletcher32_c ( hid_t_f *prp_id )
 /******/
 {
   int_f ret_value = 0;
@@ -3680,24 +3309,24 @@ nh5pset_fletcher32_c ( hid_t_f *prp_id )
 
 /****if* H5Pf/h5pset_edc_check_c
  * NAME
- *        h5pset_edc_check_c
+ *  h5pset_edc_check_c
  * PURPOSE
- *     Call H5Pset_edc_check to enable EDC
+ *  Call H5Pset_edc_check to enable EDC
  * INPUTS
- *      prp_id - dataset transfer property list identifier
- *              flag   - EDC flag
+ *  prp_id - dataset transfer property list identifier
+ *  flag   - EDC flag
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Thursday, March 13, 2003
+ *  Thursday, March 13, 2003
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pset_edc_check_c ( hid_t_f *prp_id, int_f *flag )
+h5pset_edc_check_c ( hid_t_f *prp_id, int_f *flag )
 /******/
 {
   int_f ret_value = 0;
@@ -3714,24 +3343,24 @@ nh5pset_edc_check_c ( hid_t_f *prp_id, int_f *flag )
 
 /****if* H5Pf/h5pget_edc_check_c
  * NAME
- *        h5pget_edc_check_c
+ *  h5pget_edc_check_c
  * PURPOSE
- *     Call H5Pget_edc_check to query EDC
+ *  Call H5Pget_edc_check to query EDC
  * INPUTS
- *      prp_id - dataset transfer property list identifier
- * Outouts:     flag   - EDC flag
+ *  prp_id - dataset transfer property list identifier
+ *  Outouts:     flag   - EDC flag
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Thursday, March 13, 2003
+ *  Thursday, March 13, 2003
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pget_edc_check_c ( hid_t_f *prp_id, int_f *flag )
+h5pget_edc_check_c ( hid_t_f *prp_id, int_f *flag )
 /******/
 {
   int_f ret_value = 0;
@@ -3746,24 +3375,24 @@ nh5pget_edc_check_c ( hid_t_f *prp_id, int_f *flag )
 }
 /****if* H5Pf/h5pset_family_offset_c
  * NAME
- *        h5pset_family_offset_c
+ *  h5pset_family_offset_c
  * PURPOSE
- *     Call H5Pset_family_offset to set and offset for family driver
+ *  Call H5Pset_family_offset to set and offset for family driver
  * INPUTS
- *      prp_id - property list identifier
- *              offset - offset in bytes
+ *  prp_id - property list identifier
+ *  offset - offset in bytes
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, 19 March 2003
+ *  Wednesday, 19 March 2003
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pset_family_offset_c ( hid_t_f *prp_id , hsize_t_f *offset)
+h5pset_family_offset_c ( hid_t_f *prp_id , hsize_t_f *offset)
 /******/
 {
   int_f ret_value = 0;
@@ -3780,30 +3409,30 @@ nh5pset_family_offset_c ( hid_t_f *prp_id , hsize_t_f *offset)
 
 /****if* H5Pf/h5pset_fapl_multi_c
  * NAME
- *        h5pset_fapl_multi_c
+ *  h5pset_fapl_multi_c
  * PURPOSE
- *     Call H5Pset_fapl_multi to set multi file dirver
+ *  Call H5Pset_fapl_multi to set multi file dirver
  * INPUTS
- *      prp_id - file_creation property list identifier
- *              mem_map - memory mapping array
- *              memb_fapl - property list for each memory usage type
- *              memb_name - array with members names
- *              len - array with the lenght of each name
- *              lenmax - lenght of the name a sdeclared in Fortran
- *              flag - flag allowing partila access when one of the files is missing
+ *  prp_id - file_creation property list identifier
+ *  mem_map - memory mapping array
+ *  memb_fapl - property list for each memory usage type
+ *  memb_name - array with members names
+ *  len - array with the lenght of each name
+ *  lenmax - lenght of the name a sdeclared in Fortran
+ *  flag - flag allowing partila access when one of the files is missing
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday 24, March 2003
+ *  Monday 24, March 2003
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-/*nh5pset_fapl_multi_c ( hid_t_f *prp_id , int_f *memb_map, hid_t_f *memb_fapl, _fcd memb_name, int_f *len, int_f *lenmax, haddr_t_f *memb_addr, int_f *flag) */
-nh5pset_fapl_multi_c ( hid_t_f *prp_id , int_f *memb_map, hid_t_f *memb_fapl, _fcd memb_name, int_f *len, int_f *lenmax, real_f *memb_addr, int_f *flag)
+/*h5pset_fapl_multi_c ( hid_t_f *prp_id , int_f *memb_map, hid_t_f *memb_fapl, _fcd memb_name, int_f *len, int_f *lenmax, haddr_t_f *memb_addr, int_f *flag) */
+h5pset_fapl_multi_c ( hid_t_f *prp_id , int_f *memb_map, hid_t_f *memb_fapl, _fcd memb_name, int_f *len, int_f *lenmax, real_f *memb_addr, int_f *flag)
 /******/
 {
   int_f ret_value = -1;
@@ -3821,13 +3450,13 @@ nh5pset_fapl_multi_c ( hid_t_f *prp_id , int_f *memb_map, hid_t_f *memb_fapl, _f
   c_lenmax = (int)*lenmax;
   relax = (hbool_t)*flag;
 /*
- * Check that we got correct values from Fortran for memb_addr array
+ *  Check that we got correct values from Fortran for memb_addr array
  */
   for (i=0; i < H5FD_MEM_NTYPES; i++) {
        if(memb_addr[i] >= 1.0f) return ret_value;
   }
 /*
- * Take care of names array
+ *  Take care of names array
  */
 
   tmp = (char *)HD5f2cstring(memb_name, (size_t)c_lenmax*(H5FD_MEM_NTYPES));
@@ -3841,7 +3470,7 @@ nh5pset_fapl_multi_c ( hid_t_f *prp_id , int_f *memb_map, hid_t_f *memb_fapl, _f
        tmp_p = tmp_p + c_lenmax;
  }
 /*
- * Take care of othe arguments
+ *  Take care of othe arguments
  */
   tmp_max_addr =  (long double)(HADDR_MAX);
   c_prp_id = (hid_t)*prp_id;
@@ -3852,7 +3481,7 @@ nh5pset_fapl_multi_c ( hid_t_f *prp_id , int_f *memb_map, hid_t_f *memb_fapl, _f
        else c_memb_addr[i] = (haddr_t)(((float)memb_addr[i])*(tmp_max_addr));
   }
 /*
- * Call  H5Pset_fapl_multi function
+ *  Call  H5Pset_fapl_multi function
  */
 
   status = H5Pset_fapl_multi(c_prp_id, c_memb_map, c_memb_fapl, (const char * const *)c_memb_name, c_memb_addr, relax);
@@ -3868,23 +3497,23 @@ DONE:
 
 /****if* H5Pf/h5pset_fapl_multi_sc
  * NAME
- *        h5pset_fapl_multi_sc
+ *  h5pset_fapl_multi_sc
  * PURPOSE
- *     Call H5Pset_fapl_multi to set multi file dirver
+ *  Call H5Pset_fapl_multi to set multi file dirver
  * INPUTS
- *      prp_id - file_creation property list identifier
+ *  prp_id - file_creation property list identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              March 31 2003
+ *  March 31 2003
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pset_fapl_multi_sc ( hid_t_f *prp_id , int_f *flag)
+h5pset_fapl_multi_sc ( hid_t_f *prp_id , int_f *flag)
 /******/
 {
   int_f ret_value = -1;
@@ -3895,7 +3524,7 @@ nh5pset_fapl_multi_sc ( hid_t_f *prp_id , int_f *flag)
   relax = (hbool_t)*flag;
   c_prp_id = (hid_t)*prp_id;
 /*
- * Call  H5Pset_fapl_multi function
+ *  Call  H5Pset_fapl_multi function
  */
 
   status = H5Pset_fapl_multi(c_prp_id, NULL, NULL, NULL, NULL, relax);
@@ -3905,30 +3534,30 @@ nh5pset_fapl_multi_sc ( hid_t_f *prp_id , int_f *flag)
 }
 /****if* H5Pf/h5pget_fapl_multi_c
  * NAME
- *        h5pget_fapl_multi_c
+ *  h5pget_fapl_multi_c
  * PURPOSE
- *     Call H5Pget_fapl_multi to set multi file dirver
+ *  Call H5Pget_fapl_multi to set multi file dirver
  * INPUTS
- *      prp_id - file_creation property list identifier
- *              lenmax - lenght of the name a sdeclared in Fortran
+ *  prp_id - file_creation property list identifier
+ *  lenmax - lenght of the name a sdeclared in Fortran
  * OUTPUTS
- *     memb_map - memory mapping array
- *              memb_fapl - property list for each memory usage type
- *              memb_name - array with members names
- *              len - array with the lenght of each name
- *              flag - flag allowing partila access when one of the files is missing
+ *  memb_map - memory mapping array
+ *  memb_fapl - property list for each memory usage type
+ *  memb_name - array with members names
+ *  len - array with the lenght of each name
+ *  flag - flag allowing partila access when one of the files is missing
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday 24, March 2003
+ *  Monday 24, March 2003
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pget_fapl_multi_c ( hid_t_f *prp_id , int_f *memb_map, hid_t_f *memb_fapl, _fcd memb_name, int_f *len, int_f *lenmax, real_f *memb_addr, int_f *flag, int_f *maxlen_out)
+h5pget_fapl_multi_c ( hid_t_f *prp_id , int_f *memb_map, hid_t_f *memb_fapl, _fcd memb_name, int_f *len, int_f *lenmax, real_f *memb_addr, int_f *flag, int_f *maxlen_out)
 /******/
 {
   int_f ret_value = -1;
@@ -3947,14 +3576,14 @@ nh5pget_fapl_multi_c ( hid_t_f *prp_id , int_f *memb_map, hid_t_f *memb_fapl, _f
 
   c_prp_id = (hid_t)*prp_id;
 /*
- * Call  H5Pget_fapl_multi function
+ *  Call  H5Pget_fapl_multi function
  */
 
   status = H5Pget_fapl_multi(c_prp_id, c_memb_map, c_memb_fapl, c_memb_name, c_memb_addr, &relax);
   if ( status < 0  ) return ret_value;
 
 /*
- * Take care of names array
+ *  Take care of names array
  */
   tmp = (char *)HDmalloc(c_lenmax*H5FD_MEM_NTYPES + 1);
   tmp_p = tmp;
@@ -3969,7 +3598,7 @@ nh5pget_fapl_multi_c ( hid_t_f *prp_id , int_f *memb_map, hid_t_f *memb_fapl, _f
 HD5packFstring(tmp, _fcdtocp(memb_name), (size_t)(c_lenmax*H5FD_MEM_NTYPES));
 
 /*
- * Take care of other arguments
+ *  Take care of other arguments
  */
 
   for (i=0; i < H5FD_MEM_NTYPES; i++) {
@@ -3989,25 +3618,25 @@ HD5packFstring(tmp, _fcdtocp(memb_name), (size_t)(c_lenmax*H5FD_MEM_NTYPES));
 
 /****if* H5Pf/h5pset_szip_c
  * NAME
- *        h5pset_szip_c
+ *  h5pset_szip_c
  * PURPOSE
- *     Call H5Pset_szip to set szip compression
+ *  Call H5Pset_szip to set szip compression
  * INPUTS
- *      prp_id - dataset creation property list identifier
- *              options_mask
- *              pixels_per_block -szip compression parameters
+ *  prp_id - dataset creation property list identifier
+ *  options_mask
+ *  pixels_per_block -szip compression parameters
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              April 8 2003
+ *  April 8 2003
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pset_szip_c ( hid_t_f *prp_id , int_f *options_mask, int_f *pixels_per_block)
+h5pset_szip_c ( hid_t_f *prp_id , int_f *options_mask, int_f *pixels_per_block)
 /******/
 {
   int_f ret_value = -1;
@@ -4020,7 +3649,7 @@ nh5pset_szip_c ( hid_t_f *prp_id , int_f *options_mask, int_f *pixels_per_block)
   c_options_mask = (unsigned)*options_mask;
   c_pixels_per_block = (unsigned)*pixels_per_block;
 /*
- * Call  H5Pset_szip function
+ *  Call  H5Pset_szip function
  */
 
   status = H5Pset_szip(c_prp_id, c_options_mask, c_pixels_per_block);
@@ -4030,25 +3659,25 @@ nh5pset_szip_c ( hid_t_f *prp_id , int_f *options_mask, int_f *pixels_per_block)
 }
 /****if* H5Pf/h5pall_filters_avail_c
  * NAME
- *        h5pall_filters_avail_c
+ *  h5pall_filters_avail_c
  * PURPOSE
- *     Call H5Pall_filters_avail
+ *  Call H5Pall_filters_avail
  * INPUTS
- *      prp_id - dataset creation property list identifier
+ *  prp_id - dataset creation property list identifier
  * OUTPUTS
- *     status - logical flag
+ *  status - logical flag
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              April 10 2003
+ *  April 10 2003
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pall_filters_avail_c ( hid_t_f *prp_id , int_f *status)
+h5pall_filters_avail_c ( hid_t_f *prp_id , int_f *status)
 /******/
 {
   int_f ret_value = -1;
@@ -4058,7 +3687,7 @@ nh5pall_filters_avail_c ( hid_t_f *prp_id , int_f *status)
 
   c_prp_id = (hid_t)*prp_id;
 /*
- * Call  H5Pall_filters_avail function
+ *  Call  H5Pall_filters_avail function
  */
 
   c_status = H5Pall_filters_avail(c_prp_id);
@@ -4071,31 +3700,31 @@ nh5pall_filters_avail_c ( hid_t_f *prp_id , int_f *status)
 
 /****if* H5Pf/h5pget_filter_by_id_c
  * NAME
- *        h5pget_filter_by_id_c
+ *  h5pget_filter_by_id_c
  * PURPOSE
- *     Call H5Pget_filter_by_id2 to get information about a filter
- *              in a pipeline
+ *  Call H5Pget_filter_by_id2 to get information about a filter
+ *  in a pipeline
  * INPUTS
- *      prp_id - property list identifier
- *              filter_id - filter id
- *              namelen - Anticipated number of characters in name.
+ *  prp_id - property list identifier
+ *  filter_id - filter id
+ *  namelen - Anticipated number of characters in name.
  *OUTPUT
- *      flags - Bit vector specifying certain general
- *                      properties of the filter.
- *              cd_nelmts - Number of elements in cd_value
- *              cd_values - Auxiliary data for the filter.
- *              name - Name of the filter
+ *  flags - Bit vector specifying certain general
+ *  properties of the filter.
+ *  cd_nelmts - Number of elements in cd_value
+ *  cd_values - Auxiliary data for the filter.
+ *  name - Name of the filter
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena POurmal
- *              April 10, 2003
+ *  April 10, 2003
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_filter_by_id_c(hid_t_f *prp_id, int_f* filter_id, int_f* flags, size_t_f* cd_nelmts, int_f* cd_values, size_t_f *namelen, _fcd name)
+h5pget_filter_by_id_c(hid_t_f *prp_id, int_f* filter_id, int_f* flags, size_t_f* cd_nelmts, int_f* cd_values, size_t_f *namelen, _fcd name)
 /******/
 {
      unsigned int c_flags;
@@ -4138,27 +3767,27 @@ DONE:
 
 /****if* H5Pf/h5pmodify_filter_c
  * NAME
- *        h5pmodify_filter_c
+ *  h5pmodify_filter_c
  * PURPOSE
- *     Call H5Pmodify_filter to modify a filter
+ *  Call H5Pmodify_filter to modify a filter
  * INPUTS
- *      prp_id - property list identifier
- *              filter - Filter to be modified
- *              flags - Bit vector specifying certain general
- *                      properties of the filter.
- *              cd_nelmts - Number of elements in cd_values.
- *              cd_values - Auxiliary data for the filter.
+ *  prp_id - property list identifier
+ *  filter - Filter to be modified
+ *  flags - Bit vector specifying certain general
+ *  properties of the filter.
+ *  cd_nelmts - Number of elements in cd_values.
+ *  cd_values - Auxiliary data for the filter.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              April 10 2003
+ *  April 10 2003
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pmodify_filter_c (hid_t_f *prp_id, int_f* filter, int_f* flags, size_t_f* cd_nelmts, int_f* cd_values )
+h5pmodify_filter_c (hid_t_f *prp_id, int_f* filter, int_f* flags, size_t_f* cd_nelmts, int_f* cd_values )
 /******/
 {
      int_f ret_value = -1;
@@ -4190,23 +3819,23 @@ DONE:
 
 /****if* H5Pf/h5premove_filter_c
  * NAME
- *        h5premove_filter_c
+ *  h5premove_filter_c
  * PURPOSE
- *     Call H5Premove_filter to delete one or more filters
+ *  Call H5Premove_filter to delete one or more filters
  * INPUTS
- *      prp_id - property list identifier
- *              filter - Filter to be deleted
+ *  prp_id - property list identifier
+ *  filter - Filter to be deleted
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Quincey Koziol
- *              January 27 2004
+ *  January 27 2004
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5premove_filter_c (hid_t_f *prp_id, int_f* filter)
+h5premove_filter_c (hid_t_f *prp_id, int_f* filter)
 /******/
 {
      int_f ret_value = -1;
@@ -4228,25 +3857,25 @@ DONE:
 
 /****if* H5Pf/h5pget_attr_phase_change_c
  * NAME
- *        h5pget_attr_phase_change_c
+ *  h5pget_attr_phase_change_c
  * PURPOSE
- *     Calls H5Pget_attr_phase_change
+ *  Calls H5Pget_attr_phase_change
  *
  * INPUTS
- *      ocpl_id		- Object (dataset or group) creation property list identifier
- * Outputs      max_compact     - Maximum number of attributes to be stored in compact storage
- *              min_dense       - Minimum number of attributes to be stored in dense storage
+ *  ocpl_id		- Object (dataset or group) creation property list identifier
+ *  Outputs      max_compact     - Maximum number of attributes to be stored in compact storage
+ *  min_dense       - Minimum number of attributes to be stored in dense storage
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              January, 2008
+ *  January, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_attr_phase_change_c(hid_t_f *ocpl_id, int_f *max_compact, int_f *min_dense )
+h5pget_attr_phase_change_c(hid_t_f *ocpl_id, int_f *max_compact, int_f *min_dense )
 /******/
 {
   int ret_value = -1;
@@ -4269,24 +3898,24 @@ nh5pget_attr_phase_change_c(hid_t_f *ocpl_id, int_f *max_compact, int_f *min_den
 
 /****if* H5Pf/h5pset_attr_creation_order_c
  * NAME
- *        h5pset_attr_creation_order_c
+ *  h5pset_attr_creation_order_c
  * PURPOSE
- *     Calls H5Ppset_attr_creation_order
+ *  Calls H5Ppset_attr_creation_order
  *
  * INPUTS
- *      ocpl_id		- Object (dataset or group) creation property list identifier
- * Outputs      crt_order_flags - Flags specifying whether to track and index attribute creation order
+ *  ocpl_id		- Object (dataset or group) creation property list identifier
+ *  Outputs      crt_order_flags - Flags specifying whether to track and index attribute creation order
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              January, 2008
+ *  January, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_attr_creation_order_c(hid_t_f *ocpl_id, int_f *crt_order_flags )
+h5pset_attr_creation_order_c(hid_t_f *ocpl_id, int_f *crt_order_flags )
 /******/
 {
   int ret_value = -1;
@@ -4306,29 +3935,29 @@ nh5pset_attr_creation_order_c(hid_t_f *ocpl_id, int_f *crt_order_flags )
 
 /****if* H5Pf/h5pset_shared_mesg_nindexes_c
  * NAME
- *        h5pset_shared_mesg_nindexes_c
+ *  h5pset_shared_mesg_nindexes_c
  * PURPOSE
- *     Calls h5pset_shared_mesg_nindexes
+ *  Calls h5pset_shared_mesg_nindexes
  *
  * INPUTS
  *
- *       plist_id - file creation property list
- *       nindexes - Number of shared object header message indexes
- *                   available in files created WITH this property list
+ *  plist_id - file creation property list
+ *  nindexes - Number of shared object header message indexes
+ *  available in files created WITH this property list
  *
  * OUTPUTS
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              January, 2008
+ *  January, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_shared_mesg_nindexes_c(hid_t_f *plist_id, int_f *nindexes )
+h5pset_shared_mesg_nindexes_c(hid_t_f *plist_id, int_f *nindexes )
 /******/
 {
   int ret_value = -1;
@@ -4349,30 +3978,30 @@ nh5pset_shared_mesg_nindexes_c(hid_t_f *plist_id, int_f *nindexes )
 
 /****if* H5Pf/h5pset_shared_mesg_index_c
  * NAME
- *        h5pset_shared_mesg_index_c
+ *  h5pset_shared_mesg_index_c
  * PURPOSE
- *     Calls H5Pset_shared_mesg_index
+ *  Calls H5Pset_shared_mesg_index
  *
  * INPUTS
  *
- *            fcpl_id - File creation property list identifier.
- *          index_num - Index being configured.
- *    mesg_type_flags - Types of messages that should be stored in this index.
- *      min_mesg_size - Minimum message size.
+ *  fcpl_id - File creation property list identifier.
+ *  index_num - Index being configured.
+ *  mesg_type_flags - Types of messages that should be stored in this index.
+ *  min_mesg_size - Minimum message size.
  *
  * OUTPUTS
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              January, 2008
+ *  January, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_shared_mesg_index_c(hid_t_f *fcpl_id, int_f *index_num, int_f *mesg_type_flags, int_f *min_mesg_size)
+h5pset_shared_mesg_index_c(hid_t_f *fcpl_id, int_f *index_num, int_f *mesg_type_flags, int_f *min_mesg_size)
 /******/
 {
   int ret_value = -1;
@@ -4389,28 +4018,28 @@ nh5pset_shared_mesg_index_c(hid_t_f *fcpl_id, int_f *index_num, int_f *mesg_type
 
 /****if* H5Pf/h5pget_attr_creation_order_c
  * NAME
- *        h5pget_attr_creation_order_c
+ *  h5pget_attr_creation_order_c
  * PURPOSE
- *     Calls H5Pget_attr_creation_order
+ *  Calls H5Pget_attr_creation_order
  *
  * INPUTS
  *
- *           ocpl_id - Object (group or dataset) creation property list identifier
+ *  ocpl_id - Object (group or dataset) creation property list identifier
  * OUTPUTS
  *
- *           crt_order_flags - Flags specifying whether to track and index attribute creation order
+ *  crt_order_flags - Flags specifying whether to track and index attribute creation order
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              February, 2008
+ *  February, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_attr_creation_order_c(hid_t_f *ocpl_id, int_f *crt_order_flags)
+h5pget_attr_creation_order_c(hid_t_f *ocpl_id, int_f *crt_order_flags)
 /******/
 {
   int ret_value = -1;
@@ -4431,29 +4060,29 @@ nh5pget_attr_creation_order_c(hid_t_f *ocpl_id, int_f *crt_order_flags)
 }
 /****if* H5Pf/h5pset_libver_bounds_c
  * NAME
- *        h5pset_libver_bounds_c
+ *  h5pset_libver_bounds_c
  * PURPOSE
- *     Calls H5Pset_libver_bounds
+ *  Calls H5Pset_libver_bounds
  *
  * INPUTS
  *
- *             fapl_id - File access property list identifier
- *                 low - The earliest version of the library that will be used for writing objects.
- *                high - The latest version of the library that will be used for writing objects.
+ *  fapl_id - File access property list identifier
+ *  low - The earliest version of the library that will be used for writing objects.
+ *  high - The latest version of the library that will be used for writing objects.
  * OUTPUTS
  *
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              February 18, 2008
+ *  February 18, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_libver_bounds_c(hid_t_f *fapl_id, int_f *low, int_f *high )
+h5pset_libver_bounds_c(hid_t_f *fapl_id, int_f *low, int_f *high )
 /******/
 {
   int ret_value = -1;
@@ -4471,26 +4100,26 @@ nh5pset_libver_bounds_c(hid_t_f *fapl_id, int_f *low, int_f *high )
 
 /****if* H5Pf/h5pset_link_creation_order_c
  * NAME
- *        h5pset_link_creation_order_c
+ *  h5pset_link_creation_order_c
  * PURPOSE
- *     Calls H5Pset_link_creation_order
+ *  Calls H5Pset_link_creation_order
  *
  * INPUTS
- *      gcpl_id		- Group creation property list identifier
- *              crt_order_flags - Creation order flag(s)
+ *  gcpl_id		- Group creation property list identifier
+ *  crt_order_flags - Creation order flag(s)
  * OUTPUTS
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              February 18, 2008
+ *  February 18, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_link_creation_order_c(hid_t_f *gcpl_id, int_f *crt_order_flags )
+h5pset_link_creation_order_c(hid_t_f *gcpl_id, int_f *crt_order_flags )
 /******/
 {
   int ret_value = -1;
@@ -4507,25 +4136,25 @@ nh5pset_link_creation_order_c(hid_t_f *gcpl_id, int_f *crt_order_flags )
 
 /****if* H5Pf/h5pget_link_phase_change_c
  * NAME
- *        h5pget_link_phase_change_c
+ *  h5pget_link_phase_change_c
  * PURPOSE
- *     Calls H5Pget_link_phase_change
+ *  Calls H5Pget_link_phase_change
  *
  * INPUTS
- *      gcpl_id  	- Group creation property list identifier
- * Outputs      max_compact     - Maximum number of attributes to be stored in compact storage
- *              min_dense       - Minimum number of attributes to be stored in dense storage
+ *  gcpl_id  	- Group creation property list identifier
+ *  Outputs      max_compact     - Maximum number of attributes to be stored in compact storage
+ *  min_dense       - Minimum number of attributes to be stored in dense storage
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              February 20, 2008
+ *  February 20, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_link_phase_change_c(hid_t_f *gcpl_id, int_f *max_compact, int_f *min_dense )
+h5pget_link_phase_change_c(hid_t_f *gcpl_id, int_f *max_compact, int_f *min_dense )
 /******/
 {
   int ret_value = -1;
@@ -4547,27 +4176,27 @@ nh5pget_link_phase_change_c(hid_t_f *gcpl_id, int_f *max_compact, int_f *min_den
 
 /****if* H5Pf/h5pget_obj_track_times_c
  * NAME
- *        h5pget_obj_track_times_c
+ *  h5pget_obj_track_times_c
  * PURPOSE
- *     Call H5Pget_obj_track_times
+ *  Call H5Pget_obj_track_times
  *
  * INPUTS
- *      plist_id - property list id
+ *  plist_id - property list id
  * OUTPUTS
  *
- *              flag     - TRUE/FALSE flag
+ *  flag     - TRUE/FALSE flag
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              February 22, 2008
+ *  February 22, 2008
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pget_obj_track_times_c(hid_t_f *plist_id, int_f *flag)
+h5pget_obj_track_times_c(hid_t_f *plist_id, int_f *flag)
 /******/
 {
   int ret_value = -1;
@@ -4589,25 +4218,25 @@ nh5pget_obj_track_times_c(hid_t_f *plist_id, int_f *flag)
 
 /****if* H5Pf/h5pset_obj_track_times_c
  * NAME
- *        h5pset_obj_track_times_c
+ *  h5pset_obj_track_times_c
  * PURPOSE
- *     Call H5Pset_obj_track_times
+ *  Call H5Pset_obj_track_times
  *
  * INPUTS
- *      plist_id - property list id
- *              flag     - TRUE/FALSE flag
+ *  plist_id - property list id
+ *  flag     - TRUE/FALSE flag
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              February 22, 2008
+ *  February 22, 2008
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pset_obj_track_times_c(hid_t_f *plist_id, int_f *flag)
+h5pset_obj_track_times_c(hid_t_f *plist_id, int_f *flag)
 /******/
 {
   int ret_value = -1;
@@ -4629,28 +4258,28 @@ nh5pset_obj_track_times_c(hid_t_f *plist_id, int_f *flag)
 
 /****if* H5Pf/h5pset_create_inter_group_c
  * NAME
- *        h5pset_create_inter_group_c
+ *  h5pset_create_inter_group_c
  * PURPOSE
- *     Calls H5Pset_create_intermediate_group
+ *  Calls H5Pset_create_intermediate_group
  *
  * INPUTS
  *
  *		lcpl_id - Link creation property list identifier
- *   crt_intermed_group - crt_intermed_group specifying whether
- *                        to create intermediate groups upon the
- *                        creation of an object
+ *  crt_intermed_group - crt_intermed_group specifying whether
+ *  to create intermediate groups upon the
+ *  creation of an object
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              February 22, 2008
+ *  February 22, 2008
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5pset_create_inter_group_c(hid_t_f *lcpl_id, int_f *crt_intermed_group)
+h5pset_create_inter_group_c(hid_t_f *lcpl_id, int_f *crt_intermed_group)
 /******/
 {
   int ret_value = -1;
@@ -4668,28 +4297,28 @@ nh5pset_create_inter_group_c(hid_t_f *lcpl_id, int_f *crt_intermed_group)
 
 /****if* H5Pf/h5pget_link_creation_order_c
  * NAME
- *        h5pget_link_creation_order_c
+ *  h5pget_link_creation_order_c
  * PURPOSE
- *     Calls H5Pget_link_creation_order
+ *  Calls H5Pget_link_creation_order
  *
  * INPUTS
  *
- *           gcpl_id - Group creation property list identifier
+ *  gcpl_id - Group creation property list identifier
  * OUTPUTS
  *
- *           crt_order_flags - Creation order flag(s)
+ *  crt_order_flags - Creation order flag(s)
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 3, 2008
+ *  March 3, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_link_creation_order_c(hid_t_f *gcpl_id, int_f *crt_order_flags)
+h5pget_link_creation_order_c(hid_t_f *gcpl_id, int_f *crt_order_flags)
 /******/
 {
   int ret_value = -1;
@@ -4711,30 +4340,30 @@ nh5pget_link_creation_order_c(hid_t_f *gcpl_id, int_f *crt_order_flags)
 
 /****if* H5Pf/h5pset_char_encoding_c
  * NAME
- *     h5pset_char_encoding_c
+ *  h5pset_char_encoding_c
  * PURPOSE
  *  Calls H5Pset_char_encoding
  *
  * INPUTS
  *
- *           plist_id - Property list identifier
- *           encoding - String encoding character set:
+ *  plist_id - Property list identifier
+ *  encoding - String encoding character set:
  *     	                     H5T_CSET_ASCII_F -> US ASCII
  *     	                     H5T_CSET_UTF8_F -> UTF-8 Unicode encoding
  * OUTPUTS
  *  NONE
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 3, 2008
+ *  March 3, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_char_encoding_c(hid_t_f *plist_id, int_f *encoding)
+h5pset_char_encoding_c(hid_t_f *plist_id, int_f *encoding)
 /******/
 {
   int ret_value = -1;
@@ -4753,30 +4382,30 @@ nh5pset_char_encoding_c(hid_t_f *plist_id, int_f *encoding)
 
 /****if* H5Pf/h5pget_char_encoding_c
  * NAME
- *     h5pget_char_encoding_c
+ *  h5pget_char_encoding_c
  * PURPOSE
  *  Calls H5Pget_char_encoding
  *
  * INPUTS
  *
- *           plist_id - Property list identifier
+ *  plist_id - Property list identifier
  * OUTPUTS
  *
- *           encoding - Encoding character set:
+ *  encoding - Encoding character set:
  *     	                  H5T_CSET_ASCII_F -> US ASCII
  *     	                  H5T_CSET_UTF8_F -> UTF-8 Unicode encoding
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 3, 2008
+ *  March 3, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_char_encoding_c(hid_t_f *plist_id, int_f *encoding)
+h5pget_char_encoding_c(hid_t_f *plist_id, int_f *encoding)
 /******/
 {
   int ret_value = -1;
@@ -4796,30 +4425,30 @@ nh5pget_char_encoding_c(hid_t_f *plist_id, int_f *encoding)
 
 /****if* H5Pf/h5pset_copy_object_c
  * NAME
- *     h5pset_copy_object_c
+ *  h5pset_copy_object_c
  * PURPOSE
  *  Calls H5Pset_copy_object
  *
  * INPUTS
  *
- *    ocp_plist_id - Object copy property list identifier
- *    copy_options - Copy option(s) to be set
+ *  ocp_plist_id - Object copy property list identifier
+ *  copy_options - Copy option(s) to be set
  *
  * OUTPUTS
  *
  *            NONE
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 3, 2008
+ *  March 3, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_copy_object_c(hid_t_f *ocp_plist_id, int_f *copy_options)
+h5pset_copy_object_c(hid_t_f *ocp_plist_id, int_f *copy_options)
 /******/
 {
   int ret_value = -1;
@@ -4836,29 +4465,29 @@ nh5pset_copy_object_c(hid_t_f *ocp_plist_id, int_f *copy_options)
 
 /****if* H5Pf/h5pget_copy_object_c
  * NAME
- *     h5pget_copy_object_c
+ *  h5pget_copy_object_c
  * PURPOSE
  *  Calls H5Pget_copy_object
  *
  * INPUTS
  *
- *    ocp_plist_id - Object copy property list identifier
+ *  ocp_plist_id - Object copy property list identifier
  *
  * OUTPUTS
  *
- *    copy_options - Copy option(s) to be get
+ *  copy_options - Copy option(s) to be get
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 3, 2008
+ *  March 3, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_copy_object_c(hid_t_f *ocp_plist_id, int_f *copy_options)
+h5pget_copy_object_c(hid_t_f *ocp_plist_id, int_f *copy_options)
 /******/
 {
   int ret_value = -1;
@@ -4878,31 +4507,31 @@ nh5pget_copy_object_c(hid_t_f *ocp_plist_id, int_f *copy_options)
 
 /****if* H5Pf/h5pget_data_transform_c
  * NAME
- *        h5pget_data_transform_c
+ *  h5pget_data_transform_c
  * PURPOSE
- *     Calls H5Pget_data_transform
+ *  Calls H5Pget_data_transform
  * INPUTS
  *
- *              prp_id - property list identifier to query
- *      expression_len - buffer size transorm expression
+ *  prp_id - property list identifier to query
+ *  expression_len - buffer size transorm expression
  *
- * Output:
- *          expression - buffer to hold transform expression
+ *  Output:
+ *  expression - buffer to hold transform expression
  *
  * RETURNS
  *
- *          Success:  0
+ *  Success:  0
  *	    Failure: -1
  *
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 19, 2008
+ *  March 19, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_data_transform_c(hid_t_f *plist_id, _fcd expression, int_f *expression_len, size_t_f *size)
+h5pget_data_transform_c(hid_t_f *plist_id, _fcd expression, int_f *expression_len, size_t_f *size)
 /******/
 {
     char *c_expression = NULL;          /* Buffer to hold C string */
@@ -4940,31 +4569,31 @@ done:
 
 /****if* H5Pf/h5pset_data_transform_c
  * NAME
- *        h5pset_data_transform_c
+ *  h5pset_data_transform_c
  * PURPOSE
- *     Calls H5Pset_data_transform
+ *  Calls H5Pset_data_transform
  * INPUTS
  *
- *              prp_id - property list identifier to query
- *          expression - buffer to hold transform expression
- *      expression_len - buffer size transorm expression
+ *  prp_id - property list identifier to query
+ *  expression - buffer to hold transform expression
+ *  expression_len - buffer size transorm expression
  *
- * Output:
+ *  Output:
  *
  * RETURNS
  *
- *          Success:  0
+ *  Success:  0
  *	    Failure: -1
  *
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 19, 2008
+ *  March 19, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_data_transform_c(hid_t_f *plist_id, _fcd expression, int_f *expression_len)
+h5pset_data_transform_c(hid_t_f *plist_id, _fcd expression, int_f *expression_len)
 /******/
 {
      char* c_expression = NULL; /* Buffer to hold C string */
@@ -4991,29 +4620,29 @@ done:
 
 /****if* H5Pf/h5pget_local_heap_size_hint_c
  * NAME
- *        h5pget_local_heap_size_hint_c
+ *  h5pget_local_heap_size_hint_c
  * PURPOSE
- *     Calls H5Pget_local_heap_size_hint
+ *  Calls H5Pget_local_heap_size_hint
  * INPUTS
  *
- *         gcpl_id - Group creation property list identifier
+ *  gcpl_id - Group creation property list identifier
  *
- * Output:
- *       size_hint - Hint for size of local heap
+ *  Output:
+ *  size_hint - Hint for size of local heap
  * RETURNS
  *
- *          Success:  0
+ *  Success:  0
  *	    Failure: -1
  *
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 21, 2008
+ *  March 21, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_local_heap_size_hint_c(hid_t_f *gcpl_id, size_t_f *size_hint)
+h5pget_local_heap_size_hint_c(hid_t_f *gcpl_id, size_t_f *size_hint)
 /******/
 {
      int_f ret_value = -1; /* Return value */
@@ -5032,30 +4661,30 @@ nh5pget_local_heap_size_hint_c(hid_t_f *gcpl_id, size_t_f *size_hint)
 
 /****if* H5Pf/h5pget_est_link_info_c
  * NAME
- *        h5pget_est_link_info_c
+ *  h5pget_est_link_info_c
  * PURPOSE
- *     Calls H5Pget_est_link_info
+ *  Calls H5Pget_est_link_info
  * INPUTS
  *
- *              gcpl_id - Group creation property list identifier
+ *  gcpl_id - Group creation property list identifier
  *
- * Output:
- *      est_num_entries - Estimated number of links to be inserted into group
- *         est_name_len - Estimated average length of link names
+ *  Output:
+ *  est_num_entries - Estimated number of links to be inserted into group
+ *  est_name_len - Estimated average length of link names
  * RETURNS
  *
- *          Success:  0
+ *  Success:  0
  *	    Failure: -1
  *
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 21, 2008
+ *  March 21, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_est_link_info_c(hid_t_f *gcpl_id, int_f *est_num_entries, int_f *est_name_len)
+h5pget_est_link_info_c(hid_t_f *gcpl_id, int_f *est_num_entries, int_f *est_name_len)
 /******/
 {
      int_f ret_value = -1; /* Return value */
@@ -5077,30 +4706,30 @@ nh5pget_est_link_info_c(hid_t_f *gcpl_id, int_f *est_num_entries, int_f *est_nam
 
 /****if* H5Pf/h5pset_local_heap_size_hint_c
  * NAME
- *        h5pset_local_heap_size_hint_c
+ *  h5pset_local_heap_size_hint_c
  * PURPOSE
- *     Calls H5Pset_local_heap_size_hint
+ *  Calls H5Pset_local_heap_size_hint
  * INPUTS
  *
- *         gcpl_id - Group creation property list identifier
- *       size_hint - Hint for size of local heap
+ *  gcpl_id - Group creation property list identifier
+ *  size_hint - Hint for size of local heap
  *
- * Output:
+ *  Output:
  *
  * RETURNS
  *
- *          Success:  0
+ *  Success:  0
  *	    Failure: -1
  *
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 21, 2008
+ *  March 21, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_local_heap_size_hint_c(hid_t_f *gcpl_id, size_t_f *size_hint)
+h5pset_local_heap_size_hint_c(hid_t_f *gcpl_id, size_t_f *size_hint)
 /******/
 {
      int_f ret_value = -1; /* Return value */
@@ -5117,30 +4746,30 @@ nh5pset_local_heap_size_hint_c(hid_t_f *gcpl_id, size_t_f *size_hint)
 
 /****if* H5Pf/h5pset_est_link_info_c
  * NAME
- *        h5pset_est_link_info_c
+ *  h5pset_est_link_info_c
  * PURPOSE
- *     Calls H5Pset_est_link_info
+ *  Calls H5Pset_est_link_info
  * INPUTS
  *
- *              gcpl_id - Group creation property list identifier
- *      est_num_entries - Estimated number of links to be inserted into group
- *         est_name_len - Estimated average length of link names
+ *  gcpl_id - Group creation property list identifier
+ *  est_num_entries - Estimated number of links to be inserted into group
+ *  est_name_len - Estimated average length of link names
  *
- * Output:
+ *  Output:
  * RETURNS
  *
- *          Success:  0
+ *  Success:  0
  *	    Failure: -1
  *
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 21, 2008
+ *  March 21, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_est_link_info_c(hid_t_f *gcpl_id, int_f *est_num_entries, int_f *est_name_len)
+h5pset_est_link_info_c(hid_t_f *gcpl_id, int_f *est_num_entries, int_f *est_name_len)
 /******/
 {
      int_f ret_value = -1; /* Return value */
@@ -5157,26 +4786,26 @@ nh5pset_est_link_info_c(hid_t_f *gcpl_id, int_f *est_num_entries, int_f *est_nam
 
 /****if* H5Pf/h5pset_link_phase_change_c
  * NAME
- *        h5pset_link_phase_change_c
+ *  h5pset_link_phase_change_c
  * PURPOSE
- *     Calls H5Pset_link_phase_change
+ *  Calls H5Pset_link_phase_change
  *
  * INPUTS
- *      gcpl_id     - Group creation property list identifier
- *              max_compact - Maximum number of attributes to be stored in compact storage
- *              min_dense   - Minimum number of attributes to be stored in dense storage
- * Outputs
+ *  gcpl_id     - Group creation property list identifier
+ *  max_compact - Maximum number of attributes to be stored in compact storage
+ *  min_dense   - Minimum number of attributes to be stored in dense storage
+ *  Outputs
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 21, 2008
+ *  March 21, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_link_phase_change_c(hid_t_f *gcpl_id, int_f *max_compact, int_f *min_dense )
+h5pset_link_phase_change_c(hid_t_f *gcpl_id, int_f *max_compact, int_f *min_dense )
 /******/
 {
   int ret_value = -1;
@@ -5194,28 +4823,32 @@ nh5pset_link_phase_change_c(hid_t_f *gcpl_id, int_f *max_compact, int_f *min_den
 
 /****if* H5Pf/h5pset_fapl_direct_c
  * NAME
- *        h5pset_fapl_direct_c
+ *  h5pset_fapl_direct_c
  * PURPOSE
- *     Calls H5Pset_fapl_direct
+ *  Calls H5Pset_fapl_direct
  *
  * INPUTS
  *
- *    fapl_id 	 - File access property list identifier
- *    alignment  - Required memory alignment boundary
- *    block_size - File system block size
- *    cbuf_size  - Copy buffer size
- * Outputs
+ *  fapl_id 	 - File access property list identifier
+ *  alignment  - Required memory alignment boundary
+ *  block_size - File system block size
+ *  cbuf_size  - Copy buffer size
+ *  Outputs
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 21, 2008
+ *  March 21, 2008
  * HISTORY
  *
  * SOURCE
 */
+#ifndef H5_HAVE_DIRECT
+/* Only gets gcc const attribute when the direct VFD is not built. */
+H5_ATTR_CONST
+#endif
 int_f
-nh5pset_fapl_direct_c(hid_t_f H5_ATTR_UNUSED *fapl_id, size_t_f H5_ATTR_UNUSED *alignment, size_t_f H5_ATTR_UNUSED *block_size, size_t_f H5_ATTR_UNUSED *cbuf_size)
+h5pset_fapl_direct_c(hid_t_f H5_ATTR_UNUSED *fapl_id, size_t_f H5_ATTR_UNUSED *alignment, size_t_f H5_ATTR_UNUSED *block_size, size_t_f H5_ATTR_UNUSED *cbuf_size)
 /******/
 {
   int ret_value = -1;
@@ -5236,29 +4869,33 @@ nh5pset_fapl_direct_c(hid_t_f H5_ATTR_UNUSED *fapl_id, size_t_f H5_ATTR_UNUSED *
 
 /****if* H5Pf/h5pget_fapl_direct_c
  * NAME
- *        h5pget_fapl_direct_c
+ *  h5pget_fapl_direct_c
  * PURPOSE
- *     Calls H5Pget_fapl_direct
+ *  Calls H5Pget_fapl_direct
  *
  * INPUTS
  *
- *    fapl_id 	 - File access property list identifier
+ *  fapl_id 	 - File access property list identifier
  * OUTPUTS
  *
- *    alignment  - Required memory alignment boundary
- *    block_size - File system block size
- *    cbuf_size  - Copy buffer size
+ *  alignment  - Required memory alignment boundary
+ *  block_size - File system block size
+ *  cbuf_size  - Copy buffer size
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 21, 2008
+ *  March 21, 2008
  * HISTORY
  *
  * SOURCE
 */
+#ifndef H5_HAVE_DIRECT
+/* Only gets gcc const attribute when the direct VFD is not built. */
+H5_ATTR_CONST
+#endif
 int_f
-nh5pget_fapl_direct_c(hid_t_f H5_ATTR_UNUSED *fapl_id, size_t_f H5_ATTR_UNUSED *alignment, size_t_f H5_ATTR_UNUSED *block_size, size_t_f H5_ATTR_UNUSED *cbuf_size)
+h5pget_fapl_direct_c(hid_t_f H5_ATTR_UNUSED *fapl_id, size_t_f H5_ATTR_UNUSED *alignment, size_t_f H5_ATTR_UNUSED *block_size, size_t_f H5_ATTR_UNUSED *cbuf_size)
 /******/
 {
   int ret_value = -1;
@@ -5285,27 +4922,27 @@ nh5pget_fapl_direct_c(hid_t_f H5_ATTR_UNUSED *fapl_id, size_t_f H5_ATTR_UNUSED *
 
 /****if* H5Pf/h5pset_attr_phase_change_c
  * NAME
- *        h5pset_attr_phase_change_c
+ *  h5pset_attr_phase_change_c
  * PURPOSE
- *     Calls H5Pset_attr_phase_change
+ *  Calls H5Pset_attr_phase_change
  *
  * INPUTS
- *      ocpl_id		- Object (dataset or group) creation property list identifier
- *              max_compact     - Maximum number of attributes to be stored in compact storage
- *              min_dense       - Minimum number of attributes to be stored in dense storage
+ *  ocpl_id		- Object (dataset or group) creation property list identifier
+ *  max_compact     - Maximum number of attributes to be stored in compact storage
+ *  min_dense       - Minimum number of attributes to be stored in dense storage
  * OUTPUTS
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 21, 2008
+ *  March 21, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_attr_phase_change_c(hid_t_f *ocpl_id, int_f *max_compact, int_f *min_dense )
+h5pset_attr_phase_change_c(hid_t_f *ocpl_id, int_f *max_compact, int_f *min_dense )
 /******/
 {
   int ret_value = -1;
@@ -5322,25 +4959,25 @@ nh5pset_attr_phase_change_c(hid_t_f *ocpl_id, int_f *max_compact, int_f *min_den
 
 /****if* H5Pf/h5pset_nbit_c
  * NAME
- *        h5pset_nbit_c
+ *  h5pset_nbit_c
  * PURPOSE
- *     Calls H5Pset_nbit
+ *  Calls H5Pset_nbit
  *
  * INPUTS
- *      plist_id - Dataset creation property list identifier
+ *  plist_id - Dataset creation property list identifier
  * OUTPUTS
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 21, 2008
+ *  March 21, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pset_nbit_c(hid_t_f *plist_id )
+h5pset_nbit_c(hid_t_f *plist_id )
 /******/
 {
   int ret_value = -1;
@@ -5373,7 +5010,7 @@ nh5pset_nbit_c(hid_t_f *plist_id )
  * SOURCE
 */
 int_f
-nh5pset_scaleoffset_c(hid_t_f *plist_id, int_f *scale_type, int_f *scale_factor )
+h5pset_scaleoffset_c(hid_t_f *plist_id, int_f *scale_type, int_f *scale_factor )
 /******/
 {
   int ret_value = -1;
@@ -5408,7 +5045,7 @@ nh5pset_scaleoffset_c(hid_t_f *plist_id, int_f *scale_type, int_f *scale_factor
  * SOURCE
 */
 int_f
-nh5pset_nlinks_c(hid_t_f *lapl_id, size_t_f *nlinks)
+h5pset_nlinks_c(hid_t_f *lapl_id, size_t_f *nlinks)
 /******/
 {
   int ret_value = -1;
@@ -5425,29 +5062,29 @@ nh5pset_nlinks_c(hid_t_f *lapl_id, size_t_f *nlinks)
 
 /****if* H5Pf/h5pget_nlinks
  * NAME
- *        h5pget_nlinks
+ *  h5pget_nlinks
  * PURPOSE
- *     Calls H5Pget_nlinks
+ *  Calls H5Pget_nlinks
  *
  * INPUTS
  *
- *            lapl_id - File access property list identifier
+ *  lapl_id - File access property list identifier
  *
  * OUTPUTS
  *
- *             nlinks - Maximum number of links to traverse
+ *  nlinks - Maximum number of links to traverse
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 24, 2008
+ *  March 24, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_nlinks_c(hid_t_f *lapl_id, size_t_f *nlinks)
+h5pget_nlinks_c(hid_t_f *lapl_id, size_t_f *nlinks)
 /******/
 {
   int ret_value = -1;
@@ -5466,26 +5103,26 @@ nh5pget_nlinks_c(hid_t_f *lapl_id, size_t_f *nlinks)
 
 /****if* H5Pf/h5pget_create_inter_group_c
  * NAME
- *        h5pget_create_inter_group_c
+ *  h5pget_create_inter_group_c
  * PURPOSE
- *     Calls H5Pget_create_intermediate_group
+ *  Calls H5Pget_create_intermediate_group
  *
  * INPUTS
  *
  *		lcpl_id - Link creation property list identifier
- *   crt_intermed_group - Specifying whether to create intermediate groups upon
- *                        the creation of an object
+ *  crt_intermed_group - Specifying whether to create intermediate groups upon
+ *  the creation of an object
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              April 4, 2008
+ *  April 4, 2008
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5pget_create_inter_group_c(hid_t_f *lcpl_id, int_f *crt_intermed_group)
+h5pget_create_inter_group_c(hid_t_f *lcpl_id, int_f *crt_intermed_group)
 /******/
 {
   int ret_value = -1;
@@ -5505,22 +5142,22 @@ nh5pget_create_inter_group_c(hid_t_f *lcpl_id, int_f *crt_intermed_group)
 }
 
 /*----------------------------------------------------------------------------
- * Name:        h5pset_chunk_cache_c
- * Purpose:     Calls H5Pset_chunk_cache
- *
- * Inputs:	dapl_id            - Link creation property list identifier
- *              rdcc_nslots        -
- *              rdcc_nbytes        -
- *              rdcc_w0            -
- *
- * Returns:     0 on success, -1 on failure
- * Programmer:  M. Scot Breitenfeld
- *              April 13, 2009
- * Modifications:
+ *  Name:        h5pset_chunk_cache_c
+ *  Purpose:     Calls H5Pset_chunk_cache
+ *
+ *  Inputs:	dapl_id            - Link creation property list identifier
+ *  rdcc_nslots        -
+ *  rdcc_nbytes        -
+ *  rdcc_w0            -
+ *
+ *  Returns:     0 on success, -1 on failure
+ *  Programmer:  M. Scot Breitenfeld
+ *  April 13, 2009
+ *  Modifications:
  *---------------------------------------------------------------------------*/
 
 int_f
-nh5pset_chunk_cache_c(hid_t_f *dapl_id, size_t_f *rdcc_nslots, size_t_f *rdcc_nbytes, real_f *rdcc_w0)
+h5pset_chunk_cache_c(hid_t_f *dapl_id, size_t_f *rdcc_nslots, size_t_f *rdcc_nbytes, real_f *rdcc_w0)
 {
   int ret_value = -1;
 
@@ -5535,23 +5172,23 @@ nh5pset_chunk_cache_c(hid_t_f *dapl_id, size_t_f *rdcc_nslots, size_t_f *rdcc_nb
 }
 
 /*----------------------------------------------------------------------------
- * Name:        h5pget_chunk_cache_c
- * Purpose:     Calls H5Pget_chunk_cache
- *
- * Inputs:	dapl_id            - Link creation property list identifier
- * Outputs:
- *              rdcc_nslots        -
- *              rdcc_nbytes        -
- *              rdcc_w0            -
- *
- * Returns:     0 on success, -1 on failure
- * Programmer:  M. Scot Breitenfeld
- *              April 13, 2009
- * Modifications:
+ *  Name:        h5pget_chunk_cache_c
+ *  Purpose:     Calls H5Pget_chunk_cache
+ *
+ *  Inputs:	dapl_id            - Link creation property list identifier
+ *  Outputs:
+ *  rdcc_nslots        -
+ *  rdcc_nbytes        -
+ *  rdcc_w0            -
+ *
+ *  Returns:     0 on success, -1 on failure
+ *  Programmer:  M. Scot Breitenfeld
+ *  April 13, 2009
+ *  Modifications:
  *---------------------------------------------------------------------------*/
 
 int_f
-nh5pget_chunk_cache_c(hid_t_f *dapl_id, size_t_f *rdcc_nslots, size_t_f *rdcc_nbytes, real_f *rdcc_w0)
+h5pget_chunk_cache_c(hid_t_f *dapl_id, size_t_f *rdcc_nslots, size_t_f *rdcc_nbytes, real_f *rdcc_w0)
 {
   int ret_value = -1;
   size_t c_rdcc_nslots;
@@ -5572,18 +5209,18 @@ nh5pget_chunk_cache_c(hid_t_f *dapl_id, size_t_f *rdcc_nslots, size_t_f *rdcc_nb
 }
 
 /*----------------------------------------------------------------------------
- * Name:        h5pset_file_image_c
- * Purpose:     Calls H5Pset_file_image
+ *  Name:        h5pset_file_image_c
+ *  Purpose:     Calls H5Pset_file_image
  *
- * Inputs:
+ *  Inputs:
  *  fapl_id - File access property list identifier
  *  buf_ptr - Pointer to the initial file image, 
- *            or NULL if no initial file image is desired
+ *  or NULL if no initial file image is desired
  *  buf_len - Size of the supplied buffer, or 0 (zero) if no initial image is desired
  *
- * Returns:     0 on success, -1 on failure
- * Programmer:  M. Scot Breitenfeld
- *              February 19, 2012
+ *  Returns:     0 on success, -1 on failure
+ *  Programmer:  M. Scot Breitenfeld
+ *  February 19, 2012
  *---------------------------------------------------------------------------*/
 
 int_f
@@ -5601,19 +5238,19 @@ h5pset_file_image_c(hid_t_f *fapl_id, void *buf_ptr, size_t_f *buf_len)
 }
 
 /*----------------------------------------------------------------------------
- * Name:        h5pget_file_image_c
- * Purpose:     Calls H5Pget_file_image
+ *  Name:        h5pget_file_image_c
+ *  Purpose:     Calls H5Pget_file_image
  *
- * Inputs:
+ *  Inputs:
  *  fapl_id - File access property list identifier
- * Outputs:
+ *  Outputs:
  *  buf_ptr - Pointer to the initial file image, 
- *            or NULL if no initial file image is desired
+ *  or NULL if no initial file image is desired
  *  buf_len - Size of the supplied buffer, or 0 (zero) if no initial image is desired
  *
- * Returns:     0 on success, -1 on failure
- * Programmer:  M. Scot Breitenfeld
- *              February 19, 2012
+ *  Returns:     0 on success, -1 on failure
+ *  Programmer:  M. Scot Breitenfeld
+ *  February 19, 2012
  *---------------------------------------------------------------------------*/
 
 int_f
@@ -5640,3 +5277,225 @@ h5pget_file_image_c(hid_t_f *fapl_id, void **buf_ptr, size_t_f *buf_len_ptr)
 
   return ret_value;
 }
+
+#ifdef H5_HAVE_PARALLEL
+/****if* H5Pf/h5pset_fapl_mpio_c
+ * NAME
+ *  h5pset_fapl_mpio_c
+ * PURPOSE
+ *  Call H5Pset_fapl_mpio to set mode for parallel I/O and the user
+ *  supplied communicator and info object
+ * INPUTS
+ *  prp_id - property list identifier
+ *  comm   - MPI communicator
+ *  info   - MPI info object
+ * RETURNS
+ *  0 on success, -1 on failure
+ * AUTHOR
+ *  Elena Pourmal
+ *  Thursday, October 26, 2000
+ * HISTORY
+ *
+ * SOURCE
+*/
+int_f
+h5pset_fapl_mpio_c(hid_t_f *prp_id, int_f* comm, int_f* info)
+/******/
+{
+     int ret_value = -1;
+     hid_t c_prp_id;
+     herr_t ret;
+     MPI_Comm c_comm;
+     MPI_Info c_info;
+     c_comm = MPI_Comm_f2c(*comm);
+     c_info = MPI_Info_f2c(*info);
+
+     /*
+      * Call H5Pset_mpi function.
+      */
+     c_prp_id = *prp_id;
+     ret = H5Pset_fapl_mpio(c_prp_id, c_comm, c_info);
+     if (ret < 0) return ret_value;
+     ret_value = 0;
+     return ret_value;
+}
+/****if* H5Pf/h5pget_fapl_mpio_c
+ * NAME
+ *  h5pget_fapl_mpio_c
+ * PURPOSE
+ *  Call H5Pget_fapl_mpio to retrieve communicator and info object
+ * INPUTS
+ *  prp_id - property list identifier
+ *  comm   - buffer to return MPI communicator
+ *  info   - buffer to return MPI info object
+ * RETURNS
+ *  0 on success, -1 on failure
+ * AUTHOR
+ *  Elena Pourmal
+ *  Thursday, October 26, 2000
+ * HISTORY
+ *
+ * SOURCE
+*/
+int_f
+h5pget_fapl_mpio_c(hid_t_f *prp_id, int_f* comm, int_f* info)
+/******/
+{
+     int ret_value = -1;
+     hid_t c_prp_id;
+     herr_t ret;
+     MPI_Comm c_comm;
+     MPI_Info c_info;
+
+     /*
+      * Call H5Pget_mpi function.
+      */
+     c_prp_id = *prp_id;
+     ret = H5Pget_fapl_mpio(c_prp_id, &c_comm, &c_info);
+     if (ret < 0) return ret_value;
+     *comm = (int_f) MPI_Comm_c2f(c_comm);
+     *info = (int_f) MPI_Info_c2f(c_info);
+     ret_value = 0;
+     return ret_value;
+}
+/****if* H5Pf/h5pset_dxpl_mpio_c
+ * NAME
+ *  h5pset_dxpl_mpio_c
+ * PURPOSE
+ *  Call H5Pset_dxpl_mpio to set transfer mode of the dataset
+ *  trasfer property list
+ * INPUTS
+ *  prp_id - property list identifier
+ *  data_xfer_mode - transfer mode
+ * RETURNS
+ *  0 on success, -1 on failure
+ * AUTHOR
+ *  Elena Pourmal
+ *  Thursday, October 26, 2000
+ * HISTORY
+ *
+ * SOURCE
+*/
+int_f
+h5pset_dxpl_mpio_c(hid_t_f *prp_id, int_f* data_xfer_mode)
+/******/
+{
+     int ret_value = -1;
+     hid_t c_prp_id;
+     herr_t ret;
+     H5FD_mpio_xfer_t c_data_xfer_mode;
+/*
+     switch (*data_xfer_mode) {
+
+        case H5FD_MPIO_INDEPENDENT_F:
+             c_data_xfer_mode = H5FD_MPIO_INDEPENDENT;
+             break;
+
+        case H5FD_MPIO_COLLECTIVE_F:
+             c_data_xfer_mode = H5FD_MPIO_COLLECTIVE;
+             break;
+        default:
+          return ret_value;
+      }
+*/
+     c_data_xfer_mode = (H5FD_mpio_xfer_t)*data_xfer_mode;
+     /*
+      * Call H5Pset_dxpl_mpio function.
+      */
+     c_prp_id = *prp_id;
+     ret = H5Pset_dxpl_mpio(c_prp_id, c_data_xfer_mode);
+     if (ret < 0) return ret_value;
+     ret_value = 0;
+     return ret_value;
+}
+
+/****if* H5Pf/h5pget_dxpl_mpio_c
+ * NAME
+ *  h5pget_dxpl_mpio_c
+ * PURPOSE
+ *  Call H5Pget_dxpl_mpio to get transfer mode of the dataset
+ *  trasfer property list
+ * INPUTS
+ *  prp_id - property list identifier
+ *  data_xfer_mode  - buffer to retrieve transfer mode
+ * RETURNS
+ *  0 on success, -1 on failure
+ * AUTHOR
+ *  Elena Pourmal
+ *  Thursday, June 15, 2000
+ * HISTORY
+ *
+ * SOURCE
+*/
+int_f
+h5pget_dxpl_mpio_c(hid_t_f *prp_id, int_f* data_xfer_mode)
+/******/
+{
+     int ret_value = -1;
+     hid_t c_prp_id;
+     herr_t ret;
+     H5FD_mpio_xfer_t c_data_xfer_mode;
+
+     /*
+      * Call H5Pget_xfer function.
+      */
+     c_prp_id = *prp_id;
+     ret = H5Pget_dxpl_mpio(c_prp_id, &c_data_xfer_mode);
+     if (ret < 0) return ret_value;
+     *data_xfer_mode = (int_f)c_data_xfer_mode;
+/*
+     switch (c_data_xfer_mode) {
+
+        case H5FD_MPIO_INDEPENDENT:
+             *data_xfer_mode = H5FD_MPIO_INDEPENDENT_F;
+             break;
+
+        case H5FD_MPIO_COLLECTIVE:
+             *data_xfer_mode = H5FD_MPIO_COLLECTIVE_F;
+             break;
+
+        default:
+          return ret_value;
+      }
+*/
+     ret_value = 0;
+     return ret_value;
+}
+
+/****if* H5Pf/h5pget_mpio_actual_io_mode_c
+ * NAME
+ *  h5pget_mpio_actual_io_mode_c
+ * PURPOSE
+ *  Calls H5Pget_mpio_actual_io_mode
+ *
+ * INPUTS
+ *  dxpl_id        - Dataset transfer property list identifier.
+ * OUTPUTS
+ *  actual_io_mode - The type of I/O performed by this process.
+ *
+ * RETURNS
+ *  0 on success, -1 on failure
+ * AUTHOR
+ *  M. Scot Breitenfeld
+ *  July 27, 2012
+ * SOURCE
+*/
+int_f
+h5pget_mpio_actual_io_mode_c(hid_t_f *dxpl_id, int_f *actual_io_mode)
+/******/
+{
+  int ret_value = -1;
+  H5D_mpio_actual_io_mode_t c_actual_io_mode;
+
+  /*
+   * Call H5Pget_mpio_actual_io_mode_f function.
+   */
+  if( (H5Pget_mpio_actual_io_mode((hid_t)*dxpl_id, &c_actual_io_mode)) <0 )
+    return ret_value; /* error occurred */
+
+  *actual_io_mode =(int_f)c_actual_io_mode;
+
+  ret_value = 0;
+  return ret_value;
+}
+#endif /*H5_HAVE_PARALLEL*/
diff --git a/fortran/src/H5Pff.F90 b/fortran/src/H5Pff.F90
new file mode 100644
index 0000000..97f907b
--- /dev/null
+++ b/fortran/src/H5Pff.F90
@@ -0,0 +1,7327 @@
+!****h* ROBODoc/H5Pff
+!
+! NAME
+!  H5P
+!
+! PURPOSE
+!  This file contains Fortran interfaces for H5P functions.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *S
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! NOTES
+!
+!       _____ __  __ _____   ____  _____ _______       _   _ _______
+!      |_   _|  \/  |  __ \ / __ \|  __ \__   __|/\   | \ | |__   __|
+! ****   | | | \  / | |__) | |  | | |__) | | |  /  \  |  \| |  | |    ****
+! ****   | | | |\/| |  ___/| |  | |  _  /  | | / /\ \ | . ` |  | |    ****
+! ****  _| |_| |  | | |    | |__| | | \ \  | |/ ____ \| |\  |  | |    ****
+!      |_____|_|  |_|_|     \____/|_|  \_\ |_/_/    \_\_| \_|  |_|
+!
+!  If you add a new H5P function you must add the function name to the
+!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
+!  This is needed for Windows based operating systems.
+!*****
+
+#include <H5config_f.inc>
+
+MODULE H5P
+
+  USE, INTRINSIC :: ISO_C_BINDING
+  USE H5GLOBAL
+  
+  INTERFACE h5pset_fapl_multi_f
+     MODULE PROCEDURE h5pset_fapl_multi_l
+     MODULE PROCEDURE h5pset_fapl_multi_s
+  END INTERFACE
+
+  INTERFACE h5pset_fill_value_f
+     MODULE PROCEDURE h5pset_fill_value_integer
+     MODULE PROCEDURE h5pset_fill_value_char
+     ! Recommended procedure:
+     MODULE PROCEDURE h5pset_fill_value_ptr
+
+  END INTERFACE
+
+  INTERFACE h5pget_fill_value_f
+     MODULE PROCEDURE h5pget_fill_value_integer
+     MODULE PROCEDURE h5pget_fill_value_char
+     ! Recommended procedure:
+     MODULE PROCEDURE h5pget_fill_value_ptr
+
+  END INTERFACE
+
+  INTERFACE h5pset_f
+     MODULE PROCEDURE h5pset_integer
+     MODULE PROCEDURE h5pset_char
+     ! Recommended procedure:
+     MODULE PROCEDURE h5pset_ptr
+
+  END INTERFACE
+
+  INTERFACE h5pget_f
+     MODULE PROCEDURE h5pget_integer
+     MODULE PROCEDURE h5pget_char
+     ! Recommended procedure:
+     MODULE PROCEDURE h5pget_ptr
+  END INTERFACE
+
+  INTERFACE h5pregister_f
+     MODULE PROCEDURE h5pregister_integer
+     ! Recommended procedure:
+     MODULE PROCEDURE h5pregister_ptr
+  END INTERFACE
+
+  INTERFACE h5pinsert_f
+     MODULE PROCEDURE h5pinsert_integer
+     MODULE PROCEDURE h5pinsert_char
+     ! Recommended procedure:
+     MODULE PROCEDURE h5pinsert_ptr
+  END INTERFACE
+
+  INTERFACE
+     INTEGER FUNCTION h5pget_fill_value_c(prp_id, type_id, fillvalue) &
+          BIND(C, NAME='h5pget_fill_value_c')
+       IMPORT :: c_ptr
+       IMPORT :: HID_T
+       IMPLICIT NONE
+       INTEGER(HID_T), INTENT(IN) :: prp_id
+       INTEGER(HID_T), INTENT(IN) :: type_id
+       TYPE(C_PTR), VALUE :: fillvalue
+     END FUNCTION h5pget_fill_value_c
+  END INTERFACE
+
+  INTERFACE
+     INTEGER FUNCTION h5pset_fill_value_c(prp_id, type_id, fillvalue) &
+          BIND(C, NAME='h5pset_fill_value_c')
+       IMPORT :: c_ptr
+       IMPORT :: HID_T
+       IMPLICIT NONE
+       INTEGER(HID_T), INTENT(IN) :: prp_id
+       INTEGER(HID_T), INTENT(IN) :: type_id
+       TYPE(C_PTR), VALUE :: fillvalue
+     END FUNCTION h5pset_fill_value_c
+  END INTERFACE
+
+  INTERFACE
+     INTEGER FUNCTION h5pset_c(prp_id, name, name_len, value) &
+          BIND(C, NAME='h5pset_c')
+       IMPORT :: c_char, c_ptr
+       IMPORT :: HID_T
+       IMPLICIT NONE
+       INTEGER(HID_T), INTENT(IN) :: prp_id
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+       INTEGER :: name_len
+       TYPE(C_PTR), VALUE :: value
+     END FUNCTION h5pset_c
+  END INTERFACE
+
+  INTERFACE
+     INTEGER FUNCTION h5pget_c(prp_id, name, name_len, value) &
+          BIND(C, NAME='h5pget_c')
+       IMPORT :: c_char, c_ptr
+       IMPORT :: HID_T
+       INTEGER(HID_T), INTENT(IN) :: prp_id 
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+       INTEGER :: name_len
+       TYPE(C_PTR), VALUE :: value
+     END FUNCTION h5pget_c
+  END INTERFACE
+
+  INTERFACE
+     INTEGER FUNCTION h5pregister_c(class, name, name_len, size, value) &
+          BIND(C, NAME='h5pregister_c')
+       IMPORT :: c_char, c_ptr
+       IMPORT :: HID_T, SIZE_T
+       IMPLICIT NONE
+       INTEGER(HID_T), INTENT(IN) :: class
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+       INTEGER, INTENT(IN)         :: name_len
+       INTEGER(SIZE_T), INTENT(IN) :: size
+       TYPE(C_PTR), INTENT(IN), VALUE :: value
+     END FUNCTION h5pregister_c
+  END INTERFACE
+
+  INTERFACE
+     INTEGER FUNCTION h5pinsert_c(plist, name, name_len, size, value) &
+          BIND(C, NAME='h5pinsert_c')
+       IMPORT :: c_char, c_ptr
+       IMPORT :: HID_T, SIZE_T
+       IMPLICIT NONE
+       INTEGER(HID_T), INTENT(IN) :: plist
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+       INTEGER, INTENT(IN)         :: name_len
+       INTEGER(SIZE_T), INTENT(IN) :: size
+       TYPE(C_PTR), INTENT(IN), VALUE :: value
+     END FUNCTION h5pinsert_c
+  END INTERFACE
+
+CONTAINS
+
+!****s* H5P/h5pcreate_f 
+! NAME
+!  h5pcreate_f 
+!
+! PURPOSE
+!  Creates a new property as an instance of a property 
+!  list class.
+!
+! INPUTS
+!  class  - type of the property class to be created.
+!	    Possible values are:
+!             H5P_OBJECT_CREATE_F
+!             H5P_FILE_CREATE_F
+!             H5P_FILE_ACCESS_F
+!             H5P_DATASET_CREATE_F
+!             H5P_DATASET_ACCESS_F
+!             H5P_DATASET_XFER_F
+!             H5P_FILE_MOUNT_F
+!             H5P_GROUP_CREATE_F
+!             H5P_GROUP_ACCESS_F
+!             H5P_DATATYPE_CREATE_F
+!             H5P_DATATYPE_ACCESS_F
+!             H5P_STRING_CREATE_F
+!             H5P_ATTRIBUTE_CREATE _F
+!             H5P_OBJECT_COPY_F
+!             H5P_LINK_CREATE_F
+!             H5P_LINK_ACCESS_F
+!
+! OUTPUTS
+!  prp_id - property list identifier
+!  hdferr - error code		
+!	     Success:  0
+!	     Failure: -1 
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pcreate_f(class, prp_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN)  :: class
+    INTEGER(HID_T), INTENT(OUT) :: prp_id
+    INTEGER       , INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pcreate_c(class, prp_id) &
+            BIND(C,NAME='h5pcreate_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: class
+         INTEGER(HID_T), INTENT(OUT) :: prp_id
+       END FUNCTION h5pcreate_c
+    END INTERFACE
+
+    hdferr = h5pcreate_c(class, prp_id) 
+  END SUBROUTINE h5pcreate_f
+
+!****s* H5P/h5pset_preserve_f 
+! NAME
+!   h5pset_preserve_f 
+!
+! PURPOSE
+!  Sets the dataset transfer property list status to 
+!  TRUE or FALSE for initializing compound datatype
+!  members during write/read operations.
+!
+! INPUTS
+!  prp_id	- property list identifier
+!  flag		- status flag
+!
+! OUTPUTS
+!  hdferr	- Returns 0 if successful and -1 if fails
+!
+! OPTIONAL PARAMETERS
+!  NONE
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!                       
+!  Datatype of the flag parameter is changed from 
+!  INTEGER to LOGICAL June 4, 2003
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_preserve_f(prp_id, flag, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    LOGICAL, INTENT(IN) ::  flag         ! TRUE/FALSE flag to set the dataset
+                                         ! transfer property for partila writing/reading
+                                         ! compound datatype
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTEGER :: flag_c
+
+    INTERFACE
+       INTEGER FUNCTION h5pset_preserve_c(prp_id, flag_c) &
+            BIND(C,NAME='h5pset_preserve_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER ::  flag_c
+       END FUNCTION h5pset_preserve_c
+    END INTERFACE
+    flag_c = 0
+    IF(flag) flag_c = 1
+    hdferr = h5pset_preserve_c(prp_id, flag_c) 
+  END SUBROUTINE h5pset_preserve_f
+
+!****s* H5P/h5pget_preserve_f 
+! NAME
+!  h5pget_preserve_f 
+!
+! PURPOSE
+!  Checks status of the dataset transfer property list.
+!
+! INPUTS
+!  prp_id  - property list identifier
+!
+! OUTPUTS
+!  flag	   - status flag
+!  hdferr  - error code		
+!	Success:  0
+!	Failure: -1
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001
+! 
+!  Datatype of the flag parameter is changed from 
+!  INTEGER to LOGICAL 
+!  June 4, 2003 
+! 
+! Fortran90 Interface:
+  SUBROUTINE h5pget_preserve_f(prp_id, flag, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    LOGICAL, INTENT(OUT) ::  flag        ! TRUE/FALSE flag. Shows status of the dataset's
+                                         ! transfer property for partial writing/reading
+                                         ! compound datatype
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTEGER :: flag_c
+
+    INTERFACE
+       INTEGER FUNCTION h5pget_preserve_c(prp_id, flag_c) &
+            BIND(C,NAME='h5pget_preserve_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER ::  flag_c
+       END FUNCTION h5pget_preserve_c
+    END INTERFACE
+    
+    hdferr = h5pget_preserve_c(prp_id, flag_c) 
+    flag = .FALSE.
+    IF(flag_c .EQ. 1) flag = .TRUE.
+  END SUBROUTINE h5pget_preserve_f
+
+!****s* H5P/h5pget_class_f 
+! NAME
+!  h5pget_class_f 
+!
+! PURPOSE
+!  Returns the property list class for a property list.
+!
+! INPUTS
+!  prp_id	- property list identifier
+!
+! OUTPUTS
+!  classtype	- property list class
+!  hdferr:	- error code		
+!		   Success:  0
+!		   Failure: -1 
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pget_class_f(prp_id, classtype, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id      ! Property list identifier 
+    INTEGER(HID_T), INTENT(OUT) :: classtype  ! The type of the property list 
+                                              ! to be created.
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5pget_class_c(prp_id, classtype) &
+            BIND(C,NAME='h5pget_class_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN)  :: prp_id
+         INTEGER(HID_T), INTENT(OUT) :: classtype 
+       END FUNCTION h5pget_class_c
+    END INTERFACE
+
+    hdferr = h5pget_class_c(prp_id, classtype) 
+  END SUBROUTINE h5pget_class_f
+
+!****s* H5P/h5pcopy_f 
+! NAME
+!  h5pcopy_f 
+!
+! PURPOSE
+!  Copies an existing property list to create a new 
+!  property list
+!
+! INPUTS
+!  prp_id       - property list identifier
+! OUTPUTS
+!  new_prp_id	- new property list identifier
+!  hdferr:	- error code		
+!		   Success:  0
+!		   Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pcopy_f(prp_id, new_prp_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id      ! Property list identifier 
+    INTEGER(HID_T), INTENT(OUT) :: new_prp_id ! Identifier of property list
+    INTEGER, INTENT(OUT) :: hdferr            ! Error code
+                                              ! 0 on success and -1 on failure
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5pcopy_c(prp_id, new_prp_id) &
+            BIND(C,NAME='h5pcopy_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER(HID_T), INTENT(OUT) :: new_prp_id
+       END FUNCTION h5pcopy_c
+    END INTERFACE
+    
+    hdferr = h5pcopy_c(prp_id, new_prp_id)
+  END SUBROUTINE h5pcopy_f
+
+!****s* H5P/h5pclose_f 
+! NAME
+!  h5pclose_f 
+!
+! PURPOSE
+!  Terminates access to a property list. 
+!
+! INPUTS
+!  prp_id - identifier of the property list to 
+!	    terminate access to. 
+! OUTPUTS
+!  hdferr - error code		
+!	    Success:  0
+!	    Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pclose_f(prp_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier 
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+                                          ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pclose_c(prp_id) &
+            BIND(C,NAME='h5pclose_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id 
+       END FUNCTION h5pclose_c
+    END INTERFACE
+    
+    hdferr = h5pclose_c(prp_id)
+  END SUBROUTINE h5pclose_f
+
+!****s* H5P/h5pset_chunk_f 
+! NAME
+!   h5pset_chunk_f 
+!
+! PURPOSE
+!  Sets the size of the chunks used to store 
+!  a chunked layout dataset. 
+!
+! INPUTS
+!  prp_id  - datatset creation property list identifier
+!  ndims   - number of dimensions for each chunk
+!  dims	   - array with dimension sizes for each chunk
+! OUTPUTS
+!  hdferr  - error code		
+!	      Success:  0
+!	      Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!   Explicit Fortran interfaces were added for 
+!   called C functions (it is needed for Windows
+!   port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pset_chunk_f(prp_id, ndims, dims, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(IN) :: ndims         ! Number of chunk dimensions
+    INTEGER(HSIZE_T), DIMENSION(ndims), INTENT(IN) :: dims    
+                                         ! Array containing sizes of
+                                         ! chunk dimensions
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_chunk_c(prp_id, ndims, dims) &
+            BIND(C,NAME='h5pset_chunk_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER, INTENT(IN) :: ndims
+         INTEGER(HSIZE_T), DIMENSION(ndims), INTENT(IN) :: dims
+       END FUNCTION h5pset_chunk_c
+    END INTERFACE
+    
+    hdferr =  h5pset_chunk_c(prp_id, ndims, dims)
+  END SUBROUTINE h5pset_chunk_f
+
+!****s* H5P/h5pget_chunk_f 
+! NAME
+!   h5pget_chunk_f 
+!
+! PURPOSE
+!  Retrieves the size of chunks for the raw data of a 
+!  chunked layout dataset
+!
+! INPUTS
+!  prp_id	- property list identifier
+!  ndims	- size of dims array
+! OUTPUTS
+!  dims		- array with dimension sizes for each chunk
+!  hdferr	- error code		
+!		   Success:  number of chunk dimensions
+!		   Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pget_chunk_f(prp_id, ndims, dims, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(IN) :: ndims         ! Number of chunk dimensions to
+                                         ! to return
+    INTEGER(HSIZE_T), DIMENSION(ndims), INTENT(OUT) :: dims    
+                                         ! Array containing sizes of
+                                         ! chunk dimensions
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
+                                         !  number of chunk dimensions on success,
+                                         !  -1 on failure
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5pget_chunk_c(prp_id, ndims, dims) &
+            BIND(C,NAME='h5pget_chunk_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER :: ndims
+         INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: dims
+       END FUNCTION h5pget_chunk_c
+    END INTERFACE
+
+    hdferr =  h5pget_chunk_c(prp_id, ndims, dims)
+  END SUBROUTINE h5pget_chunk_f
+
+!****s* H5P/h5pset_deflate_f 
+! NAME
+!   h5pset_deflate_f 
+!
+! PURPOSE
+!   Sets compression method and compression level. 
+!
+! INPUTS
+!   prp_id  - property list identifier
+!   level   - compression level
+! OUTPUTS
+!  
+!  hdferr  - error code		
+!	      Success:  0
+!	      Failure: -1
+!
+! AUTHOR
+!	Elena Pourmal
+!		August 12, 1999
+!
+! HISTORY
+! 	Explicit Fortran interfaces were added for 
+!			called C functions (it is needed for Windows
+!			port).  March 14, 2001
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pset_deflate_f(prp_id, level, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(IN) :: level         ! Compression level 
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+
+!  INTEGER, EXTERNAL :: h5pset_deflate_c
+!  MS FORTRAN needs explicit interface for C functions called here.
+!
+    INTERFACE
+       INTEGER FUNCTION h5pset_deflate_c(prp_id, level) &
+            BIND(C,NAME='h5pset_deflate_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER, INTENT(IN) :: level
+       END FUNCTION h5pset_deflate_c
+    END INTERFACE
+    hdferr = h5pset_deflate_c(prp_id, level)
+    
+  END SUBROUTINE h5pset_deflate_f
+
+!****s* H5P/h5pget_version_f 
+! NAME
+!  h5pget_version_f 
+!
+! PURPOSE
+!  Retrieves the version information of various objects 
+!  for a file creation property list
+!
+! INPUTS
+!  prp_id	- file createion property list identifier
+! OUTPUTS
+!  boot		- super block version number
+!  freelist	- global freelist version number
+!  stab		- symbol table version number
+!  shhdr	- shared object header version number
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:          
+  SUBROUTINE h5pget_version_f(prp_id, boot, freelist, &
+       stab, shhdr, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id        ! Property list identifier 
+    INTEGER, DIMENSION(:), INTENT(OUT) :: boot  ! Array to put boot
+                                                ! block version number
+    INTEGER, DIMENSION(:), INTENT(OUT) :: freelist  ! Array to put global
+                                                    ! Freelist version number
+
+    INTEGER, DIMENSION(:), INTENT(OUT) :: stab  ! Array to put symbol
+                                                ! table version number
+    INTEGER, DIMENSION(:), INTENT(OUT) :: shhdr ! Array to put shared
+                                                ! object header version number
+    INTEGER, INTENT(OUT) :: hdferr              ! Error code
+                                                ! 0 on success and -1 on failure
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5pget_version_c(prp_id, boot, freelist, stab, shhdr) &
+            BIND(C,NAME='h5pget_version_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER, DIMENSION(*), INTENT(OUT) :: boot 
+         INTEGER, DIMENSION(*), INTENT(OUT) :: freelist 
+         INTEGER, DIMENSION(*), INTENT(OUT) :: stab
+         INTEGER, DIMENSION(*), INTENT(OUT) :: shhdr
+       END FUNCTION h5pget_version_c
+    END INTERFACE
+    
+    hdferr = h5pget_version_c(prp_id, boot, freelist, stab, shhdr)
+  END SUBROUTINE h5pget_version_f
+
+!****s* H5P/h5pset_userblock_f 
+! NAME
+!  h5pset_userblock_f 
+!
+! PURPOSE
+!   Sets user block size
+!
+! INPUTS
+!   prp_id - file creation property list to modify
+!   size   - size of the user-block in bytes
+!
+! OUTPUTS
+!  hdferr  - error code		
+!	      Success:  0
+!	      Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_userblock_f (prp_id, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER(HSIZE_T), INTENT(IN) :: size ! Size of the user-block in bytes 
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_userblock_c(prp_id, size) &
+            BIND(C,NAME='h5pset_userblock_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER(HSIZE_T), INTENT(IN) :: size
+       END FUNCTION h5pset_userblock_c
+    END INTERFACE
+
+    hdferr = h5pset_userblock_c(prp_id, size)
+  END SUBROUTINE h5pset_userblock_f
+
+!****s* H5P/h5pget_userblock_f 
+! NAME
+!  h5pget_userblock_f 
+!
+! PURPOSE
+!  Gets user block size.
+!
+! INPUTS
+!  
+!  prp_id	- file creation property list identifier
+! OUTPUTS
+!  
+!  block_size	- size of the user block in bytes
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pget_userblock_f(prp_id, block_size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id         ! Property list identifier 
+    INTEGER(HSIZE_T), INTENT(OUT) ::  block_size ! Size of the 
+                                                 ! user-block in bytes 
+    INTEGER, INTENT(OUT) :: hdferr               ! Error code
+                                                 ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_userblock_c(prp_id, block_size) &
+            BIND(C,NAME='h5pget_userblock_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER(HSIZE_T), INTENT(OUT) :: block_size
+       END FUNCTION h5pget_userblock_c
+    END INTERFACE
+    hdferr = h5pget_userblock_c(prp_id,  block_size)
+  END SUBROUTINE h5pget_userblock_f
+
+!****s* H5P/h5pset_sizes_f 
+! NAME
+!  h5pset_sizes_f 
+!
+! PURPOSE
+!  Sets the byte size of the offsets and lengths used 
+!  to address objects in an HDF5 file.
+!
+! INPUTS
+!  prp_id	- file creation property list identifier
+!  sizeof_addr	- size of an object offset in bytes 
+!  sizeof_size	- size of an object length in bytes
+! OUTPUTS
+!  
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pset_sizes_f (prp_id, sizeof_addr, sizeof_size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id       ! Property list identifier 
+    INTEGER(SIZE_T), INTENT(IN) :: sizeof_addr ! Size of an object 
+                                               !  offset in bytes 
+    INTEGER(SIZE_T), INTENT(IN) :: sizeof_size ! Size of an object 
+                                               !  length in bytes 
+    INTEGER, INTENT(OUT) :: hdferr             ! Error code
+                                               ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_sizes_c(prp_id, sizeof_addr, sizeof_size) &
+            BIND(C,NAME='h5pset_sizes_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id 
+         INTEGER(SIZE_T), INTENT(IN) :: sizeof_addr
+         INTEGER(SIZE_T), INTENT(IN) :: sizeof_size
+       END FUNCTION h5pset_sizes_c
+    END INTERFACE
+    
+    hdferr = h5pset_sizes_c(prp_id, sizeof_addr, sizeof_size)
+  END SUBROUTINE h5pset_sizes_f
+
+!****s* H5P/h5pget_sizes_f 
+! NAME
+!  h5pget_sizes_f 
+!
+! PURPOSE
+!  Retrieves the size of the offsets and lengths used 
+!  in an HDF5 file
+!
+! INPUTS
+!  prp_id	- file creation property list identifier
+! OUTPUTS
+!  
+!  sizeof_addr	- size of an object offset in bytes 
+!  sizeof_size	- size of an object length in bytes
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pget_sizes_f(prp_id, sizeof_addr, sizeof_size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id        ! Property list identifier 
+    INTEGER(SIZE_T), INTENT(OUT) :: sizeof_addr ! Size of an object
+                                                ! offset in bytes 
+    INTEGER(SIZE_T), INTENT(OUT) :: sizeof_size ! Size of an object
+                                                ! length in bytes 
+    INTEGER, INTENT(OUT) :: hdferr              ! Error code
+                                                ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_sizes_c(prp_id, sizeof_addr, sizeof_size) &
+            BIND(C,NAME='h5pget_sizes_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id 
+         INTEGER(SIZE_T), INTENT(OUT) :: sizeof_addr
+         INTEGER(SIZE_T), INTENT(OUT) :: sizeof_size
+       END FUNCTION h5pget_sizes_c
+    END INTERFACE
+    
+    hdferr = h5pget_sizes_c(prp_id, sizeof_addr, sizeof_size)
+  END SUBROUTINE h5pget_sizes_f
+
+!****s* H5P/h5pset_sym_k_f 
+! NAME
+!  h5pset_sym_k_f 
+!
+! PURPOSE
+!  Sets the size of parameters used to control the 
+!symbol table nodes
+!
+! INPUTS
+!  
+!  prp_id  - file creation property list identifier
+!  ik	   - symbol table tree rank
+!  lk	   - symbol table node size
+! OUTPUTS
+!  
+!  hdferr  - error code		
+!	      Success:  0
+!	      Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pset_sym_k_f (prp_id, ik, lk, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(IN) :: ik            ! Symbol table tree rank 
+    INTEGER, INTENT(IN) :: lk            ! Symbol table node size 
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_sym_k_c(prp_id, ik, lk) &
+            BIND(C,NAME='h5pset_sym_k_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id 
+         INTEGER, INTENT(IN) :: ik
+         INTEGER, INTENT(IN) :: lk
+       END FUNCTION h5pset_sym_k_c
+    END INTERFACE
+  
+    hdferr = h5pset_sym_k_c(prp_id, ik, lk)
+  END SUBROUTINE h5pset_sym_k_f
+!****s* H5P/h5pget_sym_k_f 
+! NAME
+!  h5pget_sym_k_f 
+!
+! PURPOSE
+!  Retrieves the size of the symbol table B-tree 1/2 rank
+!  and the symbol table leaf node 1/2 size. 
+!
+! INPUTS
+!  
+!  prp_id	- file creation property list identifier
+! OUTPUTS
+!  
+!  ik		- symbol table tree 1/2 rank
+!  lk		- symbol table node 1/2 size
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pget_sym_k_f(prp_id, ik, lk, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(OUT) :: ik           ! Symbol table tree rank
+    INTEGER, INTENT(OUT) :: lk           ! Symbol table node size
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_sym_k_c(prp_id, ik, lk) &
+            BIND(C,NAME='h5pget_sym_k_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id 
+         INTEGER, INTENT(OUT) :: ik
+         INTEGER, INTENT(OUT) :: lk
+       END FUNCTION h5pget_sym_k_c
+    END INTERFACE
+    
+    hdferr = h5pget_sym_k_c(prp_id, ik, lk)
+  END SUBROUTINE h5pget_sym_k_f
+!****s* H5P/h5pset_istore_k_f 
+! NAME
+!  h5pset_istore_k_f 
+!
+! PURPOSE
+!  Sets the size of the parameter used to control the 
+!  B-trees for indexing chunked datasets
+!
+! INPUTS
+!  
+!  prp_id	- file creation property list identifier
+!  ik		- 1/2 rank of chunked storage B-tree
+! OUTPUTS
+!  
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pset_istore_k_f (prp_id, ik, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(IN) :: ik            ! 1/2 rank of chunked storage B-tree
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_istore_k_c(prp_id, ik) &
+            BIND(C,NAME='h5pset_istore_k_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER, INTENT(IN) :: ik
+       END FUNCTION h5pset_istore_k_c
+    END INTERFACE
+    
+    hdferr = h5pset_istore_k_c(prp_id, ik)
+  END SUBROUTINE h5pset_istore_k_f
+
+!****s* H5P/h5pget_istore_k_f 
+! NAME
+!  h5pget_istore_k_f 
+!
+! PURPOSE
+!  Queries the 1/2 rank of an indexed storage B-tree. 
+!
+! INPUTS
+!  
+!  prp_id	- file creation property list identifier
+! OUTPUTS
+!  
+!  ik		- 1/2 rank of chunked storage B-tree
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pget_istore_k_f(prp_id, ik, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(OUT) :: ik           ! 1/2 rank of chunked storage B-tree
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_istore_k_c(prp_id, ik) &
+            BIND(C,NAME='h5pget_istore_k_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER, INTENT(OUT) :: ik
+       END FUNCTION h5pget_istore_k_c
+    END INTERFACE
+    
+    hdferr = h5pget_istore_k_c(prp_id, ik)
+  END SUBROUTINE h5pget_istore_k_f
+
+!****s* H5P/h5pget_driver_f 
+! NAME
+!  h5pget_driver_f 
+!
+! PURPOSE
+!  Returns low-lever driver identifier. 
+!
+! INPUTS
+!  
+!  prp_id  - file access or data transfer property 
+!	     list identifier. 
+! OUTPUTS
+!  
+!  driver  - low-level driver identifier
+!  hdferr  - error code		
+!	      Success:  0
+!	      Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pget_driver_f(prp_id, driver, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier 
+    INTEGER(HID_T), INTENT(OUT) :: driver ! Low-level file driver identifier
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+                                          ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_driver_c(prp_id, driver) &
+            BIND(C,NAME='h5pget_driver_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER(HID_T), INTENT(OUT) :: driver
+       END FUNCTION h5pget_driver_c
+    END INTERFACE
+    
+    hdferr = h5pget_driver_c(prp_id, driver)
+  END SUBROUTINE h5pget_driver_f
+
+!****s* H5P/h5pset_fapl_stdio_f 
+! NAME
+!  h5pset_fapl_stdio_f 
+!
+! PURPOSE
+!  Sets the standard I/O driver. 
+!
+! INPUTS
+!  
+!  prp_id  - file access property list identifier
+! OUTPUTS
+!  
+!  hdferr  - error code		
+!	      Success:  0
+!	      Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pset_fapl_stdio_f (prp_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_fapl_stdio_c(prp_id) &
+            BIND(C,NAME='h5pset_fapl_stdio_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+       END FUNCTION h5pset_fapl_stdio_c
+    END INTERFACE
+    
+    hdferr = h5pset_fapl_stdio_c(prp_id)
+  END SUBROUTINE h5pset_fapl_stdio_f
+
+!****s* H5P/h5pget_stdio_f 
+! NAME
+!  h5pget_stdio_f 
+!
+! PURPOSE
+!  NOT AVAILABLE
+!
+! INPUTS
+!  
+! OUTPUTS
+!  
+!  hdferr  - error code		
+!	      Success:  0
+!	      Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! SOURCE
+!          SUBROUTINE h5pget_stdio_f (prp_id, io, hdferr)
+!
+!            IMPLICIT NONE
+!            INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
+!            INTEGER, INTENT(OUT) :: io   ! value indicates that the file
+                                         !access property list is set to
+                                         !the stdio driver
+!            INTEGER, INTENT(OUT) :: hdferr  ! Error code
+                                     ! 0 on success and -1 on failure
+!*****
+!            INTEGER, EXTERNAL :: h5pget_stdio_c
+!            hdferr = h5pget_stdio_c(prp_id, io)
+!          END SUBROUTINE h5pget_stdio_f
+
+!****s* H5P/h5pset_fapl_sec2_f 
+! NAME
+!  h5pset_fapl_sec2_f 
+!
+! PURPOSE
+!  Sets the sec2 driver. 
+!
+! INPUTS
+!  
+!  prp_id  - file access property list identifier
+! OUTPUTS
+!  
+!  hdferr  - error code		
+!	      Success:  0
+!	      Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pset_fapl_sec2_f (prp_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_fapl_sec2_c(prp_id) &
+            BIND(C,NAME='h5pset_fapl_sec2_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+       END FUNCTION h5pset_fapl_sec2_c
+    END INTERFACE
+  
+    hdferr = h5pset_fapl_sec2_c(prp_id)
+  END SUBROUTINE h5pset_fapl_sec2_f
+
+!****s* H5P/h5pget_sec2_f 
+! NAME
+!   h5pget_sec2_f 
+!
+! PURPOSE
+!  NOT AVAILABLE
+!
+! INPUTS
+!  
+! OUTPUTS
+!  
+!  hdferr  - error code		
+!	      Success:  0
+!	      Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! SOURCE!          SUBROUTINE h5pget_sec2_f (prp_id, sec2, hdferr) 
+!            IMPLICIT NONE
+!            INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
+!            INTEGER, INTENT(OUT) :: sec2   ! value indicates whether the file
+                                           !driver uses the functions declared
+                                           !in the unistd.h file
+!            INTEGER, INTENT(OUT) :: hdferr  ! Error code
+                                     ! 0 on success and -1 on failure
+!*****
+!            INTEGER, EXTERNAL :: h5pget_sec2_c
+!            hdferr = h5pget_sec2_c(prp_id, sec2)
+!          END SUBROUTINE h5pget_sec2_f
+
+!****s* H5P/h5pset_alignment_f 
+! NAME
+!  h5pset_alignment_f 
+!
+! PURPOSE
+!  Sets alignment properties of a file access property list. 
+!
+! INPUTS
+!  
+!  prp_id	- file access property list identifier
+!  threshold	- threshold value	
+!  alignment	- alignment value
+! OUTPUTS
+!  
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pset_alignment_f(prp_id, threshold,  alignment, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id      ! Property list identifier 
+    INTEGER(HSIZE_T), INTENT(IN) :: threshold ! Threshold value
+    INTEGER(HSIZE_T), INTENT(IN) :: alignment ! alignment value
+    INTEGER, INTENT(OUT) :: hdferr            ! Error code
+                                              ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_alignment_c(prp_id, threshold, alignment) &
+            BIND(C,NAME='h5pset_alignment_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER(HSIZE_T), INTENT(IN) :: threshold
+         INTEGER(HSIZE_T), INTENT(IN) :: alignment
+       END FUNCTION h5pset_alignment_c
+    END INTERFACE
+  
+    hdferr = h5pset_alignment_c(prp_id, threshold, alignment)
+  END SUBROUTINE h5pset_alignment_f
+
+!****s* H5P/h5pget_alignment_f 
+! NAME
+!   h5pget_alignment_f 
+!
+! PURPOSE
+!  Retrieves the current settings for alignment 
+!  properties from a file access property list. 
+!
+! INPUTS
+!  prp_id       - file access property list identifier
+!
+! OUTPUTS
+!  threshold	- threshold value	
+!  alignment	- alignment value
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pget_alignment_f(prp_id, threshold,  alignment, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id       ! Property list identifier 
+    INTEGER(HSIZE_T), INTENT(OUT) :: threshold ! Threshold value
+    INTEGER(HSIZE_T), INTENT(OUT) :: alignment ! alignment value
+    INTEGER, INTENT(OUT) :: hdferr             ! Error code
+                                             ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_alignment_c(prp_id, threshold, alignment) &
+            BIND(C,NAME='h5pget_alignment_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER(HSIZE_T), INTENT(OUT) :: threshold
+         INTEGER(HSIZE_T), INTENT(OUT) :: alignment
+       END FUNCTION h5pget_alignment_c
+    END INTERFACE
+    
+    hdferr = h5pget_alignment_c(prp_id, threshold, alignment)
+  END SUBROUTINE h5pget_alignment_f
+
+!****s* H5P/h5pset_fapl_core_f 
+! NAME
+!   h5pset_fapl_core_f 
+!
+! PURPOSE
+!  Modifies the file access property list to use the 
+!  H5FD_CORE driver. 
+!
+! INPUTS
+!  prp_id	    - file access property list identifier
+!  increment	    - size, in bytes, of memory increments 
+!  backing_store    - boolean flag indicating whether to write 
+!		      the file contents to disk when the file is closed. 
+! OUTPUTS
+!  hdferr           - error code		
+!	                Success:  0
+!	                Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pset_fapl_core_f(prp_id, increment, backing_store, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id     ! Property list identifier 
+    INTEGER(SIZE_T), INTENT(IN) :: increment ! File block size in bytes.
+    LOGICAL, INTENT(IN) :: backing_store ! Flag to indicate that
+                                         ! entire file contents are flushed to a file 
+                                         ! with the same name as this core file.
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTEGER :: backing_store_flag
+    INTERFACE
+       INTEGER FUNCTION h5pset_fapl_core_c(prp_id, increment, backing_store_flag) &
+            BIND(C,NAME='h5pset_fapl_core_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id 
+         INTEGER(SIZE_T), INTENT(IN) :: increment 
+         INTEGER :: backing_store_flag 
+       END FUNCTION h5pset_fapl_core_c
+    END INTERFACE
+    backing_store_flag = 0
+    IF(backing_store) backing_store_flag = 1
+    hdferr = h5pset_fapl_core_c(prp_id, increment, backing_store_flag)
+  END SUBROUTINE h5pset_fapl_core_f
+
+!****s* H5P/h5pget_fapl_core_f 
+! NAME
+!  h5pget_fapl_core_f 
+!
+! PURPOSE
+!  Queries core file driver properties. 
+!
+! INPUTS
+!  prp_id	 - file access property list identifier
+! OUTPUTS
+!  
+!  increment	 - size, in bytes, of memory increments 
+!  backing_store - boolean flag indicating whether to write 
+!		   the file contents to disk when the file is closed. 
+!  hdferr        - error code		
+!	            Success:  0
+!	            Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pget_fapl_core_f(prp_id, increment, backing_store, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id      ! Property list identifier 
+    INTEGER(SIZE_T), INTENT(OUT) :: increment ! File block size in bytes.
+    LOGICAL, INTENT(OUT) :: backing_store   ! Flag to indicate that
+                                            ! entire file contents are flushed to a file 
+                                            ! with the same name as this core file.
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+                                            ! 0 on success and -1 on failure
+!*****
+    INTEGER :: backing_store_flag 
+
+    INTERFACE
+       INTEGER FUNCTION h5pget_fapl_core_c(prp_id, increment, backing_store_flag) &
+            BIND(C,NAME='h5pget_fapl_core_c')
+         IMPORT :: HID_T,SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id 
+         INTEGER(SIZE_T), INTENT(OUT) :: increment 
+         INTEGER :: backing_store_flag 
+       END FUNCTION h5pget_fapl_core_c
+    END INTERFACE
+    
+    hdferr = h5pget_fapl_core_c(prp_id, increment, backing_store_flag)
+    backing_store =.FALSE.
+    IF (backing_store_flag .EQ. 1) backing_store =.TRUE.
+  END SUBROUTINE h5pget_fapl_core_f
+
+!****s* H5P/ h5pset_fapl_family_f 
+! NAME
+!   h5pset_fapl_family_f 
+!
+! PURPOSE
+!  Sets the file access property list to use the family driver. 
+!
+! INPUTS
+!  prp_id	- file access property list identifier
+!  memb_size	- size in bytes of each file member 
+!  memb_plist	- identifier of the file access property 
+!		  list to be used for each family member
+! OUTPUTS
+!  hdferr  - error code		
+!	      Success:  0
+!	      Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pset_fapl_family_f(prp_id, memb_size, memb_plist , hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id      ! Property list identifier 
+    INTEGER(HSIZE_T), INTENT(IN) :: memb_size ! Logical size, in bytes,
+                                              ! of each family member
+    INTEGER(HID_T), INTENT(IN) :: memb_plist  ! Identifier of the file 
+                                              ! access property list for 
+                                              ! each member of the family
+    INTEGER, INTENT(OUT) :: hdferr            ! Error code
+                                              ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_fapl_family_c(prp_id, memb_size, memb_plist) &
+            BIND(C,NAME='h5pset_fapl_family_c')
+         IMPORT :: HID_T,HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER(HSIZE_T), INTENT(IN) :: memb_size
+         INTEGER(HID_T), INTENT(IN) :: memb_plist
+       END FUNCTION h5pset_fapl_family_c
+    END INTERFACE
+
+    hdferr = h5pset_fapl_family_c(prp_id, memb_size, memb_plist)
+  END SUBROUTINE h5pset_fapl_family_f
+
+!****s* H5P/h5pget_fapl_family_f 
+! NAME
+!  h5pget_fapl_family_f 
+!
+! PURPOSE
+!  Returns file access property list information.  	
+!
+! INPUTS
+!  prp_id	- file access property list identifier
+! OUTPUTS
+!  memb_size	- size in bytes of each file member 
+!  memb_plist	- identifier of the file access property 
+!		  list to be used for each family member
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pget_fapl_family_f(prp_id, memb_size, memb_plist , hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id       ! Property list identifier 
+    INTEGER(HSIZE_T), INTENT(OUT) :: memb_size ! Logical size, in bytes,
+                                               ! of each family member
+    INTEGER(HID_T), INTENT(OUT) :: memb_plist  ! Identifier of the file 
+                                               ! access property list for 
+                                               ! each member of the family
+    INTEGER, INTENT(OUT) :: hdferr             ! Error code
+                                               ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_fapl_family_c(prp_id, memb_size, memb_plist) &
+            BIND(C,NAME='h5pget_fapl_family_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER(HSIZE_T), INTENT(OUT) :: memb_size
+         INTEGER(HID_T), INTENT(OUT) :: memb_plist
+       END FUNCTION h5pget_fapl_family_c
+    END INTERFACE
+    
+    hdferr = h5pget_fapl_family_c(prp_id, memb_size, memb_plist)
+  END SUBROUTINE h5pget_fapl_family_f
+
+!****s* H5P/h5pset_cache_f 
+! NAME
+!   h5pset_cache_f 
+!
+! PURPOSE
+!  Sets the meta data cache and raw data chunk 
+!  cache parameters
+!
+! INPUTS
+!  
+!  prp_id	- file access property list identifier
+!  mdc_nelmts	- number of elements (objects) in the meta 
+!		  data cache 
+!  rdcc_nelmts	- number of elements (objects) in the raw 
+!		  data chunk cache 
+!  rdcc_nbytes	- total size of the raw data chunk cache, in bytes 
+!  rdcc_w0	- preemption policy (0 or 1)
+! OUTPUTS
+!  
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pset_cache_f(prp_id, mdc_nelmts,rdcc_nelmts, rdcc_nbytes, rdcc_w0, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(IN) :: mdc_nelmts    ! Number of elements (objects)
+                                         !  in the meta data cache
+    INTEGER(SIZE_T), INTENT(IN) :: rdcc_nelmts ! Number of elements (objects)
+                                               !  in the meta data cache
+    INTEGER(SIZE_T), INTENT(IN) :: rdcc_nbytes ! Total size of the raw data 
+                                               !  chunk cache, in bytes 
+    REAL, INTENT(IN) :: rdcc_w0                ! Preemption policy
+    INTEGER, INTENT(OUT) :: hdferr             ! Error code
+                                               !  0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_cache_c(prp_id,mdc_nelmts,rdcc_nelmts,rdcc_nbytes,rdcc_w0) &
+            BIND(C,NAME='h5pset_cache_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER, INTENT(IN) :: mdc_nelmts 
+         INTEGER(SIZE_T), INTENT(IN) :: rdcc_nelmts 
+         INTEGER(SIZE_T), INTENT(IN) :: rdcc_nbytes
+         REAL, INTENT(IN) :: rdcc_w0
+       END FUNCTION h5pset_cache_c
+    END INTERFACE
+
+    hdferr = h5pset_cache_c(prp_id, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0 )
+  END SUBROUTINE h5pset_cache_f
+
+!****s* H5P/h5pget_cache_f 
+! NAME
+!   h5pget_cache_f 
+!
+! PURPOSE
+!  Queries the meta data cache and raw data chunk cache 
+!  parameters.  
+!
+! INPUTS
+!  prp_id	- file access property list identifier
+!
+! OUTPUTS
+!  mdc_nelmts	- number of elements (objects) in the meta 
+!		  data cache 
+!  rdcc_nelmts	- number of elements (objects) in the raw 
+!		  data chunk cache 
+!  rdcc_nbytes	- total size of the raw data chunk cache, in bytes 
+!  rdcc_w0	- preemption policy (0 or 1)
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!
+!  Bug fix: type of the rdcc_nelmts parameter should be INTEGER
+!  instead of INTEGER(SIZE_T) October 10, 2003 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pget_cache_f(prp_id, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(OUT) :: mdc_nelmts   ! Number of elements (objects)
+                                         !  in the meta data cache
+    INTEGER(SIZE_T), INTENT(OUT) :: rdcc_nelmts  ! Number of elements (objects)
+                                                 !  in the meta data cache
+    INTEGER(SIZE_T), INTENT(OUT) :: rdcc_nbytes  ! Total size of the raw data 
+                                                 !  chunk cache, in bytes 
+    REAL, INTENT(OUT) :: rdcc_w0                 ! Preemption policy
+    INTEGER, INTENT(OUT) :: hdferr               ! Error code
+                                                 ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_cache_c(prp_id,mdc_nelmts,rdcc_nelmts,rdcc_nbytes,rdcc_w0) &
+            BIND(C,NAME='h5pget_cache_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER, INTENT(OUT) :: mdc_nelmts 
+         INTEGER(SIZE_T), INTENT(OUT) :: rdcc_nelmts 
+         INTEGER(SIZE_T), INTENT(OUT) :: rdcc_nbytes
+         REAL, INTENT(OUT) :: rdcc_w0
+       END FUNCTION h5pget_cache_c
+    END INTERFACE
+    
+    hdferr = h5pget_cache_c(prp_id, mdc_nelmts,rdcc_nelmts, rdcc_nbytes, rdcc_w0 )
+  END SUBROUTINE h5pget_cache_f
+
+!****s* H5P/h5pset_fapl_split_f 
+! NAME
+!   h5pset_fapl_split_f 
+!
+! PURPOSE
+!  Emulates the old split file driver. 
+!
+! INPUTS
+!  
+!  prp_id	- file access property list identifier
+!  meta_ext	- name of the extension for the metafile 
+!		  filename
+!  meta_plist	- identifier of the meta file access property 
+!		  list
+!  raw_ext 	- name extension for the raw file filename
+!  raw_plist	- identifier of the raw file access property list
+!
+! OUTPUTS
+!  
+!  hdferr       - error code		
+!	            Success:  0
+!	            Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pset_fapl_split_f(prp_id, meta_ext, meta_plist, raw_ext, raw_plist, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id     ! Property list identifier 
+    CHARACTER(LEN=*), INTENT(IN) :: meta_ext ! Name of the extension for
+                                             !  the metafile filename
+    INTEGER(HID_T), INTENT(IN) :: meta_plist ! Identifier of the meta file
+                                             !  access property list
+    CHARACTER(LEN=*), INTENT(IN) :: raw_ext  ! Name extension for the raw file filename
+    INTEGER(HID_T), INTENT(IN) :: raw_plist  ! Identifier of the raw file 
+                                             !  access property list
+    INTEGER, INTENT(OUT) :: hdferr           ! Error code
+                                             ! 0 on success and -1 on failure
+!*****
+    INTEGER :: meta_len, raw_len
+    INTERFACE
+       INTEGER FUNCTION h5pset_fapl_split_c(prp_id,meta_len,meta_ext,meta_plist,raw_len,raw_ext,raw_plist) &
+            BIND(C,NAME='h5pset_fapl_split_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: meta_ext 
+         INTEGER(HID_T), INTENT(IN) :: meta_plist
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: raw_ext
+         INTEGER(HID_T), INTENT(IN) :: raw_plist 
+         INTEGER :: meta_len, raw_len
+       END FUNCTION h5pset_fapl_split_c
+    END INTERFACE
+
+    meta_len = LEN(meta_ext)
+    raw_len = LEN(raw_ext)
+    hdferr = h5pset_fapl_split_c(prp_id,meta_len,meta_ext,meta_plist,raw_len,raw_ext,raw_plist)
+  END SUBROUTINE h5pset_fapl_split_f
+
+!****s* H5P/h5pget_split_f 
+! NAME
+!   h5pget_split_f 
+!
+! PURPOSE
+!  NOT AVAILABLE
+!
+! INPUTS
+!  
+! OUTPUTS
+!  
+!  hdferr  - error code		
+!	      Success:  0
+!	      Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! SOURCE
+!          SUBROUTINE h5pget_split_f(prp_id, meta_ext_size, meta_ext, meta_plist,raw_ext_size,&
+!                                     raw_ext, raw_plist, hdferr)
+!            IMPLICIT NONE
+!            INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
+!            INTEGER(SIZE_T), INTENT(IN) :: meta_ext_size ! Number of characters of the meta
+                                                         ! file extension to be copied to the
+                                                         ! meta_ext buffer
+
+!            CHARACTER(LEN=*), INTENT(OUT) :: meta_ext  !Name of the extension for
+                                                      !the metafile filename
+!            INTEGER(HID_T), INTENT(OUT) :: meta_plist  ! Identifier of the meta file
+                                                      ! access property list
+!            INTEGER(SIZE_T), INTENT(IN) :: raw_ext_size ! Number of characters of the raw
+                                                         ! file extension to be copied to the
+                                                         ! raw_ext buffer
+!            CHARACTER(LEN=*), INTENT(OUT) :: raw_ext  !Name extension for the raw file filename
+!            INTEGER(HID_T), INTENT(OUT) :: raw_plist  !Identifier of the raw file
+                                                     !access property list
+!            INTEGER, INTENT(OUT) :: hdferr  ! Error code
+                                     ! 0 on success and -1 on failure
+!*****
+
+!            INTEGER, EXTERNAL :: h5pget_split_c
+!            hdferr = h5pget_split_c(prp_id, meta_ext_size, meta_ext, meta_plist, &
+!                                    raw_ext_size, raw_ext, raw_plist )
+!          END SUBROUTINE h5pget_split_f
+
+!****s* H5P/h5pset_gc_references_f 
+! NAME
+!   h5pset_gc_references_f 
+!
+! PURPOSE
+!  Sets garbage collecting references flag. 
+!
+! INPUTS
+!  
+!  prp_id	- file access property list identifier
+!  gc_reference	- flag for stting garbage collection on 
+!		  and off (1 or 0)
+! OUTPUTS
+!  
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface: 
+  SUBROUTINE h5pset_gc_references_f (prp_id, gc_reference, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(IN) :: gc_reference  ! The flag for garbage collecting
+                                         !  references for the file
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_gc_references_c(prp_id, gc_reference) &
+            BIND(C,NAME='h5pset_gc_references_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER, INTENT(IN) :: gc_reference
+       END FUNCTION h5pset_gc_references_c
+    END INTERFACE
+
+    hdferr = h5pset_gc_references_c(prp_id, gc_reference)
+  END SUBROUTINE h5pset_gc_references_f
+
+!****s* H5P/h5pget_gc_references_f 
+! NAME
+!   h5pget_gc_references_f 
+!
+! PURPOSE
+!  Returns garbage collecting references setting. 	
+!
+! INPUTS
+!  
+!  prp_id	- file access property list identifier
+! OUTPUTS
+!  
+!  gc_reference	- flag for stting garbage collection on 
+!		  and off (1 or 0)
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!		
+! Fortran90 Interface:
+  SUBROUTINE h5pget_gc_references_f(prp_id, gc_reference, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(OUT) :: gc_reference ! The flag for garbage collecting
+                                         !  references for the file
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_gc_references_c(prp_id, gc_reference) &
+            BIND(C,NAME='h5pget_gc_references_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER, INTENT(OUT) :: gc_reference
+       END FUNCTION h5pget_gc_references_c
+    END INTERFACE
+    
+    hdferr = h5pget_gc_references_c(prp_id, gc_reference)
+  END SUBROUTINE h5pget_gc_references_f
+
+!****s* H5P/h5pset_layout_f 
+! NAME
+!   h5pset_layout_f 
+!
+! PURPOSE
+!  Sets the type of storage used store the raw data 
+!  for a dataset. 
+!
+! INPUTS
+!  
+!  prp_id	- data creation property list identifier
+!  layout	- type of storage layout for raw data
+!  		  possible values are:
+!  		    H5D_COMPACT_F
+!  		    H5D_CONTIGUOUS_F
+!  		    H5D_CHUNKED_F
+! OUTPUTS
+!  
+!  hdferr      - error code		
+!	          Success:  0
+!	          Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!  
+! Fortran90 Interface:
+  SUBROUTINE h5pset_layout_f (prp_id, layout, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(IN) :: layout        ! Type of storage layout for raw data
+                                         ! possible values are:
+                                         !   H5D_COMPACT_F
+                                         !   H5D_CONTIGUOUS_F
+                                         !   H5D_CHUNKED_F
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_layout_c(prp_id, layout) &
+            BIND(C,NAME='h5pset_layout_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER, INTENT(IN) :: layout
+       END FUNCTION h5pset_layout_c
+    END INTERFACE
+    
+    hdferr = h5pset_layout_c(prp_id, layout)
+  END SUBROUTINE h5pset_layout_f
+
+!****s* H5P/h5pget_layout_f 
+! NAME
+!   h5pget_layout_f 
+!
+! PURPOSE
+!  Returns the layout of the raw data for a dataset. 
+!
+! INPUTS
+!  
+!  prp_id	- data creation property list identifier
+! OUTPUTS
+!  
+!  layout	- type of storage layout for raw data
+!  		  possible values are:
+!  		   H5D_COMPACT_F
+!  		   H5D_CONTIGUOUS_F
+!  		   H5D_CHUNKED_F
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!  
+! Fortran90 Interface:
+  SUBROUTINE h5pget_layout_f (prp_id, layout, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(OUT) :: layout       ! Type of storage layout for raw data
+                                         ! possible values are:
+                                         !  H5D_COMPACT_F(0)
+                                         !  H5D_CONTIGUOUS_F(1)
+                                         !  H5D_CHUNKED_F(2)
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_layout_c(prp_id, layout) &
+            BIND(C,NAME='h5pget_layout_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER, INTENT(OUT) :: layout
+       END FUNCTION h5pget_layout_c
+    END INTERFACE
+    
+    hdferr = h5pget_layout_c(prp_id, layout)
+  END SUBROUTINE h5pget_layout_f
+
+!****s* H5P/h5pset_filter_f 
+! NAME
+!  h5pset_filter_f 
+!
+! PURPOSE
+!  Adds a filter to the filter pipeline. 
+!
+! INPUTS
+!  
+!  prp_id	- data creation or transfer property list 
+!  		  identifier
+!  filter	- filter to be added to the pipeline 
+!  flags	- bit vector specifying certain general
+!  		  properties of the filter
+!  cd_nelmts	- number of elements in cd_values
+!  cd_values	- auxiliary data for the filter
+! OUTPUTS
+!  
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  February, 2003
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_filter_f(prp_id, filter, flags, cd_nelmts, cd_values,  hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(IN) :: filter        ! Filter to be added to the pipeline.
+    INTEGER, INTENT(IN) :: flags         ! Bit vector specifying certain general
+                                       !  properties of the filter.
+    INTEGER(SIZE_T), INTENT(IN) :: cd_nelmts       ! Number of elements in cd_values.
+    INTEGER, DIMENSION(*), INTENT(IN) :: cd_values ! Auxiliary data for the filter.
+    INTEGER, INTENT(OUT) :: hdferr                 ! Error code
+                                                 ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_filter_c(prp_id, filter, flags, cd_nelmts, cd_values) &
+            BIND(C,NAME='h5pset_filter_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id 
+         INTEGER, INTENT(IN) :: filter 
+         INTEGER, INTENT(IN) :: flags 
+         INTEGER(SIZE_T), INTENT(IN) :: cd_nelmts 
+         INTEGER, DIMENSION(*), INTENT(IN) :: cd_values 
+       END FUNCTION h5pset_filter_c
+    END INTERFACE
+  
+    hdferr = h5pset_filter_c(prp_id, filter, flags, cd_nelmts, cd_values )
+  END SUBROUTINE h5pset_filter_f
+
+!****s* H5P/h5pget_nfilters_f 
+! NAME
+!   h5pget_nfilters_f 
+!
+! PURPOSE
+!  Returns the number of filters in the pipeline. 
+!
+! INPUTS
+!  
+!  prp_id	- data creation or transfer property list 
+!  		  identifier
+! OUTPUTS
+!  
+!  nfilters	- number of filters in the pipeline
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!  
+! Fortran90 Interface:
+  SUBROUTINE h5pget_nfilters_f (prp_id, nfilters, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(OUT) :: nfilters     ! The number of filters in the pipeline
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_nfilters_c(prp_id, nfilters) &
+            BIND(C,NAME='h5pget_nfilters_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER, INTENT(OUT) :: nfilters
+       END FUNCTION h5pget_nfilters_c
+    END INTERFACE
+    
+    hdferr = h5pget_nfilters_c(prp_id, nfilters)
+  END SUBROUTINE h5pget_nfilters_f
+
+!****s* H5P/h5pget_filter_f 
+! NAME
+!   h5pget_filter_f 
+!
+! PURPOSE
+!  Returns information about a filter in a pipeline
+!
+! INPUTS
+!  
+!  prp_id	 - data creation or transfer property list 
+!  		   identifier
+!  filter_number - sequence number within the filter
+!                  pipeline of the filter for which 
+!                  information is sought
+! OUTPUTS
+!  
+!  filter_id	- filter identification number
+!  flags	- bit vector specifying certain general
+!  		  properties of the filter
+!  cd_nelmts	- number of elements in cd_values
+!  cd_values	- auxiliary data for the filter
+!  namelen	- number of characters in the name buffer
+!  name		- buffer to retrieve filter name
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!  
+! Fortran90 Interface:
+  SUBROUTINE h5pget_filter_f(prp_id, filter_number, flags, cd_nelmts, cd_values, namelen, name, filter_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(IN) :: filter_number ! Sequence number within the filter
+                                         !  pipeline of the filter for which 
+                                         !  information is sought
+    INTEGER, DIMENSION(*), INTENT(OUT) :: cd_values  ! Auxiliary data for the filter.
+    INTEGER, INTENT(OUT) :: flags        ! Bit vector specifying certain general
+                                         !  properties of the filter.
+    INTEGER(SIZE_T), INTENT(INOUT) :: cd_nelmts  ! Number of elements in cd_values.
+    INTEGER(SIZE_T), INTENT(IN) :: namelen       ! Anticipated number of characters in name.
+    CHARACTER(LEN=*), INTENT(OUT) :: name        ! Name of the filter
+    INTEGER, INTENT(OUT) :: filter_id            ! Filter identification number  
+    INTEGER, INTENT(OUT) :: hdferr               ! Error code
+                                                 ! 0 on success and -1 on failure
+!*****
+
+
+!            INTEGER, EXTERNAL :: h5pget_filter_c
+!  MS FORTRAN needs explicit interface for C functions called here.
+!
+    INTERFACE
+       INTEGER FUNCTION h5pget_filter_c(prp_id, filter_number, flags, cd_nelmts,  &
+            cd_values, namelen, name, filter_id ) &
+            BIND(C,NAME='h5pget_filter_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER, INTENT(IN) :: filter_number 
+         INTEGER, DIMENSION(*), INTENT(OUT) :: cd_values
+         INTEGER, INTENT(OUT) :: flags 
+         INTEGER(SIZE_T), INTENT(INOUT) :: cd_nelmts
+         INTEGER(SIZE_T), INTENT(IN) :: namelen
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: name
+         INTEGER, INTENT(OUT) :: filter_id
+       END FUNCTION h5pget_filter_c
+    END INTERFACE
+    
+    hdferr = h5pget_filter_c(prp_id, filter_number, flags, cd_nelmts,  & 
+         cd_values, namelen, name, filter_id )
+  END SUBROUTINE h5pget_filter_f
+
+!****s* H5P/h5pset_external_f 
+! NAME
+!   h5pset_external_f 
+!
+! PURPOSE
+!  Adds an external file to the list of external files. 
+!
+! INPUTS
+!   
+!  prp_id	- dataset creation property list identifier
+!  name		- name of external file
+!  offset	- offset in bytes from the beginning of the 
+!  		  file to the location in the file
+!  		  where the data starts
+!  bytes	- size of the external file data. 
+! OUTPUTS
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001
+!
+!  Changed type of 'offset' from integer to off_t -- MSB January 9, 2012
+!  
+! Fortran90 Interface:
+  SUBROUTINE h5pset_external_f(prp_id, name, offset, bytes, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of an external file
+    INTEGER(OFF_T), INTENT(IN) :: offset  ! Offset, in bytes, from the beginning 
+                                          !  of the file to the location in the file 
+                                          !  where the data starts.
+    INTEGER(HSIZE_T), INTENT(IN) :: bytes ! Number of bytes reserved in the 
+                                          !  file for the data
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+                                          ! 0 on success and -1 on failure
+!*****
+    INTEGER :: namelen
+
+    INTERFACE
+       INTEGER FUNCTION h5pset_external_c(prp_id, name,namelen, offset, bytes) &
+            BIND(C,NAME='h5pset_external_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, OFF_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER :: namelen
+         INTEGER(OFF_T), INTENT(IN) :: offset
+         INTEGER(HSIZE_T), INTENT(IN) :: bytes
+       END FUNCTION h5pset_external_c
+    END INTERFACE
+  
+    namelen = LEN(name)
+    hdferr = h5pset_external_c(prp_id, name, namelen, offset, bytes)
+  END SUBROUTINE h5pset_external_f
+
+!****s* H5P/h5pget_external_count_f 
+! NAME
+!   h5pget_external_count_f 
+!
+! PURPOSE
+!  Returns the number of external files for a dataset. 
+!
+! INPUTS
+!  
+!  prp_id	- dataset creation property list identifier
+! OUTPUTS
+!  
+!  count	- number of external files for the 
+!  		  specified dataset
+!  hdferr       - error code		
+!	            Success:  0
+!	            Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!  
+! Fortran90 Interface:
+  SUBROUTINE h5pget_external_count_f (prp_id, count, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(OUT) :: count        ! Number of external files for the 
+                                         ! Specified dataset
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_external_count_c(prp_id, count) &
+            BIND(C,NAME='h5pget_external_count_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id 
+         INTEGER, INTENT(OUT) :: count
+       END FUNCTION h5pget_external_count_c
+    END INTERFACE
+    
+    hdferr = h5pget_external_count_c(prp_id, count)
+  END SUBROUTINE h5pget_external_count_f
+
+!****s* H5P/h5pget_external_f 
+! NAME
+!  h5pget_external_f 
+!
+! PURPOSE
+!  Returns information about an external file. 
+!
+! INPUTS
+!  
+!  prp_id	- dataset creation property list identifier
+! OUTPUTS
+!  
+!  idx		- external file index 
+!  name_size	- maximum size of name array
+!  name		- name of the external file	
+!  name		- name of external file
+!  offset	- offset in bytes from the beginning of the 
+!  		  file to the location in the file
+!  		  where the data starts
+!  bytes	- size of the external file data
+!  hdferr       - error code		
+!	           Success:  0
+!	            Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001
+!
+! Changed type of 'offset' from integer to off_t -- MSB January 9, 2012
+!  
+! Fortran90 Interface:
+  SUBROUTINE h5pget_external_f(prp_id, idx, name_size, name, offset,bytes, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
+    INTEGER, INTENT(IN) :: idx           ! External file index.
+    INTEGER(SIZE_T), INTENT(IN) :: name_size ! Maximum length of name array 
+    CHARACTER(LEN=*), INTENT(OUT) :: name    ! Name of an external file
+    INTEGER(OFF_T), INTENT(OUT) :: offset    ! Offset, in bytes, from the beginning 
+                                             !  of the file to the location in the file 
+                                             !  where the data starts.
+    INTEGER(HSIZE_T), INTENT(OUT) :: bytes   ! Number of bytes reserved in the 
+                                             !  file for the data
+    INTEGER, INTENT(OUT) :: hdferr           ! Error code
+                                             ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_external_c(prp_id, idx, name_size, name, offset, bytes) &
+            BIND(C,NAME='h5pget_external_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T, OFF_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER, INTENT(IN) :: idx 
+         INTEGER(SIZE_T), INTENT(IN) :: name_size
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: name
+         INTEGER(OFF_T), INTENT(OUT) :: offset
+         INTEGER(HSIZE_T), INTENT(OUT) :: bytes
+       END FUNCTION h5pget_external_c
+    END INTERFACE
+    
+    hdferr = h5pget_external_c(prp_id, idx, name_size, name, offset, bytes)
+  END SUBROUTINE h5pget_external_f
+
+!****s* H5P/h5pset_btree_ratios_f 
+! NAME
+!   h5pset_btree_ratios_f 
+!
+! PURPOSE
+!  Sets B-tree split ratios for a dataset transfer 
+!  property list. 
+!
+! INPUTS
+!  	
+!  prp_id	- the dataset transfer property list 
+!  		  identifier 
+!  left		- the B-tree split ratio for left-most nodes 
+!  middle	- the B-tree split ratio for all other nodes
+!  right	- the B-tree split ratio for right-most nodes
+! OUTPUTS
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!  
+! Fortran90 Interface:
+  SUBROUTINE h5pset_btree_ratios_f(prp_id, left, middle, right, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
+    REAL, INTENT(IN) :: left   ! The B-tree split ratio for left-most nodes.
+    REAL, INTENT(IN) :: middle ! The B-tree split ratio for all other nodes 
+    REAL, INTENT(IN) :: right  ! The B-tree split ratio for right-most 
+                               !  nodes and lone nodes. 
+    INTEGER, INTENT(OUT) :: hdferr  ! Error code
+                                    ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION  h5pset_btree_ratios_c(prp_id, left, middle, right) &
+            BIND(C,NAME='h5pset_btree_ratios_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         REAL, INTENT(IN) :: left
+         REAL, INTENT(IN) :: middle
+         REAL, INTENT(IN) :: right
+       END FUNCTION h5pset_btree_ratios_c
+    END INTERFACE
+    
+    hdferr = h5pset_btree_ratios_c(prp_id, left, middle, right)
+  END SUBROUTINE h5pset_btree_ratios_f
+
+!****s* H5P/h5pget_btree_ratios_f
+! NAME
+!  h5pget_btree_ratios_f
+!
+! PURPOSE
+!  Gets B-tree split ratios for a dataset transfer property list
+!
+! INPUTS
+!  
+!  prp_id	- the dataset transfer property list 
+!  		  identifier 
+! OUTPUTS
+!  
+!  left		- the B-tree split ratio for left-most nodes 
+!  middle	- the B-tree split ratio for all other nodes
+!  right	- the B-tree split ratio for right-most nodes
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999	
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for 
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001 
+!  
+! Fortran90 Interface:
+  SUBROUTINE h5pget_btree_ratios_f(prp_id, left, middle, right, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
+    REAL, INTENT(OUT) :: left   ! The B-tree split ratio for left-most nodes.
+    REAL, INTENT(OUT) :: middle ! The B-tree split ratio for all other nodes 
+    REAL, INTENT(OUT) :: right  ! The B-tree split ratio for right-most 
+                                !  nodes and lone nodes.
+    INTEGER, INTENT(OUT) :: hdferr  ! Error code
+                                    ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION  h5pget_btree_ratios_c(prp_id, left, middle, right) &
+            BIND(C,NAME='h5pget_btree_ratios_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         REAL, INTENT(OUT) :: left
+         REAL, INTENT(OUT) :: middle
+         REAL, INTENT(OUT) :: right
+       END FUNCTION h5pget_btree_ratios_c
+    END INTERFACE
+  
+    hdferr = h5pget_btree_ratios_c(prp_id, left, middle, right)
+  END SUBROUTINE h5pget_btree_ratios_f
+
+!****s* H5P/h5pget_fclose_degree_f 
+! NAME
+!  h5pget_fclose_degree_f 
+!
+! PURPOSE
+!  Returns the degree for the file close behavior.
+!
+! INPUTS
+!  
+!  fapl_id	- File access property list identifier
+! OUTPUTS
+!  
+!  degree  	- Possible values are:
+!  		   H5F_CLOSE_DEFAULT_F
+!  		   H5F_CLOSE_WEAK_F
+!  		   H5F_CLOSE_SEMI_F
+!  		   H5F_CLOSE_STRONG_F
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  September 26, 2002	
+!
+! HISTORY
+! 
+!  
+! Fortran90 Interface:
+  SUBROUTINE h5pget_fclose_degree_f(fapl_id, degree, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: fapl_id ! File Access Property list identifier 
+    INTEGER, INTENT(OUT) :: degree        ! Possible values are: 
+                                          !  H5F_CLOSE_DEFAULT_F
+					  !  H5F_CLOSE_WEAK_F
+					  !  H5F_CLOSE_SEMI_F
+					  !  H5F_CLOSE_STRONG_F
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+                                          ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_fclose_degree_c(fapl_id, degree) &
+            BIND(C,NAME='h5pget_fclose_degree_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: fapl_id
+         INTEGER, INTENT(OUT) :: degree
+       END FUNCTION h5pget_fclose_degree_c
+    END INTERFACE
+    
+    hdferr = h5pget_fclose_degree_c(fapl_id, degree) 
+  END SUBROUTINE h5pget_fclose_degree_f
+
+!****s* H5P/h5pset_fclose_degree_f 
+! NAME
+!  h5pset_fclose_degree_f 
+!
+! PURPOSE
+!  Sets the degree for the file close behavior.
+!
+! INPUTS
+!  
+!  fapl_id	- file access property list identifier
+!  degree  	- Possible values are:
+!  		    H5F_CLOSE_DEFAULT_F
+!  		    H5F_CLOSE_WEAK_F
+!  		    H5F_CLOSE_SEMI_F
+!  		    H5F_CLOSE_STRONG_F
+! OUTPUTS
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  September 26, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_fclose_degree_f(fapl_id, degree, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: fapl_id ! File Access Property list identifier 
+    INTEGER, INTENT(IN) :: degree         ! Possible values are: 
+                                          !  H5F_CLOSE_DEFAULT_F
+					  !  H5F_CLOSE_WEAK_F
+					  !  H5F_CLOSE_SEMI_F
+					  !  H5F_CLOSE_STRONG_F
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+                                          ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_fclose_degree_c(fapl_id, degree) &
+            BIND(C,NAME='h5pset_fclose_degree_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: fapl_id
+         INTEGER, INTENT(IN) :: degree
+       END FUNCTION h5pset_fclose_degree_c
+    END INTERFACE
+
+    hdferr = h5pset_fclose_degree_c(fapl_id, degree) 
+  END SUBROUTINE h5pset_fclose_degree_f
+
+!****s* H5P/h5pequal_f 
+! NAME
+!  h5pequal_f 
+!
+! PURPOSE
+!  Checks if two property lists are eqaul
+!
+! INPUTS
+!  
+!  plist1_id	- property list identifier
+!  plist2_id	- property list identifier
+! OUTPUTS
+!  
+!  flag		- flag, possible values
+!  		    .TRUE. or .FALSE.
+!  hdferr:	- error code		
+!  		   Success:  0
+!  		   Failure: -1, flag is set to .FALSE.   
+!
+! AUTHOR
+!  Elena Pourmal
+!  September 30, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pequal_f(plist1_id, plist2_id, flag, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist1_id ! Property list identifier 
+    INTEGER(HID_T), INTENT(IN) :: plist2_id ! Property list identifier 
+    LOGICAL, INTENT(OUT)       :: flag      ! Flag
+    INTEGER, INTENT(OUT)       :: hdferr    ! Error code
+                                            !  0 on success and -1 on failure
+!*****
+    INTEGER                    :: c_flag
+    
+    INTERFACE
+       INTEGER FUNCTION h5pequal_c(plist1_id, plist2_id, c_flag) &
+            BIND(C,NAME='h5pequal_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist1_id
+         INTEGER(HID_T), INTENT(IN) :: plist2_id
+         INTEGER, INTENT(OUT) :: c_flag
+       END FUNCTION h5pequal_c
+    END INTERFACE
+
+    flag = .FALSE.
+    hdferr = h5pequal_c(plist1_id, plist2_id, c_flag) 
+    IF (c_flag .GT. 0) flag = .TRUE.
+  END SUBROUTINE h5pequal_f
+
+!****s* H5P/h5pset_buffer_f
+! NAME
+!  h5pset_buffer_f 
+!
+! PURPOSE
+!  Sets sixe for conversion buffer
+!
+! INPUTS
+!  plist_id	- data transfer property list identifier
+!  size		- buffer size 
+! OUTPUTS
+!  
+!  hdferr:	- error code		
+!  		   Success:  0
+!  		   Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 2, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_buffer_f(plist_id, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id ! Data transfer property list identifier 
+    INTEGER(HSIZE_T), INTENT(IN) :: size   ! Buffer size in bytes; 
+                                           ! buffer is allocated and freed by 
+                                           ! the library.
+    INTEGER, INTENT(OUT)       :: hdferr   ! Error code
+                                           ! 0 on success and -1 on failure
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5pset_buffer_c(plist_id, size) &
+            BIND(C,NAME='h5pset_buffer_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+         INTEGER(HSIZE_T), INTENT(IN) :: size
+       END FUNCTION h5pset_buffer_c
+    END INTERFACE
+
+    hdferr = h5pset_buffer_c(plist_id, size) 
+  END SUBROUTINE h5pset_buffer_f
+
+!****s* H5P/h5pget_buffer_f
+! NAME
+!  h5pget_buffer_f 
+!
+! PURPOSE
+!  Gets size for conversion buffer
+!
+! INPUTS
+!  
+!  plist_id	- data transfer property list identifier
+! OUTPUTS
+!  
+!  size		- buffer size 
+!  hdferr	- error code		
+!  		   Success:  0
+!  		   Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 2, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pget_buffer_f(plist_id, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id ! Data transfer property list identifier 
+    INTEGER(HSIZE_T), INTENT(OUT) :: size  ! Buffer size in bytes; 
+                                           !  buffer is allocated and freed by 
+                                           !  the library.
+    INTEGER, INTENT(OUT)       :: hdferr   ! Error code
+                                           ! 0 on success and -1 on failure
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5pget_buffer_c(plist_id, size) &
+            BIND(C,NAME='h5pget_buffer_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+         INTEGER(HSIZE_T), INTENT(OUT) :: size
+       END FUNCTION h5pget_buffer_c
+    END INTERFACE
+
+    hdferr = h5pget_buffer_c(plist_id, size) 
+  END SUBROUTINE h5pget_buffer_f
+
+!****s* H5P/h5pfill_value_defined_f
+! NAME
+!  h5pfill_value_defined_f
+!
+! PURPOSE
+!  Check if fill value is defined.
+!
+! INPUTS
+!  
+!  plist_id	- dataset creation property list identifier
+! OUTPUTS
+!  
+!  flag         - fill value status flag
+!                 Possible values are:
+!  		    H5D_FILL_VALUE_ERROR_F
+!  		    H5D_FILL_VALUE_UNDEFINED_F
+!  		    H5D_FILL_VALUE_DEFAULT_F
+!  		    H5D_FILL_VALUE_USER_DEFINED_F
+!  hdferr	- error code		
+!  		    Success:  0
+!  		    Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 4, 2002
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pfill_value_defined_f(plist_id, flag, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id  ! Dataset creation property list identifier
+    INTEGER, INTENT(OUT) :: flag            ! Fill value status flag
+                                            !  H5D_FILL_VALUE_ERROR_F
+                                            !  H5D_FILL_VALUE_UNDEFINED_F
+                                            !  H5D_FILL_VALUE_DEFAULT_F
+                                            !  H5D_FILL_VALUE_USER_DEFINED_F
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+                                            ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pfill_value_defined_c(plist_id, flag) &
+            BIND(C,NAME='h5pfill_value_defined_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+         INTEGER, INTENT(OUT) :: flag
+       END FUNCTION h5pfill_value_defined_c
+    END INTERFACE
+
+    hdferr = h5pfill_value_defined_c(plist_id, flag) 
+  END SUBROUTINE h5pfill_value_defined_f
+
+!****s* H5P/h5pset_alloc_time_f
+! NAME
+!  h5pset_alloc_time_f
+!
+! PURPOSE
+!  Set space allocation time for dataset during creation.
+!
+! INPUTS
+!  
+!  plist_id	- dataset creation property list identifier
+!  flag         - allocation time flag:
+!  		    H5D_ALLOC_TIME_ERROR_F
+!  		    H5D_ALLOC_TIME_DEFAULT_F
+!  		    H5D_ALLOC_TIME_EARLY_F
+!  		    H5D_ALLOC_TIME_LATE_F
+!  		    H5D_ALLOC_TIME_INCR_F
+! OUTPUTS
+!  
+!  hdferr	- error code		
+!  		   Success:  0
+!  		   Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 4, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_alloc_time_f(plist_id, flag, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id  ! Dataset creation property list identifier
+    INTEGER, INTENT(IN) :: flag             ! Allocation time flag:
+                                            !  H5D_ALLOC_TIME_ERROR_F
+                                            !  H5D_ALLOC_TIME_DEFAULT_F
+                                            !  H5D_ALLOC_TIME_EARLY_F
+                                            !  H5D_ALLOC_TIME_LATE_F
+                                            !  H5D_ALLOC_TIME_INCR_F
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+                                            ! 0 on success and -1 on failure
+!*****  
+    
+    INTERFACE
+       INTEGER FUNCTION h5pset_alloc_time_c(plist_id, flag) &
+            BIND(C,NAME='h5pset_alloc_time_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+         INTEGER, INTENT(IN) :: flag
+       END FUNCTION h5pset_alloc_time_c
+    END INTERFACE
+    
+    hdferr = h5pset_alloc_time_c(plist_id, flag) 
+  END SUBROUTINE h5pset_alloc_time_f
+
+!****s* H5P/h5pget_alloc_time_f
+! NAME
+!  h5pget_alloc_time_f
+!
+! PURPOSE
+!  Get space allocation time for dataset during creation.
+!
+! INPUTS
+!  
+!  plist_id	- dataset creation property list identifier
+! OUTPUTS
+!  
+!  flag         - allocation time flag:
+!  		    H5D_ALLOC_TIME_ERROR_F
+!  		    H5D_ALLOC_TIME_DEFAULT_F
+!  		    H5D_ALLOC_TIME_EARLY_F
+!  		    H5D_ALLOC_TIME_LATE_F
+!  		    H5D_ALLOC_TIME_INCR_F
+!  hdferr:	- error code		
+!  		    Success:  0
+!  		    Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 4, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pget_alloc_time_f(plist_id, flag, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id  ! Dataset creation property list identifier
+    INTEGER, INTENT(OUT) :: flag   ! Allocation time flag:
+                                   !  H5D_ALLOC_TIME_ERROR_F
+                                   !  H5D_ALLOC_TIME_DEFAULT_F
+                                   !  H5D_ALLOC_TIME_EARLY_F
+                                   !  H5D_ALLOC_TIME_LATE_F
+                                   !  H5D_ALLOC_TIME_INCR_F
+    INTEGER, INTENT(OUT) :: hdferr ! Error code
+                                   ! 0 on success and -1 on failure
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5pget_alloc_time_c(plist_id, flag) &
+            BIND(C,NAME='h5pget_alloc_time_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+         INTEGER, INTENT(OUT) :: flag
+       END FUNCTION h5pget_alloc_time_c
+    END INTERFACE
+    
+    hdferr = h5pget_alloc_time_c(plist_id, flag) 
+  END SUBROUTINE h5pget_alloc_time_f
+
+!****s* H5P/h5pset_fill_time_f
+! NAME
+!  h5pset_fill_time_f
+!
+! PURPOSE
+!  Set fill value writing time for dataset
+!
+! INPUTS
+!  
+!  plist_id	- dataset creation property list identifier
+!  flag         - fill time flag:
+!  		    H5D_FILL_TIME_ERROR_F
+!  		    H5D_FILL_TIME_ALLOC_F
+!  		    H5D_FILL_TIME_NEVER_F
+! OUTPUTS
+!  
+!  hdferr	- error code		
+!  		   Success:  0
+!  		   Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 4, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_fill_time_f(plist_id, flag, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id  ! Dataset creation property list identifier
+    INTEGER, INTENT(IN) :: flag             ! Fill time flag:
+                                            !  H5D_FILL_TIME_ERROR_F
+                                            !  H5D_FILL_TIME_ALLOC_F
+                                            !  H5D_FILL_TIME_NEVER_F
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+                                            ! 0 on success and -1 on failure
+!*****  
+
+    INTERFACE
+       INTEGER FUNCTION h5pset_fill_time_c(plist_id, flag) &
+            BIND(C,NAME='h5pset_fill_time_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+         INTEGER, INTENT(IN) :: flag
+       END FUNCTION h5pset_fill_time_c
+    END INTERFACE
+    
+    hdferr = h5pset_fill_time_c(plist_id, flag) 
+  END SUBROUTINE h5pset_fill_time_f
+
+!****s* H5P/h5pget_fill_time_f
+! NAME
+!   h5pget_fill_time_f
+!
+! PURPOSE
+!  Get fill value writing time for dataset
+!
+! INPUTS
+!  
+!  plist_id	- dataset creation property list identifier
+! OUTPUTS
+!  
+!  hdferr:	- error code		
+!  		   Success:  0
+!  		   Failure: -1
+! OPTIONAL PARAMETERS
+!
+!  flag         - fill time flag:
+!  		   H5D_FILL_TIME_ERROR_F
+!  		   H5D_FILL_TIME_ALLOC_F
+!  		   H5D_FILL_TIME_NEVER_F
+! AUTHOR
+!  Elena Pourmal
+!  October 4, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pget_fill_time_f(plist_id, flag, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id  ! Dataset creation property list identifier
+    INTEGER, INTENT(OUT) :: flag   ! Fill time flag:
+                                   !  H5D_FILL_TIME_ERROR_F
+                                   !  H5D_FILL_TIME_ALLOC_F
+                                   !  H5D_FILL_TIME_NEVER_F
+    INTEGER, INTENT(OUT) :: hdferr ! Error code
+                                   ! 0 on success and -1 on failure
+!*****   
+  
+    INTERFACE
+       INTEGER FUNCTION h5pget_fill_time_c(plist_id, flag) &
+            BIND(C,NAME='h5pget_fill_time_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+         INTEGER, INTENT(OUT) :: flag
+       END FUNCTION h5pget_fill_time_c
+    END INTERFACE
+    
+    hdferr = h5pget_fill_time_c(plist_id, flag) 
+  END SUBROUTINE h5pget_fill_time_f
+
+!****s* H5P/ h5pset_meta_block_size_f 
+! NAME
+!  h5pset_meta_block_size_f 
+!
+! PURPOSE
+!  Sets the minimum size of metadata block allocations 
+!
+! INPUTS
+!  
+!  plist_id	- file access property list identifier
+!  size		- metatdata block size
+! OUTPUTS
+!  
+!  hdferr	- error code		
+!  		   Success:  0
+!  		   Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 7, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_meta_block_size_f(plist_id, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id  ! File access property list identifier 
+    INTEGER(HSIZE_T), INTENT(IN) :: size    ! Block size in bytes; 
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+                                            ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_meta_block_size_c(plist_id, size) &
+            BIND(C,NAME='h5pset_meta_block_size_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+         INTEGER(HSIZE_T), INTENT(IN) :: size
+       END FUNCTION h5pset_meta_block_size_c
+    END INTERFACE
+    
+    hdferr = h5pset_meta_block_size_c(plist_id, size) 
+  END SUBROUTINE h5pset_meta_block_size_f
+
+!****s* H5P/h5pget_meta_block_size_f 
+! NAME
+!  h5pget_meta_block_size_f 
+!
+! PURPOSE
+!  Gets the minimum size of metadata block allocations 
+!
+! INPUTS
+!  
+!  plist_id	- file access property list identifier
+! OUTPUTS
+!  
+!  size		- metatdata block size
+!  hdferr	- error code		
+!  		   Success:  0
+!  		   Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 7, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pget_meta_block_size_f(plist_id, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id  ! File access property list identifier 
+    INTEGER(HSIZE_T), INTENT(OUT) :: size   ! Block size in bytes; 
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+                                            ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_meta_block_size_c(plist_id, size) &
+            BIND(C,NAME='h5pget_meta_block_size_c')
+         IMPORT :: HID_T, HSIZE_T 
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+         INTEGER(HSIZE_T), INTENT(OUT) :: size
+       END FUNCTION h5pget_meta_block_size_c
+    END INTERFACE
+    
+    hdferr = h5pget_meta_block_size_c(plist_id, size) 
+  END SUBROUTINE h5pget_meta_block_size_f
+
+!****s* H5P/h5pset_sieve_buf_size_f 
+! NAME
+!  h5pset_sieve_buf_size_f 
+!
+! PURPOSE
+!  Sets the maximum size of the data sieve buffer
+!
+! INPUTS
+!  
+!  plist_id	- file access property list identifier
+!  size		- sieve buffer size
+! OUTPUTS
+!  
+!  hdferr	- error code		
+!  		   Success:  0
+!  		   Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 7, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_sieve_buf_size_f(plist_id, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id ! File access property list identifier 
+    INTEGER(SIZE_T), INTENT(IN) :: size    ! Buffer size in bytes; 
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+                                           ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_sieve_buf_size_c(plist_id, size) &
+            BIND(C,NAME='h5pset_sieve_buf_size_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+         INTEGER(SIZE_T), INTENT(IN) :: size
+       END FUNCTION h5pset_sieve_buf_size_c
+    END INTERFACE
+    
+    hdferr = h5pset_sieve_buf_size_c(plist_id, size) 
+  END SUBROUTINE h5pset_sieve_buf_size_f
+
+!****s* H5P/h5pget_sieve_buf_size_f
+! NAME
+!  h5pget_sieve_buf_size_f 
+!
+! PURPOSE
+!  Gets the maximum size of the data sieve buffer
+!
+! INPUTS
+!  
+!  plist_id	- file access property list identifier
+! OUTPUTS
+!  
+!  size		- sieve buffer size
+!  hdferr	- error code		
+!  		   Success:  0
+!  		   Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 7, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pget_sieve_buf_size_f(plist_id, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id ! File access property list identifier 
+    INTEGER(SIZE_T), INTENT(OUT) :: size   ! Buffer size in bytes 
+    INTEGER, INTENT(OUT)       :: hdferr   ! Error code
+                                           ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_sieve_buf_size_c(plist_id, size) &
+            BIND(C,NAME='h5pget_sieve_buf_size_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+         INTEGER(SIZE_T), INTENT(OUT) :: size
+       END FUNCTION h5pget_sieve_buf_size_c
+    END INTERFACE
+    
+    hdferr = h5pget_sieve_buf_size_c(plist_id, size) 
+  END SUBROUTINE h5pget_sieve_buf_size_f
+
+!****s* H5P/h5pset_small_data_block_size_f 
+! NAME
+!  h5pset_small_data_block_size_f 
+!
+! PURPOSE
+!  Sets the minimum size of "small" raw data block
+!
+! INPUTS
+!  
+!  plist_id	- file access property list identifier
+!  size		- small raw data block size
+! OUTPUTS
+!  
+!  hdferr	- error code		
+!  		   Success:  0
+!  		   Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 7, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_small_data_block_size_f(plist_id, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id ! File access property list identifier 
+    INTEGER(HSIZE_T), INTENT(IN) :: size   ! Small raw data block size
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+                                           ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_small_data_block_size_c(plist_id, size) &
+            BIND(C,NAME='h5pset_small_data_block_size_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+         INTEGER(HSIZE_T), INTENT(IN) :: size
+       END FUNCTION h5pset_small_data_block_size_c
+    END INTERFACE
+
+    hdferr = h5pset_small_data_block_size_c(plist_id, size) 
+  END SUBROUTINE h5pset_small_data_block_size_f
+
+!****s* H5P/h5pget_small_data_block_size_f 
+! NAME
+!  h5pget_small_data_block_size_f 
+!
+! PURPOSE
+!  Gets the minimum size of "small" raw data block
+!
+! INPUTS
+!  
+!  plist_id	- file access property list identifier
+! OUTPUTS
+!  
+!  size		- small raw data block size
+!  hdferr	- error code		
+!  		   Success:  0
+!  		   Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 7, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pget_small_data_block_size_f(plist_id, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id  ! File access property list identifier 
+    INTEGER(HSIZE_T), INTENT(OUT) :: size   ! Small raw data block size
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+                                            ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_small_data_block_size_c(plist_id, size) &
+            BIND(C,NAME='h5pget_small_data_block_size_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+         INTEGER(HSIZE_T), INTENT(OUT) :: size
+       END FUNCTION h5pget_small_data_block_size_c
+    END INTERFACE
+    
+    hdferr = h5pget_small_data_block_size_c(plist_id, size) 
+  END SUBROUTINE h5pget_small_data_block_size_f
+
+!****s* H5P/h5pset_hyper_vector_size_f 
+! NAME
+!  h5pset_hyper_vector_size_f 
+!
+! PURPOSE
+!  Set the number of "I/O" vectors (vector size)
+!
+! INPUTS
+!  
+!  plist_id	- dataset transfer property list identifier
+!  size		- vector size
+! OUTPUTS
+!  
+!  hdferr	- error code		
+!  		   Success:  0
+!  		   Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 7, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_hyper_vector_size_f(plist_id, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id ! Dataset transfer property list identifier 
+    INTEGER(SIZE_T), INTENT(IN) :: size    ! Vector size
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+                                           ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_hyper_vector_size_c(plist_id, size) &
+            BIND(C,NAME='h5pset_hyper_vector_size_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+         INTEGER(SIZE_T), INTENT(IN) :: size
+       END FUNCTION h5pset_hyper_vector_size_c
+    END INTERFACE
+    
+    hdferr = h5pset_hyper_vector_size_c(plist_id, size) 
+  END SUBROUTINE h5pset_hyper_vector_size_f
+
+!****s* H5P/ h5pget_hyper_vector_size_f 
+! NAME
+!  h5pget_hyper_vector_size_f 
+!
+! PURPOSE
+!  Get the number of "I/O" vectors (vector size)
+!
+! INPUTS
+!  
+!  plist_id	- dataset transfer property list identifier
+! OUTPUTS
+!  
+!  size		- vector size
+!  hdferr	- error code		
+!  		   Success:  0
+!  		   Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 7, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pget_hyper_vector_size_f(plist_id, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id ! Dataset transfer property list identifier 
+    INTEGER(SIZE_T), INTENT(OUT) :: size   ! Vector size
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+                                           ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_hyper_vector_size_c(plist_id, size) &
+            BIND(C,NAME='h5pget_hyper_vector_size_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+         INTEGER(SIZE_T), INTENT(OUT) :: size
+       END FUNCTION h5pget_hyper_vector_size_c
+    END INTERFACE
+
+    hdferr = h5pget_hyper_vector_size_c(plist_id, size) 
+  END SUBROUTINE h5pget_hyper_vector_size_f
+
+!****s* H5P/h5pexist_f 
+! NAME
+!   h5pexist_f 
+!
+! PURPOSE
+!  Queries whether a property name exists in a property list or class. 
+!
+! INPUTS
+!  
+!  prp_id	- property list identifier to query
+!  name 	- name of property to check for
+! OUTPUTS
+!  
+!  flag         - logical flag
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 9, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pexist_f(prp_id, name, flag, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier 
+    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to modify
+    LOGICAL, INTENT(OUT) :: flag          ! .TRUE. if exists, .FALSE. otherwise
+    INTEGER, INTENT(OUT) :: hdferr  ! Error code
+                                    ! 0 on success and -1 on failure
+!*****
+    INTEGER :: name_len
+    
+    INTERFACE
+       INTEGER FUNCTION h5pexist_c(prp_id, name, name_len) &
+            BIND(C,NAME='h5pexist_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER, INTENT(IN)         :: name_len
+       END FUNCTION h5pexist_c
+    END INTERFACE
+    flag = .FALSE.
+    name_len = LEN(name)
+    hdferr = h5pexist_c(prp_id, name , name_len)
+    IF (hdferr > 0) THEN
+       flag = .TRUE.
+       hdferr = 0
+    ENDIF
+  END SUBROUTINE h5pexist_f
+
+!****s* H5P/h5pget_size_f 
+!
+! NAME
+!  h5pget_size_f 
+!
+! PURPOSE
+!  Queries the size of a property value in bytes.
+!
+! INPUTS
+!  
+!  prp_id	- property list identifier to query
+!  name 	- name of property to query
+! OUTPUTS
+!  
+!  size         - size of property in bytes
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 9, 2002	
+!
+! HISTORY
+! 	
+!  
+! Fortran90 Interface:
+  SUBROUTINE h5pget_size_f(prp_id, name, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier 
+    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to query
+    INTEGER(SIZE_T), INTENT(OUT) :: size  ! Size in bytes
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+                                          ! 0 on success and -1 on failure
+!*****
+    INTEGER :: name_len
+    
+    INTERFACE
+       INTEGER FUNCTION h5pget_size_c(prp_id, name, name_len, size) &
+            BIND(C,NAME='h5pget_size_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER, INTENT(IN)         :: name_len
+         INTEGER(SIZE_T), INTENT(OUT) :: size
+       END FUNCTION h5pget_size_c
+    END INTERFACE
+    name_len = LEN(name)
+    hdferr = h5pget_size_c(prp_id, name , name_len, size)
+  END SUBROUTINE h5pget_size_f
+
+!****s* H5P/h5pget_npros_f 
+! NAME
+!   h5pget_npros_f 
+!
+! PURPOSE
+!  Queries number of properties in property list or class
+!
+! INPUTS
+!  
+!  prp_id	- iproperty list identifier to query
+! OUTPUTS
+!  
+!  nprops       - number of properties in property object
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 9, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pget_nprops_f(prp_id, nprops, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id    ! Property list identifier 
+    INTEGER(SIZE_T), INTENT(OUT) :: nprops  ! Number of properties
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+                                            ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_nprops_c(prp_id, nprops) &
+            BIND(C,NAME='h5pget_nprops_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER(SIZE_T), INTENT(OUT) :: nprops
+       END FUNCTION h5pget_nprops_c
+    END INTERFACE
+    hdferr = h5pget_nprops_c(prp_id, nprops)
+  END SUBROUTINE h5pget_nprops_f
+
+!****s* H5P/h5pget_class_name_f 
+! NAME
+!  h5pget_class_name_f 
+!
+! PURPOSE
+!  Queries the name of a class.
+!
+! INPUTS
+!  
+!  prp_id       - property list identifier to query
+! OUTPUTS
+!  
+!  name 	- name of a class
+!  size         - Actual length of the class name
+!                   NOTE: If provided buffer "name" is smaller,
+!                   than name will be truncated to fit into
+!                   provided user buffer.
+!  hdferr:	- error code
+!  		   Success: 0
+!  		   Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 9, 2002	
+!
+! HISTORY
+! Returned the size of name as an argument	
+!  
+! Fortran90 Interface:
+  SUBROUTINE h5pget_class_name_f(prp_id, name, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier 
+    CHARACTER(LEN=*), INTENT(OUT) :: name ! Buffer to retireve class name
+    INTEGER, INTENT(OUT) :: size          ! Actual length of the class name
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+                                          ! 0 on success and -1 on failure
+!*****
+    INTEGER :: name_len
+    
+    INTERFACE
+       INTEGER FUNCTION h5pget_class_name_c(prp_id, name, name_len) &
+            BIND(C,NAME='h5pget_class_name_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(INOUT) :: name
+         INTEGER, INTENT(IN)         :: name_len
+       END FUNCTION h5pget_class_name_c
+    END INTERFACE
+    
+    name_len = LEN(name)
+    size = h5pget_class_name_c(prp_id, name, name_len)
+    
+    hdferr = 0
+    IF(size.LT.0) hdferr = -1
+    
+  END SUBROUTINE h5pget_class_name_f
+
+!****s* H5P/h5pget_class_parent_f 
+! NAME
+!  h5pget_class_parent_f 
+!
+! PURPOSE
+!  Retrieves the parent class of a genric property class. 
+!
+! INPUTS
+!  
+!  prp_id	- property list identifier to query
+! OUTPUTS
+!  
+!  parent_id 	- identifier of the parent class
+!  hdferr:	- error code          
+!  		   Success:  0
+!  		   Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 9, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pget_class_parent_f(prp_id, parent_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id     ! Property list identifier 
+    INTEGER(HID_T), INTENT(OUT) :: parent_id ! Parent class property list 
+                                             ! identifier 
+    INTEGER, INTENT(OUT) :: hdferr  ! Error code
+                                    ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_class_parent_c(prp_id, parent_id) &
+            BIND(C,NAME='h5pget_class_parent_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER(HID_T), INTENT(OUT) :: parent_id
+       END FUNCTION h5pget_class_parent_c
+    END INTERFACE
+    hdferr = h5pget_class_parent_c(prp_id, parent_id)
+  END SUBROUTINE h5pget_class_parent_f
+
+!****s* H5P/h5pisa_class_f 
+! NAME
+!   h5pisa_class_f 
+!
+! PURPOSE
+!  Determines whether a property list is a member of a class. 
+!
+! INPUTS
+!  
+!  plist	- property list identifier 
+!  pclass	- identifier of the property class
+! OUTPUTS
+!  
+!  flag         - .TRUE. if a member, .FALSE. otherwise
+!  hdferr:	- error code           
+!  		   Success:  0
+!  		   Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 9, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pisa_class_f(plist, pclass, flag, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist     ! Property list identifier 
+    INTEGER(HID_T), INTENT(IN) :: pclass    ! Class identifier
+    LOGICAL, INTENT(OUT) :: flag            ! logical flag
+    INTEGER, INTENT(OUT) :: hdferr  ! Error code
+                                    ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pisa_class_c(plist, pclass) &
+            BIND(C,NAME='h5pisa_class_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist
+         INTEGER(HID_T), INTENT(IN) :: pclass
+       END FUNCTION h5pisa_class_c
+    END INTERFACE
+    flag = .FALSE.
+    hdferr = h5pisa_class_c(plist, pclass)
+    IF (hdferr .GT. 0) THEN
+       flag = .TRUE.
+       hdferr = 0
+    ENDIF
+  END SUBROUTINE h5pisa_class_f
+
+!****s* H5P/h5pcopy_prop_f 
+! NAME
+!   h5pcopy_prop_f 
+!
+! PURPOSE
+!  Copies a property from one list or class to another.
+!
+! INPUTS
+!  
+!  dst_id		- Identifier of the destination property list
+!  src_id		- Identifier of the source property list 
+!  name 		- name of the property to copy
+! OUTPUTS
+!  
+!  hdferr:		- error code
+!  		 	   Success: 0 
+!  		  	   Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 9, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pcopy_prop_f(dst_id, src_id, name, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dst_id  ! Destination property list 
+                                          ! identifier 
+    INTEGER(HID_T), INTENT(IN) :: src_id  ! Source property list identifier 
+    CHARACTER(LEN=*), INTENT(IN) :: name  ! Property name
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+                                          ! 0 on success and -1 on failure
+!*****
+    INTEGER :: name_len
+    
+    INTERFACE
+       INTEGER FUNCTION h5pcopy_prop_c(dst_id, src_id, name, name_len) &
+            BIND(C,NAME='h5pcopy_prop_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dst_id
+         INTEGER(HID_T), INTENT(IN) :: src_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER, INTENT(IN)         :: name_len
+       END FUNCTION h5pcopy_prop_c
+    END INTERFACE
+    name_len = LEN(name)
+    hdferr = h5pcopy_prop_c(dst_id, src_id, name , name_len)
+  END SUBROUTINE h5pcopy_prop_f
+
+!****s* H5P/h5premove_f 
+! NAME
+!   h5premove_f 
+!
+! PURPOSE
+!  Removes a property from a property list. 
+
+!
+! INPUTS
+!  
+!  plid		- Property list identofoer
+!  name 	- name of the property to remove
+! OUTPUTS
+!  
+!  hdferr:	- error code
+!  		   Success: 0 
+!  		   Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 9, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5premove_f(plid, name, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plid   ! Property list identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name ! Name of property to remove
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         !  0 on success and -1 on failure
+!*****
+    INTEGER :: name_len
+    
+    INTERFACE
+       INTEGER FUNCTION h5premove_c(plid, name, name_len) &
+            BIND(C,NAME='h5premove_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plid 
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER, INTENT(IN)         :: name_len
+       END FUNCTION h5premove_c
+    END INTERFACE
+    name_len = LEN(name)
+    hdferr = h5premove_c(plid, name , name_len)
+  END SUBROUTINE h5premove_f
+
+!****s* H5P/h5punregister_f 
+! NAME
+!  h5punregister_f 
+!
+! PURPOSE
+!  Removes a property from a property list class. 
+!
+! INPUTS
+!  
+!  class	- Property list class identifier
+!  name 	- name of the property to remove
+! OUTPUTS
+!  
+!  hdferr:	- error code
+!                  Success: 0 
+!  		   Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 9, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5punregister_f(class, name, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: class  ! property list class identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name ! name of property to remove
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTEGER :: name_len
+
+    INTERFACE
+       INTEGER FUNCTION h5punregister_c(class, name, name_len) &
+            BIND(C,NAME='h5punregister_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: class
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER, INTENT(IN)         :: name_len
+       END FUNCTION h5punregister_c
+    END INTERFACE
+    name_len = LEN(name)
+    hdferr = h5punregister_c(class, name , name_len)
+  END SUBROUTINE h5punregister_f
+
+!****s* H5P/h5pclose_class_f 
+! NAME
+!  h5pclose_class_f 
+!
+! PURPOSE
+!  Closes an existing property list class.
+!
+! INPUTS
+!  
+!  class	- Property list class identifier
+! OUTPUTS
+!  
+!  hdferr	- error code         
+!  		   Success: 0 
+!  		   Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 9, 2002	
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pclose_class_f(class, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: class ! Property list class identifier
+    INTEGER, INTENT(OUT) :: hdferr      ! Error code
+                                        ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pclose_class_c(class) &
+            BIND(C,NAME='h5pclose_class_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: class
+       END FUNCTION h5pclose_class_c
+    END INTERFACE
+    hdferr = h5pclose_class_c(class)
+  END SUBROUTINE h5pclose_class_f
+
+!****s* H5P/h5pset_shuffle_f 
+! NAME
+!  h5pset_shuffle_f 
+!
+! PURPOSE
+!  Sets shuffling filter
+!
+! INPUTS
+!  prp_id	- dataset creation property list identifier
+! OUTPUTS
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  March 12, 2003
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_shuffle_f(prp_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_shuffle_c(prp_id) &
+            BIND(C,NAME='h5pset_shuffle_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+       END FUNCTION h5pset_shuffle_c
+    END INTERFACE
+    hdferr = h5pset_shuffle_c(prp_id)
+    
+  END SUBROUTINE h5pset_shuffle_f
+
+!****s* H5P/h5pset_edc_check_f 
+! NAME
+!  h5pset_edc_check_f 
+!
+! PURPOSE
+!  Enables/disables error detecting  
+!
+! INPUTS
+!  
+!  prp_id	- dataset creation property list identifier
+!  flag         - EDC flag; possible values:
+!                   H5Z_DISABLE_EDC_F
+!                   H5Z_ENABLE_EDC_F
+! OUTPUTS
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  March 13, 2003
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_edc_check_f(prp_id, flag, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(IN) :: flag          ! Checksum filter flag
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_edc_check_c(prp_id, flag) &
+            BIND(C,NAME='h5pset_edc_check_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER, INTENT(IN) :: flag 
+       END FUNCTION h5pset_edc_check_c
+    END INTERFACE
+    hdferr = h5pset_edc_check_c(prp_id, flag)
+    
+  END SUBROUTINE h5pset_edc_check_f
+
+!****s* H5P/h5pget_edc_check_f
+! NAME
+!  h5pget_edc_check_f 
+!
+! PURPOSE
+!  Queries error detecting  
+!
+! INPUTS
+!  
+!  prp_id	- dataset creation property list identifier
+! OUTPUTS
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  March 13, 2003
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pget_edc_check_f(prp_id, flag, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Dataset transfer property list identifier 
+    INTEGER, INTENT(OUT) :: flag         ! Checksum filter flag
+                                         ! May have one of the following values:
+                                         !  H5Z_ERROR_EDC_F
+                                         !  H5Z_DISABLE_EDC_F
+                                         !  H5Z_ENABLE_EDC_F
+                                         !  H5Z_NO_EDC_F
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_edc_check_c(prp_id, flag) &
+            BIND(C,NAME='h5pget_edc_check_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER, INTENT(OUT) :: flag
+       END FUNCTION h5pget_edc_check_c
+    END INTERFACE
+    hdferr = h5pget_edc_check_c(prp_id, flag)
+    
+  END SUBROUTINE h5pget_edc_check_f
+
+!****s* H5P/h5pset_fletcher32_f
+! NAME
+!  h5pset_fletcher32_f 
+!
+! PURPOSE
+!  Sets Fletcher32 checksum of EDC for a dataset creation 
+!  property list.
+!
+! INPUTS
+!  
+!  prp_id	- dataset creation property list identifier
+! OUTPUTS
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  March 13, 2003
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_fletcher32_f(prp_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_fletcher32_c(prp_id) &
+            BIND(C,NAME='h5pset_fletcher32_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+       END FUNCTION h5pset_fletcher32_c
+    END INTERFACE
+    hdferr = h5pset_fletcher32_c(prp_id)
+
+  END SUBROUTINE h5pset_fletcher32_f
+
+!****s* H5P/ h5pset_family_offset_f
+! NAME
+!  h5pset_family_offset_f 
+!
+! PURPOSE
+!  Sets offset for family file driver.
+!
+! INPUTS
+!  
+!  prp_id	- file creation property list identifier
+!  offset	- file offset
+! OUTPUTS
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  19 March 2003
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_family_offset_f(prp_id, offset, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id   ! Property list identifier 
+    INTEGER(HSIZE_T), INTENT(IN) :: offset ! Offset in bytes
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+                                           ! 0 on success and -1 on failure
+!***** 
+    INTERFACE
+       INTEGER FUNCTION h5pset_family_offset_c(prp_id, offset) &
+            BIND(C,NAME='h5pset_family_offset_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER(HSIZE_T), INTENT(IN) :: offset 
+       END FUNCTION h5pset_family_offset_c
+    END INTERFACE
+    hdferr = h5pset_family_offset_c(prp_id, offset)
+    
+  END SUBROUTINE h5pset_family_offset_f
+
+!****s* H5P/h5pset_fapl_multi_l
+! NAME
+!  h5pset_fapl_multi_l 
+!
+! PURPOSE
+!  Sets up use of the multi-file driver. 
+!
+! INPUTS
+!  
+!  prp_id	- file creation property list identifier
+!  mem_map      - mapping array
+!  memb_fapl    - property list for each memory usage type
+!  memb_name    - names of member file
+!  relax        - flag 
+! OUTPUTS
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  20 March 2003
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_fapl_multi_l(prp_id, memb_map, memb_fapl, memb_name, memb_addr, relax, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id
+    INTEGER, DIMENSION(*), INTENT(IN) :: memb_map
+    INTEGER(HID_T), DIMENSION(*), INTENT(IN) :: memb_fapl
+    CHARACTER(LEN=*), DIMENSION(*), INTENT(IN) :: memb_name
+    REAL, DIMENSION(*), INTENT(IN) :: memb_addr 
+    LOGICAL, INTENT(IN) :: relax
+    INTEGER, INTENT(OUT) :: hdferr
+!***** 
+    INTEGER, DIMENSION(1:H5FD_MEM_NTYPES_F) :: lenm
+    INTEGER :: maxlen
+    INTEGER :: flag = 0
+    INTEGER :: i
+
+    INTERFACE
+       INTEGER FUNCTION h5pset_fapl_multi_c(prp_id, memb_map, memb_fapl, memb_name, lenm, &
+            maxlen, memb_addr, flag) &
+            BIND(C,NAME='h5pset_fapl_multi_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id ! File creation property list identifier 
+         INTEGER, DIMENSION(*), INTENT(IN) :: memb_map
+         INTEGER(HID_T), DIMENSION(*), INTENT(IN) :: memb_fapl
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: memb_name
+         REAL, DIMENSION(*), INTENT(IN) :: memb_addr
+         INTEGER, DIMENSION(*) :: lenm
+         INTEGER :: maxlen
+         INTEGER, INTENT(IN) :: flag
+       END FUNCTION h5pset_fapl_multi_c
+    END INTERFACE
+
+    maxlen = LEN(memb_name(1))
+    DO i=1, H5FD_MEM_NTYPES_F
+       lenm(i) = LEN_TRIM(memb_name(i))
+    ENDDO
+    IF(relax) flag = 1
+    hdferr = h5pset_fapl_multi_c(prp_id, memb_map, memb_fapl, memb_name, lenm, maxlen, memb_addr, flag)
+
+  END SUBROUTINE h5pset_fapl_multi_l
+!****s* H5P/h5pset_fapl_multi_s 
+! NAME
+!  h5pset_fapl_multi_s 
+!
+! PURPOSE
+!  Sets up use of the multi-file driver. 
+!
+! INPUTS
+!  
+!  prp_id	- file creation property list identifier
+!  relax        - flag 
+! OUTPUTS
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  31 March 2003
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_fapl_multi_s(prp_id, relax, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! File creation property list identifier 
+    LOGICAL, INTENT(IN) :: relax
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!***** 
+    INTEGER :: flag
+
+    INTERFACE
+       INTEGER FUNCTION h5pset_fapl_multi_sc(prp_id,flag) &
+            BIND(C,NAME='h5pset_fapl_multi_sc')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id ! File creation property list identifier 
+         INTEGER, INTENT(IN) :: flag
+       END FUNCTION h5pset_fapl_multi_sc
+    END INTERFACE
+    flag = 0
+    IF (relax) flag = 1
+    hdferr = h5pset_fapl_multi_sc(prp_id, flag) 
+    
+  END SUBROUTINE h5pset_fapl_multi_s
+!****s* H5P/h5pget_fapl_multi_f 
+! NAME
+!  h5pget_fapl_multi_f 
+!
+! PURPOSE
+!  Sets up use of the multi-file driver. 
+!
+! INPUTS
+!  
+!  prp_id	- file creation property list identifier
+! OUTPUTS
+!  
+!  mem_map      - mapping array
+!  memb_fapl    - property list for each memory usage type
+!  memb_name    - names of member file
+!  relax        - flag 
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1
+!
+! OPTIONAL PARAMETERS
+!  maxlen_out   - maximum length for memb_name array element 
+!
+! AUTHOR
+!  Elena Pourmal
+!  24 March 2003
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pget_fapl_multi_f(prp_id, memb_map, memb_fapl, memb_name, memb_addr, relax, hdferr, maxlen_out)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! File creation property list identifier 
+    INTEGER, DIMENSION(*), INTENT(OUT) :: memb_map
+    INTEGER(HID_T), DIMENSION(*), INTENT(OUT) :: memb_fapl
+    CHARACTER(LEN=*), DIMENSION(*), INTENT(OUT) :: memb_name
+    REAL, DIMENSION(*), INTENT(OUT) :: memb_addr
+    INTEGER, OPTIONAL, INTENT(OUT) :: maxlen_out 
+    LOGICAL, INTENT(OUT) :: relax
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!***** 
+    INTEGER, DIMENSION(1:H5FD_MEM_NTYPES_F) :: lenm
+    INTEGER :: maxlen
+    INTEGER :: c_maxlen_out 
+    INTEGER :: flag
+    INTEGER :: i
+!
+    INTERFACE
+       INTEGER FUNCTION h5pget_fapl_multi_c(prp_id, memb_map, memb_fapl, memb_name, lenm, &
+            maxlen, memb_addr, flag, c_maxlen_out) &
+            BIND(C,NAME='h5pget_fapl_multi_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id ! File creation property list identifier 
+         INTEGER, DIMENSION(*), INTENT(OUT) :: memb_map
+         INTEGER(HID_T), DIMENSION(*), INTENT(OUT) :: memb_fapl
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: memb_name
+         REAL, DIMENSION(*), INTENT(OUT) :: memb_addr
+         INTEGER, DIMENSION(*) :: lenm
+         INTEGER :: maxlen
+         INTEGER :: c_maxlen_out 
+         INTEGER, INTENT(OUT) :: flag
+       END FUNCTION h5pget_fapl_multi_c
+    END INTERFACE
+
+    maxlen = LEN(memb_name(1))
+    DO i=1, H5FD_MEM_NTYPES_F
+       lenm(i) = LEN_TRIM(memb_name(i))
+    ENDDO
+    hdferr = h5pget_fapl_multi_c(prp_id, memb_map, memb_fapl, memb_name, lenm, maxlen, memb_addr, flag, c_maxlen_out)
+    
+    relax = .TRUE.
+    IF(flag .EQ. 0) relax = .FALSE.
+    IF(PRESENT(maxlen_out)) maxlen_out = c_maxlen_out
+  END SUBROUTINE h5pget_fapl_multi_f
+!****s* H5P/h5pset_szip_f 
+! NAME
+!  h5pset_szip_f 
+!
+! PURPOSE
+!  Sets up use of szip compression
+!
+! INPUTS
+!  
+!  prp_id	    - dataset creation property list identifier
+!  options_mask     - A bit-mask conveying the desired SZIP options.
+!                     Current valid values in Fortran are:
+!                        H5_SZIP_EC_OM_F
+!                        H5_SZIP_NN_OM_F
+!  pixels_per_block - szip parameters
+! OUTPUTS
+!  hdferr           - error code		
+!	                Success:  0
+!	                Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  April 10 2003
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_szip_f(prp_id, options_mask, pixels_per_block, hdferr) 
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Dataset creation property 
+                                         ! list identifier 
+    INTEGER, INTENT(IN) :: options_mask  ! A bit-mask conveying the desired
+                                         ! SZIP options
+                                         ! Current valid values in Fortran are:
+                                         !    H5_SZIP_EC_OM_F
+                                         !    H5_SZIP_NN_OM_F
+    INTEGER, INTENT(IN) :: pixels_per_block ! The number of pixels or data elements 
+                                            ! in each data block
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_szip_c(prp_id, options_mask, pixels_per_block) &
+            BIND(C,NAME='h5pset_szip_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id ! File creation property list identifier 
+         INTEGER, INTENT(IN) :: options_mask
+         INTEGER, INTENT(IN) :: pixels_per_block
+       END FUNCTION h5pset_szip_c
+    END INTERFACE
+    hdferr = h5pset_szip_c(prp_id, options_mask, pixels_per_block) 
+    
+  END SUBROUTINE h5pset_szip_f
+
+!****s* H5P/h5pall_filters_avail_f 
+! NAME
+!  h5pall_filters_avail_f 
+!
+! PURPOSE
+!  Checks if all filters set in the dataset creation
+!  property list are available
+!
+! INPUTS
+!  
+!  prp_id	- data creation property list identifier
+! OUTPUTS
+!  
+!  flag         - .TRUE. if all filters are available
+!                 .FALSE. otherwise
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  April 10 2003
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pall_filters_avail_f(prp_id, flag, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Dataset creation property 
+                                         !  list identifier 
+    LOGICAL, INTENT(OUT) :: flag         ! .TRUE. if all filters are available
+                                         ! .FALSE. otherwise
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!***** 
+    INTEGER :: status
+
+    INTERFACE
+       INTEGER FUNCTION h5pall_filters_avail_c(prp_id, status) &
+            BIND(C,NAME='h5pall_filters_avail_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER, INTENT(OUT) :: status
+       END FUNCTION h5pall_filters_avail_c
+    END INTERFACE
+    flag = .TRUE.
+    hdferr = h5pall_filters_avail_c(prp_id, status) 
+    IF (status .EQ. 0 ) flag = .FALSE.
+    
+  END SUBROUTINE h5pall_filters_avail_f
+
+!****s* H5P/h5pget_filter_by_id_f
+! NAME
+!  h5pget_filter_by_id_f 
+!
+! PURPOSE
+!  Returns information about a filter in a pipeline
+!
+! INPUTS
+!  
+!  prp_id	- data creation or transfer property list 
+!  		  identifier
+! OUTPUTS
+!  
+!  filter_id	- filter identifier
+!  flags	- bit vector specifying certain general
+!  		  properties of the filter
+!  cd_nelmts	- number of elements in cd_values
+!  cd_values	- auxiliary data for the filter
+!  namelen	- number of characters in the name buffer
+!  name		- buffer to retrieve filter name
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  April 10 2003
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pget_filter_by_id_f(prp_id, filter_id, flags, cd_nelmts, cd_values, namelen, name, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id   ! Property list identifier 
+    INTEGER, INTENT(IN) :: filter_id       ! Filter identifier
+    INTEGER(SIZE_T), INTENT(INOUT) :: cd_nelmts     ! Number of elements in cd_values.
+    INTEGER, DIMENSION(*), INTENT(OUT) :: cd_values ! Auxiliary data for the filter.
+    INTEGER, INTENT(OUT) :: flags          ! Bit vector specifying certain general
+                                           ! properties of the filter.
+    INTEGER(SIZE_T), INTENT(IN) :: namelen ! Anticipated number of characters in name.
+    CHARACTER(LEN=*), INTENT(OUT) :: name  ! Name of the filter
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+                                           ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_filter_by_id_c(prp_id, filter_id, flags, cd_nelmts,  &
+            cd_values, namelen, name) &
+            BIND(C,NAME='h5pget_filter_by_id_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id
+         INTEGER, INTENT(IN) :: filter_id 
+         INTEGER, DIMENSION(*), INTENT(OUT) :: cd_values
+         INTEGER, INTENT(OUT) :: flags 
+         INTEGER(SIZE_T), INTENT(INOUT) :: cd_nelmts
+         INTEGER(SIZE_T), INTENT(IN) :: namelen
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: name
+       END FUNCTION h5pget_filter_by_id_c
+    END INTERFACE
+    
+    hdferr = h5pget_filter_by_id_c(prp_id, filter_id, flags, cd_nelmts,  & 
+         cd_values, namelen, name)
+  END SUBROUTINE h5pget_filter_by_id_f
+
+!****s* H5P/h5pmodify_filter_f
+! NAME
+!  h5pmodify_filter_f 
+!
+! PURPOSE
+!  Adds a filter to the filter pipeline. 
+!
+! INPUTS
+!  
+!  prp_id	- data creation or transfer property list 
+!  		  identifier
+!  filter	- filter to be modified
+!  flags	- bit vector specifying certain general
+!  		  properties of the filter
+!  cd_nelmts	- number of elements in cd_values
+!  cd_values	- auxiliary data for the filter
+! OUTPUTS
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Elena Pourmal
+!  April 10 2003
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pmodify_filter_f(prp_id, filter, flags, cd_nelmts, cd_values,  hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
+    INTEGER, INTENT(IN) :: filter        ! Filter to be modified
+    INTEGER, INTENT(IN) :: flags         ! Bit vector specifying certain general
+                                         !  properties of the filter
+    INTEGER(SIZE_T), INTENT(IN) :: cd_nelmts       ! Number of elements in cd_values
+    INTEGER, DIMENSION(*), INTENT(IN) :: cd_values ! Auxiliary data for the filter
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pmodify_filter_c(prp_id, filter, flags, cd_nelmts, cd_values) &
+            BIND(C,NAME='h5pmodify_filter_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id 
+         INTEGER, INTENT(IN) :: filter 
+         INTEGER, INTENT(IN) :: flags 
+         INTEGER(SIZE_T), INTENT(IN) :: cd_nelmts 
+         INTEGER, DIMENSION(*), INTENT(IN) :: cd_values 
+       END FUNCTION h5pmodify_filter_c
+    END INTERFACE
+    
+    hdferr = h5pmodify_filter_c(prp_id, filter, flags, cd_nelmts, cd_values )
+  END SUBROUTINE h5pmodify_filter_f
+
+!****s* H5P/h5premove_filter_f 
+! NAME
+!  h5premove_filter_f 
+!
+! PURPOSE
+!  Delete one or more filters from the filter pipeline. 
+!
+! INPUTS
+!  
+!  prp_id	- data creation or transfer property list 
+!  		  identifier
+!  filter	- filter to be removed
+! OUTPUTS
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  Quincey Koziol
+!  January 27 2004
+!
+! Fortran90 Interface:
+  SUBROUTINE h5premove_filter_f(prp_id, filter, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Dataset creation property list
+                                         ! identifier
+    INTEGER, INTENT(IN) :: filter        ! Filter to be removed
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+                                         ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5premove_filter_c(prp_id, filter) &
+            BIND(C,NAME='h5premove_filter_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id 
+         INTEGER, INTENT(IN) :: filter 
+       END FUNCTION h5premove_filter_c
+    END INTERFACE
+    
+    hdferr = h5premove_filter_c(prp_id, filter)
+  END SUBROUTINE h5premove_filter_f
+
+!****s* H5P/H5Pget_attr_phase_change_f
+! NAME
+!  H5Pget_attr_phase_change_f 
+!
+! PURPOSE
+!  Retrieves attribute storage phase change thresholds 
+!
+! INPUTS
+!  
+!  ocpl_id	   - Object (dataset or group) creation property list identifier
+! OUTPUTS
+!  
+!  max_compact     - Maximum number of attributes to be stored in compact storage
+!                    (Default: 8)
+!  min_dense       - Minimum number of attributes to be stored in dense storage
+!                    (Default: 6)
+!  hdferr          - Error code		
+!	              Success:  0
+!	              Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  January, 2008
+!
+! Fortran90 Interface:  
+  SUBROUTINE h5pget_attr_phase_change_f(ocpl_id, max_compact, min_dense, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: ocpl_id ! Object (dataset or group) creation property list identifier
+    INTEGER, INTENT(OUT) :: max_compact   ! Maximum number of attributes to be stored in compact storage
+                                          ! (Default: 8)
+    INTEGER, INTENT(OUT) :: min_dense     ! Minimum number of attributes to be stored in dense storage
+                                          ! (Default: 6)
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+                                          ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_attr_phase_change_c(ocpl_id, max_compact, min_dense) &
+            BIND(C,NAME='h5pget_attr_phase_change_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: ocpl_id
+         INTEGER, INTENT(OUT) :: max_compact
+         INTEGER, INTENT(OUT) :: min_dense
+
+       END FUNCTION h5pget_attr_phase_change_c
+    END INTERFACE
+
+    hdferr = h5pget_attr_phase_change_c(ocpl_id, max_compact, min_dense)
+  END SUBROUTINE h5pget_attr_phase_change_f
+
+!****s* H5P/H5Pset_attr_creation_order_f 
+! NAME
+!  H5Pset_attr_creation_order_f 
+!
+! PURPOSE
+!  Sets tracking and indexing of attribute creation order
+!
+! INPUTS
+!  
+!  ocpl_id	   - Object creation property list identifier
+!  crt_order_flags - Flags specifying whether to track and index attribute creation order
+! OUTPUTS
+!
+!  hdferr          - Error code		
+!	              Success:  0
+!	              Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  January, 2008
+!
+! Fortran90 Interface: 
+  SUBROUTINE h5pset_attr_creation_order_f(ocpl_id, crt_order_flags , hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: ocpl_id   ! Object (dataset or group) creation property list identifier
+    INTEGER, INTENT(IN) :: crt_order_flags  ! Flags specifying whether to track and index attribute creation order
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+                                            ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION H5Pset_attr_creation_order_c(ocpl_id, crt_order_flags) &
+            BIND(C,NAME='h5pset_attr_creation_order_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: ocpl_id
+         INTEGER, INTENT(IN) :: crt_order_flags
+
+       END FUNCTION H5Pset_attr_creation_order_c
+    END INTERFACE
+
+    hdferr = H5Pset_attr_creation_order_c(ocpl_id, crt_order_flags)
+  END SUBROUTINE h5pset_attr_creation_order_f
+
+!****s* H5P/H5Pset_shared_mesg_nindexes_f 
+! NAME
+!  H5Pset_shared_mesg_nindexes_f 
+!
+! PURPOSE
+!  Sets number of shared object header message indexes 
+!
+! INPUTS
+!  
+!  plist_id - file creation property list
+!  nindexes - Number of shared object header message indexes to be available in files created with this property list
+! OUTPUTS
+!
+!  hdferr  - error code		
+!	      Success:  0
+!	      Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  January, 2008
+!
+! Fortran90 Interface:  
+  SUBROUTINE h5pset_shared_mesg_nindexes_f( plist_id, nindexes, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id ! File creation property list
+    INTEGER, INTENT(IN) :: nindexes  ! Number of shared object header message indexes 
+                                     !  available in files created WITH this property list
+    INTEGER, INTENT(OUT) :: hdferr   ! Error code
+                                     ! 0 on success and -1 on failure
+!***** 
+!
+!  MS FORTRAN needs explicit interface for C functions called here.
+!
+    INTERFACE
+       INTEGER FUNCTION h5pset_shared_mesg_nindexes_c(plist_id, nindexes) &
+            BIND(C,NAME='h5pset_shared_mesg_nindexes_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+         INTEGER, INTENT(IN) :: nindexes
+
+       END FUNCTION H5pset_shared_mesg_nindexes_c
+    END INTERFACE
+
+    hdferr = h5pset_shared_mesg_nindexes_c(plist_id, nindexes)
+
+  END SUBROUTINE h5pset_shared_mesg_nindexes_f
+
+!****s* H5P/H5Pset_shared_mesg_index_f
+! NAME
+!  H5Pset_shared_mesg_index_f
+!
+! PURPOSE
+!  Configures the specified shared object header message index
+!
+! INPUTS
+!  
+!  fcpl_id         - File creation property list identifier.
+!  index_num       - Index being configured.
+!  mesg_type_flags - Types of messages that should be stored in this index.
+!  min_mesg_size   - Minimum message size.
+!
+! OUTPUTS
+!
+!  hdferr  - error code		
+!	      Success:  0
+!	      Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  January, 2008
+!
+! Fortran90 Interface:  
+  SUBROUTINE h5pset_shared_mesg_index_f(fcpl_id, index_num, mesg_type_flags, min_mesg_size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: fcpl_id  ! file creation property list
+    INTEGER, INTENT(IN) :: index_num       ! Index being configured.
+    INTEGER, INTENT(IN) :: mesg_type_flags ! Types of messages that should be stored in this index.
+    INTEGER, INTENT(IN) :: min_mesg_size   ! Minimum message size.
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+                                           ! 0 on success and -1 on failure
+!***** 
+!
+!  MS FORTRAN needs explicit interface for C functions called here.
+!
+    INTERFACE
+       INTEGER FUNCTION h5pset_shared_mesg_index_c(fcpl_id, index_num, mesg_type_flags, min_mesg_size) &
+            BIND(C,NAME='h5pset_shared_mesg_index_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: fcpl_id 
+         INTEGER, INTENT(IN) :: index_num
+         INTEGER, INTENT(IN) :: mesg_type_flags
+         INTEGER, INTENT(IN) :: min_mesg_size
+       END FUNCTION H5pset_shared_mesg_index_c
+    END INTERFACE
+
+    hdferr = h5pset_shared_mesg_index_c(fcpl_id, index_num, mesg_type_flags, min_mesg_size)
+
+  END SUBROUTINE h5pset_shared_mesg_index_f
+
+!****s* H5P/H5Pget_attr_creation_order_f
+! NAME
+!  H5Pget_attr_creation_order_f
+!
+! PURPOSE
+!  Retrieves tracking and indexing settings for attribute creation order
+!
+! INPUTS
+!
+!  ocpl_id         - Object (group or dataset) creation property list identifier
+!
+! OUTPUTS
+!
+!  crt_order_flags - Flags specifying whether to track and index attribute creation order
+!  hdferr	   - Error code		
+!  		 	Success:  0
+!  		 	Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February, 2008
+!
+! Fortran90 Interface:  
+  SUBROUTINE h5pget_attr_creation_order_f(ocpl_id, crt_order_flags, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: ocpl_id   ! Object (group or dataset) creation property list identifier 
+    INTEGER, INTENT(OUT) :: crt_order_flags ! Flags specifying whether to track and index attribute creation order 
+    INTEGER, INTENT(OUT) :: hdferr   ! Error code
+                                     ! 0 on success and -1 on failure
+!***** 
+!
+!  MS FORTRAN needs explicit interface for C functions called here.
+!
+    INTERFACE
+       INTEGER FUNCTION h5pget_attr_creation_order_c(ocpl_id, crt_order_flags) &
+            BIND(C,NAME='h5pget_attr_creation_order_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: ocpl_id
+         INTEGER, INTENT(OUT) :: crt_order_flags
+       END FUNCTION H5pget_attr_creation_order_c
+    END INTERFACE
+
+    hdferr = h5pget_attr_creation_order_c(ocpl_id, crt_order_flags)
+
+  END SUBROUTINE h5pget_attr_creation_order_f
+
+!****s* H5P/H5Pset_libver_bounds_f
+! NAME
+! 	      H5Pset_libver_bounds_f
+!
+! PURPOSE
+!    Sets bounds on library versions, and indirectly format versions, to be used when creating objects.
+!
+! INPUTS
+!
+!  fapl_id - File access property list identifier
+!  low     - The earliest version of the library that will be used for writing objects.
+!  high    - The latest version of the library that will be used for writing objects.
+!
+! OUTPUTS
+!
+!  hdferr  - error code		
+!  	      Success:  0
+!  	      Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 18, 2008
+!
+! Fortran90 Interface:  
+  SUBROUTINE h5pset_libver_bounds_f(fapl_id, low, high, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: fapl_id ! File access property list identifier
+    INTEGER, INTENT(IN) :: low   ! The earliest version of the library that will be used for writing objects.
+                                 ! Currently, low must be one of two pre-defined values:
+                                 !            HDF_LIBVER_EARLIEST_F
+                                 !            HDF_LIBVER_LATEST_F
+    INTEGER, INTENT(IN) :: high  ! The latest version of the library that will be used for writing objects.
+                                 ! Currently, low must set to the pre-defined value:
+                                 !            HDF_LIBVER_LATEST_F
+    INTEGER, INTENT(OUT) :: hdferr  ! Error code
+                                    ! 0 on success and -1 on failure
+!***** 
+!
+!  MS FORTRAN needs explicit interface for C functions called here.
+!
+    INTERFACE
+       INTEGER FUNCTION h5pset_libver_bounds_c(fapl_id, low, high) &
+            BIND(C,NAME='h5pset_libver_bounds_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: fapl_id
+         INTEGER, INTENT(IN) :: low
+         INTEGER, INTENT(IN) :: high
+
+       END FUNCTION H5pset_libver_bounds_c
+    END INTERFACE
+
+    hdferr = h5pset_libver_bounds_c(fapl_id, low, high)
+
+  END SUBROUTINE h5pset_libver_bounds_f
+
+!****s* H5P/H5Pset_link_creation_order_f 
+! NAME
+!  H5Pset_link_creation_order_f 
+!
+! PURPOSE
+!    Sets creation order tracking and indexing for links in a group.
+!
+! INPUTS
+!
+!  gcpl_id  	   - Group creation property list identifier
+!  crt_order_flags - Creation order flag(s)
+!
+! OUTPUTS
+!
+!  hdferr	    - Error code		
+!  		 	Success:  0
+!  		 	Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 18, 2008
+!
+! Fortran90 Interface:  
+  SUBROUTINE h5pset_link_creation_order_f(gcpl_id, crt_order_flags, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: gcpl_id  ! File access property list identifier
+    INTEGER, INTENT(IN) :: crt_order_flags ! Creation order flag(s)
+    INTEGER, INTENT(OUT) :: hdferr   ! Error code
+                                     ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_link_creation_order_c(gcpl_id, crt_order_flags) &
+            BIND(C,NAME='h5pset_link_creation_order_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: gcpl_id
+         INTEGER, INTENT(IN) :: crt_order_flags
+
+       END FUNCTION H5pset_link_creation_order_c
+    END INTERFACE
+
+    hdferr = h5pset_link_creation_order_c(gcpl_id, crt_order_flags)
+
+  END SUBROUTINE h5pset_link_creation_order_f
+
+!****s* H5P/H5Pget_link_phase_change_f
+! NAME
+!  H5Pget_link_phase_change_f
+!
+! PURPOSE
+!  Queries the settings for conversion between compact and dense groups.
+!
+! INPUTS
+!  
+!  gcpl_id  	- Group creation property list identifier
+! OUTPUTS
+!  
+!  max_compact  - Maximum number of attributes to be stored in compact storage
+!  min_dense    - Minimum number of attributes to be stored in dense storage
+!  hdferr       - Error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 20, 2008
+!
+! Fortran90 Interface:  
+  SUBROUTINE h5pget_link_phase_change_f(gcpl_id, max_compact, min_dense, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: gcpl_id ! Group creation property list identifier
+    INTEGER, INTENT(OUT) :: max_compact   ! Maximum number of attributes to be stored in compact storage
+    INTEGER, INTENT(OUT) :: min_dense     ! Minimum number of attributes to be stored in dense storage
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+                                          ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_link_phase_change_c(gcpl_id, max_compact, min_dense) &
+            BIND(C,NAME='h5pget_link_phase_change_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: gcpl_id
+         INTEGER, INTENT(OUT) :: max_compact
+         INTEGER, INTENT(OUT) :: min_dense
+
+       END FUNCTION h5pget_link_phase_change_c
+    END INTERFACE
+
+    hdferr = h5pget_link_phase_change_c(gcpl_id, max_compact, min_dense)
+  END SUBROUTINE h5pget_link_phase_change_f
+
+!****s* H5P/H5Pget_obj_track_times_f 
+! NAME
+!  H5Pget_obj_track_times_f 
+!
+! PURPOSE
+!  Returns whether times are tracked for an object.
+!
+! INPUTS
+!  
+!  plist_id	- property list id
+!  flag         - object timestamp setting
+!                 .TRUE.,.FALSE.
+! OUTPUTS
+!
+!  hdferr       - error code		
+!	          Success:  0
+!	          Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 22, 2008
+!
+! Fortran90 Interface:  
+  SUBROUTINE h5pget_obj_track_times_f(plist_id, flag, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id ! Dataset creation property 
+                                           ! list identifier 
+    LOGICAL, INTENT(OUT) :: flag   ! Object timestamp setting
+    INTEGER, INTENT(OUT) :: hdferr ! Error code
+                                   ! 0 on success and -1 on failure
+!***** 
+    INTEGER :: status
+!
+!  MS FORTRAN needs explicit interface for C functions called here.
+!
+    INTERFACE
+       INTEGER FUNCTION h5pget_obj_track_times_c(plist_id, status) &
+            BIND(C,NAME='h5pget_obj_track_times_c')
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN) :: plist_id ! File creation property list identifier 
+         INTEGER, INTENT(OUT) :: status
+       END FUNCTION h5pget_obj_track_times_c
+    END INTERFACE
+    flag = .TRUE.
+    hdferr = h5pget_obj_track_times_c(plist_id, status)
+    IF(status.EQ.0) flag = .FALSE.
+
+  END SUBROUTINE h5pget_obj_track_times_f
+
+!****s* H5P/H5Pset_obj_track_times_f 
+! NAME
+!  H5Pset_obj_track_times_f 
+!
+! PURPOSE
+!  Set whether the birth, access, modification & change times for
+!  an object are stored.
+!
+!  Birth time is the time the object was created.  Access time is
+!  the last time that metadata or raw data was read from this
+!  object.  Modification time is the last time the data for
+!  this object was changed (either writing raw data to a dataset
+!  or inserting/modifying/deleting a link in a group).  Change
+!  time is the last time the metadata for this object was written
+!  (adding/modifying/deleting an attribute on an object, extending
+!  the size of a dataset, etc).
+!
+!   If these times are not tracked, they will be reported as
+!   12:00 AM UDT, Jan. 1, 1970 (i.e. 0 seconds past the UNIX
+!   epoch) when queried.
+!
+! INPUTS
+!  
+!  plist_id	- property list id
+!  flag         - object timestamp setting
+!                 .TRUE.,.FALSE.
+! OUTPUTS
+!
+!  hdferr       - error code		
+!	           Success:  0
+!	           Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 22, 2008
+!	
+!  
+! Fortran90 Interface:  
+  SUBROUTINE h5pset_obj_track_times_f(plist_id, flag, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id ! Dataset creation property
+                                           ! list identifier
+    LOGICAL, INTENT(IN) :: flag    ! Object timestamp setting
+    INTEGER, INTENT(OUT) :: hdferr ! Error code
+                                   ! 0 on success and -1 on failure
+!***** 
+    INTEGER :: status
+!
+!  MS FORTRAN needs explicit interface for C functions called here.
+!
+    INTERFACE
+       INTEGER FUNCTION h5pset_obj_track_times_c(plist_id, status) &
+            BIND(C,NAME='h5pset_obj_track_times_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id ! File creation property list identifier 
+         INTEGER, INTENT(IN) :: status
+       END FUNCTION h5pset_obj_track_times_c
+    END INTERFACE
+
+    status = 0
+    IF(flag) status = 1
+
+    hdferr = h5pset_obj_track_times_c(plist_id, status)
+
+  END SUBROUTINE h5pset_obj_track_times_f
+
+!****s* H5P/H5Pset_create_inter_group_f
+! NAME
+!  H5Pset_create_inter_group_f
+!
+! PURPOSE
+!  Specifies in property list whether to create missing intermediate groups.
+!
+! INPUTS
+!  
+!  lcpl_id            - Link creation property list identifier
+!  crt_intermed_group - crt_intermed_group specifying whether 
+!                       to create intermediate groups upon the creation 
+!                       of an object
+! OUTPUTS
+!
+!  hdferr	      - Error code		
+!  		 	  Success:  0
+!  		 	  Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 22, 2008
+!
+! HISTORY	
+! The long subroutine name (>31) on older f90 compilers causes problems
+!          so had to shorten the name
+! Fortran90 Interface:
+  SUBROUTINE h5pset_create_inter_group_f(lcpl_id, crt_intermed_group, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: lcpl_id      ! Link creation property list identifier
+    INTEGER, INTENT(IN) :: crt_intermed_group  ! specifying whether to create intermediate groups
+                                               ! upon the creation of an object
+    INTEGER, INTENT(OUT) :: hdferr ! Error code
+                                   ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_create_inter_group_c(lcpl_id, crt_intermed_group) &
+            BIND(C,NAME='h5pset_create_inter_group_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: lcpl_id
+         INTEGER, INTENT(IN) :: crt_intermed_group
+       END FUNCTION h5pset_create_inter_group_c
+    END INTERFACE
+
+    hdferr = h5pset_create_inter_group_c(lcpl_id, crt_intermed_group)
+
+  END SUBROUTINE h5pset_create_inter_group_f
+
+!****s* H5P/H5Pget_link_creation_order_f
+! NAME
+!  H5Pget_link_creation_order_f
+!
+! PURPOSE
+!  Queries whether link creation order is tracked and/or indexed in a group.
+!
+! INPUTS
+!
+!  gcpl_id - Group creation property list identifier
+!
+! OUTPUTS
+!
+!  crt_order_flags - Creation order flag(s)
+!  hdferr	   - Error code		
+!  		      Success:  0
+!  		      Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 3, 2008
+!
+! Fortran90 Interface:  
+  SUBROUTINE h5pget_link_creation_order_f(gcpl_id, crt_order_flags, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: gcpl_id   ! Group creation property list identifier
+    INTEGER, INTENT(OUT) :: crt_order_flags ! Creation order flag(s)
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+                                            ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_link_creation_order_c(gcpl_id, crt_order_flags) &
+            BIND(C,NAME='h5pget_link_creation_order_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: gcpl_id
+         INTEGER, INTENT(OUT) :: crt_order_flags
+
+       END FUNCTION H5pget_link_creation_order_c
+    END INTERFACE
+
+    hdferr = h5pget_link_creation_order_c(gcpl_id, crt_order_flags)
+
+  END SUBROUTINE h5pget_link_creation_order_f
+
+!****s* H5P/H5Pset_char_encoding_f
+! NAME
+!  H5Pset_char_encoding_f
+!
+! PURPOSE
+!  Sets the character encoding used to encode a string.
+!
+! INPUTS
+!
+!  plist_id - Property list identifier
+!  encoding - Valid values for encoding are:
+!     	        H5T_CSET_ASCII_F -> US ASCII
+!     	        H5T_CSET_UTF8_F -> UTF-8 Unicode encoding
+!
+! OUTPUTS
+!  hdferr   - Error code		
+!  	        Success:  0
+!  		Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 3, 2008
+!
+! Fortran90 Interface:  
+  SUBROUTINE h5pset_char_encoding_f(plist_id, encoding, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id ! Property list identifier
+    INTEGER, INTENT(IN) :: encoding        ! String encoding character set:
+     	                                   !   H5T_CSET_ASCII_F -> US ASCII
+     	                                   !   H5T_CSET_UTF8_F  -> UTF-8 Unicode encoding
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+                                           ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_char_encoding_c(plist_id, encoding) &
+            BIND(C,NAME='h5pset_char_encoding_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+         INTEGER, INTENT(IN) :: encoding
+
+       END FUNCTION H5pset_char_encoding_c
+    END INTERFACE
+
+    hdferr = h5pset_char_encoding_c(plist_id, encoding)
+
+  END SUBROUTINE h5pset_char_encoding_f
+
+!****s* H5P/H5Pget_char_encoding_f
+! NAME
+!  H5Pget_char_encoding_f
+!
+! PURPOSE
+!  Retrieves the character encoding used to create a string
+!
+! INPUTS
+!
+!  plist_id - Property list identifier
+!
+! OUTPUTS
+!
+!  encoding - Valid values for encoding are:
+!     	        H5T_CSET_ASCII_F -> US ASCII
+!     	        H5T_CSET_UTF8_F -> UTF-8 Unicode encoding
+!  hdferr   - Error code		
+!               Success:  0
+!               Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 3, 2008
+!
+! Fortran90 Interface:  
+  SUBROUTINE  h5pget_char_encoding_f(plist_id, encoding, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id ! Property list identifier
+
+    INTEGER, INTENT(OUT) :: encoding       ! Valid values for encoding are:
+     	                                   !  H5T_CSET_ASCII_F -> US ASCII
+     	                                   !  H5T_CSET_UTF8_F  -> UTF-8 Unicode encoding
+    INTEGER, INTENT(OUT) :: hdferr   ! Error code
+                                     ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_char_encoding_c(plist_id, encoding) &
+            BIND(C,NAME='h5pget_char_encoding_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+         INTEGER, INTENT(OUT) :: encoding
+
+       END FUNCTION H5pget_char_encoding_c
+    END INTERFACE
+
+    hdferr = h5pget_char_encoding_c(plist_id, encoding)
+
+  END SUBROUTINE h5pget_char_encoding_f
+
+!****s* H5P/h5pset_copy_object_f
+! NAME
+!  h5pset_copy_object_f 
+!
+! PURPOSE
+!  Sets properties to be used when an object is copied.
+!
+! INPUTS
+! 
+!  ocp_plist_id - Object copy property list identifier
+!  copy_options - Copy option(s) to be set
+! OUTPUTS
+!  
+!  hdferr	- error code		
+!  		   Success:  0
+!  		   Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 3, 2008
+!
+! HISTORY
+!
+!  
+! Fortran90 Interface:  
+  SUBROUTINE h5pset_copy_object_f(ocp_plist_id, copy_options, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: ocp_plist_id ! Object copy property list identifier
+    INTEGER, INTENT(IN) :: copy_options ! Copy option(s) to be set, valid options are:
+                                        !   H5O_COPY_SHALLOW_HIERARCHY_F
+                                        !   H5O_COPY_EXPAND_SOFT_LINK_F
+                                        !   H5O_COPY_EXPAND_EXT_LINK_F
+                                        !   H5O_COPY_EXPAND_REFERENCE_F
+                                        !   H5O_COPY_WITHOUT_ATTR_FLAG_F
+    INTEGER, INTENT(OUT) :: hdferr      ! Error code
+                                        ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_copy_object_c(ocp_plist_id, copy_options) &
+            BIND(C,NAME='h5pset_copy_object_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: ocp_plist_id
+         INTEGER, INTENT(IN) :: copy_options
+       END FUNCTION h5pset_copy_object_c
+    END INTERFACE
+    hdferr = h5pset_copy_object_c(ocp_plist_id, copy_options)
+  END SUBROUTINE h5pset_copy_object_f
+
+!****s* H5P/h5pget_copy_object_f
+! NAME
+!  h5pget_copy_object_f 
+!
+! PURPOSE
+!  Retrieves the properties to be used when an object is copied.
+!
+! INPUTS
+! 
+!  ocp_plist_id - Object copy property list identifier
+! OUTPUTS
+!  
+!  copy_options - Copy option(s) to be get
+!  hdferr	- Error code		
+!  		   Success:  0
+!  		   Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 3, 2008
+!
+! HISTORY
+!
+!  
+! Fortran90 Interface:
+  SUBROUTINE h5pget_copy_object_f(ocp_plist_id, copy_options, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: ocp_plist_id ! Object copy property list identifier
+    INTEGER, INTENT(OUT) :: copy_options       ! Valid copy options returned are:
+                                               !   H5O_COPY_SHALLOW_HIERARCHY_F
+                                               !   H5O_COPY_EXPAND_SOFT_LINK_F 
+                                               !   H5O_COPY_EXPAND_EXT_LINK_F
+                                               !   H5O_COPY_EXPAND_REFERENCE_F
+                                               !   H5O_COPY_WITHOUT_ATTR_FLAG_F
+    INTEGER, INTENT(OUT) :: hdferr             ! Error code
+                                               ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_copy_object_c(ocp_plist_id, copy_options) &
+            BIND(C,NAME='h5pget_copy_object_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: ocp_plist_id
+         INTEGER, INTENT(OUT) :: copy_options
+       END FUNCTION h5pget_copy_object_c
+    END INTERFACE
+    hdferr = h5pget_copy_object_c(ocp_plist_id, copy_options)
+  END SUBROUTINE h5pget_copy_object_f
+
+!****s* H5P/h5pget_data_transform_f 
+! NAME
+!  h5pget_data_transform_f 
+!
+! PURPOSE
+!  Retrieves a data transform expression.
+!
+! INPUTS
+! 
+!  plist_id   - Identifier of the property list or class
+! OUTPUTS
+!  
+!  expression - buffer to hold transform expression
+!  hdferr     - Error code
+!                 Success:  Actual lenght of the expression
+!                           If provided buffer "expression" is 
+!                           smaller, than expression will be 
+!                           truncated to fit into
+!                           provided user buffer
+!  		  Failure: -1
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 19, 2008
+!
+! HISTORY
+!
+! Should hdferr return just 0 or 1 and add another arguement for the size?
+! Fortran90 Interface:
+SUBROUTINE h5pget_data_transform_f(plist_id, expression, hdferr, size)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id         ! Identifier of the property list or class
+    CHARACTER(LEN=*), INTENT(OUT) :: expression    ! Buffer to hold transform expression
+    INTEGER(SIZE_T), INTENT(OUT), OPTIONAL :: size ! Registered size of the transform expression
+    INTEGER, INTENT(OUT) :: hdferr                 ! Error code
+                                                   !  0 on success and -1 on failure
+!***** 
+    INTEGER :: expression_len
+    INTEGER(SIZE_T) :: size_default
+
+    INTERFACE
+       INTEGER FUNCTION h5pget_data_transform_c(plist_id, expression, expression_len, size_default) &
+            BIND(C,NAME='h5pget_data_transform_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id 
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: expression 
+         INTEGER(SIZE_T) :: size_default
+         INTEGER :: expression_len
+       END FUNCTION h5pget_data_transform_c
+    END INTERFACE
+
+    size_default = 0
+    expression_len = LEN(expression)
+
+    hdferr = h5pget_data_transform_c(plist_id, expression, expression_len, size_default)
+
+    IF(present(size)) size = size_default
+
+  END SUBROUTINE h5pget_data_transform_f
+
+!****s* H5P/h5pset_data_transform_f 
+! NAME
+!  h5pset_data_transform_f 
+!
+! PURPOSE
+!  Sets a data transform expression.
+!
+! INPUTS
+! 
+!  plist_id   - Identifier of the property list or class 
+!  expression - Buffer to hold transform expression
+! OUTPUTS
+! 
+!  hdferr     - error code
+!                 Success:  0
+!  		  Failure: -1
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 19, 2008
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_data_transform_f(plist_id, expression, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist_id     ! Identifier of the property list or class
+    CHARACTER(LEN=*), INTENT(IN) :: expression ! Buffer to hold transform expression
+    INTEGER, INTENT(OUT) :: hdferr             ! Error code
+                                               ! 0 on success and -1 on failure
+!***** 
+    INTEGER :: expression_len
+
+    INTERFACE
+       INTEGER FUNCTION h5pset_data_transform_c(plist_id, expression, expression_len) &
+            BIND(C,NAME='h5pset_data_transform_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id 
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: expression
+         INTEGER :: expression_len
+       END FUNCTION h5pset_data_transform_c
+    END INTERFACE
+
+    expression_len = LEN(expression)
+    hdferr = h5pset_data_transform_c(plist_id, expression, expression_len)
+
+  END SUBROUTINE h5pset_data_transform_f
+
+!****s* H5P/H5Pget_local_heap_size_hint_f 
+! NAME
+!  H5Pget_local_heap_size_hint_f 
+!
+! PURPOSE
+!  Queries the local heap size hint for original-style groups.
+!
+! INPUTS
+! 
+!  gcpl_id   - Group creation property list identifier
+! OUTPUTS
+!
+!  size_hint - Hint for size of local heap
+!  hdferr    - Error code
+!               Success:  0
+!  		Failure: -1
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 21, 2008
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pget_local_heap_size_hint_f(gcpl_id, size_hint, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: gcpl_id     ! Group creation property list identifier
+    INTEGER(SIZE_T), INTENT(OUT) :: size_hint ! Hint for size of local heap
+    INTEGER, INTENT(OUT) :: hdferr            ! Error code
+                                              ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_local_heap_size_hint_c(gcpl_id, size_hint) &
+            BIND(C,NAME='h5pget_local_heap_size_hint_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: gcpl_id
+         INTEGER(SIZE_T), INTENT(OUT) :: size_hint
+       END FUNCTION H5Pget_local_heap_size_hint_c
+    END INTERFACE
+
+    hdferr = H5Pget_local_heap_size_hint_c(gcpl_id, size_hint)
+
+  END SUBROUTINE h5pget_local_heap_size_hint_f
+
+!****s* H5P/H5Pget_est_link_info_f 
+! NAME
+!  H5Pget_est_link_info_f 
+!
+! PURPOSE
+!  Queries data required to estimate required local heap or object header size.
+!
+! INPUTS
+! 
+!  gcpl_id         - Group creation property list identifier
+! OUTPUTS
+!  
+!  est_num_entries - Estimated number of links to be inserted into group
+!  est_name_len    - Estimated average length of link names
+!  hdferr	   - Error code
+!                     Success:  0
+!  		      Failure: -1
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 21, 2008
+!
+! HISTORY
+!
+! 
+! Fortran90 Interface:
+  SUBROUTINE h5pget_est_link_info_f(gcpl_id, est_num_entries, est_name_len, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: gcpl_id   ! Group creation property list identifier  
+    INTEGER, INTENT(OUT) :: est_num_entries ! Estimated number of links to be inserted into group
+    INTEGER, INTENT(OUT) :: est_name_len    ! Estimated average length of link names
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+                                            ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_est_link_info_c(gcpl_id, est_num_entries, est_name_len) &
+            BIND(C,NAME='h5pget_est_link_info_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: gcpl_id  
+         INTEGER, INTENT(OUT) :: est_num_entries
+         INTEGER, INTENT(OUT) :: est_name_len
+       END FUNCTION h5pget_est_link_info_c
+    END INTERFACE
+
+    hdferr = h5pget_est_link_info_c(gcpl_id, est_num_entries, est_name_len)
+
+  END SUBROUTINE h5pget_est_link_info_f
+
+!****s* H5P/H5Pset_local_heap_size_hint_f 
+! NAME
+!  H5Pset_local_heap_size_hint_f 
+!
+! PURPOSE
+!  Sets the local heap size hint for original-style groups.
+!
+! INPUTS
+! 
+!  gcpl_id   - Group creation property list identifier
+!  size_hint - Hint for size of local heap
+! OUTPUTS
+!
+!  hdferr    - Error code
+!               Success:  0
+!  		Failure: -1
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 21, 2008
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_local_heap_size_hint_f(gcpl_id, size_hint, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: gcpl_id    ! Group creation property list identifier
+    INTEGER(SIZE_T), INTENT(IN) :: size_hint ! Hint for size of local heap
+    INTEGER, INTENT(OUT) :: hdferr           ! Error code
+                                             ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_local_heap_size_hint_c(gcpl_id, size_hint) &
+            BIND(C,NAME='h5pset_local_heap_size_hint_c')
+         IMPORT :: HID_T, SIZE_T 
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: gcpl_id
+         INTEGER(SIZE_T), INTENT(IN) :: size_hint
+       END FUNCTION h5pset_local_heap_size_hint_c
+    END INTERFACE
+
+    hdferr = H5Pset_local_heap_size_hint_c(gcpl_id, size_hint)
+
+  END SUBROUTINE h5pset_local_heap_size_hint_f
+
+!****s* H5P/h5pset_est_link_info_f 
+! NAME
+!  h5pset_est_link_info_f 
+!
+! PURPOSE
+!  Sets estimated number of links and length of link names in a group.
+!
+! INPUTS
+! 
+! gcpl_id         - Group creation property list identifier  
+! est_num_entries - Estimated number of links to be inserted into group
+! est_name_len    - Estimated average length of link names
+! OUTPUTS
+!
+!  hdferr	  - Error code
+!                    Success:  0
+!  		     Failure: -1
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 21, 2008
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_est_link_info_f(gcpl_id, est_num_entries, est_name_len, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: gcpl_id  ! Group creation property list identifier  
+    INTEGER, INTENT(IN) :: est_num_entries ! Estimated number of links to be inserted into group
+    INTEGER, INTENT(IN) :: est_name_len    ! Estimated average length of link names
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+                                           ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_est_link_info_c(gcpl_id, est_num_entries, est_name_len) &
+            BIND(C,NAME='h5pset_est_link_info_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: gcpl_id  
+         INTEGER, INTENT(IN) :: est_num_entries
+         INTEGER, INTENT(IN) :: est_name_len
+       END FUNCTION h5pset_est_link_info_c
+    END INTERFACE
+
+    hdferr = H5Pset_est_link_info_c(gcpl_id, est_num_entries, est_name_len)
+
+  END SUBROUTINE h5pset_est_link_info_f
+
+!****s* H5P/h5pset_link_phase_change_f
+! NAME
+!  h5pset_link_phase_change_f
+!
+! PURPOSE
+!  Sets the parameters for conversion between compact and dense groups.
+!
+! INPUTS
+!  
+!  gcpl_id         - Group creation property list identifier  
+!  max_compact     - Maximum number of attributes to be stored in compact storage
+!  min_dense       - Minimum number of attributes to be stored in dense storage
+! OUTPUTS
+!
+!  hdferr          - error code		
+!	              Success:  0
+!	              Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 21, 2008
+!
+! Fortran90 Interface:
+SUBROUTINE h5pset_link_phase_change_f(gcpl_id, max_compact, min_dense, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: gcpl_id ! Group creation property list identifier
+    INTEGER, INTENT(IN) :: max_compact    ! Maximum number of attributes to be stored in compact storage
+    INTEGER, INTENT(IN) :: min_dense      ! Minimum number of attributes to be stored in dense storage
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+                                          ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_link_phase_change_c(gcpl_id, max_compact, min_dense) &
+            BIND(C,NAME='h5pset_link_phase_change_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: gcpl_id
+         INTEGER, INTENT(IN) :: max_compact
+         INTEGER, INTENT(IN) :: min_dense
+       END FUNCTION h5pset_link_phase_change_c
+    END INTERFACE
+
+    hdferr = h5pset_link_phase_change_c(gcpl_id, max_compact, min_dense)
+  END SUBROUTINE h5pset_link_phase_change_f
+
+!****s* H5P/h5pset_fapl_direct_f
+! NAME
+!  h5pset_fapl_direct_f
+!
+! PURPOSE
+!  Sets up use of the direct I/O driver.
+!
+! INPUTS
+!  
+!  fapl_id 	- File access property list identifier
+!  alignment 	- Required memory alignment boundary
+!  block_size   - File system block size
+!  cbuf_size 	- Copy buffer size
+! OUTPUTS
+!
+!  hdferr       - error code		
+!                  Success:  0
+!                  Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 21, 2008
+!
+! Fortran90 Interface:
+SUBROUTINE h5pset_fapl_direct_f(fapl_id, alignment, block_size, cbuf_size, hdferr)
+    IMPLICIT NONE  
+    INTEGER(HID_T), INTENT(IN) :: fapl_id     ! File access property list identifier
+    INTEGER(SIZE_T), INTENT(IN) :: alignment  ! Required memory alignment boundary!
+    INTEGER(SIZE_T), INTENT(IN) :: block_size ! File system block size
+    INTEGER(SIZE_T), INTENT(IN) :: cbuf_size  ! Copy buffer size
+    INTEGER, INTENT(OUT) :: hdferr            ! Error code
+                                              ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_fapl_direct_c(fapl_id, alignment, block_size, cbuf_size) &
+            BIND(C,NAME='h5pset_fapl_direct_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: fapl_id 
+         INTEGER(SIZE_T), INTENT(IN) :: alignment
+         INTEGER(SIZE_T), INTENT(IN) :: block_size
+         INTEGER(SIZE_T), INTENT(IN) :: cbuf_size
+       END FUNCTION h5pset_fapl_direct_c
+    END INTERFACE
+
+    hdferr = H5Pset_fapl_direct_c(fapl_id, alignment, block_size, cbuf_size)
+  END SUBROUTINE h5pset_fapl_direct_f
+
+!****s* H5P/h5pget_fapl_direct_f
+! NAME
+!  h5pget_fapl_direct_f
+!
+! PURPOSE
+!  Gets up use of the direct I/O driver.
+!
+! INPUTS
+!  
+!  fapl_id 	- File access property list identifier
+! OUTPUTS
+!
+!  alignment 	- Required memory alignment boundary
+!  block_size   - File system block size
+!  cbuf_size 	- Copy buffer size
+!  hdferr       - error code		
+!                  Success:  0
+!                  Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 21, 2008
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pget_fapl_direct_f(fapl_id, alignment, block_size, cbuf_size, hdferr)
+    IMPLICIT NONE  
+    INTEGER(HID_T), INTENT(IN) :: fapl_id       ! File access property list identifier
+    INTEGER(SIZE_T), INTENT(OUT) :: alignment   ! Required memory alignment boundary!
+    INTEGER(SIZE_T), INTENT(OUT) :: block_size  ! File system block size
+    INTEGER(SIZE_T), INTENT(OUT) :: cbuf_size   ! Copy buffer size
+    INTEGER, INTENT(OUT) :: hdferr              ! Error code
+                                                ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_fapl_direct_c(fapl_id, alignment, block_size, cbuf_size) &
+            BIND(C,NAME='h5pget_fapl_direct_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: fapl_id 
+         INTEGER(SIZE_T), INTENT(OUT) :: alignment
+         INTEGER(SIZE_T), INTENT(OUT) :: block_size
+         INTEGER(SIZE_T), INTENT(OUT) :: cbuf_size
+       END FUNCTION h5pget_fapl_direct_c
+    END INTERFACE
+
+    hdferr = H5Pget_fapl_direct_c(fapl_id, alignment, block_size, cbuf_size)
+  END SUBROUTINE h5pget_fapl_direct_f
+
+!****s* H5P/H5Pset_attr_phase_change_f
+! NAME
+!  H5Pset_attr_phase_change_f 
+!
+! PURPOSE
+!  Sets attribute storage phase change thresholds.
+!
+! INPUTS
+!  
+!  ocpl_id - Object (dataset or group) creation property list identifier
+! OUTPUTS
+!  
+!  max_compact     - Maximum number of attributes to be stored in compact storage
+!                    (Default: 8)
+!  min_dense       - Minimum number of attributes to be stored in dense storage
+!                    (Default: 6)
+!  hdferr          - Error code		
+!	              Success:  0
+!	              Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  January, 2008
+!
+! Fortran90 Interface:
+SUBROUTINE h5pset_attr_phase_change_f(ocpl_id, max_compact, min_dense, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: ocpl_id ! Object (dataset or group) creation property list identifier
+    INTEGER, INTENT(IN) :: max_compact    ! Maximum number of attributes to be stored in compact storage
+                                          !(Default: 8)
+    INTEGER, INTENT(IN) :: min_dense      ! Minimum number of attributes to be stored in dense storage
+                                          ! (Default: 6)
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+                                          ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_attr_phase_change_c(ocpl_id, max_compact, min_dense) &
+            BIND(C,NAME='h5pset_attr_phase_change_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: ocpl_id
+         INTEGER, INTENT(IN) :: max_compact
+         INTEGER, INTENT(IN) :: min_dense
+
+       END FUNCTION h5pset_attr_phase_change_c
+    END INTERFACE
+
+    hdferr = h5pset_attr_phase_change_c(ocpl_id, max_compact, min_dense)
+
+
+  END SUBROUTINE h5pset_attr_phase_change_f
+
+!****s* H5P/H5Pset_nbit_f
+! NAME
+!  H5Pset_nbit_f 
+!
+! PURPOSE
+!  Sets up the use of the N-Bit filter.
+!
+! Inputs:
+!  plist_id - Dataset creation property list identifier.
+!
+! Outputs:
+!  hdferr   - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 21, 2008
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_nbit_f(plist_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN)  :: plist_id
+    INTEGER       , INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION H5Pset_nbit_c(plist_id) &
+            BIND(C,NAME='h5pset_nbit_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+       END FUNCTION H5Pset_nbit_c
+    END INTERFACE
+
+    hdferr = H5Pset_nbit_c(plist_id)
+
+  END SUBROUTINE h5pset_nbit_f
+
+!****s* H5P/h5pset_scaleoffset_f
+! NAME
+!  h5pset_scaleoffset_f 
+!
+! PURPOSE
+!  Sets up the use of the scale-offset filter.
+!
+! Inputs:
+!  plist_id     - Dataset creation property list identifier.
+!  scale_type   - Flag indicating compression method. Valid values:
+!                    H5Z_SO_FLOAT_DSCALE_F
+!                    H5Z_SO_FLOAT_ESCALE_F
+!                    H5Z_SO_INT_F
+!
+!  scale_factor - Parameter related to scale.
+!
+! Outputs:
+!  hdferr       - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 21, 2008
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_scaleoffset_f(plist_id, scale_type, scale_factor, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN)  :: plist_id
+    INTEGER       , INTENT(IN)  :: scale_type
+    INTEGER       , INTENT(IN)  :: scale_factor
+    INTEGER       , INTENT(OUT) :: hdferr
+!***** 
+
+    INTERFACE
+       INTEGER FUNCTION h5pset_scaleoffset_c(plist_id, scale_type, scale_factor) &
+            BIND(C,NAME='h5pset_scaleoffset_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: plist_id
+         INTEGER, INTENT(IN) :: scale_type
+         INTEGER, INTENT(IN) :: scale_factor
+       END FUNCTION h5pset_scaleoffset_c
+    END INTERFACE
+
+    hdferr = H5Pset_scaleoffset_c(plist_id, scale_type, scale_factor)
+
+  END SUBROUTINE h5pset_scaleoffset_f
+
+!****s* H5P/h5pset_nlinks_f 
+! NAME
+!  h5pset_nlinks_f 
+!
+! PURPOSE
+!  Sets maximum number of soft or user-defined link traversals.
+!
+! INPUTS
+! 
+!  lapl_id - File access property list identifier
+!   nlinks - Maximum number of links to traverse
+!
+! OUTPUTS
+!
+!  hdferr  - Error code
+!             Success:  0
+!  	      Failure: -1
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 24, 2008
+!
+! HISTORY
+!
+! 
+! Fortran90 Interface:
+  SUBROUTINE h5pset_nlinks_f(lapl_id, nlinks, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: lapl_id ! File access property list identifier
+    INTEGER(SIZE_T), INTENT(IN) :: nlinks ! Maximum number of links to traverse
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code   
+                                          ! 0 on success and -1 on failure
+!*****     
+    INTERFACE
+       INTEGER FUNCTION h5pset_nlinks_c(lapl_id, nlinks) &
+            BIND(C,NAME='h5pset_nlinks_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: lapl_id
+         INTEGER(SIZE_T), INTENT(IN) :: nlinks
+       END FUNCTION h5pset_nlinks_c
+    END INTERFACE
+
+    hdferr = h5pset_nlinks_c(lapl_id, nlinks)
+
+  END SUBROUTINE h5pset_nlinks_f
+
+!****s* H5P/h5pget_nlinks_f 
+! NAME
+!  h5pget_nlinks_f 
+!
+! PURPOSE
+!  Gets maximum number of soft or user-defined link traversals.
+!
+! INPUTS
+! 
+!  lapl_id - File access property list identifier
+!  nlinks  - Maximum number of links to traverse
+!
+! OUTPUTS
+!
+!  hdferr  - error code
+!             Success:  0
+!  	      Failure: -1
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 24, 2008
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pget_nlinks_f(lapl_id, nlinks, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: lapl_id  ! File access property list identifier
+    INTEGER(SIZE_T), INTENT(OUT) :: nlinks ! Maximum number of links to traverse
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+                                           ! 0 on success and -1 on failure
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_nlinks_c(lapl_id, nlinks) &
+            BIND(C,NAME='h5pget_nlinks_c')
+         IMPORT :: HID_T, SIZE_T 
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: lapl_id
+         INTEGER(SIZE_T), INTENT(OUT) :: nlinks
+       END FUNCTION h5pget_nlinks_c
+    END INTERFACE
+
+    hdferr = h5pget_nlinks_c(lapl_id, nlinks)
+
+  END SUBROUTINE h5pget_nlinks_f
+
+!****s* H5P/H5Pget_create_inter_group_f
+! NAME
+!  H5Pget_create_inter_group_f
+!
+! PURPOSE
+!  Determines whether property is set to enable creating missing intermediate groups.
+!
+! INPUTS
+!  
+!  lcpl_id            - Link creation property list identifier
+!  crt_intermed_group - Specifying whether to create intermediate groups upon 
+!                       the creation of an object
+! OUTPUTS
+!
+!  hdferr	      - Error code		
+!  		 	 Success:  0
+!  		 	 Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  April 4, 2008
+!
+! HISTORY
+! 	
+! The long subroutine name (>31) on older f90 compilers causes problems
+!          so the name was shortened
+! Fortran90 Interface:
+  SUBROUTINE h5pget_create_inter_group_f(lcpl_id, crt_intermed_group, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: lcpl_id      ! Link creation property list identifier
+    INTEGER, INTENT(IN) :: crt_intermed_group  ! Flag specifying whether to create intermediate groups
+                                               ! upon creation of an object
+    INTEGER, INTENT(OUT) :: hdferr             ! Error code
+                                               ! 0 on success and -1 on failure
+!***** 
+    INTERFACE
+       INTEGER FUNCTION h5pget_create_inter_group_c(lcpl_id, crt_intermed_group) &
+            BIND(C,NAME='h5pget_create_inter_group_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: lcpl_id
+         INTEGER, INTENT(IN) :: crt_intermed_group
+       END FUNCTION h5pget_create_inter_group_c
+    END INTERFACE
+
+    hdferr = h5pget_create_inter_group_c(lcpl_id, crt_intermed_group)
+
+  END SUBROUTINE h5pget_create_inter_group_f
+
+!****s* H5P/H5Pset_chunk_cache_f
+! NAME
+!  H5Pset_chunk_cache_f
+!
+! PURPOSE
+!  Set the number of objects in the meta data cache and the
+!  maximum number of chunks and bytes in the raw data chunk cache.
+!  Once set, these values will override the values in the file access
+!  property list.  Each of these values can be individually unset
+!  (or not set at all) by passing the macros:
+!    H5D_CHUNK_CACHE_NSLOTS_DFLT_F,
+!    H5D_CHUNK_CACHE_NBYTES_DFLT_F, and/or
+!    H5D_CHUNK_CACHE_W0_DFLT_F
+!    as appropriate.
+!
+!  The RDCC_W0 value should be between 0 and 1 inclusive and
+!  indicates how much chunks that have been fully read or fully
+!  written are favored for preemption.  A value of zero means
+!  fully read or written chunks are treated no differently than
+!  other chunks (the preemption is strictly LRU) while a value
+!  of one means fully read chunks are always preempted before
+!  other chunks.
+!
+! INPUTS
+!  
+!  dapl_id          - Dataset access property list identifier.
+!  rdcc_nslots      - The number of chunk slots in the raw data chunk cache for this dataset.
+!  rdcc_nbytes      - The total size of the raw data chunk cache for this dataset.
+!  rdcc_w0          - The chunk preemption policy for this dataset.
+! OUTPUTS
+!
+!  hdferr	    - Error code		
+!  		 	Success:  0
+!  		 	Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  April 13, 2009
+!
+! HISTORY
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pset_chunk_cache_f(dapl_id, rdcc_nslots, rdcc_nbytes, rdcc_w0, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dapl_id      ! Dataset access property list identifier.
+    INTEGER(SIZE_T), INTENT(IN) :: rdcc_nslots ! The number of chunk slots in the raw data 
+                                               ! chunk cache for this dataset.
+    INTEGER(SIZE_T), INTENT(IN) :: rdcc_nbytes ! The total size of the raw data chunk cache 
+                                               ! for this dataset.
+    REAL, INTENT(IN) :: rdcc_w0                ! The chunk preemption policy for this dataset.
+    INTEGER, INTENT(OUT) :: hdferr             ! Error code
+                                               ! 0 on success and -1 on failure
+!*****       
+
+    INTERFACE
+       INTEGER FUNCTION h5pset_chunk_cache_c(dapl_id, rdcc_nslots, rdcc_nbytes, rdcc_w0) &
+            BIND(C,NAME='h5pset_chunk_cache_c')
+         IMPORT :: HID_T, SIZE_T 
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dapl_id
+         INTEGER(SIZE_T), INTENT(IN) :: rdcc_nslots
+         INTEGER(SIZE_T), INTENT(IN) :: rdcc_nbytes
+         REAL, INTENT(IN) :: rdcc_w0
+       END FUNCTION h5pset_chunk_cache_c
+    END INTERFACE
+
+    hdferr = h5pset_chunk_cache_c(dapl_id, rdcc_nslots, rdcc_nbytes, rdcc_w0)
+
+  END SUBROUTINE h5pset_chunk_cache_f
+
+!****s* H5P/H5Pget_chunk_cache_f
+! NAME
+!  H5Pget_chunk_cache_f
+!
+! PURPOSE
+!  Retrieves the maximum possible number of elements in the meta
+!  data cache and the maximum possible number of elements and
+!  bytes and the RDCC_W0 value in the raw data chunk cache.  Any
+!  (or all) arguments may be null pointers in which case the
+!  corresponding datum is not returned.  If these properties have
+!  not been set on this property list, the default values for a
+!  file access property list are returned.
+!
+! INPUTS
+!  
+!  dapl_id            - Dataset access property list identifier.
+! OUTPUTS
+! 
+!  rdcc_nslots        - Number of chunk slots in the raw data chunk cache hash table. 
+!  rdcc_nbytes        - Total size of the raw data chunk cache, in bytes. 
+!  rdcc_w0            - Preemption policy. 
+!  hdferr	      - Error code		
+!  		 	 Success:  0
+!  		 	 Failure: -1   
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  April 13, 2009
+!
+! HISTORY
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pget_chunk_cache_f(dapl_id, rdcc_nslots, rdcc_nbytes, rdcc_w0, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dapl_id       ! Dataset access property list identifier.
+    INTEGER(SIZE_T), INTENT(OUT) :: rdcc_nslots ! Number of chunk slots in the raw data chunk cache hash table.
+    INTEGER(SIZE_T), INTENT(OUT) :: rdcc_nbytes ! Total size of the raw data chunk cache, in bytes. 
+    REAL, INTENT(OUT) :: rdcc_w0                ! Preemption policy.
+    INTEGER, INTENT(OUT) :: hdferr              ! Error code:
+                                                ! 0 on success and -1 on failure
+!*****    
+    INTERFACE
+       INTEGER FUNCTION h5pget_chunk_cache_c(dapl_id, rdcc_nslots, rdcc_nbytes, rdcc_w0) &
+            BIND(C,NAME='h5pget_chunk_cache_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dapl_id
+         INTEGER(SIZE_T), INTENT(OUT) :: rdcc_nslots
+         INTEGER(SIZE_T), INTENT(OUT) :: rdcc_nbytes
+         REAL, INTENT(OUT) :: rdcc_w0
+       END FUNCTION h5pget_chunk_cache_c
+    END INTERFACE
+
+    hdferr = h5pget_chunk_cache_c(dapl_id, rdcc_nslots, rdcc_nbytes, rdcc_w0)
+
+  END SUBROUTINE h5pget_chunk_cache_f
+
+!
+!****s* H5P (F03)/h5pset_fill_value_f_F90
+!
+! NAME
+!  h5pset_fill_value_f
+!
+! PURPOSE
+!  Sets fill value for a dataset creation property list
+!
+! Inputs:
+!  prp_id    - Property list identifier
+!  type_id   - Datatype identifier of fill value datatype (in memory)
+!  fillvalue - Fillvalue
+!
+! Outputs:
+!  hdferr    - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001
+!
+!  Added the recommended way of passing fillvalue
+!  and that is by passing the C address, all other
+!  ways are obsolete and should be avoided. June, 2008 MSB
+!
+! NOTES
+!  h5pset(get)fill_value_f function is overloaded to support
+!  INTEGER, REAL, DOUBLE PRECISION and CHARACTER dtatypes.
+!
+! Fortran90 Interface:
+!!  SUBROUTINE h5pset_fill_value_f(prp_id, type_id, fillvalue, hdferr) 
+!!    IMPLICIT NONE
+!!    INTEGER(HID_T), INTENT(IN)  :: prp_id
+!!    INTEGER(HID_T), INTENT(IN)  :: type_id
+!!    TYPE(VOID)    , INTENT(IN)  :: fillvalue
+!!    INTEGER       , INTENT(OUT) :: hdferr
+!*****
+
+
+  SUBROUTINE h5pset_fill_value_integer(prp_id, type_id, fillvalue, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
+    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
+                                          ! of fillvalue datatype
+                                          ! (in memory)
+    INTEGER, INTENT(IN), TARGET :: fillvalue   ! Fillvalue
+    INTEGER, INTENT(OUT) :: hdferr  ! Error code
+    TYPE(C_PTR) :: f_ptr ! C address
+
+    f_ptr = C_LOC(fillvalue)
+
+    hdferr = h5pset_fill_value_c(prp_id, type_id, f_ptr)
+
+  END SUBROUTINE h5pset_fill_value_integer
+!
+!****s* H5P (F03)/h5pget_fill_value_f_F90
+!
+! NAME
+!  h5pget_fill_value_f
+!
+! PURPOSE
+!  Gets fill value for a dataset creation property list
+!
+! Inputs:
+!  prp_id    - Property list identifier
+!  type_id   - Datatype identifier of fill value datatype (in memory)
+!
+! Outputs:
+!  fillvalue - Fillvalue
+!  hdferr    - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001
+!
+!  Added the recommended way of passing fillvalue
+!  and that is by passing the C address, all other
+!  ways are obsolete and should be avoided. June, 2008 MSB
+!
+! NOTES
+!  h5pget(get)fill_value_f function is overloaded to support
+!  INTEGER, REAL, DOUBLE PRECISION and CHARACTER dtatypes.
+!
+! Fortran90 Interface:
+!!  SUBROUTINE h5pget_fill_value_f(prp_id, type_id, fillvalue, hdferr)
+!!    INTEGER(HID_T), INTENT(IN)  :: prp_id 
+!!    INTEGER(HID_T), INTENT(IN)  :: type_id
+!!    TYPE(VOID)    , INTENT(OUT) :: fillvalue
+!!    INTEGER       , INTENT(OUT) :: hdferr
+!*****
+
+  SUBROUTINE h5pget_fill_value_integer(prp_id, type_id, fillvalue, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
+    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
+                                          ! of fillvalue datatype
+                                          ! (in memory)
+    INTEGER, INTENT(OUT), TARGET :: fillvalue ! Fillvalue
+    INTEGER, INTENT(OUT) :: hdferr            ! Error code
+    TYPE(C_PTR) :: f_ptr                      ! C address
+
+    f_ptr = C_LOC(fillvalue)
+
+    hdferr = h5pget_fill_value_c(prp_id, type_id, f_ptr)
+
+  END SUBROUTINE h5pget_fill_value_integer
+
+  SUBROUTINE h5pset_fill_value_char(prp_id, type_id, fillvalue, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
+    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
+                                          ! of fillvalue datatype
+                                          ! (in memory)
+    CHARACTER, INTENT(IN), TARGET :: fillvalue ! Fillvalue
+    INTEGER, INTENT(OUT) :: hdferr             ! Error code
+    TYPE(C_PTR) :: f_ptr                       ! C address
+
+    f_ptr = C_LOC(fillvalue)
+    hdferr = h5pset_fill_value_c(prp_id, type_id, f_ptr)
+
+  END SUBROUTINE h5pset_fill_value_char
+
+  SUBROUTINE h5pget_fill_value_char(prp_id, type_id, fillvalue, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
+    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
+                                          ! of fillvalue datatype
+                                          ! (in memory)
+    CHARACTER, INTENT(OUT) :: fillvalue   ! Fillvalue
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+
+    INTEGER :: i
+    CHARACTER(LEN=1), ALLOCATABLE, DIMENSION(:), TARGET :: chr
+    INTEGER :: chr_len
+
+    TYPE(C_PTR) :: f_ptr ! C address
+    ! To resolve Issue #1 outlined in the preamble of this file we
+    ! need to pack the character string into an array.
+
+    chr_len = LEN(fillvalue)
+    ALLOCATE(chr(1:chr_len), STAT=hdferr)
+    IF (hdferr .NE. 0) THEN
+       hdferr = -1
+       RETURN
+    ENDIF
+
+    f_ptr = C_LOC(chr(1)(1:1))
+    hdferr = h5pget_fill_value_c(prp_id, type_id, f_ptr)
+
+    DO i = 1, chr_len
+       fillvalue(i:i) = chr(i)
+    ENDDO
+    DEALLOCATE(chr)
+
+  END SUBROUTINE h5pget_fill_value_char
+!
+!****s* H5P (F03)/h5pset_fill_value_f_F03
+!
+! NAME
+!  h5pset_fill_value_f
+!
+! PURPOSE
+!  Sets fill value for a dataset creation property list
+!
+! Inputs:
+!  prp_id    - Property list identifier
+!  type_id   - Datatype identifier of fill value datatype (in memory)
+!  fillvalue - Fillvalue
+!
+! Outputs:
+!  hdferr    - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001
+!
+!  Added the recommended way of passing fillvalue
+!  and that is by passing the C address, all other
+!  ways are obsolete and should be avoided. June, 2008 MSB
+!
+! NOTES
+!  h5pset(get)fill_value_f function is overloaded to support
+!  INTEGER, REAL, DOUBLE PRECISION and CHARACTER dtatypes.
+!
+! Fortran2003 Interface:
+!!  SUBROUTINE h5pset_fill_value_f(prp_id, type_id, fillvalue, hdferr)
+!!    INTEGER(HID_T), INTENT(IN)  :: prp_id 
+!!    INTEGER(HID_T), INTENT(IN)  :: type_id
+!!    TYPE(C_PTR)   , INTENT(IN)  :: fillvalue
+!!    INTEGER       , INTENT(OUT) :: hdferr
+!*****
+
+  SUBROUTINE h5pset_fill_value_ptr(prp_id, type_id, fillvalue, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id    ! Property list identifier
+    INTEGER(HID_T), INTENT(IN) :: type_id   ! Datatype identifier of
+                                            ! of fillvalue datatype
+                                            ! (in memory)
+    TYPE(C_PTR), INTENT(IN)    :: fillvalue ! Fillvalue
+    INTEGER, INTENT(OUT)       :: hdferr    ! Error code
+
+    hdferr = h5pset_fill_value_c(prp_id, type_id, fillvalue)
+
+  END SUBROUTINE h5pset_fill_value_ptr
+
+!
+!****s* H5P (F03)/h5pget_fill_value_f_F03
+!
+! NAME
+!  h5pget_fill_value_f
+!
+! PURPOSE
+!  Gets fill value for a dataset creation property list
+!
+! Inputs:
+!  prp_id    - Property list identifier
+!  type_id   - Datatype identifier of fill value datatype (in memory)
+!
+! Outputs:
+!  fillvalue - Fillvalue
+!  hdferr    - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 14, 2001
+!
+!  Added the recommended way of passing fillvalue
+!  and that is by passing the C address, all other
+!  ways are obsolete and should be avoided. June, 2008 MSB
+!
+! NOTES
+!  h5pget(get)fill_value_f function is overloaded to support
+!  INTEGER, REAL, DOUBLE PRECISION and CHARACTER dtatypes.
+!
+! Fortran2003 Interface:
+!!  SUBROUTINE h5pget_fill_value_f(prp_id, type_id, fillvalue, hdferr)
+!!    INTEGER(HID_T), INTENT(IN)  :: prp_id 
+!!    INTEGER(HID_T), INTENT(IN)  :: type_id
+!!    TYPE(C_PTR)   , INTENT(OUT) :: fillvalue
+!!    INTEGER       , INTENT(OUT) :: hdferr
+!*****
+
+  SUBROUTINE h5pget_fill_value_ptr(prp_id, type_id, fillvalue, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
+    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
+                                          ! of fillvalue datatype
+                                          ! (in memory)
+    TYPE(C_PTR), INTENT(OUT) :: fillvalue ! Fillvalue
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+
+    hdferr = h5pget_fill_value_c(prp_id, type_id, fillvalue)
+
+  END SUBROUTINE h5pget_fill_value_ptr
+
+!
+!****s* H5P (F03)/h5pset_f_F90
+!
+! NAME
+!  h5pset_f
+!
+! PURPOSE
+!  Sets a property list value
+!
+! Inputs:
+!  prp_id  - Property list identifier to modify
+!  name    - Name of property to modify
+!  value   - Property value, supported types are:
+!             INTEGER
+!             REAL
+!             DOUBLE PRECISION
+!             CHARACTER(LEN=*)
+! Outputs:
+!  hdferr  - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 9, 2002
+!
+! Fortran90 Interface:
+!!  SUBROUTINE h5pset_f(plid, name, value, hdferr)
+!!    INTEGER(HID_T)  , INTENT(IN)  :: plid
+!!    CHARACTER(LEN=*), INTENT(IN)  :: name
+!!    TYPE            , INTENT(IN)  :: value
+!!    INTEGER         , INTENT(OUT) :: hdferr
+!*****
+  SUBROUTINE h5pset_integer(prp_id, name, value, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id   ! Property list identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of property to modify
+    INTEGER,   INTENT(IN), TARGET :: value ! Property value
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+
+    INTEGER :: name_len
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(value)
+
+    name_len = LEN(name)
+    hdferr = h5pget_c(prp_id, name, name_len, f_ptr)
+
+  END SUBROUTINE h5pset_integer
+
+  SUBROUTINE h5pset_char(prp_id, name, value, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id    ! Property list identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name    ! Name of property to modify
+    CHARACTER(LEN=*),   INTENT(IN) :: value ! Property value
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+    INTEGER :: name_len
+
+    INTEGER :: i
+    CHARACTER(LEN=1), ALLOCATABLE, DIMENSION(:), TARGET :: chr
+    INTEGER :: chr_len
+
+    TYPE(C_PTR) :: f_ptr
+    ! To resolve Issue #1 outlined in the preamble of this file we
+    ! need to pack the character string into an array.
+
+    chr_len = LEN(value)
+    ALLOCATE(chr(1:chr_len), STAT=hdferr)
+    IF (hdferr .NE. 0) THEN
+       hdferr = -1
+       RETURN
+    ENDIF
+
+    DO i = 1, chr_len
+       chr(i) = value(i:i)
+    ENDDO
+
+    f_ptr = C_LOC(chr(1)(1:1))
+
+    name_len = LEN(name)
+    hdferr = h5pget_c(prp_id, name, name_len, f_ptr)
+
+    DEALLOCATE(chr)
+
+  END SUBROUTINE h5pset_char
+!
+!****s* H5P (F03)/h5pget_f_F90
+!
+! NAME
+!  h5pget_f
+!
+! PURPOSE
+!  Queries the value of a property.
+!
+! Inputs:
+!  prp_id  - Property list identifier to modify
+!  name    - Name of property to get
+!  value   - Property value, supported types are:
+!             INTEGER
+!             REAL
+!             DOUBLE PRECISION
+!             CHARACTER(LEN=*)
+! Outputs:
+!  hdferr  - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 9, 2002
+!
+! Fortran90 Interface:
+!!  SUBROUTINE h5pget_f(plid, name, value, hdferr)
+!!    INTEGER(HID_T)  , INTENT(IN)  :: plid
+!!    CHARACTER(LEN=*), INTENT(IN)  :: name
+!!    TYPE            , INTENT(OUT) :: value
+!!    INTEGER         , INTENT(OUT) :: hdferr
+!*****
+
+  SUBROUTINE h5pget_integer(prp_id, name, value, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id    ! Property list identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name    ! Name of property to modify
+    INTEGER,   INTENT(OUT), TARGET :: value ! Property value
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+    INTEGER :: name_len
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(value)
+
+    name_len = LEN(name)
+    hdferr = h5pget_c(prp_id, name, name_len, f_ptr)
+
+  END SUBROUTINE h5pget_integer
+
+  SUBROUTINE h5pget_char(prp_id, name, value, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id   ! Property list identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of property to modify
+    CHARACTER(LEN=*), INTENT(OUT) :: value ! Property value
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+    INTEGER :: name_len
+
+    INTEGER :: i
+    CHARACTER(LEN=1), ALLOCATABLE, DIMENSION(:), TARGET :: chr
+    INTEGER :: chr_len
+    TYPE(C_PTR) :: f_ptr
+
+    chr_len = LEN(value)
+    ALLOCATE(chr(1:chr_len), STAT=hdferr)
+    IF (hdferr .NE. 0) THEN
+       hdferr = -1
+       RETURN
+    ENDIF
+    f_ptr = C_LOC(chr(1)(1:1))
+
+    name_len = LEN(name)
+    hdferr = h5pget_c(prp_id, name, name_len, f_ptr)
+
+    DO i = 1, chr_len
+       value(i:i) = chr(i)
+    ENDDO
+
+    DEALLOCATE(chr)
+
+  END SUBROUTINE h5pget_char
+
+!
+!****s* H5P (F03)/h5pset_f_F03
+!
+! NAME
+!  h5pset_f
+!
+! PURPOSE
+!  Sets a property list value
+!
+! Inputs:
+!  prp_id  - Property list identifier to modify
+!  name    - Name of property to modify
+!  value   - Pointer to value to set the property to
+! Outputs:
+!  hdferr  - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 9, 2002
+!
+! Fortran2003 Interface:
+!!  SUBROUTINE h5pset_f(plid, name, value, hdferr)
+!!    INTEGER(HID_T)  , INTENT(IN)  :: plid
+!!    CHARACTER(LEN=*), INTENT(IN)  :: name
+!!    TYPE(C_PTR)     , INTENT(IN)  :: value
+!!    INTEGER         , INTENT(OUT) :: hdferr
+!*****
+  SUBROUTINE h5pset_ptr(prp_id, name, value, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to modify
+    TYPE(C_PTR), INTENT(IN) :: value      ! Property value
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+    INTEGER :: name_len
+
+    name_len = LEN(name)
+    hdferr = h5pset_c(prp_id, name, name_len, value)
+
+  END SUBROUTINE h5pset_ptr
+!
+!****s* H5P (F03)/h5pget_f_F03
+!
+! NAME
+!  h5pget_f (F03)
+!
+! PURPOSE
+!  Queries the value of a property.
+!
+! Inputs:
+!  prp_id  - Property list identifier to modify
+!  name    - Name of property to get
+!  value   - Pointer to a location to which to copy the value of of the property
+! Outputs:
+!  hdferr  - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 9, 2002
+!
+! Fortran2003 Interface:
+!!  SUBROUTINE h5pget_f(plid, name, value, hdferr)
+!!    INTEGER(HID_T)  , INTENT(IN)  :: plid
+!!    CHARACTER(LEN=*), INTENT(IN)  :: name
+!!    TYPE(C_PTR)     , INTENT(OUT) :: value
+!!    INTEGER         , INTENT(OUT) :: hdferr
+!*****
+  SUBROUTINE h5pget_ptr(prp_id, name, value, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to modify
+    TYPE(C_PTR), INTENT(OUT) :: value     ! Property value
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+    INTEGER :: name_len
+
+    name_len = LEN(name)
+    hdferr = h5pget_c(prp_id, name, name_len, value)
+
+  END SUBROUTINE h5pget_ptr
+!
+!****s* H5P (F03)/h5pregister_f_F90
+!
+! NAME
+!  h5pregister
+!
+! PURPOSE
+!  Registers a permanent property with a property list class.
+!
+! Inputs:
+!  class  - Property list class identifier
+!  name   - Name of property to register
+!  size   - Size of the property value
+!  value  - Property value, supported types are:
+!             INTEGER
+!             REAL
+!             DOUBLE PRECISION
+!             CHARACTER(LEN=*)
+!
+! Outputs:
+!  hdferr - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 10, 2002
+!
+! Fortran90 Interface:
+!!  SUBROUTINE h5pregister_f(class, name, size, value, hdferr)
+!!    INTEGER(HID_T)  , INTENT(IN)  :: class
+!!    CHARACTER(LEN=*), INTENT(IN)  :: name
+!!    INTEGER(SIZE_T) , INTENT(IN)  :: size
+!!    TYPE            , INTENT(IN)  :: value
+!!    INTEGER         , INTENT(OUT) :: hdferr  
+!*****
+  SUBROUTINE h5pregister_integer(class, name, size, value, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: class    ! Property list class identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of property to register
+    INTEGER(SIZE_T), INTENT(IN) :: size    ! Size of the property value
+    INTEGER,   INTENT(IN), TARGET :: value ! Property value
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+    INTEGER :: name_len
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(value)
+
+    name_len = LEN(name)
+    hdferr = h5pregister_c(class, name, name_len, size, f_ptr)
+
+  END SUBROUTINE h5pregister_integer
+
+
+  SUBROUTINE h5pregister_char(class, name, size, value, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: class     ! Property list class identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name    ! Name of property to register
+    INTEGER(SIZE_T), INTENT(IN) :: size     ! size of the property value
+    CHARACTER(LEN=*),   INTENT(IN) :: value ! Property value
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+    INTEGER :: name_len
+
+    INTEGER :: i
+    CHARACTER(LEN=1), ALLOCATABLE, DIMENSION(:), TARGET :: chr
+    INTEGER :: chr_len
+
+    TYPE(C_PTR) :: f_ptr
+    ! To resolve Issue #1 outlined in the preamble of this file we
+    ! need to pack the character string into an array.
+
+    chr_len = LEN(value)
+    ALLOCATE(chr(1:chr_len), STAT=hdferr)
+    IF (hdferr .NE. 0) THEN
+       hdferr = -1
+       RETURN
+    ENDIF
+
+    DO i = 1, chr_len
+       chr(i) = value(i:i)
+    ENDDO
+
+    f_ptr = C_LOC(chr(1)(1:1))
+
+    name_len = LEN(name)
+    hdferr = h5pregister_c(class, name, name_len, size, f_ptr)
+    DEALLOCATE(chr)
+  END SUBROUTINE h5pregister_char
+!
+!****s* H5P (F03)/h5pregister_f_F03
+!
+! NAME
+!  h5pregister (F03)
+!
+! PURPOSE
+!  Registers a permanent property with a property list class.
+!
+! Inputs:
+!  class  - Property list class identifier
+!  name   - Name of property to register
+!  size   - Size of the property value
+!  value  - Pointer to value to set the property to
+!
+! Outputs:
+!  hdferr - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  June 24, 2008
+!
+! Fortran2003 Interface:
+!!  SUBROUTINE h5pregister_f(class, name, size, value, hdferr)
+!!    INTEGER(HID_T)  , INTENT(IN)  :: class
+!!    CHARACTER(LEN=*), INTENT(IN)  :: name
+!!    INTEGER(SIZE_T) , INTENT(IN)  :: size
+!!    TYPE(C_PTR)     , INTENT(IN)  :: value
+!!    INTEGER         , INTENT(OUT) :: hdferr  
+!*****
+
+  SUBROUTINE h5pregister_ptr(class, name, size, value, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: class   ! Property list class identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to register
+    INTEGER(SIZE_T), INTENT(IN) :: size   ! Size of the property value
+    TYPE(C_PTR), INTENT(IN) :: value      ! Property value
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+    INTEGER :: name_len
+
+    name_len = LEN(name)
+    hdferr = h5pregister_c(class, name, name_len, size, value)
+  END SUBROUTINE h5pregister_ptr
+
+!
+!****s* H5P (F03)/h5pinsert_f_F90
+!
+! NAME
+!  h5pinsert  (f90)
+!
+! PURPOSE
+!  Registers a temporary property with a property list class.
+!
+! Inputs:
+!  plist  - Property list class identifier
+!  name   - Name of property to insert
+!  size   - Size of the property value
+!  value  - Property value, supported types are:
+!             INTEGER
+!             REAL
+!             DOUBLE PRECISION
+!             CHARACTER(LEN=*)
+! Outputs:
+!  hdferr - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  October 10, 2002
+!
+! Fortran90 Interface:
+!!  SUBROUTINE h5pinsert_f
+!!    INTEGER(HID_T)  , INTENT(IN)  :: plist
+!!    CHARACTER(LEN=*), INTENT(IN)  :: name
+!!    INTEGER(SIZE_T) , INTENT(IN)  :: size
+!!    TYPE            , INTENT(IN)  :: value
+!!    INTEGER         , INTENT(OUT) :: hdferr
+!*****
+  SUBROUTINE h5pinsert_integer(plist, name, size, value, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist    ! Property list identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of property to insert
+    INTEGER(SIZE_T), INTENT(IN) :: size    ! Size of the property value
+    INTEGER,   INTENT(IN), TARGET :: value ! Property value
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+    INTEGER :: name_len
+    TYPE(c_ptr) :: f_ptr
+
+    f_ptr = c_loc(value)
+
+    name_len = LEN(name)
+    hdferr = h5pinsert_c(plist, name , name_len, size, f_ptr)
+  END SUBROUTINE h5pinsert_integer
+
+  SUBROUTINE h5pinsert_char(plist, name, size, value, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist      ! Property list identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name     ! Name of property to insert
+    INTEGER(SIZE_T), INTENT(IN) :: size      ! Size of property value
+    CHARACTER(LEN=*),   INTENT(IN) :: value  ! Property value
+    INTEGER, INTENT(OUT) :: hdferr           ! Error code
+    INTEGER :: name_len
+
+    INTEGER :: i
+    CHARACTER(LEN=1), ALLOCATABLE, DIMENSION(:), TARGET :: chr
+    INTEGER :: chr_len
+
+    TYPE(c_ptr) :: f_ptr
+    ! To resolve Issue #1 outlined in the preamble of this file we
+    ! need to pack the character string into an array.
+
+    chr_len = LEN(value)
+    ALLOCATE(chr(1:chr_len), STAT=hdferr)
+    IF (hdferr .NE. 0) THEN
+       hdferr = -1
+       RETURN
+    ENDIF
+
+    DO i = 1, chr_len
+       chr(i) = value(i:i)
+    ENDDO
+
+    f_ptr = C_LOC(chr(1)(1:1))
+
+    name_len = LEN(name)
+    hdferr = h5pinsert_c(plist, name , name_len, size, f_ptr)
+
+    DEALLOCATE(chr)
+
+  END SUBROUTINE h5pinsert_char
+
+!
+!****s* H5P (F03)/h5pinsert_f_F03
+!
+! NAME
+!  h5pinsert  (f03)
+!
+! PURPOSE
+!  Registers a temporary property with a property list class.
+!
+! Inputs:
+!  plist  - Property list class identifier
+!  name   - Name of property to insert
+!  size   - Size of the property value
+!  value  - Pointer to new value pointer for the property being modified
+!
+! Outputs:
+!  hdferr - Returns 0 if successful and -1 if fails
+!
+! AUTHOR 
+!  M. Scot Breitenfeld
+!  June 24, 2008
+!
+! Fortran90 Interface:
+!!  SUBROUTINE h5pinsert_f
+!!    INTEGER(HID_T)  , INTENT(IN)  :: plist
+!!    CHARACTER(LEN=*), INTENT(IN)  :: name
+!!    INTEGER(SIZE_T) , INTENT(IN)  :: size
+!!    TYPE(C_PTR)     , INTENT(IN)  :: value
+!!    INTEGER         , INTENT(OUT) :: hdferr
+!*****
+  SUBROUTINE h5pinsert_ptr(plist, name, size, value, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: plist  ! Property list identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name ! Name of property to insert
+    INTEGER(SIZE_T), INTENT(IN) :: size  ! Size of property value
+    TYPE(c_ptr),   INTENT(IN) :: value   ! Property value
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+    INTEGER :: name_len
+
+    name_len = LEN(name)
+    hdferr = h5pinsert_c(plist, name , name_len, size, value)
+  END SUBROUTINE h5pinsert_ptr
+!
+!****s* H5P (F03)/h5pcreate_class_f_F03
+!
+! NAME
+!  h5pcreate_class_f
+!
+! PURPOSE
+!  Create a new property list class
+!
+! Inputs:
+!  parent  - Parent property list class identifier
+!            Possible values include:
+!              H5P_ROOT_F
+!              H5P_FILE_CREATE_F
+!              H5P_FILE_ACCESS_F
+!              H5P_DATASET_CREATE_F
+!              H5P_DATASET_XFER_F
+!              H5P_FILE_MOUNT_F
+!  name    - Name of property to create
+!
+! Outputs:
+!  class   - Property list class identifier
+!  hdferr  - Returns 0 if successful and -1 if fails
+!
+! Optional parameters:
+!  H5P_cls_create_func_t (create) - Callback routine called when a property list is created
+!  create_data 	                  - User pointer to any class creation information needed
+!  H5P_cls_copy_func_t   (copy)   - Callback routine called when a property list is copied
+!  copy_data 	                  - User pointer to any class copy information needed
+!  H5P_cls_close_func_t  (close)  - Callback routine called when a property list is being closed
+!  close_data 	                  - User pointer to any class close information needed
+!
+! AUTHOR
+!  Elena Pourmal
+!  October 9, 2002
+!
+! HISTORY
+!  Added callback arguments
+!  M. Scot Breitenfeld, July 3, 2008
+!
+! Fortran2003 Interface:
+  SUBROUTINE h5pcreate_class_f(parent, name, class, hdferr, create, create_data, &
+       copy, copy_data, CLOSE, close_data)
+    IMPLICIT NONE
+    INTEGER(HID_T)  , INTENT(IN)  :: parent
+    CHARACTER(LEN=*), INTENT(IN)  :: name
+    INTEGER(HID_T)  , INTENT(OUT) :: class
+    INTEGER         , INTENT(OUT) :: hdferr
+    TYPE(C_PTR)     , OPTIONAL    :: create_data, copy_data, close_data
+    TYPE(C_FUNPTR)  , OPTIONAL    :: create, copy, close
+!*****
+    INTEGER :: name_len
+    TYPE(C_PTR) :: create_data_default, copy_data_default, close_data_default
+    TYPE(C_FUNPTR) :: create_default, copy_default, close_default
+    INTERFACE
+       INTEGER FUNCTION h5pcreate_class_c(parent, name, name_len, class, &
+            create, create_data, copy, copy_data, close, close_data) &
+            BIND(C, NAME='h5pcreate_class_c')
+         IMPORT :: c_char, c_ptr, c_funptr
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN) :: parent
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER, INTENT(IN)         :: name_len
+         INTEGER(HID_T), INTENT(OUT) :: class
+         TYPE(C_PTR), VALUE :: create_data, copy_data, close_data
+         TYPE(C_FUNPTR), VALUE :: create, copy, close
+       END FUNCTION h5pcreate_class_c
+    END INTERFACE
+    name_len = LEN(name)
+
+    create_default = c_null_funptr     !fix:scot
+    create_data_default = c_null_ptr
+    copy_default = c_null_funptr    !fix:scot
+    copy_data_default = c_null_ptr
+    close_default = c_null_funptr   !fix:scot
+    close_data_default = c_null_ptr
+
+    IF(PRESENT(create)) create_default = create
+    IF(PRESENT(create_data)) create_data_default = create_data
+    IF(PRESENT(copy)) copy_default = copy
+    IF(PRESENT(copy_data)) copy_data_default = copy_data
+    IF(PRESENT(close)) close_default = close
+    IF(PRESENT(close_data)) close_data_default = close_data
+
+    hdferr = h5pcreate_class_c(parent, name , name_len, class, &
+         create_default, create_data_default, &
+         copy_default, copy_data_default, &
+         close_default, close_data_default)
+
+  END SUBROUTINE h5pcreate_class_f
+
+!
+!****s* H5P (F03)/h5pset_file_image_f_F03
+!
+! NAME
+!  h5pset_file_image_f
+!
+! PURPOSE
+!  Sets an initial file image in a memory buffer.
+!
+! Inputs:
+!  fapl_id - File access property list identifier
+!  buf_ptr - Pointer to the initial file image, 
+!            or C_NULL_PTR if no initial file image is desired
+!  buf_len - Size of the supplied buffer, or 0 (zero) if no initial image is desired
+!
+! Outputs:
+!  hdferr  - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 19, 2012
+!
+! Fortran2003 Interface:
+  SUBROUTINE h5pset_file_image_f(fapl_id, buf_ptr, buf_len, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T) , INTENT(IN)  :: fapl_id
+    TYPE(C_PTR)    , INTENT(IN)  :: buf_ptr
+    INTEGER(SIZE_T), INTENT(IN)  :: buf_len
+    INTEGER        , INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_file_image_c(fapl_id, buf_ptr, buf_len) &
+            BIND(C, NAME='h5pset_file_image_c')
+         IMPORT :: c_ptr
+         IMPORT :: HID_T, SIZE_T
+         INTEGER(HID_T), INTENT(IN) :: fapl_id
+         TYPE(C_PTR), VALUE :: buf_ptr
+         INTEGER(SIZE_T), INTENT(IN)  :: buf_len
+       END FUNCTION h5pset_file_image_c
+    END INTERFACE
+
+    hdferr = h5pset_file_image_c(fapl_id, buf_ptr, buf_len)
+
+  END SUBROUTINE h5pset_file_image_f
+!
+!****s* H5P (F03)/h5pget_file_image_f_F03
+!
+! NAME
+!  h5pget_file_image_f
+!
+! PURPOSE
+!  Retrieves a copy of the file image designated as the initial content and structure of a file. 
+!
+! Inputs:
+!  fapl_id     - File access property list identifier.
+!
+! Outputs:
+!  buf_ptr     - Will hold either a C_NULL_PTR or a scalar of type
+!                c_loc. If buf_ptr is not C_NULL_PTR, on successful
+!                return, buf_ptr shall contain a C pointer to a copy
+!                of the initial image provided in the last call to
+!                H5Pset_file_image_f for the supplied fapl_id, or
+!                buf_ptr shall contain a C_NULL_PTR if there is no
+!                initial image set.
+!
+!  buf_len_ptr - Contains the value of the buffer parameter for
+!                the initial image in the supplied fapl_id. The value
+!                will be 0 if no initial image is set.
+!
+!
+!  hdferr      - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 19, 2012
+!
+! Fortran2003 Interface:
+  SUBROUTINE h5pget_file_image_f(fapl_id, buf_ptr, buf_len_ptr, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T) , INTENT(IN)                :: fapl_id
+    TYPE(C_PTR)    , INTENT(OUT), DIMENSION(*) :: buf_ptr
+    INTEGER(SIZE_T), INTENT(OUT)               :: buf_len_ptr
+    INTEGER        , INTENT(OUT)               :: hdferr
+    
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_file_image_c(fapl_id, buf_ptr, buf_len_ptr) &
+            BIND(C, NAME='h5pget_file_image_c')
+         IMPORT :: c_ptr
+         IMPORT :: HID_T, SIZE_T
+         INTEGER(HID_T), INTENT(IN) :: fapl_id
+         TYPE(C_PTR), DIMENSION(*), INTENT(OUT)  :: buf_ptr
+         INTEGER(SIZE_T), INTENT(OUT)  :: buf_len_ptr
+       END FUNCTION h5pget_file_image_c
+    END INTERFACE
+
+    hdferr = h5pget_file_image_c(fapl_id, buf_ptr, buf_len_ptr)
+
+  END SUBROUTINE h5pget_file_image_f
+
+! *********************************************************************
+! Fortran interfaces for H5P functions needed by parallel MPI programs.
+! *********************************************************************
+
+#ifdef H5_HAVE_PARALLEL
+!****s* H5P/h5pset_fapl_mpio_f
+!
+! NAME
+!  h5pset_fapl_mpio_f
+!
+! PURPOSE
+!  Stores MPI IO communicator information to the file
+!  access property list.
+!
+! INPUTS
+!  prp_id 	 - file access property list identifier
+!  comm 	 - MPI-2 communicator
+!  info 	 - MPI-2 info object
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  November, 2000
+!
+! SOURCE
+  SUBROUTINE h5pset_fapl_mpio_f(prp_id, comm, info, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
+    INTEGER, INTENT(IN) :: comm ! MPI communicator to be used for file open
+                                ! as defined in MPI_FILE_OPEN of MPI-2
+    INTEGER, INTENT(IN) :: info ! MPI info object to be used for file open
+                                ! as defined in MPI_FILE_OPEN of MPI-2
+    INTEGER, INTENT(OUT) :: hdferr ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_fapl_mpio_c(prp_id, comm, info) &
+            BIND(C,NAME='h5pset_fapl_mpio_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: prp_id 
+         INTEGER       , INTENT(IN) :: comm
+         INTEGER       , INTENT(IN) :: info
+       END FUNCTION h5pset_fapl_mpio_c
+    END INTERFACE
+
+    hdferr = h5pset_fapl_mpio_c(prp_id, comm, info)
+
+  END SUBROUTINE h5pset_fapl_mpio_f
+
+!****s* H5P/h5pget_fapl_mpio_f
+!
+! NAME
+!  h5pget_fapl_mpio_f
+!
+! PURPOSE
+!  Returns MPI communicator information.
+!
+! INPUTS
+!  prp_id 	 - file access property list identifier
+! OUTPUTS
+!  comm 	 - MPI-2 communicator
+!  info 	 - MPI-2 info object
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  November, 2000
+!
+! SOURCE
+  SUBROUTINE h5pget_fapl_mpio_f(prp_id, comm, info, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
+    INTEGER, INTENT(OUT) :: comm ! buffer to return communicator
+    INTEGER, INTENT(OUT) :: info ! buffer to return info object
+                                 ! as defined in MPI_FILE_OPEN of MPI-2
+    INTEGER, INTENT(OUT) :: hdferr  ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_fapl_mpio_c(prp_id, comm, info) &
+            BIND(C,NAME='h5pget_fapl_mpio_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN)  :: prp_id 
+         INTEGER       , INTENT(OUT) :: comm
+         INTEGER       , INTENT(OUT) :: info
+       END FUNCTION h5pget_fapl_mpio_c
+    END INTERFACE
+
+    hdferr = h5pget_fapl_mpio_c(prp_id, comm, info)
+
+  END SUBROUTINE h5pget_fapl_mpio_f
+
+!****s* H5P/h5pset_dxpl_mpio_f
+!
+! NAME
+!  h5pset_dxpl_mpio_f
+!
+! PURPOSE
+!  Sets data transfer mode.
+!
+! INPUTS
+!  prp_id 	  - data transfer property list identifier
+!  data_xfer_mode - transfer mode; possible values are:
+!                     H5FD_MPIO_INDEPENDENT_F
+!                     H5FD_MPIO_COLLECTIVE_F
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  November, 2000
+!
+! SOURCE
+  SUBROUTINE h5pset_dxpl_mpio_f(prp_id, data_xfer_mode, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
+    INTEGER, INTENT(IN) :: data_xfer_mode ! Data transfer mode. Possible values are:
+                                          ! H5FD_MPIO_INDEPENDENT_F
+                                          ! H5FD_MPIO_COLLECTIVE_F
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pset_dxpl_mpio_c(prp_id, data_xfer_mode) &
+            BIND(C,NAME='h5pset_dxpl_mpio_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN)  :: prp_id 
+         INTEGER       , INTENT(IN) :: data_xfer_mode
+       END FUNCTION h5pset_dxpl_mpio_c
+    END INTERFACE
+
+    hdferr = h5pset_dxpl_mpio_c(prp_id, data_xfer_mode)
+  END SUBROUTINE h5pset_dxpl_mpio_f
+
+!****s* H5P/h5pget_dxpl_mpio_f
+!
+! NAME
+!  h5pget_dxpl_mpio_f
+!
+! PURPOSE
+!  Returns the data transfer mode.
+!
+! INPUTS
+!  prp_id 	 - data transfer property list identifier
+! OUTPUTS
+!  data_xfer_mode- transfer mode; possible values are:
+!                     H5FD_MPIO_INDEPENDENT_F
+!                     H5FD_MPIO_COLLECTIVE_F
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  November, 2000
+!
+! SOURCE
+  SUBROUTINE h5pget_dxpl_mpio_f(prp_id, data_xfer_mode, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: prp_id   ! Property list identifier
+    INTEGER, INTENT(OUT) :: data_xfer_mode ! Data transfer mode. Possible values are:
+                                           ! H5FD_MPIO_INDEPENDENT_F
+                                           ! H5FD_MPIO_COLLECTIVE_F
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5pget_dxpl_mpio_c(prp_id, data_xfer_mode) &
+            BIND(C,NAME='h5pget_dxpl_mpio_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN)  :: prp_id 
+         INTEGER       , INTENT(OUT) :: data_xfer_mode
+       END FUNCTION h5pget_dxpl_mpio_c
+    END INTERFACE
+
+    hdferr = h5pget_dxpl_mpio_c(prp_id, data_xfer_mode)
+  END SUBROUTINE h5pget_dxpl_mpio_f
+
+!****s* H5P/h5pget_mpio_actual_io_mode_f
+! NAME
+!  h5pget_mpio_actual_io_mode_f
+!
+! PURPOSE
+!  Retrieves the type of I/O that HDF5 actually performed on the last 
+!  parallel I/O call. This is not necessarily the type of I/O requested. 
+!
+! INPUTS
+!  dxpl_id        - Dataset transfer property list identifier.
+! OUTPUTS
+!  actual_io_mode - The type of I/O performed by this process.
+!  hdferr         - Returns 0 if successful and -1 if fails.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  July 27, 2012
+!
+! HISTORY
+!
+! Fortran90 Interface:
+  SUBROUTINE h5pget_mpio_actual_io_mode_f(dxpl_id, actual_io_mode, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN)  :: dxpl_id
+    INTEGER       , INTENT(OUT) :: actual_io_mode
+    INTEGER       , INTENT(OUT) :: hdferr
+!***** 
+    INTERFACE
+       INTEGER FUNCTION h5pget_mpio_actual_io_mode_c(dxpl_id, actual_io_mode) &
+            BIND(C,NAME='h5pget_mpio_actual_io_mode_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN)  :: dxpl_id
+         INTEGER       , INTENT(OUT) :: actual_io_mode
+       END FUNCTION h5pget_mpio_actual_io_mode_c
+    END INTERFACE
+
+    actual_io_mode = -1
+
+    hdferr = h5pget_mpio_actual_io_mode_c(dxpl_id, actual_io_mode)
+
+  END SUBROUTINE h5pget_mpio_actual_io_mode_f
+#endif
+
+END MODULE H5P
+
+
+
diff --git a/fortran/src/H5Pff.f90 b/fortran/src/H5Pff.f90
deleted file mode 100644
index 3409f15..0000000
--- a/fortran/src/H5Pff.f90
+++ /dev/null
@@ -1,6400 +0,0 @@
-!****h* ROBODoc/H5P (F90)
-!
-! NAME
-!  H5P_PROVISIONAL
-!
-! PURPOSE
-!  This file contains Fortran interfaces for H5P functions. It includes
-!  all the functions that are independent on whether the Fortran 2003 functions
-!  are enabled or disabled.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5P function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!*****
-
-MODULE H5P
-
-  USE H5GLOBAL
-  
-  INTERFACE h5pset_fapl_multi_f
-     MODULE PROCEDURE h5pset_fapl_multi_l
-     MODULE PROCEDURE h5pset_fapl_multi_s
-  END INTERFACE
-
-CONTAINS
-
-!****s* H5P/h5pcreate_f 
-! NAME
-!  h5pcreate_f 
-!
-! PURPOSE
-!  Creates a new property as an instance of a property 
-!  list class.
-!
-! INPUTS
-!  class  - type of the property class to be created.
-!	    Possible values are:
-!             H5P_OBJECT_CREATE_F
-!             H5P_FILE_CREATE_F
-!             H5P_FILE_ACCESS_F
-!             H5P_DATASET_CREATE_F
-!             H5P_DATASET_ACCESS_F
-!             H5P_DATASET_XFER_F
-!             H5P_FILE_MOUNT_F
-!             H5P_GROUP_CREATE_F
-!             H5P_GROUP_ACCESS_F
-!             H5P_DATATYPE_CREATE_F
-!             H5P_DATATYPE_ACCESS_F
-!             H5P_STRING_CREATE_F
-!             H5P_ATTRIBUTE_CREATE _F
-!             H5P_OBJECT_COPY_F
-!             H5P_LINK_CREATE_F
-!             H5P_LINK_ACCESS_F
-!
-! OUTPUTS
-!  prp_id - property list identifier
-!  hdferr - error code		
-!	     Success:  0
-!	     Failure: -1 
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pcreate_f(class, prp_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN)  :: class
-    INTEGER(HID_T), INTENT(OUT) :: prp_id
-    INTEGER       , INTENT(OUT) :: hdferr
-!*****
-!            INTEGER, EXTERNAL :: h5pcreate_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pcreate_c(class, prp_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PCREATE_C'::h5pcreate_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: class
-         INTEGER(HID_T), INTENT(OUT) :: prp_id
-       END FUNCTION h5pcreate_c
-    END INTERFACE
-
-    hdferr = h5pcreate_c(class, prp_id) 
-  END SUBROUTINE h5pcreate_f
-
-!****s* H5P/h5pset_preserve_f 
-! NAME
-!   h5pset_preserve_f 
-!
-! PURPOSE
-!  Sets the dataset transfer property list status to 
-!  TRUE or FALSE for initializing compound datatype
-!  members during write/read operations.
-!
-! INPUTS
-!  prp_id	- property list identifier
-!  flag		- status flag
-!
-! OUTPUTS
-!  hdferr	- Returns 0 if successful and -1 if fails
-!
-! OPTIONAL PARAMETERS
-!  NONE
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!                       
-!  Datatype of the flag parameter is changed from 
-!  INTEGER to LOGICAL June 4, 2003
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_preserve_f(prp_id, flag, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    LOGICAL, INTENT(IN) ::  flag         ! TRUE/FALSE flag to set the dataset
-                                         ! transfer property for partila writing/reading
-                                         ! compound datatype
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-    INTEGER :: flag_c
-
-!            INTEGER, EXTERNAL :: h5pset_preserve_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_preserve_c(prp_id, flag_c)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_PRESERVE_C'::h5pset_preserve_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER ::  flag_c
-       END FUNCTION h5pset_preserve_c
-    END INTERFACE
-    flag_c = 0
-    IF(flag) flag_c = 1
-    hdferr = h5pset_preserve_c(prp_id, flag_c) 
-  END SUBROUTINE h5pset_preserve_f
-
-!****s* H5P/h5pget_preserve_f 
-! NAME
-!  h5pget_preserve_f 
-!
-! PURPOSE
-!  Checks status of the dataset transfer property list.
-!
-! INPUTS
-!  prp_id  - property list identifier
-!
-! OUTPUTS
-!  flag	   - status flag
-!  hdferr  - error code		
-!	Success:  0
-!	Failure: -1
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001
-! 
-!  Datatype of the flag parameter is changed from 
-!  INTEGER to LOGICAL 
-!  June 4, 2003 
-! 
-! Fortran90 Interface:
-  SUBROUTINE h5pget_preserve_f(prp_id, flag, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    LOGICAL, INTENT(OUT) ::  flag        ! TRUE/FALSE flag. Shows status of the dataset's
-                                         ! transfer property for partial writing/reading
-                                         ! compound datatype
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-    INTEGER :: flag_c
-
-!            INTEGER, EXTERNAL :: h5pget_preserve_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_preserve_c(prp_id, flag_c)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_PRESERVE_C'::h5pget_preserve_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER ::  flag_c
-       END FUNCTION h5pget_preserve_c
-    END INTERFACE
-    
-    hdferr = h5pget_preserve_c(prp_id, flag_c) 
-    flag = .FALSE.
-    IF(flag_c .EQ. 1) flag = .TRUE.
-  END SUBROUTINE h5pget_preserve_f
-
-!****s* H5P/h5pget_class_f 
-! NAME
-!  h5pget_class_f 
-!
-! PURPOSE
-!  Returns the property list class for a property list.
-!
-! INPUTS
-!  prp_id	- property list identifier
-!
-! OUTPUTS
-!  classtype	- property list class
-!  hdferr:	- error code		
-!		   Success:  0
-!		   Failure: -1 
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pget_class_f(prp_id, classtype, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id      ! Property list identifier 
-    INTEGER(HID_T), INTENT(OUT) :: classtype  ! The type of the property list 
-                                              ! to be created.
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5pget_class_c(prp_id, classtype)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_CLASS_C'::h5pget_class_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN)  :: prp_id
-         INTEGER(HID_T), INTENT(OUT) :: classtype 
-       END FUNCTION h5pget_class_c
-    END INTERFACE
-
-    hdferr = h5pget_class_c(prp_id, classtype) 
-  END SUBROUTINE h5pget_class_f
-
-!****s* H5P/h5pcopy_f 
-! NAME
-!  h5pcopy_f 
-!
-! PURPOSE
-!  Copies an existing property list to create a new 
-!  property list
-!
-! INPUTS
-!  prp_id       - property list identifier
-! OUTPUTS
-!  new_prp_id	- new property list identifier
-!  hdferr:	- error code		
-!		   Success:  0
-!		   Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pcopy_f(prp_id, new_prp_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id      ! Property list identifier 
-    INTEGER(HID_T), INTENT(OUT) :: new_prp_id ! Identifier of property list
-    INTEGER, INTENT(OUT) :: hdferr            ! Error code
-                                              ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pcopy_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pcopy_c(prp_id, new_prp_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PCOPY_C'::h5pcopy_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER(HID_T), INTENT(OUT) :: new_prp_id
-       END FUNCTION h5pcopy_c
-    END INTERFACE
-    
-    hdferr = h5pcopy_c(prp_id, new_prp_id)
-  END SUBROUTINE h5pcopy_f
-
-!****s* H5P/h5pclose_f 
-! NAME
-!  h5pclose_f 
-!
-! PURPOSE
-!  Terminates access to a property list. 
-!
-! INPUTS
-!  prp_id - identifier of the property list to 
-!	    terminate access to. 
-! OUTPUTS
-!  hdferr - error code		
-!	    Success:  0
-!	    Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pclose_f(prp_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier 
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-                                          ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pclose_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pclose_c(prp_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PCLOSE_C'::h5pclose_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id 
-       END FUNCTION h5pclose_c
-    END INTERFACE
-    
-    hdferr = h5pclose_c(prp_id)
-  END SUBROUTINE h5pclose_f
-
-!****s* H5P/h5pset_chunk_f 
-! NAME
-!   h5pset_chunk_f 
-!
-! PURPOSE
-!  Sets the size of the chunks used to store 
-!  a chunked layout dataset. 
-!
-! INPUTS
-!  prp_id  - datatset creation property list identifier
-!  ndims   - number of dimensions for each chunk
-!  dims	   - array with dimension sizes for each chunk
-! OUTPUTS
-!  hdferr  - error code		
-!	      Success:  0
-!	      Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!   Explicit Fortran interfaces were added for 
-!   called C functions (it is needed for Windows
-!   port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pset_chunk_f(prp_id, ndims, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(IN) :: ndims         ! Number of chunk dimensions
-    INTEGER(HSIZE_T), DIMENSION(ndims), INTENT(IN) :: dims    
-                                         ! Array containing sizes of
-                                         ! chunk dimensions
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pset_chunk_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_chunk_c(prp_id, ndims, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_CHUNK_C'::h5pset_chunk_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER, INTENT(IN) :: ndims
-         INTEGER(HSIZE_T), DIMENSION(ndims), INTENT(IN) :: dims
-       END FUNCTION h5pset_chunk_c
-    END INTERFACE
-    
-    hdferr =  h5pset_chunk_c(prp_id, ndims, dims)
-  END SUBROUTINE h5pset_chunk_f
-
-!****s* H5P/h5pget_chunk_f 
-! NAME
-!   h5pget_chunk_f 
-!
-! PURPOSE
-!  Retrieves the size of chunks for the raw data of a 
-!  chunked layout dataset
-!
-! INPUTS
-!  prp_id	- property list identifier
-!  ndims	- size of dims array
-! OUTPUTS
-!  dims		- array with dimension sizes for each chunk
-!  hdferr	- error code		
-!		   Success:  number of chunk dimensions
-!		   Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pget_chunk_f(prp_id, ndims, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(IN) :: ndims         ! Number of chunk dimensions to
-                                         ! to return
-    INTEGER(HSIZE_T), DIMENSION(ndims), INTENT(OUT) :: dims    
-                                         ! Array containing sizes of
-                                         ! chunk dimensions
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
-                                         !  number of chunk dimensions on success,
-                                         !  -1 on failure
-!*****
-!            INTEGER, EXTERNAL :: h5pget_chunk_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_chunk_c(prp_id, ndims, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_CHUNK_C'::h5pget_chunk_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER :: ndims
-         INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: dims
-       END FUNCTION h5pget_chunk_c
-    END INTERFACE
-
-    hdferr =  h5pget_chunk_c(prp_id, ndims, dims)
-  END SUBROUTINE h5pget_chunk_f
-
-!****s* H5P/h5pset_deflate_f 
-! NAME
-!   h5pset_deflate_f 
-!
-! PURPOSE
-!   Sets compression method and compression level. 
-!
-! INPUTS
-!   prp_id  - property list identifier
-!   level   - compression level
-! OUTPUTS
-!  
-!  hdferr  - error code		
-!	      Success:  0
-!	      Failure: -1
-!
-! AUTHOR
-!	Elena Pourmal
-!		August 12, 1999
-!
-! HISTORY
-! 	Explicit Fortran interfaces were added for 
-!			called C functions (it is needed for Windows
-!			port).  March 14, 2001
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pset_deflate_f(prp_id, level, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(IN) :: level         ! Compression level 
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-
-!  INTEGER, EXTERNAL :: h5pset_deflate_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_deflate_c(prp_id, level)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_DEFLATE_C'::h5pset_deflate_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER, INTENT(IN) :: level
-       END FUNCTION h5pset_deflate_c
-    END INTERFACE
-    hdferr = h5pset_deflate_c(prp_id, level)
-    
-  END SUBROUTINE h5pset_deflate_f
-
-!****s* H5P/h5pget_version_f 
-! NAME
-!  h5pget_version_f 
-!
-! PURPOSE
-!  Retrieves the version information of various objects 
-!  for a file creation property list
-!
-! INPUTS
-!  prp_id	- file createion property list identifier
-! OUTPUTS
-!  boot		- super block version number
-!  freelist	- global freelist version number
-!  stab		- symbol table version number
-!  shhdr	- shared object header version number
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:          
-  SUBROUTINE h5pget_version_f(prp_id, boot, freelist, &
-       stab, shhdr, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id        ! Property list identifier 
-    INTEGER, DIMENSION(:), INTENT(OUT) :: boot  ! Array to put boot
-                                                ! block version number
-    INTEGER, DIMENSION(:), INTENT(OUT) :: freelist  ! Array to put global
-                                                    ! Freelist version number
-
-    INTEGER, DIMENSION(:), INTENT(OUT) :: stab  ! Array to put symbol
-                                                ! table version number
-    INTEGER, DIMENSION(:), INTENT(OUT) :: shhdr ! Array to put shared
-                                                ! object header version number
-    INTEGER, INTENT(OUT) :: hdferr              ! Error code
-                                                ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pget_version_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_version_c(prp_id, boot, freelist, stab, shhdr)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_VERSION_C'::h5pget_version_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER, DIMENSION(:), INTENT(OUT) :: boot 
-         INTEGER, DIMENSION(:), INTENT(OUT) :: freelist 
-         INTEGER, DIMENSION(:), INTENT(OUT) :: stab
-         INTEGER, DIMENSION(:), INTENT(OUT) :: shhdr
-       END FUNCTION h5pget_version_c
-    END INTERFACE
-    
-    hdferr = h5pget_version_c(prp_id, boot, freelist, stab, shhdr)
-  END SUBROUTINE h5pget_version_f
-
-!****s* H5P/h5pset_userblock_f 
-! NAME
-!  h5pset_userblock_f 
-!
-! PURPOSE
-!   Sets user block size
-!
-! INPUTS
-!   prp_id - file creation property list to modify
-!   size   - size of the user-block in bytes
-!
-! OUTPUTS
-!  hdferr  - error code		
-!	      Success:  0
-!	      Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_userblock_f (prp_id, size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER(HSIZE_T), INTENT(IN) :: size ! Size of the user-block in bytes 
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pset_userblock_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_userblock_c(prp_id, size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_USERBLOCK_C'::h5pset_userblock_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER(HSIZE_T), INTENT(IN) :: size
-       END FUNCTION h5pset_userblock_c
-    END INTERFACE
-
-    hdferr = h5pset_userblock_c(prp_id, size)
-  END SUBROUTINE h5pset_userblock_f
-
-!****s* H5P/h5pget_userblock_f 
-! NAME
-!  h5pget_userblock_f 
-!
-! PURPOSE
-!  Gets user block size.
-!
-! INPUTS
-!  
-!  prp_id	- file creation property list identifier
-! OUTPUTS
-!  
-!  block_size	- size of the user block in bytes
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pget_userblock_f(prp_id, block_size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id         ! Property list identifier 
-    INTEGER(HSIZE_T), INTENT(OUT) ::  block_size ! Size of the 
-                                                 ! user-block in bytes 
-    INTEGER, INTENT(OUT) :: hdferr               ! Error code
-                                                 ! 0 on success and -1 on failure
-!*****
-!            INTEGER, EXTERNAL :: h5pget_userblock_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_userblock_c(prp_id, block_size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_USERBLOCK_C'::h5pget_userblock_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER(HSIZE_T), INTENT(OUT) :: block_size
-       END FUNCTION h5pget_userblock_c
-    END INTERFACE
-    hdferr = h5pget_userblock_c(prp_id,  block_size)
-  END SUBROUTINE h5pget_userblock_f
-
-!****s* H5P/h5pset_sizes_f 
-! NAME
-!  h5pset_sizes_f 
-!
-! PURPOSE
-!  Sets the byte size of the offsets and lengths used 
-!  to address objects in an HDF5 file.
-!
-! INPUTS
-!  prp_id	- file creation property list identifier
-!  sizeof_addr	- size of an object offset in bytes 
-!  sizeof_size	- size of an object length in bytes
-! OUTPUTS
-!  
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pset_sizes_f (prp_id, sizeof_addr, sizeof_size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id       ! Property list identifier 
-    INTEGER(SIZE_T), INTENT(IN) :: sizeof_addr ! Size of an object 
-                                               !  offset in bytes 
-    INTEGER(SIZE_T), INTENT(IN) :: sizeof_size ! Size of an object 
-                                               !  length in bytes 
-    INTEGER, INTENT(OUT) :: hdferr             ! Error code
-                                               ! 0 on success and -1 on failure
-!*****
-!            INTEGER, EXTERNAL :: h5pset_sizes_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_sizes_c(prp_id, sizeof_addr, sizeof_size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_SIZES_C'::h5pset_sizes_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id 
-         INTEGER(SIZE_T), INTENT(IN) :: sizeof_addr
-         INTEGER(SIZE_T), INTENT(IN) :: sizeof_size
-       END FUNCTION h5pset_sizes_c
-    END INTERFACE
-    
-    hdferr = h5pset_sizes_c(prp_id, sizeof_addr, sizeof_size)
-  END SUBROUTINE h5pset_sizes_f
-
-!****s* H5P/h5pget_sizes_f 
-! NAME
-!  h5pget_sizes_f 
-!
-! PURPOSE
-!  Retrieves the size of the offsets and lengths used 
-!  in an HDF5 file
-!
-! INPUTS
-!  prp_id	- file creation property list identifier
-! OUTPUTS
-!  
-!  sizeof_addr	- size of an object offset in bytes 
-!  sizeof_size	- size of an object length in bytes
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pget_sizes_f(prp_id, sizeof_addr, sizeof_size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id        ! Property list identifier 
-    INTEGER(SIZE_T), INTENT(OUT) :: sizeof_addr ! Size of an object
-                                                ! offset in bytes 
-    INTEGER(SIZE_T), INTENT(OUT) :: sizeof_size ! Size of an object
-                                                ! length in bytes 
-    INTEGER, INTENT(OUT) :: hdferr              ! Error code
-                                                ! 0 on success and -1 on failure
-!*****
-!            INTEGER, EXTERNAL :: h5pget_sizes_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_sizes_c(prp_id, sizeof_addr, sizeof_size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_SIZES_C'::h5pget_sizes_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id 
-         INTEGER(SIZE_T), INTENT(OUT) :: sizeof_addr
-         INTEGER(SIZE_T), INTENT(OUT) :: sizeof_size
-       END FUNCTION h5pget_sizes_c
-    END INTERFACE
-    
-    hdferr = h5pget_sizes_c(prp_id, sizeof_addr, sizeof_size)
-  END SUBROUTINE h5pget_sizes_f
-
-!****s* H5P/h5pset_sym_k_f 
-! NAME
-!  h5pset_sym_k_f 
-!
-! PURPOSE
-!  Sets the size of parameters used to control the 
-!symbol table nodes
-!
-! INPUTS
-!  
-!  prp_id  - file creation property list identifier
-!  ik	   - symbol table tree rank
-!  lk	   - symbol table node size
-! OUTPUTS
-!  
-!  hdferr  - error code		
-!	      Success:  0
-!	      Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pset_sym_k_f (prp_id, ik, lk, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(IN) :: ik            ! Symbol table tree rank 
-    INTEGER, INTENT(IN) :: lk            ! Symbol table node size 
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pset_sym_k_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_sym_k_c(prp_id, ik, lk)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_SYM_K_C'::h5pset_sym_k_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id 
-         INTEGER, INTENT(IN) :: ik
-         INTEGER, INTENT(IN) :: lk
-       END FUNCTION h5pset_sym_k_c
-    END INTERFACE
-  
-    hdferr = h5pset_sym_k_c(prp_id, ik, lk)
-  END SUBROUTINE h5pset_sym_k_f
-!****s* H5P/h5pget_sym_k_f 
-! NAME
-!  h5pget_sym_k_f 
-!
-! PURPOSE
-!  Retrieves the size of the symbol table B-tree 1/2 rank
-!  and the symbol table leaf node 1/2 size. 
-!
-! INPUTS
-!  
-!  prp_id	- file creation property list identifier
-! OUTPUTS
-!  
-!  ik		- symbol table tree 1/2 rank
-!  lk		- symbol table node 1/2 size
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pget_sym_k_f(prp_id, ik, lk, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(OUT) :: ik           ! Symbol table tree rank
-    INTEGER, INTENT(OUT) :: lk           ! Symbol table node size
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pget_sym_k_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_sym_k_c(prp_id, ik, lk)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_SYM_K_C'::h5pget_sym_k_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id 
-         INTEGER, INTENT(OUT) :: ik
-         INTEGER, INTENT(OUT) :: lk
-       END FUNCTION h5pget_sym_k_c
-    END INTERFACE
-    
-    hdferr = h5pget_sym_k_c(prp_id, ik, lk)
-  END SUBROUTINE h5pget_sym_k_f
-!****s* H5P/h5pset_istore_k_f 
-! NAME
-!  h5pset_istore_k_f 
-!
-! PURPOSE
-!  Sets the size of the parameter used to control the 
-!  B-trees for indexing chunked datasets
-!
-! INPUTS
-!  
-!  prp_id	- file creation property list identifier
-!  ik		- 1/2 rank of chunked storage B-tree
-! OUTPUTS
-!  
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pset_istore_k_f (prp_id, ik, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(IN) :: ik            ! 1/2 rank of chunked storage B-tree
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pset_istore_k_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_istore_k_c(prp_id, ik)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_ISTORE_K_C'::h5pset_istore_k_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER, INTENT(IN) :: ik
-       END FUNCTION h5pset_istore_k_c
-    END INTERFACE
-    
-    hdferr = h5pset_istore_k_c(prp_id, ik)
-  END SUBROUTINE h5pset_istore_k_f
-
-!****s* H5P/h5pget_istore_k_f 
-! NAME
-!  h5pget_istore_k_f 
-!
-! PURPOSE
-!  Queries the 1/2 rank of an indexed storage B-tree. 
-!
-! INPUTS
-!  
-!  prp_id	- file creation property list identifier
-! OUTPUTS
-!  
-!  ik		- 1/2 rank of chunked storage B-tree
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pget_istore_k_f(prp_id, ik, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(OUT) :: ik           ! 1/2 rank of chunked storage B-tree
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pget_istore_k_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_istore_k_c(prp_id, ik)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_ISTORE_K_C'::h5pget_istore_k_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER, INTENT(OUT) :: ik
-       END FUNCTION h5pget_istore_k_c
-    END INTERFACE
-    
-    hdferr = h5pget_istore_k_c(prp_id, ik)
-  END SUBROUTINE h5pget_istore_k_f
-
-!****s* H5P/h5pget_driver_f 
-! NAME
-!  h5pget_driver_f 
-!
-! PURPOSE
-!  Returns low-lever driver identifier. 
-!
-! INPUTS
-!  
-!  prp_id  - file access or data transfer property 
-!	     list identifier. 
-! OUTPUTS
-!  
-!  driver  - low-level driver identifier
-!  hdferr  - error code		
-!	      Success:  0
-!	      Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pget_driver_f(prp_id, driver, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier 
-    INTEGER(HID_T), INTENT(OUT) :: driver ! Low-level file driver identifier
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-                                          ! 0 on success and -1 on failure
-!*****
-!            INTEGER, EXTERNAL :: h5pget_driver_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_driver_c(prp_id, driver)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_DRIVER_C'::h5pget_driver_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER(HID_T), INTENT(OUT) :: driver
-       END FUNCTION h5pget_driver_c
-    END INTERFACE
-    
-    hdferr = h5pget_driver_c(prp_id, driver)
-  END SUBROUTINE h5pget_driver_f
-
-!****s* H5P/h5pset_fapl_stdio_f 
-! NAME
-!  h5pset_fapl_stdio_f 
-!
-! PURPOSE
-!  Sets the standard I/O driver. 
-!
-! INPUTS
-!  
-!  prp_id  - file access property list identifier
-! OUTPUTS
-!  
-!  hdferr  - error code		
-!	      Success:  0
-!	      Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pset_fapl_stdio_f (prp_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-    
-!            INTEGER, EXTERNAL :: h5pset_fapl_stdio_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_fapl_stdio_c(prp_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_FAPL_STDIO_C'::h5pset_fapl_stdio_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-       END FUNCTION h5pset_fapl_stdio_c
-    END INTERFACE
-    
-    hdferr = h5pset_fapl_stdio_c(prp_id)
-  END SUBROUTINE h5pset_fapl_stdio_f
-
-!****s* H5P/h5pget_stdio_f 
-! NAME
-!  h5pget_stdio_f 
-!
-! PURPOSE
-!  NOT AVAILABLE
-!
-! INPUTS
-!  
-! OUTPUTS
-!  
-!  hdferr  - error code		
-!	      Success:  0
-!	      Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! SOURCE
-!          SUBROUTINE h5pget_stdio_f (prp_id, io, hdferr)
-!
-!            IMPLICIT NONE
-!            INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
-!            INTEGER, INTENT(OUT) :: io   ! value indicates that the file
-                                         !access property list is set to
-                                         !the stdio driver
-!            INTEGER, INTENT(OUT) :: hdferr  ! Error code
-                                     ! 0 on success and -1 on failure
-!*****
-!            INTEGER, EXTERNAL :: h5pget_stdio_c
-!            hdferr = h5pget_stdio_c(prp_id, io)
-!          END SUBROUTINE h5pget_stdio_f
-
-!****s* H5P/h5pset_fapl_sec2_f 
-! NAME
-!  h5pset_fapl_sec2_f 
-!
-! PURPOSE
-!  Sets the sec2 driver. 
-!
-! INPUTS
-!  
-!  prp_id  - file access property list identifier
-! OUTPUTS
-!  
-!  hdferr  - error code		
-!	      Success:  0
-!	      Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pset_fapl_sec2_f (prp_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pset_fapl_sec2_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_fapl_sec2_c(prp_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_FAPL_SEC2_C'::h5pset_fapl_sec2_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-       END FUNCTION h5pset_fapl_sec2_c
-    END INTERFACE
-  
-    hdferr = h5pset_fapl_sec2_c(prp_id)
-  END SUBROUTINE h5pset_fapl_sec2_f
-
-!****s* H5P/h5pget_sec2_f 
-! NAME
-!   h5pget_sec2_f 
-!
-! PURPOSE
-!  NOT AVAILABLE
-!
-! INPUTS
-!  
-! OUTPUTS
-!  
-!  hdferr  - error code		
-!	      Success:  0
-!	      Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! SOURCE!          SUBROUTINE h5pget_sec2_f (prp_id, sec2, hdferr) 
-!            IMPLICIT NONE
-!            INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
-!            INTEGER, INTENT(OUT) :: sec2   ! value indicates whether the file
-                                           !driver uses the functions declared
-                                           !in the unistd.h file
-!            INTEGER, INTENT(OUT) :: hdferr  ! Error code
-                                     ! 0 on success and -1 on failure
-!*****
-!            INTEGER, EXTERNAL :: h5pget_sec2_c
-!            hdferr = h5pget_sec2_c(prp_id, sec2)
-!          END SUBROUTINE h5pget_sec2_f
-
-!****s* H5P/h5pset_alignment_f 
-! NAME
-!  h5pset_alignment_f 
-!
-! PURPOSE
-!  Sets alignment properties of a file access property list. 
-!
-! INPUTS
-!  
-!  prp_id	- file access property list identifier
-!  threshold	- threshold value	
-!  alignment	- alignment value
-! OUTPUTS
-!  
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pset_alignment_f(prp_id, threshold,  alignment, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id      ! Property list identifier 
-    INTEGER(HSIZE_T), INTENT(IN) :: threshold ! Threshold value
-    INTEGER(HSIZE_T), INTENT(IN) :: alignment ! alignment value
-    INTEGER, INTENT(OUT) :: hdferr            ! Error code
-                                              ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pset_alignment_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_alignment_c(prp_id, threshold, alignment)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_ALIGNMENT_C'::h5pset_alignment_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER(HSIZE_T), INTENT(IN) :: threshold
-         INTEGER(HSIZE_T), INTENT(IN) :: alignment
-       END FUNCTION h5pset_alignment_c
-    END INTERFACE
-  
-    hdferr = h5pset_alignment_c(prp_id, threshold, alignment)
-  END SUBROUTINE h5pset_alignment_f
-
-!****s* H5P/h5pget_alignment_f 
-! NAME
-!   h5pget_alignment_f 
-!
-! PURPOSE
-!  Retrieves the current settings for alignment 
-!  properties from a file access property list. 
-!
-! INPUTS
-!  prp_id       - file access property list identifier
-!
-! OUTPUTS
-!  threshold	- threshold value	
-!  alignment	- alignment value
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pget_alignment_f(prp_id, threshold,  alignment, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id       ! Property list identifier 
-    INTEGER(HSIZE_T), INTENT(OUT) :: threshold ! Threshold value
-    INTEGER(HSIZE_T), INTENT(OUT) :: alignment ! alignment value
-    INTEGER, INTENT(OUT) :: hdferr             ! Error code
-                                             ! 0 on success and -1 on failure
-!*****
-!            INTEGER, EXTERNAL :: h5pget_alignment_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_alignment_c(prp_id, threshold, alignment)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_ALIGNMENT_C'::h5pget_alignment_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER(HSIZE_T), INTENT(OUT) :: threshold
-         INTEGER(HSIZE_T), INTENT(OUT) :: alignment
-       END FUNCTION h5pget_alignment_c
-    END INTERFACE
-    
-    hdferr = h5pget_alignment_c(prp_id, threshold, alignment)
-  END SUBROUTINE h5pget_alignment_f
-
-!****s* H5P/h5pset_fapl_core_f 
-! NAME
-!   h5pset_fapl_core_f 
-!
-! PURPOSE
-!  Modifies the file access property list to use the 
-!  H5FD_CORE driver. 
-!
-! INPUTS
-!  prp_id	    - file access property list identifier
-!  increment	    - size, in bytes, of memory increments 
-!  backing_store    - boolean flag indicating whether to write 
-!		      the file contents to disk when the file is closed. 
-! OUTPUTS
-!  hdferr           - error code		
-!	                Success:  0
-!	                Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pset_fapl_core_f(prp_id, increment, backing_store, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id     ! Property list identifier 
-    INTEGER(SIZE_T), INTENT(IN) :: increment ! File block size in bytes.
-    LOGICAL, INTENT(IN) :: backing_store ! Flag to indicate that
-                                         ! entire file contents are flushed to a file 
-                                         ! with the same name as this core file.
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-    INTEGER :: backing_store_flag 
-
-!            INTEGER, EXTERNAL :: h5pset_fapl_core_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_fapl_core_c(prp_id, increment, backing_store_flag)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_FAPL_CORE_C'::h5pset_fapl_core_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id 
-         INTEGER(SIZE_T), INTENT(IN) :: increment 
-         INTEGER :: backing_store_flag 
-       END FUNCTION h5pset_fapl_core_c
-    END INTERFACE
-    backing_store_flag = 0
-    IF(backing_store) backing_store_flag = 1
-    hdferr = h5pset_fapl_core_c(prp_id, increment, backing_store_flag)
-  END SUBROUTINE h5pset_fapl_core_f
-
-!****s* H5P/h5pget_fapl_core_f 
-! NAME
-!  h5pget_fapl_core_f 
-!
-! PURPOSE
-!  Queries core file driver properties. 
-!
-! INPUTS
-!  prp_id	 - file access property list identifier
-! OUTPUTS
-!  
-!  increment	 - size, in bytes, of memory increments 
-!  backing_store - boolean flag indicating whether to write 
-!		   the file contents to disk when the file is closed. 
-!  hdferr        - error code		
-!	            Success:  0
-!	            Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pget_fapl_core_f(prp_id, increment, backing_store, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id      ! Property list identifier 
-    INTEGER(SIZE_T), INTENT(OUT) :: increment ! File block size in bytes.
-    LOGICAL, INTENT(OUT) :: backing_store   ! Flag to indicate that
-                                            ! entire file contents are flushed to a file 
-                                            ! with the same name as this core file.
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-                                            ! 0 on success and -1 on failure
-!*****
-    INTEGER :: backing_store_flag 
-
-    INTERFACE
-       INTEGER FUNCTION h5pget_fapl_core_c(prp_id, increment, backing_store_flag)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_FAPL_CORE_C'::h5pget_fapl_core_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id 
-         INTEGER(SIZE_T), INTENT(OUT) :: increment 
-         INTEGER :: backing_store_flag 
-       END FUNCTION h5pget_fapl_core_c
-    END INTERFACE
-    
-    hdferr = h5pget_fapl_core_c(prp_id, increment, backing_store_flag)
-    backing_store =.FALSE.
-    IF (backing_store_flag .EQ. 1) backing_store =.TRUE.
-  END SUBROUTINE h5pget_fapl_core_f
-
-!****s* H5P/ h5pset_fapl_family_f 
-! NAME
-!   h5pset_fapl_family_f 
-!
-! PURPOSE
-!  Sets the file access property list to use the family driver. 
-!
-! INPUTS
-!  prp_id	- file access property list identifier
-!  memb_size	- size in bytes of each file member 
-!  memb_plist	- identifier of the file access property 
-!		  list to be used for each family member
-! OUTPUTS
-!  hdferr  - error code		
-!	      Success:  0
-!	      Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pset_fapl_family_f(prp_id, memb_size, memb_plist , hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id      ! Property list identifier 
-    INTEGER(HSIZE_T), INTENT(IN) :: memb_size ! Logical size, in bytes,
-                                              ! of each family member
-    INTEGER(HID_T), INTENT(IN) :: memb_plist  ! Identifier of the file 
-                                              ! access property list for 
-                                              ! each member of the family
-    INTEGER, INTENT(OUT) :: hdferr            ! Error code
-                                              ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pset_fapl_family_f
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_fapl_family_c(prp_id, memb_size, memb_plist)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_FAPL_FAMILY_C'::h5pset_fapl_family_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER(HSIZE_T), INTENT(IN) :: memb_size
-         INTEGER(HID_T), INTENT(IN) :: memb_plist
-       END FUNCTION h5pset_fapl_family_c
-    END INTERFACE
-
-    hdferr = h5pset_fapl_family_c(prp_id, memb_size, memb_plist)
-  END SUBROUTINE h5pset_fapl_family_f
-
-!****s* H5P/h5pget_fapl_family_f 
-! NAME
-!  h5pget_fapl_family_f 
-!
-! PURPOSE
-!  Returns file access property list information.  	
-!
-! INPUTS
-!  prp_id	- file access property list identifier
-! OUTPUTS
-!  memb_size	- size in bytes of each file member 
-!  memb_plist	- identifier of the file access property 
-!		  list to be used for each family member
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pget_fapl_family_f(prp_id, memb_size, memb_plist , hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id       ! Property list identifier 
-    INTEGER(HSIZE_T), INTENT(OUT) :: memb_size ! Logical size, in bytes,
-                                               ! of each family member
-    INTEGER(HID_T), INTENT(OUT) :: memb_plist  ! Identifier of the file 
-                                               ! access property list for 
-                                               ! each member of the family
-    INTEGER, INTENT(OUT) :: hdferr             ! Error code
-                                               ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pget_fapl_family_f
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_fapl_family_c(prp_id, memb_size, memb_plist)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_FAPL_FAMILY_C'::h5pget_fapl_family_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER(HSIZE_T), INTENT(OUT) :: memb_size
-         INTEGER(HID_T), INTENT(OUT) :: memb_plist
-       END FUNCTION h5pget_fapl_family_c
-    END INTERFACE
-    
-    hdferr = h5pget_fapl_family_c(prp_id, memb_size, memb_plist)
-  END SUBROUTINE h5pget_fapl_family_f
-
-!****s* H5P/h5pset_cache_f 
-! NAME
-!   h5pset_cache_f 
-!
-! PURPOSE
-!  Sets the meta data cache and raw data chunk 
-!  cache parameters
-!
-! INPUTS
-!  
-!  prp_id	- file access property list identifier
-!  mdc_nelmts	- number of elements (objects) in the meta 
-!		  data cache 
-!  rdcc_nelmts	- number of elements (objects) in the raw 
-!		  data chunk cache 
-!  rdcc_nbytes	- total size of the raw data chunk cache, in bytes 
-!  rdcc_w0	- preemption policy (0 or 1)
-! OUTPUTS
-!  
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pset_cache_f(prp_id, mdc_nelmts,rdcc_nelmts, rdcc_nbytes, rdcc_w0, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(IN) :: mdc_nelmts    ! Number of elements (objects)
-                                         !  in the meta data cache
-    INTEGER(SIZE_T), INTENT(IN) :: rdcc_nelmts ! Number of elements (objects)
-                                               !  in the meta data cache
-    INTEGER(SIZE_T), INTENT(IN) :: rdcc_nbytes ! Total size of the raw data 
-                                               !  chunk cache, in bytes 
-    REAL, INTENT(IN) :: rdcc_w0                ! Preemption policy
-    INTEGER, INTENT(OUT) :: hdferr             ! Error code
-                                               !  0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pset_cache_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_cache_c(prp_id,mdc_nelmts,rdcc_nelmts,rdcc_nbytes,rdcc_w0)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_CACHE_C'::h5pset_cache_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER, INTENT(IN) :: mdc_nelmts 
-         INTEGER(SIZE_T), INTENT(IN) :: rdcc_nelmts 
-         INTEGER(SIZE_T), INTENT(IN) :: rdcc_nbytes
-         REAL, INTENT(IN) :: rdcc_w0
-       END FUNCTION h5pset_cache_c
-    END INTERFACE
-
-    hdferr = h5pset_cache_c(prp_id, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0 )
-  END SUBROUTINE h5pset_cache_f
-
-!****s* H5P/h5pget_cache_f 
-! NAME
-!   h5pget_cache_f 
-!
-! PURPOSE
-!  Queries the meta data cache and raw data chunk cache 
-!  parameters.  
-!
-! INPUTS
-!  prp_id	- file access property list identifier
-!
-! OUTPUTS
-!  mdc_nelmts	- number of elements (objects) in the meta 
-!		  data cache 
-!  rdcc_nelmts	- number of elements (objects) in the raw 
-!		  data chunk cache 
-!  rdcc_nbytes	- total size of the raw data chunk cache, in bytes 
-!  rdcc_w0	- preemption policy (0 or 1)
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!
-!  Bug fix: type of the rdcc_nelmts parameter should be INTEGER
-!  instead of INTEGER(SIZE_T) October 10, 2003 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pget_cache_f(prp_id, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(OUT) :: mdc_nelmts   ! Number of elements (objects)
-                                         !  in the meta data cache
-    INTEGER(SIZE_T), INTENT(OUT) :: rdcc_nelmts  ! Number of elements (objects)
-                                                 !  in the meta data cache
-    INTEGER(SIZE_T), INTENT(OUT) :: rdcc_nbytes  ! Total size of the raw data 
-                                                 !  chunk cache, in bytes 
-    REAL, INTENT(OUT) :: rdcc_w0                 ! Preemption policy
-    INTEGER, INTENT(OUT) :: hdferr               ! Error code
-                                                 ! 0 on success and -1 on failure
-!*****
-!            INTEGER, EXTERNAL :: h5pget_cache_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_cache_c(prp_id,mdc_nelmts,rdcc_nelmts,rdcc_nbytes,rdcc_w0)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_CACHE_C'::h5pget_cache_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER, INTENT(OUT) :: mdc_nelmts 
-         INTEGER(SIZE_T), INTENT(OUT) :: rdcc_nelmts 
-         INTEGER(SIZE_T), INTENT(OUT) :: rdcc_nbytes
-         REAL, INTENT(OUT) :: rdcc_w0
-       END FUNCTION h5pget_cache_c
-    END INTERFACE
-    
-    hdferr = h5pget_cache_c(prp_id, mdc_nelmts,rdcc_nelmts, rdcc_nbytes, rdcc_w0 )
-  END SUBROUTINE h5pget_cache_f
-
-!****s* H5P/h5pset_fapl_split_f 
-! NAME
-!   h5pset_fapl_split_f 
-!
-! PURPOSE
-!  Emulates the old split file driver. 
-!
-! INPUTS
-!  
-!  prp_id	- file access property list identifier
-!  meta_ext	- name of the extension for the metafile 
-!		  filename
-!  meta_plist	- identifier of the meta file access property 
-!		  list
-!  raw_ext 	- name extension for the raw file filename
-!  raw_plist	- identifier of the raw file access property list
-!
-! OUTPUTS
-!  
-!  hdferr       - error code		
-!	            Success:  0
-!	            Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pset_fapl_split_f(prp_id, meta_ext, meta_plist, raw_ext, raw_plist, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id     ! Property list identifier 
-    CHARACTER(LEN=*), INTENT(IN) :: meta_ext ! Name of the extension for
-                                             !  the metafile filename
-    INTEGER(HID_T), INTENT(IN) :: meta_plist ! Identifier of the meta file
-                                             !  access property list
-    CHARACTER(LEN=*), INTENT(IN) :: raw_ext  ! Name extension for the raw file filename
-    INTEGER(HID_T), INTENT(IN) :: raw_plist  ! Identifier of the raw file 
-                                             !  access property list
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-                                             ! 0 on success and -1 on failure
-!*****
-    INTEGER :: meta_len, raw_len
-
-!            INTEGER, EXTERNAL :: h5pset_fapl_split_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_fapl_split_c(prp_id,meta_len,meta_ext,meta_plist,raw_len,raw_ext,raw_plist)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_FAPL_SPLIT_C'::h5pset_fapl_split_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: meta_ext
-         !DEC$ATTRIBUTES reference :: raw_ext
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         CHARACTER(LEN=*), INTENT(IN) :: meta_ext 
-         INTEGER(HID_T), INTENT(IN) :: meta_plist
-         CHARACTER(LEN=*), INTENT(IN) :: raw_ext
-         INTEGER(HID_T), INTENT(IN) :: raw_plist 
-         INTEGER :: meta_len, raw_len
-       END FUNCTION h5pset_fapl_split_c
-    END INTERFACE
-
-    meta_len = LEN(meta_ext)
-    raw_len = LEN(raw_ext)
-    hdferr = h5pset_fapl_split_c(prp_id,meta_len,meta_ext,meta_plist,raw_len,raw_ext,raw_plist)
-  END SUBROUTINE h5pset_fapl_split_f
-
-!****s* H5P/h5pget_split_f 
-! NAME
-!   h5pget_split_f 
-!
-! PURPOSE
-!  NOT AVAILABLE
-!
-! INPUTS
-!  
-! OUTPUTS
-!  
-!  hdferr  - error code		
-!	      Success:  0
-!	      Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! SOURCE
-!          SUBROUTINE h5pget_split_f(prp_id, meta_ext_size, meta_ext, meta_plist,raw_ext_size,&
-!                                     raw_ext, raw_plist, hdferr)
-!            IMPLICIT NONE
-!            INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
-!            INTEGER(SIZE_T), INTENT(IN) :: meta_ext_size ! Number of characters of the meta
-                                                         ! file extension to be copied to the
-                                                         ! meta_ext buffer
-
-!            CHARACTER(LEN=*), INTENT(OUT) :: meta_ext  !Name of the extension for
-                                                      !the metafile filename
-!            INTEGER(HID_T), INTENT(OUT) :: meta_plist  ! Identifier of the meta file
-                                                      ! access property list
-!            INTEGER(SIZE_T), INTENT(IN) :: raw_ext_size ! Number of characters of the raw
-                                                         ! file extension to be copied to the
-                                                         ! raw_ext buffer
-!            CHARACTER(LEN=*), INTENT(OUT) :: raw_ext  !Name extension for the raw file filename
-!            INTEGER(HID_T), INTENT(OUT) :: raw_plist  !Identifier of the raw file
-                                                     !access property list
-!            INTEGER, INTENT(OUT) :: hdferr  ! Error code
-                                     ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pget_split_c
-!            hdferr = h5pget_split_c(prp_id, meta_ext_size, meta_ext, meta_plist, &
-!                                    raw_ext_size, raw_ext, raw_plist )
-!          END SUBROUTINE h5pget_split_f
-
-!****s* H5P/h5pset_gc_references_f 
-! NAME
-!   h5pset_gc_references_f 
-!
-! PURPOSE
-!  Sets garbage collecting references flag. 
-!
-! INPUTS
-!  
-!  prp_id	- file access property list identifier
-!  gc_reference	- flag for stting garbage collection on 
-!		  and off (1 or 0)
-! OUTPUTS
-!  
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface: 
-  SUBROUTINE h5pset_gc_references_f (prp_id, gc_reference, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(IN) :: gc_reference  ! The flag for garbage collecting
-                                         !  references for the file
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pset_gc_references_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_gc_references_c(prp_id, gc_reference)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_GC_REFERENCES_C'::h5pset_gc_references_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER, INTENT(IN) :: gc_reference
-       END FUNCTION h5pset_gc_references_c
-    END INTERFACE
-
-    hdferr = h5pset_gc_references_c(prp_id, gc_reference)
-  END SUBROUTINE h5pset_gc_references_f
-
-!****s* H5P/h5pget_gc_references_f 
-! NAME
-!   h5pget_gc_references_f 
-!
-! PURPOSE
-!  Returns garbage collecting references setting. 	
-!
-! INPUTS
-!  
-!  prp_id	- file access property list identifier
-! OUTPUTS
-!  
-!  gc_reference	- flag for stting garbage collection on 
-!		  and off (1 or 0)
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!		
-! Fortran90 Interface:
-  SUBROUTINE h5pget_gc_references_f(prp_id, gc_reference, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(OUT) :: gc_reference ! The flag for garbage collecting
-                                         !  references for the file
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pget_gc_references_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_gc_references_c(prp_id, gc_reference)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_GC_REFERENCES_C'::h5pget_gc_references_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER, INTENT(OUT) :: gc_reference
-       END FUNCTION h5pget_gc_references_c
-    END INTERFACE
-    
-    hdferr = h5pget_gc_references_c(prp_id, gc_reference)
-  END SUBROUTINE h5pget_gc_references_f
-
-!****s* H5P/h5pset_layout_f 
-! NAME
-!   h5pset_layout_f 
-!
-! PURPOSE
-!  Sets the type of storage used store the raw data 
-!  for a dataset. 
-!
-! INPUTS
-!  
-!  prp_id	- data creation property list identifier
-!  layout	- type of storage layout for raw data
-!  		  possible values are:
-!  		    H5D_COMPACT_F
-!  		    H5D_CONTIGUOUS_F
-!  		    H5D_CHUNKED_F
-! OUTPUTS
-!  
-!  hdferr      - error code		
-!	          Success:  0
-!	          Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!  
-! Fortran90 Interface:
-  SUBROUTINE h5pset_layout_f (prp_id, layout, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(IN) :: layout        ! Type of storage layout for raw data
-                                         ! possible values are:
-                                         !   H5D_COMPACT_F
-                                         !   H5D_CONTIGUOUS_F
-                                         !   H5D_CHUNKED_F
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pset_layout_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_layout_c(prp_id, layout)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_LAYOUT_C'::h5pset_layout_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER, INTENT(IN) :: layout
-       END FUNCTION h5pset_layout_c
-    END INTERFACE
-    
-    hdferr = h5pset_layout_c(prp_id, layout)
-  END SUBROUTINE h5pset_layout_f
-
-!****s* H5P/h5pget_layout_f 
-! NAME
-!   h5pget_layout_f 
-!
-! PURPOSE
-!  Returns the layout of the raw data for a dataset. 
-!
-! INPUTS
-!  
-!  prp_id	- data creation property list identifier
-! OUTPUTS
-!  
-!  layout	- type of storage layout for raw data
-!  		  possible values are:
-!  		   H5D_COMPACT_F
-!  		   H5D_CONTIGUOUS_F
-!  		   H5D_CHUNKED_F
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!  
-! Fortran90 Interface:
-  SUBROUTINE h5pget_layout_f (prp_id, layout, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(OUT) :: layout       ! Type of storage layout for raw data
-                                         ! possible values are:
-                                         !  H5D_COMPACT_F(0)
-                                         !  H5D_CONTIGUOUS_F(1)
-                                         !  H5D_CHUNKED_F(2)
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pget_layout_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_layout_c(prp_id, layout)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_LAYOUT_C'::h5pget_layout_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER, INTENT(OUT) :: layout
-       END FUNCTION h5pget_layout_c
-    END INTERFACE
-    
-    hdferr = h5pget_layout_c(prp_id, layout)
-  END SUBROUTINE h5pget_layout_f
-
-!****s* H5P/h5pset_filter_f 
-! NAME
-!  h5pset_filter_f 
-!
-! PURPOSE
-!  Adds a filter to the filter pipeline. 
-!
-! INPUTS
-!  
-!  prp_id	- data creation or transfer property list 
-!  		  identifier
-!  filter	- filter to be added to the pipeline 
-!  flags	- bit vector specifying certain general
-!  		  properties of the filter
-!  cd_nelmts	- number of elements in cd_values
-!  cd_values	- auxiliary data for the filter
-! OUTPUTS
-!  
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  February, 2003
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_filter_f(prp_id, filter, flags, cd_nelmts, cd_values,  hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(IN) :: filter        ! Filter to be added to the pipeline.
-    INTEGER, INTENT(IN) :: flags         ! Bit vector specifying certain general
-                                       !  properties of the filter.
-    INTEGER(SIZE_T), INTENT(IN) :: cd_nelmts       ! Number of elements in cd_values.
-    INTEGER, DIMENSION(*), INTENT(IN) :: cd_values ! Auxiliary data for the filter.
-    INTEGER, INTENT(OUT) :: hdferr                 ! Error code
-                                                 ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pset_filter_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_filter_c(prp_id, filter, flags, cd_nelmts, cd_values)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_FILTER_C'::h5pset_filter_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id 
-         INTEGER, INTENT(IN) :: filter 
-         INTEGER, INTENT(IN) :: flags 
-         INTEGER(SIZE_T), INTENT(IN) :: cd_nelmts 
-         INTEGER, DIMENSION(*), INTENT(IN) :: cd_values 
-       END FUNCTION h5pset_filter_c
-    END INTERFACE
-  
-    hdferr = h5pset_filter_c(prp_id, filter, flags, cd_nelmts, cd_values )
-  END SUBROUTINE h5pset_filter_f
-
-!****s* H5P/h5pget_nfilters_f 
-! NAME
-!   h5pget_nfilters_f 
-!
-! PURPOSE
-!  Returns the number of filters in the pipeline. 
-!
-! INPUTS
-!  
-!  prp_id	- data creation or transfer property list 
-!  		  identifier
-! OUTPUTS
-!  
-!  nfilters	- number of filters in the pipeline
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!  
-! Fortran90 Interface:
-  SUBROUTINE h5pget_nfilters_f (prp_id, nfilters, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(OUT) :: nfilters     ! The number of filters in the pipeline
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pget_nfilters_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_nfilters_c(prp_id, nfilters)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_NFILTERS_C'::h5pget_nfilters_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER, INTENT(OUT) :: nfilters
-       END FUNCTION h5pget_nfilters_c
-    END INTERFACE
-    
-    hdferr = h5pget_nfilters_c(prp_id, nfilters)
-  END SUBROUTINE h5pget_nfilters_f
-
-!****s* H5P/h5pget_filter_f 
-! NAME
-!   h5pget_filter_f 
-!
-! PURPOSE
-!  Returns information about a filter in a pipeline
-!
-! INPUTS
-!  
-!  prp_id	 - data creation or transfer property list 
-!  		   identifier
-!  filter_number - sequence number within the filter
-!                  pipeline of the filter for which 
-!                  information is sought
-! OUTPUTS
-!  
-!  filter_id	- filter identification number
-!  flags	- bit vector specifying certain general
-!  		  properties of the filter
-!  cd_nelmts	- number of elements in cd_values
-!  cd_values	- auxiliary data for the filter
-!  namelen	- number of characters in the name buffer
-!  name		- buffer to retrieve filter name
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!  
-! Fortran90 Interface:
-  SUBROUTINE h5pget_filter_f(prp_id, filter_number, flags, cd_nelmts, cd_values, namelen, name, filter_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(IN) :: filter_number ! Sequence number within the filter
-                                         !  pipeline of the filter for which 
-                                         !  information is sought
-    INTEGER, DIMENSION(*), INTENT(OUT) :: cd_values  ! Auxiliary data for the filter.
-    INTEGER, INTENT(OUT) :: flags        ! Bit vector specifying certain general
-                                         !  properties of the filter.
-    INTEGER(SIZE_T), INTENT(INOUT) :: cd_nelmts  ! Number of elements in cd_values.
-    INTEGER(SIZE_T), INTENT(IN) :: namelen       ! Anticipated number of characters in name.
-    CHARACTER(LEN=*), INTENT(OUT) :: name        ! Name of the filter
-    INTEGER, INTENT(OUT) :: filter_id            ! Filter identification number  
-    INTEGER, INTENT(OUT) :: hdferr               ! Error code
-                                                 ! 0 on success and -1 on failure
-!*****
-
-
-!            INTEGER, EXTERNAL :: h5pget_filter_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_filter_c(prp_id, filter_number, flags, cd_nelmts,  &
-            cd_values, namelen, name, filter_id )
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_FILTER_C'::h5pget_filter_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER, INTENT(IN) :: filter_number 
-         INTEGER, DIMENSION(*), INTENT(OUT) :: cd_values
-         INTEGER, INTENT(OUT) :: flags 
-         INTEGER(SIZE_T), INTENT(INOUT) :: cd_nelmts
-         INTEGER(SIZE_T), INTENT(IN) :: namelen
-         CHARACTER(LEN=*), INTENT(OUT) :: name
-         INTEGER, INTENT(OUT) :: filter_id
-       END FUNCTION h5pget_filter_c
-    END INTERFACE
-    
-    hdferr = h5pget_filter_c(prp_id, filter_number, flags, cd_nelmts,  & 
-         cd_values, namelen, name, filter_id )
-  END SUBROUTINE h5pget_filter_f
-
-!****s* H5P/h5pset_external_f 
-! NAME
-!   h5pset_external_f 
-!
-! PURPOSE
-!  Adds an external file to the list of external files. 
-!
-! INPUTS
-!   
-!  prp_id	- dataset creation property list identifier
-!  name		- name of external file
-!  offset	- offset in bytes from the beginning of the 
-!  		  file to the location in the file
-!  		  where the data starts
-!  bytes	- size of the external file data. 
-! OUTPUTS
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001
-!
-!  Changed type of 'offset' from integer to off_t -- MSB January 9, 2012
-!  
-! Fortran90 Interface:
-  SUBROUTINE h5pset_external_f(prp_id, name, offset, bytes, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of an external file
-    INTEGER(OFF_T), INTENT(IN) :: offset  ! Offset, in bytes, from the beginning 
-                                          !  of the file to the location in the file 
-                                          !  where the data starts.
-    INTEGER(HSIZE_T), INTENT(IN) :: bytes ! Number of bytes reserved in the 
-                                          !  file for the data
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-                                          ! 0 on success and -1 on failure
-!*****
-
-    INTEGER :: namelen
-
-    INTERFACE
-       INTEGER FUNCTION h5pset_external_c(prp_id, name,namelen, offset, bytes)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_EXTERNAL_C'::h5pset_external_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER :: namelen
-         INTEGER(OFF_T), INTENT(IN) :: offset
-         INTEGER(HSIZE_T), INTENT(IN) :: bytes
-       END FUNCTION h5pset_external_c
-    END INTERFACE
-  
-    namelen = LEN(name)
-    hdferr = h5pset_external_c(prp_id, name, namelen, offset, bytes)
-  END SUBROUTINE h5pset_external_f
-
-!****s* H5P/h5pget_external_count_f 
-! NAME
-!   h5pget_external_count_f 
-!
-! PURPOSE
-!  Returns the number of external files for a dataset. 
-!
-! INPUTS
-!  
-!  prp_id	- dataset creation property list identifier
-! OUTPUTS
-!  
-!  count	- number of external files for the 
-!  		  specified dataset
-!  hdferr       - error code		
-!	            Success:  0
-!	            Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!  
-! Fortran90 Interface:
-  SUBROUTINE h5pget_external_count_f (prp_id, count, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(OUT) :: count        ! Number of external files for the 
-                                         ! Specified dataset
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-!            INTEGER, EXTERNAL :: h5pget_external_count_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_external_count_c(prp_id, count)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_EXTERNAL_COUNT_C'::h5pget_external_count_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id 
-         INTEGER, INTENT(OUT) :: count
-       END FUNCTION h5pget_external_count_c
-    END INTERFACE
-    
-    hdferr = h5pget_external_count_c(prp_id, count)
-  END SUBROUTINE h5pget_external_count_f
-
-!****s* H5P/h5pget_external_f 
-! NAME
-!  h5pget_external_f 
-!
-! PURPOSE
-!  Returns information about an external file. 
-!
-! INPUTS
-!  
-!  prp_id	- dataset creation property list identifier
-! OUTPUTS
-!  
-!  idx		- external file index 
-!  name_size	- maximum size of name array
-!  name		- name of the external file	
-!  name		- name of external file
-!  offset	- offset in bytes from the beginning of the 
-!  		  file to the location in the file
-!  		  where the data starts
-!  bytes	- size of the external file data
-!  hdferr       - error code		
-!	           Success:  0
-!	            Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001
-!
-! Changed type of 'offset' from integer to off_t -- MSB January 9, 2012
-!  
-! Fortran90 Interface:
-  SUBROUTINE h5pget_external_f(prp_id, idx, name_size, name, offset,bytes, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
-    INTEGER, INTENT(IN) :: idx           ! External file index.
-    INTEGER(SIZE_T), INTENT(IN) :: name_size ! Maximum length of name array 
-    CHARACTER(LEN=*), INTENT(OUT) :: name    ! Name of an external file
-    INTEGER(OFF_T), INTENT(OUT) :: offset    ! Offset, in bytes, from the beginning 
-                                             !  of the file to the location in the file 
-                                             !  where the data starts.
-    INTEGER(HSIZE_T), INTENT(OUT) :: bytes   ! Number of bytes reserved in the 
-                                             !  file for the data
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-                                             ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pget_external_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_external_c(prp_id, idx, name_size, name, offset, bytes)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_EXTERNAL_C'::h5pget_external_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER, INTENT(IN) :: idx 
-         INTEGER(SIZE_T), INTENT(IN) :: name_size
-         CHARACTER(LEN=*), INTENT(OUT) :: name
-         INTEGER(OFF_T), INTENT(OUT) :: offset
-         INTEGER(HSIZE_T), INTENT(OUT) :: bytes
-       END FUNCTION h5pget_external_c
-    END INTERFACE
-    
-    hdferr = h5pget_external_c(prp_id, idx, name_size, name, offset, bytes)
-  END SUBROUTINE h5pget_external_f
-
-!****s* H5P/h5pset_btree_ratios_f 
-! NAME
-!   h5pset_btree_ratios_f 
-!
-! PURPOSE
-!  Sets B-tree split ratios for a dataset transfer 
-!  property list. 
-!
-! INPUTS
-!  	
-!  prp_id	- the dataset transfer property list 
-!  		  identifier 
-!  left		- the B-tree split ratio for left-most nodes 
-!  middle	- the B-tree split ratio for all other nodes
-!  right	- the B-tree split ratio for right-most nodes
-! OUTPUTS
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!  
-! Fortran90 Interface:
-  SUBROUTINE h5pset_btree_ratios_f(prp_id, left, middle, right, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
-    REAL, INTENT(IN) :: left   ! The B-tree split ratio for left-most nodes.
-    REAL, INTENT(IN) :: middle ! The B-tree split ratio for all other nodes 
-    REAL, INTENT(IN) :: right  ! The B-tree split ratio for right-most 
-                               !  nodes and lone nodes. 
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code
-                                    ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pset_btree_ratios_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION  h5pset_btree_ratios_c(prp_id, left, middle, right)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_BTREE_RATIOS_C'::h5pset_btree_ratios_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         REAL, INTENT(IN) :: left
-         REAL, INTENT(IN) :: middle
-         REAL, INTENT(IN) :: right
-       END FUNCTION h5pset_btree_ratios_c
-    END INTERFACE
-    
-    hdferr = h5pset_btree_ratios_c(prp_id, left, middle, right)
-  END SUBROUTINE h5pset_btree_ratios_f
-
-!****s* H5P/h5pget_btree_ratios_f
-! NAME
-!  h5pget_btree_ratios_f
-!
-! PURPOSE
-!  Gets B-tree split ratios for a dataset transfer property list
-!
-! INPUTS
-!  
-!  prp_id	- the dataset transfer property list 
-!  		  identifier 
-! OUTPUTS
-!  
-!  left		- the B-tree split ratio for left-most nodes 
-!  middle	- the B-tree split ratio for all other nodes
-!  right	- the B-tree split ratio for right-most nodes
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999	
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for 
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001 
-!  
-! Fortran90 Interface:
-  SUBROUTINE h5pget_btree_ratios_f(prp_id, left, middle, right, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
-    REAL, INTENT(OUT) :: left   ! The B-tree split ratio for left-most nodes.
-    REAL, INTENT(OUT) :: middle ! The B-tree split ratio for all other nodes 
-    REAL, INTENT(OUT) :: right  ! The B-tree split ratio for right-most 
-                                !  nodes and lone nodes.
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code
-                                    ! 0 on success and -1 on failure
-!*****
-
-
-!            INTEGER, EXTERNAL :: h5pget_btree_ratios_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION  h5pget_btree_ratios_c(prp_id, left, middle, right)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_BTREE_RATIOS_C'::h5pget_btree_ratios_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         REAL, INTENT(OUT) :: left
-         REAL, INTENT(OUT) :: middle
-         REAL, INTENT(OUT) :: right
-       END FUNCTION h5pget_btree_ratios_c
-    END INTERFACE
-  
-    hdferr = h5pget_btree_ratios_c(prp_id, left, middle, right)
-  END SUBROUTINE h5pget_btree_ratios_f
-
-!****s* H5P/h5pget_fclose_degree_f 
-! NAME
-!  h5pget_fclose_degree_f 
-!
-! PURPOSE
-!  Returns the degree for the file close behavior.
-!
-! INPUTS
-!  
-!  fapl_id	- File access property list identifier
-! OUTPUTS
-!  
-!  degree  	- Possible values are:
-!  		   H5F_CLOSE_DEFAULT_F
-!  		   H5F_CLOSE_WEAK_F
-!  		   H5F_CLOSE_SEMI_F
-!  		   H5F_CLOSE_STRONG_F
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  September 26, 2002	
-!
-! HISTORY
-! 
-!  
-! Fortran90 Interface:
-  SUBROUTINE h5pget_fclose_degree_f(fapl_id, degree, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: fapl_id ! File Access Property list identifier 
-    INTEGER, INTENT(OUT) :: degree        ! Possible values are: 
-                                          !  H5F_CLOSE_DEFAULT_F
-					  !  H5F_CLOSE_WEAK_F
-					  !  H5F_CLOSE_SEMI_F
-					  !  H5F_CLOSE_STRONG_F
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-                                          ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pget_fclose_degree_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_fclose_degree_c(fapl_id, degree)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_FCLOSE_DEGREE_C'::h5pget_fclose_degree_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: fapl_id
-         INTEGER, INTENT(OUT) :: degree
-       END FUNCTION h5pget_fclose_degree_c
-    END INTERFACE
-    
-    hdferr = h5pget_fclose_degree_c(fapl_id, degree) 
-  END SUBROUTINE h5pget_fclose_degree_f
-
-!****s* H5P/h5pset_fclose_degree_f 
-! NAME
-!  h5pset_fclose_degree_f 
-!
-! PURPOSE
-!  Sets the degree for the file close behavior.
-!
-! INPUTS
-!  
-!  fapl_id	- file access property list identifier
-!  degree  	- Possible values are:
-!  		    H5F_CLOSE_DEFAULT_F
-!  		    H5F_CLOSE_WEAK_F
-!  		    H5F_CLOSE_SEMI_F
-!  		    H5F_CLOSE_STRONG_F
-! OUTPUTS
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  September 26, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_fclose_degree_f(fapl_id, degree, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: fapl_id ! File Access Property list identifier 
-    INTEGER, INTENT(IN) :: degree         ! Possible values are: 
-                                          !  H5F_CLOSE_DEFAULT_F
-					  !  H5F_CLOSE_WEAK_F
-					  !  H5F_CLOSE_SEMI_F
-					  !  H5F_CLOSE_STRONG_F
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-                                          ! 0 on success and -1 on failure
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5pset_fclose_degree_c(fapl_id, degree)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_FCLOSE_DEGREE_C'::h5pset_fclose_degree_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: fapl_id
-         INTEGER, INTENT(IN) :: degree
-       END FUNCTION h5pset_fclose_degree_c
-    END INTERFACE
-
-    hdferr = h5pset_fclose_degree_c(fapl_id, degree) 
-  END SUBROUTINE h5pset_fclose_degree_f
-
-!****s* H5P/h5pequal_f 
-! NAME
-!  h5pequal_f 
-!
-! PURPOSE
-!  Checks if two property lists are eqaul
-!
-! INPUTS
-!  
-!  plist1_id	- property list identifier
-!  plist2_id	- property list identifier
-! OUTPUTS
-!  
-!  flag		- flag, possible values
-!  		    .TRUE. or .FALSE.
-!  hdferr:	- error code		
-!  		   Success:  0
-!  		   Failure: -1, flag is set to .FALSE.   
-!
-! AUTHOR
-!  Elena Pourmal
-!  September 30, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pequal_f(plist1_id, plist2_id, flag, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist1_id ! Property list identifier 
-    INTEGER(HID_T), INTENT(IN) :: plist2_id ! Property list identifier 
-    LOGICAL, INTENT(OUT)       :: flag      ! Flag
-    INTEGER, INTENT(OUT)       :: hdferr    ! Error code
-                                            !  0 on success and -1 on failure
-!*****
-    INTEGER                    :: c_flag
-    
-    INTERFACE
-       INTEGER FUNCTION h5pequal_c(plist1_id, plist2_id, c_flag)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PEQUAL_C'::h5pequal_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist1_id
-         INTEGER(HID_T), INTENT(IN) :: plist2_id
-         INTEGER, INTENT(OUT) :: c_flag
-       END FUNCTION h5pequal_c
-    END INTERFACE
-
-    flag = .FALSE.
-    hdferr = h5pequal_c(plist1_id, plist2_id, c_flag) 
-    IF (c_flag .GT. 0) flag = .TRUE.
-  END SUBROUTINE h5pequal_f
-
-!****s* H5P/h5pset_buffer_f
-! NAME
-!  h5pset_buffer_f 
-!
-! PURPOSE
-!  Sets sixe for conversion buffer
-!
-! INPUTS
-!  plist_id	- data transfer property list identifier
-!  size		- buffer size 
-! OUTPUTS
-!  
-!  hdferr:	- error code		
-!  		   Success:  0
-!  		   Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 2, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_buffer_f(plist_id, size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id ! Data transfer property list identifier 
-    INTEGER(HSIZE_T), INTENT(IN) :: size   ! Buffer size in bytes; 
-                                           ! buffer is allocated and freed by 
-                                           ! the library.
-    INTEGER, INTENT(OUT)       :: hdferr   ! Error code
-                                           ! 0 on success and -1 on failure
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5pset_buffer_c(plist_id, size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_BUFFER_C'::h5pset_buffer_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-         INTEGER(HSIZE_T), INTENT(IN) :: size
-       END FUNCTION h5pset_buffer_c
-    END INTERFACE
-
-    hdferr = h5pset_buffer_c(plist_id, size) 
-  END SUBROUTINE h5pset_buffer_f
-
-!****s* H5P/h5pget_buffer_f
-! NAME
-!  h5pget_buffer_f 
-!
-! PURPOSE
-!  Gets size for conversion buffer
-!
-! INPUTS
-!  
-!  plist_id	- data transfer property list identifier
-! OUTPUTS
-!  
-!  size		- buffer size 
-!  hdferr	- error code		
-!  		   Success:  0
-!  		   Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 2, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pget_buffer_f(plist_id, size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id ! Data transfer property list identifier 
-    INTEGER(HSIZE_T), INTENT(OUT) :: size  ! Buffer size in bytes; 
-                                           !  buffer is allocated and freed by 
-                                           !  the library.
-    INTEGER, INTENT(OUT)       :: hdferr   ! Error code
-                                           ! 0 on success and -1 on failure
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5pget_buffer_c(plist_id, size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_BUFFER_C'::h5pget_buffer_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-         INTEGER(HSIZE_T), INTENT(OUT) :: size
-       END FUNCTION h5pget_buffer_c
-    END INTERFACE
-
-    hdferr = h5pget_buffer_c(plist_id, size) 
-  END SUBROUTINE h5pget_buffer_f
-
-!****s* H5P/h5pfill_value_defined_f
-! NAME
-!  h5pfill_value_defined_f
-!
-! PURPOSE
-!  Check if fill value is defined.
-!
-! INPUTS
-!  
-!  plist_id	- dataset creation property list identifier
-! OUTPUTS
-!  
-!  flag         - fill value status flag
-!                 Possible values are:
-!  		    H5D_FILL_VALUE_ERROR_F
-!  		    H5D_FILL_VALUE_UNDEFINED_F
-!  		    H5D_FILL_VALUE_DEFAULT_F
-!  		    H5D_FILL_VALUE_USER_DEFINED_F
-!  hdferr	- error code		
-!  		    Success:  0
-!  		    Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 4, 2002
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pfill_value_defined_f(plist_id, flag, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id  ! Dataset creation property list identifier
-    INTEGER, INTENT(OUT) :: flag            ! Fill value status flag
-                                            !  H5D_FILL_VALUE_ERROR_F
-                                            !  H5D_FILL_VALUE_UNDEFINED_F
-                                            !  H5D_FILL_VALUE_DEFAULT_F
-                                            !  H5D_FILL_VALUE_USER_DEFINED_F
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-                                            ! 0 on success and -1 on failure
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5pfill_value_defined_c(plist_id, flag)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PFILL_VALUE_DEFINED_C'::h5pfill_value_defined_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-         INTEGER, INTENT(OUT) :: flag
-       END FUNCTION h5pfill_value_defined_c
-    END INTERFACE
-
-    hdferr = h5pfill_value_defined_c(plist_id, flag) 
-  END SUBROUTINE h5pfill_value_defined_f
-
-!****s* H5P/h5pset_alloc_time_f
-! NAME
-!  h5pset_alloc_time_f
-!
-! PURPOSE
-!  Set space allocation time for dataset during creation.
-!
-! INPUTS
-!  
-!  plist_id	- dataset creation property list identifier
-!  flag         - allocation time flag:
-!  		    H5D_ALLOC_TIME_ERROR_F
-!  		    H5D_ALLOC_TIME_DEFAULT_F
-!  		    H5D_ALLOC_TIME_EARLY_F
-!  		    H5D_ALLOC_TIME_LATE_F
-!  		    H5D_ALLOC_TIME_INCR_F
-! OUTPUTS
-!  
-!  hdferr	- error code		
-!  		   Success:  0
-!  		   Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 4, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_alloc_time_f(plist_id, flag, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id  ! Dataset creation property list identifier
-    INTEGER, INTENT(IN) :: flag             ! Allocation time flag:
-                                            !  H5D_ALLOC_TIME_ERROR_F
-                                            !  H5D_ALLOC_TIME_DEFAULT_F
-                                            !  H5D_ALLOC_TIME_EARLY_F
-                                            !  H5D_ALLOC_TIME_LATE_F
-                                            !  H5D_ALLOC_TIME_INCR_F
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-                                            ! 0 on success and -1 on failure
-!*****  
-    
-    INTERFACE
-       INTEGER FUNCTION h5pset_alloc_time_c(plist_id, flag)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_ALLOC_TIME_C'::h5pset_alloc_time_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-         INTEGER, INTENT(IN) :: flag
-       END FUNCTION h5pset_alloc_time_c
-    END INTERFACE
-    
-    hdferr = h5pset_alloc_time_c(plist_id, flag) 
-  END SUBROUTINE h5pset_alloc_time_f
-
-!****s* H5P/h5pget_alloc_time_f
-! NAME
-!  h5pget_alloc_time_f
-!
-! PURPOSE
-!  Get space allocation time for dataset during creation.
-!
-! INPUTS
-!  
-!  plist_id	- dataset creation property list identifier
-! OUTPUTS
-!  
-!  flag         - allocation time flag:
-!  		    H5D_ALLOC_TIME_ERROR_F
-!  		    H5D_ALLOC_TIME_DEFAULT_F
-!  		    H5D_ALLOC_TIME_EARLY_F
-!  		    H5D_ALLOC_TIME_LATE_F
-!  		    H5D_ALLOC_TIME_INCR_F
-!  hdferr:	- error code		
-!  		    Success:  0
-!  		    Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 4, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pget_alloc_time_f(plist_id, flag, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id  ! Dataset creation property list identifier
-    INTEGER, INTENT(OUT) :: flag   ! Allocation time flag:
-                                   !  H5D_ALLOC_TIME_ERROR_F
-                                   !  H5D_ALLOC_TIME_DEFAULT_F
-                                   !  H5D_ALLOC_TIME_EARLY_F
-                                   !  H5D_ALLOC_TIME_LATE_F
-                                   !  H5D_ALLOC_TIME_INCR_F
-    INTEGER, INTENT(OUT) :: hdferr ! Error code
-                                   ! 0 on success and -1 on failure
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5pget_alloc_time_c(plist_id, flag)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_ALLOC_TIME_C'::h5pget_alloc_time_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-         INTEGER, INTENT(OUT) :: flag
-       END FUNCTION h5pget_alloc_time_c
-    END INTERFACE
-    
-    hdferr = h5pget_alloc_time_c(plist_id, flag) 
-  END SUBROUTINE h5pget_alloc_time_f
-
-!****s* H5P/h5pset_fill_time_f
-! NAME
-!  h5pset_fill_time_f
-!
-! PURPOSE
-!  Set fill value writing time for dataset
-!
-! INPUTS
-!  
-!  plist_id	- dataset creation property list identifier
-!  flag         - fill time flag:
-!  		    H5D_FILL_TIME_ERROR_F
-!  		    H5D_FILL_TIME_ALLOC_F
-!  		    H5D_FILL_TIME_NEVER_F
-! OUTPUTS
-!  
-!  hdferr	- error code		
-!  		   Success:  0
-!  		   Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 4, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_fill_time_f(plist_id, flag, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id  ! Dataset creation property list identifier
-    INTEGER, INTENT(IN) :: flag             ! Fill time flag:
-                                            !  H5D_FILL_TIME_ERROR_F
-                                            !  H5D_FILL_TIME_ALLOC_F
-                                            !  H5D_FILL_TIME_NEVER_F
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-                                            ! 0 on success and -1 on failure
-!*****  
-
-    INTERFACE
-       INTEGER FUNCTION h5pset_fill_time_c(plist_id, flag)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_FILL_TIME_C'::h5pset_fill_time_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-         INTEGER, INTENT(IN) :: flag
-       END FUNCTION h5pset_fill_time_c
-    END INTERFACE
-    
-    hdferr = h5pset_fill_time_c(plist_id, flag) 
-  END SUBROUTINE h5pset_fill_time_f
-
-!****s* H5P/h5pget_fill_time_f
-! NAME
-!   h5pget_fill_time_f
-!
-! PURPOSE
-!  Get fill value writing time for dataset
-!
-! INPUTS
-!  
-!  plist_id	- dataset creation property list identifier
-! OUTPUTS
-!  
-!  hdferr:	- error code		
-!  		   Success:  0
-!  		   Failure: -1
-! OPTIONAL PARAMETERS
-!
-!  flag         - fill time flag:
-!  		   H5D_FILL_TIME_ERROR_F
-!  		   H5D_FILL_TIME_ALLOC_F
-!  		   H5D_FILL_TIME_NEVER_F
-! AUTHOR
-!  Elena Pourmal
-!  October 4, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pget_fill_time_f(plist_id, flag, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id  ! Dataset creation property list identifier
-    INTEGER, INTENT(OUT) :: flag   ! Fill time flag:
-                                   !  H5D_FILL_TIME_ERROR_F
-                                   !  H5D_FILL_TIME_ALLOC_F
-                                   !  H5D_FILL_TIME_NEVER_F
-    INTEGER, INTENT(OUT) :: hdferr ! Error code
-                                   ! 0 on success and -1 on failure
-!*****   
-  
-    INTERFACE
-       INTEGER FUNCTION h5pget_fill_time_c(plist_id, flag)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_FILL_TIME_C'::h5pget_fill_time_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-         INTEGER, INTENT(OUT) :: flag
-       END FUNCTION h5pget_fill_time_c
-    END INTERFACE
-    
-    hdferr = h5pget_fill_time_c(plist_id, flag) 
-  END SUBROUTINE h5pget_fill_time_f
-
-!****s* H5P/ h5pset_meta_block_size_f 
-! NAME
-!  h5pset_meta_block_size_f 
-!
-! PURPOSE
-!  Sets the minimum size of metadata block allocations 
-!
-! INPUTS
-!  
-!  plist_id	- file access property list identifier
-!  size		- metatdata block size
-! OUTPUTS
-!  
-!  hdferr	- error code		
-!  		   Success:  0
-!  		   Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 7, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_meta_block_size_f(plist_id, size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id  ! File access property list identifier 
-    INTEGER(HSIZE_T), INTENT(IN) :: size    ! Block size in bytes; 
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-                                            ! 0 on success and -1 on failure
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5pset_meta_block_size_c(plist_id, size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_META_BLOCK_SIZE_C'::h5pset_meta_block_size_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-         INTEGER(HSIZE_T), INTENT(IN) :: size
-       END FUNCTION h5pset_meta_block_size_c
-    END INTERFACE
-    
-    hdferr = h5pset_meta_block_size_c(plist_id, size) 
-  END SUBROUTINE h5pset_meta_block_size_f
-
-!****s* H5P/h5pget_meta_block_size_f 
-! NAME
-!  h5pget_meta_block_size_f 
-!
-! PURPOSE
-!  Gets the minimum size of metadata block allocations 
-!
-! INPUTS
-!  
-!  plist_id	- file access property list identifier
-! OUTPUTS
-!  
-!  size		- metatdata block size
-!  hdferr	- error code		
-!  		   Success:  0
-!  		   Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 7, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pget_meta_block_size_f(plist_id, size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id  ! File access property list identifier 
-    INTEGER(HSIZE_T), INTENT(OUT) :: size   ! Block size in bytes; 
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-                                            ! 0 on success and -1 on failure
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5pget_meta_block_size_c(plist_id, size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_META_BLOCK_SIZE_C'::h5pget_meta_block_size_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-         INTEGER(HSIZE_T), INTENT(OUT) :: size
-       END FUNCTION h5pget_meta_block_size_c
-    END INTERFACE
-    
-    hdferr = h5pget_meta_block_size_c(plist_id, size) 
-  END SUBROUTINE h5pget_meta_block_size_f
-
-!****s* H5P/h5pset_sieve_buf_size_f 
-! NAME
-!  h5pset_sieve_buf_size_f 
-!
-! PURPOSE
-!  Sets the maximum size of the data sieve buffer
-!
-! INPUTS
-!  
-!  plist_id	- file access property list identifier
-!  size		- sieve buffer size
-! OUTPUTS
-!  
-!  hdferr	- error code		
-!  		   Success:  0
-!  		   Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 7, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_sieve_buf_size_f(plist_id, size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id ! File access property list identifier 
-    INTEGER(SIZE_T), INTENT(IN) :: size    ! Buffer size in bytes; 
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-                                           ! 0 on success and -1 on failure
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5pset_sieve_buf_size_c(plist_id, size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_SIEVE_BUF_SIZE_C'::h5pset_sieve_buf_size_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-         INTEGER(SIZE_T), INTENT(IN) :: size
-       END FUNCTION h5pset_sieve_buf_size_c
-    END INTERFACE
-    
-    hdferr = h5pset_sieve_buf_size_c(plist_id, size) 
-  END SUBROUTINE h5pset_sieve_buf_size_f
-
-!****s* H5P/h5pget_sieve_buf_size_f
-! NAME
-!  h5pget_sieve_buf_size_f 
-!
-! PURPOSE
-!  Gets the maximum size of the data sieve buffer
-!
-! INPUTS
-!  
-!  plist_id	- file access property list identifier
-! OUTPUTS
-!  
-!  size		- sieve buffer size
-!  hdferr	- error code		
-!  		   Success:  0
-!  		   Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 7, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pget_sieve_buf_size_f(plist_id, size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id ! File access property list identifier 
-    INTEGER(SIZE_T), INTENT(OUT) :: size   ! Buffer size in bytes 
-    INTEGER, INTENT(OUT)       :: hdferr   ! Error code
-                                           ! 0 on success and -1 on failure
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5pget_sieve_buf_size_c(plist_id, size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_SIEVE_BUF_SIZE_C'::h5pget_sieve_buf_size_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-         INTEGER(SIZE_T), INTENT(OUT) :: size
-       END FUNCTION h5pget_sieve_buf_size_c
-    END INTERFACE
-    
-    hdferr = h5pget_sieve_buf_size_c(plist_id, size) 
-  END SUBROUTINE h5pget_sieve_buf_size_f
-
-!****s* H5P/h5pset_small_data_block_size_f 
-! NAME
-!  h5pset_small_data_block_size_f 
-!
-! PURPOSE
-!  Sets the minimum size of "small" raw data block
-!
-! INPUTS
-!  
-!  plist_id	- file access property list identifier
-!  size		- small raw data block size
-! OUTPUTS
-!  
-!  hdferr	- error code		
-!  		   Success:  0
-!  		   Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 7, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_small_data_block_size_f(plist_id, size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id ! File access property list identifier 
-    INTEGER(HSIZE_T), INTENT(IN) :: size   ! Small raw data block size
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-                                           ! 0 on success and -1 on failure
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5pset_small_data_block_size_c(plist_id, size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_SMALL_DATA_BLOCK_SIZE_C'::h5pset_small_data_block_size_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-         INTEGER(HSIZE_T), INTENT(IN) :: size
-       END FUNCTION h5pset_small_data_block_size_c
-    END INTERFACE
-
-    hdferr = h5pset_small_data_block_size_c(plist_id, size) 
-  END SUBROUTINE h5pset_small_data_block_size_f
-
-!****s* H5P/h5pget_small_data_block_size_f 
-! NAME
-!  h5pget_small_data_block_size_f 
-!
-! PURPOSE
-!  Gets the minimum size of "small" raw data block
-!
-! INPUTS
-!  
-!  plist_id	- file access property list identifier
-! OUTPUTS
-!  
-!  size		- small raw data block size
-!  hdferr	- error code		
-!  		   Success:  0
-!  		   Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 7, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pget_small_data_block_size_f(plist_id, size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id  ! File access property list identifier 
-    INTEGER(HSIZE_T), INTENT(OUT) :: size   ! Small raw data block size
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-                                            ! 0 on success and -1 on failure
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5pget_small_data_block_size_c(plist_id, size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_SMALL_DATA_BLOCK_SIZE_C'::h5pget_small_data_block_size_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-         INTEGER(HSIZE_T), INTENT(OUT) :: size
-       END FUNCTION h5pget_small_data_block_size_c
-    END INTERFACE
-    
-    hdferr = h5pget_small_data_block_size_c(plist_id, size) 
-  END SUBROUTINE h5pget_small_data_block_size_f
-
-!****s* H5P/h5pset_hyper_vector_size_f 
-! NAME
-!  h5pset_hyper_vector_size_f 
-!
-! PURPOSE
-!  Set the number of "I/O" vectors (vector size)
-!
-! INPUTS
-!  
-!  plist_id	- dataset transfer property list identifier
-!  size		- vector size
-! OUTPUTS
-!  
-!  hdferr	- error code		
-!  		   Success:  0
-!  		   Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 7, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_hyper_vector_size_f(plist_id, size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id ! Dataset transfer property list identifier 
-    INTEGER(SIZE_T), INTENT(IN) :: size    ! Vector size
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-                                           ! 0 on success and -1 on failure
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5pset_hyper_vector_size_c(plist_id, size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_HYPER_VECTOR_SIZE_C'::h5pset_hyper_vector_size_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-         INTEGER(SIZE_T), INTENT(IN) :: size
-       END FUNCTION h5pset_hyper_vector_size_c
-    END INTERFACE
-    
-    hdferr = h5pset_hyper_vector_size_c(plist_id, size) 
-  END SUBROUTINE h5pset_hyper_vector_size_f
-
-!****s* H5P/ h5pget_hyper_vector_size_f 
-! NAME
-!  h5pget_hyper_vector_size_f 
-!
-! PURPOSE
-!  Get the number of "I/O" vectors (vector size)
-!
-! INPUTS
-!  
-!  plist_id	- dataset transfer property list identifier
-! OUTPUTS
-!  
-!  size		- vector size
-!  hdferr	- error code		
-!  		   Success:  0
-!  		   Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 7, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pget_hyper_vector_size_f(plist_id, size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id ! Dataset transfer property list identifier 
-    INTEGER(SIZE_T), INTENT(OUT) :: size   ! Vector size
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-                                           ! 0 on success and -1 on failure
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5pget_hyper_vector_size_c(plist_id, size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_HYPER_VECTOR_SIZE_C'::h5pget_hyper_vector_size_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-         INTEGER(SIZE_T), INTENT(OUT) :: size
-       END FUNCTION h5pget_hyper_vector_size_c
-    END INTERFACE
-
-    hdferr = h5pget_hyper_vector_size_c(plist_id, size) 
-  END SUBROUTINE h5pget_hyper_vector_size_f
-
-!****s* H5P/h5pexist_f 
-! NAME
-!   h5pexist_f 
-!
-! PURPOSE
-!  Queries whether a property name exists in a property list or class. 
-!
-! INPUTS
-!  
-!  prp_id	- property list identifier to query
-!  name 	- name of property to check for
-! OUTPUTS
-!  
-!  flag         - logical flag
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pexist_f(prp_id, name, flag, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier 
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to modify
-    LOGICAL, INTENT(OUT) :: flag          ! .TRUE. if exists, .FALSE. otherwise
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code
-                                    ! 0 on success and -1 on failure
-!*****
-    INTEGER :: name_len
-    
-    INTERFACE
-       INTEGER FUNCTION h5pexist_c(prp_id, name, name_len)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PEXIST_C'::h5pexist_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-       END FUNCTION h5pexist_c
-    END INTERFACE
-    flag = .FALSE.
-    name_len = LEN(name)
-    hdferr = h5pexist_c(prp_id, name , name_len)
-    IF (hdferr > 0) THEN
-       flag = .TRUE.
-       hdferr = 0
-    ENDIF
-  END SUBROUTINE h5pexist_f
-
-!****s* H5P/h5pget_size_f 
-!
-! NAME
-!  h5pget_size_f 
-!
-! PURPOSE
-!  Queries the size of a property value in bytes.
-!
-! INPUTS
-!  
-!  prp_id	- property list identifier to query
-!  name 	- name of property to query
-! OUTPUTS
-!  
-!  size         - size of property in bytes
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002	
-!
-! HISTORY
-! 	
-!  
-! Fortran90 Interface:
-  SUBROUTINE h5pget_size_f(prp_id, name, size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier 
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to query
-    INTEGER(SIZE_T), INTENT(OUT) :: size  ! Size in bytes
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-                                          ! 0 on success and -1 on failure
-!*****
-    INTEGER :: name_len
-    
-    INTERFACE
-       INTEGER FUNCTION h5pget_size_c(prp_id, name, name_len, size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_SIZE_C'::h5pget_size_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-         INTEGER(SIZE_T), INTENT(OUT) :: size
-       END FUNCTION h5pget_size_c
-    END INTERFACE
-    name_len = LEN(name)
-    hdferr = h5pget_size_c(prp_id, name , name_len, size)
-  END SUBROUTINE h5pget_size_f
-
-!****s* H5P/h5pget_npros_f 
-! NAME
-!   h5pget_npros_f 
-!
-! PURPOSE
-!  Queries number of properties in property list or class
-!
-! INPUTS
-!  
-!  prp_id	- iproperty list identifier to query
-! OUTPUTS
-!  
-!  nprops       - number of properties in property object
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pget_nprops_f(prp_id, nprops, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id    ! Property list identifier 
-    INTEGER(SIZE_T), INTENT(OUT) :: nprops  ! Number of properties
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-                                            ! 0 on success and -1 on failure
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5pget_nprops_c(prp_id, nprops)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_NPROPS_C'::h5pget_nprops_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER(SIZE_T), INTENT(OUT) :: nprops
-       END FUNCTION h5pget_nprops_c
-    END INTERFACE
-    hdferr = h5pget_nprops_c(prp_id, nprops)
-  END SUBROUTINE h5pget_nprops_f
-
-!****s* H5P/h5pget_class_name_f 
-! NAME
-!  h5pget_class_name_f 
-!
-! PURPOSE
-!  Queries the name of a class.
-!
-! INPUTS
-!  
-!  prp_id       - property list identifier to query
-! OUTPUTS
-!  
-!  name 	- name of a class
-!  size         - Actual length of the class name
-!                   NOTE: If provided buffer "name" is smaller,
-!                   than name will be truncated to fit into
-!                   provided user buffer.
-!  hdferr:	- error code
-!  		   Success: 0
-!  		   Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002	
-!
-! HISTORY
-! Returned the size of name as an argument	
-!  
-! Fortran90 Interface:
-  SUBROUTINE h5pget_class_name_f(prp_id, name, size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier 
-    CHARACTER(LEN=*), INTENT(OUT) :: name ! Buffer to retireve class name
-    INTEGER, INTENT(OUT) :: size          ! Actual length of the class name
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-                                          ! 0 on success and -1 on failure
-!*****
-    INTEGER :: name_len
-    
-    INTERFACE
-       INTEGER FUNCTION h5pget_class_name_c(prp_id, name, name_len)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_CLASS_NAME_C'::h5pget_class_name_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         CHARACTER(LEN=*), INTENT(INOUT) :: name
-         INTEGER, INTENT(IN)         :: name_len
-       END FUNCTION h5pget_class_name_c
-    END INTERFACE
-    
-    name_len = LEN(name)
-    size = h5pget_class_name_c(prp_id, name, name_len)
-    
-    hdferr = 0
-    IF(size.LT.0) hdferr = -1
-    
-  END SUBROUTINE h5pget_class_name_f
-
-!****s* H5P/h5pget_class_parent_f 
-! NAME
-!  h5pget_class_parent_f 
-!
-! PURPOSE
-!  Retrieves the parent class of a genric property class. 
-!
-! INPUTS
-!  
-!  prp_id	- property list identifier to query
-! OUTPUTS
-!  
-!  parent_id 	- identifier of the parent class
-!  hdferr:	- error code          
-!  		   Success:  0
-!  		   Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pget_class_parent_f(prp_id, parent_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id     ! Property list identifier 
-    INTEGER(HID_T), INTENT(OUT) :: parent_id ! Parent class property list 
-                                             ! identifier 
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code
-                                    ! 0 on success and -1 on failure
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5pget_class_parent_c(prp_id, parent_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_CLASS_PARENT_C'::h5pget_class_parent_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER(HID_T), INTENT(OUT) :: parent_id
-       END FUNCTION h5pget_class_parent_c
-    END INTERFACE
-    hdferr = h5pget_class_parent_c(prp_id, parent_id)
-  END SUBROUTINE h5pget_class_parent_f
-
-!****s* H5P/h5pisa_class_f 
-! NAME
-!   h5pisa_class_f 
-!
-! PURPOSE
-!  Determines whether a property list is a member of a class. 
-!
-! INPUTS
-!  
-!  plist	- property list identifier 
-!  pclass	- identifier of the property class
-! OUTPUTS
-!  
-!  flag         - .TRUE. if a member, .FALSE. otherwise
-!  hdferr:	- error code           
-!  		   Success:  0
-!  		   Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pisa_class_f(plist, pclass, flag, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist     ! Property list identifier 
-    INTEGER(HID_T), INTENT(IN) :: pclass    ! Class identifier
-    LOGICAL, INTENT(OUT) :: flag            ! logical flag
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code
-                                    ! 0 on success and -1 on failure
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5pisa_class_c(plist, pclass)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PISA_CLASS_C'::h5pisa_class_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist
-         INTEGER(HID_T), INTENT(IN) :: pclass
-       END FUNCTION h5pisa_class_c
-    END INTERFACE
-    flag = .FALSE.
-    hdferr = h5pisa_class_c(plist, pclass)
-    IF (hdferr .GT. 0) THEN
-       flag = .TRUE.
-       hdferr = 0
-    ENDIF
-  END SUBROUTINE h5pisa_class_f
-
-!****s* H5P/h5pcopy_prop_f 
-! NAME
-!   h5pcopy_prop_f 
-!
-! PURPOSE
-!  Copies a property from one list or class to another.
-!
-! INPUTS
-!  
-!  dst_id		- Identifier of the destination property list
-!  src_id		- Identifier of the source property list 
-!  name 		- name of the property to copy
-! OUTPUTS
-!  
-!  hdferr:		- error code
-!  		 	   Success: 0 
-!  		  	   Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pcopy_prop_f(dst_id, src_id, name, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dst_id  ! Destination property list 
-                                          ! identifier 
-    INTEGER(HID_T), INTENT(IN) :: src_id  ! Source property list identifier 
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Property name
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-                                          ! 0 on success and -1 on failure
-!*****
-    INTEGER :: name_len
-    
-    INTERFACE
-       INTEGER FUNCTION h5pcopy_prop_c(dst_id, src_id, name, name_len)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PCOPY_PROP_C'::h5pcopy_prop_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: dst_id
-         INTEGER(HID_T), INTENT(IN) :: src_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-       END FUNCTION h5pcopy_prop_c
-    END INTERFACE
-    name_len = LEN(name)
-    hdferr = h5pcopy_prop_c(dst_id, src_id, name , name_len)
-  END SUBROUTINE h5pcopy_prop_f
-
-!****s* H5P/h5premove_f 
-! NAME
-!   h5premove_f 
-!
-! PURPOSE
-!  Removes a property from a property list. 
-
-!
-! INPUTS
-!  
-!  plid		- Property list identofoer
-!  name 	- name of the property to remove
-! OUTPUTS
-!  
-!  hdferr:	- error code
-!  		   Success: 0 
-!  		   Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5premove_f(plid, name, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plid   ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name ! Name of property to remove
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         !  0 on success and -1 on failure
-!*****
-    INTEGER :: name_len
-    
-    INTERFACE
-       INTEGER FUNCTION h5premove_c(plid, name, name_len)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PREMOVE_C'::h5premove_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: plid 
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-       END FUNCTION h5premove_c
-    END INTERFACE
-    name_len = LEN(name)
-    hdferr = h5premove_c(plid, name , name_len)
-  END SUBROUTINE h5premove_f
-
-!****s* H5P/h5punregister_f 
-! NAME
-!  h5punregister_f 
-!
-! PURPOSE
-!  Removes a property from a property list class. 
-!
-! INPUTS
-!  
-!  class	- Property list class identifier
-!  name 	- name of the property to remove
-! OUTPUTS
-!  
-!  hdferr:	- error code
-!                  Success: 0 
-!  		   Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5punregister_f(class, name, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: class  ! property list class identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name ! name of property to remove
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-    INTEGER :: name_len
-
-    INTERFACE
-       INTEGER FUNCTION h5punregister_c(class, name, name_len)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PUNREGISTER_C'::h5punregister_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: class
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-       END FUNCTION h5punregister_c
-    END INTERFACE
-    name_len = LEN(name)
-    hdferr = h5punregister_c(class, name , name_len)
-  END SUBROUTINE h5punregister_f
-
-!****s* H5P/h5pclose_class_f 
-! NAME
-!  h5pclose_class_f 
-!
-! PURPOSE
-!  Closes an existing property list class.
-!
-! INPUTS
-!  
-!  class	- Property list class identifier
-! OUTPUTS
-!  
-!  hdferr	- error code         
-!  		   Success: 0 
-!  		   Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002	
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pclose_class_f(class, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: class ! Property list class identifier
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-                                        ! 0 on success and -1 on failure
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5pclose_class_c(class)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PCLOSE_CLASS_C'::h5pclose_class_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: class
-       END FUNCTION h5pclose_class_c
-    END INTERFACE
-    hdferr = h5pclose_class_c(class)
-  END SUBROUTINE h5pclose_class_f
-
-!****s* H5P/h5pset_shuffle_f 
-! NAME
-!  h5pset_shuffle_f 
-!
-! PURPOSE
-!  Sets shuffling filter
-!
-! INPUTS
-!  prp_id	- dataset creation property list identifier
-! OUTPUTS
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  March 12, 2003
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_shuffle_f(prp_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pset_shuffle_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_shuffle_c(prp_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_SHUFFLE_C'::h5pset_shuffle_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-       END FUNCTION h5pset_shuffle_c
-    END INTERFACE
-    hdferr = h5pset_shuffle_c(prp_id)
-    
-  END SUBROUTINE h5pset_shuffle_f
-
-!****s* H5P/h5pset_edc_check_f 
-! NAME
-!  h5pset_edc_check_f 
-!
-! PURPOSE
-!  Enables/disables error detecting  
-!
-! INPUTS
-!  
-!  prp_id	- dataset creation property list identifier
-!  flag         - EDC flag; possible values:
-!                   H5Z_DISABLE_EDC_F
-!                   H5Z_ENABLE_EDC_F
-! OUTPUTS
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  March 13, 2003
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_edc_check_f(prp_id, flag, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(IN) :: flag          ! Checksum filter flag
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pset_edc_check_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_edc_check_c(prp_id, flag)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_EDC_CHECK_C'::h5pset_edc_check_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER, INTENT(IN) :: flag 
-       END FUNCTION h5pset_edc_check_c
-    END INTERFACE
-    hdferr = h5pset_edc_check_c(prp_id, flag)
-    
-  END SUBROUTINE h5pset_edc_check_f
-
-!****s* H5P/h5pget_edc_check_f
-! NAME
-!  h5pget_edc_check_f 
-!
-! PURPOSE
-!  Queries error detecting  
-!
-! INPUTS
-!  
-!  prp_id	- dataset creation property list identifier
-! OUTPUTS
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  March 13, 2003
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pget_edc_check_f(prp_id, flag, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Dataset transfer property list identifier 
-    INTEGER, INTENT(OUT) :: flag         ! Checksum filter flag
-                                         ! May have one of the following values:
-                                         !  H5Z_ERROR_EDC_F
-                                         !  H5Z_DISABLE_EDC_F
-                                         !  H5Z_ENABLE_EDC_F
-                                         !  H5Z_NO_EDC_F
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!*****
-
-!            INTEGER, EXTERNAL :: h5pget_edc_check_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_edc_check_c(prp_id, flag)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_EDC_CHECK_C'::h5pget_edc_check_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER, INTENT(OUT) :: flag
-       END FUNCTION h5pget_edc_check_c
-    END INTERFACE
-    hdferr = h5pget_edc_check_c(prp_id, flag)
-    
-  END SUBROUTINE h5pget_edc_check_f
-
-!****s* H5P/h5pset_fletcher32_f
-! NAME
-!  h5pset_fletcher32_f 
-!
-! PURPOSE
-!  Sets Fletcher32 checksum of EDC for a dataset creation 
-!  property list.
-!
-! INPUTS
-!  
-!  prp_id	- dataset creation property list identifier
-! OUTPUTS
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  March 13, 2003
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_fletcher32_f(prp_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!***** 
-
-!            INTEGER, EXTERNAL :: h5pset_fletcher32_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_fletcher32_c(prp_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_FLETCHER32_C'::h5pset_fletcher32_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-       END FUNCTION h5pset_fletcher32_c
-    END INTERFACE
-    hdferr = h5pset_fletcher32_c(prp_id)
-
-  END SUBROUTINE h5pset_fletcher32_f
-
-!****s* H5P/ h5pset_family_offset_f
-! NAME
-!  h5pset_family_offset_f 
-!
-! PURPOSE
-!  Sets offset for family file driver.
-!
-! INPUTS
-!  
-!  prp_id	- file creation property list identifier
-!  offset	- file offset
-! OUTPUTS
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  19 March 2003
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_family_offset_f(prp_id, offset, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id   ! Property list identifier 
-    INTEGER(HSIZE_T), INTENT(IN) :: offset ! Offset in bytes
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-                                           ! 0 on success and -1 on failure
-!***** 
-
-!            INTEGER, EXTERNAL :: h5pset_family_offset_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_family_offset_c(prp_id, offset)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_FAMILY_OFFSET_C'::h5pset_family_offset_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER(HSIZE_T), INTENT(IN) :: offset 
-       END FUNCTION h5pset_family_offset_c
-    END INTERFACE
-    hdferr = h5pset_family_offset_c(prp_id, offset)
-    
-  END SUBROUTINE h5pset_family_offset_f
-
-!****s* H5P/h5pset_fapl_multi_l
-! NAME
-!  h5pset_fapl_multi_l 
-!
-! PURPOSE
-!  Sets up use of the multi-file driver. 
-!
-! INPUTS
-!  
-!  prp_id	- file creation property list identifier
-!  mem_map      - mapping array
-!  memb_fapl    - property list for each memory usage type
-!  memb_name    - names of member file
-!  relax        - flag 
-! OUTPUTS
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  20 March 2003
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_fapl_multi_l(prp_id, memb_map, memb_fapl, memb_name, memb_addr, relax, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id
-    INTEGER, DIMENSION(*), INTENT(IN) :: memb_map
-    INTEGER(HID_T), DIMENSION(*), INTENT(IN) :: memb_fapl
-    CHARACTER(LEN=*), DIMENSION(*), INTENT(IN) :: memb_name
-    REAL, DIMENSION(*), INTENT(IN) :: memb_addr 
-    LOGICAL, INTENT(IN) :: relax
-    INTEGER, INTENT(OUT) :: hdferr
-!***** 
-    INTEGER, DIMENSION(1:H5FD_MEM_NTYPES_F) :: lenm
-    INTEGER :: maxlen
-    INTEGER :: flag = 0
-    INTEGER :: i
-
-    INTERFACE
-       INTEGER FUNCTION h5pset_fapl_multi_c(prp_id, memb_map, memb_fapl, memb_name, lenm, &
-            maxlen, memb_addr, flag)
-         USE H5GLOBAL
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_FAPL_MULTI_C'::h5pset_fapl_multi_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: memb_name
-         INTEGER(HID_T), INTENT(IN) :: prp_id ! File creation property list identifier 
-         INTEGER, DIMENSION(*), INTENT(IN) :: memb_map
-         INTEGER(HID_T), DIMENSION(*), INTENT(IN) :: memb_fapl
-         CHARACTER(LEN=*), DIMENSION(*), INTENT(IN) :: memb_name
-         REAL, DIMENSION(*), INTENT(IN) :: memb_addr
-         INTEGER, DIMENSION(*) :: lenm
-         INTEGER :: maxlen
-         INTEGER, INTENT(IN) :: flag
-       END FUNCTION h5pset_fapl_multi_c
-    END INTERFACE
-
-    maxlen = LEN(memb_name(1))
-    DO i=1, H5FD_MEM_NTYPES_F
-       lenm(i) = LEN_TRIM(memb_name(i))
-    ENDDO
-    IF(relax) flag = 1
-    hdferr = h5pset_fapl_multi_c(prp_id, memb_map, memb_fapl, memb_name, lenm, maxlen, memb_addr, flag)
-
-  END SUBROUTINE h5pset_fapl_multi_l
-!****s* H5P/h5pset_fapl_multi_s 
-! NAME
-!  h5pset_fapl_multi_s 
-!
-! PURPOSE
-!  Sets up use of the multi-file driver. 
-!
-! INPUTS
-!  
-!  prp_id	- file creation property list identifier
-!  relax        - flag 
-! OUTPUTS
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  31 March 2003
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_fapl_multi_s(prp_id, relax, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! File creation property list identifier 
-    LOGICAL, INTENT(IN) :: relax
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!***** 
-    INTEGER :: flag
-
-!            INTEGER, EXTERNAL :: h5pset_fapl_multi_sc
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_fapl_multi_sc(prp_id,flag) 
-         USE H5GLOBAL
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_FAPL_MULTI_SC'::h5pset_fapl_multi_sc
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id ! File creation property list identifier 
-         INTEGER, INTENT(IN) :: flag
-       END FUNCTION h5pset_fapl_multi_sc
-    END INTERFACE
-    flag = 0
-    IF (relax) flag = 1
-    hdferr = h5pset_fapl_multi_sc(prp_id, flag) 
-    
-  END SUBROUTINE h5pset_fapl_multi_s
-!****s* H5P/h5pget_fapl_multi_f 
-! NAME
-!  h5pget_fapl_multi_f 
-!
-! PURPOSE
-!  Sets up use of the multi-file driver. 
-!
-! INPUTS
-!  
-!  prp_id	- file creation property list identifier
-! OUTPUTS
-!  
-!  mem_map      - mapping array
-!  memb_fapl    - property list for each memory usage type
-!  memb_name    - names of member file
-!  relax        - flag 
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1
-!
-! OPTIONAL PARAMETERS
-!  maxlen_out   - maximum length for memb_name array element 
-!
-! AUTHOR
-!  Elena Pourmal
-!  24 March 2003
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pget_fapl_multi_f(prp_id, memb_map, memb_fapl, memb_name, memb_addr, relax, hdferr, maxlen_out)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! File creation property list identifier 
-    INTEGER, DIMENSION(*), INTENT(OUT) :: memb_map
-    INTEGER(HID_T), DIMENSION(*), INTENT(OUT) :: memb_fapl
-    CHARACTER(LEN=*), DIMENSION(*), INTENT(OUT) :: memb_name
-    REAL, DIMENSION(*), INTENT(OUT) :: memb_addr
-    INTEGER, OPTIONAL, INTENT(OUT) :: maxlen_out 
-    LOGICAL, INTENT(OUT) :: relax
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!***** 
-    INTEGER, DIMENSION(1:H5FD_MEM_NTYPES_F) :: lenm
-    INTEGER :: maxlen
-    INTEGER :: c_maxlen_out 
-    INTEGER :: flag
-    INTEGER :: i
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_fapl_multi_c(prp_id, memb_map, memb_fapl, memb_name, lenm, &
-            maxlen, memb_addr, flag, c_maxlen_out)
-         USE H5GLOBAL
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_FAPL_MULTI_C'::h5pget_fapl_multi_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: memb_name
-         INTEGER(HID_T), INTENT(IN) :: prp_id ! File creation property list identifier 
-         INTEGER, DIMENSION(*), INTENT(OUT) :: memb_map
-         INTEGER(HID_T), DIMENSION(*), INTENT(OUT) :: memb_fapl
-         CHARACTER(LEN=*), DIMENSION(*), INTENT(OUT) :: memb_name
-         REAL, DIMENSION(*), INTENT(OUT) :: memb_addr
-         INTEGER, DIMENSION(*) :: lenm
-         INTEGER :: maxlen
-         INTEGER :: c_maxlen_out 
-         INTEGER, INTENT(OUT) :: flag
-       END FUNCTION h5pget_fapl_multi_c
-    END INTERFACE
-
-    maxlen = LEN(memb_name(1))
-    DO i=1, H5FD_MEM_NTYPES_F
-       lenm(i) = LEN_TRIM(memb_name(i))
-    ENDDO
-    hdferr = h5pget_fapl_multi_c(prp_id, memb_map, memb_fapl, memb_name, lenm, maxlen, memb_addr, flag, c_maxlen_out)
-    
-    relax = .TRUE.
-    IF(flag .EQ. 0) relax = .FALSE.
-    IF(PRESENT(maxlen_out)) maxlen_out = c_maxlen_out
-  END SUBROUTINE h5pget_fapl_multi_f
-!****s* H5P/h5pset_szip_f 
-! NAME
-!  h5pset_szip_f 
-!
-! PURPOSE
-!  Sets up use of szip compression
-!
-! INPUTS
-!  
-!  prp_id	    - dataset creation property list identifier
-!  options_mask     - A bit-mask conveying the desired SZIP options.
-!                     Current valid values in Fortran are:
-!                        H5_SZIP_EC_OM_F
-!                        H5_SZIP_NN_OM_F
-!  pixels_per_block - szip parameters
-! OUTPUTS
-!  hdferr           - error code		
-!	                Success:  0
-!	                Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  April 10 2003
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_szip_f(prp_id, options_mask, pixels_per_block, hdferr) 
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Dataset creation property 
-                                         ! list identifier 
-    INTEGER, INTENT(IN) :: options_mask  ! A bit-mask conveying the desired
-                                         ! SZIP options
-                                         ! Current valid values in Fortran are:
-                                         !    H5_SZIP_EC_OM_F
-                                         !    H5_SZIP_NN_OM_F
-    INTEGER, INTENT(IN) :: pixels_per_block ! The number of pixels or data elements 
-                                            ! in each data block
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!***** 
-
-!  INTEGER, EXTERNAL :: h5pset_szip_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_szip_c(prp_id, options_mask, pixels_per_block) 
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_SZIP_C'::h5pset_szip_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id ! File creation property list identifier 
-         INTEGER, INTENT(IN) :: options_mask
-         INTEGER, INTENT(IN) :: pixels_per_block
-       END FUNCTION h5pset_szip_c
-    END INTERFACE
-    hdferr = h5pset_szip_c(prp_id, options_mask, pixels_per_block) 
-    
-  END SUBROUTINE h5pset_szip_f
-
-!****s* H5P/h5pall_filters_avail_f 
-! NAME
-!  h5pall_filters_avail_f 
-!
-! PURPOSE
-!  Checks if all filters set in the dataset creation
-!  property list are available
-!
-! INPUTS
-!  
-!  prp_id	- data creation property list identifier
-! OUTPUTS
-!  
-!  flag         - .TRUE. if all filters are available
-!                 .FALSE. otherwise
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  April 10 2003
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pall_filters_avail_f(prp_id, flag, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Dataset creation property 
-                                         !  list identifier 
-    LOGICAL, INTENT(OUT) :: flag         ! .TRUE. if all filters are available
-                                         ! .FALSE. otherwise
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!***** 
-    INTEGER :: status
-
-!            INTEGER, EXTERNAL :: h5pall_filters_avail_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pall_filters_avail_c(prp_id, status) 
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PALL_FILTERS_AVAIL_C'::h5pall_filters_avail_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id ! File creation property list identifier 
-         INTEGER, INTENT(OUT) :: status
-       END FUNCTION h5pall_filters_avail_c
-    END INTERFACE
-    flag = .TRUE.
-    hdferr = h5pall_filters_avail_c(prp_id, status) 
-    IF (status .EQ. 0 ) flag = .FALSE.
-    
-  END SUBROUTINE h5pall_filters_avail_f
-
-!****s* H5P/h5pget_filter_by_id_f
-! NAME
-!  h5pget_filter_by_id_f 
-!
-! PURPOSE
-!  Returns information about a filter in a pipeline
-!
-! INPUTS
-!  
-!  prp_id	- data creation or transfer property list 
-!  		  identifier
-! OUTPUTS
-!  
-!  filter_id	- filter identifier
-!  flags	- bit vector specifying certain general
-!  		  properties of the filter
-!  cd_nelmts	- number of elements in cd_values
-!  cd_values	- auxiliary data for the filter
-!  namelen	- number of characters in the name buffer
-!  name		- buffer to retrieve filter name
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  April 10 2003
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pget_filter_by_id_f(prp_id, filter_id, flags, cd_nelmts, cd_values, namelen, name, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id   ! Property list identifier 
-    INTEGER, INTENT(IN) :: filter_id       ! Filter identifier
-    INTEGER(SIZE_T), INTENT(INOUT) :: cd_nelmts     ! Number of elements in cd_values.
-    INTEGER, DIMENSION(*), INTENT(OUT) :: cd_values ! Auxiliary data for the filter.
-    INTEGER, INTENT(OUT) :: flags          ! Bit vector specifying certain general
-                                           ! properties of the filter.
-    INTEGER(SIZE_T), INTENT(IN) :: namelen ! Anticipated number of characters in name.
-    CHARACTER(LEN=*), INTENT(OUT) :: name  ! Name of the filter
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-                                           ! 0 on success and -1 on failure
-!***** 
-
-
-!            INTEGER, EXTERNAL :: h5pget_filter_by_id_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_filter_by_id_c(prp_id, filter_id, flags, cd_nelmts,  &
-            cd_values, namelen, name)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_FILTER_BY_ID_C'::h5pget_filter_by_id_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER, INTENT(IN) :: filter_id 
-         INTEGER, DIMENSION(*), INTENT(OUT) :: cd_values
-         INTEGER, INTENT(OUT) :: flags 
-         INTEGER(SIZE_T), INTENT(INOUT) :: cd_nelmts
-         INTEGER(SIZE_T), INTENT(IN) :: namelen
-         CHARACTER(LEN=*), INTENT(OUT) :: name
-       END FUNCTION h5pget_filter_by_id_c
-    END INTERFACE
-    
-    hdferr = h5pget_filter_by_id_c(prp_id, filter_id, flags, cd_nelmts,  & 
-         cd_values, namelen, name)
-  END SUBROUTINE h5pget_filter_by_id_f
-
-!****s* H5P/h5pmodify_filter_f
-! NAME
-!  h5pmodify_filter_f 
-!
-! PURPOSE
-!  Adds a filter to the filter pipeline. 
-!
-! INPUTS
-!  
-!  prp_id	- data creation or transfer property list 
-!  		  identifier
-!  filter	- filter to be modified
-!  flags	- bit vector specifying certain general
-!  		  properties of the filter
-!  cd_nelmts	- number of elements in cd_values
-!  cd_values	- auxiliary data for the filter
-! OUTPUTS
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Elena Pourmal
-!  April 10 2003
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pmodify_filter_f(prp_id, filter, flags, cd_nelmts, cd_values,  hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier 
-    INTEGER, INTENT(IN) :: filter        ! Filter to be modified
-    INTEGER, INTENT(IN) :: flags         ! Bit vector specifying certain general
-                                         !  properties of the filter
-    INTEGER(SIZE_T), INTENT(IN) :: cd_nelmts       ! Number of elements in cd_values
-    INTEGER, DIMENSION(*), INTENT(IN) :: cd_values ! Auxiliary data for the filter
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!***** 
-
-!            INTEGER, EXTERNAL :: h5pmodify_filter_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pmodify_filter_c(prp_id, filter, flags, cd_nelmts, cd_values)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PMODIFY_FILTER_C'::h5pmodify_filter_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id 
-         INTEGER, INTENT(IN) :: filter 
-         INTEGER, INTENT(IN) :: flags 
-         INTEGER(SIZE_T), INTENT(IN) :: cd_nelmts 
-         INTEGER, DIMENSION(*), INTENT(IN) :: cd_values 
-       END FUNCTION h5pmodify_filter_c
-    END INTERFACE
-    
-    hdferr = h5pmodify_filter_c(prp_id, filter, flags, cd_nelmts, cd_values )
-  END SUBROUTINE h5pmodify_filter_f
-
-!****s* H5P/h5premove_filter_f 
-! NAME
-!  h5premove_filter_f 
-!
-! PURPOSE
-!  Delete one or more filters from the filter pipeline. 
-!
-! INPUTS
-!  
-!  prp_id	- data creation or transfer property list 
-!  		  identifier
-!  filter	- filter to be removed
-! OUTPUTS
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  Quincey Koziol
-!  January 27 2004
-!
-! Fortran90 Interface:
-  SUBROUTINE h5premove_filter_f(prp_id, filter, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Dataset creation property list
-                                         ! identifier
-    INTEGER, INTENT(IN) :: filter        ! Filter to be removed
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                         ! 0 on success and -1 on failure
-!***** 
-
-!            INTEGER, EXTERNAL :: h5premove_filter_c
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5premove_filter_c(prp_id, filter)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PREMOVE_FILTER_C'::h5premove_filter_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id 
-         INTEGER, INTENT(IN) :: filter 
-       END FUNCTION h5premove_filter_c
-    END INTERFACE
-    
-    hdferr = h5premove_filter_c(prp_id, filter)
-  END SUBROUTINE h5premove_filter_f
-
-!****s* H5P/H5Pget_attr_phase_change_f
-! NAME
-!  H5Pget_attr_phase_change_f 
-!
-! PURPOSE
-!  Retrieves attribute storage phase change thresholds 
-!
-! INPUTS
-!  
-!  ocpl_id	   - Object (dataset or group) creation property list identifier
-! OUTPUTS
-!  
-!  max_compact     - Maximum number of attributes to be stored in compact storage
-!                    (Default: 8)
-!  min_dense       - Minimum number of attributes to be stored in dense storage
-!                    (Default: 6)
-!  hdferr          - Error code		
-!	              Success:  0
-!	              Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  January, 2008
-!
-! Fortran90 Interface:  
-  SUBROUTINE h5pget_attr_phase_change_f(ocpl_id, max_compact, min_dense, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: ocpl_id ! Object (dataset or group) creation property list identifier
-    INTEGER, INTENT(OUT) :: max_compact   ! Maximum number of attributes to be stored in compact storage
-                                          ! (Default: 8)
-    INTEGER, INTENT(OUT) :: min_dense     ! Minimum number of attributes to be stored in dense storage
-                                          ! (Default: 6)
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-                                          ! 0 on success and -1 on failure
-!***** 
-!
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_attr_phase_change_c(ocpl_id, max_compact, min_dense)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_ATTR_PHASE_CHANGE_C'::h5pget_attr_phase_change_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: ocpl_id
-         INTEGER, INTENT(OUT) :: max_compact
-         INTEGER, INTENT(OUT) :: min_dense
-
-       END FUNCTION h5pget_attr_phase_change_c
-    END INTERFACE
-
-    hdferr = h5pget_attr_phase_change_c(ocpl_id, max_compact, min_dense)
-  END SUBROUTINE h5pget_attr_phase_change_f
-
-!****s* H5P/H5Pset_attr_creation_order_f 
-! NAME
-!  H5Pset_attr_creation_order_f 
-!
-! PURPOSE
-!  Sets tracking and indexing of attribute creation order
-!
-! INPUTS
-!  
-!  ocpl_id	   - Object creation property list identifier
-!  crt_order_flags - Flags specifying whether to track and index attribute creation order
-! OUTPUTS
-!
-!  hdferr          - Error code		
-!	              Success:  0
-!	              Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  January, 2008
-!
-! Fortran90 Interface: 
-  SUBROUTINE h5pset_attr_creation_order_f(ocpl_id, crt_order_flags , hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: ocpl_id   ! Object (dataset or group) creation property list identifier
-    INTEGER, INTENT(IN) :: crt_order_flags  ! Flags specifying whether to track and index attribute creation order
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-                                            ! 0 on success and -1 on failure
-!***** 
-!
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION H5Pset_attr_creation_order_c(ocpl_id, crt_order_flags)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_ATTR_CREATION_ORDER_C'::h5pset_attr_creation_order_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: ocpl_id
-         INTEGER, INTENT(IN) :: crt_order_flags
-
-       END FUNCTION H5Pset_attr_creation_order_c
-    END INTERFACE
-
-    hdferr = H5Pset_attr_creation_order_c(ocpl_id, crt_order_flags)
-  END SUBROUTINE h5pset_attr_creation_order_f
-
-!****s* H5P/H5Pset_shared_mesg_nindexes_f 
-! NAME
-!  H5Pset_shared_mesg_nindexes_f 
-!
-! PURPOSE
-!  Sets number of shared object header message indexes 
-!
-! INPUTS
-!  
-!  plist_id - file creation property list
-!  nindexes - Number of shared object header message indexes to be available in files created with this property list
-! OUTPUTS
-!
-!  hdferr  - error code		
-!	      Success:  0
-!	      Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  January, 2008
-!
-! Fortran90 Interface:  
-  SUBROUTINE h5pset_shared_mesg_nindexes_f( plist_id, nindexes, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id ! File creation property list
-    INTEGER, INTENT(IN) :: nindexes  ! Number of shared object header message indexes 
-                                     !  available in files created WITH this property list
-    INTEGER, INTENT(OUT) :: hdferr   ! Error code
-                                     ! 0 on success and -1 on failure
-!***** 
-!
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_shared_mesg_nindexes_c(plist_id, nindexes)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_SHARED_MESG_NINDEXES_C'::h5pset_shared_mesg_nindexes_c
-         !DEC$ENDIF
-         
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-         INTEGER, INTENT(IN) :: nindexes
-
-       END FUNCTION H5pset_shared_mesg_nindexes_c
-    END INTERFACE
-
-    hdferr = h5pset_shared_mesg_nindexes_c(plist_id, nindexes)
-
-  END SUBROUTINE h5pset_shared_mesg_nindexes_f
-
-!****s* H5P/H5Pset_shared_mesg_index_f
-! NAME
-!  H5Pset_shared_mesg_index_f
-!
-! PURPOSE
-!  Configures the specified shared object header message index
-!
-! INPUTS
-!  
-!  fcpl_id         - File creation property list identifier.
-!  index_num       - Index being configured.
-!  mesg_type_flags - Types of messages that should be stored in this index.
-!  min_mesg_size   - Minimum message size.
-!
-! OUTPUTS
-!
-!  hdferr  - error code		
-!	      Success:  0
-!	      Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  January, 2008
-!
-! Fortran90 Interface:  
-  SUBROUTINE h5pset_shared_mesg_index_f(fcpl_id, index_num, mesg_type_flags, min_mesg_size, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: fcpl_id  ! file creation property list
-    INTEGER, INTENT(IN) :: index_num       ! Index being configured.
-    INTEGER, INTENT(IN) :: mesg_type_flags ! Types of messages that should be stored in this index.
-    INTEGER, INTENT(IN) :: min_mesg_size   ! Minimum message size.
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-                                           ! 0 on success and -1 on failure
-!***** 
-!
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_shared_mesg_index_c(fcpl_id, index_num, mesg_type_flags, min_mesg_size)
-
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_SHARED_MESG_INDEX_C'::h5pset_shared_mesg_index_c
-         !DEC$ENDIF
-         
-         INTEGER(HID_T), INTENT(IN) :: fcpl_id 
-         INTEGER, INTENT(IN) :: index_num
-         INTEGER, INTENT(IN) :: mesg_type_flags
-         INTEGER, INTENT(IN) :: min_mesg_size
-
-       END FUNCTION H5pset_shared_mesg_index_c
-    END INTERFACE
-
-    hdferr = h5pset_shared_mesg_index_c(fcpl_id, index_num, mesg_type_flags, min_mesg_size)
-
-  END SUBROUTINE h5pset_shared_mesg_index_f
-
-!****s* H5P/H5Pget_attr_creation_order_f
-! NAME
-!  H5Pget_attr_creation_order_f
-!
-! PURPOSE
-!  Retrieves tracking and indexing settings for attribute creation order
-!
-! INPUTS
-!
-!  ocpl_id         - Object (group or dataset) creation property list identifier
-!
-! OUTPUTS
-!
-!  crt_order_flags - Flags specifying whether to track and index attribute creation order
-!  hdferr	   - Error code		
-!  		 	Success:  0
-!  		 	Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February, 2008
-!
-! Fortran90 Interface:  
-  SUBROUTINE h5pget_attr_creation_order_f(ocpl_id, crt_order_flags, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: ocpl_id   ! Object (group or dataset) creation property list identifier 
-    INTEGER, INTENT(OUT) :: crt_order_flags ! Flags specifying whether to track and index attribute creation order 
-    INTEGER, INTENT(OUT) :: hdferr   ! Error code
-                                     ! 0 on success and -1 on failure
-!***** 
-!
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_attr_creation_order_c(ocpl_id, crt_order_flags)
-
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_ATTR_CREATION_ORDER_C'::h5pget_attr_creation_order_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: ocpl_id
-         INTEGER, INTENT(OUT) :: crt_order_flags
-
-       END FUNCTION H5pget_attr_creation_order_c
-    END INTERFACE
-
-    hdferr = h5pget_attr_creation_order_c(ocpl_id, crt_order_flags)
-
-  END SUBROUTINE h5pget_attr_creation_order_f
-
-!****s* H5P/H5Pset_libver_bounds_f
-! NAME
-! 	      H5Pset_libver_bounds_f
-!
-! PURPOSE
-!    Sets bounds on library versions, and indirectly format versions, to be used when creating objects.
-!
-! INPUTS
-!
-!  fapl_id - File access property list identifier
-!  low     - The earliest version of the library that will be used for writing objects.
-!  high    - The latest version of the library that will be used for writing objects.
-!
-! OUTPUTS
-!
-!  hdferr  - error code		
-!  	      Success:  0
-!  	      Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 18, 2008
-!
-! Fortran90 Interface:  
-  SUBROUTINE h5pset_libver_bounds_f(fapl_id, low, high, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: fapl_id ! File access property list identifier
-    INTEGER, INTENT(IN) :: low   ! The earliest version of the library that will be used for writing objects.
-                                 ! Currently, low must be one of two pre-defined values:
-                                 !            HDF_LIBVER_EARLIEST_F
-                                 !            HDF_LIBVER_LATEST_F
-    INTEGER, INTENT(IN) :: high  ! The latest version of the library that will be used for writing objects.
-                                 ! Currently, low must set to the pre-defined value:
-                                 !            HDF_LIBVER_LATEST_F
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code
-                                    ! 0 on success and -1 on failure
-!***** 
-!
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_libver_bounds_c(fapl_id, low, high)
-
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_LIBVER_BOUNDS_C'::h5pset_libver_bounds_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: fapl_id
-         INTEGER, INTENT(IN) :: low
-         INTEGER, INTENT(IN) :: high
-
-       END FUNCTION H5pset_libver_bounds_c
-    END INTERFACE
-
-    hdferr = h5pset_libver_bounds_c(fapl_id, low, high)
-
-  END SUBROUTINE h5pset_libver_bounds_f
-
-!****s* H5P/H5Pset_link_creation_order_f 
-! NAME
-!  H5Pset_link_creation_order_f 
-!
-! PURPOSE
-!    Sets creation order tracking and indexing for links in a group.
-!
-! INPUTS
-!
-!  gcpl_id  	   - Group creation property list identifier
-!  crt_order_flags - Creation order flag(s)
-!
-! OUTPUTS
-!
-!  hdferr	    - Error code		
-!  		 	Success:  0
-!  		 	Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 18, 2008
-!
-! Fortran90 Interface:  
-  SUBROUTINE h5pset_link_creation_order_f(gcpl_id, crt_order_flags, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: gcpl_id  ! File access property list identifier
-    INTEGER, INTENT(IN) :: crt_order_flags ! Creation order flag(s)
-    INTEGER, INTENT(OUT) :: hdferr   ! Error code
-                                     ! 0 on success and -1 on failure
-!***** 
-!
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_link_creation_order_c(gcpl_id, crt_order_flags)
-
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_LINK_CREATION_ORDER_C'::h5pset_link_creation_order_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: gcpl_id
-         INTEGER, INTENT(IN) :: crt_order_flags
-
-       END FUNCTION H5pset_link_creation_order_c
-    END INTERFACE
-
-    hdferr = h5pset_link_creation_order_c(gcpl_id, crt_order_flags)
-
-  END SUBROUTINE h5pset_link_creation_order_f
-
-!****s* H5P/H5Pget_link_phase_change_f
-! NAME
-!  H5Pget_link_phase_change_f
-!
-! PURPOSE
-!  Queries the settings for conversion between compact and dense groups.
-!
-! INPUTS
-!  
-!  gcpl_id  	- Group creation property list identifier
-! OUTPUTS
-!  
-!  max_compact  - Maximum number of attributes to be stored in compact storage
-!  min_dense    - Minimum number of attributes to be stored in dense storage
-!  hdferr       - Error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 20, 2008
-!
-! Fortran90 Interface:  
-  SUBROUTINE h5pget_link_phase_change_f(gcpl_id, max_compact, min_dense, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: gcpl_id ! Group creation property list identifier
-    INTEGER, INTENT(OUT) :: max_compact   ! Maximum number of attributes to be stored in compact storage
-    INTEGER, INTENT(OUT) :: min_dense     ! Minimum number of attributes to be stored in dense storage
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-                                          ! 0 on success and -1 on failure
-!***** 
-!
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_link_phase_change_c(gcpl_id, max_compact, min_dense)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_LINK_PHASE_CHANGE_C'::h5pget_link_phase_change_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: gcpl_id
-         INTEGER, INTENT(OUT) :: max_compact
-         INTEGER, INTENT(OUT) :: min_dense
-
-       END FUNCTION h5pget_link_phase_change_c
-    END INTERFACE
-
-    hdferr = h5pget_link_phase_change_c(gcpl_id, max_compact, min_dense)
-  END SUBROUTINE h5pget_link_phase_change_f
-
-!****s* H5P/H5Pget_obj_track_times_f 
-! NAME
-!  H5Pget_obj_track_times_f 
-!
-! PURPOSE
-!  Returns whether times are tracked for an object.
-!
-! INPUTS
-!  
-!  plist_id	- property list id
-!  flag         - object timestamp setting
-!                 .TRUE.,.FALSE.
-! OUTPUTS
-!
-!  hdferr       - error code		
-!	          Success:  0
-!	          Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 22, 2008
-!
-! Fortran90 Interface:  
-  SUBROUTINE h5pget_obj_track_times_f(plist_id, flag, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id ! Dataset creation property 
-                                           ! list identifier 
-    LOGICAL, INTENT(OUT) :: flag   ! Object timestamp setting
-    INTEGER, INTENT(OUT) :: hdferr ! Error code
-                                   ! 0 on success and -1 on failure
-!***** 
-    INTEGER :: status
-!
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_obj_track_times_c(plist_id, status)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_OBJ_TRACK_TIMES_C'::h5pget_obj_track_times_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id ! File creation property list identifier 
-         INTEGER, INTENT(OUT) :: status
-       END FUNCTION h5pget_obj_track_times_c
-    END INTERFACE
-    flag = .TRUE.
-    hdferr = h5pget_obj_track_times_c(plist_id, status)
-    IF(status.EQ.0) flag = .FALSE.
-
-  END SUBROUTINE h5pget_obj_track_times_f
-
-!****s* H5P/H5Pset_obj_track_times_f 
-! NAME
-!  H5Pset_obj_track_times_f 
-!
-! PURPOSE
-!  Set whether the birth, access, modification & change times for
-!  an object are stored.
-!
-!  Birth time is the time the object was created.  Access time is
-!  the last time that metadata or raw data was read from this
-!  object.  Modification time is the last time the data for
-!  this object was changed (either writing raw data to a dataset
-!  or inserting/modifying/deleting a link in a group).  Change
-!  time is the last time the metadata for this object was written
-!  (adding/modifying/deleting an attribute on an object, extending
-!  the size of a dataset, etc).
-!
-!   If these times are not tracked, they will be reported as
-!   12:00 AM UDT, Jan. 1, 1970 (i.e. 0 seconds past the UNIX
-!   epoch) when queried.
-!
-! INPUTS
-!  
-!  plist_id	- property list id
-!  flag         - object timestamp setting
-!                 .TRUE.,.FALSE.
-! OUTPUTS
-!
-!  hdferr       - error code		
-!	           Success:  0
-!	           Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 22, 2008
-!	
-!  
-! Fortran90 Interface:  
-  SUBROUTINE h5pset_obj_track_times_f(plist_id, flag, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id ! Dataset creation property
-                                           ! list identifier
-    LOGICAL, INTENT(IN) :: flag    ! Object timestamp setting
-    INTEGER, INTENT(OUT) :: hdferr ! Error code
-                                   ! 0 on success and -1 on failure
-!***** 
-    INTEGER :: status
-!
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_obj_track_times_c(plist_id, status)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_OBJ_TRACK_TIMES_C'::h5pset_obj_track_times_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id ! File creation property list identifier 
-         INTEGER, INTENT(IN) :: status
-       END FUNCTION h5pset_obj_track_times_c
-    END INTERFACE
-
-    status = 0
-    IF(flag) status = 1
-
-    hdferr = h5pset_obj_track_times_c(plist_id, status)
-
-  END SUBROUTINE h5pset_obj_track_times_f
-
-!****s* H5P/H5Pset_create_inter_group_f
-! NAME
-!  H5Pset_create_inter_group_f
-!
-! PURPOSE
-!  Specifies in property list whether to create missing intermediate groups.
-!
-! INPUTS
-!  
-!  lcpl_id            - Link creation property list identifier
-!  crt_intermed_group - crt_intermed_group specifying whether 
-!                       to create intermediate groups upon the creation 
-!                       of an object
-! OUTPUTS
-!
-!  hdferr	      - Error code		
-!  		 	  Success:  0
-!  		 	  Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 22, 2008
-!
-! HISTORY	
-! The long subroutine name (>31) on older f90 compilers causes problems
-!          so had to shorten the name
-! Fortran90 Interface:
-  SUBROUTINE h5pset_create_inter_group_f(lcpl_id, crt_intermed_group, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: lcpl_id      ! Link creation property list identifier
-    INTEGER, INTENT(IN) :: crt_intermed_group  ! specifying whether to create intermediate groups
-                                               ! upon the creation of an object
-    INTEGER, INTENT(OUT) :: hdferr ! Error code
-                                   ! 0 on success and -1 on failure
-!***** 
-!
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_create_inter_group_c(lcpl_id, crt_intermed_group)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_CREATE_INTER_GROUP_C'::h5pset_create_inter_group_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: lcpl_id
-         INTEGER, INTENT(IN) :: crt_intermed_group
-       END FUNCTION h5pset_create_inter_group_c
-    END INTERFACE
-
-    hdferr = h5pset_create_inter_group_c(lcpl_id, crt_intermed_group)
-
-  END SUBROUTINE h5pset_create_inter_group_f
-
-!****s* H5P/H5Pget_link_creation_order_f
-! NAME
-!  H5Pget_link_creation_order_f
-!
-! PURPOSE
-!  Queries whether link creation order is tracked and/or indexed in a group.
-!
-! INPUTS
-!
-!  gcpl_id - Group creation property list identifier
-!
-! OUTPUTS
-!
-!  crt_order_flags - Creation order flag(s)
-!  hdferr	   - Error code		
-!  		      Success:  0
-!  		      Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 3, 2008
-!
-! Fortran90 Interface:  
-  SUBROUTINE h5pget_link_creation_order_f(gcpl_id, crt_order_flags, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: gcpl_id   ! Group creation property list identifier
-    INTEGER, INTENT(OUT) :: crt_order_flags ! Creation order flag(s)
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-                                            ! 0 on success and -1 on failure
-!***** 
-!
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_link_creation_order_c(gcpl_id, crt_order_flags)
-
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_LINK_CREATION_ORDER_C'::h5pget_link_creation_order_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: gcpl_id
-         INTEGER, INTENT(OUT) :: crt_order_flags
-
-       END FUNCTION H5pget_link_creation_order_c
-    END INTERFACE
-
-    hdferr = h5pget_link_creation_order_c(gcpl_id, crt_order_flags)
-
-  END SUBROUTINE h5pget_link_creation_order_f
-
-!****s* H5P/H5Pset_char_encoding_f
-! NAME
-!  H5Pset_char_encoding_f
-!
-! PURPOSE
-!  Sets the character encoding used to encode a string.
-!
-! INPUTS
-!
-!  plist_id - Property list identifier
-!  encoding - Valid values for encoding are:
-!     	        H5T_CSET_ASCII_F -> US ASCII
-!     	        H5T_CSET_UTF8_F -> UTF-8 Unicode encoding
-!
-! OUTPUTS
-!  hdferr   - Error code		
-!  	        Success:  0
-!  		Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 3, 2008
-!
-! Fortran90 Interface:  
-  SUBROUTINE h5pset_char_encoding_f(plist_id, encoding, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id ! Property list identifier
-    INTEGER, INTENT(IN) :: encoding        ! String encoding character set:
-     	                                   !   H5T_CSET_ASCII_F -> US ASCII
-     	                                   !   H5T_CSET_UTF8_F  -> UTF-8 Unicode encoding
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-                                           ! 0 on success and -1 on failure
-!***** 
-!
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_char_encoding_c(plist_id, encoding)
-
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_CHAR_ENCODING_C'::h5pset_char_encoding_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-         INTEGER, INTENT(IN) :: encoding
-
-       END FUNCTION H5pset_char_encoding_c
-    END INTERFACE
-
-    hdferr = h5pset_char_encoding_c(plist_id, encoding)
-
-  END SUBROUTINE h5pset_char_encoding_f
-
-!****s* H5P/H5Pget_char_encoding_f
-! NAME
-!  H5Pget_char_encoding_f
-!
-! PURPOSE
-!  Retrieves the character encoding used to create a string
-!
-! INPUTS
-!
-!  plist_id - Property list identifier
-!
-! OUTPUTS
-!
-!  encoding - Valid values for encoding are:
-!     	        H5T_CSET_ASCII_F -> US ASCII
-!     	        H5T_CSET_UTF8_F -> UTF-8 Unicode encoding
-!  hdferr   - Error code		
-!               Success:  0
-!               Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 3, 2008
-!
-! Fortran90 Interface:  
-  SUBROUTINE  h5pget_char_encoding_f(plist_id, encoding, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id ! Property list identifier
-
-    INTEGER, INTENT(OUT) :: encoding       ! Valid values for encoding are:
-     	                                   !  H5T_CSET_ASCII_F -> US ASCII
-     	                                   !  H5T_CSET_UTF8_F  -> UTF-8 Unicode encoding
-    INTEGER, INTENT(OUT) :: hdferr   ! Error code
-                                     ! 0 on success and -1 on failure
-!***** 
-!
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_char_encoding_c(plist_id, encoding)
-
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_CHAR_ENCODING_C'::h5pget_char_encoding_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-         INTEGER, INTENT(OUT) :: encoding
-
-       END FUNCTION H5pget_char_encoding_c
-    END INTERFACE
-
-    hdferr = h5pget_char_encoding_c(plist_id, encoding)
-
-  END SUBROUTINE h5pget_char_encoding_f
-
-!****s* H5P/h5pset_copy_object_f
-! NAME
-!  h5pset_copy_object_f 
-!
-! PURPOSE
-!  Sets properties to be used when an object is copied.
-!
-! INPUTS
-! 
-!  ocp_plist_id - Object copy property list identifier
-!  copy_options - Copy option(s) to be set
-! OUTPUTS
-!  
-!  hdferr	- error code		
-!  		   Success:  0
-!  		   Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 3, 2008
-!
-! HISTORY
-!
-!  
-! Fortran90 Interface:  
-  SUBROUTINE h5pset_copy_object_f(ocp_plist_id, copy_options, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: ocp_plist_id ! Object copy property list identifier
-    INTEGER, INTENT(IN) :: copy_options ! Copy option(s) to be set, valid options are:
-                                        !   H5O_COPY_SHALLOW_HIERARCHY_F
-                                        !   H5O_COPY_EXPAND_SOFT_LINK_F
-                                        !   H5O_COPY_EXPAND_EXT_LINK_F
-                                        !   H5O_COPY_EXPAND_REFERENCE_F
-                                        !   H5O_COPY_WITHOUT_ATTR_FLAG_F
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-                                        ! 0 on success and -1 on failure
-!***** 
-
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_copy_object_c(ocp_plist_id, copy_options)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_COPY_OBJECT_C'::h5pset_copy_object_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: ocp_plist_id
-         INTEGER, INTENT(IN) :: copy_options
-       END FUNCTION h5pset_copy_object_c
-    END INTERFACE
-    hdferr = h5pset_copy_object_c(ocp_plist_id, copy_options)
-  END SUBROUTINE h5pset_copy_object_f
-
-!****s* H5P/h5pget_copy_object_f
-! NAME
-!  h5pget_copy_object_f 
-!
-! PURPOSE
-!  Retrieves the properties to be used when an object is copied.
-!
-! INPUTS
-! 
-!  ocp_plist_id - Object copy property list identifier
-! OUTPUTS
-!  
-!  copy_options - Copy option(s) to be get
-!  hdferr	- Error code		
-!  		   Success:  0
-!  		   Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 3, 2008
-!
-! HISTORY
-!
-!  
-! Fortran90 Interface:
-  SUBROUTINE h5pget_copy_object_f(ocp_plist_id, copy_options, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: ocp_plist_id ! Object copy property list identifier
-    INTEGER, INTENT(OUT) :: copy_options       ! Valid copy options returned are:
-                                               !   H5O_COPY_SHALLOW_HIERARCHY_F
-                                               !   H5O_COPY_EXPAND_SOFT_LINK_F 
-                                               !   H5O_COPY_EXPAND_EXT_LINK_F
-                                               !   H5O_COPY_EXPAND_REFERENCE_F
-                                               !   H5O_COPY_WITHOUT_ATTR_FLAG_F
-    INTEGER, INTENT(OUT) :: hdferr             ! Error code
-                                               ! 0 on success and -1 on failure
-!***** 
-
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_copy_object_c(ocp_plist_id, copy_options)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_COPY_OBJECT_C'::h5pget_copy_object_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: ocp_plist_id
-         INTEGER, INTENT(OUT) :: copy_options
-       END FUNCTION h5pget_copy_object_c
-    END INTERFACE
-    hdferr = h5pget_copy_object_c(ocp_plist_id, copy_options)
-  END SUBROUTINE h5pget_copy_object_f
-
-!****s* H5P/h5pget_data_transform_f 
-! NAME
-!  h5pget_data_transform_f 
-!
-! PURPOSE
-!  Retrieves a data transform expression.
-!
-! INPUTS
-! 
-!  plist_id   - Identifier of the property list or class
-! OUTPUTS
-!  
-!  expression - buffer to hold transform expression
-!  hdferr     - Error code
-!                 Success:  Actual lenght of the expression
-!                           If provided buffer "expression" is 
-!                           smaller, than expression will be 
-!                           truncated to fit into
-!                           provided user buffer
-!  		  Failure: -1
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 19, 2008
-!
-! HISTORY
-!
-! Should hdferr return just 0 or 1 and add another arguement for the size?
-! Fortran90 Interface:
-SUBROUTINE h5pget_data_transform_f(plist_id, expression, hdferr, size)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id         ! Identifier of the property list or class
-    CHARACTER(LEN=*), INTENT(OUT) :: expression    ! Buffer to hold transform expression
-    INTEGER(SIZE_T), INTENT(OUT), OPTIONAL :: size ! Registered size of the transform expression
-    INTEGER, INTENT(OUT) :: hdferr                 ! Error code
-                                                   !  0 on success and -1 on failure
-!***** 
-    INTEGER :: expression_len
-    INTEGER(SIZE_T) :: size_default
-
-
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_data_transform_c(plist_id, expression, expression_len, size_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_DATA_TRANSFORM_C'::h5pget_data_transform_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: expression
-         INTEGER(HID_T), INTENT(IN) :: plist_id 
-         CHARACTER(LEN=*), INTENT(OUT) :: expression 
-         INTEGER(SIZE_T) :: size_default
-         INTEGER :: expression_len
-       END FUNCTION h5pget_data_transform_c
-    END INTERFACE
-
-    size_default = 0
-    expression_len = LEN(expression)
-
-    hdferr = h5pget_data_transform_c(plist_id, expression, expression_len, size_default)
-
-    IF(present(size)) size = size_default
-
-  END SUBROUTINE h5pget_data_transform_f
-
-!****s* H5P/h5pset_data_transform_f 
-! NAME
-!  h5pset_data_transform_f 
-!
-! PURPOSE
-!  Sets a data transform expression.
-!
-! INPUTS
-! 
-!  plist_id   - Identifier of the property list or class 
-!  expression - Buffer to hold transform expression
-! OUTPUTS
-! 
-!  hdferr     - error code
-!                 Success:  0
-!  		  Failure: -1
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 19, 2008
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_data_transform_f(plist_id, expression, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist_id     ! Identifier of the property list or class
-    CHARACTER(LEN=*), INTENT(IN) :: expression ! Buffer to hold transform expression
-    INTEGER, INTENT(OUT) :: hdferr             ! Error code
-                                               ! 0 on success and -1 on failure
-!***** 
-    INTEGER :: expression_len
-
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_data_transform_c(plist_id, expression, expression_len)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_DATA_TRANSFORM_C'::h5pset_data_transform_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: expression
-         INTEGER(HID_T), INTENT(IN) :: plist_id 
-         CHARACTER(LEN=*), INTENT(IN) :: expression
-         INTEGER :: expression_len
-       END FUNCTION h5pset_data_transform_c
-    END INTERFACE
-
-    expression_len = LEN(expression)
-    hdferr = h5pset_data_transform_c(plist_id, expression, expression_len)
-
-  END SUBROUTINE h5pset_data_transform_f
-
-!****s* H5P/H5Pget_local_heap_size_hint_f 
-! NAME
-!  H5Pget_local_heap_size_hint_f 
-!
-! PURPOSE
-!  Queries the local heap size hint for original-style groups.
-!
-! INPUTS
-! 
-!  gcpl_id   - Group creation property list identifier
-! OUTPUTS
-!
-!  size_hint - Hint for size of local heap
-!  hdferr    - Error code
-!               Success:  0
-!  		Failure: -1
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 21, 2008
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pget_local_heap_size_hint_f(gcpl_id, size_hint, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: gcpl_id     ! Group creation property list identifier
-    INTEGER(SIZE_T), INTENT(OUT) :: size_hint ! Hint for size of local heap
-    INTEGER, INTENT(OUT) :: hdferr            ! Error code
-                                              ! 0 on success and -1 on failure
-!***** 
-
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_local_heap_size_hint_c(gcpl_id, size_hint)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_LOCAL_HEAP_SIZE_HINT_C'::h5pget_local_heap_size_hint_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: gcpl_id
-         INTEGER(SIZE_T), INTENT(OUT) :: size_hint
-       END FUNCTION H5Pget_local_heap_size_hint_c
-    END INTERFACE
-
-    hdferr = H5Pget_local_heap_size_hint_c(gcpl_id, size_hint)
-
-  END SUBROUTINE h5pget_local_heap_size_hint_f
-
-!****s* H5P/H5Pget_est_link_info_f 
-! NAME
-!  H5Pget_est_link_info_f 
-!
-! PURPOSE
-!  Queries data required to estimate required local heap or object header size.
-!
-! INPUTS
-! 
-!  gcpl_id         - Group creation property list identifier
-! OUTPUTS
-!  
-!  est_num_entries - Estimated number of links to be inserted into group
-!  est_name_len    - Estimated average length of link names
-!  hdferr	   - Error code
-!                     Success:  0
-!  		      Failure: -1
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 21, 2008
-!
-! HISTORY
-!
-! 
-! Fortran90 Interface:
-  SUBROUTINE h5pget_est_link_info_f(gcpl_id, est_num_entries, est_name_len, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: gcpl_id   ! Group creation property list identifier  
-    INTEGER, INTENT(OUT) :: est_num_entries ! Estimated number of links to be inserted into group
-    INTEGER, INTENT(OUT) :: est_name_len    ! Estimated average length of link names
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-                                            ! 0 on success and -1 on failure
-!***** 
-
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_est_link_info_c(gcpl_id, est_num_entries, est_name_len)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_EST_LINK_INFO_C'::h5pget_est_link_info_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: gcpl_id  
-         INTEGER, INTENT(OUT) :: est_num_entries
-         INTEGER, INTENT(OUT) :: est_name_len
-       END FUNCTION h5pget_est_link_info_c
-    END INTERFACE
-
-    hdferr = h5pget_est_link_info_c(gcpl_id, est_num_entries, est_name_len)
-
-  END SUBROUTINE h5pget_est_link_info_f
-
-!****s* H5P/H5Pset_local_heap_size_hint_f 
-! NAME
-!  H5Pset_local_heap_size_hint_f 
-!
-! PURPOSE
-!  Sets the local heap size hint for original-style groups.
-!
-! INPUTS
-! 
-!  gcpl_id   - Group creation property list identifier
-!  size_hint - Hint for size of local heap
-! OUTPUTS
-!
-!  hdferr    - Error code
-!               Success:  0
-!  		Failure: -1
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 21, 2008
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_local_heap_size_hint_f(gcpl_id, size_hint, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: gcpl_id    ! Group creation property list identifier
-    INTEGER(SIZE_T), INTENT(IN) :: size_hint ! Hint for size of local heap
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-                                             ! 0 on success and -1 on failure
-!***** 
-
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_local_heap_size_hint_c(gcpl_id, size_hint)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_LOCAL_HEAP_SIZE_HINT_C'::h5pset_local_heap_size_hint_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: gcpl_id
-         INTEGER(SIZE_T), INTENT(IN) :: size_hint
-       END FUNCTION h5pset_local_heap_size_hint_c
-    END INTERFACE
-
-    hdferr = H5Pset_local_heap_size_hint_c(gcpl_id, size_hint)
-
-  END SUBROUTINE h5pset_local_heap_size_hint_f
-
-!****s* H5P/h5pset_est_link_info_f 
-! NAME
-!  h5pset_est_link_info_f 
-!
-! PURPOSE
-!  Sets estimated number of links and length of link names in a group.
-!
-! INPUTS
-! 
-! gcpl_id         - Group creation property list identifier  
-! est_num_entries - Estimated number of links to be inserted into group
-! est_name_len    - Estimated average length of link names
-! OUTPUTS
-!
-!  hdferr	  - Error code
-!                    Success:  0
-!  		     Failure: -1
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 21, 2008
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_est_link_info_f(gcpl_id, est_num_entries, est_name_len, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: gcpl_id  ! Group creation property list identifier  
-    INTEGER, INTENT(IN) :: est_num_entries ! Estimated number of links to be inserted into group
-    INTEGER, INTENT(IN) :: est_name_len    ! Estimated average length of link names
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-                                           ! 0 on success and -1 on failure
-!***** 
-
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_est_link_info_c(gcpl_id, est_num_entries, est_name_len)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_EST_LINK_INFO_C'::h5pset_est_link_info_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: gcpl_id  
-         INTEGER, INTENT(IN) :: est_num_entries
-         INTEGER, INTENT(IN) :: est_name_len
-       END FUNCTION h5pset_est_link_info_c
-    END INTERFACE
-
-    hdferr = H5Pset_est_link_info_c(gcpl_id, est_num_entries, est_name_len)
-
-  END SUBROUTINE h5pset_est_link_info_f
-
-!****s* H5P/h5pset_link_phase_change_f
-! NAME
-!  h5pset_link_phase_change_f
-!
-! PURPOSE
-!  Sets the parameters for conversion between compact and dense groups.
-!
-! INPUTS
-!  
-!  gcpl_id         - Group creation property list identifier  
-!  max_compact     - Maximum number of attributes to be stored in compact storage
-!  min_dense       - Minimum number of attributes to be stored in dense storage
-! OUTPUTS
-!
-!  hdferr          - error code		
-!	              Success:  0
-!	              Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 21, 2008
-!
-! Fortran90 Interface:
-SUBROUTINE h5pset_link_phase_change_f(gcpl_id, max_compact, min_dense, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: gcpl_id ! Group creation property list identifier
-    INTEGER, INTENT(IN) :: max_compact    ! Maximum number of attributes to be stored in compact storage
-    INTEGER, INTENT(IN) :: min_dense      ! Minimum number of attributes to be stored in dense storage
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-                                          ! 0 on success and -1 on failure
-!***** 
-!
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_link_phase_change_c(gcpl_id, max_compact, min_dense)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_LINK_PHASE_CHANGE_C'::h5pset_link_phase_change_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: gcpl_id
-         INTEGER, INTENT(IN) :: max_compact
-         INTEGER, INTENT(IN) :: min_dense
-
-       END FUNCTION h5pset_link_phase_change_c
-    END INTERFACE
-
-    hdferr = h5pset_link_phase_change_c(gcpl_id, max_compact, min_dense)
-  END SUBROUTINE h5pset_link_phase_change_f
-
-!****s* H5P/h5pset_fapl_direct_f
-! NAME
-!  h5pset_fapl_direct_f
-!
-! PURPOSE
-!  Sets up use of the direct I/O driver.
-!
-! INPUTS
-!  
-!  fapl_id 	- File access property list identifier
-!  alignment 	- Required memory alignment boundary
-!  block_size   - File system block size
-!  cbuf_size 	- Copy buffer size
-! OUTPUTS
-!
-!  hdferr       - error code		
-!                  Success:  0
-!                  Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 21, 2008
-!
-! Fortran90 Interface:
-SUBROUTINE h5pset_fapl_direct_f(fapl_id, alignment, block_size, cbuf_size, hdferr)
-    IMPLICIT NONE  
-    INTEGER(HID_T), INTENT(IN) :: fapl_id     ! File access property list identifier
-    INTEGER(SIZE_T), INTENT(IN) :: alignment  ! Required memory alignment boundary!
-    INTEGER(SIZE_T), INTENT(IN) :: block_size ! File system block size
-    INTEGER(SIZE_T), INTENT(IN) :: cbuf_size  ! Copy buffer size
-    INTEGER, INTENT(OUT) :: hdferr            ! Error code
-                                              ! 0 on success and -1 on failure
-!***** 
-!
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_fapl_direct_c(fapl_id, alignment, block_size, cbuf_size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_FAPL_DIRECT_C'::h5pset_fapl_direct_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: fapl_id 
-         INTEGER(SIZE_T), INTENT(IN) :: alignment
-         INTEGER(SIZE_T), INTENT(IN) :: block_size
-         INTEGER(SIZE_T), INTENT(IN) :: cbuf_size
-       END FUNCTION h5pset_fapl_direct_c
-    END INTERFACE
-
-    hdferr = H5Pset_fapl_direct_c(fapl_id, alignment, block_size, cbuf_size)
-  END SUBROUTINE h5pset_fapl_direct_f
-
-!****s* H5P/h5pget_fapl_direct_f
-! NAME
-!  h5pget_fapl_direct_f
-!
-! PURPOSE
-!  Gets up use of the direct I/O driver.
-!
-! INPUTS
-!  
-!  fapl_id 	- File access property list identifier
-! OUTPUTS
-!
-!  alignment 	- Required memory alignment boundary
-!  block_size   - File system block size
-!  cbuf_size 	- Copy buffer size
-!  hdferr       - error code		
-!                  Success:  0
-!                  Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 21, 2008
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pget_fapl_direct_f(fapl_id, alignment, block_size, cbuf_size, hdferr)
-    IMPLICIT NONE  
-    INTEGER(HID_T), INTENT(IN) :: fapl_id       ! File access property list identifier
-    INTEGER(SIZE_T), INTENT(OUT) :: alignment   ! Required memory alignment boundary!
-    INTEGER(SIZE_T), INTENT(OUT) :: block_size  ! File system block size
-    INTEGER(SIZE_T), INTENT(OUT) :: cbuf_size   ! Copy buffer size
-    INTEGER, INTENT(OUT) :: hdferr              ! Error code
-                                                ! 0 on success and -1 on failure
-!***** 
-!
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_fapl_direct_c(fapl_id, alignment, block_size, cbuf_size)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_FAPL_DIRECT_C'::h5pget_fapl_direct_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: fapl_id 
-         INTEGER(SIZE_T), INTENT(OUT) :: alignment
-         INTEGER(SIZE_T), INTENT(OUT) :: block_size
-         INTEGER(SIZE_T), INTENT(OUT) :: cbuf_size
-       END FUNCTION h5pget_fapl_direct_c
-    END INTERFACE
-
-    hdferr = H5Pget_fapl_direct_c(fapl_id, alignment, block_size, cbuf_size)
-  END SUBROUTINE h5pget_fapl_direct_f
-
-!****s* H5P/H5Pset_attr_phase_change_f
-! NAME
-!  H5Pset_attr_phase_change_f 
-!
-! PURPOSE
-!  Sets attribute storage phase change thresholds.
-!
-! INPUTS
-!  
-!  ocpl_id - Object (dataset or group) creation property list identifier
-! OUTPUTS
-!  
-!  max_compact     - Maximum number of attributes to be stored in compact storage
-!                    (Default: 8)
-!  min_dense       - Minimum number of attributes to be stored in dense storage
-!                    (Default: 6)
-!  hdferr          - Error code		
-!	              Success:  0
-!	              Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  January, 2008
-!
-! Fortran90 Interface:
-SUBROUTINE h5pset_attr_phase_change_f(ocpl_id, max_compact, min_dense, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: ocpl_id ! Object (dataset or group) creation property list identifier
-    INTEGER, INTENT(IN) :: max_compact    ! Maximum number of attributes to be stored in compact storage
-                                          !(Default: 8)
-    INTEGER, INTENT(IN) :: min_dense      ! Minimum number of attributes to be stored in dense storage
-                                          ! (Default: 6)
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-                                          ! 0 on success and -1 on failure
-!***** 
-!
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_attr_phase_change_c(ocpl_id, max_compact, min_dense)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_ATTR_PHASE_CHANGE_C'::h5pset_attr_phase_change_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: ocpl_id
-         INTEGER, INTENT(IN) :: max_compact
-         INTEGER, INTENT(IN) :: min_dense
-
-       END FUNCTION h5pset_attr_phase_change_c
-    END INTERFACE
-
-    hdferr = h5pset_attr_phase_change_c(ocpl_id, max_compact, min_dense)
-
-
-  END SUBROUTINE h5pset_attr_phase_change_f
-
-!****s* H5P/H5Pset_nbit_f
-! NAME
-!  H5Pset_nbit_f 
-!
-! PURPOSE
-!  Sets up the use of the N-Bit filter.
-!
-! Inputs:
-!  plist_id - Dataset creation property list identifier.
-!
-! Outputs:
-!  hdferr   - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 21, 2008
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_nbit_f(plist_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN)  :: plist_id
-    INTEGER       , INTENT(OUT) :: hdferr
-!*****
-    INTERFACE
-       INTEGER FUNCTION H5Pset_nbit_c(plist_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_NBIT_C'::h5pset_nbit_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-       END FUNCTION H5Pset_nbit_c
-    END INTERFACE
-
-    hdferr = H5Pset_nbit_c(plist_id)
-
-  END SUBROUTINE h5pset_nbit_f
-
-!****s* H5P/h5pset_scaleoffset_f
-! NAME
-!  h5pset_scaleoffset_f 
-!
-! PURPOSE
-!  Sets up the use of the scale-offset filter.
-!
-! Inputs:
-!  plist_id     - Dataset creation property list identifier.
-!  scale_type   - Flag indicating compression method. Valid values:
-!                    H5Z_SO_FLOAT_DSCALE_F
-!                    H5Z_SO_FLOAT_ESCALE_F
-!                    H5Z_SO_INT_F
-!
-!  scale_factor - Parameter related to scale.
-!
-! Outputs:
-!  hdferr       - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 21, 2008
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_scaleoffset_f(plist_id, scale_type, scale_factor, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN)  :: plist_id
-    INTEGER       , INTENT(IN)  :: scale_type
-    INTEGER       , INTENT(IN)  :: scale_factor
-    INTEGER       , INTENT(OUT) :: hdferr
-!***** 
-
-    INTERFACE
-       INTEGER FUNCTION h5pset_scaleoffset_c(plist_id, scale_type, scale_factor)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_SCALEOFFSET_C'::h5pset_scaleoffset_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: plist_id
-         INTEGER, INTENT(IN) :: scale_type
-         INTEGER, INTENT(IN) :: scale_factor
-       END FUNCTION h5pset_scaleoffset_c
-    END INTERFACE
-
-    hdferr = H5Pset_scaleoffset_c(plist_id, scale_type, scale_factor)
-
-  END SUBROUTINE h5pset_scaleoffset_f
-
-!****s* H5P/h5pset_nlinks_f 
-! NAME
-!  h5pset_nlinks_f 
-!
-! PURPOSE
-!  Sets maximum number of soft or user-defined link traversals.
-!
-! INPUTS
-! 
-!  lapl_id - File access property list identifier
-!   nlinks - Maximum number of links to traverse
-!
-! OUTPUTS
-!
-!  hdferr  - Error code
-!             Success:  0
-!  	      Failure: -1
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 24, 2008
-!
-! HISTORY
-!
-! 
-! Fortran90 Interface:
-  SUBROUTINE h5pset_nlinks_f(lapl_id, nlinks, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: lapl_id ! File access property list identifier
-    INTEGER(SIZE_T), INTENT(IN) :: nlinks ! Maximum number of links to traverse
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code   
-                                          ! 0 on success and -1 on failure
-!*****      
-
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pset_nlinks_c(lapl_id, nlinks)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_NLINKS_C'::h5pset_nlinks_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: lapl_id
-         INTEGER(SIZE_T), INTENT(IN) :: nlinks
-       END FUNCTION h5pset_nlinks_c
-    END INTERFACE
-
-    hdferr = h5pset_nlinks_c(lapl_id, nlinks)
-
-  END SUBROUTINE h5pset_nlinks_f
-
-!****s* H5P/h5pget_nlinks_f 
-! NAME
-!  h5pget_nlinks_f 
-!
-! PURPOSE
-!  Gets maximum number of soft or user-defined link traversals.
-!
-! INPUTS
-! 
-!  lapl_id - File access property list identifier
-!  nlinks  - Maximum number of links to traverse
-!
-! OUTPUTS
-!
-!  hdferr  - error code
-!             Success:  0
-!  	      Failure: -1
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 24, 2008
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pget_nlinks_f(lapl_id, nlinks, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: lapl_id  ! File access property list identifier
-    INTEGER(SIZE_T), INTENT(OUT) :: nlinks ! Maximum number of links to traverse
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-                                           ! 0 on success and -1 on failure
-!***** 
-!  MS FORTRAN needs explicit interface for C functions called here.
-!
-    INTERFACE
-       INTEGER FUNCTION h5pget_nlinks_c(lapl_id, nlinks)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_NLINKS_C'::h5pget_nlinks_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: lapl_id
-         INTEGER(SIZE_T), INTENT(OUT) :: nlinks
-       END FUNCTION h5pget_nlinks_c
-    END INTERFACE
-
-    hdferr = h5pget_nlinks_c(lapl_id, nlinks)
-
-  END SUBROUTINE h5pget_nlinks_f
-
-!****s* H5P/H5Pget_create_inter_group_f
-! NAME
-!  H5Pget_create_inter_group_f
-!
-! PURPOSE
-!  Determines whether property is set to enable creating missing intermediate groups.
-!
-! INPUTS
-!  
-!  lcpl_id            - Link creation property list identifier
-!  crt_intermed_group - Specifying whether to create intermediate groups upon 
-!                       the creation of an object
-! OUTPUTS
-!
-!  hdferr	      - Error code		
-!  		 	 Success:  0
-!  		 	 Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  April 4, 2008
-!
-! HISTORY
-! 	
-! The long subroutine name (>31) on older f90 compilers causes problems
-!          so the name was shortened
-! Fortran90 Interface:
-  SUBROUTINE h5pget_create_inter_group_f(lcpl_id, crt_intermed_group, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: lcpl_id      ! Link creation property list identifier
-    INTEGER, INTENT(IN) :: crt_intermed_group  ! Flag specifying whether to create intermediate groups
-                                               ! upon creation of an object
-    INTEGER, INTENT(OUT) :: hdferr             ! Error code
-                                               ! 0 on success and -1 on failure
-!***** 
-    INTERFACE
-       INTEGER FUNCTION h5pget_create_inter_group_c(lcpl_id, crt_intermed_group)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_CREATE_INTER_GROUP_C'::h5pget_create_inter_group_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: lcpl_id
-         INTEGER, INTENT(IN) :: crt_intermed_group
-       END FUNCTION h5pget_create_inter_group_c
-    END INTERFACE
-
-    hdferr = h5pget_create_inter_group_c(lcpl_id, crt_intermed_group)
-
-  END SUBROUTINE h5pget_create_inter_group_f
-
-!****s* H5P/H5Pset_chunk_cache_f
-! NAME
-!  H5Pset_chunk_cache_f
-!
-! PURPOSE
-!  Set the number of objects in the meta data cache and the
-!  maximum number of chunks and bytes in the raw data chunk cache.
-!  Once set, these values will override the values in the file access
-!  property list.  Each of these values can be individually unset
-!  (or not set at all) by passing the macros:
-!    H5D_CHUNK_CACHE_NSLOTS_DFLT_F,
-!    H5D_CHUNK_CACHE_NBYTES_DFLT_F, and/or
-!    H5D_CHUNK_CACHE_W0_DFLT_F
-!    as appropriate.
-!
-!  The RDCC_W0 value should be between 0 and 1 inclusive and
-!  indicates how much chunks that have been fully read or fully
-!  written are favored for preemption.  A value of zero means
-!  fully read or written chunks are treated no differently than
-!  other chunks (the preemption is strictly LRU) while a value
-!  of one means fully read chunks are always preempted before
-!  other chunks.
-!
-! INPUTS
-!  
-!  dapl_id          - Dataset access property list identifier.
-!  rdcc_nslots      - The number of chunk slots in the raw data chunk cache for this dataset.
-!  rdcc_nbytes      - The total size of the raw data chunk cache for this dataset.
-!  rdcc_w0          - The chunk preemption policy for this dataset.
-! OUTPUTS
-!
-!  hdferr	    - Error code		
-!  		 	Success:  0
-!  		 	Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  April 13, 2009
-!
-! HISTORY
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pset_chunk_cache_f(dapl_id, rdcc_nslots, rdcc_nbytes, rdcc_w0, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dapl_id      ! Dataset access property list identifier.
-    INTEGER(SIZE_T), INTENT(IN) :: rdcc_nslots ! The number of chunk slots in the raw data 
-                                               ! chunk cache for this dataset.
-    INTEGER(SIZE_T), INTENT(IN) :: rdcc_nbytes ! The total size of the raw data chunk cache 
-                                               ! for this dataset.
-    REAL, INTENT(IN) :: rdcc_w0                ! The chunk preemption policy for this dataset.
-    INTEGER, INTENT(OUT) :: hdferr             ! Error code
-                                               ! 0 on success and -1 on failure
-!*****       
-
-    INTERFACE
-       INTEGER FUNCTION h5pset_chunk_cache_c(dapl_id, rdcc_nslots, rdcc_nbytes, rdcc_w0)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_CHUNK_CACHE_C'::h5pset_chunk_cache_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dapl_id
-         INTEGER(SIZE_T), INTENT(IN) :: rdcc_nslots
-         INTEGER(SIZE_T), INTENT(IN) :: rdcc_nbytes
-         REAL, INTENT(IN) :: rdcc_w0
-       END FUNCTION h5pset_chunk_cache_c
-    END INTERFACE
-
-    hdferr = h5pset_chunk_cache_c(dapl_id, rdcc_nslots, rdcc_nbytes, rdcc_w0)
-
-  END SUBROUTINE h5pset_chunk_cache_f
-
-!****s* H5P/H5Pget_chunk_cache_f
-! NAME
-!  H5Pget_chunk_cache_f
-!
-! PURPOSE
-!  Retrieves the maximum possible number of elements in the meta
-!  data cache and the maximum possible number of elements and
-!  bytes and the RDCC_W0 value in the raw data chunk cache.  Any
-!  (or all) arguments may be null pointers in which case the
-!  corresponding datum is not returned.  If these properties have
-!  not been set on this property list, the default values for a
-!  file access property list are returned.
-!
-! INPUTS
-!  
-!  dapl_id            - Dataset access property list identifier.
-! OUTPUTS
-! 
-!  rdcc_nslots        - Number of chunk slots in the raw data chunk cache hash table. 
-!  rdcc_nbytes        - Total size of the raw data chunk cache, in bytes. 
-!  rdcc_w0            - Preemption policy. 
-!  hdferr	      - Error code		
-!  		 	 Success:  0
-!  		 	 Failure: -1   
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  April 13, 2009
-!
-! HISTORY
-!
-! Fortran90 Interface:
-  SUBROUTINE h5pget_chunk_cache_f(dapl_id, rdcc_nslots, rdcc_nbytes, rdcc_w0, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dapl_id       ! Dataset access property list identifier.
-    INTEGER(SIZE_T), INTENT(OUT) :: rdcc_nslots ! Number of chunk slots in the raw data chunk cache hash table.
-    INTEGER(SIZE_T), INTENT(OUT) :: rdcc_nbytes ! Total size of the raw data chunk cache, in bytes. 
-    REAL, INTENT(OUT) :: rdcc_w0                ! Preemption policy.
-    INTEGER, INTENT(OUT) :: hdferr              ! Error code:
-                                                ! 0 on success and -1 on failure
-!*****    
-    INTERFACE
-       INTEGER FUNCTION h5pget_chunk_cache_c(dapl_id, rdcc_nslots, rdcc_nbytes, rdcc_w0)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_CHUNK_CACHE_C'::h5pget_chunk_cache_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dapl_id
-         INTEGER(SIZE_T), INTENT(OUT) :: rdcc_nslots
-         INTEGER(SIZE_T), INTENT(OUT) :: rdcc_nbytes
-         REAL, INTENT(OUT) :: rdcc_w0
-       END FUNCTION h5pget_chunk_cache_c
-    END INTERFACE
-
-    hdferr = h5pget_chunk_cache_c(dapl_id, rdcc_nslots, rdcc_nbytes, rdcc_w0)
-
-  END SUBROUTINE h5pget_chunk_cache_f
-
-END MODULE H5P
-
-
-
diff --git a/fortran/src/H5Pff_F03.f90 b/fortran/src/H5Pff_F03.f90
deleted file mode 100644
index 01d1d98..0000000
--- a/fortran/src/H5Pff_F03.f90
+++ /dev/null
@@ -1,1267 +0,0 @@
-!****h* ROBODoc/H5P (F03)
-!
-! NAME
-!  H5P_PROVISIONAL
-!
-! PURPOSE
-!  This file contains Fortran 90 and Fortran 2003 interfaces for H5P functions.
-!  It contains the same functions as H5Pff_F90.f90 but includes the
-!  Fortran 2003 functions and the interface listings. This file will be compiled
-!  instead of H5Pff_F90.f90 if Fortran 2003 functions are enabled.
-!
-! COPYRIGHT
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!  Copyright by The HDF Group.                                               *
-!  Copyright by the Board of Trustees of the University of Illinois.         *
-!  All rights reserved.                                                      *
-!  *
-!  This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!  terms governing use, modification, and redistribution, is contained in    *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!  of the source code distribution tree; Copyright.html can be found at the  *
-!  root level of an installed copy of the electronic HDF5 document set and   *
-!  is linked from the top-level documents page.  It can also be found at     *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!  access to either file, you may request a copy from help at hdfgroup.org.     *
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5P function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5P_PROVISIONAL
-
-  USE H5GLOBAL
-
-  INTERFACE h5pset_fill_value_f
-     MODULE PROCEDURE h5pset_fill_value_integer
-     MODULE PROCEDURE h5pset_fill_value_real
-     MODULE PROCEDURE h5pset_fill_value_char
-     ! Recommended procedure:
-     MODULE PROCEDURE h5pset_fill_value_ptr
-
-  END INTERFACE
-
-  INTERFACE h5pget_fill_value_f
-     MODULE PROCEDURE h5pget_fill_value_integer
-     MODULE PROCEDURE h5pget_fill_value_real
-     MODULE PROCEDURE h5pget_fill_value_char
-     ! Recommended procedure:
-     MODULE PROCEDURE h5pget_fill_value_ptr
-
-  END INTERFACE
-
-  INTERFACE h5pset_f
-     MODULE PROCEDURE h5pset_integer
-     MODULE PROCEDURE h5pset_real
-     MODULE PROCEDURE h5pset_char
-     ! Recommended procedure:
-     MODULE PROCEDURE h5pset_ptr
-
-  END INTERFACE
-
-  INTERFACE h5pget_f
-     MODULE PROCEDURE h5pget_integer
-     MODULE PROCEDURE h5pget_real
-     MODULE PROCEDURE h5pget_char
-     ! Recommended procedure:
-     MODULE PROCEDURE h5pget_ptr
-  END INTERFACE
-
-  INTERFACE h5pregister_f
-     MODULE PROCEDURE h5pregister_integer
-     MODULE PROCEDURE h5pregister_real
-     MODULE PROCEDURE h5pregister_char
-     ! Recommended procedure:
-     MODULE PROCEDURE h5pregister_ptr
-  END INTERFACE
-
-  INTERFACE h5pinsert_f
-     MODULE PROCEDURE h5pinsert_integer
-     MODULE PROCEDURE h5pinsert_real
-     MODULE PROCEDURE h5pinsert_char
-     ! Recommended procedure:
-     MODULE PROCEDURE h5pinsert_ptr
-  END INTERFACE
-
-  INTERFACE
-     INTEGER FUNCTION h5pget_fill_value_c(prp_id, type_id, fillvalue) &
-          BIND(C, NAME='h5pget_fill_value_c')
-       USE H5GLOBAL
-       USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
-       INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-       INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
-                                             ! of fillvalue datatype
-                                             ! (in memory)
-       TYPE(C_PTR), VALUE :: fillvalue       ! Fillvalue
-     END FUNCTION h5pget_fill_value_c
-  END INTERFACE
-
-  INTERFACE
-     INTEGER FUNCTION h5pset_fill_value_c(prp_id, type_id, fillvalue) &
-          BIND(C, NAME='h5pset_fill_value_c')
-       USE H5GLOBAL
-       USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
-       INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-       INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
-                                             ! of fillvalue datatype
-                                             ! (in memory)
-       TYPE(C_PTR), VALUE :: fillvalue       ! Fillvalue
-     END FUNCTION h5pset_fill_value_c
-  END INTERFACE
-
-  INTERFACE
-     INTEGER FUNCTION h5pset_c(prp_id, name, name_len, value) &
-          BIND(C, NAME='h5pset_c')
-       USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_char, c_ptr
-       USE H5GLOBAL
-       INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name  ! Name of property to modify
-       INTEGER :: name_len
-       TYPE(C_PTR), VALUE :: value ! Property value
-     END FUNCTION h5pset_c
-  END INTERFACE
-
-  INTERFACE
-     INTEGER FUNCTION h5pget_c(prp_id, name, name_len, value) &
-          BIND(C, NAME='h5pget_c')
-       USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_char, c_ptr
-       USE H5GLOBAL
-       INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name  ! Name of property to modify
-       INTEGER :: name_len
-       TYPE(C_PTR), VALUE :: value ! Property value
-     END FUNCTION h5pget_c
-  END INTERFACE
-
-  INTERFACE
-     INTEGER FUNCTION h5pregister_c(class, name, name_len, size, value) &
-          BIND(C, NAME='h5pregister_c')
-       USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_char, c_ptr
-       USE H5GLOBAL
-       INTEGER(HID_T), INTENT(IN) :: class
-       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
-       INTEGER, INTENT(IN)         :: name_len
-       INTEGER(SIZE_T), INTENT(IN) :: size
-       TYPE(C_PTR), INTENT(IN), VALUE :: value
-     END FUNCTION h5pregister_c
-  END INTERFACE
-
-  INTERFACE
-     INTEGER FUNCTION h5pinsert_c(plist, name, name_len, size, value) &
-          BIND(C, NAME='h5pinsert_c')
-       USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_char, c_ptr
-       USE H5GLOBAL
-       INTEGER(HID_T), INTENT(IN) :: plist
-       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
-       INTEGER, INTENT(IN)         :: name_len
-       INTEGER(SIZE_T), INTENT(IN) :: size
-       TYPE(C_PTR), INTENT(IN), VALUE :: value
-     END FUNCTION h5pinsert_c
-  END INTERFACE
-
-CONTAINS
-
-!
-!****s* H5P (F03)/h5pset_fill_value_f_F90
-!
-! NAME
-!  h5pset_fill_value_f
-!
-! PURPOSE
-!  Sets fill value for a dataset creation property list
-!
-! Inputs:
-!  prp_id    - Property list identifier
-!  type_id   - Datatype identifier of fill value datatype (in memory)
-!  fillvalue - Fillvalue
-!
-! Outputs:
-!  hdferr    - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001
-!
-!  Added the recommended way of passing fillvalue
-!  and that is by passing the C address, all other
-!  ways are obsolete and should be avoided. June, 2008 MSB
-!
-! NOTES
-!  h5pset(get)fill_value_f function is overloaded to support
-!  INTEGER, REAL, DOUBLE PRECISION and CHARACTER dtatypes.
-!
-! Fortran90 Interface:
-!!  SUBROUTINE h5pset_fill_value_f(prp_id, type_id, fillvalue, hdferr) 
-!!    IMPLICIT NONE
-!!    INTEGER(HID_T), INTENT(IN)  :: prp_id
-!!    INTEGER(HID_T), INTENT(IN)  :: type_id
-!!    TYPE(VOID)    , INTENT(IN)  :: fillvalue
-!!    INTEGER       , INTENT(OUT) :: hdferr
-!*****
-
-
-  SUBROUTINE h5pset_fill_value_integer(prp_id, type_id, fillvalue, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
-                                          ! of fillvalue datatype
-                                          ! (in memory)
-    INTEGER, INTENT(IN), TARGET :: fillvalue   ! Fillvalue
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code
-    TYPE(C_PTR) :: f_ptr ! C address
-
-    f_ptr = C_LOC(fillvalue)
-
-    hdferr = h5pset_fill_value_c(prp_id, type_id, f_ptr)
-
-  END SUBROUTINE h5pset_fill_value_integer
-!
-!****s* H5P (F03)/h5pget_fill_value_f_F90
-!
-! NAME
-!  h5pget_fill_value_f
-!
-! PURPOSE
-!  Gets fill value for a dataset creation property list
-!
-! Inputs:
-!  prp_id    - Property list identifier
-!  type_id   - Datatype identifier of fill value datatype (in memory)
-!
-! Outputs:
-!  fillvalue - Fillvalue
-!  hdferr    - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001
-!
-!  Added the recommended way of passing fillvalue
-!  and that is by passing the C address, all other
-!  ways are obsolete and should be avoided. June, 2008 MSB
-!
-! NOTES
-!  h5pget(get)fill_value_f function is overloaded to support
-!  INTEGER, REAL, DOUBLE PRECISION and CHARACTER dtatypes.
-!
-! Fortran90 Interface:
-!!  SUBROUTINE h5pget_fill_value_f(prp_id, type_id, fillvalue, hdferr)
-!!    INTEGER(HID_T), INTENT(IN)  :: prp_id 
-!!    INTEGER(HID_T), INTENT(IN)  :: type_id
-!!    TYPE(VOID)    , INTENT(OUT) :: fillvalue
-!!    INTEGER       , INTENT(OUT) :: hdferr
-!*****
-
-  SUBROUTINE h5pget_fill_value_integer(prp_id, type_id, fillvalue, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
-                                          ! of fillvalue datatype
-                                          ! (in memory)
-    INTEGER, INTENT(OUT), TARGET :: fillvalue ! Fillvalue
-    INTEGER, INTENT(OUT) :: hdferr            ! Error code
-    TYPE(C_PTR) :: f_ptr                      ! C address
-
-    f_ptr = C_LOC(fillvalue)
-
-    hdferr = h5pget_fill_value_c(prp_id, type_id, f_ptr)
-
-  END SUBROUTINE h5pget_fill_value_integer
-
-
-  SUBROUTINE h5pset_fill_value_real(prp_id, type_id, fillvalue, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
-                                          ! of fillvalue datatype
-                                          ! (in memory)
-    REAL, INTENT(IN), TARGET :: fillvalue ! Fillvalue
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-    TYPE(C_PTR) :: f_ptr                  ! C address
-
-    f_ptr = C_LOC(fillvalue)
-
-    hdferr = h5pset_fill_value_c(prp_id, type_id, f_ptr)
-
-  END SUBROUTINE h5pset_fill_value_real
-
-
-  SUBROUTINE h5pget_fill_value_real(prp_id, type_id, fillvalue, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
-                                          ! of fillvalue datatype
-                                          ! (in memory)
-    REAL, INTENT(OUT), TARGET :: fillvalue  ! Fillvalue
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    TYPE(C_PTR) :: f_ptr                    ! C address
-
-    f_ptr = C_LOC(fillvalue)
-
-    hdferr = h5pget_fill_value_c(prp_id, type_id, f_ptr)
-
-  END SUBROUTINE h5pget_fill_value_real
-
-  SUBROUTINE h5pset_fill_value_char(prp_id, type_id, fillvalue, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
-                                          ! of fillvalue datatype
-                                          ! (in memory)
-    CHARACTER, INTENT(IN), TARGET :: fillvalue ! Fillvalue
-    INTEGER, INTENT(OUT) :: hdferr             ! Error code
-    TYPE(C_PTR) :: f_ptr                       ! C address
-
-    f_ptr = C_LOC(fillvalue)
-
-    hdferr = h5pset_fill_value_c(prp_id, type_id, f_ptr)
-
-  END SUBROUTINE h5pset_fill_value_char
-
-  SUBROUTINE h5pget_fill_value_char(prp_id, type_id, fillvalue, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
-                                          ! of fillvalue datatype
-                                          ! (in memory)
-    CHARACTER, INTENT(OUT) :: fillvalue   ! Fillvalue
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-
-    INTEGER :: i
-    CHARACTER(LEN=1), ALLOCATABLE, DIMENSION(:), TARGET :: chr
-    INTEGER :: chr_len
-
-    TYPE(C_PTR) :: f_ptr ! C address
-    ! To resolve Issue #1 outlined in the preamble of this file we
-    ! need to pack the character string into an array.
-
-    chr_len = LEN(fillvalue)
-    ALLOCATE(chr(1:chr_len), STAT=hdferr)
-    IF (hdferr .NE. 0) THEN
-       hdferr = -1
-       RETURN
-    ENDIF
-
-    f_ptr = C_LOC(chr(1)(1:1))
-
-    hdferr = h5pget_fill_value_c(prp_id, type_id, f_ptr)
-
-    DO i = 1, chr_len
-       fillvalue(i:i) = chr(i)
-    ENDDO
-    DEALLOCATE(chr)
-
-  END SUBROUTINE h5pget_fill_value_char
-!
-!****s* H5P (F03)/h5pset_fill_value_f_F03
-!
-! NAME
-!  h5pset_fill_value_f
-!
-! PURPOSE
-!  Sets fill value for a dataset creation property list
-!
-! Inputs:
-!  prp_id    - Property list identifier
-!  type_id   - Datatype identifier of fill value datatype (in memory)
-!  fillvalue - Fillvalue
-!
-! Outputs:
-!  hdferr    - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001
-!
-!  Added the recommended way of passing fillvalue
-!  and that is by passing the C address, all other
-!  ways are obsolete and should be avoided. June, 2008 MSB
-!
-! NOTES
-!  h5pset(get)fill_value_f function is overloaded to support
-!  INTEGER, REAL, DOUBLE PRECISION and CHARACTER dtatypes.
-!
-! Fortran2003 Interface:
-!!  SUBROUTINE h5pset_fill_value_f(prp_id, type_id, fillvalue, hdferr)
-!!    INTEGER(HID_T), INTENT(IN)  :: prp_id 
-!!    INTEGER(HID_T), INTENT(IN)  :: type_id
-!!    TYPE(C_PTR)   , INTENT(IN)  :: fillvalue
-!!    INTEGER       , INTENT(OUT) :: hdferr
-!*****
-
-  SUBROUTINE h5pset_fill_value_ptr(prp_id, type_id, fillvalue, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id    ! Property list identifier
-    INTEGER(HID_T), INTENT(IN) :: type_id   ! Datatype identifier of
-                                            ! of fillvalue datatype
-                                            ! (in memory)
-    TYPE(C_PTR), INTENT(IN)    :: fillvalue ! Fillvalue
-    INTEGER, INTENT(OUT)       :: hdferr    ! Error code
-
-    hdferr = h5pset_fill_value_c(prp_id, type_id, fillvalue)
-
-  END SUBROUTINE h5pset_fill_value_ptr
-
-!
-!****s* H5P (F03)/h5pget_fill_value_f_F03
-!
-! NAME
-!  h5pget_fill_value_f
-!
-! PURPOSE
-!  Gets fill value for a dataset creation property list
-!
-! Inputs:
-!  prp_id    - Property list identifier
-!  type_id   - Datatype identifier of fill value datatype (in memory)
-!
-! Outputs:
-!  fillvalue - Fillvalue
-!  hdferr    - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001
-!
-!  Added the recommended way of passing fillvalue
-!  and that is by passing the C address, all other
-!  ways are obsolete and should be avoided. June, 2008 MSB
-!
-! NOTES
-!  h5pget(get)fill_value_f function is overloaded to support
-!  INTEGER, REAL, DOUBLE PRECISION and CHARACTER dtatypes.
-!
-! Fortran2003 Interface:
-!!  SUBROUTINE h5pget_fill_value_f(prp_id, type_id, fillvalue, hdferr)
-!!    INTEGER(HID_T), INTENT(IN)  :: prp_id 
-!!    INTEGER(HID_T), INTENT(IN)  :: type_id
-!!    TYPE(C_PTR)   , INTENT(OUT) :: fillvalue
-!!    INTEGER       , INTENT(OUT) :: hdferr
-!*****
-
-  SUBROUTINE h5pget_fill_value_ptr(prp_id, type_id, fillvalue, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
-                                          ! of fillvalue datatype
-                                          ! (in memory)
-    TYPE(C_PTR), INTENT(OUT) :: fillvalue ! Fillvalue
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-
-    hdferr = h5pget_fill_value_c(prp_id, type_id, fillvalue)
-
-  END SUBROUTINE h5pget_fill_value_ptr
-
-!
-!****s* H5P (F03)/h5pset_f_F90
-!
-! NAME
-!  h5pset_f
-!
-! PURPOSE
-!  Sets a property list value
-!
-! Inputs:
-!  prp_id  - Property list identifier to modify
-!  name    - Name of property to modify
-!  value   - Property value, supported types are:
-!             INTEGER
-!             REAL
-!             DOUBLE PRECISION
-!             CHARACTER(LEN=*)
-! Outputs:
-!  hdferr  - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002
-!
-! Fortran90 Interface:
-!!  SUBROUTINE h5pset_f(plid, name, value, hdferr)
-!!    INTEGER(HID_T)  , INTENT(IN)  :: plid
-!!    CHARACTER(LEN=*), INTENT(IN)  :: name
-!!    TYPE            , INTENT(IN)  :: value
-!!    INTEGER         , INTENT(OUT) :: hdferr
-!*****
-  SUBROUTINE h5pset_integer(prp_id, name, value, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id   ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of property to modify
-    INTEGER,   INTENT(IN), TARGET :: value ! Property value
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-
-    INTEGER :: name_len
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(value)
-
-    name_len = LEN(name)
-    hdferr = h5pget_c(prp_id, name, name_len, f_ptr)
-
-  END SUBROUTINE h5pset_integer
-
-  SUBROUTINE h5pset_real(prp_id, name, value, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name ! Name of property to modify
-    REAL,   INTENT(IN), TARGET :: value  ! Property value
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-    INTEGER :: name_len
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(value)
-
-    name_len = LEN(name)
-    hdferr = h5pget_c(prp_id, name, name_len, f_ptr)
-
-  END SUBROUTINE h5pset_real
-
-  SUBROUTINE h5pset_char(prp_id, name, value, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id    ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name    ! Name of property to modify
-    CHARACTER(LEN=*),   INTENT(IN) :: value ! Property value
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    INTEGER :: name_len
-
-    INTEGER :: i
-    CHARACTER(LEN=1), ALLOCATABLE, DIMENSION(:), TARGET :: chr
-    INTEGER :: chr_len
-
-    TYPE(C_PTR) :: f_ptr
-    ! To resolve Issue #1 outlined in the preamble of this file we
-    ! need to pack the character string into an array.
-
-    chr_len = LEN(value)
-    ALLOCATE(chr(1:chr_len), STAT=hdferr)
-    IF (hdferr .NE. 0) THEN
-       hdferr = -1
-       RETURN
-    ENDIF
-
-    DO i = 1, chr_len
-       chr(i) = value(i:i)
-    ENDDO
-
-    f_ptr = C_LOC(chr(1)(1:1))
-
-    name_len = LEN(name)
-    hdferr = h5pget_c(prp_id, name, name_len, f_ptr)
-
-    DEALLOCATE(chr)
-
-  END SUBROUTINE h5pset_char
-!
-!****s* H5P (F03)/h5pget_f_F90
-!
-! NAME
-!  h5pget_f
-!
-! PURPOSE
-!  Queries the value of a property.
-!
-! Inputs:
-!  prp_id  - Property list identifier to modify
-!  name    - Name of property to get
-!  value   - Property value, supported types are:
-!             INTEGER
-!             REAL
-!             DOUBLE PRECISION
-!             CHARACTER(LEN=*)
-! Outputs:
-!  hdferr  - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002
-!
-! Fortran90 Interface:
-!!  SUBROUTINE h5pget_f(plid, name, value, hdferr)
-!!    INTEGER(HID_T)  , INTENT(IN)  :: plid
-!!    CHARACTER(LEN=*), INTENT(IN)  :: name
-!!    TYPE            , INTENT(OUT) :: value
-!!    INTEGER         , INTENT(OUT) :: hdferr
-!*****
-
-  SUBROUTINE h5pget_integer(prp_id, name, value, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id    ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name    ! Name of property to modify
-    INTEGER,   INTENT(OUT), TARGET :: value ! Property value
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    INTEGER :: name_len
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(value)
-
-    name_len = LEN(name)
-    hdferr = h5pget_c(prp_id, name, name_len, f_ptr)
-
-  END SUBROUTINE h5pget_integer
-
-  SUBROUTINE h5pget_real(prp_id, name, value, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name ! Name of property to modify
-    REAL,   INTENT(OUT), TARGET :: value ! Property value
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-    INTEGER :: name_len
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(value)
-
-    name_len = LEN(name)
-    hdferr = h5pget_c(prp_id, name, name_len, f_ptr)
-  END SUBROUTINE h5pget_real
-
-  SUBROUTINE h5pget_char(prp_id, name, value, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id   ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of property to modify
-    CHARACTER(LEN=*), INTENT(OUT) :: value ! Property value
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-    INTEGER :: name_len
-
-    INTEGER :: i
-    CHARACTER(LEN=1), ALLOCATABLE, DIMENSION(:), TARGET :: chr
-    INTEGER :: chr_len
-    TYPE(C_PTR) :: f_ptr
-
-    chr_len = LEN(value)
-    ALLOCATE(chr(1:chr_len), STAT=hdferr)
-    IF (hdferr .NE. 0) THEN
-       hdferr = -1
-       RETURN
-    ENDIF
-    f_ptr = C_LOC(chr(1)(1:1))
-
-    name_len = LEN(name)
-    hdferr = h5pget_c(prp_id, name, name_len, f_ptr)
-
-    DO i = 1, chr_len
-       value(i:i) = chr(i)
-    ENDDO
-
-    DEALLOCATE(chr)
-
-  END SUBROUTINE h5pget_char
-
-
-!
-!****s* H5P (F03)/h5pset_f_F03
-!
-! NAME
-!  h5pset_f
-!
-! PURPOSE
-!  Sets a property list value
-!
-! Inputs:
-!  prp_id  - Property list identifier to modify
-!  name    - Name of property to modify
-!  value   - Pointer to value to set the property to
-! Outputs:
-!  hdferr  - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002
-!
-! Fortran2003 Interface:
-!!  SUBROUTINE h5pset_f(plid, name, value, hdferr)
-!!    INTEGER(HID_T)  , INTENT(IN)  :: plid
-!!    CHARACTER(LEN=*), INTENT(IN)  :: name
-!!    TYPE(C_PTR)     , INTENT(IN)  :: value
-!!    INTEGER         , INTENT(OUT) :: hdferr
-!*****
-  SUBROUTINE h5pset_ptr(prp_id, name, value, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to modify
-    TYPE(C_PTR), INTENT(IN) :: value      ! Property value
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-    INTEGER :: name_len
-
-    name_len = LEN(name)
-    hdferr = h5pset_c(prp_id, name, name_len, value)
-
-  END SUBROUTINE h5pset_ptr
-!
-!****s* H5P (F03)/h5pget_f_F03
-!
-! NAME
-!  h5pget_f (F03)
-!
-! PURPOSE
-!  Queries the value of a property.
-!
-! Inputs:
-!  prp_id  - Property list identifier to modify
-!  name    - Name of property to get
-!  value   - Pointer to a location to which to copy the value of of the property
-! Outputs:
-!  hdferr  - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002
-!
-! Fortran2003 Interface:
-!!  SUBROUTINE h5pget_f(plid, name, value, hdferr)
-!!    INTEGER(HID_T)  , INTENT(IN)  :: plid
-!!    CHARACTER(LEN=*), INTENT(IN)  :: name
-!!    TYPE(C_PTR)     , INTENT(OUT) :: value
-!!    INTEGER         , INTENT(OUT) :: hdferr
-!*****
-  SUBROUTINE h5pget_ptr(prp_id, name, value, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to modify
-    TYPE(C_PTR), INTENT(OUT) :: value     ! Property value
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-    INTEGER :: name_len
-
-    name_len = LEN(name)
-    hdferr = h5pget_c(prp_id, name, name_len, value)
-
-  END SUBROUTINE h5pget_ptr
-
-
-!
-!****s* H5P (F03)/h5pregister_f_F90
-!
-! NAME
-!  h5pregister
-!
-! PURPOSE
-!  Registers a permanent property with a property list class.
-!
-! Inputs:
-!  class  - Property list class identifier
-!  name   - Name of property to register
-!  size   - Size of the property value
-!  value  - Property value, supported types are:
-!             INTEGER
-!             REAL
-!             DOUBLE PRECISION
-!             CHARACTER(LEN=*)
-!
-! Outputs:
-!  hdferr - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 10, 2002
-!
-! Fortran90 Interface:
-!!  SUBROUTINE h5pregister_f(class, name, size, value, hdferr)
-!!    INTEGER(HID_T)  , INTENT(IN)  :: class
-!!    CHARACTER(LEN=*), INTENT(IN)  :: name
-!!    INTEGER(SIZE_T) , INTENT(IN)  :: size
-!!    TYPE            , INTENT(IN)  :: value
-!!    INTEGER         , INTENT(OUT) :: hdferr  
-!*****
-  SUBROUTINE h5pregister_integer(class, name, size, value, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: class    ! Property list class identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of property to register
-    INTEGER(SIZE_T), INTENT(IN) :: size    ! Size of the property value
-    INTEGER,   INTENT(IN), TARGET :: value ! Property value
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-    INTEGER :: name_len
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(value)
-
-    name_len = LEN(name)
-    hdferr = h5pregister_c(class, name, name_len, size, f_ptr)
-
-  END SUBROUTINE h5pregister_integer
-
-  SUBROUTINE h5pregister_real(class, name, size, value, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: class   ! Property list class identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to register
-    INTEGER(SIZE_T), INTENT(IN) :: size   ! size of the property value
-    REAL,   INTENT(IN), TARGET :: value   ! Property value
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-    INTEGER :: name_len
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(value)
-
-    name_len = LEN(name)
-    hdferr = h5pregister_c(class, name, name_len, size, f_ptr)
-
-  END SUBROUTINE h5pregister_real
-
-  SUBROUTINE h5pregister_char(class, name, size, value, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: class     ! Property list class identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name    ! Name of property to register
-    INTEGER(SIZE_T), INTENT(IN) :: size     ! size of the property value
-    CHARACTER(LEN=*),   INTENT(IN) :: value ! Property value
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    INTEGER :: name_len
-
-    INTEGER :: i
-    CHARACTER(LEN=1), ALLOCATABLE, DIMENSION(:), TARGET :: chr
-    INTEGER :: chr_len
-
-    TYPE(C_PTR) :: f_ptr
-    ! To resolve Issue #1 outlined in the preamble of this file we
-    ! need to pack the character string into an array.
-
-    chr_len = LEN(value)
-    ALLOCATE(chr(1:chr_len), STAT=hdferr)
-    IF (hdferr .NE. 0) THEN
-       hdferr = -1
-       RETURN
-    ENDIF
-
-    DO i = 1, chr_len
-       chr(i) = value(i:i)
-    ENDDO
-
-    f_ptr = C_LOC(chr(1)(1:1))
-
-    name_len = LEN(name)
-    hdferr = h5pregister_c(class, name, name_len, size, f_ptr)
-    DEALLOCATE(chr)
-  END SUBROUTINE h5pregister_char
-!
-!****s* H5P (F03)/h5pregister_f_F03
-!
-! NAME
-!  h5pregister (F03)
-!
-! PURPOSE
-!  Registers a permanent property with a property list class.
-!
-! Inputs:
-!  class  - Property list class identifier
-!  name   - Name of property to register
-!  size   - Size of the property value
-!  value  - Pointer to value to set the property to
-!
-! Outputs:
-!  hdferr - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  June 24, 2008
-!
-! Fortran2003 Interface:
-!!  SUBROUTINE h5pregister_f(class, name, size, value, hdferr)
-!!    INTEGER(HID_T)  , INTENT(IN)  :: class
-!!    CHARACTER(LEN=*), INTENT(IN)  :: name
-!!    INTEGER(SIZE_T) , INTENT(IN)  :: size
-!!    TYPE(C_PTR)     , INTENT(IN)  :: value
-!!    INTEGER         , INTENT(OUT) :: hdferr  
-!*****
-
-  SUBROUTINE h5pregister_ptr(class, name, size, value, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: class   ! Property list class identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to register
-    INTEGER(SIZE_T), INTENT(IN) :: size   ! Size of the property value
-    TYPE(C_PTR), INTENT(IN) :: value      ! Property value
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-    INTEGER :: name_len
-
-    name_len = LEN(name)
-    hdferr = h5pregister_c(class, name, name_len, size, value)
-  END SUBROUTINE h5pregister_ptr
-
-!
-!****s* H5P (F03)/h5pinsert_f_F90
-!
-! NAME
-!  h5pinsert  (f90)
-!
-! PURPOSE
-!  Registers a temporary property with a property list class.
-!
-! Inputs:
-!  plist  - Property list class identifier
-!  name   - Name of property to insert
-!  size   - Size of the property value
-!  value  - Property value, supported types are:
-!             INTEGER
-!             REAL
-!             DOUBLE PRECISION
-!             CHARACTER(LEN=*)
-! Outputs:
-!  hdferr - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  October 10, 2002
-!
-! Fortran90 Interface:
-!!  SUBROUTINE h5pinsert_f
-!!    INTEGER(HID_T)  , INTENT(IN)  :: plist
-!!    CHARACTER(LEN=*), INTENT(IN)  :: name
-!!    INTEGER(SIZE_T) , INTENT(IN)  :: size
-!!    TYPE            , INTENT(IN)  :: value
-!!    INTEGER         , INTENT(OUT) :: hdferr
-!*****
-  SUBROUTINE h5pinsert_integer(plist, name, size, value, hdferr)
-    USE iso_c_binding
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist    ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of property to insert
-    INTEGER(SIZE_T), INTENT(IN) :: size    ! Size of the property value
-    INTEGER,   INTENT(IN), TARGET :: value ! Property value
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-    INTEGER :: name_len
-    TYPE(c_ptr) :: f_ptr
-
-    f_ptr = c_loc(value)
-
-    name_len = LEN(name)
-    hdferr = h5pinsert_c(plist, name , name_len, size, f_ptr)
-  END SUBROUTINE h5pinsert_integer
-
-  SUBROUTINE h5pinsert_real(plist, name, size, value, hdferr)
-    USE iso_c_binding
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist   ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to insert
-    INTEGER(SIZE_T), INTENT(IN) :: size   ! Size of the property value
-    REAL,   INTENT(IN), TARGET :: value   ! Property value
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-    INTEGER :: name_len
-    TYPE(c_ptr) :: f_ptr
-
-    f_ptr = c_loc(value)
-
-    name_len = LEN(name)
-    hdferr = h5pinsert_c(plist, name , name_len, size, f_ptr)
-
-  END SUBROUTINE h5pinsert_real
-
-  SUBROUTINE h5pinsert_char(plist, name, size, value, hdferr)
-    USE iso_c_binding
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist      ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name     ! Name of property to insert
-    INTEGER(SIZE_T), INTENT(IN) :: size      ! Size of property value
-    CHARACTER(LEN=*),   INTENT(IN) :: value  ! Property value
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    INTEGER :: name_len
-
-    INTEGER :: i
-    CHARACTER(LEN=1), ALLOCATABLE, DIMENSION(:), TARGET :: chr
-    INTEGER :: chr_len
-
-    TYPE(c_ptr) :: f_ptr
-    ! To resolve Issue #1 outlined in the preamble of this file we
-    ! need to pack the character string into an array.
-
-    chr_len = LEN(value)
-    ALLOCATE(chr(1:chr_len), STAT=hdferr)
-    IF (hdferr .NE. 0) THEN
-       hdferr = -1
-       RETURN
-    ENDIF
-
-    DO i = 1, chr_len
-       chr(i) = value(i:i)
-    ENDDO
-
-    f_ptr = C_LOC(chr(1)(1:1))
-
-    name_len = LEN(name)
-    hdferr = h5pinsert_c(plist, name , name_len, size, f_ptr)
-
-    DEALLOCATE(chr)
-
-  END SUBROUTINE h5pinsert_char
-
-!
-!****s* H5P (F03)/h5pinsert_f_F03
-!
-! NAME
-!  h5pinsert  (f03)
-!
-! PURPOSE
-!  Registers a temporary property with a property list class.
-!
-! Inputs:
-!  plist  - Property list class identifier
-!  name   - Name of property to insert
-!  size   - Size of the property value
-!  value  - Pointer to new value pointer for the property being modified
-!
-! Outputs:
-!  hdferr - Returns 0 if successful and -1 if fails
-!
-! AUTHOR 
-!  M. Scot Breitenfeld
-!  June 24, 2008
-!
-! Fortran90 Interface:
-!!  SUBROUTINE h5pinsert_f
-!!    INTEGER(HID_T)  , INTENT(IN)  :: plist
-!!    CHARACTER(LEN=*), INTENT(IN)  :: name
-!!    INTEGER(SIZE_T) , INTENT(IN)  :: size
-!!    TYPE(C_PTR)     , INTENT(IN)  :: value
-!!    INTEGER         , INTENT(OUT) :: hdferr
-!*****
-  SUBROUTINE h5pinsert_ptr(plist, name, size, value, hdferr)
-    USE iso_c_binding
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist  ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name ! Name of property to insert
-    INTEGER(SIZE_T), INTENT(IN) :: size  ! Size of property value
-    TYPE(c_ptr),   INTENT(IN) :: value   ! Property value
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-    INTEGER :: name_len
-
-    name_len = LEN(name)
-    hdferr = h5pinsert_c(plist, name , name_len, size, value)
-  END SUBROUTINE h5pinsert_ptr
-!
-!****s* H5P (F03)/h5pcreate_class_f_F03
-!
-! NAME
-!  h5pcreate_class_f
-!
-! PURPOSE
-!  Create a new property list class
-!
-! Inputs:
-!  parent  - Parent property list class identifier
-!            Possible values include:
-!              H5P_ROOT_F
-!              H5P_FILE_CREATE_F
-!              H5P_FILE_ACCESS_F
-!              H5P_DATASET_CREATE_F
-!              H5P_DATASET_XFER_F
-!              H5P_FILE_MOUNT_F
-!  name    - Name of property to create
-!
-! Outputs:
-!  class   - Property list class identifier
-!  hdferr  - Returns 0 if successful and -1 if fails
-!
-! Optional parameters:
-!  H5P_cls_create_func_t (create) - Callback routine called when a property list is created
-!  create_data 	                  - User pointer to any class creation information needed
-!  H5P_cls_copy_func_t   (copy)   - Callback routine called when a property list is copied
-!  copy_data 	                  - User pointer to any class copy information needed
-!  H5P_cls_close_func_t  (close)  - Callback routine called when a property list is being closed
-!  close_data 	                  - User pointer to any class close information needed
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002
-!
-! HISTORY
-!  Added callback arguments
-!  M. Scot Breitenfeld, July 3, 2008
-!
-! Fortran2003 Interface:
-  SUBROUTINE h5pcreate_class_f(parent, name, class, hdferr, create, create_data, copy, copy_data, close, close_data)
-    USE iso_c_binding
-    IMPLICIT NONE
-    INTEGER(HID_T)  , INTENT(IN)  :: parent
-    CHARACTER(LEN=*), INTENT(IN)  :: name
-    INTEGER(HID_T)  , INTENT(OUT) :: class
-    INTEGER         , INTENT(OUT) :: hdferr
-    TYPE(C_PTR)     , OPTIONAL    :: create_data, copy_data, close_data
-    TYPE(C_FUNPTR)  , OPTIONAL    :: create, copy, close
-!*****
-    INTEGER :: name_len
-    TYPE(C_PTR) :: create_data_default, copy_data_default, close_data_default
-    TYPE(C_FUNPTR) :: create_default, copy_default, close_default
-    INTERFACE
-       INTEGER FUNCTION h5pcreate_class_c(parent, name, name_len, class, &
-            create, create_data, copy, copy_data, close, close_data) &
-          BIND(C, NAME='h5pcreate_class_c')
-         USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_char, c_ptr, c_funptr
-         USE H5GLOBAL
-         INTEGER(HID_T), INTENT(IN) :: parent
-         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-         INTEGER(HID_T), INTENT(OUT) :: class
-         TYPE(C_PTR), VALUE :: create_data, copy_data, close_data
-         TYPE(C_FUNPTR), VALUE :: create, copy, close
-       END FUNCTION h5pcreate_class_c
-    END INTERFACE
-    name_len = LEN(name)
-
-    create_default = c_null_funptr     !fix:scot
-    create_data_default = c_null_ptr
-    copy_default = c_null_funptr    !fix:scot
-    copy_data_default = c_null_ptr
-    close_default = c_null_funptr   !fix:scot
-    close_data_default = c_null_ptr
-
-    IF(PRESENT(create)) create_default = create
-    IF(PRESENT(create_data)) create_data_default = create_data
-    IF(PRESENT(copy)) copy_default = copy
-    IF(PRESENT(copy_data)) copy_data_default = copy_data
-    IF(PRESENT(close)) close_default = close
-    IF(PRESENT(close_data)) close_data_default = close_data
-
-    hdferr = h5pcreate_class_c(parent, name , name_len, class, &
-         create_default, create_data_default, &
-         copy_default, copy_data_default, &
-         close_default, close_data_default)
-
-  END SUBROUTINE h5pcreate_class_f
-
-!
-!****s* H5P (F03)/h5pset_file_image_f_F03
-!
-! NAME
-!  h5pset_file_image_f
-!
-! PURPOSE
-!  Sets an initial file image in a memory buffer.
-!
-! Inputs:
-!  fapl_id - File access property list identifier
-!  buf_ptr - Pointer to the initial file image, 
-!            or C_NULL_PTR if no initial file image is desired
-!  buf_len - Size of the supplied buffer, or 0 (zero) if no initial image is desired
-!
-! Outputs:
-!  hdferr  - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 19, 2012
-!
-! Fortran2003 Interface:
-  SUBROUTINE h5pset_file_image_f(fapl_id, buf_ptr, buf_len, hdferr)
-    USE iso_c_binding
-    IMPLICIT NONE
-    INTEGER(HID_T) , INTENT(IN)  :: fapl_id
-    TYPE(C_PTR)    , INTENT(IN)  :: buf_ptr
-    INTEGER(SIZE_T), INTENT(IN)  :: buf_len
-    INTEGER        , INTENT(OUT) :: hdferr
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5pset_file_image_c(fapl_id, buf_ptr, buf_len) &
-            BIND(C, NAME='h5pset_file_image_c')
-         USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
-         USE H5GLOBAL
-         INTEGER(HID_T), INTENT(IN) :: fapl_id
-         TYPE(C_PTR), VALUE :: buf_ptr
-         INTEGER(SIZE_T), INTENT(IN)  :: buf_len
-       END FUNCTION h5pset_file_image_c
-    END INTERFACE
-
-    hdferr = h5pset_file_image_c(fapl_id, buf_ptr, buf_len)
-
-  END SUBROUTINE h5pset_file_image_f
-!
-!****s* H5P (F03)/h5pget_file_image_f_F03
-!
-! NAME
-!  h5pget_file_image_f
-!
-! PURPOSE
-!  Retrieves a copy of the file image designated as the initial content and structure of a file. 
-!
-! Inputs:
-!  fapl_id     - File access property list identifier.
-!
-! Outputs:
-!  buf_ptr     - Will hold either a C_NULL_PTR or a scalar of type
-!                c_loc. If buf_ptr is not C_NULL_PTR, on successful
-!                return, buf_ptr shall contain a C pointer to a copy
-!                of the initial image provided in the last call to
-!                H5Pset_file_image_f for the supplied fapl_id, or
-!                buf_ptr shall contain a C_NULL_PTR if there is no
-!                initial image set.
-!
-!  buf_len_ptr - Contains the value of the buffer parameter for
-!                the initial image in the supplied fapl_id. The value
-!                will be 0 if no initial image is set.
-!
-!
-!  hdferr      - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 19, 2012
-!
-! Fortran2003 Interface:
-  SUBROUTINE h5pget_file_image_f(fapl_id, buf_ptr, buf_len_ptr, hdferr)
-    USE iso_c_binding
-    IMPLICIT NONE
-    INTEGER(HID_T) , INTENT(IN)                :: fapl_id
-    TYPE(C_PTR)    , INTENT(OUT), DIMENSION(*) :: buf_ptr
-    INTEGER(SIZE_T), INTENT(OUT)               :: buf_len_ptr
-    INTEGER        , INTENT(OUT)               :: hdferr
-    
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5pget_file_image_c(fapl_id, buf_ptr, buf_len_ptr) &
-            BIND(C, NAME='h5pget_file_image_c')
-         USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
-         USE H5GLOBAL
-         INTEGER(HID_T), INTENT(IN) :: fapl_id
-         TYPE(C_PTR), DIMENSION(*), INTENT(OUT)  :: buf_ptr
-         INTEGER(SIZE_T), INTENT(OUT)  :: buf_len_ptr
-       END FUNCTION h5pget_file_image_c
-    END INTERFACE
-
-    hdferr = h5pget_file_image_c(fapl_id, buf_ptr, buf_len_ptr)
-
-  END SUBROUTINE h5pget_file_image_f
-
-END MODULE H5P_PROVISIONAL
-
diff --git a/fortran/src/H5Pff_F90.f90 b/fortran/src/H5Pff_F90.f90
deleted file mode 100644
index b5ea13d..0000000
--- a/fortran/src/H5Pff_F90.f90
+++ /dev/null
@@ -1,949 +0,0 @@
-!****h* ROBODoc/H5P (_F90)
-!
-! NAME
-!  H5P_PROVISIONAL
-!
-! PURPOSE
-!
-!  This file contains Fortran 90 interfaces for H5P functions. It contains
-!  the same functions as H5Pff_F03.f90 but excludes the Fortran 2003 functions
-!  and the interface listings. This file will be compiled instead of H5Pff_F03.f90
-!  if Fortran 2003 functions are not enabled.
-!
-! COPYRIGHT
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!  Copyright by The HDF Group.                                               *
-!  Copyright by the Board of Trustees of the University of Illinois.         *
-!  All rights reserved.                                                      *
-!  *
-!  This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!  terms governing use, modification, and redistribution, is contained in    *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!  of the source code distribution tree; Copyright.html can be found at the  *
-!  root level of an installed copy of the electronic HDF5 document set and   *
-!  is linked from the top-level documents page.  It can also be found at     *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!  access to either file, you may request a copy from help at hdfgroup.org.     *
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5P function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!*****
-
-MODULE H5P_PROVISIONAL
-
-  USE H5GLOBAL
-
-  INTERFACE h5pset_fill_value_f
-     MODULE PROCEDURE h5pset_fill_value_integer
-     MODULE PROCEDURE h5pset_fill_value_real
-     MODULE PROCEDURE h5pset_fill_value_char
-  END INTERFACE
-
-  INTERFACE h5pget_fill_value_f
-     MODULE PROCEDURE h5pget_fill_value_integer
-     MODULE PROCEDURE h5pget_fill_value_real
-     MODULE PROCEDURE h5pget_fill_value_char
-  END INTERFACE
-
-  INTERFACE h5pset_f
-     MODULE PROCEDURE h5pset_integer
-     MODULE PROCEDURE h5pset_real
-     MODULE PROCEDURE h5pset_char
-  END INTERFACE
-
-  INTERFACE h5pget_f
-     MODULE PROCEDURE h5pget_integer
-     MODULE PROCEDURE h5pget_real
-     MODULE PROCEDURE h5pget_char
-  END INTERFACE
-
-  INTERFACE h5pregister_f
-     MODULE PROCEDURE h5pregister_integer
-     MODULE PROCEDURE h5pregister_real
-     MODULE PROCEDURE h5pregister_char
-  END INTERFACE
-
-  INTERFACE h5pinsert_f
-     MODULE PROCEDURE h5pinsert_integer
-     MODULE PROCEDURE h5pinsert_real
-     MODULE PROCEDURE h5pinsert_char
-  END INTERFACE
-
-CONTAINS
-!
-!****s* H5P (F90)/h5pset(get)fill_value_f
-!
-! NAME
-!  h5pset(get)fill_value_f
-!
-! PURPOSE
-!  Sets(gets) fill value for a dataset creation property list
-!
-! INPUTS
-!  prp_id 	 - dataset creation property list identifier
-!  type_id 	 - datatype identifier for fill value
-!  fillvalue 	 - fill value
-! OUTPUTS
-!  type_id	- datatype identifier for fill value
-!  fillvalue	- fill value
-!  hdferr 	- error code
-!                  Success:  0
-!                  Failure: -1
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 14, 2001
-!
-! NOTES
-!  h5pset(get)fill_value_f function is overloaded to support
-!  INTEGER, REAL, DOUBLE PRECISION and CHARACTER dtatypes.
-!
-! SOURCE
-  SUBROUTINE h5pset_fill_value_integer(prp_id, type_id, fillvalue, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
-                                          ! of fillvalue datatype
-                                          ! (in memory)
-    INTEGER, INTENT(IN) :: fillvalue      ! Fillvalue
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5pset_fill_value_integer_c(prp_id, type_id, fillvalue)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_FILL_VALUE_INTEGER_C'::h5pset_fill_value_integer_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER(HID_T), INTENT(IN) :: type_id
-         INTEGER, INTENT(IN) :: fillvalue
-       END FUNCTION h5pset_fill_value_integer_c
-    END INTERFACE
-
-    hdferr = h5pset_fill_value_integer_c(prp_id, type_id, fillvalue)
-  END SUBROUTINE h5pset_fill_value_integer
-
-
-  SUBROUTINE h5pget_fill_value_integer(prp_id, type_id, fillvalue, &
-       hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
-    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
-                                          ! of fillvalue datatype
-                                          ! (in memory)
-    INTEGER, INTENT(IN) :: fillvalue   ! Fillvalue
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code
-
-    INTERFACE
-       INTEGER FUNCTION h5pget_fill_value_integer_c(prp_id, type_id, fillvalue)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_FILL_VALUE_INTEGER_C'::h5pget_fill_value_integer_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER(HID_T), INTENT(IN) :: type_id
-         INTEGER :: fillvalue
-       END FUNCTION h5pget_fill_value_integer_c
-    END INTERFACE
-
-    hdferr = h5pget_fill_value_integer_c(prp_id, type_id, fillvalue)
-  END SUBROUTINE h5pget_fill_value_integer
-
-
-  SUBROUTINE h5pset_fill_value_real(prp_id, type_id, fillvalue, &
-       hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
-                                          ! of fillvalue datatype
-                                          ! (in memory)
-    REAL, INTENT(IN) :: fillvalue   ! Fillvalue
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code
-
-    INTERFACE
-       INTEGER FUNCTION h5pset_fill_value_real_c(prp_id, type_id, fillvalue)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_FILL_VALUE_REAL_C'::h5pset_fill_value_real_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER(HID_T), INTENT(IN) :: type_id
-         REAL, INTENT(IN) :: fillvalue
-       END FUNCTION h5pset_fill_value_real_c
-    END INTERFACE
-
-    hdferr = h5pset_fill_value_real_c(prp_id, type_id, fillvalue)
-  END SUBROUTINE h5pset_fill_value_real
-
-
-  SUBROUTINE h5pget_fill_value_real(prp_id, type_id, fillvalue, &
-       hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
-                                          ! of fillvalue datatype
-                                          ! (in memory)
-    REAL, INTENT(IN) :: fillvalue   ! Fillvalue
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code
-
-    INTERFACE
-       INTEGER FUNCTION h5pget_fill_value_real_c(prp_id, type_id, fillvalue)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_FILL_VALUE_REAL_C'::h5pget_fill_value_real_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER(HID_T), INTENT(IN) :: type_id
-         REAL :: fillvalue
-       END FUNCTION h5pget_fill_value_real_c
-    END INTERFACE
-
-    hdferr = h5pget_fill_value_real_c(prp_id, type_id, fillvalue)
-  END SUBROUTINE h5pget_fill_value_real
-
-  SUBROUTINE h5pset_fill_value_char(prp_id, type_id, fillvalue, &
-       hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
-                                          ! of fillvalue datatype
-                                          ! (in memory)
-    CHARACTER, INTENT(IN) :: fillvalue    ! Fillvalue
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-
-    INTERFACE
-       INTEGER FUNCTION h5pset_fill_valuec_c(prp_id, type_id, fillvalue)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_FILL_VALUEC_C'::h5pset_fill_valuec_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: fillvalue
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER(HID_T), INTENT(IN) :: type_id
-         CHARACTER, INTENT(IN) :: fillvalue
-       END FUNCTION h5pset_fill_valuec_c
-    END INTERFACE
-
-    hdferr = h5pset_fill_valuec_c(prp_id, type_id, fillvalue)
-  END SUBROUTINE h5pset_fill_value_char
-
-  SUBROUTINE h5pget_fill_value_char(prp_id, type_id, fillvalue, &
-       hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
-                                          ! of fillvalue datatype
-                                          ! (in memory)
-    CHARACTER, INTENT(IN) :: fillvalue    ! Fillvalue
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-
-    INTERFACE
-       INTEGER FUNCTION h5pget_fill_valuec_c(prp_id, type_id, fillvalue)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_FILL_VALUEC_C'::h5pget_fill_valuec_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: fillvalue
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER(HID_T), INTENT(IN) :: type_id
-         CHARACTER :: fillvalue
-       END FUNCTION h5pget_fill_valuec_c
-    END INTERFACE
-
-    hdferr = h5pget_fill_valuec_c(prp_id, type_id, fillvalue)
-  END SUBROUTINE h5pget_fill_value_char
-!
-!****s* H5P (F90)/h5pset_integer
-!
-! NAME
-!  h5pset_integer
-!
-! PURPOSE
-!  Sets a property list value
-!
-! INPUTS
-!  prp_id 	 - iproperty list identifier to modify
-!  name 	 - name of property to modify
-!  value 	 - value to set property to
-! OUTPUTS
-!  hdferr:	 - error code
-!                   Success:  0
-!                   Failure: -1
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002
-!
-! SOURCE
-  SUBROUTINE h5pset_integer(prp_id, name, value, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to modify
-    INTEGER, INTENT(IN) :: value          ! Property value
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTEGER :: name_len
-
-    INTERFACE
-       INTEGER FUNCTION h5pset_integer_c(prp_id, name, name_len, value)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_INTEGER_C'::h5pset_integer_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-         INTEGER, INTENT(IN) :: value
-       END FUNCTION h5pset_integer_c
-    END INTERFACE
-
-    name_len = LEN(name)
-    hdferr = h5pset_integer_c(prp_id, name , name_len, value)
-  END SUBROUTINE h5pset_integer
-
-!
-!****s* H5P (F90)/h5pset_real
-!
-! NAME
-!  h5pset_real
-!
-! PURPOSE
-!  Sets a property list value
-!
-! INPUTS
-!  prp_id 	 - iproperty list identifier to modify
-!  name 	 - name of property to modify
-!  value 	 - value to set property to
-! OUTPUTS
-!  hdferr:	 - error code
-!                   Success:  0
-!                   Failure: -1
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002
-!
-! SOURCE
-  SUBROUTINE h5pset_real(prp_id, name, value, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to modify
-    REAL, INTENT(IN) :: value             ! Property value
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTEGER :: name_len
-
-    INTERFACE
-       INTEGER FUNCTION h5pset_real_c(prp_id, name, name_len, value)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_REAL_C'::h5pset_real_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-         REAL, INTENT(IN) :: value
-       END FUNCTION h5pset_real_c
-    END INTERFACE
-
-    name_len = LEN(name)
-    hdferr = h5pset_real_c(prp_id, name , name_len, value)
-  END SUBROUTINE h5pset_real
-
-!****s* H5P (F90)/h5pset_char
-!
-! NAME
-!  h5pset_char
-!
-! PURPOSE
-!  Sets a property list value
-!
-! INPUTS
-!  prp_id 	 - iproperty list identifier to modify
-!  name 	 - name of property to modify
-!  value 	 - value to set property to
-! OUTPUTS
-!  hdferr	 - error code
-!                   Success:  0
-!                   Failure: -1
-! OPTIONAL PARAMETERS
-!  NONE
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002
-! SOURCE
-  SUBROUTINE h5pset_char(prp_id, name, value, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id    ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name    ! Name of property to modify
-    CHARACTER(LEN=*),   INTENT(IN) :: value ! Property value
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-!*****
-    INTEGER :: name_len
-    INTEGER :: value_len
-
-    INTERFACE
-       INTEGER FUNCTION h5psetc_c(prp_id, name, name_len, value, value_len)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSETC_C'::h5psetc_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         !DEC$ATTRIBUTES reference :: value
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-         CHARACTER(LEN=*), INTENT(IN) :: value
-         INTEGER, INTENT(IN)         :: value_len
-       END FUNCTION h5psetc_c
-    END INTERFACE
-
-    name_len = LEN(name)
-    value_len = LEN(value)
-    hdferr = h5psetc_c(prp_id, name , name_len, value, value_len)
-  END SUBROUTINE h5pset_char
-
-!****s* H5P (F90)/h5pget_integer
-!
-! NAME
-!  h5pget_integer
-!
-! PURPOSE
-!  Gets a property list value
-!
-! INPUTS
-!  prp_id 	 - iproperty list identifier to modify
-!  name 	 - name of property to modify
-! OUTPUTS
-!  value 	 - value of property
-!  hdferr	 - error code
-!                   Success:  0
-!                   Failure: -1
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002
-!
-! SOURCE
-  SUBROUTINE h5pget_integer(prp_id, name, value, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to modify
-    INTEGER,   INTENT(OUT) :: value       ! Property value
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTEGER :: name_len
-
-    INTERFACE
-       INTEGER FUNCTION h5pget_integer_c(prp_id, name, name_len, value)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_INTEGER_C'::h5pget_integer_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-         INTEGER, INTENT(OUT) :: value
-       END FUNCTION h5pget_integer_c
-    END INTERFACE
-
-    name_len = LEN(name)
-    hdferr = h5pget_integer_c(prp_id, name , name_len, value)
-  END SUBROUTINE h5pget_integer
-
-!
-!****s* H5P (F90)/h5pget_real
-!
-! NAME
-!  h5pget_real
-!
-! PURPOSE
-!  Gets a property list value
-!
-! INPUTS
-!  prp_id 	 - iproperty list identifier to modify
-!  name 	 - name of property to modify
-! OUTPUTS
-!  value 	 - value of property
-!  hdferr	 - error code
-!                   Success:  0
-!                   Failure: -1
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002
-! SOURCE
-  SUBROUTINE h5pget_real(prp_id, name, value, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id  ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to modify
-    REAL,   INTENT(OUT) :: value          ! Property value
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTEGER :: name_len
-
-    INTERFACE
-       INTEGER FUNCTION h5pget_real_c(prp_id, name, name_len, value)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_REAL_C'::h5pget_real_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-         REAL, INTENT(OUT) :: value
-       END FUNCTION h5pget_real_c
-    END INTERFACE
-
-    name_len = LEN(name)
-    hdferr = h5pget_real_c(prp_id, name , name_len, value)
-  END SUBROUTINE h5pget_real
-
-!
-!****s* H5P (F90)/h5pget_char
-!
-! NAME
-!  h5pget_char
-!
-! PURPOSE
-!  Gets a property list value
-!
-! INPUTS
-!  prp_id 	 - iproperty list identifier to modify
-!  name 	 - name of property to modify
-! OUTPUTS
-!  value 	 - value of property
-!  hdferr	 - error code
-!                   Success:  0
-!                   Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002
-!
-! SOURCE
-  SUBROUTINE h5pget_char(prp_id, name, value, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id     ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name     ! Name of property to modify
-    CHARACTER(LEN=*),   INTENT(OUT) :: value ! Property value
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-!*****
-    INTEGER :: name_len
-    INTEGER :: value_len
-
-    INTERFACE
-       INTEGER FUNCTION h5pgetc_c(prp_id, name, name_len, value, value_len)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGETC_C'::h5pgetc_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         !DEC$ATTRIBUTES reference :: value
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-         CHARACTER(LEN=*), INTENT(OUT) :: value
-         INTEGER, INTENT(IN)         :: value_len
-       END FUNCTION h5pgetc_c
-    END INTERFACE
-
-    name_len = LEN(name)
-    value_len = LEN(value)
-    hdferr = h5pgetc_c(prp_id, name , name_len, value, value_len)
-  END SUBROUTINE h5pget_char
-
-!
-!****s* H5P (F90)/h5pregister_integer
-!
-! NAME
-!  h5pregister_integer
-!
-! PURPOSE
-!  Registers a permanent property with a property list class.
-!
-! INPUTS
-!  class 	 - property list class to register
-!  permanent property within
-!  name 	 - name of property to register
-!  size 	 - size of property in bytes
-!  value 	 - default value for property in newly
-!  created property lists
-! OUTPUTS
-!  hdferr	 - error code
-!                   Success:  0
-!                   Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 10, 2002
-!
-! SOURCE
-  SUBROUTINE h5pregister_integer(class, name, size, value, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: class   ! Property list class identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to register
-    INTEGER(SIZE_T), INTENT(IN) :: size   ! Size of the property value
-    INTEGER,   INTENT(IN) :: value        ! Property value
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTEGER :: name_len
-
-    INTERFACE
-       INTEGER FUNCTION h5pregister_integer_c(class, name, name_len, size, value)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PREGISTER_INTEGER_C'::h5pregister_integer_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: class
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-         INTEGER(SIZE_T), INTENT(IN) :: size
-         INTEGER, INTENT(IN) :: value
-       END FUNCTION h5pregister_integer_c
-    END INTERFACE
-
-    name_len = LEN(name)
-    hdferr = h5pregister_integer_c(class, name , name_len, size, value)
-  END SUBROUTINE h5pregister_integer
-
-!****s* H5P (F90)/h5pregister_real
-!
-! NAME
-!
-!  h5pregister_real
-!
-! PURPOSE 	Registers a permanent property with a property list class.
-!
-! INPUTS
-!  class 	 - property list class to register
-!                  permanent property within
-!  name 	 - name of property to register
-!  size 	 - size of property in bytes
-!  value 	 - default value for property in newly
-!                  created property lists
-! OUTPUTS
-!  hdferr	 - error code
-!                   Success:  0
-!                   Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  October 10, 2002
-! SOURCE
-  SUBROUTINE h5pregister_real(class, name, size, value, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: class   ! Property list class identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to register
-    INTEGER(SIZE_T), INTENT(IN) :: size   ! size of the property value
-    REAL,   INTENT(IN) :: value           ! Property value
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTEGER :: name_len
-
-    INTERFACE
-       INTEGER FUNCTION h5pregister_real_c(class, name, name_len, size, value)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PREGISTER_REAL_C'::h5pregister_real_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: class
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-         INTEGER(SIZE_T), INTENT(IN) :: size
-         REAL, INTENT(IN) :: value
-       END FUNCTION h5pregister_real_c
-    END INTERFACE
-
-    name_len = LEN(name)
-    hdferr = h5pregister_real_c(class, name , name_len, size, value)
-  END SUBROUTINE h5pregister_real
-
-!
-!****s* H5P (F90)/h5pregister_char
-!
-! NAME
-!  h5pregister_char
-!
-! PURPOSE
-!  Registers a permanent property with a property list class.
-!
-! INPUTS
-!  class 	 - property list class to register
-!                  permanent property within
-!  name 	 - name of property to register
-!  size 	 - size of property in bytes
-!  value 	 - default value for property in newly
-!                  created property lists
-! OUTPUTS
-!  hdferr	 - error code
-!                   Success:  0
-!                   Failure: -1
-! AUTHOR
-!  Elena Pourmal
-!  October 10, 2002
-! SOURCE
-  SUBROUTINE h5pregister_char(class, name, size, value, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: class     ! Property list class identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name    ! Name of property to register
-    INTEGER(SIZE_T), INTENT(IN) :: size     ! size of the property value
-    CHARACTER(LEN=*),   INTENT(IN) :: value ! Property value
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-!*****
-    INTEGER :: name_len
-    INTEGER :: value_len
-
-    INTERFACE
-       INTEGER FUNCTION h5pregisterc_c(class, name, name_len, size, value, &
-            value_len)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PREGISTERC_C'::h5pregisterc_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         !DEC$ATTRIBUTES reference :: value
-         INTEGER(HID_T), INTENT(IN) :: class
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-         INTEGER(SIZE_T), INTENT(IN) :: size
-         CHARACTER(LEN=*), INTENT(IN) :: value
-         INTEGER, INTENT(IN)          :: value_len
-       END FUNCTION h5pregisterc_c
-    END INTERFACE
-
-    name_len = LEN(name)
-    value_len = LEN(value)
-    hdferr = h5pregisterc_c(class, name , name_len, size, value, value_len)
-  END SUBROUTINE h5pregister_char
-!
-!****s* H5P (F90)/h5pinsert_integer
-!
-! NAME
-!  h5pinsert_integer
-!
-! PURPOSE
-!  Registers a temporary property with a property list class.
-!
-! INPUTS
-!  plist 	 - property list identifier
-!  name 	 - name of property to insert
-!  size 	 - size of property in bytes
-!  value 	 - initial value for the property
-! OUTPUTS
-!  hdferr	 - error code
-!                   Success:  0
-!                   Failure: -1
-! AUTHOR
-!  Elena Pourmal
-!  October 10, 2002
-! SOURCE
-  SUBROUTINE h5pinsert_integer(plist, name, size, value, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist   ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to insert
-    INTEGER(SIZE_T), INTENT(IN) :: size   ! Size of the property value
-    INTEGER,   INTENT(IN) :: value        ! Property value
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTEGER :: name_len
-
-    INTERFACE
-       INTEGER FUNCTION h5pinsert_integer_c(plist, name, name_len, size, value)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PINSERT_INTEGER_C'::h5pinsert_integer_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: plist
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-         INTEGER(SIZE_T), INTENT(IN) :: size
-         INTEGER, INTENT(IN) :: value
-       END FUNCTION h5pinsert_integer_c
-    END INTERFACE
-
-    name_len = LEN(name)
-    hdferr = h5pinsert_integer_c(plist, name , name_len, size, value)
-  END SUBROUTINE h5pinsert_integer
-
-!
-!****s* H5P (F90)/h5pinsert_real
-!
-! NAME
-!  h5pinsert_real
-!
-! PURPOSE
-!  Registers a temporary property with a property list class.
-!
-! INPUTS
-!  plist 	 - property list identifier
-!                  permanent property within
-!  name 	 - name of property to insert
-!  size 	 - size of property in bytes
-!  value 	 - initial value for the property
-! OUTPUTS
-!  hdferr	 - error code
-!                   Success:  0
-!                   Failure: -1
-! AUTHOR
-!  Elena Pourmal
-!  October 10, 2002
-! SOURCE
-  SUBROUTINE h5pinsert_real(plist, name, size, value, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist   ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to insert
-    INTEGER(SIZE_T), INTENT(IN) :: size   ! Size of the property value
-    REAL,   INTENT(IN) :: value           ! Property value
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTEGER :: name_len
-
-    INTERFACE
-       INTEGER FUNCTION h5pinsert_real_c(plist, name, name_len, size, value)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PINSERT_REAL_C'::h5pinsert_real_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: plist
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-         INTEGER(SIZE_T), INTENT(IN) :: size
-         REAL, INTENT(IN) :: value
-       END FUNCTION h5pinsert_real_c
-    END INTERFACE
-
-    name_len = LEN(name)
-    hdferr = h5pinsert_real_c(plist, name , name_len, size, value)
-  END SUBROUTINE h5pinsert_real
-
-
-!
-!****s* H5P (F90)/h5pinsert_char
-!
-! NAME
-!  h5pinsert_char
-!
-! PURPOSE
-!  Registers a temporary property with a property list class.
-!
-! INPUTS
-!  plist 	 - property list identifier
-!                  permanent property within
-!  name 	 - name of property to insert
-!  size 	 - size of property in bytes
-!  value 	 - initial value for the property
-! OUTPUTS
-!  hdferr	 - error code
-!                   Success:  0
-!                   Failure: -1
-! AUTHOR
-!  Elena Pourmal
-!  October 10, 2002
-! SOURCE
-SUBROUTINE h5pinsert_char(plist, name, size, value, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist      ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name     ! Name of property to insert
-    INTEGER(SIZE_T), INTENT(IN) :: size      ! Size of property value
-    CHARACTER(LEN=*),   INTENT(IN) :: value  ! Property value
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-!*****
-    INTEGER :: name_len
-    INTEGER :: value_len
-
-    INTERFACE
-       INTEGER FUNCTION h5pinsertc_c(plist, name, name_len, size, value, value_len)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PINSERTC_C'::h5pinsertc_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         !DEC$ATTRIBUTES reference :: value
-         INTEGER(HID_T), INTENT(IN) :: plist
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-         INTEGER(SIZE_T), INTENT(IN) :: size
-         CHARACTER(LEN=*), INTENT(IN) :: value
-         INTEGER, INTENT(IN)         :: value_len
-       END FUNCTION h5pinsertc_c
-    END INTERFACE
-
-    name_len = LEN(name)
-    value_len = LEN(value)
-    hdferr = h5pinsertc_c(plist, name , name_len, size, value, value_len)
-  END SUBROUTINE h5pinsert_char
-
-!
-!****s* H5P (F90)/h5pcreate_class_f
-!
-! NAME
-!  h5pcreate_class_f
-!
-! PURPOSE
-!  Create a new property list class
-!
-! INPUTS
-!  parent 	 - Property list identifier of the parent class
-!                  Possible values include:
-!                    H5P_ROOT_F
-!                    H5P_FILE_CREATE_F
-!                    H5P_FILE_ACCESS_F
-!                    H5P_DATASET_CREATE_F
-!                    H5P_DATASET_XFER_F
-!                    H5P_FILE_MOUNT_F
-!  name 	 - name of the class we are creating
-! OUTPUTS
-!  class 	 - property list class identifier
-!  hdferr	 - error code
-!                   Success: 0
-!                   Failure: -1
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002
-!
-! SOURCE
-  SUBROUTINE h5pcreate_class_f(parent, name, class, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: parent  ! parent property list class
-                                          ! identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! name of property tocreate
-    INTEGER(HID_T), INTENT(OUT) :: class  ! property list class identifier
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTEGER :: name_len
-
-    INTERFACE
-       INTEGER FUNCTION h5pcreate_class_f90_c(parent, name, name_len, class)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PCREATE_CLASS_F90_C'::h5pcreate_class_f90_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: parent
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-         INTEGER(HID_T), INTENT(OUT) :: class
-       END FUNCTION h5pcreate_class_f90_c
-    END INTERFACE
-
-    name_len = LEN(name)
-    hdferr = h5pcreate_class_f90_c(parent, name, name_len, class)
-
-  END SUBROUTINE h5pcreate_class_f
-
-END MODULE H5P_PROVISIONAL
-
diff --git a/fortran/src/H5Rf.c b/fortran/src/H5Rf.c
index 192baf2..9cd9950 100644
--- a/fortran/src/H5Rf.c
+++ b/fortran/src/H5Rf.c
@@ -1,6 +1,6 @@
 /****h* H5Rf/H5Rf
  * PURPOSE
- *   This file contains C stubs for H5R Fortran APIs
+ *  This file contains C stubs for H5R Fortran APIs
  *
  * COPYRIGHT
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -24,68 +24,21 @@
 #include "H5f90.h"
 #include "H5Eprivate.h"
 
-/****if* H5Rf/h5rcreate_object_c
- * NAME
- *     h5rcreate_object_c
- * PURPOSE
- *     Call H5Rcreate to create a reference to an object
- * INPUTS
- *     loc_id - file or group identifier
- *       name - name of the dataset
- *    namelen - name length
- * OUTPUTS
- *     ref  - reference to the object
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *  Wednesday, December 1, 1999
- * SOURCE
-*/
-int_f
-nh5rcreate_object_c(haddr_t_f *ref, hid_t_f *loc_id, _fcd name, int_f *namelen)
-/******/
-{
-     char *c_name = NULL;
-     hobj_ref_t ref_c;
-     int_f ret_value = 0;
-
-     /*
-      * Convert FORTRAN name to C name
-      */
-     if(NULL == (c_name = (char *)HD5f2cstring(name, (size_t)*namelen)))
-         HGOTO_DONE(FAIL)
-
-     /*
-      * Call H5Rcreate function.
-      */
-     if(H5Rcreate(&ref_c, *loc_id, c_name, H5R_OBJECT, (hid_t)-1) < 0)
-         HGOTO_DONE(FAIL)
-
-     /* Copy the reference created */
-     *ref = (haddr_t_f)ref_c;
-
-done:
-     if(c_name)
-         HDfree(c_name);
-     return ret_value;
-} /* nh5rcreate_object_c() */
-
 /****if* H5Rf/h5rcreate_region_c
  * NAME
- *        h5rcreate_region_c
+ *  h5rcreate_region_c
  * PURPOSE
- *     Call H5Rcreate to create a reference to dataset region
- *              region
+ *  Call H5Rcreate to create a reference to dataset region
+ *  region
  * INPUTS
- *      loc_id - file or group identifier
- *              name - name of the dataset
- *              namelen - name length
- *              space_id - dataset space identifier
+ *  loc_id - file or group identifier
+ *  name - name of the dataset
+ *  namelen - name length
+ *  space_id - dataset space identifier
  * OUTPUTS
- *     ref  - reference to the dataset region
+ *  ref  - reference to the dataset region
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
  *  Wednesday, December 1, 1999
@@ -94,7 +47,7 @@ done:
  * SOURCE
 */
 int_f
-nh5rcreate_region_c(int_f *ref, hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *space_id)
+h5rcreate_region_c(int_f *ref, hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *space_id)
 /******/
 {
      char *c_name = NULL;
@@ -120,7 +73,7 @@ done:
      if(c_name)
          HDfree(c_name);
      return ret_value;
-} /* end nh5rcreate_region_c() */
+} /* end h5rcreate_region_c() */
 
 /****if* H5Rf/h5rcreate_ptr_c
  * NAME
@@ -165,89 +118,6 @@ h5rcreate_ptr_c (void *ref, hid_t_f *loc_id, _fcd name, int_f *namelen, int_f *r
      return ret_value;
 }
 
-/****if* H5Rf/h5rdereference_region_c
- * NAME
- *        h5rdereference_region_c
- * PURPOSE
- *     Call H5Rdereference to dereference to dataset region
- * INPUTS
- *      dset_id - dataset identifier
- *              ref - reference to the dataset region
- * OUTPUTS
- *     obj_id - dereferenced dataset identifier
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *  Wednesday, December 1, 1999
- * HISTORY
- *
- * SOURCE
-*/
-int_f
-nh5rdereference_region_c(hid_t_f *dset_id, int_f *ref, hid_t_f *obj_id)
-/******/
-{
-     hdset_reg_ref_t ref_c;
-     hid_t c_obj_id;
-     int_f ret_value = 0;
-
-     /* Copy the reference to dereference */
-     HDmemcpy(&ref_c, ref, H5R_DSET_REG_REF_BUF_SIZE);
-
-     /*
-      * Call H5Rdereference function.
-      */
-     if((c_obj_id = H5Rdereference((hid_t)*dset_id, H5R_DATASET_REGION, &ref_c)) < 0)
-         HGOTO_DONE(FAIL)
-
-     /* Copy the object's ID */
-     *obj_id = (hid_t_f)c_obj_id;
-
-done:
-     return ret_value;
-} /* end nh5rdereference_region_c() */
-
-/****if* H5Rf/h5rdereference_object_c
- * NAME
- *        h5rdereference_object_c
- * PURPOSE
- *     Call H5Rdereference to dereference an object
- * INPUTS
- *      dset_id - dataset identifier
- *              ref - reference to an object
- * OUTPUTS
- *     obj_id - dereferenced  object identifier
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  Elena Pourmal
- *  Wednesday, December 1, 1999
- * HISTORY
- *
- * SOURCE
-*/
-int_f
-nh5rdereference_object_c(hid_t_f *dset_id, haddr_t_f *ref, hid_t_f *obj_id)
-/******/
-{
-     hid_t c_obj_id;
-     hobj_ref_t ref_c = (hobj_ref_t)*ref;
-     int_f ret_value = 0;
-
-     /*
-      * Call H5Rdereference function.
-      */
-     if((c_obj_id = H5Rdereference((hid_t)*dset_id, H5R_OBJECT, &ref_c)) < 0)
-         HGOTO_DONE(FAIL)
-
-     /* Copy the object's ID */
-     *obj_id = (hid_t_f)c_obj_id;
-
-done:
-     return ret_value;
-} /* end nh5rdereference_object_c() */
-
 /****if* H5Rf/h5rdereference_ptr_c
  * NAME
  *  h5rdereference_ptr_c
@@ -255,7 +125,7 @@ done:
  *  Call H5Rdereference
  * INPUTS
  *  obj_id  - Valid identifier for the file containing the
- *            referenced object or any object in that file.
+ *  referenced object or any object in that file.
  *  ref_typ - The reference type of ref.
  *  ref     - Object reference
  * OUTPUTS
@@ -279,7 +149,7 @@ h5rdereference_ptr_c (hid_t_f *obj_id, int_f *ref_type, void *ref, hid_t_f *ref_
   /*
    * Call H5Rdereference function.
    */
-  c_ref_obj_id = H5Rdereference((hid_t)*obj_id, (H5R_type_t)*ref_type, ref);
+  c_ref_obj_id = H5Rdereference2((hid_t)*obj_id, H5P_DEFAULT, (H5R_type_t)*ref_type, ref);
   if(c_ref_obj_id < 0) return ret_value;
   *ref_obj_id = (hid_t_f)c_ref_obj_id;
   ret_value = 0;
@@ -292,8 +162,8 @@ h5rdereference_ptr_c (hid_t_f *obj_id, int_f *ref_type, void *ref, hid_t_f *ref_
  * PURPOSE
  *  Call H5Rget_region to dereference dataspace region
  * INPUTS
- *   dset_id - dataset identifier
- *       ref - reference to the dataset region
+ *  dset_id - dataset identifier
+ *  ref - reference to the dataset region
  * OUTPUTS
  *  space_id - dereferenced  dataset dataspace identifier
  * RETURNS
@@ -306,7 +176,7 @@ h5rdereference_ptr_c (hid_t_f *obj_id, int_f *ref_type, void *ref, hid_t_f *ref_
  * SOURCE
 */
 int_f
-nh5rget_region_region_c(hid_t_f *dset_id, int_f *ref, hid_t_f *space_id)
+h5rget_region_region_c(hid_t_f *dset_id, int_f *ref, hid_t_f *space_id)
 /******/
 {
      hid_t c_space_id;
@@ -327,7 +197,7 @@ nh5rget_region_region_c(hid_t_f *dset_id, int_f *ref, hid_t_f *space_id)
 
 done:
      return ret_value;
-} /* end nh5rget_region_region_c() */
+} /* end h5rget_region_region_c() */
 
 /****if* H5Rf/h5rget_region_ptr_c
  * NAME
@@ -335,8 +205,8 @@ done:
  * PURPOSE
  *  Call H5Rget_region to dereference dataspace region
  * INPUTS
- *   dset_id - dataset identifier
- *       ref - reference to the dataset region
+ *  dset_id - dataset identifier
+ *  ref - reference to the dataset region
  * OUTPUTS
  *  space_id - dereferenced  dataset dataspace identifier
  * RETURNS
@@ -366,22 +236,22 @@ h5rget_region_ptr_c(hid_t_f *dset_id, void *ref, hid_t_f *space_id)
 
 done:
      return ret_value;
-} /* end nh5rget_region_ptr_c() */
+} /* end h5rget_region_ptr_c() */
 
 
 /****if* H5Rf/h5rget_object_type_obj_c
  * NAME
- *        h5rget_object_type_obj_c
+ *  h5rget_object_type_obj_c
  * PURPOSE
- *     Call H5Rget_object_type to retrieve the type of the object reference points
- *              to
+ *  Call H5Rget_object_type to retrieve the type of the object reference points
+ *  to
  * INPUTS
- *      dset_id - dataset identifier
- *              ref - reference to the dataset region
+ *  dset_id - dataset identifier
+ *  ref - reference to the dataset region
  * OUTPUTS
- *     obj_type - type of dereferenced object
+ *  obj_type - type of dereferenced object
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
  *  Wednesday, December 1, 1999
@@ -390,7 +260,7 @@ done:
  * SOURCE
 */
 int_f
-nh5rget_object_type_obj_c(hid_t_f *dset_id, haddr_t_f *ref, int_f *obj_type)
+h5rget_object_type_obj_c(hid_t_f *dset_id, haddr_t_f *ref, int_f *obj_type)
 /******/
 {
      H5O_type_t c_obj_type;
@@ -408,125 +278,7 @@ nh5rget_object_type_obj_c(hid_t_f *dset_id, haddr_t_f *ref, int_f *obj_type)
 
 done:
      return ret_value;
-} /* end nh5rget_object_type_obj_c() */
-
-/****if* H5Rf/h5rget_name_object_c
- * NAME
- *        h5rget_name_object_c
- * PURPOSE
- *     Call H5Rget_name for an object
- * INPUTS
- *
- *       loc_id - Identifier for the dataset containing the reference or for the group that dataset is in.
- *          ref - An object or dataset region reference.
- *
- * OUTPUTS
- *     name - A name associated with the referenced object or dataset region.
- *              size - The size of the name buffer.
- *
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  M. Scot Breitenfeld
- *  March 31, 2008
- * HISTORY
- *
- * SOURCE
-*/
-int_f
-nh5rget_name_object_c(hid_t_f *loc_id, haddr_t_f *ref, _fcd name, size_t_f *name_len, size_t_f *size_default)
-/******/
-{
-     hobj_ref_t ref_c = (hobj_ref_t)*ref;
-     ssize_t c_size;
-     size_t c_bufsize = (size_t)*name_len + 1;
-     char *c_buf = NULL;  /* Buffer to hold C string */
-     int_f ret_value = 0;
-
-
-     /*
-      * Allocate buffer to hold name of an attribute
-      */
-     if(NULL == (c_buf = (char *)HDmalloc(c_bufsize)))
-         HGOTO_DONE(FAIL)
-        
-     /*
-      * Call H5Rget_name function.
-      */
-     if((c_size = H5Rget_name((hid_t)*loc_id, H5R_OBJECT, &ref_c, c_buf, c_bufsize)) < 0)
-         HGOTO_DONE(FAIL)
-
-     /*
-      * Convert C name to FORTRAN and place it in the given buffer
-      */
-     HD5packFstring(c_buf, _fcdtocp(name), c_bufsize-1);
-     *size_default = (size_t_f)c_size;
-
-done:
-     if(c_buf) 
-         HDfree(c_buf);
-     return ret_value;
-} /* end nh5rget_name_object_c() */
-
-/****if* H5Rf/h5rget_name_region_c
- * NAME
- *        h5rget_name_region_c
- * PURPOSE
- *     Call H5Rget_name for a dataset region
- * INPUTS
- *
- *       loc_id - Identifier for the dataset containing the reference or for the group that dataset is in.
- *          ref - An object or dataset region reference.
- *
- * OUTPUTS
- *     name - A name associated with the referenced object or dataset region.
- *              size - The size of the name buffer.
- *
- * RETURNS
- *     0 on success, -1 on failure
- * AUTHOR
- *  M. Scot Breitenfeld
- *  March 31, 2008
- * HISTORY
- *
- * SOURCE
-*/
-int_f
-nh5rget_name_region_c(hid_t_f *loc_id, int_f *ref, _fcd name, size_t_f *name_len, size_t_f *size_default)
-/******/
-{
-     hdset_reg_ref_t ref_c;
-     ssize_t c_size;
-     size_t c_bufsize = (size_t)*name_len + 1;
-     char *c_buf = NULL;  /* Buffer to hold C string */
-     int_f ret_value = 0;
-
-     /* Copy the reference to query */
-     HDmemcpy(&ref_c, ref, H5R_DSET_REG_REF_BUF_SIZE);
-
-     /*
-      * Allocate buffer to hold name of an attribute
-      */
-     if(NULL == (c_buf = (char *)HDmalloc(c_bufsize)))
-         HGOTO_DONE(FAIL)
-
-     /*
-      * Call H5Rget_name function.
-      */
-     if((c_size = H5Rget_name((hid_t)*loc_id, H5R_DATASET_REGION, &ref_c, c_buf, c_bufsize)) < 0)
-         HGOTO_DONE(FAIL)
-
-     /*
-      * Convert C name to FORTRAN and place it in the given buffer
-      */
-     HD5packFstring(c_buf, _fcdtocp(name), c_bufsize - 1);
-     *size_default = (size_t_f)c_size;
-
-done:
-     if(c_buf) 
-         HDfree(c_buf);
-     return ret_value;
-}
+} /* end h5rget_object_type_obj_c() */
 
 /****if* H5Rf/h5rget_name_ptr_c
  * NAME
@@ -535,13 +287,13 @@ done:
  *  Call H5Rget_name
  * INPUTS
  *
- *       loc_id - Identifier for the dataset containing the reference or for the group that dataset is in.
- *     ref_type - Type of reference.
- *          ref - An object or dataset region reference.
+ *  loc_id - Identifier for the dataset containing the reference or for the group that dataset is in.
+ *  ref_type - Type of reference.
+ *  ref - An object or dataset region reference.
  *
  * OUTPUTS
- *     name - A name associated with the referenced object or dataset region.
- *     size - The size of the name buffer.
+ *  name - A name associated with the referenced object or dataset region.
+ *  size - The size of the name buffer.
  *
  * RETURNS
  *  0 on success, -1 on failure
@@ -589,24 +341,24 @@ h5rget_name_ptr_c (hid_t_f *loc_id, int_f *ref_type, void *ref, _fcd name, size_
 
 /****if* H5Rf/h5rget_obj_type_c
  * NAME
- *   h5rget_obj_type_c
+ *  h5rget_obj_type_c
  * PURPOSE
- *   Call H5Rget_obj_type
+ *  Call H5Rget_obj_type
  * INPUTS
- *   loc_id   - Identifier for the dataset containing the reference or
- *              for the group that dataset is in.
- *   ref_type - Type of reference to query.
- *   ref      - Reference to query.
+ *  loc_id   - Identifier for the dataset containing the reference or
+ *  for the group that dataset is in.
+ *  ref_type - Type of reference to query.
+ *  ref      - Reference to query.
  *
  * OUTPUTS
- *   obj_type - Type of referenced object. These are defined in H5Opublic.h,
- *              enum H5O_type_t
+ *  obj_type - Type of referenced object. These are defined in H5Opublic.h,
+ *  enum H5O_type_t
  *              
  * RETURNS
- *   0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
- *   M. Scot Breitenfeld
- *   December 17, 2008
+ *  M. Scot Breitenfeld
+ *  December 17, 2008
  *
  * SOURCE
 */
diff --git a/fortran/src/H5Rff.F90 b/fortran/src/H5Rff.F90
new file mode 100644
index 0000000..a90bd9a
--- /dev/null
+++ b/fortran/src/H5Rff.F90
@@ -0,0 +1,792 @@
+!****h* ROBODoc/H5R
+!
+! NAME
+!  MODULE H5R
+!
+! FILE
+!  fortran/src/H5Rff.f90
+!
+! PURPOSE
+!  This file contains Fortran interfaces for H5R functions.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! NOTES
+!
+!       _____ __  __ _____   ____  _____ _______       _   _ _______
+!      |_   _|  \/  |  __ \ / __ \|  __ \__   __|/\   | \ | |__   __|
+! ****   | | | \  / | |__) | |  | | |__) | | |  /  \  |  \| |  | |    ****
+! ****   | | | |\/| |  ___/| |  | |  _  /  | | / /\ \ | . ` |  | |    ****
+! ****  _| |_| |  | | |    | |__| | | \ \  | |/ ____ \| |\  |  | |    ****
+!      |_____|_|  |_|_|     \____/|_|  \_\ |_/_/    \_\_| \_|  |_|
+!
+!  If you add a new H5R function you must add the function name to the
+!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
+!  This is needed for Windows based operating systems.
+!
+!*****
+
+MODULE H5R 
+  USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR, C_CHAR, C_SIGNED_CHAR
+  USE H5GLOBAL
+
+  ! If you change the value of these parameters, do not forget to change corresponding
+  ! values in the H5f90.h file.
+  !        INTEGER, PARAMETER :: REF_OBJ_BUF_LEN = 2
+  !        INTEGER, PARAMETER :: REF_REG_BUF_LEN = 3
+  !
+  !        TYPE hobj_ref_t_f
+  !             INTEGER ref(REF_OBJ_BUF_LEN)
+  !        END TYPE
+  !
+  !        TYPE hdset_reg_ref_t_f
+  !             INTEGER ref(REF_REG_BUF_LEN)
+  !        END TYPE
+  !
+
+  INTERFACE h5rget_object_type_f
+
+     MODULE PROCEDURE h5rget_object_type_obj_f
+
+  END INTERFACE
+
+  TYPE :: hdset_reg_ref_t_f03 
+     INTEGER(C_SIGNED_CHAR), DIMENSION(1:H5R_DSET_REG_REF_BUF_SIZE_F) :: ref
+  END TYPE hdset_reg_ref_t_f03
+
+  INTERFACE h5rget_region_f
+
+     MODULE PROCEDURE h5rget_region_region_f ! obsolete
+     MODULE PROCEDURE h5rget_region_ptr_f  ! F2003
+
+  END INTERFACE
+
+
+  INTERFACE h5rcreate_f
+
+     MODULE PROCEDURE h5rcreate_object_f ! obsolete
+     MODULE PROCEDURE h5rcreate_region_f ! obsolete
+     MODULE PROCEDURE h5rcreate_ptr_f  ! F2003
+
+  END INTERFACE
+
+  INTERFACE h5rdereference_f
+
+     MODULE PROCEDURE h5rdereference_object_f ! obsolete
+     MODULE PROCEDURE h5rdereference_region_f ! obsolete
+     MODULE PROCEDURE h5rdereference_ptr_f ! F2003
+
+  END INTERFACE
+
+  INTERFACE h5rget_name_f
+
+     MODULE PROCEDURE h5rget_name_object_f ! obsolete
+     MODULE PROCEDURE h5rget_name_region_f ! obsolete
+     MODULE PROCEDURE h5rget_name_ptr_f ! F2003
+
+  END INTERFACE
+
+  INTERFACE
+     INTEGER FUNCTION h5rget_name_ptr_c(loc_id, ref_type, ref, name, name_len, size_default) &
+          BIND(C, NAME='h5rget_name_ptr_c')
+       IMPORT :: c_char, c_ptr
+       IMPORT :: HID_T, SIZE_T
+       IMPLICIT NONE
+       INTEGER(HID_T), INTENT(IN) :: loc_id
+       INTEGER, INTENT(IN) :: ref_type
+       TYPE(C_PTR), INTENT(IN), VALUE :: ref
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+       INTEGER(SIZE_T) :: name_len
+       INTEGER(SIZE_T) :: size_default
+     END FUNCTION h5rget_name_ptr_c
+  END INTERFACE
+
+  INTERFACE
+     INTEGER FUNCTION h5rdereference_ptr_c(obj_id, ref_type, ref, ref_obj_id) &
+          BIND(C, NAME='h5rdereference_ptr_c')
+       IMPORT :: c_ptr
+       IMPORT :: HID_T
+       IMPLICIT NONE
+       INTEGER(HID_T), INTENT(IN) :: obj_id
+       INTEGER, INTENT(IN) :: ref_type
+       TYPE(C_PTR), INTENT(IN), VALUE :: ref
+       INTEGER(HID_T), INTENT(OUT) :: ref_obj_id
+     END FUNCTION h5rdereference_ptr_c
+  END INTERFACE
+
+  INTERFACE
+     INTEGER FUNCTION h5rcreate_ptr_c(ref, loc_id, name, namelen, ref_type, space_id) &
+          BIND(C, NAME='h5rcreate_ptr_c')
+       IMPORT :: c_ptr, c_char
+       IMPORT :: HID_T
+       IMPLICIT NONE
+       TYPE(C_PTR), VALUE :: ref
+       INTEGER(HID_T), INTENT(IN) :: loc_id
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+       INTEGER :: namelen
+       INTEGER, INTENT(IN) :: ref_type
+       INTEGER(HID_T), INTENT(IN) :: space_id
+     END FUNCTION h5rcreate_ptr_c
+  END INTERFACE
+
+  INTERFACE
+     INTEGER FUNCTION h5rget_region_ptr_c(dset_id, ref, space_id) &
+          BIND(C, NAME='h5rget_region_ptr_c')
+       IMPORT :: c_ptr
+       IMPORT :: HID_T
+       IMPLICIT NONE
+       INTEGER(HID_T), INTENT(IN) :: dset_id
+       TYPE(C_PTR), VALUE :: ref
+       INTEGER(HID_T), INTENT(OUT) :: space_id
+     END FUNCTION h5rget_region_ptr_c
+  END INTERFACE
+
+
+CONTAINS
+
+!****s* H5R/h5rget_object_type_obj_f
+!
+! NAME
+!  h5rget_object_type_obj_f
+!
+! PURPOSE
+!  Retrieves the type of object that an object reference points to.
+!
+! INPUTS
+!  dset_id 	 - identifier of the dataset containing
+!                  reference to the objects
+!  ref 	         - reference to open
+! OUTPUTS
+!  obj_type 	 - object_type, possible values:
+!                    H5G_UNKNOWN_F
+!                    H5G_GROUP_F 
+!                    H5G_DATASET_F
+!                    H5G_TYPE_F
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! NOTES
+!  This is a module procedure for the h5rget_object_type_f
+!  subroutine.
+! SOURCE
+  SUBROUTINE h5rget_object_type_obj_f(dset_id, ref, obj_type, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
+    TYPE(hobj_ref_t_f), INTENT(IN) :: ref   ! Object reference
+    INTEGER, INTENT(OUT) :: obj_type     ! Object type
+                                         !  H5G_UNKNOWN_F
+                                         !  H5G_GROUP_F
+                                         !  H5G_DATASET_F
+                                         !  H5G_TYPE_F
+    INTEGER, INTENT(OUT) :: hdferr       ! Error code
+!*****
+    INTEGER(HADDR_T) :: ref_f          ! Local buffer to pass reference
+
+    INTERFACE
+       INTEGER FUNCTION h5rget_object_type_obj_c(dset_id, ref_f, obj_type) BIND(C, NAME='h5rget_object_type_obj_c')
+         IMPORT :: HID_T, HADDR_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dset_id
+         INTEGER(HADDR_T) :: ref_f
+         INTEGER, INTENT(OUT) :: obj_type
+       END FUNCTION h5rget_object_type_obj_c
+    END INTERFACE
+
+    ref_f = ref%ref
+    hdferr = h5rget_object_type_obj_c(dset_id, ref_f, obj_type )
+
+  END SUBROUTINE h5rget_object_type_obj_f
+
+
+!****s* H5R/h5rget_region_region_f
+!
+! NAME
+!  h5rget_region_region_f
+!
+! PURPOSE
+!  Retrieves a dataspace with the specified region selected
+!
+! INPUTS
+!  dset_id 	 - identifier of the dataset containing
+!                  reference to the regions
+!  ref 	         - reference to open
+! OUTPUTS
+!  space_id 	 - dataspace identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY 	
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! NOTES
+!  This is a module procedure for the h5rget_region_f subroutine.
+!
+! SOURCE
+  SUBROUTINE h5rget_region_region_f(dset_id, ref, space_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id      ! Dataset identifier
+    TYPE(hdset_reg_ref_t_f), INTENT(IN) :: ref ! Dataset region reference
+    INTEGER(HID_T), INTENT(OUT) :: space_id    ! Space identifier
+    INTEGER, INTENT(OUT) :: hdferr             ! Error code
+!*****
+    INTEGER :: ref_f(REF_REG_BUF_LEN)          ! Local buffer to pass reference
+
+    INTERFACE
+       INTEGER FUNCTION h5rget_region_region_c(dset_id, ref_f, space_id) BIND(C, NAME='h5rget_region_region_c')
+         IMPORT :: HID_T, REF_REG_BUF_LEN
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dset_id
+         INTEGER :: ref_f(REF_REG_BUF_LEN)
+         INTEGER(HID_T), INTENT(OUT) :: space_id
+       END FUNCTION h5rget_region_region_c
+    END INTERFACE
+
+    ref_f = ref%ref
+    hdferr = h5rget_region_region_c(dset_id, ref_f, space_id )
+
+  END SUBROUTINE h5rget_region_region_f
+
+!****s* H5R/h5rget_region_ptr_f
+!
+! NAME
+!  h5rget_region_ptr_f
+!
+! PURPOSE
+!  Retrieves a dataspace with the specified region 
+!  selected using pointer
+!
+! INPUTS
+!  dset_id 	 - identifier of the dataset containing
+!                  reference to the regions
+!  ref 	         - reference to open
+! OUTPUTS
+!  space_id 	 - dataspace identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  M. Scot Breitenfeld
+!  August 4, 2012
+!
+! NOTES
+!  This is a module procedure for the h5rget_region_f subroutine.
+!
+! SOURCE
+  SUBROUTINE h5rget_region_ptr_f(dset_id, ref, space_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dset_id      ! Dataset identifier
+    TYPE(C_PTR), INTENT(IN) :: ref ! Dataset region reference
+    INTEGER(HID_T), INTENT(OUT) :: space_id    ! Space identifier
+    INTEGER, INTENT(OUT) :: hdferr             ! Error code
+!*****
+
+    hdferr = h5rget_region_ptr_c(dset_id, ref, space_id )
+
+  END SUBROUTINE h5rget_region_ptr_f
+
+
+!****s* H5R (F03)/h5rcreate_object_f
+!
+! NAME
+!  h5rcreate_object_f
+!
+! PURPOSE
+!  Creates reference to the object
+!
+! Inputs:
+!  loc_id    - location identifier
+!  name      - name of the object at the specified location
+! Outputs:
+!  ref 	     - reference to the specified object
+!  hdferr    - returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! NOTES
+!  This is a module procedure for the h5rcreate_f subroutine.
+!
+! Signature:
+  SUBROUTINE h5rcreate_object_f(loc_id, name, ref, hdferr)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id   ! Location identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the object at location specified
+                                           ! by loc_id identifier
+    TYPE(hobj_ref_t_f), INTENT(INOUT), TARGET :: ref   ! Object reference
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!*****
+    INTEGER :: namelen                     ! Name length
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(ref)
+
+    namelen = LEN(name)
+
+    hdferr = h5rcreate_ptr_c(f_ptr, loc_id, name, namelen, INT(0), INT(-1,HID_T))
+
+  END SUBROUTINE h5rcreate_object_f
+
+!****s* H5R (F90)/h5rcreate_region_f
+!
+! NAME
+!  h5rcreate_region_f
+!
+! PURPOSE
+!  Creates reference to the dataset region
+!
+! INPUTS
+!  loc_id 	 - location identifier
+!  name 	 - name of the dataset at the specified location
+!  space_id 	 - dataspace identifier that describes selected region
+! OUTPUTS
+!  ref 	         - reference to the dataset region
+!  hdferr        - returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! NOTES
+!  This is a module procedure for the h5rcreate_f subroutine.
+!
+! SOURCE
+  SUBROUTINE h5rcreate_region_f(loc_id, name, space_id, ref, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id   ! Location identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the dataset at location specified
+                                           ! by loc_id identifier
+    INTEGER(HID_T), INTENT(IN) :: space_id ! Dataset's dataspace identifier
+    TYPE(hdset_reg_ref_t_f), INTENT(OUT) :: ref ! Dataset region reference
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!*****
+    INTEGER :: namelen                     ! Name length
+    INTEGER :: ref_f(REF_REG_BUF_LEN)      ! Local buffer to pass reference
+
+    INTERFACE
+       INTEGER FUNCTION h5rcreate_region_c(ref_f, loc_id, name, namelen, space_id) BIND(C,NAME='h5rcreate_region_c')
+         IMPORT :: HID_T, REF_REG_BUF_LEN
+         IMPORT :: C_CHAR
+         IMPLICIT NONE
+         INTEGER :: ref_f(REF_REG_BUF_LEN)
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER :: namelen
+         INTEGER(HID_T), INTENT(IN) :: space_id
+       END FUNCTION h5rcreate_region_c
+    END INTERFACE
+
+    namelen = LEN(name)
+    ref_f = 0
+    hdferr = h5rcreate_region_c(ref_f, loc_id, name, namelen, space_id )
+    ref%ref = ref_f
+
+  END SUBROUTINE h5rcreate_region_f
+
+!****s* H5R (F03)/h5rcreate_ptr_f
+!
+! NAME
+!  h5rcreate_ptr_f
+!
+! PURPOSE
+!  Creates a reference.
+!
+! Inputs:
+!  loc_id     - location identifier
+!  name	      - name of the dataset at the specified location
+!  ref_type   - type of reference:
+!                H5R_OBJECT
+!                H5T_STD_REF_DSETREG
+! Outputs:
+!  ref	      - reference created by the function call.
+!  hdferr     - returns 0 if successful and -1 if fails.
+! OPTIONAL
+!  space_id   - dataspace identifier that describes selected region
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  June 20, 2008
+!
+! NOTES
+!  This is a module procedure for the h5rcreate_f
+!  subroutine where the output is a pointer.
+!
+! Signature:
+  SUBROUTINE h5rcreate_ptr_f(loc_id, name, ref_type, ref, hdferr, space_id)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id     ! Location identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name     ! Name of the dataset at location specified
+                                             ! by loc_id identifier
+    INTEGER, INTENT(IN) :: ref_type          ! type of reference
+    TYPE(C_PTR), INTENT(INOUT) :: ref        ! Reference created by the function call
+    INTEGER, INTENT(OUT) :: hdferr           ! Error code
+    INTEGER(HID_T), INTENT(IN), OPTIONAL :: space_id ! Dataset's dataspace identifier
+!*****
+    INTEGER :: namelen                       ! Name length
+    INTEGER(HID_T) :: space_id_c
+
+    namelen = LEN(name)
+    space_id_c = -1
+    IF(PRESENT(space_id)) space_id_c =  space_id
+    hdferr = h5rcreate_ptr_c(ref, loc_id, name, namelen, ref_type, space_id_c)
+
+  END SUBROUTINE h5rcreate_ptr_f
+!****s* H5R (F03)/h5rdereference_object_f
+!
+! NAME
+!  h5rdereference_object_f
+!
+! PURPOSE
+!  Opens the HDF5 object referenced
+!
+! Inputs:
+!  dset_id  - identifier of the dataset containing
+!             reference
+!  ref 	    - reference to open
+! Outputs:
+!  obj_id   - object_identifier
+!  hdferr   - returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! NOTES
+!  This is a module procedure for the h5rdereference_f subroutine.
+!
+! Signature:
+  SUBROUTINE h5rdereference_object_f(obj_id, ref, ref_obj_id, hdferr)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: obj_id          ! Dataset identifier
+    TYPE(hobj_ref_t_f), INTENT(IN), TARGET :: ref ! Object reference
+    INTEGER(HID_T), INTENT(OUT) :: ref_obj_id     ! Object identifier
+    INTEGER, INTENT(OUT) :: hdferr                ! Error code
+!*****
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(ref)
+    hdferr = h5rdereference_ptr_c(obj_id, 0, f_ptr, ref_obj_id)
+
+  END SUBROUTINE h5rdereference_object_f
+!****s* H5R (F03)/h5rdereference_region_f
+!
+! NAME
+!  h5rdereference_region_f
+!
+! PURPOSE
+!  Opens the dataset region
+!
+! Inputs:
+!  dset_id  - identifier of the dataset containing
+!             reference to teh regions
+!  ref 	    - reference to open
+! Outputs:
+!  obj_id   - dataspace identifier
+!  hdferr   - returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! NOTES
+!  This is a module procedure for the h5rdereference_f subroutine.
+!
+! Signature:
+  SUBROUTINE h5rdereference_region_f(obj_id, ref, ref_obj_id, hdferr)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: obj_id   ! Dataset identifier
+    TYPE(hdset_reg_ref_t_f), INTENT(IN), TARGET :: ref   ! Object reference
+    INTEGER(HID_T), INTENT(OUT) :: ref_obj_id  ! Dataspace identifier
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+!*****
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(ref)
+    hdferr = h5rdereference_ptr_c(obj_id, 1, f_ptr, ref_obj_id)
+
+  END SUBROUTINE h5rdereference_region_f
+
+!****s* H5R (F03)/h5rdereference_ptr_f
+!
+! NAME
+!  h5rdereference_ptr_f
+!
+! PURPOSE
+!  Opens the HDF5 object referenced.
+!
+! Inputs:
+!  obj_id     - valid identifier for the file containing the
+!               referenced object or any object in that file.
+!  ref_type   - the reference type of ref.
+!  ref        - Reference to open.
+! Outputs:
+!  ref_obj_id - identifier of referenced object
+!  hdferr     - returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  June 20, 2008
+!
+! NOTES
+!  This is a module procedure for the h5rdereference_f
+!  subroutine using pointers.
+!
+! Signature:
+  SUBROUTINE h5rdereference_ptr_f(obj_id, ref_type, ref, ref_obj_id, hdferr)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: obj_id  ! Valid identifier for the file containing the
+                                          !  referenced object or any object in that file.
+    INTEGER, INTENT(IN) :: ref_type       ! The reference type of ref.
+    TYPE(C_PTR), INTENT(IN) :: ref        ! Object reference
+    INTEGER(HID_T), INTENT(OUT) :: ref_obj_id
+                                          ! Identifier of referenced object
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+!***** 
+    hdferr = h5rdereference_ptr_c(obj_id, ref_type, ref, ref_obj_id)
+
+  END SUBROUTINE h5rdereference_ptr_f
+!
+!****s* H5R (F03)/h5rget_name_object_f
+!
+! NAME
+!  h5rget_name_object_f
+!
+! PURPOSE
+!  Retrieves a name of a referenced object.
+!
+! Inputs:
+!  loc_id    - Identifier for the file containing the reference or for any object in that file.
+!  ref 	     - An object or dataset region reference.
+!
+! Outputs:
+!  name      - A name associated with the referenced object or dataset region.
+!  hdferr    - Returns 0 if successful and -1 if fails.
+!
+! Optional parameters:
+!  size     - The size of the name buffer, returning 0 (zero) if no name is associated 
+!             with the identifier.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 28, 2008
+!
+! Signature:
+  SUBROUTINE h5rget_name_object_f(loc_id,  ref, name, hdferr, size)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id
+    TYPE(hobj_ref_t_f), INTENT(IN), TARGET :: ref
+    INTEGER(SIZE_T), OPTIONAL, INTENT(OUT) :: size
+    CHARACTER(LEN=*), INTENT(INOUT) :: name
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+
+    INTEGER(SIZE_T) :: size_default
+    INTEGER(SIZE_T) :: name_len
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(ref)
+
+    name_len=LEN(name)
+
+    hdferr = h5rget_name_ptr_c(loc_id, 0, f_ptr, name, name_len, size_default)
+
+    IF(PRESENT(size)) size = size_default
+
+  END SUBROUTINE h5rget_name_object_f
+!****s* H5R (F03)/h5rget_name_region_f
+!
+! NAME
+!  h5rget_name_region_f
+!
+! PURPOSE
+!  Retrieves a name of a dataset region.
+!
+! Inputs:
+!  loc_id  - Identifier for the file containing the reference or for any object in that file.
+!  ref 	   - An object or dataset region reference.
+!
+! Outputs:
+!  name    - A name associated with the referenced object or dataset region.
+!  hdferr  - Returns 0 if successful and -1 if fails.
+!
+! Optional parameters:
+!  size    - The size of the name buffer, returning 0 (zero) if no name is associated with the identifier
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 28, 2008
+!
+! Signature:
+  SUBROUTINE h5rget_name_region_f(loc_id, ref, name, hdferr, size)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id
+    TYPE(hdset_reg_ref_t_f), INTENT(IN), TARGET :: ref
+    INTEGER(SIZE_T), OPTIONAL, INTENT(OUT) :: size
+    CHARACTER(LEN=*), INTENT(INOUT) :: name
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTEGER(SIZE_T) :: size_default
+    INTEGER(SIZE_T) :: name_len
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(ref)
+
+    name_len=LEN(name)
+
+    hdferr = h5rget_name_ptr_c(loc_id, 1, f_ptr, name, name_len, size_default)
+
+    IF(PRESENT(size)) size = size_default
+
+  END SUBROUTINE h5rget_name_region_f
+
+  !****s* H5R (F03)/h5rget_name_ptr_f
+  !
+  ! NAME
+  !  h5rget_name_ptr_f
+  !
+  ! PURPOSE
+  !  Retrieves a name of a referenced object.
+  !
+  ! Inputs:
+  !  loc_id   - Identifier for the file containing the reference or for any object in that file.
+  !  ref_type - Type of reference.
+  !  ref      - An object or dataset region reference.
+  !
+  ! Outputs:
+  !  name     - A name associated with the referenced object or dataset ptr.
+  !  hdferr   - Returns 0 if successful and -1 if fails.
+  !
+  ! Optional parameters:
+  !   size    - The size of the name buffer, returning 0 (zero) if no name is associated
+  !             with the identifier
+  !
+  ! AUTHOR
+  !  M. Scot Breitenfeld
+  !  March 28, 2008
+  !
+  ! Signature:
+  SUBROUTINE h5rget_name_ptr_f(loc_id, ref_type, ref, name, hdferr, size)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id
+    INTEGER, INTENT(IN) :: ref_type
+    TYPE(C_PTR), INTENT(IN) :: ref
+    CHARACTER(LEN=*), INTENT(INOUT) :: name
+    INTEGER, INTENT(OUT) :: hdferr
+    INTEGER(SIZE_T), OPTIONAL, INTENT(OUT) :: size
+!*****
+    INTEGER(SIZE_T) :: size_default
+    INTEGER(SIZE_T) :: name_len
+
+    name_len=LEN(name)
+
+    hdferr = h5rget_name_ptr_c(loc_id, ref_type, ref, name, name_len, size_default)
+
+    IF(PRESENT(size)) size = size_default
+
+  END SUBROUTINE h5rget_name_ptr_f
+
+  !****s* H5R (F03)/h5rget_obj_type_f
+  !
+  ! NAME
+  !  h5rget_obj_type_f
+  !
+  ! PURPOSE
+  !  Retrieves the type of object that an object reference points to.
+  !
+  ! Inputs:
+  !  loc_id   - Identifier for the dataset containing the reference or
+  !             for the group that dataset is in.
+  !  ref_type - Type of reference to query.
+  !  ref      - Reference to query.
+  !
+  ! Outputs:
+  !  obj_type - Type of referenced object. 
+  !               H5G_UNKNOWN_F
+  !               H5G_GROUP_F
+  !               H5G_DATASET_F
+  !               H5G_TYPE_F
+  !              
+  !  hdferr   - Returns 0 if successful and -1 if fails.
+  !
+  ! AUTHOR
+  !  M. Scot Breitenfeld
+  !  Decemeber 17, 2008
+  !
+  ! Signature:
+  SUBROUTINE h5rget_obj_type_f(loc_id, ref_type, ref, obj_type, hdferr)
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id
+    INTEGER, INTENT(IN) :: ref_type
+    TYPE(C_PTR), INTENT(IN) :: ref
+    INTEGER, INTENT(OUT) :: obj_type
+    INTEGER, INTENT(OUT) :: hdferr
+    !*****
+
+    INTERFACE
+       INTEGER FUNCTION h5rget_obj_type_c(loc_id, ref_type, ref, obj_type) &
+            BIND(C, NAME='h5rget_obj_type_c')
+         IMPORT :: C_PTR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         INTEGER, INTENT(IN) :: ref_type
+         TYPE(C_PTR), VALUE :: ref
+         INTEGER :: obj_type
+       END FUNCTION h5rget_obj_type_c
+    END INTERFACE
+
+    hdferr = h5rget_obj_type_c(loc_id, ref_type, ref, obj_type)
+
+  END SUBROUTINE h5rget_obj_type_f
+
+END MODULE H5R
diff --git a/fortran/src/H5Rff.f90 b/fortran/src/H5Rff.f90
deleted file mode 100644
index 77a1ff8..0000000
--- a/fortran/src/H5Rff.f90
+++ /dev/null
@@ -1,128 +0,0 @@
-!****h* ROBODoc/H5R
-!
-! NAME
-!  MODULE H5R
-!
-! FILE
-!  fortran/src/H5Rff.f90
-!
-! PURPOSE
-!  This file contains Fortran interfaces for H5R functions. It includes
-!  all the functions that are independent on whether the Fortran 2003 functions
-!  are enabled or disabled.
-!
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5R function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5R
-  USE H5GLOBAL
-
-  ! If you change the value of these parameters, do not forget to change corresponding
-  ! values in the H5f90.h file.
-  !        INTEGER, PARAMETER :: REF_OBJ_BUF_LEN = 2
-  !        INTEGER, PARAMETER :: REF_REG_BUF_LEN = 3
-  !
-  !        TYPE hobj_ref_t_f
-  !             INTEGER ref(REF_OBJ_BUF_LEN)
-  !        END TYPE
-  !
-  !        TYPE hdset_reg_ref_t_f
-  !             INTEGER ref(REF_REG_BUF_LEN)
-  !        END TYPE
-  !
-
-  INTERFACE h5rget_object_type_f
-
-     MODULE PROCEDURE h5rget_object_type_obj_f
-
-  END INTERFACE
-
-CONTAINS
-
-!****s* H5R/h5rget_object_type_obj_f
-!
-! NAME
-!  h5rget_object_type_obj_f
-!
-! PURPOSE
-!  Retrieves the type of object that an object reference points to.
-!
-! INPUTS
-!  dset_id 	 - identifier of the dataset containing
-!                  reference to the objects
-!  ref 	         - reference to open
-! OUTPUTS
-!  obj_type 	 - object_type, possible values:
-!                    H5G_UNKNOWN_F
-!                    H5G_GROUP_F 
-!                    H5G_DATASET_F
-!                    H5G_TYPE_F
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! NOTES
-!  This is a module procedure for the h5rget_object_type_f
-!  subroutine.
-! SOURCE
-  SUBROUTINE h5rget_object_type_obj_f(dset_id, ref, obj_type, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
-    TYPE(hobj_ref_t_f), INTENT(IN) :: ref   ! Object reference
-    INTEGER, INTENT(OUT) :: obj_type     ! Object type
-                                         !  H5G_UNKNOWN_F
-                                         !  H5G_GROUP_F
-                                         !  H5G_DATASET_F
-                                         !  H5G_TYPE_F
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code
-!*****
-    INTEGER(HADDR_T) :: ref_f          ! Local buffer to pass reference
-
-    INTERFACE
-       INTEGER FUNCTION h5rget_object_type_obj_c(dset_id, ref_f, obj_type)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5RGET_OBJECT_TYPE_OBJ_C':: h5rget_object_type_obj_c
-         !DEC$ENDIF
-         !              INTEGER, PARAMETER :: REF_OBJ_BUF_LEN = 2
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HADDR_T) :: ref_f
-         INTEGER, INTENT(OUT) :: obj_type
-       END FUNCTION h5rget_object_type_obj_c
-    END INTERFACE
-
-    ref_f = ref%ref
-    hdferr = h5rget_object_type_obj_c(dset_id, ref_f, obj_type )
-
-  END SUBROUTINE h5rget_object_type_obj_f
-
-END MODULE H5R
diff --git a/fortran/src/H5Rff_F03.f90 b/fortran/src/H5Rff_F03.f90
deleted file mode 100644
index 8f40607..0000000
--- a/fortran/src/H5Rff_F03.f90
+++ /dev/null
@@ -1,719 +0,0 @@
-!****h* ROBODoc/H5R (F03)
-!
-! NAME
-!  MODULE H5R_PROVISIONAL
-!
-! FILE
-!  fortran/src/H5Rff_F03.f90
-!
-! PURPOSE
-!  This file contains Fortran 90 and Fortran 2003 interfaces for H5R functions.
-!  It contains the same functions as H5Rff_DEPRECIATE.f90 but includes the
-!  Fortran 2003 functions and the interface listings. This file will be compiled
-!  instead of H5Rff_DEPRECIATE.f90 if Fortran 2003 functions are enabled.
-!
-! COPYRIGHT
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!  Copyright by The HDF Group.                                                 *
-!  Copyright by the Board of Trustees of the University of Illinois.           *
-!  All rights reserved.                                                        *
-!                                                                              *
-!  This file is part of HDF5.  The full HDF5 copyright notice, including       *
-!  terms governing use, modification, and redistribution, is contained in      *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root     *
-!  of the source code distribution tree; Copyright.html can be found at the    *
-!  root level of an installed copy of the electronic HDF5 document set and     *
-!  is linked from the top-level documents page.  It can also be found at       *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have            *
-!  access to either file, you may request a copy from help at hdfgroup.org.       *
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5R function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-MODULE H5R_PROVISIONAL
-  USE H5GLOBAL
-  USE, INTRINSIC :: ISO_C_BINDING
-
-  ! If you change the value of these parameters, do not forget to change corresponding
-  ! values in the H5f90.h file.
-  !        INTEGER, PARAMETER :: REF_OBJ_BUF_LEN = 2
-  !        INTEGER, PARAMETER :: REF_REG_BUF_LEN = 3
-  !
-  !        TYPE hobj_ref_t_f
-  !             INTEGER ref(REF_OBJ_BUF_LEN)
-  !        END TYPE
-  !
-  !        TYPE hdset_reg_ref_t_f
-  !             INTEGER ref(REF_REG_BUF_LEN)
-  !        END TYPE
-  !
-
-  TYPE :: hdset_reg_ref_t_f03 
-     INTEGER(C_SIGNED_CHAR), DIMENSION(1:H5R_DSET_REG_REF_BUF_SIZE_F) :: ref
-  END TYPE hdset_reg_ref_t_f03
-
-  INTERFACE h5rget_region_f
-
-     MODULE PROCEDURE h5rget_region_region_f ! obsolete
-     MODULE PROCEDURE h5rget_region_ptr_f  ! F2003
-
-  END INTERFACE
-
-
-  INTERFACE h5rcreate_f
-
-     MODULE PROCEDURE h5rcreate_object_f ! obsolete
-     MODULE PROCEDURE h5rcreate_region_f ! obsolete
-     MODULE PROCEDURE h5rcreate_ptr_f  ! F2003
-
-  END INTERFACE
-
-  INTERFACE h5rdereference_f
-
-     MODULE PROCEDURE h5rdereference_object_f ! obsolete
-     MODULE PROCEDURE h5rdereference_region_f ! obsolete
-     MODULE PROCEDURE h5rdereference_ptr_f ! F2003
-
-  END INTERFACE
-
-  INTERFACE h5rget_name_f
-
-     MODULE PROCEDURE h5rget_name_object_f ! obsolete
-     MODULE PROCEDURE h5rget_name_region_f ! obsolete
-     MODULE PROCEDURE h5rget_name_ptr_f ! F2003
-
-  END INTERFACE
-
-  INTERFACE
-     INTEGER FUNCTION h5rget_name_ptr_c(loc_id, ref_type, ref, name, name_len, size_default) &
-          BIND(C, NAME='h5rget_name_ptr_c')
-       USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_char, c_ptr
-       USE H5GLOBAL
-       INTEGER(HID_T), INTENT(IN) :: loc_id
-       INTEGER, INTENT(IN) :: ref_type
-       TYPE(C_PTR), INTENT(IN), VALUE :: ref
-       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
-       INTEGER(SIZE_T) :: name_len
-       INTEGER(SIZE_T) :: size_default
-     END FUNCTION h5rget_name_ptr_c
-  END INTERFACE
-
-  INTERFACE
-     INTEGER FUNCTION h5rdereference_ptr_c(obj_id, ref_type, ref, ref_obj_id) &
-          BIND(C, NAME='h5rdereference_ptr_c')
-       USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
-       USE H5GLOBAL
-       INTEGER(HID_T), INTENT(IN) :: obj_id
-       INTEGER, INTENT(IN) :: ref_type
-       TYPE(C_PTR), INTENT(IN), VALUE :: ref
-       INTEGER(HID_T), INTENT(OUT) :: ref_obj_id
-     END FUNCTION h5rdereference_ptr_c
-  END INTERFACE
-
-  INTERFACE
-     INTEGER FUNCTION h5rcreate_ptr_c(ref, loc_id, name, namelen, ref_type, space_id) &
-          BIND(C, NAME='h5rcreate_ptr_c')
-       USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_char, c_ptr
-       USE H5GLOBAL
-       TYPE(C_PTR), VALUE :: ref
-       INTEGER(HID_T), INTENT(IN) :: loc_id
-       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
-       INTEGER :: namelen
-       INTEGER, INTENT(IN) :: ref_type
-       INTEGER(HID_T), INTENT(IN) :: space_id
-     END FUNCTION h5rcreate_ptr_c
-  END INTERFACE
-
-  INTERFACE
-     INTEGER FUNCTION h5rget_region_ptr_c(dset_id, ref, space_id) &
-          BIND(C, NAME='h5rget_region_ptr_c')
-       USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
-       USE H5GLOBAL
-       INTEGER(HID_T), INTENT(IN) :: dset_id
-       TYPE(C_PTR), VALUE :: ref
-       INTEGER(HID_T), INTENT(OUT) :: space_id
-     END FUNCTION h5rget_region_ptr_c
-  END INTERFACE
-
-CONTAINS
-
-!****s* H5R/h5rget_region_region_f
-!
-! NAME
-!  h5rget_region_region_f
-!
-! PURPOSE
-!  Retrieves a dataspace with the specified region selected
-!
-! INPUTS
-!  dset_id 	 - identifier of the dataset containing
-!                  reference to the regions
-!  ref 	         - reference to open
-! OUTPUTS
-!  space_id 	 - dataspace identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY 	
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! NOTES
-!  This is a module procedure for the h5rget_region_f subroutine.
-!
-! SOURCE
-  SUBROUTINE h5rget_region_region_f(dset_id, ref, space_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id      ! Dataset identifier
-    TYPE(hdset_reg_ref_t_f), INTENT(IN) :: ref ! Dataset region reference
-    INTEGER(HID_T), INTENT(OUT) :: space_id    ! Space identifier
-    INTEGER, INTENT(OUT) :: hdferr             ! Error code
-!*****
-    INTEGER :: ref_f(REF_REG_BUF_LEN)          ! Local buffer to pass reference
-
-    INTERFACE
-       INTEGER FUNCTION h5rget_region_region_c(dset_id, ref_f, space_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5RGET_REGION_REGION_C':: h5rget_region_region_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         !              INTEGER, PARAMETER :: REF_REG_BUF_LEN = 3
-         INTEGER :: ref_f(REF_REG_BUF_LEN)
-         INTEGER(HID_T), INTENT(OUT) :: space_id
-       END FUNCTION h5rget_region_region_c
-    END INTERFACE
-
-    ref_f = ref%ref
-    hdferr = h5rget_region_region_c(dset_id, ref_f, space_id )
-
-  END SUBROUTINE h5rget_region_region_f
-
-!****s* H5R/h5rget_region_ptr_f
-!
-! NAME
-!  h5rget_region_ptr_f
-!
-! PURPOSE
-!  Retrieves a dataspace with the specified region 
-!  selected using pointer
-!
-! INPUTS
-!  dset_id 	 - identifier of the dataset containing
-!                  reference to the regions
-!  ref 	         - reference to open
-! OUTPUTS
-!  space_id 	 - dataspace identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  M. Scot Breitenfeld
-!  August 4, 2012
-!
-! NOTES
-!  This is a module procedure for the h5rget_region_f subroutine.
-!
-! SOURCE
-  SUBROUTINE h5rget_region_ptr_f(dset_id, ref, space_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id      ! Dataset identifier
-    TYPE(C_PTR), INTENT(IN) :: ref ! Dataset region reference
-    INTEGER(HID_T), INTENT(OUT) :: space_id    ! Space identifier
-    INTEGER, INTENT(OUT) :: hdferr             ! Error code
-!*****
-
-    hdferr = h5rget_region_ptr_c(dset_id, ref, space_id )
-
-  END SUBROUTINE h5rget_region_ptr_f
-
-
-!****s* H5R (F03)/h5rcreate_object_f
-!
-! NAME
-!  h5rcreate_object_f
-!
-! PURPOSE
-!  Creates reference to the object
-!
-! Inputs:
-!  loc_id    - location identifier
-!  name      - name of the object at the specified location
-! Outputs:
-!  ref 	     - reference to the specified object
-!  hdferr    - returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! NOTES
-!  This is a module procedure for the h5rcreate_f subroutine.
-!
-! Signature:
-  SUBROUTINE h5rcreate_object_f(loc_id, name, ref, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! Location identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the object at location specified
-                                           ! by loc_id identifier
-    TYPE(hobj_ref_t_f), INTENT(INOUT), TARGET :: ref   ! Object reference
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-    INTEGER :: namelen                     ! Name length
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(ref)
-
-    namelen = LEN(name)
-
-    hdferr = h5rcreate_ptr_c(f_ptr, loc_id, name, namelen, INT(0), INT(-1,HID_T))
-
-  END SUBROUTINE h5rcreate_object_f
-
-!****s* H5R (F90)/h5rcreate_region_f
-!
-! NAME
-!  h5rcreate_region_f
-!
-! PURPOSE
-!  Creates reference to the dataset region
-!
-! INPUTS
-!  loc_id 	 - location identifier
-!  name 	 - name of the dataset at the specified location
-!  space_id 	 - dataspace identifier that describes selected region
-! OUTPUTS
-!  ref 	         - reference to the dataset region
-!  hdferr        - returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! NOTES
-!  This is a module procedure for the h5rcreate_f subroutine.
-!
-! SOURCE
-  SUBROUTINE h5rcreate_region_f(loc_id, name, space_id, ref, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! Location identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the dataset at location specified
-                                           ! by loc_id identifier
-    INTEGER(HID_T), INTENT(IN) :: space_id ! Dataset's dataspace identifier
-    TYPE(hdset_reg_ref_t_f), INTENT(OUT) :: ref ! Dataset region reference
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-    INTEGER :: namelen                     ! Name length
-    INTEGER :: ref_f(REF_REG_BUF_LEN)      ! Local buffer to pass reference
-
-    INTERFACE
-       INTEGER FUNCTION h5rcreate_region_c(ref_f, loc_id, name, namelen, space_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5RCREATE_REGION_C':: h5rcreate_region_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         !              INTEGER, PARAMETER :: REF_REG_BUF_LEN = 3
-         INTEGER :: ref_f(REF_REG_BUF_LEN)
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER :: namelen
-         INTEGER(HID_T), INTENT(IN) :: space_id
-       END FUNCTION h5rcreate_region_c
-    END INTERFACE
-
-    namelen = LEN(name)
-    ref_f = 0
-    hdferr = h5rcreate_region_c(ref_f, loc_id, name, namelen, space_id )
-    ref%ref = ref_f
-
-  END SUBROUTINE h5rcreate_region_f
-
-!****s* H5R (F03)/h5rcreate_ptr_f
-!
-! NAME
-!  h5rcreate_ptr_f
-!
-! PURPOSE
-!  Creates a reference.
-!
-! Inputs:
-!  loc_id     - location identifier
-!  name	      - name of the dataset at the specified location
-!  ref_type   - type of reference:
-!                H5R_OBJECT
-!                H5T_STD_REF_DSETREG
-! Outputs:
-!  ref	      - reference created by the function call.
-!  hdferr     - returns 0 if successful and -1 if fails.
-! OPTIONAL
-!  space_id   - dataspace identifier that describes selected region
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  June 20, 2008
-!
-! NOTES
-!  This is a module procedure for the h5rcreate_f
-!  subroutine where the output is a pointer.
-!
-! Signature:
-  SUBROUTINE h5rcreate_ptr_f(loc_id, name, ref_type, ref, hdferr, space_id)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id     ! Location identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name     ! Name of the dataset at location specified
-                                             ! by loc_id identifier
-    INTEGER, INTENT(IN) :: ref_type          ! type of reference
-    TYPE(C_PTR), INTENT(INOUT) :: ref        ! Reference created by the function call
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-    INTEGER(HID_T), INTENT(IN), OPTIONAL :: space_id ! Dataset's dataspace identifier
-!*****
-    INTEGER :: namelen                       ! Name length
-    INTEGER(HID_T) :: space_id_c
-
-    namelen = LEN(name)
-    space_id_c = -1
-    IF(PRESENT(space_id)) space_id_c =  space_id
-    hdferr = h5rcreate_ptr_c(ref, loc_id, name, namelen, ref_type, space_id_c)
-
-  END SUBROUTINE h5rcreate_ptr_f
-!****s* H5R (F03)/h5rdereference_object_f
-!
-! NAME
-!  h5rdereference_object_f
-!
-! PURPOSE
-!  Opens the HDF5 object referenced
-!
-! Inputs:
-!  dset_id  - identifier of the dataset containing
-!             reference
-!  ref 	    - reference to open
-! Outputs:
-!  obj_id   - object_identifier
-!  hdferr   - returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! NOTES
-!  This is a module procedure for the h5rdereference_f subroutine.
-!
-! Signature:
-  SUBROUTINE h5rdereference_object_f(obj_id, ref, ref_obj_id, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: obj_id          ! Dataset identifier
-    TYPE(hobj_ref_t_f), INTENT(IN), TARGET :: ref ! Object reference
-    INTEGER(HID_T), INTENT(OUT) :: ref_obj_id     ! Object identifier
-    INTEGER, INTENT(OUT) :: hdferr                ! Error code
-!*****
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(ref)
-    hdferr = h5rdereference_ptr_c(obj_id, 0, f_ptr, ref_obj_id)
-
-  END SUBROUTINE h5rdereference_object_f
-!****s* H5R (F03)/h5rdereference_region_f
-!
-! NAME
-!  h5rdereference_region_f
-!
-! PURPOSE
-!  Opens the dataset region
-!
-! Inputs:
-!  dset_id  - identifier of the dataset containing
-!             reference to teh regions
-!  ref 	    - reference to open
-! Outputs:
-!  obj_id   - dataspace identifier
-!  hdferr   - returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! NOTES
-!  This is a module procedure for the h5rdereference_f subroutine.
-!
-! Signature:
-  SUBROUTINE h5rdereference_region_f(obj_id, ref, ref_obj_id, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: obj_id   ! Dataset identifier
-    TYPE(hdset_reg_ref_t_f), INTENT(IN), TARGET :: ref   ! Object reference
-    INTEGER(HID_T), INTENT(OUT) :: ref_obj_id  ! Dataspace identifier
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-!*****
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(ref)
-    hdferr = h5rdereference_ptr_c(obj_id, 1, f_ptr, ref_obj_id)
-
-  END SUBROUTINE h5rdereference_region_f
-
-!****s* H5R (F03)/h5rdereference_ptr_f
-!
-! NAME
-!  h5rdereference_ptr_f
-!
-! PURPOSE
-!  Opens the HDF5 object referenced.
-!
-! Inputs:
-!  obj_id     - valid identifier for the file containing the
-!               referenced object or any object in that file.
-!  ref_type   - the reference type of ref.
-!  ref        - Reference to open.
-! Outputs:
-!  ref_obj_id - identifier of referenced object
-!  hdferr     - returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  June 20, 2008
-!
-! NOTES
-!  This is a module procedure for the h5rdereference_f
-!  subroutine using pointers.
-!
-! Signature:
-  SUBROUTINE h5rdereference_ptr_f(obj_id, ref_type, ref, ref_obj_id, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: obj_id  ! Valid identifier for the file containing the
-                                          !  referenced object or any object in that file.
-    INTEGER, INTENT(IN) :: ref_type       ! The reference type of ref.
-    TYPE(C_PTR), INTENT(IN) :: ref        ! Object reference
-    INTEGER(HID_T), INTENT(OUT) :: ref_obj_id
-                                          ! Identifier of referenced object
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!***** 
-    hdferr = h5rdereference_ptr_c(obj_id, ref_type, ref, ref_obj_id)
-
-  END SUBROUTINE h5rdereference_ptr_f
-!
-!****s* H5R (F03)/h5rget_name_object_f
-!
-! NAME
-!  h5rget_name_object_f
-!
-! PURPOSE
-!  Retrieves a name of a referenced object.
-!
-! Inputs:
-!  loc_id    - Identifier for the file containing the reference or for any object in that file.
-!  ref 	     - An object or dataset region reference.
-!
-! Outputs:
-!  name      - A name associated with the referenced object or dataset region.
-!  hdferr    - Returns 0 if successful and -1 if fails.
-!
-! Optional parameters:
-!  size     - The size of the name buffer, returning 0 (zero) if no name is associated 
-!             with the identifier.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 28, 2008
-!
-! Signature:
-  SUBROUTINE h5rget_name_object_f(loc_id,  ref, name, hdferr, size)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id
-    TYPE(hobj_ref_t_f), INTENT(IN), TARGET :: ref
-    INTEGER(SIZE_T), OPTIONAL, INTENT(OUT) :: size
-    CHARACTER(LEN=*), INTENT(INOUT) :: name
-    INTEGER, INTENT(OUT) :: hdferr
-!*****
-
-    INTEGER(SIZE_T) :: size_default
-    INTEGER(SIZE_T) :: name_len
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(ref)
-
-    name_len=LEN(name)
-
-    hdferr = h5rget_name_ptr_c(loc_id, 0, f_ptr, name, name_len, size_default)
-
-    IF(PRESENT(size)) size = size_default
-
-  END SUBROUTINE h5rget_name_object_f
-!****s* H5R (F03)/h5rget_name_region_f
-!
-! NAME
-!  h5rget_name_region_f
-!
-! PURPOSE
-!  Retrieves a name of a dataset region.
-!
-! Inputs:
-!  loc_id  - Identifier for the file containing the reference or for any object in that file.
-!  ref 	   - An object or dataset region reference.
-!
-! Outputs:
-!  name    - A name associated with the referenced object or dataset region.
-!  hdferr  - Returns 0 if successful and -1 if fails.
-!
-! Optional parameters:
-!  size    - The size of the name buffer, returning 0 (zero) if no name is associated with the identifier
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 28, 2008
-!
-! Signature:
-  SUBROUTINE h5rget_name_region_f(loc_id, ref, name, hdferr, size)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id
-    TYPE(hdset_reg_ref_t_f), INTENT(IN), TARGET :: ref
-    INTEGER(SIZE_T), OPTIONAL, INTENT(OUT) :: size
-    CHARACTER(LEN=*), INTENT(INOUT) :: name
-    INTEGER, INTENT(OUT) :: hdferr
-!*****
-    INTEGER(SIZE_T) :: size_default
-    INTEGER(SIZE_T) :: name_len
-    TYPE(C_PTR) :: f_ptr
-
-    f_ptr = C_LOC(ref)
-
-    name_len=LEN(name)
-
-    hdferr = h5rget_name_ptr_c(loc_id, 1, f_ptr, name, name_len, size_default)
-
-    IF(PRESENT(size)) size = size_default
-
-  END SUBROUTINE h5rget_name_region_f
-
-  !****s* H5R (F03)/h5rget_name_ptr_f
-  !
-  ! NAME
-  !  h5rget_name_ptr_f
-  !
-  ! PURPOSE
-  !  Retrieves a name of a referenced object.
-  !
-  ! Inputs:
-  !  loc_id   - Identifier for the file containing the reference or for any object in that file.
-  !  ref_type - Type of reference.
-  !  ref      - An object or dataset region reference.
-  !
-  ! Outputs:
-  !  name     - A name associated with the referenced object or dataset ptr.
-  !  hdferr   - Returns 0 if successful and -1 if fails.
-  !
-  ! Optional parameters:
-  !   size    - The size of the name buffer, returning 0 (zero) if no name is associated
-  !             with the identifier
-  !
-  ! AUTHOR
-  !  M. Scot Breitenfeld
-  !  March 28, 2008
-  !
-  ! Signature:
-  SUBROUTINE h5rget_name_ptr_f(loc_id, ref_type, ref, name, hdferr, size)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id
-    INTEGER, INTENT(IN) :: ref_type
-    TYPE(C_PTR), INTENT(IN) :: ref
-    CHARACTER(LEN=*), INTENT(INOUT) :: name
-    INTEGER, INTENT(OUT) :: hdferr
-    INTEGER(SIZE_T), OPTIONAL, INTENT(OUT) :: size
-!*****
-    INTEGER(SIZE_T) :: size_default
-    INTEGER(SIZE_T) :: name_len
-
-    name_len=LEN(name)
-
-    hdferr = h5rget_name_ptr_c(loc_id, ref_type, ref, name, name_len, size_default)
-
-    IF(PRESENT(size)) size = size_default
-
-  END SUBROUTINE h5rget_name_ptr_f
-
-  !****s* H5R (F03)/h5rget_obj_type_f
-  !
-  ! NAME
-  !  h5rget_obj_type_f
-  !
-  ! PURPOSE
-  !  Retrieves the type of object that an object reference points to.
-  !
-  ! Inputs:
-  !  loc_id   - Identifier for the dataset containing the reference or
-  !             for the group that dataset is in.
-  !  ref_type - Type of reference to query.
-  !  ref      - Reference to query.
-  !
-  ! Outputs:
-  !  obj_type - Type of referenced object. 
-  !               H5G_UNKNOWN_F
-  !               H5G_GROUP_F
-  !               H5G_DATASET_F
-  !               H5G_TYPE_F
-  !              
-  !  hdferr   - Returns 0 if successful and -1 if fails.
-  !
-  ! AUTHOR
-  !  M. Scot Breitenfeld
-  !  Decemeber 17, 2008
-  !
-  ! Signature:
-  SUBROUTINE h5rget_obj_type_f(loc_id, ref_type, ref, obj_type, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id
-    INTEGER, INTENT(IN) :: ref_type
-    TYPE(C_PTR), INTENT(IN) :: ref
-    INTEGER, INTENT(OUT) :: obj_type
-    INTEGER, INTENT(OUT) :: hdferr
-    !*****
-
-    INTERFACE
-       INTEGER FUNCTION h5rget_obj_type_c(loc_id, ref_type, ref, obj_type) &
-            BIND(C, NAME='h5rget_obj_type_c')
-         USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
-         USE H5GLOBAL
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         INTEGER, INTENT(IN) :: ref_type
-         TYPE(C_PTR), VALUE :: ref
-         INTEGER :: obj_type
-       END FUNCTION h5rget_obj_type_c
-    END INTERFACE
-
-    hdferr = h5rget_obj_type_c(loc_id, ref_type, ref, obj_type)
-
-  END SUBROUTINE h5rget_obj_type_f
-
-END MODULE H5R_PROVISIONAL
diff --git a/fortran/src/H5Rff_F90.f90 b/fortran/src/H5Rff_F90.f90
deleted file mode 100644
index ac45857..0000000
--- a/fortran/src/H5Rff_F90.f90
+++ /dev/null
@@ -1,514 +0,0 @@
-!****h* ROBODoc/H5R (F90)
-!
-! NAME
-!  MODULE H5R_PROVISIONAL
-!
-! FILE
-!  fortran/src/H5Rff_F90.f90
-!
-! PURPOSE
-!  This file contains Fortran 90 interfaces for H5R functions. It contains
-!  the same functions as H5Rff_F03.f90 but excludes the Fortran 2003 functions
-!  and the interface listings. This file will be compiled instead of H5Rff_F03.f90
-!  if Fortran 2003 functions are not enabled.
-!
-! COPYRIGHT
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!  Copyright by The HDF Group.                                                 *
-!  Copyright by the Board of Trustees of the University of Illinois.           *
-!  All rights reserved.                                                        *
-!                                                                              *
-!  This file is part of HDF5.  The full HDF5 copyright notice, including       *
-!  terms governing use, modification, and redistribution, is contained in      *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root     *
-!  of the source code distribution tree; Copyright.html can be found at the    *
-!  root level of an installed copy of the electronic HDF5 document set and     *
-!  is linked from the top-level documents page.  It can also be found at       *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have            *
-!  access to either file, you may request a copy from help at hdfgroup.org.       *
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5R function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!*****
-
-MODULE H5R_PROVISIONAL
-  USE H5GLOBAL
-
-!  If you change the value of these parameters, do not forget to change corresponding
-!  values in the H5f90.h file.
-!  INTEGER, PARAMETER :: REF_OBJ_BUF_LEN = 2
-!  INTEGER, PARAMETER :: REF_REG_BUF_LEN = 3
-!
-!  TYPE hobj_ref_t_f
-!  INTEGER ref(REF_OBJ_BUF_LEN)
-!  END TYPE
-!
-!  TYPE hdset_reg_ref_t_f
-!  INTEGER ref(REF_REG_BUF_LEN)
-!  END TYPE
-!
-  INTERFACE h5rcreate_f
-
-     MODULE PROCEDURE h5rcreate_object_f
-     MODULE PROCEDURE h5rcreate_region_f
-
-  END INTERFACE
-
-  INTERFACE h5rdereference_f
-
-     MODULE PROCEDURE h5rdereference_object_f
-     MODULE PROCEDURE h5rdereference_region_f
-
-  END INTERFACE
-
-  INTERFACE h5rget_name_f
-
-     MODULE PROCEDURE h5rget_name_object_f
-     MODULE PROCEDURE h5rget_name_region_f
-
-  END INTERFACE
-
-  INTERFACE h5rget_region_f
-
-     MODULE PROCEDURE h5rget_region_region_f
-
-  END INTERFACE
-
-
-CONTAINS
-
-
-!****s* H5R/h5rget_region_region_f
-!
-! NAME
-!  h5rget_region_region_f
-!
-! PURPOSE
-!  Retrieves a dataspace with the specified region selected
-!
-! INPUTS
-!  dset_id 	 - identifier of the dataset containing
-!                  reference to the regions
-!  ref 	         - reference to open
-! OUTPUTS
-!  space_id 	 - dataspace identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY 	
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! NOTES
-!  This is a module procedure for the h5rget_region_f subroutine.
-!
-! SOURCE
-  SUBROUTINE h5rget_region_region_f(dset_id, ref, space_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id      ! Dataset identifier
-    TYPE(hdset_reg_ref_t_f), INTENT(IN) :: ref ! Dataset region reference
-    INTEGER(HID_T), INTENT(OUT) :: space_id    ! Space identifier
-    INTEGER, INTENT(OUT) :: hdferr             ! Error code
-!*****
-    INTEGER :: ref_f(REF_REG_BUF_LEN)          ! Local buffer to pass reference
-
-    INTERFACE
-       INTEGER FUNCTION h5rget_region_region_c(dset_id, ref_f, space_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5RGET_REGION_REGION_C':: h5rget_region_region_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         !              INTEGER, PARAMETER :: REF_REG_BUF_LEN = 3
-         INTEGER :: ref_f(REF_REG_BUF_LEN)
-         INTEGER(HID_T), INTENT(OUT) :: space_id
-       END FUNCTION h5rget_region_region_c
-    END INTERFACE
-
-    ref_f = ref%ref
-    hdferr = h5rget_region_region_c(dset_id, ref_f, space_id )
-
-  END SUBROUTINE h5rget_region_region_f
-
-
-
-!****s* H5R (F90)/h5rcreate_object_f
-!
-! NAME
-!  h5rcreate_object_f
-!
-! PURPOSE
-!  Creates reference to the object
-!
-! INPUTS
-!  loc_id 	 - location identifier
-!  name 	 - name of the object at the specified location
-! OUTPUTS
-!  ref 	         - reference to the specified object
-!  hdferr:	 - error code
-!                   Success:  0
-!                   Failure: -1
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! NOTES
-!  This is a module procedure for the h5rcreate_f subroutine.
-!
-! SOURCE
-  SUBROUTINE h5rcreate_object_f(loc_id, name, ref, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! Location identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the object at location specified
-                                           ! by loc_id identifier
-    TYPE(hobj_ref_t_f), INTENT(OUT) :: ref ! Object reference
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-    INTEGER :: namelen                     ! Name length
-    INTEGER(HADDR_T) :: ref_f              ! Local buffer to pass reference
-
-    INTERFACE
-       INTEGER FUNCTION h5rcreate_object_c(ref_f, loc_id, name, namelen)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5RCREATE_OBJECT_C':: h5rcreate_object_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HADDR_T) :: ref_f
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER :: namelen
-       END FUNCTION h5rcreate_object_c
-    END INTERFACE
-
-    namelen = LEN(name)
-    ref_f = 0
-    hdferr = h5rcreate_object_c(ref_f, loc_id, name, namelen )
-    ref%ref = ref_f
-
-  END SUBROUTINE h5rcreate_object_f
-
-!****s* H5R (F90)/h5rcreate_region_f
-!
-! NAME
-!  h5rcreate_region_f
-!
-! PURPOSE
-!  Creates reference to the dataset region
-!
-! INPUTS
-!  loc_id 	 - location identifier
-!  name 	 - name of the dataset at the specified location
-!  space_id 	 - dataspace identifier that describes selected region
-! OUTPUTS
-!  ref 	         - reference to the dataset region
-!  hdferr:	 - error code
-!                   Success:  0
-!                   Failure: -1
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! NOTES
-!  This is a module procedure for the h5rcreate_f subroutine.
-!
-! SOURCE
-  SUBROUTINE h5rcreate_region_f(loc_id, name, space_id, ref, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! Location identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name   ! Name of the dataset at location specified
-                                           ! by loc_id identifier
-    INTEGER(HID_T), INTENT(IN) :: space_id ! Dataset's dataspace identifier
-    TYPE(hdset_reg_ref_t_f), INTENT(OUT) :: ref ! Dataset region reference
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-    INTEGER :: namelen                     ! Name length
-    INTEGER :: ref_f(REF_REG_BUF_LEN)      ! Local buffer to pass reference
-
-    INTERFACE
-       INTEGER FUNCTION h5rcreate_region_c(ref_f, loc_id, name, namelen, space_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5RCREATE_REGION_C':: h5rcreate_region_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         !              INTEGER, PARAMETER :: REF_REG_BUF_LEN = 3
-         INTEGER :: ref_f(REF_REG_BUF_LEN)
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER :: namelen
-         INTEGER(HID_T), INTENT(IN) :: space_id
-       END FUNCTION h5rcreate_region_c
-    END INTERFACE
-
-    namelen = LEN(name)
-    ref_f = 0
-    hdferr = h5rcreate_region_c(ref_f, loc_id, name, namelen, space_id )
-    ref%ref = ref_f
-
-  END SUBROUTINE h5rcreate_region_f
-!****s* H5R (F90)/h5rdereference_object_f
-!
-! NAME
-!  h5rdereference_object_f
-!
-! PURPOSE
-!  Opens the HDF5 object referenced
-!
-! INPUTS
-!  dset_id  - identifier of the dataset containing reference
-!  ref 	    - reference to open
-! OUTPUTS
-!  obj_id   - object_identifier
-!  hdferr   - error code
-!              Success:  0
-!              Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! NOTES
-!  This is a module procedure for the h5rdereference_f subroutine.
-!
-! SOURCE
-  SUBROUTINE h5rdereference_object_f(dset_id, ref, obj_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
-    TYPE(hobj_ref_t_f), INTENT(IN) :: ref   ! Object reference
-    INTEGER(HID_T), INTENT(OUT) :: obj_id   ! Object identifier
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-!*****
-    INTEGER(HADDR_T) :: ref_f          ! Local buffer to pass reference
-
-    INTERFACE
-       INTEGER FUNCTION h5rdereference_object_c(dset_id, ref_f, obj_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5RDEREFERENCE_OBJECT_C':: h5rdereference_object_c
-         !DEC$ENDIF
-         !              INTEGER, PARAMETER :: REF_OBJ_BUF_LEN = 2
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HADDR_T) :: ref_f
-         INTEGER(HID_T), INTENT(OUT) :: obj_id
-       END FUNCTION h5rdereference_object_c
-    END INTERFACE
-
-    ref_f = ref%ref
-    hdferr = h5rdereference_object_c(dset_id, ref_f, obj_id )
-
-  END SUBROUTINE h5rdereference_object_f
-!****s* H5R (F90)/h5rdereference_region_f
-!
-! NAME
-!  h5rdereference_region_f
-!
-! PURPOSE
-!  Opens the dataset region
-!
-! INPUTS
-!  dset_id 	 - identifier of the dataset containing
-!                  reference to teh regions
-!  ref 	         - reference to open
-! OUTPUTS
-!  obj_id 	 - dataspace identifier
-!  hdferr 	 - error code
-!                   Success:  0
-!                   Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! NOTES
-!  This is a module procedure for the h5rdereference_f subroutine.
-!
-! SOURCE
-  SUBROUTINE h5rdereference_region_f(dset_id, ref, obj_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id      ! Dataset identifier
-    TYPE(hdset_reg_ref_t_f), INTENT(IN) :: ref ! Object reference
-    INTEGER(HID_T), INTENT(OUT) :: obj_id   ! Dataspace identifier
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-!*****
-    INTEGER :: ref_f(REF_REG_BUF_LEN)       ! Local buffer to pass reference
-
-    INTERFACE
-       INTEGER FUNCTION h5rdereference_region_c(dset_id, ref_f, obj_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5RDEREFERENCE_REGION_C':: h5rdereference_region_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-!  INTEGER, PARAMETER :: REF_REG_BUF_LEN = 3
-         INTEGER :: ref_f(REF_REG_BUF_LEN)
-         INTEGER(HID_T), INTENT(OUT) :: obj_id
-       END FUNCTION h5rdereference_region_c
-    END INTERFACE
-
-    ref_f = ref%ref
-    hdferr = h5rdereference_region_c(dset_id, ref_f, obj_id )
-
-  END SUBROUTINE h5rdereference_region_f
-!****s* H5R (F90)/h5rget_name_object_f
-!
-! NAME
-!  h5rget_name_object_f
-!
-! PURPOSE
-!  Retrieves a name of a referenced object.
-!
-! INPUTS
-!  loc_id  - Identifier for the file containing the reference or for any object in that file.
-!  ref 	   - An object or dataset region reference.
-!
-! OUTPUTS
-!  name    - A name associated with the referenced object or dataset region.
-!
-!  hdferr  - error code
-!             Success:  0
-!             Failure: -1
-!
-! OPTIONAL PARAMETERS
-!  size    - The size of the name buffer, returning 0 (zero) if 
-!            no name is associated with the identifier
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 28, 2008
-!
-! SOURCES
-  SUBROUTINE h5rget_name_object_f(loc_id,  ref, name, hdferr, size)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id   ! Identifier for the file containing the reference or 
-                                           ! for any object in that file.
-                                           ! or for the group that dataset is in.
-    TYPE(hobj_ref_t_f), INTENT(IN) :: ref  ! Object reference
-    INTEGER(SIZE_T), OPTIONAL, INTENT(OUT) :: size   ! The size of the name buffer,
-                                           ! returning 0 (zero) if no name is associated with the identifier
-    CHARACTER(LEN=*), INTENT(OUT) :: name  ! A name associated with the referenced object or dataset region.
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-    INTEGER(HADDR_T) :: ref_f              ! Local buffer to pass reference
-
-    INTEGER(SIZE_T) :: size_default
-    INTEGER(SIZE_T) :: name_len
-
-    INTERFACE
-       INTEGER FUNCTION h5rget_name_object_c(loc_id, ref_f, name, name_len, size_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5RGET_NAME_OBJECT_C':: h5rget_name_object_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         INTEGER(SIZE_T)  :: size_default
-         CHARACTER(LEN=*), INTENT(OUT) :: name
-         INTEGER(HADDR_T) :: ref_f
-
-         INTEGER(SIZE_T) :: name_len
-       END FUNCTION h5rget_name_object_c
-    END INTERFACE
-
-    name_len=LEN(name)
-
-    ref_f = ref%ref
-    hdferr = h5rget_name_object_c(loc_id, ref_f, name, name_len, size_default)
-
-    IF(PRESENT(size)) size = size_default
-
-  END SUBROUTINE h5rget_name_object_f
-
-!****s* H5R (F90)/h5rget_name_region_f
-!
-! NAME
-!  h5rget_name_region_f
-!
-! PURPOSE
-!  Retrieves a name of a dataset region.
-!
-! INPUTS
-!  loc_id 	 - Identifier for the file containing the reference or 
-!                  for any object in that file.
-!  ref 	         - An object or dataset region reference.
-!
-! OUTPUTS
-!  name 	 - A name associated with the referenced object or dataset region.
-!  hdferr 	 - error code
-!                   Success:  0
-!                   Failure: -1
-!
-! OPTIONAL PARAMETERS
-!  size 	 - The size of the name buffer,  returning 0 (zero) if no 
-!                  name is associated  with the identifier
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 28, 2008
-!
-! SOURCE
-  SUBROUTINE h5rget_name_region_f(loc_id, ref, name, hdferr, size)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id
-    TYPE(hdset_reg_ref_t_f), INTENT(IN) :: ref
-    INTEGER(SIZE_T), OPTIONAL, INTENT(OUT) :: size
-    CHARACTER(LEN=*), INTENT(OUT) :: name
-    INTEGER, INTENT(OUT) :: hdferr
-!*****
-    INTEGER :: ref_f(REF_REG_BUF_LEN)      ! Local buffer to pass reference
-    INTEGER(SIZE_T) :: size_default
-    INTEGER(SIZE_T) :: name_len
-
-    INTERFACE
-       INTEGER FUNCTION h5rget_name_region_c(loc_id, ref_f, name, name_len, size_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5RGET_NAME_REGION_C':: h5rget_name_region_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         INTEGER(SIZE_T)  :: size_default
-         CHARACTER(LEN=*), INTENT(OUT) :: name
-         INTEGER :: ref_f(REF_REG_BUF_LEN)
-
-         INTEGER(SIZE_T) :: name_len
-       END FUNCTION h5rget_name_region_c
-    END INTERFACE
-
-    name_len=LEN(name)
-
-    ref_f = ref%ref
-    hdferr = h5rget_name_region_c(loc_id, ref_f, name, name_len, size_default)
-
-    IF(PRESENT(size)) size = size_default
-
-  END SUBROUTINE h5rget_name_region_f
-
-END MODULE H5R_PROVISIONAL
diff --git a/fortran/src/H5Sf.c b/fortran/src/H5Sf.c
index 6947d64..67427a7 100644
--- a/fortran/src/H5Sf.c
+++ b/fortran/src/H5Sf.c
@@ -1,6 +1,6 @@
 /****h* H5Sf/H5Sf
  * PURPOSE
- *   This file contains C stubs for H5S Fortran APIs
+ *  This file contains C stubs for H5S Fortran APIs
  *
  * COPYRIGHT
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -26,27 +26,27 @@
 
 /****if* H5Sf/h5screate_simple_c
  * NAME
- *        h5screate_simple_c
+ *  h5screate_simple_c
  * PURPOSE
- *     Call H5Screate_simple to create a dataspace
+ *  Call H5Screate_simple to create a dataspace
  * INPUTS
- *      rank - number of dimensions of dataspace
- *              dims - array of the size of each dimension
+ *  rank - number of dimensions of dataspace
+ *  dims - array of the size of each dimension
                 maxdims - an array of the maximum size of each dimension
  * OUTPUTS
- *     space_id - identifier of the created dataspace
+ *  space_id - identifier of the created dataspace
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 4, 1999
+ *  Wednesday, August 4, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5screate_simple_c ( int_f *rank, hsize_t_f *dims, hsize_t_f *maxdims, hid_t_f *space_id )
+h5screate_simple_c ( int_f *rank, hsize_t_f *dims, hsize_t_f *maxdims, hid_t_f *space_id )
 /******/
 {
     hsize_t c_dims[H5S_MAX_RANK];
@@ -75,23 +75,23 @@ done:
 
 /****if* H5Sf/h5sclose_c
  * NAME
- *        h5sclose_c
+ *  h5sclose_c
  * PURPOSE
- *     Call H5Sclose to close the dataspace
+ *  Call H5Sclose to close the dataspace
  * INPUTS
- *      space_id - identifier of the dataspace to be closed
+ *  space_id - identifier of the dataspace to be closed
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 4, 1999
+ *  Wednesday, August 4, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sclose_c ( hid_t_f *space_id )
+h5sclose_c ( hid_t_f *space_id )
 /******/
 {
   int ret_value = 0;
@@ -104,25 +104,25 @@ nh5sclose_c ( hid_t_f *space_id )
 
 /****if* H5Sf/h5screate_c
  * NAME
- *        h5screate_c
+ *  h5screate_c
  * PURPOSE
- *     Call H5Screate to create a dataspace
+ *  Call H5Screate to create a dataspace
  * INPUTS
- *      classtype - type of the dataspace class
+ *  classtype - type of the dataspace class
  * OUTPUTS
- *     space_id - identifier of the created dataspace
+ *  space_id - identifier of the created dataspace
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Tuesday, August 10, 1999
+ *  Tuesday, August 10, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5screate_c ( int_f *classtype, hid_t_f *space_id )
+h5screate_c ( int_f *classtype, hid_t_f *space_id )
 /******/
 {
   H5S_class_t c_classtype;
@@ -138,25 +138,25 @@ nh5screate_c ( int_f *classtype, hid_t_f *space_id )
 
 /****if* H5Sf/h5scopy_c
  * NAME
- *        h5scopy_c
+ *  h5scopy_c
  * PURPOSE
- *     Call H5Scopy to copy dataspace
+ *  Call H5Scopy to copy dataspace
  * INPUTS
- *      space_id - identifier of the dataspace to be copied
+ *  space_id - identifier of the dataspace to be copied
  * OUTPUTS
- *     new_space_id - identifier of the new datspace
+ *  new_space_id - identifier of the new datspace
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Tuesday, August 10, 1999
+ *  Tuesday, August 10, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5scopy_c( hid_t_f *space_id , hid_t_f *new_space_id)
+h5scopy_c( hid_t_f *space_id , hid_t_f *new_space_id)
 /******/
 {
   int ret_value = 0;
@@ -173,28 +173,28 @@ nh5scopy_c( hid_t_f *space_id , hid_t_f *new_space_id)
 
 /****if* H5Sf/h5sget_select_hyper_nblocks_c
  * NAME
- *        h5sget_select_hyper_nblocks_c
+ *  h5sget_select_hyper_nblocks_c
  * PURPOSE
- *     Call H5SH5Sget_select_hyper_nblocks to
- *              get the the number of hyperslab blocks in
- *              the current dataspace selection if successful
+ *  Call H5SH5Sget_select_hyper_nblocks to
+ *  get the the number of hyperslab blocks in
+ *  the current dataspace selection if successful
  * INPUTS
- *      space_id - identifier of the dataspace
+ *  space_id - identifier of the dataspace
  * OUTPUTS
- *     num_blocks -  number of hyperslab blocks in
- *              the current dataspace selection
+ *  num_blocks -  number of hyperslab blocks in
+ *  the current dataspace selection
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, November 12, 1999
+ *  Friday, November 12, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sget_select_hyper_nblocks_c( hid_t_f *space_id , hssize_t_f * num_blocks)
+h5sget_select_hyper_nblocks_c( hid_t_f *space_id , hssize_t_f * num_blocks)
 /******/
 {
   int ret_value = 0;
@@ -211,28 +211,28 @@ nh5sget_select_hyper_nblocks_c( hid_t_f *space_id , hssize_t_f * num_blocks)
 
 /****if* H5Sf/h5sget_select_elem_npoints_c
  * NAME
- *        h5sget_select_elem_npoints_c
+ *  h5sget_select_elem_npoints_c
  * PURPOSE
- *     Call H5Sget_select_elem_npoints to
- *              get the the number of element points in
- *              the current dataspace selection if successful
+ *  Call H5Sget_select_elem_npoints to
+ *  get the the number of element points in
+ *  the current dataspace selection if successful
  * INPUTS
- *      space_id - identifier of the dataspace
+ *  space_id - identifier of the dataspace
  * OUTPUTS
- *     num_points -  number of element points in
- *              the current dataspace selection
+ *  num_points -  number of element points in
+ *  the current dataspace selection
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Monday, November 15, 1999
+ *  Monday, November 15, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sget_select_elem_npoints_c( hid_t_f *space_id , hssize_t_f * num_points)
+h5sget_select_elem_npoints_c( hid_t_f *space_id , hssize_t_f * num_points)
 /******/
 {
   int ret_value = 0;
@@ -249,36 +249,36 @@ nh5sget_select_elem_npoints_c( hid_t_f *space_id , hssize_t_f * num_points)
 
 /****if* H5Sf/h5sget_select_hyper_blocklist_c
  * NAME
- *        h5sget_select_hyper_blocklist_c
+ *  h5sget_select_hyper_blocklist_c
  * PURPOSE
- *     Call H5Sget_select_hyper_blocklist to
- *              get a list of the hyperslab blocks currently selected
- *              Starting with the startblock-th block in the
- *              list of blocks, num_blocks blocks are put into the user's
- *              buffer. If the user's buffer fills up before numblocks
- *              blocks are inserted, the buffer
- *              will contain only as many blocks as fit.
+ *  Call H5Sget_select_hyper_blocklist to
+ *  get a list of the hyperslab blocks currently selected
+ *  Starting with the startblock-th block in the
+ *  list of blocks, num_blocks blocks are put into the user's
+ *  buffer. If the user's buffer fills up before numblocks
+ *  blocks are inserted, the buffer
+ *  will contain only as many blocks as fit.
  * INPUTS
- *      space_id - identifier of the dataspace
- *              startblock - Hyperslab block to start with
- *              num_blocks -  number of hyperslab blocks in
- *                            the current dataspace selection
+ *  space_id - identifier of the dataspace
+ *  startblock - Hyperslab block to start with
+ *  num_blocks -  number of hyperslab blocks in
+ *  the current dataspace selection
  * OUTPUTS
- *     buf - List of hyperslab blocks selected
+ *  buf - List of hyperslab blocks selected
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Monday, November 15, 1999
+ *  Monday, November 15, 1999
  * HISTORY
  *
- *              Transpose dimension arrays because of C-FORTRAN storage order
- *              M. Scot Breitenfeld
+ *  Transpose dimension arrays because of C-FORTRAN storage order
+ *  M. Scot Breitenfeld
  * SOURCE
 */
 
 int_f
-nh5sget_select_hyper_blocklist_c( hid_t_f *space_id ,hsize_t_f *startblock,
+h5sget_select_hyper_blocklist_c( hid_t_f *space_id ,hsize_t_f *startblock,
                                   hsize_t_f *num_blocks, hsize_t_f *buf)
 /******/
 {
@@ -327,31 +327,31 @@ nh5sget_select_hyper_blocklist_c( hid_t_f *space_id ,hsize_t_f *startblock,
 
 /****if* H5Sf/h5sget_select_bounds_c
  * NAME
- *        h5sget_select_bounds_c
+ *  h5sget_select_bounds_c
  * PURPOSE
- *     Call H5Sget_select_bounds to retrieve the coordinates
- *              of the bounding box containing the current selection
- *              and places them into user-supplied buffers
+ *  Call H5Sget_select_bounds to retrieve the coordinates
+ *  of the bounding box containing the current selection
+ *  and places them into user-supplied buffers
  * INPUTS
- *      space_id - identifier of the dataspace
+ *  space_id - identifier of the dataspace
  * OUTPUTS
- *     start -  Starting coordinates of the bounding box
- *              end -  Ending coordinates of the bounding box,
- *                     i.e., the coordinates of the diagonally opposite corne
+ *  start -  Starting coordinates of the bounding box
+ *  end -  Ending coordinates of the bounding box,
+ *  i.e., the coordinates of the diagonally opposite corne
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Wednesday, November 17, 1999
+ *  Wednesday, November 17, 1999
  * HISTORY
- * swapped array bounds to account for C and Fortran reversed
- *                matrix notation.
- *                M. Scot Breitenfeld
+ *  swapped array bounds to account for C and Fortran reversed
+ *  matrix notation.
+ *  M. Scot Breitenfeld
  * SOURCE
 */
 
 int_f
-nh5sget_select_bounds_c( hid_t_f *space_id , hsize_t_f * start, hsize_t_f * end)
+h5sget_select_bounds_c( hid_t_f *space_id , hsize_t_f * start, hsize_t_f * end)
 /******/
 {
     hid_t c_space_id;
@@ -379,34 +379,34 @@ done:
 
 /****if* H5Sf/h5sget_select_elem_pointlist_c
  * NAME
- *        h5sget_select_elem_pointlist_c
+ *  h5sget_select_elem_pointlist_c
  * PURPOSE
- *     Call  H5Sget_select_elem_pointlist
- *              get a list of  element points in the
- *              current dataspace selectin.
- *              Starting with the startpoint-th point in the
- *              list of points, numpoints points are put into the user's
- *              buffer. If the user's buffer fills up before numpoints
- *              points are inserted, the buffer
- *              will contain only as many points as fit.
+ *  Call  H5Sget_select_elem_pointlist
+ *  get a list of  element points in the
+ *  current dataspace selectin.
+ *  Starting with the startpoint-th point in the
+ *  list of points, numpoints points are put into the user's
+ *  buffer. If the user's buffer fills up before numpoints
+ *  points are inserted, the buffer
+ *  will contain only as many points as fit.
  * INPUTS
- *      space_id - identifier of the dataspace
- *              startpoint - Element point to start with
- *              numpoints -  Number of element points to get
+ *  space_id - identifier of the dataspace
+ *  startpoint - Element point to start with
+ *  numpoints -  Number of element points to get
  * OUTPUTS
- *     buf - List of element points selected
+ *  buf - List of element points selected
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Wednesday, November 17, 1999
+ *  Wednesday, November 17, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sget_select_elem_pointlist_c( hid_t_f *space_id ,hsize_t_f * startpoint,
+h5sget_select_elem_pointlist_c( hid_t_f *space_id ,hsize_t_f * startpoint,
                                   hsize_t_f * numpoints, hsize_t_f * buf)
 /******/
 {
@@ -451,23 +451,23 @@ nh5sget_select_elem_pointlist_c( hid_t_f *space_id ,hsize_t_f * startpoint,
 
 /****if* H5Sf/h5sselect_all_c
  * NAME
- *        h5sselect_all_c
+ *  h5sselect_all_c
  * PURPOSE
- *     Call H5Sselect_all to select entire dataspace
+ *  Call H5Sselect_all to select entire dataspace
  * INPUTS
- *      space_id - identifier of the dataspace
+ *  space_id - identifier of the dataspace
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Tuesday, August 10, 1999
+ *  Tuesday, August 10, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sselect_all_c ( hid_t_f *space_id )
+h5sselect_all_c ( hid_t_f *space_id )
 /******/
 {
   int ret_value = 0;
@@ -480,23 +480,23 @@ nh5sselect_all_c ( hid_t_f *space_id )
 
 /****if* H5Sf/h5sselect_none_c
  * NAME
- *        h5sselect_none_c
+ *  h5sselect_none_c
  * PURPOSE
- *     Call H5Sselect_none to reset the selection region
+ *  Call H5Sselect_none to reset the selection region
  * INPUTS
- *      space_id - identifier of the dataspace
+ *  space_id - identifier of the dataspace
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Tuesday, August 10, 1999
+ *  Tuesday, August 10, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sselect_none_c ( hid_t_f *space_id )
+h5sselect_none_c ( hid_t_f *space_id )
 /******/
 {
   int ret_value = 0;
@@ -509,27 +509,27 @@ nh5sselect_none_c ( hid_t_f *space_id )
 
 /****if* H5Sf/h5sselect_valid_c
  * NAME
- *        h5sselect_valid_c
+ *  h5sselect_valid_c
  * PURPOSE
- *     Call H5Sselect_valid to verify that selection
- *              is within dataspace extent.
+ *  Call H5Sselect_valid to verify that selection
+ *  is within dataspace extent.
  * INPUTS
- *      space_id - identifier of the dataspace
+ *  space_id - identifier of the dataspace
  * OUTPUTS
- *     flag - 0 if not valid selection, 1 if is valid selection,
- *              and negative on failure.
+ *  flag - 0 if not valid selection, 1 if is valid selection,
+ *  and negative on failure.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Tuesday, August 10, 1999
+ *  Tuesday, August 10, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sselect_valid_c ( hid_t_f *space_id , int_f *flag )
+h5sselect_valid_c ( hid_t_f *space_id , int_f *flag )
 /******/
 {
   int ret_value = 0;
@@ -545,26 +545,26 @@ nh5sselect_valid_c ( hid_t_f *space_id , int_f *flag )
 
 /****if* H5Sf/h5sget_simple_extent_npoints_c
  * NAME
- *        h5sget_simple_extent_npoints_c
+ *  h5sget_simple_extent_npoints_c
  * PURPOSE
- *     Call H5Sget_simple_extent_npoints to determine the number
- *              of elements in a dataspace
+ *  Call H5Sget_simple_extent_npoints to determine the number
+ *  of elements in a dataspace
  * INPUTS
- *      space_id - identifier of the dataspace
+ *  space_id - identifier of the dataspace
  * OUTPUTS
- *     npoints - number of points in a dataspace
+ *  npoints - number of points in a dataspace
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 11, 1999
+ *  Wednesday, August 11, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sget_simple_extent_npoints_c ( hid_t_f *space_id , hsize_t_f *npoints )
+h5sget_simple_extent_npoints_c ( hid_t_f *space_id , hsize_t_f *npoints )
 /******/
 {
   int ret_value = 0;
@@ -580,26 +580,26 @@ nh5sget_simple_extent_npoints_c ( hid_t_f *space_id , hsize_t_f *npoints )
 
 /****if* H5Sf/h5sget_select_npoints_c
  * NAME
- *        h5sget_select_npoints_c
+ *  h5sget_select_npoints_c
  * PURPOSE
- *     Call H5Sget_select_npoints to determine the number
- *              of elements in a dataspace selection
+ *  Call H5Sget_select_npoints to determine the number
+ *  of elements in a dataspace selection
  * INPUTS
- *      space_id - identifier of the dataspace
+ *  space_id - identifier of the dataspace
  * OUTPUTS
- *     npoints - number of points in a dataspace selection
+ *  npoints - number of points in a dataspace selection
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 11, 1999
+ *  Wednesday, August 11, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sget_select_npoints_c ( hid_t_f *space_id , hssize_t_f *npoints )
+h5sget_select_npoints_c ( hid_t_f *space_id , hssize_t_f *npoints )
 /******/
 {
   int ret_value = 0;
@@ -615,26 +615,26 @@ nh5sget_select_npoints_c ( hid_t_f *space_id , hssize_t_f *npoints )
 
 /****if* H5Sf/h5sget_simple_extent_ndims_c
  * NAME
- *        h5sget_simple_extent_ndims_c
+ *  h5sget_simple_extent_ndims_c
  * PURPOSE
- *     Call H5Sget_simple_extent_ndims to determine the number
- *              dimensions
+ *  Call H5Sget_simple_extent_ndims to determine the number
+ *  dimensions
  * INPUTS
- *      space_id - identifier of the dataspace
+ *  space_id - identifier of the dataspace
  * OUTPUTS
- *     rank - number of dataspace dimensions
+ *  rank - number of dataspace dimensions
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 11, 1999
+ *  Wednesday, August 11, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sget_simple_extent_ndims_c ( hid_t_f *space_id , int_f *ndims )
+h5sget_simple_extent_ndims_c ( hid_t_f *space_id , int_f *ndims )
 /******/
 {
   int ret_value = 0;
@@ -650,27 +650,27 @@ nh5sget_simple_extent_ndims_c ( hid_t_f *space_id , int_f *ndims )
 
 /****if* H5Sf/h5sget_simple_extent_type_c
  * NAME
- *        h5sget_simple_extent_type_c
+ *  h5sget_simple_extent_type_c
  * PURPOSE
- *     Call H5Sget_simple_extent_type to determine the class type
- *              of a dataspace
+ *  Call H5Sget_simple_extent_type to determine the class type
+ *  of a dataspace
  * INPUTS
- *      space_id - identifier of the dataspace
+ *  space_id - identifier of the dataspace
  * OUTPUTS
- *     classtype - class type; possible values are:
+ *  classtype - class type; possible values are:
  *              H5S_SCALAR_F (0), H5S_SIMPLE_F (1), H5S_NULL_F (2)
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 11, 1999
+ *  Wednesday, August 11, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sget_simple_extent_type_c ( hid_t_f *space_id , int_f *classtype)
+h5sget_simple_extent_type_c ( hid_t_f *space_id , int_f *classtype)
 /******/
 {
   int ret_value = 0;
@@ -691,25 +691,25 @@ nh5sget_simple_extent_type_c ( hid_t_f *space_id , int_f *classtype)
 
 /****if* H5Sf/h5soffset_simple_c
  * NAME
- *        h5soffset_simple_c
+ *  h5soffset_simple_c
  * PURPOSE
- *     Call H5Soffset_simple to set the offset of a simple
- *              dataspace
+ *  Call H5Soffset_simple to set the offset of a simple
+ *  dataspace
  * INPUTS
- *      space_id - identifier of the dataspace
- *              offset - offset array
+ *  space_id - identifier of the dataspace
+ *  offset - offset array
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 11, 1999
+ *  Wednesday, August 11, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5soffset_simple_c ( hid_t_f *space_id , hssize_t_f *offset)
+h5soffset_simple_c ( hid_t_f *space_id , hssize_t_f *offset)
 /******/
 {
     hid_t c_space_id;
@@ -738,27 +738,27 @@ done:
 
 /****if* H5Sf/h5sset_extent_simple_c
  * NAME
- *        h5sset_extent_simple_c
+ *  h5sset_extent_simple_c
  * PURPOSE
- *     Call H5Sset_extent_simple to set or reset size of
- *              existing  dataspace
+ *  Call H5Sset_extent_simple to set or reset size of
+ *  existing  dataspace
  * INPUTS
- *      space_id - identifier of the dataspace
- *              rank - dataspace rank
- *              current_size - array with the new dimension sizes
- *              maximum_size - aray with maximum sizes of dimensions
+ *  space_id - identifier of the dataspace
+ *  rank - dataspace rank
+ *  current_size - array with the new dimension sizes
+ *  maximum_size - aray with maximum sizes of dimensions
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 11, 1999
+ *  Wednesday, August 11, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sset_extent_simple_c ( hid_t_f *space_id , int_f *rank, hsize_t_f *current_size, hsize_t_f *maximum_size)
+h5sset_extent_simple_c ( hid_t_f *space_id , int_f *rank, hsize_t_f *current_size, hsize_t_f *maximum_size)
 /******/
 {
     hsize_t c_current_size[H5S_MAX_RANK];
@@ -784,27 +784,27 @@ done:
 
 /****if* H5Sf/h5sget_simple_extent_dims_c
  * NAME
- *        h5sget_simple_extent_dims_c
+ *  h5sget_simple_extent_dims_c
  * PURPOSE
- *     Call H5Sget_simple_extent_dims to retrieve sizes of an
- *              existing  dataspace
+ *  Call H5Sget_simple_extent_dims to retrieve sizes of an
+ *  existing  dataspace
  * INPUTS
- *      space_id - identifier of the dataspace
+ *  space_id - identifier of the dataspace
  * OUTPUTS
- *     dims - array with the dimension sizes
- *              maxdims - aray with maximum sizes of dimensions
+ *  dims - array with the dimension sizes
+ *  maxdims - aray with maximum sizes of dimensions
  * RETURNS
- *     number of dataspace dimensions (rank) on success, -1 on failure
+ *  number of dataspace dimensions (rank) on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 11, 1999
+ *  Wednesday, August 11, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sget_simple_extent_dims_c ( hid_t_f *space_id , hsize_t_f *dims, hsize_t_f *maxdims)
+h5sget_simple_extent_dims_c ( hid_t_f *space_id , hsize_t_f *dims, hsize_t_f *maxdims)
 /******/
 {
     hid_t c_space_id;
@@ -838,27 +838,27 @@ done:
 
 /****if* H5Sf/h5sis_simple_c
  * NAME
- *        h5sis_simple_c
+ *  h5sis_simple_c
  * PURPOSE
- *     Call H5Sis_simple to detrmine if the dataspace
- *              is simple.
+ *  Call H5Sis_simple to detrmine if the dataspace
+ *  is simple.
  * INPUTS
- *      space_id - identifier of the dataspace
+ *  space_id - identifier of the dataspace
  * OUTPUTS
- *     flag - 0 if not simple, 1 if is simple,
- *              and negative on failure.
+ *  flag - 0 if not simple, 1 if is simple,
+ *  and negative on failure.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 11, 1999
+ *  Wednesday, August 11, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sis_simple_c ( hid_t_f *space_id , int_f *flag )
+h5sis_simple_c ( hid_t_f *space_id , int_f *flag )
 /******/
 {
   int ret_value = 0;
@@ -875,24 +875,24 @@ nh5sis_simple_c ( hid_t_f *space_id , int_f *flag )
 
 /****if* H5Sf/h5sextent_copy_c
  * NAME
- *        h5sextent_copy_c
+ *  h5sextent_copy_c
  * PURPOSE
- *     Call H5Sextent_copy to copy an extent of dataspace
+ *  Call H5Sextent_copy to copy an extent of dataspace
  * INPUTS
- *      dest_space_id - identifier of the destination dataspace
- *              source_space_id - identifier of the source dataspace
+ *  dest_space_id - identifier of the destination dataspace
+ *  source_space_id - identifier of the source dataspace
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 11, 1999
+ *  Wednesday, August 11, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sextent_copy_c ( hid_t_f *dest_space_id , hid_t_f *source_space_id)
+h5sextent_copy_c ( hid_t_f *dest_space_id , hid_t_f *source_space_id)
 /******/
 {
   int ret_value = 0;
@@ -908,23 +908,23 @@ nh5sextent_copy_c ( hid_t_f *dest_space_id , hid_t_f *source_space_id)
 
 /****if* H5Sf/h5sset_extent_none_c
  * NAME
- *        h5sset_extent_none_c
+ *  h5sset_extent_none_c
  * PURPOSE
- *     Call H5Sset_extent_none to remove extent from a dataspace
+ *  Call H5Sset_extent_none to remove extent from a dataspace
  * INPUTS
- *      space_id - dataspace identifier
+ *  space_id - dataspace identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 11, 1999
+ *  Wednesday, August 11, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sset_extent_none_c ( hid_t_f *space_id )
+h5sset_extent_none_c ( hid_t_f *space_id )
 /******/
 {
   int ret_value = 0;
@@ -939,30 +939,30 @@ nh5sset_extent_none_c ( hid_t_f *space_id )
 
 /****if* H5Sf/h5sselect_hyperslab_c
  * NAME
- *        h5sselect_hyperslab_c
+ *  h5sselect_hyperslab_c
  * PURPOSE
- *     Call H5Sselect_hyperslab to select a hyperslab
+ *  Call H5Sselect_hyperslab to select a hyperslab
  * INPUTS
- *      space_id - identifier of the dataspace
- *              operator - defines how the new selection is combined
- *              with the previous one; current values are
+ *  space_id - identifier of the dataspace
+ *  operator - defines how the new selection is combined
+ *  with the previous one; current values are
  *              H5S_SELECT_SET_F (0) and H5S_SELECT_OR_F (1)
- *              start - offset of start of hyperslab
- *              count - number of blocks included in the hyperslab
- *              stride - hyperslab stride (interval between blocks)
- *              block - size of block in the hyperslab
+ *  start - offset of start of hyperslab
+ *  count - number of blocks included in the hyperslab
+ *  stride - hyperslab stride (interval between blocks)
+ *  block - size of block in the hyperslab
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 11, 1999
+ *  Wednesday, August 11, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sselect_hyperslab_c ( hid_t_f *space_id , int_f *op, hsize_t_f *start, hsize_t_f *count, hsize_t_f *stride, hsize_t_f *block)
+h5sselect_hyperslab_c ( hid_t_f *space_id , int_f *op, hsize_t_f *start, hsize_t_f *count, hsize_t_f *stride, hsize_t_f *block)
 /******/
 {
     hsize_t c_start[H5S_MAX_RANK];
@@ -1000,30 +1000,30 @@ done:
 #ifdef NEW_HYPERSLAB_API
 /****if* H5Sf/h5scombine_hyperslab_c
  * NAME
- *        h5scombine_hyperslab_c
+ *  h5scombine_hyperslab_c
  * PURPOSE
- *     Call H5Scombine_hyperslab
+ *  Call H5Scombine_hyperslab
  * INPUTS
- *      space_id - identifier of the dataspace
- *              operator - defines how the new selection is combined
- *              start - offset of start of hyperslab
- *              count - number of blocks included in the hyperslab
- *              stride - hyperslab stride (interval between blocks)
- *              block - size of block in the hyperslab
+ *  space_id - identifier of the dataspace
+ *  operator - defines how the new selection is combined
+ *  start - offset of start of hyperslab
+ *  count - number of blocks included in the hyperslab
+ *  stride - hyperslab stride (interval between blocks)
+ *  block - size of block in the hyperslab
  * OUTPUTS
- *     hyper_id - identifier for the new dataspace
+ *  hyper_id - identifier for the new dataspace
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, October 7, 2002
+ *  Monday, October 7, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5scombine_hyperslab_c ( hid_t_f *space_id , int_f *op, hsize_t_f *start, hsize_t_f *count, hsize_t_f *stride, hsize_t_f *block, hid_t_f *hyper_id)
+h5scombine_hyperslab_c ( hid_t_f *space_id , int_f *op, hsize_t_f *start, hsize_t_f *count, hsize_t_f *stride, hsize_t_f *block, hid_t_f *hyper_id)
 /******/
 {
   int ret_value = -1;
@@ -1082,27 +1082,27 @@ DONE:
 }
 /****if* H5Sf/h5scombine_select_c
  * NAME
- *        h5scombine_select_c
+ *  h5scombine_select_c
  * PURPOSE
- *     Call H5Scombine_ select
+ *  Call H5Scombine_ select
  * INPUTS
- *      space1_id - identifier of the first dataspace
- *              operator - defines how the new selection is combined
- *              space2_id - identifier of the second dataspace
+ *  space1_id - identifier of the first dataspace
+ *  operator - defines how the new selection is combined
+ *  space2_id - identifier of the second dataspace
  * OUTPUTS
- *     ds_id   - identifier for the new dataspace
+ *  ds_id   - identifier for the new dataspace
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, October 7, 2002
+ *  Monday, October 7, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5scombine_select_c ( hid_t_f *space1_id , int_f *op, hid_t_f *space2_id, hid_t_f *ds_id)
+h5scombine_select_c ( hid_t_f *space1_id , int_f *op, hid_t_f *space2_id, hid_t_f *ds_id)
 /******/
 {
   int ret_value = -1;
@@ -1123,25 +1123,25 @@ nh5scombine_select_c ( hid_t_f *space1_id , int_f *op, hid_t_f *space2_id, hid_t
 }
 /****if* H5Sf/h5sselect_select_c
  * NAME
- *        h5sselect_select_c
+ *  h5sselect_select_c
  * PURPOSE
- *     Call H5Sselect_ select
+ *  Call H5Sselect_ select
  * INPUTS
- *      space1_id - identifier of the first dataspace  to modify
- *              operator - defines how the new selection is combined
- *              space2_id - identifier of the second dataspace
+ *  space1_id - identifier of the first dataspace  to modify
+ *  operator - defines how the new selection is combined
+ *  space2_id - identifier of the second dataspace
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, October 7, 2002
+ *  Monday, October 7, 2002
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sselect_select_c ( hid_t_f *space1_id , int_f *op, hid_t_f *space2_id)
+h5sselect_select_c ( hid_t_f *space1_id , int_f *op, hid_t_f *space2_id)
 /******/
 {
   int ret_value = -1;
@@ -1160,24 +1160,24 @@ nh5sselect_select_c ( hid_t_f *space1_id , int_f *op, hid_t_f *space2_id)
 #endif /*NEW_HYPERSLAB_API*/
 /****if* H5Sf/h5sget_select_type_c
  * NAME
- *        h5sget_select_type_c
+ *  h5sget_select_type_c
  * PURPOSE
- *     Call H5Sget_select_type
+ *  Call H5Sget_select_type
  * INPUTS
- *      space_id - identifier of the dataspace
+ *  space_id - identifier of the dataspace
  * OUTPUTS
- *     type - type of selection
+ *  type - type of selection
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Monday, October 7, 2002
+ *  Monday, October 7, 2002
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5sget_select_type_c ( hid_t_f *space_id , int_f *type)
+h5sget_select_type_c ( hid_t_f *space_id , int_f *type)
 /******/
 {
   int ret_value = -1;
@@ -1195,28 +1195,28 @@ nh5sget_select_type_c ( hid_t_f *space_id , int_f *type)
 
 /****if* H5Sf/h5sselect_elements_c
  * NAME
- *        h5sselect_elements_c
+ *  h5sselect_elements_c
  * PURPOSE
- *     Call H5Sselect_elements to select elements of a dataspace
+ *  Call H5Sselect_elements to select elements of a dataspace
  * INPUTS
- *      space_id - identifier of the dataspace
- *              operator - defines how the new selection is combined
- *              with the previous one; current values are
+ *  space_id - identifier of the dataspace
+ *  operator - defines how the new selection is combined
+ *  with the previous one; current values are
  *              H5S_SELECT_SET_F (0)
- *              nelements - number of elements in the selection
- *              coord - arrays with the elements coordinates
+ *  nelements - number of elements in the selection
+ *  coord - arrays with the elements coordinates
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, August 11, 1999
+ *  Wednesday, August 11, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sselect_elements_c ( hid_t_f *space_id , int_f *op, size_t_f *nelements,  hsize_t_f *coord)
+h5sselect_elements_c ( hid_t_f *space_id , int_f *op, size_t_f *nelements,  hsize_t_f *coord)
 /******/
 {
   int ret_value = -1;
@@ -1251,28 +1251,28 @@ nh5sselect_elements_c ( hid_t_f *space_id , int_f *op, size_t_f *nelements,  hsi
 
 /****if* H5Sf/h5sdecode_c
  * NAME
- *        h5sdecode_c
+ *  h5sdecode_c
  * PURPOSE
- *     Call H5Sdecode
+ *  Call H5Sdecode
  * INPUTS
  *
  *		buf     - Buffer for the data space object to be decoded.
  * OUTPUTS
  *
- *              obj_id  - Object_id (non-negative)
+ *  obj_id  - Object_id (non-negative)
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 26, 2008
+ *  March 26, 2008
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sdecode_c ( _fcd buf, hid_t_f *obj_id )
+h5sdecode_c ( _fcd buf, hid_t_f *obj_id )
 /******/
 {
   int ret_value = -1;
@@ -1297,26 +1297,26 @@ nh5sdecode_c ( _fcd buf, hid_t_f *obj_id )
 
 /****if* H5Sf/h5sencode_c
  * NAME
- *        h5sencode_c
+ *  h5sencode_c
  * PURPOSE
- *     Call H5Sencode
+ *  Call H5Sencode
  * INPUTS
  *
- *            obj_id - Identifier of the object to be encoded.
+ *  obj_id - Identifier of the object to be encoded.
  *		 buf - Buffer for the object to be encoded into.
- *            nalloc - The size of the allocated buffer.
+ *  nalloc - The size of the allocated buffer.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              March 26, 2008
+ *  March 26, 2008
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sencode_c (_fcd buf, hid_t_f *obj_id, size_t_f *nalloc )
+h5sencode_c (_fcd buf, hid_t_f *obj_id, size_t_f *nalloc )
 /******/
 {
   int ret_value = -1;
@@ -1366,28 +1366,28 @@ nh5sencode_c (_fcd buf, hid_t_f *obj_id, size_t_f *nalloc )
 
 /****if* H5Sf/h5sextent_equal_c
  * NAME
- *        h5sextent_equal_c
+ *  h5sextent_equal_c
  * PURPOSE
- *     Call H5Sextent_equal
+ *  Call H5Sextent_equal
  * INPUTS
  *
  *		space1_id - First dataspace identifier.
- *              space2_id - Second dataspace identifier.
+ *  space2_id - Second dataspace identifier.
  * OUTPUTS
  *
- *              equal - TRUE if equal, FALSE if unequal.
+ *  equal - TRUE if equal, FALSE if unequal.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
- *              April 4, 2008
+ *  April 4, 2008
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5sextent_equal_c ( hid_t_f * space1_id, hid_t_f *space2_id, hid_t_f *c_equal)
+h5sextent_equal_c ( hid_t_f * space1_id, hid_t_f *space2_id, hid_t_f *c_equal)
 /******/
 {
   int ret_value = -1;
diff --git a/fortran/src/H5Sff.F90 b/fortran/src/H5Sff.F90
new file mode 100644
index 0000000..aeb3314
--- /dev/null
+++ b/fortran/src/H5Sff.F90
@@ -0,0 +1,1754 @@
+!****h* ROBODoc/H5S
+!
+! NAME
+!  MODULE H5S
+!
+! FILE
+!  fortran/src/H5Sff.f90
+!
+! PURPOSE
+!  This file contains Fortran interfaces for H5S functions.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! NOTES
+!
+!       _____ __  __ _____   ____  _____ _______       _   _ _______
+!      |_   _|  \/  |  __ \ / __ \|  __ \__   __|/\   | \ | |__   __|
+! ****   | | | \  / | |__) | |  | | |__) | | |  /  \  |  \| |  | |    ****
+! ****   | | | |\/| |  ___/| |  | |  _  /  | | / /\ \ | . ` |  | |    ****
+! ****  _| |_| |  | | |    | |__| | | \ \  | |/ ____ \| |\  |  | |    ****
+!      |_____|_|  |_|_|     \____/|_|  \_\ |_/_/    \_\_| \_|  |_|
+!
+!  If you add a new H5S function you must add the function name to the
+!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
+!  This is needed for Windows based operating systems.
+!
+!*****
+
+MODULE H5S
+  USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR, C_CHAR
+  USE H5GLOBAL
+
+CONTAINS
+!
+!****s* H5S/h5screate_simple_f
+!
+! NAME
+!  h5screate_simple_f
+!
+! PURPOSE 	
+!  Creates a new simple data space and opens it for access	.
+!
+! INPUTS
+!  rank        - number of dimensions
+!  dims        - an array of the size of each dimension
+! OUTPUTS
+!  space_id    - dataspace identifier
+!  hdferr      - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  maxdims     - an array of the maximum size of each dimension
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+! SOURCE
+  SUBROUTINE h5screate_simple_f(rank, dims, space_id, hdferr, maxdims)
+
+    IMPLICIT NONE
+    INTEGER, INTENT(IN) :: rank
+    INTEGER(HSIZE_T), INTENT(IN) :: dims(rank)
+    INTEGER(HID_T), INTENT(OUT) :: space_id
+    INTEGER, INTENT(OUT) :: hdferr
+    INTEGER(HSIZE_T), OPTIONAL, INTENT(IN) :: maxdims(rank)
+!*****
+    INTEGER(HSIZE_T), ALLOCATABLE, DIMENSION(:) :: f_maxdims
+
+    INTERFACE
+       INTEGER FUNCTION h5screate_simple_c(rank, dims, maxdims, space_id) BIND(C,NAME='h5screate_simple_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER, INTENT(IN) :: rank
+         INTEGER(HSIZE_T), INTENT(IN) :: dims(rank)
+         INTEGER(HSIZE_T), DIMENSION(:),INTENT(IN) :: maxdims(rank)
+         INTEGER(HID_T), INTENT(OUT) :: space_id
+       END FUNCTION h5screate_simple_c
+    END INTERFACE
+
+    ALLOCATE (f_maxdims(rank), stat=hdferr)
+    IF (hdferr .NE. 0) THEN
+       hdferr = -1
+       RETURN
+    ENDIF
+    IF (PRESENT(maxdims)) THEN
+       f_maxdims = maxdims
+    ELSE
+       f_maxdims = dims
+    ENDIF
+    hdferr = h5screate_simple_c(rank, dims, f_maxdims, space_id)
+    DEALLOCATE(f_maxdims)
+    
+  END SUBROUTINE h5screate_simple_f
+
+!
+!****s* H5S/h5sclose_f
+!
+! NAME
+!  h5sclose_f
+!
+! PURPOSE
+!  Releases and terminates access to a dataspace.
+!
+! INPUTS
+!  space_id    - identifier of dataspace to release
+! OUTPUTS
+!  hdferr      - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+!
+! SOURCE
+  SUBROUTINE h5sclose_f(space_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5sclose_c(space_id) BIND(C,NAME='h5sclose_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+       END FUNCTION h5sclose_c
+    END INTERFACE
+    
+    hdferr = h5sclose_c(space_id)
+    
+  END SUBROUTINE h5sclose_f
+
+!
+!****s* H5S/h5screate_f
+!
+! NAME
+!  h5screate_f
+!
+! PURPOSE
+!  Creates a new dataspace of a specified type.
+!
+! INPUTS
+!  classtype   - The type of the dataspace to be created
+!                Possible values are:
+!                     H5S_SCALAR_F
+!                     H5S_SIMPLE_F
+!                     H5S_NULL_F
+! OUTPUTS
+!  space_id    - Dataspace identifier
+!  hdferr      - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+!
+! NOTES
+!
+
+! SOURCE
+  SUBROUTINE h5screate_f(classtype, space_id, hdferr)
+    IMPLICIT NONE
+    INTEGER, INTENT(IN) :: classtype
+    INTEGER(HID_T), INTENT(OUT) :: space_id
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5screate_c(classtype, space_id) BIND(C,NAME='h5screate_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER, INTENT(IN) :: classtype
+         INTEGER(HID_T), INTENT(OUT) :: space_id
+       END FUNCTION h5screate_c
+    END INTERFACE
+    
+    hdferr = h5screate_c(classtype, space_id)
+    
+  END SUBROUTINE h5screate_f
+
+!
+!****s* H5S/h5scopy_f
+!
+! NAME
+!  h5scopy_f
+!
+! PURPOSE
+!  Creates an exact copy of a dataspace.
+!
+! INPUTS
+!  space_id 	 - dataspace identifier
+! OUTPUTS
+!  new_space_id  - identifier of dataspace's copy
+!  hdferr        - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+!
+! NOTES
+!
+
+! SOURCE
+  SUBROUTINE h5scopy_f(space_id, new_space_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id
+    INTEGER(HID_T), INTENT(OUT) :: new_space_id
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5scopy_c(space_id, new_space_id) BIND(C,NAME='h5scopy_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER(HID_T), INTENT(OUT):: new_space_id
+       END FUNCTION h5scopy_c
+    END INTERFACE
+
+    hdferr = h5scopy_c(space_id, new_space_id)
+
+  END SUBROUTINE h5scopy_f
+
+!
+!****s* H5S/h5sget_select_hyper_nblocks_f
+!
+! NAME
+!  h5sget_select_hyper_nblocks_f
+!
+! PURPOSE
+!  Get number of hyperslab blocks.
+!
+! INPUTS
+!  space_id    - dataspace identifier
+! OUTPUTS
+!  num_blocks  - number of hyperslab blocks in the current
+!                hyperslab selection
+!  hdferr      - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+!
+! SOURCE
+  SUBROUTINE h5sget_select_hyper_nblocks_f(space_id, num_blocks, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id
+    INTEGER(HSSIZE_T), INTENT(OUT) :: num_blocks
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5sget_select_hyper_nblocks_c (space_id, num_blocks) &
+            BIND(C,NAME='h5sget_select_hyper_nblocks_c')
+         IMPORT :: HID_T, HSSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER(HSSIZE_T), INTENT(OUT) :: num_blocks
+       END FUNCTION h5sget_select_hyper_nblocks_c
+    END INTERFACE
+
+    hdferr =  h5sget_select_hyper_nblocks_c (space_id, num_blocks)
+    
+  END SUBROUTINE h5sget_select_hyper_nblocks_f
+
+!
+!****s* H5S/h5sget_select_hyper_blocklist_f
+!
+! NAME
+!  h5sget_select_hyper_blocklist_f
+!
+! PURPOSE
+!  Gets the list of hyperslab blocks currently selected.
+!
+! INPUTS
+!  space_id    - dataspace identifier
+!  startblock  - hyperslab block to start with
+!  num_blocks  - number of blocks to get
+! OUTPUTS
+!  buf 	       - buffer to hold block list
+!  hdferr      - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+! SOURCE
+  SUBROUTINE h5sget_select_hyper_blocklist_f(space_id, startblock, &
+                                                    num_blocks, buf, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id 
+    INTEGER(HSIZE_T), INTENT(IN) :: startblock
+    INTEGER(HSIZE_T), INTENT(IN) :: num_blocks
+    INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: buf
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5sget_select_hyper_blocklist_c(space_id, startblock, &
+            num_blocks, buf ) BIND(C,NAME='h5sget_select_hyper_blocklist_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER(HSIZE_T), INTENT(IN) :: startblock
+         INTEGER(HSIZE_T), INTENT(IN) :: num_blocks
+         INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: buf
+       END FUNCTION h5sget_select_hyper_blocklist_c
+    END INTERFACE
+
+    hdferr =  h5sget_select_hyper_blocklist_c(space_id, startblock, num_blocks, buf )
+
+  END SUBROUTINE h5sget_select_hyper_blocklist_f
+
+!
+!****s* H5S/h5sget_select_bounds_f
+!
+! NAME
+!  h5sget_select_bounds_f
+!
+! PURPOSE
+!  Gets the bounding box containing the current selection.
+!
+! INPUTS
+!  space_id    - dataspace identifier
+!
+! OUTPUTS
+!  start       - starting coordinates of bounding box
+!  end 	       - ending coordinates of bounding box
+!                i.e., the coordinates of the diagonally opposite corner
+!  hdferr      - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  NONE
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+! SOURCE
+  SUBROUTINE  h5sget_select_bounds_f(space_id, start, END, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id
+    INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: start
+    INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: END
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5sget_select_bounds_c(space_id, start, end) &
+            BIND(C,NAME='h5sget_select_bounds_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: start
+         INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: END
+       END FUNCTION h5sget_select_bounds_c
+    END INTERFACE
+
+    hdferr =   h5sget_select_bounds_c(space_id, start, END)
+
+  END SUBROUTINE h5sget_select_bounds_f
+
+!
+!****s* H5S/h5sget_select_elem_npoints_f
+!
+! NAME
+!  h5sget_select_elem_npoints_f
+!
+! PURPOSE
+!  Gets the number of element points in the current selection
+!
+! INPUTS
+!  space_id 	 - dataspace identifier
+! OUTPUTS
+!  num_points 	 - number of element points in the current
+!                  dataspace selection
+!  hdferr        - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+!
+! SOURCE
+  SUBROUTINE h5sget_select_elem_npoints_f(space_id, num_points, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id
+    INTEGER(HSSIZE_T), INTENT(OUT) :: num_points
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5sget_select_elem_npoints_c (space_id, num_points) BIND(C,NAME='h5sget_select_elem_npoints_c')
+         IMPORT :: HID_T, HSSIZE_T
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER(HSSIZE_T), INTENT(OUT) :: num_points
+       END FUNCTION h5sget_select_elem_npoints_c
+    END INTERFACE
+
+    hdferr =  h5sget_select_elem_npoints_c (space_id, num_points)
+    
+  END SUBROUTINE h5sget_select_elem_npoints_f
+
+!
+!****s* H5S/h5sget_select_elem_pointlist_f
+!
+! NAME
+!  h5sget_select_elem_pointlist_f
+!
+! PURPOSE
+!  Gets the list of element points currently selected.
+!
+! INPUTS
+!  space_id    - dataspace identifier
+!  startpoint  - element point to start with
+!  num_points  - number of elemnt points to get
+! OUTPUTS
+!  buf 	       - buffer with element points selected
+!  hdferr      - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+!
+! SOURCE
+  SUBROUTINE h5sget_select_elem_pointlist_f(space_id, startpoint, &
+       num_points, buf, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id
+    INTEGER(HSIZE_T), INTENT(IN) :: startpoint
+    INTEGER(HSIZE_T), INTENT(IN) :: num_points
+    INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: buf
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5sget_select_elem_pointlist_c(space_id, startpoint, &
+            num_points, buf ) BIND(C,NAME='h5sget_select_elem_pointlist_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER(HSIZE_T), INTENT(IN) :: startpoint
+         INTEGER(HSIZE_T), INTENT(IN) :: num_points
+         INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: buf
+       END FUNCTION h5sget_select_elem_pointlist_c
+    END INTERFACE
+    
+    hdferr =  h5sget_select_elem_pointlist_c(space_id, startpoint, &
+         num_points, buf )
+    
+  END SUBROUTINE h5sget_select_elem_pointlist_f
+
+!
+!****s* H5S/h5sselect_elements_f
+!
+! NAME
+!  h5sselect_elements_f
+!
+! PURPOSE
+!  Selects elements to be included in the selection for
+!  a dataspace
+!
+! INPUTS
+!  space_id 	 - dataspace identifier
+!  operator 	 - flag, valid values are:
+!                   H5S_SELECT_SET_F 
+!                   H5S_SELECT_APPEND_F 
+!                   H5S_SELECT_PREPEND_F
+!  rank 	 - number of dataspace dimensions
+!  num_elements  - number of elements to be selected
+!  coord 	 - 2D (rank x num_elements) array with the
+!                  elements coordinates ( 1-based); in C the
+!                  array is stored in 2D as (num_element x rank)
+! OUTPUTS
+!  hdferr        - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+! SOURCE
+  SUBROUTINE h5sselect_elements_f(space_id, OPERATOR, rank, &
+       num_elements, coord, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T),   INTENT(IN)                                :: space_id
+    INTEGER,          INTENT(IN)                                :: OPERATOR
+    INTEGER,          INTENT(IN)                                :: rank
+    INTEGER(SIZE_T),  INTENT(IN)                                :: num_elements
+    INTEGER(HSIZE_T), INTENT(IN) , DIMENSION(rank,num_elements) :: coord
+    INTEGER,          INTENT(OUT)                               :: hdferr 
+!*****
+    INTEGER(HSIZE_T), ALLOCATABLE, DIMENSION(:,:) :: c_coord
+    INTEGER :: error, i
+
+    INTERFACE
+       INTEGER FUNCTION h5sselect_elements_c(space_id, OPERATOR,&
+            num_elements,c_c_coord) BIND(C,NAME='h5sselect_elements_c')
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER, INTENT(IN) :: OPERATOR
+         INTEGER(SIZE_T), INTENT(IN) :: num_elements
+         INTEGER(HSIZE_T),DIMENSION(*) :: c_c_coord
+       END FUNCTION h5sselect_elements_c
+    END INTERFACE
+
+    ALLOCATE(c_coord(rank,num_elements), STAT = error)
+    IF (error.NE. 0) THEN
+       hdferr = -1
+       RETURN
+    ENDIF
+    DO i = 1, rank
+       c_coord(i,:) = coord(rank-i+1, :) - 1
+    ENDDO
+    hdferr = h5sselect_elements_c(space_id, OPERATOR, num_elements, c_coord)
+
+!  ALLOCATE(c_coord(num_elements,rank), stat = error)
+!  IF (error.NE. 0) THEN
+!  hdferr = -1
+!  RETURN
+!  ENDIF
+!
+!  c_coord = TRANSPOSE(coord)
+!  hdferr = h5sselect_elements_c(space_id, OPERATOR, INT(rank,size_t), c_coord)
+
+
+    DEALLOCATE(c_coord)
+
+  END SUBROUTINE h5sselect_elements_f
+
+!
+!****s* H5S/h5sselect_all_f
+!
+! NAME
+!  h5sselect_all_f
+!
+! PURPOSE
+!  Selects the entire dataspace.
+!
+! INPUTS
+!  space_id    - Identifier for the dataspace in which
+!                selection being made
+! OUTPUTS
+!  hdferr      - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+!
+! SOURCE
+  SUBROUTINE h5sselect_all_f(space_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id
+    INTEGER, INTENT(OUT) :: hdferr 
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5sselect_all_c(space_id) BIND(C,NAME='h5sselect_all_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+       END FUNCTION h5sselect_all_c
+    END INTERFACE
+    
+    hdferr = h5sselect_all_c(space_id)
+    
+  END SUBROUTINE h5sselect_all_f
+
+!
+!****s* H5S/h5sselect_none_f
+!
+! NAME
+!  h5sselect_none_f
+!
+! PURPOSE
+!  Resets the selection region to include no elements.
+!
+! INPUTS
+!  space_id    - the identifier for the dataspace in which
+!                the selection is being reset.
+! OUTPUTS
+!  hdferr      - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+!
+! SOURCE
+  SUBROUTINE h5sselect_none_f(space_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5sselect_none_c(space_id) BIND(C,NAME='h5sselect_none_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+       END FUNCTION h5sselect_none_c
+    END INTERFACE
+    
+    hdferr = h5sselect_none_c(space_id)
+    
+  END SUBROUTINE h5sselect_none_f
+
+!
+!****s* H5S/h5sselect_valid_f
+!
+! NAME
+!  h5sselect_valid_f
+!
+! PURPOSE
+!  Verifies that the selection is within the extent of
+!  the dataspace.
+!
+! INPUTS
+!  space_id - identifier for the dataspace for which
+!                  selection is verified
+! OUTPUTS
+!  status   - TRUE if the selection is contained within 
+!             the extent, FALSE otherwise. 
+!  hdferr   - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+!
+! SOURCE
+  SUBROUTINE h5sselect_valid_f(space_id, status, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id
+    LOGICAL, INTENT(OUT) :: status
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTEGER :: flag ! "TRUE/FALSE/ERROR" flag from C routine
+
+    INTERFACE
+       INTEGER FUNCTION h5sselect_valid_c(space_id, flag) BIND(C,NAME='h5sselect_valid_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER :: flag
+       END FUNCTION h5sselect_valid_c
+    END INTERFACE
+    
+    hdferr = h5sselect_valid_c(space_id, flag)
+    status = .TRUE.
+    IF (flag .EQ. 0) status = .FALSE.
+    
+  END SUBROUTINE h5sselect_valid_f
+
+!
+!****s* H5S/h5sget_simple_extent_npoints_f
+!
+! NAME
+!  h5sget_simple_extent_npoints_f
+!
+! PURPOSE
+!  Determines the number of elements in a dataspace.
+!
+! INPUTS
+!  space_id 	 - dataspace identifier
+! OUTPUTS
+!  npoints 	 - number of elements in the dataspace
+!  hdferr      - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+!
+! SOURCE
+  SUBROUTINE h5sget_simple_extent_npoints_f(space_id, npoints, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id 
+    INTEGER(HSIZE_T), INTENT(OUT) :: npoints
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5sget_simple_extent_npoints_c( space_id, npoints) BIND(C,NAME='h5sget_simple_extent_npoints_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER(HSIZE_T), INTENT(OUT) :: npoints
+       END FUNCTION h5sget_simple_extent_npoints_c
+    END INTERFACE
+
+    hdferr = h5sget_simple_extent_npoints_c( space_id, npoints)
+
+  END SUBROUTINE h5sget_simple_extent_npoints_f
+
+!
+!****s* H5S/h5sget_select_npoints_f
+!
+! NAME
+!  h5sget_select_npoints_f
+!
+! PURPOSE
+!  Determines the number of elements in a dataspace selection.
+!
+! INPUTS
+!  space_id - dataspace identifier
+! OUTPUTS
+!  npoints  - number of points in the dataspace selection
+!  hdferr   - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+! SOURCE
+  SUBROUTINE h5sget_select_npoints_f(space_id, npoints, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id
+    INTEGER(HSSIZE_T), INTENT(OUT) :: npoints
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5sget_select_npoints_c(space_id, npoints) BIND(C,NAME='h5sget_select_npoints_c')
+         IMPORT :: HID_T, HSSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER(HSSIZE_T), INTENT(OUT) :: npoints
+       END FUNCTION h5sget_select_npoints_c
+    END INTERFACE
+    
+    hdferr = h5sget_select_npoints_c(space_id, npoints)
+
+  END SUBROUTINE h5sget_select_npoints_f
+
+!
+!****s* H5S/h5sget_simple_extent_ndims_f
+!
+! NAME
+!  h5sget_simple_extent_ndims_f
+!
+! PURPOSE
+!  Determines the dimensionality of a dataspace
+!
+! INPUTS
+!  space_id 	 - dataspace identifier
+! OUTPUTS
+!  rank 	 - number of dataspace dimensions
+!  hdferr      - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+!
+! SOURCE
+  SUBROUTINE h5sget_simple_extent_ndims_f(space_id, rank, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id
+    INTEGER, INTENT(OUT) :: rank
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5sget_simple_extent_ndims_c(space_id, rank) BIND(C,NAME='h5sget_simple_extent_ndims_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER, INTENT(OUT) :: rank
+       END FUNCTION h5sget_simple_extent_ndims_c
+    END INTERFACE
+    
+    hdferr = h5sget_simple_extent_ndims_c(space_id, rank)
+    
+  END SUBROUTINE h5sget_simple_extent_ndims_f
+!
+!****s* H5S/h5sget_simple_extent_dims_f
+!
+! NAME
+!  h5sget_simple_extent_dims_f
+!
+! PURPOSE
+!  Retrieves dataspace dimension size and maximum size.
+!
+! INPUTS
+!  space_id - dataspace identifier
+!
+! OUTPUTS
+!  dims     - array to store size of each dimension
+!  maxdims  - array to store maximum size of each dimension
+!  hdferr   - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+!
+! SOURCE
+  SUBROUTINE h5sget_simple_extent_dims_f(space_id, dims, maxdims, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id
+    INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: dims
+    INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: maxdims
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5sget_simple_extent_dims_c(space_id, dims, maxdims) BIND(C,NAME='h5sget_simple_extent_dims_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: dims
+         INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: maxdims
+       END FUNCTION h5sget_simple_extent_dims_c
+    END INTERFACE
+    
+    hdferr = h5sget_simple_extent_dims_c(space_id, dims, maxdims)
+    
+  END SUBROUTINE h5sget_simple_extent_dims_f
+
+!
+!****s* H5S/h5sget_simple_extent_type_f
+!
+! NAME
+!  h5sget_simple_extent_type_f
+!
+! PURPOSE
+!  Determine the current class of a dataspace
+!
+! INPUTS
+!  space_id 	 - dataspace identifier
+! OUTPUTS
+!  classtype 	 - class type, possible values are:
+!                   H5S_NO_CLASS_F
+!                   H5S_SCALAR_F
+!                   H5S_SIMPLE_F
+!                   H5S_NULL_F
+!  hdferr      - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+!
+! SOURCE
+  SUBROUTINE h5sget_simple_extent_type_f(space_id, classtype, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id
+    INTEGER, INTENT(OUT) :: classtype
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5sget_simple_extent_type_c(space_id, classtype) BIND(C,NAME='h5sget_simple_extent_type_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER, INTENT(OUT) :: classtype
+       END FUNCTION h5sget_simple_extent_type_c
+    END INTERFACE
+    
+    hdferr = h5sget_simple_extent_type_c(space_id, classtype)
+    
+  END SUBROUTINE h5sget_simple_extent_type_f
+  !
+!****s* H5S/h5sset_extent_simple_f
+!
+! NAME
+!  h5sset_extent_simple_f
+!
+! PURPOSE
+!  Sets or resets the size of an existing dataspace.
+!
+! INPUTS
+!  space_id 	 - dataspace identifier
+!  rank 	 - dataspace number of dimensions
+!  current_size 	 - array with the new sizes of dimensions
+!  maximum_size 	 - array with the new maximum sizes of
+!  dimensions
+! OUTPUTS
+!  hdferr      - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+!
+! SOURCE
+  SUBROUTINE h5sset_extent_simple_f(space_id, rank, current_size, &
+       maximum_size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id
+    INTEGER, INTENT(IN) :: rank
+    INTEGER(HSIZE_T), DIMENSION(rank), INTENT(IN) :: current_size
+    INTEGER(HSIZE_T), DIMENSION(rank), INTENT(IN) :: maximum_size
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5sset_extent_simple_c(space_id, rank, &
+            current_size, maximum_size) BIND(C,NAME='h5sset_extent_simple_c')
+         IMPORT :: HID_T, HSIZE_T
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER, INTENT(IN) :: rank
+         INTEGER(HSIZE_T), DIMENSION(rank), INTENT(IN) :: current_size
+         INTEGER(HSIZE_T), DIMENSION(rank), INTENT(IN) :: maximum_size
+       END FUNCTION h5sset_extent_simple_c
+    END INTERFACE
+    
+    hdferr = h5sset_extent_simple_c(space_id, rank, current_size, &
+         maximum_size)
+
+  END SUBROUTINE h5sset_extent_simple_f
+!
+!****s* H5S/h5sis_simple_f
+!
+! NAME
+!  h5sis_simple_f
+!
+! PURPOSE
+!  Determines whether a dataspace is a simple dataspace.
+!
+! INPUTS
+!  space_id 	 - dataspace identifier
+! OUTPUTS
+!  status 	 - flag to indicate if dataspace
+!                  is simple or not (TRUE or FALSE)
+!  hdferr        - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+!
+! SOURCE
+  SUBROUTINE h5sis_simple_f(space_id, status, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id
+    LOGICAL, INTENT(OUT) :: status
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTEGER :: flag                     ! "TRUE/FALSE/ERROR from C"
+
+    INTERFACE
+       INTEGER FUNCTION h5sis_simple_c(space_id, flag) BIND(C,NAME='h5sis_simple_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER :: flag
+       END FUNCTION h5sis_simple_c
+    END INTERFACE
+    
+    hdferr = h5sis_simple_c(space_id, flag)
+    status = .TRUE.
+    IF (flag .EQ. 0) status = .FALSE.
+    
+  END SUBROUTINE h5sis_simple_f
+
+!
+!****s* H5S/h5soffset_simple_f
+!
+! NAME
+!  h5soffset_simple_f
+!
+! PURPOSE
+!  Sets the offset of a simple dataspace.
+!
+! INPUTS
+!  space_id 	 - dataspace identifier
+!  offset 	 - the offset at which to position the
+!                  selection
+! OUTPUTS
+!  hdferr      - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  NONE
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+!
+! SOURCE
+  SUBROUTINE h5soffset_simple_f(space_id, offset, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id
+    INTEGER(HSSIZE_T), DIMENSION(*), INTENT(IN) ::  offset
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5soffset_simple_c(space_id, offset) BIND(C,NAME='h5soffset_simple_c')
+         IMPORT :: HID_T, HSSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER(HSSIZE_T), DIMENSION(*), INTENT(IN) ::  offset
+       END FUNCTION h5soffset_simple_c
+    END INTERFACE
+
+    hdferr = h5soffset_simple_c(space_id, offset)
+
+  END SUBROUTINE h5soffset_simple_f
+
+!
+!****s* H5S/h5sextent_copy_f
+!
+! NAME
+!  h5sextent_copy_f
+!
+! PURPOSE
+!  Copies the extent of a dataspace.
+!
+! INPUTS
+!  dest_space_id     - the identifier for the dataspace to which
+!                      the extent is copied
+!  source_space_id   - the identifier for the dataspace from
+!                      which the extent is copied
+! OUTPUTS
+!  hdferr            - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  NONE
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+!
+! NOTES
+!
+
+! SOURCE
+  SUBROUTINE h5sextent_copy_f(dest_space_id, source_space_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dest_space_id
+    INTEGER(HID_T), INTENT(IN) :: source_space_id
+    INTEGER, INTENT(OUT) :: hdferr                ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5sextent_copy_c(dest_space_id, source_space_id) BIND(C,NAME='h5sextent_copy_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dest_space_id
+         INTEGER(HID_T), INTENT(IN) :: source_space_id
+       END FUNCTION h5sextent_copy_c
+    END INTERFACE
+
+    hdferr = h5sextent_copy_c(dest_space_id, source_space_id)
+
+  END SUBROUTINE h5sextent_copy_f
+
+!
+!****s* H5S/h5sset_extent_none_f
+!
+! NAME
+!  h5sset_extent_none_f
+!
+! PURPOSE
+!  Removes the extent from a dataspace.
+!
+! INPUTS
+!  space_id 	 - dataspace identifier
+! OUTPUTS
+!  hdferr      - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+!
+! SOURCE
+  SUBROUTINE h5sset_extent_none_f(space_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5sset_extent_none_c(space_id) BIND(C,NAME='h5sset_extent_none_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+       END FUNCTION h5sset_extent_none_c
+    END INTERFACE
+    
+    hdferr = h5sset_extent_none_c(space_id)
+    
+  END SUBROUTINE h5sset_extent_none_f
+!
+!****s* H5S/h5sselect_hyperslab_f
+!
+! NAME
+!  h5sselect_hyperslab_f
+!
+! PURPOSE
+!  Selects a hyperslab region to add to the current selected
+!  region
+!
+! INPUTS
+!  space_id 	 - dataspace identifier
+!  operator 	 - flag, valid values are:
+!                    H5S_SELECT_SET_F
+!                    H5S_SELECT_OR_F
+!  start 	 - array with hyperslab offsets
+!  count 	 - number of blocks included in the hyperslab
+! OUTPUTS
+!  hdferr        - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  stride 	 - array with hyperslab strides
+!  block 	 - array with hyperslab block sizes
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 6, 2001
+!
+! SOURCE
+  SUBROUTINE h5sselect_hyperslab_f(space_id, OPERATOR, start, count, &
+       hdferr, stride, BLOCK)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space_id 
+    INTEGER, INTENT(IN) :: OPERATOR
+    INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: start
+    INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: count
+    INTEGER, INTENT(OUT) :: hdferr
+    INTEGER(HSIZE_T), DIMENSION(:), OPTIONAL, INTENT(IN) :: stride
+    INTEGER(HSIZE_T), DIMENSION(:), OPTIONAL, INTENT(IN) :: BLOCK
+!*****
+    INTEGER(HSIZE_T), DIMENSION(:), ALLOCATABLE :: def_block
+    INTEGER(HSIZE_T), DIMENSION(:), ALLOCATABLE :: def_stride
+    INTEGER :: rank
+    INTEGER :: error1, error2
+    
+    INTERFACE
+       INTEGER FUNCTION h5sselect_hyperslab_c(space_id, OPERATOR, &
+            start, count, stride, BLOCK) BIND(C,NAME='h5sselect_hyperslab_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER, INTENT(IN) :: OPERATOR
+         INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: start
+         INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: count
+         INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: stride
+         INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: BLOCK
+       END FUNCTION h5sselect_hyperslab_c
+    END INTERFACE
+
+    IF (PRESENT(stride).AND. PRESENT(BLOCK)) THEN
+       hdferr = h5sselect_hyperslab_c(space_id, OPERATOR, start, count, &
+            stride, BLOCK)
+       RETURN
+    ENDIF
+    ! Case of optional parameters.
+    !
+    ! Find the rank of the dataspace to allocate memery for
+    ! default stride and block arrays.
+    !
+    CALL h5sget_simple_extent_ndims_f(space_id, rank, hdferr)
+    IF( hdferr .EQ. -1) RETURN
+    !
+    IF (PRESENT(stride).AND. .NOT.PRESENT(BLOCK)) THEN
+       ALLOCATE(def_block(rank), stat=error1)
+       IF (error1.NE.0) THEN
+          hdferr = -1
+          RETURN
+       ENDIF
+       def_block = 1
+       hdferr = h5sselect_hyperslab_c(space_id, OPERATOR, start, count, &
+            stride, def_block)
+       DEALLOCATE(def_block)
+       RETURN
+    ENDIF
+    
+    IF (.NOT.PRESENT(stride).AND. PRESENT(BLOCK)) THEN
+       ALLOCATE(def_stride(rank), stat=error2)
+       IF (error2.NE.0) THEN
+          hdferr = -1
+          RETURN
+       ENDIF
+       def_stride = 1
+       hdferr = h5sselect_hyperslab_c(space_id, OPERATOR, start, count, &
+            def_stride, BLOCK)
+       DEALLOCATE(def_stride)
+       RETURN
+    ENDIF
+    ALLOCATE(def_block(rank), stat=error1)
+    ALLOCATE(def_stride(rank), stat=error2)
+    IF ((error1.NE.0) .OR. (error2.NE.0)) THEN
+       hdferr = -1
+       RETURN
+    ENDIF
+    def_block = 1
+    def_stride = 1
+    hdferr = h5sselect_hyperslab_c(space_id, OPERATOR, start, count, &
+         def_stride, def_block)
+    DEALLOCATE(def_block)
+    DEALLOCATE(def_stride)
+    
+  END SUBROUTINE h5sselect_hyperslab_f
+!  !$!
+!  !$!****s* H5S/h5scombine_hyperslab_f
+!  !$!
+!  !$! NAME
+!  !$!		h5scombine_hyperslab_f
+!  !$!
+!  !$! PURPOSE
+!  !$!	Combine a hyperslab selection with the current
+!  !$!               selection for a dataspace
+!  !$!
+!  !$! INPUTS
+!  !$!		space_id	- dataspace of selection to use
+!  !$!		operator	- flag, valid values are:
+!  !$!				  H5S_SELECT_NOOP_F
+!  !$!				  H5S_SELECT_SET_F
+!  !$!				  H5S_SELECT_OR_F
+!  !$!				  H5S_SELECT_AND_F
+!  !$!				  H5S_SELECT_XOR_F
+!  !$!				  H5S_SELECT_NOTB_F
+!  !$!				  H5S_SELECT_NOTA_F
+!  !$!				  H5S_SELECT_APPEND_F
+!  !$!				  H5S_SELECT_PREPEND_F
+!  !$!		start		- array with hyperslab offsets
+!  !$!		count		- number of blocks included in the
+!  !$!				  hyperslab
+!  !$! OUTPUTS
+!  !$!               hyper_id        - identifier for the new hyperslab
+!  !$!		hdferr:		- error code
+!  !$!				 	Success:  0
+!  !$!				 	Failure: -1
+!  !$! OPTIONAL PARAMETERS
+!  !$!		stride		- array with hyperslab strides
+!  !$!		block		- array with hyperslab block sizes
+!  !$!
+!  !$! AUTHOR
+!  !$!	Elena Pourmal
+!  !$!		October 7, 2002
+!  !$!
+!  !$! HISTORY
+!  !$!
+!  !$!
+!  !$! NOTES
+!  !$! Commented out until 1.6 ? 10/08/2002
+!  !$!
+!  !$! SOURCE
+!  SUBROUTINE h5scombine_hyperslab_f(space_id, operator, start, count, &
+!  hyper_id,  hdferr, stride, block)
+!  IMPLICIT NONE
+!  INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier
+!  INTEGER, INTENT(IN) :: operator     ! Flag, valid values are:
+						!  H5S_SELECT_NOOP_F
+						!  H5S_SELECT_SET_F
+						!  H5S_SELECT_OR_F
+						!  H5S_SELECT_AND_F
+						!  H5S_SELECT_XOR_F
+						!  H5S_SELECT_NOTB_F
+						!  H5S_SELECT_NOTA_F
+						!  H5S_SELECT_APPEND_F
+						!  H5S_SELECT_PREPEND_F
+                                                !
+!  INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: start
+                                          ! Starting coordinates of the hyperslab
+!  INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: count
+                                          ! Number of blocks to select
+                                          ! from dataspace
+!  INTEGER(HID_T), INTENT(OUT) :: hyper_id ! New hyperslab identifier
+!  INTEGER, INTENT(OUT) :: hdferr     ! Error code
+!  INTEGER(HSIZE_T), DIMENSION(:), OPTIONAL, INTENT(IN) :: stride
+                                          ! Array of how many elements to move
+                                          ! in each direction
+!  INTEGER(HSIZE_T), DIMENSION(:), OPTIONAL, INTENT(IN) :: block
+                                          ! Sizes of element block
+!  INTEGER(HSIZE_T), DIMENSION(:), ALLOCATABLE :: def_block
+!  INTEGER(HSIZE_T), DIMENSION(:), ALLOCATABLE :: def_stride
+!  INTEGER :: rank
+!  INTEGER :: error1, error2
+
+!  INTERFACE
+!  INTEGER FUNCTION h5scombine_hyperslab_c(space_id, operator, &
+!  start, count, stride, block, hyper_id)
+!  USE H5GLOBAL
+!  !DEC$IF DEFINED(HDF5F90_WINDOWS)
+!  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SCOMBINE_HYPERSLAB_C'::h5scombine_hyperslab_c
+!  !DEC$ENDIF
+!  INTEGER(HID_T), INTENT(IN) :: space_id
+!  INTEGER, INTENT(IN) :: operator
+!  INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: start
+!  INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: count
+!  INTEGER(HSIZE_T), DIMENSION(*), OPTIONAL, INTENT(IN) :: stride
+!  INTEGER(HSIZE_T), DIMENSION(*), OPTIONAL, INTENT(IN) :: block
+!  INTEGER(HID_T), INTENT(OUT) :: hyper_id
+!  END FUNCTION h5scombine_hyperslab_c
+!  END INTERFACE
+
+!  if (present(stride).and. present(block)) then
+!  hdferr = h5scombine_hyperslab_c(space_id, operator, start, count, &
+!  stride, block, hyper_id)
+!  return
+!  endif
+            ! Case of optional parameters.
+            !
+            ! Find the rank of the dataspace to allocate memery for
+            ! default stride and block arrays.
+            !
+!  CALL h5sget_simple_extent_ndims_f(space_id, rank, hdferr)
+!  if( hdferr .EQ. -1) return
+            !
+!  if (present(stride).and. .not.present(block)) then
+!  allocate(def_block(rank), stat=error1)
+!  if (error1.NE.0) then
+!  hdferr = -1
+!  return
+!  endif
+!  def_block = 1
+!  hdferr = h5scombine_hyperslab_c(space_id, operator, start, count, &
+!  stride, def_block, hyper_id)
+!  deallocate(def_block)
+!  return
+!  endif
+
+!  if (.not.present(stride).and. present(block)) then
+!  allocate(def_stride(rank), stat=error2)
+!  if (error2.NE.0) then
+!  hdferr = -1
+!  return
+!  endif
+!  def_stride = 1
+!  hdferr = h5scombine_hyperslab_c(space_id, operator, start, count, &
+!  def_stride, block, hyper_id)
+!  deallocate(def_stride)
+!  return
+!  endif
+!  allocate(def_block(rank), stat=error1)
+!  allocate(def_stride(rank), stat=error2)
+!  if ((error1.NE.0) .OR. (error2.NE.0)) then
+!  hdferr = -1
+!  return
+!  endif
+!  def_block = 1
+!  def_stride = 1
+!  hdferr = h5scombine_hyperslab_c(space_id, operator, start, count, &
+!  def_stride, def_block, hyper_id)
+!  deallocate(def_block)
+!  deallocate(def_stride)
+
+!  END SUBROUTINE h5scombine_hyperslab_f
+
+!  !$!
+!  !$!****s* H5S/
+!  !$!
+!  !$! NAME
+!  !$!		h5scombine_select_f
+!  !$!
+!  !$! PURPOSE
+!  !$!	Combine two hyperslab selections with an operation
+!  !$!               and return a dataspace with resulting selection.
+!  !$!
+!  !$! INPUTS
+!  !$!		space1_id	- dataspace of selection to use
+!  !$!		operator	- flag, valid values are:
+!  !$!				  H5S_SELECT_NOOP_F
+!  !$!				  H5S_SELECT_SET_F
+!  !$!				  H5S_SELECT_OR_F
+!  !$!				  H5S_SELECT_AND_F
+!  !$!				  H5S_SELECT_XOR_F
+!  !$!				  H5S_SELECT_NOTB_F
+!  !$!				  H5S_SELECT_NOTA_F
+!  !$!				  H5S_SELECT_APPEND_F
+!  !$!				  H5S_SELECT_PREPEND_F
+!  !$!		space2_id	- dataspace of selection to use
+!  !$! OUTPUTS
+!  !$!               ds_id           - idataspace identifier with the new selection
+!  !$!		hdferr:		- error code
+!  !$!				 	Success:  0
+!  !$!				 	Failure: -1
+!  !$! OPTIONAL PARAMETERS		- NONE
+!  !$!
+!  !$! AUTHOR
+!  !$!	Elena Pourmal
+!  !$!		October 7, 2002
+!  !$!
+!  !$! HISTORY
+!  !$!
+!  !$!
+!  !$! NOTES commented out until 1.6 release(?) 10/08/2002
+!  !$!
+
+!  ! SOURCE
+!  !$          SUBROUTINE h5scombine_select_f(space1_id, operator, space2_id, &
+!  ds_id,  hdferr)
+!  IMPLICIT NONE
+!  INTEGER(HID_T), INTENT(IN) :: space1_id ! First dataspace identifier
+!  INTEGER(HID_T), INTENT(IN) :: space2_id ! Second dataspace identifier
+!  INTEGER, INTENT(IN) :: operator     ! Flag, valid values are:
+						!  H5S_SELECT_NOOP_F
+						!  H5S_SELECT_SET_F
+						!  H5S_SELECT_OR_F
+						!  H5S_SELECT_AND_F
+						!  H5S_SELECT_XOR_F
+						!  H5S_SELECT_NOTB_F
+						!  H5S_SELECT_NOTA_F
+						!  H5S_SELECT_APPEND_F
+						!  H5S_SELECT_PREPEND_F
+                                                !
+!  INTEGER(HID_T), INTENT(OUT) :: ds_id ! New dataspace identifier
+!  INTEGER, INTENT(OUT) :: hdferr     ! Error code
+!
+!  INTERFACE
+!  INTEGER FUNCTION h5scombine_select_c(space1_id, operator, &
+!  space2_id, ds_id)
+!  USE H5GLOBAL
+!  !DEC$IF DEFINED(HDF5F90_WINDOWS)
+!  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SCOMBINE_SELECT_C'::h5scombine_select_c
+!  !DEC$ENDIF
+!  INTEGER(HID_T), INTENT(IN) :: space1_id
+!  INTEGER(HID_T), INTENT(IN) :: space2_id
+!  INTEGER, INTENT(IN) :: operator
+!  INTEGER(HID_T), INTENT(OUT) :: ds_id
+!  END FUNCTION h5scombine_select_c
+!  END INTERFACE
+
+!  hdferr = h5scombine_select_c(space1_id, operator, space2_id, &
+!  ds_id)
+!  return
+
+!  END SUBROUTINE h5scombine_select_f
+
+!  !$!
+!  !$!****s* H5S/
+!  !$!
+!  !$! NAME
+!  !$!		h5sselect_select_f
+!  !$!
+!  !$! PURPOSE
+!  !$!	Refine a hyperslab selection with an operation
+!  !$!               using second hyperslab
+!  !$!
+!  !$! INPUTS
+!  !$!		space1_id	- dataspace of selection  to modify
+!  !$!		operator	- flag, valid values are:
+!  !$!				  H5S_SELECT_NOOP_F
+!  !$!				  H5S_SELECT_SET_F
+!  !$!				  H5S_SELECT_OR_F
+!  !$!				  H5S_SELECT_AND_F
+!  !$!				  H5S_SELECT_XOR_F
+!  !$!				  H5S_SELECT_NOTB_F
+!  !$!				  H5S_SELECT_NOTA_F
+!  !$!				  H5S_SELECT_APPEND_F
+!  !$!				  H5S_SELECT_PREPEND_F
+!  !$!		space2_id	- dataspace of selection to use
+!  !$!
+!  !$! OUTPUTS
+!  !$!		hdferr:		- error code
+!  !$!				 	Success:  0
+!  !$!				 	Failure: -1
+!  !$! OPTIONAL PARAMETERS		- NONE
+!  !$!
+!  !$! AUTHOR
+!  !$!	Elena Pourmal
+!  !$!		October 7, 2002
+!  !$!
+!  !$! HISTORY
+!  !$!
+!  !$!
+!  !$! NOTESCommented out until 1.6 release(?) 10/08/2002 EIP
+!  !$!
+
+!  ! SOURCE
+!  SUBROUTINE h5sselect_select_f(space1_id, operator, space2_id, &
+!  hdferr)
+!  IMPLICIT NONE
+!  INTEGER(HID_T), INTENT(INOUT) :: space1_id ! Dataspace identifier to
+                                                       ! modify
+!  INTEGER(HID_T), INTENT(IN) :: space2_id ! Second dataspace identifier
+!  INTEGER, INTENT(IN) :: operator     ! Flag, valid values are:
+						!  H5S_SELECT_NOOP_F
+						!  H5S_SELECT_SET_F
+						!  H5S_SELECT_OR_F
+						!  H5S_SELECT_AND_F
+						!  H5S_SELECT_XOR_F
+						!  H5S_SELECT_NOTB_F
+						!  H5S_SELECT_NOTA_F
+						!  H5S_SELECT_APPEND_F
+						!  H5S_SELECT_PREPEND_F
+                                                !
+!  INTEGER, INTENT(OUT) :: hdferr     ! Error code
+
+!  INTERFACE
+!  INTEGER FUNCTION h5sselect_select_c(space1_id, operator, &
+!  space2_id)
+!  USE H5GLOBAL
+!  !DEC$IF DEFINED(HDF5F90_WINDOWS)
+!  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SSELECT_SELECT_C'::h5sselect_select_c
+!  !DEC$ENDIF
+!  INTEGER(HID_T), INTENT(INOUT) :: space1_id
+!  INTEGER(HID_T), INTENT(IN) :: space2_id
+!  INTEGER, INTENT(IN) :: operator
+!  END FUNCTION h5sselect_select_c
+!  END INTERFACE
+
+!  hdferr = h5sselect_select_c(space1_id, operator, space2_id)
+!  return
+
+!  END SUBROUTINE h5sselect_select_f
+
+!
+!****s* H5S/h5sget_select_type_f
+!
+! NAME
+!  h5sget_select_type_f
+!
+! PURPOSE
+!  Retrieve the type of selection
+!
+! INPUTS
+!  space_id  - dataspace identifier with selection
+! OUTPUTS
+!  type      - selection type flag, valid values are:
+!                    H5S_SEL_ERROR_F
+!                    H5S_SEL_NONE_F
+!                    H5S_SEL_POINTS_F
+!                    H5S_SEL_HYPERSLABS_F
+!                    H5S_SEL_ALL_F
+!  hdferr    - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  October 7, 2002
+!
+! SOURCE
+  SUBROUTINE h5sget_select_type_f(space_id, TYPE, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(INOUT) :: space_id
+    INTEGER, INTENT(OUT) :: TYPE
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5sget_select_type_c(space_id, TYPE) BIND(C,NAME='h5sget_select_type_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space_id
+         INTEGER, INTENT(OUT) :: TYPE
+       END FUNCTION h5sget_select_type_c
+    END INTERFACE
+    
+    hdferr = h5sget_select_type_c(space_id, TYPE)
+    RETURN
+    
+  END SUBROUTINE h5sget_select_type_f
+
+!
+!****s* H5S/H5Sdecode_f
+!
+! NAME
+!  H5Sdecode_f
+!
+! PURPOSE
+!  Decode a binary object description of data space and return a new object handle.
+!
+! INPUTS
+!  buf 	  -  Buffer for the data space object to be decoded.
+!  obj_id - Object ID
+! OUTPUTS
+!  hdferr - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 26, 2008
+! SOURCE
+  SUBROUTINE h5sdecode_f(buf, obj_id, hdferr)
+    IMPLICIT NONE
+    CHARACTER(LEN=*), INTENT(IN) :: buf
+    INTEGER(HID_T), INTENT(OUT) :: obj_id
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5sdecode_c(buf, obj_id) BIND(C,NAME='h5sdecode_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: buf
+         INTEGER(HID_T), INTENT(OUT) :: obj_id  ! Object ID
+       END FUNCTION h5sdecode_c
+    END INTERFACE
+
+    hdferr = h5sdecode_c(buf, obj_id)
+
+  END SUBROUTINE h5sdecode_f
+
+!
+!****s* H5S/H5Sencode_f
+!
+! NAME
+!  H5Sencode_f
+!
+! PURPOSE
+!  Encode a data space object description into a binary buffer.
+!
+! INPUTS
+!  obj_id - Identifier of the object to be encoded.
+!  buf 	  - Buffer for the object to be encoded into.
+!  nalloc - The size of the allocated buffer.
+! OUTPUTS
+!  nalloc - The size of the buffer needed.
+!  hdferr - Returns 0 if successful and -1 if fails.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  March 26, 2008
+! SOURCE
+  SUBROUTINE h5sencode_f(obj_id, buf, nalloc, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: obj_id
+    CHARACTER(LEN=*), INTENT(OUT) :: buf
+    INTEGER(SIZE_T), INTENT(INOUT) :: nalloc
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5sencode_c(buf, obj_id, nalloc) BIND(C,NAME='h5sencode_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         INTEGER(HID_T), INTENT(IN) :: obj_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: buf
+         INTEGER(SIZE_T), INTENT(INOUT) :: nalloc
+       END FUNCTION h5sencode_c
+    END INTERFACE
+
+    hdferr = h5sencode_c(buf, obj_id, nalloc)
+
+  END SUBROUTINE h5sencode_f
+
+!****s* H5S/h5sextent_equal_f
+!
+! NAME
+!  h5sextent_equal_f
+!
+! PURPOSE
+!  Determines whether two dataspace extents are equal.
+!
+! INPUTS
+!  space1_id - First dataspace identifier.
+!  space2_id - Second dataspace identifier.
+! OUTPUTS
+!  Equal     - .TRUE. if equal, .FALSE. if unequal.
+!  hdferr    - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  M. Scot Breitenfeld
+!  April 2, 2008
+!
+! SOURCE
+  SUBROUTINE h5sextent_equal_f(space1_id, space2_id, equal, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: space1_id
+    INTEGER(HID_T), INTENT(IN) :: space2_id
+    LOGICAL, INTENT(OUT) :: Equal
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTEGER(HID_T) :: c_equal
+
+    INTERFACE
+       INTEGER FUNCTION h5sextent_equal_c(space1_id, space2_id, c_equal) BIND(C,NAME='h5sextent_equal_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: space1_id
+         INTEGER(HID_T), INTENT(IN) :: space2_id
+         INTEGER(HID_T) :: c_equal
+       END FUNCTION h5sextent_equal_c
+    END INTERFACE
+
+    hdferr = h5sextent_equal_c(space1_id, space2_id, c_equal)
+    equal = .FALSE.
+    IF(c_equal.GT.0) equal = .TRUE.
+
+  END SUBROUTINE h5sextent_equal_f
+
+END MODULE H5S
diff --git a/fortran/src/H5Sff.f90 b/fortran/src/H5Sff.f90
deleted file mode 100644
index c493d46..0000000
--- a/fortran/src/H5Sff.f90
+++ /dev/null
@@ -1,1875 +0,0 @@
-!****h* ROBODoc/H5S
-!
-! NAME
-!  MODULE H5S
-!
-! FILE
-!  fortran/src/H5Sff.f90
-!
-! PURPOSE
-!  This file contains Fortran interfaces for H5S functions. It includes
-!  all the functions that are independent on whether the Fortran 2003 functions
-!  are enabled or disabled.
-!
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5S function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5S
-  USE H5GLOBAL
-
-CONTAINS
-
-!
-!****s* H5S/h5screate_simple_f
-!
-! NAME
-!  h5screate_simple_f
-!
-! PURPOSE 	
-!  Creates a new simple data space and opens it for access	.
-!
-! INPUTS
-!  rank        - number of dimensions
-!  dims        - an array of the size of each dimension
-! OUTPUTS
-!  space_id    - dataspace identifier
-!  hdferr      - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  maxdims     - an array of the maximum size of each dimension
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-! SOURCE
-          SUBROUTINE h5screate_simple_f(rank, dims, space_id, hdferr, maxdims)
-
-            IMPLICIT NONE
-            INTEGER, INTENT(IN) :: rank             ! Number of dataspace dimensions
-            INTEGER(HSIZE_T), INTENT(IN) :: dims(rank)
-                                                    ! Array with the dimension
-                                                    ! sizes
-            INTEGER(HID_T), INTENT(OUT) :: space_id ! Dataspace identifier
-            INTEGER, INTENT(OUT) :: hdferr          ! Error code
-            INTEGER(HSIZE_T), OPTIONAL, INTENT(IN) :: maxdims(rank)
-                                                    ! Array with the maximum
-                                                    ! dimension sizes
-!*****
-            INTEGER(HSIZE_T), ALLOCATABLE, DIMENSION(:) :: f_maxdims
-
-            INTERFACE
-              INTEGER FUNCTION h5screate_simple_c(rank, dims, maxdims, space_id)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SCREATE_SIMPLE_C'::h5screate_simple_c
-              !DEC$ENDIF
-              INTEGER, INTENT(IN) :: rank
-              INTEGER(HSIZE_T), INTENT(IN) :: dims(rank)
-              INTEGER(HSIZE_T), DIMENSION(:),INTENT(IN) :: maxdims(rank)
-              INTEGER(HID_T), INTENT(OUT) :: space_id
-              END FUNCTION h5screate_simple_c
-            END INTERFACE
-
-            allocate (f_maxdims(rank), stat=hdferr)
-            if (hdferr .NE. 0) then
-                hdferr = -1
-                return
-            endif
-            if (present(maxdims)) then
-                f_maxdims = maxdims
-            else
-                f_maxdims = dims
-            endif
-            hdferr = h5screate_simple_c(rank, dims, f_maxdims, space_id)
-            deallocate(f_maxdims)
-
-          END SUBROUTINE h5screate_simple_f
-
-!
-!****s* H5S/h5sclose_f
-!
-! NAME
-!  h5sclose_f
-!
-! PURPOSE
-!  Releases and terminates access to a dataspace.
-!
-! INPUTS
-!  space_id    - identifier of dataspace to release
-! OUTPUTS
-!  hdferr      - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-!
-! SOURCE
-          SUBROUTINE h5sclose_f(space_id, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier
-            INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5sclose_c(space_id)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SCLOSE_C'::h5sclose_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              END FUNCTION h5sclose_c
-            END INTERFACE
-
-            hdferr = h5sclose_c(space_id)
-
-          END SUBROUTINE h5sclose_f
-
-!
-!****s* H5S/h5screate_f
-!
-! NAME
-!  h5screate_f
-!
-! PURPOSE
-!  Creates a new dataspace of a specified type.
-!
-! INPUTS
-!  classtype   - the type of the dataspace to be created
-! OUTPUTS
-!  space_id    - dataspace identifier
-!  hdferr      - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-!
-! NOTES
-!
-
-! SOURCE
-          SUBROUTINE h5screate_f(classtype, space_id, hdferr)
-            IMPLICIT NONE
-            INTEGER, INTENT(IN) :: classtype     ! The type of the dataspace
-                                                 ! to be created.
-                                                 ! Possible values are:
-                                                 !  H5S_SCALAR_F (0)
-                                                 !  H5S_SIMPLE_F(1)
-                                                 !  H5S_NULL_F(2)
-            INTEGER(HID_T), INTENT(OUT) :: space_id ! Dataspace identifier
-            INTEGER, INTENT(OUT) :: hdferr          ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5screate_c(classtype, space_id)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SCREATE_C'::h5screate_c
-              !DEC$ENDIF
-              INTEGER, INTENT(IN) :: classtype
-              INTEGER(HID_T), INTENT(OUT) :: space_id
-              END FUNCTION h5screate_c
-            END INTERFACE
-
-            hdferr = h5screate_c(classtype, space_id)
-
-          END SUBROUTINE h5screate_f
-
-!
-!****s* H5S/h5scopy_f
-!
-! NAME
-!  h5scopy_f
-!
-! PURPOSE
-!  Creates an exact copy of a dataspace.
-!
-! INPUTS
-!  space_id 	 - dataspace identifier
-! OUTPUTS
-!  new_space_id  - identifier of dataspace's copy
-!  hdferr        - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-!
-! NOTES
-!
-
-! SOURCE
-          SUBROUTINE h5scopy_f(space_id, new_space_id, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier
-            INTEGER(HID_T), INTENT(OUT) :: new_space_id
-                                             ! Identifier of dataspace's copy
-            INTEGER, INTENT(OUT) :: hdferr   ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5scopy_c(space_id, new_space_id)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SCOPY_C'::h5scopy_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              INTEGER(HID_T), INTENT(OUT):: new_space_id
-              END FUNCTION h5scopy_c
-            END INTERFACE
-
-            hdferr = h5scopy_c(space_id, new_space_id)
-
-          END SUBROUTINE h5scopy_f
-
-!
-!****s* H5S/h5sget_select_hyper_nblocks_f
-!
-! NAME
-!  h5sget_select_hyper_nblocks_f
-!
-! PURPOSE
-!  Get number of hyperslab blocks.
-!
-! INPUTS
-!  space_id    - dataspace identifier
-! OUTPUTS
-!  num_blocks  - number of hyperslab blocks in the current
-!                hyperslab selection
-!  hdferr      - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-!
-! SOURCE
-          SUBROUTINE h5sget_select_hyper_nblocks_f(space_id, num_blocks, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier
-            INTEGER(HSSIZE_T), INTENT(OUT) :: num_blocks
-                                             !number of hyperslab blocks
-                                             !in the current dataspace
-                                             !selection
-            INTEGER, INTENT(OUT) :: hdferr   ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5sget_select_hyper_nblocks_c (space_id, num_blocks)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-!  DEC$ ATTRIBUTES C,reference,decorate,alias:'H5SGET_SELECT_HYPER_NBLOCKS_C'::h5sget_select_hyper_nblocks_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              INTEGER(HSSIZE_T), INTENT(OUT) :: num_blocks
-              END FUNCTION h5sget_select_hyper_nblocks_c
-            END INTERFACE
-
-            hdferr =  h5sget_select_hyper_nblocks_c (space_id, num_blocks)
-
-          END SUBROUTINE h5sget_select_hyper_nblocks_f
-
-!
-!****s* H5S/h5sget_select_hyper_blocklist_f
-!
-! NAME
-!  h5sget_select_hyper_blocklist_f
-!
-! PURPOSE
-!  Gets the list of hyperslab blocks currently selected.
-!
-! INPUTS
-!  space_id    - dataspace identifier
-!  startblock  - hyperslab block to start with
-!  num_blocks  - number of blocks to get
-! OUTPUTS
-!  buf 	       - buffer to hold block list
-!  hdferr      - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-! SOURCE
-          SUBROUTINE h5sget_select_hyper_blocklist_f(space_id, startblock, &
-                                                    num_blocks, buf, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier
-            INTEGER(HSIZE_T), INTENT(IN) :: startblock
-                                             !Hyperslab block to start with.
-            INTEGER(HSIZE_T), INTENT(IN) :: num_blocks
-                                             !number of hyperslab blocks
-                                             !to get in the current dataspace
-                                             !selection
-            INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: buf
-                                             !List of hyperslab blocks selected
-            INTEGER, INTENT(OUT) :: hdferr   ! Error code
-!*****
-
-            INTERFACE
-              INTEGER FUNCTION h5sget_select_hyper_blocklist_c(space_id, startblock, &
-                                                              num_blocks, buf )
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-            !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SGET_SELECT_HYPER_BLOCKLIST_C'::h5sget_select_hyper_blocklist_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              INTEGER(HSIZE_T), INTENT(IN) :: startblock
-              INTEGER(HSIZE_T), INTENT(IN) :: num_blocks
-              INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: buf
-              END FUNCTION h5sget_select_hyper_blocklist_c
-            END INTERFACE
-
-
-            hdferr =  h5sget_select_hyper_blocklist_c(space_id, startblock, &
-                                                       num_blocks, buf )
-
-          END SUBROUTINE h5sget_select_hyper_blocklist_f
-
-!
-!****s* H5S/h5sget_select_bounds_f
-!
-! NAME
-!  h5sget_select_bounds_f
-!
-! PURPOSE
-!  Gets the bounding box containing the current selection.
-!
-! INPUTS
-!  space_id    - dataspace identifier
-!
-! OUTPUTS
-!  start       - starting coordinates of bounding box
-!  end 	       - ending coordinates of bounding box
-!  hdferr      - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  NONE
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-! SOURCE
-  SUBROUTINE  h5sget_select_bounds_f(space_id, start, END, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier
-    INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: start
-                                           ! Starting coordinates of the bounding box.
-    INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: END
-                                           !Ending coordinates of the bounding box,
-                                           !i.e., the coordinates of the diagonally
-                                           !opposite corner
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5sget_select_bounds_c(space_id, start, END)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SGET_SELECT_BOUNDS_C'::h5sget_select_bounds_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: space_id
-         INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: start
-         INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: END
-       END FUNCTION h5sget_select_bounds_c
-    END INTERFACE
-
-    hdferr =   h5sget_select_bounds_c(space_id, start, END)
-
-  END SUBROUTINE h5sget_select_bounds_f
-
-!
-!****s* H5S/h5sget_select_elem_npoints_f
-!
-! NAME
-!  h5sget_select_elem_npoints_f
-!
-! PURPOSE
-!  Gets the number of element points in the current selection
-!
-! INPUTS
-!  space_id 	 - dataspace identifier
-! OUTPUTS
-!  num_points 	 - number of element points in the current
-!                  dataspace selection
-!  hdferr        - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-!
-! SOURCE
-          SUBROUTINE h5sget_select_elem_npoints_f(space_id, num_points, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier
-            INTEGER(HSSIZE_T), INTENT(OUT) :: num_points
-                                             !number of element points
-                                             !in the current dataspace
-                                             !selection
-            INTEGER, INTENT(OUT) :: hdferr   ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5sget_select_elem_npoints_c (space_id, num_points)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-!  DEC$ ATTRIBUTES C,reference,decorate,alias:'H5SGET_SELECT_ELEM_NPOINTS_C'::h5sget_select_elem_npoints_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              INTEGER(HSSIZE_T), INTENT(OUT) :: num_points
-              END FUNCTION h5sget_select_elem_npoints_c
-            END INTERFACE
-
-            hdferr =  h5sget_select_elem_npoints_c (space_id, num_points)
-
-          END SUBROUTINE h5sget_select_elem_npoints_f
-
-!
-!****s* H5S/h5sget_select_elem_pointlist_f
-!
-! NAME
-!  h5sget_select_elem_pointlist_f
-!
-! PURPOSE
-!  Gets the list of element points currently selected.
-!
-! INPUTS
-!  space_id    - dataspace identifier
-!  startpoint  - element point to start with
-!  num_points  - number of elemnt points to get
-! OUTPUTS
-!  buf 	       - buffer with element points selected
-!  hdferr      - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-!
-! SOURCE
-          SUBROUTINE h5sget_select_elem_pointlist_f(space_id, startpoint, &
-                                                    num_points, buf, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier
-            INTEGER(HSIZE_T), INTENT(IN) :: startpoint
-                                             !Element point to start with.
-            INTEGER(HSIZE_T), INTENT(IN) :: num_points
-                                             !Number of element points to get
-            INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: buf
-                                             !List of element points selected
-            INTEGER, INTENT(OUT) :: hdferr   ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5sget_select_elem_pointlist_c(space_id, startpoint, &
-                                                              num_points, buf )
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-!  DEC$ ATTRIBUTES C,reference,decorate,alias:'H5SGET_SELECT_ELEM_POINTLIST_C'::h5sget_select_elem_pointlist_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              INTEGER(HSIZE_T), INTENT(IN) :: startpoint
-              INTEGER(HSIZE_T), INTENT(IN) :: num_points
-              INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: buf
-              END FUNCTION h5sget_select_elem_pointlist_c
-            END INTERFACE
-
-            hdferr =  h5sget_select_elem_pointlist_c(space_id, startpoint, &
-                                                       num_points, buf )
-
-          END SUBROUTINE h5sget_select_elem_pointlist_f
-
-!
-!****s* H5S/h5sselect_elements_f
-!
-! NAME
-!  h5sselect_elements_f
-!
-! PURPOSE
-!  Selects elements to be included in the selection for
-!  a dataspace
-!
-! INPUTS
-!  space_id 	 - dataspace identifier
-!  operator 	 - flag, valid values are:
-!                   H5S_SELECT_SET_F 
-!                   H5S_SELECT_APPEND_F 
-!                   H5S_SELECT_PREPEND_F
-!  rank 	 - number of dataspace dimensions
-!  num_elements  - number of elements to be selected
-!  coord 	 - 2D (rank x num_elements) array with the
-!                  elements coordinates ( 1-based); in C the
-!                  array is stored in 2D as (num_element x rank)
-! OUTPUTS
-!  hdferr        - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-! SOURCE
-  SUBROUTINE h5sselect_elements_f(space_id, OPERATOR, rank, &
-       num_elements, coord, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T),   INTENT(IN)                                :: space_id
-    INTEGER,          INTENT(IN)                                :: OPERATOR
-    INTEGER,          INTENT(IN)                                :: rank
-    INTEGER(SIZE_T),  INTENT(IN)                                :: num_elements
-    INTEGER(HSIZE_T), INTENT(IN) , DIMENSION(rank,num_elements) :: coord
-    INTEGER,          INTENT(OUT)                               :: hdferr 
-!*****
-    INTEGER(HSIZE_T), ALLOCATABLE, DIMENSION(:,:) :: c_coord
-    INTEGER :: error, i
-
-    INTERFACE
-       INTEGER FUNCTION h5sselect_elements_c(space_id, OPERATOR,&
-            num_elements,c_c_coord)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SSELECT_ELEMENTS_C'::h5sselect_elements_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: space_id
-         INTEGER, INTENT(IN) :: OPERATOR
-         INTEGER(SIZE_T), INTENT(IN) :: num_elements
-         INTEGER(HSIZE_T),DIMENSION(*) :: c_c_coord
-       END FUNCTION h5sselect_elements_c
-    END INTERFACE
-
-    ALLOCATE(c_coord(rank,num_elements), STAT = error)
-    IF (error.NE. 0) THEN
-       hdferr = -1
-       RETURN
-    ENDIF
-    DO i = 1, rank
-       c_coord(i,:) = coord(rank-i+1, :) - 1
-    ENDDO
-    hdferr = h5sselect_elements_c(space_id, OPERATOR, num_elements, c_coord)
-
-!  ALLOCATE(c_coord(num_elements,rank), stat = error)
-!  IF (error.NE. 0) THEN
-!  hdferr = -1
-!  RETURN
-!  ENDIF
-!
-!  c_coord = TRANSPOSE(coord)
-!  hdferr = h5sselect_elements_c(space_id, OPERATOR, INT(rank,size_t), c_coord)
-
-
-    DEALLOCATE(c_coord)
-
-  END SUBROUTINE h5sselect_elements_f
-
-!
-!****s* H5S/h5sselect_all_f
-!
-! NAME
-!  h5sselect_all_f
-!
-! PURPOSE
-!  Selects the entire dataspace.
-!
-! INPUTS
-!  space_id    - Identifier for the dataspace in which
-!                selection being made
-! OUTPUTS
-!  hdferr      - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-!
-! SOURCE
-          SUBROUTINE h5sselect_all_f(space_id, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: space_id  ! Dataspace identifier
-            INTEGER, INTENT(OUT) :: hdferr          ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5sselect_all_c(space_id)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SSELECT_ALL_C'::h5sselect_all_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              END FUNCTION h5sselect_all_c
-            END INTERFACE
-
-            hdferr = h5sselect_all_c(space_id)
-
-          END SUBROUTINE h5sselect_all_f
-
-!
-!****s* H5S/h5sselect_none_f
-!
-! NAME
-!  h5sselect_none_f
-!
-! PURPOSE
-!  Resets the selection region to include no elements.
-!
-! INPUTS
-!  space_id    - the identifier for the dataspace in which
-!                the selection is being reset.
-! OUTPUTS
-!  hdferr      - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-!
-! SOURCE
-          SUBROUTINE h5sselect_none_f(space_id, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: space_id  ! Dataspace identifier
-            INTEGER, INTENT(OUT) :: hdferr          ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5sselect_none_c(space_id)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SSELECT_NONE_C'::h5sselect_none_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              END FUNCTION h5sselect_none_c
-            END INTERFACE
-
-            hdferr = h5sselect_none_c(space_id)
-
-          END SUBROUTINE h5sselect_none_f
-
-!
-!****s* H5S/h5sselect_valid_f
-!
-! NAME
-!  h5sselect_valid_f
-!
-! PURPOSE
-!  Verifies that the selection is within the extent of
-!  the dataspace.
-!
-! INPUTS
-!  space_id 	 - identifier for the dataspace for which
-!  selection is verified
-! OUTPUTS
-!  hdferr      - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-!
-! SOURCE
-          SUBROUTINE h5sselect_valid_f(space_id, status, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: space_id  ! Dataspace identifier
-            LOGICAL, INTENT(OUT) :: status          ! TRUE if the selection is
-                                                    ! contained within the extent,
-                                                    ! FALSE otherwise.
-            INTEGER, INTENT(OUT) :: hdferr          ! Error code
-!*****
-            INTEGER :: flag ! "TRUE/FALSE/ERROR" flag from C routine
-
-            INTERFACE
-              INTEGER FUNCTION h5sselect_valid_c(space_id, flag)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SSELECT_VALID_C'::h5sselect_valid_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              INTEGER :: flag
-              END FUNCTION h5sselect_valid_c
-            END INTERFACE
-
-            hdferr = h5sselect_valid_c(space_id, flag)
-            status = .TRUE.
-            if (flag .EQ. 0) status = .FALSE.
-
-          END SUBROUTINE h5sselect_valid_f
-
-!
-!****s* H5S/h5sget_simple_extent_npoints_f
-!
-! NAME
-!  h5sget_simple_extent_npoints_f
-!
-! PURPOSE
-!  Determines the number of elements in a dataspace.
-!
-! INPUTS
-!  space_id 	 - dataspace identifier
-! OUTPUTS
-!  npoints 	 - number of elements in the dataspace
-!  hdferr      - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-!
-! SOURCE
-          SUBROUTINE h5sget_simple_extent_npoints_f(space_id, npoints, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: space_id     ! Dataspace identifier
-            INTEGER(HSIZE_T), INTENT(OUT) :: npoints  ! Number of elements in
-                                                       ! dataspace
-            INTEGER, INTENT(OUT) :: hdferr             ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5sget_simple_extent_npoints_c( space_id, npoints)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SGET_SIMPLE_EXTENT_NPOINTS_C'::h5sget_simple_extent_npoints_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              INTEGER(HSIZE_T), INTENT(OUT) :: npoints
-              END FUNCTION h5sget_simple_extent_npoints_c
-            END INTERFACE
-
-            hdferr = h5sget_simple_extent_npoints_c( space_id, npoints)
-
-          END SUBROUTINE h5sget_simple_extent_npoints_f
-
-!
-!****s* H5S/h5sget_select_npoints_f
-!
-! NAME
-!  h5sget_select_npoints_f
-!
-! PURPOSE
-!  Determines the number of elements in a dataspace selection.
-!
-! INPUTS
-!  space_id 	 - dataspace identifier
-! OUTPUTS
-!  npoints 	 - number of points in the dataspace selection
-!  hdferr      - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-! SOURCE
-          SUBROUTINE h5sget_select_npoints_f(space_id, npoints, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: space_id     ! Dataspace identifier
-            INTEGER(HSSIZE_T), INTENT(OUT) :: npoints  ! Number of elements in the
-                                                       ! selection
-            INTEGER, INTENT(OUT) :: hdferr             ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5sget_select_npoints_c(space_id, npoints)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SGET_SELECT_NPOINTS_C'::h5sget_select_npoints_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              INTEGER(HSSIZE_T), INTENT(OUT) :: npoints
-              END FUNCTION h5sget_select_npoints_c
-            END INTERFACE
-
-            hdferr = h5sget_select_npoints_c(space_id, npoints)
-
-          END SUBROUTINE h5sget_select_npoints_f
-
-!
-!****s* H5S/h5sget_simple_extent_ndims_f
-!
-! NAME
-!  h5sget_simple_extent_ndims_f
-!
-! PURPOSE
-!  Determines the dimensionality of a dataspace
-!
-! INPUTS
-!  space_id 	 - dataspace identifier
-! OUTPUTS
-!  rank 	 - number of dataspace dimensions
-!  hdferr      - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-!
-! SOURCE
-          SUBROUTINE h5sget_simple_extent_ndims_f(space_id, rank, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: space_id     ! Dataspace identifier
-            INTEGER, INTENT(OUT) :: rank               ! Number of dimensions
-            INTEGER, INTENT(OUT) :: hdferr             ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5sget_simple_extent_ndims_c(space_id, rank)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SGET_SIMPLE_EXTENT_NDIMS_C'::h5sget_simple_extent_ndims_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              INTEGER, INTENT(OUT) :: rank
-              END FUNCTION h5sget_simple_extent_ndims_c
-            END INTERFACE
-
-            hdferr = h5sget_simple_extent_ndims_c(space_id, rank)
-
-          END SUBROUTINE h5sget_simple_extent_ndims_f
-!
-!****s* H5S/h5sget_simple_extent_dims_f
-!
-! NAME
-!  h5sget_simple_extent_dims_f
-!
-! PURPOSE
-!  Retrieves dataspace dimension size and maximum size.
-!
-! INPUTS
-!  space_id 	 - dataspace identifier
-! OUTPUTS
-!  dims 	 - array to store size of each dimension
-!  maxdims 	 - array to store maximum size of each
-!  dimension
-!  hdferr      - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-!
-! SOURCE
-          SUBROUTINE h5sget_simple_extent_dims_f(space_id, dims, maxdims, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier
-            INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: dims
-                                                   ! Array to store dimension sizes
-            INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: maxdims
-                                                   ! Array to store max dimension
-                                                   ! sizes
-            INTEGER, INTENT(OUT) :: hdferr         ! Error code: -1 on failure,
-                                                   ! number of dimensions on
-                                                   ! on success
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5sget_simple_extent_dims_c(space_id, dims, maxdims)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SGET_SIMPLE_EXTENT_DIMS_C'::h5sget_simple_extent_dims_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: dims
-              INTEGER(HSIZE_T), DIMENSION(*), INTENT(OUT) :: maxdims
-              END FUNCTION h5sget_simple_extent_dims_c
-            END INTERFACE
-
-            hdferr = h5sget_simple_extent_dims_c(space_id, dims, maxdims)
-
-          END SUBROUTINE h5sget_simple_extent_dims_f
-
-!
-!****s* H5S/h5sget_simple_extent_type_f
-!
-! NAME
-!  h5sget_simple_extent_type_f
-!
-! PURPOSE
-!  Determine the current class of a dataspace
-!
-! INPUTS
-!  space_id 	 - dataspace identifier
-! OUTPUTS
-!  classtype 	 - class type, possible values are:
-!  H5S_NO_CLASS_F (-1)
-!  H5S_SCALAR_F (0)
-!  H5S_SIMPLE_F (1)
-!  H5S_NULL_F   (2)
-!  hdferr      - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-!
-! SOURCE
-          SUBROUTINE h5sget_simple_extent_type_f(space_id, classtype, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier
-            INTEGER, INTENT(OUT) :: classtype      ! Class type , possible values
-                                                   ! are:
-                                                   !  H5S_NO_CLASS_F (-1)
-                                                   !  H5S_SCALAR_F (0)
-                                                   !  H5S_SIMPLE_F (1)
-                                                   !  H5S_NULL_F   (2)
-            INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5sget_simple_extent_type_c(space_id, classtype)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SGET_SIMPLE_EXTENT_TYPE_C'::h5sget_simple_extent_type_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              INTEGER, INTENT(OUT) :: classtype
-              END FUNCTION h5sget_simple_extent_type_c
-            END INTERFACE
-
-            hdferr = h5sget_simple_extent_type_c(space_id, classtype)
-
-          END SUBROUTINE h5sget_simple_extent_type_f
-!
-!****s* H5S/h5sset_extent_simple_f
-!
-! NAME
-!  h5sset_extent_simple_f
-!
-! PURPOSE
-!  Sets or resets the size of an existing dataspace.
-!
-! INPUTS
-!  space_id 	 - dataspace identifier
-!  rank 	 - dataspace number of dimensions
-!  current_size 	 - array with the new sizes of dimensions
-!  maximum_size 	 - array with the new maximum sizes of
-!  dimensions
-! OUTPUTS
-!  hdferr      - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-!
-! SOURCE
-          SUBROUTINE h5sset_extent_simple_f(space_id, rank, current_size, &
-                                            maximum_size, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier
-            INTEGER, INTENT(IN) :: rank            ! Dataspace rank
-            INTEGER(HSIZE_T), DIMENSION(rank), INTENT(IN) :: current_size
-                                                   ! Array with the new sizes
-                                                   ! of dimensions
-            INTEGER(HSIZE_T), DIMENSION(rank), INTENT(IN) :: maximum_size
-                                                   ! Array with the new maximum
-                                                   ! sizes of dimensions
-                                                   ! sizes
-            INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5sset_extent_simple_c(space_id, rank, &
-                               current_size,  maximum_size)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SSET_EXTENT_SIMPLE_C'::h5sset_extent_simple_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              INTEGER, INTENT(IN) :: rank
-              INTEGER(HSIZE_T), DIMENSION(rank), INTENT(IN) :: current_size
-              INTEGER(HSIZE_T), DIMENSION(rank), INTENT(IN) :: maximum_size
-              END FUNCTION h5sset_extent_simple_c
-            END INTERFACE
-
-            hdferr = h5sset_extent_simple_c(space_id, rank, current_size, &
-                                            maximum_size)
-
-          END SUBROUTINE h5sset_extent_simple_f
-!
-!****s* H5S/h5sis_simple_f
-!
-! NAME
-!  h5sis_simple_f
-!
-! PURPOSE
-!  Determines whether a dataspace is a simple dataspace.
-!
-! INPUTS
-!  space_id 	 - dataspace identifier
-! OUTPUTS
-!  status 	 - flag to indicate if dataspace
-!  is simple or not
-!  hdferr      - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-!
-! SOURCE
-          SUBROUTINE h5sis_simple_f(space_id, status, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: space_id  ! Dataspace identifier
-            LOGICAL, INTENT(OUT) :: status      ! Flag, idicates if dataspace
-                                                ! is simple or not ( TRUE or
-                                                ! FALSE)
-            INTEGER, INTENT(OUT) :: hdferr      ! Error code
-!*****
-            INTEGER :: flag                     ! "TRUE/FALSE/ERROR from C"
-
-            INTERFACE
-              INTEGER FUNCTION h5sis_simple_c(space_id, flag)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SIS_SIMPLE_C'::h5sis_simple_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              INTEGER :: flag
-              END FUNCTION h5sis_simple_c
-            END INTERFACE
-
-            hdferr = h5sis_simple_c(space_id, flag)
-            status = .TRUE.
-            if (flag .EQ. 0) status = .FALSE.
-
-          END SUBROUTINE h5sis_simple_f
-
-!
-!****s* H5S/h5soffset_simple_f
-!
-! NAME
-!  h5soffset_simple_f
-!
-! PURPOSE
-!  Sets the offset of a simple dataspace.
-!
-! INPUTS
-!  space_id 	 - dataspace identifier
-!  offset 	 - the offset at which to position the
-!  selection
-! OUTPUTS
-!  hdferr      - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  NONE
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-!
-! SOURCE
-          SUBROUTINE h5soffset_simple_f(space_id, offset, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier
-            INTEGER(HSSIZE_T), DIMENSION(*), INTENT(IN) ::  offset
-                                                   ! The offset at which to position
-                                                   ! the selection
-            INTEGER, INTENT(OUT) :: hdferr         ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5soffset_simple_c(space_id, offset)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SOFFSET_SIMPLE_C'::h5soffset_simple_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              INTEGER(HSSIZE_T), DIMENSION(*), INTENT(IN) ::  offset
-              END FUNCTION h5soffset_simple_c
-            END INTERFACE
-
-            hdferr = h5soffset_simple_c(space_id, offset)
-
-          END SUBROUTINE h5soffset_simple_f
-
-!
-!****s* H5S/h5sextent_copy_f
-!
-! NAME
-!  h5sextent_copy_f
-!
-! PURPOSE
-!  Copies the extent of a dataspace.
-!
-! INPUTS
-!  dest_space_id 	 - the identifier for the dataspace to which
-!  the extent is copied
-!  source_space_id 	 - the identifier for the dataspace from
-!  which the extent is copied
-! OUTPUTS
-!  hdferr      - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  NONE
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-!
-! NOTES
-!
-
-! SOURCE
-          SUBROUTINE h5sextent_copy_f(dest_space_id, source_space_id, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: dest_space_id  ! Identifier of destination
-                                                         ! dataspace
-            INTEGER(HID_T), INTENT(IN) :: source_space_id ! Identifier of source
-                                                          ! dataspace
-            INTEGER, INTENT(OUT) :: hdferr                ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5sextent_copy_c(dest_space_id, source_space_id)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SEXTENT_COPY_C'::h5sextent_copy_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: dest_space_id
-              INTEGER(HID_T), INTENT(IN) :: source_space_id
-              END FUNCTION h5sextent_copy_c
-            END INTERFACE
-
-            hdferr = h5sextent_copy_c(dest_space_id, source_space_id)
-
-          END SUBROUTINE h5sextent_copy_f
-
-!
-!****s* H5S/h5sset_extent_none_f
-!
-! NAME
-!  h5sset_extent_none_f
-!
-! PURPOSE
-!  Removes the extent from a dataspace.
-!
-! INPUTS
-!  space_id 	 - dataspace identifier
-! OUTPUTS
-!  hdferr      - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-!
-! SOURCE
-          SUBROUTINE h5sset_extent_none_f(space_id, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: space_id  ! Dataspace identifier
-            INTEGER, INTENT(OUT) :: hdferr          ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5sset_extent_none_c(space_id)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SSET_EXTENT_NONE_C'::h5sset_extent_none_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              END FUNCTION h5sset_extent_none_c
-            END INTERFACE
-
-            hdferr = h5sset_extent_none_c(space_id)
-
-          END SUBROUTINE h5sset_extent_none_f
-
-!
-!****s* H5S/h5sselect_hyperslab_f
-!
-! NAME
-!  h5sselect_hyperslab_f
-!
-! PURPOSE
-!  Selects a hyperslab region to add to the current selected
-!  region
-!
-! INPUTS
-!  space_id 	 - dataspace identifier
-!  operator 	 - flag, valid values are:
-!  H5S_SELECT_SET_F (0)
-!  H5S_SELECT_OR_F (1)
-!  start 	 - array with hyperslab offsets
-!  count 	 - number of blocks included in the
-!  hyperslab
-! OUTPUTS
-!  hdferr      - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  stride 	 - array with hyperslab strides
-!  block 	 - array with hyperslab block sizes
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 6, 2001
-!
-! SOURCE
-          SUBROUTINE h5sselect_hyperslab_f(space_id, operator, start, count, &
-                                           hdferr, stride, block)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier
-            INTEGER, INTENT(IN) :: operator     ! Flag, valid values are:
-                                                ! H5S_SELECT_SET_F (0)
-                                                ! H5S_SELECT_OR_F (1)
-                                                !
-            INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: start
-                                          ! Starting coordinates of the hyperslab
-            INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: count
-                                          ! Number of blocks to select
-                                          ! from dataspace
-            INTEGER, INTENT(OUT) :: hdferr     ! Error code
-            INTEGER(HSIZE_T), DIMENSION(:), OPTIONAL, INTENT(IN) :: stride
-                                          ! Array of how many elements to move
-                                          ! in each direction
-            INTEGER(HSIZE_T), DIMENSION(:), OPTIONAL, INTENT(IN) :: block
-                                          ! Sizes of element block
-!*****
-            INTEGER(HSIZE_T), DIMENSION(:), ALLOCATABLE :: def_block
-            INTEGER(HSIZE_T), DIMENSION(:), ALLOCATABLE :: def_stride
-            INTEGER :: rank
-            INTEGER :: error1, error2
-
-            INTERFACE
-              INTEGER FUNCTION h5sselect_hyperslab_c(space_id, operator, &
-                               start, count, stride, block)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SSELECT_HYPERSLAB_C'::h5sselect_hyperslab_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              INTEGER, INTENT(IN) :: operator
-              INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: start
-              INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: count
-              INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: stride
-              INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: block
-              END FUNCTION h5sselect_hyperslab_c
-            END INTERFACE
-
-            if (present(stride).and. present(block)) then
-            hdferr = h5sselect_hyperslab_c(space_id, operator, start, count, &
-                                           stride, block)
-            return
-            endif
-            ! Case of optional parameters.
-            !
-            ! Find the rank of the dataspace to allocate memery for
-            ! default stride and block arrays.
-            !
-            CALL h5sget_simple_extent_ndims_f(space_id, rank, hdferr)
-            if( hdferr .EQ. -1) return
-            !
-            if (present(stride).and. .not.present(block)) then
-            allocate(def_block(rank), stat=error1)
-                if (error1.NE.0) then
-                    hdferr = -1
-                    return
-                endif
-            def_block = 1
-            hdferr = h5sselect_hyperslab_c(space_id, operator, start, count, &
-                                           stride, def_block)
-            deallocate(def_block)
-            return
-            endif
-
-            if (.not.present(stride).and. present(block)) then
-            allocate(def_stride(rank), stat=error2)
-                if (error2.NE.0) then
-                    hdferr = -1
-                    return
-                endif
-            def_stride = 1
-            hdferr = h5sselect_hyperslab_c(space_id, operator, start, count, &
-                                           def_stride, block)
-            deallocate(def_stride)
-            return
-            endif
-            allocate(def_block(rank), stat=error1)
-            allocate(def_stride(rank), stat=error2)
-                if ((error1.NE.0) .OR. (error2.NE.0)) then
-                    hdferr = -1
-                    return
-                endif
-            def_block = 1
-            def_stride = 1
-            hdferr = h5sselect_hyperslab_c(space_id, operator, start, count, &
-                                           def_stride, def_block)
-            deallocate(def_block)
-            deallocate(def_stride)
-
-          END SUBROUTINE h5sselect_hyperslab_f
-!  !$!
-!  !$!****s* H5S/h5scombine_hyperslab_f
-!  !$!
-!  !$! NAME
-!  !$!		h5scombine_hyperslab_f
-!  !$!
-!  !$! PURPOSE
-!  !$!	Combine a hyperslab selection with the current
-!  !$!               selection for a dataspace
-!  !$!
-!  !$! INPUTS
-!  !$!		space_id	- dataspace of selection to use
-!  !$!		operator	- flag, valid values are:
-!  !$!				  H5S_SELECT_NOOP_F
-!  !$!				  H5S_SELECT_SET_F
-!  !$!				  H5S_SELECT_OR_F
-!  !$!				  H5S_SELECT_AND_F
-!  !$!				  H5S_SELECT_XOR_F
-!  !$!				  H5S_SELECT_NOTB_F
-!  !$!				  H5S_SELECT_NOTA_F
-!  !$!				  H5S_SELECT_APPEND_F
-!  !$!				  H5S_SELECT_PREPEND_F
-!  !$!		start		- array with hyperslab offsets
-!  !$!		count		- number of blocks included in the
-!  !$!				  hyperslab
-!  !$! OUTPUTS
-!  !$!               hyper_id        - identifier for the new hyperslab
-!  !$!		hdferr:		- error code
-!  !$!				 	Success:  0
-!  !$!				 	Failure: -1
-!  !$! OPTIONAL PARAMETERS
-!  !$!		stride		- array with hyperslab strides
-!  !$!		block		- array with hyperslab block sizes
-!  !$!
-!  !$! AUTHOR
-!  !$!	Elena Pourmal
-!  !$!		October 7, 2002
-!  !$!
-!  !$! HISTORY
-!  !$!
-!  !$!
-!  !$! NOTES
-!  !$! Commented out until 1.6 ? 10/08/2002
-!  !$!
-!  !$! SOURCE
-!  SUBROUTINE h5scombine_hyperslab_f(space_id, operator, start, count, &
-!  hyper_id,  hdferr, stride, block)
-!  IMPLICIT NONE
-!  INTEGER(HID_T), INTENT(IN) :: space_id ! Dataspace identifier
-!  INTEGER, INTENT(IN) :: operator     ! Flag, valid values are:
-						!  H5S_SELECT_NOOP_F
-						!  H5S_SELECT_SET_F
-						!  H5S_SELECT_OR_F
-						!  H5S_SELECT_AND_F
-						!  H5S_SELECT_XOR_F
-						!  H5S_SELECT_NOTB_F
-						!  H5S_SELECT_NOTA_F
-						!  H5S_SELECT_APPEND_F
-						!  H5S_SELECT_PREPEND_F
-                                                !
-!  INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: start
-                                          ! Starting coordinates of the hyperslab
-!  INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: count
-                                          ! Number of blocks to select
-                                          ! from dataspace
-!  INTEGER(HID_T), INTENT(OUT) :: hyper_id ! New hyperslab identifier
-!  INTEGER, INTENT(OUT) :: hdferr     ! Error code
-!  INTEGER(HSIZE_T), DIMENSION(:), OPTIONAL, INTENT(IN) :: stride
-                                          ! Array of how many elements to move
-                                          ! in each direction
-!  INTEGER(HSIZE_T), DIMENSION(:), OPTIONAL, INTENT(IN) :: block
-                                          ! Sizes of element block
-!  INTEGER(HSIZE_T), DIMENSION(:), ALLOCATABLE :: def_block
-!  INTEGER(HSIZE_T), DIMENSION(:), ALLOCATABLE :: def_stride
-!  INTEGER :: rank
-!  INTEGER :: error1, error2
-
-!  INTERFACE
-!  INTEGER FUNCTION h5scombine_hyperslab_c(space_id, operator, &
-!  start, count, stride, block, hyper_id)
-!  USE H5GLOBAL
-!  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-!  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SCOMBINE_HYPERSLAB_C'::h5scombine_hyperslab_c
-!  !DEC$ENDIF
-!  INTEGER(HID_T), INTENT(IN) :: space_id
-!  INTEGER, INTENT(IN) :: operator
-!  INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: start
-!  INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: count
-!  INTEGER(HSIZE_T), DIMENSION(*), OPTIONAL, INTENT(IN) :: stride
-!  INTEGER(HSIZE_T), DIMENSION(*), OPTIONAL, INTENT(IN) :: block
-!  INTEGER(HID_T), INTENT(OUT) :: hyper_id
-!  END FUNCTION h5scombine_hyperslab_c
-!  END INTERFACE
-
-!  if (present(stride).and. present(block)) then
-!  hdferr = h5scombine_hyperslab_c(space_id, operator, start, count, &
-!  stride, block, hyper_id)
-!  return
-!  endif
-            ! Case of optional parameters.
-            !
-            ! Find the rank of the dataspace to allocate memery for
-            ! default stride and block arrays.
-            !
-!  CALL h5sget_simple_extent_ndims_f(space_id, rank, hdferr)
-!  if( hdferr .EQ. -1) return
-            !
-!  if (present(stride).and. .not.present(block)) then
-!  allocate(def_block(rank), stat=error1)
-!  if (error1.NE.0) then
-!  hdferr = -1
-!  return
-!  endif
-!  def_block = 1
-!  hdferr = h5scombine_hyperslab_c(space_id, operator, start, count, &
-!  stride, def_block, hyper_id)
-!  deallocate(def_block)
-!  return
-!  endif
-
-!  if (.not.present(stride).and. present(block)) then
-!  allocate(def_stride(rank), stat=error2)
-!  if (error2.NE.0) then
-!  hdferr = -1
-!  return
-!  endif
-!  def_stride = 1
-!  hdferr = h5scombine_hyperslab_c(space_id, operator, start, count, &
-!  def_stride, block, hyper_id)
-!  deallocate(def_stride)
-!  return
-!  endif
-!  allocate(def_block(rank), stat=error1)
-!  allocate(def_stride(rank), stat=error2)
-!  if ((error1.NE.0) .OR. (error2.NE.0)) then
-!  hdferr = -1
-!  return
-!  endif
-!  def_block = 1
-!  def_stride = 1
-!  hdferr = h5scombine_hyperslab_c(space_id, operator, start, count, &
-!  def_stride, def_block, hyper_id)
-!  deallocate(def_block)
-!  deallocate(def_stride)
-
-!  END SUBROUTINE h5scombine_hyperslab_f
-
-!  !$!
-!  !$!****s* H5S/
-!  !$!
-!  !$! NAME
-!  !$!		h5scombine_select_f
-!  !$!
-!  !$! PURPOSE
-!  !$!	Combine two hyperslab selections with an operation
-!  !$!               and return a dataspace with resulting selection.
-!  !$!
-!  !$! INPUTS
-!  !$!		space1_id	- dataspace of selection to use
-!  !$!		operator	- flag, valid values are:
-!  !$!				  H5S_SELECT_NOOP_F
-!  !$!				  H5S_SELECT_SET_F
-!  !$!				  H5S_SELECT_OR_F
-!  !$!				  H5S_SELECT_AND_F
-!  !$!				  H5S_SELECT_XOR_F
-!  !$!				  H5S_SELECT_NOTB_F
-!  !$!				  H5S_SELECT_NOTA_F
-!  !$!				  H5S_SELECT_APPEND_F
-!  !$!				  H5S_SELECT_PREPEND_F
-!  !$!		space2_id	- dataspace of selection to use
-!  !$! OUTPUTS
-!  !$!               ds_id           - idataspace identifier with the new selection
-!  !$!		hdferr:		- error code
-!  !$!				 	Success:  0
-!  !$!				 	Failure: -1
-!  !$! OPTIONAL PARAMETERS		- NONE
-!  !$!
-!  !$! AUTHOR
-!  !$!	Elena Pourmal
-!  !$!		October 7, 2002
-!  !$!
-!  !$! HISTORY
-!  !$!
-!  !$!
-!  !$! NOTES commented out until 1.6 release(?) 10/08/2002
-!  !$!
-
-!  ! SOURCE
-!  !$          SUBROUTINE h5scombine_select_f(space1_id, operator, space2_id, &
-!  ds_id,  hdferr)
-!  IMPLICIT NONE
-!  INTEGER(HID_T), INTENT(IN) :: space1_id ! First dataspace identifier
-!  INTEGER(HID_T), INTENT(IN) :: space2_id ! Second dataspace identifier
-!  INTEGER, INTENT(IN) :: operator     ! Flag, valid values are:
-						!  H5S_SELECT_NOOP_F
-						!  H5S_SELECT_SET_F
-						!  H5S_SELECT_OR_F
-						!  H5S_SELECT_AND_F
-						!  H5S_SELECT_XOR_F
-						!  H5S_SELECT_NOTB_F
-						!  H5S_SELECT_NOTA_F
-						!  H5S_SELECT_APPEND_F
-						!  H5S_SELECT_PREPEND_F
-                                                !
-!  INTEGER(HID_T), INTENT(OUT) :: ds_id ! New dataspace identifier
-!  INTEGER, INTENT(OUT) :: hdferr     ! Error code
-!
-!  INTERFACE
-!  INTEGER FUNCTION h5scombine_select_c(space1_id, operator, &
-!  space2_id, ds_id)
-!  USE H5GLOBAL
-!  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-!  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SCOMBINE_SELECT_C'::h5scombine_select_c
-!  !DEC$ENDIF
-!  INTEGER(HID_T), INTENT(IN) :: space1_id
-!  INTEGER(HID_T), INTENT(IN) :: space2_id
-!  INTEGER, INTENT(IN) :: operator
-!  INTEGER(HID_T), INTENT(OUT) :: ds_id
-!  END FUNCTION h5scombine_select_c
-!  END INTERFACE
-
-!  hdferr = h5scombine_select_c(space1_id, operator, space2_id, &
-!  ds_id)
-!  return
-
-!  END SUBROUTINE h5scombine_select_f
-
-!  !$!
-!  !$!****s* H5S/
-!  !$!
-!  !$! NAME
-!  !$!		h5sselect_select_f
-!  !$!
-!  !$! PURPOSE
-!  !$!	Refine a hyperslab selection with an operation
-!  !$!               using second hyperslab
-!  !$!
-!  !$! INPUTS
-!  !$!		space1_id	- dataspace of selection  to modify
-!  !$!		operator	- flag, valid values are:
-!  !$!				  H5S_SELECT_NOOP_F
-!  !$!				  H5S_SELECT_SET_F
-!  !$!				  H5S_SELECT_OR_F
-!  !$!				  H5S_SELECT_AND_F
-!  !$!				  H5S_SELECT_XOR_F
-!  !$!				  H5S_SELECT_NOTB_F
-!  !$!				  H5S_SELECT_NOTA_F
-!  !$!				  H5S_SELECT_APPEND_F
-!  !$!				  H5S_SELECT_PREPEND_F
-!  !$!		space2_id	- dataspace of selection to use
-!  !$!
-!  !$! OUTPUTS
-!  !$!		hdferr:		- error code
-!  !$!				 	Success:  0
-!  !$!				 	Failure: -1
-!  !$! OPTIONAL PARAMETERS		- NONE
-!  !$!
-!  !$! AUTHOR
-!  !$!	Elena Pourmal
-!  !$!		October 7, 2002
-!  !$!
-!  !$! HISTORY
-!  !$!
-!  !$!
-!  !$! NOTESCommented out until 1.6 release(?) 10/08/2002 EIP
-!  !$!
-
-!  ! SOURCE
-!  SUBROUTINE h5sselect_select_f(space1_id, operator, space2_id, &
-!  hdferr)
-!  IMPLICIT NONE
-!  INTEGER(HID_T), INTENT(INOUT) :: space1_id ! Dataspace identifier to
-                                                       ! modify
-!  INTEGER(HID_T), INTENT(IN) :: space2_id ! Second dataspace identifier
-!  INTEGER, INTENT(IN) :: operator     ! Flag, valid values are:
-						!  H5S_SELECT_NOOP_F
-						!  H5S_SELECT_SET_F
-						!  H5S_SELECT_OR_F
-						!  H5S_SELECT_AND_F
-						!  H5S_SELECT_XOR_F
-						!  H5S_SELECT_NOTB_F
-						!  H5S_SELECT_NOTA_F
-						!  H5S_SELECT_APPEND_F
-						!  H5S_SELECT_PREPEND_F
-                                                !
-!  INTEGER, INTENT(OUT) :: hdferr     ! Error code
-
-!  INTERFACE
-!  INTEGER FUNCTION h5sselect_select_c(space1_id, operator, &
-!  space2_id)
-!  USE H5GLOBAL
-!  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-!  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SSELECT_SELECT_C'::h5sselect_select_c
-!  !DEC$ENDIF
-!  INTEGER(HID_T), INTENT(INOUT) :: space1_id
-!  INTEGER(HID_T), INTENT(IN) :: space2_id
-!  INTEGER, INTENT(IN) :: operator
-!  END FUNCTION h5sselect_select_c
-!  END INTERFACE
-
-!  hdferr = h5sselect_select_c(space1_id, operator, space2_id)
-!  return
-
-!  END SUBROUTINE h5sselect_select_f
-
-!
-!****s* H5S/h5sget_select_type_f
-!
-! NAME
-!  h5sget_select_type_f
-!
-! PURPOSE
-!  Retrieve the type of selection
-!
-! INPUTS
-!  space_id 	 - dataspace iidentifier with selection
-! OUTPUTS
-!  type 	 - flag, valid values are:
-!                    H5S_SEL_ERROR_F
-!                    H5S_SEL_NONE_F
-!                    H5S_SEL_POINTS_F
-!                    H5S_SEL_HYPERSLABS_F
-!                    H5S_SEL_ALL_F
-!  hdferr      - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  October 7, 2002
-!
-! SOURCE
-          SUBROUTINE h5sget_select_type_f(space_id, type, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(INOUT) :: space_id ! Dataspace identifier to
-            INTEGER, INTENT(OUT) :: type        ! Selection type
-						!  H5S_SEL_ERROR_F
-						!  H5S_SEL_NONE_F
-						!  H5S_SEL_POINTS_F
-						!  H5S_SEL_HYPERSLABS_F
-						!  H5S_SEL_ALL_F
-            INTEGER, INTENT(OUT) :: hdferr     ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5sget_select_type_c(space_id, type)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SGET_SELECT_TYPE_C'::h5sget_select_type_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: space_id
-              INTEGER, INTENT(OUT) :: type
-              END FUNCTION h5sget_select_type_c
-            END INTERFACE
-
-            hdferr = h5sget_select_type_c(space_id, type)
-            return
-
-          END SUBROUTINE h5sget_select_type_f
-
-!
-!****s* H5S/H5Sdecode_f
-!
-! NAME
-!  H5Sdecode_f
-!
-! PURPOSE
-!  Decode a binary object description of data space and return a new object handle.
-!
-! INPUTS
-!  buf 	 -  Buffer for the data space object to be decoded.
-!  obj_id 	 - Object ID
-! OUTPUTS
-!  hdferr      - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 26, 2008
-! SOURCE
-  SUBROUTINE h5sdecode_f(buf, obj_id, hdferr)
-    IMPLICIT NONE
-    CHARACTER(LEN=*), INTENT(IN) :: buf ! Buffer for the data space object to be decoded.
-    INTEGER(HID_T), INTENT(OUT) :: obj_id  ! Object ID
-    INTEGER, INTENT(OUT) :: hdferr     ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5sdecode_c(buf, obj_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SDECODE_C'::h5sdecode_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         CHARACTER(LEN=*), INTENT(IN) :: buf
-         INTEGER(HID_T), INTENT(OUT) :: obj_id  ! Object ID
-       END FUNCTION h5sdecode_c
-    END INTERFACE
-
-    hdferr = h5sdecode_c(buf, obj_id)
-
-  END SUBROUTINE h5sdecode_f
-
-!
-!****s* H5S/H5Sencode_f
-!
-! NAME
-!  H5Sencode_f
-!
-! PURPOSE
-!  Encode a data space object description into a binary buffer.
-!
-! INPUTS
-!  obj_id 	 - Identifier of the object to be encoded.
-!  buf 	 - Buffer for the object to be encoded into.
-!  nalloc 	 - The size of the allocated buffer.
-! OUTPUTS
-!  nalloc 	 - The size of the buffer needed.
-!  hdferr      - Returns 0 if successful and -1 if fails.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  March 26, 2008
-! SOURCE
-  SUBROUTINE h5sencode_f(obj_id, buf, nalloc, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: obj_id ! Identifier of the object to be encoded.
-    CHARACTER(LEN=*), INTENT(OUT) :: buf ! Buffer for the object to be encoded into.
-    INTEGER(SIZE_T), INTENT(INOUT) :: nalloc ! The size of the allocated buffer.
-    INTEGER, INTENT(OUT) :: hdferr     ! Error code
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5sencode_c(buf, obj_id, nalloc)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SENCODE_C'::h5sencode_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: obj_id
-         CHARACTER(LEN=*), INTENT(OUT) :: buf
-         INTEGER(SIZE_T), INTENT(INOUT) :: nalloc
-       END FUNCTION h5sencode_c
-    END INTERFACE
-
-    hdferr = h5sencode_c(buf, obj_id, nalloc)
-
-  END SUBROUTINE h5sencode_f
-
-!****s* H5S/h5sextent_equal_f
-!
-! NAME
-!  h5sextent_equal_f
-!
-! PURPOSE
-!  Determines whether two dataspace extents are equal.
-!
-! INPUTS
-!  space1_id 	 - First dataspace identifier.
-!  space2_id 	 - Second dataspace identifier.
-! OUTPUTS
-!  Equal 	 - .TRUE. if equal, .FALSE. if unequal.
-!  hdferr      - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  M. Scot Breitenfeld
-!  April 2, 2008
-!
-! SOURCE
-  SUBROUTINE h5sextent_equal_f(space1_id, space2_id, equal, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: space1_id ! First dataspace identifier.
-    INTEGER(HID_T), INTENT(IN) :: space2_id ! Second dataspace identifier.
-    LOGICAL, INTENT(OUT) :: Equal ! .TRUE. if equal, .FALSE. if unequal.
-    INTEGER, INTENT(OUT) :: hdferr                ! Error code
-!*****
-    INTEGER(HID_T) :: c_equal
-
-    INTERFACE
-       INTEGER FUNCTION h5sextent_equal_c(space1_id, space2_id, c_equal)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5SEXTENT_EQUAL_C'::h5sextent_equal_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: space1_id
-         INTEGER(HID_T), INTENT(IN) :: space2_id
-         INTEGER(HID_T) :: c_equal
-       END FUNCTION h5sextent_equal_c
-    END INTERFACE
-
-    hdferr = h5sextent_equal_c(space1_id, space2_id, c_equal)
-
-
-    equal = .FALSE.
-    IF(c_equal.GT.0) equal = .TRUE.
-
-
-  END SUBROUTINE h5sextent_equal_f
-
-END MODULE H5S
diff --git a/fortran/src/H5Tf.c b/fortran/src/H5Tf.c
index 7e1aa42..9928d0a 100644
--- a/fortran/src/H5Tf.c
+++ b/fortran/src/H5Tf.c
@@ -1,6 +1,6 @@
 /****h* H5Tf/H5Tf
  * PURPOSE
- *   This file contains C stubs for H5T Fortran APIs
+ *  This file contains C stubs for H5T Fortran APIs
  *
  * COPYRIGHT
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -23,30 +23,29 @@
 
 #include "H5f90.h"
 
-
 /****if* H5Tf/h5topen_c
  * NAME
  *  h5topen_c
  * PURPOSE
  *  Call H5Topen2 to open a datatype
  * INPUTS
- *      loc_id - file or group identifier
- *              name - name of the datatype within file or  group
- *              namelen - name length
- *              tapl_id - datatype access property list identifier
+ *  loc_id - file or group identifier
+ *  name - name of the datatype within file or  group
+ *  namelen - name length
+ *  tapl_id - datatype access property list identifier
  * OUTPUTS
- *     type_id - dataset identifier
+ *  type_id - dataset identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Saturday, August 14, 1999
+ *  Saturday, August 14, 1999
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5topen_c (hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *type_id, hid_t_f *tapl_id)
+h5topen_c (hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *type_id, hid_t_f *tapl_id)
 /******/
 {
     char *c_name = NULL;
@@ -75,25 +74,24 @@ done:
     return ret_value;
 }
 
-
 /****if* H5Tf/h5tcommit_c
  * NAME
  *  h5tcommit_c
  * PURPOSE
  *  Call H5Tcommit2 to commit a datatype
  * INPUTS
- *      loc_id - file or group identifier
- *              name - name of the datatype within file or  group
- *              namelen - name length
- *              type_id - dataset identifier
- *              lcpl_id - Link creation property list
- *              tcpl_id - Datatype creation property list
- *              tapl_id - Datatype access property list
+ *  loc_id - file or group identifier
+ *  name - name of the datatype within file or  group
+ *  namelen - name length
+ *  type_id - dataset identifier
+ *  lcpl_id - Link creation property list
+ *  tcpl_id - Datatype creation property list
+ *  tapl_id - Datatype access property list
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Saturday, August 14, 1999
+ *  Saturday, August 14, 1999
  * HISTORY
  *
  *              - Added passing optional parameters for version 1.8
@@ -101,7 +99,7 @@ done:
  * SOURCE
 */
 int_f
-nh5tcommit_c(hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *type_id,
+h5tcommit_c(hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *type_id,
 	     hid_t_f *lcpl_id, hid_t_f *tcpl_id, hid_t_f *tapl_id)
 /******/
 {
@@ -130,19 +128,19 @@ done:
  * PURPOSE
  *  Call H5Tclose to close the datatype
  * INPUTS
- *      type_id - identifier of the datatype to be closed
+ *  type_id - identifier of the datatype to be closed
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Saturday, August 14, 1999
+ *  Saturday, August 14, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tclose_c ( hid_t_f *type_id )
+h5tclose_c ( hid_t_f *type_id )
 /******/
 {
   int ret_value = 0;
@@ -153,28 +151,27 @@ nh5tclose_c ( hid_t_f *type_id )
   return ret_value;
 }
 
-
 /****if* H5Tf/h5tcopy_c
  * NAME
  *  h5tcopy_c
  * PURPOSE
  *  Call H5Tcopy to copy a datatype
  * INPUTS
- *      type_id - identifier of the datatype to be copied
+ *  type_id - identifier of the datatype to be copied
  * OUTPUTS
- *     new_type_id - identifier of the new datatype
+ *  new_type_id - identifier of the new datatype
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Saturday, August 14, 1999
+ *  Saturday, August 14, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tcopy_c ( hid_t_f *type_id , hid_t_f *new_type_id)
+h5tcopy_c ( hid_t_f *type_id , hid_t_f *new_type_id)
 /******/
 {
   int ret_value = 0;
@@ -194,22 +191,22 @@ nh5tcopy_c ( hid_t_f *type_id , hid_t_f *new_type_id)
  * PURPOSE
  *  Call H5Tequal to copy a datatype
  * INPUTS
- *      type1_id - datatype identifier
- *              type2_id - datatype identifier
+ *  type1_id - datatype identifier
+ *  type2_id - datatype identifier
  * OUTPUTS
- *     c_flag - flag; indicates if two datatypes are equal or not.
+ *  c_flag - flag; indicates if two datatypes are equal or not.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Tuesday, February 22, 2000
+ *  Tuesday, February 22, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tequal_c ( hid_t_f *type1_id , hid_t_f *type2_id, int_f *c_flag)
+h5tequal_c ( hid_t_f *type1_id , hid_t_f *type2_id, int_f *c_flag)
 /******/
 {
   int ret_value = -1;
@@ -257,7 +254,7 @@ nh5tequal_c ( hid_t_f *type1_id , hid_t_f *type2_id, int_f *c_flag)
 */
 
 int_f
-nh5tget_class_c ( hid_t_f *type_id , int_f *classtype)
+h5tget_class_c ( hid_t_f *type_id , int_f *classtype)
 /******/
 {
   int ret_value = 0;
@@ -293,24 +290,24 @@ nh5tget_class_c ( hid_t_f *type_id , int_f *classtype)
  * PURPOSE
  *  Call H5Tget_order to determine byte order
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * OUTPUTS
- *     order; possible values are:
+ *  order; possible values are:
  *              H5T_ORDER_LE_F (0)
  *              H5T_ORDER_BE_F (1)
  *              H5T_ORDER_VAX_F (2)
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Saturday, August 14, 1999
+ *  Saturday, August 14, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tget_order_c ( hid_t_f *type_id , int_f *order)
+h5tget_order_c ( hid_t_f *type_id , int_f *order)
 /******/
 {
   int ret_value = -1;
@@ -337,23 +334,23 @@ nh5tget_order_c ( hid_t_f *type_id , int_f *order)
  * PURPOSE
  *  Call H5Tset_order to set byte order
  * INPUTS
- *      type_id - identifier of the dataspace
- *              order; possible values are:
+ *  type_id - identifier of the dataspace
+ *  order; possible values are:
  *              H5T_ORDER_LE_F (0)
  *              H5T_ORDER_BE_F (1)
  *              H5T_ORDER_VAX_F (2)
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Saturday, August 14, 1999
+ *  Saturday, August 14, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tset_order_c ( hid_t_f *type_id , int_f *order)
+h5tset_order_c ( hid_t_f *type_id , int_f *order)
 /******/
 {
   int ret_value = 0;
@@ -378,21 +375,21 @@ nh5tset_order_c ( hid_t_f *type_id , int_f *order)
  * PURPOSE
  *  Call H5Tget_size to get size of the datatype
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * OUTPUTS
- *     size (in bytes)
+ *  size (in bytes)
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Saturday, August 14, 1999
+ *  Saturday, August 14, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tget_size_c ( hid_t_f *type_id , size_t_f *size)
+h5tget_size_c ( hid_t_f *type_id , size_t_f *size)
 /******/
 {
   int ret_value = -1;
@@ -413,21 +410,21 @@ nh5tget_size_c ( hid_t_f *type_id , size_t_f *size)
  * PURPOSE
  *  Call H5Tget_size to get size of the datatype
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * OUTPUTS
- *     size (in bytes)
+ *  size (in bytes)
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Saturday, August 14, 1999
+ *  Saturday, August 14, 1999
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tset_size_c ( hid_t_f *type_id , size_t_f *size)
+h5tset_size_c ( hid_t_f *type_id , size_t_f *size)
 /******/
 {
   int ret_value = -1;
@@ -449,21 +446,21 @@ nh5tset_size_c ( hid_t_f *type_id , size_t_f *size)
  * PURPOSE
  *  Call H5Tget_precision to get precision of the datatype
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * OUTPUTS
- *     precision -  number of significant bits
+ *  precision -  number of significant bits
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Tuesday, January 25, 2000
+ *  Tuesday, January 25, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tget_precision_c ( hid_t_f *type_id , size_t_f *precision)
+h5tget_precision_c ( hid_t_f *type_id , size_t_f *precision)
 /******/
 {
   int ret_value = -1;
@@ -484,20 +481,20 @@ nh5tget_precision_c ( hid_t_f *type_id , size_t_f *precision)
  * PURPOSE
  *  Call H5Tset_precision to set precision of the datatype
  * INPUTS
- *      type_id - identifier of the dataspace
- *              precision -  number of significant bits
+ *  type_id - identifier of the dataspace
+ *  precision -  number of significant bits
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Tuesday, January 25, 2000
+ *  Tuesday, January 25, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tset_precision_c ( hid_t_f *type_id , size_t_f *precision)
+h5tset_precision_c ( hid_t_f *type_id , size_t_f *precision)
 /******/
 {
   int ret_value = -1;
@@ -518,23 +515,23 @@ nh5tset_precision_c ( hid_t_f *type_id , size_t_f *precision)
  *  h5tget_offset_c
  * PURPOSE
  *  Call H5Tget_offset to get bit offset of the first
- *              significant bit of the datatype
+ *  significant bit of the datatype
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * OUTPUTS
- *     offset - bit offset of the first significant bit
+ *  offset - bit offset of the first significant bit
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Tuesday, January 25, 2000
+ *  Tuesday, January 25, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tget_offset_c ( hid_t_f *type_id , size_t_f *offset)
+h5tget_offset_c ( hid_t_f *type_id , size_t_f *offset)
 /******/
 {
   int ret_value = -1;
@@ -555,22 +552,22 @@ nh5tget_offset_c ( hid_t_f *type_id , size_t_f *offset)
  *  h5tset_offset_c
  * PURPOSE
  *  Call H5Tset_offset to set bit offset of the first
- *              significant bit of the datatype
+ *  significant bit of the datatype
  * INPUTS
- *      type_id - identifier of the dataspace
- *              offset - bit offset of the first significant bit
+ *  type_id - identifier of the dataspace
+ *  offset - bit offset of the first significant bit
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Tuesday, January 25, 2000
+ *  Tuesday, January 25, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tset_offset_c ( hid_t_f *type_id , size_t_f *offset)
+h5tset_offset_c ( hid_t_f *type_id , size_t_f *offset)
 /******/
 {
   int ret_value = -1;
@@ -591,25 +588,25 @@ nh5tset_offset_c ( hid_t_f *type_id , size_t_f *offset)
  *  h5tget_pad_c
  * PURPOSE
  *  Call H5Tget_pad to get the padding type of the least and
- *              most-significant bit padding
+ *  most-significant bit padding
  *
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * OUTPUTS
- *     lsbpad - padding type of the least significant bit
- *              msbpad - padding type of the least significant bit
+ *  lsbpad - padding type of the least significant bit
+ *  msbpad - padding type of the least significant bit
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Wednesday, January 26, 2000
+ *  Wednesday, January 26, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tget_pad_c ( hid_t_f *type_id , int_f * lsbpad, int_f * msbpad)
+h5tget_pad_c ( hid_t_f *type_id , int_f * lsbpad, int_f * msbpad)
 /******/
 {
   int ret_value = -1;
@@ -631,27 +628,27 @@ nh5tget_pad_c ( hid_t_f *type_id , int_f * lsbpad, int_f * msbpad)
  * NAME
  *  h5tset_pad_c
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * PURPOSE
  *  Call H5Tset_pad to set the padding type of the least and
- *              most-significant bit padding
+ *  most-significant bit padding
  *
  * INPUTS
- *      type_id - identifier of the dataspace
- *              lsbpad - padding type of the least significant bit
- *              msbpad - padding type of the least significant bit
+ *  type_id - identifier of the dataspace
+ *  lsbpad - padding type of the least significant bit
+ *  msbpad - padding type of the least significant bit
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Wednesday, January 26, 2000
+ *  Wednesday, January 26, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tset_pad_c ( hid_t_f *type_id, int_f * lsbpad, int_f* msbpad )
+h5tset_pad_c ( hid_t_f *type_id, int_f * lsbpad, int_f* msbpad )
 /******/
 {
   int ret_value = -1;
@@ -674,21 +671,21 @@ nh5tset_pad_c ( hid_t_f *type_id, int_f * lsbpad, int_f* msbpad )
  * PURPOSE
  *  Call H5Tget_sign to get sign type for an integer type
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * OUTPUTS
- *     sign - sign type for an integer type
+ *  sign - sign type for an integer type
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Wednesday, January 26, 2000
+ *  Wednesday, January 26, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tget_sign_c ( hid_t_f *type_id , int_f *sign)
+h5tget_sign_c ( hid_t_f *type_id , int_f *sign)
 /******/
 {
   int ret_value = -1;
@@ -709,20 +706,20 @@ nh5tget_sign_c ( hid_t_f *type_id , int_f *sign)
  * PURPOSE
  *  Call H5Tset_sign to set sign type for an integer type
  * INPUTS
- *      type_id - identifier of the dataspace
- *              sign - sign type for an integer typ
+ *  type_id - identifier of the dataspace
+ *  sign - sign type for an integer typ
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Wednesday, January 26, 2000
+ *  Wednesday, January 26, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tset_sign_c ( hid_t_f *type_id , int_f* sign)
+h5tset_sign_c ( hid_t_f *type_id , int_f* sign)
 /******/
 {
   int ret_value = -1;
@@ -744,26 +741,26 @@ nh5tset_sign_c ( hid_t_f *type_id , int_f* sign)
  *  h5tget_fields_c
  * PURPOSE
  *  Call H5Tget_fields to get floating point datatype
- *              bit field information
+ *  bit field information
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * OUTPUTS
- *     epos -  exponent bit-position
- *              esize - size of exponent in bits
- *              mpos -  mantissa bit-position
- *              msize -  size of mantissa in bits
+ *  epos -  exponent bit-position
+ *  esize - size of exponent in bits
+ *  mpos -  mantissa bit-position
+ *  msize -  size of mantissa in bits
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Thursday, January 27, 2000
+ *  Thursday, January 27, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tget_fields_c ( hid_t_f *type_id , size_t_f *spos, size_t_f *epos, size_t_f* esize, size_t_f* mpos, size_t_f* msize)
+h5tget_fields_c ( hid_t_f *type_id , size_t_f *spos, size_t_f *epos, size_t_f* esize, size_t_f* mpos, size_t_f* msize)
 /******/
 {
   int ret_value = -1;
@@ -788,25 +785,25 @@ nh5tget_fields_c ( hid_t_f *type_id , size_t_f *spos, size_t_f *epos, size_t_f*
  *  h5tset_fields_c
  * PURPOSE
  *  Call H5Tset_fields to set floating point datatype
- *              bit field information
+ *  bit field information
  * INPUTS
- *      type_id - identifier of the dataspace
- *              epos -  exponent bit-position
- *              esize - size of exponent in bits
- *              mpos -  mantissa bit-position
- *              msize -  size of mantissa in bits
+ *  type_id - identifier of the dataspace
+ *  epos -  exponent bit-position
+ *  esize - size of exponent in bits
+ *  mpos -  mantissa bit-position
+ *  msize -  size of mantissa in bits
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Wednesday, January 26, 2000
+ *  Wednesday, January 26, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tset_fields_c ( hid_t_f *type_id, size_t_f *spos, size_t_f *epos, size_t_f* esize, size_t_f* mpos, size_t_f* msize)
+h5tset_fields_c ( hid_t_f *type_id, size_t_f *spos, size_t_f *epos, size_t_f* esize, size_t_f* mpos, size_t_f* msize)
 /******/
 {
   int ret_value = -1;
@@ -832,23 +829,23 @@ nh5tset_fields_c ( hid_t_f *type_id, size_t_f *spos, size_t_f *epos, size_t_f* e
  *  h5tget_ebias_c
  * PURPOSE
  *  Call H5Tget_ebias to get  exponent bias of a
- *              floating-point type of the datatype
+ *  floating-point type of the datatype
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * OUTPUTS
- *     ebias - exponent bias of a floating-point type of the datatype
+ *  ebias - exponent bias of a floating-point type of the datatype
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, January 27, 2000
+ *  Friday, January 27, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tget_ebias_c ( hid_t_f *type_id , size_t_f *ebias)
+h5tget_ebias_c ( hid_t_f *type_id , size_t_f *ebias)
 /******/
 {
   int ret_value = -1;
@@ -869,22 +866,22 @@ nh5tget_ebias_c ( hid_t_f *type_id , size_t_f *ebias)
  *  h5tset_ebias_c
  * PURPOSE
  *  Call H5Tset_ebias to set exponent bias of a
- *              floating-point type of the datatype
+ *  floating-point type of the datatype
  * INPUTS
- *      type_id - identifier of the dataspace
- *              ebias - exponent bias of a floating-point type of the datatyp
+ *  type_id - identifier of the dataspace
+ *  ebias - exponent bias of a floating-point type of the datatyp
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, January 27, 2000
+ *  Friday, January 27, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tset_ebias_c ( hid_t_f *type_id , size_t_f *ebias)
+h5tset_ebias_c ( hid_t_f *type_id , size_t_f *ebias)
 /******/
 {
   int ret_value = -1;
@@ -906,23 +903,23 @@ nh5tset_ebias_c ( hid_t_f *type_id , size_t_f *ebias)
  *  h5tget_norm_c
  * PURPOSE
  *  Call H5Tget_norm to get mantissa normalization
- *              of a floating-point datatype
+ *  of a floating-point datatype
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * OUTPUTS
- *     norm - mantissa normalization of a floating-point type
+ *  norm - mantissa normalization of a floating-point type
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, January 27, 2000
+ *  Friday, January 27, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tget_norm_c ( hid_t_f *type_id , int_f *norm)
+h5tget_norm_c ( hid_t_f *type_id , int_f *norm)
 /******/
 {
   int ret_value = -1;
@@ -943,22 +940,22 @@ nh5tget_norm_c ( hid_t_f *type_id , int_f *norm)
  *  h5tset_norm_c
  * PURPOSE
  *  Call H5Tset_norm to set mantissa normalization of
- *              floating-point type of the datatype
+ *  floating-point type of the datatype
  * INPUTS
- *      type_id - identifier of the dataspace
- *              norm -  mantissa normalization of a floating-point type
+ *  type_id - identifier of the dataspace
+ *  norm -  mantissa normalization of a floating-point type
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Xiangyang Su
- *              Friday, January 27, 2000
+ *  Friday, January 27, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tset_norm_c ( hid_t_f *type_id , int_f *norm)
+h5tset_norm_c ( hid_t_f *type_id , int_f *norm)
 /******/
 {
   int ret_value = -1;
@@ -980,25 +977,25 @@ nh5tset_norm_c ( hid_t_f *type_id , int_f *norm)
  *  h5tget_inpad_c
  * PURPOSE
  *  Call H5Tget_inpad to get the padding type for
- *              unused bits in floating-point datatypes
+ *  unused bits in floating-point datatypes
  *
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * OUTPUTS
- *     padtype - padding type for
- *                        unused bits in floating-point datatype
+ *  padtype - padding type for
+ *  unused bits in floating-point datatype
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Wednesday, January 26, 2000
+ *  Wednesday, January 26, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tget_inpad_c ( hid_t_f *type_id , int_f * padtype)
+h5tget_inpad_c ( hid_t_f *type_id , int_f * padtype)
 /******/
 {
   int ret_value = -1;
@@ -1018,27 +1015,27 @@ nh5tget_inpad_c ( hid_t_f *type_id , int_f * padtype)
  * NAME
  *  h5tset_inpad_c
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * PURPOSE
  *  Call H5Tset_inpad to set the padding type
- *              unused bits in floating-point datatype
+ *  unused bits in floating-point datatype
  *
  * INPUTS
- *      type_id - identifier of the dataspace
- *              padtype - padding type for unused bits
- *                        in floating-point datatypes
+ *  type_id - identifier of the dataspace
+ *  padtype - padding type for unused bits
+ *  in floating-point datatypes
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Wednesday, January 26, 2000
+ *  Wednesday, January 26, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tset_inpad_c ( hid_t_f *type_id, int_f * padtype)
+h5tset_inpad_c ( hid_t_f *type_id, int_f * padtype)
 /******/
 {
   int ret_value = -1;
@@ -1060,24 +1057,24 @@ nh5tset_inpad_c ( hid_t_f *type_id, int_f * padtype)
  *  h5tget_cset_c
  * PURPOSE
  *  Call H5Tget_cset to get character set
- *              type of a string datatype
+ *  type of a string datatype
  *
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * OUTPUTS
- *     cset - character set type of a string datatype
+ *  cset - character set type of a string datatype
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Wednesday, January 26, 2000
+ *  Wednesday, January 26, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tget_cset_c ( hid_t_f *type_id , int_f * cset)
+h5tget_cset_c ( hid_t_f *type_id , int_f * cset)
 /******/
 {
   int ret_value = -1;
@@ -1097,26 +1094,26 @@ nh5tget_cset_c ( hid_t_f *type_id , int_f * cset)
  * NAME
  *  h5tset_cset_c
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * PURPOSE
  *  Call H5Tset_cset to set character set
- *              type of a string datatype
+ *  type of a string datatype
  *
  * INPUTS
- *      type_id - identifier of the dataspace
- *              cset -  character set type of a string datatype
+ *  type_id - identifier of the dataspace
+ *  cset -  character set type of a string datatype
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Wednesday, January 26, 2000
+ *  Wednesday, January 26, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tset_cset_c ( hid_t_f *type_id, int_f * cset)
+h5tset_cset_c ( hid_t_f *type_id, int_f * cset)
 /******/
 {
   int ret_value = -1;
@@ -1138,22 +1135,22 @@ nh5tset_cset_c ( hid_t_f *type_id, int_f * cset)
  *  h5tget_strpad_c
  * PURPOSE
  *  Call H5Tget_strpad to get string padding method
- *              for a string datatype
+ *  for a string datatype
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * OUTPUTS
- *     strpad - string padding method for a string datatype
+ *  strpad - string padding method for a string datatype
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Wednesday, January 26, 2000
+ *  Wednesday, January 26, 2000
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5tget_strpad_c ( hid_t_f *type_id , int_f * strpad)
+h5tget_strpad_c ( hid_t_f *type_id , int_f * strpad)
 /******/
 {
   int ret_value = -1;
@@ -1173,26 +1170,26 @@ nh5tget_strpad_c ( hid_t_f *type_id , int_f * strpad)
  * NAME
  *  h5tset_strpad_c
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * PURPOSE
  *  Call H5Tset_strpad to set string padding method
- *              for a string datatype
+ *  for a string datatype
  *
  * INPUTS
- *      type_id - identifier of the dataspace
- *              strpad - string padding method for a string datatype
+ *  type_id - identifier of the dataspace
+ *  strpad - string padding method for a string datatype
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Wednesday, January 26, 2000
+ *  Wednesday, January 26, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tset_strpad_c ( hid_t_f *type_id, int_f * strpad)
+h5tset_strpad_c ( hid_t_f *type_id, int_f * strpad)
 /******/
 {
   int ret_value = -1;
@@ -1214,23 +1211,23 @@ nh5tset_strpad_c ( hid_t_f *type_id, int_f * strpad)
  *  h5tget_nmembers_c
  * PURPOSE
  *  Call H5Tget_nmembers to get number of fields
- *              in a compound datatype
+ *  in a compound datatype
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * OUTPUTS
- *     num_members - number of fields in a compound datatype
+ *  num_members - number of fields in a compound datatype
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Thursday, February 3, 2000
+ *  Thursday, February 3, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tget_nmembers_c ( hid_t_f *type_id , int_f * num_members)
+h5tget_nmembers_c ( hid_t_f *type_id , int_f * num_members)
 /******/
 {
   int ret_value = -1;
@@ -1249,24 +1246,24 @@ nh5tget_nmembers_c ( hid_t_f *type_id , int_f * num_members)
  *  h5tget_member_name_c
  * PURPOSE
  *  Call H5Tget_member_name to get name
- *              of a compound datatype
+ *  of a compound datatype
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * OUTPUTS
- *     member_name - name of a field of a compound datatype
+ *  member_name - name of a field of a compound datatype
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Thursday, February 3, 2000
+ *  Thursday, February 3, 2000
  * HISTORY
- * Elena Pourmal
- * Added namelen parameter to return length of the name to Fortran user
+ *  Elena Pourmal
+ *  Added namelen parameter to return length of the name to Fortran user
  * SOURCE
 */
 
 int_f
-nh5tget_member_name_c ( hid_t_f *type_id ,int_f* idx, _fcd member_name, int_f *namelen)
+h5tget_member_name_c ( hid_t_f *type_id ,int_f* idx, _fcd member_name, int_f *namelen)
 /******/
 {
   int ret_value = -1;
@@ -1290,15 +1287,15 @@ nh5tget_member_name_c ( hid_t_f *type_id ,int_f* idx, _fcd member_name, int_f *n
  *  h5tget_member_index_c
  * PURPOSE
  *  Call H5Tget_member_index to get an index of
- *              the specified datatype filed or member.
+ *  the specified datatype filed or member.
  * INPUTS
- *      type_id - datatype identifier
- *              name - name of the datatype within file or  group
- *              namelen - name length
+ *  type_id - datatype identifier
+ *  name - name of the datatype within file or  group
+ *  namelen - name length
  * OUTPUTS
- *     index - 0-based index
+ *  index - 0-based index
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
  *  Thursday, September 26, 2002
@@ -1307,7 +1304,7 @@ nh5tget_member_name_c ( hid_t_f *type_id ,int_f* idx, _fcd member_name, int_f *n
  * SOURCE
 */
 int_f
-nh5tget_member_index_c (hid_t_f *type_id, _fcd name, int_f *namelen, int_f *idx)
+h5tget_member_index_c (hid_t_f *type_id, _fcd name, int_f *namelen, int_f *idx)
 /******/
 {
      int ret_value = -1;
@@ -1341,26 +1338,26 @@ DONE:
  *  h5tget_member_offset_c
  * PURPOSE
  *  Call H5Tget_member_offset to get byte offset of the
- *              beginning of a field within a compound datatype with
- *              respect to the beginning of the compound data type datum
+ *  beginning of a field within a compound datatype with
+ *  respect to the beginning of the compound data type datum
  * INPUTS
- *      type_id - identifier of the dataspace
- *              member_no - Number of the field whose offset is requested
+ *  type_id - identifier of the dataspace
+ *  member_no - Number of the field whose offset is requested
  * OUTPUTS
- *     offset - byte offset of the the beginning of the field of
- *                       a compound datatype
+ *  offset - byte offset of the the beginning of the field of
+ *  a compound datatype
  * RETURNS
- *     always 0
+ *  always 0
  * AUTHOR
  *  XIANGYANG SU
- *              Thursday, February 3, 2000
+ *  Thursday, February 3, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tget_member_offset_c ( hid_t_f *type_id ,int_f* member_no, size_t_f * offset)
+h5tget_member_offset_c ( hid_t_f *type_id ,int_f* member_no, size_t_f * offset)
 /******/
 {
   int ret_value = -1;
@@ -1377,23 +1374,23 @@ nh5tget_member_offset_c ( hid_t_f *type_id ,int_f* member_no, size_t_f * offset)
  *  h5tget_array_dims_c
  * PURPOSE
  *  Call H5Tget_array_dims2 to get
- *              dimensions of array datatype
+ *  dimensions of array datatype
  * INPUTS
- *      type_id - identifier of the array datatype
+ *  type_id - identifier of the array datatype
  * OUTPUTS
- *     dims -  dimensions(sizes of dimensions) of the array
+ *  dims -  dimensions(sizes of dimensions) of the array
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Thursday, November 16, 2000
+ *  Thursday, November 16, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tget_array_dims_c ( hid_t_f *type_id , hsize_t_f * dims)
+h5tget_array_dims_c ( hid_t_f *type_id , hsize_t_f * dims)
 /******/
 {
     hsize_t c_dims[H5S_MAX_RANK];
@@ -1420,23 +1417,23 @@ DONE:
  *  h5tget_array_ndims_c
  * PURPOSE
  *  Call H5Tget_array_ndims to get number
- *              of dimensions of array datatype
+ *  of dimensions of array datatype
  * INPUTS
- *      type_id - identifier of the array datatype
+ *  type_id - identifier of the array datatype
  * OUTPUTS
- *     ndims -  number of dimensions of the array
+ *  ndims -  number of dimensions of the array
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Thursday, November 16, 2000
+ *  Thursday, November 16, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tget_array_ndims_c ( hid_t_f *type_id , int_f * ndims)
+h5tget_array_ndims_c ( hid_t_f *type_id , int_f * ndims)
 /******/
 {
   int ret_value = -1;
@@ -1457,23 +1454,23 @@ nh5tget_array_ndims_c ( hid_t_f *type_id , int_f * ndims)
  *  h5tget_super_c
  * PURPOSE
  *  Call H5Tget_super to get base datatype from which
- *              datatype was derived
+ *  datatype was derived
  * INPUTS
- *      type_id - identifier of the array datatype
+ *  type_id - identifier of the array datatype
  * OUTPUTS
- *     base_type_id - base datatype identifier
+ *  base_type_id - base datatype identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Thursday, November 16, 2000
+ *  Thursday, November 16, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tget_super_c ( hid_t_f *type_id , hid_t_f *base_type_id)
+h5tget_super_c ( hid_t_f *type_id , hid_t_f *base_type_id)
 /******/
 {
   int ret_value = -1;
@@ -1495,14 +1492,14 @@ nh5tget_super_c ( hid_t_f *type_id , hid_t_f *base_type_id)
  *  h5tget_member_type_c
  * PURPOSE
  *  Call H5Tget_member_type to get the identifier of a copy of
- *              the datatype of the field
+ *  the datatype of the field
  * INPUTS
- *      type_id - identifier of the datatype
- *              field_idx - Field index (0-based) of the field type to retrieve
+ *  type_id - identifier of the datatype
+ *  field_idx - Field index (0-based) of the field type to retrieve
  * OUTPUTS
- *     datatype - identifier of a copy of the datatype of the field
+ *  datatype - identifier of a copy of the datatype of the field
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
  *  Thursday, February 3, 2000
@@ -1512,7 +1509,7 @@ nh5tget_super_c ( hid_t_f *type_id , hid_t_f *base_type_id)
 */
 
 int_f
-nh5tget_member_type_c ( hid_t_f *type_id ,int_f* field_idx, hid_t_f * datatype)
+h5tget_member_type_c ( hid_t_f *type_id ,int_f* field_idx, hid_t_f * datatype)
 /******/
 {
   int ret_value = -1;
@@ -1531,10 +1528,10 @@ nh5tget_member_type_c ( hid_t_f *type_id ,int_f* field_idx, hid_t_f * datatype)
  * PURPOSE
  *  Call H5Tcreate to create a datatype
  * INPUTS
- *      cls - class type
- *     size - size of the class memeber
+ *  cls - class type
+ *  size - size of the class memeber
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
  *  Thursday, February 17, 2000
@@ -1544,7 +1541,7 @@ nh5tget_member_type_c ( hid_t_f *type_id ,int_f* field_idx, hid_t_f * datatype)
 */
 
 int_f
-nh5tcreate_c(int_f *cls, size_t_f *size, hid_t_f *type_id)
+h5tcreate_c(int_f *cls, size_t_f *size, hid_t_f *type_id)
 /******/
 {
   int ret_value = -1;
@@ -1583,7 +1580,7 @@ nh5tcreate_c(int_f *cls, size_t_f *size, hid_t_f *type_id)
 */
 
 int_f
-nh5tinsert_c(hid_t_f *type_id, _fcd name, int_f* namelen, size_t_f *offset, hid_t_f * field_id)
+h5tinsert_c(hid_t_f *type_id, _fcd name, int_f* namelen, size_t_f *offset, hid_t_f * field_id)
 /******/
 {
   int ret_value = -1;
@@ -1622,7 +1619,7 @@ nh5tinsert_c(hid_t_f *type_id, _fcd name, int_f* namelen, size_t_f *offset, hid_
 */
 
 int_f
-nh5tpack_c(hid_t_f * type_id)
+h5tpack_c(hid_t_f * type_id)
 /******/
 {
   int ret_value = -1;
@@ -1643,12 +1640,12 @@ nh5tpack_c(hid_t_f * type_id)
  * PURPOSE
  *  Call H5Tarray_create2 to create array datatype
  * INPUTS
- *      base_id - identifier of array base datatype
- *              rank - array's rank
- *              dims - Size of new member array
- *              type_id - identifier of the array datatype
+ *  base_id - identifier of array base datatype
+ *  rank - array's rank
+ *  dims - Size of new member array
+ *  type_id - identifier of the array datatype
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
  *  Thursday, November 16, 2000
@@ -1657,7 +1654,7 @@ nh5tpack_c(hid_t_f * type_id)
  * SOURCE
 */
 int_f
-nh5tarray_create_c(hid_t_f * base_id, int_f *rank, hsize_t_f* dims, hid_t_f* type_id)
+h5tarray_create_c(hid_t_f * base_id, int_f *rank, hsize_t_f* dims, hid_t_f* type_id)
 /******/
 {
     hsize_t c_dims[H5S_MAX_RANK];
@@ -1692,7 +1689,7 @@ DONE:
  *  parent_id - Datatype identifier for the base datatype
  * OUTPUTS
  *  new_type_id - datatype identifier for the new
- *                enumeration datatype
+ *  enumeration datatype
  * RETURNS
  *  0 on success, -1 on failure
  * AUTHOR
@@ -1704,7 +1701,7 @@ DONE:
 */
 
 int_f
-nh5tenum_create_c ( hid_t_f *parent_id , hid_t_f *new_type_id)
+h5tenum_create_c ( hid_t_f *parent_id , hid_t_f *new_type_id)
 /******/
 {
   int ret_value = 0;
@@ -1740,7 +1737,7 @@ nh5tenum_create_c ( hid_t_f *parent_id , hid_t_f *new_type_id)
 */
 
 int_f
-nh5tenum_insert_c(hid_t_f *type_id, _fcd name, int_f* namelen, int_f* value)
+h5tenum_insert_c(hid_t_f *type_id, _fcd name, int_f* namelen, int_f* value)
 /******/
 {
   int ret_value = -1;
@@ -1767,24 +1764,24 @@ nh5tenum_insert_c(hid_t_f *type_id, _fcd name, int_f* namelen, int_f* value)
  *  h5tenum_nameof_c
  * PURPOSE
  *  Call H5Tenum_nameof to find the symbol name that corresponds to
- *              the specified value of the enumeration datatype type
+ *  the specified value of the enumeration datatype type
  * INPUTS
- *      type_id - identifier of the datatype
- *              namelen - length of the name
- *              value - value of the enumeration datatype
- * Output:      name  - Name of  the enumeration datatype
+ *  type_id - identifier of the datatype
+ *  namelen - length of the name
+ *  value - value of the enumeration datatype
+ *  Output:      name  - Name of  the enumeration datatype
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Thursday, February 3, 2000
+ *  Thursday, February 3, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tenum_nameof_c(hid_t_f *type_id, int_f* value, _fcd name, size_t_f* namelen)
+h5tenum_nameof_c(hid_t_f *type_id, int_f* value, _fcd name, size_t_f* namelen)
 /******/
 {
   int ret_value = -1;
@@ -1811,24 +1808,24 @@ nh5tenum_nameof_c(hid_t_f *type_id, int_f* value, _fcd name, size_t_f* namelen)
  *  h5tenum_valueof_c
  * PURPOSE
  *  Call H5Tenum_valueof to find the value of that corresponds to
- *              the specified name of the enumeration datatype type
+ *  the specified name of the enumeration datatype type
  * INPUTS
- *      type_id - identifier of the datatype
- *              name - Name of  the enumeration datatype
- *              namelen - length of name
- * Output:      value  - value of the enumeration datatype
+ *  type_id - identifier of the datatype
+ *  name - Name of  the enumeration datatype
+ *  namelen - length of name
+ *  Output:      value  - value of the enumeration datatype
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Thursday, February 3, 2000
+ *  Thursday, February 3, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tenum_valueof_c(hid_t_f *type_id, _fcd name, int_f* namelen, int_f* value)
+h5tenum_valueof_c(hid_t_f *type_id, _fcd name, int_f* namelen, int_f* value)
 /******/
 {
   int ret_value = -1;
@@ -1851,23 +1848,23 @@ nh5tenum_valueof_c(hid_t_f *type_id, _fcd name, int_f* namelen, int_f* value)
  *  h5tget_member_value_c
  * PURPOSE
  *  Call H5Tget_member_value to get the value of an
- *              enumeration datatype member
+ *  enumeration datatype member
  * INPUTS
- *      type_id - identifier of the datatype
- *              member_no - Number of the enumeration datatype member.
- * Output:      value  - value of the enumeration datatype
+ *  type_id - identifier of the datatype
+ *  member_no - Number of the enumeration datatype member.
+ *  Output:      value  - value of the enumeration datatype
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Thursday, February 3, 2000
+ *  Thursday, February 3, 2000
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tget_member_value_c(hid_t_f *type_id, int_f* member_no, int_f* value)
+h5tget_member_value_c(hid_t_f *type_id, int_f* member_no, int_f* value)
 /******/
 {
   int ret_value = -1;
@@ -1886,25 +1883,25 @@ nh5tget_member_value_c(hid_t_f *type_id, int_f* member_no, int_f* value)
  * NAME
  *  h5tset_tag_c
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * PURPOSE
  *  Call H5Tset_tag to set an opaque datatype tag
  * INPUTS
- *      type_id - identifier of the dataspace
- *              tag -  Unique ASCII string with which the opaque
- *                     datatype is to be tagged
- *              namelen - length of tag
+ *  type_id - identifier of the dataspace
+ *  tag -  Unique ASCII string with which the opaque
+ *  datatype is to be tagged
+ *  namelen - length of tag
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
- *              Wednesday, January 26, 2000
+ *  Wednesday, January 26, 2000
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5tset_tag_c(hid_t_f* type_id, _fcd tag, int_f* namelen)
+h5tset_tag_c(hid_t_f* type_id, _fcd tag, int_f* namelen)
 /******/
 {
   int ret_value = -1;
@@ -1929,11 +1926,11 @@ nh5tset_tag_c(hid_t_f* type_id, _fcd tag, int_f* namelen)
  * INPUTS
  *  type_id - identifier of the datatype
  * OUTPUTS
- *      tag -  Unique ASCII string with which the opaque
- *                     datatype is to be tagged
- *   taglen - length of tag
+ *  tag -  Unique ASCII string with which the opaque
+ *  datatype is to be tagged
+ *  taglen - length of tag
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  XIANGYANG SU
  *  Wednesday, January 26, 2000
@@ -1942,7 +1939,7 @@ nh5tset_tag_c(hid_t_f* type_id, _fcd tag, int_f* namelen)
  * SOURCE
 */
 int_f
-nh5tget_tag_c(hid_t_f* type_id, _fcd tag, size_t_f* tag_size, int_f* taglen)
+h5tget_tag_c(hid_t_f* type_id, _fcd tag, size_t_f* tag_size, int_f* taglen)
 /******/
 {
   int ret_value = -1;
@@ -1965,20 +1962,20 @@ nh5tget_tag_c(hid_t_f* type_id, _fcd tag, size_t_f* tag_size, int_f* taglen)
  * PURPOSE
  *  Call H5Tvlen_create to create VL dtatype
  * INPUTS
- *      type_id - identifier of the base datatype
+ *  type_id - identifier of the base datatype
  * OUTPUTS
- *     vltype_id - identifier of the VL datatype
+ *  vltype_id - identifier of the VL datatype
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, October 23, 2002
+ *  Wednesday, October 23, 2002
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5tvlen_create_c(hid_t_f* type_id, hid_t_f *vltype_id)
+h5tvlen_create_c(hid_t_f* type_id, hid_t_f *vltype_id)
 /******/
 {
   int ret_value = -1;
@@ -1997,24 +1994,24 @@ nh5tvlen_create_c(hid_t_f* type_id, hid_t_f *vltype_id)
  *  h5tis_variable_str_c
  * PURPOSE
  *  Call H5Tis_variable_str to detrmine if the datatype
- *              is a variable string.
+ *  is a variable string.
  * INPUTS
- *      type_id - identifier of the dataspace
+ *  type_id - identifier of the dataspace
  * OUTPUTS
- *     flag - 0 if not VL str, 1 if is not
- *              and negative on failure.
+ *  flag - 0 if not VL str, 1 if is not
+ *  and negative on failure.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, March 12 , 2003
+ *  Wednesday, March 12 , 2003
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5tis_variable_str_c ( hid_t_f *type_id , int_f *flag )
+h5tis_variable_str_c ( hid_t_f *type_id , int_f *flag )
 /******/
 {
   int ret_value = 0;
@@ -2034,13 +2031,13 @@ nh5tis_variable_str_c ( hid_t_f *type_id , int_f *flag )
  *  Call H5Tget_member_class to detrmine ithe class of the compound
  *		datatype member
  * INPUTS
- *      type_id - identifier of the dataspace
- *              member_no - member's index
+ *  type_id - identifier of the dataspace
+ *  member_no - member's index
  * OUTPUTS
- *     class - member's class
- *             and negative on failure.
+ *  class - member's class
+ *  and negative on failure.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
  *  Wednesday, April 6, 2005
@@ -2050,7 +2047,7 @@ nh5tis_variable_str_c ( hid_t_f *type_id , int_f *flag )
 */
 
 int_f
-nh5tget_member_class_c ( hid_t_f *type_id ,  int_f *member_no, int_f *cls )
+h5tget_member_class_c ( hid_t_f *type_id ,  int_f *member_no, int_f *cls )
 /******/
 {
   int ret_value = 0;
@@ -2073,12 +2070,12 @@ nh5tget_member_class_c ( hid_t_f *type_id ,  int_f *member_no, int_f *cls )
  * PURPOSE
  *  Call H5Tcommit_anon
  * INPUTS
- *      loc_id - file or group identifier
- *              dtype_id - dataset identifier
- *              tcpl_id - Datatype creation property list
- *              tapl_id - Datatype access property list
+ *  loc_id - file or group identifier
+ *  dtype_id - dataset identifier
+ *  tcpl_id - Datatype creation property list
+ *  tapl_id - Datatype access property list
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
  *  February 25, 2008
@@ -2087,7 +2084,7 @@ nh5tget_member_class_c ( hid_t_f *type_id ,  int_f *member_no, int_f *cls )
  * SOURCE
 */
 int_f
-nh5tcommit_anon_c(hid_t_f *loc_id, hid_t_f *dtype_id,
+h5tcommit_anon_c(hid_t_f *loc_id, hid_t_f *dtype_id,
 		  hid_t_f *tcpl_id, hid_t_f *tapl_id)
 /******/
 {
@@ -2108,10 +2105,10 @@ nh5tcommit_anon_c(hid_t_f *loc_id, hid_t_f *dtype_id,
  *  h5tcommitted_c
  * PURPOSE
  *  Call H5Tcommitted
- *              dtype_id - dataset identifier
+ *  dtype_id - dataset identifier
  * RETURNS
- *     a positive value, for TRUE, if the datatype has been committed,
- *              or 0 (zero), for FALSE, if the datatype has not been committed.
+ *  a positive value, for TRUE, if the datatype has been committed,
+ *  or 0 (zero), for FALSE, if the datatype has not been committed.
  *		Otherwise returns a negative value.
  * AUTHOR
  *  M. Scot Breitenfeld
@@ -2121,7 +2118,7 @@ nh5tcommit_anon_c(hid_t_f *loc_id, hid_t_f *dtype_id,
  * SOURCE
 */
 int_f
-nh5tcommitted_c(hid_t_f *dtype_id)
+h5tcommitted_c(hid_t_f *dtype_id)
 /******/
 {
   int_f ret_value;
@@ -2144,10 +2141,10 @@ nh5tcommitted_c(hid_t_f *dtype_id)
  *		buf     - Buffer for the data space object to be decoded.
  * OUTPUTS
  *
- *              obj_id  - Object_id (non-negative)
+ *  obj_id  - Object_id (non-negative)
  *
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
  *  April 9, 2008
@@ -2157,7 +2154,7 @@ nh5tcommitted_c(hid_t_f *dtype_id)
 */
 
 int_f
-nh5tdecode_c ( _fcd buf, hid_t_f *obj_id )
+h5tdecode_c ( _fcd buf, hid_t_f *obj_id )
 /******/
 {
   int ret_value = -1;
@@ -2187,11 +2184,11 @@ nh5tdecode_c ( _fcd buf, hid_t_f *obj_id )
  *  Call H5Tencode
  * INPUTS
  *
- *            obj_id - Identifier of the object to be encoded.
+ *  obj_id - Identifier of the object to be encoded.
  *		 buf - Buffer for the object to be encoded into.
- *            nalloc - The size of the allocated buffer.
+ *  nalloc - The size of the allocated buffer.
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
  *  April 9, 2008
@@ -2201,7 +2198,7 @@ nh5tdecode_c ( _fcd buf, hid_t_f *obj_id )
 */
 
 int_f
-nh5tencode_c (_fcd buf, hid_t_f *obj_id, size_t_f *nalloc )
+h5tencode_c (_fcd buf, hid_t_f *obj_id, size_t_f *nalloc )
 /******/
 {
   int ret_value = -1;
@@ -2256,11 +2253,11 @@ nh5tencode_c (_fcd buf, hid_t_f *obj_id, size_t_f *nalloc )
  * PURPOSE
  *  Call H5Tget_create_plist
  * INPUTS
- *      dtype_id          - Datatype identifier
+ *  dtype_id          - Datatype identifier
  * OUTPUTS
- *     dtpl_id           - Datatype property list identifier
+ *  dtpl_id           - Datatype property list identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
  *  April 9, 2008
@@ -2270,7 +2267,7 @@ nh5tencode_c (_fcd buf, hid_t_f *obj_id, size_t_f *nalloc )
 */
 
 int_f
-nh5tget_create_plist_c ( hid_t_f *dtype_id,  hid_t_f *dtpl_id)
+h5tget_create_plist_c ( hid_t_f *dtype_id,  hid_t_f *dtpl_id)
 /******/
 {
     int_f ret_value=-1;          /* Return value */
@@ -2289,12 +2286,12 @@ nh5tget_create_plist_c ( hid_t_f *dtype_id,  hid_t_f *dtpl_id)
  *  Call H5Tcompiler_conv
  * INPUTS
  *
- *              src_id - Identifier for the source datatype.
- *              dst_id - Identifier for the destination datatype.
+ *  src_id - Identifier for the source datatype.
+ *  dst_id - Identifier for the destination datatype.
  * OUTPUTS
- *     c_flag - flag; TRUE for compiler conversion, FALSE for library conversion
+ *  c_flag - flag; TRUE for compiler conversion, FALSE for library conversion
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M.Scot Breitenfeld
  *  April 9, 2008
@@ -2304,7 +2301,7 @@ nh5tget_create_plist_c ( hid_t_f *dtype_id,  hid_t_f *dtpl_id)
 */
 
 int_f
-nh5tcompiler_conv_c ( hid_t_f *src_id, hid_t_f *dst_id, int_f *c_flag)
+h5tcompiler_conv_c ( hid_t_f *src_id, hid_t_f *dst_id, int_f *c_flag)
 /******/
 {
   int ret_value = -1;
@@ -2323,12 +2320,12 @@ nh5tcompiler_conv_c ( hid_t_f *src_id, hid_t_f *dst_id, int_f *c_flag)
  *  Call H5Tget_native_type
  * INPUTS
  *
- *              dtype_id         - Datatype identifier for the dataset datatype.
- *              direction        - Direction of search.
+ *  dtype_id         - Datatype identifier for the dataset datatype.
+ *  direction        - Direction of search.
  * OUTPUTS
- *     native_dtype_id  - The native datatype identifier for the specified dataset datatype
+ *  native_dtype_id  - The native datatype identifier for the specified dataset datatype
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  M. Scot Breitenfeld
  *  June 18, 2008
@@ -2338,7 +2335,7 @@ nh5tcompiler_conv_c ( hid_t_f *src_id, hid_t_f *dst_id, int_f *c_flag)
 */
 
 int_f
-nh5tget_native_type_c(hid_t_f *dtype_id, int_f *direction, hid_t_f *native_dtype_id)
+h5tget_native_type_c(hid_t_f *dtype_id, int_f *direction, hid_t_f *native_dtype_id)
 /******/
 {
   int ret_value = -1;
@@ -2424,7 +2421,10 @@ h5tenum_insert_ptr_c(hid_t_f *type_id, _fcd name, int_f* namelen, void *value)
   if (c_name == NULL) return ret_value;
 
   status = H5Tenum_insert( (hid_t)*type_id, c_name, value);
+
+  HDfree(c_name);
   if ( status < 0  ) return ret_value;
+
   ret_value = 0;
   return ret_value;
 }
diff --git a/fortran/src/H5Tff.F90 b/fortran/src/H5Tff.F90
new file mode 100644
index 0000000..6b8f896
--- /dev/null
+++ b/fortran/src/H5Tff.F90
@@ -0,0 +1,3082 @@
+!****h* ROBODoc/H5T
+!
+! NAME
+!  MODULE H5T
+!
+! PURPOSE
+!  This file contains Fortran interfaces for H5T functions.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! NOTES
+!
+!       _____ __  __ _____   ____  _____ _______       _   _ _______
+!      |_   _|  \/  |  __ \ / __ \|  __ \__   __|/\   | \ | |__   __|
+! ****   | | | \  / | |__) | |  | | |__) | | |  /  \  |  \| |  | |    ****
+! ****   | | | |\/| |  ___/| |  | |  _  /  | | / /\ \ | . ` |  | |    ****
+! ****  _| |_| |  | | |    | |__| | | \ \  | |/ ____ \| |\  |  | |    ****
+!      |_____|_|  |_|_|     \____/|_|  \_\ |_/_/    \_\_| \_|  |_|
+!                             
+!  If you add a new function here then you MUST add the function name to the
+!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
+!  This is needed for Windows based operating systems.
+!
+!*****
+
+MODULE H5T
+
+  USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR,  C_CHAR, C_NULL_PTR
+  USE H5GLOBAL
+  IMPLICIT NONE
+
+!****t* H5T/hvl_t
+! Fortran2003 Derived Type:
+  TYPE hvl_t
+     INTEGER(size_t) :: len ! Length of VL data (in base type units)
+     TYPE(C_PTR) :: p       ! Pointer to VL data
+  END TYPE hvl_t
+
+!*****
+
+  INTERFACE h5tenum_insert_f
+     MODULE PROCEDURE h5tenum_insert_f03
+     MODULE PROCEDURE h5tenum_insert_f90
+  END INTERFACE
+
+CONTAINS
+
+!
+!****s* H5T/h5topen_f
+!
+! NAME
+!  h5topen_f
+!
+! PURPOSE
+!  Opens named datatype.
+!
+! INPUTS
+!  loc_id 	 - location identifier
+!  name 	 - a datatype name
+! OUTPUTS
+!  type_id 	 - datatype identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  tapl_id 	 - datatype access property list identifier.
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+!
+!  Added optional parameter 'tapl_id' for compatability
+!  with H5Topen2. April 9, 2009.
+!
+! SOURCE
+  SUBROUTINE h5topen_f(loc_id, name, type_id, hdferr, tapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id 
+    CHARACTER(LEN=*), INTENT(IN) :: name
+    INTEGER(HID_T), INTENT(OUT) :: type_id
+    INTEGER, INTENT(OUT) :: hdferr
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: tapl_id
+!*****
+    INTEGER :: namelen                  ! Name length
+    INTEGER(HID_T) :: tapl_id_default
+
+    INTERFACE
+       INTEGER FUNCTION h5topen_c(loc_id, name, namelen, type_id, tapl_id_default) BIND(C,NAME='h5topen_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), INTENT(IN) :: name
+         INTEGER :: namelen
+         INTEGER(HID_T), INTENT(OUT) :: type_id
+         INTEGER(HID_T) :: tapl_id_default
+       END FUNCTION h5topen_c
+    END INTERFACE
+
+    namelen = LEN(name)
+
+    tapl_id_default = H5P_DEFAULT_F
+    IF(PRESENT(tapl_id)) tapl_id_default = tapl_id
+
+    hdferr = h5topen_c(loc_id, name, namelen, type_id, tapl_id_default)
+  END SUBROUTINE h5topen_f
+!
+!****s* H5T/h5tcommit_f
+!
+! NAME
+!  h5tcommit_f
+!
+! PURPOSE
+!  Commits a transient datatype to a file, creating a
+!  new named datatype.
+!
+! INPUTS
+!  loc_id 	 - location identifier
+!  name 	 - name of the datatype to be stored
+!                  at the specified location
+!  type_id 	 - identifier of a datatype to be stored
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  lcpl_id 	 - Link creation property list
+!  tcpl_id 	 - Datatype creation property list
+!  tapl_id 	 - Datatype access property list
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!   	 - Explicit Fortran interfaces were added for
+!          called C functions (it is needed for Windows
+!          port).  March 7, 2001
+!
+!   	 - Added optional parameters introduced in version 1.8
+!          M. Scot Breitenfeld
+!
+! SOURCE
+  SUBROUTINE h5tcommit_f(loc_id, name, type_id, hdferr, &
+       lcpl_id, tcpl_id, tapl_id  )
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id  ! File or group identifier
+    CHARACTER(LEN=*), INTENT(IN) :: name
+                                  ! Datatype name within file or group
+    INTEGER(HID_T), INTENT(IN) :: type_id  ! Datatype identifier
+    INTEGER, INTENT(OUT) :: hdferr          ! Error code
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lcpl_id ! Link creation property list
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: tcpl_id ! Datatype creation property list
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: tapl_id ! Datatype access property list
+!*****
+
+    INTEGER :: namelen          ! Name length
+
+    INTEGER(HID_T) :: lcpl_id_default
+    INTEGER(HID_T) :: tcpl_id_default
+    INTEGER(HID_T) :: tapl_id_default
+
+    INTERFACE
+       INTEGER FUNCTION h5tcommit_c(loc_id, name, namelen, type_id, &
+            lcpl_id_default, tcpl_id_default, tapl_id_default ) BIND(C,NAME='h5tcommit_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER :: namelen
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER(HID_T) :: lcpl_id_default
+         INTEGER(HID_T) :: tcpl_id_default
+         INTEGER(HID_T) :: tapl_id_default
+       END FUNCTION h5tcommit_c
+    END INTERFACE
+
+    lcpl_id_default = H5P_DEFAULT_F
+    tcpl_id_default = H5P_DEFAULT_F
+    tapl_id_default = H5P_DEFAULT_F
+
+    IF (PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
+    IF (PRESENT(tcpl_id)) tcpl_id_default = tcpl_id
+    IF (PRESENT(tapl_id)) tapl_id_default = tapl_id
+
+    namelen = LEN(name)
+
+    hdferr = h5tcommit_c(loc_id, name, namelen, type_id, &
+         lcpl_id_default, tcpl_id_default, tapl_id_default )
+
+  END SUBROUTINE h5tcommit_f
+!
+!****s* H5T/h5tcopy_f
+!
+! NAME
+!  h5tcopy_f
+!
+! PURPOSE
+!  Creates a copy of exisiting datatype.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+! OUTPUTS
+!  new_type_id 	 - identifier of datatype's copy
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+!
+! SOURCE
+  SUBROUTINE h5tcopy_f(type_id, new_type_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id 
+    INTEGER(HID_T), INTENT(OUT) :: new_type_id
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION  h5tcopy_c(type_id, new_type_id) BIND(C,NAME='h5tcopy_c')
+         IMPORT :: HID_T
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER(HID_T), INTENT(OUT) :: new_type_id
+       END FUNCTION h5tcopy_c
+    END INTERFACE
+    
+    hdferr = h5tcopy_c(type_id, new_type_id)
+  END SUBROUTINE h5tcopy_f
+!
+!****s* H5T/h5tequal_f
+!
+! NAME
+!  h5tequal_f
+!
+! PURPOSE
+!  Determines whether two datatype identifiers refer
+!  to the same datatype.
+!
+! INPUTS
+!  type1_id 	 - datatype identifier
+!  type2_id 	 - datatype identifier
+! OUTPUTS
+!  flag 	 - TRUE/FALSE flag to indicate
+!                  if two datatypes are equal
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tequal_f(type1_id, type2_id, flag, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type1_id
+    INTEGER(HID_T), INTENT(IN) :: type2_id
+    LOGICAL, INTENT(OUT) :: flag
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTEGER :: c_flag
+    INTERFACE
+       INTEGER FUNCTION h5tequal_c(type1_id, type2_id, c_flag) BIND(C,NAME='h5tequal_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type1_id
+         INTEGER(HID_T), INTENT(IN) :: type2_id
+         INTEGER :: c_flag
+       END FUNCTION h5tequal_c
+    END INTERFACE
+    
+    flag = .FALSE.
+    hdferr = h5tequal_c(type1_id, type2_id, c_flag)
+    IF(c_flag .GT. 0) flag = .TRUE.
+  END SUBROUTINE h5tequal_f
+!
+!****s* H5T/h5tclose_f
+!
+! NAME
+!  h5tclose_f
+!
+! PURPOSE
+!  Releases a datatype.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+!
+! SOURCE
+  SUBROUTINE h5tclose_f(type_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tclose_c(type_id) BIND(C,NAME='h5tclose_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+       END FUNCTION h5tclose_c
+    END INTERFACE
+    
+    hdferr = h5tclose_c(type_id)
+  END SUBROUTINE h5tclose_f
+!
+!****s* H5T/h5tget_class_f
+!
+! NAME
+!  h5tget_class_f
+!
+! PURPOSE
+!  Returns the datatype class identifier.
+!
+! INPUTS
+!  type_id - Datatype identifier
+! OUTPUTS
+!  class   - Class, possible values are:
+!            H5T_NO_CLASS_F (-1)
+!            H5T_INTEGER_F  (0)
+!            H5T_FLOAT_F (1)
+!            H5T_TIME_F  (2)
+!            H5T_STRING_F (3)
+!            H5T_BITFIELD_F (4)
+!            H5T_OPAQUE_F (5)
+!            H5T_COMPOUND_F (6)
+!            H5T_REFERENCE_F (7)
+!            H5T_ENUM_F (8)
+!            H5T_VLEN_F (9)
+!            H5T_ARRAY_F (10)  
+!  hdferr  - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+!
+! SOURCE
+  SUBROUTINE h5tget_class_f(type_id, class, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(OUT) :: class         
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_class_c(type_id, class) BIND(C,NAME='h5tget_class_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(OUT) :: class
+       END FUNCTION h5tget_class_c
+    END INTERFACE
+
+    hdferr = h5tget_class_c(type_id, class)
+  END SUBROUTINE h5tget_class_f
+!
+!****s* H5T/h5tget_size_f
+!
+! NAME
+!  h5tget_size_f
+!
+! PURPOSE
+!  Returns the size of a datatype.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+! OUTPUTS
+!  size 	 - datatype size
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+!
+! SOURCE
+  SUBROUTINE h5tget_size_f(type_id, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
+    INTEGER(SIZE_T), INTENT(OUT) :: size ! Datatype size
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_size_c(type_id, size) BIND(C,NAME='h5tget_size_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER(SIZE_T), INTENT(OUT) :: size
+       END FUNCTION h5tget_size_c
+    END INTERFACE
+    
+    hdferr = h5tget_size_c(type_id, size)
+  END SUBROUTINE h5tget_size_f
+
+!
+!****s* H5T/h5tset_size_f
+!
+! NAME
+!  h5tset_size_f
+!
+! PURPOSE
+!  Sets the total size for an atomic datatype.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+!  size 	 - size of the datatype
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+!
+!
+! SOURCE
+  SUBROUTINE h5tset_size_f(type_id, size, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
+    INTEGER(SIZE_T), INTENT(IN) :: size ! Datatype size
+    INTEGER, INTENT(OUT) :: hdferr        ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tset_size_c(type_id, size) BIND(C,NAME='h5tset_size_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER(SIZE_T), INTENT(IN) :: size
+       END FUNCTION h5tset_size_c
+    END INTERFACE
+    
+    hdferr = h5tset_size_c(type_id, size)
+  END SUBROUTINE h5tset_size_f
+
+!
+!****s* H5T/h5tget_order_f
+!
+! NAME
+!  h5tget_order_f
+!
+! PURPOSE
+!  Returns the byte order of an atomic datatype.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+! OUTPUTS
+!  order 	 - byte order for the datatype, possible
+!                  values are:
+!                    H5T_ORDER_LE_F
+!                    H5T_ORDER_BE_F
+!                    H5T_ORDER_VAX_F (not implemented yet)
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+!
+! SOURCE
+  SUBROUTINE h5tget_order_f(type_id, order, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
+    INTEGER, INTENT(OUT) :: order
+                                    ! Datatype byte order, possible values are:
+                                    ! H5T_ORDER_LE_F
+                                    ! H5T_ORDER_BE_F
+                                    ! H5T_ORDER_VAX_F
+    INTEGER, INTENT(OUT) :: hdferr  ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_order_c(type_id, order) BIND(C,NAME='h5tget_order_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(OUT) :: order
+       END FUNCTION h5tget_order_c
+    END INTERFACE
+    
+    hdferr = h5tget_order_c(type_id, order)
+  END SUBROUTINE h5tget_order_f
+!
+!****s* H5T/h5tset_order_f
+!
+! NAME
+!  h5tset_order_f
+!
+! PURPOSE
+!  Sets the byte ordering of an atomic datatype.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+!  order 	 - datatype byte order Possible values are:
+!                    H5T_ORDER_LE_F
+!                    H5T_ORDER_BE_F
+!                    H5T_ORDER_VAX_F (not implemented yet)
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+!
+! SOURCE
+  SUBROUTINE h5tset_order_f(type_id, order, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
+    INTEGER, INTENT(IN) :: order   ! Datatype byte order, possible values
+                                   ! are:
+                                   ! H5T_ORDER_LE_F
+                                   ! H5T_ORDER_BE_F
+                                   ! H5T_ORDER_VAX_F
+    INTEGER, INTENT(OUT) :: hdferr ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tset_order_c(type_id, order) BIND(C,NAME='h5tset_order_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(IN) :: order
+       END FUNCTION h5tset_order_c
+    END INTERFACE
+    
+    hdferr = h5tset_order_c(type_id, order)
+  END SUBROUTINE h5tset_order_f
+
+!
+!****s* H5T/h5tget_precision_f
+!
+! NAME
+!  h5tget_precision_f
+!
+! PURPOSE
+!  Returns the precision of an atomic datatype.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+! OUTPUTS
+!  precision 	 - precision of the datatype
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+!
+! SOURCE
+  SUBROUTINE h5tget_precision_f(type_id, PRECISION, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER(SIZE_T), INTENT(OUT) :: precision
+    INTEGER, INTENT(OUT) :: hdferr        
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_precision_c(type_id, PRECISION) BIND(C,NAME='h5tget_precision_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER(SIZE_T), INTENT(OUT) :: PRECISION
+       END FUNCTION h5tget_precision_c
+    END INTERFACE
+
+    hdferr = h5tget_precision_c(type_id, PRECISION)
+  END SUBROUTINE h5tget_precision_f
+
+!
+!****s* H5T/h5tset_precision_f
+!
+! NAME
+!  h5tset_precision_f
+!
+! PURPOSE
+!  Sets the precision of an atomic datatype.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+!  precision 	 - datatype precision
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+!
+! SOURCE
+  SUBROUTINE h5tset_precision_f(type_id, PRECISION, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER(SIZE_T), INTENT(IN) :: PRECISION 
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tset_precision_c (type_id, PRECISION) BIND(C,NAME='h5tset_precision_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER(SIZE_T), INTENT(IN) :: PRECISION
+       END FUNCTION h5tset_precision_c
+    END INTERFACE
+    
+    hdferr = h5tset_precision_c(type_id, PRECISION)
+  END SUBROUTINE h5tset_precision_f
+
+!
+!****s* H5T/h5tget_offset_f
+!
+! NAME
+!  h5tget_offset_f
+!
+! PURPOSE
+!  Retrieves the bit offset of the first significant bit.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+! OUTPUTS
+!  offset 	 - offset value
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+!
+! SOURCE
+  SUBROUTINE h5tget_offset_f(type_id, offset, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER(SIZE_T), INTENT(OUT) :: offset
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_offset_c(type_id, offset) BIND(C,NAME='h5tget_offset_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER(SIZE_T), INTENT(OUT) :: offset
+       END FUNCTION h5tget_offset_c
+    END INTERFACE
+    
+    hdferr = h5tget_offset_c(type_id, offset)
+  END SUBROUTINE h5tget_offset_f
+  
+!
+!****s* H5T/h5tset_offset_f
+!
+! NAME
+!  h5tset_offset_f
+!
+! PURPOSE
+!  Sets the bit offset of the first significant bit.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+!  offset 	 - offset value
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+!
+! SOURCE
+  SUBROUTINE h5tset_offset_f(type_id, offset, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER(SIZE_T), INTENT(IN) :: offset
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tset_offset_c(type_id, offset) BIND(C,NAME='h5tset_offset_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER(SIZE_T), INTENT(IN) :: offset
+       END FUNCTION h5tset_offset_c
+    END INTERFACE
+    
+    hdferr = h5tset_offset_c(type_id, offset)
+  END SUBROUTINE h5tset_offset_f
+  
+!
+!****s* H5T/h5tget_pad_f
+!
+! NAME
+!  h5tget_pad_f
+!
+! PURPOSE
+!  Retrieves the padding type of the least and
+!  most 	 -significant bit padding.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+! OUTPUTS
+!  lsbpad 	 - least-significant bit padding type
+!  msbpad 	 - most-significant bit padding type
+!                  Possible values of padding type are:
+!                    H5T_PAD_ERROR_F 
+!                    H5T_PAD_ZERO_F
+!                    H5T_PAD_ONE_F
+!                    H5T_PAD_BACKGROUND_F
+!                    H5T_PAD_NPAD_F
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tget_pad_f(type_id, lsbpad, msbpad, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(OUT) :: lsbpad
+    INTEGER, INTENT(OUT) :: msbpad
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_pad_c(type_id, lsbpad, msbpad) BIND(C,NAME='h5tget_pad_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(OUT) :: lsbpad
+         INTEGER, INTENT(OUT) :: msbpad
+       END FUNCTION h5tget_pad_c
+    END INTERFACE
+    
+    hdferr = h5tget_pad_c(type_id, lsbpad, msbpad)
+  END SUBROUTINE h5tget_pad_f
+
+!
+!****s* H5T/h5tset_pad_f
+!
+! NAME
+!  h5tset_pad_f
+!
+! PURPOSE
+!  Sets the least and most-significant bits padding types.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+!  lsbpad 	 - least-significant bit padding type
+!  msbpad 	 - most-significant bit padding type
+!                  Possible values of padding type are:
+!                    H5T_PAD_ERROR_F      = -1
+!                    H5T_PAD_ZERO_F = 0
+!                    H5T_PAD_ONE_F = 1
+!                    H5T_PAD_BACKGROUND_F = 2
+!                    H5T_PAD_NPAD_F      = 3
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tset_pad_f(type_id, lsbpad, msbpad, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(IN) :: lsbpad
+    INTEGER, INTENT(IN) :: msbpad
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tset_pad_c(type_id, lsbpad, msbpad) BIND(C,NAME='h5tset_pad_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(IN) :: lsbpad
+         INTEGER, INTENT(IN) :: msbpad
+       END FUNCTION h5tset_pad_c
+    END INTERFACE
+    
+    hdferr = h5tset_pad_c(type_id, lsbpad, msbpad)
+  END SUBROUTINE h5tset_pad_f
+  
+!
+!****s* H5T/h5tget_sign_f
+!
+! NAME
+!  h5tget_sign_f
+!
+! PURPOSE
+!  Retrieves the sign type for an integer type.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+! OUTPUTS
+!  sign 	 - sign type
+!                  Possible values are:
+!                    - Unsigned integer type 
+!                        H5T_SGN_NONE_F = 0
+!                    - Two's complement signed integer type
+!                        H5T_SGN_2_F = 1
+!                    - error value: H5T_SGN_ERROR_F=-1
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tget_sign_f(type_id, sign, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id 
+    INTEGER, INTENT(OUT) :: sign
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5tget_sign_c(type_id, sign) BIND(C,NAME='h5tget_sign_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(OUT) :: sign
+       END FUNCTION h5tget_sign_c
+    END INTERFACE
+    
+    hdferr = h5tget_sign_c(type_id, sign)
+  END SUBROUTINE h5tget_sign_f
+  
+!
+!****s* H5T/h5tset_sign_f
+!
+! NAME
+!  h5tset_sign_f
+!
+! PURPOSE
+!  Sets the sign proprety for an integer type.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+!  sign 	 - sign type
+!                  Possible values are:
+!                    - Unsigned integer type 
+!                        H5T_SGN_NONE_F = 0
+!                    - Two's complement signed integer type
+!                        H5T_SGN_2_F = 1
+!                    - error value: H5T_SGN_ERROR_F=-1
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tset_sign_f(type_id, sign, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(IN) :: sign
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tset_sign_c(type_id, sign) BIND(C,NAME='h5tset_sign_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(IN) :: sign
+       END FUNCTION h5tset_sign_c
+    END INTERFACE
+    
+    hdferr = h5tset_sign_c(type_id, sign)
+  END SUBROUTINE h5tset_sign_f
+
+!
+!****s* H5T/h5tget_fields_f
+!
+! NAME
+!  h5tget_fields_f
+!
+! PURPOSE
+!  Retrieves floating point datatype bit field information.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+! OUTPUTS
+!  spos 	 - sign bit-position
+!  epos 	 - exponent bit-position
+!  esize 	 - size of exponent in bits
+!  mpos 	 - mantissa position
+!  msize 	 - size of mantissa in bits
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tget_fields_f(type_id, spos, epos, esize, mpos, msize, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER(SIZE_T), INTENT(OUT) :: spos
+    INTEGER(SIZE_T), INTENT(OUT) :: epos
+    INTEGER(SIZE_T), INTENT(OUT) :: esize
+    INTEGER(SIZE_T), INTENT(OUT) :: mpos
+    INTEGER(SIZE_T), INTENT(OUT) :: msize
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5tget_fields_c(type_id, spos, epos, esize, mpos, msize) &
+            BIND(C,NAME='h5tget_fields_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER(SIZE_T), INTENT(OUT) :: spos
+         INTEGER(SIZE_T), INTENT(OUT) :: epos
+         INTEGER(SIZE_T), INTENT(OUT) :: esize
+         INTEGER(SIZE_T), INTENT(OUT) :: mpos
+         INTEGER(SIZE_T), INTENT(OUT) :: msize
+       END FUNCTION h5tget_fields_c
+    END INTERFACE
+    
+    hdferr = h5tget_fields_c(type_id, spos, epos, esize, mpos, msize)
+  END SUBROUTINE h5tget_fields_f
+
+!
+!****s* H5T/h5tset_fields_f
+!
+! NAME
+!  h5tset_fields_f
+!
+! PURPOSE
+!  Sets locations and sizes of floating point bit fields.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+!  spos 	 - sign bit-position
+!  epos 	 - exponent bit-position
+!  esize 	 - size of exponent in bits
+!  mpos 	 - mantissa position
+!  msize 	 - size of mantissa in bits
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tset_fields_f(type_id, spos, epos, esize, mpos, msize, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id 
+    INTEGER(SIZE_T), INTENT(IN) :: spos
+    INTEGER(SIZE_T), INTENT(IN) :: epos
+    INTEGER(SIZE_T), INTENT(IN) :: esize
+    INTEGER(SIZE_T), INTENT(IN) :: mpos
+    INTEGER(SIZE_T), INTENT(IN) :: msize
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5tset_fields_c(type_id, spos, epos, esize, mpos, msize) &
+            BIND(C,NAME='h5tset_fields_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER(SIZE_T), INTENT(IN) :: spos
+         INTEGER(SIZE_T), INTENT(IN) :: epos
+         INTEGER(SIZE_T), INTENT(IN) :: esize
+         INTEGER(SIZE_T), INTENT(IN) :: mpos
+         INTEGER(SIZE_T), INTENT(IN) :: msize
+       END FUNCTION h5tset_fields_c
+    END INTERFACE
+    
+    hdferr = h5tset_fields_c(type_id, spos, epos, esize, mpos, msize)
+  END SUBROUTINE h5tset_fields_f
+  
+!
+!****s* H5T/h5tget_ebias_f
+!
+! NAME
+!  h5tget_ebias_f
+!
+! PURPOSE
+!  Retrieves the exponent bias of a floating-point type.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+! OUTPUTS
+!  ebias 	 - datatype exponent bias
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tget_ebias_f(type_id, ebias, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER(SIZE_T), INTENT(OUT) :: ebias
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    
+    INTERFACE
+       INTEGER FUNCTION h5tget_ebias_c(type_id, ebias) BIND(C,NAME='h5tget_ebias_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER(SIZE_T), INTENT(OUT) :: ebias
+       END FUNCTION h5tget_ebias_c
+    END INTERFACE
+    
+    hdferr = h5tget_ebias_c(type_id, ebias)
+  END SUBROUTINE h5tget_ebias_f
+
+!
+!****s* H5T/h5tset_ebias_f
+!
+! NAME
+!  h5tset_ebias_f
+!
+! PURPOSE
+!  Sets the exponent bias of a floating-point type.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+!  ebias 	 - datatype exponent bias
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tset_ebias_f(type_id, ebias, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER(SIZE_T), INTENT(IN) :: ebias
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tset_ebias_c(type_id, ebias) BIND(C,NAME='h5tset_ebias_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER(SIZE_T), INTENT(IN) :: ebias
+       END FUNCTION h5tset_ebias_c
+    END INTERFACE
+    
+    hdferr = h5tset_ebias_c(type_id, ebias)
+  END SUBROUTINE h5tset_ebias_f
+
+!
+!****s* H5T/h5tget_norm_f
+!
+! NAME
+!  h5tget_norm_f
+!
+! PURPOSE
+!  Retrieves mantissa normalization of a floating-point
+!  datatype.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+! OUTPUTS
+!  norm 	 - normalization types, valid values are:
+!                    H5T_NORM_IMPLIED_F
+!                    H5T_NORM_MSBSET_F
+!                    H5T_NORM_NONE_F
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tget_norm_f(type_id, norm, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(OUT) :: norm
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5tget_norm_c(type_id, norm) BIND(C,NAME='h5tget_norm_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(OUT) :: norm
+       END FUNCTION h5tget_norm_c
+    END INTERFACE
+    
+    hdferr = h5tget_norm_c(type_id, norm)
+  END SUBROUTINE h5tget_norm_f
+
+!
+!****s* H5T/h5tset_norm_f
+!
+! NAME
+!  h5tset_norm_f
+!
+! PURPOSE
+!  Sets the mantissa normalization of a floating-point datatype.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+!  norm 	 - normalization types, valid values are:
+!                    H5T_NORM_IMPLIED_F
+!                    H5T_NORM_MSBSET_F
+!                    H5T_NORM_NONE_F
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+!
+! SOURCE
+  SUBROUTINE h5tset_norm_f(type_id, norm, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(IN) :: norm
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tset_norm_c(type_id, norm) BIND(C,NAME='h5tset_norm_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(IN) :: norm
+       END FUNCTION h5tset_norm_c
+    END INTERFACE
+    
+    hdferr = h5tset_norm_c(type_id, norm)
+  END SUBROUTINE h5tset_norm_f
+
+!
+!****s* H5T/h5tget_inpad_f
+!
+! NAME
+!  h5tget_inpad_f
+!
+! PURPOSE
+!  Retrieves the internal padding type for unused bits
+!  in floating-point datatypes.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+! OUTPUTS
+!  padtype 	 - padding type for unused bits
+!                  Possible values of padding type are:
+!                    H5T_PAD_ZERO_F
+!                    H5T_PAD_ONE_F
+!                    H5T_PAD_BACKGROUND_F
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tget_inpad_f(type_id, padtype, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(OUT) :: padtype
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_inpad_c(type_id, padtype) BIND(C,NAME='h5tget_inpad_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(OUT) :: padtype
+       END FUNCTION h5tget_inpad_c
+    END INTERFACE
+    
+    hdferr = h5tget_inpad_c(type_id, padtype)
+  END SUBROUTINE h5tget_inpad_f
+
+!
+!****s* H5T/h5tset_inpad_f
+!
+! NAME
+!  h5tset_inpad_f
+!
+! PURPOSE
+!  Fills unused internal floating point bits.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+!  padtype 	 - padding type for unused bits
+!                  Possible values of padding type are:
+!                    H5T_PAD_ZERO_F
+!                    H5T_PAD_ONE_F
+!                    H5T_PAD_BACKGROUND_F
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tset_inpad_f(type_id, padtype, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(IN) :: padtype
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tset_inpad_c(type_id, padtype) BIND(C,NAME='h5tset_inpad_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(IN) :: padtype
+       END FUNCTION h5tset_inpad_c
+    END INTERFACE
+    
+    hdferr = h5tset_inpad_c(type_id, padtype)
+  END SUBROUTINE h5tset_inpad_f
+
+!
+!****s* H5T/h5tget_cset_f
+!
+! NAME
+!  h5tget_cset_f
+!
+! PURPOSE
+!  Retrieves the character set type of a string datatype.
+!
+! INPUTS
+!  type_id  - Datatype identifier
+! OUTPUTS
+!  cset     - Character set type of a string datatype
+!              Possible values are:
+!                H5T_CSET_ASCII_F
+!                H5T_CSET_UTF8_F
+!  hdferr   - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tget_cset_f(type_id, cset, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(OUT) :: cset
+    INTEGER, INTENT(OUT) :: hdferr ! Error code
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_cset_c(type_id, cset) BIND(C,NAME='h5tget_cset_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(OUT) :: cset
+       END FUNCTION h5tget_cset_c
+    END INTERFACE
+    
+    hdferr = h5tget_cset_c(type_id, cset)
+  END SUBROUTINE h5tget_cset_f
+
+!
+!****s* H5T/h5tset_cset_f
+!
+! NAME
+!  h5tset_cset_f
+!
+! PURPOSE
+!  Sets character set to be used.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+!  cset 	 - character set type of a string datatype
+!                    Possible values are:
+!                     H5T_CSET_ASCII_F
+!                     H5T_CSET_UTF8_F
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tset_cset_f(type_id, cset, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(IN) :: cset
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tset_cset_c(type_id, cset) BIND(C,NAME='h5tset_cset_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(IN) :: cset
+       END FUNCTION h5tset_cset_c
+    END INTERFACE
+    
+    hdferr = h5tset_cset_c(type_id, cset)
+  END SUBROUTINE h5tset_cset_f
+!
+!****s* H5T/h5tget_strpad_f
+!
+! NAME
+!  h5tget_strpad_f
+!
+! PURPOSE
+!  Retrieves the storage mechanism for a string datatype.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+! OUTPUTS
+!  strpad 	 - storage method for a string datatype
+!                  Possible values are:
+!                    H5T_STR_NULLTERM_F,
+!                    H5T_STR_NULLPAD_F,
+!                    H5T_STR_SPACEPAD_F
+!                    H5T_STR_ERROR_F
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tget_strpad_f(type_id, strpad, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(OUT) :: strpad
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_strpad_c(type_id, strpad) BIND(C,NAME='h5tget_strpad_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(OUT) :: strpad
+       END FUNCTION h5tget_strpad_c
+    END INTERFACE
+    
+    hdferr = h5tget_strpad_c(type_id, strpad)
+  END SUBROUTINE h5tget_strpad_f
+
+!
+!****s* H5T/h5tset_strpad_f
+!
+! NAME
+!  h5tset_strpad_f
+!
+! PURPOSE
+!  Defines the storage mechanism for character strings.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+!  strpad 	 - storage method for a string datatype
+!                  Possible values are:
+!                    H5T_STR_NULLTERM_F,
+!                    H5T_STR_NULLPAD_F,
+!                    H5T_STR_SPACEPAD_F,
+!                    H5T_STR_ERROR_F.
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tset_strpad_f(type_id, strpad, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(IN) :: strpad
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tset_strpad_c(type_id, strpad) BIND(C,NAME='h5tset_strpad_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(IN) :: strpad
+       END FUNCTION h5tset_strpad_c
+    END INTERFACE
+
+    hdferr = h5tset_strpad_c(type_id, strpad)
+  END SUBROUTINE h5tset_strpad_f
+
+!
+!****s* H5T/h5tget_nmembers_f
+!
+! NAME
+!  h5tget_nmembers_f
+!
+! PURPOSE
+!  Retrieves the number of fields in a compound datatype.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+! OUTPUTS
+!  num_members 	 - number of members
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+!
+! SOURCE
+  SUBROUTINE h5tget_nmembers_f(type_id, num_members, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(OUT) :: num_members
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_nmembers_c(type_id, num_members) BIND(C,NAME='h5tget_nmembers_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(OUT) :: num_members
+       END FUNCTION h5tget_nmembers_c
+    END INTERFACE
+    
+    hdferr = h5tget_nmembers_c(type_id, num_members)
+  END SUBROUTINE h5tget_nmembers_f
+
+!
+!****s* H5T/h5tget_member_name_f
+!
+! NAME
+!  h5tget_member_name_f
+!
+! PURPOSE
+!  Retrieves the name of a field of a compound datatype.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+!  index 	 - filed index (0-based)
+! OUTPUTS
+!  member_name 	 - buffer to hold member's name
+!  namelen 	 - name length
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tget_member_name_f(type_id, index, member_name,  namelen, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(IN) :: index
+    CHARACTER(LEN=*), INTENT(OUT) :: member_name
+    INTEGER, INTENT(OUT) :: namelen
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_member_name_c(type_id, index, member_name, namelen) BIND(C,NAME='h5tget_member_name_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(IN) :: index
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: member_name
+         INTEGER, INTENT(OUT) :: namelen
+       END FUNCTION h5tget_member_name_c
+    END INTERFACE
+    
+    hdferr = h5tget_member_name_c(type_id, index, member_name, namelen)
+  END SUBROUTINE h5tget_member_name_f
+
+!
+!****s* H5T/h5tget_member_offset_f
+!
+! NAME
+!  h5tget_member_offset_f
+!
+! PURPOSE
+!  Retrieves the offset of a field of a compound datatype.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+!  member_no 	 - number of the field
+! OUTPUTS
+!  offset 	 - byte offset of the requested field
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tget_member_offset_f(type_id, member_no, offset, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(IN) :: member_no
+    INTEGER(SIZE_T), INTENT(OUT) :: offset
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_member_offset_c(type_id, member_no, offset ) BIND(C,NAME='h5tget_member_offset_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(IN) :: member_no
+         INTEGER(SIZE_T), INTENT(OUT) :: offset
+       END FUNCTION h5tget_member_offset_c
+    END INTERFACE
+    
+    hdferr = h5tget_member_offset_c(type_id, member_no, offset )
+  END SUBROUTINE h5tget_member_offset_f
+!
+!****s* H5T/h5tget_member_index_f
+!
+! NAME
+!  h5tget_member_index_f
+!
+! PURPOSE
+!  Retrieves the index of a compound or enumeration datatype member.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+!  name 	 - name of the field or member whose index to
+!  to be retrieved from the datatype.
+! OUTPUTS
+!  index 	 - 0-based index of the filed or member (0 to N-1)
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  September 26, 2002
+!
+! SOURCE
+  SUBROUTINE h5tget_member_index_f(type_id, name, index, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    CHARACTER(LEN=*), INTENT(IN) :: name
+    INTEGER, INTENT(OUT) :: index
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTEGER :: namelen          ! Name length
+
+    INTERFACE
+       INTEGER FUNCTION h5tget_member_index_c(type_id, name, namelen, index) BIND(C,NAME='h5tget_member_index_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER, INTENT(IN)  :: namelen
+         INTEGER, INTENT(OUT) :: index
+       END FUNCTION h5tget_member_index_c
+    END INTERFACE
+    
+    namelen = LEN(name)
+    hdferr = h5tget_member_index_c(type_id, name, namelen, index)
+  END SUBROUTINE h5tget_member_index_f
+  
+
+!  !$!
+!  !$!****s* H5T/h5tget_member_dim_f
+!  !$!
+!  !$! NAME
+!  !$!		h5tget_member_dim_f
+!  !$!
+!  !$! PURPOSE
+!  !$! 	This function is not supported in hdf5-1.4.*
+!  !$!
+!  !$! INPUTS
+!  !$! OUTPUTS
+!  !$!		hdferr:		- error code
+!  !$!				 	Success:  0
+!  !$!				 	Failure: -1
+!  !$!
+!  !$! AUTHOR
+!  !$!	Elena Pourmal
+!  !$!		August 12, 1999
+!  !$!
+!  !$! HISTORY
+!  !$! 	Explicit Fortran interfaces were added for
+!  !$!			called C functions (it is needed for Windows
+!  !$!			port).  March 7, 2001
+!  !$!
+!  !$! SOURCE
+!  !$!  SUBROUTINE h5tget_member_dims_f(type_id, field_idx,dims, field_dims, perm, hdferr)
+!  !$!
+!  !$!            IMPLICIT NONE
+!  !$!            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
+!  !$!            INTEGER, INTENT(IN) :: field_idx !Field index (0-based) of
+!  !$!                                             !field_dims, perm)
+!  !$!            INTEGER, INTENT(OUT) :: dims     !number of dimensions of the field
+!  !$!
+!  !$!            INTEGER(SIZE_T),DIMENSION(*), INTENT(OUT) ::  field_dims !buffer to store the
+!  !$!                                                                      !dimensions of the field
+!  !$!            INTEGER, DIMENSION(*), INTENT(OUT)  ::  perm  !buffer to store the
+!  !$!                                                                   !permutation vector of the field
+!  !$!            INTEGER, INTENT(OUT) :: hdferr        ! Error code
+!  !$!*****!
+!  !$! INTEGER, EXTERNAL :: h5tget_member_dims_c
+!  !$!            hdferr = h5tget_member_dims_c(type_id, field_idx, dims, field_dims, perm)
+!  !$!
+!  !$!          END SUBROUTINE h5tget_member_dims_f
+
+
+!****s* H5T/h5tget_array_dims_f
+!
+! NAME
+!  h5tget_array_dims_f
+!
+! PURPOSE
+!  Returns sizes of array dimensions.
+!
+! INPUTS
+!  type_id 	 - array datatype identifier
+! OUTPUTS
+!  dims 	 - buffer to store array datatype dimensions
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tget_array_dims_f(type_id, dims, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER(HSIZE_T),DIMENSION(*), INTENT(OUT) :: dims
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_array_dims_c(type_id, dims) BIND(C,NAME='h5tget_array_dims_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER(HSIZE_T),DIMENSION(*), INTENT(OUT) ::  dims
+       END FUNCTION h5tget_array_dims_c
+    END INTERFACE
+    
+    hdferr = h5tget_array_dims_c(type_id, dims)
+    
+  END SUBROUTINE h5tget_array_dims_f
+
+!
+!****s* H5T/h5tget_array_ndims_f
+!
+! NAME
+!  h5tget_array_ndims_f
+!
+! PURPOSE
+!  Returns the rank of an array datatype.
+!
+! INPUTS
+!  type_id 	 - array datatype identifier
+! OUTPUTS
+!  ndims 	 - number of array dimensions
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tget_array_ndims_f(type_id, ndims, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(OUT) :: ndims
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_array_ndims_c(type_id, ndims) BIND(C,NAME='h5tget_array_ndims_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(OUT) ::  ndims
+       END FUNCTION h5tget_array_ndims_c
+    END INTERFACE
+    
+    hdferr = h5tget_array_ndims_c(type_id, ndims)
+    
+  END SUBROUTINE h5tget_array_ndims_f
+
+!
+!****s* H5T/h5tget_super_f
+!
+! NAME
+!  h5tget_super_f
+!
+! PURPOSE
+!  Returns the base datatype from which a datatype is derived.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+! OUTPUTS
+!  base_type_id  - identifier of the base type
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tget_super_f(type_id, base_type_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER(HID_T), INTENT(OUT) :: base_type_id
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_super_c(type_id, base_type_id) BIND(C,NAME='h5tget_super_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER(HID_T), INTENT(OUT) :: base_type_id
+       END FUNCTION h5tget_super_c
+    END INTERFACE
+    
+    hdferr = h5tget_super_c(type_id, base_type_id)
+    
+  END SUBROUTINE h5tget_super_f
+
+!
+!****s* H5T/h5tget_member_type_f
+!
+! NAME
+!  h5tget_member_type_f
+!
+! PURPOSE
+!  Returns the datatype of the specified member.
+!
+! INPUTS
+!  type_id 	 - compound datatype identifier
+!  field_idx 	 - field index (0-based)
+!
+! OUTPUTS
+!  datatype 	 - identifier of the member's datatype
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tget_member_type_f(type_id,  field_idx, datatype, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(IN) :: field_idx
+    INTEGER(HID_T), INTENT(OUT) :: datatype
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_member_type_c(type_id, field_idx , datatype) &
+            BIND(C,NAME='h5tget_member_type_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(IN) :: field_idx
+         INTEGER(HID_T), INTENT(OUT) :: datatype
+       END FUNCTION h5tget_member_type_c
+    END INTERFACE
+    
+    hdferr = h5tget_member_type_c(type_id, field_idx , datatype)
+  END SUBROUTINE h5tget_member_type_f
+
+!
+!****s* H5T/h5tcreate_f
+!
+! NAME
+!  h5tcreate_f
+!
+! PURPOSE
+!  Creates a new datatype.
+!
+! INPUTS
+!  class   - Datatype class can be one of:
+!             H5T_COMPOUND_F
+!             H5T_ENUM_F
+!             H5T_OPAQUE_F
+!             H5T_STRING_F
+!
+!  size    - Size of the datatype.
+! OUTPUTS
+!  type_id - Datatype identifier.
+!  hdferr  - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tcreate_f(class, size, type_id, hdferr)
+    IMPLICIT NONE
+    INTEGER        , INTENT(IN)  :: class
+    INTEGER(SIZE_T), INTENT(IN)  :: size
+    INTEGER(HID_T) , INTENT(OUT) :: type_id
+    INTEGER        , INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tcreate_c(class, size, type_id) BIND(C,NAME='h5tcreate_c')
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER, INTENT(IN) :: class
+         INTEGER(SIZE_T), INTENT(IN) :: size
+         INTEGER(HID_T), INTENT(OUT) :: type_id
+       END FUNCTION h5tcreate_c
+    END INTERFACE
+
+    hdferr = h5tcreate_c(class, size, type_id)
+  END SUBROUTINE h5tcreate_f
+
+!
+!****s* H5T/h5tinsert_f
+!
+! NAME
+!  h5tinsert_f
+!
+! PURPOSE
+!  Adds a new member to a compound datatype.
+!
+! INPUTS
+!  type_id 	 - compound datatype identifier
+!  name 	 - name of the field to insert
+!  offset 	 - start of the member in an instance of
+!                  the compound datatype
+!  field_id 	 - datatype identifier of the field to insert
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tinsert_f(type_id,  name, offset, field_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    CHARACTER(LEN=*), INTENT(IN) :: name 
+    INTEGER(SIZE_T), INTENT(IN) :: offset
+    INTEGER(HID_T), INTENT(IN) :: field_id
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTEGER :: namelen
+
+    INTERFACE
+       INTEGER FUNCTION h5tinsert_c(type_id, name, namelen, offset, field_id) BIND(C,NAME='h5tinsert_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER(SIZE_T), INTENT(IN) :: offset
+         INTEGER(HID_T), INTENT(IN) :: field_id
+         INTEGER :: namelen
+       END FUNCTION h5tinsert_c
+    END INTERFACE
+            
+    namelen = LEN(name)
+    hdferr = h5tinsert_c(type_id, name, namelen, offset, field_id )
+  END SUBROUTINE h5tinsert_f
+  
+!
+!****s* H5T/h5tpack_f
+!
+! NAME
+!  h5tpack_f
+!
+! PURPOSE
+!  Recursively removes padding from within a compound datatype.
+!
+! INPUTS
+!  type_id 	 - compound datatype identifier
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tpack_f(type_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tpack_c(type_id) BIND(C,NAME='h5tpack_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+       END FUNCTION h5tpack_c
+    END INTERFACE
+    
+    hdferr = h5tpack_c(type_id)
+  END SUBROUTINE h5tpack_f
+  
+!  !$!
+!  !$!****s* H5T/h5tinsert_array_f
+!  !$!
+!  !$! NAME
+!  !$!		h5tinsert_array_f
+!  !$!
+!  !$! PURPOSE
+!  !$! 	This function is not available on hdf5-1.4.*
+!  !$!
+!  !$! INPUTS
+!  !$! OUTPUTS
+!  !$!		hdferr:		- error code
+!  !$!				 	Success:  0
+!  !$!				 	Failure: -1
+!  !$!
+!  !$! AUTHOR
+!  !$!	Elena Pourmal
+!  !$!		August 12, 1999
+!  !$!
+!  !$! HISTORY
+!  !$! 	Explicit Fortran interfaces were added for
+!  !$!			called C functions (it is needed for Windows
+!  !$!			port).  March 7, 2001
+!  !$! SOURCE
+!  SUBROUTINE h5tinsert_array_f(parent_id,name,offset, ndims, dims, member_id, hdferr, perm)
+!  IMPLICIT NONE
+!  INTEGER(HID_T), INTENT(IN) :: parent_id ! identifier of the parent compound datatype
+!  CHARACTER(LEN=*), INTENT(IN) :: name !Name of the new member
+!  INTEGER(SIZE_T), INTENT(IN) :: offset !Offset to start of new member
+!  !within compound datatype
+!  INTEGER, INTENT(IN) ::  ndims !Dimensionality of new member.
+!  !Valid values are 0 (zero) through 4 (four)
+!  INTEGER(SIZE_T), DIMENSION(*), INTENT(IN) :: dims !Size of new member array
+!  INTEGER(HID_T), INTENT(IN) :: member_id ! identifier of the datatype of the new member
+!  INTEGER, INTENT(OUT) :: hdferr        ! Error code
+!  !*****!
+!  INTEGER, DIMENSION(*), OPTIONAL, INTENT(IN) :: perm
+!  !Pointer to buffer to store
+!  !the permutation vector of the field
+!  INTEGER :: namelen, sizeofperm
+!  INTEGER, EXTERNAL :: h5tinsert_array_c,  h5tinsert_array_c2
+!  namelen = LEN(name)
+!  if (present(perm)) then
+!  hdferr = h5tinsert_array_c(parent_id, name, namelen, offset, ndims,dims, member_id, perm)
+!  else
+!  hdferr = h5tinsert_array_c2(parent_id, name, namelen, offset, ndims,dims, member_id)
+!  end if
+!
+!  END SUBROUTINE h5tinsert_array_f
+
+!
+!****s* H5T/h5tarray_create_f
+!
+! NAME
+!  h5tarray_create_f
+!
+! PURPOSE
+!  Creates an array datatype object.
+!
+! INPUTS
+!  base_id 	 - datatype identifier for the array
+!                  base datatype
+!  rank 	 - rank of the array
+!  dims 	 - array dimension sizes
+! OUTPUTS
+!  type_id 	 - array datatype identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tarray_create_f(base_id, rank, dims, type_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: base_id
+    INTEGER, INTENT(IN) ::  rank
+    INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: dims
+    INTEGER(HID_T), INTENT(OUT) :: type_id
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tarray_create_c(base_id, rank, dims, type_id) BIND(C,NAME='h5tarray_create_c')
+         IMPORT :: HID_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: base_id
+         INTEGER, INTENT(IN) ::  rank
+         INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: dims
+         INTEGER(HID_T), INTENT(OUT) :: type_id
+       END FUNCTION h5tarray_create_c
+    END INTERFACE
+    
+    hdferr = h5tarray_create_c(base_id, rank, dims, type_id)
+    
+  END SUBROUTINE h5tarray_create_f
+
+!
+!****s* H5T/h5tenum_create_f
+!
+! NAME
+!  h5tenum_create_f
+!
+! PURPOSE
+!  Creates a new enumeration datatype.
+!
+! INPUTS
+!  parent_id 	 - datatype identifier for base datatype
+! OUTPUTS
+!  new_type_id 	 - datatype identifier for the enumeration datatype
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tenum_create_f(parent_id, new_type_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: parent_id
+    INTEGER(HID_T), INTENT(OUT) :: new_type_id
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5tenum_create_c(parent_id, new_type_id) BIND(C,NAME='h5tenum_create_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: parent_id
+         INTEGER(HID_T), INTENT(OUT) :: new_type_id
+       END FUNCTION h5tenum_create_c
+    END INTERFACE
+    
+    hdferr = h5tenum_create_c(parent_id, new_type_id)
+  END SUBROUTINE h5tenum_create_f
+!
+!****s* H5T/h5tenum_nameof_f
+!
+! NAME
+!  h5tenum_nameof_f
+!
+! PURPOSE
+!  Returns the symbol name corresponding to a specified
+!  member of an enumeration datatype.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+!  value 	 - value of the enumeration datatype
+!  namelen 	 - name buffer size
+! OUTPUTS
+!  name 	 - buffer to hold symbol name
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+!
+! NOTE
+!   According to the standard: Because an INTENT(OUT) variable is considered undefined 
+!   on entry to the procedure, any default initialization specified for its type will 
+!   be applied. So we need to blank out the "name" to be portable and eliminate any 
+!   characters the "name' may contain upon entry, depending on compiler implementation.
+! SOURCE
+  SUBROUTINE h5tenum_nameof_f(type_id,  value, namelen, name, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    CHARACTER(LEN=*), INTENT(OUT) :: name
+    INTEGER(SIZE_T), INTENT(IN) :: namelen
+    INTEGER, INTENT(IN) :: value
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tenum_nameof_c(type_id, value, name, namelen) BIND(C,NAME='h5tenum_nameof_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: name
+         INTEGER(SIZE_T), INTENT(IN) :: namelen
+         INTEGER, INTENT(IN) :: value
+       END FUNCTION h5tenum_nameof_c
+    END INTERFACE
+    
+    name(1:LEN(name)) = ' '
+
+    hdferr = h5tenum_nameof_c(type_id, value, name, namelen)
+  END SUBROUTINE h5tenum_nameof_f
+!
+!****s* H5T/h5tenum_valuof_f
+!
+! NAME
+!  h5tenum_valuof_f
+!
+! PURPOSE
+!  Returns the value corresponding to a specified
+!  member of an enumeration datatype.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+!  name 	 - symbol name
+! OUTPUTS
+!  value 	 - value of the enumeration datatype
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+!
+! SOURCE
+  SUBROUTINE h5tenum_valueof_f(type_id,  name, value, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    CHARACTER(LEN=*), INTENT(IN) :: name
+    INTEGER, INTENT(OUT) :: value
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTEGER :: namelen
+
+    INTERFACE
+       INTEGER FUNCTION h5tenum_valueof_c(type_id, name, namelen,  value) &
+            BIND(C,NAME='h5tenum_valueof_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER, INTENT(IN) :: namelen
+         INTEGER, INTENT(OUT) :: value
+       END FUNCTION h5tenum_valueof_c
+    END INTERFACE
+    
+    namelen = LEN(name)
+    hdferr = h5tenum_valueof_c(type_id, name, namelen,  value)
+  END SUBROUTINE h5tenum_valueof_f
+
+!
+!****s* H5T/h5tget_member_value_f
+!
+! NAME
+!  h5tget_member_value_f
+!
+! PURPOSE
+!  Returns the value of an enumeration datatype member.
+!
+! INPUTS
+!  type_id 	 - datatype identifier
+!  member_no 	 - number of the enumeration datatype member
+! OUTPUTS
+!  value 	 - value of the enumeration datatype
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tget_member_value_f(type_id,  member_no, value, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(IN) :: member_no
+    INTEGER, INTENT(OUT) :: value
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_member_value_c(type_id, member_no, value) &
+            BIND(C,NAME='h5tget_member_value_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(IN) :: member_no
+         INTEGER, INTENT(OUT) :: value
+       END FUNCTION h5tget_member_value_c
+    END INTERFACE
+    
+    hdferr = h5tget_member_value_c(type_id, member_no, value)
+  END SUBROUTINE h5tget_member_value_f
+          
+!
+!****s* H5T/h5tset_tag_f
+!
+! NAME
+!  h5tset_tag_f
+!
+! PURPOSE
+!  Tags an opaque datatype.
+!
+! INPUTS
+!  type_id 	 - identifier for opaque datatype
+!  tag 	         - unique ASCII string with which the opaque
+!                  datatype is to be tagged.
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tset_tag_f(type_id, tag, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    CHARACTER(LEN=*), INTENT(IN) :: tag
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTEGER :: taglen
+    
+    INTERFACE
+       INTEGER FUNCTION h5tset_tag_c(type_id, tag, taglen) BIND(C,NAME='h5tset_tag_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: tag
+         INTEGER :: taglen
+       END FUNCTION h5tset_tag_c
+    END INTERFACE
+    
+    taglen = LEN(tag)
+    hdferr = h5tset_tag_c(type_id, tag, taglen)
+  END SUBROUTINE h5tset_tag_f
+  
+!
+!****s* H5T/h5tget_tag_f
+!
+! NAME
+!  h5tget_tag_f
+!
+! PURPOSE
+!  Gets the tag associated with an opaque datatype.
+!
+! INPUTS
+!  type_id 	 - identifier for opaque datatype
+! OUTPUTS
+!  tag 	         - unique ASCII string associated with opaque
+!                  datatype
+!  taglen        - Length of tag
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tget_tag_f(type_id, tag,taglen, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    CHARACTER(LEN=*), INTENT(OUT) :: tag
+    INTEGER, INTENT(OUT) :: taglen
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTEGER(SIZE_T):: tag_size      ! Declared character length of tab 
+    INTERFACE
+       INTEGER FUNCTION h5tget_tag_c(type_id, tag, tag_size, taglen) &
+            BIND(C,NAME='h5tget_tag_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: tag
+         INTEGER(SIZE_T), INTENT(IN) :: tag_size
+         INTEGER, INTENT(OUT) :: taglen
+       END FUNCTION h5tget_tag_c
+    END INTERFACE
+    
+    tag_size = LEN(tag)
+    hdferr = h5tget_tag_c(type_id, tag, tag_size, taglen )
+  END SUBROUTINE h5tget_tag_f
+  
+!
+!****s* H5T/h5tvlen_create_f
+!
+! NAME
+!  h5tvlen_create_f
+!
+! PURPOSE
+!  Creates a new variable-length datatype.
+!
+! INPUTS
+!  type_id 	 - identifier iof base datatype
+! OUTPUTS
+!  vltype_id 	 - identifier for VL datatype
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  Wednesday, October 23, 2002
+!
+! NOTES
+!  Only basic Fortran base datatypes are supported
+!
+! SOURCE
+  SUBROUTINE h5tvlen_create_f(type_id, vltype_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN)  :: type_id
+    INTEGER(HID_T), INTENT(OUT) :: vltype_id
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tvlen_create_c(type_id, vltype_id) BIND(C,NAME='h5tvlen_create_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN)  :: type_id
+         INTEGER(HID_T), INTENT(OUT) :: vltype_id
+       END FUNCTION h5tvlen_create_c
+    END INTERFACE
+    
+    hdferr = h5tvlen_create_c(type_id, vltype_id)
+  END SUBROUTINE h5tvlen_create_f
+
+!
+!****s* H5T/h5tis_variable_str_f
+!
+! NAME
+!  h5tis_variable_str_f
+!
+! PURPOSE
+!  Determines whether a dattype is a variable string.
+!
+! INPUTS
+!  type_id 	 - datartpe identifier
+! OUTPUTS
+!  status 	 - flag to indicate if datatype
+!                  is a variable string ( TRUE or FALSE)
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  March 12, 2003
+!
+! SOURCE
+  SUBROUTINE h5tis_variable_str_f(type_id, status, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    LOGICAL, INTENT(OUT) :: status 
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTEGER :: flag                     ! "TRUE/FALSE/ERROR from C"
+    
+    INTERFACE
+       INTEGER FUNCTION h5tis_variable_str_c(type_id, flag) &
+            BIND(C,NAME='h5tis_variable_str_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER :: flag
+       END FUNCTION h5tis_variable_str_c
+    END INTERFACE
+    
+    hdferr = h5tis_variable_str_c(type_id, flag)
+    status = .TRUE.
+    IF (flag .EQ. 0) status = .FALSE.
+    
+  END SUBROUTINE h5tis_variable_str_f
+  
+!
+!****s* H5T/h5tget_member_class_f
+!
+! NAME
+!  h5tget_member_class_f
+!
+! PURPOSE
+!  Returns datatype class of compound datatype member.
+!
+! INPUTS
+!  type_id 	 - datartpe identifier
+!  member_no 	 - index of compound datatype member
+! OUTPUTS
+!  class 	 - class type for compound dadtype member
+!                  Valid classes:
+!                    H5T_NO_CLASS_F (error)
+!                    H5T_INTEGER_F
+!                    H5T_FLOAT_F
+!                    H5T_TIME_F
+!                    H5T_STRING_F
+!                    H5T_BITFIELD_F
+!                    H5T_OPAQUE_F
+!                    H5T_COMPOUND_F
+!                    H5T_REFERENCE_F
+!                    H5T_ENUM_F
+!                    H5T_VLEN_F
+!                    H5T_ARRAY_F
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  April 6, 2005
+!
+! SOURCE
+  SUBROUTINE h5tget_member_class_f(type_id, member_no, class, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    INTEGER, INTENT(IN)       :: member_no
+    INTEGER, INTENT(OUT)     :: class
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_member_class_c(type_id, member_no, class) &
+            BIND(C,NAME='h5tget_member_class_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         INTEGER, INTENT(IN)       :: member_no
+         INTEGER, INTENT(OUT)     :: class
+       END FUNCTION h5tget_member_class_c
+    END INTERFACE
+
+    hdferr = h5tget_member_class_c(type_id, member_no, class)
+
+  END SUBROUTINE h5tget_member_class_f
+
+!
+!****s* H5T/h5tcommit_anon_f
+!
+! NAME
+!  h5tcommit_anon_f
+!
+! PURPOSE
+!  Commits a transient datatype to a file,
+!  creating a new named datatype,
+!  but does not link it into the file structure.
+!
+! INPUTS
+!  loc_id 	 - A file or group identifier specifying the file
+!                  in which the new named datatype is to be created.
+!  dtype_id 	 - A datatype identifier.
+!
+! OUTPUTS
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! OPTIONAL PARAMETERS
+!  tcpl_id 	 - A datatype creation property list identifier.
+!                  (H5P_DEFAULT_F for the default property list.)
+!  tapl_id 	 - A datatype access property list identifier.
+!                  should always be passed as the value H5P_DEFAULT_F.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 25, 2008
+!
+! SOURCE
+  SUBROUTINE h5tcommit_anon_f(loc_id, dtype_id, hdferr, tcpl_id, tapl_id)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: loc_id
+    INTEGER(HID_T), INTENT(IN) :: dtype_id
+    INTEGER, INTENT(OUT) :: hdferr
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: tcpl_id
+    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: tapl_id
+!*****
+    INTEGER(HID_T) :: tcpl_id_default
+    INTEGER(HID_T) :: tapl_id_default
+
+    INTERFACE
+       INTEGER FUNCTION h5tcommit_anon_c(loc_id, dtype_id, &
+            tcpl_id_default, tapl_id_default) BIND(C,NAME='h5tcommit_anon_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: loc_id
+         INTEGER(HID_T), INTENT(IN) :: dtype_id
+         INTEGER(HID_T) :: tcpl_id_default
+         INTEGER(HID_T) :: tapl_id_default
+       END FUNCTION h5tcommit_anon_c
+    END INTERFACE
+
+    tcpl_id_default = H5P_DEFAULT_F
+    tapl_id_default = H5P_DEFAULT_F
+
+    IF(PRESENT(tcpl_id)) tcpl_id_default = tcpl_id
+    IF(PRESENT(tapl_id)) tapl_id_default = tapl_id
+
+    hdferr = h5tcommit_anon_c(loc_id, dtype_id, &
+         tcpl_id_default, tapl_id_default )
+
+  END SUBROUTINE h5tcommit_anon_f
+
+!
+!****s* H5T/h5tcommitted_f
+!
+! NAME
+!  h5tcommitted_f
+!
+! PURPOSE
+!  Determines whether a datatype is a named type or a transient type.
+!
+! INPUTS
+!  dtype_id 	 - A datatype identifier.
+!
+! OUTPUTS
+!  committed 	 - .TRUE., if the datatype has been committed
+!                  .FALSE., if the datatype has not been committed.
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 25, 2008
+!
+! SOURCE
+  SUBROUTINE h5tcommitted_f(dtype_id, committed, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dtype_id
+    LOGICAL, INTENT(OUT) :: committed
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tcommitted_c(dtype_id) BIND(C,NAME='h5tcommitted_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dtype_id
+       END FUNCTION h5tcommitted_c
+    END INTERFACE
+
+    hdferr = h5tcommitted_c(dtype_id)
+
+    IF(hdferr.GT.0)THEN
+       committed = .TRUE.
+       hdferr = 0
+    ELSE IF(hdferr.EQ.0)THEN
+       committed = .FALSE.
+       hdferr = 0
+    ELSE
+       hdferr = -1
+    ENDIF
+
+  END SUBROUTINE h5tcommitted_f
+
+!
+!****s* H5T/H5Tdecode_f
+!
+! NAME
+!  H5Tdecode_f
+!
+! PURPOSE
+!  Decode a binary object description of data type and return a new object handle.
+! INPUTS
+!  buf 	   - Buffer for the data space object to be decoded.
+!  obj_id  - Object ID
+! OUTPUTS
+!  hdferr - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  April 9, 2008
+!
+! SOURCE
+  SUBROUTINE h5tdecode_f(buf, obj_id, hdferr)
+    IMPLICIT NONE
+    CHARACTER(LEN=*), INTENT(IN) :: buf
+    INTEGER(HID_T), INTENT(OUT) :: obj_id 
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tdecode_c(buf, obj_id) BIND(C,NAME='h5tdecode_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: buf
+         INTEGER(HID_T), INTENT(OUT) :: obj_id  ! Object ID
+       END FUNCTION h5tdecode_c
+    END INTERFACE
+
+    hdferr = h5tdecode_c(buf, obj_id)
+
+  END SUBROUTINE h5tdecode_f
+
+!
+!****s* H5T/H5Tencode_f
+!
+! NAME
+!  H5Tencode_f
+!
+! PURPOSE
+!  Encode a data type object description into a binary buffer.
+!
+! INPUTS
+!  obj_id 	 - Identifier of the object to be encoded.
+!  buf 	         - Buffer for the object to be encoded into.
+!  nalloc 	 - The size of the allocated buffer.
+! OUTPUTS
+!  nalloc 	 - The size of the buffer needed.
+!  hdferr 	 - Returns 0 if successful and -1 if fails.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  April 9, 2008
+! SOURCE
+  SUBROUTINE h5tencode_f(obj_id, buf, nalloc, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: obj_id
+    CHARACTER(LEN=*), INTENT(OUT) :: buf
+    INTEGER(SIZE_T), INTENT(INOUT) :: nalloc
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5tencode_c(buf, obj_id, nalloc) BIND(C,NAME='h5tencode_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: obj_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: buf
+         INTEGER(SIZE_T), INTENT(INOUT) :: nalloc
+       END FUNCTION h5tencode_c
+    END INTERFACE
+
+    hdferr = h5tencode_c(buf, obj_id, nalloc)
+
+  END SUBROUTINE h5tencode_f
+
+!
+!****s* H5T/h5tget_create_plist_f
+!
+! NAME
+!  h5tget_create_plist_f
+!
+! PURPOSE
+!  Returns a copy of a datatype creation property list.
+!
+! INPUTS
+!  dtype_id 	 - Datatype identifier
+! OUTPUTS
+!  dtpl_id 	 - Datatype property list identifier
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  April 9, 2008
+!
+! SOURCE
+  SUBROUTINE h5tget_create_plist_f(dtype_id, dtpl_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dtype_id 
+    INTEGER(HID_T), INTENT(OUT) :: dtpl_id
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_create_plist_c(dtype_id, dtpl_id) BIND(C,NAME='h5tget_create_plist_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dtype_id
+         INTEGER(HID_T), INTENT(OUT) :: dtpl_id
+       END FUNCTION h5tget_create_plist_c
+    END INTERFACE
+
+    hdferr = h5tget_create_plist_c(dtype_id, dtpl_id)
+  END SUBROUTINE h5tget_create_plist_f
+
+!
+!****s* H5T/h5tcompiler_conv_f
+!
+! NAME
+!  h5tcompiler_conv_f
+!
+! PURPOSE
+!  Check whether the library’s default conversion is hard conversion.R
+!
+! INPUTS
+!  src_id 	 - Identifier for the source datatype.
+!  dst_id 	 - Identifier for the destination datatype.
+! OUTPUTS
+!  flag 	 - TRUE for compiler conversion, FALSE for library conversion
+!  hdferr 	 - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  April 9, 2008
+! SOURCE
+  SUBROUTINE h5tcompiler_conv_f( src_id, dst_id, flag, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: src_id
+    INTEGER(HID_T), INTENT(IN) :: dst_id
+    LOGICAL, INTENT(OUT) :: flag
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTEGER :: c_flag
+
+    INTERFACE
+       INTEGER FUNCTION h5tcompiler_conv_c(src_id, dst_id, c_flag) BIND(C,NAME='h5tcompiler_conv_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: src_id
+         INTEGER(HID_T), INTENT(IN) :: dst_id
+         INTEGER :: c_flag
+       END FUNCTION h5tcompiler_conv_c
+    END INTERFACE
+
+    hdferr = h5tcompiler_conv_c(src_id, dst_id, c_flag)
+
+    flag = .FALSE.
+    IF(c_flag .GT. 0) flag = .TRUE.
+
+  END SUBROUTINE h5tcompiler_conv_f
+
+!
+!****s* H5T/h5tget_native_type_f
+!
+! NAME
+!  h5tget_native_type_f
+!
+! PURPOSE
+!  Returns the native datatype of a specified datatype.
+!
+! INPUTS
+!  dtype_id 	 - Datatype identifier for the dataset datatype.
+!  
+!  direction 	 - Direction of search:
+!                  H5T_DIR_DEFAULT,   default direction is inscendent,
+!                  H5T_DIR_ASCEND ,   in inscendent order,
+!                  H5T_DIR_DESCEND,   in descendent order.
+!
+!  * NOTE: In C it is defined as a structure: H5T_direction_t
+!
+! OUTPUTS
+!  native_dtype_id - The native datatype identifier for the specified dataset datatype
+!  hdferr 	   - Returns 0 if successful and -1 if fails
+! AUTHOR
+!  M. Scot Breitenfeld
+!  June 18, 2008
+! SOURCE
+  SUBROUTINE h5tget_native_type_f(dtype_id, direction, native_dtype_id, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: dtype_id 
+    INTEGER, INTENT(IN) :: direction 
+    INTEGER(HID_T), INTENT(OUT) :: native_dtype_id
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5tget_native_type_c(dtype_id, direction, native_dtype_id) BIND(C,NAME='h5tget_native_type_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: dtype_id
+         INTEGER, INTENT(IN) :: direction
+         INTEGER(HID_T), INTENT(OUT) :: native_dtype_id
+       END FUNCTION h5tget_native_type_c
+    END INTERFACE
+
+    hdferr = h5tget_native_type_c(dtype_id, direction, native_dtype_id)
+  END SUBROUTINE h5tget_native_type_f
+
+!****s* H5T/H5Tconvert_f_F03
+!
+! NAME
+!  H5Tconvert_f
+!
+! PURPOSE
+!  Converts data from between specified datatypes.
+!
+! Inputs:
+!  src_id     - Identifier for the source datatype.
+!  dst_id     - Identifier for the destination datatype.
+!  nelmts     - Size of array buf.
+!  buf 	      - Array containing pre-conversion values.
+!  background - Optional background buffer.
+!  plist_id   -	Dataset transfer property list identifier.
+!
+! Outputs:
+!  buf 	      - Array containing post-conversion values.
+!  hdferr     - error code:
+!                 0 on success and -1 on failure
+! AUTHOR
+!  M. Scot Breitenfeld
+!  Decemember 8, 2008
+!
+! Fortran2003 Interface:
+  SUBROUTINE h5tconvert_f(src_id, dst_id, nelmts, buf, hdferr, background, plist_id)
+    IMPLICIT NONE
+    INTEGER(HID_T) , INTENT(IN)               :: src_id
+    INTEGER(HID_T) , INTENT(IN)               :: dst_id
+    INTEGER(SIZE_T), INTENT(IN)               :: nelmts
+    TYPE(C_PTR)    , INTENT(INOUT)            :: buf
+    INTEGER        , INTENT(OUT)              :: hdferr
+    TYPE(C_PTR)    , INTENT(INOUT), OPTIONAL  :: background
+    INTEGER(HID_T) , INTENT(IN)   , OPTIONAL  :: plist_id
+!*****
+    INTEGER(HID_T) :: plist_id_default
+    TYPE(C_PTR) :: background_default
+
+    INTERFACE
+       INTEGER FUNCTION h5tconvert_c(src_id, dst_id, nelmts, buf, background, plist_id) &
+            BIND(C, NAME='h5tconvert_c')
+         IMPORT :: c_ptr
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T) , INTENT(IN)           :: src_id
+         INTEGER(HID_T) , INTENT(IN)           :: dst_id
+         INTEGER(SIZE_T), INTENT(IN)           :: nelmts
+         TYPE(C_PTR)                , VALUE    :: buf
+         TYPE(C_PTR)                , VALUE    :: background
+         INTEGER(HID_T) , INTENT(IN)           :: plist_id
+       END FUNCTION h5tconvert_c
+    END INTERFACE
+
+    plist_id_default = H5P_DEFAULT_F
+    IF(PRESENT(plist_id)) plist_id_default = plist_id
+
+    background_default = C_NULL_PTR
+    IF(PRESENT(background)) background_default = background
+
+    hdferr = H5Tconvert_c(src_id, dst_id, nelmts, buf, background_default, plist_id_default)
+
+  END SUBROUTINE h5tconvert_f
+!
+!****s* H5T/h5tenum_insert_f90
+!
+! NAME
+!  h5tenum_insert_f
+!
+! PURPOSE
+!  Inserts a new enumeration datatype member.
+!
+! INPUTS
+!  type_id  - Datatype identifier for the enumeration datatype.
+!  name     - Datatype identifier.
+!  value    - Value of the new member.
+! OUTPUTS
+!  hdferr   - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  March 7, 2001
+! SOURCE
+  SUBROUTINE h5tenum_insert_f90(type_id,  name, value, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T), INTENT(IN) :: type_id
+    CHARACTER(LEN=*), INTENT(IN) :: name
+    INTEGER, INTENT(IN) :: value
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTEGER :: namelen
+    INTERFACE
+       INTEGER FUNCTION h5tenum_insert_c(type_id, name, namelen, value) BIND(C,NAME='h5tenum_insert_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER, INTENT(IN) :: value
+         INTEGER :: namelen
+       END FUNCTION h5tenum_insert_c
+    END INTERFACE
+            
+    namelen = LEN(name)
+    hdferr = h5tenum_insert_c(type_id, name, namelen, value)
+  END SUBROUTINE h5tenum_insert_f90
+
+!
+!****s* H5T/h5tenum_insert_f03
+!
+! NAME
+!  h5tenum_insert_f
+!
+! PURPOSE
+!  Inserts a new enumeration datatype member.
+!
+! INPUTS
+!  type_id  - Datatype identifier for the enumeration datatype.
+!  name     - Datatype identifier.
+!  value    - Pointer to the value of the new member.
+! OUTPUTS
+!  hdferr   - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  February 6, 2015
+!
+! HISTORY
+!  F2003 implementation of function
+! SOURCE
+  SUBROUTINE h5tenum_insert_f03(type_id, name, value, hdferr)
+    IMPLICIT NONE
+    INTEGER(HID_T)  , INTENT(IN) :: type_id
+    CHARACTER(LEN=*), INTENT(IN) :: name
+    TYPE(C_PTR)     , INTENT(IN) :: value
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTEGER :: namelen
+    
+    INTERFACE
+       INTEGER FUNCTION h5tenum_insert_ptr_c(type_id, name, namelen, value) &
+            BIND(C, NAME='h5tenum_insert_ptr_c')
+         IMPORT :: C_CHAR, C_PTR
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(HID_T), INTENT(IN) :: type_id
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
+         INTEGER :: namelen
+         TYPE(C_PTR), VALUE :: value
+       END FUNCTION h5tenum_insert_ptr_c
+    END INTERFACE
+            
+    namelen = LEN(name)
+    hdferr = h5tenum_insert_ptr_c(type_id, name, namelen, value)
+  END SUBROUTINE h5tenum_insert_f03
+
+END MODULE H5T
diff --git a/fortran/src/H5Tff.f90 b/fortran/src/H5Tff.f90
deleted file mode 100644
index 4b4c0b6..0000000
--- a/fortran/src/H5Tff.f90
+++ /dev/null
@@ -1,3105 +0,0 @@
-!****h* ROBODoc/H5T
-!
-! NAME
-!  MODULE H5T
-!
-! PURPOSE
-!  This file contains Fortran interfaces for H5T functions. It includes
-!  all the functions that are independent on whether the Fortran 2003 functions
-!  are enabled or disabled.
-!
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5T function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5T
-
-  USE H5GLOBAL
-
-CONTAINS
-
-!
-!****s* H5T/h5topen_f
-!
-! NAME
-!  h5topen_f
-!
-! PURPOSE
-!  Opens named datatype.
-!
-! INPUTS
-!  loc_id 	 - location identifier
-!  name 	 - a datatype name
-! OUTPUTS
-!  type_id 	 - datatype identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  tapl_id 	 - datatype access property list identifier.
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-!
-!  Added optional parameter 'tapl_id' for compatability
-!  with H5Topen2. April 9, 2009.
-!
-! SOURCE
-  SUBROUTINE h5topen_f(loc_id, name, type_id, hdferr, tapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id  ! File or group identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name ! Datatype name within file or group
-    INTEGER(HID_T), INTENT(OUT) :: type_id  ! Datatype identifier
-    INTEGER, INTENT(OUT) :: hdferr ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: tapl_id ! datatype access property list identifier
-!*****
-    INTEGER :: namelen                  ! Name length
-    INTEGER(HID_T) :: tapl_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5topen_c(loc_id, name, namelen, type_id, tapl_id_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TOPEN_C'::h5topen_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference ::name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER :: namelen
-         INTEGER(HID_T), INTENT(OUT) :: type_id
-         INTEGER(HID_T) :: tapl_id_default
-       END FUNCTION h5topen_c
-    END INTERFACE
-
-    namelen = LEN(name)
-
-    tapl_id_default = H5P_DEFAULT_F
-    IF(PRESENT(tapl_id)) tapl_id_default = tapl_id
-
-    hdferr = h5topen_c(loc_id, name, namelen, type_id, tapl_id_default)
-  END SUBROUTINE h5topen_f
-!
-!****s* H5T/h5tcommit_f
-!
-! NAME
-!  h5tcommit_f
-!
-! PURPOSE
-!  Commits a transient datatype to a file, creating a
-!  new named datatype.
-!
-! INPUTS
-!  loc_id 	 - location identifier
-!  name 	 - name of the datatype to be stored
-!                  at the specified location
-!  type_id 	 - identifier of a datatype to be stored
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  lcpl_id 	 - Link creation property list
-!  tcpl_id 	 - Datatype creation property list
-!  tapl_id 	 - Datatype access property list
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!   	 - Explicit Fortran interfaces were added for
-!          called C functions (it is needed for Windows
-!          port).  March 7, 2001
-!
-!   	 - Added optional parameters introduced in version 1.8
-!          M. Scot Breitenfeld
-!
-! SOURCE
-  SUBROUTINE h5tcommit_f(loc_id, name, type_id, hdferr, &
-       lcpl_id, tcpl_id, tapl_id  )
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id  ! File or group identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name
-                                  ! Datatype name within file or group
-    INTEGER(HID_T), INTENT(IN) :: type_id  ! Datatype identifier
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lcpl_id ! Link creation property list
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: tcpl_id ! Datatype creation property list
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: tapl_id ! Datatype access property list
-!*****
-
-    INTEGER :: namelen          ! Name length
-
-    INTEGER(HID_T) :: lcpl_id_default
-    INTEGER(HID_T) :: tcpl_id_default
-    INTEGER(HID_T) :: tapl_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5tcommit_c(loc_id, name, namelen, type_id, &
-            lcpl_id_default, tcpl_id_default, tapl_id_default )
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TCOMMIT_C'::h5tcommit_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference ::name
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER :: namelen
-         INTEGER(HID_T), INTENT(IN) :: type_id
-         INTEGER(HID_T) :: lcpl_id_default
-         INTEGER(HID_T) :: tcpl_id_default
-         INTEGER(HID_T) :: tapl_id_default
-       END FUNCTION h5tcommit_c
-    END INTERFACE
-
-    lcpl_id_default = H5P_DEFAULT_F
-    tcpl_id_default = H5P_DEFAULT_F
-    tapl_id_default = H5P_DEFAULT_F
-
-    IF (PRESENT(lcpl_id)) lcpl_id_default = lcpl_id
-    IF (PRESENT(tcpl_id)) tcpl_id_default = tcpl_id
-    IF (PRESENT(tapl_id)) tapl_id_default = tapl_id
-
-    namelen = LEN(name)
-
-    hdferr = h5tcommit_c(loc_id, name, namelen, type_id, &
-         lcpl_id_default, tcpl_id_default, tapl_id_default )
-
-  END SUBROUTINE h5tcommit_f
-!
-!****s* H5T/h5tcopy_f
-!
-! NAME
-!  h5tcopy_f
-!
-! PURPOSE
-!  Creates a copy of exisiting datatype.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-! OUTPUTS
-!  new_type_id 	 - identifier of datatype's copy
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-!
-! SOURCE
-  SUBROUTINE h5tcopy_f(type_id, new_type_id, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER(HID_T), INTENT(OUT) :: new_type_id
-                                 ! Identifier of datatype's copy
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION  h5tcopy_c(type_id, new_type_id)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TCOPY_C'::h5tcopy_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER(HID_T), INTENT(OUT) :: new_type_id
-              END FUNCTION h5tcopy_c
-            END INTERFACE
-
-            hdferr = h5tcopy_c(type_id, new_type_id)
-          END SUBROUTINE h5tcopy_f
-!
-!****s* H5T/h5tequal_f
-!
-! NAME
-!  h5tequal_f
-!
-! PURPOSE
-!  Determines whether two datatype identifiers refer
-!  to the same datatype.
-!
-! INPUTS
-!  type1_id 	 - datatype identifier
-!  type2_id 	 - datatype identifier
-! OUTPUTS
-!  flag 	 - TRUE/FALSE flag to indicate
-!                  if two datatypes are equal
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tequal_f(type1_id, type2_id, flag, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type1_id ! Datatype identifier
-            INTEGER(HID_T), INTENT(IN) :: type2_id ! Datatype identifier
-            LOGICAL, INTENT(OUT) :: flag ! TRUE/FALSE flag to indicate if two
-                                         ! datatypes are equal
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTEGER :: c_flag
-            INTERFACE
-              INTEGER FUNCTION h5tequal_c(type1_id, type2_id, c_flag)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TEQUAL_C'::h5tequal_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type1_id
-              INTEGER(HID_T), INTENT(IN) :: type2_id
-              INTEGER :: c_flag
-              END FUNCTION h5tequal_c
-            END INTERFACE
-
-            flag = .FALSE.
-            hdferr = h5tequal_c(type1_id, type2_id, c_flag)
-            if(c_flag .gt. 0) flag = .TRUE.
-          END SUBROUTINE h5tequal_f
-!
-!****s* H5T/h5tclose_f
-!
-! NAME
-!  h5tclose_f
-!
-! PURPOSE
-!  Releases a datatype.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-!
-! SOURCE
-  SUBROUTINE h5tclose_f(type_id, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tclose_c(type_id)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TCLOSE_C'::h5tclose_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              END FUNCTION h5tclose_c
-            END INTERFACE
-
-            hdferr = h5tclose_c(type_id)
-          END SUBROUTINE h5tclose_f
-!
-!****s* H5T/h5tget_class_f
-!
-! NAME
-!  h5tget_class_f
-!
-! PURPOSE
-!  Returns the datatype class identifier.
-!
-! INPUTS
-!  type_id - Datatype identifier
-! OUTPUTS
-!  class   - Class, possible values are:
-!            H5T_NO_CLASS_F (-1)
-!            H5T_INTEGER_F  (0)
-!            H5T_FLOAT_F (1)
-!            H5T_TIME_F  (2)
-!            H5T_STRING_F (3)
-!            H5T_BITFIELD_F (4)
-!            H5T_OPAQUE_F (5)
-!            H5T_COMPOUND_F (6)
-!            H5T_REFERENCE_F (7)
-!            H5T_ENUM_F (8)
-!            H5T_VLEN_F (9)
-!            H5T_ARRAY_F (10)  
-!  hdferr  - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-!
-! SOURCE
-  SUBROUTINE h5tget_class_f(type_id, class, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: type_id
-    INTEGER, INTENT(OUT) :: class         
-    INTEGER, INTENT(OUT) :: hdferr
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5tget_class_c(type_id, class)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_CLASS_C'::h5tget_class_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: type_id
-         INTEGER, INTENT(OUT) :: class
-       END FUNCTION h5tget_class_c
-    END INTERFACE
-
-    hdferr = h5tget_class_c(type_id, class)
-  END SUBROUTINE h5tget_class_f
-!
-!****s* H5T/h5tget_size_f
-!
-! NAME
-!  h5tget_size_f
-!
-! PURPOSE
-!  Returns the size of a datatype.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-! OUTPUTS
-!  size 	 - datatype size
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-!
-! SOURCE
-  SUBROUTINE h5tget_size_f(type_id, size, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER(SIZE_T), INTENT(OUT) :: size ! Datatype size
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tget_size_c(type_id, size)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_SIZE_C'::h5tget_size_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER(SIZE_T), INTENT(OUT) :: size
-              END FUNCTION h5tget_size_c
-            END INTERFACE
-
-            hdferr = h5tget_size_c(type_id, size)
-          END SUBROUTINE h5tget_size_f
-
-!
-!****s* H5T/h5tset_size_f
-!
-! NAME
-!  h5tset_size_f
-!
-! PURPOSE
-!  Sets the total size for an atomic datatype.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-!  size 	 - size of the datatype
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-!
-!
-! SOURCE
-  SUBROUTINE h5tset_size_f(type_id, size, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER(SIZE_T), INTENT(IN) :: size ! Datatype size
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tset_size_c(type_id, size)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TSET_SIZE_C'::h5tset_size_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER(SIZE_T), INTENT(IN) :: size
-              END FUNCTION h5tset_size_c
-            END INTERFACE
-
-            hdferr = h5tset_size_c(type_id, size)
-          END SUBROUTINE h5tset_size_f
-
-!
-!****s* H5T/h5tget_order_f
-!
-! NAME
-!  h5tget_order_f
-!
-! PURPOSE
-!  Returns the byte order of an atomic datatype.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-! OUTPUTS
-!  order 	 - byte order for the datatype, possible
-!                  values are:
-!                    H5T_ORDER_LE_F
-!                    H5T_ORDER_BE_F
-!                    H5T_ORDER_VAX_F (not implemented yet)
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-!
-! SOURCE
-  SUBROUTINE h5tget_order_f(type_id, order, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-    INTEGER, INTENT(OUT) :: order
-                                    ! Datatype byte order, possible values are:
-                                    ! H5T_ORDER_LE_F
-                                    ! H5T_ORDER_BE_F
-                                    ! H5T_ORDER_VAX_F
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5tget_order_c(type_id, order)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_ORDER_C'::h5tget_order_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: type_id
-         INTEGER, INTENT(OUT) :: order
-       END FUNCTION h5tget_order_c
-    END INTERFACE
-    
-    hdferr = h5tget_order_c(type_id, order)
-  END SUBROUTINE h5tget_order_f
-!
-!****s* H5T/h5tset_order_f
-!
-! NAME
-!  h5tset_order_f
-!
-! PURPOSE
-!  Sets the byte ordering of an atomic datatype.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-!  order 	 - datatype byte order Possible values are:
-!                    H5T_ORDER_LE_F
-!                    H5T_ORDER_BE_F
-!                    H5T_ORDER_VAX_F (not implemented yet)
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-!
-! SOURCE
-  SUBROUTINE h5tset_order_f(type_id, order, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-    INTEGER, INTENT(IN) :: order   ! Datatype byte order, possible values
-                                   ! are:
-                                   ! H5T_ORDER_LE_F
-                                   ! H5T_ORDER_BE_F
-                                   ! H5T_ORDER_VAX_F
-    INTEGER, INTENT(OUT) :: hdferr ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5tset_order_c(type_id, order)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TSET_ORDER_C'::h5tset_order_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: type_id
-         INTEGER, INTENT(IN) :: order
-       END FUNCTION h5tset_order_c
-    END INTERFACE
-    
-    hdferr = h5tset_order_c(type_id, order)
-  END SUBROUTINE h5tset_order_f
-
-!
-!****s* H5T/h5tget_precision_f
-!
-! NAME
-!  h5tget_precision_f
-!
-! PURPOSE
-!  Returns the precision of an atomic datatype.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-! OUTPUTS
-!  precision 	 - precision of the datatype
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-!
-! SOURCE
-  SUBROUTINE h5tget_precision_f(type_id, precision, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER(SIZE_T), INTENT(OUT) :: precision ! Datatype precision
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tget_precision_c (type_id, precision)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_PRECISION_C'::h5tget_precision_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER(SIZE_T), INTENT(OUT) :: precision
-              END FUNCTION h5tget_precision_c
-            END INTERFACE
-
-            hdferr = h5tget_precision_c(type_id, precision)
-          END SUBROUTINE h5tget_precision_f
-
-!
-!****s* H5T/h5tset_precision_f
-!
-! NAME
-!  h5tset_precision_f
-!
-! PURPOSE
-!  Sets the precision of an atomic datatype.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-!  precision 	 - datatype precision
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-!
-! SOURCE
-  SUBROUTINE h5tset_precision_f(type_id, precision, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER(SIZE_T), INTENT(IN) :: precision ! Datatype precision
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tset_precision_c (type_id, precision)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TSET_PRECISION_C'::h5tset_precision_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER(SIZE_T), INTENT(IN) :: precision
-              END FUNCTION h5tset_precision_c
-            END INTERFACE
-
-            hdferr = h5tset_precision_c(type_id, precision)
-          END SUBROUTINE h5tset_precision_f
-
-!
-!****s* H5T/h5tget_offset_f
-!
-! NAME
-!  h5tget_offset_f
-!
-! PURPOSE
-!  Retrieves the bit offset of the first significant bit.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-! OUTPUTS
-!  offset 	 - offset value
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-!
-! SOURCE
-  SUBROUTINE h5tget_offset_f(type_id, offset, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER(SIZE_T), INTENT(OUT) :: offset ! Datatype bit offset of the
-                                           ! first significant bit
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tget_offset_c(type_id, offset)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_OFFSET_C'::h5tget_offset_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER(SIZE_T), INTENT(OUT) :: offset
-              END FUNCTION h5tget_offset_c
-            END INTERFACE
-
-            hdferr = h5tget_offset_c(type_id, offset)
-          END SUBROUTINE h5tget_offset_f
-
-!
-!****s* H5T/h5tset_offset_f
-!
-! NAME
-!  h5tset_offset_f
-!
-! PURPOSE
-!  Sets the bit offset of the first significant bit.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-!  offset 	 - offset value
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-!
-! SOURCE
-  SUBROUTINE h5tset_offset_f(type_id, offset, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER(SIZE_T), INTENT(IN) :: offset ! Datatype bit offset of the
-                                           ! first significant bit
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tset_offset_c(type_id, offset)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TSET_OFFSET_C'::h5tset_offset_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER(SIZE_T), INTENT(IN) :: offset
-              END FUNCTION h5tset_offset_c
-            END INTERFACE
-
-            hdferr = h5tset_offset_c(type_id, offset)
-          END SUBROUTINE h5tset_offset_f
-
-!
-!****s* H5T/h5tget_pad_f
-!
-! NAME
-!  h5tget_pad_f
-!
-! PURPOSE
-!  Retrieves the padding type of the least and
-!  most 	 -significant bit padding.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-! OUTPUTS
-!  lsbpad 	 - least-significant bit padding type
-!  msbpad 	 - most-significant bit padding type
-!                  Possible values of padding type are:
-!                    H5T_PAD_ERROR_F      = -1
-!                    H5T_PAD_ZERO_F = 0
-!                    H5T_PAD_ONE_F = 1
-!                    H5T_PAD_BACKGROUND_F = 2
-!                    H5T_PAD_NPAD_F      = 3
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tget_pad_f(type_id, lsbpad, msbpad, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER, INTENT(OUT) :: lsbpad ! padding type of the
-                                           ! least significant bit
-            INTEGER, INTENT(OUT) :: msbpad ! padding type of the
-                                           ! most significant bit
-                                           ! Possible values of padding type are:
-                                           ! H5T__PAD_ZERO_F = 0
-                                           ! H5T__PAD_ONE_F = 1
-                                           ! H5T__PAD_BACKGROUND_F = 2
-                                           ! H5T_PAD_ERROR_F      = -1
-                                           ! H5T_PAD_NPAD_F      = 3
-
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tget_pad_c(type_id, lsbpad, msbpad)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_PAD_C'::h5tget_pad_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER, INTENT(OUT) :: lsbpad
-              INTEGER, INTENT(OUT) :: msbpad
-              END FUNCTION h5tget_pad_c
-            END INTERFACE
-
-            hdferr = h5tget_pad_c(type_id, lsbpad, msbpad)
-          END SUBROUTINE h5tget_pad_f
-
-!
-!****s* H5T/h5tset_pad_f
-!
-! NAME
-!  h5tset_pad_f
-!
-! PURPOSE
-!  Sets the least and most-significant bits padding types.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-!  lsbpad 	 - least-significant bit padding type
-!  msbpad 	 - most-significant bit padding type
-!                  Possible values of padding type are:
-!                    H5T_PAD_ERROR_F      = -1
-!                    H5T_PAD_ZERO_F = 0
-!                    H5T_PAD_ONE_F = 1
-!                    H5T_PAD_BACKGROUND_F = 2
-!                    H5T_PAD_NPAD_F      = 3
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tset_pad_f(type_id, lsbpad, msbpad, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER, INTENT(IN) :: lsbpad ! padding type of the
-                                           ! least significant bit
-            INTEGER, INTENT(IN) :: msbpad ! padding type of the
-                                           ! most significant bit
-                                           ! Possible values of padding type are:
-                                           ! H5T_PAD_ZERO_F = 0
-                                           ! H5T_PAD_ONE_F = 1
-                                           ! H5T_PAD_BACKGROUND_F = 2
-                                           ! H5T_PAD_ERROR_F      = -1
-                                           ! H5T_PAD_NPAD_F      = 3
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tset_pad_c(type_id, lsbpad, msbpad)
-              USE H5GLOBAL
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TSET_PAD_C'::h5tset_pad_c
-              !DEC$ENDIF
-              INTEGER, INTENT(IN) :: lsbpad
-              INTEGER, INTENT(IN) :: msbpad
-              END FUNCTION h5tset_pad_c
-            END INTERFACE
-
-            hdferr = h5tset_pad_c(type_id, lsbpad, msbpad)
-          END SUBROUTINE h5tset_pad_f
-
-!
-!****s* H5T/h5tget_sign_f
-!
-! NAME
-!  h5tget_sign_f
-!
-! PURPOSE
-!  Retrieves the sign type for an integer type.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-! OUTPUTS
-!  sign 	 - sign type
-!                  Possible values are:
-!                    - Unsigned integer type 
-!                        H5T_SGN_NONE_F = 0
-!                    - Two's complement signed integer type
-!                        H5T_SGN_2_F = 1
-!                    - error value: H5T_SGN_ERROR_F=-1
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tget_sign_f(type_id, sign, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER, INTENT(OUT) :: sign ! sign type for an integer type
-                                         !possible values are:
-                                         !Unsigned integer type H5T_SGN_NONE_F = 0
-                                         !Two's complement signed integer type
-                                         !H5T_SGN_2_F = 1
-                                         !or error value: H5T_SGN_ERROR_F=-1
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-
-            INTERFACE
-              INTEGER FUNCTION h5tget_sign_c(type_id, sign)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_SIGN_C'::h5tget_sign_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER, INTENT(OUT) :: sign
-              END FUNCTION h5tget_sign_c
-            END INTERFACE
-
-            hdferr = h5tget_sign_c(type_id, sign)
-          END SUBROUTINE h5tget_sign_f
-
-!
-!****s* H5T/h5tset_sign_f
-!
-! NAME
-!  h5tset_sign_f
-!
-! PURPOSE
-!  Sets the sign proprety for an integer type.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-!  sign 	 - sign type
-!                  Possible values are:
-!                    - Unsigned integer type 
-!                        H5T_SGN_NONE_F = 0
-!                    - Two's complement signed integer type
-!                        H5T_SGN_2_F = 1
-!                    - error value: H5T_SGN_ERROR_F=-1
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tset_sign_f(type_id, sign, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER, INTENT(IN) :: sign !sign type for an integer type
-                                         !possible values are:
-                                         !Unsigned integer type H5T_SGN_NONE_F = 0
-                                         !Two's complement signed integer type
-                                         !H5T_SGN_2_F = 1
-                                         !or error value: H5T_SGN_ERROR_F=-1
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-
-            INTERFACE
-              INTEGER FUNCTION h5tset_sign_c(type_id, sign)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TSET_SIGN_C'::h5tset_sign_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER, INTENT(IN) :: sign
-              END FUNCTION h5tset_sign_c
-            END INTERFACE
-
-            hdferr = h5tset_sign_c(type_id, sign)
-          END SUBROUTINE h5tset_sign_f
-
-!
-!****s* H5T/h5tget_fields_f
-!
-! NAME
-!  h5tget_fields_f
-!
-! PURPOSE
-!  Retrieves floating point datatype bit field information.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-! OUTPUTS
-!  spos 	 - sign bit-position
-!  epos 	 - exponent bit-position
-!  esize 	 - size of exponent in bits
-!  mpos 	 - mantissa position
-!  msize 	 - size of mantissa in bits
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tget_fields_f(type_id, spos, epos, esize, mpos, msize, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER(SIZE_T), INTENT(OUT) :: spos   ! sign bit-position
-            INTEGER(SIZE_T), INTENT(OUT) :: epos   ! exponent bit-position
-            INTEGER(SIZE_T), INTENT(OUT) :: esize  ! size of exponent in bits
-            INTEGER(SIZE_T), INTENT(OUT) :: mpos   ! mantissa bit-position
-            INTEGER(SIZE_T), INTENT(OUT) :: msize  ! size of mantissa in bits
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-
-            INTERFACE
-              INTEGER FUNCTION h5tget_fields_c(type_id, spos, epos, esize, mpos, msize)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_FIELDS_C'::h5tget_fields_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER(SIZE_T), INTENT(OUT) :: spos
-              INTEGER(SIZE_T), INTENT(OUT) :: epos
-              INTEGER(SIZE_T), INTENT(OUT) :: esize
-              INTEGER(SIZE_T), INTENT(OUT) :: mpos
-              INTEGER(SIZE_T), INTENT(OUT) :: msize
-              END FUNCTION h5tget_fields_c
-            END INTERFACE
-
-            hdferr = h5tget_fields_c(type_id, spos, epos, esize, mpos, msize)
-          END SUBROUTINE h5tget_fields_f
-
-!
-!****s* H5T/h5tset_fields_f
-!
-! NAME
-!  h5tset_fields_f
-!
-! PURPOSE
-!  Sets locations and sizes of floating point bit fields.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-!  spos 	 - sign bit-position
-!  epos 	 - exponent bit-position
-!  esize 	 - size of exponent in bits
-!  mpos 	 - mantissa position
-!  msize 	 - size of mantissa in bits
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tset_fields_f(type_id, spos, epos, esize, mpos, msize, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER(SIZE_T), INTENT(IN) :: spos   ! sign bit-position
-            INTEGER(SIZE_T), INTENT(IN) :: epos   ! exponent bit-position
-            INTEGER(SIZE_T), INTENT(IN) :: esize  ! size of exponent in bits
-            INTEGER(SIZE_T), INTENT(IN) :: mpos   ! mantissa bit-position
-            INTEGER(SIZE_T), INTENT(IN) :: msize  ! size of mantissa in bits
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-
-            INTERFACE
-              INTEGER FUNCTION h5tset_fields_c(type_id, spos, epos, esize, mpos, msize)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TSET_FIELDS_C'::h5tset_fields_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER(SIZE_T), INTENT(IN) :: spos
-              INTEGER(SIZE_T), INTENT(IN) :: epos
-              INTEGER(SIZE_T), INTENT(IN) :: esize
-              INTEGER(SIZE_T), INTENT(IN) :: mpos
-              INTEGER(SIZE_T), INTENT(IN) :: msize
-              END FUNCTION h5tset_fields_c
-            END INTERFACE
-
-            hdferr = h5tset_fields_c(type_id, spos, epos, esize, mpos, msize)
-          END SUBROUTINE h5tset_fields_f
-
-!
-!****s* H5T/h5tget_ebias_f
-!
-! NAME
-!  h5tget_ebias_f
-!
-! PURPOSE
-!  Retrieves the exponent bias of a floating-point type.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-! OUTPUTS
-!  ebias 	 - datatype exponent bias
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tget_ebias_f(type_id, ebias, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER(SIZE_T), INTENT(OUT) :: ebias ! Datatype exponent bias of a floating-point type
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-
-            INTERFACE
-              INTEGER FUNCTION h5tget_ebias_c(type_id, ebias)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_EBIAS_C'::h5tget_ebias_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER(SIZE_T), INTENT(OUT) :: ebias
-              END FUNCTION h5tget_ebias_c
-            END INTERFACE
-
-            hdferr = h5tget_ebias_c(type_id, ebias)
-          END SUBROUTINE h5tget_ebias_f
-
-!
-!****s* H5T/h5tset_ebias_f
-!
-! NAME
-!  h5tset_ebias_f
-!
-! PURPOSE
-!  Sets the exponent bias of a floating-point type.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-!  ebias 	 - datatype exponent bias
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tset_ebias_f(type_id, ebias, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER(SIZE_T), INTENT(IN) :: ebias !Datatype exponent bias of a floating-point type
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-
-            INTERFACE
-              INTEGER FUNCTION h5tset_ebias_c(type_id, ebias)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TSET_EBIAS_C'::h5tset_ebias_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER(SIZE_T), INTENT(IN) :: ebias
-              END FUNCTION h5tset_ebias_c
-            END INTERFACE
-
-            hdferr = h5tset_ebias_c(type_id, ebias)
-          END SUBROUTINE h5tset_ebias_f
-
-!
-!****s* H5T/h5tget_norm_f
-!
-! NAME
-!  h5tget_norm_f
-!
-! PURPOSE
-!  Retrieves mantissa normalization of a floating-point
-!  datatype.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-! OUTPUTS
-!  norm 	 - normalization types, valid values are:
-!                    H5T_NORM_IMPLIED_F(0)
-!                    H5T_NORM_MSBSET_F(1)
-!                    H5T_NORM_NONE_F(2)
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tget_norm_f(type_id, norm, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER, INTENT(OUT) :: norm !mantissa normalization of a floating-point datatype
-                                         !Valid normalization types are:
-                                         !H5T_NORM_IMPLIED_F(0),MSB of mantissa is not
-                                         !stored, always 1,  H5T_NORM_MSBSET_F(1), MSB of
-                                         !mantissa is always 1, H5T_NORM_NONE_F(2)
-                                         !Mantissa is not normalize
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-
-            INTERFACE
-              INTEGER FUNCTION h5tget_norm_c(type_id, norm)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_NORM_C'::h5tget_norm_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER, INTENT(OUT) :: norm
-              END FUNCTION h5tget_norm_c
-            END INTERFACE
-
-            hdferr = h5tget_norm_c(type_id, norm)
-          END SUBROUTINE h5tget_norm_f
-
-!
-!****s* H5T/h5tset_norm_f
-!
-! NAME
-!  h5tset_norm_f
-!
-! PURPOSE
-!  Sets the mantissa normalization of a floating-point datatype.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-!  norm 	 - normalization types, valid values are:
-!                    H5T_NORM_IMPLIED_F(0)
-!                    H5T_NORM_MSBSET_F(1)
-!                    H5T_NORM_NONE_F(2)
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-!
-! SOURCE
-  SUBROUTINE h5tset_norm_f(type_id, norm, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER, INTENT(IN) :: norm !mantissa normalization of a floating-point datatype
-                                         !Valid normalization types are:
-                                         !H5T_NORM_IMPLIED_F(0),MSB of mantissa is not
-                                         !stored, always 1,  H5T_NORM_MSBSET_F(1), MSB of
-                                         !mantissa is always 1, H5T_NORM_NONE_F(2)
-                                         !Mantissa is not normalize
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tset_norm_c(type_id, norm)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TSET_NORM_C'::h5tset_norm_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER, INTENT(IN) :: norm
-              END FUNCTION h5tset_norm_c
-            END INTERFACE
-
-            hdferr = h5tset_norm_c(type_id, norm)
-          END SUBROUTINE h5tset_norm_f
-
-!
-!****s* H5T/h5tget_inpad_f
-!
-! NAME
-!  h5tget_inpad_f
-!
-! PURPOSE
-!  Retrieves the internal padding type for unused bits
-!  in floating-point datatypes.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-! OUTPUTS
-!  padtype 	 - padding type for unused bits
-!                  Possible values of padding type are:
-!                    H5T_PAD_ZERO_F = 0
-!                    H5T_PAD_ONE_F = 1
-!                    H5T_PAD_BACKGROUND_F = 2
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tget_inpad_f(type_id, padtype, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER, INTENT(OUT) :: padtype ! padding type for unused bits
-                                            ! in floating-point datatypes.
-                                            ! Possible values of padding type are:
-                                            ! H5T__PAD_ZERO_F = 0
-                                            ! H5T__PAD_ONE_F = 1
-                                            ! H5T__PAD_BACKGROUND_F = 2
-
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tget_inpad_c(type_id, padtype)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_INPAD_C'::h5tget_inpad_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER, INTENT(OUT) :: padtype
-              END FUNCTION h5tget_inpad_c
-            END INTERFACE
-
-            hdferr = h5tget_inpad_c(type_id, padtype)
-          END SUBROUTINE h5tget_inpad_f
-
-!
-!****s* H5T/h5tset_inpad_f
-!
-! NAME
-!  h5tset_inpad_f
-!
-! PURPOSE
-!  Fills unused internal floating point bits.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-!  padtype 	 - padding type for unused bits
-!                  Possible values of padding type are:
-!                    H5T_PAD_ZERO_F = 0
-!                    H5T_PAD_ONE_F = 1
-!                    H5T_PAD_BACKGROUND_F = 2
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tset_inpad_f(type_id, padtype, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER, INTENT(IN) :: padtype ! padding type for unused bits
-                                           ! in floating-point datatypes.
-                                           ! Possible values of padding type are:
-                                           ! H5T__PAD_ZERO_F = 0
-                                           ! H5T__PAD_ONE_F = 1
-                                           ! H5T__PAD_BACKGROUND_F = 2
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tset_inpad_c(type_id, padtype)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TSET_INPAD_C'::h5tset_inpad_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER, INTENT(IN) :: padtype
-              END FUNCTION h5tset_inpad_c
-            END INTERFACE
-
-            hdferr = h5tset_inpad_c(type_id, padtype)
-          END SUBROUTINE h5tset_inpad_f
-
-!
-!****s* H5T/h5tget_cset_f
-!
-! NAME
-!  h5tget_cset_f
-!
-! PURPOSE
-!  Retrieves the character set type of a string datatype.
-!
-! INPUTS
-!  type_id  - Datatype identifier
-! OUTPUTS
-!  cset     - Character set type of a string datatype
-!              Possible values are:
-!              H5T_CSET_ASCII_F = 0
-!              H5T_CSET_UTF8_F
-!  hdferr   - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tget_cset_f(type_id, cset, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER, INTENT(OUT) :: cset   ! character set type of a string datatype
-                                           !  Possible values are:
-                                           !  H5T_CSET_ASCII_F = 0
-                                           !  H5T_CSET_UTF8_F
-            INTEGER, INTENT(OUT) :: hdferr ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tget_cset_c(type_id, cset)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_CSET_C'::h5tget_cset_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER, INTENT(OUT) :: cset
-              END FUNCTION h5tget_cset_c
-            END INTERFACE
-
-            hdferr = h5tget_cset_c(type_id, cset)
-          END SUBROUTINE h5tget_cset_f
-
-!
-!****s* H5T/h5tset_cset_f
-!
-! NAME
-!  h5tset_cset_f
-!
-! PURPOSE
-!  Sets character set to be used.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-!  cset 	 - character set type of a string datatype
-!                    Possible values are:
-!                     H5T_CSET_ASCII_F = 0
-!                     H5T_CSET_UTF8_F
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tset_cset_f(type_id, cset, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER, INTENT(IN) :: cset !character set type of a string datatype
-                                           ! Possible values of padding type are:
-                                           ! H5T_CSET_ASCII_F = 0
-                                           ! H5T_CSET_UTF8_F
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tset_cset_c(type_id, cset)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TSET_CSET_C'::h5tset_cset_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER, INTENT(IN) :: cset
-              END FUNCTION h5tset_cset_c
-            END INTERFACE
-
-            hdferr = h5tset_cset_c(type_id, cset)
-          END SUBROUTINE h5tset_cset_f
-
-!
-!****s* H5T/h5tget_strpad_f
-!
-! NAME
-!  h5tget_strpad_f
-!
-! PURPOSE
-!  Retrieves the storage mechanism for a string datatype.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-! OUTPUTS
-!  strpad 	 - storage method for a string datatype
-!                  Possible values are:
-!                    H5T_STR_NULLTERM_F,
-!                    H5T_STR_NULLPAD_F,
-!                    H5T_STR_SPACEPAD_F
-!                    H5T_STR_ERROR_F
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tget_strpad_f(type_id, strpad, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER, INTENT(OUT) :: strpad
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tget_strpad_c(type_id, strpad)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_STRPAD_C'::h5tget_strpad_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER, INTENT(OUT) :: strpad
-              END FUNCTION h5tget_strpad_c
-            END INTERFACE
-
-            hdferr = h5tget_strpad_c(type_id, strpad)
-          END SUBROUTINE h5tget_strpad_f
-
-!
-!****s* H5T/h5tset_strpad_f
-!
-! NAME
-!  h5tset_strpad_f
-!
-! PURPOSE
-!  Defines the storage mechanism for character strings.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-!  strpad 	 - storage method for a string datatype
-!                  Possible values are:
-!                    H5T_STR_NULLTERM_F,
-!                    H5T_STR_NULLPAD_F,
-!                    H5T_STR_SPACEPAD_F
-!                    H5T_STR_ERROR_F
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tset_strpad_f(type_id, strpad, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER, INTENT(IN) :: strpad ! string padding method for a string datatype
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tset_strpad_c(type_id, strpad)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TSET_STRPAD_C'::h5tset_strpad_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER, INTENT(IN) :: strpad
-              END FUNCTION h5tset_strpad_c
-            END INTERFACE
-
-            hdferr = h5tset_strpad_c(type_id, strpad)
-          END SUBROUTINE h5tset_strpad_f
-
-!
-!****s* H5T/h5tget_nmembers_f
-!
-! NAME
-!  h5tget_nmembers_f
-!
-! PURPOSE
-!  Retrieves the number of fields in a compound datatype.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-! OUTPUTS
-!  num_members 	 - number of members
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-!
-! SOURCE
-  SUBROUTINE h5tget_nmembers_f(type_id, num_members, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER, INTENT(OUT) :: num_members !number of fields in a compound datatype
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-
-            INTERFACE
-              INTEGER FUNCTION h5tget_nmembers_c(type_id, num_members)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_NMEMBERS_C'::h5tget_nmembers_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER, INTENT(OUT) :: num_members
-              END FUNCTION h5tget_nmembers_c
-            END INTERFACE
-
-            hdferr = h5tget_nmembers_c(type_id, num_members)
-          END SUBROUTINE h5tget_nmembers_f
-
-!
-!****s* H5T/h5tget_member_name_f
-!
-! NAME
-!  h5tget_member_name_f
-!
-! PURPOSE
-!  Retrieves the name of a field of a compound datatype.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-!  index 	 - filed index (0-based)
-! OUTPUTS
-!  member_name 	 - buffer to hold member's name
-!  namelen 	 - name length
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tget_member_name_f(type_id, index, member_name,  namelen, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER, INTENT(IN) :: index !Field index (0-based) of the field name to retrieve
-            CHARACTER(LEN=*), INTENT(OUT) :: member_name !name of a field of
-                                                         !a compound datatype
-            INTEGER, INTENT(OUT) :: namelen ! Length of the name
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tget_member_name_c(type_id, index, member_name, namelen)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_MEMBER_NAME_C'::h5tget_member_name_c
-              !DEC$ENDIF
-              !DEC$ATTRIBUTES reference :: member_name
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER, INTENT(IN) :: index
-              CHARACTER(LEN=*), INTENT(OUT) :: member_name
-              INTEGER, INTENT(OUT) :: namelen
-              END FUNCTION
-            END INTERFACE
-
-            hdferr = h5tget_member_name_c(type_id, index, member_name, namelen)
-          END SUBROUTINE h5tget_member_name_f
-
-!
-!****s* H5T/h5tget_member_offset_f
-!
-! NAME
-!  h5tget_member_offset_f
-!
-! PURPOSE
-!  Retrieves the offset of a field of a compound datatype.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-!  member_no 	 - number of the field
-! OUTPUTS
-!  offset 	 - byte offset of the requested field
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tget_member_offset_f(type_id, member_no, offset, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER, INTENT(IN) :: member_no !Number of the field
-                                                       !whose offset is requested
-            INTEGER(SIZE_T), INTENT(OUT) :: offset !byte offset of the beginning of the field
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tget_member_offset_c(type_id, member_no, offset )
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_MEMBER_OFFSET_C'::h5tget_member_offset_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER, INTENT(IN) :: member_no
-              INTEGER(SIZE_T), INTENT(OUT) :: offset
-              END FUNCTION h5tget_member_offset_c
-            END INTERFACE
-
-            hdferr = h5tget_member_offset_c(type_id, member_no, offset )
-          END SUBROUTINE h5tget_member_offset_f
-!
-!****s* H5T/h5tget_member_index_f
-!
-! NAME
-!  h5tget_member_index_f
-!
-! PURPOSE
-!  Retrieves the index of a compound or enumeration datatype member.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-!  name 	 - name of the field or member whose index to
-!  to be retrieved from the datatype.
-! OUTPUTS
-!  index 	 - 0-based index of the filed or member (0 to N-1)
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  September 26, 2002
-!
-! SOURCE
-  SUBROUTINE h5tget_member_index_f(type_id, name, index, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id  ! Datatype identifier
-            CHARACTER(LEN=*), INTENT(IN) :: name   ! Field or member name
-            INTEGER, INTENT(OUT) :: index          ! Field or member index
-            INTEGER, INTENT(OUT) :: hdferr          ! Error code
-!*****
-            INTEGER :: namelen          ! Name length
-
-            INTERFACE
-              INTEGER FUNCTION h5tget_member_index_c(type_id, name, namelen, index)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_MEMBER_INDEX_C'::h5tget_member_index_c
-              !DEC$ENDIF
-              !DEC$ATTRIBUTES reference ::name
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              CHARACTER(LEN=*), INTENT(IN) :: name
-              INTEGER, INTENT(IN)  :: namelen
-              INTEGER, INTENT(OUT) :: index
-              END FUNCTION h5tget_member_index_c
-            END INTERFACE
-
-            namelen = LEN(name)
-            hdferr = h5tget_member_index_c(type_id, name, namelen, index)
-          END SUBROUTINE h5tget_member_index_f
-
-
-!  !$!
-!  !$!****s* H5T/h5tget_member_dim_f
-!  !$!
-!  !$! NAME
-!  !$!		h5tget_member_dim_f
-!  !$!
-!  !$! PURPOSE
-!  !$! 	This function is not supported in hdf5-1.4.*
-!  !$!
-!  !$! INPUTS
-!  !$! OUTPUTS
-!  !$!		hdferr:		- error code
-!  !$!				 	Success:  0
-!  !$!				 	Failure: -1
-!  !$!
-!  !$! AUTHOR
-!  !$!	Elena Pourmal
-!  !$!		August 12, 1999
-!  !$!
-!  !$! HISTORY
-!  !$! 	Explicit Fortran interfaces were added for
-!  !$!			called C functions (it is needed for Windows
-!  !$!			port).  March 7, 2001
-!  !$!
-!  !$! SOURCE
-!  !$!  SUBROUTINE h5tget_member_dims_f(type_id, field_idx,dims, field_dims, perm, hdferr)
-!  !$!
-!  !$!            IMPLICIT NONE
-!  !$!            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-!  !$!            INTEGER, INTENT(IN) :: field_idx !Field index (0-based) of
-!  !$!                                             !field_dims, perm)
-!  !$!            INTEGER, INTENT(OUT) :: dims     !number of dimensions of the field
-!  !$!
-!  !$!            INTEGER(SIZE_T),DIMENSION(*), INTENT(OUT) ::  field_dims !buffer to store the
-!  !$!                                                                      !dimensions of the field
-!  !$!            INTEGER, DIMENSION(*), INTENT(OUT)  ::  perm  !buffer to store the
-!  !$!                                                                   !permutation vector of the field
-!  !$!            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!  !$!*****!
-!  !$! INTEGER, EXTERNAL :: h5tget_member_dims_c
-!  !$!            hdferr = h5tget_member_dims_c(type_id, field_idx, dims, field_dims, perm)
-!  !$!
-!  !$!          END SUBROUTINE h5tget_member_dims_f
-
-
-!****s* H5T/h5tget_array_dims_f
-!
-! NAME
-!  h5tget_array_dims_f
-!
-! PURPOSE
-!  Returns sizes of array dimensions.
-!
-! INPUTS
-!  type_id 	 - array datatype identifier
-! OUTPUTS
-!  dims 	 - buffer to store array datatype dimensions
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tget_array_dims_f(type_id, dims, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Array datatype identifier
-            INTEGER(HSIZE_T),DIMENSION(*), INTENT(OUT) ::  dims !buffer to store array datatype
-                                                                ! dimensions
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-
-            INTERFACE
-              INTEGER FUNCTION h5tget_array_dims_c(type_id, dims)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_ARRAY_DIMS_C'::h5tget_array_dims_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER(HSIZE_T),DIMENSION(*), INTENT(OUT) ::  dims
-              END FUNCTION h5tget_array_dims_c
-            END INTERFACE
-
-            hdferr = h5tget_array_dims_c(type_id, dims)
-
-          END SUBROUTINE h5tget_array_dims_f
-
-!
-!****s* H5T/h5tget_array_ndims_f
-!
-! NAME
-!  h5tget_array_ndims_f
-!
-! PURPOSE
-!  Returns the rank of an array datatype.
-!
-! INPUTS
-!  type_id 	 - array datatype identifier
-! OUTPUTS
-!  ndims 	 - number of array dimensions
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tget_array_ndims_f(type_id, ndims, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Array datatype identifier
-            INTEGER, INTENT(OUT) ::  ndims ! number of array dimensions
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tget_array_ndims_c(type_id, ndims)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_ARRAY_NDIMS_C'::h5tget_array_ndims_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER, INTENT(OUT) ::  ndims
-              END FUNCTION h5tget_array_ndims_c
-            END INTERFACE
-
-            hdferr = h5tget_array_ndims_c(type_id, ndims)
-
-          END SUBROUTINE h5tget_array_ndims_f
-
-!
-!****s* H5T/h5tget_super_f
-!
-! NAME
-!  h5tget_super_f
-!
-! PURPOSE
-!  Returns the base datatype from which a datatype is derived.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-! OUTPUTS
-!  base_type_id 	 - identifier of the base type
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tget_super_f(type_id, base_type_id, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! datatype identifier
-            INTEGER(HID_T), INTENT(OUT) :: base_type_id ! identifier of the datatype
-                                           ! from which datatype (type_id) was derived
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tget_super_c(type_id, base_type_id)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_SUPER_C'::h5tget_super_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER(HID_T), INTENT(OUT) :: base_type_id
-              END FUNCTION h5tget_super_c
-            END INTERFACE
-
-            hdferr = h5tget_super_c(type_id, base_type_id)
-
-          END SUBROUTINE h5tget_super_f
-
-!
-!****s* H5T/h5tget_member_type_f
-!
-! NAME
-!  h5tget_member_type_f
-!
-! PURPOSE
-!  Returns the datatype of the specified member.
-!
-! INPUTS
-!  type_id 	 - compound datatype identifier
-!  field_idx 	 - field index (0-based)
-!
-! OUTPUTS
-!  datatype 	 - idnetifier of the member's datatype
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tget_member_type_f(type_id,  field_idx, datatype, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER, INTENT(IN) :: field_idx !Field index (0-based) of the field type to retrieve
-            INTEGER(HID_T), INTENT(OUT) :: datatype !identifier of a copy of
-                                                    !the datatype of the field
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tget_member_type_c(type_id, field_idx , datatype)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_MEMBER_TYPE_C'::h5tget_member_type_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER, INTENT(IN) :: field_idx
-              INTEGER(HID_T), INTENT(OUT) :: datatype
-              END FUNCTION h5tget_member_type_c
-            END INTERFACE
-
-            hdferr = h5tget_member_type_c(type_id, field_idx , datatype)
-          END SUBROUTINE h5tget_member_type_f
-
-!
-!****s* H5T/h5tcreate_f
-!
-! NAME
-!  h5tcreate_f
-!
-! PURPOSE
-!  Creates a new datatype.
-!
-! INPUTS
-!  class   - Datatype class can be one of:
-!             H5T_COMPOUND_F
-!             H5T_ENUM_F
-!             H5T_OPAQUE_F
-!             H5T_STRING_F
-!
-!  size    - Size of the datatype.
-! OUTPUTS
-!  type_id - Datatype identifier.
-!  hdferr  - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tcreate_f(class, size, type_id, hdferr)
-    IMPLICIT NONE
-    INTEGER        , INTENT(IN)  :: class
-    INTEGER(SIZE_T), INTENT(IN)  :: size
-    INTEGER(HID_T) , INTENT(OUT) :: type_id
-    INTEGER        , INTENT(OUT) :: hdferr
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5tcreate_c(class, size, type_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TCREATE_C'::h5tcreate_c
-         !DEC$ENDIF
-         INTEGER, INTENT(IN) :: class
-         INTEGER(SIZE_T), INTENT(IN) :: size
-         INTEGER(HID_T), INTENT(OUT) :: type_id
-       END FUNCTION h5tcreate_c
-    END INTERFACE
-
-    hdferr = h5tcreate_c(class, size, type_id)
-  END SUBROUTINE h5tcreate_f
-
-!
-!****s* H5T/h5tinsert_f
-!
-! NAME
-!  h5tinsert_f
-!
-! PURPOSE
-!  Adds a new member to a compound datatype.
-!
-! INPUTS
-!  type_id 	 - compound dattype identifier
-!  name 	 - name of the field to insert
-!  offset 	 - start of the member in an instance of
-!                  the compound datatype
-!  field_id 	 - datatype identifier of the field to insert
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tinsert_f(type_id,  name, offset, field_id, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            CHARACTER(LEN=*), INTENT(IN) :: name !Name of the field to insert
-            INTEGER(SIZE_T), INTENT(IN) :: offset !start of the member in an instance of
-                                                   !the compound datatype
-            INTEGER(HID_T), INTENT(IN) :: field_id !datatype identifier of the new member
-
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTEGER :: namelen
-
-            INTERFACE
-              INTEGER FUNCTION h5tinsert_c(type_id, name, namelen, offset, field_id)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TINSERT_C'::h5tinsert_c
-              !DEC$ENDIF
-              !DEC$ATTRIBUTES reference :: name
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              CHARACTER(LEN=*), INTENT(IN) :: name
-              INTEGER(SIZE_T), INTENT(IN) :: offset
-              INTEGER(HID_T), INTENT(IN) :: field_id
-              INTEGER :: namelen
-              END FUNCTION h5tinsert_c
-            END INTERFACE
-
-            namelen = LEN(name)
-            hdferr = h5tinsert_c(type_id, name, namelen, offset, field_id )
-          END SUBROUTINE h5tinsert_f
-
-!
-!****s* H5T/h5tpack_f
-!
-! NAME
-!  h5tpack_f
-!
-! PURPOSE
-!  Recursively removes padding from within a compound datatype.
-!
-! INPUTS
-!  type_id 	 - compound datatype identifier
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tpack_f(type_id, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-
-            INTERFACE
-              INTEGER FUNCTION h5tpack_c(type_id)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TPACK_C'::h5tpack_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              END FUNCTION h5tpack_c
-            END INTERFACE
-
-            hdferr = h5tpack_c(type_id)
-          END SUBROUTINE h5tpack_f
-
-!  !$!
-!  !$!****s* H5T/h5tinsert_array_f
-!  !$!
-!  !$! NAME
-!  !$!		h5tinsert_array_f
-!  !$!
-!  !$! PURPOSE
-!  !$! 	This function is not available on hdf5-1.4.*
-!  !$!
-!  !$! INPUTS
-!  !$! OUTPUTS
-!  !$!		hdferr:		- error code
-!  !$!				 	Success:  0
-!  !$!				 	Failure: -1
-!  !$!
-!  !$! AUTHOR
-!  !$!	Elena Pourmal
-!  !$!		August 12, 1999
-!  !$!
-!  !$! HISTORY
-!  !$! 	Explicit Fortran interfaces were added for
-!  !$!			called C functions (it is needed for Windows
-!  !$!			port).  March 7, 2001
-!  !$! SOURCE
-!  SUBROUTINE h5tinsert_array_f(parent_id,name,offset, ndims, dims, member_id, hdferr, perm)
-!  IMPLICIT NONE
-!  INTEGER(HID_T), INTENT(IN) :: parent_id ! identifier of the parent compound datatype
-!  CHARACTER(LEN=*), INTENT(IN) :: name !Name of the new member
-!  INTEGER(SIZE_T), INTENT(IN) :: offset !Offset to start of new member
-!  !within compound datatype
-!  INTEGER, INTENT(IN) ::  ndims !Dimensionality of new member.
-!  !Valid values are 0 (zero) through 4 (four)
-!  INTEGER(SIZE_T), DIMENSION(*), INTENT(IN) :: dims !Size of new member array
-!  INTEGER(HID_T), INTENT(IN) :: member_id ! identifier of the datatype of the new member
-!  INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!  !*****!
-!  INTEGER, DIMENSION(*), OPTIONAL, INTENT(IN) :: perm
-!  !Pointer to buffer to store
-!  !the permutation vector of the field
-!  INTEGER :: namelen, sizeofperm
-!  INTEGER, EXTERNAL :: h5tinsert_array_c,  h5tinsert_array_c2
-!  namelen = LEN(name)
-!  if (present(perm)) then
-!  hdferr = h5tinsert_array_c(parent_id, name, namelen, offset, ndims,dims, member_id, perm)
-!  else
-!  hdferr = h5tinsert_array_c2(parent_id, name, namelen, offset, ndims,dims, member_id)
-!  end if
-!
-!  END SUBROUTINE h5tinsert_array_f
-
-!
-!****s* H5T/h5tarray_create_f
-!
-! NAME
-!  h5tarray_create_f
-!
-! PURPOSE
-!  Creates an array datatype object.
-!
-! INPUTS
-!  base_id 	 - datatype identifier for the array
-!                  base datatype
-!  rank 	 - rank of the array
-!  dims 	 - array dimension sizes
-! OUTPUTS
-!  type_id 	 - array datatype identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tarray_create_f(base_id, rank, dims, type_id, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: base_id ! identifier of array base datatype
-            INTEGER, INTENT(IN) ::  rank ! Rank of the array
-            INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: dims !Sizes of each array dimension
-            INTEGER(HID_T), INTENT(OUT) :: type_id ! identifier of the array datatype
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tarray_create_c(base_id, rank, dims, type_id)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TARRAY_CREATE_C'::h5tarray_create_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: base_id
-              INTEGER, INTENT(IN) ::  rank
-              INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: dims
-              INTEGER(HID_T), INTENT(OUT) :: type_id
-              END FUNCTION h5tarray_create_c
-            END INTERFACE
-
-            hdferr = h5tarray_create_c(base_id, rank, dims, type_id)
-
-         END SUBROUTINE h5tarray_create_f
-
-!
-!****s* H5T/h5tenum_create_f
-!
-! NAME
-!  h5tenum_create_f
-!
-! PURPOSE
-!  Creates a new enumeration datatype.
-!
-! INPUTS
-!  parent_id 	 - datatype identifier for base datatype
-! OUTPUTS
-!  new_type_id 	 - datatype identifier for the enumeration datatype
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tenum_create_f(parent_id, new_type_id, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: parent_id  ! Datatype identifier for
-                                                     ! the  base datatype
-            INTEGER(HID_T), INTENT(OUT) :: new_type_id
-                                                     !datatype identifier for the
-                                                     ! new enumeration datatype
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-
-            INTERFACE
-              INTEGER FUNCTION h5tenum_create_c(parent_id, new_type_id)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TENUM_CREATE_C'::h5tenum_create_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: parent_id
-              INTEGER(HID_T), INTENT(OUT) :: new_type_id
-              END FUNCTION h5tenum_create_c
-            END INTERFACE
-
-            hdferr = h5tenum_create_c(parent_id, new_type_id)
-          END SUBROUTINE h5tenum_create_f
-!
-!****s* H5T/h5tenum_nameof_f
-!
-! NAME
-!  h5tenum_nameof_f
-!
-! PURPOSE
-!  Returns the symbol name corresponding to a specified
-!  member of an enumeration datatype.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-!  value 	 - value of the enumeration datatype
-!  namelen 	 - name buffer size
-! OUTPUTS
-!  name 	 - buffer to hold symbol name
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-!
-! NOTE
-!   According to the standard: Because an INTENT(OUT) variable is considered undefined 
-!   on entry to the procedure, any default initialization specified for its type will 
-!   be applied. So we need to blank out the "name" to be portable and eliminate any 
-!   characters the "name' may contain upon entry, depending on compiler implementation.
-! SOURCE
-  SUBROUTINE h5tenum_nameof_f(type_id,  value, namelen, name, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            CHARACTER(LEN=*), INTENT(OUT) :: name  !Name of the  enumeration datatype.
-            INTEGER(SIZE_T), INTENT(IN) :: namelen !length of the name
-            INTEGER, INTENT(IN) :: value !value of the  enumeration datatype.
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-
-            INTERFACE
-              INTEGER FUNCTION h5tenum_nameof_c(type_id, value, name, namelen)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TENUM_NAMEOF_C'::h5tenum_nameof_c
-              !DEC$ENDIF
-              !DEC$ATTRIBUTES reference :: name
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              CHARACTER(LEN=*), INTENT(OUT) :: name
-              INTEGER(SIZE_T), INTENT(IN) :: namelen
-              INTEGER, INTENT(IN) :: value
-              END FUNCTION h5tenum_nameof_c
-            END INTERFACE
-
-            name(1:LEN(name)) = ' '
-
-            hdferr = h5tenum_nameof_c(type_id, value, name, namelen)
-          END SUBROUTINE h5tenum_nameof_f
-
-!
-!****s* H5T/h5tenum_valuof_f
-!
-! NAME
-!  h5tenum_valuof_f
-!
-! PURPOSE
-!  Returns the value corresponding to a specified
-!  member of an enumeration datatype.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-!  name 	 - symbol name
-! OUTPUTS
-!  value 	 - value of the enumeration datatype
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-!
-! SOURCE
-  SUBROUTINE h5tenum_valueof_f(type_id,  name, value, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            CHARACTER(LEN=*), INTENT(IN) :: name  !Name of the  enumeration datatype.
-            INTEGER, INTENT(OUT) :: value !value of the  enumeration datatype.
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTEGER :: namelen
-
-            INTERFACE
-              INTEGER FUNCTION h5tenum_valueof_c(type_id, name, namelen,  value)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TENUM_VALUEOF_C'::h5tenum_valueof_c
-              !DEC$ENDIF
-              !DEC$ATTRIBUTES reference :: name
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              CHARACTER(LEN=*), INTENT(IN) :: name
-              INTEGER, INTENT(IN) :: namelen
-              INTEGER, INTENT(OUT) :: value
-              END FUNCTION h5tenum_valueof_c
-            END INTERFACE
-
-            namelen = LEN(name)
-            hdferr = h5tenum_valueof_c(type_id, name, namelen,  value)
-          END SUBROUTINE h5tenum_valueof_f
-
-!
-!****s* H5T/h5tget_member_value_f
-!
-! NAME
-!  h5tget_member_value_f
-!
-! PURPOSE
-!  Returns the value of an enumeration datatype member.
-!
-! INPUTS
-!  type_id 	 - datatype identifier
-!  member_no 	 - number of the enumeration datatype member
-! OUTPUTS
-!  value 	 - value of the enumeration datatype
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tget_member_value_f(type_id,  member_no, value, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            INTEGER, INTENT(IN) :: member_no !Number of the enumeration datatype member
-            INTEGER, INTENT(OUT) :: value !value of the  enumeration datatype.
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-
-            INTERFACE
-              INTEGER FUNCTION h5tget_member_value_c(type_id, member_no, value)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_MEMBER_VALUE_C'::h5tget_member_value_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER, INTENT(IN) :: member_no
-              INTEGER, INTENT(OUT) :: value
-              END FUNCTION
-            END INTERFACE
-
-            hdferr = h5tget_member_value_c(type_id, member_no, value)
-          END SUBROUTINE h5tget_member_value_f
-
-!
-!****s* H5T/h5tset_tag_f
-!
-! NAME
-!  h5tset_tag_f
-!
-! PURPOSE
-!  Tags an opaque datatype.
-!
-! INPUTS
-!  type_id 	 - identifier for opaque datatype
-!  tag 	         - unique ASCII string with which the opaque
-!                  datatype is to be tagged.
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tset_tag_f(type_id, tag, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            CHARACTER(LEN=*), INTENT(IN) :: tag !Unique ASCII string with which
-                                                !the opaque datatype is to be tagged
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTEGER :: taglen
-
-            INTERFACE
-              INTEGER FUNCTION h5tset_tag_c(type_id, tag, taglen)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TSET_TAG_C'::h5tset_tag_c
-              !DEC$ENDIF
-              !DEC$ATTRIBUTES reference :: tag
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              CHARACTER(LEN=*), INTENT(IN) :: tag
-              INTEGER :: taglen
-              END FUNCTION h5tset_tag_c
-            END INTERFACE
-
-            taglen = LEN(tag)
-            hdferr = h5tset_tag_c(type_id, tag, taglen)
-          END SUBROUTINE h5tset_tag_f
-
-!
-!****s* H5T/h5tget_tag_f
-!
-! NAME
-!  h5tget_tag_f
-!
-! PURPOSE
-!  Gets the tag associated with an opaque datatype.
-!
-! INPUTS
-!  type_id 	 - identifier for opaque datatype
-! OUTPUTS
-!  tag 	         - unique ASCII string associated with opaque
-!                  datatype
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tget_tag_f(type_id, tag,taglen, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-            CHARACTER(LEN=*), INTENT(OUT) :: tag  ! Unique ASCII string with which
-                                                  !  the opaque datatype is to be tagged
-            INTEGER, INTENT(OUT) :: taglen        ! Length of tag
-            INTEGER(SIZE_T)      :: tag_size      ! Declared character length of tab 
-            INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tget_tag_c(type_id, tag, tag_size, taglen)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_TAG_C'::h5tget_tag_c
-              !DEC$ENDIF
-              !DEC$ATTRIBUTES reference :: tag
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              CHARACTER(LEN=*), INTENT(OUT) :: tag
-              INTEGER(SIZE_T), INTENT(IN) :: tag_size
-              INTEGER, INTENT(OUT) :: taglen
-              END FUNCTION h5tget_tag_c
-            END INTERFACE
-
-            tag_size = LEN(tag)
-
-            hdferr = h5tget_tag_c(type_id, tag, tag_size, taglen )
-          END SUBROUTINE h5tget_tag_f
-
-!
-!****s* H5T/h5tvlen_create_f
-!
-! NAME
-!  h5tvlen_create_f
-!
-! PURPOSE
-!  Creates a new variable-length datatype.
-!
-! INPUTS
-!  type_id 	 - identifier iof base datatype
-! OUTPUTS
-!  vltype_id 	 - identifier for VL datatype
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  Wednesday, October 23, 2002
-!
-! NOTES
-!  Only basic Fortran base datatypes are supported
-!
-! SOURCE
-  SUBROUTINE h5tvlen_create_f(type_id, vltype_id, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN)  :: type_id    ! Datatype identifier
-            INTEGER(HID_T), INTENT(OUT) :: vltype_id  ! VL datatype identifier
-            INTEGER, INTENT(OUT) :: hdferr            ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tvlen_create_c(type_id, vltype_id)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TVLEN_CREATE_C'::h5tvlen_create_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN)  :: type_id
-              INTEGER(HID_T), INTENT(OUT) :: vltype_id
-              END FUNCTION h5tvlen_create_c
-            END INTERFACE
-
-            hdferr = h5tvlen_create_c(type_id, vltype_id)
-          END SUBROUTINE h5tvlen_create_f
-
-!
-!****s* H5T/h5tis_variable_str_f
-!
-! NAME
-!  h5tis_variable_str_f
-!
-! PURPOSE
-!  Determines whether a dattype is a variable string.
-!
-! INPUTS
-!  type_id 	 - datartpe identifier
-! OUTPUTS
-!  status 	 - flag to indicate if datatype
-!                  is a variable string
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  March 12, 2003
-!
-! SOURCE
-  SUBROUTINE h5tis_variable_str_f(type_id, status, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id  ! Datatype identifier
-            LOGICAL, INTENT(OUT) :: status      ! Flag, idicates if datatype
-                                                ! is a variable string or not ( TRUE or
-                                                ! FALSE)
-            INTEGER, INTENT(OUT) :: hdferr      ! Error code
-!*****
-            INTEGER :: flag                     ! "TRUE/FALSE/ERROR from C"
-
-            INTERFACE
-              INTEGER FUNCTION h5tis_variable_str_c(type_id, flag)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TIS_VARIABLE_STR_C'::h5tis_variable_str_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER :: flag
-              END FUNCTION h5tis_variable_str_c
-            END INTERFACE
-
-            hdferr = h5tis_variable_str_c(type_id, flag)
-            status = .TRUE.
-            if (flag .EQ. 0) status = .FALSE.
-
-          END SUBROUTINE h5tis_variable_str_f
-
-!
-!****s* H5T/h5tget_member_class_f
-!
-! NAME
-!  h5tget_member_class_f
-!
-! PURPOSE
-!  Returns datatype class of compound datatype member.
-!
-! INPUTS
-!  type_id 	 - datartpe identifier
-!  member_no 	 - index of compound datatype member
-! OUTPUTS
-!  class 	 - class type for compound dadtype member
-!                  Valid classes:
-!                    H5T_NO_CLASS_F (error)
-!                    H5T_INTEGER_F
-!                    H5T_FLOAT_F
-!                    H5T_TIME_F
-!                    H5T_STRING_F
-!                    H5T_BITFIELD_F
-!                    H5T_OPAQUE_F
-!                    H5T_COMPOUND_F
-!                    H5T_REFERENCE_F
-!                    H5T_ENUM_F
-!                    H5T_VLEN_F
-!                    H5T_ARRAY_F
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  April 6, 2005
-!
-! SOURCE
-  SUBROUTINE h5tget_member_class_f(type_id, member_no, class, hdferr)
-            IMPLICIT NONE
-            INTEGER(HID_T), INTENT(IN) :: type_id  ! Datatype identifier
-            INTEGER, INTENT(IN)       :: member_no  ! Member number
-            INTEGER, INTENT(OUT)     :: class      ! Member class
-            INTEGER, INTENT(OUT) :: hdferr      ! Error code
-!*****
-            INTERFACE
-              INTEGER FUNCTION h5tget_member_class_c(type_id, member_no, class)
-              USE H5GLOBAL
-              !DEC$IF DEFINED(HDF5F90_WINDOWS)
-              !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_MEMBER_CLASS_C'::h5tget_member_class_c
-              !DEC$ENDIF
-              INTEGER(HID_T), INTENT(IN) :: type_id
-              INTEGER, INTENT(IN)       :: member_no
-              INTEGER, INTENT(OUT)     :: class
-              END FUNCTION h5tget_member_class_c
-            END INTERFACE
-
-            hdferr = h5tget_member_class_c(type_id, member_no, class)
-
-          END SUBROUTINE h5tget_member_class_f
-
-!
-!****s* H5T/h5tcommit_anon_f
-!
-! NAME
-!  h5tcommit_anon_f
-!
-! PURPOSE
-!  Commits a transient datatype to a file,
-!  creating a new named datatype,
-!  but does not link it into the file structure.
-!
-! INPUTS
-!  loc_id 	 - A file or group identifier specifying the file
-!                  in which the new named datatype is to be created.
-!  dtype_id 	 - A datatype identifier.
-!
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! OPTIONAL PARAMETERS
-!  tcpl_id 	 - A datatype creation property list identifier.
-!                  (H5P_DEFAULT_F for the default property list.)
-!  tapl_id 	 - A datatype access property list identifier.
-!                  should always be passed as the value H5P_DEFAULT_F.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 25, 2008
-!
-! SOURCE
-  SUBROUTINE h5tcommit_anon_f(loc_id, dtype_id, hdferr, tcpl_id, tapl_id)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: loc_id  ! A file or group identifier specifying
-                                          ! the file in which the new named datatype
-                                          ! is to be created.
-    INTEGER(HID_T), INTENT(IN) :: dtype_id  ! Datatype identifier
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: tcpl_id ! A datatype creation property
-                                                    ! list identifier.
-                                                    ! (H5P_DEFAULT_F for the default property list.)
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: tapl_id ! A datatype access property list identifier.
-                                                    ! should always be passed as the value H5P_DEFAULT_F.
-!*****
-    INTEGER(HID_T) :: tcpl_id_default
-    INTEGER(HID_T) :: tapl_id_default
-
-    INTERFACE
-       INTEGER FUNCTION h5tcommit_anon_c(loc_id, dtype_id, &
-            tcpl_id_default, tapl_id_default)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TCOMMIT_ANON_C'::h5tcommit_anon_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: loc_id
-         INTEGER(HID_T), INTENT(IN) :: dtype_id
-         INTEGER(HID_T) :: tcpl_id_default
-         INTEGER(HID_T) :: tapl_id_default
-       END FUNCTION h5tcommit_anon_c
-    END INTERFACE
-
-    tcpl_id_default = H5P_DEFAULT_F
-    tapl_id_default = H5P_DEFAULT_F
-
-    IF(PRESENT(tcpl_id)) tcpl_id_default = tcpl_id
-    IF(PRESENT(tapl_id)) tapl_id_default = tapl_id
-
-    hdferr = h5tcommit_anon_c(loc_id, dtype_id, &
-         tcpl_id_default, tapl_id_default )
-
-  END SUBROUTINE h5tcommit_anon_f
-
-!
-!****s* H5T/h5tcommitted_f
-!
-! NAME
-!  h5tcommitted_f
-!
-! PURPOSE
-!  Determines whether a datatype is a named type or a transient type.
-!
-! INPUTS
-!  dtype_id 	 - A datatype identifier.
-!
-! OUTPUTS
-!  committed 	 - .TRUE., if the datatype has been committed
-!                  .FALSE., if the datatype has not been committed.
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 25, 2008
-!
-! SOURCE
-  SUBROUTINE h5tcommitted_f(dtype_id, committed, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dtype_id  ! A datatype identifier
-    LOGICAL, INTENT(OUT) :: committed ! .TRUE., if the datatype has been committed
-                                      !.FALSE., if the datatype has not been committed.
-    INTEGER, INTENT(OUT) :: hdferr     ! Error code:
-!  Success:  0
-!  Failure: -1
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5tcommitted_c(dtype_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TCOMMITTED_C'::h5tcommitted_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dtype_id
-       END FUNCTION h5tcommitted_c
-    END INTERFACE
-
-    hdferr = h5tcommitted_c(dtype_id)
-
-    IF(hdferr.GT.0)THEN
-       committed = .TRUE.
-       hdferr = 0
-    ELSE IF(hdferr.EQ.0)THEN
-       committed = .FALSE.
-       hdferr = 0
-    ELSE
-       hdferr = -1
-    ENDIF
-
-
-  END SUBROUTINE h5tcommitted_f
-
-!
-!****s* H5T/H5Tdecode_f
-!
-! NAME
-!  H5Tdecode_f
-!
-! PURPOSE
-!  Decode a binary object description of data type and return a new object handle.
-! INPUTS
-!  buf 	         -  Buffer for the data space object to be decoded.
-!  obj_id 	 - Object ID
-! OUTPUTS
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  April 9, 2008
-!
-! SOURCE
-  SUBROUTINE h5tdecode_f(buf, obj_id, hdferr)
-    IMPLICIT NONE
-    CHARACTER(LEN=*), INTENT(IN) :: buf ! Buffer for the data space object to be decoded.
-    INTEGER(HID_T), INTENT(OUT) :: obj_id  ! Object ID
-    INTEGER, INTENT(OUT) :: hdferr     ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5tdecode_c(buf, obj_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TDECODE_C'::h5tdecode_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         CHARACTER(LEN=*), INTENT(IN) :: buf
-         INTEGER(HID_T), INTENT(OUT) :: obj_id  ! Object ID
-       END FUNCTION h5tdecode_c
-    END INTERFACE
-
-    hdferr = h5tdecode_c(buf, obj_id)
-
-  END SUBROUTINE h5tdecode_f
-
-!
-!****s* H5T/H5Tencode_f
-!
-! NAME
-!  H5Tencode_f
-!
-! PURPOSE
-!  Encode a data type object description into a binary buffer.
-!
-! INPUTS
-!  obj_id 	 - Identifier of the object to be encoded.
-!  buf 	         - Buffer for the object to be encoded into.
-!  nalloc 	 - The size of the allocated buffer.
-! OUTPUTS
-!  nalloc 	 - The size of the buffer needed.
-!  hdferr 	 - Returns 0 if successful and -1 if fails.
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  April 9, 2008
-! SOURCE
-  SUBROUTINE h5tencode_f(obj_id, buf, nalloc, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: obj_id ! Identifier of the object to be encoded.
-    CHARACTER(LEN=*), INTENT(OUT) :: buf ! Buffer for the object to be encoded into.
-    INTEGER(SIZE_T), INTENT(INOUT) :: nalloc ! The size of the allocated buffer.
-    INTEGER, INTENT(OUT) :: hdferr     ! Error code
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5tencode_c(buf, obj_id, nalloc)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TENCODE_C'::h5tencode_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: buf
-         INTEGER(HID_T), INTENT(IN) :: obj_id
-         CHARACTER(LEN=*), INTENT(OUT) :: buf
-         INTEGER(SIZE_T), INTENT(INOUT) :: nalloc
-       END FUNCTION h5tencode_c
-    END INTERFACE
-
-    hdferr = h5tencode_c(buf, obj_id, nalloc)
-
-  END SUBROUTINE h5tencode_f
-
-!
-!****s* H5T/h5tget_create_plist_f
-!
-! NAME
-!  h5tget_create_plist_f
-!
-! PURPOSE
-!  Returns a copy of a datatype creation property list.
-!
-! INPUTS
-!  dtype_id 	 - Datatype identifier
-! OUTPUTS
-!  dtpl_id 	 - Datatype property list identifier
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  April 9, 2008
-!
-! SOURCE
-  SUBROUTINE h5tget_create_plist_f(dtype_id, dtpl_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dtype_id  ! Datatype identifier
-    INTEGER(HID_T), INTENT(OUT) :: dtpl_id  ! Datatype property list identifier.
-    INTEGER, INTENT(OUT) :: hdferr       ! Error code:
-                                         ! 0 on success and -1 on failure
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5tget_create_plist_c(dtype_id, dtpl_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_CREATE_PLIST_C'::h5tget_create_plist_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dtype_id
-         INTEGER(HID_T), INTENT(OUT) :: dtpl_id
-       END FUNCTION h5tget_create_plist_c
-    END INTERFACE
-
-    hdferr = h5tget_create_plist_c(dtype_id, dtpl_id)
-  END SUBROUTINE h5tget_create_plist_f
-
-!
-!****s* H5T/h5tcompiler_conv_f
-!
-! NAME
-!  h5tcompiler_conv_f
-!
-! PURPOSE
-!  Check whether the library’s default conversion is hard conversion.R
-!
-! INPUTS
-!  src_id 	 - Identifier for the source datatype.
-!  dst_id 	 - Identifier for the destination datatype.
-! OUTPUTS
-!  flag 	 - TRUE for compiler conversion, FALSE for library conversion
-!  hdferr 	 - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  April 9, 2008
-! SOURCE
-  SUBROUTINE h5tcompiler_conv_f( src_id, dst_id, flag, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: src_id ! Identifier for the source datatype.
-    INTEGER(HID_T), INTENT(IN) :: dst_id ! Identifier for the destination datatype.
-    LOGICAL, INTENT(OUT) :: flag  ! .TRUE. for compiler conversion, .FALSE. for library conversion
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code:
-                                    ! 0 on success and -1 on failure
-!*****
-    INTEGER :: c_flag
-
-    INTERFACE
-       INTEGER FUNCTION h5tcompiler_conv_c(src_id, dst_id, c_flag)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TCOMPILER_CONV_C'::h5tcompiler_conv_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: src_id
-         INTEGER(HID_T), INTENT(IN) :: dst_id
-         INTEGER :: c_flag
-       END FUNCTION h5tcompiler_conv_c
-    END INTERFACE
-
-    hdferr = h5tcompiler_conv_c(src_id, dst_id, c_flag)
-
-    flag = .FALSE.
-    IF(c_flag .GT. 0) flag = .TRUE.
-
-  END SUBROUTINE h5tcompiler_conv_f
-
-!
-!****s* H5T/h5tget_native_type_f
-!
-! NAME
-!  h5tget_native_type_f
-!
-! PURPOSE
-!  Returns the native datatype of a specified datatype.
-!
-! INPUTS
-!  dtype_id 	 - Datatype identifier for the dataset datatype.
-!  
-!  direction 	 - Direction of search:
-!                  H5T_DIR_DEFAULT     = 0,    /*default direction is inscendent */
-!                  H5T_DIR_ASCEND      = 1,    /*in inscendent order             */
-!                  H5T_DIR_DESCEND     = 2     /*in descendent order             */
-!  * NOTE: In C it is defined as a structure: H5T_direction_t
-!
-! OUTPUTS
-!  native_dtype_id - The native datatype identifier for the specified dataset datatype
-!  hdferr 	   - Returns 0 if successful and -1 if fails
-! AUTHOR
-!  M. Scot Breitenfeld
-!  June 18, 2008
-! SOURCE
-  SUBROUTINE h5tget_native_type_f(dtype_id, direction, native_dtype_id, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dtype_id  ! Datatype identifier
-    INTEGER, INTENT(IN) :: direction  ! Direction of search:
-                                      ! H5T_DIR_ASCEND_F      = 1  in inscendent order
-                                      ! H5T_DIR_DESCEND_F     = 2  in descendent order
-    INTEGER(HID_T), INTENT(OUT) :: native_dtype_id  ! The native datatype identifier
-    INTEGER, INTENT(OUT) :: hdferr    ! Error code:
-                                      ! 0 on success and -1 on failure
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5tget_native_type_c(dtype_id, direction, native_dtype_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TGET_NATIVE_TYPE_C'::h5tget_native_type_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dtype_id
-         INTEGER, INTENT(IN) :: direction
-         INTEGER(HID_T), INTENT(OUT) :: native_dtype_id
-       END FUNCTION h5tget_native_type_c
-    END INTERFACE
-
-    hdferr = h5tget_native_type_c(dtype_id, direction, native_dtype_id)
-  END SUBROUTINE h5tget_native_type_f
-
-END MODULE H5T
diff --git a/fortran/src/H5Tff_F03.f90 b/fortran/src/H5Tff_F03.f90
deleted file mode 100644
index e88eda6..0000000
--- a/fortran/src/H5Tff_F03.f90
+++ /dev/null
@@ -1,224 +0,0 @@
-!****h* ROBODoc/H5T (F03)
-!
-! NAME
-!  H5T_PROVISIONAL
-!
-! PURPOSE
-!  This file contains Fortran 90 and Fortran 2003 interfaces for H5T functions.
-!  It contains the same functions as H5Tff_F90.f90 but includes the
-!  Fortran 2003 functions and the interface listings. This file will be compiled
-!  instead of H5Tff_F90.f90 if Fortran 2003 functions are enabled.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5T function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5T_PROVISIONAL
-
-  USE H5GLOBAL
-  USE, INTRINSIC :: ISO_C_BINDING
-
-!****t* H5T (F03)/hvl_t
-! Fortran2003 Derived Type:
-  TYPE hvl_t
-     INTEGER(size_t) :: len ! Length of VL data (in base type units)
-     TYPE(C_PTR) :: p       ! Pointer to VL data
-  END TYPE hvl_t
-
-!*****
-
-  INTERFACE h5tenum_insert_f
-     MODULE PROCEDURE h5tenum_insert_f03
-     MODULE PROCEDURE h5tenum_insert_f90
-  END INTERFACE
-
-CONTAINS
-
-!****s* H5T (F03)/H5Tconvert_f_F03
-!
-! NAME
-!  H5Tconvert_f
-!
-! PURPOSE
-!  Converts data from between specified datatypes.
-!
-! Inputs:
-!  src_id     - Identifier for the source datatype.
-!  dst_id     - Identifier for the destination datatype.
-!  nelmts     - Size of array buf.
-!  buf 	      - Array containing pre-conversion values.
-!  background - Optional background buffer.
-!  plist_id   -	Dataset transfer property list identifier.
-!
-! Outputs:
-!  buf 	      - Array containing post-conversion values.
-!  hdferr     - error code:
-!                 0 on success and -1 on failure
-! AUTHOR
-!  M. Scot Breitenfeld
-!  Decemember 8, 2008
-!
-! Fortran2003 Interface:
-  SUBROUTINE h5tconvert_f(src_id, dst_id, nelmts, buf, hdferr, background, plist_id)
-    USE, INTRINSIC :: ISO_C_BINDING
-    IMPLICIT NONE
-    INTEGER(HID_T) , INTENT(IN)               :: src_id
-    INTEGER(HID_T) , INTENT(IN)               :: dst_id
-    INTEGER(SIZE_T), INTENT(IN)               :: nelmts
-    TYPE(C_PTR)    , INTENT(INOUT)            :: buf
-    INTEGER        , INTENT(OUT)              :: hdferr
-    TYPE(C_PTR)    , INTENT(INOUT), OPTIONAL  :: background
-    INTEGER(HID_T) , INTENT(IN)   , OPTIONAL  :: plist_id
-!*****
-    INTEGER(HID_T) :: plist_id_default
-    TYPE(C_PTR) :: background_default
-
-    INTERFACE
-       INTEGER FUNCTION h5tconvert_c(src_id, dst_id, nelmts, buf, background, plist_id) &
-            BIND(C, NAME='h5tconvert_c')
-         USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr
-         USE H5GLOBAL
-         IMPLICIT NONE
-         INTEGER(HID_T) , INTENT(IN)           :: src_id
-         INTEGER(HID_T) , INTENT(IN)           :: dst_id
-         INTEGER(SIZE_T), INTENT(IN)           :: nelmts
-         TYPE(C_PTR)                , VALUE    :: buf
-         TYPE(C_PTR)                , VALUE    :: background
-         INTEGER(HID_T) , INTENT(IN)           :: plist_id
-       END FUNCTION h5tconvert_c
-    END INTERFACE
-
-    plist_id_default = H5P_DEFAULT_F
-    IF(PRESENT(plist_id)) plist_id_default = plist_id
-
-    background_default = C_NULL_PTR
-    IF(PRESENT(background)) background_default = background
-
-    hdferr = H5Tconvert_c(src_id, dst_id, nelmts, buf, background_default, plist_id_default)
-
-  END SUBROUTINE h5tconvert_f
-!
-!****s* (F03) H5T/h5tenum_insert_f90
-!
-! NAME
-!  h5tenum_insert_f
-!
-! PURPOSE
-!  Inserts a new enumeration datatype member.
-!
-! INPUTS
-!  type_id  - Datatype identifier for the enumeration datatype.
-!  name     - Datatype identifier.
-!  value    - Value of the new member.
-! OUTPUTS
-!  hdferr   - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tenum_insert_f90(type_id,  name, value, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name  !Name of  the new member
-    INTEGER, INTENT(IN) :: value ! value of the new member
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTEGER :: namelen
-    INTERFACE
-       INTEGER FUNCTION h5tenum_insert_c(type_id, name, namelen, value)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TENUM_INSERT_C'::h5tenum_insert_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: type_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN) :: value
-         INTEGER :: namelen
-       END FUNCTION h5tenum_insert_c
-    END INTERFACE
-            
-    namelen = LEN(name)
-    hdferr = h5tenum_insert_c(type_id, name, namelen, value)
-  END SUBROUTINE h5tenum_insert_f90
-
-!
-!****s* (F03) H5T/h5tenum_insert_f03
-!
-! NAME
-!  h5tenum_insert_f
-!
-! PURPOSE
-!  Inserts a new enumeration datatype member.
-!
-! INPUTS
-!  type_id  - Datatype identifier for the enumeration datatype.
-!  name     - Datatype identifier.
-!  value    - Pointer to the value of the new member.
-! OUTPUTS
-!  hdferr   - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  February 6, 2015
-!
-! HISTORY
-!  F2003 implementation of function
-! SOURCE
-  SUBROUTINE h5tenum_insert_f03(type_id, name, value, hdferr)
-    USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr, c_char
-    USE H5GLOBAL
-    IMPLICIT NONE
-    INTEGER(HID_T)  , INTENT(IN) :: type_id
-    CHARACTER(LEN=*), INTENT(IN) :: name
-    TYPE(C_PTR)     , INTENT(IN) :: value
-    INTEGER, INTENT(OUT) :: hdferr
-!*****
-    INTEGER :: namelen
-    
-    INTERFACE
-       INTEGER FUNCTION h5tenum_insert_ptr_c(type_id, name, namelen, value) &
-            BIND(C, NAME='h5tenum_insert_ptr_c')
-         USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr, c_char
-         USE H5GLOBAL
-         IMPLICIT NONE
-         INTEGER(HID_T)  , INTENT(IN) :: type_id
-         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name
-         INTEGER :: namelen
-         TYPE(C_PTR), VALUE :: value
-       END FUNCTION h5tenum_insert_ptr_c
-    END INTERFACE
-            
-    namelen = LEN(name)
-    hdferr = h5tenum_insert_ptr_c(type_id, name, namelen, value)
-  END SUBROUTINE h5tenum_insert_f03
-
-
-END MODULE H5T_PROVISIONAL
-
diff --git a/fortran/src/H5Tff_F90.f90 b/fortran/src/H5Tff_F90.f90
deleted file mode 100644
index 7a9fd39..0000000
--- a/fortran/src/H5Tff_F90.f90
+++ /dev/null
@@ -1,96 +0,0 @@
-!****h* ROBODoc/H5T (F90)
-!
-! NAME
-!  MODULE H5T_PROVISIONAL
-!
-! PURPOSE
-!  This file contains Fortran 90 interfaces for H5T functions. It contains
-!  the same functions as H5Tff_F03.f90 but excludes the Fortran 2003 functions
-!  and the interface listings. This file will be compiled instead of H5Tff_F03.f90
-!  if Fortran 2003 functions are not enabled.
-!
-! NOTE
-!  Currently contains no functions.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!                         *** IMPORTANT ***
-!  If you add a new H5D function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!*****
-
-MODULE H5T_PROVISIONAL
-
-  USE H5GLOBAL
-
-CONTAINS
-
-!
-!****s* H5T/h5tenum_insert_f
-!
-! NAME
-!  h5tenum_insert_f
-!
-! PURPOSE
-!  Inserts a new enumeration datatype member.
-!
-! INPUTS
-!  type_id  - Datatype identifier for the enumeration datatype.
-!  name     - Datatype identifier.
-!  value    - Value of the new member.
-! OUTPUTS
-!  hdferr   - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  March 7, 2001
-! SOURCE
-  SUBROUTINE h5tenum_insert_f(type_id,  name, value, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: type_id
-    CHARACTER(LEN=*), INTENT(IN) :: name
-    INTEGER, INTENT(IN) :: value
-    INTEGER, INTENT(OUT) :: hdferr
-!*****
-    INTEGER :: namelen
-    
-    INTERFACE
-       INTEGER FUNCTION h5tenum_insert_c(type_id, name, namelen, value)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TENUM_INSERT_C'::h5tenum_insert_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: type_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN) :: value
-         INTEGER :: namelen
-       END FUNCTION h5tenum_insert_c
-    END INTERFACE
-    
-    namelen = LEN(name)
-    hdferr = h5tenum_insert_c(type_id, name, namelen, value)
-  END SUBROUTINE h5tenum_insert_f
-  
-
-END MODULE H5T_PROVISIONAL
diff --git a/fortran/src/H5Zf.c b/fortran/src/H5Zf.c
index 169e018..a8cf1c2 100644
--- a/fortran/src/H5Zf.c
+++ b/fortran/src/H5Zf.c
@@ -1,6 +1,6 @@
 /****h* H5Zf/H5Zf
  * PURPOSE
- *   This file contains C stubs for H5Z Fortran APIs
+ *  This file contains C stubs for H5Z Fortran APIs
  *
  * COPYRIGHT
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -25,22 +25,22 @@
 
 /****if* H5Zf/h5zunregister_c
  * NAME
- *        h5zunregister_c
+ *  h5zunregister_c
  * PURPOSE
- *     Call H5Zunregister to unregister filter
+ *  Call H5Zunregister to unregister filter
  * INPUTS
- *      filter identifier
+ *  filter identifier
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, March 12, 2003
+ *  Wednesday, March 12, 2003
  * HISTORY
  *
  * SOURCE
 */
 int_f
-nh5zunregister_c (int_f *filter)
+h5zunregister_c (int_f *filter)
 /******/
 {
      int ret_value = -1;
@@ -58,25 +58,25 @@ nh5zunregister_c (int_f *filter)
 }
 /****if* H5Zf/h5zfiletr_avail_c
  * NAME
- *        h5zfiletr_avail_c
+ *  h5zfiletr_avail_c
  * PURPOSE
- *     Call H5Zfilter_avail to find if filter is available
+ *  Call H5Zfilter_avail to find if filter is available
  * INPUTS
- *      filter - filter identifier
+ *  filter - filter identifier
  * OUTPUTS
- *     flag - status flag
+ *  flag - status flag
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Elena Pourmal
- *              Wednesday, March 12, 2003
+ *  Wednesday, March 12, 2003
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5zfilter_avail_c ( int_f *filter , int_f *flag )
+h5zfilter_avail_c ( int_f *filter , int_f *flag )
 /******/
 {
   int ret_value = 0;
@@ -92,26 +92,26 @@ nh5zfilter_avail_c ( int_f *filter , int_f *flag )
 
 /****if* H5Zf/h5zget_filter_info_c
  * NAME
- *        h5zget_filter_info_c
+ *  h5zget_filter_info_c
  * PURPOSE
- *     Call H5Zget_filter_info to find if filter has its encoder
- *              and/or its decoder available
+ *  Call H5Zget_filter_info to find if filter has its encoder
+ *  and/or its decoder available
  * INPUTS
- *      filter - filter identifier
+ *  filter - filter identifier
  * OUTPUTS
- *     flag - status flag
+ *  flag - status flag
  * RETURNS
- *     0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
  *  Nat Furrer and James Laird
- *              Wednesday, June 16, 2004
+ *  Wednesday, June 16, 2004
  * HISTORY
  *
  * SOURCE
 */
 
 int_f
-nh5zget_filter_info_c ( int_f *filter , int_f *flag )
+h5zget_filter_info_c ( int_f *filter , int_f *flag )
 /******/
 {
   int ret_value = 0;
diff --git a/fortran/src/H5Zff.F90 b/fortran/src/H5Zff.F90
new file mode 100644
index 0000000..0259959
--- /dev/null
+++ b/fortran/src/H5Zff.F90
@@ -0,0 +1,189 @@
+!****h* ROBODoc/H5Z
+!
+! NAME
+!  MODULE H5Z
+!
+! PURPOSE
+!  This file contains Fortran interfaces for H5Z functions.
+!
+! COPYRIGHT
+!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!  Copyright by The HDF Group.                                                 *
+!  Copyright by the Board of Trustees of the University of Illinois.           *
+!  All rights reserved.                                                        *
+!                                                                              *
+!  This file is part of HDF5.  The full HDF5 copyright notice, including       *
+!  terms governing use, modification, and redistribution, is contained in      *
+!  the files COPYING and Copyright.html.  COPYING can be found at the root     *
+!  of the source code distribution tree; Copyright.html can be found at the    *
+!  root level of an installed copy of the electronic HDF5 document set and     *
+!  is linked from the top-level documents page.  It can also be found at       *
+!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have            *
+!  access to either file, you may request a copy from help at hdfgroup.org.       *
+!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! NOTES!
+!       _____ __  __ _____   ____  _____ _______       _   _ _______
+!      |_   _|  \/  |  __ \ / __ \|  __ \__   __|/\   | \ | |__   __|
+! ****   | | | \  / | |__) | |  | | |__) | | |  /  \  |  \| |  | |    ****
+! ****   | | | |\/| |  ___/| |  | |  _  /  | | / /\ \ | . ` |  | |    ****
+! ****  _| |_| |  | | |    | |__| | | \ \  | |/ ____ \| |\  |  | |    ****
+!      |_____|_|  |_|_|     \____/|_|  \_\ |_/_/    \_\_| \_|  |_|
+!
+!  If you add a new H5Z function you must add the function name to the
+!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
+!  This is needed for Windows based operating systems.
+!
+!*****
+
+MODULE H5Z
+
+  USE H5GLOBAL
+
+CONTAINS
+
+!****s* H5Z/h5zunregister_f
+!
+! NAME
+!  h5zunregister_f
+!
+! PURPOSE
+!  Unregisters specified filetr
+!
+! INPUTS
+!  filter - Filter; may have one of the following values:
+!            H5Z_FILTER_DEFLATE_F
+!            H5Z_FILTER_SZIP_F
+!            H5Z_FILTER_NBIT_F
+!            H5Z_FILTER_SCALEOFFSET_F
+!            H5Z_FILTER_SHUFFLE_F
+!            H5Z_FILTER_FLETCHER32_F
+!            
+! OUTPUTS
+!  hdferr - Error code
+!            Success:  0
+!            Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  March 12, 2003
+!
+! SOURCE
+  SUBROUTINE h5zunregister_f(filter, hdferr)
+    IMPLICIT NONE
+    INTEGER, INTENT(IN)  :: filter
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5zunregister_c(filter) BIND(C,NAME='h5zunregister_c')
+         INTEGER, INTENT(IN) :: filter
+       END FUNCTION h5zunregister_c
+    END INTERFACE
+    hdferr = h5zunregister_c(filter)
+  END SUBROUTINE h5zunregister_f
+
+!****s* H5Z/h5zfilter_avail_f
+! NAME
+!  h5zfilter_avail_f
+!
+! PURPOSE
+!  Queries if filter is available
+!
+! INPUTS
+!  filter 	 - Filter; may be one of the following:
+!                   H5Z_FILTER_DEFLATE_F
+!                   H5Z_FILTER_SZIP_F
+!                   H5Z_FILTER_NBIT_F
+!                   H5Z_FILTER_SCALEOFFSET_F
+!                   H5Z_FILTER_SHUFFLE_F
+!                   H5Z_FILTER_FLETCHER32_F
+! OUTPUTS
+!  status 	 - Flag; .TRUE. if filter is available,
+!                  .FALSE. otherwise
+!  hdferr:	 - Error code
+!                   Success:  0
+!                   Failure: -1
+!
+! AUTHOR
+!  Elena Pourmal
+!  March 12, 2003
+!
+! SOURCE
+  SUBROUTINE h5zfilter_avail_f(filter, status, hdferr)
+    IMPLICIT NONE
+    INTEGER, INTENT(IN)  :: filter
+    LOGICAL, INTENT(OUT) :: status
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+    INTEGER :: flag                     ! "TRUE/FALSE/ERROR from C"
+
+    INTERFACE
+       INTEGER FUNCTION h5zfilter_avail_c(filter, flag) BIND(C,NAME='h5zfilter_avail_c')
+         IMPLICIT NONE
+         INTEGER, INTENT(IN) :: filter
+         INTEGER :: flag
+       END FUNCTION h5zfilter_avail_c
+    END INTERFACE
+
+    hdferr = h5zfilter_avail_c(filter, flag)
+    status = .TRUE.
+    IF (flag .EQ. 0) status = .FALSE.
+
+  END SUBROUTINE h5zfilter_avail_f
+
+!****s* H5Z/h5zget_filter_info_f
+!
+! NAME
+!  h5zget_filter_info_f
+!
+! PURPOSE
+!  Queries if filter has its encoder and/or decoder
+!  available
+!
+! INPUTS
+!  filter 	 - Filter; may be one of the following:
+!                   H5Z_FILTER_DEFLATE_F
+!                   H5Z_FILTER_SZIP_F
+!                   H5Z_FILTER_NBIT_F
+!                   H5Z_FILTER_SCALEOFFSET_F
+!                   H5Z_FILTER_SHUFFLE_F
+!                   H5Z_FILTER_FLETCHER32_Ffilter
+! OUTPUTS
+!  config_flags  - Flag, indicates if filter has its encoder 
+!                  and/or decoder available, possibly containing the
+!                  following values:
+!                     H5Z_FILTER_ENCODE_ENABLED_F
+!                     H5Z_FILTER_DECODE_ENABLED_F
+!  hdferr:	 - Error code
+!                   Success:  0
+!                   Failure: -1
+!
+! AUTHOR
+!  Nat Furrer and James Laird
+!  June 16, 2004
+! SOURCE
+  SUBROUTINE h5zget_filter_info_f(filter, config_flags, hdferr)
+    IMPLICIT NONE
+    INTEGER, INTENT(IN)  :: filter
+    INTEGER, INTENT(OUT) :: config_flags
+    INTEGER, INTENT(OUT) :: hdferr
+!*****
+
+    INTERFACE
+       INTEGER FUNCTION h5zget_filter_info_c(filter, config_flags) BIND(C,NAME='h5zget_filter_info_c')
+         IMPLICIT NONE
+         INTEGER, INTENT(IN) :: filter
+         INTEGER, INTENT(OUT) :: config_flags
+       END FUNCTION h5zget_filter_info_c
+    END INTERFACE
+
+    hdferr = h5zget_filter_info_c(filter, config_flags)
+
+  END SUBROUTINE h5zget_filter_info_f
+
+END MODULE H5Z
+
+
+
+
+
diff --git a/fortran/src/H5Zff.f90 b/fortran/src/H5Zff.f90
deleted file mode 100644
index 7b67b5b..0000000
--- a/fortran/src/H5Zff.f90
+++ /dev/null
@@ -1,198 +0,0 @@
-!****h* ROBODoc/H5Z
-!
-! NAME
-!  MODULE H5Z
-!
-! PURPOSE
-!  This file contains Fortran interfaces for H5Z functions. It includes
-!  all the functions that are independent on whether the Fortran 2003 functions
-!  are enabled or disabled.
-!
-!
-! COPYRIGHT
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!  Copyright by The HDF Group.                                               *
-!  Copyright by the Board of Trustees of the University of Illinois.         *
-!  All rights reserved.                                                      *
-!  *
-!  This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!  terms governing use, modification, and redistribution, is contained in    *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!  of the source code distribution tree; Copyright.html can be found at the  *
-!  root level of an installed copy of the electronic HDF5 document set and   *
-!  is linked from the top-level documents page.  It can also be found at     *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!  access to either file, you may request a copy from help at hdfgroup.org.     *
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new H5Z function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5Z
-
-  USE H5GLOBAL
-
-CONTAINS
-
-!****s* H5Z/h5zunregister_f
-!
-! NAME
-!  h5zunregister_f
-!
-! PURPOSE
-!  Unregisters specified filetr
-!
-! INPUTS
-!  filter - filter; may have one of the following values:
-!            H5Z_FILTER_DEFLATE_F
-!            H5Z_FILTER_SZIP_F
-!            H5Z_FILTER_NBIT_F
-!            H5Z_FILTER_SCALEOFFSET_F
-!            H5Z_FILTER_SHUFFLE_F
-!            H5Z_FILTER_FLETCHER32_F
-!            
-! OUTPUTS
-!  hdferr - error code
-!            Success:  0
-!            Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  March 12, 2003
-!
-! SOURCE
-  SUBROUTINE h5zunregister_f(filter, hdferr)
-    IMPLICIT NONE
-    INTEGER, INTENT(IN)  :: filter
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5zunregister_c (filter)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5ZUNREGISTER_C':: h5zunregister_c
-         !DEC$ENDIF
-         INTEGER, INTENT(IN) :: filter
-       END FUNCTION h5zunregister_c
-    END INTERFACE
-    hdferr = h5zunregister_c (filter)
-  END SUBROUTINE h5zunregister_f
-
-!****s* H5Z/h5zfilter_avail_f
-! NAME
-!  h5zfilter_avail_f
-!
-! PURPOSE
-!  Queries if filter is available
-!
-! INPUTS
-!  filter 	 - filter
-! OUTPUTS
-!  status 	 - status; .TRUE. if filter is available,
-!                  .FALSE. otherwise
-!  hdferr:	 - error code
-!                   Success:  0
-!                   Failure: -1
-!
-! AUTHOR
-!  Elena Pourmal
-!  March 12, 2003
-!
-! SOURCE
-  SUBROUTINE h5zfilter_avail_f(filter, status, hdferr)
-    IMPLICIT NONE
-    INTEGER, INTENT(IN)  :: filter      ! Filter; may be one of the following:
-                                        !   H5Z_FILTER_DEFLATE_F
-                                        !   H5Z_FILTER_SZIP_F
-                                        !   H5Z_FILTER_NBIT_F
-                                        !   H5Z_FILTER_SCALEOFFSET_F
-                                        !   H5Z_FILTER_SHUFFLE_F
-                                        !   H5Z_FILTER_FLETCHER32_F
-    LOGICAL, INTENT(OUT) :: status      ! Flag, idicates if filter
-                                        ! is availble  not ( TRUE or
-                                        ! FALSE)
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-!*****
-    INTEGER :: flag                     ! "TRUE/FALSE/ERROR from C"
-
-    INTERFACE
-       INTEGER FUNCTION h5zfilter_avail_c(filter, flag)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5ZFILTER_AVAIL_C'::h5zfilter_avail_c
-         !DEC$ENDIF
-         INTEGER, INTENT(IN) :: filter
-         INTEGER :: flag
-       END FUNCTION h5zfilter_avail_c
-    END INTERFACE
-
-    hdferr = h5zfilter_avail_c(filter, flag)
-    status = .TRUE.
-    IF (flag .EQ. 0) status = .FALSE.
-
-  END SUBROUTINE h5zfilter_avail_f
-!****s* H5Z/h5zget_filter_info_f
-!
-! NAME
-!  h5zget_filter_info_f
-!
-! PURPOSE
-!  Queries if filter has its encoder and/or decoder
-!  available
-!
-! INPUTS
-!  filter 	 - filter
-! OUTPUTS
-!  config_flags  - Bit vector possibly containing the
-!                  following values:
-!                     H5Z_FILTER_ENCODE_ENABLED_F
-!                     H5Z_FILTER_DECODE_ENABLED_F
-!  hdferr:	 - error code
-!                   Success:  0
-!                   Failure: -1
-!
-! AUTHOR
-!  Nat Furrer and James Laird
-!  June 16, 2004
-! SOURCE
-  SUBROUTINE h5zget_filter_info_f(filter, config_flags, hdferr)
-    IMPLICIT NONE
-    INTEGER, INTENT(IN)  :: filter      ! Filter; may be one of the following:
-                                        !   H5Z_FILTER_DEFLATE_F
-                                        !   H5Z_FILTER_SZIP_F
-                                        !   H5Z_FILTER_NBIT_F
-                                        !   H5Z_FILTER_SCALEOFFSET_F
-                                        !   H5Z_FILTER_SHUFFLE_F
-                                        !   H5Z_FILTER_FLETCHER32_F
-    INTEGER, INTENT(OUT) :: config_flags! Flag, indicates if filter
-                                        ! has its encoder and/or decoder
-                                        ! available
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-!*****
-
-    INTERFACE
-       INTEGER FUNCTION h5zget_filter_info_c(filter, config_flags)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5ZGET_FILTER_INFO_C'::h5zget_filter_info_c
-         !DEC$ENDIF
-         INTEGER, INTENT(IN) :: filter
-         INTEGER, INTENT(OUT) :: config_flags
-       END FUNCTION h5zget_filter_info_c
-    END INTERFACE
-
-    hdferr = h5zget_filter_info_c(filter, config_flags)
-
-  END SUBROUTINE h5zget_filter_info_f
-
-END MODULE H5Z
-
-
-
-
-
diff --git a/fortran/src/H5_DBLE_InterfaceExclude.f90 b/fortran/src/H5_DBLE_InterfaceExclude.f90
deleted file mode 100644
index 2a3e26f..0000000
--- a/fortran/src/H5_DBLE_InterfaceExclude.f90
+++ /dev/null
@@ -1,39 +0,0 @@
-!****h* fortran/src/H5_DBLE_InterfaceExclude.f90
-!
-! NAME
-!   H5_DBLE_INTERFACE
-!
-! FUNCTION
-!   This module is used for when the default REAL is of type DOUBLE PRECISION.
-!   We do not include the double precision interfaces if the defaut REAL is
-!   DOUBLE PRECISION since this would lead to a non-unique conflict with the
-!   generic interfaces declared as REAL and those declared as DOUBLE PRECISION.
-!
-! NOTES
-!   Empty module.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!
-!*****
-
-MODULE H5_DBLE_INTERFACE
-
-
-END MODULE H5_DBLE_INTERFACE
diff --git a/fortran/src/H5_DBLE_InterfaceInclude.f90 b/fortran/src/H5_DBLE_InterfaceInclude.f90
deleted file mode 100644
index 11e0a85..0000000
--- a/fortran/src/H5_DBLE_InterfaceInclude.f90
+++ /dev/null
@@ -1,1859 +0,0 @@
-!****h* fortran/src/H5_DBLE_InterfaceInclude.f90
-!
-! NAME
-!   H5_DBLE_INTERFACE
-!
-! FUNCTION
-!   This module is used for when the default REAL is not of the type DOUBLE PRECISION.
-!   We only do not include the double precision interfaces if the defaut REAL is
-!   DOUBLE PRECISION since this would lead to a non-unique conflict with the
-!   generic interfaces declared as REAL. Otherwise it is okay to include the interfaces.
-!
-! NOTES
-!   This module contains all the DOUBLE PRECISION interfaces and corresponding subroutines
-!   from the HDF function catagory H5A, H5D and H5P.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!
-!*****
-
-MODULE H5_DBLE_INTERFACE
-
-  USE H5GLOBAL
-
-  !
-  ! ----- H5A ----
-  !
-  INTERFACE h5awrite_f
-     MODULE PROCEDURE h5awrite_double_scalar
-     MODULE PROCEDURE h5awrite_double_1
-     MODULE PROCEDURE h5awrite_double_2
-     MODULE PROCEDURE h5awrite_double_3
-     MODULE PROCEDURE h5awrite_double_4
-     MODULE PROCEDURE h5awrite_double_5
-     MODULE PROCEDURE h5awrite_double_6
-     MODULE PROCEDURE h5awrite_double_7
-  END INTERFACE
-
-  INTERFACE h5aread_f
-     MODULE PROCEDURE h5aread_double_scalar
-     MODULE PROCEDURE h5aread_double_1
-     MODULE PROCEDURE h5aread_double_2
-     MODULE PROCEDURE h5aread_double_3
-     MODULE PROCEDURE h5aread_double_4
-     MODULE PROCEDURE h5aread_double_5
-     MODULE PROCEDURE h5aread_double_6
-     MODULE PROCEDURE h5aread_double_7
-  END INTERFACE
-  !
-  ! ----- H5D ----
-  !
-  INTERFACE h5dwrite_f
-     MODULE PROCEDURE h5dwrite_double_scalar
-     MODULE PROCEDURE h5dwrite_double_1
-     MODULE PROCEDURE h5dwrite_double_2
-     MODULE PROCEDURE h5dwrite_double_3
-     MODULE PROCEDURE h5dwrite_double_4
-     MODULE PROCEDURE h5dwrite_double_5
-     MODULE PROCEDURE h5dwrite_double_6
-     MODULE PROCEDURE h5dwrite_double_7
-  END INTERFACE
-
-  INTERFACE h5dread_f
-     MODULE PROCEDURE h5dread_double_scalar
-     MODULE PROCEDURE h5dread_double_1
-     MODULE PROCEDURE h5dread_double_2
-     MODULE PROCEDURE h5dread_double_3
-     MODULE PROCEDURE h5dread_double_4
-     MODULE PROCEDURE h5dread_double_5
-     MODULE PROCEDURE h5dread_double_6
-     MODULE PROCEDURE h5dread_double_7
-  END INTERFACE
-
-  INTERFACE h5dfill_f
-     MODULE PROCEDURE h5dfill_double
-  END INTERFACE
-
-  !
-  ! ----- H5P ----
-  !
-  INTERFACE h5pset_fill_value_f
-     MODULE PROCEDURE h5pset_fill_value_double
-  END INTERFACE
-
-  INTERFACE h5pget_fill_value_f
-     MODULE PROCEDURE h5pget_fill_value_double
-  END INTERFACE
-
-  INTERFACE h5pset_f
-     MODULE PROCEDURE h5pset_double
-  END INTERFACE
-
-  INTERFACE h5pget_f
-     MODULE PROCEDURE h5pget_double
-  END INTERFACE
-
-  INTERFACE h5pregister_f
-     MODULE PROCEDURE h5pregister_double
-  END INTERFACE
-
-  INTERFACE h5pinsert_f
-     MODULE PROCEDURE h5pinsert_double
-  END INTERFACE
-
-CONTAINS
-
-  !
-  ! ----- H5A ----
-  !
-  SUBROUTINE h5awrite_double_scalar(attr_id, memtype_id,  buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id    ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                                ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    DOUBLE PRECISION, INTENT(IN) :: buf     ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_double_s_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_double_s_c(attr_id, memtype_id,  buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_DOUBLE_S_C'::h5awrite_double_s_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         DOUBLE PRECISION, INTENT(IN)::buf
-       END FUNCTION h5awrite_double_s_c
-    END INTERFACE
-
-    hdferr = h5awrite_double_s_c(attr_id, memtype_id,  buf, dims)
-  END SUBROUTINE h5awrite_double_scalar
-
-  SUBROUTINE h5awrite_double_1(attr_id, memtype_id,  buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id   ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                                ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    DOUBLE PRECISION, INTENT(IN), &
-         DIMENSION(dims(1)) :: buf ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_double_1_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_double_1_c(attr_id, memtype_id,  buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_DOUBLE_1_C'::h5awrite_double_1_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         DOUBLE PRECISION, INTENT(IN), &
-              DIMENSION(dims(1)) :: buf
-       END FUNCTION h5awrite_double_1_c
-    END INTERFACE
-
-    hdferr = h5awrite_double_1_c(attr_id, memtype_id,  buf, dims)
-  END SUBROUTINE h5awrite_double_1
-
-
-  SUBROUTINE h5awrite_double_2(attr_id, memtype_id,  buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id   ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                                ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    DOUBLE PRECISION, INTENT(IN), &
-         DIMENSION(dims(1),dims(2)) :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_double_2_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_double_2_c(attr_id, memtype_id,  buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_DOUBLE_2_C'::h5awrite_double_2_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         DOUBLE PRECISION, INTENT(IN), &
-              DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5awrite_double_2_c
-    END INTERFACE
-
-    hdferr = h5awrite_double_2_c(attr_id, memtype_id,  buf, dims)
-  END SUBROUTINE h5awrite_double_2
-
-
-  SUBROUTINE h5awrite_double_3(attr_id, memtype_id,  buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id   ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                                ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    DOUBLE PRECISION, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_double_3_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_double_3_c(attr_id, memtype_id,  buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_DOUBLE_3_C'::h5awrite_double_3_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         DOUBLE PRECISION, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf
-       END FUNCTION h5awrite_double_3_c
-    END INTERFACE
-
-    hdferr = h5awrite_double_3_c(attr_id, memtype_id,  buf, dims)
-  END SUBROUTINE h5awrite_double_3
-
-
-  SUBROUTINE h5awrite_double_4(attr_id, memtype_id,  buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id   ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                                ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    DOUBLE PRECISION, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_double_4_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_double_4_c(attr_id, memtype_id,  buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_DOUBLE_4_C'::h5awrite_double_4_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         DOUBLE PRECISION, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-       END FUNCTION h5awrite_double_4_c
-    END INTERFACE
-
-    hdferr = h5awrite_double_4_c(attr_id, memtype_id,  buf, dims)
-  END SUBROUTINE h5awrite_double_4
-
-
-  SUBROUTINE h5awrite_double_5(attr_id, memtype_id,  buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id   ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                                ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    DOUBLE PRECISION, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_double_5_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_double_5_c(attr_id, memtype_id,  buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_DOUBLE_5_C'::h5awrite_double_5_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         DOUBLE PRECISION, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-       END FUNCTION h5awrite_double_5_c
-    END INTERFACE
-
-    hdferr = h5awrite_double_5_c(attr_id, memtype_id,  buf, dims)
-  END SUBROUTINE h5awrite_double_5
-
-
-  SUBROUTINE h5awrite_double_6(attr_id, memtype_id,  buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id   ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                                ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    DOUBLE PRECISION, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_double_6_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_double_6_c(attr_id, memtype_id,  buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_DOUBLE_6_C'::h5awrite_double_6_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         DOUBLE PRECISION, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-       END FUNCTION h5awrite_double_6_c
-    END INTERFACE
-
-    hdferr = h5awrite_double_6_c(attr_id, memtype_id,  buf, dims)
-  END SUBROUTINE h5awrite_double_6
-
-
-  SUBROUTINE h5awrite_double_7(attr_id, memtype_id,  buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id   ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                                ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    DOUBLE PRECISION, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5awrite_double_7_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5awrite_double_7_c(attr_id, memtype_id,  buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AWRITE_DOUBLE_7_C'::h5awrite_double_7_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         DOUBLE PRECISION, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-       END FUNCTION h5awrite_double_7_c
-    END INTERFACE
-
-    hdferr = h5awrite_double_7_c(attr_id, memtype_id,  buf, dims)
-  END SUBROUTINE h5awrite_double_7
-
-
-  SUBROUTINE h5aread_double_scalar(attr_id, memtype_id,  buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id   ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                                ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    DOUBLE PRECISION, INTENT(INOUT) :: buf    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_double_s_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_double_s_c(attr_id, memtype_id,  buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_DOUBLE_S_C'::h5aread_double_s_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         DOUBLE PRECISION, INTENT(INOUT)::buf
-       END FUNCTION h5aread_double_s_c
-    END INTERFACE
-
-    hdferr = h5aread_double_s_c(attr_id, memtype_id,  buf, dims)
-  END SUBROUTINE h5aread_double_scalar
-
-  SUBROUTINE h5aread_double_1(attr_id, memtype_id,  buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id   ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                                ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    DOUBLE PRECISION, INTENT(INOUT), &
-         DIMENSION(dims(1)) :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_double_1_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_double_1_c(attr_id, memtype_id,  buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_DOUBLE_1_C'::h5aread_double_1_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         DOUBLE PRECISION, INTENT(INOUT), &
-              DIMENSION(dims(1)) :: buf
-       END FUNCTION h5aread_double_1_c
-    END INTERFACE
-
-    hdferr = h5aread_double_1_c(attr_id, memtype_id,  buf, dims)
-  END SUBROUTINE h5aread_double_1
-
-
-  SUBROUTINE h5aread_double_2(attr_id, memtype_id,  buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id   ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                                ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    DOUBLE PRECISION, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2)) :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_double_2_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_double_2_c(attr_id, memtype_id,  buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_DOUBLE_2_C'::h5aread_double_2_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         DOUBLE PRECISION, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5aread_double_2_c
-    END INTERFACE
-
-    hdferr = h5aread_double_2_c(attr_id, memtype_id,  buf, dims)
-  END SUBROUTINE h5aread_double_2
-
-
-  SUBROUTINE h5aread_double_3(attr_id, memtype_id,  buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id   ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                                ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    DOUBLE PRECISION, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_double_3_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_double_3_c(attr_id, memtype_id,  buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_DOUBLE_3_C'::h5aread_double_3_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         DOUBLE PRECISION, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf
-       END FUNCTION h5aread_double_3_c
-    END INTERFACE
-
-    hdferr = h5aread_double_3_c(attr_id, memtype_id,  buf, dims)
-  END SUBROUTINE h5aread_double_3
-
-
-  SUBROUTINE h5aread_double_4(attr_id, memtype_id,  buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id   ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                                ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    DOUBLE PRECISION, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_double_4_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_double_4_c(attr_id, memtype_id,  buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_DOUBLE_4_C'::h5aread_double_4_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         DOUBLE PRECISION, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-       END FUNCTION h5aread_double_4_c
-    END INTERFACE
-
-    hdferr = h5aread_double_4_c(attr_id, memtype_id,  buf, dims)
-  END SUBROUTINE h5aread_double_4
-
-
-  SUBROUTINE h5aread_double_5(attr_id, memtype_id,  buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id   ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                                ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    DOUBLE PRECISION, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_double_5_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_double_5_c(attr_id, memtype_id,  buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_DOUBLE_5_C'::h5aread_double_5_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         DOUBLE PRECISION, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-       END FUNCTION h5aread_double_5_c
-    END INTERFACE
-
-    hdferr = h5aread_double_5_c(attr_id, memtype_id,  buf, dims)
-  END SUBROUTINE h5aread_double_5
-
-
-  SUBROUTINE h5aread_double_6(attr_id, memtype_id,  buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id   ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                                ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    DOUBLE PRECISION, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_double_6_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_double_6_c(attr_id, memtype_id,  buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_DOUBLE_6_C'::h5aread_double_6_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         DOUBLE PRECISION, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-       END FUNCTION h5aread_double_6_c
-    END INTERFACE
-
-    hdferr = h5aread_double_6_c(attr_id, memtype_id,  buf, dims)
-  END SUBROUTINE h5aread_double_6
-
-
-  SUBROUTINE h5aread_double_7(attr_id, memtype_id,  buf, dims, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: attr_id   ! Attribute identifier
-    INTEGER(HID_T), INTENT(IN) :: memtype_id ! Attribute datatype
-                                                ! identifier  (in memory)
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-    DOUBLE PRECISION, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-    ! Attribute data
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-
-    !            INTEGER, EXTERNAL :: h5aread_double_7_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5aread_double_7_c(attr_id, memtype_id,  buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5AREAD_DOUBLE_7_C'::h5aread_double_7_c
-         !DEC$ENDIF
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims       ! Array to story buf dimension sizes
-         INTEGER(HID_T), INTENT(IN) :: attr_id
-         INTEGER(HID_T), INTENT(IN) :: memtype_id
-         DOUBLE PRECISION, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-       END FUNCTION h5aread_double_7_c
-    END INTERFACE
-
-    hdferr = h5aread_double_7_c(attr_id, memtype_id,  buf, dims)
-  END SUBROUTINE h5aread_double_7
-
-
-  !
-  ! ----- H5D ----
-  !
-  SUBROUTINE h5dwrite_double_scalar(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    DOUBLE PRECISION, INTENT(IN) :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id
-    ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id
-    ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp
-    ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !            INTEGER, EXTERNAL :: h5dwrite_double_s_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_double_s_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_DOUBLE_S_C'::h5dwrite_double_s_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         DOUBLE PRECISION, INTENT(IN) :: buf
-       END FUNCTION h5dwrite_double_s_c
-    END INTERFACE
-
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    if (present(xfer_prp)) xfer_prp_default = xfer_prp
-    if (present(mem_space_id))  mem_space_id_default = mem_space_id
-    if (present(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_double_s_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_double_scalar
-
-  SUBROUTINE h5dwrite_double_1(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    DOUBLE PRECISION, INTENT(IN), &
-         DIMENSION(dims(1)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id
-    ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id
-    ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp
-    ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !            INTEGER, EXTERNAL :: h5dwrite_double_1_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_double_1_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_DOUBLE_1_C'::h5dwrite_double_1_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         DOUBLE PRECISION, INTENT(IN), &
-              DIMENSION(dims(1)) :: buf
-       END FUNCTION h5dwrite_double_1_c
-    END INTERFACE
-
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    if (present(xfer_prp)) xfer_prp_default = xfer_prp
-    if (present(mem_space_id))  mem_space_id_default = mem_space_id
-    if (present(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_double_1_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_double_1
-
-  SUBROUTINE h5dwrite_double_2(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    DOUBLE PRECISION, INTENT(IN), &
-         DIMENSION(dims(1),dims(2)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id
-    ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id
-    ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp
-    ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !            INTEGER, EXTERNAL :: h5dwrite_double_2_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_double_2_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_DOUBLE_2_C'::h5dwrite_double_2_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         DOUBLE PRECISION, INTENT(IN), &
-              DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5dwrite_double_2_c
-    END INTERFACE
-
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    if (present(xfer_prp)) xfer_prp_default = xfer_prp
-    if (present(mem_space_id))  mem_space_id_default = mem_space_id
-    if (present(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_double_2_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_double_2
-
-  SUBROUTINE h5dwrite_double_3(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    DOUBLE PRECISION, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id
-    ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id
-    ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp
-    ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !            INTEGER, EXTERNAL :: h5dwrite_double_3_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_double_3_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_DOUBLE_3_C'::h5dwrite_double_3_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         DOUBLE PRECISION, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf
-       END FUNCTION h5dwrite_double_3_c
-    END INTERFACE
-
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    if (present(xfer_prp)) xfer_prp_default = xfer_prp
-    if (present(mem_space_id))  mem_space_id_default = mem_space_id
-    if (present(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_double_3_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_double_3
-
-  SUBROUTINE h5dwrite_double_4(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    DOUBLE PRECISION, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id
-    ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id
-    ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp
-    ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !            INTEGER, EXTERNAL :: h5dwrite_double_4_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_double_4_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_DOUBLE_4_C'::h5dwrite_double_4_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         DOUBLE PRECISION, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-       END FUNCTION h5dwrite_double_4_c
-    END INTERFACE
-
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    if (present(xfer_prp)) xfer_prp_default = xfer_prp
-    if (present(mem_space_id))  mem_space_id_default = mem_space_id
-    if (present(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_double_4_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_double_4
-
-  SUBROUTINE h5dwrite_double_5(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    DOUBLE PRECISION, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id
-    ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id
-    ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp
-    ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !            INTEGER, EXTERNAL :: h5dwrite_double_5_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_double_5_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_DOUBLE_5_C'::h5dwrite_double_5_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         DOUBLE PRECISION, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-       END FUNCTION h5dwrite_double_5_c
-    END INTERFACE
-
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    if (present(xfer_prp)) xfer_prp_default = xfer_prp
-    if (present(mem_space_id))  mem_space_id_default = mem_space_id
-    if (present(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_double_5_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_double_5
-
-  SUBROUTINE h5dwrite_double_6(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    DOUBLE PRECISION, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-    ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id
-    ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id
-    ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp
-    ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !            INTEGER, EXTERNAL :: h5dwrite_double_6_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_double_6_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_DOUBLE_6_C'::h5dwrite_double_6_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         DOUBLE PRECISION, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-       END FUNCTION h5dwrite_double_6_c
-    END INTERFACE
-
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    if (present(xfer_prp)) xfer_prp_default = xfer_prp
-    if (present(mem_space_id))  mem_space_id_default = mem_space_id
-    if (present(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_double_6_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_double_6
-
-  SUBROUTINE h5dwrite_double_7(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    DOUBLE PRECISION, INTENT(IN), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-    ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id
-    ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id
-    ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp
-    ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !            INTEGER, EXTERNAL :: h5dwrite_double_7_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dwrite_double_7_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DWRITE_DOUBLE_7_C'::h5dwrite_double_7_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         DOUBLE PRECISION, INTENT(IN), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-       END FUNCTION h5dwrite_double_7_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    if (present(xfer_prp)) xfer_prp_default = xfer_prp
-    if (present(mem_space_id))  mem_space_id_default = mem_space_id
-    if (present(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dwrite_double_7_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dwrite_double_7
-
-  SUBROUTINE h5dread_double_scalar(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    DOUBLE PRECISION, INTENT(INOUT) :: buf ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id
-    ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id
-    ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp
-    ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !            INTEGER, EXTERNAL :: h5dread_double_s_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dread_double_s_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_DOUBLE_S_C'::h5dread_double_s_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         DOUBLE PRECISION, INTENT(OUT) :: buf
-       END FUNCTION h5dread_double_s_c
-    END INTERFACE
-
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    if (present(xfer_prp)) xfer_prp_default = xfer_prp
-    if (present(mem_space_id))  mem_space_id_default = mem_space_id
-    if (present(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_double_s_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_double_scalar
-
-  SUBROUTINE h5dread_double_1(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    DOUBLE PRECISION, INTENT(INOUT), &
-         DIMENSION(dims(1)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id
-    ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id
-    ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp
-    ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !            INTEGER, EXTERNAL :: h5dread_double_1_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dread_double_1_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_DOUBLE_1_C'::h5dread_double_1_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         DOUBLE PRECISION, INTENT(INOUT), &
-              DIMENSION(dims(1)) :: buf
-       END FUNCTION h5dread_double_1_c
-    END INTERFACE
-
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    if (present(xfer_prp)) xfer_prp_default = xfer_prp
-    if (present(mem_space_id))  mem_space_id_default = mem_space_id
-    if (present(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_double_1_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_double_1
-
-  SUBROUTINE h5dread_double_2(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    DOUBLE PRECISION, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id
-    ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id
-    ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp
-    ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !            INTEGER, EXTERNAL :: h5dread_double_2_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dread_double_2_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_DOUBLE_2_C'::h5dread_double_2_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         DOUBLE PRECISION, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2)) :: buf
-       END FUNCTION h5dread_double_2_c
-    END INTERFACE
-
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    if (present(xfer_prp)) xfer_prp_default = xfer_prp
-    if (present(mem_space_id))  mem_space_id_default = mem_space_id
-    if (present(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_double_2_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_double_2
-
-  SUBROUTINE h5dread_double_3(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    DOUBLE PRECISION, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id
-    ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id
-    ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp
-    ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !            INTEGER, EXTERNAL :: h5dread_double_3_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dread_double_3_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_DOUBLE_3_C'::h5dread_double_3_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         DOUBLE PRECISION, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf
-       END FUNCTION h5dread_double_3_c
-    END INTERFACE
-
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    if (present(xfer_prp)) xfer_prp_default = xfer_prp
-    if (present(mem_space_id))  mem_space_id_default = mem_space_id
-    if (present(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_double_3_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_double_3
-
-  SUBROUTINE h5dread_double_4(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    DOUBLE PRECISION, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-    ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id
-    ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id
-    ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp
-    ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !            INTEGER, EXTERNAL :: h5dread_double_4_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dread_double_4_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_DOUBLE_4_C'::h5dread_double_4_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         DOUBLE PRECISION, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf
-       END FUNCTION h5dread_double_4_c
-    END INTERFACE
-
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    if (present(xfer_prp)) xfer_prp_default = xfer_prp
-    if (present(mem_space_id))  mem_space_id_default = mem_space_id
-    if (present(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_double_4_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_double_4
-
-  SUBROUTINE h5dread_double_5(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    DOUBLE PRECISION, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id
-    ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id
-    ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp
-    ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !            INTEGER, EXTERNAL :: h5dread_double_5_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dread_double_5_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_DOUBLE_5_C'::h5dread_double_5_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         DOUBLE PRECISION, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf
-       END FUNCTION h5dread_double_5_c
-    END INTERFACE
-
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    if (present(xfer_prp)) xfer_prp_default = xfer_prp
-    if (present(mem_space_id))  mem_space_id_default = mem_space_id
-    if (present(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_double_5_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_double_5
-
-  SUBROUTINE h5dread_double_6(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    DOUBLE PRECISION, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-    ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id
-    ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id
-    ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp
-    ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !            INTEGER, EXTERNAL :: h5dread_double_6_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dread_double_6_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_DOUBLE_6_C'::h5dread_double_6_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         DOUBLE PRECISION, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf
-       END FUNCTION h5dread_double_6_c
-    END INTERFACE
-
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    if (present(xfer_prp)) xfer_prp_default = xfer_prp
-    if (present(mem_space_id))  mem_space_id_default = mem_space_id
-    if (present(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_double_6_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_double_6
-
-  SUBROUTINE h5dread_double_7(dset_id, mem_type_id, buf, dims, hdferr, &
-       mem_space_id, file_space_id, xfer_prp)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: dset_id   ! Dataset identifier
-    INTEGER(HID_T), INTENT(IN) :: mem_type_id ! Memory datatype identifier
-    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-    DOUBLE PRECISION, INTENT(INOUT), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-    ! Data buffer
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id
-    ! Memory dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id
-    ! File dataspace identfier
-    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp
-    ! Transfer property list identifier
-
-    INTEGER(HID_T) :: xfer_prp_default
-    INTEGER(HID_T) :: mem_space_id_default
-    INTEGER(HID_T) :: file_space_id_default
-
-    !            INTEGER, EXTERNAL :: h5dread_double_7_c
-    !  MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dread_double_7_c(dset_id, mem_type_id, &
-            mem_space_id_default, &
-            file_space_id_default, &
-            xfer_prp_default, buf, dims)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DREAD_DOUBLE_7_C'::h5dread_double_7_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: dset_id
-         INTEGER(HID_T), INTENT(IN) :: mem_type_id
-         INTEGER(HID_T)  :: mem_space_id_default
-         INTEGER(HID_T) :: file_space_id_default
-         INTEGER(HID_T) :: xfer_prp_default
-         INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
-         DOUBLE PRECISION, INTENT(INOUT), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf
-       END FUNCTION h5dread_double_7_c
-    END INTERFACE
-
-    xfer_prp_default = H5P_DEFAULT_F
-    mem_space_id_default = H5S_ALL_F
-    file_space_id_default = H5S_ALL_F
-
-    if (present(xfer_prp)) xfer_prp_default = xfer_prp
-    if (present(mem_space_id))  mem_space_id_default = mem_space_id
-    if (present(file_space_id)) file_space_id_default = file_space_id
-
-    hdferr = h5dread_double_7_c(dset_id, mem_type_id, mem_space_id_default, &
-         file_space_id_default, xfer_prp_default, buf, dims)
-
-  END SUBROUTINE h5dread_double_7
-
-  !----------------------------------------------------------------------
-  ! Name:		h5dfill_double
-  !
-  ! Purpose:      Fills dataspace elements with a fill value in a memory buffer.
-  !               Only INTEGER, CHARACTER, REAL and DOUBLE PRECISION datatypes
-  !               of the fillvalues and buffers are supported. Buffer and fillvalue
-  !               are assumed to have the same datatype.
-  !               Only one-dimesional buffers are supported.
-  !
-  ! Inputs:
-  !		fill_value	- fill value
-  !		space_id	- memory space selection identifier
-  !		buf		- data buffer iin memory ro apply selection to
-  !				- of k-th dimension of the buf array
-  ! Outputs:
-  !		hdferr:		- error code
-  !				 	Success:  0
-  !				 	Failure: -1
-  !
-  ! Programmer:	Elena Pourmal
-  !		March 12, 2003
-  !
-  !----------------------------------------------------------------------
-
-  SUBROUTINE h5dfill_double(fill_value, space_id, buf,  hdferr)
-    IMPLICIT NONE
-    DOUBLE PRECISION, INTENT(IN) :: fill_value  ! Fill value
-    INTEGER(HID_T), INTENT(IN) :: space_id ! Memory dataspace selection identifier
-    DOUBLE PRECISION, INTENT(IN), DIMENSION(*) :: buf ! Memory buffer to fill in
-    INTEGER, INTENT(OUT) :: hdferr      ! Error code
-
-    INTEGER(HID_T) :: fill_type_id ! Fill value datatype identifier
-    INTEGER(HID_T) :: mem_type_id !  Buffer dadtype identifier
-
-    !            INTEGER, EXTERNAL :: h5dfill_double_c
-    ! MS FORTRAN needs explicit interface for C functions called here.
-    !
-    INTERFACE
-       INTEGER FUNCTION h5dfill_double_c(fill_value, fill_type_id, space_id, &
-            buf, mem_type_id)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DFILL_DOUBLE_C'::h5dfill_double_c
-         !DEC$ENDIF
-         DOUBLE PRECISION, INTENT(IN) :: fill_value  ! Fill value
-         INTEGER(HID_T) :: fill_type_id ! Fill value datatype identifier
-         INTEGER(HID_T), INTENT(IN) :: space_id ! Memory dataspace selection identifier
-         DOUBLE PRECISION, INTENT(IN), DIMENSION(*) :: buf ! Memory buffer to fill in
-         INTEGER(HID_T) :: mem_type_id !  Buffer dadtype identifier
-       END FUNCTION h5dfill_double_c
-    END INTERFACE
-    fill_type_id = H5T_NATIVE_DOUBLE
-    mem_type_id  = H5T_NATIVE_DOUBLE
-
-    hdferr = h5dfill_double_c(fill_value, fill_type_id, space_id, &
-         buf, mem_type_id)
-
-
-  END SUBROUTINE h5dfill_double
-
-  !
-  ! -- H5P ---
-  !
-
-  SUBROUTINE h5pset_fill_value_double(prp_id, type_id, fillvalue, &
-       hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
-    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
-                                          ! of fillvalue datatype
-                                          ! (in memory)
-    DOUBLE PRECISION, INTENT(IN) :: fillvalue   ! Fillvalue
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code
-
-    INTERFACE
-       INTEGER FUNCTION h5pset_fill_value_double_c(prp_id, type_id, fillvalue)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_FILL_VALUE_DOUBLE_C'::h5pset_fill_value_double_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER(HID_T), INTENT(IN) :: type_id
-         DOUBLE PRECISION, INTENT(IN) :: fillvalue
-       END FUNCTION h5pset_fill_value_double_c
-    END INTERFACE
-
-    hdferr = h5pset_fill_value_double_c(prp_id, type_id, fillvalue)
-  END SUBROUTINE h5pset_fill_value_double
-
-  SUBROUTINE h5pget_fill_value_double(prp_id, type_id, fillvalue, &
-       hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id ! Property list identifier
-    INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier of
-                                          ! of fillvalue datatype
-                                          ! (in memory)
-    DOUBLE PRECISION, INTENT(IN) :: fillvalue   ! Fillvalue
-    INTEGER, INTENT(OUT) :: hdferr  ! Error code
-
-    INTERFACE
-       INTEGER FUNCTION h5pget_fill_value_double_c(prp_id, type_id, fillvalue)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_FILL_VALUE_DOUBLE_C'::h5pget_fill_value_double_c
-         !DEC$ENDIF
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         INTEGER(HID_T), INTENT(IN) :: type_id
-         DOUBLE PRECISION :: fillvalue
-       END FUNCTION h5pget_fill_value_double_c
-    END INTERFACE
-
-    hdferr = h5pget_fill_value_double_c(prp_id, type_id, fillvalue)
-  END SUBROUTINE h5pget_fill_value_double
-
-!
-!****s* H5P (F90)/h5pset_double
-!
-! NAME
-!  h5pset_double
-!
-! PURPOSE
-!  Sets a property list value
-!
-! INPUTS
-!  prp_id 	 - iproperty list identifier to modify
-!  name 	 - name of property to modify
-!  value 	 - value to set property to
-! OUTPUTS
-!  hdferr:	 - error code
-!                   Success:  0
-!                   Failure: -1
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002
-! SOURCE
-  SUBROUTINE h5pset_double(prp_id, name, value, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id    ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name    ! Name of property to modify
-    DOUBLE PRECISION,   INTENT(IN) :: value ! Property value
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-!*****
-    INTEGER :: name_len
-
-    INTERFACE
-       INTEGER FUNCTION h5pset_double_c(prp_id, name, name_len, value)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PSET_DOUBLE_C'::h5pset_double_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-         DOUBLE PRECISION, INTENT(IN) :: value
-       END FUNCTION h5pset_double_c
-    END INTERFACE
-
-    name_len = LEN(name)
-    hdferr = h5pset_double_c(prp_id, name , name_len, value)
-  END SUBROUTINE h5pset_double
-
-!****s* H5P (F90)/h5pget_double
-!
-! NAME
-!  h5pget_double
-!
-! PURPOSE
-!  Gets a property list value
-!
-! INPUTS
-!  prp_id 	 - iproperty list identifier to modify
-!  name 	 - name of property to modify
-! OUTPUTS
-!  value 	 - value of property
-!  hdferr	 - error code
-!                   Success:  0
-!                   Failure: -1
-! AUTHOR
-!  Elena Pourmal
-!  October 9, 2002
-!
-! SOURCE
-  SUBROUTINE h5pget_double(prp_id, name, value, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: prp_id     ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name     ! Name of property to modify
-    DOUBLE PRECISION,   INTENT(OUT) :: value ! Property value
-    INTEGER, INTENT(OUT) :: hdferr           ! Error code
-!*****
-    INTEGER :: name_len
-
-    INTERFACE
-       INTEGER FUNCTION h5pget_double_c(prp_id, name, name_len, value)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PGET_DOUBLE_C'::h5pget_double_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: prp_id
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-         DOUBLE PRECISION, INTENT(OUT) :: value
-       END FUNCTION h5pget_double_c
-    END INTERFACE
-
-    name_len = LEN(name)
-    hdferr = h5pget_double_c(prp_id, name , name_len, value)
-  END SUBROUTINE h5pget_double
-
-!
-!****s* H5P (F90)/h5pregister_double
-!
-! NAME
-!  h5pregister_double
-!
-! PURPOSE
-!  Registers a permanent property with a property list class.
-!
-! INPUTS
-!  class 	 - property list class to register
-!                  permanent property within
-!  name 	 - name of property to register
-!  size 	 - size of property in bytes
-!  value 	 - default value for property in newly
-!                  created property lists
-! OUTPUTS
-!  hdferr	 - error code
-!                   Success:  0
-!                   Failure: -1
-! AUTHOR
-!  Elena Pourmal
-!  October 10, 2002
-!
-! SOURCE
-  SUBROUTINE h5pregister_double(class, name, size, value, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: class     ! Property list class identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name    ! Name of property to register
-    INTEGER(SIZE_T), INTENT(IN) :: size     ! Size of the property value
-    DOUBLE PRECISION,   INTENT(IN) :: value ! Property value
-    INTEGER, INTENT(OUT) :: hdferr          ! Error code
-!*****
-    INTEGER :: name_len
-
-    INTERFACE
-       INTEGER FUNCTION h5pregister_double_c(class, name, name_len, size, value)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PREGISTER_DOUBLE_C'::h5pregister_double_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: class
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-         INTEGER(SIZE_T), INTENT(IN) :: size
-         DOUBLE PRECISION, INTENT(IN) :: value
-       END FUNCTION h5pregister_double_c
-    END INTERFACE
-
-    name_len = LEN(name)
-    hdferr = h5pregister_double_c(class, name , name_len, size, value)
-  END SUBROUTINE h5pregister_double
-
-!****s* H5P (F90)/h5pinsert_double
-!
-! NAME
-!
-!  h5pinsert_double
-!
-! PURPOSE
-!  Registers a temporary property with a property list class.
-!
-! INPUTS
-!  plist 	 - property list identifier
-!                  permanent property within
-!  name 	 - name of property to insert
-!  size 	 - size of property in bytes
-!  value 	 - initial value for the property
-! OUTPUTS
-!  hdferr	 - error code
-!                   Success:  0
-!                   Failure: -1
-! AUTHOR
-!  Elena Pourmal
-!  October 10, 2002
-! SOURCE
-  SUBROUTINE h5pinsert_double(plist, name, size, value, hdferr)
-    IMPLICIT NONE
-    INTEGER(HID_T), INTENT(IN) :: plist   ! Property list identifier
-    CHARACTER(LEN=*), INTENT(IN) :: name  ! Name of property to insert
-    INTEGER(SIZE_T), INTENT(IN) :: size   ! Size of the property value
-    DOUBLE PRECISION, INTENT(IN) :: value ! Property value
-    INTEGER, INTENT(OUT) :: hdferr        ! Error code
-!*****
-    INTEGER :: name_len
-
-    INTERFACE
-       INTEGER FUNCTION h5pinsert_double_c(plist, name, name_len, size, value)
-         USE H5GLOBAL
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5PINSERT_DOUBLE_C'::h5pinsert_double_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(HID_T), INTENT(IN) :: plist
-         CHARACTER(LEN=*), INTENT(IN) :: name
-         INTEGER, INTENT(IN)         :: name_len
-         INTEGER(SIZE_T), INTENT(IN) :: size
-         DOUBLE PRECISION, INTENT(IN) :: value
-       END FUNCTION h5pinsert_double_c
-    END INTERFACE
-
-    name_len = LEN(name)
-    hdferr = h5pinsert_double_c(plist, name , name_len, size, value)
-  END SUBROUTINE h5pinsert_double
-
-END MODULE H5_DBLE_INTERFACE
diff --git a/fortran/src/H5_buildiface.F90 b/fortran/src/H5_buildiface.F90
new file mode 100644
index 0000000..9a42cbf
--- /dev/null
+++ b/fortran/src/H5_buildiface.F90
@@ -0,0 +1,1024 @@
+!****p* Program/H5_buildiface
+!
+! NAME
+!  Executable: H5_buildiface
+!
+! FILE
+!  fortran/src/H5_buildiface.f90
+!
+! PURPOSE
+!  This stand alone program is used at build time to generate the module
+!  H5_gen (H5_gen.F90). It cycles through all the available KIND parameters for
+!  integers and reals. The appropriate program and subroutines are then generated
+!  depending on which of the KIND values are found.
+!
+! NOTES
+!  This program uses the Fortran 2008 intrinsic function STORAGE_SIZE or SIZEOF 
+!  depending on availablity.It generates code that makes use of 
+!  STORAGE_SIZE/SIZEOF in H5_gen.F90. STORAGE_SIZE is standard
+!  compliant and should always be chosen over SIZEOF.
+!
+!  The availability of STORAGE_SIZE/SIZEOF is checked at configure time and the TRUE/FALSE
+!  condition is set in the configure variable "FORTRAN_HAVE_STORAGE_SIZE" or
+!  "FORTRAN_HAVE_SIZEOF".
+!
+!  The use of C_SIZOF(X) is not used since the argument X must be an interoperable
+!  data entity.
+!
+! COPYRIGHT
+!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!  Copyright by The HDF Group.                                                 *
+!  Copyright by the Board of Trustees of the University of Illinois.           *
+!  All rights reserved.                                                        *
+!                                                                              *
+!  This file is part of HDF5.  The full HDF5 copyright notice, including       *
+!  terms governing use, modification, and redistribution, is contained in      *
+!  the files COPYING and Copyright.html.  COPYING can be found at the root     *
+!  of the source code distribution tree; Copyright.html can be found at the    *
+!  root level of an installed copy of the electronic HDF5 document set and     *
+!  is linked from the top-level documents page.  It can also be found at       *
+!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have            *
+!  access to either file, you may request a copy from help at hdfgroup.org.       *
+!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!
+!*****
+
+#include <H5config_f.inc>
+
+PROGRAM H5_buildiface
+  USE, INTRINSIC :: ISO_C_BINDING
+  IMPLICIT NONE
+
+! These values are valid REAL KINDs (with corresponding C float) found during configure
+  H5_H5CONFIG_F_NUM_RKIND
+  H5_H5CONFIG_F_RKIND
+! These values are valid INTEGER KINDs (with corresponding C integer) found during configure
+  H5_H5CONFIG_F_NUM_IKIND
+  H5_H5CONFIG_F_IKIND
+
+  INTEGER :: i, j, k
+  INTEGER :: ji, jr, jd
+#ifdef H5_FORTRAN_HAVE_C_LONG_DOUBLE
+  REAL(KIND=C_LONG_DOUBLE) :: c_longdble
+#endif
+  REAL(KIND=C_DOUBLE) :: c_dble
+  REAL(KIND=C_FLOAT) :: c_flt
+  INTEGER :: sizeof_var
+  CHARACTER(LEN=2) :: chr2
+! subroutine rank of array being passed in
+  CHARACTER(LEN=2), DIMENSION(1:8), PARAMETER :: chr_rank=(/"_0","_1","_2","_3","_4","_5","_6","_7"/)
+! rank definitions
+  CHARACTER(LEN=70), DIMENSION(1:8), PARAMETER :: rank_dim_line=(/ &
+       '                                                                    ', &
+       ', DIMENSION(dims(1))                                                ', &
+       ', DIMENSION(dims(1),dims(2))                                        ', &
+       ', DIMENSION(dims(1),dims(2),dims(3))                                ', &
+       ', DIMENSION(dims(1),dims(2),dims(3),dims(4))                        ', &
+       ', DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5))                ', &
+       ', DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6))        ', &
+       ', DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7))' &
+            /)
+! pointer to the buffer
+  CHARACTER(LEN=37), DIMENSION(1:8), PARAMETER :: f_ptr_line=(/ &
+       '    f_ptr = C_LOC(buf)               ', &
+       '    f_ptr = C_LOC(buf(1))            ', &
+       '    f_ptr = C_LOC(buf(1,1))          ', &
+       '    f_ptr = C_LOC(buf(1,1,1))        ', &
+       '    f_ptr = C_LOC(buf(1,1,1,1))      ', &
+       '    f_ptr = C_LOC(buf(1,1,1,1,1))    ', &
+       '    f_ptr = C_LOC(buf(1,1,1,1,1,1))  ', &
+       '    f_ptr = C_LOC(buf(1,1,1,1,1,1,1))'  &
+            /)
+  CHARACTER(LEN=42), DIMENSION(1:8), PARAMETER :: fchr_ptr_line=(/ &
+       '    f_ptr = C_LOC(buf(1:1))               ', &
+       '    f_ptr = C_LOC(buf(1)(1:1))            ', &
+       '    f_ptr = C_LOC(buf(1,1)(1:1))          ', &
+       '    f_ptr = C_LOC(buf(1,1,1)(1:1))        ', &
+       '    f_ptr = C_LOC(buf(1,1,1,1)(1:1))      ', &
+       '    f_ptr = C_LOC(buf(1,1,1,1,1)(1:1))    ', &
+       '    f_ptr = C_LOC(buf(1,1,1,1,1,1)(1:1))  ', &
+       '    f_ptr = C_LOC(buf(1,1,1,1,1,1,1)(1:1))'  &
+            /)
+
+! (a) Generate Fortran H5* interfaces having multiple KIND interfaces.
+!
+! DEVELOPER'S NOTES:
+!
+! Only interfaces with arrays of rank 7 and less are provided. Even-though, the F2008 
+! standard extended the maximum rank to 15, it was decided that user's should use the
+! new APIs to handle those use cases. Handling rank 7 and less is for backward compatibility
+! with the Fortran 90/95 APIs codes which could never handle ranks greater than 7.
+
+  OPEN(11,FILE='H5_gen.F90')
+  WRITE(11,'(40(A,/))') &
+'!****h* ROBODoc/H5_gen.F90',&
+'!',&
+'! NAME',&
+'!  H5_gen',&
+'! ',&
+'! PURPOSE',&
+'!  This module is generated at build by H5_buildiface.F90 to handle all the',&
+'!  detected KINDs for APIs being passed INTEGERs, REALs and CHARACTERs. Currently ',&
+'!  these are H5A, H5D and H5P APIs',&
+'!',&
+'! COPYRIGHT',&
+'! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *',&
+'!   Copyright by The HDF Group.                                               *',&
+'!   All rights reserved.                                                      *',&
+'!                                                                             *',&
+'!   This file is part of HDF5.  The full HDF5 copyright notice, including     *',&
+'!   terms governing use, modification, and redistribution, is contained in    *',&
+'!   the files COPYING and Copyright.html.  COPYING can be found at the root   *',&
+'!   of the source code distribution tree; Copyright.html can be found at the  *',&
+'!   root level of an installed copy of the electronic HDF5 document set and   *',&
+'!   is linked from the top-level documents page.  It can also be found at     *',&
+'!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *',&
+'!   access to either file, you may request a copy from help at hdfgroup.org.     *',&
+'! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *',&
+'!',&
+'! AUTHOR',&
+'!  H5_buildiface.F90',&
+'!',&
+'!*****'
+
+  WRITE(11,'(A)') "MODULE H5_GEN"
+
+  WRITE(11,'(A)') '  USE, INTRINSIC :: ISO_C_BINDING'
+  WRITE(11,'(A)') '  USE H5GLOBAL'
+
+  WRITE(11,'(A)') '  USE H5A'
+  WRITE(11,'(A)') '  USE H5D'
+  WRITE(11,'(A)') '  USE H5P'
+  WRITE(11,'(A)') '  IMPLICIT NONE'
+!***************
+! H5A INTERFACES
+!***************
+!
+! H5Awrite_f
+!
+  WRITE(11,'(A)') "  INTERFACE h5awrite_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     DO k = 1, 8
+        WRITE(11,'(A)') "     MODULE PROCEDURE h5awrite_rkind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+     ENDDO
+  END DO
+  DO i = 1, num_ikinds
+     j = ikind(i)
+     WRITE(chr2,'(I2)') j
+     DO k = 1, 8
+        WRITE(11,'(A)') "     MODULE PROCEDURE h5awrite_ikind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+     ENDDO
+  END DO
+  DO k = 2, 8
+     WRITE(11,'(A)') "     MODULE PROCEDURE h5awrite_ckind_rank"//chr_rank(k)
+  ENDDO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+! H5Aread_f
+  WRITE(11,'(A)') "  INTERFACE h5aread_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     DO k = 1, 8
+        WRITE(11,'(A)') "     MODULE PROCEDURE h5aread_rkind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+     ENDDO
+  END DO
+  DO i = 1, num_ikinds
+     j = ikind(i)
+     WRITE(chr2,'(I2)') j
+     DO k = 1, 8
+        WRITE(11,'(A)') "     MODULE PROCEDURE h5aread_ikind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+     ENDDO
+  END DO
+  DO k = 2, 8
+     WRITE(11,'(A)') "     MODULE PROCEDURE h5aread_ckind_rank"//chr_rank(k)
+  ENDDO
+  WRITE(11,'(A)') "  END INTERFACE"
+!***************
+! H5D INTERFACES
+!***************
+!
+! H5Dwrite_f
+  WRITE(11,'(A)') "  INTERFACE h5dwrite_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     DO k = 1, 8
+        WRITE(11,'(A)') "     MODULE PROCEDURE h5dwrite_rkind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+     ENDDO
+  END DO
+  DO i = 1, num_ikinds
+     j = ikind(i)
+     WRITE(chr2,'(I2)') j
+     DO k = 1, 8
+        WRITE(11,'(A)') "     MODULE PROCEDURE h5dwrite_ikind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+     ENDDO
+  END DO 
+  DO k = 2, 8
+     WRITE(11,'(A)') "     MODULE PROCEDURE h5dwrite_ckind_rank"//chr_rank(k)
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+! H5Dread_f
+  WRITE(11,'(A)') "  INTERFACE h5dread_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     DO k = 1, 8
+        WRITE(11,'(A)') "     MODULE PROCEDURE h5dread_rkind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+     ENDDO
+  END DO
+  DO i = 1, num_ikinds
+     j = ikind(i)
+     WRITE(chr2,'(I2)') j
+     DO k = 1, 8
+        WRITE(11,'(A)') "     MODULE PROCEDURE h5dread_ikind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+     ENDDO 
+  END DO
+  DO k = 2, 8
+     WRITE(11,'(A)') "     MODULE PROCEDURE h5dread_ckind_rank"//chr_rank(k)
+  ENDDO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+!***************
+! H5P INTERFACES
+!***************
+!
+! H5Pset_fill_value_f
+  WRITE(11,'(A)') "  INTERFACE h5pset_fill_value_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     WRITE(11,'(A)') "     MODULE PROCEDURE h5pset_fill_value_kind_"//TRIM(ADJUSTL(chr2))
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+! H5Pget_fill_value_f
+  WRITE(11,'(A)') "  INTERFACE h5pget_fill_value_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     WRITE(11,'(A)') "     MODULE PROCEDURE h5pget_fill_value_kind_"//TRIM(ADJUSTL(chr2))
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+! H5Pset_f
+  WRITE(11,'(A)') "  INTERFACE h5pset_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     WRITE(11,'(A)') "     MODULE PROCEDURE h5pset_kind_"//TRIM(ADJUSTL(chr2))
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+! H5Pget_f
+  WRITE(11,'(A)') "  INTERFACE h5pget_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     WRITE(11,'(A)') "     MODULE PROCEDURE h5pget_kind_"//TRIM(ADJUSTL(chr2))
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+! H5Pregister_f
+  WRITE(11,'(A)') "  INTERFACE h5pregister_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     WRITE(11,'(A)') "     MODULE PROCEDURE h5pregister_kind_"//TRIM(ADJUSTL(chr2))
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+! H5Pinsert_f
+  WRITE(11,'(A)') "  INTERFACE h5pinsert_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     WRITE(11,'(A)') "     MODULE PROCEDURE h5pinsert_kind_"//TRIM(ADJUSTL(chr2))
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+  WRITE(11,'(A)') 'CONTAINS'
+
+!**********************
+! H5A APIs
+!**********************
+!
+! H5Awrite_f
+
+!****s* H5A (F03)/H5Awrite_f_F90
+!
+! NAME
+!  H5Awrite_f_F90
+!
+! PURPOSE
+!  Writes an attribute.
+!
+! Inputs:
+!  attr_id     - Attribute identifier
+!  memtype_id  - Attribute datatype identifier  (in memory)
+!  dims        - Array to hold corresponding dimension sizes of data buffer buf;
+!                dim(k) has value of the k-th dimension of buffer buf;
+!                values are ignored if buf is a scalar
+!  buf 	       - Data buffer; may be a scalar or an array
+!
+! Outputs:
+!  hdferr      - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces are added for
+!  called C functions (it is needed for Windows
+!  port).  February 27, 2001
+!
+!  dims parameter was added to make code portable;
+!  Aprile 4, 2001
+!
+!  Changed buf intent to INOUT to be consistant
+!  with how the C functions handles it. The pg
+!  compiler will return 0 if a buf value is not set.
+!  February, 2008
+!
+! NOTES
+!  This function is overloaded to write INTEGER,
+!  REAL, REAL(KIND=C_DOUBLE) and CHARACTER buffers
+!  up to 7 dimensions.
+!
+! Fortran90 Interface:
+!!  SUBROUTINE H5Awrite_f(attr_id, memtype_id, buf, dims, hdferr) 
+!!    INTEGER(HID_T)  , INTENT(IN)               :: attr_id
+!!    INTEGER(HID_T)  , INTENT(IN)               :: memtype_id
+!!    TYPE            , INTENT(IN)               :: buf
+!!    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
+!!    INTEGER         , INTENT(OUT)              :: hdferr
+!*****
+
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+     DO j = 1, 8
+
+! DLL definitions for windows
+        WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_DLL)'
+        WRITE(11,'(A)') '!DEC$attributes dllexport :: h5awrite_rkind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+        WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API
+        WRITE(11,'(A)') '  SUBROUTINE h5awrite_rkind_'//TRIM(ADJUSTL(chr2))&
+             &//'_rank'//chr_rank(j)//'(attr_id, memtype_id, buf, dims, hdferr)'
+        WRITE(11,'(A)') '    IMPLICIT NONE'
+        WRITE(11,'(A)') '    INTEGER(HID_T)    , INTENT(IN) :: attr_id'
+        WRITE(11,'(A)') '    INTEGER(HID_T)    , INTENT(IN) :: memtype_id'
+        WRITE(11,'(A)') '    INTEGER(HSIZE_T)  , INTENT(IN), DIMENSION(*) :: dims'
+        WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(IN)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+        WRITE(11,'(A)') '    INTEGER           , INTENT(OUT) :: hdferr'
+        WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        
+        WRITE(11,'(A)') f_ptr_line(j)
+        WRITE(11,'(A)') '    hdferr = H5Awrite_f_c(attr_id, memtype_id, f_ptr)'
+        WRITE(11,'(A)') '  END SUBROUTINE h5awrite_rkind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     ENDDO
+  ENDDO
+  DO i = 1, num_ikinds
+     k = ikind(i)
+     WRITE(chr2,'(I2)') k
+     DO j = 1, 8
+
+! DLL definitions for windows
+        WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_DLL)'
+        WRITE(11,'(A)') '!DEC$attributes dllexport :: h5awrite_ikind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+        WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API
+        WRITE(11,'(A)') '  SUBROUTINE h5awrite_ikind_'//TRIM(ADJUSTL(chr2))&
+             &//'_rank'//chr_rank(j)//'(attr_id, memtype_id, buf, dims, hdferr)'
+        WRITE(11,'(A)') '    IMPLICIT NONE'
+        WRITE(11,'(A)') '    INTEGER(HID_T)    , INTENT(IN) :: attr_id'
+        WRITE(11,'(A)') '    INTEGER(HID_T)    , INTENT(IN) :: memtype_id'
+        WRITE(11,'(A)') '    INTEGER(HSIZE_T)  , INTENT(IN), DIMENSION(*) :: dims'
+        WRITE(11,'(A)') '    INTEGER(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(INOUT)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+        WRITE(11,'(A)') '    INTEGER           , INTENT(OUT) :: hdferr'
+        WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        
+        WRITE(11,'(A)') f_ptr_line(j)
+        WRITE(11,'(A)') '    hdferr = H5Awrite_f_c(attr_id, memtype_id, f_ptr)'
+        WRITE(11,'(A)') '  END SUBROUTINE h5awrite_ikind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     ENDDO
+  ENDDO
+  DO j = 2, 8
+
+! DLL definitions for windows
+     WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_DLL)'
+     WRITE(11,'(A)') '!DEC$attributes dllexport :: h5awrite_ckind_rank'//chr_rank(j)
+     WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API
+     WRITE(11,'(A)') '  SUBROUTINE h5awrite_ckind_rank'//chr_rank(j)//'(attr_id, memtype_id, buf, dims, hdferr)'
+     WRITE(11,'(A)') '    IMPLICIT NONE'
+     WRITE(11,'(A)') '    INTEGER(HID_T)    , INTENT(IN) :: attr_id'
+     WRITE(11,'(A)') '    INTEGER(HID_T)    , INTENT(IN) :: memtype_id'
+     WRITE(11,'(A)') '    INTEGER(HSIZE_T)  , INTENT(IN), DIMENSION(*) :: dims'
+     WRITE(11,'(A)') '    CHARACTER(LEN=*)  , INTENT(IN)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+     WRITE(11,'(A)') '    INTEGER           , INTENT(OUT) :: hdferr'
+     WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+     
+     WRITE(11,'(A)') fchr_ptr_line(j)
+     WRITE(11,'(A)') '    hdferr = H5Awrite_f_c(attr_id, memtype_id, f_ptr)'
+     WRITE(11,'(A)') '  END SUBROUTINE h5awrite_ckind_rank'//chr_rank(j)
+  ENDDO
+
+!
+! H5Aread_f
+
+!****s* H5A (F03)/H5Aread_f_F90
+!
+! NAME
+!  H5Aread_f_F90
+!
+! PURPOSE
+!  Reads an attribute.
+!
+! Inputs:
+!  attr_id     - Attribute identifier
+!  memtype_id  - Attribute datatype identifier  (in memory)
+!  dims        - Array to hold corresponding dimension sizes of data buffer buf;
+!                dim(k) has value of the k-th dimension of buffer buf;
+!                values are ignored if buf is a scalar
+!
+! Outputs:
+!  buf 	       - Data buffer; may be a scalar or an array
+!  hdferr      - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces are added for
+!  called C functions (it is needed for Windows
+!  port).  February 27, 2001
+!
+!  dims parameter was added to make code portable;
+!  Aprile 4, 2001
+!
+!  Changed buf intent to INOUT to be consistant
+!  with how the C functions handles it. The pg
+!  compiler will return 0 if a buf value is not set.
+!  February, 2008
+!
+! NOTES
+!  This function is overloaded to write INTEGER,
+!  REAL, REAL(KIND=C_DOUBLE) and CHARACTER buffers
+!  up to 7 dimensions.
+! Fortran90 Interface:
+!!  SUBROUTINE H5Aread_f(attr_id, memtype_id, buf, dims, hdferr) 
+!!    INTEGER(HID_T)  , INTENT(IN)               :: attr_id
+!!    INTEGER(HID_T)  , INTENT(IN)               :: memtype_id
+!!    TYPE            , INTENT(INOUT)            :: buf
+!!    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims
+!!    INTEGER         , INTENT(OUT)              :: hdferr
+!*****
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+     DO j = 1, 8
+! DLL definitions for windows
+        WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_DLL)'
+        WRITE(11,'(A)') '!DEC$attributes dllexport :: h5aread_rkind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+        WRITE(11,'(A)') '!DEC$endif'
+! Subroutine API
+        WRITE(11,'(A)') '  SUBROUTINE h5aread_rkind_'//TRIM(ADJUSTL(chr2))&
+             &//'_rank'//chr_rank(j)//'(attr_id, memtype_id, buf, dims, hdferr)'
+        WRITE(11,'(A)') '    IMPLICIT NONE'
+        WRITE(11,'(A)') '    INTEGER(HID_T)    , INTENT(IN) :: attr_id'
+        WRITE(11,'(A)') '    INTEGER(HID_T)    , INTENT(IN) :: memtype_id'
+        WRITE(11,'(A)') '    INTEGER(HSIZE_T)  , INTENT(IN), DIMENSION(*) :: dims'
+        WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(INOUT)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+        WRITE(11,'(A)') '    INTEGER           , INTENT(OUT) :: hdferr'
+        WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        
+        WRITE(11,'(A)') f_ptr_line(j)
+        WRITE(11,'(A)') '    hdferr = H5Aread_f_c(attr_id, memtype_id, f_ptr)'
+        WRITE(11,'(A)') '  END SUBROUTINE h5aread_rkind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     ENDDO
+  ENDDO
+  DO i = 1, num_ikinds
+     k = ikind(i)
+     WRITE(chr2,'(I2)') k
+     DO j = 1, 8
+! DLL definitions for windows
+        WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_DLL)'
+        WRITE(11,'(A)') '!DEC$attributes dllexport :: h5aread_ikind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+        WRITE(11,'(A)') '!DEC$endif'
+! Subroutine API
+        WRITE(11,'(A)') '  SUBROUTINE h5aread_ikind_'//TRIM(ADJUSTL(chr2))&
+             &//'_rank'//chr_rank(j)//'(attr_id, memtype_id, buf, dims, hdferr)'
+        WRITE(11,'(A)') '    IMPLICIT NONE'
+        WRITE(11,'(A)') '    INTEGER(HID_T)    , INTENT(IN) :: attr_id'
+        WRITE(11,'(A)') '    INTEGER(HID_T)    , INTENT(IN) :: memtype_id'
+        WRITE(11,'(A)') '    INTEGER(HSIZE_T)  , INTENT(IN), DIMENSION(*) :: dims'
+        WRITE(11,'(A)') '    INTEGER(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(INOUT)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+        WRITE(11,'(A)') '    INTEGER           , INTENT(OUT) :: hdferr'
+        WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        
+        WRITE(11,'(A)') f_ptr_line(j)
+        WRITE(11,'(A)') '    hdferr = H5Aread_f_c(attr_id, memtype_id, f_ptr)'
+        WRITE(11,'(A)') '  END SUBROUTINE h5aread_ikind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     ENDDO
+  ENDDO
+  DO j = 2, 8
+! DLL definitions for windows
+     WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_DLL)'
+     WRITE(11,'(A)') '!DEC$attributes dllexport :: h5aread_ckind_rank'//chr_rank(j)
+     WRITE(11,'(A)') '!DEC$endif'
+! Subroutine API
+     WRITE(11,'(A)') '  SUBROUTINE h5aread_ckind_rank'//chr_rank(j)//'(attr_id, memtype_id, buf, dims, hdferr)'
+     WRITE(11,'(A)') '    IMPLICIT NONE'
+     WRITE(11,'(A)') '    INTEGER(HID_T)    , INTENT(IN) :: attr_id'
+     WRITE(11,'(A)') '    INTEGER(HID_T)    , INTENT(IN) :: memtype_id'
+     WRITE(11,'(A)') '    INTEGER(HSIZE_T)  , INTENT(IN), DIMENSION(*) :: dims'
+     WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(IN)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+     WRITE(11,'(A)') '    INTEGER           , INTENT(OUT) :: hdferr'
+     WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+     
+     WRITE(11,'(A)') fchr_ptr_line(j)
+     WRITE(11,'(A)') '    hdferr = H5Aread_f_c(attr_id, memtype_id, f_ptr)'
+     WRITE(11,'(A)') '  END SUBROUTINE h5aread_ckind_rank'//chr_rank(j)
+  ENDDO
+
+!**********************
+! H5D APIs
+!**********************
+!
+! h5dread_f
+
+!
+! NAME		
+!  h5dread_f
+!
+! PURPOSE
+!  Reads raw data from the specified dataset into buf,
+!  converting from file datatype and dataspace to memory
+!  datatype and dataspace.
+!
+! Inputs:
+!		dset_id		- dataset identifier
+!		mem_type_id	- memory type identifier
+!		dims		- 1-dim array of size 7; dims(k) has the size
+!				- of k-th dimension of the buf array
+! Outputs:
+!		buf		- buffer to read data in
+!		hdferr:		- error code
+!				 	Success:  0
+!				 	Failure: -1
+! Optional parameters:
+!		mem_space_id	- memory dataspace identifier
+!		file_space_id 	- file dataspace identifier
+!		xfer_prp	- trasfer property list identifier
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY 	
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+!  dims parameter was added to make code portable;
+!  n parameter was replaced with dims parameter in
+!  the h5dwrite_reference_obj and h5dwrite_reference_dsetreg
+!  functions.  April 2, 2001
+!
+! NOTES	
+!  This function is overloaded to read INTEGER,
+!  REAL, DOUBLE PRECISION and CHARACTER buffers
+!  up to 7 dimensions, and one dimensional buffers
+!  of the TYPE(hobj_ref_t_f) and TYPE(hdset_reg_ref_t_f)
+!  types.
+!
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+     DO j = 1, 8
+! DLL definitions for windows
+        WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_DLL)'
+        WRITE(11,'(A)') '!DEC$attributes dllexport :: h5dread_rkind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+        WRITE(11,'(A)') '!DEC$endif'
+! Subroutine API
+        WRITE(11,'(A)') '  SUBROUTINE h5dread_rkind_'//TRIM(ADJUSTL(chr2))&
+             &//'_rank'//chr_rank(j)//'(dset_id, mem_type_id, buf, dims, hdferr, &'
+        WRITE(11,'(A)') '       mem_space_id, file_space_id, xfer_prp)'
+        WRITE(11,'(A)') '    USE, INTRINSIC :: ISO_C_BINDING'
+        WRITE(11,'(A)') '    IMPLICIT NONE'
+        WRITE(11,'(A)') '    INTEGER(HID_T), INTENT(IN) :: dset_id'
+        WRITE(11,'(A)') '    INTEGER(HID_T), INTENT(IN) :: mem_type_id'
+        WRITE(11,'(A)') '    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims'
+        WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(INOUT)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+        WRITE(11,'(A)') '    INTEGER, INTENT(OUT) :: hdferr'
+        WRITE(11,'(A)') '    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id'
+        WRITE(11,'(A)') '    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id'
+        WRITE(11,'(A)') '    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp'
+        WRITE(11,'(A)') '    INTEGER(HID_T) :: xfer_prp_default'
+        WRITE(11,'(A)') '    INTEGER(HID_T) :: mem_space_id_default'
+        WRITE(11,'(A)') '    INTEGER(HID_T) :: file_space_id_default'
+        WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        WRITE(11,'(A)') '    xfer_prp_default = H5P_DEFAULT_F'
+        WRITE(11,'(A)') '    mem_space_id_default = H5S_ALL_F'
+        WRITE(11,'(A)') '    file_space_id_default = H5S_ALL_F'
+        WRITE(11,'(A)') '    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp'
+        WRITE(11,'(A)') '    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id'
+        WRITE(11,'(A)') '    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id'
+        WRITE(11,'(A)') f_ptr_line(j)
+        WRITE(11,'(A)') '    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &'
+        WRITE(11,'(A)') '         file_space_id_default, xfer_prp_default, f_ptr)'
+        WRITE(11,'(A)') '  END SUBROUTINE h5dread_rkind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+
+     ENDDO
+  ENDDO
+
+  DO i = 1, num_ikinds
+     k = ikind(i)
+     WRITE(chr2,'(I2)') k
+     DO j = 1, 8
+! DLL definitions for windows
+        WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_DLL)'
+        WRITE(11,'(A)') '!DEC$attributes dllexport :: h5dread_ikind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+        WRITE(11,'(A)') '!DEC$endif'
+! Subroutine API
+        WRITE(11,'(A)') '  SUBROUTINE h5dread_ikind_'//TRIM(ADJUSTL(chr2))&
+             &//'_rank'//chr_rank(j)//'(dset_id, mem_type_id, buf, dims, hdferr, &'
+        WRITE(11,'(A)') '       mem_space_id, file_space_id, xfer_prp)'
+        WRITE(11,'(A)') '    USE, INTRINSIC :: ISO_C_BINDING'
+        WRITE(11,'(A)') '    IMPLICIT NONE'
+        WRITE(11,'(A)') '    INTEGER(HID_T), INTENT(IN) :: dset_id'
+        WRITE(11,'(A)') '    INTEGER(HID_T), INTENT(IN) :: mem_type_id'
+        WRITE(11,'(A)') '    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims'
+        WRITE(11,'(A)') '    INTEGER(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(INOUT)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+        WRITE(11,'(A)') '    INTEGER, INTENT(OUT) :: hdferr'
+        WRITE(11,'(A)') '    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id'
+        WRITE(11,'(A)') '    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id'
+        WRITE(11,'(A)') '    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp'
+        WRITE(11,'(A)') '    INTEGER(HID_T) :: xfer_prp_default'
+        WRITE(11,'(A)') '    INTEGER(HID_T) :: mem_space_id_default'
+        WRITE(11,'(A)') '    INTEGER(HID_T) :: file_space_id_default'
+        WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        WRITE(11,'(A)') '    xfer_prp_default = H5P_DEFAULT_F'
+        WRITE(11,'(A)') '    mem_space_id_default = H5S_ALL_F'
+        WRITE(11,'(A)') '    file_space_id_default = H5S_ALL_F'
+        WRITE(11,'(A)') '    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp'
+        WRITE(11,'(A)') '    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id'
+        WRITE(11,'(A)') '    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id'
+        WRITE(11,'(A)') f_ptr_line(j)
+        WRITE(11,'(A)') '    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &'
+        WRITE(11,'(A)') '         file_space_id_default, xfer_prp_default, f_ptr)'
+        WRITE(11,'(A)') '  END SUBROUTINE h5dread_ikind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+
+     ENDDO
+  ENDDO
+  DO j = 2, 8
+! DLL definitions for windows
+     WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_DLL)'
+     WRITE(11,'(A)') '!DEC$attributes dllexport :: h5dread_ckind_rank'//chr_rank(j)
+     WRITE(11,'(A)') '!DEC$endif'
+! Subroutine API
+     WRITE(11,'(A)') '  SUBROUTINE h5dread_ckind_rank'//chr_rank(j)//'(dset_id, mem_type_id, buf, dims, hdferr, &'
+     WRITE(11,'(A)') '       mem_space_id, file_space_id, xfer_prp)'
+     WRITE(11,'(A)') '    USE, INTRINSIC :: ISO_C_BINDING'
+     WRITE(11,'(A)') '    IMPLICIT NONE'
+     WRITE(11,'(A)') '    INTEGER(HID_T), INTENT(IN) :: dset_id'
+     WRITE(11,'(A)') '    INTEGER(HID_T), INTENT(IN) :: mem_type_id'
+     WRITE(11,'(A)') '    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims'
+     WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(INOUT)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+     WRITE(11,'(A)') '    INTEGER, INTENT(OUT) :: hdferr'
+     WRITE(11,'(A)') '    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id'
+     WRITE(11,'(A)') '    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id'
+     WRITE(11,'(A)') '    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp'
+     WRITE(11,'(A)') '    INTEGER(HID_T) :: xfer_prp_default'
+     WRITE(11,'(A)') '    INTEGER(HID_T) :: mem_space_id_default'
+     WRITE(11,'(A)') '    INTEGER(HID_T) :: file_space_id_default'
+     WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+     WRITE(11,'(A)') '    xfer_prp_default = H5P_DEFAULT_F'
+     WRITE(11,'(A)') '    mem_space_id_default = H5S_ALL_F'
+     WRITE(11,'(A)') '    file_space_id_default = H5S_ALL_F'
+     WRITE(11,'(A)') '    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp'
+     WRITE(11,'(A)') '    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id'
+     WRITE(11,'(A)') '    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id'
+     WRITE(11,'(A)') fchr_ptr_line(j)
+     WRITE(11,'(A)') '    hdferr = h5dread_f_c(dset_id, mem_type_id, mem_space_id_default, &'
+     WRITE(11,'(A)') '         file_space_id_default, xfer_prp_default, f_ptr)'
+     WRITE(11,'(A)') '  END SUBROUTINE h5dread_ckind_rank'//chr_rank(j)
+  ENDDO
+!
+! h5dwrite_f
+
+!****s* H5D (F03)/h5dwrite_f_F03
+!
+! NAME		
+!  h5dwrite_f_F03
+!
+! PURPOSE
+!  Writes raw data from a dataset into a buffer. 
+!
+! Inputs:
+!  dset_id	 - Identifier of the dataset to write to.
+!  mem_type_id	 - Identifier of the memory datatype.
+!  buf		 - Buffer with data to be written to the file.
+!  
+! Outputs:
+!  hdferr        - Returns 0 if successful and -1 if fails
+!
+! Optional parameters:
+!  mem_space_id	 - Identifier of the memory dataspace.
+!  file_space_id - Identifier of the dataset's dataspace in the file.
+!  xfer_prp	 - Identifier of a transfer property list for this I/O operation.
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  September 17, 2011
+!
+! Fortran2003 Interface:
+!!  SUBROUTINE h5dwrite_f(dset_id, mem_type_id, buf, hdferr, &
+!!                        mem_space_id, file_space_id, xfer_prp)
+!!    INTEGER(HID_T), INTENT(IN)              :: dset_id
+!!    INTEGER(HID_T), INTENT(IN)              :: mem_type_id
+!!    TYPE(C_PTR)   , INTENT(IN)              :: buf
+!!    INTEGER       , INTENT(OUT)             :: hdferr
+!!    INTEGER(HID_T), INTENT(IN)   , OPTIONAL :: mem_space_id
+!!    INTEGER(HID_T), INTENT(IN)   , OPTIONAL :: file_space_id
+!!    INTEGER(HID_T), INTENT(IN)   , OPTIONAL :: xfer_prp
+!*****
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+     DO j = 1, 8
+! DLL definitions for windows
+        WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_DLL)'
+        WRITE(11,'(A)') '!DEC$attributes dllexport :: h5dwrite_rkind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+        WRITE(11,'(A)') '!DEC$endif'
+! Subroutine API
+        WRITE(11,'(A)') '  SUBROUTINE h5dwrite_rkind_'//TRIM(ADJUSTL(chr2))&
+             &//'_rank'//chr_rank(j)//'(dset_id, mem_type_id, buf, dims, hdferr, &'
+        WRITE(11,'(A)') '       mem_space_id, file_space_id, xfer_prp)'
+        WRITE(11,'(A)') '    USE, INTRINSIC :: ISO_C_BINDING'
+        WRITE(11,'(A)') '    IMPLICIT NONE'
+        WRITE(11,'(A)') '    INTEGER(HID_T), INTENT(IN) :: dset_id'
+        WRITE(11,'(A)') '    INTEGER(HID_T), INTENT(IN) :: mem_type_id'
+        WRITE(11,'(A)') '    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims'
+        WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(IN)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+        WRITE(11,'(A)') '    INTEGER, INTENT(OUT) :: hdferr'
+        WRITE(11,'(A)') '    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id'
+        WRITE(11,'(A)') '    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id'
+        WRITE(11,'(A)') '    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp'
+        WRITE(11,'(A)') '    INTEGER(HID_T) :: xfer_prp_default'
+        WRITE(11,'(A)') '    INTEGER(HID_T) :: mem_space_id_default'
+        WRITE(11,'(A)') '    INTEGER(HID_T) :: file_space_id_default'
+        WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        WRITE(11,'(A)') '    xfer_prp_default  = H5P_DEFAULT_F'
+        WRITE(11,'(A)') '    mem_space_id_default = H5S_ALL_F'
+        WRITE(11,'(A)') '    file_space_id_default = H5S_ALL_F'
+        WRITE(11,'(A)') '    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp'
+        WRITE(11,'(A)') '    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id'
+        WRITE(11,'(A)') '    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id'
+        WRITE(11,'(A)') f_ptr_line(j)
+        WRITE(11,'(A)') '    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &'
+        WRITE(11,'(A)') '         file_space_id_default, xfer_prp_default, f_ptr)'
+        WRITE(11,'(A)') '  END SUBROUTINE h5dwrite_rkind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     ENDDO
+  ENDDO
+
+  DO i = 1, num_ikinds
+     k = ikind(i)
+     WRITE(chr2,'(I2)') k
+     DO j = 1, 8
+! DLL definitions for windows
+        WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_DLL)'
+        WRITE(11,'(A)') '!DEC$attributes dllexport :: h5dwrite_ikind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+        WRITE(11,'(A)') '!DEC$endif'
+! Subroutine API
+        WRITE(11,'(A)') '  SUBROUTINE h5dwrite_ikind_'//TRIM(ADJUSTL(chr2))&
+             &//'_rank'//chr_rank(j)//'(dset_id, mem_type_id, buf, dims, hdferr, &'
+        WRITE(11,'(A)') '       mem_space_id, file_space_id, xfer_prp)'
+        WRITE(11,'(A)') '    USE, INTRINSIC :: ISO_C_BINDING'
+        WRITE(11,'(A)') '    IMPLICIT NONE'
+        WRITE(11,'(A)') '    INTEGER(HID_T), INTENT(IN) :: dset_id'
+        WRITE(11,'(A)') '    INTEGER(HID_T), INTENT(IN) :: mem_type_id'
+        WRITE(11,'(A)') '    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims'
+        WRITE(11,'(A)') '    INTEGER(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(IN)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+        WRITE(11,'(A)') '    INTEGER, INTENT(OUT) :: hdferr'
+        WRITE(11,'(A)') '    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id'
+        WRITE(11,'(A)') '    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id'
+        WRITE(11,'(A)') '    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp'
+        WRITE(11,'(A)') '    INTEGER(HID_T) :: xfer_prp_default'
+        WRITE(11,'(A)') '    INTEGER(HID_T) :: mem_space_id_default'
+        WRITE(11,'(A)') '    INTEGER(HID_T) :: file_space_id_default'
+        WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        WRITE(11,'(A)') '    xfer_prp_default  = H5P_DEFAULT_F'
+        WRITE(11,'(A)') '    mem_space_id_default = H5S_ALL_F'
+        WRITE(11,'(A)') '    file_space_id_default = H5S_ALL_F'
+        WRITE(11,'(A)') '    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp'
+        WRITE(11,'(A)') '    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id'
+        WRITE(11,'(A)') '    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id'
+        WRITE(11,'(A)') f_ptr_line(j)
+        WRITE(11,'(A)') '    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &'
+        WRITE(11,'(A)') '         file_space_id_default, xfer_prp_default, f_ptr)'
+        WRITE(11,'(A)') '  END SUBROUTINE h5dwrite_ikind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     ENDDO
+  ENDDO  
+  DO j = 2, 8
+! DLL definitions for windows
+     WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_DLL)'
+     WRITE(11,'(A)') '!DEC$attributes dllexport :: h5dwrite_ckind_rank'//chr_rank(j)
+     WRITE(11,'(A)') '!DEC$endif'
+! Subroutine API
+     WRITE(11,'(A)') '  SUBROUTINE h5dwrite_ckind_rank'//chr_rank(j)//'(dset_id, mem_type_id, buf, dims, hdferr, &'
+     WRITE(11,'(A)') '       mem_space_id, file_space_id, xfer_prp)'
+     WRITE(11,'(A)') '    USE, INTRINSIC :: ISO_C_BINDING'
+     WRITE(11,'(A)') '    IMPLICIT NONE'
+     WRITE(11,'(A)') '    INTEGER(HID_T), INTENT(IN) :: dset_id'
+     WRITE(11,'(A)') '    INTEGER(HID_T), INTENT(IN) :: mem_type_id'
+     WRITE(11,'(A)') '    INTEGER(HSIZE_T), INTENT(IN), DIMENSION(*) :: dims'
+     WRITE(11,'(A)') '    CHARACTER(LEN=*),INTENT(IN)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+     WRITE(11,'(A)') '    INTEGER, INTENT(OUT) :: hdferr'
+     WRITE(11,'(A)') '    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: mem_space_id'
+     WRITE(11,'(A)') '    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: file_space_id'
+     WRITE(11,'(A)') '    INTEGER(HID_T), OPTIONAL, INTENT(IN) :: xfer_prp'
+     WRITE(11,'(A)') '    INTEGER(HID_T) :: xfer_prp_default'
+     WRITE(11,'(A)') '    INTEGER(HID_T) :: mem_space_id_default'
+     WRITE(11,'(A)') '    INTEGER(HID_T) :: file_space_id_default'
+     WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+     WRITE(11,'(A)') '    xfer_prp_default  = H5P_DEFAULT_F'
+     WRITE(11,'(A)') '    mem_space_id_default = H5S_ALL_F'
+     WRITE(11,'(A)') '    file_space_id_default = H5S_ALL_F'
+     WRITE(11,'(A)') '    IF(PRESENT(xfer_prp)) xfer_prp_default = xfer_prp'
+     WRITE(11,'(A)') '    IF(PRESENT(mem_space_id))  mem_space_id_default = mem_space_id'
+     WRITE(11,'(A)') '    IF(PRESENT(file_space_id)) file_space_id_default = file_space_id'
+     WRITE(11,'(A)') fchr_ptr_line(j)
+     WRITE(11,'(A)') '    hdferr = h5dwrite_f_c(dset_id, mem_type_id, mem_space_id_default, &'
+     WRITE(11,'(A)') '         file_space_id_default, xfer_prp_default, f_ptr)'
+     WRITE(11,'(A)') '  END SUBROUTINE h5dwrite_ckind_rank'//chr_rank(j)
+  ENDDO
+
+!**********************
+! H5P APIs
+!**********************
+!
+! H5Pset_fill_value_f
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+! DLL definitions for windows
+     WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_DLL)'
+     WRITE(11,'(A)') '!DEC$attributes dllexport :: h5pset_fill_value_kind_'//TRIM(ADJUSTL(chr2))
+     WRITE(11,'(A)') '!DEC$endif'
+! Subroutine API
+     WRITE(11,'(A)') '  SUBROUTINE h5pset_fill_value_kind_'//TRIM(ADJUSTL(chr2))&
+          &//'(prp_id, type_id, fillvalue, hdferr)'
+     WRITE(11,'(A)') '    IMPLICIT NONE'
+     WRITE(11,'(A)') '    INTEGER(HID_T), INTENT(IN) :: prp_id'
+     WRITE(11,'(A)') '    INTEGER(HID_T), INTENT(IN) :: type_id'
+     WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'), INTENT(IN), TARGET :: fillvalue' 
+     WRITE(11,'(A)') '    INTEGER, INTENT(OUT) :: hdferr '
+     WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr '
+     WRITE(11,'(A)') '    f_ptr = C_LOC(fillvalue)'
+     WRITE(11,'(A)') '    hdferr = h5pset_fill_value_c(prp_id, type_id, f_ptr)'
+     WRITE(11,'(A)') '  END SUBROUTINE h5pset_fill_value_kind_'//TRIM(ADJUSTL(chr2))
+  ENDDO
+
+! H5Pget_fill_value_f
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+! DLL definitions for windows
+     WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_DLL)'
+     WRITE(11,'(A)') '!DEC$attributes dllexport :: h5pget_fill_value_kind_'//TRIM(ADJUSTL(chr2))
+     WRITE(11,'(A)') '!DEC$endif'
+! Subroutine API
+     WRITE(11,'(A)') '  SUBROUTINE h5pget_fill_value_kind_'//TRIM(ADJUSTL(chr2))&
+          &//'(prp_id, type_id, fillvalue, hdferr)'
+     WRITE(11,'(A)') '    IMPLICIT NONE'
+     WRITE(11,'(A)') '    INTEGER(HID_T), INTENT(IN) :: prp_id'
+     WRITE(11,'(A)') '    INTEGER(HID_T), INTENT(IN) :: type_id'
+     WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'), INTENT(OUT), TARGET :: fillvalue'
+     WRITE(11,'(A)') '    INTEGER, INTENT(OUT) :: hdferr'
+     WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+     WRITE(11,'(A)') '    f_ptr = C_LOC(fillvalue)'
+     WRITE(11,'(A)') '    hdferr = h5pget_fill_value_c(prp_id, type_id, f_ptr)'
+     WRITE(11,'(A)') '  END SUBROUTINE h5pget_fill_value_kind_'//TRIM(ADJUSTL(chr2))
+  ENDDO
+
+! H5Pset_f
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+! DLL definitions for windows
+     WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_DLL)'
+     WRITE(11,'(A)') '!DEC$attributes dllexport :: h5pset_kind_'//TRIM(ADJUSTL(chr2))
+     WRITE(11,'(A)') '!DEC$endif'
+! Subroutine API
+     WRITE(11,'(A)') '  SUBROUTINE h5pset_kind_'//TRIM(ADJUSTL(chr2))&
+          &//'(prp_id, name, value, hdferr)'
+     WRITE(11,'(A)') '    IMPLICIT NONE'
+     WRITE(11,'(A)') '    INTEGER(HID_T), INTENT(IN) :: prp_id'
+     WRITE(11,'(A)') '    CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name'
+     WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'), INTENT(IN), TARGET :: value'
+     WRITE(11,'(A)') '    INTEGER, INTENT(OUT) :: hdferr'
+     WRITE(11,'(A)') '    INTEGER :: name_len'
+     WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+     WRITE(11,'(A)') '    f_ptr = C_LOC(value)'
+     WRITE(11,'(A)') '    name_len = LEN(name)'
+     WRITE(11,'(A)') '    hdferr = h5pget_c(prp_id, name, name_len, f_ptr)'
+     
+     WRITE(11,'(A)') '  END SUBROUTINE h5pset_kind_'//TRIM(ADJUSTL(chr2))
+  ENDDO
+
+! H5Pget_f
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+! DLL definitions for windows
+     WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_DLL)'
+     WRITE(11,'(A)') '!DEC$attributes dllexport :: h5pget_kind_'//TRIM(ADJUSTL(chr2))
+     WRITE(11,'(A)') '!DEC$endif'
+! Subroutine API
+     WRITE(11,'(A)') '  SUBROUTINE h5pget_kind_'//TRIM(ADJUSTL(chr2))&
+          &//'(prp_id, name, value, hdferr)'
+     WRITE(11,'(A)') '    IMPLICIT NONE'
+     WRITE(11,'(A)') '    INTEGER(HID_T), INTENT(IN) :: prp_id'
+     WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(IN) :: name'
+     WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'),   INTENT(OUT), TARGET :: value'
+     WRITE(11,'(A)') '    INTEGER, INTENT(OUT) :: hdferr'
+     WRITE(11,'(A)') '    INTEGER :: name_len'
+     WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+     WRITE(11,'(A)') '    f_ptr = C_LOC(value)'
+     WRITE(11,'(A)') '    name_len = LEN(name)'
+     WRITE(11,'(A)') '    hdferr = h5pget_c(prp_id, name, name_len, f_ptr)'
+     WRITE(11,'(A)') '  END SUBROUTINE h5pget_kind_'//TRIM(ADJUSTL(chr2))
+  ENDDO
+
+! H5Pregister_f
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+! DLL definitions for windows
+     WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_DLL)'
+     WRITE(11,'(A)') '!DEC$attributes dllexport :: h5pregister_kind_'//TRIM(ADJUSTL(chr2))
+     WRITE(11,'(A)') '!DEC$endif'
+! Subroutine API
+     WRITE(11,'(A)') 'SUBROUTINE h5pregister_kind_'//TRIM(ADJUSTL(chr2))&
+          &//'(class, name, size, value, hdferr)'
+     WRITE(11,'(A)') '  IMPLICIT NONE'
+     WRITE(11,'(A)') '  INTEGER(HID_T), INTENT(IN) :: class'
+     WRITE(11,'(A)') '  CHARACTER(LEN=*), INTENT(IN) :: name'
+     WRITE(11,'(A)') '  INTEGER(SIZE_T), INTENT(IN) :: size'
+     WRITE(11,'(A)') '  REAL(KIND='//TRIM(ADJUSTL(chr2))//'), INTENT(IN), TARGET :: value'
+     WRITE(11,'(A)') '  INTEGER, INTENT(OUT) :: hdferr'
+     WRITE(11,'(A)') '  INTEGER :: name_len'
+     WRITE(11,'(A)') '  TYPE(C_PTR) :: f_ptr'
+     WRITE(11,'(A)') '  f_ptr = C_LOC(value)'
+     WRITE(11,'(A)') '  name_len = LEN(name)'
+     WRITE(11,'(A)') '  hdferr = h5pregister_c(class, name, name_len, size, f_ptr)'
+     WRITE(11,'(A)') 'END SUBROUTINE h5pregister_kind_'//TRIM(ADJUSTL(chr2))
+  ENDDO
+
+! H5Pinsert_f
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+! DLL definitions for windows
+     WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_DLL)'
+     WRITE(11,'(A)') '!DEC$attributes dllexport :: h5pinsert_kind_'//TRIM(ADJUSTL(chr2))
+     WRITE(11,'(A)') '!DEC$endif'
+! Subroutine API
+     WRITE(11,'(A)') '  SUBROUTINE h5pinsert_kind_'//TRIM(ADJUSTL(chr2))&
+          &//'(plist, name, size, value, hdferr)'
+     WRITE(11,'(A)') '    IMPLICIT NONE'
+     WRITE(11,'(A)') '    INTEGER(HID_T), INTENT(IN) :: plist'
+     WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(IN) :: name'
+     WRITE(11,'(A)') '    INTEGER(SIZE_T), INTENT(IN) :: size'
+     WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'),   INTENT(IN), TARGET :: value'
+     WRITE(11,'(A)') '    INTEGER, INTENT(OUT) :: hdferr'
+     WRITE(11,'(A)') '    INTEGER :: name_len'
+     WRITE(11,'(A)') '    TYPE(c_ptr) :: f_ptr'
+     WRITE(11,'(A)') '    f_ptr = c_loc(value)'
+     WRITE(11,'(A)') '    name_len = LEN(name)'
+     WRITE(11,'(A)') '    hdferr = h5pinsert_c(plist, name , name_len, size, f_ptr)'
+     WRITE(11,'(A)') '  END SUBROUTINE h5pinsert_kind_'//TRIM(ADJUSTL(chr2))
+  ENDDO
+
+  WRITE(11,'(A)') 'END MODULE H5_gen'
+
+  CLOSE(11)
+
+END PROGRAM H5_buildiface
+
+
+
diff --git a/fortran/src/H5_f.c b/fortran/src/H5_f.c
index 95f6e21..f3bc42f 100644
--- a/fortran/src/H5_f.c
+++ b/fortran/src/H5_f.c
@@ -1,6 +1,6 @@
 /****ih* H5_f/H5_f
  * PURPOSE
- *   This file contains C stubs for H5 Fortran APIs
+ *  This file contains C stubs for H5 Fortran APIs
  *
  * COPYRIGHT
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -22,7 +22,7 @@
 */
 
 #include "H5f90.h"
-
+#include "H5fort_type_defines.h"
 /****if* H5_f/h5init_types_c
  * NAME
  *  h5init_types_c
@@ -30,17 +30,17 @@
  *  Initialize predefined datatypes in Fortran
  * INPUTS
  *  types - array with the predefined Native Fortran
- *          type, its element and length must be the
- *          same as the types array defined in the
- *          H5f90global.f90
+ *  type, its element and length must be the
+ *  same as the types array defined in the
+ *          H5f90global.F90
  *  floatingtypes - array with the predefined Floating Fortran
- *                   type, its element and length must be the
- *                   same as the floatingtypes array defined in the
- *                   H5f90global.f90
+ *  type, its element and length must be the
+ *  same as the floatingtypes array defined in the
+ *                   H5f90global.F90
  *  integertypes - array with the predefined Integer Fortran
- *                 type, its element and length must be the
- *                 same as the integertypes array defined in the
- *                 H5f90global.f90
+ *  type, its element and length must be the
+ *  same as the integertypes array defined in the
+ *                 H5f90global.F90
  * RETURNS
  *  0 on success, -1 on failure
  * AUTHOR
@@ -49,14 +49,14 @@
  * SOURCE
 */
 int_f
-nh5init_types_c( hid_t_f * types, hid_t_f * floatingtypes, hid_t_f * integertypes )
+h5init_types_c( hid_t_f * types, hid_t_f * floatingtypes, hid_t_f * integertypes )
 /******/
 {
     int ret_value = -1;
     hid_t c_type_id;
     size_t tmp_val;
 
-/* Fortran INTEGER is may not be the same as C in; do all checking to find
+/* Fortran INTEGER may not be the same as C; do all checking to find
    an appropriate size
 */
     if (sizeof(int_f) == sizeof(int)) {
@@ -92,6 +92,12 @@ nh5init_types_c( hid_t_f * types, hid_t_f * floatingtypes, hid_t_f * integertype
        if ((types[2] = (hid_t_f)H5Tcopy(H5T_NATIVE_LDOUBLE)) < 0) return ret_value;
     }/*end else */
 #endif
+#ifdef H5_HAVE_FLOAT128
+    else if(sizeof(double_f)==sizeof(__float128)) {
+      if ((types[2] = H5Tcopy (H5T_NATIVE_FLOAT)) < 0) return ret_value;
+      if ( H5Tset_precision (types[2], 128) < 0) return ret_value;
+    }/*end else */
+#endif
 
 /*
     if ((types[3] = H5Tcopy(H5T_NATIVE_UINT8)) < 0) return ret_value;
@@ -126,7 +132,11 @@ nh5init_types_c( hid_t_f * types, hid_t_f * floatingtypes, hid_t_f * integertype
       if ((types[6] = (hid_t_f)H5Tcopy(H5T_NATIVE_INT)) < 0) return ret_value;
     } /*end if */
     else if (sizeof(int_1_f) == sizeof(long long)) {
-	if ((types[6] = (hid_t_f)H5Tcopy(H5T_NATIVE_LLONG)) < 0) return ret_value;
+      if ((types[6] = (hid_t_f)H5Tcopy(H5T_NATIVE_LLONG)) < 0) return ret_value;
+    } /*end if */
+    else {
+      if ((types[6] = H5Tcopy (H5T_NATIVE_INT)) < 0) return ret_value;
+      if ( H5Tset_precision (types[6], 128) < 0) return ret_value;
     } /*end else */
     /*
      * FIND H5T_NATIVE_INTEGER_2
@@ -143,6 +153,10 @@ nh5init_types_c( hid_t_f * types, hid_t_f * floatingtypes, hid_t_f * integertype
     else if (sizeof(int_2_f) == sizeof(long long)) {
 	if ((types[7] = (hid_t_f)H5Tcopy(H5T_NATIVE_LLONG)) < 0) return ret_value;
     } /*end else */
+    else {
+      if ((types[7] = H5Tcopy (H5T_NATIVE_INT)) < 0) return ret_value;
+      if ( H5Tset_precision (types[7], 128) < 0) return ret_value;
+    } /*end else */
     /*
      * FIND H5T_NATIVE_INTEGER_4
      */
@@ -158,6 +172,10 @@ nh5init_types_c( hid_t_f * types, hid_t_f * floatingtypes, hid_t_f * integertype
     else if (sizeof(int_4_f) == sizeof(long long)) {
 	if ((types[8] = (hid_t_f)H5Tcopy(H5T_NATIVE_LLONG)) < 0) return ret_value;
     } /*end else */
+    else {
+      if ((types[8] = H5Tcopy (H5T_NATIVE_INT)) < 0) return ret_value;
+      if ( H5Tset_precision (types[8], 128) < 0) return ret_value;
+    } /*end else */
     /*
      * FIND H5T_NATIVE_INTEGER_8
      */
@@ -173,47 +191,65 @@ nh5init_types_c( hid_t_f * types, hid_t_f * floatingtypes, hid_t_f * integertype
     else if (sizeof(int_8_f) == sizeof(long long)) {
 	if ((types[9] = (hid_t_f)H5Tcopy(H5T_NATIVE_LLONG)) < 0) return ret_value;
     } /*end else */
+    else {
+      if ((types[9] = H5Tcopy (H5T_NATIVE_INT)) < 0) return ret_value;
+      if ( H5Tset_precision (types[9], 128) < 0) return ret_value;
+    } /*end else */
+
     /*
-     * FIND H5T_NATIVE_REAL_4
+     * FIND H5T_NATIVE_REAL_C_FLOAT
      */
-    if (sizeof(real_4_f) == sizeof(float)) {
+    if (sizeof(real_C_FLOAT_f) == sizeof(float)) {
       if ((types[10] = (hid_t_f)H5Tcopy(H5T_NATIVE_FLOAT)) < 0) return ret_value;
     } /*end if */
-    else if (sizeof(real_4_f) == sizeof(double)) {
+    else if (sizeof(real_C_FLOAT_f) == sizeof(double)) {
       if ((types[10] = (hid_t_f)H5Tcopy(H5T_NATIVE_DOUBLE)) < 0) return ret_value;
     } /*end if */
 #if H5_SIZEOF_LONG_DOUBLE!=0
-    else if (sizeof(real_4_f) == sizeof(long double)) {
+    else if (sizeof(real_C_FLOAT_f) == sizeof(long double)) {
 	if ((types[10] = (hid_t_f)H5Tcopy(H5T_NATIVE_LDOUBLE)) < 0) return ret_value;
     } /*end else */
 #endif
     /*
-     * FIND H5T_NATIVE_REAL_8
+     * FIND H5T_NATIVE_REAL_C_DOUBLE
      */
-    if (sizeof(real_8_f) == sizeof(float)) {
+    if (sizeof(real_C_DOUBLE_f) == sizeof(float)) {
       if ((types[11] = (hid_t_f)H5Tcopy(H5T_NATIVE_FLOAT)) < 0) return ret_value;
     } /*end if */
-    else if (sizeof(real_8_f) == sizeof(double)) {
+    else if (sizeof(real_C_DOUBLE_f) == sizeof(double)) {
       if ((types[11] = (hid_t_f)H5Tcopy(H5T_NATIVE_DOUBLE)) < 0) return ret_value;
     } /*end if */
 #if H5_SIZEOF_LONG_DOUBLE!=0
-    else if (sizeof(real_8_f) == sizeof(long double)) {
+    else if (sizeof(real_C_DOUBLE_f) == sizeof(long double)) {
 	if ((types[11] = (hid_t_f)H5Tcopy(H5T_NATIVE_LDOUBLE)) < 0) return ret_value;
     } /*end else */
 #endif
     /*
-     * FIND H5T_NATIVE_REAL_16
+     * FIND H5T_NATIVE_REAL_C_LONG_DOUBLE
      */
-    if (sizeof(real_16_f) == sizeof(float)) {
+#if H5_FORTRAN_C_LONG_DOUBLE_IS_UNIQUE!=0
+    if (sizeof(real_C_LONG_DOUBLE_f) == sizeof(float)) {
       if ((types[12] = (hid_t_f)H5Tcopy(H5T_NATIVE_FLOAT)) < 0) return ret_value;
     } /*end if */
-    else if (sizeof(real_16_f) == sizeof(double)) {
+    else if (sizeof(real_C_LONG_DOUBLE_f) == sizeof(double)) {
       if ((types[12] = (hid_t_f)H5Tcopy(H5T_NATIVE_DOUBLE)) < 0) return ret_value;
     } /*end if */
-#if H5_SIZEOF_LONG_DOUBLE!=0
-    else if (sizeof(real_16_f) == sizeof(long double)) {
+# if H5_FORTRAN_HAVE_C_LONG_DOUBLE!=0
+    else if (sizeof(real_C_LONG_DOUBLE_f) == sizeof(long double)) {
+      if ( H5_PAC_C_MAX_REAL_PRECISION >= H5_PAC_FC_MAX_REAL_PRECISION) {
 	if ((types[12] = (hid_t_f)H5Tcopy(H5T_NATIVE_LDOUBLE)) < 0) return ret_value;
-    } /*end else */
+      }
+      else {
+	if ((types[12] = H5Tcopy (H5T_NATIVE_FLOAT)) < 0) return ret_value;
+	if ( H5Tset_precision (types[12], 128) < 0) return ret_value;
+      }
+    }
+# else
+    if ((types[12] = H5Tcopy (H5T_NATIVE_FLOAT)) < 0) return ret_value;
+    if ( H5Tset_precision (types[12], 64) < 0) return ret_value;
+# endif
+#else
+    if ((types[12] = H5Tcopy(H5T_NATIVE_DOUBLE)) < 0) return ret_value;
 #endif
     /*
      * FIND H5T_NATIVE_B_8
@@ -221,7 +257,38 @@ nh5init_types_c( hid_t_f * types, hid_t_f * floatingtypes, hid_t_f * integertype
     if ((types[13] = (hid_t_f)H5Tcopy(H5T_NATIVE_B8))  < 0) return ret_value;
     if ((types[14] = (hid_t_f)H5Tcopy(H5T_NATIVE_B16)) < 0) return ret_value;
     if ((types[15] = (hid_t_f)H5Tcopy(H5T_NATIVE_B32)) < 0) return ret_value;
-    if ((types[16] = (hid_t_f)H5Tcopy(H5T_NATIVE_B64)) < 0) return ret_value;  
+    if ((types[16] = (hid_t_f)H5Tcopy(H5T_NATIVE_B64)) < 0) return ret_value;
+
+#if H5_HAVE_Fortran_INTEGER_SIZEOF_16!=0
+     /*
+     * FIND H5T_NATIVE_INTEGER_16
+     */
+    if (sizeof(int_16_f) == sizeof(char)) {
+      if ((types[17] = (hid_t_f)H5Tcopy(H5T_NATIVE_CHAR)) < 0) return ret_value;
+    } /*end if */
+    else if (sizeof(int_16_f) == sizeof(short)) {
+      if ((types[17] = (hid_t_f)H5Tcopy(H5T_NATIVE_SHORT)) < 0) return ret_value;
+    } /*end if */
+    else if (sizeof(int_16_f) == sizeof(int)) {
+      if ((types[17] = (hid_t_f)H5Tcopy(H5T_NATIVE_INT)) < 0) return ret_value;
+    } /*end if */
+    else if (sizeof(int_16_f) == sizeof(long long)) {
+	if ((types[17] = (hid_t_f)H5Tcopy(H5T_NATIVE_LLONG)) < 0) return ret_value;
+    } /*end else */
+    else {
+      if ((types[17] = H5Tcopy (H5T_NATIVE_INT)) < 0) return ret_value;
+      if ( H5Tset_precision (types[17], 128) < 0) return ret_value;
+    } /*end else */
+#else
+    if ((types[17] = H5Tcopy (H5T_NATIVE_INT)) < 0) return ret_value;
+    if ( H5Tset_precision (types[17], 128) < 0) return ret_value;
+#endif
+
+     /*
+     * FIND H5T_NATIVE_FLOAT_128
+     */
+    if ((types[18] = H5Tcopy (H5T_NATIVE_FLOAT)) < 0) return ret_value;
+    if ( H5Tset_precision (types[18], 128) < 0) return ret_value;
 
     if ((floatingtypes[0] = (hid_t_f)H5Tcopy(H5T_IEEE_F32BE)) < 0) return ret_value;
     if ((floatingtypes[1] = (hid_t_f)H5Tcopy(H5T_IEEE_F32LE)) < 0) return ret_value;
@@ -272,35 +339,35 @@ nh5init_types_c( hid_t_f * types, hid_t_f * floatingtypes, hid_t_f * integertype
  *  Closes predefined datatype in Fortran
  * INPUTS
  *  types         - array with the predefined Native Fortran
- *                  type, its element and length must be the
- *                  same as the types array defined in the
- *                  H5f90global.f90
+ *  type, its element and length must be the
+ *  same as the types array defined in the
+ *                  H5f90global.F90
  *  lentypes      - length of the types array, which must be the
- *                  same as the length of types array defined
- *                  in the H5f90global.f90
+ *  same as the length of types array defined
+ *  in the H5f90global.F90
  *  floatingtypes - array with the predefined Floating Fortran
- *                  type, its element and length must be the
- *                  same as the floatingtypes array defined in the
- *                  H5f90global.f90
+ *  type, its element and length must be the
+ *  same as the floatingtypes array defined in the
+ *                  H5f90global.F90
  *  floatinglen   - length of the floatingtypes array, which must be the
- *                  same as the length of floatingtypes array defined
- *                  in the H5f90global.f90
+ *  same as the length of floatingtypes array defined
+ *  in the H5f90global.F90
  *  integertypes  - array with the predefined Integer Fortran
- *                  type, its element and length must be the
- *                  same as the integertypes array defined in the
- *                  H5f90global.f90
+ *  type, its element and length must be the
+ *  same as the integertypes array defined in the
+ *                  H5f90global.F90
  *  integerlen    - length of the floatingtypes array, which must be the
- *                  same as the length of floatingtypes array defined
- *                  in the H5f90global.f90
+ *  same as the length of floatingtypes array defined
+ *  in the H5f90global.F90
  * RETURNS
- *   0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
- *   Elena Pourmal
- *   Tuesday, August 3, 1999
+ *  Elena Pourmal
+ *  Tuesday, August 3, 1999
  * SOURCE
  */
 int_f
-nh5close_types_c( hid_t_f * types, int_f *lentypes,
+h5close_types_c( hid_t_f * types, int_f *lentypes,
                   hid_t_f * floatingtypes, int_f* floatinglen,
                   hid_t_f * integertypes,  int_f * integerlen )
 /******/
@@ -310,16 +377,16 @@ nh5close_types_c( hid_t_f * types, int_f *lentypes,
     int i;
 
     for (i = 0; i < *lentypes; i++) {
-        c_type_id = types[i];
-        if ( H5Tclose(c_type_id) < 0) return ret_value;
+      c_type_id = types[i];
+      if ( H5Tclose(c_type_id) < 0) return ret_value;
     }
     for (i = 0; i < *floatinglen; i++) {
-        c_type_id = floatingtypes[i];
-        if ( H5Tclose(c_type_id) < 0) return ret_value;
+      c_type_id = floatingtypes[i];
+      if ( H5Tclose(c_type_id) < 0) return ret_value;
     }
     for (i = 0; i < *integerlen; i++) {
-        c_type_id = integertypes[i];
-        if ( H5Tclose(c_type_id) < 0) return ret_value;
+      c_type_id = integertypes[i];
+      if ( H5Tclose(c_type_id) < 0) return ret_value;
     }
     ret_value = 0;
     return ret_value;
@@ -368,12 +435,13 @@ nh5close_types_c( hid_t_f * types, int_f *lentypes,
  * SOURCE
  */
 int_f
-nh5init_flags_c( int_f *h5d_flags, size_t_f *h5d_size_flags, 
-		 int_f *h5e_flags, hid_t_f *h5e_hid_flags, int_f *h5f_flags,
-                 int_f *h5fd_flags, hid_t_f *h5fd_hid_flags,
-                 int_f *h5g_flags, int_f *h5i_flags, int_f *h5l_flags, int_f *h5o_flags,
-                 hid_t_f *h5p_flags, int_f *h5p_flags_int, int_f *h5r_flags, int_f *h5s_flags,
-		 hsize_t_f *h5s_hsize_flags, int_f *h5t_flags, int_f *h5z_flags, int_f *h5_generic_flags)
+h5init_flags_c( int_f *h5d_flags, size_t_f *h5d_size_flags, 
+		int_f *h5e_flags, hid_t_f *h5e_hid_flags, int_f *h5f_flags,
+                int_f *h5fd_flags, hid_t_f *h5fd_hid_flags,
+                int_f *h5g_flags, int_f *h5i_flags, int_f *h5l_flags, int_f *h5o_flags,
+                hid_t_f *h5p_flags, int_f *h5p_flags_int, int_f *h5r_flags, int_f *h5s_flags,
+		hsize_t_f *h5s_hsize_flags, int_f *h5t_flags, int_f *h5z_flags, int_f *h5_generic_flags,
+                haddr_t_f *h5_haddr_generic_flags)
 /******/
 {
     int ret_value = -1;
@@ -422,13 +490,16 @@ nh5init_flags_c( int_f *h5d_flags, size_t_f *h5d_size_flags,
 /*
  *  H5F flags
  *
- *  H5F_ACC_DEBUG has no effect as of HDF5 1.8.16.
+ *  Note that H5F_ACC_DEBUG is deprecated (nonfunctional) but retained
+ *  for backward compatibility since it's in the public API.
  */
     h5f_flags[0] = (int_f)H5F_ACC_RDWR;
     h5f_flags[1] = (int_f)H5F_ACC_RDONLY;
     h5f_flags[2] = (int_f)H5F_ACC_TRUNC;
     h5f_flags[3] = (int_f)H5F_ACC_EXCL;
-    h5f_flags[4] = (int_f)H5F_ACC_DEBUG;    /* nonfunctional */
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+    h5f_flags[4] = (int_f)H5F_ACC_DEBUG;
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
     h5f_flags[5] = (int_f)H5F_SCOPE_LOCAL;
     h5f_flags[6] = (int_f)H5F_SCOPE_GLOBAL;
     h5f_flags[7] = (int_f)H5F_CLOSE_DEFAULT;
@@ -521,11 +592,11 @@ nh5init_flags_c( int_f *h5d_flags, size_t_f *h5d_size_flags,
     h5o_flags[6] = (int_f)H5O_COPY_ALL; /* All object copying flags (for internal checking) */
 
 /* Flags for shared message indexes.
- * Pass these flags in using the mesg_type_flags parameter in
+ *  Pass these flags in using the mesg_type_flags parameter in
  * H5P_set_shared_mesg_index.
  * (Developers: These flags correspond to object header message type IDs,
- * but we need to assign each kind of message to a different bit so that
- * one index can hold multiple types.)
+ *  but we need to assign each kind of message to a different bit so that
+ *  one index can hold multiple types.)
  */
       h5o_flags[7] = (int_f)H5O_SHMESG_NONE_FLAG;  /* No shared messages */
       h5o_flags[8] = (int_f)H5O_SHMESG_SDSPACE_FLAG; /* Simple Dataspace Message.  */
@@ -544,7 +615,7 @@ nh5init_flags_c( int_f *h5d_flags, size_t_f *h5d_size_flags,
       h5o_flags[19] = (int_f)H5O_HDR_ALL_FLAGS;
 
 /* Maximum shared message values.  Number of indexes is 8 to allow room to add
- * new types of messages.
+ *  new types of messages.
  */
       h5o_flags[20] = (int_f)H5O_SHMESG_MAX_NINDEXES;
       h5o_flags[21] = (int_f)H5O_SHMESG_MAX_LIST_SIZE;
@@ -686,7 +757,7 @@ nh5init_flags_c( int_f *h5d_flags, size_t_f *h5d_size_flags,
 
 
 /*
- *  H5 Generic flags introduced in version 1.8 -MSB-
+ *  H5 Generic flags introduced in version 1.8
  */
 
       /* H5_index_t enum struct */
@@ -703,14 +774,16 @@ nh5init_flags_c( int_f *h5d_flags, size_t_f *h5d_size_flags,
       h5_generic_flags[5] = (int_f)H5_ITER_INC;           /* Increasing order */
       h5_generic_flags[6] = (int_f)H5_ITER_DEC;           /* Decreasing order */
       h5_generic_flags[7] = (int_f)H5_ITER_NATIVE;        /* No particular order, whatever is fastest */
-      h5_generic_flags[8] = (int_f)H5_ITER_N;		   /* Number of iteration orders */
+      h5_generic_flags[8] = (int_f)H5_ITER_N;		  /* Number of iteration orders */
+
+      h5_haddr_generic_flags[0] = (haddr_t_f)HADDR_UNDEF; /* undefined address */
 
     ret_value = 0;
     return ret_value;
 }
 
 int_f
-nh5init1_flags_c(int_f *h5lib_flags)
+h5init1_flags_c(int_f *h5lib_flags)
 /******/
 {
     int ret_value = -1;
@@ -724,19 +797,19 @@ nh5init1_flags_c(int_f *h5lib_flags)
 
 /****if* H5_f/h5open_c
  * NAME
- *              h5open_c
+ *  h5open_c
  * PURPOSE
- *           Calls H5open call to initialize C HDF5 library
+ *  Calls H5open call to initialize C HDF5 library
  * RETURNS
- *           0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
- *        Elena Pourmal
- *        Friday, November 17, 2000
+ *  Elena Pourmal
+ *  Friday, November 17, 2000
  *
  * SOURCE
  */
 int_f
-nh5open_c(void)
+h5open_c(void)
 /******/
 {
     int ret_value = -1;
@@ -747,17 +820,17 @@ nh5open_c(void)
 }
 /****if* H5_f/h5close_c
  * NAME
- *              h5close_c
+ *  h5close_c
  * PURPOSE
- *           Calls H5close call to close C HDF5 library
+ *  Calls H5close call to close C HDF5 library
  * RETURNS
- *           0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
- *        Elena Pourmal
+ *  Elena Pourmal
  * SOURCE
  */
 int_f
-nh5close_c(void)
+h5close_c(void)
 /******/
 {
     int ret_value = -1;
@@ -769,28 +842,28 @@ nh5close_c(void)
 
 /****if* H5_f/h5get_libversion_c
  * NAME
- *              h5get_libversion_c
+ *  h5get_libversion_c
  * PURPOSE
- *           Calls H5get_libversion function
+ *  Calls H5get_libversion function
  *		      to retrieve library version info.
  * INPUTS
  *
- *                    None
+ *  None
  * OUTPUTS
  *
- *                    majnum - the major version of the library
- *                    minnum - the minor version of the library
- *                    relnum - the release version of the library
+ *  majnum - the major version of the library
+ *  minnum - the minor version of the library
+ *  relnum - the release version of the library
  * RETURNS
- *           0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
- *        Elena Pourmal
- *                    Tuesday, September 24, 2002
+ *  Elena Pourmal
+ *  Tuesday, September 24, 2002
  * SOURCE
  *
  */
 int_f
-nh5get_libversion_c(int_f *majnum, int_f *minnum, int_f *relnum)
+h5get_libversion_c(int_f *majnum, int_f *minnum, int_f *relnum)
 /******/
 {
 
@@ -808,27 +881,27 @@ nh5get_libversion_c(int_f *majnum, int_f *minnum, int_f *relnum)
 
 /****if* H5_f/h5check_version_c
  * NAME
- *              h5check_version_c
+ *  h5check_version_c
  * PURPOSE
- *           Calls H5check_version function
+ *  Calls H5check_version function
  *		      to verify library version info.
  * INPUTS
  *
- *                    majnum - the major version of the library
- *                    minnum - the minor version of the library
- *                    relnum - the release version of the library
+ *  majnum - the major version of the library
+ *  minnum - the minor version of the library
+ *  relnum - the release version of the library
  * OUTPUTS
  *
- *                    None
+ *  None
  * RETURNS
- *           0 on success, aborts on failure
+ *  0 on success, aborts on failure
  * AUTHOR
- *        Elena Pourmal
- *                    Tuesday, September 24, 2002
+ *  Elena Pourmal
+ *  Tuesday, September 24, 2002
  * SOURCE
  */
 int_f
-nh5check_version_c(int_f *majnum, int_f *minnum, int_f *relnum)
+h5check_version_c(int_f *majnum, int_f *minnum, int_f *relnum)
 /******/
 {
     int ret_value = -1;
@@ -846,18 +919,18 @@ nh5check_version_c(int_f *majnum, int_f *minnum, int_f *relnum)
 
 /****if* H5_f/h5garbage_collect_c
  * NAME
- *              h5garbage_collect_c
+ *  h5garbage_collect_c
  * PURPOSE
- *           Calls H5garbage_collect to collect on all free-lists of all types
+ *  Calls H5garbage_collect to collect on all free-lists of all types
  * RETURNS
- *           0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
- *        Elena Pourmal
- *                    Tuesday, September 24, 2002
+ *  Elena Pourmal
+ *  Tuesday, September 24, 2002
  * SOURCE
  */
 int_f
-nh5garbage_collect_c(void)
+h5garbage_collect_c(void)
 /******/
 {
     int ret_value = -1;
@@ -869,18 +942,18 @@ nh5garbage_collect_c(void)
 
 /****if* H5_f/h5dont_atexit_c
  * NAME
- *              h5dont_atexit_c
+ *  h5dont_atexit_c
  * PURPOSE
- *           Calls H5dont_atexit not to install atexit cleanup routine
+ *  Calls H5dont_atexit not to install atexit cleanup routine
  * RETURNS
- *           0 on success, -1 on failure
+ *  0 on success, -1 on failure
  * AUTHOR
- *        Elena Pourmal
- *                    Tuesday, September 24, 2002
+ *  Elena Pourmal
+ *  Tuesday, September 24, 2002
  * SOURCE
  */
 int_f
-nh5dont_atexit_c(void)
+h5dont_atexit_c(void)
 /******/
 {
     int ret_value = -1;
diff --git a/fortran/src/H5_ff.F90 b/fortran/src/H5_ff.F90
new file mode 100644
index 0000000..169864f
--- /dev/null
+++ b/fortran/src/H5_ff.F90
@@ -0,0 +1,462 @@
+!****h* ROBODoc/H5LIB
+!
+! NAME
+!  MODULE H5LIB
+!
+! PURPOSE
+!  This module provides fortran specific helper functions for the HDF library
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! NOTES
+!       _____ __  __ _____   ____  _____ _______       _   _ _______
+!      |_   _|  \/  |  __ \ / __ \|  __ \__   __|/\   | \ | |__   __|
+! ****   | | | \  / | |__) | |  | | |__) | | |  /  \  |  \| |  | |    ****
+! ****   | | | |\/| |  ___/| |  | |  _  /  | | / /\ \ | . ` |  | |    ****
+! ****  _| |_| |  | | |    | |__| | | \ \  | |/ ____ \| |\  |  | |    ****
+!      |_____|_|  |_|_|     \____/|_|  \_\ |_/_/    \_\_| \_|  |_|
+!
+!  If you add a new function you must add the function name to the
+!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
+!  This is needed for Windows based operating systems.
+!
+!*****
+
+#include <H5config_f.inc>
+
+MODULE H5LIB
+
+  USE, INTRINSIC :: ISO_C_BINDING, ONLY : c_ptr, C_INTPTR_T
+  USE H5GLOBAL
+  IMPLICIT NONE
+
+CONTAINS
+!****s* H5LIB/h5open_f
+!
+! NAME
+!  h5open_f
+!
+! PURPOSE
+!  Initializes HDF5 Fortran interface.
+!
+! Outputs:
+!  error - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! Removed call to h5open_c since this may cause a problem for an
+! application that uses HDF5 library outside HDF5 Fortran APIs.
+!          October 13, 2011
+! Fortran90 Interface:
+  SUBROUTINE h5open_f(error)
+    IMPLICIT NONE
+    INTEGER, INTENT(OUT) :: error
+!*****
+    INTEGER ::  error_1, error_2, error_3
+
+    INTERFACE
+       INTEGER FUNCTION h5init_types_c(p_types, f_types, i_types) &
+            BIND(C,NAME='h5init_types_c')
+         IMPORT :: HID_T
+         IMPORT :: PREDEF_TYPES_LEN, FLOATING_TYPES_LEN, INTEGER_TYPES_LEN
+         IMPLICIT NONE
+         INTEGER(HID_T), DIMENSION(PREDEF_TYPES_LEN) :: p_types
+         INTEGER(HID_T), DIMENSION(FLOATING_TYPES_LEN) :: f_types
+         INTEGER(HID_T), DIMENSION(INTEGER_TYPES_LEN) :: i_types
+       END FUNCTION h5init_types_c
+    END INTERFACE
+    INTERFACE
+       INTEGER FUNCTION h5init_flags_c(i_H5D_flags, &
+            i_H5D_size_flags,&
+            i_H5E_flags, &
+            i_H5E_hid_flags, &
+            i_H5F_flags, &
+            i_H5FD_flags, &
+            i_H5FD_hid_flags, &
+            i_H5G_flags, &
+            i_H5I_flags, &
+            i_H5L_flags, &
+            i_H5O_flags, &
+            i_H5P_flags, &
+            i_H5P_flags_int, &
+            i_H5R_flags, &
+            i_H5S_flags, &
+            i_H5S_hsize_flags, &
+            i_H5T_flags, &
+            i_H5Z_flags, &
+            i_H5generic_flags, &
+            i_H5generic_haddr_flags) &
+            BIND(C,NAME='h5init_flags_c')
+         IMPORT :: HID_T, SIZE_T, HSIZE_T, HADDR_T
+         IMPORT :: H5D_FLAGS_LEN, H5D_SIZE_FLAGS_LEN, &
+              H5E_FLAGS_LEN, H5E_HID_FLAGS_LEN, &
+              H5F_FLAGS_LEN, H5G_FLAGS_LEN, H5FD_FLAGS_LEN, &
+              H5FD_HID_FLAGS_LEN, H5I_FLAGS_LEN, H5L_FLAGS_LEN, &
+              H5O_FLAGS_LEN, H5P_FLAGS_LEN, H5P_FLAGS_INT_LEN, &
+              H5R_FLAGS_LEN, H5S_FLAGS_LEN, H5S_HSIZE_FLAGS_LEN, &
+              H5T_FLAGS_LEN, H5Z_FLAGS_LEN, H5generic_FLAGS_LEN, H5generic_haddr_FLAGS_LEN
+         IMPLICIT NONE
+         INTEGER i_H5D_flags(H5D_FLAGS_LEN)
+         INTEGER(SIZE_T) i_H5D_size_flags(H5D_SIZE_FLAGS_LEN)
+         INTEGER i_H5E_flags(H5E_FLAGS_LEN)
+         INTEGER(HID_T) i_H5E_hid_flags(H5E_HID_FLAGS_LEN)
+         INTEGER i_H5F_flags(H5F_FLAGS_LEN)
+         INTEGER i_H5G_flags(H5G_FLAGS_LEN)
+         INTEGER i_H5FD_flags(H5FD_FLAGS_LEN)
+         INTEGER(HID_T) i_H5FD_hid_flags(H5FD_HID_FLAGS_LEN)
+         INTEGER i_H5I_flags(H5I_FLAGS_LEN)
+         INTEGER i_H5L_flags(H5L_FLAGS_LEN)
+         INTEGER i_H5O_flags(H5O_FLAGS_LEN)
+         INTEGER(HID_T) i_H5P_flags(H5P_FLAGS_LEN)
+         INTEGER i_H5P_flags_int(H5P_FLAGS_INT_LEN)
+         INTEGER i_H5R_flags(H5R_FLAGS_LEN)
+         INTEGER i_H5S_flags(H5S_FLAGS_LEN)
+         INTEGER(HSIZE_T) i_H5S_hsize_flags(H5S_HSIZE_FLAGS_LEN)
+         INTEGER i_H5T_flags(H5T_FLAGS_LEN)
+         INTEGER i_H5Z_flags(H5Z_FLAGS_LEN)
+         INTEGER i_H5generic_flags(H5generic_FLAGS_LEN)
+         INTEGER(HADDR_T) i_H5generic_haddr_flags(H5generic_haddr_FLAGS_LEN)
+       END FUNCTION h5init_flags_c
+    END INTERFACE
+    INTERFACE
+       INTEGER FUNCTION h5init1_flags_c( i_H5LIB_flags ) &
+            BIND(C,NAME='h5init1_flags_c')
+         IMPORT :: H5LIB_FLAGS_LEN
+         IMPLICIT NONE
+         INTEGER i_H5LIB_flags(H5LIB_FLAGS_LEN)
+       END FUNCTION h5init1_flags_c
+    END INTERFACE
+    error_1 = h5init_types_c(predef_types, floating_types, integer_types)
+    error_2 = h5init_flags_c(H5D_flags, &
+         H5D_size_flags, &
+         H5E_flags, &
+         H5E_hid_flags, &
+         H5F_flags, &
+         H5FD_flags, &
+         H5FD_hid_flags, &
+         H5G_flags, &
+         H5I_flags, &
+         H5L_flags, &
+         H5O_flags, &
+         H5P_flags, &
+         H5P_flags_int, &
+         H5R_flags, &
+         H5S_flags, &
+         H5S_hsize_flags, &
+         H5T_flags, &
+         H5Z_flags, &
+         H5generic_flags,&
+         H5generic_haddr_flags)
+    error_3 = h5init1_flags_c(H5LIB_flags )
+    error = error_1 + error_2 + error_3
+  END SUBROUTINE h5open_f
+
+!****s* H5LIB/h5close_f
+!
+! NAME
+!  h5close_f
+!
+! PURPOSE
+!  Closes HDF5 Fortran interface.
+!
+! Outputs:
+!  error - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  August 12, 1999
+!
+! HISTORY
+!  Explicit Fortran interfaces were added for
+!  called C functions (it is needed for Windows
+!  port).  February 28, 2001
+!
+! Removed call to h5close_c since this may cause a problem for an
+! application that uses HDF5 library outside HDF5 Fortran APIs.
+!          October 13, 2011
+! Fortran90 Interface:
+  SUBROUTINE h5close_f(error)
+    IMPLICIT NONE
+    INTEGER, INTENT(OUT) :: error
+!*****
+    INTEGER :: error_1
+    INTERFACE
+       INTEGER FUNCTION h5close_types_c(p_types, P_TYPES_LEN, &
+            f_types, F_TYPES_LEN, &
+            i_types, I_TYPES_LEN ) &
+            BIND(C,NAME='h5close_types_c')
+         IMPORT :: HID_T
+         INTEGER P_TYPES_LEN
+         INTEGER F_TYPES_LEN
+         INTEGER I_TYPES_LEN
+         INTEGER(HID_T), DIMENSION(P_TYPES_LEN) :: p_types
+         INTEGER(HID_T), DIMENSION(F_TYPES_LEN) :: f_types
+         INTEGER(HID_T), DIMENSION(I_TYPES_LEN) :: i_types
+       END FUNCTION h5close_types_c
+    END INTERFACE
+    error_1 = h5close_types_c(predef_types, PREDEF_TYPES_LEN, &
+         floating_types, FLOATING_TYPES_LEN, &
+         integer_types, INTEGER_TYPES_LEN )
+    error = error_1
+
+  END SUBROUTINE h5close_f
+
+!****s* H5LIB/h5get_libversion_f
+!
+! NAME
+!  h5get_libversion_f
+!
+! PURPOSE
+!  Returns the HDF5 LIbrary release number
+!
+! Outputs:
+!  majnum - major version of the library
+!  minum  - minor version of the library
+!  relnum - release version of the library
+!  error  - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  September 24, 2002
+!
+! Fortran90 Interface:
+  SUBROUTINE h5get_libversion_f(majnum, minnum, relnum, error)
+    IMPLICIT NONE
+    INTEGER, INTENT(OUT) :: majnum, minnum, relnum, error
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5get_libversion_c(majnum, minnum, relnum) &
+            BIND(C,NAME='h5get_libversion_c')
+         IMPLICIT NONE
+         INTEGER, INTENT(OUT) :: majnum, minnum, relnum
+       END FUNCTION h5get_libversion_c
+    END INTERFACE
+
+    error = h5get_libversion_c(majnum, minnum, relnum)
+
+  END SUBROUTINE h5get_libversion_f
+
+!****s* H5LIB/h5check_version_f
+!
+! NAME
+!  h5check_version_f
+!
+! PURPOSE
+!  Verifies that library versions are consistent.
+!
+! Inputs:
+!  majnum - major version of the library
+!  minum  - minor version of the library
+!  relnum - release version of the library
+!
+! Outputs:
+!  error - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  September 24, 2002
+!
+! Fortran90 Interface:
+  SUBROUTINE h5check_version_f(majnum, minnum, relnum, error)
+    IMPLICIT NONE
+    INTEGER, INTENT(IN)  :: majnum, minnum, relnum
+    INTEGER, INTENT(OUT) :: error
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5check_version_c(majnum, minnum, relnum) &
+            BIND(C,NAME='h5check_version_c')
+         IMPLICIT NONE
+         INTEGER, INTENT(IN) :: majnum, minnum, relnum
+       END FUNCTION h5check_version_c
+    END INTERFACE
+
+    error = h5check_version_c(majnum, minnum, relnum)
+
+  END SUBROUTINE h5check_version_f
+!****s* H5LIB/h5garbage_collect_f
+!
+! NAME
+!  h5garbage_collect_f
+!
+! PURPOSE
+!  Garbage collects on all free-lists of all types.
+!
+! Outputs:
+!  error - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  September 24, 2002
+!
+! Fortran90 Interface:
+  SUBROUTINE h5garbage_collect_f(error)
+    IMPLICIT NONE
+    INTEGER, INTENT(OUT) :: error
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5garbage_collect_c() &
+            BIND(C,NAME='h5garbage_collect_c')
+       END FUNCTION h5garbage_collect_c
+    END INTERFACE
+
+    error = h5garbage_collect_c()
+
+  END SUBROUTINE h5garbage_collect_f
+!****s* H5LIB/h5dont_atexit_f
+!
+! NAME
+!  h5dont_atexit_f
+!
+! PURPOSE
+!  Instructs library not to install atexit cleanup routine.
+!
+! Outputs:
+!  error - Returns 0 if successful and -1 if fails
+!
+! AUTHOR
+!  Elena Pourmal
+!  September 24, 2002
+!
+! Fortran90 Interface:
+  SUBROUTINE h5dont_atexit_f(error)
+    IMPLICIT NONE
+    INTEGER, INTENT(OUT) :: error
+!*****
+    INTERFACE
+       INTEGER FUNCTION h5dont_atexit_c() &
+            BIND(C,NAME='h5dont_atexit_c')
+       END FUNCTION h5dont_atexit_c
+    END INTERFACE
+
+    error = h5dont_atexit_c()
+
+  END SUBROUTINE h5dont_atexit_f
+
+!****f* H5LIB/h5kind_to_type
+!
+! NAME
+!  h5kind_to_type
+!
+! PURPOSE
+!  Converts the KIND to the correct HDF type
+!
+! Inputs:
+!  kind    - Fortran KIND parameter
+!  flag    - Whether KIND is of type INTEGER or REAL:
+!              H5_INTEGER_KIND - integer
+!              H5_REAL_KIND    - real
+! Outputs:
+!  h5_type - Returns the type
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  August 25, 2008
+!
+! Fortran90 Interface:
+  INTEGER(HID_T) FUNCTION h5kind_to_type(ikind, flag) RESULT(h5_type)
+    USE ISO_C_BINDING
+    IMPLICIT NONE
+    INTEGER, INTENT(IN) :: ikind
+    INTEGER, INTENT(IN) :: flag
+#if H5_HAVE_Fortran_INTEGER_SIZEOF_16!=0
+    INTEGER :: Fortran_INTEGER_16
+    Fortran_INTEGER_16=SELECTED_INT_KIND(36) !should map to INTEGER*16 on most modern processors
+#endif
+    
+
+!*****
+    IF(flag.EQ.H5_INTEGER_KIND)THEN
+       IF(ikind.EQ.Fortran_INTEGER_1)THEN
+          h5_type = H5T_NATIVE_INTEGER_1
+       ELSE IF(ikind.EQ.Fortran_INTEGER_2)THEN
+          h5_type = H5T_NATIVE_INTEGER_2
+       ELSE IF(ikind.EQ.Fortran_INTEGER_4)THEN
+          h5_type = H5T_NATIVE_INTEGER_4
+       ELSE IF(ikind.EQ.Fortran_INTEGER_8)THEN
+          h5_type = H5T_NATIVE_INTEGER_8
+#if H5_HAVE_Fortran_INTEGER_SIZEOF_16!=0
+       ELSE IF(ikind.EQ.Fortran_INTEGER_16)THEN
+          h5_type = H5T_NATIVE_INTEGER_16
+#endif
+       ENDIF
+    ELSE IF(flag.EQ.H5_REAL_KIND)THEN
+       IF(ikind.EQ.KIND(1.0_C_FLOAT))THEN
+          h5_type = H5T_NATIVE_REAL_C_FLOAT
+       ELSE IF(ikind.EQ.KIND(1.0_C_DOUBLE))THEN
+          h5_type = H5T_NATIVE_REAL_C_DOUBLE
+#if H5_FORTRAN_C_LONG_DOUBLE_IS_UNIQUE!=0
+       ELSE IF(ikind.EQ.KIND(1.0_C_LONG_DOUBLE))THEN
+          h5_type = H5T_NATIVE_REAL_C_LONG_DOUBLE
+#endif
+#if H5_PAC_FC_MAX_REAL_PRECISION > 28 
+#if H5_HAVE_FLOAT128 == 1
+       ELSE
+          h5_type = H5T_NATIVE_FLOAT_128
+#endif
+#else
+       ELSE
+          h5_type = -1
+#endif
+       ENDIF
+    ENDIF
+
+  END FUNCTION h5kind_to_type
+
+!****f* H5LIB_PROVISIONAL/h5offsetof
+!
+! NAME
+!  h5offsetof
+!
+! PURPOSE
+!  Computes the offset in memory
+!
+! Inputs:
+!  start - starting pointer address
+!  end 	 - ending pointer address
+!
+! Outputs:
+!  offset - offset of a member within the derived type
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!  Augest 25, 2008
+!
+! ACKNOWLEDGEMENTS
+!  Joe Krahn
+!
+! Fortran2003 Interface:
+  FUNCTION h5offsetof(start,end) RESULT(offset)
+    IMPLICIT NONE
+    INTEGER(SIZE_T) :: offset
+    TYPE(C_PTR), VALUE, INTENT(IN) :: start, end
+!*****
+    INTEGER(C_INTPTR_T) :: int_address_start, int_address_end
+    int_address_start = TRANSFER(start, int_address_start)
+    int_address_end   = TRANSFER(end  , int_address_end  )
+
+    offset = int_address_end - int_address_start
+
+  END FUNCTION h5offsetof
+
+END MODULE H5LIB
diff --git a/fortran/src/H5_ff.f90 b/fortran/src/H5_ff.f90
deleted file mode 100644
index 1aa883e..0000000
--- a/fortran/src/H5_ff.f90
+++ /dev/null
@@ -1,409 +0,0 @@
-!****h* ROBODoc/H5LIB
-!
-! NAME
-!  MODULE H5LIB
-!
-! PURPOSE
-!  This module provides fortran specific helper functions for the HDF library
-!
-! USES
-!  H5LIB_PROVISIONAL - This module provides helper functions for Fortran 2003
-!                      only features. If Fortran 2003 functions are enabled then
-!                      H5_ff_F03.f90 is compiled, else H5_ff_F90.f90,
-!                      which is just a place holder blank module, is compiled.
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!
-!*****
-
-MODULE H5LIB
-
-  USE H5LIB_PROVISIONAL  ! helper functions for Fortran 2003 features:
-                         !       pre-Fortran 2003 - empty module
-                         !       Forttran 2003    - contains functions
-  USE H5GLOBAL
-
-CONTAINS
-!****s* H5LIB/h5open_f
-!
-! NAME
-!  h5open_f
-!
-! PURPOSE
-!  Initializes HDF5 Fortran interface.
-!
-! Outputs:
-!  error - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! Removed call to h5open_c since this may cause a problem for an
-! application that uses HDF5 library outside HDF5 Fortran APIs.
-!          October 13, 2011
-! Fortran90 Interface:
-  SUBROUTINE h5open_f(error)
-    USE H5GLOBAL
-    IMPLICIT NONE
-    INTEGER, INTENT(OUT) :: error
-!*****
-    INTEGER :: error_1, error_2, error_3
-
-    INTERFACE
-       INTEGER FUNCTION h5init_types_c(p_types, f_types, i_types)
-         USE H5GLOBAL
-         INTEGER(HID_T), DIMENSION(PREDEF_TYPES_LEN) :: p_types
-         INTEGER(HID_T), DIMENSION(FLOATING_TYPES_LEN) :: f_types
-         INTEGER(HID_T), DIMENSION(INTEGER_TYPES_LEN) :: i_types
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5INIT_TYPES_C'::h5init_types_c
-         !DEC$ENDIF
-       END FUNCTION h5init_types_c
-    END INTERFACE
-    INTERFACE
-       INTEGER FUNCTION h5init_flags_c(i_H5D_flags, &
-            i_H5D_size_flags,&
-            i_H5E_flags, &
-            i_H5E_hid_flags, &
-            i_H5F_flags, &
-            i_H5FD_flags, &
-            i_H5FD_hid_flags, &
-            i_H5G_flags, &
-            i_H5I_flags, &
-            i_H5L_flags, &
-            i_H5O_flags, &
-            i_H5P_flags, &
-            i_H5P_flags_int, &
-            i_H5R_flags, &
-            i_H5S_flags, &
-            i_H5S_hsize_flags, &
-            i_H5T_flags, &
-            i_H5Z_flags, &
-            i_H5generic_flags)
-         USE H5GLOBAL
-         INTEGER i_H5D_flags(H5D_FLAGS_LEN)
-         INTEGER(SIZE_T) i_H5D_size_flags(H5D_SIZE_FLAGS_LEN)
-         INTEGER i_H5E_flags(H5E_FLAGS_LEN)
-         INTEGER(HID_T) i_H5E_hid_flags(H5E_HID_FLAGS_LEN)
-         INTEGER i_H5F_flags(H5F_FLAGS_LEN)
-         INTEGER i_H5G_flags(H5G_FLAGS_LEN)
-         INTEGER i_H5FD_flags(H5FD_FLAGS_LEN)
-         INTEGER(HID_T) i_H5FD_hid_flags(H5FD_HID_FLAGS_LEN)
-         INTEGER i_H5I_flags(H5I_FLAGS_LEN)
-         INTEGER i_H5L_flags(H5L_FLAGS_LEN)
-         INTEGER i_H5O_flags(H5O_FLAGS_LEN)
-         INTEGER(HID_T) i_H5P_flags(H5P_FLAGS_LEN)
-         INTEGER i_H5P_flags_int(H5P_FLAGS_INT_LEN)
-         INTEGER i_H5R_flags(H5R_FLAGS_LEN)
-         INTEGER i_H5S_flags(H5S_FLAGS_LEN)
-         INTEGER(HSIZE_T) i_H5S_hsize_flags(H5S_HSIZE_FLAGS_LEN)
-         INTEGER i_H5T_flags(H5T_FLAGS_LEN)
-         INTEGER i_H5Z_flags(H5Z_FLAGS_LEN)
-         INTEGER i_H5generic_flags(H5generic_FLAGS_LEN)
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5INIT_FLAGS_C'::h5init_flags_c
-         !DEC$ENDIF
-       END FUNCTION h5init_flags_c
-    END INTERFACE
-    INTERFACE
-       INTEGER FUNCTION h5init1_flags_c( i_H5LIB_flags )
-         USE H5GLOBAL
-         INTEGER i_H5LIB_flags(H5LIB_FLAGS_LEN)
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5INIT1_FLAGS_C'::h5init1_flags_c
-         !DEC$ENDIF
-       END FUNCTION h5init1_flags_c
-    END INTERFACE
-    error_1 = h5init_types_c(predef_types, floating_types, integer_types)
-    error_2 = h5init_flags_c(H5D_flags, &
-         H5D_size_flags, &
-         H5E_flags, &
-         H5E_hid_flags, &
-         H5F_flags, &
-         H5FD_flags, &
-         H5FD_hid_flags, &
-         H5G_flags, &
-         H5I_flags, &
-         H5L_flags, &
-         H5O_flags, &
-         H5P_flags, &
-         H5P_flags_int, &
-         H5R_flags, &
-         H5S_flags, &
-         H5S_hsize_flags, &
-         H5T_flags, &
-         H5Z_flags, &
-         H5generic_flags)
-    error_3 = h5init1_flags_c(H5LIB_flags )
-    error = error_1 + error_2 + error_3
-  END SUBROUTINE h5open_f
-
-!****s* H5LIB/h5close_f
-!
-! NAME
-!  h5close_f
-!
-! PURPOSE
-!  Closes HDF5 Fortran interface.
-!
-! Outputs:
-!  error - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  August 12, 1999
-!
-! HISTORY
-!  Explicit Fortran interfaces were added for
-!  called C functions (it is needed for Windows
-!  port).  February 28, 2001
-!
-! Removed call to h5close_c since this may cause a problem for an
-! application that uses HDF5 library outside HDF5 Fortran APIs.
-!          October 13, 2011
-! Fortran90 Interface:
-  SUBROUTINE h5close_f(error)
-    USE H5GLOBAL
-    IMPLICIT NONE
-    INTEGER, INTENT(OUT) :: error
-!*****
-    INTEGER :: error_1
-    INTERFACE
-       INTEGER FUNCTION h5close_types_c(p_types, P_TYPES_LEN, &
-            f_types, F_TYPES_LEN, &
-            i_types, I_TYPES_LEN )
-         USE H5GLOBAL
-         INTEGER P_TYPES_LEN
-         INTEGER F_TYPES_LEN
-         INTEGER I_TYPES_LEN
-         INTEGER(HID_T), DIMENSION(P_TYPES_LEN) :: p_types
-         INTEGER(HID_T), DIMENSION(F_TYPES_LEN) :: f_types
-         INTEGER(HID_T), DIMENSION(I_TYPES_LEN) :: i_types
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5CLOSE_TYPES_C'::h5close_types_c
-         !DEC$ENDIF
-       END FUNCTION h5close_types_c
-    END INTERFACE
-    error_1 = h5close_types_c(predef_types, PREDEF_TYPES_LEN, &
-         floating_types, FLOATING_TYPES_LEN, &
-         integer_types, INTEGER_TYPES_LEN )
-    error = error_1
-
-  END SUBROUTINE h5close_f
-
-!****s* H5LIB/h5get_libversion_f
-!
-! NAME
-!  h5get_libversion_f
-!
-! PURPOSE
-!  Returns the HDF5 LIbrary release number
-!
-! Outputs:
-!  majnum - major version of the library
-!  minum  - minor version of the library
-!  relnum - release version of the library
-!  error  - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  September 24, 2002
-!
-! Fortran90 Interface:
-  SUBROUTINE h5get_libversion_f(majnum, minnum, relnum, error)
-    USE H5GLOBAL
-    IMPLICIT NONE
-    INTEGER, INTENT(OUT) :: majnum, minnum, relnum, error
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5get_libversion_c(majnum, minnum, relnum)
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GET_LIBVERSION_C'::h5get_libversion_c
-         !DEC$ENDIF
-         INTEGER, INTENT(OUT) :: majnum, minnum, relnum
-       END FUNCTION h5get_libversion_c
-    END INTERFACE
-
-    error = h5get_libversion_c(majnum, minnum, relnum)
-
-  END SUBROUTINE h5get_libversion_f
-
-!****s* H5LIB/h5check_version_f
-!
-! NAME
-!  h5check_version_f
-!
-! PURPOSE
-!  Verifies that library versions are consistent.
-!
-! Inputs:
-!  majnum - major version of the library
-!  minum  - minor version of the library
-!  relnum - release version of the library
-!
-! Outputs:
-!  error - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  September 24, 2002
-!
-! Fortran90 Interface:
-  SUBROUTINE h5check_version_f(majnum, minnum, relnum, error)
-    USE H5GLOBAL
-    IMPLICIT NONE
-    INTEGER, INTENT(IN)  :: majnum, minnum, relnum
-    INTEGER, INTENT(OUT) :: error
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5check_version_c(majnum, minnum, relnum)
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5CHECK_VERSION_C'::h5check_version_c
-         !DEC$ENDIF
-         INTEGER, INTENT(IN) :: majnum, minnum, relnum
-       END FUNCTION h5check_version_c
-    END INTERFACE
-
-    error = h5check_version_c(majnum, minnum, relnum)
-
-  END SUBROUTINE h5check_version_f
-!****s* H5LIB/h5garbage_collect_f
-!
-! NAME
-!  h5garbage_collect_f
-!
-! PURPOSE
-!  Garbage collects on all free-lists of all types.
-!
-! Outputs:
-!  error - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  September 24, 2002
-!
-! Fortran90 Interface:
-  SUBROUTINE h5garbage_collect_f(error)
-    USE H5GLOBAL
-    IMPLICIT NONE
-    INTEGER, INTENT(OUT) :: error
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5garbage_collect_c()
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5GARBAGE_COLLECT_C'::h5garbage_collect_c
-         !DEC$ENDIF
-       END FUNCTION h5garbage_collect_c
-    END INTERFACE
-
-    error = h5garbage_collect_c()
-
-  END SUBROUTINE h5garbage_collect_f
-!****s* H5LIB/h5dont_atexit_f
-!
-! NAME
-!  h5dont_atexit_f
-!
-! PURPOSE
-!  Instructs library not to install atexit cleanup routine.
-!
-! Outputs:
-!  error - Returns 0 if successful and -1 if fails
-!
-! AUTHOR
-!  Elena Pourmal
-!  September 24, 2002
-!
-! Fortran90 Interface:
-  SUBROUTINE h5dont_atexit_f(error)
-    USE H5GLOBAL
-    IMPLICIT NONE
-    INTEGER, INTENT(OUT) :: error
-!*****
-    INTERFACE
-       INTEGER FUNCTION h5dont_atexit_c()
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DONT_ATEXIT_C'::h5dont_atexit_c
-         !DEC$ENDIF
-       END FUNCTION h5dont_atexit_c
-    END INTERFACE
-
-    error = h5dont_atexit_c()
-
-  END SUBROUTINE h5dont_atexit_f
-
-!****f* H5LIB/h5kind_to_type
-!
-! NAME
-!  h5kind_to_type
-!
-! PURPOSE
-!  Converts the KIND to the correct HDF type
-!
-! Inputs:
-!  kind    - Fortran KIND parameter
-!  flag    - whether KIND is of type INTEGER or REAL:
-!              H5_INTEGER_KIND - integer
-!              H5_REAL_KIND    - real
-! Outputs:
-!  h5_type - returns the type
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  August 25, 2008
-!
-! Fortran90 Interface:
-  INTEGER(HID_T) FUNCTION h5kind_to_type(kind, flag) RESULT(h5_type)
-    USE H5GLOBAL
-    IMPLICIT NONE
-    INTEGER, INTENT(IN) :: kind
-    INTEGER, INTENT(IN) :: flag
-!*****
-    IF(flag.EQ.H5_INTEGER_KIND)THEN
-       IF(kind.EQ.Fortran_INTEGER_1)THEN
-          h5_type = H5T_NATIVE_INTEGER_1
-       ELSE IF(kind.EQ.Fortran_INTEGER_2)THEN
-          h5_type = H5T_NATIVE_INTEGER_2
-       ELSE IF(kind.EQ.Fortran_INTEGER_4)THEN
-          h5_type = H5T_NATIVE_INTEGER_4
-       ELSE IF(kind.EQ.Fortran_INTEGER_8)THEN
-          h5_type = H5T_NATIVE_INTEGER_8
-       ENDIF
-    ELSE IF(flag.EQ.H5_REAL_KIND)THEN
-       IF(kind.EQ.Fortran_REAL_4)THEN
-          h5_type = H5T_NATIVE_REAL_4
-       ELSE IF(kind.EQ.Fortran_REAL_8)THEN
-          h5_type = H5T_NATIVE_REAL_8
-       ELSE IF(kind.EQ.Fortran_REAL_16)THEN
-          h5_type = H5T_NATIVE_REAL_16
-       ENDIF
-    ENDIF
-
-  END FUNCTION h5kind_to_type
-
-END MODULE H5LIB
diff --git a/fortran/src/H5_ff_F03.f90 b/fortran/src/H5_ff_F03.f90
deleted file mode 100644
index d418ed5..0000000
--- a/fortran/src/H5_ff_F03.f90
+++ /dev/null
@@ -1,75 +0,0 @@
-!****h* ROBODoc/H5LIB_PROVISIONAL
-!
-! NAME
-!  MODULE H5LIB_PROVISIONAL
-!
-! PURPOSE
-!  This file contains helper functions for Fortran 2003 features and is
-!  only compiled when Fortran 2003 features are enabled, otherwise
-!  the file H5_ff_F90.f90 is compiled.
-!
-! COPYRIGHT
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!  Copyright by The HDF Group.                                               *
-!  Copyright by the Board of Trustees of the University of Illinois.         *
-!  All rights reserved.                                                      *
-!  *
-!  This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!  terms governing use, modification, and redistribution, is contained in    *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!  of the source code distribution tree; Copyright.html can be found at the  *
-!  root level of an installed copy of the electronic HDF5 document set and   *
-!  is linked from the top-level documents page.  It can also be found at     *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!  access to either file, you may request a copy from help at hdfgroup.org.     *
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!                         *** IMPORTANT ***
-!  If you add a new function you must add the function name to the
-!  Windows dll file 'hdf5_fortrandll.def.in' in the fortran/src directory.
-!  This is needed for Windows based operating systems.
-!*****
-
-MODULE H5LIB_PROVISIONAL
-
-CONTAINS
-!****f* H5LIB_PROVISIONAL/h5offsetof
-!
-! NAME
-!  h5offsetof
-!
-! PURPOSE
-!  Computes the offset in memory
-!
-! Inputs:
-!  start - starting pointer address
-!  end 	 - ending pointer address
-!
-! Outputs:
-!  offset - offset of a member within the derived type
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!  Augest 25, 2008
-!
-! ACKNOWLEDGEMENTS
-!  Joe Krahn
-!
-! Fortran2003 Interface:
-  FUNCTION h5offsetof(start,end) RESULT(offset)
-    USE, INTRINSIC :: ISO_C_BINDING
-    USE H5GLOBAL
-    IMPLICIT NONE
-    INTEGER(SIZE_T) :: offset
-    TYPE(C_PTR), VALUE, INTENT(IN) :: start, end
-!*****
-    INTEGER(C_INTPTR_T) :: int_address_start, int_address_end
-    int_address_start = TRANSFER(start, int_address_start)
-    int_address_end   = TRANSFER(end  , int_address_end  )
-
-    offset = int_address_end - int_address_start
-
-  END FUNCTION h5offsetof
-
-END MODULE H5LIB_PROVISIONAL
diff --git a/fortran/src/H5_ff_F90.f90 b/fortran/src/H5_ff_F90.f90
deleted file mode 100644
index a5d303a..0000000
--- a/fortran/src/H5_ff_F90.f90
+++ /dev/null
@@ -1,34 +0,0 @@
-!****h* ROBODoc/H5LIB_PROVISIONAL (F90)
-!
-! NAME
-!  MODULE H5LIB_PROVISIONAL
-!
-! FILE
-!  fortran/src/H5_ff_F90.f90
-!
-! PURPOSE
-!  This file is a dummy module for when Fortran 2003 features are not enabled.
-!  It is compiled in place of H5_ff_F03.f90 and is empty.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!*****
-
-MODULE H5LIB_PROVISIONAL
-
-
-END MODULE H5LIB_PROVISIONAL
diff --git a/fortran/src/H5config_f.inc.cmake b/fortran/src/H5config_f.inc.cmake
new file mode 100644
index 0000000..f0b3472
--- /dev/null
+++ b/fortran/src/H5config_f.inc.cmake
@@ -0,0 +1,87 @@
+! fortran/src/H5config_f.inc. Generated from fortran/src/H5config_f.inc.in by configure
+
+! Define if we have parallel support
+#define H5_HAVE_PARALLEL @CMAKE_H5_HAVE_PARALLEL@
+
+#if H5_HAVE_PARALLEL==0
+#undef H5_HAVE_PARALLEL
+#endif
+
+! Define if the intrinsic function STORAGE_SIZE exists
+#define H5_FORTRAN_HAVE_STORAGE_SIZE @FORTRAN_HAVE_STORAGE_SIZE@
+
+#if H5_FORTRAN_HAVE_STORAGE_SIZE==0
+#undef H5_FORTRAN_HAVE_STORAGE_SIZE
+#endif
+
+! Define if the intrinsic function SIZEOF exists
+#define H5_FORTRAN_HAVE_SIZEOF @FORTRAN_HAVE_SIZEOF@
+
+#if H5_FORTRAN_HAVE_SIZEOF==0
+#undef H5_FORTRAN_HAVE_SIZEOF
+#endif
+
+! Define if the intrinsic function C_SIZEOF exists
+#define H5_FORTRAN_HAVE_C_SIZEOF @FORTRAN_HAVE_C_SIZEOF@
+
+#if H5_FORTRAN_HAVE_C_SIZEOF==0
+#undef H5_FORTRAN_HAVE_C_SIZEOF
+#endif
+
+! Define if the intrinsic C_LONG_DOUBLE exists
+#define H5_FORTRAN_HAVE_C_LONG_DOUBLE @FORTRAN_HAVE_C_LONG_DOUBLE@
+
+#if H5_FORTRAN_HAVE_C_LONG_DOUBLE==0
+#undef H5_FORTRAN_HAVE_C_LONG_DOUBLE
+#endif
+
+! Define if Fortran C_LONG_DOUBLE is different from C_DOUBLE
+#define H5_FORTRAN_C_LONG_DOUBLE_IS_UNIQUE @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+
+! Define if the intrinsic module ISO_FORTRAN_ENV exists
+#define H5_HAVE_ISO_FORTRAN_ENV @HAVE_ISO_FORTRAN_ENV@
+
+
+! should this be ${HDF_PREFIX} instead of H5 MSB
+#define H5_SIZEOF_DOUBLE @H5_SIZEOF_DOUBLE@
+
+#if H5_SIZEOF_DOUBLE==0
+#undef H5_SIZEOF_DOUBLE
+#endif
+
+! should this be ${HDF_PREFIX} instead of H5 MSB
+#define H5_SIZEOF_LONG_DOUBLE @H5_SIZEOF_LONG_DOUBLE@
+
+#if H5_SIZEOF_LONG_DOUBLE==0
+#undef H5_SIZEOF_LONG_DOUBLE
+#endif
+
+! Define the maximum decimal precision for reals
+#define H5_PAC_FC_MAX_REAL_PRECISION @H5_PAC_FC_MAX_REAL_PRECISION@
+
+! If C has quad precision
+#define H5_HAVE_FLOAT128 @H5_HAVE_FLOAT128@
+
+! Define if INTEGER*16 is available 
+#define H5_HAVE_Fortran_INTEGER_SIZEOF_16 @HAVE_Fortran_INTEGER_SIZEOF_16@
+
+! Maximum decimal precision for C
+#define H5_PAC_C_MAX_REAL_PRECISION @H5_PAC_C_MAX_REAL_PRECISION@
+
+! number of valid REAL KINDs
+#define H5_H5CONFIG_F_NUM_RKIND @H5CONFIG_F_NUM_RKIND@
+
+! valid REAL KINDs (need to have a matching C counter-part)
+#define H5_H5CONFIG_F_RKIND @H5CONFIG_F_RKIND@
+
+! valid REAL KINDs (need to have a matching C counter-part)
+#define H5_H5CONFIG_F_RKIND_SIZEOF @H5CONFIG_F_RKIND_SIZEOF@
+
+! number of valid INTEGER KINDs
+#define H5_H5CONFIG_F_NUM_IKIND @H5CONFIG_F_NUM_IKIND@
+
+! valid INTEGER KINDs (need to have a matching C counter-part)
+#define H5_H5CONFIG_F_IKIND @H5CONFIG_F_IKIND@
+
+! Fortran compiler id
+#define H5_Fortran_COMPILER_ID @Fortran_COMPILER_ID@
diff --git a/fortran/src/H5config_f.inc.in b/fortran/src/H5config_f.inc.in
new file mode 100644
index 0000000..9f094d2
--- /dev/null
+++ b/fortran/src/H5config_f.inc.in
@@ -0,0 +1,62 @@
+! fortran/src/H5config_f.inc. Generated from fortran/src/H5config_f.inc.in by configure
+
+! The script to replace the defines in H5config_f.inc.in is
+! located in configure.ac in the Fortran section. 
+
+! Define if we have parallel support
+#undef HAVE_PARALLEL
+
+! Define if the intrinsic function STORAGE_SIZE exists
+#undef FORTRAN_HAVE_STORAGE_SIZE
+
+! Define if the intrinsic function SIZEOF exists
+#undef FORTRAN_HAVE_SIZEOF
+
+! Define if the intrinsic function C_SIZEOF exists
+#undef FORTRAN_HAVE_C_SIZEOF
+
+! Define if the intrinsic function C_LONG_DOUBLE exists
+#undef FORTRAN_HAVE_C_LONG_DOUBLE
+
+! Define if Fortran C_LONG_DOUBLE is different from C_DOUBLE
+#undef FORTRAN_C_LONG_DOUBLE_IS_UNIQUE
+
+! Define if the intrinsic module ISO_FORTRAN_ENV exists
+#undef HAVE_ISO_FORTRAN_ENV
+
+! Define the size of C's long double
+#undef SIZEOF_DOUBLE
+
+! Define the size of C's long double
+#undef SIZEOF_LONG_DOUBLE
+
+! Define the maximum decimal precision for reals
+#undef PAC_FC_MAX_REAL_PRECISION
+
+! If C has quad precision
+#undef HAVE_FLOAT128
+
+! Define if INTEGER*16 is available 
+#undef HAVE_Fortran_INTEGER_SIZEOF_16
+
+! Maximum decimal precision for C
+#undef PAC_C_MAX_REAL_PRECISION
+
+! number of valid REAL KINDs
+#undef H5CONFIG_F_NUM_RKIND
+
+! valid REAL KINDs (need to have a matching C counter-part)
+#undef H5CONFIG_F_RKIND
+
+! valid REAL KINDs (need to have a matching C counter-part)
+#undef H5CONFIG_F_RKIND_SIZEOF
+
+! number of valid INTEGER KINDs
+#undef H5CONFIG_F_NUM_IKIND
+
+! valid INTEGER KINDs (need to have a matching C counter-part)
+#undef H5CONFIG_F_IKIND
+
+! Fortran compiler name
+#undef Fortran_COMPILER_ID
+
diff --git a/fortran/src/H5f90global.F90 b/fortran/src/H5f90global.F90
new file mode 100644
index 0000000..947eff4
--- /dev/null
+++ b/fortran/src/H5f90global.F90
@@ -0,0 +1,1052 @@
+!****h* ROBODoc/H5GLOBAL
+!
+! NAME
+!  MODULE H5GLOBAL
+!
+! FILE
+!  src/fortran/H5f90global.f90
+!
+! PURPOSE
+!  This module is used to pass C stubs for H5 Fortran APIs. The C stubs are
+!  packed into arrays in H5_f.c and these arrays are then passed to Fortran.
+!  This module then uses EQUIVALENCE to assign elements of the arrays to
+!  Fortran equivalent C stubs.
+!
+! NOTES
+!  The size of the C arrays in H5_f.c has to match the values of the variables
+!  declared as PARAMETER, hence if the size of an array in H5_f.c is changed
+!  then the PARAMETER of that corresponding array in Fortran must also be changed.
+!
+! USES
+!  H5FORTRAN_TYPES 	 - This module is generated at run time. See
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! AUTHOR
+!  Elena Pourmal
+!
+!*****
+
+MODULE H5GLOBAL
+  USE H5FORTRAN_TYPES
+
+  IMPLICIT NONE
+
+  ! Definitions for reference datatypes.
+  ! If you change the value of these parameters, do not forget to change corresponding
+  ! values in the H5f90.h file.
+  INTEGER, PARAMETER :: REF_REG_BUF_LEN = 3
+
+  ! Parameters used in the function 'h5kind_to_type' located in H5_ff.f90.
+  ! The flag is used to tell the function whether the kind input variable
+  ! is for a REAL or INTEGER data type.
+
+  INTEGER, PARAMETER :: H5_REAL_KIND = 1
+  INTEGER, PARAMETER :: H5_INTEGER_KIND = 0
+
+  TYPE :: hobj_ref_t_f
+     INTEGER(HADDR_T) ref
+  END TYPE hobj_ref_t_f
+
+  TYPE :: hdset_reg_ref_t_f
+     INTEGER, DIMENSION(1:REF_REG_BUF_LEN) :: ref
+  END TYPE hdset_reg_ref_t_f
+
+  INTEGER, PARAMETER :: PREDEF_TYPES_LEN = 19 ! Do not forget to change this
+                                              ! value when new predefined
+                                              ! datatypes are added
+
+  ! Do not forget to change the following line when new predefined
+  ! floating data types are added
+  INTEGER, PARAMETER :: FLOATING_TYPES_LEN = 4
+
+  ! Do not forget to change the following line when new predefined
+  ! integer data types are added
+  INTEGER, PARAMETER :: INTEGER_TYPES_LEN = 27
+
+  INTEGER(HID_T) :: H5T_NATIVE_INTEGER_1, &
+       H5T_NATIVE_INTEGER_2, &
+       H5T_NATIVE_INTEGER_4, &
+       H5T_NATIVE_INTEGER_8, &
+       H5T_NATIVE_REAL_C_FLOAT, &
+       H5T_NATIVE_REAL_C_DOUBLE, &
+       H5T_NATIVE_REAL_C_LONG_DOUBLE, &
+       H5T_NATIVE_INTEGER, &
+       H5T_NATIVE_REAL, &
+       H5T_NATIVE_DOUBLE, &
+       H5T_NATIVE_CHARACTER , &
+       H5T_STD_REF_OBJ,      &
+       H5T_STD_REF_DSETREG, &
+       H5T_IEEE_F32BE,  &
+       H5T_IEEE_F32LE,  &
+       H5T_IEEE_F64BE,  &
+       H5T_IEEE_F64LE,  &
+       H5T_STD_I8BE,    &
+       H5T_STD_I8LE,    &
+       H5T_STD_I16BE,   &
+       H5T_STD_I16LE,   &
+       H5T_STD_I32BE,   &
+       H5T_STD_I32LE,   &
+       H5T_STD_I64BE,   &
+       H5T_STD_I64LE,   &
+       H5T_STD_U8BE,    &
+       H5T_STD_U8LE,    &
+       H5T_STD_U16BE,   &
+       H5T_STD_U16LE,   &
+       H5T_STD_U32BE
+       
+  INTEGER(HID_T) :: H5T_NATIVE_INTEGER_16 ! NEED IFDEF -MSB-
+  INTEGER(HID_T) :: H5T_NATIVE_FLOAT_128 ! NEED IFDEF -MSB-
+
+! NOTE: Splitting the line since the Fortran 95 standard limits the number of 
+!       continuation lines to 39; the F03/F08 standard limits the number 
+!       to 255 lines.
+
+  INTEGER(HID_T) :: H5T_STD_U32LE,   &
+       H5T_STD_U64BE,   &
+       H5T_STD_U64LE,   &
+       H5T_STRING,      &
+       H5T_STD_B8BE,    &
+       H5T_STD_B8LE,    &
+       H5T_STD_B16BE,   &
+       H5T_STD_B16LE,   &
+       H5T_STD_B32BE,   &
+       H5T_STD_B32LE,   &
+       H5T_STD_B64BE,   &
+       H5T_STD_B64LE,   &
+       H5T_NATIVE_B8,   &
+       H5T_NATIVE_B16,  &
+       H5T_NATIVE_B32,  &
+       H5T_NATIVE_B64,  &
+       H5T_FORTRAN_S1,  &
+       H5T_C_S1
+
+
+  INTEGER(HID_T), DIMENSION(PREDEF_TYPES_LEN) :: predef_types
+  EQUIVALENCE (predef_types(1), H5T_NATIVE_INTEGER)
+  EQUIVALENCE (predef_types(2), H5T_NATIVE_REAL)
+  EQUIVALENCE (predef_types(3), H5T_NATIVE_DOUBLE)
+  EQUIVALENCE (predef_types(4), H5T_NATIVE_CHARACTER)
+  EQUIVALENCE (predef_types(5), H5T_STD_REF_OBJ)
+  EQUIVALENCE (predef_types(6), H5T_STD_REF_DSETREG)
+  EQUIVALENCE (predef_types(7), H5T_NATIVE_INTEGER_1)
+  EQUIVALENCE (predef_types(8), H5T_NATIVE_INTEGER_2)
+  EQUIVALENCE (predef_types(9), H5T_NATIVE_INTEGER_4)
+  EQUIVALENCE (predef_types(10), H5T_NATIVE_INTEGER_8)
+  EQUIVALENCE (predef_types(11), H5T_NATIVE_REAL_C_FLOAT)
+  EQUIVALENCE (predef_types(12), H5T_NATIVE_REAL_C_DOUBLE)
+  EQUIVALENCE (predef_types(13), H5T_NATIVE_REAL_C_LONG_DOUBLE)
+  EQUIVALENCE (predef_types(14), H5T_NATIVE_B8 )
+  EQUIVALENCE (predef_types(15), H5T_NATIVE_B16)
+  EQUIVALENCE (predef_types(16), H5T_NATIVE_B32)
+  EQUIVALENCE (predef_types(17), H5T_NATIVE_B64)  
+  EQUIVALENCE (predef_types(18), H5T_NATIVE_INTEGER_16)   ! ADDED NEW TYPE -MSB- 
+  EQUIVALENCE (predef_types(19), H5T_NATIVE_FLOAT_128)   ! ADDED NEW TYPE -MSB-
+
+  INTEGER(HID_T), DIMENSION(FLOATING_TYPES_LEN) :: floating_types
+  EQUIVALENCE (floating_types(1), H5T_IEEE_F32BE )
+  EQUIVALENCE (floating_types(2), H5T_IEEE_F32LE)
+  EQUIVALENCE (floating_types(3), H5T_IEEE_F64BE)
+  EQUIVALENCE (floating_types(4), H5T_IEEE_F64LE)
+
+  INTEGER(HID_T), DIMENSION(INTEGER_TYPES_LEN) :: integer_types
+  EQUIVALENCE (integer_types(1), H5T_STD_I8BE )
+  EQUIVALENCE (integer_types(2), H5T_STD_I8LE)
+  EQUIVALENCE (integer_types(3), H5T_STD_I16BE)
+  EQUIVALENCE (integer_types(4), H5T_STD_I16LE)
+  EQUIVALENCE (integer_types(5), H5T_STD_I32BE)
+  EQUIVALENCE (integer_types(6), H5T_STD_I32LE)
+  EQUIVALENCE (integer_types(7), H5T_STD_I64BE)
+  EQUIVALENCE (integer_types(8), H5T_STD_I64LE)
+  EQUIVALENCE (integer_types(9), H5T_STD_U8BE)
+  EQUIVALENCE (integer_types(10), H5T_STD_U8LE)
+  EQUIVALENCE (integer_types(11), H5T_STD_U16BE)
+  EQUIVALENCE (integer_types(12), H5T_STD_U16LE)
+  EQUIVALENCE (integer_types(13), H5T_STD_U32BE)
+  EQUIVALENCE (integer_types(14), H5T_STD_U32LE)
+  EQUIVALENCE (integer_types(15), H5T_STD_U64BE)
+  EQUIVALENCE (integer_types(16), H5T_STD_U64LE)
+  EQUIVALENCE (integer_types(17), H5T_STRING)
+  EQUIVALENCE (integer_types(18), H5T_STD_B8BE)
+  EQUIVALENCE (integer_types(19), H5T_STD_B8LE)
+  EQUIVALENCE (integer_types(20), H5T_STD_B16BE)
+  EQUIVALENCE (integer_types(21), H5T_STD_B16LE)
+  EQUIVALENCE (integer_types(22), H5T_STD_B32BE)
+  EQUIVALENCE (integer_types(23), H5T_STD_B32LE)
+  EQUIVALENCE (integer_types(24), H5T_STD_B64BE)
+  EQUIVALENCE (integer_types(25), H5T_STD_B64LE)
+  EQUIVALENCE (integer_types(26), H5T_FORTRAN_S1)
+  EQUIVALENCE (integer_types(27), H5T_C_S1)
+
+
+  !      COMMON /PREDEFINED_TYPES/ H5T_NATIVE_INTEGER, &
+  !                                H5T_NATIVE_REAL, &
+  !                                H5T_NATIVE_DOUBLE, &
+  !                                H5T_NATIVE_CHARACTER, &
+  !                                H5T_STD_REF_OBJ, &
+  !                                H5T_STD_REF_DSETREG
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /PREDEFINED_TYPES/
+  !DEC$endif
+  COMMON /PREDEFINED_TYPES/  predef_types
+
+  !      COMMON /FLOATING_TYPES/ H5T_IEEE_F32BE,  &
+  !                              H5T_IEEE_F32LE,  &
+  !                              H5T_IEEE_F64BE,  &
+  !                              H5T_IEEE_F64LE
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /FLOATING_TYPES/
+  !DEC$endif
+  COMMON /FLOATING_TYPES/ floating_types
+  !
+  !      COMMON /INTEGER_TYPES/ H5T_STD_I8BE,  &
+  !                             H5T_STD_I8LE,    &
+  !                             H5T_STD_I16BE,   &
+  !                             H5T_STD_I16LE,   &
+  !                             H5T_STD_I32BE,   &
+  !                             H5T_STD_I32LE,   &
+  !                             H5T_STD_I64BE,   &
+  !                             H5T_STD_I64LE,   &
+  !                             H5T_STD_U8BE,    &
+  !                             H5T_STD_U8LE,    &
+  !                             H5T_STD_U16BE,   &
+  !                             H5T_STD_U16LE,   &
+  !                             H5T_STD_U32BE,   &
+  !                             H5T_STD_U32LE,   &
+  !                             H5T_STD_U64BE,   &
+  !                             H5T_STD_U64LE
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /INTEGER_TYPES/
+  !DEC$endif
+  COMMON /INTEGER_TYPES/ integer_types
+  !
+  ! Fortran flags
+  !
+  !
+  ! H5F flags (DO NOT FORGET TO UPDATE WHEN NEW FLAGS ARE ADDED !)
+  !
+  ! H5F flags declaration
+  !
+  INTEGER, PARAMETER :: H5F_FLAGS_LEN = 19
+  INTEGER :: H5F_flags(H5F_FLAGS_LEN)
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5F_FLAGS/
+  !DEC$endif
+  COMMON /H5F_FLAGS/ H5F_flags
+
+  INTEGER :: H5F_ACC_RDWR_F
+  INTEGER :: H5F_ACC_RDONLY_F
+  INTEGER :: H5F_ACC_TRUNC_F
+  INTEGER :: H5F_ACC_EXCL_F
+  INTEGER :: H5F_ACC_DEBUG_F
+  INTEGER :: H5F_SCOPE_LOCAL_F
+  INTEGER :: H5F_SCOPE_GLOBAL_F
+  INTEGER :: H5F_CLOSE_DEFAULT_F
+  INTEGER :: H5F_CLOSE_WEAK_F
+  INTEGER :: H5F_CLOSE_SEMI_F
+  INTEGER :: H5F_CLOSE_STRONG_F
+  INTEGER :: H5F_OBJ_FILE_F
+  INTEGER :: H5F_OBJ_DATASET_F
+  INTEGER :: H5F_OBJ_GROUP_F
+  INTEGER :: H5F_OBJ_DATATYPE_F
+  INTEGER :: H5F_OBJ_ALL_F
+  INTEGER :: H5F_LIBVER_EARLIEST_F
+  INTEGER :: H5F_LIBVER_LATEST_F
+  INTEGER :: H5F_UNLIMITED_F
+
+  EQUIVALENCE(H5F_flags(1), H5F_ACC_RDWR_F)
+  EQUIVALENCE(H5F_flags(2), H5F_ACC_RDONLY_F)
+  EQUIVALENCE(H5F_flags(3), H5F_ACC_TRUNC_F)
+  EQUIVALENCE(H5F_flags(4), H5F_ACC_EXCL_F)
+  EQUIVALENCE(H5F_flags(5), H5F_ACC_DEBUG_F)
+  EQUIVALENCE(H5F_flags(6), H5F_SCOPE_LOCAL_F)
+  EQUIVALENCE(H5F_flags(7), H5F_SCOPE_GLOBAL_F)
+  EQUIVALENCE(H5F_flags(8), H5F_CLOSE_DEFAULT_F)
+  EQUIVALENCE(H5F_flags(9), H5F_CLOSE_WEAK_F)
+  EQUIVALENCE(H5F_flags(10), H5F_CLOSE_SEMI_F)
+  EQUIVALENCE(H5F_flags(11), H5F_CLOSE_STRONG_F)
+  EQUIVALENCE(H5F_flags(12), H5F_OBJ_FILE_F)
+  EQUIVALENCE(H5F_flags(13), H5F_OBJ_DATASET_F)
+  EQUIVALENCE(H5F_flags(14), H5F_OBJ_GROUP_F)
+  EQUIVALENCE(H5F_flags(15), H5F_OBJ_DATATYPE_F)
+  EQUIVALENCE(H5F_flags(16), H5F_OBJ_ALL_F)
+  EQUIVALENCE(H5F_flags(17), H5F_LIBVER_EARLIEST_F)
+  EQUIVALENCE(H5F_flags(18), H5F_LIBVER_LATEST_F)
+  EQUIVALENCE(H5F_flags(19), H5F_UNLIMITED_F)
+  !
+  ! H5generic flags declaration
+  !
+  INTEGER, PARAMETER :: H5generic_FLAGS_LEN = 9
+  INTEGER :: H5generic_flags(H5generic_FLAGS_LEN)
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5generic_FLAGS/
+  !DEC$endif
+  COMMON /H5generic_FLAGS/ H5generic_flags
+
+  INTEGER :: H5_INDEX_UNKNOWN_F
+  INTEGER :: H5_INDEX_NAME_F
+  INTEGER :: H5_INDEX_CRT_ORDER_F
+  INTEGER :: H5_INDEX_N_F
+  INTEGER :: H5_ITER_UNKNOWN_F
+  INTEGER :: H5_ITER_INC_F
+  INTEGER :: H5_ITER_DEC_F
+  INTEGER :: H5_ITER_NATIVE_F
+  INTEGER :: H5_ITER_N_F
+
+  EQUIVALENCE(H5generic_flags(1), H5_INDEX_UNKNOWN_F)
+  EQUIVALENCE(H5generic_flags(2), H5_INDEX_NAME_F)
+  EQUIVALENCE(H5generic_flags(3), H5_INDEX_CRT_ORDER_F)
+  EQUIVALENCE(H5generic_flags(4), H5_INDEX_N_F)
+  EQUIVALENCE(H5generic_flags(5), H5_ITER_UNKNOWN_F)
+  EQUIVALENCE(H5generic_flags(6), H5_ITER_INC_F)
+  EQUIVALENCE(H5generic_flags(7), H5_ITER_DEC_F)
+  EQUIVALENCE(H5generic_flags(8), H5_ITER_NATIVE_F)
+  EQUIVALENCE(H5generic_flags(9), H5_ITER_N_F)
+
+  INTEGER, PARAMETER :: H5generic_haddr_FLAGS_LEN = 1
+  INTEGER(HADDR_T) :: H5generic_haddr_flags(H5generic_haddr_FLAGS_LEN)
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5generic_haddr_FLAGS/
+  !DEC$endif
+  COMMON /H5generic_haddr_FLAGS/ H5generic_haddr_flags
+
+  INTEGER(HADDR_T) :: HADDR_UNDEF_F
+
+  EQUIVALENCE(H5generic_haddr_flags(1), HADDR_UNDEF_F)
+
+  !
+  ! H5G flags declaration
+  !
+  INTEGER, PARAMETER :: H5G_FLAGS_LEN = 12
+  INTEGER :: H5G_flags(H5G_FLAGS_LEN)
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5G_FLAGS/
+  !DEC$endif
+  COMMON /H5G_FLAGS/ H5G_flags
+
+  INTEGER :: H5G_UNKNOWN_F
+  INTEGER :: H5G_GROUP_F
+  INTEGER :: H5G_DATASET_F
+  INTEGER :: H5G_TYPE_F
+  INTEGER :: H5G_LINK_F
+  INTEGER :: H5G_UDLINK_F
+  INTEGER :: H5G_SAME_LOC_F
+  INTEGER :: H5G_LINK_ERROR_F
+  INTEGER :: H5G_LINK_HARD_F
+  INTEGER :: H5G_LINK_SOFT_F
+  INTEGER :: H5G_STORAGE_TYPE_UNKNOWN_F
+  INTEGER :: H5G_STORAGE_TYPE_SYMBOL_TABLE_F
+  INTEGER :: H5G_STORAGE_TYPE_COMPACT_F
+  INTEGER :: H5G_STORAGE_TYPE_DENSE_F
+
+  EQUIVALENCE(H5G_flags(1), H5G_UNKNOWN_F) ! Unknown object type
+  EQUIVALENCE(H5G_flags(2), H5G_GROUP_F)   ! Object is a group
+  EQUIVALENCE(H5G_flags(3), H5G_DATASET_F) ! Object is a dataset
+  EQUIVALENCE(H5G_flags(4), H5G_TYPE_F)    ! Object is a named data type
+  EQUIVALENCE(H5G_flags(5), H5G_SAME_LOC_F)
+  EQUIVALENCE(H5G_flags(6), H5G_LINK_ERROR_F)
+  EQUIVALENCE(H5G_flags(7), H5G_LINK_HARD_F)
+  EQUIVALENCE(H5G_flags(8), H5G_LINK_SOFT_F)
+
+  EQUIVALENCE(H5G_flags(9), H5G_STORAGE_TYPE_UNKNOWN_F )
+  EQUIVALENCE(H5G_flags(10), H5G_STORAGE_TYPE_SYMBOL_TABLE_F)
+  EQUIVALENCE(H5G_flags(11), H5G_STORAGE_TYPE_COMPACT_F)
+  EQUIVALENCE(H5G_flags(12), H5G_STORAGE_TYPE_DENSE_F)
+  !
+  ! H5D flags declaration
+  !
+
+  INTEGER, PARAMETER :: H5D_FLAGS_LEN = 25
+  INTEGER :: H5D_flags(H5D_FLAGS_LEN)
+  INTEGER, PARAMETER :: H5D_SIZE_FLAGS_LEN = 2
+  INTEGER(SIZE_T) :: H5D_size_flags(H5D_SIZE_FLAGS_LEN)
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5D_FLAGS/
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5D_SIZE_FLAGS/
+  !DEC$endif
+  COMMON /H5D_FLAGS/ H5D_flags
+  COMMON /H5D_SIZE_FLAGS/ H5D_size_flags
+
+  INTEGER :: H5D_COMPACT_F
+  INTEGER :: H5D_CONTIGUOUS_F
+  INTEGER :: H5D_CHUNKED_F
+
+  INTEGER :: H5D_ALLOC_TIME_ERROR_F
+  INTEGER :: H5D_ALLOC_TIME_DEFAULT_F
+  INTEGER :: H5D_ALLOC_TIME_EARLY_F
+  INTEGER :: H5D_ALLOC_TIME_LATE_F
+  INTEGER :: H5D_ALLOC_TIME_INCR_F
+
+  INTEGER :: H5D_SPACE_STS_ERROR_F
+  INTEGER :: H5D_SPACE_STS_NOT_ALLOCATED_F
+  INTEGER :: H5D_SPACE_STS_PART_ALLOCATED_F
+  INTEGER :: H5D_SPACE_STS_ALLOCATED_F
+
+  INTEGER :: H5D_FILL_TIME_ERROR_F
+  INTEGER :: H5D_FILL_TIME_ALLOC_F
+  INTEGER :: H5D_FILL_TIME_NEVER_F
+
+  INTEGER :: H5D_FILL_VALUE_ERROR_F
+  INTEGER :: H5D_FILL_VALUE_UNDEFINED_F
+  INTEGER :: H5D_FILL_VALUE_DEFAULT_F
+  INTEGER :: H5D_FILL_VALUE_USER_DEFINED_F
+
+! shortened "_DEFAULT" to "_DFLT" to satisfy the limit of 31
+! characters for variable names in Fortran.
+! shortened "_CONTIGUOUS" to "_CONTIG" to satisfy the limit of 31
+! characters for variable names in Fortran.
+
+  INTEGER(SIZE_T) :: H5D_CHUNK_CACHE_NSLOTS_DFLT_F
+  INTEGER(SIZE_T) :: H5D_CHUNK_CACHE_NBYTES_DFLT_F
+  INTEGER :: H5D_CHUNK_CACHE_W0_DFLT_F
+  INTEGER :: H5D_MPIO_NO_COLLECTIVE_F
+  INTEGER :: H5D_MPIO_CHUNK_INDEPENDENT_F
+  INTEGER :: H5D_MPIO_CHUNK_COLLECTIVE_F
+  INTEGER :: H5D_MPIO_CHUNK_MIXED_F
+  INTEGER :: H5D_MPIO_CONTIG_COLLECTIVE_F
+
+  EQUIVALENCE(H5D_flags(1), H5D_COMPACT_F)
+  EQUIVALENCE(H5D_flags(2), H5D_CONTIGUOUS_F)
+  EQUIVALENCE(H5D_flags(3), H5D_CHUNKED_F)
+
+  EQUIVALENCE(H5D_flags(4), H5D_ALLOC_TIME_ERROR_F)
+  EQUIVALENCE(H5D_flags(5), H5D_ALLOC_TIME_DEFAULT_F)
+  EQUIVALENCE(H5D_flags(6), H5D_ALLOC_TIME_EARLY_F)
+  EQUIVALENCE(H5D_flags(7), H5D_ALLOC_TIME_LATE_F)
+  EQUIVALENCE(H5D_flags(8), H5D_ALLOC_TIME_INCR_F)
+
+  EQUIVALENCE(H5D_flags(9), H5D_SPACE_STS_ERROR_F)
+  EQUIVALENCE(H5D_flags(10), H5D_SPACE_STS_NOT_ALLOCATED_F)
+  EQUIVALENCE(H5D_flags(11), H5D_SPACE_STS_PART_ALLOCATED_F)
+  EQUIVALENCE(H5D_flags(12), H5D_SPACE_STS_ALLOCATED_F)
+
+  EQUIVALENCE(H5D_flags(13), H5D_FILL_TIME_ERROR_F)
+  EQUIVALENCE(H5D_flags(14), H5D_FILL_TIME_ALLOC_F)
+  EQUIVALENCE(H5D_flags(15), H5D_FILL_TIME_NEVER_F)
+
+  EQUIVALENCE(H5D_flags(16), H5D_FILL_VALUE_ERROR_F)
+  EQUIVALENCE(H5D_flags(17), H5D_FILL_VALUE_UNDEFINED_F)
+  EQUIVALENCE(H5D_flags(18), H5D_FILL_VALUE_DEFAULT_F)
+  EQUIVALENCE(H5D_flags(19), H5D_FILL_VALUE_USER_DEFINED_F)
+
+  EQUIVALENCE(H5D_flags(20), H5D_CHUNK_CACHE_W0_DFLT_F)
+  EQUIVALENCE(H5D_flags(21), H5D_MPIO_NO_COLLECTIVE_F)
+  EQUIVALENCE(H5D_flags(22), H5D_MPIO_CHUNK_INDEPENDENT_F)
+  EQUIVALENCE(H5D_flags(23), H5D_MPIO_CHUNK_COLLECTIVE_F)
+  EQUIVALENCE(H5D_flags(24), H5D_MPIO_CHUNK_MIXED_F)
+  EQUIVALENCE(H5D_flags(25), H5D_MPIO_CONTIG_COLLECTIVE_F)
+
+  EQUIVALENCE(H5D_size_flags(1), H5D_CHUNK_CACHE_NSLOTS_DFLT_F)
+  EQUIVALENCE(H5D_size_flags(2), H5D_CHUNK_CACHE_NBYTES_DFLT_F)
+
+  !
+  ! H5E flags declaration
+  !
+  INTEGER, PARAMETER :: H5E_FLAGS_LEN = 4
+  INTEGER :: H5E_flags(H5E_FLAGS_LEN)
+  INTEGER, PARAMETER :: H5E_HID_FLAGS_LEN = 1
+  INTEGER(HID_T) :: H5E_hid_flags(H5E_HID_FLAGS_LEN)
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5E_FLAGS/
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5E_HID_FLAGS/
+  !DEC$endif
+  COMMON /H5E_FLAGS/ H5E_flags
+  COMMON /H5E_HID_FLAGS/ H5E_hid_flags
+
+  INTEGER(HID_T) :: H5E_DEFAULT_F
+  INTEGER :: H5E_MAJOR_F
+  INTEGER :: H5E_MINOR_F
+  INTEGER :: H5E_WALK_UPWARD_F
+  INTEGER :: H5E_WALK_DOWNWARD_F
+
+  EQUIVALENCE(H5E_hid_flags(1), H5E_DEFAULT_F)
+  EQUIVALENCE(H5E_flags(1)    , H5E_MAJOR_F)
+  EQUIVALENCE(H5E_flags(2)    , H5E_MINOR_F)
+  EQUIVALENCE(H5E_flags(3)    , H5E_WALK_UPWARD_F)
+  EQUIVALENCE(H5E_flags(4)    , H5E_WALK_DOWNWARD_F)
+
+  !
+  ! H5FD flags declaration
+  !
+  INTEGER, PARAMETER :: H5FD_FLAGS_LEN = 11
+  INTEGER :: H5FD_flags(H5FD_FLAGS_LEN)
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5FD_FLAGS/
+  !DEC$endif
+  COMMON /H5FD_FLAGS/ H5FD_flags
+
+  INTEGER :: H5FD_MPIO_INDEPENDENT_F
+  INTEGER :: H5FD_MPIO_COLLECTIVE_F
+  INTEGER :: H5FD_MEM_NOLIST_F
+  INTEGER :: H5FD_MEM_DEFAULT_F
+  INTEGER :: H5FD_MEM_SUPER_F
+  INTEGER :: H5FD_MEM_BTREE_F
+  INTEGER :: H5FD_MEM_DRAW_F
+  INTEGER :: H5FD_MEM_GHEAP_F
+  INTEGER :: H5FD_MEM_LHEAP_F
+  INTEGER :: H5FD_MEM_OHDR_F
+  INTEGER :: H5FD_MEM_NTYPES_F
+
+  EQUIVALENCE(H5FD_flags(1), H5FD_MPIO_INDEPENDENT_F)
+  EQUIVALENCE(H5FD_flags(2), H5FD_MPIO_COLLECTIVE_F)
+  EQUIVALENCE(H5FD_flags(3), H5FD_MEM_NOLIST_F)
+  EQUIVALENCE(H5FD_flags(4), H5FD_MEM_DEFAULT_F)
+  EQUIVALENCE(H5FD_flags(5), H5FD_MEM_SUPER_F)
+  EQUIVALENCE(H5FD_flags(6), H5FD_MEM_BTREE_F)
+  EQUIVALENCE(H5FD_flags(7), H5FD_MEM_DRAW_F)
+  EQUIVALENCE(H5FD_flags(8), H5FD_MEM_GHEAP_F)
+  EQUIVALENCE(H5FD_flags(9), H5FD_MEM_LHEAP_F)
+  EQUIVALENCE(H5FD_flags(10), H5FD_MEM_OHDR_F)
+  EQUIVALENCE(H5FD_flags(11), H5FD_MEM_NTYPES_F)
+  !
+  ! H5FD file drivers flags declaration
+  !
+  INTEGER, PARAMETER :: H5FD_HID_FLAGS_LEN = 7
+  INTEGER(HID_T) :: H5FD_hid_flags(H5FD_HID_FLAGS_LEN)
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5FD_HID_FLAGS/
+  !DEC$endif
+  COMMON /H5FD_HID_FLAGS/ H5FD_hid_flags
+
+  INTEGER(HID_T) :: H5FD_CORE_F
+  INTEGER(HID_T) :: H5FD_FAMILY_F
+  INTEGER(HID_T) :: H5FD_LOG_F
+  INTEGER(HID_T) :: H5FD_MPIO_F
+  INTEGER(HID_T) :: H5FD_MULTI_F
+  INTEGER(HID_T) :: H5FD_SEC2_F
+  INTEGER(HID_T) :: H5FD_STDIO_F
+
+  EQUIVALENCE(H5FD_hid_flags(1), H5FD_CORE_F)
+  EQUIVALENCE(H5FD_hid_flags(2), H5FD_FAMILY_F)
+  EQUIVALENCE(H5FD_hid_flags(3), H5FD_LOG_F)
+  EQUIVALENCE(H5FD_hid_flags(4), H5FD_MPIO_F)
+  EQUIVALENCE(H5FD_hid_flags(5), H5FD_MULTI_F)
+  EQUIVALENCE(H5FD_hid_flags(6), H5FD_SEC2_F)
+  EQUIVALENCE(H5FD_hid_flags(7), H5FD_STDIO_F)
+
+  !
+  ! H5I flags declaration
+  !
+  INTEGER, PARAMETER :: H5I_FLAGS_LEN = 7
+  INTEGER :: H5I_flags(H5I_FLAGS_LEN)
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5I_FLAGS/
+  !DEC$endif
+  COMMON /H5I_FLAGS/ H5I_flags
+
+  INTEGER ::  H5I_FILE_F
+  INTEGER ::  H5I_GROUP_F
+  INTEGER ::  H5I_DATATYPE_F
+  INTEGER ::  H5I_DATASPACE_F
+  INTEGER ::  H5I_DATASET_F
+  INTEGER ::  H5I_ATTR_F
+  INTEGER ::  H5I_BADID_F
+
+  EQUIVALENCE(H5I_flags(1), H5I_FILE_F)
+  EQUIVALENCE(H5I_flags(2), H5I_GROUP_F)
+  EQUIVALENCE(H5I_flags(3), H5I_DATATYPE_F)
+  EQUIVALENCE(H5I_flags(4), H5I_DATASPACE_F)
+  EQUIVALENCE(H5I_flags(5), H5I_DATASET_F)
+  EQUIVALENCE(H5I_flags(6), H5I_ATTR_F)
+  EQUIVALENCE(H5I_flags(7), H5I_BADID_F)
+  !
+  ! H5L flags declaration
+  !
+  INTEGER, PARAMETER :: H5L_FLAGS_LEN = 6
+  INTEGER :: H5L_flags(H5L_FLAGS_LEN)
+
+  INTEGER :: H5L_TYPE_ERROR_F
+  INTEGER :: H5L_TYPE_HARD_F
+  INTEGER :: H5L_TYPE_SOFT_F
+  INTEGER :: H5L_TYPE_EXTERNAL_F
+  INTEGER :: H5L_SAME_LOC_F
+  INTEGER :: H5L_LINK_CLASS_T_VERS_F
+
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5L_FLAGS/
+  !DEC$endif
+  COMMON /H5L_FLAGS/ H5L_flags
+
+  EQUIVALENCE(H5L_flags(1), H5L_TYPE_ERROR_F)
+  EQUIVALENCE(H5L_flags(2), H5L_TYPE_HARD_F)
+  EQUIVALENCE(H5L_flags(3), H5L_TYPE_SOFT_F)
+  EQUIVALENCE(H5L_flags(4), H5L_TYPE_EXTERNAL_F)
+  EQUIVALENCE(H5L_flags(5), H5L_SAME_LOC_F)
+  EQUIVALENCE(H5L_flags(6), H5L_LINK_CLASS_T_VERS_F)
+  !
+  ! H5O flags declaration
+  !
+  INTEGER, PARAMETER :: H5O_FLAGS_LEN = 27
+  INTEGER :: H5o_flags(H5O_FLAGS_LEN)
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5O_FLAGS/
+  !DEC$endif
+  COMMON /H5O_FLAGS/ H5O_flags
+
+  INTEGER :: H5O_COPY_SHALLOW_HIERARCHY_F ! *** THESE VARIABLES DO
+  INTEGER :: H5O_COPY_EXPAND_SOFT_LINK_F  ! NOT MATCH THE C VARIABLE
+  INTEGER :: H5O_COPY_EXPAND_EXT_LINK_F   ! IN ORDER
+  INTEGER :: H5O_COPY_EXPAND_REFERENCE_F  ! TO STAY UNDER THE
+  INTEGER :: H5O_COPY_WITHOUT_ATTR_FLAG_F
+  INTEGER :: H5O_COPY_PRESERVE_NULL_FLAG_F
+  INTEGER :: H5O_COPY_ALL_F
+  INTEGER :: H5O_SHMESG_NONE_FLAG_F
+  INTEGER :: H5O_SHMESG_SDSPACE_FLAG_F
+  INTEGER :: H5O_SHMESG_DTYPE_FLAG_F
+  INTEGER :: H5O_SHMESG_FILL_FLAG_F
+  INTEGER :: H5O_SHMESG_PLINE_FLAG_F
+  INTEGER :: H5O_SHMESG_ATTR_FLAG_F
+  INTEGER :: H5O_SHMESG_ALL_FLAG_F
+  INTEGER :: H5O_HDR_CHUNK0_SIZE_F
+  INTEGER :: H5O_HDR_ATTR_CRT_ORDER_TRACK_F ! 32 CHARACTER
+  INTEGER :: H5O_HDR_ATTR_CRT_ORDER_INDEX_F ! VARIABLE
+  INTEGER :: H5O_HDR_ATTR_STORE_PHASE_CHA_F ! LENGTH ***
+  INTEGER :: H5O_HDR_STORE_TIMES_F
+  INTEGER :: H5O_HDR_ALL_FLAGS_F
+  INTEGER :: H5O_SHMESG_MAX_NINDEXES_F
+  INTEGER :: H5O_SHMESG_MAX_LIST_SIZE_F
+  INTEGER :: H5O_TYPE_UNKNOWN_F
+  INTEGER :: H5O_TYPE_GROUP_F
+  INTEGER :: H5O_TYPE_DATASET_F
+  INTEGER :: H5O_TYPE_NAMED_DATATYPE_F
+  INTEGER :: H5O_TYPE_NTYPES_F
+
+  EQUIVALENCE(h5o_flags(1) , H5O_COPY_SHALLOW_HIERARCHY_F)
+  EQUIVALENCE(h5o_flags(2) , H5O_COPY_EXPAND_SOFT_LINK_F)
+  EQUIVALENCE(h5o_flags(3) , H5O_COPY_EXPAND_EXT_LINK_F)
+  EQUIVALENCE(h5o_flags(4) , H5O_COPY_EXPAND_REFERENCE_F)
+  EQUIVALENCE(h5o_flags(5) , H5O_COPY_WITHOUT_ATTR_FLAG_F)
+  EQUIVALENCE(h5o_flags(6) , H5O_COPY_PRESERVE_NULL_FLAG_F)
+  EQUIVALENCE(h5o_flags(7) , H5O_COPY_ALL_F)
+  EQUIVALENCE(h5o_flags(8) , H5O_SHMESG_NONE_FLAG_F)
+  EQUIVALENCE(h5o_flags(9) , H5O_SHMESG_SDSPACE_FLAG_F)
+  EQUIVALENCE(h5o_flags(10) , H5O_SHMESG_DTYPE_FLAG_F)
+  EQUIVALENCE(h5o_flags(11) , H5O_SHMESG_FILL_FLAG_F)
+  EQUIVALENCE(h5o_flags(12) , H5O_SHMESG_PLINE_FLAG_F)
+  EQUIVALENCE(h5o_flags(13) , H5O_SHMESG_ATTR_FLAG_F)
+  EQUIVALENCE(h5o_flags(14) , H5O_SHMESG_ALL_FLAG_F)
+  EQUIVALENCE(h5o_flags(15) , H5O_HDR_CHUNK0_SIZE_F)
+  EQUIVALENCE(h5o_flags(16) , H5O_HDR_ATTR_CRT_ORDER_TRACK_F)
+  EQUIVALENCE(h5o_flags(17) , H5O_HDR_ATTR_CRT_ORDER_INDEX_F)
+  EQUIVALENCE(h5o_flags(18) , H5O_HDR_ATTR_STORE_PHASE_CHA_F)
+  EQUIVALENCE(h5o_flags(19) , H5O_HDR_STORE_TIMES_F)
+  EQUIVALENCE(h5o_flags(20) , H5O_HDR_ALL_FLAGS_F)
+  EQUIVALENCE(h5o_flags(21) , H5O_SHMESG_MAX_NINDEXES_F)
+  EQUIVALENCE(h5o_flags(22) , H5O_SHMESG_MAX_LIST_SIZE_F)
+  EQUIVALENCE(h5o_flags(23) , H5O_TYPE_UNKNOWN_F)
+  EQUIVALENCE(h5o_flags(24) , H5O_TYPE_GROUP_F)
+  EQUIVALENCE(h5o_flags(25) , H5O_TYPE_DATASET_F)
+  EQUIVALENCE(h5o_flags(26) , H5O_TYPE_NAMED_DATATYPE_F)
+  EQUIVALENCE(h5o_flags(27) , H5O_TYPE_NTYPES_F)
+
+  !
+  ! H5P flags declaration
+  !
+  INTEGER, PARAMETER :: H5P_FLAGS_LEN = 18
+  INTEGER(HID_T) H5P_flags(H5P_FLAGS_LEN)
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5P_FLAGS/
+  !DEC$endif
+  COMMON /H5P_FLAGS/ H5P_flags
+
+  INTEGER(HID_T) :: H5P_FILE_CREATE_F
+  INTEGER(HID_T) :: H5P_FILE_ACCESS_F
+  INTEGER(HID_T) :: H5P_DATASET_CREATE_F
+  INTEGER(HID_T) :: H5P_DATASET_XFER_F
+  INTEGER(HID_T) :: H5P_FILE_MOUNT_F
+  INTEGER(HID_T) :: H5P_DEFAULT_F
+  INTEGER(HID_T) :: H5P_ROOT_F
+  INTEGER(HID_T) :: H5P_OBJECT_CREATE_F
+  INTEGER(HID_T) :: H5P_DATASET_ACCESS_F
+  INTEGER(HID_T) :: H5P_GROUP_CREATE_F
+  INTEGER(HID_T) :: H5P_GROUP_ACCESS_F
+  INTEGER(HID_T) :: H5P_DATATYPE_CREATE_F
+  INTEGER(HID_T) :: H5P_DATATYPE_ACCESS_F
+  INTEGER(HID_T) :: H5P_STRING_CREATE_F
+  INTEGER(HID_T) :: H5P_ATTRIBUTE_CREATE_F
+  INTEGER(HID_T) :: H5P_OBJECT_COPY_F
+  INTEGER(HID_T) :: H5P_LINK_CREATE_F
+  INTEGER(HID_T) :: H5P_LINK_ACCESS_F
+
+  EQUIVALENCE(H5P_flags(1), H5P_FILE_CREATE_F)
+  EQUIVALENCE(H5P_flags(2), H5P_FILE_ACCESS_F)
+  EQUIVALENCE(H5P_flags(3), H5P_DATASET_CREATE_F)
+  EQUIVALENCE(H5P_flags(4), H5P_DATASET_XFER_F)
+  EQUIVALENCE(H5P_flags(5), H5P_FILE_MOUNT_F)
+  EQUIVALENCE(H5P_flags(6), H5P_DEFAULT_F)
+  EQUIVALENCE(H5P_flags(7), H5P_ROOT_F)
+  EQUIVALENCE(H5P_flags(8), H5P_OBJECT_CREATE_F)
+  EQUIVALENCE(H5P_flags(9), H5P_DATASET_ACCESS_F)
+  EQUIVALENCE(H5P_flags(10), H5P_GROUP_CREATE_F)
+  EQUIVALENCE(H5P_flags(11), H5P_GROUP_ACCESS_F)
+  EQUIVALENCE(H5P_flags(12), H5P_DATATYPE_CREATE_F)
+  EQUIVALENCE(H5P_flags(13), H5P_DATATYPE_ACCESS_F)
+  EQUIVALENCE(H5P_flags(14), H5P_STRING_CREATE_F)
+  EQUIVALENCE(H5P_flags(15), H5P_ATTRIBUTE_CREATE_F)
+  EQUIVALENCE(H5P_flags(16), H5P_OBJECT_COPY_F)
+  EQUIVALENCE(H5P_flags(17), H5P_LINK_CREATE_F)
+  EQUIVALENCE(H5P_flags(18), H5P_LINK_ACCESS_F)
+
+  !
+  ! H5P integers flags declaration
+  !
+  INTEGER, PARAMETER :: H5P_FLAGS_INT_LEN = 2
+  INTEGER :: H5P_flags_int(H5P_FLAGS_INT_LEN)
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5P_FLAGS_INT/
+  !DEC$endif
+  COMMON /H5P_FLAGS_INT/ H5P_flags_int
+  INTEGER :: H5P_CRT_ORDER_INDEXED_F
+  INTEGER :: H5P_CRT_ORDER_TRACKED_F
+  EQUIVALENCE(H5P_flags_int(1), H5P_CRT_ORDER_INDEXED_F)
+  EQUIVALENCE(H5P_flags_int(2), H5P_CRT_ORDER_TRACKED_F)
+  !
+  ! H5R flags declaration
+  !
+  INTEGER, PARAMETER :: H5R_FLAGS_LEN = 2
+  INTEGER :: H5R_flags(H5R_FLAGS_LEN)
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5R_FLAGS/
+  !DEC$endif
+  COMMON /H5R_FLAGS/ H5R_flags
+
+  INTEGER :: H5R_OBJECT_F
+  INTEGER :: H5R_DATASET_REGION_F
+
+  EQUIVALENCE(H5R_flags(1), H5R_OBJECT_F)
+  EQUIVALENCE(H5R_flags(2), H5R_DATASET_REGION_F)
+
+  !
+  ! H5S flags declaration
+  !
+  INTEGER, PARAMETER :: H5S_FLAGS_LEN = 19
+  INTEGER :: H5S_flags(H5S_FLAGS_LEN)
+  INTEGER, PARAMETER :: H5S_HSIZE_FLAGS_LEN = 1
+  INTEGER(HSIZE_T) H5S_hsize_flags(H5S_HSIZE_FLAGS_LEN)
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5S_FLAGS/
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5S_HSIZE_FLAGS/
+  !DEC$endif
+  COMMON /H5S_FLAGS/ H5S_flags
+  COMMON /H5S_HSIZE_FLAGS/ H5S_hsize_flags
+
+  INTEGER(HSIZE_T) :: H5S_UNLIMITED_F
+
+  INTEGER :: H5S_SCALAR_F
+  INTEGER :: H5S_SIMPLE_F
+  INTEGER :: H5S_NULL_F
+
+  INTEGER :: H5S_ALL_F
+
+  INTEGER :: H5S_SELECT_NOOP_F
+  INTEGER :: H5S_SELECT_SET_F
+  INTEGER :: H5S_SELECT_OR_F
+  INTEGER :: H5S_SELECT_AND_F
+  INTEGER :: H5S_SELECT_XOR_F
+  INTEGER :: H5S_SELECT_NOTB_F
+  INTEGER :: H5S_SELECT_NOTA_F
+  INTEGER :: H5S_SELECT_APPEND_F
+  INTEGER :: H5S_SELECT_PREPEND_F
+  INTEGER :: H5S_SELECT_INVALID_F
+
+  INTEGER :: H5S_SEL_ERROR_F
+  INTEGER :: H5S_SEL_NONE_F
+  INTEGER :: H5S_SEL_POINTS_F
+  INTEGER :: H5S_SEL_HYPERSLABS_F
+  INTEGER :: H5S_SEL_ALL_F
+
+  EQUIVALENCE(H5S_hsize_flags(1), H5S_UNLIMITED_F)
+  EQUIVALENCE(H5S_flags(1), H5S_SCALAR_F)
+  EQUIVALENCE(H5S_flags(2), H5S_SIMPLE_F)
+  EQUIVALENCE(H5S_flags(3), H5S_NULL_F)
+  EQUIVALENCE(H5S_flags(4), H5S_SELECT_SET_F)
+  EQUIVALENCE(H5S_flags(5), H5S_SELECT_OR_F)
+  EQUIVALENCE(H5S_flags(6), H5S_ALL_F)
+
+  EQUIVALENCE(H5S_flags(7), H5S_SELECT_NOOP_F)
+  EQUIVALENCE(H5S_flags(8), H5S_SELECT_AND_F)
+  EQUIVALENCE(H5S_flags(9), H5S_SELECT_XOR_F)
+  EQUIVALENCE(H5S_flags(10), H5S_SELECT_NOTB_F)
+  EQUIVALENCE(H5S_flags(11), H5S_SELECT_NOTA_F)
+  EQUIVALENCE(H5S_flags(12), H5S_SELECT_APPEND_F)
+  EQUIVALENCE(H5S_flags(13), H5S_SELECT_PREPEND_F)
+  EQUIVALENCE(H5S_flags(14), H5S_SELECT_INVALID_F)
+
+
+  EQUIVALENCE(H5S_flags(15), H5S_SEL_ERROR_F)
+  EQUIVALENCE(H5S_flags(16), H5S_SEL_NONE_F)
+  EQUIVALENCE(H5S_flags(17), H5S_SEL_POINTS_F)
+  EQUIVALENCE(H5S_flags(18), H5S_SEL_HYPERSLABS_F)
+  EQUIVALENCE(H5S_flags(19), H5S_SEL_ALL_F)
+
+  !
+  ! H5T flags declaration
+  !
+  INTEGER, PARAMETER :: H5T_FLAGS_LEN = 35
+  INTEGER :: H5T_flags(H5T_FLAGS_LEN)
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5T_FLAGS/
+  !DEC$endif
+  COMMON /H5T_FLAGS/ H5T_flags
+
+  INTEGER :: H5T_NO_CLASS_F
+  INTEGER :: H5T_INTEGER_F
+  INTEGER :: H5T_FLOAT_F
+  INTEGER :: H5T_TIME_F
+  INTEGER :: H5T_STRING_F
+  INTEGER :: H5T_BITFIELD_F
+  INTEGER :: H5T_OPAQUE_F
+  INTEGER :: H5T_COMPOUND_F
+  INTEGER :: H5T_REFERENCE_F
+  INTEGER :: H5T_ENUM_F
+  INTEGER :: H5T_VLEN_F
+  INTEGER :: H5T_ARRAY_F
+  INTEGER :: H5T_ORDER_LE_F
+  INTEGER :: H5T_ORDER_BE_F
+  INTEGER :: H5T_ORDER_VAX_F
+  INTEGER :: H5T_ORDER_NONE_F
+  INTEGER :: H5T_ORDER_MIXED_F
+  INTEGER :: H5T_PAD_ZERO_F
+  INTEGER :: H5T_PAD_ONE_F
+  INTEGER :: H5T_PAD_BACKGROUND_F
+  INTEGER :: H5T_PAD_ERROR_F
+  INTEGER :: H5T_SGN_NONE_F
+  INTEGER :: H5T_SGN_2_F
+  INTEGER :: H5T_SGN_ERROR_F
+  INTEGER :: H5T_NORM_IMPLIED_F
+  INTEGER :: H5T_NORM_MSBSET_F
+  INTEGER :: H5T_NORM_NONE_F
+  INTEGER :: H5T_CSET_ASCII_F
+  INTEGER :: H5T_CSET_UTF8_F
+  INTEGER :: H5T_STR_NULLTERM_F
+  INTEGER :: H5T_STR_NULLPAD_F
+  INTEGER :: H5T_STR_SPACEPAD_F
+  INTEGER :: H5T_STR_ERROR_F
+  INTEGER :: H5T_DIR_ASCEND_F
+  INTEGER :: H5T_DIR_DESCEND_F
+
+  EQUIVALENCE(H5T_flags(1), H5T_NO_CLASS_F)
+  EQUIVALENCE(H5T_flags(2), H5T_INTEGER_F)
+  EQUIVALENCE(H5T_flags(3), H5T_FLOAT_F)
+  EQUIVALENCE(H5T_flags(4), H5T_TIME_F)
+  EQUIVALENCE(H5T_flags(5), H5T_STRING_F)
+  EQUIVALENCE(H5T_flags(6), H5T_BITFIELD_F)
+  EQUIVALENCE(H5T_flags(7), H5T_OPAQUE_F)
+  EQUIVALENCE(H5T_flags(8), H5T_COMPOUND_F)
+  EQUIVALENCE(H5T_flags(9), H5T_REFERENCE_F)
+  EQUIVALENCE(H5T_flags(10), H5T_ENUM_F)
+  EQUIVALENCE(H5T_flags(11), H5T_ORDER_LE_F)
+  EQUIVALENCE(H5T_flags(12), H5T_ORDER_BE_F)
+  EQUIVALENCE(H5T_flags(13), H5T_ORDER_MIXED_F)
+  EQUIVALENCE(H5T_flags(14), H5T_ORDER_VAX_F)
+  EQUIVALENCE(H5T_flags(15), H5T_ORDER_NONE_F)
+  EQUIVALENCE(H5T_flags(16), H5T_PAD_ZERO_F)
+  EQUIVALENCE(H5T_flags(17), H5T_PAD_ONE_F)
+  EQUIVALENCE(H5T_flags(18), H5T_PAD_BACKGROUND_F)
+  EQUIVALENCE(H5T_flags(19), H5T_PAD_ERROR_F)
+  EQUIVALENCE(H5T_flags(20), H5T_SGN_NONE_F)
+  EQUIVALENCE(H5T_flags(21), H5T_SGN_2_F)
+  EQUIVALENCE(H5T_flags(22), H5T_SGN_ERROR_F)
+  EQUIVALENCE(H5T_flags(23), H5T_NORM_IMPLIED_F)
+  EQUIVALENCE(H5T_flags(24), H5T_NORM_MSBSET_F)
+  EQUIVALENCE(H5T_flags(25), H5T_NORM_NONE_F)
+  EQUIVALENCE(H5T_flags(26), H5T_CSET_ASCII_F)
+  EQUIVALENCE(H5T_flags(27), H5T_CSET_UTF8_F)
+  EQUIVALENCE(H5T_flags(28), H5T_STR_NULLTERM_F)
+  EQUIVALENCE(H5T_flags(29), H5T_STR_NULLPAD_F)
+  EQUIVALENCE(H5T_flags(30), H5T_STR_SPACEPAD_F)
+  EQUIVALENCE(H5T_flags(31), H5T_STR_ERROR_F)
+  EQUIVALENCE(H5T_flags(32), H5T_VLEN_F)
+  EQUIVALENCE(H5T_flags(33), H5T_ARRAY_F)
+  EQUIVALENCE(H5T_flags(34), H5T_DIR_ASCEND_F)
+  EQUIVALENCE(H5T_flags(35), H5T_DIR_DESCEND_F)
+  !
+  ! H5Z flags declaration
+  !
+  INTEGER, PARAMETER :: H5Z_FLAGS_LEN = 20
+  INTEGER :: H5Z_flags(H5Z_FLAGS_LEN)
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5Z_FLAGS/
+  !DEC$endif
+  COMMON /H5Z_FLAGS/ H5Z_flags
+
+  INTEGER :: H5Z_FILTER_ERROR_F
+  INTEGER :: H5Z_FILTER_NONE_F
+  INTEGER :: H5Z_FILTER_ALL_F
+  INTEGER :: H5Z_FILTER_DEFLATE_F
+  INTEGER :: H5Z_FILTER_SHUFFLE_F
+  INTEGER :: H5Z_FILTER_FLETCHER32_F
+  INTEGER :: H5Z_FILTER_SZIP_F
+  INTEGER :: H5Z_ERROR_EDC_F
+  INTEGER :: H5Z_DISABLE_EDC_F
+  INTEGER :: H5Z_ENABLE_EDC_F
+  INTEGER :: H5Z_NO_EDC_F
+  INTEGER :: H5Z_FLAG_OPTIONAL_F
+  INTEGER :: H5Z_FILTER_ENCODE_ENABLED_F
+  INTEGER :: H5Z_FILTER_DECODE_ENABLED_F
+  INTEGER :: H5Z_FILTER_NBIT_F
+  INTEGER :: H5Z_FILTER_SCALEOFFSET_F
+  INTEGER :: H5Z_SO_FLOAT_DSCALE_F
+  INTEGER :: H5Z_SO_FLOAT_ESCALE_F
+  INTEGER :: H5Z_SO_INT_F
+  INTEGER :: H5Z_SO_INT_MINBITS_DEFAULT_F
+
+  EQUIVALENCE(H5Z_flags(1), H5Z_FILTER_ERROR_F)
+  EQUIVALENCE(H5Z_flags(2), H5Z_FILTER_NONE_F)
+  EQUIVALENCE(H5Z_flags(3), H5Z_FILTER_DEFLATE_F)
+  EQUIVALENCE(H5Z_flags(4), H5Z_FILTER_SHUFFLE_F)
+  EQUIVALENCE(H5Z_flags(5), H5Z_FILTER_FLETCHER32_F)
+  EQUIVALENCE(H5Z_flags(6), H5Z_ERROR_EDC_F)
+  EQUIVALENCE(H5Z_flags(7), H5Z_DISABLE_EDC_F)
+  EQUIVALENCE(H5Z_flags(8), H5Z_ENABLE_EDC_F)
+  EQUIVALENCE(H5Z_flags(9), H5Z_NO_EDC_F)
+  EQUIVALENCE(H5Z_flags(10), H5Z_FILTER_SZIP_F)
+  EQUIVALENCE(H5Z_flags(11), H5Z_FLAG_OPTIONAL_F)
+  EQUIVALENCE(H5Z_flags(12), H5Z_FILTER_ENCODE_ENABLED_F)
+  EQUIVALENCE(H5Z_flags(13), H5Z_FILTER_DECODE_ENABLED_F)
+  EQUIVALENCE(H5Z_flags(14), H5Z_FILTER_ALL_F)
+  EQUIVALENCE(H5Z_flags(15), H5Z_FILTER_NBIT_F)
+  EQUIVALENCE(H5Z_flags(16), H5Z_FILTER_SCALEOFFSET_F)
+  EQUIVALENCE(H5Z_flags(17), H5Z_SO_FLOAT_DSCALE_F)
+  EQUIVALENCE(H5Z_flags(18), H5Z_SO_FLOAT_ESCALE_F)
+  EQUIVALENCE(H5Z_flags(19), H5Z_SO_INT_F)
+  EQUIVALENCE(H5Z_flags(20), H5Z_SO_INT_MINBITS_DEFAULT_F)
+
+  !
+  ! H5 Library flags declaration
+  !
+  INTEGER, PARAMETER :: H5LIB_FLAGS_LEN =  2
+  INTEGER :: H5LIB_flags(H5LIB_FLAGS_LEN)
+  !DEC$if defined(BUILD_HDF5_DLL)
+  !DEC$ATTRIBUTES DLLEXPORT :: /H5LIB_FLAGS/
+  !DEC$endif
+  COMMON /H5LIB_FLAGS/ H5LIB_flags
+  INTEGER :: H5_SZIP_EC_OM_F
+  INTEGER :: H5_SZIP_NN_OM_F
+  !
+  EQUIVALENCE(H5LIB_flags(1), H5_SZIP_EC_OM_F)
+  EQUIVALENCE(H5LIB_flags(2), H5_SZIP_NN_OM_F)
+
+
+  ! General H5 flags declarations
+  !
+!!$      INTEGER, PARAMETER :: H5_FLAGS_LEN = 2
+!!$      INTEGER H5_flags(H5_FLAGS_LEN)
+!!$!DEC$if defined(BUILD_HDF5_DLL)
+!!$!DEC$ATTRIBUTES DLLEXPORT :: /H5_FLAGS/
+!!$!DEC$endif
+!!$      COMMON /H5_FLAGS/ H5_flags
+!!$
+!!$      INTEGER :: _F
+!!$      INTEGER :: H5F_SCOPE_LOCAL_F
+!!$
+!!$      EQUIVALENCE(H5F_flags(1), H5F_SCOPE_GLOBAL_F)
+!!$      EQUIVALENCE(H5F_flags(2), H5F_SCOPE_LOCAL_F)
+
+CONTAINS
+
+  ! Copy a c string to a Fortran string
+
+  SUBROUTINE H5_Fortran_string_c2f(c_string, f_string)
+
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    CHARACTER(KIND=C_CHAR, LEN=*), INTENT(IN) :: c_string
+    CHARACTER(LEN=*), INTENT(OUT) :: f_string
+    INTEGER(SIZE_T) :: c_len, f_len
+
+    ! Find the length of the C string by located the null terminator
+    c_len = MAX(INDEX(c_string,C_NULL_CHAR, KIND=SIZE_T)-1,1)
+    ! Find the length of the Fortran string
+    f_len = LEN(f_string)
+
+    ! CASE (1): C string is equal to or larger then Fortran character buffer,
+    !           so fill the entire Fortran buffer. 
+    IF(c_len.GE.f_len)THEN !
+       f_string(1:f_len) = c_string(1:f_len)
+
+    ! CASE (2): C string is smaller then Fortran character buffer, 
+    !           so copy C string and blank pad remaining characters.
+    ELSE
+       f_string(1:c_len) = c_string(1:c_len)
+       f_string(c_len+1:f_len) =' '
+    ENDIF
+  END SUBROUTINE H5_Fortran_string_c2f
+
+  SUBROUTINE H5_Fortran_string_f2c(f_string, c_string)
+
+    USE, INTRINSIC :: ISO_C_BINDING
+    IMPLICIT NONE
+    CHARACTER(LEN=*), INTENT(IN) :: f_string
+    CHARACTER(KIND=C_CHAR, LEN=*), INTENT(OUT) :: c_string
+    INTEGER(SIZE_T) :: c_len, f_len
+
+    c_string = TRIM(f_string)//C_NULL_CHAR
+
+  END SUBROUTINE H5_Fortran_string_f2c
+
+
+! 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, j
+!!$    logical :: met_non_blank
+!!$
+!!$    ! Trim the leading and trailing blank characters
+!!$    j = 1
+!!$    met_non_blank = .false.
+!!$    do i = 1, len_trim(fstring)
+!!$        if (met_non_blank) then
+!!$            cstring(j) = fstring(i:i)
+!!$            j = j + 1
+!!$        else if (fstring(i:i) /= ' ') then
+!!$            met_non_blank = .true.
+!!$            cstring(j) = fstring(i:i)
+!!$            j = j + 1
+!!$        end if
+!!$    end do
+!!$
+!!$    cstring(j) = 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)
+!!$        fstring(i:i) = cstring(i)
+!!$        i = i + 1
+!!$    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
+  
+END MODULE H5GLOBAL
+
diff --git a/fortran/src/H5f90global.f90 b/fortran/src/H5f90global.f90
deleted file mode 100644
index c56190e..0000000
--- a/fortran/src/H5f90global.f90
+++ /dev/null
@@ -1,946 +0,0 @@
-!****h* ROBODoc/H5GLOBAL
-!
-! NAME
-!  MODULE H5GLOBAL
-!
-! FILE
-!  src/fortran/H5f90global.f90
-!
-! PURPOSE
-!  This module is used to pass C stubs for H5 Fortran APIs. The C stubs are
-!  packed into arrays in H5_f.c and these arrays are then passed to Fortran.
-!  This module then uses EQUIVALENCE to assign elements of the arrays to
-!  Fortran equivalent C stubs.
-!
-! NOTES
-!  The size of the C arrays in H5_f.c has to match the values of the variables
-!  declared as PARAMETER, hence if the size of an array in H5_f.c is changed
-!  then the PARAMETER of that corresponding array in Fortran must also be changed.
-!
-! USES
-!  H5FORTRAN_TYPES 	 - This module is generated at run time. See
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! AUTHOR
-!  Elena Pourmal
-!
-!*****
-
-MODULE H5GLOBAL
-  USE H5FORTRAN_TYPES
-
-  IMPLICIT NONE
-
-  ! Definitions for reference datatypes.
-  ! If you change the value of these parameters, do not forget to change corresponding
-  ! values in the H5f90.h file.
-  INTEGER, PARAMETER :: REF_REG_BUF_LEN = 3
-
-  ! Parameters used in the function 'h5kind_to_type' located in H5_ff.f90.
-  ! The flag is used to tell the function whether the kind input variable
-  ! is for a REAL or INTEGER data type.
-
-  INTEGER, PARAMETER :: H5_REAL_KIND = 1
-  INTEGER, PARAMETER :: H5_INTEGER_KIND = 0
-
-  TYPE :: hobj_ref_t_f
-     INTEGER(HADDR_T) ref
-  END TYPE hobj_ref_t_f
-
-  TYPE :: hdset_reg_ref_t_f
-     INTEGER, DIMENSION(1:REF_REG_BUF_LEN) :: ref
-  END TYPE hdset_reg_ref_t_f
-
-  INTEGER, PARAMETER :: PREDEF_TYPES_LEN = 17 ! Do not forget to change this
-                                              ! value when new predefined
-                                              ! datatypes are added
-
-  ! Do not forget to change the following line when new predefined
-  ! floating data types are added
-  INTEGER, PARAMETER :: FLOATING_TYPES_LEN = 4
-
-  ! Do not forget to change the following line when new predefined
-  ! integer data types are added
-  INTEGER, PARAMETER :: INTEGER_TYPES_LEN = 27
-
-  INTEGER(HID_T) :: H5T_NATIVE_INTEGER_1, &
-       H5T_NATIVE_INTEGER_2, &
-       H5T_NATIVE_INTEGER_4, &
-       H5T_NATIVE_INTEGER_8, &
-       H5T_NATIVE_REAL_4, &
-       H5T_NATIVE_REAL_8, &
-       H5T_NATIVE_REAL_16, &
-       H5T_NATIVE_INTEGER, &
-       H5T_NATIVE_REAL, &
-       H5T_NATIVE_DOUBLE, &
-       H5T_NATIVE_CHARACTER , &
-       H5T_STD_REF_OBJ,      &
-       H5T_STD_REF_DSETREG, &
-       H5T_IEEE_F32BE,  &
-       H5T_IEEE_F32LE,  &
-       H5T_IEEE_F64BE,  &
-       H5T_IEEE_F64LE,  &
-       H5T_STD_I8BE,    &
-       H5T_STD_I8LE,    &
-       H5T_STD_I16BE,   &
-       H5T_STD_I16LE,   &
-       H5T_STD_I32BE,   &
-       H5T_STD_I32LE,   &
-       H5T_STD_I64BE,   &
-       H5T_STD_I64LE,   &
-       H5T_STD_U8BE,    &
-       H5T_STD_U8LE,    &
-       H5T_STD_U16BE,   &
-       H5T_STD_U16LE,   &
-       H5T_STD_U32BE
-
-! NOTE: Splitting the line since the Fortran 95 standard limits the number of 
-!       continuation lines to 39; the F03/F08 standard limits the number 
-!       to 255 lines.
-
-  INTEGER(HID_T) :: H5T_STD_U32LE,   &
-       H5T_STD_U64BE,   &
-       H5T_STD_U64LE,   &
-       H5T_STRING,      &
-       H5T_STD_B8BE,    &
-       H5T_STD_B8LE,    &
-       H5T_STD_B16BE,   &
-       H5T_STD_B16LE,   &
-       H5T_STD_B32BE,   &
-       H5T_STD_B32LE,   &
-       H5T_STD_B64BE,   &
-       H5T_STD_B64LE,   &
-       H5T_NATIVE_B8,   &
-       H5T_NATIVE_B16,  &
-       H5T_NATIVE_B32,  &
-       H5T_NATIVE_B64,  &
-       H5T_FORTRAN_S1,  &
-       H5T_C_S1
-
-
-  INTEGER(HID_T), DIMENSION(PREDEF_TYPES_LEN) :: predef_types
-  EQUIVALENCE (predef_types(1), H5T_NATIVE_INTEGER)
-  EQUIVALENCE (predef_types(2), H5T_NATIVE_REAL)
-  EQUIVALENCE (predef_types(3), H5T_NATIVE_DOUBLE)
-  EQUIVALENCE (predef_types(4), H5T_NATIVE_CHARACTER)
-  EQUIVALENCE (predef_types(5), H5T_STD_REF_OBJ)
-  EQUIVALENCE (predef_types(6), H5T_STD_REF_DSETREG)
-  EQUIVALENCE (predef_types(7), H5T_NATIVE_INTEGER_1)
-  EQUIVALENCE (predef_types(8), H5T_NATIVE_INTEGER_2)
-  EQUIVALENCE (predef_types(9), H5T_NATIVE_INTEGER_4)
-  EQUIVALENCE (predef_types(10), H5T_NATIVE_INTEGER_8)
-  EQUIVALENCE (predef_types(11), H5T_NATIVE_REAL_4)
-  EQUIVALENCE (predef_types(12), H5T_NATIVE_REAL_8)
-  EQUIVALENCE (predef_types(13), H5T_NATIVE_REAL_16)
-  EQUIVALENCE (predef_types(14), H5T_NATIVE_B8 )
-  EQUIVALENCE (predef_types(15), H5T_NATIVE_B16)
-  EQUIVALENCE (predef_types(16), H5T_NATIVE_B32)
-  EQUIVALENCE (predef_types(17), H5T_NATIVE_B64)  
-
-  INTEGER(HID_T), DIMENSION(FLOATING_TYPES_LEN) :: floating_types
-  EQUIVALENCE (floating_types(1), H5T_IEEE_F32BE )
-  EQUIVALENCE (floating_types(2), H5T_IEEE_F32LE)
-  EQUIVALENCE (floating_types(3), H5T_IEEE_F64BE)
-  EQUIVALENCE (floating_types(4), H5T_IEEE_F64LE)
-
-  INTEGER(HID_T), DIMENSION(INTEGER_TYPES_LEN) :: integer_types
-  EQUIVALENCE (integer_types(1), H5T_STD_I8BE )
-  EQUIVALENCE (integer_types(2), H5T_STD_I8LE)
-  EQUIVALENCE (integer_types(3), H5T_STD_I16BE)
-  EQUIVALENCE (integer_types(4), H5T_STD_I16LE)
-  EQUIVALENCE (integer_types(5), H5T_STD_I32BE)
-  EQUIVALENCE (integer_types(6), H5T_STD_I32LE)
-  EQUIVALENCE (integer_types(7), H5T_STD_I64BE)
-  EQUIVALENCE (integer_types(8), H5T_STD_I64LE)
-  EQUIVALENCE (integer_types(9), H5T_STD_U8BE)
-  EQUIVALENCE (integer_types(10), H5T_STD_U8LE)
-  EQUIVALENCE (integer_types(11), H5T_STD_U16BE)
-  EQUIVALENCE (integer_types(12), H5T_STD_U16LE)
-  EQUIVALENCE (integer_types(13), H5T_STD_U32BE)
-  EQUIVALENCE (integer_types(14), H5T_STD_U32LE)
-  EQUIVALENCE (integer_types(15), H5T_STD_U64BE)
-  EQUIVALENCE (integer_types(16), H5T_STD_U64LE)
-  EQUIVALENCE (integer_types(17), H5T_STRING)
-  EQUIVALENCE (integer_types(18), H5T_STD_B8BE)
-  EQUIVALENCE (integer_types(19), H5T_STD_B8LE)
-  EQUIVALENCE (integer_types(20), H5T_STD_B16BE)
-  EQUIVALENCE (integer_types(21), H5T_STD_B16LE)
-  EQUIVALENCE (integer_types(22), H5T_STD_B32BE)
-  EQUIVALENCE (integer_types(23), H5T_STD_B32LE)
-  EQUIVALENCE (integer_types(24), H5T_STD_B64BE)
-  EQUIVALENCE (integer_types(25), H5T_STD_B64LE)
-  EQUIVALENCE (integer_types(26), H5T_FORTRAN_S1)
-  EQUIVALENCE (integer_types(27), H5T_C_S1)
-
-
-  !      COMMON /PREDEFINED_TYPES/ H5T_NATIVE_INTEGER, &
-  !                                H5T_NATIVE_REAL, &
-  !                                H5T_NATIVE_DOUBLE, &
-  !                                H5T_NATIVE_CHARACTER, &
-  !                                H5T_STD_REF_OBJ, &
-  !                                H5T_STD_REF_DSETREG
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /PREDEFINED_TYPES/
-  !DEC$endif
-  COMMON /PREDEFINED_TYPES/  predef_types
-
-  !      COMMON /FLOATING_TYPES/ H5T_IEEE_F32BE,  &
-  !                              H5T_IEEE_F32LE,  &
-  !                              H5T_IEEE_F64BE,  &
-  !                              H5T_IEEE_F64LE
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /FLOATING_TYPES/
-  !DEC$endif
-  COMMON /FLOATING_TYPES/ floating_types
-  !
-  !      COMMON /INTEGER_TYPES/ H5T_STD_I8BE,  &
-  !                             H5T_STD_I8LE,    &
-  !                             H5T_STD_I16BE,   &
-  !                             H5T_STD_I16LE,   &
-  !                             H5T_STD_I32BE,   &
-  !                             H5T_STD_I32LE,   &
-  !                             H5T_STD_I64BE,   &
-  !                             H5T_STD_I64LE,   &
-  !                             H5T_STD_U8BE,    &
-  !                             H5T_STD_U8LE,    &
-  !                             H5T_STD_U16BE,   &
-  !                             H5T_STD_U16LE,   &
-  !                             H5T_STD_U32BE,   &
-  !                             H5T_STD_U32LE,   &
-  !                             H5T_STD_U64BE,   &
-  !                             H5T_STD_U64LE
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /INTEGER_TYPES/
-  !DEC$endif
-  COMMON /INTEGER_TYPES/ integer_types
-  !
-  ! Fortran flags
-  !
-  !
-  ! H5F flags (DO NOT FORGET TO UPDATE WHEN NEW FLAGS ARE ADDED !)
-  !
-  ! H5F_ACC_DEBUG_F has no effect as of HDF5 1.8.16
-  !
-  ! H5F flags declaration
-  !
-  INTEGER, PARAMETER :: H5F_FLAGS_LEN = 19
-  INTEGER :: H5F_flags(H5F_FLAGS_LEN)
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5F_FLAGS/
-  !DEC$endif
-  COMMON /H5F_FLAGS/ H5F_flags
-
-  INTEGER :: H5F_ACC_RDWR_F
-  INTEGER :: H5F_ACC_RDONLY_F
-  INTEGER :: H5F_ACC_TRUNC_F
-  INTEGER :: H5F_ACC_EXCL_F
-  INTEGER :: H5F_ACC_DEBUG_F
-  INTEGER :: H5F_SCOPE_LOCAL_F
-  INTEGER :: H5F_SCOPE_GLOBAL_F
-  INTEGER :: H5F_CLOSE_DEFAULT_F
-  INTEGER :: H5F_CLOSE_WEAK_F
-  INTEGER :: H5F_CLOSE_SEMI_F
-  INTEGER :: H5F_CLOSE_STRONG_F
-  INTEGER :: H5F_OBJ_FILE_F
-  INTEGER :: H5F_OBJ_DATASET_F
-  INTEGER :: H5F_OBJ_GROUP_F
-  INTEGER :: H5F_OBJ_DATATYPE_F
-  INTEGER :: H5F_OBJ_ALL_F
-  INTEGER :: H5F_LIBVER_EARLIEST_F
-  INTEGER :: H5F_LIBVER_LATEST_F
-  INTEGER :: H5F_UNLIMITED_F
-
-  EQUIVALENCE(H5F_flags(1), H5F_ACC_RDWR_F)
-  EQUIVALENCE(H5F_flags(2), H5F_ACC_RDONLY_F)
-  EQUIVALENCE(H5F_flags(3), H5F_ACC_TRUNC_F)
-  EQUIVALENCE(H5F_flags(4), H5F_ACC_EXCL_F)
-  EQUIVALENCE(H5F_flags(5), H5F_ACC_DEBUG_F)
-  EQUIVALENCE(H5F_flags(6), H5F_SCOPE_LOCAL_F)
-  EQUIVALENCE(H5F_flags(7), H5F_SCOPE_GLOBAL_F)
-  EQUIVALENCE(H5F_flags(8), H5F_CLOSE_DEFAULT_F)
-  EQUIVALENCE(H5F_flags(9), H5F_CLOSE_WEAK_F)
-  EQUIVALENCE(H5F_flags(10), H5F_CLOSE_SEMI_F)
-  EQUIVALENCE(H5F_flags(11), H5F_CLOSE_STRONG_F)
-  EQUIVALENCE(H5F_flags(12), H5F_OBJ_FILE_F)
-  EQUIVALENCE(H5F_flags(13), H5F_OBJ_DATASET_F)
-  EQUIVALENCE(H5F_flags(14), H5F_OBJ_GROUP_F)
-  EQUIVALENCE(H5F_flags(15), H5F_OBJ_DATATYPE_F)
-  EQUIVALENCE(H5F_flags(16), H5F_OBJ_ALL_F)
-  EQUIVALENCE(H5F_flags(17), H5F_LIBVER_EARLIEST_F)
-  EQUIVALENCE(H5F_flags(18), H5F_LIBVER_LATEST_F)
-  EQUIVALENCE(H5F_flags(19), H5F_UNLIMITED_F)
-  !
-  ! H5generic flags declaration
-  !
-  INTEGER, PARAMETER :: H5generic_FLAGS_LEN = 9
-  INTEGER :: H5generic_flags(H5generic_FLAGS_LEN)
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5generic_FLAGS/
-  !DEC$endif
-  COMMON /H5generic_FLAGS/ H5generic_flags
-
-  INTEGER :: H5_INDEX_UNKNOWN_F
-  INTEGER :: H5_INDEX_NAME_F
-  INTEGER :: H5_INDEX_CRT_ORDER_F
-  INTEGER :: H5_INDEX_N_F
-  INTEGER :: H5_ITER_UNKNOWN_F
-  INTEGER :: H5_ITER_INC_F
-  INTEGER :: H5_ITER_DEC_F
-  INTEGER :: H5_ITER_NATIVE_F
-  INTEGER :: H5_ITER_N_F
-
-  EQUIVALENCE(H5generic_flags(1), H5_INDEX_UNKNOWN_F)
-  EQUIVALENCE(H5generic_flags(2), H5_INDEX_NAME_F)
-  EQUIVALENCE(H5generic_flags(3), H5_INDEX_CRT_ORDER_F)
-  EQUIVALENCE(H5generic_flags(4), H5_INDEX_N_F)
-  EQUIVALENCE(H5generic_flags(5), H5_ITER_UNKNOWN_F)
-  EQUIVALENCE(H5generic_flags(6), H5_ITER_INC_F)
-  EQUIVALENCE(H5generic_flags(7), H5_ITER_DEC_F)
-  EQUIVALENCE(H5generic_flags(8), H5_ITER_NATIVE_F)
-  EQUIVALENCE(H5generic_flags(9), H5_ITER_N_F)
-  !
-  ! H5G flags declaration
-  !
-  INTEGER, PARAMETER :: H5G_FLAGS_LEN = 12
-  INTEGER :: H5G_flags(H5G_FLAGS_LEN)
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5G_FLAGS/
-  !DEC$endif
-  COMMON /H5G_FLAGS/ H5G_flags
-
-  INTEGER :: H5G_UNKNOWN_F
-  INTEGER :: H5G_GROUP_F
-  INTEGER :: H5G_DATASET_F
-  INTEGER :: H5G_TYPE_F
-  INTEGER :: H5G_LINK_F
-  INTEGER :: H5G_UDLINK_F
-  INTEGER :: H5G_SAME_LOC_F
-  INTEGER :: H5G_LINK_ERROR_F
-  INTEGER :: H5G_LINK_HARD_F
-  INTEGER :: H5G_LINK_SOFT_F
-  INTEGER :: H5G_STORAGE_TYPE_UNKNOWN_F
-  INTEGER :: H5G_STORAGE_TYPE_SYMBOL_TABLE_F
-  INTEGER :: H5G_STORAGE_TYPE_COMPACT_F
-  INTEGER :: H5G_STORAGE_TYPE_DENSE_F
-
-  EQUIVALENCE(H5G_flags(1), H5G_UNKNOWN_F) ! Unknown object type
-  EQUIVALENCE(H5G_flags(2), H5G_GROUP_F)   ! Object is a group
-  EQUIVALENCE(H5G_flags(3), H5G_DATASET_F) ! Object is a dataset
-  EQUIVALENCE(H5G_flags(4), H5G_TYPE_F)    ! Object is a named data type
-  EQUIVALENCE(H5G_flags(5), H5G_SAME_LOC_F)
-  EQUIVALENCE(H5G_flags(6), H5G_LINK_ERROR_F)
-  EQUIVALENCE(H5G_flags(7), H5G_LINK_HARD_F)
-  EQUIVALENCE(H5G_flags(8), H5G_LINK_SOFT_F)
-
-  EQUIVALENCE(H5G_flags(9), H5G_STORAGE_TYPE_UNKNOWN_F )
-  EQUIVALENCE(H5G_flags(10), H5G_STORAGE_TYPE_SYMBOL_TABLE_F)
-  EQUIVALENCE(H5G_flags(11), H5G_STORAGE_TYPE_COMPACT_F)
-  EQUIVALENCE(H5G_flags(12), H5G_STORAGE_TYPE_DENSE_F)
-  !
-  ! H5D flags declaration
-  !
-
-  INTEGER, PARAMETER :: H5D_FLAGS_LEN = 25
-  INTEGER :: H5D_flags(H5D_FLAGS_LEN)
-  INTEGER, PARAMETER :: H5D_SIZE_FLAGS_LEN = 2
-  INTEGER(SIZE_T) :: H5D_size_flags(H5D_SIZE_FLAGS_LEN)
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5D_FLAGS/
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5D_SIZE_FLAGS/
-  !DEC$endif
-  COMMON /H5D_FLAGS/ H5D_flags
-  COMMON /H5D_SIZE_FLAGS/ H5D_size_flags
-
-  INTEGER :: H5D_COMPACT_F
-  INTEGER :: H5D_CONTIGUOUS_F
-  INTEGER :: H5D_CHUNKED_F
-
-  INTEGER :: H5D_ALLOC_TIME_ERROR_F
-  INTEGER :: H5D_ALLOC_TIME_DEFAULT_F
-  INTEGER :: H5D_ALLOC_TIME_EARLY_F
-  INTEGER :: H5D_ALLOC_TIME_LATE_F
-  INTEGER :: H5D_ALLOC_TIME_INCR_F
-
-  INTEGER :: H5D_SPACE_STS_ERROR_F
-  INTEGER :: H5D_SPACE_STS_NOT_ALLOCATED_F
-  INTEGER :: H5D_SPACE_STS_PART_ALLOCATED_F
-  INTEGER :: H5D_SPACE_STS_ALLOCATED_F
-
-  INTEGER :: H5D_FILL_TIME_ERROR_F
-  INTEGER :: H5D_FILL_TIME_ALLOC_F
-  INTEGER :: H5D_FILL_TIME_NEVER_F
-
-  INTEGER :: H5D_FILL_VALUE_ERROR_F
-  INTEGER :: H5D_FILL_VALUE_UNDEFINED_F
-  INTEGER :: H5D_FILL_VALUE_DEFAULT_F
-  INTEGER :: H5D_FILL_VALUE_USER_DEFINED_F
-
-! shortened "_DEFAULT" to "_DFLT" to satisfy the limit of 31
-! characters for variable names in Fortran.
-! shortened "_CONTIGUOUS" to "_CONTIG" to satisfy the limit of 31
-! characters for variable names in Fortran.
-
-  INTEGER(SIZE_T) :: H5D_CHUNK_CACHE_NSLOTS_DFLT_F
-  INTEGER(SIZE_T) :: H5D_CHUNK_CACHE_NBYTES_DFLT_F
-  INTEGER :: H5D_CHUNK_CACHE_W0_DFLT_F
-  INTEGER :: H5D_MPIO_NO_COLLECTIVE_F
-  INTEGER :: H5D_MPIO_CHUNK_INDEPENDENT_F
-  INTEGER :: H5D_MPIO_CHUNK_COLLECTIVE_F
-  INTEGER :: H5D_MPIO_CHUNK_MIXED_F
-  INTEGER :: H5D_MPIO_CONTIG_COLLECTIVE_F
-
-  EQUIVALENCE(H5D_flags(1), H5D_COMPACT_F)
-  EQUIVALENCE(H5D_flags(2), H5D_CONTIGUOUS_F)
-  EQUIVALENCE(H5D_flags(3), H5D_CHUNKED_F)
-
-  EQUIVALENCE(H5D_flags(4), H5D_ALLOC_TIME_ERROR_F)
-  EQUIVALENCE(H5D_flags(5), H5D_ALLOC_TIME_DEFAULT_F)
-  EQUIVALENCE(H5D_flags(6), H5D_ALLOC_TIME_EARLY_F)
-  EQUIVALENCE(H5D_flags(7), H5D_ALLOC_TIME_LATE_F)
-  EQUIVALENCE(H5D_flags(8), H5D_ALLOC_TIME_INCR_F)
-
-  EQUIVALENCE(H5D_flags(9), H5D_SPACE_STS_ERROR_F)
-  EQUIVALENCE(H5D_flags(10), H5D_SPACE_STS_NOT_ALLOCATED_F)
-  EQUIVALENCE(H5D_flags(11), H5D_SPACE_STS_PART_ALLOCATED_F)
-  EQUIVALENCE(H5D_flags(12), H5D_SPACE_STS_ALLOCATED_F)
-
-  EQUIVALENCE(H5D_flags(13), H5D_FILL_TIME_ERROR_F)
-  EQUIVALENCE(H5D_flags(14), H5D_FILL_TIME_ALLOC_F)
-  EQUIVALENCE(H5D_flags(15), H5D_FILL_TIME_NEVER_F)
-
-  EQUIVALENCE(H5D_flags(16), H5D_FILL_VALUE_ERROR_F)
-  EQUIVALENCE(H5D_flags(17), H5D_FILL_VALUE_UNDEFINED_F)
-  EQUIVALENCE(H5D_flags(18), H5D_FILL_VALUE_DEFAULT_F)
-  EQUIVALENCE(H5D_flags(19), H5D_FILL_VALUE_USER_DEFINED_F)
-
-  EQUIVALENCE(H5D_flags(20), H5D_CHUNK_CACHE_W0_DFLT_F)
-  EQUIVALENCE(H5D_flags(21), H5D_MPIO_NO_COLLECTIVE_F)
-  EQUIVALENCE(H5D_flags(22), H5D_MPIO_CHUNK_INDEPENDENT_F)
-  EQUIVALENCE(H5D_flags(23), H5D_MPIO_CHUNK_COLLECTIVE_F)
-  EQUIVALENCE(H5D_flags(24), H5D_MPIO_CHUNK_MIXED_F)
-  EQUIVALENCE(H5D_flags(25), H5D_MPIO_CONTIG_COLLECTIVE_F)
-
-  EQUIVALENCE(H5D_size_flags(1), H5D_CHUNK_CACHE_NSLOTS_DFLT_F)
-  EQUIVALENCE(H5D_size_flags(2), H5D_CHUNK_CACHE_NBYTES_DFLT_F)
-
-  !
-  ! H5E flags declaration
-  !
-  INTEGER, PARAMETER :: H5E_FLAGS_LEN = 4
-  INTEGER :: H5E_flags(H5E_FLAGS_LEN)
-  INTEGER, PARAMETER :: H5E_HID_FLAGS_LEN = 1
-  INTEGER(HID_T) :: H5E_hid_flags(H5E_HID_FLAGS_LEN)
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5E_FLAGS/
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5E_HID_FLAGS/
-  !DEC$endif
-  COMMON /H5E_FLAGS/ H5E_flags
-  COMMON /H5E_HID_FLAGS/ H5E_hid_flags
-
-  INTEGER(HID_T) :: H5E_DEFAULT_F
-  INTEGER :: H5E_MAJOR_F
-  INTEGER :: H5E_MINOR_F
-  INTEGER :: H5E_WALK_UPWARD_F
-  INTEGER :: H5E_WALK_DOWNWARD_F
-
-  EQUIVALENCE(H5E_hid_flags(1), H5E_DEFAULT_F)
-  EQUIVALENCE(H5E_flags(1)    , H5E_MAJOR_F)
-  EQUIVALENCE(H5E_flags(2)    , H5E_MINOR_F)
-  EQUIVALENCE(H5E_flags(3)    , H5E_WALK_UPWARD_F)
-  EQUIVALENCE(H5E_flags(4)    , H5E_WALK_DOWNWARD_F)
-
-  !
-  ! H5FD flags declaration
-  !
-  INTEGER, PARAMETER :: H5FD_FLAGS_LEN = 11
-  INTEGER :: H5FD_flags(H5FD_FLAGS_LEN)
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5FD_FLAGS/
-  !DEC$endif
-  COMMON /H5FD_FLAGS/ H5FD_flags
-
-  INTEGER :: H5FD_MPIO_INDEPENDENT_F
-  INTEGER :: H5FD_MPIO_COLLECTIVE_F
-  INTEGER :: H5FD_MEM_NOLIST_F
-  INTEGER :: H5FD_MEM_DEFAULT_F
-  INTEGER :: H5FD_MEM_SUPER_F
-  INTEGER :: H5FD_MEM_BTREE_F
-  INTEGER :: H5FD_MEM_DRAW_F
-  INTEGER :: H5FD_MEM_GHEAP_F
-  INTEGER :: H5FD_MEM_LHEAP_F
-  INTEGER :: H5FD_MEM_OHDR_F
-  INTEGER :: H5FD_MEM_NTYPES_F
-
-  EQUIVALENCE(H5FD_flags(1), H5FD_MPIO_INDEPENDENT_F)
-  EQUIVALENCE(H5FD_flags(2), H5FD_MPIO_COLLECTIVE_F)
-  EQUIVALENCE(H5FD_flags(3), H5FD_MEM_NOLIST_F)
-  EQUIVALENCE(H5FD_flags(4), H5FD_MEM_DEFAULT_F)
-  EQUIVALENCE(H5FD_flags(5), H5FD_MEM_SUPER_F)
-  EQUIVALENCE(H5FD_flags(6), H5FD_MEM_BTREE_F)
-  EQUIVALENCE(H5FD_flags(7), H5FD_MEM_DRAW_F)
-  EQUIVALENCE(H5FD_flags(8), H5FD_MEM_GHEAP_F)
-  EQUIVALENCE(H5FD_flags(9), H5FD_MEM_LHEAP_F)
-  EQUIVALENCE(H5FD_flags(10), H5FD_MEM_OHDR_F)
-  EQUIVALENCE(H5FD_flags(11), H5FD_MEM_NTYPES_F)
-  !
-  ! H5FD file drivers flags declaration
-  !
-  INTEGER, PARAMETER :: H5FD_HID_FLAGS_LEN = 7
-  INTEGER(HID_T) :: H5FD_hid_flags(H5FD_HID_FLAGS_LEN)
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5FD_HID_FLAGS/
-  !DEC$endif
-  COMMON /H5FD_HID_FLAGS/ H5FD_hid_flags
-
-  INTEGER(HID_T) :: H5FD_CORE_F
-  INTEGER(HID_T) :: H5FD_FAMILY_F
-  INTEGER(HID_T) :: H5FD_LOG_F
-  INTEGER(HID_T) :: H5FD_MPIO_F
-  INTEGER(HID_T) :: H5FD_MULTI_F
-  INTEGER(HID_T) :: H5FD_SEC2_F
-  INTEGER(HID_T) :: H5FD_STDIO_F
-
-  EQUIVALENCE(H5FD_hid_flags(1), H5FD_CORE_F)
-  EQUIVALENCE(H5FD_hid_flags(2), H5FD_FAMILY_F)
-  EQUIVALENCE(H5FD_hid_flags(3), H5FD_LOG_F)
-  EQUIVALENCE(H5FD_hid_flags(4), H5FD_MPIO_F)
-  EQUIVALENCE(H5FD_hid_flags(5), H5FD_MULTI_F)
-  EQUIVALENCE(H5FD_hid_flags(6), H5FD_SEC2_F)
-  EQUIVALENCE(H5FD_hid_flags(7), H5FD_STDIO_F)
-
-  !
-  ! H5I flags declaration
-  !
-  INTEGER, PARAMETER :: H5I_FLAGS_LEN = 7
-  INTEGER :: H5I_flags(H5I_FLAGS_LEN)
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5I_FLAGS/
-  !DEC$endif
-  COMMON /H5I_FLAGS/ H5I_flags
-
-  INTEGER ::  H5I_FILE_F
-  INTEGER ::  H5I_GROUP_F
-  INTEGER ::  H5I_DATATYPE_F
-  INTEGER ::  H5I_DATASPACE_F
-  INTEGER ::  H5I_DATASET_F
-  INTEGER ::  H5I_ATTR_F
-  INTEGER ::  H5I_BADID_F
-
-  EQUIVALENCE(H5I_flags(1), H5I_FILE_F)
-  EQUIVALENCE(H5I_flags(2), H5I_GROUP_F)
-  EQUIVALENCE(H5I_flags(3), H5I_DATATYPE_F)
-  EQUIVALENCE(H5I_flags(4), H5I_DATASPACE_F)
-  EQUIVALENCE(H5I_flags(5), H5I_DATASET_F)
-  EQUIVALENCE(H5I_flags(6), H5I_ATTR_F)
-  EQUIVALENCE(H5I_flags(7), H5I_BADID_F)
-  !
-  ! H5L flags declaration
-  !
-  INTEGER, PARAMETER :: H5L_FLAGS_LEN = 6
-  INTEGER :: H5L_flags(H5L_FLAGS_LEN)
-
-  INTEGER :: H5L_TYPE_ERROR_F
-  INTEGER :: H5L_TYPE_HARD_F
-  INTEGER :: H5L_TYPE_SOFT_F
-  INTEGER :: H5L_TYPE_EXTERNAL_F
-  INTEGER :: H5L_SAME_LOC_F
-  INTEGER :: H5L_LINK_CLASS_T_VERS_F
-
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5L_FLAGS/
-  !DEC$endif
-  COMMON /H5L_FLAGS/ H5L_flags
-
-  EQUIVALENCE(H5L_flags(1), H5L_TYPE_ERROR_F)
-  EQUIVALENCE(H5L_flags(2), H5L_TYPE_HARD_F)
-  EQUIVALENCE(H5L_flags(3), H5L_TYPE_SOFT_F)
-  EQUIVALENCE(H5L_flags(4), H5L_TYPE_EXTERNAL_F)
-  EQUIVALENCE(H5L_flags(5), H5L_SAME_LOC_F)
-  EQUIVALENCE(H5L_flags(6), H5L_LINK_CLASS_T_VERS_F)
-  !
-  ! H5O flags declaration
-  !
-  INTEGER, PARAMETER :: H5O_FLAGS_LEN = 27
-  INTEGER :: H5o_flags(H5O_FLAGS_LEN)
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5O_FLAGS/
-  !DEC$endif
-  COMMON /H5O_FLAGS/ H5O_flags
-
-  INTEGER :: H5O_COPY_SHALLOW_HIERARCHY_F ! *** THESE VARIABLES DO
-  INTEGER :: H5O_COPY_EXPAND_SOFT_LINK_F  ! NOT MATCH THE C VARIABLE
-  INTEGER :: H5O_COPY_EXPAND_EXT_LINK_F   ! IN ORDER
-  INTEGER :: H5O_COPY_EXPAND_REFERENCE_F  ! TO STAY UNDER THE
-  INTEGER :: H5O_COPY_WITHOUT_ATTR_FLAG_F
-  INTEGER :: H5O_COPY_PRESERVE_NULL_FLAG_F
-  INTEGER :: H5O_COPY_ALL_F
-  INTEGER :: H5O_SHMESG_NONE_FLAG_F
-  INTEGER :: H5O_SHMESG_SDSPACE_FLAG_F
-  INTEGER :: H5O_SHMESG_DTYPE_FLAG_F
-  INTEGER :: H5O_SHMESG_FILL_FLAG_F
-  INTEGER :: H5O_SHMESG_PLINE_FLAG_F
-  INTEGER :: H5O_SHMESG_ATTR_FLAG_F
-  INTEGER :: H5O_SHMESG_ALL_FLAG_F
-  INTEGER :: H5O_HDR_CHUNK0_SIZE_F
-  INTEGER :: H5O_HDR_ATTR_CRT_ORDER_TRACK_F ! 32 CHARACTER
-  INTEGER :: H5O_HDR_ATTR_CRT_ORDER_INDEX_F ! VARIABLE
-  INTEGER :: H5O_HDR_ATTR_STORE_PHASE_CHA_F ! LENGTH ***
-  INTEGER :: H5O_HDR_STORE_TIMES_F
-  INTEGER :: H5O_HDR_ALL_FLAGS_F
-  INTEGER :: H5O_SHMESG_MAX_NINDEXES_F
-  INTEGER :: H5O_SHMESG_MAX_LIST_SIZE_F
-  INTEGER :: H5O_TYPE_UNKNOWN_F
-  INTEGER :: H5O_TYPE_GROUP_F
-  INTEGER :: H5O_TYPE_DATASET_F
-  INTEGER :: H5O_TYPE_NAMED_DATATYPE_F
-  INTEGER :: H5O_TYPE_NTYPES_F
-
-  EQUIVALENCE(h5o_flags(1) , H5O_COPY_SHALLOW_HIERARCHY_F)
-  EQUIVALENCE(h5o_flags(2) , H5O_COPY_EXPAND_SOFT_LINK_F)
-  EQUIVALENCE(h5o_flags(3) , H5O_COPY_EXPAND_EXT_LINK_F)
-  EQUIVALENCE(h5o_flags(4) , H5O_COPY_EXPAND_REFERENCE_F)
-  EQUIVALENCE(h5o_flags(5) , H5O_COPY_WITHOUT_ATTR_FLAG_F)
-  EQUIVALENCE(h5o_flags(6) , H5O_COPY_PRESERVE_NULL_FLAG_F)
-  EQUIVALENCE(h5o_flags(7) , H5O_COPY_ALL_F)
-  EQUIVALENCE(h5o_flags(8) , H5O_SHMESG_NONE_FLAG_F)
-  EQUIVALENCE(h5o_flags(9) , H5O_SHMESG_SDSPACE_FLAG_F)
-  EQUIVALENCE(h5o_flags(10) , H5O_SHMESG_DTYPE_FLAG_F)
-  EQUIVALENCE(h5o_flags(11) , H5O_SHMESG_FILL_FLAG_F)
-  EQUIVALENCE(h5o_flags(12) , H5O_SHMESG_PLINE_FLAG_F)
-  EQUIVALENCE(h5o_flags(13) , H5O_SHMESG_ATTR_FLAG_F)
-  EQUIVALENCE(h5o_flags(14) , H5O_SHMESG_ALL_FLAG_F)
-  EQUIVALENCE(h5o_flags(15) , H5O_HDR_CHUNK0_SIZE_F)
-  EQUIVALENCE(h5o_flags(16) , H5O_HDR_ATTR_CRT_ORDER_TRACK_F)
-  EQUIVALENCE(h5o_flags(17) , H5O_HDR_ATTR_CRT_ORDER_INDEX_F)
-  EQUIVALENCE(h5o_flags(18) , H5O_HDR_ATTR_STORE_PHASE_CHA_F)
-  EQUIVALENCE(h5o_flags(19) , H5O_HDR_STORE_TIMES_F)
-  EQUIVALENCE(h5o_flags(20) , H5O_HDR_ALL_FLAGS_F)
-  EQUIVALENCE(h5o_flags(21) , H5O_SHMESG_MAX_NINDEXES_F)
-  EQUIVALENCE(h5o_flags(22) , H5O_SHMESG_MAX_LIST_SIZE_F)
-  EQUIVALENCE(h5o_flags(23) , H5O_TYPE_UNKNOWN_F)
-  EQUIVALENCE(h5o_flags(24) , H5O_TYPE_GROUP_F)
-  EQUIVALENCE(h5o_flags(25) , H5O_TYPE_DATASET_F)
-  EQUIVALENCE(h5o_flags(26) , H5O_TYPE_NAMED_DATATYPE_F)
-  EQUIVALENCE(h5o_flags(27) , H5O_TYPE_NTYPES_F)
-
-  !
-  ! H5P flags declaration
-  !
-  INTEGER, PARAMETER :: H5P_FLAGS_LEN = 18
-  INTEGER(HID_T) H5P_flags(H5P_FLAGS_LEN)
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5P_FLAGS/
-  !DEC$endif
-  COMMON /H5P_FLAGS/ H5P_flags
-
-  INTEGER(HID_T) :: H5P_FILE_CREATE_F
-  INTEGER(HID_T) :: H5P_FILE_ACCESS_F
-  INTEGER(HID_T) :: H5P_DATASET_CREATE_F
-  INTEGER(HID_T) :: H5P_DATASET_XFER_F
-  INTEGER(HID_T) :: H5P_FILE_MOUNT_F
-  INTEGER(HID_T) :: H5P_DEFAULT_F
-  INTEGER(HID_T) :: H5P_ROOT_F
-  INTEGER(HID_T) :: H5P_OBJECT_CREATE_F
-  INTEGER(HID_T) :: H5P_DATASET_ACCESS_F
-  INTEGER(HID_T) :: H5P_GROUP_CREATE_F
-  INTEGER(HID_T) :: H5P_GROUP_ACCESS_F
-  INTEGER(HID_T) :: H5P_DATATYPE_CREATE_F
-  INTEGER(HID_T) :: H5P_DATATYPE_ACCESS_F
-  INTEGER(HID_T) :: H5P_STRING_CREATE_F
-  INTEGER(HID_T) :: H5P_ATTRIBUTE_CREATE_F
-  INTEGER(HID_T) :: H5P_OBJECT_COPY_F
-  INTEGER(HID_T) :: H5P_LINK_CREATE_F
-  INTEGER(HID_T) :: H5P_LINK_ACCESS_F
-
-  EQUIVALENCE(H5P_flags(1), H5P_FILE_CREATE_F)
-  EQUIVALENCE(H5P_flags(2), H5P_FILE_ACCESS_F)
-  EQUIVALENCE(H5P_flags(3), H5P_DATASET_CREATE_F)
-  EQUIVALENCE(H5P_flags(4), H5P_DATASET_XFER_F)
-  EQUIVALENCE(H5P_flags(5), H5P_FILE_MOUNT_F)
-  EQUIVALENCE(H5P_flags(6), H5P_DEFAULT_F)
-  EQUIVALENCE(H5P_flags(7), H5P_ROOT_F)
-  EQUIVALENCE(H5P_flags(8), H5P_OBJECT_CREATE_F)
-  EQUIVALENCE(H5P_flags(9), H5P_DATASET_ACCESS_F)
-  EQUIVALENCE(H5P_flags(10), H5P_GROUP_CREATE_F)
-  EQUIVALENCE(H5P_flags(11), H5P_GROUP_ACCESS_F)
-  EQUIVALENCE(H5P_flags(12), H5P_DATATYPE_CREATE_F)
-  EQUIVALENCE(H5P_flags(13), H5P_DATATYPE_ACCESS_F)
-  EQUIVALENCE(H5P_flags(14), H5P_STRING_CREATE_F)
-  EQUIVALENCE(H5P_flags(15), H5P_ATTRIBUTE_CREATE_F)
-  EQUIVALENCE(H5P_flags(16), H5P_OBJECT_COPY_F)
-  EQUIVALENCE(H5P_flags(17), H5P_LINK_CREATE_F)
-  EQUIVALENCE(H5P_flags(18), H5P_LINK_ACCESS_F)
-
-  !
-  ! H5P integers flags declaration
-  !
-  INTEGER, PARAMETER :: H5P_FLAGS_INT_LEN = 2
-  INTEGER :: H5P_flags_int(H5P_FLAGS_INT_LEN)
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5P_FLAGS_INT/
-  !DEC$endif
-  COMMON /H5P_FLAGS_INT/ H5P_flags_int
-  INTEGER :: H5P_CRT_ORDER_INDEXED_F
-  INTEGER :: H5P_CRT_ORDER_TRACKED_F
-  EQUIVALENCE(H5P_flags_int(1), H5P_CRT_ORDER_INDEXED_F)
-  EQUIVALENCE(H5P_flags_int(2), H5P_CRT_ORDER_TRACKED_F)
-  !
-  ! H5R flags declaration
-  !
-  INTEGER, PARAMETER :: H5R_FLAGS_LEN = 2
-  INTEGER :: H5R_flags(H5R_FLAGS_LEN)
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5R_FLAGS/
-  !DEC$endif
-  COMMON /H5R_FLAGS/ H5R_flags
-
-  INTEGER :: H5R_OBJECT_F
-  INTEGER :: H5R_DATASET_REGION_F
-
-  EQUIVALENCE(H5R_flags(1), H5R_OBJECT_F)
-  EQUIVALENCE(H5R_flags(2), H5R_DATASET_REGION_F)
-
-  !
-  ! H5S flags declaration
-  !
-  INTEGER, PARAMETER :: H5S_FLAGS_LEN = 19
-  INTEGER :: H5S_flags(H5S_FLAGS_LEN)
-  INTEGER, PARAMETER :: H5S_HSIZE_FLAGS_LEN = 1
-  INTEGER(HSIZE_T) H5S_hsize_flags(H5S_HSIZE_FLAGS_LEN)
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5S_FLAGS/
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5S_HSIZE_FLAGS/
-  !DEC$endif
-  COMMON /H5S_FLAGS/ H5S_flags
-  COMMON /H5S_HSIZE_FLAGS/ H5S_hsize_flags
-
-  INTEGER(HSIZE_T) :: H5S_UNLIMITED_F
-
-  INTEGER :: H5S_SCALAR_F
-  INTEGER :: H5S_SIMPLE_F
-  INTEGER :: H5S_NULL_F
-
-  INTEGER :: H5S_ALL_F
-
-  INTEGER :: H5S_SELECT_NOOP_F
-  INTEGER :: H5S_SELECT_SET_F
-  INTEGER :: H5S_SELECT_OR_F
-  INTEGER :: H5S_SELECT_AND_F
-  INTEGER :: H5S_SELECT_XOR_F
-  INTEGER :: H5S_SELECT_NOTB_F
-  INTEGER :: H5S_SELECT_NOTA_F
-  INTEGER :: H5S_SELECT_APPEND_F
-  INTEGER :: H5S_SELECT_PREPEND_F
-  INTEGER :: H5S_SELECT_INVALID_F
-
-  INTEGER :: H5S_SEL_ERROR_F
-  INTEGER :: H5S_SEL_NONE_F
-  INTEGER :: H5S_SEL_POINTS_F
-  INTEGER :: H5S_SEL_HYPERSLABS_F
-  INTEGER :: H5S_SEL_ALL_F
-
-  EQUIVALENCE(H5S_hsize_flags(1), H5S_UNLIMITED_F)
-  EQUIVALENCE(H5S_flags(1), H5S_SCALAR_F)
-  EQUIVALENCE(H5S_flags(2), H5S_SIMPLE_F)
-  EQUIVALENCE(H5S_flags(3), H5S_NULL_F)
-  EQUIVALENCE(H5S_flags(4), H5S_SELECT_SET_F)
-  EQUIVALENCE(H5S_flags(5), H5S_SELECT_OR_F)
-  EQUIVALENCE(H5S_flags(6), H5S_ALL_F)
-
-  EQUIVALENCE(H5S_flags(7), H5S_SELECT_NOOP_F)
-  EQUIVALENCE(H5S_flags(8), H5S_SELECT_AND_F)
-  EQUIVALENCE(H5S_flags(9), H5S_SELECT_XOR_F)
-  EQUIVALENCE(H5S_flags(10), H5S_SELECT_NOTB_F)
-  EQUIVALENCE(H5S_flags(11), H5S_SELECT_NOTA_F)
-  EQUIVALENCE(H5S_flags(12), H5S_SELECT_APPEND_F)
-  EQUIVALENCE(H5S_flags(13), H5S_SELECT_PREPEND_F)
-  EQUIVALENCE(H5S_flags(14), H5S_SELECT_INVALID_F)
-
-
-  EQUIVALENCE(H5S_flags(15), H5S_SEL_ERROR_F)
-  EQUIVALENCE(H5S_flags(16), H5S_SEL_NONE_F)
-  EQUIVALENCE(H5S_flags(17), H5S_SEL_POINTS_F)
-  EQUIVALENCE(H5S_flags(18), H5S_SEL_HYPERSLABS_F)
-  EQUIVALENCE(H5S_flags(19), H5S_SEL_ALL_F)
-
-  !
-  ! H5T flags declaration
-  !
-  INTEGER, PARAMETER :: H5T_FLAGS_LEN = 35
-  INTEGER :: H5T_flags(H5T_FLAGS_LEN)
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5T_FLAGS/
-  !DEC$endif
-  COMMON /H5T_FLAGS/ H5T_flags
-
-  INTEGER :: H5T_NO_CLASS_F
-  INTEGER :: H5T_INTEGER_F
-  INTEGER :: H5T_FLOAT_F
-  INTEGER :: H5T_TIME_F
-  INTEGER :: H5T_STRING_F
-  INTEGER :: H5T_BITFIELD_F
-  INTEGER :: H5T_OPAQUE_F
-  INTEGER :: H5T_COMPOUND_F
-  INTEGER :: H5T_REFERENCE_F
-  INTEGER :: H5T_ENUM_F
-  INTEGER :: H5T_VLEN_F
-  INTEGER :: H5T_ARRAY_F
-  INTEGER :: H5T_ORDER_LE_F
-  INTEGER :: H5T_ORDER_BE_F
-  INTEGER :: H5T_ORDER_VAX_F
-  INTEGER :: H5T_ORDER_NONE_F
-  INTEGER :: H5T_ORDER_MIXED_F
-  INTEGER :: H5T_PAD_ZERO_F
-  INTEGER :: H5T_PAD_ONE_F
-  INTEGER :: H5T_PAD_BACKGROUND_F
-  INTEGER :: H5T_PAD_ERROR_F
-  INTEGER :: H5T_SGN_NONE_F
-  INTEGER :: H5T_SGN_2_F
-  INTEGER :: H5T_SGN_ERROR_F
-  INTEGER :: H5T_NORM_IMPLIED_F
-  INTEGER :: H5T_NORM_MSBSET_F
-  INTEGER :: H5T_NORM_NONE_F
-  INTEGER :: H5T_CSET_ASCII_F
-  INTEGER :: H5T_CSET_UTF8_F
-  INTEGER :: H5T_STR_NULLTERM_F
-  INTEGER :: H5T_STR_NULLPAD_F
-  INTEGER :: H5T_STR_SPACEPAD_F
-  INTEGER :: H5T_STR_ERROR_F
-  INTEGER :: H5T_DIR_ASCEND_F
-  INTEGER :: H5T_DIR_DESCEND_F
-
-  EQUIVALENCE(H5T_flags(1), H5T_NO_CLASS_F)
-  EQUIVALENCE(H5T_flags(2), H5T_INTEGER_F)
-  EQUIVALENCE(H5T_flags(3), H5T_FLOAT_F)
-  EQUIVALENCE(H5T_flags(4), H5T_TIME_F)
-  EQUIVALENCE(H5T_flags(5), H5T_STRING_F)
-  EQUIVALENCE(H5T_flags(6), H5T_BITFIELD_F)
-  EQUIVALENCE(H5T_flags(7), H5T_OPAQUE_F)
-  EQUIVALENCE(H5T_flags(8), H5T_COMPOUND_F)
-  EQUIVALENCE(H5T_flags(9), H5T_REFERENCE_F)
-  EQUIVALENCE(H5T_flags(10), H5T_ENUM_F)
-  EQUIVALENCE(H5T_flags(11), H5T_ORDER_LE_F)
-  EQUIVALENCE(H5T_flags(12), H5T_ORDER_BE_F)
-  EQUIVALENCE(H5T_flags(13), H5T_ORDER_MIXED_F)
-  EQUIVALENCE(H5T_flags(14), H5T_ORDER_VAX_F)
-  EQUIVALENCE(H5T_flags(15), H5T_ORDER_NONE_F)
-  EQUIVALENCE(H5T_flags(16), H5T_PAD_ZERO_F)
-  EQUIVALENCE(H5T_flags(17), H5T_PAD_ONE_F)
-  EQUIVALENCE(H5T_flags(18), H5T_PAD_BACKGROUND_F)
-  EQUIVALENCE(H5T_flags(19), H5T_PAD_ERROR_F)
-  EQUIVALENCE(H5T_flags(20), H5T_SGN_NONE_F)
-  EQUIVALENCE(H5T_flags(21), H5T_SGN_2_F)
-  EQUIVALENCE(H5T_flags(22), H5T_SGN_ERROR_F)
-  EQUIVALENCE(H5T_flags(23), H5T_NORM_IMPLIED_F)
-  EQUIVALENCE(H5T_flags(24), H5T_NORM_MSBSET_F)
-  EQUIVALENCE(H5T_flags(25), H5T_NORM_NONE_F)
-  EQUIVALENCE(H5T_flags(26), H5T_CSET_ASCII_F)
-  EQUIVALENCE(H5T_flags(27), H5T_CSET_UTF8_F)
-  EQUIVALENCE(H5T_flags(28), H5T_STR_NULLTERM_F)
-  EQUIVALENCE(H5T_flags(29), H5T_STR_NULLPAD_F)
-  EQUIVALENCE(H5T_flags(30), H5T_STR_SPACEPAD_F)
-  EQUIVALENCE(H5T_flags(31), H5T_STR_ERROR_F)
-  EQUIVALENCE(H5T_flags(32), H5T_VLEN_F)
-  EQUIVALENCE(H5T_flags(33), H5T_ARRAY_F)
-  EQUIVALENCE(H5T_flags(34), H5T_DIR_ASCEND_F)
-  EQUIVALENCE(H5T_flags(35), H5T_DIR_DESCEND_F)
-  !
-  ! H5Z flags declaration
-  !
-  INTEGER, PARAMETER :: H5Z_FLAGS_LEN = 20
-  INTEGER :: H5Z_flags(H5Z_FLAGS_LEN)
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5Z_FLAGS/
-  !DEC$endif
-  COMMON /H5Z_FLAGS/ H5Z_flags
-
-  INTEGER :: H5Z_FILTER_ERROR_F
-  INTEGER :: H5Z_FILTER_NONE_F
-  INTEGER :: H5Z_FILTER_ALL_F
-  INTEGER :: H5Z_FILTER_DEFLATE_F
-  INTEGER :: H5Z_FILTER_SHUFFLE_F
-  INTEGER :: H5Z_FILTER_FLETCHER32_F
-  INTEGER :: H5Z_FILTER_SZIP_F
-  INTEGER :: H5Z_ERROR_EDC_F
-  INTEGER :: H5Z_DISABLE_EDC_F
-  INTEGER :: H5Z_ENABLE_EDC_F
-  INTEGER :: H5Z_NO_EDC_F
-  INTEGER :: H5Z_FLAG_OPTIONAL_F
-  INTEGER :: H5Z_FILTER_ENCODE_ENABLED_F
-  INTEGER :: H5Z_FILTER_DECODE_ENABLED_F
-  INTEGER :: H5Z_FILTER_NBIT_F
-  INTEGER :: H5Z_FILTER_SCALEOFFSET_F
-  INTEGER :: H5Z_SO_FLOAT_DSCALE_F
-  INTEGER :: H5Z_SO_FLOAT_ESCALE_F
-  INTEGER :: H5Z_SO_INT_F
-  INTEGER :: H5Z_SO_INT_MINBITS_DEFAULT_F
-
-  EQUIVALENCE(H5Z_flags(1), H5Z_FILTER_ERROR_F)
-  EQUIVALENCE(H5Z_flags(2), H5Z_FILTER_NONE_F)
-  EQUIVALENCE(H5Z_flags(3), H5Z_FILTER_DEFLATE_F)
-  EQUIVALENCE(H5Z_flags(4), H5Z_FILTER_SHUFFLE_F)
-  EQUIVALENCE(H5Z_flags(5), H5Z_FILTER_FLETCHER32_F)
-  EQUIVALENCE(H5Z_flags(6), H5Z_ERROR_EDC_F)
-  EQUIVALENCE(H5Z_flags(7), H5Z_DISABLE_EDC_F)
-  EQUIVALENCE(H5Z_flags(8), H5Z_ENABLE_EDC_F)
-  EQUIVALENCE(H5Z_flags(9), H5Z_NO_EDC_F)
-  EQUIVALENCE(H5Z_flags(10), H5Z_FILTER_SZIP_F)
-  EQUIVALENCE(H5Z_flags(11), H5Z_FLAG_OPTIONAL_F)
-  EQUIVALENCE(H5Z_flags(12), H5Z_FILTER_ENCODE_ENABLED_F)
-  EQUIVALENCE(H5Z_flags(13), H5Z_FILTER_DECODE_ENABLED_F)
-  EQUIVALENCE(H5Z_flags(14), H5Z_FILTER_ALL_F)
-  EQUIVALENCE(H5Z_flags(15), H5Z_FILTER_NBIT_F)
-  EQUIVALENCE(H5Z_flags(16), H5Z_FILTER_SCALEOFFSET_F)
-  EQUIVALENCE(H5Z_flags(17), H5Z_SO_FLOAT_DSCALE_F)
-  EQUIVALENCE(H5Z_flags(18), H5Z_SO_FLOAT_ESCALE_F)
-  EQUIVALENCE(H5Z_flags(19), H5Z_SO_INT_F)
-  EQUIVALENCE(H5Z_flags(20), H5Z_SO_INT_MINBITS_DEFAULT_F)
-
-  !
-  ! H5 Library flags declaration
-  !
-  INTEGER, PARAMETER :: H5LIB_FLAGS_LEN =  2
-  INTEGER :: H5LIB_flags(H5LIB_FLAGS_LEN)
-  !DEC$if defined(BUILD_HDF5_DLL)
-  !DEC$ATTRIBUTES DLLEXPORT :: /H5LIB_FLAGS/
-  !DEC$endif
-  COMMON /H5LIB_FLAGS/ H5LIB_flags
-  INTEGER :: H5_SZIP_EC_OM_F
-  INTEGER :: H5_SZIP_NN_OM_F
-  !
-  EQUIVALENCE(H5LIB_flags(1), H5_SZIP_EC_OM_F)
-  EQUIVALENCE(H5LIB_flags(2), H5_SZIP_NN_OM_F)
-
-
-  ! General H5 flags declarations
-  !
-!!$      INTEGER, PARAMETER :: H5_FLAGS_LEN = 2
-!!$      INTEGER H5_flags(H5_FLAGS_LEN)
-!!$!DEC$if defined(BUILD_HDF5_DLL)
-!!$!DEC$ATTRIBUTES DLLEXPORT :: /H5_FLAGS/
-!!$!DEC$endif
-!!$      COMMON /H5_FLAGS/ H5_flags
-!!$
-!!$      INTEGER :: _F
-!!$      INTEGER :: H5F_SCOPE_LOCAL_F
-!!$
-!!$      EQUIVALENCE(H5F_flags(1), H5F_SCOPE_GLOBAL_F)
-!!$      EQUIVALENCE(H5F_flags(2), H5F_SCOPE_LOCAL_F)
-
-END MODULE H5GLOBAL
-
diff --git a/fortran/src/H5f90kit.c b/fortran/src/H5f90kit.c
index 0bc721f..c6c874f 100644
--- a/fortran/src/H5f90kit.c
+++ b/fortran/src/H5f90kit.c
@@ -1,6 +1,6 @@
 /****h* H5f90kit/H5f90kit
  * PURPOSE
- *   Routines from HDF4 to deal with C-FORTRAN issues:
+ *  Routines from HDF4 to deal with C-FORTRAN issues:
  *
  *   HD5f2cstring   -- convert a Fortran string to a C string
  *   HD5packFstring -- convert a C string into a Fortran string
@@ -31,16 +31,16 @@
 /****if* H5f90kit/HDf2cstring
  * NAME
  *   HD5f2cstring -- convert a Fortran string to a C string
- *   char * HDf2cstring(fdesc, len)
+ *  char * HDf2cstring(fdesc, len)
  * INPUTS
  *   _fcd  fdesc;    IN: Fortran string descriptor
- *   int  len;       IN: length of Fortran string
+ *  int  len;       IN: length of Fortran string
  * RETURNS
- *   Pointer to the C string if success, else NULL
+ *  Pointer to the C string if success, else NULL
  * PURPOSE
- *   Chop off trailing blanks off of a Fortran string and
- *   move it into a newly allocated C string.  It is up
- *   to the user to free this string.
+ *  Chop off trailing blanks off of a Fortran string and
+ *  move it into a newly allocated C string.  It is up
+ *  to the user to free this string.
  * SOURCE
  */
 char *
@@ -72,21 +72,21 @@ HD5f2cstring(_fcd fdesc, size_t len)
 /****if* H5f90kit/HD5packFstring
  * NAME
  *   HD5packFstring -- convert a C string into a Fortran string
- *   int HD5packFstring(src, dest, len)
+ *  int HD5packFstring(src, dest, len)
  * INPUTS
- *   char * src;         IN:  source string
- *   int   len;          IN:  length of string
+ *  char * src;         IN:  source string
+ *  int   len;          IN:  length of string
  * OUTPUTS
- *   char * dest;       OUT: destination
+ *  char * dest;       OUT: destination
  * RETURNS
  *   SUCCEED / FAIL
  * PURPOSE
- *   given a NULL terminated C string 'src' convert it to
- *   a space padded Fortran string 'dest' of length 'len'
+ *  given a NULL terminated C string 'src' convert it to
+ *  a space padded Fortran string 'dest' of length 'len'
  *
- *   This is very similar to HDc2fstr except that function does
- *   it in place and this one copies.  We should probably only
- *   support one of these.
+ *  This is very similar to HDc2fstr except that function does
+ *  it in place and this one copies.  We should probably only
+ *  support one of these.
  * SOURCE
  */
 void
diff --git a/fortran/src/H5f90proto.h b/fortran/src/H5f90proto.h
index 4784440..f8b4564 100644
--- a/fortran/src/H5f90proto.h
+++ b/fortran/src/H5f90proto.h
@@ -18,6 +18,7 @@
 #define _H5f90proto_H
 
 #include "H5public.h"
+#include "H5f90.h"
 
 H5_FCDLL char * HD5f2cstring (_fcd fdesc, size_t len);
 H5_FCDLL void HD5packFstring(char *src, char *dest, size_t len);
@@ -77,1236 +78,508 @@ typedef struct H5O_info_t_f {
 /*
  *  Functions from H5Ff.c
  */
-#define nh5fcreate_c              H5_FC_FUNC_(h5fcreate_c, H5FCREATE_C)
-#define nh5fflush_c               H5_FC_FUNC_(h5fflush_c, H5FFLUSH_C)
-#define nh5fclose_c               H5_FC_FUNC_(h5fclose_c, H5FCLOSE_C)
-#define nh5fopen_c                H5_FC_FUNC_(h5fopen_c, H5FOPEN_C)
-#define nh5fis_hdf5_c             H5_FC_FUNC_(h5fis_hdf5_c, H5FIS_HDF5_C)
-#define nh5fmount_c               H5_FC_FUNC_(h5fmount_c, H5FMOUNT_C)
-#define nh5funmount_c             H5_FC_FUNC_(h5funmount_c, H5FUNMOUNT_C)
-#define nh5freopen_c              H5_FC_FUNC_(h5freopen_c, H5FREOPEN_C)
-#define nh5fget_create_plist_c    H5_FC_FUNC_(h5fget_create_plist_c, H5FGET_CREATE_PLIST_C)
-#define nh5fget_access_plist_c    H5_FC_FUNC_(h5fget_access_plist_c, H5FGET_ACCESS_PLIST_C)
-#define nh5fget_obj_count_c       H5_FC_FUNC_(h5fget_obj_count_c, H5FGET_OBJ_COUNT_C)
-#define nh5fget_obj_ids_c         H5_FC_FUNC_(h5fget_obj_ids_c, H5FGET_OBJ_IDS_C)
-#define nh5fget_freespace_c       H5_FC_FUNC_(h5fget_freespace_c, H5FGET_FREESPACE_C)
-#define nh5fget_name_c            H5_FC_FUNC_(h5fget_name_c, H5FGET_NAME_C)
-#define nh5fget_filesize_c        H5_FC_FUNC_(h5fget_filesize_c, H5FGET_FILESIZE_C)
-
-H5_FCDLL int_f nh5fcreate_c (_fcd name, int_f *namelen, int_f *access_flags, hid_t_f *crt_prp, hid_t_f *acc_prp, hid_t_f *file_id);
-H5_FCDLL int_f nh5fopen_c (_fcd name, int_f *namelen, int_f *access_flags, hid_t_f *acc_prp, hid_t_f *file_id);
-H5_FCDLL int_f nh5fis_hdf5_c (_fcd name, int_f *namelen, int_f *flag);
-H5_FCDLL int_f nh5fclose_c (hid_t_f *file_id);
-H5_FCDLL int_f nh5fmount_c (hid_t_f *loc_id, _fcd dsetname, int_f *namelen, hid_t_f *file_id, hid_t_f *acc_prp);
-H5_FCDLL int_f nh5funmount_c (hid_t_f *loc_id, _fcd dsetname, int_f *namelen);
-H5_FCDLL int_f nh5freopen_c (hid_t_f *file_id1, hid_t_f *file_id2);
-H5_FCDLL int_f nh5fget_create_plist_c (hid_t_f *file_id, hid_t_f *prop_id);
-H5_FCDLL int_f nh5fget_access_plist_c (hid_t_f *file_id, hid_t_f *access_id);
-H5_FCDLL int_f nh5fget_obj_count_c (hid_t_f *file_id, int_f *obj_type, size_t_f *obj_count);
-H5_FCDLL int_f nh5fget_obj_ids_c (hid_t_f *file_id, int_f *obj_type, size_t_f *max_objs, hid_t_f *obj_ids, size_t_f *num_objs);
-H5_FCDLL int_f nh5fget_freespace_c (hid_t_f *file_id, hssize_t_f *free_space);
+H5_FCDLL int_f h5fcreate_c(_fcd name, int_f *namelen, int_f *access_flags, hid_t_f *crt_prp, hid_t_f *acc_prp, hid_t_f *file_id);
+H5_FCDLL int_f h5fopen_c(_fcd name, int_f *namelen, int_f *access_flags, hid_t_f *acc_prp, hid_t_f *file_id);
+H5_FCDLL int_f h5fis_hdf5_c(_fcd name, int_f *namelen, int_f *flag);
+H5_FCDLL int_f h5fclose_c(hid_t_f *file_id);
+H5_FCDLL int_f h5fmount_c(hid_t_f *loc_id, _fcd dsetname, int_f *namelen, hid_t_f *file_id, hid_t_f *acc_prp);
+H5_FCDLL int_f h5funmount_c(hid_t_f *loc_id, _fcd dsetname, int_f *namelen);
+H5_FCDLL int_f h5freopen_c(hid_t_f *file_id1, hid_t_f *file_id2);
+H5_FCDLL int_f h5fget_create_plist_c(hid_t_f *file_id, hid_t_f *prop_id);
+H5_FCDLL int_f h5fget_access_plist_c(hid_t_f *file_id, hid_t_f *access_id);
+H5_FCDLL int_f h5fget_obj_count_c(hid_t_f *file_id, int_f *obj_type, size_t_f *obj_count);
+H5_FCDLL int_f h5fget_obj_ids_c(hid_t_f *file_id, int_f *obj_type, size_t_f *max_objs, hid_t_f *obj_ids, size_t_f *num_objs);
+H5_FCDLL int_f h5fget_freespace_c(hid_t_f *file_id, hssize_t_f *free_space);
 H5_FCDLL int_f h5fget_file_image_c(hid_t_f *file_id, void *buf_ptr, size_t_f *buf_len, size_t_f *buf_req);
-H5_FCDLL int_f nh5fflush_c (hid_t_f *obj_id, int_f *scope);
-H5_FCDLL int_f nh5fget_name_c(hid_t_f *obj_id, size_t_f *size, _fcd buf, size_t_f *buflen);
-H5_FCDLL int_f nh5fget_filesize_c(hid_t_f *file_id, hsize_t_f *size);
+H5_FCDLL int_f h5fflush_c(hid_t_f *obj_id, int_f *scope);
+H5_FCDLL int_f h5fget_name_c(hid_t_f *obj_id, size_t_f *size, _fcd buf, size_t_f *buflen);
+H5_FCDLL int_f h5fget_filesize_c(hid_t_f *file_id, hsize_t_f *size);
 
 /*
  * Functions from H5Sf.c
  */
-#define nh5screate_simple_c      H5_FC_FUNC_(h5screate_simple_c, H5SCREATE_SIMPLE_C)
-#define nh5sclose_c              H5_FC_FUNC_(h5sclose_c, H5SCLOSE_C)
-#define nh5screate_c             H5_FC_FUNC_(h5screate_c, H5SCREATE_C)
-#define nh5scopy_c               H5_FC_FUNC_(h5scopy_c, H5SCOPY_C)
-#define nh5sget_select_hyper_nblocks_c H5_FC_FUNC_(h5sget_select_hyper_nblocks_c, H5SGET_SELECT_HYPER_NBLOCKS_C)
-#define nh5sget_select_hyper_blocklist_c H5_FC_FUNC_(h5sget_select_hyper_blocklist_c, H5SGET_SELECT_HYPER_BLOCKLIST_C)
-#define nh5sget_select_elem_npoints_c H5_FC_FUNC_(h5sget_select_elem_npoints_c, H5SGET_SELECT_ELEM_NPOINTS_C)
-#define nh5sget_select_elem_pointlist_c H5_FC_FUNC_(h5sget_select_elem_pointlist_c, H5SGET_SELECT_ELEM_POINTLIST_C)
-#define nh5sget_select_bounds_c  H5_FC_FUNC_(h5sget_select_bounds_c, H5SGET_SELECT_BOUNDS_C)
-#define nh5sselect_all_c         H5_FC_FUNC_(h5sselect_all_c, H5SSELECT_ALL_C)
-#define nh5sselect_none_c        H5_FC_FUNC_(h5sselect_none_c, H5SSELECT_NONE_C)
-#define nh5sselect_valid_c       H5_FC_FUNC_(h5sselect_valid_c, H5SSELECT_VALID_C)
-#define nh5sget_simple_extent_npoints_c H5_FC_FUNC_(h5sget_simple_extent_npoints_c, H5SGET_SIMPLE_EXTENT_NPOINTS_C)
-#define nh5sget_select_npoints_c H5_FC_FUNC_(h5sget_select_npoints_c, H5SGET_SELECT_NPOINTS_C)
-#define nh5sget_simple_extent_ndims_c H5_FC_FUNC_(h5sget_simple_extent_ndims_c, H5SGET_SIMPLE_EXTENT_NDIMS_C)
-#define nh5sget_simple_extent_type_c  H5_FC_FUNC_(h5sget_simple_extent_type_c, H5SGET_SIMPLE_EXTENT_TYPE_C)
-#define nh5soffset_simple_c      H5_FC_FUNC_(h5soffset_simple_c, H5SOFFSET_SIMPLE_C)
-#define nh5sset_extent_simple_c  H5_FC_FUNC_(h5sset_extent_simple_c, H5SSET_EXTENT_SIMPLE_C)
-#define nh5sis_simple_c          H5_FC_FUNC_(h5sis_simple_c, H5SIS_SIMPLE_C)
-#define nh5sextent_class_c       H5_FC_FUNC_(h5sextent_class_c, H5SEXTENT_CLASS_C)
-#define nh5sget_simple_extent_dims_c H5_FC_FUNC_(h5sget_simple_extent_dims_c, H5SGET_SIMPLE_EXTENT_DIMS_C)
-#define nh5sextent_copy_c        H5_FC_FUNC_(h5sextent_copy_c, H5SEXTENT_COPY_C)
-#define nh5sset_extent_none_c    H5_FC_FUNC_(h5sset_extent_none_c, H5SSET_EXTENT_NONE_C)
-#define nh5sselect_hyperslab_c   H5_FC_FUNC_(h5sselect_hyperslab_c, H5SSELECT_HYPERSLAB_C)
-#define nh5scombine_hyperslab_c   H5_FC_FUNC_(h5scombine_hyperslab_c, H5SCOMBINE_HYPERSLAB_C)
-#define nh5scombine_select_c   H5_FC_FUNC_(h5scombine_select_c, H5SCOMBINE_SELECT_C)
-#define nh5sselect_select_c   H5_FC_FUNC_(h5sselect_select_c, H5SSELECT_SELECT_C)
-#define nh5sget_select_type_c   H5_FC_FUNC_(h5sget_select_type_c, H5SGET_SELECT_TYPE_C)
-#define nh5sselect_elements_c    H5_FC_FUNC_(h5sselect_elements_c, H5SSELECT_ELEMENTS_C)
-#define nh5sdecode_c    H5_FC_FUNC_(h5sdecode_c, H5SDECODE_C)
-#define nh5sencode_c    H5_FC_FUNC_(h5sencode_c, H5SENCODE_C)
-#define nh5sextent_equal_c    H5_FC_FUNC_(h5sextent_equal_c, H5SEXTENT_EQUAL_C)
-
-H5_FCDLL int_f nh5screate_simple_c ( int_f *rank, hsize_t_f *dims, hsize_t_f *maxdims, hid_t_f *space_id );
-H5_FCDLL int_f nh5sclose_c ( hid_t_f *space_id );
-H5_FCDLL int_f nh5screate_c ( int_f *classtype, hid_t_f *space_id );
-H5_FCDLL int_f nh5scopy_c ( hid_t_f *space_id , hid_t_f *new_space_id);
-H5_FCDLL int_f nh5sget_select_hyper_nblocks_c( hid_t_f *space_id , hssize_t_f * num_blocks);
-H5_FCDLL int_f nh5sget_select_hyper_blocklist_c( hid_t_f *space_id ,hsize_t_f * startblock, hsize_t_f * num_blocks, hsize_t_f * buf);
-H5_FCDLL int_f nh5sget_select_bounds_c( hid_t_f *space_id , hsize_t_f * start, hsize_t_f * end);
-H5_FCDLL int_f nh5sget_select_elem_npoints_c( hid_t_f *space_id , hssize_t_f * num_points);
-H5_FCDLL int_f nh5sget_select_elem_pointlist_c( hid_t_f *space_id ,hsize_t_f * startpoint, hsize_t_f * numpoints, hsize_t_f * buf);
-H5_FCDLL int_f nh5sselect_all_c ( hid_t_f *space_id );
-H5_FCDLL int_f nh5sselect_none_c ( hid_t_f *space_id );
-H5_FCDLL int_f nh5sselect_valid_c ( hid_t_f *space_id , int_f *flag );
-H5_FCDLL int_f nh5sget_simple_extent_npoints_c ( hid_t_f *space_id , hsize_t_f *npoints );
-H5_FCDLL int_f nh5sget_select_npoints_c ( hid_t_f *space_id , hssize_t_f *npoints );
-H5_FCDLL int_f nh5sget_simple_extent_ndims_c ( hid_t_f *space_id , int_f *ndims );
-H5_FCDLL int_f nh5sget_simple_extent_type_c ( hid_t_f *space_id , int_f *classtype);
-H5_FCDLL int_f nh5soffset_simple_c ( hid_t_f *space_id , hssize_t_f *offset);
-H5_FCDLL int_f nh5sset_extent_simple_c ( hid_t_f *space_id , int_f *rank, hsize_t_f * current_size, hsize_t_f *maximum_size);
-H5_FCDLL int_f nh5sis_simple_c ( hid_t_f *space_id , int_f *flag );
-H5_FCDLL int_f nh5sextent_class_c ( hid_t_f *space_id , int_f *classtype);
-H5_FCDLL int_f nh5sget_simple_extent_dims_c ( hid_t_f *space_id , hsize_t_f *dims, hsize_t_f *maxdims);
-H5_FCDLL int_f nh5sextent_copy_c ( hid_t_f *dest_space_id , hid_t_f *source_space_id);
-H5_FCDLL int_f nh5sset_extent_none_c ( hid_t_f *space_id );
-H5_FCDLL int_f nh5sselect_hyperslab_c ( hid_t_f *space_id , int_f *op, hsize_t_f *start, hsize_t_f *count, hsize_t_f *stride, hsize_t_f *block);
-H5_FCDLL int_f nh5sget_select_type_c ( hid_t_f *space_id , int_f *op);
-H5_FCDLL int_f nh5sselect_elements_c ( hid_t_f *space_id , int_f *op, size_t_f *nelements, hsize_t_f *coord);
-H5_FCDLL int_f nh5scombine_hyperslab_c ( hid_t_f *space_id , int_f *op, hsize_t_f *start, hsize_t_f *count, hsize_t_f *stride, hsize_t_f *block, hid_t_f *hyper_id);
-H5_FCDLL int_f nh5scombine_select_c ( hid_t_f *space1_id , int_f *op, hid_t_f *space2_id, hid_t_f *ds_id);
-H5_FCDLL int_f nh5sselect_select_c ( hid_t_f *space1_id , int_f *op, hid_t_f *space2_id);
-H5_FCDLL int_f nh5sdecode_c ( _fcd buf, hid_t_f *obj_id );
-H5_FCDLL int_f nh5sencode_c (_fcd buf, hid_t_f *obj_id, size_t_f *nalloc );
-H5_FCDLL int_f nh5sextent_equal_c ( hid_t_f * space1_id, hid_t_f *space2_id, hid_t_f *c_equal);
+H5_FCDLL int_f h5screate_simple_c( int_f *rank, hsize_t_f *dims, hsize_t_f *maxdims, hid_t_f *space_id );
+H5_FCDLL int_f h5sclose_c( hid_t_f *space_id );
+H5_FCDLL int_f h5screate_c( int_f *classtype, hid_t_f *space_id );
+H5_FCDLL int_f h5scopy_c( hid_t_f *space_id , hid_t_f *new_space_id);
+H5_FCDLL int_f h5sget_select_hyper_nblocks_c( hid_t_f *space_id , hssize_t_f * num_blocks);
+H5_FCDLL int_f h5sget_select_hyper_blocklist_c( hid_t_f *space_id ,hsize_t_f * startblock, hsize_t_f * num_blocks, hsize_t_f * buf);
+H5_FCDLL int_f h5sget_select_bounds_c( hid_t_f *space_id , hsize_t_f * start, hsize_t_f * end);
+H5_FCDLL int_f h5sget_select_elem_npoints_c( hid_t_f *space_id , hssize_t_f * num_points);
+H5_FCDLL int_f h5sget_select_elem_pointlist_c( hid_t_f *space_id ,hsize_t_f * startpoint, hsize_t_f * numpoints, hsize_t_f * buf);
+H5_FCDLL int_f h5sselect_all_c( hid_t_f *space_id );
+H5_FCDLL int_f h5sselect_none_c( hid_t_f *space_id );
+H5_FCDLL int_f h5sselect_valid_c( hid_t_f *space_id , int_f *flag );
+H5_FCDLL int_f h5sget_simple_extent_npoints_c( hid_t_f *space_id , hsize_t_f *npoints );
+H5_FCDLL int_f h5sget_select_npoints_c( hid_t_f *space_id , hssize_t_f *npoints );
+H5_FCDLL int_f h5sget_simple_extent_ndims_c( hid_t_f *space_id , int_f *ndims );
+H5_FCDLL int_f h5sget_simple_extent_type_c( hid_t_f *space_id , int_f *classtype);
+H5_FCDLL int_f h5soffset_simple_c( hid_t_f *space_id , hssize_t_f *offset);
+H5_FCDLL int_f h5sset_extent_simple_c( hid_t_f *space_id , int_f *rank, hsize_t_f * current_size, hsize_t_f *maximum_size);
+H5_FCDLL int_f h5sis_simple_c( hid_t_f *space_id , int_f *flag );
+H5_FCDLL int_f h5sget_simple_extent_dims_c( hid_t_f *space_id , hsize_t_f *dims, hsize_t_f *maxdims);
+H5_FCDLL int_f h5sextent_copy_c( hid_t_f *dest_space_id , hid_t_f *source_space_id);
+H5_FCDLL int_f h5sset_extent_none_c( hid_t_f *space_id );
+H5_FCDLL int_f h5sselect_hyperslab_c( hid_t_f *space_id , int_f *op, hsize_t_f *start, hsize_t_f *count, hsize_t_f *stride, hsize_t_f *block);
+H5_FCDLL int_f h5sget_select_type_c( hid_t_f *space_id , int_f *op);
+H5_FCDLL int_f h5sselect_elements_c( hid_t_f *space_id , int_f *op, size_t_f *nelements, hsize_t_f *coord);
+H5_FCDLL int_f h5scombine_hyperslab_c( hid_t_f *space_id , int_f *op, hsize_t_f *start, hsize_t_f *count, hsize_t_f *stride, hsize_t_f *block, hid_t_f *hyper_id);
+H5_FCDLL int_f h5scombine_select_c( hid_t_f *space1_id , int_f *op, hid_t_f *space2_id, hid_t_f *ds_id);
+H5_FCDLL int_f h5sselect_select_c( hid_t_f *space1_id , int_f *op, hid_t_f *space2_id);
+H5_FCDLL int_f h5sdecode_c( _fcd buf, hid_t_f *obj_id );
+H5_FCDLL int_f h5sencode_c(_fcd buf, hid_t_f *obj_id, size_t_f *nalloc );
+H5_FCDLL int_f h5sextent_equal_c( hid_t_f * space1_id, hid_t_f *space2_id, hid_t_f *c_equal);
 
 /*
  * Functions from H5Df.c
  */
-#define nh5dcreate_c                H5_FC_FUNC_(h5dcreate_c, H5DCREATE_C)
-#define nh5dclose_c                 H5_FC_FUNC_(h5dclose_c, H5DCLOSE_C)
-#define nh5dopen_c                  H5_FC_FUNC_(h5dopen_c, H5DOPEN_C)
-#define nh5dwrite_c                 H5_FC_FUNC_(h5dwrite_c, H5DWRITE_C)
-#define nh5dwrite_integer_s_c       H5_FC_FUNC_(h5dwrite_integer_s_c, H5DWRITE_INTEGER_S_C)
-#define nh5dwrite_integer_1_c       H5_FC_FUNC_(h5dwrite_integer_1_c, H5DWRITE_INTEGER_1_C)
-#define nh5dwrite_integer_2_c       H5_FC_FUNC_(h5dwrite_integer_2_c, H5DWRITE_INTEGER_2_C)
-#define nh5dwrite_integer_3_c       H5_FC_FUNC_(h5dwrite_integer_3_c, H5DWRITE_INTEGER_3_C)
-#define nh5dwrite_integer_4_c       H5_FC_FUNC_(h5dwrite_integer_4_c, H5DWRITE_INTEGER_4_C)
-#define nh5dwrite_integer_5_c       H5_FC_FUNC_(h5dwrite_integer_5_c, H5DWRITE_INTEGER_5_C)
-#define nh5dwrite_integer_6_c       H5_FC_FUNC_(h5dwrite_integer_6_c, H5DWRITE_INTEGER_6_C)
-#define nh5dwrite_integer_7_c       H5_FC_FUNC_(h5dwrite_integer_7_c, H5DWRITE_INTEGER_7_C)
-#define nh5dwrite_real_s_c          H5_FC_FUNC_(h5dwrite_real_s_c, H5DWRITE_REAL_S_C)
-#define nh5dwrite_real_1_c          H5_FC_FUNC_(h5dwrite_real_1_c, H5DWRITE_REAL_1_C)
-#define nh5dwrite_real_2_c          H5_FC_FUNC_(h5dwrite_real_2_c, H5DWRITE_REAL_2_C)
-#define nh5dwrite_real_3_c          H5_FC_FUNC_(h5dwrite_real_3_c, H5DWRITE_REAL_3_C)
-#define nh5dwrite_real_4_c          H5_FC_FUNC_(h5dwrite_real_4_c, H5DWRITE_REAL_4_C)
-#define nh5dwrite_real_5_c          H5_FC_FUNC_(h5dwrite_real_5_c, H5DWRITE_REAL_5_C)
-#define nh5dwrite_real_6_c          H5_FC_FUNC_(h5dwrite_real_6_c, H5DWRITE_REAL_6_C)
-#define nh5dwrite_real_7_c          H5_FC_FUNC_(h5dwrite_real_7_c, H5DWRITE_REAL_7_C)
-#define nh5dwrite_double_s_c        H5_FC_FUNC_(h5dwrite_double_s_c, H5DWRITE_DOUBLE_S_C)
-#define nh5dwrite_double_1_c        H5_FC_FUNC_(h5dwrite_double_1_c, H5DWRITE_DOUBLE_1_C)
-#define nh5dwrite_double_2_c        H5_FC_FUNC_(h5dwrite_double_2_c, H5DWRITE_DOUBLE_2_C)
-#define nh5dwrite_double_3_c        H5_FC_FUNC_(h5dwrite_double_3_c, H5DWRITE_DOUBLE_3_C)
-#define nh5dwrite_double_4_c        H5_FC_FUNC_(h5dwrite_double_4_c, H5DWRITE_DOUBLE_4_C)
-#define nh5dwrite_double_5_c        H5_FC_FUNC_(h5dwrite_double_5_c, H5DWRITE_DOUBLE_5_C)
-#define nh5dwrite_double_6_c        H5_FC_FUNC_(h5dwrite_double_6_c, H5DWRITE_DOUBLE_6_C)
-#define nh5dwrite_double_7_c        H5_FC_FUNC_(h5dwrite_double_7_c, H5DWRITE_DOUBLE_7_C)
-#define nh5dwrite_ref_obj_c         H5_FC_FUNC_(h5dwrite_ref_obj_c, H5DWRITE_REF_OBJ_C)
-#define nh5dwrite_ref_reg_c         H5_FC_FUNC_(h5dwrite_ref_reg_c, H5DWRITE_REF_REG_C)
-#define nh5dwritec_c                H5_FC_FUNC_(h5dwritec_c, H5DWRITEC_C)
-#define nh5dwritec_s_c                H5_FC_FUNC_(h5dwritec_s_c, H5DWRITEC_S_C)
-#define nh5dwritec_1_c                H5_FC_FUNC_(h5dwritec_1_c, H5DWRITEC_1_C)
-#define nh5dwritec_2_c                H5_FC_FUNC_(h5dwritec_2_c, H5DWRITEC_2_C)
-#define nh5dwritec_3_c                H5_FC_FUNC_(h5dwritec_3_c, H5DWRITEC_3_C)
-#define nh5dwritec_4_c                H5_FC_FUNC_(h5dwritec_4_c, H5DWRITEC_4_C)
-#define nh5dwritec_5_c                H5_FC_FUNC_(h5dwritec_5_c, H5DWRITEC_5_C)
-#define nh5dwritec_6_c                H5_FC_FUNC_(h5dwritec_6_c, H5DWRITEC_6_C)
-#define nh5dwritec_7_c                H5_FC_FUNC_(h5dwritec_7_c, H5DWRITEC_7_C)
-#define nh5dread_c                  H5_FC_FUNC_(h5dread_c, H5DREAD_C)
-#define nh5dread_integer_s_c                 H5_FC_FUNC_(h5dread_integer_s_c, H5DREAD_INTEGER_S_C)
-#define nh5dread_integer_1_c                 H5_FC_FUNC_(h5dread_integer_1_c, H5DREAD_INTEGER_1_C)
-#define nh5dread_integer_2_c                 H5_FC_FUNC_(h5dread_integer_2_c, H5DREAD_INTEGER_2_C)
-#define nh5dread_integer_3_c                 H5_FC_FUNC_(h5dread_integer_3_c, H5DREAD_INTEGER_3_C)
-#define nh5dread_integer_4_c                 H5_FC_FUNC_(h5dread_integer_4_c, H5DREAD_INTEGER_4_C)
-#define nh5dread_integer_5_c                 H5_FC_FUNC_(h5dread_integer_5_c, H5DREAD_INTEGER_5_C)
-#define nh5dread_integer_6_c                 H5_FC_FUNC_(h5dread_integer_6_c, H5DREAD_INTEGER_6_C)
-#define nh5dread_integer_7_c                 H5_FC_FUNC_(h5dread_integer_7_c, H5DREAD_INTEGER_7_C)
-#define nh5dread_real_s_c                 H5_FC_FUNC_(h5dread_real_s_c, H5DREAD_REAL_S_C)
-#define nh5dread_real_1_c                 H5_FC_FUNC_(h5dread_real_1_c, H5DREAD_REAL_1_C)
-#define nh5dread_real_2_c                 H5_FC_FUNC_(h5dread_real_2_c, H5DREAD_REAL_2_C)
-#define nh5dread_real_3_c                 H5_FC_FUNC_(h5dread_real_3_c, H5DREAD_REAL_3_C)
-#define nh5dread_real_4_c                 H5_FC_FUNC_(h5dread_real_4_c, H5DREAD_REAL_4_C)
-#define nh5dread_real_5_c                 H5_FC_FUNC_(h5dread_real_5_c, H5DREAD_REAL_5_C)
-#define nh5dread_real_6_c                 H5_FC_FUNC_(h5dread_real_6_c, H5DREAD_REAL_6_C)
-#define nh5dread_real_7_c                 H5_FC_FUNC_(h5dread_real_7_c, H5DREAD_REAL_7_C)
-#define nh5dread_double_s_c                 H5_FC_FUNC_(h5dread_double_s_c, H5DREAD_DOUBLE_S_C)
-#define nh5dread_double_1_c                 H5_FC_FUNC_(h5dread_double_1_c, H5DREAD_DOUBLE_1_C)
-#define nh5dread_double_2_c                 H5_FC_FUNC_(h5dread_double_2_c, H5DREAD_DOUBLE_2_C)
-#define nh5dread_double_3_c                 H5_FC_FUNC_(h5dread_double_3_c, H5DREAD_DOUBLE_3_C)
-#define nh5dread_double_4_c                 H5_FC_FUNC_(h5dread_double_4_c, H5DREAD_DOUBLE_4_C)
-#define nh5dread_double_5_c                 H5_FC_FUNC_(h5dread_double_5_c, H5DREAD_DOUBLE_5_C)
-#define nh5dread_double_6_c                 H5_FC_FUNC_(h5dread_double_6_c, H5DREAD_DOUBLE_6_C)
-#define nh5dread_double_7_c                 H5_FC_FUNC_(h5dread_double_7_c, H5DREAD_DOUBLE_7_C)
-#define nh5dread_c_b                H5_FC_FUNC_(h5dread_c_b, H5DREAD_C_B)
-#define nh5dread_ref_reg_c          H5_FC_FUNC_(h5dread_ref_reg_c, H5DREAD_REF_REG_C)
-#define nh5dread_ref_obj_c          H5_FC_FUNC_(h5dread_ref_obj_c, H5DREAD_REF_OBJ_C)
-#define nh5dreadc_c                 H5_FC_FUNC_(h5dreadc_c, H5DREADC_C)
-#define nh5dreadc_s_c                 H5_FC_FUNC_(h5dreadc_s_c, H5DREADC_S_C)
-#define nh5dreadc_1_c                 H5_FC_FUNC_(h5dreadc_1_c, H5DREADC_1_C)
-#define nh5dreadc_2_c                 H5_FC_FUNC_(h5dreadc_2_c, H5DREADC_2_C)
-#define nh5dreadc_3_c                 H5_FC_FUNC_(h5dreadc_3_c, H5DREADC_3_C)
-#define nh5dreadc_4_c                 H5_FC_FUNC_(h5dreadc_4_c, H5DREADC_4_C)
-#define nh5dreadc_5_c                 H5_FC_FUNC_(h5dreadc_5_c, H5DREADC_5_C)
-#define nh5dreadc_6_c                 H5_FC_FUNC_(h5dreadc_6_c, H5DREADC_6_C)
-#define nh5dreadc_7_c                 H5_FC_FUNC_(h5dreadc_7_c, H5DREADC_7_C)
-#define nh5dreadc_c_b               H5_FC_FUNC_(h5dreadc_c_b, H5DREADC_C_B)
-#define nh5dget_space_c             H5_FC_FUNC_(h5dget_space_c, H5DGET_SPACE_C)
-#define nh5dget_type_c              H5_FC_FUNC_(h5dget_type_c, H5DGET_TYPE_C)
-#define nh5dget_create_plist_c      H5_FC_FUNC_(h5dget_create_plist_c, H5DGET_CREATE_PLIST_C)
-#define nh5dset_extent_c            H5_FC_FUNC_(h5dset_extent_c, H5DSET_EXTENT_C)
-#define nh5dget_storage_size_c      H5_FC_FUNC_(h5dget_storage_size_c, H5DGET_STORAGE_SIZE_C)
-#define nh5dvlen_get_max_len_c      H5_FC_FUNC_(h5dvlen_get_max_len_c, H5DVLEN_GET_MAX_LEN_C)
-#define nh5dwrite_vl_integer_c      H5_FC_FUNC_(h5dwrite_vl_integer_c, H5DWRITE_VL_INTEGER_C)
-#define nh5dread_vl_integer_c       H5_FC_FUNC_(h5dread_vl_integer_c, H5DREAD_VL_INTEGER_C)
-#define nh5dwrite_vl_real_c         H5_FC_FUNC_(h5dwrite_vl_real_c, H5DWRITE_VL_REAL_C)
-#define nh5dread_vl_real_c          H5_FC_FUNC_(h5dread_vl_real_c, H5DREAD_VL_REAL_C)
-#define nh5dwrite_vl_string_c       H5_FC_FUNC_(h5dwrite_vl_string_c, H5DWRITE_VL_STRING_C)
-#define nh5dread_vl_string_c        H5_FC_FUNC_(h5dread_vl_string_c, H5DREAD_VL_STRING_C)
-#define nh5dfillc_c                 H5_FC_FUNC_(h5dfillc_c, H5DFILLC_C)
-#define nh5dfill_integer_c                  H5_FC_FUNC_(h5dfill_integer_c, H5DFILL_INTEGER_C)
-#define nh5dfill_real_c                  H5_FC_FUNC_(h5dfill_real_c, H5DFILL_REAL_C)
-#define nh5dfill_double_c                  H5_FC_FUNC_(h5dfill_double_c, H5DFILL_DOUBLE_C)
-#define nh5dget_space_status_c    H5_FC_FUNC_(h5dget_space_status_c, H5DGET_SPACE_STATUS_C)
-#define nh5dcreate_anon_c         H5_FC_FUNC_(h5dcreate_anon_c, H5DCREATE_ANON_C)
-#define nh5dget_access_plist_c    H5_FC_FUNC_(h5dget_access_plist_c, H5DGET_ACCESS_PLIST_C)
 
-
-H5_FCDLL int_f nh5dcreate_c (hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *type_id, hid_t_f *space_id,
+H5_FCDLL int_f h5dcreate_c(hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *type_id, hid_t_f *space_id,
 			     hid_t_f *lcpl_id, hid_t_f *dcpl_id, hid_t_f *dapl_id, hid_t_f *dset_id);
-H5_FCDLL int_f nh5dopen_c (hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *dapl_id, hid_t_f *dset_id);
-H5_FCDLL int_f nh5dclose_c ( hid_t_f *dset_id );
-H5_FCDLL int_f nh5dwrite_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_integer_s_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_integer_1_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_integer_2_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_integer_3_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_integer_4_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_integer_5_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_integer_6_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_integer_7_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-
-H5_FCDLL int_f nh5dwrite_real_s_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_real_1_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_real_2_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_real_3_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_real_4_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_real_5_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_real_6_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_real_7_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-
-H5_FCDLL int_f nh5dwrite_double_s_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_double_1_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_double_2_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_double_3_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_double_4_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_double_5_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_double_6_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_double_7_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-
-H5_FCDLL int_f nh5dwrite_vl_integer_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, int_f *buf, hsize_t_f *dims, size_t_f *len);
-H5_FCDLL int_f nh5dwrite_vl_real_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, real_f *buf, hsize_t_f *dims, size_t_f *len);
-H5_FCDLL int_f nh5dwrite_vl_string_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims, size_t_f *len);
-H5_FCDLL int_f nh5dwrite_ref_obj_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, haddr_t_f *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwrite_ref_reg_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, int_f *buf, hsize_t_f *dims);
-
-H5_FCDLL int_f nh5dwritec_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims);
-
-H5_FCDLL int_f nh5dwritec_s_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwritec_1_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwritec_2_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwritec_3_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwritec_4_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwritec_5_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwritec_6_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dwritec_7_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims);
-
-H5_FCDLL int_f nh5dread_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-
-H5_FCDLL int_f nh5dread_integer_s_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_integer_1_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_integer_2_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_integer_3_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_integer_4_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_integer_5_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_integer_6_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_integer_7_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-
-H5_FCDLL int_f nh5dread_real_s_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_real_1_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_real_2_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_real_3_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_real_4_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_real_5_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_real_6_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_real_7_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-
-H5_FCDLL int_f nh5dread_double_s_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_double_1_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_double_2_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_double_3_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_double_4_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_double_5_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_double_6_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_double_7_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf, hsize_t_f *dims);
-
-H5_FCDLL int_f nh5dread_vl_integer_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, int_f *buf, hsize_t_f *dims, size_t_f *len);
-H5_FCDLL int_f nh5dread_vl_real_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, real_f *buf, hsize_t_f *dims, size_t_f *len);
-H5_FCDLL int_f nh5dread_vl_string_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims, size_t_f *len);
-H5_FCDLL int_f nh5dread_ref_obj_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, haddr_t_f * buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dread_ref_reg_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, int_f * buf, hsize_t_f *dims);
-
-H5_FCDLL int_f nh5dreadc_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims);
-
-H5_FCDLL int_f nh5dreadc_s_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dreadc_1_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dreadc_2_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dreadc_3_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dreadc_4_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dreadc_5_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dreadc_6_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dreadc_7_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims);
-H5_FCDLL int_f nh5dget_access_plist_c (hid_t_f *dset_id, hid_t_f *plist_id);
-
-
-H5_FCDLL int_f nh5dget_space_c ( hid_t_f *dset_id , hid_t_f *space_id);
-H5_FCDLL int_f nh5dget_type_c ( hid_t_f *dset_id , hid_t_f *type_id);
-H5_FCDLL int_f nh5dget_create_plist_c ( hid_t_f *dset_id , hid_t_f *plist_id);
-H5_FCDLL int_f nh5dset_extent_c ( hid_t_f *dset_id , hsize_t_f *dims);
-H5_FCDLL int_f nh5dvlen_get_max_len_c(hid_t_f *dataset_id, hid_t_f *type_id, hid_t_f *space_id, size_t_f *len);
-H5_FCDLL int_f nh5dget_storage_size_c(hid_t_f *dataset_id, hsize_t_f *size);
-H5_FCDLL int_f nh5dfillc_c(_fcd fill_value, hid_t_f *fill_type_id, hid_t_f *space_id, _fcd buf, hid_t_f *mem_type_id);
+H5_FCDLL int_f h5dopen_c(hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *dapl_id, hid_t_f *dset_id);
+H5_FCDLL int_f h5dclose_c( hid_t_f *dset_id );
+
+H5_FCDLL int_f h5dwrite_vl_integer_c(hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, int_f *buf, hsize_t_f *dims, size_t_f *len);
+H5_FCDLL int_f h5dwrite_vl_real_c(hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, real_f *buf, hsize_t_f *dims, size_t_f *len);
+H5_FCDLL int_f h5dwrite_vl_string_c(hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims, size_t_f *len);
+H5_FCDLL int_f h5dwrite_ref_reg_c(hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, int_f *buf, hsize_t_f *dims);
+H5_FCDLL int_f h5dread_vl_integer_c(hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, int_f *buf, hsize_t_f *dims, size_t_f *len);
+H5_FCDLL int_f h5dread_vl_real_c(hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, real_f *buf, hsize_t_f *dims, size_t_f *len);
+H5_FCDLL int_f h5dread_vl_string_c(hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, _fcd buf, hsize_t_f *dims, size_t_f *len);
+H5_FCDLL int_f h5dread_ref_reg_c(hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, hid_t_f *file_space_id, hid_t_f *xfer_prp, int_f * buf, hsize_t_f *dims);
+H5_FCDLL int_f h5dget_access_plist_c(hid_t_f *dset_id, hid_t_f *plist_id);
+H5_FCDLL int_f h5dget_space_c( hid_t_f *dset_id , hid_t_f *space_id);
+H5_FCDLL int_f h5dget_type_c( hid_t_f *dset_id , hid_t_f *type_id);
+H5_FCDLL int_f h5dget_create_plist_c( hid_t_f *dset_id , hid_t_f *plist_id);
+H5_FCDLL int_f h5dset_extent_c( hid_t_f *dset_id , hsize_t_f *dims);
+H5_FCDLL int_f h5dvlen_get_max_len_c(hid_t_f *dataset_id, hid_t_f *type_id, hid_t_f *space_id, size_t_f *len);
+H5_FCDLL int_f h5dget_storage_size_c(hid_t_f *dataset_id, hsize_t_f *size);
 H5_FCDLL int_f h5dfill_c(void * fill_value, hid_t_f *fill_type_id, hid_t_f *space_id, void * buf, hid_t_f *mem_type_id);
-H5_FCDLL int_f nh5dfill_integer_c(void * fill_value, hid_t_f *fill_type_id, hid_t_f *space_id, void * buf, hid_t_f *mem_type_id);
-H5_FCDLL int_f nh5dfill_real_c(void * fill_value, hid_t_f *fill_type_id, hid_t_f *space_id, void * buf, hid_t_f *mem_type_id);
-H5_FCDLL int_f nh5dfill_double_c(void * fill_value, hid_t_f *fill_type_id, hid_t_f *space_id, void * buf, hid_t_f *mem_type_id);
-H5_FCDLL int_f nh5dget_space_status_c ( hid_t_f *dset_id, int_f *flag);
-H5_FCDLL int_f nh5dcreate_anon_c (hid_t_f *loc_id, hid_t_f *type_id, hid_t_f *space_id,
+H5_FCDLL int_f h5dget_space_status_c( hid_t_f *dset_id, int_f *flag);
+H5_FCDLL int_f h5dcreate_anon_c(hid_t_f *loc_id, hid_t_f *type_id, hid_t_f *space_id,
 				  hid_t_f *dcpl_id, hid_t_f *dapl_id, hid_t_f *dset_id);
-H5_FCDLL int_f h5dwrite_f_c (hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, 
+H5_FCDLL int_f h5dwrite_f_c(hid_t_f *dset_id, hid_t_f *mem_type_id, hid_t_f *mem_space_id, 
 				   hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf);
-H5_FCDLL int_f h5dread_f_c ( hid_t_f *dset_id ,  hid_t_f *mem_type_id, hid_t_f *mem_space_id, 
+H5_FCDLL int_f h5dread_f_c( hid_t_f *dset_id ,  hid_t_f *mem_type_id, hid_t_f *mem_space_id, 
 				   hid_t_f *file_space_id, hid_t_f *xfer_prp, void *buf);
-H5_FCDLL int_f h5dvlen_reclaim_c (hid_t_f *type_id ,  hid_t_f *space_id, hid_t_f *plist_id, void *buf);
+H5_FCDLL int_f h5dvlen_reclaim_c(hid_t_f *type_id ,  hid_t_f *space_id, hid_t_f *plist_id, void *buf);
+
 /*
  * Functions from H5Gf.c
  */
-#define nh5gcreate_c      H5_FC_FUNC_(h5gcreate_c, H5GCREATE_C)
-#define nh5gclose_c       H5_FC_FUNC_(h5gclose_c, H5GCLOSE_C)
-#define nh5gopen_c        H5_FC_FUNC_(h5gopen_c, H5GOPEN_C)
-#define nh5gget_obj_info_idx_c H5_FC_FUNC_(h5gget_obj_info_idx_c, H5GGET_OBJ_INFO_IDX_C)
-#define nh5gn_members_c   H5_FC_FUNC_(h5gn_members_c, H5GN_MEMBERS_C)
-#define nh5glink_c        H5_FC_FUNC_(h5glink_c, H5GLINK_C)
-#define nh5glink2_c        H5_FC_FUNC_(h5glink2_c, H5GLINK2_C)
-#define nh5gunlink_c      H5_FC_FUNC_(h5gunlink_c, H5GUNLINK_C)
-#define nh5gmove_c        H5_FC_FUNC_(h5gmove_c, H5GMOVE_C)
-#define nh5gmove2_c        H5_FC_FUNC_(h5gmove2_c, H5GMOVE2_C)
-#define nh5gget_linkval_c   H5_FC_FUNC_(h5gget_linkval_c, H5GGET_LINKVAL_C)
-#define nh5gset_comment_c   H5_FC_FUNC_(h5gset_comment_c, H5GSET_COMMENT_C)
-#define nh5gget_comment_c   H5_FC_FUNC_(h5gget_comment_c, H5GGET_COMMENT_C)
-#define nh5gcreate_anon_c      H5_FC_FUNC_(h5gcreate_anon_c, H5GCREATE_ANON_C)
-#define nh5gget_create_plist_c H5_FC_FUNC_(h5gget_create_plist_c, H5GGET_CREATE_PLIST_C)
-#define nh5gget_info_c  H5_FC_FUNC_(h5gget_info_c, H5GGET_INFO_C)
-#define nh5gget_info_by_idx_c  H5_FC_FUNC_(h5gget_info_by_idx_c, H5GGET_INFO_BY_IDX_C)
-#define nh5gget_info_by_name_c  H5_FC_FUNC_(h5gget_info_by_name_c, H5GGET_INFO_BY_NAME_C)
-
-
-H5_FCDLL int_f nh5gcreate_c (hid_t_f *loc_id, _fcd name, int_f *namelen, size_t_f *size_hint,  hid_t_f *grp_id,
+H5_FCDLL int_f h5gcreate_c(hid_t_f *loc_id, _fcd name, int_f *namelen, size_t_f *size_hint,  hid_t_f *grp_id,
 			     hid_t_f *lcpl_id, hid_t_f *gcpl_id, hid_t_f *gapl_id);
-H5_FCDLL int_f nh5gopen_c (hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *gapl_id, hid_t_f *grp_id);
-H5_FCDLL int_f nh5gclose_c ( hid_t_f *grp_id );
-H5_FCDLL int_f nh5gget_obj_info_idx_c (hid_t_f *loc_id, _fcd name, int_f *namelen, int_f *idx, _fcd obj_name, int_f *obj_namelen, int_f *obj_type);
-H5_FCDLL int_f nh5gn_members_c (hid_t_f *loc_id, _fcd name, int_f *namelen, int_f *nmembers);
-H5_FCDLL int_f nh5glink_c (hid_t_f *loc_id, int_f *link_type, _fcd current_name, int_f *current_namelen, _fcd new_name, int_f *new_namelen);
-H5_FCDLL int_f nh5glink2_c (hid_t_f *cur_loc_id, _fcd cur_name, int_f *cur_namelen, int_f *link_type, hid_t_f *new_loc_id, _fcd new_name, int_f *new_namelen);
-H5_FCDLL int_f nh5gunlink_c (hid_t_f *loc_id, _fcd name, int_f *namelen);
-H5_FCDLL int_f nh5gmove_c (hid_t_f *loc_id, _fcd src_name, int_f *src_namelen, _fcd dst_name, int_f *dst_namelen);
-H5_FCDLL int_f nh5gmove2_c (hid_t_f *src_loc_id, _fcd src_name, int_f *src_namelen, hid_t_f *dst_loc_id,_fcd dst_name, int_f *dst_namelen);
-H5_FCDLL int_f nh5gget_linkval_c (hid_t_f *loc_id, _fcd name, int_f *namelen, size_t_f *size, _fcd value );
-H5_FCDLL int_f nh5gset_comment_c (hid_t_f *loc_id, _fcd name, int_f *namelen, _fcd comment, int_f *commentlen);
-H5_FCDLL int_f nh5gget_comment_c (hid_t_f *loc_id, _fcd name, int_f *namelen, size_t_f *bufsize, _fcd comment);
-H5_FCDLL int_f nh5gcreate_anon_c (hid_t_f *loc_id, hid_t_f *gcpl_id, hid_t_f *gapl_id, hid_t_f *grp_id);
-H5_FCDLL int_f nh5gget_create_plist_c(hid_t_f *grp_id, hid_t_f *gcpl_id );
-H5_FCDLL int_f nh5gget_info_c (hid_t_f *group_id, int_f *storage_type, int_f *nlinks, int_f *max_corder, int_f *mounted);
-H5_FCDLL int_f nh5gget_info_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen,
+H5_FCDLL int_f h5gopen_c(hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *gapl_id, hid_t_f *grp_id);
+H5_FCDLL int_f h5gclose_c( hid_t_f *grp_id );
+H5_FCDLL int_f h5gget_obj_info_idx_c(hid_t_f *loc_id, _fcd name, int_f *namelen, int_f *idx, _fcd obj_name, int_f *obj_namelen, int_f *obj_type);
+H5_FCDLL int_f h5gn_members_c(hid_t_f *loc_id, _fcd name, int_f *namelen, int_f *nmembers);
+H5_FCDLL int_f h5glink_c(hid_t_f *loc_id, int_f *link_type, _fcd current_name, int_f *current_namelen, _fcd new_name, int_f *new_namelen);
+H5_FCDLL int_f h5glink2_c(hid_t_f *cur_loc_id, _fcd cur_name, int_f *cur_namelen, int_f *link_type, hid_t_f *new_loc_id, _fcd new_name, int_f *new_namelen);
+H5_FCDLL int_f h5gunlink_c(hid_t_f *loc_id, _fcd name, int_f *namelen);
+H5_FCDLL int_f h5gmove_c(hid_t_f *loc_id, _fcd src_name, int_f *src_namelen, _fcd dst_name, int_f *dst_namelen);
+H5_FCDLL int_f h5gmove2_c(hid_t_f *src_loc_id, _fcd src_name, int_f *src_namelen, hid_t_f *dst_loc_id,_fcd dst_name, int_f *dst_namelen);
+H5_FCDLL int_f h5gget_linkval_c(hid_t_f *loc_id, _fcd name, int_f *namelen, size_t_f *size, _fcd value );
+H5_FCDLL int_f h5gset_comment_c(hid_t_f *loc_id, _fcd name, int_f *namelen, _fcd comment, int_f *commentlen);
+H5_FCDLL int_f h5gget_comment_c(hid_t_f *loc_id, _fcd name, int_f *namelen, size_t_f *bufsize, _fcd comment);
+H5_FCDLL int_f h5gcreate_anon_c(hid_t_f *loc_id, hid_t_f *gcpl_id, hid_t_f *gapl_id, hid_t_f *grp_id);
+H5_FCDLL int_f h5gget_create_plist_c(hid_t_f *grp_id, hid_t_f *gcpl_id );
+H5_FCDLL int_f h5gget_info_c(hid_t_f *group_id, int_f *storage_type, int_f *nlinks, int_f *max_corder, int_f *mounted);
+H5_FCDLL int_f h5gget_info_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen,
 				     int_f *index_type, int_f *order, hsize_t_f *n, hid_t_f *lapl_id,
 				     int_f *storage_type, int_f *nlinks, int_f *max_corder, int_f *mounted);
-H5_FCDLL int_f nh5gget_info_by_name_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen, hid_t_f *lapl_id,
+H5_FCDLL int_f h5gget_info_by_name_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen, hid_t_f *lapl_id,
 				      int_f *storage_type, int_f *nlinks, int_f *max_corder, int_f *mounted);
 
 /*
  * Functions from H5Af.c
  */
-#define nh5acreate_c      H5_FC_FUNC_(h5acreate_c, H5ACREATE_C)
-#define nh5aclose_c       H5_FC_FUNC_(h5aclose_c, H5ACLOSE_C)
-#define nh5aopen_name_c   H5_FC_FUNC_(h5aopen_name_c, H5AOPEN_NAME_C)
-#define nh5awrite_c       H5_FC_FUNC_(h5awrite_c, H5AWRITE_C)
-#define nh5awrite_integer_s_c       H5_FC_FUNC_(h5awrite_integer_s_c, H5AWRITE_INTEGER_S_C)
-#define nh5awrite_integer_1_c       H5_FC_FUNC_(h5awrite_integer_1_c, H5AWRITE_INTEGER_1_C)
-#define nh5awrite_integer_2_c       H5_FC_FUNC_(h5awrite_integer_2_c, H5AWRITE_INTEGER_2_C)
-#define nh5awrite_integer_3_c       H5_FC_FUNC_(h5awrite_integer_3_c, H5AWRITE_INTEGER_3_C)
-#define nh5awrite_integer_4_c       H5_FC_FUNC_(h5awrite_integer_4_c, H5AWRITE_INTEGER_4_C)
-#define nh5awrite_integer_5_c       H5_FC_FUNC_(h5awrite_integer_5_c, H5AWRITE_INTEGER_5_C)
-#define nh5awrite_integer_6_c       H5_FC_FUNC_(h5awrite_integer_6_c, H5AWRITE_INTEGER_6_C)
-#define nh5awrite_integer_7_c       H5_FC_FUNC_(h5awrite_integer_7_c, H5AWRITE_INTEGER_7_C)
-#define nh5awrite_real_s_c       H5_FC_FUNC_(h5awrite_real_s_c, H5AWRITE_REAL_S_C)
-#define nh5awrite_real_1_c       H5_FC_FUNC_(h5awrite_real_1_c, H5AWRITE_REAL_1_C)
-#define nh5awrite_real_2_c       H5_FC_FUNC_(h5awrite_real_2_c, H5AWRITE_REAL_2_C)
-#define nh5awrite_real_3_c       H5_FC_FUNC_(h5awrite_real_3_c, H5AWRITE_REAL_3_C)
-#define nh5awrite_real_4_c       H5_FC_FUNC_(h5awrite_real_4_c, H5AWRITE_REAL_4_C)
-#define nh5awrite_real_5_c       H5_FC_FUNC_(h5awrite_real_5_c, H5AWRITE_REAL_5_C)
-#define nh5awrite_real_6_c       H5_FC_FUNC_(h5awrite_real_6_c, H5AWRITE_REAL_6_C)
-#define nh5awrite_real_7_c       H5_FC_FUNC_(h5awrite_real_7_c, H5AWRITE_REAL_7_C)
-#define nh5awrite_double_s_c       H5_FC_FUNC_(h5awrite_double_s_c, H5AWRITE_DOUBLE_S_C)
-#define nh5awrite_double_1_c       H5_FC_FUNC_(h5awrite_double_1_c, H5AWRITE_DOUBLE_1_C)
-#define nh5awrite_double_2_c       H5_FC_FUNC_(h5awrite_double_2_c, H5AWRITE_DOUBLE_2_C)
-#define nh5awrite_double_3_c       H5_FC_FUNC_(h5awrite_double_3_c, H5AWRITE_DOUBLE_3_C)
-#define nh5awrite_double_4_c       H5_FC_FUNC_(h5awrite_double_4_c, H5AWRITE_DOUBLE_4_C)
-#define nh5awrite_double_5_c       H5_FC_FUNC_(h5awrite_double_5_c, H5AWRITE_DOUBLE_5_C)
-#define nh5awrite_double_6_c       H5_FC_FUNC_(h5awrite_double_6_c, H5AWRITE_DOUBLE_6_C)
-#define nh5awrite_double_7_c       H5_FC_FUNC_(h5awrite_double_7_c, H5AWRITE_DOUBLE_7_C)
-#define nh5awritec_c        H5_FC_FUNC_(h5awritec_c, H5AWRITEC_C)
-#define nh5awritec_s_c      H5_FC_FUNC_(h5awritec_s_c, H5AWRITEC_S_C)
-#define nh5awritec_1_c      H5_FC_FUNC_(h5awritec_1_c, H5AWRITEC_1_C)
-#define nh5awritec_2_c      H5_FC_FUNC_(h5awritec_2_c, H5AWRITEC_2_C)
-#define nh5awritec_3_c      H5_FC_FUNC_(h5awritec_3_c, H5AWRITEC_3_C)
-#define nh5awritec_4_c      H5_FC_FUNC_(h5awritec_4_c, H5AWRITEC_4_C)
-#define nh5awritec_5_c      H5_FC_FUNC_(h5awritec_5_c, H5AWRITEC_5_C)
-#define nh5awritec_6_c      H5_FC_FUNC_(h5awritec_6_c, H5AWRITEC_6_C)
-#define nh5awritec_7_c      H5_FC_FUNC_(h5awritec_7_c, H5AWRITEC_7_C)
-#define nh5aread_c                 H5_FC_FUNC_(h5aread_c, H5AREAD_C)
-#define nh5aread_integer_s_c        H5_FC_FUNC_(h5aread_integer_s_c, H5AREAD_INTEGER_S_C)
-#define nh5aread_integer_1_c        H5_FC_FUNC_(h5aread_integer_1_c, H5AREAD_INTEGER_1_C)
-#define nh5aread_integer_2_c        H5_FC_FUNC_(h5aread_integer_2_c, H5AREAD_INTEGER_2_C)
-#define nh5aread_integer_3_c        H5_FC_FUNC_(h5aread_integer_3_c, H5AREAD_INTEGER_3_C)
-#define nh5aread_integer_4_c        H5_FC_FUNC_(h5aread_integer_4_c, H5AREAD_INTEGER_4_C)
-#define nh5aread_integer_5_c        H5_FC_FUNC_(h5aread_integer_5_c, H5AREAD_INTEGER_5_C)
-#define nh5aread_integer_6_c        H5_FC_FUNC_(h5aread_integer_6_c, H5AREAD_INTEGER_6_C)
-#define nh5aread_integer_7_c        H5_FC_FUNC_(h5aread_integer_7_c, H5AREAD_INTEGER_7_C)
-#define nh5aread_real_s_c        H5_FC_FUNC_(h5aread_real_s_c, H5AREAD_REAL_S_C)
-#define nh5aread_real_1_c        H5_FC_FUNC_(h5aread_real_1_c, H5AREAD_REAL_1_C)
-#define nh5aread_real_2_c        H5_FC_FUNC_(h5aread_real_2_c, H5AREAD_REAL_2_C)
-#define nh5aread_real_3_c        H5_FC_FUNC_(h5aread_real_3_c, H5AREAD_REAL_3_C)
-#define nh5aread_real_4_c        H5_FC_FUNC_(h5aread_real_4_c, H5AREAD_REAL_4_C)
-#define nh5aread_real_5_c        H5_FC_FUNC_(h5aread_real_5_c, H5AREAD_REAL_5_C)
-#define nh5aread_real_6_c        H5_FC_FUNC_(h5aread_real_6_c, H5AREAD_REAL_6_C)
-#define nh5aread_real_7_c        H5_FC_FUNC_(h5aread_real_7_c, H5AREAD_REAL_7_C)
-#define nh5aread_double_s_c        H5_FC_FUNC_(h5aread_double_s_c, H5AREAD_DOUBLE_S_C)
-#define nh5aread_double_1_c        H5_FC_FUNC_(h5aread_double_1_c, H5AREAD_DOUBLE_1_C)
-#define nh5aread_double_2_c        H5_FC_FUNC_(h5aread_double_2_c, H5AREAD_DOUBLE_2_C)
-#define nh5aread_double_3_c        H5_FC_FUNC_(h5aread_double_3_c, H5AREAD_DOUBLE_3_C)
-#define nh5aread_double_4_c        H5_FC_FUNC_(h5aread_double_4_c, H5AREAD_DOUBLE_4_C)
-#define nh5aread_double_5_c        H5_FC_FUNC_(h5aread_double_5_c, H5AREAD_DOUBLE_5_C)
-#define nh5aread_double_6_c        H5_FC_FUNC_(h5aread_double_6_c, H5AREAD_DOUBLE_6_C)
-#define nh5aread_double_7_c        H5_FC_FUNC_(h5aread_double_7_c, H5AREAD_DOUBLE_7_C)
-#define nh5areadc_c       H5_FC_FUNC_(h5areadc_c, H5AREADC_C)
-#define nh5areadc_s_c       H5_FC_FUNC_(h5areadc_s_c, H5AREADC_S_C)
-#define nh5areadc_1_c       H5_FC_FUNC_(h5areadc_1_c, H5AREADC_1_C)
-#define nh5areadc_2_c       H5_FC_FUNC_(h5areadc_2_c, H5AREADC_2_C)
-#define nh5areadc_3_c       H5_FC_FUNC_(h5areadc_3_c, H5AREADC_3_C)
-#define nh5areadc_4_c       H5_FC_FUNC_(h5areadc_4_c, H5AREADC_4_C)
-#define nh5areadc_5_c       H5_FC_FUNC_(h5areadc_5_c, H5AREADC_5_C)
-#define nh5areadc_6_c       H5_FC_FUNC_(h5areadc_6_c, H5AREADC_6_C)
-#define nh5areadc_7_c       H5_FC_FUNC_(h5areadc_7_c, H5AREADC_7_C)
-#define nh5aget_name_c    H5_FC_FUNC_(h5aget_name_c, H5AGET_NAME_C)
-#define nh5aopen_idx_c    H5_FC_FUNC_(h5aopen_idx_c, H5AOPEN_IDX_C)
-#define nh5aget_space_c   H5_FC_FUNC_(h5aget_space_c, H5AGET_SPACE_C)
-#define nh5aget_type_c    H5_FC_FUNC_(h5aget_type_c, H5AGET_TYPE_C)
-#define nh5aget_num_attrs_c H5_FC_FUNC_(h5aget_num_attrs_c, H5AGET_NUM_ATTRS_C)
-#define nh5adelete_c      H5_FC_FUNC_(h5adelete_c, H5ADELETE_C)
-#define nh5aget_storage_size_c H5_FC_FUNC_(h5aget_storage_size_c, H5AGET_STORAGE_SIZE_C)
-#define nh5arename_by_name_c H5_FC_FUNC_(h5arename_by_name_c, H5ARENAME_BY_NAME_C)
-#define nh5aopen_c H5_FC_FUNC_(h5aopen_c, H5AOPEN_C)
-#define nh5adelete_by_name_c H5_FC_FUNC_(h5adelete_by_name_c,H5ADELETE_BY_NAME_C)
-#define nh5adelete_by_idx_c H5_FC_FUNC_(h5adelete_by_idx_c,H5ADELETE_BY_IDX_C)
-#define nh5aget_name_by_idx_c H5_FC_FUNC_(h5aget_name_by_idx_c,H5AGET_NAME_BY_IDX_C)
-#define nh5aget_create_plist_c H5_FC_FUNC_(h5aget_create_plist_c,H5AGET_CREATE_PLIST_C)
-#define nh5aopen_by_idx_c H5_FC_FUNC_(h5aopen_by_idx_c,H5AOPEN_BY_IDX_C)
-#define nh5aget_info_c H5_FC_FUNC_(h5aget_info_c,H5AGET_INFO_C)
-#define nh5aget_info_by_idx_c H5_FC_FUNC_(h5aget_info_by_idx_c,H5AGET_INFO_BY_IDX_C)
-#define nh5aget_info_by_name_c H5_FC_FUNC_(h5aget_info_by_name_c,H5AGET_INFO_BY_NAME_C)
-#define nh5aget_info_by_name_c H5_FC_FUNC_(h5aget_info_by_name_c,H5AGET_INFO_BY_NAME_C)
-#define nh5acreate_by_name_c H5_FC_FUNC_(h5acreate_by_name_c,H5ACREATE_BY_NAME_C)
-#define nh5aexists_c H5_FC_FUNC_(h5aexists_c,H5AEXISTS_C)
-#define nh5aexists_by_name_c H5_FC_FUNC_(h5aexists_by_name_c,H5AEXISTS_BY_NAME_C)
-#define nh5aopen_by_name_c H5_FC_FUNC_(h5aopen_by_name_c,H5AOPEN_BY_NAME_C)
-#define nh5arename_c H5_FC_FUNC_(h5arename_c,H5ARENAME_C)
 
-H5_FCDLL int_f nh5acreate_c (hid_t_f *obj_id, _fcd name, size_t_f *namelen, hid_t_f *type_id, hid_t_f *space_id, hid_t_f *crt_prp, hid_t_f *aapl,  hid_t_f *attr_id);
-H5_FCDLL int_f nh5aopen_name_c (hid_t_f *obj_id, _fcd name, size_t_f *namelen, hid_t_f *attr_id);
-H5_FCDLL int_f nh5awritec_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims);
-H5_FCDLL int_f nh5awritec_s_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims);
-H5_FCDLL int_f nh5awritec_1_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims);
-H5_FCDLL int_f nh5awritec_2_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims);
-H5_FCDLL int_f nh5awritec_3_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims);
-H5_FCDLL int_f nh5awritec_4_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims);
-H5_FCDLL int_f nh5awritec_5_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims);
-H5_FCDLL int_f nh5awritec_6_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims);
-H5_FCDLL int_f nh5awritec_7_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims);
-H5_FCDLL int_f nh5awrite_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_integer_s_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_integer_1_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_integer_2_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_integer_3_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_integer_4_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_integer_5_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_integer_6_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_integer_7_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_real_s_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_real_1_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_real_2_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_real_3_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_real_4_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_real_5_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_real_6_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_real_7_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_double_s_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_double_1_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_double_2_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_double_3_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_double_4_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_double_5_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_double_6_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5awrite_double_7_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f h5awrite_f_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf);
-H5_FCDLL int_f nh5areadc_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims);
-H5_FCDLL int_f nh5areadc_s_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims);
-H5_FCDLL int_f nh5areadc_1_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims);
-H5_FCDLL int_f nh5areadc_2_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims);
-H5_FCDLL int_f nh5areadc_3_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims);
-H5_FCDLL int_f nh5areadc_4_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims);
-H5_FCDLL int_f nh5areadc_5_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims);
-H5_FCDLL int_f nh5areadc_6_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims);
-H5_FCDLL int_f nh5areadc_7_c (hid_t_f *attr_id, hid_t_f *mem_type_id, _fcd buf, void *dims);
-H5_FCDLL int_f nh5aread_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_integer_s_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_integer_1_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_integer_2_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_integer_3_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_integer_4_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_integer_5_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_integer_6_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_integer_7_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_real_s_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_real_1_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_real_2_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_real_3_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_real_4_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_real_5_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_real_6_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_real_7_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_double_s_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_double_1_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_double_2_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_double_3_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_double_4_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_double_5_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_double_6_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f nh5aread_double_7_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf, void *dims);
-H5_FCDLL int_f h5aread_f_c (hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf);
-H5_FCDLL int_f nh5aclose_c ( hid_t_f *attr_id );
-H5_FCDLL int_f nh5adelete_c (hid_t_f *obj_id, _fcd name, size_t_f *namelen);
-H5_FCDLL int_f nh5aopen_idx_c (hid_t_f *obj_id, int_f *idx, hid_t_f *attr_id);
-H5_FCDLL int_f nh5aget_space_c (hid_t_f *attr_id, hid_t_f *space_id);
-H5_FCDLL int_f nh5aget_type_c (hid_t_f *attr_id, hid_t_f *type_id);
-H5_FCDLL int_f nh5aget_num_attrs_c (hid_t_f *obj_id, int_f *attr_num);
-H5_FCDLL int_f nh5aget_name_c(hid_t_f *attr_id, size_t_f *size, _fcd buf);
-H5_FCDLL int_f nh5aget_storage_size_c ( hid_t_f *attr_id, hsize_t_f *size );
-H5_FCDLL int_f nh5arename_by_name_c ( hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
+H5_FCDLL int_f h5awrite_f_c(hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf);
+H5_FCDLL int_f h5aread_f_c(hid_t_f *attr_id, hid_t_f *mem_type_id, void *buf);
+H5_FCDLL int_f h5acreate_c(hid_t_f *obj_id, _fcd name, size_t_f *namelen, hid_t_f *type_id,
+                        hid_t_f *space_id, hid_t_f *crt_prp, hid_t_f *aapl, hid_t_f *attr_id);
+H5_FCDLL int_f h5adelete_c(hid_t_f *obj_id, _fcd name, size_t_f *namelen);
+H5_FCDLL int_f h5aget_num_attrs_c(hid_t_f *obj_id, int_f *attr_num);
+H5_FCDLL int_f h5aget_name_c(hid_t_f *attr_id, size_t_f *size, _fcd buf);
+H5_FCDLL int_f h5arename_by_name_c( hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
 				      _fcd old_attr_name, size_t_f *old_attr_namelen,
 				      _fcd new_attr_name, size_t_f *new_attr_namelen,
 				      hid_t_f *lapl_id );
-H5_FCDLL int_f nh5aopen_c ( hid_t_f *obj_id, _fcd attr_name, size_t_f *attr_namelen,
+H5_FCDLL int_f h5aopen_c( hid_t_f *obj_id, _fcd attr_name, size_t_f *attr_namelen,
 			    hid_t_f *aapl_id, hid_t_f *attr_id);
-H5_FCDLL int_f nh5adelete_by_name_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
+H5_FCDLL int_f h5adelete_by_name_c(hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
 				     _fcd attr_name, size_t_f *attr_namelen, hid_t_f *lapl_id);
-H5_FCDLL int_f nh5adelete_by_idx_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
+H5_FCDLL int_f h5adelete_by_idx_c(hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
 				    int_f *idx_type, int_f *order, hsize_t_f *n, hid_t_f *lapl_id);
-H5_FCDLL int_f nh5aget_name_by_idx_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
+H5_FCDLL int_f h5aget_name_by_idx_c(hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
 				      int_f *idx_type, int_f *order, hsize_t_f *n, _fcd name,
 				      size_t_f *size, hid_t_f *lapl_id);
-H5_FCDLL int_f nh5aget_create_plist_c ( hid_t_f *attr_id, hid_t_f *creation_prop_id );
-H5_FCDLL int_f nh5aopen_by_idx_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
+H5_FCDLL int_f h5aopen_by_idx_c(hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
 		     int_f *idx_type, int_f *order, hsize_t_f *n, hid_t_f *aapl_id, hid_t_f *lapl_id, hid_t_f *attr_id);
-H5_FCDLL int_f nh5aget_info_c (hid_t_f *loc_id, int_f *corder_valid, int_f *corder,
+H5_FCDLL int_f h5aget_info_c(hid_t_f *loc_id, int_f *corder_valid, int_f *corder,
 			       int_f *cset, hsize_t_f *data_size );
-H5_FCDLL int_f nh5aget_info_by_idx_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
+H5_FCDLL int_f h5aget_info_by_idx_c(hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
 				      int_f *idx_type, int_f *order, hsize_t_f *n, hid_t_f *lapl_id,
 				      int_f *corder_valid, int_f *corder,
 				      int_f *cset, hsize_t_f *data_size );
-H5_FCDLL int_f nh5aget_info_by_name_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
+H5_FCDLL int_f h5aget_info_by_name_c(hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
 				       _fcd attr_name, size_t_f *attr_namelen, hid_t_f *lapl_id,
 				       int_f *corder_valid, int_f *corder,
 				       int_f *cset, hsize_t_f *data_size );
-H5_FCDLL int_f nh5acreate_by_name_c(hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
+H5_FCDLL int_f h5acreate_by_name_c(hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen,
 				    _fcd attr_name, size_t_f *attr_namelen,  hid_t_f *type_id,
 				    hid_t_f *space_id, hid_t_f *acpl_id, hid_t_f *aapl_id,
 				    hid_t_f *lapl_id, hid_t_f *attr_id );
-H5_FCDLL int_f nh5aexists_c (hid_t_f *obj_id, _fcd name, size_t_f *namelen, hid_t_f *attr_exists);
-H5_FCDLL int_f nh5aexists_by_name_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, _fcd attr_name, size_t_f *attr_namelen,
+H5_FCDLL int_f h5aexists_c(hid_t_f *obj_id, _fcd name, size_t_f *namelen, hid_t_f *attr_exists);
+H5_FCDLL int_f h5aexists_by_name_c(hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, _fcd attr_name, size_t_f *attr_namelen,
 		      hid_t_f *lapl_id, int_f *attr_exists);
-H5_FCDLL int_f nh5aopen_by_name_c (hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, _fcd attr_name, size_t_f *attr_namelen,
+H5_FCDLL int_f h5aopen_by_name_c(hid_t_f *loc_id, _fcd obj_name, size_t_f *obj_namelen, _fcd attr_name, size_t_f *attr_namelen,
 				   hid_t_f *aapl_id, hid_t_f *lapl_id, hid_t_f *attr_id);
-H5_FCDLL int_f nh5arename_c( hid_t_f *loc_id,
+H5_FCDLL int_f h5arename_c( hid_t_f *loc_id,
 		      _fcd old_attr_name, size_t_f *old_attr_namelen,
 		      _fcd new_attr_name, size_t_f *new_attr_namelen);
 
 /*
  * Functions form H5Tf.c file
  */
-#define nh5topen_c         H5_FC_FUNC_(h5topen_c, H5TOPEN_C)
-#define nh5tcommit_c       H5_FC_FUNC_(h5tcommit_c, H5TCOMMIT_C)
-#define nh5tcommitted_c    H5_FC_FUNC_(h5tcommitted_c, H5TCOMMITTED_C)
-#define nh5tclose_c        H5_FC_FUNC_(h5tclose_c, H5TCLOSE_C)
-#define nh5tcopy_c         H5_FC_FUNC_(h5tcopy_c, H5TCOPY_C)
-#define nh5tequal_c        H5_FC_FUNC_(h5tequal_c, H5TEQUAL_C)
-#define nh5tget_class_c    H5_FC_FUNC_(h5tget_class_c, H5TGET_CLASS_C)
-#define nh5tget_order_c    H5_FC_FUNC_(h5tget_order_c, H5TGET_ORDER_C)
-#define nh5tset_order_c    H5_FC_FUNC_(h5tset_order_c, H5TSET_ORDER_C)
-#define nh5tget_size_c     H5_FC_FUNC_(h5tget_size_c, H5TGET_SIZE_C)
-#define nh5tset_size_c     H5_FC_FUNC_(h5tset_size_c, H5TSET_SIZE_C)
-#define nh5tget_precision_c     H5_FC_FUNC_(h5tget_precision_c, H5TGET_PRECISION_C)
-#define nh5tset_precision_c     H5_FC_FUNC_(h5tset_precision_c, H5TSET_PRECISION_C)
-#define nh5tget_offset_c        H5_FC_FUNC_(h5tget_offset_c, H5TGET_OFFSET_C)
-#define nh5tset_offset_c        H5_FC_FUNC_(h5tset_offset_c, H5TSET_OFFSET_C)
-#define nh5tget_pad_c        H5_FC_FUNC_(h5tget_pad_c, H5TGET_PAD_C)
-#define nh5tset_pad_c        H5_FC_FUNC_(h5tset_pad_c, H5TSET_PAD_C)
-#define nh5tget_sign_c       H5_FC_FUNC_(h5tget_sign_c, H5TGET_SIGN_C)
-#define nh5tset_sign_c       H5_FC_FUNC_(h5tset_sign_c, H5TSET_SIGN_C)
-#define nh5tget_fields_c       H5_FC_FUNC_(h5tget_fields_c, H5TGET_FIELDS_C)
-#define nh5tset_fields_c       H5_FC_FUNC_(h5tset_fields_c, H5TSET_FIELDS_C)
-#define nh5tget_ebias_c     H5_FC_FUNC_(h5tget_ebias_c, H5TGET_EBIAS_C)
-#define nh5tset_ebias_c     H5_FC_FUNC_(h5tset_ebias_c, H5TSET_EBIAS_C)
-#define nh5tget_norm_c     H5_FC_FUNC_(h5tget_norm_c, H5TGET_NORM_C)
-#define nh5tset_norm_c     H5_FC_FUNC_(h5tset_norm_c, H5TSET_NORM_C)
-#define nh5tget_inpad_c        H5_FC_FUNC_(h5tget_inpad_c, H5TGET_INPAD_C)
-#define nh5tset_inpad_c        H5_FC_FUNC_(h5tset_inpad_c, H5TSET_INPAD_C)
-#define nh5tget_cset_c        H5_FC_FUNC_(h5tget_cset_c, H5TGET_CSET_C)
-#define nh5tset_cset_c        H5_FC_FUNC_(h5tset_cset_c, H5TSET_CSET_C)
-#define nh5tget_strpad_c        H5_FC_FUNC_(h5tget_strpad_c, H5TGET_STRPAD_C)
-#define nh5tset_strpad_c        H5_FC_FUNC_(h5tset_strpad_c, H5TSET_STRPAD_C)
-#define nh5tget_nmembers_c        H5_FC_FUNC_(h5tget_nmembers_c, H5TGET_NMEMBERS_C)
-#define nh5tget_member_name_c        H5_FC_FUNC_(h5tget_member_name_c, H5TGET_MEMBER_NAME_C)
-#define nh5tget_member_offset_c        H5_FC_FUNC_(h5tget_member_offset_c, H5TGET_MEMBER_OFFSET_C)
-#define nh5tget_member_dims_c        H5_FC_FUNC_(h5tget_member_dims_c, H5TGET_MEMBER_DIMS_C)
-#define nh5tget_member_type_c        H5_FC_FUNC_(h5tget_member_type_c, H5TGET_MEMBER_TYPE_C)
-#define nh5tget_member_index_c        H5_FC_FUNC_(h5tget_member_index_c, H5TGET_MEMBER_INDEX_C)
-#define nh5tinsert_c        H5_FC_FUNC_(h5tinsert_c, H5TINSERT_C)
-#define nh5tcreate_c        H5_FC_FUNC_(h5tcreate_c, H5TCREATE_C)
-#define nh5tpack_c                   H5_FC_FUNC_(h5tpack_c, H5TPACK_C)
-#define nh5tinsert_array_c           H5_FC_FUNC_(h5tinsert_array_c, H5TINSERT_ARRAY_C)
-#define nh5tinsert_array_c2           H5_FC_FUNC_(h5tinsert_array_c2, H5TINSERT_ARRAY_C2)
-#define nh5tenum_create_c             H5_FC_FUNC_(h5tenum_create_c, H5TENUM_CREATE_C)
-#define nh5tenum_insert_c             H5_FC_FUNC_(h5tenum_insert_c, H5TENUM_INSERT_C)
-#define nh5tenum_nameof_c             H5_FC_FUNC_(h5tenum_nameof_c, H5TENUM_NAMEOF_C)
-#define nh5tenum_valueof_c             H5_FC_FUNC_(h5tenum_valueof_c, H5TENUM_VALUEOF_C)
-#define nh5tget_member_value_c         H5_FC_FUNC_(h5tget_member_value_c, H5TGET_MEMBER_VALUE_C)
-#define nh5tset_tag_c                  H5_FC_FUNC_(h5tset_tag_c, H5TSET_TAG_C)
-#define nh5tget_tag_c                  H5_FC_FUNC_(h5tget_tag_c, H5TGET_TAG_C)
-#define nh5tarray_create_c             H5_FC_FUNC_(h5tarray_create_c, H5TARRAY_CREATE_C)
-#define nh5tget_array_ndims_c          H5_FC_FUNC_(h5tget_array_ndims_c, H5TGET_ARRAY_NDIMS_C)
-#define nh5tget_array_dims_c          H5_FC_FUNC_(h5tget_array_dims_c, H5TGET_ARRAY_DIMS_C)
-#define nh5tget_super_c               H5_FC_FUNC_(h5tget_super_c, H5TGET_SUPER_C)
-#define nh5tvlen_create_c               H5_FC_FUNC_(h5tvlen_create_c, H5TVLEN_CREATE_C)
-#define nh5tis_variable_str_c         H5_FC_FUNC_(h5tis_variable_str_c, H5TIS_VARIABLE_STR_C)
-#define nh5tget_member_class_c         H5_FC_FUNC_(h5tget_member_class_c, H5TGET_MEMBER_CLASS_C)
-#define nh5tcommit_anon_c       H5_FC_FUNC_(h5tcommit_anon_c, H5TCOMMIT_ANON_C)
-#define nh5tdecode_c    H5_FC_FUNC_(h5tdecode_c, H5TDECODE_C)
-#define nh5tencode_c    H5_FC_FUNC_(h5tencode_c, H5TENCODE_C)
-#define nh5tget_create_plist_c H5_FC_FUNC_(h5tget_create_plist_c, H5TGET_CREATE_PLIST_C)
-#define nh5tcompiler_conv_c H5_FC_FUNC_(h5tcompiler_conv_c, H5TCOMPILER_CONV_C)
-#define nh5tget_native_type_c H5_FC_FUNC_(h5tget_native_type_c, H5TGET_NATIVE_TYPE_C )
 
-H5_FCDLL int_f nh5tcreate_c(int_f *cls, size_t_f *size, hid_t_f *type_id);
-H5_FCDLL int_f nh5topen_c (hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *type_id, hid_t_f *tapl_id );
-H5_FCDLL int_f nh5tcommit_c (hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *type_id, hid_t_f *lcpl_id, hid_t_f *tcpl_id, hid_t_f *tapl_id);
-H5_FCDLL int_f nh5tclose_c ( hid_t_f *type_id );
-H5_FCDLL int_f nh5tequal_c ( hid_t_f *type1_id , hid_t_f *type2_id, int_f *c_flag);
-H5_FCDLL int_f nh5tcopy_c ( hid_t_f *type_id , hid_t_f *new_type_id);
-H5_FCDLL int_f nh5tget_class_c ( hid_t_f *type_id , int_f *classtype);
-H5_FCDLL int_f nh5tget_order_c ( hid_t_f *type_id , int_f *order);
-H5_FCDLL int_f nh5tset_order_c ( hid_t_f *type_id , int_f *order);
-H5_FCDLL int_f nh5tget_size_c ( hid_t_f *type_id , size_t_f *size);
-H5_FCDLL int_f nh5tset_size_c ( hid_t_f *type_id , size_t_f *size);
-H5_FCDLL int_f nh5tcommitted_c (hid_t_f *dtype_id);
-H5_FCDLL int_f nh5tget_precision_c ( hid_t_f *type_id , size_t_f *precision);
-H5_FCDLL int_f nh5tset_precision_c ( hid_t_f *type_id , size_t_f *precision);
-H5_FCDLL int_f nh5tget_offset_c ( hid_t_f *type_id , size_t_f *offset);
-H5_FCDLL int_f nh5tset_offset_c ( hid_t_f *type_id , size_t_f *offset);
-H5_FCDLL int_f nh5tget_pad_c ( hid_t_f *type_id , int_f * lsbpad, int_f * msbpad);
-H5_FCDLL int_f nh5tset_pad_c ( hid_t_f *type_id, int_f * lsbpad, int_f * msbpad );
-H5_FCDLL int_f nh5tget_sign_c ( hid_t_f *type_id , int_f* sign);
-H5_FCDLL int_f nh5tset_sign_c ( hid_t_f *type_id , int_f *sign);
-H5_FCDLL int_f nh5tget_fields_c ( hid_t_f *type_id, size_t_f *spos, size_t_f *epos, size_t_f* esize, size_t_f* mpos, size_t_f* msize);
-H5_FCDLL int_f nh5tset_fields_c ( hid_t_f *type_id, size_t_f *spos, size_t_f *epos, size_t_f* esize, size_t_f* mpos, size_t_f* msize);
-H5_FCDLL int_f nh5tget_ebias_c ( hid_t_f *type_id , size_t_f *ebias);
-H5_FCDLL int_f nh5tset_ebias_c ( hid_t_f *type_id , size_t_f *ebias);
-H5_FCDLL int_f nh5tget_norm_c ( hid_t_f *type_id , int_f *norm);
-H5_FCDLL int_f nh5tset_norm_c ( hid_t_f *type_id , int_f *norm);
-H5_FCDLL int_f nh5tget_inpad_c ( hid_t_f *type_id, int_f * padtype);
-H5_FCDLL int_f nh5tset_inpad_c ( hid_t_f *type_id, int_f * padtype);
-H5_FCDLL int_f nh5tget_cset_c ( hid_t_f *type_id, int_f * cset);
-H5_FCDLL int_f nh5tset_cset_c ( hid_t_f *type_id, int_f * cset);
-H5_FCDLL int_f nh5tget_strpad_c ( hid_t_f *type_id, int_f * strpad);
-H5_FCDLL int_f nh5tset_strpad_c ( hid_t_f *type_id, int_f * strpad);
-H5_FCDLL int_f nh5tget_nmembers_c ( hid_t_f *type_id , int_f * num_members);
-H5_FCDLL int_f nh5tget_member_name_c ( hid_t_f *type_id ,int_f* idx, _fcd member_name, int_f *namelen);
-H5_FCDLL int_f nh5tget_member_dims_c ( hid_t_f *type_id ,int_f* field_idx, int_f * dims, size_t_f * field_dims, int_f * perm );
-H5_FCDLL int_f nh5tget_member_offset_c ( hid_t_f *type_id ,int_f* member_no, size_t_f* offset);
-H5_FCDLL int_f nh5tget_member_type_c ( hid_t_f *type_id ,int_f* field_idx, hid_t_f * datatype);
-H5_FCDLL int_f nh5tget_member_index_c ( hid_t_f *type_id ,_fcd name, int_f* namelen, int_f *idx);
-H5_FCDLL int_f nh5tinsert_c(hid_t_f *type_id, _fcd name, int_f* namelen, size_t_f *offset, hid_t_f * field_id);
-H5_FCDLL int_f nh5tpack_c(hid_t_f * type_id);
-H5_FCDLL int_f nh5tinsert_array_c(hid_t_f * parent_id, _fcd name, int_f* namelen, size_t_f* offset, int_f* ndims, size_t_f* dims, hid_t_f* member_id, int_f* perm );
-H5_FCDLL int_f nh5tinsert_array_c2(hid_t_f * parent_id, _fcd name, int_f* namelen, size_t_f* offset, int_f* ndims, size_t_f* dims, hid_t_f* member_id);
-H5_FCDLL int_f nh5tenum_create_c ( hid_t_f *parent_id , hid_t_f *new_type_id);
-H5_FCDLL int_f nh5tenum_insert_c(hid_t_f *type_id, _fcd name, int_f* namelen, int_f* value);
+H5_FCDLL int_f h5tcreate_c(int_f *cls, size_t_f *size, hid_t_f *type_id);
+H5_FCDLL int_f h5topen_c(hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *type_id, hid_t_f *tapl_id );
+H5_FCDLL int_f h5tcommit_c(hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *type_id, hid_t_f *lcpl_id, hid_t_f *tcpl_id, hid_t_f *tapl_id);
+H5_FCDLL int_f h5tclose_c( hid_t_f *type_id );
+H5_FCDLL int_f h5tequal_c( hid_t_f *type1_id , hid_t_f *type2_id, int_f *c_flag);
+H5_FCDLL int_f h5tcopy_c( hid_t_f *type_id , hid_t_f *new_type_id);
+H5_FCDLL int_f h5tget_class_c( hid_t_f *type_id , int_f *classtype);
+H5_FCDLL int_f h5tget_order_c( hid_t_f *type_id , int_f *order);
+H5_FCDLL int_f h5tset_order_c( hid_t_f *type_id , int_f *order);
+H5_FCDLL int_f h5tget_size_c( hid_t_f *type_id , size_t_f *size);
+H5_FCDLL int_f h5tset_size_c( hid_t_f *type_id , size_t_f *size);
+H5_FCDLL int_f h5tcommitted_c(hid_t_f *dtype_id);
+H5_FCDLL int_f h5tget_precision_c( hid_t_f *type_id , size_t_f *precision);
+H5_FCDLL int_f h5tset_precision_c( hid_t_f *type_id , size_t_f *precision);
+H5_FCDLL int_f h5tget_offset_c( hid_t_f *type_id , size_t_f *offset);
+H5_FCDLL int_f h5tset_offset_c( hid_t_f *type_id , size_t_f *offset);
+H5_FCDLL int_f h5tget_pad_c( hid_t_f *type_id , int_f * lsbpad, int_f * msbpad);
+H5_FCDLL int_f h5tset_pad_c( hid_t_f *type_id, int_f * lsbpad, int_f * msbpad );
+H5_FCDLL int_f h5tget_sign_c( hid_t_f *type_id , int_f* sign);
+H5_FCDLL int_f h5tset_sign_c( hid_t_f *type_id , int_f *sign);
+H5_FCDLL int_f h5tget_fields_c( hid_t_f *type_id, size_t_f *spos, size_t_f *epos, size_t_f* esize, size_t_f* mpos, size_t_f* msize);
+H5_FCDLL int_f h5tset_fields_c( hid_t_f *type_id, size_t_f *spos, size_t_f *epos, size_t_f* esize, size_t_f* mpos, size_t_f* msize);
+H5_FCDLL int_f h5tget_ebias_c( hid_t_f *type_id , size_t_f *ebias);
+H5_FCDLL int_f h5tset_ebias_c( hid_t_f *type_id , size_t_f *ebias);
+H5_FCDLL int_f h5tget_norm_c( hid_t_f *type_id , int_f *norm);
+H5_FCDLL int_f h5tset_norm_c( hid_t_f *type_id , int_f *norm);
+H5_FCDLL int_f h5tget_inpad_c( hid_t_f *type_id, int_f * padtype);
+H5_FCDLL int_f h5tset_inpad_c( hid_t_f *type_id, int_f * padtype);
+H5_FCDLL int_f h5tget_cset_c( hid_t_f *type_id, int_f * cset);
+H5_FCDLL int_f h5tset_cset_c( hid_t_f *type_id, int_f * cset);
+H5_FCDLL int_f h5tget_strpad_c( hid_t_f *type_id, int_f * strpad);
+H5_FCDLL int_f h5tset_strpad_c( hid_t_f *type_id, int_f * strpad);
+H5_FCDLL int_f h5tget_nmembers_c( hid_t_f *type_id , int_f * num_members);
+H5_FCDLL int_f h5tget_member_name_c( hid_t_f *type_id ,int_f* idx, _fcd member_name, int_f *namelen);
+H5_FCDLL int_f h5tget_member_dims_c( hid_t_f *type_id ,int_f* field_idx, int_f * dims, size_t_f * field_dims, int_f * perm );
+H5_FCDLL int_f h5tget_member_offset_c( hid_t_f *type_id ,int_f* member_no, size_t_f* offset);
+H5_FCDLL int_f h5tget_member_type_c( hid_t_f *type_id ,int_f* field_idx, hid_t_f * datatype);
+H5_FCDLL int_f h5tget_member_index_c( hid_t_f *type_id ,_fcd name, int_f* namelen, int_f *idx);
+H5_FCDLL int_f h5tinsert_c(hid_t_f *type_id, _fcd name, int_f* namelen, size_t_f *offset, hid_t_f * field_id);
+H5_FCDLL int_f h5tpack_c(hid_t_f * type_id);
+H5_FCDLL int_f h5tinsert_array_c(hid_t_f * parent_id, _fcd name, int_f* namelen, size_t_f* offset, int_f* ndims, size_t_f* dims, hid_t_f* member_id, int_f* perm );
+H5_FCDLL int_f h5tinsert_array_c2(hid_t_f * parent_id, _fcd name, int_f* namelen, size_t_f* offset, int_f* ndims, size_t_f* dims, hid_t_f* member_id);
+H5_FCDLL int_f h5tenum_create_c( hid_t_f *parent_id , hid_t_f *new_type_id);
+H5_FCDLL int_f h5tenum_insert_c(hid_t_f *type_id, _fcd name, int_f* namelen, int_f* value);
 H5_FCDLL int_f h5tenum_insert_ptr_c(hid_t_f *type_id, _fcd name, int_f* namelen, void *value);
-H5_FCDLL int_f nh5tenum_nameof_c(hid_t_f *type_id, int_f* value, _fcd name, size_t_f* namelen);
-H5_FCDLL int_f nh5tenum_valueof_c(hid_t_f *type_id, _fcd name, int_f* namelen, int_f* value);
-H5_FCDLL int_f nh5tget_member_value_c(hid_t_f *type_id, int_f* member_no, int_f* value);
-H5_FCDLL int_f nh5tset_tag_c(hid_t_f* type_id, _fcd tag, int_f* namelen);
-H5_FCDLL int_f nh5tget_tag_c(hid_t_f* type_id, _fcd tag, size_t_f* tag_size, int_f* namelen);
-H5_FCDLL int_f nh5tarray_create_c(hid_t_f * base_id, int_f *rank, hsize_t_f* dims, hid_t_f* type_id);
-H5_FCDLL int_f nh5tget_array_dims_c ( hid_t_f *type_id , hsize_t_f * dims);
-H5_FCDLL int_f nh5tget_array_ndims_c ( hid_t_f *type_id , int_f * ndims);
-H5_FCDLL int_f nh5tget_super_c ( hid_t_f *type_id , hid_t_f *base_type_id);
-H5_FCDLL int_f nh5tvlen_create_c ( hid_t_f *type_id , hid_t_f *vltype_id);
-H5_FCDLL int_f nh5tis_variable_str_c ( hid_t_f *type_id , int_f *flag );
-H5_FCDLL int_f nh5tget_member_class_c ( hid_t_f *type_id ,  int_f *member_no, int_f *cls );
-H5_FCDLL int_f nh5tcommit_anon_c(hid_t_f *loc_id, hid_t_f *dtype_id, hid_t_f *tcpl_id, hid_t_f *tapl_id);
-H5_FCDLL int_f nh5tdecode_c ( _fcd buf, hid_t_f *obj_id );
-H5_FCDLL int_f nh5tencode_c (_fcd buf, hid_t_f *obj_id, size_t_f *nalloc );
-H5_FCDLL int_f nh5tget_create_plist_c ( hid_t_f *dtype_id,  hid_t_f *dtpl_id);
-H5_FCDLL int_f nh5tcompiler_conv_c ( hid_t_f *src_id, hid_t_f *dst_id, int_f *c_flag);
-H5_FCDLL int_f nh5tget_native_type_c(hid_t_f *dtype_id, int_f *direction, hid_t_f *native_dtype_id);
+H5_FCDLL int_f h5tenum_nameof_c(hid_t_f *type_id, int_f* value, _fcd name, size_t_f* namelen);
+H5_FCDLL int_f h5tenum_valueof_c(hid_t_f *type_id, _fcd name, int_f* namelen, int_f* value);
+H5_FCDLL int_f h5tget_member_value_c(hid_t_f *type_id, int_f* member_no, int_f* value);
+H5_FCDLL int_f h5tset_tag_c(hid_t_f* type_id, _fcd tag, int_f* namelen);
+H5_FCDLL int_f h5tget_tag_c(hid_t_f* type_id, _fcd tag, size_t_f* tag_size, int_f* namelen);
+H5_FCDLL int_f h5tarray_create_c(hid_t_f * base_id, int_f *rank, hsize_t_f* dims, hid_t_f* type_id);
+H5_FCDLL int_f h5tget_array_dims_c( hid_t_f *type_id , hsize_t_f * dims);
+H5_FCDLL int_f h5tget_array_ndims_c( hid_t_f *type_id , int_f * ndims);
+H5_FCDLL int_f h5tget_super_c( hid_t_f *type_id , hid_t_f *base_type_id);
+H5_FCDLL int_f h5tvlen_create_c( hid_t_f *type_id , hid_t_f *vltype_id);
+H5_FCDLL int_f h5tis_variable_str_c( hid_t_f *type_id , int_f *flag );
+H5_FCDLL int_f h5tget_member_class_c( hid_t_f *type_id ,  int_f *member_no, int_f *cls );
+H5_FCDLL int_f h5tcommit_anon_c(hid_t_f *loc_id, hid_t_f *dtype_id, hid_t_f *tcpl_id, hid_t_f *tapl_id);
+H5_FCDLL int_f h5tdecode_c( _fcd buf, hid_t_f *obj_id );
+H5_FCDLL int_f h5tencode_c(_fcd buf, hid_t_f *obj_id, size_t_f *nalloc );
+H5_FCDLL int_f h5tget_create_plist_c( hid_t_f *dtype_id,  hid_t_f *dtpl_id);
+H5_FCDLL int_f h5tcompiler_conv_c( hid_t_f *src_id, hid_t_f *dst_id, int_f *c_flag);
+H5_FCDLL int_f h5tget_native_type_c(hid_t_f *dtype_id, int_f *direction, hid_t_f *native_dtype_id);
 H5_FCDLL int_f h5tconvert_c(hid_t_f *src_id, hid_t_f *dst_id, size_t_f *nelmts, void *buf, void *background, hid_t_f *plist_id);
 
-
 /*
  * Functions from H5Of.c
  */
 
-#define nh5olink_c       H5_FC_FUNC_(h5olink_c, H5OLINK_C)
-#define nh5oopen_c       H5_FC_FUNC_(h5oopen_c, H5OOPEN_C)
-#define nh5oclose_c      H5_FC_FUNC_(h5oclose_c, H5OCLOSE_C)
-#define nh5oopen_by_addr_c H5_FC_FUNC_(h5oopen_by_addr_c, H5OOPEN_BY_ADDR_C)
-#define nh5ocopy_c         H5_FC_FUNC_(h5ocopy_c, H5OCOPY_C)
-#define nh5odecr_refcount_c H5_FC_FUNC_(h5odecr_refcount_c, H5ODECR_REFCOUNT_C)
-#define nh5oincr_refcount_c H5_FC_FUNC_(h5oincr_refcount_c, H5OINCR_REFCOUNT_C)
-#define nh5oexists_by_name_c H5_FC_FUNC_(h5oexists_by_name_c, H5OEXISTS_BY_NAME_C)
-#define nh5oset_comment_c H5_FC_FUNC_(h5oset_comment_c, H5OSET_COMMENT_C)
-#define nh5oset_comment_by_name_c H5_FC_FUNC_(h5oset_comment_by_name_c, H5OSET_COMMENT_BY_NAME_C)
-#define nh5oopen_by_idx_c H5_FC_FUNC_(h5oopen_by_idx_c, H5OOPEN_BY_IDX_C)
-#define nh5oget_comment_c H5_FC_FUNC_(h5oget_comment_c, H5OGET_COMMENT_C)
-#define nh5oget_comment_by_name_c H5_FC_FUNC_(h5oget_comment_by_name_c, H5OGET_COMMENT_BY_NAME_C)
-
-H5_FCDLL int_f nh5oopen_c (hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id, hid_t_f *obj_id);
-H5_FCDLL int_f nh5oclose_c (hid_t_f *object_id );
-H5_FCDLL int_f nh5oopen_by_addr_c (hid_t_f *loc_id, haddr_t_f *addr, hid_t_f *obj_id);
-H5_FCDLL int_f nh5olink_c (hid_t_f *object_id, hid_t_f *new_loc_id, _fcd name, size_t_f *namelen,
+H5_FCDLL int_f h5oopen_c(hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id, hid_t_f *obj_id);
+H5_FCDLL int_f h5oclose_c(hid_t_f *object_id );
+H5_FCDLL int_f h5oopen_by_addr_c(hid_t_f *loc_id, haddr_t_f *addr, hid_t_f *obj_id);
+H5_FCDLL int_f h5olink_c(hid_t_f *object_id, hid_t_f *new_loc_id, _fcd name, size_t_f *namelen,
 			   hid_t_f *lcpl_id, hid_t_f *lapl_id);
-H5_FCDLL int_f h5ovisit_c (hid_t_f *group_id, int_f *index_type, int_f *order, H5O_iterate_t op, void *op_data);
+H5_FCDLL int_f h5ovisit_c(hid_t_f *group_id, int_f *index_type, int_f *order, H5O_iterate_t op, void *op_data);
 H5_FCDLL int_f h5ovisit_by_name_c(hid_t_f *loc_id,  _fcd object_name, size_t_f *namelen, int_f *index_type, int_f *order,
 				   H5O_iterate_t op, void *op_data, hid_t_f *lapl_id );
-H5_FCDLL int_f h5oget_info_c (hid_t_f *object_id, H5O_info_t_f *object_info);
-H5_FCDLL int_f h5oget_info_by_idx_c (hid_t_f *loc_id, _fcd  group_name, size_t_f *namelen, 
+H5_FCDLL int_f h5oget_info_c(hid_t_f *object_id, H5O_info_t_f *object_info);
+H5_FCDLL int_f h5oget_info_by_idx_c(hid_t_f *loc_id, _fcd  group_name, size_t_f *namelen, 
 				      int_f *index_field, int_f *order, hsize_t_f *n, hid_t_f *lapl_id, H5O_info_t_f *object_info);
-H5_FCDLL int_f h5oget_info_by_name_c (hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id,
+H5_FCDLL int_f h5oget_info_by_name_c(hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id,
 				       H5O_info_t_f *object_info);
-H5_FCDLL int_f nh5ocopy_c (hid_t_f *src_loc_id, _fcd src_name, size_t_f *src_name_len,
+H5_FCDLL int_f h5ocopy_c(hid_t_f *src_loc_id, _fcd src_name, size_t_f *src_name_len,
 			   hid_t_f *dst_loc_id, _fcd dst_name, size_t_f *dst_name_len, 
 			   hid_t_f *ocpypl_id, hid_t_f *lcpl_id );
-H5_FCDLL int_f nh5odecr_refcount_c (hid_t_f *object_id);
-H5_FCDLL int_f nh5oincr_refcount_c (hid_t_f *object_id);
-H5_FCDLL int_f nh5oexists_by_name_c (hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id);
-H5_FCDLL int_f nh5oset_comment_c (hid_t_f *object_id, _fcd comment, size_t_f *commentlen);
-H5_FCDLL int_f nh5oset_comment_by_name_c (hid_t_f *object_id, _fcd name, size_t_f *namelen,  _fcd comment, size_t_f *commentlen, hid_t_f *lapl_id);
-H5_FCDLL int_f nh5oopen_by_idx_c (hid_t_f *loc_id, _fcd  group_name, size_t_f *group_namelen, 
+H5_FCDLL int_f h5odecr_refcount_c(hid_t_f *object_id);
+H5_FCDLL int_f h5oincr_refcount_c(hid_t_f *object_id);
+H5_FCDLL int_f h5oexists_by_name_c(hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id);
+H5_FCDLL int_f h5oset_comment_c(hid_t_f *object_id, _fcd comment, size_t_f *commentlen);
+H5_FCDLL int_f h5oset_comment_by_name_c(hid_t_f *object_id, _fcd name, size_t_f *namelen,  _fcd comment, size_t_f *commentlen, hid_t_f *lapl_id);
+H5_FCDLL int_f h5oopen_by_idx_c(hid_t_f *loc_id, _fcd  group_name, size_t_f *group_namelen, 
 				      int_f *index_type, int_f *order, hsize_t_f *n, hid_t_f *obj_id, hid_t_f *lapl_id);
-H5_FCDLL int_f nh5oget_comment_c (hid_t_f *object_id, _fcd comment, size_t_f *commentsize, hssize_t_f *bufsize);
-H5_FCDLL int_f nh5oget_comment_by_name_c (hid_t_f *loc_id, _fcd name, size_t_f *name_size, 
+H5_FCDLL int_f h5oget_comment_c(hid_t_f *object_id, _fcd comment, size_t_f *commentsize, hssize_t_f *bufsize);
+H5_FCDLL int_f h5oget_comment_by_name_c(hid_t_f *loc_id, _fcd name, size_t_f *name_size, 
 					  _fcd comment, size_t_f *commentsize, size_t_f *bufsize, hid_t_f *lapl_id);
 /*
  * Functions from H5Pf.c
  */
-#define nh5pcreate_c       H5_FC_FUNC_(h5pcreate_c, H5PCREATE_C)
-#define nh5pclose_c        H5_FC_FUNC_(h5pclose_c, H5PCLOSE_C)
-#define nh5pcopy_c         H5_FC_FUNC_(h5pcopy_c, H5PCOPY_C)
-#define nh5pcreate_class_f90_c H5_FC_FUNC_(h5pcreate_class_f90_c, H5PCREATE_CLASS_F90_C)
-#define nh5pequal_c         H5_FC_FUNC_(h5pequal_c, H5PEQUAL_C)
-#define nh5pget_class_c    H5_FC_FUNC_(h5pget_class_c, H5PGET_CLASS_C)
-#define nh5pset_deflate_c  H5_FC_FUNC_(h5pset_deflate_c, H5PSET_DEFLATE_C)
-#define nh5pset_preserve_c  H5_FC_FUNC_(h5pset_preserve_c, H5PSET_PRESERVE_C)
-#define nh5pget_preserve_c  H5_FC_FUNC_(h5pget_preserve_c, H5PGET_PRESERVE_C)
-#define nh5pset_chunk_c    H5_FC_FUNC_(h5pset_chunk_c, H5PSET_CHUNK_C)
-#define nh5pget_chunk_c    H5_FC_FUNC_(h5pget_chunk_c, H5PGET_CHUNK_C)
-#define nh5pset_fill_valuec_c        H5_FC_FUNC_(h5pset_fill_valuec_c, H5PSET_FILL_VALUEC_C)
-#define nh5pset_fill_value_integer_c H5_FC_FUNC_(h5pset_fill_value_integer_c, H5PSET_FILL_VALUE_INTEGER_C)
-#define nh5pset_fill_value_real_c    H5_FC_FUNC_(h5pset_fill_value_real_c, H5PSET_FILL_VALUE_REAL_C)
-#define nh5pset_fill_value_double_c  H5_FC_FUNC_(h5pset_fill_value_double_c, H5PSET_FILL_VALUE_DOUBLE_C)
-#define nh5pget_fill_valuec_c        H5_FC_FUNC_(h5pget_fill_valuec_c, H5PGET_FILL_VALUEC_C)
-#define nh5pget_fill_value_integer_c H5_FC_FUNC_(h5pget_fill_value_integer_c, H5PGET_FILL_VALUE_INTEGER_C)
-#define nh5pget_fill_value_real_c    H5_FC_FUNC_(h5pget_fill_value_real_c, H5PGET_FILL_VALUE_REAL_C)
-#define nh5pget_fill_value_double_c  H5_FC_FUNC_(h5pget_fill_value_double_c, H5PGET_FILL_VALUE_DOUBLE_C)
-#define nh5pget_version_c    H5_FC_FUNC_(h5pget_version_c, H5PGET_VERSION_C)
-#define nh5pget_userblock_c    H5_FC_FUNC_(h5pget_userblock_c, H5PGET_USERBLOCK_C)
-#define nh5pset_userblock_c    H5_FC_FUNC_(h5pset_userblock_c, H5PSET_USERBLOCK_C)
-#define nh5pset_sizes_c        H5_FC_FUNC_(h5pset_sizes_c, H5PSET_SIZES_C)
-#define nh5pget_sizes_c         H5_FC_FUNC_(h5pget_sizes_c, H5PGET_SIZES_C)
-#define nh5pget_sym_k_c         H5_FC_FUNC_(h5pget_sym_k_c, H5PGET_SYM_K_C)
-#define nh5pset_sym_k_c         H5_FC_FUNC_(h5pset_sym_k_c, H5PSET_SYM_K_C)
-#define nh5pget_istore_k_c         H5_FC_FUNC_(h5pget_istore_k_c, H5PGET_ISTORE_K_C)
-#define nh5pset_istore_k_c         H5_FC_FUNC_(h5pset_istore_k_c, H5PSET_ISTORE_K_C)
-#define nh5pget_driver_c         H5_FC_FUNC_(h5pget_driver_c, H5PGET_DRIVER_C)
-#define nh5pset_fapl_stdio_c         H5_FC_FUNC_(h5pset_fapl_stdio_c, H5PSET_FAPL_STDIO_C)
-#define nh5pget_fapl_stdio_c         H5_FC_FUNC_(h5pget_fapl_stdio_c, H5PGET_FAPL_STDIO_C)
-#define nh5pset_fapl_sec2_c         H5_FC_FUNC_(h5pset_fapl_sec2_c, H5PSET_FAPL_SEC2_C)
-#define nh5pget_fapl_sec2_c         H5_FC_FUNC_(h5pget_fapl_sec2_c, H5PGET_FAPL_SEC2_C)
-#define nh5pset_alignment_c         H5_FC_FUNC_(h5pset_alignment_c, H5PSET_ALIGNMENT_C)
-#define nh5pget_alignment_c         H5_FC_FUNC_(h5pget_alignment_c, H5PGET_ALIGNMENT_C)
-#define nh5pset_fapl_core_c         H5_FC_FUNC_(h5pset_fapl_core_c, H5PSET_FAPL_CORE_C)
-#define nh5pget_fapl_core_c         H5_FC_FUNC_(h5pget_fapl_core_c, H5PGET_FAPL_CORE_C)
-#define nh5pset_fapl_family_c         H5_FC_FUNC_(h5pset_fapl_family_c, H5PSET_FAPL_FAMILY_C)
-#define nh5pget_fapl_family_c         H5_FC_FUNC_(h5pget_fapl_family_c, H5PGET_FAPL_FAMILY_C)
-#define nh5pset_cache_c         H5_FC_FUNC_(h5pset_cache_c, H5PSET_CACHE_C)
-#define nh5pget_cache_c         H5_FC_FUNC_(h5pget_cache_c, H5PGET_CACHE_C)
-#define nh5pset_fapl_split_c         H5_FC_FUNC_(h5pset_fapl_split_c, H5PSET_FAPL_SPLIT_C)
-#define nh5pget_fapl_split_c         H5_FC_FUNC_(h5pget_fapl_split_c, H5PGET_FAPL_SPLIT_C)
-#define nh5pset_gc_references_c         H5_FC_FUNC_(h5pset_gc_references_c, H5PSET_GC_REFERENCES_C)
-#define nh5pget_gc_references_c         H5_FC_FUNC_(h5pget_gc_references_c, H5PGET_GC_REFERENCES_C)
-#define nh5pset_layout_c         H5_FC_FUNC_(h5pset_layout_c, H5PSET_LAYOUT_C)
-#define nh5pget_layout_c         H5_FC_FUNC_(h5pget_layout_c, H5PGET_LAYOUT_C)
-#define nh5pset_filter_c         H5_FC_FUNC_(h5pset_filter_c, H5PSET_FILTER_C)
-#define nh5premove_filter_c         H5_FC_FUNC_(h5premove_filter_c, H5PREMOVE_FILTER_C)
-#define nh5pmodify_filter_c         H5_FC_FUNC_(h5pmodify_filter_c, H5PMODIFY_FILTER_C)
-#define nh5pget_nfilters_c         H5_FC_FUNC_(h5pget_nfilters_c, H5PGET_NFILTERS_C)
-#define nh5pget_filter_c         H5_FC_FUNC_(h5pget_filter_c, H5PGET_FILTER_C)
-#define nh5pget_filter_by_id_c         H5_FC_FUNC_(h5pget_filter_by_id_c, H5PGET_FILTER_BY_ID_C)
-#define nh5pset_external_c         H5_FC_FUNC_(h5pset_external_c, H5PSET_EXTERNAL_C)
-#define nh5pget_external_count_c         H5_FC_FUNC_(h5pget_external_count_c, H5PGET_EXTERNAL_COUNT_C)
-#define nh5pget_external_c         H5_FC_FUNC_(h5pget_external_c, H5PGET_EXTERNAL_C)
-#define nh5pget_btree_ratios_c         H5_FC_FUNC_(h5pget_btree_ratios_c, H5PGET_BTREE_RATIOS_C)
-#define nh5pset_btree_ratios_c         H5_FC_FUNC_(h5pset_btree_ratios_c, H5PSET_BTREE_RATIOS_C)
-#define nh5pset_fapl_mpio_c         H5_FC_FUNC_(h5pset_fapl_mpio_c, H5PSET_FAPL_MPIO_C)
-#define nh5pget_fapl_mpio_c         H5_FC_FUNC_(h5pget_fapl_mpio_c, H5PGET_FAPL_MPIO_C)
-#define nh5pset_dxpl_mpio_c        H5_FC_FUNC_(h5pset_dxpl_mpio_c, H5PSET_DXPL_MPIO_C)
-#define nh5pget_dxpl_mpio_c        H5_FC_FUNC_(h5pget_dxpl_mpio_c, H5PGET_DXPL_MPIO_C)
-#define nh5pget_fclose_degree_c    H5_FC_FUNC_(h5pget_fclose_degree_c, H5PGET_FCLOSE_DEGREE_C)
-#define nh5pset_fclose_degree_c    H5_FC_FUNC_(h5pset_fclose_degree_c, H5PSET_FCLOSE_DEGREE_C)
-#define nh5pset_buffer_c    H5_FC_FUNC_(h5pset_buffer_c, H5PSET_BUFFER_C)
-#define nh5pget_buffer_c    H5_FC_FUNC_(h5pget_buffer_c, H5PGET_BUFFER_C)
-#define nh5pfill_value_defined_c    H5_FC_FUNC_(h5pfill_value_defined_c, H5PFILL_VALUE_DEFINED_C)
-#define nh5pset_alloc_time_c    H5_FC_FUNC_(h5pset_alloc_time_c, H5PSET_ALLOC_TIME_C)
-#define nh5pget_alloc_time_c    H5_FC_FUNC_(h5pget_alloc_time_c, H5PGET_ALLOC_TIME_C)
-#define nh5pset_fill_time_c    H5_FC_FUNC_(h5pset_fill_time_c, H5PSET_FILL_TIME_C)
-#define nh5pget_fill_time_c    H5_FC_FUNC_(h5pget_fill_time_c, H5PGET_FILL_TIME_C)
-#define nh5pset_meta_block_size_c    H5_FC_FUNC_(h5pset_meta_block_size_c, H5PSET_META_BLOCK_SIZE_C)
-#define nh5pget_meta_block_size_c    H5_FC_FUNC_(h5pget_meta_block_size_c, H5PGET_META_BLOCK_SIZE_C)
-#define nh5pset_sieve_buf_size_c    H5_FC_FUNC_(h5pset_sieve_buf_size_c, H5PSET_SIEVE_BUF_SIZE_C)
-#define nh5pget_sieve_buf_size_c    H5_FC_FUNC_(h5pget_sieve_buf_size_c, H5PGET_SIEVE_BUF_SIZE_C)
-#define nh5pset_hyper_vector_size_c    H5_FC_FUNC_(h5pset_hyper_vector_size_c, H5PSET_HYPER_VECTOR_SIZE_C)
-#define nh5pget_hyper_vector_size_c    H5_FC_FUNC_(h5pget_hyper_vector_size_c, H5PGET_HYPER_VECTOR_SIZE_C)
-#define nh5pset_small_data_block_size_c    H5_FC_FUNC_(h5pset_small_data_block_size_c, H5PSET_SMALL_DATA_BLOCK_SIZE_C)
-#define nh5pget_small_data_block_size_c    H5_FC_FUNC_(h5pget_small_data_block_size_c, H5PGET_SMALL_DATA_BLOCK_SIZE_C)
-#define nh5pregister_integer_c                 H5_FC_FUNC_(h5pregister_integer_c, H5PREGISTER_INTEGER_C)
-#define nh5pregister_real_c                    H5_FC_FUNC_(h5pregister_real_c, H5PREGISTER_REAL_C)
-#define nh5pregister_double_c                  H5_FC_FUNC_(h5pregister_double_c, H5PREGISTER_DOUBLE_C)
-#define nh5pregisterc_c                H5_FC_FUNC_(h5pregisterc_c, H5PREGISTERC_C)
-#define nh5pinsert_integer_c                   H5_FC_FUNC_(h5pinsert_integer_c, H5PINSERT_INTEGER_C)
-#define nh5pinsert_real_c                   H5_FC_FUNC_(h5pinsert_real_c, H5PINSERT_REAL_C)
-#define nh5pinsert_double_c                   H5_FC_FUNC_(h5pinsert_double_c, H5PINSERT_DOUBLE_C)
-#define nh5pinsertc_c                  H5_FC_FUNC_(h5pinsertc_c, H5PINSERTC_C)
-#define nh5pset_integer_c                      H5_FC_FUNC_(h5pset_integer_c, H5PSET_INTEGER_C)
-#define nh5pset_real_c                         H5_FC_FUNC_(h5pset_real_c, H5PSET_REAL_C)
-#define nh5pset_double_c                       H5_FC_FUNC_(h5pset_double_c, H5PSET_DOUBLE_C)
-#define nh5psetc_c                     H5_FC_FUNC_(h5psetc_c, H5PSETC_C)
-#define nh5pget_integer_c                      H5_FC_FUNC_(h5pget_integer_c, H5PGET_INTEGER_C)
-#define nh5pget_real_c                         H5_FC_FUNC_(h5pget_real_c, H5PGET_REAL_C)
-#define nh5pget_double_c                       H5_FC_FUNC_(h5pget_double_c, H5PGET_DOUBLE_C)
-#define nh5pgetc_c                     H5_FC_FUNC_(h5pgetc_c, H5PGETC_C)
-#define nh5pexist_c                    H5_FC_FUNC_(h5pexist_c, H5PEXIST_C)
-#define nh5pget_size_c                 H5_FC_FUNC_(h5pget_size_c, H5PGET_SIZE_C)
-#define nh5pget_nprops_c               H5_FC_FUNC_(h5pget_nprops_c, H5PGET_NPROPS_C)
-#define nh5pget_class_parent_c         H5_FC_FUNC_(h5pget_class_parent_c, H5PGET_CLASS_PARENT_C)
-#define nh5pisa_class_c                H5_FC_FUNC_(h5pisa_class_c, H5PISA_CLASS_C)
-#define nh5pcopy_prop_c                H5_FC_FUNC_(h5pcopy_prop_c, H5PCOPY_PROP_C)
-#define nh5premove_c                   H5_FC_FUNC_(h5premove_c, H5PREMOVE_C)
-#define nh5punregister_c               H5_FC_FUNC_(h5punregister_c, H5PUNREGISTER_C)
-#define nh5pclose_class_c              H5_FC_FUNC_(h5pclose_class_c, H5PCLOSE_CLASS_C)
-#define nh5pget_class_name_c           H5_FC_FUNC_(h5pget_class_name_c, H5PGET_CLASS_NAME_C)
-#define nh5pset_shuffle_c               H5_FC_FUNC_(h5pset_shuffle_c, H5PSET_SHUFFLE_C)
-#define nh5pset_fletcher32_c           H5_FC_FUNC_(h5pset_fletcher32_c, H5PSET_FLETCHER32_C)
-#define nh5pset_edc_check_c            H5_FC_FUNC_(h5pset_edc_check_c, H5PSET_EDC_CHECK_C)
-#define nh5pget_edc_check_c            H5_FC_FUNC_(h5pget_edc_check_c, H5PGET_EDC_CHECK_C)
-#define nh5pset_family_offset_c       H5_FC_FUNC_(h5pset_family_offset_c, H5PSET_FAMILY_OFFSET_C)
-#define nh5pget_fapl_multi_c          H5_FC_FUNC_(h5pget_fapl_multi_c, H5PGET_FAPL_MULTI_C)
-#define nh5pset_fapl_multi_c          H5_FC_FUNC_(h5pset_fapl_multi_c, H5PSET_FAPL_MULTI_C)
-#define nh5pset_fapl_multi_sc          H5_FC_FUNC_(h5pset_fapl_multi_sc, H5PSET_FAPL_MULTI_SC)
-#define nh5pset_szip_c                 H5_FC_FUNC_(h5pset_szip_c, H5PSET_SZIP_C)
-#define nh5pall_filters_avail_c        H5_FC_FUNC_(h5pall_filters_avail_c, H5PALL_FILTERS_AVAIL_C)
-#define nh5pget_attr_phase_change_c    H5_FC_FUNC_(h5pget_attr_phase_change_c, H5PGET_ATTR_PHASE_CHANGE_C)
-#define nh5pset_attr_creation_order_c  H5_FC_FUNC_(h5pset_attr_creation_order_c, H5PSET_ATTR_CREATION_ORDER_C)
-#define nh5pset_shared_mesg_nindexes_c  H5_FC_FUNC_(h5pset_shared_mesg_nindexes_c, H5PSET_SHARED_MESG_NINDEXES_C)
-#define nh5pset_shared_mesg_index_c  H5_FC_FUNC_(h5pset_shared_mesg_index_c,H5PSET_SHARED_MESG_INDEX_C)
-#define nh5pget_attr_creation_order_c  H5_FC_FUNC_(h5pget_attr_creation_order_c,H5PGET_ATTR_CREATION_ORDER_C)
-#define nh5pset_libver_bounds_c H5_FC_FUNC_(h5pset_libver_bounds_c,H5PSET_LIBVER_BOUNDS_C)
-#define nh5pset_link_creation_order_c H5_FC_FUNC_(h5pset_link_creation_order_c, H5PSET_LINK_CREATION_ORDER_C)
-#define nh5pget_link_phase_change_c H5_FC_FUNC_(h5pget_link_phase_change_c, H5PGET_LINK_PHASE_CHANGE_C)
-#define nh5pget_obj_track_times_c H5_FC_FUNC_(h5pget_obj_track_times_c, H5PGET_OBJ_TRACK_TIMES_C)
-#define nh5pset_obj_track_times_c H5_FC_FUNC_(h5pset_obj_track_times_c, H5PSET_OBJ_TRACK_TIMES_C)
-#define nh5pset_create_inter_group_c H5_FC_FUNC_(h5pset_create_inter_group_c,H5PSET_CREATE_INTER_GROUP_C)
-#define nh5pget_create_inter_group_c H5_FC_FUNC_(h5pget_create_inter_group_c,H5PGET_CREATE_INTER_GROUP_C)
-#define nh5pget_link_creation_order_c H5_FC_FUNC_(h5pget_link_creation_order_c,H5PGET_LINK_CREATION_ORDER_C)
-#define nh5pset_char_encoding_c H5_FC_FUNC_(h5pset_char_encoding_c, H5PSET_CHAR_ENCODING_C)
-#define nh5pget_char_encoding_c H5_FC_FUNC_(h5pget_char_encoding_c, H5PGET_CHAR_ENCODING_C)
-#define nh5pset_copy_object_c H5_FC_FUNC_(h5pset_copy_object_c, H5PSET_COPY_OBJECT_C)
-#define nh5pget_copy_object_c H5_FC_FUNC_(h5pget_copy_object_c, H5PGET_COPY_OBJECT_C)
-#define nh5pget_data_transform_c H5_FC_FUNC_(h5pget_data_transform_c, H5PGET_DATA_TRANSFORM_C)
-#define nh5pset_data_transform_c H5_FC_FUNC_(h5pset_data_transform_c, H5PSET_DATA_TRANSFORM_C)
-#define nh5pget_local_heap_size_hint_c H5_FC_FUNC_(h5pget_local_heap_size_hint_c, H5PGET_LOCAL_HEAP_SIZE_HINT_C)
-#define nh5pget_est_link_info_c H5_FC_FUNC_(h5pget_est_link_info_c,H5PGET_EST_LINK_INFO_C)
-#define nh5pset_est_link_info_c H5_FC_FUNC_(h5pset_est_link_info_c,H5PSET_EST_LINK_INFO_C)
-#define nh5pset_local_heap_size_hint_c H5_FC_FUNC_(h5pset_local_heap_size_hint_c, H5PSET_LOCAL_HEAP_SIZE_HINT_C)
-#define nh5pset_link_phase_change_c H5_FC_FUNC_(h5pset_link_phase_change_c, H5PSET_LINK_PHASE_CHANGE_C)
-#define nh5pset_fapl_direct_c H5_FC_FUNC_(h5pset_fapl_direct_c, H5PSET_FAPL_DIRECT_C)
-#define nh5pget_fapl_direct_c H5_FC_FUNC_(h5pget_fapl_direct_c, H5PGET_FAPL_DIRECT_C)
-#define nh5pset_attr_phase_change_c H5_FC_FUNC_(h5pset_attr_phase_change_c, H5PSET_ATTR_PHASE_CHANGE_C)
-#define nh5pset_nbit_c H5_FC_FUNC_(h5pset_nbit_c, H5PSET_NBIT_C)
-#define nh5pset_scaleoffset_c H5_FC_FUNC_(h5pset_scaleoffset_c, H5PSET_SCALEOFFSET_C)
-#define nh5pset_nlinks_c H5_FC_FUNC_(h5pset_nlinks_c, H5PSET_NLINKS_C)
-#define nh5pget_nlinks_c H5_FC_FUNC_(h5pget_nlinks_c, H5PGET_NLINKS_C)
-#define nh5pset_chunk_cache_c H5_FC_FUNC_(h5pset_chunk_cache_c, H5PSET_CHUNK_CACHE_C)
-#define nh5pget_chunk_cache_c H5_FC_FUNC_(h5pget_chunk_cache_c, H5PGET_CHUNK_CACHE_C)
-#define nh5pget_mpio_actual_io_mode_c H5_FC_FUNC_(h5pget_mpio_actual_io_mode_c, H5PGET_MPIO_ACTUAL_IO_MODE_C)
-
-H5_FCDLL int_f nh5pcreate_c ( hid_t_f *cls, hid_t_f *prp_id );
-H5_FCDLL int_f nh5pclose_c ( hid_t_f *prp_id );
-H5_FCDLL int_f nh5pcopy_c ( hid_t_f *prp_id , hid_t_f *new_prp_id);
-H5_FCDLL int_f nh5pequal_c ( hid_t_f *plist1_id , hid_t_f *plist2_id, int_f *c_flag);
-H5_FCDLL int_f nh5pget_class_c ( hid_t_f *prp_id , hid_t_f *classtype);
-H5_FCDLL int_f nh5pset_deflate_c ( hid_t_f *prp_id , int_f *level);
-H5_FCDLL int_f nh5pset_chunk_c ( hid_t_f *prp_id, int_f *rank, hsize_t_f *dims );
-H5_FCDLL int_f nh5pget_chunk_c ( hid_t_f *prp_id, int_f *max_rank, hsize_t_f *dims );
-H5_FCDLL int_f h5pset_file_image_c (hid_t_f *fapl_id, void *buf_ptr, size_t_f *buf_len);
-H5_FCDLL int_f nh5pset_fill_valuec_c (hid_t_f *prp_id, hid_t_f *type_id, _fcd fillvalue);
-H5_FCDLL int_f h5pset_fill_value_c (hid_t_f *prp_id, hid_t_f *type_id, void *fillvalue);
-H5_FCDLL int_f nh5pset_fill_value_integer_c (hid_t_f *prp_id, hid_t_f *type_id, void *fillvalue);
-H5_FCDLL int_f nh5pset_fill_value_real_c (hid_t_f *prp_id, hid_t_f *type_id, void *fillvalue);
-H5_FCDLL int_f nh5pset_fill_value_double_c (hid_t_f *prp_id, hid_t_f *type_id, void *fillvalue);
-H5_FCDLL int_f h5pget_file_image_c (hid_t_f *fapl_id, void **buf_ptr, size_t_f *buf_len);
-H5_FCDLL int_f nh5pget_fill_valuec_c (hid_t_f *prp_id, hid_t_f *type_id, _fcd fillvalue);
-H5_FCDLL int_f h5pget_fill_value_c (hid_t_f *prp_id, hid_t_f *type_id, void *fillvalue);
-H5_FCDLL int_f nh5pget_fill_value_integer_c (hid_t_f *prp_id, hid_t_f *type_id, void *fillvalue);
-H5_FCDLL int_f nh5pget_fill_value_real_c (hid_t_f *prp_id, hid_t_f *type_id, void *fillvalue);
-H5_FCDLL int_f nh5pget_fill_value_double_c (hid_t_f *prp_id, hid_t_f *type_id, void *fillvalue);
-H5_FCDLL int_f nh5pset_preserve_c ( hid_t_f *prp_id , int_f *flag);
-H5_FCDLL int_f nh5pget_preserve_c ( hid_t_f *prp_id , int_f *flag);
-H5_FCDLL int_f nh5pget_version_c (hid_t_f *prp_id, int_f * boot,int_f * freelist, int_f * stab, int_f *shhdr);
-H5_FCDLL int_f nh5pset_userblock_c (hid_t_f *prp_id, hsize_t_f * size);
-H5_FCDLL int_f nh5pget_userblock_c (hid_t_f *prp_id, hsize_t_f * size);
-H5_FCDLL int_f nh5pget_sizes_c (hid_t_f *prp_id, size_t_f * sizeof_addr, size_t_f * sizeof_size);
-H5_FCDLL int_f nh5pset_sizes_c (hid_t_f *prp_id, size_t_f * sizeof_addr, size_t_f * sizeof_size);
-H5_FCDLL int_f nh5pset_sym_k_c (hid_t_f *prp_id, int_f* ik, int_f* lk);
-H5_FCDLL int_f nh5pget_sym_k_c (hid_t_f *prp_id, int_f* ik, int_f* lk);
-H5_FCDLL int_f nh5pset_istore_k_c (hid_t_f *prp_id, int_f* ik);
-H5_FCDLL int_f nh5pget_istore_k_c (hid_t_f *prp_id, int_f* ik);
-H5_FCDLL int_f nh5pget_driver_c (hid_t_f *prp_id, hid_t_f*driver);
-H5_FCDLL int_f nh5pset_fapl_stdio_c (hid_t_f *prp_id);
-H5_FCDLL int_f nh5pget_fapl_stdio_c (hid_t_f *prp_id, int_f* io);
-H5_FCDLL int_f nh5pset_fapl_sec2_c (hid_t_f *prp_id);
-H5_FCDLL int_f nh5pget_fapl_sec2_c (hid_t_f *prp_id, int_f* sec2);
-H5_FCDLL int_f nh5pset_alignment_c(hid_t_f *prp_id, hsize_t_f* threshold, hsize_t_f* alignment);
-H5_FCDLL int_f nh5pget_alignment_c(hid_t_f *prp_id, hsize_t_f* threshold, hsize_t_f* alignment);
-H5_FCDLL int_f nh5pget_fapl_core_c (hid_t_f *prp_id, size_t_f* increment, int_f *flag);
-H5_FCDLL int_f nh5pset_fapl_core_c (hid_t_f *prp_id, size_t_f* increment, int_f *flag);
-H5_FCDLL int_f nh5pset_fapl_family_c (hid_t_f *prp_id, hsize_t_f* memb_size, hid_t_f* memb_plist );
-H5_FCDLL int_f nh5pget_fapl_family_c (hid_t_f *prp_id, hsize_t_f* memb_size, hid_t_f* memb_plist );
-H5_FCDLL int_f nh5pset_cache_c(hid_t_f *prp_id, int_f* mdc_nelmts, size_t_f* rdcc_nelmts, size_t_f* rdcc_nbytes, real_f* rdcc_w0);
-H5_FCDLL int_f nh5pget_cache_c(hid_t_f *prp_id, int_f* mdc_nelmts, size_t_f* rdcc_nelmts, size_t_f* rdcc_nbytes, real_f* rdcc_w0);
-H5_FCDLL int_f nh5pget_fapl_split_c(hid_t_f *prp_id, size_t_f* meta_ext_size , _fcd meta_ext, hid_t_f* meta_plist, size_t_f* raw_ext_size, _fcd raw_ext, hid_t_f * raw_plist);
-H5_FCDLL int_f nh5pset_fapl_split_c(hid_t_f *prp_id, int_f* meta_len, _fcd meta_ext, hid_t_f* meta_plist, int_f* raw_len, _fcd raw_ext, hid_t_f * raw_plist);
-H5_FCDLL int_f nh5pset_gc_references_c(hid_t_f *prp_id, int_f* gc_references);
-H5_FCDLL int_f nh5pget_gc_references_c(hid_t_f *prp_id, int_f* gc_references);
-H5_FCDLL int_f nh5pset_layout_c (hid_t_f *prp_id, int_f* layout);
-H5_FCDLL int_f nh5pget_layout_c (hid_t_f *prp_id, int_f* layout);
-H5_FCDLL int_f nh5pset_filter_c (hid_t_f *prp_id, int_f* filter, int_f* flags, size_t_f* cd_nelmts, int_f* cd_values );
-H5_FCDLL int_f nh5premove_filter_c (hid_t_f *prp_id, int_f* filter);
-H5_FCDLL int_f nh5pmodify_filter_c (hid_t_f *prp_id, int_f* filter, int_f* flags, size_t_f* cd_nelmts, int_f* cd_values );
-H5_FCDLL int_f nh5pget_nfilters_c (hid_t_f *prp_id, int_f* nfilters);
-H5_FCDLL int_f nh5pget_filter_c(hid_t_f *prp_id, int_f* filter_number, int_f* flags, size_t_f* cd_nelmts, int_f* cd_values, size_t_f *namelen, _fcd name, int_f* filter_id);
-H5_FCDLL int_f nh5pget_filter_by_id_c(hid_t_f *prp_id, int_f* filter_id, int_f* flags, size_t_f* cd_nelmts, int_f* cd_values, size_t_f *namelen, _fcd name);
-H5_FCDLL int_f nh5pset_external_c (hid_t_f *prp_id, _fcd name, int_f* namelen, off_t_f* offset, hsize_t_f*bytes);
-H5_FCDLL int_f nh5pget_external_count_c (hid_t_f *prp_id, int_f* count);
-H5_FCDLL int_f nh5pget_external_c(hid_t_f *prp_id, int_f *idx, size_t_f* name_size, _fcd name, off_t_f* offset, hsize_t_f*bytes);
-H5_FCDLL int_f nh5pget_btree_ratios_c(hid_t_f *prp_id, real_f* left, real_f* middle, real_f* right);
-H5_FCDLL int_f nh5pset_btree_ratios_c(hid_t_f *prp_id, real_f* left, real_f* middle, real_f* right);
-H5_FCDLL int_f nh5pget_fapl_mpio_c(hid_t_f *prp_id, int_f* comm, int_f* info);
-H5_FCDLL int_f nh5pset_fapl_mpio_c(hid_t_f *prp_id, int_f* comm, int_f* info);
-H5_FCDLL int_f nh5pget_dxpl_mpio_c(hid_t_f *prp_id, int_f* data_xfer_mode);
-H5_FCDLL int_f nh5pset_dxpl_mpio_c(hid_t_f *prp_id, int_f* data_xfer_mode);
-H5_FCDLL int_f nh5pset_fclose_degree_c(hid_t_f *fapl, int_f *degree);
-H5_FCDLL int_f nh5pget_fclose_degree_c(hid_t_f *fapl, int_f *degree);
-H5_FCDLL int_f nh5pget_buffer_c(hid_t_f *plist, hsize_t_f *size);
-H5_FCDLL int_f nh5pset_buffer_c(hid_t_f *plist, hsize_t_f *size);
-H5_FCDLL int_f nh5pset_alloc_time_c(hid_t_f *plist, int_f *flag);
-H5_FCDLL int_f nh5pget_alloc_time_c(hid_t_f *plist, int_f *flag);
-H5_FCDLL int_f nh5pset_fill_time_c(hid_t_f *plist, int_f *flag);
-H5_FCDLL int_f nh5pget_fill_time_c(hid_t_f *plist, int_f *flag);
-H5_FCDLL int_f nh5pset_meta_block_size_c(hid_t_f *plist, hsize_t_f *size);
-H5_FCDLL int_f nh5pget_meta_block_size_c(hid_t_f *plist, hsize_t_f *size);
-H5_FCDLL int_f nh5pset_sieve_buf_size_c(hid_t_f *plist, size_t_f *size);
-H5_FCDLL int_f nh5pget_sieve_buf_size_c(hid_t_f *plist, size_t_f *size);
-H5_FCDLL int_f nh5pset_small_data_block_size_c(hid_t_f *plist, hsize_t_f *size);
-H5_FCDLL int_f nh5pget_small_data_block_size_c(hid_t_f *plist, hsize_t_f *size);
-H5_FCDLL int_f nh5pset_hyper_vector_size_c(hid_t_f *plist, size_t_f *size);
-H5_FCDLL int_f nh5pget_hyper_vector_size_c(hid_t_f *plist, size_t_f *size);
+H5_FCDLL int_f h5pcreate_c( hid_t_f *cls, hid_t_f *prp_id );
+H5_FCDLL int_f h5pclose_c( hid_t_f *prp_id );
+H5_FCDLL int_f h5pcopy_c( hid_t_f *prp_id , hid_t_f *new_prp_id);
+H5_FCDLL int_f h5pequal_c( hid_t_f *plist1_id , hid_t_f *plist2_id, int_f *c_flag);
+H5_FCDLL int_f h5pget_class_c( hid_t_f *prp_id , hid_t_f *classtype);
+H5_FCDLL int_f h5pset_deflate_c( hid_t_f *prp_id , int_f *level);
+H5_FCDLL int_f h5pset_chunk_c( hid_t_f *prp_id, int_f *rank, hsize_t_f *dims );
+H5_FCDLL int_f h5pget_chunk_c( hid_t_f *prp_id, int_f *max_rank, hsize_t_f *dims );
+H5_FCDLL int_f h5pset_file_image_c(hid_t_f *fapl_id, void *buf_ptr, size_t_f *buf_len);
+H5_FCDLL int_f h5pset_fill_value_c(hid_t_f *prp_id, hid_t_f *type_id, void *fillvalue);
+H5_FCDLL int_f h5pget_file_image_c(hid_t_f *fapl_id, void **buf_ptr, size_t_f *buf_len);
+H5_FCDLL int_f h5pget_fill_value_c(hid_t_f *prp_id, hid_t_f *type_id, void *fillvalue);
+H5_FCDLL int_f h5pset_preserve_c( hid_t_f *prp_id , int_f *flag);
+H5_FCDLL int_f h5pget_preserve_c( hid_t_f *prp_id , int_f *flag);
+H5_FCDLL int_f h5pget_version_c(hid_t_f *prp_id, int_f * boot,int_f * freelist, int_f * stab, int_f *shhdr);
+H5_FCDLL int_f h5pset_userblock_c(hid_t_f *prp_id, hsize_t_f * size);
+H5_FCDLL int_f h5pget_userblock_c(hid_t_f *prp_id, hsize_t_f * size);
+H5_FCDLL int_f h5pget_sizes_c(hid_t_f *prp_id, size_t_f * sizeof_addr, size_t_f * sizeof_size);
+H5_FCDLL int_f h5pset_sizes_c(hid_t_f *prp_id, size_t_f * sizeof_addr, size_t_f * sizeof_size);
+H5_FCDLL int_f h5pset_sym_k_c(hid_t_f *prp_id, int_f* ik, int_f* lk);
+H5_FCDLL int_f h5pget_sym_k_c(hid_t_f *prp_id, int_f* ik, int_f* lk);
+H5_FCDLL int_f h5pset_istore_k_c(hid_t_f *prp_id, int_f* ik);
+H5_FCDLL int_f h5pget_istore_k_c(hid_t_f *prp_id, int_f* ik);
+H5_FCDLL int_f h5pget_driver_c(hid_t_f *prp_id, hid_t_f*driver);
+H5_FCDLL int_f h5pset_fapl_stdio_c(hid_t_f *prp_id);
+#ifdef NO_SUCH_F90_FUNCTION
+H5_FCDLL int_f h5pget_fapl_stdio_c(hid_t_f *prp_id, int_f* io);
+#endif
+H5_FCDLL int_f h5pset_fapl_sec2_c(hid_t_f *prp_id);
+#ifdef NO_SUCH_F90_FUNCTION
+H5_FCDLL int_f h5pget_fapl_sec2_c(hid_t_f *prp_id, int_f* sec2);
+#endif
+H5_FCDLL int_f h5pset_alignment_c(hid_t_f *prp_id, hsize_t_f* threshold, hsize_t_f* alignment);
+H5_FCDLL int_f h5pget_alignment_c(hid_t_f *prp_id, hsize_t_f* threshold, hsize_t_f* alignment);
+H5_FCDLL int_f h5pget_fapl_core_c(hid_t_f *prp_id, size_t_f* increment, int_f *flag);
+H5_FCDLL int_f h5pset_fapl_core_c(hid_t_f *prp_id, size_t_f* increment, int_f *flag);
+H5_FCDLL int_f h5pset_fapl_family_c(hid_t_f *prp_id, hsize_t_f* memb_size, hid_t_f* memb_plist );
+H5_FCDLL int_f h5pget_fapl_family_c(hid_t_f *prp_id, hsize_t_f* memb_size, hid_t_f* memb_plist );
+H5_FCDLL int_f h5pset_cache_c(hid_t_f *prp_id, int_f* mdc_nelmts, size_t_f* rdcc_nelmts, size_t_f* rdcc_nbytes, real_f* rdcc_w0);
+H5_FCDLL int_f h5pget_cache_c(hid_t_f *prp_id, int_f* mdc_nelmts, size_t_f* rdcc_nelmts, size_t_f* rdcc_nbytes, real_f* rdcc_w0);
+#ifdef NO_SUCH_F90_FUNCTION
+H5_FCDLL int_f h5pget_fapl_split_c(hid_t_f *prp_id, size_t_f* meta_ext_size , _fcd meta_ext, hid_t_f* meta_plist, size_t_f* raw_ext_size, _fcd raw_ext, hid_t_f * raw_plist);
+#endif
+H5_FCDLL int_f h5pset_fapl_split_c(hid_t_f *prp_id, int_f* meta_len, _fcd meta_ext, hid_t_f* meta_plist, int_f* raw_len, _fcd raw_ext, hid_t_f * raw_plist);
+H5_FCDLL int_f h5pset_gc_references_c(hid_t_f *prp_id, int_f* gc_references);
+H5_FCDLL int_f h5pget_gc_references_c(hid_t_f *prp_id, int_f* gc_references);
+H5_FCDLL int_f h5pset_layout_c(hid_t_f *prp_id, int_f* layout);
+H5_FCDLL int_f h5pget_layout_c(hid_t_f *prp_id, int_f* layout);
+H5_FCDLL int_f h5pset_filter_c(hid_t_f *prp_id, int_f* filter, int_f* flags, size_t_f* cd_nelmts, int_f* cd_values );
+H5_FCDLL int_f h5premove_filter_c(hid_t_f *prp_id, int_f* filter);
+H5_FCDLL int_f h5pmodify_filter_c(hid_t_f *prp_id, int_f* filter, int_f* flags, size_t_f* cd_nelmts, int_f* cd_values );
+H5_FCDLL int_f h5pget_nfilters_c(hid_t_f *prp_id, int_f* nfilters);
+H5_FCDLL int_f h5pget_filter_c(hid_t_f *prp_id, int_f* filter_number, int_f* flags, size_t_f* cd_nelmts, int_f* cd_values, size_t_f *namelen, _fcd name, int_f* filter_id);
+H5_FCDLL int_f h5pget_filter_by_id_c(hid_t_f *prp_id, int_f* filter_id, int_f* flags, size_t_f* cd_nelmts, int_f* cd_values, size_t_f *namelen, _fcd name);
+H5_FCDLL int_f h5pset_external_c(hid_t_f *prp_id, _fcd name, int_f* namelen, off_t_f* offset, hsize_t_f*bytes);
+H5_FCDLL int_f h5pget_external_count_c(hid_t_f *prp_id, int_f* count);
+H5_FCDLL int_f h5pget_external_c(hid_t_f *prp_id, int_f *idx, size_t_f* name_size, _fcd name, off_t_f* offset, hsize_t_f*bytes);
+H5_FCDLL int_f h5pget_btree_ratios_c(hid_t_f *prp_id, real_f* left, real_f* middle, real_f* right);
+H5_FCDLL int_f h5pset_btree_ratios_c(hid_t_f *prp_id, real_f* left, real_f* middle, real_f* right);
+H5_FCDLL int_f h5pset_fclose_degree_c(hid_t_f *fapl, int_f *degree);
+H5_FCDLL int_f h5pget_fclose_degree_c(hid_t_f *fapl, int_f *degree);
+H5_FCDLL int_f h5pget_buffer_c(hid_t_f *plist, hsize_t_f *size);
+H5_FCDLL int_f h5pset_buffer_c(hid_t_f *plist, hsize_t_f *size);
+H5_FCDLL int_f h5pset_alloc_time_c(hid_t_f *plist, int_f *flag);
+H5_FCDLL int_f h5pget_alloc_time_c(hid_t_f *plist, int_f *flag);
+H5_FCDLL int_f h5pset_fill_time_c(hid_t_f *plist, int_f *flag);
+H5_FCDLL int_f h5pget_fill_time_c(hid_t_f *plist, int_f *flag);
+H5_FCDLL int_f h5pset_meta_block_size_c(hid_t_f *plist, hsize_t_f *size);
+H5_FCDLL int_f h5pget_meta_block_size_c(hid_t_f *plist, hsize_t_f *size);
+H5_FCDLL int_f h5pset_sieve_buf_size_c(hid_t_f *plist, size_t_f *size);
+H5_FCDLL int_f h5pget_sieve_buf_size_c(hid_t_f *plist, size_t_f *size);
+H5_FCDLL int_f h5pset_small_data_block_size_c(hid_t_f *plist, hsize_t_f *size);
+H5_FCDLL int_f h5pget_small_data_block_size_c(hid_t_f *plist, hsize_t_f *size);
+H5_FCDLL int_f h5pset_hyper_vector_size_c(hid_t_f *plist, size_t_f *size);
+H5_FCDLL int_f h5pget_hyper_vector_size_c(hid_t_f *plist, size_t_f *size);
 H5_FCDLL int_f h5pcreate_class_c(hid_t_f *parent, _fcd name, int_f *name_len, hid_t_f *cls,
 				  H5P_cls_create_func_t create, void *create_data,
 				  H5P_cls_copy_func_t copy, void *copy_data,
 				  H5P_cls_close_func_t close, void *close_data);
-H5_FCDLL int_f nh5pcreate_class_f90_c(hid_t_f *parent, _fcd name, int_f *name_len, hid_t_f *cls);
 H5_FCDLL int_f h5pregister_c(hid_t_f *cls, _fcd name, int_f * name_len, size_t_f *size, void *value);
-H5_FCDLL int_f nh5pregister_integer_c(hid_t_f *cls, _fcd name, int_f * name_len, size_t_f *size, void *value);
-H5_FCDLL int_f nh5pregister_real_c(hid_t_f *cls, _fcd name, int_f * name_len, size_t_f *size, void *value);
-H5_FCDLL int_f nh5pregister_double_c(hid_t_f *cls, _fcd name, int_f * name_len, size_t_f *size, void *value);
-H5_FCDLL int_f nh5pregisterc_c(hid_t_f *cls, _fcd name, int_f * name_len, size_t_f *size, _fcd value, int_f *value_len);
 H5_FCDLL int_f h5pinsert_c(hid_t_f  *plist, _fcd name, int_f *name_len, size_t_f *size, void *value);
-H5_FCDLL int_f nh5pinsert_integer_c(hid_t_f  *plist, _fcd name, int_f *name_len, size_t_f *size, void *value);
-H5_FCDLL int_f nh5pinsert_real_c(hid_t_f  *plist, _fcd name, int_f *name_len, size_t_f *size, void *value);
-H5_FCDLL int_f nh5pinsert_double_c(hid_t_f  *plist, _fcd name, int_f *name_len, size_t_f *size, void *value);
-H5_FCDLL int_f nh5pinsertc_c(hid_t_f  *plist, _fcd name, int_f *name_len, size_t_f *size, _fcd value, int_f *value_len);
 H5_FCDLL int_f h5pset_c(hid_t_f *prp_id, _fcd name, int_f *name_len, void *value);
-H5_FCDLL int_f nh5pset_integer_c(hid_t_f *prp_id, _fcd name, int_f *name_len, void *value);
-H5_FCDLL int_f nh5pset_real_c(hid_t_f *prp_id, _fcd name, int_f *name_len, void *value);
-H5_FCDLL int_f nh5pset_double_c(hid_t_f *prp_id, _fcd name, int_f *name_len, void *value);
-H5_FCDLL int_f nh5psetc_c(hid_t_f *prp_id, _fcd name, int_f *name_len, _fcd value, int_f *value_len);
 H5_FCDLL int_f h5pget_c(hid_t_f *prp_id, _fcd name, int_f *name_len, void *value);
-H5_FCDLL int_f nh5pget_double_c(hid_t_f *prp_id, _fcd name, int_f *name_len, void *value);
-H5_FCDLL int_f nh5pget_integer_c(hid_t_f *prp_id, _fcd name, int_f *name_len, void *value);
-H5_FCDLL int_f nh5pget_real_c(hid_t_f *prp_id, _fcd name, int_f *name_len, void *value);
-H5_FCDLL int_f nh5pgetc_c(hid_t_f *prp_id, _fcd name, int_f *name_len, _fcd value, int_f *value_len);
-H5_FCDLL int_f nh5pexist_c(hid_t_f *prp_id, _fcd name, int_f *name_len);
-H5_FCDLL int_f nh5pget_size_c(hid_t_f *prp_id, _fcd name, int_f *name_len, size_t_f *size);
-H5_FCDLL int_f nh5pget_nprops_c(hid_t_f *prp_id, size_t_f *nprops);
-H5_FCDLL int_f nh5pget_class_parent_c(hid_t_f *prp_id, hid_t_f *parent_id);
-H5_FCDLL int_f nh5pisa_class_c(hid_t_f *plist, hid_t_f *pclass);
-H5_FCDLL int_f nh5pcopy_prop_c(hid_t_f *dst_id, hid_t_f *src_id, _fcd name, int_f *name_len);
-H5_FCDLL int_f nh5premove_c(hid_t_f *plid, _fcd name, int_f *name_len);
-H5_FCDLL int_f nh5punregister_c(hid_t_f *cls, _fcd name, int_f *name_len);
-H5_FCDLL int_f nh5pclose_class_c(hid_t_f * cls);
-H5_FCDLL int_f nh5pget_class_name_c(hid_t_f *prp_id, _fcd name, int_f *name_len);
-H5_FCDLL int_f nh5pset_shuffle_c ( hid_t_f *prp_id);
-H5_FCDLL int_f nh5pset_fletcher32_c ( hid_t_f *prp_id );
-H5_FCDLL int_f nh5pset_edc_check_c ( hid_t_f *prp_id, int_f *flag );
-H5_FCDLL int_f nh5pget_edc_check_c ( hid_t_f *prp_id, int_f *flag );
-H5_FCDLL int_f nh5pset_family_offset_c ( hid_t_f *prp_id , hsize_t_f *offset);
-H5_FCDLL int_f nh5pget_fapl_multi_c ( hid_t_f *prp_id , int_f *mem_map, hid_t_f *memb_fapl, _fcd memb_name, int_f *len, int_f *lenmax, real_f *memb_addr, int_f *flag, int_f *maxlen_out);
-H5_FCDLL int_f nh5pset_fapl_multi_c ( hid_t_f *prp_id , int_f *mem_map, hid_t_f *memb_fapl, _fcd memb_name, int_f *len, int_f *lenmax, real_f *memb_addr, int_f *flag);
-H5_FCDLL int_f nh5pset_fapl_multi_sc ( hid_t_f *prp_id , int_f *flag);
-H5_FCDLL int_f nh5pset_szip_c ( hid_t_f *prp_id , int_f *options_mask, int_f *pixels_per_block);
-H5_FCDLL int_f nh5pall_filters_avail_c ( hid_t_f *prp_id , int_f *status);
-H5_FCDLL int_f nh5pfill_value_defined_c ( hid_t_f *prp_id , int_f *flag);
-H5_FCDLL int_f nh5pget_attr_phase_change_c (hid_t_f *ocpl_id, int_f *max_compact, int_f *min_dense );
-H5_FCDLL int_f nh5pset_attr_creation_order_c(hid_t_f *ocpl_id, int_f *crt_order_flags );
-H5_FCDLL int_f nh5pset_shared_mesg_nindexes_c(hid_t_f *plist_id, int_f *nindexes );
-H5_FCDLL int_f nh5pset_shared_mesg_index_c(hid_t_f *fcpl_id, int_f *index_num, int_f *mesg_type_flags, int_f *min_mesg_size);
-H5_FCDLL int_f nh5pget_attr_creation_order_c(hid_t_f *ocpl_id, int_f *crt_order_flags);
-H5_FCDLL int_f nh5pset_libver_bounds_c(hid_t_f *fapl_id, int_f *low, int_f *high);
-H5_FCDLL int_f nh5pset_link_creation_order_c(hid_t_f *gcpl_id, int_f *crt_order_flags);
-H5_FCDLL int_f nh5pget_link_phase_change_c(hid_t_f *gcpl_id, int_f *max_compact, int_f *min_dense );
-H5_FCDLL int_f nh5pget_obj_track_times_c(hid_t_f *plist_id, int_f *flag);
-H5_FCDLL int_f nh5pset_obj_track_times_c(hid_t_f *plist_id, int_f *flag);
-H5_FCDLL int_f nh5pset_create_inter_group_c(hid_t_f *lcpl_id, int_f *crt_intermed_group);
-H5_FCDLL int_f nh5pget_create_inter_group_c(hid_t_f *lcpl_id, int_f *crt_intermed_group);
-H5_FCDLL int_f nh5pget_link_creation_order_c(hid_t_f *gcpl_id, int_f *crt_order_flags);
-H5_FCDLL int_f nh5pset_char_encoding_c(hid_t_f *plist_id, int_f *encoding);
-H5_FCDLL int_f nh5pget_char_encoding_c(hid_t_f *plist_id, int_f *encoding);
-H5_FCDLL int_f nh5pset_copy_object_c(hid_t_f *ocp_plist_id, int_f *copy_options);
-H5_FCDLL int_f nh5pget_copy_object_c(hid_t_f *ocp_plist_id, int_f *copy_options);
-H5_FCDLL int_f nh5pget_data_transform_c(hid_t_f *plist_id, _fcd expression, int_f *expression_len, size_t_f *size);
-H5_FCDLL int_f nh5pset_data_transform_c(hid_t_f *plist_id, _fcd expression, int_f *expression_len);
-H5_FCDLL int_f nh5pget_local_heap_size_hint_c(hid_t_f *gcpl_id, size_t_f *size_hint);
-H5_FCDLL int_f nh5pget_est_link_info_c(hid_t_f *gcpl_id, int_f *est_num_entries, int_f *est_name_len);
-H5_FCDLL int_f nh5pset_local_heap_size_hint_c(hid_t_f *gcpl_id, size_t_f *size_hint);
-H5_FCDLL int_f nh5pset_est_link_info_c(hid_t_f *gcpl_id, int_f *est_num_entries, int_f *est_name_len);
-H5_FCDLL int_f nh5pset_link_phase_change_c(hid_t_f *gcpl_id, int_f *max_compact, int_f *min_dense );
-H5_FCDLL int_f nh5pset_fapl_direct_c(hid_t_f *fapl_id, size_t_f *alignment, size_t_f *block_size, size_t_f *cbuf_size );
-H5_FCDLL int_f nh5pget_fapl_direct_c(hid_t_f *fapl_id, size_t_f *alignment, size_t_f *block_size, size_t_f *cbuf_size );
-H5_FCDLL int_f nh5pset_attr_phase_change_c (hid_t_f *ocpl_id, int_f *max_compact, int_f *min_dense );
-H5_FCDLL int_f nh5pset_nbit_c(hid_t_f *plist_id );
-H5_FCDLL int_f nh5pset_scaleoffset_c(hid_t_f *plist_id, int_f *scale_type, int_f *scale_factor );
-H5_FCDLL int_f nh5pset_nlinks_c(hid_t_f *lapl_id, size_t_f *nlinks);
-H5_FCDLL int_f nh5pget_nlinks_c(hid_t_f *lapl_id, size_t_f *nlinks);
-H5_FCDLL int_f nh5pset_chunk_cache_c(hid_t_f *dapl_id, size_t_f *rdcc_nslots, size_t_f *rdcc_nbytes, real_f *rdcc_w0);
-H5_FCDLL int_f nh5pget_chunk_cache_c(hid_t_f *dapl_id, size_t_f *rdcc_nslots, size_t_f *rdcc_nbytes, real_f *rdcc_w0);
-H5_FCDLL int_f nh5pget_mpio_actual_io_mode_c(hid_t_f *dxpl_id, int_f *actual_io_mode);
+H5_FCDLL int_f h5pexist_c(hid_t_f *prp_id, _fcd name, int_f *name_len);
+H5_FCDLL int_f h5pget_size_c(hid_t_f *prp_id, _fcd name, int_f *name_len, size_t_f *size);
+H5_FCDLL int_f h5pget_nprops_c(hid_t_f *prp_id, size_t_f *nprops);
+H5_FCDLL int_f h5pget_class_parent_c(hid_t_f *prp_id, hid_t_f *parent_id);
+H5_FCDLL int_f h5pisa_class_c(hid_t_f *plist, hid_t_f *pclass);
+H5_FCDLL int_f h5pcopy_prop_c(hid_t_f *dst_id, hid_t_f *src_id, _fcd name, int_f *name_len);
+H5_FCDLL int_f h5premove_c(hid_t_f *plid, _fcd name, int_f *name_len);
+H5_FCDLL int_f h5punregister_c(hid_t_f *cls, _fcd name, int_f *name_len);
+H5_FCDLL int_f h5pclose_class_c(hid_t_f * cls);
+H5_FCDLL int_f h5pget_class_name_c(hid_t_f *prp_id, _fcd name, int_f *name_len);
+H5_FCDLL int_f h5pset_shuffle_c( hid_t_f *prp_id);
+H5_FCDLL int_f h5pset_fletcher32_c( hid_t_f *prp_id );
+H5_FCDLL int_f h5pset_edc_check_c( hid_t_f *prp_id, int_f *flag );
+H5_FCDLL int_f h5pget_edc_check_c( hid_t_f *prp_id, int_f *flag );
+H5_FCDLL int_f h5pset_family_offset_c( hid_t_f *prp_id , hsize_t_f *offset);
+H5_FCDLL int_f h5pget_fapl_multi_c( hid_t_f *prp_id , int_f *mem_map, hid_t_f *memb_fapl, _fcd memb_name, int_f *len, int_f *lenmax, real_f *memb_addr, int_f *flag, int_f *maxlen_out);
+H5_FCDLL int_f h5pset_fapl_multi_c( hid_t_f *prp_id , int_f *mem_map, hid_t_f *memb_fapl, _fcd memb_name, int_f *len, int_f *lenmax, real_f *memb_addr, int_f *flag);
+H5_FCDLL int_f h5pset_fapl_multi_sc ( hid_t_f *prp_id , int_f *flag);
+H5_FCDLL int_f h5pset_szip_c( hid_t_f *prp_id , int_f *options_mask, int_f *pixels_per_block);
+H5_FCDLL int_f h5pall_filters_avail_c( hid_t_f *prp_id , int_f *status);
+H5_FCDLL int_f h5pfill_value_defined_c( hid_t_f *prp_id , int_f *flag);
+H5_FCDLL int_f h5pget_attr_phase_change_c(hid_t_f *ocpl_id, int_f *max_compact, int_f *min_dense );
+H5_FCDLL int_f h5pset_attr_creation_order_c(hid_t_f *ocpl_id, int_f *crt_order_flags );
+H5_FCDLL int_f h5pset_shared_mesg_nindexes_c(hid_t_f *plist_id, int_f *nindexes );
+H5_FCDLL int_f h5pset_shared_mesg_index_c(hid_t_f *fcpl_id, int_f *index_num, int_f *mesg_type_flags, int_f *min_mesg_size);
+H5_FCDLL int_f h5pget_attr_creation_order_c(hid_t_f *ocpl_id, int_f *crt_order_flags);
+H5_FCDLL int_f h5pset_libver_bounds_c(hid_t_f *fapl_id, int_f *low, int_f *high);
+H5_FCDLL int_f h5pset_link_creation_order_c(hid_t_f *gcpl_id, int_f *crt_order_flags);
+H5_FCDLL int_f h5pget_link_phase_change_c(hid_t_f *gcpl_id, int_f *max_compact, int_f *min_dense );
+H5_FCDLL int_f h5pget_obj_track_times_c(hid_t_f *plist_id, int_f *flag);
+H5_FCDLL int_f h5pset_obj_track_times_c(hid_t_f *plist_id, int_f *flag);
+H5_FCDLL int_f h5pset_create_inter_group_c(hid_t_f *lcpl_id, int_f *crt_intermed_group);
+H5_FCDLL int_f h5pget_create_inter_group_c(hid_t_f *lcpl_id, int_f *crt_intermed_group);
+H5_FCDLL int_f h5pget_link_creation_order_c(hid_t_f *gcpl_id, int_f *crt_order_flags);
+H5_FCDLL int_f h5pset_char_encoding_c(hid_t_f *plist_id, int_f *encoding);
+H5_FCDLL int_f h5pget_char_encoding_c(hid_t_f *plist_id, int_f *encoding);
+H5_FCDLL int_f h5pset_copy_object_c(hid_t_f *ocp_plist_id, int_f *copy_options);
+H5_FCDLL int_f h5pget_copy_object_c(hid_t_f *ocp_plist_id, int_f *copy_options);
+H5_FCDLL int_f h5pget_data_transform_c(hid_t_f *plist_id, _fcd expression, int_f *expression_len, size_t_f *size);
+H5_FCDLL int_f h5pset_data_transform_c(hid_t_f *plist_id, _fcd expression, int_f *expression_len);
+H5_FCDLL int_f h5pget_local_heap_size_hint_c(hid_t_f *gcpl_id, size_t_f *size_hint);
+H5_FCDLL int_f h5pget_est_link_info_c(hid_t_f *gcpl_id, int_f *est_num_entries, int_f *est_name_len);
+H5_FCDLL int_f h5pset_local_heap_size_hint_c(hid_t_f *gcpl_id, size_t_f *size_hint);
+H5_FCDLL int_f h5pset_est_link_info_c(hid_t_f *gcpl_id, int_f *est_num_entries, int_f *est_name_len);
+H5_FCDLL int_f h5pset_link_phase_change_c(hid_t_f *gcpl_id, int_f *max_compact, int_f *min_dense );
+H5_FCDLL int_f h5pset_fapl_direct_c(hid_t_f *fapl_id, size_t_f *alignment, size_t_f *block_size, size_t_f *cbuf_size );
+H5_FCDLL int_f h5pget_fapl_direct_c(hid_t_f *fapl_id, size_t_f *alignment, size_t_f *block_size, size_t_f *cbuf_size );
+H5_FCDLL int_f h5pset_attr_phase_change_c(hid_t_f *ocpl_id, int_f *max_compact, int_f *min_dense );
+H5_FCDLL int_f h5pset_nbit_c(hid_t_f *plist_id );
+H5_FCDLL int_f h5pset_scaleoffset_c(hid_t_f *plist_id, int_f *scale_type, int_f *scale_factor );
+H5_FCDLL int_f h5pset_nlinks_c(hid_t_f *lapl_id, size_t_f *nlinks);
+H5_FCDLL int_f h5pget_nlinks_c(hid_t_f *lapl_id, size_t_f *nlinks);
+H5_FCDLL int_f h5pset_chunk_cache_c(hid_t_f *dapl_id, size_t_f *rdcc_nslots, size_t_f *rdcc_nbytes, real_f *rdcc_w0);
+H5_FCDLL int_f h5pget_chunk_cache_c(hid_t_f *dapl_id, size_t_f *rdcc_nslots, size_t_f *rdcc_nbytes, real_f *rdcc_w0);
+#ifdef H5_HAVE_PARALLEL
+H5_FCDLL int_f h5pget_mpio_actual_io_mode_c(hid_t_f *dxpl_id, int_f *actual_io_mode);
+H5_FCDLL int_f h5pget_fapl_mpio_c(hid_t_f *prp_id, int_f* comm, int_f* info);
+H5_FCDLL int_f h5pset_fapl_mpio_c(hid_t_f *prp_id, int_f* comm, int_f* info);
+H5_FCDLL int_f h5pget_dxpl_mpio_c(hid_t_f *prp_id, int_f* data_xfer_mode);
+H5_FCDLL int_f h5pset_dxpl_mpio_c(hid_t_f *prp_id, int_f* data_xfer_mode);
+#endif
 /*
  * Functions frome H5Rf.c
  */
-#define nh5rcreate_object_c     H5_FC_FUNC_(h5rcreate_object_c, H5RCREATE_OBJECT_C)
-#define nh5rcreate_region_c     H5_FC_FUNC_(h5rcreate_region_c, H5RCREATE_REGION_C)
-#define nh5rdereference_region_c H5_FC_FUNC_(h5rdereference_region_c, H5RDEREFERENCE_REGION_C)
-#define nh5rdereference_object_c H5_FC_FUNC_(h5rdereference_object_c, H5RDEREFERENCE_OBJECT_C)
-#define nh5rget_region_region_c H5_FC_FUNC_(h5rget_region_region_c, H5RGET_REGION_REGION_C)
-#define nh5rget_object_type_obj_c H5_FC_FUNC_(h5rget_object_type_obj_c, H5RGET_OBJECT_TYPE_OBJ_C)
-#define nh5rget_name_object_c H5_FC_FUNC_(h5rget_name_object_c, H5RGET_NAME_OBJECT_C)
-#define nh5rget_name_region_c H5_FC_FUNC_(h5rget_name_region_c, H5RGET_NAME_REGION_C)
-
-
-H5_FCDLL int_f nh5rcreate_object_c (haddr_t_f *ref, hid_t_f *loc_id, _fcd name, int_f *namelen);
-H5_FCDLL int_f nh5rcreate_region_c (int_f *ref, hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *space_id);
-H5_FCDLL int_f h5rcreate_ptr_c (void *ref, hid_t_f *loc_id, _fcd name, int_f *namelen, int_f *ref_type, hid_t_f *space_id);
-H5_FCDLL int_f nh5rdereference_region_c (hid_t_f *dset_id, int_f *ref, hid_t_f *obj_id);
-H5_FCDLL int_f nh5rdereference_object_c (hid_t_f *dset_id, haddr_t_f *ref, hid_t_f *obj_id);
-H5_FCDLL int_f h5rdereference_ptr_c (hid_t_f *obj_id, int_f *ref_type, void *ref, hid_t_f *ref_obj_id);
-H5_FCDLL int_f nh5rget_region_region_c (hid_t_f *dset_id, int_f *ref, hid_t_f *space_id);
+H5_FCDLL int_f h5rcreate_region_c(int_f *ref, hid_t_f *loc_id, _fcd name, int_f *namelen, hid_t_f *space_id);
+H5_FCDLL int_f h5rcreate_ptr_c(void *ref, hid_t_f *loc_id, _fcd name, int_f *namelen, int_f *ref_type, hid_t_f *space_id);
+H5_FCDLL int_f h5rdereference_ptr_c(hid_t_f *obj_id, int_f *ref_type, void *ref, hid_t_f *ref_obj_id);
+H5_FCDLL int_f h5rget_region_region_c(hid_t_f *dset_id, int_f *ref, hid_t_f *space_id);
 H5_FCDLL int_f h5rget_region_ptr_c(hid_t_f *dset_id, void *ref, hid_t_f *space_id);
-H5_FCDLL int_f nh5rget_object_type_obj_c (hid_t_f *dset_id, haddr_t_f *ref, int_f *obj_type);
-H5_FCDLL int_f nh5rget_name_object_c (hid_t_f *loc_id, haddr_t_f *ref, _fcd name, size_t_f *name_len, size_t_f *size_default);
-H5_FCDLL int_f nh5rget_name_region_c (hid_t_f *loc_id, int_f *ref, _fcd name, size_t_f *name_len, size_t_f *size_default);
-H5_FCDLL int_f h5rget_name_ptr_c (hid_t_f *loc_id, int_f *ref_type, void *ref, _fcd name, size_t_f *name_len, size_t_f *size_default);
-H5_FCDLL int_f h5rget_obj_type_c (hid_t_f *loc_id, int_f *ref_type, void *ref, int_f *obj_type);
+H5_FCDLL int_f h5rget_object_type_obj_c(hid_t_f *dset_id, haddr_t_f *ref, int_f *obj_type);
+H5_FCDLL int_f h5rget_name_ptr_c(hid_t_f *loc_id, int_f *ref_type, void *ref, _fcd name, size_t_f *name_len, size_t_f *size_default);
+H5_FCDLL int_f h5rget_obj_type_c(hid_t_f *loc_id, int_f *ref_type, void *ref, int_f *obj_type);
 /*
  * Functions from H5If.c
  */
-#define nh5iget_type_c    H5_FC_FUNC_(h5iget_type_c, H5IGET_TYPE_C)
-#define nh5iget_name_c    H5_FC_FUNC_(h5iget_name_c, H5IGET_NAME_C)
-#define nh5iinc_ref_c     H5_FC_FUNC_(h5iinc_ref_c, H5IINC_REF_C)
-#define nh5idec_ref_c     H5_FC_FUNC_(h5idec_ref_c, H5IDEC_REF_C)
-#define nh5iget_ref_c     H5_FC_FUNC_(h5iget_ref_c, H5IGET_REF_C)
-#define nh5iget_file_id_c H5_FC_FUNC_(h5iget_file_id_c, H5IGET_FILE_ID_C)
-#define nh5iis_valid_c    H5_FC_FUNC_(h5iis_valid_c, H5IIS_VALID_C)
-
-H5_FCDLL int_f nh5iget_type_c(hid_t_f *obj_id, int_f *type);
-H5_FCDLL int_f nh5iget_name_c(hid_t_f *obj_id, _fcd buf, size_t_f *buf_size, size_t_f *name_size);
-H5_FCDLL int_f nh5iinc_ref_c(hid_t_f *obj_id, int_f *ref_count);
-H5_FCDLL int_f nh5idec_ref_c(hid_t_f *obj_id, int_f *ref_count);
-H5_FCDLL int_f nh5iget_ref_c(hid_t_f *obj_id, int_f *ref_count);
-H5_FCDLL int_f nh5iget_file_id_c(hid_t_f *obj_id, hid_t_f *file_id);
-H5_FCDLL int_f nh5iis_valid_c(hid_t_f *obj_id, int_f *c_valid);
+H5_FCDLL int_f h5iget_type_c(hid_t_f *obj_id, int_f *type);
+H5_FCDLL int_f h5iget_name_c(hid_t_f *obj_id, _fcd buf, size_t_f *buf_size, size_t_f *name_size);
+H5_FCDLL int_f h5iinc_ref_c(hid_t_f *obj_id, int_f *ref_count);
+H5_FCDLL int_f h5idec_ref_c(hid_t_f *obj_id, int_f *ref_count);
+H5_FCDLL int_f h5iget_ref_c(hid_t_f *obj_id, int_f *ref_count);
+H5_FCDLL int_f h5iget_file_id_c(hid_t_f *obj_id, hid_t_f *file_id);
+H5_FCDLL int_f h5iis_valid_c(hid_t_f *obj_id, int_f *c_valid);
 
 /*
  * Functions from H5Ef.c
  */
-#define nh5eclear_c     H5_FC_FUNC_(h5eclear_c, H5ECLEAR_C)
-#define nh5eprint_c1    H5_FC_FUNC_(h5eprint_c1, H5EPRINT_C1)
-#define nh5eprint_c2    H5_FC_FUNC_(h5eprint_c2, H5EPRINT_C2)
-#define nh5eget_major_c H5_FC_FUNC_(h5eget_major_c, H5EGET_MAJOR_C)
-#define nh5eget_minor_c H5_FC_FUNC_(h5eget_minor_c, H5EGET_MINOR_C)
-#define nh5eset_auto_c  H5_FC_FUNC_(h5eset_auto_c, H5ESET_AUTO_C)
-#define nprocess_buffer  H5_FC_FUNC_(process_buffer, PROCESS_BUFFER)
 
-
-H5_FCDLL int_f nh5eclear_c(hid_t_f *estack_id);
-H5_FCDLL int_f nh5eprint_c1(_fcd name, int_f* namelen);
-H5_FCDLL int_f nh5eprint_c2(void);
-H5_FCDLL int_f nh5eget_major_c(int_f* error_no, _fcd name, size_t_f* namelen);
-H5_FCDLL int_f nh5eget_minor_c(int_f* error_no, _fcd name, size_t_f* namelen);
-H5_FCDLL int_f nh5eset_auto_c(int_f* printflag);
+H5_FCDLL int_f h5eclear_c(hid_t_f *estack_id);
+H5_FCDLL int_f h5eprint_c1(_fcd name, int_f* namelen);
+H5_FCDLL int_f h5eprint_c2(void);
+H5_FCDLL int_f h5eget_major_c(int_f* error_no, _fcd name, size_t_f* namelen);
+H5_FCDLL int_f h5eget_minor_c(int_f* error_no, _fcd name, size_t_f* namelen);
 H5_FCDLL int_f h5eset_auto2_c(int_f* printflag, hid_t_f *estack_id, H5E_auto2_t func, void *client_data);
-H5_FCDLL int_f nprocess_buffer(hid_t_f *estack_id,void **buffer);
 
 /*
  * Functions from H5f.c
  */
-#define nh5open_c            H5_FC_FUNC_(h5open_c, H5OPEN_C)
-#define nh5close_c           H5_FC_FUNC_(h5close_c, H5CLOSE_C)
-#define nh5init_types_c      H5_FC_FUNC_(h5init_types_c, H5INIT_TYPES_C)
-#define nh5close_types_c     H5_FC_FUNC_(h5close_types_c, H5CLOSE_TYPES_C)
-#define nh5init_flags_c      H5_FC_FUNC_(h5init_flags_c, H5INIT_FLAGS_C)
-#define nh5init1_flags_c     H5_FC_FUNC_(h5init1_flags_c, H5INIT1_FLAGS_C)
-#define nh5get_libversion_c  H5_FC_FUNC_(h5get_libversion_c, H5GET_LIBVERSION_C)
-#define nh5check_version_c   H5_FC_FUNC_(h5check_version_c, H5CHECK_VERSION_C)
-#define nh5garbage_collect_c H5_FC_FUNC_(h5garbage_collect_c, H5GARBAGE_COLLECT_C)
-#define nh5dont_atexit_c     H5_FC_FUNC_(h5dont_atexit_c, H5DONT_ATEXIT_C)
-
-
-H5_FCDLL int_f nh5open_c(void);
-H5_FCDLL int_f nh5close_c(void);
-H5_FCDLL int_f nh5init_types_c(hid_t_f *types, hid_t_f *floatingtypes, hid_t_f *integertypes);
-H5_FCDLL int_f nh5close_types_c(hid_t_f *types, int_f *lentypes, hid_t_f *floatingtypes, int_f *floatinglen, hid_t_f *integertypes, int_f *integerlen);
-H5_FCDLL int_f nh5init_flags_c(int_f *h5d_flags, size_t_f *h5d_size_flags, int_f *h5e_flags, hid_t_f *h5e_hid_flags, int_f *h5f_flags,
-			       int_f *h5fd_flags, hid_t_f *h5fd_hid_flags,
-			       int_f *h5g_flags, int_f *h5i_flags, int_f *h5l_flags, int_f *h5o_flags,
-			       hid_t_f *h5p_flags, int_f *h5p_flags_int, int_f *h5r_flags, int_f *h5s_flags,
-			       hsize_t_f *h5s_hsize_flags, int_f *h5t_flags, int_f *h5z_flags, int_f *h5_generic_flags);
-H5_FCDLL int_f nh5init1_flags_c(int_f *h5lib_flags);
-H5_FCDLL int_f nh5get_libversion_c(int_f *majnum, int_f *minnum, int_f *relnum);
-H5_FCDLL int_f nh5check_version_c(int_f *majnum, int_f *minnum, int_f *relnum);
-H5_FCDLL int_f nh5garbage_collect_c(void);
-H5_FCDLL int_f nh5dont_atexit_c(void);
+H5_FCDLL int_f h5open_c(void);
+H5_FCDLL int_f h5close_c(void);
+H5_FCDLL int_f h5init_types_c(hid_t_f *types, hid_t_f *floatingtypes, hid_t_f *integertypes);
+H5_FCDLL int_f h5close_types_c(hid_t_f *types, int_f *lentypes, hid_t_f *floatingtypes, int_f *floatinglen, hid_t_f *integertypes, int_f *integerlen);
+H5_FCDLL int_f h5init_flags_c(int_f *h5d_flags, size_t_f *h5d_size_flags, int_f *h5e_flags, hid_t_f *h5e_hid_flags, int_f *h5f_flags,
+			      int_f *h5fd_flags, hid_t_f *h5fd_hid_flags,
+			      int_f *h5g_flags, int_f *h5i_flags, int_f *h5l_flags, int_f *h5o_flags,
+			      hid_t_f *h5p_flags, int_f *h5p_flags_int, int_f *h5r_flags, int_f *h5s_flags,
+			      hsize_t_f *h5s_hsize_flags, int_f *h5t_flags, int_f *h5z_flags, int_f *h5_generic_flags,
+                              haddr_t_f *h5_haddr_generic_flags);
+H5_FCDLL int_f h5init1_flags_c(int_f *h5lib_flags);
+H5_FCDLL int_f h5get_libversion_c(int_f *majnum, int_f *minnum, int_f *relnum);
+H5_FCDLL int_f h5check_version_c(int_f *majnum, int_f *minnum, int_f *relnum);
+H5_FCDLL int_f h5garbage_collect_c(void);
+H5_FCDLL int_f h5dont_atexit_c(void);
 
 /*
  * Functions from H5Zf.c
  */
-#define nh5zunregister_c    H5_FC_FUNC_(h5zunregister_c, H5ZUNREGISTER_C)
-#define nh5zfilter_avail_c  H5_FC_FUNC_(h5zfilter_avail_c, H5ZFILTER_AVAIL_C)
-#define nh5zget_filter_info_c H5_FC_FUNC_(h5zget_filter_info_c, H5ZGET_FILTER_INFO_C)
-
-
-H5_FCDLL int_f nh5zunregister_c (int_f *filter);
-H5_FCDLL int_f nh5zfilter_avail_c (int_f *filter, int_f *flag);
-H5_FCDLL int_f nh5zget_filter_info_c (int_f *filter, int_f *flag);
-
+H5_FCDLL int_f h5zunregister_c(int_f *filter);
+H5_FCDLL int_f h5zfilter_avail_c(int_f *filter, int_f *flag);
+H5_FCDLL int_f h5zget_filter_info_c(int_f *filter, int_f *flag);
 
 /*
  * Functions from H5Lf.c
  */
-#define nh5lcopy_c H5_FC_FUNC_(h5lcopy_c, H5LCOPY_C)
-#define nh5lcreate_external_c H5_FC_FUNC_(h5lcreate_external_c, H5LCREATE_EXTERNAL_C)
-#define nh5lcreate_hard_c H5_FC_FUNC_(h5lcreate_hard_c, H5LCREATE_HARD_C)
-#define nh5lcreate_soft_c H5_FC_FUNC_(h5lcreate_soft_c, H5LCREATE_SOFT_C)
-#define nh5ldelete_c H5_FC_FUNC_(h5ldelete_c, H5LDELETE_C)
-#define nh5ldelete_by_idx_c H5_FC_FUNC_(h5ldelete_by_idx_c, H5LDELETE_BY_IDX_C)
-#define nh5lexists_c H5_FC_FUNC_(h5lexists_c, H5LEXISTS_C)
-#define nh5lget_info_c H5_FC_FUNC_(h5lget_info_c, H5LGET_INFO_C)
-#define nh5lget_info_by_idx_c H5_FC_FUNC_(h5lget_info_by_idx_c, H5LGET_INFO_BY_IDX_C)
-#define nh5lis_registered_c H5_FC_FUNC_(h5lis_registered_c, H5LIS_REGISTERED_C)
-#define nh5lmove_c H5_FC_FUNC_(h5lmove_c, H5LMOVE_C)
-#define nh5lget_name_by_idx_c H5_FC_FUNC_(h5lget_name_by_idx_c, H5LGET_NAME_BY_IDX_C)
-#define nh5lget_val_c H5_FC_FUNC_(h5lget_val_c, H5LGET_VAL_C)
 
-H5_FCDLL int_f nh5lcopy_c(hid_t_f *src_loc_id, _fcd src_name, size_t_f *src_namelen, hid_t_f *dest_loc_id,
+H5_FCDLL int_f h5lcopy_c(hid_t_f *src_loc_id, _fcd src_name, size_t_f *src_namelen, hid_t_f *dest_loc_id,
 			  _fcd dest_name, size_t_f *dest_namelen,
 			  hid_t_f *lcpl_id, hid_t_f *lapl_id);
-H5_FCDLL int_f nh5lcreate_external_c(_fcd file_name, size_t_f *file_namelen, _fcd obj_name, size_t_f *obj_namelen,
+H5_FCDLL int_f h5lcreate_external_c(_fcd file_name, size_t_f *file_namelen, _fcd obj_name, size_t_f *obj_namelen,
 				     hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen,
 				     hid_t_f *lcpl_id, hid_t_f *lapl_id);
-H5_FCDLL int_f nh5lcreate_hard_c(hid_t_f *obj_loc_id, _fcd obj_name, size_t_f *obj_namelen,
+H5_FCDLL int_f h5lcreate_hard_c(hid_t_f *obj_loc_id, _fcd obj_name, size_t_f *obj_namelen,
 				 hid_t_f *link_loc_id,
 				 _fcd link_name, size_t_f *link_namelen,
 				 hid_t_f *lcpl_id, hid_t_f *lapl_id );
-H5_FCDLL int_f nh5lcreate_soft_c(_fcd target_path, size_t_f *target_path_len,
+H5_FCDLL int_f h5lcreate_soft_c(_fcd target_path, size_t_f *target_path_len,
 				 hid_t_f *link_loc_id,
 				 _fcd link_name, size_t_f *link_name_len,
 				 hid_t_f *lcpl_id, hid_t_f *lapl_id );
-H5_FCDLL int_f nh5ldelete_c( hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id );
-H5_FCDLL int_f nh5ldelete_by_idx_c (hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen,
+H5_FCDLL int_f h5ldelete_c( hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id );
+H5_FCDLL int_f h5ldelete_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen,
 				    int_f *index_field, int_f *order, hsize_t_f *n, hid_t_f *lapl_id);
-H5_FCDLL int_f nh5lexists_c (hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id, int_f *link_exists);
-H5_FCDLL int_f nh5lget_info_c (hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen,
+H5_FCDLL int_f h5lexists_c(hid_t_f *loc_id, _fcd name, size_t_f *namelen, hid_t_f *lapl_id, int_f *link_exists);
+H5_FCDLL int_f h5lget_info_c(hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen,
 			       int_f *cset, int_f *corder, int_f *corder_valid, int_f *link_type,
 			       haddr_t_f *address, size_t_f *val_size,
 			       hid_t_f *lapl_id);
-H5_FCDLL int_f nh5lget_info_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen,
+H5_FCDLL int_f h5lget_info_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen,
 		      int_f *index_field, int_f *order, hsize_t_f *n,
 		      int_f *link_type, int_f *corder_valid, int_f *corder, int_f *cset, haddr_t_f *address, size_t_f *val_size, hid_t_f *lapl_id);
-H5_FCDLL int_f nh5lis_registered_c(int_f *link_cls_id);
-H5_FCDLL int_f nh5lmove_c(hid_t_f *src_loc_id, _fcd src_name, size_t_f *src_namelen, hid_t_f *dest_loc_id,
+H5_FCDLL int_f h5lis_registered_c(int_f *link_cls_id);
+H5_FCDLL int_f h5lmove_c(hid_t_f *src_loc_id, _fcd src_name, size_t_f *src_namelen, hid_t_f *dest_loc_id,
 			  _fcd dest_name, size_t_f *dest_namelen, hid_t_f *lcpl_id, hid_t_f *lapl_id);
-H5_FCDLL int_f nh5lget_name_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen,
+H5_FCDLL int_f h5lget_name_by_idx_c(hid_t_f *loc_id, _fcd group_name, size_t_f *group_namelen,
 				     int_f *index_field, int_f *order, hsize_t_f *n,
 				     size_t_f *size, _fcd name, hid_t_f *lapl_id);
-H5_FCDLL int_f nh5lget_val_c(hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen, size_t_f *size,
+H5_FCDLL int_f h5lget_val_c(hid_t_f *link_loc_id, _fcd link_name, size_t_f *link_namelen, size_t_f *size,
 			     void *linkval_buff, hid_t_f *lapl_id) ;
 
 H5_FCDLL int_f h5literate_c(hid_t_f *group_id, int_f *index_type, int_f *order, hsize_t_f *idx, H5L_iterate_t op, void *op_data );
diff --git a/fortran/src/H5fort_type_defines.h.in b/fortran/src/H5fort_type_defines.h.in
new file mode 100644
index 0000000..0e14e86
--- /dev/null
+++ b/fortran/src/H5fort_type_defines.h.in
@@ -0,0 +1,16 @@
+/* If you are reading this file and it has a '.h' suffix, it was automatically
+ * generated from the '.in' version.  Make changes there.
+ */
+#define H5_FORTRAN_NATIVE_INTEGER_KIND @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+#define H5_FORTRAN_NATIVE_INTEGER_SIZEOF @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+#define H5_FORTRAN_NATIVE_REAL_KIND @PAC_FORTRAN_NATIVE_REAL_KIND@
+#define H5_FORTRAN_NATIVE_REAL_SIZEOF @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
+#define H5_FORTRAN_NATIVE_DOUBLE_KIND @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+#define H5_FORTRAN_NATIVE_DOUBLE_SIZEOF @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+#define H5_FORTRAN_INTEGER_KINDS @PAC_FC_ALL_INTEGER_KINDS@
+#define H5_FORTRAN_INTEGER_KINDS_SIZEOF @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+#define H5_FORTRAN_REAL_KINDS @PAC_FC_ALL_REAL_KINDS@
+#define H5_FORTRAN_REAL_KINDS_SIZEOF @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+#define H5_HAVE_Fortran_INTEGER_SIZEOF_16 @HAVE_Fortran_INTEGER_SIZEOF_16@
+#define H5_FORTRAN_HAVE_C_LONG_DOUBLE @FORTRAN_HAVE_C_LONG_DOUBLE@
+#define H5_FORTRAN_C_LONG_DOUBLE_IS_UNIQUE @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
diff --git a/fortran/src/H5match_types.c b/fortran/src/H5match_types.c
index c4b7f73..f995e83 100644
--- a/fortran/src/H5match_types.c
+++ b/fortran/src/H5match_types.c
@@ -9,7 +9,7 @@
  * PURPOSE
  *  C Program to match C types to Fortran types.
  *  Creates the files H5f90i_gen.h for the C code and
- *  H5fortran_types.f90 for the Fortran code.
+ *  H5fortran_types.F90 for the Fortran code.
  *
  * COPYRIGHT
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -31,6 +31,7 @@
 */
 
 #include <stdio.h>
+#include <string.h>
 #include <assert.h>
 
 #include "H5public.h"
@@ -45,12 +46,13 @@ FILE * c_header;
 FILE * fort_header;
 
 #define CFILE "H5f90i_gen.h"
-#define FFILE "H5fortran_types.f90"
+#define FFILE "H5fortran_types.F90"
 
 /* Prototypes for the write routines */
-void writeTypedef(const char* c_typedef, const char* c_type, unsigned int size);
-void writeTypedefDefault(const char* c_typedef, unsigned int size);
-void writeToFiles(const char* c_typedef, const char* fortran_type, const char* c_type, int size, unsigned int kind);
+void writeTypedef(const char* c_typedef, const char* c_type, int size);
+void writeTypedefDefault(const char* c_typedef, int size);
+void writeToFiles(const char* c_typedef, const char* fortran_type, const char* c_type, int size, int kind);
+void writeToFilesChr(const char* c_typedef, const char* fortran_type, const char* c_type, int size, char* kind);
 
 static void
 initCfile(void)
@@ -100,6 +102,7 @@ initFfile(void)
 !\n!\n\
 ! This file is automatically generated and contains HDF5 Fortran90 type definitions.\n!\n\
        MODULE H5FORTRAN_TYPES\n\
+         USE ISO_C_BINDING\n\
          !\n\
          !  HDF5 integers\n\
          !\n");
@@ -119,253 +122,196 @@ endFfile(void)
 }
 
 /* Define a c_int_x type in the C header */
-void writeTypedef(const char* c_typedef, const char* c_type, unsigned int size)
+void writeTypedef(const char* c_typedef, const char* c_type, int size)
 {
   fprintf(c_header, "#define c_%s_%u %s\n", c_typedef, size, c_type);
 }
 
 /* Call this function if there is no matching C type for sizes > 1 */
-void writeTypedefDefault(const char* c_typedef, unsigned int size)
+void writeTypedefDefault(const char* c_typedef, int size)
 {
   assert(size %2 == 0);
-  fprintf(c_header, "typedef struct {c_%s_%u a; c_%s_%u b;} c_%s_%u\n", c_typedef, size / 2, c_typedef, size / 2, c_typedef, size);
+  fprintf(c_header, "typedef struct {c_%s_%u a; c_%s_%u b;} c_%s_%u;\n", c_typedef, size / 2, c_typedef, size / 2, c_typedef, size);
 }
 
 /* Create matching Fortran and C types by writing to both files */
-void writeToFiles(const char* c_typedef, const char* fortran_type, const char* c_type, int size, unsigned int kind)
+void writeToFiles(const char* c_typedef, const char* fortran_type, const char* c_type, int size,  int kind)
 {
   fprintf(fort_header, "        INTEGER, PARAMETER :: %s = %u\n", fortran_type, kind);
   fprintf(c_header, "typedef c_%s_%d %s;\n", c_typedef, size, c_type);
 }
-
+void writeToFilesChr(const char* c_typedef, const char* fortran_type, const char* c_type, int size, char* kind)
+{
+  fprintf(fort_header, "        INTEGER, PARAMETER :: %s = %s\n", fortran_type, kind);
+  fprintf(c_header, "typedef c_%s_%d %s;\n", c_typedef, size, c_type);
+}
 int main(void)
 {
-  int FoundIntSize[4];
-  unsigned FoundIntSizeKind[4];
-  int FoundRealSize[3];
-  unsigned FoundRealSizeKind[3];
-  int i,j,flag;
-  char chrA[20],chrB[20];
-  int H5_C_HAS_REAL_NATIVE_16;
+  int FoundIntSize[10];
+  int FoundIntSizeKind[10];
+  int i, j,flag;
+  char chrA[32],chrB[32];
+
+  int IntKinds[] = H5_FORTRAN_INTEGER_KINDS;
+  int IntKinds_SizeOf[] = H5_FORTRAN_INTEGER_KINDS_SIZEOF;
+  int RealKinds[] = H5_FORTRAN_REAL_KINDS;
+  int RealKinds_SizeOf[] = H5_FORTRAN_REAL_KINDS_SIZEOF;
+  char Real_C_TYPES[10][32];
+  
+  int H5_FORTRAN_NUM_INTEGER_KINDS;
+  int H5_FORTRAN_NUM_REAL_KINDS;
+  int found_long_double = 0;
 
   /* Open target files */
   c_header = fopen(CFILE, "w");
   fort_header = fopen(FFILE, "w");
 
-  /* Default is C has 16 byte float */
-  H5_C_HAS_REAL_NATIVE_16 = 1;
-
   /* Write copyright, boilerplate to both files */
   initCfile();
   initFfile();
 
-  /* First, define c_int_x */
-
-#if defined H5_FORTRAN_HAS_INTEGER_1_KIND
-  if(sizeof(long long) == 1)
-    writeTypedef("int", "long long", 1);
-  else if(sizeof(long) == 1)
-    writeTypedef("int", "long", 1);
-  else if(sizeof(int) == 1)
-    writeTypedef("int", "int", 1);
-  else if(sizeof(short) == 1)
-    writeTypedef("int", "short", 1);
-  else
-    writeTypedef("int", "char", 1);
-  /* Actually, char is not necessarily one byte.
-   * But if char isn't, then nothing is, so this
-   * is as close as we can get. */
-  if(sizeof(size_t) == 1)
-    writeTypedef("size_t", "size_t", 1);
-  if(sizeof(hsize_t) == 1)
-    writeTypedef("hsize_t", "hsize_t", 1);
-#endif /*H5_FORTRAN_HAS_INTEGER_1_KIND*/
-
-#if defined H5_FORTRAN_HAS_INTEGER_2_KIND
-  if(sizeof(long long) == 2)
-    writeTypedef("int", "long long", 2);
-  else if(sizeof(long) == 2)
-    writeTypedef("int", "long", 2);
-  else if(sizeof(int) == 2)
-    writeTypedef("int", "int", 2);
-  else if(sizeof(short) == 2)
-    writeTypedef("int", "short", 2);
-  else
-    writeTypedefDefault("int",2);
-
-  if(sizeof(size_t) == 2)
-    writeTypedef("size_t", "size_t", 2);
-  if(sizeof(hsize_t) == 2)
-    writeTypedef("hsize_t", "hsize_t", 2);
-#endif /*H5_FORTRAN_HAS_INTEGER_2_KIND*/
-
-#if defined H5_FORTRAN_HAS_INTEGER_4_KIND
-  if(sizeof(long long) == 4)
-    writeTypedef("int", "long long", 4);
-  else if(sizeof(long) == 4)
-    writeTypedef("int", "long", 4);
-  else if(sizeof(int) == 4)
-    writeTypedef("int", "int", 4);
-  else if(sizeof(short) == 4)
-    writeTypedef("int", "short", 4);
-  else
-    writeTypedefDefault("int",4);
-
-  if(sizeof(size_t) == 4)
-    writeTypedef("size_t", "size_t", 4);
-  if(sizeof(hsize_t) == 4)
-    writeTypedef("hsize_t", "hsize_t", 4);
-    
-#endif /*H5_FORTRAN_HAS_INTEGER_4_KIND*/
-
-#if defined H5_FORTRAN_HAS_INTEGER_8_KIND
-  if(sizeof(long long) == 8)
-    writeTypedef("int", "long long", 8);
-  else if(sizeof(long) == 8)
-    writeTypedef("int", "long", 8);
-  else if(sizeof(int) == 8)
-    writeTypedef("int", "int", 8);
-  else if(sizeof(short) == 8)
-    writeTypedef("int", "short", 8);
-  else
-    writeTypedefDefault("int",8);
-
-  if(sizeof(size_t) == 8)
-    writeTypedef("size_t", "size_t",  8);
-  if(sizeof(hsize_t) == 8)
-    writeTypedef("hsize_t", "hsize_t", 8);
-
-#endif /*H5_FORTRAN_HAS_INTEGER_8_KIND*/
-
-  /* Define c_float_x */
-
-#if defined H5_FORTRAN_HAS_REAL_NATIVE_4_KIND || defined H5_FORTRAN_HAS_REAL_4_KIND
-  if(sizeof(long double) == 4)
-    writeTypedef("float", "long double", 4);
-  else if(sizeof(double) == 4)
-   writeTypedef("float", "double", 4);
-  else if(sizeof(float) == 4)
-   writeTypedef("float", "float", 4);
-  else
-   { printf("Fortran REAL is 4 bytes, no corresponding C floating type\n");
-     printf("Quitting....\n");
-     return -1;
-   }
-#endif /*H5_FORTRAN_HAS_REAL_NATIVE_4_KIND*/
-
-#if defined H5_FORTRAN_HAS_REAL_NATIVE_8_KIND || defined H5_FORTRAN_HAS_REAL_8_KIND
-  if(sizeof(long double) == 8)
-    writeTypedef("float", "long double", 8);
-  else if(sizeof(double) == 8)
-   writeTypedef("float", "double", 8);
-  else if(sizeof(float) == 8)
-   writeTypedef("float", "float", 8);
-  else
-   { printf("Fortran REAL is 16 bytes, no corresponding C floating type\n");
-     printf("Quitting....\n");
-     return -1;
-   }
-#endif /*H5_FORTRAN_HAS_REAL_NATIVE_8_KIND*/
-
-#if defined H5_FORTRAN_HAS_REAL_NATIVE_16_KIND || defined H5_FORTRAN_HAS_REAL_16_KIND
-  if(sizeof(long double) == 16)
-    writeTypedef("float", "long double", 16);
-  else if(sizeof(double) == 16)
-   writeTypedef("float", "double", 16);
-  else if(sizeof(float) == 16)
-   writeTypedef("float", "float", 16);
-  else /*C has no 16 byte float so disable it in Fortran*/
-   { printf("warning: Fortran REAL is 16 bytes, no corresponding C floating type\n");
-     printf("         Disabling Fortran 16 byte REALs\n");
-     H5_C_HAS_REAL_NATIVE_16 = 0;
-   }
-#endif /*H5_FORTRAN_HAS_REAL_NATIVE_16_KIND*/
+  /* (a) define c_int_x */
+
+  H5_FORTRAN_NUM_INTEGER_KINDS = (int)(sizeof(IntKinds)/sizeof(IntKinds[0]));
+  H5_FORTRAN_NUM_REAL_KINDS = (int)(sizeof(RealKinds)/sizeof(RealKinds[0]));
+
+  for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) {
+    if(sizeof(long long) == IntKinds_SizeOf[i])
+      writeTypedef("int", "long long", IntKinds[i]);
+    else if(sizeof(long) == IntKinds[i])
+      writeTypedef("int", "long", IntKinds[i]);
+    else if(sizeof(int) == IntKinds_SizeOf[i])
+      writeTypedef("int", "int", IntKinds[i]);
+    else if(sizeof(short) == IntKinds_SizeOf[i])
+      writeTypedef("int", "short", IntKinds[i]);
+    else
+      if(IntKinds_SizeOf[i] == 1) {
+	writeTypedef("int", "char", IntKinds[i]);
+	/* Actually, char is not necessarily one byte.
+	 * But if char isn't, then nothing is, so this
+	 * is as close as we can get. */
+      } else {
+	writeTypedefDefault("int",IntKinds[i]);
+      }
+    if(sizeof(size_t) == IntKinds_SizeOf[i])
+      writeTypedef("size_t", "size_t", IntKinds[i]);
+    if(sizeof(hsize_t) == IntKinds_SizeOf[i])
+      writeTypedef("hsize_t", "hsize_t", IntKinds[i]);
+  }
+
+  /* (b) Define c_float_x */
+
+  for(i=0;i< H5_FORTRAN_NUM_REAL_KINDS;i++) {
+    if (sizeof(float) == RealKinds_SizeOf[i]) {
+      writeTypedef("float", "float", RealKinds[i]);
+      strcpy(Real_C_TYPES[i], "C_FLOAT");
+    }
+    else if(sizeof(double) == RealKinds_SizeOf[i]) {
+      writeTypedef("float", "double", RealKinds[i]);
+      strcpy(Real_C_TYPES[i], "C_DOUBLE"); 
+    }
+#if H5_FORTRAN_HAVE_C_LONG_DOUBLE!=0
+    else if(sizeof(long double) == RealKinds_SizeOf[i] && found_long_double == 0) {
+      writeTypedef("float", "long double", RealKinds[i]);
+      strcpy(Real_C_TYPES[i], "C_LONG_DOUBLE");
+      found_long_double = 1; 
+    }
+#  ifdef H5_HAVE_FLOAT128
+    /* Don't select a higher precision than Fortran can support */
+    else if(sizeof(__float128) == RealKinds_SizeOf[i] && found_long_double == 1 && H5_PAC_FC_MAX_REAL_PRECISION > 28) {
+      writeTypedef("float", "__float128", RealKinds[i]);
+      strcpy(Real_C_TYPES[i], "C_FLOAT128");
+    }
+#  else
+    else if(sizeof(long double) == RealKinds_SizeOf[i] && found_long_double == 1 && H5_PAC_FC_MAX_REAL_PRECISION > 28) {
+      writeTypedef("float", "long double", RealKinds[i]);
+      strcpy(Real_C_TYPES[i], "C_FLOAT128");
+    }
+#  endif
+#else /* There is no C_LONG_DOUBLE intrinsic */
+#  ifdef H5_HAVE_FLOAT128
+    /* Don't select a higher precision than Fortran can support */
+    else if(sizeof(__float128) == RealKinds_SizeOf[i] ) {
+      writeTypedef("float", "__float128", RealKinds[i]);
+      strcpy(Real_C_TYPES[i], "C_FLOAT128");
+    }
+#  else
+    else if(sizeof(long double) == RealKinds_SizeOf[i] ) {
+      writeTypedef("float", "long double", RealKinds[i]);
+      strcpy(Real_C_TYPES[i], "C_FLOAT128");
+    }
+#  endif
+#endif
+    else {
+      printf("\n                      **** HDF5 WARNING ****\n");
+      printf("Fortran REAL(KIND=%d) is %d Bytes, but no corresponding C float type exists of that size\n",RealKinds[i],RealKinds_SizeOf[i]);
+      printf("     !!! Fortran interfaces will not be generated for REAL(KIND=%d) !!!\n\n",RealKinds[i]);
+
+      RealKinds_SizeOf[i] = -1;
+      RealKinds[i] = -1;
+    }
+  }
 
   /* Now begin defining fortran types. */
   fprintf(c_header, "\n");
+
   /* haddr_t */
-#if defined H5_FORTRAN_HAS_INTEGER_8_KIND && H5_SIZEOF_HADDR_T >= 8
-  writeToFiles("int","HADDR_T", "haddr_t_f", 8, H5_FORTRAN_HAS_INTEGER_8_KIND);
-#elif defined H5_FORTRAN_HAS_INTEGER_4_KIND && H5_SIZEOF_HADDR_T >= 4
-  writeToFiles("int","HADDR_T", "haddr_t_f", 4, H5_FORTRAN_HAS_INTEGER_4_KIND);
-#elif defined H5_FORTRAN_HAS_INTEGER_2_KIND && H5_SIZEOF_HADDR_T >= 2
-  writeToFiles("int","HADDR_T", "haddr_t_f", 2, H5_FORTRAN_HAS_INTEGER_2_KIND);
-#elif defined H5_FORTRAN_HAS_INTEGER_1_KIND && H5_SIZEOF_HADDR_T >= 1
-  writeToFiles("int","HADDR_T", "haddr_t_f", 1, H5_FORTRAN_HAS_INTEGER_1_KIND);
-#else
-    /* Error: couldn't find a size for haddr_t */
-    return -1;
-#endif
+  for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) {
+    if(IntKinds_SizeOf[i] == H5_SIZEOF_HADDR_T) {
+      writeToFiles("int","HADDR_T", "haddr_t_f", H5_SIZEOF_HADDR_T, IntKinds[i]);
+      break;
+    }
+    if(i == (H5_FORTRAN_NUM_INTEGER_KINDS-1) )
+      /* Error: couldn't find a size for haddr_t */
+      return -1;
+  }
 
   /* hsize_t */
-#if defined H5_FORTRAN_HAS_INTEGER_8_KIND && H5_SIZEOF_HSIZE_T >= 8
-    writeToFiles("hsize_t","HSIZE_T", "hsize_t_f", 8, H5_FORTRAN_HAS_INTEGER_8_KIND);
-#elif defined H5_FORTRAN_HAS_INTEGER_4_KIND && H5_SIZEOF_HSIZE_T >= 4
-    writeToFiles("hsize_t","HSIZE_T", "hsize_t_f", 4, H5_FORTRAN_HAS_INTEGER_4_KIND);
-#elif defined H5_FORTRAN_HAS_INTEGER_2_KIND && H5_SIZEOF_HSIZE_T >= 2
-    writeToFiles("hsize_t","HSIZE_T", "hsize_t_f", 2, H5_FORTRAN_HAS_INTEGER_2_KIND);
-#elif defined H5_FORTRAN_HAS_INTEGER_1_KIND && H5_SIZEOF_HSIZE_T >= 1
-    writeToFiles("hsize_t","HSIZE_T", "hsize_t_f", 1, H5_FORTRAN_HAS_INTEGER_1_KIND);
-#else
-    /* Error: couldn't find a size for hsize_t */
-    return -1;
-#endif
+  for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) {
+    if(IntKinds_SizeOf[i] == H5_SIZEOF_HSIZE_T) {
+      writeToFiles("hsize_t","HSIZE_T", "hsize_t_f", H5_SIZEOF_HSIZE_T, IntKinds[i]);
+      break;
+    }
+    if(i == (H5_FORTRAN_NUM_INTEGER_KINDS-1) )
+      /* Error: couldn't find a size for hsize_t */
+      return -1;
+  }
 
   /* hssize_t */
-#if defined H5_FORTRAN_HAS_INTEGER_8_KIND && H5_SIZEOF_HSSIZE_T >= 8
-    writeToFiles("int","HSSIZE_T", "hssize_t_f", 8, H5_FORTRAN_HAS_INTEGER_8_KIND);
-#elif defined H5_FORTRAN_HAS_INTEGER_4_KIND && H5_SIZEOF_HSSIZE_T >= 4
-    writeToFiles("int","HSSIZE_T", "hssize_t_f", 4, H5_FORTRAN_HAS_INTEGER_4_KIND);
-#elif defined H5_FORTRAN_HAS_INTEGER_2_KIND && H5_SIZEOF_HSSIZE_T >= 2
-    writeToFiles("int","HSSIZE_T", "hssize_t_f", 2, H5_FORTRAN_HAS_INTEGER_2_KIND);
-#elif defined H5_FORTRAN_HAS_INTEGER_1_KIND && H5_SIZEOF_HSSIZE_T >= 1
-    writeToFiles("int","HSSIZE_T", "hssize_t_f", 1, H5_FORTRAN_HAS_INTEGER_1_KIND);
-#else
-    /* Error: couldn't find a size for hssize_t */
-    return -1;
-#endif
+  for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) {
+    if(IntKinds_SizeOf[i] == H5_SIZEOF_HSSIZE_T) {
+      writeToFiles("int","HSSIZE_T", "hssize_t_f", H5_SIZEOF_HSSIZE_T, IntKinds[i]);
+      break;
+    }
+    if(i == (H5_FORTRAN_NUM_INTEGER_KINDS-1) )
+      /* Error: couldn't find a size for hssize_t */
+      return -1;
+  }
 
   /* off_t */
-#if defined H5_FORTRAN_HAS_INTEGER_8_KIND && H5_SIZEOF_OFF_T >= 8
-    writeToFiles("int","OFF_T", "off_t_f", 8, H5_FORTRAN_HAS_INTEGER_8_KIND);
-#elif defined H5_FORTRAN_HAS_INTEGER_4_KIND && H5_SIZEOF_OFF_T >= 4
-    writeToFiles("int","OFF_T", "off_t_f", 4, H5_FORTRAN_HAS_INTEGER_4_KIND);
-#elif defined H5_FORTRAN_HAS_INTEGER_2_KIND && H5_SIZEOF_OFF_T >= 2
-    writeToFiles("int","OFF_T", "off_t_f", 2, H5_FORTRAN_HAS_INTEGER_2_KIND);
-#elif defined H5_FORTRAN_HAS_INTEGER_1_KIND && H5_SIZEOF_OFF_T >= 1
-    writeToFiles("int","OFF_T", "off_t_f", 1, H5_FORTRAN_HAS_INTEGER_1_KIND);
-#else
-    /* Error: couldn't find a size for off_t */
-    return -1;
-#endif
+  for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) {
+    if(IntKinds_SizeOf[i] == H5_SIZEOF_OFF_T) {
+      writeToFiles("int","OFF_T", "off_t_f", H5_SIZEOF_OFF_T, IntKinds[i]);
+      break;
+    }
+    if(i == (H5_FORTRAN_NUM_INTEGER_KINDS-1) )
+      /* Error: couldn't find a size for off_t */
+      return -1;
+  }
 
   /* size_t */
-#if defined H5_FORTRAN_HAS_INTEGER_8_KIND && H5_SIZEOF_SIZE_T >= 8
-    writeToFiles("size_t","SIZE_T", "size_t_f", 8, H5_FORTRAN_HAS_INTEGER_8_KIND);
-#elif defined H5_FORTRAN_HAS_INTEGER_4_KIND && H5_SIZEOF_SIZE_T >= 4
-    writeToFiles("size_t","SIZE_T", "size_t_f", 4, H5_FORTRAN_HAS_INTEGER_4_KIND);
-#elif defined H5_FORTRAN_HAS_INTEGER_2_KIND && H5_SIZEOF_SIZE_T >= 2
-    writeToFiles("size_t","SIZE_T", "size_t_f", 2, H5_FORTRAN_HAS_INTEGER_2_KIND);
-#elif defined H5_FORTRAN_HAS_INTEGER_1_KIND && H5_SIZEOF_SIZE_T >= 1
-    writeToFiles("size_t","SIZE_T", "size_t_f", 1, H5_FORTRAN_HAS_INTEGER_1_KIND);
-#else
-    /* Error: couldn't find a size for size_t */
-    return -1;
-#endif
+  for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) {
+    if(IntKinds_SizeOf[i] == H5_SIZEOF_SIZE_T) {
+      writeToFiles("size_t","SIZE_T", "size_t_f", H5_SIZEOF_SIZE_T, IntKinds[i]);
+      break;
+    }
+    if(i == (H5_FORTRAN_NUM_INTEGER_KINDS-1) )
+      /* Error: couldn't find a size for size_t */
+      return -1;
+  }
 
   /* int */
-#if defined H5_FORTRAN_HAS_NATIVE_8_KIND
-    writeToFiles("int","Fortran_INTEGER", "int_f", 8, H5_FORTRAN_HAS_NATIVE_8_KIND);
-#elif defined H5_FORTRAN_HAS_NATIVE_4_KIND
-    writeToFiles("int","Fortran_INTEGER", "int_f", 4, H5_FORTRAN_HAS_NATIVE_4_KIND);
-#elif defined H5_FORTRAN_HAS_NATIVE_2_KIND
-    writeToFiles("int","Fortran_INTEGER", "int_f", 2, H5_FORTRAN_HAS_NATIVE_2_KIND);
-#elif defined H5_FORTRAN_HAS_NATIVE_1_KIND
-    writeToFiles("int","Fortran_INTEGER", "int_f", 1, H5_FORTRAN_HAS_NATIVE_1_KIND);
-#else
-    /* Error: couldn't find a size for int */
-    return -1;
-#endif
+  writeToFiles("int","Fortran_INTEGER", "int_f", H5_FORTRAN_NATIVE_INTEGER_SIZEOF, H5_FORTRAN_NATIVE_INTEGER_KIND);
 
   /* int_1, int_2, int_4, int_8 */
 
@@ -374,29 +320,20 @@ int main(void)
 /* it a value of the next larger one, but if the next         */
 /* higher one is not available we assigned it the next lowest */
 
-    FoundIntSize[0] = -1;
-    FoundIntSize[1] = -2;
-    FoundIntSize[2] = -4;
-    FoundIntSize[3] = -8;
 
-#if defined H5_FORTRAN_HAS_INTEGER_1_KIND
-    FoundIntSize[0] = 1;
-    FoundIntSizeKind[0] = H5_FORTRAN_HAS_INTEGER_1_KIND;
-#endif
-#if defined H5_FORTRAN_HAS_INTEGER_2_KIND
-    FoundIntSize[1] = 2;
-    FoundIntSizeKind[1] = H5_FORTRAN_HAS_INTEGER_2_KIND;
-#endif
-#if defined H5_FORTRAN_HAS_INTEGER_4_KIND
-    FoundIntSize[2] = 4;
-    FoundIntSizeKind[2] = H5_FORTRAN_HAS_INTEGER_4_KIND;
-#endif
-#if defined H5_FORTRAN_HAS_INTEGER_8_KIND
-    FoundIntSize[3] = 8;
-    FoundIntSizeKind[3] = H5_FORTRAN_HAS_INTEGER_8_KIND ;
-#endif
+  FoundIntSize[0] = -1;
+  FoundIntSize[1] = -1;
+  FoundIntSize[2] = -1;
+  FoundIntSize[3] = -1;
+  FoundIntSize[4] = -1;
+  
+  for(i=0;i<H5_FORTRAN_NUM_INTEGER_KINDS;i++) {
+    FoundIntSize[i] = (int)IntKinds[i];
+    FoundIntSizeKind[i] = (int)IntKinds_SizeOf[i];
+/*     writeToFiles("int",chrA, chrB, FoundIntSize[i], FoundIntSizeKind[i]); */
+  }
 
-    for(i=0;i<4;i++) {
+  for(i=0;i<H5_FORTRAN_NUM_INTEGER_KINDS;i++) {
       if( FoundIntSize[i] > 0) /* Found the integer type */
 	{
 	  sprintf(chrA, "Fortran_INTEGER_%d", FoundIntSize[i]);
@@ -443,129 +380,69 @@ int main(void)
 /* it a value of the next larger one, but if the next         */
 /* higher one is not available we assigned it the next lowest */
 
-    FoundRealSize[0] = -4;
-    FoundRealSize[1] = -8;
-    FoundRealSize[2] = -16;
-
-#if defined H5_FORTRAN_HAS_REAL_4_KIND
-    FoundRealSize[0] = 4;
-    FoundRealSizeKind[0] = H5_FORTRAN_HAS_REAL_4_KIND;
-#endif
-#if defined H5_FORTRAN_HAS_REAL_8_KIND
-    FoundRealSize[1] = 8;
-    FoundRealSizeKind[1] = H5_FORTRAN_HAS_REAL_8_KIND;
-#endif
-
-#if defined H5_FORTRAN_HAS_REAL_16_KIND
-    if(H5_C_HAS_REAL_NATIVE_16 != 0) {
-      FoundRealSize[2] = 16;
-      FoundRealSizeKind[2] = H5_FORTRAN_HAS_REAL_16_KIND;
-    }
-#endif
-
-    for(i=0;i<3;i++) {
-      if( FoundRealSize[i] > 0) /* Found the real type */
-	{
-	  sprintf(chrA, "Fortran_REAL_%d", FoundRealSize[i]);
-	  sprintf(chrB, "real_%d_f", FoundRealSize[i]);
-	  writeToFiles("float",chrA, chrB, FoundRealSize[i], FoundRealSizeKind[i]);
-	}
-      else  /* Did not find the real type */
-	{
-	  flag = 0; /* flag indicating if found the next highest */
-	  for(j=i+1;j<3;j++)  /* search for next highest */
-	    {
-	      if( FoundRealSize[j] > 0) /* Found the next highest */
-		{
-		  sprintf(chrA, "Fortran_REAL_%d", (-1)*FoundRealSize[i]);
-		  sprintf(chrB, "real_%d_f", (-1)*FoundRealSize[i]);
-		  if(FoundRealSize[j]>4) {
-		    writeToFiles("float",chrA, chrB,  FoundRealSize[j], FoundRealSizeKind[j]);
-		    flag = 1;
-		  }
-		/*   else { */
-/* 		    writeToFiles("float", chrA, chrB, FoundRealSize[j]); */
-/* 		  } */
-		  flag = 1;
-		  break;
-		}
-	    }
-	  if(flag == 0) /* No higher one found, so find next lowest */
-	    {
-	      for(j=1;j>-1;j--)  /* Search for next lowest */
-		{
-		  if( FoundRealSize[j] > 0) /* Found the next lowest */
-		    {
-		      sprintf(chrA, "Fortran_REAL_%d", (-1)*FoundRealSize[i]);
-		      sprintf(chrB, "real_%d_f", (-1)*FoundRealSize[i]);
-		      if(FoundRealSize[j]>4)
-			writeToFiles("float",chrA, chrB,  FoundRealSize[j], FoundRealSizeKind[j]);
-		     /*  else { */
-/* 			writeToFiles("float", chrA, chrB, FoundRealSize[j]); */
-/* 		      } */
-		      flag = 1;
-		      break;
-		    }
-		}
-	    }
-	  if(flag == 0) /* No higher or lower one found, indicating an error */
-	     return -1;
-	}
+  for(i=0;i<H5_FORTRAN_NUM_REAL_KINDS;i++) {
+    if (RealKinds[i] > 0) {
+      sprintf(chrA, "Fortran_REAL_%s", Real_C_TYPES[i]);
+      sprintf(chrB, "real_%s_f", Real_C_TYPES[i]);
+      writeToFiles("float",chrA, chrB, RealKinds[i], RealKinds_SizeOf[i]);
     }
+  }
 
   /* hid_t */
-#if defined H5_FORTRAN_HAS_INTEGER_8_KIND && H5_SIZEOF_HID_T >= 8
-    writeToFiles("int","HID_T", "hid_t_f", 8, H5_FORTRAN_HAS_INTEGER_8_KIND);
-#elif defined H5_FORTRAN_HAS_INTEGER_4_KIND && H5_SIZEOF_HID_T >= 4
-    writeToFiles("int","HID_T", "hid_t_f", 4, H5_FORTRAN_HAS_INTEGER_4_KIND);
-#elif defined H5_FORTRAN_HAS_INTEGER_2_KIND && H5_SIZEOF_HID_T >= 2
-    writeToFiles("int","HID_T", "hid_t_f", 2, H5_FORTRAN_HAS_INTEGER_2_KIND);
-#elif defined H5_FORTRAN_HAS_INTEGER_1_KIND && H5_SIZEOF_HID_T >= 1
-    writeToFiles("int","HID_T", "hid_t_f", 1, H5_FORTRAN_HAS_INTEGER_1_KIND);
-#elif defined H5_FORTRAN_HAS_INTEGER_8_KIND && H5_SIZEOF_HID_T >= 4
-    writeToFiles("int","HID_T", "hid_t_f", 8, H5_FORTRAN_HAS_INTEGER_8_KIND);
-#else
-    /* Error: couldn't find a size for hid_t */
-    return -1;
-#endif
+  for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) {
+    if(IntKinds_SizeOf[i] == H5_SIZEOF_HID_T) {
+      writeToFiles("int","HID_T", "hid_t_f", H5_SIZEOF_HID_T, IntKinds[i]);
+      break;
+    }
+    if(i == (H5_FORTRAN_NUM_INTEGER_KINDS-1) )
+      /* Error: couldn't find a size for hid_t */
+      return -1;
+  }
 
   /* real_f */
-#if defined H5_FORTRAN_HAS_REAL_NATIVE_16_KIND
-    if(H5_C_HAS_REAL_NATIVE_16 != 0) {
-      writeToFiles("float","Fortran_REAL", "real_f", 16, H5_FORTRAN_HAS_REAL_NATIVE_16_KIND);
+  if(H5_FORTRAN_NATIVE_REAL_SIZEOF == sizeof(long double))
+    writeToFilesChr("float","Fortran_REAL", "real_f", H5_FORTRAN_NATIVE_REAL_KIND, "C_LONG_DOUBLE");
+  else if(H5_FORTRAN_NATIVE_REAL_SIZEOF == sizeof(double))
+    writeToFilesChr("float","Fortran_REAL", "real_f", H5_FORTRAN_NATIVE_REAL_KIND, "C_DOUBLE");
+  else if(H5_FORTRAN_NATIVE_REAL_SIZEOF == sizeof(float))
+    writeToFilesChr("float","Fortran_REAL", "real_f", H5_FORTRAN_NATIVE_REAL_KIND, "C_FLOAT");
+  else {
+    /* No exact match, choose the next highest */
+    if(H5_FORTRAN_NATIVE_REAL_SIZEOF > sizeof(long double))
+      writeToFilesChr("float","Fortran_REAL", "real_f", H5_FORTRAN_NATIVE_REAL_KIND, "C_LONG_DOUBLE");
+    else if(H5_FORTRAN_NATIVE_REAL_SIZEOF > sizeof(double))
+      writeToFilesChr("float","Fortran_REAL", "real_f", H5_FORTRAN_NATIVE_REAL_KIND, "C_DOUBLE");
+    else if(H5_FORTRAN_NATIVE_REAL_SIZEOF > sizeof(float))
+      writeToFilesChr("float","Fortran_REAL", "real_f", H5_FORTRAN_NATIVE_REAL_KIND, "C_FLOAT");
+    else {
+      /* Error: couldn't find a size for real_f */
+      printf("Error: couldn't find a size for real_f \n");
+      return -1;
     }
-#elif defined H5_FORTRAN_HAS_REAL_NATIVE_8_KIND
-    writeToFiles("float", "Fortran_REAL", "real_f", 8, H5_FORTRAN_HAS_REAL_NATIVE_8_KIND);
-#elif defined H5_FORTRAN_HAS_REAL_NATIVE_4_KIND
-    writeToFiles("float", "Fortran_REAL", "real_f", 4, H5_FORTRAN_HAS_REAL_NATIVE_4_KIND);
-#else
-    /* Error: couldn't find a size for real_f */
-    return -1;
-#endif
+  }
 
   /* double_f */
-#if defined H5_FORTRAN_HAS_DOUBLE_NATIVE_16_KIND
-    if(H5_C_HAS_REAL_NATIVE_16 != 0) { /* Check if C has 16 byte floats */
-      writeToFiles("float", "Fortran_DOUBLE", "double_f", 16, H5_FORTRAN_HAS_DOUBLE_NATIVE_16_KIND);
-    } else {
-#if defined H5_FORTRAN_HAS_REAL_NATIVE_8_KIND /* Fall back to 8 byte floats */
-    writeToFiles("float", "Fortran_DOUBLE", "double_f", 8, H5_FORTRAN_HAS_REAL_NATIVE_8_KIND);
-    }
-#elif defined H5_FORTRAN_HAS_REAL_NATIVE_4_KIND  /* Fall back to 4 byte floats */
-    writeToFiles("float", "Fortran_DOUBLE", "double_f", 4, H5_FORTRAN_HAS_REAL_NATIVE_4_KIND);
+  if(H5_FORTRAN_NATIVE_DOUBLE_SIZEOF == sizeof(long double))
+    writeToFilesChr("float","Fortran_DOUBLE", "double_f", H5_FORTRAN_NATIVE_DOUBLE_KIND, "C_LONG_DOUBLE");
+  else if(H5_FORTRAN_NATIVE_DOUBLE_SIZEOF == sizeof(double))
+    writeToFilesChr("float","Fortran_DOUBLE", "double_f", H5_FORTRAN_NATIVE_DOUBLE_KIND, "C_DOUBLE");
+  else if(H5_FORTRAN_NATIVE_DOUBLE_SIZEOF == sizeof(float))
+    writeToFilesChr("float","Fortran_DOUBLE", "double_f", H5_FORTRAN_NATIVE_DOUBLE_KIND, "C_FLOAT");
+#ifdef H5_HAVE_FLOAT128
+    /* Don't select a higher precision than Fortran can support */
+  else if(sizeof(__float128) == H5_FORTRAN_NATIVE_DOUBLE_SIZEOF && H5_PAC_FC_MAX_REAL_PRECISION > 28) {
+      writeToFilesChr("float","Fortran_DOUBLE", "double_f", H5_FORTRAN_NATIVE_DOUBLE_KIND, "C_FLOAT128");
     }
 #else
-    /* Error: couldn't find a size for double_f when fortran has 16 byte reals */
-    return -1;
+  else if(sizeof(long double) == H5_FORTRAN_NATIVE_DOUBLE_SIZEOF && H5_PAC_FC_MAX_REAL_PRECISION > 28) {
+      writeToFilesChr("float","Fortran_DOUBLE", "double_f", H5_FORTRAN_NATIVE_DOUBLE_KIND, "C_FLOAT128");
     }
 #endif
-
-#elif defined H5_FORTRAN_HAS_DOUBLE_NATIVE_8_KIND
-    writeToFiles("float", "Fortran_DOUBLE", "double_f", 8, H5_FORTRAN_HAS_DOUBLE_NATIVE_8_KIND);
-#else
-    /* Error: couldn't find a size for real_f */
+  else {
+    /* Error: couldn't find a size for double_f */
+    printf("Error: couldn't find a size for double_f \n");
     return -1;
-#endif
+  }
 
   /* Need the buffer size for the fortran derive type 'hdset_reg_ref_t_f03'
    * in order to be interoperable with C's structure, the C buffer size
@@ -574,12 +451,12 @@ int main(void)
     
     fprintf(fort_header, "        INTEGER, PARAMETER :: H5R_DSET_REG_REF_BUF_SIZE_F = %u\n", H5_SIZEOF_HADDR_T + 4 );
 
-
   /* Close files */
   endCfile();
   endFfile();
   fclose(c_header);
   fclose(fort_header);
+
   return 0;
 }
 
diff --git a/fortran/src/H5test_kind.f90 b/fortran/src/H5test_kind.f90
deleted file mode 100644
index 1a1a0ec..0000000
--- a/fortran/src/H5test_kind.f90
+++ /dev/null
@@ -1,269 +0,0 @@
-!****p* Program/H5test_kind
-!
-! NAME
-!  Executable: H5test_kind
-!
-! FILE
-!  fortran/src/H5test_kind.f90
-!
-! PURPOSE
-!  This stand alone program is used at build time to generate the program
-!  H5fortran_detect.f90. It cycles through all the available KIND parameters for
-!  integers and reals. The appropriate program and subroutines are then generated
-!  depending on which of the KIND values are found.
-!
-! NOTES
-!  This program is depreciated in favor of H5test_kind_SIZEOF.f90 and is only
-!  used when the Fortran intrinsic function SIZEOF is not available. It generates
-!  code that does not make use of SIZEOF in H5fortran_detect.f90 which is less
-!  portable in comparison to using SIZEOF.
-!
-!  The availability of SIZEOF is checked at configure time and the TRUE/FALSE
-!  condition is set in the configure variable "FORTRAN_HAVE_SIZEOF".
-!
-! COPYRIGHT
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!  Copyright by The HDF Group.                                                 *
-!  Copyright by the Board of Trustees of the University of Illinois.           *
-!  All rights reserved.                                                        *
-!                                                                              *
-!  This file is part of HDF5.  The full HDF5 copyright notice, including       *
-!  terms governing use, modification, and redistribution, is contained in      *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root     *
-!  of the source code distribution tree; Copyright.html can be found at the    *
-!  root level of an installed copy of the electronic HDF5 document set and     *
-!  is linked from the top-level documents page.  It can also be found at       *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have            *
-!  access to either file, you may request a copy from help at hdfgroup.org.       *
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! AUTHOR
-!  Elena Pourma
-!
-!*****
-
-PROGRAM test_kind
-  IMPLICIT NONE
-  INTEGER :: i, j, ii, ir, last, ikind_numbers(10), rkind_numbers(10)
-  INTEGER :: ji, jr, jd
-  last = -1
-  ii = 0
-  j = SELECTED_INT_KIND(18)
-  DO i = 1,100
-     j = SELECTED_INT_KIND(i)
-     IF(j .NE. last) THEN
-        IF(last .NE. -1) THEN
-           ii = ii + 1
-           ikind_numbers(ii) = last
-        ENDIF
-        last = j
-        IF(j .EQ. -1) EXIT
-     ENDIF
-  ENDDO
-
-  last = -1
-  ir = 0
-  DO i = 1,100
-     j = SELECTED_REAL_KIND(i)
-     IF(j .NE. last) THEN
-        IF(last .NE. -1) THEN
-           ir = ir + 1
-           rkind_numbers(ir) = last
-        ENDIF
-        last = j
-        IF(j .EQ. -1) EXIT
-     ENDIF
-  ENDDO
-
-!  Generate program information:
-
-WRITE(*,'(40(A,/))') &
-'!****h* ROBODoc/H5fortran_detect.f90',&
-'!',&
-'! NAME',&
-'!  H5fortran_detect',&
-'! ',&
-'! PURPOSE',&
-'!  This stand alone program is used at build time to generate the header file',&
-'!  H5fort_type_defines.h. The source code itself was automatically generated by',&
-'!  the program H5test_kind.f90',&
-'!',&
-'! NOTES',&
-'!  This source code does not make use of the Fortran intrinsic function SIZEOF because',&
-'!  the availability of the intrinsic function was determined to be not available at',&
-'!  configure time',&
-'!',&
-'! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *',&
-'!   Copyright by The HDF Group.                                               *',&
-'!   Copyright by the Board of Trustees of the University of Illinois.         *',&
-'!   All rights reserved.                                                      *',&
-'!                                                                             *',&
-'!   This file is part of HDF5.  The full HDF5 copyright notice, including     *',&
-'!   terms governing use, modification, and redistribution, is contained in    *',&
-'!   the files COPYING and Copyright.html.  COPYING can be found at the root   *',&
-'!   of the source code distribution tree; Copyright.html can be found at the  *',&
-'!   root level of an installed copy of the electronic HDF5 document set and   *',&
-'!   is linked from the top-level documents page.  It can also be found at     *',&
-'!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *',&
-'!   access to either file, you may request a copy from help at hdfgroup.org.     *',&
-'! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *',&
-'!',&
-'! AUTHOR',&
-'!  H5test_kind.f90',&
-'!',&
-'!*****'
-
-!  Generate a program
-
-  WRITE(*,*) "PROGRAM int_kind"
-  WRITE(*,*) "WRITE(*,*) "" /*generating header file*/ """
-  ji = 0
-  WRITE(*, "("" CALL i"", i2.2,""()"")") ji
-  jr = 0
-  WRITE(*, "("" CALL r"", i2.2,""()"")") jr
-  jd = 0
-  WRITE(*, "("" CALL d"", i2.2,""()"")") jd
-  DO i = 1, ii
-     j = ikind_numbers(i)
-     WRITE(*, "("" CALL i"", i2.2,""()"")") j
-  ENDDO
-  DO i = 1, ir
-     j = rkind_numbers(i)
-     WRITE(*, "("" CALL r"", i2.2,""()"")") j
-  ENDDO
-  WRITE(*,*) "END PROGRAM int_kind"
-  j = 0
-  ji = KIND(1)
-  WRITE(*, "("" SUBROUTINE i"", i2.2,""()"")") j
-  WRITE(*,*)"   IMPLICIT NONE"
-  WRITE(*,*)"   INTEGER :: a = 0"
-  WRITE(*,*)"   INTEGER :: a_size"
-  WRITE(*,*)"   CHARACTER(LEN=2) :: jchr2"
-  WRITE(*,*)"   a_size = BIT_SIZE(a)"
-  WRITE(*,*)"   IF (a_size .EQ. 8) THEN"
-  WRITE(*,*)"       WRITE(jchr2,'(I2)')",ji
-  WRITE(*,'(A)')'       WRITE(*,*) "#define H5_FORTRAN_HAS_NATIVE_1_KIND "'//"//ADJUSTL(jchr2)"
-  WRITE(*,*)"   endif"
-  WRITE(*,*)"   IF (a_size .EQ. 16) THEN"
-  WRITE(*,*)"       WRITE(jchr2,'(I2)')",ji
-  WRITE(*,'(A)')'       WRITE(*,*) "#define H5_FORTRAN_HAS_NATIVE_2_KIND "'//"//ADJUSTL(jchr2)"
-  WRITE(*,*)"   endif"
-  WRITE(*,*)"   IF (a_size .EQ. 32) THEN"
-  WRITE(*,*)"       WRITE(jchr2,'(I2)')",ji
-  WRITE(*,'(A)')'       WRITE(*,*) "#define H5_FORTRAN_HAS_NATIVE_4_KIND "'//"//ADJUSTL(jchr2)"
-  WRITE(*,*)"   ENDIF"
-  WRITE(*,*)"   IF (a_size .EQ. 64) THEN"
-  WRITE(*,*)"       WRITE(jchr2,'(I2)')",ji
-  WRITE(*,'(A)')'       WRITE(*,*) "#define H5_FORTRAN_HAS_NATIVE_8_KIND "'//"//ADJUSTL(jchr2)"
-  WRITE(*,*)"   ENDIF"
-  WRITE(*,*)"   IF (a_size .EQ. 128) THEN"
-  WRITE(*,*)"       WRITE(jchr2,'(I2)')",ji
-  WRITE(*,'(A)')'       WRITE(*,*) "#define H5_FORTRAN_HAS_NATIVE_16_KIND "'//"//ADJUSTL(jchr2)"
-  WRITE(*,*)"   ENDIF"
-  WRITE(*,*)"   RETURN"
-  WRITE(*,*)"END SUBROUTINE"
-  jr = KIND(1.0)
-  WRITE(*, "("" SUBROUTINE r"", i2.2,""()"")") j
-  WRITE(*,*)"   IMPLICIT NONE"
-  WRITE(*,*)"   REAL :: b(32)"
-  WRITE(*,*)"   INTEGER :: a(1)"
-  WRITE(*,*)"   INTEGER :: a_size"
-  WRITE(*,*)"   INTEGER :: real_size"
-  WRITE(*,*)"   CHARACTER(LEN=2) :: jchr2"
-  WRITE(*,*)"   a_size = BIT_SIZE(a(1)) ! Size in bits for integer"
-  WRITE(*,*)"   real_size = (SIZE(TRANSFER(b,a))*a_size)/SIZE(b)"
-  WRITE(*,*)"   IF (real_size .EQ. 32) THEN"
-  WRITE(*,*)"       WRITE(jchr2,'(I2)')",jr
-  WRITE(*,'(A)')'       WRITE(*,*) "#define H5_FORTRAN_HAS_REAL_NATIVE_4_KIND "'//"//ADJUSTL(jchr2)"
-  WRITE(*,*)"   ENDIF"
-  WRITE(*,*)"   IF (real_size .EQ. 64) THEN"
-  WRITE(*,*)"       WRITE(jchr2,'(I2)')",jr
-  WRITE(*,'(A)')'       WRITE(*,*) "#define H5_FORTRAN_HAS_REAL_NATIVE_8_KIND "'//"//ADJUSTL(jchr2)"
-  WRITE(*,*)"   ENDIF"
-  WRITE(*,*)"   IF (real_size .EQ. 128) THEN"
-  WRITE(*,*)"       WRITE(jchr2,'(I2)')",jr
-  WRITE(*,'(A)')'       WRITE(*,*) "#define H5_FORTRAN_HAS_REAL_NATIVE_16_KIND "'//"//ADJUSTL(jchr2)"
-  WRITE(*,*)"   ENDIF"
-  WRITE(*,*)"   RETURN"
-  WRITE(*,*)"END SUBROUTINE"
-  jd = KIND(1.d0)
-  WRITE(*, "("" SUBROUTINE d"", i2.2,""()"")") j
-  WRITE(*,*)"   IMPLICIT NONE"
-  WRITE(*,*)"   DOUBLE PRECISION :: b=0"
-  WRITE(*,*)"   INTEGER :: a(8)=0"
-  WRITE(*,*)"   INTEGER :: a_size"
-  WRITE(*,*)"   INTEGER :: b_size"
-  WRITE(*,*)"   CHARACTER(LEN=2) :: jchr2"
-  WRITE(*,*)"   a_size = BIT_SIZE(a(1))"
-  WRITE(*,*)"   b_size = SIZE(transfer(b,a))*a_size"
-  WRITE(*,*)"   IF (b_size .EQ. 64) THEN"
-  WRITE(*,*)"       WRITE(jchr2,'(I2)')",jd
-  WRITE(*,'(A)')'       WRITE(*,*) "#define H5_FORTRAN_HAS_DOUBLE_NATIVE_8_KIND "'//"//ADJUSTL(jchr2)"
-  WRITE(*,*)"   ENDIF"
-  WRITE(*,*)"   IF (b_size .EQ. 128) THEN"
-  WRITE(*,*)"       WRITE(jchr2,'(I2)')",jd
-  WRITE(*,'(A)')'       WRITE(*,*) "#define H5_FORTRAN_HAS_DOUBLE_NATIVE_16_KIND "'//"//ADJUSTL(jchr2)"
-  WRITE(*,*)"   ENDIF"
-  WRITE(*,*)"   RETURN"
-  WRITE(*,*)"END SUBROUTINE"
-  DO i = 1, ii
-     j = ikind_numbers(i)
-     WRITE(*, "("" SUBROUTINE i"", i2.2,""()"")") j
-     WRITE(*,*)"   IMPLICIT NONE"
-     WRITE(*,*)"   INTEGER(",j,") :: a = 0"
-     WRITE(*,*)"   INTEGER :: a_size"
-     WRITE(*,*)"   CHARACTER(LEN=2) :: jchr2"
-     WRITE(*,*)"   a_size = BIT_SIZE(a)"
-     WRITE(*,*)"   IF (a_size .EQ. 8) THEN"
-     WRITE(*,*)"       WRITE(jchr2,'(I2)')",j
-     WRITE(*,'(A)')'       WRITE(*,*) "#define H5_FORTRAN_HAS_INTEGER_1_KIND "'//"//ADJUSTL(jchr2)"
-     WRITE(*,*)"   ENDIF"
-     WRITE(*,*)"   IF (a_size .EQ. 16) THEN"
-     WRITE(*,*)"       WRITE(jchr2,'(I2)')",j
-     WRITE(*,'(A)')'       WRITE(*,*) "#define H5_FORTRAN_HAS_INTEGER_2_KIND "'//"//ADJUSTL(jchr2)"
-     WRITE(*,*)"   ENDIF"
-     WRITE(*,*)"   IF (a_size .EQ. 32) THEN"
-     WRITE(*,*)"       WRITE(jchr2,'(I2)')",j
-     WRITE(*,'(A)')'       WRITE(*,*) "#define H5_FORTRAN_HAS_INTEGER_4_KIND "'//"//ADJUSTL(jchr2)"
-     WRITE(*,*)"   ENDIF"
-     WRITE(*,*)"   IF (a_size .EQ. 64) THEN"
-     WRITE(*,*)"       WRITE(jchr2,'(I2)')",j
-     WRITE(*,'(A)')'       WRITE(*,*) "#define H5_FORTRAN_HAS_INTEGER_8_KIND "'//"//ADJUSTL(jchr2)"
-     WRITE(*,*)"   ENDIF"
-     WRITE(*,*)"   IF (a_size .EQ. 128) THEN"
-     WRITE(*,*)"       WRITE(jchr2,'(I2)')",j
-     WRITE(*,'(A)')'       WRITE(*,*) "#define H5_FORTRAN_HAS_INTEGER_16_KIND "'//"//ADJUSTL(jchr2)"
-     WRITE(*,*)"   ENDIF"
-     WRITE(*,*)"   RETURN"
-     WRITE(*,*)"   END SUBROUTINE"
-  ENDDO
-  DO i = 1, ir
-     j = rkind_numbers(i)
-     WRITE(*, "("" SUBROUTINE r"", i2.2,""()"")") j
-     WRITE(*,*)"   IMPLICIT NONE"
-     WRITE(*,*)"   REAL(KIND=",j,") :: b(32)"
-     WRITE(*,*)"   INTEGER :: a(1)"
-     WRITE(*,*)"   INTEGER :: a_size"
-     WRITE(*,*)"   INTEGER :: real_size"
-     WRITE(*,*)"   CHARACTER(LEN=2) :: jchr2"
-     WRITE(*,*)"   a_size = BIT_SIZE(a(1)) ! Size in bits for integer"
-     WRITE(*,*)"   real_size = (SIZE(TRANSFER(b,a))*a_size)/SIZE(b)"
-     WRITE(*,*)"   IF (real_size .EQ. 32) THEN"
-     WRITE(*,*)"       WRITE(jchr2,'(I2)')",j
-     WRITE(*,'(A)')'       WRITE(*,*) "#define H5_FORTRAN_HAS_REAL_4_KIND "'//"//ADJUSTL(jchr2)"
-     WRITE(*,*)"   ENDIF"
-     WRITE(*,*)"   IF (real_size .EQ. 64) THEN"
-     WRITE(*,*)"       WRITE(jchr2,'(I2)')",j
-     WRITE(*,*)'       WRITE(*,*) "#define H5_FORTRAN_HAS_REAL_8_KIND "'//"//ADJUSTL(jchr2)"
-     WRITE(*,*)"   endif"
-     WRITE(*,*)"   IF (real_size .EQ. 128) THEN"
-     WRITE(*,*)"       WRITE(jchr2,'(I2)')",j
-     WRITE(*,'(A)')'       WRITE(*,*) "#define H5_FORTRAN_HAS_REAL_16_KIND "'//"//ADJUSTL(jchr2)"
-     WRITE(*,*)"   ENDIF"
-     WRITE(*,*)"   RETURN"
-     WRITE(*,*)"   END SUBROUTINE"
-  ENDDO
-END PROGRAM test_kind
-
-
-
diff --git a/fortran/src/H5test_kind_SIZEOF.f90 b/fortran/src/H5test_kind_SIZEOF.f90
deleted file mode 100644
index 468086a..0000000
--- a/fortran/src/H5test_kind_SIZEOF.f90
+++ /dev/null
@@ -1,228 +0,0 @@
-!****p* Program/H5test_kind_SIZEOF
-!
-! NAME
-!  Executable: H5test_kind
-!
-! FILE
-!  fortran/src/H5test_kind_SIZEOF.f90
-!
-! PURPOSE
-!  This stand alone program is used at build time to generate the program
-!  H5fortran_detect.f90. It cycles through all the available KIND parameters for
-!  integers and reals. The appropriate program and subroutines are then generated
-!  depending on which of the KIND values are found.
-!
-! NOTES
-!  This program is used in place of H5test_kind.f90 when the Fortran intrinsic
-!  function SIZEOF is available. It generates code that makes use of SIZEOF in
-!  H5fortran_detect.f90 which is a portable solution but is not standard
-!  compliant. The program H5test_kind_C_SIZEOF uses F2008 standard intrinsic
-!  function instead, which is the preferred method. 
-!
-!  The availability of SIZEOF is checked at configure time and the TRUE/FALSE
-!  condition is set in the configure variable "FORTRAN_HAVE_SIZEOF".
-!
-! COPYRIGHT
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!  Copyright by The HDF Group.                                                 *
-!  Copyright by the Board of Trustees of the University of Illinois.           *
-!  All rights reserved.                                                        *
-!                                                                              *
-!  This file is part of HDF5.  The full HDF5 copyright notice, including       *
-!  terms governing use, modification, and redistribution, is contained in      *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root     *
-!  of the source code distribution tree; Copyright.html can be found at the    *
-!  root level of an installed copy of the electronic HDF5 document set and     *
-!  is linked from the top-level documents page.  It can also be found at       *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have            *
-!  access to either file, you may request a copy from help at hdfgroup.org.       *
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!
-!*****
-
-PROGRAM test_kind
-  IMPLICIT NONE
-  INTEGER :: i, j, ii, ir, last, ikind_numbers(10), rkind_numbers(10)
-  INTEGER :: ji, jr, jd
-  last = -1
-  ii = 0
-
-  ikind_numbers = 0
-  rkind_numbers = 0
-
-  DO i = 1,100
-     j = SELECTED_INT_KIND(i)
-     IF(j .NE. last) THEN
-        IF(last .NE. -1) THEN
-           ii = ii + 1
-           ikind_numbers(ii) = last
-        ENDIF
-        last = j
-        IF(j .EQ. -1) EXIT
-     ENDIF
-  ENDDO
-
-  last = -1
-  ir = 0
-  DO i = 1,100
-     j = SELECTED_REAL_KIND(i)
-     IF(j .NE. last) THEN
-        IF(last .NE. -1) THEN
-           ir = ir + 1
-           rkind_numbers(ir) = last
-        ENDIF
-        last = j
-        IF(j .EQ. -1) EXIT
-     ENDIF
-  ENDDO
-
-!  Generate program information:
-
-WRITE(*,'(40(A,/))') &
-'!****h* ROBODoc/H5fortran_detect.f90',&
-'!',&
-'! NAME',&
-'!  H5fortran_detect',&
-'! ',&
-'! PURPOSE',&
-'!  This stand alone program is used at build time to generate the header file',&
-'!  H5fort_type_defines.h. The source code itself was automatically generated by',&
-'!  the program H5test_kind_SIZEOF.f90',&
-'!',&
-'! NOTES',&
-'!  This source code makes use of the Fortran intrinsic function SIZEOF because',&
-'!  the availability of the intrinsic function was determined to be available at',&
-'!  configure time',&
-'!',&
-'! COPYRIGHT',&
-'! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *',&
-'!   Copyright by The HDF Group.                                               *',&
-'!   Copyright by the Board of Trustees of the University of Illinois.         *',&
-'!   All rights reserved.                                                      *',&
-'!                                                                             *',&
-'!   This file is part of HDF5.  The full HDF5 copyright notice, including     *',&
-'!   terms governing use, modification, and redistribution, is contained in    *',&
-'!   the files COPYING and Copyright.html.  COPYING can be found at the root   *',&
-'!   of the source code distribution tree; Copyright.html can be found at the  *',&
-'!   root level of an installed copy of the electronic HDF5 document set and   *',&
-'!   is linked from the top-level documents page.  It can also be found at     *',&
-'!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *',&
-'!   access to either file, you may request a copy from help at hdfgroup.org.     *',&
-'! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *',&
-'!',&
-'! AUTHOR',&
-'!  H5test_kind_SIZEOF.f90',&
-'!',&
-'!*****'
-
-! GENERATE A PROGRAM
-!
-! (a) Generate the module
-
-  WRITE(*,*) "MODULE H5test_kind_SIZEOF_mod"
-  WRITE(*,*) "USE ISO_C_BINDING"
-  WRITE(*,*) "IMPLICIT NONE"
-  WRITE(*,*) "CONTAINS"
-  j = 0
-  ji = KIND(1)
-  WRITE(*, "("" SUBROUTINE i"", i2.2,""()"")") j
-  WRITE(*,*)"   IMPLICIT NONE"
-  WRITE(*,*)"   INTEGER :: a"
-  WRITE(*,*)"   INTEGER(C_SIZE_T) :: a_size"
-  WRITE(*,*)"   CHARACTER(LEN=2) :: ichr2, jchr2"
-  WRITE(*,*)"   a_size = SIZEOF(a)"
-  WRITE(*,*)"   WRITE(ichr2,'(I2)') a_size"
-  WRITE(*,'(A,I0)')"    WRITE(jchr2,'(I2)') ",ji
-  WRITE(*,'(A)')'    WRITE(*,*) "#define H5_FORTRAN_HAS_NATIVE_"'//  &
-       "//TRIM(ADJUSTL(ichr2))//"//'"_KIND "'//"//ADJUSTL(jchr2)"
-  WRITE(*,*)"   RETURN"
-  WRITE(*,*)"END SUBROUTINE"
-  jr = 0
-  j = KIND(1.0)
-  WRITE(*, "("" SUBROUTINE r"", i2.2,""()"")") jr
-  WRITE(*,*)"   IMPLICIT NONE"
-  WRITE(*,*)"   REAL :: a"
-  WRITE(*,*)"   INTEGER(C_SIZE_T) :: a_size"
-  WRITE(*,*)"   CHARACTER(LEN=2) :: ichr2, jchr2"
-  WRITE(*,*)"   a_size = SIZEOF(a)"
-  WRITE(*,*)"   WRITE(ichr2,'(I2)') a_size"
-  WRITE(*,'(A,I0)')"    WRITE(jchr2,'(I2)') ",j
-  WRITE(*,'(A)')'    WRITE(*,*) "#define H5_FORTRAN_HAS_REAL_NATIVE_"'//  &
-       "//TRIM(ADJUSTL(ichr2))//"//'"_KIND "'//"//ADJUSTL(jchr2)"
-  WRITE(*,*)"   RETURN"
-  WRITE(*,*)"END SUBROUTINE"
-  jd = 0
-  j = KIND(1.d0)
-  WRITE(*, "("" SUBROUTINE d"", i2.2,""()"")") jd
-  WRITE(*,*)"   IMPLICIT NONE"
-  WRITE(*,*)"   DOUBLE PRECISION :: a"
-  WRITE(*,*)"   INTEGER(C_SIZE_T) :: a_size"
-  WRITE(*,*)"   CHARACTER(LEN=2) :: ichr2, jchr2"
-  WRITE(*,*)"   a_size = SIZEOF(a)"
-  WRITE(*,*)"   WRITE(ichr2,'(I2)') a_size"
-  WRITE(*,'(A,I0)')"    WRITE(jchr2,'(I2)') ",j
-  WRITE(*,'(A)')'    WRITE(*,*) "#define H5_FORTRAN_HAS_DOUBLE_NATIVE_"'//  &
-       "//TRIM(ADJUSTL(ichr2))//"//'"_KIND "'//"//ADJUSTL(jchr2)"
-  WRITE(*,*)"   RETURN"
-  WRITE(*,*)"END SUBROUTINE"
-  DO i = 1, ii
-     j = ikind_numbers(i)
-     WRITE(*, "("" SUBROUTINE i"", i2.2,""()"")") j
-     WRITE(*,*)"   IMPLICIT NONE"
-     WRITE(*,'(A,I0,A)')"   INTEGER(KIND=",j,") :: a"
-     WRITE(*,*)"   INTEGER(C_SIZE_T) :: a_size"
-     WRITE(*,*)"   CHARACTER(LEN=2) :: ichr2, jchr2"
-     WRITE(*,*)"   a_size = SIZEOF(a)"
-     WRITE(*,*)"   WRITE(ichr2,'(I2)') a_size"
-     WRITE(*,'(A,I0)')"    WRITE(jchr2,'(I2)') ",j
-     WRITE(*,'(A)')'    WRITE(*,*) "#define H5_FORTRAN_HAS_INTEGER_"'//  &
-          "//TRIM(ADJUSTL(ichr2))//"//'"_KIND "'//"//ADJUSTL(jchr2)"
-     WRITE(*,*)"   RETURN"
-     WRITE(*,*)"END SUBROUTINE"
-  ENDDO
-  DO i = 1, ir
-     j = rkind_numbers(i)
-     WRITE(*, "("" SUBROUTINE r"", i2.2,""()"")") j
-     WRITE(*,*)"   IMPLICIT NONE"
-     WRITE(*,'(A,I0,A)')"    REAL(KIND= ",j,") :: a"
-     WRITE(*,*)"   INTEGER(C_SIZE_T) :: a_size"
-     WRITE(*,*)"   CHARACTER(LEN=2) :: ichr2, jchr2"
-     WRITE(*,*)"   a_size = SIZEOF(a)"
-     WRITE(*,*)"   WRITE(ichr2,'(I2)') a_size"
-     WRITE(*,'(A,I0)')"    WRITE(jchr2,'(I2)') ", j
-     WRITE(*,'(A)')'    WRITE(*,*) "#define H5_FORTRAN_HAS_REAL_"'//  &
-          "//TRIM(ADJUSTL(ichr2))//"//'"_KIND "'//"//ADJUSTL(jchr2)"
-     WRITE(*,*)"   RETURN"
-     WRITE(*,*)"END SUBROUTINE"
-  ENDDO
-  WRITE(*,*) "END MODULE H5test_kind_SIZEOF_mod"
-  WRITE(*,*) ""
-
-  ! (b) generate the main program
-
-  WRITE(*,*) "PROGRAM H5test_kind_SIZEOF"
-  WRITE(*,*) "USE H5test_kind_SIZEOF_mod"
-  WRITE(*,*) "WRITE(*,*) "" /*generating header file*/ """
-  ji = 0
-  WRITE(*, "("" CALL i"", i2.2,""()"")") ji
-  jr = 0
-  WRITE(*, "("" CALL r"", i2.2,""()"")") jr
-  jd = 0
-  WRITE(*, "("" CALL d"", i2.2,""()"")") jd
-  DO i = 1, ii
-     j = ikind_numbers(i)
-     WRITE(*, "("" CALL i"", i2.2,""()"")") j
-  ENDDO
-  DO i = 1, ir
-     j = rkind_numbers(i)
-     WRITE(*, "("" CALL r"", i2.2,""()"")") j
-  ENDDO
-  WRITE(*,*) "END PROGRAM H5test_kind_SIZEOF"
-
-END PROGRAM test_kind
-
-
-
diff --git a/fortran/src/H5test_kind_STORAGE_SIZE.f90 b/fortran/src/H5test_kind_STORAGE_SIZE.f90
deleted file mode 100644
index 89c904c..0000000
--- a/fortran/src/H5test_kind_STORAGE_SIZE.f90
+++ /dev/null
@@ -1,230 +0,0 @@
-!****p* Program/H5test_kind_STORAGE_SIZE
-!
-! NAME
-!  Executable: H5test_kind
-!
-! FILE
-!  fortran/src/H5test_kind_STORAGE_SIZE.f90
-!
-! PURPOSE
-!  This stand alone program is used at build time to generate the program
-!  H5fortran_detect.f90. It cycles through all the available KIND parameters for
-!  integers and reals. The appropriate program and subroutines are then generated
-!  depending on which of the KIND values are found.
-!
-! NOTES
-!  This program is used in place of H5test_kind.f90 or H5test_kind_SIZEOF.f90 when 
-!  the Fortran 2008 intrinsic function STORAGE_SIZE is available. It generates code 
-!  that makes use of STORAGE_SIZE in H5fortran_detect.f90, which will be standard
-!  compliant. This program is the preferred method. 
-!
-!  The availability of STORAGE_SIZE is checked at configure time and the TRUE/FALSE
-!  condition is set in the configure variable "FORTRAN_HAVE_STORAGE_SIZE".
-!
-!  The use of C_SIZOF(X) is not used since the argument X must be an interoperable
-!  data entity.
-!
-! COPYRIGHT
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!  Copyright by The HDF Group.                                                 *
-!  Copyright by the Board of Trustees of the University of Illinois.           *
-!  All rights reserved.                                                        *
-!                                                                              *
-!  This file is part of HDF5.  The full HDF5 copyright notice, including       *
-!  terms governing use, modification, and redistribution, is contained in      *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root     *
-!  of the source code distribution tree; Copyright.html can be found at the    *
-!  root level of an installed copy of the electronic HDF5 document set and     *
-!  is linked from the top-level documents page.  It can also be found at       *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have            *
-!  access to either file, you may request a copy from help at hdfgroup.org.       *
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! AUTHOR
-!  M. Scot Breitenfeld
-!
-!*****
-
-PROGRAM test_kind
-  IMPLICIT NONE
-  INTEGER :: i, j, ii, ir, last, ikind_numbers(10), rkind_numbers(10)
-  INTEGER :: ji, jr, jd
-  last = -1
-  ii = 0
-
-  ikind_numbers = 0
-  rkind_numbers = 0
-
-  DO i = 1,100
-     j = SELECTED_INT_KIND(i)
-     IF(j .NE. last) THEN
-        IF(last .NE. -1) THEN
-           ii = ii + 1
-           ikind_numbers(ii) = last
-        ENDIF
-        last = j
-        IF(j .EQ. -1) EXIT
-     ENDIF
-  ENDDO
-
-  last = -1
-  ir = 0
-  DO i = 1,100
-     j = SELECTED_REAL_KIND(i)
-     IF(j .NE. last) THEN
-        IF(last .NE. -1) THEN
-           ir = ir + 1
-           rkind_numbers(ir) = last
-        ENDIF
-        last = j
-        IF(j .EQ. -1) EXIT
-     ENDIF
-  ENDDO
-
-!  Generate program information:
-
-WRITE(*,'(40(A,/))') &
-'!****h* ROBODoc/H5fortran_detect.f90',&
-'!',&
-'! NAME',&
-'!  H5fortran_detect',&
-'! ',&
-'! PURPOSE',&
-'!  This stand alone program is used at build time to generate the header file',&
-'!  H5fort_type_defines.h. The source code itself was automatically generated by',&
-'!  the program H5test_kind_STORAGE_SIZE.f90',&
-'!',&
-'! NOTES',&
-'!  This source code makes use of the Fortran intrinsic function STORAGE_SIZE because',&
-'!  the availability of the intrinsic function was determined to be available at',&
-'!  configure time',&
-'!',&
-'! COPYRIGHT',&
-'! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *',&
-'!   Copyright by The HDF Group.                                               *',&
-'!   Copyright by the Board of Trustees of the University of Illinois.         *',&
-'!   All rights reserved.                                                      *',&
-'!                                                                             *',&
-'!   This file is part of HDF5.  The full HDF5 copyright notice, including     *',&
-'!   terms governing use, modification, and redistribution, is contained in    *',&
-'!   the files COPYING and Copyright.html.  COPYING can be found at the root   *',&
-'!   of the source code distribution tree; Copyright.html can be found at the  *',&
-'!   root level of an installed copy of the electronic HDF5 document set and   *',&
-'!   is linked from the top-level documents page.  It can also be found at     *',&
-'!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *',&
-'!   access to either file, you may request a copy from help at hdfgroup.org.     *',&
-'! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *',&
-'!',&
-'! AUTHOR',&
-'!  H5test_kind_C_SIZEOF.f90',&
-'!',&
-'!*****'
-
-! GENERATE A PROGRAM
-!
-! (a) Generate the module
-
-  WRITE(*,*) "MODULE H5test_kind_STORAGE_SIZE_mod"
-  WRITE(*,*) "USE ISO_C_BINDING"
-  WRITE(*,*) "IMPLICIT NONE"
-  WRITE(*,*) "CONTAINS"
-  j = 0
-  ji = KIND(1)
-  WRITE(*, "("" SUBROUTINE i"", i2.2,""()"")") j
-  WRITE(*,*)"   IMPLICIT NONE"
-  WRITE(*,*)"   INTEGER :: a"
-  WRITE(*,*)"   INTEGER(C_SIZE_T) :: a_size"
-  WRITE(*,*)"   CHARACTER(LEN=2) :: ichr2, jchr2"
-  WRITE(*,*)"   a_size = STORAGE_SIZE(a, c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)"
-  WRITE(*,*)"   WRITE(ichr2,'(I2)') a_size"
-  WRITE(*,'(A,I0)')"    WRITE(jchr2,'(I2)') ",ji
-  WRITE(*,'(A)')'    WRITE(*,*) "#define H5_FORTRAN_HAS_NATIVE_"'//  &
-       "//TRIM(ADJUSTL(ichr2))//"//'"_KIND "'//"//ADJUSTL(jchr2)"
-  WRITE(*,*)"   RETURN"
-  WRITE(*,*)"END SUBROUTINE"
-  jr = 0
-  j = KIND(1.0)
-  WRITE(*, "("" SUBROUTINE r"", i2.2,""()"")") jr
-  WRITE(*,*)"   IMPLICIT NONE"
-  WRITE(*,*)"   REAL :: a"
-  WRITE(*,*)"   INTEGER(C_SIZE_T) :: a_size"
-  WRITE(*,*)"   CHARACTER(LEN=2) :: ichr2, jchr2"
-  WRITE(*,*)"   a_size = STORAGE_SIZE(a, c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)"
-  WRITE(*,*)"   WRITE(ichr2,'(I2)') a_size"
-  WRITE(*,'(A,I0)')"    WRITE(jchr2,'(I2)') ",j
-  WRITE(*,'(A)')'    WRITE(*,*) "#define H5_FORTRAN_HAS_REAL_NATIVE_"'//  &
-       "//TRIM(ADJUSTL(ichr2))//"//'"_KIND "'//"//ADJUSTL(jchr2)"
-  WRITE(*,*)"   RETURN"
-  WRITE(*,*)"END SUBROUTINE"
-  jd = 0
-  j = KIND(1.d0)
-  WRITE(*, "("" SUBROUTINE d"", i2.2,""()"")") jd
-  WRITE(*,*)"   IMPLICIT NONE"
-  WRITE(*,*)"   DOUBLE PRECISION :: a"
-  WRITE(*,*)"   INTEGER(C_SIZE_T) :: a_size"
-  WRITE(*,*)"   CHARACTER(LEN=2) :: ichr2, jchr2"
-  WRITE(*,*)"   a_size = STORAGE_SIZE(a, c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)"
-  WRITE(*,*)"   WRITE(ichr2,'(I2)') a_size"
-  WRITE(*,'(A,I0)')"    WRITE(jchr2,'(I2)') ",j
-  WRITE(*,'(A)')'    WRITE(*,*) "#define H5_FORTRAN_HAS_DOUBLE_NATIVE_"'//  &
-       "//TRIM(ADJUSTL(ichr2))//"//'"_KIND "'//"//ADJUSTL(jchr2)"
-  WRITE(*,*)"   RETURN"
-  WRITE(*,*)"END SUBROUTINE"
-  DO i = 1, ii
-     j = ikind_numbers(i)
-     WRITE(*, "("" SUBROUTINE i"", i2.2,""()"")") j
-     WRITE(*,*)"   IMPLICIT NONE"
-     WRITE(*,'(A,I0,A)')"   INTEGER(KIND=",j,") :: a"
-     WRITE(*,*)"   INTEGER(C_SIZE_T) :: a_size"
-     WRITE(*,*)"   CHARACTER(LEN=2) :: ichr2, jchr2"
-     WRITE(*,*)"   a_size = STORAGE_SIZE(a, c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)"
-     WRITE(*,*)"   WRITE(ichr2,'(I2)') a_size"
-     WRITE(*,'(A,I0)')"    WRITE(jchr2,'(I2)') ",j
-     WRITE(*,'(A)')'    WRITE(*,*) "#define H5_FORTRAN_HAS_INTEGER_"'//  &
-          "//TRIM(ADJUSTL(ichr2))//"//'"_KIND "'//"//ADJUSTL(jchr2)"
-     WRITE(*,*)"   RETURN"
-     WRITE(*,*)"END SUBROUTINE"
-  ENDDO
-  DO i = 1, ir
-     j = rkind_numbers(i)
-     WRITE(*, "("" SUBROUTINE r"", i2.2,""()"")") j
-     WRITE(*,*)"   IMPLICIT NONE"
-     WRITE(*,'(A,I0,A)')"    REAL(KIND= ",j,") :: a"
-     WRITE(*,*)"   INTEGER(C_SIZE_T) :: a_size"
-     WRITE(*,*)"   CHARACTER(LEN=2) :: ichr2, jchr2"
-     WRITE(*,*)"   a_size = STORAGE_SIZE(a, c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)"
-     WRITE(*,*)"   WRITE(ichr2,'(I2)') a_size"
-     WRITE(*,'(A,I0)')"    WRITE(jchr2,'(I2)') ", j
-     WRITE(*,'(A)')'    WRITE(*,*) "#define H5_FORTRAN_HAS_REAL_"'//  &
-          "//TRIM(ADJUSTL(ichr2))//"//'"_KIND "'//"//ADJUSTL(jchr2)"
-     WRITE(*,*)"   RETURN"
-     WRITE(*,*)"END SUBROUTINE"
-  ENDDO
-  WRITE(*,*) "END MODULE H5test_kind_STORAGE_SIZE_mod"
-  WRITE(*,*) ""
-
-  ! (b) generate the main program
-
-  WRITE(*,*) "PROGRAM H5test_kind_STORAGE_SIZE"
-  WRITE(*,*) "USE H5test_kind_STORAGE_SIZE_mod"
-  WRITE(*,*) "WRITE(*,*) "" /*generating header file*/ """
-  ji = 0
-  WRITE(*, "("" CALL i"", i2.2,""()"")") ji
-  jr = 0
-  WRITE(*, "("" CALL r"", i2.2,""()"")") jr
-  jd = 0
-  WRITE(*, "("" CALL d"", i2.2,""()"")") jd
-  DO i = 1, ii
-     j = ikind_numbers(i)
-     WRITE(*, "("" CALL i"", i2.2,""()"")") j
-  ENDDO
-  DO i = 1, ir
-     j = rkind_numbers(i)
-     WRITE(*, "("" CALL r"", i2.2,""()"")") j
-  ENDDO
-  WRITE(*,*) "END PROGRAM H5test_kind_STORAGE_SIZE"
-
-END PROGRAM test_kind
-
-
-
diff --git a/fortran/src/HDF5.F90 b/fortran/src/HDF5.F90
new file mode 100644
index 0000000..64f5be6
--- /dev/null
+++ b/fortran/src/HDF5.F90
@@ -0,0 +1,46 @@
+!****h* ROBODoc/HDF5
+!
+! NAME
+!  MODULE HDF5
+!
+! FILE
+!  src/fortran/src/HDF5.f90
+!
+! PURPOSE
+!  This is the main module used for linking to the Fortran HDF library.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+!*****
+MODULE HDF5
+  USE H5GLOBAL
+  USE H5F
+  USE H5G
+  USE H5E
+  USE H5I
+  USE H5L
+  USE H5S
+  USE H5D
+  USE H5A
+  USE H5T
+  USE H5O
+  USE H5P
+  USE H5R
+  USE H5Z
+  USE H5_gen
+  USE H5LIB
+END MODULE HDF5
diff --git a/fortran/src/HDF5.f90 b/fortran/src/HDF5.f90
deleted file mode 100644
index 75af333..0000000
--- a/fortran/src/HDF5.f90
+++ /dev/null
@@ -1,56 +0,0 @@
-!****h* ROBODoc/HDF5
-!
-! NAME
-!  MODULE HDF5
-!
-! FILE
-!  src/fortran/src/HDF5.f90
-!
-! PURPOSE
-!  This is the main module used for linking to the Fortran HDF library.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!*****
-
-MODULE HDF5
-  USE H5GLOBAL
-  USE H5F
-  USE H5F_PROVISIONAL
-  USE H5G
-  USE H5E
-  USE H5E_PROVISIONAL
-  USE H5I
-  USE H5L
-  USE H5L_PROVISIONAL
-  USE H5S
-  USE H5D
-  USE H5D_PROVISIONAL
-  USE H5A
-  USE H5A_PROVISIONAL
-  USE H5T
-  USE H5T_PROVISIONAL
-  USE H5O
-  USE H5O_PROVISIONAL
-  USE H5P
-  USE H5P_PROVISIONAL
-  USE H5R
-  USE H5R_PROVISIONAL
-  USE H5Z
-  USE H5_DBLE_INTERFACE
-  USE H5LIB
-END MODULE HDF5
diff --git a/fortran/src/HDF5mpio.f90 b/fortran/src/HDF5mpio.f90
deleted file mode 100644
index b8fb645..0000000
--- a/fortran/src/HDF5mpio.f90
+++ /dev/null
@@ -1,55 +0,0 @@
-!****h* ROBODoc/HDF5 (mpio)
-!
-! NAME
-!  HDF5
-!
-! PURPOSE
-!  This is the main module used for linking to the Fortran parallel HDF library.
-!  This file replaces HDF5.f90 when compiling the parallel library.
-!
-! COPYRIGHT
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!  Copyright by The HDF Group.                                                 *
-!  Copyright by the Board of Trustees of the University of Illinois.           *
-!  All rights reserved.                                                        *
-!                                                                              *
-!  This file is part of HDF5.  The full HDF5 copyright notice, including       *
-!  terms governing use, modification, and redistribution, is contained in      *
-!  the files COPYING and Copyright.html.  COPYING can be found at the root     *
-!  of the source code distribution tree; Copyright.html can be found at the    *
-!  root level of an installed copy of the electronic HDF5 document set and     *
-!  is linked from the top-level documents page.  It can also be found at       *
-!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have            *
-!  access to either file, you may request a copy from help at hdfgroup.org.       *
-!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!*****
-
-MODULE HDF5
-  USE H5GLOBAL
-  USE H5F
-  USE H5F_PROVISIONAL
-  USE H5G
-  USE H5E
-  USE H5E_PROVISIONAL
-  USE H5I
-  USE H5L
-  USE H5L_PROVISIONAL
-  USE H5S
-  USE H5D
-  USE H5D_PROVISIONAL
-  USE H5A
-  USE H5A_PROVISIONAL
-  USE H5T
-  USE H5T_PROVISIONAL
-  USE H5O
-  USE H5O_PROVISIONAL
-  USE H5P
-  USE H5P_PROVISIONAL
-  USE H5FDMPIO
-  USE H5R
-  USE H5R_PROVISIONAL
-  USE H5Z
-  USE H5_DBLE_INTERFACE
-  USE H5LIB
-END MODULE HDF5
diff --git a/fortran/src/Makefile.am b/fortran/src/Makefile.am
index b199bce..eb45f60 100644
--- a/fortran/src/Makefile.am
+++ b/fortran/src/Makefile.am
@@ -32,7 +32,7 @@ AM_FCLIBS=$(LIBHDF5)
 lib_LTLIBRARIES=libhdf5_fortran.la
 
 # Add libtool numbers to the HDF5 Fortran library (from config/lt_vers.am)
-libhdf5_fortran_la_LDFLAGS= -version-info $(LT_F_VERS_INTERFACE):$(LT_F_VERS_REVISION):$(LT_F_VERS_AGE) $(AM_LDFLAGS)
+libhdf5_fortran_la_LDFLAGS= -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
 
 # Some Fortran compilers can't build shared libraries, so sometimes we
 # want to build a shared C library and a static Fortran library.  If so,
@@ -42,42 +42,13 @@ else
    AM_LDFLAGS+=-static
 endif
 
-# Include HDF5.f90 if parallel is disabled, HDF5mpiof*  if parallel is enabled
-if BUILD_PARALLEL_CONDITIONAL
-   PARALLEL_COND_SRC = H5FDmpiof.c HDF5mpio.f90 H5FDmpioff.f90
-else
-   PARALLEL_COND_SRC = HDF5.f90
-endif
-
-# Check if the compiler supports the Fortran 2003 standard
-# which should include the intrinsic module iso_c_binding
-if FORTRAN_2003_CONDITIONAL_F
-   F_STATUS = _F03
-else
-   F_STATUS = _F90
-endif
-
-#   Condition for including/excluding the DBLE interfaces for when the 
-#   default REAL is of type DOUBLE PRECISION.
-#   We do not include the double precision interfaces if the defaut REAL is
-#   DOUBLE PRECISION since this would lead to a non-unique conflict with the
-#   generic interfaces declared as REAL.
-if FORTRAN_DEFAULT_REALisDBLE_F
-   F_DBLE = Exclude
-else
-   F_DBLE = Include
-endif
-
 # Source files for the library.
-libhdf5_fortran_la_SOURCES=H5f90global.f90 \
-          H5fortran_types.f90 H5_ff$(F_STATUS).f90 H5_ff.f90 H5Aff.f90 H5Dff.f90 H5Eff.f90    \
-          H5Fff.f90 H5Gff.f90 H5Iff.f90 H5Lff.f90 H5Off.f90 H5Pff.f90 H5Rff.f90 H5Sff.f90    \
-          H5Tff.f90 H5Zff.f90                                            \
-	  H5_DBLE_Interface$(F_DBLE).f90 \
+libhdf5_fortran_la_SOURCES=H5f90global.F90 \
+          H5fortran_types.F90 H5_ff.F90 H5Aff.F90 H5Dff.F90 H5Eff.F90    \
+          H5Fff.F90 H5Gff.F90 H5Iff.F90 H5Lff.F90 H5Off.F90 H5Pff.F90 H5Rff.F90 H5Sff.F90    \
+          H5Tff.F90 H5Zff.F90 H5_gen.f90 \
           H5f90kit.c H5_f.c H5Af.c H5Df.c H5Ef.c H5Ff.c H5Gf.c           \
-          H5If.c H5Lf.c H5Of.c H5Pf.c H5Rf.c H5Sf.c H5Tf.c H5Zf.c        \
-	  H5Aff$(F_STATUS).f90 H5Dff$(F_STATUS).f90 H5Eff$(F_STATUS).f90 H5Fff$(F_STATUS).f90 H5Lff$(F_STATUS).f90 \
-	  H5Off$(F_STATUS).f90 H5Pff$(F_STATUS).f90 H5Rff$(F_STATUS).f90 H5Tff$(F_STATUS).f90 $(PARALLEL_COND_SRC)
+          H5If.c H5Lf.c H5Of.c H5Pf.c H5Rf.c H5Sf.c H5Tf.c H5Zf.c HDF5.f90
 
 # HDF5 Fortran library depends on HDF5 Library. 
 libhdf5_fortran_la_LIBADD=$(LIBHDF5)
@@ -86,11 +57,9 @@ libhdf5_fortran_la_LIBADD=$(LIBHDF5)
 # Remove it only when distclean.
 DISTCLEANFILES=h5fc
 
-# H5fortran_types.f90 and H5f90i.h are automatically generaed by
-# H5match_types, and must be cleaned explicitly.  H5fort_type_defines.h
-# is generated by H5fortran_detect
-MOSTLYCLEANFILES=H5fortran_types.f90 H5f90i_gen.h H5fort_type_defines.h \
-         H5fortran_detect.f90
+# H5fortran_types.F90 and H5f90i.h are automatically generaed by
+# H5match_types, and must be cleaned explicitly.
+MOSTLYCLEANFILES=H5fortran_types.F90 H5f90i_gen.h
 
 # Fortran module files can have different extensions and different names
 # (e.g., different capitalizations) on different platforms.  Write rules
@@ -136,55 +105,35 @@ endif
 # programs.
 # It's a bit tricky to make sure that Automake builds things in the right
 # order (especially when using 'gmake -j ...')
-# H5test_kind is compiled and run to produce H5fortran_detect.f90.
-# H5fortran_detect is compiled and run to produce H5fort_type_defines.h.
-# H5match_types.c then includes this file and can be compiled into
+# H5_buildiface is compiled and run to produce H5_gen.F90.
+# H5match_types.c then includes H5fort_type_defines.h and can be compiled into
 # H5match_types.  When H5match_types is run, it creates H5f90i_gen.h
-# and H5fortran_types.f90, which are included in the Fortran library.
+# and H5fortran_types.F90, which are included in the Fortran library.
 
 # These are the helper programs we need to build.
-noinst_PROGRAMS = H5match_types H5fortran_detect H5test_kind
+noinst_PROGRAMS = H5match_types H5_buildiface
 
 # Tell Automake to create H5f90i_gen.h before it builds the library
 # sources.  When it creates H5f90i_gen.h, it will create
-# H5fortran_types.f90 as a side effect.
+# H5fortran_types.F90 as a side effect.
 BUILT_SOURCES = H5f90i_gen.h
 
 #Specify what Automake needs to create: first the H5fort_type_defines.h
 # header, then H5match_types which includes that header, then
 # it needs to run H5match_types.
-H5fortran_types.f90 H5f90i_gen.h: H5match_types$(EXEEXT)
+H5fortran_types.F90 H5f90i_gen.h: H5match_types$(EXEEXT)
 	$(RUNSERIAL) ./H5match_types$(EXEEXT)
 
-# H5fort_type_defines.h is created by running H5fortran_detect.
-# Obviously, H5fortran_detect needs to be built first.
-H5fort_type_defines.h: H5fortran_detect$(EXEEXT)
-	$(RUNSERIAL) ./H5fortran_detect$(EXEEXT) > H5fort_type_defines.h
-
-H5match_types.$(OBJEXT): H5fort_type_defines.h
-
-# Automake knows how to build fortran programs if we tell it the source
-# files.
-H5fortran_detect_SOURCES = H5fortran_detect.f90
+# H5_buildiface.F90 generates all the APIs that have a KIND type associated
+# with them.
 
-# H5test_kind.f90 generates H5Fortran_detect.f90 depending on if 
-# intrinsic function SIZEOF is available.
+H5_gen.F90: H5_buildiface$(EXEEXT)
+	$(RUNSERIAL) ./H5_buildiface$(EXEEXT)
 
-H5fortran_detect.f90: H5test_kind$(EXEEXT)
-	$(RUNSERIAL) ./H5test_kind$(EXEEXT) > H5fortran_detect.f90
-
-# H5test_kind.f90 is included in the distribution, and Automake knows
+# H5_buildiface.F90 is included in the distribution, and Automake knows
 # how to compile a fortran program given its sources.
 
-if FORTRAN_HAVE_STORAGE_SIZE
-  H5test_kind_SOURCES = H5test_kind_STORAGE_SIZE.f90
-else 
-if FORTRAN_HAVE_SIZEOF
-  H5test_kind_SOURCES = H5test_kind_SIZEOF.f90
-else
-  H5test_kind_SOURCES = H5test_kind.f90
-endif
-endif
+H5_buildiface_SOURCES = H5_buildiface.F90
 
 # Mark this directory as part of the Fortran API
 FORTRAN_API=yes
@@ -193,51 +142,28 @@ FORTRAN_API=yes
 # determining this automagically (like we do with the C files). So, when
 # doing a parallel make, some modules could be made way before the
 # modules they depend upon are actually made. *sigh*
-H5f90global.lo:      $(srcdir)/H5f90global.f90 H5fortran_types.lo
-H5fortran_types.lo:  H5fortran_types.f90
-H5fortran_detect.lo: H5fortran_detect.f90
-H5test_kind.lo:      $(srcdir)/H5test_kind.f90
-H5test_kind_SIZEOF.lo: $(srcdir)/H5test_kind_SIZEOF.f90
-H5_ff$(F_STATUS).lo: $(srcdir)/H5_ff$(F_STATUS).f90 H5f90global.lo
-H5_ff.lo:            $(srcdir)/H5_ff.f90 H5f90global.lo H5_ff$(F_STATUS).lo
-H5Aff.lo:            $(srcdir)/H5Aff.f90 H5f90global.lo
-H5Dff.lo:            $(srcdir)/H5Dff.f90 H5f90global.lo
-H5Aff$(F_STATUS).lo:  $(srcdir)/H5Aff$(F_STATUS).f90 H5f90global.lo
-H5Dff$(F_STATUS).lo:  $(srcdir)/H5Dff$(F_STATUS).f90 H5f90global.lo
-H5Eff$(F_STATUS).lo:  $(srcdir)/H5Eff$(F_STATUS).f90 H5f90global.lo
-H5Fff$(F_STATUS).lo:  $(srcdir)/H5Fff$(F_STATUS).f90 H5f90global.lo
-H5Lff$(F_STATUS).lo:  $(srcdir)/H5Lff$(F_STATUS).f90 H5f90global.lo
-H5Off$(F_STATUS).lo:  $(srcdir)/H5Off$(F_STATUS).f90 H5f90global.lo
-H5Pff$(F_STATUS).lo:  $(srcdir)/H5Pff$(F_STATUS).f90 H5f90global.lo
-H5Rff$(F_STATUS).lo:  $(srcdir)/H5Rff$(F_STATUS).f90 H5f90global.lo
-H5Tff$(F_STATUS).lo:  $(srcdir)/H5Tff$(F_STATUS).f90 H5f90global.lo
-H5Eff.lo:            $(srcdir)/H5Eff.f90 H5f90global.lo
-H5Fff.lo:            $(srcdir)/H5Fff.f90 H5f90global.lo
-H5Gff.lo:            $(srcdir)/H5Gff.f90 H5f90global.lo
-H5Iff.lo:            $(srcdir)/H5Iff.f90 H5f90global.lo
-H5Lff.lo:            $(srcdir)/H5Lff.f90 H5f90global.lo
-H5Off.lo:            $(srcdir)/H5Off.f90 H5f90global.lo
-H5Pff.lo:            $(srcdir)/H5Pff.f90 H5f90global.lo
-H5Rff.lo:            $(srcdir)/H5Rff.f90 H5f90global.lo
-H5Sff.lo:            $(srcdir)/H5Sff.f90 H5f90global.lo
-H5Tff.lo:            $(srcdir)/H5Tff.f90 H5f90global.lo
-H5Zff.lo:            $(srcdir)/H5Zff.f90 H5f90global.lo
-H5_DBLE_Interface$(F_DBLE).lo:  $(srcdir)/H5_DBLE_Interface$(F_DBLE).f90 H5Aff$(F_STATUS).lo H5Dff$(F_STATUS).lo H5Fff$(F_STATUS).lo H5Eff$(F_STATUS).lo H5Pff$(F_STATUS).lo
-HDF5.lo:             $(srcdir)/HDF5.f90 H5f90global.lo H5_ff$(F_STATUS).lo H5_ff.lo H5Aff.lo H5Aff$(F_STATUS).lo \
-                     H5Dff.lo H5Dff$(F_STATUS).lo  \
-                     H5Eff.lo H5Eff$(F_STATUS).lo \
-		     H5Fff.lo H5Fff$(F_STATUS).lo H5Gff.lo H5Iff.lo H5Lff.lo H5Lff$(F_STATUS).lo \
-	             H5Off.lo H5Off$(F_STATUS).lo H5Pff.lo H5Pff$(F_STATUS).lo H5Rff$(F_STATUS).lo H5Rff.lo \
-                     H5Sff.lo H5Tff.lo H5Tff$(F_STATUS).lo H5Zff.lo \
-                     H5_DBLE_Interface$(F_DBLE).lo 
-H5FDmpioff.lo:       $(srcdir)/H5FDmpioff.f90 H5f90global.lo
-HDF5mpio.lo:         $(srcdir)/H5FDmpioff.f90 H5f90global.lo H5_ff$(F_STATUS).lo H5_ff.lo \
-		     H5Aff.lo H5Aff$(F_STATUS).lo \
-                     H5Dff.lo H5Dff$(F_STATUS).lo \
-		     H5Eff.lo H5Eff$(F_STATUS).lo \
-                     H5Fff.lo H5Fff$(F_STATUS).lo H5Gff.lo H5Iff.lo H5Lff.lo H5Lff$(F_STATUS).lo \
-		     H5Off.lo H5Off$(F_STATUS).lo H5Pff.lo H5Pff$(F_STATUS).lo H5Rff$(F_STATUS).lo H5Rff.lo \
-                     H5Sff.lo H5Tff.lo H5Tff$(F_STATUS).lo H5Zff.lo \
-	             H5_DBLE_Interface$(F_DBLE).lo H5FDmpioff.lo
-
-include $(top_srcdir)/config/conclude.am
+H5f90global.lo:      $(srcdir)/H5f90global.F90 H5fortran_types.lo
+H5_buildiface.lo:    $(srcdir)/H5_buildiface.F90
+H5_ff.lo:            $(srcdir)/H5_ff.F90 H5f90global.lo
+H5Aff.lo:            $(srcdir)/H5Aff.F90 H5f90global.lo
+H5Dff.lo:            $(srcdir)/H5Dff.F90 H5f90global.lo
+H5Eff.lo:            $(srcdir)/H5Eff.F90 H5f90global.lo
+H5Fff.lo:            $(srcdir)/H5Fff.F90 H5f90global.lo
+H5Gff.lo:            $(srcdir)/H5Gff.F90 H5f90global.lo
+H5Iff.lo:            $(srcdir)/H5Iff.F90 H5f90global.lo
+H5Lff.lo:            $(srcdir)/H5Lff.F90 H5f90global.lo
+H5Off.lo:            $(srcdir)/H5Off.F90 H5f90global.lo
+H5Pff.lo:            $(srcdir)/H5Pff.F90 H5f90global.lo
+H5Rff.lo:            $(srcdir)/H5Rff.F90 H5f90global.lo
+H5Sff.lo:            $(srcdir)/H5Sff.F90 H5f90global.lo
+H5Tff.lo:            $(srcdir)/H5Tff.F90 H5f90global.lo
+H5Zff.lo:            $(srcdir)/H5Zff.F90 H5f90global.lo
+H5_gen.lo:           H5_gen.F90 H5f90global.lo H5Aff.lo H5Dff.lo H5Pff.lo
+HDF5.lo:             $(srcdir)/HDF5.F90 H5f90global.lo H5_ff.lo H5Aff.lo  \
+                     H5Dff.lo \
+                     H5Eff.lo \
+		     H5Fff.lo H5Gff.lo H5Iff.lo H5Lff.lo \
+	             H5Off.lo H5Pff.lo H5Rff.lo \
+                     H5Sff.lo H5Tff.lo H5Zff.lo H5_gen.lo
+
+include $(top_srcdir)/config/conclude_fc.am
diff --git a/fortran/src/Makefile.in b/fortran/src/Makefile.in
index 789762b..69567f3 100644
--- a/fortran/src/Makefile.in
+++ b/fortran/src/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -31,9 +31,23 @@
 # HDF5 Fortran Library Makefile(.in)
 #
 
+# Makefile.am include fragment with Fortran helper rules and macros.
+
+# AM_FCCPPFLAGS, FCCPPFLAGS are currently not used.
+
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -96,29 +110,26 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/lt_vers.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/h5fc.in $(top_srcdir)/bin/depcomp \
-	$(top_srcdir)/bin/test-driver README
 
 # Some Fortran compilers can't build shared libraries, so sometimes we
 # want to build a shared C library and a static Fortran library.  If so,
 # pass the -static flag to the library linker.
 @FORTRAN_SHARED_CONDITIONAL_FALSE at am__append_1 = -static
-noinst_PROGRAMS = H5match_types$(EXEEXT) H5fortran_detect$(EXEEXT) \
-	H5test_kind$(EXEEXT)
+noinst_PROGRAMS = H5match_types$(EXEEXT) H5_buildiface$(EXEEXT)
 TESTS =
 subdir = fortran/src
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
-CONFIG_CLEAN_FILES = h5fc
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h H5config_f.inc
+CONFIG_CLEAN_FILES = h5fc H5fort_type_defines.h
 CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
@@ -150,30 +161,12 @@ am__uninstall_files_from_dir = { \
 am__installdirs = "$(DESTDIR)$(libdir)"
 LTLIBRARIES = $(lib_LTLIBRARIES)
 libhdf5_fortran_la_DEPENDENCIES = $(LIBHDF5)
-am__libhdf5_fortran_la_SOURCES_DIST = H5f90global.f90 \
-	H5fortran_types.f90 H5_ff$(F_STATUS).f90 H5_ff.f90 H5Aff.f90 \
-	H5Dff.f90 H5Eff.f90 H5Fff.f90 H5Gff.f90 H5Iff.f90 H5Lff.f90 \
-	H5Off.f90 H5Pff.f90 H5Rff.f90 H5Sff.f90 H5Tff.f90 H5Zff.f90 \
-	H5_DBLE_Interface$(F_DBLE).f90 H5f90kit.c H5_f.c H5Af.c H5Df.c \
-	H5Ef.c H5Ff.c H5Gf.c H5If.c H5Lf.c H5Of.c H5Pf.c H5Rf.c H5Sf.c \
-	H5Tf.c H5Zf.c H5Aff$(F_STATUS).f90 H5Dff$(F_STATUS).f90 \
-	H5Eff$(F_STATUS).f90 H5Fff$(F_STATUS).f90 H5Lff$(F_STATUS).f90 \
-	H5Off$(F_STATUS).f90 H5Pff$(F_STATUS).f90 H5Rff$(F_STATUS).f90 \
-	H5Tff$(F_STATUS).f90 HDF5.f90 H5FDmpiof.c HDF5mpio.f90 \
-	H5FDmpioff.f90
- at BUILD_PARALLEL_CONDITIONAL_FALSE@am__objects_1 = HDF5.lo
- at BUILD_PARALLEL_CONDITIONAL_TRUE@am__objects_1 = H5FDmpiof.lo \
- at BUILD_PARALLEL_CONDITIONAL_TRUE@	HDF5mpio.lo H5FDmpioff.lo
 am_libhdf5_fortran_la_OBJECTS = H5f90global.lo H5fortran_types.lo \
-	H5_ff$(F_STATUS).lo H5_ff.lo H5Aff.lo H5Dff.lo H5Eff.lo \
-	H5Fff.lo H5Gff.lo H5Iff.lo H5Lff.lo H5Off.lo H5Pff.lo H5Rff.lo \
-	H5Sff.lo H5Tff.lo H5Zff.lo H5_DBLE_Interface$(F_DBLE).lo \
-	H5f90kit.lo H5_f.lo H5Af.lo H5Df.lo H5Ef.lo H5Ff.lo H5Gf.lo \
-	H5If.lo H5Lf.lo H5Of.lo H5Pf.lo H5Rf.lo H5Sf.lo H5Tf.lo \
-	H5Zf.lo H5Aff$(F_STATUS).lo H5Dff$(F_STATUS).lo \
-	H5Eff$(F_STATUS).lo H5Fff$(F_STATUS).lo H5Lff$(F_STATUS).lo \
-	H5Off$(F_STATUS).lo H5Pff$(F_STATUS).lo H5Rff$(F_STATUS).lo \
-	H5Tff$(F_STATUS).lo $(am__objects_1)
+	H5_ff.lo H5Aff.lo H5Dff.lo H5Eff.lo H5Fff.lo H5Gff.lo H5Iff.lo \
+	H5Lff.lo H5Off.lo H5Pff.lo H5Rff.lo H5Sff.lo H5Tff.lo H5Zff.lo \
+	H5_gen.lo H5f90kit.lo H5_f.lo H5Af.lo H5Df.lo H5Ef.lo H5Ff.lo \
+	H5Gf.lo H5If.lo H5Lf.lo H5Of.lo H5Pf.lo H5Rf.lo H5Sf.lo \
+	H5Tf.lo H5Zf.lo HDF5.lo
 libhdf5_fortran_la_OBJECTS = $(am_libhdf5_fortran_la_OBJECTS)
 AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
@@ -184,19 +177,12 @@ libhdf5_fortran_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC \
 	$(AM_FCFLAGS) $(FCFLAGS) $(libhdf5_fortran_la_LDFLAGS) \
 	$(LDFLAGS) -o $@
 PROGRAMS = $(noinst_PROGRAMS)
-am_H5fortran_detect_OBJECTS = H5fortran_detect.$(OBJEXT)
-H5fortran_detect_OBJECTS = $(am_H5fortran_detect_OBJECTS)
-H5fortran_detect_LDADD = $(LDADD)
+am_H5_buildiface_OBJECTS = H5_buildiface.$(OBJEXT)
+H5_buildiface_OBJECTS = $(am_H5_buildiface_OBJECTS)
+H5_buildiface_LDADD = $(LDADD)
 H5match_types_SOURCES = H5match_types.c
 H5match_types_OBJECTS = H5match_types.$(OBJEXT)
 H5match_types_LDADD = $(LDADD)
-am__H5test_kind_SOURCES_DIST = H5test_kind.f90 H5test_kind_SIZEOF.f90 \
-	H5test_kind_STORAGE_SIZE.f90
- at FORTRAN_HAVE_SIZEOF_FALSE@@FORTRAN_HAVE_STORAGE_SIZE_FALSE at am_H5test_kind_OBJECTS = H5test_kind.$(OBJEXT)
- at FORTRAN_HAVE_SIZEOF_TRUE@@FORTRAN_HAVE_STORAGE_SIZE_FALSE at am_H5test_kind_OBJECTS = H5test_kind_SIZEOF.$(OBJEXT)
- at FORTRAN_HAVE_STORAGE_SIZE_TRUE@am_H5test_kind_OBJECTS = H5test_kind_STORAGE_SIZE.$(OBJEXT)
-H5test_kind_OBJECTS = $(am_H5test_kind_OBJECTS)
-H5test_kind_LDADD = $(LDADD)
 AM_V_P = $(am__v_P_ at AM_V@)
 am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -213,6 +199,18 @@ DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
+AM_V_PPFC = $(am__v_PPFC_ at AM_V@)
+am__v_PPFC_ = $(am__v_PPFC_ at AM_DEFAULT_V@)
+am__v_PPFC_0 = @echo "  PPFC    " $@;
+am__v_PPFC_1 = 
+FCLD = $(FC)
+FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_FCLD = $(am__v_FCLD_ at AM_V@)
+am__v_FCLD_ = $(am__v_FCLD_ at AM_DEFAULT_V@)
+am__v_FCLD_0 = @echo "  FCLD    " $@;
+am__v_FCLD_1 = 
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
@@ -238,25 +236,17 @@ AM_V_FC = $(am__v_FC_ at AM_V@)
 am__v_FC_ = $(am__v_FC_ at AM_DEFAULT_V@)
 am__v_FC_0 = @echo "  FC      " $@;
 am__v_FC_1 = 
-FCLD = $(FC)
-FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_FCLD = $(am__v_FCLD_ at AM_V@)
-am__v_FCLD_ = $(am__v_FCLD_ at AM_DEFAULT_V@)
-am__v_FCLD_0 = @echo "  FCLD    " $@;
-am__v_FCLD_1 = 
-SOURCES = $(libhdf5_fortran_la_SOURCES) $(H5fortran_detect_SOURCES) \
-	H5match_types.c $(H5test_kind_SOURCES)
-DIST_SOURCES = $(am__libhdf5_fortran_la_SOURCES_DIST) \
-	$(H5fortran_detect_SOURCES) H5match_types.c \
-	$(am__H5test_kind_SOURCES_DIST)
+SOURCES = $(libhdf5_fortran_la_SOURCES) $(H5_buildiface_SOURCES) \
+	H5match_types.c
+DIST_SOURCES = $(libhdf5_fortran_la_SOURCES) $(H5_buildiface_SOURCES) \
+	H5match_types.c
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
-am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
+	$(LISP)H5config_f.inc.in
 # Read a list of newline-separated strings from the standard input,
 # and print each of them once, without duplicates.  Input order is
 # *not* preserved.
@@ -448,6 +438,13 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/H5config_f.inc.in \
+	$(srcdir)/H5fort_type_defines.h.in $(srcdir)/Makefile.in \
+	$(srcdir)/h5fc.in $(top_srcdir)/bin/depcomp \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am \
+	$(top_srcdir)/config/conclude_fc.am \
+	$(top_srcdir)/config/lt_vers.am README
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -468,7 +465,6 @@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@ -I$(top_srcdir)/src \
 	-I$(top_srcdir)/fortran/src
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@ $(am__append_1)
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -513,14 +509,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -530,13 +534,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -578,9 +581,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -723,62 +737,24 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2
 # See libtool versioning documentation online.
 # After making changes, run bin/reconfigure to update other configure related
 # files like Makefile.in.
-LT_VERS_INTERFACE = 11
-LT_VERS_REVISION = 0
-LT_VERS_AGE = 1
-LT_CXX_VERS_INTERFACE = 11
-LT_CXX_VERS_REVISION = 0
-LT_CXX_VERS_AGE = 0
-LT_F_VERS_INTERFACE = 10
-LT_F_VERS_REVISION = 2
-LT_F_VERS_AGE = 0
-LT_HL_VERS_INTERFACE = 10
-LT_HL_VERS_REVISION = 2
-LT_HL_VERS_AGE = 0
-LT_HL_CXX_VERS_INTERFACE = 11
-LT_HL_CXX_VERS_REVISION = 0
-LT_HL_CXX_VERS_AGE = 0
-LT_HL_F_VERS_INTERFACE = 10
-LT_HL_F_VERS_REVISION = 2
-LT_HL_F_VERS_AGE = 0
-LT_TOOLS_VERS_INTERFACE = 10
-LT_TOOLS_VERS_REVISION = 2
-LT_TOOLS_VERS_AGE = 0
+LT_VERS_INTERFACE = 100
+LT_VERS_REVISION = 900
+LT_VERS_AGE = 0
 AM_FCLIBS = $(LIBHDF5)
 
 # This is our main target, the fortran library
 lib_LTLIBRARIES = libhdf5_fortran.la
 
 # Add libtool numbers to the HDF5 Fortran library (from config/lt_vers.am)
-libhdf5_fortran_la_LDFLAGS = -version-info $(LT_F_VERS_INTERFACE):$(LT_F_VERS_REVISION):$(LT_F_VERS_AGE) $(AM_LDFLAGS)
- at BUILD_PARALLEL_CONDITIONAL_FALSE@PARALLEL_COND_SRC = HDF5.f90
-
-# Include HDF5.f90 if parallel is disabled, HDF5mpiof*  if parallel is enabled
- at BUILD_PARALLEL_CONDITIONAL_TRUE@PARALLEL_COND_SRC = H5FDmpiof.c HDF5mpio.f90 H5FDmpioff.f90
- at FORTRAN_2003_CONDITIONAL_F_FALSE@F_STATUS = _F90
-
-# Check if the compiler supports the Fortran 2003 standard
-# which should include the intrinsic module iso_c_binding
- at FORTRAN_2003_CONDITIONAL_F_TRUE@F_STATUS = _F03
- at FORTRAN_DEFAULT_REALisDBLE_F_FALSE@F_DBLE = Include
-
-#   Condition for including/excluding the DBLE interfaces for when the 
-#   default REAL is of type DOUBLE PRECISION.
-#   We do not include the double precision interfaces if the defaut REAL is
-#   DOUBLE PRECISION since this would lead to a non-unique conflict with the
-#   generic interfaces declared as REAL.
- at FORTRAN_DEFAULT_REALisDBLE_F_TRUE@F_DBLE = Exclude
+libhdf5_fortran_la_LDFLAGS = -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
 
 # Source files for the library.
-libhdf5_fortran_la_SOURCES = H5f90global.f90 \
-          H5fortran_types.f90 H5_ff$(F_STATUS).f90 H5_ff.f90 H5Aff.f90 H5Dff.f90 H5Eff.f90    \
-          H5Fff.f90 H5Gff.f90 H5Iff.f90 H5Lff.f90 H5Off.f90 H5Pff.f90 H5Rff.f90 H5Sff.f90    \
-          H5Tff.f90 H5Zff.f90                                            \
-	  H5_DBLE_Interface$(F_DBLE).f90 \
+libhdf5_fortran_la_SOURCES = H5f90global.F90 \
+          H5fortran_types.F90 H5_ff.F90 H5Aff.F90 H5Dff.F90 H5Eff.F90    \
+          H5Fff.F90 H5Gff.F90 H5Iff.F90 H5Lff.F90 H5Off.F90 H5Pff.F90 H5Rff.F90 H5Sff.F90    \
+          H5Tff.F90 H5Zff.F90 H5_gen.f90 \
           H5f90kit.c H5_f.c H5Af.c H5Df.c H5Ef.c H5Ff.c H5Gf.c           \
-          H5If.c H5Lf.c H5Of.c H5Pf.c H5Rf.c H5Sf.c H5Tf.c H5Zf.c        \
-	  H5Aff$(F_STATUS).f90 H5Dff$(F_STATUS).f90 H5Eff$(F_STATUS).f90 H5Fff$(F_STATUS).f90 H5Lff$(F_STATUS).f90 \
-	  H5Off$(F_STATUS).f90 H5Pff$(F_STATUS).f90 H5Rff$(F_STATUS).f90 H5Tff$(F_STATUS).f90 $(PARALLEL_COND_SRC)
+          H5If.c H5Lf.c H5Of.c H5Pf.c H5Rf.c H5Sf.c H5Tf.c H5Zf.c HDF5.f90
 
 
 # HDF5 Fortran library depends on HDF5 Library. 
@@ -788,12 +764,9 @@ libhdf5_fortran_la_LIBADD = $(LIBHDF5)
 # Remove it only when distclean.
 DISTCLEANFILES = h5fc
 
-# H5fortran_types.f90 and H5f90i.h are automatically generaed by
-# H5match_types, and must be cleaned explicitly.  H5fort_type_defines.h
-# is generated by H5fortran_detect
-MOSTLYCLEANFILES = H5fortran_types.f90 H5f90i_gen.h H5fort_type_defines.h \
-         H5fortran_detect.f90
-
+# H5fortran_types.F90 and H5f90i.h are automatically generaed by
+# H5match_types, and must be cleaned explicitly.
+MOSTLYCLEANFILES = H5fortran_types.F90 H5f90i_gen.h
 @BUILD_PARALLEL_CONDITIONAL_FALSE at H5FC_NAME = h5fc
 
 # Custom rule for installing h5fc, since it will be named h5pfc if hdf5
@@ -802,21 +775,17 @@ MOSTLYCLEANFILES = H5fortran_types.f90 H5f90i_gen.h H5fort_type_defines.h \
 
 # Tell Automake to create H5f90i_gen.h before it builds the library
 # sources.  When it creates H5f90i_gen.h, it will create
-# H5fortran_types.f90 as a side effect.
+# H5fortran_types.F90 as a side effect.
 BUILT_SOURCES = H5f90i_gen.h
 
-# Automake knows how to build fortran programs if we tell it the source
-# files.
-H5fortran_detect_SOURCES = H5fortran_detect.f90
- at FORTRAN_HAVE_SIZEOF_FALSE@@FORTRAN_HAVE_STORAGE_SIZE_FALSE at H5test_kind_SOURCES = H5test_kind.f90
- at FORTRAN_HAVE_SIZEOF_TRUE@@FORTRAN_HAVE_STORAGE_SIZE_FALSE at H5test_kind_SOURCES = H5test_kind_SIZEOF.f90
-
-# H5test_kind.f90 is included in the distribution, and Automake knows
+# H5_buildiface.F90 is included in the distribution, and Automake knows
 # how to compile a fortran program given its sources.
- at FORTRAN_HAVE_STORAGE_SIZE_TRUE@H5test_kind_SOURCES = H5test_kind_STORAGE_SIZE.f90
+H5_buildiface_SOURCES = H5_buildiface.F90
 
 # Mark this directory as part of the Fortran API
 FORTRAN_API = yes
+PPFCCOMPILE = $(FC) $(FCDEFS) $(DEFAULT_INCLUDES)  $(FCINCLUDES) $(AM_FCCPPFLAGS) $(FCCPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)
+LTPPFCCOMPILE = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(PPFCCOMPILE)
 
 # Automake needs to be taught how to build lib, progs, and tests targets.
 # These will be filled in automatically for the most part (e.g.,
@@ -837,12 +806,12 @@ TEST_PROG_CHKEXE = $(TEST_PROG:=.chkexe_)
 TEST_PROG_PARA_CHKEXE = $(TEST_PROG_PARA:=.chkexe_)
 TEST_SCRIPT_CHKSH = $(TEST_SCRIPT:=.chkexe_)
 TEST_SCRIPT_PARA_CHKSH = $(TEST_SCRIPT_PARA:=.chkexe_)
-all: $(BUILT_SOURCES)
+all: $(BUILT_SOURCES) H5config_f.inc
 	$(MAKE) $(AM_MAKEFLAGS) all-am
 
 .SUFFIXES:
-.SUFFIXES: .c .f90 .lo .log .o .obj .sh .sh$(EXEEXT) .trs
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/lt_vers.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
+.SUFFIXES: .F90 .c .f90 .lo .log .o .obj .sh .sh$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/lt_vers.am $(top_srcdir)/config/conclude_fc.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
@@ -854,7 +823,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign fortran/src/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign fortran/src/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -863,7 +831,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/lt_vers.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/lt_vers.am $(top_srcdir)/config/conclude_fc.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -873,8 +841,21 @@ $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
 $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
+
+H5config_f.inc: stamp-h2
+	@test -f $@ || rm -f stamp-h2
+	@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h2
+
+stamp-h2: $(srcdir)/H5config_f.inc.in $(top_builddir)/config.status
+	@rm -f stamp-h2
+	cd $(top_builddir) && $(SHELL) ./config.status fortran/src/H5config_f.inc
+
+distclean-hdr:
+	-rm -f H5config_f.inc stamp-h2
 h5fc: $(top_builddir)/config.status $(srcdir)/h5fc.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+H5fort_type_defines.h: $(top_builddir)/config.status $(srcdir)/H5fort_type_defines.h.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 
 install-libLTLIBRARIES: $(lib_LTLIBRARIES)
 	@$(NORMAL_INSTALL)
@@ -923,18 +904,14 @@ clean-noinstPROGRAMS:
 	echo " rm -f" $$list; \
 	rm -f $$list
 
-H5fortran_detect$(EXEEXT): $(H5fortran_detect_OBJECTS) $(H5fortran_detect_DEPENDENCIES) $(EXTRA_H5fortran_detect_DEPENDENCIES) 
-	@rm -f H5fortran_detect$(EXEEXT)
-	$(AM_V_FCLD)$(FCLINK) $(H5fortran_detect_OBJECTS) $(H5fortran_detect_LDADD) $(LIBS)
+H5_buildiface$(EXEEXT): $(H5_buildiface_OBJECTS) $(H5_buildiface_DEPENDENCIES) $(EXTRA_H5_buildiface_DEPENDENCIES) 
+	@rm -f H5_buildiface$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(H5_buildiface_OBJECTS) $(H5_buildiface_LDADD) $(LIBS)
 
 H5match_types$(EXEEXT): $(H5match_types_OBJECTS) $(H5match_types_DEPENDENCIES) $(EXTRA_H5match_types_DEPENDENCIES) 
 	@rm -f H5match_types$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(H5match_types_OBJECTS) $(H5match_types_LDADD) $(LIBS)
 
-H5test_kind$(EXEEXT): $(H5test_kind_OBJECTS) $(H5test_kind_DEPENDENCIES) $(EXTRA_H5test_kind_DEPENDENCIES) 
-	@rm -f H5test_kind$(EXEEXT)
-	$(AM_V_FCLD)$(FCLINK) $(H5test_kind_OBJECTS) $(H5test_kind_LDADD) $(LIBS)
-
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
 
@@ -944,7 +921,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Af.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Df.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Ef.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FDmpiof.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Ff.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Gf.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5If.Plo at am__quote@
@@ -959,6 +935,12 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5f90kit.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5match_types.Po at am__quote@
 
+.F90.obj:
+	$(AM_V_PPFC)$(PPFCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.F90.lo:
+	$(AM_V_PPFC)$(LTPPFCCOMPILE) -c -o $@ $<
+
 .c.o:
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@@ -980,9 +962,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
-.f90.o:
-	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
-
 .f90.obj:
 	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) `$(CYGPATH_W) '$<'`
 
@@ -1077,7 +1056,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1226,7 +1205,7 @@ check-am: all-am
 	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
 check: $(BUILT_SOURCES)
 	$(MAKE) $(AM_MAKEFLAGS) check-am
-all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) all-local
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) H5config_f.inc all-local
 installdirs:
 	for dir in "$(DESTDIR)$(libdir)"; do \
 	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
@@ -1277,7 +1256,7 @@ distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-local distclean-tags
+	distclean-hdr distclean-local distclean-tags
 
 dvi: dvi-am
 
@@ -1346,20 +1325,22 @@ uninstall-am: uninstall-libLTLIBRARIES uninstall-local
 	check-am clean clean-generic clean-libLTLIBRARIES \
 	clean-libtool clean-local clean-noinstPROGRAMS cscopelist-am \
 	ctags ctags-am distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-local distclean-tags distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-data-local install-dvi \
-	install-dvi-am install-exec install-exec-am install-exec-local \
-	install-html install-html-am install-info install-info-am \
-	install-libLTLIBRARIES install-man install-pdf install-pdf-am \
-	install-ps install-ps-am install-strip installcheck \
-	installcheck-am installdirs maintainer-clean \
+	distclean-hdr distclean-libtool distclean-local distclean-tags \
+	distdir dvi dvi-am html html-am info info-am install \
+	install-am install-data install-data-am install-data-local \
+	install-dvi install-dvi-am install-exec install-exec-am \
+	install-exec-local install-html install-html-am install-info \
+	install-info-am install-libLTLIBRARIES install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
 	maintainer-clean-generic maintainer-clean-local mostlyclean \
 	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
 	mostlyclean-local pdf pdf-am ps ps-am recheck tags tags-am \
 	uninstall uninstall-am uninstall-libLTLIBRARIES \
 	uninstall-local
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
@@ -1419,72 +1400,48 @@ install-exec-local:
 #Specify what Automake needs to create: first the H5fort_type_defines.h
 # header, then H5match_types which includes that header, then
 # it needs to run H5match_types.
-H5fortran_types.f90 H5f90i_gen.h: H5match_types$(EXEEXT)
+H5fortran_types.F90 H5f90i_gen.h: H5match_types$(EXEEXT)
 	$(RUNSERIAL) ./H5match_types$(EXEEXT)
 
-# H5fort_type_defines.h is created by running H5fortran_detect.
-# Obviously, H5fortran_detect needs to be built first.
-H5fort_type_defines.h: H5fortran_detect$(EXEEXT)
-	$(RUNSERIAL) ./H5fortran_detect$(EXEEXT) > H5fort_type_defines.h
-
-H5match_types.$(OBJEXT): H5fort_type_defines.h
+# H5_buildiface.F90 generates all the APIs that have a KIND type associated
+# with them.
 
-# H5test_kind.f90 generates H5Fortran_detect.f90 depending on if 
-# intrinsic function SIZEOF is available.
-
-H5fortran_detect.f90: H5test_kind$(EXEEXT)
-	$(RUNSERIAL) ./H5test_kind$(EXEEXT) > H5fortran_detect.f90
+H5_gen.F90: H5_buildiface$(EXEEXT)
+	$(RUNSERIAL) ./H5_buildiface$(EXEEXT)
 
 # Hardcode the dependencies of these files. There isn't a known way of
 # determining this automagically (like we do with the C files). So, when
 # doing a parallel make, some modules could be made way before the
 # modules they depend upon are actually made. *sigh*
-H5f90global.lo:      $(srcdir)/H5f90global.f90 H5fortran_types.lo
-H5fortran_types.lo:  H5fortran_types.f90
-H5fortran_detect.lo: H5fortran_detect.f90
-H5test_kind.lo:      $(srcdir)/H5test_kind.f90
-H5test_kind_SIZEOF.lo: $(srcdir)/H5test_kind_SIZEOF.f90
-H5_ff$(F_STATUS).lo: $(srcdir)/H5_ff$(F_STATUS).f90 H5f90global.lo
-H5_ff.lo:            $(srcdir)/H5_ff.f90 H5f90global.lo H5_ff$(F_STATUS).lo
-H5Aff.lo:            $(srcdir)/H5Aff.f90 H5f90global.lo
-H5Dff.lo:            $(srcdir)/H5Dff.f90 H5f90global.lo
-H5Aff$(F_STATUS).lo:  $(srcdir)/H5Aff$(F_STATUS).f90 H5f90global.lo
-H5Dff$(F_STATUS).lo:  $(srcdir)/H5Dff$(F_STATUS).f90 H5f90global.lo
-H5Eff$(F_STATUS).lo:  $(srcdir)/H5Eff$(F_STATUS).f90 H5f90global.lo
-H5Fff$(F_STATUS).lo:  $(srcdir)/H5Fff$(F_STATUS).f90 H5f90global.lo
-H5Lff$(F_STATUS).lo:  $(srcdir)/H5Lff$(F_STATUS).f90 H5f90global.lo
-H5Off$(F_STATUS).lo:  $(srcdir)/H5Off$(F_STATUS).f90 H5f90global.lo
-H5Pff$(F_STATUS).lo:  $(srcdir)/H5Pff$(F_STATUS).f90 H5f90global.lo
-H5Rff$(F_STATUS).lo:  $(srcdir)/H5Rff$(F_STATUS).f90 H5f90global.lo
-H5Tff$(F_STATUS).lo:  $(srcdir)/H5Tff$(F_STATUS).f90 H5f90global.lo
-H5Eff.lo:            $(srcdir)/H5Eff.f90 H5f90global.lo
-H5Fff.lo:            $(srcdir)/H5Fff.f90 H5f90global.lo
-H5Gff.lo:            $(srcdir)/H5Gff.f90 H5f90global.lo
-H5Iff.lo:            $(srcdir)/H5Iff.f90 H5f90global.lo
-H5Lff.lo:            $(srcdir)/H5Lff.f90 H5f90global.lo
-H5Off.lo:            $(srcdir)/H5Off.f90 H5f90global.lo
-H5Pff.lo:            $(srcdir)/H5Pff.f90 H5f90global.lo
-H5Rff.lo:            $(srcdir)/H5Rff.f90 H5f90global.lo
-H5Sff.lo:            $(srcdir)/H5Sff.f90 H5f90global.lo
-H5Tff.lo:            $(srcdir)/H5Tff.f90 H5f90global.lo
-H5Zff.lo:            $(srcdir)/H5Zff.f90 H5f90global.lo
-H5_DBLE_Interface$(F_DBLE).lo:  $(srcdir)/H5_DBLE_Interface$(F_DBLE).f90 H5Aff$(F_STATUS).lo H5Dff$(F_STATUS).lo H5Fff$(F_STATUS).lo H5Eff$(F_STATUS).lo H5Pff$(F_STATUS).lo
-HDF5.lo:             $(srcdir)/HDF5.f90 H5f90global.lo H5_ff$(F_STATUS).lo H5_ff.lo H5Aff.lo H5Aff$(F_STATUS).lo \
-                     H5Dff.lo H5Dff$(F_STATUS).lo  \
-                     H5Eff.lo H5Eff$(F_STATUS).lo \
-		     H5Fff.lo H5Fff$(F_STATUS).lo H5Gff.lo H5Iff.lo H5Lff.lo H5Lff$(F_STATUS).lo \
-	             H5Off.lo H5Off$(F_STATUS).lo H5Pff.lo H5Pff$(F_STATUS).lo H5Rff$(F_STATUS).lo H5Rff.lo \
-                     H5Sff.lo H5Tff.lo H5Tff$(F_STATUS).lo H5Zff.lo \
-                     H5_DBLE_Interface$(F_DBLE).lo 
-H5FDmpioff.lo:       $(srcdir)/H5FDmpioff.f90 H5f90global.lo
-HDF5mpio.lo:         $(srcdir)/H5FDmpioff.f90 H5f90global.lo H5_ff$(F_STATUS).lo H5_ff.lo \
-		     H5Aff.lo H5Aff$(F_STATUS).lo \
-                     H5Dff.lo H5Dff$(F_STATUS).lo \
-		     H5Eff.lo H5Eff$(F_STATUS).lo \
-                     H5Fff.lo H5Fff$(F_STATUS).lo H5Gff.lo H5Iff.lo H5Lff.lo H5Lff$(F_STATUS).lo \
-		     H5Off.lo H5Off$(F_STATUS).lo H5Pff.lo H5Pff$(F_STATUS).lo H5Rff$(F_STATUS).lo H5Rff.lo \
-                     H5Sff.lo H5Tff.lo H5Tff$(F_STATUS).lo H5Zff.lo \
-	             H5_DBLE_Interface$(F_DBLE).lo H5FDmpioff.lo
+H5f90global.lo:      $(srcdir)/H5f90global.F90 H5fortran_types.lo
+H5_buildiface.lo:    $(srcdir)/H5_buildiface.F90
+H5_ff.lo:            $(srcdir)/H5_ff.F90 H5f90global.lo
+H5Aff.lo:            $(srcdir)/H5Aff.F90 H5f90global.lo
+H5Dff.lo:            $(srcdir)/H5Dff.F90 H5f90global.lo
+H5Eff.lo:            $(srcdir)/H5Eff.F90 H5f90global.lo
+H5Fff.lo:            $(srcdir)/H5Fff.F90 H5f90global.lo
+H5Gff.lo:            $(srcdir)/H5Gff.F90 H5f90global.lo
+H5Iff.lo:            $(srcdir)/H5Iff.F90 H5f90global.lo
+H5Lff.lo:            $(srcdir)/H5Lff.F90 H5f90global.lo
+H5Off.lo:            $(srcdir)/H5Off.F90 H5f90global.lo
+H5Pff.lo:            $(srcdir)/H5Pff.F90 H5f90global.lo
+H5Rff.lo:            $(srcdir)/H5Rff.F90 H5f90global.lo
+H5Sff.lo:            $(srcdir)/H5Sff.F90 H5f90global.lo
+H5Tff.lo:            $(srcdir)/H5Tff.F90 H5f90global.lo
+H5Zff.lo:            $(srcdir)/H5Zff.F90 H5f90global.lo
+H5_gen.lo:           H5_gen.F90 H5f90global.lo H5Aff.lo H5Dff.lo H5Pff.lo
+HDF5.lo:             $(srcdir)/HDF5.F90 H5f90global.lo H5_ff.lo H5Aff.lo  \
+                     H5Dff.lo \
+                     H5Eff.lo \
+		     H5Fff.lo H5Gff.lo H5Iff.lo H5Lff.lo \
+	             H5Off.lo H5Pff.lo H5Rff.lo \
+                     H5Sff.lo H5Tff.lo H5Zff.lo H5_gen.lo
+
+# Treat all .f90 and .F90 files as preprocessed Fortran.
+.f90.o:
+	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+.F90.o:
+	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
diff --git a/fortran/src/hdf5_fortrandll.def.in b/fortran/src/hdf5_fortrandll.def.in
index 48fb343..1333262 100644
--- a/fortran/src/hdf5_fortrandll.def.in
+++ b/fortran/src/hdf5_fortrandll.def.in
@@ -7,99 +7,13 @@ H5LIB_mp_H5CHECK_VERSION_F
 H5LIB_mp_H5GARBAGE_COLLECT_F
 H5LIB_mp_H5DONT_ATEXIT_F
 H5LIB_mp_H5KIND_TO_TYPE
- at H5_NOF03EXP@H5LIB_PROVISIONAL_mp_H5OFFSETOF
-; H5_DBLE_INTERFACE
-H5_DBLE_INTERFACE_mp_H5AREAD_DOUBLE_SCALAR
-H5_DBLE_INTERFACE_mp_H5AREAD_DOUBLE_1
-H5_DBLE_INTERFACE_mp_H5AREAD_DOUBLE_2
-H5_DBLE_INTERFACE_mp_H5AREAD_DOUBLE_3
-H5_DBLE_INTERFACE_mp_H5AREAD_DOUBLE_4
-H5_DBLE_INTERFACE_mp_H5AREAD_DOUBLE_5
-H5_DBLE_INTERFACE_mp_H5AREAD_DOUBLE_6
-H5_DBLE_INTERFACE_mp_H5AREAD_DOUBLE_7
-H5_DBLE_INTERFACE_mp_H5AWRITE_DOUBLE_SCALAR
-H5_DBLE_INTERFACE_mp_H5AWRITE_DOUBLE_1
-H5_DBLE_INTERFACE_mp_H5AWRITE_DOUBLE_2
-H5_DBLE_INTERFACE_mp_H5AWRITE_DOUBLE_3
-H5_DBLE_INTERFACE_mp_H5AWRITE_DOUBLE_4
-H5_DBLE_INTERFACE_mp_H5AWRITE_DOUBLE_5
-H5_DBLE_INTERFACE_mp_H5AWRITE_DOUBLE_6
-H5_DBLE_INTERFACE_mp_H5AWRITE_DOUBLE_7
-H5_DBLE_INTERFACE_mp_H5DFILL_DOUBLE
-H5_DBLE_INTERFACE_mp_H5DREAD_DOUBLE_SCALAR
-H5_DBLE_INTERFACE_mp_H5DREAD_DOUBLE_1
-H5_DBLE_INTERFACE_mp_H5DREAD_DOUBLE_2
-H5_DBLE_INTERFACE_mp_H5DREAD_DOUBLE_3
-H5_DBLE_INTERFACE_mp_H5DREAD_DOUBLE_4
-H5_DBLE_INTERFACE_mp_H5DREAD_DOUBLE_5
-H5_DBLE_INTERFACE_mp_H5DREAD_DOUBLE_6
-H5_DBLE_INTERFACE_mp_H5DREAD_DOUBLE_7
-H5_DBLE_INTERFACE_mp_H5DWRITE_DOUBLE_SCALAR
-H5_DBLE_INTERFACE_mp_H5DWRITE_DOUBLE_1
-H5_DBLE_INTERFACE_mp_H5DWRITE_DOUBLE_2
-H5_DBLE_INTERFACE_mp_H5DWRITE_DOUBLE_3
-H5_DBLE_INTERFACE_mp_H5DWRITE_DOUBLE_4
-H5_DBLE_INTERFACE_mp_H5DWRITE_DOUBLE_5
-H5_DBLE_INTERFACE_mp_H5DWRITE_DOUBLE_6
-H5_DBLE_INTERFACE_mp_H5DWRITE_DOUBLE_7
-H5_DBLE_INTERFACE_mp_H5PGET_DOUBLE
-H5_DBLE_INTERFACE_mp_H5PSET_DOUBLE
-H5_DBLE_INTERFACE_mp_H5PSET_FILL_VALUE_DOUBLE
-H5_DBLE_INTERFACE_mp_H5PGET_FILL_VALUE_DOUBLE
-H5_DBLE_INTERFACE_mp_H5PINSERT_DOUBLE
-H5_DBLE_INTERFACE_mp_H5PREGISTER_DOUBLE
+H5LIB_mp_H5OFFSETOF
 ; H5A
+H5A_mp_H5AWRITE_CHAR_SCALAR
+H5A_mp_H5AREAD_CHAR_SCALAR
 H5A_mp_H5ACREATE_F
 H5A_mp_H5AOPEN_NAME_F
 H5A_mp_H5AOPEN_IDX_F
-H5A_PROVISIONAL_mp_H5AWRITE_INTEGER_SCALAR
-H5A_PROVISIONAL_mp_H5AWRITE_INTEGER_1
-H5A_PROVISIONAL_mp_H5AWRITE_INTEGER_2
-H5A_PROVISIONAL_mp_H5AWRITE_INTEGER_3
-H5A_PROVISIONAL_mp_H5AWRITE_INTEGER_4
-H5A_PROVISIONAL_mp_H5AWRITE_INTEGER_5
-H5A_PROVISIONAL_mp_H5AWRITE_INTEGER_6
-H5A_PROVISIONAL_mp_H5AWRITE_INTEGER_7
-H5A_PROVISIONAL_mp_H5AWRITE_REAL_SCALAR
-H5A_PROVISIONAL_mp_H5AWRITE_REAL_1
-H5A_PROVISIONAL_mp_H5AWRITE_REAL_2
-H5A_PROVISIONAL_mp_H5AWRITE_REAL_3
-H5A_PROVISIONAL_mp_H5AWRITE_REAL_4
-H5A_PROVISIONAL_mp_H5AWRITE_REAL_5
-H5A_PROVISIONAL_mp_H5AWRITE_REAL_6
-H5A_PROVISIONAL_mp_H5AWRITE_REAL_7
-H5A_PROVISIONAL_mp_H5AWRITE_CHAR_SCALAR
-H5A_PROVISIONAL_mp_H5AWRITE_CHAR_1
-H5A_PROVISIONAL_mp_H5AWRITE_CHAR_2
-H5A_PROVISIONAL_mp_H5AWRITE_CHAR_3
-H5A_PROVISIONAL_mp_H5AWRITE_CHAR_4
-H5A_PROVISIONAL_mp_H5AWRITE_CHAR_5
-H5A_PROVISIONAL_mp_H5AWRITE_CHAR_6
-H5A_PROVISIONAL_mp_H5AWRITE_CHAR_7
-H5A_PROVISIONAL_mp_H5AREAD_INTEGER_SCALAR
-H5A_PROVISIONAL_mp_H5AREAD_INTEGER_1
-H5A_PROVISIONAL_mp_H5AREAD_INTEGER_2
-H5A_PROVISIONAL_mp_H5AREAD_INTEGER_3
-H5A_PROVISIONAL_mp_H5AREAD_INTEGER_4
-H5A_PROVISIONAL_mp_H5AREAD_INTEGER_5
-H5A_PROVISIONAL_mp_H5AREAD_INTEGER_6
-H5A_PROVISIONAL_mp_H5AREAD_INTEGER_7
-H5A_PROVISIONAL_mp_H5AREAD_REAL_SCALAR
-H5A_PROVISIONAL_mp_H5AREAD_REAL_1
-H5A_PROVISIONAL_mp_H5AREAD_REAL_2
-H5A_PROVISIONAL_mp_H5AREAD_REAL_3
-H5A_PROVISIONAL_mp_H5AREAD_REAL_4
-H5A_PROVISIONAL_mp_H5AREAD_REAL_5
-H5A_PROVISIONAL_mp_H5AREAD_REAL_6
-H5A_PROVISIONAL_mp_H5AREAD_REAL_7
-H5A_PROVISIONAL_mp_H5AREAD_CHAR_SCALAR
-H5A_PROVISIONAL_mp_H5AREAD_CHAR_1
-H5A_PROVISIONAL_mp_H5AREAD_CHAR_2
-H5A_PROVISIONAL_mp_H5AREAD_CHAR_3
-H5A_PROVISIONAL_mp_H5AREAD_CHAR_4
-H5A_PROVISIONAL_mp_H5AREAD_CHAR_5
-H5A_PROVISIONAL_mp_H5AREAD_CHAR_6
-H5A_PROVISIONAL_mp_H5AREAD_CHAR_7
 H5A_mp_H5AGET_SPACE_F
 H5A_mp_H5AGET_TYPE_F
 H5A_mp_H5AGET_NAME_F
@@ -121,65 +35,19 @@ H5A_mp_H5ACREATE_BY_NAME_F
 H5A_mp_H5AEXISTS_F
 H5A_mp_H5AEXISTS_BY_NAME_F
 H5A_mp_H5AOPEN_BY_NAME_F
+H5A_mp_H5AWRITE_PTR
+H5A_mp_H5AREAD_PTR
 H5A_mp_H5ARENAME_F
- at H5_NOF03EXP@H5A_PROVISIONAL_mp_H5AWRITE_PTR
- at H5_NOF03EXP@H5A_PROVISIONAL_mp_H5AREAD_PTR
 ; H5D
 H5D_mp_H5DCREATE_F
 H5D_mp_H5DOPEN_F
 H5D_mp_H5DCLOSE_F
-H5D_PROVISIONAL_mp_H5DWRITE_REFERENCE_OBJ
-H5D_PROVISIONAL_mp_H5DWRITE_REFERENCE_DSETREG
-H5D_PROVISIONAL_mp_H5DWRITE_INTEGER_SCALAR
-H5D_PROVISIONAL_mp_H5DWRITE_INTEGER_1
-H5D_PROVISIONAL_mp_H5DWRITE_INTEGER_2
-H5D_PROVISIONAL_mp_H5DWRITE_INTEGER_3
-H5D_PROVISIONAL_mp_H5DWRITE_INTEGER_4
-H5D_PROVISIONAL_mp_H5DWRITE_INTEGER_5
-H5D_PROVISIONAL_mp_H5DWRITE_INTEGER_6
-H5D_PROVISIONAL_mp_H5DWRITE_INTEGER_7
-H5D_PROVISIONAL_mp_H5DWRITE_CHAR_SCALAR
-H5D_PROVISIONAL_mp_H5DWRITE_CHAR_1
-H5D_PROVISIONAL_mp_H5DWRITE_CHAR_2
-H5D_PROVISIONAL_mp_H5DWRITE_CHAR_3
-H5D_PROVISIONAL_mp_H5DWRITE_CHAR_4
-H5D_PROVISIONAL_mp_H5DWRITE_CHAR_5
-H5D_PROVISIONAL_mp_H5DWRITE_CHAR_6
-H5D_PROVISIONAL_mp_H5DWRITE_CHAR_7
-H5D_PROVISIONAL_mp_H5DWRITE_REAL_SCALAR
-H5D_PROVISIONAL_mp_H5DWRITE_REAL_1
-H5D_PROVISIONAL_mp_H5DWRITE_REAL_2
-H5D_PROVISIONAL_mp_H5DWRITE_REAL_3
-H5D_PROVISIONAL_mp_H5DWRITE_REAL_4
-H5D_PROVISIONAL_mp_H5DWRITE_REAL_5
-H5D_PROVISIONAL_mp_H5DWRITE_REAL_6
-H5D_PROVISIONAL_mp_H5DWRITE_REAL_7
-H5D_PROVISIONAL_mp_H5DREAD_REFERENCE_OBJ
-H5D_PROVISIONAL_mp_H5DREAD_REFERENCE_DSETREG
-H5D_PROVISIONAL_mp_H5DREAD_INTEGER_SCALAR
-H5D_PROVISIONAL_mp_H5DREAD_INTEGER_1
-H5D_PROVISIONAL_mp_H5DREAD_INTEGER_2
-H5D_PROVISIONAL_mp_H5DREAD_INTEGER_3
-H5D_PROVISIONAL_mp_H5DREAD_INTEGER_4
-H5D_PROVISIONAL_mp_H5DREAD_INTEGER_5
-H5D_PROVISIONAL_mp_H5DREAD_INTEGER_6
-H5D_PROVISIONAL_mp_H5DREAD_INTEGER_7
-H5D_PROVISIONAL_mp_H5DREAD_CHAR_SCALAR
-H5D_PROVISIONAL_mp_H5DREAD_CHAR_1
-H5D_PROVISIONAL_mp_H5DREAD_CHAR_2
-H5D_PROVISIONAL_mp_H5DREAD_CHAR_3
-H5D_PROVISIONAL_mp_H5DREAD_CHAR_4
-H5D_PROVISIONAL_mp_H5DREAD_CHAR_5
-H5D_PROVISIONAL_mp_H5DREAD_CHAR_6
-H5D_PROVISIONAL_mp_H5DREAD_CHAR_7
-H5D_PROVISIONAL_mp_H5DREAD_REAL_SCALAR
-H5D_PROVISIONAL_mp_H5DREAD_REAL_1
-H5D_PROVISIONAL_mp_H5DREAD_REAL_2
-H5D_PROVISIONAL_mp_H5DREAD_REAL_3
-H5D_PROVISIONAL_mp_H5DREAD_REAL_4
-H5D_PROVISIONAL_mp_H5DREAD_REAL_5
-H5D_PROVISIONAL_mp_H5DREAD_REAL_6
-H5D_PROVISIONAL_mp_H5DREAD_REAL_7
+H5D_mp_H5DWRITE_REFERENCE_OBJ
+H5D_mp_H5DWRITE_REFERENCE_DSETREG
+H5D_mp_H5DWRITE_CHAR_SCALAR
+H5D_mp_H5DREAD_REFERENCE_OBJ
+H5D_mp_H5DREAD_REFERENCE_DSETREG
+H5D_mp_H5DREAD_CHAR_SCALAR
 H5D_mp_H5DGET_SPACE_F
 H5D_mp_H5DGET_TYPE_F
 H5D_mp_H5DSET_EXTENT_F
@@ -192,11 +60,11 @@ H5D_mp_H5DWRITE_VL_REAL
 H5D_mp_H5DREAD_VL_REAL
 H5D_mp_H5DWRITE_VL_STRING
 H5D_mp_H5DREAD_VL_STRING
-H5D_PROVISIONAL_mp_H5DFILL_INTEGER
-H5D_PROVISIONAL_mp_H5DFILL_REAL
-H5D_PROVISIONAL_mp_H5DFILL_CHAR
+H5D_mp_H5DFILL_CHAR
+H5D_mp_H5DFILL_INTEGER
 H5D_mp_H5DGET_SPACE_STATUS_F
 H5D_mp_H5DCREATE_ANON_F
+H5D_mp_H5DGET_OFFSET_F
 H5D_mp_H5DGET_SPACE_F
 H5D_mp_H5DGET_TYPE_F
 H5D_mp_H5DSET_EXTENT_F
@@ -204,15 +72,15 @@ H5D_mp_H5DGET_CREATE_PLIST_F
 H5D_mp_H5DGET_STORAGE_SIZE_F
 H5D_mp_H5DVLEN_GET_MAX_LEN_F
 H5D_mp_H5DGET_ACCESS_PLIST_F
- at H5_NOF03EXP@H5D_PROVISIONAL_mp_H5DWRITE_PTR
- at H5_NOF03EXP@H5D_PROVISIONAL_mp_H5DREAD_PTR
- at H5_NOF03EXP@H5D_PROVISIONAL_mp_H5DVLEN_RECLAIM_F
+H5D_mp_H5DWRITE_PTR
+H5D_mp_H5DREAD_PTR
+H5D_mp_H5DVLEN_RECLAIM_F
 ; H5E
 H5E_mp_H5ECLEAR_F
 H5E_mp_H5EPRINT_F
 H5E_mp_H5EGET_MAJOR_F
 H5E_mp_H5EGET_MINOR_F
-H5E_PROVISIONAL_mp_H5ESET_AUTO_F
+H5E_mp_H5ESET_AUTO_F
 ; H5F
 H5F_mp_H5FCREATE_F
 H5F_mp_H5FFLUSH_F
@@ -229,7 +97,7 @@ H5F_mp_H5FGET_ACCESS_PLIST_F
 H5F_mp_H5FIS_HDF5_F
 H5F_mp_H5FGET_NAME_F
 H5F_mp_H5FGET_FILESIZE_F
- at H5_NOF03EXP@H5F_PROVISIONAL_mp_H5FGET_FILE_IMAGE_F
+H5F_mp_H5FGET_FILE_IMAGE_F
 ; H5G
 H5G_mp_H5GOPEN_F
 H5G_mp_H5GCREATE_F
@@ -291,8 +159,8 @@ H5L_mp_H5LGET_INFO_BY_IDX_F
 H5L_mp_H5LIS_REGISTERED_F
 H5L_mp_H5LMOVE_F
 H5L_mp_H5LGET_NAME_BY_IDX_F
- at H5_NOF03EXP@H5L_PROVISIONAL_mp_H5LITERATE_F
- at H5_NOF03EXP@H5L_PROVISIONAL_mp_H5LITERATE_BY_NAME_F
+H5L_mp_H5LITERATE_F
+H5L_mp_H5LITERATE_BY_NAME_F
 ; H5O
 H5O_mp_H5OCLOSE_F
 H5O_mp_H5OCOPY_F
@@ -307,11 +175,11 @@ H5O_mp_H5OOPEN_BY_IDX_F
 H5O_mp_H5OOPEN_F
 H5O_mp_H5OSET_COMMENT_F
 H5O_mp_H5OSET_COMMENT_BY_NAME_F
- at H5_NOF03EXP@H5O_PROVISIONAL_mp_H5OGET_INFO_BY_IDX_F
- at H5_NOF03EXP@H5O_PROVISIONAL_mp_H5OGET_INFO_BY_NAME_F
- at H5_NOF03EXP@H5O_PROVISIONAL_mp_H5OGET_INFO_F
- at H5_NOF03EXP@H5O_PROVISIONAL_mp_H5OVISIT_BY_NAME_F
- at H5_NOF03EXP@H5O_PROVISIONAL_mp_H5OVISIT_F
+H5O_mp_H5OGET_INFO_BY_IDX_F
+H5O_mp_H5OGET_INFO_BY_NAME_F
+H5O_mp_H5OGET_INFO_F
+H5O_mp_H5OVISIT_BY_NAME_F
+H5O_mp_H5OVISIT_F
 ; H5P
 H5P_mp_H5PCREATE_F
 H5P_mp_H5PSET_PRESERVE_F
@@ -322,12 +190,10 @@ H5P_mp_H5PCLOSE_F
 H5P_mp_H5PSET_CHUNK_F
 H5P_mp_H5PGET_CHUNK_F
 H5P_mp_H5PSET_DEFLATE_F
-H5P_PROVISIONAL_mp_H5PSET_FILL_VALUE_INTEGER
-H5P_PROVISIONAL_mp_H5PGET_FILL_VALUE_INTEGER
-H5P_PROVISIONAL_mp_H5PSET_FILL_VALUE_REAL
-H5P_PROVISIONAL_mp_H5PGET_FILL_VALUE_REAL
-H5P_PROVISIONAL_mp_H5PSET_FILL_VALUE_CHAR
-H5P_PROVISIONAL_mp_H5PGET_FILL_VALUE_CHAR
+H5P_mp_H5PSET_FILL_VALUE_CHAR
+H5P_mp_H5PGET_FILL_VALUE_CHAR
+H5P_mp_H5PSET_FILL_VALUE_INTEGER
+H5P_mp_H5PGET_FILL_VALUE_INTEGER
 H5P_mp_H5PGET_VERSION_F
 H5P_mp_H5PSET_USERBLOCK_F
 H5P_mp_H5PGET_USERBLOCK_F
@@ -379,12 +245,10 @@ H5P_mp_H5PSET_SMALL_DATA_BLOCK_SIZE_F
 H5P_mp_H5PGET_SMALL_DATA_BLOCK_SIZE_F
 H5P_mp_H5PSET_HYPER_VECTOR_SIZE_F
 H5P_mp_H5PGET_HYPER_VECTOR_SIZE_F
-H5P_PROVISIONAL_mp_H5PSET_INTEGER
-H5P_PROVISIONAL_mp_H5PSET_REAL
-H5P_PROVISIONAL_mp_H5PSET_CHAR
-H5P_PROVISIONAL_mp_H5PGET_INTEGER
-H5P_PROVISIONAL_mp_H5PGET_REAL
-H5P_PROVISIONAL_mp_H5PGET_CHAR
+H5P_mp_H5PSET_CHAR
+H5P_mp_H5PSET_INTEGER
+H5P_mp_H5PGET_CHAR
+H5P_mp_H5PGET_INTEGER
 H5P_mp_H5PEXIST_F
 H5P_mp_H5PGET_SIZE_F
 H5P_mp_H5PGET_NPROPS_F
@@ -395,13 +259,11 @@ H5P_mp_H5PCOPY_PROP_F
 H5P_mp_H5PREMOVE_F
 H5P_mp_H5PUNREGISTER_F
 H5P_mp_H5PCLOSE_CLASS_F
-H5P_PROVISIONAL_mp_H5PCREATE_CLASS_F
-H5P_PROVISIONAL_mp_H5PREGISTER_INTEGER
-H5P_PROVISIONAL_mp_H5PREGISTER_REAL
-H5P_PROVISIONAL_mp_H5PREGISTER_CHAR
-H5P_PROVISIONAL_mp_H5PINSERT_INTEGER
-H5P_PROVISIONAL_mp_H5PINSERT_REAL
-H5P_PROVISIONAL_mp_H5PINSERT_CHAR
+H5P_mp_H5PCREATE_CLASS_F
+H5P_mp_H5PREGISTER_INTEGER
+H5P_mp_H5PREGISTER_CHAR
+H5P_mp_H5PINSERT_CHAR
+H5P_mp_H5PINSERT_INTEGER
 H5P_mp_H5PSET_SHUFFLE_F
 H5P_mp_H5PSET_EDC_CHECK_F
 H5P_mp_H5PGET_EDC_CHECK_F
@@ -448,28 +310,34 @@ H5P_mp_H5PGET_NLINKS_F
 H5P_mp_H5PGET_CREATE_INTER_GROUP_F
 H5P_mp_H5PSET_CHUNK_CACHE_F
 H5P_mp_H5PGET_CHUNK_CACHE_F
- at H5_NOF03EXP@H5P_PROVISIONAL_mp_H5PSET_FILL_VALUE_PTR
- at H5_NOF03EXP@H5P_PROVISIONAL_mp_H5PGET_FILL_VALUE_PTR
- at H5_NOF03EXP@H5P_PROVISIONAL_mp_H5PSET_PTR
- at H5_NOF03EXP@H5P_PROVISIONAL_mp_H5PGET_PTR
- at H5_NOF03EXP@H5P_PROVISIONAL_mp_H5PREGISTER_PTR
- at H5_NOF03EXP@H5P_PROVISIONAL_mp_H5PINSERT_PTR
- at H5_NOF03EXP@H5P_PROVISIONAL_mp_H5PGET_FILE_IMAGE_F
- at H5_NOF03EXP@H5P_PROVISIONAL_mp_H5PSET_FILE_IMAGE_F
+H5P_mp_H5PSET_FILL_VALUE_PTR
+H5P_mp_H5PGET_FILL_VALUE_PTR
+H5P_mp_H5PSET_PTR
+H5P_mp_H5PGET_PTR
+H5P_mp_H5PREGISTER_PTR
+H5P_mp_H5PINSERT_PTR
+H5P_mp_H5PGET_FILE_IMAGE_F
+H5P_mp_H5PSET_FILE_IMAGE_F
+; Parallel
+ at H5_NOPAREXP@H5P_mp_H5PSET_FAPL_MPIO_F
+ at H5_NOPAREXP@H5P_mp_H5PGET_FAPL_MPIO_F
+ at H5_NOPAREXP@H5P_mp_H5PSET_DXPL_MPIO_F
+ at H5_NOPAREXP@H5P_mp_H5PGET_DXPL_MPIO_F
+ at H5_NOPAREXP@H5P_mp_H5PGET_MPIO_ACTUAL_IO_MODE_F
 ; H5R
-H5R_PROVISIONAL_mp_H5RCREATE_OBJECT_F
-H5R_PROVISIONAL_mp_H5RCREATE_REGION_F
-H5R_PROVISIONAL_mp_H5RDEREFERENCE_OBJECT_F
-H5R_PROVISIONAL_mp_H5RDEREFERENCE_REGION_F
-H5R_PROVISIONAL_mp_H5RGET_REGION_REGION_F
+H5R_mp_H5RCREATE_OBJECT_F
+H5R_mp_H5RCREATE_REGION_F
+H5R_mp_H5RDEREFERENCE_OBJECT_F
+H5R_mp_H5RDEREFERENCE_REGION_F
+H5R_mp_H5RGET_REGION_REGION_F
 H5R_mp_H5RGET_OBJECT_TYPE_OBJ_F
-H5R_PROVISIONAL_mp_H5RGET_NAME_OBJECT_F
-H5R_PROVISIONAL_mp_H5RGET_NAME_REGION_F
- at H5_NOF03EXP@H5R_PROVISIONAL_mp_H5RGET_REGION_PTR_F
- at H5_NOF03EXP@H5R_PROVISIONAL_mp_H5RCREATE_PTR_F
- at H5_NOF03EXP@H5R_PROVISIONAL_mp_H5RDEREFERENCE_PTR_F
- at H5_NOF03EXP@H5R_PROVISIONAL_mp_H5RGET_NAME_PTR_F
- at H5_NOF03EXP@H5R_PROVISIONAL_mp_H5RGET_OBJ_TYPE_F
+H5R_mp_H5RGET_NAME_OBJECT_F
+H5R_mp_H5RGET_NAME_REGION_F
+H5R_mp_H5RGET_REGION_PTR_F
+H5R_mp_H5RCREATE_PTR_F
+H5R_mp_H5RDEREFERENCE_PTR_F
+H5R_mp_H5RGET_NAME_PTR_F
+H5R_mp_H5RGET_OBJ_TYPE_F
 ; H5S
 H5S_mp_H5SCREATE_SIMPLE_F
 H5S_mp_H5SCLOSE_F
@@ -558,17 +426,10 @@ H5T_mp_H5TENCODE_F
 H5T_mp_H5TGET_CREATE_PLIST_F
 H5T_mp_H5TCOMPILER_CONV_F
 H5T_mp_H5TGET_NATIVE_TYPE_F
- at H5_NOF03EXP@H5T_PROVISIONAL_mp_H5TCONVERT_F
- at H5_F03EXP@H5T_PROVISIONAL_mp_H5TENUM_INSERT_F
- at H5_NOF03EXP@H5T_PROVISIONAL_mp_H5TENUM_INSERT_F90
- at H5_NOF03EXP@H5T_PROVISIONAL_mp_H5TENUM_INSERT_F03
+H5T_mp_H5TCONVERT_F
+H5T_mp_H5TENUM_INSERT_F90
+H5T_mp_H5TENUM_INSERT_F03
 ; H5Z
 H5Z_mp_H5ZUNREGISTER_F
 H5Z_mp_H5ZFILTER_AVAIL_F
 H5Z_mp_H5ZGET_FILTER_INFO_F
-; Parallel
- at H5_NOPAREXP@H5FDMPIO_mp_H5PSET_FAPL_MPIO_F
- at H5_NOPAREXP@H5FDMPIO_mp_H5PGET_FAPL_MPIO_F
- at H5_NOPAREXP@H5FDMPIO_mp_H5PSET_DXPL_MPIO_F
- at H5_NOPAREXP@H5FDMPIO_mp_H5PGET_DXPL_MPIO_F
- at H5_NOPAREXP@H5FDMPIO_mp_H5PGET_MPIO_ACTUAL_IO_MODE_F
diff --git a/fortran/test/CMakeLists.txt b/fortran/test/CMakeLists.txt
index d8e6fe5..0cbd17f 100644
--- a/fortran/test/CMakeLists.txt
+++ b/fortran/test/CMakeLists.txt
@@ -7,6 +7,42 @@ PROJECT (HDF5_FORTRAN_TESTS C CXX Fortran)
 INCLUDE_DIRECTORIES (${HDF5_F90_BINARY_DIR} ${HDF5_F90_SRC_DIR}/src)
 
 #-----------------------------------------------------------------------------
+# Setup the Fortran auto-detection utilities
+# H5_test_buildiface.F90         used to generate various KIND test interfaces
+#-----------------------------------------------------------------------------
+
+add_executable (H5_test_buildiface
+      ${HDF5_F90_SRC_DIR}/test/H5_test_buildiface.F90
+  )
+
+if (WIN32 AND MSVC)
+  if (BUILD_SHARED_LIBS)
+    set_target_properties (H5_test_buildiface
+        PROPERTIES
+            COMPILE_FLAGS "/MT"
+    )
+  endif (BUILD_SHARED_LIBS)
+  set_target_properties (H5_test_buildiface
+      PROPERTIES
+          LINK_FLAGS "/SUBSYSTEM:CONSOLE"
+  )
+endif (WIN32 AND MSVC)
+set_target_properties (H5_test_buildiface PROPERTIES
+    LINKER_LANGUAGE Fortran
+    Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}
+)
+
+if (NOT SKIP_HDF5_FORTRAN_SHARED)
+  if (WIN32)
+    set (MOD_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/static/\${BUILD_TYPE})
+  else (WIN32)
+    set (MOD_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/static)
+  endif (WIN32)
+endif (NOT SKIP_HDF5_FORTRAN_SHARED)
+
+INCLUDE_DIRECTORIES (${CMAKE_Fortran_MODULE_DIRECTORY} ${MOD_BUILD_DIR})
+
+#-----------------------------------------------------------------------------
 # Add Test Lib
 #-----------------------------------------------------------------------------
 add_library (${HDF5_F90_C_TEST_LIB_TARGET} STATIC t.c)
@@ -29,7 +65,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
       ${HDF5_F90_C_LIBSH_TARGET}
       ${HDF5_TEST_LIBSH_TARGET}
   )
-  H5_SET_LIB_OPTIONS (${HDF5_F90_C_TEST_LIBSH_TARGET} ${HDF5_F90_C_TEST_LIB_NAME} SHARED ${HDF5_PACKAGE_SOVERSION})
+  H5_SET_LIB_OPTIONS (${HDF5_F90_C_TEST_LIBSH_TARGET} ${HDF5_F90_C_TEST_LIB_NAME} SHARED)
   set_target_properties (${HDF5_F90_C_TEST_LIBSH_TARGET} PROPERTIES
       FOLDER libraries/test/fortran
       LINKER_LANGUAGE C
@@ -39,26 +75,28 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   )
 endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 
-# See if the F2008 intrinsic STORAGE_SIZE and C_SIZEOF are supported. If not then
-# fall back to F2003. If F2003 not supported then use F90 for the tests.
+set (HDF5_F90_TF_SRCS
+     # generated files
+     ${HDF5_F90_BINARY_DIR}/tf_gen.F90
+)
+set_source_files_properties (
+    ${HDF5_F90_BINARY_DIR}/tf_gen.F90
+    PROPERTIES GENERATED TRUE
+)
+set_source_files_properties (tf.F90 ${HDF5_F90_BINARY_DIR}/${HDF5_F90_TF_SRCS} PROPERTIES LANGUAGE Fortran)
+
+set (CMD $<TARGET_FILE:H5_test_buildiface>)
+add_custom_target (H5testgen ALL
+    COMMAND ${CMD}
+#v3.2    BYPRODUCT ${HDF5_F90_BINARY_DIR}/tf_gen.F90
+    WORKING_DIRECTORY ${HDF5_F90_BINARY_DIR}
+    DEPENDS H5_test_buildiface
+)
 
-set_source_files_properties (tf_F90.f90 tf_F03.f90 tf_F08.f90 tf.f90 PROPERTIES LANGUAGE Fortran)
-if (FORTRAN_HAVE_STORAGE_SIZE AND FORTRAN_HAVE_C_SIZEOF)
-  add_library (${HDF5_F90_TEST_LIB_TARGET} STATIC tf_F08.f90 tf.f90)
-  if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-    add_library (${HDF5_F90_TEST_LIBSH_TARGET} SHARED tf_F08.f90 tf.f90)
-  endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-elseif (HDF5_ENABLE_F2003)
-  add_library (${HDF5_F90_TEST_LIB_TARGET} STATIC tf_F03.f90 tf.f90)
-  if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-    add_library (${HDF5_F90_TEST_LIBSH_TARGET} SHARED tf_F03.f90 tf.f90)
-  endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-else (FORTRAN_HAVE_STORAGE_SIZE AND FORTRAN_HAVE_C_SIZEOF)
-  add_library (${HDF5_F90_TEST_LIB_TARGET} STATIC tf_F90.f90 tf.f90)
-  if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-    add_library (${HDF5_F90_TEST_LIBSH_TARGET} SHARED tf_F90.f90 tf.f90)
-  endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-endif (FORTRAN_HAVE_STORAGE_SIZE AND FORTRAN_HAVE_C_SIZEOF)
+add_library (${HDF5_F90_TEST_LIB_TARGET} STATIC tf.F90 ${HDF5_F90_TF_SRCS})
+if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+   add_library (${HDF5_F90_TEST_LIBSH_TARGET} SHARED tf.F90 ${HDF5_F90_TF_SRCS})
+endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 
 TARGET_FORTRAN_PROPERTIES (${HDF5_F90_TEST_LIB_TARGET} STATIC " " " ")
 target_link_libraries (${HDF5_F90_TEST_LIB_TARGET}
@@ -90,7 +128,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
       ${HDF5_F90_LIBSH_TARGET}
       ${HDF5_LIBSH_TARGET}
   )
-  H5_SET_LIB_OPTIONS (${HDF5_F90_TEST_LIBSH_TARGET} ${HDF5_F90_TEST_LIB_NAME} SHARED ${HDF5_PACKAGE_SOVERSION})
+  H5_SET_LIB_OPTIONS (${HDF5_F90_TEST_LIBSH_TARGET} ${HDF5_F90_TEST_LIB_NAME} SHARED)
   target_include_directories (${HDF5_F90_TEST_LIBSH_TARGET} PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/shared)
   set_target_properties (${HDF5_F90_TEST_LIBSH_TARGET} PROPERTIES
       FOLDER libraries/test/fortran
@@ -113,21 +151,21 @@ endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 
 #-- Adding test for testhdf5_fortran
 add_executable (testhdf5_fortran
-    fortranlib_test.f90
-    tH5A.f90
-    tH5D.f90
-    tH5E.f90
-    tH5F.f90
-    tH5G.f90
-    tH5I.f90
-    tH5P.f90
-    tH5R.f90
-    tH5S.f90
-    tH5Sselect.f90
-    tH5T.f90
-    tH5VL.f90
-    tH5Z.f90
-    tHDF5.f90
+    fortranlib_test.F90
+    tH5A.F90
+    tH5D.F90
+    tH5E.F90
+    tH5F.F90
+    tH5G.F90
+    tH5I.F90
+    tH5P.F90
+    tH5R.F90
+    tH5S.F90
+    tH5Sselect.F90
+    tH5T.F90
+    tH5VL.F90
+    tH5Z.F90
+    tHDF5.F90
 )
 TARGET_NAMING (testhdf5_fortran STATIC)
 TARGET_FORTRAN_PROPERTIES (testhdf5_fortran STATIC " " " ")
@@ -145,23 +183,25 @@ set_target_properties (testhdf5_fortran PROPERTIES
     FOLDER test/fortran
     Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/static
 )
+add_dependencies (testhdf5_fortran ${HDF5_F90_TEST_LIB_TARGET})
+
 if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   add_executable (testhdf5_fortran-shared
-      fortranlib_test.f90
-      tH5A.f90
-      tH5D.f90
-      tH5E.f90
-      tH5F.f90
-      tH5G.f90
-      tH5I.f90
-      tH5P.f90
-      tH5R.f90
-      tH5S.f90
-      tH5Sselect.f90
-      tH5T.f90
-      tH5VL.f90
-      tH5Z.f90
-      tHDF5.f90
+      fortranlib_test.F90
+      tH5A.F90
+      tH5D.F90
+      tH5E.F90
+      tH5F.F90
+      tH5G.F90
+      tH5I.F90
+      tH5P.F90
+      tH5R.F90
+      tH5S.F90
+      tH5Sselect.F90
+      tH5T.F90
+      tH5VL.F90
+      tH5Z.F90
+      tHDF5.F90
   )
   TARGET_NAMING (testhdf5_fortran-shared SHARED)
   TARGET_FORTRAN_PROPERTIES (testhdf5_fortran-shared SHARED " " " ")
@@ -179,16 +219,17 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
         FOLDER test/fortran
         Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/shared
   )
+  add_dependencies (testhdf5_fortran-shared ${HDF5_F90_TEST_LIBSH_TARGET})
 endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 
 #-- Adding test for testhdf5_fortran_1_8
 add_executable (testhdf5_fortran_1_8
-    fortranlib_test_1_8.f90
-    tH5O.f90
-    tH5A_1_8.f90
-    tH5G_1_8.f90
-    tH5MISC_1_8.f90
-    tHDF5_1_8.f90
+    fortranlib_test_1_8.F90
+    tH5O.F90
+    tH5A_1_8.F90
+    tH5G_1_8.F90
+    tH5MISC_1_8.F90
+    tHDF5_1_8.F90
 )
 TARGET_NAMING (testhdf5_fortran_1_8 STATIC)
 TARGET_FORTRAN_PROPERTIES (testhdf5_fortran_1_8 STATIC " " " ")
@@ -206,14 +247,16 @@ set_target_properties (testhdf5_fortran_1_8 PROPERTIES
     FOLDER test/fortran
     Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/static
 )
+add_dependencies (testhdf5_fortran_1_8 ${HDF5_F90_TEST_LIB_TARGET})
+
 if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   add_executable (testhdf5_fortran_1_8-shared
-      fortranlib_test_1_8.f90
-      tH5O.f90
-      tH5A_1_8.f90
-      tH5G_1_8.f90
-      tH5MISC_1_8.f90
-      tHDF5_1_8.f90
+      fortranlib_test_1_8.F90
+      tH5O.F90
+      tH5A_1_8.F90
+      tH5G_1_8.F90
+      tH5MISC_1_8.F90
+      tHDF5_1_8.F90
   )
   TARGET_NAMING (testhdf5_fortran_1_8-shared SHARED)
   TARGET_FORTRAN_PROPERTIES (testhdf5_fortran_1_8-shared SHARED " " " ")
@@ -231,68 +274,70 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
         FOLDER test/fortran
         Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/shared
   )
+  add_dependencies (testhdf5_fortran_1_8-shared ${HDF5_F90_TEST_LIBSH_TARGET})
 endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 
 #-- Adding test for fortranlib_test_F03
-if (HDF5_ENABLE_F2003)
-  add_executable (fortranlib_test_F03
-      fortranlib_test_F03.f90
-      tH5E_F03.f90
-      tH5F_F03.f90
-      tH5L_F03.f90
-      tH5O_F03.f90
-      tH5P_F03.f90
-      tH5T_F03.f90
-      tHDF5_F03.f90
+add_executable (fortranlib_test_F03
+    fortranlib_test_F03.F90
+    tH5E_F03.F90
+    tH5F_F03.F90
+    tH5L_F03.F90
+    tH5O_F03.F90
+    tH5P_F03.F90
+    tH5T_F03.F90
+    tHDF5_F03.F90
+)
+TARGET_NAMING (fortranlib_test_F03 STATIC)
+TARGET_FORTRAN_PROPERTIES (fortranlib_test_F03 STATIC " " " ")
+target_link_libraries (fortranlib_test_F03
+    ${HDF5_F90_TEST_LIB_TARGET}
+    ${HDF5_F90_LIB_TARGET}
+    ${HDF5_LIB_TARGET}
+)
+if (WIN32 AND MSVC)
+  target_link_libraries (fortranlib_test_F03 "ws2_32.lib")
+endif (WIN32 AND MSVC)
+target_include_directories (fortranlib_test_F03 PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/static)
+set_target_properties (fortranlib_test_F03 PROPERTIES
+    LINKER_LANGUAGE Fortran
+    FOLDER test/fortran
+    Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/static
+)
+add_dependencies (fortranlib_test_F03 ${HDF5_F90_TEST_LIB_TARGET})
+
+if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
+  add_executable (fortranlib_test_F03-shared
+      fortranlib_test_F03.F90
+      tH5E_F03.F90
+      tH5F_F03.F90
+      tH5L_F03.F90
+      tH5O_F03.F90
+      tH5P_F03.F90
+      tH5T_F03.F90
+      tHDF5_F03.F90
   )
-  TARGET_NAMING (fortranlib_test_F03 STATIC)
-  TARGET_FORTRAN_PROPERTIES (fortranlib_test_F03 STATIC " " " ")
-  target_link_libraries (fortranlib_test_F03
-      ${HDF5_F90_TEST_LIB_TARGET}
-      ${HDF5_F90_LIB_TARGET}
-      ${HDF5_LIB_TARGET}
+  TARGET_NAMING (fortranlib_test_F03-shared SHARED)
+  TARGET_FORTRAN_PROPERTIES (fortranlib_test_F03-shared SHARED " " " ")
+  target_link_libraries (fortranlib_test_F03-shared
+      ${HDF5_F90_TEST_LIBSH_TARGET}
+      ${HDF5_F90_LIBSH_TARGET}
+      ${HDF5_LIBSH_TARGET}
   )
   if (WIN32 AND MSVC)
-    target_link_libraries (fortranlib_test_F03 "ws2_32.lib")
+    target_link_libraries (fortranlib_test_F03-shared "ws2_32.lib")
   endif (WIN32 AND MSVC)
-  target_include_directories (fortranlib_test_F03 PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/static)
-  set_target_properties (fortranlib_test_F03 PROPERTIES
+  target_include_directories (fortranlib_test_F03-shared PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/shared)
+  set_target_properties (fortranlib_test_F03-shared PROPERTIES
       LINKER_LANGUAGE Fortran
       FOLDER test/fortran
-      Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/static
-  )
-  if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-    add_executable (fortranlib_test_F03-shared
-        fortranlib_test_F03.f90
-        tH5E_F03.f90
-        tH5F_F03.f90
-        tH5L_F03.f90
-        tH5O_F03.f90
-        tH5P_F03.f90
-        tH5T_F03.f90
-        tHDF5_F03.f90
-    )
-    TARGET_NAMING (fortranlib_test_F03-shared SHARED)
-    TARGET_FORTRAN_PROPERTIES (fortranlib_test_F03-shared SHARED " " " ")
-    target_link_libraries (fortranlib_test_F03-shared
-        ${HDF5_F90_TEST_LIBSH_TARGET}
-        ${HDF5_F90_LIBSH_TARGET}
-        ${HDF5_LIBSH_TARGET}
-    )
-    if (WIN32 AND MSVC)
-      target_link_libraries (fortranlib_test_F03-shared "ws2_32.lib")
-    endif (WIN32 AND MSVC)
-    target_include_directories (fortranlib_test_F03-shared PRIVATE ${CMAKE_Fortran_MODULE_DIRECTORY}/shared)
-    set_target_properties (fortranlib_test_F03-shared PROPERTIES
-        LINKER_LANGUAGE Fortran
-        FOLDER test/fortran
-        Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/shared
+      Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/shared
   )
-  endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-endif (HDF5_ENABLE_F2003)
+  add_dependencies (fortranlib_test_F03-shared ${HDF5_F90_TEST_LIBSH_TARGET})
+endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 
 #-- Adding test for fflush1
-add_executable (fflush1 fflush1.f90)
+add_executable (fflush1 fflush1.F90)
 TARGET_NAMING (fflush1 STATIC)
 TARGET_FORTRAN_PROPERTIES (fflush1 STATIC " " " ")
 target_link_libraries (fflush1
@@ -309,8 +354,10 @@ set_target_properties (fflush1 PROPERTIES
     FOLDER test/fortran
     Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/static
 )
+add_dependencies (fflush1 ${HDF5_F90_TEST_LIB_TARGET})
+
 if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-  add_executable (fflush1-shared fflush1.f90)
+  add_executable (fflush1-shared fflush1.F90)
   TARGET_NAMING (fflush1-shared SHARED)
   TARGET_FORTRAN_PROPERTIES (fflush1-shared SHARED " " " ")
   target_link_libraries (fflush1-shared
@@ -327,10 +374,11 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
         FOLDER test/fortran
         Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/shared
   )
+  add_dependencies (fflush1-shared ${HDF5_F90_TEST_LIBSH_TARGET})
 endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 
 #-- Adding test for fflush2
-add_executable (fflush2 fflush2.f90)
+add_executable (fflush2 fflush2.F90)
 TARGET_NAMING (fflush2 STATIC)
 TARGET_FORTRAN_PROPERTIES (fflush2 STATIC " " " ")
 target_link_libraries (fflush2
@@ -347,8 +395,10 @@ set_target_properties (fflush2 PROPERTIES
     FOLDER test/fortran
     Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/static
 )
+add_dependencies (fflush2 ${HDF5_F90_TEST_LIB_TARGET})
+
 if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-  add_executable (fflush2-shared fflush2.f90)
+  add_executable (fflush2-shared fflush2.F90)
   TARGET_NAMING (fflush2-shared SHARED)
   TARGET_FORTRAN_PROPERTIES (fflush2-shared SHARED " " " ")
   target_link_libraries (fflush2-shared
@@ -365,6 +415,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
         FOLDER test/fortran
         Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/shared
   )
+  add_dependencies (fflush2-shared ${HDF5_F90_TEST_LIBSH_TARGET})
 endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 
 include (CMakeTests.cmake)
diff --git a/fortran/test/H5_test_buildiface.F90 b/fortran/test/H5_test_buildiface.F90
new file mode 100644
index 0000000..30687df
--- /dev/null
+++ b/fortran/test/H5_test_buildiface.F90
@@ -0,0 +1,306 @@
+!****p* Program/H5_buildiface
+!
+! NAME
+!  Executable: H5_buildiface
+!
+! FILE
+!  fortran/src/H5_buildiface.f90
+!
+! PURPOSE
+!  This stand alone program is used at build time to generate the program
+!  H5fortran_detect.f90. It cycles through all the available KIND parameters for
+!  integers and reals. The appropriate program and subroutines are then generated
+!  depending on which of the KIND values are found.
+!
+! NOTES
+!  This program uses the Fortran 2008 intrinsic function STORAGE_SIZE or SIZEOF 
+!  depending on availablity.It generates code that makes use of 
+!  STORAGE_SIZE/SIZEOF in H5fortran_detect.f90. STORAGE_SIZE is standard
+!  compliant and should always be chosen over SIZEOF.
+!
+!  The availability of STORAGE_SIZE/SIZEOF is checked at configure time and the TRUE/FALSE
+!  condition is set in the configure variable "FORTRAN_HAVE_STORAGE_SIZE" or
+!  "FORTRAN_HAVE_SIZEOF".
+!
+!  The use of C_SIZOF(X) is not used since the argument X must be an interoperable
+!  data entity.
+!
+! COPYRIGHT
+!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!  Copyright by The HDF Group.                                                 *
+!  Copyright by the Board of Trustees of the University of Illinois.           *
+!  All rights reserved.                                                        *
+!                                                                              *
+!  This file is part of HDF5.  The full HDF5 copyright notice, including       *
+!  terms governing use, modification, and redistribution, is contained in      *
+!  the files COPYING and Copyright.html.  COPYING can be found at the root     *
+!  of the source code distribution tree; Copyright.html can be found at the    *
+!  root level of an installed copy of the electronic HDF5 document set and     *
+!  is linked from the top-level documents page.  It can also be found at       *
+!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have            *
+!  access to either file, you may request a copy from help at hdfgroup.org.       *
+!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!
+!*****
+
+#include <H5config_f.inc>
+
+PROGRAM H5_test_buildiface
+  USE, INTRINSIC :: ISO_C_BINDING
+  IMPLICIT NONE
+
+! These values are valid REAL KINDs (with corresponding C float) found during configure
+  H5_H5CONFIG_F_NUM_RKIND
+  H5_H5CONFIG_F_RKIND
+! These values are valid INTEGER KINDs (with corresponding C integer) found during configure
+  H5_H5CONFIG_F_NUM_IKIND
+  H5_H5CONFIG_F_IKIND
+
+  INTEGER :: i, j, k
+  INTEGER :: ji, jr, jd
+#ifdef H5_FORTRAN_HAVE_C_LONG_DOUBLE
+  REAL(KIND=C_LONG_DOUBLE) :: c_longdble
+#endif
+  REAL(KIND=C_DOUBLE) :: c_dble
+  REAL(KIND=C_FLOAT) :: c_flt
+  INTEGER :: sizeof_var
+  CHARACTER(LEN=2) :: chr2
+! subroutine rank of array being passed in
+  CHARACTER(LEN=2), DIMENSION(1:8), PARAMETER :: chr_rank=(/"_0","_1","_2","_3","_4","_5","_6","_7"/)
+! rank definitions
+  CHARACTER(LEN=70), DIMENSION(1:8), PARAMETER :: rank_dim_line=(/ &
+       '                                                                    ', &
+       ', DIMENSION(dims(1))                                                ', &
+       ', DIMENSION(dims(1),dims(2))                                        ', &
+       ', DIMENSION(dims(1),dims(2),dims(3))                                ', &
+       ', DIMENSION(dims(1),dims(2),dims(3),dims(4))                        ', &
+       ', DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5))                ', &
+       ', DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6))        ', &
+       ', DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7))' &
+            /)
+! pointer to the buffer
+  CHARACTER(LEN=37), DIMENSION(1:8), PARAMETER :: f_ptr_line=(/ &
+       '    f_ptr = C_LOC(buf)               ', &
+       '    f_ptr = C_LOC(buf(1))            ', &
+       '    f_ptr = C_LOC(buf(1,1))          ', &
+       '    f_ptr = C_LOC(buf(1,1,1))        ', &
+       '    f_ptr = C_LOC(buf(1,1,1,1))      ', &
+       '    f_ptr = C_LOC(buf(1,1,1,1,1))    ', &
+       '    f_ptr = C_LOC(buf(1,1,1,1,1,1))  ', &
+       '    f_ptr = C_LOC(buf(1,1,1,1,1,1,1))' &
+            /)
+
+! Generate Fortran Check routines for the tests KIND interfaces.
+
+  OPEN(11,FILE='tf_gen.F90')
+  WRITE(11,'(40(A,/))') &
+'!****h* ROBODoc/TH5_MISC_gen.F90',&
+'!',&
+'! NAME',&
+'!  TH5_MISC_gen',&
+'! ',&
+'! PURPOSE',&
+'!  This module is generated at build by H5_test_buildiface.F90 to handle checking ',&
+'!  in the tests all the detected KINDs.',&
+'!',&
+'! COPYRIGHT',&
+'! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *',&
+'!   Copyright by The HDF Group.                                               *',&
+'!   All rights reserved.                                                      *',&
+'!                                                                             *',&
+'!   This file is part of HDF5.  The full HDF5 copyright notice, including     *',&
+'!   terms governing use, modification, and redistribution, is contained in    *',&
+'!   the files COPYING and Copyright.html.  COPYING can be found at the root   *',&
+'!   of the source code distribution tree; Copyright.html can be found at the  *',&
+'!   root level of an installed copy of the electronic HDF5 document set and   *',&
+'!   is linked from the top-level documents page.  It can also be found at     *',&
+'!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *',&
+'!   access to either file, you may request a copy from help at hdfgroup.org.     *',&
+'! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *',&
+'!',&
+'! AUTHOR',&
+'!  H5_test_buildiface.F90',&
+'!',&
+'!*****'
+
+  WRITE(11,'(a)') "MODULE TH5_MISC_gen"
+
+  WRITE(11,'(A)') '  USE, INTRINSIC :: ISO_C_BINDING'
+  
+! Interfaces for validating REALs, INTEGERs, CHARACTERs, LOGICALs
+
+  WRITE(11,'(A)') '  INTERFACE verify'
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     WRITE(11,'(A)') "     MODULE PROCEDURE verify_real_kind_"//TRIM(ADJUSTL(chr2))
+  END DO
+  DO i = 1, num_ikinds
+     j = ikind(i)
+     WRITE(chr2,'(I2)') j
+     WRITE(11,'(A)') "     MODULE PROCEDURE verify_integer_kind_"//TRIM(ADJUSTL(chr2))
+  END DO
+  WRITE(11,'(A)') "     MODULE PROCEDURE verify_character"
+  WRITE(11,'(A)') "     MODULE PROCEDURE verify_logical"
+  WRITE(11,'(A)') "  END INTERFACE"
+
+  WRITE(11,'(A)') '  INTERFACE check_real_eq'
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     WRITE(11,'(A)') "     MODULE PROCEDURE real_eq_kind_"//TRIM(ADJUSTL(chr2))
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+  WRITE(11,'(A)') 'CONTAINS'
+
+! ***************************
+! VALIDATE INTEGERS
+! ***************************
+  DO i = 1, num_ikinds
+     k = ikind(i)
+     WRITE(chr2,'(I2)') k
+! DLL definitions for windows
+     WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_TEST_DLL)'
+     WRITE(11,'(A)') '!DEC$attributes dllexport :: verify_integer_kind_'//TRIM(ADJUSTL(chr2))
+     WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API
+     WRITE(11,'(A)') '  SUBROUTINE verify_integer_kind_'//TRIM(ADJUSTL(chr2))//'(string,value,correct_value,total_error)'
+     WRITE(11,'(A)') '    IMPLICIT NONE'
+     WRITE(11,'(A)') '    CHARACTER(LEN=*) :: string'
+     WRITE(11,'(A)') '    INTEGER(KIND='//TRIM(ADJUSTL(chr2))//') :: value, correct_value'
+     WRITE(11,'(A)') '    INTEGER :: total_error'
+     WRITE(11,'(A)') '    IF (value .NE. correct_value) THEN'
+     WRITE(11,'(A)') '       total_error=total_error+1'
+     WRITE(11,'(A)') '       WRITE(*,*) "ERROR: INCORRECT INTEGER VALIDATION ", string'
+     WRITE(11,'(A)') '    ENDIF'
+     WRITE(11,'(A)') '  END SUBROUTINE verify_integer_kind_'//TRIM(ADJUSTL(chr2))
+ ENDDO
+
+! ***************************
+! VALIDATE REALS
+! ***************************
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+! DLL definitions for windows
+     WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_TEST_DLL)'
+     WRITE(11,'(A)') '!DEC$attributes dllexport :: verify_real_kind_'//TRIM(ADJUSTL(chr2))
+     WRITE(11,'(A)') '!DEC$endif'
+    
+! Subroutine API 
+     WRITE(11,'(A)') '  SUBROUTINE verify_real_kind_'//TRIM(ADJUSTL(chr2))//'(string,value,correct_value,total_error)'
+     WRITE(11,'(A)') '    IMPLICIT NONE'
+     WRITE(11,'(A)') '    CHARACTER(LEN=*) :: string'
+     WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//') :: value, correct_value'
+     WRITE(11,'(A)') '    INTEGER :: total_error'
+     WRITE(11,'(A)') '    IF (.NOT.real_eq_kind_'//TRIM(ADJUSTL(chr2))//'( value, correct_value) ) THEN'
+     WRITE(11,'(A)') '       total_error=total_error+1'
+     WRITE(11,'(A)') '       WRITE(*,*) "ERROR: INCORRECT REAL VALIDATION ", string'
+     WRITE(11,'(A)') '    ENDIF'
+     WRITE(11,'(A)') '  END SUBROUTINE verify_real_kind_'//TRIM(ADJUSTL(chr2))
+
+
+! ***********************************
+! TEST IF TWO REAL NUMBERS ARE EQUAL
+! ***********************************
+
+!   [1] The test performed is
+!
+!         ABS( x - y ) < ( ULP * SPACING( MAX(ABS(x),ABS(y)) ) )
+!
+!       The numbers are considered equal if true
+!
+!       The intrinsic function SPACING(x) returns the absolute spacing of numbers
+!       near the value of x,
+!
+!                      {     EXPONENT(x)-DIGITS(x)
+!                      {  2.0                        for x /= 0
+!         SPACING(x) = {
+!                      {  
+!                      {  TINY(x)                    for x == 0
+!
+!       The ULP optional argument scales the comparison:
+!
+!         Unit of data precision. The acronym stands for "unit in
+!         the last place," the smallest possible increment or decrement
+!         that can be made using a machine's floating point arithmetic.
+!         A 0.5 ulp maximum error is the best you could hope for, since
+!         this corresponds to always rounding to the nearest representable
+!         floating-point number. Value must be positive - if a negative
+!         value is supplied, the absolute value is used.
+!         If not specified, the default value is 1.
+!
+!       James Van Buskirk and James Giles suggested this method for floating
+!       point comparisons in the comp.lang.fortran newsgroup.
+!
+!       Reference: [1] Paul van Delst,  paul.vandelst at ssec.wisc.edu
+
+     WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_TEST_DLL)'
+     WRITE(11,'(A)') '!DEC$attributes dllexport :: real_eq_kind_'//TRIM(ADJUSTL(chr2))
+     WRITE(11,'(A)') '!DEC$endif'
+     WRITE(11,'(A)') '  LOGICAL FUNCTION real_eq_kind_'//TRIM(ADJUSTL(chr2))//'(a,b,ulp)'
+     WRITE(11,'(A)') '    IMPLICIT NONE'
+     WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'), INTENT (in):: a,b'
+     WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//') :: Rel'
+     WRITE(11,'(A)') '    INTEGER,        OPTIONAL, INTENT( IN )  :: ulp'
+     WRITE(11,'(A)') '    IF ( PRESENT( ulp ) )  Rel = REAL( ABS(ulp), '//TRIM(ADJUSTL(chr2))//')'
+     WRITE(11,'(A)') '    Rel = 1.0_'//TRIM(ADJUSTL(chr2))
+     WRITE(11,'(A)') '    real_eq_kind_'//TRIM(ADJUSTL(chr2))//' = ABS( a - b ) < ( Rel * SPACING( MAX(ABS(a),ABS(b)) ) )'
+     WRITE(11,'(A)') '  END FUNCTION real_eq_kind_'//TRIM(ADJUSTL(chr2))
+  ENDDO
+
+! ***************************
+! VALIDATE CHARACTER STRINGS
+! ***************************
+
+! DLL definitions for windows
+  WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_TEST_DLL)'
+  WRITE(11,'(A)') '!DEC$attributes dllexport :: verify_character'
+  WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API 
+  WRITE(11,'(A)') '  SUBROUTINE verify_character(string,value,correct_value,total_error)'
+  WRITE(11,'(A)') '    IMPLICIT NONE'
+  WRITE(11,'(A)') '    CHARACTER*(*) :: string'
+  WRITE(11,'(A)') '    CHARACTER*(*) :: value, correct_value'
+  WRITE(11,'(A)') '    INTEGER :: total_error'
+  WRITE(11,'(A)') '    IF (TRIM(value) .NE. TRIM(correct_value)) THEN'
+  WRITE(11,'(A)') '       total_error = total_error + 1'
+  WRITE(11,'(A)') '       WRITE(*,*) "ERROR: INCORRECT VALIDATION ", string'
+  WRITE(11,'(A)') '    ENDIF'
+  WRITE(11,'(A)') '  END SUBROUTINE verify_character'
+
+! ***************************
+! VALIDATE LOGICAL
+! ***************************
+
+! DLL definitions for windows
+  WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_TEST_DLL)'
+  WRITE(11,'(A)') '!DEC$attributes dllexport :: verify_logical'
+  WRITE(11,'(A)') '!DEC$endif'
+! Subroutine API
+  WRITE(11,'(A)') '  SUBROUTINE verify_logical(string,value,correct_value,total_error)'
+  WRITE(11,'(A)') '    IMPLICIT NONE'
+  WRITE(11,'(A)') '    CHARACTER(LEN=*) :: string'
+  WRITE(11,'(A)') '    LOGICAL :: value, correct_value'
+  WRITE(11,'(A)') '    INTEGER :: total_error'
+  WRITE(11,'(A)') '    IF (value .NEQV. correct_value) THEN'
+  WRITE(11,'(A)') '       total_error = total_error + 1'
+  WRITE(11,'(A)') '       WRITE(*,*) "ERROR: INCORRECT VALIDATION ", string'
+  WRITE(11,'(A)') '    ENDIF'
+  
+  WRITE(11,'(A)') '  END SUBROUTINE verify_logical'
+
+  WRITE(11,'(A)') "END MODULE TH5_MISC_gen"
+
+  CLOSE(11)
+
+END PROGRAM H5_test_buildiface
+
+
+
diff --git a/fortran/test/Makefile.am b/fortran/test/Makefile.am
index 735ab7a..60f9f53 100644
--- a/fortran/test/Makefile.am
+++ b/fortran/test/Makefile.am
@@ -36,60 +36,25 @@ else
    AM_LDFLAGS+=-static
 endif
 
-# Check if the compiler supports the Fortran 2003 standard
-# which should include the intrinsic module iso_c_binding
-if FORTRAN_2003_CONDITIONAL_F
-   ff_PREFIX = F03
-else
-   ff_PREFIX = F90
-endif
-
 # Our main targets, the tests themselves
-TEST_PROG=fortranlib_test fflush1 fflush2 fortranlib_test_1_8
-
-if FORTRAN_2003_CONDITIONAL_F
-   TEST_PROG += fortranlib_test_F03
-endif
+TEST_PROG=fortranlib_test fflush1 fflush2 fortranlib_test_1_8 fortranlib_test_F03
 
 check_PROGRAMS=$(TEST_PROG)
 
-if FORTRAN_HAVE_STORAGE_SIZE
-if FORTRAN_HAVE_C_SIZEOF
-    libh5test_fortran_la_SOURCES = tf_F08.f90
-else
-    libh5test_fortran_la_SOURCES = tf_F03.f90
-endif
-else
-if FORTRAN_2003_CONDITIONAL_F
-  libh5test_fortran_la_SOURCES = tf_F03.f90
-else
-  libh5test_fortran_la_SOURCES = tf_F90.f90
-endif
-endif
+libh5test_fortran_la_SOURCES = tf_gen.F90 tf.F90  t.c
 
-# tf.f90 depends on either tf_F08.f90 or tf_F03.f90 so they need to be
-# compiled first
-libh5test_fortran_la_SOURCES += tf.f90 t.c
+fortranlib_test_SOURCES = tH5F.F90 tH5D.F90 tH5R.F90 tH5S.F90 tH5T.F90 tH5VL.F90 tH5Z.F90 \
+        tH5Sselect.F90 tH5P.F90 tH5A.F90 tH5I.F90 tH5G.F90 tH5E.F90 tHDF5.F90 fortranlib_test.F90
 
-# Source files are used for both the library and fortranlib_test.
-# Automake will complain about this without the following workaround.
-fortranlib_test_FCFLAGS=$(AM_FCFLAGS)
-fortranlib_test_CFLAGS=$(AM_CFLAGS)
+fortranlib_test_1_8_SOURCES = tH5O.F90 tH5A_1_8.F90 tH5G_1_8.F90 tH5MISC_1_8.F90 tHDF5_1_8.F90 \
+        fortranlib_test_1_8.F90
 
-fortranlib_test_SOURCES = tH5F.f90 tH5D.f90 tH5R.f90 tH5S.f90 tH5T.f90 tH5VL.f90 tH5Z.f90 \
-        tH5Sselect.f90 tH5P.f90 tH5A.f90 tH5I.f90 tH5G.f90 tH5E.f90 tHDF5.f90 fortranlib_test.f90
+fortranlib_test_F03_SOURCES = tH5E_F03.F90 tH5F_F03.F90 tH5L_F03.F90 \
+        tH5O_F03.F90 tH5P_F03.F90 tH5T_F03.F90 tHDF5_F03.F90 fortranlib_test_F03.F90
 
-fortranlib_test_1_8_SOURCES = tH5O.f90 tH5A_1_8.f90 tH5G_1_8.f90 tH5MISC_1_8.f90 tHDF5_1_8.f90\
-        fortranlib_test_1_8.f90
 
-if FORTRAN_2003_CONDITIONAL_F
-   fortranlib_test_F03_SOURCES = tH5E_F03.f90 tH5F_F03.f90 tH5L_F03.f90 \
-        tH5O_F03.f90 tH5P_F03.f90 tH5T_F03.f90 tHDF5_F03.f90 fortranlib_test_F03.f90
-endif
-
-
-fflush1_SOURCES=fflush1.f90
-fflush2_SOURCES=fflush2.f90
+fflush1_SOURCES=fflush1.F90
+fflush2_SOURCES=fflush2.F90
 
 # The tests depend on both fortran libraries and both main libraries.
 LDADD=libh5test_fortran.la $(LIBH5TEST) $(LIBH5F) $(LIBHDF5)
@@ -106,15 +71,34 @@ maintainer-clean-local: clean-local
 distclean-local: clean-local
 clean-local:
 	@if test -n "$(F9XMODEXT)" && test "X$(F9XMODEXT)" != "Xo"; then \
-	  $(RM) *.$(F9XMODEXT);                                         \
+	  $(RM) *.$(F9XMODEXT) tf_gen.F90;                                         \
 	fi
 
 # Mark this directory as part of the Fortran API (this affects output
 # from tests in conclude.am)
 FORTRAN_API=yes
 
+# helper program we need to build.
+noinst_PROGRAMS = H5_test_buildiface
+
+# H5_test_buildiface.F90 generates all the test APIs that have a KIND type associated
+# with them.
+
+tf_gen.F90: H5_test_buildiface$(EXEEXT)
+	$(RUNSERIAL) ./H5_test_buildiface$(EXEEXT)
+
+# H5_test_buildiface.F90 is included in the distribution, and Automake knows
+# how to compile a fortran program given its sources.
+
+H5_test_buildiface_SOURCES = H5_test_buildiface.F90
+
+# The build of the H5_test_buildiface does depend on any libraries, so set it 
+# to nothing.
+
+H5_test_buildiface_LDADD = 
+
 # fflush2 depends on files created by fflush1
 fflush2.chkexe_: fflush1.chkexe_
 
 
-include $(top_srcdir)/config/conclude.am
+include $(top_srcdir)/config/conclude_fc.am
diff --git a/fortran/test/Makefile.in b/fortran/test/Makefile.in
index 4ec1ad5..eda2acf 100644
--- a/fortran/test/Makefile.in
+++ b/fortran/test/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -14,8 +14,23 @@
 
 @SET_MAKE@
 
+# Makefile.am include fragment with Fortran helper rules and macros.
+
+# AM_FCCPPFLAGS, FCCPPFLAGS are currently not used.
+
+
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -78,53 +93,44 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(top_srcdir)/bin/depcomp $(top_srcdir)/bin/test-driver
 
 # Some Fortran compilers can't build shared libraries, so sometimes we
 # want to build a shared C library and a static Fortran library.  If so,
 # pass the -static flag to the library linker.
 @FORTRAN_SHARED_CONDITIONAL_FALSE at am__append_1 = -static
- at FORTRAN_2003_CONDITIONAL_F_TRUE@am__append_2 = fortranlib_test_F03
-check_PROGRAMS = $(am__EXEEXT_2)
-TESTS = $(am__EXEEXT_2)
+check_PROGRAMS = $(am__EXEEXT_1)
+noinst_PROGRAMS = H5_test_buildiface$(EXEEXT)
+TESTS = $(am__EXEEXT_1)
 subdir = fortran/test
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 LTLIBRARIES = $(noinst_LTLIBRARIES)
 libh5test_fortran_la_LIBADD =
-am__libh5test_fortran_la_SOURCES_DIST = tf_F90.f90 tf.f90 t.c \
-	tf_F03.f90 tf_F08.f90
- at FORTRAN_2003_CONDITIONAL_F_FALSE@@FORTRAN_HAVE_STORAGE_SIZE_FALSE at am_libh5test_fortran_la_OBJECTS = tf_F90.lo \
- at FORTRAN_2003_CONDITIONAL_F_FALSE@@FORTRAN_HAVE_STORAGE_SIZE_FALSE@	tf.lo \
- at FORTRAN_2003_CONDITIONAL_F_FALSE@@FORTRAN_HAVE_STORAGE_SIZE_FALSE@	t.lo
- at FORTRAN_2003_CONDITIONAL_F_TRUE@@FORTRAN_HAVE_STORAGE_SIZE_FALSE at am_libh5test_fortran_la_OBJECTS = tf_F03.lo \
- at FORTRAN_2003_CONDITIONAL_F_TRUE@@FORTRAN_HAVE_STORAGE_SIZE_FALSE@	tf.lo \
- at FORTRAN_2003_CONDITIONAL_F_TRUE@@FORTRAN_HAVE_STORAGE_SIZE_FALSE@	t.lo
- at FORTRAN_HAVE_C_SIZEOF_FALSE@@FORTRAN_HAVE_STORAGE_SIZE_TRUE at am_libh5test_fortran_la_OBJECTS = tf_F03.lo \
- at FORTRAN_HAVE_C_SIZEOF_FALSE@@FORTRAN_HAVE_STORAGE_SIZE_TRUE@	tf.lo \
- at FORTRAN_HAVE_C_SIZEOF_FALSE@@FORTRAN_HAVE_STORAGE_SIZE_TRUE@	t.lo
- at FORTRAN_HAVE_C_SIZEOF_TRUE@@FORTRAN_HAVE_STORAGE_SIZE_TRUE at am_libh5test_fortran_la_OBJECTS = tf_F08.lo \
- at FORTRAN_HAVE_C_SIZEOF_TRUE@@FORTRAN_HAVE_STORAGE_SIZE_TRUE@	tf.lo \
- at FORTRAN_HAVE_C_SIZEOF_TRUE@@FORTRAN_HAVE_STORAGE_SIZE_TRUE@	t.lo
+am_libh5test_fortran_la_OBJECTS = tf_gen.lo tf.lo t.lo
 libh5test_fortran_la_OBJECTS = $(am_libh5test_fortran_la_OBJECTS)
 AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
- at FORTRAN_2003_CONDITIONAL_F_TRUE@am__EXEEXT_1 =  \
- at FORTRAN_2003_CONDITIONAL_F_TRUE@	fortranlib_test_F03$(EXEEXT)
-am__EXEEXT_2 = fortranlib_test$(EXEEXT) fflush1$(EXEEXT) \
-	fflush2$(EXEEXT) fortranlib_test_1_8$(EXEEXT) $(am__EXEEXT_1)
+am__EXEEXT_1 = fortranlib_test$(EXEEXT) fflush1$(EXEEXT) \
+	fflush2$(EXEEXT) fortranlib_test_1_8$(EXEEXT) \
+	fortranlib_test_F03$(EXEEXT)
+PROGRAMS = $(noinst_PROGRAMS)
+am_H5_test_buildiface_OBJECTS = H5_test_buildiface.$(OBJEXT)
+H5_test_buildiface_OBJECTS = $(am_H5_test_buildiface_OBJECTS)
+H5_test_buildiface_DEPENDENCIES =
 am_fflush1_OBJECTS = fflush1.$(OBJEXT)
 fflush1_OBJECTS = $(am_fflush1_OBJECTS)
 fflush1_LDADD = $(LDADD)
@@ -135,23 +141,15 @@ fflush2_OBJECTS = $(am_fflush2_OBJECTS)
 fflush2_LDADD = $(LDADD)
 fflush2_DEPENDENCIES = libh5test_fortran.la $(LIBH5TEST) $(LIBH5F) \
 	$(LIBHDF5)
-am_fortranlib_test_OBJECTS = fortranlib_test-tH5F.$(OBJEXT) \
-	fortranlib_test-tH5D.$(OBJEXT) fortranlib_test-tH5R.$(OBJEXT) \
-	fortranlib_test-tH5S.$(OBJEXT) fortranlib_test-tH5T.$(OBJEXT) \
-	fortranlib_test-tH5VL.$(OBJEXT) fortranlib_test-tH5Z.$(OBJEXT) \
-	fortranlib_test-tH5Sselect.$(OBJEXT) \
-	fortranlib_test-tH5P.$(OBJEXT) fortranlib_test-tH5A.$(OBJEXT) \
-	fortranlib_test-tH5I.$(OBJEXT) fortranlib_test-tH5G.$(OBJEXT) \
-	fortranlib_test-tH5E.$(OBJEXT) fortranlib_test-tHDF5.$(OBJEXT) \
-	fortranlib_test-fortranlib_test.$(OBJEXT)
+am_fortranlib_test_OBJECTS = tH5F.$(OBJEXT) tH5D.$(OBJEXT) \
+	tH5R.$(OBJEXT) tH5S.$(OBJEXT) tH5T.$(OBJEXT) tH5VL.$(OBJEXT) \
+	tH5Z.$(OBJEXT) tH5Sselect.$(OBJEXT) tH5P.$(OBJEXT) \
+	tH5A.$(OBJEXT) tH5I.$(OBJEXT) tH5G.$(OBJEXT) tH5E.$(OBJEXT) \
+	tHDF5.$(OBJEXT) fortranlib_test.$(OBJEXT)
 fortranlib_test_OBJECTS = $(am_fortranlib_test_OBJECTS)
 fortranlib_test_LDADD = $(LDADD)
 fortranlib_test_DEPENDENCIES = libh5test_fortran.la $(LIBH5TEST) \
 	$(LIBH5F) $(LIBHDF5)
-fortranlib_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC \
-	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(FCLD) \
-	$(fortranlib_test_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
-	-o $@
 am_fortranlib_test_1_8_OBJECTS = tH5O.$(OBJEXT) tH5A_1_8.$(OBJEXT) \
 	tH5G_1_8.$(OBJEXT) tH5MISC_1_8.$(OBJEXT) tHDF5_1_8.$(OBJEXT) \
 	fortranlib_test_1_8.$(OBJEXT)
@@ -159,18 +157,10 @@ fortranlib_test_1_8_OBJECTS = $(am_fortranlib_test_1_8_OBJECTS)
 fortranlib_test_1_8_LDADD = $(LDADD)
 fortranlib_test_1_8_DEPENDENCIES = libh5test_fortran.la $(LIBH5TEST) \
 	$(LIBH5F) $(LIBHDF5)
-am__fortranlib_test_F03_SOURCES_DIST = tH5E_F03.f90 tH5F_F03.f90 \
-	tH5L_F03.f90 tH5O_F03.f90 tH5P_F03.f90 tH5T_F03.f90 \
-	tHDF5_F03.f90 fortranlib_test_F03.f90
- at FORTRAN_2003_CONDITIONAL_F_TRUE@am_fortranlib_test_F03_OBJECTS =  \
- at FORTRAN_2003_CONDITIONAL_F_TRUE@	tH5E_F03.$(OBJEXT) \
- at FORTRAN_2003_CONDITIONAL_F_TRUE@	tH5F_F03.$(OBJEXT) \
- at FORTRAN_2003_CONDITIONAL_F_TRUE@	tH5L_F03.$(OBJEXT) \
- at FORTRAN_2003_CONDITIONAL_F_TRUE@	tH5O_F03.$(OBJEXT) \
- at FORTRAN_2003_CONDITIONAL_F_TRUE@	tH5P_F03.$(OBJEXT) \
- at FORTRAN_2003_CONDITIONAL_F_TRUE@	tH5T_F03.$(OBJEXT) \
- at FORTRAN_2003_CONDITIONAL_F_TRUE@	tHDF5_F03.$(OBJEXT) \
- at FORTRAN_2003_CONDITIONAL_F_TRUE@	fortranlib_test_F03.$(OBJEXT)
+am_fortranlib_test_F03_OBJECTS = tH5E_F03.$(OBJEXT) tH5F_F03.$(OBJEXT) \
+	tH5L_F03.$(OBJEXT) tH5O_F03.$(OBJEXT) tH5P_F03.$(OBJEXT) \
+	tH5T_F03.$(OBJEXT) tHDF5_F03.$(OBJEXT) \
+	fortranlib_test_F03.$(OBJEXT)
 fortranlib_test_F03_OBJECTS = $(am_fortranlib_test_F03_OBJECTS)
 fortranlib_test_F03_LDADD = $(LDADD)
 fortranlib_test_F03_DEPENDENCIES = libh5test_fortran.la $(LIBH5TEST) \
@@ -187,10 +177,22 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
+AM_V_PPFC = $(am__v_PPFC_ at AM_V@)
+am__v_PPFC_ = $(am__v_PPFC_ at AM_DEFAULT_V@)
+am__v_PPFC_0 = @echo "  PPFC    " $@;
+am__v_PPFC_1 = 
+FCLD = $(FC)
+FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_FCLD = $(am__v_FCLD_ at AM_V@)
+am__v_FCLD_ = $(am__v_FCLD_ at AM_DEFAULT_V@)
+am__v_FCLD_0 = @echo "  FCLD    " $@;
+am__v_FCLD_1 = 
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
@@ -209,28 +211,14 @@ AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-FCCOMPILE = $(FC) $(AM_FCFLAGS) $(FCFLAGS)
-LTFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS)
-AM_V_FC = $(am__v_FC_ at AM_V@)
-am__v_FC_ = $(am__v_FC_ at AM_DEFAULT_V@)
-am__v_FC_0 = @echo "  FC      " $@;
-am__v_FC_1 = 
-FCLD = $(FC)
-FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_FCLD = $(am__v_FCLD_ at AM_V@)
-am__v_FCLD_ = $(am__v_FCLD_ at AM_DEFAULT_V@)
-am__v_FCLD_0 = @echo "  FCLD    " $@;
-am__v_FCLD_1 = 
-SOURCES = $(libh5test_fortran_la_SOURCES) $(fflush1_SOURCES) \
+SOURCES = $(libh5test_fortran_la_SOURCES) \
+	$(H5_test_buildiface_SOURCES) $(fflush1_SOURCES) \
+	$(fflush2_SOURCES) $(fortranlib_test_SOURCES) \
+	$(fortranlib_test_1_8_SOURCES) $(fortranlib_test_F03_SOURCES)
+DIST_SOURCES = $(libh5test_fortran_la_SOURCES) \
+	$(H5_test_buildiface_SOURCES) $(fflush1_SOURCES) \
 	$(fflush2_SOURCES) $(fortranlib_test_SOURCES) \
 	$(fortranlib_test_1_8_SOURCES) $(fortranlib_test_F03_SOURCES)
-DIST_SOURCES = $(am__libh5test_fortran_la_SOURCES_DIST) \
-	$(fflush1_SOURCES) $(fflush2_SOURCES) \
-	$(fortranlib_test_SOURCES) $(fortranlib_test_1_8_SOURCES) \
-	$(am__fortranlib_test_F03_SOURCES_DIST)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -457,6 +445,10 @@ am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
 TEST_LOGS = $(am__test_logs2:.sh.log=.log)
 SH_LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
 SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/depcomp \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am \
+	$(top_srcdir)/config/conclude_fc.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -477,7 +469,6 @@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@ -I$(top_builddir)/fortran/src \
 	$(F9XMODFLAG)$(top_builddir)/fortran/src
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@ $(am__append_1)
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -522,14 +513,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -539,13 +538,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -587,9 +585,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -732,55 +741,21 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.h5 *.raw
 
 # The Fortran test library
 noinst_LTLIBRARIES = libh5test_fortran.la
- at FORTRAN_2003_CONDITIONAL_F_FALSE@ff_PREFIX = F90
-
-# Check if the compiler supports the Fortran 2003 standard
-# which should include the intrinsic module iso_c_binding
- at FORTRAN_2003_CONDITIONAL_F_TRUE@ff_PREFIX = F03
 
 # Our main targets, the tests themselves
-TEST_PROG = fortranlib_test fflush1 fflush2 fortranlib_test_1_8 \
-	$(am__append_2)
-
-# tf.f90 depends on either tf_F08.f90 or tf_F03.f90 so they need to be
-# compiled first
- at FORTRAN_2003_CONDITIONAL_F_FALSE@@FORTRAN_HAVE_STORAGE_SIZE_FALSE at libh5test_fortran_la_SOURCES = tf_F90.f90 \
- at FORTRAN_2003_CONDITIONAL_F_FALSE@@FORTRAN_HAVE_STORAGE_SIZE_FALSE@	tf.f90 \
- at FORTRAN_2003_CONDITIONAL_F_FALSE@@FORTRAN_HAVE_STORAGE_SIZE_FALSE@	t.c
-
-# tf.f90 depends on either tf_F08.f90 or tf_F03.f90 so they need to be
-# compiled first
- at FORTRAN_2003_CONDITIONAL_F_TRUE@@FORTRAN_HAVE_STORAGE_SIZE_FALSE at libh5test_fortran_la_SOURCES = tf_F03.f90 \
- at FORTRAN_2003_CONDITIONAL_F_TRUE@@FORTRAN_HAVE_STORAGE_SIZE_FALSE@	tf.f90 \
- at FORTRAN_2003_CONDITIONAL_F_TRUE@@FORTRAN_HAVE_STORAGE_SIZE_FALSE@	t.c
-
-# tf.f90 depends on either tf_F08.f90 or tf_F03.f90 so they need to be
-# compiled first
- at FORTRAN_HAVE_C_SIZEOF_FALSE@@FORTRAN_HAVE_STORAGE_SIZE_TRUE at libh5test_fortran_la_SOURCES = tf_F03.f90 \
- at FORTRAN_HAVE_C_SIZEOF_FALSE@@FORTRAN_HAVE_STORAGE_SIZE_TRUE@	tf.f90 \
- at FORTRAN_HAVE_C_SIZEOF_FALSE@@FORTRAN_HAVE_STORAGE_SIZE_TRUE@	t.c
-
-# tf.f90 depends on either tf_F08.f90 or tf_F03.f90 so they need to be
-# compiled first
- at FORTRAN_HAVE_C_SIZEOF_TRUE@@FORTRAN_HAVE_STORAGE_SIZE_TRUE at libh5test_fortran_la_SOURCES = tf_F08.f90 \
- at FORTRAN_HAVE_C_SIZEOF_TRUE@@FORTRAN_HAVE_STORAGE_SIZE_TRUE@	tf.f90 \
- at FORTRAN_HAVE_C_SIZEOF_TRUE@@FORTRAN_HAVE_STORAGE_SIZE_TRUE@	t.c
-
-# Source files are used for both the library and fortranlib_test.
-# Automake will complain about this without the following workaround.
-fortranlib_test_FCFLAGS = $(AM_FCFLAGS)
-fortranlib_test_CFLAGS = $(AM_CFLAGS)
-fortranlib_test_SOURCES = tH5F.f90 tH5D.f90 tH5R.f90 tH5S.f90 tH5T.f90 tH5VL.f90 tH5Z.f90 \
-        tH5Sselect.f90 tH5P.f90 tH5A.f90 tH5I.f90 tH5G.f90 tH5E.f90 tHDF5.f90 fortranlib_test.f90
-
-fortranlib_test_1_8_SOURCES = tH5O.f90 tH5A_1_8.f90 tH5G_1_8.f90 tH5MISC_1_8.f90 tHDF5_1_8.f90\
-        fortranlib_test_1_8.f90
-
- at FORTRAN_2003_CONDITIONAL_F_TRUE@fortranlib_test_F03_SOURCES = tH5E_F03.f90 tH5F_F03.f90 tH5L_F03.f90 \
- at FORTRAN_2003_CONDITIONAL_F_TRUE@        tH5O_F03.f90 tH5P_F03.f90 tH5T_F03.f90 tHDF5_F03.f90 fortranlib_test_F03.f90
-
-fflush1_SOURCES = fflush1.f90
-fflush2_SOURCES = fflush2.f90
+TEST_PROG = fortranlib_test fflush1 fflush2 fortranlib_test_1_8 fortranlib_test_F03
+libh5test_fortran_la_SOURCES = tf_gen.F90 tf.F90  t.c
+fortranlib_test_SOURCES = tH5F.F90 tH5D.F90 tH5R.F90 tH5S.F90 tH5T.F90 tH5VL.F90 tH5Z.F90 \
+        tH5Sselect.F90 tH5P.F90 tH5A.F90 tH5I.F90 tH5G.F90 tH5E.F90 tHDF5.F90 fortranlib_test.F90
+
+fortranlib_test_1_8_SOURCES = tH5O.F90 tH5A_1_8.F90 tH5G_1_8.F90 tH5MISC_1_8.F90 tHDF5_1_8.F90 \
+        fortranlib_test_1_8.F90
+
+fortranlib_test_F03_SOURCES = tH5E_F03.F90 tH5F_F03.F90 tH5L_F03.F90 \
+        tH5O_F03.F90 tH5P_F03.F90 tH5T_F03.F90 tHDF5_F03.F90 fortranlib_test_F03.F90
+
+fflush1_SOURCES = fflush1.F90
+fflush2_SOURCES = fflush2.F90
 
 # The tests depend on both fortran libraries and both main libraries.
 LDADD = libh5test_fortran.la $(LIBH5TEST) $(LIBH5F) $(LIBHDF5)
@@ -790,6 +765,16 @@ MOSTLYCLEANFILES = *.tmp
 # from tests in conclude.am)
 FORTRAN_API = yes
 
+# H5_test_buildiface.F90 is included in the distribution, and Automake knows
+# how to compile a fortran program given its sources.
+H5_test_buildiface_SOURCES = H5_test_buildiface.F90
+
+# The build of the H5_test_buildiface does depend on any libraries, so set it 
+# to nothing.
+H5_test_buildiface_LDADD = 
+PPFCCOMPILE = $(FC) $(FCDEFS) $(DEFAULT_INCLUDES)  $(FCINCLUDES) $(AM_FCCPPFLAGS) $(FCCPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)
+LTPPFCCOMPILE = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(PPFCCOMPILE)
+
 # Automake needs to be taught how to build lib, progs, and tests targets.
 # These will be filled in automatically for the most part (e.g.,
 # lib_LIBRARIES are built for lib target), but EXTRA_LIB, EXTRA_PROG, and
@@ -812,8 +797,8 @@ TEST_SCRIPT_PARA_CHKSH = $(TEST_SCRIPT_PARA:=.chkexe_)
 all: all-am
 
 .SUFFIXES:
-.SUFFIXES: .c .f90 .lo .log .o .obj .sh .sh$(EXEEXT) .trs
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
+.SUFFIXES: .F90 .c .f90 .lo .log .o .obj .sh .sh$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude_fc.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
@@ -825,7 +810,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign fortran/test/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign fortran/test/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -834,7 +818,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude_fc.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -868,6 +852,19 @@ clean-checkPROGRAMS:
 	echo " rm -f" $$list; \
 	rm -f $$list
 
+clean-noinstPROGRAMS:
+	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+H5_test_buildiface$(EXEEXT): $(H5_test_buildiface_OBJECTS) $(H5_test_buildiface_DEPENDENCIES) $(EXTRA_H5_test_buildiface_DEPENDENCIES) 
+	@rm -f H5_test_buildiface$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(H5_test_buildiface_OBJECTS) $(H5_test_buildiface_LDADD) $(LIBS)
+
 fflush1$(EXEEXT): $(fflush1_OBJECTS) $(fflush1_DEPENDENCIES) $(EXTRA_fflush1_DEPENDENCIES) 
 	@rm -f fflush1$(EXEEXT)
 	$(AM_V_FCLD)$(FCLINK) $(fflush1_OBJECTS) $(fflush1_LDADD) $(LIBS)
@@ -878,7 +875,7 @@ fflush2$(EXEEXT): $(fflush2_OBJECTS) $(fflush2_DEPENDENCIES) $(EXTRA_fflush2_DEP
 
 fortranlib_test$(EXEEXT): $(fortranlib_test_OBJECTS) $(fortranlib_test_DEPENDENCIES) $(EXTRA_fortranlib_test_DEPENDENCIES) 
 	@rm -f fortranlib_test$(EXEEXT)
-	$(AM_V_FCLD)$(fortranlib_test_LINK) $(fortranlib_test_OBJECTS) $(fortranlib_test_LDADD) $(LIBS)
+	$(AM_V_FCLD)$(FCLINK) $(fortranlib_test_OBJECTS) $(fortranlib_test_LDADD) $(LIBS)
 
 fortranlib_test_1_8$(EXEEXT): $(fortranlib_test_1_8_OBJECTS) $(fortranlib_test_1_8_DEPENDENCIES) $(EXTRA_fortranlib_test_1_8_DEPENDENCIES) 
 	@rm -f fortranlib_test_1_8$(EXEEXT)
@@ -896,6 +893,12 @@ distclean-compile:
 
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/t.Plo at am__quote@
 
+.F90.obj:
+	$(AM_V_PPFC)$(PPFCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.F90.lo:
+	$(AM_V_PPFC)$(LTPPFCCOMPILE) -c -o $@ $<
+
 .c.o:
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@@ -917,105 +920,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
-.f90.o:
-	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
-
-.f90.obj:
-	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) `$(CYGPATH_W) '$<'`
-
-.f90.lo:
-	$(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
-
-fortranlib_test-tH5F.o: tH5F.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5F.o $(FCFLAGS_f90) `test -f 'tH5F.f90' || echo '$(srcdir)/'`tH5F.f90
-
-fortranlib_test-tH5F.obj: tH5F.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5F.obj $(FCFLAGS_f90) `if test -f 'tH5F.f90'; then $(CYGPATH_W) 'tH5F.f90'; else $(CYGPATH_W) '$(srcdir)/tH5F.f90'; fi`
-
-fortranlib_test-tH5D.o: tH5D.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5D.o $(FCFLAGS_f90) `test -f 'tH5D.f90' || echo '$(srcdir)/'`tH5D.f90
-
-fortranlib_test-tH5D.obj: tH5D.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5D.obj $(FCFLAGS_f90) `if test -f 'tH5D.f90'; then $(CYGPATH_W) 'tH5D.f90'; else $(CYGPATH_W) '$(srcdir)/tH5D.f90'; fi`
-
-fortranlib_test-tH5R.o: tH5R.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5R.o $(FCFLAGS_f90) `test -f 'tH5R.f90' || echo '$(srcdir)/'`tH5R.f90
-
-fortranlib_test-tH5R.obj: tH5R.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5R.obj $(FCFLAGS_f90) `if test -f 'tH5R.f90'; then $(CYGPATH_W) 'tH5R.f90'; else $(CYGPATH_W) '$(srcdir)/tH5R.f90'; fi`
-
-fortranlib_test-tH5S.o: tH5S.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5S.o $(FCFLAGS_f90) `test -f 'tH5S.f90' || echo '$(srcdir)/'`tH5S.f90
-
-fortranlib_test-tH5S.obj: tH5S.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5S.obj $(FCFLAGS_f90) `if test -f 'tH5S.f90'; then $(CYGPATH_W) 'tH5S.f90'; else $(CYGPATH_W) '$(srcdir)/tH5S.f90'; fi`
-
-fortranlib_test-tH5T.o: tH5T.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5T.o $(FCFLAGS_f90) `test -f 'tH5T.f90' || echo '$(srcdir)/'`tH5T.f90
-
-fortranlib_test-tH5T.obj: tH5T.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5T.obj $(FCFLAGS_f90) `if test -f 'tH5T.f90'; then $(CYGPATH_W) 'tH5T.f90'; else $(CYGPATH_W) '$(srcdir)/tH5T.f90'; fi`
-
-fortranlib_test-tH5VL.o: tH5VL.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5VL.o $(FCFLAGS_f90) `test -f 'tH5VL.f90' || echo '$(srcdir)/'`tH5VL.f90
-
-fortranlib_test-tH5VL.obj: tH5VL.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5VL.obj $(FCFLAGS_f90) `if test -f 'tH5VL.f90'; then $(CYGPATH_W) 'tH5VL.f90'; else $(CYGPATH_W) '$(srcdir)/tH5VL.f90'; fi`
-
-fortranlib_test-tH5Z.o: tH5Z.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5Z.o $(FCFLAGS_f90) `test -f 'tH5Z.f90' || echo '$(srcdir)/'`tH5Z.f90
-
-fortranlib_test-tH5Z.obj: tH5Z.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5Z.obj $(FCFLAGS_f90) `if test -f 'tH5Z.f90'; then $(CYGPATH_W) 'tH5Z.f90'; else $(CYGPATH_W) '$(srcdir)/tH5Z.f90'; fi`
-
-fortranlib_test-tH5Sselect.o: tH5Sselect.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5Sselect.o $(FCFLAGS_f90) `test -f 'tH5Sselect.f90' || echo '$(srcdir)/'`tH5Sselect.f90
-
-fortranlib_test-tH5Sselect.obj: tH5Sselect.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5Sselect.obj $(FCFLAGS_f90) `if test -f 'tH5Sselect.f90'; then $(CYGPATH_W) 'tH5Sselect.f90'; else $(CYGPATH_W) '$(srcdir)/tH5Sselect.f90'; fi`
-
-fortranlib_test-tH5P.o: tH5P.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5P.o $(FCFLAGS_f90) `test -f 'tH5P.f90' || echo '$(srcdir)/'`tH5P.f90
-
-fortranlib_test-tH5P.obj: tH5P.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5P.obj $(FCFLAGS_f90) `if test -f 'tH5P.f90'; then $(CYGPATH_W) 'tH5P.f90'; else $(CYGPATH_W) '$(srcdir)/tH5P.f90'; fi`
-
-fortranlib_test-tH5A.o: tH5A.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5A.o $(FCFLAGS_f90) `test -f 'tH5A.f90' || echo '$(srcdir)/'`tH5A.f90
-
-fortranlib_test-tH5A.obj: tH5A.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5A.obj $(FCFLAGS_f90) `if test -f 'tH5A.f90'; then $(CYGPATH_W) 'tH5A.f90'; else $(CYGPATH_W) '$(srcdir)/tH5A.f90'; fi`
-
-fortranlib_test-tH5I.o: tH5I.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5I.o $(FCFLAGS_f90) `test -f 'tH5I.f90' || echo '$(srcdir)/'`tH5I.f90
-
-fortranlib_test-tH5I.obj: tH5I.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5I.obj $(FCFLAGS_f90) `if test -f 'tH5I.f90'; then $(CYGPATH_W) 'tH5I.f90'; else $(CYGPATH_W) '$(srcdir)/tH5I.f90'; fi`
-
-fortranlib_test-tH5G.o: tH5G.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5G.o $(FCFLAGS_f90) `test -f 'tH5G.f90' || echo '$(srcdir)/'`tH5G.f90
-
-fortranlib_test-tH5G.obj: tH5G.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5G.obj $(FCFLAGS_f90) `if test -f 'tH5G.f90'; then $(CYGPATH_W) 'tH5G.f90'; else $(CYGPATH_W) '$(srcdir)/tH5G.f90'; fi`
-
-fortranlib_test-tH5E.o: tH5E.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5E.o $(FCFLAGS_f90) `test -f 'tH5E.f90' || echo '$(srcdir)/'`tH5E.f90
-
-fortranlib_test-tH5E.obj: tH5E.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tH5E.obj $(FCFLAGS_f90) `if test -f 'tH5E.f90'; then $(CYGPATH_W) 'tH5E.f90'; else $(CYGPATH_W) '$(srcdir)/tH5E.f90'; fi`
-
-fortranlib_test-tHDF5.o: tHDF5.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tHDF5.o $(FCFLAGS_f90) `test -f 'tHDF5.f90' || echo '$(srcdir)/'`tHDF5.f90
-
-fortranlib_test-tHDF5.obj: tHDF5.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-tHDF5.obj $(FCFLAGS_f90) `if test -f 'tHDF5.f90'; then $(CYGPATH_W) 'tHDF5.f90'; else $(CYGPATH_W) '$(srcdir)/tHDF5.f90'; fi`
-
-fortranlib_test-fortranlib_test.o: fortranlib_test.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-fortranlib_test.o $(FCFLAGS_f90) `test -f 'fortranlib_test.f90' || echo '$(srcdir)/'`fortranlib_test.f90
-
-fortranlib_test-fortranlib_test.obj: fortranlib_test.f90
-	$(AM_V_FC)$(FC) $(fortranlib_test_FCFLAGS) $(FCFLAGS) -c -o fortranlib_test-fortranlib_test.obj $(FCFLAGS_f90) `if test -f 'fortranlib_test.f90'; then $(CYGPATH_W) 'fortranlib_test.f90'; else $(CYGPATH_W) '$(srcdir)/fortranlib_test.f90'; fi`
-
 mostlyclean-libtool:
 	-rm -f *.lo
 
@@ -1104,7 +1008,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1288,7 +1192,7 @@ check-am: all-am
 	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
 	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
 check: check-am
-all-am: Makefile $(LTLIBRARIES) all-local
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) all-local
 installdirs:
 install: install-am
 install-exec: install-exec-am
@@ -1327,7 +1231,7 @@ maintainer-clean-generic:
 clean: clean-am
 
 clean-am: clean-checkPROGRAMS clean-generic clean-libtool clean-local \
-	clean-noinstLTLIBRARIES mostlyclean-am
+	clean-noinstLTLIBRARIES clean-noinstPROGRAMS mostlyclean-am
 
 distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
@@ -1400,19 +1304,21 @@ uninstall-am:
 
 .PHONY: CTAGS GTAGS TAGS all all-am all-local check check-TESTS \
 	check-am clean clean-checkPROGRAMS clean-generic clean-libtool \
-	clean-local clean-noinstLTLIBRARIES cscopelist-am ctags \
-	ctags-am distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-local distclean-tags distdir dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-man install-pdf \
-	install-pdf-am install-ps install-ps-am install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic maintainer-clean-local mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	mostlyclean-local pdf pdf-am ps ps-am recheck tags tags-am \
-	uninstall uninstall-am
+	clean-local clean-noinstLTLIBRARIES clean-noinstPROGRAMS \
+	cscopelist-am ctags ctags-am distclean distclean-compile \
+	distclean-generic distclean-libtool distclean-local \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic \
+	maintainer-clean-local mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \
+	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
 
 
 #
@@ -1453,12 +1359,24 @@ maintainer-clean-local: clean-local
 distclean-local: clean-local
 clean-local:
 	@if test -n "$(F9XMODEXT)" && test "X$(F9XMODEXT)" != "Xo"; then \
-	  $(RM) *.$(F9XMODEXT);                                         \
+	  $(RM) *.$(F9XMODEXT) tf_gen.F90;                                         \
 	fi
 
+# H5_test_buildiface.F90 generates all the test APIs that have a KIND type associated
+# with them.
+
+tf_gen.F90: H5_test_buildiface$(EXEEXT)
+	$(RUNSERIAL) ./H5_test_buildiface$(EXEEXT)
+
 # fflush2 depends on files created by fflush1
 fflush2.chkexe_: fflush1.chkexe_
 
+# Treat all .f90 and .F90 files as preprocessed Fortran.
+.f90.o:
+	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+.F90.o:
+	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
 build-lib: $(LIB)
diff --git a/fortran/test/fflush1.f90 b/fortran/test/fflush1.F90
similarity index 100%
rename from fortran/test/fflush1.f90
rename to fortran/test/fflush1.F90
diff --git a/fortran/test/fflush2.F90 b/fortran/test/fflush2.F90
new file mode 100644
index 0000000..4230832
--- /dev/null
+++ b/fortran/test/fflush2.F90
@@ -0,0 +1,177 @@
+!****h* root/fortran/test/fflush2.f90
+!
+! NAME
+!  fflush2.f90
+!
+! FUNCTION
+!  This is the second half of a two-part test that makes sure
+!  that a file can be read after an application crashes as long
+!  as the file was flushed first.  This half tries to read the
+!  file created by the first half.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+!*****
+
+PROGRAM FFLUSH2EXAMPLE
+
+  USE HDF5 ! This module contains all necessary modules
+  USE TH5_MISC
+
+  IMPLICIT NONE
+
+  CHARACTER(LEN=7), PARAMETER :: filename = "fflush1"
+  CHARACTER(LEN=80) :: fix_filename
+
+  !
+  !data space rank and dimensions
+  !
+  INTEGER, PARAMETER :: NX = 4
+  INTEGER, PARAMETER :: NY = 5
+
+  !
+  ! File identifiers
+  !
+  INTEGER(HID_T) :: file_id
+
+  !
+  ! Group identifier
+  !
+  INTEGER(HID_T) :: gid
+
+  !
+  ! dataset identifier
+  !
+  INTEGER(HID_T) :: dset_id
+
+
+  !
+  ! data type identifier
+  !
+  INTEGER(HID_T) :: dtype_id
+
+  !
+  !flag to check operation success
+  !
+  INTEGER     ::   error
+
+  !
+  !general purpose integer
+  !
+  INTEGER     ::   i, j, total_error = 0
+
+  !
+  !data buffers
+  !
+  INTEGER, DIMENSION(NX,NY) :: data_out
+  INTEGER(HSIZE_T), DIMENSION(2) :: data_dims
+  data_dims(1) = NX
+  data_dims(2) = NY
+
+  !
+  !Initialize FORTRAN predifined datatypes
+  !
+  CALL h5open_f(error)
+  CALL check("h5open_f",error,total_error)
+
+  !
+  !Open the file.
+  !
+  CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+  IF (error .NE. 0) THEN
+     WRITE(*,*) "Cannot modify filename"
+     CALL h5_exit_f (1)
+  ENDIF
+  CALL h5fopen_f(fix_filename, H5F_ACC_RDONLY_F, file_id, error)
+  CALL check("h5fopen_f",error,total_error)
+
+  !
+  !Open the dataset
+  !
+  CALL h5dopen_f(file_id, "/D", dset_id, error)
+  CALL check("h5dopen_f",error,total_error)
+
+  !
+  !Get dataset's data type.
+  !
+  CALL h5dget_type_f(dset_id, dtype_id, error)
+  CALL check("h5dget_type_f",error,total_error)
+  !
+  !Read the dataset.
+  !
+  CALL h5dread_f(dset_id, dtype_id, data_out, data_dims, error)
+  CALL check("h5dread_f",error,total_error)
+
+  !
+  !Print the dataset.
+  !
+  DO i = 1, NX
+     WRITE(*,*) (data_out(i,j), j = 1, NY)
+  END DO
+  !
+  !result of the print statement
+  !
+  ! 0,  1,  2,  3,  4
+  ! 1,  2,  3,  4,  5
+  ! 2,  3,  4,  5,  6
+  ! 3,  4,  5,  6,  7
+
+  !
+  !Open the group.
+  !
+  CALL h5gopen_f(file_id, "G", gid, error)
+  CALL check("h5gopen_f",error,total_error)
+
+  !
+  !In case error happens, exit.
+  !
+  IF (error == -1) CALL h5_exit_f (1)
+  !
+  !Close the datatype
+  !
+  CALL h5tclose_f(dtype_id, error)
+  CALL check("h5tclose_f",error,total_error)
+
+  !
+  !Close the dataset.
+  !
+  CALL h5dclose_f(dset_id, error)
+  CALL check("h5dclose_f",error,total_error)
+
+  !
+  !Close the group.
+  !
+  CALL h5gclose_f(gid, error)
+  CALL check("h5gclose_f",error,total_error)
+
+  !
+  !Close the file.
+  !
+  CALL h5fclose_f(file_id, error)
+  CALL check("h5fclose_f",error,total_error)
+
+  !
+  !Close FORTRAN predifined datatypes
+  !
+  CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+  CALL h5close_f(error)
+  CALL check("h5close_types_f",error,total_error)
+
+  ! if errors detected, exit with non-zero code.
+  IF (total_error .ne. 0) CALL h5_exit_f (1)
+
+END PROGRAM FFLUSH2EXAMPLE
diff --git a/fortran/test/fflush2.f90 b/fortran/test/fflush2.f90
deleted file mode 100644
index 04ce439..0000000
--- a/fortran/test/fflush2.f90
+++ /dev/null
@@ -1,178 +0,0 @@
-!****h* root/fortran/test/fflush2.f90
-!
-! NAME
-!  fflush2.f90
-!
-! FUNCTION
-!  This is the second half of a two-part test that makes sure
-!  that a file can be read after an application crashes as long
-!  as the file was flushed first.  This half tries to read the
-!  file created by the first half.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!*****
-
-     PROGRAM FFLUSH2EXAMPLE
-
-     USE HDF5 ! This module contains all necessary modules
-     USE TH5_MISC
-
-     IMPLICIT NONE
-
-     CHARACTER(LEN=7), PARAMETER :: filename = "fflush1"
-     CHARACTER(LEN=80) :: fix_filename
-
-     !
-     !data space rank and dimensions
-     !
-     INTEGER, PARAMETER :: NX = 4
-     INTEGER, PARAMETER :: NY = 5
-
-     !
-     ! File identifiers
-     !
-     INTEGER(HID_T) :: file_id
-
-     !
-     ! Group identifier
-     !
-     INTEGER(HID_T) :: gid
-
-     !
-     ! dataset identifier
-     !
-     INTEGER(HID_T) :: dset_id
-
-
-     !
-     ! data type identifier
-     !
-     INTEGER(HID_T) :: dtype_id
-
-     !
-     !flag to check operation success
-     !
-     INTEGER     ::   error
-
-     !
-     !general purpose integer
-     !
-     INTEGER     ::   i, j, total_error = 0
-
-     !
-     !data buffers
-     !
-     INTEGER, DIMENSION(NX,NY) :: data_out
-     INTEGER(HSIZE_T), DIMENSION(2) :: data_dims
-     data_dims(1) = NX
-     data_dims(2) = NY
-
-     !
-     !Initialize FORTRAN predifined datatypes
-     !
-     CALL h5open_f(error)
-          CALL check("h5open_f",error,total_error)
-
-     !
-     !Open the file.
-     !
-          CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
-          if (error .ne. 0) then
-              write(*,*) "Cannot modify filename"
-              CALL h5_exit_f (1)
-          endif
-     CALL h5fopen_f(fix_filename, H5F_ACC_RDONLY_F, file_id, error)
-          CALL check("h5fopen_f",error,total_error)
-
-     !
-     !Open the dataset
-     !
-     CALL h5dopen_f(file_id, "/D", dset_id, error)
-          CALL check("h5dopen_f",error,total_error)
-
-     !
-     !Get dataset's data type.
-     !
-     CALL h5dget_type_f(dset_id, dtype_id, error)
-          CALL check("h5dget_type_f",error,total_error)
-
-     !
-     !Read the dataset.
-     !
-     CALL h5dread_f(dset_id, dtype_id, data_out, data_dims, error)
-          CALL check("h5dread_f",error,total_error)
-
-     !
-     !Print the dataset.
-     !
-     do i = 1, NX
-          write(*,*) (data_out(i,j), j = 1, NY)
-     end do
-!
-!result of the print statement
-!
-! 0,  1,  2,  3,  4
-! 1,  2,  3,  4,  5
-! 2,  3,  4,  5,  6
-! 3,  4,  5,  6,  7
-
-     !
-     !Open the group.
-     !
-     CALL h5gopen_f(file_id, "G", gid, error)
-          CALL check("h5gopen_f",error,total_error)
-
-     !
-     !In case error happens, exit.
-     !
-     IF (error == -1) CALL h5_exit_f (1)
-     !
-     !Close the datatype
-     !
-     CALL h5tclose_f(dtype_id, error)
-          CALL check("h5tclose_f",error,total_error)
-
-     !
-     !Close the dataset.
-     !
-     CALL h5dclose_f(dset_id, error)
-          CALL check("h5dclose_f",error,total_error)
-
-     !
-     !Close the group.
-     !
-     CALL h5gclose_f(gid, error)
-          CALL check("h5gclose_f",error,total_error)
-
-     !
-     !Close the file.
-     !
-     CALL h5fclose_f(file_id, error)
-          CALL check("h5fclose_f",error,total_error)
-
-     !
-     !Close FORTRAN predifined datatypes
-      !
-     CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-     CALL h5close_f(error)
-         CALL check("h5close_types_f",error,total_error)
-
-     ! if errors detected, exit with non-zero code.
-     IF (total_error .ne. 0) CALL h5_exit_f (1)
-
-     END PROGRAM FFLUSH2EXAMPLE
diff --git a/fortran/test/fortranlib_test.F90 b/fortran/test/fortranlib_test.F90
new file mode 100644
index 0000000..2f88c45
--- /dev/null
+++ b/fortran/test/fortranlib_test.F90
@@ -0,0 +1,257 @@
+!****h* root/fortran/test/fortranlib_test.f90
+!
+! NAME
+!  fortranlib_test.f90
+!
+! FUNCTION
+!  Basic testing of Fortran API's functionality.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+!*****
+
+!#include <H5config_f.inc>
+
+PROGRAM fortranlibtest
+
+  USE HDF5
+  USE THDF5
+
+  IMPLICIT NONE
+  INTEGER :: total_error = 0
+  INTEGER :: error
+  INTEGER :: majnum, minnum, relnum
+  LOGICAL :: szip_flag
+  INTEGER :: ret_total_error
+  LOGICAL :: cleanup, status
+
+  CALL h5open_f(error)
+
+  cleanup = .TRUE.
+  CALL h5_env_nocleanup_f(status)
+  IF(status) cleanup=.FALSE.
+
+  WRITE(*,*) '                       ==========================                            '
+  WRITE(*,*) '                              FORTRAN tests '
+  WRITE(*,*) '                       ==========================                            '
+  CALL h5get_libversion_f(majnum, minnum, relnum, total_error)
+  IF(total_error .EQ. 0) THEN
+
+     WRITE(*, '(" FORTRANLIB_TEST is linked with HDF5 Library version ")', advance="NO")
+     WRITE(*, '(I1)', advance="NO") majnum
+     WRITE(*, '(".")', advance="NO")
+     WRITE(*, '(I1)', advance="NO") minnum
+     WRITE(*, '(" release ")', advance="NO")
+     WRITE(*, '(I3)') relnum
+  ELSE
+     total_error = total_error + 1
+  ENDIF
+  WRITE(*,*)
+
+!     CALL h5check_version_f(1,4,4,total_error)
+!     write(*,*) '========================================='
+!     write(*,*) 'Testing FILE Interface                   '
+!     write(*,*) '========================================='
+
+  ret_total_error = 0
+  CALL mountingtest(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Mounting test', total_error)
+
+  ret_total_error = 0
+  CALL reopentest(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Reopen test', total_error)
+
+  ret_total_error = 0
+  CALL file_close(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' File open/close test', total_error)
+
+  ret_total_error = 0
+  CALL file_space("file_space",cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' File free space test', total_error)
+
+!     write(*,*)
+!     write(*,*) '========================================='
+!     write(*,*) 'Testing DATASET Interface                '
+!     write(*,*) '========================================='
+
+  ret_total_error = 0
+  CALL datasettest(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Dataset test', total_error)
+
+  ret_total_error = 0
+  CALL extenddsettest(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Extendible dataset test', total_error)
+
+! -- DISABLE TEST FOR PGI COMPILER DUE TO COMPILER BUG -- 8/2015 -- HDFFV-9498
+!#if H5_Fortran_COMPILER_ID!=PGI
+!  CALL test_userblock_offset(cleanup, ret_total_error)
+!  CALL write_test_status(ret_total_error, ' Dataset offset with user block', total_error)
+!#endif
+
+!     write(*,*)
+!     write(*,*) '========================================='
+!     write(*,*) 'Testing DATASPACE Interface             '
+!     write(*,*) '========================================='
+
+  ret_total_error = 0
+  CALL dataspace_basic_test(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Basic dataspace test', total_error)
+
+!     write(*,*)
+!     write(*,*) '========================================='
+!     write(*,*) 'Testing REFERENCE Interface              '
+!     write(*,*) '========================================='
+
+  ret_total_error = 0
+  CALL refobjtest(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Reference to object test', total_error)
+
+  ret_total_error = 0
+  CALL refregtest(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Reference to dataset region test', total_error)
+
+!     write(*,*)
+!     write(*,*) '========================================='
+!     write(*,*) 'Testing selection functionalities        '
+!     write(*,*) '========================================='
+
+  ret_total_error = 0
+  CALL test_basic_select(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Basic selection test', total_error)
+
+
+  ret_total_error = 0
+  CALL test_select_hyperslab( cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Hyperslab selection test', total_error)
+
+  ret_total_error = 0
+  CALL test_select_element(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Element selection test', total_error)
+
+  ret_total_error = 0
+  CALL test_select_point(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Element selection functions test ', total_error)
+
+  ret_total_error = 0
+  CALL test_select_combine(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Selection combinations test ', total_error)
+
+  ret_total_error = 0
+  CALL test_select_bounds(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Selection bounds test ', total_error)
+  
+!     write(*,*)
+!     write(*,*) '========================================='
+!     write(*,*) 'Testing DATATYPE interface               '
+!     write(*,*) '========================================='
+  ret_total_error = 0
+  CALL basic_data_type_test(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Basic datatype test', total_error)
+
+  ret_total_error = 0
+  CALL compoundtest(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Compound datatype test', total_error)
+
+  ret_total_error = 0
+  CALL enumtest(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Enum datatype test', total_error)
+
+  ret_total_error = 0
+  CALL test_derived_flt(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Derived float datatype test', total_error)
+
+!     write(*,*)
+!     write(*,*) '========================================='
+!     write(*,*) 'Testing PROPERTY interface               '
+!     write(*,*) '========================================='
+
+  ret_total_error = 0
+  CALL external_test(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' External dataset test', total_error)
+
+  ret_total_error = 0
+  CALL multi_file_test(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Multi file driver test', total_error)
+
+  ret_total_error = 0
+  CALL test_chunk_cache (cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Dataset chunk cache configuration', total_error)
+
+!     write(*,*)
+!     write(*,*) '========================================='
+!     write(*,*) 'Testing ATTRIBUTE interface              '
+!     write(*,*) '========================================='
+
+  ret_total_error = 0
+  CALL attribute_test(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Attribute test', total_error)
+
+!     write(*,*)
+!     write(*,*) '========================================='
+!     write(*,*) 'Testing IDENTIFIER interface             '
+!     write(*,*) '========================================='
+
+  ret_total_error = 0
+  CALL identifier_test(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Identifier test', total_error)
+
+  ret_total_error = 0
+  CALL filters_test(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Filters test', total_error)
+
+  ret_total_error = 0
+  CALL szip_test(szip_flag, cleanup, ret_total_error)
+
+  IF (.NOT. szip_flag) THEN ! test not available
+     CALL write_test_status(-1, ' SZIP filter test', total_error)
+  ELSE
+     CALL write_test_status(ret_total_error, ' SZIP filter test', total_error)
+  ENDIF
+
+!     write(*,*)
+!     write(*,*) '========================================='
+!     write(*,*) 'Testing GROUP interface             '
+!     write(*,*) '========================================='
+
+  ret_total_error = 0
+  CALL group_test(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Group test', total_error)
+
+  ret_total_error = 0
+  CALL error_report_test(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Error test', total_error)
+
+  ret_total_error = 0
+  CALL vl_test_integer(cleanup, ret_total_error)
+  CALL vl_test_real(cleanup, ret_total_error)
+  CALL vl_test_string(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' VL test', total_error)
+
+  WRITE(*,*)
+
+  WRITE(*,*) '                  ============================================  '
+  WRITE(*, fmt = '(19x, 27a)', advance='NO') ' FORTRAN tests completed with '
+  WRITE(*, fmt = '(i4)', advance='NO') total_error
+  WRITE(*, fmt = '(12a)' ) ' error(s) ! '
+  WRITE(*,*) '                  ============================================  '
+
+  CALL h5close_f(error)
+
+  ! if errors detected, exit with non-zero code.
+  IF (total_error .NE. 0) CALL h5_exit_f (1)
+
+END PROGRAM fortranlibtest
diff --git a/fortran/test/fortranlib_test.f90 b/fortran/test/fortranlib_test.f90
deleted file mode 100644
index 79ff161..0000000
--- a/fortran/test/fortranlib_test.f90
+++ /dev/null
@@ -1,249 +0,0 @@
-!****h* root/fortran/test/fortranlib_test.f90
-!
-! NAME
-!  fortranlib_test.f90
-!
-! FUNCTION
-!  Basic testing of Fortran API's functionality.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!*****
-
-PROGRAM fortranlibtest
-
-  USE HDF5
-  USE THDF5
-
-  IMPLICIT NONE
-  INTEGER :: total_error = 0
-  INTEGER :: error
-  INTEGER :: majnum, minnum, relnum
-  LOGICAL :: szip_flag
-  INTEGER :: ret_total_error
-  LOGICAL :: cleanup, status
-
-  CALL h5open_f(error)
-
-  cleanup = .TRUE.
-  CALL h5_env_nocleanup_f(status)
-  IF(status) cleanup=.FALSE.
-
-  WRITE(*,*) '                       ==========================                            '
-  WRITE(*,*) '                              FORTRAN tests '
-  WRITE(*,*) '                       ==========================                            '
-  CALL h5get_libversion_f(majnum, minnum, relnum, total_error)
-  IF(total_error .EQ. 0) THEN
-
-     WRITE(*, '(" FORTRANLIB_TEST is linked with HDF5 Library version ")', advance="NO")
-     WRITE(*, '(I1)', advance="NO") majnum
-     WRITE(*, '(".")', advance="NO")
-     WRITE(*, '(I1)', advance="NO") minnum
-     WRITE(*, '(" release ")', advance="NO")
-     WRITE(*, '(I3)') relnum
-  ELSE
-     total_error = total_error + 1
-  ENDIF
-  WRITE(*,*)
-
-!     CALL h5check_version_f(1,4,4,total_error)
-!     write(*,*) '========================================='
-!     write(*,*) 'Testing FILE Interface                   '
-!     write(*,*) '========================================='
-
-  ret_total_error = 0
-  CALL mountingtest(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Mounting test', total_error)
-
-  ret_total_error = 0
-  CALL reopentest(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Reopen test', total_error)
-
-  ret_total_error = 0
-  CALL file_close(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' File open/close test', total_error)
-
-  ret_total_error = 0
-  CALL file_space("file_space",cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' File free space test', total_error)
-
-!     write(*,*)
-!     write(*,*) '========================================='
-!     write(*,*) 'Testing DATASET Interface                '
-!     write(*,*) '========================================='
-
-  ret_total_error = 0
-  CALL datasettest(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Dataset test', total_error)
-
-  ret_total_error = 0
-  CALL extenddsettest(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Extendible dataset test', total_error)
-
-!     write(*,*)
-!     write(*,*) '========================================='
-!     write(*,*) 'Testing DATASPACE Interface             '
-!     write(*,*) '========================================='
-
-  ret_total_error = 0
-  CALL dataspace_basic_test(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Basic dataspace test', total_error)
-
-!     write(*,*)
-!     write(*,*) '========================================='
-!     write(*,*) 'Testing REFERENCE Interface              '
-!     write(*,*) '========================================='
-
-  ret_total_error = 0
-  CALL refobjtest(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Reference to object test', total_error)
-
-  ret_total_error = 0
-  CALL refregtest(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Reference to dataset region test', total_error)
-
-!     write(*,*)
-!     write(*,*) '========================================='
-!     write(*,*) 'Testing selection functionalities        '
-!     write(*,*) '========================================='
-
-  ret_total_error = 0
-  CALL test_basic_select(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Basic selection test', total_error)
-
-
-  ret_total_error = 0
-  CALL test_select_hyperslab( cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Hyperslab selection test', total_error)
-
-  ret_total_error = 0
-  CALL test_select_element(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Element selection test', total_error)
-
-  ret_total_error = 0
-  CALL test_select_point(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Element selection functions test ', total_error)
-
-  ret_total_error = 0
-  CALL test_select_combine(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Selection combinations test ', total_error)
-
-  ret_total_error = 0
-  CALL test_select_bounds(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Selection bounds test ', total_error)
-  
-!     write(*,*)
-!     write(*,*) '========================================='
-!     write(*,*) 'Testing DATATYPE interface               '
-!     write(*,*) '========================================='
-  ret_total_error = 0
-  CALL basic_data_type_test(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Basic datatype test', total_error)
-
-  ret_total_error = 0
-  CALL compoundtest(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Compound datatype test', total_error)
-
-  ret_total_error = 0
-  CALL enumtest(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Enum datatype test', total_error)
-
-  ret_total_error = 0
-  CALL test_derived_flt(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Derived float datatype test', total_error)
-
-!     write(*,*)
-!     write(*,*) '========================================='
-!     write(*,*) 'Testing PROPERTY interface               '
-!     write(*,*) '========================================='
-
-  ret_total_error = 0
-  CALL external_test(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' External dataset test', total_error)
-
-  ret_total_error = 0
-  CALL multi_file_test(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Multi file driver test', total_error)
-
-  ret_total_error = 0
-  CALL test_chunk_cache (cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Dataset chunk cache configuration', total_error)
-
-!     write(*,*)
-!     write(*,*) '========================================='
-!     write(*,*) 'Testing ATTRIBUTE interface              '
-!     write(*,*) '========================================='
-
-  ret_total_error = 0
-  CALL attribute_test(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Attribute test', total_error)
-
-!     write(*,*)
-!     write(*,*) '========================================='
-!     write(*,*) 'Testing IDENTIFIER interface             '
-!     write(*,*) '========================================='
-
-  ret_total_error = 0
-  CALL identifier_test(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Identifier test', total_error)
-
-  ret_total_error = 0
-  CALL filters_test(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Filters test', total_error)
-
-  ret_total_error = 0
-  CALL szip_test(szip_flag, cleanup, ret_total_error)
-
-  IF (.NOT. szip_flag) THEN ! test not available
-     CALL write_test_status(-1, ' SZIP filter test', total_error)
-  ELSE
-     CALL write_test_status(ret_total_error, ' SZIP filter test', total_error)
-  ENDIF
-
-!     write(*,*)
-!     write(*,*) '========================================='
-!     write(*,*) 'Testing GROUP interface             '
-!     write(*,*) '========================================='
-
-  ret_total_error = 0
-  CALL group_test(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Group test', total_error)
-
-  ret_total_error = 0
-  CALL error_report_test(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Error test', total_error)
-
-  ret_total_error = 0
-  CALL vl_test_integer(cleanup, ret_total_error)
-  CALL vl_test_real(cleanup, ret_total_error)
-  CALL vl_test_string(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' VL test', total_error)
-
-  WRITE(*,*)
-
-  WRITE(*,*) '                  ============================================  '
-  WRITE(*, fmt = '(19x, 27a)', advance='NO') ' FORTRAN tests completed with '
-  WRITE(*, fmt = '(i4)', advance='NO') total_error
-  WRITE(*, fmt = '(12a)' ) ' error(s) ! '
-  WRITE(*,*) '                  ============================================  '
-
-  CALL h5close_f(error)
-
-  ! if errors detected, exit with non-zero code.
-  IF (total_error .NE. 0) CALL h5_exit_f (1)
-
-END PROGRAM fortranlibtest
diff --git a/fortran/test/fortranlib_test_1_8.f90 b/fortran/test/fortranlib_test_1_8.F90
similarity index 100%
rename from fortran/test/fortranlib_test_1_8.f90
rename to fortran/test/fortranlib_test_1_8.F90
diff --git a/fortran/test/fortranlib_test_F03.F90 b/fortran/test/fortranlib_test_F03.F90
new file mode 100644
index 0000000..5b386b9
--- /dev/null
+++ b/fortran/test/fortranlib_test_F03.F90
@@ -0,0 +1,193 @@
+!****h* root/fortran/test/fortranlib_test_F03.f90
+!
+! NAME
+!  fortranlib_test_F03.f90
+!
+! FUNCTION
+!  Basic testing of Fortran API's requiring Fortran 2003
+!  compliance.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+!*****
+
+PROGRAM fortranlibtest_F03
+  
+  USE HDF5
+  USE THDF5_F03
+
+  IMPLICIT NONE
+  INTEGER :: total_error = 0
+  INTEGER :: error
+  INTEGER :: majnum, minnum, relnum
+  INTEGER :: ret_total_error
+  LOGICAL :: cleanup, status
+
+  CALL h5open_f(error)
+
+  cleanup = .TRUE.
+  CALL h5_env_nocleanup_f(status)
+  IF(status) cleanup=.FALSE.
+
+  WRITE(*,'(24X,A)') '=============================='
+  WRITE(*,'(24X,A)') '      FORTRAN 2003 tests      '
+  WRITE(*,'(24X,A)') '=============================='
+  CALL h5get_libversion_f(majnum, minnum, relnum, total_error)
+  IF(total_error .EQ. 0) THEN
+     WRITE(*, '(" FORTRANLIB_TEST is linked with HDF5 Library version ")', advance="NO")
+     WRITE(*, '(I1)', advance="NO") majnum
+     WRITE(*, '(".")', advance="NO") 
+     WRITE(*, '(I1)', advance="NO") minnum
+     WRITE(*, '(" release ")', advance="NO")
+     WRITE(*, '(I3)') relnum
+  ELSE
+     total_error = total_error + 1
+  ENDIF
+
+  ret_total_error = 0
+!  PROBLEMS with C
+!  CALL test_error(ret_total_error)
+!  CALL write_test_status(ret_total_error, ' Test error API based on data I/O', total_error)
+
+  WRITE(*,*)
+
+  ret_total_error = 0
+  CALL test_array_compound_atomic(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing 1-D Array of Compound Datatypes Functionality', total_error)
+
+  ret_total_error = 0
+  CALL test_array_compound_array(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing 1-D Array of Compound Array Datatypes Functionality', total_error)
+
+  ret_total_error = 0
+  CALL t_array(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing 3-D array by dataset, using C_LOC', total_error)
+
+  ret_total_error = 0
+  CALL t_enum(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing writing/reading enum dataset, using C_LOC', total_error)  
+
+  ret_total_error = 0
+  CALL t_enum_conv(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing enumeration conversions', total_error)  
+
+  ret_total_error = 0
+  CALL t_bit(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing writing/reading bitfield dataset, using C_LOC', total_error)
+
+  ret_total_error = 0
+  CALL t_opaque(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing writing/reading opaque datatypes, using C_LOC', total_error) 
+
+  ret_total_error = 0
+  CALL t_objref(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing writing/reading object references, using C_LOC', total_error)
+
+  ret_total_error = 0
+  CALL t_regref(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing writing/reading region references, using C_LOC', total_error)  
+
+  ret_total_error = 0
+  CALL t_vlen(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing writing/reading variable-length datatypes, using C_LOC', total_error)
+
+  ret_total_error = 0
+  CALL t_vlstring(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing writing/reading variable-string datatypes, using C_LOC', total_error)
+
+  ret_total_error = 0
+  CALL t_vlstring_readwrite(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing variable-string write/read, using h5dwrite_f/h5dread_f', total_error)
+
+  ret_total_error = 0
+  CALL t_string(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing writing/reading string datatypes, using C_LOC', total_error)
+
+  ret_total_error = 0
+  CALL vl_test_special_char(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing string datatypes containing control characters', total_error)
+
+  ret_total_error = 0
+  CALL test_create(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing filling functions', total_error)
+
+  ret_total_error = 0
+  CALL test_h5kind_to_type(total_error)
+  CALL write_test_status(ret_total_error, ' Test function h5kind_to_type', total_error)
+
+  ret_total_error = 0
+  CALL test_array_bkg(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing Partial I/O of Array Fields in Compound Datatype FunctionalityT', total_error)
+
+  ret_total_error = 0
+  CALL test_genprop_class_callback(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Test basic generic property list callback functionality', total_error)
+
+  ret_total_error = 0
+  CALL test_iter_group(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing group iteration functionality', total_error)
+
+  ret_total_error = 0
+  CALL test_nbit(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing nbit filter', total_error)
+
+  ret_total_error = 0
+  CALL external_test_offset(cleanup, ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing external dataset with offset', total_error)
+
+  ret_total_error = 0
+  CALL test_h5p_file_image(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing h5pset/get file image', total_error)
+  
+!     write(*,*)
+!     write(*,*) '========================================='
+!     write(*,*) 'Testing GROUP interface             '
+!     write(*,*) '========================================='
+
+  ret_total_error = 0
+  CALL test_h5o_refcount(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing object functions ', total_error)
+
+  ret_total_error = 0
+  CALL obj_visit(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing object visiting functions ', total_error)
+
+  ret_total_error = 0
+  CALL obj_info(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing object info functions ', total_error)
+
+  ret_total_error = 0
+  CALL test_get_file_image(ret_total_error)
+  CALL write_test_status(ret_total_error, ' Testing get file image ', total_error)
+
+
+  WRITE(*,*)
+
+  WRITE(*,*) '                  ============================================  '
+  WRITE(*, fmt = '(19x, 27a)', advance='NO') ' FORTRAN tests completed with '
+  WRITE(*, fmt = '(i4)', advance='NO') total_error
+  WRITE(*, fmt = '(12a)' ) ' error(s) ! '
+  WRITE(*,*) '                  ============================================  '
+  
+  CALL h5close_f(error)
+
+  ! if errors detected, exit with non-zero code.
+  IF (total_error .NE. 0) CALL h5_exit_f(1)
+
+END PROGRAM fortranlibtest_F03
+
+
diff --git a/fortran/test/fortranlib_test_F03.f90 b/fortran/test/fortranlib_test_F03.f90
deleted file mode 100644
index 1b8cf97..0000000
--- a/fortran/test/fortranlib_test_F03.f90
+++ /dev/null
@@ -1,188 +0,0 @@
-!****h* root/fortran/test/fortranlib_test_F03.f90
-!
-! NAME
-!  fortranlib_test_F03.f90
-!
-! FUNCTION
-!  Basic testing of Fortran API's requiring Fortran 2003
-!  compliance.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!*****
-
-PROGRAM fortranlibtest_F03
-  
-  USE HDF5
-  USE THDF5_F03
-
-  IMPLICIT NONE
-  INTEGER :: total_error = 0
-  INTEGER :: error
-  INTEGER :: majnum, minnum, relnum
-  INTEGER :: ret_total_error
-  LOGICAL :: cleanup, status
-
-  CALL h5open_f(error)
-
-  cleanup = .TRUE.
-  CALL h5_env_nocleanup_f(status)
-  IF(status) cleanup=.FALSE.
-
-  WRITE(*,'(24X,A)') '=============================='
-  WRITE(*,'(24X,A)') '      FORTRAN 2003 tests      '
-  WRITE(*,'(24X,A)') '=============================='
-  CALL h5get_libversion_f(majnum, minnum, relnum, total_error)
-  IF(total_error .EQ. 0) THEN
-     WRITE(*, '(" FORTRANLIB_TEST is linked with HDF5 Library version ")', advance="NO")
-     WRITE(*, '(I1)', advance="NO") majnum
-     WRITE(*, '(".")', advance="NO") 
-     WRITE(*, '(I1)', advance="NO") minnum
-     WRITE(*, '(" release ")', advance="NO")
-     WRITE(*, '(I3)') relnum
-  ELSE
-     total_error = total_error + 1
-  ENDIF
-
-  WRITE(*,*)
-
-  ret_total_error = 0
-  CALL test_array_compound_atomic(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing 1-D Array of Compound Datatypes Functionality', total_error)
-
-  ret_total_error = 0
-  CALL test_array_compound_array(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing 1-D Array of Compound Array Datatypes Functionality', total_error)
-
-  ret_total_error = 0
-  CALL t_array(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing 3-D array by dataset, using C_LOC', total_error)
-
-  ret_total_error = 0
-  CALL t_enum(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing writing/reading enum dataset, using C_LOC', total_error)  
-
-  ret_total_error = 0
-  CALL t_enum_conv(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing enumeration conversions', total_error)  
-
-  ret_total_error = 0
-  CALL t_bit(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing writing/reading bitfield dataset, using C_LOC', total_error)
-
-  ret_total_error = 0
-  CALL t_opaque(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing writing/reading opaque datatypes, using C_LOC', total_error) 
-
-  ret_total_error = 0
-  CALL t_objref(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing writing/reading object references, using C_LOC', total_error)
-
-  ret_total_error = 0
-  CALL t_regref(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing writing/reading region references, using C_LOC', total_error)  
-
-  ret_total_error = 0
-  CALL t_vlen(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing writing/reading variable-length datatypes, using C_LOC', total_error)
-
-  ret_total_error = 0
-  CALL t_vlstring(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing writing/reading variable-string datatypes, using C_LOC', total_error)
-
-  ret_total_error = 0
-  CALL t_vlstring_readwrite(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing variable-string write/read, using h5dwrite_f/h5dread_f', total_error)
-
-  ret_total_error = 0
-  CALL t_string(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing writing/reading string datatypes, using C_LOC', total_error)
-
-  ret_total_error = 0
-  CALL vl_test_special_char(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing string datatypes containing control characters', total_error)
-
-  ret_total_error = 0
-  CALL test_create(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing filling functions', total_error)
-
-  ret_total_error = 0
-  CALL test_h5kind_to_type(total_error)
-  CALL write_test_status(ret_total_error, ' Test function h5kind_to_type', total_error)
-
-  ret_total_error = 0
-  CALL test_array_bkg(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing Partial I/O of Array Fields in Compound Datatype FunctionalityT', total_error)
-
-  ret_total_error = 0
-  CALL test_genprop_class_callback(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Test basic generic property list callback functionality', total_error)
-
-  ret_total_error = 0
-  CALL test_iter_group(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing group iteration functionality', total_error)
-
-  ret_total_error = 0
-  CALL test_nbit(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing nbit filter', total_error)
-
-  ret_total_error = 0
-  CALL external_test_offset(cleanup, ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing external dataset with offset', total_error)
-
-  ret_total_error = 0
-  CALL test_h5p_file_image(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing h5pset/get file image', total_error)
-  
-!     write(*,*)
-!     write(*,*) '========================================='
-!     write(*,*) 'Testing GROUP interface             '
-!     write(*,*) '========================================='
-
-  ret_total_error = 0
-  CALL test_h5o_refcount(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing object functions ', total_error)
-
-  ret_total_error = 0
-  CALL obj_visit(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing object visiting functions ', total_error)
-
-  ret_total_error = 0
-  CALL obj_info(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing object info functions ', total_error)
-
-  ret_total_error = 0
-  CALL test_get_file_image(ret_total_error)
-  CALL write_test_status(ret_total_error, ' Testing get file image ', total_error)
-
-
-  WRITE(*,*)
-
-  WRITE(*,*) '                  ============================================  '
-  WRITE(*, fmt = '(19x, 27a)', advance='NO') ' FORTRAN tests completed with '
-  WRITE(*, fmt = '(i4)', advance='NO') total_error
-  WRITE(*, fmt = '(12a)' ) ' error(s) ! '
-  WRITE(*,*) '                  ============================================  '
-  
-  CALL h5close_f(error)
-
-  ! if errors detected, exit with non-zero code.
-  IF (total_error .NE. 0) CALL h5_exit_f(1)
-
-END PROGRAM fortranlibtest_F03
-
-
diff --git a/fortran/test/tH5A.F90 b/fortran/test/tH5A.F90
new file mode 100644
index 0000000..5b814fa
--- /dev/null
+++ b/fortran/test/tH5A.F90
@@ -0,0 +1,624 @@
+!****h* root/fortran/test/tH5A.f90
+!
+! NAME
+!  tH5A.f90
+!
+! FUNCTION
+!  Basic testing of Fortran H5A APIs.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! CONTAINS SUBROUTINES
+!  attribute_test 
+!
+!
+!*****
+MODULE TH5A
+
+     USE HDF5 ! This module contains all necessary modules
+     USE TH5_MISC
+     USE TH5_MISC_GEN
+
+CONTAINS
+    SUBROUTINE attribute_test(cleanup, total_error)
+
+!   This subroutine tests following functionalities:
+!   h5acreate_f,  h5awrite_f, h5aclose_f,h5aread_f, h5aopen_name_f,
+!   h5aget_name_f,h5aget_space_f, h5aget_type_f,
+!
+     IMPLICIT NONE
+     LOGICAL, INTENT(IN)  :: cleanup
+     INTEGER, INTENT(INOUT) :: total_error
+
+     CHARACTER(LEN=5), PARAMETER :: filename = "atest"    !File name
+     CHARACTER(LEN=80) :: fix_filename
+     CHARACTER(LEN=9), PARAMETER :: dsetname = "atestdset"        !Dataset name
+     CHARACTER(LEN=11), PARAMETER :: aname = "attr_string"   !String Attribute name
+     CHARACTER(LEN=14), PARAMETER :: aname2 = "attr_character"!Character Attribute name
+     CHARACTER(LEN=11), PARAMETER :: aname3 = "attr_double"   !DOuble Attribute name
+     CHARACTER(LEN=9), PARAMETER :: aname4 = "attr_real"      !Real Attribute name
+     CHARACTER(LEN=12), PARAMETER :: aname5 = "attr_integer"  !Integer Attribute name
+     CHARACTER(LEN=9), PARAMETER :: aname6 = "attr_null"     !Null Attribute name
+
+     !
+     !data space rank and dimensions
+     !
+     INTEGER, PARAMETER :: RANK = 2
+     INTEGER, PARAMETER :: NX = 4
+     INTEGER, PARAMETER :: NY = 5
+
+
+
+     INTEGER(HID_T) :: file_id       ! File identifier
+     INTEGER(HID_T) :: dset_id       ! Dataset identifier
+     INTEGER(HID_T) :: dataspace     ! Dataspace identifier for dataset
+
+     INTEGER(HID_T) :: attr_id        !String Attribute identifier
+     INTEGER(HID_T) :: attr2_id       !Character Attribute identifier
+     INTEGER(HID_T) :: attr3_id       !Double Attribute identifier
+     INTEGER(HID_T) :: attr4_id       !Real Attribute identifier
+     INTEGER(HID_T) :: attr5_id       !Integer Attribute identifier
+     INTEGER(HID_T) :: attr6_id       !Null Attribute identifier
+     INTEGER(HID_T) :: aspace_id      !String Attribute Dataspace identifier
+     INTEGER(HID_T) :: aspace2_id     !Character Attribute Dataspace identifier
+     INTEGER(HID_T) :: aspace6_id     !Null Attribute Dataspace identifier
+     INTEGER(HID_T) :: atype_id       !String Attribute Datatype identifier
+     INTEGER(HID_T) :: atype2_id      !Character Attribute Datatype identifier
+     INTEGER(HID_T) :: atype3_id      !Double Attribute Datatype identifier
+     INTEGER(HID_T) :: atype4_id      !Real Attribute Datatype identifier
+     INTEGER(HID_T) :: atype5_id      !Integer Attribute Datatype identifier
+     INTEGER(HSIZE_T), DIMENSION(1) :: adims = (/2/) ! Attribute dimension
+     INTEGER(HSIZE_T), DIMENSION(1) :: adims2 = (/1/) ! Attribute dimension
+     INTEGER     ::   arank = 1                      ! Attribure rank
+     INTEGER(SIZE_T) :: attrlen    ! Length of the attribute string
+
+     INTEGER(HID_T) :: attr_space     !Returned String Attribute Space identifier
+     INTEGER(HID_T) :: attr2_space    !Returned other Attribute Space identifier
+     INTEGER(HID_T) :: attr_type      !Returned Attribute Datatype identifier
+     INTEGER(HID_T) :: attr2_type      !Returned CHARACTER Attribute Datatype identifier
+     INTEGER(HID_T) :: attr3_type      !Returned DOUBLE Attribute Datatype identifier
+     INTEGER(HID_T) :: attr4_type      !Returned REAL Attribute Datatype identifier
+     INTEGER(HID_T) :: attr5_type      !Returned INTEGER Attribute Datatype identifier
+     INTEGER(HID_T) :: attr6_type      !Returned NULL Attribute Datatype identifier
+     INTEGER        :: num_attrs      !number of attributes
+     INTEGER(HSIZE_T) :: attr_storage   ! attributes storage requirements .MSB.
+     CHARACTER(LEN=256) :: attr_name    !buffer to put attr_name
+     INTEGER(SIZE_T)    ::  name_size = 80 !attribute name length
+
+     CHARACTER(LEN=35), DIMENSION(2) ::  attr_data  ! String attribute data
+     CHARACTER(LEN=35), DIMENSION(2) ::  aread_data ! Buffer to put read back
+                                               ! string attr data
+     CHARACTER ::  attr_character_data = 'A'
+     REAL(KIND=Fortran_DOUBLE),  DIMENSION(1) ::  attr_double_data = 3.459D0
+     REAL,         DIMENSION(1) ::  attr_real_data = 4.0
+     INTEGER,      DIMENSION(1) ::  attr_integer_data = 5
+     INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
+
+
+     CHARACTER :: aread_character_data ! variable to put read back Character attr data
+     INTEGER, DIMENSION(1)  :: aread_integer_data ! variable to put read back integer attr data
+     INTEGER, DIMENSION(1)  :: aread_null_data = 7 ! variable to put read back null attr data
+     REAL(KIND=Fortran_DOUBLE), DIMENSION(1)   :: aread_double_data ! variable to put read back double attr data
+     REAL, DIMENSION(1)  :: aread_real_data ! variable to put read back real attr data
+
+     !
+     !general purpose integer
+     !
+     INTEGER     ::   i, j
+     INTEGER     ::   error ! Error flag
+
+     !
+     !The dimensions for the dataset.
+     !
+     INTEGER(HSIZE_T), DIMENSION(2) :: dims = (/NX,NY/)
+
+     !
+     !data buffers
+     !
+     INTEGER, DIMENSION(NX,NY) :: data_in
+
+     !
+     !Initialize data_in buffer
+     !
+     DO i = 1, NX
+        DO j = 1, NY
+           data_in(i,j) =  (i-1) + (j-1)
+        END DO
+     END DO
+     !
+     ! Initialize attribute's data
+     !
+     attr_data(1) = 'Dataset character attribute'
+     attr_data(2) = 'Some other string here     '
+     attrlen = LEN(attr_data(1))
+
+     !
+     ! Create the file.
+     !
+          CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+          IF (error .NE. 0) THEN
+              WRITE(*,*) "Cannot modify file name"
+              STOP
+          ENDIF
+     CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
+     CALL check("h5fcreate_f",error,total_error)
+
+     !
+     !Create data space for the dataset.
+     !
+     CALL h5screate_simple_f(RANK, dims, dataspace, error)
+     CALL check("h5screate_simple_f",error,total_error)
+
+     !
+     ! create dataset in the file.
+     !
+     CALL h5dcreate_f(file_id, dsetname, H5T_NATIVE_INTEGER, dataspace, &
+               dset_id, error)
+     CALL check("h5dcreate_f",error,total_error)
+
+     !
+     ! Write data_in to the dataset
+     !
+     data_dims(1) = NX
+     data_dims(2) = NY
+     CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, data_in, data_dims, error)
+     CALL check("h5dwrite_f",error,total_error)
+
+     !
+     ! Create scalar data space for the String attribute.
+     !
+     CALL h5screate_simple_f(arank, adims, aspace_id, error)
+     CALL check("h5screate_simple_f",error,total_error)
+     !
+     ! Create scalar data space for all other attributes.
+     !
+     CALL h5screate_simple_f(arank, adims2, aspace2_id, error)
+     CALL check("h5screate_simple_f",error,total_error)
+     !
+     ! Create null data space for null attributes.
+     !
+     CALL h5screate_f(H5S_NULL_F, aspace6_id, error)
+     CALL check("h5screate_f",error,total_error)
+
+     !
+     ! Create datatype for the String attribute.
+     !
+     CALL h5tcopy_f(H5T_NATIVE_CHARACTER, atype_id, error)
+     CALL check("h5tcopy_f",error,total_error)
+
+     CALL h5tset_size_f(atype_id, attrlen, error)
+     CALL check("h5tset_size_f",error,total_error)
+
+     !
+     ! Create datatype for the Character attribute.
+     !
+     CALL h5tcopy_f(H5T_NATIVE_CHARACTER, atype2_id, error)
+     CALL check("h5tcopy_f",error,total_error)
+     !
+     ! Create datatype for the Double attribute.
+     !
+     CALL h5tcopy_f(H5T_NATIVE_DOUBLE, atype3_id, error)
+     CALL check("h5tcopy_f",error,total_error)
+     !
+     ! Create datatype for the Real attribute.
+     !
+     CALL h5tcopy_f(H5T_NATIVE_REAL, atype4_id, error)
+     CALL check("h5tcopy_f",error,total_error)
+     !
+     ! Create datatype for the Integer attribute.
+     !
+     CALL h5tcopy_f(H5T_NATIVE_INTEGER, atype5_id, error)
+     CALL check("h5tcopy_f",error,total_error)
+
+
+     !
+     ! Create dataset String attribute.
+     !
+     CALL h5acreate_f(dset_id, aname, atype_id, aspace_id, &
+                      attr_id, error)
+     CALL check("h5acreate_f",error,total_error)
+
+
+     !
+     ! Create dataset CHARACTER attribute.
+     !
+     CALL h5acreate_f(dset_id, aname2, atype2_id, aspace2_id, &
+                      attr2_id, error)
+     CALL check("h5acreate_f",error,total_error)
+
+
+     !
+     ! Create dataset DOUBLE attribute.
+     !
+     CALL h5acreate_f(dset_id, aname3, atype3_id, aspace2_id, &
+                      attr3_id, error)
+     CALL check("h5acreate_f",error,total_error)
+     !
+     ! Create dataset REAL attribute.
+     !
+     CALL h5acreate_f(dset_id, aname4, atype4_id, aspace2_id, &
+                      attr4_id, error)
+     CALL check("h5acreate_f",error,total_error)
+     !
+     ! Create dataset INTEGER attribute.
+     !
+     CALL h5acreate_f(dset_id, aname5, atype5_id, aspace2_id, &
+                      attr5_id, error)
+     CALL check("h5acreate_f",error,total_error)
+     !
+     ! Create dataset NULL attribute of INTEGER.
+     !
+
+     CALL h5acreate_f(dset_id, aname6, atype5_id, aspace6_id, &
+                      attr6_id, error)
+
+     CALL check("h5acreate_f",error,total_error)
+
+     !
+     ! Write the String attribute data.
+     !
+     data_dims(1) = 2
+     CALL h5awrite_f(attr_id, atype_id, attr_data, data_dims, error)
+     CALL check("h5awrite_f",error,total_error)
+      !
+     ! Write the Character attribute data.
+     !
+     CALL h5awrite_f(attr2_id, atype2_id, attr_character_data, data_dims, error)
+     CALL check("h5awrite_f",error,total_error)
+     !
+     ! Write the DOUBLE attribute data.
+     !
+     data_dims(1) = 1
+     CALL h5awrite_f(attr3_id, atype3_id, attr_double_data, data_dims, error)
+     CALL check("h5awrite_f",error,total_error)
+     !
+     ! Write the Real attribute data.
+     !
+     data_dims(1) = 1
+     CALL h5awrite_f(attr4_id, atype4_id, attr_real_data, data_dims, error)
+     CALL check("h5awrite_f",error,total_error)
+
+     !
+     ! Write the Integer attribute data.
+     !
+     data_dims(1) = 1
+     CALL h5awrite_f(attr5_id, atype5_id, attr_integer_data, data_dims, error)
+     CALL check("h5awrite_f",error,total_error)
+
+     !
+     ! Write the NULL attribute data(nothing can be written).
+     !
+     CALL h5awrite_f(attr6_id, atype5_id, attr_integer_data, data_dims, error)
+     CALL check("h5awrite_f",error,total_error)
+
+     !
+     ! check the amount of storage that is required for the specified attribute .MSB.
+     !
+     CALL h5aget_storage_size_f(attr_id, attr_storage, error)
+     CALL check("h5aget_storage_size_f",error,total_error)
+!     CALL verify("h5aget_storage_size_f",attr_storage,*SizeOf(attr_storage),total_error)
+     CALL h5aget_storage_size_f(attr2_id, attr_storage, error)
+     CALL check("h5aget_storage_size_f",error,total_error)
+!     CALL verify("h5aget_storage_size_f",attr_storage,1,total_error)
+     CALL h5aget_storage_size_f(attr3_id, attr_storage, error)
+     CALL check("h5aget_storage_size_f",error,total_error)
+!     CALL verify("h5aget_storage_size_f",attr_storage,8,total_error)
+     CALL h5aget_storage_size_f(attr4_id, attr_storage, error)
+     CALL check("h5aget_storage_size_f",error,total_error)
+!     CALL verify("h5aget_storage_size_f",attr_storage,4,total_error)
+     CALL h5aget_storage_size_f(attr5_id, attr_storage, error)
+     CALL check("h5aget_storage_size_f",error,total_error)
+!     CALL verify("h5aget_storage_size_f",attr_storage,4,total_error)
+     CALL h5aget_storage_size_f(attr6_id, attr_storage, error)
+     CALL check("h5aget_storage_size_f",error,total_error)
+!     CALL verify("h5aget_storage_size_f",attr_storage,0,total_error)
+
+
+     !
+     ! Close the attribute.
+     !
+     CALL h5aclose_f(attr_id, error)
+     CALL check("h5aclose_f",error,total_error)
+     CALL h5aclose_f(attr2_id, error)
+     CALL check("h5aclose_f",error,total_error)
+     CALL h5aclose_f(attr3_id, error)
+     CALL check("h5aclose_f",error,total_error)
+     CALL h5aclose_f(attr4_id, error)
+     CALL check("h5aclose_f",error,total_error)
+     CALL h5aclose_f(attr5_id, error)
+     CALL check("h5aclose_f",error,total_error)
+     CALL h5aclose_f(attr6_id, error)
+     CALL check("h5aclose_f",error,total_error)
+
+     CALL h5tclose_f(atype_id, error)
+     CALL check("h5tclose_f",error,total_error)
+     CALL h5tclose_f(atype2_id, error)
+     CALL check("h5tclose_f",error,total_error)
+     CALL h5tclose_f(atype3_id, error)
+     CALL check("h5tclose_f",error,total_error)
+     CALL h5tclose_f(atype4_id, error)
+     CALL check("h5tclose_f",error,total_error)
+     CALL h5tclose_f(atype5_id, error)
+     CALL check("h5tclose_f",error,total_error)
+
+     !
+     ! Terminate access to the data space.
+     !
+     CALL h5sclose_f(aspace_id, error)
+     CALL check("h5sclose_f",error,total_error)
+     CALL h5sclose_f(aspace2_id, error)
+     CALL check("h5sclose_f",error,total_error)
+     CALL h5sclose_f(aspace6_id, error)
+     CALL check("h5sclose_f",error,total_error)
+     !
+     ! Terminate access to the dataset.
+     !
+     CALL h5dclose_f(dset_id, error)
+     CALL check("h5dclose_f",error,total_error)
+     !
+     ! Terminate access to the file.
+     !
+     CALL h5fclose_f(file_id, error)
+     CALL check("h5fclose_f",error,total_error)
+     !
+     ! Open file
+     !
+     CALL h5fopen_f(fix_filename, H5F_ACC_RDWR_F, file_id, error)
+     CALL check("h5open_f",error,total_error)
+     !
+     ! Reopen dataset
+     !
+     CALL h5dopen_f(file_id, dsetname, dset_id, error)
+     CALL check("h5dopen_f",error,total_error)
+     !
+     !open the String attrbute by name
+     !
+     CALL h5aopen_name_f(dset_id, aname, attr_id, error)
+     CALL check("h5aopen_name_f",error,total_error)
+
+     !
+     !open the CHARACTER attrbute by name
+     !
+     CALL h5aopen_name_f(dset_id, aname2, attr2_id, error)
+     CALL check("h5aopen_name_f",error,total_error)
+      !
+     !open the DOUBLE attrbute by name
+     !
+     CALL h5aopen_name_f(dset_id, aname3, attr3_id, error)
+     CALL check("h5aopen_name_f",error,total_error)
+     !
+     !open the REAL attrbute by name
+     !
+     CALL h5aopen_name_f(dset_id, aname4, attr4_id, error)
+     CALL check("h5aopen_name_f",error,total_error)
+
+     !
+     !open the INTEGER attrbute by name
+     !
+     CALL h5aopen_name_f(dset_id, aname5, attr5_id, error)
+     CALL check("h5aopen_idx_f",error,total_error)
+
+     !
+     !open the NULL attrbute by name
+     !
+     CALL h5aopen_name_f(dset_id, aname6, attr6_id, error)
+     CALL check("h5aopen_idx_f",error,total_error)
+
+     !
+     !get the attrbute name
+     !
+     CALL h5aget_name_f(attr5_id, name_size, attr_name, error)
+     CALL check("h5aget_name_f",error,total_error)
+     IF (attr_name(1:12) .NE. aname5) THEN
+       total_error = total_error + 1
+     END IF
+     IF (error .NE. 12) THEN
+       total_error = total_error + 1
+     END IF
+
+     !
+     !get the STRING attrbute space
+     !
+     CALL h5aget_space_f(attr_id, attr_space, error)
+     CALL check("h5aget_space_f",error,total_error)
+     !
+     !get other attrbute space
+     !
+     CALL h5aget_space_f(attr2_id, attr2_space, error)
+     CALL check("h5aget_space_f",error,total_error)
+     !
+     !get the string attrbute datatype
+     !
+     CALL h5aget_type_f(attr_id, attr_type, error)
+     CALL check("h5aget_type_f",error,total_error)
+     !
+     !get the character attrbute datatype
+     !
+     CALL h5aget_type_f(attr2_id, attr2_type, error)
+     CALL check("h5aget_type_f",error,total_error)
+     !
+     !get the double attrbute datatype
+     !
+     CALL h5aget_type_f(attr3_id, attr3_type, error)
+     CALL check("h5aget_type_f",error,total_error)
+     !
+     !get the real attrbute datatype
+     !
+     CALL h5aget_type_f(attr4_id, attr4_type, error)
+     CALL check("h5aget_type_f",error,total_error)
+
+     !
+     !get the integer attrbute datatype
+     !
+     CALL h5aget_type_f(attr5_id, attr5_type, error)
+     CALL check("h5aget_type_f",error,total_error)
+
+     !
+     !get the null attrbute datatype
+     !
+     CALL h5aget_type_f(attr6_id, attr6_type, error)
+     CALL check("h5aget_type_f",error,total_error)
+
+     !
+     !get number of attributes
+     !
+     CALL h5aget_num_attrs_f(dset_id, num_attrs, error)
+     CALL check("h5aget_num_attrs_f",error,total_error)
+     IF (num_attrs .NE. 6) THEN
+       WRITE(*,*) "got number of attributes wrong", num_attrs
+       total_error = total_error +1
+     END IF
+
+     !
+     !set the read back data type's size
+     !
+     CALL h5tcopy_f(H5T_NATIVE_CHARACTER, atype_id, error)
+     CALL check("h5tcopy_f",error,total_error)
+
+     CALL h5tset_size_f(atype_id, attrlen, error)
+     CALL check("h5tset_size_f",error,total_error)
+     !
+     !read the string attribute data back to memory
+     !
+     data_dims(1) = 2
+     CALL h5aread_f(attr_id, atype_id, aread_data, data_dims, error)
+     CALL check("h5aread_f",error,total_error)
+
+     IF ( (aread_data(1) .NE. attr_data(1)) .OR. (aread_data(2) .NE. attr_data(2)) ) THEN
+         WRITE(*,*) "Read back string attrbute is wrong", aread_data(1), aread_data(2)
+         total_error = total_error + 1
+     END IF
+
+     !
+     !read the CHARACTER attribute data back to memory
+     !
+     CALL h5aread_f(attr2_id, H5T_NATIVE_CHARACTER, aread_character_data, data_dims, error)
+     CALL check("h5aread_f",error,total_error)
+     IF (aread_character_data .NE. 'A' ) THEN
+         WRITE(*,*) "Read back character attrbute is wrong ",aread_character_data
+         total_error = total_error + 1
+     END IF
+     !
+     !read the double attribute data back to memory
+     !
+     data_dims(1) = 1
+     CALL h5aread_f(attr3_id, H5T_NATIVE_DOUBLE, aread_double_data, data_dims, error)
+     CALL check("h5aread_f",error,total_error)
+     CALL VERIFY("Read back double attrbute is wrong", aread_double_data(1),3.459_Fortran_DOUBLE,total_error)
+
+     !
+     !read the real attribute data back to memory
+     !
+     data_dims(1) = 1
+     CALL h5aread_f(attr4_id, H5T_NATIVE_REAL, aread_real_data, data_dims, error)
+     CALL check("h5aread_f",error,total_error)
+     CALL VERIFY("Read back real attrbute is wrong", aread_real_data(1),4.0,total_error)
+     !
+     !read the Integer attribute data back to memory
+     !
+     data_dims(1) = 1
+     CALL h5aread_f(attr5_id, H5T_NATIVE_INTEGER, aread_integer_data, data_dims, error)
+     CALL check("h5aread_f",error,total_error)
+     IF (aread_integer_data(1) .NE. 5 ) THEN
+         WRITE(*,*) "Read back integer attrbute is wrong ", aread_integer_data
+         total_error = total_error + 1
+     END IF
+     !
+     !read the null attribute data. nothing can be read.
+     !
+     data_dims(1) = 1
+     CALL h5aread_f(attr6_id, H5T_NATIVE_INTEGER, aread_null_data, data_dims, error)
+     CALL check("h5aread_f",error,total_error)
+     IF (aread_null_data(1) .NE. 7 ) THEN
+         WRITE(*,*) "Read back null attrbute is wrong ", aread_null_data
+         total_error = total_error + 1
+     END IF
+
+     !
+     ! Close the attribute.
+     !
+     CALL h5aclose_f(attr_id, error)
+     CALL check("h5aclose_f",error,total_error)
+     CALL h5aclose_f(attr2_id, error)
+     CALL check("h5aclose_f",error,total_error)
+     CALL h5aclose_f(attr3_id, error)
+     CALL check("h5aclose_f",error,total_error)
+     CALL h5aclose_f(attr4_id, error)
+     CALL check("h5aclose_f",error,total_error)
+     CALL h5aclose_f(attr5_id, error)
+     CALL check("h5aclose_f",error,total_error)
+     CALL h5aclose_f(attr6_id, error)
+     CALL check("h5aclose_f",error,total_error)
+
+     !
+     ! Delete the attribute from the Dataset.
+     !
+     CALL h5adelete_f(dset_id, aname, error)
+     CALL check("h5adelete_f",error,total_error)
+
+     !
+     !get number of attributes
+     !
+     CALL h5aget_num_attrs_f(dset_id, num_attrs, error)
+     CALL check("h5aget_num_attrs_f",error,total_error)
+     IF (num_attrs .NE. 5) THEN
+       WRITE(*,*) "got number of attributes wrong", num_attrs
+       total_error = total_error +1
+     END IF
+
+
+
+     CALL h5sclose_f(attr_space, error)
+     CALL check("h5sclose_f",error,total_error)
+     CALL h5sclose_f(attr2_space, error)
+     CALL check("h5sclose_f",error,total_error)
+
+     !
+     ! Terminate access to the data type.
+     !
+     CALL h5tclose_f(attr_type, error)
+     CALL check("h5tclose_f",error,total_error)
+     CALL h5tclose_f(attr2_type, error)
+     CALL check("h5tclose_f",error,total_error)
+     CALL h5tclose_f(attr3_type, error)
+     CALL check("h5tclose_f",error,total_error)
+     CALL h5tclose_f(attr4_type, error)
+     CALL check("h5tclose_f",error,total_error)
+     CALL h5tclose_f(attr5_type, error)
+     CALL check("h5tclose_f",error,total_error)
+     CALL h5tclose_f(attr6_type, error)
+     CALL check("h5tclose_f",error,total_error)
+
+     !
+     ! End access to the dataset and release resources used by it.
+     !
+     CALL h5dclose_f(dset_id, error)
+     CALL check("h5dclose_f",error,total_error)
+
+     !
+     ! Close the file.
+     !
+     CALL h5fclose_f(file_id, error)
+     CALL check("h5fclose_f",error,total_error)
+     !
+     ! Remove the file
+     !
+     IF (cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+
+     RETURN
+     END SUBROUTINE attribute_test
+END MODULE TH5A
diff --git a/fortran/test/tH5A.f90 b/fortran/test/tH5A.f90
deleted file mode 100644
index e3b3b2a..0000000
--- a/fortran/test/tH5A.f90
+++ /dev/null
@@ -1,629 +0,0 @@
-!****h* root/fortran/test/tH5A.f90
-!
-! NAME
-!  tH5A.f90
-!
-! FUNCTION
-!  Basic testing of Fortran H5A APIs.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! CONTAINS SUBROUTINES
-!  attribute_test 
-!
-!
-!*****
-MODULE TH5A
-
-CONTAINS
-    SUBROUTINE attribute_test(cleanup, total_error)
-
-!   This subroutine tests following functionalities:
-!   h5acreate_f,  h5awrite_f, h5aclose_f,h5aread_f, h5aopen_name_f,
-!   h5aget_name_f,h5aget_space_f, h5aget_type_f,
-!
-
-     USE HDF5 ! This module contains all necessary modules
-     USE TH5_MISC
-     IMPLICIT NONE
-     LOGICAL, INTENT(IN)  :: cleanup
-     INTEGER, INTENT(INOUT) :: total_error
-
-     CHARACTER(LEN=5), PARAMETER :: filename = "atest"    !File name
-     CHARACTER(LEN=80) :: fix_filename
-     CHARACTER(LEN=9), PARAMETER :: dsetname = "atestdset"        !Dataset name
-     CHARACTER(LEN=11), PARAMETER :: aname = "attr_string"   !String Attribute name
-     CHARACTER(LEN=14), PARAMETER :: aname2 = "attr_character"!Character Attribute name
-     CHARACTER(LEN=11), PARAMETER :: aname3 = "attr_double"   !DOuble Attribute name
-     CHARACTER(LEN=9), PARAMETER :: aname4 = "attr_real"      !Real Attribute name
-     CHARACTER(LEN=12), PARAMETER :: aname5 = "attr_integer"  !Integer Attribute name
-     CHARACTER(LEN=9), PARAMETER :: aname6 = "attr_null"     !Null Attribute name
-
-     !
-     !data space rank and dimensions
-     !
-     INTEGER, PARAMETER :: RANK = 2
-     INTEGER, PARAMETER :: NX = 4
-     INTEGER, PARAMETER :: NY = 5
-
-
-
-     INTEGER(HID_T) :: file_id       ! File identifier
-     INTEGER(HID_T) :: dset_id       ! Dataset identifier
-     INTEGER(HID_T) :: dataspace     ! Dataspace identifier for dataset
-
-     INTEGER(HID_T) :: attr_id        !String Attribute identifier
-     INTEGER(HID_T) :: attr2_id       !Character Attribute identifier
-     INTEGER(HID_T) :: attr3_id       !Double Attribute identifier
-     INTEGER(HID_T) :: attr4_id       !Real Attribute identifier
-     INTEGER(HID_T) :: attr5_id       !Integer Attribute identifier
-     INTEGER(HID_T) :: attr6_id       !Null Attribute identifier
-     INTEGER(HID_T) :: aspace_id      !String Attribute Dataspace identifier
-     INTEGER(HID_T) :: aspace2_id     !Character Attribute Dataspace identifier
-     INTEGER(HID_T) :: aspace6_id     !Null Attribute Dataspace identifier
-     INTEGER(HID_T) :: atype_id       !String Attribute Datatype identifier
-     INTEGER(HID_T) :: atype2_id      !Character Attribute Datatype identifier
-     INTEGER(HID_T) :: atype3_id      !Double Attribute Datatype identifier
-     INTEGER(HID_T) :: atype4_id      !Real Attribute Datatype identifier
-     INTEGER(HID_T) :: atype5_id      !Integer Attribute Datatype identifier
-     INTEGER(HSIZE_T), DIMENSION(1) :: adims = (/2/) ! Attribute dimension
-     INTEGER(HSIZE_T), DIMENSION(1) :: adims2 = (/1/) ! Attribute dimension
-     INTEGER     ::   arank = 1                      ! Attribure rank
-     INTEGER(SIZE_T) :: attrlen    ! Length of the attribute string
-
-     INTEGER(HID_T) :: attr_space     !Returned String Attribute Space identifier
-     INTEGER(HID_T) :: attr2_space    !Returned other Attribute Space identifier
-     INTEGER(HID_T) :: attr_type      !Returned Attribute Datatype identifier
-     INTEGER(HID_T) :: attr2_type      !Returned CHARACTER Attribute Datatype identifier
-     INTEGER(HID_T) :: attr3_type      !Returned DOUBLE Attribute Datatype identifier
-     INTEGER(HID_T) :: attr4_type      !Returned REAL Attribute Datatype identifier
-     INTEGER(HID_T) :: attr5_type      !Returned INTEGER Attribute Datatype identifier
-     INTEGER(HID_T) :: attr6_type      !Returned NULL Attribute Datatype identifier
-     INTEGER        :: num_attrs      !number of attributes
-     INTEGER(HSIZE_T) :: attr_storage   ! attributes storage requirements .MSB.
-     CHARACTER(LEN=256) :: attr_name    !buffer to put attr_name
-     INTEGER(SIZE_T)    ::  name_size = 80 !attribute name length
-
-     CHARACTER(LEN=35), DIMENSION(2) ::  attr_data  ! String attribute data
-     CHARACTER(LEN=35), DIMENSION(2) ::  aread_data ! Buffer to put read back
-                                               ! string attr data
-     CHARACTER ::  attr_character_data = 'A'
-     REAL(KIND=Fortran_DOUBLE),  DIMENSION(1) ::  attr_double_data = 3.459D0
-     REAL,         DIMENSION(1) ::  attr_real_data = 4.0
-     INTEGER,      DIMENSION(1) ::  attr_integer_data = 5
-     INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
-
-
-     CHARACTER :: aread_character_data ! variable to put read back Character attr data
-     INTEGER, DIMENSION(1)  :: aread_integer_data ! variable to put read back integer attr data
-     INTEGER, DIMENSION(1)  :: aread_null_data = 7 ! variable to put read back null attr data
-     REAL(KIND=Fortran_DOUBLE), DIMENSION(1)   :: aread_double_data ! variable to put read back double attr data
-     REAL, DIMENSION(1)  :: aread_real_data ! variable to put read back real attr data
-
-     !
-     !general purpose integer
-     !
-     INTEGER     ::   i, j
-     INTEGER     ::   error ! Error flag
-
-     !
-     !The dimensions for the dataset.
-     !
-     INTEGER(HSIZE_T), DIMENSION(2) :: dims = (/NX,NY/)
-
-     !
-     !data buffers
-     !
-     INTEGER, DIMENSION(NX,NY) :: data_in
-
-     !
-     !Initialize data_in buffer
-     !
-     DO i = 1, NX
-        DO j = 1, NY
-           data_in(i,j) =  (i-1) + (j-1)
-        END DO
-     END DO
-     !
-     ! Initialize attribute's data
-     !
-     attr_data(1) = 'Dataset character attribute'
-     attr_data(2) = 'Some other string here     '
-     attrlen = LEN(attr_data(1))
-
-     !
-     ! Create the file.
-     !
-          CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
-          IF (error .NE. 0) THEN
-              WRITE(*,*) "Cannot modify file name"
-              STOP
-          ENDIF
-     CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
-     CALL check("h5fcreate_f",error,total_error)
-
-     !
-     !Create data space for the dataset.
-     !
-     CALL h5screate_simple_f(RANK, dims, dataspace, error)
-     CALL check("h5screate_simple_f",error,total_error)
-
-     !
-     ! create dataset in the file.
-     !
-     CALL h5dcreate_f(file_id, dsetname, H5T_NATIVE_INTEGER, dataspace, &
-               dset_id, error)
-     CALL check("h5dcreate_f",error,total_error)
-
-     !
-     ! Write data_in to the dataset
-     !
-     data_dims(1) = NX
-     data_dims(2) = NY
-     CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, data_in, data_dims, error)
-     CALL check("h5dwrite_f",error,total_error)
-
-     !
-     ! Create scalar data space for the String attribute.
-     !
-     CALL h5screate_simple_f(arank, adims, aspace_id, error)
-     CALL check("h5screate_simple_f",error,total_error)
-     !
-     ! Create scalar data space for all other attributes.
-     !
-     CALL h5screate_simple_f(arank, adims2, aspace2_id, error)
-     CALL check("h5screate_simple_f",error,total_error)
-     !
-     ! Create null data space for null attributes.
-     !
-     CALL h5screate_f(H5S_NULL_F, aspace6_id, error)
-     CALL check("h5screate_f",error,total_error)
-
-     !
-     ! Create datatype for the String attribute.
-     !
-     CALL h5tcopy_f(H5T_NATIVE_CHARACTER, atype_id, error)
-     CALL check("h5tcopy_f",error,total_error)
-
-     CALL h5tset_size_f(atype_id, attrlen, error)
-     CALL check("h5tset_size_f",error,total_error)
-
-     !
-     ! Create datatype for the Character attribute.
-     !
-     CALL h5tcopy_f(H5T_NATIVE_CHARACTER, atype2_id, error)
-     CALL check("h5tcopy_f",error,total_error)
-     !
-     ! Create datatype for the Double attribute.
-     !
-     CALL h5tcopy_f(H5T_NATIVE_DOUBLE, atype3_id, error)
-     CALL check("h5tcopy_f",error,total_error)
-     !
-     ! Create datatype for the Real attribute.
-     !
-     CALL h5tcopy_f(H5T_NATIVE_REAL, atype4_id, error)
-     CALL check("h5tcopy_f",error,total_error)
-     !
-     ! Create datatype for the Integer attribute.
-     !
-     CALL h5tcopy_f(H5T_NATIVE_INTEGER, atype5_id, error)
-     CALL check("h5tcopy_f",error,total_error)
-
-
-     !
-     ! Create dataset String attribute.
-     !
-     CALL h5acreate_f(dset_id, aname, atype_id, aspace_id, &
-                      attr_id, error)
-     CALL check("h5acreate_f",error,total_error)
-
-
-     !
-     ! Create dataset CHARACTER attribute.
-     !
-     CALL h5acreate_f(dset_id, aname2, atype2_id, aspace2_id, &
-                      attr2_id, error)
-     CALL check("h5acreate_f",error,total_error)
-
-
-     !
-     ! Create dataset DOUBLE attribute.
-     !
-     CALL h5acreate_f(dset_id, aname3, atype3_id, aspace2_id, &
-                      attr3_id, error)
-     CALL check("h5acreate_f",error,total_error)
-     !
-     ! Create dataset REAL attribute.
-     !
-     CALL h5acreate_f(dset_id, aname4, atype4_id, aspace2_id, &
-                      attr4_id, error)
-     CALL check("h5acreate_f",error,total_error)
-     !
-     ! Create dataset INTEGER attribute.
-     !
-     CALL h5acreate_f(dset_id, aname5, atype5_id, aspace2_id, &
-                      attr5_id, error)
-     CALL check("h5acreate_f",error,total_error)
-     !
-     ! Create dataset NULL attribute of INTEGER.
-     !
-
-     CALL h5acreate_f(dset_id, aname6, atype5_id, aspace6_id, &
-                      attr6_id, error)
-
-     CALL check("h5acreate_f",error,total_error)
-
-     !
-     ! Write the String attribute data.
-     !
-     data_dims(1) = 2
-     CALL h5awrite_f(attr_id, atype_id, attr_data, data_dims, error)
-     CALL check("h5awrite_f",error,total_error)
-      !
-     ! Write the Character attribute data.
-     !
-     CALL h5awrite_f(attr2_id, atype2_id, attr_character_data, data_dims, error)
-     CALL check("h5awrite_f",error,total_error)
-     !
-     ! Write the DOUBLE attribute data.
-     !
-     data_dims(1) = 1
-     CALL h5awrite_f(attr3_id, atype3_id, attr_double_data, data_dims, error)
-     CALL check("h5awrite_f",error,total_error)
-     !
-     ! Write the Real attribute data.
-     !
-     data_dims(1) = 1
-     CALL h5awrite_f(attr4_id, atype4_id, attr_real_data, data_dims, error)
-     CALL check("h5awrite_f",error,total_error)
-
-     !
-     ! Write the Integer attribute data.
-     !
-     data_dims(1) = 1
-     CALL h5awrite_f(attr5_id, atype5_id, attr_integer_data, data_dims, error)
-     CALL check("h5awrite_f",error,total_error)
-
-     !
-     ! Write the NULL attribute data(nothing can be written).
-     !
-     CALL h5awrite_f(attr6_id, atype5_id, attr_integer_data, data_dims, error)
-     CALL check("h5awrite_f",error,total_error)
-
-     !
-     ! check the amount of storage that is required for the specified attribute .MSB.
-     !
-     CALL h5aget_storage_size_f(attr_id, attr_storage, error)
-     CALL check("h5aget_storage_size_f",error,total_error)
-!     CALL VERIFY("h5aget_storage_size_f",attr_storage,*SizeOf(attr_storage),total_error)
-     CALL h5aget_storage_size_f(attr2_id, attr_storage, error)
-     CALL check("h5aget_storage_size_f",error,total_error)
-!     CALL verify("h5aget_storage_size_f",attr_storage,1,total_error)
-     CALL h5aget_storage_size_f(attr3_id, attr_storage, error)
-     CALL check("h5aget_storage_size_f",error,total_error)
-!     CALL verify("h5aget_storage_size_f",attr_storage,8,total_error)
-     CALL h5aget_storage_size_f(attr4_id, attr_storage, error)
-     CALL check("h5aget_storage_size_f",error,total_error)
-!     CALL verify("h5aget_storage_size_f",attr_storage,4,total_error)
-     CALL h5aget_storage_size_f(attr5_id, attr_storage, error)
-     CALL check("h5aget_storage_size_f",error,total_error)
-!     CALL verify("h5aget_storage_size_f",attr_storage,4,total_error)
-     CALL h5aget_storage_size_f(attr6_id, attr_storage, error)
-     CALL check("h5aget_storage_size_f",error,total_error)
-!     CALL verify("h5aget_storage_size_f",attr_storage,0,total_error)
-
-
-     !
-     ! Close the attribute.
-     !
-     CALL h5aclose_f(attr_id, error)
-     CALL check("h5aclose_f",error,total_error)
-     CALL h5aclose_f(attr2_id, error)
-     CALL check("h5aclose_f",error,total_error)
-     CALL h5aclose_f(attr3_id, error)
-     CALL check("h5aclose_f",error,total_error)
-     CALL h5aclose_f(attr4_id, error)
-     CALL check("h5aclose_f",error,total_error)
-     CALL h5aclose_f(attr5_id, error)
-     CALL check("h5aclose_f",error,total_error)
-     CALL h5aclose_f(attr6_id, error)
-     CALL check("h5aclose_f",error,total_error)
-
-     CALL h5tclose_f(atype_id, error)
-     CALL check("h5tclose_f",error,total_error)
-     CALL h5tclose_f(atype2_id, error)
-     CALL check("h5tclose_f",error,total_error)
-     CALL h5tclose_f(atype3_id, error)
-     CALL check("h5tclose_f",error,total_error)
-     CALL h5tclose_f(atype4_id, error)
-     CALL check("h5tclose_f",error,total_error)
-     CALL h5tclose_f(atype5_id, error)
-     CALL check("h5tclose_f",error,total_error)
-
-     !
-     ! Terminate access to the data space.
-     !
-     CALL h5sclose_f(aspace_id, error)
-     CALL check("h5sclose_f",error,total_error)
-     CALL h5sclose_f(aspace2_id, error)
-     CALL check("h5sclose_f",error,total_error)
-     CALL h5sclose_f(aspace6_id, error)
-     CALL check("h5sclose_f",error,total_error)
-     !
-     ! Terminate access to the dataset.
-     !
-     CALL h5dclose_f(dset_id, error)
-     CALL check("h5dclose_f",error,total_error)
-     !
-     ! Terminate access to the file.
-     !
-     CALL h5fclose_f(file_id, error)
-     CALL check("h5fclose_f",error,total_error)
-     !
-     ! Open file
-     !
-     CALL h5fopen_f(fix_filename, H5F_ACC_RDWR_F, file_id, error)
-     CALL check("h5open_f",error,total_error)
-     !
-     ! Reopen dataset
-     !
-     CALL h5dopen_f(file_id, dsetname, dset_id, error)
-     CALL check("h5dopen_f",error,total_error)
-     !
-     !open the String attrbute by name
-     !
-     CALL h5aopen_name_f(dset_id, aname, attr_id, error)
-     CALL check("h5aopen_name_f",error,total_error)
-
-     !
-     !open the CHARACTER attrbute by name
-     !
-     CALL h5aopen_name_f(dset_id, aname2, attr2_id, error)
-     CALL check("h5aopen_name_f",error,total_error)
-      !
-     !open the DOUBLE attrbute by name
-     !
-     CALL h5aopen_name_f(dset_id, aname3, attr3_id, error)
-     CALL check("h5aopen_name_f",error,total_error)
-     !
-     !open the REAL attrbute by name
-     !
-     CALL h5aopen_name_f(dset_id, aname4, attr4_id, error)
-     CALL check("h5aopen_name_f",error,total_error)
-
-     !
-     !open the INTEGER attrbute by name
-     !
-     CALL h5aopen_name_f(dset_id, aname5, attr5_id, error)
-     CALL check("h5aopen_idx_f",error,total_error)
-
-     !
-     !open the NULL attrbute by name
-     !
-     CALL h5aopen_name_f(dset_id, aname6, attr6_id, error)
-     CALL check("h5aopen_idx_f",error,total_error)
-
-     !
-     !get the attrbute name
-     !
-     CALL h5aget_name_f(attr5_id, name_size, attr_name, error)
-     CALL check("h5aget_name_f",error,total_error)
-     IF (attr_name(1:12) .NE. aname5) THEN
-       total_error = total_error + 1
-     END IF
-     IF (error .NE. 12) THEN
-       total_error = total_error + 1
-     END IF
-
-     !
-     !get the STRING attrbute space
-     !
-     CALL h5aget_space_f(attr_id, attr_space, error)
-     CALL check("h5aget_space_f",error,total_error)
-     !
-     !get other attrbute space
-     !
-     CALL h5aget_space_f(attr2_id, attr2_space, error)
-     CALL check("h5aget_space_f",error,total_error)
-     !
-     !get the string attrbute datatype
-     !
-     CALL h5aget_type_f(attr_id, attr_type, error)
-     CALL check("h5aget_type_f",error,total_error)
-     !
-     !get the character attrbute datatype
-     !
-     CALL h5aget_type_f(attr2_id, attr2_type, error)
-     CALL check("h5aget_type_f",error,total_error)
-     !
-     !get the double attrbute datatype
-     !
-     CALL h5aget_type_f(attr3_id, attr3_type, error)
-     CALL check("h5aget_type_f",error,total_error)
-     !
-     !get the real attrbute datatype
-     !
-     CALL h5aget_type_f(attr4_id, attr4_type, error)
-     CALL check("h5aget_type_f",error,total_error)
-
-     !
-     !get the integer attrbute datatype
-     !
-     CALL h5aget_type_f(attr5_id, attr5_type, error)
-     CALL check("h5aget_type_f",error,total_error)
-
-     !
-     !get the null attrbute datatype
-     !
-     CALL h5aget_type_f(attr6_id, attr6_type, error)
-     CALL check("h5aget_type_f",error,total_error)
-
-     !
-     !get number of attributes
-     !
-     CALL h5aget_num_attrs_f(dset_id, num_attrs, error)
-     CALL check("h5aget_num_attrs_f",error,total_error)
-     IF (num_attrs .NE. 6) THEN
-       WRITE(*,*) "got number of attributes wrong", num_attrs
-       total_error = total_error +1
-     END IF
-
-     !
-     !set the read back data type's size
-     !
-     CALL h5tcopy_f(H5T_NATIVE_CHARACTER, atype_id, error)
-     CALL check("h5tcopy_f",error,total_error)
-
-     CALL h5tset_size_f(atype_id, attrlen, error)
-     CALL check("h5tset_size_f",error,total_error)
-     !
-     !read the string attribute data back to memory
-     !
-     data_dims(1) = 2
-     CALL h5aread_f(attr_id, atype_id, aread_data, data_dims, error)
-     CALL check("h5aread_f",error,total_error)
-
-     IF ( (aread_data(1) .NE. attr_data(1)) .OR. (aread_data(2) .NE. attr_data(2)) ) THEN
-         WRITE(*,*) "Read back string attrbute is wrong", aread_data(1), aread_data(2)
-         total_error = total_error + 1
-     END IF
-
-     !
-     !read the CHARACTER attribute data back to memory
-     !
-     CALL h5aread_f(attr2_id, H5T_NATIVE_CHARACTER, aread_character_data, data_dims, error)
-     CALL check("h5aread_f",error,total_error)
-     IF (aread_character_data .NE. 'A' ) THEN
-         WRITE(*,*) "Read back character attrbute is wrong ",aread_character_data
-         total_error = total_error + 1
-     END IF
-     !
-     !read the double attribute data back to memory
-     !
-     data_dims(1) = 1
-     CALL h5aread_f(attr3_id, H5T_NATIVE_DOUBLE, aread_double_data, data_dims, error)
-     CALL check("h5aread_f",error,total_error)
-
-     IF( .NOT.dreal_eq( REAL(aread_double_data(1),dp), 3.459_dp) )THEN
-        WRITE(*,*) "Read back double attrbute is wrong", aread_double_data(1)
-        total_error = total_error + 1
-     ENDIF
-     !
-     !read the real attribute data back to memory
-     !
-     data_dims(1) = 1
-     CALL h5aread_f(attr4_id, H5T_NATIVE_REAL, aread_real_data, data_dims, error)
-     CALL check("h5aread_f",error,total_error)
-     IF( .NOT.dreal_eq( REAL(aread_real_data(1),dp), 4.0_dp) )THEN
-        WRITE(*,*) "Read back real attrbute is wrong", aread_real_data(1)
-        total_error = total_error + 1
-     ENDIF
-     !
-     !read the Integer attribute data back to memory
-     !
-     data_dims(1) = 1
-     CALL h5aread_f(attr5_id, H5T_NATIVE_INTEGER, aread_integer_data, data_dims, error)
-     CALL check("h5aread_f",error,total_error)
-     IF (aread_integer_data(1) .NE. 5 ) THEN
-         WRITE(*,*) "Read back integer attrbute is wrong ", aread_integer_data
-         total_error = total_error + 1
-     END IF
-     !
-     !read the null attribute data. nothing can be read.
-     !
-     data_dims(1) = 1
-     CALL h5aread_f(attr6_id, H5T_NATIVE_INTEGER, aread_null_data, data_dims, error)
-     CALL check("h5aread_f",error,total_error)
-     IF (aread_null_data(1) .NE. 7 ) THEN
-         WRITE(*,*) "Read back null attrbute is wrong ", aread_null_data
-         total_error = total_error + 1
-     END IF
-
-     !
-     ! Close the attribute.
-     !
-     CALL h5aclose_f(attr_id, error)
-     CALL check("h5aclose_f",error,total_error)
-     CALL h5aclose_f(attr2_id, error)
-     CALL check("h5aclose_f",error,total_error)
-     CALL h5aclose_f(attr3_id, error)
-     CALL check("h5aclose_f",error,total_error)
-     CALL h5aclose_f(attr4_id, error)
-     CALL check("h5aclose_f",error,total_error)
-     CALL h5aclose_f(attr5_id, error)
-     CALL check("h5aclose_f",error,total_error)
-     CALL h5aclose_f(attr6_id, error)
-     CALL check("h5aclose_f",error,total_error)
-
-     !
-     ! Delete the attribute from the Dataset.
-     !
-     CALL h5adelete_f(dset_id, aname, error)
-     CALL check("h5adelete_f",error,total_error)
-
-     !
-     !get number of attributes
-     !
-     CALL h5aget_num_attrs_f(dset_id, num_attrs, error)
-     CALL check("h5aget_num_attrs_f",error,total_error)
-     IF (num_attrs .NE. 5) THEN
-       WRITE(*,*) "got number of attributes wrong", num_attrs
-       total_error = total_error +1
-     END IF
-
-
-
-     CALL h5sclose_f(attr_space, error)
-     CALL check("h5sclose_f",error,total_error)
-     CALL h5sclose_f(attr2_space, error)
-     CALL check("h5sclose_f",error,total_error)
-
-     !
-     ! Terminate access to the data type.
-     !
-     CALL h5tclose_f(attr_type, error)
-     CALL check("h5tclose_f",error,total_error)
-     CALL h5tclose_f(attr2_type, error)
-     CALL check("h5tclose_f",error,total_error)
-     CALL h5tclose_f(attr3_type, error)
-     CALL check("h5tclose_f",error,total_error)
-     CALL h5tclose_f(attr4_type, error)
-     CALL check("h5tclose_f",error,total_error)
-     CALL h5tclose_f(attr5_type, error)
-     CALL check("h5tclose_f",error,total_error)
-     CALL h5tclose_f(attr6_type, error)
-     CALL check("h5tclose_f",error,total_error)
-
-     !
-     ! End access to the dataset and release resources used by it.
-     !
-     CALL h5dclose_f(dset_id, error)
-     CALL check("h5dclose_f",error,total_error)
-
-     !
-     ! Close the file.
-     !
-     CALL h5fclose_f(file_id, error)
-     CALL check("h5fclose_f",error,total_error)
-     !
-     ! Remove the file
-     !
-     IF (cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-
-     RETURN
-     END SUBROUTINE attribute_test
-END MODULE TH5A
diff --git a/fortran/test/tH5A_1_8.F90 b/fortran/test/tH5A_1_8.F90
new file mode 100644
index 0000000..c70e288
--- /dev/null
+++ b/fortran/test/tH5A_1_8.F90
@@ -0,0 +1,2779 @@
+!****h* root/fortran/test/tH5A_1_8.f90
+!
+! NAME
+!  tH5A_1_8.f90
+!
+! FUNCTION
+!  Basic testing of Fortran H5A APIs introduced in 1.8.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! CONTAINS SUBROUTINES
+!  attribute_test_1_8, test_attr_corder_create_compact, test_attr_null_space,
+!  test_attr_create_by_name, test_attr_info_by_idx, attr_info_by_idx_check,
+!  test_attr_shared_rename, test_attr_delete_by_idx, test_attr_shared_delete,
+!  test_attr_dense_open, test_attr_dense_verify, test_attr_corder_create_basic,
+!  test_attr_basic_write, test_attr_many, attr_open_check, 
+!
+!*****
+MODULE TH5A_1_8
+
+  USE HDF5 ! This module contains all necessary modules
+  USE TH5_MISC
+  USE TH5_MISC_GEN
+
+CONTAINS
+SUBROUTINE attribute_test_1_8(cleanup, total_error)
+
+!   This subroutine tests following 1.8 functionalities:
+!   h5acreate_f,  h5awrite_f, h5aclose_f,h5aread_f, h5aopen_name_f,
+!   h5aget_name_f,h5aget_space_f, h5aget_type_f, H5Pset_shared_mesg_nindexes_f,
+!   H5Pset_shared_mesg_index_f
+!
+
+
+  IMPLICIT NONE
+  LOGICAL, INTENT(IN)  :: cleanup
+  INTEGER, INTENT(INOUT) :: total_error
+
+  !
+  !general purpose integer
+  !
+  INTEGER     ::   i, j
+  INTEGER     ::   error ! Error flag
+
+  ! NEW STARTS HERE
+  INTEGER(HID_T) :: fapl = -1, fapl2 = -1
+  INTEGER(HID_T) :: fcpl = -1, fcpl2 = -1
+  INTEGER(HID_T) :: my_fapl, my_fcpl
+  LOGICAL, DIMENSION(1:2) :: new_format = (/.TRUE.,.FALSE./)
+  LOGICAL, DIMENSION(1:2) :: use_shared = (/.TRUE.,.FALSE./)
+
+  INTEGER :: ret_total_error
+
+! ********************
+! test_attr equivelent
+! ********************
+
+!  WRITE(*,*) "TESTING ATTRIBUTES"
+
+  CALL H5Pcreate_f(H5P_FILE_ACCESS_F,fapl,error)
+  CALL check("h5Pcreate_f",error,total_error)
+  CALL h5pcopy_f(fapl, fapl2, error)
+  CALL check("h5pcopy_f",error,total_error)
+
+  CALL H5Pcreate_f(H5P_FILE_CREATE_F,fcpl,error)
+  CALL check("h5Pcreate_f",error,total_error)
+
+  CALL h5pcopy_f(fcpl, fcpl2, error)
+  CALL check("h5pcopy_f",error,total_error)
+
+  CALL H5Pset_shared_mesg_nindexes_f(fcpl2,1,error)
+  CALL check("H5Pset_shared_mesg_nindexes_f",error, total_error)
+
+  CALL H5Pset_shared_mesg_index_f(fcpl2, 0, H5O_SHMESG_ATTR_FLAG_F, 1, error)
+  CALL check(" H5Pset_shared_mesg_index_f",error, total_error)
+
+  DO i = 1, 2
+
+     IF (new_format(i)) THEN
+        WRITE(*,'(1X,A)') "Testing with new file format:"
+        my_fapl = fapl2
+     ELSE
+        WRITE(*,'(1X,A)') "Testing with old file format:"
+        my_fapl = fapl
+     END IF
+     ret_total_error = 0
+     CALL test_attr_basic_write(my_fapl, ret_total_error)
+     CALL write_test_status(ret_total_error, &
+          '  - Tests INT attributes on both datasets and groups', &
+          total_error)
+
+     IF(new_format(i)) THEN
+        DO j = 1, 2
+           IF (use_shared(j)) THEN
+              WRITE(*,*) " - Testing with shared attributes:"
+              my_fcpl = fcpl2
+           ELSE
+              WRITE(*,*) " - Testing without shared attributes:"
+              my_fcpl = fcpl
+           END IF
+
+           ret_total_error = 0
+           CALL test_attr_dense_open(my_fcpl, my_fapl, ret_total_error)
+           CALL write_test_status(ret_total_error, &
+                '   - Testing INT attributes on both datasets and groups', &
+                total_error)
+
+           ret_total_error = 0
+           CALL test_attr_null_space(my_fcpl, my_fapl, ret_total_error)
+           CALL write_test_status(ret_total_error, &
+                '   - Testing storing attribute with "null" dataspace', &
+                total_error)
+           ret_total_error = 0
+           CALL test_attr_many(new_format(i), my_fcpl, my_fapl, ret_total_error)
+           CALL write_test_status(ret_total_error, &
+                '   - Testing storing lots of attributes', &
+                total_error)
+
+           ret_total_error = 0
+           CALL test_attr_corder_create_basic(my_fcpl, my_fapl, ret_total_error)
+           CALL write_test_status(ret_total_error, &
+                '   - Testing creating objects with attribute creation order', &
+                total_error)
+
+           ret_total_error = 0
+           CALL test_attr_corder_create_compact(my_fcpl, my_fapl, ret_total_error)
+           CALL write_test_status(ret_total_error, &
+                '   - Testing compact storage on objects with attribute creation order', &
+                total_error)
+           ret_total_error = 0
+           CALL test_attr_info_by_idx(new_format(i), my_fcpl, my_fapl, ret_total_error)
+           CALL write_test_status(ret_total_error, &
+                '   - Testing querying attribute info by index', &
+                total_error)
+
+           ret_total_error = 0
+           CALL test_attr_delete_by_idx(new_format(i), my_fcpl, my_fapl, ret_total_error)
+           CALL write_test_status(ret_total_error, &
+                '   - Testing deleting attribute by index', &
+                total_error)
+
+           ret_total_error = 0
+           CALL test_attr_create_by_name(new_format(i), my_fcpl, my_fapl, ret_total_error)
+           CALL write_test_status(ret_total_error, &
+                '   - Testing creating attributes by name', &
+                total_error)
+
+             !  More complex tests with both "new format" and "shared" attributes 
+           IF( use_shared(j) ) THEN
+              ret_total_error = 0
+              CALL test_attr_shared_rename(my_fcpl, my_fapl, ret_total_error)
+              CALL write_test_status(ret_total_error,&
+                   '   - Testing renaming shared attributes in "compact" & "dense" storage', &
+                   total_error)
+
+              ret_total_error = 0
+              CALL test_attr_shared_delete(my_fcpl, my_fapl, ret_total_error)
+              CALL write_test_status(ret_total_error,&
+                   '   - Testing deleting shared attributes in "compact" & "dense" storage', &
+                   total_error)
+
+           END IF
+        END DO
+     END IF
+  ENDDO
+
+  CALL H5Pclose_f(fcpl, error)
+  CALL CHECK("H5Pclose", error,total_error)
+  CALL H5Pclose_f(fcpl2, error)
+  CALL CHECK("H5Pclose", error,total_error)
+
+  IF(cleanup) CALL h5_cleanup_f("tattr", H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+
+
+  RETURN
+END SUBROUTINE attribute_test_1_8
+
+SUBROUTINE test_attr_corder_create_compact(fcpl,fapl, total_error)
+
+!***************************************************************
+!**
+!**  test_attr_corder_create_compact(): Test basic H5A (attribute) code.
+!**      Tests compact attribute storage on objects with attribute creation order info
+!**
+!***************************************************************
+
+! Needed for get_info_by_name
+
+
+  IMPLICIT NONE
+
+! - - - arg types - - -
+
+  INTEGER(HID_T), INTENT(IN) :: fcpl
+  INTEGER(HID_T), INTENT(IN) :: fapl
+
+  CHARACTER(LEN=8) :: FileName = "tattr.h5"
+  INTEGER(HID_T) :: fid
+  INTEGER(HID_T) :: dcpl
+  INTEGER(HID_T) :: sid
+
+  INTEGER :: error
+  INTEGER, INTENT(INOUT) :: total_error
+
+  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
+  CHARACTER(LEN=8) :: DSET2_NAME = "Dataset2"
+  CHARACTER(LEN=8) :: DSET3_NAME = "Dataset3"
+  INTEGER, PARAMETER :: NUM_DSETS = 3
+
+  INTEGER :: curr_dset
+
+  INTEGER(HID_T) :: dset1, dset2, dset3
+  INTEGER(HID_T) :: my_dataset
+
+  INTEGER :: u
+
+  INTEGER :: max_compact ! Maximum # of links to store in group compactly
+  INTEGER :: min_dense   ! Minimum # of links to store in group "densely"
+
+  CHARACTER(LEN=7) :: attrname
+  CHARACTER(LEN=2) :: chr2
+  INTEGER(HID_T) :: attr        !String Attribute identifier
+  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
+
+  LOGICAL :: f_corder_valid ! Indicates whether the the creation order data is valid for this attribute
+  INTEGER :: corder ! Is a positive integer containing the creation order of the attribute
+  INTEGER :: cset ! Indicates the character set used for the attribute’s name
+  INTEGER(HSIZE_T) :: data_size   ! indicates the size, in the number of characters
+
+  data_dims = 0
+
+!  WRITE(*,*) "     - Testing Compact Storage of Attributes with Creation Order Info"
+  !  Create file 
+  CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl)
+  CALL check("h5fcreate_f",error,total_error)
+  !  Create dataset creation property list 
+  CALL H5Pcreate_f(H5P_DATASET_CREATE_F,dcpl,error)
+  CALL check("h5Pcreate_f",error,total_error)
+
+  CALL H5Pset_attr_creation_order_f(dcpl, IOR(H5P_CRT_ORDER_TRACKED_F, H5P_CRT_ORDER_INDEXED_F), error)
+  CALL check("H5Pset_attr_creation_order",error,total_error)
+
+  !  Query the attribute creation properties 
+  CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
+  CALL check("H5Pget_attr_phase_change_f",error,total_error)
+
+  CALL h5screate_f(H5S_SCALAR_F, sid, error)
+  CALL check("h5screate_f",error,total_error)
+
+  CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dset1, error, dcpl_id=dcpl )
+  CALL check("h5dcreate_f",error,total_error)
+
+  CALL h5dcreate_f(fid, DSET2_NAME, H5T_NATIVE_CHARACTER, sid, dset2, error, dcpl )
+  CALL check("h5dcreate_f",error,total_error)
+
+  CALL h5dcreate_f(fid, DSET3_NAME, H5T_NATIVE_CHARACTER, sid, dset3, error, dcpl_id=dcpl )
+  CALL check("h5dcreate_f",error,total_error)
+
+  DO curr_dset = 0,NUM_DSETS-1
+     SELECT CASE (curr_dset)
+     CASE (0)
+        my_dataset = dset1
+     CASE (1)
+        my_dataset = dset2
+     CASE (2)
+        my_dataset = dset3
+     END SELECT
+    DO u = 0, max_compact - 1
+       !  Create attribute 
+       WRITE(chr2,'(I2.2)') u
+       attrname = 'attr '//chr2
+
+       CALL h5acreate_f(my_dataset, attrname, H5T_NATIVE_INTEGER, sid, attr, error)
+       CALL check("h5acreate_f",error,total_error)
+
+       data_dims(1) = 1
+       CALL h5awrite_f(attr, H5T_NATIVE_INTEGER, u, data_dims, error)
+       CALL check("h5awrite_f",error,total_error)
+
+       CALL h5aclose_f(attr, error)
+       CALL check("h5aclose_f",error,total_error)
+
+    END DO
+  END DO
+
+  !   Close Datasets 
+  CALL h5dclose_f(dset1, error)
+  CALL check("h5dclose_f",error,total_error)
+  CALL h5dclose_f(dset2, error)
+  CALL check("h5dclose_f",error,total_error)
+  CALL h5dclose_f(dset3, error)
+  CALL check("h5dclose_f",error,total_error)
+
+  !    Close file 
+  CALL h5fclose_f(fid, error)
+  CALL check("h5fclose_f",error,total_error)
+
+  !  Close dataspace 
+  CALL h5sclose_f(sid, error)
+  CALL check("h5sclose_f",error,total_error)
+
+  !  Close property list 
+  CALL h5pclose_f(dcpl, error)
+  CALL check("h5pclose_f",error,total_error)
+
+  CALL h5fopen_f(FileName, H5F_ACC_RDWR_F, fid, error, fapl)
+  CALL check("h5open_f",error,total_error)
+
+  CALL h5dopen_f(fid, DSET1_NAME, dset1, error)
+  CALL check("h5dopen_f",error,total_error)
+  CALL h5dopen_f(fid, DSET2_NAME, dset2, error)
+  CALL check("h5dopen_f",error,total_error)
+  CALL h5dopen_f(fid, DSET3_NAME, dset3, error)
+  CALL check("h5dopen_f",error,total_error)
+  DO curr_dset = 0,NUM_DSETS-1
+     SELECT CASE (curr_dset)
+     CASE (0)
+        my_dataset = dset1
+     CASE (1)
+        my_dataset = dset2
+     CASE (2)
+        my_dataset = dset3
+     CASE DEFAULT
+        WRITE(*,*) " WARNING: To many data sets! "
+     END SELECT
+     DO u = 0,max_compact-1
+        WRITE(chr2,'(I2.2)') u
+        attrname = 'attr '//chr2
+        !  Retrieve information for attribute 
+
+        CALL H5Aget_info_by_name_f(my_dataset, ".", attrname, &
+             f_corder_valid, corder, cset, data_size, error, lapl_id = H5P_DEFAULT_F ) !with optional
+
+        CALL check("H5Aget_info_by_name_f", error, total_error)
+
+        !  Verify creation order of attribute 
+
+        CALL verify("H5Aget_info_by_name_f", f_corder_valid, .TRUE., total_error)
+        CALL verify("H5Aget_info_by_name_f", corder, u, total_error)
+
+
+        !  Retrieve information for attribute 
+
+        CALL H5Aget_info_by_name_f(my_dataset, ".", attrname, &
+             f_corder_valid, corder, cset, data_size, error) ! without optional
+
+        CALL check("H5Aget_info_by_name_f", error, total_error)
+
+        !  Verify creation order of attribute 
+
+        CALL verify("H5Aget_info_by_name_f", f_corder_valid, .TRUE., total_error)
+        CALL verify("H5Aget_info_by_name_f", corder, u, total_error)
+
+     END DO
+  END DO
+  !   Close Datasets 
+  CALL h5dclose_f(dset1, error)
+  CALL check("h5dclose_f",error,total_error)
+  CALL h5dclose_f(dset2, error)
+  CALL check("h5dclose_f",error,total_error)
+  CALL h5dclose_f(dset3, error)
+  CALL check("h5dclose_f",error,total_error)
+
+  !    Close file 
+  CALL h5fclose_f(fid, error)
+  CALL check("h5fclose_f",error,total_error)
+
+END SUBROUTINE test_attr_corder_create_compact
+
+SUBROUTINE test_attr_null_space(fcpl, fapl, total_error)
+!***************************************************************
+!**
+!**  test_attr_null_space(): Test basic H5A (attribute) code.
+!**      Tests storing attribute with "null" dataspace
+!**
+!***************************************************************
+
+
+  IMPLICIT NONE
+
+  INTEGER(HID_T), INTENT(IN) :: fcpl
+  INTEGER(HID_T), INTENT(IN) :: fapl
+  INTEGER, INTENT(INOUT) :: total_error
+
+  CHARACTER(LEN=8) :: FileName = "tattr.h5"
+  INTEGER(HID_T) :: fid
+  INTEGER(HID_T) :: sid, null_sid
+  INTEGER(HID_T) :: dataset
+
+  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
+
+  INTEGER :: error
+
+  INTEGER :: value_scalar
+  INTEGER, DIMENSION(1) :: value
+  INTEGER(HID_T) :: attr        !String Attribute identifier
+  INTEGER(HID_T) :: attr_sid
+  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
+
+  INTEGER(HSIZE_T) :: storage_size   ! attributes storage requirements
+
+  LOGICAL :: f_corder_valid ! Indicates whether the the creation order data is valid for this attribute
+  INTEGER :: corder ! Is a positive integer containing the creation order of the attribute
+  INTEGER :: cset ! Indicates the character set used for the attribute’s name
+  INTEGER(HSIZE_T) :: data_size   ! indicates the size, in the number of characters
+
+  LOGICAL :: equal
+
+  ! test: H5Sextent_equal_f
+
+  data_dims = 0
+
+  !  Create file 
+  CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl)
+  CALL check("h5fcreate_f",error,total_error)
+  !  Close file 
+  CALL h5fclose_f(fid, error)
+  CALL check("h5fclose_f",error,total_error)
+
+  !  Re-open file 
+  CALL h5fopen_f(FileName, H5F_ACC_RDWR_F, fid, error)
+  CALL check("h5open_f",error,total_error)
+  !  Create dataspace for dataset attributes 
+  CALL h5screate_f(H5S_SCALAR_F, sid, error)
+  CALL check("h5screate_f",error,total_error)
+  !  Create "null" dataspace for attribute 
+  CALL h5screate_f(H5S_NULL_F, null_sid, error)
+  CALL check("h5screate_f",error,total_error)
+  !  Create a dataset 
+  CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dataset, error)
+  CALL check("h5dcreate_f",error,total_error)
+  !  Add attribute with 'null' dataspace 
+
+  !  Create attribute 
+  CALL h5acreate_f(dataset, "null attr", H5T_NATIVE_INTEGER, null_sid, attr, error)
+  CALL check("h5acreate_f",error,total_error)
+
+  !  Try to read data from the attribute 
+  !  (shouldn't fail, but should leave buffer alone) 
+  value(1) = 103
+  data_dims(1) = 1
+  CALL h5aread_f(attr, H5T_NATIVE_INTEGER, value, data_dims, error)
+  CALL check("h5aread_f",error,total_error)
+  CALL verify("h5aread_f",value(1),103,total_error)
+
+!  Try to read data from the attribute again but
+!  for a scalar 
+
+  value_scalar = 104
+  data_dims(1) = 1
+  CALL h5aread_f(attr, H5T_NATIVE_INTEGER, value_scalar, data_dims, error)
+  CALL check("h5aread_f",error,total_error)
+  CALL verify("h5aread_f",value_scalar,104,total_error)
+
+  CALL h5aget_space_f(attr, attr_sid, error)
+  CALL check("h5aget_space_f",error,total_error)
+
+  CALL H5Sextent_equal_f(attr_sid, null_sid, equal, error)
+  CALL check("H5Sextent_equal_f",error,total_error)
+  CALL verify("H5Sextent_equal_f",equal,.TRUE.,total_error)
+
+  CALL h5aget_storage_size_f(attr, storage_size, error)
+  CALL check("h5aget_storage_size_f",error,total_error)
+  CALL verify("h5aget_storage_size_f",INT(storage_size),0,total_error)
+
+  CALL h5aget_info_f(attr, f_corder_valid, corder, cset, data_size,  error)
+  CALL check("h5aget_info_f", error, total_error)
+
+  !  Check the attribute's information 
+  CALL verify("h5aget_info_f.corder",corder,0,total_error)
+
+  CALL verify("h5aget_info_f.cset", cset, H5T_CSET_ASCII_F, total_error)
+  CALL h5aget_storage_size_f(attr, storage_size, error)
+  CALL check("h5aget_storage_size_f",error,total_error)
+  CALL verify("h5aget_info_f.data_size", INT(data_size), INT(storage_size), total_error)
+  CALL h5aclose_f(attr,error)
+  CALL check("h5aclose_f",error,total_error)
+
+  CALL H5Sclose_f(attr_sid, error)
+  CALL check("H5Sclose_f",error,total_error)
+
+  CALL H5Dclose_f(dataset, error)
+  CALL check("H5Dclose_f", error,total_error)
+
+
+  CALL H5Fclose_f(fid, error)
+  CALL check("H5Fclose_f", error,total_error)
+
+  CALL H5Sclose_f(sid, error)
+  CALL check("H5Sclose_f", error,total_error)
+
+  CALL H5Sclose_f(null_sid, error)
+  CALL check("H5Sclose_f", error,total_error)
+
+END SUBROUTINE test_attr_null_space
+
+
+SUBROUTINE test_attr_create_by_name(new_format,fcpl,fapl, total_error)
+
+!***************************************************************
+!**
+!**  test_attr_create_by_name(): Test basic H5A (attribute) code.
+!**      Tests creating attributes by name
+!**
+!***************************************************************
+
+  IMPLICIT NONE
+
+  INTEGER(SIZE_T), PARAMETER :: NAME_BUF_SIZE = 7
+  LOGICAL :: new_format
+  INTEGER(HID_T), INTENT(IN) :: fcpl
+  INTEGER(HID_T), INTENT(IN) :: fapl
+  INTEGER, INTENT(INOUT) :: total_error
+
+  INTEGER :: max_compact,min_dense,u
+  CHARACTER (LEN=NAME_BUF_SIZE) :: attrname
+  CHARACTER(LEN=8) :: dsetname
+
+  CHARACTER(LEN=8) :: FileName = "tattr.h5"
+  INTEGER(HID_T) :: fid
+  INTEGER(HID_T) :: dcpl
+  INTEGER(HID_T) :: sid
+
+  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
+  CHARACTER(LEN=8) :: DSET2_NAME = "Dataset2"
+  CHARACTER(LEN=8) :: DSET3_NAME = "Dataset3"
+  INTEGER, PARAMETER :: NUM_DSETS = 3
+
+  INTEGER :: curr_dset
+
+  INTEGER(HID_T) :: dset1, dset2, dset3
+  INTEGER(HID_T) :: my_dataset
+  INTEGER :: error
+
+  INTEGER(HID_T) :: attr        !String Attribute identifier
+  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
+
+
+  CHARACTER(LEN=2) :: chr2
+  LOGICAL, DIMENSION(1:2) :: use_index = (/.FALSE.,.TRUE./)
+  INTEGER :: Input1
+  INTEGER :: i
+
+  data_dims = 0
+
+
+  !  Create dataspace for dataset & attributes 
+  CALL h5screate_f(H5S_SCALAR_F, sid, error)
+  CALL check("h5screate_f",error,total_error)
+
+  !  Create dataset creation property list 
+  CALL H5Pcreate_f(H5P_DATASET_CREATE_F,dcpl,error)
+  CALL check("h5Pcreate_f",error,total_error)
+
+  !  Query the attribute creation properties 
+
+  CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
+  CALL check("H5Pget_attr_phase_change_f",error,total_error)
+
+  !  Loop over using index for creation order value 
+  DO i = 1, 2
+     !  Print appropriate test message 
+     IF(use_index(i))THEN
+        WRITE(*,*) "   - Testing Creating Attributes By Name w/Creation Order Index"
+     ELSE
+        WRITE(*,*) "   - Testing Creating Attributes By Name w/o Creation Order Index"
+     ENDIF
+     !  Create file 
+     CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl)
+     CALL check("h5fcreate_f",error,total_error)
+
+     !  Set attribute creation order tracking & indexing for object 
+     IF(new_format)THEN
+
+        IF(use_index(i))THEN
+           Input1 = H5P_CRT_ORDER_INDEXED_F
+        ELSE
+           Input1 = 0
+        ENDIF
+
+        CALL H5Pset_attr_creation_order_f(dcpl, IOR(H5P_CRT_ORDER_TRACKED_F, Input1), error)
+        CALL check("H5Pset_attr_creation_order",error,total_error)
+
+     ENDIF
+
+     !  Create datasets 
+
+     CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dset1, error, dcpl_id=dcpl )
+     CALL check("h5dcreate_f2",error,total_error)
+
+     CALL h5dcreate_f(fid, DSET2_NAME, H5T_NATIVE_CHARACTER, sid, dset2, error, dcpl_id=dcpl )
+     CALL check("h5dcreate_f3",error,total_error)
+
+     CALL h5dcreate_f(fid, DSET3_NAME, H5T_NATIVE_CHARACTER, sid, dset3, error, dcpl_id=dcpl )
+     CALL check("h5dcreate_f4",error,total_error)
+
+
+     !  Work on all the datasets 
+
+     DO curr_dset = 0,NUM_DSETS-1
+        SELECT CASE (curr_dset)
+        CASE (0)
+           my_dataset = dset1
+           dsetname = DSET1_NAME
+        CASE (1)
+           my_dataset = dset2
+           dsetname = DSET2_NAME
+        CASE (2)
+           my_dataset = dset3
+           dsetname = DSET3_NAME
+           !     CASE DEFAULT
+           !        CALL HDassert(0.AND."Toomanydatasets!")
+        END SELECT
+
+
+        ! Create attributes, up to limit of compact form 
+
+        DO u = 0, max_compact - 1
+           !  Create attribute 
+           WRITE(chr2,'(I2.2)') u
+           attrname = 'attr '//chr2
+           CALL H5Acreate_by_name_f(fid, dsetname, attrname, H5T_NATIVE_INTEGER, sid, &
+                attr, error, lapl_id=H5P_DEFAULT_F, acpl_id=H5P_DEFAULT_F, aapl_id=H5P_DEFAULT_F)
+           CALL check("H5Acreate_by_name_f",error,total_error)
+
+           !  Write data into the attribute 
+
+           data_dims(1) = 1
+           CALL h5awrite_f(attr, H5T_NATIVE_INTEGER, u, data_dims, error)
+           CALL check("h5awrite_f",error,total_error)
+
+           !  Close attribute 
+           CALL h5aclose_f(attr, error)
+           CALL check("h5aclose_f",error,total_error)
+
+           !  Verify information for NEW attribute 
+           CALL attr_info_by_idx_check(my_dataset, attrname, INT(u,HSIZE_T), use_index(i), total_error)
+         !   CALL check("FAILED IN attr_info_by_idx_check",total_error)
+        ENDDO
+
+        !  Test opening attributes stored compactly 
+
+        CALL attr_open_check(fid, dsetname, my_dataset, u, total_error)
+
+     ENDDO
+
+
+     !  Work on all the datasets 
+     DO curr_dset = 0,NUM_DSETS-1
+        SELECT CASE (curr_dset)
+        CASE (0)
+           my_dataset = dset1
+           dsetname = DSET1_NAME
+        CASE (1)
+           my_dataset = dset2
+           dsetname = DSET2_NAME
+        CASE (2)
+           my_dataset = dset3
+           dsetname = DSET3_NAME
+        END SELECT
+
+        !  Create more attributes, to push into dense form 
+        DO u = max_compact, max_compact* 2 - 1
+
+           WRITE(chr2,'(I2.2)') u
+           attrname = 'attr '//chr2
+
+           CALL H5Acreate_by_name_f(fid, dsetname, attrname, H5T_NATIVE_INTEGER, sid, &
+                attr, error, lapl_id=H5P_DEFAULT_F)
+           CALL check("H5Acreate_by_name",error,total_error)
+
+           !  Write data into the attribute 
+           data_dims(1) = 1
+           CALL h5awrite_f(attr, H5T_NATIVE_INTEGER, u, data_dims, error)
+           CALL check("h5awrite_f",error,total_error)
+
+           !  Close attribute 
+           CALL h5aclose_f(attr, error)
+           CALL check("h5aclose_f",error,total_error)
+
+        ENDDO
+
+     ENDDO
+
+     !  Close Datasets 
+     CALL h5dclose_f(dset1, error)
+     CALL check("h5dclose_f",error,total_error)
+     CALL h5dclose_f(dset2, error)
+     CALL check("h5dclose_f",error,total_error)
+     CALL h5dclose_f(dset3, error)
+     CALL check("h5dclose_f",error,total_error)
+
+
+     !  Close file 
+     CALL h5fclose_f(fid, error)
+     CALL check("h5fclose_f",error,total_error)
+  ENDDO
+
+  !  Close property list 
+  CALL h5pclose_f(dcpl, error)
+  CALL check("h5pclose_f",error,total_error)
+
+  !  Close dataspace 
+  CALL h5sclose_f(sid, error)
+  CALL check("h5sclose_f",error,total_error)
+
+END SUBROUTINE test_attr_create_by_name
+
+
+SUBROUTINE test_attr_info_by_idx(new_format, fcpl, fapl, total_error)
+
+!***************************************************************
+!**
+!**  test_attr_info_by_idx(): Test basic H5A (attribute) code.
+!**      Tests querying attribute info by index
+!**
+!***************************************************************
+
+  IMPLICIT NONE
+
+  LOGICAL :: new_format
+  INTEGER(HID_T), INTENT(IN) :: fcpl
+  INTEGER(HID_T), INTENT(IN) :: fapl
+  INTEGER, INTENT(INOUT) :: total_error
+  CHARACTER(LEN=8) :: FileName = "tattr.h5"
+  INTEGER(HID_T) :: fid
+  INTEGER(HID_T) :: dcpl
+  INTEGER(HID_T) :: sid
+
+  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
+  CHARACTER(LEN=8) :: DSET2_NAME = "Dataset2"
+  CHARACTER(LEN=8) :: DSET3_NAME = "Dataset3"
+  INTEGER, PARAMETER :: NUM_DSETS = 3
+
+  INTEGER :: curr_dset
+
+  INTEGER(HID_T) :: dset1, dset2, dset3
+  INTEGER(HID_T) :: my_dataset
+  INTEGER :: error
+
+  INTEGER(HID_T) :: attr        !String Attribute identifier
+  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
+
+  LOGICAL :: f_corder_valid ! Indicates whether the the creation order data is valid for this attribute
+  INTEGER :: corder ! Is a positive integer containing the creation order of the attribute
+  INTEGER :: cset ! Indicates the character set used for the attribute’s name
+  INTEGER(HSIZE_T) :: data_size   ! indicates the size, in the number of characters
+  INTEGER(HSIZE_T) :: n
+  LOGICAL, DIMENSION(1:2) :: use_index = (/.FALSE.,.TRUE./)
+
+  INTEGER :: max_compact ! Maximum # of links to store in group compactly
+  INTEGER :: min_dense   ! Minimum # of links to store in group "densely"
+
+  CHARACTER(LEN=2) :: chr2
+
+  INTEGER :: i, j
+
+  INTEGER, DIMENSION(1) ::  attr_integer_data
+  CHARACTER(LEN=7) :: attrname
+
+  INTEGER(SIZE_T) :: size
+  CHARACTER(LEN=80) :: tmpname
+
+  INTEGER :: Input1
+  INTEGER(HSIZE_T) :: hzero = 0_HSIZE_T
+  INTEGER :: minusone = -1
+  INTEGER(HSIZE_T) :: htmp
+
+  data_dims = 0
+
+  !  Create dataspace for dataset & attributes 
+
+  CALL h5screate_f(H5S_SCALAR_F, sid, error)
+  CALL check("h5screate_f",error,total_error)
+
+
+  !  Create dataset creation property list 
+
+  CALL H5Pcreate_f(H5P_DATASET_CREATE_F,dcpl,error)
+  CALL check("h5Pcreate_f",error,total_error)
+
+
+  !  Query the attribute creation properties 
+  CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
+  CALL check("H5Pget_attr_phase_change_f",error,total_error)
+
+  !   Loop over using index for creation order value 
+
+  DO i = 1, 2
+
+     !  Create file 
+     CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl)
+     CALL check("h5fcreate_f",error,total_error)
+
+     !  Set attribute creation order tracking & indexing for object 
+     IF(new_format)THEN
+        IF(use_index(i))THEN
+           Input1 = H5P_CRT_ORDER_INDEXED_F
+        ELSE
+           Input1 = 0
+        ENDIF
+        CALL H5Pset_attr_creation_order_f(dcpl, IOR(H5P_CRT_ORDER_TRACKED_F, Input1), error)
+        CALL check("H5Pset_attr_creation_order",error,total_error)
+     ENDIF
+
+     !  Create datasets 
+
+     CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dset1, error )
+     CALL check("h5dcreate_f",error,total_error)
+
+     CALL h5dcreate_f(fid, DSET2_NAME, H5T_NATIVE_CHARACTER, sid, dset2, error )
+     CALL check("h5dcreate_f",error,total_error)
+
+     CALL h5dcreate_f(fid, DSET3_NAME, H5T_NATIVE_CHARACTER, sid, dset3, error )
+     CALL check("h5dcreate_f",error,total_error)
+
+     !  Work on all the datasets 
+
+     DO curr_dset = 0,NUM_DSETS-1
+
+        SELECT CASE (curr_dset)
+        CASE (0)
+           my_dataset = dset1
+        CASE (1)
+           my_dataset = dset2
+        CASE (2)
+           my_dataset = dset3
+        END SELECT
+
+        !  Check for query on non-existant attribute 
+
+        n = 0
+
+        ! -- CHECK PASSING AN INTEGER CONSTANT IN DIFFERENT FORMS --
+
+        ! 1) call by passing an integer with the _hsize_t declaration
+
+        CALL h5aget_info_by_idx_f(my_dataset, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, 0_hsize_t, &
+             f_corder_valid, corder, cset, data_size, error, lapl_id=H5P_DEFAULT_F)
+        CALL verify("h5aget_info_by_idx_f",error,minusone,total_error)
+
+        ! 2) call by passing an integer with the INT(,hsize_t) declaration
+
+        CALL h5aget_info_by_idx_f(my_dataset, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, INT(0,hsize_t), &
+             f_corder_valid, corder, cset, data_size, error, lapl_id=H5P_DEFAULT_F)
+        CALL verify("h5aget_info_by_idx_f",error,minusone,total_error)
+
+
+        ! 3) call by passing a variable with the attribute hsize_t
+
+        CALL h5aget_info_by_idx_f(my_dataset, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, hzero, &
+             f_corder_valid, corder, cset, data_size, error, lapl_id=H5P_DEFAULT_F)
+        CALL verify("h5aget_info_by_idx_f",error,minusone,total_error)
+
+        CALL h5aget_name_by_idx_f(my_dataset, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, &
+             hzero, tmpname,  error, size, lapl_id=H5P_DEFAULT_F)
+        CALL verify("h5aget_name_by_idx_f",error,minusone,total_error)
+
+
+        !  Create attributes, up to limit of compact form 
+
+        DO j = 0, max_compact-1
+           !  Create attribute 
+           WRITE(chr2,'(I2.2)') j
+           attrname = 'attr '//chr2
+
+           ! check with the optional information create2 specs.
+           CALL h5acreate_f(my_dataset, attrname, H5T_NATIVE_INTEGER, sid, attr, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
+           CALL check("h5acreate_f",error,total_error)
+
+           !  Write data into the attribute 
+
+           attr_integer_data(1) = j
+           data_dims(1) = 1
+           CALL h5awrite_f(attr, H5T_NATIVE_INTEGER, attr_integer_data, data_dims, error)
+           CALL check("h5awrite_f",error,total_error)
+
+           !  Close attribute 
+
+           CALL h5aclose_f(attr, error)
+           CALL check("h5aclose_f",error,total_error)
+
+           !  Verify information for new attribute 
+
+!EP        CALL attr_info_by_idx_check(my_dataset, attrname, INT(j,HSIZE_T), use_index(i), total_error )
+           htmp = j
+           CALL attr_info_by_idx_check(my_dataset, attrname, htmp, use_index(i), total_error )
+
+           !CHECK(ret, FAIL, "attr_info_by_idx_check");
+        ENDDO
+
+     ENDDO
+
+
+     !   Close Datasets 
+     CALL h5dclose_f(dset1, error)
+     CALL check("h5dclose_f",error,total_error)
+     CALL h5dclose_f(dset2, error)
+     CALL check("h5dclose_f",error,total_error)
+     CALL h5dclose_f(dset3, error)
+     CALL check("h5dclose_f",error,total_error)
+
+     !    Close file 
+     CALL h5fclose_f(fid, error)
+     CALL check("h5fclose_f",error,total_error)
+
+  END DO
+
+  !  Close property list 
+  CALL h5pclose_f(dcpl,error)
+  CALL check("h5pclose_f", error, total_error)
+
+  !  Close dataspace 
+  CALL h5sclose_f(sid, error)
+  CALL check("h5sclose_f",error,total_error)
+
+END SUBROUTINE test_attr_info_by_idx
+
+
+SUBROUTINE attr_info_by_idx_check(obj_id, attrname, n, use_index, total_error )
+
+  IMPLICIT NONE
+
+  INTEGER :: error, total_error
+
+  INTEGER(HID_T) :: obj_id
+  CHARACTER(LEN=*) :: attrname
+  INTEGER(HSIZE_T) :: n
+  LOGICAL :: use_index
+  LOGICAL :: f_corder_valid ! Indicates whether the the creation order data is valid for this attribute
+  INTEGER :: corder ! Is a positive integer containing the creation order of the attribute
+  INTEGER :: cset ! Indicates the character set used for the attribute’s name
+  INTEGER(HSIZE_T) :: data_size   ! indicates the size, in the number of characters
+
+  INTEGER(SIZE_T) :: NAME_BUF_SIZE = 7
+  CHARACTER(LEN=7) :: tmpname
+  INTEGER(HSIZE_T) :: hzero = 0_HSIZE_T
+
+
+  !  Verify the information for first attribute, in increasing creation order 
+  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, hzero, &
+       f_corder_valid, corder, cset, data_size, error)
+
+  CALL check("h5aget_info_by_idx_f",error,total_error)
+  CALL verify("h5aget_info_by_idx_f",corder,0,total_error)
+  !  Verify the information for new attribute, in increasing creation order 
+
+  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, n, &
+       f_corder_valid, corder, cset, data_size, error)
+
+  CALL check("h5aget_info_by_idx_f",error,total_error)
+  CALL verify("h5aget_info_by_idx_f",corder,INT(n),total_error)
+
+  !  Verify the name for new link, in increasing creation order 
+
+  ! Try with the correct buffer size
+
+  CALL h5aget_name_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, &
+       n, tmpname, error, NAME_BUF_SIZE)
+  CALL check("h5aget_name_by_idx_f",error,total_error)
+  CALL verify("h5aget_name_by_idx_f", INT(NAME_BUF_SIZE), 7, error)
+
+  IF(attrname.NE.tmpname)THEN
+     error = -1
+  ENDIF
+  CALL verify("h5aget_name_by_idx_f",error,0,total_error)
+
+  !   Don't test "native" order if there is no creation order index, since
+  !   *  there's not a good way to easily predict the attribute's order in the name
+  !   *  index.
+  !   
+  IF (use_index) THEN
+     !  Verify the information for first attribute, in native creation order 
+     CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_NATIVE_F, hzero, &
+          f_corder_valid, corder, cset, data_size, error)
+     CALL check("h5aget_info_by_idx_f",error,total_error)
+     CALL verify("h5aget_info_by_idx_f",corder,0,total_error)
+
+     !  Verify the information for new attribute, in native creation order 
+     CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_NATIVE_F, n, &
+          f_corder_valid, corder, cset, data_size, error)
+     CALL check("h5aget_info_by_idx_f",error,total_error)
+     CALL verify("h5aget_info_by_idx_f",corder,INT(n),total_error)
+
+   !  Verify the name for new link, in increasing native order 
+     CALL h5aget_name_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_NATIVE_F, &
+          n, tmpname, error) ! check with no optional parameters
+     CALL check("h5aget_name_by_idx_f",error,total_error)
+     IF(TRIM(attrname).NE.TRIM(tmpname))THEN
+        WRITE(*,*) "ERROR: attribute name size wrong!"
+        error = -1
+     ENDIF
+     CALL verify("h5aget_name_by_idx_f",error,0,total_error)
+  END IF
+
+
+  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_DEC_F, n, &
+       f_corder_valid, corder, cset, data_size, error)
+  CALL check("h5aget_info_by_idx_f",error,total_error)
+  CALL verify("h5aget_info_by_idx_f",corder,0,total_error)
+
+!EP  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_DEC_F, 0_HSIZE_T, &
+
+  ! -- CHECK PASSING AN INTEGER CONSTANT IN DIFFERENT FORMS --
+
+  ! 1) call by passing an integer with the _hsize_t declaration
+
+  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_DEC_F, 0_HSIZE_T, &
+       f_corder_valid, corder, cset, data_size, error)
+  CALL check("h5aget_info_by_idx_f",error,total_error)
+  CALL verify("h5aget_info_by_idx_f",corder,INT(n),total_error)
+
+  ! 2) call by passing an integer with the INT(,hsize_t) declaration
+
+  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_DEC_F, INT(0,HSIZE_T), &
+       f_corder_valid, corder, cset, data_size, error)
+  CALL check("h5aget_info_by_idx_f",error,total_error)
+  CALL verify("h5aget_info_by_idx_f",corder,INT(n),total_error)
+
+  ! 3) call by passing a variable with the attribute hsize_t
+
+  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_DEC_F, hzero, &
+       f_corder_valid, corder, cset, data_size, error)
+  CALL check("h5aget_info_by_idx_f",error,total_error)
+  CALL verify("h5aget_info_by_idx_f",corder,INT(n),total_error)
+
+!EP  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_NAME_F, H5_ITER_INC_F, 0_HSIZE_T, &
+  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_NAME_F, H5_ITER_INC_F, hzero, &
+       f_corder_valid, corder, cset, data_size, error)
+  CALL check("h5aget_info_by_idx_f",error,total_error)
+  CALL verify("h5aget_info_by_idx_f",corder,0,total_error)
+  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_NAME_F, H5_ITER_INC_F, n, &
+       f_corder_valid, corder, cset, data_size, error)
+  CALL check("h5aget_info_by_idx_f",error,total_error)
+  CALL verify("h5aget_info_by_idx_f",corder,INT(n),total_error)
+
+  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_NAME_F, H5_ITER_DEC_F, n, &
+       f_corder_valid, corder, cset, data_size, error)
+  CALL check("h5aget_info_by_idx_f",error,total_error)
+  CALL verify("h5aget_info_by_idx_f",corder,0,total_error)
+!EP  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_NAME_F, H5_ITER_DEC_F, 0_HSIZE_T, &
+  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_NAME_F, H5_ITER_DEC_F, hzero, &
+       f_corder_valid, corder, cset, data_size, error)
+  CALL check("h5aget_info_by_idx_f",error,total_error)
+  CALL verify("h5aget_info_by_idx_f",corder,INT(n),total_error)
+
+
+END SUBROUTINE attr_info_by_idx_check
+
+
+SUBROUTINE test_attr_shared_rename( fcpl, fapl, total_error)
+
+!***************************************************************
+!**
+!**  test_attr_shared_rename(): Test basic H5A (attribute) code.
+!**      Tests renaming shared attributes in "compact" & "dense" storage
+!**
+!***************************************************************
+
+  IMPLICIT NONE
+
+  INTEGER(HID_T), INTENT(IN) :: fcpl
+  INTEGER(HID_T), INTENT(IN) :: fapl
+  INTEGER, INTENT(INOUT) :: total_error
+
+    CHARACTER(LEN=8) :: FileName = "tattr.h5"
+  INTEGER(HID_T) :: fid
+  INTEGER(HID_T) :: dcpl
+  INTEGER(HID_T) :: sid, big_sid
+
+  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
+  CHARACTER(LEN=8) :: DSET2_NAME = "Dataset2"
+
+
+  INTEGER(HID_T) :: dataset, dataset2
+
+  INTEGER :: error
+
+  INTEGER(HID_T) :: attr        !String Attribute identifier
+  INTEGER(HID_T) :: attr_tid
+  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
+
+
+  INTEGER :: max_compact ! Maximum # of links to store in group compactly
+  INTEGER :: min_dense   ! Minimum # of links to store in group "densely"
+
+  CHARACTER(LEN=2) :: chr2
+
+
+  INTEGER, DIMENSION(1) ::  attr_integer_data
+  CHARACTER(LEN=7) :: attrname
+  CHARACTER(LEN=11) :: attrname2
+
+  INTEGER :: u
+  INTEGER(HID_T) :: my_fcpl
+
+  CHARACTER(LEN=5), PARAMETER :: TYPE1_NAME = "/Type"
+
+  INTEGER :: test_shared
+  INTEGER(HSIZE_T), DIMENSION(1) :: adims2 = (/1/) ! Attribute dimension
+  INTEGER     ::   arank = 1                      ! Attribure rank
+
+  !  Initialize "big" attribute data 
+
+  !  Create dataspace for dataset 
+  CALL h5screate_f(H5S_SCALAR_F, sid, error)
+  CALL check("h5screate_f",error,total_error)
+
+  !  Create "big" dataspace for "large" attributes 
+
+  CALL h5screate_simple_f(arank, adims2, big_sid, error)
+  CALL check("h5screate_simple_f",error,total_error)
+
+  !  Loop over type of shared components 
+  DO test_shared = 0, 2
+     !  Make copy of file creation property list 
+     CALL H5Pcopy_f(fcpl, my_fcpl, error)
+     CALL check("H5Pcopy",error,total_error)
+
+     !  Set up datatype for attributes 
+
+     CALL H5Tcopy_f(H5T_NATIVE_INTEGER, attr_tid, error)
+     CALL check("H5Tcopy",error,total_error)
+
+     !  Special setup for each type of shared components 
+
+     IF( test_shared .EQ. 0) THEN
+        !  Make attributes > 500 bytes shared 
+        CALL H5Pset_shared_mesg_nindexes_f(my_fcpl,1,error)
+        CALL check("H5Pset_shared_mesg_nindexes_f",error, total_error)
+        CALL H5Pset_shared_mesg_index_f(my_fcpl, 0, H5O_SHMESG_ATTR_FLAG_F, 500,error)
+        CALL check(" H5Pset_shared_mesg_index_f",error, total_error)
+
+     ELSE
+        !  Set up copy of file creation property list 
+        CALL H5Pset_shared_mesg_nindexes_f(my_fcpl,3,error)
+
+        !  Make attributes > 500 bytes shared 
+        CALL H5Pset_shared_mesg_index_f(my_fcpl, 0, H5O_SHMESG_ATTR_FLAG_F, 500,error)
+        !  Make datatypes & dataspaces > 1 byte shared (i.e. all of them :-) 
+        CALL H5Pset_shared_mesg_index_f(my_fcpl, 1, H5O_SHMESG_DTYPE_FLAG_F, 1,error)
+        CALL H5Pset_shared_mesg_index_f(my_fcpl, 2,  H5O_SHMESG_SDSPACE_FLAG_F, 1,error)
+     ENDIF
+
+     !  Create file 
+     CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, my_fcpl, fapl)
+     CALL check("h5fcreate_f",error,total_error)
+
+     !  Close FCPL copy 
+     CALL h5pclose_f(my_fcpl, error)
+     CALL check("h5pclose_f", error, total_error)
+     !  Close file 
+     CALL h5fclose_f(fid, error)
+     CALL check("h5fclose_f",error,total_error)
+
+     !  Re-open file 
+     CALL h5fopen_f(FileName, H5F_ACC_RDWR_F, fid, error,fapl)
+     CALL check("h5open_f",error,total_error)
+
+     !  Commit datatype to file 
+     IF(test_shared.EQ.2) THEN
+        CALL H5Tcommit_f(fid, TYPE1_NAME, attr_tid, error, H5P_DEFAULT_F, H5P_DEFAULT_F, H5P_DEFAULT_F)
+        CALL check("H5Tcommit",error,total_error)
+     ENDIF
+
+     !  Set up to query the object creation properties 
+     CALL H5Pcreate_f(H5P_DATASET_CREATE_F,dcpl,error)
+     CALL check("h5Pcreate_f",error,total_error)
+
+     !  Create datasets 
+     CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dataset, error, dcpl_id=dcpl )
+     CALL check("h5dcreate_f",error,total_error)
+     CALL h5dcreate_f(fid, DSET2_NAME, H5T_NATIVE_CHARACTER, sid, dataset2, error, dcpl_id=dcpl )
+     CALL check("h5dcreate_f",error,total_error)
+
+     !  Retrieve limits for compact/dense attribute storage 
+     CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
+     CALL check("H5Pget_attr_phase_change_f",error,total_error)
+
+     !  Close property list 
+     CALL h5pclose_f(dcpl,error)
+     CALL check("h5pclose_f", error, total_error)
+
+     !  Add attributes to each dataset, until after converting to dense storage 
+     DO u = 0, (max_compact * 2) - 1
+
+        !  Create attribute name 
+        WRITE(chr2,'(I2.2)') u
+        attrname = 'attr '//chr2
+
+        !  Alternate between creating "small" & "big" attributes 
+
+        IF(MOD(u+1,2).EQ.0)THEN
+           !  Create "small" attribute on first dataset 
+
+           CALL h5acreate_f(dataset, attrname, attr_tid, sid, attr, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
+           CALL check("h5acreate_f",error,total_error)
+
+           !  Write data into the attribute 
+           attr_integer_data(1) = u + 1
+           data_dims(1) = 1
+           CALL h5awrite_f(attr, attr_tid, attr_integer_data, data_dims, error)
+           CALL check("h5awrite_f",error,total_error)
+        ELSE
+           !  Create "big" attribute on first dataset 
+
+           CALL h5acreate_f(dataset, attrname, attr_tid, big_sid, attr, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
+           CALL check("h5acreate_f",error,total_error)
+
+           !  Write data into the attribute 
+
+           data_dims(1) = 1
+           attr_integer_data(1) = u + 1
+           CALL h5awrite_f(attr, attr_tid, attr_integer_data, data_dims, error)
+           CALL check("h5awrite_f",error,total_error)
+
+        ENDIF
+
+        !  Close attribute 
+        CALL h5aclose_f(attr, error)
+        CALL check("h5aclose_f",error,total_error)
+
+        !  Alternate between creating "small" & "big" attributes 
+        IF(MOD(u+1,2).EQ.0)THEN
+
+           !   Create "small" attribute on second dataset 
+
+           CALL h5acreate_f(dataset2, attrname, attr_tid, sid, attr, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
+           CALL check("h5acreate_f",error,total_error)
+
+           !  Write data into the attribute 
+
+           attr_integer_data(1) = u + 1
+           data_dims(1) = 1
+           CALL h5awrite_f(attr, attr_tid, attr_integer_data, data_dims, error)
+           CALL check("h5awrite_f",error,total_error)
+        ELSE
+
+           !  Create "big" attribute on second dataset 
+
+           CALL h5acreate_f(dataset2, attrname, attr_tid, big_sid, attr, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
+           CALL check("h5acreate_f",error,total_error)
+
+!  Write data into the attribute 
+
+
+           attr_integer_data(1) = u + 1
+           data_dims(1) = 1
+!           CALL h5awrite_f(attr,  attr_tid, attr_integer_data, data_dims, error)
+!           CALL check("h5awrite_f",error,total_error)
+
+
+!  Check refcount for attribute 
+        ENDIF
+        !  Close attribute 
+        CALL h5aclose_f(attr, error)
+        CALL check("h5aclose_f",error,total_error)
+
+        !  Create new attribute name 
+
+        WRITE(chr2,'(I2.2)') u
+        attrname2 = 'new attr '//chr2
+
+
+        !  Change second dataset's attribute's name 
+
+        CALL H5Arename_by_name_f(fid, DSET2_NAME, attrname, attrname2, error, lapl_id=H5P_DEFAULT_F)
+        CALL check("H5Arename_by_name_f",error,total_error)
+
+        !  Check refcount on attributes now 
+
+        !  Check refcount on renamed attribute 
+
+        CALL H5Aopen_f(dataset2, attrname2, attr, error, aapl_id=H5P_DEFAULT_F)
+        CALL check("H5Aopen_f",error,total_error)
+
+        !  Close attribute 
+        CALL h5aclose_f(attr, error)
+        CALL check("h5aclose_f",error,total_error)
+
+        !  Check refcount on original attribute 
+        CALL H5Aopen_f(dataset, attrname, attr, error)
+        CALL check("H5Aopen",error,total_error)
+
+        !  Close attribute 
+        CALL h5aclose_f(attr, error)
+        CALL check("h5aclose_f",error,total_error)
+
+
+        !  Change second dataset's attribute's name back to original 
+
+        CALL H5Arename_by_name_f(fid, DSET2_NAME, attrname2, attrname, error)
+        CALL check("H5Arename_by_name_f",error,total_error)
+
+        !  Check refcount on attributes now 
+
+        !  Check refcount on renamed attribute 
+        CALL H5Aopen_f(dataset2, attrname, attr, error)
+        CALL check("H5Aopen",error,total_error)
+
+        !  Close attribute 
+        CALL h5aclose_f(attr, error)
+        CALL check("h5aclose_f",error,total_error)
+
+        !  Check refcount on original attribute 
+
+        !  Check refcount on renamed attribute 
+        CALL H5Aopen_f(dataset, attrname, attr, error)
+        CALL check("H5Aopen",error,total_error)
+
+        !  Close attribute 
+        CALL h5aclose_f(attr, error)
+        CALL check("h5aclose_f",error,total_error)
+
+     ENDDO
+
+     !  Close attribute's datatype 
+     CALL h5tclose_f(attr_tid, error)
+     CALL check("h5tclose_f",error,total_error)
+
+     !  Close attribute's datatype 
+     CALL h5dclose_f(dataset, error)
+     CALL check("h5dclose_f",error,total_error)
+     CALL h5dclose_f(dataset2, error)
+     CALL check("h5dclose_f",error,total_error)
+
+
+     !  Unlink datasets with attributes 
+     CALL H5Ldelete_f(fid, DSET1_NAME, error, H5P_DEFAULT_F)
+     CALL check("HLdelete",error,total_error)
+     CALL H5Ldelete_f(fid, DSET2_NAME, error)
+     CALL check("HLdelete",error,total_error)
+
+     ! Unlink committed datatype 
+     IF(test_shared == 2)THEN
+        CALL H5Ldelete_f(fid, TYPE1_NAME, error)
+        CALL check("HLdelete_f",error,total_error)
+     ENDIF
+
+     !  Close file 
+     CALL h5fclose_f(fid, error)
+     CALL check("h5fclose_f",error,total_error)
+
+     !  Check size of file 
+     !filesize = h5_get_file_size(FILENAME);
+     !verify(filesize, empty_filesize, "h5_get_file_size");
+  ENDDO
+
+  !  Close dataspaces 
+  CALL h5sclose_f(sid, error)
+  CALL check("h5sclose_f",error,total_error)
+  CALL h5sclose_f(big_sid, error)
+  CALL check("h5sclose_f",error,total_error)
+
+END SUBROUTINE test_attr_shared_rename
+
+
+SUBROUTINE test_attr_delete_by_idx(new_format, fcpl, fapl, total_error)
+
+!***************************************************************
+!**
+!**  test_attr_delete_by_idx(): Test basic H5A (attribute) code.
+!**      Tests deleting attribute by index
+!**
+!***************************************************************
+
+  IMPLICIT NONE
+
+  LOGICAL, INTENT(IN) :: new_format
+  INTEGER(HID_T), INTENT(IN) :: fcpl
+  INTEGER(HID_T), INTENT(IN) :: fapl
+  INTEGER, INTENT(INOUT) :: total_error
+  CHARACTER(LEN=8) :: FileName = "tattr.h5"
+  INTEGER(HID_T) :: fid !  HDF5 File ID			
+  INTEGER(HID_T) :: dcpl !  Dataset creation property list ID 
+  INTEGER(HID_T) :: sid !  Dataspace ID			
+
+  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
+  CHARACTER(LEN=8) :: DSET2_NAME = "Dataset2"
+  CHARACTER(LEN=8) :: DSET3_NAME = "Dataset3"
+  INTEGER, PARAMETER :: NUM_DSETS = 3
+
+  INTEGER :: curr_dset
+
+  INTEGER(HID_T) :: dset1, dset2, dset3
+  INTEGER(HID_T) :: my_dataset
+
+  INTEGER :: error
+
+  INTEGER(HID_T) :: attr        !String Attribute identifier
+  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
+
+  LOGICAL :: f_corder_valid ! Indicates whether the the creation order data is valid for this attribute
+  INTEGER :: corder ! Is a positive integer containing the creation order of the attribute
+  INTEGER :: cset ! Indicates the character set used for the attribute’s name
+  INTEGER(HSIZE_T) :: data_size   ! indicates the size, in the number of characters
+  LOGICAL, DIMENSION(1:2) :: use_index = (/.FALSE.,.TRUE./)
+
+  INTEGER :: max_compact ! Maximum # of links to store in group compactly
+  INTEGER :: min_dense   ! Minimum # of links to store in group "densely"
+
+  CHARACTER(LEN=2) :: chr2
+
+  INTEGER :: i
+
+  INTEGER, DIMENSION(1) ::  attr_integer_data
+  CHARACTER(LEN=7) :: attrname
+
+  INTEGER(SIZE_T) :: size
+  CHARACTER(LEN=8) :: tmpname
+
+  INTEGER :: idx_type
+  INTEGER :: order
+  INTEGER :: u     !  Local index variable 
+  INTEGER :: Input1
+  INTEGER(HSIZE_T) :: hzero = 0_HSIZE_T
+  INTEGER :: minusone = -1
+
+  data_dims = 0
+
+  !  Create dataspace for dataset & attributes 
+  CALL h5screate_f(H5S_SCALAR_F, sid, error)
+  CALL check("h5screate_f",error,total_error)
+
+  !     Create dataset creation property list 
+  CALL H5Pcreate_f(H5P_DATASET_CREATE_F,dcpl,error)
+  CALL check("h5Pcreate_f",error,total_error)
+
+  !  Query the attribute creation properties 
+  CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
+  CALL check("H5Pget_attr_phase_change_f",error,total_error)
+
+
+  ! Loop over operating on different indices on link fields 
+  DO idx_type = H5_INDEX_NAME_F, H5_INDEX_CRT_ORDER_F
+
+     !  Loop over operating in different orders 
+     DO order = H5_ITER_INC_F, H5_ITER_DEC_F
+
+        !  Loop over using index for creation order value 
+        DO i = 1, 2
+
+           !  Create file 
+           CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl)
+           CALL check("h5fcreate_f",error,total_error)
+
+           !   Set attribute creation order tracking & indexing for object 
+           IF(new_format)THEN
+
+              IF(use_index(i))THEN
+                 Input1 = H5P_CRT_ORDER_INDEXED_F
+              ELSE
+                 Input1 = 0
+              ENDIF
+
+              CALL H5Pset_attr_creation_order_f(dcpl, IOR(H5P_CRT_ORDER_TRACKED_F, Input1), error)
+              CALL check("H5Pset_attr_creation_order",error,total_error)
+
+           ENDIF
+
+           !  Create datasets 
+
+           CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dset1, error, dcpl )
+           CALL check("h5dcreate_f2",error,total_error)
+
+           CALL h5dcreate_f(fid, DSET2_NAME, H5T_NATIVE_CHARACTER, sid, dset2, error, dcpl )
+           CALL check("h5dcreate_f3",error,total_error)
+
+           CALL h5dcreate_f(fid, DSET3_NAME, H5T_NATIVE_CHARACTER, sid, dset3, error, dcpl )
+           CALL check("h5dcreate_f4",error,total_error)
+
+           !    Work on all the datasets 
+
+           DO curr_dset = 0,NUM_DSETS-1
+              SELECT CASE (curr_dset)
+              CASE (0)
+                 my_dataset = dset1
+              CASE (1)
+                 my_dataset = dset2
+              CASE (2)
+                 my_dataset = dset3
+                 !     CASE DEFAULT
+                 !        CALL HDassert(0.AND."Toomanydatasets!")
+              END SELECT
+
+
+              !  Check for deleting non-existant attribute 
+!EP              CALL H5Adelete_by_idx_f(my_dataset, '.', idx_type, order, 0_HSIZE_T,error, lapl_id=H5P_DEFAULT_F)
+              CALL H5Adelete_by_idx_f(my_dataset, '.', idx_type, order, hzero,error, lapl_id=H5P_DEFAULT_F)
+              CALL verify("H5Adelete_by_idx_f",error,minusone,total_error)
+
+              !     Create attributes, up to limit of compact form 
+              DO u = 0, max_compact - 1
+                 !  Create attribute 
+                 WRITE(chr2,'(I2.2)') u
+                 attrname = 'attr '//chr2
+
+                 CALL h5acreate_f(my_dataset, attrname, H5T_NATIVE_INTEGER, sid, attr, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
+                 CALL check("h5acreate_f",error,total_error)
+
+                 !  Write data into the attribute 
+                 attr_integer_data(1) = u
+                 data_dims(1) = 1
+                 CALL h5awrite_f(attr, H5T_NATIVE_INTEGER, attr_integer_data, data_dims, error)
+                 CALL check("h5awrite_f",error,total_error)
+
+                 !  Close attribute 
+                 CALL h5aclose_f(attr, error)
+                 CALL check("h5aclose_f",error,total_error)
+
+                 !  Verify information for new attribute 
+                 CALL attr_info_by_idx_check(my_dataset, attrname, INT(u,HSIZE_T), use_index(i), total_error )
+
+              ENDDO
+
+              ! Check for out of bound deletions 
+              CALL H5Adelete_by_idx_f(my_dataset, ".", idx_type, order, INT(u,HSIZE_T), error, lapl_id=H5P_DEFAULT_F)
+              CALL verify("H5Adelete_by_idx_f",error,minusone,total_error)
+
+           ENDDO
+
+
+           DO curr_dset = 0, NUM_DSETS-1
+              SELECT CASE (curr_dset)
+              CASE (0)
+                 my_dataset = dset1
+              CASE (1)
+                 my_dataset = dset2
+              CASE (2)
+                 my_dataset = dset3
+                 !     CASE DEFAULT
+                 !        CALL HDassert(0.AND."Toomanydatasets!")
+              END SELECT
+
+              !  Delete attributes from compact storage 
+
+              DO u = 0, max_compact - 2
+
+                 !  Delete first attribute in appropriate order 
+
+
+!EP                 CALL H5Adelete_by_idx_f(my_dataset, ".", idx_type, order, 0_HSIZE_T, error)
+                 CALL H5Adelete_by_idx_f(my_dataset, ".", idx_type, order, hzero, error)
+                 CALL check("H5Adelete_by_idx_f",error,total_error)
+
+
+                 !  Verify the attribute information for first attribute in appropriate order 
+                 ! HDmemset(&ainfo, 0, sizeof(ainfo));
+
+!EP                 CALL h5aget_info_by_idx_f(my_dataset, ".", idx_type, order, 0_HSIZE_T, &
+                 CALL h5aget_info_by_idx_f(my_dataset, ".", idx_type, order, hzero, &
+                      f_corder_valid, corder, cset, data_size, error)
+
+                 IF(new_format)THEN
+                    IF(order.EQ.H5_ITER_INC_F)THEN
+                       CALL verify("H5Aget_info_by_idx_f",corder,u + 1,total_error)
+                    ENDIF
+                 ELSE
+                    CALL verify("H5Aget_info_by_idx_f",corder, max_compact-(u + 2),total_error)
+                 ENDIF
+
+                   !  Verify the name for first attribute in appropriate order 
+
+                 size = 7 ! *CHECK* IF NOT THE SAME SIZE
+                 CALL h5aget_name_by_idx_f(my_dataset, ".", idx_type, order,INT(0,hsize_t), &
+                      tmpname, error, lapl_id=H5P_DEFAULT_F, size=size)
+                 CALL check('h5aget_name_by_idx_f',error,total_error)
+                 IF(order .EQ. H5_ITER_INC_F)THEN
+                    WRITE(chr2,'(I2.2)') u + 1
+                    attrname = 'attr '//chr2
+                 ELSE
+                    WRITE(chr2,'(I2.2)') max_compact - (u + 2)
+                    attrname = 'attr '//chr2
+                 ENDIF
+                 IF(TRIM(attrname).NE.TRIM(tmpname)) error = -1
+                 CALL verify("h5aget_name_by_idx_f",error,0,total_error)
+              ENDDO
+
+              !  Delete last attribute 
+
+!EP              CALL H5Adelete_by_idx_f(my_dataset, ".", idx_type, order, 0_HSIZE_T, error)
+              CALL H5Adelete_by_idx_f(my_dataset, ".", idx_type, order, hzero, error)
+              CALL check("H5Adelete_by_idx_f",error,total_error)
+
+           ENDDO
+
+!    Work on all the datasets 
+
+           DO curr_dset = 0,NUM_DSETS-1
+              SELECT CASE (curr_dset)
+              CASE (0)
+                 my_dataset = dset1
+              CASE (1)
+                 my_dataset = dset2
+              CASE (2)
+                 my_dataset = dset3
+                 !     CASE DEFAULT
+                 !        CALL HDassert(0.AND."Toomanydatasets!")
+              END SELECT
+
+              !  Create more attributes, to push into dense form 
+
+              DO u = 0, (max_compact * 2) - 1
+
+                 !  Create attribute 
+                 WRITE(chr2,'(I2.2)') u
+                 attrname = 'attr '//chr2
+
+                 CALL h5acreate_f(my_dataset, attrname, H5T_NATIVE_INTEGER, sid, attr, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
+                 CALL check("h5acreate_f",error,total_error)
+
+
+                 !  Write data into the attribute 
+                 attr_integer_data(1) = u
+                 data_dims(1) = 1
+                 CALL h5awrite_f(attr, H5T_NATIVE_INTEGER, attr_integer_data, data_dims, error)
+                 CALL check("h5awrite_f",error,total_error)
+
+                 !  Close attribute 
+                 CALL h5aclose_f(attr, error)
+                 CALL check("h5aclose_f",error,total_error)
+
+
+              ENDDO
+              !  Check for out of bound deletion 
+              CALL H5Adelete_by_idx_f(my_dataset, ".", idx_type, order, INT(u,HSIZE_T), error)
+              CALL verify("H5Adelete_by_idx_f",error,minusone,total_error)
+           ENDDO
+
+           !  Work on all the datasets 
+
+           DO curr_dset = 0,NUM_DSETS-1
+              SELECT CASE (curr_dset)
+              CASE (0)
+                 my_dataset = dset1
+              CASE (1)
+                 my_dataset = dset2
+              CASE (2)
+                 my_dataset = dset3
+              END SELECT
+
+              !  Delete attributes from dense storage 
+
+              DO u = 0, (max_compact * 2) - 1 - 1
+
+                 !  Delete first attribute in appropriate order 
+
+                 CALL H5Adelete_by_idx_f(my_dataset, ".", idx_type, order, INT(0,HSIZE_T), error)
+                 CALL check("H5Adelete_by_idx_f",error,total_error)
+                 !  Verify the attribute information for first attribute in appropriate order 
+
+                 CALL h5aget_info_by_idx_f(my_dataset, ".", idx_type, order, INT(0,HSIZE_T), &
+                      f_corder_valid, corder, cset, data_size, error)
+                 IF(new_format)THEN
+                    IF(order.EQ.H5_ITER_INC_F)THEN
+                       CALL verify("H5Aget_info_by_idx_f",corder,u + 1,total_error)
+                    ENDIF
+                 ELSE
+                    CALL verify("H5Aget_info_by_idx_f",corder, ((max_compact * 2) - (u + 2)), total_error)
+                 ENDIF
+
+                 !  Verify the name for first attribute in appropriate order 
+                 ! HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE);
+
+                 size = 7 ! *CHECK* if not the correct size
+                 CALL h5aget_name_by_idx_f(my_dataset, ".", idx_type, order,INT(0,hsize_t), &
+                      tmpname, error, size)
+
+                 IF(order .EQ. H5_ITER_INC_F)THEN
+                    WRITE(chr2,'(I2.2)') u + 1
+                    attrname = 'attr '//chr2
+                 ELSE
+                    WRITE(chr2,'(I2.2)') max_compact * 2 - (u + 2)
+                    attrname = 'attr '//chr2
+                 ENDIF
+                 IF(TRIM(attrname).NE.TRIM(tmpname)) error = -1
+                 CALL verify("h5aget_name_by_idx_f",error,0,total_error)
+
+
+              ENDDO
+              !  Delete last attribute 
+
+              CALL H5Adelete_by_idx_f(my_dataset, ".", idx_type, order, INT(0,HSIZE_T), error, lapl_id=H5P_DEFAULT_F)
+              CALL check("H5Adelete_by_idx_f",error,total_error)
+
+              ! Check for deletion on empty attribute storage again 
+              CALL H5Adelete_by_idx_f(my_dataset, ".", idx_type, order, INT(0,HSIZE_T), error)
+              CALL verify("H5Adelete_by_idx_f",error,minusone,total_error)
+           ENDDO
+
+           !   Close Datasets 
+           CALL h5dclose_f(dset1, error)
+           CALL check("h5dclose_f",error,total_error)
+           CALL h5dclose_f(dset2, error)
+           CALL check("h5dclose_f",error,total_error)
+           CALL h5dclose_f(dset3, error)
+           CALL check("h5dclose_f",error,total_error)
+
+           !    Close file 
+           CALL h5fclose_f(fid, error)
+           CALL check("h5fclose_f",error,total_error)
+        ENDDO
+     ENDDO
+  ENDDO
+
+  !  Close property list 
+  CALL h5pclose_f(dcpl,error)
+  CALL check("h5pclose_f", error, total_error)
+
+  !  Close dataspace 
+  CALL h5sclose_f(sid, error)
+  CALL check("h5sclose_f",error,total_error)
+
+END SUBROUTINE test_attr_delete_by_idx
+
+SUBROUTINE test_attr_shared_delete(fcpl, fapl, total_error)
+
+!***************************************************************
+!**
+!**  test_attr_shared_delete(): Test basic H5A (attribute) code.
+!**      Tests deleting shared attributes in "compact" & "dense" storage
+!**
+!***************************************************************
+
+  IMPLICIT NONE
+
+  INTEGER(HID_T), INTENT(IN) :: fcpl
+  INTEGER(HID_T), INTENT(IN) :: fapl
+  INTEGER, INTENT(INOUT) :: total_error
+  CHARACTER(LEN=8) :: FileName = "tattr.h5"
+  INTEGER(HID_T) :: fid
+  INTEGER(HID_T) :: dcpl
+  INTEGER(HID_T) :: sid, big_sid
+
+  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
+  CHARACTER(LEN=8) :: DSET2_NAME = "Dataset2"
+
+
+  INTEGER(HID_T) :: dataset, dataset2
+
+  INTEGER :: error
+
+  INTEGER(HID_T) :: attr        !String Attribute identifier
+  INTEGER(HID_T) :: attr_tid
+  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
+
+
+  INTEGER :: max_compact ! Maximum # of links to store in group compactly
+  INTEGER :: min_dense   ! Minimum # of links to store in group "densely"
+
+  CHARACTER(LEN=2) :: chr2
+
+  INTEGER, DIMENSION(1) ::  attr_integer_data
+  CHARACTER(LEN=7) :: attrname
+
+  INTEGER :: u
+  INTEGER(HID_T) :: my_fcpl
+
+  CHARACTER(LEN=5), PARAMETER :: TYPE1_NAME = "/Type"
+
+  INTEGER :: test_shared
+  INTEGER(HSIZE_T), DIMENSION(1) :: adims2 = (/1/) ! Attribute dimension
+  INTEGER     ::   arank = 1                      ! Attribure rank
+
+  !  Output message about test being performed 
+
+  !  Initialize "big" attribute DATA 
+  !     Create dataspace for dataset 
+  CALL h5screate_f(H5S_SCALAR_F, sid, error)
+  CALL check("h5screate_f",error,total_error)
+
+  ! Create "big" dataspace for "large" attributes 
+
+  CALL h5screate_simple_f(arank, adims2, big_sid, error)
+  CALL check("h5screate_simple_f",error,total_error)
+
+  !  Loop over type of shared components 
+
+  DO test_shared = 0, 2
+
+     !  Make copy of file creation property list 
+
+     CALL H5Pcopy_f(fcpl, my_fcpl, error)
+     CALL check("H5Pcopy",error,total_error)
+
+     !  Set up datatype for attributes 
+
+     CALL H5Tcopy_f(H5T_NATIVE_INTEGER, attr_tid, error)
+     CALL check("H5Tcopy",error,total_error)
+
+     !  Special setup for each type of shared components 
+     IF( test_shared .EQ. 0) THEN
+        !  Make attributes > 500 bytes shared 
+        CALL H5Pset_shared_mesg_nindexes_f(my_fcpl,1,error)
+        CALL check("H5Pset_shared_mesg_nindexes_f",error, total_error)
+        CALL H5Pset_shared_mesg_index_f(my_fcpl, 0, H5O_SHMESG_ATTR_FLAG_F, 500,error)
+        CALL check(" H5Pset_shared_mesg_index_f",error, total_error)
+
+     ELSE
+        !  Set up copy of file creation property list 
+        CALL H5Pset_shared_mesg_nindexes_f(my_fcpl,3,error)
+        !  Make attributes > 500 bytes shared 
+        CALL H5Pset_shared_mesg_index_f(my_fcpl, 0, H5O_SHMESG_ATTR_FLAG_F, 500,error)
+        !  Make datatypes & dataspaces > 1 byte shared (i.e. all of them :-) 
+        CALL H5Pset_shared_mesg_index_f(my_fcpl, 1, H5O_SHMESG_DTYPE_FLAG_F, 1,error)
+        CALL H5Pset_shared_mesg_index_f(my_fcpl, 2,  H5O_SHMESG_SDSPACE_FLAG_F, 1,error)
+     ENDIF
+
+     !  Create file 
+     CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, my_fcpl, fapl)
+     CALL check("h5fcreate_f",error,total_error)
+
+     !  Close FCPL copy 
+     CALL h5pclose_f(my_fcpl, error)
+     CALL check("h5pclose_f", error, total_error)
+     !  Close file 
+     CALL h5fclose_f(fid, error)
+     CALL check("h5fclose_f",error,total_error)
+
+     !  Re-open file 
+     CALL h5fopen_f(FileName, H5F_ACC_RDWR_F, fid, error,fapl)
+     CALL check("h5open_f",error,total_error)
+
+     !  Commit datatype to file 
+
+     IF(test_shared.EQ.2) THEN
+        CALL H5Tcommit_f(fid, TYPE1_NAME, attr_tid, error, H5P_DEFAULT_F, H5P_DEFAULT_F, H5P_DEFAULT_F)
+        CALL check("H5Tcommit",error,total_error)
+     ENDIF
+
+     !  Set up to query the object creation properties 
+     CALL H5Pcreate_f(H5P_DATASET_CREATE_F,dcpl,error)
+     CALL check("h5Pcreate_f",error,total_error)
+
+     !  Create datasets 
+
+     CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dataset, error, dcpl_id=dcpl )
+     CALL check("h5dcreate_f",error,total_error)
+
+     CALL h5dcreate_f(fid, DSET2_NAME, H5T_NATIVE_CHARACTER, sid, dataset2, error, dcpl_id=dcpl )
+     CALL check("h5dcreate_f",error,total_error)
+
+     !  Retrieve limits for compact/dense attribute storage 
+     CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
+     CALL check("H5Pget_attr_phase_change_f",error,total_error)
+
+     !  Close property list 
+     CALL h5pclose_f(dcpl,error)
+     CALL check("h5pclose_f", error, total_error)
+
+     !  Add attributes to each dataset, until after converting to dense storage 
+
+     DO u = 0, (max_compact * 2) - 1
+
+        !  Create attribute name 
+        WRITE(chr2,'(I2.2)') u
+        attrname = 'attr '//chr2
+
+        !  Alternate between creating "small" & "big" attributes 
+
+        IF(MOD(u+1,2).EQ.0)THEN
+           !  Create "small" attribute on first dataset 
+
+           CALL h5acreate_f(dataset, attrname, attr_tid, sid, attr, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
+           CALL check("h5acreate_f",error,total_error)
+
+           !  Write data into the attribute 
+           attr_integer_data(1) = u + 1
+           data_dims(1) = 1
+           CALL h5awrite_f(attr, attr_tid, attr_integer_data, data_dims, error)
+           CALL check("h5awrite_f",error,total_error)
+        ELSE
+           !  Create "big" attribute on first dataset 
+
+           CALL h5acreate_f(dataset, attrname, attr_tid, big_sid, attr, error)
+           CALL check("h5acreate_f",error,total_error)
+
+           !  Write data into the attribute 
+
+           attr_integer_data(1) = u + 1
+           data_dims(1) = 1
+           CALL h5awrite_f(attr,  attr_tid, attr_integer_data, data_dims, error)
+           CALL check("h5awrite_f",error,total_error)
+
+        ENDIF
+
+        !  Close attribute 
+        CALL h5aclose_f(attr, error)
+        CALL check("h5aclose_f",error,total_error)
+
+        !  Alternate between creating "small" & "big" attributes 
+        IF(MOD(u+1,2).EQ.0)THEN
+
+           !   Create "small" attribute on second dataset 
+
+           CALL h5acreate_f(dataset2, attrname, attr_tid, sid, attr, error)
+           CALL check("h5acreate_f",error,total_error)
+
+           !  Write data into the attribute 
+           attr_integer_data(1) = u + 1
+           data_dims(1) = 1
+           CALL h5awrite_f(attr, attr_tid, attr_integer_data, data_dims, error)
+           CALL check("h5awrite_f",error,total_error)
+        ELSE
+
+           !  Create "big" attribute on second dataset 
+
+           CALL h5acreate_f(dataset2, attrname, attr_tid, big_sid, attr, error, acpl_id=H5P_DEFAULT_F, aapl_id=H5P_DEFAULT_F)
+           CALL check("h5acreate_f",error,total_error)
+
+!  Write data into the attribute 
+
+
+           attr_integer_data(1) = u + 1
+           data_dims(1) = 1
+           CALL h5awrite_f(attr,  attr_tid, attr_integer_data, data_dims, error)
+           CALL check("h5awrite_f",error,total_error)
+
+        ENDIF
+        !  Close attribute 
+        CALL h5aclose_f(attr, error)
+        CALL check("h5aclose_f",error,total_error)
+
+     ENDDO
+
+     !  Delete attributes from second dataset 
+
+     DO u = 0, max_compact*2-1
+
+        !  Create attribute name 
+        WRITE(chr2,'(I2.2)') u
+        attrname = 'attr '//chr2
+
+        !  Delete second dataset's attribute 
+        CALL H5Adelete_by_name_f(fid, DSET2_NAME, attrname,error,lapl_id=H5P_DEFAULT_F)
+        CALL check("H5Adelete_by_name", error, total_error)
+
+        CALL h5aopen_f(dataset, attrname, attr, error, aapl_id=H5P_DEFAULT_F)
+        CALL check("h5aopen_f",error,total_error)
+
+
+        !  Close attribute 
+        CALL h5aclose_f(attr, error)
+        CALL check("h5aclose_f",error,total_error)
+     ENDDO
+
+     !  Close attribute's datatype 
+
+     CALL h5tclose_f(attr_tid, error)
+     CALL check("h5tclose_f",error,total_error)
+
+     !  Close Datasets 
+
+     CALL h5dclose_f(dataset, error)
+     CALL check("h5dclose_f",error,total_error)
+     CALL h5dclose_f(dataset2, error)
+     CALL check("h5dclose_f",error,total_error)
+
+     !  Unlink datasets WITH attributes 
+
+     CALL h5ldelete_f(fid, DSET1_NAME, error, H5P_DEFAULT_F)
+     CALL check("H5Ldelete_f", error, total_error)
+     CALL h5ldelete_f(fid, DSET2_NAME, error)
+     CALL check("H5Ldelete_f", error, total_error)
+
+     !  Unlink committed datatype 
+
+     IF( test_shared == 2) THEN
+        CALL h5ldelete_f(fid, TYPE1_NAME, error)
+        CALL check("H5Ldelete_f", error, total_error)
+     ENDIF
+
+
+     !  Close file 
+     CALL h5fclose_f(fid, error)
+     CALL check("h5fclose_f",error,total_error)
+
+  ENDDO
+
+  !  Close dataspaces 
+  CALL h5sclose_f(sid, error)
+  CALL check("h5sclose_f",error,total_error)
+  CALL h5sclose_f(big_sid, error)
+  CALL check("h5sclose_f",error,total_error)
+
+END SUBROUTINE test_attr_shared_delete
+
+
+
+SUBROUTINE test_attr_dense_open( fcpl, fapl, total_error)
+
+!***************************************************************
+!**
+!**  test_attr_dense_open(): Test basic H5A (attribute) code.
+!**      Tests opening attributes in "dense" storage
+!**
+!***************************************************************
+
+  IMPLICIT NONE
+
+  INTEGER(HID_T), INTENT(IN) :: fcpl
+  INTEGER(HID_T), INTENT(IN) :: fapl
+  INTEGER, INTENT(INOUT) :: total_error
+  CHARACTER(LEN=8) :: FileName = "tattr.h5"
+  INTEGER(HID_T) :: fid
+  INTEGER(HID_T) :: dcpl
+  INTEGER(HID_T) :: sid
+
+  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
+
+  INTEGER :: error
+  INTEGER(HID_T) :: attr        !String Attribute identifier
+  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
+
+
+  INTEGER :: max_compact ! Maximum # of links to store in group compactly
+  INTEGER :: min_dense   ! Minimum # of links to store in group "densely"
+
+  CHARACTER(LEN=2) :: chr2
+
+
+  CHARACTER(LEN=7) :: attrname
+
+  INTEGER(HID_T) :: dataset
+  INTEGER :: u
+
+  data_dims = 0
+
+
+  !  Create file 
+
+  CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl)
+  CALL check("h5fcreate_f",error,total_error)
+
+  !  Close file 
+  CALL h5fclose_f(fid, error)
+  CALL check("h5fclose_f",error,total_error)
+
+
+
+  !  Re-open file 
+  CALL h5fopen_f(FileName, H5F_ACC_RDWR_F, fid, error, fapl)
+  CALL check("h5open_f",error,total_error)
+
+  !  Create dataspace for dataset 
+  CALL h5screate_f(H5S_SCALAR_F, sid, error)
+  CALL check("h5screate_f",error,total_error)
+
+  !  Query the group creation properties 
+  CALL H5Pcreate_f(H5P_DATASET_CREATE_F,dcpl,error)
+  CALL check("h5Pcreate_f",error,total_error)
+
+  !  Enable creation order tracking on attributes, so creation order tests work 
+  CALL H5Pset_attr_creation_order_f(dcpl, H5P_CRT_ORDER_TRACKED_F, error)
+  CALL check("H5Pset_attr_creation_order",error,total_error)
+
+  !  Create a dataset 
+
+  CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dataset, error, &
+       lcpl_id=H5P_DEFAULT_F, dcpl_id=dcpl, dapl_id=H5P_DEFAULT_F)
+  CALL check("h5dcreate_f",error,total_error)
+
+  !  Retrieve limits for compact/dense attribute storage 
+  CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
+  CALL check("H5Pget_attr_phase_change_f",error,total_error)
+
+  !  Close property list 
+  CALL h5pclose_f(dcpl, error)
+  CALL check("h5pclose_f",error,total_error)
+
+  !  Add attributes, until just before converting to dense storage 
+
+  DO u = 0, max_compact - 1
+     !  Create attribute 
+     WRITE(chr2,'(I2.2)') u
+     attrname = 'attr '//chr2
+
+     CALL h5acreate_f(dataset, attrname, H5T_NATIVE_INTEGER, sid, attr, error, aapl_id=H5P_DEFAULT_F)
+     CALL check("h5acreate_f",error,total_error)
+
+     !  Write data into the attribute 
+
+     data_dims(1) = 1
+     CALL h5awrite_f(attr, H5T_NATIVE_INTEGER, u, data_dims, error)
+     CALL check("h5awrite_f",error,total_error)
+
+     !  Close attribute 
+     CALL h5aclose_f(attr, error)
+     CALL check("h5aclose_f",error,total_error)
+
+     !  Verify attributes written so far 
+     CALL test_attr_dense_verify(dataset, u, total_error)
+  ENDDO
+!
+!     Add one more attribute, to push into "dense" storage 
+!     Create attribute 
+
+  WRITE(chr2,'(I2.2)') u
+  attrname = 'attr '//chr2
+
+  CALL h5acreate_f(dataset, attrname, H5T_NATIVE_INTEGER, sid, attr, error, aapl_id=H5P_DEFAULT_F)
+  CALL check("h5acreate_f",error,total_error)
+
+  !  Write data into the attribute 
+  data_dims(1) = 1
+  CALL h5awrite_f(attr, H5T_NATIVE_INTEGER, u, data_dims, error)
+  CALL check("h5awrite_f",error,total_error)
+
+  !  Close attribute 
+  CALL h5aclose_f(attr, error)
+  CALL check("h5aclose_f",error,total_error)
+
+  !  Close dataspace 
+  CALL h5sclose_f(sid, error)
+  CALL check("h5sclose_f",error,total_error)
+
+  !  Verify all the attributes written 
+  !  ret = test_attr_dense_verify(dataset, (u + 1));
+  !  CHECK(ret, FAIL, "test_attr_dense_verify");
+
+  !  CLOSE Dataset 
+  CALL h5dclose_f(dataset, error)
+  CALL check("h5dclose_f",error,total_error)
+
+  !  Unlink dataset with attributes 
+  CALL h5ldelete_f(fid, DSET1_NAME, error, H5P_DEFAULT_F)
+  CALL check("H5Ldelete_f", error, total_error)
+
+  !  Close file 
+  CALL h5fclose_f(fid, error)
+  CALL check("h5fclose_f",error,total_error)
+
+  !  Check size of file 
+  !  filesize = h5_get_file_size(FILENAME);
+  !  verify(filesize, empty_filesize, "h5_get_file_size")
+
+END SUBROUTINE test_attr_dense_open
+
+!***************************************************************
+!**
+!**  test_attr_dense_verify(): Test basic H5A (attribute) code.
+!**      Verify attributes on object
+!**
+!***************************************************************
+
+SUBROUTINE test_attr_dense_verify(loc_id, max_attr, total_error)
+
+  IMPLICIT NONE
+
+  INTEGER(HID_T), INTENT(IN) :: loc_id
+  INTEGER, INTENT(IN) :: max_attr
+  INTEGER, INTENT(INOUT) :: total_error
+
+  INTEGER(SIZE_T), PARAMETER :: ATTR_NAME_LEN = 8 ! FIX, why if 7 does not work?
+
+  INTEGER :: u
+  CHARACTER(LEN=2) :: chr2
+  CHARACTER(LEN=ATTR_NAME_LEN) :: attrname
+  CHARACTER(LEN=ATTR_NAME_LEN) :: check_name
+  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
+
+  INTEGER(HID_T) :: attr        !String Attribute identifier
+  INTEGER :: error
+  INTEGER :: value
+
+  data_dims = 0
+
+
+    !  Retrieve the current # of reported errors 
+    ! old_nerrs = GetTestNumErrs();
+
+    !  Re-open all the attributes by name and verify the data 
+
+  DO u = 0, max_attr -1
+
+     !  Open attribute 
+     WRITE(chr2,'(I2.2)') u
+     attrname = 'attr '//chr2
+
+     CALL h5aopen_f(loc_id, attrname, attr, error)
+     CALL check("h5aopen_f",error,total_error)
+
+     !  Read data from the attribute 
+
+!     value = 103
+     data_dims(1) = 1
+     CALL h5aread_f(attr, H5T_NATIVE_INTEGER, value, data_dims, error)
+
+     CALL CHECK("H5Aread_F", error, total_error)
+     CALL verify("H5Aread_F", value, u, total_error)
+
+     !  Close attribute 
+     CALL h5aclose_f(attr, error)
+     CALL check("h5aclose_f",error,total_error)
+  ENDDO
+
+  !  Re-open all the attributes by index and verify the data 
+
+  DO u=0, max_attr-1
+
+
+     !  Open attribute 
+
+     CALL H5Aopen_by_idx_f(loc_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, INT(u,HSIZE_T), &
+          attr, error, aapl_id=H5P_DEFAULT_F)
+
+     !  Verify Name 
+
+     WRITE(chr2,'(I2.2)') u
+     attrname = 'attr '//chr2
+
+     CALL H5Aget_name_f(attr, ATTR_NAME_LEN, check_name, error)
+     CALL check('H5Aget_name',error,total_error)
+     IF(check_name.NE.attrname) THEN
+        WRITE(*,*) 'ERROR: attribute name different: attr_name = ',check_name, ', should be ', attrname
+        total_error = total_error + 1
+     ENDIF
+     !  Read data from the attribute 
+     data_dims(1) = 1
+     CALL h5aread_f(attr, H5T_NATIVE_INTEGER, value, data_dims, error)
+     CALL CHECK("H5Aread_f", error, total_error)
+     CALL verify("H5Aread_f", value, u, total_error)
+
+
+     !  Close attribute 
+     CALL h5aclose_f(attr, error)
+     CALL check("h5aclose_f",error,total_error)
+  ENDDO
+
+END SUBROUTINE test_attr_dense_verify
+
+!***************************************************************
+!**
+!**  test_attr_corder_create_empty(): Test basic H5A (attribute) code.
+!**      Tests basic code to create objects with attribute creation order info
+!**
+!***************************************************************
+
+SUBROUTINE test_attr_corder_create_basic( fcpl, fapl, total_error )
+
+  IMPLICIT NONE
+
+  INTEGER(HID_T), INTENT(IN) :: fcpl
+  INTEGER(HID_T), INTENT(IN) :: fapl
+  INTEGER, INTENT(INOUT) :: total_error
+  CHARACTER(LEN=8) :: FileName = "tattr.h5"
+  INTEGER(HID_T) :: fid
+  INTEGER(HID_T) :: dcpl
+  INTEGER(HID_T) :: sid
+
+  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
+
+  INTEGER(HID_T) :: dataset
+
+  INTEGER :: error
+
+  INTEGER :: crt_order_flags
+  INTEGER :: minusone = -1
+
+  !  Output message about test being performed 
+!  WRITE(*,*) "     - Testing Basic Code for Attributes with Creation Order Info"
+
+  !  Create file 
+  CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl)
+  CALL check("h5fcreate_f",error,total_error)
+
+  !  Create dataset creation property list 
+  CALL H5Pcreate_f(H5P_DATASET_CREATE_F,dcpl,error)
+  CALL check("h5Pcreate_f",error,total_error)
+
+  !  Get creation order indexing on object 
+  CALL H5Pget_attr_creation_order_f(dcpl, crt_order_flags, error)
+  CALL check("H5Pget_attr_creation_order_f",error,total_error)
+  CALL verify("H5Pget_attr_creation_order_f",crt_order_flags , 0, total_error)
+
+  !  Setting invalid combination of a attribute order creation order indexing on should fail 
+  CALL H5Pset_attr_creation_order_f(dcpl, H5P_CRT_ORDER_INDEXED_F, error)
+  CALL verify("H5Pset_attr_creation_order_f",error , minusone, total_error)
+  CALL H5Pget_attr_creation_order_f(dcpl, crt_order_flags, error)
+  CALL check("H5Pget_attr_creation_order_f",error,total_error)
+  CALL verify("H5Pget_attr_creation_order_f",crt_order_flags , 0, total_error)
+
+  !  Set attribute creation order tracking & indexing for object 
+  CALL h5pset_attr_creation_order_f(dcpl, IOR(H5P_CRT_ORDER_TRACKED_F, H5P_CRT_ORDER_INDEXED_F), error)
+  CALL check("H5Pset_attr_creation_order_f",error,total_error)
+
+  CALL H5Pget_attr_creation_order_f(dcpl, crt_order_flags, error)
+  CALL check("H5Pget_attr_creation_order_f",error,total_error)
+  CALL verify("H5Pget_attr_creation_order_f",crt_order_flags , &
+       IOR(H5P_CRT_ORDER_TRACKED_F, H5P_CRT_ORDER_INDEXED_F), total_error)
+
+  !  Create dataspace for dataset 
+  CALL h5screate_f(H5S_SCALAR_F, sid, error)
+  CALL check("h5screate_f",error,total_error)
+
+  !  Create a dataset 
+  CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dataset, error, &
+       lcpl_id=H5P_DEFAULT_F, dapl_id=H5P_DEFAULT_F, dcpl_id=dcpl)
+  CALL check("h5dcreate_f",error,total_error)
+
+  !  Close dataspace 
+  CALL h5sclose_f(sid, error)
+  CALL check("h5sclose_f",error,total_error)
+
+
+  !  Close Dataset 
+  CALL h5dclose_f(dataset, error)
+  CALL check("h5dclose_f",error,total_error)
+
+  !  Close property list 
+  CALL h5pclose_f(dcpl, error)
+  CALL check("h5pclose_f",error,total_error)
+
+  !  Close file 
+  CALL h5fclose_f(fid, error)
+  CALL check("h5fclose_f",error,total_error)
+
+  !  Re-open file 
+  CALL h5fopen_f(FileName, H5F_ACC_RDWR_F, fid, error, fapl)
+  CALL check("h5open_f",error,total_error)
+
+  !  Open dataset created 
+  CALL h5dopen_f(fid, DSET1_NAME, dataset, error, H5P_DEFAULT_F )
+  CALL check("h5dopen_f",error,total_error)
+
+
+  !  Retrieve dataset creation property list for group 
+  CALL H5Dget_create_plist_f(dataset, dcpl, error)
+  CALL check("H5Dget_create_plist_f",error,total_error)
+
+  !  Query the attribute creation properties 
+  CALL H5Pget_attr_creation_order_f(dcpl, crt_order_flags, error)
+  CALL check("H5Pget_attr_creation_order_f",error,total_error)
+  CALL verify("H5Pget_attr_creation_order_f",crt_order_flags , &
+       IOR(H5P_CRT_ORDER_TRACKED_F, H5P_CRT_ORDER_INDEXED_F), total_error )
+
+  !  Close property list 
+  CALL h5pclose_f(dcpl, error)
+  CALL check("h5pclose_f",error,total_error)
+
+  !  Close Dataset 
+  CALL h5dclose_f(dataset, error)
+  CALL check("h5dclose_f",error,total_error)
+
+  !  Close file 
+  CALL h5fclose_f(fid, error)
+  CALL check("h5fclose_f",error,total_error)
+
+
+END SUBROUTINE test_attr_corder_create_basic
+
+!***************************************************************
+!**
+!**  test_attr_basic_write(): Test basic H5A (attribute) code.
+!**      Tests integer attributes on both datasets and groups
+!**
+!***************************************************************
+
+SUBROUTINE test_attr_basic_write(fapl, total_error)
+
+  IMPLICIT NONE
+
+  INTEGER(HID_T), INTENT(IN) :: fapl
+  INTEGER, INTENT(INOUT) :: total_error
+  CHARACTER(LEN=8) :: FileName = "tattr.h5"
+  INTEGER(HID_T) :: fid1
+  INTEGER(HID_T) :: sid1, sid2
+
+  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
+
+  INTEGER(HID_T) :: dataset
+  INTEGER :: i
+  INTEGER :: error
+
+  INTEGER(HID_T) :: attr,attr2        !String Attribute identifier
+  INTEGER(HID_T) :: group
+
+  CHARACTER(LEN=25) :: check_name
+  CHARACTER(LEN=18) :: chr_exact_size
+
+  CHARACTER(LEN=5), PARAMETER ::  ATTR1_NAME="Attr1"
+  INTEGER, PARAMETER :: ATTR1_RANK = 1
+  INTEGER, PARAMETER ::  ATTR1_DIM1 = 3
+  CHARACTER(LEN=7), PARAMETER :: ATTR1A_NAME ="Attr1_a"
+  CHARACTER(LEN=18), PARAMETER :: ATTR_TMP_NAME = "Attr1_a-1234567890"
+  INTEGER, DIMENSION(ATTR1_DIM1) :: attr_data1
+  INTEGER, DIMENSION(ATTR1_DIM1) :: attr_data1a
+  INTEGER, DIMENSION(ATTR1_DIM1) :: read_data1
+  INTEGER(HSIZE_T) :: attr_size   ! attributes storage requirements .MSB.
+  INTEGER(HSIZE_T), DIMENSION(1) :: dimsa = (/3/) ! Dataset dimensions
+
+  INTEGER     ::   rank1 = 2               ! Dataspace1 rank
+  INTEGER(HSIZE_T), DIMENSION(2) :: dims1 = (/4,6/) ! Dataset dimensions
+  INTEGER(HSIZE_T), DIMENSION(2) :: maxdims1 = (/4,6/) ! maximum dimensions
+
+  INTEGER(SIZE_T) :: size
+
+!! Initialize attribute data
+  attr_data1(1) = 258
+  attr_data1(2) = 9987
+  attr_data1(3) = -99890
+
+  attr_data1a(1) = 258
+  attr_data1a(2) = 1087
+  attr_data1a(3) = -99890
+
+
+  !  Create file 
+  CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid1, error, H5P_DEFAULT_F, fapl)
+  CALL check("h5fcreate_f",error,total_error)
+
+  !  Create dataspace for dataset 
+  CALL h5screate_simple_f(rank1, dims1, sid1, error, maxdims1)
+  CALL check("h5screate_simple_f",error,total_error)
+
+  !  Create a dataset 
+  CALL h5dcreate_f(fid1, DSET1_NAME, H5T_NATIVE_CHARACTER, sid1, dataset, error, H5P_DEFAULT_F, H5P_DEFAULT_F, H5P_DEFAULT_F )
+  CALL check("h5dcreate_f",error,total_error)
+
+  !  Create dataspace for attribute 
+  CALL h5screate_simple_f(ATTR1_RANK, dimsa, sid2, error)
+  CALL check("h5screate_simple_f",error,total_error)
+
+  !  Try to create an attribute on the file (should create an attribute on root group) 
+  CALL h5acreate_f(fid1, ATTR1_NAME, H5T_NATIVE_INTEGER, sid2, attr, error, aapl_id=H5P_DEFAULT_F, acpl_id=H5P_DEFAULT_F)
+  CALL check("h5acreate_f",error,total_error)
+
+  !   Close attribute 
+  CALL h5aclose_f(attr, error)
+  CALL check("h5aclose_f",error,total_error)
+
+  !  Open the root group 
+  CALL H5Gopen_f(fid1, "/", group, error, H5P_DEFAULT_F)
+  CALL check("H5Gopen_f",error,total_error)
+
+  !  Open attribute again 
+  CALL h5aopen_f(group,  ATTR1_NAME, attr, error)
+  CALL check("h5aopen_f",error,total_error)
+
+  !  Close attribute 
+  CALL h5aclose_f(attr, error)
+  CALL check("h5aclose_f",error,total_error)
+
+  !  Close root group 
+  CALL  H5Gclose_f(group, error)
+  CALL check("h5gclose_f",error,total_error)
+
+  !  Create an attribute for the dataset 
+  CALL h5acreate_f(dataset, ATTR1_NAME, H5T_NATIVE_INTEGER, sid2, attr, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
+  CALL check("h5acreate_f",error,total_error)
+
+  !  Write attribute information 
+
+  CALL h5awrite_f(attr, H5T_NATIVE_INTEGER, attr_data1, dimsa, error)
+  CALL check("h5awrite_f",error,total_error)
+
+  !  Create an another attribute for the dataset 
+  CALL h5acreate_f(dataset, ATTR1A_NAME, H5T_NATIVE_INTEGER, sid2, attr2, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
+  CALL check("h5acreate_f",error,total_error)
+
+  !  Write attribute information 
+  CALL h5awrite_f(attr2, H5T_NATIVE_INTEGER, attr_data1a, dimsa, error)
+  CALL check("h5awrite_f",error,total_error)
+
+  !  Check storage size for attribute 
+
+  CALL h5aget_storage_size_f(attr, attr_size, error)
+  CALL check("h5aget_storage_size_f",error,total_error)
+!EP  CALL verify("h5aget_storage_size_f", INT(attr_size), 2*HSIZE_T, total_error)
+
+
+  !  Read attribute information immediately, without closing attribute 
+  CALL h5aread_f(attr, H5T_NATIVE_INTEGER, read_data1, dimsa, error)
+  CALL check("h5aread_f",error,total_error)
+
+  !  Verify values read in 
+  DO i = 1, ATTR1_DIM1
+     CALL verify('h5aread_f',attr_data1(i),read_data1(i), total_error)
+  ENDDO
+
+  !  CLOSE attribute 
+  CALL h5aclose_f(attr, error)
+  CALL check("h5aclose_f",error,total_error)
+
+  !  Close attribute 
+  CALL h5aclose_f(attr2, error)
+  CALL check("h5aclose_f",error,total_error)
+
+  !  change attribute name 
+  CALL H5Arename_f(dataset, ATTR1_NAME, ATTR_TMP_NAME, error)
+  CALL check("H5Arename_f", error, total_error)
+
+  !  Open attribute again 
+
+  CALL h5aopen_f(dataset,  ATTR_TMP_NAME, attr, error)
+  CALL check("h5aopen_f",error,total_error)
+
+  !  Verify new attribute name 
+  ! Set a deliberately small size
+
+  check_name = '                         ' ! need to initialize or does not pass test
+
+  size = 1
+  CALL H5Aget_name_f(attr, size, check_name, error)
+  CALL check('H5Aget_name',error,total_error)
+
+  ! Now enter with the corrected size
+  IF(error.NE.size)THEN
+     size = error
+     CALL H5Aget_name_f(attr, size, check_name, error)
+     CALL check('H5Aget_name',error,total_error)
+  ENDIF
+
+  IF(TRIM(ADJUSTL(check_name)).NE.TRIM(ADJUSTL(ATTR_TMP_NAME))) THEN
+     PRINT*,'.'//TRIM(check_name)//'.',LEN_TRIM(check_name)
+     PRINT*,'.'//TRIM(ATTR_TMP_NAME)//'.',LEN_TRIM(ATTR_TMP_NAME)
+     WRITE(*,*) 'ERROR: attribute name different: attr_name ='//TRIM(check_name)//'.'
+     WRITE(*,*) '                                 should be ='//TRIM(ATTR_TMP_NAME)//'.'
+     total_error = total_error + 1
+     stop
+  ENDIF
+
+  ! Try with a string buffer that is exactly the correct size
+  size = 18
+  CALL H5Aget_name_f(attr, size, chr_exact_size, error)
+  CALL check('H5Aget_name_f',error,total_error)
+  CALL verify('H5Aget_name_f',chr_exact_size,ATTR_TMP_NAME, total_error)
+
+  !  Close attribute 
+  CALL h5aclose_f(attr, error)
+  CALL check("h5aclose_f",error,total_error)
+
+  CALL h5sclose_f(sid1, error)
+  CALL check("h5sclose_f",error,total_error)
+  CALL h5sclose_f(sid2, error)
+  CALL check("h5sclose_f",error,total_error)
+  ! Close Dataset 
+  CALL h5dclose_f(dataset, error)
+  CALL check("h5dclose_f",error,total_error)
+
+  !  Close file 
+  CALL h5fclose_f(fid1, error)
+  CALL check("h5fclose_f",error,total_error)
+
+END SUBROUTINE test_attr_basic_write
+
+!***************************************************************
+!**
+!**  test_attr_many(): Test basic H5A (attribute) code.
+!**      Tests storing lots of attributes
+!**
+!***************************************************************
+
+SUBROUTINE test_attr_many(new_format, fcpl, fapl, total_error)
+
+  IMPLICIT NONE
+
+  LOGICAL, INTENT(IN) :: new_format
+  INTEGER(HID_T), INTENT(IN) :: fcpl
+  INTEGER(HID_T), INTENT(IN) :: fapl
+  INTEGER, INTENT(INOUT) :: total_error
+  CHARACTER(LEN=8) :: FileName = "tattr.h5"
+  INTEGER(HID_T) :: fid
+  INTEGER(HID_T) :: sid
+  INTEGER(HID_T) :: gid
+  INTEGER(HID_T) :: aid
+  INTEGER :: error
+
+  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
+  CHARACTER(LEN=5) :: chr5
+
+
+  CHARACTER(LEN=11) :: attrname
+  CHARACTER(LEN=8), PARAMETER :: GROUP1_NAME="/Group1"
+
+  INTEGER :: u
+  INTEGER :: nattr
+  LOGICAL :: exists
+  INTEGER, DIMENSION(1) ::  attr_data1
+
+  data_dims = 0
+
+
+  ! Create file 
+  CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl)
+  CALL check("h5fcreate_f",error,total_error)
+
+  !  Create dataspace for attribute 
+  CALL h5screate_f(H5S_SCALAR_F, sid, error)
+  CALL check("h5screate_f",error,total_error)
+
+  !  Create group for attributes 
+
+  CALL H5Gcreate_f(fid, GROUP1_NAME, gid, error)
+  CALL check("H5Gcreate_f", error, total_error)
+
+  !  Create many attributes 
+
+  IF(new_format)THEN
+     nattr = 250
+  ELSE
+     nattr = 2
+  ENDIF
+
+  DO u = 0, nattr - 1
+
+     WRITE(chr5,'(I5.5)') u
+     attrname = 'attr '//chr5
+     CALL H5Aexists_f( gid, attrname, exists, error)
+     CALL verify("H5Aexists",exists,.FALSE.,total_error )
+
+     CALL H5Aexists_by_name_f(fid, GROUP1_NAME, attrname,  exists, error, lapl_id = H5P_DEFAULT_F)
+     CALL verify("H5Aexists_by_name_f",exists,.FALSE.,total_error )
+
+     CALL h5acreate_f(gid, attrname, H5T_NATIVE_INTEGER, sid, aid, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
+     CALL check("h5acreate_f",error,total_error)
+
+     CALL H5Aexists_f(gid, attrname, exists, error)
+     CALL verify("H5Aexists",exists,.TRUE.,total_error )
+
+     CALL H5Aexists_by_name_f(fid, GROUP1_NAME, attrname, exists, error)
+     CALL verify("H5Aexists_by_name_f",exists,.TRUE.,total_error )
+
+     attr_data1(1) = u
+     data_dims(1) = 1
+
+     CALL h5awrite_f(aid, H5T_NATIVE_INTEGER, attr_data1, data_dims, error)
+     CALL check("h5awrite_f",error,total_error)
+
+     CALL h5aclose_f(aid, error)
+     CALL check("h5aclose_f",error,total_error)
+
+     CALL H5Aexists_f(gid, attrname, exists, error)
+     CALL verify("H5Aexists",exists,.TRUE.,total_error )
+
+     CALL H5Aexists_by_name_f(fid, GROUP1_NAME, attrname, exists, error)
+     CALL verify("H5Aexists_by_name_f",exists,.TRUE.,total_error )
+
+  ENDDO
+
+  !  Close group 
+  CALL  H5Gclose_f(gid, error)
+  CALL check("h5gclose_f",error,total_error)
+
+  !  Close file 
+  CALL h5fclose_f(fid, error)
+  CALL check("h5fclose_f",error,total_error)
+
+  !  Close dataspaces 
+  CALL h5sclose_f(sid, error)
+  CALL check("h5sclose_f",error,total_error)
+
+END SUBROUTINE test_attr_many
+
+!-------------------------------------------------------------------------
+! * Function:    attr_open_check
+! *
+! * Purpose:     Check opening attribute on an object
+! *
+! * Return:      Success:        0
+! *              Failure:        -1
+! *
+! * Programmer:  Fortran version (M.S. Breitenfeld)
+! *              March 21, 2008
+! *
+! *-------------------------------------------------------------------------
+! 
+
+SUBROUTINE attr_open_check(fid, dsetname, obj_id, max_attrs, total_error )
+
+  IMPLICIT NONE
+  INTEGER(HID_T), INTENT(IN) :: fid
+  CHARACTER(LEN=*), INTENT(IN) :: dsetname
+  INTEGER(HID_T), INTENT(IN) :: obj_id
+  INTEGER, INTENT(IN) :: max_attrs
+  INTEGER, INTENT(INOUT) :: total_error
+
+  INTEGER :: u
+  CHARACTER (LEN=8) :: attrname
+  INTEGER :: error
+  LOGICAL :: f_corder_valid ! Indicates whether the the creation order data is valid for this attribute
+  INTEGER :: corder ! Is a positive integer containing the creation order of the attribute
+  INTEGER :: cset ! Indicates the character set used for the attribute’s name
+  INTEGER(HSIZE_T) :: data_size   ! indicates the size, in the number of characters
+
+  INTEGER(HSIZE_T) :: storage_size   ! attributes storage requirements
+  CHARACTER(LEN=2) :: chr2
+  INTEGER(HID_T) attr_id
+  !  Open each attribute on object by index and check that it's the correct one 
+
+  DO u = 0, max_attrs-1
+     !  Open the attribute 
+
+     WRITE(chr2,'(I2.2)') u
+     attrname = 'attr '//chr2
+
+
+     CALL h5aopen_f(obj_id, attrname, attr_id, error)
+     CALL check("h5aopen_f",error,total_error)
+
+
+     !  Get the attribute's information 
+
+     CALL h5aget_info_f(attr_id, f_corder_valid, corder, cset, data_size,  error)
+     CALL check("h5aget_info_f",error,total_error)
+
+     !  Check that the object's attributes are correct 
+     CALL verify("h5aget_info_f.corder",corder,u,total_error)
+     CALL verify("h5aget_info_f.corder_valid",f_corder_valid,.TRUE.,total_error)
+     CALL verify("h5aget_info_f.cset", cset, H5T_CSET_ASCII_F, total_error)
+     CALL h5aget_storage_size_f(attr_id, storage_size, error)
+     CALL check("h5aget_storage_size_f",error,total_error)
+
+     CALL verify("h5aget_info_f.data_size", INT(data_size), INT(storage_size), total_error)
+
+
+     !  Close attribute 
+     CALL h5aclose_f(attr_id, error)
+     CALL check("h5aclose_f",error,total_error)
+
+     !  Open the attribute 
+
+     CALL H5Aopen_by_name_f(obj_id, ".", attrname, attr_id, error, lapl_id=H5P_DEFAULT_F, aapl_id=H5P_DEFAULT_F)
+     CALL check("H5Aopen_by_name_f", error, total_error)
+
+     CALL h5aget_info_f(attr_id, f_corder_valid, corder, cset, data_size,  error)
+     CALL check("h5aget_info_f",error,total_error)
+     !  Check the attribute's information 
+     CALL verify("h5aget_info_f",corder,u,total_error)
+     CALL verify("h5aget_info_f",f_corder_valid,.TRUE.,total_error)
+     CALL verify("h5aget_info_f", cset, H5T_CSET_ASCII_F, total_error)
+     CALL h5aget_storage_size_f(attr_id, storage_size, error)
+     CALL check("h5aget_storage_size_f",error,total_error)
+     CALL verify("h5aget_info_f", INT(data_size), INT(storage_size), total_error)
+
+     !  Close attribute 
+     CALL h5aclose_f(attr_id, error)
+     CALL check("h5aclose_f",error,total_error)
+
+
+     !  Open the attribute 
+     CALL H5Aopen_by_name_f(fid, dsetname, attrname, attr_id, error)
+     CALL check("H5Aopen_by_name_f", error, total_error)
+
+
+     !  Get the attribute's information 
+     CALL h5aget_info_f(attr_id, f_corder_valid, corder, cset, data_size,  error)
+     CALL check("h5aget_info_f",error,total_error)
+
+     !  Check the attribute's information 
+     CALL verify("h5aget_info_f",corder,u,total_error)
+     CALL verify("h5aget_info_f",f_corder_valid,.TRUE.,total_error)
+     CALL verify("h5aget_info_f", cset, H5T_CSET_ASCII_F, total_error)
+     CALL h5aget_storage_size_f(attr_id, storage_size, error)
+     CALL check("h5aget_storage_size_f",error,total_error)
+     CALL verify("h5aget_info_f", INT(data_size), INT(storage_size), total_error)
+
+     !  Close attribute 
+     CALL h5aclose_f(attr_id, error)
+     CALL check("h5aclose_f",error,total_error)
+  ENDDO
+
+END SUBROUTINE attr_open_check
+END MODULE TH5A_1_8
diff --git a/fortran/test/tH5A_1_8.f90 b/fortran/test/tH5A_1_8.f90
deleted file mode 100644
index 8e20100..0000000
--- a/fortran/test/tH5A_1_8.f90
+++ /dev/null
@@ -1,2816 +0,0 @@
-!****h* root/fortran/test/tH5A_1_8.f90
-!
-! NAME
-!  tH5A_1_8.f90
-!
-! FUNCTION
-!  Basic testing of Fortran H5A APIs introduced in 1.8.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! CONTAINS SUBROUTINES
-!  attribute_test_1_8, test_attr_corder_create_compact, test_attr_null_space,
-!  test_attr_create_by_name, test_attr_info_by_idx, attr_info_by_idx_check,
-!  test_attr_shared_rename, test_attr_delete_by_idx, test_attr_shared_delete,
-!  test_attr_dense_open, test_attr_dense_verify, test_attr_corder_create_basic,
-!  test_attr_basic_write, test_attr_many, attr_open_check, 
-!
-!*****
-MODULE TH5A_1_8
-
-CONTAINS
-SUBROUTINE attribute_test_1_8(cleanup, total_error)
-
-!   This subroutine tests following 1.8 functionalities:
-!   h5acreate_f,  h5awrite_f, h5aclose_f,h5aread_f, h5aopen_name_f,
-!   h5aget_name_f,h5aget_space_f, h5aget_type_f, H5Pset_shared_mesg_nindexes_f,
-!   H5Pset_shared_mesg_index_f
-!
-
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-
-  IMPLICIT NONE
-  LOGICAL, INTENT(IN)  :: cleanup
-  INTEGER, INTENT(INOUT) :: total_error
-
-  !
-  !general purpose integer
-  !
-  INTEGER     ::   i, j
-  INTEGER     ::   error ! Error flag
-
-  ! NEW STARTS HERE
-  INTEGER(HID_T) :: fapl = -1, fapl2 = -1
-  INTEGER(HID_T) :: fcpl = -1, fcpl2 = -1
-  INTEGER(HID_T) :: my_fapl, my_fcpl
-  LOGICAL, DIMENSION(1:2) :: new_format = (/.TRUE.,.FALSE./)
-  LOGICAL, DIMENSION(1:2) :: use_shared = (/.TRUE.,.FALSE./)
-
-  INTEGER :: ret_total_error
-
-! ********************
-! test_attr equivelent
-! ********************
-
-!  WRITE(*,*) "TESTING ATTRIBUTES"
-
-  CALL H5Pcreate_f(H5P_FILE_ACCESS_F,fapl,error)
-  CALL check("h5Pcreate_f",error,total_error)
-  CALL h5pcopy_f(fapl, fapl2, error)
-  CALL check("h5pcopy_f",error,total_error)
-
-  CALL H5Pcreate_f(H5P_FILE_CREATE_F,fcpl,error)
-  CALL check("h5Pcreate_f",error,total_error)
-
-  CALL h5pcopy_f(fcpl, fcpl2, error)
-  CALL check("h5pcopy_f",error,total_error)
-
-  CALL H5Pset_shared_mesg_nindexes_f(fcpl2,1,error)
-  CALL check("H5Pset_shared_mesg_nindexes_f",error, total_error)
-
-  CALL H5Pset_shared_mesg_index_f(fcpl2, 0, H5O_SHMESG_ATTR_FLAG_F, 1, error)
-  CALL check(" H5Pset_shared_mesg_index_f",error, total_error)
-
-  DO i = 1, 2
-
-     IF (new_format(i)) THEN
-        WRITE(*,'(1X,A)') "Testing with new file format:"
-        my_fapl = fapl2
-     ELSE
-        WRITE(*,'(1X,A)') "Testing with old file format:"
-        my_fapl = fapl
-     END IF
-     ret_total_error = 0
-     CALL test_attr_basic_write(my_fapl, ret_total_error)
-     CALL write_test_status(ret_total_error, &
-          '  - Tests INT attributes on both datasets and groups', &
-          total_error)
-
-     IF(new_format(i)) THEN
-        DO j = 1, 2
-           IF (use_shared(j)) THEN
-              WRITE(*,*) " - Testing with shared attributes:"
-              my_fcpl = fcpl2
-           ELSE
-              WRITE(*,*) " - Testing without shared attributes:"
-              my_fcpl = fcpl
-           END IF
-
-           ret_total_error = 0
-           CALL test_attr_dense_open(my_fcpl, my_fapl, ret_total_error)
-           CALL write_test_status(ret_total_error, &
-                '   - Testing INT attributes on both datasets and groups', &
-                total_error)
-
-           ret_total_error = 0
-           CALL test_attr_null_space(my_fcpl, my_fapl, ret_total_error)
-           CALL write_test_status(ret_total_error, &
-                '   - Testing storing attribute with "null" dataspace', &
-                total_error)
-           ret_total_error = 0
-           CALL test_attr_many(new_format(i), my_fcpl, my_fapl, ret_total_error)
-           CALL write_test_status(ret_total_error, &
-                '   - Testing storing lots of attributes', &
-                total_error)
-
-           ret_total_error = 0
-           CALL test_attr_corder_create_basic(my_fcpl, my_fapl, ret_total_error)
-           CALL write_test_status(ret_total_error, &
-                '   - Testing creating objects with attribute creation order', &
-                total_error)
-
-           ret_total_error = 0
-           CALL test_attr_corder_create_compact(my_fcpl, my_fapl, ret_total_error)
-           CALL write_test_status(ret_total_error, &
-                '   - Testing compact storage on objects with attribute creation order', &
-                total_error)
-           ret_total_error = 0
-           CALL test_attr_info_by_idx(new_format(i), my_fcpl, my_fapl, ret_total_error)
-           CALL write_test_status(ret_total_error, &
-                '   - Testing querying attribute info by index', &
-                total_error)
-
-           ret_total_error = 0
-           CALL test_attr_delete_by_idx(new_format(i), my_fcpl, my_fapl, ret_total_error)
-           CALL write_test_status(ret_total_error, &
-                '   - Testing deleting attribute by index', &
-                total_error)
-
-           ret_total_error = 0
-           CALL test_attr_create_by_name(new_format(i), my_fcpl, my_fapl, ret_total_error)
-           CALL write_test_status(ret_total_error, &
-                '   - Testing creating attributes by name', &
-                total_error)
-
-             !  More complex tests with both "new format" and "shared" attributes 
-           IF( use_shared(j) ) THEN
-              ret_total_error = 0
-              CALL test_attr_shared_rename(my_fcpl, my_fapl, ret_total_error)
-              CALL write_test_status(ret_total_error,&
-                   '   - Testing renaming shared attributes in "compact" & "dense" storage', &
-                   total_error)
-
-              ret_total_error = 0
-              CALL test_attr_shared_delete(my_fcpl, my_fapl, ret_total_error)
-              CALL write_test_status(ret_total_error,&
-                   '   - Testing deleting shared attributes in "compact" & "dense" storage', &
-                   total_error)
-
-           END IF
-        END DO
-     END IF
-  ENDDO
-
-  CALL H5Pclose_f(fcpl, error)
-  CALL CHECK("H5Pclose", error,total_error)
-  CALL H5Pclose_f(fcpl2, error)
-  CALL CHECK("H5Pclose", error,total_error)
-
-  IF(cleanup) CALL h5_cleanup_f("tattr", H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-
-
-  RETURN
-END SUBROUTINE attribute_test_1_8
-
-SUBROUTINE test_attr_corder_create_compact(fcpl,fapl, total_error)
-
-!***************************************************************
-!**
-!**  test_attr_corder_create_compact(): Test basic H5A (attribute) code.
-!**      Tests compact attribute storage on objects with attribute creation order info
-!**
-!***************************************************************
-
-! Needed for get_info_by_name
-
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-
-  IMPLICIT NONE
-
-! - - - arg types - - -
-
-  INTEGER(HID_T), INTENT(IN) :: fcpl
-  INTEGER(HID_T), INTENT(IN) :: fapl
-
-  CHARACTER(LEN=8) :: FileName = "tattr.h5"
-  INTEGER(HID_T) :: fid
-  INTEGER(HID_T) :: dcpl
-  INTEGER(HID_T) :: sid
-
-  INTEGER :: error
-  INTEGER, INTENT(INOUT) :: total_error
-
-  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
-  CHARACTER(LEN=8) :: DSET2_NAME = "Dataset2"
-  CHARACTER(LEN=8) :: DSET3_NAME = "Dataset3"
-  INTEGER, PARAMETER :: NUM_DSETS = 3
-
-  INTEGER :: curr_dset
-
-  INTEGER(HID_T) :: dset1, dset2, dset3
-  INTEGER(HID_T) :: my_dataset
-
-  INTEGER :: u
-
-  INTEGER :: max_compact ! Maximum # of links to store in group compactly
-  INTEGER :: min_dense   ! Minimum # of links to store in group "densely"
-
-  CHARACTER(LEN=7) :: attrname
-  CHARACTER(LEN=2) :: chr2
-  INTEGER(HID_T) :: attr        !String Attribute identifier
-  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
-
-  LOGICAL :: f_corder_valid ! Indicates whether the the creation order data is valid for this attribute
-  INTEGER :: corder ! Is a positive integer containing the creation order of the attribute
-  INTEGER :: cset ! Indicates the character set used for the attribute’s name
-  INTEGER(HSIZE_T) :: data_size   ! indicates the size, in the number of characters
-
-  data_dims = 0
-
-!  WRITE(*,*) "     - Testing Compact Storage of Attributes with Creation Order Info"
-  !  Create file 
-  CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl)
-  CALL check("h5fcreate_f",error,total_error)
-  !  Create dataset creation property list 
-  CALL H5Pcreate_f(H5P_DATASET_CREATE_F,dcpl,error)
-  CALL check("h5Pcreate_f",error,total_error)
-
-  CALL H5Pset_attr_creation_order_f(dcpl, IOR(H5P_CRT_ORDER_TRACKED_F, H5P_CRT_ORDER_INDEXED_F), error)
-  CALL check("H5Pset_attr_creation_order",error,total_error)
-
-  !  Query the attribute creation properties 
-  CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
-  CALL check("H5Pget_attr_phase_change_f",error,total_error)
-
-  CALL h5screate_f(H5S_SCALAR_F, sid, error)
-  CALL check("h5screate_f",error,total_error)
-
-  CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dset1, error, dcpl_id=dcpl )
-  CALL check("h5dcreate_f",error,total_error)
-
-  CALL h5dcreate_f(fid, DSET2_NAME, H5T_NATIVE_CHARACTER, sid, dset2, error, dcpl )
-  CALL check("h5dcreate_f",error,total_error)
-
-  CALL h5dcreate_f(fid, DSET3_NAME, H5T_NATIVE_CHARACTER, sid, dset3, error, dcpl_id=dcpl )
-  CALL check("h5dcreate_f",error,total_error)
-
-  DO curr_dset = 0,NUM_DSETS-1
-     SELECT CASE (curr_dset)
-     CASE (0)
-        my_dataset = dset1
-     CASE (1)
-        my_dataset = dset2
-     CASE (2)
-        my_dataset = dset3
-     END SELECT
-    DO u = 0, max_compact - 1
-       !  Create attribute 
-       WRITE(chr2,'(I2.2)') u
-       attrname = 'attr '//chr2
-
-       CALL h5acreate_f(my_dataset, attrname, H5T_NATIVE_INTEGER, sid, attr, error)
-       CALL check("h5acreate_f",error,total_error)
-
-       data_dims(1) = 1
-       CALL h5awrite_f(attr, H5T_NATIVE_INTEGER, u, data_dims, error)
-       CALL check("h5awrite_f",error,total_error)
-
-       CALL h5aclose_f(attr, error)
-       CALL check("h5aclose_f",error,total_error)
-
-    END DO
-  END DO
-
-  !   Close Datasets 
-  CALL h5dclose_f(dset1, error)
-  CALL check("h5dclose_f",error,total_error)
-  CALL h5dclose_f(dset2, error)
-  CALL check("h5dclose_f",error,total_error)
-  CALL h5dclose_f(dset3, error)
-  CALL check("h5dclose_f",error,total_error)
-
-  !    Close file 
-  CALL h5fclose_f(fid, error)
-  CALL check("h5fclose_f",error,total_error)
-
-  !  Close dataspace 
-  CALL h5sclose_f(sid, error)
-  CALL check("h5sclose_f",error,total_error)
-
-  !  Close property list 
-  CALL h5pclose_f(dcpl, error)
-  CALL check("h5pclose_f",error,total_error)
-
-  CALL h5fopen_f(FileName, H5F_ACC_RDWR_F, fid, error, fapl)
-  CALL check("h5open_f",error,total_error)
-
-  CALL h5dopen_f(fid, DSET1_NAME, dset1, error)
-  CALL check("h5dopen_f",error,total_error)
-  CALL h5dopen_f(fid, DSET2_NAME, dset2, error)
-  CALL check("h5dopen_f",error,total_error)
-  CALL h5dopen_f(fid, DSET3_NAME, dset3, error)
-  CALL check("h5dopen_f",error,total_error)
-  DO curr_dset = 0,NUM_DSETS-1
-     SELECT CASE (curr_dset)
-     CASE (0)
-        my_dataset = dset1
-     CASE (1)
-        my_dataset = dset2
-     CASE (2)
-        my_dataset = dset3
-     CASE DEFAULT
-        WRITE(*,*) " WARNING: To many data sets! "
-     END SELECT
-     DO u = 0,max_compact-1
-        WRITE(chr2,'(I2.2)') u
-        attrname = 'attr '//chr2
-        !  Retrieve information for attribute 
-
-        CALL H5Aget_info_by_name_f(my_dataset, ".", attrname, &
-             f_corder_valid, corder, cset, data_size, error, lapl_id = H5P_DEFAULT_F ) !with optional
-
-        CALL check("H5Aget_info_by_name_f", error, total_error)
-
-        !  Verify creation order of attribute 
-
-        CALL verifyLogical("H5Aget_info_by_name_f", f_corder_valid, .TRUE., total_error)
-        CALL verify("H5Aget_info_by_name_f", corder, u, total_error)
-
-
-        !  Retrieve information for attribute 
-
-        CALL H5Aget_info_by_name_f(my_dataset, ".", attrname, &
-             f_corder_valid, corder, cset, data_size, error) ! without optional
-
-        CALL check("H5Aget_info_by_name_f", error, total_error)
-
-        !  Verify creation order of attribute 
-
-        CALL verifyLogical("H5Aget_info_by_name_f", f_corder_valid, .TRUE., total_error)
-        CALL verify("H5Aget_info_by_name_f", corder, u, total_error)
-
-     END DO
-  END DO
-  !   Close Datasets 
-  CALL h5dclose_f(dset1, error)
-  CALL check("h5dclose_f",error,total_error)
-  CALL h5dclose_f(dset2, error)
-  CALL check("h5dclose_f",error,total_error)
-  CALL h5dclose_f(dset3, error)
-  CALL check("h5dclose_f",error,total_error)
-
-  !    Close file 
-  CALL h5fclose_f(fid, error)
-  CALL check("h5fclose_f",error,total_error)
-
-END SUBROUTINE test_attr_corder_create_compact
-
-SUBROUTINE test_attr_null_space(fcpl, fapl, total_error)
-!***************************************************************
-!**
-!**  test_attr_null_space(): Test basic H5A (attribute) code.
-!**      Tests storing attribute with "null" dataspace
-!**
-!***************************************************************
-  USE HDF5
-  USE TH5_MISC
-
-  IMPLICIT NONE
-
-  INTEGER(HID_T), INTENT(IN) :: fcpl
-  INTEGER(HID_T), INTENT(IN) :: fapl
-  INTEGER, INTENT(INOUT) :: total_error
-
-  CHARACTER(LEN=8) :: FileName = "tattr.h5"
-  INTEGER(HID_T) :: fid
-  INTEGER(HID_T) :: sid, null_sid
-  INTEGER(HID_T) :: dataset
-
-  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
-
-  INTEGER :: error
-
-  INTEGER :: value_scalar
-  INTEGER, DIMENSION(1) :: value
-  INTEGER(HID_T) :: attr        !String Attribute identifier
-  INTEGER(HID_T) :: attr_sid
-  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
-
-  INTEGER(HSIZE_T) :: storage_size   ! attributes storage requirements
-
-  LOGICAL :: f_corder_valid ! Indicates whether the the creation order data is valid for this attribute
-  INTEGER :: corder ! Is a positive integer containing the creation order of the attribute
-  INTEGER :: cset ! Indicates the character set used for the attribute’s name
-  INTEGER(HSIZE_T) :: data_size   ! indicates the size, in the number of characters
-
-  LOGICAL :: equal
-
-  ! test: H5Sextent_equal_f
-
-  data_dims = 0
-
-  !  Create file 
-  CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl)
-  CALL check("h5fcreate_f",error,total_error)
-  !  Close file 
-  CALL h5fclose_f(fid, error)
-  CALL check("h5fclose_f",error,total_error)
-
-  !  Re-open file 
-  CALL h5fopen_f(FileName, H5F_ACC_RDWR_F, fid, error)
-  CALL check("h5open_f",error,total_error)
-  !  Create dataspace for dataset attributes 
-  CALL h5screate_f(H5S_SCALAR_F, sid, error)
-  CALL check("h5screate_f",error,total_error)
-  !  Create "null" dataspace for attribute 
-  CALL h5screate_f(H5S_NULL_F, null_sid, error)
-  CALL check("h5screate_f",error,total_error)
-  !  Create a dataset 
-  CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dataset, error)
-  CALL check("h5dcreate_f",error,total_error)
-  !  Add attribute with 'null' dataspace 
-
-  !  Create attribute 
-  CALL h5acreate_f(dataset, "null attr", H5T_NATIVE_INTEGER, null_sid, attr, error)
-  CALL check("h5acreate_f",error,total_error)
-
-  !  Try to read data from the attribute 
-  !  (shouldn't fail, but should leave buffer alone) 
-  value(1) = 103
-  data_dims(1) = 1
-  CALL h5aread_f(attr, H5T_NATIVE_INTEGER, value, data_dims, error)
-  CALL check("h5aread_f",error,total_error)
-  CALL verify("h5aread_f",value(1),103,total_error)
-
-!  Try to read data from the attribute again but
-!  for a scalar 
-
-  value_scalar = 104
-  data_dims(1) = 1
-  CALL h5aread_f(attr, H5T_NATIVE_INTEGER, value_scalar, data_dims, error)
-  CALL check("h5aread_f",error,total_error)
-  CALL verify("h5aread_f",value_scalar,104,total_error)
-
-  CALL h5aget_space_f(attr, attr_sid, error)
-  CALL check("h5aget_space_f",error,total_error)
-
-  CALL H5Sextent_equal_f(attr_sid, null_sid, equal, error)
-  CALL check("H5Sextent_equal_f",error,total_error)
-  CALL Verifylogical("H5Sextent_equal_f",equal,.TRUE.,total_error)
-
-  CALL h5aget_storage_size_f(attr, storage_size, error)
-  CALL check("h5aget_storage_size_f",error,total_error)
-  CALL VERIFY("h5aget_storage_size_f",INT(storage_size),0,total_error)
-
-  CALL h5aget_info_f(attr, f_corder_valid, corder, cset, data_size,  error)
-  CALL check("h5aget_info_f", error, total_error)
-
-  !  Check the attribute's information 
-  CALL VERIFY("h5aget_info_f.corder",corder,0,total_error)
-
-  CALL VERIFY("h5aget_info_f.cset", cset, H5T_CSET_ASCII_F, total_error)
-  CALL h5aget_storage_size_f(attr, storage_size, error)
-  CALL check("h5aget_storage_size_f",error,total_error)
-  CALL VERIFY("h5aget_info_f.data_size", INT(data_size), INT(storage_size), total_error)
-  CALL h5aclose_f(attr,error)
-  CALL check("h5aclose_f",error,total_error)
-
-  CALL H5Sclose_f(attr_sid, error)
-  CALL check("H5Sclose_f",error,total_error)
-
-  CALL H5Dclose_f(dataset, error)
-  CALL check("H5Dclose_f", error,total_error)
-
-
-  CALL H5Fclose_f(fid, error)
-  CALL check("H5Fclose_f", error,total_error)
-
-  CALL H5Sclose_f(sid, error)
-  CALL check("H5Sclose_f", error,total_error)
-
-  CALL H5Sclose_f(null_sid, error)
-  CALL check("H5Sclose_f", error,total_error)
-
-END SUBROUTINE test_attr_null_space
-
-
-SUBROUTINE test_attr_create_by_name(new_format,fcpl,fapl, total_error)
-
-!***************************************************************
-!**
-!**  test_attr_create_by_name(): Test basic H5A (attribute) code.
-!**      Tests creating attributes by name
-!**
-!***************************************************************
-
-  USE HDF5
-  USE TH5_MISC
-
-  IMPLICIT NONE
-
-  INTEGER(SIZE_T), PARAMETER :: NAME_BUF_SIZE = 7
-  LOGICAL :: new_format
-  INTEGER(HID_T), INTENT(IN) :: fcpl
-  INTEGER(HID_T), INTENT(IN) :: fapl
-  INTEGER, INTENT(INOUT) :: total_error
-
-  INTEGER :: max_compact,min_dense,u
-  CHARACTER (LEN=NAME_BUF_SIZE) :: attrname
-  CHARACTER(LEN=8) :: dsetname
-
-  CHARACTER(LEN=8) :: FileName = "tattr.h5"
-  INTEGER(HID_T) :: fid
-  INTEGER(HID_T) :: dcpl
-  INTEGER(HID_T) :: sid
-
-  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
-  CHARACTER(LEN=8) :: DSET2_NAME = "Dataset2"
-  CHARACTER(LEN=8) :: DSET3_NAME = "Dataset3"
-  INTEGER, PARAMETER :: NUM_DSETS = 3
-
-  INTEGER :: curr_dset
-
-  INTEGER(HID_T) :: dset1, dset2, dset3
-  INTEGER(HID_T) :: my_dataset
-  INTEGER :: error
-
-  INTEGER(HID_T) :: attr        !String Attribute identifier
-  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
-
-
-  CHARACTER(LEN=2) :: chr2
-  LOGICAL, DIMENSION(1:2) :: use_index = (/.FALSE.,.TRUE./)
-  INTEGER :: Input1
-  INTEGER :: i
-
-  data_dims = 0
-
-
-  !  Create dataspace for dataset & attributes 
-  CALL h5screate_f(H5S_SCALAR_F, sid, error)
-  CALL check("h5screate_f",error,total_error)
-
-  !  Create dataset creation property list 
-  CALL H5Pcreate_f(H5P_DATASET_CREATE_F,dcpl,error)
-  CALL check("h5Pcreate_f",error,total_error)
-
-  !  Query the attribute creation properties 
-
-  CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
-  CALL check("H5Pget_attr_phase_change_f",error,total_error)
-
-  !  Loop over using index for creation order value 
-  DO i = 1, 2
-     !  Print appropriate test message 
-     IF(use_index(i))THEN
-        WRITE(*,*) "   - Testing Creating Attributes By Name w/Creation Order Index"
-     ELSE
-        WRITE(*,*) "   - Testing Creating Attributes By Name w/o Creation Order Index"
-     ENDIF
-     !  Create file 
-     CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl)
-     CALL check("h5fcreate_f",error,total_error)
-
-     !  Set attribute creation order tracking & indexing for object 
-     IF(new_format)THEN
-
-        IF(use_index(i))THEN
-           Input1 = H5P_CRT_ORDER_INDEXED_F
-        ELSE
-           Input1 = 0
-        ENDIF
-
-        CALL H5Pset_attr_creation_order_f(dcpl, IOR(H5P_CRT_ORDER_TRACKED_F, Input1), error)
-        CALL check("H5Pset_attr_creation_order",error,total_error)
-
-     ENDIF
-
-     !  Create datasets 
-
-     CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dset1, error, dcpl_id=dcpl )
-     CALL check("h5dcreate_f2",error,total_error)
-
-     CALL h5dcreate_f(fid, DSET2_NAME, H5T_NATIVE_CHARACTER, sid, dset2, error, dcpl_id=dcpl )
-     CALL check("h5dcreate_f3",error,total_error)
-
-     CALL h5dcreate_f(fid, DSET3_NAME, H5T_NATIVE_CHARACTER, sid, dset3, error, dcpl_id=dcpl )
-     CALL check("h5dcreate_f4",error,total_error)
-
-
-     !  Work on all the datasets 
-
-     DO curr_dset = 0,NUM_DSETS-1
-        SELECT CASE (curr_dset)
-        CASE (0)
-           my_dataset = dset1
-           dsetname = DSET1_NAME
-        CASE (1)
-           my_dataset = dset2
-           dsetname = DSET2_NAME
-        CASE (2)
-           my_dataset = dset3
-           dsetname = DSET3_NAME
-           !     CASE DEFAULT
-           !        CALL HDassert(0.AND."Toomanydatasets!")
-        END SELECT
-
-
-        ! Create attributes, up to limit of compact form 
-
-        DO u = 0, max_compact - 1
-           !  Create attribute 
-           WRITE(chr2,'(I2.2)') u
-           attrname = 'attr '//chr2
-           CALL H5Acreate_by_name_f(fid, dsetname, attrname, H5T_NATIVE_INTEGER, sid, &
-                attr, error, lapl_id=H5P_DEFAULT_F, acpl_id=H5P_DEFAULT_F, aapl_id=H5P_DEFAULT_F)
-           CALL check("H5Acreate_by_name_f",error,total_error)
-
-           !  Write data into the attribute 
-
-           data_dims(1) = 1
-           CALL h5awrite_f(attr, H5T_NATIVE_INTEGER, u, data_dims, error)
-           CALL check("h5awrite_f",error,total_error)
-
-           !  Close attribute 
-           CALL h5aclose_f(attr, error)
-           CALL check("h5aclose_f",error,total_error)
-
-           !  Verify information for NEW attribute 
-           CALL attr_info_by_idx_check(my_dataset, attrname, INT(u,HSIZE_T), use_index(i), total_error)
-         !   CALL check("FAILED IN attr_info_by_idx_check",total_error)
-        ENDDO
-
-        !  Test opening attributes stored compactly 
-
-        CALL attr_open_check(fid, dsetname, my_dataset, u, total_error)
-
-     ENDDO
-
-
-     !  Work on all the datasets 
-     DO curr_dset = 0,NUM_DSETS-1
-        SELECT CASE (curr_dset)
-        CASE (0)
-           my_dataset = dset1
-           dsetname = DSET1_NAME
-        CASE (1)
-           my_dataset = dset2
-           dsetname = DSET2_NAME
-        CASE (2)
-           my_dataset = dset3
-           dsetname = DSET3_NAME
-        END SELECT
-
-        !  Create more attributes, to push into dense form 
-        DO u = max_compact, max_compact* 2 - 1
-
-           WRITE(chr2,'(I2.2)') u
-           attrname = 'attr '//chr2
-
-           CALL H5Acreate_by_name_f(fid, dsetname, attrname, H5T_NATIVE_INTEGER, sid, &
-                attr, error, lapl_id=H5P_DEFAULT_F)
-           CALL check("H5Acreate_by_name",error,total_error)
-
-           !  Write data into the attribute 
-           data_dims(1) = 1
-           CALL h5awrite_f(attr, H5T_NATIVE_INTEGER, u, data_dims, error)
-           CALL check("h5awrite_f",error,total_error)
-
-           !  Close attribute 
-           CALL h5aclose_f(attr, error)
-           CALL check("h5aclose_f",error,total_error)
-
-        ENDDO
-
-     ENDDO
-
-     !  Close Datasets 
-     CALL h5dclose_f(dset1, error)
-     CALL check("h5dclose_f",error,total_error)
-     CALL h5dclose_f(dset2, error)
-     CALL check("h5dclose_f",error,total_error)
-     CALL h5dclose_f(dset3, error)
-     CALL check("h5dclose_f",error,total_error)
-
-
-     !  Close file 
-     CALL h5fclose_f(fid, error)
-     CALL check("h5fclose_f",error,total_error)
-  ENDDO
-
-  !  Close property list 
-  CALL h5pclose_f(dcpl, error)
-  CALL check("h5pclose_f",error,total_error)
-
-  !  Close dataspace 
-  CALL h5sclose_f(sid, error)
-  CALL check("h5sclose_f",error,total_error)
-
-END SUBROUTINE test_attr_create_by_name
-
-
-SUBROUTINE test_attr_info_by_idx(new_format, fcpl, fapl, total_error)
-
-!***************************************************************
-!**
-!**  test_attr_info_by_idx(): Test basic H5A (attribute) code.
-!**      Tests querying attribute info by index
-!**
-!***************************************************************
-
-  USE HDF5
-  USE TH5_MISC
-
-  IMPLICIT NONE
-
-  LOGICAL :: new_format
-  INTEGER(HID_T), INTENT(IN) :: fcpl
-  INTEGER(HID_T), INTENT(IN) :: fapl
-  INTEGER, INTENT(INOUT) :: total_error
-  CHARACTER(LEN=8) :: FileName = "tattr.h5"
-  INTEGER(HID_T) :: fid
-  INTEGER(HID_T) :: dcpl
-  INTEGER(HID_T) :: sid
-
-  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
-  CHARACTER(LEN=8) :: DSET2_NAME = "Dataset2"
-  CHARACTER(LEN=8) :: DSET3_NAME = "Dataset3"
-  INTEGER, PARAMETER :: NUM_DSETS = 3
-
-  INTEGER :: curr_dset
-
-  INTEGER(HID_T) :: dset1, dset2, dset3
-  INTEGER(HID_T) :: my_dataset
-  INTEGER :: error
-
-  INTEGER(HID_T) :: attr        !String Attribute identifier
-  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
-
-  LOGICAL :: f_corder_valid ! Indicates whether the the creation order data is valid for this attribute
-  INTEGER :: corder ! Is a positive integer containing the creation order of the attribute
-  INTEGER :: cset ! Indicates the character set used for the attribute’s name
-  INTEGER(HSIZE_T) :: data_size   ! indicates the size, in the number of characters
-  INTEGER(HSIZE_T) :: n
-  LOGICAL, DIMENSION(1:2) :: use_index = (/.FALSE.,.TRUE./)
-
-  INTEGER :: max_compact ! Maximum # of links to store in group compactly
-  INTEGER :: min_dense   ! Minimum # of links to store in group "densely"
-
-  CHARACTER(LEN=2) :: chr2
-
-  INTEGER :: i, j
-
-  INTEGER, DIMENSION(1) ::  attr_integer_data
-  CHARACTER(LEN=7) :: attrname
-
-  INTEGER(SIZE_T) :: size
-  CHARACTER(LEN=80) :: tmpname
-
-  INTEGER :: Input1
-  INTEGER(HSIZE_T) :: hzero = 0_HSIZE_T
-  INTEGER :: minusone = -1
-  INTEGER(HSIZE_T) :: htmp
-
-  data_dims = 0
-
-  !  Create dataspace for dataset & attributes 
-
-  CALL h5screate_f(H5S_SCALAR_F, sid, error)
-  CALL check("h5screate_f",error,total_error)
-
-
-  !  Create dataset creation property list 
-
-  CALL H5Pcreate_f(H5P_DATASET_CREATE_F,dcpl,error)
-  CALL check("h5Pcreate_f",error,total_error)
-
-
-  !  Query the attribute creation properties 
-  CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
-  CALL check("H5Pget_attr_phase_change_f",error,total_error)
-
-  !   Loop over using index for creation order value 
-
-  DO i = 1, 2
-
-     !  Create file 
-     CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl)
-     CALL check("h5fcreate_f",error,total_error)
-
-     !  Set attribute creation order tracking & indexing for object 
-     IF(new_format)THEN
-        IF(use_index(i))THEN
-           Input1 = H5P_CRT_ORDER_INDEXED_F
-        ELSE
-           Input1 = 0
-        ENDIF
-        CALL H5Pset_attr_creation_order_f(dcpl, IOR(H5P_CRT_ORDER_TRACKED_F, Input1), error)
-        CALL check("H5Pset_attr_creation_order",error,total_error)
-     ENDIF
-
-     !  Create datasets 
-
-     CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dset1, error )
-     CALL check("h5dcreate_f",error,total_error)
-
-     CALL h5dcreate_f(fid, DSET2_NAME, H5T_NATIVE_CHARACTER, sid, dset2, error )
-     CALL check("h5dcreate_f",error,total_error)
-
-     CALL h5dcreate_f(fid, DSET3_NAME, H5T_NATIVE_CHARACTER, sid, dset3, error )
-     CALL check("h5dcreate_f",error,total_error)
-
-     !  Work on all the datasets 
-
-     DO curr_dset = 0,NUM_DSETS-1
-
-        SELECT CASE (curr_dset)
-        CASE (0)
-           my_dataset = dset1
-        CASE (1)
-           my_dataset = dset2
-        CASE (2)
-           my_dataset = dset3
-        END SELECT
-
-        !  Check for query on non-existant attribute 
-
-        n = 0
-
-        ! -- CHECK PASSING AN INTEGER CONSTANT IN DIFFERENT FORMS --
-
-        ! 1) call by passing an integer with the _hsize_t declaration
-
-        CALL h5aget_info_by_idx_f(my_dataset, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, 0_hsize_t, &
-             f_corder_valid, corder, cset, data_size, error, lapl_id=H5P_DEFAULT_F)
-        CALL VERIFY("h5aget_info_by_idx_f",error,minusone,total_error)
-
-        ! 2) call by passing an integer with the INT(,hsize_t) declaration
-
-        CALL h5aget_info_by_idx_f(my_dataset, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, INT(0,hsize_t), &
-             f_corder_valid, corder, cset, data_size, error, lapl_id=H5P_DEFAULT_F)
-        CALL VERIFY("h5aget_info_by_idx_f",error,minusone,total_error)
-
-
-        ! 3) call by passing a variable with the attribute hsize_t
-
-        CALL h5aget_info_by_idx_f(my_dataset, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, hzero, &
-             f_corder_valid, corder, cset, data_size, error, lapl_id=H5P_DEFAULT_F)
-        CALL VERIFY("h5aget_info_by_idx_f",error,minusone,total_error)
-
-        CALL h5aget_name_by_idx_f(my_dataset, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, &
-             hzero, tmpname,  error, size, lapl_id=H5P_DEFAULT_F)
-        CALL VERIFY("h5aget_name_by_idx_f",error,minusone,total_error)
-
-
-        !  Create attributes, up to limit of compact form 
-
-        DO j = 0, max_compact-1
-           !  Create attribute 
-           WRITE(chr2,'(I2.2)') j
-           attrname = 'attr '//chr2
-
-           ! check with the optional information create2 specs.
-           CALL h5acreate_f(my_dataset, attrname, H5T_NATIVE_INTEGER, sid, attr, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
-           CALL check("h5acreate_f",error,total_error)
-
-           !  Write data into the attribute 
-
-           attr_integer_data(1) = j
-           data_dims(1) = 1
-           CALL h5awrite_f(attr, H5T_NATIVE_INTEGER, attr_integer_data, data_dims, error)
-           CALL check("h5awrite_f",error,total_error)
-
-           !  Close attribute 
-
-           CALL h5aclose_f(attr, error)
-           CALL check("h5aclose_f",error,total_error)
-
-           !  Verify information for new attribute 
-
-!EP        CALL attr_info_by_idx_check(my_dataset, attrname, INT(j,HSIZE_T), use_index(i), total_error )
-           htmp = j
-           CALL attr_info_by_idx_check(my_dataset, attrname, htmp, use_index(i), total_error )
-
-           !CHECK(ret, FAIL, "attr_info_by_idx_check");
-        ENDDO
-
-     ENDDO
-
-
-     !   Close Datasets 
-     CALL h5dclose_f(dset1, error)
-     CALL check("h5dclose_f",error,total_error)
-     CALL h5dclose_f(dset2, error)
-     CALL check("h5dclose_f",error,total_error)
-     CALL h5dclose_f(dset3, error)
-     CALL check("h5dclose_f",error,total_error)
-
-     !    Close file 
-     CALL h5fclose_f(fid, error)
-     CALL check("h5fclose_f",error,total_error)
-
-  END DO
-
-  !  Close property list 
-  CALL h5pclose_f(dcpl,error)
-  CALL check("h5pclose_f", error, total_error)
-
-  !  Close dataspace 
-  CALL h5sclose_f(sid, error)
-  CALL check("h5sclose_f",error,total_error)
-
-END SUBROUTINE test_attr_info_by_idx
-
-
-SUBROUTINE attr_info_by_idx_check(obj_id, attrname, n, use_index, total_error )
-
-  USE HDF5
-  USE TH5_MISC
-
-  IMPLICIT NONE
-
-  INTEGER :: error, total_error
-
-  INTEGER(HID_T) :: obj_id
-  CHARACTER(LEN=*) :: attrname
-  INTEGER(HSIZE_T) :: n
-  LOGICAL :: use_index
-  LOGICAL :: f_corder_valid ! Indicates whether the the creation order data is valid for this attribute
-  INTEGER :: corder ! Is a positive integer containing the creation order of the attribute
-  INTEGER :: cset ! Indicates the character set used for the attribute’s name
-  INTEGER(HSIZE_T) :: data_size   ! indicates the size, in the number of characters
-
-  INTEGER(SIZE_T) :: NAME_BUF_SIZE = 7
-  CHARACTER(LEN=7) :: tmpname
-  INTEGER(HSIZE_T) :: hzero = 0_HSIZE_T
-
-
-  !  Verify the information for first attribute, in increasing creation order 
-  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, hzero, &
-       f_corder_valid, corder, cset, data_size, error)
-
-  CALL check("h5aget_info_by_idx_f",error,total_error)
-  CALL verify("h5aget_info_by_idx_f",corder,0,total_error)
-  !  Verify the information for new attribute, in increasing creation order 
-
-  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, n, &
-       f_corder_valid, corder, cset, data_size, error)
-
-  CALL check("h5aget_info_by_idx_f",error,total_error)
-  CALL VERIFY("h5aget_info_by_idx_f",corder,INT(n),total_error)
-
-  !  Verify the name for new link, in increasing creation order 
-
-  ! Try with the correct buffer size
-
-  CALL h5aget_name_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, &
-       n, tmpname, error, NAME_BUF_SIZE)
-  CALL check("h5aget_name_by_idx_f",error,total_error)
-  CALL VERIFY("h5aget_name_by_idx_f", INT(NAME_BUF_SIZE), 7, error)
-
-  IF(attrname.NE.tmpname)THEN
-     error = -1
-  ENDIF
-  CALL VERIFY("h5aget_name_by_idx_f",error,0,total_error)
-
-  !   Don't test "native" order if there is no creation order index, since
-  !   *  there's not a good way to easily predict the attribute's order in the name
-  !   *  index.
-  !   
-  IF (use_index) THEN
-     !  Verify the information for first attribute, in native creation order 
-     CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_NATIVE_F, hzero, &
-          f_corder_valid, corder, cset, data_size, error)
-     CALL check("h5aget_info_by_idx_f",error,total_error)
-     CALL VERIFY("h5aget_info_by_idx_f",corder,0,total_error)
-
-     !  Verify the information for new attribute, in native creation order 
-     CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_NATIVE_F, n, &
-          f_corder_valid, corder, cset, data_size, error)
-     CALL check("h5aget_info_by_idx_f",error,total_error)
-     CALL VERIFY("h5aget_info_by_idx_f",corder,INT(n),total_error)
-
-   !  Verify the name for new link, in increasing native order 
-     CALL h5aget_name_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_NATIVE_F, &
-          n, tmpname, error) ! check with no optional parameters
-     CALL check("h5aget_name_by_idx_f",error,total_error)
-     IF(TRIM(attrname).NE.TRIM(tmpname))THEN
-        WRITE(*,*) "ERROR: attribute name size wrong!"
-        error = -1
-     ENDIF
-     CALL VERIFY("h5aget_name_by_idx_f",error,0,total_error)
-  END IF
-
-
-  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_DEC_F, n, &
-       f_corder_valid, corder, cset, data_size, error)
-  CALL check("h5aget_info_by_idx_f",error,total_error)
-  CALL VERIFY("h5aget_info_by_idx_f",corder,0,total_error)
-
-!EP  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_DEC_F, 0_HSIZE_T, &
-
-  ! -- CHECK PASSING AN INTEGER CONSTANT IN DIFFERENT FORMS --
-
-  ! 1) call by passing an integer with the _hsize_t declaration
-
-  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_DEC_F, 0_HSIZE_T, &
-       f_corder_valid, corder, cset, data_size, error)
-  CALL check("h5aget_info_by_idx_f",error,total_error)
-  CALL VERIFY("h5aget_info_by_idx_f",corder,INT(n),total_error)
-
-  ! 2) call by passing an integer with the INT(,hsize_t) declaration
-
-  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_DEC_F, INT(0,HSIZE_T), &
-       f_corder_valid, corder, cset, data_size, error)
-  CALL check("h5aget_info_by_idx_f",error,total_error)
-  CALL VERIFY("h5aget_info_by_idx_f",corder,INT(n),total_error)
-
-  ! 3) call by passing a variable with the attribute hsize_t
-
-  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_DEC_F, hzero, &
-       f_corder_valid, corder, cset, data_size, error)
-  CALL check("h5aget_info_by_idx_f",error,total_error)
-  CALL VERIFY("h5aget_info_by_idx_f",corder,INT(n),total_error)
-
-!EP  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_NAME_F, H5_ITER_INC_F, 0_HSIZE_T, &
-  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_NAME_F, H5_ITER_INC_F, hzero, &
-       f_corder_valid, corder, cset, data_size, error)
-  CALL check("h5aget_info_by_idx_f",error,total_error)
-  CALL VERIFY("h5aget_info_by_idx_f",corder,0,total_error)
-  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_NAME_F, H5_ITER_INC_F, n, &
-       f_corder_valid, corder, cset, data_size, error)
-  CALL check("h5aget_info_by_idx_f",error,total_error)
-  CALL VERIFY("h5aget_info_by_idx_f",corder,INT(n),total_error)
-
-  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_NAME_F, H5_ITER_DEC_F, n, &
-       f_corder_valid, corder, cset, data_size, error)
-  CALL check("h5aget_info_by_idx_f",error,total_error)
-  CALL VERIFY("h5aget_info_by_idx_f",corder,0,total_error)
-!EP  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_NAME_F, H5_ITER_DEC_F, 0_HSIZE_T, &
-  CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_NAME_F, H5_ITER_DEC_F, hzero, &
-       f_corder_valid, corder, cset, data_size, error)
-  CALL check("h5aget_info_by_idx_f",error,total_error)
-  CALL VERIFY("h5aget_info_by_idx_f",corder,INT(n),total_error)
-
-
-END SUBROUTINE attr_info_by_idx_check
-
-
-SUBROUTINE test_attr_shared_rename( fcpl, fapl, total_error)
-
-!***************************************************************
-!**
-!**  test_attr_shared_rename(): Test basic H5A (attribute) code.
-!**      Tests renaming shared attributes in "compact" & "dense" storage
-!**
-!***************************************************************
-
-  USE HDF5
-  USE TH5_MISC
-
-  IMPLICIT NONE
-
-  INTEGER(HID_T), INTENT(IN) :: fcpl
-  INTEGER(HID_T), INTENT(IN) :: fapl
-  INTEGER, INTENT(INOUT) :: total_error
-
-    CHARACTER(LEN=8) :: FileName = "tattr.h5"
-  INTEGER(HID_T) :: fid
-  INTEGER(HID_T) :: dcpl
-  INTEGER(HID_T) :: sid, big_sid
-
-  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
-  CHARACTER(LEN=8) :: DSET2_NAME = "Dataset2"
-
-
-  INTEGER(HID_T) :: dataset, dataset2
-
-  INTEGER :: error
-
-  INTEGER(HID_T) :: attr        !String Attribute identifier
-  INTEGER(HID_T) :: attr_tid
-  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
-
-
-  INTEGER :: max_compact ! Maximum # of links to store in group compactly
-  INTEGER :: min_dense   ! Minimum # of links to store in group "densely"
-
-  CHARACTER(LEN=2) :: chr2
-
-
-  INTEGER, DIMENSION(1) ::  attr_integer_data
-  CHARACTER(LEN=7) :: attrname
-  CHARACTER(LEN=11) :: attrname2
-
-  INTEGER :: u
-  INTEGER(HID_T) :: my_fcpl
-
-  CHARACTER(LEN=5), PARAMETER :: TYPE1_NAME = "/Type"
-
-  INTEGER :: test_shared
-  INTEGER(HSIZE_T), DIMENSION(1) :: adims2 = (/1/) ! Attribute dimension
-  INTEGER     ::   arank = 1                      ! Attribure rank
-
-  !  Initialize "big" attribute data 
-
-  !  Create dataspace for dataset 
-  CALL h5screate_f(H5S_SCALAR_F, sid, error)
-  CALL check("h5screate_f",error,total_error)
-
-  !  Create "big" dataspace for "large" attributes 
-
-  CALL h5screate_simple_f(arank, adims2, big_sid, error)
-  CALL check("h5screate_simple_f",error,total_error)
-
-  !  Loop over type of shared components 
-  DO test_shared = 0, 2
-     !  Make copy of file creation property list 
-     CALL H5Pcopy_f(fcpl, my_fcpl, error)
-     CALL check("H5Pcopy",error,total_error)
-
-     !  Set up datatype for attributes 
-
-     CALL H5Tcopy_f(H5T_NATIVE_INTEGER, attr_tid, error)
-     CALL check("H5Tcopy",error,total_error)
-
-     !  Special setup for each type of shared components 
-
-     IF( test_shared .EQ. 0) THEN
-        !  Make attributes > 500 bytes shared 
-        CALL H5Pset_shared_mesg_nindexes_f(my_fcpl,1,error)
-        CALL check("H5Pset_shared_mesg_nindexes_f",error, total_error)
-        CALL H5Pset_shared_mesg_index_f(my_fcpl, 0, H5O_SHMESG_ATTR_FLAG_F, 500,error)
-        CALL check(" H5Pset_shared_mesg_index_f",error, total_error)
-
-     ELSE
-        !  Set up copy of file creation property list 
-        CALL H5Pset_shared_mesg_nindexes_f(my_fcpl,3,error)
-
-        !  Make attributes > 500 bytes shared 
-        CALL H5Pset_shared_mesg_index_f(my_fcpl, 0, H5O_SHMESG_ATTR_FLAG_F, 500,error)
-        !  Make datatypes & dataspaces > 1 byte shared (i.e. all of them :-) 
-        CALL H5Pset_shared_mesg_index_f(my_fcpl, 1, H5O_SHMESG_DTYPE_FLAG_F, 1,error)
-        CALL H5Pset_shared_mesg_index_f(my_fcpl, 2,  H5O_SHMESG_SDSPACE_FLAG_F, 1,error)
-     ENDIF
-
-     !  Create file 
-     CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, my_fcpl, fapl)
-     CALL check("h5fcreate_f",error,total_error)
-
-     !  Close FCPL copy 
-     CALL h5pclose_f(my_fcpl, error)
-     CALL check("h5pclose_f", error, total_error)
-     !  Close file 
-     CALL h5fclose_f(fid, error)
-     CALL check("h5fclose_f",error,total_error)
-
-     !  Re-open file 
-     CALL h5fopen_f(FileName, H5F_ACC_RDWR_F, fid, error,fapl)
-     CALL check("h5open_f",error,total_error)
-
-     !  Commit datatype to file 
-     IF(test_shared.EQ.2) THEN
-        CALL H5Tcommit_f(fid, TYPE1_NAME, attr_tid, error, H5P_DEFAULT_F, H5P_DEFAULT_F, H5P_DEFAULT_F)
-        CALL check("H5Tcommit",error,total_error)
-     ENDIF
-
-     !  Set up to query the object creation properties 
-     CALL H5Pcreate_f(H5P_DATASET_CREATE_F,dcpl,error)
-     CALL check("h5Pcreate_f",error,total_error)
-
-     !  Create datasets 
-     CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dataset, error, dcpl_id=dcpl )
-     CALL check("h5dcreate_f",error,total_error)
-     CALL h5dcreate_f(fid, DSET2_NAME, H5T_NATIVE_CHARACTER, sid, dataset2, error, dcpl_id=dcpl )
-     CALL check("h5dcreate_f",error,total_error)
-
-     !  Retrieve limits for compact/dense attribute storage 
-     CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
-     CALL check("H5Pget_attr_phase_change_f",error,total_error)
-
-     !  Close property list 
-     CALL h5pclose_f(dcpl,error)
-     CALL check("h5pclose_f", error, total_error)
-
-     !  Add attributes to each dataset, until after converting to dense storage 
-     DO u = 0, (max_compact * 2) - 1
-
-        !  Create attribute name 
-        WRITE(chr2,'(I2.2)') u
-        attrname = 'attr '//chr2
-
-        !  Alternate between creating "small" & "big" attributes 
-
-        IF(MOD(u+1,2).EQ.0)THEN
-           !  Create "small" attribute on first dataset 
-
-           CALL h5acreate_f(dataset, attrname, attr_tid, sid, attr, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
-           CALL check("h5acreate_f",error,total_error)
-
-           !  Write data into the attribute 
-           attr_integer_data(1) = u + 1
-           data_dims(1) = 1
-           CALL h5awrite_f(attr, attr_tid, attr_integer_data, data_dims, error)
-           CALL check("h5awrite_f",error,total_error)
-        ELSE
-           !  Create "big" attribute on first dataset 
-
-           CALL h5acreate_f(dataset, attrname, attr_tid, big_sid, attr, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
-           CALL check("h5acreate_f",error,total_error)
-
-           !  Write data into the attribute 
-
-           data_dims(1) = 1
-           attr_integer_data(1) = u + 1
-           CALL h5awrite_f(attr, attr_tid, attr_integer_data, data_dims, error)
-           CALL check("h5awrite_f",error,total_error)
-
-        ENDIF
-
-        !  Close attribute 
-        CALL h5aclose_f(attr, error)
-        CALL check("h5aclose_f",error,total_error)
-
-        !  Alternate between creating "small" & "big" attributes 
-        IF(MOD(u+1,2).EQ.0)THEN
-
-           !   Create "small" attribute on second dataset 
-
-           CALL h5acreate_f(dataset2, attrname, attr_tid, sid, attr, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
-           CALL check("h5acreate_f",error,total_error)
-
-           !  Write data into the attribute 
-
-           attr_integer_data(1) = u + 1
-           data_dims(1) = 1
-           CALL h5awrite_f(attr, attr_tid, attr_integer_data, data_dims, error)
-           CALL check("h5awrite_f",error,total_error)
-        ELSE
-
-           !  Create "big" attribute on second dataset 
-
-           CALL h5acreate_f(dataset2, attrname, attr_tid, big_sid, attr, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
-           CALL check("h5acreate_f",error,total_error)
-
-!  Write data into the attribute 
-
-
-           attr_integer_data(1) = u + 1
-           data_dims(1) = 1
-!           CALL h5awrite_f(attr,  attr_tid, attr_integer_data, data_dims, error)
-!           CALL check("h5awrite_f",error,total_error)
-
-
-!  Check refcount for attribute 
-        ENDIF
-        !  Close attribute 
-        CALL h5aclose_f(attr, error)
-        CALL check("h5aclose_f",error,total_error)
-
-        !  Create new attribute name 
-
-        WRITE(chr2,'(I2.2)') u
-        attrname2 = 'new attr '//chr2
-
-
-        !  Change second dataset's attribute's name 
-
-        CALL H5Arename_by_name_f(fid, DSET2_NAME, attrname, attrname2, error, lapl_id=H5P_DEFAULT_F)
-        CALL check("H5Arename_by_name_f",error,total_error)
-
-        !  Check refcount on attributes now 
-
-        !  Check refcount on renamed attribute 
-
-        CALL H5Aopen_f(dataset2, attrname2, attr, error, aapl_id=H5P_DEFAULT_F)
-        CALL check("H5Aopen_f",error,total_error)
-
-        !  Close attribute 
-        CALL h5aclose_f(attr, error)
-        CALL check("h5aclose_f",error,total_error)
-
-        !  Check refcount on original attribute 
-        CALL H5Aopen_f(dataset, attrname, attr, error)
-        CALL check("H5Aopen",error,total_error)
-
-        !  Close attribute 
-        CALL h5aclose_f(attr, error)
-        CALL check("h5aclose_f",error,total_error)
-
-
-        !  Change second dataset's attribute's name back to original 
-
-        CALL H5Arename_by_name_f(fid, DSET2_NAME, attrname2, attrname, error)
-        CALL check("H5Arename_by_name_f",error,total_error)
-
-        !  Check refcount on attributes now 
-
-        !  Check refcount on renamed attribute 
-        CALL H5Aopen_f(dataset2, attrname, attr, error)
-        CALL check("H5Aopen",error,total_error)
-
-        !  Close attribute 
-        CALL h5aclose_f(attr, error)
-        CALL check("h5aclose_f",error,total_error)
-
-        !  Check refcount on original attribute 
-
-        !  Check refcount on renamed attribute 
-        CALL H5Aopen_f(dataset, attrname, attr, error)
-        CALL check("H5Aopen",error,total_error)
-
-        !  Close attribute 
-        CALL h5aclose_f(attr, error)
-        CALL check("h5aclose_f",error,total_error)
-
-     ENDDO
-
-     !  Close attribute's datatype 
-     CALL h5tclose_f(attr_tid, error)
-     CALL check("h5tclose_f",error,total_error)
-
-     !  Close attribute's datatype 
-     CALL h5dclose_f(dataset, error)
-     CALL check("h5dclose_f",error,total_error)
-     CALL h5dclose_f(dataset2, error)
-     CALL check("h5dclose_f",error,total_error)
-
-
-     !  Unlink datasets with attributes 
-     CALL H5Ldelete_f(fid, DSET1_NAME, error, H5P_DEFAULT_F)
-     CALL check("HLdelete",error,total_error)
-     CALL H5Ldelete_f(fid, DSET2_NAME, error)
-     CALL check("HLdelete",error,total_error)
-
-     ! Unlink committed datatype 
-     IF(test_shared == 2)THEN
-        CALL H5Ldelete_f(fid, TYPE1_NAME, error)
-        CALL check("HLdelete_f",error,total_error)
-     ENDIF
-
-     !  Close file 
-     CALL h5fclose_f(fid, error)
-     CALL check("h5fclose_f",error,total_error)
-
-     !  Check size of file 
-     !filesize = h5_get_file_size(FILENAME);
-     !VERIFY(filesize, empty_filesize, "h5_get_file_size");
-  ENDDO
-
-  !  Close dataspaces 
-  CALL h5sclose_f(sid, error)
-  CALL check("h5sclose_f",error,total_error)
-  CALL h5sclose_f(big_sid, error)
-  CALL check("h5sclose_f",error,total_error)
-
-END SUBROUTINE test_attr_shared_rename
-
-
-SUBROUTINE test_attr_delete_by_idx(new_format, fcpl, fapl, total_error)
-
-!***************************************************************
-!**
-!**  test_attr_delete_by_idx(): Test basic H5A (attribute) code.
-!**      Tests deleting attribute by index
-!**
-!***************************************************************
-
-  USE HDF5
-  USE TH5_MISC
-
-  IMPLICIT NONE
-
-  LOGICAL, INTENT(IN) :: new_format
-  INTEGER(HID_T), INTENT(IN) :: fcpl
-  INTEGER(HID_T), INTENT(IN) :: fapl
-  INTEGER, INTENT(INOUT) :: total_error
-  CHARACTER(LEN=8) :: FileName = "tattr.h5"
-  INTEGER(HID_T) :: fid !  HDF5 File ID			
-  INTEGER(HID_T) :: dcpl !  Dataset creation property list ID 
-  INTEGER(HID_T) :: sid !  Dataspace ID			
-
-  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
-  CHARACTER(LEN=8) :: DSET2_NAME = "Dataset2"
-  CHARACTER(LEN=8) :: DSET3_NAME = "Dataset3"
-  INTEGER, PARAMETER :: NUM_DSETS = 3
-
-  INTEGER :: curr_dset
-
-  INTEGER(HID_T) :: dset1, dset2, dset3
-  INTEGER(HID_T) :: my_dataset
-
-  INTEGER :: error
-
-  INTEGER(HID_T) :: attr        !String Attribute identifier
-  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
-
-  LOGICAL :: f_corder_valid ! Indicates whether the the creation order data is valid for this attribute
-  INTEGER :: corder ! Is a positive integer containing the creation order of the attribute
-  INTEGER :: cset ! Indicates the character set used for the attribute’s name
-  INTEGER(HSIZE_T) :: data_size   ! indicates the size, in the number of characters
-  LOGICAL, DIMENSION(1:2) :: use_index = (/.FALSE.,.TRUE./)
-
-  INTEGER :: max_compact ! Maximum # of links to store in group compactly
-  INTEGER :: min_dense   ! Minimum # of links to store in group "densely"
-
-  CHARACTER(LEN=2) :: chr2
-
-  INTEGER :: i
-
-  INTEGER, DIMENSION(1) ::  attr_integer_data
-  CHARACTER(LEN=7) :: attrname
-
-  INTEGER(SIZE_T) :: size
-  CHARACTER(LEN=8) :: tmpname
-
-  INTEGER :: idx_type
-  INTEGER :: order
-  INTEGER :: u     !  Local index variable 
-  INTEGER :: Input1
-  INTEGER(HSIZE_T) :: hzero = 0_HSIZE_T
-  INTEGER :: minusone = -1
-
-  data_dims = 0
-
-  !  Create dataspace for dataset & attributes 
-  CALL h5screate_f(H5S_SCALAR_F, sid, error)
-  CALL check("h5screate_f",error,total_error)
-
-  !     Create dataset creation property list 
-  CALL H5Pcreate_f(H5P_DATASET_CREATE_F,dcpl,error)
-  CALL check("h5Pcreate_f",error,total_error)
-
-  !  Query the attribute creation properties 
-  CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
-  CALL check("H5Pget_attr_phase_change_f",error,total_error)
-
-
-  ! Loop over operating on different indices on link fields 
-  DO idx_type = H5_INDEX_NAME_F, H5_INDEX_CRT_ORDER_F
-
-     !  Loop over operating in different orders 
-     DO order = H5_ITER_INC_F, H5_ITER_DEC_F
-
-        !  Loop over using index for creation order value 
-        DO i = 1, 2
-
-           !  Create file 
-           CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl)
-           CALL check("h5fcreate_f",error,total_error)
-
-           !   Set attribute creation order tracking & indexing for object 
-           IF(new_format)THEN
-
-              IF(use_index(i))THEN
-                 Input1 = H5P_CRT_ORDER_INDEXED_F
-              ELSE
-                 Input1 = 0
-              ENDIF
-
-              CALL H5Pset_attr_creation_order_f(dcpl, IOR(H5P_CRT_ORDER_TRACKED_F, Input1), error)
-              CALL check("H5Pset_attr_creation_order",error,total_error)
-
-           ENDIF
-
-           !  Create datasets 
-
-           CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dset1, error, dcpl )
-           CALL check("h5dcreate_f2",error,total_error)
-
-           CALL h5dcreate_f(fid, DSET2_NAME, H5T_NATIVE_CHARACTER, sid, dset2, error, dcpl )
-           CALL check("h5dcreate_f3",error,total_error)
-
-           CALL h5dcreate_f(fid, DSET3_NAME, H5T_NATIVE_CHARACTER, sid, dset3, error, dcpl )
-           CALL check("h5dcreate_f4",error,total_error)
-
-           !    Work on all the datasets 
-
-           DO curr_dset = 0,NUM_DSETS-1
-              SELECT CASE (curr_dset)
-              CASE (0)
-                 my_dataset = dset1
-              CASE (1)
-                 my_dataset = dset2
-              CASE (2)
-                 my_dataset = dset3
-                 !     CASE DEFAULT
-                 !        CALL HDassert(0.AND."Toomanydatasets!")
-              END SELECT
-
-
-              !  Check for deleting non-existant attribute 
-!EP              CALL H5Adelete_by_idx_f(my_dataset, '.', idx_type, order, 0_HSIZE_T,error, lapl_id=H5P_DEFAULT_F)
-              CALL H5Adelete_by_idx_f(my_dataset, '.', idx_type, order, hzero,error, lapl_id=H5P_DEFAULT_F)
-              CALL VERIFY("H5Adelete_by_idx_f",error,minusone,total_error)
-
-              !     Create attributes, up to limit of compact form 
-              DO u = 0, max_compact - 1
-                 !  Create attribute 
-                 WRITE(chr2,'(I2.2)') u
-                 attrname = 'attr '//chr2
-
-                 CALL h5acreate_f(my_dataset, attrname, H5T_NATIVE_INTEGER, sid, attr, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
-                 CALL check("h5acreate_f",error,total_error)
-
-                 !  Write data into the attribute 
-                 attr_integer_data(1) = u
-                 data_dims(1) = 1
-                 CALL h5awrite_f(attr, H5T_NATIVE_INTEGER, attr_integer_data, data_dims, error)
-                 CALL check("h5awrite_f",error,total_error)
-
-                 !  Close attribute 
-                 CALL h5aclose_f(attr, error)
-                 CALL check("h5aclose_f",error,total_error)
-
-                 !  Verify information for new attribute 
-                 CALL attr_info_by_idx_check(my_dataset, attrname, INT(u,HSIZE_T), use_index(i), total_error )
-
-              ENDDO
-
-              ! Check for out of bound deletions 
-              CALL H5Adelete_by_idx_f(my_dataset, ".", idx_type, order, INT(u,HSIZE_T), error, lapl_id=H5P_DEFAULT_F)
-              CALL VERIFY("H5Adelete_by_idx_f",error,minusone,total_error)
-
-           ENDDO
-
-
-           DO curr_dset = 0, NUM_DSETS-1
-              SELECT CASE (curr_dset)
-              CASE (0)
-                 my_dataset = dset1
-              CASE (1)
-                 my_dataset = dset2
-              CASE (2)
-                 my_dataset = dset3
-                 !     CASE DEFAULT
-                 !        CALL HDassert(0.AND."Toomanydatasets!")
-              END SELECT
-
-              !  Delete attributes from compact storage 
-
-              DO u = 0, max_compact - 2
-
-                 !  Delete first attribute in appropriate order 
-
-
-!EP                 CALL H5Adelete_by_idx_f(my_dataset, ".", idx_type, order, 0_HSIZE_T, error)
-                 CALL H5Adelete_by_idx_f(my_dataset, ".", idx_type, order, hzero, error)
-                 CALL check("H5Adelete_by_idx_f",error,total_error)
-
-
-                 !  Verify the attribute information for first attribute in appropriate order 
-                 ! HDmemset(&ainfo, 0, sizeof(ainfo));
-
-!EP                 CALL h5aget_info_by_idx_f(my_dataset, ".", idx_type, order, 0_HSIZE_T, &
-                 CALL h5aget_info_by_idx_f(my_dataset, ".", idx_type, order, hzero, &
-                      f_corder_valid, corder, cset, data_size, error)
-
-                 IF(new_format)THEN
-                    IF(order.EQ.H5_ITER_INC_F)THEN
-                       CALL VERIFY("H5Aget_info_by_idx_f",corder,u + 1,total_error)
-                    ENDIF
-                 ELSE
-                    CALL VERIFY("H5Aget_info_by_idx_f",corder, max_compact-(u + 2),total_error)
-                 ENDIF
-
-                   !  Verify the name for first attribute in appropriate order 
-
-                 size = 7 ! *CHECK* IF NOT THE SAME SIZE
-                 CALL h5aget_name_by_idx_f(my_dataset, ".", idx_type, order,INT(0,hsize_t), &
-                      tmpname, error, lapl_id=H5P_DEFAULT_F, size=size)
-                 CALL check('h5aget_name_by_idx_f',error,total_error)
-                 IF(order .EQ. H5_ITER_INC_F)THEN
-                    WRITE(chr2,'(I2.2)') u + 1
-                    attrname = 'attr '//chr2
-                 ELSE
-                    WRITE(chr2,'(I2.2)') max_compact - (u + 2)
-                    attrname = 'attr '//chr2
-                 ENDIF
-                 IF(TRIM(attrname).NE.TRIM(tmpname)) error = -1
-                 CALL VERIFY("h5aget_name_by_idx_f",error,0,total_error)
-              ENDDO
-
-              !  Delete last attribute 
-
-!EP              CALL H5Adelete_by_idx_f(my_dataset, ".", idx_type, order, 0_HSIZE_T, error)
-              CALL H5Adelete_by_idx_f(my_dataset, ".", idx_type, order, hzero, error)
-              CALL check("H5Adelete_by_idx_f",error,total_error)
-
-           ENDDO
-
-!    Work on all the datasets 
-
-           DO curr_dset = 0,NUM_DSETS-1
-              SELECT CASE (curr_dset)
-              CASE (0)
-                 my_dataset = dset1
-              CASE (1)
-                 my_dataset = dset2
-              CASE (2)
-                 my_dataset = dset3
-                 !     CASE DEFAULT
-                 !        CALL HDassert(0.AND."Toomanydatasets!")
-              END SELECT
-
-              !  Create more attributes, to push into dense form 
-
-              DO u = 0, (max_compact * 2) - 1
-
-                 !  Create attribute 
-                 WRITE(chr2,'(I2.2)') u
-                 attrname = 'attr '//chr2
-
-                 CALL h5acreate_f(my_dataset, attrname, H5T_NATIVE_INTEGER, sid, attr, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
-                 CALL check("h5acreate_f",error,total_error)
-
-
-                 !  Write data into the attribute 
-                 attr_integer_data(1) = u
-                 data_dims(1) = 1
-                 CALL h5awrite_f(attr, H5T_NATIVE_INTEGER, attr_integer_data, data_dims, error)
-                 CALL check("h5awrite_f",error,total_error)
-
-                 !  Close attribute 
-                 CALL h5aclose_f(attr, error)
-                 CALL check("h5aclose_f",error,total_error)
-
-
-              ENDDO
-              !  Check for out of bound deletion 
-              CALL H5Adelete_by_idx_f(my_dataset, ".", idx_type, order, INT(u,HSIZE_T), error)
-              CALL VERIFY("H5Adelete_by_idx_f",error,minusone,total_error)
-           ENDDO
-
-           !  Work on all the datasets 
-
-           DO curr_dset = 0,NUM_DSETS-1
-              SELECT CASE (curr_dset)
-              CASE (0)
-                 my_dataset = dset1
-              CASE (1)
-                 my_dataset = dset2
-              CASE (2)
-                 my_dataset = dset3
-              END SELECT
-
-              !  Delete attributes from dense storage 
-
-              DO u = 0, (max_compact * 2) - 1 - 1
-
-                 !  Delete first attribute in appropriate order 
-
-                 CALL H5Adelete_by_idx_f(my_dataset, ".", idx_type, order, INT(0,HSIZE_T), error)
-                 CALL check("H5Adelete_by_idx_f",error,total_error)
-                 !  Verify the attribute information for first attribute in appropriate order 
-
-                 CALL h5aget_info_by_idx_f(my_dataset, ".", idx_type, order, INT(0,HSIZE_T), &
-                      f_corder_valid, corder, cset, data_size, error)
-                 IF(new_format)THEN
-                    IF(order.EQ.H5_ITER_INC_F)THEN
-                       CALL VERIFY("H5Aget_info_by_idx_f",corder,u + 1,total_error)
-                    ENDIF
-                 ELSE
-                    CALL VERIFY("H5Aget_info_by_idx_f",corder, ((max_compact * 2) - (u + 2)), total_error)
-                 ENDIF
-
-                 !  Verify the name for first attribute in appropriate order 
-                 ! HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE);
-
-                 size = 7 ! *CHECK* if not the correct size
-                 CALL h5aget_name_by_idx_f(my_dataset, ".", idx_type, order,INT(0,hsize_t), &
-                      tmpname, error, size)
-
-                 IF(order .EQ. H5_ITER_INC_F)THEN
-                    WRITE(chr2,'(I2.2)') u + 1
-                    attrname = 'attr '//chr2
-                 ELSE
-                    WRITE(chr2,'(I2.2)') max_compact * 2 - (u + 2)
-                    attrname = 'attr '//chr2
-                 ENDIF
-                 IF(TRIM(attrname).NE.TRIM(tmpname)) error = -1
-                 CALL VERIFY("h5aget_name_by_idx_f",error,0,total_error)
-
-
-              ENDDO
-              !  Delete last attribute 
-
-              CALL H5Adelete_by_idx_f(my_dataset, ".", idx_type, order, INT(0,HSIZE_T), error, lapl_id=H5P_DEFAULT_F)
-              CALL check("H5Adelete_by_idx_f",error,total_error)
-
-              ! Check for deletion on empty attribute storage again 
-              CALL H5Adelete_by_idx_f(my_dataset, ".", idx_type, order, INT(0,HSIZE_T), error)
-              CALL VERIFY("H5Adelete_by_idx_f",error,minusone,total_error)
-           ENDDO
-
-           !   Close Datasets 
-           CALL h5dclose_f(dset1, error)
-           CALL check("h5dclose_f",error,total_error)
-           CALL h5dclose_f(dset2, error)
-           CALL check("h5dclose_f",error,total_error)
-           CALL h5dclose_f(dset3, error)
-           CALL check("h5dclose_f",error,total_error)
-
-           !    Close file 
-           CALL h5fclose_f(fid, error)
-           CALL check("h5fclose_f",error,total_error)
-        ENDDO
-     ENDDO
-  ENDDO
-
-  !  Close property list 
-  CALL h5pclose_f(dcpl,error)
-  CALL check("h5pclose_f", error, total_error)
-
-  !  Close dataspace 
-  CALL h5sclose_f(sid, error)
-  CALL check("h5sclose_f",error,total_error)
-
-END SUBROUTINE test_attr_delete_by_idx
-
-SUBROUTINE test_attr_shared_delete(fcpl, fapl, total_error)
-
-!***************************************************************
-!**
-!**  test_attr_shared_delete(): Test basic H5A (attribute) code.
-!**      Tests deleting shared attributes in "compact" & "dense" storage
-!**
-!***************************************************************
-
-  USE HDF5
-  USE TH5_MISC
-
-  IMPLICIT NONE
-
-  INTEGER(HID_T), INTENT(IN) :: fcpl
-  INTEGER(HID_T), INTENT(IN) :: fapl
-  INTEGER, INTENT(INOUT) :: total_error
-  CHARACTER(LEN=8) :: FileName = "tattr.h5"
-  INTEGER(HID_T) :: fid
-  INTEGER(HID_T) :: dcpl
-  INTEGER(HID_T) :: sid, big_sid
-
-  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
-  CHARACTER(LEN=8) :: DSET2_NAME = "Dataset2"
-
-
-  INTEGER(HID_T) :: dataset, dataset2
-
-  INTEGER :: error
-
-  INTEGER(HID_T) :: attr        !String Attribute identifier
-  INTEGER(HID_T) :: attr_tid
-  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
-
-
-  INTEGER :: max_compact ! Maximum # of links to store in group compactly
-  INTEGER :: min_dense   ! Minimum # of links to store in group "densely"
-
-  CHARACTER(LEN=2) :: chr2
-
-  INTEGER, DIMENSION(1) ::  attr_integer_data
-  CHARACTER(LEN=7) :: attrname
-
-  INTEGER :: u
-  INTEGER(HID_T) :: my_fcpl
-
-  CHARACTER(LEN=5), PARAMETER :: TYPE1_NAME = "/Type"
-
-  INTEGER :: test_shared
-  INTEGER(HSIZE_T), DIMENSION(1) :: adims2 = (/1/) ! Attribute dimension
-  INTEGER     ::   arank = 1                      ! Attribure rank
-
-  !  Output message about test being performed 
-
-  !  Initialize "big" attribute DATA 
-  !     Create dataspace for dataset 
-  CALL h5screate_f(H5S_SCALAR_F, sid, error)
-  CALL check("h5screate_f",error,total_error)
-
-  ! Create "big" dataspace for "large" attributes 
-
-  CALL h5screate_simple_f(arank, adims2, big_sid, error)
-  CALL check("h5screate_simple_f",error,total_error)
-
-  !  Loop over type of shared components 
-
-  DO test_shared = 0, 2
-
-     !  Make copy of file creation property list 
-
-     CALL H5Pcopy_f(fcpl, my_fcpl, error)
-     CALL check("H5Pcopy",error,total_error)
-
-     !  Set up datatype for attributes 
-
-     CALL H5Tcopy_f(H5T_NATIVE_INTEGER, attr_tid, error)
-     CALL check("H5Tcopy",error,total_error)
-
-     !  Special setup for each type of shared components 
-     IF( test_shared .EQ. 0) THEN
-        !  Make attributes > 500 bytes shared 
-        CALL H5Pset_shared_mesg_nindexes_f(my_fcpl,1,error)
-        CALL check("H5Pset_shared_mesg_nindexes_f",error, total_error)
-        CALL H5Pset_shared_mesg_index_f(my_fcpl, 0, H5O_SHMESG_ATTR_FLAG_F, 500,error)
-        CALL check(" H5Pset_shared_mesg_index_f",error, total_error)
-
-     ELSE
-        !  Set up copy of file creation property list 
-        CALL H5Pset_shared_mesg_nindexes_f(my_fcpl,3,error)
-        !  Make attributes > 500 bytes shared 
-        CALL H5Pset_shared_mesg_index_f(my_fcpl, 0, H5O_SHMESG_ATTR_FLAG_F, 500,error)
-        !  Make datatypes & dataspaces > 1 byte shared (i.e. all of them :-) 
-        CALL H5Pset_shared_mesg_index_f(my_fcpl, 1, H5O_SHMESG_DTYPE_FLAG_F, 1,error)
-        CALL H5Pset_shared_mesg_index_f(my_fcpl, 2,  H5O_SHMESG_SDSPACE_FLAG_F, 1,error)
-     ENDIF
-
-     !  Create file 
-     CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, my_fcpl, fapl)
-     CALL check("h5fcreate_f",error,total_error)
-
-     !  Close FCPL copy 
-     CALL h5pclose_f(my_fcpl, error)
-     CALL check("h5pclose_f", error, total_error)
-     !  Close file 
-     CALL h5fclose_f(fid, error)
-     CALL check("h5fclose_f",error,total_error)
-
-     !  Re-open file 
-     CALL h5fopen_f(FileName, H5F_ACC_RDWR_F, fid, error,fapl)
-     CALL check("h5open_f",error,total_error)
-
-     !  Commit datatype to file 
-
-     IF(test_shared.EQ.2) THEN
-        CALL H5Tcommit_f(fid, TYPE1_NAME, attr_tid, error, H5P_DEFAULT_F, H5P_DEFAULT_F, H5P_DEFAULT_F)
-        CALL check("H5Tcommit",error,total_error)
-     ENDIF
-
-     !  Set up to query the object creation properties 
-     CALL H5Pcreate_f(H5P_DATASET_CREATE_F,dcpl,error)
-     CALL check("h5Pcreate_f",error,total_error)
-
-     !  Create datasets 
-
-     CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dataset, error, dcpl_id=dcpl )
-     CALL check("h5dcreate_f",error,total_error)
-
-     CALL h5dcreate_f(fid, DSET2_NAME, H5T_NATIVE_CHARACTER, sid, dataset2, error, dcpl_id=dcpl )
-     CALL check("h5dcreate_f",error,total_error)
-
-     !  Retrieve limits for compact/dense attribute storage 
-     CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
-     CALL check("H5Pget_attr_phase_change_f",error,total_error)
-
-     !  Close property list 
-     CALL h5pclose_f(dcpl,error)
-     CALL check("h5pclose_f", error, total_error)
-
-     !  Add attributes to each dataset, until after converting to dense storage 
-
-     DO u = 0, (max_compact * 2) - 1
-
-        !  Create attribute name 
-        WRITE(chr2,'(I2.2)') u
-        attrname = 'attr '//chr2
-
-        !  Alternate between creating "small" & "big" attributes 
-
-        IF(MOD(u+1,2).EQ.0)THEN
-           !  Create "small" attribute on first dataset 
-
-           CALL h5acreate_f(dataset, attrname, attr_tid, sid, attr, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
-           CALL check("h5acreate_f",error,total_error)
-
-           !  Write data into the attribute 
-           attr_integer_data(1) = u + 1
-           data_dims(1) = 1
-           CALL h5awrite_f(attr, attr_tid, attr_integer_data, data_dims, error)
-           CALL check("h5awrite_f",error,total_error)
-        ELSE
-           !  Create "big" attribute on first dataset 
-
-           CALL h5acreate_f(dataset, attrname, attr_tid, big_sid, attr, error)
-           CALL check("h5acreate_f",error,total_error)
-
-           !  Write data into the attribute 
-
-           attr_integer_data(1) = u + 1
-           data_dims(1) = 1
-           CALL h5awrite_f(attr,  attr_tid, attr_integer_data, data_dims, error)
-           CALL check("h5awrite_f",error,total_error)
-
-        ENDIF
-
-        !  Close attribute 
-        CALL h5aclose_f(attr, error)
-        CALL check("h5aclose_f",error,total_error)
-
-        !  Alternate between creating "small" & "big" attributes 
-        IF(MOD(u+1,2).EQ.0)THEN
-
-           !   Create "small" attribute on second dataset 
-
-           CALL h5acreate_f(dataset2, attrname, attr_tid, sid, attr, error)
-           CALL check("h5acreate_f",error,total_error)
-
-           !  Write data into the attribute 
-           attr_integer_data(1) = u + 1
-           data_dims(1) = 1
-           CALL h5awrite_f(attr, attr_tid, attr_integer_data, data_dims, error)
-           CALL check("h5awrite_f",error,total_error)
-        ELSE
-
-           !  Create "big" attribute on second dataset 
-
-           CALL h5acreate_f(dataset2, attrname, attr_tid, big_sid, attr, error, acpl_id=H5P_DEFAULT_F, aapl_id=H5P_DEFAULT_F)
-           CALL check("h5acreate_f",error,total_error)
-
-!  Write data into the attribute 
-
-
-           attr_integer_data(1) = u + 1
-           data_dims(1) = 1
-           CALL h5awrite_f(attr,  attr_tid, attr_integer_data, data_dims, error)
-           CALL check("h5awrite_f",error,total_error)
-
-        ENDIF
-        !  Close attribute 
-        CALL h5aclose_f(attr, error)
-        CALL check("h5aclose_f",error,total_error)
-
-     ENDDO
-
-     !  Delete attributes from second dataset 
-
-     DO u = 0, max_compact*2-1
-
-        !  Create attribute name 
-        WRITE(chr2,'(I2.2)') u
-        attrname = 'attr '//chr2
-
-        !  Delete second dataset's attribute 
-        CALL H5Adelete_by_name_f(fid, DSET2_NAME, attrname,error,lapl_id=H5P_DEFAULT_F)
-        CALL check("H5Adelete_by_name", error, total_error)
-
-        CALL h5aopen_f(dataset, attrname, attr, error, aapl_id=H5P_DEFAULT_F)
-        CALL check("h5aopen_f",error,total_error)
-
-
-        !  Close attribute 
-        CALL h5aclose_f(attr, error)
-        CALL check("h5aclose_f",error,total_error)
-     ENDDO
-
-     !  Close attribute's datatype 
-
-     CALL h5tclose_f(attr_tid, error)
-     CALL check("h5tclose_f",error,total_error)
-
-     !  Close Datasets 
-
-     CALL h5dclose_f(dataset, error)
-     CALL check("h5dclose_f",error,total_error)
-     CALL h5dclose_f(dataset2, error)
-     CALL check("h5dclose_f",error,total_error)
-
-     !  Unlink datasets WITH attributes 
-
-     CALL h5ldelete_f(fid, DSET1_NAME, error, H5P_DEFAULT_F)
-     CALL check("H5Ldelete_f", error, total_error)
-     CALL h5ldelete_f(fid, DSET2_NAME, error)
-     CALL check("H5Ldelete_f", error, total_error)
-
-     !  Unlink committed datatype 
-
-     IF( test_shared == 2) THEN
-        CALL h5ldelete_f(fid, TYPE1_NAME, error)
-        CALL check("H5Ldelete_f", error, total_error)
-     ENDIF
-
-
-     !  Close file 
-     CALL h5fclose_f(fid, error)
-     CALL check("h5fclose_f",error,total_error)
-
-  ENDDO
-
-  !  Close dataspaces 
-  CALL h5sclose_f(sid, error)
-  CALL check("h5sclose_f",error,total_error)
-  CALL h5sclose_f(big_sid, error)
-  CALL check("h5sclose_f",error,total_error)
-
-END SUBROUTINE test_attr_shared_delete
-
-
-
-SUBROUTINE test_attr_dense_open( fcpl, fapl, total_error)
-
-!***************************************************************
-!**
-!**  test_attr_dense_open(): Test basic H5A (attribute) code.
-!**      Tests opening attributes in "dense" storage
-!**
-!***************************************************************
-
-  USE HDF5
-  USE TH5_MISC
-
-  IMPLICIT NONE
-
-  INTEGER(HID_T), INTENT(IN) :: fcpl
-  INTEGER(HID_T), INTENT(IN) :: fapl
-  INTEGER, INTENT(INOUT) :: total_error
-  CHARACTER(LEN=8) :: FileName = "tattr.h5"
-  INTEGER(HID_T) :: fid
-  INTEGER(HID_T) :: dcpl
-  INTEGER(HID_T) :: sid
-
-  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
-
-  INTEGER :: error
-  INTEGER(HID_T) :: attr        !String Attribute identifier
-  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
-
-
-  INTEGER :: max_compact ! Maximum # of links to store in group compactly
-  INTEGER :: min_dense   ! Minimum # of links to store in group "densely"
-
-  CHARACTER(LEN=2) :: chr2
-
-
-  CHARACTER(LEN=7) :: attrname
-
-  INTEGER(HID_T) :: dataset
-  INTEGER :: u
-
-  data_dims = 0
-
-
-  !  Create file 
-
-  CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl)
-  CALL check("h5fcreate_f",error,total_error)
-
-  !  Close file 
-  CALL h5fclose_f(fid, error)
-  CALL check("h5fclose_f",error,total_error)
-
-
-
-  !  Re-open file 
-  CALL h5fopen_f(FileName, H5F_ACC_RDWR_F, fid, error, fapl)
-  CALL check("h5open_f",error,total_error)
-
-  !  Create dataspace for dataset 
-  CALL h5screate_f(H5S_SCALAR_F, sid, error)
-  CALL check("h5screate_f",error,total_error)
-
-  !  Query the group creation properties 
-  CALL H5Pcreate_f(H5P_DATASET_CREATE_F,dcpl,error)
-  CALL check("h5Pcreate_f",error,total_error)
-
-  !  Enable creation order tracking on attributes, so creation order tests work 
-  CALL H5Pset_attr_creation_order_f(dcpl, H5P_CRT_ORDER_TRACKED_F, error)
-  CALL check("H5Pset_attr_creation_order",error,total_error)
-
-  !  Create a dataset 
-
-  CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dataset, error, &
-       lcpl_id=H5P_DEFAULT_F, dcpl_id=dcpl, dapl_id=H5P_DEFAULT_F)
-  CALL check("h5dcreate_f",error,total_error)
-
-  !  Retrieve limits for compact/dense attribute storage 
-  CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
-  CALL check("H5Pget_attr_phase_change_f",error,total_error)
-
-  !  Close property list 
-  CALL h5pclose_f(dcpl, error)
-  CALL check("h5pclose_f",error,total_error)
-
-  !  Add attributes, until just before converting to dense storage 
-
-  DO u = 0, max_compact - 1
-     !  Create attribute 
-     WRITE(chr2,'(I2.2)') u
-     attrname = 'attr '//chr2
-
-     CALL h5acreate_f(dataset, attrname, H5T_NATIVE_INTEGER, sid, attr, error, aapl_id=H5P_DEFAULT_F)
-     CALL check("h5acreate_f",error,total_error)
-
-     !  Write data into the attribute 
-
-     data_dims(1) = 1
-     CALL h5awrite_f(attr, H5T_NATIVE_INTEGER, u, data_dims, error)
-     CALL check("h5awrite_f",error,total_error)
-
-     !  Close attribute 
-     CALL h5aclose_f(attr, error)
-     CALL check("h5aclose_f",error,total_error)
-
-     !  Verify attributes written so far 
-     CALL test_attr_dense_verify(dataset, u, total_error)
-  ENDDO
-!
-!     Add one more attribute, to push into "dense" storage 
-!     Create attribute 
-
-  WRITE(chr2,'(I2.2)') u
-  attrname = 'attr '//chr2
-
-  CALL h5acreate_f(dataset, attrname, H5T_NATIVE_INTEGER, sid, attr, error, aapl_id=H5P_DEFAULT_F)
-  CALL check("h5acreate_f",error,total_error)
-
-  !  Write data into the attribute 
-  data_dims(1) = 1
-  CALL h5awrite_f(attr, H5T_NATIVE_INTEGER, u, data_dims, error)
-  CALL check("h5awrite_f",error,total_error)
-
-  !  Close attribute 
-  CALL h5aclose_f(attr, error)
-  CALL check("h5aclose_f",error,total_error)
-
-  !  Close dataspace 
-  CALL h5sclose_f(sid, error)
-  CALL check("h5sclose_f",error,total_error)
-
-  !  Verify all the attributes written 
-  !  ret = test_attr_dense_verify(dataset, (u + 1));
-  !  CHECK(ret, FAIL, "test_attr_dense_verify");
-
-  !  CLOSE Dataset 
-  CALL h5dclose_f(dataset, error)
-  CALL check("h5dclose_f",error,total_error)
-
-  !  Unlink dataset with attributes 
-  CALL h5ldelete_f(fid, DSET1_NAME, error, H5P_DEFAULT_F)
-  CALL check("H5Ldelete_f", error, total_error)
-
-  !  Close file 
-  CALL h5fclose_f(fid, error)
-  CALL check("h5fclose_f",error,total_error)
-
-  !  Check size of file 
-  !  filesize = h5_get_file_size(FILENAME);
-  !  VERIFY(filesize, empty_filesize, "h5_get_file_size")
-
-END SUBROUTINE test_attr_dense_open
-
-!***************************************************************
-!**
-!**  test_attr_dense_verify(): Test basic H5A (attribute) code.
-!**      Verify attributes on object
-!**
-!***************************************************************
-
-SUBROUTINE test_attr_dense_verify(loc_id, max_attr, total_error)
-
-  USE HDF5
-  USE TH5_MISC
-
-  IMPLICIT NONE
-
-  INTEGER(HID_T), INTENT(IN) :: loc_id
-  INTEGER, INTENT(IN) :: max_attr
-  INTEGER, INTENT(INOUT) :: total_error
-
-  INTEGER(SIZE_T), PARAMETER :: ATTR_NAME_LEN = 8 ! FIX, why if 7 does not work?
-
-  INTEGER :: u
-  CHARACTER(LEN=2) :: chr2
-  CHARACTER(LEN=ATTR_NAME_LEN) :: attrname
-  CHARACTER(LEN=ATTR_NAME_LEN) :: check_name
-  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
-
-  INTEGER(HID_T) :: attr        !String Attribute identifier
-  INTEGER :: error
-  INTEGER :: value
-
-  data_dims = 0
-
-
-    !  Retrieve the current # of reported errors 
-    ! old_nerrs = GetTestNumErrs();
-
-    !  Re-open all the attributes by name and verify the data 
-
-  DO u = 0, max_attr -1
-
-     !  Open attribute 
-     WRITE(chr2,'(I2.2)') u
-     attrname = 'attr '//chr2
-
-     CALL h5aopen_f(loc_id, attrname, attr, error)
-     CALL check("h5aopen_f",error,total_error)
-
-     !  Read data from the attribute 
-
-!     value = 103
-     data_dims(1) = 1
-     CALL h5aread_f(attr, H5T_NATIVE_INTEGER, value, data_dims, error)
-
-     CALL CHECK("H5Aread_F", error, total_error)
-     CALL VERIFY("H5Aread_F", value, u, total_error)
-
-     !  Close attribute 
-     CALL h5aclose_f(attr, error)
-     CALL check("h5aclose_f",error,total_error)
-  ENDDO
-
-  !  Re-open all the attributes by index and verify the data 
-
-  DO u=0, max_attr-1
-
-
-     !  Open attribute 
-
-     CALL H5Aopen_by_idx_f(loc_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, INT(u,HSIZE_T), &
-          attr, error, aapl_id=H5P_DEFAULT_F)
-
-     !  Verify Name 
-
-     WRITE(chr2,'(I2.2)') u
-     attrname = 'attr '//chr2
-
-     CALL H5Aget_name_f(attr, ATTR_NAME_LEN, check_name, error)
-     CALL check('H5Aget_name',error,total_error)
-     IF(check_name.NE.attrname) THEN
-        WRITE(*,*) 'ERROR: attribute name different: attr_name = ',check_name, ', should be ', attrname
-        total_error = total_error + 1
-     ENDIF
-     !  Read data from the attribute 
-     data_dims(1) = 1
-     CALL h5aread_f(attr, H5T_NATIVE_INTEGER, value, data_dims, error)
-     CALL CHECK("H5Aread_f", error, total_error)
-     CALL VERIFY("H5Aread_f", value, u, total_error)
-
-
-     !  Close attribute 
-     CALL h5aclose_f(attr, error)
-     CALL check("h5aclose_f",error,total_error)
-  ENDDO
-
-END SUBROUTINE test_attr_dense_verify
-
-!***************************************************************
-!**
-!**  test_attr_corder_create_empty(): Test basic H5A (attribute) code.
-!**      Tests basic code to create objects with attribute creation order info
-!**
-!***************************************************************
-
-SUBROUTINE test_attr_corder_create_basic( fcpl, fapl, total_error )
-
-  USE HDF5
-  USE TH5_MISC
-
-  IMPLICIT NONE
-
-  INTEGER(HID_T), INTENT(IN) :: fcpl
-  INTEGER(HID_T), INTENT(IN) :: fapl
-  INTEGER, INTENT(INOUT) :: total_error
-  CHARACTER(LEN=8) :: FileName = "tattr.h5"
-  INTEGER(HID_T) :: fid
-  INTEGER(HID_T) :: dcpl
-  INTEGER(HID_T) :: sid
-
-  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
-
-  INTEGER(HID_T) :: dataset
-
-  INTEGER :: error
-
-  INTEGER :: crt_order_flags
-  INTEGER :: minusone = -1
-
-  !  Output message about test being performed 
-!  WRITE(*,*) "     - Testing Basic Code for Attributes with Creation Order Info"
-
-  !  Create file 
-  CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl)
-  CALL check("h5fcreate_f",error,total_error)
-
-  !  Create dataset creation property list 
-  CALL H5Pcreate_f(H5P_DATASET_CREATE_F,dcpl,error)
-  CALL check("h5Pcreate_f",error,total_error)
-
-  !  Get creation order indexing on object 
-  CALL H5Pget_attr_creation_order_f(dcpl, crt_order_flags, error)
-  CALL check("H5Pget_attr_creation_order_f",error,total_error)
-  CALL VERIFY("H5Pget_attr_creation_order_f",crt_order_flags , 0, total_error)
-
-  !  Setting invalid combination of a attribute order creation order indexing on should fail 
-  CALL H5Pset_attr_creation_order_f(dcpl, H5P_CRT_ORDER_INDEXED_F, error)
-  CALL VERIFY("H5Pset_attr_creation_order_f",error , minusone, total_error)
-  CALL H5Pget_attr_creation_order_f(dcpl, crt_order_flags, error)
-  CALL check("H5Pget_attr_creation_order_f",error,total_error)
-  CALL VERIFY("H5Pget_attr_creation_order_f",crt_order_flags , 0, total_error)
-
-  !  Set attribute creation order tracking & indexing for object 
-  CALL h5pset_attr_creation_order_f(dcpl, IOR(H5P_CRT_ORDER_TRACKED_F, H5P_CRT_ORDER_INDEXED_F), error)
-  CALL check("H5Pset_attr_creation_order_f",error,total_error)
-
-  CALL H5Pget_attr_creation_order_f(dcpl, crt_order_flags, error)
-  CALL check("H5Pget_attr_creation_order_f",error,total_error)
-  CALL VERIFY("H5Pget_attr_creation_order_f",crt_order_flags , &
-       IOR(H5P_CRT_ORDER_TRACKED_F, H5P_CRT_ORDER_INDEXED_F), total_error)
-
-  !  Create dataspace for dataset 
-  CALL h5screate_f(H5S_SCALAR_F, sid, error)
-  CALL check("h5screate_f",error,total_error)
-
-  !  Create a dataset 
-  CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dataset, error, &
-       lcpl_id=H5P_DEFAULT_F, dapl_id=H5P_DEFAULT_F, dcpl_id=dcpl)
-  CALL check("h5dcreate_f",error,total_error)
-
-  !  Close dataspace 
-  CALL h5sclose_f(sid, error)
-  CALL check("h5sclose_f",error,total_error)
-
-
-  !  Close Dataset 
-  CALL h5dclose_f(dataset, error)
-  CALL check("h5dclose_f",error,total_error)
-
-  !  Close property list 
-  CALL h5pclose_f(dcpl, error)
-  CALL check("h5pclose_f",error,total_error)
-
-  !  Close file 
-  CALL h5fclose_f(fid, error)
-  CALL check("h5fclose_f",error,total_error)
-
-  !  Re-open file 
-  CALL h5fopen_f(FileName, H5F_ACC_RDWR_F, fid, error, fapl)
-  CALL check("h5open_f",error,total_error)
-
-  !  Open dataset created 
-  CALL h5dopen_f(fid, DSET1_NAME, dataset, error, H5P_DEFAULT_F )
-  CALL check("h5dopen_f",error,total_error)
-
-
-  !  Retrieve dataset creation property list for group 
-  CALL H5Dget_create_plist_f(dataset, dcpl, error)
-  CALL check("H5Dget_create_plist_f",error,total_error)
-
-  !  Query the attribute creation properties 
-  CALL H5Pget_attr_creation_order_f(dcpl, crt_order_flags, error)
-  CALL check("H5Pget_attr_creation_order_f",error,total_error)
-  CALL VERIFY("H5Pget_attr_creation_order_f",crt_order_flags , &
-       IOR(H5P_CRT_ORDER_TRACKED_F, H5P_CRT_ORDER_INDEXED_F), total_error )
-
-  !  Close property list 
-  CALL h5pclose_f(dcpl, error)
-  CALL check("h5pclose_f",error,total_error)
-
-  !  Close Dataset 
-  CALL h5dclose_f(dataset, error)
-  CALL check("h5dclose_f",error,total_error)
-
-  !  Close file 
-  CALL h5fclose_f(fid, error)
-  CALL check("h5fclose_f",error,total_error)
-
-
-END SUBROUTINE test_attr_corder_create_basic
-
-!***************************************************************
-!**
-!**  test_attr_basic_write(): Test basic H5A (attribute) code.
-!**      Tests integer attributes on both datasets and groups
-!**
-!***************************************************************
-
-SUBROUTINE test_attr_basic_write(fapl, total_error)
-
-  USE HDF5
-  USE TH5_MISC
-
-  IMPLICIT NONE
-
-  INTEGER(HID_T), INTENT(IN) :: fapl
-  INTEGER, INTENT(INOUT) :: total_error
-  CHARACTER(LEN=8) :: FileName = "tattr.h5"
-  INTEGER(HID_T) :: fid1
-  INTEGER(HID_T) :: sid1, sid2
-
-  CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1"
-
-  INTEGER(HID_T) :: dataset
-  INTEGER :: i
-  INTEGER :: error
-
-  INTEGER(HID_T) :: attr,attr2        !String Attribute identifier
-  INTEGER(HID_T) :: group
-
-  CHARACTER(LEN=25) :: check_name
-  CHARACTER(LEN=18) :: chr_exact_size
-
-  CHARACTER(LEN=5), PARAMETER ::  ATTR1_NAME="Attr1"
-  INTEGER, PARAMETER :: ATTR1_RANK = 1
-  INTEGER, PARAMETER ::  ATTR1_DIM1 = 3
-  CHARACTER(LEN=7), PARAMETER :: ATTR1A_NAME ="Attr1_a"
-  CHARACTER(LEN=18), PARAMETER :: ATTR_TMP_NAME = "Attr1_a-1234567890"
-  INTEGER, DIMENSION(ATTR1_DIM1) :: attr_data1
-  INTEGER, DIMENSION(ATTR1_DIM1) :: attr_data1a
-  INTEGER, DIMENSION(ATTR1_DIM1) :: read_data1
-  INTEGER(HSIZE_T) :: attr_size   ! attributes storage requirements .MSB.
-  INTEGER(HSIZE_T), DIMENSION(1) :: dimsa = (/3/) ! Dataset dimensions
-
-  INTEGER     ::   rank1 = 2               ! Dataspace1 rank
-  INTEGER(HSIZE_T), DIMENSION(2) :: dims1 = (/4,6/) ! Dataset dimensions
-  INTEGER(HSIZE_T), DIMENSION(2) :: maxdims1 = (/4,6/) ! maximum dimensions
-
-  INTEGER(SIZE_T) :: size
-
-!! Initialize attribute data
-  attr_data1(1) = 258
-  attr_data1(2) = 9987
-  attr_data1(3) = -99890
-
-  attr_data1a(1) = 258
-  attr_data1a(2) = 1087
-  attr_data1a(3) = -99890
-
-
-  !  Create file 
-  CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid1, error, H5P_DEFAULT_F, fapl)
-  CALL check("h5fcreate_f",error,total_error)
-
-  !  Create dataspace for dataset 
-  CALL h5screate_simple_f(rank1, dims1, sid1, error, maxdims1)
-  CALL check("h5screate_simple_f",error,total_error)
-
-  !  Create a dataset 
-  CALL h5dcreate_f(fid1, DSET1_NAME, H5T_NATIVE_CHARACTER, sid1, dataset, error, H5P_DEFAULT_F, H5P_DEFAULT_F, H5P_DEFAULT_F )
-  CALL check("h5dcreate_f",error,total_error)
-
-  !  Create dataspace for attribute 
-  CALL h5screate_simple_f(ATTR1_RANK, dimsa, sid2, error)
-  CALL check("h5screate_simple_f",error,total_error)
-
-  !  Try to create an attribute on the file (should create an attribute on root group) 
-  CALL h5acreate_f(fid1, ATTR1_NAME, H5T_NATIVE_INTEGER, sid2, attr, error, aapl_id=H5P_DEFAULT_F, acpl_id=H5P_DEFAULT_F)
-  CALL check("h5acreate_f",error,total_error)
-
-  !   Close attribute 
-  CALL h5aclose_f(attr, error)
-  CALL check("h5aclose_f",error,total_error)
-
-  !  Open the root group 
-  CALL H5Gopen_f(fid1, "/", group, error, H5P_DEFAULT_F)
-  CALL check("H5Gopen_f",error,total_error)
-
-  !  Open attribute again 
-  CALL h5aopen_f(group,  ATTR1_NAME, attr, error)
-  CALL check("h5aopen_f",error,total_error)
-
-  !  Close attribute 
-  CALL h5aclose_f(attr, error)
-  CALL check("h5aclose_f",error,total_error)
-
-  !  Close root group 
-  CALL  H5Gclose_f(group, error)
-  CALL check("h5gclose_f",error,total_error)
-
-  !  Create an attribute for the dataset 
-  CALL h5acreate_f(dataset, ATTR1_NAME, H5T_NATIVE_INTEGER, sid2, attr, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
-  CALL check("h5acreate_f",error,total_error)
-
-  !  Write attribute information 
-
-  CALL h5awrite_f(attr, H5T_NATIVE_INTEGER, attr_data1, dimsa, error)
-  CALL check("h5awrite_f",error,total_error)
-
-  !  Create an another attribute for the dataset 
-  CALL h5acreate_f(dataset, ATTR1A_NAME, H5T_NATIVE_INTEGER, sid2, attr2, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
-  CALL check("h5acreate_f",error,total_error)
-
-  !  Write attribute information 
-  CALL h5awrite_f(attr2, H5T_NATIVE_INTEGER, attr_data1a, dimsa, error)
-  CALL check("h5awrite_f",error,total_error)
-
-  !  Check storage size for attribute 
-
-  CALL h5aget_storage_size_f(attr, attr_size, error)
-  CALL check("h5aget_storage_size_f",error,total_error)
-!EP  CALL VERIFY("h5aget_storage_size_f", INT(attr_size), 2*HSIZE_T, total_error)
-
-
-  !  Read attribute information immediately, without closing attribute 
-  CALL h5aread_f(attr, H5T_NATIVE_INTEGER, read_data1, dimsa, error)
-  CALL check("h5aread_f",error,total_error)
-
-  !  Verify values read in 
-  DO i = 1, ATTR1_DIM1
-     CALL VERIFY('h5aread_f',attr_data1(i),read_data1(i), total_error)
-  ENDDO
-
-  !  CLOSE attribute 
-  CALL h5aclose_f(attr, error)
-  CALL check("h5aclose_f",error,total_error)
-
-  !  Close attribute 
-  CALL h5aclose_f(attr2, error)
-  CALL check("h5aclose_f",error,total_error)
-
-  !  change attribute name 
-  CALL H5Arename_f(dataset, ATTR1_NAME, ATTR_TMP_NAME, error)
-  CALL check("H5Arename_f", error, total_error)
-
-  !  Open attribute again 
-
-  CALL h5aopen_f(dataset,  ATTR_TMP_NAME, attr, error)
-  CALL check("h5aopen_f",error,total_error)
-
-  !  Verify new attribute name 
-  ! Set a deliberately small size
-
-  check_name = '                         ' ! need to initialize or does not pass test
-
-  size = 1
-  CALL H5Aget_name_f(attr, size, check_name, error)
-  CALL check('H5Aget_name',error,total_error)
-
-  ! Now enter with the corrected size
-  IF(error.NE.size)THEN
-     size = error
-     CALL H5Aget_name_f(attr, size, check_name, error)
-     CALL check('H5Aget_name',error,total_error)
-  ENDIF
-
-  IF(TRIM(ADJUSTL(check_name)).NE.TRIM(ADJUSTL(ATTR_TMP_NAME))) THEN
-     PRINT*,'.'//TRIM(check_name)//'.',LEN_TRIM(check_name)
-     PRINT*,'.'//TRIM(ATTR_TMP_NAME)//'.',LEN_TRIM(ATTR_TMP_NAME)
-     WRITE(*,*) 'ERROR: attribute name different: attr_name ='//TRIM(check_name)//'.'
-     WRITE(*,*) '                                 should be ='//TRIM(ATTR_TMP_NAME)//'.'
-     total_error = total_error + 1
-     stop
-  ENDIF
-
-  ! Try with a string buffer that is exactly the correct size
-  size = 18
-  CALL H5Aget_name_f(attr, size, chr_exact_size, error)
-  CALL check('H5Aget_name_f',error,total_error)
-  CALL VerifyString('H5Aget_name_f',chr_exact_size,ATTR_TMP_NAME, total_error)
-
-  !  Close attribute 
-  CALL h5aclose_f(attr, error)
-  CALL check("h5aclose_f",error,total_error)
-
-  CALL h5sclose_f(sid1, error)
-  CALL check("h5sclose_f",error,total_error)
-  CALL h5sclose_f(sid2, error)
-  CALL check("h5sclose_f",error,total_error)
-  ! Close Dataset 
-  CALL h5dclose_f(dataset, error)
-  CALL check("h5dclose_f",error,total_error)
-
-  !  Close file 
-  CALL h5fclose_f(fid1, error)
-  CALL check("h5fclose_f",error,total_error)
-
-END SUBROUTINE test_attr_basic_write
-
-!***************************************************************
-!**
-!**  test_attr_many(): Test basic H5A (attribute) code.
-!**      Tests storing lots of attributes
-!**
-!***************************************************************
-
-SUBROUTINE test_attr_many(new_format, fcpl, fapl, total_error)
-
-  USE HDF5
-  USE TH5_MISC
-
-  IMPLICIT NONE
-
-  LOGICAL, INTENT(IN) :: new_format
-  INTEGER(HID_T), INTENT(IN) :: fcpl
-  INTEGER(HID_T), INTENT(IN) :: fapl
-  INTEGER, INTENT(INOUT) :: total_error
-  CHARACTER(LEN=8) :: FileName = "tattr.h5"
-  INTEGER(HID_T) :: fid
-  INTEGER(HID_T) :: sid
-  INTEGER(HID_T) :: gid
-  INTEGER(HID_T) :: aid
-  INTEGER :: error
-
-  INTEGER(HSIZE_T), DIMENSION(7) :: data_dims
-  CHARACTER(LEN=5) :: chr5
-
-
-  CHARACTER(LEN=11) :: attrname
-  CHARACTER(LEN=8), PARAMETER :: GROUP1_NAME="/Group1"
-
-  INTEGER :: u
-  INTEGER :: nattr
-  LOGICAL :: exists
-  INTEGER, DIMENSION(1) ::  attr_data1
-
-  data_dims = 0
-
-
-  ! Create file 
-  CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl)
-  CALL check("h5fcreate_f",error,total_error)
-
-  !  Create dataspace for attribute 
-  CALL h5screate_f(H5S_SCALAR_F, sid, error)
-  CALL check("h5screate_f",error,total_error)
-
-  !  Create group for attributes 
-
-  CALL H5Gcreate_f(fid, GROUP1_NAME, gid, error)
-  CALL check("H5Gcreate_f", error, total_error)
-
-  !  Create many attributes 
-
-  IF(new_format)THEN
-     nattr = 250
-  ELSE
-     nattr = 2
-  ENDIF
-
-  DO u = 0, nattr - 1
-
-     WRITE(chr5,'(I5.5)') u
-     attrname = 'attr '//chr5
-     CALL H5Aexists_f( gid, attrname, exists, error)
-     CALL VerifyLogical("H5Aexists",exists,.FALSE.,total_error )
-
-     CALL H5Aexists_by_name_f(fid, GROUP1_NAME, attrname,  exists, error, lapl_id = H5P_DEFAULT_F)
-     CALL VerifyLogical("H5Aexists_by_name_f",exists,.FALSE.,total_error )
-
-     CALL h5acreate_f(gid, attrname, H5T_NATIVE_INTEGER, sid, aid, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
-     CALL check("h5acreate_f",error,total_error)
-
-     CALL H5Aexists_f(gid, attrname, exists, error)
-     CALL VerifyLogical("H5Aexists",exists,.TRUE.,total_error )
-
-     CALL H5Aexists_by_name_f(fid, GROUP1_NAME, attrname, exists, error)
-     CALL VerifyLogical("H5Aexists_by_name_f",exists,.TRUE.,total_error )
-
-     attr_data1(1) = u
-     data_dims(1) = 1
-
-     CALL h5awrite_f(aid, H5T_NATIVE_INTEGER, attr_data1, data_dims, error)
-     CALL check("h5awrite_f",error,total_error)
-
-     CALL h5aclose_f(aid, error)
-     CALL check("h5aclose_f",error,total_error)
-
-     CALL H5Aexists_f(gid, attrname, exists, error)
-     CALL VerifyLogical("H5Aexists",exists,.TRUE.,total_error )
-
-     CALL H5Aexists_by_name_f(fid, GROUP1_NAME, attrname, exists, error)
-     CALL VerifyLogical("H5Aexists_by_name_f",exists,.TRUE.,total_error )
-
-  ENDDO
-
-  !  Close group 
-  CALL  H5Gclose_f(gid, error)
-  CALL check("h5gclose_f",error,total_error)
-
-  !  Close file 
-  CALL h5fclose_f(fid, error)
-  CALL check("h5fclose_f",error,total_error)
-
-  !  Close dataspaces 
-  CALL h5sclose_f(sid, error)
-  CALL check("h5sclose_f",error,total_error)
-
-END SUBROUTINE test_attr_many
-
-!-------------------------------------------------------------------------
-! * Function:    attr_open_check
-! *
-! * Purpose:     Check opening attribute on an object
-! *
-! * Return:      Success:        0
-! *              Failure:        -1
-! *
-! * Programmer:  Fortran version (M.S. Breitenfeld)
-! *              March 21, 2008
-! *
-! *-------------------------------------------------------------------------
-! 
-
-SUBROUTINE attr_open_check(fid, dsetname, obj_id, max_attrs, total_error )
-
-  USE HDF5
-  USE TH5_MISC
-
-  IMPLICIT NONE
-  INTEGER(HID_T), INTENT(IN) :: fid
-  CHARACTER(LEN=*), INTENT(IN) :: dsetname
-  INTEGER(HID_T), INTENT(IN) :: obj_id
-  INTEGER, INTENT(IN) :: max_attrs
-  INTEGER, INTENT(INOUT) :: total_error
-
-  INTEGER :: u
-  CHARACTER (LEN=8) :: attrname
-  INTEGER :: error
-  LOGICAL :: f_corder_valid ! Indicates whether the the creation order data is valid for this attribute
-  INTEGER :: corder ! Is a positive integer containing the creation order of the attribute
-  INTEGER :: cset ! Indicates the character set used for the attribute’s name
-  INTEGER(HSIZE_T) :: data_size   ! indicates the size, in the number of characters
-
-  INTEGER(HSIZE_T) :: storage_size   ! attributes storage requirements
-  CHARACTER(LEN=2) :: chr2
-  INTEGER(HID_T) attr_id
-  !  Open each attribute on object by index and check that it's the correct one 
-
-  DO u = 0, max_attrs-1
-     !  Open the attribute 
-
-     WRITE(chr2,'(I2.2)') u
-     attrname = 'attr '//chr2
-
-
-     CALL h5aopen_f(obj_id, attrname, attr_id, error)
-     CALL check("h5aopen_f",error,total_error)
-
-
-     !  Get the attribute's information 
-
-     CALL h5aget_info_f(attr_id, f_corder_valid, corder, cset, data_size,  error)
-     CALL check("h5aget_info_f",error,total_error)
-
-     !  Check that the object's attributes are correct 
-     CALL VERIFY("h5aget_info_f.corder",corder,u,total_error)
-     CALL Verifylogical("h5aget_info_f.corder_valid",f_corder_valid,.TRUE.,total_error)
-     CALL VERIFY("h5aget_info_f.cset", cset, H5T_CSET_ASCII_F, total_error)
-     CALL h5aget_storage_size_f(attr_id, storage_size, error)
-     CALL check("h5aget_storage_size_f",error,total_error)
-
-     CALL VERIFY("h5aget_info_f.data_size", INT(data_size), INT(storage_size), total_error)
-
-
-     !  Close attribute 
-     CALL h5aclose_f(attr_id, error)
-     CALL check("h5aclose_f",error,total_error)
-
-     !  Open the attribute 
-
-     CALL H5Aopen_by_name_f(obj_id, ".", attrname, attr_id, error, lapl_id=H5P_DEFAULT_F, aapl_id=H5P_DEFAULT_F)
-     CALL check("H5Aopen_by_name_f", error, total_error)
-
-     CALL h5aget_info_f(attr_id, f_corder_valid, corder, cset, data_size,  error)
-     CALL check("h5aget_info_f",error,total_error)
-     !  Check the attribute's information 
-     CALL VERIFY("h5aget_info_f",corder,u,total_error)
-     CALL Verifylogical("h5aget_info_f",f_corder_valid,.TRUE.,total_error)
-     CALL VERIFY("h5aget_info_f", cset, H5T_CSET_ASCII_F, total_error)
-     CALL h5aget_storage_size_f(attr_id, storage_size, error)
-     CALL check("h5aget_storage_size_f",error,total_error)
-     CALL VERIFY("h5aget_info_f", INT(data_size), INT(storage_size), total_error)
-
-     !  Close attribute 
-     CALL h5aclose_f(attr_id, error)
-     CALL check("h5aclose_f",error,total_error)
-
-
-     !  Open the attribute 
-     CALL H5Aopen_by_name_f(fid, dsetname, attrname, attr_id, error)
-     CALL check("H5Aopen_by_name_f", error, total_error)
-
-
-     !  Get the attribute's information 
-     CALL h5aget_info_f(attr_id, f_corder_valid, corder, cset, data_size,  error)
-     CALL check("h5aget_info_f",error,total_error)
-
-     !  Check the attribute's information 
-     CALL VERIFY("h5aget_info_f",corder,u,total_error)
-     CALL Verifylogical("h5aget_info_f",f_corder_valid,.TRUE.,total_error)
-     CALL VERIFY("h5aget_info_f", cset, H5T_CSET_ASCII_F, total_error)
-     CALL h5aget_storage_size_f(attr_id, storage_size, error)
-     CALL check("h5aget_storage_size_f",error,total_error)
-     CALL VERIFY("h5aget_info_f", INT(data_size), INT(storage_size), total_error)
-
-     !  Close attribute 
-     CALL h5aclose_f(attr_id, error)
-     CALL check("h5aclose_f",error,total_error)
-  ENDDO
-
-END SUBROUTINE attr_open_check
-END MODULE TH5A_1_8
diff --git a/fortran/test/tH5D.F90 b/fortran/test/tH5D.F90
new file mode 100644
index 0000000..c9ba952
--- /dev/null
+++ b/fortran/test/tH5D.F90
@@ -0,0 +1,630 @@
+!****h* root/fortran/test/tH5D.f90
+!
+! NAME
+!  tH5D.f90
+!
+! FUNCTION
+!  Basic testing of Fortran H5D APIs.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! NOTES
+!  Tests the H5D APIs functionalities of:
+!   h5dcreate_f, h5dopen_f, h5dclose_f, h5dget_space_f, h5dget_type_f,
+!   h5dread_f, and h5dwrite_f, h5dget_space_status_f
+!
+!
+! CONTAINS SUBROUTINES
+!  datasettest, extenddsettest
+!
+!*****
+
+!
+MODULE TH5D
+
+  USE HDF5 ! This module contains all necessary modules
+  USE TH5_MISC
+  USE TH5_MISC_GEN
+
+CONTAINS
+  SUBROUTINE datasettest(cleanup, total_error)
+
+    IMPLICIT NONE
+    LOGICAL, INTENT(IN) :: cleanup
+    INTEGER, INTENT(OUT) :: total_error
+    
+    CHARACTER(LEN=5), PARAMETER :: filename = "dsetf" ! File name
+    CHARACTER(LEN=80) :: fix_filename
+    CHARACTER(LEN=4), PARAMETER :: dsetname = "dset"     ! Dataset name
+    CHARACTER(LEN=9), PARAMETER :: null_dsetname = "null_dset"     ! Dataset name
+    
+    INTEGER(HID_T) :: file_id       ! File identifier
+    INTEGER(HID_T) :: dset_id       ! Dataset identifier
+    INTEGER(HID_T) :: null_dset     ! Null dataset identifier
+    INTEGER(HID_T) :: dspace_id     ! Dataspace identifier
+    INTEGER(HID_T) :: null_dspace   ! Null dataspace identifier
+    INTEGER(HID_T) :: dtype_id      ! Datatype identifier
+    
+    INTEGER(HSIZE_T), DIMENSION(2) :: dims = (/4,6/) ! Dataset dimensions
+    INTEGER     ::   rank = 2                        ! Dataset rank
+    
+    INTEGER, DIMENSION(4,6) :: dset_data, data_out ! Data buffers
+    INTEGER     ::   error ! Error flag
+    
+    INTEGER     :: i, j    !general purpose integers
+    INTEGER(HSIZE_T), DIMENSION(2) :: data_dims
+    INTEGER(HSIZE_T), DIMENSION(1) :: null_data_dim
+    INTEGER     ::   null_dset_data = 1              ! null data
+    INTEGER :: flag ! Space allocation status
+    
+    !
+    ! Initialize the dset_data array.
+    !
+    DO i = 1, 4
+       DO j = 1, 6
+          dset_data(i,j) = (i-1)*6 + j;
+       END DO
+    END DO
+    !
+    ! Create a new file using default properties.
+    !
+    CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+    IF (error .NE. 0) THEN
+       WRITE(*,*) "Cannot modify filename"
+       STOP
+    ENDIF
+    CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
+    CALL check("h5fcreate_f", error, total_error)
+    !
+    ! Create the dataspace.
+    !
+    CALL h5screate_simple_f(rank, dims, dspace_id, error)
+    CALL check("h5screate_simple_f", error, total_error)
+    !
+    ! Create null dataspace.
+    !
+    CALL h5screate_f(H5S_NULL_F, null_dspace, error)
+    CALL check("h5screate_simple_f", error, total_error)
+    !
+    ! Create the dataset with default properties.
+    !
+    CALL h5dcreate_f(file_id, dsetname, H5T_NATIVE_INTEGER, dspace_id, &
+         dset_id, error)
+    CALL check("h5dcreate_f", error, total_error)
+    !
+    ! Create the null dataset.
+    !
+    CALL h5dcreate_f(file_id, null_dsetname, H5T_NATIVE_INTEGER, null_dspace, null_dset, error)
+    CALL check("h5dcreate_f", error, total_error)
+    !
+    ! Write the dataset.
+    !
+    data_dims(1) = 4
+    data_dims(2) = 6
+    CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, dset_data, data_dims, error)
+    CALL check("h5dwrite_f", error, total_error)
+    !
+    ! Write null dataset.  Nothing can be written.
+    !
+    null_data_dim(1) = 1
+    CALL h5dwrite_f(null_dset, H5T_NATIVE_INTEGER, null_dset_data, null_data_dim, error)
+    CALL check("h5dwrite_f", error, total_error)
+    !
+    ! End access to the dataset and release resources used by it.
+    !
+    CALL h5dclose_f(dset_id, error)
+    CALL check("h5dclose_f", error, total_error)
+    CALL h5dclose_f(null_dset, error)
+    CALL check("h5dclose_f", error, total_error)
+    !
+    ! Terminate access to the data space.
+    !
+    CALL h5sclose_f(dspace_id, error)
+    CALL check("h5sclose_f", error, total_error)
+    CALL h5sclose_f(null_dspace, error)
+    CALL check("h5sclose_f", error, total_error)
+    !
+    ! Close the file.
+    !
+    CALL h5fclose_f(file_id, error)
+    CALL check("h5fclose_f", error, total_error)
+    !
+    ! Open the existing file.
+    !
+    CALL h5fopen_f (fix_filename, H5F_ACC_RDWR_F, file_id, error)
+    CALL check("h5fopen_f", error, total_error)
+    !
+    ! Open the existing dataset.
+    !
+    CALL h5dopen_f(file_id, dsetname, dset_id, error)
+    CALL check("h5dopen_f", error, total_error)
+    CALL h5dopen_f(file_id, null_dsetname, null_dset, error)
+    CALL check("h5dopen_f", error, total_error)
+
+    ! Test whether space has been allocated for a dataset
+    CALL h5dget_space_status_f(dset_id, flag, error)
+    CALL check("h5dget_space_status_f",error, total_error)
+    CALL VERIFY("h5dget_space_status_f", flag, H5D_SPACE_STS_ALLOCATED_F, total_error)
+    
+    CALL h5dget_space_status_f(null_dset, flag, error)
+    CALL check("h5dget_space_status_f",error, total_error)
+    CALL VERIFY("h5dget_space_status_f", flag, H5D_SPACE_STS_NOT_ALLOCATED_F, total_error)    
+    !
+    ! Get the dataset type.
+    !
+    CALL h5dget_type_f(dset_id, dtype_id, error)
+    CALL check("h5dget_type_f", error, total_error)
+    !
+    ! Get the data space.
+    !
+    CALL h5dget_space_f(dset_id, dspace_id, error)
+    CALL check("h5dget_space_f", error, total_error)
+    !
+    ! Read the dataset.
+    !
+    CALL h5dread_f(dset_id, H5T_NATIVE_INTEGER, data_out, data_dims, error)
+    CALL check("h5dread_f", error, total_error)
+    !
+    ! Read the null dataset.  Nothing should be read.
+    !
+    CALL h5dread_f(null_dset, H5T_NATIVE_INTEGER, null_dset_data, null_data_dim, error)
+    CALL check("h5dread_f", error, total_error)
+    !
+    !Compare the data.
+    !
+    DO i = 1, 4
+       DO j = 1, 6
+          IF (data_out(i,j) .NE. dset_data(i, j)) THEN
+             WRITE(*, *) "dataset test error occured"
+             WRITE(*,*) "data read is not the same as the data written"
+          END IF
+       END DO
+    END DO
+    !
+    ! Check if no change to null_dset_data
+    !
+    IF (null_dset_data .NE. 1) THEN
+       WRITE(*, *) "null dataset test error occured"
+    END IF
+    !
+    ! End access to the dataset and release resources used by it.
+    !
+    CALL h5dclose_f(dset_id, error)
+    CALL check("h5dclose_f", error, total_error)
+    CALL h5dclose_f(null_dset, error)
+    CALL check("h5dclose_f", error, total_error)
+    !
+    ! Terminate access to the data space.
+    !
+    CALL h5sclose_f(dspace_id, error)
+    CALL check("h5sclose_f", error, total_error)
+    
+    !
+    ! Terminate access to the data type.
+    !
+    CALL h5tclose_f(dtype_id, error)
+    CALL check("h5tclose_f", error, total_error)
+    !
+    ! Close the file.
+    !
+    CALL h5fclose_f(file_id, error)
+    CALL check("h5fclose_f", error, total_error)
+    IF(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+    CALL check("h5_cleanup_f", error, total_error)
+    
+    RETURN
+  END SUBROUTINE datasettest
+  
+!
+!the following subroutine tests h5dextend_f functionality
+!
+
+  SUBROUTINE extenddsettest(cleanup, total_error)
+    
+    IMPLICIT NONE
+    
+    LOGICAL, INTENT(IN)  :: cleanup
+    INTEGER, INTENT(OUT) :: total_error
+    
+    !
+    !the dataset is stored in file "extf.h5"
+    !
+    CHARACTER(LEN=4), PARAMETER :: filename = "extf"
+    CHARACTER(LEN=80) :: fix_filename
+    
+    !
+    !dataset name is "ExtendibleArray"
+    !
+    CHARACTER(LEN=15), PARAMETER :: dsetname = "ExtendibleArray"
+    
+    !
+    !dataset rank is 2
+    !
+    INTEGER :: RANK = 2
+    
+    INTEGER(HID_T) :: file_id       ! File identifier
+    INTEGER(HID_T) :: dset_id       ! Dataset identifier
+    INTEGER(HID_T) :: dataspace     ! Dataspace identifier
+    INTEGER(HID_T) :: memspace      ! memory Dataspace identifier
+    INTEGER(HID_T) :: crp_list        ! dataset creatation property identifier
+    
+    !
+    !dataset dimensions at creation time
+    !
+    INTEGER(HSIZE_T), DIMENSION(2) :: dims = (/3,3/)
+    
+    !
+    !data dimensions
+    !
+    INTEGER(HSIZE_T), DIMENSION(2) :: dims1 = (/10,3/)
+    
+    !
+    !Maximum dimensions
+    !
+    INTEGER(HSIZE_T), DIMENSION(2) :: maxdims
+    
+    !
+    !data arrays for reading and writing
+    !
+    INTEGER, DIMENSION(10,3) :: data_in, data_out
+    
+    !
+    !Size of data in the file
+    !
+    INTEGER(HSIZE_T), DIMENSION(2) :: size
+    
+    !
+    !general purpose integer
+    !
+    INTEGER :: i, j
+    INTEGER(HSIZE_T) :: ih, jh
+    
+    !
+    !flag to check operation success
+    !
+    INTEGER :: error
+    
+    !
+    !Variables used in reading data back
+    !
+    INTEGER(HSIZE_T), DIMENSION(2) :: dimsr, maxdimsr
+    INTEGER :: rankr
+    INTEGER(HSIZE_T), DIMENSION(2) :: data_dims
+    
+    !
+    !data initialization
+    !
+    DO i = 1, 10
+       DO j = 1, 3
+          data_in(i,j) = 2
+       END DO
+    END DO
+    
+    !
+    !Initialize FORTRAN predifined datatypes
+    !
+!          CALL h5init_types_f(error)
+!               CALL check("h5init_types_f",error,total_error)
+
+    !
+    !Create a new file using default properties.
+    !
+    CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+    IF (error .NE. 0) THEN
+       WRITE(*,*) "Cannot modify filename"
+       STOP
+    ENDIF
+    CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
+    CALL check("h5fcreate_f",error,total_error)
+    
+    !
+    !Create the data space with unlimited dimensions.
+    !
+    maxdims = (/H5S_UNLIMITED_F, H5S_UNLIMITED_F/)
+    
+    CALL h5screate_simple_f(RANK, dims, dataspace, error, maxdims)
+    CALL check("h5screate_simple_f",error,total_error)
+    
+    !
+    !Modify dataset creation properties, i.e. enable chunking
+    !
+    CALL h5pcreate_f(H5P_DATASET_CREATE_F, crp_list, error)
+    CALL check("h5pcreate_f",error,total_error)
+    
+    CALL h5pset_chunk_f(crp_list, RANK, dims1, error)
+    CALL check("h5pset_chunk_f",error,total_error)
+    
+    !
+    !Create a dataset with 3X3 dimensions using cparms creation propertie .
+    !
+    CALL h5dcreate_f(file_id, dsetname, H5T_NATIVE_INTEGER, dataspace, dset_id, error, crp_list )
+    CALL check("h5dcreate_f",error,total_error)
+
+    !
+    !Extend the dataset. This call assures that dataset is 3 x 3.
+    !
+    SIZE(1) = 3
+    SIZE(2) = 3
+    CALL h5dextend_f(dset_id, size, error)
+    CALL check("h5dextend_f",error,total_error)
+    
+    
+    !
+    !Extend the dataset. Dataset becomes 10 x 3.
+    !
+    SIZE(1)   = 10;
+    SIZE(2)   = 3;
+    CALL h5dextend_f(dset_id, size, error)
+    CALL check("h5dextend_f",error,total_error)
+    
+    !
+    !Write the data of size 10X3 to the extended dataset.
+    !
+    data_dims(1) = 10
+    data_dims(2) = 3
+    CALL H5dwrite_f(dset_id, H5T_NATIVE_INTEGER, data_in, data_dims, error)
+    CALL check("h5dwrite_f",error,total_error)
+    
+    !
+    !Close the dataspace for the dataset.
+    !
+    CALL h5sclose_f(dataspace, error)
+    CALL check("h5sclose_f",error,total_error)
+    
+    !
+    !Close the property list.
+    !
+    CALL h5pclose_f(crp_list, error)
+    CALL check("h5pclose_f",error,total_error)
+    !
+    !Close the dataset.
+    !
+    CALL h5dclose_f(dset_id, error)
+    CALL check("h5dclose_f",error,total_error)
+    
+    !
+    !Close the file.
+    !
+    CALL h5fclose_f(file_id, error)
+    CALL check("h5fclose_f",error,total_error)
+    
+    !
+    !read the data back
+    !
+    !Open the file.
+    !
+    CALL h5fopen_f (fix_filename, H5F_ACC_RDONLY_F, file_id, error)
+    CALL check("hfopen_f",error,total_error)
+    
+    !
+    !Open the  dataset.
+    !
+    CALL h5dopen_f(file_id, dsetname, dset_id, error)
+    CALL check("h5dopen_f",error,total_error)
+    
+    !
+    !Get dataset's dataspace handle.
+    !
+    CALL h5dget_space_f(dset_id, dataspace, error)
+    CALL check("h5dget_space_f",error,total_error)
+    
+    !
+    !Get dataspace's rank.
+    !
+    CALL h5sget_simple_extent_ndims_f(dataspace, rankr, error)
+    CALL check("h5sget_simple_extent_ndims_f",error,total_error)
+    IF (rankr .NE. RANK) THEN
+       WRITE(*,*) "dataset rank error occured"
+       STOP
+    END IF
+    
+    !
+    !Get dataspace's dimensinons.
+    !
+    CALL h5sget_simple_extent_dims_f(dataspace, dimsr, maxdimsr, error)
+    CALL check("h5sget_simple_extent_dims_f",error,total_error)
+    IF ((dimsr(1) .NE. dims1(1)) .OR. (dimsr(2) .NE. dims1(2))) THEN
+       WRITE(*,*) "dataset dimensions error occured"
+       STOP
+    END IF
+    
+    !
+    !Get creation property list.
+    !
+    CALL h5dget_create_plist_f(dset_id, crp_list, error)
+    CALL check("h5dget_create_plist_f",error,total_error)
+
+    
+    !
+    !create memory dataspace.
+    !
+    CALL h5screate_simple_f(rankr, dimsr, memspace, error)
+    CALL check("h5screate_simple_f",error,total_error)
+    
+    !
+    !Read data
+    !
+    CALL H5dread_f(dset_id, H5T_NATIVE_INTEGER, data_out, data_dims, error, memspace, dataspace)
+    CALL check("h5dread_f",error,total_error)
+
+    
+    !
+    !Compare the data.
+    !
+    DO ih = 1, dims1(1)
+       DO jh = 1, dims1(2)
+          IF (data_out(ih,jh) .NE. data_in(ih, jh)) THEN
+             WRITE(*, *) "extend dataset test error occured"
+             WRITE(*, *) "read value is not the same as the written values"
+          END IF
+       END DO
+    END DO
+    
+    !
+    !Close the dataspace for the dataset.
+    !
+    CALL h5sclose_f(dataspace, error)
+    CALL check("h5sclose_f",error,total_error)
+    
+    !
+    !Close the memspace for the dataset.
+    !
+    CALL h5sclose_f(memspace, error)
+    CALL check("h5sclose_f",error,total_error)
+    
+    !
+    !Close the property list.
+    !
+    CALL h5pclose_f(crp_list, error)
+    CALL check("h5pclose_f",error,total_error)
+    
+    !
+    !Close the dataset.
+    !
+    CALL h5dclose_f(dset_id, error)
+    CALL check("h5dclose_f",error,total_error)
+    
+    !
+    !Close the file.
+    !
+    CALL h5fclose_f(file_id, error)
+    CALL check("h5fclose_f",error,total_error)
+    IF(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+    CALL check("h5_cleanup_f", error, total_error)
+    
+    RETURN
+  END SUBROUTINE extenddsettest
+
+!
+! The following subroutine tests h5dget_offset_f functionality
+!
+
+  SUBROUTINE test_userblock_offset(cleanup, total_error)
+
+    USE ISO_C_BINDING
+
+    IMPLICIT NONE
+    LOGICAL, INTENT(IN) :: cleanup
+    INTEGER, INTENT(OUT) :: total_error
+    !
+    !the dataset is stored in file "offset.h5"
+    !
+    INTEGER, PARAMETER :: dset_dim1=2, dset_dim2=10
+    CHARACTER(LEN=6), PARAMETER :: filename = "offset"
+    CHARACTER(LEN=80) :: fix_filename
+
+    INTEGER(hid_t) :: file, fcpl, dataset, space
+    INTEGER :: i, j, n, ios
+    INTEGER(hsize_t), DIMENSION(1:2) ::	dims
+    INTEGER :: f
+    INTEGER(haddr_t) :: offset
+    INTEGER, DIMENSION(1:dset_dim1,1:dset_dim2), TARGET :: rdata, data_in
+    INTEGER :: error
+    TYPE(C_PTR) :: f_ptr
+    !
+    !Create a new file using default properties.
+    !
+    CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+    IF (error .NE. 0) THEN
+       WRITE(*,*) "Cannot modify filename"
+       STOP
+    ENDIF
+
+    CALL h5pcreate_f(H5P_FILE_CREATE_F, fcpl, error)
+    CALL check("h5pcreate_f",error,total_error)
+
+    ! Initialize the dataset
+    n = 0
+    DO i = 1, dset_dim1
+       DO j = 1, dset_dim2
+          n = n + 1
+          data_in(i,j) = n 
+       END DO
+    END DO
+    CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file, error, fcpl)
+    CALL check("h5fcreate_f",error,total_error)
+
+    ! Create the data space
+    dims(1:2) = (/dset_dim1,dset_dim2/)
+    
+    CALL h5screate_simple_f(2, dims, space, error)
+    CALL check("h5screate_simple_f",error,total_error)
+
+    ! Create the dataset
+    CALL h5dcreate_f(file, "dset1", H5T_NATIVE_INTEGER, space, dataset, error)
+    CALL check("h5dcreate_f", error, total_error)
+
+    ! Test dataset address.  Should be undefined.
+    CALL h5dget_offset_f(dataset, offset, error)
+    CALL VERIFY("h5dget_offset_f",offset, HADDR_UNDEF_F, total_error)
+
+    ! Write the data to the dataset
+    f_ptr = C_LOC(data_in(1,1))
+    CALL h5dwrite_f(dataset, H5T_NATIVE_INTEGER, f_ptr, error)
+    CALL check("h5dwrite_f", error, total_error)
+
+    ! Test dataset address in file. Open the same file as a C file, seek
+    ! the data position as H5Dget_offset points to, read the dataset, and
+    ! compare it with the data written in.
+    CALL h5dget_offset_f(dataset, offset, error)
+    CALL check("h5dget_offset_f", error, total_error)
+    IF(offset.EQ.HADDR_UNDEF_F)THEN
+       total_error = total_error + 1
+    ENDIF
+
+    CALL h5dclose_f(dataset, error)
+    CALL check("h5dclose_f", error, total_error)
+    CALL h5fclose_f(file, error)
+    CALL check("h5fclose_f", error, total_error)
+
+    IF(total_error.NE.0) RETURN
+
+    OPEN(10,FILE=fix_filename, ACCESS="STREAM", IOSTAT=ios)
+    IF(ios.NE.0)THEN
+       WRITE(*,'(A)') "Failed to open file "//TRIM(fix_filename)
+       total_error = total_error + 1
+       RETURN
+    ENDIF
+    ! The pos= specifier illustrates that positions are in bytes, 
+    ! starting from byte 1 (as opposed to C, where they start from byte 0)
+    READ(10, POS=offset+1, IOSTAT=ios) rdata
+    IF(ios.NE.0)THEN
+       WRITE(*,'(A)') "Failed to read data from stream I/O "
+       total_error = total_error + 1
+       CLOSE(10)
+       RETURN
+    ENDIF
+
+    ! Check that the values read are the same as the values written
+    DO i = 1, dset_dim1
+       DO j = 1, dset_dim2
+          CALL VERIFY("h5dget_offset_f",rdata(i,j), data_in(i,j), total_error)
+          IF(total_error.NE.0)THEN
+             WRITE(*,'(A)') "    Read different values than written."
+             WRITE(*,'(2(A,I0))') "    At index ",i,",",j
+             CLOSE(10)
+             RETURN
+          ENDIF
+       END DO
+    END DO
+
+    CLOSE(10)
+    
+  END SUBROUTINE test_userblock_offset
+
+END MODULE TH5D
+
diff --git a/fortran/test/tH5D.f90 b/fortran/test/tH5D.f90
deleted file mode 100644
index c0eb8f9..0000000
--- a/fortran/test/tH5D.f90
+++ /dev/null
@@ -1,538 +0,0 @@
-!****h* root/fortran/test/tH5D.f90
-!
-! NAME
-!  tH5D.f90
-!
-! FUNCTION
-!  Basic testing of Fortran H5D APIs.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!  Tests the H5D APIs functionalities of:
-!   h5dcreate_f, h5dopen_f, h5dclose_f, h5dget_space_f, h5dget_type_f,
-!   h5dread_f, and h5dwrite_f, h5dget_space_status_f
-!
-!
-! CONTAINS SUBROUTINES
-!  datasettest, extenddsettest
-!
-!*****
-
-!
-MODULE TH5D
-
-CONTAINS
-        SUBROUTINE datasettest(cleanup, total_error)
-        USE HDF5 ! This module contains all necessary modules
-        USE TH5_MISC
-
-          IMPLICIT NONE
-          LOGICAL, INTENT(IN) :: cleanup
-          INTEGER, INTENT(OUT) :: total_error
-
-          CHARACTER(LEN=5), PARAMETER :: filename = "dsetf" ! File name
-          CHARACTER(LEN=80) :: fix_filename
-          CHARACTER(LEN=4), PARAMETER :: dsetname = "dset"     ! Dataset name
-          CHARACTER(LEN=9), PARAMETER :: null_dsetname = "null_dset"     ! Dataset name
-
-          INTEGER(HID_T) :: file_id       ! File identifier
-          INTEGER(HID_T) :: dset_id       ! Dataset identifier
-          INTEGER(HID_T) :: null_dset     ! Null dataset identifier
-          INTEGER(HID_T) :: dspace_id     ! Dataspace identifier
-          INTEGER(HID_T) :: null_dspace   ! Null dataspace identifier
-          INTEGER(HID_T) :: dtype_id      ! Datatype identifier
-
-
-          INTEGER(HSIZE_T), DIMENSION(2) :: dims = (/4,6/) ! Dataset dimensions
-          INTEGER     ::   rank = 2                        ! Dataset rank
-
-          INTEGER, DIMENSION(4,6) :: dset_data, data_out ! Data buffers
-          INTEGER     ::   error ! Error flag
-
-          INTEGER     :: i, j    !general purpose integers
-          INTEGER(HSIZE_T), DIMENSION(2) :: data_dims
-          INTEGER(HSIZE_T), DIMENSION(1) :: null_data_dim
-          INTEGER     ::   null_dset_data = 1              ! null data
-          INTEGER :: flag ! Space allocation status
-
-          !
-          ! Initialize the dset_data array.
-          !
-          do i = 1, 4
-             do j = 1, 6
-                dset_data(i,j) = (i-1)*6 + j;
-             end do
-          end do
-
-
-          !
-          ! Create a new file using default properties.
-          !
-          CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
-          if (error .ne. 0) then
-              write(*,*) "Cannot modify filename"
-              stop
-          endif
-          CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
-              CALL check("h5fcreate_f", error, total_error)
-
-
-          !
-          ! Create the dataspace.
-          !
-          CALL h5screate_simple_f(rank, dims, dspace_id, error)
-              CALL check("h5screate_simple_f", error, total_error)
-          !
-          ! Create null dataspace.
-          !
-          CALL h5screate_f(H5S_NULL_F, null_dspace, error)
-              CALL check("h5screate_simple_f", error, total_error)
-
-
-          !
-          ! Create the dataset with default properties.
-          !
-          CALL h5dcreate_f(file_id, dsetname, H5T_NATIVE_INTEGER, dspace_id, &
-                           dset_id, error)
-              CALL check("h5dcreate_f", error, total_error)
-          !
-          ! Create the null dataset.
-          !
-          CALL h5dcreate_f(file_id, null_dsetname, H5T_NATIVE_INTEGER, null_dspace, &
-                           null_dset, error)
-              CALL check("h5dcreate_f", error, total_error)
-
-          !
-          ! Write the dataset.
-          !
-          data_dims(1) = 4
-          data_dims(2) = 6
-          CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, dset_data, data_dims, error)
-              CALL check("h5dwrite_f", error, total_error)
-          !
-          ! Write null dataset.  Nothing can be written.
-          !
-          null_data_dim(1) = 1
-          CALL h5dwrite_f(null_dset, H5T_NATIVE_INTEGER, null_dset_data, null_data_dim, error)
-              CALL check("h5dwrite_f", error, total_error)
-
-
-          !
-          ! End access to the dataset and release resources used by it.
-          !
-          CALL h5dclose_f(dset_id, error)
-              CALL check("h5dclose_f", error, total_error)
-          CALL h5dclose_f(null_dset, error)
-              CALL check("h5dclose_f", error, total_error)
-
-          !
-          ! Terminate access to the data space.
-          !
-          CALL h5sclose_f(dspace_id, error)
-              CALL check("h5sclose_f", error, total_error)
-          CALL h5sclose_f(null_dspace, error)
-              CALL check("h5sclose_f", error, total_error)
-
-          !
-          ! Close the file.
-          !
-          CALL h5fclose_f(file_id, error)
-              CALL check("h5fclose_f", error, total_error)
-
-          !
-          ! Open the existing file.
-          !
-          CALL h5fopen_f (fix_filename, H5F_ACC_RDWR_F, file_id, error)
-              CALL check("h5fopen_f", error, total_error)
-
-          !
-          ! Open the existing dataset.
-          !
-          CALL h5dopen_f(file_id, dsetname, dset_id, error)
-              CALL check("h5dopen_f", error, total_error)
-          CALL h5dopen_f(file_id, null_dsetname, null_dset, error)
-              CALL check("h5dopen_f", error, total_error)
-
-          ! Test whether space has been allocated for a dataset
-          CALL h5dget_space_status_f(dset_id, flag, error)
-          CALL check("h5dget_space_status_f",error, total_error)
-          CALL verify("h5dget_space_status_f", flag, H5D_SPACE_STS_ALLOCATED_F, total_error)
-
-          CALL h5dget_space_status_f(null_dset, flag, error)
-          CALL check("h5dget_space_status_f",error, total_error)
-          CALL verify("h5dget_space_status_f", flag, H5D_SPACE_STS_NOT_ALLOCATED_F, total_error)
-
-
-          !
-          ! Get the dataset type.
-          !
-          CALL h5dget_type_f(dset_id, dtype_id, error)
-              CALL check("h5dget_type_f", error, total_error)
-
-          !
-          ! Get the data space.
-          !
-          CALL h5dget_space_f(dset_id, dspace_id, error)
-              CALL check("h5dget_space_f", error, total_error)
-
-          !
-          ! Read the dataset.
-          !
-          CALL h5dread_f(dset_id, H5T_NATIVE_INTEGER, data_out, data_dims, error)
-              CALL check("h5dread_f", error, total_error)
-          !
-          ! Read the null dataset.  Nothing should be read.
-          !
-          CALL h5dread_f(null_dset, H5T_NATIVE_INTEGER, null_dset_data, null_data_dim, error)
-              CALL check("h5dread_f", error, total_error)
-
-          !
-          !Compare the data.
-          !
-          do i = 1, 4
-              do j = 1, 6
-                  IF (data_out(i,j) .NE. dset_data(i, j)) THEN
-                      write(*, *) "dataset test error occured"
-                      write(*,*) "data read is not the same as the data written"
-                  END IF
-              end do
-          end do
-
-          !
-          ! Check if no change to null_dset_data
-          !
-          IF (null_dset_data .NE. 1) THEN
-              write(*, *) "null dataset test error occured"
-          END IF
-
-          !
-          ! End access to the dataset and release resources used by it.
-          !
-          CALL h5dclose_f(dset_id, error)
-              CALL check("h5dclose_f", error, total_error)
-          CALL h5dclose_f(null_dset, error)
-              CALL check("h5dclose_f", error, total_error)
-
-          !
-          ! Terminate access to the data space.
-          !
-          CALL h5sclose_f(dspace_id, error)
-              CALL check("h5sclose_f", error, total_error)
-
-          !
-          ! Terminate access to the data type.
-          !
-          CALL h5tclose_f(dtype_id, error)
-              CALL check("h5tclose_f", error, total_error)
-          !
-          ! Close the file.
-          !
-          CALL h5fclose_f(file_id, error)
-              CALL check("h5fclose_f", error, total_error)
-          if(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-              CALL check("h5_cleanup_f", error, total_error)
-
-          RETURN
-        END SUBROUTINE datasettest
-
-!
-!the following subroutine tests h5dextend_f functionality
-!
-
-        SUBROUTINE extenddsettest(cleanup, total_error)
-        USE HDF5 ! This module contains all necessary modules
-        USE TH5_MISC
-
-          IMPLICIT NONE
-
-          LOGICAL, INTENT(IN)  :: cleanup
-          INTEGER, INTENT(OUT) :: total_error
-
-          !
-          !the dataset is stored in file "extf.h5"
-          !
-          CHARACTER(LEN=4), PARAMETER :: filename = "extf"
-          CHARACTER(LEN=80) :: fix_filename
-
-          !
-          !dataset name is "ExtendibleArray"
-          !
-          CHARACTER(LEN=15), PARAMETER :: dsetname = "ExtendibleArray"
-
-          !
-          !dataset rank is 2
-          !
-          INTEGER :: RANK = 2
-
-          INTEGER(HID_T) :: file_id       ! File identifier
-          INTEGER(HID_T) :: dset_id       ! Dataset identifier
-          INTEGER(HID_T) :: dataspace     ! Dataspace identifier
-          INTEGER(HID_T) :: memspace      ! memory Dataspace identifier
-          INTEGER(HID_T) :: crp_list        ! dataset creatation property identifier
-
-          !
-          !dataset dimensions at creation time
-          !
-          INTEGER(HSIZE_T), DIMENSION(2) :: dims = (/3,3/)
-
-          !
-          !data dimensions
-          !
-          INTEGER(HSIZE_T), DIMENSION(2) :: dims1 = (/10,3/)
-
-          !
-          !Maximum dimensions
-          !
-          INTEGER(HSIZE_T), DIMENSION(2) :: maxdims
-
-          !
-          !data arrays for reading and writing
-          !
-          INTEGER, DIMENSION(10,3) :: data_in, data_out
-
-          !
-          !Size of data in the file
-          !
-          INTEGER(HSIZE_T), DIMENSION(2) :: size
-
-          !
-          !general purpose integer
-          !
-          INTEGER :: i, j
-          INTEGER(HSIZE_T) :: ih, jh
-
-          !
-          !flag to check operation success
-          !
-          INTEGER :: error
-
-          !
-          !Variables used in reading data back
-          !
-          INTEGER(HSIZE_T), DIMENSION(2) :: dimsr, maxdimsr
-          INTEGER :: rankr
-          INTEGER(HSIZE_T), DIMENSION(2) :: data_dims
-
-          !
-          !data initialization
-          !
-          do i = 1, 10
-             do j = 1, 3
-                data_in(i,j) = 2
-             end do
-          end do
-
-          !
-          !Initialize FORTRAN predifined datatypes
-          !
-!          CALL h5init_types_f(error)
-!               CALL check("h5init_types_f",error,total_error)
-
-          !
-          !Create a new file using default properties.
-          !
-          CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
-          if (error .ne. 0) then
-              write(*,*) "Cannot modify filename"
-              stop
-          endif
-          CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
-               CALL check("h5fcreate_f",error,total_error)
-
-
-          !
-          !Create the data space with unlimited dimensions.
-          !
-          maxdims = (/H5S_UNLIMITED_F, H5S_UNLIMITED_F/)
-
-          CALL h5screate_simple_f(RANK, dims, dataspace, error, maxdims)
-               CALL check("h5screate_simple_f",error,total_error)
-
-          !
-          !Modify dataset creation properties, i.e. enable chunking
-          !
-          CALL h5pcreate_f(H5P_DATASET_CREATE_F, crp_list, error)
-              CALL check("h5pcreat_f",error,total_error)
-
-          CALL h5pset_chunk_f(crp_list, RANK, dims1, error)
-              CALL check("h5pset_chunk_f",error,total_error)
-
-          !
-          !Create a dataset with 3X3 dimensions using cparms creation propertie .
-          !
-          CALL h5dcreate_f(file_id, dsetname, H5T_NATIVE_INTEGER, dataspace, &
-                           dset_id, error, crp_list )
-              CALL check("h5dcreate_f",error,total_error)
-
-          !
-          !Extend the dataset. This call assures that dataset is 3 x 3.
-          !
-          size(1) = 3
-          size(2) = 3
-          CALL h5dextend_f(dset_id, size, error)
-              CALL check("h5dextend_f",error,total_error)
-
-
-          !
-          !Extend the dataset. Dataset becomes 10 x 3.
-          !
-          size(1)   = 10;
-          size(2)   = 3;
-          CALL h5dextend_f(dset_id, size, error)
-              CALL check("h5dextend_f",error,total_error)
-
-          !
-          !Write the data of size 10X3 to the extended dataset.
-          !
-          data_dims(1) = 10
-          data_dims(2) = 3
-          CALL H5dwrite_f(dset_id, H5T_NATIVE_INTEGER, data_in, data_dims, error)
-               CALL check("h5dwrite_f",error,total_error)
-
-          !
-          !Close the dataspace for the dataset.
-          !
-          CALL h5sclose_f(dataspace, error)
-              CALL check("h5sclose_f",error,total_error)
-
-          !
-          !Close the property list.
-          !
-          CALL h5pclose_f(crp_list, error)
-              CALL check("h5pclose_f",error,total_error)
-          !
-          !Close the dataset.
-          !
-          CALL h5dclose_f(dset_id, error)
-              CALL check("h5dclose_f",error,total_error)
-
-          !
-          !Close the file.
-          !
-          CALL h5fclose_f(file_id, error)
-              CALL check("h5fclose_f",error,total_error)
-
-          !
-          !read the data back
-          !
-          !Open the file.
-          !
-          CALL h5fopen_f (fix_filename, H5F_ACC_RDONLY_F, file_id, error)
-              CALL check("hfopen_f",error,total_error)
-
-          !
-          !Open the  dataset.
-          !
-          CALL h5dopen_f(file_id, dsetname, dset_id, error)
-              CALL check("h5dopen_f",error,total_error)
-
-          !
-          !Get dataset's dataspace handle.
-          !
-          CALL h5dget_space_f(dset_id, dataspace, error)
-              CALL check("h5dget_space_f",error,total_error)
-
-          !
-          !Get dataspace's rank.
-          !
-          CALL h5sget_simple_extent_ndims_f(dataspace, rankr, error)
-              CALL check("h5sget_simple_extent_ndims_f",error,total_error)
-          IF (rankr .NE. RANK) then
-              write(*,*) "dataset rank error occured"
-              stop
-          END IF
-
-          !
-          !Get dataspace's dimensinons.
-          !
-          CALL h5sget_simple_extent_dims_f(dataspace, dimsr, maxdimsr, error)
-              CALL check("h5sget_simple_extent_dims_f",error,total_error)
-          IF ((dimsr(1) .NE. dims1(1)) .OR. (dimsr(2) .NE. dims1(2))) THEN
-              write(*,*) "dataset dimensions error occured"
-              stop
-          END IF
-
-          !
-          !Get creation property list.
-          !
-          CALL h5dget_create_plist_f(dset_id, crp_list, error)
-              CALL check("h5dget_create_plist_f",error,total_error)
-
-
-          !
-          !create memory dataspace.
-          !
-          CALL h5screate_simple_f(rankr, dimsr, memspace, error)
-              CALL check("h5screate_simple_f",error,total_error)
-
-          !
-          !Read data
-          !
-          CALL H5dread_f(dset_id, H5T_NATIVE_INTEGER, data_out, data_dims, error, &
-                    memspace, dataspace)
-              CALL check("h5dread_f",error,total_error)
-
-
-          !
-          !Compare the data.
-          !
-          do ih = 1, dims1(1)
-              do jh = 1, dims1(2)
-                  IF (data_out(ih,jh) .NE. data_in(ih, jh)) THEN
-                      write(*, *) "extend dataset test error occured"
-                      write(*, *) "read value is not the same as the written values"
-                  END IF
-              end do
-          end do
-
-          !
-          !Close the dataspace for the dataset.
-          !
-          CALL h5sclose_f(dataspace, error)
-              CALL check("h5sclose_f",error,total_error)
-
-          !
-          !Close the memspace for the dataset.
-          !
-          CALL h5sclose_f(memspace, error)
-              CALL check("h5sclose_f",error,total_error)
-
-          !
-          !Close the property list.
-          !
-          CALL h5pclose_f(crp_list, error)
-              CALL check("h5pclose_f",error,total_error)
-
-          !
-          !Close the dataset.
-          !
-          CALL h5dclose_f(dset_id, error)
-              CALL check("h5dclose_f",error,total_error)
-
-          !
-          !Close the file.
-          !
-          CALL h5fclose_f(file_id, error)
-              CALL check("h5fclose_f",error,total_error)
-          if(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-              CALL check("h5_cleanup_f", error, total_error)
-
-          RETURN
-        END SUBROUTINE extenddsettest
-END MODULE TH5D
-
diff --git a/fortran/test/tH5E.f90 b/fortran/test/tH5E.F90
similarity index 100%
rename from fortran/test/tH5E.f90
rename to fortran/test/tH5E.F90
diff --git a/fortran/test/tH5E_F03.F90 b/fortran/test/tH5E_F03.F90
new file mode 100644
index 0000000..63e70a3
--- /dev/null
+++ b/fortran/test/tH5E_F03.F90
@@ -0,0 +1,203 @@
+!****h* root/fortran/test/tH5E_F03.f90
+!
+! NAME
+!  tH5E_F03.f90
+!
+! FUNCTION
+!  Test FORTRAN HDF5 H5E APIs which are dependent on FORTRAN 2003
+!  features. 
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! USES
+!  liter_cb_mod
+!
+! CONTAINS SUBROUTINES
+!  test_error
+!
+!*****
+
+! *****************************************
+! ***        H 5 E   T E S T S
+! *****************************************
+MODULE test_my_hdf5_error_handler
+
+  USE HDF5
+  USE TH5_MISC
+  USE TH5_MISC_GEN
+
+CONTAINS
+
+!***************************************************************
+!**
+!**  my_hdf5_error_handler: Custom error callback routine.
+!**
+!***************************************************************
+
+    INTEGER FUNCTION my_hdf5_error_handler(estack_id, data_inout) bind(C)
+
+    ! This error function handle works with only version 2 error stack
+
+    IMPLICIT NONE
+
+    ! estack_id is always passed from C as: H5E_DEFAULT
+    INTEGER(HID_T) :: estack_id
+    ! data that was registered with H5Eset_auto_f
+    INTEGER :: data_inout
+
+    PRINT*, " "
+    PRINT*, " Subtest: H5Eset_auto_f custom error message with callback, WITH DATA"
+    PRINT*, "         -This message should be written to standard out-  "
+    PRINT*, "          Data Values Passed In =", data_inout
+    PRINT*, " "
+
+    data_inout = 10*data_inout
+
+    my_hdf5_error_handler = 1 ! this is not used by the C routine
+
+  END FUNCTION my_hdf5_error_handler
+
+  INTEGER FUNCTION my_hdf5_error_handler_nodata(estack_id, data_inout) bind(C)
+
+    ! This error function handle works with only version 2 error stack
+
+    IMPLICIT NONE
+
+    ! estack_id is always passed from C as: H5E_DEFAULT
+    INTEGER(HID_T) :: estack_id
+    ! data that was registered with H5Eset_auto_f
+    TYPE(C_PTR) :: data_inout
+
+    PRINT*, " "
+    PRINT*, " Subtest: H5Eset_auto_f custom error message with callback, NO DATA"
+    PRINT*, "         -This message should be written to standard out-  "
+    PRINT*, " "
+
+    my_hdf5_error_handler_nodata = 1 ! this is not used by the C routine
+
+  END FUNCTION my_hdf5_error_handler_nodata
+
+END MODULE test_my_hdf5_error_handler
+
+
+
+MODULE TH5E_F03
+
+CONTAINS
+
+SUBROUTINE test_error(total_error)
+
+  USE ISO_C_BINDING
+  USE test_my_hdf5_error_handler
+
+  IMPLICIT NONE
+
+  INTEGER(hid_t), PARAMETER :: FAKE_ID = -1
+  INTEGER :: total_error
+  INTEGER(hid_t) :: file
+  INTEGER(hid_t) :: dataset, space
+  INTEGER(hsize_t), DIMENSION(1:2) :: dims
+  INTEGER :: error
+  INTEGER, DIMENSION(:), POINTER :: ptr_data
+  INTEGER, TARGET :: my_hdf5_error_handler_data
+  TYPE(C_PTR) :: f_ptr
+  TYPE(C_FUNPTR) :: func
+
+  TYPE(C_PTR), TARGET :: f_ptr1
+
+  INTEGER, DIMENSION(1:1) :: array_shape
+
+  my_hdf5_error_handler_data = 99
+  CALL h5fcreate_f("terror.h5", H5F_ACC_TRUNC_F, file, error)
+  CALL check("h5fcreate_f", error, total_error)
+
+  ! Create the data space
+  dims(1) = 10
+  dims(2) = 20
+  CALL H5Screate_simple_f(2, dims, space, error)
+  CALL check("h5screate_simple_f", error, total_error)
+
+  ! ** SET THE CUSTOMIZED PRINTING OF ERROR STACK **
+
+  ! set the customized error handling routine
+  func = c_funloc(my_hdf5_error_handler)
+
+  ! set the data sent to the customized routine
+  f_ptr = c_loc(my_hdf5_error_handler_data)
+
+  ! turn on automatic printing, and use a custom error routine with input data
+  CALL H5Eset_auto_f(1, error, H5E_DEFAULT_F, func, f_ptr)
+
+  ! Create the erring dataset
+  CALL h5dcreate_f(FAKE_ID,"a_dataset",H5T_NATIVE_INTEGER, space, dataset, error)
+  CALL verify("h5dcreate_f", error, -1, total_error)
+
+!!$    CALL verify("H5Eset_auto_f",my_hdf5_error_handler_data(1),10, total_error)
+!!$    CALL verify("H5Eset_auto_f",my_hdf5_error_handler_data(2),20, total_error)
+
+!!$  ! Test enabling and disabling default printing
+!!$
+!!$  CALL H5Eget_auto_f(H5E_DEFAULT_F, func1, f_ptr1, error)
+!!$  CALL verify("H5Eget_auto_f", error, 0, total_error)
+
+  !    PRINT*,c_associated(f_ptr1)
+
+  ALLOCATE(ptr_data(1:2))
+  ptr_data = 0
+  array_shape(1) = 2
+  CALL C_F_POINTER(f_ptr1, ptr_data, array_shape)
+
+  !    ptr_data => f_ptr1(1)
+
+  !    PRINT*,ptr_data(1)
+
+!!$    if(old_data != NULL)
+!!$	TEST_ERROR;
+!!$#ifdef H5_USE_16_API
+!!$    if (old_func != (H5E_auto_t)H5Eprint)
+!!$	TEST_ERROR;
+!!$#else  H5_USE_16_API 
+!!$    if (old_func != (H5E_auto2_t)H5Eprint2)
+!!$	TEST_ERROR;
+!!$#endif  H5_USE_16_API 
+
+
+  ! set the customized error handling routine
+  func = c_funloc(my_hdf5_error_handler_nodata)
+  ! set the data sent to the customized routine as null
+  f_ptr = C_NULL_PTR
+  ! turn on automatic printing, and use a custom error routine with no input data
+  CALL H5Eset_auto_f(1, error, H5E_DEFAULT_F, func, f_ptr)
+
+  CALL h5dcreate_f(FAKE_ID,"a_dataset",H5T_NATIVE_INTEGER, space, dataset, error)
+  CALL verify("h5dcreate_f", error, -1, total_error)
+
+
+  ! turn on automatic printing with h5eprint_f which prints an error stack in the default manner.
+
+  !    func = c_funloc(h5eprint_f)
+  !    CALL H5Eset_auto_f(0, error, H5E_DEFAULT_F, func, C_NULL_PTR)
+
+  CALL H5Eset_auto_f(0, error)
+  CALL h5dcreate_f(FAKE_ID,"a_dataset",H5T_NATIVE_INTEGER, space, dataset, error)
+
+  CALL H5Eset_auto_f(1, error)
+  CALL h5dcreate_f(FAKE_ID,"a_dataset",H5T_NATIVE_INTEGER, space, dataset, error)
+
+END SUBROUTINE test_error
+
+END MODULE TH5E_F03
diff --git a/fortran/test/tH5E_F03.f90 b/fortran/test/tH5E_F03.f90
deleted file mode 100644
index a7d45f2..0000000
--- a/fortran/test/tH5E_F03.f90
+++ /dev/null
@@ -1,206 +0,0 @@
-!****h* root/fortran/test/tH5E_F03.f90
-!
-! NAME
-!  tH5E_F03.f90
-!
-! FUNCTION
-!  Test FORTRAN HDF5 H5E APIs which are dependent on FORTRAN 2003
-!  features. 
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! USES
-!  liter_cb_mod
-!
-! CONTAINS SUBROUTINES
-!  test_error
-!
-!*****
-
-! *****************************************
-! ***        H 5 E   T E S T S
-! *****************************************
-MODULE test_my_hdf5_error_handler
-
-
-CONTAINS
-
-!***************************************************************
-!**
-!**  my_hdf5_error_handler: Custom error callback routine.
-!**
-!***************************************************************
-
-    INTEGER FUNCTION my_hdf5_error_handler(estack_id, data_inout) bind(C)
-
-    ! This error function handle works with only version 2 error stack
-
-    USE HDF5
-    USE ISO_C_BINDING
-    IMPLICIT NONE
-
-    ! estack_id is always passed from C as: H5E_DEFAULT
-    INTEGER(HID_T) :: estack_id
-    ! data that was registered with H5Eset_auto_f
-    INTEGER :: data_inout
-
-    PRINT*, " "
-    PRINT*, " Subtest: H5Eset_auto_f custom error message with callback, WITH DATA"
-    PRINT*, "         -This message should be written to standard out-  "
-    PRINT*, "          Data Values Passed In =", data_inout
-    PRINT*, " "
-
-    data_inout = 10*data_inout
-
-    my_hdf5_error_handler = 1 ! this is not used by the C routine
-
-  END FUNCTION my_hdf5_error_handler
-
-  INTEGER FUNCTION my_hdf5_error_handler_nodata(estack_id, data_inout) bind(C)
-
-    ! This error function handle works with only version 2 error stack
-
-    USE HDF5
-    USE ISO_C_BINDING
-    IMPLICIT NONE
-
-    ! estack_id is always passed from C as: H5E_DEFAULT
-    INTEGER(HID_T) :: estack_id
-    ! data that was registered with H5Eset_auto_f
-    TYPE(C_PTR) :: data_inout
-
-    PRINT*, " "
-    PRINT*, " Subtest: H5Eset_auto_f custom error message with callback, NO DATA"
-    PRINT*, "         -This message should be written to standard out-  "
-    PRINT*, " "
-
-    my_hdf5_error_handler_nodata = 1 ! this is not used by the C routine
-
-  END FUNCTION my_hdf5_error_handler_nodata
-
-END MODULE test_my_hdf5_error_handler
-
-
-
-MODULE TH5E_F03
-
-CONTAINS
-
-SUBROUTINE test_error(total_error)
-
-  USE HDF5 
-  USE TH5_MISC
-  USE ISO_C_BINDING
-  USE test_my_hdf5_error_handler
-
-  IMPLICIT NONE
-
-  INTEGER(hid_t), PARAMETER :: FAKE_ID = -1
-  INTEGER :: total_error
-  INTEGER(hid_t) :: file
-  INTEGER(hid_t) :: dataset, space
-  INTEGER(hsize_t), DIMENSION(1:2) :: dims
-  INTEGER :: error
-  INTEGER, DIMENSION(:), POINTER :: ptr_data
-  INTEGER, TARGET :: my_hdf5_error_handler_data
-  TYPE(C_PTR) :: f_ptr
-  TYPE(C_FUNPTR) :: func
-
-  TYPE(C_PTR), TARGET :: f_ptr1
-
-  INTEGER, DIMENSION(1:1) :: array_shape
-
-  my_hdf5_error_handler_data = 99
-  CALL h5fcreate_f("terror.h5", H5F_ACC_TRUNC_F, file, error)
-  CALL check("h5fcreate_f", error, total_error)
-
-  ! Create the data space
-  dims(1) = 10
-  dims(2) = 20
-  CALL H5Screate_simple_f(2, dims, space, error)
-  CALL check("h5screate_simple_f", error, total_error)
-
-  ! ** SET THE CUSTOMIZED PRINTING OF ERROR STACK **
-
-  ! set the customized error handling routine
-  func = c_funloc(my_hdf5_error_handler)
-
-  ! set the data sent to the customized routine
-  f_ptr = c_loc(my_hdf5_error_handler_data)
-
-  ! turn on automatic printing, and use a custom error routine with input data
-  CALL H5Eset_auto_f(1, error, H5E_DEFAULT_F, func, f_ptr)
-
-  ! Create the erring dataset
-  CALL h5dcreate_f(FAKE_ID,"a_dataset",H5T_NATIVE_INTEGER, space, dataset, error)
-  CALL VERIFY("h5dcreate_f", error, -1, total_error)
-
-!!$    CALL VERIFY("H5Eset_auto_f",my_hdf5_error_handler_data(1),10, total_error)
-!!$    CALL VERIFY("H5Eset_auto_f",my_hdf5_error_handler_data(2),20, total_error)
-
-!!$  ! Test enabling and disabling default printing
-!!$
-!!$  CALL H5Eget_auto_f(H5E_DEFAULT_F, func1, f_ptr1, error)
-!!$  CALL VERIFY("H5Eget_auto_f", error, 0, total_error)
-
-  !    PRINT*,c_associated(f_ptr1)
-
-  ALLOCATE(ptr_data(1:2))
-  ptr_data = 0
-  array_shape(1) = 2
-  CALL C_F_POINTER(f_ptr1, ptr_data, array_shape)
-
-  !    ptr_data => f_ptr1(1)
-
-  !    PRINT*,ptr_data(1)
-
-!!$    if(old_data != NULL)
-!!$	TEST_ERROR;
-!!$#ifdef H5_USE_16_API
-!!$    if (old_func != (H5E_auto_t)H5Eprint)
-!!$	TEST_ERROR;
-!!$#else  H5_USE_16_API 
-!!$    if (old_func != (H5E_auto2_t)H5Eprint2)
-!!$	TEST_ERROR;
-!!$#endif  H5_USE_16_API 
-
-
-  ! set the customized error handling routine
-  func = c_funloc(my_hdf5_error_handler_nodata)
-  ! set the data sent to the customized routine as null
-  f_ptr = C_NULL_PTR
-  ! turn on automatic printing, and use a custom error routine with no input data
-  CALL H5Eset_auto_f(1, error, H5E_DEFAULT_F, func, f_ptr)
-
-  CALL h5dcreate_f(FAKE_ID,"a_dataset",H5T_NATIVE_INTEGER, space, dataset, error)
-  CALL VERIFY("h5dcreate_f", error, -1, total_error)
-
-
-  ! turn on automatic printing with h5eprint_f which prints an error stack in the default manner.
-
-  !    func = c_funloc(h5eprint_f)
-  !    CALL H5Eset_auto_f(0, error, H5E_DEFAULT_F, func, C_NULL_PTR)
-
-  CALL H5Eset_auto_f(0, error)
-  CALL h5dcreate_f(FAKE_ID,"a_dataset",H5T_NATIVE_INTEGER, space, dataset, error)
-
-  CALL H5Eset_auto_f(1, error)
-  CALL h5dcreate_f(FAKE_ID,"a_dataset",H5T_NATIVE_INTEGER, space, dataset, error)
-
-END SUBROUTINE test_error
-
-END MODULE TH5E_F03
diff --git a/fortran/test/tH5F.f90 b/fortran/test/tH5F.F90
similarity index 100%
rename from fortran/test/tH5F.f90
rename to fortran/test/tH5F.F90
diff --git a/fortran/test/tH5F_F03.F90 b/fortran/test/tH5F_F03.F90
new file mode 100644
index 0000000..9e23d19
--- /dev/null
+++ b/fortran/test/tH5F_F03.F90
@@ -0,0 +1,179 @@
+!****h* root/fortran/test/tH5F_F03.f90
+!
+! NAME
+!  tH5F_F03.f90
+!
+! FUNCTION
+!  Test FORTRAN HDF5 H5F APIs which are dependent on FORTRAN 2003
+!  features. 
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! NOTES
+!  Tests the H5F APIs functionalities of:
+!    h5fget_file_image_f
+!
+! CONTAINS SUBROUTINES
+!  test_get_file_image
+!
+!*****
+
+! *****************************************
+! ***        H 5 F   T E S T S
+! *****************************************
+
+MODULE TH5F_F03
+
+  USE HDF5
+  USE TH5_MISC 
+  USE TH5_MISC_GEN 
+  USE ISO_C_BINDING
+
+CONTAINS
+
+SUBROUTINE test_get_file_image(total_error)
+  !
+  !  Tests the wrapper for h5fget_file_image
+  !
+  IMPLICIT NONE
+
+  INTEGER, INTENT(INOUT) :: total_error ! returns error
+
+  CHARACTER(kind=c_char), ALLOCATABLE, DIMENSION(:), TARGET :: file_image_ptr ! Image from file
+  CHARACTER(kind=c_char), ALLOCATABLE, DIMENSION(:), TARGET :: image_ptr ! Image from h5fget_file_image_f
+
+  INTEGER, DIMENSION(1:100), TARGET :: data ! Write data
+  INTEGER :: i, file_sz
+  INTEGER(hid_t) :: file_id = -1  ! File identifier
+  INTEGER(hid_t) :: dset_id = -1  ! Dataset identifier
+  INTEGER(hid_t) :: space_id = -1 ! Dataspace identifier
+  INTEGER(hsize_t), DIMENSION(1:2) :: dims  ! Dataset dimensions
+  INTEGER(size_t) :: itmp_a, itmp_b ! General purpose integers
+  INTEGER(size_t) :: image_size     ! Size of image
+  TYPE(C_PTR) :: f_ptr            ! Pointer
+  INTEGER(hid_t) :: fapl          ! File access property
+  INTEGER :: error                ! Error flag
+
+  ! Create new properties for file access
+  CALL h5pcreate_f(H5P_FILE_ACCESS_F, fapl, error)
+  CALL check("h5pcreate_f", error, total_error)
+
+  ! Set standard I/O driver
+  CALL h5pset_fapl_stdio_f(fapl, error)
+  CALL check("h5pset_fapl_stdio_f", error, total_error)
+
+  ! Create the file
+  CALL h5fcreate_f("tget_file_image.h5", H5F_ACC_TRUNC_F, file_id, error, H5P_DEFAULT_F, fapl)
+  CALL check("h5fcreate_f", error, total_error)
+
+  ! Set up data space for new data set 
+  dims(1:2) = (/10,10/)
+    
+  CALL h5screate_simple_f(2, dims,  space_id, error)
+  CALL check("h5screate_simple_f", error, total_error)
+
+  ! Create a dataset 
+  CALL h5dcreate_f(file_id, "dset 0", H5T_NATIVE_INTEGER, space_id, dset_id, error)
+  CALL check("h5dcreate_f", error, total_error)
+
+  ! Write some data to the data set 
+  DO i = 1, 100
+     data(i) = i
+  ENDDO
+  
+  f_ptr = C_LOC(data(1))
+  CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, f_ptr, error)
+  CALL check("h5dwrite_f",error, total_error)
+
+  ! Flush the file
+  CALL h5fflush_f(file_id, H5F_SCOPE_GLOBAL_F, error)
+  CALL check("h5fflush_f",error, total_error)
+
+  ! Open the test file using standard I/O calls 
+  OPEN(UNIT=10,FILE='tget_file_image.h5', ACCESS='STREAM')
+  ! Get the size of the test file
+  !
+  ! Since we use the eoa to calculate the image size, the file size
+  ! may be larger.  This is OK, as long as (in this specialized instance)
+  ! the remainder of the file is all '\0's.
+  !
+  ! With latest mods to truncate call in core file drive, 
+  ! file size should match image size; get the file size 
+  INQUIRE(UNIT=10, SIZE=file_sz)
+  CLOSE(UNIT=10)
+
+  ! I. Get buffer size needed to hold the buffer
+
+  !  A. Preferred way to get the size
+  f_ptr = C_NULL_PTR
+  CALL h5fget_file_image_f(file_id, f_ptr, INT(0, size_t), error, image_size)
+  CALL check("h5fget_file_image_f",error, total_error)
+  CALL verify("h5fget_file_image_f", file_sz, INT(image_size), total_error)
+
+  !  B. f_ptr set to point to an incorrect buffer, should pass anyway
+  f_ptr = C_LOC(data(1))
+  itmp_a = 1
+  CALL h5fget_file_image_f(file_id, f_ptr, itmp_a, error, image_size)
+  CALL check("h5fget_file_image_f",error, total_error)
+  CALL verify("h5fget_file_image_f", INT(itmp_a), 1, total_error) ! Routine should not change the value
+  CALL verify("h5fget_file_image_f", file_sz, INT(image_size), total_error)
+
+  ! Allocate a buffer of the appropriate size 
+  ALLOCATE(image_ptr(1:image_size))
+
+  ! Load the image of the file into the buffer
+  f_ptr = C_LOC(image_ptr(1)(1:1))
+  CALL h5fget_file_image_f(file_id, f_ptr, image_size, error)
+  CALL check("h5fget_file_image_f",error, total_error)
+
+  ! Close dset and space 
+  CALL h5dclose_f(dset_id, error)
+  CALL check("h5dclose_f", error, total_error)
+  CALL h5sclose_f(space_id, error)
+  CALL check("h5sclose_f", error, total_error)
+  ! Close the test file
+  CALL h5fclose_f(file_id, error)
+  CALL check("h5fclose_f",error, total_error)
+
+  ! Allocate a buffer for the test file image
+  ALLOCATE(file_image_ptr(1:image_size))
+
+  ! Open the test file using standard I/O calls 
+  OPEN(UNIT=10,FILE='tget_file_image.h5', FORM='UNFORMATTED', ACCESS='STREAM')
+
+  ! Read the test file from disk into the buffer
+  DO i = 1, image_size
+     READ(10) file_image_ptr(i)
+  ENDDO
+
+  CLOSE(10)
+
+  ! verify the file and the image contain the same data
+  DO i = 1, image_size
+     ! convert one byte to an unsigned integer
+     IF( ICHAR(file_image_ptr(i)) .NE. ICHAR(image_ptr(i)))THEN
+        total_error = total_error + 1
+        EXIT
+     ENDIF
+  ENDDO
+
+  ! release resources
+  DEALLOCATE(file_image_ptr,image_ptr)
+
+END SUBROUTINE test_get_file_image
+
+END MODULE TH5F_F03
diff --git a/fortran/test/tH5F_F03.f90 b/fortran/test/tH5F_F03.f90
deleted file mode 100644
index c878a59..0000000
--- a/fortran/test/tH5F_F03.f90
+++ /dev/null
@@ -1,178 +0,0 @@
-!****h* root/fortran/test/tH5F_F03.f90
-!
-! NAME
-!  tH5F_F03.f90
-!
-! FUNCTION
-!  Test FORTRAN HDF5 H5F APIs which are dependent on FORTRAN 2003
-!  features. 
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!  Tests the H5F APIs functionalities of:
-!    h5fget_file_image_f
-!
-! CONTAINS SUBROUTINES
-!  test_get_file_image
-!
-!*****
-
-! *****************************************
-! ***        H 5 F   T E S T S
-! *****************************************
-
-MODULE TH5F_F03
-
-CONTAINS
-
-SUBROUTINE test_get_file_image(total_error)
-  !
-  !  Tests the wrapper for h5fget_file_image
-  !
-  USE HDF5
-  USE TH5_MISC 
-  USE ISO_C_BINDING
-
-  IMPLICIT NONE
-
-  INTEGER, INTENT(INOUT) :: total_error ! returns error
-
-  CHARACTER(kind=c_char), ALLOCATABLE, DIMENSION(:), TARGET :: file_image_ptr ! Image from file
-  CHARACTER(kind=c_char), ALLOCATABLE, DIMENSION(:), TARGET :: image_ptr ! Image from h5fget_file_image_f
-
-  INTEGER, DIMENSION(1:100), TARGET :: data ! Write data
-  INTEGER :: i, file_sz
-  INTEGER(hid_t) :: file_id = -1  ! File identifier
-  INTEGER(hid_t) :: dset_id = -1  ! Dataset identifier
-  INTEGER(hid_t) :: space_id = -1 ! Dataspace identifier
-  INTEGER(hsize_t), DIMENSION(1:2) :: dims  ! Dataset dimensions
-  INTEGER(size_t) :: itmp_a, itmp_b ! General purpose integers
-  INTEGER(size_t) :: image_size     ! Size of image
-  TYPE(C_PTR) :: f_ptr            ! Pointer
-  INTEGER(hid_t) :: fapl          ! File access property
-  INTEGER :: error                ! Error flag
-
-  ! Create new properties for file access
-  CALL h5pcreate_f(H5P_FILE_ACCESS_F, fapl, error)
-  CALL check("h5pcreate_f", error, total_error)
-
-  ! Set standard I/O driver
-  CALL h5pset_fapl_stdio_f(fapl, error)
-  CALL check("h5pset_fapl_stdio_f", error, total_error)
-
-  ! Create the file
-  CALL h5fcreate_f("tget_file_image.h5", H5F_ACC_TRUNC_F, file_id, error, H5P_DEFAULT_F, fapl)
-  CALL check("h5fcreate_f", error, total_error)
-
-  ! Set up data space for new data set 
-  dims(1:2) = (/10,10/)
-    
-  CALL h5screate_simple_f(2, dims,  space_id, error)
-  CALL check("h5screate_simple_f", error, total_error)
-
-  ! Create a dataset 
-  CALL h5dcreate_f(file_id, "dset 0", H5T_NATIVE_INTEGER, space_id, dset_id, error)
-  CALL check("h5dcreate_f", error, total_error)
-
-  ! Write some data to the data set 
-  DO i = 1, 100
-     data(i) = i
-  ENDDO
-  
-  f_ptr = C_LOC(data(1))
-  CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, f_ptr, error)
-  CALL check("h5dwrite_f",error, total_error)
-
-  ! Flush the file
-  CALL h5fflush_f(file_id, H5F_SCOPE_GLOBAL_F, error)
-  CALL check("h5fflush_f",error, total_error)
-
-  ! Open the test file using standard I/O calls 
-  OPEN(UNIT=10,FILE='tget_file_image.h5', ACCESS='STREAM')
-  ! Get the size of the test file
-  !
-  ! Since we use the eoa to calculate the image size, the file size
-  ! may be larger.  This is OK, as long as (in this specialized instance)
-  ! the remainder of the file is all '\0's.
-  !
-  ! With latest mods to truncate call in core file drive, 
-  ! file size should match image size; get the file size 
-  INQUIRE(UNIT=10, SIZE=file_sz)
-  CLOSE(UNIT=10)
-
-  ! I. Get buffer size needed to hold the buffer
-
-  !  A. Preferred way to get the size
-  f_ptr = C_NULL_PTR
-  CALL h5fget_file_image_f(file_id, f_ptr, INT(0, size_t), error, image_size)
-  CALL check("h5fget_file_image_f",error, total_error)
-  CALL verify("h5fget_file_image_f", file_sz, INT(image_size), total_error)
-
-  !  B. f_ptr set to point to an incorrect buffer, should pass anyway
-  f_ptr = C_LOC(data(1))
-  itmp_a = 1
-  CALL h5fget_file_image_f(file_id, f_ptr, itmp_a, error, image_size)
-  CALL check("h5fget_file_image_f",error, total_error)
-  CALL VERIFY("h5fget_file_image_f", INT(itmp_a), 1, total_error) ! Routine should not change the value
-  CALL VERIFY("h5fget_file_image_f", file_sz, INT(image_size), total_error)
-
-  ! Allocate a buffer of the appropriate size 
-  ALLOCATE(image_ptr(1:image_size))
-
-  ! Load the image of the file into the buffer
-  f_ptr = C_LOC(image_ptr(1)(1:1))
-  CALL h5fget_file_image_f(file_id, f_ptr, image_size, error)
-  CALL check("h5fget_file_image_f",error, total_error)
-
-  ! Close dset and space 
-  CALL h5dclose_f(dset_id, error)
-  CALL check("h5dclose_f", error, total_error)
-  CALL h5sclose_f(space_id, error)
-  CALL check("h5sclose_f", error, total_error)
-  ! Close the test file
-  CALL h5fclose_f(file_id, error)
-  CALL check("h5fclose_f",error, total_error)
-
-  ! Allocate a buffer for the test file image
-  ALLOCATE(file_image_ptr(1:image_size))
-
-  ! Open the test file using standard I/O calls 
-  OPEN(UNIT=10,FILE='tget_file_image.h5', FORM='UNFORMATTED', ACCESS='STREAM')
-
-  ! Read the test file from disk into the buffer
-  DO i = 1, image_size
-     READ(10) file_image_ptr(i)
-  ENDDO
-
-  CLOSE(10)
-
-  ! verify the file and the image contain the same data
-  DO i = 1, image_size
-     ! convert one byte to an unsigned integer
-     IF( ICHAR(file_image_ptr(i)) .NE. ICHAR(image_ptr(i)))THEN
-        total_error = total_error + 1
-        EXIT
-     ENDIF
-  ENDDO
-
-  ! release resources
-  DEALLOCATE(file_image_ptr,image_ptr)
-
-END SUBROUTINE test_get_file_image
-
-END MODULE TH5F_F03
diff --git a/fortran/test/tH5G.f90 b/fortran/test/tH5G.F90
similarity index 100%
rename from fortran/test/tH5G.f90
rename to fortran/test/tH5G.F90
diff --git a/fortran/test/tH5G_1_8.F90 b/fortran/test/tH5G_1_8.F90
new file mode 100644
index 0000000..ddc3736
--- /dev/null
+++ b/fortran/test/tH5G_1_8.F90
@@ -0,0 +1,2126 @@
+!****h* root/fortran/test/tH5G_1_8.f90
+!
+! NAME
+!  tH5G_1_8.f90
+!
+! FUNCTION
+!  Basic testing of Fortran H5G APIs introduced in 1.8.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! CONTAINS SUBROUTINES
+!  group_test, group_info, timestamps, mklinks, test_move_preserves, lifecycle
+!  cklinks, delete_by_idx, link_info_by_idx_check, test_lcpl, objcopy, 
+!  lapl_nlinks
+!
+!*****
+
+MODULE TH5G_1_8
+
+  USE HDF5
+  USE TH5_MISC
+  USE TH5_MISC_GEN
+
+CONTAINS
+
+SUBROUTINE group_test(cleanup, total_error)
+
+  IMPLICIT NONE
+  LOGICAL, INTENT(IN)  :: cleanup
+  INTEGER, INTENT(INOUT) :: total_error
+
+  INTEGER(HID_T) :: fapl, fapl2, my_fapl !  File access property lists 
+
+  INTEGER :: error, ret_total_error
+
+!  WRITE(*,*) "TESTING GROUPS"
+  CALL H5Pcreate_f(H5P_FILE_ACCESS_F, fapl, error)
+  CALL check("H5Pcreate_f",error, total_error)
+
+  !  Copy the file access property list 
+  CALL H5Pcopy_f(fapl, fapl2, error)
+  CALL check("H5Pcopy_f",error, total_error)
+
+  !  Set the "use the latest version of the format" bounds for creating objects in the file 
+  CALL H5Pset_libver_bounds_f(fapl2, H5F_LIBVER_LATEST_F, H5F_LIBVER_LATEST_F, error)
+  CALL check("H5Pset_libver_bounds_f",error, total_error)
+
+  !  Check for FAPL to USE 
+  my_fapl = fapl2
+
+  ret_total_error = 0
+  CALL mklinks(fapl2, ret_total_error)
+  CALL write_test_status(ret_total_error, &
+       ' Testing building a file with assorted links', &
+       total_error)
+
+  ret_total_error = 0
+  CALL cklinks(fapl2, ret_total_error)
+  CALL write_test_status(ret_total_error, &
+       ' Testing links are correct and building assorted links', &
+       total_error)
+
+  ret_total_error = 0
+  CALL group_info(cleanup, fapl2, ret_total_error)
+  CALL write_test_status(ret_total_error, &
+       ' Testing create group with creation order indices, test querying group info', &
+       total_error)
+
+! CALL ud_hard_links(fapl2,total_error)
+  ret_total_error = 0
+  CALL timestamps(cleanup, fapl2, ret_total_error)
+  CALL write_test_status(ret_total_error, &
+       ' Testing disabling tracking timestamps for an object', &
+       total_error)
+
+  ret_total_error = 0
+  CALL test_move_preserves(fapl2, ret_total_error)
+  CALL write_test_status(ret_total_error, &
+       ' Testing moving and renaming links preserves their properties', &
+       total_error)
+
+  ret_total_error = 0
+  CALL delete_by_idx(cleanup,fapl2,ret_total_error)
+  CALL write_test_status(ret_total_error, &
+       ' Testing deleting links by index', &
+       total_error)
+
+  ret_total_error = 0
+  CALL test_lcpl(cleanup, fapl, ret_total_error)
+  CALL write_test_status(ret_total_error, &
+       ' Testing link creation property lists', &
+       total_error)
+
+  ret_total_error = 0
+  CALL objcopy(fapl, ret_total_error)
+  CALL write_test_status(ret_total_error, &
+       ' Testing object copy', &
+       total_error)
+
+  ret_total_error = 0
+  CALL lifecycle(cleanup, fapl2, ret_total_error)
+  CALL write_test_status(ret_total_error, &
+       ' Testing adding links to a group follow proper "lifecycle"', &
+       total_error)
+
+  IF(cleanup) CALL h5_cleanup_f("TestLinks", H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+
+
+END SUBROUTINE group_test
+
+!-------------------------------------------------------------------------
+! * Function:    group_info
+! *
+! * Purpose:     Create a group with creation order indices and test querying
+! *              group info.
+! *
+! * Return:      Success:        0
+! *              Failure:        -1
+! *
+! * Programmer:  Adapted from C test routines by
+! *              M.S. Breitenfeld
+! *              February 18, 2008
+! *
+! *-------------------------------------------------------------------------
+! 
+
+SUBROUTINE group_info(cleanup, fapl, total_error)
+
+  IMPLICIT NONE
+  INTEGER, INTENT(INOUT) :: total_error
+  INTEGER(HID_T), INTENT(IN) :: fapl
+
+  INTEGER(HID_T) :: gcpl_id !  Group creation property list ID 
+
+  INTEGER :: max_compact !  Maximum # of links to store in group compactly 
+  INTEGER :: min_dense !  Minimum # of links to store in group "densely" 
+
+  INTEGER :: idx_type !  Type of index to operate on 
+  INTEGER :: order, iorder   !  Order within in the index 
+  LOGICAL, DIMENSION(1:2) :: use_index = (/.FALSE.,.TRUE./) !  Use index on creation order values 
+  CHARACTER(LEN=6), PARAMETER :: prefix = 'links0'
+  CHARACTER(LEN=9), PARAMETER :: filename = prefix//'.h5'  !  File name 
+  INTEGER :: Input1
+  INTEGER(HID_T) :: group_id !  Group ID 
+  INTEGER(HID_T) :: soft_group_id !  Group ID for soft links 
+
+  INTEGER :: i !  Local index variables 
+  INTEGER :: storage_type ! Type of storage for links in group:
+                                          ! H5G_STORAGE_TYPE_COMPACT: Compact storage
+                                          ! H5G_STORAGE_TYPE_DENSE: Indexed storage
+                                          ! H5G_STORAGE_TYPE_SYMBOL_TABLE: Symbol tables, the original HDF5 structure
+  INTEGER :: nlinks ! Number of links in group
+  INTEGER :: max_corder ! Current maximum creation order value for group
+
+  INTEGER :: u,v  !  Local index variables 
+  CHARACTER(LEN=2) :: chr2
+  INTEGER(HID_T) :: group_id2, group_id3 !  Group IDs 
+  CHARACTER(LEN=7) :: objname !  Object name 
+  CHARACTER(LEN=7) :: objname2 !  Object name 
+  CHARACTER(LEN=19) :: valname !   Link value 
+  CHARACTER(LEN=12), PARAMETER :: CORDER_GROUP_NAME = "corder_group"
+  CHARACTER(LEN=17), PARAMETER :: CORDER_SOFT_GROUP_NAME =  "corder_soft_group"
+  INTEGER(HID_T) :: file_id !  File ID 
+  INTEGER :: error !  Generic return value 
+  LOGICAL :: mounted
+  LOGICAL :: cleanup
+
+  !  Create group creation property list 
+  CALL H5Pcreate_f(H5P_GROUP_CREATE_F, gcpl_id, error )
+  CALL check("H5Pcreate_f", error, total_error)
+
+  !  Query the group creation properties 
+  CALL H5Pget_link_phase_change_f(gcpl_id, max_compact, min_dense, error)
+  CALL check("H5Pget_link_phase_change_f", error, total_error)
+
+  !  Loop over operating on different indices on link fields 
+  DO idx_type = H5_INDEX_NAME_F, H5_INDEX_CRT_ORDER_F
+     !  Loop over operating in different orders 
+     DO iorder = H5_ITER_INC_F,  H5_ITER_NATIVE_F
+        !  Loop over using index for creation order value 
+        DO i = 1, 2
+           !  Print appropriate test message 
+           IF(idx_type == H5_INDEX_CRT_ORDER_F)THEN
+              IF(iorder == H5_ITER_INC_F)THEN
+                 order = H5_ITER_INC_F
+!!$                 IF(use_index(i))THEN
+!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in increasing order w/creation order index"
+!!$                 ELSE
+!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in increasing order w/o creation order index"
+!!$                 ENDIF
+              ELSE IF (iorder == H5_ITER_DEC_F) THEN
+                 order = H5_ITER_DEC_F
+!!$                 IF(use_index(i))THEN
+!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in decreasing order w/creation order index"
+!!$                 ELSE
+!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in decreasing order w/o creation order index"
+!!$                 ENDIF
+              ELSE
+                 order = H5_ITER_NATIVE_F
+!!$                 IF(use_index(i))THEN
+!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in native order w/creation order index"
+!!$                 ELSE
+!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in native order w/o creation order index"
+!!$                 ENDIF
+              ENDIF
+           ELSE
+              IF(iorder == H5_ITER_INC_F)THEN
+                 order = H5_ITER_INC_F
+!!$                 IF(use_index(i))THEN
+!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in increasing order w/creation order index"
+!!$                 ELSE
+!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in increasing order w/o creation order index"
+!!$                 ENDIF
+              ELSE IF (iorder == H5_ITER_DEC_F) THEN
+                 order = H5_ITER_DEC_F
+!!$                 IF(use_index(i))THEN
+!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in decreasing order w/creation order index"
+!!$                 ELSE
+!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in decreasing order w/o creation order index"
+!!$                 ENDIF
+              ELSE
+                 order = H5_ITER_NATIVE_F
+!!$                 IF(use_index(i))THEN
+!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in native order w/creation order index"
+!!$                 ELSE
+!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in native order w/o creation order index"
+!!$                 ENDIF
+              ENDIF
+           END IF
+
+           !  Create file 
+           CALL H5Fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, error, H5P_DEFAULT_F, fapl)
+           CALL check("H5Fcreate_f", error, total_error)
+
+           !  Set creation order tracking & indexing on group 
+           IF(use_index(i))THEN
+              Input1 = H5P_CRT_ORDER_INDEXED_F
+           ELSE
+              Input1 = 0
+           ENDIF
+           CALL H5Pset_link_creation_order_f(gcpl_id, IOR(H5P_CRT_ORDER_TRACKED_F, Input1), error)
+           CALL check("H5Pset_link_creation_order_f", error, total_error)
+
+           !  Create group with creation order tracking on 
+           CALL H5Gcreate_f(file_id, CORDER_GROUP_NAME, group_id, error, gcpl_id=gcpl_id)
+           CALL check("H5Gcreate_f", error, total_error)
+
+           !  Create group with creation order tracking on for soft links 
+           CALL H5Gcreate_f(file_id, CORDER_SOFT_GROUP_NAME, soft_group_id, error, &
+                OBJECT_NAMELEN_DEFAULT_F, H5P_DEFAULT_F, gcpl_id)
+           CALL check("H5Gcreate_f", error, total_error)
+
+           !  Check for out of bound query by index on empty group, should fail 
+           CALL H5Gget_info_by_idx_f(group_id, ".", H5_INDEX_NAME_F, order, INT(0,HSIZE_T), &
+                storage_type, nlinks, max_corder, error)
+           CALL verify("H5Gget_info_by_idx_f", error, -1, total_error)
+
+           !  Create several links, up to limit of compact form 
+           DO u = 0, max_compact-1
+
+              !  Make name for link 
+              WRITE(chr2,'(I2.2)') u
+              objname = 'fill '//chr2
+
+              !  Create hard link, with group object 
+              CALL H5Gcreate_f(group_id, objname, group_id2, error, OBJECT_NAMELEN_DEFAULT_F, H5P_DEFAULT_F, gcpl_id)
+              CALL check("H5Gcreate_f", error, total_error)
+
+              !  Retrieve group's information 
+              CALL H5Gget_info_f(group_id2, storage_type, nlinks, max_corder, error, mounted)
+              CALL check("H5Gget_info_f", error, total_error)
+
+              !  Check (new/empty) group's information 
+              CALL verify("H5Gget_info_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
+              CALL verify("H5Gget_info_f", max_corder, 0, total_error)
+              CALL verify("H5Gget_info_f", nlinks, 0, total_error)
+              CALL verify("H5Gget_info_f.mounted", mounted,.FALSE.,total_error)
+
+              !  Retrieve group's information 
+              CALL H5Gget_info_by_name_f(group_id, objname, storage_type, nlinks, max_corder, error, mounted=mounted)
+              CALL check("H5Gget_info_by_name_f", error, total_error)
+
+              !  Check (new/empty) group's information 
+              CALL verify("H5Gget_info_by_name_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
+              CALL verify("H5Gget_info_by_name_f", max_corder, 0, total_error)
+              CALL verify("H5Gget_info_by_name_f", nlinks, 0, total_error)
+              CALL verify("H5Gget_info_by_name_f.mounted", mounted,.FALSE.,total_error)
+
+              !  Retrieve group's information 
+              CALL H5Gget_info_by_name_f(group_id2, ".", storage_type, nlinks, max_corder, error)
+              CALL check("H5Gget_info_by_name", error, total_error)
+
+              !  Check (new/empty) group's information 
+              CALL verify("H5Gget_info_by_name_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
+              CALL verify("H5Gget_info_by_name_f", max_corder, 0, total_error)
+              CALL verify("H5Gget_info_by_name_f", nlinks, 0, total_error)
+
+              !  Create objects in new group created 
+              DO v = 0, u
+                 !  Make name for link 
+                 WRITE(chr2,'(I2.2)') v
+                 objname2 = 'fill '//chr2
+
+                 !  Create hard link, with group object 
+                 CALL H5Gcreate_f(group_id2, objname2, group_id3, error )
+                 CALL check("H5Gcreate_f", error, total_error)
+
+                 !  Close group created 
+                 CALL H5Gclose_f(group_id3, error)
+                 CALL check("H5Gclose_f", error, total_error)
+              ENDDO
+
+              !  Retrieve group's information 
+              CALL H5Gget_info_f(group_id2, storage_type, nlinks, max_corder, error)
+              CALL check("H5Gget_info_f", error, total_error)
+
+              !  Check (new) group's information 
+              CALL verify("H5Gget_info_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
+              CALL verify("H5Gget_info_f", max_corder, u+1, total_error)
+              CALL verify("H5Gget_info_f", nlinks, u+1, total_error)
+
+              !  Retrieve group's information 
+              CALL H5Gget_info_by_name_f(group_id, objname, storage_type, nlinks, max_corder, error)
+              CALL check("H5Gget_info_by_name_f", error, total_error)
+
+              !  Check (new) group's information 
+              CALL verify("H5Gget_info_by_name_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
+              CALL verify("H5Gget_info_by_name_f",max_corder, u+1, total_error)
+              CALL verify("H5Gget_info_by_name_f", nlinks, u+1, total_error)
+
+              !  Retrieve group's information 
+              CALL H5Gget_info_by_name_f(group_id2, ".", storage_type, nlinks, max_corder, error)
+              CALL check("H5Gget_info_by_name_f", error, total_error)
+
+              !  Check (new) group's information 
+              CALL verify("H5Gget_info_by_name_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
+              CALL verify("H5Gget_info_by_name_f", max_corder, u+1, total_error)
+              CALL verify("H5Gget_info_by_name_f", nlinks, u+1, total_error)
+
+              !  Retrieve group's information 
+              IF(order.NE.H5_ITER_NATIVE_F)THEN
+                 IF(order.EQ.H5_ITER_INC_F) THEN
+                    CALL H5Gget_info_by_idx_f(group_id, ".", idx_type, order, INT(u,HSIZE_T), &
+                         storage_type, nlinks, max_corder, error,lapl_id=H5P_DEFAULT_F, mounted=mounted)
+                    CALL check("H5Gget_info_by_idx_f", error, total_error)
+                    CALL verify("H5Gget_info_by_idx_f", mounted,.FALSE.,total_error)
+                 ELSE
+                    CALL H5Gget_info_by_idx_f(group_id, ".", idx_type, order, INT(0,HSIZE_T), &
+                         storage_type, nlinks, max_corder, error, mounted=mounted)
+                    CALL verify("H5Gget_info_by_idx_f", mounted,.FALSE.,total_error)
+                    CALL check("H5Gget_info_by_idx_f", error, total_error)
+                 ENDIF
+              !  Check (new) group's information 
+                 CALL verify("H5Gget_info_by_idx_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
+                 CALL verify("H5Gget_info_by_idx_f", max_corder, u+1, total_error)
+                 CALL verify("H5Gget_info_by_idx_f", nlinks, u+1, total_error)
+              ENDIF
+              !  Close group created 
+              CALL H5Gclose_f(group_id2, error)
+              CALL check("H5Gclose_f", error, total_error)
+
+              !  Retrieve main group's information 
+              CALL H5Gget_info_f(group_id, storage_type, nlinks, max_corder, error)
+              CALL check("H5Gget_info_f", error, total_error)
+
+              !  Check main group's information 
+              CALL verify("H5Gget_info_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
+              CALL verify("H5Gget_info_f", max_corder, u+1, total_error)
+              CALL verify("H5Gget_info_f", nlinks, u+1, total_error)
+
+              !  Retrieve main group's information, by name 
+              CALL H5Gget_info_by_name_f(file_id, CORDER_GROUP_NAME, storage_type, nlinks, max_corder, error)
+              CALL check("H5Gget_info_by_name_f", error, total_error)
+
+              !  Check main group's information 
+              CALL verify("H5Gget_info_by_name_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
+              CALL verify("H5Gget_info_by_name_f", max_corder, u+1, total_error)
+              CALL verify("H5Gget_info_by_name_f", nlinks, u+1, total_error)
+
+              !  Retrieve main group's information, by name 
+              CALL H5Gget_info_by_name_f(group_id, ".", storage_type, nlinks, max_corder, error, H5P_DEFAULT_F)
+              CALL check("H5Gget_info_by_name_f", error, total_error)
+
+              !  Check main group's information 
+              CALL verify("H5Gget_info_by_name_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
+              CALL verify("H5Gget_info_by_name_f", max_corder, u+1, total_error)
+              CALL verify("H5Gget_info_by_name_f", nlinks, u+1, total_error)
+
+              !  Create soft link in another group, to objects in main group 
+              valname = CORDER_GROUP_NAME//objname
+
+              CALL H5Lcreate_soft_f(valname, soft_group_id, objname, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
+
+              !  Retrieve soft link group's information, by name 
+              CALL H5Gget_info_f(soft_group_id, storage_type, nlinks, max_corder, error)
+              CALL check("H5Gget_info_f", error, total_error)
+
+              !  Check soft link group's information 
+              CALL verify("H5Gget_info_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
+              CALL verify("H5Gget_info_f", max_corder, u+1, total_error)
+              CALL verify("H5Gget_info_f", nlinks, u+1, total_error)
+           ENDDO
+
+           !  Close the groups 
+
+              CALL H5Gclose_f(group_id, error)
+              CALL check("H5Gclose_f", error, total_error)
+              CALL H5Gclose_f(soft_group_id, error)
+              CALL check("H5Gclose_f", error, total_error)
+
+              !  Close the file 
+              CALL H5Fclose_f(file_id, error)
+              CALL check("H5Fclose_f", error, total_error)
+           ENDDO
+        ENDDO
+     ENDDO
+
+     !  Free resources 
+     CALL H5Pclose_f(gcpl_id, error)
+     CALL check("H5Pclose_f", error, total_error)
+
+     IF(cleanup) CALL h5_cleanup_f(prefix, H5P_DEFAULT_F, error)
+     CALL check("h5_cleanup_f", error, total_error)
+
+
+   END SUBROUTINE group_info
+
+!-------------------------------------------------------------------------
+! * Function:    timestamps
+! *
+! * Purpose:     Verify that disabling tracking timestamps for an object
+! *              works correctly
+! *
+! *
+! * Programmer:  M.S. Breitenfeld
+! *              February 20, 2008
+! *
+! *-------------------------------------------------------------------------
+! 
+
+   SUBROUTINE timestamps(cleanup, fapl, total_error)
+
+     IMPLICIT NONE
+     INTEGER, INTENT(INOUT) :: total_error
+     INTEGER(HID_T), INTENT(IN) :: fapl
+
+     INTEGER(HID_T) :: file_id ! File ID 
+     INTEGER(HID_T) :: group_id ! Group ID 
+     INTEGER(HID_T) :: group_id2 ! Group ID 
+     INTEGER(HID_T) :: gcpl_id ! Group creation property list ID 
+     INTEGER(HID_T) :: gcpl_id2 ! Group creation property list ID 
+
+     CHARACTER(LEN=6), PARAMETER :: prefix = 'links9'
+     CHARACTER(LEN=9), PARAMETER :: filename = prefix//'.h5'  !  File name 
+     !  Timestamp macros 
+     CHARACTER(LEN=10), PARAMETER :: TIMESTAMP_GROUP_1="timestamp1"
+     CHARACTER(LEN=10), PARAMETER :: TIMESTAMP_GROUP_2="timestamp2"
+     LOGICAL :: track_times
+     LOGICAL :: cleanup
+
+     INTEGER :: error
+
+     !  Print test message 
+!     WRITE(*,*) "timestamps on objects"
+
+     !  Create group creation property list 
+     CALL H5Pcreate_f(H5P_GROUP_CREATE_F, gcpl_id, error )
+     CALL check("H5Pcreate_f", error, total_error)
+
+     !  Query the object timestamp setting 
+     CALL H5Pget_obj_track_times_f(gcpl_id, track_times, error)
+     CALL check("H5Pget_obj_track_times_f", error, total_error)
+
+     ! Check default timestamp information 
+     CALL verify("H5Pget_obj_track_times",track_times,.TRUE.,total_error)
+
+     !  Set a non-default object timestamp setting 
+     CALL H5Pset_obj_track_times_f(gcpl_id, .FALSE., error)
+     CALL check("H5Pset_obj_track_times_f", error, total_error)
+
+     !  Query the object timestamp setting 
+     CALL H5Pget_obj_track_times_f(gcpl_id, track_times, error)
+     CALL check("H5Pget_obj_track_times_f", error, total_error)
+
+     !  Check default timestamp information 
+     CALL verify("H5Pget_obj_track_times",track_times,.FALSE.,total_error)
+
+     !  Create file 
+     !h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
+
+     CALL H5Fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, error, H5P_DEFAULT_F, fapl)
+     CALL check("h5fcreate_f",error,total_error)
+
+    !  Create group with non-default object timestamp setting 
+     CALL h5gcreate_f(file_id, TIMESTAMP_GROUP_1, group_id, error, &
+          OBJECT_NAMELEN_DEFAULT_F, H5P_DEFAULT_F, gcpl_id, H5P_DEFAULT_F)
+     CALL check("h5fcreate_f",error,total_error)
+
+    !  Close the group creation property list 
+     CALL H5Pclose_f(gcpl_id, error)
+     CALL check("H5Pclose_f", error, total_error)
+
+    !  Create group with default object timestamp setting 
+     CALL h5gcreate_f(file_id, TIMESTAMP_GROUP_2, group_id2, error, &
+          OBJECT_NAMELEN_DEFAULT_F, H5P_DEFAULT_F, H5P_DEFAULT_F, H5P_DEFAULT_F)
+     CALL check("h5fcreate_f",error,total_error)
+
+    !  Retrieve the new groups' creation properties 
+     CALL H5Gget_create_plist_f(group_id, gcpl_id, error)
+     CALL check("H5Gget_create_plist", error, total_error)
+     CALL H5Gget_create_plist_f(group_id2, gcpl_id2, error)
+     CALL check("H5Gget_create_plist", error, total_error)
+
+    !  Query & verify the object timestamp settings 
+     CALL H5Pget_obj_track_times_f(gcpl_id, track_times, error)
+     CALL check("H5Pget_obj_track_times_f", error, total_error)
+     CALL verify("H5Pget_obj_track_times1",track_times,.FALSE.,total_error)
+     CALL H5Pget_obj_track_times_f(gcpl_id2, track_times, error)
+     CALL check("H5Pget_obj_track_times_f", error, total_error)
+     CALL verify("H5Pget_obj_track_times2",track_times,.TRUE.,total_error)
+
+!     Query the object information for each group 
+!    if(H5Oget_info(group_id, &oinfo) < 0) TEST_ERROR
+!    if(H5Oget_info(group_id2, &oinfo2) < 0) TEST_ERROR
+
+!!$     Sanity check object information for each group 
+!!$    if(oinfo.atime != 0) TEST_ERROR
+!!$    if(oinfo.mtime != 0) TEST_ERROR
+!!$    if(oinfo.ctime != 0) TEST_ERROR
+!!$    if(oinfo.btime != 0) TEST_ERROR
+!!$    if(oinfo.atime == oinfo2.atime) TEST_ERROR
+!!$    if(oinfo.mtime == oinfo2.mtime) TEST_ERROR
+!!$    if(oinfo.ctime == oinfo2.ctime) TEST_ERROR
+!!$    if(oinfo.btime == oinfo2.btime) TEST_ERROR
+!!$    if((oinfo.hdr.flags & H5O_HDR_STORE_TIMES) != 0) TEST_ERROR
+!!$    if((oinfo2.hdr.flags & H5O_HDR_STORE_TIMES) == 0) TEST_ERROR
+!!$    if(oinfo.hdr.space.total >= oinfo2.hdr.space.total) TEST_ERROR
+!!$    if(oinfo.hdr.space.meta >= oinfo2.hdr.space.meta) TEST_ERROR
+
+     !  Close the property lists 
+     CALL H5Pclose_f(gcpl_id, error)
+     CALL check("H5Pclose_f", error, total_error)
+     CALL H5Pclose_f(gcpl_id2, error)
+     CALL check("H5Pclose_f", error, total_error)
+
+     !  Close the groups 
+     CALL H5Gclose_f(group_id, error)
+     CALL check("H5Gclose_f", error, total_error)
+     CALL H5Gclose_f(group_id2, error)
+     CALL check("H5Gclose_f", error, total_error)
+
+     ! Close the file 
+     CALL H5Fclose_f(file_id, error)
+     CALL check("H5Fclose_f", error, total_error)
+
+     ! Re-open the file 
+
+     CALL h5fopen_f(FileName, H5F_ACC_RDONLY_F, file_id, error, H5P_DEFAULT_F)
+     CALL check("h5fopen_f",error,total_error)
+
+     ! Open groups 
+     CALL H5Gopen_f(file_id, TIMESTAMP_GROUP_1, group_id, error) ! with no optional param.
+     CALL check("H5Gopen_f", error, total_error)
+     CALL H5Gopen_f(file_id, TIMESTAMP_GROUP_2, group_id2, error, H5P_DEFAULT_F) ! with optional param.
+     CALL check("H5Gopen_f", error, total_error)
+
+    !  Retrieve the new groups' creation properties 
+     CALL H5Gget_create_plist_f(group_id, gcpl_id, error)
+     CALL check("H5Gget_create_plist", error, total_error)
+     CALL H5Gget_create_plist_f(group_id2, gcpl_id2, error)
+     CALL check("H5Gget_create_plist", error, total_error)
+
+    !  Query & verify the object timestamp settings 
+
+     CALL H5Pget_obj_track_times_f(gcpl_id, track_times, error)
+     CALL check("H5Pget_obj_track_times_f", error, total_error)
+     CALL verify("H5Pget_obj_track_times1",track_times,.FALSE.,total_error)
+     CALL H5Pget_obj_track_times_f(gcpl_id2, track_times, error)
+     CALL check("H5Pget_obj_track_times_f", error, total_error)
+     CALL verify("H5Pget_obj_track_times2",track_times,.TRUE.,total_error)
+!!$
+!!$     Query the object information for each group 
+!!$    if(H5Oget_info(group_id, &oinfo) < 0) TEST_ERROR
+!!$    if(H5Oget_info(group_id2, &oinfo2) < 0) TEST_ERROR
+!!$
+!!$     Sanity check object information for each group 
+!!$    if(oinfo.atime != 0) TEST_ERROR
+!!$    if(oinfo.mtime != 0) TEST_ERROR
+!!$    if(oinfo.ctime != 0) TEST_ERROR
+!!$    if(oinfo.btime != 0) TEST_ERROR
+!!$    if(oinfo.atime == oinfo2.atime) TEST_ERROR
+!!$    if(oinfo.mtime == oinfo2.mtime) TEST_ERROR
+!!$    if(oinfo.ctime == oinfo2.ctime) TEST_ERROR
+!!$    if(oinfo.btime == oinfo2.btime) TEST_ERROR
+!!$    if((oinfo.hdr.flags & H5O_HDR_STORE_TIMES) != 0) TEST_ERROR
+!!$    if((oinfo2.hdr.flags & H5O_HDR_STORE_TIMES) == 0) TEST_ERROR
+!!$    if(oinfo.hdr.space.total >= oinfo2.hdr.space.total) TEST_ERROR
+!!$    if(oinfo.hdr.space.meta >= oinfo2.hdr.space.meta) TEST_ERROR
+
+     !  Close the property lists 
+     CALL H5Pclose_f(gcpl_id, error)
+     CALL check("H5Pclose_f", error, total_error)
+     CALL H5Pclose_f(gcpl_id2, error)
+     CALL check("H5Pclose_f", error, total_error)
+
+     !  Close the groups 
+     CALL H5Gclose_f(group_id, error)
+     CALL check("H5Gclose_f", error, total_error)
+     CALL H5Gclose_f(group_id2, error)
+     CALL check("H5Gclose_f", error, total_error)
+
+     ! Close the file 
+     CALL H5Fclose_f(file_id, error)
+     CALL check("H5Fclose_f", error, total_error)
+
+     IF(cleanup) CALL h5_cleanup_f(prefix, H5P_DEFAULT_F, error)
+     CALL check("h5_cleanup_f", error, total_error)
+
+   END SUBROUTINE timestamps
+
+!-------------------------------------------------------------------------
+! * Function:	mklinks
+! *
+! * Purpose:	Build a file with assorted links.
+! *
+! *
+! * Programmer:	Adapted from C test by:
+! *             M.S. Breitenfeld
+! *
+! * Modifications:
+! *
+! *-------------------------------------------------------------------------
+! 
+
+   SUBROUTINE mklinks(fapl, total_error)
+
+     IMPLICIT NONE
+     INTEGER, INTENT(INOUT) :: total_error
+     INTEGER(HID_T), INTENT(IN) :: fapl
+
+     INTEGER(HID_T) :: file, scalar, grp, d1
+     CHARACTER(LEN=12), PARAMETER :: filename ='TestLinks.h5'
+     INTEGER(HSIZE_T), DIMENSION(1) :: adims2 = (/1/) ! Attribute dimension
+     INTEGER ::   arank = 1                      ! Attribure rank
+     INTEGER :: error
+
+     INTEGER :: cset ! Indicates the character set used for the link’s name.
+     INTEGER :: corder ! Specifies the link’s creation order position.
+     LOGICAL :: f_corder_valid ! Indicates whether the value in corder is valid.
+     INTEGER :: link_type ! Specifies the link class:
+                          !  H5L_TYPE_HARD_F      - Hard link
+                          !  H5L_TYPE_SOFT_F      - Soft link
+                          !  H5L_TYPE_EXTERNAL_F  - External link
+                          !  H5L_TYPE_ERROR _F    - Error
+     INTEGER(HADDR_T) :: address  ! If the link is a hard link, address specifies the file address that the link points to
+     INTEGER(SIZE_T) :: val_size ! If the link is a symbolic link, val_size will be the length of the link value
+
+
+!     WRITE(*,*) "link creation (w/new group format)"
+
+     !  Create a file 
+     CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, file, error, H5P_DEFAULT_F, fapl)
+     CALL check("mklinks.h5fcreate_f",error,total_error)
+     CALL h5screate_simple_f(arank, adims2, scalar, error)
+     CALL check("mklinks.h5screate_simple_f",error,total_error)
+
+     ! Create a group 
+     CALL H5Gcreate_f(file, "grp1", grp, error)
+     CALL check("H5Gcreate_f", error, total_error)
+     CALL H5Gclose_f(grp, error)
+     CALL check("h5gclose_f",error,total_error)
+
+     ! Create a dataset 
+     CALL h5dcreate_f(file, "d1", H5T_NATIVE_INTEGER, scalar, d1, error)
+     CALL check("h5dcreate_f",error,total_error)
+     CALL h5dclose_f(d1, error)
+     CALL check("h5dclose_f",error,total_error)
+
+     ! Create a hard link 
+     CALL H5Lcreate_hard_f(file, "d1", INT(H5L_SAME_LOC_F,HID_T), "grp1/hard", error)
+     CALL check("H5Lcreate_hard_f", error, total_error)
+
+     ! Create a symbolic link 
+     CALL H5Lcreate_soft_f("/d1", file, "grp1/soft",error)
+     CALL check("H5Lcreate_soft_f", error, total_error)
+
+     CALL H5Lget_info_f(file, "grp1/soft", &
+          cset, corder, f_corder_valid, link_type, address, val_size, &
+          error, H5P_DEFAULT_F)
+     CALL check("H5Lget_info_f",error,total_error)
+
+!     CALL verify("H5Lget_info_by_idx_f11", f_corder_valid, .TRUE., total_error)
+
+     CALL verify("H5Lget_info_by_idx_f", H5L_TYPE_SOFT_F, link_type, total_error)
+     CALL verify("H5Lget_info_by_idx_f", cset, H5T_CSET_ASCII_F, total_error)
+     ! should be '/d1' + NULL character = 4
+     CALL verify("H5Lget_info_by_idx_f", INT(val_size), 4, total_error)
+
+    ! Create a symbolic link to something that doesn't exist 
+
+     CALL H5Lcreate_soft_f("foobar", file, "grp1/dangle",error)
+
+    ! Create a recursive symbolic link 
+     CALL H5Lcreate_soft_f("/grp1/recursive", file, "/grp1/recursive",error)
+
+    ! Close 
+     CALL h5sclose_f(scalar, error)
+     CALL check("h5sclose_f",error,total_error)
+     CALL h5fclose_f(file, error)
+     CALL check("h5fclose_f",error,total_error)
+
+  END SUBROUTINE mklinks
+
+!-------------------------------------------------------------------------
+! * Function:    test_move_preserves
+! *
+! * Purpose:     Tests that moving and renaming links preserves their
+! *              properties.
+! *
+! * Programmer:  M.S. Breitenfeld
+! *              March 3, 2008
+! *
+! * Modifications:
+! *
+! *-------------------------------------------------------------------------
+! 
+
+  SUBROUTINE test_move_preserves(fapl_id, total_error)
+
+    IMPLICIT NONE
+    INTEGER, INTENT(INOUT) :: total_error
+    INTEGER(HID_T), INTENT(IN) :: fapl_id
+
+    INTEGER(HID_T):: file_id
+    INTEGER(HID_T):: group_id
+    INTEGER(HID_T):: fcpl_id !  Group creation property list ID 
+    INTEGER(HID_T):: lcpl_id
+    !H5O_info_t oinfo;
+    !H5L_info_t linfo;
+    INTEGER :: old_cset
+    INTEGER :: old_corder
+    !H5T_cset_t old_cset;
+    !int64_t old_corder;          Creation order value of link 
+    !time_t old_modification_time;
+    !time_t curr_time;
+    !unsigned crt_order_flags;    Status of creation order info for GCPL 
+    !char filename[1024];
+
+    INTEGER :: crt_order_flags !  Status of creation order info for GCPL 
+    CHARACTER(LEN=12), PARAMETER :: filename = 'TestLinks.h5'
+
+    INTEGER :: cset ! Indicates the character set used for the link’s name.
+    INTEGER :: corder ! Specifies the link’s creation order position.
+    LOGICAL :: f_corder_valid ! Indicates whether the value in corder is valid.
+    INTEGER :: link_type ! Specifies the link class:
+                         !  H5L_TYPE_HARD_F      - Hard link
+                         !  H5L_TYPE_SOFT_F      - Soft link
+                         !  H5L_TYPE_EXTERNAL_F  - External link
+                         !  H5L_TYPE_ERROR _F    - Error
+    INTEGER(HADDR_T) :: address  ! If the link is a hard link, address specifies the file address that the link points to
+    INTEGER(SIZE_T) :: val_size ! If the link is a symbolic link, val_size will be the length of the link value
+
+    INTEGER :: error
+
+!    WRITE(*,*) "moving and copying links preserves their properties (w/new group format)"
+
+    ! Create a file creation property list with creation order stored for links
+    ! * in the root group
+    ! 
+
+    CALL H5Pcreate_f(H5P_FILE_CREATE_F, fcpl_id, error)
+    CALL check("H5Pcreate_f",error, total_error)
+
+    CALL H5Pget_link_creation_order_f(fcpl_id, crt_order_flags, error)
+    CALL check("H5Pget_link_creation_order_f",error, total_error)
+    CALL verify("H5Pget_link_creation_order_f",crt_order_flags,0, total_error)
+
+    CALL H5Pset_link_creation_order_f(fcpl_id, H5P_CRT_ORDER_TRACKED_F, error)
+    CALL check("H5Pset_link_creation_order_f", error, total_error)
+
+    CALL H5Pget_link_creation_order_f(fcpl_id, crt_order_flags, error)
+    CALL check("H5Pget_link_creation_order_f",error, total_error)
+    CALL verify("H5Pget_link_creation_order_f",crt_order_flags, H5P_CRT_ORDER_TRACKED_F, total_error)
+
+    ! Create file 
+    ! (with creation order tracking for the root group) 
+
+    CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, file_id, error, fcpl_id, fapl_id)
+    CALL check("h5fcreate_f",error,total_error)
+
+    ! Create a link creation property list with the UTF-8 character encoding 
+    CALL H5Pcreate_f(H5P_LINK_CREATE_F, lcpl_id, error)
+    CALL check("H5Pcreate_f",error, total_error)
+
+    CALL H5Pset_char_encoding_f(lcpl_id, H5T_CSET_UTF8_F, error)
+    CALL check("H5Pset_char_encoding_f",error, total_error)
+
+    ! Create a group with that lcpl 
+    CALL H5Gcreate_f(file_id, "group", group_id, error,lcpl_id=lcpl_id, gcpl_id=H5P_DEFAULT_F, gapl_id=H5P_DEFAULT_F)
+    CALL check("H5Gcreate_f", error, total_error)
+    CALL H5Gclose_f(group_id, error)
+    CALL check("H5Gclose_f", error, total_error)
+
+    !  Get the group's link's information 
+    CALL H5Lget_info_f(file_id, "group", &
+         cset, corder, f_corder_valid, link_type, address, val_size, &
+         error, H5P_DEFAULT_F)
+    CALL check("H5Lget_info_f",error,total_error)
+
+!    if(H5Oget_info_by_name(file_id, "group", &oinfo, H5P_DEFAULT) < 0) TEST_ERROR
+
+    old_cset = cset
+    CALL verify("H5Lget_info_f",old_cset,H5T_CSET_UTF8_F,total_error)
+    CALL verify("H5Lget_info_f",f_corder_valid,.TRUE.,total_error)
+    old_corder = corder;
+    CALL verify("H5Lget_info_f",old_corder,0,total_error)
+
+!    old_modification_time = oinfo.mtime;
+
+!     If this test happens too quickly, the times will all be the same.  Make sure the time changes. 
+!    curr_time = HDtime(NULL);
+!    while(HDtime(NULL) <= curr_time)
+!        ;
+
+!     Close the file and reopen it 
+    CALL H5Fclose_f(file_id, error)
+    CALL check("H5Fclose_f", error, total_error)
+
+!!$    if((file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id)) < 0) TEST_ERROR
+!!$
+!!$     Get the link's character set & modification time .  They should be unchanged 
+!!$    if(H5Lget_info(file_id, "group", &linfo, H5P_DEFAULT) < 0) TEST_ERROR
+!!$    if(H5Oget_info_by_name(file_id, "group", &oinfo, H5P_DEFAULT) < 0) TEST_ERROR
+!!$    if(old_modification_time != oinfo.mtime) TEST_ERROR
+!!$    if(old_cset != linfo.cset) TEST_ERROR
+!!$    if(linfo.corder_valid != TRUE) TEST_ERROR
+!!$    if(old_corder != linfo.corder) TEST_ERROR
+!!$
+!!$     Create a new link to the group.  It should have a different creation order value but the same modification time 
+!!$    if(H5Lcreate_hard(file_id, "group", file_id, "group2", H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+!!$    if(H5Oget_info_by_name(file_id, "group2", &oinfo, H5P_DEFAULT) < 0) TEST_ERROR
+!!$    if(old_modification_time != oinfo.mtime) TEST_ERROR
+!!$    if(H5Lget_info(file_id, "group2", &linfo, H5P_DEFAULT) < 0) TEST_ERROR
+!!$    if(old_corder == linfo.corder) TEST_ERROR
+!!$    if(linfo.corder_valid != TRUE) TEST_ERROR
+!!$    if(linfo.corder != 1) TEST_ERROR
+!!$    if(linfo.cset != H5T_CSET_ASCII) TEST_ERROR
+!!$
+!!$     Copy the first link to a UTF-8 name.
+!!$     *  Its creation order value should be different, but modification time
+!!$     * should not change.
+!!$     
+!!$    if(H5Lcopy(file_id, "group", file_id, "group_copied", lcpl_id, H5P_DEFAULT) < 0) TEST_ERROR
+!!$    if(H5Oget_info_by_name(file_id, "group_copied", &oinfo, H5P_DEFAULT) < 0) TEST_ERROR
+!!$    if(old_modification_time != oinfo.mtime) TEST_ERROR
+!!$    if(H5Lget_info(file_id, "group_copied", &linfo, H5P_DEFAULT) < 0) TEST_ERROR
+!!$    if(linfo.corder_valid != TRUE) TEST_ERROR
+!!$    if(linfo.corder != 2) TEST_ERROR
+!!$
+!!$     Check that its character encoding is UTF-8 
+!!$    if(linfo.cset != H5T_CSET_UTF8) TEST_ERROR
+!!$
+!!$     Move the link with the default property list. 
+!!$    if(H5Lmove(file_id, "group_copied", file_id, "group_copied2", H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+!!$    if(H5Oget_info_by_name(file_id, "group_copied2", &oinfo, H5P_DEFAULT) < 0) TEST_ERROR
+!!$    if(old_modification_time != oinfo.mtime) TEST_ERROR
+!!$    if(H5Lget_info(file_id, "group_copied2", &linfo, H5P_DEFAULT) < 0) TEST_ERROR
+!!$    if(linfo.corder_valid != TRUE) TEST_ERROR
+!!$    if(linfo.corder != 3) TEST_ERROR
+!!$
+!!$     Check that its character encoding is not UTF-8 
+!!$    if(linfo.cset == H5T_CSET_UTF8) TEST_ERROR
+!!$
+!!$     Check that the original link is unchanged 
+!!$    if(H5Oget_info_by_name(file_id, "group", &oinfo, H5P_DEFAULT) < 0) TEST_ERROR
+!!$    if(old_modification_time != oinfo.mtime) TEST_ERROR
+!!$    if(H5Lget_info(file_id, "group", &linfo, H5P_DEFAULT) < 0) TEST_ERROR
+!!$    if(linfo.corder_valid != TRUE) TEST_ERROR
+!!$    if(old_corder != linfo.corder) TEST_ERROR
+!!$    if(linfo.cset != H5T_CSET_UTF8) TEST_ERROR
+!!$
+!!$     Move the first link to a UTF-8 name.
+!!$     *  Its creation order value will change, but modification time should not
+!!$     *  change. 
+!!$    if(H5Lmove(file_id, "group", file_id, "group_moved", lcpl_id, H5P_DEFAULT) < 0) TEST_ERROR
+!!$    if(H5Oget_info_by_name(file_id, "group_moved", &oinfo, H5P_DEFAULT) < 0) TEST_ERROR
+!!$    if(old_modification_time != oinfo.mtime) TEST_ERROR
+!!$    if(H5Lget_info(file_id, "group_moved", &linfo, H5P_DEFAULT) < 0) TEST_ERROR
+!!$    if(linfo.corder_valid != TRUE) TEST_ERROR
+!!$    if(linfo.corder != 4) TEST_ERROR
+!!$
+!!$     Check that its character encoding is UTF-8 
+!!$    if(linfo.cset != H5T_CSET_UTF8) TEST_ERROR
+!!$
+!!$     Move the link again using the default property list. 
+!!$    if(H5Lmove(file_id, "group_moved", file_id, "group_moved_again", H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+!!$    if(H5Oget_info_by_name(file_id, "group_moved_again", &oinfo, H5P_DEFAULT) < 0) TEST_ERROR
+!!$    if(old_modification_time != oinfo.mtime) TEST_ERROR
+!!$    if(H5Lget_info(file_id, "group_moved_again", &linfo, H5P_DEFAULT) < 0) TEST_ERROR
+!!$    if(linfo.corder_valid != TRUE) TEST_ERROR
+!!$    if(linfo.corder != 5) TEST_ERROR
+!!$
+!!$     Check that its character encoding is not UTF-8 
+!!$    if(linfo.cset == H5T_CSET_UTF8) TEST_ERROR
+
+    !  Close open IDs 
+     CALL H5Pclose_f(fcpl_id, error)
+     CALL check("H5Pclose_f", error, total_error)
+     CALL H5Pclose_f(lcpl_id, error)
+     CALL check("H5Pclose_f", error, total_error)
+
+    ! if(H5Fclose(file_id) < 0) TEST_ERROR
+
+   END SUBROUTINE test_move_preserves
+
+!-------------------------------------------------------------------------
+! * Function:    lifecycle
+! *
+! * Purpose:     Test that adding links to a group follow proper "lifecycle"
+! *              of empty->compact->symbol table->compact->empty.  (As group
+! *              is created, links are added, then links removed)
+! *
+! * Return:      Success:        0
+! *
+! *              Failure:        -1
+! *
+! * Programmer:  Quincey Koziol
+! *              Monday, October 17, 2005
+! *
+! *-------------------------------------------------------------------------
+! 
+SUBROUTINE lifecycle(cleanup, fapl2, total_error)
+
+  IMPLICIT NONE
+  INTEGER, INTENT(INOUT) :: total_error
+  INTEGER(HID_T), INTENT(IN) :: fapl2
+  INTEGER :: error
+
+  INTEGER, PARAMETER :: NAME_BUF_SIZE =7
+
+  INTEGER(HID_T) :: fid            ! File ID 
+  INTEGER(HID_T) :: gid            ! Group ID 
+  INTEGER(HID_T) :: gcpl           ! Group creation property list ID 
+  INTEGER(size_t) :: lheap_size_hint ! Local heap size hint 
+  INTEGER :: max_compact            ! Maximum # of links to store in group compactly 
+  INTEGER :: min_dense              ! Minimum # of links to store in group "densely" 
+  INTEGER :: est_num_entries        ! Estimated # of entries in group 
+  INTEGER :: est_name_len           ! Estimated length of entry name 
+  CHARACTER(LEN=NAME_BUF_SIZE) :: filename = 'fixx.h5'
+  INTEGER(SIZE_T) :: LIFECYCLE_LOCAL_HEAP_SIZE_HINT = 256
+  INTEGER :: LIFECYCLE_MAX_COMPACT = 4
+  INTEGER :: LIFECYCLE_MIN_DENSE = 3
+  INTEGER :: LIFECYCLE_EST_NUM_ENTRIES = 4
+  INTEGER :: LIFECYCLE_EST_NAME_LEN=8
+  CHARACTER(LEN=3) :: LIFECYCLE_TOP_GROUP="top"
+! These value are taken from H5Gprivate.h
+  INTEGER :: H5G_CRT_GINFO_MAX_COMPACT = 8
+  INTEGER :: H5G_CRT_GINFO_MIN_DENSE = 6
+  INTEGER :: H5G_CRT_GINFO_EST_NUM_ENTRIES = 4
+  INTEGER :: H5G_CRT_GINFO_EST_NAME_LEN = 8
+  logical :: cleanup
+
+!  WRITE(*,*) 'group lifecycle'
+
+  !  Create file 
+  CALL H5Fcreate_f(filename, H5F_ACC_TRUNC_F, fid, error, access_prp=fapl2)
+  CALL check("H5Fcreate_f",error,total_error)
+
+  ! Close file 
+  CALL H5Fclose_f(fid,error)
+  CALL check("H5Fclose_f",error,total_error)
+
+  !  Get size of file as empty 
+  ! if((empty_size = h5_get_file_size(filename)) < 0) TEST_ERROR
+
+  !  Re-open file 
+
+  CALL H5Fopen_f(filename, H5F_ACC_RDWR_F, fid, error,access_prp=fapl2)
+  CALL check("H5Fopen_f",error,total_error)
+
+
+  !  Set up group creation property list 
+  CALL H5Pcreate_f(H5P_GROUP_CREATE_F,gcpl,error)
+  CALL check("H5Pcreate_f",error,total_error)
+
+
+  !  Query default group creation property settings 
+  CALL H5Pget_local_heap_size_hint_f(gcpl, lheap_size_hint, error)
+  CALL check("H5Pget_local_heap_size_hint_f",error,total_error)
+  CALL verify("H5Pget_local_heap_size_hint_f", INT(lheap_size_hint),0,total_error)
+
+  CALL H5Pget_link_phase_change_f(gcpl, max_compact, min_dense, error)
+  CALL check("H5Pget_link_phase_change_f", error, total_error)
+  CALL verify("H5Pget_link_phase_change_f", max_compact, H5G_CRT_GINFO_MAX_COMPACT,total_error)
+  CALL verify("H5Pget_link_phase_change_f", min_dense, H5G_CRT_GINFO_MIN_DENSE,total_error)
+
+
+  CALL H5Pget_est_link_info_f(gcpl, est_num_entries, est_name_len, error)
+  CALL check("H5Pget_est_link_info_f", error, total_error)
+  CALL verify("H5Pget_est_link_info_f", est_num_entries, H5G_CRT_GINFO_EST_NUM_ENTRIES,total_error)
+  CALL verify("H5Pget_est_link_info_f", est_name_len, H5G_CRT_GINFO_EST_NAME_LEN,total_error)
+
+
+  ! Set GCPL parameters 
+
+  CALL H5Pset_local_heap_size_hint_f(gcpl, LIFECYCLE_LOCAL_HEAP_SIZE_HINT, error)
+  CALL check("H5Pset_local_heap_size_hint_f", error, total_error)
+  CALL H5Pset_link_phase_change_f(gcpl, LIFECYCLE_MAX_COMPACT, LIFECYCLE_MIN_DENSE, error)
+  CALL check("H5Pset_link_phase_change_f", error, total_error)
+  CALL H5Pset_est_link_info_f(gcpl, LIFECYCLE_EST_NUM_ENTRIES, LIFECYCLE_EST_NAME_LEN, error)
+  CALL check("H5Pset_est_link_info_f", error, total_error)
+
+  !  Create group for testing lifecycle 
+
+  CALL H5Gcreate_f(fid, LIFECYCLE_TOP_GROUP, gid, error, gcpl_id=gcpl)
+  CALL check("H5Gcreate_f", error, total_error)
+
+  !  Query group creation property settings 
+
+  CALL H5Pget_local_heap_size_hint_f(gcpl, lheap_size_hint, error)
+  CALL check("H5Pget_local_heap_size_hint_f",error,total_error)
+  CALL verify("H5Pget_local_heap_size_hint_f", INT(lheap_size_hint),INT(LIFECYCLE_LOCAL_HEAP_SIZE_HINT),total_error)
+
+  CALL H5Pget_link_phase_change_f(gcpl, max_compact, min_dense, error)
+  CALL check("H5Pget_link_phase_change_f", error, total_error)
+  CALL verify("H5Pget_link_phase_change_f", max_compact, LIFECYCLE_MAX_COMPACT,total_error)
+  CALL verify("H5Pget_link_phase_change_f", min_dense, LIFECYCLE_MIN_DENSE,total_error)
+
+  CALL H5Pget_est_link_info_f(gcpl, est_num_entries, est_name_len, error)
+  CALL check("H5Pget_est_link_info_f", error, total_error)
+  CALL verify("H5Pget_est_link_info_f", est_num_entries, LIFECYCLE_EST_NUM_ENTRIES,total_error)
+  CALL verify("H5Pget_est_link_info_f", est_name_len, LIFECYCLE_EST_NAME_LEN,total_error)
+
+
+
+    ! Close top group 
+    CALL H5Gclose_f(gid, error)
+    CALL check("H5Gclose_f", error, total_error)
+
+    ! Unlink top group 
+
+    CALL H5Ldelete_f(fid, LIFECYCLE_TOP_GROUP, error)
+    CALL check("H5Ldelete_f", error, total_error)
+
+    !  Close GCPL 
+    CALL H5Pclose_f(gcpl, error)
+    CALL check("H5Pclose_f", error, total_error)
+
+    !  Close file 
+    CALL H5Fclose_f(fid,error)
+    CALL check("H5Fclose_f",error,total_error)
+
+    IF(cleanup) CALL h5_cleanup_f("fixx", H5P_DEFAULT_F, error)
+    CALL check("h5_cleanup_f", error, total_error)
+
+  END SUBROUTINE lifecycle
+
+!-------------------------------------------------------------------------
+! * Function:	cklinks
+! *
+! * Purpose:	Open the file created in the first step and check that the
+! *		links look correct.
+! *
+! * Return:	Success:	0
+! *
+! *		Failure:	-1
+! *
+! * Programmer:	M.S. Breitenfeld
+! *             April 14, 2008
+! *
+! * Modifications: Modified original C code
+! *
+! *-------------------------------------------------------------------------
+! 
+
+
+  SUBROUTINE cklinks(fapl, total_error)
+
+  IMPLICIT NONE
+  INTEGER, INTENT(INOUT) :: total_error
+  INTEGER(HID_T), INTENT(IN) :: fapl
+  INTEGER :: error
+
+  INTEGER(HID_T) :: file
+!    H5O_info_t		oinfo1, oinfo2;
+!    H5L_info_t		linfo2;
+
+  CHARACTER(LEN=12), PARAMETER :: filename ='TestLinks.h5'
+
+!  TYPE(C_PTR) :: linkval
+
+  LOGICAL :: Lexists
+
+  !  Open the file 
+  CALL H5Fopen_f(filename, H5F_ACC_RDONLY_F, file, error,access_prp=fapl)
+  CALL check("H5Fopen_f",error,total_error)
+
+
+  !  Hard link 
+!!$  IF(H5Oget_info_by_name(file, "d1", &oinfo1, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
+!!$  IF(H5Oget_info_by_name(file, "grp1/hard", &oinfo2, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
+!!$  IF(H5O_TYPE_DATASET != oinfo2.type) {
+!!$	H5_FAILED();
+!!$	printf("    %d: Unexpected object type should have been a dataset\n", __LINE__);
+!!$	TEST_ERROR
+!!$    }  end if 
+!!$    if(H5F_addr_ne(oinfo1.addr, oinfo2.addr)) {
+!!$	H5_FAILED();
+!!$	puts("    Hard link test failed. Link seems not to point to the ");
+!!$	puts("    expected file location.");
+!!$	TEST_ERROR
+!!$    }  end if 
+
+
+  CALL H5Lexists_f(file,"d1",Lexists, error)
+  CALL verify("H5Lexists", Lexists,.TRUE.,total_error)
+
+  CALL H5Lexists_f(file,"grp1/hard",Lexists, error)
+  CALL verify("H5Lexists", Lexists,.TRUE.,total_error)
+
+  !  Cleanup 
+  CALL H5Fclose_f(file,error)
+  CALL check("H5Fclose_f",error,total_error)
+
+END SUBROUTINE cklinks
+
+
+!-------------------------------------------------------------------------
+! * Function:    delete_by_idx
+! *
+! * Purpose:     Create a group with creation order indices and test deleting
+! *              links by index.
+! *
+! * Return:      Total error
+! *
+! * C Programmer:  Quincey Koziol
+! *                Tuesday, November 14, 2006
+! *
+! * Adapted to FORTRAN: M.S. Breitenfeld
+! *                     March 3, 2008
+! *
+! *-------------------------------------------------------------------------
+! 
+SUBROUTINE delete_by_idx(cleanup, fapl, total_error)
+
+  IMPLICIT NONE
+  INTEGER, INTENT(INOUT) :: total_error
+  INTEGER(HID_T), INTENT(IN) :: fapl
+
+  INTEGER(HID_T) :: file_id  !  File ID 
+  INTEGER(HID_T) :: group_id !  Group ID 
+  INTEGER(HID_T) :: gcpl_id  !  Group creation property list ID 
+
+  INTEGER :: idx_type        !  Type of index to operate on 
+  LOGICAL, DIMENSION(1:2) :: use_index = (/.FALSE.,.TRUE./)
+                             !  Use index on creation order values 
+  INTEGER :: max_compact     !  Maximum # of links to store in group compactly 
+  INTEGER :: min_dense       !  Minimum # of links to store in group "densely" 
+
+  CHARACTER(LEN=7) :: objname   !  Object name 
+  CHARACTER(LEN=8) :: filename = 'file0.h5' !  File name 
+  CHARACTER(LEN=12), PARAMETER :: CORDER_GROUP_NAME = "corder_group"
+
+  LOGICAL :: f_corder_valid ! Indicates whether the creation order data is valid for this attribute
+  INTEGER :: corder ! Is a positive integer containing the creation order of the attribute
+  INTEGER :: cset ! Indicates the character set used for the attribute’s name
+  INTEGER(SIZE_T) :: val_size
+  INTEGER :: link_type
+  INTEGER(HADDR_T) :: address
+
+  INTEGER :: u !  Local index variable 
+  INTEGER :: Input1, i
+  INTEGER(HID_T) :: group_id2
+  INTEGER(HID_T) :: grp
+  INTEGER :: iorder !  Order within in the index 
+  CHARACTER(LEN=2) :: chr2
+  INTEGER :: error
+  INTEGER :: id_type
+  !
+  !
+  !
+  CHARACTER(LEN=80) :: fix_filename1
+  CHARACTER(LEN=80) :: fix_filename2
+  INTEGER(HSIZE_T) :: htmp
+
+  LOGICAL :: cleanup
+
+  DO i = 1, 80
+     fix_filename1(i:i) = " "
+     fix_filename2(i:i) = " "
+  ENDDO
+
+  !  Loop over operating on different indices on link fields 
+  DO idx_type = H5_INDEX_NAME_F, H5_INDEX_CRT_ORDER_F
+     !  Loop over operating in different orders 
+     DO iorder = H5_ITER_INC_F,  H5_ITER_DEC_F
+        !  Loop over using index for creation order value 
+        DO i = 1, 2
+           !  Print appropriate test message 
+!!$           IF(idx_type == H5_INDEX_CRT_ORDER_F)THEN
+!!$              IF(iorder == H5_ITER_INC_F)THEN
+!!$                 IF(use_index(i))THEN
+!!$                    WRITE(*,'(5x,A)')"deleting links by creation order index in increasing order w/creation order index"
+!!$                 ELSE
+!!$                    WRITE(*,'(5x,A)')"deleting links by creation order index in increasing order w/o creation order index"
+!!$                 ENDIF
+!!$              ELSE
+!!$                 IF(use_index(i))THEN
+!!$                    WRITE(*,'(5x,A)')"deleting links by creation order index in decreasing order w/creation order index"
+!!$                 ELSE
+!!$                    WRITE(*,'(5x,A)')"deleting links by creation order index in decreasing order w/o creation order index"
+!!$                 ENDIF
+!!$              ENDIF
+!!$           ELSE
+!!$              IF(iorder == H5_ITER_INC_F)THEN
+!!$                 IF(use_index(i))THEN
+!!$                    WRITE(*,'(5x,A)')"deleting links by name index in increasing order w/creation order index"
+!!$                 ELSE
+!!$                    WRITE(*,'(5x,A)')"deleting links by name index in increasing order w/o creation order index"
+!!$                 ENDIF
+!!$              ELSE
+!!$                 IF(use_index(i))THEN
+!!$                    WRITE(*,'(5x,A)')"deleting links by name index in decreasing order w/creation order index"
+!!$                 ELSE
+!!$                    WRITE(*,'(5x,A)')"deleting links by name index in decreasing order w/o creation order index"
+!!$                 ENDIF
+!!$              ENDIF
+!!$           ENDIF
+
+           !  Create file 
+           CALL H5Fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, error, access_prp=fapl)
+           CALL check("delete_by_idx.H5Fcreate_f", error, total_error)
+
+           !  Create group creation property list 
+           CALL H5Pcreate_f(H5P_GROUP_CREATE_F, gcpl_id, error )
+           CALL check("delete_by_idx.H5Pcreate_f", error, total_error)
+
+           !  Set creation order tracking & indexing on group 
+           IF(use_index(i))THEN
+              Input1 = H5P_CRT_ORDER_INDEXED_F
+           ELSE
+              Input1 = 0
+           ENDIF
+
+           CALL H5Pset_link_creation_order_f(gcpl_id, IOR(H5P_CRT_ORDER_TRACKED_F, Input1), error)
+           CALL check("delete_by_idx.H5Pset_link_creation_order_f", error, total_error)
+
+           !  Create group with creation order tracking on 
+           CALL H5Gcreate_f(file_id, CORDER_GROUP_NAME, group_id, error, gcpl_id=gcpl_id)
+           CALL check("delete_by_idx.H5Gcreate_f", error, total_error)
+
+           !  Query the group creation properties 
+           CALL H5Pget_link_phase_change_f(gcpl_id, max_compact, min_dense, error)
+           CALL check("delete_by_idx.H5Pget_link_phase_change_f", error, total_error)
+
+
+           !  Delete links from one end 
+
+           !  Check for deletion on empty group 
+           CALL H5Ldelete_by_idx_f(group_id, ".", idx_type, iorder, INT(0,HSIZE_T), error)
+           CALL verify("delete_by_idx.H5Ldelete_by_idx_f", error, -1, total_error) ! test should fail (error = -1)
+           !  Create several links, up to limit of compact form 
+           DO u = 0, max_compact-1
+              !  Make name for link 
+              WRITE(chr2,'(I2.2)') u
+              objname = 'fill '//chr2
+
+              !  Create hard link, with group object 
+              CALL H5Gcreate_f(group_id, objname, group_id2, error)
+              CALL check("delete_by_idx.H5Gcreate_f", error, total_error)
+              CALL H5Gclose_f(group_id2, error)
+              CALL check("delete_by_idx.H5Gclose_f", error, total_error)
+
+              !  Verify link information for new link 
+              CALL link_info_by_idx_check(group_id, objname, u, &
+                   .TRUE., use_index(i), total_error)
+           ENDDO
+
+           !  Verify state of group (compact) 
+           ! IF(H5G_has_links_test(group_id, NULL) != TRUE) TEST_ERROR
+
+           !  Check for out of bound deletion 
+           htmp =9
+!EP           CALL H5Ldelete_by_idx_f(group_id, ".", idx_type, iorder, INT(u,HSIZE_T), error)
+           CALL H5Ldelete_by_idx_f(group_id, ".", idx_type, iorder, htmp, error)
+           CALL verify("H5Ldelete_by_idx_f", error, -1, total_error) ! test should fail (error = -1)
+
+
+           !  Delete links from compact group 
+
+           DO u = 0, (max_compact - 1) -1
+              !  Delete first link in appropriate order 
+              CALL H5Ldelete_by_idx_f(group_id, ".", idx_type, iorder, INT(0,HSIZE_T), error)
+              CALL check("H5Ldelete_by_idx_f", error, total_error)
+              !  Verify the link information for first link in appropriate order 
+              ! HDmemset(&linfo, 0, sizeof(linfo));
+
+              CALL H5Lget_info_by_idx_f(group_id, ".", idx_type, iorder, INT(0,HSIZE_T), &
+                   link_type, f_corder_valid, corder, cset, address, val_size, error)
+
+              CALL H5Oopen_by_addr_f(group_id, address, grp, error)
+              CALL check("H5Oopen_by_addr_f", error, total_error)
+
+              CALL H5Iget_type_f(grp, id_type, error)
+              CALL check("H5Iget_type_f", error, total_error)
+
+              CALL verify("H5Iget_type_f", id_type, H5I_GROUP_F, total_error)
+
+              CALL H5Gclose_f(grp, error)
+              CALL check("H5Gclose_f", error, total_error)
+
+              CALL verify("H5Lget_info_by_idx_f", f_corder_valid, .TRUE., total_error)
+
+              CALL verify("H5Lget_info_by_idx_f", H5L_TYPE_HARD_F, link_type, total_error)
+              IF(iorder.EQ.H5_ITER_INC_F)THEN
+                 CALL verify("H5Lget_info_by_idx_f", corder, u+1, total_error)
+              ELSE
+                 CALL verify("H5Lget_info_by_idx_f", corder, (max_compact - (u + 2)), total_error)
+              ENDIF
+
+              CALL verify("H5Lget_info_by_idx_f",cset, H5T_CSET_ASCII_F, total_error)
+
+
+
+              !  Verify the name for first link in appropriate order 
+              ! HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE);
+!!$              size_tmp = 20
+!!$              CALL H5Lget_name_by_idx_f(group_id, ".", idx_type, order, INT(0,HSIZE_T), size_tmp, tmpname, error)
+!!$              CALL check("delete_by_idx.H5Lget_name_by_idx_f", error, total_error)
+!!$
+!!$              IF(order .EQ. H5_ITER_INC_F)THEN
+!!$                 WRITE(chr2,'(I2.2)') u + 1
+!!$              ELSE
+!!$                 WRITE(chr2,'(I2.2)') (max_compact - (u + 2))
+!!$              ENDIF
+!!$              objname = 'fill '//chr2
+!!$              PRINT*,objname, tmpname
+!!$              CALL verify("delete_by_idx.H5Lget_name_by_idx_f", objname, tmpname,  total_error)
+           ENDDO
+
+           !  Close the group 
+           CALL H5Gclose_f(group_id, error)
+           CALL check("delete_by_idx.H5Gclose_f", error, total_error)
+
+           ! Close the group creation property list 
+           CALL H5Pclose_f(gcpl_id, error)
+           CALL check("delete_by_idx.H5Gclose_f", error, total_error)
+
+           ! Close the file 
+           CALL H5Fclose_f(file_id, error)
+           CALL check("delete_by_idx.H5Gclose_f", error, total_error)
+
+           IF(cleanup) CALL h5_cleanup_f("file0", H5P_DEFAULT_F, error)
+           CALL check("h5_cleanup_f", error, total_error)
+
+        ENDDO
+     ENDDO
+  ENDDO
+
+
+END SUBROUTINE delete_by_idx
+
+
+
+!-------------------------------------------------------------------------
+! * Function:    link_info_by_idx_check
+! *
+! * Purpose:     Support routine for link_info_by_idx, to verify the link
+! *              info is correct for a link
+! *
+! * Note:	This routine assumes that the links have been inserted in the
+! *              group in alphabetical order.
+! *
+! * Return:      Success:        0
+! *              Failure:        -1
+! *
+! * Programmer:  Quincey Koziol
+! *              Tuesday, November  7, 2006
+! *
+! *-------------------------------------------------------------------------
+! 
+SUBROUTINE link_info_by_idx_check(group_id, linkname, n, &
+    hard_link, use_index, total_error)
+
+  IMPLICIT NONE
+  INTEGER, INTENT(INOUT) :: total_error
+  INTEGER(HID_T), INTENT(IN) :: group_id
+  CHARACTER(LEN=*), INTENT(IN) :: linkname
+  INTEGER, INTENT(IN) :: n
+  LOGICAL, INTENT(IN) :: hard_link
+  LOGICAL, INTENT(IN) :: use_index
+
+  LOGICAL :: f_corder_valid ! Indicates whether the creation order data is valid for this attribute
+  INTEGER :: corder ! Is a positive integer containing the creation order of the attribute
+  INTEGER :: cset ! Indicates the character set used for the attribute’s name
+  INTEGER :: link_type
+  INTEGER(HADDR_T) :: address
+  INTEGER(SIZE_T) :: val_size   ! Indicates the size, in the number of characters, of the attribute
+
+  CHARACTER(LEN=7) :: tmpname     ! Temporary link name 
+  CHARACTER(LEN=3) :: tmpname_small ! to small temporary link name 
+  CHARACTER(LEN=10) :: tmpname_big ! to big temporary link name 
+
+  CHARACTER(LEN=7) :: valname     ! Link value name 
+  CHARACTER(LEN=2) :: chr2
+  INTEGER(SIZE_T) :: size_tmp
+  INTEGER :: error
+
+  !  Make link value for increasing/native order queries 
+
+  WRITE(chr2,'(I2.2)') n
+  valname = 'valn.'//chr2
+
+  !  Verify the link information for first link, in increasing creation order 
+  !  HDmemset(&linfo, 0, sizeof(linfo));
+  CALL H5Lget_info_by_idx_f(group_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, INT(0,HSIZE_T), &
+       link_type, f_corder_valid, corder, cset, address, val_size, error)
+  CALL check("H5Lget_info_by_idx_f", error, total_error)
+  CALL verify("H5Lget_info_by_idx_f", corder, 0, total_error)
+
+  !  Verify the link information for new link, in increasing creation order 
+  ! HDmemset(&linfo, 0, sizeof(linfo));
+  CALL H5Lget_info_by_idx_f(group_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, INT(n,HSIZE_T), &
+       link_type, f_corder_valid, corder, cset, address, val_size, error)
+  CALL check("H5Lget_info_by_idx_f", error, total_error)
+  CALL verify("H5Lget_info_by_idx_f", corder, n, total_error)
+
+  !  Verify value for new soft link, in increasing creation order 
+!!$  IF(hard_link)THEN
+!!$     ! HDmemset(tmpval, 0, (size_t)NAME_BUF_SIZE);
+!!$
+!!$     CALL H5Lget_val_by_idx_f(group_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, n, tmpval, INT(7,SIZE_T),error)
+!!$     CALL check("H5Lget_val_by_idx",error,total_error)
+!!$
+!!$!     IF(HDstrcmp(valname, tmpval)) TEST_ERROR
+!!$  ENDIF
+
+  !  Verify the name for new link, in increasing creation order 
+  !  HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE);
+
+  ! The actual size of tmpname should be 7
+
+  CALL H5Lget_name_by_idx_f(group_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, INT(n,HSIZE_T), tmpname_small, error, size_tmp)
+  CALL check("link_info_by_idx_check.H5Lget_name_by_idx_f", error, total_error)
+  CALL verify("link_info_by_idx_check.H5Lget_name_by_idx_f", &
+       linkname(1:LEN(tmpname_small)), tmpname_small(1:LEN(tmpname_small)),  total_error)
+  CALL verify("link_info_by_idx_check.H5Lget_name_by_idx_f", INT(size_tmp), 7, total_error)
+  ! try it with the correct size
+  CALL H5Lget_name_by_idx_f(group_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, INT(n,HSIZE_T), tmpname, error, size=size_tmp)
+  CALL check("link_info_by_idx_check.H5Lget_name_by_idx_f", error, total_error)
+  CALL verify("link_info_by_idx_check.H5Lget_name_by_idx_f", &
+       linkname(1:LEN(tmpname)), tmpname(1:LEN(tmpname)),  total_error)
+  CALL verify("link_info_by_idx_check.H5Lget_name_by_idx_f", INT(size_tmp), 7, total_error)
+
+  CALL H5Lget_name_by_idx_f(group_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, INT(n,HSIZE_T), tmpname_big, error, size_tmp)
+  CALL check("link_info_by_idx_check.H5Lget_name_by_idx_f", error, total_error)
+  CALL verify("link_info_by_idx_check.H5Lget_name_by_idx_f", &
+       linkname(1:7), tmpname_big(1:7),  total_error)
+  CALL verify("link_info_by_idx_check.H5Lget_name_by_idx_f", INT(size_tmp), 7, total_error)
+
+  ! Try with a buffer set to small
+
+
+  END SUBROUTINE link_info_by_idx_check
+
+
+!-------------------------------------------------------------------------
+! * Function:    test_lcpl
+! *
+! * Purpose:     Tests Link Creation Property Lists
+! *
+! * Return:      Success:        0
+! *              Failure:        number of errors
+! *
+! * Programmer:  M.S. Breitenfeld
+! *              Modified C routine
+! *              March 12, 2008
+! *
+! * Modifications:
+! *
+! *-------------------------------------------------------------------------
+! 
+
+  SUBROUTINE test_lcpl(cleanup, fapl, total_error)
+
+  IMPLICIT NONE
+  INTEGER, INTENT(INOUT) :: total_error
+  INTEGER(HID_T), INTENT(IN) :: fapl
+  LOGICAL :: cleanup
+
+  INTEGER(HID_T) :: file_id
+  INTEGER(HID_T) :: group_id
+  INTEGER(HID_T) :: space_id, data_space
+  INTEGER(HID_T) :: dset_id
+  INTEGER(HID_T) :: type_id
+  INTEGER(HID_T) :: lcpl_id
+
+  INTEGER :: cset ! Indicates the character set used for the link’s name.
+  INTEGER :: corder ! Specifies the link’s creation order position.
+  LOGICAL :: f_corder_valid ! Indicates whether the value in corder is valid.
+  INTEGER :: link_type ! Specifies the link class:
+                       !  H5L_TYPE_HARD_F      - Hard link
+                       !  H5L_TYPE_SOFT_F      - Soft link
+                       !  H5L_TYPE_EXTERNAL_F  - External link
+                       !  H5L_TYPE_ERROR _F    - Error
+  INTEGER(HADDR_T) :: address  ! If the link is a hard link, address specifies the file address that the link points to
+  INTEGER(SIZE_T) :: val_size ! If the link is a symbolic link, val_size will be the length of the link value
+
+  CHARACTER(LEN=1024) :: filename = 'tempfile.h5'
+  INTEGER, PARAMETER :: TEST6_DIM1 = 8, TEST6_DIM2 = 7
+  INTEGER(HSIZE_T), DIMENSION(1:2), PARAMETER :: dims = (/TEST6_DIM1,TEST6_DIM2/)
+
+  INTEGER :: encoding
+  INTEGER :: error
+  LOGICAL :: Lexists
+  INTEGER(HSIZE_T), DIMENSION(1:2), PARAMETER :: extend_dim = (/TEST6_DIM1-2,TEST6_DIM2-3/)
+  INTEGER(HSIZE_T), DIMENSION(1:2) :: dimsout, maxdimsout ! dimensions
+
+  INTEGER :: i
+  INTEGER :: tmp1, tmp2
+  INTEGER(HID_T) :: crp_list
+
+!  WRITE(*,*) "link creation property lists (w/new group format)"
+
+
+  ! Actually, intermediate group creation is tested elsewhere (tmisc).
+  ! * Here we only need to test the character encoding property 
+
+  ! Create file 
+  !  h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
+
+  CALL H5Fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, error, H5P_DEFAULT_F, fapl)
+  CALL check("H5Fcreate_f", error, total_error)
+
+
+  !  Create and link a group with the default LCPL 
+
+  CALL H5Gcreate_f(file_id, "/group", group_id, error)
+  CALL check("H5Gcreate_f", error, total_error)
+
+
+  !  Check that its character encoding is the default 
+
+  CALL H5Lget_info_f(file_id, "group", &
+       cset, corder, f_corder_valid, link_type, address, val_size, &
+       error, H5P_DEFAULT_F)
+
+! File-wide default character encoding can not yet be set via the file
+! * creation property list and is always ASCII. 
+!#define H5F_DEFAULT_CSET H5T_CSET_ASCII  -- FROM H5Fprivate.h --
+
+  CALL verify("H5Lget_info_f",cset, H5T_CSET_ASCII_F,total_error)
+
+  !  Create and commit a datatype with the default LCPL 
+  CALL h5tcopy_f(H5T_NATIVE_INTEGER, type_id, error)
+  CALL check("h5tcopy_f",error,total_error)
+  CALL h5tcommit_f(file_id, "/type", type_id, error)
+  CALL check("h5tcommit_f", error, total_error)
+  CALL h5tclose_f(type_id, error)
+  CALL check("h5tclose_f", error, total_error)
+
+
+  !  Check that its character encoding is the default 
+  CALL H5Lget_info_f(file_id, "type", &
+       cset, corder, f_corder_valid, link_type, address, val_size, &
+       error)
+  CALL check("h5tclose_f", error, total_error)
+
+! File-wide default character encoding can not yet be set via the file
+! * creation property list and is always ASCII. 
+!#define H5F_DEFAULT_CSET H5T_CSET_ASCII  -- FROM H5Fprivate.h --
+
+  CALL verify("H5Lget_info_f",cset, H5T_CSET_ASCII_F,total_error)
+
+  ! Create a dataspace 
+  CALL h5screate_simple_f(2, dims, space_id, error)
+  CALL check("h5screate_simple_f",error,total_error)
+  CALL h5pcreate_f(H5P_DATASET_CREATE_F, crp_list, error)
+  CALL h5pset_chunk_f(crp_list, 2, dims, error)
+  CALL h5pcreate_f(H5P_DATASET_CREATE_F, crp_list, error)
+  CALL h5pset_chunk_f(crp_list, 2, dims, error)
+  CALL h5pcreate_f(H5P_DATASET_CREATE_F, crp_list, error)
+  CALL h5pset_chunk_f(crp_list, 2, dims, error)
+
+  !  Create a dataset using the default LCPL 
+  CALL h5dcreate_f(file_id, "/dataset", H5T_NATIVE_INTEGER, space_id, dset_id, error, crp_list)
+  CALL check("h5dcreate_f", error, total_error)
+
+  CALL h5dclose_f(dset_id, error)
+  CALL check("h5dclose_f", error, total_error)
+
+  ! Reopen
+
+  CALL H5Dopen_f(file_id, "/dataset", dset_id, error)
+  CALL check("h5dopen_f", error, total_error)
+
+  !   Extend the  dataset 
+  CALL H5Dset_extent_f(dset_id, extend_dim, error)
+  CALL check("H5Dset_extent_f", error, total_error)
+  !   Verify the dataspaces 
+        !
+          !Get dataset's dataspace handle.
+          !
+  CALL h5dget_space_f(dset_id, data_space, error)
+  CALL check("h5dget_space_f",error,total_error)
+
+  CALL h5sget_simple_extent_dims_f(data_space, dimsout, maxdimsout, error)
+  CALL check("h5sget_simple_extent_dims_f",error, total_error)
+
+  DO i = 1, 2
+     tmp1 = INT(dimsout(i))
+     tmp2 = INT(extend_dim(i))
+     CALL verify("H5Sget_simple_extent_dims", tmp1, tmp2, total_error)
+     tmp1 = INT(maxdimsout(i))
+     tmp2 = INT(dims(i))
+     CALL verify("H5Sget_simple_extent_dims", tmp1, tmp2, total_error)
+  ENDDO
+
+  !  close data set 
+
+  CALL h5dclose_f(dset_id, error)
+  CALL check("h5dclose_f", error, total_error)
+
+  !  Check that its character encoding is the default 
+  CALL H5Lget_info_f(file_id, "dataset", &
+       cset, corder, f_corder_valid, link_type, address, val_size, &
+       error)
+  CALL check("H5Lget_info_f", error, total_error)
+
+! File-wide default character encoding can not yet be set via the file
+! * creation property list and is always ASCII. 
+!#define H5F_DEFAULT_CSET H5T_CSET_ASCII  -- FROM H5Fprivate.h --
+
+  CALL verify("h5tclose_f",cset, H5T_CSET_ASCII_F,total_error)
+
+  ! Create a link creation property list with the UTF-8 character encoding 
+  CALL H5Pcreate_f(H5P_LINK_CREATE_F,lcpl_id,error)
+  CALL check("h5Pcreate_f",error,total_error)
+  CALL H5Pset_char_encoding_f(lcpl_id, H5T_CSET_UTF8_F, error)
+  CALL check("H5Pset_char_encoding_f",error, total_error)
+
+  !  Create and link a group with the new LCPL 
+  CALL H5Gcreate_f(file_id, "/group2", group_id, error,lcpl_id=lcpl_id)
+  CALL check("H5Gcreate_f", error, total_error)
+  CALL H5Gclose_f(group_id, error)
+  CALL check("H5Gclose_f", error, total_error)
+
+
+  ! Check that its character encoding is UTF-8 
+  CALL H5Lget_info_f(file_id, "group2", &
+       cset, corder, f_corder_valid, link_type, address, val_size, &
+       error)
+  CALL check("H5Lget_info_f", error, total_error)
+  CALL verify("H5Lget_info_f",cset, H5T_CSET_UTF8_F,total_error)
+
+
+  !  Create and commit a datatype with the new LCPL 
+
+  CALL h5tcopy_f(H5T_NATIVE_INTEGER, type_id, error)
+  CALL check("h5tcopy_f",error,total_error)
+  CALL h5tcommit_f(file_id, "/type2", type_id, error, lcpl_id=lcpl_id)
+  CALL check("h5tcommit_f", error, total_error)
+  CALL h5tclose_f(type_id, error)
+  CALL check("h5tclose_f", error, total_error)
+
+
+  ! Check that its character encoding is UTF-8 
+  CALL H5Lget_info_f(file_id, "type2", &
+       cset, corder, f_corder_valid, link_type, address, val_size, &
+       error)
+  CALL check("H5Lget_info_f", error, total_error)
+  CALL verify("H5Lget_info_f",cset, H5T_CSET_UTF8_F,total_error)
+
+  !  Create a dataset using the new LCPL 
+  CALL h5dcreate_f(file_id, "/dataset2", H5T_NATIVE_INTEGER, space_id, dset_id, error,lcpl_id=lcpl_id)
+  CALL check("h5dcreate_f", error, total_error)
+
+  CALL h5dclose_f(dset_id, error)
+  CALL check("h5dclose_f", error, total_error)
+
+  CALL H5Pget_char_encoding_f(lcpl_id, encoding, error)
+  CALL check("H5Pget_char_encoding_f", error, total_error)
+  CALL verify("H5Pget_char_encoding_f", encoding, H5T_CSET_UTF8_F, total_error)
+
+  !  Check that its character encoding is UTF-8 
+  CALL H5Lget_info_f(file_id, "dataset2", &
+       cset, corder, f_corder_valid, link_type, address, val_size, &
+       error)
+  CALL check("H5Lget_info_f", error, total_error)
+  CALL verify("H5Lget_info_f2",cset, H5T_CSET_UTF8_F,total_error)
+
+  !  Create a new link to the dataset with a different character encoding. 
+  CALL H5Pclose_f(lcpl_id, error)
+  CALL check("H5Pclose_f", error, total_error)
+
+  CALL H5Pcreate_f(H5P_LINK_CREATE_F,lcpl_id,error)
+  CALL check("h5Pcreate_f",error,total_error)
+  CALL H5Pset_char_encoding_f(lcpl_id, H5T_CSET_ASCII_F, error)
+  CALL check("H5Pset_char_encoding_f",error, total_error)
+  CALL H5Lcreate_hard_f(file_id, "/dataset2", file_id, "/dataset2_link", error, lcpl_id)
+  CALL check("H5Lcreate_hard_f",error, total_error)
+
+  CALL H5Lexists_f(file_id,"/dataset2_link",Lexists, error)
+  CALL check("H5Lexists",error, total_error)
+  CALL verify("H5Lexists", Lexists,.TRUE.,total_error)
+
+  !  Check that its character encoding is ASCII 
+  CALL H5Lget_info_f(file_id, "/dataset2_link", &
+       cset, corder, f_corder_valid, link_type, address, val_size, &
+       error)
+  CALL check("H5Lget_info_f", error, total_error)
+  CALL verify("H5Lget_info_f",cset, H5T_CSET_ASCII_F,total_error)
+
+  !  Check that the first link's encoding hasn't changed 
+
+  CALL H5Lget_info_f(file_id, "/dataset2", &
+       cset, corder, f_corder_valid, link_type, address, val_size, &
+       error)
+  CALL check("H5Lget_info_f", error, total_error)
+  CALL verify("H5Lget_info_f3",cset, H5T_CSET_UTF8_F,total_error)
+
+
+  ! Make sure that LCPLs work properly for other API calls: 
+  ! H5Lcreate_soft 
+
+  CALL H5Pset_char_encoding_f(lcpl_id, H5T_CSET_UTF8_F, error)
+  CALL check("H5Pset_char_encoding_f",error, total_error)
+  CALL H5Lcreate_soft_f("dataset2", file_id, "slink_to_dset2",error,lcpl_id)
+  CALL check("H5Lcreate_soft_f", error, total_error)
+
+  CALL H5Lget_info_f(file_id, "slink_to_dset2", &
+       cset, corder, f_corder_valid, link_type, address, val_size, &
+       error)
+  CALL check("H5Lget_info_f", error, total_error)
+  CALL verify("H5Lget_info_f",cset, H5T_CSET_UTF8_F,total_error)
+
+
+  !  H5Lmove 
+  CALL H5Pset_char_encoding_f(lcpl_id, H5T_CSET_ASCII_F, error)
+  CALL check("H5Pset_char_encoding_f",error, total_error)
+
+  CALL H5Lmove_f(file_id, "slink_to_dset2", file_id, "moved_slink", error, lcpl_id, H5P_DEFAULT_F)
+  CALL check("H5Lmove_f",error, total_error)
+
+  CALL H5Lget_info_f(file_id, "moved_slink", &
+       cset, corder, f_corder_valid, link_type, address, val_size, &
+       error)
+  CALL check("H5Lget_info_f", error, total_error)
+  CALL verify("H5Lget_info_f",cset, H5T_CSET_ASCII_F,total_error)
+
+
+  !  H5Lcopy 
+
+  CALL H5Pset_char_encoding_f(lcpl_id, H5T_CSET_UTF8_F, error)
+  CALL check("H5Pset_char_encoding_f",error, total_error)
+
+  CALL H5Lcopy_f(file_id, "moved_slink", file_id, "copied_slink", error, lcpl_id)
+
+  CALL H5Lget_info_f(file_id, "copied_slink", &
+       cset, corder, f_corder_valid, link_type, address, val_size, &
+       error)
+  CALL check("H5Lget_info_f", error, total_error)
+  CALL verify("H5Lget_info_f",cset, H5T_CSET_UTF8_F,total_error)
+
+
+  !  H5Lcreate_external 
+
+  CALL H5Lcreate_external_f("filename", "path", file_id, "extlink", error, lcpl_id)
+  CALL check("H5Lcreate_external_f", error, total_error)
+
+  CALL H5Lget_info_f(file_id, "extlink", &
+       cset, corder, f_corder_valid, link_type, address, val_size, &
+       error)
+  CALL check("H5Lget_info_f", error, total_error)
+  CALL verify("H5Lget_info_f",cset, H5T_CSET_UTF8_F,total_error)
+
+
+  !  Close open IDs 
+
+  CALL H5Pclose_f(lcpl_id, error)
+  CALL check("H5Pclose_f", error, total_error)
+  CALL H5Sclose_f(space_id, error)
+  CALL check("h5Sclose_f",error,total_error)
+  CALL H5Fclose_f(file_id, error)
+  CALL check("H5Fclose_f", error, total_error)
+
+  IF(cleanup) CALL h5_cleanup_f("tempfile", H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+
+
+END SUBROUTINE test_lcpl
+
+SUBROUTINE objcopy(fapl, total_error)
+
+  IMPLICIT NONE
+  INTEGER, INTENT(INOUT) :: total_error
+  INTEGER(HID_T), INTENT(IN) :: fapl
+
+  INTEGER(HID_T) :: fapl2, pid
+
+  INTEGER :: flag, cpy_flags
+
+  INTEGER :: error
+
+  flag = H5O_COPY_SHALLOW_HIERARCHY_F
+
+! Copy the file access property list 
+  CALL H5Pcopy_f(fapl, fapl2, error)
+  CALL check("H5Pcopy_f", error, total_error)
+
+! Set the "use the latest version of the format" bounds for creating objects in the file 
+  CALL H5Pset_libver_bounds_f(fapl2, H5F_LIBVER_LATEST_F, H5F_LIBVER_LATEST_F, error)
+
+  !  create property to pass copy options 
+  CALL h5pcreate_f(H5P_OBJECT_COPY_F, pid, error)
+  CALL check("h5pcreate_f",error, total_error)
+
+  !  set options for object copy 
+  CALL H5Pset_copy_object_f(pid, flag, error)
+  CALL check("H5Pset_copy_object_f",error, total_error)
+
+  !  Verify object copy flags 
+  CALL H5Pget_copy_object_f(pid, cpy_flags, error)
+  CALL check("H5Pget_copy_object_f",error, total_error)
+  CALL verify("H5Pget_copy_object_f", cpy_flags, flag, total_error)
+
+!!$
+!!$  CALL test_copy_option(fcpl_src, fcpl_dst, my_fapl, H5O_COPY_WITHOUT_ATTR_FLAG,
+!!$                       FALSE, "H5Ocopy(): without attributes");
+
+  CALL lapl_nlinks(fapl2, total_error)
+
+END SUBROUTINE objcopy
+
+
+!-------------------------------------------------------------------------
+! * Function:    lapl_nlinks
+! *
+! * Purpose:     Check that the maximum number of soft links can be adjusted
+! *              by the user using the Link Access Property List.
+! *
+! * Return:      Success:        0
+! *
+! *              Failure:        -1
+! *
+! * Programmer:  James Laird
+! *              Tuesday, June 6, 2006
+! *
+! * Modifications:
+! *
+! *-------------------------------------------------------------------------
+! 
+
+SUBROUTINE lapl_nlinks( fapl, total_error)
+
+  IMPLICIT NONE
+  INTEGER(HID_T), INTENT(IN) :: fapl
+  INTEGER, INTENT(INOUT) :: total_error
+
+  INTEGER :: error
+
+  INTEGER(HID_T) :: fid = (-1) ! File ID 
+  INTEGER(HID_T) :: gid = (-1), gid2 = (-1) ! Group IDs 
+  INTEGER(HID_T) :: plist = (-1) !  lapl ID 
+  INTEGER(HID_T) :: tid = (-1) !  Other IDs 
+  INTEGER(HID_T) :: gapl = (-1), dapl = (-1), tapl = (-1) !  Other property lists 
+
+  CHARACTER(LEN=7) :: objname !  Object name 
+  INTEGER(size_t) :: name_len !  Length of object name 
+  CHARACTER(LEN=12) :: filename = 'TestLinks.h5'
+  INTEGER(size_t) ::              nlinks !  nlinks for H5Pset_nlinks 
+  INTEGER(size_t) :: buf_size = 7
+
+!  WRITE(*,*) "adjusting nlinks with LAPL (w/new group format)"
+
+
+  !  Create file 
+  CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, access_prp=fapl)
+  CALL check(" lapl_nlinks.h5fcreate_f",error,total_error)
+
+  !  Create group with short name in file (used as target for links) 
+  CALL H5Gcreate_f(fid, "final", gid, error)
+  CALL check(" lapl_nlinks.H5Gcreate_f", error, total_error)
+
+  ! Create chain of soft links to existing object (limited) 
+  CALL H5Lcreate_soft_f("final", fid, "soft1", error)
+  CALL H5Lcreate_soft_f("soft1", fid, "soft2", error)
+  CALL H5Lcreate_soft_f("soft2", fid, "soft3", error)
+  CALL H5Lcreate_soft_f("soft3", fid, "soft4", error)
+  CALL H5Lcreate_soft_f("soft4", fid, "soft5", error)
+  CALL H5Lcreate_soft_f("soft5", fid, "soft6", error)
+  CALL H5Lcreate_soft_f("soft6", fid, "soft7", error)
+  CALL H5Lcreate_soft_f("soft7", fid, "soft8", error)
+  CALL H5Lcreate_soft_f("soft8", fid, "soft9", error)
+  CALL H5Lcreate_soft_f("soft9", fid, "soft10", error)
+  CALL H5Lcreate_soft_f("soft10", fid, "soft11", error)
+  CALL H5Lcreate_soft_f("soft11", fid, "soft12", error)
+  CALL H5Lcreate_soft_f("soft12", fid, "soft13", error)
+  CALL H5Lcreate_soft_f("soft13", fid, "soft14", error)
+  CALL H5Lcreate_soft_f("soft14", fid, "soft15", error)
+  CALL H5Lcreate_soft_f("soft15", fid, "soft16", error)
+  CALL H5Lcreate_soft_f("soft16", fid, "soft17", error)
+
+  ! Close objects 
+  CALL H5Gclose_f(gid, error)
+  CALL check("h5gclose_f",error,total_error)
+  CALL h5fclose_f(fid, error)
+  CALL check("h5fclose_f",error,total_error)
+
+  ! Open file 
+
+  CALL h5fopen_f(FileName, H5F_ACC_RDWR_F, fid, error, fapl)
+  CALL check("h5open_f",error,total_error)
+
+  ! Create LAPL with higher-than-usual nlinks value 
+  ! Create a non-default lapl with udata set to point to the first group 
+
+  CALL H5Pcreate_f(H5P_LINK_ACCESS_F,plist,error)
+  CALL check("h5Pcreate_f",error,total_error)
+  nlinks = 20
+  CALL H5Pset_nlinks_f(plist, nlinks, error)
+  CALL check("H5Pset_nlinks_f",error,total_error)
+  ! Ensure that nlinks was set successfully 
+  nlinks = 0
+  CALL H5Pget_nlinks_f(plist, nlinks, error)
+  CALL check("H5Pset_nlinks_f",error,total_error)
+  CALL verify("H5Pset_nlinks_f",INT(nlinks), 20, total_error)
+
+
+  ! Open object through what is normally too many soft links using
+  ! * new property list 
+
+  CALL H5Oopen_f(fid,"soft17",gid,error,plist)
+  CALL check("H5Oopen_f",error,total_error)
+
+  ! Check name 
+  CALL h5iget_name_f(gid, objname, buf_size, name_len, error)
+  CALL check("h5iget_name_f",error,total_error)
+  CALL verify("h5iget_name_f", TRIM(objname),"/soft17", total_error)
+  ! Create group using soft link 
+  CALL H5Gcreate_f(gid, "new_soft", gid2, error)
+  CALL check("H5Gcreate_f", error, total_error)
+
+  !  Close groups 
+  CALL H5Gclose_f(gid2, error)
+  CALL check("H5Gclose_f", error, total_error)
+  CALL H5Gclose_f(gid, error)
+  CALL check("H5Gclose_f", error, total_error)
+
+
+  ! Set nlinks to a smaller number 
+  nlinks = 4
+  CALL H5Pset_nlinks_f(plist, nlinks, error)
+  CALL check("H5Pset_nlinks_f", error, total_error)
+
+  ! Ensure that nlinks was set successfully 
+  nlinks = 0
+
+  CALL H5Pget_nlinks_f(plist, nlinks, error)
+  CALL check("H5Pget_nlinks_f",error,total_error)
+  CALL verify("H5Pget_nlinks_f", INT(nlinks), 4, total_error)
+
+  !  Try opening through what is now too many soft links 
+
+  CALL H5Oopen_f(fid,"soft5",gid,error,plist)
+  CALL verify("H5Oopen_f", error, -1, total_error) ! should fail
+
+  !  Open object through lesser soft link 
+  CALL H5Oopen_f(fid,"soft4",gid,error,plist)
+  CALL check("H5Oopen_",error,total_error)
+
+  !  Check name 
+  CALL h5iget_name_f(gid, objname, buf_size, name_len, error)
+  CALL check("h5iget_name_f",error,total_error)
+  CALL verify("h5iget_name_f", TRIM(objname),"/soft4", total_error)
+
+  !  Test other functions that should use a LAPL 
+  nlinks = 20
+  CALL H5Pset_nlinks_f(plist, nlinks, error)
+  CALL check("H5Pset_nlinks_f", error, total_error)
+
+  ! Try copying and moving when both src and dst contain many soft links
+  ! * using a non-default LAPL
+  ! 
+  CALL H5Lcopy_f(fid, "soft17", fid, "soft17/newer_soft", error, H5P_DEFAULT_F, plist)
+  CALL check("H5Lcopy_f",error,total_error)
+
+  CALL H5Lmove_f(fid, "soft17/newer_soft", fid, "soft17/newest_soft", error, lapl_id=plist)
+  CALL check("H5Lmove_f",error, total_error)
+
+  !  H5Olink 
+  CALL H5Olink_f(gid, fid, "soft17/link_to_group", error, H5P_DEFAULT_F, plist)
+  CALL check("H5Olink_f", error, total_error)
+
+  !  H5Lcreate_hard and H5Lcreate_soft 
+  CALL H5Lcreate_hard_f(fid, "soft17", fid, "soft17/link2_to_group", error, H5P_DEFAULT_F, plist)
+  CALL check("H5Lcreate_hard_f", error, total_error)
+
+
+  CALL H5Lcreate_soft_f("/soft4", fid, "soft17/soft_link",error, H5P_DEFAULT_F, plist)
+  CALL check("H5Lcreate_soft_f", error, total_error)
+
+  !  H5Ldelete 
+  CALL h5ldelete_f(fid, "soft17/soft_link", error, plist)
+  CALL check("H5Ldelete_f", error, total_error)
+
+!!$     H5Lget_val and H5Lget_info 
+!!$    if(H5Lget_val(fid, "soft17", NULL, (size_t)0, plist) < 0) TEST_ERROR
+!!$    if(H5Lget_info(fid, "soft17", NULL, plist) < 0) TEST_ERROR
+!!$
+
+  !  H5Lcreate_external and H5Lcreate_ud 
+  CALL H5Lcreate_external_f("filename", "path", fid, "soft17/extlink", error, H5P_DEFAULT_F, plist)
+  CALL check("H5Lcreate_external_f", error, total_error)
+
+!!$    if(H5Lregister(UD_rereg_class) < 0) TEST_ERROR
+!!$    if(H5Lcreate_ud(fid, "soft17/udlink", UD_HARD_TYPE, NULL, (size_t)0, H5P_DEFAULT, plist) < 0) TEST_ERROR
+!!$
+    !  Close plist 
+  CALL h5pclose_f(plist, error)
+  CALL check("h5pclose_f", error, total_error)
+
+    !  Create a datatype and dataset as targets inside the group 
+  CALL h5tcopy_f(H5T_NATIVE_INTEGER, tid, error)
+  CALL check("h5tcopy_f",error,total_error)
+  CALL h5tcommit_f(gid, "datatype", tid, error)
+  CALL check("h5tcommit_f", error, total_error)
+  CALL h5tclose_f(tid, error)
+  CALL check("h5tclose_f", error, total_error)
+
+!!$
+!!$    dims[0] = 2;
+!!$    dims[1] = 2;
+!!$    if((sid = H5Screate_simple(2, dims, NULL)) < 0) TEST_ERROR
+!!$    if((did = H5Dcreate2(gid, "dataset", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
+!!$    if(H5Dclose(did) < 0) TEST_ERROR
+!!$
+  ! Close group 
+  CALL h5gclose_f(gid, error)
+  CALL check("h5gclose_f",error,total_error)
+
+!!$
+!!$     Try to open the objects using too many symlinks with default *APLs 
+!!$    H5E_BEGIN_TRY {
+!!$        if((gid = H5Gopen2(fid, "soft17", H5P_DEFAULT)) >= 0)
+!!$            FAIL_PUTS_ERROR("    Should have failed for too many nested links.")
+!!$        if((tid = H5Topen2(fid, "soft17/datatype", H5P_DEFAULT)) >= 0)
+!!$            FAIL_PUTS_ERROR("    Should have failed for too many nested links.")
+!!$        if((did = H5Dopen2(fid, "soft17/dataset", H5P_DEFAULT)) >= 0)
+!!$            FAIL_PUTS_ERROR("    Should have failed for too many nested links.")
+!!$    } H5E_END_TRY
+!!$
+    !  Create property lists with nlinks set 
+
+  CALL H5Pcreate_f(H5P_GROUP_ACCESS_F,gapl,error)
+  CALL check("h5Pcreate_f",error,total_error)
+  CALL H5Pcreate_f(H5P_DATATYPE_ACCESS_F,tapl,error)
+  CALL check("h5Pcreate_f",error,total_error)
+  CALL H5Pcreate_f(H5P_DATASET_ACCESS_F,dapl,error)
+  CALL check("h5Pcreate_f",error,total_error)
+
+
+  nlinks = 20
+  CALL H5Pset_nlinks_f(gapl, nlinks, error)
+  CALL check("H5Pset_nlinks_f", error, total_error)
+  CALL H5Pset_nlinks_f(tapl, nlinks, error)
+  CALL check("H5Pset_nlinks_f", error, total_error)
+  CALL H5Pset_nlinks_f(dapl, nlinks, error)
+  CALL check("H5Pset_nlinks_f", error, total_error)
+
+  ! We should now be able to use these property lists to open each kind
+  ! * of object.
+  ! 
+
+  CALL H5Gopen_f(fid, "soft17", gid, error, gapl)
+  CALL check("H5Gopen_f",error,total_error)
+
+  CALL H5Topen_f(fid, "soft17/datatype", tid, error, tapl)
+  CALL check("H5Gopen_f",error,total_error)
+
+!!$    if((did = H5Dopen2(fid, "soft17/dataset", dapl)) < 0) TEST_ERROR
+
+  !  Close objects 
+
+  CALL h5gclose_f(gid, error)
+  CALL check("h5gclose_f",error,total_error)
+  CALL h5tclose_f(tid, error)
+  CALL check("h5tclose_f", error, total_error)
+
+!!$    if(H5Dclose(did) < 0) TEST_ERROR
+!!$
+  !  Close plists 
+
+  CALL h5pclose_f(gapl, error)
+  CALL check("h5pclose_f", error, total_error)
+  CALL h5pclose_f(tapl, error)
+  CALL check("h5pclose_f", error, total_error)
+
+!!$    if(H5Pclose(dapl) < 0) TEST_ERROR
+!!$
+!!$     Unregister UD hard link class 
+!!$    if(H5Lunregister(UD_HARD_TYPE) < 0) TEST_ERROR
+!!$
+
+  !  Close file 
+  CALL H5Fclose_f(fid, error)
+  CALL check("H5Fclose_f", error, total_error)
+
+END SUBROUTINE lapl_nlinks
+
+END MODULE TH5G_1_8
diff --git a/fortran/test/tH5G_1_8.f90 b/fortran/test/tH5G_1_8.f90
deleted file mode 100644
index ab75163..0000000
--- a/fortran/test/tH5G_1_8.f90
+++ /dev/null
@@ -1,2159 +0,0 @@
-!****h* root/fortran/test/tH5G_1_8.f90
-!
-! NAME
-!  tH5G_1_8.f90
-!
-! FUNCTION
-!  Basic testing of Fortran H5G APIs introduced in 1.8.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! CONTAINS SUBROUTINES
-!  group_test, group_info, timestamps, mklinks, test_move_preserves, lifecycle
-!  cklinks, delete_by_idx, link_info_by_idx_check, test_lcpl, objcopy, 
-!  lapl_nlinks
-!
-!*****
-
-MODULE TH5G_1_8
-
-CONTAINS
-
-SUBROUTINE group_test(cleanup, total_error)
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-
-  IMPLICIT NONE
-  LOGICAL, INTENT(IN)  :: cleanup
-  INTEGER, INTENT(INOUT) :: total_error
-
-  INTEGER(HID_T) :: fapl, fapl2, my_fapl !  File access property lists 
-
-  INTEGER :: error, ret_total_error
-
-!  WRITE(*,*) "TESTING GROUPS"
-  CALL H5Pcreate_f(H5P_FILE_ACCESS_F, fapl, error)
-  CALL check("H5Pcreate_f",error, total_error)
-
-  !  Copy the file access property list 
-  CALL H5Pcopy_f(fapl, fapl2, error)
-  CALL check("H5Pcopy_f",error, total_error)
-
-  !  Set the "use the latest version of the format" bounds for creating objects in the file 
-  CALL H5Pset_libver_bounds_f(fapl2, H5F_LIBVER_LATEST_F, H5F_LIBVER_LATEST_F, error)
-  CALL check("H5Pset_libver_bounds_f",error, total_error)
-
-  !  Check for FAPL to USE 
-  my_fapl = fapl2
-
-  ret_total_error = 0
-  CALL mklinks(fapl2, ret_total_error)
-  CALL write_test_status(ret_total_error, &
-       ' Testing building a file with assorted links', &
-       total_error)
-
-  ret_total_error = 0
-  CALL cklinks(fapl2, ret_total_error)
-  CALL write_test_status(ret_total_error, &
-       ' Testing links are correct and building assorted links', &
-       total_error)
-
-  ret_total_error = 0
-  CALL group_info(cleanup, fapl2, ret_total_error)
-  CALL write_test_status(ret_total_error, &
-       ' Testing create group with creation order indices, test querying group info', &
-       total_error)
-
-! CALL ud_hard_links(fapl2,total_error)
-  ret_total_error = 0
-  CALL timestamps(cleanup, fapl2, ret_total_error)
-  CALL write_test_status(ret_total_error, &
-       ' Testing disabling tracking timestamps for an object', &
-       total_error)
-
-  ret_total_error = 0
-  CALL test_move_preserves(fapl2, ret_total_error)
-  CALL write_test_status(ret_total_error, &
-       ' Testing moving and renaming links preserves their properties', &
-       total_error)
-
-  ret_total_error = 0
-  CALL delete_by_idx(cleanup,fapl2,ret_total_error)
-  CALL write_test_status(ret_total_error, &
-       ' Testing deleting links by index', &
-       total_error)
-
-  ret_total_error = 0
-  CALL test_lcpl(cleanup, fapl, ret_total_error)
-  CALL write_test_status(ret_total_error, &
-       ' Testing link creation property lists', &
-       total_error)
-
-  ret_total_error = 0
-  CALL objcopy(fapl, ret_total_error)
-  CALL write_test_status(ret_total_error, &
-       ' Testing object copy', &
-       total_error)
-
-  ret_total_error = 0
-  CALL lifecycle(cleanup, fapl2, ret_total_error)
-  CALL write_test_status(ret_total_error, &
-       ' Testing adding links to a group follow proper "lifecycle"', &
-       total_error)
-
-  IF(cleanup) CALL h5_cleanup_f("TestLinks", H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-
-
-END SUBROUTINE group_test
-
-!-------------------------------------------------------------------------
-! * Function:    group_info
-! *
-! * Purpose:     Create a group with creation order indices and test querying
-! *              group info.
-! *
-! * Return:      Success:        0
-! *              Failure:        -1
-! *
-! * Programmer:  Adapted from C test routines by
-! *              M.S. Breitenfeld
-! *              February 18, 2008
-! *
-! *-------------------------------------------------------------------------
-! 
-
-SUBROUTINE group_info(cleanup, fapl, total_error)
-
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-
-  IMPLICIT NONE
-  INTEGER, INTENT(INOUT) :: total_error
-  INTEGER(HID_T), INTENT(IN) :: fapl
-
-  INTEGER(HID_T) :: gcpl_id !  Group creation property list ID 
-
-  INTEGER :: max_compact !  Maximum # of links to store in group compactly 
-  INTEGER :: min_dense !  Minimum # of links to store in group "densely" 
-
-  INTEGER :: idx_type !  Type of index to operate on 
-  INTEGER :: order, iorder   !  Order within in the index 
-  LOGICAL, DIMENSION(1:2) :: use_index = (/.FALSE.,.TRUE./) !  Use index on creation order values 
-  CHARACTER(LEN=6), PARAMETER :: prefix = 'links0'
-  CHARACTER(LEN=9), PARAMETER :: filename = prefix//'.h5'  !  File name 
-  INTEGER :: Input1
-  INTEGER(HID_T) :: group_id !  Group ID 
-  INTEGER(HID_T) :: soft_group_id !  Group ID for soft links 
-
-  INTEGER :: i !  Local index variables 
-  INTEGER :: storage_type ! Type of storage for links in group:
-                                          ! H5G_STORAGE_TYPE_COMPACT: Compact storage
-                                          ! H5G_STORAGE_TYPE_DENSE: Indexed storage
-                                          ! H5G_STORAGE_TYPE_SYMBOL_TABLE: Symbol tables, the original HDF5 structure
-  INTEGER :: nlinks ! Number of links in group
-  INTEGER :: max_corder ! Current maximum creation order value for group
-
-  INTEGER :: u,v  !  Local index variables 
-  CHARACTER(LEN=2) :: chr2
-  INTEGER(HID_T) :: group_id2, group_id3 !  Group IDs 
-  CHARACTER(LEN=7) :: objname !  Object name 
-  CHARACTER(LEN=7) :: objname2 !  Object name 
-  CHARACTER(LEN=19) :: valname !   Link value 
-  CHARACTER(LEN=12), PARAMETER :: CORDER_GROUP_NAME = "corder_group"
-  CHARACTER(LEN=17), PARAMETER :: CORDER_SOFT_GROUP_NAME =  "corder_soft_group"
-  INTEGER(HID_T) :: file_id !  File ID 
-  INTEGER :: error !  Generic return value 
-  LOGICAL :: mounted
-  LOGICAL :: cleanup
-
-  !  Create group creation property list 
-  CALL H5Pcreate_f(H5P_GROUP_CREATE_F, gcpl_id, error )
-  CALL check("H5Pcreate_f", error, total_error)
-
-  !  Query the group creation properties 
-  CALL H5Pget_link_phase_change_f(gcpl_id, max_compact, min_dense, error)
-  CALL check("H5Pget_link_phase_change_f", error, total_error)
-
-  !  Loop over operating on different indices on link fields 
-  DO idx_type = H5_INDEX_NAME_F, H5_INDEX_CRT_ORDER_F
-     !  Loop over operating in different orders 
-     DO iorder = H5_ITER_INC_F,  H5_ITER_NATIVE_F
-        !  Loop over using index for creation order value 
-        DO i = 1, 2
-           !  Print appropriate test message 
-           IF(idx_type == H5_INDEX_CRT_ORDER_F)THEN
-              IF(iorder == H5_ITER_INC_F)THEN
-                 order = H5_ITER_INC_F
-!!$                 IF(use_index(i))THEN
-!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in increasing order w/creation order index"
-!!$                 ELSE
-!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in increasing order w/o creation order index"
-!!$                 ENDIF
-              ELSE IF (iorder == H5_ITER_DEC_F) THEN
-                 order = H5_ITER_DEC_F
-!!$                 IF(use_index(i))THEN
-!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in decreasing order w/creation order index"
-!!$                 ELSE
-!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in decreasing order w/o creation order index"
-!!$                 ENDIF
-              ELSE
-                 order = H5_ITER_NATIVE_F
-!!$                 IF(use_index(i))THEN
-!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in native order w/creation order index"
-!!$                 ELSE
-!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in native order w/o creation order index"
-!!$                 ENDIF
-              ENDIF
-           ELSE
-              IF(iorder == H5_ITER_INC_F)THEN
-                 order = H5_ITER_INC_F
-!!$                 IF(use_index(i))THEN
-!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in increasing order w/creation order index"
-!!$                 ELSE
-!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in increasing order w/o creation order index"
-!!$                 ENDIF
-              ELSE IF (iorder == H5_ITER_DEC_F) THEN
-                 order = H5_ITER_DEC_F
-!!$                 IF(use_index(i))THEN
-!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in decreasing order w/creation order index"
-!!$                 ELSE
-!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in decreasing order w/o creation order index"
-!!$                 ENDIF
-              ELSE
-                 order = H5_ITER_NATIVE_F
-!!$                 IF(use_index(i))THEN
-!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in native order w/creation order index"
-!!$                 ELSE
-!!$                    WRITE(*,'(5x,A)')"query group info by creation order index in native order w/o creation order index"
-!!$                 ENDIF
-              ENDIF
-           END IF
-
-           !  Create file 
-           CALL H5Fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, error, H5P_DEFAULT_F, fapl)
-           CALL check("H5Fcreate_f", error, total_error)
-
-           !  Set creation order tracking & indexing on group 
-           IF(use_index(i))THEN
-              Input1 = H5P_CRT_ORDER_INDEXED_F
-           ELSE
-              Input1 = 0
-           ENDIF
-           CALL H5Pset_link_creation_order_f(gcpl_id, IOR(H5P_CRT_ORDER_TRACKED_F, Input1), error)
-           CALL check("H5Pset_link_creation_order_f", error, total_error)
-
-           !  Create group with creation order tracking on 
-           CALL H5Gcreate_f(file_id, CORDER_GROUP_NAME, group_id, error, gcpl_id=gcpl_id)
-           CALL check("H5Gcreate_f", error, total_error)
-
-           !  Create group with creation order tracking on for soft links 
-           CALL H5Gcreate_f(file_id, CORDER_SOFT_GROUP_NAME, soft_group_id, error, &
-                OBJECT_NAMELEN_DEFAULT_F, H5P_DEFAULT_F, gcpl_id)
-           CALL check("H5Gcreate_f", error, total_error)
-
-           !  Check for out of bound query by index on empty group, should fail 
-           CALL H5Gget_info_by_idx_f(group_id, ".", H5_INDEX_NAME_F, order, INT(0,HSIZE_T), &
-                storage_type, nlinks, max_corder, error)
-           CALL VERIFY("H5Gget_info_by_idx_f", error, -1, total_error)
-
-           !  Create several links, up to limit of compact form 
-           DO u = 0, max_compact-1
-
-              !  Make name for link 
-              WRITE(chr2,'(I2.2)') u
-              objname = 'fill '//chr2
-
-              !  Create hard link, with group object 
-              CALL H5Gcreate_f(group_id, objname, group_id2, error, OBJECT_NAMELEN_DEFAULT_F, H5P_DEFAULT_F, gcpl_id)
-              CALL check("H5Gcreate_f", error, total_error)
-
-              !  Retrieve group's information 
-              CALL H5Gget_info_f(group_id2, storage_type, nlinks, max_corder, error, mounted)
-              CALL check("H5Gget_info_f", error, total_error)
-
-              !  Check (new/empty) group's information 
-              CALL VERIFY("H5Gget_info_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
-              CALL VERIFY("H5Gget_info_f", max_corder, 0, total_error)
-              CALL VERIFY("H5Gget_info_f", nlinks, 0, total_error)
-              CALL verifyLogical("H5Gget_info_f.mounted", mounted,.FALSE.,total_error)
-
-              !  Retrieve group's information 
-              CALL H5Gget_info_by_name_f(group_id, objname, storage_type, nlinks, max_corder, error, mounted=mounted)
-              CALL check("H5Gget_info_by_name_f", error, total_error)
-
-              !  Check (new/empty) group's information 
-              CALL VERIFY("H5Gget_info_by_name_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
-              CALL VERIFY("H5Gget_info_by_name_f", max_corder, 0, total_error)
-              CALL VERIFY("H5Gget_info_by_name_f", nlinks, 0, total_error)
-              CALL verifyLogical("H5Gget_info_by_name_f.mounted", mounted,.FALSE.,total_error)
-
-              !  Retrieve group's information 
-              CALL H5Gget_info_by_name_f(group_id2, ".", storage_type, nlinks, max_corder, error)
-              CALL check("H5Gget_info_by_name", error, total_error)
-
-              !  Check (new/empty) group's information 
-              CALL VERIFY("H5Gget_info_by_name_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
-              CALL VERIFY("H5Gget_info_by_name_f", max_corder, 0, total_error)
-              CALL VERIFY("H5Gget_info_by_name_f", nlinks, 0, total_error)
-
-              !  Create objects in new group created 
-              DO v = 0, u
-                 !  Make name for link 
-                 WRITE(chr2,'(I2.2)') v
-                 objname2 = 'fill '//chr2
-
-                 !  Create hard link, with group object 
-                 CALL H5Gcreate_f(group_id2, objname2, group_id3, error )
-                 CALL check("H5Gcreate_f", error, total_error)
-
-                 !  Close group created 
-                 CALL H5Gclose_f(group_id3, error)
-                 CALL check("H5Gclose_f", error, total_error)
-              ENDDO
-
-              !  Retrieve group's information 
-              CALL H5Gget_info_f(group_id2, storage_type, nlinks, max_corder, error)
-              CALL check("H5Gget_info_f", error, total_error)
-
-              !  Check (new) group's information 
-              CALL VERIFY("H5Gget_info_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
-              CALL VERIFY("H5Gget_info_f", max_corder, u+1, total_error)
-              CALL VERIFY("H5Gget_info_f", nlinks, u+1, total_error)
-
-              !  Retrieve group's information 
-              CALL H5Gget_info_by_name_f(group_id, objname, storage_type, nlinks, max_corder, error)
-              CALL check("H5Gget_info_by_name_f", error, total_error)
-
-              !  Check (new) group's information 
-              CALL VERIFY("H5Gget_info_by_name_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
-              CALL VERIFY("H5Gget_info_by_name_f",max_corder, u+1, total_error)
-              CALL VERIFY("H5Gget_info_by_name_f", nlinks, u+1, total_error)
-
-              !  Retrieve group's information 
-              CALL H5Gget_info_by_name_f(group_id2, ".", storage_type, nlinks, max_corder, error)
-              CALL check("H5Gget_info_by_name_f", error, total_error)
-
-              !  Check (new) group's information 
-              CALL VERIFY("H5Gget_info_by_name_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
-              CALL VERIFY("H5Gget_info_by_name_f", max_corder, u+1, total_error)
-              CALL VERIFY("H5Gget_info_by_name_f", nlinks, u+1, total_error)
-
-              !  Retrieve group's information 
-              IF(order.NE.H5_ITER_NATIVE_F)THEN
-                 IF(order.EQ.H5_ITER_INC_F) THEN
-                    CALL H5Gget_info_by_idx_f(group_id, ".", idx_type, order, INT(u,HSIZE_T), &
-                         storage_type, nlinks, max_corder, error,lapl_id=H5P_DEFAULT_F, mounted=mounted)
-                    CALL check("H5Gget_info_by_idx_f", error, total_error)
-                    CALL verifyLogical("H5Gget_info_by_idx_f", mounted,.FALSE.,total_error)
-                 ELSE
-                    CALL H5Gget_info_by_idx_f(group_id, ".", idx_type, order, INT(0,HSIZE_T), &
-                         storage_type, nlinks, max_corder, error, mounted=mounted)
-                    CALL verifyLogical("H5Gget_info_by_idx_f", mounted,.FALSE.,total_error)
-                    CALL check("H5Gget_info_by_idx_f", error, total_error)
-                 ENDIF
-              !  Check (new) group's information 
-                 CALL VERIFY("H5Gget_info_by_idx_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
-                 CALL VERIFY("H5Gget_info_by_idx_f", max_corder, u+1, total_error)
-                 CALL VERIFY("H5Gget_info_by_idx_f", nlinks, u+1, total_error)
-              ENDIF
-              !  Close group created 
-              CALL H5Gclose_f(group_id2, error)
-              CALL check("H5Gclose_f", error, total_error)
-
-              !  Retrieve main group's information 
-              CALL H5Gget_info_f(group_id, storage_type, nlinks, max_corder, error)
-              CALL check("H5Gget_info_f", error, total_error)
-
-              !  Check main group's information 
-              CALL VERIFY("H5Gget_info_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
-              CALL VERIFY("H5Gget_info_f", max_corder, u+1, total_error)
-              CALL VERIFY("H5Gget_info_f", nlinks, u+1, total_error)
-
-              !  Retrieve main group's information, by name 
-              CALL H5Gget_info_by_name_f(file_id, CORDER_GROUP_NAME, storage_type, nlinks, max_corder, error)
-              CALL check("H5Gget_info_by_name_f", error, total_error)
-
-              !  Check main group's information 
-              CALL VERIFY("H5Gget_info_by_name_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
-              CALL VERIFY("H5Gget_info_by_name_f", max_corder, u+1, total_error)
-              CALL VERIFY("H5Gget_info_by_name_f", nlinks, u+1, total_error)
-
-              !  Retrieve main group's information, by name 
-              CALL H5Gget_info_by_name_f(group_id, ".", storage_type, nlinks, max_corder, error, H5P_DEFAULT_F)
-              CALL check("H5Gget_info_by_name_f", error, total_error)
-
-              !  Check main group's information 
-              CALL VERIFY("H5Gget_info_by_name_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
-              CALL VERIFY("H5Gget_info_by_name_f", max_corder, u+1, total_error)
-              CALL VERIFY("H5Gget_info_by_name_f", nlinks, u+1, total_error)
-
-              !  Create soft link in another group, to objects in main group 
-              valname = CORDER_GROUP_NAME//objname
-
-              CALL H5Lcreate_soft_f(valname, soft_group_id, objname, error, H5P_DEFAULT_F, H5P_DEFAULT_F)
-
-              !  Retrieve soft link group's information, by name 
-              CALL H5Gget_info_f(soft_group_id, storage_type, nlinks, max_corder, error)
-              CALL check("H5Gget_info_f", error, total_error)
-
-              !  Check soft link group's information 
-              CALL VERIFY("H5Gget_info_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error)
-              CALL VERIFY("H5Gget_info_f", max_corder, u+1, total_error)
-              CALL VERIFY("H5Gget_info_f", nlinks, u+1, total_error)
-           ENDDO
-
-           !  Close the groups 
-
-              CALL H5Gclose_f(group_id, error)
-              CALL check("H5Gclose_f", error, total_error)
-              CALL H5Gclose_f(soft_group_id, error)
-              CALL check("H5Gclose_f", error, total_error)
-
-              !  Close the file 
-              CALL H5Fclose_f(file_id, error)
-              CALL check("H5Fclose_f", error, total_error)
-           ENDDO
-        ENDDO
-     ENDDO
-
-     !  Free resources 
-     CALL H5Pclose_f(gcpl_id, error)
-     CALL check("H5Pclose_f", error, total_error)
-
-     IF(cleanup) CALL h5_cleanup_f(prefix, H5P_DEFAULT_F, error)
-     CALL check("h5_cleanup_f", error, total_error)
-
-
-   END SUBROUTINE group_info
-
-!-------------------------------------------------------------------------
-! * Function:    timestamps
-! *
-! * Purpose:     Verify that disabling tracking timestamps for an object
-! *              works correctly
-! *
-! *
-! * Programmer:  M.S. Breitenfeld
-! *              February 20, 2008
-! *
-! *-------------------------------------------------------------------------
-! 
-
-   SUBROUTINE timestamps(cleanup, fapl, total_error)
-
-     USE HDF5 ! This module contains all necessary modules
-     USE TH5_MISC
-
-     IMPLICIT NONE
-     INTEGER, INTENT(INOUT) :: total_error
-     INTEGER(HID_T), INTENT(IN) :: fapl
-
-     INTEGER(HID_T) :: file_id ! File ID 
-     INTEGER(HID_T) :: group_id ! Group ID 
-     INTEGER(HID_T) :: group_id2 ! Group ID 
-     INTEGER(HID_T) :: gcpl_id ! Group creation property list ID 
-     INTEGER(HID_T) :: gcpl_id2 ! Group creation property list ID 
-
-     CHARACTER(LEN=6), PARAMETER :: prefix = 'links9'
-     CHARACTER(LEN=9), PARAMETER :: filename = prefix//'.h5'  !  File name 
-     !  Timestamp macros 
-     CHARACTER(LEN=10), PARAMETER :: TIMESTAMP_GROUP_1="timestamp1"
-     CHARACTER(LEN=10), PARAMETER :: TIMESTAMP_GROUP_2="timestamp2"
-     LOGICAL :: track_times
-     LOGICAL :: cleanup
-
-     INTEGER :: error
-
-     !  Print test message 
-!     WRITE(*,*) "timestamps on objects"
-
-     !  Create group creation property list 
-     CALL H5Pcreate_f(H5P_GROUP_CREATE_F, gcpl_id, error )
-     CALL check("H5Pcreate_f", error, total_error)
-
-     !  Query the object timestamp setting 
-     CALL H5Pget_obj_track_times_f(gcpl_id, track_times, error)
-     CALL check("H5Pget_obj_track_times_f", error, total_error)
-
-     ! Check default timestamp information 
-     CALL VerifyLogical("H5Pget_obj_track_times",track_times,.TRUE.,total_error)
-
-     !  Set a non-default object timestamp setting 
-     CALL H5Pset_obj_track_times_f(gcpl_id, .FALSE., error)
-     CALL check("H5Pset_obj_track_times_f", error, total_error)
-
-     !  Query the object timestamp setting 
-     CALL H5Pget_obj_track_times_f(gcpl_id, track_times, error)
-     CALL check("H5Pget_obj_track_times_f", error, total_error)
-
-     !  Check default timestamp information 
-     CALL VerifyLogical("H5Pget_obj_track_times",track_times,.FALSE.,total_error)
-
-     !  Create file 
-     !h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
-
-     CALL H5Fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, error, H5P_DEFAULT_F, fapl)
-     CALL check("h5fcreate_f",error,total_error)
-
-    !  Create group with non-default object timestamp setting 
-     CALL h5gcreate_f(file_id, TIMESTAMP_GROUP_1, group_id, error, &
-          OBJECT_NAMELEN_DEFAULT_F, H5P_DEFAULT_F, gcpl_id, H5P_DEFAULT_F)
-     CALL check("h5fcreate_f",error,total_error)
-
-    !  Close the group creation property list 
-     CALL H5Pclose_f(gcpl_id, error)
-     CALL check("H5Pclose_f", error, total_error)
-
-    !  Create group with default object timestamp setting 
-     CALL h5gcreate_f(file_id, TIMESTAMP_GROUP_2, group_id2, error, &
-          OBJECT_NAMELEN_DEFAULT_F, H5P_DEFAULT_F, H5P_DEFAULT_F, H5P_DEFAULT_F)
-     CALL check("h5fcreate_f",error,total_error)
-
-    !  Retrieve the new groups' creation properties 
-     CALL H5Gget_create_plist_f(group_id, gcpl_id, error)
-     CALL check("H5Gget_create_plist", error, total_error)
-     CALL H5Gget_create_plist_f(group_id2, gcpl_id2, error)
-     CALL check("H5Gget_create_plist", error, total_error)
-
-    !  Query & verify the object timestamp settings 
-     CALL H5Pget_obj_track_times_f(gcpl_id, track_times, error)
-     CALL check("H5Pget_obj_track_times_f", error, total_error)
-     CALL VerifyLogical("H5Pget_obj_track_times1",track_times,.FALSE.,total_error)
-     CALL H5Pget_obj_track_times_f(gcpl_id2, track_times, error)
-     CALL check("H5Pget_obj_track_times_f", error, total_error)
-     CALL VerifyLogical("H5Pget_obj_track_times2",track_times,.TRUE.,total_error)
-
-!     Query the object information for each group 
-!    if(H5Oget_info(group_id, &oinfo) < 0) TEST_ERROR
-!    if(H5Oget_info(group_id2, &oinfo2) < 0) TEST_ERROR
-
-!!$     Sanity check object information for each group 
-!!$    if(oinfo.atime != 0) TEST_ERROR
-!!$    if(oinfo.mtime != 0) TEST_ERROR
-!!$    if(oinfo.ctime != 0) TEST_ERROR
-!!$    if(oinfo.btime != 0) TEST_ERROR
-!!$    if(oinfo.atime == oinfo2.atime) TEST_ERROR
-!!$    if(oinfo.mtime == oinfo2.mtime) TEST_ERROR
-!!$    if(oinfo.ctime == oinfo2.ctime) TEST_ERROR
-!!$    if(oinfo.btime == oinfo2.btime) TEST_ERROR
-!!$    if((oinfo.hdr.flags & H5O_HDR_STORE_TIMES) != 0) TEST_ERROR
-!!$    if((oinfo2.hdr.flags & H5O_HDR_STORE_TIMES) == 0) TEST_ERROR
-!!$    if(oinfo.hdr.space.total >= oinfo2.hdr.space.total) TEST_ERROR
-!!$    if(oinfo.hdr.space.meta >= oinfo2.hdr.space.meta) TEST_ERROR
-
-     !  Close the property lists 
-     CALL H5Pclose_f(gcpl_id, error)
-     CALL check("H5Pclose_f", error, total_error)
-     CALL H5Pclose_f(gcpl_id2, error)
-     CALL check("H5Pclose_f", error, total_error)
-
-     !  Close the groups 
-     CALL H5Gclose_f(group_id, error)
-     CALL check("H5Gclose_f", error, total_error)
-     CALL H5Gclose_f(group_id2, error)
-     CALL check("H5Gclose_f", error, total_error)
-
-     ! Close the file 
-     CALL H5Fclose_f(file_id, error)
-     CALL check("H5Fclose_f", error, total_error)
-
-     ! Re-open the file 
-
-     CALL h5fopen_f(FileName, H5F_ACC_RDONLY_F, file_id, error, H5P_DEFAULT_F)
-     CALL check("h5fopen_f",error,total_error)
-
-     ! Open groups 
-     CALL H5Gopen_f(file_id, TIMESTAMP_GROUP_1, group_id, error) ! with no optional param.
-     CALL check("H5Gopen_f", error, total_error)
-     CALL H5Gopen_f(file_id, TIMESTAMP_GROUP_2, group_id2, error, H5P_DEFAULT_F) ! with optional param.
-     CALL check("H5Gopen_f", error, total_error)
-
-    !  Retrieve the new groups' creation properties 
-     CALL H5Gget_create_plist_f(group_id, gcpl_id, error)
-     CALL check("H5Gget_create_plist", error, total_error)
-     CALL H5Gget_create_plist_f(group_id2, gcpl_id2, error)
-     CALL check("H5Gget_create_plist", error, total_error)
-
-    !  Query & verify the object timestamp settings 
-
-     CALL H5Pget_obj_track_times_f(gcpl_id, track_times, error)
-     CALL check("H5Pget_obj_track_times_f", error, total_error)
-     CALL VerifyLogical("H5Pget_obj_track_times1",track_times,.FALSE.,total_error)
-     CALL H5Pget_obj_track_times_f(gcpl_id2, track_times, error)
-     CALL check("H5Pget_obj_track_times_f", error, total_error)
-     CALL VerifyLogical("H5Pget_obj_track_times2",track_times,.TRUE.,total_error)
-!!$
-!!$     Query the object information for each group 
-!!$    if(H5Oget_info(group_id, &oinfo) < 0) TEST_ERROR
-!!$    if(H5Oget_info(group_id2, &oinfo2) < 0) TEST_ERROR
-!!$
-!!$     Sanity check object information for each group 
-!!$    if(oinfo.atime != 0) TEST_ERROR
-!!$    if(oinfo.mtime != 0) TEST_ERROR
-!!$    if(oinfo.ctime != 0) TEST_ERROR
-!!$    if(oinfo.btime != 0) TEST_ERROR
-!!$    if(oinfo.atime == oinfo2.atime) TEST_ERROR
-!!$    if(oinfo.mtime == oinfo2.mtime) TEST_ERROR
-!!$    if(oinfo.ctime == oinfo2.ctime) TEST_ERROR
-!!$    if(oinfo.btime == oinfo2.btime) TEST_ERROR
-!!$    if((oinfo.hdr.flags & H5O_HDR_STORE_TIMES) != 0) TEST_ERROR
-!!$    if((oinfo2.hdr.flags & H5O_HDR_STORE_TIMES) == 0) TEST_ERROR
-!!$    if(oinfo.hdr.space.total >= oinfo2.hdr.space.total) TEST_ERROR
-!!$    if(oinfo.hdr.space.meta >= oinfo2.hdr.space.meta) TEST_ERROR
-
-     !  Close the property lists 
-     CALL H5Pclose_f(gcpl_id, error)
-     CALL check("H5Pclose_f", error, total_error)
-     CALL H5Pclose_f(gcpl_id2, error)
-     CALL check("H5Pclose_f", error, total_error)
-
-     !  Close the groups 
-     CALL H5Gclose_f(group_id, error)
-     CALL check("H5Gclose_f", error, total_error)
-     CALL H5Gclose_f(group_id2, error)
-     CALL check("H5Gclose_f", error, total_error)
-
-     ! Close the file 
-     CALL H5Fclose_f(file_id, error)
-     CALL check("H5Fclose_f", error, total_error)
-
-     IF(cleanup) CALL h5_cleanup_f(prefix, H5P_DEFAULT_F, error)
-     CALL check("h5_cleanup_f", error, total_error)
-
-   END SUBROUTINE timestamps
-
-!-------------------------------------------------------------------------
-! * Function:	mklinks
-! *
-! * Purpose:	Build a file with assorted links.
-! *
-! *
-! * Programmer:	Adapted from C test by:
-! *             M.S. Breitenfeld
-! *
-! * Modifications:
-! *
-! *-------------------------------------------------------------------------
-! 
-
-   SUBROUTINE mklinks(fapl, total_error)
-
-     USE HDF5 ! This module contains all necessary modules
-     USE TH5_MISC
-
-     IMPLICIT NONE
-     INTEGER, INTENT(INOUT) :: total_error
-     INTEGER(HID_T), INTENT(IN) :: fapl
-
-     INTEGER(HID_T) :: file, scalar, grp, d1
-     CHARACTER(LEN=12), PARAMETER :: filename ='TestLinks.h5'
-     INTEGER(HSIZE_T), DIMENSION(1) :: adims2 = (/1/) ! Attribute dimension
-     INTEGER ::   arank = 1                      ! Attribure rank
-     INTEGER :: error
-
-     INTEGER :: cset ! Indicates the character set used for the link’s name.
-     INTEGER :: corder ! Specifies the link’s creation order position.
-     LOGICAL :: f_corder_valid ! Indicates whether the value in corder is valid.
-     INTEGER :: link_type ! Specifies the link class:
-                          !  H5L_TYPE_HARD_F      - Hard link
-                          !  H5L_TYPE_SOFT_F      - Soft link
-                          !  H5L_TYPE_EXTERNAL_F  - External link
-                          !  H5L_TYPE_ERROR _F    - Error
-     INTEGER(HADDR_T) :: address  ! If the link is a hard link, address specifies the file address that the link points to
-     INTEGER(SIZE_T) :: val_size ! If the link is a symbolic link, val_size will be the length of the link value
-
-
-!     WRITE(*,*) "link creation (w/new group format)"
-
-     !  Create a file 
-     CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, file, error, H5P_DEFAULT_F, fapl)
-     CALL check("mklinks.h5fcreate_f",error,total_error)
-     CALL h5screate_simple_f(arank, adims2, scalar, error)
-     CALL check("mklinks.h5screate_simple_f",error,total_error)
-
-     ! Create a group 
-     CALL H5Gcreate_f(file, "grp1", grp, error)
-     CALL check("H5Gcreate_f", error, total_error)
-     CALL H5Gclose_f(grp, error)
-     CALL check("h5gclose_f",error,total_error)
-
-     ! Create a dataset 
-     CALL h5dcreate_f(file, "d1", H5T_NATIVE_INTEGER, scalar, d1, error)
-     CALL check("h5dcreate_f",error,total_error)
-     CALL h5dclose_f(d1, error)
-     CALL check("h5dclose_f",error,total_error)
-
-     ! Create a hard link 
-     CALL H5Lcreate_hard_f(file, "d1", INT(H5L_SAME_LOC_F,HID_T), "grp1/hard", error)
-     CALL check("H5Lcreate_hard_f", error, total_error)
-
-     ! Create a symbolic link 
-     CALL H5Lcreate_soft_f("/d1", file, "grp1/soft",error)
-     CALL check("H5Lcreate_soft_f", error, total_error)
-
-     CALL H5Lget_info_f(file, "grp1/soft", &
-          cset, corder, f_corder_valid, link_type, address, val_size, &
-          error, H5P_DEFAULT_F)
-     CALL check("H5Lget_info_f",error,total_error)
-
-!     CALL VerifyLogical("H5Lget_info_by_idx_f11", f_corder_valid, .TRUE., total_error)
-
-     CALL VERIFY("H5Lget_info_by_idx_f", H5L_TYPE_SOFT_F, link_type, total_error)
-     CALL VERIFY("H5Lget_info_by_idx_f", cset, H5T_CSET_ASCII_F, total_error)
-     ! should be '/d1' + NULL character = 4
-     CALL VERIFY("H5Lget_info_by_idx_f", INT(val_size), 4, total_error)
-
-    ! Create a symbolic link to something that doesn't exist 
-
-     CALL H5Lcreate_soft_f("foobar", file, "grp1/dangle",error)
-
-    ! Create a recursive symbolic link 
-     CALL H5Lcreate_soft_f("/grp1/recursive", file, "/grp1/recursive",error)
-
-    ! Close 
-     CALL h5sclose_f(scalar, error)
-     CALL check("h5sclose_f",error,total_error)
-     CALL h5fclose_f(file, error)
-     CALL check("h5fclose_f",error,total_error)
-
-  END SUBROUTINE mklinks
-
-!-------------------------------------------------------------------------
-! * Function:    test_move_preserves
-! *
-! * Purpose:     Tests that moving and renaming links preserves their
-! *              properties.
-! *
-! * Programmer:  M.S. Breitenfeld
-! *              March 3, 2008
-! *
-! * Modifications:
-! *
-! *-------------------------------------------------------------------------
-! 
-
-  SUBROUTINE test_move_preserves(fapl_id, total_error)
-
-    USE HDF5 ! This module contains all necessary modules
-    USE TH5_MISC
-
-    IMPLICIT NONE
-    INTEGER, INTENT(INOUT) :: total_error
-    INTEGER(HID_T), INTENT(IN) :: fapl_id
-
-    INTEGER(HID_T):: file_id
-    INTEGER(HID_T):: group_id
-    INTEGER(HID_T):: fcpl_id !  Group creation property list ID 
-    INTEGER(HID_T):: lcpl_id
-    !H5O_info_t oinfo;
-    !H5L_info_t linfo;
-    INTEGER :: old_cset
-    INTEGER :: old_corder
-    !H5T_cset_t old_cset;
-    !int64_t old_corder;          Creation order value of link 
-    !time_t old_modification_time;
-    !time_t curr_time;
-    !unsigned crt_order_flags;    Status of creation order info for GCPL 
-    !char filename[1024];
-
-    INTEGER :: crt_order_flags !  Status of creation order info for GCPL 
-    CHARACTER(LEN=12), PARAMETER :: filename = 'TestLinks.h5'
-
-    INTEGER :: cset ! Indicates the character set used for the link’s name.
-    INTEGER :: corder ! Specifies the link’s creation order position.
-    LOGICAL :: f_corder_valid ! Indicates whether the value in corder is valid.
-    INTEGER :: link_type ! Specifies the link class:
-                         !  H5L_TYPE_HARD_F      - Hard link
-                         !  H5L_TYPE_SOFT_F      - Soft link
-                         !  H5L_TYPE_EXTERNAL_F  - External link
-                         !  H5L_TYPE_ERROR _F    - Error
-    INTEGER(HADDR_T) :: address  ! If the link is a hard link, address specifies the file address that the link points to
-    INTEGER(SIZE_T) :: val_size ! If the link is a symbolic link, val_size will be the length of the link value
-
-    INTEGER :: error
-
-!    WRITE(*,*) "moving and copying links preserves their properties (w/new group format)"
-
-    ! Create a file creation property list with creation order stored for links
-    ! * in the root group
-    ! 
-
-    CALL H5Pcreate_f(H5P_FILE_CREATE_F, fcpl_id, error)
-    CALL check("H5Pcreate_f",error, total_error)
-
-    CALL H5Pget_link_creation_order_f(fcpl_id, crt_order_flags, error)
-    CALL check("H5Pget_link_creation_order_f",error, total_error)
-    CALL VERIFY("H5Pget_link_creation_order_f",crt_order_flags,0, total_error)
-
-    CALL H5Pset_link_creation_order_f(fcpl_id, H5P_CRT_ORDER_TRACKED_F, error)
-    CALL check("H5Pset_link_creation_order_f", error, total_error)
-
-    CALL H5Pget_link_creation_order_f(fcpl_id, crt_order_flags, error)
-    CALL check("H5Pget_link_creation_order_f",error, total_error)
-    CALL VERIFY("H5Pget_link_creation_order_f",crt_order_flags, H5P_CRT_ORDER_TRACKED_F, total_error)
-
-    ! Create file 
-    ! (with creation order tracking for the root group) 
-
-    CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, file_id, error, fcpl_id, fapl_id)
-    CALL check("h5fcreate_f",error,total_error)
-
-    ! Create a link creation property list with the UTF-8 character encoding 
-    CALL H5Pcreate_f(H5P_LINK_CREATE_F, lcpl_id, error)
-    CALL check("H5Pcreate_f",error, total_error)
-
-    CALL H5Pset_char_encoding_f(lcpl_id, H5T_CSET_UTF8_F, error)
-    CALL check("H5Pset_char_encoding_f",error, total_error)
-
-    ! Create a group with that lcpl 
-    CALL H5Gcreate_f(file_id, "group", group_id, error,lcpl_id=lcpl_id, gcpl_id=H5P_DEFAULT_F, gapl_id=H5P_DEFAULT_F)
-    CALL check("H5Gcreate_f", error, total_error)
-    CALL H5Gclose_f(group_id, error)
-    CALL check("H5Gclose_f", error, total_error)
-
-    !  Get the group's link's information 
-    CALL H5Lget_info_f(file_id, "group", &
-         cset, corder, f_corder_valid, link_type, address, val_size, &
-         error, H5P_DEFAULT_F)
-    CALL check("H5Lget_info_f",error,total_error)
-
-!    if(H5Oget_info_by_name(file_id, "group", &oinfo, H5P_DEFAULT) < 0) TEST_ERROR
-
-    old_cset = cset
-    CALL VERIFY("H5Lget_info_f",old_cset,H5T_CSET_UTF8_F,total_error)
-    CALL VerifyLogical("H5Lget_info_f",f_corder_valid,.TRUE.,total_error)
-    old_corder = corder;
-    CALL VERIFY("H5Lget_info_f",old_corder,0,total_error)
-
-!    old_modification_time = oinfo.mtime;
-
-!     If this test happens too quickly, the times will all be the same.  Make sure the time changes. 
-!    curr_time = HDtime(NULL);
-!    while(HDtime(NULL) <= curr_time)
-!        ;
-
-!     Close the file and reopen it 
-    CALL H5Fclose_f(file_id, error)
-    CALL check("H5Fclose_f", error, total_error)
-
-!!$    if((file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id)) < 0) TEST_ERROR
-!!$
-!!$     Get the link's character set & modification time .  They should be unchanged 
-!!$    if(H5Lget_info(file_id, "group", &linfo, H5P_DEFAULT) < 0) TEST_ERROR
-!!$    if(H5Oget_info_by_name(file_id, "group", &oinfo, H5P_DEFAULT) < 0) TEST_ERROR
-!!$    if(old_modification_time != oinfo.mtime) TEST_ERROR
-!!$    if(old_cset != linfo.cset) TEST_ERROR
-!!$    if(linfo.corder_valid != TRUE) TEST_ERROR
-!!$    if(old_corder != linfo.corder) TEST_ERROR
-!!$
-!!$     Create a new link to the group.  It should have a different creation order value but the same modification time 
-!!$    if(H5Lcreate_hard(file_id, "group", file_id, "group2", H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
-!!$    if(H5Oget_info_by_name(file_id, "group2", &oinfo, H5P_DEFAULT) < 0) TEST_ERROR
-!!$    if(old_modification_time != oinfo.mtime) TEST_ERROR
-!!$    if(H5Lget_info(file_id, "group2", &linfo, H5P_DEFAULT) < 0) TEST_ERROR
-!!$    if(old_corder == linfo.corder) TEST_ERROR
-!!$    if(linfo.corder_valid != TRUE) TEST_ERROR
-!!$    if(linfo.corder != 1) TEST_ERROR
-!!$    if(linfo.cset != H5T_CSET_ASCII) TEST_ERROR
-!!$
-!!$     Copy the first link to a UTF-8 name.
-!!$     *  Its creation order value should be different, but modification time
-!!$     * should not change.
-!!$     
-!!$    if(H5Lcopy(file_id, "group", file_id, "group_copied", lcpl_id, H5P_DEFAULT) < 0) TEST_ERROR
-!!$    if(H5Oget_info_by_name(file_id, "group_copied", &oinfo, H5P_DEFAULT) < 0) TEST_ERROR
-!!$    if(old_modification_time != oinfo.mtime) TEST_ERROR
-!!$    if(H5Lget_info(file_id, "group_copied", &linfo, H5P_DEFAULT) < 0) TEST_ERROR
-!!$    if(linfo.corder_valid != TRUE) TEST_ERROR
-!!$    if(linfo.corder != 2) TEST_ERROR
-!!$
-!!$     Check that its character encoding is UTF-8 
-!!$    if(linfo.cset != H5T_CSET_UTF8) TEST_ERROR
-!!$
-!!$     Move the link with the default property list. 
-!!$    if(H5Lmove(file_id, "group_copied", file_id, "group_copied2", H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
-!!$    if(H5Oget_info_by_name(file_id, "group_copied2", &oinfo, H5P_DEFAULT) < 0) TEST_ERROR
-!!$    if(old_modification_time != oinfo.mtime) TEST_ERROR
-!!$    if(H5Lget_info(file_id, "group_copied2", &linfo, H5P_DEFAULT) < 0) TEST_ERROR
-!!$    if(linfo.corder_valid != TRUE) TEST_ERROR
-!!$    if(linfo.corder != 3) TEST_ERROR
-!!$
-!!$     Check that its character encoding is not UTF-8 
-!!$    if(linfo.cset == H5T_CSET_UTF8) TEST_ERROR
-!!$
-!!$     Check that the original link is unchanged 
-!!$    if(H5Oget_info_by_name(file_id, "group", &oinfo, H5P_DEFAULT) < 0) TEST_ERROR
-!!$    if(old_modification_time != oinfo.mtime) TEST_ERROR
-!!$    if(H5Lget_info(file_id, "group", &linfo, H5P_DEFAULT) < 0) TEST_ERROR
-!!$    if(linfo.corder_valid != TRUE) TEST_ERROR
-!!$    if(old_corder != linfo.corder) TEST_ERROR
-!!$    if(linfo.cset != H5T_CSET_UTF8) TEST_ERROR
-!!$
-!!$     Move the first link to a UTF-8 name.
-!!$     *  Its creation order value will change, but modification time should not
-!!$     *  change. 
-!!$    if(H5Lmove(file_id, "group", file_id, "group_moved", lcpl_id, H5P_DEFAULT) < 0) TEST_ERROR
-!!$    if(H5Oget_info_by_name(file_id, "group_moved", &oinfo, H5P_DEFAULT) < 0) TEST_ERROR
-!!$    if(old_modification_time != oinfo.mtime) TEST_ERROR
-!!$    if(H5Lget_info(file_id, "group_moved", &linfo, H5P_DEFAULT) < 0) TEST_ERROR
-!!$    if(linfo.corder_valid != TRUE) TEST_ERROR
-!!$    if(linfo.corder != 4) TEST_ERROR
-!!$
-!!$     Check that its character encoding is UTF-8 
-!!$    if(linfo.cset != H5T_CSET_UTF8) TEST_ERROR
-!!$
-!!$     Move the link again using the default property list. 
-!!$    if(H5Lmove(file_id, "group_moved", file_id, "group_moved_again", H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
-!!$    if(H5Oget_info_by_name(file_id, "group_moved_again", &oinfo, H5P_DEFAULT) < 0) TEST_ERROR
-!!$    if(old_modification_time != oinfo.mtime) TEST_ERROR
-!!$    if(H5Lget_info(file_id, "group_moved_again", &linfo, H5P_DEFAULT) < 0) TEST_ERROR
-!!$    if(linfo.corder_valid != TRUE) TEST_ERROR
-!!$    if(linfo.corder != 5) TEST_ERROR
-!!$
-!!$     Check that its character encoding is not UTF-8 
-!!$    if(linfo.cset == H5T_CSET_UTF8) TEST_ERROR
-
-    !  Close open IDs 
-     CALL H5Pclose_f(fcpl_id, error)
-     CALL check("H5Pclose_f", error, total_error)
-     CALL H5Pclose_f(lcpl_id, error)
-     CALL check("H5Pclose_f", error, total_error)
-
-    ! if(H5Fclose(file_id) < 0) TEST_ERROR
-
-   END SUBROUTINE test_move_preserves
-
-!-------------------------------------------------------------------------
-! * Function:    lifecycle
-! *
-! * Purpose:     Test that adding links to a group follow proper "lifecycle"
-! *              of empty->compact->symbol table->compact->empty.  (As group
-! *              is created, links are added, then links removed)
-! *
-! * Return:      Success:        0
-! *
-! *              Failure:        -1
-! *
-! * Programmer:  Quincey Koziol
-! *              Monday, October 17, 2005
-! *
-! *-------------------------------------------------------------------------
-! 
-SUBROUTINE lifecycle(cleanup, fapl2, total_error)
-
-
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-
-  IMPLICIT NONE
-  INTEGER, INTENT(INOUT) :: total_error
-  INTEGER(HID_T), INTENT(IN) :: fapl2
-  INTEGER :: error
-
-  INTEGER, PARAMETER :: NAME_BUF_SIZE =7
-
-  INTEGER(HID_T) :: fid            ! File ID 
-  INTEGER(HID_T) :: gid            ! Group ID 
-  INTEGER(HID_T) :: gcpl           ! Group creation property list ID 
-  INTEGER(size_t) :: lheap_size_hint ! Local heap size hint 
-  INTEGER :: max_compact            ! Maximum # of links to store in group compactly 
-  INTEGER :: min_dense              ! Minimum # of links to store in group "densely" 
-  INTEGER :: est_num_entries        ! Estimated # of entries in group 
-  INTEGER :: est_name_len           ! Estimated length of entry name 
-  CHARACTER(LEN=NAME_BUF_SIZE) :: filename = 'fixx.h5'
-  INTEGER(SIZE_T) :: LIFECYCLE_LOCAL_HEAP_SIZE_HINT = 256
-  INTEGER :: LIFECYCLE_MAX_COMPACT = 4
-  INTEGER :: LIFECYCLE_MIN_DENSE = 3
-  INTEGER :: LIFECYCLE_EST_NUM_ENTRIES = 4
-  INTEGER :: LIFECYCLE_EST_NAME_LEN=8
-  CHARACTER(LEN=3) :: LIFECYCLE_TOP_GROUP="top"
-! These value are taken from H5Gprivate.h
-  INTEGER :: H5G_CRT_GINFO_MAX_COMPACT = 8
-  INTEGER :: H5G_CRT_GINFO_MIN_DENSE = 6
-  INTEGER :: H5G_CRT_GINFO_EST_NUM_ENTRIES = 4
-  INTEGER :: H5G_CRT_GINFO_EST_NAME_LEN = 8
-  logical :: cleanup
-
-!  WRITE(*,*) 'group lifecycle'
-
-  !  Create file 
-  CALL H5Fcreate_f(filename, H5F_ACC_TRUNC_F, fid, error, access_prp=fapl2)
-  CALL check("H5Fcreate_f",error,total_error)
-
-  ! Close file 
-  CALL H5Fclose_f(fid,error)
-  CALL check("H5Fclose_f",error,total_error)
-
-  !  Get size of file as empty 
-  ! if((empty_size = h5_get_file_size(filename)) < 0) TEST_ERROR
-
-  !  Re-open file 
-
-  CALL H5Fopen_f(filename, H5F_ACC_RDWR_F, fid, error,access_prp=fapl2)
-  CALL check("H5Fopen_f",error,total_error)
-
-
-  !  Set up group creation property list 
-  CALL H5Pcreate_f(H5P_GROUP_CREATE_F,gcpl,error)
-  CALL check("H5Pcreate_f",error,total_error)
-
-
-  !  Query default group creation property settings 
-  CALL H5Pget_local_heap_size_hint_f(gcpl, lheap_size_hint, error)
-  CALL check("H5Pget_local_heap_size_hint_f",error,total_error)
-  CALL verify("H5Pget_local_heap_size_hint_f", INT(lheap_size_hint),0,total_error)
-
-  CALL H5Pget_link_phase_change_f(gcpl, max_compact, min_dense, error)
-  CALL check("H5Pget_link_phase_change_f", error, total_error)
-  CALL verify("H5Pget_link_phase_change_f", max_compact, H5G_CRT_GINFO_MAX_COMPACT,total_error)
-  CALL verify("H5Pget_link_phase_change_f", min_dense, H5G_CRT_GINFO_MIN_DENSE,total_error)
-
-
-  CALL H5Pget_est_link_info_f(gcpl, est_num_entries, est_name_len, error)
-  CALL check("H5Pget_est_link_info_f", error, total_error)
-  CALL verify("H5Pget_est_link_info_f", est_num_entries, H5G_CRT_GINFO_EST_NUM_ENTRIES,total_error)
-  CALL verify("H5Pget_est_link_info_f", est_name_len, H5G_CRT_GINFO_EST_NAME_LEN,total_error)
-
-
-  ! Set GCPL parameters 
-
-  CALL H5Pset_local_heap_size_hint_f(gcpl, LIFECYCLE_LOCAL_HEAP_SIZE_HINT, error)
-  CALL check("H5Pset_local_heap_size_hint_f", error, total_error)
-  CALL H5Pset_link_phase_change_f(gcpl, LIFECYCLE_MAX_COMPACT, LIFECYCLE_MIN_DENSE, error)
-  CALL check("H5Pset_link_phase_change_f", error, total_error)
-  CALL H5Pset_est_link_info_f(gcpl, LIFECYCLE_EST_NUM_ENTRIES, LIFECYCLE_EST_NAME_LEN, error)
-  CALL check("H5Pset_est_link_info_f", error, total_error)
-
-  !  Create group for testing lifecycle 
-
-  CALL H5Gcreate_f(fid, LIFECYCLE_TOP_GROUP, gid, error, gcpl_id=gcpl)
-  CALL check("H5Gcreate_f", error, total_error)
-
-  !  Query group creation property settings 
-
-  CALL H5Pget_local_heap_size_hint_f(gcpl, lheap_size_hint, error)
-  CALL check("H5Pget_local_heap_size_hint_f",error,total_error)
-  CALL verify("H5Pget_local_heap_size_hint_f", INT(lheap_size_hint),INT(LIFECYCLE_LOCAL_HEAP_SIZE_HINT),total_error)
-
-  CALL H5Pget_link_phase_change_f(gcpl, max_compact, min_dense, error)
-  CALL check("H5Pget_link_phase_change_f", error, total_error)
-  CALL verify("H5Pget_link_phase_change_f", max_compact, LIFECYCLE_MAX_COMPACT,total_error)
-  CALL verify("H5Pget_link_phase_change_f", min_dense, LIFECYCLE_MIN_DENSE,total_error)
-
-  CALL H5Pget_est_link_info_f(gcpl, est_num_entries, est_name_len, error)
-  CALL check("H5Pget_est_link_info_f", error, total_error)
-  CALL verify("H5Pget_est_link_info_f", est_num_entries, LIFECYCLE_EST_NUM_ENTRIES,total_error)
-  CALL verify("H5Pget_est_link_info_f", est_name_len, LIFECYCLE_EST_NAME_LEN,total_error)
-
-
-
-    ! Close top group 
-    CALL H5Gclose_f(gid, error)
-    CALL check("H5Gclose_f", error, total_error)
-
-    ! Unlink top group 
-
-    CALL H5Ldelete_f(fid, LIFECYCLE_TOP_GROUP, error)
-    CALL check("H5Ldelete_f", error, total_error)
-
-    !  Close GCPL 
-    CALL H5Pclose_f(gcpl, error)
-    CALL check("H5Pclose_f", error, total_error)
-
-    !  Close file 
-    CALL H5Fclose_f(fid,error)
-    CALL check("H5Fclose_f",error,total_error)
-
-    IF(cleanup) CALL h5_cleanup_f("fixx", H5P_DEFAULT_F, error)
-    CALL check("h5_cleanup_f", error, total_error)
-
-  END SUBROUTINE lifecycle
-
-!-------------------------------------------------------------------------
-! * Function:	cklinks
-! *
-! * Purpose:	Open the file created in the first step and check that the
-! *		links look correct.
-! *
-! * Return:	Success:	0
-! *
-! *		Failure:	-1
-! *
-! * Programmer:	M.S. Breitenfeld
-! *             April 14, 2008
-! *
-! * Modifications: Modified original C code
-! *
-! *-------------------------------------------------------------------------
-! 
-
-
-  SUBROUTINE cklinks(fapl, total_error)
-
-!    USE ISO_C_BINDING
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-
-  IMPLICIT NONE
-  INTEGER, INTENT(INOUT) :: total_error
-  INTEGER(HID_T), INTENT(IN) :: fapl
-  INTEGER :: error
-
-  INTEGER(HID_T) :: file
-!    H5O_info_t		oinfo1, oinfo2;
-!    H5L_info_t		linfo2;
-
-  CHARACTER(LEN=12), PARAMETER :: filename ='TestLinks.h5'
-
-!  TYPE(C_PTR) :: linkval
-
-  LOGICAL :: Lexists
-
-  !  Open the file 
-  CALL H5Fopen_f(filename, H5F_ACC_RDONLY_F, file, error,access_prp=fapl)
-  CALL check("H5Fopen_f",error,total_error)
-
-
-  !  Hard link 
-!!$  IF(H5Oget_info_by_name(file, "d1", &oinfo1, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
-!!$  IF(H5Oget_info_by_name(file, "grp1/hard", &oinfo2, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
-!!$  IF(H5O_TYPE_DATASET != oinfo2.type) {
-!!$	H5_FAILED();
-!!$	printf("    %d: Unexpected object type should have been a dataset\n", __LINE__);
-!!$	TEST_ERROR
-!!$    }  end if 
-!!$    if(H5F_addr_ne(oinfo1.addr, oinfo2.addr)) {
-!!$	H5_FAILED();
-!!$	puts("    Hard link test failed. Link seems not to point to the ");
-!!$	puts("    expected file location.");
-!!$	TEST_ERROR
-!!$    }  end if 
-
-
-  CALL H5Lexists_f(file,"d1",Lexists, error)
-  CALL verifylogical("H5Lexists", Lexists,.TRUE.,total_error)
-
-  CALL H5Lexists_f(file,"grp1/hard",Lexists, error)
-  CALL verifylogical("H5Lexists", Lexists,.TRUE.,total_error)
-
-  !  Cleanup 
-  CALL H5Fclose_f(file,error)
-  CALL check("H5Fclose_f",error,total_error)
-
-END SUBROUTINE cklinks
-
-
-!-------------------------------------------------------------------------
-! * Function:    delete_by_idx
-! *
-! * Purpose:     Create a group with creation order indices and test deleting
-! *              links by index.
-! *
-! * Return:      Total error
-! *
-! * C Programmer:  Quincey Koziol
-! *                Tuesday, November 14, 2006
-! *
-! * Adapted to FORTRAN: M.S. Breitenfeld
-! *                     March 3, 2008
-! *
-! *-------------------------------------------------------------------------
-! 
-SUBROUTINE delete_by_idx(cleanup, fapl, total_error)
-
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-
-  IMPLICIT NONE
-  INTEGER, INTENT(INOUT) :: total_error
-  INTEGER(HID_T), INTENT(IN) :: fapl
-
-  INTEGER(HID_T) :: file_id  !  File ID 
-  INTEGER(HID_T) :: group_id !  Group ID 
-  INTEGER(HID_T) :: gcpl_id  !  Group creation property list ID 
-
-  INTEGER :: idx_type        !  Type of index to operate on 
-  LOGICAL, DIMENSION(1:2) :: use_index = (/.FALSE.,.TRUE./)
-                             !  Use index on creation order values 
-  INTEGER :: max_compact     !  Maximum # of links to store in group compactly 
-  INTEGER :: min_dense       !  Minimum # of links to store in group "densely" 
-
-  CHARACTER(LEN=7) :: objname   !  Object name 
-  CHARACTER(LEN=8) :: filename = 'file0.h5' !  File name 
-  CHARACTER(LEN=12), PARAMETER :: CORDER_GROUP_NAME = "corder_group"
-
-  LOGICAL :: f_corder_valid ! Indicates whether the creation order data is valid for this attribute
-  INTEGER :: corder ! Is a positive integer containing the creation order of the attribute
-  INTEGER :: cset ! Indicates the character set used for the attribute’s name
-  INTEGER(SIZE_T) :: val_size
-  INTEGER :: link_type
-  INTEGER(HADDR_T) :: address
-
-  INTEGER :: u !  Local index variable 
-  INTEGER :: Input1, i
-  INTEGER(HID_T) :: group_id2
-  INTEGER(HID_T) :: grp
-  INTEGER :: iorder !  Order within in the index 
-  CHARACTER(LEN=2) :: chr2
-  INTEGER :: error
-  INTEGER :: id_type
-  !
-  !
-  !
-  CHARACTER(LEN=80) :: fix_filename1
-  CHARACTER(LEN=80) :: fix_filename2
-  INTEGER(HSIZE_T) :: htmp
-
-  LOGICAL :: cleanup
-
-  DO i = 1, 80
-     fix_filename1(i:i) = " "
-     fix_filename2(i:i) = " "
-  ENDDO
-
-  !  Loop over operating on different indices on link fields 
-  DO idx_type = H5_INDEX_NAME_F, H5_INDEX_CRT_ORDER_F
-     !  Loop over operating in different orders 
-     DO iorder = H5_ITER_INC_F,  H5_ITER_DEC_F
-        !  Loop over using index for creation order value 
-        DO i = 1, 2
-           !  Print appropriate test message 
-!!$           IF(idx_type == H5_INDEX_CRT_ORDER_F)THEN
-!!$              IF(iorder == H5_ITER_INC_F)THEN
-!!$                 IF(use_index(i))THEN
-!!$                    WRITE(*,'(5x,A)')"deleting links by creation order index in increasing order w/creation order index"
-!!$                 ELSE
-!!$                    WRITE(*,'(5x,A)')"deleting links by creation order index in increasing order w/o creation order index"
-!!$                 ENDIF
-!!$              ELSE
-!!$                 IF(use_index(i))THEN
-!!$                    WRITE(*,'(5x,A)')"deleting links by creation order index in decreasing order w/creation order index"
-!!$                 ELSE
-!!$                    WRITE(*,'(5x,A)')"deleting links by creation order index in decreasing order w/o creation order index"
-!!$                 ENDIF
-!!$              ENDIF
-!!$           ELSE
-!!$              IF(iorder == H5_ITER_INC_F)THEN
-!!$                 IF(use_index(i))THEN
-!!$                    WRITE(*,'(5x,A)')"deleting links by name index in increasing order w/creation order index"
-!!$                 ELSE
-!!$                    WRITE(*,'(5x,A)')"deleting links by name index in increasing order w/o creation order index"
-!!$                 ENDIF
-!!$              ELSE
-!!$                 IF(use_index(i))THEN
-!!$                    WRITE(*,'(5x,A)')"deleting links by name index in decreasing order w/creation order index"
-!!$                 ELSE
-!!$                    WRITE(*,'(5x,A)')"deleting links by name index in decreasing order w/o creation order index"
-!!$                 ENDIF
-!!$              ENDIF
-!!$           ENDIF
-
-           !  Create file 
-           CALL H5Fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, error, access_prp=fapl)
-           CALL check("delete_by_idx.H5Fcreate_f", error, total_error)
-
-           !  Create group creation property list 
-           CALL H5Pcreate_f(H5P_GROUP_CREATE_F, gcpl_id, error )
-           CALL check("delete_by_idx.H5Pcreate_f", error, total_error)
-
-           !  Set creation order tracking & indexing on group 
-           IF(use_index(i))THEN
-              Input1 = H5P_CRT_ORDER_INDEXED_F
-           ELSE
-              Input1 = 0
-           ENDIF
-
-           CALL H5Pset_link_creation_order_f(gcpl_id, IOR(H5P_CRT_ORDER_TRACKED_F, Input1), error)
-           CALL check("delete_by_idx.H5Pset_link_creation_order_f", error, total_error)
-
-           !  Create group with creation order tracking on 
-           CALL H5Gcreate_f(file_id, CORDER_GROUP_NAME, group_id, error, gcpl_id=gcpl_id)
-           CALL check("delete_by_idx.H5Gcreate_f", error, total_error)
-
-           !  Query the group creation properties 
-           CALL H5Pget_link_phase_change_f(gcpl_id, max_compact, min_dense, error)
-           CALL check("delete_by_idx.H5Pget_link_phase_change_f", error, total_error)
-
-
-           !  Delete links from one end 
-
-           !  Check for deletion on empty group 
-           CALL H5Ldelete_by_idx_f(group_id, ".", idx_type, iorder, INT(0,HSIZE_T), error)
-           CALL VERIFY("delete_by_idx.H5Ldelete_by_idx_f", error, -1, total_error) ! test should fail (error = -1)
-           !  Create several links, up to limit of compact form 
-           DO u = 0, max_compact-1
-              !  Make name for link 
-              WRITE(chr2,'(I2.2)') u
-              objname = 'fill '//chr2
-
-              !  Create hard link, with group object 
-              CALL H5Gcreate_f(group_id, objname, group_id2, error)
-              CALL check("delete_by_idx.H5Gcreate_f", error, total_error)
-              CALL H5Gclose_f(group_id2, error)
-              CALL check("delete_by_idx.H5Gclose_f", error, total_error)
-
-              !  Verify link information for new link 
-              CALL link_info_by_idx_check(group_id, objname, u, &
-                   .TRUE., use_index(i), total_error)
-           ENDDO
-
-           !  Verify state of group (compact) 
-           ! IF(H5G_has_links_test(group_id, NULL) != TRUE) TEST_ERROR
-
-           !  Check for out of bound deletion 
-           htmp =9
-!EP           CALL H5Ldelete_by_idx_f(group_id, ".", idx_type, iorder, INT(u,HSIZE_T), error)
-           CALL H5Ldelete_by_idx_f(group_id, ".", idx_type, iorder, htmp, error)
-           CALL VERIFY("H5Ldelete_by_idx_f", error, -1, total_error) ! test should fail (error = -1)
-
-
-           !  Delete links from compact group 
-
-           DO u = 0, (max_compact - 1) -1
-              !  Delete first link in appropriate order 
-              CALL H5Ldelete_by_idx_f(group_id, ".", idx_type, iorder, INT(0,HSIZE_T), error)
-              CALL check("H5Ldelete_by_idx_f", error, total_error)
-              !  Verify the link information for first link in appropriate order 
-              ! HDmemset(&linfo, 0, sizeof(linfo));
-
-              CALL H5Lget_info_by_idx_f(group_id, ".", idx_type, iorder, INT(0,HSIZE_T), &
-                   link_type, f_corder_valid, corder, cset, address, val_size, error)
-
-              CALL H5Oopen_by_addr_f(group_id, address, grp, error)
-              CALL check("H5Oopen_by_addr_f", error, total_error)
-
-              CALL H5Iget_type_f(grp, id_type, error)
-              CALL check("H5Iget_type_f", error, total_error)
-
-              CALL VERIFY("H5Iget_type_f", id_type, H5I_GROUP_F, total_error)
-
-              CALL H5Gclose_f(grp, error)
-              CALL check("H5Gclose_f", error, total_error)
-
-              CALL VerifyLogical("H5Lget_info_by_idx_f", f_corder_valid, .TRUE., total_error)
-
-              CALL VERIFY("H5Lget_info_by_idx_f", H5L_TYPE_HARD_F, link_type, total_error)
-              IF(iorder.EQ.H5_ITER_INC_F)THEN
-                 CALL VERIFY("H5Lget_info_by_idx_f", corder, u+1, total_error)
-              ELSE
-                 CALL VERIFY("H5Lget_info_by_idx_f", corder, (max_compact - (u + 2)), total_error)
-              ENDIF
-
-              CALL VERIFY("H5Lget_info_by_idx_f",cset, H5T_CSET_ASCII_F, total_error)
-
-
-
-              !  Verify the name for first link in appropriate order 
-              ! HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE);
-!!$              size_tmp = 20
-!!$              CALL H5Lget_name_by_idx_f(group_id, ".", idx_type, order, INT(0,HSIZE_T), size_tmp, tmpname, error)
-!!$              CALL check("delete_by_idx.H5Lget_name_by_idx_f", error, total_error)
-!!$
-!!$              IF(order .EQ. H5_ITER_INC_F)THEN
-!!$                 WRITE(chr2,'(I2.2)') u + 1
-!!$              ELSE
-!!$                 WRITE(chr2,'(I2.2)') (max_compact - (u + 2))
-!!$              ENDIF
-!!$              objname = 'fill '//chr2
-!!$              PRINT*,objname, tmpname
-!!$              CALL verifyString("delete_by_idx.H5Lget_name_by_idx_f", objname, tmpname,  total_error)
-           ENDDO
-
-           !  Close the group 
-           CALL H5Gclose_f(group_id, error)
-           CALL check("delete_by_idx.H5Gclose_f", error, total_error)
-
-           ! Close the group creation property list 
-           CALL H5Pclose_f(gcpl_id, error)
-           CALL check("delete_by_idx.H5Gclose_f", error, total_error)
-
-           ! Close the file 
-           CALL H5Fclose_f(file_id, error)
-           CALL check("delete_by_idx.H5Gclose_f", error, total_error)
-
-           IF(cleanup) CALL h5_cleanup_f("file0", H5P_DEFAULT_F, error)
-           CALL check("h5_cleanup_f", error, total_error)
-
-        ENDDO
-     ENDDO
-  ENDDO
-
-
-END SUBROUTINE delete_by_idx
-
-
-
-!-------------------------------------------------------------------------
-! * Function:    link_info_by_idx_check
-! *
-! * Purpose:     Support routine for link_info_by_idx, to verify the link
-! *              info is correct for a link
-! *
-! * Note:	This routine assumes that the links have been inserted in the
-! *              group in alphabetical order.
-! *
-! * Return:      Success:        0
-! *              Failure:        -1
-! *
-! * Programmer:  Quincey Koziol
-! *              Tuesday, November  7, 2006
-! *
-! *-------------------------------------------------------------------------
-! 
-SUBROUTINE link_info_by_idx_check(group_id, linkname, n, &
-    hard_link, use_index, total_error)
-
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-
-  IMPLICIT NONE
-  INTEGER, INTENT(INOUT) :: total_error
-  INTEGER(HID_T), INTENT(IN) :: group_id
-  CHARACTER(LEN=*), INTENT(IN) :: linkname
-  INTEGER, INTENT(IN) :: n
-  LOGICAL, INTENT(IN) :: hard_link
-  LOGICAL, INTENT(IN) :: use_index
-
-  LOGICAL :: f_corder_valid ! Indicates whether the creation order data is valid for this attribute
-  INTEGER :: corder ! Is a positive integer containing the creation order of the attribute
-  INTEGER :: cset ! Indicates the character set used for the attribute’s name
-  INTEGER :: link_type
-  INTEGER(HADDR_T) :: address
-  INTEGER(SIZE_T) :: val_size   ! Indicates the size, in the number of characters, of the attribute
-
-  CHARACTER(LEN=7) :: tmpname     ! Temporary link name 
-  CHARACTER(LEN=3) :: tmpname_small ! to small temporary link name 
-  CHARACTER(LEN=10) :: tmpname_big ! to big temporary link name 
-
-  CHARACTER(LEN=7) :: valname     ! Link value name 
-  CHARACTER(LEN=2) :: chr2
-  INTEGER(SIZE_T) :: size_tmp
-  INTEGER :: error
-
-  !  Make link value for increasing/native order queries 
-
-  WRITE(chr2,'(I2.2)') n
-  valname = 'valn.'//chr2
-
-  !  Verify the link information for first link, in increasing creation order 
-  !  HDmemset(&linfo, 0, sizeof(linfo));
-  CALL H5Lget_info_by_idx_f(group_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, INT(0,HSIZE_T), &
-       link_type, f_corder_valid, corder, cset, address, val_size, error)
-  CALL check("H5Lget_info_by_idx_f", error, total_error)
-  CALL VERIFY("H5Lget_info_by_idx_f", corder, 0, total_error)
-
-  !  Verify the link information for new link, in increasing creation order 
-  ! HDmemset(&linfo, 0, sizeof(linfo));
-  CALL H5Lget_info_by_idx_f(group_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, INT(n,HSIZE_T), &
-       link_type, f_corder_valid, corder, cset, address, val_size, error)
-  CALL check("H5Lget_info_by_idx_f", error, total_error)
-  CALL VERIFY("H5Lget_info_by_idx_f", corder, n, total_error)
-
-  !  Verify value for new soft link, in increasing creation order 
-!!$  IF(hard_link)THEN
-!!$     ! HDmemset(tmpval, 0, (size_t)NAME_BUF_SIZE);
-!!$
-!!$     CALL H5Lget_val_by_idx_f(group_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, n, tmpval, INT(7,SIZE_T),error)
-!!$     CALL check("H5Lget_val_by_idx",error,total_error)
-!!$
-!!$!     IF(HDstrcmp(valname, tmpval)) TEST_ERROR
-!!$  ENDIF
-
-  !  Verify the name for new link, in increasing creation order 
-  !  HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE);
-
-  ! The actual size of tmpname should be 7
-
-  CALL H5Lget_name_by_idx_f(group_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, INT(n,HSIZE_T), tmpname_small, error, size_tmp)
-  CALL check("link_info_by_idx_check.H5Lget_name_by_idx_f", error, total_error)
-  CALL verifyString("link_info_by_idx_check.H5Lget_name_by_idx_f", &
-       linkname(1:LEN(tmpname_small)), tmpname_small(1:LEN(tmpname_small)),  total_error)
-  CALL VERIFY("link_info_by_idx_check.H5Lget_name_by_idx_f", INT(size_tmp), 7, total_error)
-  ! try it with the correct size
-  CALL H5Lget_name_by_idx_f(group_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, INT(n,HSIZE_T), tmpname, error, size=size_tmp)
-  CALL check("link_info_by_idx_check.H5Lget_name_by_idx_f", error, total_error)
-  CALL verifyString("link_info_by_idx_check.H5Lget_name_by_idx_f", &
-       linkname(1:LEN(tmpname)), tmpname(1:LEN(tmpname)),  total_error)
-  CALL VERIFY("link_info_by_idx_check.H5Lget_name_by_idx_f", INT(size_tmp), 7, total_error)
-
-  CALL H5Lget_name_by_idx_f(group_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, INT(n,HSIZE_T), tmpname_big, error, size_tmp)
-  CALL check("link_info_by_idx_check.H5Lget_name_by_idx_f", error, total_error)
-  CALL verifyString("link_info_by_idx_check.H5Lget_name_by_idx_f", &
-       linkname(1:7), tmpname_big(1:7),  total_error)
-  CALL VERIFY("link_info_by_idx_check.H5Lget_name_by_idx_f", INT(size_tmp), 7, total_error)
-
-  ! Try with a buffer set to small
-
-
-  END SUBROUTINE link_info_by_idx_check
-
-
-!-------------------------------------------------------------------------
-! * Function:    test_lcpl
-! *
-! * Purpose:     Tests Link Creation Property Lists
-! *
-! * Return:      Success:        0
-! *              Failure:        number of errors
-! *
-! * Programmer:  M.S. Breitenfeld
-! *              Modified C routine
-! *              March 12, 2008
-! *
-! * Modifications:
-! *
-! *-------------------------------------------------------------------------
-! 
-
-  SUBROUTINE test_lcpl(cleanup, fapl, total_error)
-
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-
-  IMPLICIT NONE
-  INTEGER, INTENT(INOUT) :: total_error
-  INTEGER(HID_T), INTENT(IN) :: fapl
-  LOGICAL :: cleanup
-
-  INTEGER(HID_T) :: file_id
-  INTEGER(HID_T) :: group_id
-  INTEGER(HID_T) :: space_id, data_space
-  INTEGER(HID_T) :: dset_id
-  INTEGER(HID_T) :: type_id
-  INTEGER(HID_T) :: lcpl_id
-
-  INTEGER :: cset ! Indicates the character set used for the link’s name.
-  INTEGER :: corder ! Specifies the link’s creation order position.
-  LOGICAL :: f_corder_valid ! Indicates whether the value in corder is valid.
-  INTEGER :: link_type ! Specifies the link class:
-                       !  H5L_TYPE_HARD_F      - Hard link
-                       !  H5L_TYPE_SOFT_F      - Soft link
-                       !  H5L_TYPE_EXTERNAL_F  - External link
-                       !  H5L_TYPE_ERROR _F    - Error
-  INTEGER(HADDR_T) :: address  ! If the link is a hard link, address specifies the file address that the link points to
-  INTEGER(SIZE_T) :: val_size ! If the link is a symbolic link, val_size will be the length of the link value
-
-  CHARACTER(LEN=1024) :: filename = 'tempfile.h5'
-  INTEGER, PARAMETER :: TEST6_DIM1 = 8, TEST6_DIM2 = 7
-  INTEGER(HSIZE_T), DIMENSION(1:2), PARAMETER :: dims = (/TEST6_DIM1,TEST6_DIM2/)
-
-  INTEGER :: encoding
-  INTEGER :: error
-  LOGICAL :: Lexists
-  INTEGER(HSIZE_T), DIMENSION(1:2), PARAMETER :: extend_dim = (/TEST6_DIM1-2,TEST6_DIM2-3/)
-  INTEGER(HSIZE_T), DIMENSION(1:2) :: dimsout, maxdimsout ! dimensions
-
-  INTEGER :: i
-  INTEGER :: tmp1, tmp2
-  INTEGER(HID_T) :: crp_list
-
-!  WRITE(*,*) "link creation property lists (w/new group format)"
-
-
-  ! Actually, intermediate group creation is tested elsewhere (tmisc).
-  ! * Here we only need to test the character encoding property 
-
-  ! Create file 
-  !  h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
-
-  CALL H5Fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, error, H5P_DEFAULT_F, fapl)
-  CALL check("H5Fcreate_f", error, total_error)
-
-
-  !  Create and link a group with the default LCPL 
-
-  CALL H5Gcreate_f(file_id, "/group", group_id, error)
-  CALL check("H5Gcreate_f", error, total_error)
-
-
-  !  Check that its character encoding is the default 
-
-  CALL H5Lget_info_f(file_id, "group", &
-       cset, corder, f_corder_valid, link_type, address, val_size, &
-       error, H5P_DEFAULT_F)
-
-! File-wide default character encoding can not yet be set via the file
-! * creation property list and is always ASCII. 
-!#define H5F_DEFAULT_CSET H5T_CSET_ASCII  -- FROM H5Fprivate.h --
-
-  CALL VERIFY("H5Lget_info_f",cset, H5T_CSET_ASCII_F,total_error)
-
-  !  Create and commit a datatype with the default LCPL 
-  CALL h5tcopy_f(H5T_NATIVE_INTEGER, type_id, error)
-  CALL check("h5tcopy_f",error,total_error)
-  CALL h5tcommit_f(file_id, "/type", type_id, error)
-  CALL check("h5tcommit_f", error, total_error)
-  CALL h5tclose_f(type_id, error)
-  CALL check("h5tclose_f", error, total_error)
-
-
-  !  Check that its character encoding is the default 
-  CALL H5Lget_info_f(file_id, "type", &
-       cset, corder, f_corder_valid, link_type, address, val_size, &
-       error)
-  CALL check("h5tclose_f", error, total_error)
-
-! File-wide default character encoding can not yet be set via the file
-! * creation property list and is always ASCII. 
-!#define H5F_DEFAULT_CSET H5T_CSET_ASCII  -- FROM H5Fprivate.h --
-
-  CALL verify("H5Lget_info_f",cset, H5T_CSET_ASCII_F,total_error)
-
-  ! Create a dataspace 
-  CALL h5screate_simple_f(2, dims, space_id, error)
-  CALL check("h5screate_simple_f",error,total_error)
-  CALL h5pcreate_f(H5P_DATASET_CREATE_F, crp_list, error)
-  CALL h5pset_chunk_f(crp_list, 2, dims, error)
-  CALL h5pcreate_f(H5P_DATASET_CREATE_F, crp_list, error)
-  CALL h5pset_chunk_f(crp_list, 2, dims, error)
-  CALL h5pcreate_f(H5P_DATASET_CREATE_F, crp_list, error)
-  CALL h5pset_chunk_f(crp_list, 2, dims, error)
-
-  !  Create a dataset using the default LCPL 
-  CALL h5dcreate_f(file_id, "/dataset", H5T_NATIVE_INTEGER, space_id, dset_id, error, crp_list)
-  CALL check("h5dcreate_f", error, total_error)
-
-  CALL h5dclose_f(dset_id, error)
-  CALL check("h5dclose_f", error, total_error)
-
-  ! Reopen
-
-  CALL H5Dopen_f(file_id, "/dataset", dset_id, error)
-  CALL check("h5dopen_f", error, total_error)
-
-  !   Extend the  dataset 
-  CALL H5Dset_extent_f(dset_id, extend_dim, error)
-  CALL check("H5Dset_extent_f", error, total_error)
-  !   Verify the dataspaces 
-        !
-          !Get dataset's dataspace handle.
-          !
-  CALL h5dget_space_f(dset_id, data_space, error)
-  CALL check("h5dget_space_f",error,total_error)
-
-  CALL h5sget_simple_extent_dims_f(data_space, dimsout, maxdimsout, error)
-  CALL check("h5sget_simple_extent_dims_f",error, total_error)
-
-  DO i = 1, 2
-     tmp1 = INT(dimsout(i))
-     tmp2 = INT(extend_dim(i))
-     CALL VERIFY("H5Sget_simple_extent_dims", tmp1, tmp2, total_error)
-     tmp1 = INT(maxdimsout(i))
-     tmp2 = INT(dims(i))
-     CALL VERIFY("H5Sget_simple_extent_dims", tmp1, tmp2, total_error)
-  ENDDO
-
-  !  close data set 
-
-  CALL h5dclose_f(dset_id, error)
-  CALL check("h5dclose_f", error, total_error)
-
-  !  Check that its character encoding is the default 
-  CALL H5Lget_info_f(file_id, "dataset", &
-       cset, corder, f_corder_valid, link_type, address, val_size, &
-       error)
-  CALL check("H5Lget_info_f", error, total_error)
-
-! File-wide default character encoding can not yet be set via the file
-! * creation property list and is always ASCII. 
-!#define H5F_DEFAULT_CSET H5T_CSET_ASCII  -- FROM H5Fprivate.h --
-
-  CALL verify("h5tclose_f",cset, H5T_CSET_ASCII_F,total_error)
-
-  ! Create a link creation property list with the UTF-8 character encoding 
-  CALL H5Pcreate_f(H5P_LINK_CREATE_F,lcpl_id,error)
-  CALL check("h5Pcreate_f",error,total_error)
-  CALL H5Pset_char_encoding_f(lcpl_id, H5T_CSET_UTF8_F, error)
-  CALL check("H5Pset_char_encoding_f",error, total_error)
-
-  !  Create and link a group with the new LCPL 
-  CALL H5Gcreate_f(file_id, "/group2", group_id, error,lcpl_id=lcpl_id)
-  CALL check("H5Gcreate_f", error, total_error)
-  CALL H5Gclose_f(group_id, error)
-  CALL check("H5Gclose_f", error, total_error)
-
-
-  ! Check that its character encoding is UTF-8 
-  CALL H5Lget_info_f(file_id, "group2", &
-       cset, corder, f_corder_valid, link_type, address, val_size, &
-       error)
-  CALL check("H5Lget_info_f", error, total_error)
-  CALL verify("H5Lget_info_f",cset, H5T_CSET_UTF8_F,total_error)
-
-
-  !  Create and commit a datatype with the new LCPL 
-
-  CALL h5tcopy_f(H5T_NATIVE_INTEGER, type_id, error)
-  CALL check("h5tcopy_f",error,total_error)
-  CALL h5tcommit_f(file_id, "/type2", type_id, error, lcpl_id=lcpl_id)
-  CALL check("h5tcommit_f", error, total_error)
-  CALL h5tclose_f(type_id, error)
-  CALL check("h5tclose_f", error, total_error)
-
-
-  ! Check that its character encoding is UTF-8 
-  CALL H5Lget_info_f(file_id, "type2", &
-       cset, corder, f_corder_valid, link_type, address, val_size, &
-       error)
-  CALL check("H5Lget_info_f", error, total_error)
-  CALL verify("H5Lget_info_f",cset, H5T_CSET_UTF8_F,total_error)
-
-  !  Create a dataset using the new LCPL 
-  CALL h5dcreate_f(file_id, "/dataset2", H5T_NATIVE_INTEGER, space_id, dset_id, error,lcpl_id=lcpl_id)
-  CALL check("h5dcreate_f", error, total_error)
-
-  CALL h5dclose_f(dset_id, error)
-  CALL check("h5dclose_f", error, total_error)
-
-  CALL H5Pget_char_encoding_f(lcpl_id, encoding, error)
-  CALL check("H5Pget_char_encoding_f", error, total_error)
-  CALL VERIFY("H5Pget_char_encoding_f", encoding, H5T_CSET_UTF8_F, total_error)
-
-  !  Check that its character encoding is UTF-8 
-  CALL H5Lget_info_f(file_id, "dataset2", &
-       cset, corder, f_corder_valid, link_type, address, val_size, &
-       error)
-  CALL check("H5Lget_info_f", error, total_error)
-  CALL verify("H5Lget_info_f2",cset, H5T_CSET_UTF8_F,total_error)
-
-  !  Create a new link to the dataset with a different character encoding. 
-  CALL H5Pclose_f(lcpl_id, error)
-  CALL check("H5Pclose_f", error, total_error)
-
-  CALL H5Pcreate_f(H5P_LINK_CREATE_F,lcpl_id,error)
-  CALL check("h5Pcreate_f",error,total_error)
-  CALL H5Pset_char_encoding_f(lcpl_id, H5T_CSET_ASCII_F, error)
-  CALL check("H5Pset_char_encoding_f",error, total_error)
-  CALL H5Lcreate_hard_f(file_id, "/dataset2", file_id, "/dataset2_link", error, lcpl_id)
-  CALL check("H5Lcreate_hard_f",error, total_error)
-
-  CALL H5Lexists_f(file_id,"/dataset2_link",Lexists, error)
-  CALL check("H5Lexists",error, total_error)
-  CALL verifylogical("H5Lexists", Lexists,.TRUE.,total_error)
-
-  !  Check that its character encoding is ASCII 
-  CALL H5Lget_info_f(file_id, "/dataset2_link", &
-       cset, corder, f_corder_valid, link_type, address, val_size, &
-       error)
-  CALL check("H5Lget_info_f", error, total_error)
-  CALL verify("H5Lget_info_f",cset, H5T_CSET_ASCII_F,total_error)
-
-  !  Check that the first link's encoding hasn't changed 
-
-  CALL H5Lget_info_f(file_id, "/dataset2", &
-       cset, corder, f_corder_valid, link_type, address, val_size, &
-       error)
-  CALL check("H5Lget_info_f", error, total_error)
-  CALL verify("H5Lget_info_f3",cset, H5T_CSET_UTF8_F,total_error)
-
-
-  ! Make sure that LCPLs work properly for other API calls: 
-  ! H5Lcreate_soft 
-
-  CALL H5Pset_char_encoding_f(lcpl_id, H5T_CSET_UTF8_F, error)
-  CALL check("H5Pset_char_encoding_f",error, total_error)
-  CALL H5Lcreate_soft_f("dataset2", file_id, "slink_to_dset2",error,lcpl_id)
-  CALL check("H5Lcreate_soft_f", error, total_error)
-
-  CALL H5Lget_info_f(file_id, "slink_to_dset2", &
-       cset, corder, f_corder_valid, link_type, address, val_size, &
-       error)
-  CALL check("H5Lget_info_f", error, total_error)
-  CALL verify("H5Lget_info_f",cset, H5T_CSET_UTF8_F,total_error)
-
-
-  !  H5Lmove 
-  CALL H5Pset_char_encoding_f(lcpl_id, H5T_CSET_ASCII_F, error)
-  CALL check("H5Pset_char_encoding_f",error, total_error)
-
-  CALL H5Lmove_f(file_id, "slink_to_dset2", file_id, "moved_slink", error, lcpl_id, H5P_DEFAULT_F)
-  CALL check("H5Lmove_f",error, total_error)
-
-  CALL H5Lget_info_f(file_id, "moved_slink", &
-       cset, corder, f_corder_valid, link_type, address, val_size, &
-       error)
-  CALL check("H5Lget_info_f", error, total_error)
-  CALL verify("H5Lget_info_f",cset, H5T_CSET_ASCII_F,total_error)
-
-
-  !  H5Lcopy 
-
-  CALL H5Pset_char_encoding_f(lcpl_id, H5T_CSET_UTF8_F, error)
-  CALL check("H5Pset_char_encoding_f",error, total_error)
-
-  CALL H5Lcopy_f(file_id, "moved_slink", file_id, "copied_slink", error, lcpl_id)
-
-  CALL H5Lget_info_f(file_id, "copied_slink", &
-       cset, corder, f_corder_valid, link_type, address, val_size, &
-       error)
-  CALL check("H5Lget_info_f", error, total_error)
-  CALL verify("H5Lget_info_f",cset, H5T_CSET_UTF8_F,total_error)
-
-
-  !  H5Lcreate_external 
-
-  CALL H5Lcreate_external_f("filename", "path", file_id, "extlink", error, lcpl_id)
-  CALL check("H5Lcreate_external_f", error, total_error)
-
-  CALL H5Lget_info_f(file_id, "extlink", &
-       cset, corder, f_corder_valid, link_type, address, val_size, &
-       error)
-  CALL check("H5Lget_info_f", error, total_error)
-  CALL verify("H5Lget_info_f",cset, H5T_CSET_UTF8_F,total_error)
-
-
-  !  Close open IDs 
-
-  CALL H5Pclose_f(lcpl_id, error)
-  CALL check("H5Pclose_f", error, total_error)
-  CALL H5Sclose_f(space_id, error)
-  CALL check("h5Sclose_f",error,total_error)
-  CALL H5Fclose_f(file_id, error)
-  CALL check("H5Fclose_f", error, total_error)
-
-  IF(cleanup) CALL h5_cleanup_f("tempfile", H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-
-
-END SUBROUTINE test_lcpl
-
-SUBROUTINE objcopy(fapl, total_error)
-
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-
-  IMPLICIT NONE
-  INTEGER, INTENT(INOUT) :: total_error
-  INTEGER(HID_T), INTENT(IN) :: fapl
-
-  INTEGER(HID_T) :: fapl2, pid
-
-  INTEGER :: flag, cpy_flags
-
-  INTEGER :: error
-
-  flag = H5O_COPY_SHALLOW_HIERARCHY_F
-
-! Copy the file access property list 
-  CALL H5Pcopy_f(fapl, fapl2, error)
-  CALL check("H5Pcopy_f", error, total_error)
-
-! Set the "use the latest version of the format" bounds for creating objects in the file 
-  CALL H5Pset_libver_bounds_f(fapl2, H5F_LIBVER_LATEST_F, H5F_LIBVER_LATEST_F, error)
-
-  !  create property to pass copy options 
-  CALL h5pcreate_f(H5P_OBJECT_COPY_F, pid, error)
-  CALL check("h5pcreate_f",error, total_error)
-
-  !  set options for object copy 
-  CALL H5Pset_copy_object_f(pid, flag, error)
-  CALL check("H5Pset_copy_object_f",error, total_error)
-
-  !  Verify object copy flags 
-  CALL H5Pget_copy_object_f(pid, cpy_flags, error)
-  CALL check("H5Pget_copy_object_f",error, total_error)
-  CALL VERIFY("H5Pget_copy_object_f", cpy_flags, flag, total_error)
-
-!!$
-!!$  CALL test_copy_option(fcpl_src, fcpl_dst, my_fapl, H5O_COPY_WITHOUT_ATTR_FLAG,
-!!$                       FALSE, "H5Ocopy(): without attributes");
-
-  CALL lapl_nlinks(fapl2, total_error)
-
-END SUBROUTINE objcopy
-
-
-!-------------------------------------------------------------------------
-! * Function:    lapl_nlinks
-! *
-! * Purpose:     Check that the maximum number of soft links can be adjusted
-! *              by the user using the Link Access Property List.
-! *
-! * Return:      Success:        0
-! *
-! *              Failure:        -1
-! *
-! * Programmer:  James Laird
-! *              Tuesday, June 6, 2006
-! *
-! * Modifications:
-! *
-! *-------------------------------------------------------------------------
-! 
-
-SUBROUTINE lapl_nlinks( fapl, total_error)
-
-  USE HDF5
-  USE TH5_MISC
-
-  IMPLICIT NONE
-  INTEGER(HID_T), INTENT(IN) :: fapl
-  INTEGER, INTENT(INOUT) :: total_error
-
-  INTEGER :: error
-
-  INTEGER(HID_T) :: fid = (-1) ! File ID 
-  INTEGER(HID_T) :: gid = (-1), gid2 = (-1) ! Group IDs 
-  INTEGER(HID_T) :: plist = (-1) !  lapl ID 
-  INTEGER(HID_T) :: tid = (-1) !  Other IDs 
-  INTEGER(HID_T) :: gapl = (-1), dapl = (-1), tapl = (-1) !  Other property lists 
-
-  CHARACTER(LEN=7) :: objname !  Object name 
-  INTEGER(size_t) :: name_len !  Length of object name 
-  CHARACTER(LEN=12) :: filename = 'TestLinks.h5'
-  INTEGER(size_t) ::              nlinks !  nlinks for H5Pset_nlinks 
-  INTEGER(size_t) :: buf_size = 7
-
-!  WRITE(*,*) "adjusting nlinks with LAPL (w/new group format)"
-
-
-  !  Create file 
-  CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, access_prp=fapl)
-  CALL check(" lapl_nlinks.h5fcreate_f",error,total_error)
-
-  !  Create group with short name in file (used as target for links) 
-  CALL H5Gcreate_f(fid, "final", gid, error)
-  CALL check(" lapl_nlinks.H5Gcreate_f", error, total_error)
-
-  ! Create chain of soft links to existing object (limited) 
-  CALL H5Lcreate_soft_f("final", fid, "soft1", error)
-  CALL H5Lcreate_soft_f("soft1", fid, "soft2", error)
-  CALL H5Lcreate_soft_f("soft2", fid, "soft3", error)
-  CALL H5Lcreate_soft_f("soft3", fid, "soft4", error)
-  CALL H5Lcreate_soft_f("soft4", fid, "soft5", error)
-  CALL H5Lcreate_soft_f("soft5", fid, "soft6", error)
-  CALL H5Lcreate_soft_f("soft6", fid, "soft7", error)
-  CALL H5Lcreate_soft_f("soft7", fid, "soft8", error)
-  CALL H5Lcreate_soft_f("soft8", fid, "soft9", error)
-  CALL H5Lcreate_soft_f("soft9", fid, "soft10", error)
-  CALL H5Lcreate_soft_f("soft10", fid, "soft11", error)
-  CALL H5Lcreate_soft_f("soft11", fid, "soft12", error)
-  CALL H5Lcreate_soft_f("soft12", fid, "soft13", error)
-  CALL H5Lcreate_soft_f("soft13", fid, "soft14", error)
-  CALL H5Lcreate_soft_f("soft14", fid, "soft15", error)
-  CALL H5Lcreate_soft_f("soft15", fid, "soft16", error)
-  CALL H5Lcreate_soft_f("soft16", fid, "soft17", error)
-
-  ! Close objects 
-  CALL H5Gclose_f(gid, error)
-  CALL check("h5gclose_f",error,total_error)
-  CALL h5fclose_f(fid, error)
-  CALL check("h5fclose_f",error,total_error)
-
-  ! Open file 
-
-  CALL h5fopen_f(FileName, H5F_ACC_RDWR_F, fid, error, fapl)
-  CALL check("h5open_f",error,total_error)
-
-  ! Create LAPL with higher-than-usual nlinks value 
-  ! Create a non-default lapl with udata set to point to the first group 
-
-  CALL H5Pcreate_f(H5P_LINK_ACCESS_F,plist,error)
-  CALL check("h5Pcreate_f",error,total_error)
-  nlinks = 20
-  CALL H5Pset_nlinks_f(plist, nlinks, error)
-  CALL check("H5Pset_nlinks_f",error,total_error)
-  ! Ensure that nlinks was set successfully 
-  nlinks = 0
-  CALL H5Pget_nlinks_f(plist, nlinks, error)
-  CALL check("H5Pset_nlinks_f",error,total_error)
-  CALL VERIFY("H5Pset_nlinks_f",INT(nlinks), 20, total_error)
-
-
-  ! Open object through what is normally too many soft links using
-  ! * new property list 
-
-  CALL H5Oopen_f(fid,"soft17",gid,error,plist)
-  CALL check("H5Oopen_f",error,total_error)
-
-  ! Check name 
-  CALL h5iget_name_f(gid, objname, buf_size, name_len, error)
-  CALL check("h5iget_name_f",error,total_error)
-  CALL VerifyString("h5iget_name_f", TRIM(objname),"/soft17", total_error)
-  ! Create group using soft link 
-  CALL H5Gcreate_f(gid, "new_soft", gid2, error)
-  CALL check("H5Gcreate_f", error, total_error)
-
-  !  Close groups 
-  CALL H5Gclose_f(gid2, error)
-  CALL check("H5Gclose_f", error, total_error)
-  CALL H5Gclose_f(gid, error)
-  CALL check("H5Gclose_f", error, total_error)
-
-
-  ! Set nlinks to a smaller number 
-  nlinks = 4
-  CALL H5Pset_nlinks_f(plist, nlinks, error)
-  CALL check("H5Pset_nlinks_f", error, total_error)
-
-  ! Ensure that nlinks was set successfully 
-  nlinks = 0
-
-  CALL H5Pget_nlinks_f(plist, nlinks, error)
-  CALL check("H5Pget_nlinks_f",error,total_error)
-  CALL VERIFY("H5Pget_nlinks_f", INT(nlinks), 4, total_error)
-
-  !  Try opening through what is now too many soft links 
-
-  CALL H5Oopen_f(fid,"soft5",gid,error,plist)
-  CALL VERIFY("H5Oopen_f", error, -1, total_error) ! should fail
-
-  !  Open object through lesser soft link 
-  CALL H5Oopen_f(fid,"soft4",gid,error,plist)
-  CALL check("H5Oopen_",error,total_error)
-
-  !  Check name 
-  CALL h5iget_name_f(gid, objname, buf_size, name_len, error)
-  CALL check("h5iget_name_f",error,total_error)
-  CALL VerifyString("h5iget_name_f", TRIM(objname),"/soft4", total_error)
-
-  !  Test other functions that should use a LAPL 
-  nlinks = 20
-  CALL H5Pset_nlinks_f(plist, nlinks, error)
-  CALL check("H5Pset_nlinks_f", error, total_error)
-
-  ! Try copying and moving when both src and dst contain many soft links
-  ! * using a non-default LAPL
-  ! 
-  CALL H5Lcopy_f(fid, "soft17", fid, "soft17/newer_soft", error, H5P_DEFAULT_F, plist)
-  CALL check("H5Lcopy_f",error,total_error)
-
-  CALL H5Lmove_f(fid, "soft17/newer_soft", fid, "soft17/newest_soft", error, lapl_id=plist)
-  CALL check("H5Lmove_f",error, total_error)
-
-  !  H5Olink 
-  CALL H5Olink_f(gid, fid, "soft17/link_to_group", error, H5P_DEFAULT_F, plist)
-  CALL check("H5Olink_f", error, total_error)
-
-  !  H5Lcreate_hard and H5Lcreate_soft 
-  CALL H5Lcreate_hard_f(fid, "soft17", fid, "soft17/link2_to_group", error, H5P_DEFAULT_F, plist)
-  CALL check("H5Lcreate_hard_f", error, total_error)
-
-
-  CALL H5Lcreate_soft_f("/soft4", fid, "soft17/soft_link",error, H5P_DEFAULT_F, plist)
-  CALL check("H5Lcreate_soft_f", error, total_error)
-
-  !  H5Ldelete 
-  CALL h5ldelete_f(fid, "soft17/soft_link", error, plist)
-  CALL check("H5Ldelete_f", error, total_error)
-
-!!$     H5Lget_val and H5Lget_info 
-!!$    if(H5Lget_val(fid, "soft17", NULL, (size_t)0, plist) < 0) TEST_ERROR
-!!$    if(H5Lget_info(fid, "soft17", NULL, plist) < 0) TEST_ERROR
-!!$
-
-  !  H5Lcreate_external and H5Lcreate_ud 
-  CALL H5Lcreate_external_f("filename", "path", fid, "soft17/extlink", error, H5P_DEFAULT_F, plist)
-  CALL check("H5Lcreate_external_f", error, total_error)
-
-!!$    if(H5Lregister(UD_rereg_class) < 0) TEST_ERROR
-!!$    if(H5Lcreate_ud(fid, "soft17/udlink", UD_HARD_TYPE, NULL, (size_t)0, H5P_DEFAULT, plist) < 0) TEST_ERROR
-!!$
-    !  Close plist 
-  CALL h5pclose_f(plist, error)
-  CALL check("h5pclose_f", error, total_error)
-
-    !  Create a datatype and dataset as targets inside the group 
-  CALL h5tcopy_f(H5T_NATIVE_INTEGER, tid, error)
-  CALL check("h5tcopy_f",error,total_error)
-  CALL h5tcommit_f(gid, "datatype", tid, error)
-  CALL check("h5tcommit_f", error, total_error)
-  CALL h5tclose_f(tid, error)
-  CALL check("h5tclose_f", error, total_error)
-
-!!$
-!!$    dims[0] = 2;
-!!$    dims[1] = 2;
-!!$    if((sid = H5Screate_simple(2, dims, NULL)) < 0) TEST_ERROR
-!!$    if((did = H5Dcreate2(gid, "dataset", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
-!!$    if(H5Dclose(did) < 0) TEST_ERROR
-!!$
-  ! Close group 
-  CALL h5gclose_f(gid, error)
-  CALL check("h5gclose_f",error,total_error)
-
-!!$
-!!$     Try to open the objects using too many symlinks with default *APLs 
-!!$    H5E_BEGIN_TRY {
-!!$        if((gid = H5Gopen2(fid, "soft17", H5P_DEFAULT)) >= 0)
-!!$            FAIL_PUTS_ERROR("    Should have failed for too many nested links.")
-!!$        if((tid = H5Topen2(fid, "soft17/datatype", H5P_DEFAULT)) >= 0)
-!!$            FAIL_PUTS_ERROR("    Should have failed for too many nested links.")
-!!$        if((did = H5Dopen2(fid, "soft17/dataset", H5P_DEFAULT)) >= 0)
-!!$            FAIL_PUTS_ERROR("    Should have failed for too many nested links.")
-!!$    } H5E_END_TRY
-!!$
-    !  Create property lists with nlinks set 
-
-  CALL H5Pcreate_f(H5P_GROUP_ACCESS_F,gapl,error)
-  CALL check("h5Pcreate_f",error,total_error)
-  CALL H5Pcreate_f(H5P_DATATYPE_ACCESS_F,tapl,error)
-  CALL check("h5Pcreate_f",error,total_error)
-  CALL H5Pcreate_f(H5P_DATASET_ACCESS_F,dapl,error)
-  CALL check("h5Pcreate_f",error,total_error)
-
-
-  nlinks = 20
-  CALL H5Pset_nlinks_f(gapl, nlinks, error)
-  CALL check("H5Pset_nlinks_f", error, total_error)
-  CALL H5Pset_nlinks_f(tapl, nlinks, error)
-  CALL check("H5Pset_nlinks_f", error, total_error)
-  CALL H5Pset_nlinks_f(dapl, nlinks, error)
-  CALL check("H5Pset_nlinks_f", error, total_error)
-
-  ! We should now be able to use these property lists to open each kind
-  ! * of object.
-  ! 
-
-  CALL H5Gopen_f(fid, "soft17", gid, error, gapl)
-  CALL check("H5Gopen_f",error,total_error)
-
-  CALL H5Topen_f(fid, "soft17/datatype", tid, error, tapl)
-  CALL check("H5Gopen_f",error,total_error)
-
-!!$    if((did = H5Dopen2(fid, "soft17/dataset", dapl)) < 0) TEST_ERROR
-
-  !  Close objects 
-
-  CALL h5gclose_f(gid, error)
-  CALL check("h5gclose_f",error,total_error)
-  CALL h5tclose_f(tid, error)
-  CALL check("h5tclose_f", error, total_error)
-
-!!$    if(H5Dclose(did) < 0) TEST_ERROR
-!!$
-  !  Close plists 
-
-  CALL h5pclose_f(gapl, error)
-  CALL check("h5pclose_f", error, total_error)
-  CALL h5pclose_f(tapl, error)
-  CALL check("h5pclose_f", error, total_error)
-
-!!$    if(H5Pclose(dapl) < 0) TEST_ERROR
-!!$
-!!$     Unregister UD hard link class 
-!!$    if(H5Lunregister(UD_HARD_TYPE) < 0) TEST_ERROR
-!!$
-
-  !  Close file 
-  CALL H5Fclose_f(fid, error)
-  CALL check("H5Fclose_f", error, total_error)
-
-END SUBROUTINE lapl_nlinks
-
-END MODULE TH5G_1_8
diff --git a/fortran/test/tH5I.F90 b/fortran/test/tH5I.F90
new file mode 100644
index 0000000..97c48c6
--- /dev/null
+++ b/fortran/test/tH5I.F90
@@ -0,0 +1,321 @@
+!****h* root/fortran/test/tH5I.f90
+!
+! NAME
+!  tH5I.f90
+!
+! FUNCTION
+!  Basic testing of Fortran H5I APIs.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! CONTAINS SUBROUTINES
+!  identifier_test
+!
+!*****
+MODULE TH5I
+ 
+  USE HDF5 ! This module contains all necessary modules 
+  USE TH5_MISC
+  USE TH5_MISC_GEN
+
+CONTAINS
+
+    SUBROUTINE identifier_test(cleanup, total_error)
+
+!   This subroutine tests following functionalities: h5iget_type_f
+
+
+     IMPLICIT NONE
+     LOGICAL, INTENT(IN)  :: cleanup
+     INTEGER, INTENT(INOUT) :: total_error
+
+     CHARACTER(LEN=6), PARAMETER :: filename = "itestf" ! File name
+     CHARACTER(LEN=80) :: fix_filename
+     CHARACTER(LEN=10), PARAMETER :: dsetname = "/itestdset" ! Dataset name
+     CHARACTER(LEN=10), PARAMETER :: groupname = "itestgroup"! group name
+     CHARACTER(LEN=10), PARAMETER :: aname = "itestattr"! group name
+
+
+
+     INTEGER(HID_T) :: file_id       ! File identifier
+     INTEGER(HID_T) :: new_file_id   ! File identifier
+     INTEGER(HID_T) :: group_id      ! group identifier
+     INTEGER(HID_T) :: dset_id       ! Dataset identifier
+     INTEGER(HID_T) :: dspace_id     ! Dataspace identifier
+     INTEGER(HID_T) :: attr_id      ! Datatype attribute identifier
+     INTEGER(HID_T) :: aspace_id     ! attribute data space identifier
+     INTEGER(HID_T) :: atype_id     ! attribute data type identifier
+
+
+     INTEGER, DIMENSION(1) :: dset_data = 0 ! Data value
+
+     INTEGER(HSIZE_T), DIMENSION(1) :: dims = 1 ! Datasets dimensions
+     INTEGER(HSIZE_T), DIMENSION(1) :: adims = 1 ! Attribute dimensions
+
+     INTEGER, DIMENSION(1) ::  attr_data = 12
+     INTEGER     ::   rank = 1 ! Datasets rank
+     INTEGER     ::   arank = 1 ! Attribute rank
+
+     INTEGER     ::   type !object identifier
+     INTEGER     ::   error ! Error flag
+     INTEGER(HSIZE_T), DIMENSION(2) :: data_dims
+     CHARACTER(LEN=80) name_buf
+     CHARACTER(LEN=280) name_buf1
+     INTEGER(SIZE_T)   buf_size
+     INTEGER(SIZE_T)   name_size
+     INTEGER    ::    ref_count ! Reference count for IDs
+
+
+     INTEGER(hid_t) :: dtype  ! datatype id
+     LOGICAL :: tri_ret       ! value
+
+     !
+     ! Tests the function H5Iis_valid_f
+     !
+     ! check that the ID is not valid
+     dtype = -1
+     CALL H5Iis_valid_f(dtype, tri_ret, error)
+     CALL check("H5Iis_valid_f", error, total_error) 
+     CALL verify("H5Iis_valid_f", tri_ret, .FALSE., total_error)
+     
+     ! Create a datatype id
+     CALL H5Tcopy_f(H5T_NATIVE_INTEGER,dtype,error)
+     CALL check("H5Tcopy_f", error, total_error) 
+     
+     ! Check that the ID is valid
+     CALL H5Iis_valid_f(dtype, tri_ret, error)
+     CALL check("H5Iis_valid_f", error, total_error) 
+     CALL verify("H5Tequal_f", tri_ret, .TRUE., total_error)
+     
+     CALL H5Tclose_f(dtype, error)
+     CALL check("H5Tclose_f", error, total_error) 
+  
+     !
+     ! Create a new file using default properties.
+     !
+     CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+          if (error .ne. 0) then
+              write(*,*) "Cannot modify filename"
+              stop
+     endif
+     CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
+     CALL check("h5fcreate_f",error,total_error)
+
+     !
+     ! Create a group named "/MyGroup" in the file.
+     !
+     CALL h5gcreate_f(file_id, groupname, group_id, error)
+     CALL check("h5gcreate_f",error,total_error)
+
+     !
+     !Create data space for the dataset.
+     !
+     CALL h5screate_simple_f(rank, dims, dspace_id, error)
+     CALL check("h5screate_simple_f",error,total_error)
+
+     !
+     ! create dataset in the file.
+     !
+     CALL h5dcreate_f(file_id, dsetname, H5T_NATIVE_INTEGER, dspace_id, &
+               dset_id, error)
+     CALL check("h5dcreate_f",error,total_error)
+     !
+     ! Get dataset name from dataset identifier
+     !
+     buf_size = 80
+     CALL h5iget_name_f(dset_id, name_buf, buf_size, name_size, error)
+     CALL check("h5iget_name_f",error,total_error)
+      if (name_size .ne. len(dsetname)) then
+          write(*,*) "h5iget_name returned wrong name size"
+          total_error = total_error + 1
+      else
+          if (name_buf(1:name_size) .ne. dsetname) then
+              write(*,*) "h5iget_name returned wrong name"
+              total_error = total_error + 1
+          endif
+      endif
+
+     !
+     ! Get file identifier from dataset identifier and then get file name
+     !
+     CALL h5iget_file_id_f(dset_id, new_file_id, error)
+     CALL check("h5iget_file_id_f",error,total_error)
+     name_size = 280
+     CALL h5fget_name_f(new_file_id, name_buf1, name_size, error)
+     CALL check("h5fget_name_f",error,total_error)
+          if (name_buf1(1:name_size) .ne. fix_filename(1:name_size)) then
+              write(*,*) "h5fget_name returned wrong file name"
+              total_error = total_error + 1
+          endif
+
+     !
+     ! Write data_in to the dataset
+     !
+     data_dims(1) = 1
+     CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, dset_data, data_dims, error)
+     CALL check("h5dwrite_f",error,total_error)
+
+     !
+     ! Create scalar data space for dataset attribute.
+     !
+     CALL h5screate_simple_f(arank, adims, aspace_id, error)
+     CALL check("h5screate_simple_f",error,total_error)
+
+     !
+     ! Create datatype for the Integer attribute.
+     !
+     CALL h5tcopy_f(H5T_NATIVE_INTEGER, atype_id, error)
+     CALL check("h5tcopy_f",error,total_error)
+
+     !
+     ! Create dataset INTEGER attribute.
+     !
+     CALL h5acreate_f(dset_id, aname, atype_id, aspace_id, attr_id, error)
+     CALL check("h5acreate_f",error,total_error)
+
+     !
+     ! Write the Integer attribute data.
+     !
+     CALL h5awrite_f(attr_id, atype_id, attr_data, data_dims, error)
+     CALL check("h5awrite_f",error,total_error)
+
+     !
+     !Get the file identifier
+     !
+     CALL h5iget_type_f(file_id, type, error)
+     CALL check("h5iget_type_f",error,total_error)
+     CALL verify("get file identifier wrong",type,H5I_FILE_F,total_error)
+
+     !
+     !Get the group identifier
+     !
+     CALL h5iget_type_f(group_id, type, error)
+     CALL check("h5iget_type_f",error,total_error)
+     CALL verify("get group identifier wrong",type,H5I_GROUP_F,total_error)
+
+     !
+     !Get the datatype identifier
+     !
+     CALL h5iget_type_f(atype_id, type, error)
+     CALL check("h5iget_type_f",error,total_error)
+     CALL verify("get datatype identifier wrong",type,H5I_DATATYPE_F,total_error)
+
+     !
+     !Get the dataspace identifier
+     !
+     CALL h5iget_type_f(aspace_id, type, error)
+     CALL check("h5iget_type_f",error,total_error)
+     CALL verify("get dataspace identifier wrong",type,H5I_DATASPACE_F,total_error)
+
+     !
+     !Get the dataset identifier
+     !
+     CALL h5iget_type_f(dset_id, type, error)
+     CALL check("h5iget_type_f",error,total_error)
+     CALL verify("get dataset identifier wrong",type,H5I_DATASET_F,total_error)
+
+     !
+     !Get the attribute identifier
+     !
+     CALL h5iget_type_f(attr_id, type, error)
+     CALL check("h5iget_type_f",error,total_error)
+     CALL verify("get attribute identifier wrong",type,H5I_ATTR_F,total_error)
+
+     !
+     ! Close the attribute.
+     !
+     CALL h5aclose_f(attr_id, error)
+     CALL check("h5aclose_f",error,total_error)
+     !
+     ! Close the dataspace.
+     !
+     CALL h5sclose_f(aspace_id, error)
+     CALL check("h5sclose_f",error,total_error)
+     CALL h5sclose_f(dspace_id, error)
+     CALL check("h5sclose_f",error,total_error)
+     !
+     ! Close the dataype.
+     !
+     CALL h5tclose_f(atype_id, error)
+     CALL check("h5tclose_f",error,total_error)
+
+     !
+     ! Close the dataset.
+     !
+     CALL h5dclose_f(dset_id, error)
+     CALL check("h5dclose_f",error,total_error)
+
+     !
+     ! Close the group.
+     !
+     CALL h5gclose_f(group_id, error)
+     CALL check("h5gclose_f",error,total_error)
+
+     !
+     ! Close the file.
+     !
+     CALL h5fclose_f(file_id, error)
+     CALL check("h5fclose_f",error,total_error)
+     CALL h5fclose_f(new_file_id, error)
+     CALL check("h5fclose_f",error,total_error)
+
+     !
+     ! Basic Test of increment/decrement ID functions
+     !
+
+     ! Create a file
+     CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
+     CALL check("h5fcreate_f",error,total_error)
+
+     ! Get the reference count for the file ID
+     CALL h5iget_ref_f(file_id, ref_count, error)
+     CALL check("h5iget_ref_f",error,total_error)
+     CALL verify("get file ref count wrong",ref_count,1,total_error)
+
+     ! Increment the reference count for the file ID
+     CALL h5iinc_ref_f(file_id, ref_count, error)
+     CALL check("h5iinc_ref_f",error,total_error)
+     CALL verify("get file ref count wrong",ref_count,2,total_error)
+
+     ! Close the file normally.
+     CALL h5fclose_f(file_id, error)
+     CALL check("h5fclose_f",error,total_error)
+
+     ! Get the reference count for the file ID
+     CALL h5iget_ref_f(file_id, ref_count, error)
+     CALL check("h5iget_ref_f",error,total_error)
+     CALL verify("get file ref count wrong",ref_count,1,total_error)
+
+     ! Close the file by decrementing the reference count
+     CALL h5idec_ref_f(file_id, ref_count, error)
+     CALL check("h5idec_ref_f",error,total_error)
+     CALL verify("get file ref count wrong",ref_count,0,total_error)
+     ! Try closing the file again (should fail)
+     CALL h5eset_auto_f(0, error)
+     CALL h5fclose_f(file_id, error)
+     CALL verify("file close should fail",error,-1,total_error)
+     ! Clear the error stack from the file close failure
+     CALL h5eset_auto_f(1, error)
+     CALL h5eclear_f(error)
+
+      if(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+          CALL check("h5_cleanup_f", error, total_error)
+
+     RETURN
+     END SUBROUTINE identifier_test
+
+END MODULE TH5I
diff --git a/fortran/test/tH5I.f90 b/fortran/test/tH5I.f90
deleted file mode 100644
index 088b4eb..0000000
--- a/fortran/test/tH5I.f90
+++ /dev/null
@@ -1,319 +0,0 @@
-!****h* root/fortran/test/tH5I.f90
-!
-! NAME
-!  tH5I.f90
-!
-! FUNCTION
-!  Basic testing of Fortran H5I APIs.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! CONTAINS SUBROUTINES
-!  identifier_test
-!
-!*****
-MODULE TH5I
-
-CONTAINS
-
-    SUBROUTINE identifier_test(cleanup, total_error)
-
-!   This subroutine tests following functionalities: h5iget_type_f
-
-   USE HDF5 ! This module contains all necessary modules
-   USE TH5_MISC
-
-     IMPLICIT NONE
-     LOGICAL, INTENT(IN)  :: cleanup
-     INTEGER, INTENT(INOUT) :: total_error
-
-     CHARACTER(LEN=6), PARAMETER :: filename = "itestf" ! File name
-     CHARACTER(LEN=80) :: fix_filename
-     CHARACTER(LEN=10), PARAMETER :: dsetname = "/itestdset" ! Dataset name
-     CHARACTER(LEN=10), PARAMETER :: groupname = "itestgroup"! group name
-     CHARACTER(LEN=10), PARAMETER :: aname = "itestattr"! group name
-
-
-
-     INTEGER(HID_T) :: file_id       ! File identifier
-     INTEGER(HID_T) :: new_file_id   ! File identifier
-     INTEGER(HID_T) :: group_id      ! group identifier
-     INTEGER(HID_T) :: dset_id       ! Dataset identifier
-     INTEGER(HID_T) :: dspace_id     ! Dataspace identifier
-     INTEGER(HID_T) :: attr_id      ! Datatype attribute identifier
-     INTEGER(HID_T) :: aspace_id     ! attribute data space identifier
-     INTEGER(HID_T) :: atype_id     ! attribute data type identifier
-
-
-     INTEGER, DIMENSION(1) :: dset_data = 0 ! Data value
-
-     INTEGER(HSIZE_T), DIMENSION(1) :: dims = 1 ! Datasets dimensions
-     INTEGER(HSIZE_T), DIMENSION(1) :: adims = 1 ! Attribute dimensions
-
-     INTEGER, DIMENSION(1) ::  attr_data = 12
-     INTEGER     ::   rank = 1 ! Datasets rank
-     INTEGER     ::   arank = 1 ! Attribute rank
-
-     INTEGER     ::   type !object identifier
-     INTEGER     ::   error ! Error flag
-     INTEGER(HSIZE_T), DIMENSION(2) :: data_dims
-     CHARACTER(LEN=80) name_buf
-     CHARACTER(LEN=280) name_buf1
-     INTEGER(SIZE_T)   buf_size
-     INTEGER(SIZE_T)   name_size
-     INTEGER    ::    ref_count ! Reference count for IDs
-
-
-     INTEGER(hid_t) :: dtype  ! datatype id
-     LOGICAL :: tri_ret       ! value
-
-     !
-     ! Tests the function H5Iis_valid_f
-     !
-     ! check that the ID is not valid
-     dtype = -1
-     CALL H5Iis_valid_f(dtype, tri_ret, error)
-     CALL check("H5Iis_valid_f", error, total_error) 
-     CALL VerifyLogical("H5Iis_valid_f", tri_ret, .FALSE., total_error)
-     
-     ! Create a datatype id
-     CALL H5Tcopy_f(H5T_NATIVE_INTEGER,dtype,error)
-     CALL check("H5Tcopy_f", error, total_error) 
-     
-     ! Check that the ID is valid
-     CALL H5Iis_valid_f(dtype, tri_ret, error)
-     CALL check("H5Iis_valid_f", error, total_error) 
-     CALL VerifyLogical("H5Tequal_f", tri_ret, .TRUE., total_error)
-     
-     CALL H5Tclose_f(dtype, error)
-     CALL check("H5Tclose_f", error, total_error) 
-  
-     !
-     ! Create a new file using default properties.
-     !
-     CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
-          if (error .ne. 0) then
-              write(*,*) "Cannot modify filename"
-              stop
-     endif
-     CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
-     CALL check("h5fcreate_f",error,total_error)
-
-     !
-     ! Create a group named "/MyGroup" in the file.
-     !
-     CALL h5gcreate_f(file_id, groupname, group_id, error)
-     CALL check("h5gcreate_f",error,total_error)
-
-     !
-     !Create data space for the dataset.
-     !
-     CALL h5screate_simple_f(rank, dims, dspace_id, error)
-     CALL check("h5screate_simple_f",error,total_error)
-
-     !
-     ! create dataset in the file.
-     !
-     CALL h5dcreate_f(file_id, dsetname, H5T_NATIVE_INTEGER, dspace_id, &
-               dset_id, error)
-     CALL check("h5dcreate_f",error,total_error)
-     !
-     ! Get dataset name from dataset identifier
-     !
-     buf_size = 80
-     CALL h5iget_name_f(dset_id, name_buf, buf_size, name_size, error)
-     CALL check("h5iget_name_f",error,total_error)
-      if (name_size .ne. len(dsetname)) then
-          write(*,*) "h5iget_name returned wrong name size"
-          total_error = total_error + 1
-      else
-          if (name_buf(1:name_size) .ne. dsetname) then
-              write(*,*) "h5iget_name returned wrong name"
-              total_error = total_error + 1
-          endif
-      endif
-
-     !
-     ! Get file identifier from dataset identifier and then get file name
-     !
-     CALL h5iget_file_id_f(dset_id, new_file_id, error)
-     CALL check("h5iget_file_id_f",error,total_error)
-     name_size = 280
-     CALL h5fget_name_f(new_file_id, name_buf1, name_size, error)
-     CALL check("h5fget_name_f",error,total_error)
-          if (name_buf1(1:name_size) .ne. fix_filename(1:name_size)) then
-              write(*,*) "h5fget_name returned wrong file name"
-              total_error = total_error + 1
-          endif
-
-     !
-     ! Write data_in to the dataset
-     !
-     data_dims(1) = 1
-     CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, dset_data, data_dims, error)
-     CALL check("h5dwrite_f",error,total_error)
-
-     !
-     ! Create scalar data space for dataset attribute.
-     !
-     CALL h5screate_simple_f(arank, adims, aspace_id, error)
-     CALL check("h5screate_simple_f",error,total_error)
-
-     !
-     ! Create datatype for the Integer attribute.
-     !
-     CALL h5tcopy_f(H5T_NATIVE_INTEGER, atype_id, error)
-     CALL check("h5tcopy_f",error,total_error)
-
-     !
-     ! Create dataset INTEGER attribute.
-     !
-     CALL h5acreate_f(dset_id, aname, atype_id, aspace_id, attr_id, error)
-     CALL check("h5acreate_f",error,total_error)
-
-     !
-     ! Write the Integer attribute data.
-     !
-     CALL h5awrite_f(attr_id, atype_id, attr_data, data_dims, error)
-     CALL check("h5awrite_f",error,total_error)
-
-     !
-     !Get the file identifier
-     !
-     CALL h5iget_type_f(file_id, type, error)
-     CALL check("h5iget_type_f",error,total_error)
-     CALL verify("get file identifier wrong",type,H5I_FILE_F,total_error)
-
-     !
-     !Get the group identifier
-     !
-     CALL h5iget_type_f(group_id, type, error)
-     CALL check("h5iget_type_f",error,total_error)
-     CALL verify("get group identifier wrong",type,H5I_GROUP_F,total_error)
-
-     !
-     !Get the datatype identifier
-     !
-     CALL h5iget_type_f(atype_id, type, error)
-     CALL check("h5iget_type_f",error,total_error)
-     CALL verify("get datatype identifier wrong",type,H5I_DATATYPE_F,total_error)
-
-     !
-     !Get the dataspace identifier
-     !
-     CALL h5iget_type_f(aspace_id, type, error)
-     CALL check("h5iget_type_f",error,total_error)
-     CALL verify("get dataspace identifier wrong",type,H5I_DATASPACE_F,total_error)
-
-     !
-     !Get the dataset identifier
-     !
-     CALL h5iget_type_f(dset_id, type, error)
-     CALL check("h5iget_type_f",error,total_error)
-     CALL verify("get dataset identifier wrong",type,H5I_DATASET_F,total_error)
-
-     !
-     !Get the attribute identifier
-     !
-     CALL h5iget_type_f(attr_id, type, error)
-     CALL check("h5iget_type_f",error,total_error)
-     CALL verify("get attribute identifier wrong",type,H5I_ATTR_F,total_error)
-
-     !
-     ! Close the attribute.
-     !
-     CALL h5aclose_f(attr_id, error)
-     CALL check("h5aclose_f",error,total_error)
-     !
-     ! Close the dataspace.
-     !
-     CALL h5sclose_f(aspace_id, error)
-     CALL check("h5sclose_f",error,total_error)
-     CALL h5sclose_f(dspace_id, error)
-     CALL check("h5sclose_f",error,total_error)
-     !
-     ! Close the dataype.
-     !
-     CALL h5tclose_f(atype_id, error)
-     CALL check("h5tclose_f",error,total_error)
-
-     !
-     ! Close the dataset.
-     !
-     CALL h5dclose_f(dset_id, error)
-     CALL check("h5dclose_f",error,total_error)
-
-     !
-     ! Close the group.
-     !
-     CALL h5gclose_f(group_id, error)
-     CALL check("h5gclose_f",error,total_error)
-
-     !
-     ! Close the file.
-     !
-     CALL h5fclose_f(file_id, error)
-     CALL check("h5fclose_f",error,total_error)
-     CALL h5fclose_f(new_file_id, error)
-     CALL check("h5fclose_f",error,total_error)
-
-     !
-     ! Basic Test of increment/decrement ID functions
-     !
-
-     ! Create a file
-     CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
-     CALL check("h5fcreate_f",error,total_error)
-
-     ! Get the reference count for the file ID
-     CALL h5iget_ref_f(file_id, ref_count, error)
-     CALL check("h5iget_ref_f",error,total_error)
-     CALL verify("get file ref count wrong",ref_count,1,total_error)
-
-     ! Increment the reference count for the file ID
-     CALL h5iinc_ref_f(file_id, ref_count, error)
-     CALL check("h5iinc_ref_f",error,total_error)
-     CALL verify("get file ref count wrong",ref_count,2,total_error)
-
-     ! Close the file normally.
-     CALL h5fclose_f(file_id, error)
-     CALL check("h5fclose_f",error,total_error)
-
-     ! Get the reference count for the file ID
-     CALL h5iget_ref_f(file_id, ref_count, error)
-     CALL check("h5iget_ref_f",error,total_error)
-     CALL verify("get file ref count wrong",ref_count,1,total_error)
-
-     ! Close the file by decrementing the reference count
-     CALL h5idec_ref_f(file_id, ref_count, error)
-     CALL check("h5idec_ref_f",error,total_error)
-     CALL verify("get file ref count wrong",ref_count,0,total_error)
-     ! Try closing the file again (should fail)
-     CALL h5eset_auto_f(0, error)
-     CALL h5fclose_f(file_id, error)
-     CALL verify("file close should fail",error,-1,total_error)
-     ! Clear the error stack from the file close failure
-     CALL h5eset_auto_f(1, error)
-     CALL h5eclear_f(error)
-
-      if(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-          CALL check("h5_cleanup_f", error, total_error)
-
-     RETURN
-     END SUBROUTINE identifier_test
-
-END MODULE TH5I
diff --git a/fortran/test/tH5L_F03.F90 b/fortran/test/tH5L_F03.F90
new file mode 100644
index 0000000..40afdbc
--- /dev/null
+++ b/fortran/test/tH5L_F03.F90
@@ -0,0 +1,318 @@
+!****h* root/fortran/test/tH5L_F03.f90
+!
+! NAME
+!  tH5L_F03.f90
+!
+! FUNCTION
+!  Test FORTRAN HDF5 H5L APIs which are dependent on FORTRAN 2003
+!  features. 
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! USES
+!  liter_cb_mod
+!
+! CONTAINS SUBROUTINES
+!  test_iter_group
+!
+!*****
+MODULE liter_cb_mod
+
+  USE HDF5 
+  USE TH5_MISC 
+  USE TH5_MISC_GEN
+  USE, INTRINSIC :: ISO_C_BINDING
+  IMPLICIT NONE
+
+  TYPE iter_enum
+     INTEGER RET_ZERO
+     INTEGER RET_TWO
+     INTEGER RET_CHANGE
+     INTEGER RET_CHANGE2
+  END TYPE iter_enum
+
+  ! Custom group iteration callback data 
+  TYPE, bind(c) ::  iter_info
+     CHARACTER(KIND=C_CHAR), DIMENSION(1:10) :: name !  The name of the object 
+     INTEGER(c_int) :: TYPE    !  The TYPE of the object 
+     INTEGER(c_int) :: command ! The TYPE of RETURN value 
+  END TYPE iter_info
+
+CONTAINS
+
+!***************************************************************
+!**
+!**  liter_cb(): Custom link iteration callback routine.
+!**
+!***************************************************************
+
+  INTEGER(KIND=C_INT) FUNCTION liter_cb(group, name, link_info, op_data) bind(C)
+
+    IMPLICIT NONE
+
+    INTEGER(HID_T), VALUE :: group
+    CHARACTER(LEN=1), DIMENSION(1:10) :: name
+
+
+    TYPE (H5L_info_t) :: link_info
+
+    TYPE(iter_info) :: op_data
+
+    INTEGER, SAVE :: count
+    INTEGER, SAVE :: count2
+
+!!$    
+!!$    iter_info *info = (iter_info *)op_data;
+!!$    static int count = 0;
+!!$    static int count2 = 0;
+
+    op_data%name(1:10) = name(1:10)
+
+    SELECT CASE (op_data%command)
+
+    CASE(0)
+       liter_cb = 0
+    CASE(2)
+       liter_cb = 2
+    CASE(3)
+       count = count + 1
+       IF(count.GT.10) THEN
+          liter_cb = 1
+       ELSE
+          liter_cb = 0
+       ENDIF
+    CASE(4)
+       count2 = count2 + 1
+       IF(count2.GT.10) THEN
+          liter_cb = 1
+       ELSE
+          liter_cb = 0
+       ENDIF
+    END SELECT
+
+  END FUNCTION liter_cb
+END MODULE liter_cb_mod
+
+MODULE TH5L_F03
+
+CONTAINS
+
+! *****************************************
+! ***        H 5 L   T E S T S
+! *****************************************
+
+
+!***************************************************************
+!**
+!**  test_iter_group(): Test group iteration functionality
+!**
+!***************************************************************
+SUBROUTINE test_iter_group(total_error)
+
+  USE liter_cb_mod
+  IMPLICIT NONE
+
+  INTEGER, INTENT(INOUT) :: total_error
+  INTEGER(HID_T) :: fapl
+  INTEGER(HID_T) :: file             !  File ID 
+  INTEGER(hid_t) :: dataset          ! Dataset ID 
+  INTEGER(hid_t) :: datatype         ! Common datatype ID 
+  INTEGER(hid_t) :: filespace        ! Common dataspace ID 
+  INTEGER(hid_t) :: grp              ! Group ID 
+  INTEGER i,j                        ! counting variable 
+  INTEGER(hsize_t) idx               ! Index in the group 
+  CHARACTER(LEN=11) :: DATAFILE = "titerate.h5"
+  INTEGER, PARAMETER :: ndatasets = 50
+  CHARACTER(LEN=10) :: name !  temporary name buffer 
+  CHARACTER(LEN=10), DIMENSION(1:ndatasets+2) :: lnames !  Names of the links created 
+
+  TYPE(iter_info), TARGET :: info
+
+  INTEGER :: error
+  INTEGER :: ret_value
+  TYPE(C_FUNPTR) :: f1
+  TYPE(C_PTR) :: f2
+  CHARACTER(LEN=2) :: ichr2
+  CHARACTER(LEN=10) :: ichr10
+
+  ! Get the default FAPL 
+  CALL H5Pcreate_f(H5P_FILE_ACCESS_F, fapl, error)
+  CALL check("h5pcreate_f", error, total_error)
+
+  ! Set the "use the latest version of the format" bounds for creating objects in the file 
+  CALL H5Pset_libver_bounds_f(fapl, H5F_LIBVER_LATEST_F, H5F_LIBVER_LATEST_F, error)
+  CALL check("H5Pset_libver_bounds_f",error, total_error)
+
+  ! Create the test file with the datasets 
+  CALL h5fcreate_f(DATAFILE, H5F_ACC_TRUNC_F, file, error, H5P_DEFAULT_F, fapl)
+  CALL check("h5fcreate_f", error, total_error)
+
+  ! Test iterating over empty group
+  idx = 0
+  info%command = 0
+  f1 = C_FUNLOC(liter_cb)
+  f2 = C_LOC(info)
+
+
+  CALL H5Literate_f(file, H5_INDEX_NAME_F, H5_ITER_INC_F, idx, f1, f2, ret_value, error)
+  CALL check("H5Literate_f", error, total_error)
+
+  CALL H5Tcopy_f(H5T_NATIVE_INTEGER, datatype, error)
+  CALL check("H5Tcopy_f", error, total_error)
+
+  CALL H5Screate_f(H5S_SCALAR_F, filespace, error)
+  CALL check("H5Screate_f", error, total_error)
+
+  DO i = 1, ndatasets
+     WRITE(ichr2, '(I2.2)') i
+
+     name = 'Dataset '//ichr2
+
+     CALL h5dcreate_f(file, name, datatype, filespace, dataset, error)
+     CALL check("H5dcreate_f", error, total_error)
+
+     lnames(i) = name
+
+     CALL h5dclose_f(dataset,error)
+     CALL check("H5dclose_f", error, total_error)
+
+  ENDDO
+
+  !  Create a group and named datatype under root group for testing 
+
+  CALL H5Gcreate_f(file, "grp0000000", grp, error)
+  CALL check("H5Gcreate_f", error, total_error)
+
+  lnames(ndatasets+2) = "grp0000000" 
+
+!!$
+!!$    lnames[NDATASETS] = HDstrdup("grp");
+!!$    CHECK(lnames[NDATASETS], NULL, "strdup");
+!!$
+
+  CALL H5Tcommit_f(file, "dtype00000", datatype, error)
+  CALL check("H5Tcommit_f", error, total_error)
+
+  lnames(ndatasets+1) = "dtype00000" 
+
+  !  Close everything up 
+
+  CALL H5Tclose_f(datatype, error)
+  CALL check("H5Tclose_f", error, total_error)
+
+  CALL H5Gclose_f(grp, error)
+  CALL check("H5Gclose_f", error, total_error)
+
+  CALL H5Sclose_f(filespace, error)
+  CALL check("H5Sclose_f", error, total_error)
+
+  CALL H5Fclose_f(file, error)
+  CALL check("H5Fclose_f", error, total_error)
+
+  !  Iterate through the datasets in the root group in various ways 
+  CALL H5Fopen_f(DATAFILE, H5F_ACC_RDONLY_F, file, error, access_prp=fapl)
+  CALL check("h5fopen_f", error, total_error)
+
+  ! Test all objects in group, when callback always returns 0 
+  info%command = 0
+  idx = 0
+  CALL H5Literate_f(file, H5_INDEX_NAME_F, H5_ITER_INC_F, idx, f1, f2, ret_value, error)
+  IF(ret_value.GT.0)THEN
+     PRINT*,"ERROR: Group iteration function didn't return zero correctly!"
+     CALL verify("H5Literate_f", error, -1, total_error)
+  ENDIF
+
+  !   Test all objects in group, when callback always returns 1 
+  !   This also tests the "restarting" ability, because the index changes 
+
+  info%command = 2
+  idx = 0
+  i = 0
+  f1 = C_FUNLOC(liter_cb)
+  f2 = C_LOC(info)
+  DO 
+     CALL H5Literate_f(file, H5_INDEX_NAME_F, H5_ITER_INC_F, idx, f1, f2, ret_value, error)
+     IF(error.LT.0) EXIT
+     !  Verify return value from iterator gets propagated correctly 
+     CALL verify("H5Literate", ret_value, 2, total_error)
+     !  Increment the number of times "2" is returned 
+     i = i + 1
+     ! Verify that the index is the correct value 
+     CALL verify("H5Literate", INT(idx), INT(i), total_error)
+     IF(idx .GT.ndatasets+2)THEN
+        PRINT*,"ERROR: Group iteration function walked too far!"
+     ENDIF
+
+     ! Verify the correct name is retrieved 
+     DO j = 1, 10
+        ichr10(j:j) = info%name(j)(1:1)
+     ENDDO
+     CALL verify("H5Literate_f", ichr10, lnames(INT(idx)), total_error)
+     IF(i.EQ.52)EXIT ! prints out error message otherwise (for gcc/gfortran/g95) not intel (why) -FIXME- scot
+  END DO
+
+  ! put check if did not walk far enough -scot FIXME
+
+  IF(i .NE. (NDATASETS + 2)) THEN
+     CALL verify("H5Literate_f", i, INT(NDATASETS + 2), total_error)
+     PRINT*,"ERROR: Group iteration function didn't perform multiple iterations correctly"
+  ENDIF
+
+  ! Test all objects in group, when callback changes return value 
+  ! This also tests the "restarting" ability, because the index changes 
+
+  info%command = 3
+  idx = 0
+  i = 0
+
+  f1 = C_FUNLOC(liter_cb)
+  f2 = C_LOC(info)
+  DO
+
+     CALL H5Literate_f(file, H5_INDEX_NAME_F, H5_ITER_INC_F, idx, f1, f2, ret_value, error)
+     IF(error.LT.0) EXIT
+     CALL verify("H5Literate_f", ret_value, 1, total_error)
+
+     ! Increment the number of times "1" is returned 
+     i = i + 1
+
+     ! Verify that the index is the correct value 
+     CALL verify("H5Literate_f", INT(idx), INT(i+10), total_error)
+
+     IF(idx .GT.ndatasets+2)THEN
+        PRINT*,"Group iteration function walked too far!"
+     ENDIF
+
+     DO j = 1, 10
+        ichr10(j:j) = info%name(j)(1:1)
+     ENDDO
+     ! Verify that the correct name is retrieved 
+     CALL verify("H5Literate_f", ichr10, lnames(INT(idx)), total_error)
+     IF(i.EQ.42)EXIT ! prints out error message otherwise (for gcc/gfortran/g95) not intel (why) -FIX- scot
+  ENDDO
+
+  IF(i .NE. 42 .OR. idx .NE. 52)THEN
+     PRINT*,"ERROR: Group iteration function didn't perform multiple iterations correctly!"
+     CALL check("H5Literate_f",-1,total_error)
+  ENDIF
+
+  CALL H5Fclose_f(file, error)
+  CALL check("H5Fclose_f", error, total_error)
+
+END SUBROUTINE test_iter_group
+
+END MODULE TH5L_F03
diff --git a/fortran/test/tH5L_F03.f90 b/fortran/test/tH5L_F03.f90
deleted file mode 100644
index 795f1e2..0000000
--- a/fortran/test/tH5L_F03.f90
+++ /dev/null
@@ -1,321 +0,0 @@
-!****h* root/fortran/test/tH5L_F03.f90
-!
-! NAME
-!  tH5L_F03.f90
-!
-! FUNCTION
-!  Test FORTRAN HDF5 H5L APIs which are dependent on FORTRAN 2003
-!  features. 
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! USES
-!  liter_cb_mod
-!
-! CONTAINS SUBROUTINES
-!  test_iter_group
-!
-!*****
-MODULE liter_cb_mod
-
-  USE HDF5
-  USE ISO_C_BINDING
-  IMPLICIT NONE
-
-  TYPE iter_enum
-     INTEGER RET_ZERO
-     INTEGER RET_TWO
-     INTEGER RET_CHANGE
-     INTEGER RET_CHANGE2
-  END TYPE iter_enum
-
-  ! Custom group iteration callback data 
-  TYPE, bind(c) ::  iter_info
-     CHARACTER(LEN=1), DIMENSION(1:10) :: name !  The name of the object 
-     INTEGER(c_int) :: TYPE    !  The TYPE of the object 
-     INTEGER(c_int) :: command ! The TYPE of RETURN value 
-  END TYPE iter_info
-
-CONTAINS
-
-!***************************************************************
-!**
-!**  liter_cb(): Custom link iteration callback routine.
-!**
-!***************************************************************
-
-  INTEGER(KIND=C_INT) FUNCTION liter_cb(group, name, link_info, op_data) bind(C)
-
-    USE HDF5
-    USE ISO_C_BINDING
-    IMPLICIT NONE
-
-    INTEGER(HID_T), VALUE :: group
-    CHARACTER(LEN=1), DIMENSION(1:10) :: name
-
-
-    TYPE (H5L_info_t) :: link_info
-
-    TYPE(iter_info) :: op_data
-
-    INTEGER, SAVE :: count
-    INTEGER, SAVE :: count2
-
-!!$    
-!!$    iter_info *info = (iter_info *)op_data;
-!!$    static int count = 0;
-!!$    static int count2 = 0;
-
-    op_data%name(1:10) = name(1:10)
-
-    SELECT CASE (op_data%command)
-
-    CASE(0)
-       liter_cb = 0
-    CASE(2)
-       liter_cb = 2
-    CASE(3)
-       count = count + 1
-       IF(count.GT.10) THEN
-          liter_cb = 1
-       ELSE
-          liter_cb = 0
-       ENDIF
-    CASE(4)
-       count2 = count2 + 1
-       IF(count2.GT.10) THEN
-          liter_cb = 1
-       ELSE
-          liter_cb = 0
-       ENDIF
-    END SELECT
-
-  END FUNCTION liter_cb
-END MODULE liter_cb_mod
-
-MODULE TH5L_F03
-
-CONTAINS
-
-! *****************************************
-! ***        H 5 L   T E S T S
-! *****************************************
-
-
-!***************************************************************
-!**
-!**  test_iter_group(): Test group iteration functionality
-!**
-!***************************************************************
-SUBROUTINE test_iter_group(total_error)
-
-  USE HDF5 
-  USE TH5_MISC
-  USE ISO_C_BINDING
-  USE liter_cb_mod
-  IMPLICIT NONE
-
-  INTEGER, INTENT(INOUT) :: total_error
-  INTEGER(HID_T) :: fapl
-  INTEGER(HID_T) :: file             !  File ID 
-  INTEGER(hid_t) :: dataset          ! Dataset ID 
-  INTEGER(hid_t) :: datatype         ! Common datatype ID 
-  INTEGER(hid_t) :: filespace        ! Common dataspace ID 
-  INTEGER(hid_t) :: grp              ! Group ID 
-  INTEGER i,j                        ! counting variable 
-  INTEGER(hsize_t) idx               ! Index in the group 
-  CHARACTER(LEN=11) :: DATAFILE = "titerate.h5"
-  INTEGER, PARAMETER :: ndatasets = 50
-  CHARACTER(LEN=10) :: name !  temporary name buffer 
-  CHARACTER(LEN=10), DIMENSION(1:ndatasets+2) :: lnames !  Names of the links created 
-
-  TYPE(iter_info), TARGET :: info
-
-  INTEGER :: error
-  INTEGER :: ret_value
-  TYPE(C_FUNPTR) :: f1
-  TYPE(C_PTR) :: f2
-  CHARACTER(LEN=2) :: ichr2
-  CHARACTER(LEN=10) :: ichr10
-
-  ! Get the default FAPL 
-  CALL H5Pcreate_f(H5P_FILE_ACCESS_F, fapl, error)
-  CALL check("h5pcreate_f", error, total_error)
-
-  ! Set the "use the latest version of the format" bounds for creating objects in the file 
-  CALL H5Pset_libver_bounds_f(fapl, H5F_LIBVER_LATEST_F, H5F_LIBVER_LATEST_F, error)
-  CALL check("H5Pset_libver_bounds_f",error, total_error)
-
-  ! Create the test file with the datasets 
-  CALL h5fcreate_f(DATAFILE, H5F_ACC_TRUNC_F, file, error, H5P_DEFAULT_F, fapl)
-  CALL check("h5fcreate_f", error, total_error)
-
-  ! Test iterating over empty group
-  idx = 0
-  info%command = 0
-  f1 = C_FUNLOC(liter_cb)
-  f2 = C_LOC(info)
-
-
-  CALL H5Literate_f(file, H5_INDEX_NAME_F, H5_ITER_INC_F, idx, f1, f2, ret_value, error)
-  CALL check("H5Literate_f", error, total_error)
-
-  CALL H5Tcopy_f(H5T_NATIVE_INTEGER, datatype, error)
-  CALL check("H5Tcopy_f", error, total_error)
-
-  CALL H5Screate_f(H5S_SCALAR_F, filespace, error)
-  CALL check("H5Screate_f", error, total_error)
-
-  DO i = 1, ndatasets
-     WRITE(ichr2, '(I2.2)') i
-
-     name = 'Dataset '//ichr2
-
-     CALL h5dcreate_f(file, name, datatype, filespace, dataset, error)
-     CALL check("H5dcreate_f", error, total_error)
-
-     lnames(i) = name
-
-     CALL h5dclose_f(dataset,error)
-     CALL check("H5dclose_f", error, total_error)
-
-  ENDDO
-
-  !  Create a group and named datatype under root group for testing 
-
-  CALL H5Gcreate_f(file, "grp0000000", grp, error)
-  CALL check("H5Gcreate_f", error, total_error)
-
-  lnames(ndatasets+2) = "grp0000000" 
-
-!!$
-!!$    lnames[NDATASETS] = HDstrdup("grp");
-!!$    CHECK(lnames[NDATASETS], NULL, "strdup");
-!!$
-
-  CALL H5Tcommit_f(file, "dtype00000", datatype, error)
-  CALL check("H5Tcommit_f", error, total_error)
-
-  lnames(ndatasets+1) = "dtype00000" 
-
-  !  Close everything up 
-
-  CALL H5Tclose_f(datatype, error)
-  CALL check("H5Tclose_f", error, total_error)
-
-  CALL H5Gclose_f(grp, error)
-  CALL check("H5Gclose_f", error, total_error)
-
-  CALL H5Sclose_f(filespace, error)
-  CALL check("H5Sclose_f", error, total_error)
-
-  CALL H5Fclose_f(file, error)
-  CALL check("H5Fclose_f", error, total_error)
-
-  !  Iterate through the datasets in the root group in various ways 
-  CALL H5Fopen_f(DATAFILE, H5F_ACC_RDONLY_F, file, error, access_prp=fapl)
-  CALL check("h5fopen_f", error, total_error)
-
-  ! Test all objects in group, when callback always returns 0 
-  info%command = 0
-  idx = 0
-  CALL H5Literate_f(file, H5_INDEX_NAME_F, H5_ITER_INC_F, idx, f1, f2, ret_value, error)
-  IF(ret_value.GT.0)THEN
-     PRINT*,"ERROR: Group iteration function didn't return zero correctly!"
-     CALL verify("H5Literate_f", error, -1, total_error)
-  ENDIF
-
-  !   Test all objects in group, when callback always returns 1 
-  !   This also tests the "restarting" ability, because the index changes 
-
-  info%command = 2
-  idx = 0
-  i = 0
-  f1 = C_FUNLOC(liter_cb)
-  f2 = C_LOC(info)
-  DO 
-     CALL H5Literate_f(file, H5_INDEX_NAME_F, H5_ITER_INC_F, idx, f1, f2, ret_value, error)
-     IF(error.LT.0) EXIT
-     !  Verify return value from iterator gets propagated correctly 
-     CALL VERIFY("H5Literate", ret_value, 2, total_error)
-     !  Increment the number of times "2" is returned 
-     i = i + 1
-     ! Verify that the index is the correct value 
-     CALL VERIFY("H5Literate", INT(idx), INT(i), total_error)
-     IF(idx .GT.ndatasets+2)THEN
-        PRINT*,"ERROR: Group iteration function walked too far!"
-     ENDIF
-
-     ! Verify the correct name is retrieved 
-     DO j = 1, 10
-        ichr10(j:j) = info%name(j)(1:1)
-     ENDDO
-     CALL verifystring("H5Literate_f", ichr10, lnames(INT(idx)), total_error)
-     IF(i.EQ.52)EXIT ! prints out error message otherwise (for gcc/gfortran/g95) not intel (why) -FIXME- scot
-  END DO
-
-  ! put check if did not walk far enough -scot FIXME
-
-  IF(i .NE. (NDATASETS + 2)) THEN
-     CALL VERIFY("H5Literate_f", i, INT(NDATASETS + 2), total_error)
-     PRINT*,"ERROR: Group iteration function didn't perform multiple iterations correctly"
-  ENDIF
-
-  ! Test all objects in group, when callback changes return value 
-  ! This also tests the "restarting" ability, because the index changes 
-
-  info%command = 3
-  idx = 0
-  i = 0
-
-  f1 = C_FUNLOC(liter_cb)
-  f2 = C_LOC(info)
-  DO
-
-     CALL H5Literate_f(file, H5_INDEX_NAME_F, H5_ITER_INC_F, idx, f1, f2, ret_value, error)
-     IF(error.LT.0) EXIT
-     CALL VERIFY("H5Literate_f", ret_value, 1, total_error)
-
-     ! Increment the number of times "1" is returned 
-     i = i + 1
-
-     ! Verify that the index is the correct value 
-     CALL VERIFY("H5Literate_f", INT(idx), INT(i+10), total_error)
-
-     IF(idx .GT.ndatasets+2)THEN
-        PRINT*,"Group iteration function walked too far!"
-     ENDIF
-
-     DO j = 1, 10
-        ichr10(j:j) = info%name(j)(1:1)
-     ENDDO
-     ! Verify that the correct name is retrieved 
-     CALL verifystring("H5Literate_f", ichr10, lnames(INT(idx)), total_error)
-     IF(i.EQ.42)EXIT ! prints out error message otherwise (for gcc/gfortran/g95) not intel (why) -FIX- scot
-  ENDDO
-
-  IF(i .NE. 42 .OR. idx .NE. 52)THEN
-     PRINT*,"ERROR: Group iteration function didn't perform multiple iterations correctly!"
-     CALL check("H5Literate_f",-1,total_error)
-  ENDIF
-
-  CALL H5Fclose_f(file, error)
-  CALL check("H5Fclose_f", error, total_error)
-
-END SUBROUTINE test_iter_group
-
-END MODULE TH5L_F03
diff --git a/fortran/test/tH5MISC_1_8.F90 b/fortran/test/tH5MISC_1_8.F90
new file mode 100644
index 0000000..ba3f095
--- /dev/null
+++ b/fortran/test/tH5MISC_1_8.F90
@@ -0,0 +1,469 @@
+!****h* root/fortran/test/tH5MISC_1_8.f90
+!
+! NAME
+!  tH5MISC_1_8.f90
+!
+! FUNCTION
+!  Basic testing of Fortran API's introduced in 1.8 release.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+!*****
+MODULE TH5MISC_1_8
+
+  USE HDF5 ! This module contains all necessary modules
+  USE TH5_MISC
+  USE TH5_MISC_GEN
+
+CONTAINS
+
+SUBROUTINE dtransform(cleanup, total_error)
+
+  IMPLICIT NONE
+  LOGICAL, INTENT(IN)  :: cleanup
+  INTEGER, INTENT(INOUT) :: total_error
+
+  INTEGER(HID_T) :: dxpl_id_c_to_f
+  INTEGER(HID_T) :: file_id
+
+  CHARACTER(LEN=15), PARAMETER :: c_to_f = "(9/5.0)*x + 123"
+  INTEGER :: error
+  CHARACTER(LEN=15) :: ptrgetTest
+  CHARACTER(LEN=7) :: ptrgetTest_small
+  CHARACTER(LEN=30) :: ptrgetTest_big
+
+  INTEGER(SIZE_T) :: size
+
+  CALL H5Fcreate_f("dtransform.h5", H5F_ACC_TRUNC_F, file_id, error)
+  CALL check("dtransform.H5Fcreate_f", error, total_error)
+
+  CALL H5Pcreate_f(H5P_DATASET_XFER_F, dxpl_id_c_to_f, error)
+  CALL check("dtransform.H5Pcreate_f", error, total_error)
+
+  CALL H5Pset_data_transform_f(dxpl_id_c_to_f, c_to_f, error)
+  CALL check("dtransform.H5Pset_data_transform_f", error, total_error)
+
+  CALL H5Pget_data_transform_f(dxpl_id_c_to_f, ptrgetTest, error, size=size)
+  CALL check("dtransform.H5Pget_data_transform_f",  error, total_error)
+  CALL verify("dtransform.H5Pget_data_transform_f", c_to_f, ptrgetTest, total_error)
+  CALL verify("dtransform.H5Pget_data_transform_f", INT(size),15, total_error)
+
+! check case when receiving buffer to small
+
+  CALL H5Pget_data_transform_f(dxpl_id_c_to_f, ptrgetTest_small, error, size=size)
+  CALL check("dtransform.H5Pget_data_transform_f",  error, total_error)
+  CALL verify("dtransform.H5Pget_data_transform_f", c_to_f(1:7), ptrgetTest_small, total_error)
+  CALL verify("dtransform.H5Pget_data_transform_f", INT(size),15, total_error)
+
+! check case when receiving buffer to big
+
+  CALL H5Pget_data_transform_f(dxpl_id_c_to_f, ptrgetTest_big, error, size=size)
+  CALL check("dtransform.H5Pget_data_transform_f",  error, total_error)
+  CALL verify("dtransform.H5Pget_data_transform_f", c_to_f(1:15), ptrgetTest_big(1:15), total_error)
+  CALL verify("dtransform.H5Pget_data_transform_f", INT(size), 15, total_error)
+
+  CALL H5Fclose_f(file_id, error)
+  CALL check("H5Fclose_f", error, total_error)
+
+  IF(cleanup) CALL h5_cleanup_f("dtransform", H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+
+END SUBROUTINE dtransform
+
+
+!***************************************************************
+!**
+!**  test_genprop_basic_class(): Test basic generic property list code.
+!**      Tests creating new generic classes.
+!**
+!***************************************************************
+
+SUBROUTINE test_genprop_basic_class(total_error)
+
+  IMPLICIT NONE
+  INTEGER, INTENT(INOUT) :: total_error
+
+  INTEGER(HID_T) :: cid1    ! Generic Property class ID 
+  INTEGER(HID_T) :: cid2    ! Generic Property class ID 
+
+  CHARACTER(LEN=7) :: CLASS1_NAME = "Class 1"
+  CHARACTER(LEN=7)  :: name              !  Name of class 
+  CHARACTER(LEN=10) :: name_big          !  Name of class bigger buffer 
+  CHARACTER(LEN=4)  :: name_small        !  Name of class smaller buffer
+  INTEGER :: error
+  INTEGER :: size
+  LOGICAL :: flag
+
+  ! Output message about test being performed 
+
+  !WRITE(*,*) "Testing Basic Generic Property List Class Creation Functionality"
+
+  ! Try some bogus value for class identifier; function should fail gracefully
+
+  cid1 = 456
+  CALL H5Pget_class_name_f(cid1, name, size, error)
+  CALL verify("H5Pget_class_name", error, -1, error)
+
+  !  Create a new generic class, derived from the root of the class hierarchy 
+  CALL H5Pcreate_class_f(H5P_ROOT_F, CLASS1_NAME, cid1, error)
+  CALL check("H5Pcreate_class", error, total_error)
+
+  !  Check class name 
+  CALL H5Pget_class_name_f(cid1, name, size, error)
+  CALL check("H5Pget_class_name", error, total_error)
+  CALL verify("H5Pget_class_name", size,7,error)
+  CALL verify("H5Pget_class_name", name, CLASS1_NAME, error)
+  IF(error.NE.0)THEN
+     WRITE(*,*) 'Class names do not match! name=',name, 'CLASS1_NAME=',CLASS1_NAME
+     total_error = total_error + 1
+  ENDIF
+
+  !  Check class name smaller buffer
+  CALL H5Pget_class_name_f(cid1, name_small, size, error)
+  CALL check("H5Pget_class_name", error, total_error)
+  CALL verify("H5Pget_class_name", size,7,error)
+  CALL verify("H5Pget_class_name", name_small(1:4), CLASS1_NAME(1:4), error)
+  IF(error.NE.0)THEN
+     WRITE(*,*) 'Class names do not match! name=',name_small(1:4), 'CLASS1_NAME=',CLASS1_NAME(1:4)
+     total_error = total_error + 1
+  ENDIF
+
+  !  Check class name bigger buffer
+  CALL H5Pget_class_name_f(cid1, name_big, size, error)
+  CALL check("H5Pget_class_name", error, total_error)
+  CALL verify("H5Pget_class_name", size,7,error)
+  CALL verify("H5Pget_class_name", TRIM(name_big), TRIM(CLASS1_NAME), error)
+  IF(error.NE.0)THEN
+     WRITE(*,*) 'Class names do not match! name=',TRIM(name_small), 'CLASS1_NAME=',TRIM(CLASS1_NAME)
+     total_error = total_error + 1
+  ENDIF
+
+  !  Check class parent 
+  CALL H5Pget_class_parent_f(cid1, cid2, error)
+  CALL check("H5Pget_class_parent_f", error, total_error)
+
+  !  Verify class parent correct 
+  CALL H5Pequal_f(cid2, H5P_ROOT_F, flag, error)
+  CALL check("H5Pequal_f", error, total_error)
+  CALL verify("H5Pequal_f", flag, .TRUE., total_error)
+
+
+  !  Make certain false postives aren't being returned 
+  CALL H5Pequal_f(cid2, H5P_FILE_CREATE_F, flag, error)
+  CALL check("H5Pequal_f", error, total_error)
+  CALL verify("H5Pequal_f", flag, .FALSE., total_error)
+
+  ! Close parent class 
+  CALL H5Pclose_class_f(cid2, error)
+  CALL check("H5Pclose_class_f", error, total_error)
+
+
+  ! Close class 
+  CALL H5Pclose_class_f(cid1, error)
+  CALL check("H5Pclose_class_f", error, total_error)
+
+END SUBROUTINE test_genprop_basic_class
+
+SUBROUTINE test_h5s_encode(total_error)
+
+!***************************************************************
+!**
+!**  test_h5s_encode(): Test H5S (dataspace) encoding and decoding.
+!**
+!***************************************************************
+
+  IMPLICIT NONE
+  INTEGER, INTENT(INOUT) :: total_error
+
+  INTEGER(hid_t) :: sid1, sid3!	 Dataspace ID		
+  INTEGER(hid_t) :: decoded_sid1, decoded_sid3
+  INTEGER :: rank    ! LOGICAL rank of dataspace	
+  INTEGER(size_t) :: sbuf_size=0, scalar_size=0
+
+! Make sure the size is large
+  CHARACTER(LEN=288) :: sbuf
+  CHARACTER(LEN=288) :: scalar_buf
+
+  INTEGER(hsize_t) :: n !  Number of dataspace elements 
+
+  INTEGER(hsize_t), DIMENSION(1:3) :: start = (/0, 0, 0/)
+  INTEGER(hsize_t), DIMENSION(1:3) :: stride = (/2, 5, 3/)
+  INTEGER(hsize_t), DIMENSION(1:3) :: count = (/2, 2, 2/)
+  INTEGER(hsize_t), DIMENSION(1:3) :: BLOCK = (/1, 3, 1/)
+
+  INTEGER :: space_type
+  !
+  ! Dataset dimensions
+  !
+  INTEGER, PARAMETER :: SPACE1_DIM1= 3,  SPACE1_DIM2=15, SPACE1_DIM3=13
+
+  INTEGER(HSIZE_T), DIMENSION(1:3) :: dims1 = (/SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3/)
+  INTEGER :: SPACE1_RANK = 3
+  INTEGER :: error
+
+  !-------------------------------------------------------------------------
+  ! * Test encoding and decoding of simple dataspace and hyperslab selection.
+  ! *-------------------------------------------------------------------------
+  ! 
+
+  CALL H5Screate_simple_f(SPACE1_RANK, dims1, sid1, error)
+  CALL check("H5Screate_simple", error, total_error)
+
+  CALL h5sselect_hyperslab_f(sid1, H5S_SELECT_SET_F, &
+       start, count, error, stride=stride, BLOCK=BLOCK)
+  CALL check("h5sselect_hyperslab_f", error, total_error)
+
+
+  ! Encode simple data space in a buffer 
+
+  !         First find the buffer size
+  CALL H5Sencode_f(sid1, sbuf, sbuf_size, error)
+  CALL check("H5Sencode", error, total_error)
+
+
+  !  Try decoding bogus buffer 
+
+  CALL H5Sdecode_f(sbuf, decoded_sid1, error)
+  CALL verify("H5Sdecode", error, -1, total_error)
+
+  CALL H5Sencode_f(sid1, sbuf, sbuf_size, error)
+  CALL check("H5Sencode", error, total_error)
+
+  !  Decode from the dataspace buffer and return an object handle 
+  CALL H5Sdecode_f(sbuf, decoded_sid1, error)
+  CALL check("H5Sdecode", error, total_error)
+
+
+  !  Verify the decoded dataspace 
+  CALL h5sget_simple_extent_npoints_f(decoded_sid1, n, error)
+  CALL check("h5sget_simple_extent_npoints_f", error, total_error)
+  CALL verify("h5sget_simple_extent_npoints_f", INT(n), INT(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3), &
+       total_error)
+
+  !
+  !Close the dataspace for the dataset.
+  !
+  CALL h5sclose_f(sid1, error)
+  CALL check("h5sclose_f", error, total_error)
+
+  CALL h5sclose_f(decoded_sid1, error)
+  CALL check("h5sclose_f", error, total_error)
+
+  ! -------------------------------------------------------------------------
+  !  * Test encoding and decoding of scalar dataspace.
+  !  *-------------------------------------------------------------------------
+  !  
+  !  Create scalar dataspace 
+
+  CALL H5Screate_f(H5S_SCALAR_F, sid3, error)
+  CALL check("H5Screate_f",error, total_error)
+
+  !  Encode scalar data space in a buffer 
+
+  !        First find the buffer size
+  CALL H5Sencode_f(sid3, scalar_buf, scalar_size, error)
+  CALL check("H5Sencode_f", error, total_error)
+
+  ! encode
+
+  CALL H5Sencode_f(sid3, scalar_buf, scalar_size, error)
+  CALL check("H5Sencode_f", error, total_error)
+
+
+  !  Decode from the dataspace buffer and return an object handle 
+
+  CALL H5Sdecode_f(scalar_buf, decoded_sid3, error)
+  CALL check("H5Sdecode_f", error, total_error)
+
+
+  !  Verify extent type 
+
+  CALL H5Sget_simple_extent_type_f(decoded_sid3, space_type, error)
+  CALL check("H5Sget_simple_extent_type_f", error, total_error)
+  CALL verify("H5Sget_simple_extent_type_f", space_type, H5S_SCALAR_F, total_error)
+
+  !  Verify decoded dataspace 
+  CALL h5sget_simple_extent_npoints_f(decoded_sid3, n, error)
+  CALL check("h5sget_simple_extent_npoints_f", error, total_error)
+  CALL verify("h5sget_simple_extent_npoints_f", INT(n), 1, total_error)
+
+  CALL H5Sget_simple_extent_ndims_f(decoded_sid3, rank, error)
+  CALL CHECK("H5Sget_simple_extent_ndims_f", error, total_error)
+  CALL verify("H5Sget_simple_extent_ndims_f", rank, 0, total_error )
+
+  CALL h5sclose_f(sid3, error)
+  CALL check("h5sclose_f", error, total_error)
+
+  CALL h5sclose_f(decoded_sid3, error)
+  CALL check("h5sclose_f", error, total_error)
+
+END SUBROUTINE test_h5s_encode
+
+!-------------------------------------------------------------------------
+! Function:    test_scaleoffset
+!
+! Purpose:     Tests the integer datatype for scaleoffset filter
+!              with fill value set
+!
+! Return:      Success:        0
+!              Failure:        >0
+!
+! Programmer:  M. Scot Breitenfeld
+!              Decemeber 11, 2010
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+!
+
+SUBROUTINE test_scaleoffset(cleanup, total_error )
+
+  IMPLICIT NONE
+  LOGICAL, INTENT(IN)  :: cleanup
+  INTEGER, INTENT(INOUT) :: total_error
+  INTEGER(hid_t) :: file
+
+  INTEGER(hid_t)   :: dataset, datatype, space, mspace, dc
+  INTEGER(hsize_t), DIMENSION(1:2) :: dims = (/2, 5/)
+  INTEGER(hsize_t), DIMENSION(1:2) :: chunk_dim = (/2, 5/)
+  INTEGER, DIMENSION(1:2,1:5) :: orig_data
+  INTEGER, DIMENSION(1:2,1:5) :: new_data
+  INTEGER(hsize_t), DIMENSION(1:2) :: start  ! Start of hyperslab 
+  INTEGER(hsize_t), DIMENSION(1:2) :: stride ! Stride of hyperslab
+  INTEGER(hsize_t), DIMENSION(1:2) :: count  ! BLOCK count
+  INTEGER(hsize_t), DIMENSION(1:2) :: BLOCK  ! BLOCK sizes
+  INTEGER :: fillval
+  INTEGER(size_t) :: j
+  REAL :: x
+  INTEGER :: error
+  LOGICAL :: status
+
+  ! check to see if filter is available
+  CALL H5Zfilter_avail_f(H5Z_FILTER_SCALEOFFSET_F, status, error)
+  IF(.NOT.status)THEN ! We don't have H5Z_FILTER_SCALEOFFSET_F filter
+     total_error = -1       ! so return
+     RETURN
+  ENDIF
+
+  CALL H5Fcreate_f("h5scaleoffset.h5", H5F_ACC_TRUNC_F, file, error)
+  CALL check("H5Fcreate_f", error, total_error)
+
+  CALL H5Tcopy_f(H5T_NATIVE_INTEGER, datatype, error)
+  CALL CHECK(" H5Tcopy_f", error, total_error)
+
+  ! Set order of dataset datatype
+  CALL H5Tset_order_f(datatype, H5T_ORDER_BE_F, error)
+  CALL CHECK(" H5Tset_order_f", error, total_error)
+
+  ! Create the data space for the dataset
+  CALL H5Screate_simple_f(2, dims, space, error)
+  CALL CHECK(" H5Screate_simple_f", error, total_error)
+
+  ! Create the dataset property list  
+  CALL H5Pcreate_f(H5P_DATASET_CREATE_F, dc, error)
+  CALL CHECK(" H5Pcreate_f", error, total_error)
+
+  ! Set fill value 
+  fillval = 10000
+  CALL H5Pset_fill_value_f(dc, H5T_NATIVE_INTEGER, fillval, error)
+  CALL CHECK(" H5Pset_fill_value_f", error, total_error)
+
+  ! Set up to use scaleoffset filter, let library calculate minbits
+  CALL H5Pset_chunk_f(dc, 2, chunk_dim, error)
+  CALL CHECK(" H5Pset_chunk_f", error, total_error)
+  
+  CALL H5Pset_scaleoffset_f(dc, H5Z_SO_INT_F, H5Z_SO_INT_MINBITS_DEFAULT_F, error)
+  CALL CHECK(" H5Pset_scaleoffset_f", error, total_error)
+  
+  ! Create the dataset
+  CALL H5Dcreate_f(file, "scaleoffset_int", datatype, &
+       space, dataset, error, dc)
+  CALL CHECK(" H5Dcreate_f", error, total_error)
+
+  ! Create the memory data space
+  CALL H5Screate_simple_f(2, dims, mspace, error)
+  CALL CHECK(" H5Screate_simple_f", error, total_error)
+
+  ! Select hyperslab for data to write, using 1x5 blocks,
+  ! (1,1) stride and (1,1) count starting at the position (0,0)
+     
+  start(1:2) = (/0,0/)
+  stride(1:2) = (/1,1/)
+  COUNT(1:2) = (/1,1/)
+  BLOCK(1:2) = (/1,5/)
+
+  CALL H5Sselect_hyperslab_f(mspace, H5S_SELECT_SET_F, start, &
+       count, error, stride, BLOCK)
+  CALL CHECK(" H5Sselect_hyperslab_f", error, total_error)
+
+  CALL RANDOM_SEED()
+  ! Initialize data of hyperslab
+  DO j = 1, INT(dims(2))
+     CALL RANDOM_NUMBER(x)
+     orig_data(1,j) = INT(x*10000.)
+     IF(MOD(j,2_size_t).EQ.0)THEN
+        orig_data(1,j) = - orig_data(1,j)
+     ENDIF
+  ENDDO
+
+  !----------------------------------------------------------------------
+  ! STEP 1: Test scaleoffset by setting up a chunked dataset and writing
+  ! to it.
+  !----------------------------------------------------------------------
+  
+  ! Only data in the hyperslab will be written, other value should be fill value 
+  CALL H5Dwrite_f(dataset, H5T_NATIVE_INTEGER, orig_data, dims, error, mspace, mspace, H5P_DEFAULT_F)
+  CALL CHECK(" H5Dwrite_f", error, total_error)
+
+  !----------------------------------------------------------------------
+  ! STEP 2: Try to read the data we just wrote.
+  !----------------------------------------------------------------------
+     
+  ! Read the dataset back
+  
+  CALL H5Dread_f(dataset, H5T_NATIVE_INTEGER, new_data, dims, error, mspace, mspace, H5P_DEFAULT_F)
+  CALL CHECK(" H5Dread_f", error, total_error)
+
+  ! Check that the values read are the same as the values written 
+  DO j = 1, INT(dims(2))
+     IF(new_data(1,j) .NE. orig_data(1,j))THEN
+        total_error = total_error + 1
+        WRITE(*,'("    Read different values than written.")')
+        WRITE(*,'("    At index ", 2(1X,I0))') 1, j
+        EXIT
+     ENDIF
+  ENDDO
+  !----------------------------------------------------------------------
+  ! Cleanup
+  !----------------------------------------------------------------------
+  CALL H5Tclose_f(datatype, error)
+  CALL CHECK(" H5Tclose_f", error, total_error)
+  CALL H5Pclose_f(dc, error)
+  CALL CHECK(" H5Pclose_f", error, total_error)
+  CALL H5Sclose_f(space, error)
+  CALL CHECK(" H5Sclose_f", error, total_error)
+  CALL H5Dclose_f(dataset, error)
+  CALL CHECK(" H5Dclose_f", error, total_error)
+  CALL H5Fclose_f(file, error)
+  CALL CHECK(" H5Fclose_f", error, total_error)
+
+  IF(cleanup) CALL h5_cleanup_f("h5scaleoffset", H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+
+END SUBROUTINE test_scaleoffset
+
+END MODULE TH5MISC_1_8
diff --git a/fortran/test/tH5MISC_1_8.f90 b/fortran/test/tH5MISC_1_8.f90
deleted file mode 100644
index efaf594..0000000
--- a/fortran/test/tH5MISC_1_8.f90
+++ /dev/null
@@ -1,474 +0,0 @@
-!****h* root/fortran/test/tH5MISC_1_8.f90
-!
-! NAME
-!  tH5MISC_1_8.f90
-!
-! FUNCTION
-!  Basic testing of Fortran API's introduced in 1.8 release.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!*****
-MODULE TH5MISC_1_8
-
-CONTAINS
-
-SUBROUTINE dtransform(cleanup, total_error)
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-
-  IMPLICIT NONE
-  LOGICAL, INTENT(IN)  :: cleanup
-  INTEGER, INTENT(INOUT) :: total_error
-
-  INTEGER(HID_T) :: dxpl_id_c_to_f
-  INTEGER(HID_T) :: file_id
-
-  CHARACTER(LEN=15), PARAMETER :: c_to_f = "(9/5.0)*x + 123"
-  INTEGER :: error
-  CHARACTER(LEN=15) :: ptrgetTest
-  CHARACTER(LEN=7) :: ptrgetTest_small
-  CHARACTER(LEN=30) :: ptrgetTest_big
-
-  INTEGER(SIZE_T) :: size
-
-  CALL H5Fcreate_f("dtransform.h5", H5F_ACC_TRUNC_F, file_id, error)
-  CALL check("dtransform.H5Fcreate_f", error, total_error)
-
-  CALL H5Pcreate_f(H5P_DATASET_XFER_F, dxpl_id_c_to_f, error)
-  CALL check("dtransform.H5Pcreate_f", error, total_error)
-
-  CALL H5Pset_data_transform_f(dxpl_id_c_to_f, c_to_f, error)
-  CALL check("dtransform.H5Pset_data_transform_f", error, total_error)
-
-  CALL H5Pget_data_transform_f(dxpl_id_c_to_f, ptrgetTest, error, size=size)
-  CALL check("dtransform.H5Pget_data_transform_f",  error, total_error)
-  CALL VerifyString("dtransform.H5Pget_data_transform_f", c_to_f, ptrgetTest, total_error)
-  CALL VERIFY("dtransform.H5Pget_data_transform_f", INT(size),15, total_error)
-
-! check case when receiving buffer to small
-
-  CALL H5Pget_data_transform_f(dxpl_id_c_to_f, ptrgetTest_small, error, size=size)
-  CALL check("dtransform.H5Pget_data_transform_f",  error, total_error)
-  CALL VerifyString("dtransform.H5Pget_data_transform_f", c_to_f(1:7), ptrgetTest_small, total_error)
-  CALL VERIFY("dtransform.H5Pget_data_transform_f", INT(size),15, total_error)
-
-! check case when receiving buffer to big
-
-  CALL H5Pget_data_transform_f(dxpl_id_c_to_f, ptrgetTest_big, error, size=size)
-  CALL check("dtransform.H5Pget_data_transform_f",  error, total_error)
-  CALL VerifyString("dtransform.H5Pget_data_transform_f", c_to_f(1:15), ptrgetTest_big(1:15), total_error)
-  CALL VERIFY("dtransform.H5Pget_data_transform_f", INT(size), 15, total_error)
-
-  CALL H5Fclose_f(file_id, error)
-  CALL check("H5Fclose_f", error, total_error)
-
-  IF(cleanup) CALL h5_cleanup_f("dtransform", H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-
-END SUBROUTINE dtransform
-
-
-!***************************************************************
-!**
-!**  test_genprop_basic_class(): Test basic generic property list code.
-!**      Tests creating new generic classes.
-!**
-!***************************************************************
-
-SUBROUTINE test_genprop_basic_class(total_error)
-
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-
-  IMPLICIT NONE
-  INTEGER, INTENT(INOUT) :: total_error
-
-  INTEGER(HID_T) :: cid1    ! Generic Property class ID 
-  INTEGER(HID_T) :: cid2    ! Generic Property class ID 
-
-  CHARACTER(LEN=7) :: CLASS1_NAME = "Class 1"
-  CHARACTER(LEN=7)  :: name              !  Name of class 
-  CHARACTER(LEN=10) :: name_big          !  Name of class bigger buffer 
-  CHARACTER(LEN=4)  :: name_small        !  Name of class smaller buffer
-  INTEGER :: error
-  INTEGER :: size
-  LOGICAL :: flag
-
-  ! Output message about test being performed 
-
-  !WRITE(*,*) "Testing Basic Generic Property List Class Creation Functionality"
-
-  ! Try some bogus value for class identifier; function should fail gracefully
-
-  cid1 = 456
-  CALL H5Pget_class_name_f(cid1, name, size, error)
-  CALL VERIFY("H5Pget_class_name", error, -1, error)
-
-  !  Create a new generic class, derived from the root of the class hierarchy 
-  CALL H5Pcreate_class_f(H5P_ROOT_F, CLASS1_NAME, cid1, error)
-  CALL check("H5Pcreate_class", error, total_error)
-
-  !  Check class name 
-  CALL H5Pget_class_name_f(cid1, name, size, error)
-  CALL check("H5Pget_class_name", error, total_error)
-  CALL VERIFY("H5Pget_class_name", size,7,error)
-  CALL verifystring("H5Pget_class_name", name, CLASS1_NAME, error)
-  IF(error.NE.0)THEN
-     WRITE(*,*) 'Class names do not match! name=',name, 'CLASS1_NAME=',CLASS1_NAME
-     total_error = total_error + 1
-  ENDIF
-
-  !  Check class name smaller buffer
-  CALL H5Pget_class_name_f(cid1, name_small, size, error)
-  CALL check("H5Pget_class_name", error, total_error)
-  CALL VERIFY("H5Pget_class_name", size,7,error)
-  CALL verifystring("H5Pget_class_name", name_small(1:4), CLASS1_NAME(1:4), error)
-  IF(error.NE.0)THEN
-     WRITE(*,*) 'Class names do not match! name=',name_small(1:4), 'CLASS1_NAME=',CLASS1_NAME(1:4)
-     total_error = total_error + 1
-  ENDIF
-
-  !  Check class name bigger buffer
-  CALL H5Pget_class_name_f(cid1, name_big, size, error)
-  CALL check("H5Pget_class_name", error, total_error)
-  CALL VERIFY("H5Pget_class_name", size,7,error)
-  CALL verifystring("H5Pget_class_name", TRIM(name_big), TRIM(CLASS1_NAME), error)
-  IF(error.NE.0)THEN
-     WRITE(*,*) 'Class names do not match! name=',TRIM(name_small), 'CLASS1_NAME=',TRIM(CLASS1_NAME)
-     total_error = total_error + 1
-  ENDIF
-
-  !  Check class parent 
-  CALL H5Pget_class_parent_f(cid1, cid2, error)
-  CALL check("H5Pget_class_parent_f", error, total_error)
-
-  !  Verify class parent correct 
-  CALL H5Pequal_f(cid2, H5P_ROOT_F, flag, error)
-  CALL check("H5Pequal_f", error, total_error)
-  CALL verifylogical("H5Pequal_f", flag, .TRUE., total_error)
-
-
-  !  Make certain false postives aren't being returned 
-  CALL H5Pequal_f(cid2, H5P_FILE_CREATE_F, flag, error)
-  CALL check("H5Pequal_f", error, total_error)
-  CALL verifylogical("H5Pequal_f", flag, .FALSE., total_error)
-
-  ! Close parent class 
-  CALL H5Pclose_class_f(cid2, error)
-  CALL check("H5Pclose_class_f", error, total_error)
-
-
-  ! Close class 
-  CALL H5Pclose_class_f(cid1, error)
-  CALL check("H5Pclose_class_f", error, total_error)
-
-END SUBROUTINE test_genprop_basic_class
-
-SUBROUTINE test_h5s_encode(total_error)
-
-!***************************************************************
-!**
-!**  test_h5s_encode(): Test H5S (dataspace) encoding and decoding.
-!**
-!***************************************************************
-
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-  IMPLICIT NONE
-  INTEGER, INTENT(INOUT) :: total_error
-
-  INTEGER(hid_t) :: sid1, sid3!	 Dataspace ID		
-  INTEGER(hid_t) :: decoded_sid1, decoded_sid3
-  INTEGER :: rank    ! LOGICAL rank of dataspace	
-  INTEGER(size_t) :: sbuf_size=0, scalar_size=0
-
-! Make sure the size is large
-  CHARACTER(LEN=288) :: sbuf
-  CHARACTER(LEN=288) :: scalar_buf
-
-  INTEGER(hsize_t) :: n !  Number of dataspace elements 
-
-  INTEGER(hsize_t), DIMENSION(1:3) :: start = (/0, 0, 0/)
-  INTEGER(hsize_t), DIMENSION(1:3) :: stride = (/2, 5, 3/)
-  INTEGER(hsize_t), DIMENSION(1:3) :: count = (/2, 2, 2/)
-  INTEGER(hsize_t), DIMENSION(1:3) :: BLOCK = (/1, 3, 1/)
-
-  INTEGER :: space_type
-  !
-  ! Dataset dimensions
-  !
-  INTEGER, PARAMETER :: SPACE1_DIM1= 3,  SPACE1_DIM2=15, SPACE1_DIM3=13
-
-  INTEGER(HSIZE_T), DIMENSION(1:3) :: dims1 = (/SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3/)
-  INTEGER :: SPACE1_RANK = 3
-  INTEGER :: error
-
-  !-------------------------------------------------------------------------
-  ! * Test encoding and decoding of simple dataspace and hyperslab selection.
-  ! *-------------------------------------------------------------------------
-  ! 
-
-  CALL H5Screate_simple_f(SPACE1_RANK, dims1, sid1, error)
-  CALL check("H5Screate_simple", error, total_error)
-
-  CALL h5sselect_hyperslab_f(sid1, H5S_SELECT_SET_F, &
-       start, count, error, stride=stride, BLOCK=BLOCK)
-  CALL check("h5sselect_hyperslab_f", error, total_error)
-
-
-  ! Encode simple data space in a buffer 
-
-  !         First find the buffer size
-  CALL H5Sencode_f(sid1, sbuf, sbuf_size, error)
-  CALL check("H5Sencode", error, total_error)
-
-
-  !  Try decoding bogus buffer 
-
-  CALL H5Sdecode_f(sbuf, decoded_sid1, error)
-  CALL VERIFY("H5Sdecode", error, -1, total_error)
-
-  CALL H5Sencode_f(sid1, sbuf, sbuf_size, error)
-  CALL check("H5Sencode", error, total_error)
-
-  !  Decode from the dataspace buffer and return an object handle 
-  CALL H5Sdecode_f(sbuf, decoded_sid1, error)
-  CALL check("H5Sdecode", error, total_error)
-
-
-  !  Verify the decoded dataspace 
-  CALL h5sget_simple_extent_npoints_f(decoded_sid1, n, error)
-  CALL check("h5sget_simple_extent_npoints_f", error, total_error)
-  CALL VERIFY("h5sget_simple_extent_npoints_f", INT(n), INT(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3), &
-       total_error)
-
-  !
-  !Close the dataspace for the dataset.
-  !
-  CALL h5sclose_f(sid1, error)
-  CALL check("h5sclose_f", error, total_error)
-
-  CALL h5sclose_f(decoded_sid1, error)
-  CALL check("h5sclose_f", error, total_error)
-
-  ! -------------------------------------------------------------------------
-  !  * Test encoding and decoding of scalar dataspace.
-  !  *-------------------------------------------------------------------------
-  !  
-  !  Create scalar dataspace 
-
-  CALL H5Screate_f(H5S_SCALAR_F, sid3, error)
-  CALL check("H5Screate_f",error, total_error)
-
-  !  Encode scalar data space in a buffer 
-
-  !        First find the buffer size
-  CALL H5Sencode_f(sid3, scalar_buf, scalar_size, error)
-  CALL check("H5Sencode_f", error, total_error)
-
-  ! encode
-
-  CALL H5Sencode_f(sid3, scalar_buf, scalar_size, error)
-  CALL check("H5Sencode_f", error, total_error)
-
-
-  !  Decode from the dataspace buffer and return an object handle 
-
-  CALL H5Sdecode_f(scalar_buf, decoded_sid3, error)
-  CALL check("H5Sdecode_f", error, total_error)
-
-
-  !  Verify extent type 
-
-  CALL H5Sget_simple_extent_type_f(decoded_sid3, space_type, error)
-  CALL check("H5Sget_simple_extent_type_f", error, total_error)
-  CALL VERIFY("H5Sget_simple_extent_type_f", space_type, H5S_SCALAR_F, total_error)
-
-  !  Verify decoded dataspace 
-  CALL h5sget_simple_extent_npoints_f(decoded_sid3, n, error)
-  CALL check("h5sget_simple_extent_npoints_f", error, total_error)
-  CALL VERIFY("h5sget_simple_extent_npoints_f", INT(n), 1, total_error)
-
-  CALL H5Sget_simple_extent_ndims_f(decoded_sid3, rank, error)
-  CALL CHECK("H5Sget_simple_extent_ndims_f", error, total_error)
-  CALL VERIFY("H5Sget_simple_extent_ndims_f", rank, 0, total_error )
-
-  CALL h5sclose_f(sid3, error)
-  CALL check("h5sclose_f", error, total_error)
-
-  CALL h5sclose_f(decoded_sid3, error)
-  CALL check("h5sclose_f", error, total_error)
-
-END SUBROUTINE test_h5s_encode
-
-!-------------------------------------------------------------------------
-! Function:    test_scaleoffset
-!
-! Purpose:     Tests the integer datatype for scaleoffset filter
-!              with fill value set
-!
-! Return:      Success:        0
-!              Failure:        >0
-!
-! Programmer:  M. Scot Breitenfeld
-!              Decemeber 11, 2010
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-!
-
-SUBROUTINE test_scaleoffset(cleanup, total_error )
-
-  USE HDF5
-  USE TH5_MISC
-  IMPLICIT NONE
-  LOGICAL, INTENT(IN)  :: cleanup
-  INTEGER, INTENT(INOUT) :: total_error
-  INTEGER(hid_t) :: file
-
-  INTEGER(hid_t)   :: dataset, datatype, space, mspace, dc
-  INTEGER(hsize_t), DIMENSION(1:2) :: dims = (/2, 5/)
-  INTEGER(hsize_t), DIMENSION(1:2) :: chunk_dim = (/2, 5/)
-  INTEGER, DIMENSION(1:2,1:5) :: orig_data
-  INTEGER, DIMENSION(1:2,1:5) :: new_data
-  INTEGER(hsize_t), DIMENSION(1:2) :: start  ! Start of hyperslab 
-  INTEGER(hsize_t), DIMENSION(1:2) :: stride ! Stride of hyperslab
-  INTEGER(hsize_t), DIMENSION(1:2) :: count  ! BLOCK count
-  INTEGER(hsize_t), DIMENSION(1:2) :: BLOCK  ! BLOCK sizes
-  INTEGER :: fillval
-  INTEGER(size_t) :: j
-  REAL :: x
-  INTEGER :: error
-  LOGICAL :: status
-
-  ! check to see if filter is available
-  CALL H5Zfilter_avail_f(H5Z_FILTER_SCALEOFFSET_F, status, error)
-  IF(.NOT.status)THEN ! We don't have H5Z_FILTER_SCALEOFFSET_F filter
-     total_error = -1       ! so return
-     RETURN
-  ENDIF
-
-  CALL H5Fcreate_f("h5scaleoffset.h5", H5F_ACC_TRUNC_F, file, error)
-  CALL check("H5Fcreate_f", error, total_error)
-
-  CALL H5Tcopy_f(H5T_NATIVE_INTEGER, datatype, error)
-  CALL CHECK(" H5Tcopy_f", error, total_error)
-
-  ! Set order of dataset datatype
-  CALL H5Tset_order_f(datatype, H5T_ORDER_BE_F, error)
-  CALL CHECK(" H5Tset_order_f", error, total_error)
-
-  ! Create the data space for the dataset
-  CALL H5Screate_simple_f(2, dims, space, error)
-  CALL CHECK(" H5Screate_simple_f", error, total_error)
-
-  ! Create the dataset property list  
-  CALL H5Pcreate_f(H5P_DATASET_CREATE_F, dc, error)
-  CALL CHECK(" H5Pcreate_f", error, total_error)
-
-  ! Set fill value 
-  fillval = 10000
-  CALL H5Pset_fill_value_f(dc, H5T_NATIVE_INTEGER, fillval, error)
-  CALL CHECK(" H5Pset_fill_value_f", error, total_error)
-
-  ! Set up to use scaleoffset filter, let library calculate minbits
-  CALL H5Pset_chunk_f(dc, 2, chunk_dim, error)
-  CALL CHECK(" H5Pset_chunk_f", error, total_error)
-  
-  CALL H5Pset_scaleoffset_f(dc, H5Z_SO_INT_F, H5Z_SO_INT_MINBITS_DEFAULT_F, error)
-  CALL CHECK(" H5Pset_scaleoffset_f", error, total_error)
-  
-  ! Create the dataset
-  CALL H5Dcreate_f(file, "scaleoffset_int", datatype, &
-       space, dataset, error, dc)
-  CALL CHECK(" H5Dcreate_f", error, total_error)
-
-  ! Create the memory data space
-  CALL H5Screate_simple_f(2, dims, mspace, error)
-  CALL CHECK(" H5Screate_simple_f", error, total_error)
-
-  ! Select hyperslab for data to write, using 1x5 blocks,
-  ! (1,1) stride and (1,1) count starting at the position (0,0)
-     
-  start(1:2) = (/0,0/)
-  stride(1:2) = (/1,1/)
-  COUNT(1:2) = (/1,1/)
-  BLOCK(1:2) = (/1,5/)
-
-  CALL H5Sselect_hyperslab_f(mspace, H5S_SELECT_SET_F, start, &
-       count, error, stride, BLOCK)
-  CALL CHECK(" H5Sselect_hyperslab_f", error, total_error)
-
-  CALL RANDOM_SEED()
-  ! Initialize data of hyperslab
-  DO j = 1, INT(dims(2))
-     CALL RANDOM_NUMBER(x)
-     orig_data(1,j) = INT(x*10000.)
-     IF(MOD(j,2_size_t).EQ.0)THEN
-        orig_data(1,j) = - orig_data(1,j)
-     ENDIF
-  ENDDO
-
-  !----------------------------------------------------------------------
-  ! STEP 1: Test scaleoffset by setting up a chunked dataset and writing
-  ! to it.
-  !----------------------------------------------------------------------
-  
-  ! Only data in the hyperslab will be written, other value should be fill value 
-  CALL H5Dwrite_f(dataset, H5T_NATIVE_INTEGER, orig_data, dims, error, mspace, mspace, H5P_DEFAULT_F)
-  CALL CHECK(" H5Dwrite_f", error, total_error)
-
-  !----------------------------------------------------------------------
-  ! STEP 2: Try to read the data we just wrote.
-  !----------------------------------------------------------------------
-     
-  ! Read the dataset back
-  
-  CALL H5Dread_f(dataset, H5T_NATIVE_INTEGER, new_data, dims, error, mspace, mspace, H5P_DEFAULT_F)
-  CALL CHECK(" H5Dread_f", error, total_error)
-
-  ! Check that the values read are the same as the values written 
-  DO j = 1, INT(dims(2))
-     IF(new_data(1,j) .NE. orig_data(1,j))THEN
-        total_error = total_error + 1
-        WRITE(*,'("    Read different values than written.")')
-        WRITE(*,'("    At index ", 2(1X,I0))') 1, j
-        EXIT
-     ENDIF
-  ENDDO
-  !----------------------------------------------------------------------
-  ! Cleanup
-  !----------------------------------------------------------------------
-  CALL H5Tclose_f(datatype, error)
-  CALL CHECK(" H5Tclose_f", error, total_error)
-  CALL H5Pclose_f(dc, error)
-  CALL CHECK(" H5Pclose_f", error, total_error)
-  CALL H5Sclose_f(space, error)
-  CALL CHECK(" H5Sclose_f", error, total_error)
-  CALL H5Dclose_f(dataset, error)
-  CALL CHECK(" H5Dclose_f", error, total_error)
-  CALL H5Fclose_f(file, error)
-  CALL CHECK(" H5Fclose_f", error, total_error)
-
-  IF(cleanup) CALL h5_cleanup_f("h5scaleoffset", H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-
-END SUBROUTINE test_scaleoffset
-
-END MODULE TH5MISC_1_8
diff --git a/fortran/test/tH5O.F90 b/fortran/test/tH5O.F90
new file mode 100644
index 0000000..51e1d64
--- /dev/null
+++ b/fortran/test/tH5O.F90
@@ -0,0 +1,793 @@
+!****h* root/fortran/test/tH5O.f90
+!
+! NAME
+!  tH5O.f90
+!
+! FUNCTION
+!  Basic testing of Fortran H5O APIs.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! CONTAINS SUBROUTINES
+!  test_h5o, test_h5o_link, test_h5o_plist
+!
+!*****
+MODULE TH5O
+
+  USE HDF5 ! This module contains all necessary modules
+  USE TH5_MISC
+  USE TH5_MISC_GEN
+
+CONTAINS
+
+SUBROUTINE test_h5o(cleanup, total_error)
+
+  IMPLICIT NONE
+  LOGICAL, INTENT(IN)  :: cleanup
+  INTEGER, INTENT(INOUT) :: total_error
+  INTEGER :: error
+
+  CALL test_h5o_plist(total_error) ! Test object creation properties
+  CALL test_h5o_link(total_error) ! Test object link routine
+
+  IF(cleanup) CALL h5_cleanup_f("TestFile", H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+  IF(cleanup) CALL h5_cleanup_f("test", H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+
+END SUBROUTINE test_h5o
+
+!***************************************************************
+!**
+!**  test_h5o_link: Test creating link to object
+!**
+!***************************************************************
+
+SUBROUTINE test_h5o_link(total_error)
+
+  IMPLICIT NONE
+  INTEGER, INTENT(INOUT) :: total_error
+
+  INTEGER(HID_T) :: file_id
+  INTEGER(HID_T) :: group_id
+  INTEGER(HID_T) :: space_id
+  INTEGER(HID_T) :: dset_id
+  INTEGER(HID_T) :: type_id
+  INTEGER(HID_T) :: fapl_id
+  INTEGER(HID_T) :: lcpl_id
+  INTEGER(HID_T) :: ocpypl_id
+  CHARACTER(LEN=11), PARAMETER :: TEST_FILENAME = 'TestFile.h5'
+  INTEGER, PARAMETER :: TEST6_DIM1 = 2, TEST6_DIM2 = 5
+!EP  INTEGER(HSIZE_T), DIMENSION(1:2), PARAMETER :: dims = (/TEST6_DIM1,TEST6_DIM2/)
+  INTEGER(HSIZE_T), DIMENSION(1:2)  :: dims = (/TEST6_DIM1,TEST6_DIM2/)
+!EP  INTEGER, DIMENSION(1:TEST6_DIM1,1:TEST6_DIM2) :: wdata, rdata
+  INTEGER, DIMENSION(TEST6_DIM1,TEST6_DIM2) :: wdata, rdata
+
+  INTEGER, PARAMETER :: TRUE = 1
+
+  LOGICAL :: committed !  Whether the named datatype is committed 
+
+  INTEGER :: i, j
+  INTEGER ::  error  !  Value returned from API calls 
+
+  CHARACTER(LEN=14) :: NAME_DATATYPE_SIMPLE="H5T_NATIVE_INT"
+  CHARACTER(LEN=16) :: NAME_DATATYPE_SIMPLE2="H5T_NATIVE_INT-2"
+  INTEGER(HID_T) :: tid, tid2
+  LOGICAL :: flag
+  
+  ! Data for tested h5ocopy_f
+  CHARACTER(LEN=3) , PARAMETER :: dataset = "DS1"
+  INTEGER          , PARAMETER :: dim0     = 4
+
+  INTEGER(HSIZE_T), DIMENSION(1:1)    :: dims2 = (/dim0/) ! size read/write buffer
+  INTEGER         , DIMENSION(1:dim0) :: wdata2   ! Write buffer 
+  LOGICAL :: link_exists
+  CHARACTER(LEN=8)  :: chr_exact
+  CHARACTER(LEN=10) :: chr_lg
+  INTEGER(size_t) :: nlinks
+  INTEGER(HID_T) :: plist = -1
+
+  CHARACTER(LEN=20) :: dset_comment = "dataset comment"
+  CHARACTER(LEN=13) :: grp_comment = "group comment"
+  CHARACTER(LEN=10) :: comment_sm ! to small comment sized buffer
+  CHARACTER(LEN=15) :: comment ! exact comment sized buffer
+  CHARACTER(LEN=20) :: comment_lg ! large comment sized buffer
+  INTEGER(HSSIZE_T) :: comment_size
+  INTEGER(SIZE_T)   :: comment_size2
+
+  !  Initialize the raw data 
+  DO i = 1, TEST6_DIM1
+     DO j = 1, TEST6_DIM2
+        wdata(i,j) = i*j
+     ENDDO
+  ENDDO
+
+  !  Create the dataspace 
+  CALL h5screate_simple_f(2, dims, space_id, error)
+  CALL check("h5screate_simple_f",error,total_error)
+
+  !  Create LCPL with intermediate group creation flag set 
+  CALL H5Pcreate_f(H5P_LINK_CREATE_F, lcpl_id, error)
+  CALL check("h5Pcreate_f",error,total_error)
+
+  CALL H5Pset_create_inter_group_f(lcpl_id, TRUE, error)
+  CALL check("H5Pset_create_inter_group_f",error,total_error)
+
+  !  Loop over using new group format 
+  ! for(new_format = FALSE; new_format <= TRUE; new_format++) {
+
+  ! Make a FAPL that uses the "use the latest version of the format" bounds 
+  CALL H5Pcreate_f(H5P_FILE_ACCESS_F,fapl_id,error)
+  CALL check("h5Pcreate_f",error,total_error)
+
+  !  Set the "use the latest version of the format" bounds for creating objects in the file 
+
+  CALL H5Pset_libver_bounds_f(fapl_id, H5F_LIBVER_LATEST_F, H5F_LIBVER_LATEST_F, error)
+  CALL check("H5Pset_libver_bounds_f",error, total_error)
+
+  !  Create a new HDF5 file 
+  CALL H5Fcreate_f(TEST_FILENAME, H5F_ACC_TRUNC_F, file_id, error, H5P_DEFAULT_F, fapl_id)
+  CALL check("H5Fcreate_f", error, total_error)
+
+  !  Close the FAPL 
+  CALL h5pclose_f(fapl_id, error)
+  CALL check("h5pclose_f",error,total_error)
+
+  !  Create and commit a datatype with no name 
+  CALL H5Tcopy_f( H5T_NATIVE_INTEGER, type_id, error)
+  CALL check("H5Tcopy_F",error,total_error)
+
+  CALL H5Tcommit_anon_f(file_id, type_id, error) ! using no optional parameters
+  CALL check("H5Tcommit_anon_F",error,total_error)
+
+  CALL H5Tcommitted_f(type_id, committed, error)
+  CALL check("H5Tcommitted_f",error,total_error)
+  CALL verify("H5Tcommitted_f", committed, .TRUE., total_error)
+
+  !  Create a dataset with no name using the committed datatype
+  CALL H5Dcreate_anon_f(file_id, type_id, space_id, dset_id, error ) ! using no optional parameters
+  CALL check("H5Dcreate_anon_f",error,total_error)
+  !
+  !  Verify that we can write to and read from the dataset 
+  !
+  !  Write the data to the dataset 
+
+!EP  CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, wdata, dims, error, &
+!EP         mem_space_id=H5S_ALL_F, file_space_id=H5S_ALL_F, xfer_prp = H5P_DEFAULT_F)
+  CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, wdata, dims, error)
+  CALL check("h5dwrite_f", error, total_error)
+
+  !  Read the data back 
+!EP  CALL h5dread_f(dset_id, H5T_NATIVE_INTEGER, rdata, dims, error, &
+!EP       mem_space_id=H5S_ALL_F, file_space_id=H5S_ALL_F, xfer_prp = H5P_DEFAULT_F)
+  CALL h5dread_f(dset_id, H5T_NATIVE_INTEGER, rdata, dims, error)
+  CALL check("h5dread_f", error, total_error)
+
+  !  Verify the data 
+  DO i = 1, TEST6_DIM1
+     DO j = 1, TEST6_DIM2
+        CALL verify("H5Dread_f",wdata(i,j),rdata(i,j),total_error)
+        wdata(i,j) = i*j
+     ENDDO
+  ENDDO
+
+  !  Create a group with no name
+
+  CALL H5Gcreate_anon_f(file_id, group_id, error)
+  CALL check("H5Gcreate_anon", error, total_error)
+
+  !  Link nameless datatype into nameless group 
+  CALL H5Olink_f(type_id, group_id, "datatype", error, H5P_DEFAULT_F)
+  CALL check("H5Olink_f", error, total_error)
+
+  !  Link nameless dataset into nameless group with intermediate group 
+  CALL H5Olink_f(dset_id, group_id, "inter_group/dataset", error, lcpl_id, H5P_DEFAULT_F)
+  CALL check("H5Olink_f", error, total_error)
+
+  !  Close IDs for dataset and datatype 
+  CALL h5dclose_f(dset_id, error)
+  CALL check("h5dclose_f", error, total_error)
+  CALL h5tclose_f(type_id, error)
+  CALL check("h5tclose_f", error, total_error)
+
+  !  Re-open datatype using new link 
+  CALL H5Topen_f(group_id, "datatype", type_id, error)
+  CALL check("h5topen_f", error, total_error)
+
+  !  Link nameless group to root group and close the group ID
+  CALL H5Olink_f(group_id, file_id, "/group", error)
+  CALL check("H5Olink_f", error, total_error)
+
+  CALL h5gclose_f(group_id, error)
+  CALL check("h5gclose_f",error,total_error)
+
+  !  Open dataset through root group and verify its data 
+  CALL H5Dopen_f(file_id, "/group/inter_group/dataset", dset_id, error)
+  CALL check("test_lcpl.h5dopen_f", error, total_error)
+
+  !  Read data from dataset 
+!EP  CALL h5dread_f(dset_id, H5T_NATIVE_INTEGER, rdata, dims, error, &
+!EP       H5S_ALL_F, H5S_ALL_F, xfer_prp = H5P_DEFAULT_F)
+  CALL h5dread_f(dset_id, H5T_NATIVE_INTEGER, rdata, dims, error)
+  CALL check("h5dread_f", error, total_error)
+
+  !  Verify the data 
+  DO i = 1, TEST6_DIM1
+     DO j = 1, TEST6_DIM2
+        CALL verify("H5Dread",wdata(i,j),rdata(i,j),total_error)
+     ENDDO
+  ENDDO
+  !  Close open IDs 
+
+  CALL h5dclose_f(dset_id, error)
+  CALL check("h5dclose_f",error,total_error)
+  CALL h5tclose_f(type_id, error)
+  CALL check("h5tclose_f",error,total_error)
+
+  !  Close remaining IDs 
+  CALL h5sclose_f(space_id, error)
+  CALL check("h5sclose_f",error,total_error)
+  CALL h5pclose_f(lcpl_id,error)
+  CALL check("h5pclose_f", error, total_error)
+
+  ! *********************
+  !    CHECK H5OCOPY_F
+  ! *********************
+
+  DO i = 1, dim0
+     wdata2(i) = i-1
+  ENDDO
+  !
+  ! Create dataspace.  Setting size to be the current size.
+  !
+  CALL h5screate_simple_f(1, dims2, space_id, error)
+  CALL check("h5screate_simple_f", error, total_error)
+  !
+  ! Create intermediate groups
+  !
+  CALL h5gcreate_f(file_id,"/G1",group_id,error)
+  CALL check("h5gcreate_f", error, total_error)
+  CALL h5gcreate_f(file_id,"/G1/G2",group_id,error)
+  CALL check("h5gcreate_f", error, total_error)
+  CALL h5gcreate_f(file_id,"/G1/G2/G3",group_id,error)
+  CALL check("h5gcreate_f", error, total_error)
+
+  ! Try putting a comment on the group /G1/G2/G3 by name
+  CALL h5oset_comment_by_name_f(file_id, "/G1/G2/G3", grp_comment, error)
+  CALL check("h5oset_comment_by_name_f", error, total_error)
+
+  comment_lg = ' '
+
+  CALL h5oget_comment_by_name_f(file_id, "/G1/G2/G3", comment_lg, error) 
+  CALL check("h5oget_comment_by_name_f", error, total_error)
+
+  IF(comment_lg(1:13).NE.grp_comment)THEN
+     CALL check("h5oget_comment_by_name_f", -1, total_error)
+  ENDIF
+  IF(comment_lg(14:20).NE.'       ')THEN ! make sure no NULL terminator
+     CALL check("h5oget_comment_by_name_f", -1, total_error)
+  ENDIF
+
+  ! Try putting a comment on the group /G1/G2/G3 by name with trailing blanks
+
+  CALL h5oset_comment_by_name_f(file_id, "/G1/G2/G3"//'  ', grp_comment, error)
+  CALL check("h5oset_comment_by_name_f", error, total_error)
+
+  comment_lg = ' '
+
+  CALL h5oget_comment_by_name_f(file_id, "/G1/G2/G3"//'  ', comment_lg, error) 
+  CALL check("h5oget_comment_by_name_f", error, total_error)
+
+  IF(comment_lg(1:13).NE.grp_comment)THEN
+     CALL check("h5oget_comment_by_name_f", -1, total_error)
+  ENDIF
+  IF(comment_lg(14:20).NE.'       ')THEN ! make sure no NULL terminator
+     CALL check("h5oget_comment_by_name_f", -1, total_error)
+  ENDIF
+
+  !
+  ! Create the dataset
+  !
+  CALL h5dcreate_f(group_id, dataset, H5T_STD_I32LE, space_id, dset_id, error)
+  CALL check("h5dcreate_f", error, total_error)
+
+  ! Putting a comment on the dataset
+  CALL h5oset_comment_f(dset_id, dset_comment, error)
+  CALL check("h5oset_comment_f", error, total_error)
+
+  ! Try reading into a buffer that is the correct size
+
+  CALL h5oget_comment_f(dset_id, comment, error) 
+  CALL check("h5oget_comment_f", error, total_error)
+
+  IF(comment(1:15).NE.dset_comment(1:15))THEN
+     CALL check("h5oget_comment_f", -1, total_error)
+  ENDIF
+
+  ! Try reading into a buffer that is to small
+
+  CALL h5oget_comment_f(dset_id, comment_sm, error) 
+  CALL check("h5oget_comment_f", error, total_error)
+
+  IF(comment_sm(1:10).NE.dset_comment(1:10))THEN
+     CALL check("h5oget_comment_f", -1, total_error)
+  ENDIF 
+
+ ! Try reading into a buffer that is larger then needed
+
+  comment_lg = ' '
+
+  CALL h5oget_comment_f(dset_id, comment_lg, error) 
+  CALL check("h5oget_comment_f", error, total_error)
+
+  IF(comment_lg(1:15).NE.dset_comment)THEN
+     CALL check("h5oget_comment_f", -1, total_error)
+  ENDIF
+  IF(comment_lg(16:20).NE.'     ')THEN ! make sure no NULL terminator
+     CALL check("h5oget_comment_f", -1, total_error)
+  ENDIF
+  !
+  ! Check optional parameter
+  !
+  CALL h5oget_comment_f(dset_id, comment_lg, error, comment_size) 
+  CALL check("h5oget_comment_f", error, total_error)
+
+  IF( comment_size.NE.15)THEN
+     CALL check("h5oget_comment_f", -1, total_error)
+  ENDIF
+
+  ! CHECK h5oget_comment_by_name_f
+
+  ! Try reading into a buffer that is the correct size
+
+  CALL h5oget_comment_by_name_f(dset_id, ".", comment, error) 
+  CALL check("h5oget_comment_by_name_f", error, total_error)
+
+  IF(comment(1:15).NE.dset_comment(1:15))THEN
+     CALL check("h5oget_comment_by_name_f", -1, total_error)
+  ENDIF
+
+  ! Try with trailing blanks in the name
+
+  CALL h5oget_comment_by_name_f(dset_id, ".     ", comment, error) 
+  CALL check("h5oget_comment_by_name_f", error, total_error)
+
+  IF(comment(1:15).NE.dset_comment(1:15))THEN
+     CALL check("h5oget_comment_by_name_f", -1, total_error)
+  ENDIF
+
+  !
+  ! Check optional parameter
+  !
+  CALL h5oget_comment_by_name_f(dset_id, ".     ", comment_lg, error, comment_size2) 
+  CALL check("h5oget_comment_by_name_f", error, total_error)
+
+  IF( comment_size2.NE.15)THEN
+     CALL check("h5oget_comment_by_name_f", -1, total_error)
+  ENDIF
+
+  !
+  ! Write the data to the dataset.
+  !
+  CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, wdata2, dims2, error)
+  CALL check("h5dwrite_f", error, total_error)
+
+  ! *************************
+  ! CHECK H5OEXISTS_BY_NAME_F
+  ! *************************
+
+  ! Create a soft link to /G1
+  CALL h5lcreate_soft_f("/G1", file_id, "/G1_LINK", error)
+  CALL check("h5lcreate_soft_f", error, total_error)
+
+
+  ! Create a soft link to /G1000, does not exist
+  CALL h5lcreate_soft_f("/G1000", file_id, "/G1_FALSE", error)
+  CALL check("h5lcreate_soft_f", error, total_error)
+
+  ! Create a soft link to /G1_LINK
+  CALL h5lcreate_soft_f("/G1_FALSE", file_id, "/G2_FALSE", error)
+  CALL check("h5lcreate_soft_f", error, total_error)
+
+  ! See if the link exists
+  CALL h5oexists_by_name_f(file_id,"/G1_LINK", link_exists, error)
+  CALL check("h5oexists_by_name_f", error, total_error)
+
+  ! Object should exist
+  IF(.NOT.link_exists)THEN
+     CALL check("h5oexists_by_name_f", -1, total_error)
+  ENDIF
+
+  chr_exact = "/G1_LINK"
+  ! See if the link exists
+  CALL h5oexists_by_name_f(file_id,chr_exact, link_exists, error, H5P_DEFAULT_F)
+  CALL check("h5oexists_by_name_f", error, total_error)
+
+  ! Object should exist
+  IF(.NOT.link_exists)THEN
+     CALL check("h5oexists_by_name_f", -1, total_error)
+  ENDIF
+
+  chr_lg = "/G1_LINK"
+  ! See if the link exists
+  CALL h5oexists_by_name_f(file_id,chr_lg, link_exists, error, H5P_DEFAULT_F)
+  CALL check("h5oexists_by_name_f", error, total_error)
+
+  ! Object should exist
+  IF(.NOT.link_exists)THEN
+     CALL check("h5oexists_by_name_f", -1, total_error)
+  ENDIF
+
+  chr_lg = "/G1_LINK  "
+  ! See if the link exists
+  CALL h5oexists_by_name_f(file_id,chr_lg, link_exists, error, H5P_DEFAULT_F)
+  CALL check("h5oexists_by_name_f", error, total_error)
+
+  ! Object should exist
+  IF(.NOT.link_exists)THEN
+     CALL check("h5oexists_by_name_f", -1, total_error)
+  ENDIF
+
+  ! See if the link exists
+  CALL h5oexists_by_name_f(file_id,"/G1_FALSE", link_exists, error)
+  CALL check("h5oexists_by_name_f", error, total_error)
+
+  ! Object should not exist
+  IF(link_exists)THEN
+     CALL check("h5oexists_by_name_f", -1, total_error)
+  ENDIF
+
+  ! Check optional parameter
+
+  CALL h5pcreate_f(H5P_LINK_ACCESS_F,plist,error)
+  CALL check("h5pcreate_f",error,total_error)
+
+  nlinks = 2
+  CALL h5pset_nlinks_f(plist, nlinks, error)
+  CALL check("h5pset_nlinks_f", error, total_error)
+  ! Ensure that nlinks was set successfully
+  nlinks = 0
+  CALL h5pget_nlinks_f(plist, nlinks, error)
+  CALL check("h5pget_nlinks_f",error,total_error)
+  CALL verify("h5pget_nlinks_f", INT(nlinks), 2, total_error)
+
+  ! See if the link exists
+  CALL h5oexists_by_name_f(file_id,"/G1_LINK", link_exists, error, plist)
+  CALL check("h5oexists_by_name_f", error, total_error)
+
+  ! Object should exist
+  IF(.not.link_exists)THEN
+     CALL check("h5oexists_by_name_f", -1, total_error)
+  ENDIF
+  !
+  ! Close and release resources.
+  !
+  CALL h5dclose_f(dset_id , error)
+  CALL check(" h5dclose_f", error, total_error)
+  CALL h5sclose_f(space_id, error)
+  CALL check("h5sclose_f", error, total_error)
+  CALL h5gclose_f(group_id, error)
+  CALL check("h5gclose_f", error, total_error)
+
+  ! Test opening an object by index, note 
+  CALL h5oopen_by_idx_f(file_id, "/G1/G2/G3", H5_INDEX_NAME_F, H5_ITER_INC_F, 0_hsize_t, group_id, error)
+  CALL check("h5oopen_by_idx_f", error, total_error)
+
+  CALL h5oclose_f(group_id, error)
+  CALL check("h5gclose_f", error, total_error)
+
+  !
+  ! create property to pass copy options
+  !
+  CALL h5pcreate_f(H5P_LINK_CREATE_F, lcpl_id, error)
+  CALL check("h5Pcreate_f", error, total_error)
+
+  CALL h5pset_create_inter_group_f(lcpl_id, TRUE, error)
+  CALL check("H5Pset_create_inter_group_f", error, total_error)
+  !
+  ! Check optional parameter lcpl_id, this would fail if lcpl_id was not specified
+  !
+  CALL h5ocopy_f(file_id, "/G1/G2/G3/DS1", file_id, "/G1/G_cp1/DS2", error, lcpl_id=lcpl_id)
+  CALL check("h5ocopy_f -- W/ OPTION: lcpl_id", error ,total_error)
+
+  CALL h5pclose_f(lcpl_id, error)
+  CALL check("h5pclose_f",error,total_error)
+
+  CALL h5pcreate_f(H5P_OBJECT_COPY_F, ocpypl_id, error)
+  CALL check("h5Pcreate_f",error,total_error)
+
+  CALL h5pset_copy_object_f(ocpypl_id, H5O_COPY_SHALLOW_HIERARCHY_F, error) 
+  CALL check("H5Pset_copy_object_f",error,total_error)
+
+  CALL h5ocopy_f(file_id, "/G1/G2", file_id, "/G1/G_cp2", error, ocpypl_id=ocpypl_id) 
+  CALL check("h5ocopy_f",error,total_error)
+
+  ! Makes sure the "DS1" dataset was not copied since we set a 
+  ! flag to copy only immediate members of a group.
+  ! Therefore, this should fail.
+  CALL h5dopen_f(file_id, "/G1/G_cp2/DS1", dset_id, error)
+  IF(error.EQ.0)THEN
+     CALL check("h5ocopy_f -- W/ OPTION: ocpypl_id", -1, total_error)
+  ENDIF
+
+  CALL h5pclose_f(ocpypl_id, error)
+  CALL check("h5pclose_f",error,total_error)
+
+  ! create datatype
+  CALL h5tcopy_f(H5T_NATIVE_INTEGER, tid, error)
+  CALL check("h5tcopy_f", error, total_error)
+
+  ! create named datatype
+  CALL h5tcommit_f(file_id, NAME_DATATYPE_SIMPLE, tid, error)
+  CALL check("h5tcommit_f", error, total_error)
+
+  ! close the datatype
+  CALL h5tclose_f(tid, error)
+  CALL check("h5tclose_f",error, total_error)
+
+  CALL h5ocopy_f(file_id, NAME_DATATYPE_SIMPLE, file_id, NAME_DATATYPE_SIMPLE2, error)
+  CALL check("h5ocopy_f",error,total_error)
+
+  ! open the datatype for copy
+  CALL h5topen_f(file_id, NAME_DATATYPE_SIMPLE, tid, error)
+  CALL check("h5topen_f",error,total_error)
+
+  ! open the copied datatype
+  CALL h5topen_f(file_id, NAME_DATATYPE_SIMPLE2, tid2, error)
+  CALL check("h5topen_f",error,total_error)
+
+  ! Compare the datatypes
+  CALL h5tequal_f(tid, tid2, flag, error)
+  IF(.NOT.flag)THEN
+     CALL check("h5ocopy_f FAILED", -1, total_error)
+  ENDIF
+
+  ! close the destination datatype
+  CALL h5tclose_f(tid, error)
+  CALL check("h5tclose_f",error,total_error)
+
+  ! close the destination datatype
+  CALL h5tclose_f(tid2, error)
+  CALL check("h5tclose_f",error,total_error)
+
+  CALL h5fclose_f(file_id, error)
+  CALL check("h5fclose_f",error,total_error)
+
+END SUBROUTINE test_h5o_link
+
+!***************************************************************
+!**
+!**  test_h5o_plist(): Test object creation properties
+!**
+!***************************************************************
+
+SUBROUTINE test_h5o_plist(total_error)
+
+  IMPLICIT NONE
+  INTEGER, INTENT(INOUT) :: total_error
+
+  INTEGER(hid_t) :: fid                        ! HDF5 File ID      
+  INTEGER(hid_t) :: grp, dset, dtype, dspace   ! Object identifiers 
+  INTEGER(hid_t) :: fapl                       ! File access property list 
+  INTEGER(hid_t) :: gcpl, dcpl, tcpl           ! Object creation properties 
+  INTEGER :: def_max_compact, def_min_dense    ! Default phase change parameters 
+  INTEGER :: max_compact, min_dense            ! Actual phase change parameters 
+  INTEGER :: error                             ! Value returned from API calls 
+  CHARACTER(LEN=7), PARAMETER :: TEST_FILENAME = 'test.h5'
+
+
+!  PRINT*,'Testing object creation properties'
+
+  ! Make a FAPL that uses the "use the latest version of the format" flag 
+  CALL H5Pcreate_f(H5P_FILE_ACCESS_F, fapl, error)
+  CALL check("H5Pcreate_f", error, total_error)
+
+  !  Set the "use the latest version of the format" bounds for creating objects in the file 
+  CALL H5Pset_libver_bounds_f(fapl, H5F_LIBVER_LATEST_F, H5F_LIBVER_LATEST_F, error)
+  CALL check("H5Pcreate_f", error, total_error)
+
+  !  Create a new HDF5 file 
+  CALL H5Fcreate_f(TEST_FILENAME, H5F_ACC_TRUNC_F, fid, error, access_prp=fapl)
+  CALL check("H5Fcreate_f", error, total_error)
+
+  !  Create group, dataset & named datatype creation property lists 
+  CALL H5Pcreate_f(H5P_GROUP_CREATE_F, gcpl, error)
+  CALL check("H5Pcreate_f", error, total_error)
+  CALL H5Pcreate_f(H5P_DATASET_CREATE_F, dcpl, error)
+  CALL check("H5Pcreate_f", error, total_error)
+  CALL H5Pcreate_f(H5P_DATATYPE_CREATE_F, tcpl, error)
+  CALL check("H5Pcreate_f", error, total_error)
+
+  !  Retrieve default attribute phase change values 
+  CALL H5Pget_attr_phase_change_f(gcpl, def_max_compact, def_min_dense, error)
+  CALL check("H5Pget_attr_phase_change_f", error, total_error)
+
+  !  Set non-default attribute phase change values on each creation property list 
+  CALL H5Pset_attr_phase_change_f(gcpl, def_max_compact+1, def_min_dense-1, error)
+  CALL check("H5Pget_attr_phase_change_f", error, total_error)
+  CALL H5Pset_attr_phase_change_f(dcpl, def_max_compact+1, def_min_dense-1, error)
+  CALL check("H5Pget_attr_phase_change_f", error, total_error)
+  CALL H5Pset_attr_phase_change_f(tcpl, def_max_compact+1, def_min_dense-1, error)
+  CALL check("H5Pget_attr_phase_change_f", error, total_error)
+
+  !  Retrieve attribute phase change values on each creation property list and verify 
+  CALL H5Pget_attr_phase_change_f(gcpl, max_compact, min_dense, error)
+  CALL check("H5Pget_attr_phase_change_f", error, total_error)
+  CALL verify("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error)
+  CALL verify("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error)
+
+  CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
+  CALL check("H5Pget_attr_phase_change_f", error, total_error)
+  CALL verify("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error)
+  CALL verify("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error)
+
+  CALL H5Pget_attr_phase_change_f(tcpl, max_compact, min_dense, error)
+  CALL check("H5Pget_attr_phase_change_f", error, total_error)
+  CALL verify("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error)
+  CALL verify("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error)
+
+  ! Create a group, dataset, and committed datatype within the file,
+  ! using the respective type of creation property lists.
+  ! 
+
+  ! Create the group anonymously and link it in 
+  CALL H5Gcreate_anon_f(fid, grp, error, gcpl_id=gcpl)
+  CALL check("H5Gcreate_anon_f", error, total_error)
+
+  CALL H5Olink_f(grp, fid, "group", error)
+  CALL check("H5Olink_f", error, total_error)
+
+  !  Commit the type inside the group anonymously and link it in 
+  CALL h5tcopy_f(H5T_NATIVE_INTEGER, dtype, error)
+  CALL check("h5tcopy_f", error, total_error)
+
+  CALL H5Tcommit_anon_f(fid, dtype, error, tcpl_id=tcpl)
+  CALL check("H5Tcommit_anon_f",error,total_error)
+
+  CALL H5Olink_f(dtype, fid, "datatype", error)
+  CALL check("H5Olink_f", error, total_error)
+
+  !  Create the dataspace for the dataset. 
+  CALL h5screate_f(H5S_SCALAR_F, dspace, error)
+  CALL check("h5screate_f",error,total_error)
+
+  !  Create the dataset anonymously and link it in 
+  CALL H5Dcreate_anon_f(fid, H5T_NATIVE_INTEGER, dspace, dset, error, dcpl )
+  CALL check("H5Dcreate_anon_f",error,total_error)
+
+  CALL H5Olink_f(dset, fid, "dataset", error)
+  CALL check("H5Olink_f", error, total_error)
+
+  CALL h5sclose_f(dspace, error)
+  CALL check("h5sclose_f",error,total_error)
+
+  !  Close current creation property lists 
+  CALL h5pclose_f(gcpl,error)
+  CALL check("h5pclose_f", error, total_error)
+  CALL h5pclose_f(dcpl,error)
+  CALL check("h5pclose_f", error, total_error)
+  CALL h5pclose_f(tcpl,error)
+  CALL check("h5pclose_f", error, total_error)
+
+  !  Retrieve each object's creation property list 
+  CALL H5Gget_create_plist_f(grp, gcpl, error)
+  CALL check("H5Gget_create_plist", error, total_error)
+
+  CALL H5Tget_create_plist_f(dtype, tcpl, error)
+  CALL check("H5Tget_create_plist_f", error, total_error)
+
+  CALL H5Dget_create_plist_f(dset, dcpl, error)
+  CALL check("H5Dget_create_plist_f", error, total_error)
+
+  !  Retrieve attribute phase change values on each creation property list and verify 
+  CALL H5Pget_attr_phase_change_f(gcpl, max_compact, min_dense, error)
+  CALL check("H5Pget_attr_phase_change_f", error, total_error)
+  CALL verify("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error)
+  CALL verify("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error)
+
+  CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
+  CALL check("H5Pget_attr_phase_change_f", error, total_error)
+  CALL verify("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error)
+  CALL verify("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error)
+
+  CALL H5Pget_attr_phase_change_f(tcpl, max_compact, min_dense, error)
+  CALL check("H5Pget_attr_phase_change_f", error, total_error)
+  CALL verify("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error)
+  CALL verify("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error)
+
+  ! Close current objects 
+  CALL h5pclose_f(gcpl,error)
+  CALL check("h5pclose_f", error, total_error)
+  CALL h5pclose_f(dcpl,error)
+  CALL check("h5pclose_f", error, total_error)
+  CALL h5pclose_f(tcpl,error)
+  CALL check("h5pclose_f", error, total_error)
+
+  CALL h5gclose_f(grp, error)
+  CALL check("h5gclose_f",error,total_error)
+
+  CALL h5tclose_f(dtype, error)
+  CALL check("h5tclose_f",error,total_error)
+  CALL h5dclose_f(dset, error)
+  CALL check("h5dclose_f",error,total_error)
+  CALL h5fclose_f(fid, error)
+  CALL check("h5fclose_f",error,total_error)
+  !  Re-open the file and check that the object creation properties persist 
+  CALL h5fopen_f(TEST_FILENAME, H5F_ACC_RDONLY_F, fid, error, access_prp=fapl)
+  CALL check("H5fopen_f",error,total_error)
+
+  !  Re-open objects 
+  CALL H5Gopen_f(fid, "group", grp, error)
+  CALL check("h5gopen_f", error, total_error)
+
+  CALL H5Topen_f(fid, "datatype", dtype,error)
+  CALL check("h5topen_f", error, total_error)
+
+  CALL H5Dopen_f(fid, "dataset", dset, error)
+  CALL check("h5dopen_f", error, total_error)
+
+  !  Retrieve each object's creation property list 
+  CALL H5Gget_create_plist_f(grp, gcpl, error)
+  CALL check("H5Gget_create_plist", error, total_error)
+
+  CALL H5Tget_create_plist_f(dtype, tcpl, error)
+  CALL check("H5Tget_create_plist_f", error, total_error)
+
+  CALL H5Dget_create_plist_f(dset, dcpl, error)
+  CALL check("H5Dget_create_plist_f", error, total_error)
+
+  !  Retrieve attribute phase change values on each creation property list and verify 
+  CALL H5Pget_attr_phase_change_f(gcpl, max_compact, min_dense, error)
+  CALL check("H5Pget_attr_phase_change_f", error, total_error)
+  CALL verify("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error)
+  CALL verify("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error)
+
+  CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
+  CALL check("H5Pget_attr_phase_change_f", error, total_error)
+  CALL verify("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error)
+  CALL verify("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error)
+
+  CALL H5Pget_attr_phase_change_f(tcpl, max_compact, min_dense, error)
+  CALL check("H5Pget_attr_phase_change_f", error, total_error)
+  CALL verify("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error)
+  CALL verify("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error)
+
+  !  Close current objects 
+  CALL h5pclose_f(gcpl,error)
+  CALL check("h5pclose_f", error, total_error)
+  CALL h5pclose_f(dcpl,error)
+  CALL check("h5pclose_f", error, total_error)
+  CALL h5pclose_f(tcpl,error)
+  CALL check("h5pclose_f", error, total_error)
+
+  CALL h5gclose_f(grp, error)
+  CALL check("h5gclose_f",error,total_error)
+
+  CALL h5tclose_f(dtype, error)
+  CALL check("h5tclose_f",error,total_error)
+  CALL h5dclose_f(dset, error)
+  CALL check("h5dclose_f",error,total_error)
+  CALL h5fclose_f(fid, error)
+  CALL check("h5fclose_f",error,total_error)
+
+  !  Close the FAPL 
+  CALL H5Pclose_f(fapl, error)
+  CALL check("H5Pclose_f", error, total_error)
+
+END SUBROUTINE test_h5o_plist
+
+END MODULE TH5O
diff --git a/fortran/test/tH5O.f90 b/fortran/test/tH5O.f90
deleted file mode 100644
index 99d4c22..0000000
--- a/fortran/test/tH5O.f90
+++ /dev/null
@@ -1,797 +0,0 @@
-!****h* root/fortran/test/tH5O.f90
-!
-! NAME
-!  tH5O.f90
-!
-! FUNCTION
-!  Basic testing of Fortran H5O APIs.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! CONTAINS SUBROUTINES
-!  test_h5o, test_h5o_link, test_h5o_plist
-!
-!*****
-MODULE TH5O
-
-CONTAINS
-
-SUBROUTINE test_h5o(cleanup, total_error)
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-
-  IMPLICIT NONE
-  LOGICAL, INTENT(IN)  :: cleanup
-  INTEGER, INTENT(INOUT) :: total_error
-  INTEGER :: error
-
-  CALL test_h5o_plist(total_error) ! Test object creation properties
-  CALL test_h5o_link(total_error) ! Test object link routine
-
-  IF(cleanup) CALL h5_cleanup_f("TestFile", H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-  IF(cleanup) CALL h5_cleanup_f("test", H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-
-END SUBROUTINE test_h5o
-
-!***************************************************************
-!**
-!**  test_h5o_link: Test creating link to object
-!**
-!***************************************************************
-
-SUBROUTINE test_h5o_link(total_error)
-
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-
-  IMPLICIT NONE
-  INTEGER, INTENT(INOUT) :: total_error
-
-  INTEGER(HID_T) :: file_id
-  INTEGER(HID_T) :: group_id
-  INTEGER(HID_T) :: space_id
-  INTEGER(HID_T) :: dset_id
-  INTEGER(HID_T) :: type_id
-  INTEGER(HID_T) :: fapl_id
-  INTEGER(HID_T) :: lcpl_id
-  INTEGER(HID_T) :: ocpypl_id
-  CHARACTER(LEN=11), PARAMETER :: TEST_FILENAME = 'TestFile.h5'
-  INTEGER, PARAMETER :: TEST6_DIM1 = 2, TEST6_DIM2 = 5
-!EP  INTEGER(HSIZE_T), DIMENSION(1:2), PARAMETER :: dims = (/TEST6_DIM1,TEST6_DIM2/)
-  INTEGER(HSIZE_T), DIMENSION(1:2)  :: dims = (/TEST6_DIM1,TEST6_DIM2/)
-!EP  INTEGER, DIMENSION(1:TEST6_DIM1,1:TEST6_DIM2) :: wdata, rdata
-  INTEGER, DIMENSION(TEST6_DIM1,TEST6_DIM2) :: wdata, rdata
-
-  INTEGER, PARAMETER :: TRUE = 1
-
-  LOGICAL :: committed !  Whether the named datatype is committed 
-
-  INTEGER :: i, j
-  INTEGER ::  error  !  Value returned from API calls 
-
-  CHARACTER(LEN=14) :: NAME_DATATYPE_SIMPLE="H5T_NATIVE_INT"
-  CHARACTER(LEN=16) :: NAME_DATATYPE_SIMPLE2="H5T_NATIVE_INT-2"
-  INTEGER(HID_T) :: tid, tid2
-  LOGICAL :: flag
-  
-  ! Data for tested h5ocopy_f
-  CHARACTER(LEN=3) , PARAMETER :: dataset = "DS1"
-  INTEGER          , PARAMETER :: dim0     = 4
-
-  INTEGER(HSIZE_T), DIMENSION(1:1)    :: dims2 = (/dim0/) ! size read/write buffer
-  INTEGER         , DIMENSION(1:dim0) :: wdata2   ! Write buffer 
-  LOGICAL :: link_exists
-  CHARACTER(LEN=8)  :: chr_exact
-  CHARACTER(LEN=10) :: chr_lg
-  INTEGER(size_t) :: nlinks
-  INTEGER(HID_T) :: plist = -1
-
-  CHARACTER(LEN=20) :: dset_comment = "dataset comment"
-  CHARACTER(LEN=13) :: grp_comment = "group comment"
-  CHARACTER(LEN=10) :: comment_sm ! to small comment sized buffer
-  CHARACTER(LEN=15) :: comment ! exact comment sized buffer
-  CHARACTER(LEN=20) :: comment_lg ! large comment sized buffer
-  INTEGER(HSSIZE_T) :: comment_size
-  INTEGER(SIZE_T)   :: comment_size2
-
-  !  Initialize the raw data 
-  DO i = 1, TEST6_DIM1
-     DO j = 1, TEST6_DIM2
-        wdata(i,j) = i*j
-     ENDDO
-  ENDDO
-
-  !  Create the dataspace 
-  CALL h5screate_simple_f(2, dims, space_id, error)
-  CALL check("h5screate_simple_f",error,total_error)
-
-  !  Create LCPL with intermediate group creation flag set 
-  CALL H5Pcreate_f(H5P_LINK_CREATE_F, lcpl_id, error)
-  CALL check("h5Pcreate_f",error,total_error)
-
-  CALL H5Pset_create_inter_group_f(lcpl_id, TRUE, error)
-  CALL check("H5Pset_create_inter_group_f",error,total_error)
-
-  !  Loop over using new group format 
-  ! for(new_format = FALSE; new_format <= TRUE; new_format++) {
-
-  ! Make a FAPL that uses the "use the latest version of the format" bounds 
-  CALL H5Pcreate_f(H5P_FILE_ACCESS_F,fapl_id,error)
-  CALL check("h5Pcreate_f",error,total_error)
-
-  !  Set the "use the latest version of the format" bounds for creating objects in the file 
-
-  CALL H5Pset_libver_bounds_f(fapl_id, H5F_LIBVER_LATEST_F, H5F_LIBVER_LATEST_F, error)
-  CALL check("H5Pset_libver_bounds_f",error, total_error)
-
-  !  Create a new HDF5 file 
-  CALL H5Fcreate_f(TEST_FILENAME, H5F_ACC_TRUNC_F, file_id, error, H5P_DEFAULT_F, fapl_id)
-  CALL check("H5Fcreate_f", error, total_error)
-
-  !  Close the FAPL 
-  CALL h5pclose_f(fapl_id, error)
-  CALL check("h5pclose_f",error,total_error)
-
-  !  Create and commit a datatype with no name 
-  CALL H5Tcopy_f( H5T_NATIVE_INTEGER, type_id, error)
-  CALL check("H5Tcopy_F",error,total_error)
-
-  CALL H5Tcommit_anon_f(file_id, type_id, error) ! using no optional parameters
-  CALL check("H5Tcommit_anon_F",error,total_error)
-
-  CALL H5Tcommitted_f(type_id, committed, error)
-  CALL check("H5Tcommitted_f",error,total_error)
-  CALL verifyLogical("H5Tcommitted_f", committed, .TRUE., total_error)
-
-  !  Create a dataset with no name using the committed datatype
-  CALL H5Dcreate_anon_f(file_id, type_id, space_id, dset_id, error ) ! using no optional parameters
-  CALL check("H5Dcreate_anon_f",error,total_error)
-  !
-  !  Verify that we can write to and read from the dataset 
-  !
-  !  Write the data to the dataset 
-
-!EP  CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, wdata, dims, error, &
-!EP         mem_space_id=H5S_ALL_F, file_space_id=H5S_ALL_F, xfer_prp = H5P_DEFAULT_F)
-  CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, wdata, dims, error)
-  CALL check("h5dwrite_f", error, total_error)
-
-  !  Read the data back 
-!EP  CALL h5dread_f(dset_id, H5T_NATIVE_INTEGER, rdata, dims, error, &
-!EP       mem_space_id=H5S_ALL_F, file_space_id=H5S_ALL_F, xfer_prp = H5P_DEFAULT_F)
-  CALL h5dread_f(dset_id, H5T_NATIVE_INTEGER, rdata, dims, error)
-  CALL check("h5dread_f", error, total_error)
-
-  !  Verify the data 
-  DO i = 1, TEST6_DIM1
-     DO j = 1, TEST6_DIM2
-        CALL VERIFY("H5Dread_f",wdata(i,j),rdata(i,j),total_error)
-        wdata(i,j) = i*j
-     ENDDO
-  ENDDO
-
-  !  Create a group with no name
-
-  CALL H5Gcreate_anon_f(file_id, group_id, error)
-  CALL check("H5Gcreate_anon", error, total_error)
-
-  !  Link nameless datatype into nameless group 
-  CALL H5Olink_f(type_id, group_id, "datatype", error, H5P_DEFAULT_F)
-  CALL check("H5Olink_f", error, total_error)
-
-  !  Link nameless dataset into nameless group with intermediate group 
-  CALL H5Olink_f(dset_id, group_id, "inter_group/dataset", error, lcpl_id, H5P_DEFAULT_F)
-  CALL check("H5Olink_f", error, total_error)
-
-  !  Close IDs for dataset and datatype 
-  CALL h5dclose_f(dset_id, error)
-  CALL check("h5dclose_f", error, total_error)
-  CALL h5tclose_f(type_id, error)
-  CALL check("h5tclose_f", error, total_error)
-
-  !  Re-open datatype using new link 
-  CALL H5Topen_f(group_id, "datatype", type_id, error)
-  CALL check("h5topen_f", error, total_error)
-
-  !  Link nameless group to root group and close the group ID
-  CALL H5Olink_f(group_id, file_id, "/group", error)
-  CALL check("H5Olink_f", error, total_error)
-
-  CALL h5gclose_f(group_id, error)
-  CALL check("h5gclose_f",error,total_error)
-
-  !  Open dataset through root group and verify its data 
-  CALL H5Dopen_f(file_id, "/group/inter_group/dataset", dset_id, error)
-  CALL check("test_lcpl.h5dopen_f", error, total_error)
-
-  !  Read data from dataset 
-!EP  CALL h5dread_f(dset_id, H5T_NATIVE_INTEGER, rdata, dims, error, &
-!EP       H5S_ALL_F, H5S_ALL_F, xfer_prp = H5P_DEFAULT_F)
-  CALL h5dread_f(dset_id, H5T_NATIVE_INTEGER, rdata, dims, error)
-  CALL check("h5dread_f", error, total_error)
-
-  !  Verify the data 
-  DO i = 1, TEST6_DIM1
-     DO j = 1, TEST6_DIM2
-        CALL VERIFY("H5Dread",wdata(i,j),rdata(i,j),total_error)
-     ENDDO
-  ENDDO
-  !  Close open IDs 
-
-  CALL h5dclose_f(dset_id, error)
-  CALL check("h5dclose_f",error,total_error)
-  CALL h5tclose_f(type_id, error)
-  CALL check("h5tclose_f",error,total_error)
-
-  !  Close remaining IDs 
-  CALL h5sclose_f(space_id, error)
-  CALL check("h5sclose_f",error,total_error)
-  CALL h5pclose_f(lcpl_id,error)
-  CALL check("h5pclose_f", error, total_error)
-
-  ! *********************
-  !    CHECK H5OCOPY_F
-  ! *********************
-
-  DO i = 1, dim0
-     wdata2(i) = i-1
-  ENDDO
-  !
-  ! Create dataspace.  Setting size to be the current size.
-  !
-  CALL h5screate_simple_f(1, dims2, space_id, error)
-  CALL check("h5screate_simple_f", error, total_error)
-  !
-  ! Create intermediate groups
-  !
-  CALL h5gcreate_f(file_id,"/G1",group_id,error)
-  CALL check("h5gcreate_f", error, total_error)
-  CALL h5gcreate_f(file_id,"/G1/G2",group_id,error)
-  CALL check("h5gcreate_f", error, total_error)
-  CALL h5gcreate_f(file_id,"/G1/G2/G3",group_id,error)
-  CALL check("h5gcreate_f", error, total_error)
-
-  ! Try putting a comment on the group /G1/G2/G3 by name
-  CALL h5oset_comment_by_name_f(file_id, "/G1/G2/G3", grp_comment, error)
-  CALL check("h5oset_comment_by_name_f", error, total_error)
-
-  comment_lg = ' '
-
-  CALL h5oget_comment_by_name_f(file_id, "/G1/G2/G3", comment_lg, error) 
-  CALL check("h5oget_comment_by_name_f", error, total_error)
-
-  IF(comment_lg(1:13).NE.grp_comment)THEN
-     CALL check("h5oget_comment_by_name_f", -1, total_error)
-  ENDIF
-  IF(comment_lg(14:20).NE.'       ')THEN ! make sure no NULL terminator
-     CALL check("h5oget_comment_by_name_f", -1, total_error)
-  ENDIF
-
-  ! Try putting a comment on the group /G1/G2/G3 by name with trailing blanks
-
-  CALL h5oset_comment_by_name_f(file_id, "/G1/G2/G3"//'  ', grp_comment, error)
-  CALL check("h5oset_comment_by_name_f", error, total_error)
-
-  comment_lg = ' '
-
-  CALL h5oget_comment_by_name_f(file_id, "/G1/G2/G3"//'  ', comment_lg, error) 
-  CALL check("h5oget_comment_by_name_f", error, total_error)
-
-  IF(comment_lg(1:13).NE.grp_comment)THEN
-     CALL check("h5oget_comment_by_name_f", -1, total_error)
-  ENDIF
-  IF(comment_lg(14:20).NE.'       ')THEN ! make sure no NULL terminator
-     CALL check("h5oget_comment_by_name_f", -1, total_error)
-  ENDIF
-
-  !
-  ! Create the dataset
-  !
-  CALL h5dcreate_f(group_id, dataset, H5T_STD_I32LE, space_id, dset_id, error)
-  CALL check("h5dcreate_f", error, total_error)
-
-  ! Putting a comment on the dataset
-  CALL h5oset_comment_f(dset_id, dset_comment, error)
-  CALL check("h5oset_comment_f", error, total_error)
-
-  ! Try reading into a buffer that is the correct size
-
-  CALL h5oget_comment_f(dset_id, comment, error) 
-  CALL check("h5oget_comment_f", error, total_error)
-
-  IF(comment(1:15).NE.dset_comment(1:15))THEN
-     CALL check("h5oget_comment_f", -1, total_error)
-  ENDIF
-
-  ! Try reading into a buffer that is to small
-
-  CALL h5oget_comment_f(dset_id, comment_sm, error) 
-  CALL check("h5oget_comment_f", error, total_error)
-
-  IF(comment_sm(1:10).NE.dset_comment(1:10))THEN
-     CALL check("h5oget_comment_f", -1, total_error)
-  ENDIF 
-
- ! Try reading into a buffer that is larger then needed
-
-  comment_lg = ' '
-
-  CALL h5oget_comment_f(dset_id, comment_lg, error) 
-  CALL check("h5oget_comment_f", error, total_error)
-
-  IF(comment_lg(1:15).NE.dset_comment)THEN
-     CALL check("h5oget_comment_f", -1, total_error)
-  ENDIF
-  IF(comment_lg(16:20).NE.'     ')THEN ! make sure no NULL terminator
-     CALL check("h5oget_comment_f", -1, total_error)
-  ENDIF
-  !
-  ! Check optional parameter
-  !
-  CALL h5oget_comment_f(dset_id, comment_lg, error, comment_size) 
-  CALL check("h5oget_comment_f", error, total_error)
-
-  IF( comment_size.NE.15)THEN
-     CALL check("h5oget_comment_f", -1, total_error)
-  ENDIF
-
-  ! CHECK h5oget_comment_by_name_f
-
-  ! Try reading into a buffer that is the correct size
-
-  CALL h5oget_comment_by_name_f(dset_id, ".", comment, error) 
-  CALL check("h5oget_comment_by_name_f", error, total_error)
-
-  IF(comment(1:15).NE.dset_comment(1:15))THEN
-     CALL check("h5oget_comment_by_name_f", -1, total_error)
-  ENDIF
-
-  ! Try with trailing blanks in the name
-
-  CALL h5oget_comment_by_name_f(dset_id, ".     ", comment, error) 
-  CALL check("h5oget_comment_by_name_f", error, total_error)
-
-  IF(comment(1:15).NE.dset_comment(1:15))THEN
-     CALL check("h5oget_comment_by_name_f", -1, total_error)
-  ENDIF
-
-  !
-  ! Check optional parameter
-  !
-  CALL h5oget_comment_by_name_f(dset_id, ".     ", comment_lg, error, comment_size2) 
-  CALL check("h5oget_comment_by_name_f", error, total_error)
-
-  IF( comment_size2.NE.15)THEN
-     CALL check("h5oget_comment_by_name_f", -1, total_error)
-  ENDIF
-
-  !
-  ! Write the data to the dataset.
-  !
-  CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, wdata2, dims2, error)
-  CALL check("h5dwrite_f", error, total_error)
-
-  ! *************************
-  ! CHECK H5OEXISTS_BY_NAME_F
-  ! *************************
-
-  ! Create a soft link to /G1
-  CALL h5lcreate_soft_f("/G1", file_id, "/G1_LINK", error)
-  CALL check("h5lcreate_soft_f", error, total_error)
-
-
-  ! Create a soft link to /G1000, does not exist
-  CALL h5lcreate_soft_f("/G1000", file_id, "/G1_FALSE", error)
-  CALL check("h5lcreate_soft_f", error, total_error)
-
-  ! Create a soft link to /G1_LINK
-  CALL h5lcreate_soft_f("/G1_FALSE", file_id, "/G2_FALSE", error)
-  CALL check("h5lcreate_soft_f", error, total_error)
-
-  ! See if the link exists
-  CALL h5oexists_by_name_f(file_id,"/G1_LINK", link_exists, error)
-  CALL check("h5oexists_by_name_f", error, total_error)
-
-  ! Object should exist
-  IF(.NOT.link_exists)THEN
-     CALL check("h5oexists_by_name_f", -1, total_error)
-  ENDIF
-
-  chr_exact = "/G1_LINK"
-  ! See if the link exists
-  CALL h5oexists_by_name_f(file_id,chr_exact, link_exists, error, H5P_DEFAULT_F)
-  CALL check("h5oexists_by_name_f", error, total_error)
-
-  ! Object should exist
-  IF(.NOT.link_exists)THEN
-     CALL check("h5oexists_by_name_f", -1, total_error)
-  ENDIF
-
-  chr_lg = "/G1_LINK"
-  ! See if the link exists
-  CALL h5oexists_by_name_f(file_id,chr_lg, link_exists, error, H5P_DEFAULT_F)
-  CALL check("h5oexists_by_name_f", error, total_error)
-
-  ! Object should exist
-  IF(.NOT.link_exists)THEN
-     CALL check("h5oexists_by_name_f", -1, total_error)
-  ENDIF
-
-  chr_lg = "/G1_LINK  "
-  ! See if the link exists
-  CALL h5oexists_by_name_f(file_id,chr_lg, link_exists, error, H5P_DEFAULT_F)
-  CALL check("h5oexists_by_name_f", error, total_error)
-
-  ! Object should exist
-  IF(.NOT.link_exists)THEN
-     CALL check("h5oexists_by_name_f", -1, total_error)
-  ENDIF
-
-  ! See if the link exists
-  CALL h5oexists_by_name_f(file_id,"/G1_FALSE", link_exists, error)
-  CALL check("h5oexists_by_name_f", error, total_error)
-
-  ! Object should not exist
-  IF(link_exists)THEN
-     CALL check("h5oexists_by_name_f", -1, total_error)
-  ENDIF
-
-  ! Check optional parameter
-
-  CALL h5pcreate_f(H5P_LINK_ACCESS_F,plist,error)
-  CALL check("h5pcreate_f",error,total_error)
-
-  nlinks = 2
-  CALL h5pset_nlinks_f(plist, nlinks, error)
-  CALL check("h5pset_nlinks_f", error, total_error)
-  ! Ensure that nlinks was set successfully
-  nlinks = 0
-  CALL h5pget_nlinks_f(plist, nlinks, error)
-  CALL check("h5pget_nlinks_f",error,total_error)
-  CALL VERIFY("h5pget_nlinks_f", INT(nlinks), 2, total_error)
-
-  ! See if the link exists
-  CALL h5oexists_by_name_f(file_id,"/G1_LINK", link_exists, error, plist)
-  CALL check("h5oexists_by_name_f", error, total_error)
-
-  ! Object should exist
-  IF(.not.link_exists)THEN
-     CALL check("h5oexists_by_name_f", -1, total_error)
-  ENDIF
-  !
-  ! Close and release resources.
-  !
-  CALL h5dclose_f(dset_id , error)
-  CALL check(" h5dclose_f", error, total_error)
-  CALL h5sclose_f(space_id, error)
-  CALL check("h5sclose_f", error, total_error)
-  CALL h5gclose_f(group_id, error)
-  CALL check("h5gclose_f", error, total_error)
-
-  ! Test opening an object by index, note 
-  CALL h5oopen_by_idx_f(file_id, "/G1/G2/G3", H5_INDEX_NAME_F, H5_ITER_INC_F, 0_hsize_t, group_id, error)
-  CALL check("h5oopen_by_idx_f", error, total_error)
-
-  CALL h5oclose_f(group_id, error)
-  CALL check("h5gclose_f", error, total_error)
-
-  !
-  ! create property to pass copy options
-  !
-  CALL h5pcreate_f(H5P_LINK_CREATE_F, lcpl_id, error)
-  CALL check("h5Pcreate_f", error, total_error)
-
-  CALL h5pset_create_inter_group_f(lcpl_id, TRUE, error)
-  CALL check("H5Pset_create_inter_group_f", error, total_error)
-  !
-  ! Check optional parameter lcpl_id, this would fail if lcpl_id was not specified
-  !
-  CALL h5ocopy_f(file_id, "/G1/G2/G3/DS1", file_id, "/G1/G_cp1/DS2", error, lcpl_id=lcpl_id)
-  CALL check("h5ocopy_f -- W/ OPTION: lcpl_id", error ,total_error)
-
-  CALL h5pclose_f(lcpl_id, error)
-  CALL check("h5pclose_f",error,total_error)
-
-  CALL h5pcreate_f(H5P_OBJECT_COPY_F, ocpypl_id, error)
-  CALL check("h5Pcreate_f",error,total_error)
-
-  CALL h5pset_copy_object_f(ocpypl_id, H5O_COPY_SHALLOW_HIERARCHY_F, error) 
-  CALL check("H5Pset_copy_object_f",error,total_error)
-
-  CALL h5ocopy_f(file_id, "/G1/G2", file_id, "/G1/G_cp2", error, ocpypl_id=ocpypl_id) 
-  CALL check("h5ocopy_f",error,total_error)
-
-  ! Makes sure the "DS1" dataset was not copied since we set a 
-  ! flag to copy only immediate members of a group.
-  ! Therefore, this should fail.
-  CALL h5dopen_f(file_id, "/G1/G_cp2/DS1", dset_id, error)
-  IF(error.EQ.0)THEN
-     CALL check("h5ocopy_f -- W/ OPTION: ocpypl_id", -1, total_error)
-  ENDIF
-
-  CALL h5pclose_f(ocpypl_id, error)
-  CALL check("h5pclose_f",error,total_error)
-
-  ! create datatype
-  CALL h5tcopy_f(H5T_NATIVE_INTEGER, tid, error)
-  CALL check("h5tcopy_f", error, total_error)
-
-  ! create named datatype
-  CALL h5tcommit_f(file_id, NAME_DATATYPE_SIMPLE, tid, error)
-  CALL check("h5tcommit_f", error, total_error)
-
-  ! close the datatype
-  CALL h5tclose_f(tid, error)
-  CALL check("h5tclose_f",error, total_error)
-
-  CALL h5ocopy_f(file_id, NAME_DATATYPE_SIMPLE, file_id, NAME_DATATYPE_SIMPLE2, error)
-  CALL check("h5ocopy_f",error,total_error)
-
-  ! open the datatype for copy
-  CALL h5topen_f(file_id, NAME_DATATYPE_SIMPLE, tid, error)
-  CALL check("h5topen_f",error,total_error)
-
-  ! open the copied datatype
-  CALL h5topen_f(file_id, NAME_DATATYPE_SIMPLE2, tid2, error)
-  CALL check("h5topen_f",error,total_error)
-
-  ! Compare the datatypes
-  CALL h5tequal_f(tid, tid2, flag, error)
-  IF(.NOT.flag)THEN
-     CALL check("h5ocopy_f FAILED", -1, total_error)
-  ENDIF
-
-  ! close the destination datatype
-  CALL h5tclose_f(tid, error)
-  CALL check("h5tclose_f",error,total_error)
-
-  ! close the destination datatype
-  CALL h5tclose_f(tid2, error)
-  CALL check("h5tclose_f",error,total_error)
-
-  CALL h5fclose_f(file_id, error)
-  CALL check("h5fclose_f",error,total_error)
-
-END SUBROUTINE test_h5o_link
-
-!***************************************************************
-!**
-!**  test_h5o_plist(): Test object creation properties
-!**
-!***************************************************************
-
-SUBROUTINE test_h5o_plist(total_error)
-
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-
-  IMPLICIT NONE
-  INTEGER, INTENT(INOUT) :: total_error
-
-  INTEGER(hid_t) :: fid                        ! HDF5 File ID      
-  INTEGER(hid_t) :: grp, dset, dtype, dspace   ! Object identifiers 
-  INTEGER(hid_t) :: fapl                       ! File access property list 
-  INTEGER(hid_t) :: gcpl, dcpl, tcpl           ! Object creation properties 
-  INTEGER :: def_max_compact, def_min_dense    ! Default phase change parameters 
-  INTEGER :: max_compact, min_dense            ! Actual phase change parameters 
-  INTEGER :: error                             ! Value returned from API calls 
-  CHARACTER(LEN=7), PARAMETER :: TEST_FILENAME = 'test.h5'
-
-
-!  PRINT*,'Testing object creation properties'
-
-  ! Make a FAPL that uses the "use the latest version of the format" flag 
-  CALL H5Pcreate_f(H5P_FILE_ACCESS_F, fapl, error)
-  CALL check("H5Pcreate_f", error, total_error)
-
-  !  Set the "use the latest version of the format" bounds for creating objects in the file 
-  CALL H5Pset_libver_bounds_f(fapl, H5F_LIBVER_LATEST_F, H5F_LIBVER_LATEST_F, error)
-  CALL check("H5Pcreate_f", error, total_error)
-
-  !  Create a new HDF5 file 
-  CALL H5Fcreate_f(TEST_FILENAME, H5F_ACC_TRUNC_F, fid, error, access_prp=fapl)
-  CALL check("H5Fcreate_f", error, total_error)
-
-  !  Create group, dataset & named datatype creation property lists 
-  CALL H5Pcreate_f(H5P_GROUP_CREATE_F, gcpl, error)
-  CALL check("H5Pcreate_f", error, total_error)
-  CALL H5Pcreate_f(H5P_DATASET_CREATE_F, dcpl, error)
-  CALL check("H5Pcreate_f", error, total_error)
-  CALL H5Pcreate_f(H5P_DATATYPE_CREATE_F, tcpl, error)
-  CALL check("H5Pcreate_f", error, total_error)
-
-  !  Retrieve default attribute phase change values 
-  CALL H5Pget_attr_phase_change_f(gcpl, def_max_compact, def_min_dense, error)
-  CALL check("H5Pget_attr_phase_change_f", error, total_error)
-
-  !  Set non-default attribute phase change values on each creation property list 
-  CALL H5Pset_attr_phase_change_f(gcpl, def_max_compact+1, def_min_dense-1, error)
-  CALL check("H5Pget_attr_phase_change_f", error, total_error)
-  CALL H5Pset_attr_phase_change_f(dcpl, def_max_compact+1, def_min_dense-1, error)
-  CALL check("H5Pget_attr_phase_change_f", error, total_error)
-  CALL H5Pset_attr_phase_change_f(tcpl, def_max_compact+1, def_min_dense-1, error)
-  CALL check("H5Pget_attr_phase_change_f", error, total_error)
-
-  !  Retrieve attribute phase change values on each creation property list and verify 
-  CALL H5Pget_attr_phase_change_f(gcpl, max_compact, min_dense, error)
-  CALL check("H5Pget_attr_phase_change_f", error, total_error)
-  CALL VERIFY("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error)
-  CALL VERIFY("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error)
-
-  CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
-  CALL check("H5Pget_attr_phase_change_f", error, total_error)
-  CALL VERIFY("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error)
-  CALL VERIFY("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error)
-
-  CALL H5Pget_attr_phase_change_f(tcpl, max_compact, min_dense, error)
-  CALL check("H5Pget_attr_phase_change_f", error, total_error)
-  CALL VERIFY("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error)
-  CALL VERIFY("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error)
-
-  ! Create a group, dataset, and committed datatype within the file,
-  ! using the respective type of creation property lists.
-  ! 
-
-  ! Create the group anonymously and link it in 
-  CALL H5Gcreate_anon_f(fid, grp, error, gcpl_id=gcpl)
-  CALL check("H5Gcreate_anon_f", error, total_error)
-
-  CALL H5Olink_f(grp, fid, "group", error)
-  CALL check("H5Olink_f", error, total_error)
-
-  !  Commit the type inside the group anonymously and link it in 
-  CALL h5tcopy_f(H5T_NATIVE_INTEGER, dtype, error)
-  CALL check("h5tcopy_f", error, total_error)
-
-  CALL H5Tcommit_anon_f(fid, dtype, error, tcpl_id=tcpl)
-  CALL check("H5Tcommit_anon_f",error,total_error)
-
-  CALL H5Olink_f(dtype, fid, "datatype", error)
-  CALL check("H5Olink_f", error, total_error)
-
-  !  Create the dataspace for the dataset. 
-  CALL h5screate_f(H5S_SCALAR_F, dspace, error)
-  CALL check("h5screate_f",error,total_error)
-
-  !  Create the dataset anonymously and link it in 
-  CALL H5Dcreate_anon_f(fid, H5T_NATIVE_INTEGER, dspace, dset, error, dcpl )
-  CALL check("H5Dcreate_anon_f",error,total_error)
-
-  CALL H5Olink_f(dset, fid, "dataset", error)
-  CALL check("H5Olink_f", error, total_error)
-
-  CALL h5sclose_f(dspace, error)
-  CALL check("h5sclose_f",error,total_error)
-
-  !  Close current creation property lists 
-  CALL h5pclose_f(gcpl,error)
-  CALL check("h5pclose_f", error, total_error)
-  CALL h5pclose_f(dcpl,error)
-  CALL check("h5pclose_f", error, total_error)
-  CALL h5pclose_f(tcpl,error)
-  CALL check("h5pclose_f", error, total_error)
-
-  !  Retrieve each object's creation property list 
-  CALL H5Gget_create_plist_f(grp, gcpl, error)
-  CALL check("H5Gget_create_plist", error, total_error)
-
-  CALL H5Tget_create_plist_f(dtype, tcpl, error)
-  CALL check("H5Tget_create_plist_f", error, total_error)
-
-  CALL H5Dget_create_plist_f(dset, dcpl, error)
-  CALL check("H5Dget_create_plist_f", error, total_error)
-
-  !  Retrieve attribute phase change values on each creation property list and verify 
-  CALL H5Pget_attr_phase_change_f(gcpl, max_compact, min_dense, error)
-  CALL check("H5Pget_attr_phase_change_f", error, total_error)
-  CALL VERIFY("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error)
-  CALL VERIFY("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error)
-
-  CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
-  CALL check("H5Pget_attr_phase_change_f", error, total_error)
-  CALL VERIFY("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error)
-  CALL VERIFY("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error)
-
-  CALL H5Pget_attr_phase_change_f(tcpl, max_compact, min_dense, error)
-  CALL check("H5Pget_attr_phase_change_f", error, total_error)
-  CALL VERIFY("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error)
-  CALL VERIFY("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error)
-
-  ! Close current objects 
-  CALL h5pclose_f(gcpl,error)
-  CALL check("h5pclose_f", error, total_error)
-  CALL h5pclose_f(dcpl,error)
-  CALL check("h5pclose_f", error, total_error)
-  CALL h5pclose_f(tcpl,error)
-  CALL check("h5pclose_f", error, total_error)
-
-  CALL h5gclose_f(grp, error)
-  CALL check("h5gclose_f",error,total_error)
-
-  CALL h5tclose_f(dtype, error)
-  CALL check("h5tclose_f",error,total_error)
-  CALL h5dclose_f(dset, error)
-  CALL check("h5dclose_f",error,total_error)
-  CALL h5fclose_f(fid, error)
-  CALL check("h5fclose_f",error,total_error)
-  !  Re-open the file and check that the object creation properties persist 
-  CALL h5fopen_f(TEST_FILENAME, H5F_ACC_RDONLY_F, fid, error, access_prp=fapl)
-  CALL check("H5fopen_f",error,total_error)
-
-  !  Re-open objects 
-  CALL H5Gopen_f(fid, "group", grp, error)
-  CALL check("h5gopen_f", error, total_error)
-
-  CALL H5Topen_f(fid, "datatype", dtype,error)
-  CALL check("h5topen_f", error, total_error)
-
-  CALL H5Dopen_f(fid, "dataset", dset, error)
-  CALL check("h5dopen_f", error, total_error)
-
-  !  Retrieve each object's creation property list 
-  CALL H5Gget_create_plist_f(grp, gcpl, error)
-  CALL check("H5Gget_create_plist", error, total_error)
-
-  CALL H5Tget_create_plist_f(dtype, tcpl, error)
-  CALL check("H5Tget_create_plist_f", error, total_error)
-
-  CALL H5Dget_create_plist_f(dset, dcpl, error)
-  CALL check("H5Dget_create_plist_f", error, total_error)
-
-  !  Retrieve attribute phase change values on each creation property list and verify 
-  CALL H5Pget_attr_phase_change_f(gcpl, max_compact, min_dense, error)
-  CALL check("H5Pget_attr_phase_change_f", error, total_error)
-  CALL VERIFY("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error)
-  CALL VERIFY("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error)
-
-  CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error)
-  CALL check("H5Pget_attr_phase_change_f", error, total_error)
-  CALL VERIFY("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error)
-  CALL VERIFY("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error)
-
-  CALL H5Pget_attr_phase_change_f(tcpl, max_compact, min_dense, error)
-  CALL check("H5Pget_attr_phase_change_f", error, total_error)
-  CALL VERIFY("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error)
-  CALL VERIFY("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error)
-
-  !  Close current objects 
-  CALL h5pclose_f(gcpl,error)
-  CALL check("h5pclose_f", error, total_error)
-  CALL h5pclose_f(dcpl,error)
-  CALL check("h5pclose_f", error, total_error)
-  CALL h5pclose_f(tcpl,error)
-  CALL check("h5pclose_f", error, total_error)
-
-  CALL h5gclose_f(grp, error)
-  CALL check("h5gclose_f",error,total_error)
-
-  CALL h5tclose_f(dtype, error)
-  CALL check("h5tclose_f",error,total_error)
-  CALL h5dclose_f(dset, error)
-  CALL check("h5dclose_f",error,total_error)
-  CALL h5fclose_f(fid, error)
-  CALL check("h5fclose_f",error,total_error)
-
-  !  Close the FAPL 
-  CALL H5Pclose_f(fapl, error)
-  CALL check("H5Pclose_f", error, total_error)
-
-END SUBROUTINE test_h5o_plist
-
-END MODULE TH5O
diff --git a/fortran/test/tH5O_F03.F90 b/fortran/test/tH5O_F03.F90
new file mode 100644
index 0000000..834308b
--- /dev/null
+++ b/fortran/test/tH5O_F03.F90
@@ -0,0 +1,555 @@
+!****h* root/fortran/test/tH5O_F03.f90
+!
+! NAME
+!  tH5O_F03.f90
+!
+! FUNCTION
+!  Test FORTRAN HDF5 H5O APIs which are dependent on FORTRAN 2003
+!  features. 
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+!*****
+
+! *****************************************
+! ***        H 5 O   T E S T S
+! *****************************************
+MODULE visit_cb
+
+  USE HDF5 
+  USE, INTRINSIC :: ISO_C_BINDING
+  
+  IMPLICIT NONE
+
+  INTEGER, PARAMETER :: info_size = 9
+
+  !-------------------------------------------------------------------------
+  ! Function:    visit_obj_cb
+  !
+  ! Purpose:     Callback routine for visiting objects in a file
+  !
+  ! Return:      Success:        0
+  !              Failure:        -1
+  !
+  ! Programmer:  M.S. Breitenfeld
+  !              July 12, 2012
+  !              Adopted from C test.
+  !
+  !-------------------------------------------------------------------------
+  !
+  ! Object visit structs
+  TYPE, bind(c) :: obj_visit_t
+     CHARACTER(KIND=C_CHAR), DIMENSION(1:180) :: path   ! Path to object
+     INTEGER :: type_obj ! type of object
+  END TYPE obj_visit_t
+
+  TYPE, bind(c) :: ovisit_ud_t
+     INTEGER :: idx              ! Index in object visit structure
+     TYPE(obj_visit_t), DIMENSION(1:info_size) :: info   ! Pointer to the object visit structure to use
+  END TYPE ovisit_ud_t
+
+CONTAINS
+
+  INTEGER FUNCTION visit_obj_cb( group_id, name, oinfo, op_data) bind(C)
+
+    IMPLICIT NONE
+
+    INTEGER(HID_T), VALUE :: group_id
+    CHARACTER(LEN=1), DIMENSION(1:180) :: name
+    TYPE(h5o_info_t) :: oinfo
+    TYPE(ovisit_ud_t) :: op_data
+
+    INTEGER :: len, i
+    INTEGER :: idx
+
+    visit_obj_cb = 0
+
+    ! Since the name is generated in C and passed to a Fortran string, it
+    ! will be NULL terminated, so we need to find the end of the string.
+
+    len = 1
+    DO len = 1, 180
+       IF(name(len) .EQ. C_NULL_CHAR) EXIT
+    ENDDO
+
+    len = len - 1
+
+    ! Check for correct object information
+
+    idx = op_data%idx
+
+    DO i = 1, len
+       IF(op_data%info(idx)%path(i)(1:1) .NE. name(i)(1:1))THEN
+          visit_obj_cb = -1
+          RETURN
+       ENDIF
+       
+       IF(op_data%info(idx)%type_obj .NE. oinfo%type)THEN
+          visit_obj_cb = -1
+          RETURN
+       ENDIF
+
+    ENDDO
+
+    ! Advance to next location in expected output
+    op_data%idx = op_data%idx + 1
+
+  END FUNCTION visit_obj_cb
+
+END MODULE visit_cb
+
+
+MODULE TH5O_F03
+
+CONTAINS
+!***************************************************************
+!**
+!**  test_h5o_refcount(): Test H5O refcounting functions.
+!**
+!***************************************************************
+
+SUBROUTINE test_h5o_refcount(total_error)
+
+  USE HDF5 
+  USE TH5_MISC
+  USE ISO_C_BINDING
+  IMPLICIT NONE
+
+  INTEGER, INTENT(INOUT) :: total_error
+
+  CHARACTER(LEN=11), PARAMETER :: FILENAME = "th5o_ref.h5"
+  INTEGER, PARAMETER :: DIM0 = 5
+  INTEGER, PARAMETER :: DIM1 = 10
+  INTEGER(hid_t) :: fid ! HDF5 File ID
+  INTEGER(hid_t) :: grp, dset, dtype, dspace ! Object identifiers
+  TYPE(h5o_info_t) :: oinfo                  ! Object info struct
+  INTEGER(hsize_t), DIMENSION(1:2) :: dims
+  INTEGER :: error                           ! Value returned from API calls
+
+  ! Create a new HDF5 file
+  CALL h5fcreate_f(FILENAME,H5F_ACC_TRUNC_F,fid,error)
+  CALL check("h5fcreate_f", error, total_error) 
+
+  ! Create a group, dataset, and committed datatype within the file
+  ! Create the group
+  CALL h5gcreate_f(fid, "group", grp, error)
+  CALL check("h5gcreate_f",error, total_error)
+
+  ! Commit the type inside the group
+  CALL h5tcopy_f(H5T_NATIVE_INTEGER, dtype, error)
+  CALL check("H5Tcopy_f",error, total_error)
+  CALL h5tcommit_f(fid, "datatype", dtype, error)
+  CALL check("h5tcommit_f", error, total_error)
+
+  ! Create the data space for the dataset.
+  dims(1) = DIM0
+  dims(2) = DIM1
+
+  CALL h5screate_simple_f(2, dims, dspace, error)
+  CALL check("h5screate_simple_f", error, total_error)
+
+  ! Create the dataset.
+  CALL h5dcreate_f(fid, "dataset", H5T_NATIVE_INTEGER, dspace, dset, error)
+  CALL check("h5dcreate_f", error, total_error)
+  CALL h5sclose_f(dspace, error)
+  CALL check("h5sclose_f", error, total_error)
+
+  ! Get ref counts for each object.  They should all be 1, since each object has a hard link.
+  CALL h5oget_info_by_name_f(fid, "group", oinfo, error)
+  CALL check("h5oget_info_by_name_f", error, total_error)
+  IF(oinfo%rc.NE.1)THEN
+     CALL check("h5oget_info_by_name_f", -1, total_error)
+  ENDIF
+  CALL h5oget_info_by_name_f(fid, "datatype", oinfo, error)
+  CALL check("h5oget_info_by_name_f", error, total_error)
+  IF(oinfo%rc.NE.1)THEN
+     CALL check("h5oget_info_by_name_f", -1, total_error)
+  ENDIF
+  CALL h5oget_info_by_name_f(fid, "dataset", oinfo, error)
+  CALL check("h5oget_info_by_name_f", error, total_error)
+  IF(oinfo%rc.NE.1)THEN
+     CALL check("h5oget_info_by_name_f", -1, total_error)
+  ENDIF
+
+  ! Check h5oget_info
+  CALL h5oget_info_f(grp, oinfo, error)
+  CALL check("h5oget_info_f", error, total_error)
+  IF(oinfo%rc.NE.1)THEN
+     CALL check("h5oget_info_f", -1, total_error)
+  ENDIF
+  IF(oinfo%type.NE.H5O_TYPE_GROUP_F)THEN
+     CALL check("h5oget_info_f", -1, total_error)
+  ENDIF
+
+  ! Increment each object's reference count.
+  CALL h5oincr_refcount_f(grp, error)
+  CALL check("h5oincr_refcount_f", error, total_error)
+  CALL h5oincr_refcount_f(dtype, error)
+  CALL check("h5oincr_refcount_f", error, total_error)
+  CALL h5oincr_refcount_f(dset, error)
+  CALL check("h5oincr_refcount_f", error, total_error)
+
+  ! Get ref counts for each object.  They should all be 2 now.
+  CALL h5oget_info_by_name_f(fid, "group", oinfo, error)
+  CALL check("h5oget_info_by_name_f", error, total_error)
+  IF(oinfo%rc.NE.2)THEN
+     CALL check("h5oget_info_by_name_f", -1, total_error)
+  ENDIF
+  CALL h5oget_info_by_name_f(fid, "datatype", oinfo, error)
+  CALL check("h5oget_info_by_name_f", error, total_error)
+  IF(oinfo%rc.NE.2)THEN
+     CALL check("h5oget_info_by_name_f", -1, total_error)
+  ENDIF
+  CALL h5oget_info_by_name_f(fid, "dataset", oinfo, error)
+  CALL check("h5oget_info_by_name_f", error, total_error)
+  IF(oinfo%rc.NE.2)THEN
+     CALL check("h5oget_info_by_name_f", -1, total_error)
+  ENDIF
+
+  ! Decrement the reference counts and check that they decrease back to 1.
+  CALL h5odecr_refcount_f(grp, error)
+  CALL check("h5oincr_refcount_f", error, total_error)
+  CALL h5odecr_refcount_f(dtype, error)
+  CALL check("h5oincr_refcount_f", error, total_error)
+  CALL h5odecr_refcount_f(dset, error)
+  CALL check("h5oincr_refcount_f", error, total_error)
+
+  CALL h5oget_info_by_name_f(fid, "group", oinfo, error)
+  CALL check("h5oget_info_by_name_f", error, total_error)
+  IF(oinfo%rc.NE.1)THEN
+     CALL check("h5oget_info_by_name_f", -1, total_error)
+  ENDIF
+  CALL h5oget_info_by_name_f(fid, "datatype", oinfo, error)
+  CALL check("h5oget_info_by_name_f", error, total_error)
+  IF(oinfo%rc.NE.1)THEN
+     CALL check("h5oget_info_by_name_f", -1, total_error)
+  ENDIF
+  CALL h5oget_info_by_name_f(fid, "dataset", oinfo, error)
+  CALL check("h5oget_info_by_name_f", error, total_error)
+  IF(oinfo%rc.NE.1)THEN
+     CALL check("h5oget_info_by_name_f", -1, total_error)
+  ENDIF
+
+  CALL h5gclose_f(grp, error)
+  CALL check("h5gclose_f",error, total_error)
+  CALL h5tclose_f(dtype, error)
+  CALL check("h5tclose_f",error, total_error)
+  CALL h5dclose_f(dset, error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL h5fclose_f(fid, error)
+  CALL check("h5fclose_f",error, total_error)
+
+END SUBROUTINE test_h5o_refcount
+
+!****************************************************************
+!**
+!**  test_h5o_refcount(): Test H5O visit functions.
+!**
+!****************************************************************
+
+SUBROUTINE obj_visit(total_error)
+
+  USE HDF5
+  USE TH5_MISC
+
+  USE visit_cb
+  USE ISO_C_BINDING
+  IMPLICIT NONE
+
+  INTEGER, INTENT(INOUT) :: total_error
+
+  TYPE(ovisit_ud_t), TARGET :: udata ! User-data for visiting
+  INTEGER(hid_t) :: fid = -1
+  TYPE(C_PTR) :: f_ptr
+  TYPE(C_FUNPTR) :: fun_ptr
+  CHARACTER(LEN=180) :: object_name
+  INTEGER :: ret_val
+  INTEGER :: error
+
+  ! Construct "interesting" file to visit
+  CALL build_visit_file(fid)
+
+  ! Inialize udata for testing purposes
+  udata%info(1)%path(1:1) ="."
+  udata%info(1)%type_obj = H5O_TYPE_GROUP_F
+  udata%info(2)%path(1:12) = &
+       (/"D","a","t","a","s","e","t","_","z","e","r","o"/)
+  udata%info(2)%type_obj =H5O_TYPE_DATASET_F
+  udata%info(3)%path(1:6) = &
+       (/"G","r","o","u","p","1"/)
+  udata%info(3)%type_obj = H5O_TYPE_GROUP_F
+  udata%info(4)%path(1:18) =&
+       (/"G","r","o","u","p","1","/","D","a","t","a","s","e","t","_","o","n","e"/)
+  udata%info(4)%type_obj = H5O_TYPE_DATASET_F
+  udata%info(5)%path(1:13) =&
+       (/"G","r","o","u","p","1","/","G","r","o","u","p","2"/)
+  udata%info(5)%type_obj = H5O_TYPE_GROUP_F
+  udata%info(6)%path(1:25) =&
+       (/"G","r","o","u","p","1","/","G","r","o","u","p","2","/","D","a","t","a","s","e","t","_","t","w","o"/)
+  udata%info(6)%type_obj = H5O_TYPE_DATASET_F
+  udata%info(7)%path(1:22) =&
+       (/"G","r","o","u","p","1","/","G","r","o","u","p","2","/","T","y","p","e","_","t","w","o"/)
+  udata%info(7)%type_obj = H5O_TYPE_NAMED_DATATYPE_F
+  udata%info(8)%path(1:15) =&
+       (/"G","r","o","u","p","1","/","T","y","p","e","_","o","n","e"/)
+  udata%info(8)%type_obj = H5O_TYPE_NAMED_DATATYPE_F
+  udata%info(9)%path(1:9) =&
+       (/"T","y","p","e","_","z","e","r","o"/)
+  udata%info(9)%type_obj = H5O_TYPE_NAMED_DATATYPE_F
+
+  ! Visit all the objects reachable from the root group (with file ID)
+  udata%idx = 1
+
+  fun_ptr = C_FUNLOC(visit_obj_cb)
+  f_ptr = C_LOC(udata)
+
+  ! Test h5ovisit_f
+  CALL h5ovisit_f(fid, H5_INDEX_NAME_F, H5_ITER_INC_F, fun_ptr, f_ptr, ret_val, error)
+  CALL check("h5ovisit_f", error, total_error)
+  IF(ret_val.LT.0)THEN
+     CALL check("h5ovisit_f", -1, total_error)
+  ENDIF
+
+  ! Test h5ovisit_by_name_f
+
+  object_name = "/"
+  udata%idx = 1
+
+  CALL h5ovisit_by_name_f(fid, object_name, H5_INDEX_NAME_F, H5_ITER_INC_F, fun_ptr, f_ptr, ret_val, error)
+  CALL check("h5ovisit_by_name_f", error, total_error)
+  IF(ret_val.LT.0)THEN
+     CALL check("h5ovisit_by_name_f", -1, total_error)
+  ENDIF
+
+  CALL h5fclose_f(fid, error)
+  CALL check("h5fclose_f",error, total_error)
+
+END SUBROUTINE obj_visit
+
+!****************************************************************
+!**
+!**  test_h5o_refcount(): Test H5O info functions.
+!**
+!****************************************************************
+
+SUBROUTINE obj_info(total_error)
+
+  USE HDF5
+  USE TH5_MISC
+  USE ISO_C_BINDING
+  IMPLICIT NONE
+
+  INTEGER, INTENT(INOUT) :: total_error
+
+  INTEGER(hid_t) :: fid = -1             ! File ID 
+  INTEGER(hid_t) :: gid = -1, gid2 = -1  ! Group IDs 
+  INTEGER(hid_t) :: did                  ! Dataset ID 
+  INTEGER(hid_t) :: sid                  ! Dataspace ID 
+  TYPE(hobj_ref_t_f), TARGET :: wref     ! Reference to write 
+  TYPE(hobj_ref_t_f), TARGET :: rref     ! Reference to read
+  TYPE(H5O_info_t) :: oinfo              ! Object info struct 
+  INTEGER :: error
+  TYPE(C_PTR) :: f_ptr
+
+  CHARACTER(LEN=6) :: GROUPNAME   =    "/group"
+  CHARACTER(LEN=6) :: GROUPNAME2  =    "group2"
+  CHARACTER(LEN=6) :: GROUPNAME3  =    "group3"
+  CHARACTER(LEN=5) :: DSETNAME    =    "/dset"
+  CHARACTER(LEN=5) :: DSETNAME2   =    "dset2"
+
+  ! Create file with a group and a dataset containing an object reference to the group
+  CALL h5fcreate_f("get_info.h5", H5F_ACC_TRUNC_F, fid, error)
+  CALL check("h5fcreate_f",error, total_error)
+
+  ! Create dataspace to use for dataset
+  CALL h5screate_f(H5S_SCALAR_F, sid, error)
+  CALL check("h5screate_f",error,total_error)
+
+  ! Create group to refer to
+  CALL h5gcreate_f(fid,  GROUPNAME, gid, error)
+  CALL check("h5gcreate_f",error,total_error)
+
+  ! Create nested groups 
+  CALL h5gcreate_f(gid,  GROUPNAME2, gid2, error)
+  CALL check("h5gcreate_f",error,total_error)
+  CALL h5gclose_f(gid2, error)
+  CALL check("h5gclose_f",error,total_error)
+
+  CALL h5gcreate_f(gid,  GROUPNAME3, gid2, error)
+  CALL check("h5gcreate_f",error,total_error)
+  CALL h5gclose_f(gid2, error)
+  CALL check("h5gclose_f",error,total_error)
+
+  ! Create bottom dataset
+  CALL h5dcreate_f(gid, DSETNAME2, H5T_NATIVE_INTEGER, sid, did, error)
+  CALL check("h5dcreate_f",error, total_error)
+
+  CALL h5dclose_f(did, error)
+  CALL check("h5dclose_f", error, total_error)
+
+  CALL h5gclose_f(gid, error)
+  CALL check("h5gclose_f",error,total_error)
+
+  ! Create dataset
+  CALL h5dcreate_f(fid, DSETNAME, H5T_STD_REF_OBJ, sid, did, error)
+  CALL check("h5dcreate_f",error, total_error)
+
+  f_ptr = C_LOC(wref)
+
+  ! Create reference to group
+  CALL h5rcreate_f(fid, GROUPNAME, H5R_OBJECT_F, f_ptr, error)
+  CALL check("h5rcreate_f",error, total_error)
+
+  ! Write reference to disk
+  CALL h5dwrite_f(did, H5T_STD_REF_OBJ, f_ptr, error)
+  CALL check("h5dwrite_f",error, total_error)
+
+  ! Close objects 
+  CALL h5dclose_f(did, error)
+  CALL check("h5dclose_f", error, total_error)
+  CALL h5sclose_f(sid, error)
+  CALL check("h5sclose_f", error, total_error)
+  CALL h5fclose_f(fid, error)
+  CALL check("h5fclose_f", error, total_error)
+
+  ! Re-open file
+  CALL h5fopen_f("get_info.h5", H5F_ACC_RDWR_F, fid, error)
+  CALL check("h5fopen_f", error, total_error)
+
+  ! Re-open dataset
+  CALL h5dopen_f(fid, DSETNAME, did, error)
+  CALL check("h5dopen_f", error, total_error)
+
+  ! Read in the reference
+
+  f_ptr = C_LOC(rref)
+
+  CALL h5dread_f(did, H5T_STD_REF_OBJ, f_ptr, error)
+  CALL check("H5Dread_f",error, total_error)
+
+  ! Dereference to get the group
+
+  CALL h5rdereference_f(did, H5R_OBJECT_F, f_ptr, gid, error)
+  CALL check("h5rdereference_f", error, total_error)
+
+  CALL h5oget_info_by_idx_f(gid, ".", H5_INDEX_NAME_F, H5_ITER_INC_F, 0_hsize_t, oinfo, error)
+  CALL check("h5oget_info_by_idx_f", error, total_error)
+
+  IF(oinfo%rc.NE.1)THEN
+     CALL check("h5oget_info_by_idx_f", -1, total_error)
+  ENDIF
+
+  IF(oinfo%type.NE.H5O_TYPE_DATASET_F)THEN
+     CALL check("h5oget_info_by_idx_f", -1, total_error)
+  ENDIF
+
+  ! Close objects
+  CALL h5dclose_f(did, error)
+  CALL check("h5dclose_f", error, total_error)
+  CALL h5gclose_f(gid, error)
+  CALL check("h5sclose_f", error, total_error)
+  CALL h5fclose_f(fid, error)
+  CALL check("h5fclose_f", error, total_error)
+
+END SUBROUTINE obj_info
+
+!-------------------------------------------------------------------------
+! Function:    build_visit_file
+!
+! Purpose:     Build an "interesting" file to use for visiting links & objects
+!
+! Programmer:  M. Scot Breitenfeld
+!              July 12, 2012
+!              NOTE: Adapted from C test.
+!
+!-------------------------------------------------------------------------
+!
+
+SUBROUTINE build_visit_file(fid)
+
+  USE HDF5
+  USE TH5_MISC
+  IMPLICIT NONE
+
+  INTEGER(hid_t) :: fid                  ! File ID 
+  INTEGER(hid_t) :: gid = -1, gid2 = -1     ! Group IDs
+  INTEGER(hid_t) :: sid = -1              ! Dataspace ID
+  INTEGER(hid_t) :: did = -1              ! Dataset ID
+  INTEGER(hid_t) :: tid = -1              ! Datatype ID
+  CHARACTER(LEN=20) :: filename = 'visit.h5'
+  INTEGER :: error
+  
+  ! Create file for visiting
+  CALL H5Fcreate_f(filename, H5F_ACC_TRUNC_F, fid, error)
+
+  ! Create group
+  CALL H5Gcreate_f(fid, "/Group1", gid, error)
+
+  ! Create nested group
+  CALL H5Gcreate_f(gid, "Group2", gid2, error)
+
+  ! Close groups
+  CALL h5gclose_f(gid2, error)
+  CALL h5gclose_f(gid, error)
+
+  ! Create soft links to groups created
+  CALL H5Lcreate_soft_f("/Group1", fid, "/soft_one", error)
+  CALL H5Lcreate_soft_f("/Group1/Group2", fid, "/soft_two", error)
+
+  ! Create dangling soft link
+  CALL H5Lcreate_soft_f("nowhere", fid, "/soft_dangle", error)
+
+  ! Create hard links to all groups
+  CALL H5Lcreate_hard_f(fid, "/", fid, "hard_zero", error)
+  CALL H5Lcreate_hard_f(fid, "/Group1", fid, "hard_one", error)
+  CALL H5Lcreate_hard_f(fid, "/Group1/Group2", fid, "hard_two", error)
+
+  ! Create loops w/hard links
+  CALL H5Lcreate_hard_f(fid, "/Group1", fid, "/Group1/hard_one", error)
+  CALL H5Lcreate_hard_f(fid, "/", fid, "/Group1/Group2/hard_zero", error)
+
+  ! Create dataset in each group
+  CALL H5Screate_f(H5S_SCALAR_F, sid, error)
+
+  CALL H5Dcreate_f(fid, "/Dataset_zero", H5T_NATIVE_INTEGER, sid, did, error)
+  CALL H5Dclose_f(did, error)
+
+  CALL H5Dcreate_f(fid, "/Group1/Dataset_one", H5T_NATIVE_INTEGER, sid, did, error)
+  CALL H5Dclose_f(did, error)
+
+  CALL H5Dcreate_f(fid, "/Group1/Group2/Dataset_two", H5T_NATIVE_INTEGER, sid, did, error)
+  CALL H5Dclose_f(did, error)
+
+  CALL H5Sclose_f(sid, error)
+
+  ! Create named datatype in each group
+  CALL H5Tcopy_f(H5T_NATIVE_INTEGER, tid, error)
+
+  CALL H5Tcommit_f(fid, "/Type_zero", tid, error)
+  CALL H5Tclose_f(tid, error)
+
+  CALL H5Tcopy_f(H5T_NATIVE_INTEGER, tid, error)
+  CALL H5Tcommit_f(fid, "/Group1/Type_one", tid, error)
+  CALL H5Tclose_f(tid, error)
+
+  CALL H5Tcopy_f(H5T_NATIVE_INTEGER, tid, error)
+  CALL H5Tcommit_f(fid, "/Group1/Group2/Type_two", tid, error)
+  CALL H5Tclose_f(tid, error)
+
+END SUBROUTINE build_visit_file
+
+END MODULE TH5O_F03
diff --git a/fortran/test/tH5O_F03.f90 b/fortran/test/tH5O_F03.f90
deleted file mode 100644
index 8e014f4..0000000
--- a/fortran/test/tH5O_F03.f90
+++ /dev/null
@@ -1,555 +0,0 @@
-!****h* root/fortran/test/tH5O_F03.f90
-!
-! NAME
-!  tH5O_F03.f90
-!
-! FUNCTION
-!  Test FORTRAN HDF5 H5O APIs which are dependent on FORTRAN 2003
-!  features. 
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!*****
-
-! *****************************************
-! ***        H 5 O   T E S T S
-! *****************************************
-MODULE visit_cb
-
-  USE HDF5 
-  USE ISO_C_BINDING
-  
-  IMPLICIT NONE
-
-  INTEGER, PARAMETER :: info_size = 9
-
-  !-------------------------------------------------------------------------
-  ! Function:    visit_obj_cb
-  !
-  ! Purpose:     Callback routine for visiting objects in a file
-  !
-  ! Return:      Success:        0
-  !              Failure:        -1
-  !
-  ! Programmer:  M.S. Breitenfeld
-  !              July 12, 2012
-  !              Adopted from C test.
-  !
-  !-------------------------------------------------------------------------
-  !
-  ! Object visit structs
-  TYPE, bind(c) :: obj_visit_t
-     CHARACTER(LEN=1), DIMENSION(1:180) :: path   ! Path to object
-     INTEGER :: type_obj ! type of object
-  END TYPE obj_visit_t
-
-  TYPE, bind(c) :: ovisit_ud_t
-     INTEGER :: idx              ! Index in object visit structure
-     TYPE(obj_visit_t), DIMENSION(1:info_size) :: info   ! Pointer to the object visit structure to use
-  END TYPE ovisit_ud_t
-
-CONTAINS
-
-  INTEGER FUNCTION visit_obj_cb( group_id, name, oinfo, op_data) bind(C)
-
-    IMPLICIT NONE
-
-    INTEGER(HID_T), VALUE :: group_id
-    CHARACTER(LEN=1), DIMENSION(1:180) :: name
-    TYPE(h5o_info_t) :: oinfo
-    TYPE(ovisit_ud_t) :: op_data
-
-    INTEGER :: len, i
-    INTEGER :: idx
-
-    visit_obj_cb = 0
-
-    ! Since the name is generated in C and passed to a Fortran string, it
-    ! will be NULL terminated, so we need to find the end of the string.
-
-    len = 1
-    DO len = 1, 180
-       IF(name(len) .EQ. C_NULL_CHAR) EXIT
-    ENDDO
-
-    len = len - 1
-
-    ! Check for correct object information
-
-    idx = op_data%idx
-
-    DO i = 1, len
-       IF(op_data%info(idx)%path(i)(1:1) .NE. name(i)(1:1))THEN
-          visit_obj_cb = -1
-          RETURN
-       ENDIF
-       
-       IF(op_data%info(idx)%type_obj .NE. oinfo%type)THEN
-          visit_obj_cb = -1
-          RETURN
-       ENDIF
-
-    ENDDO
-
-    ! Advance to next location in expected output
-    op_data%idx = op_data%idx + 1
-
-  END FUNCTION visit_obj_cb
-
-END MODULE visit_cb
-
-
-MODULE TH5O_F03
-
-CONTAINS
-!***************************************************************
-!**
-!**  test_h5o_refcount(): Test H5O refcounting functions.
-!**
-!***************************************************************
-
-SUBROUTINE test_h5o_refcount(total_error)
-
-  USE HDF5 
-  USE TH5_MISC
-  USE ISO_C_BINDING
-  IMPLICIT NONE
-
-  INTEGER, INTENT(INOUT) :: total_error
-
-  CHARACTER(LEN=11), PARAMETER :: FILENAME = "th5o_ref.h5"
-  INTEGER, PARAMETER :: DIM0 = 5
-  INTEGER, PARAMETER :: DIM1 = 10
-  INTEGER(hid_t) :: fid ! HDF5 File ID
-  INTEGER(hid_t) :: grp, dset, dtype, dspace ! Object identifiers
-  TYPE(h5o_info_t) :: oinfo                  ! Object info struct
-  INTEGER(hsize_t), DIMENSION(1:2) :: dims
-  INTEGER :: error                           ! Value returned from API calls
-
-  ! Create a new HDF5 file
-  CALL h5fcreate_f(FILENAME,H5F_ACC_TRUNC_F,fid,error)
-  CALL check("h5fcreate_f", error, total_error) 
-
-  ! Create a group, dataset, and committed datatype within the file
-  ! Create the group
-  CALL h5gcreate_f(fid, "group", grp, error)
-  CALL check("h5gcreate_f",error, total_error)
-
-  ! Commit the type inside the group
-  CALL h5tcopy_f(H5T_NATIVE_INTEGER, dtype, error)
-  CALL check("H5Tcopy_f",error, total_error)
-  CALL h5tcommit_f(fid, "datatype", dtype, error)
-  CALL check("h5tcommit_f", error, total_error)
-
-  ! Create the data space for the dataset.
-  dims(1) = DIM0
-  dims(2) = DIM1
-
-  CALL h5screate_simple_f(2, dims, dspace, error)
-  CALL check("h5screate_simple_f", error, total_error)
-
-  ! Create the dataset.
-  CALL h5dcreate_f(fid, "dataset", H5T_NATIVE_INTEGER, dspace, dset, error)
-  CALL check("h5dcreate_f", error, total_error)
-  CALL h5sclose_f(dspace, error)
-  CALL check("h5sclose_f", error, total_error)
-
-  ! Get ref counts for each object.  They should all be 1, since each object has a hard link.
-  CALL h5oget_info_by_name_f(fid, "group", oinfo, error)
-  CALL check("h5oget_info_by_name_f", error, total_error)
-  IF(oinfo%rc.NE.1)THEN
-     CALL check("h5oget_info_by_name_f", -1, total_error)
-  ENDIF
-  CALL h5oget_info_by_name_f(fid, "datatype", oinfo, error)
-  CALL check("h5oget_info_by_name_f", error, total_error)
-  IF(oinfo%rc.NE.1)THEN
-     CALL check("h5oget_info_by_name_f", -1, total_error)
-  ENDIF
-  CALL h5oget_info_by_name_f(fid, "dataset", oinfo, error)
-  CALL check("h5oget_info_by_name_f", error, total_error)
-  IF(oinfo%rc.NE.1)THEN
-     CALL check("h5oget_info_by_name_f", -1, total_error)
-  ENDIF
-
-  ! Check h5oget_info
-  CALL h5oget_info_f(grp, oinfo, error)
-  CALL check("h5oget_info_f", error, total_error)
-  IF(oinfo%rc.NE.1)THEN
-     CALL check("h5oget_info_f", -1, total_error)
-  ENDIF
-  IF(oinfo%type.NE.H5O_TYPE_GROUP_F)THEN
-     CALL check("h5oget_info_f", -1, total_error)
-  ENDIF
-
-  ! Increment each object's reference count.
-  CALL h5oincr_refcount_f(grp, error)
-  CALL check("h5oincr_refcount_f", error, total_error)
-  CALL h5oincr_refcount_f(dtype, error)
-  CALL check("h5oincr_refcount_f", error, total_error)
-  CALL h5oincr_refcount_f(dset, error)
-  CALL check("h5oincr_refcount_f", error, total_error)
-
-  ! Get ref counts for each object.  They should all be 2 now.
-  CALL h5oget_info_by_name_f(fid, "group", oinfo, error)
-  CALL check("h5oget_info_by_name_f", error, total_error)
-  IF(oinfo%rc.NE.2)THEN
-     CALL check("h5oget_info_by_name_f", -1, total_error)
-  ENDIF
-  CALL h5oget_info_by_name_f(fid, "datatype", oinfo, error)
-  CALL check("h5oget_info_by_name_f", error, total_error)
-  IF(oinfo%rc.NE.2)THEN
-     CALL check("h5oget_info_by_name_f", -1, total_error)
-  ENDIF
-  CALL h5oget_info_by_name_f(fid, "dataset", oinfo, error)
-  CALL check("h5oget_info_by_name_f", error, total_error)
-  IF(oinfo%rc.NE.2)THEN
-     CALL check("h5oget_info_by_name_f", -1, total_error)
-  ENDIF
-
-  ! Decrement the reference counts and check that they decrease back to 1.
-  CALL h5odecr_refcount_f(grp, error)
-  CALL check("h5oincr_refcount_f", error, total_error)
-  CALL h5odecr_refcount_f(dtype, error)
-  CALL check("h5oincr_refcount_f", error, total_error)
-  CALL h5odecr_refcount_f(dset, error)
-  CALL check("h5oincr_refcount_f", error, total_error)
-
-  CALL h5oget_info_by_name_f(fid, "group", oinfo, error)
-  CALL check("h5oget_info_by_name_f", error, total_error)
-  IF(oinfo%rc.NE.1)THEN
-     CALL check("h5oget_info_by_name_f", -1, total_error)
-  ENDIF
-  CALL h5oget_info_by_name_f(fid, "datatype", oinfo, error)
-  CALL check("h5oget_info_by_name_f", error, total_error)
-  IF(oinfo%rc.NE.1)THEN
-     CALL check("h5oget_info_by_name_f", -1, total_error)
-  ENDIF
-  CALL h5oget_info_by_name_f(fid, "dataset", oinfo, error)
-  CALL check("h5oget_info_by_name_f", error, total_error)
-  IF(oinfo%rc.NE.1)THEN
-     CALL check("h5oget_info_by_name_f", -1, total_error)
-  ENDIF
-
-  CALL h5gclose_f(grp, error)
-  CALL check("h5gclose_f",error, total_error)
-  CALL h5tclose_f(dtype, error)
-  CALL check("h5tclose_f",error, total_error)
-  CALL h5dclose_f(dset, error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL h5fclose_f(fid, error)
-  CALL check("h5fclose_f",error, total_error)
-
-END SUBROUTINE test_h5o_refcount
-
-!****************************************************************
-!**
-!**  test_h5o_refcount(): Test H5O visit functions.
-!**
-!****************************************************************
-
-SUBROUTINE obj_visit(total_error)
-
-  USE HDF5
-  USE TH5_MISC
-
-  USE visit_cb
-  USE ISO_C_BINDING
-  IMPLICIT NONE
-
-  INTEGER, INTENT(INOUT) :: total_error
-
-  TYPE(ovisit_ud_t), TARGET :: udata ! User-data for visiting
-  INTEGER(hid_t) :: fid = -1
-  TYPE(C_PTR) :: f_ptr
-  TYPE(C_FUNPTR) :: fun_ptr
-  CHARACTER(LEN=180) :: object_name
-  INTEGER :: ret_val
-  INTEGER :: error
-
-  ! Construct "interesting" file to visit
-  CALL build_visit_file(fid)
-
-  ! Inialize udata for testing purposes
-  udata%info(1)%path(1:1) ="."
-  udata%info(1)%type_obj = H5O_TYPE_GROUP_F
-  udata%info(2)%path(1:12) = &
-       (/"D","a","t","a","s","e","t","_","z","e","r","o"/)
-  udata%info(2)%type_obj =H5O_TYPE_DATASET_F
-  udata%info(3)%path(1:6) = &
-       (/"G","r","o","u","p","1"/)
-  udata%info(3)%type_obj = H5O_TYPE_GROUP_F
-  udata%info(4)%path(1:18) =&
-       (/"G","r","o","u","p","1","/","D","a","t","a","s","e","t","_","o","n","e"/)
-  udata%info(4)%type_obj = H5O_TYPE_DATASET_F
-  udata%info(5)%path(1:13) =&
-       (/"G","r","o","u","p","1","/","G","r","o","u","p","2"/)
-  udata%info(5)%type_obj = H5O_TYPE_GROUP_F
-  udata%info(6)%path(1:25) =&
-       (/"G","r","o","u","p","1","/","G","r","o","u","p","2","/","D","a","t","a","s","e","t","_","t","w","o"/)
-  udata%info(6)%type_obj = H5O_TYPE_DATASET_F
-  udata%info(7)%path(1:22) =&
-       (/"G","r","o","u","p","1","/","G","r","o","u","p","2","/","T","y","p","e","_","t","w","o"/)
-  udata%info(7)%type_obj = H5O_TYPE_NAMED_DATATYPE_F
-  udata%info(8)%path(1:15) =&
-       (/"G","r","o","u","p","1","/","T","y","p","e","_","o","n","e"/)
-  udata%info(8)%type_obj = H5O_TYPE_NAMED_DATATYPE_F
-  udata%info(9)%path(1:9) =&
-       (/"T","y","p","e","_","z","e","r","o"/)
-  udata%info(9)%type_obj = H5O_TYPE_NAMED_DATATYPE_F
-
-  ! Visit all the objects reachable from the root group (with file ID)
-  udata%idx = 1
-
-  fun_ptr = C_FUNLOC(visit_obj_cb)
-  f_ptr = C_LOC(udata)
-
-  ! Test h5ovisit_f
-  CALL h5ovisit_f(fid, H5_INDEX_NAME_F, H5_ITER_INC_F, fun_ptr, f_ptr, ret_val, error)
-  CALL check("h5ovisit_f", error, total_error)
-  IF(ret_val.LT.0)THEN
-     CALL check("h5ovisit_f", -1, total_error)
-  ENDIF
-
-  ! Test h5ovisit_by_name_f
-
-  object_name = "/"
-  udata%idx = 1
-
-  CALL h5ovisit_by_name_f(fid, object_name, H5_INDEX_NAME_F, H5_ITER_INC_F, fun_ptr, f_ptr, ret_val, error)
-  CALL check("h5ovisit_by_name_f", error, total_error)
-  IF(ret_val.LT.0)THEN
-     CALL check("h5ovisit_by_name_f", -1, total_error)
-  ENDIF
-
-  CALL h5fclose_f(fid, error)
-  CALL check("h5fclose_f",error, total_error)
-
-END SUBROUTINE obj_visit
-
-!****************************************************************
-!**
-!**  test_h5o_refcount(): Test H5O info functions.
-!**
-!****************************************************************
-
-SUBROUTINE obj_info(total_error)
-
-  USE HDF5
-  USE TH5_MISC
-  USE ISO_C_BINDING
-  IMPLICIT NONE
-
-  INTEGER, INTENT(INOUT) :: total_error
-
-  INTEGER(hid_t) :: fid = -1             ! File ID 
-  INTEGER(hid_t) :: gid = -1, gid2 = -1  ! Group IDs 
-  INTEGER(hid_t) :: did                  ! Dataset ID 
-  INTEGER(hid_t) :: sid                  ! Dataspace ID 
-  TYPE(hobj_ref_t_f), TARGET :: wref     ! Reference to write 
-  TYPE(hobj_ref_t_f), TARGET :: rref     ! Reference to read
-  TYPE(H5O_info_t) :: oinfo              ! Object info struct 
-  INTEGER :: error
-  TYPE(C_PTR) :: f_ptr
-
-  CHARACTER(LEN=6) :: GROUPNAME   =    "/group"
-  CHARACTER(LEN=6) :: GROUPNAME2  =    "group2"
-  CHARACTER(LEN=6) :: GROUPNAME3  =    "group3"
-  CHARACTER(LEN=5) :: DSETNAME    =    "/dset"
-  CHARACTER(LEN=5) :: DSETNAME2   =    "dset2"
-
-  ! Create file with a group and a dataset containing an object reference to the group
-  CALL h5fcreate_f("get_info.h5", H5F_ACC_TRUNC_F, fid, error)
-  CALL check("h5fcreate_f",error, total_error)
-
-  ! Create dataspace to use for dataset
-  CALL h5screate_f(H5S_SCALAR_F, sid, error)
-  CALL check("h5screate_f",error,total_error)
-
-  ! Create group to refer to
-  CALL h5gcreate_f(fid,  GROUPNAME, gid, error)
-  CALL check("h5gcreate_f",error,total_error)
-
-  ! Create nested groups 
-  CALL h5gcreate_f(gid,  GROUPNAME2, gid2, error)
-  CALL check("h5gcreate_f",error,total_error)
-  CALL h5gclose_f(gid2, error)
-  CALL check("h5gclose_f",error,total_error)
-
-  CALL h5gcreate_f(gid,  GROUPNAME3, gid2, error)
-  CALL check("h5gcreate_f",error,total_error)
-  CALL h5gclose_f(gid2, error)
-  CALL check("h5gclose_f",error,total_error)
-
-  ! Create bottom dataset
-  CALL h5dcreate_f(gid, DSETNAME2, H5T_NATIVE_INTEGER, sid, did, error)
-  CALL check("h5dcreate_f",error, total_error)
-
-  CALL h5dclose_f(did, error)
-  CALL check("h5dclose_f", error, total_error)
-
-  CALL h5gclose_f(gid, error)
-  CALL check("h5gclose_f",error,total_error)
-
-  ! Create dataset
-  CALL h5dcreate_f(fid, DSETNAME, H5T_STD_REF_OBJ, sid, did, error)
-  CALL check("h5dcreate_f",error, total_error)
-
-  f_ptr = C_LOC(wref)
-
-  ! Create reference to group
-  CALL h5rcreate_f(fid, GROUPNAME, H5R_OBJECT_F, f_ptr, error)
-  CALL check("h5rcreate_f",error, total_error)
-
-  ! Write reference to disk
-  CALL h5dwrite_f(did, H5T_STD_REF_OBJ, f_ptr, error)
-  CALL check("h5dwrite_f",error, total_error)
-
-  ! Close objects 
-  CALL h5dclose_f(did, error)
-  CALL check("h5dclose_f", error, total_error)
-  CALL h5sclose_f(sid, error)
-  CALL check("h5sclose_f", error, total_error)
-  CALL h5fclose_f(fid, error)
-  CALL check("h5fclose_f", error, total_error)
-
-  ! Re-open file
-  CALL h5fopen_f("get_info.h5", H5F_ACC_RDWR_F, fid, error)
-  CALL check("h5fopen_f", error, total_error)
-
-  ! Re-open dataset
-  CALL h5dopen_f(fid, DSETNAME, did, error)
-  CALL check("h5dopen_f", error, total_error)
-
-  ! Read in the reference
-
-  f_ptr = C_LOC(rref)
-
-  CALL h5dread_f(did, H5T_STD_REF_OBJ, f_ptr, error)
-  CALL check("H5Dread_f",error, total_error)
-
-  ! Dereference to get the group
-
-  CALL h5rdereference_f(did, H5R_OBJECT_F, f_ptr, gid, error)
-  CALL check("h5rdereference_f", error, total_error)
-
-  CALL h5oget_info_by_idx_f(gid, ".", H5_INDEX_NAME_F, H5_ITER_INC_F, 0_hsize_t, oinfo, error)
-  CALL check("h5oget_info_by_idx_f", error, total_error)
-
-  IF(oinfo%rc.NE.1)THEN
-     CALL check("h5oget_info_by_idx_f", -1, total_error)
-  ENDIF
-
-  IF(oinfo%type.NE.H5O_TYPE_DATASET_F)THEN
-     CALL check("h5oget_info_by_idx_f", -1, total_error)
-  ENDIF
-
-  ! Close objects
-  CALL h5dclose_f(did, error)
-  CALL check("h5dclose_f", error, total_error)
-  CALL h5gclose_f(gid, error)
-  CALL check("h5sclose_f", error, total_error)
-  CALL h5fclose_f(fid, error)
-  CALL check("h5fclose_f", error, total_error)
-
-END SUBROUTINE obj_info
-
-!-------------------------------------------------------------------------
-! Function:    build_visit_file
-!
-! Purpose:     Build an "interesting" file to use for visiting links & objects
-!
-! Programmer:  M. Scot Breitenfeld
-!              July 12, 2012
-!              NOTE: Adapted from C test.
-!
-!-------------------------------------------------------------------------
-!
-
-SUBROUTINE build_visit_file(fid)
-
-  USE HDF5
-  USE TH5_MISC
-  IMPLICIT NONE
-
-  INTEGER(hid_t) :: fid                  ! File ID 
-  INTEGER(hid_t) :: gid = -1, gid2 = -1     ! Group IDs
-  INTEGER(hid_t) :: sid = -1              ! Dataspace ID
-  INTEGER(hid_t) :: did = -1              ! Dataset ID
-  INTEGER(hid_t) :: tid = -1              ! Datatype ID
-  CHARACTER(LEN=20) :: filename = 'visit.h5'
-  INTEGER :: error
-  
-  ! Create file for visiting
-  CALL H5Fcreate_f(filename, H5F_ACC_TRUNC_F, fid, error)
-
-  ! Create group
-  CALL H5Gcreate_f(fid, "/Group1", gid, error)
-
-  ! Create nested group
-  CALL H5Gcreate_f(gid, "Group2", gid2, error)
-
-  ! Close groups
-  CALL h5gclose_f(gid2, error)
-  CALL h5gclose_f(gid, error)
-
-  ! Create soft links to groups created
-  CALL H5Lcreate_soft_f("/Group1", fid, "/soft_one", error)
-  CALL H5Lcreate_soft_f("/Group1/Group2", fid, "/soft_two", error)
-
-  ! Create dangling soft link
-  CALL H5Lcreate_soft_f("nowhere", fid, "/soft_dangle", error)
-
-  ! Create hard links to all groups
-  CALL H5Lcreate_hard_f(fid, "/", fid, "hard_zero", error)
-  CALL H5Lcreate_hard_f(fid, "/Group1", fid, "hard_one", error)
-  CALL H5Lcreate_hard_f(fid, "/Group1/Group2", fid, "hard_two", error)
-
-  ! Create loops w/hard links
-  CALL H5Lcreate_hard_f(fid, "/Group1", fid, "/Group1/hard_one", error)
-  CALL H5Lcreate_hard_f(fid, "/", fid, "/Group1/Group2/hard_zero", error)
-
-  ! Create dataset in each group
-  CALL H5Screate_f(H5S_SCALAR_F, sid, error)
-
-  CALL H5Dcreate_f(fid, "/Dataset_zero", H5T_NATIVE_INTEGER, sid, did, error)
-  CALL H5Dclose_f(did, error)
-
-  CALL H5Dcreate_f(fid, "/Group1/Dataset_one", H5T_NATIVE_INTEGER, sid, did, error)
-  CALL H5Dclose_f(did, error)
-
-  CALL H5Dcreate_f(fid, "/Group1/Group2/Dataset_two", H5T_NATIVE_INTEGER, sid, did, error)
-  CALL H5Dclose_f(did, error)
-
-  CALL H5Sclose_f(sid, error)
-
-  ! Create named datatype in each group
-  CALL H5Tcopy_f(H5T_NATIVE_INTEGER, tid, error)
-
-  CALL H5Tcommit_f(fid, "/Type_zero", tid, error)
-  CALL H5Tclose_f(tid, error)
-
-  CALL H5Tcopy_f(H5T_NATIVE_INTEGER, tid, error)
-  CALL H5Tcommit_f(fid, "/Group1/Type_one", tid, error)
-  CALL H5Tclose_f(tid, error)
-
-  CALL H5Tcopy_f(H5T_NATIVE_INTEGER, tid, error)
-  CALL H5Tcommit_f(fid, "/Group1/Group2/Type_two", tid, error)
-  CALL H5Tclose_f(tid, error)
-
-END SUBROUTINE build_visit_file
-
-END MODULE TH5O_F03
diff --git a/fortran/test/tH5P.F90 b/fortran/test/tH5P.F90
new file mode 100644
index 0000000..39d8c1e
--- /dev/null
+++ b/fortran/test/tH5P.F90
@@ -0,0 +1,677 @@
+!****h* root/fortran/test/tH5P.f90
+!
+! NAME
+!  tH5P.f90
+!
+! FUNCTION
+!  Basic testing of Fortran H5P APIs.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! CONTAINS SUBROUTINES
+!  external_test, multi_file_test
+!
+!*****
+MODULE TH5P
+  USE HDF5 ! This module contains all necessary modules 
+  USE TH5_MISC
+  USE TH5_MISC_GEN
+
+CONTAINS
+
+SUBROUTINE external_test(cleanup, total_error)
+
+!   This subroutine tests following functionalities:
+!   h5pset_external_f,  h5pget_external_count_f,
+!   h5pget_external_f
+
+  
+  IMPLICIT NONE
+  LOGICAL, INTENT(IN)  :: cleanup
+  INTEGER, INTENT(INOUT) :: total_error
+  
+  CHARACTER(LEN=8), PARAMETER :: filename = "external"
+  CHARACTER(LEN=80) :: fix_filename
+  INTEGER(HID_T) :: file_id
+  INTEGER(HID_T) :: plist_id
+  INTEGER(HID_T) :: space_id
+  INTEGER(HID_T) :: dataset_id
+  INTEGER(HSIZE_T), DIMENSION(1) :: cur_size !data space current size
+  INTEGER(HSIZE_T), DIMENSION(1) :: max_size !data space maximum size
+  CHARACTER(LEN=256) :: name !external file name
+  INTEGER(OFF_T) :: file_offset !external file offset
+  INTEGER(HSIZE_T) :: file_size   !sizeof external file segment
+  INTEGER :: error !error code
+  INTEGER(SIZE_T) :: int_size !size of integer
+  INTEGER(HSIZE_T) :: file_bytes !Number of bytes reserved
+                                 !in the file for the data
+  INTEGER :: RANK = 1 !dataset rank
+  INTEGER :: count !number of external files for the
+                   !specified dataset
+  INTEGER(SIZE_T) :: namesize
+  INTEGER(HSIZE_T) :: size, buf_size
+  INTEGER :: idx
+
+  buf_size = 4*1024*1024
+
+  !
+  !Create file "external.h5" using default properties.
+  !
+  CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+  IF (error .NE. 0) THEN
+     STOP "Cannot modify filename"
+  ENDIF
+  CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
+  CALL check("h5fcreate_f",error,total_error)
+  
+  CALL h5pcreate_f(H5P_DATASET_XFER_F, plist_id, error)
+  CALL check("h5pcreate_f", error, total_error)
+  CALL h5pset_buffer_f(plist_id, buf_size, error)
+  CALL check("h5pset_buffer_f", error, total_error)
+  CALL h5pget_buffer_f(plist_id, size, error)
+  CALL check("h5pget_buffer_f", error, total_error)
+  IF (size .NE.buf_size) THEN
+     total_error = total_error + 1
+     WRITE(*,*) "h5pget_buffer_f returned wrong size, error"
+  ENDIF
+  CALL h5pclose_f(plist_id, error)
+  CALL check("h5pclose_f", error, total_error)
+  
+  CALL h5pcreate_f(H5P_DATASET_CREATE_F, plist_id, error)
+  CALL check("h5pcreate_f",error,total_error)
+  cur_size(1) =100
+  max_size(1) = 100
+  CALL h5tget_size_f(H5T_NATIVE_INTEGER, int_size, error)
+  CALL check("h5tget_size_f",error,total_error)
+  file_size = int_size * max_size(1)
+  CALL h5pset_external_f(plist_id, "ext1.data", INT(0,off_t), file_size, error)
+  CALL check("h5pset_external_f",error,total_error)
+  CALL h5screate_simple_f(RANK, cur_size, space_id, error, max_size)
+  CALL check("h5screate_simple_f", error, total_error)
+  CALL h5dcreate_f(file_id, "dset1", H5T_NATIVE_INTEGER, space_id, &
+       dataset_id, error, plist_id)
+  CALL check("h5dcreate_f", error, total_error)
+  
+  CALL h5dclose_f(dataset_id, error)
+  CALL check("h5dclose_f", error, total_error)
+  CALL h5pclose_f(plist_id, error)
+  CALL check("h5pclose_f", error, total_error)
+  CALL h5sclose_f(space_id, error)
+  CALL check("h5sclose_f", error, total_error)
+  CALL h5fclose_f(file_id, error)
+  
+  CALL h5fopen_f(fix_filename, H5F_ACC_RDWR_F, file_id, error)
+  CALL h5dopen_f(file_id, "dset1", dataset_id, error)
+  CALL check("h5dopen_f",error,total_error)
+  
+  ! Read dataset creation information
+  CALL h5dget_create_plist_f(dataset_id, plist_id, error)
+  CALL check("h5dget_create_plist_f",error,total_error)
+  CALL h5pget_external_count_f(plist_id, count, error)
+  CALL check("h5pget_external_count_f",error,total_error)
+  IF(count .NE. 1 ) THEN
+     WRITE (*,*) "got external_count is not correct"
+     total_error = total_error + 1
+  END IF
+  namesize = 10
+  idx = 0
+  CALL h5pget_external_f(plist_id, idx, namesize, name, file_offset, &
+       file_bytes, error)
+  CALL check("h5pget_external_f",error,total_error)
+  IF(file_offset .NE. 0 ) THEN
+     WRITE (*,*) "got external file offset is not correct"
+     total_error = total_error + 1
+  END IF
+  IF(file_bytes .NE. file_size ) THEN
+     WRITE (*,*) "got external file size is not correct"
+     total_error = total_error + 1
+  END IF
+  
+  CALL h5dclose_f(dataset_id, error)
+  CALL check("h5dclose_f", error, total_error)
+  CALL h5pclose_f(plist_id, error)
+  CALL check("h5pclose_f", error, total_error)
+  CALL h5fclose_f(file_id, error)
+  CALL check("h5fclose_f", error, total_error)
+
+  IF(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+  RETURN
+END SUBROUTINE external_test
+
+SUBROUTINE multi_file_test(cleanup, total_error)
+  
+  IMPLICIT NONE
+  LOGICAL, INTENT(IN) :: cleanup
+  INTEGER, INTENT(INOUT) :: total_error
+  
+  CHARACTER(LEN=9), PARAMETER :: filename = "multidset" ! File name
+  CHARACTER(LEN=80) :: fix_filename
+  CHARACTER(LEN=4), PARAMETER :: dsetname = "dset"     ! Dataset name
+  
+  INTEGER(HID_T) :: file_id       ! File identifier
+  INTEGER(HID_T) :: dset_id       ! Dataset identifier
+  INTEGER(HID_T) :: dspace_id     ! Dataspace identifier
+  INTEGER(HID_T) :: dtype_id      ! Datatype identifier
+  INTEGER(HID_T) :: fapl, fapl_1  ! File access property list identifier
+  INTEGER, DIMENSION(0:H5FD_MEM_NTYPES_F-1) :: memb_map, memb_map_out
+  INTEGER(HID_T), DIMENSION(0:H5FD_MEM_NTYPES_F-1) :: memb_fapl, memb_fapl_out
+  CHARACTER(LEN=20), DIMENSION(0:H5FD_MEM_NTYPES_F-1) :: memb_name, memb_name_out
+  REAL, DIMENSION(0:H5FD_MEM_NTYPES_F-1) :: memb_addr, memb_addr_out
+  !INTEGER(HADDR_T), DIMENSION(0:H5FD_MEM_NTYPES_F) :: memb_addr
+  LOGICAL :: relax  = .TRUE.
+  LOGICAL :: relax_out = .TRUE.
+  
+  INTEGER(HSIZE_T), DIMENSION(2) :: dims = (/4,6/) ! Dataset dimensions
+  INTEGER     ::   rank = 2                        ! Dataset rank
+  
+  INTEGER, DIMENSION(4,6) :: dset_data, data_out ! Data buffers
+  INTEGER     ::   error ! Error flag
+  INTEGER(HID_T) :: driver
+  INTEGER     :: i, j    !general purpose integers
+  INTEGER(HSIZE_T), DIMENSION(2) :: data_dims
+  INTEGER :: mdc_nelmts
+  INTEGER(SIZE_T) :: rdcc_nelmts
+  INTEGER(SIZE_T) :: rdcc_nbytes
+  REAL :: rdcc_w0
+  memb_fapl = H5P_DEFAULT_F
+  memb_map = H5FD_MEM_SUPER_F
+  memb_addr = 0.
+  memb_map(H5FD_MEM_SUPER_F) = H5FD_MEM_SUPER_F
+  memb_addr(H5FD_MEM_SUPER_F) = 0.
+  memb_map(H5FD_MEM_BTREE_F) = H5FD_MEM_BTREE_F
+  memb_addr(H5FD_MEM_BTREE_F) = 0.1
+  memb_map(H5FD_MEM_DRAW_F)  = H5FD_MEM_DRAW_F
+  memb_addr(H5FD_MEM_DRAW_F) = 0.5
+  memb_map(H5FD_MEM_GHEAP_F) = H5FD_MEM_GHEAP_F
+  memb_addr(H5FD_MEM_GHEAP_F) = 0.2
+  memb_map(H5FD_MEM_LHEAP_F) = H5FD_MEM_LHEAP_F
+  memb_addr(H5FD_MEM_LHEAP_F) = 0.3
+  memb_map(H5FD_MEM_OHDR_F)  = H5FD_MEM_OHDR_F
+  memb_addr(H5FD_MEM_OHDR_F) = 0.4
+  
+  memb_name = ' '
+  memb_name(H5FD_MEM_SUPER_F) = '%s-s.h5'
+  memb_name(H5FD_MEM_BTREE_F) = '%s-b.h5'
+  memb_name(H5FD_MEM_DRAW_F)  = '%s-r.h5'
+  memb_name(H5FD_MEM_GHEAP_F) = '%s-g.h5'
+  memb_name(H5FD_MEM_LHEAP_F) = '%s-l.h5'
+  memb_name(H5FD_MEM_OHDR_F)  = '%s-o.h5'
+
+  !
+  ! Initialize the dset_data array.
+  !
+  DO i = 1, 4
+     DO j = 1, 6
+        dset_data(i,j) = (i-1)*6 + j
+     END DO
+  END DO
+  
+  !
+  ! Create a new file using default properties.
+  !
+  CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+  IF (error .NE. 0) THEN
+     WRITE(*,*) "Cannot modify filename"
+     STOP
+  ENDIF
+  CALL h5pcreate_f(H5P_FILE_ACCESS_F, fapl, error)
+  CALL check("h5pcreate_f", error, total_error)
+  CALL h5pset_fapl_multi_f(fapl, memb_map, memb_fapl, memb_name, memb_addr, relax, error)
+  CALL check("h5pset_fapl_multi_f", error, total_error)
+  CALL h5pget_fapl_multi_f(fapl, memb_map_out, memb_fapl_out, memb_name_out, &
+       memb_addr_out, relax_out, error)
+  CALL check("h5pget_fapl_multi_f", error, total_error)
+  CALL h5pget_driver_f(fapl, driver, error)
+  CALL check("h5pget_driver_f",error, total_error)
+  IF(driver .NE. H5FD_MULTI_F) THEN
+     WRITE(*,*) "Wrong value for driver"
+  ENDIF
+  !
+  ! Let's check h5pget(set)cache_f APIs here for now
+  !
+  CALL h5pget_cache_f(fapl, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, &
+       rdcc_w0, error)
+  CALL check("h5pget_cache_f", error, total_error)  
+  
+  !
+  ! Set cache to some number
+  !
+  rdcc_nbytes = 1024*1024
+  CALL h5pset_cache_f(fapl, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, &
+       rdcc_w0, error)
+  CALL check("h5pset_cache_f", error, total_error)
+  CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error, access_prp = fapl)
+  CALL check("h5fcreate_f", error, total_error)
+  IF(error .NE. 0) THEN
+     WRITE(*,*) "Cannot create file using multi-file driver... Exiting...."
+     total_error = 1
+     CALL h5pclose_f(fapl, error)
+     RETURN
+  ENDIF
+  !
+  ! Create the dataspace.
+  !
+  CALL h5screate_simple_f(rank, dims, dspace_id, error)
+  CALL check("h5screate_simple_f", error, total_error)
+  !
+  ! Create the dataset with default properties.
+  !
+  CALL h5dcreate_f(file_id, dsetname, H5T_NATIVE_INTEGER, dspace_id, &
+       dset_id, error)
+  CALL check("h5dcreate_f", error, total_error)
+  !
+  ! Write the dataset.
+  !
+  data_dims(1) = 4
+  data_dims(2) = 6
+  CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, dset_data, data_dims, error)
+  CALL check("h5dwrite_f", error, total_error)
+  !
+  ! End access to the dataset and release resources used by it.
+  !
+  CALL h5dclose_f(dset_id, error)
+  CALL check("h5dclose_f", error, total_error)
+  
+  !
+  ! Terminate access to the data space.
+  !
+  CALL h5sclose_f(dspace_id, error)
+  CALL check("h5sclose_f", error, total_error)
+  
+  !
+  ! Close the file.
+  !
+  CALL h5fclose_f(file_id, error)
+  CALL check("h5fclose_f", error, total_error)
+  CALL h5pclose_f(fapl, error)
+  CALL check("h5pclose_f", error, total_error)
+  !
+  ! Open the existing file.
+  !
+  CALL h5pcreate_f(H5P_FILE_ACCESS_F, fapl, error)
+  CALL check("h5pcreate_f", error, total_error)
+  CALL h5pset_fapl_multi_f(fapl, memb_map, memb_fapl, memb_name, memb_addr, relax, error)
+  CALL check("h5pset_fapl_multi_f", error, total_error)
+  CALL h5fopen_f (fix_filename, H5F_ACC_RDWR_F, file_id, error, access_prp = fapl)
+  CALL check("h5fopen_f", error, total_error)
+  !
+  CALL h5fget_access_plist_f(file_id, fapl_1, error)
+  CALL check("h5fget_access_plist_f", error, total_error)
+  !It doesn't work on Windows.
+  !CALL h5pget_fapl_multi_f(fapl_1, memb_map_out, memb_fapl_out, memb_name_out, &
+  !                         memb_addr_out, relax_out, error)
+  ! write(*,*)  memb_map_out
+  ! write(*,*)  memb_fapl_out
+  ! write(*,*)  memb_name_out
+  ! write(*,*)  memb_addr_out
+  !    CALL check("h5pget_fapl_multi_f", error, total_error)
+  
+  !
+  ! Open the existing dataset.
+  !
+  CALL h5dopen_f(file_id, dsetname, dset_id, error)
+  CALL check("h5dopen_f", error, total_error)
+  
+  !
+  ! Get the dataset type.
+  !
+  CALL h5dget_type_f(dset_id, dtype_id, error)
+  CALL check("h5dget_type_f", error, total_error)
+  
+  !
+  ! Get the data space.
+  !
+  CALL h5dget_space_f(dset_id, dspace_id, error)
+  CALL check("h5dget_space_f", error, total_error)
+  
+  !
+  ! Read the dataset.
+  !
+  CALL h5dread_f(dset_id, H5T_NATIVE_INTEGER, data_out, data_dims, error)
+  CALL check("h5dread_f", error, total_error)
+  
+  !
+  !Compare the data.
+  !
+  DO i = 1, 4
+     DO j = 1, 6
+        IF (data_out(i,j) .NE. dset_data(i, j)) THEN
+           WRITE(*, *) "dataset test error occured"
+           WRITE(*,*) "data read is not the same as the data writen"
+        END IF
+     END DO
+  END DO
+  
+  !
+  ! End access to the dataset and release resources used by it.
+  !
+  CALL h5dclose_f(dset_id, error)
+  CALL check("h5dclose_f", error, total_error)
+  
+  !
+  ! Terminate access to the data space.
+  !
+  CALL h5sclose_f(dspace_id, error)
+  CALL check("h5sclose_f", error, total_error)
+  
+  !
+  ! Terminate access to the data type.
+  !
+  CALL h5tclose_f(dtype_id, error)
+  CALL check("h5tclose_f", error, total_error)
+  !
+  ! Close the file.
+  !
+  CALL h5fclose_f(file_id, error)
+  CALL check("h5fclose_f", error, total_error)
+  CALL h5pclose_f(fapl, error)
+  CALL check("h5pclose_f", error, total_error)
+  CALL h5pclose_f(fapl_1, error)
+  CALL check("h5pclose_f", error, total_error)
+  IF(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+  
+  IF(cleanup) CALL h5_cleanup_f(filename//'.h5-b', H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+  IF(cleanup) CALL h5_cleanup_f(filename//'.h5-g', H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+  IF(cleanup) CALL h5_cleanup_f(filename//'.h5-l', H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+  IF(cleanup) CALL h5_cleanup_f(filename//'.h5-o', H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+  IF(cleanup) CALL h5_cleanup_f(filename//'.h5-r', H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+  IF(cleanup) CALL h5_cleanup_f(filename//'.h5-s', H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+  
+  RETURN
+END SUBROUTINE multi_file_test
+
+!-------------------------------------------------------------------------
+! Function: test_chunk_cache
+!
+! Purpose: Tests APIs:
+!            H5P_H5PSET_CHUNK_CACHE_F
+!            H5P_H5PGET_CHUNK_CACHE_F
+!            H5D_H5DGET_ACCESS_PLIST_F
+!
+! Return:      Success: 0
+!              Failure: -1
+!
+! C Programmer:  Neil Fortner
+!                Wednesday, October 29, 2008
+!
+! FORTRAN Programmer: M. Scot Breitenfeld
+!                     April 16, 2009
+!-------------------------------------------------------------------------
+!
+SUBROUTINE test_chunk_cache(cleanup, total_error)
+  
+  IMPLICIT NONE
+  LOGICAL, INTENT(IN)  :: cleanup
+  INTEGER, INTENT(INOUT) :: total_error
+  
+  CHARACTER(LEN=14), PARAMETER :: filename="chunk_cache"
+  CHARACTER(LEN=80) :: fix_filename
+  INTEGER(hid_t) :: fid = -1        ! File ID 
+  INTEGER(hid_t) :: fapl_local = -1 !  Local fapl 
+  INTEGER(hid_t) :: fapl_def = -1  !  Default fapl 
+  INTEGER(hid_t) :: dcpl = -1      ! Dataset creation property list ID 
+  INTEGER(hid_t) :: dapl1 = -1     ! Dataset access property list ID 
+  INTEGER(hid_t) :: dapl2 = -1     ! Dataset access property list ID 
+  INTEGER(hid_t) :: sid = -1       ! Dataspace ID 
+  INTEGER(hid_t) :: dsid = -1      ! Dataset ID 
+  INTEGER(hsize_t), DIMENSION(1:1) :: chunk_dim, NDIM = (/100/) ! Dataset and chunk dimensions 
+  INTEGER(size_t) :: nslots_1, nslots_2, nslots_3, nslots_4 ! rdcc number of elements 
+  INTEGER(size_t) :: nbytes_1, nbytes_2, nbytes_3, nbytes_4 ! rdcc number of bytes 
+  INTEGER :: mdc_nelmts
+  INTEGER(size_t) ::nlinks         ! Number of link traversals 
+  REAL :: w0_1, w0_2, w0_3, w0_4 ! rdcc preemption policy 
+  INTEGER :: error
+  INTEGER(size_t) rdcc_nelmts
+  INTEGER(size_t) rdcc_nbytes
+  REAL :: rdcc_w0
+
+  CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+  IF (error .NE. 0) THEN
+     WRITE(*,*) "Cannot modify filename"
+     STOP
+  ENDIF
+
+  ! Create a default fapl and dapl 
+  CALL H5Pcreate_f(H5P_FILE_ACCESS_F, fapl_def, error)
+  CALL check("H5Pcreate_f", error, total_error)
+  CALL H5Pcreate_f(H5P_DATASET_ACCESS_F, dapl1, error)
+  CALL check("H5Pcreate_f", error, total_error)
+
+  !  Verify that H5Pget_chunk_cache(dapl) returns the same values as are in
+  !  the default fapl.
+  ! 
+  CALL H5Pget_cache_f(fapl_def, mdc_nelmts, nslots_1, nbytes_1, w0_1, error)
+  CALL check("H5Pget_cache_f", error, total_error)
+  CALL H5Pget_chunk_cache_f(dapl1, nslots_4, nbytes_4, w0_4, error)
+  CALL check("H5Pget_chunk_cache_f", error, total_error)
+  CALL verify("H5Pget_chunk_cache_f", nslots_1, nslots_4, total_error)
+  CALL verify("H5Pget_chunk_cache_f", nbytes_1, nbytes_4, total_error)
+  CALL verify("H5Pget_chunk_cache_f", w0_1, w0_4, total_error)
+
+  !  Set a lapl property on dapl1 (to verify inheritance) 
+  CALL H5Pset_nlinks_f(dapl1, 134_size_t , error)
+  CALL check("H5Pset_nlinks_f", error, total_error)
+  CALL H5Pget_nlinks_f(dapl1, nlinks, error)
+  CALL check("H5Pget_nlinks_f", error, total_error)
+  CALL verify("H5Pget_nlinks_f", INT(nlinks), 134, total_error)
+
+
+  CALL h5pcreate_f(H5P_FILE_ACCESS_F, fapl_local, error)
+  CALL check("h5pcreate_f", error, total_error)
+  ! Turn off the chunk cache, so all the chunks are immediately written to disk
+  CALL H5Pget_cache_f(fapl_local, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0, error)
+  CALL check("H5Pget_cache_f", error, total_error)
+  rdcc_nbytes = 0
+  CALL H5Pset_cache_f(fapl_local, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0, error)
+  CALL check("H5Pset_cache_f", error, total_error)
+
+  ! Set new rdcc settings on fapl!
+  nslots_2 = nslots_1 * 2
+  nbytes_2 = nbytes_1 * 2
+  w0_2 = w0_1 / 2.
+
+  CALL H5Pset_cache_f(fapl_local, 0, nslots_2, nbytes_2, w0_2, error)
+  CALL check("H5Pset_cache_f", error, total_error)
+
+  ! Create file 
+  CALL H5Fcreate_f(fix_filename, H5F_ACC_TRUNC_F, fid, error,  H5P_DEFAULT_F, fapl_local)
+  CALL check("H5Fcreate_f", error, total_error)
+
+  ! Create dataset creation property list 
+  CALL H5Pcreate_f(H5P_DATASET_CREATE_F, dcpl, error)
+  CALL check("H5Pcreate_f", error, total_error)
+
+  ! Set chunking 
+  chunk_dim(1) = 10
+  CALL H5Pset_chunk_f(dcpl, 1, chunk_dim, error)
+  CALL check("H5Pset_chunk_f", error, total_error)
+
+  ! Create 1-D dataspace 
+  ndim(1) = 100
+  CALL H5Screate_simple_f(1, ndim, sid, error)
+  CALL check("H5Pcreate_f", error, total_error)
+
+  !  Create dataset with default dapl 
+  CALL H5Dcreate_f(fid, "dset", H5T_NATIVE_INTEGER, sid, dsid, error,  dcpl, H5P_DEFAULT_F,  dapl1)
+  CALL check("H5Pcreate_f", error, total_error)
+ 
+  !  Retrieve dapl from dataset, verify cache values are the same as on fapl_local 
+  CALL H5Dget_access_plist_f(dsid, dapl2, error)
+  CALL check("H5Dget_access_plist_f", error, total_error)
+  CALL H5Pget_chunk_cache_f(dapl2, nslots_4, nbytes_4, w0_4, error)
+  CALL check("H5Pget_chunk_cache_f", error, total_error)
+  CALL verify("H5Pget_chunk_cache_f", INT(nslots_2), INT(nslots_4), total_error)
+  CALL verify("H5Pget_chunk_cache_f", INT(nbytes_2), INT(nbytes_4), total_error)
+  CALL verify("H5Pget_chunk_cache_f", w0_2, w0_4, total_error)
+  CALL H5Pclose_f(dapl2,error) 
+  CALL check("H5Pclose_f", error, total_error)
+  
+  ! Set new values on dapl1.  nbytes will be set to default, so the file
+  ! property will override this setting
+
+  nslots_3 = nslots_2 * 2
+  nbytes_3 = H5D_CHUNK_CACHE_NBYTES_DFLT_F
+  w0_3 = w0_2 / 2
+
+  CALL H5Pset_chunk_cache_f(dapl1, nslots_3, nbytes_3, w0_3, error)
+  CALL check("H5Pset_chunk_cache_f", error, total_error)
+
+  ! Close dataset, reopen with dapl1.  Note the use of a dapl with H5Oopen 
+  CALL H5Dclose_f(dsid, error)
+  CALL H5Oopen_f(fid, "dset", dsid, error, dapl1)
+
+  ! Retrieve dapl from dataset, verfiy cache values are the same as on dapl1
+  !
+  ! Note we rely on the knowledge that H5Pget_chunk_cache retrieves these
+  ! values directly from the dataset structure, and not from a copy of the
+  ! dapl used to open the dataset (which is not preserved).
+  !
+  CALL H5Dget_access_plist_f(dsid, dapl2, error)
+  CALL check("H5Dget_access_plist_f", error, total_error)
+  CALL H5Pget_chunk_cache_f(dapl2, nslots_4, nbytes_4, w0_4, error)
+  CALL check("H5Pget_chunk_cache_f", error, total_error)
+  CALL verify("H5Pget_chunk_cache_f", INT(nslots_3), INT(nslots_4), total_error)
+  CALL verify("H5Pget_chunk_cache_f", INT(nbytes_2), INT(nbytes_4), total_error)
+  CALL verify("H5Pget_chunk_cache_f", w0_3, w0_4, total_error)
+  CALL H5Pclose_f(dapl2,error)
+  CALL check("H5Pclose_f", error, total_error)
+
+  ! Close dataset, reopen with H5P_DEFAULT as dapl
+  CALL H5Dclose_f(dsid, error)
+  CALL check("H5Dclose_f", error, total_error)
+  CALL H5Oopen_f(fid, "dset", dsid, error)
+  CALL check("H5Oopen_f", error, total_error)
+
+  ! Retrieve dapl from dataset, verfiy cache values are the same as on fapl_local
+
+  CALL H5Dget_access_plist_f(dsid, dapl2, error)
+  CALL check("H5Dget_access_plist_f", error, total_error)
+  CALL H5Pget_chunk_cache_f(dapl2, nslots_4, nbytes_4, w0_4, error)
+  CALL check("H5Pget_chunk_cache_f", error, total_error)
+  CALL verify("H5Pget_chunk_cache_f", INT(nslots_2), INT(nslots_4), total_error)
+  CALL verify("H5Pget_chunk_cache_f", INT(nbytes_2), INT(nbytes_4), total_error)
+  CALL verify("H5Pget_chunk_cache_f", w0_2, w0_4, total_error)
+  CALL H5Pclose_f(dapl2,error) 
+  CALL check("H5Pclose_f", error, total_error)
+
+  ! Similary, test use of H5Dcreate2 with H5P_DEFAULT
+  CALL H5Dclose_f(dsid, error) 
+  CALL check("H5Dclose_f", error, total_error)
+
+  CALL H5Dcreate_f(fid, "dset2", H5T_NATIVE_INTEGER, sid, dsid, error,  dcpl, H5P_DEFAULT_F,  H5P_DEFAULT_F)
+  CALL check("H5Pcreate_f", error, total_error)
+
+  CALL H5Dget_access_plist_f(dsid, dapl2, error)
+  CALL check("H5Dget_access_plist_f", error, total_error)
+
+  CALL H5Pget_chunk_cache_f(dapl2, nslots_4, nbytes_4, w0_4, error)
+  CALL check("H5Pget_chunk_cache_f", error, total_error)
+  CALL verify("H5Pget_chunk_cache_f", INT(nslots_2), INT(nslots_4), total_error)
+  CALL verify("H5Pget_chunk_cache_f", INT(nbytes_2), INT(nbytes_4), total_error)
+  CALL verify("H5Pget_chunk_cache_f", w0_2, w0_4, total_error)
+  ! Don't close dapl2, we will use it in the next section
+
+  ! Modify cache values on fapl_local
+  nbytes_3 = nbytes_2 * 2
+
+  CALL H5Pset_cache_f(fapl_local, 0, nslots_3, nbytes_3, w0_3, error)
+  CALL check("H5Pset_cache_f", error, total_error)
+
+  !  Close and reopen file with new fapl_local
+  
+  CALL H5Dclose_f(dsid, error)
+  CALL check("H5Dclose_f", error, total_error)
+  CALL H5Fclose_f(fid,error)
+  CALL check("h5fclose_f", error, total_error)
+
+  CALL H5Fopen_f (fix_filename, H5F_ACC_RDWR_F, fid, error, fapl_local)
+  CALL check("h5fopen_f", error, total_error)
+
+  ! Verify that dapl2 retrieved earlier (using values from the old fapl)
+  ! sets its values in the new file (test use of H5Dopen2 with a dapl)
+  !
+  
+  CALL h5dopen_f (fid, "dset", dsid, error, dapl2)
+  CALL check("h5dopen_f", error, total_error)
+  
+  CALL H5Pclose_f(dapl2,error)
+  CALL check("H5Pclose_f", error, total_error) ! Close dapl2, to avoid id leak
+  
+  CALL H5Dget_access_plist_f(dsid, dapl2, error)
+  CALL check("H5Dget_access_plist_f", error, total_error)
+  CALL H5Pget_chunk_cache_f(dapl2, nslots_4, nbytes_4, w0_4, error)
+  CALL check("H5Pget_chunk_cache_f", error, total_error)
+  CALL verify("H5Pget_chunk_cache_f", INT(nslots_2), INT(nslots_4), total_error)
+  CALL verify("H5Pget_chunk_cache_f", INT(nbytes_2), INT(nbytes_4), total_error)
+  CALL verify("H5Pget_chunk_cache_f", w0_2, w0_4, total_error)
+
+  ! Test H5D_CHUNK_CACHE_NSLOTS_DEFAULT and H5D_CHUNK_CACHE_W0_DEFAULT
+  nslots_2 = H5D_CHUNK_CACHE_NSLOTS_DFLT_F
+  w0_2 = H5D_CHUNK_CACHE_W0_DFLT_F
+
+  CALL H5Pset_chunk_cache_f(dapl2, nslots_2, nbytes_2, w0_2, error)
+  CALL check("H5Pset_chunk_cache_f", error, total_error)
+
+  CALL H5Dclose_f(dsid, error)
+  CALL check("H5Dclose_f", error, total_error)
+  CALL h5dopen_f (fid, "dset", dsid, error, dapl2)
+  CALL check("h5dopen_f", error, total_error)
+
+  CALL H5Pclose_f(dapl2,error)
+  CALL check("H5Pclose_f", error, total_error)
+
+  CALL H5Dget_access_plist_f(dsid, dapl2, error)
+  CALL check("H5Dget_access_plist_f", error, total_error)
+  CALL H5Pget_chunk_cache_f(dapl2, nslots_4, nbytes_4, w0_4, error)
+  CALL check("H5Pget_chunk_cache_f", error, total_error)
+  CALL verify("H5Pget_chunk_cache_f", INT(nslots_3), INT(nslots_4), total_error)
+  CALL verify("H5Pget_chunk_cache_f", INT(nbytes_2), INT(nbytes_4), total_error)
+  CALL verify("H5Pget_chunk_cache_f", w0_3, w0_4, total_error)
+
+! Close
+
+  CALL H5Dclose_f(dsid, error)
+  CALL check("H5Dclose_f", error, total_error)
+  CALL H5Sclose_f(sid,error)
+  CALL check("H5Sclose_f", error, total_error)
+  CALL H5Pclose_f(fapl_local,error)
+  CALL check("H5Pclose_f", error, total_error) 
+  CALL H5Pclose_f(fapl_def,error)
+  CALL check("H5Pclose_f", error, total_error) 
+  CALL H5Pclose_f(dapl1,error)
+  CALL check("H5Pclose_f", error, total_error) 
+  CALL H5Pclose_f(dapl2,error)
+  CALL check("H5Pclose_f", error, total_error) 
+  CALL H5Pclose_f(dcpl,error)
+  CALL check("H5Pclose_f", error, total_error) 
+  CALL H5Fclose_f(fid,error)
+  CALL check("H5Fclose_f", error, total_error)
+
+  IF(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+
+END SUBROUTINE test_chunk_cache
+
+END MODULE TH5P
diff --git a/fortran/test/tH5P.f90 b/fortran/test/tH5P.f90
deleted file mode 100644
index 7dcc580..0000000
--- a/fortran/test/tH5P.f90
+++ /dev/null
@@ -1,696 +0,0 @@
-!****h* root/fortran/test/tH5P.f90
-!
-! NAME
-!  tH5P.f90
-!
-! FUNCTION
-!  Basic testing of Fortran H5P APIs.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! CONTAINS SUBROUTINES
-!  external_test, multi_file_test
-!
-!*****
-MODULE TH5P
-
-CONTAINS
-
-SUBROUTINE external_test(cleanup, total_error)
-
-!   This subroutine tests following functionalities:
-!   h5pset_external_f,  h5pget_external_count_f,
-!   h5pget_external_f
-
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-  
-  IMPLICIT NONE
-  LOGICAL, INTENT(IN)  :: cleanup
-  INTEGER, INTENT(INOUT) :: total_error
-  
-  CHARACTER(LEN=8), PARAMETER :: filename = "external"
-  CHARACTER(LEN=80) :: fix_filename
-  INTEGER(HID_T) :: file_id
-  INTEGER(HID_T) :: plist_id
-  INTEGER(HID_T) :: space_id
-  INTEGER(HID_T) :: dataset_id
-  INTEGER(HSIZE_T), DIMENSION(1) :: cur_size !data space current size
-  INTEGER(HSIZE_T), DIMENSION(1) :: max_size !data space maximum size
-  CHARACTER(LEN=256) :: name !external file name
-  INTEGER(OFF_T) :: file_offset !external file offset
-  INTEGER(HSIZE_T) :: file_size   !sizeof external file segment
-  INTEGER :: error !error code
-  INTEGER(SIZE_T) :: int_size !size of integer
-  INTEGER(HSIZE_T) :: file_bytes !Number of bytes reserved
-                                 !in the file for the data
-  INTEGER :: RANK = 1 !dataset rank
-  INTEGER :: count !number of external files for the
-                   !specified dataset
-  INTEGER(SIZE_T) :: namesize
-  INTEGER(HSIZE_T) :: size, buf_size
-  INTEGER :: idx
-
-  buf_size = 4*1024*1024
-
-  !
-  !Create file "external.h5" using default properties.
-  !
-  CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
-  IF (error .NE. 0) THEN
-     STOP "Cannot modify filename"
-  ENDIF
-  CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
-  CALL check("h5fcreate_f",error,total_error)
-  
-  CALL h5pcreate_f(H5P_DATASET_XFER_F, plist_id, error)
-  CALL check("h5pcreate_f", error, total_error)
-  CALL h5pset_buffer_f(plist_id, buf_size, error)
-  CALL check("h5pset_buffer_f", error, total_error)
-  CALL h5pget_buffer_f(plist_id, size, error)
-  CALL check("h5pget_buffer_f", error, total_error)
-  IF (size .NE.buf_size) THEN
-     total_error = total_error + 1
-     WRITE(*,*) "h5pget_buffer_f returned wrong size, error"
-  ENDIF
-  CALL h5pclose_f(plist_id, error)
-  CALL check("h5pclose_f", error, total_error)
-  
-  CALL h5pcreate_f(H5P_DATASET_CREATE_F, plist_id, error)
-  CALL check("h5pcreate_f",error,total_error)
-  cur_size(1) =100
-  max_size(1) = 100
-  CALL h5tget_size_f(H5T_NATIVE_INTEGER, int_size, error)
-  CALL check("h5tget_size_f",error,total_error)
-  file_size = int_size * max_size(1)
-  CALL h5pset_external_f(plist_id, "ext1.data", INT(0,off_t), file_size, error)
-  CALL check("h5pset_external_f",error,total_error)
-  CALL h5screate_simple_f(RANK, cur_size, space_id, error, max_size)
-  CALL check("h5screate_simple_f", error, total_error)
-  CALL h5dcreate_f(file_id, "dset1", H5T_NATIVE_INTEGER, space_id, &
-       dataset_id, error, plist_id)
-  CALL check("h5dcreate_f", error, total_error)
-  
-  CALL h5dclose_f(dataset_id, error)
-  CALL check("h5dclose_f", error, total_error)
-  CALL h5pclose_f(plist_id, error)
-  CALL check("h5pclose_f", error, total_error)
-  CALL h5sclose_f(space_id, error)
-  CALL check("h5sclose_f", error, total_error)
-  CALL h5fclose_f(file_id, error)
-  
-  CALL h5fopen_f(fix_filename, H5F_ACC_RDWR_F, file_id, error)
-  CALL h5dopen_f(file_id, "dset1", dataset_id, error)
-  CALL check("h5dopen_f",error,total_error)
-  
-  ! Read dataset creation information
-  CALL h5dget_create_plist_f(dataset_id, plist_id, error)
-  CALL check("h5dget_create_plist_f",error,total_error)
-  CALL h5pget_external_count_f(plist_id, count, error)
-  CALL check("h5pget_external_count_f",error,total_error)
-  IF(count .NE. 1 ) THEN
-     WRITE (*,*) "got external_count is not correct"
-     total_error = total_error + 1
-  END IF
-  namesize = 10
-  idx = 0
-  CALL h5pget_external_f(plist_id, idx, namesize, name, file_offset, &
-       file_bytes, error)
-  CALL check("h5pget_external_f",error,total_error)
-  IF(file_offset .NE. 0 ) THEN
-     WRITE (*,*) "got external file offset is not correct"
-     total_error = total_error + 1
-  END IF
-  IF(file_bytes .NE. file_size ) THEN
-     WRITE (*,*) "got external file size is not correct"
-     total_error = total_error + 1
-  END IF
-  
-  CALL h5dclose_f(dataset_id, error)
-  CALL check("h5dclose_f", error, total_error)
-  CALL h5pclose_f(plist_id, error)
-  CALL check("h5pclose_f", error, total_error)
-  CALL h5fclose_f(file_id, error)
-  CALL check("h5fclose_f", error, total_error)
-
-  IF(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-  RETURN
-END SUBROUTINE external_test
-
-SUBROUTINE multi_file_test(cleanup, total_error)
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-  
-  IMPLICIT NONE
-  LOGICAL, INTENT(IN) :: cleanup
-  INTEGER, INTENT(INOUT) :: total_error
-  
-  CHARACTER(LEN=9), PARAMETER :: filename = "multidset" ! File name
-  CHARACTER(LEN=80) :: fix_filename
-  CHARACTER(LEN=4), PARAMETER :: dsetname = "dset"     ! Dataset name
-  
-  INTEGER(HID_T) :: file_id       ! File identifier
-  INTEGER(HID_T) :: dset_id       ! Dataset identifier
-  INTEGER(HID_T) :: dspace_id     ! Dataspace identifier
-  INTEGER(HID_T) :: dtype_id      ! Datatype identifier
-  INTEGER(HID_T) :: fapl, fapl_1  ! File access property list identifier
-  INTEGER, DIMENSION(0:H5FD_MEM_NTYPES_F-1) :: memb_map, memb_map_out
-  INTEGER(HID_T), DIMENSION(0:H5FD_MEM_NTYPES_F-1) :: memb_fapl, memb_fapl_out
-  CHARACTER(LEN=20), DIMENSION(0:H5FD_MEM_NTYPES_F-1) :: memb_name, memb_name_out
-  REAL, DIMENSION(0:H5FD_MEM_NTYPES_F-1) :: memb_addr, memb_addr_out
-  !INTEGER(HADDR_T), DIMENSION(0:H5FD_MEM_NTYPES_F) :: memb_addr
-  LOGICAL :: relax  = .TRUE.
-  LOGICAL :: relax_out = .TRUE.
-  
-  INTEGER(HSIZE_T), DIMENSION(2) :: dims = (/4,6/) ! Dataset dimensions
-  INTEGER     ::   rank = 2                        ! Dataset rank
-  
-  INTEGER, DIMENSION(4,6) :: dset_data, data_out ! Data buffers
-  INTEGER     ::   error ! Error flag
-  INTEGER(HID_T) :: driver
-  INTEGER     :: i, j    !general purpose integers
-  INTEGER(HSIZE_T), DIMENSION(2) :: data_dims
-  INTEGER :: mdc_nelmts
-  INTEGER(SIZE_T) :: rdcc_nelmts
-  INTEGER(SIZE_T) :: rdcc_nbytes
-  REAL :: rdcc_w0
-  memb_fapl = H5P_DEFAULT_F
-  memb_map = H5FD_MEM_SUPER_F
-  memb_addr = 0.
-  memb_map(H5FD_MEM_SUPER_F) = H5FD_MEM_SUPER_F
-  memb_addr(H5FD_MEM_SUPER_F) = 0.
-  memb_map(H5FD_MEM_BTREE_F) = H5FD_MEM_BTREE_F
-  memb_addr(H5FD_MEM_BTREE_F) = 0.1
-  memb_map(H5FD_MEM_DRAW_F)  = H5FD_MEM_DRAW_F
-  memb_addr(H5FD_MEM_DRAW_F) = 0.5
-  memb_map(H5FD_MEM_GHEAP_F) = H5FD_MEM_GHEAP_F
-  memb_addr(H5FD_MEM_GHEAP_F) = 0.2
-  memb_map(H5FD_MEM_LHEAP_F) = H5FD_MEM_LHEAP_F
-  memb_addr(H5FD_MEM_LHEAP_F) = 0.3
-  memb_map(H5FD_MEM_OHDR_F)  = H5FD_MEM_OHDR_F
-  memb_addr(H5FD_MEM_OHDR_F) = 0.4
-  
-  memb_name = ' '
-  memb_name(H5FD_MEM_SUPER_F) = '%s-s.h5'
-  memb_name(H5FD_MEM_BTREE_F) = '%s-b.h5'
-  memb_name(H5FD_MEM_DRAW_F)  = '%s-r.h5'
-  memb_name(H5FD_MEM_GHEAP_F) = '%s-g.h5'
-  memb_name(H5FD_MEM_LHEAP_F) = '%s-l.h5'
-  memb_name(H5FD_MEM_OHDR_F)  = '%s-o.h5'
-
-  !
-  ! Initialize the dset_data array.
-  !
-  DO i = 1, 4
-     DO j = 1, 6
-        dset_data(i,j) = (i-1)*6 + j
-     END DO
-  END DO
-  
-  !
-  ! Create a new file using default properties.
-  !
-  CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
-  IF (error .NE. 0) THEN
-     WRITE(*,*) "Cannot modify filename"
-     STOP
-  ENDIF
-  CALL h5pcreate_f(H5P_FILE_ACCESS_F, fapl, error)
-  CALL check("h5pcreate_f", error, total_error)
-  CALL h5pset_fapl_multi_f(fapl, memb_map, memb_fapl, memb_name, memb_addr, relax, error)
-  CALL check("h5pset_fapl_multi_f", error, total_error)
-  CALL h5pget_fapl_multi_f(fapl, memb_map_out, memb_fapl_out, memb_name_out, &
-       memb_addr_out, relax_out, error)
-  CALL check("h5pget_fapl_multi_f", error, total_error)
-  CALL h5pget_driver_f(fapl, driver, error)
-  CALL check("h5pget_driver_f",error, total_error)
-  IF(driver .NE. H5FD_MULTI_F) THEN
-     WRITE(*,*) "Wrong value for driver"
-  ENDIF
-  !
-  ! Let's check h5pget(set)cache_f APIs here for now
-  !
-  CALL h5pget_cache_f(fapl, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, &
-       rdcc_w0, error)
-  CALL check("h5pget_cache_f", error, total_error)  
-  
-  !
-  ! Set cache to some number
-  !
-  rdcc_nbytes = 1024*1024
-  CALL h5pset_cache_f(fapl, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, &
-       rdcc_w0, error)
-  CALL check("h5pset_cache_f", error, total_error)
-  CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error, access_prp = fapl)
-  CALL check("h5fcreate_f", error, total_error)
-  IF(error .NE. 0) THEN
-     WRITE(*,*) "Cannot create file using multi-file driver... Exiting...."
-     total_error = 1
-     CALL h5pclose_f(fapl, error)
-     RETURN
-  ENDIF
-  !
-  ! Create the dataspace.
-  !
-  CALL h5screate_simple_f(rank, dims, dspace_id, error)
-  CALL check("h5screate_simple_f", error, total_error)
-  !
-  ! Create the dataset with default properties.
-  !
-  CALL h5dcreate_f(file_id, dsetname, H5T_NATIVE_INTEGER, dspace_id, &
-       dset_id, error)
-  CALL check("h5dcreate_f", error, total_error)
-  !
-  ! Write the dataset.
-  !
-  data_dims(1) = 4
-  data_dims(2) = 6
-  CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, dset_data, data_dims, error)
-  CALL check("h5dwrite_f", error, total_error)
-  !
-  ! End access to the dataset and release resources used by it.
-  !
-  CALL h5dclose_f(dset_id, error)
-  CALL check("h5dclose_f", error, total_error)
-  
-  !
-  ! Terminate access to the data space.
-  !
-  CALL h5sclose_f(dspace_id, error)
-  CALL check("h5sclose_f", error, total_error)
-  
-  !
-  ! Close the file.
-  !
-  CALL h5fclose_f(file_id, error)
-  CALL check("h5fclose_f", error, total_error)
-  CALL h5pclose_f(fapl, error)
-  CALL check("h5pclose_f", error, total_error)
-  !
-  ! Open the existing file.
-  !
-  CALL h5pcreate_f(H5P_FILE_ACCESS_F, fapl, error)
-  CALL check("h5pcreate_f", error, total_error)
-  CALL h5pset_fapl_multi_f(fapl, memb_map, memb_fapl, memb_name, memb_addr, relax, error)
-  CALL check("h5pset_fapl_multi_f", error, total_error)
-  CALL h5fopen_f (fix_filename, H5F_ACC_RDWR_F, file_id, error, access_prp = fapl)
-  CALL check("h5fopen_f", error, total_error)
-  !
-  CALL h5fget_access_plist_f(file_id, fapl_1, error)
-  CALL check("h5fget_access_plist_f", error, total_error)
-  !It doesn't work on Windows.
-  !CALL h5pget_fapl_multi_f(fapl_1, memb_map_out, memb_fapl_out, memb_name_out, &
-  !                         memb_addr_out, relax_out, error)
-  ! write(*,*)  memb_map_out
-  ! write(*,*)  memb_fapl_out
-  ! write(*,*)  memb_name_out
-  ! write(*,*)  memb_addr_out
-  !    CALL check("h5pget_fapl_multi_f", error, total_error)
-  
-  !
-  ! Open the existing dataset.
-  !
-  CALL h5dopen_f(file_id, dsetname, dset_id, error)
-  CALL check("h5dopen_f", error, total_error)
-  
-  !
-  ! Get the dataset type.
-  !
-  CALL h5dget_type_f(dset_id, dtype_id, error)
-  CALL check("h5dget_type_f", error, total_error)
-  
-  !
-  ! Get the data space.
-  !
-  CALL h5dget_space_f(dset_id, dspace_id, error)
-  CALL check("h5dget_space_f", error, total_error)
-  
-  !
-  ! Read the dataset.
-  !
-  CALL h5dread_f(dset_id, H5T_NATIVE_INTEGER, data_out, data_dims, error)
-  CALL check("h5dread_f", error, total_error)
-  
-  !
-  !Compare the data.
-  !
-  DO i = 1, 4
-     DO j = 1, 6
-        IF (data_out(i,j) .NE. dset_data(i, j)) THEN
-           WRITE(*, *) "dataset test error occured"
-           WRITE(*,*) "data read is not the same as the data writen"
-        END IF
-     END DO
-  END DO
-  
-  !
-  ! End access to the dataset and release resources used by it.
-  !
-  CALL h5dclose_f(dset_id, error)
-  CALL check("h5dclose_f", error, total_error)
-  
-  !
-  ! Terminate access to the data space.
-  !
-  CALL h5sclose_f(dspace_id, error)
-  CALL check("h5sclose_f", error, total_error)
-  
-  !
-  ! Terminate access to the data type.
-  !
-  CALL h5tclose_f(dtype_id, error)
-  CALL check("h5tclose_f", error, total_error)
-  !
-  ! Close the file.
-  !
-  CALL h5fclose_f(file_id, error)
-  CALL check("h5fclose_f", error, total_error)
-  CALL h5pclose_f(fapl, error)
-  CALL check("h5pclose_f", error, total_error)
-  CALL h5pclose_f(fapl_1, error)
-  CALL check("h5pclose_f", error, total_error)
-  IF(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-  
-  IF(cleanup) CALL h5_cleanup_f(filename//'.h5-b', H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-  IF(cleanup) CALL h5_cleanup_f(filename//'.h5-g', H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-  IF(cleanup) CALL h5_cleanup_f(filename//'.h5-l', H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-  IF(cleanup) CALL h5_cleanup_f(filename//'.h5-o', H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-  IF(cleanup) CALL h5_cleanup_f(filename//'.h5-r', H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-  IF(cleanup) CALL h5_cleanup_f(filename//'.h5-s', H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-  
-  RETURN
-END SUBROUTINE multi_file_test
-
-!-------------------------------------------------------------------------
-! Function: test_chunk_cache
-!
-! Purpose: Tests APIs:
-!            H5P_H5PSET_CHUNK_CACHE_F
-!            H5P_H5PGET_CHUNK_CACHE_F
-!            H5D_H5DGET_ACCESS_PLIST_F
-!
-! Return:      Success: 0
-!              Failure: -1
-!
-! C Programmer:  Neil Fortner
-!                Wednesday, October 29, 2008
-!
-! FORTRAN Programmer: M. Scot Breitenfeld
-!                     April 16, 2009
-!-------------------------------------------------------------------------
-!
-SUBROUTINE test_chunk_cache(cleanup, total_error) 
-
-  USE HDF5 ! This module contains all necessary modules 
-  USE TH5_MISC
-  
-  IMPLICIT NONE
-  LOGICAL, INTENT(IN)  :: cleanup
-  INTEGER, INTENT(INOUT) :: total_error
-  
-  CHARACTER(LEN=14), PARAMETER :: filename="chunk_cache"
-  CHARACTER(LEN=80) :: fix_filename
-  INTEGER(hid_t) :: fid = -1        ! File ID 
-  INTEGER(hid_t) :: fapl_local = -1 !  Local fapl 
-  INTEGER(hid_t) :: fapl_def = -1  !  Default fapl 
-  INTEGER(hid_t) :: dcpl = -1      ! Dataset creation property list ID 
-  INTEGER(hid_t) :: dapl1 = -1     ! Dataset access property list ID 
-  INTEGER(hid_t) :: dapl2 = -1     ! Dataset access property list ID 
-  INTEGER(hid_t) :: sid = -1       ! Dataspace ID 
-  INTEGER(hid_t) :: dsid = -1      ! Dataset ID 
-  INTEGER(hsize_t), DIMENSION(1:1) :: chunk_dim, NDIM = (/100/) ! Dataset and chunk dimensions 
-  INTEGER(size_t) :: nslots_1, nslots_2, nslots_3, nslots_4 ! rdcc number of elements 
-  INTEGER(size_t) :: nbytes_1, nbytes_2, nbytes_3, nbytes_4 ! rdcc number of bytes 
-  INTEGER :: mdc_nelmts
-  INTEGER(size_t) ::nlinks         ! Number of link traversals 
-  REAL :: w0_1, w0_2, w0_3, w0_4 ! rdcc preemption policy 
-  INTEGER :: error
-  INTEGER(size_t) rdcc_nelmts
-  INTEGER(size_t) rdcc_nbytes
-  REAL :: rdcc_w0
-
-  CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
-  IF (error .NE. 0) THEN
-     WRITE(*,*) "Cannot modify filename"
-     STOP
-  ENDIF
-
-  ! Create a default fapl and dapl 
-  CALL H5Pcreate_f(H5P_FILE_ACCESS_F, fapl_def, error)
-  CALL check("H5Pcreate_f", error, total_error)
-  CALL H5Pcreate_f(H5P_DATASET_ACCESS_F, dapl1, error)
-  CALL check("H5Pcreate_f", error, total_error)
-
-  !  Verify that H5Pget_chunk_cache(dapl) returns the same values as are in
-  !  the default fapl.
-  ! 
-  CALL H5Pget_cache_f(fapl_def, mdc_nelmts, nslots_1, nbytes_1, w0_1, error)
-  CALL check("H5Pget_cache_f", error, total_error)
-  CALL H5Pget_chunk_cache_f(dapl1, nslots_4, nbytes_4, w0_4, error)
-  CALL check("H5Pget_chunk_cache_f", error, total_error)
-  CALL VERIFY("H5Pget_chunk_cache_f", INT(nslots_1), INT(nslots_4), total_error)
-  CALL VERIFY("H5Pget_chunk_cache_f", INT(nbytes_1), INT(nbytes_4), total_error)
-
-  IF( .NOT.dreal_eq( REAL(w0_1,dp), REAL( w0_4, dp)) ) THEN
-     CALL VERIFYlogical("H5Pget_chunk_cache_f", .TRUE., .FALSE., total_error)
-  ENDIF
-
-  !  Set a lapl property on dapl1 (to verify inheritance) 
-  CALL H5Pset_nlinks_f(dapl1, 134_size_t , error)
-  CALL check("H5Pset_nlinks_f", error, total_error)
-  CALL H5Pget_nlinks_f(dapl1, nlinks, error)
-  CALL check("H5Pget_nlinks_f", error, total_error)
-  CALL VERIFY("H5Pget_nlinks_f", INT(nlinks), 134, total_error)
-
-
-  CALL h5pcreate_f(H5P_FILE_ACCESS_F, fapl_local, error)
-  CALL check("h5pcreate_f", error, total_error)
-  ! Turn off the chunk cache, so all the chunks are immediately written to disk
-  CALL H5Pget_cache_f(fapl_local, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0, error)
-  CALL check("H5Pget_cache_f", error, total_error)
-  rdcc_nbytes = 0
-  CALL H5Pset_cache_f(fapl_local, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0, error)
-  CALL check("H5Pset_cache_f", error, total_error)
-
-  ! Set new rdcc settings on fapl!
-  nslots_2 = nslots_1 * 2
-  nbytes_2 = nbytes_1 * 2
-  w0_2 = w0_1 / 2.
-
-  CALL H5Pset_cache_f(fapl_local, 0, nslots_2, nbytes_2, w0_2, error)
-  CALL check("H5Pset_cache_f", error, total_error)
-
-  ! Create file 
-  CALL H5Fcreate_f(fix_filename, H5F_ACC_TRUNC_F, fid, error,  H5P_DEFAULT_F, fapl_local)
-  CALL check("H5Fcreate_f", error, total_error)
-
-  ! Create dataset creation property list 
-  CALL H5Pcreate_f(H5P_DATASET_CREATE_F, dcpl, error)
-  CALL check("H5Pcreate_f", error, total_error)
-
-  ! Set chunking 
-  chunk_dim(1) = 10
-  CALL H5Pset_chunk_f(dcpl, 1, chunk_dim, error)
-  CALL check("H5Pset_chunk_f", error, total_error)
-
-  ! Create 1-D dataspace 
-  ndim(1) = 100
-  CALL H5Screate_simple_f(1, ndim, sid, error)
-  CALL check("H5Pcreate_f", error, total_error)
-
-  !  Create dataset with default dapl 
-  CALL H5Dcreate_f(fid, "dset", H5T_NATIVE_INTEGER, sid, dsid, error,  dcpl, H5P_DEFAULT_F,  dapl1)
-  CALL check("H5Pcreate_f", error, total_error)
- 
-  !  Retrieve dapl from dataset, verify cache values are the same as on fapl_local 
-  CALL H5Dget_access_plist_f(dsid, dapl2, error)
-  CALL check("H5Dget_access_plist_f", error, total_error)
-  CALL H5Pget_chunk_cache_f(dapl2, nslots_4, nbytes_4, w0_4, error)
-  CALL check("H5Pget_chunk_cache_f", error, total_error)
-  CALL VERIFY("H5Pget_chunk_cache_f", INT(nslots_2), INT(nslots_4), total_error)
-  CALL VERIFY("H5Pget_chunk_cache_f", INT(nbytes_2), INT(nbytes_4), total_error)
-  IF( .NOT.dreal_eq( REAL(w0_2,dp), REAL( w0_4, dp)) ) THEN
-     CALL VERIFYlogical("H5Pget_chunk_cache_f", .TRUE., .FALSE., total_error)
-  ENDIF
-  CALL H5Pclose_f(dapl2,error) 
-  CALL check("H5Pclose_f", error, total_error)
-  
-  ! Set new values on dapl1.  nbytes will be set to default, so the file
-  ! property will override this setting
-
-  nslots_3 = nslots_2 * 2
-  nbytes_3 = H5D_CHUNK_CACHE_NBYTES_DFLT_F
-  w0_3 = w0_2 / 2
-
-  CALL H5Pset_chunk_cache_f(dapl1, nslots_3, nbytes_3, w0_3, error)
-  CALL check("H5Pset_chunk_cache_f", error, total_error)
-
-  ! Close dataset, reopen with dapl1.  Note the use of a dapl with H5Oopen 
-  CALL H5Dclose_f(dsid, error)
-  CALL H5Oopen_f(fid, "dset", dsid, error, dapl1)
-
-  ! Retrieve dapl from dataset, verfiy cache values are the same as on dapl1
-  !
-  ! Note we rely on the knowledge that H5Pget_chunk_cache retrieves these
-  ! values directly from the dataset structure, and not from a copy of the
-  ! dapl used to open the dataset (which is not preserved).
-  !
-  CALL H5Dget_access_plist_f(dsid, dapl2, error)
-  CALL check("H5Dget_access_plist_f", error, total_error)
-  CALL H5Pget_chunk_cache_f(dapl2, nslots_4, nbytes_4, w0_4, error)
-  CALL check("H5Pget_chunk_cache_f", error, total_error)
-  CALL VERIFY("H5Pget_chunk_cache_f", INT(nslots_3), INT(nslots_4), total_error)
-  CALL VERIFY("H5Pget_chunk_cache_f", INT(nbytes_2), INT(nbytes_4), total_error)
-  IF( .NOT.dreal_eq( REAL(w0_3,dp), REAL( w0_4, dp)) ) THEN
-     CALL VERIFYlogical("H5Pget_chunk_cache_f4", .TRUE., .FALSE., total_error)
-  ENDIF
-  CALL H5Pclose_f(dapl2,error)
-  CALL check("H5Pclose_f", error, total_error)
-
-  ! Close dataset, reopen with H5P_DEFAULT as dapl
-  CALL H5Dclose_f(dsid, error)
-  CALL check("H5Dclose_f", error, total_error)
-  CALL H5Oopen_f(fid, "dset", dsid, error)
-  CALL check("H5Oopen_f", error, total_error)
-
-  ! Retrieve dapl from dataset, verfiy cache values are the same as on fapl_local
-
-  CALL H5Dget_access_plist_f(dsid, dapl2, error)
-  CALL check("H5Dget_access_plist_f", error, total_error)
-  CALL H5Pget_chunk_cache_f(dapl2, nslots_4, nbytes_4, w0_4, error)
-  CALL check("H5Pget_chunk_cache_f", error, total_error)
-  CALL VERIFY("H5Pget_chunk_cache_f", INT(nslots_2), INT(nslots_4), total_error)
-  CALL VERIFY("H5Pget_chunk_cache_f", INT(nbytes_2), INT(nbytes_4), total_error)
-  IF( .NOT.dreal_eq( REAL(w0_2,dp), REAL( w0_4, dp)) ) THEN
-     CALL VERIFYlogical("H5Pget_chunk_cache_f", .TRUE., .FALSE., total_error)
-  ENDIF
-  CALL H5Pclose_f(dapl2,error) 
-  CALL check("H5Pclose_f", error, total_error)
-
-  ! Similary, test use of H5Dcreate2 with H5P_DEFAULT
-  CALL H5Dclose_f(dsid, error) 
-  CALL check("H5Dclose_f", error, total_error)
-
-  CALL H5Dcreate_f(fid, "dset2", H5T_NATIVE_INTEGER, sid, dsid, error,  dcpl, H5P_DEFAULT_F,  H5P_DEFAULT_F)
-  CALL check("H5Pcreate_f", error, total_error)
-
-  CALL H5Dget_access_plist_f(dsid, dapl2, error)
-  CALL check("H5Dget_access_plist_f", error, total_error)
-
-  CALL H5Pget_chunk_cache_f(dapl2, nslots_4, nbytes_4, w0_4, error)
-  CALL check("H5Pget_chunk_cache_f", error, total_error)
-  CALL VERIFY("H5Pget_chunk_cache_f", INT(nslots_2), INT(nslots_4), total_error)
-  CALL VERIFY("H5Pget_chunk_cache_f", INT(nbytes_2), INT(nbytes_4), total_error)
-  IF( .NOT.dreal_eq( REAL(w0_2,dp), REAL( w0_4, dp)) ) THEN
-     CALL VERIFYlogical("H5Pget_chunk_cache_f", .TRUE., .FALSE., total_error)
-  ENDIF
-  ! Don't close dapl2, we will use it in the next section
-
-  ! Modify cache values on fapl_local
-  nbytes_3 = nbytes_2 * 2
-
-  CALL H5Pset_cache_f(fapl_local, 0, nslots_3, nbytes_3, w0_3, error)
-  CALL check("H5Pset_cache_f", error, total_error)
-
-  !  Close and reopen file with new fapl_local
-  
-  CALL H5Dclose_f(dsid, error)
-  CALL check("H5Dclose_f", error, total_error)
-  CALL H5Fclose_f(fid,error)
-  CALL check("h5fclose_f", error, total_error)
-
-  CALL H5Fopen_f (fix_filename, H5F_ACC_RDWR_F, fid, error, fapl_local)
-  CALL check("h5fopen_f", error, total_error)
-
-  ! Verify that dapl2 retrieved earlier (using values from the old fapl)
-  ! sets its values in the new file (test use of H5Dopen2 with a dapl)
-  !
-  
-  CALL h5dopen_f (fid, "dset", dsid, error, dapl2)
-  CALL check("h5dopen_f", error, total_error)
-  
-  CALL H5Pclose_f(dapl2,error)
-  CALL check("H5Pclose_f", error, total_error) ! Close dapl2, to avoid id leak
-  
-  CALL H5Dget_access_plist_f(dsid, dapl2, error)
-  CALL check("H5Dget_access_plist_f", error, total_error)
-  CALL H5Pget_chunk_cache_f(dapl2, nslots_4, nbytes_4, w0_4, error)
-  CALL check("H5Pget_chunk_cache_f", error, total_error)
-  CALL VERIFY("H5Pget_chunk_cache_f", INT(nslots_2), INT(nslots_4), total_error)
-  CALL VERIFY("H5Pget_chunk_cache_f", INT(nbytes_2), INT(nbytes_4), total_error)
-  IF( .NOT.dreal_eq( REAL(w0_2,dp), REAL( w0_4, dp)) ) THEN
-     CALL VERIFYlogical("H5Pget_chunk_cache_f", .TRUE., .FALSE., total_error)
-  ENDIF
-
-  ! Test H5D_CHUNK_CACHE_NSLOTS_DEFAULT and H5D_CHUNK_CACHE_W0_DEFAULT
-  nslots_2 = H5D_CHUNK_CACHE_NSLOTS_DFLT_F
-  w0_2 = H5D_CHUNK_CACHE_W0_DFLT_F
-
-  CALL H5Pset_chunk_cache_f(dapl2, nslots_2, nbytes_2, w0_2, error)
-  CALL check("H5Pset_chunk_cache_f", error, total_error)
-
-  CALL H5Dclose_f(dsid, error)
-  CALL check("H5Dclose_f", error, total_error)
-  CALL h5dopen_f (fid, "dset", dsid, error, dapl2)
-  CALL check("h5dopen_f", error, total_error)
-
-  CALL H5Pclose_f(dapl2,error)
-  CALL check("H5Pclose_f", error, total_error)
-
-  CALL H5Dget_access_plist_f(dsid, dapl2, error)
-  CALL check("H5Dget_access_plist_f", error, total_error)
-  CALL H5Pget_chunk_cache_f(dapl2, nslots_4, nbytes_4, w0_4, error)
-  CALL check("H5Pget_chunk_cache_f", error, total_error)
-  CALL VERIFY("H5Pget_chunk_cache_f", INT(nslots_3), INT(nslots_4), total_error)
-  CALL VERIFY("H5Pget_chunk_cache_f", INT(nbytes_2), INT(nbytes_4), total_error)
-  IF( .NOT.dreal_eq( REAL(w0_3,dp), REAL( w0_4, dp)) ) THEN
-     CALL VERIFYlogical("H5Pget_chunk_cache_f", .TRUE., .FALSE., total_error)
-  ENDIF
-
-! Close
-
-  CALL H5Dclose_f(dsid, error)
-  CALL check("H5Dclose_f", error, total_error)
-  CALL H5Sclose_f(sid,error)
-  CALL check("H5Sclose_f", error, total_error)
-  CALL H5Pclose_f(fapl_local,error)
-  CALL check("H5Pclose_f", error, total_error) 
-  CALL H5Pclose_f(fapl_def,error)
-  CALL check("H5Pclose_f", error, total_error) 
-  CALL H5Pclose_f(dapl1,error)
-  CALL check("H5Pclose_f", error, total_error) 
-  CALL H5Pclose_f(dapl2,error)
-  CALL check("H5Pclose_f", error, total_error) 
-  CALL H5Pclose_f(dcpl,error)
-  CALL check("H5Pclose_f", error, total_error) 
-  CALL H5Fclose_f(fid,error)
-  CALL check("H5Fclose_f", error, total_error)
-
-  IF(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-
-END SUBROUTINE test_chunk_cache
-
-END MODULE TH5P
diff --git a/fortran/test/tH5P_F03.F90 b/fortran/test/tH5P_F03.F90
new file mode 100644
index 0000000..8982fc2
--- /dev/null
+++ b/fortran/test/tH5P_F03.F90
@@ -0,0 +1,620 @@
+!****h* root/fortran/test/tH5P_F03.f90
+!
+! NAME
+!  tH5P_F03.f90
+!
+! FUNCTION
+!  Test FORTRAN HDF5 H5P APIs which are dependent on FORTRAN 2003
+!  features. 
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! USES
+!  test_genprop_cls_cb1_mod
+!
+! CONTAINS SUBROUTINES
+!  test_create, test_genprop_class_callback
+!
+!*****
+
+! *****************************************
+! ***        H 5 P   T E S T S
+! *****************************************
+MODULE test_genprop_cls_cb1_mod
+
+  ! Callback subroutine for test_genprop_class_callback
+  ! and the function H5Pcreate_class_f.
+
+  USE HDF5
+  USE ISO_C_BINDING
+  IMPLICIT NONE
+  
+  TYPE, BIND(C) :: cop_cb_struct_ !  Struct for iterations 
+    INTEGER :: count
+    INTEGER(HID_T) :: id
+  END TYPE cop_cb_struct_
+
+CONTAINS
+  
+  INTEGER FUNCTION test_genprop_cls_cb1_f(list_id, create_data ) bind(C)
+    
+    IMPLICIT NONE
+
+    INTEGER(HID_T), INTENT(IN), VALUE :: list_id
+    
+    TYPE(cop_cb_struct_) :: create_data
+
+    create_data%count = create_data%count + 1
+    create_data%id = list_id
+
+    test_genprop_cls_cb1_f = 0
+    
+  END FUNCTION test_genprop_cls_cb1_f
+
+END MODULE test_genprop_cls_cb1_mod
+
+MODULE TH5P_F03
+
+  USE HDF5 
+  USE TH5_MISC 
+  USE TH5_MISC_GEN
+  USE ISO_C_BINDING
+
+CONTAINS
+
+!-------------------------------------------------------------------------
+! * Function:	test_create
+! *
+! * Purpose:	Tests H5Pset_fill_value_f and H5Pget_fill_value_f
+! *
+! * Return:	Success:	0
+! *
+! *		Failure:	number of errors
+! *
+! * Programmer:	M. Scot Breitenfeld
+! *             June 24, 2008
+! *
+! * Modifications:
+! *
+! *-------------------------------------------------------------------------
+! 
+
+SUBROUTINE test_create(total_error)
+
+  IMPLICIT NONE
+
+  INTEGER, INTENT(INOUT) :: total_error
+  INTEGER(HID_T) :: fapl
+
+  INTEGER(hid_t) :: file=-1, space=-1, dcpl=-1, comp_type_id=-1
+  INTEGER(hid_t) :: dset9=-1
+  INTEGER(hsize_t), DIMENSION(1:5), PARAMETER :: cur_size = (/2, 8, 8, 4, 2/)
+  INTEGER(hsize_t), DIMENSION(1:5), PARAMETER :: ch_size= (/1, 1, 1, 4, 1/)
+  CHARACTER(LEN=14) :: filename ='test_create.h5'
+
+  TYPE(comp_datatype), TARGET :: rd_c, fill_ctype
+  INTEGER :: error
+  INTEGER(SIZE_T) :: h5off
+  TYPE(C_PTR) :: f_ptr
+  LOGICAL :: differ1, differ2
+  CHARACTER(LEN=1) :: cfill
+  INTEGER :: ifill
+  REAL :: rfill
+  REAL(KIND=dp) :: dpfill
+
+  !
+  ! * Create a file.
+  ! 
+  CALL h5fcreate_f(filename,H5F_ACC_TRUNC_F,file,error)
+  CALL check("h5fcreate_f", error, total_error)   
+
+  CALL h5screate_simple_f(5, cur_size, space, error, cur_size)
+  CALL check("h5screate_simple_f", error, total_error)
+
+  CALL H5Pcreate_f(H5P_DATASET_CREATE_F, dcpl, error)
+  CALL check("H5Pcreate_f", error, total_error)
+
+  CALL h5pset_chunk_f(dcpl, 5, ch_size, error)
+  CALL check("h5pset_chunk_f",error, total_error)
+
+  !  Create a compound datatype 
+  CALL h5tcreate_f(H5T_COMPOUND_F, H5_SIZEOF(fill_ctype), comp_type_id, error)
+  CALL check("h5tcreate_f", error, total_error)
+  h5off = H5OFFSETOF(C_LOC(fill_ctype), C_LOC(fill_ctype%a))
+  CALL h5tinsert_f(comp_type_id, "a", h5off , H5T_NATIVE_REAL, error)
+  CALL check("h5tinsert_f", error, total_error)
+  CALL h5tinsert_f(comp_type_id, "x", H5OFFSETOF(C_LOC(fill_ctype), C_LOC(fill_ctype%x)), H5T_NATIVE_INTEGER, error)
+  CALL check("h5tinsert_f", error, total_error)
+  CALL h5tinsert_f(comp_type_id, "y", H5OFFSETOF(C_LOC(fill_ctype), C_LOC(fill_ctype%y)), H5T_NATIVE_DOUBLE, error)
+  CALL check("h5tinsert_f", error, total_error)
+  CALL h5tinsert_f(comp_type_id, "z", &
+       H5OFFSETOF(C_LOC(fill_ctype), C_LOC(fill_ctype%z)), H5T_NATIVE_CHARACTER, error)
+  CALL check("h5tinsert_f", error, total_error)
+
+
+  CALL H5Pset_alloc_time_f(dcpl, H5D_ALLOC_TIME_LATE_F,error)
+  CALL check("H5Pset_alloc_time_f",error, total_error)
+
+  CALL H5Pset_fill_time_f(dcpl, H5D_FILL_TIME_ALLOC_F, error)
+  CALL check("H5Pset_fill_time_f",error, total_error)
+
+  !  Compound datatype test 
+
+  f_ptr = C_LOC(fill_ctype)
+
+  CALL H5Pget_fill_value_f(dcpl, comp_type_id, f_ptr, error)
+  CALL check("H5Pget_fill_value_f",error, total_error)
+
+  fill_ctype%y = 4444.D0
+  fill_ctype%z = 'S'
+  fill_ctype%a = 5555.
+  fill_ctype%x = 55
+
+  f_ptr = C_LOC(fill_ctype)
+
+  ! Test various fill values
+  CALL H5Pset_fill_value_f(dcpl, H5T_NATIVE_CHARACTER, 'X', error)
+  CALL check("H5Pset_fill_value_f",error, total_error)
+  CALL h5pget_fill_value_f(dcpl, H5T_NATIVE_CHARACTER, cfill, error)
+  CALL check("H5Pget_fill_value_f",error, total_error)
+  IF(cfill.NE.'X')THEN
+     PRINT*,"***ERROR: Returned wrong fill value (character)"
+     total_error = total_error + 1
+  ENDIF
+  CALL H5Pset_fill_value_f(dcpl, H5T_NATIVE_INTEGER, 9, error)
+  CALL check("H5Pset_fill_value_f",error, total_error)
+  CALL h5pget_fill_value_f(dcpl, H5T_NATIVE_INTEGER, ifill, error)
+  CALL check("H5Pget_fill_value_f",error, total_error)
+  IF(ifill.NE.9)THEN
+     PRINT*,"***ERROR: Returned wrong fill value (integer)"
+     total_error = total_error + 1
+  ENDIF
+  CALL H5Pset_fill_value_f(dcpl, H5T_NATIVE_DOUBLE, 1.0_dp, error)
+  CALL check("H5Pset_fill_value_f",error, total_error)
+  CALL h5pget_fill_value_f(dcpl, H5T_NATIVE_DOUBLE, dpfill, error)
+  CALL check("H5Pget_fill_value_f",error, total_error)
+  CALL VERIFY("***ERROR: Returned wrong fill value (double)", dpfill, 1.0_dp, total_error)
+  CALL H5Pset_fill_value_f(dcpl, H5T_NATIVE_REAL, 2.0, error)
+  CALL check("H5Pset_fill_value_f",error, total_error)
+  CALL h5pget_fill_value_f(dcpl, H5T_NATIVE_REAL, rfill, error)
+  CALL check("H5Pget_fill_value_f",error, total_error)
+  CALL VERIFY("***ERROR: Returned wrong fill value (real)", rfill, 2.0, total_error)
+
+  ! For the actual compound type
+  CALL H5Pset_fill_value_f(dcpl, comp_type_id, f_ptr, error)
+  CALL check("H5Pget_fill_value_f",error, total_error)
+
+  CALL h5dcreate_f(file,"dset9", comp_type_id, space, dset9, error, dcpl_id=dcpl)
+  CALL check("h5dcreate_f", error, total_error)
+
+  CALL h5dclose_f(dset9, error)
+  CALL check("h5dclose_f", error, total_error)
+
+  CALL h5fclose_f(file,error)
+  CALL check("h5fclose_f", error, total_error)
+
+  !  Open the file and get the dataset fill value from each dataset 
+  CALL H5Pcreate_f(H5P_FILE_ACCESS_F, fapl, error)
+  CALL check("H5Pcreate_f",error, total_error)
+
+  CALL H5Pset_libver_bounds_f(fapl, H5F_LIBVER_LATEST_F, H5F_LIBVER_LATEST_F, error)
+  CALL check("H5Pset_libver_bounds_f",error, total_error)
+
+  CALL h5fopen_f (FILENAME, H5F_ACC_RDONLY_F, file, error, fapl)
+  CALL check("h5fopen_f", error, total_error)
+
+  ! Compound datatype test 
+  CALL h5dopen_f(file, "dset9", dset9, error)
+  CALL check("h5dopen_f", error, total_error)
+
+  CALL H5Pclose_f(dcpl, error)
+  CALL check("H5Pclose_f", error, total_error)
+
+  CALL H5Dget_create_plist_f(dset9, dcpl, error)
+  CALL check("H5Dget_create_plist_f", error, total_error)
+
+  f_ptr = C_LOC(rd_c)
+
+  CALL H5Pget_fill_value_f(dcpl, comp_type_id, f_ptr, error)
+  CALL check("H5Pget_fill_value_f", error, total_error)
+  CALL verify("***ERROR: Returned wrong fill value", rd_c%a, fill_ctype%a, total_error)
+  CALL verify("***ERROR: Returned wrong fill value", rd_c%y, fill_ctype%y, total_error)
+
+  IF( rd_c%x .NE. fill_ctype%x .OR. &
+      rd_c%z .NE. fill_ctype%z )THEN
+
+     PRINT*,"***ERROR: Returned wrong fill value"
+     total_error = total_error + 1
+
+  ENDIF
+
+  CALL h5dclose_f(dset9, error)
+  CALL check("h5dclose_f", error, total_error)
+
+  CALL H5Pclose_f(dcpl, error)
+  CALL check("H5Pclose_f", error, total_error)
+
+  CALL h5fclose_f(file,error)
+  CALL check("h5fclose_f", error, total_error)
+
+END SUBROUTINE test_create
+
+
+SUBROUTINE test_genprop_class_callback(total_error)
+
+  !
+  !
+  !  test_genprop_class_callback(): Test basic generic property list code.
+  !      Tests callbacks for property lists in a generic class.
+  !
+  !  FORTRAN TESTS:
+  !      Tests function H5Pcreate_class_f with callback.
+  !
+  !
+
+  USE test_genprop_cls_cb1_mod
+  IMPLICIT NONE
+
+  INTEGER, INTENT(INOUT) :: total_error
+
+  INTEGER(hid_t) :: cid1, cid2 ! Generic Property class ID 
+  INTEGER(hid_t) :: lid1, lid2 ! Generic Property list ID 
+  INTEGER(size_t) :: nprops ! Number of properties in class 
+
+  TYPE(cop_cb_struct_), TARGET :: crt_cb_struct, cls_cb_struct
+  INTEGER :: CLASS1_NAME_SIZE = 7 ! length of class string
+  CHARACTER(LEN=7) :: CLASS1_NAME = "Class 1", CLASS1_NAME_BUF
+  TYPE(C_FUNPTR) :: f1, f5
+  TYPE(C_PTR) :: f2, f6
+
+  CHARACTER(LEN=10) :: PROP1_NAME = "Property 1"
+  INTEGER(SIZE_T) :: PROP1_SIZE = 10
+  CHARACTER(LEN=10) :: PROP2_NAME = "Property 2"
+  INTEGER(SIZE_T) :: PROP2_SIZE = 10
+  CHARACTER(LEN=10) :: PROP3_NAME = "Property 3"
+  INTEGER(SIZE_T) :: PROP3_SIZE = 10
+  CHARACTER(LEN=10) :: PROP4_NAME = "Property 4"
+  INTEGER(SIZE_T) :: PROP4_SIZE = 10
+  INTEGER :: PROP1_DEF_VALUE = 10
+  INTEGER :: PROP2_DEF_VALUE = 10
+  INTEGER :: PROP3_DEF_VALUE = 10
+  INTEGER :: PROP4_DEF_VALUE = 10
+
+  INTEGER :: error !  Generic RETURN value	
+  LOGICAL :: flag  ! for tests
+
+  f1 = C_FUNLOC(test_genprop_cls_cb1_f)
+  f5 = C_FUNLOC(test_genprop_cls_cb1_f)
+
+  f2 = C_LOC(crt_cb_struct)
+  f6 = C_LOC(cls_cb_struct)
+
+  ! Create a new generic class, derived from the root of the class hierarchy 
+  CALL h5pcreate_class_f(h5p_ROOT_F, CLASS1_NAME, cid1, error, f1, f2, c_null_funptr, c_null_ptr, f5, f6)
+  CALL check("h5pcreate_class_f", error, total_error)
+
+  ! Insert first property into class (with no callbacks) 
+  CALL h5pregister_f(cid1, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, error)
+  CALL check("h5pregister_f", error, total_error)
+  ! Insert second property into class (with no callbacks) 
+  CALL h5pregister_f(cid1, PROP2_NAME, PROP2_SIZE, PROP2_DEF_VALUE, error)
+  CALL check("h5pregister_f", error, total_error)
+  ! Insert third property into class (with no callbacks) 
+  CALL h5pregister_f(cid1, PROP3_NAME, PROP3_SIZE, PROP3_DEF_VALUE, error)
+  CALL check("h5pregister_f", error, total_error)
+
+  ! Insert fourth property into class (with no callbacks) 
+  CALL h5pregister_f(cid1, PROP4_NAME, PROP4_SIZE, PROP4_DEF_VALUE, error)
+  CALL check("h5pregister_f", error, total_error)
+
+  !  Check the number of properties in class 
+  CALL h5pget_nprops_f(cid1, nprops, error)
+  CALL check("h5pget_nprops_f", error, total_error)
+  CALL verify("h5pget_nprops_f", INT(nprops), 4, total_error)
+
+  !  Initialize class callback structs 
+
+  crt_cb_struct%count = 0
+  crt_cb_struct%id    = -1
+  cls_cb_struct%count = 0
+  cls_cb_struct%id    = -1
+
+  ! Create a property list from the class 
+  CALL h5pcreate_f(cid1, lid1, error)
+  CALL check("h5pcreate_f", error, total_error)
+
+  ! Get the list's class 
+  CALL H5Pget_class_f(lid1, cid2, error)
+  CALL check("H5Pget_class_f", error, total_error)
+
+  !  Check that the list's class is correct 
+  CALL H5Pequal_f(cid2, cid1, flag, error)
+  CALL check("H5Pequal_f", error, total_error)
+  CALL verify("H5Pequal_f", flag, .TRUE., total_error)
+
+  ! Check the class name
+  CALL H5Pget_class_name_f(cid2, CLASS1_NAME_BUF, CLASS1_NAME_SIZE, error)
+  CALL check("H5Pget_class_name_f", error, total_error)
+  CALL verify("H5Pget_class_name_f", CLASS1_NAME_BUF, CLASS1_NAME, error)
+  IF(error.NE.0)THEN
+     WRITE(*,*) 'Class names do not match! name=',CLASS1_NAME_BUF, 'CLASS1_NAME=',CLASS1_NAME
+     total_error = total_error + 1
+  ENDIF
+  ! Close class 
+  CALL h5pclose_class_f(cid2, error)
+  CALL check("h5pclose_class_f", error, total_error)
+
+  ! Verify that the creation callback occurred 
+  CALL verify("h5pcreate_f", crt_cb_struct%count, 1, total_error)
+  CALL verify("h5pcreate_f", crt_cb_struct%id, lid1, total_error)
+
+  !  Check the number of properties in list 
+  CALL h5pget_nprops_f(lid1,nprops, error)
+  CALL check("h5pget_nprops_f", error, total_error)
+  CALL verify("h5pget_nprops_f", INT(nprops), 4, total_error)
+
+  !  Create another property list from the class 
+  CALL h5pcreate_f(cid1, lid2, error)
+  CALL check("h5pcreate_f", error, total_error)
+
+  !  Verify that the creation callback occurred 
+  CALL verify("h5pcreate_f", crt_cb_struct%count, 2, total_error)
+  CALL verify("h5pcreate_f", crt_cb_struct%id, lid2, total_error)
+
+  !  Check the number of properties in list 
+  CALL h5pget_nprops_f(lid2,nprops, error)
+  CALL check("h5pget_nprops_f", error, total_error)
+  CALL verify("h5pget_nprops_f", INT(nprops), 4, total_error)
+
+  !  Close first list 
+  CALL h5pclose_f(lid1, error);
+  CALL check("h5pclose_f", error, total_error)
+
+  ! Verify that the close callback occurred 
+  CALL verify("h5pcreate_f", cls_cb_struct%count, 1, total_error)
+  CALL verify("h5pcreate_f", cls_cb_struct%id, lid1, total_error)
+
+  ! Close second list 
+  CALL h5pclose_f(lid2, error);
+  CALL check("h5pclose_f", error, total_error)
+
+  ! Verify that the close callback occurred
+  CALL verify("h5pcreate_f", cls_cb_struct%count, 2, total_error)
+  CALL verify("h5pcreate_f", cls_cb_struct%id, lid2, total_error)
+
+  ! Close class 
+  CALL h5pclose_class_f(cid1, error)
+  CALL check("h5pclose_class_f", error, total_error)
+
+END SUBROUTINE test_genprop_class_callback
+
+!-------------------------------------------------------------------------
+! Function: test_h5p_file_image
+!
+! Purpose: Tests APIs:
+!          h5pget_file_image_f and h5pset_file_image_f
+!
+! Return:      Success: 0
+!              Failure: -1
+!
+! FORTRAN Programmer: M. Scot Breitenfeld
+!                     April 1, 2014
+!-------------------------------------------------------------------------
+
+SUBROUTINE test_h5p_file_image(total_error)
+
+  USE, INTRINSIC :: iso_c_binding
+  IMPLICIT NONE
+  INTEGER, INTENT(INOUT) :: total_error
+  INTEGER(hid_t) ::   fapl_1 = -1
+  INTEGER, PARAMETER :: count = 10
+  INTEGER, DIMENSION(1:count), TARGET :: buffer
+  INTEGER, DIMENSION(1:count), TARGET :: temp
+  INTEGER :: i   
+  INTEGER(size_t) :: size
+  INTEGER(size_t) :: temp_size
+  INTEGER :: error ! error return value
+  TYPE(C_PTR) :: f_ptr
+  TYPE(C_PTR), DIMENSION(1:count) :: f_ptr1
+  TYPE(C_PTR), DIMENSION(1:1) :: f_ptr2
+
+  INTEGER(HSIZE_T) :: sizeof_buffer
+
+  ! Initialize file image buffer
+  DO i = 1, count
+     buffer(i) = i*10
+  ENDDO
+
+  ! Create fapl
+  CALL h5pcreate_f(H5P_FILE_ACCESS_F, fapl_1, error)
+  CALL check("h5pcreate_f", error, total_error)
+
+  ! Test with NULL ptr
+  f_ptr2(1) = C_NULL_PTR
+  temp_size = 1
+  CALL h5pget_file_image_f(fapl_1, f_ptr2, temp_size, error)
+  CALL check("h5pget_file_image_f", error, total_error)
+  CALL verify("h5pget_file_image_f", INT(temp_size), 0, total_error)
+
+  ! Set file image
+  f_ptr = C_LOC(buffer(1))
+  size = H5_SIZEOF(buffer(1))*count
+
+  CALL h5pset_file_image_f(fapl_1, f_ptr, size, error)
+  CALL check("h5pset_file_image_f", error, total_error)
+  
+  ! Get the same data back
+  DO i = 1, count
+     f_ptr1(i) = C_LOC(temp(i))
+  ENDDO
+
+  temp_size = 0
+  CALL h5pget_file_image_f(fapl_1, f_ptr1, temp_size, error)
+  CALL check("h5pget_file_image_f", error, total_error)
+
+  ! Check that sizes are the same, and that the buffers are identical but separate
+  CALL verify("h5pget_file_image_f", INT(temp_size), INT(size), total_error)
+  
+  ! Verify the image data is correct
+  DO i = 1, count
+     CALL verify("h5pget_file_image_f", temp(i), buffer(i), total_error)
+  ENDDO
+
+END SUBROUTINE test_h5p_file_image
+
+!-------------------------------------------------------------------------
+! Function: external_test_offset
+!
+! Purpose: Tests APIs:
+!      h5pset_external_f (with offsets not equal to zero), h5pget_external_f
+!
+! Return:      Success: 0
+!              Failure: -1
+!
+! FORTRAN Programmer: M. Scot Breitenfeld
+!                     January 10, 2012
+!-------------------------------------------------------------------------
+!
+SUBROUTINE external_test_offset(cleanup,total_error)
+
+  IMPLICIT NONE
+  INTEGER, INTENT(INOUT) :: total_error
+  LOGICAL, INTENT(IN)  :: cleanup
+
+  INTEGER(hid_t) :: fapl=-1   ! file access property list
+  INTEGER(hid_t) :: file=-1   ! file to write to		
+  INTEGER(hid_t) :: dcpl=-1   ! dataset creation properties	
+  INTEGER(hid_t) :: space=-1  ! data space			
+  INTEGER(hid_t) :: dset=-1   ! dataset			
+  INTEGER(hid_t) :: grp=-1    ! group to emit diagnostics
+  INTEGER(size_t) :: i, j     ! miscellaneous counters	
+  CHARACTER(LEN=180) :: filename   ! file names
+  INTEGER, DIMENSION(1:25) :: part
+  INTEGER, DIMENSION(1:100), TARGET :: whole ! raw data buffers		
+  INTEGER(hsize_t), DIMENSION(1:1) :: cur_size ! current data space size	
+  INTEGER(hid_t) :: hs_space  ! hyperslab data space		
+  INTEGER(hsize_t), DIMENSION(1:1) :: hs_start = (/30/) ! hyperslab starting offset	
+  INTEGER(hsize_t), DIMENSION(1:1) :: hs_count = (/25/) ! hyperslab size
+  CHARACTER(LEN=1) :: ichr1 ! character conversion holder
+  INTEGER :: error ! error status
+  TYPE(C_PTR) :: f_ptr ! fortran pointer
+  INTEGER(HSIZE_T) :: sizeof_part
+
+  CHARACTER(LEN=1,KIND=C_CHAR), DIMENSION(1:30) :: temparray
+
+  temparray(1:30)(1:1) = '0' ! 1 byte character
+
+  ! Write the data to external files directly
+  DO i = 1, 4
+     DO j = 1, 25
+        part(j) = (i-1)*25+(j-1)
+     ENDDO
+     WRITE(ichr1,'(I1.1)') i
+     filename = "extern_"//ichr1//"a.raw"
+     OPEN(10, FILE=filename, ACCESS='STREAM', form='UNFORMATTED')
+     
+     WRITE(10) temparray(1:(i-1)*10)
+     WRITE(10) part
+     CLOSE(10)
+  ENDDO
+  !
+  ! Create the file and an initial group. 
+  CALL h5pcreate_f(H5P_FILE_ACCESS_F, fapl, error)
+  CALL h5fcreate_f('extren_raw.h5', H5F_ACC_TRUNC_F, file, error, access_prp=fapl)
+  CALL check("h5fcreate_f",error,total_error)
+  
+  CALL h5gcreate_f(file, "emit-diagnostics", grp, error)
+  CALL check("h5gcreate_f",error, total_error)
+  
+  ! Create the dataset
+
+  sizeof_part = INT(H5_SIZEOF(part(1))*25, hsize_t) 
+
+  CALL h5pcreate_f(H5P_DATASET_CREATE_F, dcpl, error)
+  CALL check("h5pcreate_f", error, total_error)
+  CALL h5pset_external_f(dcpl, "extern_1a.raw", INT(0,off_t), sizeof_part, error)
+  CALL check("h5pset_external_f",error,total_error)
+  CALL h5pset_external_f(dcpl, "extern_2a.raw", INT(10,off_t), sizeof_part, error)
+  CALL check("h5pset_external_f",error,total_error)
+  CALL h5pset_external_f(dcpl, "extern_3a.raw", INT(20,off_t), sizeof_part, error)
+  CALL check("h5pset_external_f",error,total_error)
+  CALL h5pset_external_f(dcpl, "extern_4a.raw", INT(30,off_t), sizeof_part, error)
+  CALL check("h5pset_external_f",error,total_error)
+  
+  cur_size(1) = 100
+  CALL h5screate_simple_f(1, cur_size, space, error)
+  CALL check("h5screate_simple_f", error, total_error)
+  CALL h5dcreate_f(file, "dset1", H5T_NATIVE_INTEGER, space, dset,error,dcpl_id=dcpl)
+  CALL check("h5dcreate_f", error, total_error)
+
+  !
+  ! Read the entire dataset and compare with the original
+  whole(:) = 0
+  f_ptr = C_LOC(whole(1))
+  CALL h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, error, mem_space_id=space, file_space_id=space)
+  CALL check("h5dread_f", error, total_error)
+
+  DO i = 1, 100
+     IF(whole(i) .NE. i-1)THEN
+        WRITE(*,*) "Incorrect value(s) read."
+        total_error =  total_error + 1
+        EXIT
+     ENDIF
+  ENDDO
+  !
+  ! Read the middle of the dataset
+  CALL h5scopy_f(space, hs_space, error)
+  CALL check("h5scopy_f", error, total_error)
+  CALL h5sselect_hyperslab_f(hs_space, H5S_SELECT_SET_F, hs_start, hs_count, error)
+  CALL check("h5sselect_hyperslab_f", error, total_error)
+
+  whole(:) = 0
+  f_ptr = C_LOC(whole(1))
+  CALL h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, error, mem_space_id=hs_space, file_space_id=hs_space)
+  CALL check("h5dread_f", error, total_error)
+
+  CALL h5sclose_f(hs_space, error)
+  CALL check("h5sclose_f", error, total_error)
+  DO i = INT(hs_start(1))+1, INT(hs_start(1)+hs_count(1))
+     IF(whole(i) .NE. i-1)THEN
+        WRITE(*,*) "Incorrect value(s) read."
+        total_error =  total_error + 1
+        EXIT
+     ENDIF
+  ENDDO
+  
+  CALL h5dclose_f(dset, error)
+  CALL check("h5dclose_f", error, total_error)
+  CALL h5pclose_f(dcpl, error)
+  CALL check("h5pclose_f", error, total_error)
+  CALL h5sclose_f(space, error)
+  CALL check("h5sclose_f", error, total_error)
+  CALL h5fclose_f(file, error)
+  CALL check("h5fclose_f", error, total_error)
+
+  ! cleanup
+  DO i = 1, 4
+     WRITE(ichr1,'(I1.1)') i
+     filename = "extern_"//ichr1//"a.raw"
+     CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+     CALL check("h5_cleanup_f", error, total_error)
+  ENDDO
+  IF(cleanup) CALL h5_cleanup_f("extren_raw.h5", H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+
+END SUBROUTINE external_test_offset
+END MODULE TH5P_F03
diff --git a/fortran/test/tH5P_F03.f90 b/fortran/test/tH5P_F03.f90
deleted file mode 100644
index 56f9679..0000000
--- a/fortran/test/tH5P_F03.f90
+++ /dev/null
@@ -1,632 +0,0 @@
-!****h* root/fortran/test/tH5P_F03.f90
-!
-! NAME
-!  tH5P_F03.f90
-!
-! FUNCTION
-!  Test FORTRAN HDF5 H5P APIs which are dependent on FORTRAN 2003
-!  features. 
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! USES
-!  test_genprop_cls_cb1_mod
-!
-! CONTAINS SUBROUTINES
-!  test_create, test_genprop_class_callback
-!
-!*****
-
-! *****************************************
-! ***        H 5 P   T E S T S
-! *****************************************
-MODULE test_genprop_cls_cb1_mod
-
-  ! Callback subroutine for test_genprop_class_callback
-  ! and the function H5Pcreate_class_f.
-
-  USE HDF5
-  USE ISO_C_BINDING
-  IMPLICIT NONE
-  
-  TYPE, BIND(C) :: cop_cb_struct_ !  Struct for iterations 
-    INTEGER :: count
-    INTEGER(HID_T) :: id
-  END TYPE cop_cb_struct_
-
-CONTAINS
-  
-  INTEGER FUNCTION test_genprop_cls_cb1_f(list_id, create_data ) bind(C)
-    
-    USE HDF5
-    USE ISO_C_BINDING
-    IMPLICIT NONE
-
-    INTEGER(HID_T), INTENT(IN), VALUE :: list_id
-    
-    TYPE(cop_cb_struct_) :: create_data
-
-    create_data%count = create_data%count + 1
-    create_data%id = list_id
-
-    test_genprop_cls_cb1_f = 0
-    
-  END FUNCTION test_genprop_cls_cb1_f
-
-END MODULE test_genprop_cls_cb1_mod
-
-MODULE TH5P_F03
-
-CONTAINS
-
-!-------------------------------------------------------------------------
-! * Function:	test_create
-! *
-! * Purpose:	Tests H5Pset_fill_value_f and H5Pget_fill_value_f
-! *
-! * Return:	Success:	0
-! *
-! *		Failure:	number of errors
-! *
-! * Programmer:	M. Scot Breitenfeld
-! *             June 24, 2008
-! *
-! * Modifications:
-! *
-! *-------------------------------------------------------------------------
-! 
-
-SUBROUTINE test_create(total_error)
-
-  USE HDF5 
-  USE TH5_MISC
-  USE ISO_C_BINDING
-  IMPLICIT NONE
-
-  INTEGER, INTENT(INOUT) :: total_error
-  INTEGER(HID_T) :: fapl
-
-  INTEGER(hid_t) :: file=-1, space=-1, dcpl=-1, comp_type_id=-1
-  INTEGER(hid_t) :: dset9=-1
-  INTEGER(hsize_t), DIMENSION(1:5), PARAMETER :: cur_size = (/2, 8, 8, 4, 2/)
-  INTEGER(hsize_t), DIMENSION(1:5), PARAMETER :: ch_size= (/1, 1, 1, 4, 1/)
-  CHARACTER(LEN=14) :: filename ='test_create.h5'
-
-  TYPE(comp_datatype), TARGET :: rd_c, fill_ctype
-  INTEGER :: error
-  INTEGER(SIZE_T) :: h5off
-  TYPE(C_PTR) :: f_ptr
-  LOGICAL :: differ1, differ2
-  CHARACTER(LEN=1) :: cfill
-  INTEGER :: ifill
-  REAL :: rfill
-  REAL(KIND=dp) :: dpfill
-
-  !
-  ! * Create a file.
-  ! 
-  CALL h5fcreate_f(filename,H5F_ACC_TRUNC_F,file,error)
-  CALL check("h5fcreate_f", error, total_error)   
-
-  CALL h5screate_simple_f(5, cur_size, space, error, cur_size)
-  CALL check("h5screate_simple_f", error, total_error)
-
-  CALL H5Pcreate_f(H5P_DATASET_CREATE_F, dcpl, error)
-  CALL check("H5Pcreate_f", error, total_error)
-
-  CALL h5pset_chunk_f(dcpl, 5, ch_size, error)
-  CALL check("h5pset_chunk_f",error, total_error)
-
-  !  Create a compound datatype 
-  CALL h5tcreate_f(H5T_COMPOUND_F, H5_SIZEOF(fill_ctype), comp_type_id, error)
-  CALL check("h5tcreate_f", error, total_error)
-  h5off = H5OFFSETOF(C_LOC(fill_ctype), C_LOC(fill_ctype%a))
-  CALL h5tinsert_f(comp_type_id, "a", h5off , H5T_NATIVE_REAL, error)
-  CALL check("h5tinsert_f", error, total_error)
-  CALL h5tinsert_f(comp_type_id, "x", H5OFFSETOF(C_LOC(fill_ctype), C_LOC(fill_ctype%x)), H5T_NATIVE_INTEGER, error)
-  CALL check("h5tinsert_f", error, total_error)
-  CALL h5tinsert_f(comp_type_id, "y", H5OFFSETOF(C_LOC(fill_ctype), C_LOC(fill_ctype%y)), H5T_NATIVE_DOUBLE, error)
-  CALL check("h5tinsert_f", error, total_error)
-  CALL h5tinsert_f(comp_type_id, "z", &
-       H5OFFSETOF(C_LOC(fill_ctype), C_LOC(fill_ctype%z)), H5T_NATIVE_CHARACTER, error)
-  CALL check("h5tinsert_f", error, total_error)
-
-
-  CALL H5Pset_alloc_time_f(dcpl, H5D_ALLOC_TIME_LATE_F,error)
-  CALL check("H5Pset_alloc_time_f",error, total_error)
-
-  CALL H5Pset_fill_time_f(dcpl, H5D_FILL_TIME_ALLOC_F, error)
-  CALL check("H5Pset_fill_time_f",error, total_error)
-
-  !  Compound datatype test 
-
-  f_ptr = C_LOC(fill_ctype)
-
-  CALL H5Pget_fill_value_f(dcpl, comp_type_id, f_ptr, error)
-  CALL check("H5Pget_fill_value_f",error, total_error)
-
-  fill_ctype%y = 4444.D0
-  fill_ctype%z = 'S'
-  fill_ctype%a = 5555.
-  fill_ctype%x = 55
-
-  f_ptr = C_LOC(fill_ctype)
-
-  ! Test various fill values
-  CALL H5Pset_fill_value_f(dcpl, H5T_NATIVE_CHARACTER, 'X', error)
-  CALL check("H5Pset_fill_value_f",error, total_error)
-  CALL h5pget_fill_value_f(dcpl, H5T_NATIVE_CHARACTER, cfill, error)
-  CALL check("H5Pget_fill_value_f",error, total_error)
-  IF(cfill.NE.'X')THEN
-     PRINT*,"***ERROR: Returned wrong fill value (character)"
-     total_error = total_error + 1
-  ENDIF
-  CALL H5Pset_fill_value_f(dcpl, H5T_NATIVE_INTEGER, 9, error)
-  CALL check("H5Pset_fill_value_f",error, total_error)
-  CALL h5pget_fill_value_f(dcpl, H5T_NATIVE_INTEGER, ifill, error)
-  CALL check("H5Pget_fill_value_f",error, total_error)
-  IF(ifill.NE.9)THEN
-     PRINT*,"***ERROR: Returned wrong fill value (integer)"
-     total_error = total_error + 1
-  ENDIF
-  CALL H5Pset_fill_value_f(dcpl, H5T_NATIVE_DOUBLE, 1.0_dp, error)
-  CALL check("H5Pset_fill_value_f",error, total_error)
-  CALL h5pget_fill_value_f(dcpl, H5T_NATIVE_DOUBLE, dpfill, error)
-  CALL check("H5Pget_fill_value_f",error, total_error)
-  IF(.NOT.dreal_eq( REAL(dpfill,dp), 1.0_dp))THEN
-     PRINT*,"***ERROR: Returned wrong fill value (double)"
-     total_error = total_error + 1
-  ENDIF
-  CALL H5Pset_fill_value_f(dcpl, H5T_NATIVE_REAL, 2.0, error)
-  CALL check("H5Pset_fill_value_f",error, total_error)
-  CALL h5pget_fill_value_f(dcpl, H5T_NATIVE_REAL, rfill, error)
-  CALL check("H5Pget_fill_value_f",error, total_error)
-  IF(.NOT.dreal_eq( REAL(rfill,dp), REAL(2.0,dp)))THEN
-     PRINT*,"***ERROR: Returned wrong fill value (real)"
-     total_error = total_error + 1
-  ENDIF
-
-  ! For the actual compound type
-  CALL H5Pset_fill_value_f(dcpl, comp_type_id, f_ptr, error)
-  CALL check("H5Pget_fill_value_f",error, total_error)
-
-  CALL h5dcreate_f(file,"dset9", comp_type_id, space, dset9, error, dcpl_id=dcpl)
-  CALL check("h5dcreate_f", error, total_error)
-
-  CALL h5dclose_f(dset9, error)
-  CALL check("h5dclose_f", error, total_error)
-
-  CALL h5fclose_f(file,error)
-  CALL check("h5fclose_f", error, total_error)
-
-  !  Open the file and get the dataset fill value from each dataset 
-  CALL H5Pcreate_f(H5P_FILE_ACCESS_F, fapl, error)
-  CALL check("H5Pcreate_f",error, total_error)
-
-  CALL H5Pset_libver_bounds_f(fapl, H5F_LIBVER_LATEST_F, H5F_LIBVER_LATEST_F, error)
-  CALL check("H5Pset_libver_bounds_f",error, total_error)
-
-  CALL h5fopen_f (FILENAME, H5F_ACC_RDONLY_F, file, error, fapl)
-  CALL check("h5fopen_f", error, total_error)
-
-  ! Compound datatype test 
-  CALL h5dopen_f(file, "dset9", dset9, error)
-  CALL check("h5dopen_f", error, total_error)
-
-  CALL H5Dget_create_plist_f(dset9, dcpl, error)
-  CALL check("H5Dget_create_plist_f", error, total_error)
-
-  f_ptr = C_LOC(rd_c)
-
-  CALL H5Pget_fill_value_f(dcpl, comp_type_id, f_ptr, error)
-  CALL check("H5Pget_fill_value_f", error, total_error)
-
-  IF( .NOT.dreal_eq( REAL(rd_c%a,dp), REAL(fill_ctype%a, dp)) .OR. &
-      .NOT.dreal_eq( REAL(rd_c%y,dp), REAL(fill_ctype%y, dp)) .OR. &
-      rd_c%x .NE. fill_ctype%x .OR. &
-      rd_c%z .NE. fill_ctype%z )THEN
-
-     PRINT*,"***ERROR: Returned wrong fill value"
-     total_error = total_error + 1
-
-  ENDIF
-
-  CALL h5dclose_f(dset9, error)
-  CALL check("h5dclose_f", error, total_error)
-
-  CALL H5Pclose_f(dcpl, error)
-  CALL check("H5Pclose_f", error, total_error)
-
-  CALL h5fclose_f(file,error)
-  CALL check("h5fclose_f", error, total_error)
-
-END SUBROUTINE test_create
-
-
-SUBROUTINE test_genprop_class_callback(total_error)
-
-  !
-  !
-  !  test_genprop_class_callback(): Test basic generic property list code.
-  !      Tests callbacks for property lists in a generic class.
-  !
-  !  FORTRAN TESTS:
-  !      Tests function H5Pcreate_class_f with callback.
-  !
-  !
-
-  USE HDF5
-  USE TH5_MISC
-  USE ISO_C_BINDING
-  USE test_genprop_cls_cb1_mod
-  IMPLICIT NONE
-
-  INTEGER, INTENT(INOUT) :: total_error
-
-  INTEGER(hid_t) :: cid1, cid2 ! Generic Property class ID 
-  INTEGER(hid_t) :: lid1, lid2 ! Generic Property list ID 
-  INTEGER(size_t) :: nprops ! Number of properties in class 
-
-  TYPE(cop_cb_struct_), TARGET :: crt_cb_struct, cls_cb_struct
-  INTEGER :: CLASS1_NAME_SIZE = 7 ! length of class string
-  CHARACTER(LEN=7) :: CLASS1_NAME = "Class 1", CLASS1_NAME_BUF
-  TYPE(C_FUNPTR) :: f1, f5
-  TYPE(C_PTR) :: f2, f6
-
-  CHARACTER(LEN=10) :: PROP1_NAME = "Property 1"
-  INTEGER(SIZE_T) :: PROP1_SIZE = 10
-  CHARACTER(LEN=10) :: PROP2_NAME = "Property 2"
-  INTEGER(SIZE_T) :: PROP2_SIZE = 10
-  CHARACTER(LEN=10) :: PROP3_NAME = "Property 3"
-  INTEGER(SIZE_T) :: PROP3_SIZE = 10
-  CHARACTER(LEN=10) :: PROP4_NAME = "Property 4"
-  INTEGER(SIZE_T) :: PROP4_SIZE = 10
-  INTEGER :: PROP1_DEF_VALUE = 10
-  INTEGER :: PROP2_DEF_VALUE = 10
-  INTEGER :: PROP3_DEF_VALUE = 10
-  INTEGER :: PROP4_DEF_VALUE = 10
-
-  INTEGER :: error !  Generic RETURN value	
-  LOGICAL :: flag  ! for tests
-
-  f1 = C_FUNLOC(test_genprop_cls_cb1_f)
-  f5 = C_FUNLOC(test_genprop_cls_cb1_f)
-
-  f2 = C_LOC(crt_cb_struct)
-  f6 = C_LOC(cls_cb_struct)
-
-  ! Create a new generic class, derived from the root of the class hierarchy 
-  CALL h5pcreate_class_f(h5p_ROOT_F, CLASS1_NAME, cid1, error, f1, f2, c_null_funptr, c_null_ptr, f5, f6)
-  CALL check("h5pcreate_class_f", error, total_error)
-
-  ! Insert first property into class (with no callbacks) 
-  CALL h5pregister_f(cid1, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, error)
-  CALL check("h5pregister_f", error, total_error)
-  ! Insert second property into class (with no callbacks) 
-  CALL h5pregister_f(cid1, PROP2_NAME, PROP2_SIZE, PROP2_DEF_VALUE, error)
-  CALL check("h5pregister_f", error, total_error)
-  ! Insert third property into class (with no callbacks) 
-  CALL h5pregister_f(cid1, PROP3_NAME, PROP3_SIZE, PROP3_DEF_VALUE, error)
-  CALL check("h5pregister_f", error, total_error)
-
-  ! Insert fourth property into class (with no callbacks) 
-  CALL h5pregister_f(cid1, PROP4_NAME, PROP4_SIZE, PROP4_DEF_VALUE, error)
-  CALL check("h5pregister_f", error, total_error)
-
-  !  Check the number of properties in class 
-  CALL h5pget_nprops_f(cid1, nprops, error)
-  CALL check("h5pget_nprops_f", error, total_error)
-  CALL VERIFY("h5pget_nprops_f", INT(nprops), 4, total_error)
-
-  !  Initialize class callback structs 
-
-  crt_cb_struct%count = 0
-  crt_cb_struct%id    = -1
-  cls_cb_struct%count = 0
-  cls_cb_struct%id    = -1
-
-  ! Create a property list from the class 
-  CALL h5pcreate_f(cid1, lid1, error)
-  CALL check("h5pcreate_f", error, total_error)
-
-  ! Get the list's class 
-  CALL H5Pget_class_f(lid1, cid2, error)
-  CALL check("H5Pget_class_f", error, total_error)
-
-  !  Check that the list's class is correct 
-  CALL H5Pequal_f(cid2, cid1, flag, error)
-  CALL check("H5Pequal_f", error, total_error)
-  CALL verifylogical("H5Pequal_f", flag, .TRUE., total_error)
-
-  ! Check the class name
-  CALL H5Pget_class_name_f(cid2, CLASS1_NAME_BUF, CLASS1_NAME_SIZE, error)
-  CALL check("H5Pget_class_name_f", error, total_error)
-  CALL verifystring("H5Pget_class_name_f", CLASS1_NAME_BUF, CLASS1_NAME, error)
-  IF(error.NE.0)THEN
-     WRITE(*,*) 'Class names do not match! name=',CLASS1_NAME_BUF, 'CLASS1_NAME=',CLASS1_NAME
-     total_error = total_error + 1
-  ENDIF
-  ! Close class 
-  CALL h5pclose_class_f(cid2, error)
-  CALL check("h5pclose_class_f", error, total_error)
-
-  ! Verify that the creation callback occurred 
-  CALL VERIFY("h5pcreate_f", crt_cb_struct%count, 1, total_error)
-  CALL VERIFY_INTEGER_HID_T("h5pcreate_f", crt_cb_struct%id, lid1, total_error)
-
-  !  Check the number of properties in list 
-  CALL h5pget_nprops_f(lid1,nprops, error)
-  CALL check("h5pget_nprops_f", error, total_error)
-  CALL VERIFY("h5pget_nprops_f", INT(nprops), 4, total_error)
-
-  !  Create another property list from the class 
-  CALL h5pcreate_f(cid1, lid2, error)
-  CALL check("h5pcreate_f", error, total_error)
-
-  !  Verify that the creation callback occurred 
-  CALL VERIFY("h5pcreate_f", crt_cb_struct%count, 2, total_error)
-  CALL VERIFY_INTEGER_HID_T("h5pcreate_f", crt_cb_struct%id, lid2, total_error)
-
-  !  Check the number of properties in list 
-  CALL h5pget_nprops_f(lid2,nprops, error)
-  CALL check("h5pget_nprops_f", error, total_error)
-  CALL VERIFY("h5pget_nprops_f", INT(nprops), 4, total_error)
-
-  !  Close first list 
-  CALL h5pclose_f(lid1, error);
-  CALL check("h5pclose_f", error, total_error)
-
-  ! Verify that the close callback occurred 
-  CALL VERIFY("h5pcreate_f", cls_cb_struct%count, 1, total_error)
-  CALL VERIFY_INTEGER_HID_T("h5pcreate_f", cls_cb_struct%id, lid1, total_error)
-
-  ! Close second list 
-  CALL h5pclose_f(lid2, error);
-  CALL check("h5pclose_f", error, total_error)
-
-  ! Verify that the close callback occurred
-  CALL VERIFY("h5pcreate_f", cls_cb_struct%count, 2, total_error)
-  CALL verify_INTEGER_HID_T("h5pcreate_f", cls_cb_struct%id, lid2, total_error)
-
-  ! Close class 
-  CALL h5pclose_class_f(cid1, error)
-  CALL check("h5pclose_class_f", error, total_error)
-
-END SUBROUTINE test_genprop_class_callback
-
-!-------------------------------------------------------------------------
-! Function: test_h5p_file_image
-!
-! Purpose: Tests APIs:
-!          h5pget_file_image_f and h5pset_file_image_f
-!
-! Return:      Success: 0
-!              Failure: -1
-!
-! FORTRAN Programmer: M. Scot Breitenfeld
-!                     April 1, 2014
-!-------------------------------------------------------------------------
-
-SUBROUTINE test_h5p_file_image(total_error)
-
-  USE HDF5
-  USE TH5_MISC
-  USE, INTRINSIC :: iso_c_binding
-  IMPLICIT NONE
-  INTEGER, INTENT(INOUT) :: total_error
-  INTEGER(hid_t) ::   fapl_1 = -1
-  INTEGER, PARAMETER :: count = 10
-  INTEGER, DIMENSION(1:count), TARGET :: buffer
-  INTEGER, DIMENSION(1:count), TARGET :: temp
-  INTEGER :: i   
-  INTEGER(size_t) :: size
-  INTEGER(size_t) :: temp_size
-  INTEGER :: error ! error return value
-  TYPE(C_PTR) :: f_ptr
-  TYPE(C_PTR), DIMENSION(1:count) :: f_ptr1
-  TYPE(C_PTR), DIMENSION(1:1) :: f_ptr2
-
-  INTEGER(HSIZE_T) :: sizeof_buffer
-
-  ! Initialize file image buffer
-  DO i = 1, count
-     buffer(i) = i*10
-  ENDDO
-
-  ! Create fapl
-  CALL h5pcreate_f(H5P_FILE_ACCESS_F, fapl_1, error)
-  CALL check("h5pcreate_f", error, total_error)
-
-  ! Test with NULL ptr
-  f_ptr2(1) = C_NULL_PTR
-  temp_size = 1
-  CALL h5pget_file_image_f(fapl_1, f_ptr2, temp_size, error)
-  CALL check("h5pget_file_image_f", error, total_error)
-  CALL verify("h5pget_file_image_f", INT(temp_size), 0, total_error)
-
-  ! Set file image
-  f_ptr = C_LOC(buffer(1))
-  size = H5_SIZEOF(buffer(1))*count
-
-  CALL h5pset_file_image_f(fapl_1, f_ptr, size, error)
-  CALL check("h5pset_file_image_f", error, total_error)
-  
-  ! Get the same data back
-  DO i = 1, count
-     f_ptr1(i) = C_LOC(temp(i))
-  ENDDO
-
-  temp_size = 0
-  CALL h5pget_file_image_f(fapl_1, f_ptr1, temp_size, error)
-  CALL check("h5pget_file_image_f", error, total_error)
-
-  ! Check that sizes are the same, and that the buffers are identical but separate
-  CALL VERIFY("h5pget_file_image_f", INT(temp_size), INT(size), total_error)
-  
-  ! Verify the image data is correct
-  DO i = 1, count
-     CALL VERIFY("h5pget_file_image_f", temp(i), buffer(i), total_error)
-  ENDDO
-
-END SUBROUTINE test_h5p_file_image
-
-!-------------------------------------------------------------------------
-! Function: external_test_offset
-!
-! Purpose: Tests APIs:
-!      h5pset_external_f (with offsets not equal to zero), h5pget_external_f
-!
-! Return:      Success: 0
-!              Failure: -1
-!
-! FORTRAN Programmer: M. Scot Breitenfeld
-!                     January 10, 2012
-!-------------------------------------------------------------------------
-!
-SUBROUTINE external_test_offset(cleanup,total_error)
-
-  USE ISO_C_BINDING
-  USE TH5_MISC
-  USE HDF5 ! This module contains all necessary modules
-
-  IMPLICIT NONE
-  INTEGER, INTENT(INOUT) :: total_error
-  LOGICAL, INTENT(IN)  :: cleanup
-
-  INTEGER(hid_t) :: fapl=-1   ! file access property list
-  INTEGER(hid_t) :: file=-1   ! file to write to		
-  INTEGER(hid_t) :: dcpl=-1   ! dataset creation properties	
-  INTEGER(hid_t) :: space=-1  ! data space			
-  INTEGER(hid_t) :: dset=-1   ! dataset			
-  INTEGER(hid_t) :: grp=-1    ! group to emit diagnostics
-  INTEGER(size_t) :: i, j     ! miscellaneous counters	
-  CHARACTER(LEN=180) :: filename   ! file names
-  INTEGER, DIMENSION(1:25) :: part
-  INTEGER, DIMENSION(1:100), TARGET :: whole ! raw data buffers		
-  INTEGER(hsize_t), DIMENSION(1:1) :: cur_size ! current data space size	
-  INTEGER(hid_t) :: hs_space  ! hyperslab data space		
-  INTEGER(hsize_t), DIMENSION(1:1) :: hs_start = (/30/) ! hyperslab starting offset	
-  INTEGER(hsize_t), DIMENSION(1:1) :: hs_count = (/25/) ! hyperslab size
-  CHARACTER(LEN=1) :: ichr1 ! character conversion holder
-  INTEGER :: error ! error status
-  TYPE(C_PTR) :: f_ptr ! fortran pointer
-  INTEGER(HSIZE_T) :: sizeof_part
-
-  CHARACTER(LEN=1,KIND=C_CHAR), DIMENSION(1:30) :: temparray
-
-  temparray(1:30)(1:1) = '0' ! 1 byte character
-
-  ! Write the data to external files directly
-  DO i = 1, 4
-     DO j = 1, 25
-        part(j) = (i-1)*25+(j-1)
-     ENDDO
-     WRITE(ichr1,'(I1.1)') i
-     filename = "extern_"//ichr1//"a.raw"
-     OPEN(10, FILE=filename, ACCESS='STREAM', form='UNFORMATTED')
-     
-     WRITE(10) temparray(1:(i-1)*10)
-     WRITE(10) part
-     CLOSE(10)
-  ENDDO
-  !
-  ! Create the file and an initial group. 
-  CALL h5pcreate_f(H5P_FILE_ACCESS_F, fapl, error)
-  CALL h5fcreate_f('extren_raw.h5', H5F_ACC_TRUNC_F, file, error, access_prp=fapl)
-  CALL check("h5fcreate_f",error,total_error)
-  
-  CALL h5gcreate_f(file, "emit-diagnostics", grp, error)
-  CALL check("h5gcreate_f",error, total_error)
-  
-  ! Create the dataset
-
-  sizeof_part = INT(H5_SIZEOF(part(1))*25, hsize_t) 
-
-  CALL h5pcreate_f(H5P_DATASET_CREATE_F, dcpl, error)
-  CALL check("h5pcreate_f", error, total_error)
-  CALL h5pset_external_f(dcpl, "extern_1a.raw", INT(0,off_t), sizeof_part, error)
-  CALL check("h5pset_external_f",error,total_error)
-  CALL h5pset_external_f(dcpl, "extern_2a.raw", INT(10,off_t), sizeof_part, error)
-  CALL check("h5pset_external_f",error,total_error)
-  CALL h5pset_external_f(dcpl, "extern_3a.raw", INT(20,off_t), sizeof_part, error)
-  CALL check("h5pset_external_f",error,total_error)
-  CALL h5pset_external_f(dcpl, "extern_4a.raw", INT(30,off_t), sizeof_part, error)
-  CALL check("h5pset_external_f",error,total_error)
-  
-  cur_size(1) = 100
-  CALL h5screate_simple_f(1, cur_size, space, error)
-  CALL check("h5screate_simple_f", error, total_error)
-  CALL h5dcreate_f(file, "dset1", H5T_NATIVE_INTEGER, space, dset,error,dcpl_id=dcpl)
-  CALL check("h5dcreate_f", error, total_error)
-
-  !
-  ! Read the entire dataset and compare with the original
-  whole(:) = 0
-  f_ptr = C_LOC(whole(1))
-  CALL h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, error, mem_space_id=space, file_space_id=space)
-  CALL check("h5dread_f", error, total_error)
-
-  DO i = 1, 100
-     IF(whole(i) .NE. i-1)THEN
-        WRITE(*,*) "Incorrect value(s) read."
-        total_error =  total_error + 1
-        EXIT
-     ENDIF
-  ENDDO
-  !
-  ! Read the middle of the dataset
-  CALL h5scopy_f(space, hs_space, error)
-  CALL check("h5scopy_f", error, total_error)
-  CALL h5sselect_hyperslab_f(hs_space, H5S_SELECT_SET_F, hs_start, hs_count, error)
-  CALL check("h5sselect_hyperslab_f", error, total_error)
-
-  whole(:) = 0
-  f_ptr = C_LOC(whole(1))
-  CALL h5dread_f(dset, H5T_NATIVE_INTEGER, f_ptr, error, mem_space_id=hs_space, file_space_id=hs_space)
-  CALL check("h5dread_f", error, total_error)
-
-  CALL h5sclose_f(hs_space, error)
-  CALL check("h5sclose_f", error, total_error)
-  DO i = INT(hs_start(1))+1, INT(hs_start(1)+hs_count(1))
-     IF(whole(i) .NE. i-1)THEN
-        WRITE(*,*) "Incorrect value(s) read."
-        total_error =  total_error + 1
-        EXIT
-     ENDIF
-  ENDDO
-  
-  CALL h5dclose_f(dset, error)
-  CALL check("h5dclose_f", error, total_error)
-  CALL h5pclose_f(dcpl, error)
-  CALL check("h5pclose_f", error, total_error)
-  CALL h5sclose_f(space, error)
-  CALL check("h5sclose_f", error, total_error)
-  CALL h5fclose_f(file, error)
-  CALL check("h5fclose_f", error, total_error)
-
-  ! cleanup
-  DO i = 1, 4
-     WRITE(ichr1,'(I1.1)') i
-     filename = "extern_"//ichr1//"a.raw"
-     CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-     CALL check("h5_cleanup_f", error, total_error)
-  ENDDO
-  IF(cleanup) CALL h5_cleanup_f("extren_raw.h5", H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-
-END SUBROUTINE external_test_offset
-END MODULE TH5P_F03
diff --git a/fortran/test/tH5R.F90 b/fortran/test/tH5R.F90
new file mode 100644
index 0000000..ef392b4
--- /dev/null
+++ b/fortran/test/tH5R.F90
@@ -0,0 +1,483 @@
+!****h* root/fortran/test/tH5R.f90
+!
+! NAME
+!  tH5R.f90
+!
+! FUNCTION
+!  Basic testing of Fortran H5R, Reference Interface, APIs.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! NOTES
+!  Tests h5rcreate_f, h5rdereference_f, h5rget_name_f 
+!  and H5Rget_object_type functions
+!
+! CONTAINS SUBROUTINES
+!  refobjtest, refregtest
+!
+!*****
+!
+MODULE TH5R
+
+  USE HDF5
+  USE TH5_MISC
+  USE TH5_MISC_GEN
+
+CONTAINS
+
+SUBROUTINE refobjtest(cleanup, total_error)
+  IMPLICIT NONE
+  LOGICAL, INTENT(IN)  :: cleanup
+  INTEGER, INTENT(INOUT) :: total_error
+
+  CHARACTER(LEN=9), PARAMETER :: filename = "reference"
+  CHARACTER(LEN=80) :: fix_filename
+  CHARACTER(LEN=8), PARAMETER :: dsetnamei = "INTEGERS"
+  CHARACTER(LEN=17), PARAMETER :: dsetnamer = "OBJECT_REFERENCES"
+  CHARACTER(LEN=6), PARAMETER :: groupname1 = "GROUP1"
+  CHARACTER(LEN=6), PARAMETER :: groupname2 = "GROUP2"
+
+  INTEGER(HID_T) :: file_id       ! File identifier
+  INTEGER(HID_T) :: grp1_id       ! Group identifier
+  INTEGER(HID_T) :: grp2_id       ! Group identifier
+  INTEGER(HID_T) :: dset1_id      ! Dataset identifier
+  INTEGER(HID_T) :: dsetr_id      ! Dataset identifier
+  INTEGER(HID_T) :: type_id       ! Type identifier
+  INTEGER(HID_T) :: space_id      ! Dataspace identifier
+  INTEGER(HID_T) :: spacer_id     ! Dataspace identifier
+  INTEGER     ::   error, obj_type
+  INTEGER(HSIZE_T), DIMENSION(1) :: dims = (/5/)
+  INTEGER(HSIZE_T), DIMENSION(1) :: dimsr= (/4/)
+  INTEGER(HSIZE_T), DIMENSION(1) :: my_maxdims = (/5/)
+  INTEGER :: rank = 1
+  INTEGER :: rankr = 1
+  TYPE(hobj_ref_t_f), DIMENSION(4) ::  ref
+  TYPE(hobj_ref_t_f), DIMENSION(4) ::  ref_out
+  INTEGER(HSIZE_T), DIMENSION(1) :: ref_dim
+  INTEGER, DIMENSION(5) :: DATA = (/1, 2, 3, 4, 5/)
+  INTEGER(HSIZE_T), DIMENSION(2) :: data_dims
+
+  CHARACTER(LEN=7) :: buf        ! buffer to hold the region name
+  CHARACTER(LEN=16) :: buf_big    ! buffer bigger then needed
+  INTEGER(SIZE_T) :: buf_size     ! returned size of the region buffer name
+
+  !
+  !Create a new file with Default file access and
+  !file creation properties .
+  !
+  CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+  IF (error .NE. 0) THEN
+     WRITE(*,*) "Cannot modify filename"
+     STOP
+  ENDIF
+  CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
+  CALL check("h5fcreate_f",error,total_error)
+
+
+  !
+  ! Create a group inside the file
+  !
+  CALL h5gcreate_f(file_id, groupname1, grp1_id, error)
+  CALL check("h5gcreate_f",error,total_error)
+
+  !
+  ! Create a group inside the group GROUP1
+  !
+  CALL h5gcreate_f(grp1_id, groupname2, grp2_id, error)
+  CALL check("h5gcreate_f",error,total_error)
+
+  !
+  ! Create dataspaces for datasets
+  !
+  CALL h5screate_simple_f(rank, dims, space_id, error, maxdims=my_maxdims)
+  CALL check("h5screate_simple_f",error,total_error)
+  CALL h5screate_simple_f(rankr, dimsr, spacer_id, error)
+  CALL check("h5screate_simple_f",error,total_error)
+
+  !
+  ! Create integer dataset
+  !
+  CALL h5dcreate_f(file_id, dsetnamei, H5T_NATIVE_INTEGER, space_id, &
+       dset1_id, error)
+  CALL check("h5dcreate_f",error,total_error)
+  !
+  ! Create dataset to store references to the objects
+  !
+  CALL h5dcreate_f(file_id, dsetnamer, H5T_STD_REF_OBJ, spacer_id, &
+       dsetr_id, error)
+  CALL check("h5dcreate_f",error,total_error)
+  !
+  ! Create a datatype and store in the file
+  !
+  CALL h5tcopy_f(H5T_NATIVE_REAL, type_id, error)
+  CALL check("h5tcopy_f",error,total_error)
+  CALL h5tcommit_f(file_id, "MyType", type_id, error)
+  CALL check("h5tcommit_f",error,total_error)
+  !
+  !  Close dataspaces, groups and integer dataset
+  !
+  CALL h5sclose_f(space_id, error)
+  CALL check("h5sclose_f",error,total_error)
+  CALL h5sclose_f(spacer_id, error)
+  CALL check("h5sclose_f",error,total_error)
+  CALL h5dclose_f(dset1_id, error)
+  CALL check("h5dclose_f",error,total_error)
+  CALL h5tclose_f(type_id, error)
+  CALL check("h5tclose_f",error,total_error)
+  CALL h5gclose_f(grp1_id, error)
+  CALL check("h5gclose_f",error,total_error)
+  CALL h5gclose_f(grp2_id, error)
+  CALL check("h5gclose_f",error,total_error)
+
+  !
+  ! Craete references to two groups, integer dataset and shared datatype
+  ! and write it to the dataset in the file
+  !
+  CALL h5rcreate_f(file_id, groupname1, ref(1), error)
+  CALL check("h5rcreate_f",error,total_error)
+  CALL h5rcreate_f(file_id, "/GROUP1/GROUP2", ref(2), error)
+  CALL check("h5rcreate_f",error,total_error)
+  CALL h5rcreate_f(file_id, dsetnamei, ref(3), error)
+  CALL check("h5rcreate_f",error,total_error)
+  CALL h5rcreate_f(file_id, "MyType", ref(4), error)
+  CALL check("h5rcreate_f",error,total_error)
+  ref_dim(1) = SIZE(ref)
+  CALL h5dwrite_f(dsetr_id, H5T_STD_REF_OBJ, ref, ref_dim, error)
+  CALL check("h5dwrite_f",error,total_error)
+
+  ! getting path to normal dataset in root group
+
+  CALL H5Rget_name_f(dsetr_id, ref(1), buf, error, buf_size )
+  CALL check("H5Rget_name_f", error, total_error)
+
+
+  CALL verify("H5Rget_name_f", INT(buf_size),7, total_error)
+  CALL verify("H5Rget_name_f", buf, "/GROUP1", total_error)
+
+  ! with buffer bigger then needed
+
+  CALL H5Rget_name_f(dsetr_id, ref(1), buf_big, error, buf_size )
+  CALL check("H5Rget_name_f", error, total_error)
+  CALL verify("H5Rget_name_f", INT(buf_size),7,total_error)
+  CALL verify("H5Rget_name_f", TRIM(buf_big), "/GROUP1", total_error)
+
+  ! getting path to dataset in /Group1
+
+  CALL H5Rget_name_f(dsetr_id, ref(2), buf_big, error, buf_size )
+  CALL check("H5Rget_name_f", error, total_error)
+  CALL verify("H5Rget_name_f", INT(buf_size),14,total_error)
+  CALL verify("H5Rget_name_f", TRIM(buf_big), "/GROUP1/GROUP2", total_error)
+
+  !
+  !Close the dataset
+  !
+  CALL h5dclose_f(dsetr_id, error)
+  CALL check("h5dclose_f",error,total_error)
+
+  !
+  ! Reopen the dataset with object references
+  !
+  CALL h5dopen_f(file_id, dsetnamer,dsetr_id,error)
+  CALL check("h5dopen_f",error,total_error)
+  ref_dim(1) = SIZE(ref_out)
+  CALL h5dread_f(dsetr_id, H5T_STD_REF_OBJ, ref_out, ref_dim, error)
+  CALL check("h5dread_f",error,total_error)
+
+  !
+  !get the third reference's type and Dereference it
+  !
+  CALL h5rget_object_type_f(dsetr_id, ref(3), obj_type, error)
+  CALL check("h5rget_object_type_f",error,total_error)
+  IF (obj_type == H5G_DATASET_F) THEN
+     CALL h5rdereference_f(dsetr_id, ref(3), dset1_id, error)
+     CALL check("h5rdereference_f",error,total_error)
+
+     data_dims(1) = 5
+     CALL h5dwrite_f(dset1_id, H5T_NATIVE_INTEGER, DATA, data_dims, error)
+     CALL check("h5dwrite_f",error,total_error)
+  END IF
+
+  !
+  !get the fourth reference's type and Dereference it
+  !
+  CALL h5rget_object_type_f(dsetr_id, ref(4), obj_type, error)
+  CALL check("h5rget_object_type_f",error,total_error)
+  IF (obj_type == H5G_TYPE_F) THEN
+     CALL h5rdereference_f(dsetr_id, ref(4), type_id, error)
+     CALL check("h5rdereference_f",error,total_error)
+  END IF
+
+  !
+  ! Close all objects.
+  !
+  CALL h5dclose_f(dset1_id, error)
+  CALL check("h5dclose_f",error,total_error)
+  CALL h5tclose_f(type_id, error)
+  CALL check("h5tclose_f",error,total_error)
+
+  CALL h5dclose_f(dsetr_id, error)
+  CALL check("h5dclose_f",error,total_error)
+  CALL h5fclose_f(file_id, error)
+  CALL check("h5fclose_f",error,total_error)
+
+  IF(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+  RETURN
+
+END SUBROUTINE refobjtest
+!
+!   The following subroutine tests h5rget_region_f, h5rcreate_f, h5rget_name_f,
+!   and h5rdereference_f functionalities
+!
+SUBROUTINE refregtest(cleanup, total_error)
+
+  IMPLICIT NONE
+  LOGICAL, INTENT(IN)  :: cleanup
+  INTEGER, INTENT(INOUT) :: total_error
+
+  CHARACTER(LEN=6), PARAMETER :: filename = "Refreg"
+  CHARACTER(LEN=80) :: fix_filename
+  CHARACTER(LEN=6), PARAMETER :: dsetnamev = "MATRIX"
+  CHARACTER(LEN=17), PARAMETER :: dsetnamer = "REGION_REFERENCES"
+
+  CHARACTER(LEN=7) :: buf        ! buffer to hold the region name
+  CHARACTER(LEN=11) :: buf_big    ! buffer bigger then needed
+  CHARACTER(LEN=4) :: buf_small  ! buffer smaller then needed
+  INTEGER(SIZE_T) :: buf_size     ! returned size of the region buffer name
+  INTEGER(HID_T) :: file_id       ! File identifier
+  INTEGER(HID_T) :: space_id      ! Dataspace identifier
+  INTEGER(HID_T) :: spacer_id     ! Dataspace identifier
+  INTEGER(HID_T) :: dsetv_id      ! Dataset identifier
+  INTEGER(HID_T) :: dsetr_id      ! Dataset identifier
+  INTEGER     ::   error
+!  TYPE(hdset_reg_ref_t_f) , DIMENSION(1:2), TARGET :: ref 
+  TYPE(hdset_reg_ref_t_f) , DIMENSION(1:2) :: ref 
+  TYPE(hdset_reg_ref_t_f) , DIMENSION(1:2) :: ref_out
+  INTEGER(HSIZE_T), DIMENSION(2) :: ref_dim   = (/0,0/)
+  INTEGER(HSIZE_T), DIMENSION(2) :: data_dims ! = (/0,0/)
+  INTEGER(HSIZE_T), DIMENSION(2) :: dims      = (/2,9/)  ! Datasets dimensions
+  INTEGER(HSIZE_T), DIMENSION(1) :: dimsr     = (/2/)    ! 
+  INTEGER(HSIZE_T), DIMENSION(2) :: start     ! = (/0,0/)
+  INTEGER(HSIZE_T), DIMENSION(2) :: count     ! = (/0,0/)
+
+  INTEGER :: rankr = 1
+  INTEGER :: rank = 2
+!  INTEGER , DIMENSION(2,9), TARGET ::  DATA 
+  INTEGER , DIMENSION(2,9) ::  DATA 
+  INTEGER , DIMENSION(2,9) ::  data_out = 0
+  INTEGER(HSIZE_T) , DIMENSION(2,3) :: coord
+  INTEGER(SIZE_T) ::num_points = 3  ! Number of selected points
+!  type(c_ptr) :: f_ptr
+  coord = RESHAPE((/1,1,2,7,1,9/), (/2,3/))   ! Coordinates of selected points
+  DATA = RESHAPE ((/1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6/), (/2,9/))
+
+  ref_out(1)%ref = 0
+  ref_out(2)%ref = 0
+
+  !
+  !  Initialize FORTRAN predefined datatypes.
+  !
+  !          CALL h5init_types_f(error)
+  !              CALL check("h5init_types_f", error, total_error)
+  !
+  !  Create a new file.
+  !
+  CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+  IF (error .NE. 0) THEN
+     WRITE(*,*) "Cannot modify filename"
+     STOP
+  ENDIF
+  CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
+  ! Default file access and file creation
+  ! properties are used.
+  CALL check("h5fcreate_f", error, total_error)
+  !
+  ! Create  dataspaces:
+  !
+  ! for dataset with references to dataset regions
+  !
+  CALL h5screate_simple_f(rankr, dimsr, spacer_id, error)
+  CALL check("h5screate_simple_f", error, total_error)
+  !
+  ! for integer dataset
+  !
+  CALL h5screate_simple_f(rank, dims, space_id, error)
+  CALL check("h5screate_simple_f", error, total_error)
+  !
+  ! Create  and write datasets:
+  !
+  ! Integer dataset
+  !
+  CALL h5dcreate_f(file_id, dsetnamev, H5T_NATIVE_INTEGER, space_id, &
+       dsetv_id, error)
+  CALL check("h5dcreate_f", error, total_error)
+  data_dims(1) = 2
+  data_dims(2) = 9
+
+!  f_ptr = c_loc(data)
+!  CALL h5dwrite_f(dsetv_id, H5T_NATIVE_INTEGER, f_ptr, error)
+
+  CALL h5dwrite_f(dsetv_id, H5T_NATIVE_INTEGER, DATA, data_dims, error)
+  CALL check("h5dwrite_f", error, total_error)
+
+  CALL h5dclose_f(dsetv_id, error)
+  CALL check("h5dclose_f", error, total_error)
+
+  !
+  ! Dataset with references
+  !
+  CALL h5dcreate_f(file_id, dsetnamer, H5T_STD_REF_DSETREG, spacer_id, &
+       dsetr_id, error)
+  CALL check("h5dcreate_f", error, total_error)
+  !
+  ! Create a reference to the hyperslab selection.
+  !
+  start(1) = 0
+  start(2) = 3
+  COUNT(1) = 2
+  COUNT(2) = 3
+  CALL h5sselect_hyperslab_f(space_id, H5S_SELECT_SET_F, &
+       start, count, error)
+  CALL check("h5sselect_hyperslab_f", error, total_error)
+  ref(1)%ref(:) = 0
+!  f_ptr = C_LOC(ref(1))
+!  CALL h5rcreate_f(file_id, dsetnamev, 1, space_id, f_ptr, error) 
+  CALL h5rcreate_f(file_id, dsetnamev, space_id, ref(1), error)
+  CALL check("h5rcreate_f", error, total_error)
+
+  !
+  ! Create a reference to elements selection.
+  !
+  CALL h5sselect_none_f(space_id, error)
+  CALL check("h5sselect_none_f", error, total_error)
+  CALL h5sselect_elements_f(space_id, H5S_SELECT_SET_F, rank, num_points,&
+       coord, error)
+  CALL check("h5sselect_elements_f", error, total_error)
+  ref(2)%ref(:) = 0
+  CALL h5rcreate_f(file_id, dsetnamev, space_id, ref(2), error)
+  CALL check("h5rcreate_f", error, total_error)
+  !
+  ! Write dataset with the references.
+  !
+  ref_dim(1) = SIZE(ref)
+  CALL h5dwrite_f(dsetr_id, H5T_STD_REF_DSETREG, ref, ref_dim, error)
+  CALL check("h5dwrite_f", error, total_error)
+  !
+  ! Close all objects.
+  !
+  CALL h5sclose_f(space_id, error)
+  CALL check("h5sclose_f", error, total_error)
+  CALL h5sclose_f(spacer_id, error)
+  CALL check("h5sclose_f", error, total_error)
+  CALL h5dclose_f(dsetr_id, error)
+  CALL check("h5dclose_f", error, total_error)
+  CALL h5fclose_f(file_id, error)
+  CALL check("h5fclose_f", error, total_error)
+
+  !
+  ! Reopen the file to test selections.
+  !
+  CALL h5fopen_f (fix_filename, H5F_ACC_RDWR_F, file_id, error)
+  CALL check("h5fopen_f", error, total_error)
+  CALL h5dopen_f(file_id, dsetnamer, dsetr_id, error)
+  CALL check("h5dopen_f", error, total_error)
+  !
+  ! Read references to the dataset regions.
+  !
+  ref_dim(1) = SIZE(ref_out)
+  CALL h5dread_f(dsetr_id, H5T_STD_REF_DSETREG, ref_out, ref_dim, error)
+  CALL check("h5dread_f", error, total_error)
+
+  ! Get name of the dataset the first region reference points to using H5Rget_name_f
+  CALL H5Rget_name_f(dsetr_id, ref_out(1), buf, error, buf_size )
+  CALL check("H5Rget_name_f", error, total_error)
+  CALL verify("H5Rget_name_f", INT(buf_size),7,total_error)
+  CALL verify("H5Rget_name_f", buf, "/MATRIX", total_error)
+
+  ! Get name of the dataset the first region reference points to using H5Rget_name_f
+  ! buffer bigger then needed
+  CALL H5Rget_name_f(dsetr_id, ref_out(1), buf_big, error, buf_size )
+  CALL check("H5Rget_name_f", error, total_error)
+  CALL verify("H5Rget_name_f", INT(buf_size),7,total_error)
+  CALL verify("H5Rget_name_f", TRIM(buf_big), "/MATRIX", total_error)
+
+
+  ! Get name of the dataset the first region reference points to using H5Rget_name_f
+  ! buffer smaller then needed
+  CALL H5Rget_name_f(dsetr_id, ref_out(1), buf_small, error, buf_size )
+  CALL check("H5Rget_name_f", error, total_error)
+  CALL verify("H5Rget_name_f", INT(buf_size),7,total_error)
+  CALL verify("H5Rget_name_f", TRIM(buf_small), "/MAT", total_error)
+  !
+  ! Dereference the first reference.
+  !
+  CALL H5rdereference_f(dsetr_id, ref_out(1), dsetv_id, error)
+  CALL check("h5rdereference_f", error, total_error)
+  CALL H5rget_region_f(dsetr_id, ref_out(1), space_id, error)
+  CALL check("h5rget_region_f", error, total_error)
+
+  ! Get name of the dataset the second region reference points to using H5Rget_name_f
+  CALL H5Rget_name_f(dsetr_id, ref_out(2), buf, error) ! no optional size
+  CALL check("H5Rget_name_f", error, total_error)
+  CALL verify("H5Rget_name_f", TRIM(buf), "/MATRIX", total_error)
+  !
+  ! Read selected data from the dataset.
+  !
+  data_dims(1) = 2
+  data_dims(2) = 9
+  CALL h5dread_f(dsetv_id, H5T_NATIVE_INTEGER, data_out, data_dims, error, &
+       mem_space_id = space_id, file_space_id = space_id)
+  CALL check("h5dread_f", error, total_error)
+  CALL h5sclose_f(space_id, error)
+  CALL check("h5sclose_f", error, total_error)
+  CALL h5dclose_f(dsetv_id, error)
+  CALL check("h5dclose_f", error, total_error)
+  data_out = 0
+  !
+  ! Dereference the second reference.
+  !
+  CALL H5rdereference_f(dsetr_id, ref_out(2), dsetv_id, error)
+  CALL check("h5rdereference_f", error, total_error)
+
+  CALL H5rget_region_f(dsetr_id, ref_out(2), space_id, error)
+  CALL check("h5rget_region_f", error, total_error)
+  !
+  ! Read selected data from the dataset.
+  !
+  CALL h5dread_f(dsetv_id, H5T_NATIVE_INTEGER, data_out, data_dims, error, &
+       mem_space_id = space_id, file_space_id = space_id)
+  CALL check("h5dread_f", error, total_error)
+  !
+  ! Close all objects
+  !
+  CALL h5sclose_f(space_id, error)
+  CALL check("h5sclose_f", error, total_error)
+  CALL h5dclose_f(dsetv_id, error)
+  CALL check("h5dclose_f", error, total_error)
+  CALL h5dclose_f(dsetr_id, error)
+  CALL check("h5dclose_f", error, total_error)
+  CALL h5fclose_f(file_id, error)
+  CALL check("h5fclose_f", error, total_error)
+
+
+  IF(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+  RETURN
+
+END SUBROUTINE refregtest
+
+END MODULE TH5R
diff --git a/fortran/test/tH5R.f90 b/fortran/test/tH5R.f90
deleted file mode 100644
index bd6264f..0000000
--- a/fortran/test/tH5R.f90
+++ /dev/null
@@ -1,486 +0,0 @@
-!****h* root/fortran/test/tH5R.f90
-!
-! NAME
-!  tH5R.f90
-!
-! FUNCTION
-!  Basic testing of Fortran H5R, Reference Interface, APIs.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!  Tests h5rcreate_f, h5rdereference_f, h5rget_name_f 
-!  and H5Rget_object_type functions
-!
-! CONTAINS SUBROUTINES
-!  refobjtest, refregtest
-!
-!*****
-!
-MODULE TH5R
-
-CONTAINS
-
-SUBROUTINE refobjtest(cleanup, total_error)
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-  IMPLICIT NONE
-  LOGICAL, INTENT(IN)  :: cleanup
-  INTEGER, INTENT(INOUT) :: total_error
-
-  CHARACTER(LEN=9), PARAMETER :: filename = "reference"
-  CHARACTER(LEN=80) :: fix_filename
-  CHARACTER(LEN=8), PARAMETER :: dsetnamei = "INTEGERS"
-  CHARACTER(LEN=17), PARAMETER :: dsetnamer = "OBJECT_REFERENCES"
-  CHARACTER(LEN=6), PARAMETER :: groupname1 = "GROUP1"
-  CHARACTER(LEN=6), PARAMETER :: groupname2 = "GROUP2"
-
-  INTEGER(HID_T) :: file_id       ! File identifier
-  INTEGER(HID_T) :: grp1_id       ! Group identifier
-  INTEGER(HID_T) :: grp2_id       ! Group identifier
-  INTEGER(HID_T) :: dset1_id      ! Dataset identifier
-  INTEGER(HID_T) :: dsetr_id      ! Dataset identifier
-  INTEGER(HID_T) :: type_id       ! Type identifier
-  INTEGER(HID_T) :: space_id      ! Dataspace identifier
-  INTEGER(HID_T) :: spacer_id     ! Dataspace identifier
-  INTEGER     ::   error, obj_type
-  INTEGER(HSIZE_T), DIMENSION(1) :: dims = (/5/)
-  INTEGER(HSIZE_T), DIMENSION(1) :: dimsr= (/4/)
-  INTEGER(HSIZE_T), DIMENSION(1) :: my_maxdims = (/5/)
-  INTEGER :: rank = 1
-  INTEGER :: rankr = 1
-  TYPE(hobj_ref_t_f), DIMENSION(4) ::  ref
-  TYPE(hobj_ref_t_f), DIMENSION(4) ::  ref_out
-  INTEGER(HSIZE_T), DIMENSION(1) :: ref_dim
-  INTEGER, DIMENSION(5) :: DATA = (/1, 2, 3, 4, 5/)
-  INTEGER(HSIZE_T), DIMENSION(2) :: data_dims
-
-  CHARACTER(LEN=7) :: buf        ! buffer to hold the region name
-  CHARACTER(LEN=16) :: buf_big    ! buffer bigger then needed
-  INTEGER(SIZE_T) :: buf_size     ! returned size of the region buffer name
-
-  !
-  !Create a new file with Default file access and
-  !file creation properties .
-  !
-  CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
-  IF (error .NE. 0) THEN
-     WRITE(*,*) "Cannot modify filename"
-     STOP
-  ENDIF
-  CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
-  CALL check("h5fcreate_f",error,total_error)
-
-
-  !
-  ! Create a group inside the file
-  !
-  CALL h5gcreate_f(file_id, groupname1, grp1_id, error)
-  CALL check("h5gcreate_f",error,total_error)
-
-  !
-  ! Create a group inside the group GROUP1
-  !
-  CALL h5gcreate_f(grp1_id, groupname2, grp2_id, error)
-  CALL check("h5gcreate_f",error,total_error)
-
-  !
-  ! Create dataspaces for datasets
-  !
-  CALL h5screate_simple_f(rank, dims, space_id, error, maxdims=my_maxdims)
-  CALL check("h5screate_simple_f",error,total_error)
-  CALL h5screate_simple_f(rankr, dimsr, spacer_id, error)
-  CALL check("h5screate_simple_f",error,total_error)
-
-  !
-  ! Create integer dataset
-  !
-  CALL h5dcreate_f(file_id, dsetnamei, H5T_NATIVE_INTEGER, space_id, &
-       dset1_id, error)
-  CALL check("h5dcreate_f",error,total_error)
-  !
-  ! Create dataset to store references to the objects
-  !
-  CALL h5dcreate_f(file_id, dsetnamer, H5T_STD_REF_OBJ, spacer_id, &
-       dsetr_id, error)
-  CALL check("h5dcreate_f",error,total_error)
-  !
-  ! Create a datatype and store in the file
-  !
-  CALL h5tcopy_f(H5T_NATIVE_REAL, type_id, error)
-  CALL check("h5tcopy_f",error,total_error)
-  CALL h5tcommit_f(file_id, "MyType", type_id, error)
-  CALL check("h5tcommit_f",error,total_error)
-
-  !
-  !  Close dataspaces, groups and integer dataset
-  !
-  CALL h5sclose_f(space_id, error)
-  CALL check("h5sclose_f",error,total_error)
-  CALL h5sclose_f(spacer_id, error)
-  CALL check("h5sclose_f",error,total_error)
-  CALL h5dclose_f(dset1_id, error)
-  CALL check("h5dclose_f",error,total_error)
-  CALL h5tclose_f(type_id, error)
-  CALL check("h5tclose_f",error,total_error)
-  CALL h5gclose_f(grp1_id, error)
-  CALL check("h5gclose_f",error,total_error)
-  CALL h5gclose_f(grp2_id, error)
-  CALL check("h5gclose_f",error,total_error)
-
-  !
-  ! Craete references to two groups, integer dataset and shared datatype
-  ! and write it to the dataset in the file
-  !
-  CALL h5rcreate_f(file_id, groupname1, ref(1), error)
-  CALL check("h5rcreate_f",error,total_error)
-  CALL h5rcreate_f(file_id, "/GROUP1/GROUP2", ref(2), error)
-  CALL check("h5rcreate_f",error,total_error)
-  CALL h5rcreate_f(file_id, dsetnamei, ref(3), error)
-  CALL check("h5rcreate_f",error,total_error)
-  CALL h5rcreate_f(file_id, "MyType", ref(4), error)
-  CALL check("h5rcreate_f",error,total_error)
-  ref_dim(1) = SIZE(ref)
-  CALL h5dwrite_f(dsetr_id, H5T_STD_REF_OBJ, ref, ref_dim, error)
-  CALL check("h5dwrite_f",error,total_error)
-
-  ! getting path to normal dataset in root group
-
-  CALL H5Rget_name_f(dsetr_id, ref(1), buf, error, buf_size )
-  CALL check("H5Rget_name_f", error, total_error)
-
-
-  CALL VERIFY("H5Rget_name_f", INT(buf_size),7, total_error)
-  CALL VerifyString("H5Rget_name_f", buf, "/GROUP1", total_error)
-
-  ! with buffer bigger then needed
-
-  CALL H5Rget_name_f(dsetr_id, ref(1), buf_big, error, buf_size )
-  CALL check("H5Rget_name_f", error, total_error)
-  CALL VERIFY("H5Rget_name_f", INT(buf_size),7,total_error)
-  CALL VerifyString("H5Rget_name_f", TRIM(buf_big), "/GROUP1", total_error)
-
-  ! getting path to dataset in /Group1
-
-  CALL H5Rget_name_f(dsetr_id, ref(2), buf_big, error, buf_size )
-  CALL check("H5Rget_name_f", error, total_error)
-  CALL VERIFY("H5Rget_name_f", INT(buf_size),14,total_error)
-  CALL VerifyString("H5Rget_name_f", TRIM(buf_big), "/GROUP1/GROUP2", total_error)
-
-  !
-  !Close the dataset
-  !
-  CALL h5dclose_f(dsetr_id, error)
-  CALL check("h5dclose_f",error,total_error)
-
-  !
-  ! Reopen the dataset with object references
-  !
-  CALL h5dopen_f(file_id, dsetnamer,dsetr_id,error)
-  CALL check("h5dopen_f",error,total_error)
-  ref_dim(1) = SIZE(ref_out)
-  CALL h5dread_f(dsetr_id, H5T_STD_REF_OBJ, ref_out, ref_dim, error)
-  CALL check("h5dread_f",error,total_error)
-
-  !
-  !get the third reference's type and Dereference it
-  !
-  CALL h5rget_object_type_f(dsetr_id, ref(3), obj_type, error)
-  CALL check("h5rget_object_type_f",error,total_error)
-  IF (obj_type == H5G_DATASET_F) THEN
-     CALL h5rdereference_f(dsetr_id, ref(3), dset1_id, error)
-     CALL check("h5rdereference_f",error,total_error)
-
-     data_dims(1) = 5
-     CALL h5dwrite_f(dset1_id, H5T_NATIVE_INTEGER, DATA, data_dims, error)
-     CALL check("h5dwrite_f",error,total_error)
-  END IF
-
-  !
-  !get the fourth reference's type and Dereference it
-  !
-  CALL h5rget_object_type_f(dsetr_id, ref(4), obj_type, error)
-  CALL check("h5rget_object_type_f",error,total_error)
-  IF (obj_type == H5G_TYPE_F) THEN
-     CALL h5rdereference_f(dsetr_id, ref(4), type_id, error)
-     CALL check("h5rdereference_f",error,total_error)
-  END IF
-
-  !
-  ! Close all objects.
-  !
-  CALL h5dclose_f(dset1_id, error)
-  CALL check("h5dclose_f",error,total_error)
-  CALL h5tclose_f(type_id, error)
-  CALL check("h5tclose_f",error,total_error)
-
-  CALL h5dclose_f(dsetr_id, error)
-  CALL check("h5dclose_f",error,total_error)
-  CALL h5fclose_f(file_id, error)
-  CALL check("h5fclose_f",error,total_error)
-
-
-  IF(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-  RETURN
-
-END SUBROUTINE refobjtest
-!
-!   The following subroutine tests h5rget_region_f, h5rcreate_f, h5rget_name_f,
-!   and h5rdereference_f functionalities
-!
-SUBROUTINE refregtest(cleanup, total_error)
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-!  use iso_c_binding  ! NOTE: if this is uncommented, then need to move subroutine into another file.
-
-  IMPLICIT NONE
-  LOGICAL, INTENT(IN)  :: cleanup
-  INTEGER, INTENT(INOUT) :: total_error
-
-  CHARACTER(LEN=6), PARAMETER :: filename = "Refreg"
-  CHARACTER(LEN=80) :: fix_filename
-  CHARACTER(LEN=6), PARAMETER :: dsetnamev = "MATRIX"
-  CHARACTER(LEN=17), PARAMETER :: dsetnamer = "REGION_REFERENCES"
-
-  CHARACTER(LEN=7) :: buf        ! buffer to hold the region name
-  CHARACTER(LEN=11) :: buf_big    ! buffer bigger then needed
-  CHARACTER(LEN=4) :: buf_small  ! buffer smaller then needed
-  INTEGER(SIZE_T) :: buf_size     ! returned size of the region buffer name
-  INTEGER(HID_T) :: file_id       ! File identifier
-  INTEGER(HID_T) :: space_id      ! Dataspace identifier
-  INTEGER(HID_T) :: spacer_id     ! Dataspace identifier
-  INTEGER(HID_T) :: dsetv_id      ! Dataset identifier
-  INTEGER(HID_T) :: dsetr_id      ! Dataset identifier
-  INTEGER     ::   error
-!  TYPE(hdset_reg_ref_t_f) , DIMENSION(1:2), TARGET :: ref 
-  TYPE(hdset_reg_ref_t_f) , DIMENSION(1:2) :: ref 
-  TYPE(hdset_reg_ref_t_f) , DIMENSION(1:2) :: ref_out
-  INTEGER(HSIZE_T), DIMENSION(2) :: ref_dim   = (/0,0/)
-  INTEGER(HSIZE_T), DIMENSION(2) :: data_dims ! = (/0,0/)
-  INTEGER(HSIZE_T), DIMENSION(2) :: dims      = (/2,9/)  ! Datasets dimensions
-  INTEGER(HSIZE_T), DIMENSION(1) :: dimsr     = (/2/)    ! 
-  INTEGER(HSIZE_T), DIMENSION(2) :: start     ! = (/0,0/)
-  INTEGER(HSIZE_T), DIMENSION(2) :: count     ! = (/0,0/)
-
-  INTEGER :: rankr = 1
-  INTEGER :: rank = 2
-!  INTEGER , DIMENSION(2,9), TARGET ::  DATA 
-  INTEGER , DIMENSION(2,9) ::  DATA 
-  INTEGER , DIMENSION(2,9) ::  data_out = 0
-  INTEGER(HSIZE_T) , DIMENSION(2,3) :: coord
-  INTEGER(SIZE_T) ::num_points = 3  ! Number of selected points
-!  type(c_ptr) :: f_ptr
-  coord = RESHAPE((/1,1,2,7,1,9/), (/2,3/))   ! Coordinates of selected points
-  DATA = RESHAPE ((/1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6/), (/2,9/))
-
-  ref_out(1)%ref = 0
-  ref_out(2)%ref = 0
-
-  !
-  !  Initialize FORTRAN predefined datatypes.
-  !
-  !          CALL h5init_types_f(error)
-  !              CALL check("h5init_types_f", error, total_error)
-  !
-  !  Create a new file.
-  !
-  CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
-  IF (error .NE. 0) THEN
-     WRITE(*,*) "Cannot modify filename"
-     STOP
-  ENDIF
-  CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
-  ! Default file access and file creation
-  ! properties are used.
-  CALL check("h5fcreate_f", error, total_error)
-  !
-  ! Create  dataspaces:
-  !
-  ! for dataset with references to dataset regions
-  !
-  CALL h5screate_simple_f(rankr, dimsr, spacer_id, error)
-  CALL check("h5screate_simple_f", error, total_error)
-  !
-  ! for integer dataset
-  !
-  CALL h5screate_simple_f(rank, dims, space_id, error)
-  CALL check("h5screate_simple_f", error, total_error)
-  !
-  ! Create  and write datasets:
-  !
-  ! Integer dataset
-  !
-  CALL h5dcreate_f(file_id, dsetnamev, H5T_NATIVE_INTEGER, space_id, &
-       dsetv_id, error)
-  CALL check("h5dcreate_f", error, total_error)
-  data_dims(1) = 2
-  data_dims(2) = 9
-
-!  f_ptr = c_loc(data)
-!  CALL h5dwrite_f(dsetv_id, H5T_NATIVE_INTEGER, f_ptr, error)
-
-  CALL h5dwrite_f(dsetv_id, H5T_NATIVE_INTEGER, DATA, data_dims, error)
-  CALL check("h5dwrite_f", error, total_error)
-
-  CALL h5dclose_f(dsetv_id, error)
-  CALL check("h5dclose_f", error, total_error)
-
-  !
-  ! Dataset with references
-  !
-  CALL h5dcreate_f(file_id, dsetnamer, H5T_STD_REF_DSETREG, spacer_id, &
-       dsetr_id, error)
-  CALL check("h5dcreate_f", error, total_error)
-  !
-  ! Create a reference to the hyperslab selection.
-  !
-  start(1) = 0
-  start(2) = 3
-  COUNT(1) = 2
-  COUNT(2) = 3
-  CALL h5sselect_hyperslab_f(space_id, H5S_SELECT_SET_F, &
-       start, count, error)
-  CALL check("h5sselect_hyperslab_f", error, total_error)
-  ref(1)%ref(:) = 0
-!  f_ptr = C_LOC(ref(1))
-!  CALL h5rcreate_f(file_id, dsetnamev, 1, space_id, f_ptr, error) 
-  CALL h5rcreate_f(file_id, dsetnamev, space_id, ref(1), error)
-  CALL check("h5rcreate_f", error, total_error)
-
-  !
-  ! Create a reference to elements selection.
-  !
-  CALL h5sselect_none_f(space_id, error)
-  CALL check("h5sselect_none_f", error, total_error)
-  CALL h5sselect_elements_f(space_id, H5S_SELECT_SET_F, rank, num_points,&
-       coord, error)
-  CALL check("h5sselect_elements_f", error, total_error)
-  ref(2)%ref(:) = 0
-  CALL h5rcreate_f(file_id, dsetnamev, space_id, ref(2), error)
-  CALL check("h5rcreate_f", error, total_error)
-  !
-  ! Write dataset with the references.
-  !
-  ref_dim(1) = SIZE(ref)
-  CALL h5dwrite_f(dsetr_id, H5T_STD_REF_DSETREG, ref, ref_dim, error)
-  CALL check("h5dwrite_f", error, total_error)
-  !
-  ! Close all objects.
-  !
-  CALL h5sclose_f(space_id, error)
-  CALL check("h5sclose_f", error, total_error)
-  CALL h5sclose_f(spacer_id, error)
-  CALL check("h5sclose_f", error, total_error)
-  CALL h5dclose_f(dsetr_id, error)
-  CALL check("h5dclose_f", error, total_error)
-  CALL h5fclose_f(file_id, error)
-  CALL check("h5fclose_f", error, total_error)
-
-  !
-  ! Reopen the file to test selections.
-  !
-  CALL h5fopen_f (fix_filename, H5F_ACC_RDWR_F, file_id, error)
-  CALL check("h5fopen_f", error, total_error)
-  CALL h5dopen_f(file_id, dsetnamer, dsetr_id, error)
-  CALL check("h5dopen_f", error, total_error)
-  !
-  ! Read references to the dataset regions.
-  !
-  ref_dim(1) = SIZE(ref_out)
-  CALL h5dread_f(dsetr_id, H5T_STD_REF_DSETREG, ref_out, ref_dim, error)
-  CALL check("h5dread_f", error, total_error)
-
-  ! Get name of the dataset the first region reference points to using H5Rget_name_f
-  CALL H5Rget_name_f(dsetr_id, ref_out(1), buf, error, buf_size )
-  CALL check("H5Rget_name_f", error, total_error)
-  CALL VERIFY("H5Rget_name_f", INT(buf_size),7,total_error)
-  CALL VerifyString("H5Rget_name_f", buf, "/MATRIX", total_error)
-
-  ! Get name of the dataset the first region reference points to using H5Rget_name_f
-  ! buffer bigger then needed
-  CALL H5Rget_name_f(dsetr_id, ref_out(1), buf_big, error, buf_size )
-  CALL check("H5Rget_name_f", error, total_error)
-  CALL VERIFY("H5Rget_name_f", INT(buf_size),7,total_error)
-  CALL VerifyString("H5Rget_name_f", TRIM(buf_big), "/MATRIX", total_error)
-
-
-  ! Get name of the dataset the first region reference points to using H5Rget_name_f
-  ! buffer smaller then needed
-  CALL H5Rget_name_f(dsetr_id, ref_out(1), buf_small, error, buf_size )
-  CALL check("H5Rget_name_f", error, total_error)
-  CALL VERIFY("H5Rget_name_f", INT(buf_size),7,total_error)
-  CALL VerifyString("H5Rget_name_f", TRIM(buf_small), "/MAT", total_error)
-  !
-  ! Dereference the first reference.
-  !
-  CALL H5rdereference_f(dsetr_id, ref_out(1), dsetv_id, error)
-  CALL check("h5rdereference_f", error, total_error)
-  CALL H5rget_region_f(dsetr_id, ref_out(1), space_id, error)
-  CALL check("h5rget_region_f", error, total_error)
-
-  ! Get name of the dataset the second region reference points to using H5Rget_name_f
-  CALL H5Rget_name_f(dsetr_id, ref_out(2), buf, error) ! no optional size
-  CALL check("H5Rget_name_f", error, total_error)
-  CALL VerifyString("H5Rget_name_f", TRIM(buf), "/MATRIX", total_error)
-  !
-  ! Read selected data from the dataset.
-  !
-  data_dims(1) = 2
-  data_dims(2) = 9
-  CALL h5dread_f(dsetv_id, H5T_NATIVE_INTEGER, data_out, data_dims, error, &
-       mem_space_id = space_id, file_space_id = space_id)
-  CALL check("h5dread_f", error, total_error)
-  CALL h5sclose_f(space_id, error)
-  CALL check("h5sclose_f", error, total_error)
-  CALL h5dclose_f(dsetv_id, error)
-  CALL check("h5dclose_f", error, total_error)
-  data_out = 0
-  !
-  ! Dereference the second reference.
-  !
-  CALL H5rdereference_f(dsetr_id, ref_out(2), dsetv_id, error)
-  CALL check("h5rdereference_f", error, total_error)
-
-  CALL H5rget_region_f(dsetr_id, ref_out(2), space_id, error)
-  CALL check("h5rget_region_f", error, total_error)
-  !
-  ! Read selected data from the dataset.
-  !
-  CALL h5dread_f(dsetv_id, H5T_NATIVE_INTEGER, data_out, data_dims, error, &
-       mem_space_id = space_id, file_space_id = space_id)
-  CALL check("h5dread_f", error, total_error)
-  !
-  ! Close all objects
-  !
-  CALL h5sclose_f(space_id, error)
-  CALL check("h5sclose_f", error, total_error)
-  CALL h5dclose_f(dsetv_id, error)
-  CALL check("h5dclose_f", error, total_error)
-  CALL h5dclose_f(dsetr_id, error)
-  CALL check("h5dclose_f", error, total_error)
-  CALL h5fclose_f(file_id, error)
-  CALL check("h5fclose_f", error, total_error)
-
-
-  IF(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-  RETURN
-
-END SUBROUTINE refregtest
-
-END MODULE TH5R
diff --git a/fortran/test/tH5S.F90 b/fortran/test/tH5S.F90
new file mode 100644
index 0000000..7223772
--- /dev/null
+++ b/fortran/test/tH5S.F90
@@ -0,0 +1,298 @@
+!****h* root/fortran/test/tH5S.f90
+!
+! NAME
+!  tH5S.f90
+!
+! FUNCTION
+!  Basic testing of Fortran H5S, Dataspace Interface, APIs.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! NOTES
+!  Tests the following functionalities:
+!   h5screate_f, h5scopy_f, h5screate_simple_f, h5sis_simple_f,
+!   h5sget_simple_extent_dims_f,h5sget_simple_extent_ndims_f
+!   h5sget_simple_extent_npoints_f, h5sget_simple_extent_type_f,
+!   h5sextent_copy_f, h5sset_extent_simple_f, h5sset_extent_none_f
+!
+! CONTAINS SUBROUTINES
+!  dataspace_basic_test
+!
+!*****
+MODULE TH5S
+
+  USE HDF5 ! This module contains all necessary modules
+  USE TH5_MISC
+  USE TH5_MISC_GEN
+
+CONTAINS
+
+        SUBROUTINE dataspace_basic_test(cleanup, total_error)
+
+
+          IMPLICIT NONE
+          LOGICAL, INTENT(IN)  :: cleanup
+          INTEGER, INTENT(INOUT) :: total_error
+
+          CHARACTER(LEN=10), PARAMETER :: filename1 = "basicspace" ! File1 name
+          CHARACTER(LEN=9), PARAMETER :: filename2 = "copyspace"  ! File2 name
+          CHARACTER(LEN=80) :: fix_filename1
+          CHARACTER(LEN=80) :: fix_filename2
+          CHARACTER(LEN=9), PARAMETER :: dsetname = "basicdset"       ! Dataset name
+
+          INTEGER(HID_T) :: file1_id, file2_id     ! File identifiers
+          INTEGER(HID_T) :: dset1_id, dset2_id     ! Dataset identifiers
+          INTEGER(HID_T) :: space1_id, space2_id   ! Dataspace identifiers
+
+          INTEGER(HSIZE_T), DIMENSION(2) :: dims1 = (/4,6/) ! Dataset dimensions
+          INTEGER(HSIZE_T), DIMENSION(2) :: maxdims1 = (/4,6/) ! maximum dimensions
+          INTEGER(HSIZE_T), DIMENSION(2) :: dims2 = (/6,6/) ! Dataset dimensions
+          INTEGER(HSIZE_T), DIMENSION(2) :: maxdims2 = (/6,6/) ! maximum dimensions
+          INTEGER(HSIZE_T), DIMENSION(2) :: dimsout, maxdimsout ! dimensions
+          INTEGER(HSIZE_T)   ::   npoints  !number of elements in the dataspace
+
+          INTEGER     ::   rank1 = 2               ! Dataspace1 rank
+          INTEGER     ::   rank2 = 2               ! Dataspace2 rank
+          INTEGER     ::   classtype               ! Dataspace class type
+
+          INTEGER, DIMENSION(4,6) :: data1_in, data1_out   ! Data input buffers
+          INTEGER, DIMENSION(6,6) :: data2_in, data2_out  ! Data output buffers
+          INTEGER     ::   error ! Error flag
+
+          LOGICAL     ::   flag  !flag to test datyspace is simple or not
+          INTEGER     :: i, j    !general purpose integers
+          INTEGER(HSIZE_T), DIMENSION(2) :: data_dims
+
+          !
+          ! Initialize the dset_data array.
+          !
+          do i = 1, 4
+             do j = 1, 6
+                data1_in(i,j) = (i-1)*6 + j;
+             end do
+          end do
+
+          do i = 1, 6
+             do j = 1, 6
+                data2_in(i,j) = i*6 + j;
+             end do
+          end do
+
+          !
+          !  Initialize FORTRAN predefined datatypes.
+          !
+!          CALL h5init_types_f(error)
+!              CALL check("h5init_types_f", error, total_error)
+
+          !
+          ! Create new files using default properties.
+          !
+          CALL h5_fixname_f(filename1, fix_filename1, H5P_DEFAULT_F, error)
+          if (error .ne. 0) then
+              write(*,*) "Cannot modify filename"
+              stop
+          endif
+          CALL h5fcreate_f(fix_filename1, H5F_ACC_TRUNC_F, file1_id, error)
+              CALL check("h5fcreate_f", error, total_error)
+
+          CALL h5_fixname_f(filename2, fix_filename2, H5P_DEFAULT_F, error)
+          if (error .ne. 0) then
+              write(*,*) "Cannot modify filename"
+              stop
+          endif
+          CALL h5fcreate_f(fix_filename2, H5F_ACC_TRUNC_F, file2_id, error)
+              CALL check("h5fcreate_f", error, total_error)
+
+          !
+          ! Create dataspace for file1.
+          !
+          CALL h5screate_simple_f(rank1, dims1, space1_id, error, maxdims1)
+              CALL check("h5screate_simple_f", error, total_error)
+          !
+          ! Copy space1_id to space2_id.
+          !
+          CALL h5scopy_f(space1_id, space2_id, error)
+              CALL check("h5scopy_f", error, total_error)
+
+          !
+          !Check whether copied space is simple.
+          !
+          CALL h5sis_simple_f(space2_id, flag, error)
+              CALL check("h5sissimple_f", error, total_error)
+          IF (.NOT. flag) write(*,*) "dataspace is not simple type"
+
+          !
+          !set the copied space to none.
+          !
+          CALL h5sset_extent_none_f(space2_id, error)
+              CALL check("h5sset_extent_none_f", error, total_error)
+
+          !
+          !copy the extent of space1_id to space2_id.
+          !
+          CALL h5sextent_copy_f(space2_id, space1_id, error)
+              CALL check("h5sextent_copy_f", error, total_error)
+
+          !
+          !get the copied space's dimensions.
+          !
+          CALL h5sget_simple_extent_dims_f(space2_id, dimsout, maxdimsout, error)
+              CALL check("h5sget_simple_extent_dims_f", error, total_error)
+          IF ((dimsout(1) .NE. dims1(1)) .OR. (dimsout(2) .NE. dims1(2)) ) THEN
+              write(*,*)"error occured, copied dims not same"
+          END IF
+
+          !
+          !get the copied space's rank.
+          !
+          CALL h5sget_simple_extent_ndims_f(space2_id, rank2, error)
+              CALL check("h5sget_simple_extent_ndims_f", error, total_error)
+          IF (rank2 .NE. rank1) write(*,*)"error occured, copied ranks not same"
+
+          !
+          !get the copied space's number of elements.
+          !
+          CALL h5sget_simple_extent_npoints_f(space2_id, npoints, error)
+              CALL check("h5sget_simple_extent_npoints_f", error, total_error)
+          IF (npoints .NE. 24) write(*,*)"error occured, number of elements not correct"
+
+
+          !
+          !get the copied space's class type.
+          !
+          CALL h5sget_simple_extent_type_f(space2_id, classtype, error)
+              CALL check("h5sget_simple_extent_type_f", error, total_error)
+          IF (classtype .NE. 1) write(*,*)"class type not H5S_SIMPLE_f"
+
+          ! 
+          !set the copied space to none before extend the dimensions.
+          !
+          CALL h5sset_extent_none_f(space2_id, error)
+              CALL check("h5sset_extent_none_f", error, total_error)
+
+          !
+          !set the copied space to dim2 size. 
+          !
+          CALL h5sset_extent_simple_f(space2_id, rank2, dims2, maxdims2, error)
+              CALL check("h5sset_extent_simple_f", error, total_error)
+
+          !
+          !get the copied space's dimensions.
+          !
+          CALL h5sget_simple_extent_dims_f(space2_id, dimsout, maxdimsout, error)
+              CALL check("h5sget_simple_extent_dims_f", error, total_error)
+          IF ((dimsout(1) .NE. dims2(1)) .OR. (dimsout(2) .NE. dims2(2)) ) THEN
+              write(*,*)"error occured, copied dims not same"
+          END IF
+
+          !
+          ! Create the datasets with default properties in two files.
+          !
+          CALL h5dcreate_f(file1_id, dsetname, H5T_NATIVE_INTEGER, space1_id, &
+                           dset1_id, error)
+              CALL check("h5dcreate_f", error, total_error)
+
+          CALL h5dcreate_f(file2_id, dsetname, H5T_NATIVE_INTEGER, space2_id, &
+                           dset2_id, error)
+              CALL check("h5dcreate_f", error, total_error)
+
+          !
+          ! Write the datasets.
+          !
+          data_dims(1) = 4
+          data_dims(2) = 6
+          CALL h5dwrite_f(dset1_id, H5T_NATIVE_INTEGER, data1_in, data_dims, error)
+              CALL check("h5dwrite_f", error, total_error)
+
+          data_dims(1) = 6
+          data_dims(2) = 6
+          CALL h5dwrite_f(dset2_id, H5T_NATIVE_INTEGER, data2_in, data_dims, error)
+              CALL check("h5dwrite_f", error, total_error)
+
+          !
+          ! Read the first dataset.
+          !
+          data_dims(1) = 4
+          data_dims(2) = 6
+          CALL h5dread_f(dset1_id, H5T_NATIVE_INTEGER, data1_out, data_dims, error)
+              CALL check("h5dread_f", error, total_error)
+
+          !
+          !Compare the data.
+          !
+          do i = 1, 4
+              do j = 1, 6
+                  IF (data1_out(i,j) .NE. data1_in(i, j)) THEN
+                      write(*, *) "dataset test error occured"
+                      write(*,*) "data read is not the same as the data writen"
+                  END IF
+              end do
+          end do
+
+
+          !
+          ! Read the second dataset.
+          !
+          data_dims(1) = 6
+          data_dims(2) = 6
+          CALL h5dread_f(dset2_id, H5T_NATIVE_INTEGER, data2_out, data_dims, error)
+              CALL check("h5dread_f", error, total_error)
+
+          !
+          !Compare the data.
+          !
+          do i = 1, 6
+              do j = 1, 6
+                  IF (data2_out(i,j) .NE. data2_in(i, j)) THEN
+                      write(*, *) "dataset test error occured"
+                      write(*,*) "data read is not the same as the data writen"
+                  END IF
+              end do
+          end do
+
+          !
+          !Close the datasets.
+          !
+          CALL h5dclose_f(dset1_id, error)
+              CALL check("h5dclose_f", error, total_error)
+          CALL h5dclose_f(dset2_id, error)
+              CALL check("h5dclose_f", error, total_error)
+
+          !
+          ! Terminate access to the data spaces.
+          !
+          CALL h5sclose_f(space1_id, error)
+              CALL check("h5sclose_f", error, total_error)
+          CALL h5sclose_f(space2_id, error)
+              CALL check("h5sclose_f", error, total_error)
+          !
+          ! Close the files.
+          !
+          CALL h5fclose_f(file1_id, error)
+              CALL check("h5fclose_f", error, total_error)
+          CALL h5fclose_f(file2_id, error)
+              CALL check("h5fclose_f", error, total_error)
+
+
+          if(cleanup) CALL h5_cleanup_f(filename1, H5P_DEFAULT_F, error)
+              CALL check("h5_cleanup_f", error, total_error)
+          if(cleanup) CALL h5_cleanup_f(filename2, H5P_DEFAULT_F, error)
+              CALL check("h5_cleanup_f", error, total_error)
+          RETURN
+        END SUBROUTINE dataspace_basic_test
+
+END MODULE TH5S
diff --git a/fortran/test/tH5S.f90 b/fortran/test/tH5S.f90
deleted file mode 100644
index eaaf29a..0000000
--- a/fortran/test/tH5S.f90
+++ /dev/null
@@ -1,296 +0,0 @@
-!****h* root/fortran/test/tH5S.f90
-!
-! NAME
-!  tH5S.f90
-!
-! FUNCTION
-!  Basic testing of Fortran H5S, Dataspace Interface, APIs.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!  Tests the following functionalities:
-!   h5screate_f, h5scopy_f, h5screate_simple_f, h5sis_simple_f,
-!   h5sget_simple_extent_dims_f,h5sget_simple_extent_ndims_f
-!   h5sget_simple_extent_npoints_f, h5sget_simple_extent_type_f,
-!   h5sextent_copy_f, h5sset_extent_simple_f, h5sset_extent_none_f
-!
-! CONTAINS SUBROUTINES
-!  dataspace_basic_test
-!
-!*****
-MODULE TH5S
-
-CONTAINS
-
-        SUBROUTINE dataspace_basic_test(cleanup, total_error)
-
-        USE HDF5 ! This module contains all necessary modules
-        USE TH5_MISC
-
-          IMPLICIT NONE
-          LOGICAL, INTENT(IN)  :: cleanup
-          INTEGER, INTENT(INOUT) :: total_error
-
-          CHARACTER(LEN=10), PARAMETER :: filename1 = "basicspace" ! File1 name
-          CHARACTER(LEN=9), PARAMETER :: filename2 = "copyspace"  ! File2 name
-          CHARACTER(LEN=80) :: fix_filename1
-          CHARACTER(LEN=80) :: fix_filename2
-          CHARACTER(LEN=9), PARAMETER :: dsetname = "basicdset"       ! Dataset name
-
-          INTEGER(HID_T) :: file1_id, file2_id     ! File identifiers
-          INTEGER(HID_T) :: dset1_id, dset2_id     ! Dataset identifiers
-          INTEGER(HID_T) :: space1_id, space2_id   ! Dataspace identifiers
-
-          INTEGER(HSIZE_T), DIMENSION(2) :: dims1 = (/4,6/) ! Dataset dimensions
-          INTEGER(HSIZE_T), DIMENSION(2) :: maxdims1 = (/4,6/) ! maximum dimensions
-          INTEGER(HSIZE_T), DIMENSION(2) :: dims2 = (/6,6/) ! Dataset dimensions
-          INTEGER(HSIZE_T), DIMENSION(2) :: maxdims2 = (/6,6/) ! maximum dimensions
-          INTEGER(HSIZE_T), DIMENSION(2) :: dimsout, maxdimsout ! dimensions
-          INTEGER(HSIZE_T)   ::   npoints  !number of elements in the dataspace
-
-          INTEGER     ::   rank1 = 2               ! Dataspace1 rank
-          INTEGER     ::   rank2 = 2               ! Dataspace2 rank
-          INTEGER     ::   classtype               ! Dataspace class type
-
-          INTEGER, DIMENSION(4,6) :: data1_in, data1_out   ! Data input buffers
-          INTEGER, DIMENSION(6,6) :: data2_in, data2_out  ! Data output buffers
-          INTEGER     ::   error ! Error flag
-
-          LOGICAL     ::   flag  !flag to test datyspace is simple or not
-          INTEGER     :: i, j    !general purpose integers
-          INTEGER(HSIZE_T), DIMENSION(2) :: data_dims
-
-          !
-          ! Initialize the dset_data array.
-          !
-          do i = 1, 4
-             do j = 1, 6
-                data1_in(i,j) = (i-1)*6 + j;
-             end do
-          end do
-
-          do i = 1, 6
-             do j = 1, 6
-                data2_in(i,j) = i*6 + j;
-             end do
-          end do
-
-          !
-          !  Initialize FORTRAN predefined datatypes.
-          !
-!          CALL h5init_types_f(error)
-!              CALL check("h5init_types_f", error, total_error)
-
-          !
-          ! Create new files using default properties.
-          !
-          CALL h5_fixname_f(filename1, fix_filename1, H5P_DEFAULT_F, error)
-          if (error .ne. 0) then
-              write(*,*) "Cannot modify filename"
-              stop
-          endif
-          CALL h5fcreate_f(fix_filename1, H5F_ACC_TRUNC_F, file1_id, error)
-              CALL check("h5fcreate_f", error, total_error)
-
-          CALL h5_fixname_f(filename2, fix_filename2, H5P_DEFAULT_F, error)
-          if (error .ne. 0) then
-              write(*,*) "Cannot modify filename"
-              stop
-          endif
-          CALL h5fcreate_f(fix_filename2, H5F_ACC_TRUNC_F, file2_id, error)
-              CALL check("h5fcreate_f", error, total_error)
-
-          !
-          ! Create dataspace for file1.
-          !
-          CALL h5screate_simple_f(rank1, dims1, space1_id, error, maxdims1)
-              CALL check("h5screate_simple_f", error, total_error)
-          !
-          ! Copy space1_id to space2_id.
-          !
-          CALL h5scopy_f(space1_id, space2_id, error)
-              CALL check("h5scopy_f", error, total_error)
-
-          !
-          !Check whether copied space is simple.
-          !
-          CALL h5sis_simple_f(space2_id, flag, error)
-              CALL check("h5sissimple_f", error, total_error)
-          IF (.NOT. flag) write(*,*) "dataspace is not simple type"
-
-          !
-          !set the copied space to none.
-          !
-          CALL h5sset_extent_none_f(space2_id, error)
-              CALL check("h5sset_extent_none_f", error, total_error)
-
-          !
-          !copy the extent of space1_id to space2_id.
-          !
-          CALL h5sextent_copy_f(space2_id, space1_id, error)
-              CALL check("h5sextent_copy_f", error, total_error)
-
-          !
-          !get the copied space's dimensions.
-          !
-          CALL h5sget_simple_extent_dims_f(space2_id, dimsout, maxdimsout, error)
-              CALL check("h5sget_simple_extent_dims_f", error, total_error)
-          IF ((dimsout(1) .NE. dims1(1)) .OR. (dimsout(2) .NE. dims1(2)) ) THEN
-              write(*,*)"error occured, copied dims not same"
-          END IF
-
-          !
-          !get the copied space's rank.
-          !
-          CALL h5sget_simple_extent_ndims_f(space2_id, rank2, error)
-              CALL check("h5sget_simple_extent_ndims_f", error, total_error)
-          IF (rank2 .NE. rank1) write(*,*)"error occured, copied ranks not same"
-
-          !
-          !get the copied space's number of elements.
-          !
-          CALL h5sget_simple_extent_npoints_f(space2_id, npoints, error)
-              CALL check("h5sget_simple_extent_npoints_f", error, total_error)
-          IF (npoints .NE. 24) write(*,*)"error occured, number of elements not correct"
-
-
-          !
-          !get the copied space's class type.
-          !
-          CALL h5sget_simple_extent_type_f(space2_id, classtype, error)
-              CALL check("h5sget_simple_extent_type_f", error, total_error)
-          IF (classtype .NE. 1) write(*,*)"class type not H5S_SIMPLE_f"
-
-          ! 
-          !set the copied space to none before extend the dimensions.
-          !
-          CALL h5sset_extent_none_f(space2_id, error)
-              CALL check("h5sset_extent_none_f", error, total_error)
-
-          !
-          !set the copied space to dim2 size. 
-          !
-          CALL h5sset_extent_simple_f(space2_id, rank2, dims2, maxdims2, error)
-              CALL check("h5sset_extent_simple_f", error, total_error)
-
-          !
-          !get the copied space's dimensions.
-          !
-          CALL h5sget_simple_extent_dims_f(space2_id, dimsout, maxdimsout, error)
-              CALL check("h5sget_simple_extent_dims_f", error, total_error)
-          IF ((dimsout(1) .NE. dims2(1)) .OR. (dimsout(2) .NE. dims2(2)) ) THEN
-              write(*,*)"error occured, copied dims not same"
-          END IF
-
-          !
-          ! Create the datasets with default properties in two files.
-          !
-          CALL h5dcreate_f(file1_id, dsetname, H5T_NATIVE_INTEGER, space1_id, &
-                           dset1_id, error)
-              CALL check("h5dcreate_f", error, total_error)
-
-          CALL h5dcreate_f(file2_id, dsetname, H5T_NATIVE_INTEGER, space2_id, &
-                           dset2_id, error)
-              CALL check("h5dcreate_f", error, total_error)
-
-          !
-          ! Write the datasets.
-          !
-          data_dims(1) = 4
-          data_dims(2) = 6
-          CALL h5dwrite_f(dset1_id, H5T_NATIVE_INTEGER, data1_in, data_dims, error)
-              CALL check("h5dwrite_f", error, total_error)
-
-          data_dims(1) = 6
-          data_dims(2) = 6
-          CALL h5dwrite_f(dset2_id, H5T_NATIVE_INTEGER, data2_in, data_dims, error)
-              CALL check("h5dwrite_f", error, total_error)
-
-          !
-          ! Read the first dataset.
-          !
-          data_dims(1) = 4
-          data_dims(2) = 6
-          CALL h5dread_f(dset1_id, H5T_NATIVE_INTEGER, data1_out, data_dims, error)
-              CALL check("h5dread_f", error, total_error)
-
-          !
-          !Compare the data.
-          !
-          do i = 1, 4
-              do j = 1, 6
-                  IF (data1_out(i,j) .NE. data1_in(i, j)) THEN
-                      write(*, *) "dataset test error occured"
-                      write(*,*) "data read is not the same as the data writen"
-                  END IF
-              end do
-          end do
-
-
-          !
-          ! Read the second dataset.
-          !
-          data_dims(1) = 6
-          data_dims(2) = 6
-          CALL h5dread_f(dset2_id, H5T_NATIVE_INTEGER, data2_out, data_dims, error)
-              CALL check("h5dread_f", error, total_error)
-
-          !
-          !Compare the data.
-          !
-          do i = 1, 6
-              do j = 1, 6
-                  IF (data2_out(i,j) .NE. data2_in(i, j)) THEN
-                      write(*, *) "dataset test error occured"
-                      write(*,*) "data read is not the same as the data writen"
-                  END IF
-              end do
-          end do
-
-          !
-          !Close the datasets.
-          !
-          CALL h5dclose_f(dset1_id, error)
-              CALL check("h5dclose_f", error, total_error)
-          CALL h5dclose_f(dset2_id, error)
-              CALL check("h5dclose_f", error, total_error)
-
-          !
-          ! Terminate access to the data spaces.
-          !
-          CALL h5sclose_f(space1_id, error)
-              CALL check("h5sclose_f", error, total_error)
-          CALL h5sclose_f(space2_id, error)
-              CALL check("h5sclose_f", error, total_error)
-          !
-          ! Close the files.
-          !
-          CALL h5fclose_f(file1_id, error)
-              CALL check("h5fclose_f", error, total_error)
-          CALL h5fclose_f(file2_id, error)
-              CALL check("h5fclose_f", error, total_error)
-
-
-          if(cleanup) CALL h5_cleanup_f(filename1, H5P_DEFAULT_F, error)
-              CALL check("h5_cleanup_f", error, total_error)
-          if(cleanup) CALL h5_cleanup_f(filename2, H5P_DEFAULT_F, error)
-              CALL check("h5_cleanup_f", error, total_error)
-          RETURN
-        END SUBROUTINE dataspace_basic_test
-
-END MODULE TH5S
diff --git a/fortran/test/tH5Sselect.F90 b/fortran/test/tH5Sselect.F90
new file mode 100644
index 0000000..aeb80e9
--- /dev/null
+++ b/fortran/test/tH5Sselect.F90
@@ -0,0 +1,1993 @@
+!****h* root/fortran/test/tH5Sselect.f90
+!
+! NAME
+!  tH5Sselect.f90
+!
+! FUNCTION
+!  Basic testing of Fortran H5S, Selection-related Dataspace Interface, APIs.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! NOTES
+!  Tests the following functionalities:
+!    h5sget_select_npoints_f, h5sselect_elements_f, h5sselect_all_f,
+!    h5sselect_none_f, h5sselect_valid_f, h5sselect_hyperslab_f,
+!    h5sget_select_bounds_f, h5sget_select_elem_pointlist_f,
+!    h5sget_select_elem_npoints_f, h5sget_select_hyper_blocklist_f,
+!    h5sget_select_hyper_nblocks_f, h5sget_select_npoints_f   
+!
+! CONTAINS SUBROUTINES
+!  test_select_hyperslab, test_select_element, test_basic_select,
+!  test_select_point, test_select_combine, test_select_bounds
+!  
+!
+!*****
+MODULE TH5SSELECT
+
+  USE HDF5 ! This module contains all necessary modules
+  USE TH5_MISC
+  USE TH5_MISC_GEN
+
+CONTAINS
+
+  SUBROUTINE test_select_hyperslab(cleanup, total_error)
+
+    IMPLICIT NONE
+    LOGICAL, INTENT(IN) :: cleanup
+    INTEGER, INTENT(INOUT) :: total_error
+
+    CHARACTER(LEN=7), PARAMETER :: filename = "tselect"
+    CHARACTER(LEN=80) :: fix_filename
+
+    !
+    !dataset name is "IntArray"
+    !
+    CHARACTER(LEN=8), PARAMETER :: dsetname = "IntArray"
+
+    INTEGER(HID_T) :: file_id       ! File identifier
+    INTEGER(HID_T) :: dset_id       ! Dataset identifier
+    INTEGER(HID_T) :: dataspace     ! Dataspace identifier
+    INTEGER(HID_T) :: memspace      ! memspace identifier
+
+    !
+    !Memory space dimensions
+    !
+    INTEGER(HSIZE_T), DIMENSION(3) :: dimsm = (/7,7,3/)
+
+
+    !
+    !Dataset dimensions
+    !
+    INTEGER(HSIZE_T), DIMENSION(2) :: dimsf = (/5,6/)
+
+    !
+    !Size of the hyperslab in the file
+    !
+    INTEGER(HSIZE_T), DIMENSION(2) :: count = (/3,4/)
+
+    !
+    !hyperslab offset in the file
+    !
+    INTEGER(HSIZE_T), DIMENSION(2) :: offset = (/1,2/)
+
+    !
+    !Size of the hyperslab in memory
+    !
+    INTEGER(HSIZE_T), DIMENSION(3) :: count_out = (/3,4,1/)
+
+    !
+    !hyperslab offset in memory
+    !
+    INTEGER(HSIZE_T), DIMENSION(3) :: offset_out = (/3,0,0/)
+
+    !
+    !data to write
+    !
+    INTEGER, DIMENSION(5,6) :: data
+
+    !
+    !output buffer
+    !
+    INTEGER, DIMENSION(7,7,3) :: data_out
+
+
+    !
+    !dataset space rank
+    !
+    INTEGER :: dsetrank = 2
+
+    !
+    !memspace rank
+    !
+    INTEGER :: memrank = 3
+
+
+
+
+    !
+    !general purpose integer
+    !
+    INTEGER :: i, j
+
+    !
+    !flag to check operation success
+    !
+    INTEGER :: error
+    INTEGER(HSIZE_T), DIMENSION(3) :: data_dims
+
+
+    !
+    !This writes data to the HDF5 file.
+    !
+
+    !
+    !data initialization
+    !
+    do i = 1, 5
+       do j = 1, 6
+          data(i,j) = (i-1) + (j-1);
+       end do
+    end do
+    !
+    ! 0,  1,  2,  3,  4,  5
+    ! 1,  2,  3,  4,  5,  6
+    ! 2,  3,  4,  5,  6,  7
+    ! 3,  4,  5,  6,  7,  8
+    ! 4,  5,  6,  7,  8,  9
+    !
+
+    !
+    !Initialize FORTRAN predifined datatypes
+    !
+!    CALL h5init_types_f(error)
+!    CALL check("h5init_types_f", error, total_error)
+
+    !
+    !Create a new file using default properties.
+    !
+          CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+          if (error .ne. 0) then
+              write(*,*) "Cannot modify filename"
+              stop
+          endif
+    CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
+    CALL check("h5fcreate_f", error, total_error)
+
+    !
+    !Create the data space for the  dataset.
+    !
+    CALL h5screate_simple_f(dsetrank, dimsf, dataspace, error)
+    CALL check("h5screate_simple_f", error, total_error)
+
+    !
+    ! Create the dataset with default properties
+    !
+    CALL h5dcreate_f(file_id, dsetname, H5T_STD_I32BE, dataspace, &
+         dset_id, error)
+    CALL check("h5dcreate_f", error, total_error)
+
+    !
+    ! Write the dataset
+    !
+    data_dims(1) = 5
+    data_dims(2) = 6
+    CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, data, data_dims, error)
+    CALL check("h5dwrite_f", error, total_error)
+
+    !
+    !Close the dataspace for the dataset.
+    !
+    CALL h5sclose_f(dataspace, error)
+    CALL check("h5sclose_f", error, total_error)
+
+    !
+    !Close the dataset.
+    !
+    CALL h5dclose_f(dset_id, error)
+    CALL check("h5dclose_f", error, total_error)
+
+    !
+    !Close the file.
+    !
+    CALL h5fclose_f(file_id, error)
+    CALL check("h5fclose_f", error, total_error)
+
+    !
+    !This reads the hyperslab from the sds.h5 file just
+    !created, into a 2-dimensional plane of the 3-dimensional array.
+    !
+
+    !
+    !initialize data_out array
+    !
+    !     do i = 1, 7
+    !          do j = 1, 7
+    !              do k = 1,3
+    !                  data_out(i,j,k) = 0;
+    !              end do
+    !          end do
+    !     end do
+
+    !
+    !Open the file.
+    !
+    CALL h5fopen_f (fix_filename, H5F_ACC_RDONLY_F, file_id, error)
+    CALL check("h5fopen_f", error, total_error)
+
+    !
+    !Open the  dataset.
+    !
+    CALL h5dopen_f(file_id, dsetname, dset_id, error)
+    CALL check("h5dopen_f", error, total_error)
+
+    !
+    !Get dataset's dataspace handle.
+    !
+    CALL h5dget_space_f(dset_id, dataspace, error)
+    CALL check("h5dget_space_f", error, total_error)
+
+    !
+    !Select hyperslab in the dataset.
+    !
+    CALL h5sselect_hyperslab_f(dataspace, H5S_SELECT_SET_F, &
+         offset, count, error)
+    CALL check("h5sselect_hyperslab_f", error, total_error)
+    !
+    !create memory dataspace.
+    !
+    CALL h5screate_simple_f(memrank, dimsm, memspace, error)
+    CALL check("h5screate_simple_f", error, total_error)
+
+    !
+    !Select hyperslab in memory.
+    !
+    CALL h5sselect_hyperslab_f(memspace, H5S_SELECT_SET_F, &
+         offset_out, count_out, error)
+    CALL check("h5sselect_hyperslab_f", error, total_error)
+
+    !
+    !Read data from hyperslab in the file into the hyperslab in
+    !memory and display.
+    !
+    data_dims(1) = 7
+    data_dims(2) = 7
+    data_dims(3) = 3
+    CALL h5dread_f(dset_id, H5T_NATIVE_INTEGER, data_out, data_dims, error, &
+         memspace, dataspace)
+    CALL check("h5dread_f", error, total_error)
+
+    !
+    !Display data_out array
+    !
+    !do i = 1, 7
+    !   print *, (data_out(i,j,1), j = 1,7)
+    !end do
+
+    ! 0 0 0 0 0 0 0
+    ! 0 0 0 0 0 0 0
+    ! 0 0 0 0 0 0 0
+    ! 3 4 5 6 0 0 0
+    ! 4 5 6 7 0 0 0
+    ! 5 6 7 8 0 0 0
+    ! 0 0 0 0 0 0 0
+    !
+
+    !
+    !Close the dataspace for the dataset.
+    !
+    CALL h5sclose_f(dataspace, error)
+    CALL check("h5sclose_f", error, total_error)
+
+    !
+    !Close the memoryspace.
+    !
+    CALL h5sclose_f(memspace, error)
+    CALL check("h5sclose_f", error, total_error)
+
+    !
+    !Close the dataset.
+    !
+    CALL h5dclose_f(dset_id, error)
+    CALL check("h5dclose_f", error, total_error)
+
+    !
+    !Close the file.
+    !
+    CALL h5fclose_f(file_id, error)
+    CALL check("h5fclose_f", error, total_error)
+
+
+          if(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+              CALL check("h5_cleanup_f", error, total_error)
+    RETURN
+
+  END SUBROUTINE test_select_hyperslab
+
+  !
+  !Subroutine to test element selection
+  !
+
+  SUBROUTINE test_select_element(cleanup, total_error)
+
+    USE HDF5 ! This module contains all necessary modules
+    USE TH5_MISC
+
+    IMPLICIT NONE
+    LOGICAL, INTENT(IN)  :: cleanup
+    INTEGER, INTENT(INOUT) :: total_error
+
+    !
+    !the dataset1 is stored in file "copy1.h5"
+    !
+    CHARACTER(LEN=13), PARAMETER :: filename1 = "tselect_copy1"
+    CHARACTER(LEN=80) :: fix_filename1
+
+    !
+    !the dataset2 is stored in file "copy2.h5"
+    !
+    CHARACTER(LEN=13), PARAMETER :: filename2 = "tselect_copy2"
+    CHARACTER(LEN=80) :: fix_filename2
+    !
+    !dataset1 name is "Copy1"
+    !
+    CHARACTER(LEN=8), PARAMETER :: dsetname1 = "Copy1"
+
+    !
+    !dataset2 name is "Copy2"
+    !
+    CHARACTER(LEN=8), PARAMETER :: dsetname2 = "Copy2"
+
+    !
+    !dataset rank
+    !
+    INTEGER, PARAMETER :: RANK = 2
+
+    !
+    !number of points selected
+    !
+    INTEGER(SIZE_T), PARAMETER :: NUMP = 2
+
+    INTEGER(HID_T) :: file1_id       ! File1 identifier
+    INTEGER(HID_T) :: file2_id       ! File2 identifier
+    INTEGER(HID_T) :: dset1_id       ! Dataset1 identifier
+    INTEGER(HID_T) :: dset2_id       ! Dataset2 identifier
+    INTEGER(HID_T) :: dataspace1     ! Dataspace identifier
+    INTEGER(HID_T) :: dataspace2     ! Dataspace identifier
+    INTEGER(HID_T) :: memspace       ! memspace identifier
+
+    !
+    !Memory space dimensions
+    !
+    INTEGER(HSIZE_T), DIMENSION(1) :: dimsm = (/2/)
+
+    !
+    !Dataset dimensions
+    !
+    INTEGER(HSIZE_T), DIMENSION(2) :: dimsf = (/3,4/)
+
+    !
+    !Points positions in the file
+    !
+    INTEGER(HSIZE_T), DIMENSION(RANK,NUMP) :: coord
+
+    !
+    !data buffers
+    !
+    INTEGER, DIMENSION(3,4) :: buf1, buf2, bufnew
+
+    !
+    !value to write
+    !
+    INTEGER, DIMENSION(2) :: val = (/53, 59/)
+
+    !
+    !memory rank
+    !
+    INTEGER :: memrank = 1
+
+    !
+    !general purpose integer
+    !
+    INTEGER :: i, j
+
+    !
+    !flag to check operation success
+    !
+    INTEGER :: error
+    INTEGER(HSIZE_T), DIMENSION(3) :: data_dims
+
+
+    !
+    !Create two files containing identical datasets. Write 0's to one
+    !and 1's to the other.
+    !
+
+    !
+    !data initialization
+    !
+    do i = 1, 3
+       do j = 1, 4
+          buf1(i,j) = 0;
+       end do
+    end do
+
+    do i = 1, 3
+       do j = 1, 4
+          buf2(i,j) = 1;
+       end do
+    end do
+
+    !
+    !Initialize FORTRAN predifined datatypes
+    !
+!    CALL h5init_types_f(error)
+!    CALL check("h5init_types_f", error, total_error)
+
+    !
+    !Create file1, file2  using default properties.
+    !
+          CALL h5_fixname_f(filename1, fix_filename1, H5P_DEFAULT_F, error)
+          if (error .ne. 0) then
+              write(*,*) "Cannot modify filename"
+              stop
+          endif
+    CALL h5fcreate_f(fix_filename1, H5F_ACC_TRUNC_F, file1_id, error)
+    CALL check("h5fcreate_f", error, total_error)
+
+          CALL h5_fixname_f(filename2, fix_filename2, H5P_DEFAULT_F, error)
+          if (error .ne. 0) then
+              write(*,*) "Cannot modify filename"
+              stop
+          endif
+    CALL h5fcreate_f(fix_filename2, H5F_ACC_TRUNC_F, file2_id, error)
+    CALL check("h5fcreate_f", error, total_error)
+
+    !
+    !Create the data space for the  datasets.
+    !
+    CALL h5screate_simple_f(RANK, dimsf, dataspace1, error)
+    CALL check("h5screate_simple_f", error, total_error)
+
+    CALL h5screate_simple_f(RANK, dimsf, dataspace2, error)
+    CALL check("h5screate_simple_f", error, total_error)
+
+    !
+    ! Create the datasets with default properties
+    !
+    CALL h5dcreate_f(file1_id, dsetname1, H5T_NATIVE_INTEGER, dataspace1, &
+         dset1_id, error)
+    CALL check("h5dcreate_f", error, total_error)
+
+    CALL h5dcreate_f(file2_id, dsetname2, H5T_NATIVE_INTEGER, dataspace2, &
+         dset2_id, error)
+    CALL check("h5dcreate_f", error, total_error)
+
+    !
+    ! Write the datasets
+    !
+    data_dims(1) = 3
+    data_dims(2) = 4
+    CALL h5dwrite_f(dset1_id, H5T_NATIVE_INTEGER, buf1, data_dims, error)
+    CALL check("h5dwrite_f", error, total_error)
+
+    CALL h5dwrite_f(dset2_id, H5T_NATIVE_INTEGER, buf2, data_dims, error)
+    CALL check("h5dwrite_f", error, total_error)
+
+    !
+    !Close the dataspace for the datasets.
+    !
+    CALL h5sclose_f(dataspace1, error)
+    CALL check("h5sclose_f", error, total_error)
+
+    CALL h5sclose_f(dataspace2, error)
+    CALL check("h5sclose_f", error, total_error)
+
+    !
+    !Close the datasets.
+    !
+    CALL h5dclose_f(dset1_id, error)
+    CALL check("h5dclose_f", error, total_error)
+
+    CALL h5dclose_f(dset2_id, error)
+    CALL check("h5dclose_f", error, total_error)
+
+    !
+    !Close the files.
+    !
+    CALL h5fclose_f(file1_id, error)
+    CALL check("h5fclose_f", error, total_error)
+
+    CALL h5fclose_f(file2_id, error)
+    CALL check("h5fclose_f", error, total_error)
+
+    !
+    !Open the two files.  Select two points in one file, write values to
+    !those point locations, then do H5Scopy and write the values to the
+    !other file.  Close files.
+    !
+
+    !
+    !Open the files.
+    !
+    CALL h5fopen_f (fix_filename1, H5F_ACC_RDWR_F, file1_id, error)
+    CALL check("h5fopen_f", error, total_error)
+
+    CALL h5fopen_f (fix_filename2, H5F_ACC_RDWR_F, file2_id, error)
+    CALL check("h5fopen_f", error, total_error)
+
+    !
+    !Open the  datasets.
+    !
+    CALL h5dopen_f(file1_id, dsetname1, dset1_id, error)
+    CALL check("h5dopen_f", error, total_error)
+
+    CALL h5dopen_f(file2_id, dsetname2, dset2_id, error)
+    CALL check("h5dopen_f", error, total_error)
+
+    !
+    !Get dataset1's dataspace handle.
+    !
+    CALL h5dget_space_f(dset1_id, dataspace1, error)
+    CALL check("h5dget_space_f", error, total_error)
+
+    !
+    !create memory dataspace.
+    !
+    CALL h5screate_simple_f(memrank, dimsm, memspace, error)
+    CALL check("h5screate_simple_f", error, total_error)
+
+    !
+    !Set the selected point positions.Because Fortran array index starts
+    ! from 1, so add one to the actual select points in C
+    !
+    coord(1,1) = 1
+    coord(2,1) = 2
+    coord(1,2) = 1
+    coord(2,2) = 4
+
+    !
+    !Select the elements in file space
+    !
+    CALL h5sselect_elements_f(dataspace1, H5S_SELECT_SET_F, RANK, NUMP,&
+         coord, error)
+    CALL check("h5sselect_elements_f", error, total_error)
+
+    !
+    !Write value into the selected points in dataset1
+    !
+    data_dims(1) = 2
+    CALL H5dwrite_f(dset1_id, H5T_NATIVE_INTEGER, val, data_dims, error, &
+         mem_space_id=memspace, file_space_id=dataspace1)
+    CALL check("h5dwrite_f", error, total_error)
+
+    !
+    !Copy the daspace1 into dataspace2
+    !
+    CALL h5scopy_f(dataspace1, dataspace2, error)
+    CALL check("h5scopy_f", error, total_error)
+
+    !
+    !Write value into the selected points in dataset2
+    !
+    CALL H5dwrite_f(dset2_id, H5T_NATIVE_INTEGER, val, data_dims, error, &
+         mem_space_id=memspace, file_space_id=dataspace2)
+    CALL check("h5dwrite_f", error, total_error)
+
+    !
+    !Close the dataspace for the datasets.
+    !
+    CALL h5sclose_f(dataspace1, error)
+    CALL check("h5sclose_f", error, total_error)
+
+    CALL h5sclose_f(dataspace2, error)
+    CALL check("h5sclose_f", error, total_error)
+
+    !
+    !Close the memoryspace.
+    !
+    CALL h5sclose_f(memspace, error)
+    CALL check("h5sclose_f", error, total_error)
+
+    !
+    !Close the datasets.
+    !
+    CALL h5dclose_f(dset1_id, error)
+    CALL check("h5dclose_f", error, total_error)
+
+    CALL h5dclose_f(dset2_id, error)
+    CALL check("h5dclose_f", error, total_error)
+
+    !
+    !Close the files.
+    !
+    CALL h5fclose_f(file1_id, error)
+    CALL check("h5fclose_f", error, total_error)
+
+    CALL h5fclose_f(file2_id, error)
+    CALL check("h5fclose_f", error, total_error)
+
+    !
+    !Open both files and print the contents of the datasets.
+    !
+
+    !
+    !Open the files.
+    !
+    CALL h5fopen_f (fix_filename1, H5F_ACC_RDWR_F, file1_id, error)
+    CALL check("h5fopen_f", error, total_error)
+
+    CALL h5fopen_f (fix_filename2, H5F_ACC_RDWR_F, file2_id, error)
+    CALL check("h5fopen_f", error, total_error)
+
+    !
+    !Open the  datasets.
+    !
+    CALL h5dopen_f(file1_id, dsetname1, dset1_id, error)
+    CALL check("h5dopen_f", error, total_error)
+
+    CALL h5dopen_f(file2_id, dsetname2, dset2_id, error)
+    CALL check("h5dopen_f", error, total_error)
+
+    !
+    !Read dataset1.
+    !
+    data_dims(1) = 3
+    data_dims(2) = 4
+    CALL h5dread_f(dset1_id, H5T_NATIVE_INTEGER, bufnew, data_dims, error)
+    CALL check("h5dread_f", error, total_error)
+
+    !
+    !Display the data read from dataset "Copy1"
+    !
+    !write(*,*) "The data in dataset Copy1 is: "
+    !do i = 1, 3
+    !   print *, (bufnew(i,j), j = 1,4)
+    !end do
+
+    !
+    !Read dataset2.
+    !
+    CALL h5dread_f(dset2_id, H5T_NATIVE_INTEGER, bufnew, data_dims, error)
+    CALL check("h5dread_f", error, total_error)
+
+    !
+    !Display the data read from dataset "Copy2"
+    !
+    !write(*,*) "The data in dataset Copy2 is: "
+    !do i = 1, 3
+    !   print *, (bufnew(i,j), j = 1,4)
+    !end do
+
+    !
+    !Close the datasets.
+    !
+    CALL h5dclose_f(dset1_id, error)
+    CALL check("h5dclose_f", error, total_error)
+
+    CALL h5dclose_f(dset2_id, error)
+    CALL check("h5dclose_f", error, total_error)
+
+    !
+    !Close the files.
+    !
+    CALL h5fclose_f(file1_id, error)
+    CALL check("h5fclose_f", error, total_error)
+
+    CALL h5fclose_f(file2_id, error)
+    CALL check("h5fclose_f", error, total_error)
+
+
+          if(cleanup) CALL h5_cleanup_f(filename1, H5P_DEFAULT_F, error)
+              CALL check("h5_cleanup_f", error, total_error)
+          if(cleanup) CALL h5_cleanup_f(filename2, H5P_DEFAULT_F, error)
+              CALL check("h5_cleanup_f", error, total_error)
+     RETURN
+  END SUBROUTINE  test_select_element
+
+
+  SUBROUTINE test_basic_select(cleanup, total_error)
+
+    IMPLICIT NONE
+    LOGICAL, INTENT(IN)  :: cleanup
+    INTEGER, INTENT(INOUT) :: total_error
+
+     !
+     !the dataset is stored in file "testselect.h5"
+     !
+     CHARACTER(LEN=10), PARAMETER :: filename = "testselect"
+     CHARACTER(LEN=80) :: fix_filename
+
+     !
+     !dataspace rank
+     !
+     INTEGER, PARAMETER :: RANK = 2
+
+     !
+     !select NUMP_POINTS points from the file
+     !
+     INTEGER(SIZE_T), PARAMETER :: NUMPS = 10
+
+     !
+     !dataset name is "testselect"
+     !
+     CHARACTER(LEN=10), PARAMETER :: dsetname = "testselect"
+
+     INTEGER(HID_T) :: file_id       ! File identifier
+     INTEGER(HID_T) :: dset_id       ! Dataset identifier
+     INTEGER(HID_T) :: dataspace     ! Dataspace identifier
+
+     !
+     !Dataset dimensions
+     !
+     INTEGER(HSIZE_T), DIMENSION(2) :: dimsf = (/5,6/)
+
+     !
+     !Size of the hyperslab in the file
+     !
+     INTEGER(HSIZE_T), DIMENSION(2) :: count = (/2,2/)
+
+     !
+     !hyperslab offset in the file
+     !
+     INTEGER(HSIZE_T), DIMENSION(2) :: offset = (/0,0/)
+
+     !
+     !start block for getting the selected hyperslab
+     !
+     INTEGER(HSIZE_T) :: startblock = 0
+
+     !
+     !start point for getting the selected elements
+     !
+     INTEGER(HSIZE_T)  :: startpoint = 0
+
+     !
+     !Stride of the hyperslab in the file
+     !
+     INTEGER(HSIZE_T), DIMENSION(2) :: stride = (/3,3/)
+
+     !
+     !BLock size of the hyperslab in the file
+     !
+     INTEGER(HSIZE_T), DIMENSION(2) :: block = (/2,2/)
+
+     !
+     !array to give selected points' coordinations
+     !
+     INTEGER(HSIZE_T), DIMENSION(RANK, NUMPS) :: coord
+
+
+     !
+     !Number of hyperslabs selected in the current dataspace
+     !
+     INTEGER(HSSIZE_T) :: num_blocks
+
+     !
+     !allocatable array for putting a list of hyperslabs
+     !selected in the current file dataspace
+     !
+     INTEGER(HSIZE_T), ALLOCATABLE, DIMENSION(:) :: blocklist
+
+     !
+     !Number of points selected in the current dataspace
+     !
+     INTEGER(HSSIZE_T) :: num_points
+     INTEGER(HSIZE_T) :: num1_points
+
+     !
+     !allocatable array for putting a list of points
+     !selected in the current file dataspace
+     !
+     INTEGER(HSIZE_T), ALLOCATABLE, DIMENSION(:) :: pointlist
+
+     !
+     !start and end bounds in the current dataspace selection
+     !
+     INTEGER(HSIZE_T), DIMENSION(RANK) :: startout, endout
+
+     !
+     !data to write
+     !
+     INTEGER, DIMENSION(5,6) :: data
+
+     !
+     !flag to check operation success
+     !
+     INTEGER :: error
+     INTEGER(HSIZE_T), DIMENSION(3) :: data_dims
+
+     !
+     !initialize the coord array to give the selected points' position
+     !
+     coord(1,1) = 1
+     coord(2,1) = 1
+     coord(1,2) = 1
+     coord(2,2) = 3
+     coord(1,3) = 1
+     coord(2,3) = 5
+     coord(1,4) = 3
+     coord(2,4) = 1
+     coord(1,5) = 3
+     coord(2,5) = 3
+     coord(1,6) = 3
+     coord(2,6) = 5
+     coord(1,7) = 4
+     coord(2,7) = 3
+     coord(1,8) = 4
+     coord(2,8) = 1
+     coord(1,9) = 5
+     coord(2,9) = 3
+     coord(1,10) = 5
+     coord(2,10) = 5
+
+     !
+     !Create a new file using default properties.
+     !
+          CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+          if (error .ne. 0) then
+              write(*,*) "Cannot modify filename"
+              stop
+          endif
+     CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
+     CALL check("h5fcreate_f", error, total_error)
+
+     !
+     !Create the data space for the  dataset.
+     !
+     CALL h5screate_simple_f(RANK, dimsf, dataspace, error)
+     CALL check("h5screate_simple_f", error, total_error)
+
+     !
+     ! Create the dataset with default properties
+     !
+     CALL h5dcreate_f(file_id, dsetname, H5T_STD_I32BE, dataspace, &
+                      dset_id, error)
+     CALL check("h5dcreate_f", error, total_error)
+
+     !
+     ! Write the dataset
+     !
+     data_dims(1) = 5
+     data_dims(2) = 6
+     CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, data, data_dims, error)
+     CALL check("h5dwrite_f", error, total_error)
+
+     !
+     !Close the dataspace for the dataset.
+     !
+     CALL h5sclose_f(dataspace, error)
+     CALL check("h5sclose_f", error, total_error)
+
+     !
+     !Close the dataset.
+     !
+     CALL h5dclose_f(dset_id, error)
+     CALL check("h5dclose_f", error, total_error)
+
+     !
+     !Close the file.
+     !
+     CALL h5fclose_f(file_id, error)
+     CALL check("h5fclose_f", error, total_error)
+
+     !
+     !Open the file.
+     !
+     CALL h5fopen_f (fix_filename, H5F_ACC_RDONLY_F, file_id, error)
+     CALL check("h5fopen_f", error, total_error)
+
+     !
+     !Open the  dataset.
+     !
+     CALL h5dopen_f(file_id, dsetname, dset_id, error)
+     CALL check("h5dopen_f", error, total_error)
+
+     !
+     !Get dataset's dataspace handle.
+     !
+     CALL h5dget_space_f(dset_id, dataspace, error)
+     CALL check("h5dget_space_f", error, total_error)
+
+     !
+     !Select hyperslab in the dataset.
+     !
+     CALL h5sselect_hyperslab_f(dataspace, H5S_SELECT_SET_F, &
+                                offset, count, error, stride, block)
+     CALL check("h5sselect_hyperslab_f", error, total_error)
+
+     !
+     !get the number of hyperslab blocks in the current dataspac selection
+     !
+     CALL h5sget_select_hyper_nblocks_f(dataspace, num_blocks, error)
+     CALL check("h5sget_select_hyper_nblocks_f", error, total_error)
+     IF (num_blocks .NE. 4) write (*,*) "error occured with num_blocks"
+     !write(*,*) num_blocks
+     !result of num_blocks is 4
+
+     !
+     !allocate the blocklist array
+     !
+     ALLOCATE(blocklist(num_blocks*RANK*2), STAT= error)
+     if(error .NE. 0) then
+         STOP
+     endif
+
+     !
+     !get the list of hyperslabs selected in the current dataspac selection
+     !
+     CALL h5sget_select_hyper_blocklist_f(dataspace, startblock, &
+                                          num_blocks, blocklist, error)
+     CALL check("h5sget_select_hyper_blocklist_f", error, total_error)
+!     write(*,*) (blocklist(i), i =1, num_blocks*RANK*2)
+     !result of blocklist selected is:
+     !1,  1,  2,  2,  4,  1,  5,  2,  1,  4,  2,  5,  4,  4,  5,  5
+
+     !
+     !deallocate the blocklist array
+     !
+     DEALLOCATE(blocklist)
+
+     !
+     !get the selection bounds in the current dataspac selection
+     !
+     CALL h5sget_select_bounds_f(dataspace, startout, endout, error)
+     CALL check("h5sget_select_bounds_f", error, total_error)
+     IF ( (startout(1) .ne. 1) .or. (startout(2) .ne. 1) ) THEN
+        write(*,*) "error occured to select_bounds's start position"
+     END IF
+
+     IF ( (endout(1) .ne. 5) .or. (endout(2) .ne. 5) ) THEN
+        write(*,*) "error occured to select_bounds's end position"
+     END IF
+     !write(*,*) (startout(i), i = 1, RANK)
+     !result of startout is 0, 0
+
+     !write(*,*) (endout(i), i = 1, RANK)
+     !result of endout is 5, 5
+
+     !
+     !allocate the pointlist array
+     !
+!     ALLOCATE(pointlist(num_blocks*RANK), STAT= error)
+     ALLOCATE(pointlist(20), STAT= error)
+     if(error .NE. 0) then
+         STOP
+     endif
+
+     !
+     !Select the elements in file space
+     !
+     CALL h5sselect_elements_f(dataspace, H5S_SELECT_SET_F, RANK, NUMPS,&
+                               coord, error)
+     CALL check("h5sselect_elements_f", error, total_error)
+
+     !
+     !Get the number of selected elements
+     !
+     CALL h5sget_select_elem_npoints_f(dataspace, num_points, error)
+     CALL check("h5sget_select_elem_npoints_f", error, total_error)
+     IF (num_points .NE. 10) write(*,*) "error occured with num_points"
+     !write(*,*) num_points
+     ! result of num_points is 10
+
+     !
+     !Get the list of selected elements
+     !
+     num1_points = num_points
+     CALL h5sget_select_elem_pointlist_f(dataspace, startpoint, &
+                                          num1_points, pointlist, error)
+     CALL check("h5sget_select_elem_pointlist_f", error, total_error)
+     !write(*,*) (pointlist(i), i =1, num1_points*RANK)
+     !result of pintlist is:
+     !1,  1,  3,  1,  5,  1,  1,  3,  3,  3,  5,  3,  3,
+     !4,  1,  4,  3,  5,  5,  5
+
+     !
+     !deallocate the pointlist array
+     !
+     DEALLOCATE(pointlist)
+
+     !
+     !Close the dataspace for the dataset.
+     !
+     CALL h5sclose_f(dataspace, error)
+     CALL check("h5sclose_f", error, total_error)
+
+     !
+     !Close the dataset.
+     !
+     CALL h5dclose_f(dset_id, error)
+     CALL check("h5dclose_f", error, total_error)
+
+     !
+     !Close the file.
+     !
+     CALL h5fclose_f(file_id, error)
+     CALL check("h5fclose_f", error, total_error)
+
+
+          if(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+              CALL check("h5_cleanup_f", error, total_error)
+
+     RETURN
+  END SUBROUTINE  test_basic_select
+
+!***************************************************************
+!**
+!**  test_select_point(): Test basic H5S (dataspace) selection code.
+!**      Tests element selections between dataspaces of various sizes
+!**      and dimensionalities.
+!**
+!***************************************************************
+
+SUBROUTINE test_select_point(cleanup, total_error)
+  
+  IMPLICIT NONE
+  LOGICAL, INTENT(IN)  :: cleanup
+  INTEGER, INTENT(INOUT) :: total_error
+  INTEGER(HID_T) :: xfer_plist
+  
+  INTEGER, PARAMETER :: SPACE1_DIM1=3
+  INTEGER, PARAMETER :: SPACE1_DIM2=15
+  INTEGER, PARAMETER :: SPACE1_DIM3=13
+  INTEGER, PARAMETER :: SPACE2_DIM1=30
+  INTEGER, PARAMETER :: SPACE2_DIM2=26
+  INTEGER, PARAMETER :: SPACE3_DIM1=15
+  INTEGER, PARAMETER :: SPACE3_DIM2=26
+  
+  INTEGER, PARAMETER :: SPACE1_RANK=3
+  INTEGER, PARAMETER :: SPACE2_RANK=2
+  INTEGER, PARAMETER :: SPACE3_RANK=2
+  
+  !  Element selection information 
+  INTEGER, PARAMETER :: POINT1_NPOINTS=10
+  INTEGER(hid_t) ::fid1 !  HDF5 File IDs 
+  INTEGER(hid_t) ::dataset !	 Dataset ID 
+  INTEGER(hid_t) ::sid1,sid2 !  Dataspace ID 
+  INTEGER(hsize_t), DIMENSION(1:3) :: dims1 = (/SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3/)
+  INTEGER(hsize_t), DIMENSION(1:2) :: dims2 = (/SPACE2_DIM1, SPACE2_DIM2/)
+  INTEGER(hsize_t), DIMENSION(1:2) :: dims3 = (/SPACE3_DIM1, SPACE3_DIM2/)
+  
+  INTEGER(hsize_t), DIMENSION(1:SPACE1_RANK,1:POINT1_NPOINTS) :: coord1 ! Coordinates for point selection 
+  INTEGER(hsize_t), DIMENSION(1:SPACE1_RANK,1:POINT1_NPOINTS) :: temp_coord1 ! Coordinates for point selection 
+  INTEGER(hsize_t), DIMENSION(1:SPACE2_RANK,1:POINT1_NPOINTS) :: coord2 ! Coordinates for point selection 
+  INTEGER(hsize_t), DIMENSION(1:SPACE2_RANK,1:POINT1_NPOINTS) :: temp_coord2 ! Coordinates for point selection 
+  INTEGER(hsize_t), DIMENSION(1:SPACE3_RANK,1:POINT1_NPOINTS) :: coord3 ! Coordinates for point selection 
+  INTEGER(hsize_t), DIMENSION(1:SPACE3_RANK,1:POINT1_NPOINTS) :: temp_coord3 ! Coordinates for point selection 
+  INTEGER(hssize_t) :: npoints
+
+!!$    uint8_t    *wbuf,        buffer to write to disk 
+!!$               *rbuf,        buffer read from disk 
+!!$               *tbuf;        temporary buffer pointer 
+  INTEGER :: i,j;        ! Counters 
+!    struct pnt_iter pi;      Custom Pointer iterator struct 
+  INTEGER :: error    ! Generic return value		
+  CHARACTER(LEN=9) :: filename = 'h5s_hyper'
+  CHARACTER(LEN=80) :: fix_filename 
+  CHARACTER(LEN=1), DIMENSION(1:SPACE2_DIM1,1:SPACE2_DIM2) :: wbuf
+
+  CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+  IF (error .NE. 0) THEN
+     WRITE(*,*) "Cannot modify filename"
+     STOP
+  ENDIF
+  xfer_plist = H5P_DEFAULT_F
+!    MESSAGE(5, ("Testing Element Selection Functions\n"));
+
+    ! Allocate write & read buffers 
+!!$  wbuf = HDmalloc(sizeof(uint8_t) * SPACE2_DIM1 * SPACE2_DIM2);
+!!$  rbuf = HDcalloc(sizeof(uint8_t), (size_t)(SPACE3_DIM1 * SPACE3_DIM2));
+!!$
+  ! Initialize WRITE buffer 
+
+  DO i = 1, SPACE2_DIM1
+     DO j = 1, SPACE2_DIM2
+        wbuf(i,j) = 'a'
+     ENDDO
+  ENDDO
+
+!!$  for(i=0, tbuf=wbuf; i<SPACE2_DIM1; i++)
+!!$  for(j=0; j<SPACE2_DIM2; j++)
+!!$  *tbuf++=(uint8_t)((i*SPACE2_DIM2)+j);
+  
+  ! Create file 
+  CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, fid1, error)
+  CALL check("h5fcreate_f", error, total_error)
+  
+  ! Create dataspace for dataset 
+  CALL h5screate_simple_f(SPACE1_RANK, dims1, sid1, error)
+  CALL check("h5screate_simple_f", error, total_error)
+
+  ! Create dataspace for write buffer 
+  CALL h5screate_simple_f(SPACE2_RANK, dims2, sid2, error)
+  CALL check("h5screate_simple_f", error, total_error)
+
+  ! Select sequence of ten points for disk dataset 
+  coord1(1,1)=1; coord1(2,1)=11; coord1(3,1)= 6;
+  coord1(1,2)=2; coord1(2,2)= 3; coord1(3,2)= 8;
+  coord1(1,3)=3; coord1(2,3)= 5; coord1(3,3)=10;
+  coord1(1,4)=1; coord1(2,4)= 7; coord1(3,4)=12;
+  coord1(1,5)=2; coord1(2,5)= 9; coord1(3,5)=14;
+  coord1(1,6)=3; coord1(2,6)=13; coord1(3,6)= 1;
+  coord1(1,7)=1; coord1(2,7)=15; coord1(3,7)= 3;
+  coord1(1,8)=2; coord1(2,8)= 1; coord1(3,8)= 5;
+  coord1(1,9)=3; coord1(2,9)= 2; coord1(3,9)= 7;
+  coord1(1,10)=1; coord1(2,10)= 4; coord1(3,10)= 9
+
+  CALL h5sselect_elements_f(sid1, H5S_SELECT_SET_F, SPACE1_RANK, INT(POINT1_NPOINTS,size_t), coord1, error)
+  CALL check("h5sselect_elements_f", error, total_error)
+
+  ! Verify correct elements selected 
+
+  CALL h5sget_select_elem_pointlist_f(sid1, INT(0,hsize_t), INT(POINT1_NPOINTS,hsize_t),temp_coord1,error)
+  CALL check("h5sget_select_elem_pointlist_f", error, total_error)
+
+  DO i= 1, POINT1_NPOINTS
+     CALL verify("h5sget_select_elem_pointlist_f", INT(temp_coord1(1,i)), INT(coord1(1,i)), total_error)
+     CALL verify("h5sget_select_elem_pointlist_f", INT(temp_coord1(2,i)), INT(coord1(2,i)), total_error)
+     CALL verify("h5sget_select_elem_pointlist_f", INT(temp_coord1(3,i)), INT(coord1(3,i)), total_error)
+  ENDDO
+
+  CALL H5Sget_select_npoints_f(sid1, npoints, error)
+  CALL check("h5sget_select_npoints_f", error, total_error)
+  CALL verify("h5sget_select_npoints_f", INT(npoints), 10, total_error)
+
+  ! Append another sequence of ten points to disk dataset 
+
+  coord1(1,1)=1; coord1(2,1)=3; coord1(3,1)= 1;
+  coord1(1,2)=2; coord1(2,2)=11; coord1(3,2)= 9;
+  coord1(1,3)=3; coord1(2,3)= 9; coord1(3,3)=11;
+  coord1(1,4)=1; coord1(2,4)= 8; coord1(3,4)=13;
+  coord1(1,5)=2; coord1(2,5)= 4; coord1(3,5)=12;
+  coord1(1,6)=3; coord1(2,6)= 2; coord1(3,6)= 2;
+  coord1(1,7)=1; coord1(2,7)=14; coord1(3,7)= 8;
+  coord1(1,8)=2; coord1(2,8)=15; coord1(3,8)= 7;
+  coord1(1,9)=3; coord1(2,9)= 3; coord1(3,9)= 6;
+  coord1(1,10)=1; coord1(2,10)= 7; coord1(3,10)= 14
+
+
+  CALL h5sselect_elements_f(sid1, H5S_SELECT_APPEND_F, SPACE1_RANK, INT(POINT1_NPOINTS,size_t), coord1, error)
+  CALL check("h5sselect_elements_f", error, total_error)
+  !  Verify correct elements selected 
+  
+  CALL h5sget_select_elem_pointlist_f(sid1, INT(POINT1_NPOINTS,hsize_t), INT(POINT1_NPOINTS,hsize_t),temp_coord1,error)
+  CALL check("h5sget_select_elem_pointlist_f", error, total_error)
+
+  DO i= 1, POINT1_NPOINTS
+     CALL verify("h5sget_select_elem_pointlist_f", INT(temp_coord1(1,i)), INT(coord1(1,i)), total_error)
+     CALL verify("h5sget_select_elem_pointlist_f", INT(temp_coord1(2,i)), INT(coord1(2,i)), total_error)
+     CALL verify("h5sget_select_elem_pointlist_f", INT(temp_coord1(3,i)), INT(coord1(3,i)), total_error)
+  ENDDO
+
+  CALL H5Sget_select_npoints_f(sid1, npoints, error)
+  CALL check("h5sget_select_npoints_f", error, total_error)
+  CALL verify("h5sget_select_npoints_f", INT(npoints), 20, total_error)
+
+  !  Select sequence of ten points for memory dataset 
+  coord2(1,1)=13; coord2(2,1)= 4;
+  coord2(1,2)=16; coord2(2,2)=14;
+  coord2(1,3)= 8; coord2(2,3)=26;
+  coord2(1,4)= 1; coord2(2,4)= 7;
+  coord2(1,5)=14; coord2(2,5)= 1;
+  coord2(1,6)=25; coord2(2,6)=12;
+  coord2(1,7)=13; coord2(2,7)=22;
+  coord2(1,8)=30; coord2(2,8)= 5;
+  coord2(1,9)= 9; coord2(2,9)= 9;
+  coord2(1,10)=20; coord2(2,10)=18
+
+  CALL h5sselect_elements_f(sid2, H5S_SELECT_SET_F, SPACE2_RANK, INT(POINT1_NPOINTS,size_t), coord2, error)
+  CALL check("h5sselect_elements_f", error, total_error)
+
+
+  ! Verify correct elements selected 
+  
+  CALL h5sget_select_elem_pointlist_f(sid2, INT(0,hsize_t), INT(POINT1_NPOINTS,hsize_t),temp_coord2,error)
+  CALL check("h5sget_select_elem_pointlist_f", error, total_error)
+
+  DO i= 1, POINT1_NPOINTS
+     CALL verify("h5sget_select_elem_pointlist_f", INT(temp_coord2(1,i)), INT(coord2(1,i)), total_error)
+     CALL verify("h5sget_select_elem_pointlist_f", INT(temp_coord2(2,i)), INT(coord2(2,i)), total_error)
+  ENDDO
+
+!!$
+!!$     Save points for later iteration 
+!!$     (these are in the second half of the buffer, because we are prepending 
+!!$      the next list of points to the beginning of the point selection list) 
+!!$    HDmemcpy(((char *)pi.coord)+sizeof(coord2),coord2,sizeof(coord2));
+!!$
+
+  CALL H5Sget_select_npoints_f(sid2, npoints, error)
+  CALL check("h5sget_select_npoints_f", error, total_error)
+  CALL verify("h5sget_select_npoints_f", INT(npoints), 10, total_error)
+
+  ! Append another sequence of ten points to memory dataset 
+  coord2(1,1)=25; coord2(2,1)= 1;
+  coord2(1,2)= 3; coord2(2,2)=26;
+  coord2(1,3)=14; coord2(2,3)=18;
+  coord2(1,4)= 9; coord2(2,4)= 4;
+  coord2(1,5)=30; coord2(2,5)= 5;
+  coord2(1,6)=12; coord2(2,6)=15;
+  coord2(1,7)= 6; coord2(2,7)=23;
+  coord2(1,8)=13; coord2(2,8)= 3;
+  coord2(1,9)=22; coord2(2,9)=13;
+  coord2(1,10)= 10; coord2(2,10)=19
+
+  CALL h5sselect_elements_f(sid2, H5S_SELECT_PREPEND_F, SPACE2_RANK, INT(POINT1_NPOINTS,size_t), coord2, error)
+  CALL check("h5sselect_elements_f", error, total_error)
+
+
+  ! Verify correct elements selected 
+  CALL h5sget_select_elem_pointlist_f(sid2, INT(0,hsize_t), INT(POINT1_NPOINTS,hsize_t),temp_coord2,error)
+  CALL check("h5sget_select_elem_pointlist_f", error, total_error)
+
+  DO i= 1, POINT1_NPOINTS
+     CALL verify("h5sget_select_elem_pointlist_f", INT(temp_coord2(1,i)), INT(coord2(1,i)), total_error)
+     CALL verify("h5sget_select_elem_pointlist_f", INT(temp_coord2(2,i)), INT(coord2(2,i)), total_error)
+  ENDDO
+
+  CALL H5Sget_select_npoints_f(sid2, npoints, error)
+  CALL check("h5sget_select_npoints_f", error, total_error)
+  CALL verify("h5sget_select_npoints_f", INT(npoints), 20, total_error)
+
+!!$     Save points for later iteration 
+!!$    HDmemcpy(pi.coord,coord2,sizeof(coord2));
+
+  !  Create a dataset 
+  CALL h5dcreate_f(fid1, "Dataset1", H5T_NATIVE_CHARACTER, sid1, dataset, error)
+  CALL check("h5dcreate_f", error, total_error)
+
+  !  Write selection to disk 
+  CALL h5dwrite_f(dataset, H5T_NATIVE_CHARACTER, wbuf, dims2, error, sid2, sid1, xfer_plist)
+  CALL check("h5dwrite_f", error, total_error)
+
+  !  Close memory dataspace 
+  CALL h5sclose_f(sid2, error)
+  CALL check("h5sclose_f", error, total_error)
+
+  !  Create dataspace for reading buffer 
+  CALL h5screate_simple_f(SPACE3_RANK, dims3, sid2, error)
+  CALL check("h5screate_simple_f", error, total_error)
+
+  !  Select sequence of points for read dataset 
+  coord3(1,1)= 1; coord3(2,1)= 3;
+  coord3(1,2)= 5; coord3(2,2)= 9;
+  coord3(1,3)=14; coord3(2,3)=14;
+  coord3(1,4)=15; coord3(2,4)=21;
+  coord3(1,5)= 8; coord3(2,5)=10;
+  coord3(1,6)= 3; coord3(2,6)= 1;
+  coord3(1,7)= 10; coord3(2,7)=20;
+  coord3(1,8)= 2; coord3(2,8)=23;
+  coord3(1,9)=13; coord3(2,9)=22;
+  coord3(1,10)=12; coord3(2,10)=7;
+
+  CALL h5sselect_elements_f(sid2, H5S_SELECT_SET_F, SPACE3_RANK, INT(POINT1_NPOINTS,size_t), coord3, error)
+  CALL check("h5sselect_elements_f", error, total_error)
+
+  !  Verify correct elements selected 
+  CALL h5sget_select_elem_pointlist_f(sid2, INT(0,hsize_t), INT(POINT1_NPOINTS,hsize_t),temp_coord3,error)
+  CALL check("h5sget_select_elem_pointlist_f", error, total_error)
+  DO i= 1, POINT1_NPOINTS
+     CALL verify("h5sget_select_elem_pointlist_f", INT(temp_coord3(1,i)), INT(coord3(1,i)), total_error)
+     CALL verify("h5sget_select_elem_pointlist_f", INT(temp_coord3(2,i)), INT(coord3(2,i)), total_error)
+  ENDDO
+
+  CALL H5Sget_select_npoints_f(sid2, npoints, error)
+  CALL check("h5sget_select_npoints_f", error, total_error)
+  CALL verify("h5sget_select_npoints_f", INT(npoints), 10, total_error)
+
+  ! Append another sequence of ten points to disk dataset 
+    coord3(1,1)=15; coord3(2,1)=26;
+    coord3(1,2)= 1; coord3(2,2)= 1;
+    coord3(1,3)=12; coord3(2,3)=12;
+    coord3(1,4)= 6; coord3(2,4)=15;
+    coord3(1,5)= 4; coord3(2,5)= 6;
+    coord3(1,6)= 3; coord3(2,6)= 3;
+    coord3(1,7)= 8; coord3(2,7)=14;
+    coord3(1,8)=10; coord3(2,8)=17;
+    coord3(1,9)=13; coord3(2,9)=23;
+    coord3(1,10)=14; coord3(2,10)=10
+
+    CALL h5sselect_elements_f(sid2, H5S_SELECT_APPEND_F, SPACE3_RANK, INT(POINT1_NPOINTS,size_t), coord3, error)
+    CALL check("h5sselect_elements_f", error, total_error)
+
+  !  Verify correct elements selected 
+  CALL h5sget_select_elem_pointlist_f(sid2, INT(POINT1_NPOINTS,hsize_t), INT(POINT1_NPOINTS,hsize_t),temp_coord3,error)
+  CALL check("h5sget_select_elem_pointlist_f", error, total_error)
+  DO i= 1, POINT1_NPOINTS
+     CALL verify("h5sget_select_elem_pointlist_f", INT(temp_coord3(1,i)), INT(coord3(1,i)), total_error)
+     CALL verify("h5sget_select_elem_pointlist_f", INT(temp_coord3(2,i)), INT(coord3(2,i)), total_error)
+  ENDDO
+
+  CALL H5Sget_select_npoints_f(sid2, npoints, error)
+  CALL check("h5sget_select_npoints_f", error, total_error)
+  CALL verify("h5sget_select_npoints_f", INT(npoints), 20, total_error)
+
+! F2003 feature
+!!$  Read selection from disk 
+!!$    ret=H5Dread(dataset,H5T_NATIVE_UCHAR,sid2,sid1,xfer_plist,rbuf);
+!!$    CHECK(ret, FAIL, "H5Dread");
+!!$
+!!$     Check that the values match with a dataset iterator 
+!!$    pi.buf=wbuf;
+!!$    pi.offset=0;
+!!$    ret = H5Diterate(rbuf,H5T_NATIVE_UCHAR,sid2,test_select_point_iter1,&pi);
+!!$    CHECK(ret, FAIL, "H5Diterate");
+!!$
+! F2003 feature
+
+  ! Close memory dataspace 
+  CALL h5sclose_f(sid2, error)
+  CALL check("h5sclose_f", error, total_error)
+
+  ! Close disk dataspace 
+  CALL h5sclose_f(sid1, error)
+  CALL check("h5sclose_f", error, total_error)
+
+  ! Close Dataset 
+  CALL h5dclose_f(dataset, error)
+  CALL check("h5dclose_f", error, total_error)
+
+  ! Close file 
+  CALL h5fclose_f(fid1, error)
+  CALL check("h5fclose_f", error, total_error)
+
+  IF(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+
+END SUBROUTINE test_select_point
+
+
+!***************************************************************
+!**
+!**  test_select_combine(): Test basic H5S (dataspace) selection code.
+!**      Tests combining "all" and "none" selections with hyperslab
+!**      operations.
+!**
+!***************************************************************
+
+SUBROUTINE test_select_combine(total_error)
+  
+  IMPLICIT NONE
+  INTEGER, INTENT(INOUT) :: total_error
+
+  INTEGER, PARAMETER :: SPACE7_RANK = 2
+  INTEGER, PARAMETER :: SPACE7_DIM1 = 10
+  INTEGER, PARAMETER :: SPACE7_DIM2 = 10
+  
+  INTEGER(hid_t) :: base_id !       Base dataspace for test 
+  INTEGER(hid_t) :: all_id !        Dataspace for "all" selection 
+  INTEGER(hid_t) :: none_id !       Dataspace for "none" selection 
+  INTEGER(hid_t) :: space1 !        Temporary dataspace #1 
+  INTEGER(hsize_t), DIMENSION(1:SPACE7_RANK) :: start !  Hyperslab start 
+  INTEGER(hsize_t), DIMENSION(1:SPACE7_RANK) :: stride !  Hyperslab stride 
+  INTEGER(hsize_t), DIMENSION(1:SPACE7_RANK) :: icount !  Hyperslab count 
+  INTEGER(hsize_t), DIMENSION(1:SPACE7_RANK) :: iblock !  Hyperslab BLOCK 
+  INTEGER(hsize_t), DIMENSION(1:SPACE7_RANK) :: dims = (/SPACE7_DIM1,SPACE7_DIM2/) ! Dimensions of dataspace 
+  INTEGER :: sel_type !  Selection type 
+  INTEGER(hssize_t) :: nblocks   ! Number of hyperslab blocks 
+  INTEGER(hsize_t), DIMENSION(1:128,1:2,1:SPACE7_RANK) :: blocks !  List of blocks 
+  INTEGER :: error, area
+
+  ! Create dataspace for dataset on disk 
+  CALL h5screate_simple_f(SPACE7_RANK, dims, base_id, error)
+  CALL check("h5screate_simple_f", error, total_error)
+
+  !  Copy base dataspace and set selection to "all" 
+  CALL h5scopy_f(base_id, all_id, error)  
+  CALL check("h5scopy_f", error, total_error)
+
+  CALL H5Sselect_all_f(all_id, error)
+  CALL check("H5Sselect_all_f", error, total_error)
+
+  CALL H5Sget_select_type_f(all_id, sel_type, error)
+  CALL check("H5Sget_select_type_f", error, total_error)
+  CALL verify("H5Sget_select_type_f", INT(sel_type), INT(H5S_SEL_ALL_F), total_error)
+
+  ! Copy base dataspace and set selection to "none" 
+  CALL h5scopy_f(base_id, none_id, error)  
+  CALL check("h5scopy_f", error, total_error)
+
+  CALL H5Sselect_none_f(none_id, error)
+  CALL check("H5Sselect_none_f", error, total_error)
+
+  CALL H5Sget_select_type_f(none_id, sel_type, error)
+  CALL check("H5Sget_select_type_f", error, total_error)
+  CALL verify("H5Sget_select_type_f", INT(sel_type), INT(H5S_SEL_NONE_F), total_error)
+  
+  ! Copy "all" selection & space 
+  CALL H5Scopy_f(all_id, space1, error)  
+  CALL check("h5scopy_f", error, total_error)
+
+  ! 'OR' "all" selection with another hyperslab 
+  start(1:2) = 0
+  stride(1:2) = 1
+  icount(1:2) = 1
+  iblock(1:2) = (/5,4/)
+  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_OR_F, start, &
+                                icount, error, stride, iblock) 
+  CALL check("h5sselect_hyperslab_f", error, total_error)
+
+  ! Verify that it's still "all" selection 
+  CALL H5Sget_select_type_f(space1, sel_type, error)
+  CALL check("H5Sget_select_type_f", error, total_error)
+  CALL verify("H5Sget_select_type_f", INT(sel_type), INT(H5S_SEL_ALL_F), total_error)
+
+  ! Close temporary dataspace 
+  CALL h5sclose_f(space1, error)
+  CALL check("h5sclose_f", error, total_error)
+
+  ! Copy "all" selection & space 
+  CALL H5Scopy_f(all_id, space1, error)  
+  CALL check("h5scopy_f", error, total_error)
+
+  !  'AND' "all" selection with another hyperslab 
+  start(1:2) = 0
+  stride(1:2) = 1
+  icount(1:2) = 1
+  iblock(1:2) = (/5,4/)
+  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_AND_F, start, &
+       icount, error, stride, iblock) 
+  CALL check("h5sselect_hyperslab_f", error, total_error)
+
+  ! Verify that the new selection is the same at the original block 
+  CALL H5Sget_select_type_f(space1, sel_type, error)
+  CALL check("H5Sget_select_type_f", error, total_error)
+  CALL verify("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_HYPERSLABS_F), total_error)
+
+  ! Verify that there is only one block 
+  CALL h5sget_select_hyper_nblocks_f(space1, nblocks, error)
+  CALL check("h5sget_select_hyper_nblocks_f", error, total_error)
+  CALL verify("h5sget_select_hyper_nblocks_f", INT(nblocks), 1, total_error)
+  
+  ! Retrieve the block defined 
+  CALL h5sget_select_hyper_blocklist_f(space1, INT(0, hsize_t), INT(nblocks,hsize_t), blocks, error)
+  CALL check("h5sget_select_hyper_blocklist_f", error, total_error)
+
+  ! Verify that the correct block is defined 
+
+  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(1,1,1)), 1, total_error)
+  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(2,1,1)), 1, total_error)
+  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(3,1,1)), 5, total_error)
+  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(4,1,1)), 4, total_error)
+
+  ! Close temporary dataspace 
+  CALL h5sclose_f(space1, error)
+  CALL check("h5sclose_f", error, total_error)
+
+  ! Copy "all" selection & space 
+  CALL H5Scopy_f(all_id, space1, error)  
+  CALL check("h5scopy_f", error, total_error)
+
+  !  'XOR' "all" selection with another hyperslab 
+  start(1:2) = 0
+  stride(1:2) = 1
+  icount(1:2) = 1
+  iblock(1:2) = (/5,4/)
+
+  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_XOR_F, start, &
+       icount, error, stride, iblock) 
+  CALL check("h5sselect_hyperslab_f", error, total_error)
+
+  !  Verify that the new selection is an inversion of the original block 
+  CALL H5Sget_select_type_f(space1, sel_type, error)
+  CALL check("H5Sget_select_type_f", error, total_error)
+  CALL verify("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_HYPERSLABS_F), total_error)
+
+  !  Verify that there are two blocks 
+  CALL h5sget_select_hyper_nblocks_f(space1, nblocks, error)
+  CALL check("h5sget_select_hyper_nblocks_f", error, total_error)
+  CALL verify("h5sget_select_hyper_nblocks_f", INT(nblocks), 2, total_error)
+
+  !  Retrieve the block defined 
+
+  blocks = -1 !  Reset block list 
+  CALL h5sget_select_hyper_blocklist_f(space1, INT(0, hsize_t), INT(nblocks,hsize_t), blocks, error)
+  CALL check("h5sget_select_hyper_blocklist_f", error, total_error)
+
+  !  Verify that the correct block is defined 
+
+  ! No guarantee is implied as the order in which blocks are listed. 
+  ! So this will ONLY work for square domains iblock(1:2) = (/5,5/)
+!!$  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(1,1,1)), 1, total_error)
+!!$  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(2,1,1)), 5, total_error)
+!!$  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(3,1,1)), 5, total_error)
+!!$  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(4,1,1)), 10, total_error)
+!!$  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(5,1,1)), 6, total_error)
+!!$  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(6,1,1)), 1, total_error)
+!!$  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(7,1,1)), 10, total_error)
+!!$  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(8,1,1)), 10, total_error)
+
+  ! Otherwise make sure the "area" of the block is correct
+  area = (ABS(INT(blocks(1,1,1)-blocks(3,1,1)))+1)*(ABS(INT(blocks(2,1,1)-blocks(4,1,1)))+1)
+  area = area + (ABS(INT(blocks(5,1,1)-blocks(7,1,1)))+1)*(ABS(INT(blocks(6,1,1)-blocks(8,1,1)))+1)
+  CALL verify("h5sget_select_hyper_blocklist_f", area, 80, total_error)
+
+  ! Close temporary dataspace 
+  CALL h5sclose_f(space1, error)
+  CALL check("h5sclose_f", error, total_error)
+
+  !  Copy "all" selection & space 
+  CALL H5Scopy_f(all_id, space1, error)  
+  CALL check("h5scopy_f", error, total_error)
+
+  !  'NOTB' "all" selection with another hyperslab 
+  start(1:2) = 0
+  stride(1:2) = 1
+  icount(1:2) = 1
+  iblock(1:2) = (/5,4/) !5
+
+  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_NOTB_F, start, &
+       icount, error, stride, iblock) 
+  CALL check("h5sselect_hyperslab_f", error, total_error)
+
+  !  Verify that the new selection is an inversion of the original block 
+  CALL H5Sget_select_type_f(space1, sel_type, error)
+  CALL check("H5Sget_select_type_f", error, total_error)
+  CALL verify("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_HYPERSLABS_F), total_error)
+
+  !  Verify that there are two blocks 
+  CALL h5sget_select_hyper_nblocks_f(space1, nblocks, error)
+  CALL check("h5sget_select_hyper_nblocks_f", error, total_error)
+  CALL verify("h5sget_select_hyper_nblocks_f", INT(nblocks), 2, total_error)
+
+  !  Retrieve the block defined 
+  blocks = -1 !  Reset block list 
+  CALL h5sget_select_hyper_blocklist_f(space1, INT(0, hsize_t), INT(nblocks,hsize_t), blocks, error)
+  CALL check("h5sget_select_hyper_blocklist_f", error, total_error)
+
+  !  Verify that the correct block is defined  
+
+  ! No guarantee is implied as the order in which blocks are listed. 
+  ! So this will ONLY work for square domains iblock(1:2) = (/5,5/)
+
+!!$  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(1,1,1)), 1, total_error)
+!!$  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(2,1,1)), 5, total_error)
+!!$  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(3,1,1)), 5, total_error)
+!!$  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(4,1,1)),10, total_error)
+!!$  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(5,1,1)), 6, total_error)
+!!$  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(6,1,1)), 1, total_error)
+!!$  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(7,1,1)),10, total_error)
+!!$  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(8,1,1)),10, total_error)
+
+  ! Otherwise make sure the "area" of the block is correct
+  area = (ABS(INT(blocks(1,1,1)-blocks(3,1,1)))+1)*(ABS(INT(blocks(2,1,1)-blocks(4,1,1)))+1)
+  area = area + (ABS(INT(blocks(5,1,1)-blocks(7,1,1)))+1)*(ABS(INT(blocks(6,1,1)-blocks(8,1,1)))+1)
+  CALL verify("h5sget_select_hyper_blocklist_f", area, 80, total_error)
+
+
+  !  Close temporary dataspace 
+  CALL h5sclose_f(space1, error)
+  CALL check("h5sclose_f", error, total_error)
+  !  Copy "all" selection & space 
+  CALL H5Scopy_f(all_id, space1, error)  
+  CALL check("h5scopy_f", error, total_error)
+
+  !  'NOTA' "all" selection with another hyperslab 
+  start(1:2) = 0
+  stride(1:2) = 1
+  icount(1:2) = 1
+  iblock(1:2) = (/5,4/) !5
+
+  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_NOTA_F, start, &
+       icount, error, stride, iblock) 
+  CALL check("h5sselect_hyperslab_f", error, total_error)
+
+  ! Verify that the new selection is the "none" selection 
+  CALL H5Sget_select_type_f(space1, sel_type, error)
+  CALL check("H5Sget_select_type_f", error, total_error)
+  CALL verify("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_NONE_F), total_error)
+
+  !  Close temporary dataspace 
+  CALL h5sclose_f(space1, error)
+  CALL check("h5sclose_f", error, total_error)
+
+  !  Copy "none" selection & space 
+  CALL H5Scopy_f(none_id, space1, error)  
+  CALL check("h5scopy_f", error, total_error)
+
+  !  'OR' "none" selection with another hyperslab 
+  start(1:2) = 0
+  stride(1:2) = 1
+  icount(1:2) = 1
+  iblock(1:2) = (/5,4/) !5
+
+  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_OR_F, start, &
+       icount, error, stride, iblock) 
+  CALL check("h5sselect_hyperslab_f", error, total_error)
+
+  !  Verify that the new selection is the same as the original hyperslab 
+  CALL H5Sget_select_type_f(space1, sel_type, error)
+  CALL check("H5Sget_select_type_f", error, total_error)
+  CALL verify("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_HYPERSLABS_F), total_error)
+  
+
+  !  Verify that there is only one block 
+  CALL h5sget_select_hyper_nblocks_f(space1, nblocks, error)
+  CALL check("h5sget_select_hyper_nblocks_f", error, total_error)
+  CALL verify("h5sget_select_hyper_nblocks_f", INT(nblocks), 1, total_error)
+
+  !  Retrieve the block defined 
+  blocks = -1 !  Reset block list 
+  CALL h5sget_select_hyper_blocklist_f(space1, INT(0, hsize_t), INT(nblocks,hsize_t), blocks, error)
+  CALL check("h5sget_select_hyper_blocklist_f", error, total_error)
+
+  !  Verify that the correct block is defined 
+  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(1,1,1)), 1, total_error)
+  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(2,1,1)), 1, total_error)
+  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(3,1,1)), 5, total_error)
+  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(4,1,1)), 4, total_error)
+
+  !  Close temporary dataspace 
+  CALL h5sclose_f(space1, error)
+  CALL check("h5sclose_f", error, total_error)
+
+  !  Copy "none" selection & space 
+  CALL H5Scopy_f(none_id, space1, error)  
+  CALL check("h5scopy_f", error, total_error)
+
+  !  'AND' "none" selection with another hyperslab 
+  start(1:2) = 0
+  stride(1:2) = 1
+  icount(1:2) = 1
+  iblock(1:2) = (/5,4/) !5
+
+  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_AND_F, start, &
+       icount, error, stride, iblock) 
+  CALL check("h5sselect_hyperslab_f", error, total_error)
+
+  !  Verify that the new selection is the "none" selection 
+  CALL H5Sget_select_type_f(space1, sel_type, error)
+  CALL check("H5Sget_select_type_f", error, total_error)
+  CALL verify("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_NONE_F), total_error)
+
+  !  Close temporary dataspace 
+  CALL h5sclose_f(space1, error)
+  CALL check("h5sclose_f", error, total_error)
+
+  !  Copy "none" selection & space 
+  CALL H5Scopy_f(none_id, space1, error)  
+  CALL check("h5scopy_f", error, total_error)
+
+  !  'XOR' "none" selection with another hyperslab 
+  start(1:2) = 0
+  stride(1:2) = 1
+  icount(1:2) = 1
+  iblock(1:2) = (/5,4/) !5
+
+  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_XOR_F, start, &
+       icount, error, stride, iblock) 
+  CALL check("h5sselect_hyperslab_f", error, total_error)
+
+  !  Verify that the new selection is the same as the original hyperslab 
+  CALL H5Sget_select_type_f(space1, sel_type, error)
+  CALL check("H5Sget_select_type_f", error, total_error)
+  CALL verify("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_HYPERSLABS_F), total_error)
+  
+
+  !  Verify that there is only one block 
+  CALL h5sget_select_hyper_nblocks_f(space1, nblocks, error)
+  CALL check("h5sget_select_hyper_nblocks_f", error, total_error)
+  CALL verify("h5sget_select_hyper_nblocks_f", INT(nblocks), 1, total_error)
+
+  !  Retrieve the block defined 
+  blocks = -1 !  Reset block list 
+  CALL h5sget_select_hyper_blocklist_f(space1, INT(0, hsize_t), INT(nblocks,hsize_t), blocks, error)
+  CALL check("h5sget_select_hyper_blocklist_f", error, total_error)
+  !  Verify that the correct block is defined 
+  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(1,1,1)), 1, total_error)
+  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(2,1,1)), 1, total_error)
+  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(3,1,1)), 5, total_error)
+  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(4,1,1)), 4, total_error)
+  
+  !  Close temporary dataspace 
+  CALL h5sclose_f(space1, error)
+  CALL check("h5sclose_f", error, total_error)
+
+  !  Copy "none" selection & space 
+  CALL H5Scopy_f(none_id, space1, error)  
+  CALL check("h5scopy_f", error, total_error)
+
+  !  'NOTB' "none" selection with another hyperslab 
+  start(1:2) = 0
+  stride(1:2) = 1
+  icount(1:2) = 1
+  iblock(1:2) = (/5,4/) !5
+
+  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_NOTB_F, start, &
+       icount, error, stride, iblock) 
+  CALL check("h5sselect_hyperslab_f", error, total_error)
+
+  !  Verify that the new selection is the "none" selection 
+  CALL H5Sget_select_type_f(space1, sel_type, error)
+  CALL check("H5Sget_select_type_f", error, total_error)
+  CALL verify("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_NONE_F), total_error)
+
+  !  Close temporary dataspace 
+  CALL h5sclose_f(space1, error)
+  CALL check("h5sclose_f", error, total_error)
+
+  !  Copy "none" selection & space 
+  CALL H5Scopy_f(none_id, space1, error)  
+  CALL check("h5scopy_f", error, total_error)
+
+  !  'NOTA' "none" selection with another hyperslab 
+  start(1:2) = 0
+  stride(1:2) = 1
+  icount(1:2) = 1
+  iblock(1:2) = (/5,4/) !5  
+  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_NOTA_F, start, &
+       icount, error, stride, iblock) 
+  CALL check("h5sselect_hyperslab_f", error, total_error)
+
+  !  Verify that the new selection is the same as the original hyperslab 
+  CALL H5Sget_select_type_f(space1, sel_type, error)
+  CALL check("H5Sget_select_type_f", error, total_error)
+  CALL verify("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_HYPERSLABS_F), total_error)
+    
+  !  Verify that there is ONLY one BLOCK 
+  CALL h5sget_select_hyper_nblocks_f(space1, nblocks, error)
+  CALL check("h5sget_select_hyper_nblocks_f", error, total_error)
+  CALL verify("h5sget_select_hyper_nblocks_f", INT(nblocks), 1, total_error)
+
+  !  Retrieve the block defined 
+
+  blocks = -1 !  Reset block list 
+  CALL h5sget_select_hyper_blocklist_f(space1, INT(0, hsize_t), INT(nblocks,hsize_t), blocks, error)
+  CALL check("h5sget_select_hyper_blocklist_f", error, total_error)
+
+
+  !  Verify that the correct block is defined 
+
+  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(1,1,1)), 1, total_error)
+  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(2,1,1)), 1, total_error)
+  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(3,1,1)), 5, total_error)
+  CALL verify("h5sget_select_hyper_blocklist_f", INT(blocks(4,1,1)), 4, total_error)
+  
+  !  Close temporary dataspace 
+  CALL h5sclose_f(space1, error)
+  CALL check("h5sclose_f", error, total_error)
+
+  !  Close dataspaces 
+  
+  CALL h5sclose_f(base_id, error)
+  CALL check("h5sclose_f", error, total_error)
+  CALL h5sclose_f(all_id, error)
+  CALL check("h5sclose_f", error, total_error)
+  CALL h5sclose_f(none_id, error)
+  CALL check("h5sclose_f", error, total_error)
+
+END SUBROUTINE test_select_combine
+
+!***************************************************************
+!**
+!**  test_select_bounds(): Tests selection bounds on dataspaces,
+!**      both with and without offsets.
+!**
+!***************************************************************
+
+SUBROUTINE test_select_bounds(total_error)
+  
+  IMPLICIT NONE
+  INTEGER, INTENT(INOUT) :: total_error
+
+  INTEGER, PARAMETER :: SPACE11_RANK=2
+  INTEGER, PARAMETER :: SPACE11_DIM1=100
+  INTEGER, PARAMETER :: SPACE11_DIM2=50
+  INTEGER, PARAMETER :: SPACE11_NPOINTS=4
+  
+  INTEGER(hid_t) :: sid !  Dataspace ID 
+  INTEGER(hsize_t), DIMENSION(1:SPACE11_RANK) :: dims = (/SPACE11_DIM1, SPACE11_DIM2/) !Dataspace dimensions
+  INTEGER(hsize_t), DIMENSION(SPACE11_RANK, SPACE11_NPOINTS) :: coord ! Coordinates for point selection
+  INTEGER(hsize_t), DIMENSION(SPACE11_RANK) :: start !  The start of the hyperslab 
+  INTEGER(hsize_t), DIMENSION(SPACE11_RANK) :: stride ! The stride between block starts for the hyperslab 
+  INTEGER(hsize_t), DIMENSION(SPACE11_RANK) :: count ! The number of blocks for the hyperslab 
+  INTEGER(hsize_t), DIMENSION(SPACE11_RANK) :: BLOCK ! The size of each block for the hyperslab 
+  INTEGER(hssize_t), DIMENSION(SPACE11_RANK) :: offset ! Offset amount for selection 
+  INTEGER(hsize_t), DIMENSION(SPACE11_RANK) :: low_bounds ! The low bounds for the selection 
+  INTEGER(hsize_t), DIMENSION(SPACE11_RANK) :: high_bounds ! The high bounds for the selection 
+    
+  INTEGER :: error
+
+  ! Create dataspace 
+  CALL h5screate_simple_f(SPACE11_RANK, dims, sid, error)
+  CALL check("h5screate_simple_f", error, total_error)
+
+  !  Get bounds for 'all' selection 
+  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
+  CALL check("h5sget_select_bounds_f", error, total_error)
+
+  CALL verify("h5sget_select_bounds_f", low_bounds(1), 1_hsize_t, total_error)
+  CALL verify("h5sget_select_bounds_f", low_bounds(2), 1_hsize_t, total_error)
+  CALL verify("h5sget_select_bounds_f", high_bounds(1), INT(SPACE11_DIM1, hsize_t), total_error)
+  CALL verify("h5sget_select_bounds_f", high_bounds(2), INT(SPACE11_DIM2, hsize_t), total_error)
+
+  ! Set offset for selection 
+  offset(1:2) = 1
+  CALL H5Soffset_simple_f(sid, offset, error)
+  CALL check("H5Soffset_simple_f", error, total_error)
+
+  ! Get bounds for 'all' selection with offset (which should be ignored) 
+  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
+  CALL check("h5sget_select_bounds_f", error, total_error)
+
+  CALL verify("h5sget_select_bounds_f", low_bounds(1), 1_hsize_t, total_error)
+  CALL verify("h5sget_select_bounds_f", low_bounds(2), 1_hsize_t, total_error)
+  CALL VERIFY("h5sget_select_bounds_f", high_bounds(1), INT(SPACE11_DIM1, hsize_t), total_error)
+  CALL verify("h5sget_select_bounds_f", high_bounds(2), INT(SPACE11_DIM2, hsize_t), total_error)
+
+  ! Reset offset for selection 
+  offset(1:2) = 0
+  CALL H5Soffset_simple_f(sid, offset, error)
+  CALL check("H5Soffset_simple_f", error, total_error)
+
+  ! Set 'none' selection 
+  CALL H5Sselect_none_f(sid, error)
+  CALL check("H5Sselect_none_f", error, total_error)
+
+  ! Get bounds for 'none' selection, should fail 
+  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
+  CALL verify("h5sget_select_bounds_f", error, -1, total_error)
+
+  ! Set point selection 
+  
+  coord(1,1)=  3; coord(2,1)=  3;
+  coord(1,2)=  3; coord(2,2)= 46;
+  coord(1,3)= 96; coord(2,3)=  3;
+  coord(1,4)= 96; coord(2,4)= 46;
+
+  CALL h5sselect_elements_f(sid, H5S_SELECT_SET_F, SPACE11_RANK, INT(SPACE11_NPOINTS,size_t), coord, error)
+  CALL check("h5sselect_elements_f", error, total_error)
+
+  ! Get bounds for point selection 
+  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
+  CALL check("h5sget_select_bounds_f", error, total_error)
+
+  CALL verify("h5sget_select_bounds_f", low_bounds(1), 3_hsize_t, total_error)
+  CALL verify("h5sget_select_bounds_f", low_bounds(2), 3_hsize_t, total_error)
+  CALL VERIFY("h5sget_select_bounds_f", high_bounds(1), INT(SPACE11_DIM1-4,hsize_t), total_error)
+  CALL verify("h5sget_select_bounds_f", high_bounds(2), INT(SPACE11_DIM2-4,hsize_t), total_error)
+
+  !  Set bad offset for selection 
+
+  offset(1:2) = (/5,-5/)
+  CALL H5Soffset_simple_f(sid, offset, error)
+  CALL check("H5Soffset_simple_f", error, total_error)
+
+  !  Get bounds for hyperslab selection with negative offset 
+  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
+  CALL verify("h5sget_select_bounds_f", error, -1, total_error)
+ 
+  !  Set valid offset for selection 
+  offset(1:2) = (/2,-2/)
+  CALL H5Soffset_simple_f(sid, offset, error)
+  CALL check("H5Soffset_simple_f", error, total_error)
+
+  !  Get bounds for point selection with offset 
+  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
+  CALL check("h5sget_select_bounds_f", error, total_error)
+
+  CALL verify("h5sget_select_bounds_f", low_bounds(1), 5_hsize_t, total_error)
+  CALL verify("h5sget_select_bounds_f", low_bounds(2), 1_hsize_t, total_error)
+  CALL verify("h5sget_select_bounds_f", high_bounds(1), INT(SPACE11_DIM1-2,hsize_t), total_error)
+  CALL verify("h5sget_select_bounds_f", high_bounds(2), INT(SPACE11_DIM2-6,hsize_t), total_error)
+
+  !  Reset offset for selection 
+  offset(1:2) = 0
+  CALL H5Soffset_simple_f(sid, offset, error)
+  CALL check("H5Soffset_simple_f", error, total_error)
+
+  !  Set "regular" hyperslab selection 
+  start(1:2) = 2
+  stride(1:2) = 10
+  count(1:2) = 4
+  block(1:2) = 5
+  
+  CALL h5sselect_hyperslab_f(sid, H5S_SELECT_SET_F, start, &
+       count, error, stride, block) 
+  CALL check("h5sselect_hyperslab_f", error, total_error)
+
+  ! Get bounds for hyperslab selection 
+  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
+  CALL check("h5sget_select_bounds_f", error, total_error)
+
+  CALL verify("h5sget_select_bounds_f", low_bounds(1), 3_hsize_t, total_error)
+  CALL verify("h5sget_select_bounds_f", low_bounds(2), 3_hsize_t, total_error)
+  CALL verify("h5sget_select_bounds_f", high_bounds(1), 37_hsize_t, total_error)
+  CALL verify("h5sget_select_bounds_f", high_bounds(2), 37_hsize_t, total_error)
+
+  ! Set bad offset for selection 
+  offset(1:2) = (/5,-5/)
+  CALL H5Soffset_simple_f(sid, offset, error)
+  CALL check("H5Soffset_simple_f", error, total_error)
+
+  !  Get bounds for hyperslab selection with negative offset 
+  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
+  CALL verify("h5sget_select_bounds_f", error, -1, total_error)
+
+  !  Set valid offset for selection 
+  offset(1:2) = (/5,-2/)
+  CALL H5Soffset_simple_f(sid, offset, error)
+  CALL check("H5Soffset_simple_f", error, total_error)
+
+  ! Get bounds for hyperslab selection with offset 
+  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
+  CALL check("h5sget_select_bounds_f", error, total_error)
+
+  CALL verify("h5sget_select_bounds_f", low_bounds(1), 8_hsize_t, total_error)
+  CALL verify("h5sget_select_bounds_f", low_bounds(2), 1_hsize_t, total_error)
+  CALL verify("h5sget_select_bounds_f", high_bounds(1), 42_hsize_t, total_error)
+  CALL verify("h5sget_select_bounds_f", high_bounds(2), 35_hsize_t, total_error)
+
+  ! Reset offset for selection 
+  offset(1:2) = 0
+  CALL H5Soffset_simple_f(sid, offset, error)
+  CALL check("H5Soffset_simple_f", error, total_error)
+  
+  !  Make "irregular" hyperslab selection 
+  start(1:2) = 20
+  stride(1:2) = 20
+  count(1:2) = 2
+  block(1:2) = 10
+
+  CALL h5sselect_hyperslab_f(sid, H5S_SELECT_OR_F, start, &
+       count, error, stride, block) 
+  CALL check("h5sselect_hyperslab_f", error, total_error)
+
+  ! Get bounds for hyperslab selection 
+  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
+  CALL check("h5sget_select_bounds_f", error, total_error)
+
+  CALL verify("h5sget_select_bounds_f", low_bounds(1), 3_hsize_t, total_error)
+  CALL verify("h5sget_select_bounds_f", low_bounds(2), 3_hsize_t, total_error)
+  CALL verify("h5sget_select_bounds_f", high_bounds(1), 50_hsize_t, total_error)
+  CALL verify("h5sget_select_bounds_f", high_bounds(2), 50_hsize_t, total_error)
+
+  !  Set bad offset for selection 
+  offset(1:2) = (/5,-5/)
+  CALL H5Soffset_simple_f(sid, offset, error)
+  CALL check("H5Soffset_simple_f", error, total_error)
+
+  !  Get bounds for hyperslab selection with negative offset 
+  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
+  CALL verify("h5sget_select_bounds_f", error, -1, total_error)
+
+  ! Set valid offset for selection 
+  offset(1:2) = (/5,-2/)
+  CALL H5Soffset_simple_f(sid, offset, error)
+  CALL check("H5Soffset_simple_f", error, total_error)
+
+  ! Get bounds for hyperslab selection with offset 
+  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
+  CALL check("h5sget_select_bounds_f", error, total_error)
+
+  CALL verify("h5sget_select_bounds_f", low_bounds(1), 8_hsize_t, total_error)
+  CALL verify("h5sget_select_bounds_f", low_bounds(2), 1_hsize_t, total_error)
+  CALL verify("h5sget_select_bounds_f", high_bounds(1), 55_hsize_t, total_error)
+  CALL verify("h5sget_select_bounds_f", high_bounds(2), 48_hsize_t, total_error)
+
+  ! Reset offset for selection 
+  offset(1:2) = 0
+  CALL H5Soffset_simple_f(sid, offset, error)
+  CALL check("H5Soffset_simple_f", error, total_error)
+
+  ! Close the dataspace 
+  CALL h5sclose_f(sid, error)
+  CALL check("h5sclose_f", error, total_error)
+
+END SUBROUTINE test_select_bounds
+
+END MODULE TH5SSELECT
diff --git a/fortran/test/tH5Sselect.f90 b/fortran/test/tH5Sselect.f90
deleted file mode 100644
index 7d07308..0000000
--- a/fortran/test/tH5Sselect.f90
+++ /dev/null
@@ -1,2000 +0,0 @@
-!****h* root/fortran/test/tH5Sselect.f90
-!
-! NAME
-!  tH5Sselect.f90
-!
-! FUNCTION
-!  Basic testing of Fortran H5S, Selection-related Dataspace Interface, APIs.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! NOTES
-!  Tests the following functionalities:
-!    h5sget_select_npoints_f, h5sselect_elements_f, h5sselect_all_f,
-!    h5sselect_none_f, h5sselect_valid_f, h5sselect_hyperslab_f,
-!    h5sget_select_bounds_f, h5sget_select_elem_pointlist_f,
-!    h5sget_select_elem_npoints_f, h5sget_select_hyper_blocklist_f,
-!    h5sget_select_hyper_nblocks_f, h5sget_select_npoints_f   
-!
-! CONTAINS SUBROUTINES
-!  test_select_hyperslab, test_select_element, test_basic_select,
-!  test_select_point, test_select_combine, test_select_bounds
-!  
-!
-!*****
-MODULE TH5SSELECT
-
-CONTAINS
-
-  SUBROUTINE test_select_hyperslab(cleanup, total_error)
-
-    USE HDF5 ! This module contains all necessary modules
-    USE TH5_MISC
-
-    IMPLICIT NONE
-    LOGICAL, INTENT(IN) :: cleanup
-    INTEGER, INTENT(INOUT) :: total_error
-
-    CHARACTER(LEN=7), PARAMETER :: filename = "tselect"
-    CHARACTER(LEN=80) :: fix_filename
-
-    !
-    !dataset name is "IntArray"
-    !
-    CHARACTER(LEN=8), PARAMETER :: dsetname = "IntArray"
-
-    INTEGER(HID_T) :: file_id       ! File identifier
-    INTEGER(HID_T) :: dset_id       ! Dataset identifier
-    INTEGER(HID_T) :: dataspace     ! Dataspace identifier
-    INTEGER(HID_T) :: memspace      ! memspace identifier
-
-    !
-    !Memory space dimensions
-    !
-    INTEGER(HSIZE_T), DIMENSION(3) :: dimsm = (/7,7,3/)
-
-
-    !
-    !Dataset dimensions
-    !
-    INTEGER(HSIZE_T), DIMENSION(2) :: dimsf = (/5,6/)
-
-    !
-    !Size of the hyperslab in the file
-    !
-    INTEGER(HSIZE_T), DIMENSION(2) :: count = (/3,4/)
-
-    !
-    !hyperslab offset in the file
-    !
-    INTEGER(HSIZE_T), DIMENSION(2) :: offset = (/1,2/)
-
-    !
-    !Size of the hyperslab in memory
-    !
-    INTEGER(HSIZE_T), DIMENSION(3) :: count_out = (/3,4,1/)
-
-    !
-    !hyperslab offset in memory
-    !
-    INTEGER(HSIZE_T), DIMENSION(3) :: offset_out = (/3,0,0/)
-
-    !
-    !data to write
-    !
-    INTEGER, DIMENSION(5,6) :: data
-
-    !
-    !output buffer
-    !
-    INTEGER, DIMENSION(7,7,3) :: data_out
-
-
-    !
-    !dataset space rank
-    !
-    INTEGER :: dsetrank = 2
-
-    !
-    !memspace rank
-    !
-    INTEGER :: memrank = 3
-
-
-
-
-    !
-    !general purpose integer
-    !
-    INTEGER :: i, j
-
-    !
-    !flag to check operation success
-    !
-    INTEGER :: error
-    INTEGER(HSIZE_T), DIMENSION(3) :: data_dims
-
-
-    !
-    !This writes data to the HDF5 file.
-    !
-
-    !
-    !data initialization
-    !
-    do i = 1, 5
-       do j = 1, 6
-          data(i,j) = (i-1) + (j-1);
-       end do
-    end do
-    !
-    ! 0,  1,  2,  3,  4,  5
-    ! 1,  2,  3,  4,  5,  6
-    ! 2,  3,  4,  5,  6,  7
-    ! 3,  4,  5,  6,  7,  8
-    ! 4,  5,  6,  7,  8,  9
-    !
-
-    !
-    !Initialize FORTRAN predifined datatypes
-    !
-!    CALL h5init_types_f(error)
-!    CALL check("h5init_types_f", error, total_error)
-
-    !
-    !Create a new file using default properties.
-    !
-          CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
-          if (error .ne. 0) then
-              write(*,*) "Cannot modify filename"
-              stop
-          endif
-    CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
-    CALL check("h5fcreate_f", error, total_error)
-
-    !
-    !Create the data space for the  dataset.
-    !
-    CALL h5screate_simple_f(dsetrank, dimsf, dataspace, error)
-    CALL check("h5screate_simple_f", error, total_error)
-
-    !
-    ! Create the dataset with default properties
-    !
-    CALL h5dcreate_f(file_id, dsetname, H5T_STD_I32BE, dataspace, &
-         dset_id, error)
-    CALL check("h5dcreate_f", error, total_error)
-
-    !
-    ! Write the dataset
-    !
-    data_dims(1) = 5
-    data_dims(2) = 6
-    CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, data, data_dims, error)
-    CALL check("h5dwrite_f", error, total_error)
-
-    !
-    !Close the dataspace for the dataset.
-    !
-    CALL h5sclose_f(dataspace, error)
-    CALL check("h5sclose_f", error, total_error)
-
-    !
-    !Close the dataset.
-    !
-    CALL h5dclose_f(dset_id, error)
-    CALL check("h5dclose_f", error, total_error)
-
-    !
-    !Close the file.
-    !
-    CALL h5fclose_f(file_id, error)
-    CALL check("h5fclose_f", error, total_error)
-
-    !
-    !This reads the hyperslab from the sds.h5 file just
-    !created, into a 2-dimensional plane of the 3-dimensional array.
-    !
-
-    !
-    !initialize data_out array
-    !
-    !     do i = 1, 7
-    !          do j = 1, 7
-    !              do k = 1,3
-    !                  data_out(i,j,k) = 0;
-    !              end do
-    !          end do
-    !     end do
-
-    !
-    !Open the file.
-    !
-    CALL h5fopen_f (fix_filename, H5F_ACC_RDONLY_F, file_id, error)
-    CALL check("h5fopen_f", error, total_error)
-
-    !
-    !Open the  dataset.
-    !
-    CALL h5dopen_f(file_id, dsetname, dset_id, error)
-    CALL check("h5dopen_f", error, total_error)
-
-    !
-    !Get dataset's dataspace handle.
-    !
-    CALL h5dget_space_f(dset_id, dataspace, error)
-    CALL check("h5dget_space_f", error, total_error)
-
-    !
-    !Select hyperslab in the dataset.
-    !
-    CALL h5sselect_hyperslab_f(dataspace, H5S_SELECT_SET_F, &
-         offset, count, error)
-    CALL check("h5sselect_hyperslab_f", error, total_error)
-    !
-    !create memory dataspace.
-    !
-    CALL h5screate_simple_f(memrank, dimsm, memspace, error)
-    CALL check("h5screate_simple_f", error, total_error)
-
-    !
-    !Select hyperslab in memory.
-    !
-    CALL h5sselect_hyperslab_f(memspace, H5S_SELECT_SET_F, &
-         offset_out, count_out, error)
-    CALL check("h5sselect_hyperslab_f", error, total_error)
-
-    !
-    !Read data from hyperslab in the file into the hyperslab in
-    !memory and display.
-    !
-    data_dims(1) = 7
-    data_dims(2) = 7
-    data_dims(3) = 3
-    CALL h5dread_f(dset_id, H5T_NATIVE_INTEGER, data_out, data_dims, error, &
-         memspace, dataspace)
-    CALL check("h5dread_f", error, total_error)
-
-    !
-    !Display data_out array
-    !
-    !do i = 1, 7
-    !   print *, (data_out(i,j,1), j = 1,7)
-    !end do
-
-    ! 0 0 0 0 0 0 0
-    ! 0 0 0 0 0 0 0
-    ! 0 0 0 0 0 0 0
-    ! 3 4 5 6 0 0 0
-    ! 4 5 6 7 0 0 0
-    ! 5 6 7 8 0 0 0
-    ! 0 0 0 0 0 0 0
-    !
-
-    !
-    !Close the dataspace for the dataset.
-    !
-    CALL h5sclose_f(dataspace, error)
-    CALL check("h5sclose_f", error, total_error)
-
-    !
-    !Close the memoryspace.
-    !
-    CALL h5sclose_f(memspace, error)
-    CALL check("h5sclose_f", error, total_error)
-
-    !
-    !Close the dataset.
-    !
-    CALL h5dclose_f(dset_id, error)
-    CALL check("h5dclose_f", error, total_error)
-
-    !
-    !Close the file.
-    !
-    CALL h5fclose_f(file_id, error)
-    CALL check("h5fclose_f", error, total_error)
-
-
-          if(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-              CALL check("h5_cleanup_f", error, total_error)
-    RETURN
-
-  END SUBROUTINE test_select_hyperslab
-
-  !
-  !Subroutine to test element selection
-  !
-
-  SUBROUTINE test_select_element(cleanup, total_error)
-
-    USE HDF5 ! This module contains all necessary modules
-    USE TH5_MISC
-
-    IMPLICIT NONE
-    LOGICAL, INTENT(IN)  :: cleanup
-    INTEGER, INTENT(INOUT) :: total_error
-
-    !
-    !the dataset1 is stored in file "copy1.h5"
-    !
-    CHARACTER(LEN=13), PARAMETER :: filename1 = "tselect_copy1"
-    CHARACTER(LEN=80) :: fix_filename1
-
-    !
-    !the dataset2 is stored in file "copy2.h5"
-    !
-    CHARACTER(LEN=13), PARAMETER :: filename2 = "tselect_copy2"
-    CHARACTER(LEN=80) :: fix_filename2
-    !
-    !dataset1 name is "Copy1"
-    !
-    CHARACTER(LEN=8), PARAMETER :: dsetname1 = "Copy1"
-
-    !
-    !dataset2 name is "Copy2"
-    !
-    CHARACTER(LEN=8), PARAMETER :: dsetname2 = "Copy2"
-
-    !
-    !dataset rank
-    !
-    INTEGER, PARAMETER :: RANK = 2
-
-    !
-    !number of points selected
-    !
-    INTEGER(SIZE_T), PARAMETER :: NUMP = 2
-
-    INTEGER(HID_T) :: file1_id       ! File1 identifier
-    INTEGER(HID_T) :: file2_id       ! File2 identifier
-    INTEGER(HID_T) :: dset1_id       ! Dataset1 identifier
-    INTEGER(HID_T) :: dset2_id       ! Dataset2 identifier
-    INTEGER(HID_T) :: dataspace1     ! Dataspace identifier
-    INTEGER(HID_T) :: dataspace2     ! Dataspace identifier
-    INTEGER(HID_T) :: memspace       ! memspace identifier
-
-    !
-    !Memory space dimensions
-    !
-    INTEGER(HSIZE_T), DIMENSION(1) :: dimsm = (/2/)
-
-    !
-    !Dataset dimensions
-    !
-    INTEGER(HSIZE_T), DIMENSION(2) :: dimsf = (/3,4/)
-
-    !
-    !Points positions in the file
-    !
-    INTEGER(HSIZE_T), DIMENSION(RANK,NUMP) :: coord
-
-    !
-    !data buffers
-    !
-    INTEGER, DIMENSION(3,4) :: buf1, buf2, bufnew
-
-    !
-    !value to write
-    !
-    INTEGER, DIMENSION(2) :: val = (/53, 59/)
-
-    !
-    !memory rank
-    !
-    INTEGER :: memrank = 1
-
-    !
-    !general purpose integer
-    !
-    INTEGER :: i, j
-
-    !
-    !flag to check operation success
-    !
-    INTEGER :: error
-    INTEGER(HSIZE_T), DIMENSION(3) :: data_dims
-
-
-    !
-    !Create two files containing identical datasets. Write 0's to one
-    !and 1's to the other.
-    !
-
-    !
-    !data initialization
-    !
-    do i = 1, 3
-       do j = 1, 4
-          buf1(i,j) = 0;
-       end do
-    end do
-
-    do i = 1, 3
-       do j = 1, 4
-          buf2(i,j) = 1;
-       end do
-    end do
-
-    !
-    !Initialize FORTRAN predifined datatypes
-    !
-!    CALL h5init_types_f(error)
-!    CALL check("h5init_types_f", error, total_error)
-
-    !
-    !Create file1, file2  using default properties.
-    !
-          CALL h5_fixname_f(filename1, fix_filename1, H5P_DEFAULT_F, error)
-          if (error .ne. 0) then
-              write(*,*) "Cannot modify filename"
-              stop
-          endif
-    CALL h5fcreate_f(fix_filename1, H5F_ACC_TRUNC_F, file1_id, error)
-    CALL check("h5fcreate_f", error, total_error)
-
-          CALL h5_fixname_f(filename2, fix_filename2, H5P_DEFAULT_F, error)
-          if (error .ne. 0) then
-              write(*,*) "Cannot modify filename"
-              stop
-          endif
-    CALL h5fcreate_f(fix_filename2, H5F_ACC_TRUNC_F, file2_id, error)
-    CALL check("h5fcreate_f", error, total_error)
-
-    !
-    !Create the data space for the  datasets.
-    !
-    CALL h5screate_simple_f(RANK, dimsf, dataspace1, error)
-    CALL check("h5screate_simple_f", error, total_error)
-
-    CALL h5screate_simple_f(RANK, dimsf, dataspace2, error)
-    CALL check("h5screate_simple_f", error, total_error)
-
-    !
-    ! Create the datasets with default properties
-    !
-    CALL h5dcreate_f(file1_id, dsetname1, H5T_NATIVE_INTEGER, dataspace1, &
-         dset1_id, error)
-    CALL check("h5dcreate_f", error, total_error)
-
-    CALL h5dcreate_f(file2_id, dsetname2, H5T_NATIVE_INTEGER, dataspace2, &
-         dset2_id, error)
-    CALL check("h5dcreate_f", error, total_error)
-
-    !
-    ! Write the datasets
-    !
-    data_dims(1) = 3
-    data_dims(2) = 4
-    CALL h5dwrite_f(dset1_id, H5T_NATIVE_INTEGER, buf1, data_dims, error)
-    CALL check("h5dwrite_f", error, total_error)
-
-    CALL h5dwrite_f(dset2_id, H5T_NATIVE_INTEGER, buf2, data_dims, error)
-    CALL check("h5dwrite_f", error, total_error)
-
-    !
-    !Close the dataspace for the datasets.
-    !
-    CALL h5sclose_f(dataspace1, error)
-    CALL check("h5sclose_f", error, total_error)
-
-    CALL h5sclose_f(dataspace2, error)
-    CALL check("h5sclose_f", error, total_error)
-
-    !
-    !Close the datasets.
-    !
-    CALL h5dclose_f(dset1_id, error)
-    CALL check("h5dclose_f", error, total_error)
-
-    CALL h5dclose_f(dset2_id, error)
-    CALL check("h5dclose_f", error, total_error)
-
-    !
-    !Close the files.
-    !
-    CALL h5fclose_f(file1_id, error)
-    CALL check("h5fclose_f", error, total_error)
-
-    CALL h5fclose_f(file2_id, error)
-    CALL check("h5fclose_f", error, total_error)
-
-    !
-    !Open the two files.  Select two points in one file, write values to
-    !those point locations, then do H5Scopy and write the values to the
-    !other file.  Close files.
-    !
-
-    !
-    !Open the files.
-    !
-    CALL h5fopen_f (fix_filename1, H5F_ACC_RDWR_F, file1_id, error)
-    CALL check("h5fopen_f", error, total_error)
-
-    CALL h5fopen_f (fix_filename2, H5F_ACC_RDWR_F, file2_id, error)
-    CALL check("h5fopen_f", error, total_error)
-
-    !
-    !Open the  datasets.
-    !
-    CALL h5dopen_f(file1_id, dsetname1, dset1_id, error)
-    CALL check("h5dopen_f", error, total_error)
-
-    CALL h5dopen_f(file2_id, dsetname2, dset2_id, error)
-    CALL check("h5dopen_f", error, total_error)
-
-    !
-    !Get dataset1's dataspace handle.
-    !
-    CALL h5dget_space_f(dset1_id, dataspace1, error)
-    CALL check("h5dget_space_f", error, total_error)
-
-    !
-    !create memory dataspace.
-    !
-    CALL h5screate_simple_f(memrank, dimsm, memspace, error)
-    CALL check("h5screate_simple_f", error, total_error)
-
-    !
-    !Set the selected point positions.Because Fortran array index starts
-    ! from 1, so add one to the actual select points in C
-    !
-    coord(1,1) = 1
-    coord(2,1) = 2
-    coord(1,2) = 1
-    coord(2,2) = 4
-
-    !
-    !Select the elements in file space
-    !
-    CALL h5sselect_elements_f(dataspace1, H5S_SELECT_SET_F, RANK, NUMP,&
-         coord, error)
-    CALL check("h5sselect_elements_f", error, total_error)
-
-    !
-    !Write value into the selected points in dataset1
-    !
-    data_dims(1) = 2
-    CALL H5dwrite_f(dset1_id, H5T_NATIVE_INTEGER, val, data_dims, error, &
-         mem_space_id=memspace, file_space_id=dataspace1)
-    CALL check("h5dwrite_f", error, total_error)
-
-    !
-    !Copy the daspace1 into dataspace2
-    !
-    CALL h5scopy_f(dataspace1, dataspace2, error)
-    CALL check("h5scopy_f", error, total_error)
-
-    !
-    !Write value into the selected points in dataset2
-    !
-    CALL H5dwrite_f(dset2_id, H5T_NATIVE_INTEGER, val, data_dims, error, &
-         mem_space_id=memspace, file_space_id=dataspace2)
-    CALL check("h5dwrite_f", error, total_error)
-
-    !
-    !Close the dataspace for the datasets.
-    !
-    CALL h5sclose_f(dataspace1, error)
-    CALL check("h5sclose_f", error, total_error)
-
-    CALL h5sclose_f(dataspace2, error)
-    CALL check("h5sclose_f", error, total_error)
-
-    !
-    !Close the memoryspace.
-    !
-    CALL h5sclose_f(memspace, error)
-    CALL check("h5sclose_f", error, total_error)
-
-    !
-    !Close the datasets.
-    !
-    CALL h5dclose_f(dset1_id, error)
-    CALL check("h5dclose_f", error, total_error)
-
-    CALL h5dclose_f(dset2_id, error)
-    CALL check("h5dclose_f", error, total_error)
-
-    !
-    !Close the files.
-    !
-    CALL h5fclose_f(file1_id, error)
-    CALL check("h5fclose_f", error, total_error)
-
-    CALL h5fclose_f(file2_id, error)
-    CALL check("h5fclose_f", error, total_error)
-
-    !
-    !Open both files and print the contents of the datasets.
-    !
-
-    !
-    !Open the files.
-    !
-    CALL h5fopen_f (fix_filename1, H5F_ACC_RDWR_F, file1_id, error)
-    CALL check("h5fopen_f", error, total_error)
-
-    CALL h5fopen_f (fix_filename2, H5F_ACC_RDWR_F, file2_id, error)
-    CALL check("h5fopen_f", error, total_error)
-
-    !
-    !Open the  datasets.
-    !
-    CALL h5dopen_f(file1_id, dsetname1, dset1_id, error)
-    CALL check("h5dopen_f", error, total_error)
-
-    CALL h5dopen_f(file2_id, dsetname2, dset2_id, error)
-    CALL check("h5dopen_f", error, total_error)
-
-    !
-    !Read dataset1.
-    !
-    data_dims(1) = 3
-    data_dims(2) = 4
-    CALL h5dread_f(dset1_id, H5T_NATIVE_INTEGER, bufnew, data_dims, error)
-    CALL check("h5dread_f", error, total_error)
-
-    !
-    !Display the data read from dataset "Copy1"
-    !
-    !write(*,*) "The data in dataset Copy1 is: "
-    !do i = 1, 3
-    !   print *, (bufnew(i,j), j = 1,4)
-    !end do
-
-    !
-    !Read dataset2.
-    !
-    CALL h5dread_f(dset2_id, H5T_NATIVE_INTEGER, bufnew, data_dims, error)
-    CALL check("h5dread_f", error, total_error)
-
-    !
-    !Display the data read from dataset "Copy2"
-    !
-    !write(*,*) "The data in dataset Copy2 is: "
-    !do i = 1, 3
-    !   print *, (bufnew(i,j), j = 1,4)
-    !end do
-
-    !
-    !Close the datasets.
-    !
-    CALL h5dclose_f(dset1_id, error)
-    CALL check("h5dclose_f", error, total_error)
-
-    CALL h5dclose_f(dset2_id, error)
-    CALL check("h5dclose_f", error, total_error)
-
-    !
-    !Close the files.
-    !
-    CALL h5fclose_f(file1_id, error)
-    CALL check("h5fclose_f", error, total_error)
-
-    CALL h5fclose_f(file2_id, error)
-    CALL check("h5fclose_f", error, total_error)
-
-
-          if(cleanup) CALL h5_cleanup_f(filename1, H5P_DEFAULT_F, error)
-              CALL check("h5_cleanup_f", error, total_error)
-          if(cleanup) CALL h5_cleanup_f(filename2, H5P_DEFAULT_F, error)
-              CALL check("h5_cleanup_f", error, total_error)
-     RETURN
-  END SUBROUTINE  test_select_element
-
-
-  SUBROUTINE test_basic_select(cleanup, total_error)
-    USE HDF5 ! This module contains all necessary modules
-    USE TH5_MISC
-
-    IMPLICIT NONE
-    LOGICAL, INTENT(IN)  :: cleanup
-    INTEGER, INTENT(INOUT) :: total_error
-
-     !
-     !the dataset is stored in file "testselect.h5"
-     !
-     CHARACTER(LEN=10), PARAMETER :: filename = "testselect"
-     CHARACTER(LEN=80) :: fix_filename
-
-     !
-     !dataspace rank
-     !
-     INTEGER, PARAMETER :: RANK = 2
-
-     !
-     !select NUMP_POINTS points from the file
-     !
-     INTEGER(SIZE_T), PARAMETER :: NUMPS = 10
-
-     !
-     !dataset name is "testselect"
-     !
-     CHARACTER(LEN=10), PARAMETER :: dsetname = "testselect"
-
-     INTEGER(HID_T) :: file_id       ! File identifier
-     INTEGER(HID_T) :: dset_id       ! Dataset identifier
-     INTEGER(HID_T) :: dataspace     ! Dataspace identifier
-
-     !
-     !Dataset dimensions
-     !
-     INTEGER(HSIZE_T), DIMENSION(2) :: dimsf = (/5,6/)
-
-     !
-     !Size of the hyperslab in the file
-     !
-     INTEGER(HSIZE_T), DIMENSION(2) :: count = (/2,2/)
-
-     !
-     !hyperslab offset in the file
-     !
-     INTEGER(HSIZE_T), DIMENSION(2) :: offset = (/0,0/)
-
-     !
-     !start block for getting the selected hyperslab
-     !
-     INTEGER(HSIZE_T) :: startblock = 0
-
-     !
-     !start point for getting the selected elements
-     !
-     INTEGER(HSIZE_T)  :: startpoint = 0
-
-     !
-     !Stride of the hyperslab in the file
-     !
-     INTEGER(HSIZE_T), DIMENSION(2) :: stride = (/3,3/)
-
-     !
-     !BLock size of the hyperslab in the file
-     !
-     INTEGER(HSIZE_T), DIMENSION(2) :: block = (/2,2/)
-
-     !
-     !array to give selected points' coordinations
-     !
-     INTEGER(HSIZE_T), DIMENSION(RANK, NUMPS) :: coord
-
-
-     !
-     !Number of hyperslabs selected in the current dataspace
-     !
-     INTEGER(HSSIZE_T) :: num_blocks
-
-     !
-     !allocatable array for putting a list of hyperslabs
-     !selected in the current file dataspace
-     !
-     INTEGER(HSIZE_T), ALLOCATABLE, DIMENSION(:) :: blocklist
-
-     !
-     !Number of points selected in the current dataspace
-     !
-     INTEGER(HSSIZE_T) :: num_points
-     INTEGER(HSIZE_T) :: num1_points
-
-     !
-     !allocatable array for putting a list of points
-     !selected in the current file dataspace
-     !
-     INTEGER(HSIZE_T), ALLOCATABLE, DIMENSION(:) :: pointlist
-
-     !
-     !start and end bounds in the current dataspace selection
-     !
-     INTEGER(HSIZE_T), DIMENSION(RANK) :: startout, endout
-
-     !
-     !data to write
-     !
-     INTEGER, DIMENSION(5,6) :: data
-
-     !
-     !flag to check operation success
-     !
-     INTEGER :: error
-     INTEGER(HSIZE_T), DIMENSION(3) :: data_dims
-
-     !
-     !initialize the coord array to give the selected points' position
-     !
-     coord(1,1) = 1
-     coord(2,1) = 1
-     coord(1,2) = 1
-     coord(2,2) = 3
-     coord(1,3) = 1
-     coord(2,3) = 5
-     coord(1,4) = 3
-     coord(2,4) = 1
-     coord(1,5) = 3
-     coord(2,5) = 3
-     coord(1,6) = 3
-     coord(2,6) = 5
-     coord(1,7) = 4
-     coord(2,7) = 3
-     coord(1,8) = 4
-     coord(2,8) = 1
-     coord(1,9) = 5
-     coord(2,9) = 3
-     coord(1,10) = 5
-     coord(2,10) = 5
-
-     !
-     !Create a new file using default properties.
-     !
-          CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
-          if (error .ne. 0) then
-              write(*,*) "Cannot modify filename"
-              stop
-          endif
-     CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
-     CALL check("h5fcreate_f", error, total_error)
-
-     !
-     !Create the data space for the  dataset.
-     !
-     CALL h5screate_simple_f(RANK, dimsf, dataspace, error)
-     CALL check("h5screate_simple_f", error, total_error)
-
-     !
-     ! Create the dataset with default properties
-     !
-     CALL h5dcreate_f(file_id, dsetname, H5T_STD_I32BE, dataspace, &
-                      dset_id, error)
-     CALL check("h5dcreate_f", error, total_error)
-
-     !
-     ! Write the dataset
-     !
-     data_dims(1) = 5
-     data_dims(2) = 6
-     CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, data, data_dims, error)
-     CALL check("h5dwrite_f", error, total_error)
-
-     !
-     !Close the dataspace for the dataset.
-     !
-     CALL h5sclose_f(dataspace, error)
-     CALL check("h5sclose_f", error, total_error)
-
-     !
-     !Close the dataset.
-     !
-     CALL h5dclose_f(dset_id, error)
-     CALL check("h5dclose_f", error, total_error)
-
-     !
-     !Close the file.
-     !
-     CALL h5fclose_f(file_id, error)
-     CALL check("h5fclose_f", error, total_error)
-
-     !
-     !Open the file.
-     !
-     CALL h5fopen_f (fix_filename, H5F_ACC_RDONLY_F, file_id, error)
-     CALL check("h5fopen_f", error, total_error)
-
-     !
-     !Open the  dataset.
-     !
-     CALL h5dopen_f(file_id, dsetname, dset_id, error)
-     CALL check("h5dopen_f", error, total_error)
-
-     !
-     !Get dataset's dataspace handle.
-     !
-     CALL h5dget_space_f(dset_id, dataspace, error)
-     CALL check("h5dget_space_f", error, total_error)
-
-     !
-     !Select hyperslab in the dataset.
-     !
-     CALL h5sselect_hyperslab_f(dataspace, H5S_SELECT_SET_F, &
-                                offset, count, error, stride, block)
-     CALL check("h5sselect_hyperslab_f", error, total_error)
-
-     !
-     !get the number of hyperslab blocks in the current dataspac selection
-     !
-     CALL h5sget_select_hyper_nblocks_f(dataspace, num_blocks, error)
-     CALL check("h5sget_select_hyper_nblocks_f", error, total_error)
-     IF (num_blocks .NE. 4) write (*,*) "error occured with num_blocks"
-     !write(*,*) num_blocks
-     !result of num_blocks is 4
-
-     !
-     !allocate the blocklist array
-     !
-     ALLOCATE(blocklist(num_blocks*RANK*2), STAT= error)
-     if(error .NE. 0) then
-         STOP
-     endif
-
-     !
-     !get the list of hyperslabs selected in the current dataspac selection
-     !
-     CALL h5sget_select_hyper_blocklist_f(dataspace, startblock, &
-                                          num_blocks, blocklist, error)
-     CALL check("h5sget_select_hyper_blocklist_f", error, total_error)
-!     write(*,*) (blocklist(i), i =1, num_blocks*RANK*2)
-     !result of blocklist selected is:
-     !1,  1,  2,  2,  4,  1,  5,  2,  1,  4,  2,  5,  4,  4,  5,  5
-
-     !
-     !deallocate the blocklist array
-     !
-     DEALLOCATE(blocklist)
-
-     !
-     !get the selection bounds in the current dataspac selection
-     !
-     CALL h5sget_select_bounds_f(dataspace, startout, endout, error)
-     CALL check("h5sget_select_bounds_f", error, total_error)
-     IF ( (startout(1) .ne. 1) .or. (startout(2) .ne. 1) ) THEN
-        write(*,*) "error occured to select_bounds's start position"
-     END IF
-
-     IF ( (endout(1) .ne. 5) .or. (endout(2) .ne. 5) ) THEN
-        write(*,*) "error occured to select_bounds's end position"
-     END IF
-     !write(*,*) (startout(i), i = 1, RANK)
-     !result of startout is 0, 0
-
-     !write(*,*) (endout(i), i = 1, RANK)
-     !result of endout is 5, 5
-
-     !
-     !allocate the pointlist array
-     !
-!     ALLOCATE(pointlist(num_blocks*RANK), STAT= error)
-     ALLOCATE(pointlist(20), STAT= error)
-     if(error .NE. 0) then
-         STOP
-     endif
-
-     !
-     !Select the elements in file space
-     !
-     CALL h5sselect_elements_f(dataspace, H5S_SELECT_SET_F, RANK, NUMPS,&
-                               coord, error)
-     CALL check("h5sselect_elements_f", error, total_error)
-
-     !
-     !Get the number of selected elements
-     !
-     CALL h5sget_select_elem_npoints_f(dataspace, num_points, error)
-     CALL check("h5sget_select_elem_npoints_f", error, total_error)
-     IF (num_points .NE. 10) write(*,*) "error occured with num_points"
-     !write(*,*) num_points
-     ! result of num_points is 10
-
-     !
-     !Get the list of selected elements
-     !
-     num1_points = num_points
-     CALL h5sget_select_elem_pointlist_f(dataspace, startpoint, &
-                                          num1_points, pointlist, error)
-     CALL check("h5sget_select_elem_pointlist_f", error, total_error)
-     !write(*,*) (pointlist(i), i =1, num1_points*RANK)
-     !result of pintlist is:
-     !1,  1,  3,  1,  5,  1,  1,  3,  3,  3,  5,  3,  3,
-     !4,  1,  4,  3,  5,  5,  5
-
-     !
-     !deallocate the pointlist array
-     !
-     DEALLOCATE(pointlist)
-
-     !
-     !Close the dataspace for the dataset.
-     !
-     CALL h5sclose_f(dataspace, error)
-     CALL check("h5sclose_f", error, total_error)
-
-     !
-     !Close the dataset.
-     !
-     CALL h5dclose_f(dset_id, error)
-     CALL check("h5dclose_f", error, total_error)
-
-     !
-     !Close the file.
-     !
-     CALL h5fclose_f(file_id, error)
-     CALL check("h5fclose_f", error, total_error)
-
-
-          if(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-              CALL check("h5_cleanup_f", error, total_error)
-
-     RETURN
-  END SUBROUTINE  test_basic_select
-
-!***************************************************************
-!**
-!**  test_select_point(): Test basic H5S (dataspace) selection code.
-!**      Tests element selections between dataspaces of various sizes
-!**      and dimensionalities.
-!**
-!***************************************************************
-
-SUBROUTINE test_select_point(cleanup, total_error)
-  USE HDF5 ! This module contains all necessary modules 
-  USE TH5_MISC
-  
-  IMPLICIT NONE
-  LOGICAL, INTENT(IN)  :: cleanup
-  INTEGER, INTENT(INOUT) :: total_error
-  INTEGER(HID_T) :: xfer_plist
-  
-  INTEGER, PARAMETER :: SPACE1_DIM1=3
-  INTEGER, PARAMETER :: SPACE1_DIM2=15
-  INTEGER, PARAMETER :: SPACE1_DIM3=13
-  INTEGER, PARAMETER :: SPACE2_DIM1=30
-  INTEGER, PARAMETER :: SPACE2_DIM2=26
-  INTEGER, PARAMETER :: SPACE3_DIM1=15
-  INTEGER, PARAMETER :: SPACE3_DIM2=26
-  
-  INTEGER, PARAMETER :: SPACE1_RANK=3
-  INTEGER, PARAMETER :: SPACE2_RANK=2
-  INTEGER, PARAMETER :: SPACE3_RANK=2
-  
-  !  Element selection information 
-  INTEGER, PARAMETER :: POINT1_NPOINTS=10
-  INTEGER(hid_t) ::fid1 !  HDF5 File IDs 
-  INTEGER(hid_t) ::dataset !	 Dataset ID 
-  INTEGER(hid_t) ::sid1,sid2 !  Dataspace ID 
-  INTEGER(hsize_t), DIMENSION(1:3) :: dims1 = (/SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3/)
-  INTEGER(hsize_t), DIMENSION(1:2) :: dims2 = (/SPACE2_DIM1, SPACE2_DIM2/)
-  INTEGER(hsize_t), DIMENSION(1:2) :: dims3 = (/SPACE3_DIM1, SPACE3_DIM2/)
-  
-  INTEGER(hsize_t), DIMENSION(1:SPACE1_RANK,1:POINT1_NPOINTS) :: coord1 ! Coordinates for point selection 
-  INTEGER(hsize_t), DIMENSION(1:SPACE1_RANK,1:POINT1_NPOINTS) :: temp_coord1 ! Coordinates for point selection 
-  INTEGER(hsize_t), DIMENSION(1:SPACE2_RANK,1:POINT1_NPOINTS) :: coord2 ! Coordinates for point selection 
-  INTEGER(hsize_t), DIMENSION(1:SPACE2_RANK,1:POINT1_NPOINTS) :: temp_coord2 ! Coordinates for point selection 
-  INTEGER(hsize_t), DIMENSION(1:SPACE3_RANK,1:POINT1_NPOINTS) :: coord3 ! Coordinates for point selection 
-  INTEGER(hsize_t), DIMENSION(1:SPACE3_RANK,1:POINT1_NPOINTS) :: temp_coord3 ! Coordinates for point selection 
-  INTEGER(hssize_t) :: npoints
-
-!!$    uint8_t    *wbuf,        buffer to write to disk 
-!!$               *rbuf,        buffer read from disk 
-!!$               *tbuf;        temporary buffer pointer 
-  INTEGER :: i,j;        ! Counters 
-!    struct pnt_iter pi;      Custom Pointer iterator struct 
-  INTEGER :: error    ! Generic return value		
-  CHARACTER(LEN=9) :: filename = 'h5s_hyper'
-  CHARACTER(LEN=80) :: fix_filename 
-  CHARACTER(LEN=1), DIMENSION(1:SPACE2_DIM1,1:SPACE2_DIM2) :: wbuf
-
-  CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
-  IF (error .NE. 0) THEN
-     WRITE(*,*) "Cannot modify filename"
-     STOP
-  ENDIF
-  xfer_plist = H5P_DEFAULT_F
-!    MESSAGE(5, ("Testing Element Selection Functions\n"));
-
-    ! Allocate write & read buffers 
-!!$  wbuf = HDmalloc(sizeof(uint8_t) * SPACE2_DIM1 * SPACE2_DIM2);
-!!$  rbuf = HDcalloc(sizeof(uint8_t), (size_t)(SPACE3_DIM1 * SPACE3_DIM2));
-!!$
-  ! Initialize WRITE buffer 
-
-  DO i = 1, SPACE2_DIM1
-     DO j = 1, SPACE2_DIM2
-        wbuf(i,j) = 'a'
-     ENDDO
-  ENDDO
-
-!!$  for(i=0, tbuf=wbuf; i<SPACE2_DIM1; i++)
-!!$  for(j=0; j<SPACE2_DIM2; j++)
-!!$  *tbuf++=(uint8_t)((i*SPACE2_DIM2)+j);
-  
-  ! Create file 
-  CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, fid1, error)
-  CALL check("h5fcreate_f", error, total_error)
-  
-  ! Create dataspace for dataset 
-  CALL h5screate_simple_f(SPACE1_RANK, dims1, sid1, error)
-  CALL check("h5screate_simple_f", error, total_error)
-
-  ! Create dataspace for write buffer 
-  CALL h5screate_simple_f(SPACE2_RANK, dims2, sid2, error)
-  CALL check("h5screate_simple_f", error, total_error)
-
-  ! Select sequence of ten points for disk dataset 
-  coord1(1,1)=1; coord1(2,1)=11; coord1(3,1)= 6;
-  coord1(1,2)=2; coord1(2,2)= 3; coord1(3,2)= 8;
-  coord1(1,3)=3; coord1(2,3)= 5; coord1(3,3)=10;
-  coord1(1,4)=1; coord1(2,4)= 7; coord1(3,4)=12;
-  coord1(1,5)=2; coord1(2,5)= 9; coord1(3,5)=14;
-  coord1(1,6)=3; coord1(2,6)=13; coord1(3,6)= 1;
-  coord1(1,7)=1; coord1(2,7)=15; coord1(3,7)= 3;
-  coord1(1,8)=2; coord1(2,8)= 1; coord1(3,8)= 5;
-  coord1(1,9)=3; coord1(2,9)= 2; coord1(3,9)= 7;
-  coord1(1,10)=1; coord1(2,10)= 4; coord1(3,10)= 9
-
-  CALL h5sselect_elements_f(sid1, H5S_SELECT_SET_F, SPACE1_RANK, INT(POINT1_NPOINTS,size_t), coord1, error)
-  CALL check("h5sselect_elements_f", error, total_error)
-
-  ! Verify correct elements selected 
-
-  CALL h5sget_select_elem_pointlist_f(sid1, INT(0,hsize_t), INT(POINT1_NPOINTS,hsize_t),temp_coord1,error)
-  CALL check("h5sget_select_elem_pointlist_f", error, total_error)
-
-  DO i= 1, POINT1_NPOINTS
-     CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord1(1,i)), INT(coord1(1,i)), total_error)
-     CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord1(2,i)), INT(coord1(2,i)), total_error)
-     CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord1(3,i)), INT(coord1(3,i)), total_error)
-  ENDDO
-
-  CALL H5Sget_select_npoints_f(sid1, npoints, error)
-  CALL check("h5sget_select_npoints_f", error, total_error)
-  CALL verify("h5sget_select_npoints_f", INT(npoints), 10, total_error)
-
-  ! Append another sequence of ten points to disk dataset 
-
-  coord1(1,1)=1; coord1(2,1)=3; coord1(3,1)= 1;
-  coord1(1,2)=2; coord1(2,2)=11; coord1(3,2)= 9;
-  coord1(1,3)=3; coord1(2,3)= 9; coord1(3,3)=11;
-  coord1(1,4)=1; coord1(2,4)= 8; coord1(3,4)=13;
-  coord1(1,5)=2; coord1(2,5)= 4; coord1(3,5)=12;
-  coord1(1,6)=3; coord1(2,6)= 2; coord1(3,6)= 2;
-  coord1(1,7)=1; coord1(2,7)=14; coord1(3,7)= 8;
-  coord1(1,8)=2; coord1(2,8)=15; coord1(3,8)= 7;
-  coord1(1,9)=3; coord1(2,9)= 3; coord1(3,9)= 6;
-  coord1(1,10)=1; coord1(2,10)= 7; coord1(3,10)= 14
-
-
-  CALL h5sselect_elements_f(sid1, H5S_SELECT_APPEND_F, SPACE1_RANK, INT(POINT1_NPOINTS,size_t), coord1, error)
-  CALL check("h5sselect_elements_f", error, total_error)
-  !  Verify correct elements selected 
-  
-  CALL h5sget_select_elem_pointlist_f(sid1, INT(POINT1_NPOINTS,hsize_t), INT(POINT1_NPOINTS,hsize_t),temp_coord1,error)
-  CALL check("h5sget_select_elem_pointlist_f", error, total_error)
-
-  DO i= 1, POINT1_NPOINTS
-     CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord1(1,i)), INT(coord1(1,i)), total_error)
-     CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord1(2,i)), INT(coord1(2,i)), total_error)
-     CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord1(3,i)), INT(coord1(3,i)), total_error)
-  ENDDO
-
-  CALL H5Sget_select_npoints_f(sid1, npoints, error)
-  CALL check("h5sget_select_npoints_f", error, total_error)
-  CALL verify("h5sget_select_npoints_f", INT(npoints), 20, total_error)
-
-  !  Select sequence of ten points for memory dataset 
-  coord2(1,1)=13; coord2(2,1)= 4;
-  coord2(1,2)=16; coord2(2,2)=14;
-  coord2(1,3)= 8; coord2(2,3)=26;
-  coord2(1,4)= 1; coord2(2,4)= 7;
-  coord2(1,5)=14; coord2(2,5)= 1;
-  coord2(1,6)=25; coord2(2,6)=12;
-  coord2(1,7)=13; coord2(2,7)=22;
-  coord2(1,8)=30; coord2(2,8)= 5;
-  coord2(1,9)= 9; coord2(2,9)= 9;
-  coord2(1,10)=20; coord2(2,10)=18
-
-  CALL h5sselect_elements_f(sid2, H5S_SELECT_SET_F, SPACE2_RANK, INT(POINT1_NPOINTS,size_t), coord2, error)
-  CALL check("h5sselect_elements_f", error, total_error)
-
-
-  ! Verify correct elements selected 
-  
-  CALL h5sget_select_elem_pointlist_f(sid2, INT(0,hsize_t), INT(POINT1_NPOINTS,hsize_t),temp_coord2,error)
-  CALL check("h5sget_select_elem_pointlist_f", error, total_error)
-
-  DO i= 1, POINT1_NPOINTS
-     CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord2(1,i)), INT(coord2(1,i)), total_error)
-     CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord2(2,i)), INT(coord2(2,i)), total_error)
-  ENDDO
-
-!!$
-!!$     Save points for later iteration 
-!!$     (these are in the second half of the buffer, because we are prepending 
-!!$      the next list of points to the beginning of the point selection list) 
-!!$    HDmemcpy(((char *)pi.coord)+sizeof(coord2),coord2,sizeof(coord2));
-!!$
-
-  CALL H5Sget_select_npoints_f(sid2, npoints, error)
-  CALL check("h5sget_select_npoints_f", error, total_error)
-  CALL verify("h5sget_select_npoints_f", INT(npoints), 10, total_error)
-
-  ! Append another sequence of ten points to memory dataset 
-  coord2(1,1)=25; coord2(2,1)= 1;
-  coord2(1,2)= 3; coord2(2,2)=26;
-  coord2(1,3)=14; coord2(2,3)=18;
-  coord2(1,4)= 9; coord2(2,4)= 4;
-  coord2(1,5)=30; coord2(2,5)= 5;
-  coord2(1,6)=12; coord2(2,6)=15;
-  coord2(1,7)= 6; coord2(2,7)=23;
-  coord2(1,8)=13; coord2(2,8)= 3;
-  coord2(1,9)=22; coord2(2,9)=13;
-  coord2(1,10)= 10; coord2(2,10)=19
-
-  CALL h5sselect_elements_f(sid2, H5S_SELECT_PREPEND_F, SPACE2_RANK, INT(POINT1_NPOINTS,size_t), coord2, error)
-  CALL check("h5sselect_elements_f", error, total_error)
-
-
-  ! Verify correct elements selected 
-  CALL h5sget_select_elem_pointlist_f(sid2, INT(0,hsize_t), INT(POINT1_NPOINTS,hsize_t),temp_coord2,error)
-  CALL check("h5sget_select_elem_pointlist_f", error, total_error)
-
-  DO i= 1, POINT1_NPOINTS
-     CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord2(1,i)), INT(coord2(1,i)), total_error)
-     CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord2(2,i)), INT(coord2(2,i)), total_error)
-  ENDDO
-
-  CALL H5Sget_select_npoints_f(sid2, npoints, error)
-  CALL check("h5sget_select_npoints_f", error, total_error)
-  CALL verify("h5sget_select_npoints_f", INT(npoints), 20, total_error)
-
-!!$     Save points for later iteration 
-!!$    HDmemcpy(pi.coord,coord2,sizeof(coord2));
-
-  !  Create a dataset 
-  CALL h5dcreate_f(fid1, "Dataset1", H5T_NATIVE_CHARACTER, sid1, dataset, error)
-  CALL check("h5dcreate_f", error, total_error)
-
-  !  Write selection to disk 
-  CALL h5dwrite_f(dataset, H5T_NATIVE_CHARACTER, wbuf, dims2, error, sid2, sid1, xfer_plist)
-  CALL check("h5dwrite_f", error, total_error)
-
-  !  Close memory dataspace 
-  CALL h5sclose_f(sid2, error)
-  CALL check("h5sclose_f", error, total_error)
-
-  !  Create dataspace for reading buffer 
-  CALL h5screate_simple_f(SPACE3_RANK, dims3, sid2, error)
-  CALL check("h5screate_simple_f", error, total_error)
-
-  !  Select sequence of points for read dataset 
-  coord3(1,1)= 1; coord3(2,1)= 3;
-  coord3(1,2)= 5; coord3(2,2)= 9;
-  coord3(1,3)=14; coord3(2,3)=14;
-  coord3(1,4)=15; coord3(2,4)=21;
-  coord3(1,5)= 8; coord3(2,5)=10;
-  coord3(1,6)= 3; coord3(2,6)= 1;
-  coord3(1,7)= 10; coord3(2,7)=20;
-  coord3(1,8)= 2; coord3(2,8)=23;
-  coord3(1,9)=13; coord3(2,9)=22;
-  coord3(1,10)=12; coord3(2,10)=7;
-
-  CALL h5sselect_elements_f(sid2, H5S_SELECT_SET_F, SPACE3_RANK, INT(POINT1_NPOINTS,size_t), coord3, error)
-  CALL check("h5sselect_elements_f", error, total_error)
-
-  !  Verify correct elements selected 
-  CALL h5sget_select_elem_pointlist_f(sid2, INT(0,hsize_t), INT(POINT1_NPOINTS,hsize_t),temp_coord3,error)
-  CALL check("h5sget_select_elem_pointlist_f", error, total_error)
-  DO i= 1, POINT1_NPOINTS
-     CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord3(1,i)), INT(coord3(1,i)), total_error)
-     CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord3(2,i)), INT(coord3(2,i)), total_error)
-  ENDDO
-
-  CALL H5Sget_select_npoints_f(sid2, npoints, error)
-  CALL check("h5sget_select_npoints_f", error, total_error)
-  CALL verify("h5sget_select_npoints_f", INT(npoints), 10, total_error)
-
-  ! Append another sequence of ten points to disk dataset 
-    coord3(1,1)=15; coord3(2,1)=26;
-    coord3(1,2)= 1; coord3(2,2)= 1;
-    coord3(1,3)=12; coord3(2,3)=12;
-    coord3(1,4)= 6; coord3(2,4)=15;
-    coord3(1,5)= 4; coord3(2,5)= 6;
-    coord3(1,6)= 3; coord3(2,6)= 3;
-    coord3(1,7)= 8; coord3(2,7)=14;
-    coord3(1,8)=10; coord3(2,8)=17;
-    coord3(1,9)=13; coord3(2,9)=23;
-    coord3(1,10)=14; coord3(2,10)=10
-
-    CALL h5sselect_elements_f(sid2, H5S_SELECT_APPEND_F, SPACE3_RANK, INT(POINT1_NPOINTS,size_t), coord3, error)
-    CALL check("h5sselect_elements_f", error, total_error)
-
-  !  Verify correct elements selected 
-  CALL h5sget_select_elem_pointlist_f(sid2, INT(POINT1_NPOINTS,hsize_t), INT(POINT1_NPOINTS,hsize_t),temp_coord3,error)
-  CALL check("h5sget_select_elem_pointlist_f", error, total_error)
-  DO i= 1, POINT1_NPOINTS
-     CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord3(1,i)), INT(coord3(1,i)), total_error)
-     CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord3(2,i)), INT(coord3(2,i)), total_error)
-  ENDDO
-
-  CALL H5Sget_select_npoints_f(sid2, npoints, error)
-  CALL check("h5sget_select_npoints_f", error, total_error)
-  CALL verify("h5sget_select_npoints_f", INT(npoints), 20, total_error)
-
-! F2003 feature
-!!$  Read selection from disk 
-!!$    ret=H5Dread(dataset,H5T_NATIVE_UCHAR,sid2,sid1,xfer_plist,rbuf);
-!!$    CHECK(ret, FAIL, "H5Dread");
-!!$
-!!$     Check that the values match with a dataset iterator 
-!!$    pi.buf=wbuf;
-!!$    pi.offset=0;
-!!$    ret = H5Diterate(rbuf,H5T_NATIVE_UCHAR,sid2,test_select_point_iter1,&pi);
-!!$    CHECK(ret, FAIL, "H5Diterate");
-!!$
-! F2003 feature
-
-  ! Close memory dataspace 
-  CALL h5sclose_f(sid2, error)
-  CALL check("h5sclose_f", error, total_error)
-
-  ! Close disk dataspace 
-  CALL h5sclose_f(sid1, error)
-  CALL check("h5sclose_f", error, total_error)
-
-  ! Close Dataset 
-  CALL h5dclose_f(dataset, error)
-  CALL check("h5dclose_f", error, total_error)
-
-  ! Close file 
-  CALL h5fclose_f(fid1, error)
-  CALL check("h5fclose_f", error, total_error)
-
-  IF(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-
-END SUBROUTINE test_select_point
-
-
-!***************************************************************
-!**
-!**  test_select_combine(): Test basic H5S (dataspace) selection code.
-!**      Tests combining "all" and "none" selections with hyperslab
-!**      operations.
-!**
-!***************************************************************
-
-SUBROUTINE test_select_combine(total_error)
-  USE HDF5 ! This module contains all necessary modules 
-  USE TH5_MISC
-  
-  IMPLICIT NONE
-  INTEGER, INTENT(INOUT) :: total_error
-
-  INTEGER, PARAMETER :: SPACE7_RANK = 2
-  INTEGER, PARAMETER :: SPACE7_DIM1 = 10
-  INTEGER, PARAMETER :: SPACE7_DIM2 = 10
-  
-  INTEGER(hid_t) :: base_id !       Base dataspace for test 
-  INTEGER(hid_t) :: all_id !        Dataspace for "all" selection 
-  INTEGER(hid_t) :: none_id !       Dataspace for "none" selection 
-  INTEGER(hid_t) :: space1 !        Temporary dataspace #1 
-  INTEGER(hsize_t), DIMENSION(1:SPACE7_RANK) :: start !  Hyperslab start 
-  INTEGER(hsize_t), DIMENSION(1:SPACE7_RANK) :: stride !  Hyperslab stride 
-  INTEGER(hsize_t), DIMENSION(1:SPACE7_RANK) :: icount !  Hyperslab count 
-  INTEGER(hsize_t), DIMENSION(1:SPACE7_RANK) :: iblock !  Hyperslab BLOCK 
-  INTEGER(hsize_t), DIMENSION(1:SPACE7_RANK) :: dims = (/SPACE7_DIM1,SPACE7_DIM2/) ! Dimensions of dataspace 
-  INTEGER :: sel_type !  Selection type 
-  INTEGER(hssize_t) :: nblocks   ! Number of hyperslab blocks 
-  INTEGER(hsize_t), DIMENSION(1:128,1:2,1:SPACE7_RANK) :: blocks !  List of blocks 
-  INTEGER :: error, area
-
-  ! Create dataspace for dataset on disk 
-  CALL h5screate_simple_f(SPACE7_RANK, dims, base_id, error)
-  CALL check("h5screate_simple_f", error, total_error)
-
-  !  Copy base dataspace and set selection to "all" 
-  CALL h5scopy_f(base_id, all_id, error)  
-  CALL check("h5scopy_f", error, total_error)
-
-  CALL H5Sselect_all_f(all_id, error)
-  CALL check("H5Sselect_all_f", error, total_error)
-
-  CALL H5Sget_select_type_f(all_id, sel_type, error)
-  CALL check("H5Sget_select_type_f", error, total_error)
-  CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT(H5S_SEL_ALL_F), total_error)
-
-  ! Copy base dataspace and set selection to "none" 
-  CALL h5scopy_f(base_id, none_id, error)  
-  CALL check("h5scopy_f", error, total_error)
-
-  CALL H5Sselect_none_f(none_id, error)
-  CALL check("H5Sselect_none_f", error, total_error)
-
-  CALL H5Sget_select_type_f(none_id, sel_type, error)
-  CALL check("H5Sget_select_type_f", error, total_error)
-  CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT(H5S_SEL_NONE_F), total_error)
-  
-  ! Copy "all" selection & space 
-  CALL H5Scopy_f(all_id, space1, error)  
-  CALL check("h5scopy_f", error, total_error)
-
-  ! 'OR' "all" selection with another hyperslab 
-  start(1:2) = 0
-  stride(1:2) = 1
-  icount(1:2) = 1
-  iblock(1:2) = (/5,4/)
-  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_OR_F, start, &
-                                icount, error, stride, iblock) 
-  CALL check("h5sselect_hyperslab_f", error, total_error)
-
-  ! Verify that it's still "all" selection 
-  CALL H5Sget_select_type_f(space1, sel_type, error)
-  CALL check("H5Sget_select_type_f", error, total_error)
-  CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT(H5S_SEL_ALL_F), total_error)
-
-  ! Close temporary dataspace 
-  CALL h5sclose_f(space1, error)
-  CALL check("h5sclose_f", error, total_error)
-
-  ! Copy "all" selection & space 
-  CALL H5Scopy_f(all_id, space1, error)  
-  CALL check("h5scopy_f", error, total_error)
-
-  !  'AND' "all" selection with another hyperslab 
-  start(1:2) = 0
-  stride(1:2) = 1
-  icount(1:2) = 1
-  iblock(1:2) = (/5,4/)
-  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_AND_F, start, &
-       icount, error, stride, iblock) 
-  CALL check("h5sselect_hyperslab_f", error, total_error)
-
-  ! Verify that the new selection is the same at the original block 
-  CALL H5Sget_select_type_f(space1, sel_type, error)
-  CALL check("H5Sget_select_type_f", error, total_error)
-  CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_HYPERSLABS_F), total_error)
-
-  ! Verify that there is only one block 
-  CALL h5sget_select_hyper_nblocks_f(space1, nblocks, error)
-  CALL check("h5sget_select_hyper_nblocks_f", error, total_error)
-  CALL VERIFY("h5sget_select_hyper_nblocks_f", INT(nblocks), 1, total_error)
-  
-  ! Retrieve the block defined 
-  CALL h5sget_select_hyper_blocklist_f(space1, INT(0, hsize_t), INT(nblocks,hsize_t), blocks, error)
-  CALL check("h5sget_select_hyper_blocklist_f", error, total_error)
-
-  ! Verify that the correct block is defined 
-
-  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(1,1,1)), 1, total_error)
-  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(2,1,1)), 1, total_error)
-  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(3,1,1)), 5, total_error)
-  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(4,1,1)), 4, total_error)
-
-  ! Close temporary dataspace 
-  CALL h5sclose_f(space1, error)
-  CALL check("h5sclose_f", error, total_error)
-
-  ! Copy "all" selection & space 
-  CALL H5Scopy_f(all_id, space1, error)  
-  CALL check("h5scopy_f", error, total_error)
-
-  !  'XOR' "all" selection with another hyperslab 
-  start(1:2) = 0
-  stride(1:2) = 1
-  icount(1:2) = 1
-  iblock(1:2) = (/5,4/)
-
-  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_XOR_F, start, &
-       icount, error, stride, iblock) 
-  CALL check("h5sselect_hyperslab_f", error, total_error)
-
-  !  Verify that the new selection is an inversion of the original block 
-  CALL H5Sget_select_type_f(space1, sel_type, error)
-  CALL check("H5Sget_select_type_f", error, total_error)
-  CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_HYPERSLABS_F), total_error)
-
-  !  Verify that there are two blocks 
-  CALL h5sget_select_hyper_nblocks_f(space1, nblocks, error)
-  CALL check("h5sget_select_hyper_nblocks_f", error, total_error)
-  CALL VERIFY("h5sget_select_hyper_nblocks_f", INT(nblocks), 2, total_error)
-
-  !  Retrieve the block defined 
-
-  blocks = -1 !  Reset block list 
-  CALL h5sget_select_hyper_blocklist_f(space1, INT(0, hsize_t), INT(nblocks,hsize_t), blocks, error)
-  CALL check("h5sget_select_hyper_blocklist_f", error, total_error)
-
-  !  Verify that the correct block is defined 
-
-  ! No guarantee is implied as the order in which blocks are listed. 
-  ! So this will ONLY work for square domains iblock(1:2) = (/5,5/)
-!!$  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(1,1,1)), 1, total_error)
-!!$  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(2,1,1)), 5, total_error)
-!!$  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(3,1,1)), 5, total_error)
-!!$  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(4,1,1)), 10, total_error)
-!!$  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(5,1,1)), 6, total_error)
-!!$  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(6,1,1)), 1, total_error)
-!!$  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(7,1,1)), 10, total_error)
-!!$  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(8,1,1)), 10, total_error)
-
-  ! Otherwise make sure the "area" of the block is correct
-  area = (ABS(INT(blocks(1,1,1)-blocks(3,1,1)))+1)*(ABS(INT(blocks(2,1,1)-blocks(4,1,1)))+1)
-  area = area + (ABS(INT(blocks(5,1,1)-blocks(7,1,1)))+1)*(ABS(INT(blocks(6,1,1)-blocks(8,1,1)))+1)
-  CALL VERIFY("h5sget_select_hyper_blocklist_f", area, 80, total_error)
-
-  ! Close temporary dataspace 
-  CALL h5sclose_f(space1, error)
-  CALL check("h5sclose_f", error, total_error)
-
-  !  Copy "all" selection & space 
-  CALL H5Scopy_f(all_id, space1, error)  
-  CALL check("h5scopy_f", error, total_error)
-
-  !  'NOTB' "all" selection with another hyperslab 
-  start(1:2) = 0
-  stride(1:2) = 1
-  icount(1:2) = 1
-  iblock(1:2) = (/5,4/) !5
-
-  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_NOTB_F, start, &
-       icount, error, stride, iblock) 
-  CALL check("h5sselect_hyperslab_f", error, total_error)
-
-  !  Verify that the new selection is an inversion of the original block 
-  CALL H5Sget_select_type_f(space1, sel_type, error)
-  CALL check("H5Sget_select_type_f", error, total_error)
-  CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_HYPERSLABS_F), total_error)
-
-  !  Verify that there are two blocks 
-  CALL h5sget_select_hyper_nblocks_f(space1, nblocks, error)
-  CALL check("h5sget_select_hyper_nblocks_f", error, total_error)
-  CALL VERIFY("h5sget_select_hyper_nblocks_f", INT(nblocks), 2, total_error)
-
-  !  Retrieve the block defined 
-  blocks = -1 !  Reset block list 
-  CALL h5sget_select_hyper_blocklist_f(space1, INT(0, hsize_t), INT(nblocks,hsize_t), blocks, error)
-  CALL check("h5sget_select_hyper_blocklist_f", error, total_error)
-
-  !  Verify that the correct block is defined  
-
-  ! No guarantee is implied as the order in which blocks are listed. 
-  ! So this will ONLY work for square domains iblock(1:2) = (/5,5/)
-
-!!$  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(1,1,1)), 1, total_error)
-!!$  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(2,1,1)), 5, total_error)
-!!$  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(3,1,1)), 5, total_error)
-!!$  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(4,1,1)),10, total_error)
-!!$  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(5,1,1)), 6, total_error)
-!!$  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(6,1,1)), 1, total_error)
-!!$  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(7,1,1)),10, total_error)
-!!$  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(8,1,1)),10, total_error)
-
-  ! Otherwise make sure the "area" of the block is correct
-  area = (ABS(INT(blocks(1,1,1)-blocks(3,1,1)))+1)*(ABS(INT(blocks(2,1,1)-blocks(4,1,1)))+1)
-  area = area + (ABS(INT(blocks(5,1,1)-blocks(7,1,1)))+1)*(ABS(INT(blocks(6,1,1)-blocks(8,1,1)))+1)
-  CALL VERIFY("h5sget_select_hyper_blocklist_f", area, 80, total_error)
-
-
-  !  Close temporary dataspace 
-  CALL h5sclose_f(space1, error)
-  CALL check("h5sclose_f", error, total_error)
-  !  Copy "all" selection & space 
-  CALL H5Scopy_f(all_id, space1, error)  
-  CALL check("h5scopy_f", error, total_error)
-
-  !  'NOTA' "all" selection with another hyperslab 
-  start(1:2) = 0
-  stride(1:2) = 1
-  icount(1:2) = 1
-  iblock(1:2) = (/5,4/) !5
-
-  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_NOTA_F, start, &
-       icount, error, stride, iblock) 
-  CALL check("h5sselect_hyperslab_f", error, total_error)
-
-  ! Verify that the new selection is the "none" selection 
-  CALL H5Sget_select_type_f(space1, sel_type, error)
-  CALL check("H5Sget_select_type_f", error, total_error)
-  CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_NONE_F), total_error)
-
-  !  Close temporary dataspace 
-  CALL h5sclose_f(space1, error)
-  CALL check("h5sclose_f", error, total_error)
-
-  !  Copy "none" selection & space 
-  CALL H5Scopy_f(none_id, space1, error)  
-  CALL check("h5scopy_f", error, total_error)
-
-  !  'OR' "none" selection with another hyperslab 
-  start(1:2) = 0
-  stride(1:2) = 1
-  icount(1:2) = 1
-  iblock(1:2) = (/5,4/) !5
-
-  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_OR_F, start, &
-       icount, error, stride, iblock) 
-  CALL check("h5sselect_hyperslab_f", error, total_error)
-
-  !  Verify that the new selection is the same as the original hyperslab 
-  CALL H5Sget_select_type_f(space1, sel_type, error)
-  CALL check("H5Sget_select_type_f", error, total_error)
-  CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_HYPERSLABS_F), total_error)
-  
-
-  !  Verify that there is only one block 
-  CALL h5sget_select_hyper_nblocks_f(space1, nblocks, error)
-  CALL check("h5sget_select_hyper_nblocks_f", error, total_error)
-  CALL VERIFY("h5sget_select_hyper_nblocks_f", INT(nblocks), 1, total_error)
-
-  !  Retrieve the block defined 
-  blocks = -1 !  Reset block list 
-  CALL h5sget_select_hyper_blocklist_f(space1, INT(0, hsize_t), INT(nblocks,hsize_t), blocks, error)
-  CALL check("h5sget_select_hyper_blocklist_f", error, total_error)
-
-  !  Verify that the correct block is defined 
-  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(1,1,1)), 1, total_error)
-  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(2,1,1)), 1, total_error)
-  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(3,1,1)), 5, total_error)
-  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(4,1,1)), 4, total_error)
-
-  !  Close temporary dataspace 
-  CALL h5sclose_f(space1, error)
-  CALL check("h5sclose_f", error, total_error)
-
-  !  Copy "none" selection & space 
-  CALL H5Scopy_f(none_id, space1, error)  
-  CALL check("h5scopy_f", error, total_error)
-
-  !  'AND' "none" selection with another hyperslab 
-  start(1:2) = 0
-  stride(1:2) = 1
-  icount(1:2) = 1
-  iblock(1:2) = (/5,4/) !5
-
-  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_AND_F, start, &
-       icount, error, stride, iblock) 
-  CALL check("h5sselect_hyperslab_f", error, total_error)
-
-  !  Verify that the new selection is the "none" selection 
-  CALL H5Sget_select_type_f(space1, sel_type, error)
-  CALL check("H5Sget_select_type_f", error, total_error)
-  CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_NONE_F), total_error)
-
-  !  Close temporary dataspace 
-  CALL h5sclose_f(space1, error)
-  CALL check("h5sclose_f", error, total_error)
-
-  !  Copy "none" selection & space 
-  CALL H5Scopy_f(none_id, space1, error)  
-  CALL check("h5scopy_f", error, total_error)
-
-  !  'XOR' "none" selection with another hyperslab 
-  start(1:2) = 0
-  stride(1:2) = 1
-  icount(1:2) = 1
-  iblock(1:2) = (/5,4/) !5
-
-  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_XOR_F, start, &
-       icount, error, stride, iblock) 
-  CALL check("h5sselect_hyperslab_f", error, total_error)
-
-  !  Verify that the new selection is the same as the original hyperslab 
-  CALL H5Sget_select_type_f(space1, sel_type, error)
-  CALL check("H5Sget_select_type_f", error, total_error)
-  CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_HYPERSLABS_F), total_error)
-  
-
-  !  Verify that there is only one block 
-  CALL h5sget_select_hyper_nblocks_f(space1, nblocks, error)
-  CALL check("h5sget_select_hyper_nblocks_f", error, total_error)
-  CALL VERIFY("h5sget_select_hyper_nblocks_f", INT(nblocks), 1, total_error)
-
-  !  Retrieve the block defined 
-  blocks = -1 !  Reset block list 
-  CALL h5sget_select_hyper_blocklist_f(space1, INT(0, hsize_t), INT(nblocks,hsize_t), blocks, error)
-  CALL check("h5sget_select_hyper_blocklist_f", error, total_error)
-  !  Verify that the correct block is defined 
-  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(1,1,1)), 1, total_error)
-  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(2,1,1)), 1, total_error)
-  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(3,1,1)), 5, total_error)
-  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(4,1,1)), 4, total_error)
-  
-  !  Close temporary dataspace 
-  CALL h5sclose_f(space1, error)
-  CALL check("h5sclose_f", error, total_error)
-
-  !  Copy "none" selection & space 
-  CALL H5Scopy_f(none_id, space1, error)  
-  CALL check("h5scopy_f", error, total_error)
-
-  !  'NOTB' "none" selection with another hyperslab 
-  start(1:2) = 0
-  stride(1:2) = 1
-  icount(1:2) = 1
-  iblock(1:2) = (/5,4/) !5
-
-  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_NOTB_F, start, &
-       icount, error, stride, iblock) 
-  CALL check("h5sselect_hyperslab_f", error, total_error)
-
-  !  Verify that the new selection is the "none" selection 
-  CALL H5Sget_select_type_f(space1, sel_type, error)
-  CALL check("H5Sget_select_type_f", error, total_error)
-  CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_NONE_F), total_error)
-
-  !  Close temporary dataspace 
-  CALL h5sclose_f(space1, error)
-  CALL check("h5sclose_f", error, total_error)
-
-  !  Copy "none" selection & space 
-  CALL H5Scopy_f(none_id, space1, error)  
-  CALL check("h5scopy_f", error, total_error)
-
-  !  'NOTA' "none" selection with another hyperslab 
-  start(1:2) = 0
-  stride(1:2) = 1
-  icount(1:2) = 1
-  iblock(1:2) = (/5,4/) !5  
-  CALL h5sselect_hyperslab_f(space1, H5S_SELECT_NOTA_F, start, &
-       icount, error, stride, iblock) 
-  CALL check("h5sselect_hyperslab_f", error, total_error)
-
-  !  Verify that the new selection is the same as the original hyperslab 
-  CALL H5Sget_select_type_f(space1, sel_type, error)
-  CALL check("H5Sget_select_type_f", error, total_error)
-  CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_HYPERSLABS_F), total_error)
-    
-  !  Verify that there is ONLY one BLOCK 
-  CALL h5sget_select_hyper_nblocks_f(space1, nblocks, error)
-  CALL check("h5sget_select_hyper_nblocks_f", error, total_error)
-  CALL VERIFY("h5sget_select_hyper_nblocks_f", INT(nblocks), 1, total_error)
-
-  !  Retrieve the block defined 
-
-  blocks = -1 !  Reset block list 
-  CALL h5sget_select_hyper_blocklist_f(space1, INT(0, hsize_t), INT(nblocks,hsize_t), blocks, error)
-  CALL check("h5sget_select_hyper_blocklist_f", error, total_error)
-
-
-  !  Verify that the correct block is defined 
-
-  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(1,1,1)), 1, total_error)
-  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(2,1,1)), 1, total_error)
-  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(3,1,1)), 5, total_error)
-  CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(4,1,1)), 4, total_error)
-  
-  !  Close temporary dataspace 
-  CALL h5sclose_f(space1, error)
-  CALL check("h5sclose_f", error, total_error)
-
-  !  Close dataspaces 
-  
-  CALL h5sclose_f(base_id, error)
-  CALL check("h5sclose_f", error, total_error)
-  CALL h5sclose_f(all_id, error)
-  CALL check("h5sclose_f", error, total_error)
-  CALL h5sclose_f(none_id, error)
-  CALL check("h5sclose_f", error, total_error)
-
-END SUBROUTINE test_select_combine
-
-!***************************************************************
-!**
-!**  test_select_bounds(): Tests selection bounds on dataspaces,
-!**      both with and without offsets.
-!**
-!***************************************************************
-
-SUBROUTINE test_select_bounds(total_error)
-  USE HDF5 ! This module contains all necessary modules 
-  USE TH5_MISC
-  
-  IMPLICIT NONE
-  INTEGER, INTENT(INOUT) :: total_error
-
-  INTEGER, PARAMETER :: SPACE11_RANK=2
-  INTEGER, PARAMETER :: SPACE11_DIM1=100
-  INTEGER, PARAMETER :: SPACE11_DIM2=50
-  INTEGER, PARAMETER :: SPACE11_NPOINTS=4
-  
-  INTEGER(hid_t) :: sid !  Dataspace ID 
-  INTEGER(hsize_t), DIMENSION(1:SPACE11_RANK) :: dims = (/SPACE11_DIM1, SPACE11_DIM2/) !Dataspace dimensions
-  INTEGER(hsize_t), DIMENSION(SPACE11_RANK, SPACE11_NPOINTS) :: coord ! Coordinates for point selection
-  INTEGER(hsize_t), DIMENSION(SPACE11_RANK) :: start !  The start of the hyperslab 
-  INTEGER(hsize_t), DIMENSION(SPACE11_RANK) :: stride ! The stride between block starts for the hyperslab 
-  INTEGER(hsize_t), DIMENSION(SPACE11_RANK) :: count ! The number of blocks for the hyperslab 
-  INTEGER(hsize_t), DIMENSION(SPACE11_RANK) :: BLOCK ! The size of each block for the hyperslab 
-  INTEGER(hssize_t), DIMENSION(SPACE11_RANK) :: offset ! Offset amount for selection 
-  INTEGER(hsize_t), DIMENSION(SPACE11_RANK) :: low_bounds ! The low bounds for the selection 
-  INTEGER(hsize_t), DIMENSION(SPACE11_RANK) :: high_bounds ! The high bounds for the selection 
-    
-  INTEGER :: error
-
-  ! Create dataspace 
-  CALL h5screate_simple_f(SPACE11_RANK, dims, sid, error)
-  CALL check("h5screate_simple_f", error, total_error)
-
-  !  Get bounds for 'all' selection 
-  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
-  CALL check("h5sget_select_bounds_f", error, total_error)
-
-  CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(1)), 1, total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(2)), 1, total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(1)), SPACE11_DIM1, total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(2)), SPACE11_DIM2, total_error)
-
-  ! Set offset for selection 
-  offset(1:2) = 1
-  CALL H5Soffset_simple_f(sid, offset, error)
-  CALL check("H5Soffset_simple_f", error, total_error)
-
-  ! Get bounds for 'all' selection with offset (which should be ignored) 
-  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
-  CALL check("h5sget_select_bounds_f", error, total_error)
-
-  CALL verify("h5sget_select_bounds_f", INT(low_bounds(1)), 1, total_error)
-  CALL verify("h5sget_select_bounds_f", INT(low_bounds(2)), 1, total_error)
-  CALL verify("h5sget_select_bounds_f", INT(high_bounds(1)), SPACE11_DIM1, total_error)
-  CALL verify("h5sget_select_bounds_f", INT(high_bounds(2)), SPACE11_DIM2, total_error)
-
-  ! Reset offset for selection 
-  offset(1:2) = 0
-  CALL H5Soffset_simple_f(sid, offset, error)
-  CALL check("H5Soffset_simple_f", error, total_error)
-
-  ! Set 'none' selection 
-  CALL H5Sselect_none_f(sid, error)
-  CALL check("H5Sselect_none_f", error, total_error)
-
-  ! Get bounds for 'none' selection, should fail 
-  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
-  CALL VERIFY("h5sget_select_bounds_f", error, -1, total_error)
-
-  ! Set point selection 
-  
-  coord(1,1)=  3; coord(2,1)=  3;
-  coord(1,2)=  3; coord(2,2)= 46;
-  coord(1,3)= 96; coord(2,3)=  3;
-  coord(1,4)= 96; coord(2,4)= 46;
-
-  CALL h5sselect_elements_f(sid, H5S_SELECT_SET_F, SPACE11_RANK, INT(SPACE11_NPOINTS,size_t), coord, error)
-  CALL check("h5sselect_elements_f", error, total_error)
-
-  ! Get bounds for point selection 
-  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
-  CALL check("h5sget_select_bounds_f", error, total_error)
-
-  CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(1)), 3, total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(2)), 3, total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(1)), INT(SPACE11_DIM1-4), total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(2)), INT(SPACE11_DIM2-4), total_error)
-
-  !  Set bad offset for selection 
-
-  offset(1:2) = (/5,-5/)
-  CALL H5Soffset_simple_f(sid, offset, error)
-  CALL check("H5Soffset_simple_f", error, total_error)
-
-  !  Get bounds for hyperslab selection with negative offset 
-  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
-  CALL VERIFY("h5sget_select_bounds_f", error, -1, total_error)
- 
-  !  Set valid offset for selection 
-  offset(1:2) = (/2,-2/)
-  CALL H5Soffset_simple_f(sid, offset, error)
-  CALL check("H5Soffset_simple_f", error, total_error)
-
-  !  Get bounds for point selection with offset 
-  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
-  CALL check("h5sget_select_bounds_f", error, total_error)
-
-  CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(1)), 5, total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(2)), 1, total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(1)), INT(SPACE11_DIM1-2), total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(2)), INT(SPACE11_DIM2-6), total_error)
-
-  !  Reset offset for selection 
-  offset(1:2) = 0
-  CALL H5Soffset_simple_f(sid, offset, error)
-  CALL check("H5Soffset_simple_f", error, total_error)
-
-  !  Set "regular" hyperslab selection 
-  start(1:2) = 2
-  stride(1:2) = 10
-  count(1:2) = 4
-  block(1:2) = 5
-  
-  CALL h5sselect_hyperslab_f(sid, H5S_SELECT_SET_F, start, &
-       count, error, stride, block) 
-  CALL check("h5sselect_hyperslab_f", error, total_error)
-
-  ! Get bounds for hyperslab selection 
-  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
-  CALL check("h5sget_select_bounds_f", error, total_error)
-
-  CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(1)), 3, total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(2)), 3, total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(1)), 37, total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(2)), 37, total_error)
-
-  ! Set bad offset for selection 
-  offset(1:2) = (/5,-5/)
-  CALL H5Soffset_simple_f(sid, offset, error)
-  CALL check("H5Soffset_simple_f", error, total_error)
-
-  !  Get bounds for hyperslab selection with negative offset 
-  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
-  CALL VERIFY("h5sget_select_bounds_f", error, -1, total_error)
-
-  !  Set valid offset for selection 
-  offset(1:2) = (/5,-2/)
-  CALL H5Soffset_simple_f(sid, offset, error)
-  CALL check("H5Soffset_simple_f", error, total_error)
-
-  ! Get bounds for hyperslab selection with offset 
-  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
-  CALL check("h5sget_select_bounds_f", error, total_error)
-
-  CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(1)), 8, total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(2)), 1, total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(1)), 42, total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(2)), 35, total_error)
-
-  ! Reset offset for selection 
-  offset(1:2) = 0
-  CALL H5Soffset_simple_f(sid, offset, error)
-  CALL check("H5Soffset_simple_f", error, total_error)
-  
-  !  Make "irregular" hyperslab selection 
-  start(1:2) = 20
-  stride(1:2) = 20
-  count(1:2) = 2
-  block(1:2) = 10
-
-  CALL h5sselect_hyperslab_f(sid, H5S_SELECT_OR_F, start, &
-       count, error, stride, block) 
-  CALL check("h5sselect_hyperslab_f", error, total_error)
-
-  ! Get bounds for hyperslab selection 
-  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
-  CALL check("h5sget_select_bounds_f", error, total_error)
-
-  CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(1)), 3, total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(2)), 3, total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(1)), 50, total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(2)), 50, total_error)
-
-  !  Set bad offset for selection 
-  offset(1:2) = (/5,-5/)
-  CALL H5Soffset_simple_f(sid, offset, error)
-  CALL check("H5Soffset_simple_f", error, total_error)
-
-  !  Get bounds for hyperslab selection with negative offset 
-  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
-  CALL VERIFY("h5sget_select_bounds_f", error, -1, total_error)
-
-  ! Set valid offset for selection 
-  offset(1:2) = (/5,-2/)
-  CALL H5Soffset_simple_f(sid, offset, error)
-  CALL check("H5Soffset_simple_f", error, total_error)
-
-  ! Get bounds for hyperslab selection with offset 
-  CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error)
-  CALL check("h5sget_select_bounds_f", error, total_error)
-
-  CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(1)), 8, total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(2)), 1, total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(1)), 55, total_error)
-  CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(2)), 48, total_error)
-
-  ! Reset offset for selection 
-  offset(1:2) = 0
-  CALL H5Soffset_simple_f(sid, offset, error)
-  CALL check("H5Soffset_simple_f", error, total_error)
-
-  ! Close the dataspace 
-  CALL h5sclose_f(sid, error)
-  CALL check("h5sclose_f", error, total_error)
-
-END SUBROUTINE test_select_bounds
-
-END MODULE TH5SSELECT
diff --git a/fortran/test/tH5T.F90 b/fortran/test/tH5T.F90
new file mode 100644
index 0000000..efbceea
--- /dev/null
+++ b/fortran/test/tH5T.F90
@@ -0,0 +1,1149 @@
+!****h* root/fortran/test/tH5T.f90
+!
+! NAME
+!  tH5T.f90
+!
+! FUNCTION
+!  Basic testing of Fortran H5T APIs.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! CONTAINS SUBROUTINES
+!  compoundtest, basic_data_type_test, enumtest, test_derived_flt
+!
+!*****
+
+MODULE TH5T
+
+  USE HDF5
+  USE TH5_MISC
+  USE TH5_MISC_GEN
+
+CONTAINS
+
+    SUBROUTINE compoundtest(cleanup, total_error)
+!
+! This program creates a dataset that is one dimensional array of
+! structures  {
+!                 character*2
+!                 integer
+!                 double precision
+!                 real
+!                                   }
+! Data is written and read back by fields.
+!
+! The following H5T interface functions are tested:
+! h5tcopy_f, h5tset(get)_size_f, h5tcreate_f, h5tinsert_f,  h5tclose_f,
+! h5tget_class_f, h5tget_member_name_f, h5tget_member_offset_f, h5tget_member_type_f,
+! h5tequal_f, h5tinsert_array_f, h5tcommit_f, h5tencode_f, h5tdecode_f
+
+
+     IMPLICIT NONE
+     LOGICAL, INTENT(IN)  :: cleanup
+     INTEGER, INTENT(OUT) :: total_error
+
+     CHARACTER(LEN=8), PARAMETER :: filename = "compound" ! File name
+     CHARACTER(LEN=80) :: fix_filename
+     CHARACTER(LEN=8), PARAMETER :: dsetname = "Compound"     ! Dataset name
+     INTEGER, PARAMETER :: dimsize = 6 ! Size of the dataset
+     INTEGER, PARAMETER :: COMP_NUM_MEMBERS = 4 ! Number of members in the compound datatype
+
+     INTEGER(HID_T) :: file_id       ! File identifier
+     INTEGER(HID_T) :: dset_id       ! Dataset identifier
+     INTEGER(HID_T) :: dspace_id     ! Dataspace identifier
+     INTEGER(HID_T) :: dtype_id      ! Compound datatype identifier
+     INTEGER(HID_T) :: dtarray_id    ! Compound datatype identifier
+     INTEGER(HID_T) :: arrayt_id    ! Array datatype identifier
+     INTEGER(HID_T) :: dt1_id      ! Memory datatype identifier (for character field)
+     INTEGER(HID_T) :: dt2_id      ! Memory datatype identifier (for integer field)
+     INTEGER(HID_T) :: dt3_id      ! Memory datatype identifier (for double precision field)
+     INTEGER(HID_T) :: dt4_id      ! Memory datatype identifier (for real field)
+     INTEGER(HID_T) :: dt5_id      ! Memory datatype identifier
+     INTEGER(HID_T) :: membtype_id ! Datatype identifier
+     INTEGER(HID_T) :: plist_id    ! Dataset trasfer property
+
+
+     INTEGER(HSIZE_T), DIMENSION(1) :: dims = (/dimsize/) ! Dataset dimensions
+     INTEGER     ::   rank = 1                            ! Dataset rank
+
+     INTEGER     ::   error ! Error flag
+     INTEGER(SIZE_T)     ::   type_size  ! Size of the datatype
+     INTEGER(SIZE_T)     ::   type_sizec  ! Size of the character datatype
+     INTEGER(SIZE_T)     ::   type_sizei  ! Size of the integer datatype
+     INTEGER(SIZE_T)     ::   type_sized  ! Size of the double precision datatype
+     INTEGER(SIZE_T)     ::   type_sizer  ! Size of the real datatype
+     INTEGER(SIZE_T)     ::   offset     ! Member's offset
+     INTEGER(SIZE_T)     ::   offset_out     ! Member's offset
+     CHARACTER(LEN=2), DIMENSION(dimsize)      :: char_member
+     CHARACTER(LEN=2), DIMENSION(dimsize)      :: char_member_out ! Buffer to read data out
+     INTEGER, DIMENSION(dimsize)          :: int_member
+     INTEGER, DIMENSION(dimsize)          :: int_member_out
+     REAL(KIND=Fortran_DOUBLE), DIMENSION(dimsize) :: double_member
+     REAL(KIND=Fortran_DOUBLE), DIMENSION(dimsize) :: double_member_out
+     REAL, DIMENSION(dimsize)             :: real_member
+     REAL, DIMENSION(dimsize)             :: real_member_out
+     INTEGER :: i
+     INTEGER :: class ! Datatype class
+     INTEGER :: num_members ! Number of members in the compound datatype
+     CHARACTER(LEN=256) :: member_name
+     INTEGER :: len ! Lenght of the name of the compound datatype member
+     INTEGER :: member_index ! index of the field
+     INTEGER(HSIZE_T), DIMENSION(3) :: array_dims=(/2,3,4/)
+     INTEGER :: array_dims_range = 3
+     INTEGER :: elements = 24 ! number of elements in the array_dims array.
+     INTEGER(SIZE_T) :: sizechar
+     INTEGER(HSIZE_T), DIMENSION(1) :: data_dims
+     LOGICAL :: flag = .TRUE.
+
+     CHARACTER(LEN=1024) :: cmpd_buf
+     INTEGER(SIZE_T) :: cmpd_buf_size=0
+     INTEGER(HID_T) :: decoded_tid1
+
+     INTEGER(HID_T) :: fixed_str1, fixed_str2
+     LOGICAL :: are_equal
+     INTEGER(SIZE_T), PARAMETER :: str_size = 10 
+     INTEGER(SIZE_T) :: query_size
+
+     ! Test h5tcreate_f with H5T_STRING_F option:
+     !   Create fixed-length string in two ways and make sure they are the same
+
+     CALL h5tcopy_f(H5T_FORTRAN_S1, fixed_str1, error)
+     CALL check("h5tcopy_f", error, total_error)
+     CALL h5tset_size_f(fixed_str1, str_size, error)
+     CALL check("h5tset_size_f", error, total_error)
+     CALL h5tset_strpad_f(fixed_str1, H5T_STR_NULLTERM_F, error)
+     CALL check("h5tset_strpad_f", error, total_error)
+     
+     CALL h5tcreate_f(H5T_STRING_F, str_size, fixed_str2, error)
+     CALL check("h5tcreate_f", error, total_error)
+     CALL h5tset_strpad_f(fixed_str2, H5T_STR_NULLTERM_F, error)
+     CALL check("h5tset_strpad_f", error, total_error)
+     
+     CALL h5tequal_f(fixed_str1, fixed_str2, are_equal, error)
+     IF(.NOT.are_equal)THEN
+        CALL check("h5tcreate_f", -1, total_error)
+     ENDIF
+     
+     CALL h5tget_size_f(fixed_str1, query_size, error)
+     CALL check("h5tget_size_f", error, total_error)
+     
+     IF(query_size.NE.str_size)THEN
+        CALL check("h5tget_size_f", -1, total_error)
+     ENDIF
+     
+     CALL h5tget_size_f(fixed_str2, query_size, error)
+     CALL check("h5tget_size_f", error, total_error)
+
+     IF(query_size.NE.str_size)THEN
+        CALL check("h5tget_size_f", -1, total_error)
+     ENDIF
+     
+     CALL h5tclose_f(fixed_str1,error)
+     CALL check("h5tclose_f", error, total_error)
+     
+     CALL h5tclose_f(fixed_str2,error)
+     CALL check("h5tclose_f", error, total_error)
+     data_dims(1) = dimsize
+     !
+     ! Initialize data buffer.
+     !
+     do i = 1, dimsize
+        char_member(i)(1:1) = char(65+i)
+        char_member(i)(2:2) = char(65+i)
+        char_member_out(i)(1:1)   = char(65)
+        char_member_out(i)(2:2)   = char(65)
+        int_member(i)   = i
+        int_member_out(i)   = 0
+        double_member(i)   = 2.* i
+        double_member_out(i)   = 0.
+        real_member(i)   = 3. * i
+        real_member_out(i)   = 0.
+     enddo
+
+     !
+     ! Set dataset transfer property to preserve partially initialized fields
+     ! during write/read to/from dataset with compound datatype.
+     !
+     CALL h5pcreate_f(H5P_DATASET_XFER_F, plist_id, error)
+     CALL check("h5pcreate_f", error, total_error)
+     CALL h5pset_preserve_f(plist_id, flag, error)
+     CALL check("h5pset_preserve_f", error, total_error)
+     !
+     ! Create a new file using default properties.
+     !
+      CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+          if (error .ne. 0) then
+              write(*,*) "Cannot modify filename"
+              stop
+          endif
+     CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
+     CALL check("h5fcreate_f", error, total_error)
+
+     !
+     ! Create the dataspace.
+     !
+     CALL h5screate_simple_f(rank, dims, dspace_id, error)
+     CALL check("h5screate_simple_f", error, total_error)
+     !
+     ! Create compound datatype.
+     !
+     ! First calculate total size by calculating sizes of each member
+     !
+     CALL h5tcopy_f(H5T_NATIVE_CHARACTER, dt5_id, error)
+     CALL check("h5tcopy_f", error, total_error)
+     sizechar = 2
+     CALL h5tset_size_f(dt5_id, sizechar, error)
+     CALL check("h5tset_size_f", error, total_error)
+     CALL h5tget_size_f(dt5_id, type_sizec, error)
+     CALL check("h5tget_size_f", error, total_error)
+     CALL h5tget_size_f(H5T_NATIVE_INTEGER, type_sizei, error)
+     CALL check("h5tget_size_f", error, total_error)
+     CALL h5tget_size_f(H5T_NATIVE_DOUBLE, type_sized, error)
+     CALL check("h5tget_size_f", error, total_error)
+     CALL h5tget_size_f(H5T_NATIVE_REAL, type_sizer, error)
+     CALL check("h5tget_size_f", error, total_error)
+     !write(*,*) "get sizes", type_sizec, type_sizei, type_sizer, type_sized
+     type_size = type_sizec + type_sizei + type_sized + type_sizer
+     CALL h5tcreate_f(H5T_COMPOUND_F, type_size, dtype_id, error)
+     CALL check("h5tcreate_f", error, total_error)
+     !
+     ! Insert memebers
+     !
+     ! CHARACTER*2 memeber
+     !
+     offset = 0
+     CALL h5tinsert_f(dtype_id, "char_field", offset, dt5_id, error)
+     CALL check("h5tinsert_f", error, total_error)
+     !
+     ! INTEGER member
+     !
+     offset = offset + type_sizec ! Offset of the second memeber is 2
+     CALL h5tinsert_f(dtype_id, "integer_field", offset, H5T_NATIVE_INTEGER, error)
+     CALL check("h5tinsert_f", error, total_error)
+     !
+     ! DOUBLE PRECISION member
+     !
+     offset = offset + type_sizei  ! Offset of the third memeber is 6
+     CALL h5tinsert_f(dtype_id, "double_field", offset, H5T_NATIVE_DOUBLE, error)
+     CALL check("h5tinsert_f", error, total_error)
+     !
+     ! REAL member
+     !
+     offset = offset + type_sized  ! Offset of the last member is 14
+     CALL h5tinsert_f(dtype_id, "real_field", offset, H5T_NATIVE_REAL, error)
+     CALL check("h5tinsert_f", error, total_error)
+     !
+     ! Create the dataset with compound datatype.
+     !
+     CALL h5dcreate_f(file_id, dsetname, dtype_id, dspace_id, &
+                      dset_id, error)
+     CALL check("h5dcreate_f", error, total_error)
+     !
+     ! Create memory types. We have to create a compound datatype
+     ! for each member we want to write.
+     !
+     CALL h5tcreate_f(H5T_COMPOUND_F, type_sizec, dt1_id, error)
+     CALL check("h5tcreate_f", error, total_error)
+     offset = 0
+     CALL h5tinsert_f(dt1_id, "char_field", offset, dt5_id, error)
+     CALL check("h5tinsert_f", error, total_error)
+     !
+     CALL h5tcreate_f(H5T_COMPOUND_F, type_sizei, dt2_id, error)
+     CALL check("h5tcreate_f", error, total_error)
+     offset = 0
+     CALL h5tinsert_f(dt2_id, "integer_field", offset, H5T_NATIVE_INTEGER, error)
+     CALL check("h5tinsert_f", error, total_error)
+     !
+     CALL h5tcreate_f(H5T_COMPOUND_F, type_sized, dt3_id, error)
+     CALL check("h5tcreate_f", error, total_error)
+     offset = 0
+     CALL h5tinsert_f(dt3_id, "double_field", offset, H5T_NATIVE_DOUBLE, error)
+     CALL check("h5tinsert_f", error, total_error)
+     !
+     CALL h5tcreate_f(H5T_COMPOUND_F, type_sizer, dt4_id, error)
+     CALL check("h5tcreate_f", error, total_error)
+     offset = 0
+     CALL h5tinsert_f(dt4_id, "real_field", offset, H5T_NATIVE_REAL, error)
+     CALL check("h5tinsert_f", error, total_error)
+     !
+     ! Write data by fields in the datatype. Fields order is not important.
+     !
+     CALL h5dwrite_f(dset_id, dt4_id, real_member, data_dims, error, xfer_prp = plist_id)
+     CALL check("h5dwrite_f", error, total_error)
+     CALL h5dwrite_f(dset_id, dt1_id, char_member, data_dims, error, xfer_prp = plist_id)
+     CALL check("h5dwrite_f", error, total_error)
+     CALL h5dwrite_f(dset_id, dt3_id, double_member, data_dims, error, xfer_prp = plist_id)
+     CALL check("h5dwrite_f", error, total_error)
+     CALL h5dwrite_f(dset_id, dt2_id, int_member, data_dims, error, xfer_prp = plist_id)
+     CALL check("h5dwrite_f", error, total_error)
+
+     !
+     ! End access to the dataset and release resources used by it.
+     !
+     CALL h5dclose_f(dset_id, error)
+     CALL check("h5dclose_f", error, total_error)
+
+     !
+     ! Terminate access to the data space.
+     !
+     CALL h5sclose_f(dspace_id, error)
+     CALL check("h5sclose_f", error, total_error)
+     !
+     ! Terminate access to the datatype
+     !
+     CALL h5tclose_f(dtype_id, error)
+     CALL check("h5tclose_f", error, total_error)
+     CALL h5tclose_f(dt1_id, error)
+     CALL check("h5tclose_f", error, total_error)
+     CALL h5tclose_f(dt2_id, error)
+     CALL check("h5tclose_f", error, total_error)
+     CALL h5tclose_f(dt3_id, error)
+     CALL check("h5tclose_f", error, total_error)
+     CALL h5tclose_f(dt4_id, error)
+     CALL check("h5tclose_f", error, total_error)
+     !
+     ! Create and store compound datatype with the character and
+     ! array members.
+     !
+     type_size = type_sizec + elements*type_sizer ! Size of compound datatype
+     CALL h5tcreate_f(H5T_COMPOUND_F, type_size, dtarray_id, error)
+     CALL check("h5tcreate_f", error, total_error)
+     offset = 0
+     CALL h5tinsert_f(dtarray_id, "char_field", offset, H5T_NATIVE_CHARACTER, error)
+     CALL check("h5tinsert_f", error, total_error)
+     offset = type_sizec
+     CALL h5tarray_create_f(H5T_NATIVE_REAL, array_dims_range, array_dims, arrayt_id, error)
+     CALL check("h5tarray_create_f", error, total_error)
+     CALL h5tinsert_f(dtarray_id,"array_field", offset, arrayt_id, error)
+     CALL check("h5tinsert_f", error, total_error)
+     CALL h5tcommit_f(file_id, "Compound_with_array_member", dtarray_id, error)
+     CALL check("h5tcommit_f", error, total_error)
+     CALL h5tclose_f(arrayt_id, error)
+     CALL check("h5tclose_f", error, total_error)
+     CALL h5tclose_f(dtarray_id, error)
+     CALL check("h5tclose_f", error, total_error)
+
+     !
+     ! Close the file.
+     !
+     CALL h5fclose_f(file_id, error)
+     CALL check("h5fclose_f", error, total_error)
+
+     !
+     ! Open the file.
+     !
+     CALL h5fopen_f (fix_filename, H5F_ACC_RDWR_F, file_id, error)
+     CALL check("h5fopen_f", error, total_error)
+     !
+     ! Open the dataset.
+     !
+     CALL h5dopen_f(file_id, dsetname, dset_id, error)
+     CALL check("h5dopen_f", error, total_error)
+     !
+     ! Get datatype of the open dataset.
+     ! Check it class, number of members,  and member's names.
+     !
+     CALL h5dget_type_f(dset_id, dtype_id, error)
+     CALL check("h5dget_type_f", error, total_error)
+     CALL h5tget_class_f(dtype_id, class, error)
+     CALL check("h5dget_class_f", error, total_error)
+         if (class .ne. H5T_COMPOUND_F) then
+            write(*,*) " Wrong class type returned"
+            total_error = total_error + 1
+         endif
+     CALL h5tget_nmembers_f(dtype_id, num_members, error)
+     CALL check("h5dget_nmembers_f", error, total_error)
+         if (num_members .ne. COMP_NUM_MEMBERS ) then
+            write(*,*) " Wrong number of members returned"
+            total_error = total_error + 1
+         endif
+     !
+     !  Go through the members and find out their names and offsets.
+     !  Also see if name corresponds to the index
+     !
+     do i = 1, num_members
+        CALL h5tget_member_name_f(dtype_id, i-1, member_name, len, error)
+     CALL check("h5tget_member_name_f", error, total_error)
+        CALL h5tget_member_offset_f(dtype_id, i-1, offset_out, error)
+     CALL check("h5tget_member_offset_f", error, total_error)
+        CALL h5tget_member_index_f(dtype_id, member_name(1:len), member_index, error)
+     CALL check("h5tget_member_index_f", error, total_error)
+         if(member_index .ne. i-1) then
+            write(*,*) "Index returned is incorrect"
+            write(*,*) member_index, i-1
+            total_error = total_error + 1
+            endif
+
+        CHECK_NAME: SELECT CASE (member_name(1:len))
+        CASE("char_field")
+             if(offset_out .ne. 0) then
+               write(*,*) "Offset of the char member is incorrect"
+               total_error = total_error + 1
+             endif
+         CALL h5tget_member_type_f(dtype_id, i-1, membtype_id, error)
+          CALL check("h5tget_member_type_f", error, total_error)
+         CALL h5tequal_f(membtype_id, dt5_id, flag, error)
+          CALL check("h5tequal_f", error, total_error)
+             if(.not. flag) then
+                write(*,*) "Wrong member type returned for character member"
+                total_error = total_error + 1
+             endif
+         CALL h5tget_member_class_f(dtype_id, i-1, class, error)
+          CALL check("h5tget_member_class_f",error, total_error)
+              if (class .ne. H5T_STRING_F) then
+                 write(*,*) "Wrong class returned for character member"
+                 total_error = total_error + 1
+              endif
+        CASE("integer_field")
+             if(offset_out .ne. type_sizec) then
+               write(*,*) "Offset of the integer member is incorrect"
+               total_error = total_error + 1
+             endif
+         CALL h5tget_member_type_f(dtype_id, i-1, membtype_id, error)
+          CALL check("h5tget_member_type_f", error, total_error)
+         CALL h5tequal_f(membtype_id, H5T_NATIVE_INTEGER, flag, error)
+          CALL check("h5tequal_f", error, total_error)
+             if(.not. flag) then
+                write(*,*) "Wrong member type returned for integer memebr"
+                total_error = total_error + 1
+             endif
+         CALL h5tget_member_class_f(dtype_id, i-1, class, error)
+          CALL check("h5tget_member_class_f",error, total_error)
+              if (class .ne. H5T_INTEGER_F) then
+                 write(*,*) "Wrong class returned for INTEGER member"
+                 total_error = total_error + 1
+              endif
+        CASE("double_field")
+             if(offset_out .ne. (type_sizec+type_sizei)) then
+               write(*,*) "Offset of the double precision member is incorrect"
+               total_error = total_error + 1
+             endif
+         CALL h5tget_member_type_f(dtype_id, i-1, membtype_id, error)
+          CALL check("h5tget_member_type_f", error, total_error)
+         CALL h5tequal_f(membtype_id, H5T_NATIVE_DOUBLE, flag, error)
+          CALL check("h5tequal_f", error, total_error)
+             if(.not. flag) then
+                write(*,*) "Wrong member type returned for double precision memebr"
+                total_error = total_error + 1
+             endif
+         CALL h5tget_member_class_f(dtype_id, i-1, class, error)
+          CALL check("h5tget_member_class_f",error, total_error)
+              if (class .ne. H5T_FLOAT_F) then
+                 write(*,*) "Wrong class returned for double precision member"
+                 total_error = total_error + 1
+              endif
+        CASE("real_field")
+             if(offset_out .ne. (type_sizec+type_sizei+type_sized)) then
+               write(*,*) "Offset of the real member is incorrect"
+               total_error = total_error + 1
+             endif
+         CALL h5tget_member_type_f(dtype_id, i-1, membtype_id, error)
+          CALL check("h5tget_member_type_f", error, total_error)
+         CALL h5tequal_f(membtype_id, H5T_NATIVE_REAL, flag, error)
+          CALL check("h5tequal_f", error, total_error)
+             if(.not. flag) then
+                write(*,*) "Wrong member type returned for real memebr"
+                total_error = total_error + 1
+             endif
+         CALL h5tget_member_class_f(dtype_id, i-1, class, error)
+          CALL check("h5tget_member_class_f",error, total_error)
+              if (class .ne. H5T_FLOAT_F) then
+                 write(*,*) "Wrong class returned for real member"
+                 total_error = total_error + 1
+              endif
+        CASE DEFAULT
+               write(*,*) "Wrong member's name"
+               total_error = total_error + 1
+
+        END SELECT CHECK_NAME
+
+     enddo
+     !
+     ! Create memory datatype to read character member of the compound datatype.
+     !
+     CALL h5tcopy_f(H5T_NATIVE_CHARACTER, dt2_id, error)
+     CALL check("h5tcopy_f", error, total_error)
+     sizechar = 2
+     CALL h5tset_size_f(dt2_id, sizechar, error)
+     CALL check("h5tset_size_f", error, total_error)
+     CALL h5tget_size_f(dt2_id, type_size, error)
+     CALL check("h5tget_size_f", error, total_error)
+     CALL h5tcreate_f(H5T_COMPOUND_F, type_size, dt1_id, error)
+     CALL check("h5tcreate_f", error, total_error)
+     offset = 0
+     CALL h5tinsert_f(dt1_id, "char_field", offset, dt2_id, error)
+     CALL check("h5tinsert_f", error, total_error)
+     !
+     ! Read part of the dataset
+     !
+     CALL h5dread_f(dset_id, dt1_id, char_member_out, data_dims, error)
+     CALL check("h5dread_f", error, total_error)
+         do i = 1, dimsize
+            if (char_member_out(i) .ne. char_member(i)) then
+                write(*,*) " Wrong character data is read back "
+                total_error = total_error + 1
+            endif
+         enddo
+     !
+     CALL h5tcreate_f(H5T_COMPOUND_F, type_sizei, dt5_id, error)
+     CALL check("h5tcreate_f", error, total_error)
+     offset = 0
+     CALL h5tinsert_f(dt5_id, "integer_field", offset, H5T_NATIVE_INTEGER, error)
+     CALL check("h5tinsert_f", error, total_error)
+     !
+     ! Read part of the dataset
+     !
+     CALL h5dread_f(dset_id, dt5_id, int_member_out, data_dims, error)
+     CALL check("h5dread_f", error, total_error)
+         do i = 1, dimsize
+            if (int_member_out(i) .ne. int_member(i)) then
+                write(*,*) " Wrong integer data is read back "
+                total_error = total_error + 1
+            endif
+         enddo
+     !
+     !
+     CALL h5tcreate_f(H5T_COMPOUND_F, type_sized, dt3_id, error)
+     CALL check("h5tcreate_f", error, total_error)
+     offset = 0
+     CALL h5tinsert_f(dt3_id, "double_field", offset, H5T_NATIVE_DOUBLE, error)
+     CALL check("h5tinsert_f", error, total_error)
+     !
+     ! Read part of the dataset
+     !
+     CALL h5dread_f(dset_id, dt3_id, double_member_out, data_dims, error)
+     CALL check("h5dread_f", error, total_error)
+     DO i = 1, dimsize
+        CALL VERIFY("h5dread_f:Wrong double precision data is read back", double_member_out(i), double_member(i), total_error)   
+     ENDDO
+     !
+     !
+     CALL h5tcreate_f(H5T_COMPOUND_F, type_sizer, dt4_id, error)
+     CALL check("h5tcreate_f", error, total_error)
+     offset = 0
+     CALL h5tinsert_f(dt4_id, "real_field", offset, H5T_NATIVE_REAL, error)
+     CALL check("h5tinsert_f", error, total_error)
+     !
+     ! Read part of the dataset
+     !
+     CALL h5dread_f(dset_id, dt4_id, real_member_out, data_dims, error)
+     CALL check("h5dread_f", error, total_error)
+     DO i = 1, dimsize
+        CALL VERIFY("h5dread_f:Wrong double precision data is read back", real_member_out(i), real_member(i), total_error)   
+     ENDDO
+     !
+     ! *-----------------------------------------------------------------------
+     ! * Test encoding and decoding compound datatypes
+     ! *-----------------------------------------------------------------------
+     !
+     !     Encode compound type in a buffer 
+     !         -- First find the buffer size
+
+     CALL H5Tencode_f(dtype_id, cmpd_buf, cmpd_buf_size, error)
+     CALL check("H5Tencode_f", error, total_error)
+
+     !  Try decoding bogus buffer 
+
+     CALL H5Tdecode_f(cmpd_buf, decoded_tid1, error)
+     CALL verify("H5Tdecode_f", error, -1, total_error)
+
+     CALL H5Tencode_f(dtype_id, cmpd_buf, cmpd_buf_size, error)
+     CALL check("H5Tencode_f", error, total_error)
+
+     !  Decode from the compound buffer and return an object handle 
+     CALL H5Tdecode_f(cmpd_buf, decoded_tid1, error)
+     CALL check("H5Tdecode_f", error, total_error)
+
+     !  Verify that the datatype was copied exactly 
+
+     CALL H5Tequal_f(decoded_tid1, dtype_id, flag, error)
+     CALL check("H5Tequal_f", error, total_error)
+     CALL verify("H5Tequal_f", flag, .TRUE., total_error)
+     !
+     ! Close all open objects.
+     !
+     CALL h5dclose_f(dset_id, error)
+     CALL check("h5dclose_f", error, total_error)
+     CALL h5tclose_f(dt1_id, error)
+     CALL check("h5tclose_f", error, total_error)
+     CALL h5tclose_f(dt2_id, error)
+     CALL check("h5tclose_f", error, total_error)
+     CALL h5tclose_f(dt3_id, error)
+     CALL check("h5tclose_f", error, total_error)
+     CALL h5tclose_f(dt4_id, error)
+     CALL check("h5tclose_f", error, total_error)
+     CALL h5tclose_f(dt5_id, error)
+     CALL check("h5tclose_f", error, total_error)
+     CALL h5fclose_f(file_id, error)
+     CALL check("h5fclose_f", error, total_error)
+
+     IF(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+     CALL check("h5_cleanup_f", error, total_error)
+     RETURN
+     END SUBROUTINE compoundtest
+
+
+
+
+    SUBROUTINE basic_data_type_test(total_error)
+
+!   This subroutine tests following functionalities:
+!   H5tget_precision_f, H5tset_precision_f, H5tget_offset_f
+!   H5tset_offset_f, H5tget_pad_f, H5tset_pad_f, H5tget_sign_f,
+!   H5tset_sign_f, H5tget_ebias_f,H5tset_ebias_f, H5tget_norm_f,
+!   H5tset_norm_f, H5tget_inpad_f, H5tset_inpad_f, H5tget_cset_f,
+!   H5tset_cset_f, H5tget_strpad_f, H5tset_strpad_f
+
+     IMPLICIT NONE
+     INTEGER, INTENT(OUT) :: total_error
+
+     INTEGER(HID_T) :: dtype1_id, dtype2_id, dtype3_id, dtype4_id, dtype5_id
+                                     ! datatype identifiers
+     INTEGER(SIZE_T) :: precision ! Datatype precision
+     INTEGER(SIZE_T) :: setprecision ! Datatype precision
+     INTEGER(SIZE_T) :: offset ! Datatype offset
+     INTEGER(SIZE_T) :: setoffset ! Datatype offset
+     INTEGER :: lsbpad !padding type of the least significant bit
+     INTEGER :: msbpad !padding type of the most significant bit
+     INTEGER :: sign !sign type for an integer type
+     INTEGER(SIZE_T) :: ebias1 !Datatype exponent bias of a floating-point type
+     INTEGER(SIZE_T) :: ebias2 !Datatype exponent bias of a floating-point type
+     INTEGER(SIZE_T) :: setebias
+     INTEGER :: norm   !mantissa normalization of a floating-point datatype
+     INTEGER :: inpad   !padding type for unused bits in floating-point datatypes.
+     INTEGER :: cset   !character set type of a string datatype
+     INTEGER :: strpad !string padding method for a string datatype
+     INTEGER :: error !error flag
+
+
+     !
+     ! Create a datatype
+     !
+     CALL h5tcopy_f(H5T_STD_U16BE, dtype1_id, error)
+     CALL check("h5tcopy_f",error,total_error)
+     !
+     !datatype type_id should be modifiable after h5tcopy_f
+     !
+     setprecision = 12
+     CALL h5tset_precision_f(dtype1_id, setprecision, error)
+     CALL check("h5set_precision_f",error,total_error)
+     CALL h5tget_precision_f(dtype1_id,precision, error)
+     CALL check("h5get_precision_f",error,total_error)
+     if(precision .ne. 12) then
+         write (*,*) "got precision is not correct"
+         total_error = total_error + 1
+     end if
+
+     CALL h5tcopy_f(H5T_STD_I32LE, dtype2_id, error)
+     CALL check("h5tcopy_f",error,total_error)
+     setprecision = 12
+     CALL h5tset_precision_f(dtype2_id, setprecision, error)
+     CALL check("h5set_precision_f",error,total_error)
+
+     setoffset = 2
+     CALL h5tset_offset_f(dtype1_id, setoffset, error)
+     CALL check("h5set_offset_f",error,total_error)
+     setoffset = 10
+     CALL h5tset_offset_f(dtype2_id, setoffset, error)
+     CALL check("h5set_offset_f",error,total_error)
+     CALL h5tget_offset_f(dtype2_id,offset, error)
+     CALL check("h5get_offset_f",error,total_error)
+     if(offset .ne. 10) then
+         write (*,*) "got offset is not correct"
+         total_error = total_error + 1
+     end if
+
+     CALL h5tset_pad_f(dtype2_id,H5T_PAD_ONE_F, H5T_PAD_ONE_F, error)
+     CALL check("h5set_pad_f",error,total_error)
+     CALL h5tget_pad_f(dtype2_id,lsbpad,msbpad, error)
+     CALL check("h5get_pad_f",error,total_error)
+     if((lsbpad .ne. H5T_PAD_ONE_F) .and. (msbpad .ne. H5T_PAD_ONE_F)) then
+         write (*,*) "got pad is not correct"
+         total_error = total_error + 1
+     end if
+
+!     CALL h5tset_sign_f(dtype2_id,H5T_SGN_2_F, error)
+!     CALL check("h5set_sign_f",error,total_error)
+!     CALL h5tget_sign_f(dtype2_id,sign, error)
+     CALL h5tget_sign_f(H5T_NATIVE_INTEGER, sign, error)
+     CALL check("h5tget_sign_f",error,total_error)
+     if(sign .ne. H5T_SGN_2_F ) then
+         write (*,*) "got sign is not correct"
+         total_error = total_error + 1
+     end if
+
+     CALL h5tcopy_f(H5T_IEEE_F64BE, dtype3_id, error)
+     CALL check("h5tcopy_f",error,total_error)
+     CALL h5tcopy_f(H5T_IEEE_F32LE, dtype4_id, error)
+     CALL check("h5tcopy_f",error,total_error)
+
+     setebias = 257
+     CALL h5tset_ebias_f(dtype3_id, setebias, error)
+     CALL check("h5tset_ebias_f",error,total_error)
+     setebias = 1
+     CALL h5tset_ebias_f(dtype4_id, setebias, error)
+     CALL check("h5tset_ebias_f",error,total_error)
+     CALL h5tget_ebias_f(dtype3_id, ebias1, error)
+     CALL check("h5tget_ebias_f",error,total_error)
+     if(ebias1 .ne. 257 ) then
+         write (*,*) "got ebias is not correct"
+         total_error = total_error + 1
+     end if
+     CALL h5tget_ebias_f(dtype4_id, ebias2, error)
+     CALL check("h5tget_ebias_f",error,total_error)
+     if(ebias2 .ne. 1 ) then
+         write (*,*) "got ebias is not correct"
+         total_error = total_error + 1
+     end if
+
+     !attention:
+     !It seems that I can't use H5T_NORM_IMPLIED_F to set the norm value
+     !because I got error for the get_norm function
+!     CALL h5tset_norm_f(dtype3_id,H5T_NORM_IMPLIED_F , error)
+!     CALL check("h5tset_norm_f",error,total_error)
+!     CALL h5tget_norm_f(dtype3_id, norm, error)
+!     CALL check("h5tget_norm_f",error,total_error)
+!     if(norm .ne. H5T_NORM_IMPLIED_F ) then
+!         write (*,*) "got norm is not correct"
+!         total_error = total_error + 1
+!     end if
+     CALL h5tset_norm_f(dtype3_id, H5T_NORM_MSBSET_F , error)
+     CALL check("h5tset_norm_f",error,total_error)
+     CALL h5tget_norm_f(dtype3_id, norm, error)
+     CALL check("h5tget_norm_f",error,total_error)
+     if(norm .ne. H5T_NORM_MSBSET_F ) then
+         write (*,*) "got norm is not correct"
+         total_error = total_error + 1
+     end if
+
+     CALL h5tset_norm_f(dtype3_id, H5T_NORM_NONE_F , error)
+     CALL check("h5tset_norm_f",error,total_error)
+     CALL h5tget_norm_f(dtype3_id, norm, error)
+     CALL check("h5tget_norm_f",error,total_error)
+     if(norm .ne. H5T_NORM_NONE_F ) then
+         write (*,*) "got norm is not correct"
+         total_error = total_error + 1
+    end if
+
+     CALL h5tset_inpad_f(dtype3_id, H5T_PAD_ZERO_F , error)
+     CALL check("h5tset_inpad_f",error,total_error)
+     CALL h5tget_inpad_f(dtype3_id, inpad , error)
+     CALL check("h5tget_inpad_f",error,total_error)
+     if(inpad .ne. H5T_PAD_ZERO_F ) then
+         write (*,*) "got inpad is not correct"
+         total_error = total_error + 1
+     end if
+
+     CALL h5tset_inpad_f(dtype3_id,H5T_PAD_ONE_F  , error)
+     CALL check("h5tset_inpad_f",error,total_error)
+     CALL h5tget_inpad_f(dtype3_id, inpad , error)
+     CALL check("h5tget_inpad_f",error,total_error)
+     if(inpad .ne. H5T_PAD_ONE_F ) then
+         write (*,*) "got inpad is not correct"
+         total_error = total_error + 1
+     end if
+
+     CALL h5tset_inpad_f(dtype3_id,H5T_PAD_BACKGROUND_F  , error)
+     CALL check("h5tset_inpad_f",error,total_error)
+     CALL h5tget_inpad_f(dtype3_id, inpad , error)
+     CALL check("h5tget_inpad_f",error,total_error)
+     if(inpad .ne. H5T_PAD_BACKGROUND_F ) then
+         write (*,*) "got inpad is not correct"
+         total_error = total_error + 1
+     end if
+
+!     we should not apply h5tset_cset_f to non_character data typemake
+
+!     CALL h5tset_cset_f(dtype4_id, H5T_CSET_ASCII_F, error)
+!     CALL check("h5tset_cset_f",error,total_error)
+!     CALL h5tget_cset_f(dtype4_id, cset, error)
+!     CALL check("h5tget_cset_f",error,total_error)
+!     if(cset .ne. H5T_CSET_ASCII_F ) then
+!         write (*,*) "got cset is not correct"
+!         total_error = total_error + 1
+!     end if
+
+     CALL h5tcopy_f(H5T_NATIVE_CHARACTER, dtype5_id, error)
+     CALL check("h5tcopy_f",error,total_error)
+     CALL h5tset_cset_f(dtype5_id, H5T_CSET_ASCII_F, error)
+     CALL check("h5tset_cset_f",error,total_error)
+     CALL h5tget_cset_f(dtype5_id, cset, error)
+     CALL check("h5tget_cset_f",error,total_error)
+     if(cset .ne. H5T_CSET_ASCII_F ) then
+         write (*,*) "got cset is not correct"
+         total_error = total_error + 1
+     end if
+     CALL h5tset_strpad_f(dtype5_id, H5T_STR_NULLPAD_F, error)
+     CALL check("h5tset_strpad_f",error,total_error)
+     CALL h5tget_strpad_f(dtype5_id, strpad, error)
+     CALL check("h5tget_strpad_f",error,total_error)
+     if(strpad .ne. H5T_STR_NULLPAD_F ) then
+         write (*,*) "got strpad is not correct"
+         total_error = total_error + 1
+     end if
+
+     CALL h5tset_strpad_f(dtype5_id, H5T_STR_SPACEPAD_F, error)
+     CALL check("h5tset_strpad_f",error,total_error)
+     CALL h5tget_strpad_f(dtype5_id, strpad, error)
+     CALL check("h5tget_strpad_f",error,total_error)
+     if(strpad .ne. H5T_STR_SPACEPAD_F ) then
+         write (*,*) "got strpad is not correct"
+         total_error = total_error + 1
+     end if
+
+    CALL h5tclose_f(dtype1_id, error)
+    CALL check("h5tclose_f", error, total_error)
+    CALL h5tclose_f(dtype2_id, error)
+    CALL check("h5tclose_f", error, total_error)
+    CALL h5tclose_f(dtype3_id, error)
+    CALL check("h5tclose_f", error, total_error)
+    CALL h5tclose_f(dtype4_id, error)
+    CALL check("h5tclose_f", error, total_error)
+    CALL h5tclose_f(dtype5_id, error)
+    CALL check("h5tclose_f", error, total_error)
+
+
+     RETURN
+     END SUBROUTINE basic_data_type_test
+
+    SUBROUTINE enumtest(cleanup, total_error)
+
+    USE HDF5
+    USE TH5_MISC
+    IMPLICIT NONE
+
+    LOGICAL, INTENT(IN)  :: cleanup
+    INTEGER, INTENT(OUT) :: total_error
+    CHARACTER(LEN=4), PARAMETER :: filename="enum"
+    CHARACTER(LEN=80) :: fix_filename
+    CHARACTER(LEN=8), PARAMETER :: dsetname="enumdset"
+    CHARACTER(LEN=4)            :: true ="TRUE"
+    CHARACTER(LEN=5)            :: false="FALSE"
+    CHARACTER(LEN=5)            :: mem_name
+
+    INTEGER(HID_T) :: file_id
+    INTEGER(HID_T) :: dset_id
+    INTEGER(HID_T) :: dspace_id
+    INTEGER(HID_T) :: dtype_id, dtype, native_type
+    INTEGER        :: error
+    INTEGER        :: value
+    INTEGER(HSIZE_T), DIMENSION(1) :: dsize
+    INTEGER(SIZE_T) :: buf_size
+    INTEGER, DIMENSION(2) :: data
+    INTEGER(HSIZE_T), DIMENSION(7) :: dims
+    INTEGER :: order1, order2
+!    INTEGER(SIZE_T) :: type_size1, type_size2
+    INTEGER :: class
+
+    dims(1) = 2
+    dsize(1) = 2
+    data(1) = 1
+    data(2) = 0
+     !
+     ! Create a new file using default properties.
+     !
+    CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+    IF (error .NE. 0) THEN
+       WRITE(*,*) "Cannot modify filename"
+       STOP
+    ENDIF
+    CALL h5fcreate_f(fix_filename,H5F_ACC_TRUNC_F,file_id,error)
+    CALL check("h5fcreate_f", error, total_error)
+    !
+    ! Create enumeration datatype with tow values
+    !
+    CALL h5tenum_create_f(H5T_NATIVE_INTEGER,dtype_id,error)
+    CALL check("h5tenum_create_f", error, total_error)
+    CALL h5tenum_insert_f(dtype_id,true,DATA(1),error)
+    CALL check("h5tenum_insert_f", error, total_error)
+    CALL h5tenum_insert_f(dtype_id,false,DATA(2),error)
+    CALL check("h5tenum_insert_f", error, total_error)
+    !
+    ! Create write  and close a dataset with enum datatype
+    !
+    CALL h5screate_simple_f(1,dsize,dspace_id,error)
+    CALL check("h5screate_simple_f", error, total_error)
+    CALL h5dcreate_f(file_id,dsetname,dtype_id,dspace_id,dset_id,error)
+    CALL check("h5dcreate_f", error, total_error)
+    CALL h5dwrite_f(dset_id,dtype_id,DATA,dims,error)
+    CALL check("h5dwrite_f", error, total_error)
+
+    CALL H5Dget_type_f(dset_id, dtype, error)
+    CALL check("H5Dget_type_f", error, total_error)
+
+    CALL H5Tget_native_type_f(dtype, H5T_DIR_ASCEND_F, native_type, error)
+    CALL check("H5Tget_native_type_f",error, total_error)
+
+    ! Verify the datatype retrieved and converted 
+    CALL H5Tget_order_f(native_type, order1, error)
+    CALL check("H5Tget_order_f",error, total_error)
+    CALL H5Tget_order_f(H5T_NATIVE_INTEGER, order2, error)
+    CALL check("H5Tget_order_f",error, total_error)
+    CALL verify("H5Tget_native_type_f",order1, order2, total_error)
+
+    ! this test depends on whether -i8 was specified
+
+!!$    CALL H5Tget_size_f(native_type, type_size1, error)
+!!$    CALL check("H5Tget_size_f",error, total_error)
+!!$    CALL H5Tget_size_f(H5T_STD_I32BE, type_size2, error)
+!!$    CALL check("H5Tget_size_f",error, total_error)
+!!$    CALL verify("H5Tget_native_type_f", INT(type_size1), INT(type_size2), total_error)
+
+    CALL H5Tget_class_f(native_type, class, error)
+    CALL check("H5Tget_class_f",error, total_error)
+    CALL verify("H5Tget_native_type_f", INT(class), INT(H5T_ENUM_F), total_error)
+
+    CALL h5dclose_f(dset_id,error)
+    CALL check("h5dclose_f", error, total_error)
+    CALL h5sclose_f(dspace_id,error)
+    CALL check("h5sclose_f", error, total_error)
+    !
+    ! Get value of "TRUE"
+    !
+    CALL h5tenum_valueof_f(dtype_id, "TRUE", value, error)
+    CALL check("h5tenum_valueof_f", error, total_error)
+    IF (value .NE. 1) THEN
+       WRITE(*,*) " Value of TRUE is not 1, error"
+       total_error = total_error + 1
+    ENDIF
+    !
+    !  Get name of 0
+    !
+    value = 0
+    buf_size = 5
+    CALL h5tenum_nameof_f(dtype_id,  value, buf_size, mem_name, error)
+    CALL check("h5tenum_nameof_f", error, total_error)
+    IF (mem_name .NE. "FALSE") THEN
+       WRITE(*,*) " Wrong name for 0 value"
+       total_error = total_error + 1
+    ENDIF
+
+    CALL h5tclose_f(dtype_id,error)
+    CALL check("h5tclose_f", error, total_error)
+    CALL h5fclose_f(file_id,error)
+    CALL check("h5fclose_f", error, total_error)
+
+    IF(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+    CALL check("h5_cleanup_f", error, total_error)
+
+    RETURN
+  END SUBROUTINE enumtest
+
+!-------------------------------------------------------------------------
+! * Function:    test_derived_flt
+! *
+! * Purpose:     Tests user-define and query functions of floating-point types.
+! *              test h5tget/set_fields_f.
+! *
+! * Return:      Success:        0
+! *
+! *              Failure:        number of errors
+! *
+! * Fortran Programmer:  M.S. Breitenfeld
+! *                      September 9, 2008
+! *
+! * Modifications:
+! *
+! *-------------------------------------------------------------------------
+! 
+
+SUBROUTINE test_derived_flt(cleanup, total_error)
+
+
+  IMPLICIT NONE
+  LOGICAL, INTENT(IN)  :: cleanup
+  INTEGER, INTENT(OUT) :: total_error
+  INTEGER(hid_t) :: file=-1, tid1=-1, tid2=-1
+  INTEGER(hid_t) :: dxpl_id=-1
+  INTEGER(size_t) :: spos, epos, esize, mpos, msize
+
+  CHARACTER(LEN=15), PARAMETER :: filename="h5t_derived_flt"
+  CHARACTER(LEN=80) :: fix_filename
+
+  INTEGER(SIZE_T) :: precision1, offset1, ebias1, size1
+  INTEGER(SIZE_T) :: precision2, offset2, ebias2, size2
+
+  INTEGER :: error
+
+  ! Create File 
+  CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+  IF (error .NE. 0) THEN
+     WRITE(*,*) "Cannot modify filename"
+     STOP
+  ENDIF
+
+  CALL h5fcreate_f(fix_filename,H5F_ACC_TRUNC_F,file,error)
+  CALL check("h5fcreate_f", error, total_error)
+
+  CALL h5pcreate_f(H5P_DATASET_XFER_F, dxpl_id, error)
+  CALL check("h5pcreate_f", error, total_error)
+
+  CALL h5tcopy_f(H5T_IEEE_F64LE, tid1, error)
+  CALL check("h5tcopy_f",error,total_error)
+
+  CALL h5tcopy_f(H5T_IEEE_F32LE, tid2, error)
+  CALL check("h5tcopy_f",error,total_error)
+
+  !------------------------------------------------------------------------
+  ! *                   1st floating-point type
+  ! * size=7 byte, precision=42 bits, offset=3 bits, mantissa size=31 bits,
+  ! * mantissa position=3, exponent size=10 bits, exponent position=34,
+  ! * exponent bias=511.  It can be illustrated in little-endian order as
+  ! *
+  ! *          6       5       4       3       2       1       0
+  ! *    ???????? ???SEEEE EEEEEEMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMM???
+  ! *
+  ! * To create a new floating-point type, the following properties must be
+  ! * set in the order of
+  ! *   set fields -> set offset -> set precision -> set size.
+  ! * All these properties must be set before the type can function. Other
+  ! * properties can be set anytime.  Derived type size cannot be expanded
+  ! * bigger than original size but can be decreased.  There should be no
+  ! * holes among the significant bits.  Exponent bias usually is set
+  ! * 2^(n-1)-1, where n is the exponent size.
+  ! *-----------------------------------------------------------------------
+
+  CALL H5Tset_fields_f(tid1, INT(44,size_t), INT(34,size_t), INT(10,size_t), &
+       INT(3,size_t), INT(31,size_t), error)
+  CALL check("H5Tset_fields_f",error,total_error)
+
+  CALL H5Tset_offset_f(tid1, INT(3,size_t), error)
+  CALL check("H5Tset_offset_f",error,total_error)
+
+  CALL H5Tset_precision_f(tid1, INT(42,size_t), error)
+  CALL check("H5Tset_precision_f",error,total_error)
+
+  CALL H5Tset_size_f(tid1, INT(7,size_t), error)
+  CALL check("H5Tset_size_f",error,total_error)
+
+  CALL H5Tset_ebias_f(tid1, INT(511,size_t), error)
+  CALL check("H5Tset_ebias_f",error,total_error)
+
+  CALL H5Tset_pad_f(tid1, H5T_PAD_ZERO_F, H5T_PAD_ZERO_F, error)
+  CALL check("H5Tset_pad_f",error,total_error)
+
+  CALL h5tcommit_f(file, "new float type 1", tid1, error)
+  CALL check("h5tcommit_f", error, total_error)
+
+  CALL h5tclose_f(tid1, error)
+  CALL check("h5tclose_f", error, total_error)
+
+  CALL H5Topen_f(file, "new float type 1", tid1, error)
+  CALL check("H5Topen_f", error, total_error)
+
+  CALL H5Tget_fields_f(tid1, spos, epos, esize, mpos, msize, error)
+  CALL check("H5Tget_fields_f", error, total_error)
+
+  IF(spos.NE.44 .OR. epos.NE.34 .OR. esize.NE.10 .OR. mpos.NE.3 .OR. msize.NE.31)THEN
+     CALL verify("H5Tget_fields_f", -1, 0, total_error)
+  ENDIF
+
+  CALL H5Tget_precision_f(tid1, precision1, error)
+  CALL check("H5Tget_precision_f", error, total_error)
+  CALL verify("H5Tget_precision_f", INT(precision1), 42, total_error)
+
+  CALL H5Tget_offset_f(tid1, offset1, error)
+  CALL check("H5Tget_offset_f", error, total_error)
+  CALL verify("H5Tget_offset_f", INT(offset1), 3, total_error)
+
+  CALL H5Tget_size_f(tid1, size1, error)
+  CALL check("H5Tget_size_f", error, total_error)
+  CALL verify("H5Tget_size_f", INT(size1), 7, total_error)
+
+  CALL H5Tget_ebias_f(tid1, ebias1, error)
+  CALL check("H5Tget_ebias_f", error, total_error)
+  CALL verify("H5Tget_ebias_f", INT(ebias1), 511, total_error)
+
+  !--------------------------------------------------------------------------
+  ! *                   2nd floating-point type
+  ! * size=3 byte, precision=24 bits, offset=0 bits, mantissa size=16 bits,
+  ! * mantissa position=0, exponent size=7 bits, exponent position=16, exponent
+  ! * bias=63. It can be illustrated in little-endian order as
+  ! *
+  ! *          2       1       0
+  ! *    SEEEEEEE MMMMMMMM MMMMMMMM
+  ! *--------------------------------------------------------------------------
+
+  CALL H5Tset_fields_f(tid2, INT(23,size_t), INT(16,size_t), INT(7,size_t), &
+       INT(0,size_t), INT(16,size_t), error)
+  CALL check("H5Tset_fields_f",error,total_error)
+
+  CALL H5Tset_offset_f(tid2, INT(0,size_t), error)
+  CALL check("H5Tset_offset_f",error,total_error)
+
+  CALL H5Tset_precision_f(tid2, INT(24,size_t), error)
+  CALL check("H5Tset_precision_f",error,total_error)
+
+  CALL H5Tset_size_f(tid2, INT(3,size_t), error)
+  CALL check("H5Tset_size_f",error,total_error)
+
+  CALL H5Tset_ebias_f(tid2, INT(63,size_t), error)
+  CALL check("H5Tset_ebias_f",error,total_error)
+
+  CALL H5Tset_pad_f(tid2, H5T_PAD_ZERO_F, H5T_PAD_ZERO_F, error)
+  CALL check("H5Tset_pad_f",error,total_error)
+
+  CALL h5tcommit_f(file, "new float type 2", tid2, error)
+  CALL check("h5tcommit_f", error, total_error)
+
+  CALL h5tclose_f(tid2, error)
+  CALL check("h5tclose_f", error, total_error)
+
+  CALL H5Topen_f(file, "new float type 2", tid2, error)
+  CALL check("H5Topen_f", error, total_error)
+
+  CALL H5Tget_fields_f(tid2, spos, epos, esize, mpos, msize, error)
+  CALL check("H5Tget_fields_f", error, total_error)
+
+  IF(spos.NE.23 .OR. epos.NE.16 .OR. esize.NE.7 .OR. mpos.NE.0 .OR. msize.NE.16)THEN
+     CALL verify("H5Tget_fields_f", -1, 0, total_error)
+  ENDIF
+
+  CALL H5Tget_precision_f(tid2, precision2, error)
+  CALL check("H5Tget_precision_f", error, total_error)
+  CALL verify("H5Tget_precision_f", INT(precision2), 24, total_error)
+
+  CALL H5Tget_offset_f(tid2, offset2, error)
+  CALL check("H5Tget_offset_f", error, total_error)
+  CALL verify("H5Tget_offset_f", INT(offset2), 0, total_error)
+
+  CALL H5Tget_size_f(tid2, size2, error)
+  CALL check("H5Tget_size_f", error, total_error)
+  CALL verify("H5Tget_size_f", INT(size2), 3, total_error)
+
+  CALL H5Tget_ebias_f(tid2, ebias2, error)
+  CALL check("H5Tget_ebias_f", error, total_error)
+  CALL verify("H5Tget_ebias_f", INT(ebias2), 63, total_error)
+
+  CALL h5tclose_f(tid1, error)
+  CALL check("h5tclose_f", error, total_error)
+
+  CALL h5tclose_f(tid2, error)
+  CALL check("h5tclose_f", error, total_error)
+
+  CALL H5Pclose_f(dxpl_id, error)
+  CALL check("H5Pclose_f", error, total_error)
+
+  CALL h5fclose_f(file,error)
+  CALL check("h5fclose_f", error, total_error)
+
+  IF(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+  CALL check("h5_cleanup_f", error, total_error)
+
+END SUBROUTINE test_derived_flt
+
+END MODULE TH5T
diff --git a/fortran/test/tH5T.f90 b/fortran/test/tH5T.f90
deleted file mode 100644
index 7822c16..0000000
--- a/fortran/test/tH5T.f90
+++ /dev/null
@@ -1,1160 +0,0 @@
-!****h* root/fortran/test/tH5T.f90
-!
-! NAME
-!  tH5T.f90
-!
-! FUNCTION
-!  Basic testing of Fortran H5T APIs.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! CONTAINS SUBROUTINES
-!  compoundtest, basic_data_type_test, enumtest, test_derived_flt
-!
-!*****
-
-MODULE TH5T
-
-CONTAINS
-
-    SUBROUTINE compoundtest(cleanup, total_error)
-!
-! This program creates a dataset that is one dimensional array of
-! structures  {
-!                 character*2
-!                 integer
-!                 double precision
-!                 real
-!                                   }
-! Data is written and read back by fields.
-!
-! The following H5T interface functions are tested:
-! h5tcopy_f, h5tset(get)_size_f, h5tcreate_f, h5tinsert_f,  h5tclose_f,
-! h5tget_class_f, h5tget_member_name_f, h5tget_member_offset_f, h5tget_member_type_f,
-! h5tequal_f, h5tinsert_array_f, h5tcommit_f, h5tencode_f, h5tdecode_f
-
-     USE HDF5 ! This module contains all necessary modules
-     USE TH5_MISC
-
-     IMPLICIT NONE
-     LOGICAL, INTENT(IN)  :: cleanup
-     INTEGER, INTENT(OUT) :: total_error
-
-     CHARACTER(LEN=8), PARAMETER :: filename = "compound" ! File name
-     CHARACTER(LEN=80) :: fix_filename
-     CHARACTER(LEN=8), PARAMETER :: dsetname = "Compound"     ! Dataset name
-     INTEGER, PARAMETER :: dimsize = 6 ! Size of the dataset
-     INTEGER, PARAMETER :: COMP_NUM_MEMBERS = 4 ! Number of members in the compound datatype
-
-     INTEGER(HID_T) :: file_id       ! File identifier
-     INTEGER(HID_T) :: dset_id       ! Dataset identifier
-     INTEGER(HID_T) :: dspace_id     ! Dataspace identifier
-     INTEGER(HID_T) :: dtype_id      ! Compound datatype identifier
-     INTEGER(HID_T) :: dtarray_id    ! Compound datatype identifier
-     INTEGER(HID_T) :: arrayt_id    ! Array datatype identifier
-     INTEGER(HID_T) :: dt1_id      ! Memory datatype identifier (for character field)
-     INTEGER(HID_T) :: dt2_id      ! Memory datatype identifier (for integer field)
-     INTEGER(HID_T) :: dt3_id      ! Memory datatype identifier (for double precision field)
-     INTEGER(HID_T) :: dt4_id      ! Memory datatype identifier (for real field)
-     INTEGER(HID_T) :: dt5_id      ! Memory datatype identifier
-     INTEGER(HID_T) :: membtype_id ! Datatype identifier
-     INTEGER(HID_T) :: plist_id    ! Dataset trasfer property
-
-
-     INTEGER(HSIZE_T), DIMENSION(1) :: dims = (/dimsize/) ! Dataset dimensions
-     INTEGER     ::   rank = 1                            ! Dataset rank
-
-     INTEGER     ::   error ! Error flag
-     INTEGER(SIZE_T)     ::   type_size  ! Size of the datatype
-     INTEGER(SIZE_T)     ::   type_sizec  ! Size of the character datatype
-     INTEGER(SIZE_T)     ::   type_sizei  ! Size of the integer datatype
-     INTEGER(SIZE_T)     ::   type_sized  ! Size of the double precision datatype
-     INTEGER(SIZE_T)     ::   type_sizer  ! Size of the real datatype
-     INTEGER(SIZE_T)     ::   offset     ! Member's offset
-     INTEGER(SIZE_T)     ::   offset_out     ! Member's offset
-     CHARACTER(LEN=2), DIMENSION(dimsize)      :: char_member
-     CHARACTER(LEN=2), DIMENSION(dimsize)      :: char_member_out ! Buffer to read data out
-     INTEGER, DIMENSION(dimsize)          :: int_member
-     INTEGER, DIMENSION(dimsize)          :: int_member_out
-     REAL(KIND=Fortran_DOUBLE), DIMENSION(dimsize) :: double_member
-     REAL(KIND=Fortran_DOUBLE), DIMENSION(dimsize) :: double_member_out
-     REAL, DIMENSION(dimsize)             :: real_member
-     REAL, DIMENSION(dimsize)             :: real_member_out
-     INTEGER :: i
-     INTEGER :: class ! Datatype class
-     INTEGER :: num_members ! Number of members in the compound datatype
-     CHARACTER(LEN=256) :: member_name
-     INTEGER :: len ! Lenght of the name of the compound datatype member
-     INTEGER :: member_index ! index of the field
-     INTEGER(HSIZE_T), DIMENSION(3) :: array_dims=(/2,3,4/)
-     INTEGER :: array_dims_range = 3
-     INTEGER :: elements = 24 ! number of elements in the array_dims array.
-     INTEGER(SIZE_T) :: sizechar
-     INTEGER(HSIZE_T), DIMENSION(1) :: data_dims
-     LOGICAL :: flag = .TRUE.
-
-     CHARACTER(LEN=1024) :: cmpd_buf
-     INTEGER(SIZE_T) :: cmpd_buf_size=0
-     INTEGER(HID_T) :: decoded_tid1
-
-     INTEGER(HID_T) :: fixed_str1, fixed_str2
-     LOGICAL :: are_equal
-     INTEGER(SIZE_T), PARAMETER :: str_size = 10 
-     INTEGER(SIZE_T) :: query_size
-
-     ! Test h5tcreate_f with H5T_STRING_F option:
-     !   Create fixed-length string in two ways and make sure they are the same
-
-     CALL h5tcopy_f(H5T_FORTRAN_S1, fixed_str1, error)
-     CALL check("h5tcopy_f", error, total_error)
-     CALL h5tset_size_f(fixed_str1, str_size, error)
-     CALL check("h5tset_size_f", error, total_error)
-     CALL h5tset_strpad_f(fixed_str1, H5T_STR_NULLTERM_F, error)
-     CALL check("h5tset_strpad_f", error, total_error)
-     
-     CALL h5tcreate_f(H5T_STRING_F, str_size, fixed_str2, error)
-     CALL check("h5tcreate_f", error, total_error)
-     CALL h5tset_strpad_f(fixed_str2, H5T_STR_NULLTERM_F, error)
-     CALL check("h5tset_strpad_f", error, total_error)
-     
-     CALL h5tequal_f(fixed_str1, fixed_str2, are_equal, error)
-     IF(.NOT.are_equal)THEN
-        CALL check("h5tcreate_f", -1, total_error)
-     ENDIF
-     
-     CALL h5tget_size_f(fixed_str1, query_size, error)
-     CALL check("h5tget_size_f", error, total_error)
-     
-     IF(query_size.NE.str_size)THEN
-        CALL check("h5tget_size_f", -1, total_error)
-     ENDIF
-     
-     CALL h5tget_size_f(fixed_str2, query_size, error)
-     CALL check("h5tget_size_f", error, total_error)
-
-     IF(query_size.NE.str_size)THEN
-        CALL check("h5tget_size_f", -1, total_error)
-     ENDIF
-     
-     CALL h5tclose_f(fixed_str1,error)
-     CALL check("h5tclose_f", error, total_error)
-     
-     CALL h5tclose_f(fixed_str2,error)
-     CALL check("h5tclose_f", error, total_error)
-
-     data_dims(1) = dimsize
-     !
-     ! Initialize data buffer.
-     !
-     do i = 1, dimsize
-        char_member(i)(1:1) = char(65+i)
-        char_member(i)(2:2) = char(65+i)
-        char_member_out(i)(1:1)   = char(65)
-        char_member_out(i)(2:2)   = char(65)
-        int_member(i)   = i
-        int_member_out(i)   = 0
-        double_member(i)   = 2.* i
-        double_member_out(i)   = 0.
-        real_member(i)   = 3. * i
-        real_member_out(i)   = 0.
-     enddo
-
-     !
-     ! Set dataset transfer property to preserve partially initialized fields
-     ! during write/read to/from dataset with compound datatype.
-     !
-     CALL h5pcreate_f(H5P_DATASET_XFER_F, plist_id, error)
-         CALL check("h5pcreate_f", error, total_error)
-     CALL h5pset_preserve_f(plist_id, flag, error)
-         CALL check("h5pset_preserve_f", error, total_error)
-     !
-     ! Create a new file using default properties.
-     !
-          CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
-          if (error .ne. 0) then
-              write(*,*) "Cannot modify filename"
-              stop
-          endif
-     CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
-         CALL check("h5fcreate_f", error, total_error)
-
-     !
-     ! Create the dataspace.
-     !
-     CALL h5screate_simple_f(rank, dims, dspace_id, error)
-         CALL check("h5screate_simple_f", error, total_error)
-     !
-     ! Create compound datatype.
-     !
-     ! First calculate total size by calculating sizes of each member
-     !
-     CALL h5tcopy_f(H5T_NATIVE_CHARACTER, dt5_id, error)
-         CALL check("h5tcopy_f", error, total_error)
-     sizechar = 2
-     CALL h5tset_size_f(dt5_id, sizechar, error)
-         CALL check("h5tset_size_f", error, total_error)
-     CALL h5tget_size_f(dt5_id, type_sizec, error)
-         CALL check("h5tget_size_f", error, total_error)
-     CALL h5tget_size_f(H5T_NATIVE_INTEGER, type_sizei, error)
-         CALL check("h5tget_size_f", error, total_error)
-     CALL h5tget_size_f(H5T_NATIVE_DOUBLE, type_sized, error)
-         CALL check("h5tget_size_f", error, total_error)
-     CALL h5tget_size_f(H5T_NATIVE_REAL, type_sizer, error)
-         CALL check("h5tget_size_f", error, total_error)
-     !write(*,*) "get sizes", type_sizec, type_sizei, type_sizer, type_sized
-     type_size = type_sizec + type_sizei + type_sized + type_sizer
-     CALL h5tcreate_f(H5T_COMPOUND_F, type_size, dtype_id, error)
-         CALL check("h5tcreate_f", error, total_error)
-     !
-     ! Insert memebers
-     !
-     ! CHARACTER*2 memeber
-     !
-     offset = 0
-     CALL h5tinsert_f(dtype_id, "char_field", offset, dt5_id, error)
-         CALL check("h5tinsert_f", error, total_error)
-     !
-     ! INTEGER member
-     !
-     offset = offset + type_sizec ! Offset of the second memeber is 2
-     CALL h5tinsert_f(dtype_id, "integer_field", offset, H5T_NATIVE_INTEGER, error)
-         CALL check("h5tinsert_f", error, total_error)
-     !
-     ! DOUBLE PRECISION member
-     !
-     offset = offset + type_sizei  ! Offset of the third memeber is 6
-     CALL h5tinsert_f(dtype_id, "double_field", offset, H5T_NATIVE_DOUBLE, error)
-         CALL check("h5tinsert_f", error, total_error)
-     !
-     ! REAL member
-     !
-     offset = offset + type_sized  ! Offset of the last member is 14
-     CALL h5tinsert_f(dtype_id, "real_field", offset, H5T_NATIVE_REAL, error)
-     CALL check("h5tinsert_f", error, total_error)
-     !
-     ! Create the dataset with compound datatype.
-     !
-     CALL h5dcreate_f(file_id, dsetname, dtype_id, dspace_id, &
-                      dset_id, error)
-         CALL check("h5dcreate_f", error, total_error)
-     !
-     ! Create memory types. We have to create a compound datatype
-     ! for each member we want to write.
-     !
-     CALL h5tcreate_f(H5T_COMPOUND_F, type_sizec, dt1_id, error)
-         CALL check("h5tcreate_f", error, total_error)
-     offset = 0
-     CALL h5tinsert_f(dt1_id, "char_field", offset, dt5_id, error)
-         CALL check("h5tinsert_f", error, total_error)
-     !
-     CALL h5tcreate_f(H5T_COMPOUND_F, type_sizei, dt2_id, error)
-         CALL check("h5tcreate_f", error, total_error)
-     offset = 0
-     CALL h5tinsert_f(dt2_id, "integer_field", offset, H5T_NATIVE_INTEGER, error)
-         CALL check("h5tinsert_f", error, total_error)
-     !
-     CALL h5tcreate_f(H5T_COMPOUND_F, type_sized, dt3_id, error)
-         CALL check("h5tcreate_f", error, total_error)
-     offset = 0
-     CALL h5tinsert_f(dt3_id, "double_field", offset, H5T_NATIVE_DOUBLE, error)
-         CALL check("h5tinsert_f", error, total_error)
-     !
-     CALL h5tcreate_f(H5T_COMPOUND_F, type_sizer, dt4_id, error)
-         CALL check("h5tcreate_f", error, total_error)
-     offset = 0
-     CALL h5tinsert_f(dt4_id, "real_field", offset, H5T_NATIVE_REAL, error)
-         CALL check("h5tinsert_f", error, total_error)
-     !
-     ! Write data by fields in the datatype. Fields order is not important.
-     !
-     CALL h5dwrite_f(dset_id, dt4_id, real_member, data_dims, error, xfer_prp = plist_id)
-         CALL check("h5dwrite_f", error, total_error)
-     CALL h5dwrite_f(dset_id, dt1_id, char_member, data_dims, error, xfer_prp = plist_id)
-         CALL check("h5dwrite_f", error, total_error)
-     CALL h5dwrite_f(dset_id, dt3_id, double_member, data_dims, error, xfer_prp = plist_id)
-         CALL check("h5dwrite_f", error, total_error)
-     CALL h5dwrite_f(dset_id, dt2_id, int_member, data_dims, error, xfer_prp = plist_id)
-         CALL check("h5dwrite_f", error, total_error)
-
-     !
-     ! End access to the dataset and release resources used by it.
-     !
-     CALL h5dclose_f(dset_id, error)
-         CALL check("h5dclose_f", error, total_error)
-
-     !
-     ! Terminate access to the data space.
-     !
-     CALL h5sclose_f(dspace_id, error)
-         CALL check("h5sclose_f", error, total_error)
-     !
-     ! Terminate access to the datatype
-     !
-     CALL h5tclose_f(dtype_id, error)
-         CALL check("h5tclose_f", error, total_error)
-     CALL h5tclose_f(dt1_id, error)
-         CALL check("h5tclose_f", error, total_error)
-     CALL h5tclose_f(dt2_id, error)
-         CALL check("h5tclose_f", error, total_error)
-     CALL h5tclose_f(dt3_id, error)
-         CALL check("h5tclose_f", error, total_error)
-     CALL h5tclose_f(dt4_id, error)
-         CALL check("h5tclose_f", error, total_error)
-
-     !
-     ! Create and store compound datatype with the character and
-     ! array members.
-     !
-     type_size = type_sizec + elements*type_sizer ! Size of compound datatype
-     CALL h5tcreate_f(H5T_COMPOUND_F, type_size, dtarray_id, error)
-         CALL check("h5tcreate_f", error, total_error)
-     offset = 0
-     CALL h5tinsert_f(dtarray_id, "char_field", offset, H5T_NATIVE_CHARACTER, error)
-         CALL check("h5tinsert_f", error, total_error)
-     offset = type_sizec
-     CALL h5tarray_create_f(H5T_NATIVE_REAL, array_dims_range, array_dims, arrayt_id, error)
-         CALL check("h5tarray_create_f", error, total_error)
-     CALL h5tinsert_f(dtarray_id,"array_field", offset, arrayt_id, error)
-         CALL check("h5tinsert_f", error, total_error)
-     CALL h5tcommit_f(file_id, "Compound_with_array_member", dtarray_id, error)
-         CALL check("h5tcommit_f", error, total_error)
-     CALL h5tclose_f(arrayt_id, error)
-         CALL check("h5tclose_f", error, total_error)
-     CALL h5tclose_f(dtarray_id, error)
-         CALL check("h5tclose_f", error, total_error)
-
-     !
-     ! Close the file.
-     !
-     CALL h5fclose_f(file_id, error)
-         CALL check("h5fclose_f", error, total_error)
-
-     !
-     ! Open the file.
-     !
-     CALL h5fopen_f (fix_filename, H5F_ACC_RDWR_F, file_id, error)
-         CALL check("h5fopen_f", error, total_error)
-     !
-     ! Open the dataset.
-     !
-     CALL h5dopen_f(file_id, dsetname, dset_id, error)
-         CALL check("h5dopen_f", error, total_error)
-     !
-     ! Get datatype of the open dataset.
-     ! Check it class, number of members,  and member's names.
-     !
-     CALL h5dget_type_f(dset_id, dtype_id, error)
-         CALL check("h5dget_type_f", error, total_error)
-     CALL h5tget_class_f(dtype_id, class, error)
-         CALL check("h5dget_class_f", error, total_error)
-         if (class .ne. H5T_COMPOUND_F) then
-            write(*,*) " Wrong class type returned"
-            total_error = total_error + 1
-         endif
-     CALL h5tget_nmembers_f(dtype_id, num_members, error)
-         CALL check("h5dget_nmembers_f", error, total_error)
-         if (num_members .ne. COMP_NUM_MEMBERS ) then
-            write(*,*) " Wrong number of members returned"
-            total_error = total_error + 1
-         endif
-     !
-     !  Go through the members and find out their names and offsets.
-     !  Also see if name corresponds to the index
-     !
-     do i = 1, num_members
-        CALL h5tget_member_name_f(dtype_id, i-1, member_name, len, error)
-         CALL check("h5tget_member_name_f", error, total_error)
-        CALL h5tget_member_offset_f(dtype_id, i-1, offset_out, error)
-         CALL check("h5tget_member_offset_f", error, total_error)
-        CALL h5tget_member_index_f(dtype_id, member_name(1:len), member_index, error)
-         CALL check("h5tget_member_index_f", error, total_error)
-         if(member_index .ne. i-1) then
-            write(*,*) "Index returned is incorrect"
-            write(*,*) member_index, i-1
-            total_error = total_error + 1
-            endif
-
-        CHECK_NAME: SELECT CASE (member_name(1:len))
-        CASE("char_field")
-             if(offset_out .ne. 0) then
-               write(*,*) "Offset of the char member is incorrect"
-               total_error = total_error + 1
-             endif
-             CALL h5tget_member_type_f(dtype_id, i-1, membtype_id, error)
-              CALL check("h5tget_member_type_f", error, total_error)
-             CALL h5tequal_f(membtype_id, dt5_id, flag, error)
-              CALL check("h5tequal_f", error, total_error)
-             if(.not. flag) then
-                write(*,*) "Wrong member type returned for character member"
-                total_error = total_error + 1
-             endif
-             CALL h5tget_member_class_f(dtype_id, i-1, class, error)
-              CALL check("h5tget_member_class_f",error, total_error)
-              if (class .ne. H5T_STRING_F) then
-                 write(*,*) "Wrong class returned for character member"
-                 total_error = total_error + 1
-              endif
-        CASE("integer_field")
-             if(offset_out .ne. type_sizec) then
-               write(*,*) "Offset of the integer member is incorrect"
-               total_error = total_error + 1
-             endif
-             CALL h5tget_member_type_f(dtype_id, i-1, membtype_id, error)
-              CALL check("h5tget_member_type_f", error, total_error)
-             CALL h5tequal_f(membtype_id, H5T_NATIVE_INTEGER, flag, error)
-              CALL check("h5tequal_f", error, total_error)
-             if(.not. flag) then
-                write(*,*) "Wrong member type returned for integer memebr"
-                total_error = total_error + 1
-             endif
-             CALL h5tget_member_class_f(dtype_id, i-1, class, error)
-              CALL check("h5tget_member_class_f",error, total_error)
-              if (class .ne. H5T_INTEGER_F) then
-                 write(*,*) "Wrong class returned for INTEGER member"
-                 total_error = total_error + 1
-              endif
-        CASE("double_field")
-             if(offset_out .ne. (type_sizec+type_sizei)) then
-               write(*,*) "Offset of the double precision member is incorrect"
-               total_error = total_error + 1
-             endif
-             CALL h5tget_member_type_f(dtype_id, i-1, membtype_id, error)
-              CALL check("h5tget_member_type_f", error, total_error)
-             CALL h5tequal_f(membtype_id, H5T_NATIVE_DOUBLE, flag, error)
-              CALL check("h5tequal_f", error, total_error)
-             if(.not. flag) then
-                write(*,*) "Wrong member type returned for double precision memebr"
-                total_error = total_error + 1
-             endif
-             CALL h5tget_member_class_f(dtype_id, i-1, class, error)
-              CALL check("h5tget_member_class_f",error, total_error)
-              if (class .ne. H5T_FLOAT_F) then
-                 write(*,*) "Wrong class returned for double precision member"
-                 total_error = total_error + 1
-              endif
-        CASE("real_field")
-             if(offset_out .ne. (type_sizec+type_sizei+type_sized)) then
-               write(*,*) "Offset of the real member is incorrect"
-               total_error = total_error + 1
-             endif
-             CALL h5tget_member_type_f(dtype_id, i-1, membtype_id, error)
-              CALL check("h5tget_member_type_f", error, total_error)
-             CALL h5tequal_f(membtype_id, H5T_NATIVE_REAL, flag, error)
-              CALL check("h5tequal_f", error, total_error)
-             if(.not. flag) then
-                write(*,*) "Wrong member type returned for real memebr"
-                total_error = total_error + 1
-             endif
-             CALL h5tget_member_class_f(dtype_id, i-1, class, error)
-              CALL check("h5tget_member_class_f",error, total_error)
-              if (class .ne. H5T_FLOAT_F) then
-                 write(*,*) "Wrong class returned for real member"
-                 total_error = total_error + 1
-              endif
-        CASE DEFAULT
-               write(*,*) "Wrong member's name"
-               total_error = total_error + 1
-
-        END SELECT CHECK_NAME
-
-     enddo
-     !
-     ! Create memory datatype to read character member of the compound datatype.
-     !
-     CALL h5tcopy_f(H5T_NATIVE_CHARACTER, dt2_id, error)
-         CALL check("h5tcopy_f", error, total_error)
-     sizechar = 2
-     CALL h5tset_size_f(dt2_id, sizechar, error)
-         CALL check("h5tset_size_f", error, total_error)
-     CALL h5tget_size_f(dt2_id, type_size, error)
-         CALL check("h5tget_size_f", error, total_error)
-     CALL h5tcreate_f(H5T_COMPOUND_F, type_size, dt1_id, error)
-         CALL check("h5tcreate_f", error, total_error)
-     offset = 0
-     CALL h5tinsert_f(dt1_id, "char_field", offset, dt2_id, error)
-         CALL check("h5tinsert_f", error, total_error)
-     !
-     ! Read part of the dataset
-     !
-     CALL h5dread_f(dset_id, dt1_id, char_member_out, data_dims, error)
-         CALL check("h5dread_f", error, total_error)
-         do i = 1, dimsize
-            if (char_member_out(i) .ne. char_member(i)) then
-                write(*,*) " Wrong character data is read back "
-                total_error = total_error + 1
-            endif
-         enddo
-     !
-     CALL h5tcreate_f(H5T_COMPOUND_F, type_sizei, dt5_id, error)
-         CALL check("h5tcreate_f", error, total_error)
-     offset = 0
-     CALL h5tinsert_f(dt5_id, "integer_field", offset, H5T_NATIVE_INTEGER, error)
-         CALL check("h5tinsert_f", error, total_error)
-     !
-     ! Read part of the dataset
-     !
-     CALL h5dread_f(dset_id, dt5_id, int_member_out, data_dims, error)
-         CALL check("h5dread_f", error, total_error)
-         do i = 1, dimsize
-            if (int_member_out(i) .ne. int_member(i)) then
-                write(*,*) " Wrong integer data is read back "
-                total_error = total_error + 1
-            endif
-         enddo
-     !
-     !
-     CALL h5tcreate_f(H5T_COMPOUND_F, type_sized, dt3_id, error)
-         CALL check("h5tcreate_f", error, total_error)
-     offset = 0
-     CALL h5tinsert_f(dt3_id, "double_field", offset, H5T_NATIVE_DOUBLE, error)
-         CALL check("h5tinsert_f", error, total_error)
-     !
-     ! Read part of the dataset
-     !
-     CALL h5dread_f(dset_id, dt3_id, double_member_out, data_dims, error)
-         CALL check("h5dread_f", error, total_error)
-         do i = 1, dimsize
-            IF( .NOT.dreal_eq( REAL(double_member_out(i),dp), REAL( double_member(i), dp)) ) THEN
-                write(*,*) " Wrong double precision data is read back "
-                total_error = total_error + 1
-            endif
-         enddo
-     !
-     !
-     CALL h5tcreate_f(H5T_COMPOUND_F, type_sizer, dt4_id, error)
-         CALL check("h5tcreate_f", error, total_error)
-     offset = 0
-     CALL h5tinsert_f(dt4_id, "real_field", offset, H5T_NATIVE_REAL, error)
-         CALL check("h5tinsert_f", error, total_error)
-     !
-     ! Read part of the dataset
-     !
-     CALL h5dread_f(dset_id, dt4_id, real_member_out, data_dims, error)
-         CALL check("h5dread_f", error, total_error)
-         DO i = 1, dimsize
-            IF( .NOT.dreal_eq( REAL(real_member_out(i),dp), REAL( real_member(i), dp)) ) THEN
-               WRITE(*,*) " Wrong real precision data is read back "
-               total_error = total_error + 1
-            ENDIF
-         ENDDO
-     !
-     ! *-----------------------------------------------------------------------
-     ! * Test encoding and decoding compound datatypes
-     ! *-----------------------------------------------------------------------
-     !
-     !     Encode compound type in a buffer 
-     !         -- First find the buffer size
-
-     CALL H5Tencode_f(dtype_id, cmpd_buf, cmpd_buf_size, error)
-     CALL check("H5Tencode_f", error, total_error)
-
-     !  Try decoding bogus buffer 
-
-     CALL H5Tdecode_f(cmpd_buf, decoded_tid1, error)
-     CALL VERIFY("H5Tdecode_f", error, -1, total_error)
-
-     CALL H5Tencode_f(dtype_id, cmpd_buf, cmpd_buf_size, error)
-     CALL check("H5Tencode_f", error, total_error)
-
-     !  Decode from the compound buffer and return an object handle 
-     CALL H5Tdecode_f(cmpd_buf, decoded_tid1, error)
-     CALL check("H5Tdecode_f", error, total_error)
-
-     !  Verify that the datatype was copied exactly 
-
-     CALL H5Tequal_f(decoded_tid1, dtype_id, flag, error)
-     CALL check("H5Tequal_f", error, total_error)
-     CALL VerifyLogical("H5Tequal_f", flag, .TRUE., total_error)
-     !
-     ! Close all open objects.
-     !
-     CALL h5dclose_f(dset_id, error)
-         CALL check("h5dclose_f", error, total_error)
-     CALL h5tclose_f(dt1_id, error)
-         CALL check("h5tclose_f", error, total_error)
-     CALL h5tclose_f(dt2_id, error)
-         CALL check("h5tclose_f", error, total_error)
-     CALL h5tclose_f(dt3_id, error)
-         CALL check("h5tclose_f", error, total_error)
-     CALL h5tclose_f(dt4_id, error)
-         CALL check("h5tclose_f", error, total_error)
-     CALL h5tclose_f(dt5_id, error)
-         CALL check("h5tclose_f", error, total_error)
-     CALL h5fclose_f(file_id, error)
-         CALL check("h5fclose_f", error, total_error)
-
-          if(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-              CALL check("h5_cleanup_f", error, total_error)
-     RETURN
-     END SUBROUTINE compoundtest
-
-
-
-
-    SUBROUTINE basic_data_type_test(total_error)
-
-!   This subroutine tests following functionalities:
-!   H5tget_precision_f, H5tset_precision_f, H5tget_offset_f
-!   H5tset_offset_f, H5tget_pad_f, H5tset_pad_f, H5tget_sign_f,
-!   H5tset_sign_f, H5tget_ebias_f,H5tset_ebias_f, H5tget_norm_f,
-!   H5tset_norm_f, H5tget_inpad_f, H5tset_inpad_f, H5tget_cset_f,
-!   H5tset_cset_f, H5tget_strpad_f, H5tset_strpad_f
-
-     USE HDF5 ! This module contains all necessary modules
-     USE TH5_MISC
-
-     IMPLICIT NONE
-     INTEGER, INTENT(OUT) :: total_error
-
-     INTEGER(HID_T) :: dtype1_id, dtype2_id, dtype3_id, dtype4_id, dtype5_id
-                                     ! datatype identifiers
-     INTEGER(SIZE_T) :: precision ! Datatype precision
-     INTEGER(SIZE_T) :: setprecision ! Datatype precision
-     INTEGER(SIZE_T) :: offset ! Datatype offset
-     INTEGER(SIZE_T) :: setoffset ! Datatype offset
-     INTEGER :: lsbpad !padding type of the least significant bit
-     INTEGER :: msbpad !padding type of the most significant bit
-     INTEGER :: sign !sign type for an integer type
-     INTEGER(SIZE_T) :: ebias1 !Datatype exponent bias of a floating-point type
-     INTEGER(SIZE_T) :: ebias2 !Datatype exponent bias of a floating-point type
-     INTEGER(SIZE_T) :: setebias
-     INTEGER :: norm   !mantissa normalization of a floating-point datatype
-     INTEGER :: inpad   !padding type for unused bits in floating-point datatypes.
-     INTEGER :: cset   !character set type of a string datatype
-     INTEGER :: strpad !string padding method for a string datatype
-     INTEGER :: error !error flag
-
-
-     !
-     ! Create a datatype
-     !
-     CALL h5tcopy_f(H5T_STD_U16BE, dtype1_id, error)
-     CALL check("h5tcopy_f",error,total_error)
-     !
-     !datatype type_id should be modifiable after h5tcopy_f
-     !
-     setprecision = 12
-     CALL h5tset_precision_f(dtype1_id, setprecision, error)
-     CALL check("h5set_precision_f",error,total_error)
-     CALL h5tget_precision_f(dtype1_id,precision, error)
-     CALL check("h5get_precision_f",error,total_error)
-     if(precision .ne. 12) then
-         write (*,*) "got precision is not correct"
-         total_error = total_error + 1
-     end if
-
-     CALL h5tcopy_f(H5T_STD_I32LE, dtype2_id, error)
-     CALL check("h5tcopy_f",error,total_error)
-     setprecision = 12
-     CALL h5tset_precision_f(dtype2_id, setprecision, error)
-     CALL check("h5set_precision_f",error,total_error)
-
-     setoffset = 2
-     CALL h5tset_offset_f(dtype1_id, setoffset, error)
-     CALL check("h5set_offset_f",error,total_error)
-     setoffset = 10
-     CALL h5tset_offset_f(dtype2_id, setoffset, error)
-     CALL check("h5set_offset_f",error,total_error)
-     CALL h5tget_offset_f(dtype2_id,offset, error)
-     CALL check("h5get_offset_f",error,total_error)
-     if(offset .ne. 10) then
-         write (*,*) "got offset is not correct"
-         total_error = total_error + 1
-     end if
-
-     CALL h5tset_pad_f(dtype2_id,H5T_PAD_ONE_F, H5T_PAD_ONE_F, error)
-     CALL check("h5set_pad_f",error,total_error)
-     CALL h5tget_pad_f(dtype2_id,lsbpad,msbpad, error)
-     CALL check("h5get_pad_f",error,total_error)
-     if((lsbpad .ne. H5T_PAD_ONE_F) .and. (msbpad .ne. H5T_PAD_ONE_F)) then
-         write (*,*) "got pad is not correct"
-         total_error = total_error + 1
-     end if
-
-!     CALL h5tset_sign_f(dtype2_id,H5T_SGN_2_F, error)
-!     CALL check("h5set_sign_f",error,total_error)
-!     CALL h5tget_sign_f(dtype2_id,sign, error)
-     CALL h5tget_sign_f(H5T_NATIVE_INTEGER, sign, error)
-     CALL check("h5tget_sign_f",error,total_error)
-     if(sign .ne. H5T_SGN_2_F ) then
-         write (*,*) "got sign is not correct"
-         total_error = total_error + 1
-     end if
-
-     CALL h5tcopy_f(H5T_IEEE_F64BE, dtype3_id, error)
-     CALL check("h5tcopy_f",error,total_error)
-     CALL h5tcopy_f(H5T_IEEE_F32LE, dtype4_id, error)
-     CALL check("h5tcopy_f",error,total_error)
-
-     setebias = 257
-     CALL h5tset_ebias_f(dtype3_id, setebias, error)
-     CALL check("h5tset_ebias_f",error,total_error)
-     setebias = 1
-     CALL h5tset_ebias_f(dtype4_id, setebias, error)
-     CALL check("h5tset_ebias_f",error,total_error)
-     CALL h5tget_ebias_f(dtype3_id, ebias1, error)
-     CALL check("h5tget_ebias_f",error,total_error)
-     if(ebias1 .ne. 257 ) then
-         write (*,*) "got ebias is not correct"
-         total_error = total_error + 1
-     end if
-     CALL h5tget_ebias_f(dtype4_id, ebias2, error)
-     CALL check("h5tget_ebias_f",error,total_error)
-     if(ebias2 .ne. 1 ) then
-         write (*,*) "got ebias is not correct"
-         total_error = total_error + 1
-     end if
-
-     !attention:
-     !It seems that I can't use H5T_NORM_IMPLIED_F to set the norm value
-     !because I got error for the get_norm function
-!     CALL h5tset_norm_f(dtype3_id,H5T_NORM_IMPLIED_F , error)
-!     CALL check("h5tset_norm_f",error,total_error)
-!     CALL h5tget_norm_f(dtype3_id, norm, error)
-!     CALL check("h5tget_norm_f",error,total_error)
-!     if(norm .ne. H5T_NORM_IMPLIED_F ) then
-!         write (*,*) "got norm is not correct"
-!         total_error = total_error + 1
-!     end if
-     CALL h5tset_norm_f(dtype3_id, H5T_NORM_MSBSET_F , error)
-     CALL check("h5tset_norm_f",error,total_error)
-     CALL h5tget_norm_f(dtype3_id, norm, error)
-     CALL check("h5tget_norm_f",error,total_error)
-     if(norm .ne. H5T_NORM_MSBSET_F ) then
-         write (*,*) "got norm is not correct"
-         total_error = total_error + 1
-     end if
-
-     CALL h5tset_norm_f(dtype3_id, H5T_NORM_NONE_F , error)
-     CALL check("h5tset_norm_f",error,total_error)
-     CALL h5tget_norm_f(dtype3_id, norm, error)
-     CALL check("h5tget_norm_f",error,total_error)
-     if(norm .ne. H5T_NORM_NONE_F ) then
-         write (*,*) "got norm is not correct"
-         total_error = total_error + 1
-    end if
-
-     CALL h5tset_inpad_f(dtype3_id, H5T_PAD_ZERO_F , error)
-     CALL check("h5tset_inpad_f",error,total_error)
-     CALL h5tget_inpad_f(dtype3_id, inpad , error)
-     CALL check("h5tget_inpad_f",error,total_error)
-     if(inpad .ne. H5T_PAD_ZERO_F ) then
-         write (*,*) "got inpad is not correct"
-         total_error = total_error + 1
-     end if
-
-     CALL h5tset_inpad_f(dtype3_id,H5T_PAD_ONE_F  , error)
-     CALL check("h5tset_inpad_f",error,total_error)
-     CALL h5tget_inpad_f(dtype3_id, inpad , error)
-     CALL check("h5tget_inpad_f",error,total_error)
-     if(inpad .ne. H5T_PAD_ONE_F ) then
-         write (*,*) "got inpad is not correct"
-         total_error = total_error + 1
-     end if
-
-     CALL h5tset_inpad_f(dtype3_id,H5T_PAD_BACKGROUND_F  , error)
-     CALL check("h5tset_inpad_f",error,total_error)
-     CALL h5tget_inpad_f(dtype3_id, inpad , error)
-     CALL check("h5tget_inpad_f",error,total_error)
-     if(inpad .ne. H5T_PAD_BACKGROUND_F ) then
-         write (*,*) "got inpad is not correct"
-         total_error = total_error + 1
-     end if
-
-!     we should not apply h5tset_cset_f to non_character data typemake
-
-!     CALL h5tset_cset_f(dtype4_id, H5T_CSET_ASCII_F, error)
-!     CALL check("h5tset_cset_f",error,total_error)
-!     CALL h5tget_cset_f(dtype4_id, cset, error)
-!     CALL check("h5tget_cset_f",error,total_error)
-!     if(cset .ne. H5T_CSET_ASCII_F ) then
-!         write (*,*) "got cset is not correct"
-!         total_error = total_error + 1
-!     end if
-
-     CALL h5tcopy_f(H5T_NATIVE_CHARACTER, dtype5_id, error)
-     CALL check("h5tcopy_f",error,total_error)
-     CALL h5tset_cset_f(dtype5_id, H5T_CSET_ASCII_F, error)
-     CALL check("h5tset_cset_f",error,total_error)
-     CALL h5tget_cset_f(dtype5_id, cset, error)
-     CALL check("h5tget_cset_f",error,total_error)
-     if(cset .ne. H5T_CSET_ASCII_F ) then
-         write (*,*) "got cset is not correct"
-         total_error = total_error + 1
-     end if
-     CALL h5tset_strpad_f(dtype5_id, H5T_STR_NULLPAD_F, error)
-     CALL check("h5tset_strpad_f",error,total_error)
-     CALL h5tget_strpad_f(dtype5_id, strpad, error)
-     CALL check("h5tget_strpad_f",error,total_error)
-     if(strpad .ne. H5T_STR_NULLPAD_F ) then
-         write (*,*) "got strpad is not correct"
-         total_error = total_error + 1
-     end if
-
-     CALL h5tset_strpad_f(dtype5_id, H5T_STR_SPACEPAD_F, error)
-     CALL check("h5tset_strpad_f",error,total_error)
-     CALL h5tget_strpad_f(dtype5_id, strpad, error)
-     CALL check("h5tget_strpad_f",error,total_error)
-     if(strpad .ne. H5T_STR_SPACEPAD_F ) then
-         write (*,*) "got strpad is not correct"
-         total_error = total_error + 1
-     end if
-
-    CALL h5tclose_f(dtype1_id, error)
-    CALL check("h5tclose_f", error, total_error)
-    CALL h5tclose_f(dtype2_id, error)
-    CALL check("h5tclose_f", error, total_error)
-    CALL h5tclose_f(dtype3_id, error)
-    CALL check("h5tclose_f", error, total_error)
-    CALL h5tclose_f(dtype4_id, error)
-    CALL check("h5tclose_f", error, total_error)
-    CALL h5tclose_f(dtype5_id, error)
-    CALL check("h5tclose_f", error, total_error)
-
-
-     RETURN
-     END SUBROUTINE basic_data_type_test
-
-    SUBROUTINE enumtest(cleanup, total_error)
-
-    USE HDF5
-    USE TH5_MISC
-    IMPLICIT NONE
-
-    LOGICAL, INTENT(IN)  :: cleanup
-    INTEGER, INTENT(OUT) :: total_error
-    CHARACTER(LEN=4), PARAMETER :: filename="enum"
-    CHARACTER(LEN=80) :: fix_filename
-    CHARACTER(LEN=8), PARAMETER :: dsetname="enumdset"
-    CHARACTER(LEN=4)            :: true ="TRUE"
-    CHARACTER(LEN=5)            :: false="FALSE"
-    CHARACTER(LEN=5)            :: mem_name
-
-    INTEGER(HID_T) :: file_id
-    INTEGER(HID_T) :: dset_id
-    INTEGER(HID_T) :: dspace_id
-    INTEGER(HID_T) :: dtype_id, dtype, native_type
-    INTEGER        :: error
-    INTEGER        :: value
-    INTEGER(HSIZE_T), DIMENSION(1) :: dsize
-    INTEGER(SIZE_T) :: buf_size
-    INTEGER, DIMENSION(2) :: data
-    INTEGER(HSIZE_T), DIMENSION(7) :: dims
-    INTEGER :: order1, order2
-!    INTEGER(SIZE_T) :: type_size1, type_size2
-    INTEGER :: class
-
-    dims(1) = 2
-    dsize(1) = 2
-    data(1) = 1
-    data(2) = 0
-     !
-     ! Create a new file using default properties.
-     !
-    CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
-    IF (error .NE. 0) THEN
-       WRITE(*,*) "Cannot modify filename"
-       STOP
-    ENDIF
-    CALL h5fcreate_f(fix_filename,H5F_ACC_TRUNC_F,file_id,error)
-    CALL check("h5fcreate_f", error, total_error)
-    !
-    ! Create enumeration datatype with tow values
-    !
-    CALL h5tenum_create_f(H5T_NATIVE_INTEGER,dtype_id,error)
-    CALL check("h5tenum_create_f", error, total_error)
-    CALL h5tenum_insert_f(dtype_id,true,DATA(1),error)
-    CALL check("h5tenum_insert_f", error, total_error)
-    CALL h5tenum_insert_f(dtype_id,false,DATA(2),error)
-    CALL check("h5tenum_insert_f", error, total_error)
-    !
-    ! Create write  and close a dataset with enum datatype
-    !
-    CALL h5screate_simple_f(1,dsize,dspace_id,error)
-    CALL check("h5screate_simple_f", error, total_error)
-    CALL h5dcreate_f(file_id,dsetname,dtype_id,dspace_id,dset_id,error)
-    CALL check("h5dcreate_f", error, total_error)
-    CALL h5dwrite_f(dset_id,dtype_id,DATA,dims,error)
-    CALL check("h5dwrite_f", error, total_error)
-
-    CALL H5Dget_type_f(dset_id, dtype, error)
-    CALL check("H5Dget_type_f", error, total_error)
-
-    CALL H5Tget_native_type_f(dtype, H5T_DIR_ASCEND_F, native_type, error)
-    CALL check("H5Tget_native_type_f",error, total_error)
-
-    ! Verify the datatype retrieved and converted 
-    CALL H5Tget_order_f(native_type, order1, error)
-    CALL check("H5Tget_order_f",error, total_error)
-    CALL H5Tget_order_f(H5T_NATIVE_INTEGER, order2, error)
-    CALL check("H5Tget_order_f",error, total_error)
-    CALL VERIFY("H5Tget_native_type_f",order1, order2, total_error)
-
-    ! this test depends on whether -i8 was specified
-
-!!$    CALL H5Tget_size_f(native_type, type_size1, error)
-!!$    CALL check("H5Tget_size_f",error, total_error)
-!!$    CALL H5Tget_size_f(H5T_STD_I32BE, type_size2, error)
-!!$    CALL check("H5Tget_size_f",error, total_error)
-!!$    CALL VERIFY("H5Tget_native_type_f", INT(type_size1), INT(type_size2), total_error)
-
-    CALL H5Tget_class_f(native_type, class, error)
-    CALL check("H5Tget_class_f",error, total_error)
-    CALL VERIFY("H5Tget_native_type_f", INT(class), INT(H5T_ENUM_F), total_error)
-
-    CALL h5dclose_f(dset_id,error)
-    CALL check("h5dclose_f", error, total_error)
-    CALL h5sclose_f(dspace_id,error)
-    CALL check("h5sclose_f", error, total_error)
-    !
-    ! Get value of "TRUE"
-    !
-    CALL h5tenum_valueof_f(dtype_id, "TRUE", value, error)
-    CALL check("h5tenum_valueof_f", error, total_error)
-    IF (value .NE. 1) THEN
-       WRITE(*,*) " Value of TRUE is not 1, error"
-       total_error = total_error + 1
-    ENDIF
-    !
-    !  Get name of 0
-    !
-    value = 0
-    buf_size = 5
-    CALL h5tenum_nameof_f(dtype_id,  value, buf_size, mem_name, error)
-    CALL check("h5tenum_nameof_f", error, total_error)
-    IF (mem_name .NE. "FALSE") THEN
-       WRITE(*,*) " Wrong name for 0 value"
-       total_error = total_error + 1
-    ENDIF
-
-    CALL h5tclose_f(dtype_id,error)
-    CALL check("h5tclose_f", error, total_error)
-    CALL h5fclose_f(file_id,error)
-    CALL check("h5fclose_f", error, total_error)
-
-    IF(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-    CALL check("h5_cleanup_f", error, total_error)
-
-    RETURN
-  END SUBROUTINE enumtest
-
-!-------------------------------------------------------------------------
-! * Function:    test_derived_flt
-! *
-! * Purpose:     Tests user-define and query functions of floating-point types.
-! *              test h5tget/set_fields_f.
-! *
-! * Return:      Success:        0
-! *
-! *              Failure:        number of errors
-! *
-! * Fortran Programmer:  M.S. Breitenfeld
-! *                      September 9, 2008
-! *
-! * Modifications:
-! *
-! *-------------------------------------------------------------------------
-! 
-
-SUBROUTINE test_derived_flt(cleanup, total_error)
-
-  USE HDF5 ! This module contains all necessary modules
-  USE TH5_MISC
-
-  IMPLICIT NONE
-  LOGICAL, INTENT(IN)  :: cleanup
-  INTEGER, INTENT(OUT) :: total_error
-  INTEGER(hid_t) :: file=-1, tid1=-1, tid2=-1
-  INTEGER(hid_t) :: dxpl_id=-1
-  INTEGER(size_t) :: spos, epos, esize, mpos, msize
-
-  CHARACTER(LEN=15), PARAMETER :: filename="h5t_derived_flt"
-  CHARACTER(LEN=80) :: fix_filename
-
-  INTEGER(SIZE_T) :: precision1, offset1, ebias1, size1
-  INTEGER(SIZE_T) :: precision2, offset2, ebias2, size2
-
-  INTEGER :: error
-
-  ! Create File 
-  CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
-  IF (error .NE. 0) THEN
-     WRITE(*,*) "Cannot modify filename"
-     STOP
-  ENDIF
-
-  CALL h5fcreate_f(fix_filename,H5F_ACC_TRUNC_F,file,error)
-  CALL check("h5fcreate_f", error, total_error)
-
-  CALL h5pcreate_f(H5P_DATASET_XFER_F, dxpl_id, error)
-  CALL check("h5pcreate_f", error, total_error)
-
-  CALL h5tcopy_f(H5T_IEEE_F64LE, tid1, error)
-  CALL check("h5tcopy_f",error,total_error)
-
-  CALL h5tcopy_f(H5T_IEEE_F32LE, tid2, error)
-  CALL check("h5tcopy_f",error,total_error)
-
-  !------------------------------------------------------------------------
-  ! *                   1st floating-point type
-  ! * size=7 byte, precision=42 bits, offset=3 bits, mantissa size=31 bits,
-  ! * mantissa position=3, exponent size=10 bits, exponent position=34,
-  ! * exponent bias=511.  It can be illustrated in little-endian order as
-  ! *
-  ! *          6       5       4       3       2       1       0
-  ! *    ???????? ???SEEEE EEEEEEMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMM???
-  ! *
-  ! * To create a new floating-point type, the following properties must be
-  ! * set in the order of
-  ! *   set fields -> set offset -> set precision -> set size.
-  ! * All these properties must be set before the type can function. Other
-  ! * properties can be set anytime.  Derived type size cannot be expanded
-  ! * bigger than original size but can be decreased.  There should be no
-  ! * holes among the significant bits.  Exponent bias usually is set
-  ! * 2^(n-1)-1, where n is the exponent size.
-  ! *-----------------------------------------------------------------------
-
-  CALL H5Tset_fields_f(tid1, INT(44,size_t), INT(34,size_t), INT(10,size_t), &
-       INT(3,size_t), INT(31,size_t), error)
-  CALL check("H5Tset_fields_f",error,total_error)
-
-  CALL H5Tset_offset_f(tid1, INT(3,size_t), error)
-  CALL check("H5Tset_offset_f",error,total_error)
-
-  CALL H5Tset_precision_f(tid1, INT(42,size_t), error)
-  CALL check("H5Tset_precision_f",error,total_error)
-
-  CALL H5Tset_size_f(tid1, INT(7,size_t), error)
-  CALL check("H5Tset_size_f",error,total_error)
-
-  CALL H5Tset_ebias_f(tid1, INT(511,size_t), error)
-  CALL check("H5Tset_ebias_f",error,total_error)
-
-  CALL H5Tset_pad_f(tid1, H5T_PAD_ZERO_F, H5T_PAD_ZERO_F, error)
-  CALL check("H5Tset_pad_f",error,total_error)
-
-  CALL h5tcommit_f(file, "new float type 1", tid1, error)
-  CALL check("h5tcommit_f", error, total_error)
-
-  CALL h5tclose_f(tid1, error)
-  CALL check("h5tclose_f", error, total_error)
-
-  CALL H5Topen_f(file, "new float type 1", tid1, error)
-  CALL check("H5Topen_f", error, total_error)
-
-  CALL H5Tget_fields_f(tid1, spos, epos, esize, mpos, msize, error)
-  CALL check("H5Tget_fields_f", error, total_error)
-
-  IF(spos.NE.44 .OR. epos.NE.34 .OR. esize.NE.10 .OR. mpos.NE.3 .OR. msize.NE.31)THEN
-     CALL VERIFY("H5Tget_fields_f", -1, 0, total_error)
-  ENDIF
-
-  CALL H5Tget_precision_f(tid1, precision1, error)
-  CALL check("H5Tget_precision_f", error, total_error)
-  CALL VERIFY("H5Tget_precision_f", INT(precision1), 42, total_error)
-
-  CALL H5Tget_offset_f(tid1, offset1, error)
-  CALL check("H5Tget_offset_f", error, total_error)
-  CALL VERIFY("H5Tget_offset_f", INT(offset1), 3, total_error)
-
-  CALL H5Tget_size_f(tid1, size1, error)
-  CALL check("H5Tget_size_f", error, total_error)
-  CALL VERIFY("H5Tget_size_f", INT(size1), 7, total_error)
-
-  CALL H5Tget_ebias_f(tid1, ebias1, error)
-  CALL check("H5Tget_ebias_f", error, total_error)
-  CALL VERIFY("H5Tget_ebias_f", INT(ebias1), 511, total_error)
-
-  !--------------------------------------------------------------------------
-  ! *                   2nd floating-point type
-  ! * size=3 byte, precision=24 bits, offset=0 bits, mantissa size=16 bits,
-  ! * mantissa position=0, exponent size=7 bits, exponent position=16, exponent
-  ! * bias=63. It can be illustrated in little-endian order as
-  ! *
-  ! *          2       1       0
-  ! *    SEEEEEEE MMMMMMMM MMMMMMMM
-  ! *--------------------------------------------------------------------------
-
-  CALL H5Tset_fields_f(tid2, INT(23,size_t), INT(16,size_t), INT(7,size_t), &
-       INT(0,size_t), INT(16,size_t), error)
-  CALL check("H5Tset_fields_f",error,total_error)
-
-  CALL H5Tset_offset_f(tid2, INT(0,size_t), error)
-  CALL check("H5Tset_offset_f",error,total_error)
-
-  CALL H5Tset_precision_f(tid2, INT(24,size_t), error)
-  CALL check("H5Tset_precision_f",error,total_error)
-
-  CALL H5Tset_size_f(tid2, INT(3,size_t), error)
-  CALL check("H5Tset_size_f",error,total_error)
-
-  CALL H5Tset_ebias_f(tid2, INT(63,size_t), error)
-  CALL check("H5Tset_ebias_f",error,total_error)
-
-  CALL H5Tset_pad_f(tid2, H5T_PAD_ZERO_F, H5T_PAD_ZERO_F, error)
-  CALL check("H5Tset_pad_f",error,total_error)
-
-  CALL h5tcommit_f(file, "new float type 2", tid2, error)
-  CALL check("h5tcommit_f", error, total_error)
-
-  CALL h5tclose_f(tid2, error)
-  CALL check("h5tclose_f", error, total_error)
-
-  CALL H5Topen_f(file, "new float type 2", tid2, error)
-  CALL check("H5Topen_f", error, total_error)
-
-  CALL H5Tget_fields_f(tid2, spos, epos, esize, mpos, msize, error)
-  CALL check("H5Tget_fields_f", error, total_error)
-
-  IF(spos.NE.23 .OR. epos.NE.16 .OR. esize.NE.7 .OR. mpos.NE.0 .OR. msize.NE.16)THEN
-     CALL VERIFY("H5Tget_fields_f", -1, 0, total_error)
-  ENDIF
-
-  CALL H5Tget_precision_f(tid2, precision2, error)
-  CALL check("H5Tget_precision_f", error, total_error)
-  CALL VERIFY("H5Tget_precision_f", INT(precision2), 24, total_error)
-
-  CALL H5Tget_offset_f(tid2, offset2, error)
-  CALL check("H5Tget_offset_f", error, total_error)
-  CALL VERIFY("H5Tget_offset_f", INT(offset2), 0, total_error)
-
-  CALL H5Tget_size_f(tid2, size2, error)
-  CALL check("H5Tget_size_f", error, total_error)
-  CALL VERIFY("H5Tget_size_f", INT(size2), 3, total_error)
-
-  CALL H5Tget_ebias_f(tid2, ebias2, error)
-  CALL check("H5Tget_ebias_f", error, total_error)
-  CALL VERIFY("H5Tget_ebias_f", INT(ebias2), 63, total_error)
-
-  CALL h5tclose_f(tid1, error)
-  CALL check("h5tclose_f", error, total_error)
-
-  CALL h5tclose_f(tid2, error)
-  CALL check("h5tclose_f", error, total_error)
-
-  CALL H5Pclose_f(dxpl_id, error)
-  CALL check("H5Pclose_f", error, total_error)
-
-  CALL h5fclose_f(file,error)
-  CALL check("h5fclose_f", error, total_error)
-
-  IF(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-  CALL check("h5_cleanup_f", error, total_error)
-
-END SUBROUTINE test_derived_flt
-
-END MODULE TH5T
diff --git a/fortran/test/tH5T_F03.F90 b/fortran/test/tH5T_F03.F90
new file mode 100644
index 0000000..d50b76d
--- /dev/null
+++ b/fortran/test/tH5T_F03.F90
@@ -0,0 +1,3425 @@
+!****h* root/fortran/test/tH5T_F03.f90
+!
+! NAME
+!  tH5T_F03.f90
+!
+! FUNCTION
+!  Test FORTRAN HDF5 H5T APIs which are dependent on FORTRAN 2003
+!  features. 
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+!
+! CONTAINS SUBROUTINES
+!  test_array_compound_atomic, test_array_compound_array,
+!  test_array_bkg, test_h5kind_to_type
+!
+!*****
+
+! *****************************************
+! ***        H 5 T   T E S T S
+! *****************************************
+
+!***************************************************************
+!**
+!**  test_array_compound_atomic(): Test basic array datatype code.
+!**  Tests 1-D array of compound datatypes (with no array fields)
+!**
+!***************************************************************
+!
+#include <H5config_f.inc>
+
+MODULE TH5T_F03
+
+  USE HDF5 
+  USE TH5_MISC
+  USE TH5_MISC_GEN
+  USE ISO_C_BINDING
+
+CONTAINS
+
+SUBROUTINE test_array_compound_atomic(total_error)
+
+  IMPLICIT NONE
+
+  INTEGER, INTENT(INOUT) :: total_error
+  ! 1-D dataset WITH fixed dimensions 
+  INTEGER, PARAMETER :: SPACE1_RANK = 1
+  INTEGER, PARAMETER :: SPACE1_DIM1 = 4
+  ! 1-D array datatype 
+  INTEGER, PARAMETER :: ARRAY1_RANK= 1
+  INTEGER, PARAMETER :: ARRAY1_DIM1= 4
+  CHARACTER(LEN=10), PARAMETER :: FILENAME = "tarray1.h5"
+
+  TYPE s1_t
+     INTEGER :: i
+     REAL :: f
+  END TYPE s1_t
+  TYPE(s1_t), DIMENSION(:,:), ALLOCATABLE, TARGET :: wdata !  Information to write 
+  TYPE(s1_t), DIMENSION(:,:), ALLOCATABLE, TARGET :: rdata !  Information read in 
+  INTEGER(hid_t) :: fid1       ! HDF5 File IDs		
+  INTEGER(hid_t) :: dataset    ! Dataset ID			
+  INTEGER(hid_t) :: sid1       ! Dataspace ID			
+  INTEGER(hid_t) :: tid1       ! Array Datatype ID			
+  INTEGER(hid_t) :: tid2       ! Compound Datatype ID			
+
+  INTEGER(HSIZE_T), DIMENSION(1) :: sdims1 = (/SPACE1_DIM1/)
+  INTEGER(HSIZE_T), DIMENSION(1) :: tdims1=(/ARRAY1_DIM1/)
+  INTEGER :: ndims !  Array rank for reading 
+  INTEGER(HSIZE_T), ALLOCATABLE, DIMENSION(:) :: rdims1 ! Array dimensions for reading 
+  INTEGER(HSIZE_T), ALLOCATABLE, DIMENSION(:) :: rdims ! Array dimensions for reading 
+  INTEGER :: nmemb ! Number of compound members 
+  CHARACTER(LEN=20) :: mname ! Name of compound field 
+  INTEGER(size_t) :: off   ! Offset of compound field 
+  INTEGER(hid_t) :: mtid   ! Datatype ID for field 
+  INTEGER :: i,j      !  counting variables  
+
+  INTEGER :: error    !  Generic RETURN value 
+  INTEGER :: namelen
+  LOGICAL :: flag
+
+  TYPE(C_PTR) :: f_ptr ! Needed to pass the pointer, for g95 compiler to work
+
+  ALLOCATE( wdata(1:SPACE1_DIM1,1:ARRAY1_DIM1) )
+  ALLOCATE( rdata(1:SPACE1_DIM1,1:ARRAY1_DIM1) )
+
+  ! Initialize array data to write 
+  DO i = 1, SPACE1_DIM1
+     DO j = 1, ARRAY1_DIM1
+        wdata(i,j)%i = i * 10 + j
+        wdata(i,j)%f = i * 2.5 + j
+     ENDDO
+  ENDDO
+
+  ! Create file 
+  CALL h5fcreate_f(FILENAME,H5F_ACC_TRUNC_F,fid1,error)
+  CALL check("h5fcreate_f", error, total_error)
+
+  ! Create dataspace for datasets 
+  CALL h5screate_simple_f(SPACE1_RANK, sdims1, sid1, error)
+  CALL check("h5screate_simple_f", error, total_error)
+
+  CALL h5tcreate_f(H5T_COMPOUND_F, H5OFFSETOF(C_LOC(wdata(1,1)), C_LOC(wdata(2,1))), tid2, error)
+  CALL check("h5tcreate_f", error, total_error)
+
+  ! Insert integer field 
+  CALL h5tinsert_f(tid2, "i", H5OFFSETOF(C_LOC(wdata(1,1)),C_LOC(wdata(1,1)%i)), H5T_NATIVE_INTEGER, error)
+  CALL check("h5tinsert_f", error, total_error)
+
+  ! Insert float field 
+
+  CALL h5tinsert_f(tid2, "f", H5OFFSETOF(C_LOC(wdata(1,1)),C_LOC(wdata(1,1)%f)), H5T_NATIVE_REAL, error)
+  CALL check("h5tinsert_f", error, total_error)
+
+  !  Create an array datatype to refer to 
+  CALL h5tarray_create_f(tid2, ARRAY1_RANK, tdims1, tid1, error)
+  CALL check("h5tarray_create_f", error, total_error)
+
+  ! Close compound datatype 
+  CALL h5tclose_f(tid2,error)
+  CALL check("h5tclose_f", error, total_error)
+
+
+  ! Create a dataset 
+  CALL h5dcreate_f(fid1,"Dataset1",tid1, sid1, dataset,error)
+  CALL check("h5dcreate_f", error, total_error)
+
+  ! Write dataset to disk 
+
+  ALLOCATE(rdims(1:2)) ! dummy not needed
+
+  f_ptr = C_LOC(wdata(1,1))
+  CALL h5dwrite_f(dataset, tid1, f_ptr, error )
+  CALL check("h5dwrite_f", error, total_error)
+  ! Close Dataset  
+  CALL h5dclose_f(dataset, error)
+  CALL check("h5dclose_f", error, total_error)
+
+  ! Close datatype 
+  CALL h5tclose_f(tid1,error)
+  CALL check("h5tclose_f", error, total_error)
+
+  ! Close disk dataspace 
+  CALL h5sclose_f(sid1,error)
+  CALL check("h5sclose_f", error, total_error)
+
+  ! Close file 
+  CALL h5fclose_f(fid1,error)
+  CALL check("h5fclose_f", error, total_error)
+
+  ! Re-open file 
+  CALL h5fopen_f (FILENAME, H5F_ACC_RDONLY_F, fid1, error)
+  CALL check("h5fopen_f", error, total_error)
+
+  ! Open the dataset  
+  CALL h5dopen_f(fid1, "Dataset1", dataset, error)
+  CALL check("h5dopen_f", error, total_error)
+
+  ! Get the datatype     
+  CALL h5dget_type_f(dataset, tid1, error)
+  CALL check("h5dget_type_f", error, total_error)
+
+  ! Check the array rank 
+  CALL h5tget_array_ndims_f(tid1, ndims, error)
+  CALL check("h5tget_array_ndims_f", error, total_error)
+  CALL VERIFY("h5tget_array_ndims_f",ndims, ARRAY1_RANK, total_error)
+
+  ! Get the array dimensions 
+  ALLOCATE(rdims1(1:ndims))
+  CALL h5tget_array_dims_f(tid1, rdims1, error)
+  CALL check("h5tget_array_dims_f", error, total_error)
+
+
+  ! Check the array dimensions 
+  DO i = 1, ndims
+     CALL VERIFY("h5tget_array_dims_f", INT(rdims1(i)), INT(tdims1(i)), total_error)
+  ENDDO
+
+  ! Get the compound datatype 
+  CALL h5tget_super_f(tid1, tid2, error)
+  CALL check("h5tget_super_f", error, total_error)
+
+  ! Check the number of members 
+  CALL h5tget_nmembers_f(tid2, nmemb, error)
+  CALL check("h5tget_nmembers_f", error, total_error)
+  CALL VERIFY("h5tget_nmembers_f", nmemb, 2, total_error)
+
+  ! Check the 1st field's name 
+  CALL H5Tget_member_name_f(tid2, 0, mname, namelen,error)
+  CALL check("H5Tget_member_name_f", error, total_error)
+  CALL verify("H5Tget_member_name_f",mname(1:namelen),"i", total_error)
+
+  !  Check the 1st field's offset 
+  CALL H5Tget_member_offset_f(tid2, 0, off, error)
+  CALL check("H5Tget_member_offset_f", error, total_error)
+  CALL VERIFY("H5Tget_member_offset_f",INT(off),0, total_error) 
+
+
+  ! Check the 1st field's datatype 
+  CALL H5Tget_member_type_f(tid2, 0, mtid, error)
+  CALL check("H5Tget_member_type_f", error, total_error)
+
+  CALL H5Tequal_f(mtid, H5T_NATIVE_INTEGER, flag, error)
+  CALL check("H5Tequal_f", error, total_error) 
+  CALL verify("H5Tequal_f", flag, .TRUE., total_error)
+
+  CALL h5tclose_f(mtid,error)
+  CALL check("h5tclose_f", error, total_error)
+
+  ! Check the 2nd field's name 
+  CALL H5Tget_member_name_f(tid2, 1, mname, namelen,error)
+  CALL check("H5Tget_member_name_f", error, total_error)
+  CALL verify("H5Tget_member_name_f",mname(1:namelen),"f", total_error)
+
+  !  Check the 2nd field's offset 
+  CALL H5Tget_member_offset_f(tid2, 1, off, error)
+  CALL check("H5Tget_member_offset_f", error, total_error)
+  CALL VERIFY("H5Tget_member_offset_f",INT(off),INT(H5OFFSETOF(C_LOC(wdata(1,1)),C_LOC(wdata(1,1)%f))), total_error)    
+
+  ! Check the 2nd field's datatype 
+  CALL H5Tget_member_type_f(tid2, 1, mtid, error)
+  CALL check("H5Tget_member_type_f", error, total_error)
+
+  CALL H5Tequal_f(mtid, H5T_NATIVE_REAL, flag, error)
+  CALL check("H5Tequal_f", error, total_error) 
+  CALL verify("H5Tequal_f", flag, .TRUE., total_error)
+
+  CALL h5tclose_f(mtid,error)
+  CALL check("h5tclose_f", error, total_error)
+
+  !  Close Compound Datatype 
+  CALL h5tclose_f(tid2, error)
+  CALL check("h5tclose_f", error, total_error)
+
+  ! Read dataset from disk 
+
+  f_ptr = C_LOC(rdata(1,1))
+  CALL H5Dread_f(dataset, tid1, f_ptr, error)
+  CALL check("H5Dread_f", error, total_error)
+
+  ! Compare data read in 
+  DO i = 1, SPACE1_DIM1
+     DO j = 1, ARRAY1_DIM1
+        IF(wdata(i,j)%i.NE.rdata(i,j)%i)THEN
+           PRINT*, 'ERROR: Wrong integer data is read back by H5Dread_f '
+           total_error = total_error + 1
+        ENDIF
+        CALL VERIFY('ERROR: Wrong real data is read back by H5Dread_f ',wdata(i,j)%f, rdata(i,j)%f, total_error)
+     ENDDO
+  ENDDO
+
+  ! Close Datatype 
+  CALL h5tclose_f(tid1,error)
+  CALL check("h5tclose_f", error, total_error)
+
+  ! Close Dataset 
+  CALL h5dclose_f(dataset, error)
+  CALL check("h5dclose_f", error, total_error)
+
+  ! Close file 
+  CALL h5fclose_f(fid1,error)
+  CALL check("h5fclose_f", error, total_error)
+
+END SUBROUTINE test_array_compound_atomic
+!!$
+!!$!***************************************************************
+!!$!**
+!!$!**  test_array_compound_array(): Test basic array datatype code.
+!!$!**      Tests 1-D array of compound datatypes (with array fields)
+!!$!**
+!!$!***************************************************************
+!!$
+  SUBROUTINE test_array_compound_array(total_error)
+    
+    IMPLICIT NONE
+    
+    INTEGER, INTENT(INOUT) :: total_error
+
+    !  1-D array datatype 
+    INTEGER, PARAMETER :: ARRAY1_RANK= 1
+    INTEGER, PARAMETER :: ARRAY1_DIM1= 3
+    INTEGER, PARAMETER :: ARRAY2_DIM1= 5
+
+    INTEGER, PARAMETER :: SPACE1_RANK = 1
+    INTEGER, PARAMETER :: SPACE1_DIM1 = 4
+    CHARACTER(LEN=10), PARAMETER :: FILENAME = "tarray2.h5"
+
+    TYPE st_t_struct !  Typedef for compound datatype 
+       INTEGER :: i
+       REAL, DIMENSION(1:ARRAY2_DIM1) :: f
+       CHARACTER(LEN=2), DIMENSION(1:ARRAY2_DIM1) :: c
+    END TYPE st_t_struct
+    !  Information to write 
+    TYPE(st_t_struct), DIMENSION(1:SPACE1_DIM1,1:ARRAY1_DIM1), TARGET :: wdata
+    !  Information read in 
+    TYPE(st_t_struct), DIMENSION(1:SPACE1_DIM1,1:ARRAY1_DIM1), TARGET :: rdata
+
+
+    INTEGER(hid_t) :: fid1      !  HDF5 File IDs		
+    INTEGER(hid_t) :: dataset   !  Dataset ID			
+    integer(hid_t) :: sid1      !  Dataspace ID			
+    integer(hid_t) :: tid1      !  Array Datatype ID	
+    integer(hid_t) :: tid2      !  Compound Datatype ID	
+    integer(hid_t) :: tid3      !  Nested Array Datatype ID	
+    integer(hid_t) :: tid4      !  Nested Array Datatype ID	
+
+    INTEGER(HSIZE_T), DIMENSION(1) :: sdims1 = (/SPACE1_DIM1/)
+    INTEGER(HSIZE_T), DIMENSION(1) :: tdims1=(/ARRAY1_DIM1/)
+    INTEGER(HSIZE_T), DIMENSION(1) :: tdims2=(/ARRAY2_DIM1/)
+
+    INTEGER  ndims      ! Array rank for reading 
+
+    INTEGER(HSIZE_T), ALLOCATABLE, DIMENSION(:) :: rdims1 ! Array dimensions for reading 
+
+    INTEGER :: nmemb ! Number of compound members 
+    CHARACTER(LEN=20) :: mname ! Name of compound field 
+    INTEGER(size_t) :: off   ! Offset of compound field 
+    INTEGER(hid_t) :: mtid   ! Datatype ID for field  
+    INTEGER(hid_t) :: mtid2   ! Datatype ID for field  
+
+    INTEGER :: mclass     !  Datatype class for field 
+    INTEGER :: i,j,k      ! counting variables 
+
+    INTEGER :: error
+    CHARACTER(LEN=2) :: ichr2
+    INTEGER :: namelen
+    LOGICAL :: flag 
+    INTEGER(HID_T) :: atype_id       !String Attribute Datatype identifier
+    INTEGER(SIZE_T) :: attrlen    ! Length of the attribute string 
+
+    TYPE(c_ptr) :: f_ptr
+
+    !  Initialize array data to write 
+    DO i = 1, SPACE1_DIM1
+       DO j = 1, array1_DIM1
+          wdata(i,j)%i = i*10+j
+          DO k = 1, ARRAY2_DIM1
+             wdata(i,j)%f(k) = 10*i+j+.5
+             WRITE(ichr2,'(I2.2)') k
+             wdata(i,j)%c(k) = ichr2
+          ENDDO
+       ENDDO
+    ENDDO
+
+    !  Create file 
+    CALL h5fcreate_f(FILENAME,H5F_ACC_TRUNC_F,fid1,error)
+    CALL check("h5fcreate_f", error, total_error)   
+
+
+    !  Create dataspace for datasets 
+    CALL h5screate_simple_f(SPACE1_RANK, sdims1, sid1, error)
+    CALL check("h5screate_simple_f", error, total_error)
+
+    !  Create a compound datatype to refer to 
+    !
+    CALL h5tcreate_f(H5T_COMPOUND_F,  H5OFFSETOF(C_LOC(wdata(1,1)), C_LOC(wdata(2,1))), tid2, error)
+    CALL check("h5tcreate_f", error, total_error)
+
+    ! Insert integer field 
+    CALL h5tinsert_f(tid2, "i", H5OFFSETOF(C_LOC(wdata(1,1)),C_LOC(wdata(1,1)%i)), H5T_NATIVE_INTEGER, error)
+    CALL check("h5tinsert_f", error, total_error)
+
+    ! Create an array of floats datatype 
+    CALL h5tarray_create_f(H5T_NATIVE_REAL, ARRAY1_RANK, tdims2, tid3, error)
+    CALL check("h5tarray_create_f", error, total_error)
+    ! Insert float array field 
+
+    CALL h5tinsert_f(tid2, "f", H5OFFSETOF(C_LOC(wdata(1,1)),C_LOC(wdata(1,1)%f)), tid3, error)
+    CALL check("h5tinsert_f", error, total_error)
+
+    !
+    ! Create datatype for the String attribute.
+    !
+    CALL h5tcopy_f(H5T_NATIVE_CHARACTER, atype_id, error)
+    CALL check("h5tcopy_f",error,total_error)
+ 
+    attrlen = LEN(wdata(1,1)%c(1)) 
+    CALL h5tset_size_f(atype_id, attrlen, error)
+    CALL check("h5tset_size_f",error,total_error)    
+
+    ! Create an array of character datatype 
+    CALL h5tarray_create_f(atype_id, ARRAY1_RANK, tdims2, tid4, error)
+    CALL check("h5tarray_create_f", error, total_error)
+
+    ! Insert character array field 
+    CALL h5tinsert_f(tid2, "c", H5OFFSETOF(C_LOC(wdata(1,1)),C_LOC(wdata(1,1)%c(1)(1:1))), tid4, error)
+    CALL check("h5tinsert2_f", error, total_error)
+
+    !  Close array of floats field datatype 
+    CALL h5tclose_f(tid3,error)
+    CALL check("h5tclose_f", error, total_error)
+
+    CALL h5tclose_f(tid4,error)
+    CALL check("h5tclose_f", error, total_error)
+
+    ! Create an array datatype to refer to 
+    CALL h5tarray_create_f(tid2, ARRAY1_RANK, tdims1, tid1, error)
+    CALL check("h5tarray_create_f", error, total_error)
+
+    ! Close compound datatype 
+    CALL h5tclose_f(tid2,error)
+    CALL check("h5tclose_f", error, total_error)
+
+    !  Create a dataset 
+    CALL h5dcreate_f(fid1,"Dataset1",tid1, sid1, dataset,error)
+    CALL check("h5dcreate_f", error, total_error)
+
+
+    ! Write dataset to disk 
+    f_ptr = C_LOC(wdata(1,1))
+    CALL h5dwrite_f(dataset, tid1, f_ptr, error )
+    CALL check("h5dwrite_f", error, total_error)
+
+    ! Close Dataset 
+    CALL h5dclose_f(dataset, error)
+    CALL check("h5dclose_f", error, total_error)
+
+    !  Close datatype 
+    CALL h5tclose_f(tid1,error)
+    CALL check("h5tclose_f", error, total_error)
+
+    ! Close disk dataspace 
+    CALL h5sclose_f(sid1,error)
+    CALL check("h5sclose_f", error, total_error)
+
+    ! Close file 
+    CALL h5fclose_f(fid1,error)
+    CALL check("h5fclose_f", error, total_error)
+
+    !  Re-open file 
+    CALL h5fopen_f (FILENAME, H5F_ACC_RDONLY_F, fid1, error)
+    CALL check("h5fopen_f", error, total_error)
+
+    ! Open the dataset 
+
+    CALL h5dopen_f(fid1, "Dataset1", dataset, error)
+    CALL check("h5dopen_f", error, total_error)
+    
+    !  Get the datatype 
+    CALL h5dget_type_f(dataset, tid1, error)
+    CALL check("h5dget_type_f", error, total_error)
+
+    !  Check the array rank 
+    CALL h5tget_array_ndims_f(tid1, ndims, error)
+    CALL check("h5tget_array_ndims_f", error, total_error)
+    CALL VERIFY("h5tget_array_ndims_f",ndims, ARRAY1_RANK, total_error)
+
+
+    ! Get the array dimensions 
+    ALLOCATE(rdims1(1:ndims))
+    CALL h5tget_array_dims_f(tid1, rdims1, error)
+    CALL check("h5tget_array_dims_f", error, total_error)
+
+    !  Check the array dimensions 
+    DO i = 1, ndims
+       CALL VERIFY("h5tget_array_dims_f", INT(rdims1(i)), INT(tdims1(i)), total_error)
+    ENDDO
+
+    !  Get the compound datatype 
+    CALL h5tget_super_f(tid1, tid2, error)
+    CALL check("h5tget_super_f", error, total_error)
+
+    !  Check the number of members 
+    CALL h5tget_nmembers_f(tid2, nmemb, error)
+    CALL check("h5tget_nmembers_f", error, total_error)
+    CALL VERIFY("h5tget_nmembers_f", nmemb, 3, total_error)
+
+    !  Check the 1st field's name 
+    CALL H5Tget_member_name_f(tid2, 0, mname, namelen,error)
+    CALL check("H5Tget_member_name_f", error, total_error)
+    CALL verify("H5Tget_member_name_f",mname(1:namelen),"i", total_error)
+
+    !  Check the 1st field's offset 
+
+    CALL H5Tget_member_offset_f(tid2, 0, off, error)
+    CALL check("H5Tget_member_offset_f", error, total_error)
+    CALL VERIFY("H5Tget_member_offset_f",INT(off),0, total_error) 
+
+    !  Check the 1st field's datatype 
+    CALL H5Tget_member_type_f(tid2, 0, mtid, error)
+    CALL check("H5Tget_member_type_f", error, total_error)
+
+    CALL H5Tequal_f(mtid, H5T_NATIVE_INTEGER, flag, error)
+    CALL check("H5Tequal_f", error, total_error) 
+    CALL verify("H5Tequal_f", flag, .TRUE., total_error)
+
+    CALL h5tclose_f(mtid,error)
+    CALL check("h5tclose_f", error, total_error)
+
+    !  Check the 2nd field's name 
+    CALL H5Tget_member_name_f(tid2, 1, mname, namelen,error)
+    CALL check("H5Tget_member_name_f", error, total_error)
+    CALL verify("H5Tget_member_name_f",mname(1:namelen),"f", total_error)
+
+    !  Check the 2nd field's offset 
+    CALL H5Tget_member_offset_f(tid2, 1, off, error)
+    CALL check("H5Tget_member_offset_f", error, total_error)
+    CALL VERIFY("H5Tget_member_offset_f",INT(off),INT(H5OFFSETOF(C_LOC(wdata(1,1)),C_LOC(wdata(1,1)%f))), total_error) 
+
+    !  Check the 2nd field's datatype 
+    CALL H5Tget_member_type_f(tid2, 1, mtid, error)
+    CALL check("H5Tget_member_type_f", error, total_error)
+
+    !  Get the 2nd field's class 
+    CALL H5Tget_class_f(mtid, mclass, error)
+    CALL check("H5Tget_class_f", error, total_error)
+    CALL VERIFY("H5Tget_class_f",mclass, H5T_ARRAY_F, total_error)
+
+    !  Check the array rank 
+    CALL h5tget_array_ndims_f(mtid, ndims, error)
+    CALL check("h5tget_array_ndims_f", error, total_error)
+    CALL VERIFY("h5tget_array_ndims_f",ndims, ARRAY1_RANK, total_error)
+
+    !  Get the array dimensions 
+    CALL h5tget_array_dims_f(mtid, rdims1, error)
+    CALL check("h5tget_array_dims_f", error, total_error)
+
+    !  Check the array dimensions 
+    DO i = 1, ndims
+       CALL VERIFY("h5tget_array_dims_f", INT(rdims1(i)), INT(tdims2(i)), total_error)
+    ENDDO
+
+    !  Check the 3rd field's name 
+    CALL H5Tget_member_name_f(tid2, 2, mname, namelen,error)
+    CALL check("H5Tget_member_name_f", error, total_error)
+    CALL verify("H5Tget_member_name_f",mname(1:namelen),"c", total_error)
+
+    !  Check the 3rd field's offset 
+    CALL H5Tget_member_offset_f(tid2, 2, off, error)
+    CALL check("H5Tget_member_offset_f", error, total_error)
+    CALL VERIFY("H5Tget_member_offset_f",INT(off),&
+         INT(H5OFFSETOF(C_LOC(wdata(1,1)),C_LOC(wdata(1,1)%c(1)(1:1)))), total_error) 
+
+    !  Check the 3rd field's datatype 
+    CALL H5Tget_member_type_f(tid2, 2, mtid2, error)
+    CALL check("H5Tget_member_type_f", error, total_error)
+
+    !  Get the 3rd field's class 
+    CALL H5Tget_class_f(mtid2, mclass, error)
+    CALL check("H5Tget_class_f", error, total_error)
+    CALL VERIFY("H5Tget_class_f",mclass, H5T_ARRAY_F, total_error)
+
+    !  Check the array rank 
+    CALL h5tget_array_ndims_f(mtid2, ndims, error)
+    CALL check("h5tget_array_ndims_f", error, total_error)
+    CALL VERIFY("h5tget_array_ndims_f",ndims, ARRAY1_RANK, total_error)
+
+    !  Get the array dimensions 
+    CALL h5tget_array_dims_f(mtid2, rdims1, error)
+    CALL check("h5tget_array_dims_f", error, total_error)
+
+    !  Check the array dimensions 
+    DO i = 1, ndims
+       CALL VERIFY("h5tget_array_dims_f", INT(rdims1(i)), INT(tdims2(i)), total_error)
+    ENDDO
+
+    !  Check the nested array's datatype 
+    CALL H5Tget_super_f(mtid, tid3, error)
+    CALL check("H5Tget_super_f", error, total_error)
+
+    CALL H5Tequal_f(tid3, H5T_NATIVE_REAL, flag, error)
+    CALL check("H5Tequal_f", error, total_error) 
+    CALL verify("H5Tequal_f", flag, .TRUE., total_error)
+
+    !  Check the nested array's datatype 
+    CALL H5Tget_super_f(mtid2, tid3, error)
+    CALL check("H5Tget_super_f", error, total_error)
+
+    CALL H5Tequal_f(tid3, atype_id, flag, error)
+    CALL check("H5Tequal_f", error, total_error) 
+    CALL verify("H5Tequal_f", flag, .TRUE., total_error)
+
+    !  Close the array's base type datatype 
+    CALL h5tclose_f(tid3, error)
+    CALL check("h5tclose_f", error, total_error)
+
+    !  Close the member datatype 
+    CALL h5tclose_f(mtid,error)
+    CALL check("h5tclose_f", error, total_error)
+
+    !  Close the member datatype 
+    CALL h5tclose_f(mtid2,error)
+    CALL check("h5tclose_f", error, total_error)
+
+    !  Close Compound Datatype 
+    CALL h5tclose_f(tid2,error)
+    CALL check("h5tclose_f", error, total_error)
+
+    !  READ dataset from disk 
+    
+    f_ptr = c_null_ptr
+    f_ptr = C_LOC(rdata(1,1))
+    CALL H5Dread_f(dataset, tid1, f_ptr, error)
+    CALL check("H5Dread_f", error, total_error)
+
+    !  Compare data read in 
+    DO i = 1, SPACE1_DIM1
+       DO j = 1, ARRAY1_DIM1
+          IF(wdata(i,j)%i.NE.rdata(i,j)%i)THEN
+             PRINT*, 'ERROR: Wrong integer data is read back by H5Dread_f '
+             total_error = total_error + 1
+          ENDIF
+          DO k = 1, ARRAY2_DIM1
+             
+             IF(wdata(i,j)%f(k).NE.rdata(i,j)%f(k))THEN
+                PRINT*, 'ERROR: Wrong real array data is read back by H5Dread_f '
+                total_error = total_error + 1
+             ENDIF
+             IF(wdata(i,j)%c(k).NE.rdata(i,j)%c(k))THEN
+                PRINT*, 'ERROR: Wrong character array data is read back by H5Dread_f '
+                total_error = total_error + 1
+             ENDIF
+          ENDDO
+       ENDDO
+    ENDDO
+
+    !  Close Datatype 
+    CALL h5tclose_f(tid1,error)
+    CALL check("h5tclose_f", error, total_error)
+
+    !  Close Dataset 
+    CALL h5dclose_f(dataset, error)
+    CALL check("h5dclose_f", error, total_error)
+
+    !  Close file 
+    CALL h5fclose_f(fid1,error)
+    CALL check("h5fclose_f", error, total_error)
+  END SUBROUTINE test_array_compound_array
+!!$
+!!$!***************************************************************
+!!$!**
+!!$!**  test_array_bkg(): Test basic array datatype code.
+!!$!**      Tests reading compound datatype with array fields and
+!!$!**          writing partial fields.
+!!$!**
+!!$!***************************************************************
+!!$
+  SUBROUTINE test_array_bkg(total_error)
+    
+    IMPLICIT NONE
+
+    INTEGER, INTENT(INOUT) :: total_error
+
+    INTEGER, PARAMETER :: LENGTH = 5
+    INTEGER, PARAMETER :: ALEN = 10
+    INTEGER, PARAMETER :: RANK = 1
+    INTEGER, PARAMETER :: NMAX = 100
+    CHARACTER(LEN=17), PARAMETER :: FIELDNAME = "ArrayofStructures"
+
+    INTEGER(hid_t) :: fid, array_dt
+    INTEGER(hid_t) :: space
+    INTEGER(hid_t) :: type
+    INTEGER(hid_t) :: dataset
+
+    INTEGER(hsize_t), DIMENSION(1:1) :: dim =(/LENGTH/)
+    INTEGER(hsize_t), DIMENSION(1:1) :: dima =(/ALEN/)
+
+    INTEGER :: i, j
+    INTEGER, DIMENSION(1:3) :: ndims = (/1,1,1/)
+
+    TYPE CmpField_struct
+       INTEGER, DIMENSION(1:ALEN) :: a
+       REAL(KIND=sp), DIMENSION(1:ALEN) :: b
+       REAL(KIND=dp), DIMENSION(1:ALEN) :: c
+    ENDTYPE CmpField_struct
+
+    TYPE(CmpField_struct), DIMENSION(1:LENGTH), TARGET :: cf
+    TYPE(CmpField_struct), DIMENSION(1:LENGTH), TARGET :: cfr
+    
+    TYPE CmpDTSinfo_struct
+       INTEGER :: nsubfields
+       CHARACTER(LEN=5), DIMENSION(1:nmax) :: name
+       INTEGER(size_t), DIMENSION(1:nmax) :: offset
+       INTEGER(hid_t), DIMENSION(1:nmax) :: datatype
+    END TYPE CmpDTSinfo_struct
+
+    TYPE(CmpDTSinfo_struct) :: dtsinfo
+
+    TYPE fld_t_struct
+       REAL(KIND=sp), DIMENSION(1:ALEN) :: b
+    END TYPE fld_t_struct
+ 
+    INTEGER(SIZE_T) :: type_sizei  ! Size of the integer datatype 
+    INTEGER(SIZE_T) :: type_sizer  ! Size of the real datatype 
+    INTEGER(SIZE_T) :: type_sized  ! Size of the double datatype
+    INTEGER(SIZE_T) :: sizeof_compound ! total size of compound
+
+    TYPE(fld_t_struct), DIMENSION(1:LENGTH), TARGET :: fld
+    TYPE(fld_t_struct), DIMENSION(1:LENGTH), TARGET :: fldr
+
+    CHARACTER(LEN=10), PARAMETER :: FILENAME = "tarray3.h5"
+
+    INTEGER(HSIZE_T), ALLOCATABLE, DIMENSION(:) :: rdims1 ! Array dimensions for reading 
+    INTEGER(HSIZE_T), ALLOCATABLE, DIMENSION(:) :: rdims ! Array dimensions for reading 
+
+    INTEGER :: error
+    TYPE(c_ptr) :: f_ptr
+    
+!     Initialize the data 
+!     ------------------- 
+
+    DO i = 1, LENGTH
+       DO j = 1, ALEN
+          cf(i)%a(j) = 100*(i+1) + j
+          cf(i)%b(j) = (100.*(i+1) + 0.01*j)
+          cf(i)%c(j) = 100.*(i+1) + 0.02*j
+       ENDDO
+    ENDDO
+
+    ! Set the number of data members 
+    ! ------------------------------ 
+
+    dtsinfo%nsubfields = 3
+
+    ! Initialize the offsets  
+    ! ----------------------- 
+    CALL h5tget_size_f(H5T_NATIVE_INTEGER, type_sizei, error)
+    CALL check("h5tget_size_f", error, total_error)
+    IF(h5_sizeof(cf(1)%b(1)).EQ.4_size_t)THEN
+       CALL h5tget_size_f(H5T_NATIVE_REAL_C_FLOAT, type_sizer, error)
+       CALL check("h5tget_size_f", error, total_error)
+    ELSE IF(h5_sizeof(cf(1)%b(1)).EQ.8_size_t)THEN
+       CALL h5tget_size_f(H5T_NATIVE_REAL_C_DOUBLE, type_sizer, error)
+       CALL check("h5tget_size_f", error, total_error)
+    ENDIF
+
+    CALL h5tget_size_f(H5T_NATIVE_DOUBLE, type_sized, error)
+    CALL check("h5tget_size_f", error, total_error)
+
+    dtsinfo%offset(1)   = H5OFFSETOF(C_LOC(cf(1)),C_LOC(cf(1)%a(1)))
+    dtsinfo%offset(2)   = H5OFFSETOF(C_LOC(cf(1)),C_LOC(cf(1)%b(1))) 
+    dtsinfo%offset(3)   = H5OFFSETOF(C_LOC(cf(1)),C_LOC(cf(1)%c(1)))
+
+
+    ! Initialize the data type IDs 
+    ! ---------------------------- 
+    dtsinfo%datatype(1) = H5T_NATIVE_INTEGER;
+    dtsinfo%datatype(2) = H5T_NATIVE_REAL_C_FLOAT;
+    dtsinfo%datatype(3) = H5T_NATIVE_REAL_C_DOUBLE;
+
+
+    ! Initialize the names of data members 
+    ! ------------------------------------ 
+     
+    dtsinfo%name(1) = "One  "
+    dtsinfo%name(2) = "Two  "
+    dtsinfo%name(3) = "Three"
+       
+    ! Create file 
+    ! ----------- 
+    CALL h5fcreate_f(FILENAME,H5F_ACC_TRUNC_F,fid,error)
+    CALL check("h5fcreate_f", error, total_error)   
+
+
+    ! Create data space 
+    ! ----------------- 
+    CALL h5screate_simple_f(RANK, dim, space, error)
+    CALL check("h5screate_simple_f", error, total_error)
+
+
+    ! Create the memory data type 
+    ! --------------------------- 
+
+    CALL h5tcreate_f(H5T_COMPOUND_F, H5OFFSETOF(C_LOC(cf(1)), C_LOC(cf(2))), type, error)
+    CALL check("h5tcreate_f", error, total_error)
+
+    ! Add  members to the compound data type 
+    ! -------------------------------------- 
+
+    DO i = 1, dtsinfo%nsubfields
+       CALL h5tarray_create_f(dtsinfo%datatype(i), ndims(i), dima, array_dt, error)
+       CALL check("h5tarray_create_f", error, total_error)
+       CALL H5Tinsert_f(type, dtsinfo%name(i), dtsinfo%offset(i), array_dt, error)
+       CALL check("h5tinsert_f", error, total_error)
+
+       CALL h5tclose_f(array_dt,error)
+       CALL check("h5tclose_f", error, total_error)
+    ENDDO
+
+    ! Create the dataset 
+    ! ------------------ /
+    CALL h5dcreate_f(fid,FIELDNAME,type, space, dataset,error)
+    CALL check("h5dcreate_f", error, total_error)
+
+    ! Write data to the dataset 
+    ! ------------------------- 
+
+    ALLOCATE(rdims(1:2)) ! dummy not needed
+
+    f_ptr = C_LOC(cf(1))
+
+    CALL h5dwrite_f(dataset, type, f_ptr, error )
+    CALL check("h5dwrite_f", error, total_error)
+
+
+    ALLOCATE(rdims1(1:2)) ! dummy not needed
+    f_ptr = C_LOC(cfr(1))
+    CALL H5Dread_f(dataset, type, f_ptr, error)
+    CALL check("H5Dread_f", error, total_error)
+
+    ! Verify correct data 
+    ! ------------------- 
+    DO i = 1, LENGTH
+       DO j = 1, ALEN
+           IF( cf(i)%a(j) .NE. cfr(i)%a(j) )THEN
+             PRINT*, 'ERROR: Wrong integer data is read back by H5Dread_f '
+             total_error = total_error + 1
+          ENDIF
+          CALL VERIFY('ERROR: Wrong real data is read back by H5Dread_f ',cf(i)%b(j), cfr(i)%b(j), total_error)
+          CALL VERIFY('ERROR: Wrong double data is read back by H5Dread_f ',cf(i)%c(j), cfr(i)%c(j), total_error)
+       ENDDO
+    ENDDO
+
+
+    ! Release IDs 
+    ! ----------- 
+    CALL h5tclose_f(type,error)
+    CALL check("h5tclose_f", error, total_error)
+    CALL h5sclose_f(space,error)
+    CALL check("h5sclose_f", error, total_error)
+    CALL h5dclose_f(dataset, error)
+    CALL check("h5dclose_f", error, total_error)
+    CALL h5fclose_f(fid,error)
+    CALL check("h5fclose_f", error, total_error)
+
+    !****************************
+    ! Reopen the file and update 
+    !****************************
+
+    CALL h5fopen_f (FILENAME, H5F_ACC_RDWR_F, fid, error)
+    CALL check("h5fopen_f", error, total_error)
+
+    CALL h5dopen_f(fid, FIELDNAME, dataset, error)
+    CALL check("h5dopen_f", error, total_error)
+
+    sizeof_compound =  INT( type_sizer*ALEN, size_t)
+
+    CALL h5tcreate_f(H5T_COMPOUND_F, sizeof_compound , type, error)
+    CALL check("h5tcreate_f", error, total_error)
+
+    CALL h5tarray_create_f(H5T_NATIVE_REAL_C_FLOAT, 1, dima, array_dt, error)
+    CALL check("h5tarray_create_f", error, total_error)
+
+    CALL h5tinsert_f(TYPE, "Two", 0_size_t, array_dt, error)
+    CALL check("h5tinsert_f", error, total_error)
+
+    ! Initialize the data to overwrite 
+    ! -------------------------------- 
+    DO i = 1, LENGTH
+       DO j = 1, ALEN
+          fld(i)%b(j) = 1.313
+          cf(i)%b(j) = fld(i)%b(j)
+       ENDDO
+    ENDDO
+
+    f_ptr = C_LOC(fld(1))
+
+    CALL h5dwrite_f(dataset, TYPE, f_ptr, error )
+    CALL check("h5dwrite_f", error, total_error)
+
+
+    !  Read just the field changed 
+    
+    f_ptr = C_LOC(fldr(1))
+    CALL H5Dread_f(dataset, TYPE, f_ptr, error)
+    CALL check("H5Dread_f", error, total_error)
+
+    DO i = 1, LENGTH
+       DO j = 1, ALEN
+          CALL VERIFY('ERROR: Wrong real data is read back by H5Dread_f ',fld(i)%b(j), fldr(i)%b(j), total_error)
+       ENDDO
+    ENDDO
+    CALL h5tclose_f(TYPE,error)
+    CALL check("h5tclose_f", error, total_error)
+    CALL h5tclose_f(array_dt,error)
+    CALL check("h5tclose_f", error, total_error)
+
+    CALL h5dget_type_f(dataset, type, error)
+    CALL check("h5dget_type_f", error, total_error)
+
+
+    !  Read the entire dataset again 
+
+    f_ptr = C_LOC(cfr(1))
+    CALL H5Dread_f(dataset, TYPE, f_ptr, error)
+    CALL check("H5Dread_f", error, total_error)
+
+
+    ! Verify correct data 
+    ! ------------------- 
+
+    DO i = 1, LENGTH
+       DO j = 1, ALEN
+          CALL VERIFY('ERROR: Wrong integer data is read back by H5Dread_f ',cf(i)%a(j), cfr(i)%a(j), total_error)
+          CALL VERIFY('ERROR: Wrong real data is read back by H5Dread_f ',cf(i)%b(j),cfr(i)%b(j), total_error)
+          CALL VERIFY('ERROR: Wrong double data is read back by H5Dread_f ',cf(i)%c(j), cfr(i)%c(j), total_error)
+       ENDDO
+    ENDDO
+
+    CALL h5dclose_f(dataset, error)
+    CALL check("h5dclose_f", error, total_error)
+
+    CALL h5tclose_f(type,error)
+    CALL check("h5tclose_f", error, total_error)
+
+    CALL h5fclose_f(fid,error)
+    CALL check("h5fclose_f", error, total_error)
+
+!**************************************************
+! Reopen the file and print out all the data again 
+!**************************************************
+
+    CALL h5fopen_f (FILENAME, H5F_ACC_RDWR_F, fid, error)
+    CALL check("h5fopen_f", error, total_error)
+
+
+    CALL h5dopen_f(fid, FIELDNAME, dataset, error)
+    CALL check("h5dopen_f", error, total_error)
+
+
+    CALL h5dget_type_f(dataset, type, error)
+    CALL check("h5dget_type_f", error, total_error)
+
+
+    ! Reset the data to read in 
+    ! ------------------------- 
+
+    DO i = 1, LENGTH
+       cfr(i)%a(:) = 0
+       cfr(i)%b(:) = 0
+       cfr(i)%c(:) = 0
+    ENDDO
+
+    f_ptr = C_LOC(cfr(1))
+    CALL H5Dread_f(dataset, TYPE, f_ptr, error)
+    CALL check("H5Dread_f", error, total_error)
+
+    ! Verify correct data 
+    ! ------------------- 
+
+    DO i = 1, LENGTH
+       DO j = 1, ALEN
+          CALL VERIFY('ERROR: Wrong integer data is read back by H5Dread_f ',cf(i)%a(j), cfr(i)%a(j), total_error)
+          CALL VERIFY('ERROR: Wrong real data is read back by H5Dread_f ',cf(i)%b(j),cfr(i)%b(j), total_error)
+          CALL VERIFY('ERROR: Wrong double data is read back by H5Dread_f ',cf(i)%c(j), cfr(i)%c(j), total_error)
+       ENDDO
+    ENDDO
+
+    CALL h5dclose_f(dataset, error)
+    CALL check("h5dclose_f", error, total_error)
+
+    CALL h5tclose_f(type,error)
+    CALL check("h5tclose_f", error, total_error)
+
+    CALL h5fclose_f(fid,error)
+    CALL check("h5fclose_f", error, total_error)
+
+  END SUBROUTINE test_array_bkg
+
+  SUBROUTINE test_h5kind_to_type(total_error)
+
+    IMPLICIT NONE
+    
+    INTEGER, INTENT(INOUT) :: total_error
+    
+    INTEGER, PARAMETER :: int_kind_1 = SELECTED_INT_KIND(2) !should map to INTEGER*1 on most modern processors
+    INTEGER, PARAMETER :: int_kind_4 = SELECTED_INT_KIND(4) !should map to INTEGER*2 on most modern processors
+    INTEGER, PARAMETER :: int_kind_8 = SELECTED_INT_KIND(9) !should map to INTEGER*4 on most modern processors
+    INTEGER, PARAMETER :: int_kind_16 = SELECTED_INT_KIND(18) !should map to INTEGER*8 on most modern processors
+#if H5_HAVE_Fortran_INTEGER_SIZEOF_16!=0 
+    INTEGER, PARAMETER :: int_kind_32 = SELECTED_INT_KIND(36) !should map to INTEGER*16 on most modern processors
+    INTEGER(int_kind_32), DIMENSION(1:4), TARGET :: dset_data_i32, data_out_i32  
+    INTEGER(HID_T) :: dset_id32     ! Dataset identifier 
+    CHARACTER(LEN=6), PARAMETER :: dsetname16 = "dset16"     ! Dataset name 
+#endif
+    INTEGER, PARAMETER :: real_kind_7  = C_FLOAT   !should map to REAL*4 on most modern processors
+    INTEGER, PARAMETER :: real_kind_15 = C_DOUBLE  !should map to REAL*8 on most modern processors
+    
+! Check if C has quad precision extension
+#if H5_HAVE_FLOAT128!=0
+! Check if Fortran supports quad precision
+# if H5_PAC_FC_MAX_REAL_PRECISION > 26
+    INTEGER, PARAMETER :: real_kind_31 = SELECTED_REAL_KIND(31)
+# else
+    INTEGER, PARAMETER :: real_kind_31 = SELECTED_REAL_KIND(15,307)
+# endif
+#else
+! Check if the default of long double is quad precision
+# if H5_PAC_C_MAX_REAL_PRECISION  > 26
+#   if H5_PAC_FC_MAX_REAL_PRECISION > 26
+    INTEGER, PARAMETER :: real_kind_31 = SELECTED_REAL_KIND(31)
+#   else
+    INTEGER, PARAMETER :: real_kind_31 = SELECTED_REAL_KIND(15,307)
+#   endif
+# else
+    INTEGER, PARAMETER :: real_kind_31 = SELECTED_REAL_KIND(15,307)
+# endif
+#endif
+    REAL(real_kind_31), DIMENSION(1:4), TARGET :: dset_data_r31, data_out_r31   
+    INTEGER(HID_T) :: dset_idr16      ! Dataset identifier 
+    CHARACTER(LEN=7), PARAMETER :: dsetnamer16 = "dsetr16"     ! Dataset name
+
+    CHARACTER(LEN=12), PARAMETER :: filename = "dsetf_F03.h5" ! File name
+    CHARACTER(LEN=5), PARAMETER :: dsetname1 = "dset1"     ! Dataset name
+    CHARACTER(LEN=5), PARAMETER :: dsetname2 = "dset2"     ! Dataset name
+    CHARACTER(LEN=5), PARAMETER :: dsetname4 = "dset4"     ! Dataset name
+    CHARACTER(LEN=5), PARAMETER :: dsetname8 = "dset8"     ! Dataset name
+    CHARACTER(LEN=6), PARAMETER :: dsetnamer = "dsetr"     ! Dataset name
+    CHARACTER(LEN=6), PARAMETER :: dsetnamer4 = "dsetr4"     ! Dataset name
+    CHARACTER(LEN=6), PARAMETER :: dsetnamer8 = "dsetr8"     ! Dataset name
+    
+    INTEGER(HID_T) :: file_id       ! File identifier 
+    INTEGER(HID_T) :: dset_id1      ! Dataset identifier  
+    INTEGER(HID_T) :: dset_id4      ! Dataset identifier   
+    INTEGER(HID_T) :: dset_id8      ! Dataset identifier  
+    INTEGER(HID_T) :: dset_id16     ! Dataset identifier     
+    INTEGER(HID_T) :: dset_idr       ! Dataset identifier 
+    INTEGER(HID_T) :: dset_idr4      ! Dataset identifier   
+    INTEGER(HID_T) :: dset_idr8      ! Dataset identifier 
+    
+    INTEGER :: error ! Error flag
+    INTEGER :: i
+    
+! Data buffers:
+
+    INTEGER(int_kind_1), DIMENSION(1:4), TARGET :: dset_data_i1, data_out_i1
+    INTEGER(int_kind_4), DIMENSION(1:4), TARGET :: dset_data_i4, data_out_i4
+    INTEGER(int_kind_8), DIMENSION(1:4), TARGET :: dset_data_i8, data_out_i8
+    INTEGER(int_kind_16), DIMENSION(1:4), TARGET :: dset_data_i16, data_out_i16
+
+    REAL, DIMENSION(1:4), TARGET :: dset_data_r, data_out_r
+    REAL(real_kind_7), DIMENSION(1:4), TARGET :: dset_data_r7, data_out_r7
+    REAL(real_kind_15), DIMENSION(1:4), TARGET :: dset_data_r15, data_out_r15
+    
+    INTEGER(HSIZE_T), DIMENSION(1:1) :: data_dims = (/4/) 
+    INTEGER(HID_T) :: dspace_id     ! Dataspace identifier
+    
+    TYPE(C_PTR) :: f_ptr
+
+    !
+    ! Initialize the dset_data array.
+    !
+    DO i = 1, 4
+       dset_data_i1(i)  = HUGE(0_int_kind_1)-i
+       dset_data_i4(i)  = HUGE(0_int_kind_4)-i
+       dset_data_i8(i)  = HUGE(0_int_kind_8)-i
+       dset_data_i16(i) = HUGE(0_int_kind_16)-i
+#if H5_HAVE_Fortran_INTEGER_SIZEOF_16!=0
+       dset_data_i32(i) = HUGE(0_int_kind_32)-i
+#endif
+       dset_data_r(i) = 4.0*ATAN(1.0)-REAL(i-1)
+       dset_data_r7(i) = 4.0_real_kind_7*ATAN(1.0_real_kind_7)-REAL(i-1,real_kind_7)
+       dset_data_r15(i) = 4.0_real_kind_15*ATAN(1.0_real_kind_15)-REAL(i-1,real_kind_15)
+       dset_data_r31(i) = 4.0_real_kind_31*ATAN(1.0_real_kind_31)-REAL(i-1,real_kind_31)
+       
+    END DO
+
+    CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, error)
+    CALL check("h5fcreate_f",error, total_error)
+  !
+  ! Create dataspaces for datasets
+  !
+    CALL h5screate_simple_f(1, data_dims , dspace_id, error)
+    CALL check("h5screate_simple_f",error, total_error)
+  !
+  ! Create the dataset.
+  !
+    CALL H5Dcreate_f(file_id, dsetname1, h5kind_to_type(int_kind_1,H5_INTEGER_KIND),  dspace_id, dset_id1, error)
+    CALL check("H5Dcreate_f",error, total_error)
+    CALL H5Dcreate_f(file_id, dsetname2, h5kind_to_type(int_kind_4,H5_INTEGER_KIND),  dspace_id, dset_id4, error)
+    CALL check("H5Dcreate_f",error, total_error)
+    CALL H5Dcreate_f(file_id, dsetname4, h5kind_to_type(int_kind_8,H5_INTEGER_KIND),  dspace_id, dset_id8, error)
+    CALL check("H5Dcreate_f",error, total_error)
+    CALL H5Dcreate_f(file_id, dsetname8, h5kind_to_type(int_kind_16,H5_INTEGER_KIND), dspace_id, dset_id16, error)
+    CALL check("H5Dcreate_f",error, total_error)
+#if H5_HAVE_Fortran_INTEGER_SIZEOF_16!=0
+    CALL H5Dcreate_f(file_id, dsetname16, h5kind_to_type(int_kind_32,H5_INTEGER_KIND), dspace_id, dset_id32, error)
+    CALL check("H5Dcreate_f",error, total_error)
+#endif
+    CALL H5Dcreate_f(file_id, dsetnamer, H5T_NATIVE_REAL, dspace_id, dset_idr, error)
+    CALL check("H5Dcreate_f",error, total_error)
+    CALL H5Dcreate_f(file_id, dsetnamer4, h5kind_to_type(real_kind_7,H5_REAL_KIND),  dspace_id, dset_idr4, error)
+    CALL check("H5Dcreate_f",error, total_error)
+    CALL H5Dcreate_f(file_id, dsetnamer8, h5kind_to_type(real_kind_15,H5_REAL_KIND), dspace_id, dset_idr8, error)
+    CALL check("H5Dcreate_f",error, total_error)
+!#ifdef H5_HAVE_FLOAT128
+    CALL H5Dcreate_f(file_id, dsetnamer16, h5kind_to_type(real_kind_31,H5_REAL_KIND), dspace_id, dset_idr16, error)
+    CALL check("H5Dcreate_f",error, total_error)
+!#endif
+  !
+  ! Write the dataset.
+  !
+    f_ptr = C_LOC(dset_data_i1(1))
+    CALL h5dwrite_f(dset_id1, h5kind_to_type(int_kind_1,H5_INTEGER_KIND), f_ptr, error)
+    CALL check("H5Dwrite_f",error, total_error)
+    f_ptr = C_LOC(dset_data_i4(1))
+    CALL h5dwrite_f(dset_id4, h5kind_to_type(int_kind_4,H5_INTEGER_KIND), f_ptr, error)
+    CALL check("H5Dwrite_f",error, total_error)
+    f_ptr = C_LOC(dset_data_i8(1))
+    CALL h5dwrite_f(dset_id8, h5kind_to_type(int_kind_8,H5_INTEGER_KIND), f_ptr, error)
+    CALL check("H5Dwrite_f",error, total_error)
+    f_ptr = C_LOC(dset_data_i16(1))
+    CALL h5dwrite_f(dset_id16, h5kind_to_type(int_kind_16,H5_INTEGER_KIND), f_ptr, error)
+    CALL check("H5Dwrite_f",error, total_error)
+#if H5_HAVE_Fortran_INTEGER_SIZEOF_16!=0
+    f_ptr = C_LOC(dset_data_i32(1))
+    CALL h5dwrite_f(dset_id32, h5kind_to_type(int_kind_32,H5_INTEGER_KIND), f_ptr, error)
+    CALL check("H5Dwrite_f",error, total_error)
+#endif
+    f_ptr = C_LOC(dset_data_r(1))
+    CALL h5dwrite_f(dset_idr, H5T_NATIVE_REAL, f_ptr, error)
+    CALL check("H5Dwrite_f",error, total_error)
+    f_ptr = C_LOC(dset_data_r7(1))
+    CALL h5dwrite_f(dset_idr4, h5kind_to_type(real_kind_7,H5_REAL_KIND), f_ptr, error)
+    CALL check("H5Dwrite_f",error, total_error)
+    f_ptr = C_LOC(dset_data_r15(1))
+    CALL h5dwrite_f(dset_idr8, h5kind_to_type(real_kind_15,H5_REAL_KIND), f_ptr, error)
+    CALL check("H5Dwrite_f",error, total_error)
+!#ifdef H5_HAVE_FLOAT128
+    f_ptr = C_LOC(dset_data_r31(1))
+    CALL h5dwrite_f(dset_idr16, h5kind_to_type(real_kind_31,H5_REAL_KIND), f_ptr, error)
+    CALL check("H5Dwrite_f",error, total_error)
+!#endif
+  !
+  ! Close the file
+  !
+    CALL h5fclose_f(file_id, error)
+    CALL check("h5fclose_f",error, total_error)
+
+  ! Open the file
+
+    CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file_id, error)
+    CALL check("h5fopen_f",error, total_error)
+  !
+  ! Read the dataset.
+  !
+  ! Read data back into an integer size that is larger then the original size used for 
+  ! writing the data
+    f_ptr = C_LOC(data_out_i1)
+    CALL h5dread_f(dset_id1, h5kind_to_type(int_kind_1,H5_INTEGER_KIND), f_ptr,  error)
+    CALL check("h5dread_f",error, total_error)
+    f_ptr = C_LOC(data_out_i4)
+    CALL h5dread_f(dset_id4, h5kind_to_type(int_kind_4,H5_INTEGER_KIND), f_ptr,  error)
+    CALL check("h5dread_f",error, total_error)
+    f_ptr = C_LOC(data_out_i8)
+    CALL h5dread_f(dset_id8, h5kind_to_type(int_kind_8,H5_INTEGER_KIND), f_ptr,  error)
+    CALL check("h5dread_f",error, total_error)
+    f_ptr = C_LOC(data_out_i16)
+    CALL h5dread_f(dset_id16, h5kind_to_type(int_kind_16,H5_INTEGER_KIND), f_ptr,  error)
+    CALL check("h5dread_f",error, total_error)
+#if H5_HAVE_Fortran_INTEGER_SIZEOF_16!=0
+    f_ptr = C_LOC(data_out_i32)
+    CALL h5dread_f(dset_id32, h5kind_to_type(int_kind_32,H5_INTEGER_KIND), f_ptr,  error)
+    CALL check("h5dread_f",error, total_error)
+#endif
+    f_ptr = C_LOC(data_out_r)
+    CALL h5dread_f(dset_idr, H5T_NATIVE_REAL, f_ptr,  error)
+    CALL check("h5dread_f",error, total_error)
+    f_ptr = C_LOC(data_out_r7)
+    CALL h5dread_f(dset_idr4, h5kind_to_type(real_kind_7,H5_REAL_KIND), f_ptr,  error)
+    CALL check("h5dread_f",error, total_error)
+    f_ptr = C_LOC(data_out_r15)
+    CALL h5dread_f(dset_idr8, h5kind_to_type(real_kind_15,H5_REAL_KIND), f_ptr,  error)
+    CALL check("h5dread_f",error, total_error)
+    f_ptr = C_LOC(data_out_r31)
+    CALL h5dread_f(dset_idr16, h5kind_to_type(real_kind_31,H5_REAL_KIND), f_ptr,  error)
+    CALL check("h5dread_f",error, total_error)
+    DO i = 1, 4
+       
+       CALL verify("h5kind_to_type",dset_data_i1(i),data_out_i1(i),total_error)
+       CALL verify("h5kind_to_type",dset_data_i4(i),data_out_i4(i),total_error)
+       CALL verify("h5kind_to_type",dset_data_i8(i),data_out_i8(i),total_error)
+       CALL verify("h5kind_to_type",dset_data_i16(i),data_out_i16(i),total_error)
+       
+#if H5_HAVE_Fortran_INTEGER_SIZEOF_16!=0
+       CALL verify("h5kind_to_type",dset_data_i32(i),data_out_i32(i),total_error)
+#endif
+       CALL verify("h5kind_to_type",dset_data_r(i),data_out_r(i),total_error)
+       CALL verify("h5kind_to_type",dset_data_r7(i),data_out_r7(i),total_error)
+       CALL verify("h5kind_to_type",dset_data_r15(i),data_out_r15(i),total_error)
+       CALL verify("h5kind_to_type",dset_data_r31(i),data_out_r31(i),total_error)
+    END DO
+    
+  !
+  ! Close the dataset.
+  !
+    CALL h5dclose_f(dset_id1, error)
+    CALL check("h5dclose_f",error, total_error)
+    CALL h5dclose_f(dset_id4, error)
+    CALL check("h5dclose_f",error, total_error)
+    CALL h5dclose_f(dset_id8, error)
+    CALL check("h5dclose_f",error, total_error)
+    CALL h5dclose_f(dset_id16, error)
+    CALL check("h5dclose_f",error, total_error)
+    CALL h5dclose_f(dset_idr4, error)
+    CALL check("h5dclose_f",error, total_error)
+    CALL h5dclose_f(dset_idr8, error)
+    CALL check("h5dclose_f",error, total_error)
+  !
+  ! Close the file.
+  !
+    CALL h5fclose_f(file_id, error)
+    CALL check("h5fclose_f",error, total_error)
+
+END SUBROUTINE test_h5kind_to_type
+
+!************************************************************
+!
+!  This test reads and writes array datatypes
+!  to a dataset.  The test first writes integers arrays of
+!  dimension ADIM0xADIM1 to a dataset with a dataspace of
+!  DIM0, then closes the  file.  Next, it reopens the file,
+!  reads back the data.
+!
+!************************************************************
+SUBROUTINE t_array(total_error)
+
+  IMPLICIT NONE
+    
+  INTEGER, INTENT(INOUT) :: total_error
+
+  CHARACTER(LEN=19), PARAMETER :: filename  = "t_array_F03.h5"
+  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
+  INTEGER          , PARAMETER :: dim0      = 4
+  INTEGER          , PARAMETER :: adim0     = 3
+  INTEGER          , PARAMETER :: adim1     = 5
+  INTEGER(HID_T)  :: file, filetype, memtype, space, dset ! Handles
+  INTEGER(HSIZE_T), DIMENSION(1:1)   :: dims = (/dim0/)
+  INTEGER(HSIZE_T), DIMENSION(1:2)   :: adims = (/adim0, adim1/)
+  INTEGER(HSIZE_T), DIMENSION(1:2)   :: maxdims
+  INTEGER, DIMENSION(1:dim0, 1:adim0, 1:adim1), TARGET :: wdata ! Write buffer 
+  INTEGER, DIMENSION(:,:,:), ALLOCATABLE, TARGET :: rdata    ! Read buffer
+  INTEGER :: i, j, k
+  TYPE(C_PTR) :: f_ptr
+  INTEGER :: error ! Error flag
+
+  !
+  ! Initialize data.  i is the element in the dataspace, j and k the
+  ! elements within the array datatype.
+  !
+  DO i = 1, dim0
+     DO j = 1, adim0
+        DO k = 1, adim1
+           wdata(i,j,k) = (i-1)*(j-1)-(j-1)*(k-1)+(i-1)*(k-1)
+        ENDDO
+     ENDDO
+  ENDDO
+  !
+  ! Create a new file using the default properties.
+  !
+  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
+  CALL check("h5fcreate_f",error, error)
+  !
+  ! Create array datatypes for file and memory.
+  !
+  CALL H5Tarray_create_f(INT(H5T_STD_I64LE, HID_T), 2, adims, filetype, error)
+  CALL check("H5Tarray_create_f",error, total_error)
+  CALL H5Tarray_create_f(H5T_NATIVE_INTEGER, 2, adims, memtype, error)
+  CALL check("H5Tarray_create_f",error, total_error)
+  !
+  ! Create dataspace.  Setting maximum size to be the current size.
+  !
+  CALL h5screate_simple_f(1, dims, space, error)
+  CALL check("h5screate_simple_f",error, total_error)
+  !
+  ! Create the dataset and write the array data to it.
+  !
+  CALL h5dcreate_f(file, dataset, filetype, space, dset, error)
+  CALL check("h5dcreate_f",error, total_error)
+  f_ptr = C_LOC(wdata)
+  CALL h5dwrite_f(dset, memtype, f_ptr, error)
+  CALL check("h5dwrite_f",error, total_error)
+  !
+  ! Close and release resources.
+  !
+  CALL H5Dclose_f(dset, error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL H5Sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  CALL H5Tclose_f(filetype, error)
+  CALL check("h5tclose_f",error, total_error)
+  CALL H5Tclose_f(memtype, error)
+  CALL check("h5tclose_f",error, total_error)
+  CALL H5Fclose_f(file, error)
+  CALL check("h5fclose_f",error, total_error)
+  !
+  ! Now we begin the read section of this example. 
+  !
+  ! Open file, dataset, and attribute.
+  !
+  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
+  CALL check("h5fopen_f",error, total_error)
+  CALL h5dopen_f(file, dataset, dset, error)
+  CALL check("h5dopen_f",error, total_error)
+  !
+  ! Get the datatype and its dimensions.
+  !
+  CALL h5dget_type_f(dset, filetype, error)
+  CALL check("h5dget_type_f",error, error)
+  CALL H5Tget_array_dims_f(filetype, adims, error)
+  CALL check("h5dget_type_f",error, total_error)
+  CALL VERIFY("H5Tget_array_dims_f", adims(1), INT(adim0,hsize_t), total_error)
+  CALL VERIFY("H5Tget_array_dims_f", adims(2), INT(adim1,hsize_t), total_error)
+  !
+  ! Get dataspace and allocate memory for read buffer.  This is a
+  ! three dimensional attribute when the array datatype is included.
+  !
+  CALL H5Dget_space_f(dset, space, error)
+  CALL check("H5Dget_space_f",error, error)
+  CALL H5Sget_simple_extent_dims_f(space, dims, maxdims, error)
+  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
+  CALL VERIFY("H5Sget_simple_extent_dims_f", dims(1), INT(dim0,hsize_t), total_error)
+
+  ALLOCATE(rdata(1:dims(1),1:adims(1),1:adims(2)))
+  !
+  ! Create the memory datatype.
+  ! 
+  CALL H5Tarray_create_f(H5T_NATIVE_INTEGER, 2, adims, memtype, error)
+  CALL check("H5Tarray_create_f",error, total_error)
+  !
+  ! Read the data.
+  !
+
+  f_ptr = C_LOC(rdata)
+  CALL H5Dread_f(dset, memtype, f_ptr, error)
+  CALL check("H5Dread_f",error, total_error)
+  !
+  ! Output the data to the screen.
+  !
+  i_loop: DO i = 1, INT(dims(1))
+             DO j=1, INT(adim0)
+                DO k = 1, INT(adim1)
+                   CALL VERIFY("H5Sget_simple_extent_dims_f",  rdata(i,j,k), wdata(i,j,k), total_error)
+                   IF(total_error.NE.0) EXIT i_loop
+                ENDDO
+             ENDDO
+          ENDDO i_loop
+  !
+  ! Close and release resources.
+  !
+  DEALLOCATE(rdata)
+  CALL H5Dclose_f(dset, error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL H5Sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  CALL H5Tclose_f(filetype, error)
+  CALL check("h5tclose_f",error, total_error)
+  CALL H5Tclose_f(memtype, error)
+  CALL check("h5tclose_f",error, total_error)
+  CALL H5Fclose_f(file, error)
+  CALL check("h5fclose_f",error, total_error)
+
+END SUBROUTINE t_array
+
+SUBROUTINE t_enum(total_error)
+
+  IMPLICIT NONE
+
+  INTEGER, INTENT(INOUT) :: total_error
+
+  CHARACTER(LEN=19), PARAMETER :: filename  = "t_enum_F03.h5"
+  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
+  INTEGER          , PARAMETER :: dim0      = 4
+  INTEGER          , PARAMETER :: dim1      = 7
+  INTEGER(HID_T)               :: F_BASET  ! File base type
+  INTEGER(HID_T)               :: M_BASET  ! Memory base type
+  INTEGER(SIZE_T)  , PARAMETER :: NAME_BUF_SIZE = 16
+
+! Enumerated type
+  INTEGER, PARAMETER :: SOLID=0, LIQUID=1, GAS=2, PLASMA=3
+
+  INTEGER(HID_T) :: file, filetype, memtype, space, dset ! Handles
+
+  INTEGER(hsize_t),   DIMENSION(1:2) :: dims = (/dim0, dim1/)
+  INTEGER, DIMENSION(1:dim0, 1:dim1), TARGET :: wdata ! Write buffer
+  INTEGER, DIMENSION(:,:), ALLOCATABLE, TARGET :: rdata ! Read buffer
+  INTEGER, DIMENSION(1:1), TARGET :: val
+
+  CHARACTER(LEN=6), DIMENSION(1:4) :: &
+       names = (/"SOLID ", "LIQUID", "GAS   ", "PLASMA"/)
+  CHARACTER(LEN=NAME_BUF_SIZE) :: name
+  INTEGER(HSIZE_T), DIMENSION(1:2) :: maxdims
+  INTEGER :: i, j, idx
+  TYPE(C_PTR) :: f_ptr
+  INTEGER :: error ! Error flag
+  !
+  ! Initialize DATA.
+  !
+  F_BASET   = H5T_STD_I16BE      ! File base type
+  M_BASET   = H5T_NATIVE_INTEGER ! Memory base type
+  DO i = 1, dim0
+     DO j = 1, dim1 
+        wdata(i,j) = MOD( (j-1)*(i-1), PLASMA+1)
+     ENDDO
+  ENDDO
+  !
+  ! Create a new file using the default properties.
+  !
+  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
+  CALL check("h5fcreate_f",error, total_error)
+  !
+  ! Create the enumerated datatypes for file and memory.  This
+  ! process is simplified IF native types are used for the file,
+  ! as only one type must be defined.
+  !
+  CALL h5tenum_create_f(F_BASET, filetype, error)
+  CALL check("h5tenum_create_f",error, total_error)
+  
+  CALL h5tenum_create_f(M_BASET, memtype, error)
+  CALL check("h5tenum_create_f",error, total_error)
+
+  DO i = SOLID, PLASMA
+     !
+     ! Insert enumerated value for memtype.
+     !
+     val(1) = i
+     f_ptr = C_LOC(val(1))
+     CALL H5Tenum_insert_f(memtype, TRIM(names(i+1)), f_ptr, error)
+     CALL check("H5Tenum_insert_f", error, total_error)
+     !
+     ! Insert enumerated value for filetype.  We must first convert
+     ! the numerical value val to the base type of the destination.
+     !
+     f_ptr = C_LOC(val(1))
+     CALL H5Tconvert_f(M_BASET, F_BASET, INT(1,SIZE_T), f_ptr, error)
+     CALL check("H5Tconvert_f",error, total_error)
+     IF(i.GE.1)THEN ! test both F90 and F03 APIs
+        CALL H5Tenum_insert_f(filetype, TRIM(names(i+1)), f_ptr, error)
+     ELSE
+        CALL H5Tenum_insert_f(filetype, TRIM(names(i+1)), val(1), error)
+     ENDIF
+     CALL check("H5Tenum_insert_f",error, total_error)
+  ENDDO
+  !
+  ! Create dataspace.  Setting maximum size to be the current size.
+  !
+  CALL h5screate_simple_f(2, dims, space, total_error)
+  CALL check("h5screate_simple_f",error, total_error)
+  !
+  ! Create the dataset and write the enumerated data to it.
+  ! 
+  CALL h5dcreate_f(file, dataset, filetype, space, dset, error)
+  CALL check("h5dcreate_f",error, total_error)
+  f_ptr = C_LOC(wdata(1,1))
+  CALL h5dwrite_f(dset, memtype, f_ptr, error)
+  CALL check("h5dwrite_f",error, total_error)
+  !
+  ! Close and release resources.
+  !
+  CALL h5dclose_f(dset , error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL h5sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  CALL h5tclose_f(filetype, error)
+  CALL check("h5tclose_f",error, total_error)
+  CALL h5fclose_f(file , error)
+  CALL check("h5fclose_f",error, total_error)
+
+  !
+  ! Now we begin the read section of this example.
+  !
+  ! Open file and dataset.
+  !
+  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
+  CALL check("h5fopen_f",error, total_error)
+  CALL h5dopen_f (file, dataset, dset, error)
+  CALL check("h5dopen_f",error, total_error)
+  CALL h5dopen_f(file, dataset, dset, error)
+  CALL check("h5dopen_f",error, total_error)
+  !
+  ! Get dataspace and allocate memory for read buffer.
+  !
+  CALL h5dget_space_f(dset,space, error)
+  CALL check("H5Dget_space_f",error, total_error)
+  CALL h5sget_simple_extent_dims_f(space, dims, maxdims, error)
+  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
+  CALL VERIFY("H5Sget_simple_extent_dims_f", dims(1), INT(dim0,hsize_t), total_error)
+  CALL VERIFY("H5Sget_simple_extent_dims_f", dims(2), INT(dim1,hsize_t), total_error)
+
+  ALLOCATE(rdata(1:dims(1),1:dims(2)))
+
+  !
+  ! Read the data.
+  !
+  f_ptr = C_LOC(rdata(1,1))
+  CALL h5dread_f(dset, memtype, f_ptr, error)
+  CALL check("H5Dread_f",error, total_error)
+
+  !
+  ! Output the data to the screen.
+  !
+  i_loop: DO i = 1, INT(dims(1))
+             DO j = 1, INT(dims(2))
+                !
+                ! Get the name of the enumeration member.
+                !
+                CALL h5tenum_nameof_f( memtype, rdata(i,j), NAME_BUF_SIZE, name, error)
+                CALL check("h5tenum_nameof_f",error, total_error)
+                idx = MOD( (j-1)*(i-1), PLASMA+1 ) + 1
+                CALL verify("h5tenum_nameof_f",TRIM(name),TRIM(names(idx)), total_error)
+                IF(total_error.NE.0) EXIT i_loop
+             ENDDO
+          ENDDO i_loop
+  !
+  ! Close and release resources.
+  !
+  DEALLOCATE(rdata)
+  CALL h5dclose_f(dset , error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL h5sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  CALL h5tclose_f(memtype, error)
+  CALL check("h5tclose_f",error, total_error)
+  CALL h5fclose_f(file , error)
+  CALL check("h5fclose_f",error, total_error)
+  
+END SUBROUTINE t_enum
+
+SUBROUTINE t_bit(total_error)
+
+  IMPLICIT NONE
+
+  INTEGER, INTENT(INOUT) :: total_error
+
+  CHARACTER(LEN=20), PARAMETER :: filename  = "t_bit_F03.h5"
+  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
+  INTEGER          , PARAMETER :: dim0      = 4
+  INTEGER          , PARAMETER :: dim1      = 7
+
+  INTEGER(HID_T)  :: file, space, dset ! Handles
+  INTEGER(HSIZE_T), DIMENSION(1:2)   :: dims = (/dim0, dim1/)
+  INTEGER(HSIZE_T), DIMENSION(1:2)   :: maxdims
+  INTEGER(C_SIGNED_CHAR), DIMENSION(1:dim0, 1:dim1), TARGET :: wdata              ! Write buffer 
+  INTEGER(C_SIGNED_CHAR), DIMENSION(:,:), ALLOCATABLE, TARGET :: rdata    ! Read buffer
+  INTEGER :: A, B, C, D
+  INTEGER :: Aw, Bw, Cw, Dw
+  INTEGER :: i, j
+  INTEGER, PARAMETER :: hex =  Z'00000003'
+  TYPE(C_PTR) :: f_ptr
+  INTEGER :: error     ! Error flag
+  !
+  ! Initialize data.  We will manually pack 4 2-bit integers into
+  ! each unsigned char data element.
+  !
+  DO i = 0, dim0-1
+     DO j = 0, dim1-1
+        wdata(i+1,j+1) = 0
+        wdata(i+1,j+1) = IOR( wdata(i+1,j+1), INT(IAND(i * j - j, hex),C_SIGNED_CHAR) )   ! Field "A"
+        wdata(i+1,j+1) = IOR( wdata(i+1,j+1), INT(ISHFT(IAND(i,hex),2),C_SIGNED_CHAR) )   ! Field "B"
+        wdata(i+1,j+1) = IOR( wdata(i+1,j+1), INT(ISHFT(IAND(j,hex),4),C_SIGNED_CHAR) )   ! Field "C"
+        wdata(i+1,j+1) = IOR( wdata(i+1,j+1), INT(ISHFT(IAND(i+j,hex),6),C_SIGNED_CHAR) ) ! Field "D"
+     ENDDO
+  ENDDO
+  !
+  ! Create a new file using the default properties.
+  !
+  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
+  CALL check("h5fcreate_f",error, total_error)
+  !
+  ! Create dataspace.  Setting maximum size to be the current size.
+  !
+  CALL h5screate_simple_f(2, dims, space, error)
+  CALL check("h5screate_simple_f",error, total_error)
+  !
+  ! Create the dataset and write the bitfield data to it.
+  !
+  CALL H5Dcreate_f(file, dataset, H5T_STD_B8BE, space, dset, error)
+  CALL check("h5dcreate_f",error, total_error)
+  f_ptr = C_LOC(wdata(1,1))
+  CALL H5Dwrite_f(dset, H5T_NATIVE_B8, f_ptr, error)
+  CALL check("h5dwrite_f",error, total_error)
+  !
+  ! Close and release resources.
+  !
+  CALL H5Dclose_f(dset, error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL H5Sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  CALL H5Fclose_f(file, error)
+  CALL check("h5fclose_f",error, total_error)
+  !
+  ! Now we begin the read section of this example. 
+  !
+  ! Open file, dataset.
+  !
+  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
+  CALL check("h5fopen_f",error, total_error)
+  CALL h5dopen_f(file, dataset, dset, error)
+  CALL check("h5dopen_f",error, total_error)
+  !
+  ! Get dataspace and allocate memory for read buffer.
+  !
+  CALL H5Dget_space_f(dset, space, error)
+  CALL check("H5Dget_space_f",error, total_error)
+  CALL H5Sget_simple_extent_dims_f(space, dims, maxdims, error)
+  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
+  CALL VERIFY("H5Sget_simple_extent_dims_f", dims(1), INT(dim0,hsize_t), total_error)
+  CALL VERIFY("H5Sget_simple_extent_dims_f", dims(2), INT(dim1,hsize_t), total_error)
+  ALLOCATE(rdata(1:dims(1),1:dims(2)))
+  !
+  ! Read the data.
+  !
+  f_ptr = C_LOC(rdata)
+  CALL H5Dread_f(dset,  H5T_NATIVE_B8, f_ptr, error)
+  CALL check("H5Dread_f",error, total_error)
+  !
+  ! Output the data to the screen.
+  !
+  i_loop: DO i = 1, INT(dims(1))
+            DO j = 1, INT(dims(2))
+               A = IAND(rdata(i,j), INT(hex,C_SIGNED_CHAR)) ! Retrieve field "A"
+               B = IAND(ISHFT(rdata(i,j),-2), INT(hex,C_SIGNED_CHAR)) ! Retrieve field "B"
+               C = IAND(ISHFT(rdata(i,j),-4), INT(hex,C_SIGNED_CHAR)) ! Retrieve field "C"
+               D = IAND(ISHFT(rdata(i,j),-6), INT(hex,C_SIGNED_CHAR)) ! Retrieve field "D"
+               
+               Aw = IAND(wdata(i,j), INT(hex,C_SIGNED_CHAR)) 
+               Bw = IAND(ISHFT(wdata(i,j),-2), INT(hex,C_SIGNED_CHAR))
+               Cw = IAND(ISHFT(wdata(i,j),-4), INT(hex,C_SIGNED_CHAR))
+               Dw = IAND(ISHFT(wdata(i,j),-6), INT(hex,C_SIGNED_CHAR))
+
+               CALL VERIFY("bitfield", A, Aw, total_error)
+               CALL VERIFY("bitfield", B, Bw, total_error)
+               CALL VERIFY("bitfield", C, Cw, total_error)
+               CALL VERIFY("bitfield", D, Dw, total_error)
+               IF(total_error.NE.0) EXIT i_loop
+            ENDDO
+         ENDDO i_loop
+  !
+  ! Close and release resources.
+  !
+  DEALLOCATE(rdata)
+  CALL H5Dclose_f(dset, error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL H5Sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  CALL H5Fclose_f(file, error)
+  CALL check("h5fclose_f",error, total_error)
+
+END SUBROUTINE t_bit
+
+SUBROUTINE t_opaque(total_error)
+
+  IMPLICIT NONE
+
+  INTEGER, INTENT(INOUT) :: total_error
+  CHARACTER(LEN=20), PARAMETER :: filename  = "t_opaque_F03.h5"
+  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
+  INTEGER          , PARAMETER :: dim0      = 4
+  INTEGER(SIZE_T)  , PARAMETER :: size      = 7
+  INTEGER(HID_T)  :: file, space, dtype, dset ! Handles
+  INTEGER(size_t) :: len
+  INTEGER(hsize_t),   DIMENSION(1:1) :: dims = (/DIM0/)
+
+  CHARACTER(LEN=size), DIMENSION(1:dim0), TARGET :: wdata ! Write buffer
+  CHARACTER(LEN=size), DIMENSION(:), ALLOCATABLE, TARGET :: rdata ! Read buffer
+  CHARACTER(LEN=size-1) :: str = "OPAQUE"
+  
+  CHARACTER(LEN=14) :: tag_sm    ! Test reading obaque tag into 
+  CHARACTER(LEN=15) :: tag_exact ! buffers that are: to small, exact
+  CHARACTER(LEN=17) :: tag_big   ! and to big.
+
+  INTEGER :: taglen
+  INTEGER(HSIZE_T), DIMENSION(1:1) :: maxdims
+  INTEGER(hsize_t) :: i
+  CHARACTER(LEN=1) :: ichr
+  TYPE(C_PTR) :: f_ptr
+  INTEGER :: error
+  !
+  ! Initialize data.
+  !
+  DO i = 1, dim0
+     WRITE(ichr,'(I1)') i-1 
+     wdata(i) = str//ichr
+  ENDDO
+  !
+  ! Create a new file using the default properties.
+  !
+  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
+  CALL check("h5fcreate_f",error, total_error)
+  !
+  ! Create opaque datatype and set the tag to something appropriate.
+  ! For this example we will write and view the data as a character
+  ! array.
+  !
+  CALL h5tcreate_f(h5T_OPAQUE_F, size, dtype, error)
+  CALL check("h5tcreate_f",error, total_error)
+  CALL h5tset_tag_f(dtype,"Character array",error)
+  CALL check("h5tset_tag_f",error, total_error)
+  !
+  ! Create dataspace.  Setting maximum size to be the current size.
+  !
+  CALL h5screate_simple_f(1, dims, space, error)
+  CALL check("h5screate_simple_f",error, total_error)
+  !
+  ! Create the dataset and write the opaque data to it.
+  !
+  CALL h5dcreate_f(file, dataset, dtype, space, dset, error)
+  CALL check("h5dcreate_f",error, total_error)
+  f_ptr = C_LOC(wdata(1)(1:1))
+  CALL h5dwrite_f(dset, dtype, f_ptr, error)
+  CALL check("h5dwrite_f",error, total_error)
+  !
+  ! Close and release resources.
+  !
+  CALL H5Dclose_f(dset, error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL H5Sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  CALL H5Tclose_f(dtype, error)
+  CALL check("h5tclose_f",error, total_error)
+  CALL H5Fclose_f(file, error)
+  CALL check("h5fclose_f",error, total_error)
+  !
+  ! Now we begin the read section of this example.
+  !
+  ! Open file and dataset.
+  !
+  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
+  CALL check("h5fopen_f",error, total_error)
+  CALL h5dopen_f(file, dataset, dset, error)
+  CALL check("h5dopen_f",error, total_error)
+  !
+  ! Get datatype and properties for the datatype.
+  !
+  CALL h5dget_type_f(dset, dtype, error)
+  CALL check("h5dget_type_f",error, total_error)
+  CALL h5tget_size_f(dtype, len, error)
+  CALL check("h5tget_size_f",error, total_error)
+
+  ! Next tests should return 
+  ! opaque_tag = tag = "Character array" and the actual length = 15
+  
+  ! Test reading into a string that is to small
+  CALL h5tget_tag_f(dtype, tag_sm, taglen, error)
+  CALL check("h5tget_tag_f",error, total_error)
+  CALL VERIFY("h5tget_tag_f", taglen, 15, total_error)
+  CALL verify("h5tget_tag_f",tag_sm,"Character arra", total_error)
+  
+  ! Test reading into a string that is exact
+  CALL h5tget_tag_f(dtype, tag_exact, taglen, error)
+  CALL check("h5tget_tag_f",error, total_error)
+  CALL VERIFY("h5tget_tag_f", taglen, 15, total_error)
+  CALL verify("h5tget_tag_f",tag_exact,"Character array", total_error)
+
+  ! Test reading into a string that is to big
+  CALL h5tget_tag_f(dtype, tag_big, taglen, error)
+  CALL check("h5tget_tag_f",error, total_error)
+  CALL VERIFY("h5tget_tag_f", taglen, 15, total_error)
+  CALL verify("h5tget_tag_f",tag_big,"Character array  ", total_error)
+  
+  !
+  ! Get dataspace and allocate memory for read buffer.
+  !
+  CALL h5dget_space_f(dset, space, error)
+  CALL check("H5Dget_space_f",error, total_error)
+  CALL h5sget_simple_extent_dims_f(space, dims, maxdims, error)
+  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
+  CALL VERIFY("H5Sget_simple_extent_dims_f", dims(1), INT(dim0,hsize_t), total_error)
+  ALLOCATE(rdata(1:dims(1)))
+  !
+  ! Read the data.
+  !
+  f_ptr = C_LOC(rdata(1)(1:1))
+  CALL h5dread_f(dset, dtype, f_ptr, error)
+  CALL check("H5Dread_f",error, total_error)
+  !
+  DO i = 1, dims(1)
+     CALL verify("t_opaque",TRIM(rdata(i)),TRIM(wdata(i)), total_error)
+  ENDDO
+  !
+  ! Close and release resources.
+  !
+  DEALLOCATE(rdata)
+  CALL H5Dclose_f(dset, error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL H5Sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  CALL H5Tclose_f(dtype, error)
+  CALL check("h5tclose_f",error, total_error)
+  CALL H5Fclose_f(file, error)
+  CALL check("h5fclose_f",error, total_error)
+  
+END SUBROUTINE t_opaque
+
+SUBROUTINE t_objref(total_error)
+
+  IMPLICIT NONE
+
+  INTEGER, INTENT(INOUT) :: total_error
+  CHARACTER(LEN=20), PARAMETER :: filename  = "t_objref_F03.h5"
+  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
+  INTEGER          , PARAMETER :: dim0      = 2
+
+  INTEGER(HID_T)  :: file, space, dset, obj ! Handles
+  INTEGER :: error
+
+  INTEGER(hsize_t),   DIMENSION(1:1) :: dims = (/dim0/)
+  TYPE(hobj_ref_t_f), DIMENSION(1:dim0), TARGET :: wdata ! Write buffer
+  TYPE(hobj_ref_t_f), DIMENSION(:), ALLOCATABLE, TARGET :: rdata ! Read buffer
+  INTEGER :: objtype
+  INTEGER(SIZE_T) :: name_size
+  CHARACTER(LEN=80) :: name
+  INTEGER(HSIZE_T), DIMENSION(1:1) :: maxdims
+  INTEGER :: i
+  TYPE(C_PTR) :: f_ptr
+  !
+  ! Create a new file using the default properties.
+  !
+  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
+  CALL check("h5fcreate_f",error, total_error)
+  !
+  ! Create a dataset with a null dataspace.
+  !
+  CALL h5screate_f(H5S_NULL_F,space,error)
+  CALL check("h5screate_f",error, total_error)
+  CALL h5dcreate_f(file, "DS2", H5T_STD_I32LE, space, obj, error)
+  CALL check("h5dcreate_f",error, total_error)
+  !
+  CALL h5dclose_f(obj  , error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL h5sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  !
+  ! Create a group.
+  !
+  CALL h5gcreate_f(file, "G1", obj, error)
+  CALL check("h5gcreate_f",error, total_error)
+  CALL h5gclose_f(obj, error)
+  CALL check("h5gclose_f",error, total_error)
+  !
+  ! Create references to the previously created objects. note, space_id
+  ! is not needed for object references.
+  !
+  f_ptr = C_LOC(wdata(1))
+  CALL H5Rcreate_f(file, "G1", H5R_OBJECT_F, f_ptr, error)
+  CALL check("H5Rcreate_f",error, total_error)
+  f_ptr = C_LOC(wdata(2))
+  CALL H5Rcreate_f(file, "DS2", H5R_OBJECT_F, f_ptr, error)
+  CALL check("H5Rcreate_f",error, total_error)
+  !
+  ! Create dataspace.  Setting maximum size to be the current size.
+  !
+  CALL h5screate_simple_f(1, dims, space, error)
+  CALL check("h5screate_simple_f",error, total_error)
+  !
+  ! Create the dataset and write the object references to it.
+  !
+  CALL h5dcreate_f(file, dataset, H5T_STD_REF_OBJ, space, dset, error)
+  CALL check("h5dcreate_f",error, total_error)
+  
+  f_ptr = C_LOC(wdata(1))
+  CALL h5dwrite_f(dset, H5T_STD_REF_OBJ, f_ptr, error)
+  CALL check("h5dwrite_f",error, total_error)
+  !
+  ! Close and release resources.
+  !
+  CALL h5dclose_f(dset , error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL h5sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  CALL h5fclose_f(file , error)
+  CALL check("h5fclose_f",error, total_error)
+  !
+  ! Now we begin the read section of this example.
+  !
+  ! Open file and dataset.
+  !
+  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
+  CALL check("h5fopen_f",error, total_error)
+  CALL h5dopen_f(file, dataset, dset, error)
+  CALL check("h5dopen_f",error, total_error)
+  !
+  ! Get dataspace and allocate memory for read buffer.
+  !
+  CALL h5dget_space_f(dset, space, error)
+  CALL check("H5Dget_space_f",error, total_error)
+  CALL h5sget_simple_extent_dims_f(space, dims, maxdims, error)
+  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
+  CALL VERIFY("H5Sget_simple_extent_dims_f", dims(1), INT(dim0,hsize_t), total_error)
+
+  ALLOCATE(rdata(1:maxdims(1)))
+  !
+  ! Read the data.
+  !
+  f_ptr = C_LOC(rdata(1))
+  CALL h5dread_f( dset, H5T_STD_REF_OBJ, f_ptr, error)
+  CALL check("H5Dread_f",error, total_error)
+  !
+  ! Output the data to the screen.
+  !
+  DO i = 1, INT(maxdims(1))
+     !
+     ! Open the referenced object, get its name and type.
+     !
+     f_ptr = C_LOC(rdata(i))
+     CALL H5Rdereference_f(dset, H5R_OBJECT_F, f_ptr, obj, error)
+     CALL check("H5Rdereference_f",error, total_error)
+     CALL H5Rget_obj_type_f(dset, H5R_OBJECT_F, f_ptr, objtype, error)
+     CALL check("H5Rget_obj_type_f",error, total_error)
+     !
+     ! Get the length of the name and name
+     !
+     name(:) = ' ' ! initialize string to blanks
+     CALL H5Iget_name_f(obj, name, 80_size_t, name_size, error)
+     CALL check("H5Iget_name_f",error, total_error)
+     !
+     ! Print the object type and close the object.
+     !
+     IF(objtype.EQ.H5G_GROUP_F)THEN
+        CALL verify("t_objref", name(1:name_size),"/G1", total_error)
+     ELSE IF(objtype.EQ.H5G_DATASET_F)THEN
+        CALL verify("t_objref", name(1:name_size),"/DS2", total_error)
+     ELSE
+        total_error = total_error + 1
+     ENDIF
+     CALL h5oclose_f(obj, error)
+     CALL check("h5oclose_f",error, total_error)
+
+  END DO
+  !
+  ! Close and release resources.
+  !
+  DEALLOCATE(rdata)
+  CALL h5dclose_f(dset , error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL h5sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  CALL h5fclose_f(file , error)
+  CALL check("h5fclose_f",error, total_error)
+
+END SUBROUTINE t_objref
+
+
+SUBROUTINE t_regref(total_error)
+
+  IMPLICIT NONE
+
+  INTEGER, INTENT(INOUT) :: total_error
+  CHARACTER(LEN=22), PARAMETER :: filename  = "t_regref_F03.h5"
+  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
+  CHARACTER(LEN=3) , PARAMETER :: dataset2  = "DS2"
+  INTEGER          , PARAMETER :: dim0      = 2
+  INTEGER          , PARAMETER :: ds2dim0   = 16
+  INTEGER          , PARAMETER :: ds2dim1   = 3
+
+  INTEGER(HID_T)  :: file, memspace, space, dset, dset2 ! Handles
+  INTEGER :: error
+
+  INTEGER(HSIZE_T), DIMENSION(1:1)   :: dims = (/dim0/)
+  INTEGER(HSIZE_T), DIMENSION(1:1)   :: dims3 
+  INTEGER(HSIZE_T), DIMENSION(1:2)   :: dims2 = (/ds2dim0,ds2dim1/)
+
+  INTEGER(HSIZE_T), DIMENSION(1:2,1:4) :: coords = RESHAPE((/2,1,12,3,1,2,5,3/),(/2,4/))
+  
+  INTEGER(HSIZE_T), DIMENSION(1:2) :: start=(/0,0/),stride=(/11,2/),count=(/2,2/), BLOCK=(/3,1/)
+
+  INTEGER(HSIZE_T), DIMENSION(1:1) :: maxdims
+  INTEGER(hssize_t) :: npoints
+  TYPE(hdset_reg_ref_t_f03), DIMENSION(1:dim0), TARGET :: wdata ! Write buffer
+  TYPE(hdset_reg_ref_t_f03), DIMENSION(:), ALLOCATABLE, TARGET :: rdata ! Read buffer
+
+  INTEGER(size_t) :: size
+  CHARACTER(LEN=1), DIMENSION(1:ds2dim0,1:ds2dim1), TARGET :: wdata2
+
+  CHARACTER(LEN=80),DIMENSION(1:1), TARGET :: rdata2
+  CHARACTER(LEN=80) :: name
+  INTEGER(hsize_t) :: i
+  TYPE(C_PTR) :: f_ptr
+  CHARACTER(LEN=ds2dim0) :: chrvar
+  CHARACTER(LEN=20), DIMENSION(1:2) :: chrref_correct
+
+  chrvar = "The quick brown "
+  READ(chrvar,'(16A1)') wdata2(1:16,1)
+  chrvar = "fox jumps over  "
+  READ(chrvar,'(16A1)') wdata2(1:16,2)
+  chrvar = "the 5 lazy dogs "
+  READ(chrvar,'(16A1)') wdata2(1:16,3)
+
+  chrref_correct(1) = 'hdf5'
+  chrref_correct(2) = 'Therowthedog'
+
+  !
+  ! Create a new file using the default properties.
+  !
+  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
+  CALL check("h5fcreate_f",error, total_error)
+  !
+  ! Create a dataset with character data.
+  !
+  CALL h5screate_simple_f(2, dims2, space, error)
+  CALL check("h5screate_simple_f",error, total_error)
+  CALL h5dcreate_f(file,dataset2, H5T_STD_I8LE, space, dset2, error)
+  CALL check("h5dcreate_f",error, total_error)
+  f_ptr = C_LOC(wdata2(1,1))
+  CALL h5dwrite_f(dset2, H5T_NATIVE_INTEGER_1, f_ptr, error)
+  CALL check("h5dwrite_f",error, total_error)
+  !
+  ! Create reference to a list of elements in dset2.
+  !
+  CALL h5sselect_elements_f(space, H5S_SELECT_SET_F, 2, INT(4,size_t), coords, error)
+  CALL check("h5sselect_elements_f",error, total_error)
+  f_ptr = C_LOC(wdata(1))
+  CALL h5rcreate_f(file, DATASET2, H5R_DATASET_REGION_F, f_ptr, error, space)
+  CALL check("h5rcreate_f",error, total_error)
+  !
+  ! Create reference to a hyperslab in dset2, close dataspace.
+  !
+  CALL h5sselect_hyperslab_f (space, H5S_SELECT_SET_F, start, count, error, stride, block)
+  CALL check("h5sselect_hyperslab_f",error, total_error)
+  f_ptr = C_LOC(wdata(2))
+  CALL h5rcreate_f(file, DATASET2, H5R_DATASET_REGION_F, f_ptr, error, space)
+  CALL check("h5rcreate_f",error, total_error)
+
+  CALL h5sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  !
+  ! Create dataspace.  Setting maximum size to the current size.
+  !
+  CALL h5screate_simple_f(1, dims, space, error)
+  CALL check("h5screate_simple_f",error, total_error)
+
+  !
+  ! Create the dataset and write the region references to it.
+  !
+  CALL h5dcreate_f(file, dataset, H5T_STD_REF_DSETREG, space, dset, error)
+  CALL check("h5dcreate_f",error, total_error)
+  f_ptr = C_LOC(wdata(1))
+  CALL h5dwrite_f(dset, H5T_STD_REF_DSETREG, f_ptr, error)
+  CALL check("h5dwrite_f",error, total_error)
+  !
+  ! Close and release resources.
+  !
+  CALL h5dclose_f(dset , error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL h5dclose_f(dset2, error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL h5sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  CALL h5fclose_f(file , error)
+  CALL check("h5fclose_f",error, total_error)
+  !
+  ! Now we begin the read section of this example.
+  !
+  !
+  ! Open file and dataset.
+  !
+  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
+  CALL check("h5fopen_f",error, total_error)
+  CALL h5dopen_f(file, dataset, dset, error)
+  CALL check("h5dopen_f",error, total_error)
+  !
+  ! Get dataspace and allocate memory for read buffer.
+  !
+  CALL h5dget_space_f(dset, space, error)
+  CALL check("H5Dget_space_f",error, total_error)
+  CALL h5sget_simple_extent_dims_f(space, dims, maxdims, error)
+  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
+  CALL VERIFY("H5Sget_simple_extent_dims_f", dims(1), INT(dim0,hsize_t), total_error)
+  ALLOCATE(rdata(1:dims(1)))
+  CALL h5sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  !
+  ! Read the data.
+  !
+  f_ptr = C_LOC(rdata(1))
+  CALL h5dread_f( dset, H5T_STD_REF_DSETREG, f_ptr, error)
+  CALL check("H5Dread_f",error, total_error)
+  !
+  ! Output the data to the screen.
+  !
+  DO i = 1, dims(1)
+     
+     !
+     ! Open the referenced object, retrieve its region as a
+     ! dataspace selection.
+     !
+     f_ptr = C_LOC(rdata(i))
+     CALL H5Rdereference_f(dset, H5R_DATASET_REGION_F, f_ptr, dset2, error)
+     CALL check("H5Rdereference_f",error, total_error)
+ 
+     CALL H5Rget_region_f(dset, f_ptr, space, error)
+     CALL check("H5Rget_region_f",error, total_error)
+  
+     !
+     ! Get the object's name
+     !
+     name(:) = ' ' ! initialize string to blanks
+     CALL H5Iget_name_f(dset2, name, 80_size_t, size, error)
+     CALL check("H5Iget_name_f",error, total_error)
+     CALL VERIFY("H5Iget_name_f", INT(size), LEN_TRIM(name), total_error)
+     CALL verify("H5Iget_name_f",name(1:size),TRIM(name), total_error)
+     !
+     ! Allocate space for the read buffer.
+     !
+     CALL H5Sget_select_npoints_f(space, npoints, error)
+     CALL check("H5Sget_select_npoints_f",error, total_error)
+     CALL VERIFY("H5Sget_select_npoints_f", INT(npoints), LEN_TRIM(chrref_correct(i)), total_error)
+     
+     dims3(1) = npoints
+     !
+     ! Read the dataset region.
+     !
+     CALL h5screate_simple_f(1, dims3, memspace, error)
+     CALL check("h5screate_simple_f",error, total_error)
+
+     f_ptr = C_LOC(rdata2(1)(1:1))
+     CALL h5dread_f( dset2, H5T_NATIVE_INTEGER_1, f_ptr, error, memspace, space)
+     CALL check("H5Dread_f",error, total_error)
+     CALL verify("h5dread_f",rdata2(1)(1:npoints),TRIM(chrref_correct(i)), total_error)
+
+     CALL H5Sclose_f(space, error)
+     CALL check("h5sclose_f",error, total_error)
+     CALL H5Sclose_f(memspace, error)
+     CALL check("h5sclose_f",error, total_error)
+     CALL H5Dclose_f(dset2, error)
+     CALL check("h5dclose_f",error, total_error)
+
+  END DO
+  !
+  ! Close and release resources.
+  !
+  DEALLOCATE(rdata)
+  CALL H5Dclose_f(dset, error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL H5Fclose_f(file, error)
+  CALL check("h5fclose_f",error, total_error)
+
+END SUBROUTINE t_regref
+
+SUBROUTINE t_vlen(total_error)
+
+  IMPLICIT NONE
+
+  INTEGER, INTENT(INOUT) :: total_error
+  CHARACTER(LEN=18), PARAMETER :: filename  = "t_vlen_F03.h5"
+  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
+  INTEGER, PARAMETER :: LEN0 = 3
+  INTEGER, PARAMETER :: LEN1 = 12
+  INTEGER(hsize_t) :: dim0
+
+  INTEGER(HID_T)  :: file, filetype, memtype, space, dset ! Handles
+  INTEGER :: error
+  INTEGER(HSIZE_T), DIMENSION(1:2)   :: maxdims
+  INTEGER :: i, j
+
+  ! vl data
+  TYPE vl
+     INTEGER, DIMENSION(:), POINTER :: DATA
+  END TYPE vl
+  TYPE(vl), DIMENSION(:), ALLOCATABLE, TARGET :: ptr
+
+
+  TYPE(hvl_t), DIMENSION(1:2), TARGET :: wdata ! Array of vlen structures
+  TYPE(hvl_t), DIMENSION(1:2), TARGET :: rdata ! Pointer to vlen structures
+
+  INTEGER(hsize_t), DIMENSION(1:1) :: dims = (/2/)
+  INTEGER, DIMENSION(:), POINTER :: ptr_r 
+  TYPE(C_PTR) :: f_ptr
+  
+  !
+  ! Initialize variable-length data.  wdata(1) is a countdown of
+  ! length LEN0, wdata(2) is a Fibonacci sequence of length LEN1.
+  !
+  wdata(1)%len = LEN0
+  wdata(2)%len = LEN1
+
+  ALLOCATE( ptr(1:2) )
+  ALLOCATE( ptr(1)%data(1:wdata(1)%len) )
+  ALLOCATE( ptr(2)%data(1:wdata(2)%len) )
+
+  DO i=1, wdata(1)%len
+     ptr(1)%data(i) = wdata(1)%len - i + 1 ! 3 2 1
+  ENDDO
+  wdata(1)%p = C_LOC(ptr(1)%data(1))
+
+  ptr(2)%data(1:2) = 1
+  DO i = 3, wdata(2)%len
+     ptr(2)%data(i) = ptr(2)%data(i-1) + ptr(2)%data(i-2) ! (1 1 2 3 5 8 etc.)
+  ENDDO
+  wdata(2)%p = C_LOC(ptr(2)%data(1))
+
+  !
+  ! Create a new file using the default properties.
+  !
+  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
+  CALL check("h5fcreate_f",error, total_error)
+  !
+  ! Create variable-length datatype for file and memory.
+  !
+  CALL H5Tvlen_create_f(H5T_STD_I32LE, filetype, error)
+  CALL check("H5Tvlen_create_f",error, total_error)
+  CALL H5Tvlen_create_f(H5T_NATIVE_INTEGER, memtype, error)
+  CALL check("H5Tvlen_create_f",error, total_error)
+  !
+  ! Create dataspace.
+  !
+  CALL h5screate_simple_f(1, dims, space, error)
+  CALL check("h5screate_simple_f",error, total_error)
+  !
+  ! Create the dataset and write the variable-length data to it.
+  !
+  CALL H5Dcreate_f(file, dataset, filetype, space, dset, error)
+  CALL check("h5dcreate_f",error, total_error)
+ 
+  f_ptr = C_LOC(wdata(1))
+  CALL h5dwrite_f(dset, memtype, f_ptr, error)
+  CALL check("h5dwrite_f",error, total_error)
+  !
+  ! Close and release resources.  Note the use of H5Dvlen_reclaim
+  ! removes the need to manually deallocate the previously allocated
+  ! data.
+  !
+
+  CALL h5dclose_f(dset , error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL h5sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  CALL H5Tclose_f(filetype, error)
+  CALL check("h5tclose_f",error, total_error)
+  CALL H5Tclose_f(memtype, error)
+  CALL check("h5tclose_f",error, total_error)
+  CALL h5fclose_f(file , error)
+  CALL check("h5fclose_f",error, total_error)
+
+  !
+  ! Now we begin the read section of this example.
+
+  !
+  ! Open file and dataset.
+  !
+  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
+  CALL check("h5fopen_f",error, total_error)
+  CALL h5dopen_f(file, dataset, dset, error)
+  CALL check("h5dopen_f",error, total_error)
+
+  !
+  ! Get dataspace and allocate memory for array of vlen structures.
+  ! This does not actually allocate memory for the vlen data, that
+  ! will be done by the library.
+  !
+  CALL H5Dget_space_f(dset, space, error)
+  CALL check("H5Dget_space_f",error, total_error)
+  dim0 = dims(1)
+  CALL H5Sget_simple_extent_dims_f(space, dims, maxdims, error) 
+  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
+  CALL VERIFY("H5Sget_simple_extent_dims_f", INT(dims(1)), INT(dim0), total_error)
+
+  !
+  ! Create the memory datatype.
+  !
+  CALL H5Tvlen_create_f(H5T_NATIVE_INTEGER, memtype, error) 
+  CALL check("H5Tvlen_create_f",error, total_error)
+
+  !
+  ! Read the data.
+  !
+  f_ptr = C_LOC(rdata(1))
+  CALL H5Dread_f(dset, memtype, f_ptr, error)
+  CALL check("H5Dread_f",error, total_error)
+
+  DO i = 1, INT(dims(1))
+     CALL c_f_pointer(rdata(i)%p, ptr_r, [rdata(i)%len] )
+     DO j = 1, rdata(i)%len
+        CALL VERIFY("t_vlen", ptr_r(j), ptr(i)%data(j), total_error)
+     ENDDO
+  ENDDO
+  !
+  ! Close and release resources.
+  !
+  DEALLOCATE(ptr)
+  CALL h5dvlen_reclaim_f(memtype, space, H5P_DEFAULT_F, f_ptr, error)
+  CALL h5dclose_f(dset, error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL h5sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  CALL H5Tclose_f(memtype, error)
+  CALL check("h5tclose_f",error, total_error)
+  CALL h5fclose_f(file, error)
+  CALL check("h5fclose_f",error, total_error)
+
+END SUBROUTINE t_vlen
+
+
+SUBROUTINE t_vlstring(total_error)
+
+  IMPLICIT NONE
+
+  INTEGER, INTENT(INOUT) :: total_error
+
+  CHARACTER(LEN=18), PARAMETER :: filename  = "t_vlstring.h5"
+  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
+
+  INTEGER(SIZE_T), PARAMETER :: dim0      = 4
+  INTEGER(SIZE_T), PARAMETER :: sdim      = 7
+  INTEGER(HID_T)  :: file, filetype, space, dset ! Handles
+  INTEGER :: error
+  INTEGER(HSIZE_T), DIMENSION(1:1) :: dims = (/dim0/)
+  INTEGER(HSIZE_T), DIMENSION(1:2) :: maxdims
+  
+  CHARACTER(LEN=sdim), DIMENSION(1:dim0), TARGET :: &
+       wdata = (/"Parting", "is such", "sweet  ", "sorrow."/) ! Write buffer
+  CHARACTER(LEN=sdim), DIMENSION(:), ALLOCATABLE :: rdata ! Read buffer
+  INTEGER(HSIZE_T), DIMENSION(2) :: data_dims = (/sdim,dim0/)
+  INTEGER(SIZE_T), DIMENSION(4) :: str_len = (/7,7,5,7/)
+  INTEGER(hsize_t) :: i
+
+  !
+  ! Create a new file using the default properties.
+  !
+  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
+  CALL check("h5fcreate_f",error, total_error)
+  !
+  ! Create file and memory datatypes.  For this example we will save
+  ! the strings as C variable length strings, H5T_STRING is defined
+  ! as a variable length string.
+  !
+  CALL H5Tcopy_f(H5T_STRING, filetype, error)
+  CALL check("H5Tcopy_f",error, total_error)
+  CALL H5Tset_strpad_f(filetype, H5T_STR_NULLPAD_F, error)
+  CALL check("H5Tset_strpad_f",error, total_error)
+  !
+  ! Create dataspace.
+  !
+  CALL h5screate_simple_f(1, dims, space, error)
+  CALL check("h5screate_simple_f",error, total_error)
+  !
+  ! Create the dataset and write the variable-length string data to
+  ! it.
+  !
+  CALL h5dcreate_f(file, dataset, filetype, space, dset, error)
+  CALL check("h5dcreate_f",error, total_error)
+
+  CALL h5dwrite_vl_f(dset, filetype, wdata, data_dims, str_len, error, space)
+  CALL check("h5dwrite_vl_f",error, total_error)
+
+  !
+  ! Close and release resources.
+  !
+  CALL h5dclose_f(dset , error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL h5sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  CALL H5Tclose_f(filetype, error)
+  CALL check("h5tclose_f",error, total_error)
+  CALL h5fclose_f(file , error)
+  CALL check("h5fclose_f",error, total_error)
+
+  !
+  ! Now we begin the read section of this example.
+  !
+  !
+  ! Open file and dataset.
+  !
+  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
+  CALL check("h5fopen_f",error, total_error)
+  CALL h5dopen_f(file, dataset, dset, error)
+  CALL check("h5dopen_f",error, total_error)
+  !
+  ! Get the datatype.
+  !
+  CALL H5Dget_type_f(dset, filetype, error)
+  CALL check("H5Dget_type_f",error, total_error)
+  !
+  ! Get dataspace and allocate memory for read buffer.
+  !
+  CALL H5Dget_space_f(dset, space, error)
+  CALL check("H5Dget_space_f",error, total_error)
+  CALL H5Sget_simple_extent_dims_f(space, dims, maxdims, error) 
+  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
+  CALL VERIFY("H5Sget_simple_extent_dims_f", INT(dims(1)), INT(dim0), total_error)
+
+  ALLOCATE(rdata(1:dims(1)))
+
+  !
+  ! Read the data.
+  !
+  CALL h5dread_vl_f(dset, filetype, rdata, data_dims, str_len, error, space)
+  CALL check("H5Dread_vl_f",error, total_error)
+
+  !
+  ! Output the data to the screen.
+  !
+  DO i = 1, dims(1)
+     CALL verify("h5dopen_f",TRIM(rdata(i)),TRIM(wdata(i)) , total_error)
+  END DO
+
+  DEALLOCATE(rdata)
+  CALL h5dclose_f(dset, error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL h5sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  CALL H5Tclose_f(filetype, error)
+  CALL check("h5tclose_f",error, total_error)
+  CALL h5fclose_f(file , error)
+  CALL check("h5fclose_f",error, total_error)
+
+END SUBROUTINE t_vlstring
+
+SUBROUTINE t_vlstring_readwrite(total_error)
+
+! test writing and reading vl string using h5dread_f and h5dwrite_f, C_LOC and C_F_POINTER
+
+  IMPLICIT NONE
+
+  INTEGER, INTENT(INOUT) :: total_error
+
+  CHARACTER(LEN=19), PARAMETER :: filename  = "t_vlstringrw_F03.h5"
+  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
+  CHARACTER(LEN=3) , PARAMETER :: dataset2D = "DS2"
+
+  INTEGER(HSIZE_T) , PARAMETER :: dim0 = 4
+  INTEGER(HSIZE_T) , PARAMETER :: dim1 = 2
+  INTEGER(HID_T)               :: file, filetype, space, dset ! Handles
+  INTEGER(HSIZE_T), DIMENSION(1:1) :: dims = (/dim0/)
+  INTEGER(HSIZE_T), DIMENSION(1:2) :: dims2D = (/dim1,dim0/)
+  INTEGER(HSIZE_T), DIMENSION(1:2) :: maxdims
+  
+  TYPE(C_PTR), DIMENSION(1:dim0), TARGET :: wdata
+  CHARACTER(len=7, KIND=c_char), DIMENSION(1:1), TARGET :: A = "123456"//C_NULL_CHAR
+  CHARACTER(len=5, KIND=c_char), DIMENSION(1:1), TARGET :: B = "7890"//C_NULL_CHAR
+  CHARACTER(len=4, KIND=c_char), DIMENSION(1:1), TARGET :: C = "abc"//C_NULL_CHAR
+  CHARACTER(len=3, KIND=c_char), DIMENSION(1:1), TARGET :: D = "df"//C_NULL_CHAR
+
+  TYPE(C_PTR), DIMENSION(1:dim1,1:dim0), TARGET :: wdata2D
+  
+  CHARACTER(len=7, KIND=c_char), DIMENSION(1:1), TARGET :: A11 = "A(1,1)"//C_NULL_CHAR
+  CHARACTER(len=4, KIND=c_char), DIMENSION(1:1), TARGET :: A12 = "A12"//C_NULL_CHAR
+  CHARACTER(len=5, KIND=c_char), DIMENSION(1:1), TARGET :: A13 = "A_13"//C_NULL_CHAR
+  CHARACTER(len=8, KIND=c_char), DIMENSION(1:1), TARGET :: A14 = "A_{1,4}"//C_NULL_CHAR
+  CHARACTER(len=8, KIND=c_char), DIMENSION(1:1), TARGET :: A21 = "A_{2,1}"//C_NULL_CHAR
+  CHARACTER(len=5, KIND=c_char), DIMENSION(1:1), TARGET :: A22 = "A_22"//C_NULL_CHAR
+  CHARACTER(len=4, KIND=c_char), DIMENSION(1:1), TARGET :: A23 = "A23"//C_NULL_CHAR
+  CHARACTER(len=7, KIND=c_char), DIMENSION(1:1), TARGET :: A24 = "A(2,4)"//C_NULL_CHAR
+
+  TYPE(C_PTR), DIMENSION(:), ALLOCATABLE, TARGET :: rdata ! Read buffer
+  TYPE(C_PTR), DIMENSION(:,:), ALLOCATABLE, TARGET :: rdata2D ! Read 2D buffer
+  CHARACTER(len=8, kind=c_char), POINTER :: data ! A pointer to a Fortran string
+  CHARACTER(len=8, kind=c_char), DIMENSION(1:4) :: data_w ! A pointer to a Fortran string
+  CHARACTER(len=8, kind=c_char), DIMENSION(1:dim1,1:dim0) :: data2D_w ! A pointer to a Fortran string
+  TYPE(C_PTR) :: f_ptr
+  INTEGER(hsize_t) :: i, j
+  INTEGER :: len
+  INTEGER :: error
+
+  ! Initialize array of C pointers
+
+  wdata(1) = C_LOC(A(1)(1:1))
+  wdata(2) = C_LOC(B(1)(1:1))
+  wdata(3) = C_LOC(C(1)(1:1))
+  wdata(4) = C_LOC(D(1)(1:1))
+
+  data_w(1) = A(1)
+  data_w(2) = B(1)
+  data_w(3) = C(1)
+  data_w(4) = D(1)
+
+  wdata2D(1,1) = C_LOC(A11(1)(1:1))
+  wdata2D(1,2) = C_LOC(A12(1)(1:1))
+  wdata2D(1,3) = C_LOC(A13(1)(1:1))
+  wdata2D(1,4) = C_LOC(A14(1)(1:1))
+  wdata2D(2,1) = C_LOC(A21(1)(1:1))
+  wdata2D(2,2) = C_LOC(A22(1)(1:1))
+  wdata2D(2,3) = C_LOC(A23(1)(1:1))
+  wdata2D(2,4) = C_LOC(A24(1)(1:1))
+
+  data2D_w(1,1) = A11(1)
+  data2D_w(1,2) = A12(1)
+  data2D_w(1,3) = A13(1)
+  data2D_w(1,4) = A14(1)
+  data2D_w(2,1) = A21(1)
+  data2D_w(2,2) = A22(1)
+  data2D_w(2,3) = A23(1)
+  data2D_w(2,4) = A24(1)
+
+  !
+  ! Create a new file using the default properties.
+  !
+  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
+  CALL check("h5fcreate_f",error, total_error)
+  !
+  ! Create file and memory datatypes.  For this test we will save
+  ! the strings as C variable length strings, H5T_STRING is defined
+  ! as a variable length string.
+  !
+  CALL H5Tcopy_f(H5T_STRING, filetype, error)
+  CALL check("H5Tcopy_f",error, total_error)
+  !
+  ! Create dataspace.
+  !
+  CALL h5screate_simple_f(1, dims, space, error)
+  CALL check("h5screate_simple_f",error, total_error)
+  !
+  ! Create the dataset and write the variable-length string data to
+  ! it.
+  !
+  CALL h5dcreate_f(file, dataset, filetype, space, dset, error)
+  CALL check("h5dcreate_f",error, total_error)
+
+  f_ptr = C_LOC(wdata(1))
+  CALL h5dwrite_f(dset, filetype, f_ptr, error)
+  CALL check("h5dwrite_f",error, total_error)
+
+  !
+  ! Close and release resources.
+  !
+  CALL h5dclose_f(dset , error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL h5sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+
+  !
+  ! Create dataspace.
+  !
+  CALL h5screate_simple_f(2, dims2D, space, error)
+  CALL check("h5screate_simple_f",error, total_error)
+  !
+  ! Create the dataset and write the variable-length string data to
+  ! it.
+  !
+  CALL h5dcreate_f(file, dataset2D, filetype, space, dset, error)
+  CALL check("h5dcreate_f",error, total_error)
+
+  f_ptr = C_LOC(wdata2D(1,1))
+  CALL h5dwrite_f(dset, filetype, f_ptr, error)
+  CALL check("h5dwrite_f",error, total_error)
+
+  !
+  ! Close and release resources.
+  !
+  CALL h5dclose_f(dset , error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL h5sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+
+  CALL H5Tclose_f(filetype, error)
+  CALL check("h5tclose_f",error, total_error)
+  CALL h5fclose_f(file , error)
+  CALL check("h5fclose_f",error, total_error)
+
+  !
+  ! Now we begin the read section of this test.
+  !
+  !
+  ! Open file and dataset.
+  !
+  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
+  CALL check("h5fopen_f",error, total_error)
+  CALL h5dopen_f(file, dataset, dset, error)
+  CALL check("h5dopen_f",error, total_error)
+  !
+  ! Get the datatype.
+  !
+  CALL H5Dget_type_f(dset, filetype, error)
+  CALL check("H5Dget_type_f",error, total_error)
+  !
+  ! Get dataspace and allocate memory for read buffer.
+  !
+  CALL H5Dget_space_f(dset, space, error)
+  CALL check("H5Dget_space_f",error, total_error)
+
+  CALL H5Sget_simple_extent_dims_f(space, dims, maxdims, error) 
+  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
+  ALLOCATE(rdata(1:dims(1)))
+  !
+  ! Read the data.
+  !
+  
+  f_ptr = C_LOC(rdata(1))
+  CALL h5dread_f(dset, H5T_STRING, f_ptr, error)
+  CALL check("H5Dread_f",error, total_error)
+
+  !
+  ! Check the data.
+  !
+  DO i = 1, dims(1)
+     CALL C_F_POINTER(rdata(i), data)
+     len = 0
+     DO
+        IF(DATA(len+1:len+1).EQ.C_NULL_CHAR.OR.len.GE.8) EXIT
+        len = len + 1
+     ENDDO
+     CALL verify("h5dread_f",data(1:len), data_w(i)(1:len), total_error)
+  END DO
+
+  DEALLOCATE(rdata)
+  CALL h5dclose_f(dset , error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL h5sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  !
+  ! Test reading in 2D dataset
+  !
+  CALL h5dopen_f(file, dataset2D, dset, error)
+  CALL check("h5dopen_f",error, total_error)
+  !
+  ! Get the datatype.
+  !
+  CALL H5Dget_type_f(dset, filetype, error)
+  CALL check("H5Dget_type_f",error, total_error)
+  !
+  ! Get dataspace and allocate memory for read buffer.
+  !
+  CALL H5Dget_space_f(dset, space, error)
+  CALL check("H5Dget_space_f",error, total_error)
+
+
+  CALL H5Sget_simple_extent_dims_f(space, dims2D, maxdims, error) 
+  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
+  ALLOCATE(rdata2D(1:dims2D(1),1:dims2D(2)))
+
+  !
+  ! Read the data.
+  !
+  
+  f_ptr = C_LOC(rdata2D(1,1))
+  CALL h5dread_f(dset, H5T_STRING, f_ptr, error)
+  CALL check("H5Dread_f",error, total_error)
+
+  !
+  ! Check the data.
+  !
+  DO i = 1, dims2D(1)
+     DO j = 1, dims2D(2)
+        CALL C_F_POINTER(rdata2D(i,j), DATA)
+        len = 0
+        DO
+           IF(DATA(len+1:len+1).EQ.C_NULL_CHAR.OR.len.GE.8) EXIT
+           len = len + 1
+        ENDDO
+        CALL verify("h5dread_f",DATA(1:len), data2D_w(i,j)(1:len), total_error)
+     ENDDO
+  END DO
+
+  DEALLOCATE(rdata2D)
+  CALL h5dclose_f(dset , error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL h5sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+
+  CALL H5Tclose_f(filetype, error)
+  CALL check("h5tclose_f",error, total_error)
+  CALL h5fclose_f(file , error)
+  CALL check("h5fclose_f",error, total_error)
+
+END SUBROUTINE t_vlstring_readwrite
+
+
+SUBROUTINE t_string(total_error)
+
+  IMPLICIT NONE
+
+  INTEGER, INTENT(INOUT) :: total_error
+
+  CHARACTER(LEN=20), PARAMETER :: filename  = "t_string_F03.h5"
+  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
+  INTEGER          , PARAMETER :: dim0      = 4
+  INTEGER(SIZE_T)  , PARAMETER :: sdim      = 8
+
+  INTEGER(HID_T)  :: file, filetype, memtype, space, dset ! Handles
+  INTEGER :: error
+
+  INTEGER(HSIZE_T), DIMENSION(1:1) :: dims = (/dim0/)
+  INTEGER(HSIZE_T), DIMENSION(1:1) :: maxdims
+
+  CHARACTER(LEN=sdim), DIMENSION(1:dim0), TARGET :: &
+       wdata = (/"Parting", "is such", "sweet  ", "sorrow."/)
+  CHARACTER(LEN=sdim), DIMENSION(:), ALLOCATABLE, TARGET :: rdata
+  INTEGER(hsize_t) :: i
+  INTEGER(SIZE_T) :: size
+  TYPE(C_PTR) :: f_ptr
+  !
+  ! Create a new file using the default properties.
+  !
+  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
+  CALL check("h5fcreate_f",error, total_error)
+  !
+  ! Create file datatypes.  For this example we will save
+  ! the strings as FORTRAN strings
+  !
+  CALL H5Tcopy_f(H5T_FORTRAN_S1, filetype, error)
+  CALL check("H5Tcopy_f",error, total_error)
+  CALL H5Tset_size_f(filetype, sdim, error)
+  CALL check("H5Tset_size_f",error, total_error)
+  !
+  ! Create dataspace.
+  !
+  CALL h5screate_simple_f(1, dims, space, error)
+  CALL check("h5screate_simple_f",error, total_error)
+  !
+  ! Create the dataset and write the string data to it.
+  !
+  CALL h5dcreate_f(file, dataset, filetype, space, dset, error)
+  CALL check("h5dcreate_f",error, total_error)
+
+  f_ptr = C_LOC(wdata(1)(1:1))
+  CALL H5Dwrite_f(dset, filetype, f_ptr, error)
+  CALL check("H5Dwrite_f",error, total_error)
+  !
+  ! Close and release resources.
+  !
+  CALL h5dclose_f(dset , error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL h5sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  CALL H5Tclose_f(filetype, error)
+  CALL check("h5tclose_f",error, total_error)
+  CALL h5fclose_f(file , error)
+  CALL check("h5fclose_f",error, total_error)
+  !
+  ! Now we begin the read section of this example.
+  !
+  ! Open file and dataset.
+  !
+  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
+  CALL check("h5fopen_f",error, total_error)
+  CALL h5dopen_f(file, dataset, dset, error)
+  CALL check("h5dopen_f",error, total_error)
+  !
+  ! Get the datatype and its size.
+  !
+  CALL H5Dget_type_f(dset, filetype, error)
+  CALL check("H5Dget_type_f",error, total_error)
+  CALL H5Tget_size_f(filetype, size, error)
+  CALL check("H5Tget_size_f",error, total_error)
+  CALL VERIFY("H5Tget_size_f", INT(size), INT(sdim), total_error)
+  !
+  ! Get dataspace.
+  !
+  CALL H5Dget_space_f(dset, space, error)
+  CALL check("H5Dget_space_f",error, total_error)
+  CALL H5Sget_simple_extent_dims_f(space, dims, maxdims, error) 
+  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
+  CALL VERIFY("H5Sget_simple_extent_dims_f", dims(1), INT(dim0,hsize_t), total_error)
+
+  ALLOCATE(rdata(1:dims(1)))
+  !
+  ! Create the memory datatype.
+  !
+  CALL H5Tcopy_f(H5T_FORTRAN_S1, memtype, error) 
+  CALL check("H5Tcopy_f",error, total_error)
+  CALL H5Tset_size_f(memtype, sdim, error) 
+  CALL check("H5Tset_size_f",error, total_error)
+  !
+  ! Read the data.
+  !
+  f_ptr = C_LOC(rdata(1)(1:1))
+  CALL H5Dread_f(dset, memtype, f_ptr, error, space)
+  CALL check("H5Dread_f",error, total_error)
+
+  DO i = 1, dims(1)
+     CALL verify("h5dread_f",TRIM(rdata(i)),TRIM(wdata(i)) , total_error)
+  END DO
+
+  DEALLOCATE(rdata)
+
+  !
+  ! Close and release resources.
+  !
+  CALL H5Dclose_f(dset, error)
+  CALL check("h5dclose_f",error, total_error)
+  CALL H5Sclose_f(space, error)
+  CALL check("h5sclose_f",error, total_error)
+  CALL H5Tclose_f(memtype, error)
+  CALL check("h5tclose_f",error, total_error)
+  CALL H5Fclose_f(file, error)
+  CALL check("h5fclose_f",error, total_error)
+
+
+END SUBROUTINE t_string
+
+SUBROUTINE vl_test_special_char(total_error)
+  
+  IMPLICIT NONE
+  
+!  INTERFACE
+!     SUBROUTINE setup_buffer(data_in, line_lengths, char_type)
+!       USE HDF5
+!       USE ISO_C_BINDING
+!     IMPLICIT NONE
+!       CHARACTER(len=*), DIMENSION(:) :: data_in
+!       INTEGER(size_t), DIMENSION(:) :: line_lengths
+!       CHARACTER(KIND=C_CHAR,LEN=*) :: char_type
+!     END SUBROUTINE setup_buffer
+!  END INTERFACE
+  
+  INTEGER, INTENT(OUT) :: total_error
+  
+  CHARACTER(LEN=16), PARAMETER :: filename  = "t_controlchar.h5"
+  INTEGER, PARAMETER :: line_length = 10
+  INTEGER(hid_t) :: file
+  INTEGER(hid_t) :: dataset0
+  CHARACTER(len=line_length), DIMENSION(1:100) :: data_in
+  CHARACTER(len=line_length), DIMENSION(1:100) :: data_out
+  INTEGER(size_t), DIMENSION(1:100) :: line_lengths
+  INTEGER(hid_t) :: string_id, space, dcpl
+  INTEGER(hsize_t), DIMENSION(1:1) :: dims = (/0/)
+  INTEGER(hsize_t), DIMENSION(1:1) :: max_dims = (/0/)
+  INTEGER(hsize_t), DIMENSION(1:2) :: data_dims = (/0,0/)
+  INTEGER(hsize_t), DIMENSION(1:1) :: chunk =(/10/)
+  INTEGER, PARAMETER :: ncontrolchar = 7
+  CHARACTER(KIND=C_CHAR,LEN=1), DIMENSION(1:ncontrolchar) :: controlchar = &
+       (/C_ALERT, C_BACKSPACE,C_CARRIAGE_RETURN, C_FORM_FEED,C_HORIZONTAL_TAB,C_VERTICAL_TAB, C_NEW_LINE/)
+  INTEGER :: i, j, n, error
+  n = 8
+  !
+  ! Create a new file using the default properties.
+  !
+  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
+  CALL check("h5fcreate_f",error, total_error)
+ 
+  max_dims = (/H5S_UNLIMITED_F/)
+
+  !
+  ! Create the memory datatype.
+  !
+  CALL h5tcopy_f(h5t_string, string_id, error)
+  CALL check("h5tcopy_f", error, total_error)
+  CALL h5tset_strpad_f(string_id, h5t_str_nullpad_f, error)
+  CALL check("h5tset_strpad_f", error, total_error)
+  dims(1) = n
+  !
+  ! Create dataspace.
+  !
+  CALL h5screate_simple_f(1, dims, space, error, max_dims)
+  CALL check("h5screate_simple_f", error, total_error)
+  CALL h5pcreate_f(h5p_dataset_create_f, dcpl, error)
+  CALL check("h5pcreate_f", error, total_error)
+  CALL h5pset_chunk_f(dcpl, 1, chunk, error)
+  CALL check("h5pset_chunk_f", error, total_error)
+  
+  data_dims(1) = line_length
+  data_dims(2) = n
+  !
+  ! Create data with strings containing various control characters.
+  !
+  DO i = 1, ncontrolchar
+     !
+     ! Create the dataset, for the string with control character and write the string data to it.
+     !
+     CALL h5dcreate_f(file, controlchar(i), string_id, space, dataset0, error, dcpl)
+     CALL check("h5dcreate_f", error, total_error)
+     CALL setup_buffer(data_in(1:n), line_lengths, controlchar(i))
+     CALL h5dwrite_vl_f(dataset0, string_id, data_in(1:n), data_dims, line_lengths(1:n), error, space)
+     CALL check("h5dwrite_vl_f", error, total_error)
+     !
+     ! Read the string back.
+     !
+     CALL h5dread_vl_f(dataset0, string_id, data_out(1:n), data_dims, line_lengths(1:n), error, space)
+     CALL check("h5dread_vl_f", error, total_error)
+  
+     DO j = 1, n
+        IF(data_in(j).NE.data_out(j))THEN
+           total_error = total_error + 1
+           EXIT
+        ENDIF
+     ENDDO
+
+     CALL h5dclose_f(dataset0, error)
+     CALL check("h5dclose_f", error, total_error)
+  ENDDO
+
+  CALL h5pclose_f(dcpl, error)
+  CALL check("h5pclose_f", error, total_error)
+  CALL h5sclose_f(space, error)
+  CALL check("h5sclose_f", error, total_error)
+  CALL h5fclose_f(file, error)
+  CALL check("h5fclose_f", error, total_error)
+  
+END SUBROUTINE vl_test_special_char
+
+
+SUBROUTINE setup_buffer(data_in, line_lengths, char_type)
+  
+  IMPLICIT NONE
+  
+  ! Creates a simple "Data_in" consisting of the letters of the alphabet,
+  ! one per line, with a control character.
+  
+  CHARACTER(len=10), DIMENSION(:) :: data_in
+  INTEGER(size_t), DIMENSION(:) :: line_lengths
+  INTEGER, DIMENSION(1:3) :: letters
+  CHARACTER(LEN=3) :: lets
+  CHARACTER(KIND=C_CHAR,LEN=*) :: char_type
+  CHARACTER(KIND=C_CHAR,LEN=1) :: char_tmp
+  INTEGER :: i, j, n, ff
+
+  ! Convert the letters and special character to integers    
+  lets = 'abc'
+  
+  READ(lets,'(3A1)') letters
+  READ(char_type,'(A1)') ff
+  n = SIZE(data_in)
+  j = 1
+  DO i=1,n-1
+     IF( j .EQ. 4 )THEN
+        WRITE(char_tmp,'(A1)') ff
+        data_in(i:i) = char_tmp
+     ELSE
+        WRITE(char_tmp,'(A1)') letters(j)
+        data_in(i:i) = char_tmp
+     ENDIF
+     line_lengths(i) = LEN_TRIM(data_in(i))
+     j = j + 1
+     IF( j .EQ. 5 ) j = 1
+  END DO
+  WRITE(char_tmp,'(A1)') ff
+  data_in(n:n) =  char_tmp
+  line_lengths(n) = 1
+  
+END SUBROUTINE setup_buffer
+
+!-------------------------------------------------------------------------
+! Function:    test_nbit
+!
+! Purpose:     Tests (real, 4 byte) datatype for nbit filter
+!
+! Return:      Success:        0
+!              Failure:        >0
+!
+! Programmer:  M. Scot Breitenfeld
+!              Decemeber 7, 2010
+!
+! Modifications: Moved this subroutine from the 1.8 test file and
+! modified it to use F2003 features. 
+! This routine requires 4 byte reals, so we use F2003 features to 
+! ensure the requirement is satisfied in a portable way. 
+! The need for this arises when a user specifies the default real is 8 bytes.
+! MSB 7/31/12
+!
+!-------------------------------------------------------------------------
+!
+
+SUBROUTINE test_nbit(total_error )
+
+  IMPLICIT NONE
+  INTEGER, PARAMETER :: wp = C_FLOAT !should map to REAL*4 on most modern processors
+  INTEGER, INTENT(INOUT) :: total_error
+  INTEGER(hid_t) :: file
+  
+  INTEGER(hid_t) :: dataset, datatype, space, dc, mem_type_id
+  INTEGER(hsize_t), DIMENSION(1:2) :: dims = (/2,5/)
+  INTEGER(hsize_t), DIMENSION(1:2) :: chunk_dim = (/2,5/)
+  ! orig_data[] are initialized to be within the range that can be represented by
+  ! dataset datatype (no precision loss during datatype conversion)
+  !
+  REAL(kind=wp), DIMENSION(1:2,1:5), TARGET :: orig_data = &
+       RESHAPE( (/188384.00, 19.103516, -1.0831790e9, -84.242188, &
+       5.2045898, -49140.000, 2350.2500, -3.2110596e-1, 6.4998865e-5, -0.0000000/) , (/2,5/) )
+  REAL(kind=wp), DIMENSION(1:2,1:5), TARGET :: new_data
+  INTEGER(size_t) :: PRECISION, offset
+  INTEGER :: error
+  LOGICAL :: status
+  INTEGER(hsize_t) :: i, j
+  TYPE(C_PTR) :: f_ptr
+
+  ! check to see if filter is available
+  CALL H5Zfilter_avail_f(H5Z_FILTER_NBIT_F, status, error)
+  IF(.NOT.status)THEN ! We don't have H5Z_FILTER_NBIT_F filter
+     total_error = -1     ! so return
+     RETURN
+  ENDIF
+
+  CALL H5Fcreate_f("nbit.h5", H5F_ACC_TRUNC_F, file, error)
+  CALL check("H5Fcreate_f", error, total_error)
+
+  ! Define dataset datatype (integer), and set precision, offset
+  CALL H5Tcopy_f(H5T_IEEE_F32BE, datatype, error)
+  CALL CHECK(" H5Tcopy_f", error, total_error)
+  CALL H5Tset_fields_f(datatype, 26_size_t, 20_size_t, 6_size_t, 7_size_t, 13_size_t, error)
+  CALL CHECK(" H5Tset_fields_f", error, total_error)
+  offset = 7
+  CALL H5Tset_offset_f(datatype, offset, error)
+  CALL CHECK(" H5Tset_offset_f", error, total_error)
+  PRECISION = 20
+  CALL H5Tset_precision_f(datatype,PRECISION, error)
+  CALL CHECK(" H5Tset_precision_f", error, total_error)
+  
+  CALL H5Tset_size_f(datatype, 4_size_t, error)
+  CALL CHECK(" H5Tset_size_f", error, total_error)
+  
+  CALL H5Tset_ebias_f(datatype, 31_size_t, error)
+  CALL CHECK(" H5Tset_ebias_f", error, total_error)
+ 
+  ! Create the data space 
+  CALL H5Screate_simple_f(2, dims, space, error)
+  CALL CHECK(" H5Screate_simple_f", error, total_error)
+
+  ! USE nbit filter
+  CALL H5Pcreate_f(H5P_DATASET_CREATE_F, dc, error)
+  CALL CHECK(" H5Pcreate_f", error, total_error)
+
+  CALL H5Pset_chunk_f(dc, 2, chunk_dim, error)
+  CALL CHECK(" H5Pset_chunk_f", error, total_error)
+  CALL H5Pset_nbit_f(dc, error)
+  CALL CHECK(" H5Pset_nbit_f", error, total_error)
+
+  ! Create the dataset
+  CALL  H5Dcreate_f(file, "nbit_real", datatype, &
+       space, dataset, error, dc)
+  CALL CHECK(" H5Dcreate_f", error, total_error)
+
+  !----------------------------------------------------------------------
+  ! STEP 1: Test nbit by setting up a chunked dataset and writing
+  ! to it.
+  !----------------------------------------------------------------------
+  !
+  mem_type_id = h5kind_to_type(wp,H5_REAL_KIND)
+
+  f_ptr = C_LOC(orig_data(1,1))
+  CALL H5Dwrite_f(dataset, mem_type_id, f_ptr, error)
+  CALL CHECK(" H5Dwrite_f", error, total_error)
+
+  !----------------------------------------------------------------------
+  ! STEP 2: Try to read the data we just wrote.
+  !----------------------------------------------------------------------
+  !  
+  f_ptr = C_LOC(new_data(1,1))
+  CALL H5Dread_f(dataset, mem_type_id, f_ptr, error)
+  CALL CHECK(" H5Dread_f", error, total_error)
+
+  ! Check that the values read are the same as the values written
+  ! Assume size of long long = size of double
+  !
+  i_loop: DO i = 1, dims(1)
+     j_loop: DO j = 1, dims(2)
+        
+        IF(.NOT.(orig_data(i,j).EQ.orig_data(i,j))) CYCLE  ! skip IF value is NaN
+
+        IF( .NOT.check_real_eq( new_data(i,j), orig_data(i,j)) ) THEN
+           total_error = total_error + 1
+           WRITE(*,'("    Read different values than written.")')
+           WRITE(*,'("    At index ", 2(1X,I0))') i, j
+           EXIT i_loop
+        END IF
+     ENDDO j_loop
+  ENDDO i_loop
+
+  !----------------------------------------------------------------------
+  ! Cleanup
+  !----------------------------------------------------------------------
+  !
+  CALL H5Tclose_f(datatype, error)
+  CALL CHECK(" H5Tclose_f", error, total_error)
+  CALL H5Pclose_f(dc, error)
+  CALL CHECK(" H5Pclose_f", error, total_error)
+  CALL H5Sclose_f(space, error)
+  CALL CHECK(" H5Sclose_f", error, total_error)
+  CALL H5Dclose_f(dataset, error)
+  CALL CHECK(" H5Dclose_f", error, total_error)
+  CALL H5Fclose_f(file, error)
+  CALL CHECK(" H5Fclose_f", error, total_error)
+
+END SUBROUTINE test_nbit
+
+
+SUBROUTINE t_enum_conv(total_error)
+
+!-------------------------------------------------------------------------
+! Subroutine: t_enum_conv
+!
+! Purpose: Tests converting data from enumeration datatype
+!          to numeric (integer or floating-point number)
+!          datatype. Tests various KINDs of INTEGERs
+!          and REALs. Checks reading enum data into
+!          INTEGER and REAL KINDs.
+!
+! Return: Success:	0
+!	  Failure:	number of errors
+!
+! Programmer:  M. Scot Breitenfeld
+!              October 27, 2012
+!
+! Note:        Adapted from C test (enum.c -- test_conv)
+!              No reliance on C tests.
+!-------------------------------------------------------------------------
+!
+
+  IMPLICIT NONE
+
+  INTEGER, INTENT(INOUT) :: total_error
+
+  INTEGER, PARAMETER :: int_kind_8 = SELECTED_INT_KIND(9)   !should map to INTEGER*4 on most modern processors
+  INTEGER, PARAMETER :: int_kind_16 = SELECTED_INT_KIND(18) !should map to INTEGER*8 on most modern processors
+  
+  INTEGER, PARAMETER :: real_kind_7 = C_FLOAT  !should map to REAL*4 on most modern processors
+
+  INTEGER(hid_t) :: cwg=-1, dtype=-1, space=-1, dset=-1 ! Handles
+  INTEGER(hid_t) :: file ! Handles
+
+  ! Enumerated type
+  ENUM, BIND(C)
+    ENUMERATOR :: E1_RED, E1_GREEN, E1_BLUE, E1_WHITE, E1_BLACK
+  END ENUM
+
+  INTEGER(KIND(E1_RED)), TARGET :: val
+
+  ! Enumerated data array 
+  ! Some values are out of range for testing. The library should accept them
+  INTEGER(KIND(E1_RED)), DIMENSION(1:20), TARGET :: data1 = (/INT(E1_RED,KIND(E1_RED)), &
+       INT(E1_GREEN,KIND(E1_RED)), INT(E1_BLUE,KIND(E1_RED)),  &
+       INT(E1_GREEN,KIND(E1_RED)), INT(E1_WHITE,KIND(E1_RED)), &
+       INT(E1_WHITE,KIND(E1_RED)), INT(E1_BLACK,KIND(E1_RED)), &
+       INT(E1_GREEN,KIND(E1_RED)), INT(E1_BLUE,KIND(E1_RED)), &
+       INT(E1_RED,KIND(E1_RED)), INT(E1_RED,KIND(E1_RED)), INT(E1_BLUE,KIND(E1_RED)), &
+       INT(E1_GREEN,KIND(E1_RED)), INT(E1_BLACK,KIND(E1_RED)), INT(E1_WHITE,KIND(E1_RED)),&
+       INT(E1_RED,KIND(E1_RED)), INT(E1_WHITE,KIND(E1_RED)), &
+       INT(0,KIND(E1_RED)), INT(-1,KIND(E1_RED)), INT(-2,KIND(E1_RED))/)
+
+  ! Reading array for enum data
+  INTEGER(KIND(E1_RED)), DIMENSION(1:20), TARGET :: data2
+
+  ! Reading array's for converted enum data
+  INTEGER(C_SHORT), DIMENSION(1:20), TARGET :: data_short
+  INTEGER(C_INT), DIMENSION(1:20), TARGET :: data_int
+  REAL(C_DOUBLE), DIMENSION(1:20), TARGET :: data_double
+
+  INTEGER(int_kind_8), DIMENSION(1:20), TARGET :: data_i8
+  INTEGER(int_kind_16), DIMENSION(1:20), TARGET :: data_i16
+  REAL(real_kind_7), DIMENSION(1:20), TARGET :: data_r7
+
+  INTEGER(hsize_t), DIMENSION(1:1) :: ds_size = (/20/)
+  INTEGER(size_t) :: i
+  INTEGER(hsize_t) :: ih
+  INTEGER :: error
+  TYPE(C_PTR) :: f_ptr
+  INTEGER(HID_T) :: m_baset  ! Memory base type
+  !
+  ! Create a new file using the default properties.
+  !
+  CALL h5fcreate_f("enum1.h5", H5F_ACC_TRUNC_F, file, error)
+  CALL check("h5fcreate_f", error, total_error)
+  !
+  ! Create a new group using the default properties.
+  !
+  CALL h5gcreate_f(file, "test_conv", cwg, error)
+  CALL check("h5gcreate_f",error, total_error)
+  !
+  ! Create a enum type
+  !
+  CALL H5Tcreate_f(H5T_ENUM_F, H5OFFSETOF(C_LOC(data1(1)), C_LOC(data1(2))), dtype, error)
+  CALL check("h5tcreate_f",error, total_error)
+  !
+  ! Initialize enum data.
+  !
+  
+  val = E1_RED
+  CALL H5Tenum_insert_f(dtype, "RED", C_LOC(val), error)
+  CALL check("h5tenum_insert_f",error, total_error)
+  val = E1_GREEN
+  f_ptr = C_LOC(val)
+  CALL H5Tenum_insert_f(dtype, "GREEN", f_ptr, error)
+  CALL check("h5tenum_insert_f",error, total_error)
+  val = E1_BLUE
+  f_ptr = C_LOC(val)
+  CALL H5Tenum_insert_f(dtype, "BLUE", f_ptr, error)
+  CALL check("h5tenum_insert_f",error, total_error)
+  val = E1_WHITE
+  f_ptr = C_LOC(val)
+  CALL H5Tenum_insert_f(dtype, "WHITE", f_ptr, error)
+  CALL check("h5tenum_insert_f",error, total_error)
+  val = E1_BLACK
+  f_ptr = C_LOC(val)
+  CALL H5Tenum_insert_f(dtype, "BLACK", f_ptr, error)
+  CALL check("h5tenum_insert_f",error, total_error)
+  !
+  ! Create dataspace.  Setting maximum size to be the current size.
+  !
+  CALL h5screate_simple_f(1, ds_size, space, error)
+  CALL check("h5screate_simple_f", error, total_error)
+
+  ! ***************************************
+  ! * Dataset of enumeration type
+  ! ***************************************
+  !
+  ! Create a dataset of enum type and write enum data to it
+
+  CALL h5dcreate_f(cwg, "color_table1", dtype, space, dset, error)
+  CALL check("h5dcreate_f", error, total_error)
+
+  f_ptr = C_LOC(data1(1))
+  CALL h5dwrite_f(dset, dtype, f_ptr, error, space, space)
+  CALL check(" h5dwrite_f", error, total_error)
+
+  ! Test reading back the data with no conversion
+
+  f_ptr = C_LOC(data2(1))
+  CALL h5dread_f(dset, dtype, f_ptr, error, space, space)
+  CALL check(" h5dread_f", error, total_error)
+
+  ! Check values
+  DO ih = 1, ds_size(1)
+     IF(data1(ih) .NE. data2(ih))THEN
+        total_error = total_error + 1
+        WRITE(*,'("    1. data1(",I0,")=",I0," .NE. data2(",I0,")=",I0)') ih, data1(ih),i,data2(ih)
+        EXIT
+     ENDIF
+  ENDDO
+
+  ! Test converting the data to integer (KIND=C_SHORT). Read enum data back as integer
+  m_baset = h5kind_to_type(KIND(data_short(1)), H5_INTEGER_KIND) ! Memory base type
+  f_ptr = C_LOC(data_short(1))
+  CALL h5dread_f(dset, m_baset, f_ptr, error, space, space)
+  CALL check("h5dread_f", error, total_error)
+  ! Check values
+  DO ih = 1, ds_size(1)
+     IF(data1(ih) .NE. data_short(ih))THEN
+        total_error = total_error + 1
+        WRITE(*,'("    2. data1(",I0,")=",I0," .NE. data_short(",I0,")=",I0)') ih, data1(ih),i,data_short(ih)
+        EXIT
+     ENDIF
+  ENDDO
+
+  ! Test converting the data to (KIND=C_double) number. 
+  ! Read enum data back as (KIND=C_double) number
+
+  m_baset = h5kind_to_type(KIND(data_double(1)), H5_REAL_KIND) ! Memory base type
+  f_ptr = C_LOC(data_double(1))
+  CALL h5dread_f(dset,  m_baset, f_ptr, error, space, space)
+  CALL check("h5dread_f", error, total_error)
+  ! Check values
+  DO ih = 1, ds_size(1)
+     IF(data1(ih) .NE. INT(data_double(ih)))THEN
+        total_error = total_error + 1
+        WRITE(*,'("    3. data_double(",I0,")=",I0," .NE. data_double(",I0,")=",I0)') &
+             ih, INT(data1(ih)), ih, INT(data_double(ih))
+        EXIT
+     ENDIF
+  ENDDO
+
+  ! Test converting the data to (SELECTED_INT_KIND(9)) number. 
+  ! Read enum data back as (SELECTED_INT_KIND(9)) number
+
+  m_baset = h5kind_to_type(int_kind_8, H5_INTEGER_KIND) ! Memory base type
+  f_ptr = C_LOC(data_i8(1))
+  CALL h5dread_f(dset,  m_baset, f_ptr, error, space, space)
+  CALL check("h5dread_f", error, total_error)
+  ! Check values
+  DO ih = 1, ds_size(1)
+     IF(data1(ih) .NE. INT(data_i8(ih)))THEN
+        total_error = total_error + 1
+        WRITE(*,'("    4. data_i8(",I0,")=",I0," .NE. data_i8(",I0,")=",I0)') &
+             ih, INT(data1(ih)), i, INT(data_i8(ih))
+        EXIT
+     ENDIF
+  ENDDO
+
+  ! Test converting the data to (SELECTED_INT_KIND(18)) number. 
+  ! Read enum data back as (SELECTED_INT_KIND(18)) number
+
+  m_baset = h5kind_to_type(int_kind_16, H5_INTEGER_KIND) ! Memory base type
+  f_ptr = C_LOC(data_i16(1))
+  CALL h5dread_f(dset,  m_baset, f_ptr, error, space, space)
+  CALL check("h5dread_f", error, total_error)
+  ! Check values
+  DO ih = 1, ds_size(1)
+     IF(data1(ih) .NE. INT(data_i16(ih)))THEN
+        total_error = total_error + 1
+        WRITE(*,'("    5. data_i16(",I0,")=",I0," .NE. data_i16(",I0,")=",I0)') &
+             ih, INT(data1(ih)), i, INT(data_i16(ih))
+        EXIT
+     ENDIF
+  ENDDO
+
+  ! Test converting the data to C_FLOAT number. 
+  ! Read enum data back as C_FLOAT number
+
+  m_baset = h5kind_to_type(KIND(data_r7(1)), H5_REAL_KIND) ! Memory base type
+  f_ptr = C_LOC(data_r7(1))
+  CALL h5dread_f(dset,  m_baset, f_ptr, error, space, space)
+  CALL check("h5dread_f", error, total_error)
+  ! Check values
+  DO ih = 1, ds_size(1)
+     IF(data1(ih) .NE. INT(data_r7(ih)))THEN
+        total_error = total_error + 1
+        WRITE(*,'("    6. data_r7(",I0,")=",I0," .NE. data_r7(",I0,")=",I0)') &
+             ih, INT(data1(ih)), i, INT(data_r7(ih))
+        EXIT
+     ENDIF
+  ENDDO
+
+  CALL h5dclose_f(dset, error)
+  CALL check("h5dclose_f", error, total_error)
+
+  ! ***************************************
+  ! *    Dataset of C_int type
+  ! ***************************************
+
+  ! Create a integer dataset of KIND=C_INT and write enum data to it
+  m_baset = h5kind_to_type(KIND(data_int(1)), H5_INTEGER_KIND) ! Memory base type
+  CALL h5dcreate_f(cwg, "color_table2", m_baset, space, dset, error)
+  CALL check("h5dcreate_f", error, total_error)
+  
+  ! Write the enum data
+  f_ptr = C_LOC(data1(1))
+  CALL h5dwrite_f(dset, dtype, f_ptr, error, space, space)
+  CALL check("h5dwrite_f", error, total_error)
+
+  ! Test reading back the data with no conversion 
+  f_ptr = C_LOC(data_int(1))
+  CALL h5dread_f(dset, m_baset, f_ptr, error, space, space)
+  CALL check("h5dread_f", error, total_error)
+
+  DO ih = 1, ds_size(1)
+     IF(data1(ih) .NE. data_int(ih))THEN
+        total_error = total_error + 1
+        WRITE(*,'("    7. data1(",I0,")=",I0," .NE. data_int(",I0,")=",I0)') ih, data1(ih),i,data_int(ih)
+        EXIT
+     ENDIF
+  ENDDO
+  CALL h5dclose_f(dset, error)
+  CALL check("h5dclose_f", error, total_error)
+
+  !**************************************
+  !*    Dataset of C_double type
+  !**************************************
+
+  ! Create a dataset of KIND=C_DOUBLE and write enum data to it
+  m_baset = h5kind_to_type(KIND(data_double(1)), H5_REAL_KIND) ! Memory base type
+  CALL h5dcreate_f(cwg, "color_table3", m_baset, space, dset,  error)
+  CALL check("h5dcreate_f", error, total_error)
+
+  f_ptr = C_LOC(data1(1))
+  CALL h5dwrite_f(dset, dtype, f_ptr, error, space, space)
+  CALL check("h5dwrite_f", error, total_error)
+
+  ! Test reading back the data with no conversion 
+  f_ptr = C_LOC(data_double(1))
+  CALL h5dread_f(dset, m_baset, f_ptr, error, space, space)
+  CALL check("h5dread_f", error, total_error)
+
+  DO ih = 1, ds_size(1)
+     IF(data1(ih) .NE. INT(data_double(ih)))THEN
+        total_error = total_error + 1
+        WRITE(*,'("    8. data1(",I0,")=",I0," .NE. data_double(",I0,")=",I0)') ih, data1(ih),ih,INT(data_double(ih))
+        EXIT
+     ENDIF
+  ENDDO
+  CALL h5dclose_f(dset, error)
+  CALL check("h5dclose_f", error, total_error)
+
+  !*********************************************************
+  !* Dataset of real C_FLOAT type
+  !*********************************************************
+
+  ! Create a dataset of C_FLOAT and write enum data to it
+  m_baset = h5kind_to_type(KIND(data_r7(1)), H5_REAL_KIND) ! Memory base type
+  CALL h5dcreate_f(cwg, "color_table4", m_baset, space, dset,  error)
+  CALL check("h5dcreate_f", error, total_error)
+
+  f_ptr = C_LOC(data1(1))
+  CALL h5dwrite_f(dset, dtype, f_ptr, error, space, space)
+  CALL check("h5dwrite_f", error, total_error)
+
+  ! Test reading back the data with no conversion 
+  f_ptr = C_LOC(data_r7(1))
+  CALL h5dread_f(dset, m_baset, f_ptr, error, space, space)
+  CALL check("h5dread_f", error, total_error)
+
+  DO ih = 1, ds_size(1)
+     IF(data1(ih) .NE. INT(data_r7(ih)))THEN
+        total_error = total_error + 1
+        WRITE(*,'("    9. data1(",I0,")=",I0," .NE. data_r7(",I0,")=",I0)') ih, data1(ih),ih,INT(data_r7(ih))
+        EXIT
+     ENDIF
+  ENDDO
+  CALL h5dclose_f(dset, error)
+  CALL check("h5dclose_f", error, total_error)
+
+  ! *****************************************************************
+  ! * Dataset of integer SELECTED_INT_KIND(18) type
+  ! *****************************************************************
+
+  ! Create a integer dataset of (SELECTED_INT_KIND(18)) and write enum data to it
+  m_baset = h5kind_to_type(KIND(data_i16(1)), H5_INTEGER_KIND) ! Memory base type
+  CALL h5dcreate_f(cwg, "color_table5", m_baset, space, dset, error)
+  CALL check("h5dcreate_f", error, total_error)
+  
+  ! Write the enum data
+  f_ptr = C_LOC(data1(1))
+  CALL h5dwrite_f(dset, dtype, f_ptr, error, space, space)
+  CALL check("h5dwrite_f", error, total_error)
+
+  ! Test reading back the data with no conversion 
+  f_ptr = C_LOC(data_i16(1))
+  CALL h5dread_f(dset, m_baset, f_ptr, error, space, space)
+  CALL check("h5dread_f", error, total_error)
+
+  DO ih = 1, ds_size(1)
+     IF(data1(ih) .NE. data_i16(ih))THEN
+        total_error = total_error + 1
+        WRITE(*,'("    10. data1(",I0,")=",I0," .NE. data_i16(",I0,")=",I0)') ih, data1(ih),ih,data_i16(ih)
+        EXIT
+     ENDIF
+  ENDDO
+  CALL h5dclose_f(dset, error)
+  CALL check("h5dclose_f", error, total_error)
+
+  !
+  ! Close and release resources.
+  !
+  CALL h5sclose_f(space, error)
+  CALL check("H5Sclose_f", error, total_error)
+  CALL h5tclose_f(dtype, error)
+  CALL check("H5Tclose_f", error, total_error)
+  CALL h5gclose_f(cwg, error)
+  CALL check("h5gclose_f",error, total_error)
+  CALL h5fclose_f(file, error)
+  CALL check("H5Fclose_f", error, total_error)
+
+END SUBROUTINE t_enum_conv
+
+END MODULE TH5T_F03
diff --git a/fortran/test/tH5T_F03.f90 b/fortran/test/tH5T_F03.f90
deleted file mode 100644
index 32531b0..0000000
--- a/fortran/test/tH5T_F03.f90
+++ /dev/null
@@ -1,3453 +0,0 @@
-!****h* root/fortran/test/tH5T_F03.f90
-!
-! NAME
-!  tH5T_F03.f90
-!
-! FUNCTION
-!  Test FORTRAN HDF5 H5T APIs which are dependent on FORTRAN 2003
-!  features. 
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!
-! CONTAINS SUBROUTINES
-!  test_array_compound_atomic, test_array_compound_array,
-!  test_array_bkg, test_h5kind_to_type
-!
-!*****
-
-! *****************************************
-! ***        H 5 T   T E S T S
-! *****************************************
-
-!***************************************************************
-!**
-!**  test_array_compound_atomic(): Test basic array datatype code.
-!**  Tests 1-D array of compound datatypes (with no array fields)
-!**
-!***************************************************************
-!
-
-MODULE TH5T_F03
-
-  USE HDF5 
-  USE ISO_C_BINDING
-
-CONTAINS
-
-SUBROUTINE test_array_compound_atomic(total_error)
-
-  USE HDF5 
-  USE TH5_MISC
-  USE ISO_C_BINDING
-  IMPLICIT NONE
-
-  INTEGER, INTENT(INOUT) :: total_error
-  ! 1-D dataset WITH fixed dimensions 
-  INTEGER, PARAMETER :: SPACE1_RANK = 1
-  INTEGER, PARAMETER :: SPACE1_DIM1 = 4
-  ! 1-D array datatype 
-  INTEGER, PARAMETER :: ARRAY1_RANK= 1
-  INTEGER, PARAMETER :: ARRAY1_DIM1= 4
-  CHARACTER(LEN=10), PARAMETER :: FILENAME = "tarray1.h5"
-
-  TYPE s1_t
-     INTEGER :: i
-     REAL :: f
-  END TYPE s1_t
-  TYPE(s1_t), DIMENSION(:,:), ALLOCATABLE, TARGET :: wdata !  Information to write 
-  TYPE(s1_t), DIMENSION(:,:), ALLOCATABLE, TARGET :: rdata !  Information read in 
-  INTEGER(hid_t) :: fid1       ! HDF5 File IDs		
-  INTEGER(hid_t) :: dataset    ! Dataset ID			
-  INTEGER(hid_t) :: sid1       ! Dataspace ID			
-  INTEGER(hid_t) :: tid1       ! Array Datatype ID			
-  INTEGER(hid_t) :: tid2       ! Compound Datatype ID			
-
-  INTEGER(HSIZE_T), DIMENSION(1) :: sdims1 = (/SPACE1_DIM1/)
-  INTEGER(HSIZE_T), DIMENSION(1) :: tdims1=(/ARRAY1_DIM1/)
-  INTEGER :: ndims !  Array rank for reading 
-  INTEGER(HSIZE_T), ALLOCATABLE, DIMENSION(:) :: rdims1 ! Array dimensions for reading 
-  INTEGER(HSIZE_T), ALLOCATABLE, DIMENSION(:) :: rdims ! Array dimensions for reading 
-  INTEGER :: nmemb ! Number of compound members 
-  CHARACTER(LEN=20) :: mname ! Name of compound field 
-  INTEGER(size_t) :: off   ! Offset of compound field 
-  INTEGER(hid_t) :: mtid   ! Datatype ID for field 
-  INTEGER :: i,j      !  counting variables  
-
-  INTEGER :: error    !  Generic RETURN value 
-  INTEGER :: namelen
-  LOGICAL :: flag
-
-  TYPE(C_PTR) :: f_ptr ! Needed to pass the pointer, for g95 compiler to work
-
-  ALLOCATE( wdata(1:SPACE1_DIM1,1:ARRAY1_DIM1) )
-  ALLOCATE( rdata(1:SPACE1_DIM1,1:ARRAY1_DIM1) )
-
-  ! Initialize array data to write 
-  DO i = 1, SPACE1_DIM1
-     DO j = 1, ARRAY1_DIM1
-        wdata(i,j)%i = i * 10 + j
-        wdata(i,j)%f = i * 2.5 + j
-     ENDDO
-  ENDDO
-
-  ! Create file 
-  CALL h5fcreate_f(FILENAME,H5F_ACC_TRUNC_F,fid1,error)
-  CALL check("h5fcreate_f", error, total_error)
-
-  ! Create dataspace for datasets 
-  CALL h5screate_simple_f(SPACE1_RANK, sdims1, sid1, error)
-  CALL check("h5screate_simple_f", error, total_error)
-
-  CALL h5tcreate_f(H5T_COMPOUND_F, H5OFFSETOF(C_LOC(wdata(1,1)), C_LOC(wdata(2,1))), tid2, error)
-  CALL check("h5tcreate_f", error, total_error)
-
-  ! Insert integer field 
-  CALL h5tinsert_f(tid2, "i", H5OFFSETOF(C_LOC(wdata(1,1)),C_LOC(wdata(1,1)%i)), H5T_NATIVE_INTEGER, error)
-  CALL check("h5tinsert_f", error, total_error)
-
-  ! Insert float field 
-
-  CALL h5tinsert_f(tid2, "f", H5OFFSETOF(C_LOC(wdata(1,1)),C_LOC(wdata(1,1)%f)), H5T_NATIVE_REAL, error)
-  CALL check("h5tinsert_f", error, total_error)
-
-  !  Create an array datatype to refer to 
-  CALL h5tarray_create_f(tid2, ARRAY1_RANK, tdims1, tid1, error)
-  CALL check("h5tarray_create_f", error, total_error)
-
-  ! Close compound datatype 
-  CALL h5tclose_f(tid2,error)
-  CALL check("h5tclose_f", error, total_error)
-
-
-  ! Create a dataset 
-  CALL h5dcreate_f(fid1,"Dataset1",tid1, sid1, dataset,error)
-  CALL check("h5dcreate_f", error, total_error)
-
-  ! Write dataset to disk 
-
-  ALLOCATE(rdims(1:2)) ! dummy not needed
-
-  f_ptr = C_LOC(wdata(1,1))
-  CALL h5dwrite_f(dataset, tid1, f_ptr, error )
-  CALL check("h5dwrite_f", error, total_error)
-  ! Close Dataset  
-  CALL h5dclose_f(dataset, error)
-  CALL check("h5dclose_f", error, total_error)
-
-  ! Close datatype 
-  CALL h5tclose_f(tid1,error)
-  CALL check("h5tclose_f", error, total_error)
-
-  ! Close disk dataspace 
-  CALL h5sclose_f(sid1,error)
-  CALL check("h5sclose_f", error, total_error)
-
-  ! Close file 
-  CALL h5fclose_f(fid1,error)
-  CALL check("h5fclose_f", error, total_error)
-
-  ! Re-open file 
-  CALL h5fopen_f (FILENAME, H5F_ACC_RDONLY_F, fid1, error)
-  CALL check("h5fopen_f", error, total_error)
-
-  ! Open the dataset  
-  CALL h5dopen_f(fid1, "Dataset1", dataset, error)
-  CALL check("h5dopen_f", error, total_error)
-
-  ! Get the datatype     
-  CALL h5dget_type_f(dataset, tid1, error)
-  CALL check("h5dget_type_f", error, total_error)
-
-  ! Check the array rank 
-  CALL h5tget_array_ndims_f(tid1, ndims, error)
-  CALL check("h5tget_array_ndims_f", error, total_error)
-  CALL VERIFY("h5tget_array_ndims_f",ndims, ARRAY1_RANK, total_error)
-
-  ! Get the array dimensions 
-  ALLOCATE(rdims1(1:ndims))
-  CALL h5tget_array_dims_f(tid1, rdims1, error)
-  CALL check("h5tget_array_dims_f", error, total_error)
-
-
-  ! Check the array dimensions 
-  DO i = 1, ndims
-     CALL VERIFY("h5tget_array_dims_f", INT(rdims1(i)), INT(tdims1(i)), total_error)
-  ENDDO
-
-  ! Get the compound datatype 
-  CALL h5tget_super_f(tid1, tid2, error)
-  CALL check("h5tget_super_f", error, total_error)
-
-  ! Check the number of members 
-  CALL h5tget_nmembers_f(tid2, nmemb, error)
-  CALL check("h5tget_nmembers_f", error, total_error)
-  CALL VERIFY("h5tget_nmembers_f", nmemb, 2, total_error)
-
-  ! Check the 1st field's name 
-  CALL H5Tget_member_name_f(tid2, 0, mname, namelen,error)
-  CALL check("H5Tget_member_name_f", error, total_error)
-  CALL verifystring("H5Tget_member_name_f",mname(1:namelen),"i", total_error)
-
-  !  Check the 1st field's offset 
-  CALL H5Tget_member_offset_f(tid2, 0, off, error)
-  CALL check("H5Tget_member_offset_f", error, total_error)
-  CALL VERIFY("H5Tget_member_offset_f",INT(off),0, total_error) 
-
-
-  ! Check the 1st field's datatype 
-  CALL H5Tget_member_type_f(tid2, 0, mtid, error)
-  CALL check("H5Tget_member_type_f", error, total_error)
-
-  CALL H5Tequal_f(mtid, H5T_NATIVE_INTEGER, flag, error)
-  CALL check("H5Tequal_f", error, total_error) 
-  CALL VerifyLogical("H5Tequal_f", flag, .TRUE., total_error)
-
-  CALL h5tclose_f(mtid,error)
-  CALL check("h5tclose_f", error, total_error)
-
-  ! Check the 2nd field's name 
-  CALL H5Tget_member_name_f(tid2, 1, mname, namelen,error)
-  CALL check("H5Tget_member_name_f", error, total_error)
-  CALL verifystring("H5Tget_member_name_f",mname(1:namelen),"f", total_error)
-
-  !  Check the 2nd field's offset 
-  CALL H5Tget_member_offset_f(tid2, 1, off, error)
-  CALL check("H5Tget_member_offset_f", error, total_error)
-  CALL VERIFY("H5Tget_member_offset_f",INT(off),INT(H5OFFSETOF(C_LOC(wdata(1,1)),C_LOC(wdata(1,1)%f))), total_error)    
-
-  ! Check the 2nd field's datatype 
-  CALL H5Tget_member_type_f(tid2, 1, mtid, error)
-  CALL check("H5Tget_member_type_f", error, total_error)
-
-  CALL H5Tequal_f(mtid, H5T_NATIVE_REAL, flag, error)
-  CALL check("H5Tequal_f", error, total_error) 
-  CALL VerifyLogical("H5Tequal_f", flag, .TRUE., total_error)
-
-  CALL h5tclose_f(mtid,error)
-  CALL check("h5tclose_f", error, total_error)
-
-  !  Close Compound Datatype 
-  CALL h5tclose_f(tid2, error)
-  CALL check("h5tclose_f", error, total_error)
-
-  ! Read dataset from disk 
-
-  f_ptr = C_LOC(rdata(1,1))
-  CALL H5Dread_f(dataset, tid1, f_ptr, error)
-  CALL check("H5Dread_f", error, total_error)
-
-  ! Compare data read in 
-  DO i = 1, SPACE1_DIM1
-     DO j = 1, ARRAY1_DIM1
-        IF(wdata(i,j)%i.NE.rdata(i,j)%i)THEN
-           PRINT*, 'ERROR: Wrong integer data is read back by H5Dread_f '
-           total_error = total_error + 1
-        ENDIF
-        IF( .NOT.dreal_eq( REAL(wdata(i,j)%f,dp), REAL( rdata(i,j)%f, dp)) ) THEN
-           PRINT*, 'ERROR: Wrong real data is read back by H5Dread_f '
-           total_error = total_error + 1
-        ENDIF
-     ENDDO
-  ENDDO
-
-  ! Close Datatype 
-  CALL h5tclose_f(tid1,error)
-  CALL check("h5tclose_f", error, total_error)
-
-  ! Close Dataset 
-  CALL h5dclose_f(dataset, error)
-  CALL check("h5dclose_f", error, total_error)
-
-  ! Close file 
-  CALL h5fclose_f(fid1,error)
-  CALL check("h5fclose_f", error, total_error)
-
-END SUBROUTINE test_array_compound_atomic
-!!$
-!!$!***************************************************************
-!!$!**
-!!$!**  test_array_compound_array(): Test basic array datatype code.
-!!$!**      Tests 1-D array of compound datatypes (with array fields)
-!!$!**
-!!$!***************************************************************
-!!$
-  SUBROUTINE test_array_compound_array(total_error)
-    
-    USE HDF5 
-    USE TH5_MISC
-    USE ISO_C_BINDING
-    IMPLICIT NONE
-    
-    INTEGER, INTENT(INOUT) :: total_error
-
-    !  1-D array datatype 
-    INTEGER, PARAMETER :: ARRAY1_RANK= 1
-    INTEGER, PARAMETER :: ARRAY1_DIM1= 3
-    INTEGER, PARAMETER :: ARRAY2_DIM1= 5
-
-    INTEGER, PARAMETER :: SPACE1_RANK = 1
-    INTEGER, PARAMETER :: SPACE1_DIM1 = 4
-    CHARACTER(LEN=10), PARAMETER :: FILENAME = "tarray2.h5"
-
-    TYPE st_t_struct !  Typedef for compound datatype 
-       INTEGER :: i
-       REAL, DIMENSION(1:ARRAY2_DIM1) :: f
-       CHARACTER(LEN=2), DIMENSION(1:ARRAY2_DIM1) :: c
-    END TYPE st_t_struct
-    !  Information to write 
-    TYPE(st_t_struct), DIMENSION(1:SPACE1_DIM1,1:ARRAY1_DIM1), TARGET :: wdata
-    !  Information read in 
-    TYPE(st_t_struct), DIMENSION(1:SPACE1_DIM1,1:ARRAY1_DIM1), TARGET :: rdata
-
-
-    INTEGER(hid_t) :: fid1      !  HDF5 File IDs		
-    INTEGER(hid_t) :: dataset   !  Dataset ID			
-    integer(hid_t) :: sid1      !  Dataspace ID			
-    integer(hid_t) :: tid1      !  Array Datatype ID	
-    integer(hid_t) :: tid2      !  Compound Datatype ID	
-    integer(hid_t) :: tid3      !  Nested Array Datatype ID	
-    integer(hid_t) :: tid4      !  Nested Array Datatype ID	
-
-    INTEGER(HSIZE_T), DIMENSION(1) :: sdims1 = (/SPACE1_DIM1/)
-    INTEGER(HSIZE_T), DIMENSION(1) :: tdims1=(/ARRAY1_DIM1/)
-    INTEGER(HSIZE_T), DIMENSION(1) :: tdims2=(/ARRAY2_DIM1/)
-
-    INTEGER  ndims      ! Array rank for reading 
-
-    INTEGER(HSIZE_T), ALLOCATABLE, DIMENSION(:) :: rdims1 ! Array dimensions for reading 
-
-    INTEGER :: nmemb ! Number of compound members 
-    CHARACTER(LEN=20) :: mname ! Name of compound field 
-    INTEGER(size_t) :: off   ! Offset of compound field 
-    INTEGER(hid_t) :: mtid   ! Datatype ID for field  
-    INTEGER(hid_t) :: mtid2   ! Datatype ID for field  
-
-    INTEGER :: mclass     !  Datatype class for field 
-    INTEGER :: i,j,k      ! counting variables 
-
-    INTEGER :: error
-    CHARACTER(LEN=2) :: ichr2
-    INTEGER :: namelen
-    LOGICAL :: flag 
-    INTEGER(HID_T) :: atype_id       !String Attribute Datatype identifier
-    INTEGER(SIZE_T) :: attrlen    ! Length of the attribute string 
-
-    TYPE(c_ptr) :: f_ptr
-
-    !  Initialize array data to write 
-    DO i = 1, SPACE1_DIM1
-       DO j = 1, array1_DIM1
-          wdata(i,j)%i = i*10+j
-          DO k = 1, ARRAY2_DIM1
-             wdata(i,j)%f(k) = 10*i+j+.5
-             WRITE(ichr2,'(I2.2)') k
-             wdata(i,j)%c(k) = ichr2
-          ENDDO
-       ENDDO
-    ENDDO
-
-    !  Create file 
-    CALL h5fcreate_f(FILENAME,H5F_ACC_TRUNC_F,fid1,error)
-    CALL check("h5fcreate_f", error, total_error)   
-
-
-    !  Create dataspace for datasets 
-    CALL h5screate_simple_f(SPACE1_RANK, sdims1, sid1, error)
-    CALL check("h5screate_simple_f", error, total_error)
-
-    !  Create a compound datatype to refer to 
-    !
-    CALL h5tcreate_f(H5T_COMPOUND_F,  H5OFFSETOF(C_LOC(wdata(1,1)), C_LOC(wdata(2,1))), tid2, error)
-    CALL check("h5tcreate_f", error, total_error)
-
-    ! Insert integer field 
-    CALL h5tinsert_f(tid2, "i", H5OFFSETOF(C_LOC(wdata(1,1)),C_LOC(wdata(1,1)%i)), H5T_NATIVE_INTEGER, error)
-    CALL check("h5tinsert_f", error, total_error)
-
-    ! Create an array of floats datatype 
-    CALL h5tarray_create_f(H5T_NATIVE_REAL, ARRAY1_RANK, tdims2, tid3, error)
-    CALL check("h5tarray_create_f", error, total_error)
-    ! Insert float array field 
-
-    CALL h5tinsert_f(tid2, "f", H5OFFSETOF(C_LOC(wdata(1,1)),C_LOC(wdata(1,1)%f)), tid3, error)
-    CALL check("h5tinsert_f", error, total_error)
-
-    !
-    ! Create datatype for the String attribute.
-    !
-    CALL h5tcopy_f(H5T_NATIVE_CHARACTER, atype_id, error)
-    CALL check("h5tcopy_f",error,total_error)
- 
-    attrlen = LEN(wdata(1,1)%c(1)) 
-    CALL h5tset_size_f(atype_id, attrlen, error)
-    CALL check("h5tset_size_f",error,total_error)    
-
-    ! Create an array of character datatype 
-    CALL h5tarray_create_f(atype_id, ARRAY1_RANK, tdims2, tid4, error)
-    CALL check("h5tarray_create_f", error, total_error)
-
-    ! Insert character array field 
-    CALL h5tinsert_f(tid2, "c", H5OFFSETOF(C_LOC(wdata(1,1)),C_LOC(wdata(1,1)%c(1)(1:1))), tid4, error)
-    CALL check("h5tinsert2_f", error, total_error)
-
-    !  Close array of floats field datatype 
-    CALL h5tclose_f(tid3,error)
-    CALL check("h5tclose_f", error, total_error)
-
-    CALL h5tclose_f(tid4,error)
-    CALL check("h5tclose_f", error, total_error)
-
-    ! Create an array datatype to refer to 
-    CALL h5tarray_create_f(tid2, ARRAY1_RANK, tdims1, tid1, error)
-    CALL check("h5tarray_create_f", error, total_error)
-
-    ! Close compound datatype 
-    CALL h5tclose_f(tid2,error)
-    CALL check("h5tclose_f", error, total_error)
-
-    !  Create a dataset 
-    CALL h5dcreate_f(fid1,"Dataset1",tid1, sid1, dataset,error)
-    CALL check("h5dcreate_f", error, total_error)
-
-
-    ! Write dataset to disk 
-    f_ptr = C_LOC(wdata(1,1))
-    CALL h5dwrite_f(dataset, tid1, f_ptr, error )
-    CALL check("h5dwrite_f", error, total_error)
-
-    ! Close Dataset 
-    CALL h5dclose_f(dataset, error)
-    CALL check("h5dclose_f", error, total_error)
-
-    !  Close datatype 
-    CALL h5tclose_f(tid1,error)
-    CALL check("h5tclose_f", error, total_error)
-
-    ! Close disk dataspace 
-    CALL h5sclose_f(sid1,error)
-    CALL check("h5sclose_f", error, total_error)
-
-    ! Close file 
-    CALL h5fclose_f(fid1,error)
-    CALL check("h5fclose_f", error, total_error)
-
-    !  Re-open file 
-    CALL h5fopen_f (FILENAME, H5F_ACC_RDONLY_F, fid1, error)
-    CALL check("h5fopen_f", error, total_error)
-
-    ! Open the dataset 
-
-    CALL h5dopen_f(fid1, "Dataset1", dataset, error)
-    CALL check("h5dopen_f", error, total_error)
-    
-    !  Get the datatype 
-    CALL h5dget_type_f(dataset, tid1, error)
-    CALL check("h5dget_type_f", error, total_error)
-
-    !  Check the array rank 
-    CALL h5tget_array_ndims_f(tid1, ndims, error)
-    CALL check("h5tget_array_ndims_f", error, total_error)
-    CALL VERIFY("h5tget_array_ndims_f",ndims, ARRAY1_RANK, total_error)
-
-
-    ! Get the array dimensions 
-    ALLOCATE(rdims1(1:ndims))
-    CALL h5tget_array_dims_f(tid1, rdims1, error)
-    CALL check("h5tget_array_dims_f", error, total_error)
-
-    !  Check the array dimensions 
-    DO i = 1, ndims
-       CALL VERIFY("h5tget_array_dims_f", INT(rdims1(i)), INT(tdims1(i)), total_error)
-    ENDDO
-
-    !  Get the compound datatype 
-    CALL h5tget_super_f(tid1, tid2, error)
-    CALL check("h5tget_super_f", error, total_error)
-
-    !  Check the number of members 
-    CALL h5tget_nmembers_f(tid2, nmemb, error)
-    CALL check("h5tget_nmembers_f", error, total_error)
-    CALL VERIFY("h5tget_nmembers_f", nmemb, 3, total_error)
-
-    !  Check the 1st field's name 
-    CALL H5Tget_member_name_f(tid2, 0, mname, namelen,error)
-    CALL check("H5Tget_member_name_f", error, total_error)
-    CALL verifystring("H5Tget_member_name_f",mname(1:namelen),"i", total_error)
-
-    !  Check the 1st field's offset 
-
-    CALL H5Tget_member_offset_f(tid2, 0, off, error)
-    CALL check("H5Tget_member_offset_f", error, total_error)
-    CALL VERIFY("H5Tget_member_offset_f",INT(off),0, total_error) 
-
-    !  Check the 1st field's datatype 
-    CALL H5Tget_member_type_f(tid2, 0, mtid, error)
-    CALL check("H5Tget_member_type_f", error, total_error)
-
-    CALL H5Tequal_f(mtid, H5T_NATIVE_INTEGER, flag, error)
-    CALL check("H5Tequal_f", error, total_error) 
-    CALL VerifyLogical("H5Tequal_f", flag, .TRUE., total_error)
-
-    CALL h5tclose_f(mtid,error)
-    CALL check("h5tclose_f", error, total_error)
-
-    !  Check the 2nd field's name 
-    CALL H5Tget_member_name_f(tid2, 1, mname, namelen,error)
-    CALL check("H5Tget_member_name_f", error, total_error)
-    CALL verifystring("H5Tget_member_name_f",mname(1:namelen),"f", total_error)
-
-    !  Check the 2nd field's offset 
-    CALL H5Tget_member_offset_f(tid2, 1, off, error)
-    CALL check("H5Tget_member_offset_f", error, total_error)
-    CALL VERIFY("H5Tget_member_offset_f",INT(off),INT(H5OFFSETOF(C_LOC(wdata(1,1)),C_LOC(wdata(1,1)%f))), total_error) 
-
-    !  Check the 2nd field's datatype 
-    CALL H5Tget_member_type_f(tid2, 1, mtid, error)
-    CALL check("H5Tget_member_type_f", error, total_error)
-
-    !  Get the 2nd field's class 
-    CALL H5Tget_class_f(mtid, mclass, error)
-    CALL check("H5Tget_class_f", error, total_error)
-    CALL VERIFY("H5Tget_class_f",mclass, H5T_ARRAY_F, total_error)
-
-    !  Check the array rank 
-    CALL h5tget_array_ndims_f(mtid, ndims, error)
-    CALL check("h5tget_array_ndims_f", error, total_error)
-    CALL VERIFY("h5tget_array_ndims_f",ndims, ARRAY1_RANK, total_error)
-
-    !  Get the array dimensions 
-    CALL h5tget_array_dims_f(mtid, rdims1, error)
-    CALL check("h5tget_array_dims_f", error, total_error)
-
-    !  Check the array dimensions 
-    DO i = 1, ndims
-       CALL VERIFY("h5tget_array_dims_f", INT(rdims1(i)), INT(tdims2(i)), total_error)
-    ENDDO
-
-    !  Check the 3rd field's name 
-    CALL H5Tget_member_name_f(tid2, 2, mname, namelen,error)
-    CALL check("H5Tget_member_name_f", error, total_error)
-    CALL verifystring("H5Tget_member_name_f",mname(1:namelen),"c", total_error)
-
-    !  Check the 3rd field's offset 
-    CALL H5Tget_member_offset_f(tid2, 2, off, error)
-    CALL check("H5Tget_member_offset_f", error, total_error)
-    CALL VERIFY("H5Tget_member_offset_f",INT(off),&
-         INT(H5OFFSETOF(C_LOC(wdata(1,1)),C_LOC(wdata(1,1)%c(1)(1:1)))), total_error) 
-
-    !  Check the 3rd field's datatype 
-    CALL H5Tget_member_type_f(tid2, 2, mtid2, error)
-    CALL check("H5Tget_member_type_f", error, total_error)
-
-    !  Get the 3rd field's class 
-    CALL H5Tget_class_f(mtid2, mclass, error)
-    CALL check("H5Tget_class_f", error, total_error)
-    CALL VERIFY("H5Tget_class_f",mclass, H5T_ARRAY_F, total_error)
-
-    !  Check the array rank 
-    CALL h5tget_array_ndims_f(mtid2, ndims, error)
-    CALL check("h5tget_array_ndims_f", error, total_error)
-    CALL VERIFY("h5tget_array_ndims_f",ndims, ARRAY1_RANK, total_error)
-
-    !  Get the array dimensions 
-    CALL h5tget_array_dims_f(mtid2, rdims1, error)
-    CALL check("h5tget_array_dims_f", error, total_error)
-
-    !  Check the array dimensions 
-    DO i = 1, ndims
-       CALL VERIFY("h5tget_array_dims_f", INT(rdims1(i)), INT(tdims2(i)), total_error)
-    ENDDO
-
-    !  Check the nested array's datatype 
-    CALL H5Tget_super_f(mtid, tid3, error)
-    CALL check("H5Tget_super_f", error, total_error)
-
-    CALL H5Tequal_f(tid3, H5T_NATIVE_REAL, flag, error)
-    CALL check("H5Tequal_f", error, total_error) 
-    CALL VerifyLogical("H5Tequal_f", flag, .TRUE., total_error)
-
-    !  Check the nested array's datatype 
-    CALL H5Tget_super_f(mtid2, tid3, error)
-    CALL check("H5Tget_super_f", error, total_error)
-
-    CALL H5Tequal_f(tid3, atype_id, flag, error)
-    CALL check("H5Tequal_f", error, total_error) 
-    CALL VerifyLogical("H5Tequal_f", flag, .TRUE., total_error)
-
-    !  Close the array's base type datatype 
-    CALL h5tclose_f(tid3, error)
-    CALL check("h5tclose_f", error, total_error)
-
-    !  Close the member datatype 
-    CALL h5tclose_f(mtid,error)
-    CALL check("h5tclose_f", error, total_error)
-
-    !  Close the member datatype 
-    CALL h5tclose_f(mtid2,error)
-    CALL check("h5tclose_f", error, total_error)
-
-    !  Close Compound Datatype 
-    CALL h5tclose_f(tid2,error)
-    CALL check("h5tclose_f", error, total_error)
-
-    !  READ dataset from disk 
-    
-    f_ptr = c_null_ptr
-    f_ptr = C_LOC(rdata(1,1))
-    CALL H5Dread_f(dataset, tid1, f_ptr, error)
-    CALL check("H5Dread_f", error, total_error)
-
-    !  Compare data read in 
-    DO i = 1, SPACE1_DIM1
-       DO j = 1, ARRAY1_DIM1
-          IF(wdata(i,j)%i.NE.rdata(i,j)%i)THEN
-             PRINT*, 'ERROR: Wrong integer data is read back by H5Dread_f '
-             total_error = total_error + 1
-          ENDIF
-          DO k = 1, ARRAY2_DIM1
-             
-             IF(wdata(i,j)%f(k).NE.rdata(i,j)%f(k))THEN
-                PRINT*, 'ERROR: Wrong real array data is read back by H5Dread_f '
-                total_error = total_error + 1
-             ENDIF
-             IF(wdata(i,j)%c(k).NE.rdata(i,j)%c(k))THEN
-                PRINT*, 'ERROR: Wrong character array data is read back by H5Dread_f '
-                total_error = total_error + 1
-             ENDIF
-          ENDDO
-       ENDDO
-    ENDDO
-
-    !  Close Datatype 
-    CALL h5tclose_f(tid1,error)
-    CALL check("h5tclose_f", error, total_error)
-
-    !  Close Dataset 
-    CALL h5dclose_f(dataset, error)
-    CALL check("h5dclose_f", error, total_error)
-
-    !  Close file 
-    CALL h5fclose_f(fid1,error)
-    CALL check("h5fclose_f", error, total_error)
-  END SUBROUTINE test_array_compound_array
-!!$
-!!$!***************************************************************
-!!$!**
-!!$!**  test_array_bkg(): Test basic array datatype code.
-!!$!**      Tests reading compound datatype with array fields and
-!!$!**          writing partial fields.
-!!$!**
-!!$!***************************************************************
-!!$
-  SUBROUTINE test_array_bkg(total_error)
-    
-    USE HDF5 
-    USE TH5_MISC
-    USE ISO_C_BINDING
-    IMPLICIT NONE
-
-    INTEGER, INTENT(INOUT) :: total_error
-
-    INTEGER, PARAMETER :: LENGTH = 5
-    INTEGER, PARAMETER :: ALEN = 10
-    INTEGER, PARAMETER :: RANK = 1
-    INTEGER, PARAMETER :: NMAX = 100
-    CHARACTER(LEN=17), PARAMETER :: FIELDNAME = "ArrayofStructures"
-
-    INTEGER(hid_t) :: fid, array_dt
-    INTEGER(hid_t) :: space
-    INTEGER(hid_t) :: type
-    INTEGER(hid_t) :: dataset
-
-    INTEGER(hsize_t), DIMENSION(1:1) :: dim =(/LENGTH/)
-    INTEGER(hsize_t), DIMENSION(1:1) :: dima =(/ALEN/)
-
-    INTEGER :: i, j
-    INTEGER, DIMENSION(1:3) :: ndims = (/1,1,1/)
-
-    TYPE CmpField_struct
-       INTEGER, DIMENSION(1:ALEN) :: a
-       REAL(KIND=sp), DIMENSION(1:ALEN) :: b
-       REAL(KIND=dp), DIMENSION(1:ALEN) :: c
-    ENDTYPE CmpField_struct
-
-    TYPE(CmpField_struct), DIMENSION(1:LENGTH), TARGET :: cf
-    TYPE(CmpField_struct), DIMENSION(1:LENGTH), TARGET :: cfr
-    
-    TYPE CmpDTSinfo_struct
-       INTEGER :: nsubfields
-       CHARACTER(LEN=5), DIMENSION(1:nmax) :: name
-       INTEGER(size_t), DIMENSION(1:nmax) :: offset
-       INTEGER(hid_t), DIMENSION(1:nmax) :: datatype
-    END TYPE CmpDTSinfo_struct
-
-    TYPE(CmpDTSinfo_struct) :: dtsinfo
-
-    TYPE fld_t_struct
-       REAL(KIND=sp), DIMENSION(1:ALEN) :: b
-    END TYPE fld_t_struct
- 
-    INTEGER(SIZE_T) :: type_sizei  ! Size of the integer datatype 
-    INTEGER(SIZE_T) :: type_sizer  ! Size of the real datatype 
-    INTEGER(SIZE_T) :: type_sized  ! Size of the double datatype
-    INTEGER(SIZE_T) :: sizeof_compound ! total size of compound
-
-    TYPE(fld_t_struct), DIMENSION(1:LENGTH), TARGET :: fld
-    TYPE(fld_t_struct), DIMENSION(1:LENGTH), TARGET :: fldr
-
-    CHARACTER(LEN=10), PARAMETER :: FILENAME = "tarray3.h5"
-
-    INTEGER(HSIZE_T), ALLOCATABLE, DIMENSION(:) :: rdims1 ! Array dimensions for reading 
-    INTEGER(HSIZE_T), ALLOCATABLE, DIMENSION(:) :: rdims ! Array dimensions for reading 
-
-    INTEGER :: error
-    TYPE(c_ptr) :: f_ptr
-    
-!     Initialize the data 
-!     ------------------- 
-
-    DO i = 1, LENGTH
-       DO j = 1, ALEN
-          cf(i)%a(j) = 100*(i+1) + j
-          cf(i)%b(j) = (100.*(i+1) + 0.01*j)
-          cf(i)%c(j) = 100.*(i+1) + 0.02*j
-       ENDDO
-    ENDDO
-
-    ! Set the number of data members 
-    ! ------------------------------ 
-
-    dtsinfo%nsubfields = 3
-
-    ! Initialize the offsets  
-    ! ----------------------- 
-    CALL h5tget_size_f(H5T_NATIVE_INTEGER, type_sizei, error)
-    CALL check("h5tget_size_f", error, total_error)
-    IF(h5_sizeof(cf(1)%b(1)).EQ.4_size_t)THEN
-       CALL h5tget_size_f(H5T_NATIVE_REAL_4, type_sizer, error)
-       CALL check("h5tget_size_f", error, total_error)
-    ELSE IF(h5_sizeof(cf(1)%b(1)).EQ.8_size_t)THEN
-       CALL h5tget_size_f(H5T_NATIVE_REAL_8, type_sizer, error)
-       CALL check("h5tget_size_f", error, total_error)
-    ENDIF
-
-    CALL h5tget_size_f(H5T_NATIVE_DOUBLE, type_sized, error)
-    CALL check("h5tget_size_f", error, total_error)
-
-    dtsinfo%offset(1)   = H5OFFSETOF(C_LOC(cf(1)),C_LOC(cf(1)%a(1)))
-    dtsinfo%offset(2)   = H5OFFSETOF(C_LOC(cf(1)),C_LOC(cf(1)%b(1))) 
-    dtsinfo%offset(3)   = H5OFFSETOF(C_LOC(cf(1)),C_LOC(cf(1)%c(1)))
-
-
-    ! Initialize the data type IDs 
-    ! ---------------------------- 
-    dtsinfo%datatype(1) = H5T_NATIVE_INTEGER;
-    dtsinfo%datatype(2) = H5T_NATIVE_REAL_4;
-    dtsinfo%datatype(3) = H5T_NATIVE_REAL_8;
-
-
-    ! Initialize the names of data members 
-    ! ------------------------------------ 
-     
-    dtsinfo%name(1) = "One  "
-    dtsinfo%name(2) = "Two  "
-    dtsinfo%name(3) = "Three"
-       
-    ! Create file 
-    ! ----------- 
-    CALL h5fcreate_f(FILENAME,H5F_ACC_TRUNC_F,fid,error)
-    CALL check("h5fcreate_f", error, total_error)   
-
-
-    ! Create data space 
-    ! ----------------- 
-    CALL h5screate_simple_f(RANK, dim, space, error)
-    CALL check("h5screate_simple_f", error, total_error)
-
-
-    ! Create the memory data type 
-    ! --------------------------- 
-
-    CALL h5tcreate_f(H5T_COMPOUND_F, H5OFFSETOF(C_LOC(cf(1)), C_LOC(cf(2))), type, error)
-    CALL check("h5tcreate_f", error, total_error)
-
-    ! Add  members to the compound data type 
-    ! -------------------------------------- 
-
-    DO i = 1, dtsinfo%nsubfields
-       CALL h5tarray_create_f(dtsinfo%datatype(i), ndims(i), dima, array_dt, error)
-       CALL check("h5tarray_create_f", error, total_error)
-       CALL H5Tinsert_f(type, dtsinfo%name(i), dtsinfo%offset(i), array_dt, error)
-       CALL check("h5tinsert_f", error, total_error)
-
-       CALL h5tclose_f(array_dt,error)
-       CALL check("h5tclose_f", error, total_error)
-    ENDDO
-
-    ! Create the dataset 
-    ! ------------------ /
-    CALL h5dcreate_f(fid,FIELDNAME,type, space, dataset,error)
-    CALL check("h5dcreate_f", error, total_error)
-
-    ! Write data to the dataset 
-    ! ------------------------- 
-
-    ALLOCATE(rdims(1:2)) ! dummy not needed
-
-    f_ptr = C_LOC(cf(1))
-
-    CALL h5dwrite_f(dataset, type, f_ptr, error )
-    CALL check("h5dwrite_f", error, total_error)
-
-
-    ALLOCATE(rdims1(1:2)) ! dummy not needed
-    f_ptr = C_LOC(cfr(1))
-    CALL H5Dread_f(dataset, type, f_ptr, error)
-    CALL check("H5Dread_f", error, total_error)
-
-    ! Verify correct data 
-    ! ------------------- 
-    DO i = 1, LENGTH
-       DO j = 1, ALEN
-           IF( cf(i)%a(j) .NE. cfr(i)%a(j) )THEN
-             PRINT*, 'ERROR: Wrong integer data is read back by H5Dread_f '
-             total_error = total_error + 1
-          ENDIF
-          IF( .NOT.dreal_eq( REAL(cf(i)%b(j),dp), REAL( cfr(i)%b(j), dp)) ) THEN
-             PRINT*, 'ERROR: Wrong real data is read back by H5Dread_f '
-             total_error = total_error + 1
-          ENDIF
-          IF( .NOT.dreal_eq( REAL(cf(i)%c(j),dp), REAL( cfr(i)%c(j), dp)) ) THEN
-             PRINT*, 'ERROR: Wrong double data is read back by H5Dread_f '
-             total_error = total_error + 1
-          ENDIF
-       ENDDO
-    ENDDO
-
-
-    ! Release IDs 
-    ! ----------- 
-    CALL h5tclose_f(type,error)
-    CALL check("h5tclose_f", error, total_error)
-    CALL h5sclose_f(space,error)
-    CALL check("h5sclose_f", error, total_error)
-    CALL h5dclose_f(dataset, error)
-    CALL check("h5dclose_f", error, total_error)
-    CALL h5fclose_f(fid,error)
-    CALL check("h5fclose_f", error, total_error)
-
-    !****************************
-    ! Reopen the file and update 
-    !****************************
-
-    CALL h5fopen_f (FILENAME, H5F_ACC_RDWR_F, fid, error)
-    CALL check("h5fopen_f", error, total_error)
-
-    CALL h5dopen_f(fid, FIELDNAME, dataset, error)
-    CALL check("h5dopen_f", error, total_error)
-
-    sizeof_compound =  INT( type_sizer*ALEN, size_t)
-
-    CALL h5tcreate_f(H5T_COMPOUND_F, sizeof_compound , type, error)
-    CALL check("h5tcreate_f", error, total_error)
-
-    CALL h5tarray_create_f(H5T_NATIVE_REAL_4, 1, dima, array_dt, error)
-    CALL check("h5tarray_create_f", error, total_error)
-
-    CALL h5tinsert_f(TYPE, "Two", 0_size_t, array_dt, error)
-    CALL check("h5tinsert_f", error, total_error)
-
-    ! Initialize the data to overwrite 
-    ! -------------------------------- 
-    DO i = 1, LENGTH
-       DO j = 1, ALEN
-          fld(i)%b(j) = 1.313
-          cf(i)%b(j) = fld(i)%b(j)
-       ENDDO
-    ENDDO
-
-    f_ptr = C_LOC(fld(1))
-
-    CALL h5dwrite_f(dataset, TYPE, f_ptr, error )
-    CALL check("h5dwrite_f", error, total_error)
-
-
-    !  Read just the field changed 
-    
-    f_ptr = C_LOC(fldr(1))
-    CALL H5Dread_f(dataset, TYPE, f_ptr, error)
-    CALL check("H5Dread_f", error, total_error)
-
-    DO i = 1, LENGTH
-       DO j = 1, ALEN
-          IF( .NOT.dreal_eq( REAL(fld(i)%b(j),dp), REAL( fldr(i)%b(j), dp)) ) THEN
-             PRINT*, 'ERROR: Wrong real data is read back by H5Dread_f '
-             total_error = total_error + 1
-          ENDIF
-       ENDDO
-    ENDDO
-    CALL h5tclose_f(TYPE,error)
-    CALL check("h5tclose_f", error, total_error)
-    CALL h5tclose_f(array_dt,error)
-    CALL check("h5tclose_f", error, total_error)
-
-    CALL h5dget_type_f(dataset, type, error)
-    CALL check("h5dget_type_f", error, total_error)
-
-
-    !  Read the entire dataset again 
-
-    f_ptr = C_LOC(cfr(1))
-    CALL H5Dread_f(dataset, TYPE, f_ptr, error)
-    CALL check("H5Dread_f", error, total_error)
-
-
-    ! Verify correct data 
-    ! ------------------- 
-
-    DO i = 1, LENGTH
-       DO j = 1, ALEN
-           IF( cf(i)%a(j) .NE. cfr(i)%a(j) )THEN
-             PRINT*, 'ERROR: Wrong integer data is read back by H5Dread_f '
-             total_error = total_error + 1
-          ENDIF
-          IF( .NOT.dreal_eq( REAL(cf(i)%b(j),dp), REAL(cfr(i)%b(j), dp)) ) THEN
-             PRINT*, 'ERROR: Wrong real data is read back by H5Dread_f '
-             total_error = total_error + 1
-          ENDIF
-          IF( .NOT.dreal_eq( REAL(cf(i)%c(j),dp), REAL(cfr(i)%c(j), dp)) ) THEN
-             PRINT*, 'ERROR: Wrong double data is read back by H5Dread_f '
-             total_error = total_error + 1
-          ENDIF
-       ENDDO
-    ENDDO
-
-    CALL h5dclose_f(dataset, error)
-    CALL check("h5dclose_f", error, total_error)
-
-    CALL h5tclose_f(type,error)
-    CALL check("h5tclose_f", error, total_error)
-
-    CALL h5fclose_f(fid,error)
-    CALL check("h5fclose_f", error, total_error)
-
-!**************************************************
-! Reopen the file and print out all the data again 
-!**************************************************
-
-    CALL h5fopen_f (FILENAME, H5F_ACC_RDWR_F, fid, error)
-    CALL check("h5fopen_f", error, total_error)
-
-
-    CALL h5dopen_f(fid, FIELDNAME, dataset, error)
-    CALL check("h5dopen_f", error, total_error)
-
-
-    CALL h5dget_type_f(dataset, type, error)
-    CALL check("h5dget_type_f", error, total_error)
-
-
-    ! Reset the data to read in 
-    ! ------------------------- 
-
-    DO i = 1, LENGTH
-       cfr(i)%a(:) = 0
-       cfr(i)%b(:) = 0
-       cfr(i)%c(:) = 0
-    ENDDO
-
-    f_ptr = C_LOC(cfr(1))
-    CALL H5Dread_f(dataset, TYPE, f_ptr, error)
-    CALL check("H5Dread_f", error, total_error)
-
-    ! Verify correct data 
-    ! ------------------- 
-
-    DO i = 1, LENGTH
-       DO j = 1, ALEN
-           IF( cf(i)%a(j) .NE. cfr(i)%a(j) )THEN
-             PRINT*, 'ERROR: Wrong integer data is read back by H5Dread_f '
-             total_error = total_error + 1
-          ENDIF
-          IF( .NOT.dreal_eq( REAL(cf(i)%b(j),dp), REAL(cfr(i)%b(j), dp)) ) THEN
-             PRINT*, 'ERROR: Wrong real data is read back by H5Dread_f '
-             total_error = total_error + 1
-          ENDIF
-          IF( .NOT.dreal_eq( REAL(cf(i)%c(j),dp), REAL(cfr(i)%c(j), dp)) ) THEN
-             PRINT*, 'ERROR: Wrong double data is read back by H5Dread_f '
-             total_error = total_error + 1
-          ENDIF
-       ENDDO
-    ENDDO
-
-    CALL h5dclose_f(dataset, error)
-    CALL check("h5dclose_f", error, total_error)
-
-    CALL h5tclose_f(type,error)
-    CALL check("h5tclose_f", error, total_error)
-
-    CALL h5fclose_f(fid,error)
-    CALL check("h5fclose_f", error, total_error)
-
-  END SUBROUTINE test_array_bkg
-
-
-
-  SUBROUTINE test_h5kind_to_type(total_error)
-
-    USE ISO_C_BINDING
-    USE HDF5 ! This module contains all necessary modules
-    USE TH5_MISC
-
-    IMPLICIT NONE
-    
-    INTEGER, INTENT(INOUT) :: total_error
-    
-    INTEGER, PARAMETER :: int_kind_1 = SELECTED_INT_KIND(Fortran_INTEGER_1)  !should map to INTEGER*1 on most modern processors
-    INTEGER, PARAMETER :: int_kind_4 = SELECTED_INT_KIND(Fortran_INTEGER_2)  !should map to INTEGER*2 on most modern processors
-    INTEGER, PARAMETER :: int_kind_8 = SELECTED_INT_KIND(Fortran_INTEGER_4)  !should map to INTEGER*4 on most modern processors
-    INTEGER, PARAMETER :: int_kind_16 = SELECTED_INT_KIND(Fortran_INTEGER_8) !should map to INTEGER*8 on most modern processors
-    
-    INTEGER, PARAMETER :: real_kind_7 = SELECTED_REAL_KIND(Fortran_REAL_4)   !should map to REAL*4 on most modern processors
-    INTEGER, PARAMETER :: real_kind_15 = SELECTED_REAL_KIND(Fortran_REAL_8)  !should map to REAL*8 on most modern processors
-    
-    CHARACTER(LEN=12), PARAMETER :: filename = "dsetf_F03.h5" ! File name
-    CHARACTER(LEN=5), PARAMETER :: dsetname1 = "dset1"     ! Dataset name
-    CHARACTER(LEN=5), PARAMETER :: dsetname2 = "dset2"     ! Dataset name
-    CHARACTER(LEN=5), PARAMETER :: dsetname4 = "dset4"     ! Dataset name
-    CHARACTER(LEN=5), PARAMETER :: dsetname8 = "dset8"     ! Dataset name
-    CHARACTER(LEN=6), PARAMETER :: dsetnamer = "dsetr"     ! Dataset name
-    CHARACTER(LEN=6), PARAMETER :: dsetnamer4 = "dsetr4"     ! Dataset name
-    CHARACTER(LEN=6), PARAMETER :: dsetnamer8 = "dsetr8"     ! Dataset name
-    
-    INTEGER(HID_T) :: file_id       ! File identifier 
-    INTEGER(HID_T) :: dset_id1      ! Dataset identifier  
-    INTEGER(HID_T) :: dset_id4      ! Dataset identifier   
-    INTEGER(HID_T) :: dset_id8      ! Dataset identifier  
-    INTEGER(HID_T) :: dset_id16     ! Dataset identifier     
-    INTEGER(HID_T) :: dset_idr       ! Dataset identifier 
-    INTEGER(HID_T) :: dset_idr4      ! Dataset identifier   
-    INTEGER(HID_T) :: dset_idr8      ! Dataset identifier 
-    
-    INTEGER :: error ! Error flag
-    INTEGER :: i
-    
-! Data buffers:
-
-    INTEGER(int_kind_1), DIMENSION(1:4), TARGET :: dset_data_i1, data_out_i1
-    INTEGER(int_kind_4), DIMENSION(1:4), TARGET :: dset_data_i4, data_out_i4
-    INTEGER(int_kind_8), DIMENSION(1:4), TARGET :: dset_data_i8, data_out_i8
-    INTEGER(int_kind_16), DIMENSION(1:4), TARGET :: dset_data_i16, data_out_i16
-
-    REAL, DIMENSION(1:4), TARGET :: dset_data_r, data_out_r
-    REAL(real_kind_7), DIMENSION(1:4), TARGET :: dset_data_r7, data_out_r7
-    REAL(real_kind_15), DIMENSION(1:4), TARGET :: dset_data_r15, data_out_r15
-    
-    INTEGER(HSIZE_T), DIMENSION(1:1) :: data_dims = (/4/) 
-    INTEGER(HID_T) :: dspace_id     ! Dataspace identifier
-    
-    TYPE(C_PTR) :: f_ptr
-
-    !
-    ! Initialize the dset_data array.
-    !
-    DO i = 1, 4
-       dset_data_i1(i)  = i
-       dset_data_i4(i)  = i
-       dset_data_i8(i)  = i
-       dset_data_i16(i) = i
-
-       dset_data_r(i) = (i)*100.
-       dset_data_r7(i) = (i)*100.
-       dset_data_r15(i) = (i)*1000.
-       
-    END DO
-
-    CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, error)
-    CALL check("h5fcreate_f",error, total_error)
-  !
-  ! Create dataspaces for datasets
-  !
-    CALL h5screate_simple_f(1, data_dims , dspace_id, error)
-    CALL check("h5screate_simple_f",error, total_error)
-  !
-  ! Create the dataset.
-  !
-    CALL H5Dcreate_f(file_id, dsetname1, h5kind_to_type(int_kind_1,H5_INTEGER_KIND),  dspace_id, dset_id1, error)
-    CALL check("H5Dcreate_f",error, total_error)
-    CALL H5Dcreate_f(file_id, dsetname2, h5kind_to_type(int_kind_4,H5_INTEGER_KIND),  dspace_id, dset_id4, error)
-    CALL check("H5Dcreate_f",error, total_error)
-    CALL H5Dcreate_f(file_id, dsetname4, h5kind_to_type(int_kind_8,H5_INTEGER_KIND),  dspace_id, dset_id8, error)
-    CALL check("H5Dcreate_f",error, total_error)
-    CALL H5Dcreate_f(file_id, dsetname8, h5kind_to_type(int_kind_16,H5_INTEGER_KIND), dspace_id, dset_id16, error)
-    CALL check("H5Dcreate_f",error, total_error)
-    
-    CALL H5Dcreate_f(file_id, dsetnamer, H5T_NATIVE_REAL, dspace_id, dset_idr, error)
-    CALL check("H5Dcreate_f",error, total_error)
-    CALL H5Dcreate_f(file_id, dsetnamer4, h5kind_to_type(real_kind_7,H5_REAL_KIND),  dspace_id, dset_idr4, error)
-    CALL check("H5Dcreate_f",error, total_error)
-    CALL H5Dcreate_f(file_id, dsetnamer8, h5kind_to_type(real_kind_15,H5_REAL_KIND), dspace_id, dset_idr8, error)
-    CALL check("H5Dcreate_f",error, total_error)
-
-  !
-  ! Write the dataset.
-  !
-    f_ptr = C_LOC(dset_data_i1(1))
-    CALL h5dwrite_f(dset_id1, h5kind_to_type(int_kind_1,H5_INTEGER_KIND), f_ptr, error)
-    CALL check("H5Dwrite_f",error, total_error)
-    f_ptr = C_LOC(dset_data_i4(1))
-    CALL h5dwrite_f(dset_id4, h5kind_to_type(int_kind_4,H5_INTEGER_KIND), f_ptr, error)
-    CALL check("H5Dwrite_f",error, total_error)
-    f_ptr = C_LOC(dset_data_i8(1))
-    CALL h5dwrite_f(dset_id8, h5kind_to_type(int_kind_8,H5_INTEGER_KIND), f_ptr, error)
-    CALL check("H5Dwrite_f",error, total_error)
-    f_ptr = C_LOC(dset_data_i16(1))
-    CALL h5dwrite_f(dset_id16, h5kind_to_type(int_kind_16,H5_INTEGER_KIND), f_ptr, error)
-    CALL check("H5Dwrite_f",error, total_error)
-    f_ptr = C_LOC(dset_data_r(1))
-    CALL h5dwrite_f(dset_idr, H5T_NATIVE_REAL, f_ptr, error)
-    CALL check("H5Dwrite_f",error, total_error)
-    f_ptr = C_LOC(dset_data_r7(1))
-    CALL h5dwrite_f(dset_idr4, h5kind_to_type(real_kind_7,H5_REAL_KIND), f_ptr, error)
-    CALL check("H5Dwrite_f",error, total_error)
-    f_ptr = C_LOC(dset_data_r15(1))
-    CALL h5dwrite_f(dset_idr8, h5kind_to_type(real_kind_15,H5_REAL_KIND), f_ptr, error)
-    CALL check("H5Dwrite_f",error, total_error)
-  !
-  ! Close the file
-  !
-    CALL h5fclose_f(file_id, error)
-    CALL check("h5fclose_f",error, total_error)
-
-  ! Open the file
-
-    CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file_id, error)
-    CALL check("h5fopen_f",error, total_error)
-  !
-  ! Read the dataset.
-  !
-  ! Read data back into an integer size that is larger then the original size used for 
-  ! writing the data
-    f_ptr = C_LOC(data_out_i1)
-    CALL h5dread_f(dset_id1, h5kind_to_type(int_kind_1,H5_INTEGER_KIND), f_ptr,  error)
-    CALL check("h5dread_f",error, total_error)
-    f_ptr = C_LOC(data_out_i4)
-    CALL h5dread_f(dset_id4, h5kind_to_type(int_kind_4,H5_INTEGER_KIND), f_ptr,  error)
-    CALL check("h5dread_f",error, total_error)
-    f_ptr = C_LOC(data_out_i8)
-    CALL h5dread_f(dset_id8, h5kind_to_type(int_kind_8,H5_INTEGER_KIND), f_ptr,  error)
-    CALL check("h5dread_f",error, total_error)
-    f_ptr = C_LOC(data_out_i16)
-    CALL h5dread_f(dset_id16, h5kind_to_type(int_kind_16,H5_INTEGER_KIND), f_ptr,  error)
-    CALL check("h5dread_f",error, total_error)
-    f_ptr = C_LOC(data_out_r)
-    CALL h5dread_f(dset_idr, H5T_NATIVE_REAL, f_ptr,  error)
-    CALL check("h5dread_f",error, total_error)
-    f_ptr = C_LOC(data_out_r7)
-    CALL h5dread_f(dset_idr4, h5kind_to_type(real_kind_7,H5_REAL_KIND), f_ptr,  error)
-    CALL check("h5dread_f",error, total_error)
-    f_ptr = C_LOC(data_out_r15)
-    CALL h5dread_f(dset_idr8, h5kind_to_type(real_kind_15,H5_REAL_KIND), f_ptr,  error)
-    CALL check("h5dread_f",error, total_error)
-    
-    DO i = 1, 4
-       
-       CALL verify_Fortran_INTEGER_4("h5kind_to_type1",INT(dset_data_i1(i),int_kind_8),INT(data_out_i1(i),int_kind_8),total_error)
-       CALL verify_Fortran_INTEGER_4("h5kind_to_type2",INT(dset_data_i4(i),int_kind_8),INT(data_out_i4(i),int_kind_8),total_error)
-       CALL verify_Fortran_INTEGER_4("h5kind_to_type3",INT(dset_data_i8(i),int_kind_8),INT(data_out_i8(i),int_kind_8),total_error)
-       CALL verify_Fortran_INTEGER_4("h5kind_to_type4",INT(dset_data_i16(i),int_kind_8),INT(data_out_i16(i),int_kind_8),total_error)
-       
-       CALL verify_real_kind_7("h5kind_to_type5",REAL(dset_data_r(i),real_kind_7),REAL(data_out_r(i),real_kind_7),total_error)
-       CALL verify_real_kind_7("h5kind_to_type6",REAL(dset_data_r7(i),real_kind_7),REAL(data_out_r7(i),real_kind_7),total_error)
-       CALL verify_real_kind_7("h5kind_to_type7",REAL(dset_data_r15(i),real_kind_7),REAL(data_out_r15(i),real_kind_7),total_error)
-
-    END DO
-
-  !
-  ! Close the dataset.
-  !
-    CALL h5dclose_f(dset_id1, error)
-    CALL check("h5dclose_f",error, total_error)
-    CALL h5dclose_f(dset_id4, error)
-    CALL check("h5dclose_f",error, total_error)
-    CALL h5dclose_f(dset_id8, error)
-    CALL check("h5dclose_f",error, total_error)
-    CALL h5dclose_f(dset_id16, error)
-    CALL check("h5dclose_f",error, total_error)
-    CALL h5dclose_f(dset_idr4, error)
-    CALL check("h5dclose_f",error, total_error)
-    CALL h5dclose_f(dset_idr8, error)
-    CALL check("h5dclose_f",error, total_error)
-  !
-  ! Close the file.
-  !
-    CALL h5fclose_f(file_id, error)
-    CALL check("h5fclose_f",error, total_error)
-
-END SUBROUTINE test_h5kind_to_type
-
-!************************************************************
-!
-!  This test reads and writes array datatypes
-!  to a dataset.  The test first writes integers arrays of
-!  dimension ADIM0xADIM1 to a dataset with a dataspace of
-!  DIM0, then closes the  file.  Next, it reopens the file,
-!  reads back the data.
-!
-!************************************************************
-SUBROUTINE t_array(total_error)
-
-  USE ISO_C_BINDING
-  USE HDF5
-  USE TH5_MISC
-  
-  IMPLICIT NONE
-    
-  INTEGER, INTENT(INOUT) :: total_error
-
-  CHARACTER(LEN=19), PARAMETER :: filename  = "t_array_F03.h5"
-  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
-  INTEGER          , PARAMETER :: dim0      = 4
-  INTEGER          , PARAMETER :: adim0     = 3
-  INTEGER          , PARAMETER :: adim1     = 5
-  INTEGER(HID_T)  :: file, filetype, memtype, space, dset ! Handles
-  INTEGER(HSIZE_T), DIMENSION(1:1)   :: dims = (/dim0/)
-  INTEGER(HSIZE_T), DIMENSION(1:2)   :: adims = (/adim0, adim1/)
-  INTEGER(HSIZE_T), DIMENSION(1:2)   :: maxdims
-  INTEGER, DIMENSION(1:dim0, 1:adim0, 1:adim1), TARGET :: wdata ! Write buffer 
-  INTEGER, DIMENSION(:,:,:), ALLOCATABLE, TARGET :: rdata    ! Read buffer
-  INTEGER :: i, j, k
-  TYPE(C_PTR) :: f_ptr
-  INTEGER :: error ! Error flag
-
-  !
-  ! Initialize data.  i is the element in the dataspace, j and k the
-  ! elements within the array datatype.
-  !
-  DO i = 1, dim0
-     DO j = 1, adim0
-        DO k = 1, adim1
-           wdata(i,j,k) = (i-1)*(j-1)-(j-1)*(k-1)+(i-1)*(k-1)
-        ENDDO
-     ENDDO
-  ENDDO
-  !
-  ! Create a new file using the default properties.
-  !
-  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
-  CALL check("h5fcreate_f",error, error)
-  !
-  ! Create array datatypes for file and memory.
-  !
-  CALL H5Tarray_create_f(INT(H5T_STD_I64LE, HID_T), 2, adims, filetype, error)
-  CALL check("H5Tarray_create_f",error, total_error)
-  CALL H5Tarray_create_f(H5T_NATIVE_INTEGER, 2, adims, memtype, error)
-  CALL check("H5Tarray_create_f",error, total_error)
-  !
-  ! Create dataspace.  Setting maximum size to be the current size.
-  !
-  CALL h5screate_simple_f(1, dims, space, error)
-  CALL check("h5screate_simple_f",error, total_error)
-  !
-  ! Create the dataset and write the array data to it.
-  !
-  CALL h5dcreate_f(file, dataset, filetype, space, dset, error)
-  CALL check("h5dcreate_f",error, total_error)
-  f_ptr = C_LOC(wdata)
-  CALL h5dwrite_f(dset, memtype, f_ptr, error)
-  CALL check("h5dwrite_f",error, total_error)
-  !
-  ! Close and release resources.
-  !
-  CALL H5Dclose_f(dset, error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL H5Sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  CALL H5Tclose_f(filetype, error)
-  CALL check("h5tclose_f",error, total_error)
-  CALL H5Tclose_f(memtype, error)
-  CALL check("h5tclose_f",error, total_error)
-  CALL H5Fclose_f(file, error)
-  CALL check("h5fclose_f",error, total_error)
-  !
-  ! Now we begin the read section of this example. 
-  !
-  ! Open file, dataset, and attribute.
-  !
-  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
-  CALL check("h5fopen_f",error, total_error)
-  CALL h5dopen_f(file, dataset, dset, error)
-  CALL check("h5dopen_f",error, total_error)
-  !
-  ! Get the datatype and its dimensions.
-  !
-  CALL h5dget_type_f(dset, filetype, error)
-  CALL check("h5dget_type_f",error, error)
-  CALL H5Tget_array_dims_f(filetype, adims, error)
-  CALL check("h5dget_type_f",error, total_error)
-  CALL VERIFY("H5Tget_array_dims_f", INT(adims(1)), adim0, total_error)
-  CALL VERIFY("H5Tget_array_dims_f", INT(adims(2)), adim1, total_error)
-  !
-  ! Get dataspace and allocate memory for read buffer.  This is a
-  ! three dimensional attribute when the array datatype is included.
-  !
-  CALL H5Dget_space_f(dset, space, error)
-  CALL check("H5Dget_space_f",error, error)
-  CALL H5Sget_simple_extent_dims_f(space, dims, maxdims, error)
-  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
-  CALL VERIFY("H5Sget_simple_extent_dims_f", INT(dims(1)), dim0, total_error)
-
-  ALLOCATE(rdata(1:dims(1),1:adims(1),1:adims(2)))
-  !
-  ! Create the memory datatype.
-  ! 
-  CALL H5Tarray_create_f(H5T_NATIVE_INTEGER, 2, adims, memtype, error)
-  CALL check("H5Tarray_create_f",error, total_error)
-  !
-  ! Read the data.
-  !
-
-  f_ptr = C_LOC(rdata)
-  CALL H5Dread_f(dset, memtype, f_ptr, error)
-  CALL check("H5Dread_f",error, total_error)
-  !
-  ! Output the data to the screen.
-  !
-  i_loop: DO i = 1, INT(dims(1))
-             DO j=1, INT(adim0)
-                DO k = 1, INT(adim1)
-                   CALL VERIFY("H5Sget_simple_extent_dims_f",  rdata(i,j,k), wdata(i,j,k), total_error)
-                   IF(total_error.NE.0) EXIT i_loop
-                ENDDO
-             ENDDO
-          ENDDO i_loop
-  !
-  ! Close and release resources.
-  !
-  DEALLOCATE(rdata)
-  CALL H5Dclose_f(dset, error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL H5Sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  CALL H5Tclose_f(filetype, error)
-  CALL check("h5tclose_f",error, total_error)
-  CALL H5Tclose_f(memtype, error)
-  CALL check("h5tclose_f",error, total_error)
-  CALL H5Fclose_f(file, error)
-  CALL check("h5fclose_f",error, total_error)
-
-END SUBROUTINE t_array
-
-SUBROUTINE t_enum(total_error)
-
-  USE HDF5
-  USE TH5_MISC
-  USE ISO_C_BINDING
-
-  IMPLICIT NONE
-
-  INTEGER, INTENT(INOUT) :: total_error
-
-  CHARACTER(LEN=19), PARAMETER :: filename  = "t_enum_F03.h5"
-  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
-  INTEGER          , PARAMETER :: dim0      = 4
-  INTEGER          , PARAMETER :: dim1      = 7
-  INTEGER(HID_T)               :: F_BASET  ! File base type
-  INTEGER(HID_T)               :: M_BASET  ! Memory base type
-  INTEGER(SIZE_T)  , PARAMETER :: NAME_BUF_SIZE = 16
-
-! Enumerated type
-  INTEGER, PARAMETER :: SOLID=0, LIQUID=1, GAS=2, PLASMA=3
-
-  INTEGER(HID_T) :: file, filetype, memtype, space, dset ! Handles
-
-  INTEGER(hsize_t),   DIMENSION(1:2) :: dims = (/dim0, dim1/)
-  INTEGER, DIMENSION(1:dim0, 1:dim1), TARGET :: wdata ! Write buffer
-  INTEGER, DIMENSION(:,:), ALLOCATABLE, TARGET :: rdata ! Read buffer
-  INTEGER, DIMENSION(1:1), TARGET :: val
-
-  CHARACTER(LEN=6), DIMENSION(1:4) :: &
-       names = (/"SOLID ", "LIQUID", "GAS   ", "PLASMA"/)
-  CHARACTER(LEN=NAME_BUF_SIZE) :: name
-  INTEGER(HSIZE_T), DIMENSION(1:2) :: maxdims
-  INTEGER :: i, j, idx
-  TYPE(C_PTR) :: f_ptr
-  INTEGER :: error ! Error flag
-  !
-  ! Initialize DATA.
-  !
-  F_BASET   = H5T_STD_I16BE      ! File base type
-  M_BASET   = H5T_NATIVE_INTEGER ! Memory base type
-  DO i = 1, dim0
-     DO j = 1, dim1 
-        wdata(i,j) = MOD( (j-1)*(i-1), PLASMA+1)
-     ENDDO
-  ENDDO
-  !
-  ! Create a new file using the default properties.
-  !
-  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
-  CALL check("h5fcreate_f",error, total_error)
-  !
-  ! Create the enumerated datatypes for file and memory.  This
-  ! process is simplified IF native types are used for the file,
-  ! as only one type must be defined.
-  !
-  CALL h5tenum_create_f(F_BASET, filetype, error)
-  CALL check("h5tenum_create_f",error, total_error)
-  
-  CALL h5tenum_create_f(M_BASET, memtype, error)
-  CALL check("h5tenum_create_f",error, total_error)
-
-  DO i = SOLID, PLASMA
-     !
-     ! Insert enumerated value for memtype.
-     !
-     val(1) = i
-     CALL H5Tenum_insert_f(memtype, TRIM(names(i+1)), C_LOC(val(1)), error)
-     CALL check("H5Tenum_insert_f", error, total_error)
-     !
-     ! Insert enumerated value for filetype.  We must first convert
-     ! the numerical value val to the base type of the destination.
-     !
-     f_ptr = C_LOC(val(1))
-     CALL H5Tconvert_f(M_BASET, F_BASET, INT(1,SIZE_T), f_ptr, error)
-     CALL check("H5Tconvert_f",error, total_error)
-     IF(i.GE.1)THEN ! test both F90 and F03 APIs
-        CALL H5Tenum_insert_f(filetype, TRIM(names(i+1)), f_ptr, error)
-     ELSE
-        CALL H5Tenum_insert_f(filetype, TRIM(names(i+1)), val(1), error)
-     ENDIF
-     CALL check("H5Tenum_insert_f",error, total_error)
-  ENDDO
-  !
-  ! Create dataspace.  Setting maximum size to be the current size.
-  !
-  CALL h5screate_simple_f(2, dims, space, total_error)
-  CALL check("h5screate_simple_f",error, total_error)
-  !
-  ! Create the dataset and write the enumerated data to it.
-  ! 
-  CALL h5dcreate_f(file, dataset, filetype, space, dset, error)
-  CALL check("h5dcreate_f",error, total_error)
-  f_ptr = C_LOC(wdata(1,1))
-  CALL h5dwrite_f(dset, memtype, f_ptr, error)
-  CALL check("h5dwrite_f",error, total_error)
-  !
-  ! Close and release resources.
-  !
-  CALL h5dclose_f(dset , error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL h5sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  CALL h5tclose_f(filetype, error)
-  CALL check("h5tclose_f",error, total_error)
-  CALL h5fclose_f(file , error)
-  CALL check("h5fclose_f",error, total_error)
-
-  !
-  ! Now we begin the read section of this example.
-  !
-  ! Open file and dataset.
-  !
-  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
-  CALL check("h5fopen_f",error, total_error)
-  CALL h5dopen_f (file, dataset, dset, error)
-  CALL check("h5dopen_f",error, total_error)
-  CALL h5dopen_f(file, dataset, dset, error)
-  CALL check("h5dopen_f",error, total_error)
-  !
-  ! Get dataspace and allocate memory for read buffer.
-  !
-  CALL h5dget_space_f(dset,space, error)
-  CALL check("H5Dget_space_f",error, total_error)
-  CALL h5sget_simple_extent_dims_f(space, dims, maxdims, error)
-  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
-  CALL VERIFY("H5Sget_simple_extent_dims_f", INT(dims(1)), dim0, total_error)
-  CALL VERIFY("H5Sget_simple_extent_dims_f", INT(dims(2)), dim1, total_error)
-
-  ALLOCATE(rdata(1:dims(1),1:dims(2)))
-
-  !
-  ! Read the data.
-  !
-  f_ptr = C_LOC(rdata(1,1))
-  CALL h5dread_f(dset, memtype, f_ptr, error)
-  CALL check("H5Dread_f",error, total_error)
-
-  !
-  ! Output the data to the screen.
-  !
-  i_loop: DO i = 1, INT(dims(1))
-             DO j = 1, INT(dims(2))
-                !
-                ! Get the name of the enumeration member.
-                !
-                CALL h5tenum_nameof_f( memtype, rdata(i,j), NAME_BUF_SIZE, name, error)
-                CALL check("h5tenum_nameof_f",error, total_error)
-                idx = MOD( (j-1)*(i-1), PLASMA+1 ) + 1
-                CALL verifystring("h5tenum_nameof_f",TRIM(name),TRIM(names(idx)), total_error)
-                IF(total_error.NE.0) EXIT i_loop
-             ENDDO
-          ENDDO i_loop
-  !
-  ! Close and release resources.
-  !
-  DEALLOCATE(rdata)
-  CALL h5dclose_f(dset , error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL h5sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  CALL h5tclose_f(memtype, error)
-  CALL check("h5tclose_f",error, total_error)
-  CALL h5fclose_f(file , error)
-  CALL check("h5fclose_f",error, total_error)
-  
-END SUBROUTINE t_enum
-
-SUBROUTINE t_bit(total_error)
-
-  USE HDF5
-  USE TH5_MISC
-  USE ISO_C_BINDING
-
-  IMPLICIT NONE
-
-  INTEGER, INTENT(INOUT) :: total_error
-
-  CHARACTER(LEN=20), PARAMETER :: filename  = "t_bit_F03.h5"
-  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
-  INTEGER          , PARAMETER :: dim0      = 4
-  INTEGER          , PARAMETER :: dim1      = 7
-
-  INTEGER(HID_T)  :: file, space, dset ! Handles
-  INTEGER(HSIZE_T), DIMENSION(1:2)   :: dims = (/dim0, dim1/)
-  INTEGER(HSIZE_T), DIMENSION(1:2)   :: maxdims
-  INTEGER(C_SIGNED_CHAR), DIMENSION(1:dim0, 1:dim1), TARGET :: wdata              ! Write buffer 
-  INTEGER(C_SIGNED_CHAR), DIMENSION(:,:), ALLOCATABLE, TARGET :: rdata    ! Read buffer
-  INTEGER :: A, B, C, D
-  INTEGER :: Aw, Bw, Cw, Dw
-  INTEGER :: i, j
-  INTEGER, PARAMETER :: hex =  Z'00000003'
-  TYPE(C_PTR) :: f_ptr
-  INTEGER :: error     ! Error flag
-  !
-  ! Initialize data.  We will manually pack 4 2-bit integers into
-  ! each unsigned char data element.
-  !
-  DO i = 0, dim0-1
-     DO j = 0, dim1-1
-        wdata(i+1,j+1) = 0
-        wdata(i+1,j+1) = IOR( wdata(i+1,j+1), INT(IAND(i * j - j, hex),C_SIGNED_CHAR) )   ! Field "A"
-        wdata(i+1,j+1) = IOR( wdata(i+1,j+1), INT(ISHFT(IAND(i,hex),2),C_SIGNED_CHAR) )   ! Field "B"
-        wdata(i+1,j+1) = IOR( wdata(i+1,j+1), INT(ISHFT(IAND(j,hex),4),C_SIGNED_CHAR) )   ! Field "C"
-        wdata(i+1,j+1) = IOR( wdata(i+1,j+1), INT(ISHFT(IAND(i+j,hex),6),C_SIGNED_CHAR) ) ! Field "D"
-     ENDDO
-  ENDDO
-  !
-  ! Create a new file using the default properties.
-  !
-  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
-  CALL check("h5fcreate_f",error, total_error)
-  !
-  ! Create dataspace.  Setting maximum size to be the current size.
-  !
-  CALL h5screate_simple_f(2, dims, space, error)
-  CALL check("h5screate_simple_f",error, total_error)
-  !
-  ! Create the dataset and write the bitfield data to it.
-  !
-  CALL H5Dcreate_f(file, dataset, H5T_STD_B8BE, space, dset, error)
-  CALL check("h5dcreate_f",error, total_error)
-  f_ptr = C_LOC(wdata(1,1))
-  CALL H5Dwrite_f(dset, H5T_NATIVE_B8, f_ptr, error)
-  CALL check("h5dwrite_f",error, total_error)
-  !
-  ! Close and release resources.
-  !
-  CALL H5Dclose_f(dset, error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL H5Sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  CALL H5Fclose_f(file, error)
-  CALL check("h5fclose_f",error, total_error)
-  !
-  ! Now we begin the read section of this example. 
-  !
-  ! Open file, dataset.
-  !
-  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
-  CALL check("h5fopen_f",error, total_error)
-  CALL h5dopen_f(file, dataset, dset, error)
-  CALL check("h5dopen_f",error, total_error)
-  !
-  ! Get dataspace and allocate memory for read buffer.
-  !
-  CALL H5Dget_space_f(dset, space, error)
-  CALL check("H5Dget_space_f",error, total_error)
-  CALL H5Sget_simple_extent_dims_f(space, dims, maxdims, error)
-  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
-  CALL VERIFY("H5Sget_simple_extent_dims_f", INT(dims(1)), dim0, total_error)
-  CALL VERIFY("H5Sget_simple_extent_dims_f", INT(dims(2)), dim1, total_error)
-  ALLOCATE(rdata(1:dims(1),1:dims(2)))
-  !
-  ! Read the data.
-  !
-  f_ptr = C_LOC(rdata)
-  CALL H5Dread_f(dset,  H5T_NATIVE_B8, f_ptr, error)
-  CALL check("H5Dread_f",error, total_error)
-  !
-  ! Output the data to the screen.
-  !
-  i_loop: DO i = 1, INT(dims(1))
-            DO j = 1, INT(dims(2))
-               A = IAND(rdata(i,j), INT(hex,C_SIGNED_CHAR)) ! Retrieve field "A"
-               B = IAND(ISHFT(rdata(i,j),-2), INT(hex,C_SIGNED_CHAR)) ! Retrieve field "B"
-               C = IAND(ISHFT(rdata(i,j),-4), INT(hex,C_SIGNED_CHAR)) ! Retrieve field "C"
-               D = IAND(ISHFT(rdata(i,j),-6), INT(hex,C_SIGNED_CHAR)) ! Retrieve field "D"
-               
-               Aw = IAND(wdata(i,j), INT(hex,C_SIGNED_CHAR)) 
-               Bw = IAND(ISHFT(wdata(i,j),-2), INT(hex,C_SIGNED_CHAR))
-               Cw = IAND(ISHFT(wdata(i,j),-4), INT(hex,C_SIGNED_CHAR))
-               Dw = IAND(ISHFT(wdata(i,j),-6), INT(hex,C_SIGNED_CHAR))
-
-               CALL VERIFY("bitfield", A, Aw, total_error)
-               CALL VERIFY("bitfield", B, Bw, total_error)
-               CALL VERIFY("bitfield", C, Cw, total_error)
-               CALL VERIFY("bitfield", D, Dw, total_error)
-               IF(total_error.NE.0) EXIT i_loop
-            ENDDO
-         ENDDO i_loop
-  !
-  ! Close and release resources.
-  !
-  DEALLOCATE(rdata)
-  CALL H5Dclose_f(dset, error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL H5Sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  CALL H5Fclose_f(file, error)
-  CALL check("h5fclose_f",error, total_error)
-
-END SUBROUTINE t_bit
-
-SUBROUTINE t_opaque(total_error)
-
-  USE HDF5
-  USE TH5_MISC
-  USE ISO_C_BINDING
-
-  IMPLICIT NONE
-
-  INTEGER, INTENT(INOUT) :: total_error
-  CHARACTER(LEN=20), PARAMETER :: filename  = "t_opaque_F03.h5"
-  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
-  INTEGER          , PARAMETER :: dim0      = 4
-  INTEGER(SIZE_T)  , PARAMETER :: size      = 7
-  INTEGER(HID_T)  :: file, space, dtype, dset ! Handles
-  INTEGER(size_t) :: len
-  INTEGER(hsize_t),   DIMENSION(1:1) :: dims = (/DIM0/)
-
-  CHARACTER(LEN=size), DIMENSION(1:dim0), TARGET :: wdata ! Write buffer
-  CHARACTER(LEN=size), DIMENSION(:), ALLOCATABLE, TARGET :: rdata ! Read buffer
-  CHARACTER(LEN=size-1) :: str = "OPAQUE"
-  
-  CHARACTER(LEN=14) :: tag_sm    ! Test reading obaque tag into 
-  CHARACTER(LEN=15) :: tag_exact ! buffers that are: to small, exact
-  CHARACTER(LEN=17) :: tag_big   ! and to big.
-
-  INTEGER :: taglen
-  INTEGER(HSIZE_T), DIMENSION(1:1) :: maxdims
-  INTEGER(hsize_t) :: i
-  CHARACTER(LEN=1) :: ichr
-  TYPE(C_PTR) :: f_ptr
-  INTEGER :: error
-  !
-  ! Initialize data.
-  !
-  DO i = 1, dim0
-     WRITE(ichr,'(I1)') i-1 
-     wdata(i) = str//ichr
-  ENDDO
-  !
-  ! Create a new file using the default properties.
-  !
-  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
-  CALL check("h5fcreate_f",error, total_error)
-  !
-  ! Create opaque datatype and set the tag to something appropriate.
-  ! For this example we will write and view the data as a character
-  ! array.
-  !
-  CALL h5tcreate_f(h5T_OPAQUE_F, size, dtype, error)
-  CALL check("h5tcreate_f",error, total_error)
-  CALL h5tset_tag_f(dtype,"Character array",error)
-  CALL check("h5tset_tag_f",error, total_error)
-  !
-  ! Create dataspace.  Setting maximum size to be the current size.
-  !
-  CALL h5screate_simple_f(1, dims, space, error)
-  CALL check("h5screate_simple_f",error, total_error)
-  !
-  ! Create the dataset and write the opaque data to it.
-  !
-  CALL h5dcreate_f(file, dataset, dtype, space, dset, error)
-  CALL check("h5dcreate_f",error, total_error)
-  f_ptr = C_LOC(wdata(1)(1:1))
-  CALL h5dwrite_f(dset, dtype, f_ptr, error)
-  CALL check("h5dwrite_f",error, total_error)
-  !
-  ! Close and release resources.
-  !
-  CALL H5Dclose_f(dset, error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL H5Sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  CALL H5Tclose_f(dtype, error)
-  CALL check("h5tclose_f",error, total_error)
-  CALL H5Fclose_f(file, error)
-  CALL check("h5fclose_f",error, total_error)
-  !
-  ! Now we begin the read section of this example.
-  !
-  ! Open file and dataset.
-  !
-  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
-  CALL check("h5fopen_f",error, total_error)
-  CALL h5dopen_f(file, dataset, dset, error)
-  CALL check("h5dopen_f",error, total_error)
-  !
-  ! Get datatype and properties for the datatype.
-  !
-  CALL h5dget_type_f(dset, dtype, error)
-  CALL check("h5dget_type_f",error, total_error)
-  CALL h5tget_size_f(dtype, len, error)
-  CALL check("h5tget_size_f",error, total_error)
-
-  ! Next tests should return 
-  ! opaque_tag = tag = "Character array" and the actual length = 15
-  
-  ! Test reading into a string that is to small
-  CALL h5tget_tag_f(dtype, tag_sm, taglen, error)
-  CALL check("h5tget_tag_f",error, total_error)
-  CALL VERIFY("h5tget_tag_f", taglen, 15, total_error)
-  CALL verifystring("h5tget_tag_f",tag_sm,"Character arra", total_error)
-  
-  ! Test reading into a string that is exact
-  CALL h5tget_tag_f(dtype, tag_exact, taglen, error)
-  CALL check("h5tget_tag_f",error, total_error)
-  CALL VERIFY("h5tget_tag_f", taglen, 15, total_error)
-  CALL verifystring("h5tget_tag_f",tag_exact,"Character array", total_error)
-
-  ! Test reading into a string that is to big
-  CALL h5tget_tag_f(dtype, tag_big, taglen, error)
-  CALL check("h5tget_tag_f",error, total_error)
-  CALL VERIFY("h5tget_tag_f", taglen, 15, total_error)
-  CALL verifystring("h5tget_tag_f",tag_big,"Character array  ", total_error)
-  
-  !
-  ! Get dataspace and allocate memory for read buffer.
-  !
-  CALL h5dget_space_f(dset, space, error)
-  CALL check("H5Dget_space_f",error, total_error)
-  CALL h5sget_simple_extent_dims_f(space, dims, maxdims, error)
-  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
-  CALL VERIFY("H5Sget_simple_extent_dims_f", INT(dims(1)), dim0, total_error)
-  ALLOCATE(rdata(1:dims(1)))
-  !
-  ! Read the data.
-  !
-  f_ptr = C_LOC(rdata(1)(1:1))
-  CALL h5dread_f(dset, dtype, f_ptr, error)
-  CALL check("H5Dread_f",error, total_error)
-  !
-  DO i = 1, dims(1)
-     CALL verifystring("t_opaque",TRIM(rdata(i)),TRIM(wdata(i)), total_error)
-  ENDDO
-  !
-  ! Close and release resources.
-  !
-  DEALLOCATE(rdata)
-  CALL H5Dclose_f(dset, error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL H5Sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  CALL H5Tclose_f(dtype, error)
-  CALL check("h5tclose_f",error, total_error)
-  CALL H5Fclose_f(file, error)
-  CALL check("h5fclose_f",error, total_error)
-  
-END SUBROUTINE t_opaque
-
-SUBROUTINE t_objref(total_error)
-
-  USE HDF5
-  USE TH5_MISC
-  USE ISO_C_BINDING
-
-  IMPLICIT NONE
-
-  INTEGER, INTENT(INOUT) :: total_error
-  CHARACTER(LEN=20), PARAMETER :: filename  = "t_objref_F03.h5"
-  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
-  INTEGER          , PARAMETER :: dim0      = 2
-
-  INTEGER(HID_T)  :: file, space, dset, obj ! Handles
-  INTEGER :: error
-
-  INTEGER(hsize_t),   DIMENSION(1:1) :: dims = (/dim0/)
-  TYPE(hobj_ref_t_f), DIMENSION(1:dim0), TARGET :: wdata ! Write buffer
-  TYPE(hobj_ref_t_f), DIMENSION(:), ALLOCATABLE, TARGET :: rdata ! Read buffer
-  INTEGER :: objtype
-  INTEGER(SIZE_T) :: name_size
-  CHARACTER(LEN=80) :: name
-  INTEGER(HSIZE_T), DIMENSION(1:1) :: maxdims
-  INTEGER :: i
-  TYPE(C_PTR) :: f_ptr
-  !
-  ! Create a new file using the default properties.
-  !
-  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
-  CALL check("h5fcreate_f",error, total_error)
-  !
-  ! Create a dataset with a null dataspace.
-  !
-  CALL h5screate_f(H5S_NULL_F,space,error)
-  CALL check("h5screate_f",error, total_error)
-  CALL h5dcreate_f(file, "DS2", H5T_STD_I32LE, space, obj, error)
-  CALL check("h5dcreate_f",error, total_error)
-  !
-  CALL h5dclose_f(obj  , error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL h5sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  !
-  ! Create a group.
-  !
-  CALL h5gcreate_f(file, "G1", obj, error)
-  CALL check("h5gcreate_f",error, total_error)
-  CALL h5gclose_f(obj, error)
-  CALL check("h5gclose_f",error, total_error)
-  !
-  ! Create references to the previously created objects. note, space_id
-  ! is not needed for object references.
-  !
-  f_ptr = C_LOC(wdata(1))
-  CALL H5Rcreate_f(file, "G1", H5R_OBJECT_F, f_ptr, error)
-  CALL check("H5Rcreate_f",error, total_error)
-  f_ptr = C_LOC(wdata(2))
-  CALL H5Rcreate_f(file, "DS2", H5R_OBJECT_F, f_ptr, error)
-  CALL check("H5Rcreate_f",error, total_error)
-  !
-  ! Create dataspace.  Setting maximum size to be the current size.
-  !
-  CALL h5screate_simple_f(1, dims, space, error)
-  CALL check("h5screate_simple_f",error, total_error)
-  !
-  ! Create the dataset and write the object references to it.
-  !
-  CALL h5dcreate_f(file, dataset, H5T_STD_REF_OBJ, space, dset, error)
-  CALL check("h5dcreate_f",error, total_error)
-  
-  f_ptr = C_LOC(wdata(1))
-  CALL h5dwrite_f(dset, H5T_STD_REF_OBJ, f_ptr, error)
-  CALL check("h5dwrite_f",error, total_error)
-  !
-  ! Close and release resources.
-  !
-  CALL h5dclose_f(dset , error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL h5sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  CALL h5fclose_f(file , error)
-  CALL check("h5fclose_f",error, total_error)
-  !
-  ! Now we begin the read section of this example.
-  !
-  ! Open file and dataset.
-  !
-  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
-  CALL check("h5fopen_f",error, total_error)
-  CALL h5dopen_f(file, dataset, dset, error)
-  CALL check("h5dopen_f",error, total_error)
-  !
-  ! Get dataspace and allocate memory for read buffer.
-  !
-  CALL h5dget_space_f(dset, space, error)
-  CALL check("H5Dget_space_f",error, total_error)
-  CALL h5sget_simple_extent_dims_f(space, dims, maxdims, error)
-  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
-  CALL VERIFY("H5Sget_simple_extent_dims_f", INT(dims(1)), dim0, total_error)
-
-  ALLOCATE(rdata(1:maxdims(1)))
-  !
-  ! Read the data.
-  !
-  f_ptr = C_LOC(rdata(1))
-  CALL h5dread_f( dset, H5T_STD_REF_OBJ, f_ptr, error)
-  CALL check("H5Dread_f",error, total_error)
-  !
-  ! Output the data to the screen.
-  !
-  DO i = 1, INT(maxdims(1))
-     !
-     ! Open the referenced object, get its name and type.
-     !
-     f_ptr = C_LOC(rdata(i))
-     CALL H5Rdereference_f(dset, H5R_OBJECT_F, f_ptr, obj, error)
-     CALL check("H5Rdereference_f",error, total_error)
-     CALL H5Rget_obj_type_f(dset, H5R_OBJECT_F, f_ptr, objtype, error)
-     CALL check("H5Rget_obj_type_f",error, total_error)
-     !
-     ! Get the length of the name and name
-     !
-     name(:) = ' ' ! initialize string to blanks
-     CALL H5Iget_name_f(obj, name, 80_size_t, name_size, error)
-     CALL check("H5Iget_name_f",error, total_error)
-     !
-     ! Print the object type and close the object.
-     !
-     IF(objtype.EQ.H5G_GROUP_F)THEN
-        CALL verifystring("t_objref", name(1:name_size),"/G1", total_error)
-     ELSE IF(objtype.EQ.H5G_DATASET_F)THEN
-        CALL verifystring("t_objref", name(1:name_size),"/DS2", total_error)
-     ELSE
-        total_error = total_error + 1
-     ENDIF
-     CALL h5oclose_f(obj, error)
-     CALL check("h5oclose_f",error, total_error)
-
-  END DO
-  !
-  ! Close and release resources.
-  !
-  DEALLOCATE(rdata)
-  CALL h5dclose_f(dset , error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL h5sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  CALL h5fclose_f(file , error)
-  CALL check("h5fclose_f",error, total_error)
-
-END SUBROUTINE t_objref
-
-
-SUBROUTINE t_regref(total_error)
-
-  USE HDF5
-  USE TH5_MISC
-  USE ISO_C_BINDING
-
-  IMPLICIT NONE
-
-  INTEGER, INTENT(INOUT) :: total_error
-  CHARACTER(LEN=22), PARAMETER :: filename  = "t_regref_F03.h5"
-  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
-  CHARACTER(LEN=3) , PARAMETER :: dataset2  = "DS2"
-  INTEGER          , PARAMETER :: dim0      = 2
-  INTEGER          , PARAMETER :: ds2dim0   = 16
-  INTEGER          , PARAMETER :: ds2dim1   = 3
-
-  INTEGER(HID_T)  :: file, memspace, space, dset, dset2 ! Handles
-  INTEGER :: error
-
-  INTEGER(HSIZE_T), DIMENSION(1:1)   :: dims = (/dim0/)
-  INTEGER(HSIZE_T), DIMENSION(1:1)   :: dims3 
-  INTEGER(HSIZE_T), DIMENSION(1:2)   :: dims2 = (/ds2dim0,ds2dim1/)
-
-  INTEGER(HSIZE_T), DIMENSION(1:2,1:4) :: coords = RESHAPE((/2,1,12,3,1,2,5,3/),(/2,4/))
-  
-  INTEGER(HSIZE_T), DIMENSION(1:2) :: start=(/0,0/),stride=(/11,2/),count=(/2,2/), BLOCK=(/3,1/)
-
-  INTEGER(HSIZE_T), DIMENSION(1:1) :: maxdims
-  INTEGER(hssize_t) :: npoints
-  TYPE(hdset_reg_ref_t_f03), DIMENSION(1:dim0), TARGET :: wdata ! Write buffer
-  TYPE(hdset_reg_ref_t_f03), DIMENSION(:), ALLOCATABLE, TARGET :: rdata ! Read buffer
-
-  INTEGER(size_t) :: size
-  CHARACTER(LEN=1), DIMENSION(1:ds2dim0,1:ds2dim1), TARGET :: wdata2
-
-  CHARACTER(LEN=80),DIMENSION(1:1), TARGET :: rdata2
-  CHARACTER(LEN=80) :: name
-  INTEGER(hsize_t) :: i
-  TYPE(C_PTR) :: f_ptr
-  CHARACTER(LEN=ds2dim0) :: chrvar
-  CHARACTER(LEN=20), DIMENSION(1:2) :: chrref_correct
-
-  chrvar = "The quick brown "
-  READ(chrvar,'(16A1)') wdata2(1:16,1)
-  chrvar = "fox jumps over  "
-  READ(chrvar,'(16A1)') wdata2(1:16,2)
-  chrvar = "the 5 lazy dogs "
-  READ(chrvar,'(16A1)') wdata2(1:16,3)
-
-  chrref_correct(1) = 'hdf5'
-  chrref_correct(2) = 'Therowthedog'
-
-  !
-  ! Create a new file using the default properties.
-  !
-  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
-  CALL check("h5fcreate_f",error, total_error)
-  !
-  ! Create a dataset with character data.
-  !
-  CALL h5screate_simple_f(2, dims2, space, error)
-  CALL check("h5screate_simple_f",error, total_error)
-  CALL h5dcreate_f(file,dataset2, H5T_STD_I8LE, space, dset2, error)
-  CALL check("h5dcreate_f",error, total_error)
-  f_ptr = C_LOC(wdata2(1,1))
-  CALL h5dwrite_f(dset2, H5T_NATIVE_INTEGER_1, f_ptr, error)
-  CALL check("h5dwrite_f",error, total_error)
-  !
-  ! Create reference to a list of elements in dset2.
-  !
-  CALL h5sselect_elements_f(space, H5S_SELECT_SET_F, 2, INT(4,size_t), coords, error)
-  CALL check("h5sselect_elements_f",error, total_error)
-  f_ptr = C_LOC(wdata(1))
-  CALL h5rcreate_f(file, DATASET2, H5R_DATASET_REGION_F, f_ptr, error, space)
-  CALL check("h5rcreate_f",error, total_error)
-  !
-  ! Create reference to a hyperslab in dset2, close dataspace.
-  !
-  CALL h5sselect_hyperslab_f (space, H5S_SELECT_SET_F, start, count, error, stride, block)
-  CALL check("h5sselect_hyperslab_f",error, total_error)
-  f_ptr = C_LOC(wdata(2))
-  CALL h5rcreate_f(file, DATASET2, H5R_DATASET_REGION_F, f_ptr, error, space)
-  CALL check("h5rcreate_f",error, total_error)
-
-  CALL h5sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  !
-  ! Create dataspace.  Setting maximum size to the current size.
-  !
-  CALL h5screate_simple_f(1, dims, space, error)
-  CALL check("h5screate_simple_f",error, total_error)
-
-  !
-  ! Create the dataset and write the region references to it.
-  !
-  CALL h5dcreate_f(file, dataset, H5T_STD_REF_DSETREG, space, dset, error)
-  CALL check("h5dcreate_f",error, total_error)
-  f_ptr = C_LOC(wdata(1))
-  CALL h5dwrite_f(dset, H5T_STD_REF_DSETREG, f_ptr, error)
-  CALL check("h5dwrite_f",error, total_error)
-  !
-  ! Close and release resources.
-  !
-  CALL h5dclose_f(dset , error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL h5dclose_f(dset2, error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL h5sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  CALL h5fclose_f(file , error)
-  CALL check("h5fclose_f",error, total_error)
-  !
-  ! Now we begin the read section of this example.
-  !
-  !
-  ! Open file and dataset.
-  !
-  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
-  CALL check("h5fopen_f",error, total_error)
-  CALL h5dopen_f(file, dataset, dset, error)
-  CALL check("h5dopen_f",error, total_error)
-  !
-  ! Get dataspace and allocate memory for read buffer.
-  !
-  CALL h5dget_space_f(dset, space, error)
-  CALL check("H5Dget_space_f",error, total_error)
-  CALL h5sget_simple_extent_dims_f(space, dims, maxdims, error)
-  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
-  CALL VERIFY("H5Sget_simple_extent_dims_f", INT(dims(1)), dim0, total_error)
-  ALLOCATE(rdata(1:dims(1)))
-  CALL h5sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  !
-  ! Read the data.
-  !
-  f_ptr = C_LOC(rdata(1))
-  CALL h5dread_f( dset, H5T_STD_REF_DSETREG, f_ptr, error)
-  CALL check("H5Dread_f",error, total_error)
-  !
-  ! Output the data to the screen.
-  !
-  DO i = 1, dims(1)
-     
-     !
-     ! Open the referenced object, retrieve its region as a
-     ! dataspace selection.
-     !
-     f_ptr = C_LOC(rdata(i))
-     CALL H5Rdereference_f(dset, H5R_DATASET_REGION_F, f_ptr, dset2, error)
-     CALL check("H5Rdereference_f",error, total_error)
- 
-     CALL H5Rget_region_f(dset, f_ptr, space, error)
-     CALL check("H5Rget_region_f",error, total_error)
-  
-     !
-     ! Get the object's name
-     !
-     name(:) = ' ' ! initialize string to blanks
-     CALL H5Iget_name_f(dset2, name, 80_size_t, size, error)
-     CALL check("H5Iget_name_f",error, total_error)
-     CALL VERIFY("H5Iget_name_f", INT(size), LEN_TRIM(name), total_error)
-     CALL verifystring("H5Iget_name_f",name(1:size),TRIM(name), total_error)
-     !
-     ! Allocate space for the read buffer.
-     !
-     CALL H5Sget_select_npoints_f(space, npoints, error)
-     CALL check("H5Sget_select_npoints_f",error, total_error)
-     CALL VERIFY("H5Sget_select_npoints_f", INT(npoints), LEN_TRIM(chrref_correct(i)), total_error)
-     
-     dims3(1) = npoints
-     !
-     ! Read the dataset region.
-     !
-     CALL h5screate_simple_f(1, dims3, memspace, error)
-     CALL check("h5screate_simple_f",error, total_error)
-
-     f_ptr = C_LOC(rdata2(1)(1:1))
-     CALL h5dread_f( dset2, H5T_NATIVE_INTEGER_1, f_ptr, error, memspace, space)
-     CALL check("H5Dread_f",error, total_error)
-     CALL verifystring("h5dread_f",rdata2(1)(1:npoints),TRIM(chrref_correct(i)), total_error)
-
-     CALL H5Sclose_f(space, error)
-     CALL check("h5sclose_f",error, total_error)
-     CALL H5Sclose_f(memspace, error)
-     CALL check("h5sclose_f",error, total_error)
-     CALL H5Dclose_f(dset2, error)
-     CALL check("h5dclose_f",error, total_error)
-
-  END DO
-  !
-  ! Close and release resources.
-  !
-  DEALLOCATE(rdata)
-  CALL H5Dclose_f(dset, error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL H5Fclose_f(file, error)
-  CALL check("h5fclose_f",error, total_error)
-
-END SUBROUTINE t_regref
-
-SUBROUTINE t_vlen(total_error)
-
-  USE HDF5
-  USE TH5_MISC
-  USE ISO_C_BINDING
-
-  IMPLICIT NONE
-
-  INTEGER, INTENT(INOUT) :: total_error
-  CHARACTER(LEN=18), PARAMETER :: filename  = "t_vlen_F03.h5"
-  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
-  INTEGER, PARAMETER :: LEN0 = 3
-  INTEGER, PARAMETER :: LEN1 = 12
-  INTEGER(hsize_t) :: dim0
-
-  INTEGER(HID_T)  :: file, filetype, memtype, space, dset ! Handles
-  INTEGER :: error
-  INTEGER(HSIZE_T), DIMENSION(1:2)   :: maxdims
-  INTEGER :: i, j
-
-  ! vl data
-  TYPE vl
-     INTEGER, DIMENSION(:), POINTER :: DATA
-  END TYPE vl
-  TYPE(vl), DIMENSION(:), ALLOCATABLE, TARGET :: ptr
-
-
-  TYPE(hvl_t), DIMENSION(1:2), TARGET :: wdata ! Array of vlen structures
-  TYPE(hvl_t), DIMENSION(1:2), TARGET :: rdata ! Pointer to vlen structures
-
-  INTEGER(hsize_t), DIMENSION(1:1) :: dims = (/2/)
-  INTEGER, DIMENSION(:), POINTER :: ptr_r 
-  TYPE(C_PTR) :: f_ptr
-  
-  !
-  ! Initialize variable-length data.  wdata(1) is a countdown of
-  ! length LEN0, wdata(2) is a Fibonacci sequence of length LEN1.
-  !
-  wdata(1)%len = LEN0
-  wdata(2)%len = LEN1
-
-  ALLOCATE( ptr(1:2) )
-  ALLOCATE( ptr(1)%data(1:wdata(1)%len) )
-  ALLOCATE( ptr(2)%data(1:wdata(2)%len) )
-
-  DO i=1, wdata(1)%len
-     ptr(1)%data(i) = wdata(1)%len - i + 1 ! 3 2 1
-  ENDDO
-  wdata(1)%p = C_LOC(ptr(1)%data(1))
-
-  ptr(2)%data(1:2) = 1
-  DO i = 3, wdata(2)%len
-     ptr(2)%data(i) = ptr(2)%data(i-1) + ptr(2)%data(i-2) ! (1 1 2 3 5 8 etc.)
-  ENDDO
-  wdata(2)%p = C_LOC(ptr(2)%data(1))
-
-  !
-  ! Create a new file using the default properties.
-  !
-  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
-  CALL check("h5fcreate_f",error, total_error)
-  !
-  ! Create variable-length datatype for file and memory.
-  !
-  CALL H5Tvlen_create_f(H5T_STD_I32LE, filetype, error)
-  CALL check("H5Tvlen_create_f",error, total_error)
-  CALL H5Tvlen_create_f(H5T_NATIVE_INTEGER, memtype, error)
-  CALL check("H5Tvlen_create_f",error, total_error)
-  !
-  ! Create dataspace.
-  !
-  CALL h5screate_simple_f(1, dims, space, error)
-  CALL check("h5screate_simple_f",error, total_error)
-  !
-  ! Create the dataset and write the variable-length data to it.
-  !
-  CALL H5Dcreate_f(file, dataset, filetype, space, dset, error)
-  CALL check("h5dcreate_f",error, total_error)
- 
-  f_ptr = C_LOC(wdata(1))
-  CALL h5dwrite_f(dset, memtype, f_ptr, error)
-  CALL check("h5dwrite_f",error, total_error)
-  !
-  ! Close and release resources.  Note the use of H5Dvlen_reclaim
-  ! removes the need to manually deallocate the previously allocated
-  ! data.
-  !
-
-  CALL h5dclose_f(dset , error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL h5sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  CALL H5Tclose_f(filetype, error)
-  CALL check("h5tclose_f",error, total_error)
-  CALL H5Tclose_f(memtype, error)
-  CALL check("h5tclose_f",error, total_error)
-  CALL h5fclose_f(file , error)
-  CALL check("h5fclose_f",error, total_error)
-
-  !
-  ! Now we begin the read section of this example.
-
-  !
-  ! Open file and dataset.
-  !
-  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
-  CALL check("h5fopen_f",error, total_error)
-  CALL h5dopen_f(file, dataset, dset, error)
-  CALL check("h5dopen_f",error, total_error)
-
-  !
-  ! Get dataspace and allocate memory for array of vlen structures.
-  ! This does not actually allocate memory for the vlen data, that
-  ! will be done by the library.
-  !
-  CALL H5Dget_space_f(dset, space, error)
-  CALL check("H5Dget_space_f",error, total_error)
-  dim0 = dims(1)
-  CALL H5Sget_simple_extent_dims_f(space, dims, maxdims, error) 
-  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
-  CALL VERIFY("H5Sget_simple_extent_dims_f", INT(dims(1)), INT(dim0), total_error)
-
-  !
-  ! Create the memory datatype.
-  !
-  CALL H5Tvlen_create_f(H5T_NATIVE_INTEGER, memtype, error) 
-  CALL check("H5Tvlen_create_f",error, total_error)
-
-  !
-  ! Read the data.
-  !
-  f_ptr = C_LOC(rdata(1))
-  CALL H5Dread_f(dset, memtype, f_ptr, error)
-  CALL check("H5Dread_f",error, total_error)
-
-  DO i = 1, INT(dims(1))
-     CALL c_f_pointer(rdata(i)%p, ptr_r, [rdata(i)%len] )
-     DO j = 1, rdata(i)%len
-        CALL VERIFY("t_vlen", ptr_r(j), ptr(i)%data(j), total_error)
-     ENDDO
-  ENDDO
-  !
-  ! Close and release resources.
-  !
-  DEALLOCATE(ptr)
-  CALL h5dvlen_reclaim_f(memtype, space, H5P_DEFAULT_F, f_ptr, error)
-  CALL h5dclose_f(dset, error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL h5sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  CALL H5Tclose_f(memtype, error)
-  CALL check("h5tclose_f",error, total_error)
-  CALL h5fclose_f(file, error)
-  CALL check("h5fclose_f",error, total_error)
-
-END SUBROUTINE t_vlen
-
-
-SUBROUTINE t_vlstring(total_error)
-
-  USE HDF5
-  USE TH5_MISC
-  USE ISO_C_BINDING
-
-  IMPLICIT NONE
-
-  INTEGER, INTENT(INOUT) :: total_error
-
-  CHARACTER(LEN=18), PARAMETER :: filename  = "t_vlstring.h5"
-  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
-
-  INTEGER(SIZE_T), PARAMETER :: dim0      = 4
-  INTEGER(SIZE_T), PARAMETER :: sdim      = 7
-  INTEGER(HID_T)  :: file, filetype, space, dset ! Handles
-  INTEGER :: error
-  INTEGER(HSIZE_T), DIMENSION(1:1) :: dims = (/dim0/)
-  INTEGER(HSIZE_T), DIMENSION(1:2) :: maxdims
-  
-  CHARACTER(LEN=sdim), DIMENSION(1:dim0), TARGET :: &
-       wdata = (/"Parting", "is such", "sweet  ", "sorrow."/) ! Write buffer
-  CHARACTER(LEN=sdim), DIMENSION(:), ALLOCATABLE :: rdata ! Read buffer
-  INTEGER(HSIZE_T), DIMENSION(2) :: data_dims = (/sdim,dim0/)
-  INTEGER(SIZE_T), DIMENSION(4) :: str_len = (/7,7,5,7/)
-  INTEGER(hsize_t) :: i
-
-  !
-  ! Create a new file using the default properties.
-  !
-  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
-  CALL check("h5fcreate_f",error, total_error)
-  !
-  ! Create file and memory datatypes.  For this example we will save
-  ! the strings as C variable length strings, H5T_STRING is defined
-  ! as a variable length string.
-  !
-  CALL H5Tcopy_f(H5T_STRING, filetype, error)
-  CALL check("H5Tcopy_f",error, total_error)
-  CALL H5Tset_strpad_f(filetype, H5T_STR_NULLPAD_F, error)
-  CALL check("H5Tset_strpad_f",error, total_error)
-  !
-  ! Create dataspace.
-  !
-  CALL h5screate_simple_f(1, dims, space, error)
-  CALL check("h5screate_simple_f",error, total_error)
-  !
-  ! Create the dataset and write the variable-length string data to
-  ! it.
-  !
-  CALL h5dcreate_f(file, dataset, filetype, space, dset, error)
-  CALL check("h5dcreate_f",error, total_error)
-
-  CALL h5dwrite_vl_f(dset, filetype, wdata, data_dims, str_len, error, space)
-  CALL check("h5dwrite_vl_f",error, total_error)
-
-  !
-  ! Close and release resources.
-  !
-  CALL h5dclose_f(dset , error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL h5sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  CALL H5Tclose_f(filetype, error)
-  CALL check("h5tclose_f",error, total_error)
-  CALL h5fclose_f(file , error)
-  CALL check("h5fclose_f",error, total_error)
-
-  !
-  ! Now we begin the read section of this example.
-  !
-  !
-  ! Open file and dataset.
-  !
-  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
-  CALL check("h5fopen_f",error, total_error)
-  CALL h5dopen_f(file, dataset, dset, error)
-  CALL check("h5dopen_f",error, total_error)
-  !
-  ! Get the datatype.
-  !
-  CALL H5Dget_type_f(dset, filetype, error)
-  CALL check("H5Dget_type_f",error, total_error)
-  !
-  ! Get dataspace and allocate memory for read buffer.
-  !
-  CALL H5Dget_space_f(dset, space, error)
-  CALL check("H5Dget_space_f",error, total_error)
-  CALL H5Sget_simple_extent_dims_f(space, dims, maxdims, error) 
-  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
-  CALL VERIFY("H5Sget_simple_extent_dims_f", INT(dims(1)), INT(dim0), total_error)
-
-  ALLOCATE(rdata(1:dims(1)))
-
-  !
-  ! Read the data.
-  !
-  CALL h5dread_vl_f(dset, filetype, rdata, data_dims, str_len, error, space)
-  CALL check("H5Dread_vl_f",error, total_error)
-
-  !
-  ! Output the data to the screen.
-  !
-  DO i = 1, dims(1)
-     CALL verifystring("h5dopen_f",TRIM(rdata(i)),TRIM(wdata(i)) , total_error)
-  END DO
-
-  DEALLOCATE(rdata)
-  CALL h5dclose_f(dset, error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL h5sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  CALL H5Tclose_f(filetype, error)
-  CALL check("h5tclose_f",error, total_error)
-  CALL h5fclose_f(file , error)
-  CALL check("h5fclose_f",error, total_error)
-
-END SUBROUTINE t_vlstring
-
-SUBROUTINE t_vlstring_readwrite(total_error)
-
-! test writing and reading vl string using h5dread_f and h5dwrite_f, C_LOC and C_F_POINTER
-
-  USE HDF5
-  USE TH5_MISC
-  USE ISO_C_BINDING
-
-  IMPLICIT NONE
-
-  INTEGER, INTENT(INOUT) :: total_error
-
-  CHARACTER(LEN=19), PARAMETER :: filename  = "t_vlstringrw_F03.h5"
-  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
-  CHARACTER(LEN=3) , PARAMETER :: dataset2D = "DS2"
-
-  INTEGER(HSIZE_T) , PARAMETER :: dim0 = 4
-  INTEGER(HSIZE_T) , PARAMETER :: dim1 = 2
-  INTEGER(HID_T)               :: file, filetype, space, dset ! Handles
-  INTEGER(HSIZE_T), DIMENSION(1:1) :: dims = (/dim0/)
-  INTEGER(HSIZE_T), DIMENSION(1:2) :: dims2D = (/dim1,dim0/)
-  INTEGER(HSIZE_T), DIMENSION(1:2) :: maxdims
-  
-  TYPE(C_PTR), DIMENSION(1:dim0), TARGET :: wdata
-  CHARACTER(len=7, KIND=c_char), DIMENSION(1:1), TARGET :: A = "123456"//C_NULL_CHAR
-  CHARACTER(len=5, KIND=c_char), DIMENSION(1:1), TARGET :: B = "7890"//C_NULL_CHAR
-  CHARACTER(len=4, KIND=c_char), DIMENSION(1:1), TARGET :: C = "abc"//C_NULL_CHAR
-  CHARACTER(len=3, KIND=c_char), DIMENSION(1:1), TARGET :: D = "df"//C_NULL_CHAR
-
-  TYPE(C_PTR), DIMENSION(1:dim1,1:dim0), TARGET :: wdata2D
-  
-  CHARACTER(len=7, KIND=c_char), DIMENSION(1:1), TARGET :: A11 = "A(1,1)"//C_NULL_CHAR
-  CHARACTER(len=4, KIND=c_char), DIMENSION(1:1), TARGET :: A12 = "A12"//C_NULL_CHAR
-  CHARACTER(len=5, KIND=c_char), DIMENSION(1:1), TARGET :: A13 = "A_13"//C_NULL_CHAR
-  CHARACTER(len=8, KIND=c_char), DIMENSION(1:1), TARGET :: A14 = "A_{1,4}"//C_NULL_CHAR
-  CHARACTER(len=8, KIND=c_char), DIMENSION(1:1), TARGET :: A21 = "A_{2,1}"//C_NULL_CHAR
-  CHARACTER(len=5, KIND=c_char), DIMENSION(1:1), TARGET :: A22 = "A_22"//C_NULL_CHAR
-  CHARACTER(len=4, KIND=c_char), DIMENSION(1:1), TARGET :: A23 = "A23"//C_NULL_CHAR
-  CHARACTER(len=7, KIND=c_char), DIMENSION(1:1), TARGET :: A24 = "A(2,4)"//C_NULL_CHAR
-
-  TYPE(C_PTR), DIMENSION(:), ALLOCATABLE, TARGET :: rdata ! Read buffer
-  TYPE(C_PTR), DIMENSION(:,:), ALLOCATABLE, TARGET :: rdata2D ! Read 2D buffer
-  CHARACTER(len=8, kind=c_char), POINTER :: data ! A pointer to a Fortran string
-  CHARACTER(len=8, kind=c_char), DIMENSION(1:4) :: data_w ! A pointer to a Fortran string
-  CHARACTER(len=8, kind=c_char), DIMENSION(1:dim1,1:dim0) :: data2D_w ! A pointer to a Fortran string
-  TYPE(C_PTR) :: f_ptr
-  INTEGER(hsize_t) :: i, j
-  INTEGER :: len
-  INTEGER :: error
-
-  ! Initialize array of C pointers
-
-  wdata(1) = C_LOC(A(1)(1:1))
-  wdata(2) = C_LOC(B(1)(1:1))
-  wdata(3) = C_LOC(C(1)(1:1))
-  wdata(4) = C_LOC(D(1)(1:1))
-
-  data_w(1) = A(1)
-  data_w(2) = B(1)
-  data_w(3) = C(1)
-  data_w(4) = D(1)
-
-  wdata2D(1,1) = C_LOC(A11(1)(1:1))
-  wdata2D(1,2) = C_LOC(A12(1)(1:1))
-  wdata2D(1,3) = C_LOC(A13(1)(1:1))
-  wdata2D(1,4) = C_LOC(A14(1)(1:1))
-  wdata2D(2,1) = C_LOC(A21(1)(1:1))
-  wdata2D(2,2) = C_LOC(A22(1)(1:1))
-  wdata2D(2,3) = C_LOC(A23(1)(1:1))
-  wdata2D(2,4) = C_LOC(A24(1)(1:1))
-
-  data2D_w(1,1) = A11(1)
-  data2D_w(1,2) = A12(1)
-  data2D_w(1,3) = A13(1)
-  data2D_w(1,4) = A14(1)
-  data2D_w(2,1) = A21(1)
-  data2D_w(2,2) = A22(1)
-  data2D_w(2,3) = A23(1)
-  data2D_w(2,4) = A24(1)
-
-  !
-  ! Create a new file using the default properties.
-  !
-  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
-  CALL check("h5fcreate_f",error, total_error)
-  !
-  ! Create file and memory datatypes.  For this test we will save
-  ! the strings as C variable length strings, H5T_STRING is defined
-  ! as a variable length string.
-  !
-  CALL H5Tcopy_f(H5T_STRING, filetype, error)
-  CALL check("H5Tcopy_f",error, total_error)
-  !
-  ! Create dataspace.
-  !
-  CALL h5screate_simple_f(1, dims, space, error)
-  CALL check("h5screate_simple_f",error, total_error)
-  !
-  ! Create the dataset and write the variable-length string data to
-  ! it.
-  !
-  CALL h5dcreate_f(file, dataset, filetype, space, dset, error)
-  CALL check("h5dcreate_f",error, total_error)
-
-  f_ptr = C_LOC(wdata(1))
-  CALL h5dwrite_f(dset, filetype, f_ptr, error)
-  CALL check("h5dwrite_f",error, total_error)
-
-  !
-  ! Close and release resources.
-  !
-  CALL h5dclose_f(dset , error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL h5sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-
-  !
-  ! Create dataspace.
-  !
-  CALL h5screate_simple_f(2, dims2D, space, error)
-  CALL check("h5screate_simple_f",error, total_error)
-  !
-  ! Create the dataset and write the variable-length string data to
-  ! it.
-  !
-  CALL h5dcreate_f(file, dataset2D, filetype, space, dset, error)
-  CALL check("h5dcreate_f",error, total_error)
-
-  f_ptr = C_LOC(wdata2D(1,1))
-  CALL h5dwrite_f(dset, filetype, f_ptr, error)
-  CALL check("h5dwrite_f",error, total_error)
-
-  !
-  ! Close and release resources.
-  !
-  CALL h5dclose_f(dset , error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL h5sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-
-  CALL H5Tclose_f(filetype, error)
-  CALL check("h5tclose_f",error, total_error)
-  CALL h5fclose_f(file , error)
-  CALL check("h5fclose_f",error, total_error)
-
-  !
-  ! Now we begin the read section of this test.
-  !
-  !
-  ! Open file and dataset.
-  !
-  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
-  CALL check("h5fopen_f",error, total_error)
-  CALL h5dopen_f(file, dataset, dset, error)
-  CALL check("h5dopen_f",error, total_error)
-  !
-  ! Get the datatype.
-  !
-  CALL H5Dget_type_f(dset, filetype, error)
-  CALL check("H5Dget_type_f",error, total_error)
-  !
-  ! Get dataspace and allocate memory for read buffer.
-  !
-  CALL H5Dget_space_f(dset, space, error)
-  CALL check("H5Dget_space_f",error, total_error)
-
-  CALL H5Sget_simple_extent_dims_f(space, dims, maxdims, error) 
-  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
-  ALLOCATE(rdata(1:dims(1)))
-  !
-  ! Read the data.
-  !
-  
-  f_ptr = C_LOC(rdata(1))
-  CALL h5dread_f(dset, H5T_STRING, f_ptr, error)
-  CALL check("H5Dread_f",error, total_error)
-
-  !
-  ! Check the data.
-  !
-  DO i = 1, dims(1)
-     CALL C_F_POINTER(rdata(i), data)
-     len = 0
-     DO
-        IF(DATA(len+1:len+1).EQ.C_NULL_CHAR.OR.len.GE.8) EXIT
-        len = len + 1
-     ENDDO
-     CALL verifystring("h5dread_f",data(1:len), data_w(i)(1:len), total_error)
-  END DO
-
-  DEALLOCATE(rdata)
-  CALL h5dclose_f(dset , error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL h5sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  !
-  ! Test reading in 2D dataset
-  !
-  CALL h5dopen_f(file, dataset2D, dset, error)
-  CALL check("h5dopen_f",error, total_error)
-  !
-  ! Get the datatype.
-  !
-  CALL H5Dget_type_f(dset, filetype, error)
-  CALL check("H5Dget_type_f",error, total_error)
-  !
-  ! Get dataspace and allocate memory for read buffer.
-  !
-  CALL H5Dget_space_f(dset, space, error)
-  CALL check("H5Dget_space_f",error, total_error)
-
-
-  CALL H5Sget_simple_extent_dims_f(space, dims2D, maxdims, error) 
-  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
-  ALLOCATE(rdata2D(1:dims2D(1),1:dims2D(2)))
-
-  !
-  ! Read the data.
-  !
-  
-  f_ptr = C_LOC(rdata2D(1,1))
-  CALL h5dread_f(dset, H5T_STRING, f_ptr, error)
-  CALL check("H5Dread_f",error, total_error)
-
-  !
-  ! Check the data.
-  !
-  DO i = 1, dims2D(1)
-     DO j = 1, dims2D(2)
-        CALL C_F_POINTER(rdata2D(i,j), DATA)
-        len = 0
-        DO
-           IF(DATA(len+1:len+1).EQ.C_NULL_CHAR.OR.len.GE.8) EXIT
-           len = len + 1
-        ENDDO
-        CALL verifystring("h5dread_f",DATA(1:len), data2D_w(i,j)(1:len), total_error)
-     ENDDO
-  END DO
-
-  DEALLOCATE(rdata2D)
-  CALL h5dclose_f(dset , error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL h5sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-
-  CALL H5Tclose_f(filetype, error)
-  CALL check("h5tclose_f",error, total_error)
-  CALL h5fclose_f(file , error)
-  CALL check("h5fclose_f",error, total_error)
-
-END SUBROUTINE t_vlstring_readwrite
-
-
-SUBROUTINE t_string(total_error)
-
-  USE HDF5
-  USE TH5_MISC
-  USE ISO_C_BINDING
-
-  IMPLICIT NONE
-
-  INTEGER, INTENT(INOUT) :: total_error
-
-  CHARACTER(LEN=20), PARAMETER :: filename  = "t_string_F03.h5"
-  CHARACTER(LEN=3) , PARAMETER :: dataset   = "DS1"
-  INTEGER          , PARAMETER :: dim0      = 4
-  INTEGER(SIZE_T)  , PARAMETER :: sdim      = 8
-
-  INTEGER(HID_T)  :: file, filetype, memtype, space, dset ! Handles
-  INTEGER :: error
-
-  INTEGER(HSIZE_T), DIMENSION(1:1) :: dims = (/dim0/)
-  INTEGER(HSIZE_T), DIMENSION(1:1) :: maxdims
-
-  CHARACTER(LEN=sdim), DIMENSION(1:dim0), TARGET :: &
-       wdata = (/"Parting", "is such", "sweet  ", "sorrow."/)
-  CHARACTER(LEN=sdim), DIMENSION(:), ALLOCATABLE, TARGET :: rdata
-  INTEGER(hsize_t) :: i
-  INTEGER(SIZE_T) :: size
-  TYPE(C_PTR) :: f_ptr
-  !
-  ! Create a new file using the default properties.
-  !
-  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
-  CALL check("h5fcreate_f",error, total_error)
-  !
-  ! Create file datatypes.  For this example we will save
-  ! the strings as FORTRAN strings
-  !
-  CALL H5Tcopy_f(H5T_FORTRAN_S1, filetype, error)
-  CALL check("H5Tcopy_f",error, total_error)
-  CALL H5Tset_size_f(filetype, sdim, error)
-  CALL check("H5Tset_size_f",error, total_error)
-  !
-  ! Create dataspace.
-  !
-  CALL h5screate_simple_f(1, dims, space, error)
-  CALL check("h5screate_simple_f",error, total_error)
-  !
-  ! Create the dataset and write the string data to it.
-  !
-  CALL h5dcreate_f(file, dataset, filetype, space, dset, error)
-  CALL check("h5dcreate_f",error, total_error)
-
-  f_ptr = C_LOC(wdata(1)(1:1))
-  CALL H5Dwrite_f(dset, filetype, f_ptr, error)
-  CALL check("H5Dwrite_f",error, total_error)
-  !
-  ! Close and release resources.
-  !
-  CALL h5dclose_f(dset , error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL h5sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  CALL H5Tclose_f(filetype, error)
-  CALL check("h5tclose_f",error, total_error)
-  CALL h5fclose_f(file , error)
-  CALL check("h5fclose_f",error, total_error)
-  !
-  ! Now we begin the read section of this example.
-  !
-  ! Open file and dataset.
-  !
-  CALL h5fopen_f(filename, H5F_ACC_RDONLY_F, file, error)
-  CALL check("h5fopen_f",error, total_error)
-  CALL h5dopen_f(file, dataset, dset, error)
-  CALL check("h5dopen_f",error, total_error)
-  !
-  ! Get the datatype and its size.
-  !
-  CALL H5Dget_type_f(dset, filetype, error)
-  CALL check("H5Dget_type_f",error, total_error)
-  CALL H5Tget_size_f(filetype, size, error)
-  CALL check("H5Tget_size_f",error, total_error)
-  CALL VERIFY("H5Tget_size_f", INT(size), INT(sdim), total_error)
-  !
-  ! Get dataspace.
-  !
-  CALL H5Dget_space_f(dset, space, error)
-  CALL check("H5Dget_space_f",error, total_error)
-  CALL H5Sget_simple_extent_dims_f(space, dims, maxdims, error) 
-  CALL check("H5Sget_simple_extent_dims_f",error, total_error)
-  CALL VERIFY("H5Sget_simple_extent_dims_f", INT(dims(1)), dim0, total_error)
-
-  ALLOCATE(rdata(1:dims(1)))
-  !
-  ! Create the memory datatype.
-  !
-  CALL H5Tcopy_f(H5T_FORTRAN_S1, memtype, error) 
-  CALL check("H5Tcopy_f",error, total_error)
-  CALL H5Tset_size_f(memtype, sdim, error) 
-  CALL check("H5Tset_size_f",error, total_error)
-  !
-  ! Read the data.
-  !
-  f_ptr = C_LOC(rdata(1)(1:1))
-  CALL H5Dread_f(dset, memtype, f_ptr, error, space)
-  CALL check("H5Dread_f",error, total_error)
-
-  DO i = 1, dims(1)
-     CALL verifystring("h5dread_f",TRIM(rdata(i)),TRIM(wdata(i)) , total_error)
-  END DO
-
-  DEALLOCATE(rdata)
-
-  !
-  ! Close and release resources.
-  !
-  CALL H5Dclose_f(dset, error)
-  CALL check("h5dclose_f",error, total_error)
-  CALL H5Sclose_f(space, error)
-  CALL check("h5sclose_f",error, total_error)
-  CALL H5Tclose_f(memtype, error)
-  CALL check("h5tclose_f",error, total_error)
-  CALL H5Fclose_f(file, error)
-  CALL check("h5fclose_f",error, total_error)
-
-
-END SUBROUTINE t_string
-
-SUBROUTINE vl_test_special_char(total_error)
-  
-  USE HDF5
-  USE TH5_MISC
-  IMPLICIT NONE
-  
-!  INTERFACE
-!     SUBROUTINE setup_buffer(data_in, line_lengths, char_type)
-!       USE HDF5
-!       USE ISO_C_BINDING
-!     IMPLICIT NONE
-!       CHARACTER(len=*), DIMENSION(:) :: data_in
-!       INTEGER(size_t), DIMENSION(:) :: line_lengths
-!       CHARACTER(KIND=C_CHAR,LEN=*) :: char_type
-!     END SUBROUTINE setup_buffer
-!  END INTERFACE
-  
-  INTEGER, INTENT(OUT) :: total_error
-  
-  CHARACTER(LEN=16), PARAMETER :: filename  = "t_controlchar.h5"
-  INTEGER, PARAMETER :: line_length = 10
-  INTEGER(hid_t) :: file
-  INTEGER(hid_t) :: dataset0
-  CHARACTER(len=line_length), DIMENSION(1:100) :: data_in
-  CHARACTER(len=line_length), DIMENSION(1:100) :: data_out
-  INTEGER(size_t), DIMENSION(1:100) :: line_lengths
-  INTEGER(hid_t) :: string_id, space, dcpl
-  INTEGER(hsize_t), DIMENSION(1:1) :: dims = (/0/)
-  INTEGER(hsize_t), DIMENSION(1:1) :: max_dims = (/0/)
-  INTEGER(hsize_t), DIMENSION(1:2) :: data_dims = (/0,0/)
-  INTEGER(hsize_t), DIMENSION(1:1) :: chunk =(/10/)
-  INTEGER, PARAMETER :: ncontrolchar = 7
-  CHARACTER(KIND=C_CHAR,LEN=1), DIMENSION(1:ncontrolchar) :: controlchar = &
-       (/C_ALERT, C_BACKSPACE,C_CARRIAGE_RETURN, C_FORM_FEED,C_HORIZONTAL_TAB,C_VERTICAL_TAB, C_NEW_LINE/)
-  INTEGER :: i, j, n, error
-  n = 8
-  !
-  ! Create a new file using the default properties.
-  !
-  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file, error)
-  CALL check("h5fcreate_f",error, total_error)
- 
-  max_dims = (/H5S_UNLIMITED_F/)
-
-  !
-  ! Create the memory datatype.
-  !
-  CALL h5tcopy_f(h5t_string, string_id, error)
-  CALL check("h5tcopy_f", error, total_error)
-  CALL h5tset_strpad_f(string_id, h5t_str_nullpad_f, error)
-  CALL check("h5tset_strpad_f", error, total_error)
-  dims(1) = n
-  !
-  ! Create dataspace.
-  !
-  CALL h5screate_simple_f(1, dims, space, error, max_dims)
-  CALL check("h5screate_simple_f", error, total_error)
-  CALL h5pcreate_f(h5p_dataset_create_f, dcpl, error)
-  CALL check("h5pcreate_f", error, total_error)
-  CALL h5pset_chunk_f(dcpl, 1, chunk, error)
-  CALL check("h5pset_chunk_f", error, total_error)
-  
-  data_dims(1) = line_length
-  data_dims(2) = n
-  !
-  ! Create data with strings containing various control characters.
-  !
-  DO i = 1, ncontrolchar
-     !
-     ! Create the dataset, for the string with control character and write the string data to it.
-     !
-     CALL h5dcreate_f(file, controlchar(i), string_id, space, dataset0, error, dcpl)
-     CALL check("h5dcreate_f", error, total_error)
-     CALL setup_buffer(data_in(1:n), line_lengths, controlchar(i))
-     CALL h5dwrite_vl_f(dataset0, string_id, data_in(1:n), data_dims, line_lengths(1:n), error, space)
-     CALL check("h5dwrite_vl_f", error, total_error)
-     !
-     ! Read the string back.
-     !
-     CALL h5dread_vl_f(dataset0, string_id, data_out(1:n), data_dims, line_lengths(1:n), error, space)
-     CALL check("h5dread_vl_f", error, total_error)
-  
-     DO j = 1, n
-        IF(data_in(j).NE.data_out(j))THEN
-           total_error = total_error + 1
-           EXIT
-        ENDIF
-     ENDDO
-
-     CALL h5dclose_f(dataset0, error)
-     CALL check("h5dclose_f", error, total_error)
-  ENDDO
-
-  CALL h5pclose_f(dcpl, error)
-  CALL check("h5pclose_f", error, total_error)
-  CALL h5sclose_f(space, error)
-  CALL check("h5sclose_f", error, total_error)
-  CALL h5fclose_f(file, error)
-  CALL check("h5fclose_f", error, total_error)
-  
-END SUBROUTINE vl_test_special_char
-
-
-SUBROUTINE setup_buffer(data_in, line_lengths, char_type)
-  
-  USE HDF5
-  USE ISO_C_BINDING
-  
-  IMPLICIT NONE
-  
-  ! Creates a simple "Data_in" consisting of the letters of the alphabet,
-  ! one per line, with a control character.
-  
-  CHARACTER(len=10), DIMENSION(:) :: data_in
-  INTEGER(size_t), DIMENSION(:) :: line_lengths
-  INTEGER, DIMENSION(1:3) :: letters
-  CHARACTER(LEN=3) :: lets
-  CHARACTER(KIND=C_CHAR,LEN=*) :: char_type
-  CHARACTER(KIND=C_CHAR,LEN=1) :: char_tmp
-  INTEGER :: i, j, n, ff
-
-  ! Convert the letters and special character to integers    
-  lets = 'abc'
-  
-  READ(lets,'(3A1)') letters
-  READ(char_type,'(A1)') ff
-  n = SIZE(data_in)
-  j = 1
-  DO i=1,n-1
-     IF( j .EQ. 4 )THEN
-        WRITE(char_tmp,'(A1)') ff
-        data_in(i:i) = char_tmp
-     ELSE
-        WRITE(char_tmp,'(A1)') letters(j)
-        data_in(i:i) = char_tmp
-     ENDIF
-     line_lengths(i) = LEN_TRIM(data_in(i))
-     j = j + 1
-     IF( j .EQ. 5 ) j = 1
-  END DO
-  WRITE(char_tmp,'(A1)') ff
-  data_in(n:n) =  char_tmp
-  line_lengths(n) = 1
-  
-END SUBROUTINE setup_buffer
-
-!-------------------------------------------------------------------------
-! Function:    test_nbit
-!
-! Purpose:     Tests (real, 4 byte) datatype for nbit filter
-!
-! Return:      Success:        0
-!              Failure:        >0
-!
-! Programmer:  M. Scot Breitenfeld
-!              Decemeber 7, 2010
-!
-! Modifications: Moved this subroutine from the 1.8 test file and
-! modified it to use F2003 features. 
-! This routine requires 4 byte reals, so we use F2003 features to 
-! ensure the requirement is satisfied in a portable way. 
-! The need for this arises when a user specifies the default real is 8 bytes.
-! MSB 7/31/12
-!
-!-------------------------------------------------------------------------
-!
-
-SUBROUTINE test_nbit(total_error )
-
-  USE HDF5
-  USE TH5_MISC
-  USE ISO_C_BINDING
-
-  IMPLICIT NONE
-  INTEGER, PARAMETER :: wp = SELECTED_REAL_KIND(Fortran_REAL_4) !should map to REAL*4 on most modern processors
-  INTEGER, INTENT(INOUT) :: total_error
-  INTEGER(hid_t) :: file
-  
-  INTEGER(hid_t) :: dataset, datatype, space, dc, mem_type_id
-  INTEGER(hsize_t), DIMENSION(1:2) :: dims = (/2,5/)
-  INTEGER(hsize_t), DIMENSION(1:2) :: chunk_dim = (/2,5/)
-  ! orig_data[] are initialized to be within the range that can be represented by
-  ! dataset datatype (no precision loss during datatype conversion)
-  !
-  REAL(kind=wp), DIMENSION(1:2,1:5), TARGET :: orig_data = &
-       RESHAPE( (/188384.00, 19.103516, -1.0831790e9, -84.242188, &
-       5.2045898, -49140.000, 2350.2500, -3.2110596e-1, 6.4998865e-5, -0.0000000/) , (/2,5/) )
-  REAL(kind=wp), DIMENSION(1:2,1:5), TARGET :: new_data
-  INTEGER(size_t) :: PRECISION, offset
-  INTEGER :: error
-  LOGICAL :: status
-  INTEGER(hsize_t) :: i, j
-  TYPE(C_PTR) :: f_ptr
-
-  ! check to see if filter is available
-  CALL H5Zfilter_avail_f(H5Z_FILTER_NBIT_F, status, error)
-  IF(.NOT.status)THEN ! We don't have H5Z_FILTER_NBIT_F filter
-     total_error = -1     ! so return
-     RETURN
-  ENDIF
-
-  CALL H5Fcreate_f("nbit.h5", H5F_ACC_TRUNC_F, file, error)
-  CALL check("H5Fcreate_f", error, total_error)
-
-  ! Define dataset datatype (integer), and set precision, offset
-  CALL H5Tcopy_f(H5T_IEEE_F32BE, datatype, error)
-  CALL CHECK(" H5Tcopy_f", error, total_error)
-  CALL H5Tset_fields_f(datatype, 26_size_t, 20_size_t, 6_size_t, 7_size_t, 13_size_t, error)
-  CALL CHECK(" H5Tset_fields_f", error, total_error)
-  offset = 7
-  CALL H5Tset_offset_f(datatype, offset, error)
-  CALL CHECK(" H5Tset_offset_f", error, total_error)
-  PRECISION = 20
-  CALL H5Tset_precision_f(datatype,PRECISION, error)
-  CALL CHECK(" H5Tset_precision_f", error, total_error)
-  
-  CALL H5Tset_size_f(datatype, 4_size_t, error)
-  CALL CHECK(" H5Tset_size_f", error, total_error)
-  
-  CALL H5Tset_ebias_f(datatype, 31_size_t, error)
-  CALL CHECK(" H5Tset_ebias_f", error, total_error)
- 
-  ! Create the data space 
-  CALL H5Screate_simple_f(2, dims, space, error)
-  CALL CHECK(" H5Screate_simple_f", error, total_error)
-
-  ! USE nbit filter
-  CALL H5Pcreate_f(H5P_DATASET_CREATE_F, dc, error)
-  CALL CHECK(" H5Pcreate_f", error, total_error)
-
-  CALL H5Pset_chunk_f(dc, 2, chunk_dim, error)
-  CALL CHECK(" H5Pset_chunk_f", error, total_error)
-  CALL H5Pset_nbit_f(dc, error)
-  CALL CHECK(" H5Pset_nbit_f", error, total_error)
-
-  ! Create the dataset
-  CALL  H5Dcreate_f(file, "nbit_real", datatype, &
-       space, dataset, error, dc)
-  CALL CHECK(" H5Dcreate_f", error, total_error)
-
-  !----------------------------------------------------------------------
-  ! STEP 1: Test nbit by setting up a chunked dataset and writing
-  ! to it.
-  !----------------------------------------------------------------------
-  !
-  mem_type_id = h5kind_to_type(wp,H5_REAL_KIND)
-
-  f_ptr = C_LOC(orig_data(1,1))
-  CALL H5Dwrite_f(dataset, mem_type_id, f_ptr, error)
-  CALL CHECK(" H5Dwrite_f", error, total_error)
-
-  !----------------------------------------------------------------------
-  ! STEP 2: Try to read the data we just wrote.
-  !----------------------------------------------------------------------
-  !  
-  f_ptr = C_LOC(new_data(1,1))
-  CALL H5Dread_f(dataset, mem_type_id, f_ptr, error)
-  CALL CHECK(" H5Dread_f", error, total_error)
-
-  ! Check that the values read are the same as the values written
-  ! Assume size of long long = size of double
-  !
-  i_loop: DO i = 1, dims(1)
-     j_loop: DO j = 1, dims(2)
-        IF(.NOT.(orig_data(i,j).EQ.orig_data(i,j))) CYCLE  ! skip IF value is NaN
-        IF( .NOT.dreal_eq( REAL(new_data(i,j),dp), REAL( orig_data(i,j), dp)) ) THEN
-           total_error = total_error + 1
-           WRITE(*,'("    Read different values than written.")')
-           WRITE(*,'("    At index ", 2(1X,I0))') i, j
-           EXIT i_loop
-        END IF
-     ENDDO j_loop
-  ENDDO i_loop
-
-  !----------------------------------------------------------------------
-  ! Cleanup
-  !----------------------------------------------------------------------
-  !
-  CALL H5Tclose_f(datatype, error)
-  CALL CHECK(" H5Tclose_f", error, total_error)
-  CALL H5Pclose_f(dc, error)
-  CALL CHECK(" H5Pclose_f", error, total_error)
-  CALL H5Sclose_f(space, error)
-  CALL CHECK(" H5Sclose_f", error, total_error)
-  CALL H5Dclose_f(dataset, error)
-  CALL CHECK(" H5Dclose_f", error, total_error)
-  CALL H5Fclose_f(file, error)
-  CALL CHECK(" H5Fclose_f", error, total_error)
-
-END SUBROUTINE test_nbit
-
-
-SUBROUTINE t_enum_conv(total_error)
-
-!-------------------------------------------------------------------------
-! Subroutine: t_enum_conv
-!
-! Purpose: Tests converting data from enumeration datatype
-!          to numeric (integer or floating-point number)
-!          datatype. Tests various KINDs of INTEGERs
-!          and REALs. Checks reading enum data into
-!          INTEGER and REAL KINDs.
-!
-! Return: Success:	0
-!	  Failure:	number of errors
-!
-! Programmer:  M. Scot Breitenfeld
-!              October 27, 2012
-!
-! Note:        Adapted from C test (enum.c -- test_conv)
-!              No reliance on C tests.
-!-------------------------------------------------------------------------
-!
-  USE HDF5
-  USE TH5_MISC
-  USE ISO_C_BINDING
-
-  IMPLICIT NONE
-
-  INTEGER, INTENT(INOUT) :: total_error
-
-  INTEGER, PARAMETER :: int_kind_8 = SELECTED_INT_KIND(Fortran_INTEGER_4) !should map to INTEGER*4 on most modern processors
-  INTEGER, PARAMETER :: int_kind_16 = SELECTED_INT_KIND(Fortran_INTEGER_8)!should map to INTEGER*8 on most modern processors
-  
-  INTEGER, PARAMETER :: real_kind_7 = SELECTED_REAL_KIND(Fortran_REAL_4)  !should map to REAL*4 on most modern processors
-
-  INTEGER(hid_t) :: cwg=-1, dtype=-1, space=-1, dset=-1 ! Handles
-  INTEGER(hid_t) :: file ! Handles
-
-  ! Enumerated type
-  ENUM, BIND(C)
-    ENUMERATOR :: E1_RED, E1_GREEN, E1_BLUE, E1_WHITE, E1_BLACK
-  END ENUM
-
-  INTEGER(KIND(E1_RED)), TARGET :: val
-
-  ! Enumerated data array 
-  ! Some values are out of range for testing. The library should accept them
-  INTEGER(KIND(E1_RED)), DIMENSION(1:20), TARGET :: data1 = (/INT(E1_RED,KIND(E1_RED)), &
-       INT(E1_GREEN,KIND(E1_RED)), INT(E1_BLUE,KIND(E1_RED)),  &
-       INT(E1_GREEN,KIND(E1_RED)), INT(E1_WHITE,KIND(E1_RED)), &
-       INT(E1_WHITE,KIND(E1_RED)), INT(E1_BLACK,KIND(E1_RED)), &
-       INT(E1_GREEN,KIND(E1_RED)), INT(E1_BLUE,KIND(E1_RED)), &
-       INT(E1_RED,KIND(E1_RED)), INT(E1_RED,KIND(E1_RED)), INT(E1_BLUE,KIND(E1_RED)), &
-       INT(E1_GREEN,KIND(E1_RED)), INT(E1_BLACK,KIND(E1_RED)), INT(E1_WHITE,KIND(E1_RED)),&
-       INT(E1_RED,KIND(E1_RED)), INT(E1_WHITE,KIND(E1_RED)), &
-       INT(0,KIND(E1_RED)), INT(-1,KIND(E1_RED)), INT(-2,KIND(E1_RED))/)
-
-  ! Reading array for enum data
-  INTEGER(KIND(E1_RED)), DIMENSION(1:20), TARGET :: data2
-
-  ! Reading array's for converted enum data
-  INTEGER(C_SHORT), DIMENSION(1:20), TARGET :: data_short
-  INTEGER(C_INT), DIMENSION(1:20), TARGET :: data_int
-  REAL(C_DOUBLE), DIMENSION(1:20), TARGET :: data_double
-
-  INTEGER(int_kind_8), DIMENSION(1:20), TARGET :: data_i8
-  INTEGER(int_kind_16), DIMENSION(1:20), TARGET :: data_i16
-  REAL(real_kind_7), DIMENSION(1:20), TARGET :: data_r7
-
-  INTEGER(hsize_t), DIMENSION(1:1) :: ds_size = (/20/)
-  INTEGER(size_t) :: i
-  INTEGER(hsize_t) :: ih
-  INTEGER :: error
-  TYPE(C_PTR) :: f_ptr
-  INTEGER(HID_T) :: m_baset  ! Memory base type
-  !
-  ! Create a new file using the default properties.
-  !
-  CALL h5fcreate_f("enum1.h5", H5F_ACC_TRUNC_F, file, error)
-  CALL check("h5fcreate_f", error, total_error)
-  !
-  ! Create a new group using the default properties.
-  !
-  CALL h5gcreate_f(file, "test_conv", cwg, error)
-  CALL check("h5gcreate_f",error, total_error)
-  !
-  ! Create a enum type
-  !
-  CALL H5Tcreate_f(H5T_ENUM_F, H5OFFSETOF(C_LOC(data1(1)), C_LOC(data1(2))), dtype, error)
-  CALL check("h5tcreate_f",error, total_error)
-  !
-  ! Initialize enum data.
-  !
-  val = E1_RED
-  CALL H5Tenum_insert_f(dtype, "RED", C_LOC(val), error)
-  CALL check("h5tenum_insert_f",error, total_error)
-  val = E1_GREEN
-  CALL H5Tenum_insert_f(dtype, "GREEN", C_LOC(val), error)
-  CALL check("h5tenum_insert_f",error, total_error)
-  val = E1_BLUE
-  CALL H5Tenum_insert_f(dtype, "BLUE", C_LOC(val), error)
-  CALL check("h5tenum_insert_f",error, total_error)
-  val = E1_WHITE
-  CALL H5Tenum_insert_f(dtype, "WHITE", C_LOC(val), error)
-  CALL check("h5tenum_insert_f",error, total_error)
-  val = E1_BLACK
-  CALL H5Tenum_insert_f(dtype, "BLACK", C_LOC(val), error)
-  CALL check("h5tenum_insert_f",error, total_error)
-  !
-  ! Create dataspace.  Setting maximum size to be the current size.
-  !
-  CALL h5screate_simple_f(1, ds_size, space, error)
-  CALL check("h5screate_simple_f", error, total_error)
-
-  ! ***************************************
-  ! * Dataset of enumeration type
-  ! ***************************************
-  !
-  ! Create a dataset of enum type and write enum data to it
-
-  CALL h5dcreate_f(cwg, "color_table1", dtype, space, dset, error)
-  CALL check("h5dcreate_f", error, total_error)
-
-  f_ptr = C_LOC(data1(1))
-  CALL h5dwrite_f(dset, dtype, f_ptr, error, space, space)
-  CALL check(" h5dwrite_f", error, total_error)
-
-  ! Test reading back the data with no conversion
-
-  f_ptr = C_LOC(data2(1))
-  CALL h5dread_f(dset, dtype, f_ptr, error, space, space)
-  CALL check(" h5dread_f", error, total_error)
-
-  ! Check values
-  DO ih = 1, ds_size(1)
-     IF(data1(ih) .NE. data2(ih))THEN
-        total_error = total_error + 1
-        WRITE(*,'("    1. data1(",I0,")=",I0," .NE. data2(",I0,")=",I0)') ih, data1(ih),i,data2(ih)
-        EXIT
-     ENDIF
-  ENDDO
-
-  ! Test converting the data to integer (KIND=C_SHORT). Read enum data back as integer
-  m_baset = h5kind_to_type(KIND(data_short(1)), H5_INTEGER_KIND) ! Memory base type
-  f_ptr = C_LOC(data_short(1))
-  CALL h5dread_f(dset, m_baset, f_ptr, error, space, space)
-  CALL check("h5dread_f", error, total_error)
-  ! Check values
-  DO ih = 1, ds_size(1)
-     IF(data1(ih) .NE. data_short(ih))THEN
-        total_error = total_error + 1
-        WRITE(*,'("    2. data1(",I0,")=",I0," .NE. data_short(",I0,")=",I0)') ih, data1(ih),i,data_short(ih)
-        EXIT
-     ENDIF
-  ENDDO
-
-  ! Test converting the data to (KIND=C_double) number. 
-  ! Read enum data back as (KIND=C_double) number
-
-  m_baset = h5kind_to_type(KIND(data_double(1)), H5_REAL_KIND) ! Memory base type
-  f_ptr = C_LOC(data_double(1))
-  CALL h5dread_f(dset,  m_baset, f_ptr, error, space, space)
-  CALL check("h5dread_f", error, total_error)
-  ! Check values
-  DO ih = 1, ds_size(1)
-     IF(data1(ih) .NE. INT(data_double(ih)))THEN
-        total_error = total_error + 1
-        WRITE(*,'("    3. data_double(",I0,")=",I0," .NE. data_double(",I0,")=",I0)') &
-             ih, INT(data1(ih)), ih, INT(data_double(ih))
-        EXIT
-     ENDIF
-  ENDDO
-
-  ! Test converting the data to (SELECTED_INT_KIND(Fortran_INTEGER_4)) number. 
-  ! Read enum data back as (SELECTED_INT_KIND(Fortran_INTEGER_4)) number
-
-  m_baset = h5kind_to_type(int_kind_8, H5_INTEGER_KIND) ! Memory base type
-  f_ptr = C_LOC(data_i8(1))
-  CALL h5dread_f(dset,  m_baset, f_ptr, error, space, space)
-  CALL check("h5dread_f", error, total_error)
-  ! Check values
-  DO ih = 1, ds_size(1)
-     IF(data1(ih) .NE. INT(data_i8(ih)))THEN
-        total_error = total_error + 1
-        WRITE(*,'("    4. data_i8(",I0,")=",I0," .NE. data_i8(",I0,")=",I0)') &
-             ih, INT(data1(ih)), i, INT(data_i8(ih))
-        EXIT
-     ENDIF
-  ENDDO
-
-  ! Test converting the data to (SELECTED_INT_KIND(Fortran_INTEGER_8)) number. 
-  ! Read enum data back as (SELECTED_INT_KIND(Fortran_INTEGER_8)) number
-
-  m_baset = h5kind_to_type(int_kind_16, H5_INTEGER_KIND) ! Memory base type
-  f_ptr = C_LOC(data_i16(1))
-  CALL h5dread_f(dset,  m_baset, f_ptr, error, space, space)
-  CALL check("h5dread_f", error, total_error)
-  ! Check values
-  DO ih = 1, ds_size(1)
-     IF(data1(ih) .NE. INT(data_i16(ih)))THEN
-        total_error = total_error + 1
-        WRITE(*,'("    5. data_i16(",I0,")=",I0," .NE. data_i16(",I0,")=",I0)') &
-             ih, INT(data1(ih)), i, INT(data_i16(ih))
-        EXIT
-     ENDIF
-  ENDDO
-
-  ! Test converting the data to  SELECTED_REAL_KIND(Fortran_REAL_4) number. 
-  ! Read enum data back as  SELECTED_REAL_KIND(Fortran_REAL_4) number
-
-  m_baset = h5kind_to_type(KIND(data_r7(1)), H5_REAL_KIND) ! Memory base type
-  f_ptr = C_LOC(data_r7(1))
-  CALL h5dread_f(dset,  m_baset, f_ptr, error, space, space)
-  CALL check("h5dread_f", error, total_error)
-  ! Check values
-  DO ih = 1, ds_size(1)
-     IF(data1(ih) .NE. INT(data_r7(ih)))THEN
-        total_error = total_error + 1
-        WRITE(*,'("    6. data_r7(",I0,")=",I0," .NE. data_r7(",I0,")=",I0)') &
-             ih, INT(data1(ih)), i, INT(data_r7(ih))
-        EXIT
-     ENDIF
-  ENDDO
-
-  CALL h5dclose_f(dset, error)
-  CALL check("h5dclose_f", error, total_error)
-
-  ! ***************************************
-  ! *    Dataset of C_int type
-  ! ***************************************
-
-  ! Create a integer dataset of KIND=C_INT and write enum data to it
-  m_baset = h5kind_to_type(KIND(data_int(1)), H5_INTEGER_KIND) ! Memory base type
-  CALL h5dcreate_f(cwg, "color_table2", m_baset, space, dset, error)
-  CALL check("h5dcreate_f", error, total_error)
-  
-  ! Write the enum data
-  f_ptr = C_LOC(data1(1))
-  CALL h5dwrite_f(dset, dtype, f_ptr, error, space, space)
-  CALL check("h5dwrite_f", error, total_error)
-
-  ! Test reading back the data with no conversion 
-  f_ptr = C_LOC(data_int(1))
-  CALL h5dread_f(dset, m_baset, f_ptr, error, space, space)
-  CALL check("h5dread_f", error, total_error)
-
-  DO ih = 1, ds_size(1)
-     IF(data1(ih) .NE. data_int(ih))THEN
-        total_error = total_error + 1
-        WRITE(*,'("    7. data1(",I0,")=",I0," .NE. data_int(",I0,")=",I0)') ih, data1(ih),i,data_int(ih)
-        EXIT
-     ENDIF
-  ENDDO
-  CALL h5dclose_f(dset, error)
-  CALL check("h5dclose_f", error, total_error)
-
-  !**************************************
-  !*    Dataset of C_double type
-  !**************************************
-
-  ! Create a dataset of KIND=C_DOUBLE and write enum data to it
-  m_baset = h5kind_to_type(KIND(data_double(1)), H5_REAL_KIND) ! Memory base type
-  CALL h5dcreate_f(cwg, "color_table3", m_baset, space, dset,  error)
-  CALL check("h5dcreate_f", error, total_error)
-
-  f_ptr = C_LOC(data1(1))
-  CALL h5dwrite_f(dset, dtype, f_ptr, error, space, space)
-  CALL check("h5dwrite_f", error, total_error)
-
-  ! Test reading back the data with no conversion 
-  f_ptr = C_LOC(data_double(1))
-  CALL h5dread_f(dset, m_baset, f_ptr, error, space, space)
-  CALL check("h5dread_f", error, total_error)
-
-  DO ih = 1, ds_size(1)
-     IF(data1(ih) .NE. INT(data_double(ih)))THEN
-        total_error = total_error + 1
-        WRITE(*,'("    8. data1(",I0,")=",I0," .NE. data_double(",I0,")=",I0)') ih, data1(ih),ih,INT(data_double(ih))
-        EXIT
-     ENDIF
-  ENDDO
-  CALL h5dclose_f(dset, error)
-  CALL check("h5dclose_f", error, total_error)
-
-  !*********************************************************
-  !* Dataset of real SELECTED_REAL_KIND(Fortran_REAL_4) type
-  !*********************************************************
-
-  ! Create a dataset of SELECTED_REAL_KIND(Fortran_REAL_4) and write enum data to it
-  m_baset = h5kind_to_type(KIND(data_r7(1)), H5_REAL_KIND) ! Memory base type
-  CALL h5dcreate_f(cwg, "color_table4", m_baset, space, dset,  error)
-  CALL check("h5dcreate_f", error, total_error)
-
-  f_ptr = C_LOC(data1(1))
-  CALL h5dwrite_f(dset, dtype, f_ptr, error, space, space)
-  CALL check("h5dwrite_f", error, total_error)
-
-  ! Test reading back the data with no conversion 
-  f_ptr = C_LOC(data_r7(1))
-  CALL h5dread_f(dset, m_baset, f_ptr, error, space, space)
-  CALL check("h5dread_f", error, total_error)
-
-  DO ih = 1, ds_size(1)
-     IF(data1(ih) .NE. INT(data_r7(ih)))THEN
-        total_error = total_error + 1
-        WRITE(*,'("    9. data1(",I0,")=",I0," .NE. data_r7(",I0,")=",I0)') ih, data1(ih),ih,INT(data_r7(ih))
-        EXIT
-     ENDIF
-  ENDDO
-  CALL h5dclose_f(dset, error)
-  CALL check("h5dclose_f", error, total_error)
-
-  ! *****************************************************************
-  ! * Dataset of integer SELECTED_INT_KIND(Fortran_INTEGER_8) type
-  ! *****************************************************************
-
-  ! Create a integer dataset of (SELECTED_INT_KIND(Fortran_INTEGER_8)) and write enum data to it
-  m_baset = h5kind_to_type(KIND(data_i16(1)), H5_INTEGER_KIND) ! Memory base type
-  CALL h5dcreate_f(cwg, "color_table5", m_baset, space, dset, error)
-  CALL check("h5dcreate_f", error, total_error)
-  
-  ! Write the enum data
-  f_ptr = C_LOC(data1(1))
-  CALL h5dwrite_f(dset, dtype, f_ptr, error, space, space)
-  CALL check("h5dwrite_f", error, total_error)
-
-  ! Test reading back the data with no conversion 
-  f_ptr = C_LOC(data_i16(1))
-  CALL h5dread_f(dset, m_baset, f_ptr, error, space, space)
-  CALL check("h5dread_f", error, total_error)
-
-  DO ih = 1, ds_size(1)
-     IF(data1(ih) .NE. data_i16(ih))THEN
-        total_error = total_error + 1
-        WRITE(*,'("    10. data1(",I0,")=",I0," .NE. data_i16(",I0,")=",I0)') ih, data1(ih),ih,data_i16(ih)
-        EXIT
-     ENDIF
-  ENDDO
-  CALL h5dclose_f(dset, error)
-  CALL check("h5dclose_f", error, total_error)
-
-  !
-  ! Close and release resources.
-  !
-  CALL h5sclose_f(space, error)
-  CALL check("H5Sclose_f", error, total_error)
-  CALL h5tclose_f(dtype, error)
-  CALL check("H5Tclose_f", error, total_error)
-  CALL h5gclose_f(cwg, error)
-  CALL check("h5gclose_f",error, total_error)
-  CALL h5fclose_f(file, error)
-  CALL check("H5Fclose_f", error, total_error)
-
-END SUBROUTINE t_enum_conv
-
-END MODULE TH5T_F03
diff --git a/fortran/test/tH5VL.F90 b/fortran/test/tH5VL.F90
new file mode 100644
index 0000000..834fbde
--- /dev/null
+++ b/fortran/test/tH5VL.F90
@@ -0,0 +1,512 @@
+!****h* root/fortran/test/tH5VL.f90
+!
+! NAME
+!  tH5VL.f90
+!
+! FUNCTION
+!  Basic testing of Fortran Variable_length datatypes APIs.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! CONTAINS SUBROUTINES
+!  vl_test_integer, vl_test_real, vl_test_string 
+!
+!*****
+
+MODULE TH5VL
+  USE HDF5 ! This module contains all necessary modules
+  USE TH5_MISC
+  USE TH5_MISC_GEN
+
+CONTAINS
+
+        SUBROUTINE vl_test_integer(cleanup, total_error)
+
+          IMPLICIT NONE
+          LOGICAL, INTENT(IN) :: cleanup
+          INTEGER, INTENT(OUT) :: total_error
+
+          CHARACTER(LEN=7), PARAMETER :: filename = "VLtypes" ! File name
+          CHARACTER(LEN=80) :: fix_filename
+          CHARACTER(LEN=5), PARAMETER :: dsetname = "VLint"     ! Dataset name
+
+          INTEGER(HID_T) :: file_id       ! File identifier
+          INTEGER(HID_T) :: dset_id       ! Dataset identifier
+          INTEGER(HID_T) :: dspace_id     ! Dataspace identifier
+          INTEGER(HID_T) :: vltype_id     ! Datatype identifier
+
+
+          INTEGER(HSIZE_T), DIMENSION(1) :: dims = (/6/) ! Dataset dimensions
+          INTEGER(SIZE_T), DIMENSION(6) :: len           ! Elements lengths
+          INTEGER(SIZE_T), DIMENSION(6) :: len_out
+          INTEGER     ::   rank = 1                      ! Dataset rank
+
+          INTEGER, DIMENSION(5,6) :: vl_int_data ! Data buffers
+          INTEGER, DIMENSION(5,6) :: vl_int_data_out ! Data buffers
+          INTEGER     ::   error ! Error flag
+
+          INTEGER     :: i, j    !general purpose integers
+          INTEGER(HSIZE_T) :: ih, jh    !general purpose integers
+          INTEGER(HSIZE_T), DIMENSION(2) :: data_dims = (/5,6/)
+          INTEGER(SIZE_T)  max_len
+
+          !
+          ! Initialize the vl_int_data array.
+          !
+          do i = 1, 6
+             do j = 1, 5
+                vl_int_data(j,i) = -100
+             end do
+          end do
+
+          do i = 2, 6
+             do j = 1,  i-1
+                vl_int_data(j,i) = i-1
+             end do
+          end do
+
+           do i = 1,6
+              len(i) = i-1
+           end do
+
+
+          !
+          ! Create a new file using default properties.
+          !
+          CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+          if (error .ne. 0) then
+              write(*,*) "Cannot modify filename"
+              stop
+          endif
+          CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
+              CALL check("h5fcreate_f", error, total_error)
+
+
+          !
+          ! Create the dataspace.
+          !
+          CALL h5screate_simple_f(rank, dims, dspace_id, error)
+              CALL check("h5screate_simple_f", error, total_error)
+
+
+          !
+          ! Create the dataset with default properties.
+          !
+          CALL h5tvlen_create_f(H5T_NATIVE_INTEGER, vltype_id, error)
+              CALL check("h5dvlen_create_f", error, total_error)
+
+          CALL h5dcreate_f(file_id, dsetname, vltype_id, dspace_id, &
+                           dset_id, error)
+              CALL check("h5dcreate_f", error, total_error)
+
+          !
+          ! Write the dataset.
+          !
+          CALL h5dwrite_vl_f(dset_id, vltype_id, vl_int_data, data_dims, len, error)
+              CALL check("h5dwrite_int_f", error, total_error)
+
+
+
+          !   
+          ! End access to the dataset and release resources used by it.
+          !
+          CALL h5dclose_f(dset_id, error)
+              CALL check("h5dclose_f", error, total_error)
+
+          !
+          ! Close the file.
+          !
+          CALL h5fclose_f(file_id, error)
+              CALL check("h5fclose_f", error, total_error)
+
+          !
+          ! Open the existing file.
+          !
+          CALL h5fopen_f (fix_filename, H5F_ACC_RDWR_F, file_id, error)
+              CALL check("h5fopen_f", error, total_error)
+
+          !
+          ! Open the existing dataset.
+          !
+          CALL h5dopen_f(file_id, dsetname, dset_id, error)
+              CALL check("h5dopen_f", error, total_error)
+
+          CALL h5dvlen_get_max_len_f(dset_id, vltype_id, dspace_id, max_len, error)
+              CALL check("h5dvlen_get_max_len_f", error, total_error)
+              if(max_len .ne. data_dims(1)) then
+                      total_error = total_error + 1
+                      write(*,*) "Wrong number of elemets returned by h5dvlen_get_max_len_f"
+              endif
+          !
+          ! Read the dataset.
+          !
+          CALL h5dread_vl_f(dset_id, vltype_id, vl_int_data_out, data_dims, len_out, &
+                            error, mem_space_id = dspace_id, file_space_id = dspace_id)
+              CALL check("h5dread_int_f", error, total_error)
+              do ih = 1, data_dims(2)
+              do jh = 1, len_out(ih)
+              if(vl_int_data(jh,ih) .ne. vl_int_data_out(jh,ih))  then
+                  total_error = total_error + 1
+                  write(*,*) "h5dread_vl_f returned incorrect data"
+              endif
+              enddo
+               if (len(ih) .ne. len_out(ih)) then
+                  total_error = total_error + 1
+                  write(*,*) "h5dread_vl_f returned incorrect data"
+              endif
+              enddo
+
+          !
+          CALL h5dclose_f(dset_id, error)
+              CALL check("h5dclose_f", error, total_error)
+
+          CALL h5tclose_f(vltype_id, error)
+              CALL check("h5tclose_f", error, total_error)
+
+          !
+          ! Terminate access to the data space.
+          !
+          CALL h5sclose_f(dspace_id, error)
+              CALL check("h5sclose_f", error, total_error)
+
+          !
+          ! Close the file.
+          !
+          CALL h5fclose_f(file_id, error)
+              CALL check("h5fclose_f", error, total_error)
+          if(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+              CALL check("h5_cleanup_f", error, total_error)
+
+          RETURN
+        END SUBROUTINE vl_test_integer
+
+        SUBROUTINE vl_test_real(cleanup, total_error)
+
+          IMPLICIT NONE
+          LOGICAL, INTENT(IN) :: cleanup
+          INTEGER, INTENT(OUT) :: total_error
+
+          CHARACTER(LEN=8), PARAMETER :: filename = "VLtypesR" ! File name
+          CHARACTER(LEN=80) :: fix_filename
+          CHARACTER(LEN=6), PARAMETER :: dsetname = "VLreal"     ! Dataset name
+
+          INTEGER(HID_T) :: file_id       ! File identifier
+          INTEGER(HID_T) :: dset_id       ! Dataset identifier
+          INTEGER(HID_T) :: dspace_id     ! Dataspace identifier
+          INTEGER(HID_T) :: vltype_id     ! Datatype identifier
+
+
+          INTEGER(HSIZE_T), DIMENSION(1) :: dims = (/6/) ! Dataset dimensions
+          INTEGER(SIZE_T), DIMENSION(6) :: len           ! Elements lengths
+          INTEGER(SIZE_T), DIMENSION(6) :: len_out
+          INTEGER     ::   rank = 1                      ! Dataset rank
+
+          REAL, DIMENSION(5,6) :: vl_real_data ! Data buffers
+          REAL, DIMENSION(5,6) :: vl_real_data_out ! Data buffers
+          INTEGER     ::   error ! Error flag
+
+          INTEGER     :: i, j    !general purpose integers
+          INTEGER(HSIZE_T)     :: ih, jh    !general purpose integers
+          INTEGER(HSIZE_T), DIMENSION(2) :: data_dims = (/5,6/)
+          INTEGER(SIZE_T)  max_len
+          INTEGER(HID_T) ::  vl_type_id
+          LOGICAL        ::  vl_flag
+
+          !
+          ! Initialize the vl_int_data array.
+          !
+          do i = 1, 6
+             do j = 1, 5
+                vl_real_data(j,i) = -100.
+             end do
+          end do
+
+          do i = 2, 6
+             do j = 1,  i-1
+                vl_real_data(j,i) = i-1
+             end do
+          end do
+
+           do i = 1,6
+              len(i) = i-1
+           end do
+
+
+          !
+          ! Create a new file using default properties.
+          !
+          CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+          if (error .ne. 0) then
+              write(*,*) "Cannot modify filename"
+              stop
+          endif
+          CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
+              CALL check("h5fcreate_f", error, total_error)
+
+
+          !
+          ! Create the dataspace.
+          !
+          CALL h5screate_simple_f(rank, dims, dspace_id, error)
+              CALL check("h5screate_simple_f", error, total_error)
+
+
+          !
+          ! Create the dataset with default properties.
+          !
+          CALL h5tvlen_create_f(H5T_NATIVE_REAL, vltype_id, error)
+              CALL check("h5dvlen_create_f", error, total_error)
+
+          CALL h5dcreate_f(file_id, dsetname, vltype_id, dspace_id, &
+                           dset_id, error)
+              CALL check("h5dcreate_f", error, total_error)
+          CALL h5dget_type_f(dset_id, vl_type_id, error)
+              CALL check("h5dget_type_f", error, total_error)
+          CALL h5tis_variable_str_f( vl_type_id, vl_flag, error)
+              CALL check("h5tis_variable_str_f", error, total_error)
+              if( vl_flag ) then
+                 write(*,*) "type is wrong"
+                 total_error = total_error + 1
+              endif
+
+
+          !
+          ! Write the dataset.
+          !
+          CALL h5dwrite_vl_f(dset_id, vltype_id, vl_real_data, data_dims, len, error)
+              CALL check("h5dwrite_vl_real_f", error, total_error)
+
+
+          !
+          ! End access to the dataset and release resources used by it.
+          !
+          CALL h5dclose_f(dset_id, error)
+              CALL check("h5dclose_f", error, total_error)
+
+          !
+          ! Close the file.
+          !
+          CALL h5fclose_f(file_id, error)
+              CALL check("h5fclose_f", error, total_error)
+
+          !
+          ! Open the existing file.
+          !
+          CALL h5fopen_f (fix_filename, H5F_ACC_RDWR_F, file_id, error)
+              CALL check("h5fopen_f", error, total_error)
+
+          !
+          ! Open the existing dataset.
+          !
+          CALL h5dopen_f(file_id, dsetname, dset_id, error)
+              CALL check("h5dopen_f", error, total_error)
+
+          CALL h5dvlen_get_max_len_f(dset_id, vltype_id, dspace_id, max_len, error)
+              CALL check("h5dvlen_get_max_len_f", error, total_error)
+              if(max_len .ne. data_dims(1)) then
+                      total_error = total_error + 1
+                      write(*,*) "Wrong number of elemets returned by h5dvlen_get_max_len_f"
+              endif
+          !
+          ! Read the dataset.
+          !
+          CALL h5dread_vl_f(dset_id, vltype_id, vl_real_data_out, data_dims, len_out, &
+                            error, mem_space_id = dspace_id, file_space_id = dspace_id)
+              CALL check("h5dread_real_f", error, total_error)
+              DO ih = 1, data_dims(2)
+              DO jh = 1, len_out(ih)
+                 CALL VERIFY("h5dread_vl_f returned incorrect data",vl_real_data(jh,ih),vl_real_data_out(jh,ih), total_error)
+              ENDDO
+              IF (LEN(ih) .NE. len_out(ih)) THEN
+                 total_error = total_error + 1
+                 WRITE(*,*) "h5dread_vl_f returned incorrect data"
+              ENDIF
+           ENDDO
+
+
+          !
+          CALL h5dclose_f(dset_id, error)
+              CALL check("h5dclose_f", error, total_error)
+
+          CALL h5tclose_f(vltype_id, error)
+              CALL check("h5tclose_f", error, total_error)
+
+          !
+          ! Terminate access to the data space.
+          !
+          CALL h5sclose_f(dspace_id, error)
+              CALL check("h5sclose_f", error, total_error)
+
+          !
+          ! Close the file.
+          !
+          CALL h5fclose_f(file_id, error)
+              CALL check("h5fclose_f", error, total_error)
+          if(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+              CALL check("h5_cleanup_f", error, total_error)
+
+          RETURN
+        END SUBROUTINE vl_test_real
+
+        SUBROUTINE vl_test_string(cleanup, total_error)
+
+          IMPLICIT NONE
+          LOGICAL, INTENT(IN) :: cleanup
+          INTEGER, INTENT(OUT) :: total_error
+
+          CHARACTER(LEN=8), PARAMETER :: filename = "VLtypesS" ! File name
+          CHARACTER(LEN=80) :: fix_filename
+          CHARACTER(LEN=9), PARAMETER :: dsetname = "VLstrings"     ! Dataset name
+
+          INTEGER(HID_T) :: file_id       ! File identifier
+          INTEGER(HID_T) :: dset_id       ! Dataset identifier
+          INTEGER(HID_T) :: dspace_id     ! Dataspace identifier
+
+
+          INTEGER(HSIZE_T), DIMENSION(1) :: dims = (/4/) ! Dataset dimensions
+          INTEGER(SIZE_T), DIMENSION(4) :: str_len           ! Elements lengths
+          INTEGER(SIZE_T), DIMENSION(4) :: str_len_out
+          INTEGER     ::   rank = 1                      ! Dataset rank
+
+          CHARACTER(LEN=10), DIMENSION(4) :: string_data ! Array of strings
+          CHARACTER(LEN=10), DIMENSION(4) :: string_data_out     ! Data buffers
+          INTEGER     ::   error ! Error flag
+
+          INTEGER(HSIZE_T) :: ih    !general purpose integers
+          INTEGER(HSIZE_T), DIMENSION(2) :: data_dims = (/10,4/)
+          INTEGER(HID_T) :: vl_type_id
+          LOGICAL        :: vl_flag
+
+          !
+          ! Initialize the string_data array.
+          !
+          string_data(1) = 'This is   '
+          str_len(1) = 8
+          string_data(2) = 'a fortran '
+          str_len(2) = 10
+          string_data(3) = 'strings   '
+          str_len(3) = 8
+          string_data(4) = 'test.     '
+          str_len(4) = 5
+
+
+          !
+          ! Create a new file using default properties.
+          !
+          CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
+          if (error .ne. 0) then
+              write(*,*) "Cannot modify filename"
+              stop
+          endif
+          CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
+              CALL check("h5fcreate_f", error, total_error)
+
+
+          !
+          ! Create the dataspace.
+          !
+          CALL h5screate_simple_f(rank, dims, dspace_id, error)
+              CALL check("h5screate_simple_f", error, total_error)
+
+
+          !
+          ! Create the dataset with default properties.
+          !
+          CALL h5dcreate_f(file_id, dsetname, H5T_STRING, dspace_id, &
+                           dset_id, error)
+              CALL check("h5dcreate_f", error, total_error)
+          !
+          ! Check that dataset has a string datatype
+          !
+          CALL h5dget_type_f(dset_id, vl_type_id, error)
+              CALL check("h5dget_type_f", error, total_error)
+          CALL h5tis_variable_str_f( vl_type_id, vl_flag, error)
+              CALL check("h5tis_variable_str_f", error, total_error)
+              if( .NOT. vl_flag ) then
+                 write(*,*) "type is wrong"
+                 total_error = total_error + 1
+              endif
+
+          !
+          ! Write the dataset.
+          !
+          CALL h5dwrite_vl_f(dset_id, H5T_STRING, string_data, data_dims, str_len, error)
+              CALL check("h5dwrite_string_f", error, total_error)
+
+
+          !
+          ! End access to the dataset and release resources used by it.
+          !
+          CALL h5dclose_f(dset_id, error)
+              CALL check("h5dclose_f", error, total_error)
+
+          !
+          ! Close the file.
+          !
+          CALL h5fclose_f(file_id, error)
+              CALL check("h5fclose_f", error, total_error)
+
+          !
+          ! Open the existing file.
+          !
+          CALL h5fopen_f (fix_filename, H5F_ACC_RDWR_F, file_id, error)
+              CALL check("h5fopen_f", error, total_error)
+
+          !
+          ! Open the existing dataset.
+          !
+          CALL h5dopen_f(file_id, dsetname, dset_id, error)
+              CALL check("h5dopen_f", error, total_error)
+          !
+          !  Read the dataset.
+          !
+          CALL h5dread_vl_f(dset_id, H5T_STRING, string_data_out, data_dims,  &
+                            str_len_out, error)
+              CALL check("h5dread_string_f", error, total_error)
+          do 100 ih = 1, data_dims(2)
+             if(str_len(ih) .ne. str_len_out(ih)) then
+                total_error=total_error + 1
+                write(*,*) 'Returned string length is incorrect'
+                goto 100
+             endif
+             if(string_data(1)(1:str_len(ih)) .ne. string_data_out(1)(1:str_len(ih))) then
+             write(*,*) ' Returned string is wrong'
+             total_error = total_error + 1
+             endif
+100       continue
+
+          !
+          CALL h5dclose_f(dset_id, error)
+              CALL check("h5dclose_f", error, total_error)
+
+          !
+          ! Terminate access to the data space.
+          !
+          CALL h5sclose_f(dspace_id, error)
+              CALL check("h5sclose_f", error, total_error)
+
+          !
+          ! Close the file.
+          !
+          CALL h5fclose_f(file_id, error)
+              CALL check("h5fclose_f", error, total_error)
+          if(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
+              CALL check("h5_cleanup_f", error, total_error)
+
+          RETURN
+        END SUBROUTINE vl_test_string
+END MODULE TH5VL
diff --git a/fortran/test/tH5VL.f90 b/fortran/test/tH5VL.f90
deleted file mode 100644
index 651ca75..0000000
--- a/fortran/test/tH5VL.f90
+++ /dev/null
@@ -1,518 +0,0 @@
-!****h* root/fortran/test/tH5VL.f90
-!
-! NAME
-!  tH5VL.f90
-!
-! FUNCTION
-!  Basic testing of Fortran Variable_length datatypes APIs.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! CONTAINS SUBROUTINES
-!  vl_test_integer, vl_test_real, vl_test_string 
-!
-!*****
-
-MODULE TH5VL
-
-CONTAINS
-
-        SUBROUTINE vl_test_integer(cleanup, total_error)
-        USE HDF5 ! This module contains all necessary modules
-        USE TH5_MISC
-
-          IMPLICIT NONE
-          LOGICAL, INTENT(IN) :: cleanup
-          INTEGER, INTENT(OUT) :: total_error
-
-          CHARACTER(LEN=7), PARAMETER :: filename = "VLtypes" ! File name
-          CHARACTER(LEN=80) :: fix_filename
-          CHARACTER(LEN=5), PARAMETER :: dsetname = "VLint"     ! Dataset name
-
-          INTEGER(HID_T) :: file_id       ! File identifier
-          INTEGER(HID_T) :: dset_id       ! Dataset identifier
-          INTEGER(HID_T) :: dspace_id     ! Dataspace identifier
-          INTEGER(HID_T) :: vltype_id     ! Datatype identifier
-
-
-          INTEGER(HSIZE_T), DIMENSION(1) :: dims = (/6/) ! Dataset dimensions
-          INTEGER(SIZE_T), DIMENSION(6) :: len           ! Elements lengths
-          INTEGER(SIZE_T), DIMENSION(6) :: len_out
-          INTEGER     ::   rank = 1                      ! Dataset rank
-
-          INTEGER, DIMENSION(5,6) :: vl_int_data ! Data buffers
-          INTEGER, DIMENSION(5,6) :: vl_int_data_out ! Data buffers
-          INTEGER     ::   error ! Error flag
-
-          INTEGER     :: i, j    !general purpose integers
-          INTEGER(HSIZE_T) :: ih, jh    !general purpose integers
-          INTEGER(HSIZE_T), DIMENSION(2) :: data_dims = (/5,6/)
-          INTEGER(SIZE_T)  max_len
-
-          !
-          ! Initialize the vl_int_data array.
-          !
-          do i = 1, 6
-             do j = 1, 5
-                vl_int_data(j,i) = -100
-             end do
-          end do
-
-          do i = 2, 6
-             do j = 1,  i-1
-                vl_int_data(j,i) = i-1
-             end do
-          end do
-
-           do i = 1,6
-              len(i) = i-1
-           end do
-
-
-          !
-          ! Create a new file using default properties.
-          !
-          CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
-          if (error .ne. 0) then
-              write(*,*) "Cannot modify filename"
-              stop
-          endif
-          CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
-              CALL check("h5fcreate_f", error, total_error)
-
-
-          !
-          ! Create the dataspace.
-          !
-          CALL h5screate_simple_f(rank, dims, dspace_id, error)
-              CALL check("h5screate_simple_f", error, total_error)
-
-
-          !
-          ! Create the dataset with default properties.
-          !
-          CALL h5tvlen_create_f(H5T_NATIVE_INTEGER, vltype_id, error)
-              CALL check("h5dvlen_create_f", error, total_error)
-
-          CALL h5dcreate_f(file_id, dsetname, vltype_id, dspace_id, &
-                           dset_id, error)
-              CALL check("h5dcreate_f", error, total_error)
-
-          !
-          ! Write the dataset.
-          !
-          CALL h5dwrite_vl_f(dset_id, vltype_id, vl_int_data, data_dims, len, error)
-              CALL check("h5dwrite_int_f", error, total_error)
-
-
-
-          !   
-          ! End access to the dataset and release resources used by it.
-          !
-          CALL h5dclose_f(dset_id, error)
-              CALL check("h5dclose_f", error, total_error)
-
-          !
-          ! Close the file.
-          !
-          CALL h5fclose_f(file_id, error)
-              CALL check("h5fclose_f", error, total_error)
-
-          !
-          ! Open the existing file.
-          !
-          CALL h5fopen_f (fix_filename, H5F_ACC_RDWR_F, file_id, error)
-              CALL check("h5fopen_f", error, total_error)
-
-          !
-          ! Open the existing dataset.
-          !
-          CALL h5dopen_f(file_id, dsetname, dset_id, error)
-              CALL check("h5dopen_f", error, total_error)
-
-          CALL h5dvlen_get_max_len_f(dset_id, vltype_id, dspace_id, max_len, error)
-              CALL check("h5dvlen_get_max_len_f", error, total_error)
-              if(max_len .ne. data_dims(1)) then
-                      total_error = total_error + 1
-                      write(*,*) "Wrong number of elemets returned by h5dvlen_get_max_len_f"
-              endif
-          !
-          ! Read the dataset.
-          !
-          CALL h5dread_vl_f(dset_id, vltype_id, vl_int_data_out, data_dims, len_out, &
-                            error, mem_space_id = dspace_id, file_space_id = dspace_id)
-              CALL check("h5dread_int_f", error, total_error)
-              do ih = 1, data_dims(2)
-              do jh = 1, len_out(ih)
-              if(vl_int_data(jh,ih) .ne. vl_int_data_out(jh,ih))  then
-                  total_error = total_error + 1
-                  write(*,*) "h5dread_vl_f returned incorrect data"
-              endif
-              enddo
-               if (len(ih) .ne. len_out(ih)) then
-                  total_error = total_error + 1
-                  write(*,*) "h5dread_vl_f returned incorrect data"
-              endif
-              enddo
-
-          !
-          CALL h5dclose_f(dset_id, error)
-              CALL check("h5dclose_f", error, total_error)
-
-          CALL h5tclose_f(vltype_id, error)
-              CALL check("h5tclose_f", error, total_error)
-
-          !
-          ! Terminate access to the data space.
-          !
-          CALL h5sclose_f(dspace_id, error)
-              CALL check("h5sclose_f", error, total_error)
-
-          !
-          ! Close the file.
-          !
-          CALL h5fclose_f(file_id, error)
-              CALL check("h5fclose_f", error, total_error)
-          if(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-              CALL check("h5_cleanup_f", error, total_error)
-
-          RETURN
-        END SUBROUTINE vl_test_integer
-
-        SUBROUTINE vl_test_real(cleanup, total_error)
-        USE HDF5 ! This module contains all necessary modules
-        USE TH5_MISC
-
-          IMPLICIT NONE
-          LOGICAL, INTENT(IN) :: cleanup
-          INTEGER, INTENT(OUT) :: total_error
-
-          CHARACTER(LEN=8), PARAMETER :: filename = "VLtypesR" ! File name
-          CHARACTER(LEN=80) :: fix_filename
-          CHARACTER(LEN=6), PARAMETER :: dsetname = "VLreal"     ! Dataset name
-
-          INTEGER(HID_T) :: file_id       ! File identifier
-          INTEGER(HID_T) :: dset_id       ! Dataset identifier
-          INTEGER(HID_T) :: dspace_id     ! Dataspace identifier
-          INTEGER(HID_T) :: vltype_id     ! Datatype identifier
-
-
-          INTEGER(HSIZE_T), DIMENSION(1) :: dims = (/6/) ! Dataset dimensions
-          INTEGER(SIZE_T), DIMENSION(6) :: len           ! Elements lengths
-          INTEGER(SIZE_T), DIMENSION(6) :: len_out
-          INTEGER     ::   rank = 1                      ! Dataset rank
-
-          REAL, DIMENSION(5,6) :: vl_real_data ! Data buffers
-          REAL, DIMENSION(5,6) :: vl_real_data_out ! Data buffers
-          INTEGER     ::   error ! Error flag
-
-          INTEGER     :: i, j    !general purpose integers
-          INTEGER(HSIZE_T)     :: ih, jh    !general purpose integers
-          INTEGER(HSIZE_T), DIMENSION(2) :: data_dims = (/5,6/)
-          INTEGER(SIZE_T)  max_len
-          INTEGER(HID_T) ::  vl_type_id
-          LOGICAL        ::  vl_flag
-
-          !
-          ! Initialize the vl_int_data array.
-          !
-          do i = 1, 6
-             do j = 1, 5
-                vl_real_data(j,i) = -100.
-             end do
-          end do
-
-          do i = 2, 6
-             do j = 1,  i-1
-                vl_real_data(j,i) = i-1
-             end do
-          end do
-
-           do i = 1,6
-              len(i) = i-1
-           end do
-
-
-          !
-          ! Create a new file using default properties.
-          !
-          CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
-          if (error .ne. 0) then
-              write(*,*) "Cannot modify filename"
-              stop
-          endif
-          CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
-              CALL check("h5fcreate_f", error, total_error)
-
-
-          !
-          ! Create the dataspace.
-          !
-          CALL h5screate_simple_f(rank, dims, dspace_id, error)
-              CALL check("h5screate_simple_f", error, total_error)
-
-
-          !
-          ! Create the dataset with default properties.
-          !
-          CALL h5tvlen_create_f(H5T_NATIVE_REAL, vltype_id, error)
-              CALL check("h5dvlen_create_f", error, total_error)
-
-          CALL h5dcreate_f(file_id, dsetname, vltype_id, dspace_id, &
-                           dset_id, error)
-              CALL check("h5dcreate_f", error, total_error)
-          CALL h5dget_type_f(dset_id, vl_type_id, error)
-              CALL check("h5dget_type_f", error, total_error)
-          CALL h5tis_variable_str_f( vl_type_id, vl_flag, error)
-              CALL check("h5tis_variable_str_f", error, total_error)
-              if( vl_flag ) then
-                 write(*,*) "type is wrong"
-                 total_error = total_error + 1
-              endif
-
-
-          !
-          ! Write the dataset.
-          !
-          CALL h5dwrite_vl_f(dset_id, vltype_id, vl_real_data, data_dims, len, error)
-              CALL check("h5dwrite_vl_real_f", error, total_error)
-
-
-          !
-          ! End access to the dataset and release resources used by it.
-          !
-          CALL h5dclose_f(dset_id, error)
-              CALL check("h5dclose_f", error, total_error)
-
-          !
-          ! Close the file.
-          !
-          CALL h5fclose_f(file_id, error)
-              CALL check("h5fclose_f", error, total_error)
-
-          !
-          ! Open the existing file.
-          !
-          CALL h5fopen_f (fix_filename, H5F_ACC_RDWR_F, file_id, error)
-              CALL check("h5fopen_f", error, total_error)
-
-          !
-          ! Open the existing dataset.
-          !
-          CALL h5dopen_f(file_id, dsetname, dset_id, error)
-              CALL check("h5dopen_f", error, total_error)
-
-          CALL h5dvlen_get_max_len_f(dset_id, vltype_id, dspace_id, max_len, error)
-              CALL check("h5dvlen_get_max_len_f", error, total_error)
-              if(max_len .ne. data_dims(1)) then
-                      total_error = total_error + 1
-                      write(*,*) "Wrong number of elemets returned by h5dvlen_get_max_len_f"
-              endif
-          !
-          ! Read the dataset.
-          !
-          CALL h5dread_vl_f(dset_id, vltype_id, vl_real_data_out, data_dims, len_out, &
-                            error, mem_space_id = dspace_id, file_space_id = dspace_id)
-              CALL check("h5dread_real_f", error, total_error)
-              do ih = 1, data_dims(2)
-              do jh = 1, len_out(ih)
-                 IF( .NOT.dreal_eq( REAL(vl_real_data(jh,ih),dp), REAL(vl_real_data_out(jh,ih), dp)) ) THEN
-                    total_error = total_error + 1
-                    WRITE(*,*) "h5dread_vl_f returned incorrect data"
-                 ENDIF
-              enddo
-               if (len(ih) .ne. len_out(ih)) then
-                  total_error = total_error + 1
-                  write(*,*) "h5dread_vl_f returned incorrect data"
-              endif
-              enddo
-
-
-          !
-          CALL h5dclose_f(dset_id, error)
-              CALL check("h5dclose_f", error, total_error)
-
-          CALL h5tclose_f(vltype_id, error)
-              CALL check("h5tclose_f", error, total_error)
-
-          !
-          ! Terminate access to the data space.
-          !
-          CALL h5sclose_f(dspace_id, error)
-              CALL check("h5sclose_f", error, total_error)
-
-          !
-          ! Close the file.
-          !
-          CALL h5fclose_f(file_id, error)
-              CALL check("h5fclose_f", error, total_error)
-          if(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-              CALL check("h5_cleanup_f", error, total_error)
-
-          RETURN
-        END SUBROUTINE vl_test_real
-
-        SUBROUTINE vl_test_string(cleanup, total_error)
-        USE HDF5 ! This module contains all necessary modules
-        USE TH5_MISC
-
-          IMPLICIT NONE
-          LOGICAL, INTENT(IN) :: cleanup
-          INTEGER, INTENT(OUT) :: total_error
-
-          CHARACTER(LEN=8), PARAMETER :: filename = "VLtypesS" ! File name
-          CHARACTER(LEN=80) :: fix_filename
-          CHARACTER(LEN=9), PARAMETER :: dsetname = "VLstrings"     ! Dataset name
-
-          INTEGER(HID_T) :: file_id       ! File identifier
-          INTEGER(HID_T) :: dset_id       ! Dataset identifier
-          INTEGER(HID_T) :: dspace_id     ! Dataspace identifier
-
-
-          INTEGER(HSIZE_T), DIMENSION(1) :: dims = (/4/) ! Dataset dimensions
-          INTEGER(SIZE_T), DIMENSION(4) :: str_len           ! Elements lengths
-          INTEGER(SIZE_T), DIMENSION(4) :: str_len_out
-          INTEGER     ::   rank = 1                      ! Dataset rank
-
-          CHARACTER(LEN=10), DIMENSION(4) :: string_data ! Array of strings
-          CHARACTER(LEN=10), DIMENSION(4) :: string_data_out     ! Data buffers
-          INTEGER     ::   error ! Error flag
-
-          INTEGER(HSIZE_T) :: ih    !general purpose integers
-          INTEGER(HSIZE_T), DIMENSION(2) :: data_dims = (/10,4/)
-          INTEGER(HID_T) :: vl_type_id
-          LOGICAL        :: vl_flag
-
-          !
-          ! Initialize the string_data array.
-          !
-          string_data(1) = 'This is   '
-          str_len(1) = 8
-          string_data(2) = 'a fortran '
-          str_len(2) = 10
-          string_data(3) = 'strings   '
-          str_len(3) = 8
-          string_data(4) = 'test.     '
-          str_len(4) = 5
-
-
-          !
-          ! Create a new file using default properties.
-          !
-          CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error)
-          if (error .ne. 0) then
-              write(*,*) "Cannot modify filename"
-              stop
-          endif
-          CALL h5fcreate_f(fix_filename, H5F_ACC_TRUNC_F, file_id, error)
-              CALL check("h5fcreate_f", error, total_error)
-
-
-          !
-          ! Create the dataspace.
-          !
-          CALL h5screate_simple_f(rank, dims, dspace_id, error)
-              CALL check("h5screate_simple_f", error, total_error)
-
-
-          !
-          ! Create the dataset with default properties.
-          !
-          CALL h5dcreate_f(file_id, dsetname, H5T_STRING, dspace_id, &
-                           dset_id, error)
-              CALL check("h5dcreate_f", error, total_error)
-          !
-          ! Check that dataset has a string datatype
-          !
-          CALL h5dget_type_f(dset_id, vl_type_id, error)
-              CALL check("h5dget_type_f", error, total_error)
-          CALL h5tis_variable_str_f( vl_type_id, vl_flag, error)
-              CALL check("h5tis_variable_str_f", error, total_error)
-              if( .NOT. vl_flag ) then
-                 write(*,*) "type is wrong"
-                 total_error = total_error + 1
-              endif
-
-          !
-          ! Write the dataset.
-          !
-          CALL h5dwrite_vl_f(dset_id, H5T_STRING, string_data, data_dims, str_len, error)
-              CALL check("h5dwrite_string_f", error, total_error)
-
-
-          !
-          ! End access to the dataset and release resources used by it.
-          !
-          CALL h5dclose_f(dset_id, error)
-              CALL check("h5dclose_f", error, total_error)
-
-          !
-          ! Close the file.
-          !
-          CALL h5fclose_f(file_id, error)
-              CALL check("h5fclose_f", error, total_error)
-
-          !
-          ! Open the existing file.
-          !
-          CALL h5fopen_f (fix_filename, H5F_ACC_RDWR_F, file_id, error)
-              CALL check("h5fopen_f", error, total_error)
-
-          !
-          ! Open the existing dataset.
-          !
-          CALL h5dopen_f(file_id, dsetname, dset_id, error)
-              CALL check("h5dopen_f", error, total_error)
-          !
-          !  Read the dataset.
-          !
-          CALL h5dread_vl_f(dset_id, H5T_STRING, string_data_out, data_dims,  &
-                            str_len_out, error)
-              CALL check("h5dread_string_f", error, total_error)
-          do 100 ih = 1, data_dims(2)
-             if(str_len(ih) .ne. str_len_out(ih)) then
-                total_error=total_error + 1
-                write(*,*) 'Returned string length is incorrect'
-                goto 100
-             endif
-             if(string_data(1)(1:str_len(ih)) .ne. string_data_out(1)(1:str_len(ih))) then
-             write(*,*) ' Returned string is wrong'
-             total_error = total_error + 1
-             endif
-100       continue
-
-          !
-          CALL h5dclose_f(dset_id, error)
-              CALL check("h5dclose_f", error, total_error)
-
-          !
-          ! Terminate access to the data space.
-          !
-          CALL h5sclose_f(dspace_id, error)
-              CALL check("h5sclose_f", error, total_error)
-
-          !
-          ! Close the file.
-          !
-          CALL h5fclose_f(file_id, error)
-              CALL check("h5fclose_f", error, total_error)
-          if(cleanup) CALL h5_cleanup_f(filename, H5P_DEFAULT_F, error)
-              CALL check("h5_cleanup_f", error, total_error)
-
-          RETURN
-        END SUBROUTINE vl_test_string
-END MODULE TH5VL
diff --git a/fortran/test/tH5Z.f90 b/fortran/test/tH5Z.F90
similarity index 100%
rename from fortran/test/tH5Z.f90
rename to fortran/test/tH5Z.F90
diff --git a/fortran/test/tHDF5.F90 b/fortran/test/tHDF5.F90
new file mode 100644
index 0000000..d12bb25
--- /dev/null
+++ b/fortran/test/tHDF5.F90
@@ -0,0 +1,46 @@
+!****h* ROBODoc/HDF5
+!
+! NAME
+!  MODULE THDF5
+!
+! FILE
+!  src/fortran/test/tHDF5.f90
+!
+! PURPOSE
+!  This is the test  module used for testing the Fortran90 HDF library APIs.
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+!*****
+
+MODULE THDF5
+  USE TH5_MISC
+  USE TH5_MISC_GEN
+  USE TH5A
+  USE TH5D
+  USE TH5E
+  USE TH5F
+  USE TH5G
+  USE TH5I
+  USE TH5P
+  USE TH5R
+  USE TH5S
+  USE TH5SSELECT
+  USE TH5T
+  USE TH5VL
+  USE TH5Z
+END MODULE THDF5
diff --git a/fortran/test/tHDF5.f90 b/fortran/test/tHDF5.f90
deleted file mode 100644
index e73fed2..0000000
--- a/fortran/test/tHDF5.f90
+++ /dev/null
@@ -1,45 +0,0 @@
-!****h* ROBODoc/HDF5
-!
-! NAME
-!  MODULE THDF5
-!
-! FILE
-!  src/fortran/test/tHDF5.f90
-!
-! PURPOSE
-!  This is the test  module used for testing the Fortran90 HDF library APIs.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!*****
-
-MODULE THDF5
-  USE TH5_MISC
-  USE TH5A
-  USE TH5D
-  USE TH5E
-  USE TH5F
-  USE TH5G
-  USE TH5I
-  USE TH5P
-  USE TH5R
-  USE TH5S
-  USE TH5SSELECT
-  USE TH5T
-  USE TH5VL
-  USE TH5Z
-END MODULE THDF5
diff --git a/fortran/test/tHDF5_1_8.f90 b/fortran/test/tHDF5_1_8.F90
similarity index 100%
rename from fortran/test/tHDF5_1_8.f90
rename to fortran/test/tHDF5_1_8.F90
diff --git a/fortran/test/tHDF5_F03.f90 b/fortran/test/tHDF5_F03.F90
similarity index 100%
rename from fortran/test/tHDF5_F03.f90
rename to fortran/test/tHDF5_F03.F90
diff --git a/fortran/test/tf.F90 b/fortran/test/tf.F90
new file mode 100644
index 0000000..7d67f30
--- /dev/null
+++ b/fortran/test/tf.F90
@@ -0,0 +1,412 @@
+!****h* root/fortran/test/tf.f90
+!
+! NAME
+!  tf.f90
+!
+! FUNCTION
+!  Contains subroutines which are needed in all the hdf5 fortran tests
+!
+! COPYRIGHT
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! CONTAINS SUBROUTINES
+!  write_test_status, check, verify, verifyLogical, verifyString, h5_fixname_f,
+!  h5_cleanup_f, h5_exit_f, h5_env_nocleanup_f,dreal_eqv
+!
+!*****
+
+#include "H5config_f.inc"
+
+MODULE TH5_MISC
+
+  USE, INTRINSIC :: ISO_C_BINDING
+
+  IMPLICIT NONE
+
+  INTEGER, PARAMETER :: sp = SELECTED_REAL_KIND(5)  ! This should map to REAL*4 on most modern processors
+  INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(10) ! This should map to REAL*8 on most modern processors
+
+  ! generic compound datatype
+  TYPE, BIND(C) :: comp_datatype
+    REAL :: a
+    INTEGER :: x
+    DOUBLE PRECISION :: y
+    CHARACTER(KIND=C_CHAR) :: z
+  END TYPE comp_datatype
+
+  PUBLIC :: H5_SIZEOF
+  INTERFACE H5_SIZEOF
+     MODULE PROCEDURE H5_SIZEOF_CMPD
+     MODULE PROCEDURE H5_SIZEOF_CHR
+     MODULE PROCEDURE H5_SIZEOF_I
+     MODULE PROCEDURE H5_SIZEOF_SP,H5_SIZEOF_DP
+  END INTERFACE
+
+CONTAINS
+
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_TEST_DLL)
+!DEC$attributes dllexport :: write_test_status
+!DEC$endif
+  SUBROUTINE write_test_status( test_result, test_title, total_error)
+
+    ! Writes the results of the tests
+
+    IMPLICIT NONE
+
+    INTEGER, INTENT(IN) :: test_result  ! negative,  --skip --
+                                        ! 0       ,   passed
+                                        ! positive,   failed
+
+    CHARACTER(LEN=*), INTENT(IN) :: test_title ! Short description of test
+    INTEGER, INTENT(INOUT) :: total_error ! Accumulated error
+
+! Controls the output style for reporting test results
+
+    CHARACTER(LEN=8) :: error_string
+    CHARACTER(LEN=8), PARAMETER :: success = ' PASSED '
+    CHARACTER(LEN=8), PARAMETER :: failure = '*FAILED*'
+    CHARACTER(LEN=8), PARAMETER :: skip    = '--SKIP--'
+    
+
+    error_string = failure
+    IF (test_result ==  0) THEN
+       error_string = success
+    ELSE IF (test_result == -1) THEN
+       error_string = skip
+    ENDIF
+
+    WRITE(*, fmt = '(A, T72, A)') test_title, error_string
+
+    IF(test_result.GT.0) total_error = total_error + test_result
+
+  END SUBROUTINE write_test_status
+
+
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_TEST_DLL)
+!DEC$attributes dllexport :: check
+!DEC$endif
+  SUBROUTINE check(string,error,total_error)
+    CHARACTER(LEN=*) :: string
+    INTEGER :: error, total_error
+    IF (error .LT. 0) THEN
+       total_error=total_error+1
+       WRITE(*,*) string, " FAILED"
+    ENDIF
+    RETURN
+  END SUBROUTINE check
+
+!----------------------------------------------------------------------
+! Name:		h5_fixname_f
+!
+! Purpose:	Create a file name from the a file base name.
+!               It is a fortran counterpart for the h5_fixname in ../../test/h5test.c
+!
+! Inputs:
+!		base_name	- base name of the file
+!               fapl		- file access property list
+! Outputs:
+!		full_name	- full file name
+!		hdferr:		- error code
+!				 	Success:  0
+!				 	Failure: -1
+!
+! Programmer:	Elena Pourmal
+!		September 13, 2002
+!
+!
+!----------------------------------------------------------------------
+  SUBROUTINE h5_fixname_f(base_name, full_name, fapl, hdferr)
+!
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_TEST_DLL)
+!DEC$attributes dllexport :: h5_fixname_f
+!DEC$endif
+    USE H5GLOBAL
+    IMPLICIT NONE
+    CHARACTER(LEN=*), INTENT(IN) :: base_name   ! base name
+    CHARACTER(LEN=*), INTENT(IN) :: full_name   ! full name
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+    INTEGER(HID_T), INTENT(IN) :: fapl ! file access property list
+
+    INTEGER(SIZE_T) :: base_namelen ! Length of the base name character string
+    INTEGER(SIZE_T) :: full_namelen ! Length of the full name character string
+!            INTEGER(HID_T) :: fapl_default
+
+    INTERFACE
+       INTEGER FUNCTION h5_fixname_c(base_name, base_namelen, fapl, &
+            full_name, full_namelen)
+         USE H5GLOBAL
+         !DEC$ IF DEFINED(HDF5F90_WINDOWS)
+         !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5_FIXNAME_C':: h5_fixname_c
+         !DEC$ ENDIF
+         !DEC$ATTRIBUTES reference :: base_name
+         !DEC$ATTRIBUTES reference :: full_name
+         CHARACTER(LEN=*), INTENT(IN) :: base_name
+         INTEGER(SIZE_T) :: base_namelen
+         INTEGER(HID_T), INTENT(IN) :: fapl
+         CHARACTER(LEN=*), INTENT(IN) :: full_name
+         INTEGER(SIZE_T) :: full_namelen
+       END FUNCTION h5_fixname_c
+    END INTERFACE
+
+    base_namelen = LEN(base_name)
+    full_namelen = LEN(full_name)
+    hdferr = h5_fixname_c(base_name, base_namelen, fapl, &
+         full_name, full_namelen)
+  
+  END SUBROUTINE h5_fixname_f
+
+!----------------------------------------------------------------------
+! Name:		h5_cleanup_f
+!
+! Purpose:	Cleanups tests files
+!               It is a fortran counterpart for the h5_cleanup in ../../test/h5test.c
+!
+! Inputs:
+!		base_name	- base name of the file
+!               fapl		- file access property list
+! Outputs:
+!		hdferr:		- error code
+!				 	Success:  0
+!				 	Failure: -1
+!
+! Programmer:	Elena Pourmal
+!		September 19, 2002
+!
+!
+!----------------------------------------------------------------------
+  SUBROUTINE h5_cleanup_f(base_name, fapl, hdferr)
+!
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_TEST_DLL)
+!DEC$attributes dllexport :: h5_cleanup_f
+!DEC$endif
+    USE H5GLOBAL
+    IMPLICIT NONE
+    CHARACTER(LEN=*), INTENT(IN) :: base_name   ! base name
+    INTEGER, INTENT(OUT) :: hdferr         ! Error code
+    INTEGER(HID_T), INTENT(IN) :: fapl ! file access property list
+    
+    INTEGER(SIZE_T) :: base_namelen ! Length of the base name character string
+
+    INTERFACE
+       INTEGER FUNCTION h5_cleanup_c(base_name, base_namelen, fapl)
+         USE H5GLOBAL
+         !DEC$ IF DEFINED(HDF5F90_WINDOWS)
+         !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5_CLEANUP_C':: h5_cleanup_c
+         !DEC$ ENDIF
+         !DEC$ATTRIBUTES reference :: base_name
+         CHARACTER(LEN=*), INTENT(IN) :: base_name
+         INTEGER(SIZE_T) :: base_namelen
+         INTEGER(HID_T), INTENT(IN) :: fapl
+       END FUNCTION h5_cleanup_c
+    END INTERFACE
+    
+    base_namelen = LEN(base_name)
+    hdferr = h5_cleanup_c(base_name, base_namelen, fapl)
+    
+  END SUBROUTINE h5_cleanup_f
+
+!----------------------------------------------------------------------
+! Name:		h5_exit_f
+!
+! Purpose:	Exit application
+!               It is a fortran counterpart for the standard C 'exit()' routine
+! 		Be careful not to overflow the exit value range since
+! 		UNIX supports a very small range such as 1 byte.
+!		Therefore, exit(256) may end up as exit(0).
+!
+! Inputs:
+!		status	- Status to return from application
+!
+! Outputs:
+!		none
+!
+! Programmer:	Quincey Koziol
+!		December 14, 2004
+!
+!
+!----------------------------------------------------------------------
+  SUBROUTINE h5_exit_f(status)
+!
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_TEST_DLL)
+!DEC$attributes dllexport :: h5_exit_f
+!DEC$endif
+    IMPLICIT NONE
+    INTEGER, INTENT(IN) :: status         ! Return code
+
+    INTERFACE
+       SUBROUTINE h5_exit_c(status)
+         !DEC$ IF DEFINED(HDF5F90_WINDOWS)
+         !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5_EXIT_C':: h5_exit_c
+         !DEC$ ENDIF
+         INTEGER, INTENT(IN) :: status
+       END SUBROUTINE h5_exit_c
+    END INTERFACE
+    
+    CALL h5_exit_c(status)
+
+  END SUBROUTINE h5_exit_f
+
+!----------------------------------------------------------------------
+! Name:		h5_env_nocleanup_f
+!
+! Purpose:	Uses the HDF5_NOCLEANUP environment variable in Fortran
+!               tests to determine if the output files should be removed
+!
+! Inputs:
+!
+! Outputs:      HDF5_NOCLEANUP:  .true. - don't remove test files
+!		                .false. - remove test files
+!
+! Programmer:	M.S. Breitenfeld
+!               September 30, 2008
+!
+!----------------------------------------------------------------------
+  SUBROUTINE h5_env_nocleanup_f(HDF5_NOCLEANUP)
+!
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_TEST_DLL)
+!DEC$attributes dllexport :: h5_env_nocleanup_f
+!DEC$endif
+    IMPLICIT NONE
+    LOGICAL, INTENT(OUT) :: HDF5_NOCLEANUP ! Return code
+    INTEGER :: status
+    
+    INTERFACE
+       SUBROUTINE h5_env_nocleanup_c(status)
+         !DEC$ IF DEFINED(HDF5F90_WINDOWS)
+         !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5_ENV_NOCLEANUP_C':: h5_env_nocleanup_c
+         !DEC$ ENDIF
+         INTEGER :: status
+       END SUBROUTINE h5_env_nocleanup_c
+    END INTERFACE
+    
+    CALL h5_env_nocleanup_c(status)
+    
+    HDF5_NOCLEANUP = .FALSE.
+    IF(status.EQ.1) HDF5_NOCLEANUP = .TRUE.
+    
+  END SUBROUTINE h5_env_nocleanup_f
+
+! ---------------------------------------------------------------------------------------------------
+! H5_SIZEOF routines
+!
+! NOTES
+!   (1) The Sun/Oracle compiler has the following restrictions on the SIZEOF intrinsic function:
+!
+!     "The SIZEOF intrinsic cannot be applied to arrays of an assumed size, characters of a 
+!      length that is passed, or subroutine calls or names. SIZEOF returns default INTEGER*4 data. 
+!      If compiling for a 64-bit environment, the compiler will issue a warning if the result overflows 
+!      the INTEGER*4 data range. To use SIZEOF in a 64-bit environment with arrays larger 
+!      than the INTEGER*4 limit (2 Gbytes), the SIZEOF function and 
+!      the variables receiving the result must be declared INTEGER*8."
+!
+!    Thus, we can not overload the H5_SIZEOF function to handle arrays (as used in tH5P_F03.f90), or
+!    characters that do not have a set length (as used in tH5P_F03.f90), sigh...
+!
+!   (2) F08+TS29113 requires C interoperable variable as argument for C_SIZEOF.
+!
+!   (3) Unfortunately we need to wrap the C_SIZEOF/STORAGE_SIZE functions to handle different
+!       data types from the various tests.
+!
+! ---------------------------------------------------------------------------------------------------
+
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_TEST_DLL)
+!DEC$attributes dllexport :: h5_sizeof_cmpd
+!DEC$endif
+  INTEGER(C_SIZE_T) FUNCTION H5_SIZEOF_CMPD(a)
+    IMPLICIT NONE
+    TYPE(comp_datatype), INTENT(in) :: a
+
+#ifdef H5_FORTRAN_FORTRAN_HAVE_C_SIZEOF
+    H5_SIZEOF_CMPD = C_SIZEOF(a)
+#else
+    H5_SIZEOF_CMPD = SIZEOF(a)
+#endif
+
+  END FUNCTION H5_SIZEOF_CMPD
+
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_TEST_DLL)
+!DEC$attributes dllexport :: h5_sizeof_chr
+!DEC$endif
+  INTEGER(C_SIZE_T) FUNCTION H5_SIZEOF_CHR(a)
+    IMPLICIT NONE
+    CHARACTER(LEN=1), INTENT(in) :: a
+
+#ifdef H5_FORTRAN_HAVE_STORAGE_SIZE
+    H5_SIZEOF_CHR = storage_size(a, c_size_t)/storage_size(c_char_'a',c_size_t)
+#else
+    H5_SIZEOF_CHR = SIZEOF(a)
+#endif
+
+  END FUNCTION H5_SIZEOF_CHR
+
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_TEST_DLL)
+!DEC$attributes dllexport :: h5_sizeof_i
+!DEC$endif
+  INTEGER(C_SIZE_T) FUNCTION H5_SIZEOF_I(a)
+    IMPLICIT NONE
+    INTEGER, INTENT(in):: a
+
+#ifdef H5_FORTRAN_HAVE_STORAGE_SIZE
+    H5_SIZEOF_I = storage_size(a, c_size_t)/storage_size(c_char_'a',c_size_t)
+#else
+    H5_SIZEOF_I = SIZEOF(a)
+#endif
+
+  END FUNCTION H5_SIZEOF_I
+
+
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_TEST_DLL)
+!DEC$attributes dllexport :: h5_sizeof_sp
+!DEC$endif
+  INTEGER(C_SIZE_T) FUNCTION H5_SIZEOF_SP(a)
+    IMPLICIT NONE
+    REAL(sp), INTENT(in):: a
+
+#ifdef H5_FORTRAN_HAVE_STORAGE_SIZE
+    H5_SIZEOF_SP = storage_size(a, c_size_t)/storage_size(c_char_'a',c_size_t)
+#else
+    H5_SIZEOF_SP = SIZEOF(a)
+#endif
+
+  END FUNCTION H5_SIZEOF_SP
+
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_TEST_DLL)
+!DEC$attributes dllexport :: h5_sizeof_dp
+!DEC$endif
+  INTEGER(C_SIZE_T) FUNCTION H5_SIZEOF_DP(a)
+    IMPLICIT NONE
+    REAL(dp), INTENT(in):: a
+
+#ifdef H5_FORTRAN_HAVE_STORAGE_SIZE
+    H5_SIZEOF_DP = storage_size(a, c_size_t)/storage_size(c_char_'a',c_size_t)
+#else
+    H5_SIZEOF_DP = SIZEOF(a)
+#endif
+
+  END FUNCTION H5_SIZEOF_DP
+
+END MODULE TH5_MISC
diff --git a/fortran/test/tf.f90 b/fortran/test/tf.f90
deleted file mode 100644
index 450daf2..0000000
--- a/fortran/test/tf.f90
+++ /dev/null
@@ -1,393 +0,0 @@
-!****h* root/fortran/test/tf.f90
-!
-! NAME
-!  tf.f90
-!
-! FUNCTION
-!  Contains subroutines which are needed in all the hdf5 fortran tests
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! CONTAINS SUBROUTINES
-!  write_test_status, check, verify, verifyLogical, verifyString, h5_fixname_f,
-!  h5_cleanup_f, h5_exit_f, h5_env_nocleanup_f,dreal_eqv
-!
-!*****
-MODULE TH5_MISC
-
-  USE TH5_MISC_PROVISIONAL
-
-  IMPLICIT NONE
-
-CONTAINS
-
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: dreal_eq
-!DEC$endif
-  LOGICAL FUNCTION dreal_eq(a,b)
-
-    ! Check if two double precision reals are equivalent
-    REAL(dp), INTENT (in):: a,b
-    REAL(dp), PARAMETER :: eps = 1.e-8
-    dreal_eq = ABS(a-b) .LT. eps
-
-  END FUNCTION dreal_eq
-
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: verify_real_kind_7
-!DEC$endif
-  SUBROUTINE verify_real_kind_7(string,value,correct_value,total_error)
-    USE HDF5
-    INTEGER, PARAMETER :: real_kind_7 = SELECTED_REAL_KIND(Fortran_REAL_4) !should map to REAL*4 on most modern processors
-    CHARACTER(LEN=*) :: string
-    REAL(real_kind_7) :: value, correct_value
-    INTEGER :: total_error
-    IF (.NOT.dreal_eq( REAL(value,dp), REAL(correct_value, dp)) ) THEN
-       total_error=total_error+1
-       WRITE(*,*) "ERROR: INCORRECT REAL VALIDATION ", string
-    ENDIF
-    RETURN
-  END SUBROUTINE verify_real_kind_7
-
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: write_test_status
-!DEC$endif
-  SUBROUTINE write_test_status( test_result, test_title, total_error)
-
-    ! Writes the results of the tests
-
-    IMPLICIT NONE
-
-    INTEGER, INTENT(IN) :: test_result  ! negative,  --skip --
-                                        ! 0       ,   passed
-                                        ! positive,   failed
-
-    CHARACTER(LEN=*), INTENT(IN) :: test_title ! Short description of test
-    INTEGER, INTENT(INOUT) :: total_error ! Accumulated error
-
-! Controls the output style for reporting test results
-
-    CHARACTER(LEN=8) :: error_string
-    CHARACTER(LEN=8), PARAMETER :: success = ' PASSED '
-    CHARACTER(LEN=8), PARAMETER :: failure = '*FAILED*'
-    CHARACTER(LEN=8), PARAMETER :: skip    = '--SKIP--'
-    
-
-    error_string = failure
-    IF (test_result ==  0) THEN
-       error_string = success
-    ELSE IF (test_result == -1) THEN
-       error_string = skip
-    ENDIF
-
-    WRITE(*, fmt = '(A, T72, A)') test_title, error_string
-
-    IF(test_result.GT.0) total_error = total_error + test_result
-
-  END SUBROUTINE write_test_status
-
-
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: check
-!DEC$endif
-  SUBROUTINE check(string,error,total_error)
-    CHARACTER(LEN=*) :: string
-    INTEGER :: error, total_error
-    IF (error .LT. 0) THEN
-       total_error=total_error+1
-       WRITE(*,*) string, " FAILED"
-    ENDIF
-    RETURN
-  END SUBROUTINE check
-
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: verify
-!DEC$endif
-  SUBROUTINE VERIFY(string,value,correct_value,total_error)
-    CHARACTER(LEN=*) :: string
-    INTEGER :: value, correct_value, total_error
-    IF (value .NE. correct_value) THEN
-       total_error=total_error+1
-       WRITE(*,*) "ERROR: INCORRECT VALIDATION ", string
-    ENDIF
-    RETURN
-  END SUBROUTINE verify
-
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: verify_INTEGER_HID_T
-!DEC$endif
-  SUBROUTINE verify_INTEGER_HID_T(string,value,correct_value,total_error)
-    USE HDF5	
-    CHARACTER(LEN=*) :: string
-    INTEGER(HID_T) :: value, correct_value
-    INTEGER :: total_error
-    IF (value .NE. correct_value) THEN
-       total_error=total_error+1
-       WRITE(*,*) "ERROR: INCORRECT VALIDATION ", string
-    ENDIF
-    RETURN
-  END SUBROUTINE verify_INTEGER_HID_T
-
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: verify_Fortran_INTEGER_4
-!DEC$endif
-  SUBROUTINE verify_Fortran_INTEGER_4(string,value,correct_value,total_error)
-    USE HDF5
-    INTEGER, PARAMETER :: int_kind_8 = SELECTED_INT_KIND(Fortran_INTEGER_4)  ! should map to INTEGER*4 on most modern processors	
-    CHARACTER(LEN=*) :: string
-    INTEGER(int_kind_8) :: value, correct_value
-    INTEGER :: total_error
-    IF (value .NE. correct_value) THEN
-       total_error=total_error+1
-       WRITE(*,*) "ERROR: INCORRECT VALIDATION ", string
-    ENDIF
-    RETURN
-  END SUBROUTINE verify_Fortran_INTEGER_4
-
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: verifyLogical
-!DEC$endif
-  SUBROUTINE verifyLogical(string,value,correct_value,total_error)
-    CHARACTER(LEN=*) :: string
-    LOGICAL :: value, correct_value
-    INTEGER :: total_error
-    IF (value .NEQV. correct_value) THEN
-       total_error = total_error + 1
-       WRITE(*,*) "ERROR: INCORRECT VALIDATION ", string
-    ENDIF
-    RETURN
-  END SUBROUTINE verifyLogical
-  
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: verifyString
-!DEC$endif
-  SUBROUTINE verifyString(string, value,correct_value,total_error)
-    CHARACTER*(*) :: string
-    CHARACTER*(*) :: value, correct_value
-    INTEGER :: total_error
-    IF (TRIM(value) .NE. TRIM(correct_value)) THEN
-       total_error = total_error + 1
-       WRITE(*,*) "ERROR: INCORRECT VALIDATION ", string
-    ENDIF
-    RETURN
-  END SUBROUTINE verifyString
-
-
-!----------------------------------------------------------------------
-! Name:		h5_fixname_f
-!
-! Purpose:	Create a file name from the a file base name.
-!               It is a fortran counterpart for the h5_fixname in ../../test/h5test.c
-!
-! Inputs:
-!		base_name	- base name of the file
-!               fapl		- file access property list
-! Outputs:
-!		full_name	- full file name
-!		hdferr:		- error code
-!				 	Success:  0
-!				 	Failure: -1
-!
-! Programmer:	Elena Pourmal
-!		September 13, 2002
-!
-!
-!----------------------------------------------------------------------
-  SUBROUTINE h5_fixname_f(base_name, full_name, fapl, hdferr)
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: h5_fixname_f
-!DEC$endif
-    USE H5GLOBAL
-    IMPLICIT NONE
-    CHARACTER(LEN=*), INTENT(IN) :: base_name   ! base name
-    CHARACTER(LEN=*), INTENT(IN) :: full_name   ! full name
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-    INTEGER(HID_T), INTENT(IN) :: fapl ! file access property list
-
-    INTEGER(SIZE_T) :: base_namelen ! Length of the base name character string
-    INTEGER(SIZE_T) :: full_namelen ! Length of the full name character string
-!            INTEGER(HID_T) :: fapl_default
-
-    INTERFACE
-       INTEGER FUNCTION h5_fixname_c(base_name, base_namelen, fapl, &
-            full_name, full_namelen)
-         USE H5GLOBAL
-         !DEC$ IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5_FIXNAME_C':: h5_fixname_c
-         !DEC$ ENDIF
-         !DEC$ATTRIBUTES reference :: base_name
-         !DEC$ATTRIBUTES reference :: full_name
-         CHARACTER(LEN=*), INTENT(IN) :: base_name
-         INTEGER(SIZE_T) :: base_namelen
-         INTEGER(HID_T), INTENT(IN) :: fapl
-         CHARACTER(LEN=*), INTENT(IN) :: full_name
-         INTEGER(SIZE_T) :: full_namelen
-       END FUNCTION h5_fixname_c
-    END INTERFACE
-
-    base_namelen = LEN(base_name)
-    full_namelen = LEN(full_name)
-    hdferr = h5_fixname_c(base_name, base_namelen, fapl, &
-         full_name, full_namelen)
-  
-  END SUBROUTINE h5_fixname_f
-
-!----------------------------------------------------------------------
-! Name:		h5_cleanup_f
-!
-! Purpose:	Cleanups tests files
-!               It is a fortran counterpart for the h5_cleanup in ../../test/h5test.c
-!
-! Inputs:
-!		base_name	- base name of the file
-!               fapl		- file access property list
-! Outputs:
-!		hdferr:		- error code
-!				 	Success:  0
-!				 	Failure: -1
-!
-! Programmer:	Elena Pourmal
-!		September 19, 2002
-!
-!
-!----------------------------------------------------------------------
-  SUBROUTINE h5_cleanup_f(base_name, fapl, hdferr)
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: h5_cleanup_f
-!DEC$endif
-    USE H5GLOBAL
-    IMPLICIT NONE
-    CHARACTER(LEN=*), INTENT(IN) :: base_name   ! base name
-    INTEGER, INTENT(OUT) :: hdferr         ! Error code
-    INTEGER(HID_T), INTENT(IN) :: fapl ! file access property list
-    
-    INTEGER(SIZE_T) :: base_namelen ! Length of the base name character string
-
-    INTERFACE
-       INTEGER FUNCTION h5_cleanup_c(base_name, base_namelen, fapl)
-         USE H5GLOBAL
-         !DEC$ IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5_CLEANUP_C':: h5_cleanup_c
-         !DEC$ ENDIF
-         !DEC$ATTRIBUTES reference :: base_name
-         CHARACTER(LEN=*), INTENT(IN) :: base_name
-         INTEGER(SIZE_T) :: base_namelen
-         INTEGER(HID_T), INTENT(IN) :: fapl
-       END FUNCTION h5_cleanup_c
-    END INTERFACE
-    
-    base_namelen = LEN(base_name)
-    hdferr = h5_cleanup_c(base_name, base_namelen, fapl)
-    
-  END SUBROUTINE h5_cleanup_f
-
-!----------------------------------------------------------------------
-! Name:		h5_exit_f
-!
-! Purpose:	Exit application
-!               It is a fortran counterpart for the standard C 'exit()' routine
-! 		Be careful not to overflow the exit value range since
-! 		UNIX supports a very small range such as 1 byte.
-!		Therefore, exit(256) may end up as exit(0).
-!
-! Inputs:
-!		status	- Status to return from application
-!
-! Outputs:
-!		none
-!
-! Programmer:	Quincey Koziol
-!		December 14, 2004
-!
-!
-!----------------------------------------------------------------------
-  SUBROUTINE h5_exit_f(status)
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: h5_exit_f
-!DEC$endif
-    IMPLICIT NONE
-    INTEGER, INTENT(IN) :: status         ! Return code
-
-    INTERFACE
-       SUBROUTINE h5_exit_c(status)
-         !DEC$ IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5_EXIT_C':: h5_exit_c
-         !DEC$ ENDIF
-         INTEGER, INTENT(IN) :: status
-       END SUBROUTINE h5_exit_c
-    END INTERFACE
-    
-    CALL h5_exit_c(status)
-
-  END SUBROUTINE h5_exit_f
-
-!----------------------------------------------------------------------
-! Name:		h5_env_nocleanup_f
-!
-! Purpose:	Uses the HDF5_NOCLEANUP environment variable in Fortran
-!               tests to determine if the output files should be removed
-!
-! Inputs:
-!
-! Outputs:      HDF5_NOCLEANUP:  .true. - don't remove test files
-!		                .false. - remove test files
-!
-! Programmer:	M.S. Breitenfeld
-!               September 30, 2008
-!
-!----------------------------------------------------------------------
-  SUBROUTINE h5_env_nocleanup_f(HDF5_NOCLEANUP)
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: h5_env_nocleanup_f
-!DEC$endif
-    IMPLICIT NONE
-    LOGICAL, INTENT(OUT) :: HDF5_NOCLEANUP ! Return code
-    INTEGER :: status
-    
-    INTERFACE
-       SUBROUTINE h5_env_nocleanup_c(status)
-         !DEC$ IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ ATTRIBUTES C,reference,decorate,alias:'H5_ENV_NOCLEANUP_C':: h5_env_nocleanup_c
-         !DEC$ ENDIF
-         INTEGER :: status
-       END SUBROUTINE h5_env_nocleanup_c
-    END INTERFACE
-    
-    CALL h5_env_nocleanup_c(status)
-    
-    HDF5_NOCLEANUP = .FALSE.
-    IF(status.EQ.1) HDF5_NOCLEANUP = .TRUE.
-    
-  END SUBROUTINE h5_env_nocleanup_f
-END MODULE TH5_MISC
diff --git a/fortran/test/tf_F03.f90 b/fortran/test/tf_F03.f90
deleted file mode 100644
index b3f1399..0000000
--- a/fortran/test/tf_F03.f90
+++ /dev/null
@@ -1,128 +0,0 @@
-!****h* root/fortran/test/tf_F03.f90
-!
-! NAME
-!  tf_F03.f90
-!
-! FUNCTION
-!  Contains functions that are part of the F2003 standard, and are not F2008 compliant.
-!  Needed by the hdf5 fortran tests.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! CONTAINS SUBROUTINES
-!   H5_SIZEOF
-!
-! NOTES
-!   The Sun/Oracle compiler has the following restrictions on the SIZEOF intrinsic function:
-!
-!     "The SIZEOF intrinsic cannot be applied to arrays of an assumed size, characters of a 
-!      length that is passed, or subroutine calls or names. SIZEOF returns default INTEGER*4 data. 
-!      If compiling for a 64-bit environment, the compiler will issue a warning if the result overflows 
-!      the INTEGER*4 data range. To use SIZEOF in a 64-bit environment with arrays larger 
-!      than the INTEGER*4 limit (2 Gbytes), the SIZEOF function and 
-!      the variables receiving the result must be declared INTEGER*8."
-!
-!    Thus, we can not overload the H5_SIZEOF function to handle arrays (as used in tH5P_F03.f90), or
-!    characters that do not have a set length (as used in tH5P_F03.f90), sigh...
-!
-!*****
-MODULE TH5_MISC_PROVISIONAL
-
-  USE ISO_C_BINDING
-  IMPLICIT NONE
-
-  INTEGER, PARAMETER :: sp = SELECTED_REAL_KIND(5)  ! This should map to REAL*4 on most modern processors
-  INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(10) ! This should map to REAL*8 on most modern processors
-
-  ! generic compound datatype
-  TYPE, BIND(C) :: comp_datatype
-    REAL :: a
-    INTEGER :: x
-    DOUBLE PRECISION :: y
-    CHARACTER(LEN=1) :: z
-  END TYPE comp_datatype
-
-  PUBLIC :: H5_SIZEOF
-  INTERFACE H5_SIZEOF
-     MODULE PROCEDURE H5_SIZEOF_CMPD
-     MODULE PROCEDURE H5_SIZEOF_I, H5_SIZEOF_CHR   
-     MODULE PROCEDURE H5_SIZEOF_SP,H5_SIZEOF_DP
-  END INTERFACE
-
-CONTAINS
-
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: h5_sizeof_cmpd
- !DEC$endif
-  INTEGER(C_SIZE_T) FUNCTION H5_SIZEOF_CMPD(a)
-    IMPLICIT NONE
-    TYPE(comp_datatype), INTENT(in) :: a
-
-    H5_SIZEOF_CMPD = SIZEOF(a)
-
-  END FUNCTION H5_SIZEOF_CMPD
-
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: h5_sizeof_chr
-!DEC$endif
-  INTEGER(C_SIZE_T) FUNCTION H5_SIZEOF_CHR(a)
-    IMPLICIT NONE
-    CHARACTER(LEN=1), INTENT(in):: a
-
-    H5_SIZEOF_CHR = SIZEOF(a)
-
-  END FUNCTION H5_SIZEOF_CHR
-
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: h5_sizeof_i
-!DEC$endif
-  INTEGER(C_SIZE_T) FUNCTION H5_SIZEOF_I(a)
-    IMPLICIT NONE
-    INTEGER, INTENT(in):: a
-
-    H5_SIZEOF_I = SIZEOF(a)
-
-  END FUNCTION H5_SIZEOF_I
-
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: h5_sizeof_sp
-!DEC$endif
-  INTEGER(C_SIZE_T) FUNCTION H5_SIZEOF_SP(a)
-    IMPLICIT NONE
-    REAL(sp), INTENT(in):: a
-
-    H5_SIZEOF_SP = SIZEOF(a)
-
-  END FUNCTION H5_SIZEOF_SP
-
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: h5_sizeof_dp
-!DEC$endif
-  INTEGER(C_SIZE_T) FUNCTION H5_SIZEOF_DP(a)
-    IMPLICIT NONE
-    REAL(dp), INTENT(in):: a
-
-    H5_SIZEOF_DP = SIZEOF(a)
-
-  END FUNCTION H5_SIZEOF_DP
-
-END MODULE TH5_MISC_PROVISIONAL
diff --git a/fortran/test/tf_F08.f90 b/fortran/test/tf_F08.f90
deleted file mode 100644
index 20c2859..0000000
--- a/fortran/test/tf_F08.f90
+++ /dev/null
@@ -1,128 +0,0 @@
-!****h* root/fortran/test/tf_F08.f90
-!
-! NAME
-!  tf_F08.f90
-!
-! FUNCTION
-!  Contains functions that are part of the F2008 standard and needed by 
-!  the hdf5 fortran tests.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-! CONTAINS SUBROUTINES
-!   H5_SIZEOF
-!
-! NOTES
-!   This file contains "sizeof" functions that are F2008 standard compliant
-!   and replace the non-standard 'SIZEOF' functions found in the file tf_F03.
-!   Unfortunity we need to wrap the C_SIZEOF/STORAGE_SIZE functions to handle different
-!   data types from the various tests.
-!
-!   F08+TS29113 requires C interoperable variable as argument for C_SIZEOF.
-!   
-!   This file will be build instead of tf_F03.f90 if the intrinsic fortran 
-!   function C_SIZEOF/STORAGE_SIZE is found during configure.
-!
-!*****
-MODULE TH5_MISC_PROVISIONAL
-
-  USE ISO_C_BINDING
-  IMPLICIT NONE
-
-  INTEGER, PARAMETER :: sp = SELECTED_REAL_KIND(5)  ! This should map to REAL*4 on most modern processors
-  INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(10) ! This should map to REAL*8 on most modern processors
-
-  ! generic compound datatype
-  TYPE, BIND(C) :: comp_datatype
-    REAL :: a
-    INTEGER :: x
-    DOUBLE PRECISION :: y
-    CHARACTER(LEN=1) :: z
-  END TYPE comp_datatype
-
-  PUBLIC :: H5_SIZEOF
-  INTERFACE H5_SIZEOF
-     MODULE PROCEDURE H5_SIZEOF_CMPD
-     MODULE PROCEDURE H5_SIZEOF_CHR
-     MODULE PROCEDURE H5_SIZEOF_I
-     MODULE PROCEDURE H5_SIZEOF_SP,H5_SIZEOF_DP
-  END INTERFACE
-
-CONTAINS
-
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: h5_sizeof_cmpd
-!DEC$endif
-  INTEGER(C_SIZE_T) FUNCTION H5_SIZEOF_CMPD(a)
-    IMPLICIT NONE
-    TYPE(comp_datatype), INTENT(in) :: a
-
-    H5_SIZEOF_CMPD = C_SIZEOF(a)
-
-  END FUNCTION H5_SIZEOF_CMPD
-
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: h5_sizeof_chr
-!DEC$endif
-  INTEGER(C_SIZE_T) FUNCTION H5_SIZEOF_CHR(a)
-    IMPLICIT NONE
-    CHARACTER(LEN=*), INTENT(in) :: a
-
-    H5_SIZEOF_CHR = storage_size(a, c_size_t)/storage_size(c_char_'a',c_size_t)
-
-  END FUNCTION H5_SIZEOF_CHR
-
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: h5_sizeof_i
-!DEC$endif
-  INTEGER(C_SIZE_T) FUNCTION H5_SIZEOF_I(a)
-    IMPLICIT NONE
-    INTEGER, INTENT(in):: a
-
-    H5_SIZEOF_I = storage_size(a, c_size_t)/storage_size(c_char_'a',c_size_t)
-
-  END FUNCTION H5_SIZEOF_I
-
-
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: h5_sizeof_sp
-!DEC$endif
-  INTEGER(C_SIZE_T) FUNCTION H5_SIZEOF_SP(a)
-    IMPLICIT NONE
-    REAL(sp), INTENT(in):: a
-
-    H5_SIZEOF_SP = storage_size(a, c_size_t)/storage_size(c_char_'a',c_size_t)
-
-  END FUNCTION H5_SIZEOF_SP
-
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_TEST_DLL)
-!DEC$attributes dllexport :: h5_sizeof_dp
-!DEC$endif
-  INTEGER(C_SIZE_T) FUNCTION H5_SIZEOF_DP(a)
-    IMPLICIT NONE
-    REAL(dp), INTENT(in):: a
-
-    H5_SIZEOF_DP = storage_size(a, c_size_t)/storage_size(c_char_'a',c_size_t)
-
-  END FUNCTION H5_SIZEOF_DP
-
-END MODULE TH5_MISC_PROVISIONAL
diff --git a/fortran/test/tf_F90.f90 b/fortran/test/tf_F90.f90
deleted file mode 100644
index 11a047c..0000000
--- a/fortran/test/tf_F90.f90
+++ /dev/null
@@ -1,33 +0,0 @@
-!****h* root/fortran/test/tf_F90.f90
-!
-! NAME
-!  tf_F90.f90
-!
-! FUNCTION
-!  Module for when the compiler is not F2003 or F2008 compliant. 
-!  Needed by tf.f90 for the test programs.
-!
-! COPYRIGHT
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!*****
-MODULE TH5_MISC_PROVISIONAL
-  IMPLICIT NONE
-
-  INTEGER, PARAMETER :: sp = KIND(0.0)
-  INTEGER, PARAMETER :: dp = KIND(0.D0)
-
-END MODULE TH5_MISC_PROVISIONAL
diff --git a/fortran/testpar/Makefile.am b/fortran/testpar/Makefile.am
index 517a3c8..380f475 100644
--- a/fortran/testpar/Makefile.am
+++ b/fortran/testpar/Makefile.am
@@ -50,4 +50,4 @@ LDADD=$(LIBH5FTEST) $(LIBH5TEST) $(LIBH5F) $(LIBHDF5)
 # Mark this directory as part of the Fortran API
 FORTRAN_API=yes
 
-include $(top_srcdir)/config/conclude.am
+include $(top_srcdir)/config/conclude_fc.am
diff --git a/fortran/testpar/Makefile.in b/fortran/testpar/Makefile.in
index f16dfff..5275564 100644
--- a/fortran/testpar/Makefile.in
+++ b/fortran/testpar/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -30,8 +30,22 @@
 #
 # HDF5 Fortran Parallel Library Test Makefile(.in)
 #
+
+# Makefile.am include fragment with Fortran helper rules and macros.
+
+# AM_FCCPPFLAGS, FCCPPFLAGS are currently not used.
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -94,10 +108,6 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(top_srcdir)/bin/test-driver
 
 # Some Fortran compilers can't build shared libraries, so sometimes we
 # want to build a shared C library and a static Fortran library.  If so,
@@ -110,11 +120,16 @@ TESTS =
 subdir = fortran/testpar
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 am__EXEEXT_1 = parallel_test$(EXEEXT)
@@ -140,7 +155,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 FCCOMPILE = $(FC) $(AM_FCFLAGS) $(FCFLAGS)
 LTFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS)
@@ -382,6 +397,10 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am \
+	$(top_srcdir)/config/conclude_fc.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -403,7 +422,6 @@ AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@ -I$(top_srcdir)/fortran/src \
 	$(F9XMODFLAG)$(top_builddir)/fortran/src \
 	$(F9XMODFLAG)$(top_builddir)/fortran/test
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@ $(am__append_1)
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -448,14 +466,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -465,13 +491,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -513,9 +538,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -667,6 +703,8 @@ LDADD = $(LIBH5FTEST) $(LIBH5TEST) $(LIBH5F) $(LIBHDF5)
 
 # Mark this directory as part of the Fortran API
 FORTRAN_API = yes
+PPFCCOMPILE = $(FC) $(FCDEFS) $(DEFAULT_INCLUDES)  $(FCINCLUDES) $(AM_FCCPPFLAGS) $(FCCPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)
+LTPPFCCOMPILE = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(PPFCCOMPILE)
 
 # Automake needs to be taught how to build lib, progs, and tests targets.
 # These will be filled in automatically for the most part (e.g.,
@@ -690,8 +728,8 @@ TEST_SCRIPT_PARA_CHKSH = $(TEST_SCRIPT_PARA:=.chkexe_)
 all: all-am
 
 .SUFFIXES:
-.SUFFIXES: .f90 .lo .log .o .obj .sh .sh$(EXEEXT) .trs
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
+.SUFFIXES: .F90 .f90 .lo .log .o .obj .sh .sh$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude_fc.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
@@ -703,7 +741,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign fortran/testpar/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign fortran/testpar/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -712,7 +749,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude_fc.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -742,9 +779,6 @@ mostlyclean-compile:
 distclean-compile:
 	-rm -f *.tab.c
 
-.f90.o:
-	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
-
 .f90.obj:
 	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) `$(CYGPATH_W) '$<'`
 
@@ -839,7 +873,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1108,6 +1142,8 @@ uninstall-am:
 	mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
@@ -1120,6 +1156,12 @@ uninstall-am:
 help:
 	@$(top_srcdir)/bin/makehelp
 
+# Treat all .f90 and .F90 files as preprocessed Fortran.
+.f90.o:
+	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+.F90.o:
+	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
 build-lib: $(LIB)
diff --git a/hl/Makefile.in b/hl/Makefile.in
index 60c9453..5bc9fed 100644
--- a/hl/Makefile.in
+++ b/hl/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -35,7 +35,17 @@
 #
 # HDF5 High-Level Makefile(.in)
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -98,19 +108,20 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(top_srcdir)/bin/test-driver COPYING
 TESTS =
 subdir = hl
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_P = $(am__v_P_ at AM_V@)
@@ -366,6 +377,9 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am COPYING
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 am__relativize = \
   dir0=`pwd`; \
@@ -407,7 +421,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -452,14 +465,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -469,13 +490,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -517,9 +537,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -697,7 +728,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign hl/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -706,7 +736,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -852,7 +882,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1144,6 +1174,8 @@ uninstall-am:
 	mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/hl/c++/Makefile.in b/hl/c++/Makefile.in
index 278f97b..2f05f8a 100644
--- a/hl/c++/Makefile.in
+++ b/hl/c++/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -31,7 +31,17 @@
 # High-Level API C++ Makefile(.in)
 # 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -94,19 +104,20 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(top_srcdir)/bin/test-driver COPYING
 TESTS =
 subdir = hl/c++
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_P = $(am__v_P_ at AM_V@)
@@ -362,6 +373,9 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am COPYING
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 am__relativize = \
   dir0=`pwd`; \
@@ -403,7 +417,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -448,14 +461,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -465,13 +486,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -513,9 +533,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -691,7 +722,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/c++/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign hl/c++/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -700,7 +730,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -846,7 +876,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1138,6 +1168,8 @@ uninstall-am:
 	mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/hl/c++/examples/Makefile.am b/hl/c++/examples/Makefile.am
index f90dea9..7202a96 100644
--- a/hl/c++/examples/Makefile.am
+++ b/hl/c++/examples/Makefile.am
@@ -35,8 +35,8 @@ CXX_API=yes
 
 # Where to install examples
 # Note: no '/' after DESTDIR.  Explanation in commence.am
-EXAMPLEDIR=${DESTDIR}$(datarootdir)/hdf5_examples/hl/c++
-EXAMPLETOPDIR=${DESTDIR}$(datarootdir)/hdf5_examples/hl
+EXAMPLEDIR=${DESTDIR}$(exec_prefix)/share/hdf5_examples/hl/c++
+EXAMPLETOPDIR=${DESTDIR}$(exec_prefix)/share/hdf5_examples/hl
 
 # How to build programs using h5c++
 $(EXTRA_PROG): $(H5CPP)
diff --git a/hl/c++/examples/Makefile.in b/hl/c++/examples/Makefile.in
index e33019c..7f1d5c7 100644
--- a/hl/c++/examples/Makefile.in
+++ b/hl/c++/examples/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -35,7 +35,17 @@
 # built using h5cc (or h5fc, etc.) instead of the standard compilers.
 # This creates some extra work for us.
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -98,20 +108,20 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/examples.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/run-hlc++-ex.sh.in $(top_srcdir)/bin/test-driver
 TESTS =
 subdir = hl/c++/examples
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES = run-hlc++-ex.sh
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_P = $(am__v_P_ at AM_V@)
@@ -334,6 +344,10 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/run-hlc++-ex.sh.in \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am \
+	$(top_srcdir)/config/examples.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -350,7 +364,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -395,14 +408,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -412,13 +433,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -460,9 +480,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -615,8 +646,8 @@ CXX_API = yes
 
 # Where to install examples
 # Note: no '/' after DESTDIR.  Explanation in commence.am
-EXAMPLEDIR = ${DESTDIR}$(datarootdir)/hdf5_examples/hl/c++
-EXAMPLETOPDIR = ${DESTDIR}$(datarootdir)/hdf5_examples/hl
+EXAMPLEDIR = ${DESTDIR}$(exec_prefix)/share/hdf5_examples/hl/c++
+EXAMPLETOPDIR = ${DESTDIR}$(exec_prefix)/share/hdf5_examples/hl
 
 # Assume that all tests in this directory are examples, and tell
 # conclude.am when to build them.
@@ -661,7 +692,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/c++/examples/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign hl/c++/examples/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -670,7 +700,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/examples.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/examples.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -725,7 +755,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -993,6 +1023,8 @@ uninstall-am: uninstall-local
 	pdf-am ps ps-am recheck tags-am uninstall uninstall-am \
 	uninstall-local
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/hl/c++/examples/run-hlc++-ex.sh.in b/hl/c++/examples/run-hlc++-ex.sh.in
index c3f9ce3..5aa1032 100644
--- a/hl/c++/examples/run-hlc++-ex.sh.in
+++ b/hl/c++/examples/run-hlc++-ex.sh.in
@@ -33,7 +33,7 @@ EXIT_SUCCESS=0
 EXIT_FAILURE=1
 # Where the tool is installed.
 # default is relative path to installed location of the tools
-prefix="${prefix:-../../../..}"
+prefix="${prefix:- at prefix@}"
 AR="@AR@"
 RANLIB="@RANLIB@"
 H5TOOL="h5c++"                  # The tool name
diff --git a/hl/c++/src/CMakeLists.txt b/hl/c++/src/CMakeLists.txt
index 8740737..e37c5ba 100644
--- a/hl/c++/src/CMakeLists.txt
+++ b/hl/c++/src/CMakeLists.txt
@@ -34,7 +34,7 @@ if (BUILD_SHARED_LIBS)
       ${HDF5_LIBSH_TARGET}
   )
   set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_HL_CPP_LIBSH_TARGET}")
-  H5_SET_LIB_OPTIONS (${HDF5_HL_CPP_LIBSH_TARGET} ${HDF5_HL_CPP_LIB_NAME} SHARED ${HDF5_HL_CXX_PACKAGE_SOVERSION})
+  H5_SET_LIB_OPTIONS (${HDF5_HL_CPP_LIBSH_TARGET} ${HDF5_HL_CPP_LIB_NAME} SHARED)
   set_target_properties (${HDF5_HL_CPP_LIBSH_TARGET} PROPERTIES
       FOLDER libraries/hl
       COMPILE_DEFINITIONS "H5_BUILT_AS_DYNAMIC_LIB"
@@ -45,7 +45,7 @@ if (BUILD_SHARED_LIBS)
 endif (BUILD_SHARED_LIBS)
 
 #-----------------------------------------------------------------------------
-# Add file(s) to CMake Install
+# Add file(s) to CMake Install 
 #-----------------------------------------------------------------------------
 install (
     FILES
@@ -63,7 +63,7 @@ if (HDF5_EXPORTED_TARGETS)
   if (BUILD_SHARED_LIBS)
     INSTALL_TARGET_PDB (${HDF5_HL_CPP_LIBSH_TARGET} ${HDF5_INSTALL_BIN_DIR} hlcpplibraries)
   endif (BUILD_SHARED_LIBS)
-
+  
   install (
       TARGETS
           ${install_targets}
diff --git a/hl/c++/src/H5PacketTable.cpp b/hl/c++/src/H5PacketTable.cpp
index 2a491de..74b8029 100644
--- a/hl/c++/src/H5PacketTable.cpp
+++ b/hl/c++/src/H5PacketTable.cpp
@@ -34,7 +34,7 @@
      * Opens an existing packet table, which can contain either fixed-length or
      * variable-length packets.
      */
-    PacketTable::PacketTable(hid_t fileID, const char* name)
+    PacketTable::PacketTable(hid_t fileID, char* name)
     {
         table_id = H5PTopen( fileID, name);
     }
@@ -127,7 +127,7 @@
      * the packet table, the ID of the datatype of the set, and the size
      * of a memory chunk used in chunking.
      */
-    FL_PacketTable::FL_PacketTable(hid_t fileID, const char* name, hid_t dtypeID, hsize_t chunkSize, int compression)
+    FL_PacketTable::FL_PacketTable(hid_t fileID, char* name, hid_t dtypeID, hsize_t chunkSize, int compression)
     {
         table_id = H5PTcreate_fl ( fileID, name, dtypeID, chunkSize, compression);
     }
@@ -136,7 +136,7 @@
      * Opens an existing fixed-length packet table.
      * Fails if the packet table specified is variable-length.
      */
-    FL_PacketTable::FL_PacketTable(hid_t fileID, const char* name) : PacketTable(fileID, name)
+    FL_PacketTable::FL_PacketTable(hid_t fileID, char* name) : PacketTable(fileID, name)
     {
 #ifdef VLPT_REMOVED
         if( H5PTis_varlen(table_id) != 0 )    // If this is not a fixed-length table
diff --git a/hl/c++/src/H5PacketTable.h b/hl/c++/src/H5PacketTable.h
index c7c7fc0..5f9a213 100644
--- a/hl/c++/src/H5PacketTable.h
+++ b/hl/c++/src/H5PacketTable.h
@@ -42,7 +42,7 @@ public:
      * Opens an existing packet table, which can contain either fixed-length or
      * variable-length packets.
      */
-    PacketTable(hid_t fileID, const char* name);
+    PacketTable(hid_t fileID, char* name);
 
     /* Destructor
      * Cleans up the packet table
@@ -110,13 +110,13 @@ public:
      * of a memory chunk used in chunking, and the desired compression level
      * (0-9, or -1 for no compression).
      */
-    FL_PacketTable(hid_t fileID, const char* name, hid_t dtypeID, hsize_t chunkSize, int compression = -1);
+    FL_PacketTable(hid_t fileID, char* name, hid_t dtypeID, hsize_t chunkSize, int compression = -1);
 
     /* "Open" Constructor
      * Opens an existing fixed-length packet table.
      * Fails if the packet table specified is variable-length.
      */
-    FL_PacketTable(hid_t fileID, const char* name);
+    FL_PacketTable(hid_t fileID, char* name);
 
     /* AppendPacket
      * Adds a single packet to the packet table.  Takes a pointer
diff --git a/hl/c++/src/Makefile.am b/hl/c++/src/Makefile.am
index c78f5fa..b268948 100644
--- a/hl/c++/src/Makefile.am
+++ b/hl/c++/src/Makefile.am
@@ -28,7 +28,7 @@ AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/hl/src
 lib_LTLIBRARIES=libhdf5_hl_cpp.la
 
 # Add libtool numbers to the HDF5 HL C++ library (from config/lt_vers.am)
-libhdf5_hl_cpp_la_LDFLAGS= -version-info $(LT_HL_CXX_VERS_INTERFACE):$(LT_HL_CXX_VERS_REVISION):$(LT_HL_CXX_VERS_AGE) $(AM_LDFLAGS)
+libhdf5_hl_cpp_la_LDFLAGS= -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
 
 # Source files for the library
 # At the moment, only the H5PT Packet Table has a C++ API.
diff --git a/hl/c++/src/Makefile.in b/hl/c++/src/Makefile.in
index d6c0035..c6a967c 100644
--- a/hl/c++/src/Makefile.in
+++ b/hl/c++/src/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -33,7 +33,17 @@
 
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -96,21 +106,21 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/lt_vers.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(top_srcdir)/bin/depcomp $(include_HEADERS) \
-	$(top_srcdir)/bin/test-driver
 TESTS =
 subdir = hl/c++/src
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \
+	$(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
@@ -165,7 +175,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -387,6 +397,10 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/depcomp \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am \
+	$(top_srcdir)/config/lt_vers.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -406,7 +420,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -451,14 +464,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -468,13 +489,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -516,9 +536,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -661,33 +692,15 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2
 # See libtool versioning documentation online.
 # After making changes, run bin/reconfigure to update other configure related
 # files like Makefile.in.
-LT_VERS_INTERFACE = 11
-LT_VERS_REVISION = 0
-LT_VERS_AGE = 1
-LT_CXX_VERS_INTERFACE = 11
-LT_CXX_VERS_REVISION = 0
-LT_CXX_VERS_AGE = 0
-LT_F_VERS_INTERFACE = 10
-LT_F_VERS_REVISION = 2
-LT_F_VERS_AGE = 0
-LT_HL_VERS_INTERFACE = 10
-LT_HL_VERS_REVISION = 2
-LT_HL_VERS_AGE = 0
-LT_HL_CXX_VERS_INTERFACE = 11
-LT_HL_CXX_VERS_REVISION = 0
-LT_HL_CXX_VERS_AGE = 0
-LT_HL_F_VERS_INTERFACE = 10
-LT_HL_F_VERS_REVISION = 2
-LT_HL_F_VERS_AGE = 0
-LT_TOOLS_VERS_INTERFACE = 10
-LT_TOOLS_VERS_REVISION = 2
-LT_TOOLS_VERS_AGE = 0
+LT_VERS_INTERFACE = 100
+LT_VERS_REVISION = 900
+LT_VERS_AGE = 0
 
 # This is our main target
 lib_LTLIBRARIES = libhdf5_hl_cpp.la
 
 # Add libtool numbers to the HDF5 HL C++ library (from config/lt_vers.am)
-libhdf5_hl_cpp_la_LDFLAGS = -version-info $(LT_HL_CXX_VERS_INTERFACE):$(LT_HL_CXX_VERS_REVISION):$(LT_HL_CXX_VERS_AGE) $(AM_LDFLAGS)
+libhdf5_hl_cpp_la_LDFLAGS = -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
 
 # Source files for the library
 # At the moment, only the H5PT Packet Table has a C++ API.
@@ -734,7 +747,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/c++/src/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign hl/c++/src/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -743,7 +755,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/lt_vers.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/lt_vers.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -930,7 +942,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1205,6 +1217,8 @@ uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am \
 	uninstall-includeHEADERS uninstall-libLTLIBRARIES
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/hl/c++/test/Makefile.in b/hl/c++/test/Makefile.in
index b7d7d09..7b67a5f 100644
--- a/hl/c++/test/Makefile.in
+++ b/hl/c++/test/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -31,7 +31,17 @@
 # HDF5-C++ Makefile(.in)
 #
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -94,20 +104,21 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(top_srcdir)/bin/depcomp $(top_srcdir)/bin/test-driver
 check_PROGRAMS = $(am__EXEEXT_1)
 TESTS = $(am__EXEEXT_1)
 subdir = hl/c++/test
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 am__EXEEXT_1 = ptableTest$(EXEEXT)
@@ -132,7 +143,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -382,6 +393,9 @@ am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
 TEST_LOGS = $(am__test_logs2:.sh.log=.log)
 SH_LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
 SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/depcomp \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -403,7 +417,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -448,14 +461,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -465,13 +486,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -513,9 +533,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -700,7 +731,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/c++/test/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign hl/c++/test/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -709,7 +739,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -850,7 +880,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1128,6 +1158,8 @@ uninstall-am:
 	mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/hl/examples/Makefile.am b/hl/examples/Makefile.am
index dfac22a..ba200ed 100644
--- a/hl/examples/Makefile.am
+++ b/hl/examples/Makefile.am
@@ -27,8 +27,8 @@ endif
 
 # Example directory
 # Note: no '/' after DESTDIR.  Explanation in commence.am
-EXAMPLEDIR=${DESTDIR}$(datarootdir)/hdf5_examples/hl/c
-EXAMPLETOPDIR=${DESTDIR}$(datarootdir)/hdf5_examples/hl
+EXAMPLEDIR=${DESTDIR}$(exec_prefix)/share/hdf5_examples/hl/c
+EXAMPLETOPDIR=${DESTDIR}$(exec_prefix)/share/hdf5_examples/hl
 INSTALL_SCRIPT_FILES = run-hlc-ex.sh
 INSTALL_TOP_SCRIPT_FILES = run-hl-ex.sh
 
diff --git a/hl/examples/Makefile.in b/hl/examples/Makefile.in
index ea0f729..a7a97f6 100644
--- a/hl/examples/Makefile.in
+++ b/hl/examples/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -35,7 +35,17 @@
 # built using h5cc (or h5fc, etc.) instead of the standard compilers.
 # This creates some extra work for us.
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -98,20 +108,20 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/examples.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/run-hlc-ex.sh.in $(top_srcdir)/bin/test-driver
 TESTS =
 subdir = hl/examples
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES = run-hlc-ex.sh
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_P = $(am__v_P_ at AM_V@)
@@ -334,6 +344,10 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/run-hlc-ex.sh.in \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am \
+	$(top_srcdir)/config/examples.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -350,7 +364,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -395,14 +408,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -412,13 +433,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -460,9 +480,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -604,8 +635,8 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.h5
 
 # Example directory
 # Note: no '/' after DESTDIR.  Explanation in commence.am
-EXAMPLEDIR = ${DESTDIR}$(datarootdir)/hdf5_examples/hl/c
-EXAMPLETOPDIR = ${DESTDIR}$(datarootdir)/hdf5_examples/hl
+EXAMPLEDIR = ${DESTDIR}$(exec_prefix)/share/hdf5_examples/hl/c
+EXAMPLETOPDIR = ${DESTDIR}$(exec_prefix)/share/hdf5_examples/hl
 INSTALL_SCRIPT_FILES = run-hlc-ex.sh
 INSTALL_TOP_SCRIPT_FILES = run-hl-ex.sh
 
@@ -676,7 +707,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/examples/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign hl/examples/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -685,7 +715,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/examples.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/examples.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -740,7 +770,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1008,6 +1038,8 @@ uninstall-am: uninstall-local
 	pdf-am ps ps-am recheck tags-am uninstall uninstall-am \
 	uninstall-local
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/hl/examples/run-hlc-ex.sh.in b/hl/examples/run-hlc-ex.sh.in
index 1848273..d897a02 100644
--- a/hl/examples/run-hlc-ex.sh.in
+++ b/hl/examples/run-hlc-ex.sh.in
@@ -33,7 +33,7 @@ EXIT_FAILURE=1
 
 # Where the tool is installed.
 # default is relative path to installed location of the tools
-prefix="${prefix:-../../../..}"
+prefix="${prefix:- at prefix@}"
 PARALLEL=@PARALLEL@             # Am I in parallel mode?
 AR="@AR@"
 RANLIB="@RANLIB@"
diff --git a/hl/fortran/Makefile.in b/hl/fortran/Makefile.in
index 4651579..4c66d7b 100644
--- a/hl/fortran/Makefile.in
+++ b/hl/fortran/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -35,7 +35,17 @@
 #
 # HDF5 High-Level Makefile(.in)
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -98,19 +108,20 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(top_srcdir)/bin/test-driver COPYING
 TESTS =
 subdir = hl/fortran
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_P = $(am__v_P_ at AM_V@)
@@ -366,6 +377,9 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am COPYING
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 am__relativize = \
   dir0=`pwd`; \
@@ -407,7 +421,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -452,14 +465,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -469,13 +490,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -517,9 +537,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -695,7 +726,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/fortran/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign hl/fortran/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -704,7 +734,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -850,7 +880,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1142,6 +1172,8 @@ uninstall-am:
 	mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/hl/fortran/examples/Makefile.am b/hl/fortran/examples/Makefile.am
index 2c3d6fb..997da73 100644
--- a/hl/fortran/examples/Makefile.am
+++ b/hl/fortran/examples/Makefile.am
@@ -53,8 +53,8 @@ endif
 
 # Tell automake how to install examples
 # Note: no '/' after DESTDIR.  Explanation in commence.am
-EXAMPLEDIR=${DESTDIR}$(datarootdir)/hdf5_examples/hl/fortran
-EXAMPLETOPDIR=${DESTDIR}$(datarootdir)/hdf5_examples/hl
+EXAMPLEDIR=${DESTDIR}$(exec_prefix)/share/hdf5_examples/hl/fortran
+EXAMPLETOPDIR=${DESTDIR}$(exec_prefix)/share/hdf5_examples/hl
 
 # List dependencies for each example.  Normally, automake would take
 # care of this for us, but if we tell automake about the programs it
@@ -64,4 +64,4 @@ EXAMPLETOPDIR=${DESTDIR}$(datarootdir)/hdf5_examples/hl
 # and fortran libraries above.
 
 include $(top_srcdir)/config/examples.am
-include $(top_srcdir)/config/conclude.am
+include $(top_srcdir)/config/conclude_fc.am
diff --git a/hl/fortran/examples/Makefile.in b/hl/fortran/examples/Makefile.in
index 4192308..72c91d2 100644
--- a/hl/fortran/examples/Makefile.in
+++ b/hl/fortran/examples/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -34,8 +34,22 @@
 # We can't tell automake about example programs, because they need to be
 # built using h5cc (or h5fc, etc.) instead of the standard compilers.
 # This creates some extra work for us.
+
+# Makefile.am include fragment with Fortran helper rules and macros.
+
+# AM_FCCPPFLAGS, FCCPPFLAGS are currently not used.
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -98,20 +112,20 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/examples.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/run-hlfortran-ex.sh.in $(top_srcdir)/bin/test-driver
 TESTS =
 subdir = hl/fortran/examples
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES = run-hlfortran-ex.sh
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_P = $(am__v_P_ at AM_V@)
@@ -334,6 +348,12 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+	$(srcdir)/run-hlfortran-ex.sh.in $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am \
+	$(top_srcdir)/config/conclude_fc.am \
+	$(top_srcdir)/config/examples.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -350,7 +370,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -395,14 +414,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -412,13 +439,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -460,9 +486,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -622,8 +659,8 @@ FORTRAN_API = yes
 
 # Tell automake how to install examples
 # Note: no '/' after DESTDIR.  Explanation in commence.am
-EXAMPLEDIR = ${DESTDIR}$(datarootdir)/hdf5_examples/hl/fortran
-EXAMPLETOPDIR = ${DESTDIR}$(datarootdir)/hdf5_examples/hl
+EXAMPLEDIR = ${DESTDIR}$(exec_prefix)/share/hdf5_examples/hl/fortran
+EXAMPLETOPDIR = ${DESTDIR}$(exec_prefix)/share/hdf5_examples/hl
 
 # Assume that all tests in this directory are examples, and tell
 # conclude.am when to build them.
@@ -632,6 +669,8 @@ EXTRA_PROG = $(EXAMPLE_PROG) $(EXAMPLE_PROG_PARA)
 # We need to tell automake what to clean
 MOSTLYCLEANFILES = *.raw *.meta *.o
 CLEANFILES = $(EXAMPLE_PROG) $(EXAMPLE_PROG_PARA)
+PPFCCOMPILE = $(FC) $(FCDEFS) $(DEFAULT_INCLUDES)  $(FCINCLUDES) $(AM_FCCPPFLAGS) $(FCCPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)
+LTPPFCCOMPILE = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(PPFCCOMPILE)
 
 # Automake needs to be taught how to build lib, progs, and tests targets.
 # These will be filled in automatically for the most part (e.g.,
@@ -655,8 +694,8 @@ TEST_SCRIPT_PARA_CHKSH = $(TEST_SCRIPT_PARA:=.chkexe_)
 all: all-am
 
 .SUFFIXES:
-.SUFFIXES: .log .sh .sh$(EXEEXT) .trs
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/examples.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
+.SUFFIXES: .F90 .f90 .log .o .sh .sh$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/examples.am $(top_srcdir)/config/conclude_fc.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
@@ -668,7 +707,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/fortran/examples/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign hl/fortran/examples/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -677,7 +715,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/examples.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/examples.am $(top_srcdir)/config/conclude_fc.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -732,7 +770,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1000,6 +1038,8 @@ uninstall-am: uninstall-local
 	pdf-am ps ps-am recheck tags-am uninstall uninstall-am \
 	uninstall-local
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
@@ -1087,6 +1127,12 @@ installcheck-local:
 	     /bin/sh ./$(TEST_EXAMPLES_SCRIPT);)                                                   \
 	fi
 
+# Treat all .f90 and .F90 files as preprocessed Fortran.
+.f90.o:
+	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+.F90.o:
+	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
 build-lib: $(LIB)
diff --git a/hl/fortran/examples/run-hlfortran-ex.sh.in b/hl/fortran/examples/run-hlfortran-ex.sh.in
index d17b10b..12f9fec 100644
--- a/hl/fortran/examples/run-hlfortran-ex.sh.in
+++ b/hl/fortran/examples/run-hlfortran-ex.sh.in
@@ -34,7 +34,7 @@ EXIT_FAILURE=1
 
 # Where the tool is installed.
 # default is relative path to installed location of the tools
-prefix="${prefix:-../../../..}"
+prefix="${prefix:- at prefix@}"
 PARALLEL=@PARALLEL@             # Am I in parallel mode?
 AR="@AR@"
 RANLIB="@RANLIB@"
diff --git a/hl/fortran/src/CMakeLists.txt b/hl/fortran/src/CMakeLists.txt
index 3e5f516..ead21be 100644
--- a/hl/fortran/src/CMakeLists.txt
+++ b/hl/fortran/src/CMakeLists.txt
@@ -1,6 +1,41 @@
 cmake_minimum_required (VERSION 3.1.0)
 PROJECT(HDF5_HL_F90_SRC C CXX Fortran)
 
+#-----------------------------------------------------------------------------
+# configure def file for shared libs on windows
+if (WIN32)
+  if (BUILD_SHARED_LIBS)
+    if (MSVC)
+      configure_file (${HDF5_HL_F90_SRC_SOURCE_DIR}/hdf5_hl_fortrandll.def.in ${HDF5_HL_F90_SRC_BINARY_DIR}/hdf5_hl_fortrandll.def @ONLY)
+    endif (MSVC)
+  endif (BUILD_SHARED_LIBS)
+endif (WIN32)
+
+#-----------------------------------------------------------------------------
+# Generate the H5LT and H5TB REAL APIs
+#-----------------------------------------------------------------------------
+
+add_executable (H5HL_buildiface
+      ${HDF5_HL_F90_SRC_SOURCE_DIR}/H5HL_buildiface.F90
+  )
+
+if (WIN32 AND MSVC)
+  if (BUILD_SHARED_LIBS)
+    set_target_properties (H5HL_buildiface
+        PROPERTIES
+            COMPILE_FLAGS "/MT"
+    )
+  endif (BUILD_SHARED_LIBS)
+  set_target_properties (H5HL_buildiface
+      PROPERTIES
+          LINK_FLAGS "/SUBSYSTEM:CONSOLE"
+  )
+endif (WIN32 AND MSVC)
+set_target_properties (H5HL_buildiface PROPERTIES
+    LINKER_LANGUAGE Fortran
+    Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}
+)
+
 if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   if (WIN32)
     set (MODSH_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/shared/\${BUILD_TYPE})
@@ -13,6 +48,7 @@ if (WIN32)
 else (WIN32)
   set (MOD_BUILD_DIR ${CMAKE_Fortran_MODULE_DIRECTORY}/static)
 endif (WIN32)
+
 #-----------------------------------------------------------------------------
 # Setup include Directories
 #-----------------------------------------------------------------------------
@@ -55,7 +91,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   TARGET_C_PROPERTIES (${HDF5_HL_F90_C_LIBSH_TARGET} SHARED " " " ")
   target_link_libraries (${HDF5_HL_F90_C_LIBSH_TARGET} ${HDF5_F90_C_LIBSH_TARGET} ${HDF5_HL_LIBSH_TARGET})
   set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_HL_F90_C_LIBSH_TARGET}")
-  H5_SET_LIB_OPTIONS (${HDF5_HL_F90_C_LIBSH_TARGET} ${HDF5_HL_F90_C_LIB_NAME} SHARED ${HDF5_HL_F_PACKAGE_SOVERSION})
+  H5_SET_LIB_OPTIONS (${HDF5_HL_F90_C_LIBSH_TARGET} ${HDF5_HL_F90_C_LIB_NAME} SHARED)
   set_target_properties (${HDF5_HL_F90_C_LIBSH_TARGET} PROPERTIES
       FOLDER libraries/hl/fortran
       LINKER_LANGUAGE C
@@ -69,14 +105,37 @@ endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 #-----------------------------------------------------------------------------
 # Fortran Modules
 #-----------------------------------------------------------------------------
+set (HDF5_HL_F90_F_BASE_SRCS
+    ${HDF5_HL_F90_SRC_SOURCE_DIR}/H5DSff.F90
+    ${HDF5_HL_F90_SRC_SOURCE_DIR}/H5TBff.F90
+    ${HDF5_HL_F90_SRC_SOURCE_DIR}/H5LTff.F90
+    ${HDF5_HL_F90_SRC_SOURCE_DIR}/H5IMff.F90
+)
 set (HDF5_HL_F90_F_SRCS
-    ${HDF5_HL_F90_SRC_SOURCE_DIR}/H5DSff.f90
-    ${HDF5_HL_F90_SRC_SOURCE_DIR}/H5TBff.f90
-    ${HDF5_HL_F90_SRC_SOURCE_DIR}/H5LTff.f90
-    ${HDF5_HL_F90_SRC_SOURCE_DIR}/H5IMff.f90
+     ${HDF5_HL_F90_F_BASE_SRCS}
+
+     # generated files
+     ${HDF5_HL_F90_SRC_BINARY_DIR}/H5LTff_gen.F90
+     ${HDF5_HL_F90_SRC_BINARY_DIR}/H5TBff_gen.F90
 )
+
 set_source_files_properties (${HDF5_HL_F90_F_SRCS} PROPERTIES LANGUAGE Fortran)
 
+set_source_files_properties (
+    ${HDF5_HL_F90_SRC_BINARY_DIR}/H5LTff_gen.F90
+    ${HDF5_HL_F90_SRC_BINARY_DIR}/H5TBff_gen.F90
+    PROPERTIES GENERATED TRUE
+)
+
+set (CMD $<TARGET_FILE:H5HL_buildiface>)
+add_custom_target (H5HLgen ALL
+    COMMAND ${CMD}
+#v3.2    BYPRODUCT ${HDF5_HL_F90_SRC_BINARY_DIR}/H5LTff_gen.F90
+#v3.2              ${HDF5_HL_F90_SRC_BINARY_DIR}/H5TBff_gen.F90
+    WORKING_DIRECTORY ${HDF5_HL_F90_SRC_BINARY_DIR}
+    DEPENDS ${HDF5_HL_F90_F_BASE_SRCS}
+)
+
 add_library (${HDF5_HL_F90_LIB_TARGET} STATIC ${HDF5_HL_F90_F_SRCS})
 TARGET_FORTRAN_PROPERTIES (${HDF5_HL_F90_LIB_TARGET} STATIC " " " ")
 target_link_libraries (${HDF5_HL_F90_LIB_TARGET} ${HDF5_HL_F90_C_LIB_TARGET} ${HDF5_F90_LIB_TARGET})
@@ -99,12 +158,12 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   add_library (${HDF5_HL_F90_LIBSH_TARGET} SHARED ${HDF5_HL_F90_F_SRCS})
   set (SHARED_LINK_FLAGS " ")
   if (WIN32 AND MSVC)
-    set (SHARED_LINK_FLAGS "/DLL")
+    set (SHARED_LINK_FLAGS "/DLL /DEF:${HDF5_HL_F90_SRC_BINARY_DIR}/hdf5_hl_fortrandll.def")
   endif (WIN32 AND MSVC)
   TARGET_FORTRAN_PROPERTIES (${HDF5_HL_F90_LIBSH_TARGET} SHARED " " ${SHARED_LINK_FLAGS})
   target_link_libraries (${HDF5_HL_F90_LIBSH_TARGET} ${HDF5_HL_F90_C_LIBSH_TARGET} ${HDF5_F90_LIBSH_TARGET})
   set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_HL_F90_LIBSH_TARGET}")
-  H5_SET_LIB_OPTIONS (${HDF5_HL_F90_LIBSH_TARGET} ${HDF5_HL_F90_LIB_NAME} SHARED ${HDF5_HL_F_PACKAGE_SOVERSION})
+  H5_SET_LIB_OPTIONS (${HDF5_HL_F90_LIBSH_TARGET} ${HDF5_HL_F90_LIB_NAME} SHARED)
   set_target_properties (${HDF5_HL_F90_LIBSH_TARGET} PROPERTIES
       FOLDER libraries/hl/fortran
       LINKER_LANGUAGE Fortran
@@ -128,7 +187,9 @@ endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 set (mod_files
     ${MOD_BUILD_DIR}/h5ds.mod
     ${MOD_BUILD_DIR}/h5tb.mod
+    ${MOD_BUILD_DIR}/h5tb_const.mod
     ${MOD_BUILD_DIR}/h5lt.mod
+    ${MOD_BUILD_DIR}/h5lt_const.mod
     ${MOD_BUILD_DIR}/h5im.mod
 )
 
@@ -145,7 +206,9 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
   set (modsh_files
       ${MODSH_BUILD_DIR}/h5ds.mod
       ${MODSH_BUILD_DIR}/h5tb.mod
+      ${MODSH_BUILD_DIR}/h5tb_const.mod
       ${MODSH_BUILD_DIR}/h5lt.mod
+      ${MODSH_BUILD_DIR}/h5lt_const.mod
       ${MODSH_BUILD_DIR}/h5im.mod
   )
   install (
diff --git a/hl/fortran/src/H5DSfc.c b/hl/fortran/src/H5DSfc.c
index 1de3fff..af054e0 100644
--- a/hl/fortran/src/H5DSfc.c
+++ b/hl/fortran/src/H5DSfc.c
@@ -35,7 +35,7 @@
 *-------------------------------------------------------------------------
 */
 int_f
-nh5dsset_scale_c(hid_t_f *dsid, _fcd dimname, size_t_f *dimnamelen) 
+h5dsset_scale_c(hid_t_f *dsid, _fcd dimname, size_t_f *dimnamelen) 
 {
   char *c_dimname = NULL;
   int_f ret_value = 0;
@@ -61,7 +61,7 @@ nh5dsset_scale_c(hid_t_f *dsid, _fcd dimname, size_t_f *dimnamelen)
 
   return ret_value;
 
-} /* end nh5dsset_scale_c() */
+} /* end h5dsset_scale_c() */
 
 
 /*-------------------------------------------------------------------------
@@ -80,7 +80,7 @@ nh5dsset_scale_c(hid_t_f *dsid, _fcd dimname, size_t_f *dimnamelen)
 *-------------------------------------------------------------------------
 */
 int_f
-nh5dsattach_scale_c( hid_t_f *did, hid_t_f *dsid, int_f *idx) 
+h5dsattach_scale_c( hid_t_f *did, hid_t_f *dsid, int_f *idx) 
 {
   int_f ret_value = 0;
   
@@ -94,7 +94,7 @@ nh5dsattach_scale_c( hid_t_f *did, hid_t_f *dsid, int_f *idx)
   done:
     return ret_value;
 
-} /* end nh5dsattach_scale_c() */
+} /* end h5dsattach_scale_c() */
 
 
 /*-------------------------------------------------------------------------
@@ -113,7 +113,7 @@ nh5dsattach_scale_c( hid_t_f *did, hid_t_f *dsid, int_f *idx)
 *-------------------------------------------------------------------------
 */
 int_f
-nh5dsdetach_scale_c( hid_t_f *did, hid_t_f *dsid, int_f *idx) 
+h5dsdetach_scale_c( hid_t_f *did, hid_t_f *dsid, int_f *idx) 
 {
   int_f ret_value = 0;
   
@@ -127,7 +127,7 @@ nh5dsdetach_scale_c( hid_t_f *did, hid_t_f *dsid, int_f *idx)
   done:
     return ret_value;
 
-} /* end nh5dsdetach_scale_c() */
+} /* end h5dsdetach_scale_c() */
 
 
 /*-------------------------------------------------------------------------
@@ -146,7 +146,7 @@ nh5dsdetach_scale_c( hid_t_f *did, hid_t_f *dsid, int_f *idx)
 *-------------------------------------------------------------------------
 */
 int_f
-nh5dsis_attached_c( hid_t_f *did, hid_t_f *dsid, int_f *idx, int_f *is_attached) 
+h5dsis_attached_c( hid_t_f *did, hid_t_f *dsid, int_f *idx, int_f *is_attached) 
 {
   int_f ret_value = 0;
   htri_t c_is_attached;
@@ -163,7 +163,7 @@ nh5dsis_attached_c( hid_t_f *did, hid_t_f *dsid, int_f *idx, int_f *is_attached)
   done:
       return ret_value;
 
-} /* end nh5dsis_attached_c() */
+} /* end h5dsis_attached_c() */
 
 /*-------------------------------------------------------------------------
 * Function: H5DSis_scale_c
@@ -181,7 +181,7 @@ nh5dsis_attached_c( hid_t_f *did, hid_t_f *dsid, int_f *idx, int_f *is_attached)
 *-------------------------------------------------------------------------
 */
 int_f
-nh5dsis_scale_c( hid_t_f *did, int_f *is_scale) 
+h5dsis_scale_c( hid_t_f *did, int_f *is_scale) 
 {
   int_f ret_value = 0;
   htri_t c_is_scale;
@@ -198,7 +198,7 @@ nh5dsis_scale_c( hid_t_f *did, int_f *is_scale)
   done:
     return ret_value;
 
-} /* end nh5dsis_scale_c() */
+} /* end h5dsis_scale_c() */
 
 
 /*-------------------------------------------------------------------------
@@ -217,7 +217,7 @@ nh5dsis_scale_c( hid_t_f *did, int_f *is_scale)
 *-------------------------------------------------------------------------
 */
 int_f
-nh5dsset_label_c(hid_t_f *did, int_f *idx, _fcd label, size_t_f *labellen) 
+h5dsset_label_c(hid_t_f *did, int_f *idx, _fcd label, size_t_f *labellen) 
 {
   char *c_label = NULL;
   int_f ret_value = 0;
@@ -242,7 +242,7 @@ nh5dsset_label_c(hid_t_f *did, int_f *idx, _fcd label, size_t_f *labellen)
 
   return ret_value;
 
-} /* end nh5dsset_label_c() */
+} /* end h5dsset_label_c() */
 
 /*-------------------------------------------------------------------------
 * Function: h5dsget_label_c
@@ -260,7 +260,7 @@ nh5dsset_label_c(hid_t_f *did, int_f *idx, _fcd label, size_t_f *labellen)
 *-------------------------------------------------------------------------
 */
 int_f
-nh5dsget_label_c(hid_t_f *did, int_f *idx, _fcd label, size_t_f *size) 
+h5dsget_label_c(hid_t_f *did, int_f *idx, _fcd label, size_t_f *size) 
 {
   char *c_label = NULL;
   ssize_t size_c = -1;
@@ -291,7 +291,7 @@ done:
      if(c_label) HDfree(c_label);
      return ret_value;
 
-} /* end nh5dsget_label_c() */
+} /* end h5dsget_label_c() */
 
 /*-------------------------------------------------------------------------
 * Function: h5dsget_scale_name_c
@@ -309,7 +309,7 @@ done:
 *-------------------------------------------------------------------------
 */
 int_f
-nh5dsget_scale_name_c(hid_t_f *did, _fcd name, size_t_f *size) 
+h5dsget_scale_name_c(hid_t_f *did, _fcd name, size_t_f *size) 
 {
   char *c_scale_name = NULL;
   ssize_t size_c = -1;
@@ -338,7 +338,7 @@ done:
   if(c_scale_name) HDfree(c_scale_name);
   return ret_value;
 
-} /* end nh5dsget_scale_name_c() */
+} /* end h5dsget_scale_name_c() */
 
 /*-------------------------------------------------------------------------
 * Function: H5DSget_num_scales_c
@@ -356,7 +356,7 @@ done:
 *-------------------------------------------------------------------------
 */
 int_f
-nh5dsget_num_scales_c( hid_t_f *did, int_f *idx, int_f *num_scales) 
+h5dsget_num_scales_c( hid_t_f *did, int_f *idx, int_f *num_scales) 
 {
   int_f ret_value = 0;
   
@@ -370,4 +370,4 @@ nh5dsget_num_scales_c( hid_t_f *did, int_f *idx, int_f *num_scales)
   done:
     return ret_value;
 
-} /* end nh5dsget_num_scales_c() */
+} /* end h5dsget_num_scales_c() */
diff --git a/hl/fortran/src/H5DSff.F90 b/hl/fortran/src/H5DSff.F90
new file mode 100644
index 0000000..00cf4d8
--- /dev/null
+++ b/hl/fortran/src/H5DSff.F90
@@ -0,0 +1,518 @@
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+!
+! This file contains FORTRAN90 interfaces for H5DS functions
+!
+
+MODULE h5ds
+
+  USE, INTRINSIC :: ISO_C_BINDING, ONLY : C_PTR, C_CHAR, C_FLOAT, C_DOUBLE, C_LOC, C_CHAR
+  USE h5fortran_types
+  USE hdf5
+
+CONTAINS
+
+!-------------------------------------------------------------------------
+! Function: H5DSset_scale_f
+!
+! Purpose: Convert dataset dsid to a dimension scale, with optional name, dimname. 
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: M. Scot Breitenfeld
+!
+! Date: April 17, 2011
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE H5DSset_scale_f( dsid, errcode, dimname)
+
+    IMPLICIT NONE
+
+!
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_HL_DLL)
+!DEC$attributes dllexport :: h5dsset_scale_f
+!DEC$endif
+!
+
+    INTEGER(hid_t),   INTENT(in) :: dsid               ! The dataset to be made a Dimension Scale
+    CHARACTER(LEN=*), INTENT(in), OPTIONAL :: dimname  ! The dimension name
+    INTEGER :: errcode                                 ! Error code
+
+    INTEGER(SIZE_T) :: dimname_len                     ! length of dimname (if present)
+
+    INTERFACE
+       INTEGER FUNCTION H5DSset_scale_c(dsid, dimname, dimname_len) &
+            BIND(C,NAME='h5dsset_scale_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: dsid     ! The dataset to be made a Dimension Scale
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dimname  ! The dimension name
+         INTEGER(SIZE_T),  INTENT(in) :: dimname_len
+       END FUNCTION H5DSset_scale_c
+    END INTERFACE
+
+    IF(PRESENT(dimname))THEN
+       dimname_len = LEN(dimname)
+       errcode = H5DSset_scale_c(dsid, dimname, dimname_len )
+    ELSE
+       errcode = H5DSset_scale_c(dsid, " ", INT(0,SIZE_T) )
+    ENDIF
+
+  END SUBROUTINE H5DSset_scale_f
+
+!-------------------------------------------------------------------------
+! Function: H5DSattach_scale_f
+!
+! Purpose: Attach dimension scale dsid to dimension idx of dataset did.
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: M. Scot Breitenfeld
+!
+! Date: April 17, 2011
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE H5DSattach_scale_f( did, dsid, idx, errcode)
+
+    IMPLICIT NONE
+
+!
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_HL_DLL)
+!DEC$attributes dllexport :: h5dsattach_scale_f
+!DEC$endif
+!
+    INTEGER(hid_t), INTENT(in) :: did     ! the dataset
+    INTEGER(hid_t), INTENT(in) :: dsid    ! the scale to be attached 
+    INTEGER       , INTENT(in) :: idx     ! the dimension of did that dsid is associated with.
+    INTEGER                    :: errcode ! error code
+    INTEGER                    :: c_idx
+    
+    INTERFACE
+       INTEGER FUNCTION  H5DSattach_scale_c(did, dsid, idx) &
+            BIND(C,NAME='h5dsattach_scale_c') 
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(hid_t), INTENT(in) :: did     ! the dataset
+         INTEGER(hid_t), INTENT(in) :: dsid    ! the scale to be attached 
+         INTEGER       , INTENT(in) :: idx     ! the dimension of did that dsid is associated with.
+       END FUNCTION H5DSattach_scale_c
+    END INTERFACE
+
+    c_idx = idx -1 ! account for C-dimensions starting at 0 
+    
+    errcode = H5DSattach_scale_c( did, dsid, c_idx)
+    
+  END SUBROUTINE H5DSattach_scale_f
+  
+!-------------------------------------------------------------------------
+! Function: H5DSdetach_scale_f
+!
+! Purpose: Detach dimension scale dsid from the dimension idx of Dataset did.
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: M. Scot Breitenfeld
+!
+! Date: April 17, 2011
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE H5DSdetach_scale_f( did, dsid, idx, errcode)
+    
+    IMPLICIT NONE
+    
+!
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_HL_DLL)
+!DEC$attributes dllexport :: h5dsdetach_scale_f
+!DEC$endif
+!
+    INTEGER(hid_t), INTENT(in) :: did     ! the dataset
+    INTEGER(hid_t), INTENT(in) :: dsid    ! the scale to be detached 
+    INTEGER       , INTENT(in) :: idx     ! the dimension of did to detach
+    INTEGER                    :: errcode ! error code
+    INTEGER                    :: c_idx
+    
+    INTERFACE
+       INTEGER FUNCTION  H5DSdetach_scale_c(did, dsid, idx) &
+            BIND(C,NAME='h5dsdetach_scale_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(hid_t), INTENT(in) :: did     ! the dataset
+         INTEGER(hid_t), INTENT(in) :: dsid    ! the scale to be detached 
+         INTEGER       , INTENT(in) :: idx     ! the dimension of did to detach
+       END FUNCTION H5DSdetach_scale_c
+    END INTERFACE
+
+    c_idx = idx - 1 ! account for C-dimensions starting at 0 
+
+    errcode = H5DSdetach_scale_c( did, dsid, c_idx)
+    
+  END SUBROUTINE H5DSdetach_scale_f
+
+
+!-------------------------------------------------------------------------
+! Function: H5DSis_attached_f
+!
+! Purpose: Report if dimension scale dsid is currently attached to dimension idx of dataset did. 
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: M. Scot Breitenfeld
+!
+! Date: April 17, 2011
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE H5DSis_attached_f( did, dsid, idx, is_attached, errcode)
+    
+    IMPLICIT NONE
+    
+!
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_HL_DLL)
+!DEC$attributes dllexport :: h5dsis_attached_f
+!DEC$endif
+!
+    INTEGER(hid_t), INTENT(in)  :: did         ! the dataset
+    INTEGER(hid_t), INTENT(in)  :: dsid        ! the scale to be attached
+    INTEGER       , INTENT(in)  :: idx         ! the dimension of did that dsid is associated with
+    LOGICAL       , INTENT(out) :: is_attached ! logical: dimension scale dsid is currently attached to 
+                                               ! dimension idx of dataset did
+    INTEGER                     :: errcode     ! error code
+    INTEGER                     :: c_is_attached
+    INTEGER                     :: c_idx
+    
+    INTERFACE
+       INTEGER FUNCTION H5DSis_attached_c(did, dsid, idx, c_is_attached) &
+            BIND(C,NAME='h5dsis_attached_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(hid_t), INTENT(in)  :: did         ! the dataset
+         INTEGER(hid_t), INTENT(in)  :: dsid        ! the scale to be detached 
+         INTEGER       , INTENT(in)  :: idx         ! the dimension of did to detach
+         INTEGER       , INTENT(out) :: c_is_attached ! dimension scale dsid is currently attached to 
+       END FUNCTION H5DSis_attached_c
+    END INTERFACE
+
+    c_idx = idx - 1 ! account for C-dimensions starting at 0 
+    
+    errcode = H5DSis_attached_c(did, dsid, c_idx, c_is_attached)
+
+    is_attached = .FALSE. ! default
+    IF(c_is_attached.GT.0)THEN
+       is_attached = .TRUE.
+    ELSE IF(errcode.LT.0)THEN
+       errcode = -1
+    ENDIF
+    
+  END SUBROUTINE H5DSis_attached_f
+
+!
+! H5DSiterate_scales: Impliment in  F2003
+!
+
+!-------------------------------------------------------------------------
+! Function: H5DSis_scale_f
+!
+! Purpose: Determines whether dset is a Dimension Scale. 
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: M. Scot Breitenfeld
+!
+! Date: April 18, 2011
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE H5DSis_scale_f( did, is_scale, errcode)
+    
+    IMPLICIT NONE
+    
+!
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_HL_DLL)
+!DEC$attributes dllexport :: h5dsis_scale_f
+!DEC$endif
+!
+    INTEGER(hid_t), INTENT(in)  :: did         ! the data set to query
+    LOGICAL       , INTENT(out) :: is_scale    ! logical:  
+                                               ! .TRUE. if did is a Dimension Scale
+    INTEGER                     :: errcode     ! error code
+    INTEGER                     :: c_is_scale
+    
+    INTERFACE
+       INTEGER FUNCTION H5DSis_scale_c(did,c_is_scale) &
+            BIND(C,NAME='h5dsis_scale_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(hid_t), INTENT(in) :: did
+         INTEGER, INTENT(out) :: c_is_scale
+       END FUNCTION H5DSis_scale_c
+    END INTERFACE
+    
+    errcode = H5DSis_scale_c(did, c_is_scale)
+
+    is_scale = .FALSE. ! default
+    IF(c_is_scale.GT.0)THEN
+       is_scale = .TRUE.
+    ELSE IF(errcode.LT.0)THEN
+       errcode = -1
+    ENDIF
+    
+  END SUBROUTINE H5DSis_scale_f
+
+!-------------------------------------------------------------------------
+! Function: H5DSset_label_f
+!
+! Purpose: Set label for the dimension idx of did to the value label
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: M. Scot Breitenfeld
+!
+! Date: April 18, 2011
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE H5DSset_label_f( did, idx, label, errcode)
+
+    IMPLICIT NONE
+
+!
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_HL_DLL)
+!DEC$attributes dllexport :: h5dsset_label_f
+!DEC$endif
+!
+
+    INTEGER(hid_t),   INTENT(in) :: did    ! The dataset
+    INTEGER       ,   INTENT(in) :: idx    ! The dimension
+    CHARACTER(LEN=*), INTENT(in) :: label  ! The label
+    INTEGER :: errcode                     ! Error code
+
+    INTEGER(SIZE_T) :: label_len  ! Length of label
+    INTEGER :: c_idx
+
+    INTERFACE
+       INTEGER FUNCTION H5DSset_label_c(did, idx, label, label_len) &
+            BIND(C,NAME='h5dsset_label_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: did        ! The dataset
+         INTEGER       ,   INTENT(in) :: idx        ! The dimension
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: label      ! The label
+         INTEGER(SIZE_T),  INTENT(in) :: label_len  ! Length of label
+       END FUNCTION H5DSset_label_c
+    END INTERFACE
+
+    c_idx = idx - 1
+
+    label_len = LEN(label)
+    errcode = H5DSset_label_c(did, c_idx, label, label_len)
+
+  END SUBROUTINE H5DSset_label_f
+
+!-------------------------------------------------------------------------
+! Function: H5DSget_label_f
+!
+! Purpose: Read the label for dimension idx of did into buffer label. 
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: M. Scot Breitenfeld
+!
+! Date: April 18, 2011
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE H5DSget_label_f( did, idx, label, size, errcode)
+
+    IMPLICIT NONE
+
+!
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_HL_DLL)
+!DEC$attributes dllexport :: h5dsget_label_f
+!DEC$endif
+!
+
+    INTEGER(hid_t),   INTENT(in) :: did     ! The dataget
+    INTEGER       ,   INTENT(in) :: idx     ! The dimension
+    CHARACTER(LEN=*), INTENT(in) :: label   ! The label
+    INTEGER(size_t) , INTENT(inout) :: size ! The length of the label buffer
+    INTEGER :: errcode                      ! Error code
+    INTEGER :: c_idx
+
+    INTERFACE
+       INTEGER FUNCTION H5DSget_label_c(did, idx, label, size) &
+            BIND(C,NAME='h5dsget_label_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in)    :: did        ! The dataget
+         INTEGER       ,   INTENT(in)    :: idx        ! The dimension
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: label      ! The label
+         INTEGER(SIZE_T),  INTENT(inout) :: size       ! Length of label
+       END FUNCTION H5DSget_label_c
+    END INTERFACE
+
+    c_idx = idx - 1
+
+    errcode = H5DSget_label_c(did, c_idx, label, size)
+
+  END SUBROUTINE H5DSget_label_f
+
+
+!-------------------------------------------------------------------------
+! Function: H5DSget_scale_name_f
+!
+! Purpose: Read the name of scale did into buffer name.
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: M. Scot Breitenfeld
+!
+! Date: April 18, 2011
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE H5DSget_scale_name_f(did, name, size, errcode)
+
+    IMPLICIT NONE
+
+!
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_HL_DLL)
+!DEC$attributes dllexport :: h5dsget_scale_name_f
+!DEC$endif
+!
+
+    INTEGER(hid_t),   INTENT(in) :: did     ! The dataget
+    CHARACTER(LEN=*), INTENT(out) :: name   ! The name
+    INTEGER(size_t) , INTENT(inout) :: size ! The length of the name buffer
+    INTEGER :: errcode                      ! Error code
+
+    INTERFACE
+       INTEGER FUNCTION H5DSget_scale_name_c(did, name, size) &
+            bind(c,name='h5dsget_scale_name_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in)    :: did       ! The dataget
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(out) :: name      ! The name
+         INTEGER(SIZE_T),  INTENT(inout) :: size      ! Length of name
+       END FUNCTION H5DSget_scale_name_c
+    END INTERFACE
+
+    errcode = H5DSget_scale_name_c(did, name, size)
+
+  END SUBROUTINE H5DSget_scale_name_f
+
+!-------------------------------------------------------------------------
+! Function: H5DSget_num_scales_f
+!
+! Purpose: Determines how many Dimension Scales are attached to dimension idx of did
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: M. Scot Breitenfeld
+!
+! Date: April 18, 2011
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE H5DSget_num_scales_f( did, idx, num_scales, errcode)
+
+    IMPLICIT NONE
+
+!
+!This definition is needed for Windows DLLs
+!DEC$if defined(BUILD_HDF5_HL_DLL)
+!DEC$attributes dllexport :: h5dsget_num_scales_f
+!DEC$endif
+!
+    INTEGER(hid_t), INTENT(in)  :: did         ! the dataset
+    INTEGER       , INTENT(in)  :: idx         ! the dimension of did to query
+    INTEGER       , INTENT(out) :: num_scales  ! the number of Dimension Scales associated with did
+    INTEGER                     :: errcode     ! error code
+    INTEGER                     :: c_idx
+    
+    INTERFACE
+       INTEGER FUNCTION H5DSget_num_scales_c(did, idx, num_scales) &
+            BIND(C,NAME='h5dsget_num_scales_c')
+         IMPORT :: HID_T
+         IMPLICIT NONE
+         INTEGER(hid_t), INTENT(in)  :: did        ! the dataset
+         INTEGER       , INTENT(in)  :: idx        ! the dimension of did to query
+         INTEGER       , INTENT(out) :: num_scales ! the number of Dimension Scales associated with did
+       END FUNCTION H5DSget_num_scales_c
+    END INTERFACE
+    
+    c_idx = idx - 1
+    errcode = H5DSget_num_scales_c(did, c_idx, num_scales)
+    
+  END SUBROUTINE H5DSget_num_scales_f
+
+END MODULE h5ds
+
+
+
+
+
+
diff --git a/hl/fortran/src/H5DSff.f90 b/hl/fortran/src/H5DSff.f90
deleted file mode 100644
index 04540a6..0000000
--- a/hl/fortran/src/H5DSff.f90
+++ /dev/null
@@ -1,545 +0,0 @@
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!
-! This file contains FORTRAN90 interfaces for H5DS functions
-!
-
-MODULE h5ds
-
-  USE h5fortran_types
-  USE hdf5
-
-CONTAINS
-
-
-!-------------------------------------------------------------------------
-! Function: H5DSset_scale_f
-!
-! Purpose: Convert dataset dsid to a dimension scale, with optional name, dimname. 
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: M. Scot Breitenfeld
-!
-! Date: April 17, 2011
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-  SUBROUTINE H5DSset_scale_f( dsid, errcode, dimname)
-
-    IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5dsset_scale_f
-!DEC$endif
-!
-
-    INTEGER(hid_t),   INTENT(in) :: dsid               ! The dataset to be made a Dimension Scale
-    CHARACTER(LEN=*), INTENT(in), OPTIONAL :: dimname  ! The dimension name
-    INTEGER :: errcode                                 ! Error code
-
-    INTEGER(SIZE_T) :: dimname_len                     ! length of dimname (if present)
-
-    INTERFACE
-       INTEGER FUNCTION H5DSset_scale_c(dsid, dimname, dimname_len )
-
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DSSET_SCALE_C'::h5dsset_scale_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dimname  
-         INTEGER(hid_t),   INTENT(in) :: dsid     ! The dataset to be made a Dimension Scale
-         CHARACTER(LEN=*), INTENT(in) :: dimname  ! The dimension name
-         INTEGER(SIZE_T),  INTENT(in) :: dimname_len
-       END FUNCTION H5DSset_scale_c
-    END INTERFACE
-
-    IF(PRESENT(dimname))THEN
-       dimname_len = LEN(dimname)
-       errcode = H5DSset_scale_c(dsid, dimname, dimname_len )
-    ELSE
-       errcode = H5DSset_scale_c(dsid, " ", INT(0,SIZE_T) )
-    ENDIF
-
-  END SUBROUTINE H5DSset_scale_f
-
-!-------------------------------------------------------------------------
-! Function: H5DSattach_scale_f
-!
-! Purpose: Attach dimension scale dsid to dimension idx of dataset did.
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: M. Scot Breitenfeld
-!
-! Date: April 17, 2011
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-  SUBROUTINE H5DSattach_scale_f( did, dsid, idx, errcode)
-
-    IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5dsattach_scale_f
-!DEC$endif
-!
-    INTEGER(hid_t), INTENT(in) :: did     ! the dataset
-    INTEGER(hid_t), INTENT(in) :: dsid    ! the scale to be attached 
-    INTEGER       , INTENT(in) :: idx     ! the dimension of did that dsid is associated with.
-    INTEGER                    :: errcode ! error code
-    INTEGER                    :: c_idx
-    
-    INTERFACE
-       INTEGER FUNCTION  H5DSattach_scale_c(did, dsid, idx )
-         
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DSATTACH_SCALE_C':: h5dsattach_scale_c
-         !DEC$ENDIF
-         INTEGER(hid_t), INTENT(in) :: did     ! the dataset
-         INTEGER(hid_t), INTENT(in) :: dsid    ! the scale to be attached 
-         INTEGER       , INTENT(in) :: idx     ! the dimension of did that dsid is associated with.
-       END FUNCTION H5DSattach_scale_c
-    END INTERFACE
-
-    c_idx = idx -1 ! account for C-dimensions starting at 0 
-    
-    errcode = H5DSattach_scale_c( did, dsid, c_idx)
-    
-  END SUBROUTINE H5DSattach_scale_f
-  
-!-------------------------------------------------------------------------
-! Function: H5DSdetach_scale_f
-!
-! Purpose: Detach dimension scale dsid from the dimension idx of Dataset did.
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: M. Scot Breitenfeld
-!
-! Date: April 17, 2011
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-  SUBROUTINE H5DSdetach_scale_f( did, dsid, idx, errcode)
-    
-    IMPLICIT NONE
-    
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5dsdetach_scale_f
-!DEC$endif
-!
-    INTEGER(hid_t), INTENT(in) :: did     ! the dataset
-    INTEGER(hid_t), INTENT(in) :: dsid    ! the scale to be detached 
-    INTEGER       , INTENT(in) :: idx     ! the dimension of did to detach
-    INTEGER                    :: errcode ! error code
-    INTEGER                    :: c_idx
-    
-    INTERFACE
-       INTEGER FUNCTION  H5DSdetach_scale_c(did, dsid, idx )
-         
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DSDETACH_SCALE_C':: h5dsdetach_scale_c
-         !DEC$ENDIF
-         INTEGER(hid_t), INTENT(in) :: did     ! the dataset
-         INTEGER(hid_t), INTENT(in) :: dsid    ! the scale to be detached 
-         INTEGER       , INTENT(in) :: idx     ! the dimension of did to detach
-       END FUNCTION H5DSdetach_scale_c
-    END INTERFACE
-
-    c_idx = idx - 1 ! account for C-dimensions starting at 0 
-
-    errcode = H5DSdetach_scale_c( did, dsid, c_idx)
-    
-  END SUBROUTINE H5DSdetach_scale_f
-
-
-!-------------------------------------------------------------------------
-! Function: H5DSis_attached_f
-!
-! Purpose: Report if dimension scale dsid is currently attached to dimension idx of dataset did. 
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: M. Scot Breitenfeld
-!
-! Date: April 17, 2011
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-  SUBROUTINE H5DSis_attached_f( did, dsid, idx, is_attached, errcode)
-    
-    IMPLICIT NONE
-    
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5dsis_attached_f
-!DEC$endif
-!
-    INTEGER(hid_t), INTENT(in)  :: did         ! the dataset
-    INTEGER(hid_t), INTENT(in)  :: dsid        ! the scale to be attached
-    INTEGER       , INTENT(in)  :: idx         ! the dimension of did that dsid is associated with
-    LOGICAL       , INTENT(out) :: is_attached ! logical: dimension scale dsid is currently attached to 
-                                               ! dimension idx of dataset did
-    INTEGER                     :: errcode     ! error code
-    INTEGER                     :: c_is_attached
-    INTEGER                     :: c_idx
-    
-    INTERFACE
-       INTEGER FUNCTION H5DSis_attached_c(did, dsid, idx, c_is_attached )
-         
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DSIS_ATTACHED_C':: h5dsis_attached_c
-         !DEC$ENDIF
-         INTEGER(hid_t), INTENT(in)  :: did         ! the dataset
-         INTEGER(hid_t), INTENT(in)  :: dsid        ! the scale to be detached 
-         INTEGER       , INTENT(in)  :: idx         ! the dimension of did to detach
-         INTEGER       , INTENT(out) :: c_is_attached ! dimension scale dsid is currently attached to 
-       END FUNCTION H5DSis_attached_c
-    END INTERFACE
-
-    c_idx = idx - 1 ! account for C-dimensions starting at 0 
-    
-    errcode = H5DSis_attached_c(did, dsid, c_idx, c_is_attached)
-
-    is_attached = .FALSE. ! default
-    IF(c_is_attached.GT.0)THEN
-       is_attached = .TRUE.
-    ELSE IF(errcode.LT.0)THEN
-       errcode = -1
-    ENDIF
-    
-  END SUBROUTINE H5DSis_attached_f
-
-!
-! H5DSiterate_scales: Impliment in  F2003
-!
-
-!-------------------------------------------------------------------------
-! Function: H5DSis_scale_f
-!
-! Purpose: Determines whether dset is a Dimension Scale. 
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: M. Scot Breitenfeld
-!
-! Date: April 18, 2011
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-  SUBROUTINE H5DSis_scale_f( did, is_scale, errcode)
-    
-    IMPLICIT NONE
-    
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5dsis_scale_f
-!DEC$endif
-!
-    INTEGER(hid_t), INTENT(in)  :: did         ! the data set to query
-    LOGICAL       , INTENT(out) :: is_scale    ! logical:  
-                                               ! .TRUE. if did is a Dimension Scale
-    INTEGER                     :: errcode     ! error code
-    INTEGER                     :: c_is_scale
-    
-    INTERFACE
-       INTEGER FUNCTION  H5DSis_scale_c(did,c_is_scale)
-         
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DSIS_SCALE_C':: h5dsis_scale_c
-         !DEC$ENDIF
-         INTEGER(hid_t), INTENT(in) :: did     !  the data set to query
-         INTEGER, INTENT(out) :: c_is_scale
-       END FUNCTION H5DSis_scale_c
-    END INTERFACE
-    
-    errcode = H5DSis_scale_c(did, c_is_scale)
-
-    is_scale = .FALSE. ! default
-    IF(c_is_scale.GT.0)THEN
-       is_scale = .TRUE.
-    ELSE IF(errcode.LT.0)THEN
-       errcode = -1
-    ENDIF
-    
-  END SUBROUTINE H5DSis_scale_f
-
-!-------------------------------------------------------------------------
-! Function: H5DSset_label_f
-!
-! Purpose: Set label for the dimension idx of did to the value label
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: M. Scot Breitenfeld
-!
-! Date: April 18, 2011
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-  SUBROUTINE H5DSset_label_f( did, idx, label, errcode)
-
-    IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5dsset_label_f
-!DEC$endif
-!
-
-    INTEGER(hid_t),   INTENT(in) :: did    ! The dataset
-    INTEGER       ,   INTENT(in) :: idx    ! The dimension
-    CHARACTER(LEN=*), INTENT(in) :: label  ! The label
-    INTEGER :: errcode                     ! Error code
-
-    INTEGER(SIZE_T) :: label_len  ! Length of label
-    INTEGER :: c_idx
-
-    INTERFACE
-       INTEGER FUNCTION H5DSset_label_c(did, idx, label, label_len)
-
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DSSET_LABEL_C'::h5dsset_label_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: label
-         INTEGER(hid_t),   INTENT(in) :: did        ! The dataset
-         INTEGER       ,   INTENT(in) :: idx        ! The dimension
-         CHARACTER(LEN=*), INTENT(in) :: label      ! The label
-         INTEGER(SIZE_T),  INTENT(in) :: label_len  ! Length of label
-       END FUNCTION H5DSset_label_c
-    END INTERFACE
-
-    c_idx = idx - 1
-
-    label_len = LEN(label)
-    errcode = H5DSset_label_c(did, c_idx, label, label_len)
-
-  END SUBROUTINE H5DSset_label_f
-
-!-------------------------------------------------------------------------
-! Function: H5DSget_label_f
-!
-! Purpose: Read the label for dimension idx of did into buffer label. 
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: M. Scot Breitenfeld
-!
-! Date: April 18, 2011
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-  SUBROUTINE H5DSget_label_f( did, idx, label, size, errcode)
-
-    IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5dsget_label_f
-!DEC$endif
-!
-
-    INTEGER(hid_t),   INTENT(in) :: did     ! The dataget
-    INTEGER       ,   INTENT(in) :: idx     ! The dimension
-    CHARACTER(LEN=*), INTENT(in) :: label   ! The label
-    INTEGER(size_t) , INTENT(inout) :: size ! The length of the label buffer
-    INTEGER :: errcode                      ! Error code
-    INTEGER :: c_idx
-
-    INTERFACE
-       INTEGER FUNCTION H5DSget_label_c(did, idx, label, size)
-
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DSGET_LABEL_C'::h5dsget_label_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: label
-         INTEGER(hid_t),   INTENT(in)    :: did        ! The dataget
-         INTEGER       ,   INTENT(in)    :: idx        ! The dimension
-         CHARACTER(LEN=*), INTENT(in)    :: label      ! The label
-         INTEGER(SIZE_T),  INTENT(inout) :: size       ! Length of label
-       END FUNCTION H5DSget_label_c
-    END INTERFACE
-
-    c_idx = idx - 1
-
-    errcode = H5DSget_label_c(did, c_idx, label, size)
-
-  END SUBROUTINE H5DSget_label_f
-
-
-!-------------------------------------------------------------------------
-! Function: H5DSget_scale_name_f
-!
-! Purpose: Read the name of scale did into buffer name.
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: M. Scot Breitenfeld
-!
-! Date: April 18, 2011
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-  SUBROUTINE H5DSget_scale_name_f(did, name, size, errcode)
-
-    IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5dsget_scale_name_f
-!DEC$endif
-!
-
-    INTEGER(hid_t),   INTENT(in) :: did     ! The dataget
-    CHARACTER(LEN=*), INTENT(out) :: name   ! The name
-    INTEGER(size_t) , INTENT(inout) :: size ! The length of the name buffer
-    INTEGER :: errcode                      ! Error code
-
-    INTERFACE
-       INTEGER FUNCTION H5DSget_scale_name_c(did, name, size)
-
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DSGET_SCALE_NAME_C'::h5dsget_scale_name_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: name
-         INTEGER(hid_t),   INTENT(in)    :: did       ! The dataget
-         CHARACTER(LEN=*), INTENT(out)   :: name      ! The name
-         INTEGER(SIZE_T),  INTENT(inout) :: size      ! Length of name
-       END FUNCTION H5DSget_scale_name_c
-    END INTERFACE
-
-    errcode = H5DSget_scale_name_c(did, name, size)
-
-  END SUBROUTINE H5DSget_scale_name_f
-
-!-------------------------------------------------------------------------
-! Function: H5DSget_num_scales_f
-!
-! Purpose: Determines how many Dimension Scales are attached to dimension idx of did
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: M. Scot Breitenfeld
-!
-! Date: April 18, 2011
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-  SUBROUTINE H5DSget_num_scales_f( did, idx, num_scales, errcode)
-
-    IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5dsget_num_scales_f
-!DEC$endif
-!
-    INTEGER(hid_t), INTENT(in)  :: did         ! the dataset
-    INTEGER       , INTENT(in)  :: idx         ! the dimension of did to query
-    INTEGER       , INTENT(out) :: num_scales  ! the number of Dimension Scales associated with did
-    INTEGER                     :: errcode     ! error code
-    INTEGER                     :: c_idx
-    
-    INTERFACE
-       INTEGER FUNCTION  H5DSget_num_scales_c(did, idx, num_scales)
-         
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5DSGET_NUM_SCALES_C':: h5dsget_num_scales_c
-         !DEC$ENDIF
-         INTEGER(hid_t), INTENT(in)  :: did        ! the dataset
-         INTEGER       , INTENT(in)  :: idx        ! the dimension of did to query
-         INTEGER       , INTENT(out) :: num_scales ! the number of Dimension Scales associated with did
-       END FUNCTION H5DSget_num_scales_c
-    END INTERFACE
-    
-    c_idx = idx - 1
-    errcode = H5DSget_num_scales_c(did, c_idx, num_scales)
-    
-  END SUBROUTINE H5DSget_num_scales_f
-
-END MODULE h5ds
-
-
-
-
-
-
diff --git a/hl/fortran/src/H5HL_buildiface.F90 b/hl/fortran/src/H5HL_buildiface.F90
new file mode 100644
index 0000000..9dd879c
--- /dev/null
+++ b/hl/fortran/src/H5HL_buildiface.F90
@@ -0,0 +1,846 @@
+!****p* Program/H5HL_buildiface
+!
+! NAME
+!  Executable: H5HL_buildiface
+!
+! FILE
+!  fortran/src/H5HL_buildiface.f90
+!
+! PURPOSE
+!  This stand alone program is used at build time to generate the program
+!  H5HL_gen.f90. It cycles through all the available KIND parameters for
+!  integers and reals. The appropriate program and subroutines are then generated
+!  depending on which of the KIND values are found.
+!
+! NOTES
+!  This program uses the Fortran 2008 intrinsic function STORAGE_SIZE or SIZEOF 
+!  depending on availablity.It generates code that makes use of 
+!  STORAGE_SIZE/SIZEOF in H5fortran_detect.f90. STORAGE_SIZE is standard
+!  compliant and should always be chosen over SIZEOF.
+!
+!  The availability of STORAGE_SIZE/SIZEOF is checked at configure time and the TRUE/FALSE
+!  condition is set in the configure variable "FORTRAN_HAVE_STORAGE_SIZE" or
+!  "FORTRAN_HAVE_SIZEOF".
+!
+!  The use of C_SIZOF(X) is not used since the argument X must be an interoperable
+!  data entity.
+!
+! COPYRIGHT
+!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!  Copyright by The HDF Group.                                                 *
+!  Copyright by the Board of Trustees of the University of Illinois.           *
+!  All rights reserved.                                                        *
+!                                                                              *
+!  This file is part of HDF5.  The full HDF5 copyright notice, including       *
+!  terms governing use, modification, and redistribution, is contained in      *
+!  the files COPYING and Copyright.html.  COPYING can be found at the root     *
+!  of the source code distribution tree; Copyright.html can be found at the    *
+!  root level of an installed copy of the electronic HDF5 document set and     *
+!  is linked from the top-level documents page.  It can also be found at       *
+!  http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have            *
+!  access to either file, you may request a copy from help at hdfgroup.org.       *
+!  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+! AUTHOR
+!  M. Scot Breitenfeld
+!
+!*****
+
+#include <H5config_f.inc>
+
+PROGRAM H5HL_buildiface
+  USE, INTRINSIC :: ISO_C_BINDING
+  IMPLICIT NONE
+
+! These values are valid REAL KINDs (with corresponding C float) found during configure
+  H5_H5CONFIG_F_NUM_RKIND
+  H5_H5CONFIG_F_RKIND
+! These values are valid INTEGER KINDs (with corresponding C float) found during configure
+  H5_H5CONFIG_F_NUM_IKIND
+  H5_H5CONFIG_F_IKIND
+
+  INTEGER :: i, j, k
+  INTEGER :: ji, jr, jd
+#ifdef H5_FORTRAN_HAVE_C_LONG_DOUBLE
+  REAL(KIND=C_LONG_DOUBLE) :: c_longdble
+#endif
+  REAL(KIND=C_DOUBLE) :: c_dble
+  REAL(KIND=C_FLOAT) :: c_flt
+  INTEGER :: sizeof_var
+  CHARACTER(LEN=2) :: chr2
+! subroutine rank of array being passed in
+  CHARACTER(LEN=2), DIMENSION(1:8), PARAMETER :: chr_rank=(/"_0","_1","_2","_3","_4","_5","_6","_7"/)
+! rank definitions
+  CHARACTER(LEN=70), DIMENSION(1:8), PARAMETER :: rank_dim_line=(/ &
+       '                                                                    ', &
+       ', DIMENSION(dims(1))                                                ', &
+       ', DIMENSION(dims(1),dims(2))                                        ', &
+       ', DIMENSION(dims(1),dims(2),dims(3))                                ', &
+       ', DIMENSION(dims(1),dims(2),dims(3),dims(4))                        ', &
+       ', DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5))                ', &
+       ', DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6))        ', &
+       ', DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7))' &
+            /)
+! pointer to the buffer
+  CHARACTER(LEN=37), DIMENSION(1:8), PARAMETER :: f_ptr_line=(/ &
+       '    f_ptr = C_LOC(buf               )', &
+       '    f_ptr = C_LOC(buf(1)            )', &
+       '    f_ptr = C_LOC(buf(1,1)          )', &
+       '    f_ptr = C_LOC(buf(1,1,1)        )', &
+       '    f_ptr = C_LOC(buf(1,1,1,1)      )', &
+       '    f_ptr = C_LOC(buf(1,1,1,1,1)    )', &
+       '    f_ptr = C_LOC(buf(1,1,1,1,1,1)  )', &
+       '    f_ptr = C_LOC(buf(1,1,1,1,1,1,1))' &
+            /)
+
+! Generate Fortran H5LT* interfaces having multiple KIND interfaces.
+!
+! Developer's notes:
+!
+! Only interfaces with arrays of rank 7 and less are provided. Even-though the F2008 
+! standard extended the maximum rank to 15, it was decided that they should use the
+! new APIs to handle those use cases. Handling rank 7 and less is for backward compatibility
+! with the Fortran 90/95 APIs codes which could never handle rank 8-15 array sizes.
+
+  OPEN(11,FILE='H5LTff_gen.F90')
+  WRITE(11,'(40(A,/))') &
+'!****h* ROBODoc/H5LTff_gen.F90',&
+'!',&
+'! NAME',&
+'!  H5LTff_gen',&
+'! ',&
+'! PURPOSE',&
+'!  This module is generated at build by H5HL_buildiface.F90 to handle all the',&
+'!  detected REAL/INTEGER KINDs for APIs being passed those KINDs. Currently these ',&
+'!  are H5LT and H5TB APIs',&
+'!',&
+'! COPYRIGHT',&
+'! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *',&
+'!   Copyright by The HDF Group.                                               *',&
+'!   All rights reserved.                                                      *',&
+'!                                                                             *',&
+'!   This file is part of HDF5.  The full HDF5 copyright notice, including     *',&
+'!   terms governing use, modification, and redistribution, is contained in    *',&
+'!   the files COPYING and Copyright.html.  COPYING can be found at the root   *',&
+'!   of the source code distribution tree; Copyright.html can be found at the  *',&
+'!   root level of an installed copy of the electronic HDF5 document set and   *',&
+'!   is linked from the top-level documents page.  It can also be found at     *',&
+'!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *',&
+'!   access to either file, you may request a copy from help at hdfgroup.org.     *',&
+'! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *',&
+'!',&
+'! AUTHOR',&
+'!   H5HL_buildiface.F90',&
+'!',&
+'!*****'
+
+  WRITE(11,'(a)') "MODULE H5LT"
+
+  WRITE(11,'(A)') '  USE, INTRINSIC :: ISO_C_BINDING'
+  WRITE(11,'(A)') '  USE h5fortran_types'
+  WRITE(11,'(A)') '  USE H5LT_CONST'
+  WRITE(11,'(A)') '  IMPLICIT NONE'
+!***************
+! H5LT INTERFACES
+!***************
+!
+! H5LTmake_dataset_f
+!
+  WRITE(11,'(A)') "  INTERFACE h5ltmake_dataset_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     DO k = 1, 8
+        WRITE(11,'(A)') "     MODULE PROCEDURE h5ltmake_dataset_real_kind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+     ENDDO
+  END DO
+  DO i = 1, num_ikinds
+     j = ikind(i)
+     WRITE(chr2,'(I2)') j
+     DO k = 1, 8
+        WRITE(11,'(A)') "     MODULE PROCEDURE h5ltmake_dataset_integer_kind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+     ENDDO
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+!  h5ltread_dataset_f
+  WRITE(11,'(A)') "  INTERFACE h5ltread_dataset_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     DO k = 1, 8
+        WRITE(11,'(A)') "     MODULE PROCEDURE h5ltread_dataset_real_kind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+     ENDDO
+  END DO
+  DO i = 1, num_ikinds
+     j = ikind(i)
+     WRITE(chr2,'(I2)') j
+     DO k = 1, 8
+        WRITE(11,'(A)') "     MODULE PROCEDURE h5ltread_dataset_integer_kind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+     ENDDO
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+! h5ltread_dataset_int_f
+  WRITE(11,'(A)') "  INTERFACE h5ltread_dataset_int_f"
+  DO i = 1, num_ikinds
+     j = ikind(i)
+     WRITE(chr2,'(I2)') j
+     DO k = 1, 8
+        WRITE(11,'(A)') "     MODULE PROCEDURE h5ltread_dataset_int_kind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+     ENDDO
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+!  h5ltmake_dataset_int_f
+  WRITE(11,'(A)') "  INTERFACE h5ltmake_dataset_int_f"
+  DO i = 1, num_ikinds
+     j = ikind(i)
+     WRITE(chr2,'(I2)') j
+     DO k = 1, 8
+        WRITE(11,'(A)') "     MODULE PROCEDURE h5ltmake_dataset_int_kind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+     ENDDO
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+!  h5ltmake_dataset_float_f
+  WRITE(11,'(A)') "  INTERFACE h5ltmake_dataset_float_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     DO k = 1, 8
+        WRITE(11,'(A)') "     MODULE PROCEDURE h5ltmake_dataset_float_kind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+     ENDDO
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+!  h5ltmake_dataset_double_f
+  WRITE(11,'(A)') "  INTERFACE h5ltmake_dataset_double_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     DO k = 1, 8
+        WRITE(11,'(A)') "     MODULE PROCEDURE h5ltmake_dataset_double_kind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+     ENDDO
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+!  h5ltread_dataset_float_f
+  WRITE(11,'(A)') "  INTERFACE h5ltread_dataset_float_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     DO k = 1, 8
+        WRITE(11,'(A)') "     MODULE PROCEDURE h5ltread_dataset_float_kind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+     ENDDO
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+!  h5ltread_dataset_double_f
+  WRITE(11,'(A)') "  INTERFACE h5ltread_dataset_double_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     DO k = 1, 8
+        WRITE(11,'(A)') "     MODULE PROCEDURE h5ltread_dataset_double_kind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+     ENDDO
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+  WRITE(11,'(A)') 'CONTAINS'
+
+!**********************
+! H5LT APIs
+!**********************
+!
+! h5ltmake_dataset_f
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+     DO j = 1, 8
+
+! DLL definitions for windows
+        WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_HL_DLL)'
+        WRITE(11,'(A)') '!DEC$attributes dllexport :: h5ltmake_dataset_real_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+        WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API
+        WRITE(11,'(A)') '  SUBROUTINE h5ltmake_dataset_real_kind_'//TRIM(ADJUSTL(chr2))&
+             &//'_rank'//chr_rank(j)//'(loc_id,dset_name,rank,dims,type_id,buf,errcode)'
+        WRITE(11,'(A)') '    IMPLICIT NONE'
+        WRITE(11,'(A)') '    INTEGER(hid_t)  , INTENT(IN) :: loc_id'
+        WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(IN) :: dset_name'
+        WRITE(11,'(A)') '    INTEGER,          INTENT(IN) :: rank'
+        WRITE(11,'(A)') '    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims'
+        WRITE(11,'(A)') '    INTEGER(hid_t),   INTENT(in) :: type_id'
+        WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(IN)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+        WRITE(11,'(A)') '    INTEGER :: errcode '
+        WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        WRITE(11,'(A)') '    INTEGER(size_t) :: namelen'
+        
+        WRITE(11,'(A)') f_ptr_line(j)
+        WRITE(11,'(A)') '    namelen = LEN(dset_name)'
+        WRITE(11,'(A)') '    errcode = h5ltmake_dataset_c(loc_id,namelen,dset_name,rank,dims,type_id,f_ptr)'
+        WRITE(11,'(A)') '  END SUBROUTINE h5ltmake_dataset_real_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     ENDDO
+  ENDDO
+
+! h5ltread_dataset_f
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+     DO j = 1, 8
+
+! DLL definitions for windows
+        WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_HL_DLL)'
+        WRITE(11,'(A)') '!DEC$attributes dllexport :: h5ltread_dataset_real_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+        WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API
+        WRITE(11,'(A)') '  SUBROUTINE h5ltread_dataset_real_kind_'//TRIM(ADJUSTL(chr2))&
+             &//'_rank'//chr_rank(j)//'(loc_id,dset_name,type_id,buf,dims,errcode)'
+        WRITE(11,'(A)') '    IMPLICIT NONE'
+        WRITE(11,'(A)') '    INTEGER(hid_t)  , INTENT(IN) :: loc_id'
+        WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(IN) :: dset_name'
+        WRITE(11,'(A)') '    INTEGER(hid_t),   INTENT(in) :: type_id'
+        WRITE(11,'(A)') '    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims'
+        WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(IN)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+        WRITE(11,'(A)') '    INTEGER :: errcode '
+        WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        WRITE(11,'(A)') '    INTEGER(size_t) :: namelen'
+        
+        WRITE(11,'(A)') f_ptr_line(j)
+        WRITE(11,'(A)') '    namelen = LEN(dset_name)'
+        WRITE(11,'(A)') '    errcode = h5ltread_dataset_c(loc_id,namelen,dset_name,type_id,f_ptr)'
+        WRITE(11,'(A)') '  END SUBROUTINE h5ltread_dataset_real_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     ENDDO
+  ENDDO
+
+! h5ltmake_dataset_float_f
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+     DO j = 1, 8
+
+! DLL definitions for windows
+        WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_HL_DLL)'
+        WRITE(11,'(A)') '!DEC$attributes dllexport :: h5ltmake_dataset_float_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+        WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API
+        WRITE(11,'(A)') '  SUBROUTINE h5ltmake_dataset_float_kind_'//TRIM(ADJUSTL(chr2))&
+             &//'_rank'//chr_rank(j)//'(loc_id,dset_name,rank,dims,buf,errcode)'
+        WRITE(11,'(A)') '    IMPLICIT NONE'
+        WRITE(11,'(A)') '    INTEGER(hid_t)  , INTENT(IN) :: loc_id'
+        WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(IN) :: dset_name'
+        WRITE(11,'(A)') '    INTEGER,          INTENT(IN) :: rank'
+        WRITE(11,'(A)') '    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims'
+        WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(IN)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+        WRITE(11,'(A)') '    INTEGER :: errcode '
+        WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        WRITE(11,'(A)') '    INTEGER(size_t) :: namelen' 
+        
+        WRITE(11,'(A)') f_ptr_line(j)
+        WRITE(11,'(A)') '    namelen = LEN(dset_name)'
+        WRITE(11,'(A)') '    errcode = h5ltmake_dataset_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_REAL,f_ptr)'
+        WRITE(11,'(A)') '  END SUBROUTINE h5ltmake_dataset_float_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     ENDDO
+  ENDDO
+
+! h5ltread_dataset_float_f
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+     DO j = 1, 8
+
+! DLL definitions for windows
+        WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_HL_DLL)'
+        WRITE(11,'(A)') '!DEC$attributes dllexport :: h5ltread_dataset_float_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+        WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API
+        WRITE(11,'(A)') '  SUBROUTINE h5ltread_dataset_float_kind_'//TRIM(ADJUSTL(chr2))&
+             &//'_rank'//chr_rank(j)//'(loc_id,dset_name,buf,dims,errcode)'
+        WRITE(11,'(A)') '    IMPLICIT NONE'
+        WRITE(11,'(A)') '    INTEGER(hid_t)  , INTENT(IN) :: loc_id'
+        WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(IN) :: dset_name'
+        WRITE(11,'(A)') '    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims'
+        WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(IN)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+        WRITE(11,'(A)') '    INTEGER :: errcode '
+        WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        WRITE(11,'(A)') '    INTEGER(size_t) :: namelen' 
+        
+        WRITE(11,'(A)') f_ptr_line(j)
+        WRITE(11,'(A)') '    namelen = LEN(dset_name)'
+        WRITE(11,'(A)') '    errcode = h5ltread_dataset_c(loc_id,namelen,dset_name,H5T_NATIVE_REAL,f_ptr)'
+        WRITE(11,'(A)') '  END SUBROUTINE h5ltread_dataset_float_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     ENDDO
+  ENDDO
+
+! h5ltmake_dataset_double_f
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+     DO j = 1, 8
+! DLL definitions for windows
+        WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_HL_DLL)'
+        WRITE(11,'(A)') '!DEC$attributes dllexport :: h5ltmake_dataset_double_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+        WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API
+        WRITE(11,'(A)') '  SUBROUTINE h5ltmake_dataset_double_kind_'//TRIM(ADJUSTL(chr2))&
+             &//'_rank'//chr_rank(j)//'(loc_id,dset_name,rank,dims,buf,errcode)'
+        WRITE(11,'(A)') '    IMPLICIT NONE'
+        WRITE(11,'(A)') '    INTEGER(hid_t)  , INTENT(IN) :: loc_id'
+        WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(IN) :: dset_name'
+        WRITE(11,'(A)') '    INTEGER,          INTENT(IN) :: rank'
+        WRITE(11,'(A)') '    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims'
+        WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(IN)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+        WRITE(11,'(A)') '    INTEGER :: errcode '
+        WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        WRITE(11,'(A)') '    INTEGER(size_t) :: namelen' 
+        
+        WRITE(11,'(A)') f_ptr_line(j)
+        WRITE(11,'(A)') '    namelen = LEN(dset_name)'
+        WRITE(11,'(A)') '    errcode = h5ltmake_dataset_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_DOUBLE,f_ptr)'
+        WRITE(11,'(A)') '  END SUBROUTINE h5ltmake_dataset_double_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     ENDDO
+  ENDDO
+
+! h5ltread_dataset_double_f
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+     DO j = 1, 8
+
+! DLL definitions for windows
+        WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_HL_DLL)'
+        WRITE(11,'(A)') '!DEC$attributes dllexport :: h5ltread_dataset_double_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+        WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API
+        WRITE(11,'(A)') '  SUBROUTINE h5ltread_dataset_double_kind_'//TRIM(ADJUSTL(chr2))&
+             &//'_rank'//chr_rank(j)//'(loc_id,dset_name,buf,dims,errcode)'
+        WRITE(11,'(A)') '    IMPLICIT NONE'
+        WRITE(11,'(A)') '    INTEGER(hid_t)  , INTENT(IN) :: loc_id'
+        WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(IN) :: dset_name'
+        WRITE(11,'(A)') '    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims'
+        WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(IN)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+        WRITE(11,'(A)') '    INTEGER :: errcode '
+        WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        WRITE(11,'(A)') '    INTEGER(size_t) :: namelen' 
+        
+        WRITE(11,'(A)') f_ptr_line(j)
+        WRITE(11,'(A)') '    namelen = LEN(dset_name)'
+        WRITE(11,'(A)') '    errcode = h5ltread_dataset_c(loc_id,namelen,dset_name,H5T_NATIVE_DOUBLE,f_ptr)'
+        WRITE(11,'(A)') '  END SUBROUTINE h5ltread_dataset_double_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     ENDDO
+  ENDDO
+
+! h5ltmake_dataset_f
+  DO i = 1, num_ikinds
+     k = ikind(i)
+     WRITE(chr2,'(I2)') k
+     DO j = 1, 8
+
+! DLL definitions for windows
+        WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_HL_DLL)'
+        WRITE(11,'(A)') '!DEC$attributes dllexport :: h5ltmake_dataset_integer_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+        WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API
+        WRITE(11,'(A)') '  SUBROUTINE h5ltmake_dataset_integer_kind_'//TRIM(ADJUSTL(chr2))&
+             &//'_rank'//chr_rank(j)//'(loc_id,dset_name,rank,dims,type_id,buf,errcode)'
+        WRITE(11,'(A)') '    IMPLICIT NONE'
+        WRITE(11,'(A)') '    INTEGER(hid_t)  , INTENT(IN) :: loc_id'
+        WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(IN) :: dset_name'
+        WRITE(11,'(A)') '    INTEGER,          INTENT(IN) :: rank'
+        WRITE(11,'(A)') '    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims'
+        WRITE(11,'(A)') '    INTEGER(hid_t),   INTENT(in) :: type_id'
+        WRITE(11,'(A)') '    INTEGER(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(IN)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+        WRITE(11,'(A)') '    INTEGER :: errcode '
+        WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        WRITE(11,'(A)') '    INTEGER(size_t) :: namelen'
+        
+        WRITE(11,'(A)') f_ptr_line(j)
+        WRITE(11,'(A)') '    namelen = LEN(dset_name)'
+        WRITE(11,'(A)') '    errcode = h5ltmake_dataset_c(loc_id, namelen, dset_name, rank, dims, type_id, f_ptr)'
+        WRITE(11,'(A)') '  END SUBROUTINE h5ltmake_dataset_integer_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     ENDDO
+  ENDDO
+
+! h5ltmake_dataset_int_f
+  DO i = 1, num_ikinds
+     k = ikind(i)
+     WRITE(chr2,'(I2)') k
+     DO j = 1, 8
+
+! DLL definitions for windows
+        WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_HL_DLL)'
+        WRITE(11,'(A)') '!DEC$attributes dllexport :: h5ltmake_dataset_int_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+        WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API
+        WRITE(11,'(A)') '  SUBROUTINE h5ltmake_dataset_int_kind_'//TRIM(ADJUSTL(chr2))&
+             &//'_rank'//chr_rank(j)//'(loc_id,dset_name,rank,dims,buf,errcode)'
+        WRITE(11,'(A)') '    IMPLICIT NONE'
+        WRITE(11,'(A)') '    INTEGER(hid_t)  , INTENT(IN) :: loc_id'
+        WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(IN) :: dset_name'
+        WRITE(11,'(A)') '    INTEGER,          INTENT(IN) :: rank'
+        WRITE(11,'(A)') '    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims'
+        WRITE(11,'(A)') '    INTEGER(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(IN)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+        WRITE(11,'(A)') '    INTEGER :: errcode '
+        WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        WRITE(11,'(A)') '    INTEGER(size_t) :: namelen'
+        WRITE(11,'(A)') '    INTEGER(hid_t) :: type_id'
+        
+        WRITE(11,'(A)') f_ptr_line(j)
+        WRITE(11,'(A)') '    namelen = LEN(dset_name)'
+        WRITE(11,'(A)') '    type_id = h5kind_to_type(KIND('//f_ptr_line(j)(19:36)//'), H5_INTEGER_KIND)'
+        WRITE(11,'(A)') '    errcode = h5ltmake_dataset_c(loc_id, namelen, dset_name, rank, dims, type_id, f_ptr)'
+        WRITE(11,'(A)') '  END SUBROUTINE h5ltmake_dataset_int_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     ENDDO
+  ENDDO
+
+! h5ltread_dataset_f
+  DO i = 1, num_ikinds
+     k = ikind(i)
+     WRITE(chr2,'(I2)') k
+     DO j = 1, 8
+
+! DLL definitions for windows
+        WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_HL_DLL)'
+        WRITE(11,'(A)') '!DEC$attributes dllexport :: h5ltread_dataset_integer_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+        WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API
+        WRITE(11,'(A)') '  SUBROUTINE h5ltread_dataset_integer_kind_'//TRIM(ADJUSTL(chr2))&
+             &//'_rank'//chr_rank(j)//'(loc_id,dset_name, type_id, buf,dims,errcode)'
+        WRITE(11,'(A)') '    IMPLICIT NONE'
+        WRITE(11,'(A)') '    INTEGER(hid_t)  , INTENT(IN) :: loc_id'
+        WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(IN) :: dset_name'
+        WRITE(11,'(A)') '    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims'
+        WRITE(11,'(A)') '    INTEGER(hid_t),   INTENT(in) :: type_id'
+        WRITE(11,'(A)') '    INTEGER(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(IN)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+        WRITE(11,'(A)') '    INTEGER :: errcode '
+        WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        WRITE(11,'(A)') '    INTEGER(size_t) :: namelen'
+
+        WRITE(11,'(A)') f_ptr_line(j)
+        WRITE(11,'(A)') '    namelen = LEN(dset_name)'
+        WRITE(11,'(A)') '    errcode = h5ltread_dataset_c(loc_id, namelen, dset_name, type_id, f_ptr)'
+        WRITE(11,'(A)') '  END SUBROUTINE h5ltread_dataset_integer_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     ENDDO
+  ENDDO
+
+! h5ltread_dataset_int_f
+  DO i = 1, num_ikinds
+     k = ikind(i)
+     WRITE(chr2,'(I2)') k
+     DO j = 1, 8
+
+! DLL definitions for windows
+        WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_HL_DLL)'
+        WRITE(11,'(A)') '!DEC$attributes dllexport :: h5ltread_dataset_int_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+        WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API
+        WRITE(11,'(A)') '  SUBROUTINE h5ltread_dataset_int_kind_'//TRIM(ADJUSTL(chr2))&
+             &//'_rank'//chr_rank(j)//'(loc_id,dset_name, buf,dims,errcode)'
+        WRITE(11,'(A)') '    IMPLICIT NONE'
+        WRITE(11,'(A)') '    INTEGER(hid_t)  , INTENT(IN) :: loc_id'
+        WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(IN) :: dset_name'
+        WRITE(11,'(A)') '    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims'
+        WRITE(11,'(A)') '    INTEGER(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(IN)'//TRIM(rank_dim_line(j))//', TARGET :: buf'
+        WRITE(11,'(A)') '    INTEGER :: errcode '
+        WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        WRITE(11,'(A)') '    INTEGER(size_t) :: namelen'
+        WRITE(11,'(A)') '    INTEGER(hid_t) :: type_id'
+
+        WRITE(11,'(A)') f_ptr_line(j)
+        WRITE(11,'(A)') '    namelen = LEN(dset_name)'
+        WRITE(11,'(A)') '    type_id = h5kind_to_type(KIND('//f_ptr_line(j)(19:36)//'), H5_INTEGER_KIND)'
+        WRITE(11,'(A)') '    errcode = h5ltread_dataset_c(loc_id, namelen, dset_name, type_id, f_ptr)'
+        WRITE(11,'(A)') '  END SUBROUTINE h5ltread_dataset_int_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     ENDDO
+  ENDDO
+
+  WRITE(11,'(A)') 'END MODULE H5LT' ! change this to be generic MSB
+
+  CLOSE(11)
+
+! Generate Fortran H5TB* interfaces having multiple KIND interfaces.
+
+
+  OPEN(11,FILE='H5TBff_gen.F90')
+  WRITE(11,'(40(A,/))') &
+'!****h* ROBODoc/H5TBff_gen.F90',&
+'!',&
+'! NAME',&
+'!  H5TBff_gen',&
+'! ',&
+'! PURPOSE',&
+'!  This module is generated at build by H5HL_buildiface.F90 to handle all the',&
+'!  detected REAL/INTEGER KINDs for APIs being passed those KINDs. Currently these ',&
+'!  are H5LT and H5TB APIs',&
+'!',&
+'! COPYRIGHT',&
+'! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *',&
+'!   Copyright by The HDF Group.                                               *',&
+'!   All rights reserved.                                                      *',&
+'!                                                                             *',&
+'!   This file is part of HDF5.  The full HDF5 copyright notice, including     *',&
+'!   terms governing use, modification, and redistribution, is contained in    *',&
+'!   the files COPYING and Copyright.html.  COPYING can be found at the root   *',&
+'!   of the source code distribution tree; Copyright.html can be found at the  *',&
+'!   root level of an installed copy of the electronic HDF5 document set and   *',&
+'!   is linked from the top-level documents page.  It can also be found at     *',&
+'!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *',&
+'!   access to either file, you may request a copy from help at hdfgroup.org.     *',&
+'! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *',&
+'!',&
+'! AUTHOR',&
+'!   H5HL_buildiface.F90',&
+'!',&
+'!*****'
+
+  WRITE(11,'(a)') "MODULE H5TB"
+
+  WRITE(11,'(A)') '  USE, INTRINSIC :: ISO_C_BINDING'
+  WRITE(11,'(A)') '  USE h5fortran_types'
+  WRITE(11,'(A)') '  USE H5TB_CONST'
+  WRITE(11,'(A)') '  IMPLICIT NONE'
+
+!***************
+! H5TB INTERFACES
+!***************
+
+!  h5tbwrite_field_name_f
+  WRITE(11,'(A)') "  INTERFACE h5tbwrite_field_name_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     k =2
+     WRITE(11,'(A)') "     MODULE PROCEDURE h5tbwrite_field_name_kind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+!  h5tbread_field_name_f
+  WRITE(11,'(A)') "  INTERFACE h5tbread_field_name_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     k = 2
+     WRITE(11,'(A)') "     MODULE PROCEDURE h5tbread_field_name_kind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+!  h5tbwrite_field_index_f
+  WRITE(11,'(A)') "  INTERFACE h5tbwrite_field_index_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     k = 2
+     WRITE(11,'(A)') "     MODULE PROCEDURE h5tbwrite_field_index_kind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+!  h5tbread_field_index_f
+  WRITE(11,'(A)') "  INTERFACE h5tbread_field_index_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     k = 2
+     WRITE(11,'(A)') "     MODULE PROCEDURE h5tbread_field_index_kind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+!  h5tbinsert_field_f
+  WRITE(11,'(A)') "  INTERFACE h5tbinsert_field_f"
+  DO i = 1, num_rkinds
+     j = rkind(i)
+     WRITE(chr2,'(I2)') j
+     k = 2
+     WRITE(11,'(A)') "     MODULE PROCEDURE h5tbinsert_field_kind_"//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(k)
+  END DO
+  WRITE(11,'(A)') "  END INTERFACE"
+
+  WRITE(11,'(A)') 'CONTAINS'
+
+  !**********************
+  ! H5TB APIs
+  !**********************
+
+  ! h5tbwrite_field_name_f
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+     j = 2
+! DLL definitions for windows
+     WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_HL_DLL)'
+     WRITE(11,'(A)') '!DEC$attributes dllexport :: h5tbwrite_field_name_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API
+     WRITE(11,'(A)') '  SUBROUTINE h5tbwrite_field_name_kind_'//TRIM(ADJUSTL(chr2))&
+          &//'_rank'//chr_rank(j)//'(loc_id,dset_name,field_name,start, nrecords,type_size,buf,errcode)'
+     WRITE(11,'(A)') '    IMPLICIT NONE'
+     WRITE(11,'(A)') '    INTEGER(hid_t)  , INTENT(IN) :: loc_id'
+     WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(IN) :: dset_name'
+     WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(in) :: field_name'
+     WRITE(11,'(A)') '    INTEGER(hsize_t), INTENT(in) :: start'
+     WRITE(11,'(A)') '    INTEGER(hsize_t), INTENT(in) :: nrecords'
+     WRITE(11,'(A)') '    INTEGER(size_t),  INTENT(in) :: type_size'
+     WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(IN), DIMENSION(*), TARGET :: buf'
+     WRITE(11,'(A)') '    INTEGER :: errcode '
+     WRITE(11,'(A)') '    INTEGER(size_t) :: namelen' 
+     WRITE(11,'(A)') '    INTEGER(size_t) :: namelen1' 
+     WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        
+     WRITE(11,'(A)') f_ptr_line(j)
+     WRITE(11,'(A)') '    namelen = LEN(dset_name)'
+     WRITE(11,'(A)') '    namelen1 = LEN(field_name)'
+     WRITE(11,'(A)') &
+          '    errcode = h5tbwrite_field_name_c(loc_id,namelen,dset_name,namelen1,field_name,start,nrecords,type_size,f_ptr)'
+     WRITE(11,'(A)') '  END SUBROUTINE h5tbwrite_field_name_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+  ENDDO
+
+  ! h5tbread_field_name_f
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+     j = 2
+! DLL definitions for windows
+     WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_HL_DLL)'
+     WRITE(11,'(A)') '!DEC$attributes dllexport :: h5tbread_field_name_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API
+     WRITE(11,'(A)') '  SUBROUTINE h5tbread_field_name_kind_'//TRIM(ADJUSTL(chr2))&
+          &//'_rank'//chr_rank(j)//'(loc_id,dset_name,field_name,start, nrecords,type_size,buf,errcode)'
+     WRITE(11,'(A)') '    IMPLICIT NONE'
+     WRITE(11,'(A)') '    INTEGER(hid_t)  , INTENT(IN) :: loc_id'
+     WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(IN) :: dset_name'
+     WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(in) :: field_name'
+     WRITE(11,'(A)') '    INTEGER(hsize_t), INTENT(in) :: start'
+     WRITE(11,'(A)') '    INTEGER(hsize_t), INTENT(in) :: nrecords'
+     WRITE(11,'(A)') '    INTEGER(size_t),  INTENT(in) :: type_size'
+     WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(IN), DIMENSION(*), TARGET :: buf'
+     WRITE(11,'(A)') '    INTEGER :: errcode '
+     WRITE(11,'(A)') '    INTEGER(size_t) :: namelen' 
+     WRITE(11,'(A)') '    INTEGER(size_t) :: namelen1' 
+     WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        
+     WRITE(11,'(A)') f_ptr_line(j)
+     WRITE(11,'(A)') '    namelen = LEN(dset_name)'
+     WRITE(11,'(A)') '    namelen1 = LEN(field_name)'
+     WRITE(11,'(A)') &
+          '    errcode = h5tbread_field_name_c(loc_id,namelen,dset_name,namelen1,field_name,start,nrecords,type_size,f_ptr)'
+     WRITE(11,'(A)') '  END SUBROUTINE h5tbread_field_name_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+  ENDDO
+
+  ! h5tbwrite_field_index_f
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+     j = 2
+! DLL definitions for windows
+     WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_HL_DLL)'
+     WRITE(11,'(A)') '!DEC$attributes dllexport :: h5tbwrite_field_index_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API
+     WRITE(11,'(A)') '  SUBROUTINE h5tbwrite_field_index_kind_'//TRIM(ADJUSTL(chr2))&
+          &//'_rank'//chr_rank(j)//'(loc_id,dset_name,field_index,start, nrecords,type_size,buf,errcode)'
+     WRITE(11,'(A)') '    IMPLICIT NONE'
+     WRITE(11,'(A)') '    INTEGER(hid_t)  , INTENT(IN) :: loc_id'
+     WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(IN) :: dset_name'
+     WRITE(11,'(A)') '    INTEGER, INTENT(in) :: field_index'
+     WRITE(11,'(A)') '    INTEGER(hsize_t), INTENT(in) :: start'
+     WRITE(11,'(A)') '    INTEGER(hsize_t), INTENT(in) :: nrecords'
+     WRITE(11,'(A)') '    INTEGER(size_t),  INTENT(in) :: type_size'
+     WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(IN), DIMENSION(*), TARGET :: buf'
+     WRITE(11,'(A)') '    INTEGER :: errcode '
+     WRITE(11,'(A)') '    INTEGER(size_t) :: namelen' 
+     WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        
+     WRITE(11,'(A)') f_ptr_line(j)
+     WRITE(11,'(A)') '    namelen = LEN(dset_name)'
+     WRITE(11,'(A)') &
+          '    errcode = h5tbwrite_field_index_c(loc_id,namelen,dset_name,field_index,start,nrecords,type_size,f_ptr)'
+     WRITE(11,'(A)') '  END SUBROUTINE h5tbwrite_field_index_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+  ENDDO
+
+  ! h5tbread_field_index_f
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+     j = 2
+! DLL definitions for windows
+     WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_HL_DLL)'
+     WRITE(11,'(A)') '!DEC$attributes dllexport :: h5tbread_field_index_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API
+     WRITE(11,'(A)') '  SUBROUTINE h5tbread_field_index_kind_'//TRIM(ADJUSTL(chr2))&
+          &//'_rank'//chr_rank(j)//'(loc_id,dset_name,field_index,start, nrecords,type_size,buf,errcode)'
+     WRITE(11,'(A)') '    IMPLICIT NONE'
+     WRITE(11,'(A)') '    INTEGER(hid_t)  , INTENT(IN) :: loc_id'
+     WRITE(11,'(A)') '    CHARACTER(LEN=*), INTENT(IN) :: dset_name'
+     WRITE(11,'(A)') '    INTEGER, INTENT(in) :: field_index'
+     WRITE(11,'(A)') '    INTEGER(hsize_t), INTENT(in) :: start'
+     WRITE(11,'(A)') '    INTEGER(hsize_t), INTENT(in) :: nrecords'
+     WRITE(11,'(A)') '    INTEGER(size_t),  INTENT(in) :: type_size'
+     WRITE(11,'(A)') '    REAL(KIND='//TRIM(ADJUSTL(chr2))//'),INTENT(IN), DIMENSION(*), TARGET :: buf'
+     WRITE(11,'(A)') '    INTEGER :: errcode '
+     WRITE(11,'(A)') '    INTEGER(size_t) :: namelen'
+     WRITE(11,'(A)') '    TYPE(C_PTR) :: f_ptr'
+        
+     WRITE(11,'(A)') f_ptr_line(j)
+     WRITE(11,'(A)') '    namelen = LEN(dset_name)'
+     WRITE(11,'(A)') &
+          '    errcode = h5tbread_field_index_c(loc_id,namelen,dset_name,field_index,start,nrecords,type_size,f_ptr)'
+     WRITE(11,'(A)') '  END SUBROUTINE h5tbread_field_index_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+  ENDDO
+
+  ! h5tbinsert_field_f
+  DO i = 1, num_rkinds
+     k = rkind(i)
+     WRITE(chr2,'(I2)') k
+     j = 2
+! DLL definitions for windows
+     WRITE(11,'(A)') '!DEC$if defined(BUILD_HDF5_HL_DLL)'
+     WRITE(11,'(A)') '!DEC$attributes dllexport :: h5tbinsert_field_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+     WRITE(11,'(A)') '!DEC$endif'
+
+! Subroutine API
+     WRITE(11,'(A)') '  SUBROUTINE h5tbinsert_field_kind_'//TRIM(ADJUSTL(chr2))&
+          &//'_rank'//chr_rank(j)//'(loc_id,dset_name,field_name,field_type,field_index,buf,errcode)'
+     WRITE(11,'(A)') '    IMPLICIT NONE'
+     WRITE(11,'(A)') '        INTEGER(hid_t),   INTENT(in) :: loc_id'
+     WRITE(11,'(A)') '        CHARACTER(LEN=*), INTENT(in) :: dset_name'
+     WRITE(11,'(A)') '        CHARACTER(LEN=*), INTENT(in) :: field_name'
+     WRITE(11,'(A)') '        INTEGER(hid_t), INTENT(in)   :: field_type'
+     WRITE(11,'(A)') '        INTEGER, INTENT(in) :: field_index'
+     WRITE(11,'(A)') '        REAL(KIND='//TRIM(ADJUSTL(chr2))//'), INTENT(in), DIMENSION(*), TARGET :: buf'
+     WRITE(11,'(A)') '        INTEGER(size_t) :: namelen'
+     WRITE(11,'(A)') '        INTEGER(size_t) :: namelen1'
+     WRITE(11,'(A)') '        INTEGER :: errcode'
+     WRITE(11,'(A)') '        TYPE(C_PTR) :: f_ptr'
+        
+     WRITE(11,'(A)') f_ptr_line(j)
+     WRITE(11,'(A)') '    namelen = LEN(dset_name)'
+     WRITE(11,'(A)') '    namelen1 = LEN(field_name)'
+     WRITE(11,'(A)') &
+          '    errcode = h5tbinsert_field_c(loc_id,namelen,dset_name,namelen1,field_name,field_type,field_index,f_ptr)'
+     WRITE(11,'(A)') '  END SUBROUTINE h5tbinsert_field_kind_'//TRIM(ADJUSTL(chr2))//'_rank'//chr_rank(j)
+  ENDDO
+
+  WRITE(11,'(A)') 'END MODULE H5TB'
+
+  CLOSE(11)
+
+END PROGRAM H5HL_buildiface
+
+
+
diff --git a/hl/fortran/src/H5IMcc.c b/hl/fortran/src/H5IMcc.c
index c1bc3af..ae58fab 100644
--- a/hl/fortran/src/H5IMcc.c
+++ b/hl/fortran/src/H5IMcc.c
@@ -511,7 +511,7 @@ herr_t H5IM_get_palette(hid_t loc_id,
     goto out;
 
    /* Get the palette id */
-   if((pal_id = H5Rdereference(image_id, H5R_OBJECT, &refbuf[pal_number])) < 0)
+   if((pal_id = H5Rdereference2(image_id, H5P_DEFAULT, H5R_OBJECT, &refbuf[pal_number])) < 0)
     goto out;
 
    /* Read the palette dataset using the memory type TID */
@@ -525,7 +525,7 @@ herr_t H5IM_get_palette(hid_t loc_id,
    if(H5Dclose(pal_id) < 0)
     goto out;
 
-   free(refbuf);
+   HDfree(refbuf);
 
   } /* H5T_REFERENCE */
 
diff --git a/hl/fortran/src/H5IMfc.c b/hl/fortran/src/H5IMfc.c
index 04e41dc..7ad50d6 100644
--- a/hl/fortran/src/H5IMfc.c
+++ b/hl/fortran/src/H5IMfc.c
@@ -39,7 +39,7 @@
 */
 
 int_f
-nh5immake_image_8bit_c (hid_t_f *loc_id,
+h5immake_image_8bit_c (hid_t_f *loc_id,
                         size_t_f *namelen,
                         _fcd name,
                         hsize_t_f *width,
@@ -73,7 +73,7 @@ nh5immake_image_8bit_c (hid_t_f *loc_id,
 
 done:
     if(c_name!=NULL)
-        free(c_name);
+        HDfree(c_name);
 
     return ret_value;
 
@@ -100,7 +100,7 @@ done:
 */
 
 int_f
-nh5imread_image_c (hid_t_f *loc_id,
+h5imread_image_c (hid_t_f *loc_id,
                    size_t_f *namelen,
                    _fcd name,
                    int_f *buf)
@@ -128,7 +128,7 @@ nh5imread_image_c (hid_t_f *loc_id,
 
 done:
     if(c_name!=NULL)
-        free(c_name);
+        HDfree(c_name);
 
     return ret_value;
 }
@@ -153,7 +153,7 @@ done:
 */
 
 int_f
-nh5immake_image_24bit_c (hid_t_f *loc_id,
+h5immake_image_24bit_c (hid_t_f *loc_id,
                          size_t_f *namelen,
                          _fcd name,
                          size_t_f *ilen,
@@ -195,9 +195,9 @@ nh5immake_image_24bit_c (hid_t_f *loc_id,
 
 done:
     if(c_name!=NULL)
-        free(c_name);
+        HDfree(c_name);
     if(c_il!=NULL)
-        free(c_il);
+        HDfree(c_il);
 
     return ret_value;
 }
@@ -222,7 +222,7 @@ done:
 */
 
 int_f
-nh5imget_image_info_c(hid_t_f *loc_id,
+h5imget_image_info_c(hid_t_f *loc_id,
                       size_t_f *namelen,
                       _fcd name,
                       hsize_t_f *width,
@@ -279,9 +279,9 @@ nh5imget_image_info_c(hid_t_f *loc_id,
 
 done:
     if(c_name!=NULL)
-        free(c_name);
+        HDfree(c_name);
     if(c_buf!=NULL)
-        free(c_buf);
+        HDfree(c_buf);
 
     return ret_value;
 }
@@ -307,7 +307,7 @@ done:
 */
 
 int_f
-nh5imis_image_c(hid_t_f *loc_id,
+h5imis_image_c(hid_t_f *loc_id,
                 size_t_f *namelen,
                 _fcd name)
 {
@@ -329,7 +329,7 @@ nh5imis_image_c(hid_t_f *loc_id,
     ret = H5IMis_image(c_loc_id, c_name);
 
     if(c_name!=NULL)
-        free(c_name);
+        HDfree(c_name);
 
     return ret;
 
@@ -356,7 +356,7 @@ nh5imis_image_c(hid_t_f *loc_id,
 */
 
 int_f
-nh5immake_palette_c (hid_t_f *loc_id,
+h5immake_palette_c (hid_t_f *loc_id,
                      size_t_f *namelen,
                      _fcd name,
                      hsize_t_f *dims,
@@ -411,7 +411,7 @@ done:
 */
 
 int_f
-nh5imlink_palette_c (hid_t_f *loc_id,
+h5imlink_palette_c (hid_t_f *loc_id,
                      size_t_f *namelen,
                      _fcd name,
                      size_t_f *ilen,
@@ -448,9 +448,9 @@ nh5imlink_palette_c (hid_t_f *loc_id,
 
 done:
     if(c_name!=NULL)
-        free(c_name);
+        HDfree(c_name);
     if(c_namepal!=NULL)
-        free(c_namepal);
+        HDfree(c_namepal);
 
     return ret_value;
 }
@@ -476,7 +476,7 @@ done:
 */
 
 int_f
-nh5imunlink_palette_c (hid_t_f *loc_id,
+h5imunlink_palette_c (hid_t_f *loc_id,
                        size_t_f *namelen,
                        _fcd name,
                        size_t_f *ilen,
@@ -513,9 +513,9 @@ nh5imunlink_palette_c (hid_t_f *loc_id,
 
 done:
     if(c_name!=NULL)
-        free(c_name);
+        HDfree(c_name);
     if(c_namepal!=NULL)
-        free(c_namepal);
+        HDfree(c_namepal);
 
     return ret_value;
 }
@@ -542,7 +542,7 @@ done:
 */
 
 int_f
-nh5imget_npalettes_c(hid_t_f *loc_id,
+h5imget_npalettes_c(hid_t_f *loc_id,
                      size_t_f *namelen,
                      _fcd name,
                      hsize_t_f *npals)
@@ -576,7 +576,7 @@ nh5imget_npalettes_c(hid_t_f *loc_id,
 
 done:
     if(c_name!=NULL)
-        free(c_name);
+        HDfree(c_name);
 
     return ret_value;
 }
@@ -604,7 +604,7 @@ done:
 
 
 int_f
-nh5imget_palette_info_c(hid_t_f *loc_id,
+h5imget_palette_info_c(hid_t_f *loc_id,
                         size_t_f *namelen,
                         _fcd name,
                         int_f *pal_number,
@@ -644,7 +644,7 @@ nh5imget_palette_info_c(hid_t_f *loc_id,
 
 done:
     if(c_name!=NULL)
-        free(c_name);
+        HDfree(c_name);
 
     return ret_value;
 }
@@ -671,7 +671,7 @@ done:
 
 
 int_f
-nh5imget_palette_c(hid_t_f *loc_id,
+h5imget_palette_c(hid_t_f *loc_id,
                    size_t_f *namelen,
                    _fcd name,
                    int_f *pal_number,
@@ -703,7 +703,7 @@ nh5imget_palette_c(hid_t_f *loc_id,
 
 done:
     if(c_name!=NULL)
-        free(c_name);
+        HDfree(c_name);
 
     return ret_value;
 }
@@ -729,7 +729,7 @@ done:
 */
 
 int_f
-nh5imis_palette_c(hid_t_f *loc_id,
+h5imis_palette_c(hid_t_f *loc_id,
                   size_t_f *namelen,
                   _fcd name)
 {
@@ -751,7 +751,7 @@ nh5imis_palette_c(hid_t_f *loc_id,
     ret = H5IMis_palette(c_loc_id, c_name);
 
     if(c_name!=NULL)
-        free(c_name);
+        HDfree(c_name);
 
     return ret;
 
diff --git a/hl/fortran/src/H5IMff.F90 b/hl/fortran/src/H5IMff.F90
new file mode 100644
index 0000000..4408dda
--- /dev/null
+++ b/hl/fortran/src/H5IMff.F90
@@ -0,0 +1,667 @@
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+!
+! This file contains FORTRAN interfaces for H5IM functions
+!
+! NOTES
+!
+!       _____ __  __ _____   ____  _____ _______       _   _ _______
+!      |_   _|  \/  |  __ \ / __ \|  __ \__   __|/\   | \ | |__   __|
+! ****   | | | \  / | |__) | |  | | |__) | | |  /  \  |  \| |  | |    ****
+! ****   | | | |\/| |  ___/| |  | |  _  /  | | / /\ \ | . ` |  | |    ****
+! ****  _| |_| |  | | |    | |__| | | \ \  | |/ ____ \| |\  |  | |    ****
+!      |_____|_|  |_|_|     \____/|_|  \_\ |_/_/    \_\_| \_|  |_|
+!                             
+!  If you add a new function here then you MUST add the function name to the
+!  Windows dll file 'hdf5_hl_fortrandll.def.in' in the hl/fortran/src directory.
+!  This is needed for Windows based operating systems.
+!
+
+MODULE h5im
+  USE, INTRINSIC :: ISO_C_BINDING
+  USE h5fortran_types
+  USE hdf5
+CONTAINS
+
+!-------------------------------------------------------------------------
+! Function: h5immake_image_8bit_f
+!
+! Purpose: Creates and writes an image an 8 bit image
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 05, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE h5immake_image_8bit_f(loc_id,&
+       dset_name,&
+       width,&
+       height,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER(hsize_t), INTENT(in) :: width              ! width of image
+    INTEGER(hsize_t), INTENT(in) :: height             ! height of image
+    INTEGER, INTENT(in), DIMENSION(*) :: buf           ! buffer
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                         ! name length
+
+    INTERFACE
+       INTEGER FUNCTION h5immake_image_8bit_c(loc_id,namelen,dset_name,width,height,buf) &
+            BIND(C,NAME='h5immake_image_8bit_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
+         INTEGER(size_t) :: namelen                              ! length of name buffer
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name   ! name of the dataset
+         INTEGER(hsize_t), INTENT(in) :: width                   ! width of image
+         INTEGER(hsize_t), INTENT(in) :: height                  ! height of image
+         INTEGER         , INTENT(in), DIMENSION(*) :: buf       ! buffer
+       END FUNCTION h5immake_image_8bit_c
+    END INTERFACE
+    
+    namelen = LEN(dset_name)
+    errcode = h5immake_image_8bit_c(loc_id,namelen,dset_name,width,height,buf)
+    
+  END SUBROUTINE h5immake_image_8bit_f
+
+!-------------------------------------------------------------------------
+! Function: h5imread_image_f
+!
+! Purpose: Reads image data from disk.
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 05, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+  SUBROUTINE h5imread_image_f(loc_id,&
+       dset_name,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+   
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER, INTENT(inout), DIMENSION(*) :: buf        ! buffer
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                         ! name length
+
+    INTERFACE
+       INTEGER FUNCTION h5imread_image_c(loc_id,namelen,dset_name,buf) &
+            BIND(C,NAME='h5imread_image_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
+         INTEGER(size_t) :: namelen                              ! length of name buffer
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name               ! name of the dataset
+         INTEGER, INTENT(inout), DIMENSION(*) :: buf             ! buffer
+       END FUNCTION h5imread_image_c
+    END INTERFACE
+    
+    namelen = LEN(dset_name)
+    errcode = h5imread_image_c(loc_id,namelen,dset_name,buf)
+    
+  END SUBROUTINE h5imread_image_f
+
+!-------------------------------------------------------------------------
+! Function: h5immake_image_24bit_f
+!
+! Purpose: Creates and writes an image a 24 bit image
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 05, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE h5immake_image_24bit_f(loc_id,&
+       dset_name,&
+       width,&
+       height,&
+       il,&
+       buf,&
+       errcode )
+    
+    IMPLICIT NONE
+
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER(hsize_t), INTENT(in) :: width              ! width of image
+    INTEGER(hsize_t), INTENT(in) :: height             ! height of image
+    CHARACTER(len=*), INTENT(in) :: il                 ! interlace
+    INTEGER, INTENT(in), DIMENSION(*) :: buf           ! buffer
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER(size_t) :: ILEN                                    ! name length
+    
+    INTERFACE
+       INTEGER FUNCTION h5immake_image_24bit_c(loc_id,namelen,dset_name,ILEN,il,width,height,buf) &
+            BIND(C,NAME='h5immake_image_24bit_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name               ! name of the dataset
+         INTEGER(hsize_t), INTENT(in) :: width                   ! width of image
+         INTEGER(hsize_t), INTENT(in) :: height                  ! height of image
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: il                      ! interlace
+         INTEGER, INTENT(in), DIMENSION(*) :: buf                ! buffer
+         INTEGER(size_t) :: namelen                                      ! length of name buffer
+         INTEGER(size_t) :: ILEN                                         ! name length
+         
+       END FUNCTION h5immake_image_24bit_c
+    END INTERFACE
+    
+    namelen = LEN(dset_name)
+    ILEN    = LEN(il)
+    errcode = h5immake_image_24bit_c(loc_id,namelen,dset_name,ILEN,il,width,height,buf)
+    
+  END SUBROUTINE h5immake_image_24bit_f
+
+!-------------------------------------------------------------------------
+! Function: h5imget_image_info_f
+!
+! Purpose: Gets information about an image dataset (dimensions, interlace mode
+!          and number of associated palettes).
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 05, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE h5imget_image_info_f(loc_id,&
+       dset_name,&
+       width,&
+       height,&
+       planes,&
+       interlace,&
+       npals,&
+       errcode )
+    
+    IMPLICIT NONE
+
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER(hsize_t), INTENT(inout) :: width           ! width of image
+    INTEGER(hsize_t), INTENT(inout) :: height          ! height of image
+    INTEGER(hsize_t), INTENT(inout) :: planes          ! color planes
+    INTEGER(hsize_t), INTENT(inout) :: npals           ! palettes
+    CHARACTER(len=*), INTENT(inout) :: interlace       ! interlace
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER(size_t) :: ILEN                                    ! name length
+    
+    INTERFACE
+       INTEGER FUNCTION h5imget_image_info_c(loc_id,namelen,dset_name,width,height,planes,npals,ILEN,interlace) &
+            BIND(C,NAME='h5imget_image_info_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name          ! name of the dataset
+         INTEGER(hsize_t), INTENT(inout) :: width           ! width of image
+         INTEGER(hsize_t), INTENT(inout) :: height          ! height of image
+         INTEGER(hsize_t), INTENT(inout) :: planes          ! color planes
+         INTEGER(hsize_t), INTENT(inout) :: npals           ! palettes
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(inout) :: interlace       ! interlace
+         INTEGER(size_t) :: namelen                                 ! name length
+         INTEGER(size_t) :: ILEN                                    ! name length
+       END FUNCTION h5imget_image_info_c
+    END INTERFACE
+    
+    namelen = LEN(dset_name)
+    ILEN    = LEN(interlace)
+    errcode = h5imget_image_info_c(loc_id,namelen,dset_name,width,height,planes,npals,ILEN,interlace)
+    
+  END SUBROUTINE h5imget_image_info_f
+
+!-------------------------------------------------------------------------
+! Function: h5imis_image_f
+!
+! Purpose: Inquires if a dataset is an image
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 05, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  INTEGER FUNCTION h5imis_image_f(loc_id,&
+       dset_name)
+
+    IMPLICIT NONE
+
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    
+    INTERFACE
+       INTEGER FUNCTION h5imis_image_c(loc_id,namelen,dset_name) &
+            BIND(C,NAME='h5imis_image_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
+         INTEGER(size_t) :: namelen                                      ! length of name buffer
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name               ! name of the dataset
+       END FUNCTION h5imis_image_c
+    END INTERFACE
+    
+    namelen = LEN(dset_name)
+    errcode = h5imis_image_c(loc_id,namelen,dset_name)
+    h5imis_image_f = errcode
+    
+  END FUNCTION h5imis_image_f
+  
+
+!-------------------------------------------------------------------------
+! Function: h5immake_palette_f
+!
+! Purpose: Creates and writes a palette
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 06, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE h5immake_palette_f(loc_id,&
+       dset_name,&
+       pal_dims,&
+       buf,&
+       errcode )
+    
+    IMPLICIT NONE
+    
+    INTEGER(hid_t),   INTENT(in) :: loc_id                 ! file or group identifier
+    CHARACTER(len=*), INTENT(in) :: dset_name              ! name of the dataset
+    INTEGER(hsize_t), INTENT(in), DIMENSION(*) :: pal_dims ! dimensions
+    INTEGER, INTENT(in), DIMENSION(*) :: buf               ! buffer
+    INTEGER :: errcode                                     ! error code
+    INTEGER(size_t) :: namelen                                     ! name length
+    
+    INTERFACE
+       INTEGER FUNCTION h5immake_palette_c(loc_id,namelen,dset_name,pal_dims,buf) &
+            BIND(C,NAME='h5immake_palette_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
+         INTEGER(size_t) :: namelen                                      ! length of name buffer
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name               ! name of the dataset
+         INTEGER(hsize_t), INTENT(in), DIMENSION(*) :: pal_dims  ! dimensions
+         INTEGER, INTENT(in), DIMENSION(*) :: buf                ! buffer
+       END FUNCTION h5immake_palette_c
+    END INTERFACE
+    
+    namelen = LEN(dset_name)
+    errcode = h5immake_palette_c(loc_id,namelen,dset_name,pal_dims,buf)
+    
+  END SUBROUTINE h5immake_palette_f
+  
+!-------------------------------------------------------------------------
+! Function: h5imlink_palette_f
+!
+! Purpose: This function attaches a palette to an existing image dataset
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 06, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE h5imlink_palette_f(loc_id,&
+       dset_name,&
+       pal_name,&
+       errcode )
+    
+    IMPLICIT NONE
+    
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
+    CHARACTER(len=*), INTENT(in) :: pal_name           ! palette name
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER(size_t) :: ILEN                                    ! name length
+    
+    INTERFACE
+       INTEGER FUNCTION h5imlink_palette_c(loc_id,namelen,dset_name,ILEN,pal_name) &
+            BIND(C,NAME='h5imlink_palette_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name          ! name of the dataset
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: pal_name           ! palette name
+         INTEGER(size_t) :: namelen                                 ! name length
+         INTEGER(size_t) :: ILEN                                    ! name length
+       END FUNCTION h5imlink_palette_c
+    END INTERFACE
+    
+    namelen = LEN(dset_name)
+    ILEN    = LEN(pal_name)
+    errcode = h5imlink_palette_c(loc_id,namelen,dset_name,ILEN,pal_name)
+    
+  END SUBROUTINE h5imlink_palette_f
+  
+
+!-------------------------------------------------------------------------
+! Function: h5imunlink_palette_f
+!
+! Purpose: This function dettaches a palette to an existing image dataset
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 06, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE h5imunlink_palette_f(loc_id,&
+       dset_name,&
+       pal_name,&
+       errcode )
+    
+    IMPLICIT NONE
+
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
+    CHARACTER(len=*), INTENT(in) :: pal_name           ! palette name
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER(size_t) :: ILEN                                    ! name length
+    
+    INTERFACE
+       INTEGER FUNCTION h5imunlink_palette_c(loc_id,namelen,dset_name,ILEN,pal_name) &
+            BIND(C,NAME='h5imunlink_palette_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name          ! name of the dataset
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: pal_name           ! palette name
+         INTEGER(size_t) :: namelen                                 ! name length
+         INTEGER(size_t) :: ILEN                                    ! name length
+       END FUNCTION h5imunlink_palette_c
+    END INTERFACE
+    
+    namelen = LEN(dset_name)
+    ILEN    = LEN(pal_name)
+    errcode = h5imunlink_palette_c(loc_id,namelen,dset_name,ILEN,pal_name)
+    
+  END SUBROUTINE h5imunlink_palette_f
+  
+!-------------------------------------------------------------------------
+! Function: h5imget_npalettes_f
+!
+! Purpose: Gets the number of palettes associated to an image
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 05, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE h5imget_npalettes_f(loc_id,&
+       dset_name,&
+       npals,&
+       errcode )
+    
+    IMPLICIT NONE
+
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER(hsize_t), INTENT(inout) :: npals           ! palettes
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    
+    INTERFACE
+       INTEGER FUNCTION h5imget_npalettes_c(loc_id,namelen,dset_name,npals) &
+            BIND(C,NAME='h5imget_npalettes_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name          ! name of the dataset
+         INTEGER(hsize_t), INTENT(inout) :: npals           ! palettes
+         INTEGER(size_t) :: namelen                                 ! name length
+       END FUNCTION h5imget_npalettes_c
+    END INTERFACE
+    
+    namelen = LEN(dset_name)
+    errcode = h5imget_npalettes_c(loc_id,namelen,dset_name,npals)
+    
+  END SUBROUTINE h5imget_npalettes_f
+
+
+!-------------------------------------------------------------------------
+! Function: h5imget_palette_info_f
+!
+! Purpose: Get palette information
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 06, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE h5imget_palette_info_f(loc_id,&
+       dset_name,&
+       pal_number,&
+       dims,&
+       errcode )
+    
+    IMPLICIT NONE
+
+    INTEGER(hid_t),   INTENT(in) :: loc_id                ! file or group identifier
+    CHARACTER(len=*), INTENT(in) :: dset_name             ! name of the dataset
+    INTEGER, INTENT(in) :: pal_number                     ! palette number
+    INTEGER(hsize_t), DIMENSION(*), INTENT(inout) :: dims ! dimensions
+    INTEGER :: errcode                                    ! error code
+    INTEGER(size_t) :: namelen                                    ! name length
+    
+    INTERFACE
+       INTEGER FUNCTION h5imget_palette_info_c(loc_id,namelen,dset_name,pal_number,dims) &
+            BIND(C,NAME='h5imget_palette_info_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id                ! file or group identifier
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name             ! name of the dataset
+         INTEGER, INTENT(in) :: pal_number                     ! palette number
+         INTEGER(hsize_t), DIMENSION(*), INTENT(inout) :: dims ! dimensions
+         INTEGER(size_t) :: namelen                                    ! name length
+       END FUNCTION h5imget_palette_info_c
+    END INTERFACE
+    
+    namelen = LEN(dset_name)
+    errcode = h5imget_palette_info_c(loc_id,namelen,dset_name,pal_number,dims)
+    
+  END SUBROUTINE h5imget_palette_info_f
+
+!-------------------------------------------------------------------------
+! Function: h5imget_palette_f
+!
+! Purpose: Reads palette
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 06, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE h5imget_palette_f(loc_id,&
+       dset_name,&
+       pal_number,&
+       buf,&
+       errcode )
+    
+    IMPLICIT NONE
+
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER, INTENT(in) :: pal_number                  ! palette number
+    INTEGER, INTENT(inout), DIMENSION(*) :: buf        ! buffer
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    
+    INTERFACE
+       INTEGER FUNCTION h5imget_palette_c(loc_id,namelen,dset_name,pal_number,buf) &
+            BIND(C,NAME='h5imget_palette_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
+         INTEGER(size_t) :: namelen                                      ! length of name buffer
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name               ! name of the dataset
+         INTEGER, INTENT(in) :: pal_number                       ! palette number
+         INTEGER, INTENT(inout), DIMENSION(*) :: buf             ! buffer
+       END FUNCTION h5imget_palette_c
+    END INTERFACE
+    
+    namelen = LEN(dset_name)
+    errcode = h5imget_palette_c(loc_id,namelen,dset_name,pal_number,buf)
+    
+  END SUBROUTINE h5imget_palette_f
+
+
+!-------------------------------------------------------------------------
+! Function: h5imis_palette_f
+!
+! Purpose: Inquires if a dataset is a palette
+!
+! Return: true, false, fail
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 06, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  INTEGER FUNCTION h5imis_palette_f(loc_id,&
+                                  dset_name)
+
+    IMPLICIT NONE
+
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    
+    INTERFACE
+       INTEGER FUNCTION h5imis_palette_c(loc_id,namelen,dset_name) &
+            BIND(C,NAME='h5imis_palette_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
+         INTEGER(size_t) :: namelen                              ! length of name buffer
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name               ! name of the dataset
+       END FUNCTION h5imis_palette_c
+    END INTERFACE
+    
+    namelen = LEN(dset_name)
+    errcode = h5imis_palette_c(loc_id,namelen,dset_name)
+    h5imis_palette_f = errcode
+    
+  END FUNCTION h5imis_palette_f
+
+END MODULE H5IM
+
+
+
+
+
diff --git a/hl/fortran/src/H5IMff.f90 b/hl/fortran/src/H5IMff.f90
deleted file mode 100644
index 50c6d8b..0000000
--- a/hl/fortran/src/H5IMff.f90
+++ /dev/null
@@ -1,783 +0,0 @@
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!
-! This file contains FORTRAN90 interfaces for H5IM functions
-!
-
-module h5im
-use h5fortran_types
-use hdf5
-contains
-
-
-!-------------------------------------------------------------------------
-! Function: h5immake_image_8bit_f
-!
-! Purpose: Creates and writes an image an 8 bit image
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 05, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-subroutine h5immake_image_8bit_f(loc_id,&
-                                 dset_name,&
-                                 width,&
-                                 height,&
-                                 buf,&
-                                 errcode )
-
- implicit none
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5immake_image_8bit_f
-!DEC$endif
-!
-
- integer(hid_t),   intent(in) :: loc_id             ! file or group identifier
- character(len=*), intent(in) :: dset_name          ! name of the dataset
- integer(hsize_t), intent(in) :: width              ! width of image
- integer(hsize_t), intent(in) :: height             ! height of image
- integer, intent(in), dimension(*) :: buf           ! buffer
- integer :: errcode                                 ! error code
- INTEGER(size_t) :: namelen                         ! name length
-
- interface
-  integer function h5immake_image_8bit_c(loc_id,namelen,dset_name,width,height,buf)
-  use h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMMAKE_IMAGE_8BIT_C'::h5immake_image_8bit_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  integer(hid_t),   intent(in) :: loc_id                  ! file or group identifier
-  integer(size_t) :: namelen                              ! length of name buffer
-  character(len=*), intent(in) :: dset_name               ! name of the dataset
-  integer(hsize_t), intent(in) :: width                   ! width of image
-  integer(hsize_t), intent(in) :: height                  ! height of image
-  integer         , intent(in), dimension(*) :: buf       ! buffer
-  end function h5immake_image_8bit_c
- end interface
-
- namelen = len(dset_name)
- errcode = h5immake_image_8bit_c(loc_id,namelen,dset_name,width,height,buf)
-
-end subroutine h5immake_image_8bit_f
-
-
-
-!-------------------------------------------------------------------------
-! Function: h5imread_image_f
-!
-! Purpose: Reads image data from disk.
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 05, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-
-subroutine h5imread_image_f(loc_id,&
-                            dset_name,&
-                            buf,&
-                            errcode )
-
- implicit none
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5imread_image_f
-!DEC$endif
-!
- integer(hid_t),   intent(in) :: loc_id             ! file or group identifier
- character(len=*), intent(in) :: dset_name          ! name of the dataset
- integer, intent(inout), dimension(*) :: buf        ! buffer
- integer :: errcode                                 ! error code
- INTEGER(size_t) :: namelen                         ! name length
-
- interface
-  integer function h5imread_image_c(loc_id,namelen,dset_name,buf)
-  use h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMREAD_IMAGE_C'::h5imread_image_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  integer(hid_t),   intent(in) :: loc_id                  ! file or group identifier
-  integer(size_t) :: namelen                              ! length of name buffer
-  character(len=*), intent(in) :: dset_name               ! name of the dataset
-  integer, intent(inout), dimension(*) :: buf             ! buffer
-  end function h5imread_image_c
- end interface
-
- namelen = len(dset_name)
- errcode = h5imread_image_c(loc_id,namelen,dset_name,buf)
-
-end subroutine h5imread_image_f
-
-
-!-------------------------------------------------------------------------
-! Function: h5immake_image_24bit_f
-!
-! Purpose: Creates and writes an image a 24 bit image
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 05, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-subroutine h5immake_image_24bit_f(loc_id,&
-                                 dset_name,&
-                                 width,&
-                                 height,&
-                                 il,&
-                                 buf,&
-                                 errcode )
-
- implicit none
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5immake_image_24bit_f
-!DEC$endif
-!
-
- integer(hid_t),   intent(in) :: loc_id             ! file or group identifier
- character(len=*), intent(in) :: dset_name          ! name of the dataset
- integer(hsize_t), intent(in) :: width              ! width of image
- integer(hsize_t), intent(in) :: height             ! height of image
- character(len=*), intent(in) :: il                 ! interlace
- integer, intent(in), dimension(*) :: buf           ! buffer
- integer :: errcode                                 ! error code
- INTEGER(size_t) :: namelen                                 ! name length
- integer(size_t) :: ilen                                    ! name length
-
- interface
-  integer function h5immake_image_24bit_c(loc_id,namelen,dset_name,ilen,il,width,height,buf)
-  use h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMMAKE_IMAGE_24BIT_C'::h5immake_image_24bit_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  !DEC$ATTRIBUTES reference :: il
-  integer(hid_t),   intent(in) :: loc_id                  ! file or group identifier
-  character(len=*), intent(in) :: dset_name               ! name of the dataset
-  integer(hsize_t), intent(in) :: width                   ! width of image
-  integer(hsize_t), intent(in) :: height                  ! height of image
-  character(len=*), intent(in) :: il                      ! interlace
-  integer, intent(in), dimension(*) :: buf                ! buffer
-  integer(size_t) :: namelen                                      ! length of name buffer
-  integer(size_t) :: ilen                                         ! name length
-
-  end function h5immake_image_24bit_c
- end interface
-
- namelen = len(dset_name)
- ilen    = len(il)
- errcode = h5immake_image_24bit_c(loc_id,namelen,dset_name,ilen,il,width,height,buf)
-
-end subroutine h5immake_image_24bit_f
-
-
-!-------------------------------------------------------------------------
-! Function: h5imget_image_info_f
-!
-! Purpose: Gets information about an image dataset (dimensions, interlace mode
-!          and number of associated palettes).
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 05, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-subroutine h5imget_image_info_f(loc_id,&
-                                dset_name,&
-                                width,&
-                                height,&
-                                planes,&
-                                interlace,&
-                                npals,&
-                                errcode )
-
- implicit none
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5imget_image_info_f
-!DEC$endif
-!
-
- integer(hid_t),   intent(in) :: loc_id             ! file or group identifier
- character(len=*), intent(in) :: dset_name          ! name of the dataset
- integer(hsize_t), intent(inout) :: width           ! width of image
- integer(hsize_t), intent(inout) :: height          ! height of image
- integer(hsize_t), intent(inout) :: planes          ! color planes
- integer(hsize_t), intent(inout) :: npals           ! palettes
- character(len=*), intent(inout) :: interlace       ! interlace
- integer :: errcode                                 ! error code
- integer(size_t) :: namelen                                 ! name length
- integer(size_t) :: ilen                                    ! name length
-
- interface
-  integer function h5imget_image_info_c(loc_id,namelen,dset_name,width,height,planes,npals,ilen,interlace)
-  use h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMGET_IMAGE_INFO_C'::h5imget_image_info_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  !DEC$ATTRIBUTES reference :: interlace
-  integer(hid_t),   intent(in) :: loc_id             ! file or group identifier
-  character(len=*), intent(in) :: dset_name          ! name of the dataset
-  integer(hsize_t), intent(inout) :: width           ! width of image
-  integer(hsize_t), intent(inout) :: height          ! height of image
-  integer(hsize_t), intent(inout) :: planes          ! color planes
-  integer(hsize_t), intent(inout) :: npals           ! palettes
-  character(len=*), intent(inout) :: interlace       ! interlace
-  integer(size_t) :: namelen                                 ! name length
-  integer(size_t) :: ilen                                    ! name length
-  end function h5imget_image_info_c
- end interface
-
- namelen = len(dset_name)
- ilen    = len(interlace)
- errcode = h5imget_image_info_c(loc_id,namelen,dset_name,width,height,planes,npals,ilen,interlace)
-
-end subroutine h5imget_image_info_f
-
-
-!-------------------------------------------------------------------------
-! Function: h5imis_image_f
-!
-! Purpose: Inquires if a dataset is an image
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 05, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-integer function h5imis_image_f(loc_id,&
-                                dset_name)
-
- implicit none
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5imis_image_f
-!DEC$endif
-!
-
- integer(hid_t),   intent(in) :: loc_id             ! file or group identifier
- character(len=*), intent(in) :: dset_name          ! name of the dataset
- integer :: errcode                                 ! error code
- integer(size_t) :: namelen                                 ! name length
-
- interface
-  integer function h5imis_image_c(loc_id,namelen,dset_name)
-  use h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMIS_IMAGE_C'::h5imis_image_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  integer(hid_t),   intent(in) :: loc_id                  ! file or group identifier
-  integer(size_t) :: namelen                                      ! length of name buffer
-  character(len=*), intent(in) :: dset_name               ! name of the dataset
-  end function h5imis_image_c
- end interface
-
- namelen = len(dset_name)
- errcode = h5imis_image_c(loc_id,namelen,dset_name)
- h5imis_image_f = errcode
-
-end function h5imis_image_f
-
-
-!-------------------------------------------------------------------------
-! Function: h5immake_palette_f
-!
-! Purpose: Creates and writes a palette
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 06, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-subroutine h5immake_palette_f(loc_id,&
-                              dset_name,&
-                              pal_dims,&
-                              buf,&
-                              errcode )
-
- implicit none
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5immake_palette_f
-!DEC$endif
-!
-
- integer(hid_t),   intent(in) :: loc_id                 ! file or group identifier
- character(len=*), intent(in) :: dset_name              ! name of the dataset
- integer(hsize_t), intent(in), dimension(*) :: pal_dims ! dimensions
- integer, intent(in), dimension(*) :: buf               ! buffer
- integer :: errcode                                     ! error code
- integer(size_t) :: namelen                                     ! name length
-
- interface
-  integer function h5immake_palette_c(loc_id,namelen,dset_name,pal_dims,buf)
-  use h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMMAKE_PALETTE_C'::h5immake_palette_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  integer(hid_t),   intent(in) :: loc_id                  ! file or group identifier
-  integer(size_t) :: namelen                                      ! length of name buffer
-  character(len=*), intent(in) :: dset_name               ! name of the dataset
-  integer(hsize_t), intent(in), dimension(*) :: pal_dims  ! dimensions
-  integer, intent(in), dimension(*) :: buf                ! buffer
-  end function h5immake_palette_c
- end interface
-
- namelen = len(dset_name)
- errcode = h5immake_palette_c(loc_id,namelen,dset_name,pal_dims,buf)
-
-end subroutine h5immake_palette_f
-
-
-
-!-------------------------------------------------------------------------
-! Function: h5imlink_palette_f
-!
-! Purpose: This function attaches a palette to an existing image dataset
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 06, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-subroutine h5imlink_palette_f(loc_id,&
-                              dset_name,&
-                              pal_name,&
-                              errcode )
-
- implicit none
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5imlink_palette_f
-!DEC$endif
-!
- integer(hid_t),   intent(in) :: loc_id             ! file or group identifier
- character(len=*), intent(in) :: dset_name          ! name of the dataset
- character(len=*), intent(in) :: pal_name           ! palette name
- integer :: errcode                                 ! error code
- integer(size_t) :: namelen                                 ! name length
- integer(size_t) :: ilen                                    ! name length
-
- interface
-  integer function h5imlink_palette_c(loc_id,namelen,dset_name,ilen,pal_name)
-  use h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMLINK_PALETTE_C'::h5imlink_palette_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  !DEC$ATTRIBUTES reference :: pal_name
-  integer(hid_t),   intent(in) :: loc_id             ! file or group identifier
-  character(len=*), intent(in) :: dset_name          ! name of the dataset
-  character(len=*), intent(in) :: pal_name           ! palette name
-  integer(size_t) :: namelen                                 ! name length
-  integer(size_t) :: ilen                                    ! name length
-  end function h5imlink_palette_c
- end interface
-
- namelen = len(dset_name)
- ilen    = len(pal_name)
- errcode = h5imlink_palette_c(loc_id,namelen,dset_name,ilen,pal_name)
-
-end subroutine h5imlink_palette_f
-
-
-!-------------------------------------------------------------------------
-! Function: h5imunlink_palette_f
-!
-! Purpose: This function dettaches a palette to an existing image dataset
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 06, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-subroutine h5imunlink_palette_f(loc_id,&
-                              dset_name,&
-                              pal_name,&
-                              errcode )
-
- implicit none
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5imunlink_palette_f
-!DEC$endif
-!
-
-
- integer(hid_t),   intent(in) :: loc_id             ! file or group identifier
- character(len=*), intent(in) :: dset_name          ! name of the dataset
- character(len=*), intent(in) :: pal_name           ! palette name
- integer :: errcode                                 ! error code
- integer(size_t) :: namelen                                 ! name length
- integer(size_t) :: ilen                                    ! name length
-
- interface
-  integer function h5imunlink_palette_c(loc_id,namelen,dset_name,ilen,pal_name)
-  use h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMUNLINK_PALETTE_C'::h5imunlink_palette_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  !DEC$ATTRIBUTES reference :: pal_name
-  integer(hid_t),   intent(in) :: loc_id             ! file or group identifier
-  character(len=*), intent(in) :: dset_name          ! name of the dataset
-  character(len=*), intent(in) :: pal_name           ! palette name
-  integer(size_t) :: namelen                                 ! name length
-  integer(size_t) :: ilen                                    ! name length
-  end function h5imunlink_palette_c
- end interface
-
- namelen = len(dset_name)
- ilen    = len(pal_name)
- errcode = h5imunlink_palette_c(loc_id,namelen,dset_name,ilen,pal_name)
-
-end subroutine h5imunlink_palette_f
-
-
-
-!-------------------------------------------------------------------------
-! Function: h5imget_npalettes_f
-!
-! Purpose: Gets the number of palettes associated to an image
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 05, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-subroutine h5imget_npalettes_f(loc_id,&
-                               dset_name,&
-                               npals,&
-                               errcode )
-
- implicit none
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5imget_npalettes_f
-!DEC$endif
-!
-
- integer(hid_t),   intent(in) :: loc_id             ! file or group identifier
- character(len=*), intent(in) :: dset_name          ! name of the dataset
- integer(hsize_t), intent(inout) :: npals           ! palettes
- integer :: errcode                                 ! error code
- integer(size_t) :: namelen                                 ! name length
-
- interface
-  integer function h5imget_npalettes_c(loc_id,namelen,dset_name,npals)
-  use h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMGET_NPALETTES_C'::h5imget_npalettes_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  integer(hid_t),   intent(in) :: loc_id             ! file or group identifier
-  character(len=*), intent(in) :: dset_name          ! name of the dataset
-  integer(hsize_t), intent(inout) :: npals           ! palettes
-  integer(size_t) :: namelen                                 ! name length
-  end function h5imget_npalettes_c
- end interface
-
- namelen = len(dset_name)
- errcode = h5imget_npalettes_c(loc_id,namelen,dset_name,npals)
-
-end subroutine h5imget_npalettes_f
-
-
-!-------------------------------------------------------------------------
-! Function: h5imget_palette_info_f
-!
-! Purpose: Get palette information
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 06, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-subroutine h5imget_palette_info_f(loc_id,&
-                                  dset_name,&
-                                  pal_number,&
-                                  dims,&
-                                  errcode )
-
- implicit none
-
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5imget_palette_info_f
-!DEC$endif
-!
-
- integer(hid_t),   intent(in) :: loc_id                ! file or group identifier
- character(len=*), intent(in) :: dset_name             ! name of the dataset
- integer, intent(in) :: pal_number                     ! palette number
- integer(hsize_t), dimension(*), intent(inout) :: dims ! dimensions
- integer :: errcode                                    ! error code
- integer(size_t) :: namelen                                    ! name length
-
- interface
-  integer function h5imget_palette_info_c(loc_id,namelen,dset_name,pal_number,dims)
-  use h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMGET_PALETTE_INFO_C'::h5imget_palette_info_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  integer(hid_t),   intent(in) :: loc_id                ! file or group identifier
-  character(len=*), intent(in) :: dset_name             ! name of the dataset
-  integer, intent(in) :: pal_number                     ! palette number
-  integer(hsize_t), dimension(*), intent(inout) :: dims ! dimensions
-  integer(size_t) :: namelen                                    ! name length
-  end function h5imget_palette_info_c
- end interface
-
- namelen = len(dset_name)
- errcode = h5imget_palette_info_c(loc_id,namelen,dset_name,pal_number,dims)
-
-end subroutine h5imget_palette_info_f
-
-
-
-!-------------------------------------------------------------------------
-! Function: h5imget_palette_f
-!
-! Purpose: Reads palette
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 06, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-
-subroutine h5imget_palette_f(loc_id,&
-                             dset_name,&
-                             pal_number,&
-                             buf,&
-                             errcode )
-
- implicit none
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5imget_palette_f
-!DEC$endif
-!
-
- integer(hid_t),   intent(in) :: loc_id             ! file or group identifier
- character(len=*), intent(in) :: dset_name          ! name of the dataset
- integer, intent(in) :: pal_number                  ! palette number
- integer, intent(inout), dimension(*) :: buf        ! buffer
- integer :: errcode                                 ! error code
- integer(size_t) :: namelen                                 ! name length
-
- interface
-  integer function h5imget_palette_c(loc_id,namelen,dset_name,pal_number,buf)
-  use h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMGET_PALETTE_C'::h5imget_palette_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  integer(hid_t),   intent(in) :: loc_id                  ! file or group identifier
-  integer(size_t) :: namelen                                      ! length of name buffer
-  character(len=*), intent(in) :: dset_name               ! name of the dataset
-  integer, intent(in) :: pal_number                       ! palette number
-  integer, intent(inout), dimension(*) :: buf             ! buffer
-  end function h5imget_palette_c
- end interface
-
- namelen = len(dset_name)
- errcode = h5imget_palette_c(loc_id,namelen,dset_name,pal_number,buf)
-
-end subroutine h5imget_palette_f
-
-
-!-------------------------------------------------------------------------
-! Function: h5imis_palette_f
-!
-! Purpose: Inquires if a dataset is a palette
-!
-! Return: true, false, fail
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 06, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-integer function h5imis_palette_f(loc_id,&
-                                  dset_name)
-
- implicit none
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5imis_palette_f
-!DEC$endif
-!
-
- integer(hid_t),   intent(in) :: loc_id             ! file or group identifier
- character(len=*), intent(in) :: dset_name          ! name of the dataset
- integer :: errcode                                 ! error code
- integer(size_t) :: namelen                                 ! name length
-
- interface
-  integer function h5imis_palette_c(loc_id,namelen,dset_name)
-  use h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5IMIS_PALETTE_C'::h5imis_palette_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  integer(hid_t),   intent(in) :: loc_id                  ! file or group identifier
-  integer(size_t) :: namelen                              ! length of name buffer
-  character(len=*), intent(in) :: dset_name               ! name of the dataset
-  end function h5imis_palette_c
- end interface
-
- namelen = len(dset_name)
- errcode = h5imis_palette_c(loc_id,namelen,dset_name)
- h5imis_palette_f = errcode
-
-end function h5imis_palette_f
-
-
-!  end
-!
-end module H5IM
-
-
-
-
-
diff --git a/hl/fortran/src/H5LTf90proto.h b/hl/fortran/src/H5LTf90proto.h
index 3990d18..20d043e 100644
--- a/hl/fortran/src/H5LTf90proto.h
+++ b/hl/fortran/src/H5LTf90proto.h
@@ -30,1131 +30,110 @@ H5_FCDLL void HD5packFstring (char *src, char *dest, size_t len);
 /*
  *  Functions from H5DSfc.c
  */
-
-#define nh5dsset_scale_c      H5_FC_FUNC_(h5dsset_scale_c, H5DSSET_SCALE_C)
-#define nh5dsattach_scale_c   H5_FC_FUNC_(h5dsattach_scale_c, H5DSATTACH_SCALE_C)
-#define nh5dsdetach_scale_c   H5_FC_FUNC_(h5dsdetach_scale_c, H5DSDETACH_SCALE_C)
-#define nh5dsis_attached_c    H5_FC_FUNC_(h5dsis_attached_c, H5DSIS_ATTACHED_C)
-#define nh5dsis_scale_c       H5_FC_FUNC_(h5dsis_scale_c, H5DSIS_SCALE_C)
-#define nh5dsset_label_c      H5_FC_FUNC_(h5dsset_label_c, H5DSSET_LABEL_C)
-#define nh5dsget_label_c      H5_FC_FUNC_(h5dsget_label_c, H5DSGET_LABEL_C)
-#define nh5dsget_scale_name_c H5_FC_FUNC_(h5dsget_scale_name_c,H5DSGET_SCALE_NAME_C)
-#define nh5dsget_num_scales_c H5_FC_FUNC_(h5dsget_num_scales_c,H5DSGET_NUM_SCALES_C)
-
-
-/*
- *  Functions from H5LTfc.c
- */
-#define nh5ltmake_dataset_c       H5_FC_FUNC_(h5ltmake_dataset_c, H5LTMAKE_DATASET_C)
-#define nh5ltmake_dataset_int1_c  H5_FC_FUNC_(h5ltmake_dataset_int1_c, H5LTMAKE_DATASET_INT1_C)
-#define nh5ltmake_dataset_int2_c  H5_FC_FUNC_(h5ltmake_dataset_int2_c, H5LTMAKE_DATASET_INT2_C)
-#define nh5ltmake_dataset_int3_c  H5_FC_FUNC_(h5ltmake_dataset_int3_c, H5LTMAKE_DATASET_INT3_C)
-#define nh5ltmake_dataset_int4_c  H5_FC_FUNC_(h5ltmake_dataset_int4_c, H5LTMAKE_DATASET_INT4_C)
-#define nh5ltmake_dataset_int5_c  H5_FC_FUNC_(h5ltmake_dataset_int5_c, H5LTMAKE_DATASET_INT5_C)
-#define nh5ltmake_dataset_int6_c  H5_FC_FUNC_(h5ltmake_dataset_int6_c, H5LTMAKE_DATASET_INT6_C)
-#define nh5ltmake_dataset_int7_c  H5_FC_FUNC_(h5ltmake_dataset_int7_c, H5LTMAKE_DATASET_INT7_C)
-#define nh5ltmake_dataset_fl1_c   H5_FC_FUNC_(h5ltmake_dataset_fl1_c, H5LTMAKE_DATASET_FL1_C)
-#define nh5ltmake_dataset_fl2_c   H5_FC_FUNC_(h5ltmake_dataset_fl2_c, H5LTMAKE_DATASET_FL2_C)
-#define nh5ltmake_dataset_fl3_c   H5_FC_FUNC_(h5ltmake_dataset_fl3_c, H5LTMAKE_DATASET_FL3_C)
-#define nh5ltmake_dataset_fl4_c   H5_FC_FUNC_(h5ltmake_dataset_fl4_c, H5LTMAKE_DATASET_FL4_C)
-#define nh5ltmake_dataset_fl5_c   H5_FC_FUNC_(h5ltmake_dataset_fl5_c, H5LTMAKE_DATASET_FL5_C)
-#define nh5ltmake_dataset_fl6_c   H5_FC_FUNC_(h5ltmake_dataset_fl6_c, H5LTMAKE_DATASET_FL6_C)
-#define nh5ltmake_dataset_fl7_c   H5_FC_FUNC_(h5ltmake_dataset_fl7_c, H5LTMAKE_DATASET_FL7_C)
-#define nh5ltmake_dataset_dl1_c   H5_FC_FUNC_(h5ltmake_dataset_dl1_c, H5LTMAKE_DATASET_DL1_C)
-#define nh5ltmake_dataset_dl2_c   H5_FC_FUNC_(h5ltmake_dataset_dl2_c, H5LTMAKE_DATASET_DL2_C)
-#define nh5ltmake_dataset_dl3_c   H5_FC_FUNC_(h5ltmake_dataset_dl3_c, H5LTMAKE_DATASET_DL3_C)
-#define nh5ltmake_dataset_dl4_c   H5_FC_FUNC_(h5ltmake_dataset_dl4_c, H5LTMAKE_DATASET_DL4_C)
-#define nh5ltmake_dataset_dl5_c   H5_FC_FUNC_(h5ltmake_dataset_dl5_c, H5LTMAKE_DATASET_DL5_C)
-#define nh5ltmake_dataset_dl6_c   H5_FC_FUNC_(h5ltmake_dataset_dl6_c, H5LTMAKE_DATASET_DL6_C)
-#define nh5ltmake_dataset_dl7_c   H5_FC_FUNC_(h5ltmake_dataset_dl7_c, H5LTMAKE_DATASET_DL7_C)
-#define nh5ltmake_dataset_nint1_c H5_FC_FUNC_(h5ltmake_dataset_nint1_c, H5LTMAKE_DATASET_NINT1_C)
-#define nh5ltmake_dataset_nint2_c H5_FC_FUNC_(h5ltmake_dataset_nint2_c, H5LTMAKE_DATASET_NINT2_C)
-#define nh5ltmake_dataset_nint3_c H5_FC_FUNC_(h5ltmake_dataset_nint3_c, H5LTMAKE_DATASET_NINT3_C)
-#define nh5ltmake_dataset_nint4_c H5_FC_FUNC_(h5ltmake_dataset_nint4_c, H5LTMAKE_DATASET_NINT4_C)
-#define nh5ltmake_dataset_nint5_c H5_FC_FUNC_(h5ltmake_dataset_nint5_c, H5LTMAKE_DATASET_NINT5_C)
-#define nh5ltmake_dataset_nint6_c H5_FC_FUNC_(h5ltmake_dataset_nint6_c, H5LTMAKE_DATASET_NINT6_C)
-#define nh5ltmake_dataset_nint7_c H5_FC_FUNC_(h5ltmake_dataset_nint7_c, H5LTMAKE_DATASET_NINT7_C)
-#define nh5ltmake_dataset_nfl1_c  H5_FC_FUNC_(h5ltmake_dataset_nfl1_c, H5LTMAKE_DATASET_NFL1_C)
-#define nh5ltmake_dataset_nfl2_c  H5_FC_FUNC_(h5ltmake_dataset_nfl2_c, H5LTMAKE_DATASET_NFL2_C)
-#define nh5ltmake_dataset_nfl3_c  H5_FC_FUNC_(h5ltmake_dataset_nfl3_c, H5LTMAKE_DATASET_NFL3_C)
-#define nh5ltmake_dataset_nfl4_c  H5_FC_FUNC_(h5ltmake_dataset_nfl4_c, H5LTMAKE_DATASET_NFL4_C)
-#define nh5ltmake_dataset_nfl5_c  H5_FC_FUNC_(h5ltmake_dataset_nfl5_c, H5LTMAKE_DATASET_NFL5_C)
-#define nh5ltmake_dataset_nfl6_c  H5_FC_FUNC_(h5ltmake_dataset_nfl6_c, H5LTMAKE_DATASET_NFL6_C)
-#define nh5ltmake_dataset_nfl7_c  H5_FC_FUNC_(h5ltmake_dataset_nfl7_c, H5LTMAKE_DATASET_NFL7_C)
-#define nh5ltmake_dataset_ndl1_c  H5_FC_FUNC_(h5ltmake_dataset_ndl1_c, H5LTMAKE_DATASET_NDL1_C)
-#define nh5ltmake_dataset_ndl2_c  H5_FC_FUNC_(h5ltmake_dataset_ndl2_c, H5LTMAKE_DATASET_NDL2_C)
-#define nh5ltmake_dataset_ndl3_c  H5_FC_FUNC_(h5ltmake_dataset_ndl3_c, H5LTMAKE_DATASET_NDL3_C)
-#define nh5ltmake_dataset_ndl4_c  H5_FC_FUNC_(h5ltmake_dataset_ndl4_c, H5LTMAKE_DATASET_NDL4_C)
-#define nh5ltmake_dataset_ndl5_c  H5_FC_FUNC_(h5ltmake_dataset_ndl5_c, H5LTMAKE_DATASET_NDL5_C)
-#define nh5ltmake_dataset_ndl6_c  H5_FC_FUNC_(h5ltmake_dataset_ndl6_c, H5LTMAKE_DATASET_NDL6_C)
-#define nh5ltmake_dataset_ndl7_c  H5_FC_FUNC_(h5ltmake_dataset_ndl7_c, H5LTMAKE_DATASET_NDL7_C)
-#define nh5ltread_dataset_c       H5_FC_FUNC_(h5ltread_dataset_c, H5LTREAD_DATASET_C)
-#define nh5ltread_dataset_int1_c         H5_FC_FUNC_(h5ltread_dataset_int1_c, H5LTREAD_DATASET_INT1_C)
-#define nh5ltread_dataset_int2_c         H5_FC_FUNC_(h5ltread_dataset_int2_c, H5LTREAD_DATASET_INT2_C)
-#define nh5ltread_dataset_int3_c         H5_FC_FUNC_(h5ltread_dataset_int3_c, H5LTREAD_DATASET_INT3_C)
-#define nh5ltread_dataset_int4_c         H5_FC_FUNC_(h5ltread_dataset_int4_c, H5LTREAD_DATASET_INT4_C)
-#define nh5ltread_dataset_int5_c         H5_FC_FUNC_(h5ltread_dataset_int5_c, H5LTREAD_DATASET_INT5_C)
-#define nh5ltread_dataset_int6_c         H5_FC_FUNC_(h5ltread_dataset_int6_c, H5LTREAD_DATASET_INT6_C)
-#define nh5ltread_dataset_int7_c         H5_FC_FUNC_(h5ltread_dataset_int7_c, H5LTREAD_DATASET_INT7_C)
-#define nh5ltread_dataset_fl1_c         H5_FC_FUNC_(h5ltread_dataset_fl1_c, H5LTREAD_DATASET_FL1_C)
-#define nh5ltread_dataset_fl2_c         H5_FC_FUNC_(h5ltread_dataset_fl2_c, H5LTREAD_DATASET_FL2_C)
-#define nh5ltread_dataset_fl3_c         H5_FC_FUNC_(h5ltread_dataset_fl3_c, H5LTREAD_DATASET_FL3_C)
-#define nh5ltread_dataset_fl4_c         H5_FC_FUNC_(h5ltread_dataset_fl4_c, H5LTREAD_DATASET_FL4_C)
-#define nh5ltread_dataset_fl5_c         H5_FC_FUNC_(h5ltread_dataset_fl5_c, H5LTREAD_DATASET_FL5_C)
-#define nh5ltread_dataset_fl6_c         H5_FC_FUNC_(h5ltread_dataset_fl6_c, H5LTREAD_DATASET_FL6_C)
-#define nh5ltread_dataset_fl7_c         H5_FC_FUNC_(h5ltread_dataset_fl7_c, H5LTREAD_DATASET_FL7_C)
-#define nh5ltread_dataset_dl1_c         H5_FC_FUNC_(h5ltread_dataset_dl1_c, H5LTREAD_DATASET_DL1_C)
-#define nh5ltread_dataset_dl2_c         H5_FC_FUNC_(h5ltread_dataset_dl2_c, H5LTREAD_DATASET_DL2_C)
-#define nh5ltread_dataset_dl3_c         H5_FC_FUNC_(h5ltread_dataset_dl3_c, H5LTREAD_DATASET_DL3_C)
-#define nh5ltread_dataset_dl4_c         H5_FC_FUNC_(h5ltread_dataset_dl4_c, H5LTREAD_DATASET_DL4_C)
-#define nh5ltread_dataset_dl5_c         H5_FC_FUNC_(h5ltread_dataset_dl5_c, H5LTREAD_DATASET_DL5_C)
-#define nh5ltread_dataset_dl6_c         H5_FC_FUNC_(h5ltread_dataset_dl6_c, H5LTREAD_DATASET_DL6_C)
-#define nh5ltread_dataset_dl7_c         H5_FC_FUNC_(h5ltread_dataset_dl7_c, H5LTREAD_DATASET_DL7_C)
-#define nh5ltread_dataset_nint1_c         H5_FC_FUNC_(h5ltread_dataset_nint1_c, H5LTREAD_DATASET_NINT1_C)
-#define nh5ltread_dataset_nint2_c         H5_FC_FUNC_(h5ltread_dataset_nint2_c, H5LTREAD_DATASET_NINT2_C)
-#define nh5ltread_dataset_nint3_c         H5_FC_FUNC_(h5ltread_dataset_nint3_c, H5LTREAD_DATASET_NINT3_C)
-#define nh5ltread_dataset_nint4_c         H5_FC_FUNC_(h5ltread_dataset_nint4_c, H5LTREAD_DATASET_NINT4_C)
-#define nh5ltread_dataset_nint5_c         H5_FC_FUNC_(h5ltread_dataset_nint5_c, H5LTREAD_DATASET_NINT5_C)
-#define nh5ltread_dataset_nint6_c         H5_FC_FUNC_(h5ltread_dataset_nint6_c, H5LTREAD_DATASET_NINT6_C)
-#define nh5ltread_dataset_nint7_c         H5_FC_FUNC_(h5ltread_dataset_nint7_c, H5LTREAD_DATASET_NINT7_C)
-#define nh5ltread_dataset_nfl1_c         H5_FC_FUNC_(h5ltread_dataset_nfl1_c, H5LTREAD_DATASET_NFL1_C)
-#define nh5ltread_dataset_nfl2_c         H5_FC_FUNC_(h5ltread_dataset_nfl2_c, H5LTREAD_DATASET_NFL2_C)
-#define nh5ltread_dataset_nfl3_c         H5_FC_FUNC_(h5ltread_dataset_nfl3_c, H5LTREAD_DATASET_NFL3_C)
-#define nh5ltread_dataset_nfl4_c         H5_FC_FUNC_(h5ltread_dataset_nfl4_c, H5LTREAD_DATASET_NFL4_C)
-#define nh5ltread_dataset_nfl5_c         H5_FC_FUNC_(h5ltread_dataset_nfl5_c, H5LTREAD_DATASET_NFL5_C)
-#define nh5ltread_dataset_nfl6_c         H5_FC_FUNC_(h5ltread_dataset_nfl6_c, H5LTREAD_DATASET_NFL6_C)
-#define nh5ltread_dataset_nfl7_c         H5_FC_FUNC_(h5ltread_dataset_nfl7_c, H5LTREAD_DATASET_NFL7_C)
-#define nh5ltread_dataset_ndl1_c         H5_FC_FUNC_(h5ltread_dataset_ndl1_c, H5LTREAD_DATASET_NDL1_C)
-#define nh5ltread_dataset_ndl2_c         H5_FC_FUNC_(h5ltread_dataset_ndl2_c, H5LTREAD_DATASET_NDL2_C)
-#define nh5ltread_dataset_ndl3_c         H5_FC_FUNC_(h5ltread_dataset_ndl3_c, H5LTREAD_DATASET_NDL3_C)
-#define nh5ltread_dataset_ndl4_c         H5_FC_FUNC_(h5ltread_dataset_ndl4_c, H5LTREAD_DATASET_NDL4_C)
-#define nh5ltread_dataset_ndl5_c         H5_FC_FUNC_(h5ltread_dataset_ndl5_c, H5LTREAD_DATASET_NDL5_C)
-#define nh5ltread_dataset_ndl6_c         H5_FC_FUNC_(h5ltread_dataset_ndl6_c, H5LTREAD_DATASET_NDL6_C)
-#define nh5ltread_dataset_ndl7_c         H5_FC_FUNC_(h5ltread_dataset_ndl7_c, H5LTREAD_DATASET_NDL7_C)
-#define nh5ltmake_dataset_string_c  H5_FC_FUNC_(h5ltmake_dataset_string_c, H5LTMAKE_DATASET_STRING_C)
-#define nh5ltread_dataset_string_c  H5_FC_FUNC_(h5ltread_dataset_string_c, H5LTREAD_DATASET_STRING_C)
-
-#define nh5ltset_attribute_int_c    H5_FC_FUNC_(h5ltset_attribute_int_c, H5LTSET_ATTRIBUTE_INT_C)
-#define nh5ltset_attribute_float_c  H5_FC_FUNC_(h5ltset_attribute_float_c, H5LTSET_ATTRIBUTE_FLOAT_C)
-#define nh5ltset_attribute_double_c H5_FC_FUNC_(h5ltset_attribute_double_c, H5LTSET_ATTRIBUTE_DOUBLE_C)
-#define nh5ltset_attribute_string_c H5_FC_FUNC_(h5ltset_attribute_string_c, H5LTSET_ATTRIBUTE_STRING_C)
-
-#define nh5ltget_attribute_int_c    H5_FC_FUNC_(h5ltget_attribute_int_c, H5LTGET_ATTRIBUTE_INT_C)
-#define nh5ltget_attribute_float_c  H5_FC_FUNC_(h5ltget_attribute_float_c, H5LTGET_ATTRIBUTE_FLOAT_C)
-#define nh5ltget_attribute_double_c H5_FC_FUNC_(h5ltget_attribute_double_c, H5LTGET_ATTRIBUTE_DOUBLE_C)
-#define nh5ltget_attribute_string_c H5_FC_FUNC_(h5ltget_attribute_string_c, H5LTGET_ATTRIBUTE_STRING_C)
-
-#define nh5ltget_dataset_ndims_c    H5_FC_FUNC_(h5ltget_dataset_ndims_c, H5LTGET_DATASET_NDIMS_C)
-#define nh5ltfind_dataset_c         H5_FC_FUNC_(h5ltfind_dataset_c, H5LTFIND_DATASET_C)
-#define nh5ltget_dataset_info_c     H5_FC_FUNC_(h5ltget_dataset_info_c, H5LTGET_DATASET_INFO_C)
-
-#define nh5ltget_attribute_ndims_c  H5_FC_FUNC_(h5ltget_attribute_ndims_c, H5LTGET_ATTRIBUTE_NDIMS_C)
-#define nh5ltget_attribute_info_c   H5_FC_FUNC_(h5ltget_attribute_info_c, H5LTGET_ATTRIBUTE_INFO_C)
-#define nh5ltpath_valid_c           H5_FC_FUNC_(h5ltpath_valid_c, H5LTPATH_VALID_C)
-
-/*-------------------------------------------------------------------------
-* Image
-*-------------------------------------------------------------------------
-*/
-#define nh5immake_image_8bit_c      H5_FC_FUNC_(h5immake_image_8bit_c, H5IMMAKE_IMAGE_8BIT_C)
-#define nh5immake_image_24bit_c     H5_FC_FUNC_(h5immake_image_24bit_c, H5IMMAKE_IMAGE_24BIT_C)
-#define nh5imread_image_c           H5_FC_FUNC_(h5imread_image_c, H5IMREAD_IMAGE_C)
-#define nh5imget_image_info_c       H5_FC_FUNC_(h5imget_image_info_c, H5IMGET_IMAGE_INFO_C)
-#define nh5imis_image_c             H5_FC_FUNC_(h5imis_image_c, H5IMIS_IMAGE_C)
-#define nh5immake_palette_c         H5_FC_FUNC_(h5immake_palette_c, H5IMMAKE_PALETTE_C)
-#define nh5imlink_palette_c         H5_FC_FUNC_(h5imlink_palette_c, H5IMLINK_PALETTE_C)
-#define nh5imunlink_palette_c       H5_FC_FUNC_(h5imunlink_palette_c, H5IMUNLINK_PALETTE_C)
-#define nh5imget_npalettes_c        H5_FC_FUNC_(h5imget_npalettes_c, H5IMGET_NPALETTES_C)
-#define nh5imget_palette_info_c     H5_FC_FUNC_(h5imget_palette_info_c, H5IMGET_PALETTE_INFO_C)
-#define nh5imget_palette_c          H5_FC_FUNC_(h5imget_palette_c, H5IMGET_PALETTE_C)
-#define nh5imis_palette_c           H5_FC_FUNC_(h5imis_palette_c, H5IMIS_PALETTE_C)
-
-/*-------------------------------------------------------------------------
-* Table
-*-------------------------------------------------------------------------
-*/
-#define nh5tbmake_table_c           H5_FC_FUNC_(h5tbmake_table_c, H5TBMAKE_TABLE_C)
-#define nh5tbwrite_field_name_c     H5_FC_FUNC_(h5tbwrite_field_name_c, H5TBWRITE_FIELD_NAME_C)
-#define nh5tbwrite_field_name_int_c    H5_FC_FUNC_(h5tbwrite_field_name_int_c, H5TBWRITE_FIELD_NAME_INT_C)
-#define nh5tbwrite_field_name_fl_c     H5_FC_FUNC_(h5tbwrite_field_name_fl_c, H5TBWRITE_FIELD_NAME_FL_C)
-#define nh5tbwrite_field_name_dl_c     H5_FC_FUNC_(h5tbwrite_field_name_dl_c, H5TBWRITE_FIELD_NAME_DL_C)
-#define nh5tbwrite_field_name_st_c     H5_FC_FUNC_(h5tbwrite_field_name_st_c, H5TBWRITE_FIELD_NAME_ST_C)
-#define nh5tbread_field_name_c      H5_FC_FUNC_(h5tbread_field_name_c, H5TBREAD_FIELD_NAME_C)
-#define nh5tbread_field_name_int_c     H5_FC_FUNC_(h5tbread_field_name_int_c, H5TBREAD_FIELD_NAME_INT_C)
-#define nh5tbread_field_name_fl_c      H5_FC_FUNC_(h5tbread_field_name_fl_c, H5TBREAD_FIELD_NAME_FL_C)
-#define nh5tbread_field_name_dl_c      H5_FC_FUNC_(h5tbread_field_name_dl_c, H5TBREAD_FIELD_NAME_DL_C)
-#define nh5tbread_field_name_st_c      H5_FC_FUNC_(h5tbread_field_name_st_c, H5TBREAD_FIELD_NAME_ST_C)
-#define nh5tbwrite_field_index_c    H5_FC_FUNC_(h5tbwrite_field_index_c, H5TBWRITE_FIELD_INDEX_C)
-#define nh5tbwrite_field_index_int_c   H5_FC_FUNC_(h5tbwrite_field_index_int_c, H5TBWRITE_FIELD_INDEX_INT_C)
-#define nh5tbwrite_field_index_fl_c    H5_FC_FUNC_(h5tbwrite_field_index_fl_c, H5TBWRITE_FIELD_INDEX_FL_C)
-#define nh5tbwrite_field_index_dl_c    H5_FC_FUNC_(h5tbwrite_field_index_dl_c, H5TBWRITE_FIELD_INDEX_DL_C)
-#define nh5tbwrite_field_index_st_c    H5_FC_FUNC_(h5tbwrite_field_index_st_c, H5TBWRITE_FIELD_INDEX_ST_C)
-#define nh5tbread_field_index_c     H5_FC_FUNC_(h5tbread_field_index_c, H5TBREAD_FIELD_INDEX_C)
-#define nh5tbread_field_index_int_c    H5_FC_FUNC_(h5tbread_field_index_int_c, H5TBREAD_FIELD_INDEX_INT_C)
-#define nh5tbread_field_index_fl_c     H5_FC_FUNC_(h5tbread_field_index_fl_c, H5TBREAD_FIELD_INDEX_FL_C)
-#define nh5tbread_field_index_dl_c     H5_FC_FUNC_(h5tbread_field_index_dl_c, H5TBREAD_FIELD_INDEX_DL_C)
-#define nh5tbread_field_index_st_c     H5_FC_FUNC_(h5tbread_field_index_st_c, H5TBREAD_FIELD_INDEX_ST_C)
-#define nh5tbinsert_field_c         H5_FC_FUNC_(h5tbinsert_field_c, H5TBINSERT_FIELD_C)
-#define nh5tbinsert_field_int_c        H5_FC_FUNC_(h5tbinsert_field_int_c, H5TBINSERT_FIELD_INT_C)
-#define nh5tbinsert_field_fl_c         H5_FC_FUNC_(h5tbinsert_field_fl_c, H5TBINSERT_FIELD_FL_C)
-#define nh5tbinsert_field_dl_c         H5_FC_FUNC_(h5tbinsert_field_dl_c, H5TBINSERT_FIELD_DL_C)
-#define nh5tbinsert_field_st_c         H5_FC_FUNC_(h5tbinsert_field_st_c, H5TBINSERT_FIELD_ST_C)
-#define nh5tbdelete_field_c         H5_FC_FUNC_(h5tbdelete_field_c, H5TBDELETE_FIELD_C)
-#define nh5tbget_table_info_c       H5_FC_FUNC_(h5tbget_table_info_c, H5TBGET_TABLE_INFO_C)
-#define nh5tbget_field_info_c       H5_FC_FUNC_(h5tbget_field_info_c, H5TBGET_FIELD_INFO_C)
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5dsset_scale_c(hid_t_f *dsid, _fcd dimname, size_t_f *dimnamelen);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5dsattach_scale_c( hid_t_f *did, hid_t_f *dsid, int_f *idx);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5dsdetach_scale_c( hid_t_f *did, hid_t_f *dsid, int_f *idx);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5dsis_attached_c( hid_t_f *did, hid_t_f *dsid, int_f *idx, int_f *c_is_attached);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5dsis_scale_c(hid_t_f *did, int_f *is_scale);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5dsset_label_c(hid_t_f *did, int_f *idx, _fcd label, size_t_f *labellen);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5dsget_label_c(hid_t_f *did, int_f *idx, _fcd label, size_t_f *size);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5dsget_scale_name_c(hid_t_f *did, _fcd label, size_t_f *size);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5dsget_num_scales_c( hid_t_f *did, int_f *idx, int_f *num_scales);
-
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_c (hid_t_f *loc_id,
-                     size_t_f *namelen,
-                     _fcd name,
-                     int_f *rank,
-                     hsize_t_f *dims,
-                     hid_t_f *type_id,
-                     void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_int1_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_int2_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_int3_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_int4_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_int5_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_int6_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_int7_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_fl1_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_fl2_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_fl3_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_fl4_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_fl5_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_fl6_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_fl7_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf);
-
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_dl1_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_dl2_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_dl3_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_dl4_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_dl5_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_dl6_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_dl7_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_nint1_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *rank,
-                           hsize_t_f *dims,
-                           hid_t_f *type_id,
-                           void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_nint2_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *rank,
-                           hsize_t_f *dims,
-                           hid_t_f *type_id,
-                           void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_nint3_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *rank,
-                           hsize_t_f *dims,
-                           hid_t_f *type_id,
-                           void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_nint4_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *rank,
-                           hsize_t_f *dims,
-                           hid_t_f *type_id,
-                           void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_nint5_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *rank,
-                           hsize_t_f *dims,
-                           hid_t_f *type_id,
-                           void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_nint6_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *rank,
-                           hsize_t_f *dims,
-                           hid_t_f *type_id,
-                           void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_nint7_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *rank,
-                           hsize_t_f *dims,
-                           hid_t_f *type_id,
-                           void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_nfl1_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_nfl2_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_nfl3_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_nfl4_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_nfl5_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_nfl6_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_nfl7_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_ndl1_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_ndl2_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_ndl3_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_ndl4_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_ndl5_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_ndl6_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltmake_dataset_ndl7_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_c (hid_t_f *loc_id,
-                     size_t_f *namelen,
-                     _fcd name,
-                     hid_t_f *type_id,
-                     void *buf,
-                     hsize_t_f *dims);
-
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_int1_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_int2_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_int3_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_int4_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_int5_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_int6_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_int7_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_fl1_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_fl2_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_fl3_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_fl4_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_fl5_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_fl6_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims);
-
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_fl7_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_dl1_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_dl2_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_dl3_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_dl4_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_dl5_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_dl6_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_dl7_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_nint1_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           hid_t_f *type_id,
-                           void *buf,
-                           hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_nint2_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           hid_t_f *type_id,
-                           void *buf,
-                           hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_nint3_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           hid_t_f *type_id,
-                           void *buf,
-                           hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_nint4_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           hid_t_f *type_id,
-                           void *buf,
-                           hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_nint5_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           hid_t_f *type_id,
-                           void *buf,
-                           hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_nint6_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           hid_t_f *type_id,
-                           void *buf,
-                           hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_nint7_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           hid_t_f *type_id,
-                           void *buf,
-                           hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_nfl1_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_nfl2_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_nfl3_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_nfl4_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltread_dataset_nfl5_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
-
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltread_dataset_nfl6_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
+h5dsset_scale_c(hid_t_f *dsid, _fcd dimname, size_t_f *dimnamelen);
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltread_dataset_nfl7_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
+h5dsattach_scale_c( hid_t_f *did, hid_t_f *dsid, int_f *idx);
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltread_dataset_ndl1_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
+h5dsdetach_scale_c( hid_t_f *did, hid_t_f *dsid, int_f *idx);
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltread_dataset_ndl2_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
+h5dsis_attached_c( hid_t_f *did, hid_t_f *dsid, int_f *idx, int_f *c_is_attached);
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltread_dataset_ndl3_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
+h5dsis_scale_c(hid_t_f *did, int_f *is_scale);
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltread_dataset_ndl4_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
+h5dsset_label_c(hid_t_f *did, int_f *idx, _fcd label, size_t_f *labellen);
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltread_dataset_ndl5_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
+h5dsget_label_c(hid_t_f *did, int_f *idx, _fcd label, size_t_f *size);
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltread_dataset_ndl6_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
+h5dsget_scale_name_c(hid_t_f *did, _fcd label, size_t_f *size);
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltread_dataset_ndl7_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims);
+h5dsget_num_scales_c( hid_t_f *did, int_f *idx, int_f *num_scales);
 
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltset_attribute_int_c(hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd dsetname,
-                         size_t_f *attrnamelen,
-                         _fcd attrname,
-                         size_t_f *size,
-                         void *buf);
+/*
+ *  Functions from H5LTfc.c
+ */
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltset_attribute_float_c(hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd dsetname,
-                           size_t_f *attrnamelen,
-                           _fcd attrname,
-                           size_t_f *size,
-                           void *buf);
+h5ltmake_dataset_c (hid_t_f *loc_id,
+                     size_t_f *namelen,
+                     _fcd name,
+                     int_f *rank,
+                     hsize_t_f *dims,
+                     hid_t_f *type_id,
+                     void *buf);
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltset_attribute_double_c(hid_t_f *loc_id,
-                            size_t_f *namelen,
-                            _fcd dsetname,
-                            size_t_f *attrnamelen,
-                            _fcd attrname,
-                            size_t_f *size,
-                            void *buf);
+h5ltread_dataset_c (hid_t_f *loc_id,
+                     size_t_f *namelen,
+                     _fcd name,
+                     hid_t_f *type_id,
+                     void *buf);
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltset_attribute_string_c(hid_t_f *loc_id,
-                            size_t_f *namelen,
-                            _fcd dsetname,
-                            size_t_f *attrnamelen,
-                            _fcd attrname,
-                            size_t_f *buflen,
-                            void *buf);
+h5ltset_attribute_c(hid_t_f *loc_id,
+		    size_t_f *namelen,
+		    _fcd dsetname,
+		    size_t_f *attrnamelen,
+		    _fcd attrname,
+		    size_t_f *size,
+		    void *buf, char *dtype, size_t_f *sizeof_val);
 
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltget_attribute_int_c(hid_t_f *loc_id,
+h5ltget_attribute_c(hid_t_f *loc_id,
                          size_t_f *namelen,
                          _fcd dsetname,
                          size_t_f *attrnamelen,
                          _fcd attrname,
-                         void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltget_attribute_float_c(hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd dsetname,
-                           size_t_f *attrnamelen,
-                           _fcd attrname,
-                           void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5ltget_attribute_double_c(hid_t_f *loc_id,
-                            size_t_f *namelen,
-                            _fcd dsetname,
-                            size_t_f *attrnamelen,
-                            _fcd attrname,
-                            void *buf);
+		         void *buf, char* dtype, size_t_f *sizeof_val);
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltget_attribute_string_c(hid_t_f *loc_id,
-                            size_t_f *namelen,
-                            _fcd dsetname,
-                            size_t_f *attrnamelen,
-                            _fcd attrname,
-                            _fcd buf,
-                            size_t_f *buf_size);
+h5ltget_attribute_string_c(hid_t_f *loc_id,
+			   size_t_f *namelen,
+			   _fcd dsetname,
+			   size_t_f *attrnamelen,
+			   _fcd attrname,
+			   _fcd buf,
+			   size_t_f *buf_size);
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltget_dataset_ndims_c(hid_t_f *loc_id,
+h5ltget_dataset_ndims_c(hid_t_f *loc_id,
                          size_t_f *namelen,
                          _fcd name,
                          int_f *rank);
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltfind_dataset_c(hid_t_f *loc_id,
+h5ltfind_dataset_c(hid_t_f *loc_id,
                     size_t_f *namelen,
                     _fcd name);
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltget_dataset_info_c(hid_t_f *loc_id,
+h5ltget_dataset_info_c(hid_t_f *loc_id,
                         size_t_f *namelen,
                         _fcd name,
                         hsize_t_f *dims,
@@ -1163,7 +142,7 @@ nh5ltget_dataset_info_c(hid_t_f *loc_id,
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltget_attribute_ndims_c(hid_t_f *loc_id,
+h5ltget_attribute_ndims_c(hid_t_f *loc_id,
                            size_t_f *namelen,
                            _fcd dsetname,
                            size_t_f *attrnamelen,
@@ -1171,7 +150,7 @@ nh5ltget_attribute_ndims_c(hid_t_f *loc_id,
                            int_f *rank);
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltget_attribute_info_c(hid_t_f *loc_id,
+h5ltget_attribute_info_c(hid_t_f *loc_id,
                           size_t_f *namelen,
                           _fcd name,
                           size_t_f *attrnamelen,
@@ -1182,7 +161,7 @@ nh5ltget_attribute_info_c(hid_t_f *loc_id,
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltmake_dataset_string_c (hid_t_f *loc_id,
+h5ltmake_dataset_string_c (hid_t_f *loc_id,
                             size_t_f *namelen,
                             _fcd name,
                             size_t_f *buflen,
@@ -1190,14 +169,14 @@ nh5ltmake_dataset_string_c (hid_t_f *loc_id,
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltread_dataset_string_c (hid_t_f *loc_id,
+h5ltread_dataset_string_c (hid_t_f *loc_id,
                             size_t_f *namelen,
                             _fcd name,
                             char *buf);
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5ltpath_valid_c(hid_t_f *loc_id, 
+h5ltpath_valid_c(hid_t_f *loc_id, 
                   _fcd path, 
                   size_t_f *pathlen, 
                   int_f *check_object_valid_c);
@@ -1206,10 +185,9 @@ nh5ltpath_valid_c(hid_t_f *loc_id,
 * Image
 *-------------------------------------------------------------------------
 */
-
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5immake_image_8bit_c (hid_t_f *loc_id,
+h5immake_image_8bit_c (hid_t_f *loc_id,
                         size_t_f *namelen,
                         _fcd name,
                         hsize_t_f *width,
@@ -1217,14 +195,14 @@ nh5immake_image_8bit_c (hid_t_f *loc_id,
                         int_f *buf);
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5imread_image_c (hid_t_f *loc_id,
+h5imread_image_c (hid_t_f *loc_id,
                    size_t_f *namelen,
                    _fcd name,
                    int_f *buf);
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5immake_image_24bit_c (hid_t_f *loc_id,
+h5immake_image_24bit_c (hid_t_f *loc_id,
                          size_t_f *namelen,
                          _fcd name,
                          size_t_f *ilen,
@@ -1234,7 +212,7 @@ nh5immake_image_24bit_c (hid_t_f *loc_id,
                          void *buf);
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5imget_image_info_c(hid_t_f *loc_id,
+h5imget_image_info_c(hid_t_f *loc_id,
                       size_t_f *namelen,
                       _fcd name,
                       hsize_t_f *width,
@@ -1247,14 +225,14 @@ nh5imget_image_info_c(hid_t_f *loc_id,
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5imis_image_c(hid_t_f *loc_id,
+h5imis_image_c(hid_t_f *loc_id,
                 size_t_f *namelen,
                 _fcd name);
 
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5immake_palette_c (hid_t_f *loc_id,
+h5immake_palette_c (hid_t_f *loc_id,
                      size_t_f *namelen,
                      _fcd name,
                      hsize_t_f *dims,
@@ -1262,7 +240,7 @@ nh5immake_palette_c (hid_t_f *loc_id,
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5imlink_palette_c (hid_t_f *loc_id,
+h5imlink_palette_c (hid_t_f *loc_id,
                      size_t_f *namelen,
                      _fcd name,
                      size_t_f *ilen,
@@ -1270,7 +248,7 @@ nh5imlink_palette_c (hid_t_f *loc_id,
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5imunlink_palette_c (hid_t_f *loc_id,
+h5imunlink_palette_c (hid_t_f *loc_id,
                        size_t_f *namelen,
                        _fcd name,
                        size_t_f *ilen,
@@ -1278,7 +256,7 @@ nh5imunlink_palette_c (hid_t_f *loc_id,
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5imget_npalettes_c(hid_t_f *loc_id,
+h5imget_npalettes_c(hid_t_f *loc_id,
                      size_t_f *namelen,
                      _fcd name,
                      hsize_t_f *npals);
@@ -1286,7 +264,7 @@ nh5imget_npalettes_c(hid_t_f *loc_id,
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5imget_palette_info_c(hid_t_f *loc_id,
+h5imget_palette_info_c(hid_t_f *loc_id,
                         size_t_f *namelen,
                         _fcd name,
                         int_f *pal_number,
@@ -1294,7 +272,7 @@ nh5imget_palette_info_c(hid_t_f *loc_id,
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5imget_palette_c(hid_t_f *loc_id,
+h5imget_palette_c(hid_t_f *loc_id,
                    size_t_f *namelen,
                    _fcd name,
                    int_f *pal_number,
@@ -1302,7 +280,7 @@ nh5imget_palette_c(hid_t_f *loc_id,
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5imis_palette_c(hid_t_f *loc_id,
+h5imis_palette_c(hid_t_f *loc_id,
                   size_t_f *namelen,
                   _fcd name);
 
@@ -1315,7 +293,7 @@ nh5imis_palette_c(hid_t_f *loc_id,
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5tbmake_table_c(size_t_f *namelen1,
+h5tbmake_table_c(size_t_f *namelen1,
                   _fcd name1,
                   hid_t_f *loc_id,
                   size_t_f *namelen,
@@ -1333,7 +311,7 @@ nh5tbmake_table_c(size_t_f *namelen1,
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5tbwrite_field_name_c(hid_t_f *loc_id,
+h5tbwrite_field_name_c(hid_t_f *loc_id,
                         size_t_f *namelen,
                         _fcd name,
                         size_t_f *namelen1,
@@ -1343,57 +321,11 @@ nh5tbwrite_field_name_c(hid_t_f *loc_id,
                         size_t_f *type_size,
                         void *buf);
 
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbwrite_field_name_int_c(hid_t_f *loc_id,
-                            size_t_f *namelen,
-                            _fcd name,
-                            size_t_f *namelen1,
-                            _fcd field_name,
-                            hsize_t_f *start,
-                            hsize_t_f *nrecords,
-                            size_t_f *type_size,
-                            void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbwrite_field_name_fl_c(hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           size_t_f *namelen1,
-                           _fcd field_name,
-                           hsize_t_f *start,
-                           hsize_t_f *nrecords,
-                           size_t_f *type_size,
-                           void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbwrite_field_name_dl_c(hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           size_t_f *namelen1,
-                           _fcd field_name,
-                           hsize_t_f *start,
-                           hsize_t_f *nrecords,
-                           size_t_f *type_size,
-                           void *buf);
 
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbwrite_field_name_st_c(hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           size_t_f *namelen1,
-                           _fcd field_name,
-                           hsize_t_f *start,
-                           hsize_t_f *nrecords,
-                           size_t_f *type_size,
-                           void *buf);
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5tbread_field_name_c(hid_t_f *loc_id,
+h5tbread_field_name_c(hid_t_f *loc_id,
                        size_t_f *namelen,
                        _fcd name,
                        size_t_f *namelen1,
@@ -1403,57 +335,11 @@ nh5tbread_field_name_c(hid_t_f *loc_id,
                        size_t_f *type_size,
                        void *buf);
 
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbread_field_name_int_c(hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           size_t_f *namelen1,
-                           _fcd field_name,
-                           hsize_t_f *start,
-                           hsize_t_f *nrecords,
-                           size_t_f *type_size,
-                           void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbread_field_name_fl_c(hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          size_t_f *namelen1,
-                          _fcd field_name,
-                          hsize_t_f *start,
-                          hsize_t_f *nrecords,
-                          size_t_f *type_size,
-                          void *buf);
 
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbread_field_name_dl_c(hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          size_t_f *namelen1,
-                          _fcd field_name,
-                          hsize_t_f *start,
-                          hsize_t_f *nrecords,
-                          size_t_f *type_size,
-                          void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbread_field_name_st_c(hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          size_t_f *namelen1,
-                          _fcd field_name,
-                          hsize_t_f *start,
-                          hsize_t_f *nrecords,
-                          size_t_f *type_size,
-                          void *buf);
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5tbwrite_field_index_c(hid_t_f *loc_id,
+h5tbwrite_field_index_c(hid_t_f *loc_id,
                          size_t_f *namelen,
                          _fcd name,
                          int_f *field_index,
@@ -1464,51 +350,7 @@ nh5tbwrite_field_index_c(hid_t_f *loc_id,
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5tbwrite_field_index_int_c(hid_t_f *loc_id,
-                             size_t_f *namelen,
-                             _fcd name,
-                             int_f *field_index,
-                             hsize_t_f *start,
-                             hsize_t_f *nrecords,
-                             size_t_f *type_size,
-                             void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbwrite_field_index_fl_c(hid_t_f *loc_id,
-                            size_t_f *namelen,
-                            _fcd name,
-                            int_f *field_index,
-                            hsize_t_f *start,
-                            hsize_t_f *nrecords,
-                            size_t_f *type_size,
-                            void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbwrite_field_index_dl_c(hid_t_f *loc_id,
-                            size_t_f *namelen,
-                            _fcd name,
-                            int_f *field_index,
-                            hsize_t_f *start,
-                            hsize_t_f *nrecords,
-                            size_t_f *type_size,
-                            void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbwrite_field_index_st_c(hid_t_f *loc_id,
-                            size_t_f *namelen,
-                            _fcd name,
-                            int_f *field_index,
-                            hsize_t_f *start,
-                            hsize_t_f *nrecords,
-                            size_t_f *type_size,
-                            void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbread_field_index_c(hid_t_f *loc_id,
+h5tbread_field_index_c(hid_t_f *loc_id,
                         size_t_f *namelen,
                         _fcd name,
                         int_f *field_index,
@@ -1519,51 +361,7 @@ nh5tbread_field_index_c(hid_t_f *loc_id,
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5tbread_field_index_int_c(hid_t_f *loc_id,
-                            size_t_f *namelen,
-                            _fcd name,
-                            int_f *field_index,
-                            hsize_t_f *start,
-                            hsize_t_f *nrecords,
-                            size_t_f *type_size,
-                            void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbread_field_index_fl_c(hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *field_index,
-                           hsize_t_f *start,
-                           hsize_t_f *nrecords,
-                           size_t_f *type_size,
-                           void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbread_field_index_dl_c(hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *field_index,
-                           hsize_t_f *start,
-                           hsize_t_f *nrecords,
-                           size_t_f *type_size,
-                           void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbread_field_index_st_c(hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *field_index,
-                           hsize_t_f *start,
-                           hsize_t_f *nrecords,
-                           size_t_f *type_size,
-                           void *buf);
-
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbinsert_field_c(hid_t_f *loc_id,
+h5tbinsert_field_c(hid_t_f *loc_id,
                     size_t_f *namelen,
                     _fcd name,
                     size_t_f *namelen1,
@@ -1574,47 +372,7 @@ nh5tbinsert_field_c(hid_t_f *loc_id,
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5tbinsert_field_int_c(hid_t_f *loc_id,
-                        size_t_f *namelen,
-                        _fcd name,
-                        size_t_f *namelen1,
-                        _fcd field_name,
-                        hid_t_f *field_type,
-                        int_f *position,
-                        void *buf);
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbinsert_field_fl_c(hid_t_f *loc_id,
-                       size_t_f *namelen,
-                       _fcd name,
-                       size_t_f *namelen1,
-                       _fcd field_name,
-                       hid_t_f *field_type,
-                       int_f *position,
-                       void *buf);
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbinsert_field_dl_c(hid_t_f *loc_id,
-                       size_t_f *namelen,
-                       _fcd name,
-                       size_t_f *namelen1,
-                       _fcd field_name,
-                       hid_t_f *field_type,
-                       int_f *position,
-                       void *buf);
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbinsert_field_st_c(hid_t_f *loc_id,
-                       size_t_f *namelen,
-                       _fcd name,
-                       size_t_f *namelen1,
-                       _fcd field_name,
-                       hid_t_f *field_type,
-                       int_f *position,
-                       void *buf);
-HDF5_HL_F90CSTUBDLL
-int_f
-nh5tbdelete_field_c(hid_t_f *loc_id,
+h5tbdelete_field_c(hid_t_f *loc_id,
                     size_t_f *namelen,
                     _fcd name,
                     size_t_f *namelen1,
@@ -1623,7 +381,7 @@ nh5tbdelete_field_c(hid_t_f *loc_id,
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5tbget_table_info_c(hid_t_f *loc_id,
+h5tbget_table_info_c(hid_t_f *loc_id,
                       size_t_f *namelen,
                       _fcd name,
                       hsize_t_f *nfields,
@@ -1631,7 +389,7 @@ nh5tbget_table_info_c(hid_t_f *loc_id,
 
 HDF5_HL_F90CSTUBDLL
 int_f
-nh5tbget_field_info_c(hid_t_f *loc_id,
+h5tbget_field_info_c(hid_t_f *loc_id,
                       size_t_f *namelen,
                       _fcd name,
                       hsize_t_f *nfields,
@@ -1641,7 +399,7 @@ nh5tbget_field_info_c(hid_t_f *loc_id,
                       size_t_f *namelen2,
                       size_t_f *lenmax,
                       _fcd field_names,
-                      size_t_f *maxlen_out);
+                      size_t_f *maxlen_out);    
 
 
 #endif /* _H5LTf90proto_H */
diff --git a/hl/fortran/src/H5LTfc.c b/hl/fortran/src/H5LTfc.c
index 8d8aae1..3a94664 100644
--- a/hl/fortran/src/H5LTfc.c
+++ b/hl/fortran/src/H5LTfc.c
@@ -39,7 +39,7 @@
 */
 
 int_f
-nh5ltmake_dataset_c (hid_t_f *loc_id,
+h5ltmake_dataset_c (hid_t_f *loc_id,
                      size_t_f *namelen,
                      _fcd name,
                      int_f *rank,
@@ -83,1087 +83,22 @@ nh5ltmake_dataset_c (hid_t_f *loc_id,
 
 done:
     if(c_name!=NULL)
-        free(c_name);
+        HDfree(c_name);
     if(c_dims!=NULL)
-        free(c_dims);
+        HDfree(c_dims);
     return ret_value;
 }
 
-int_f
-nh5ltmake_dataset_int1_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_int2_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_int3_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_int4_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_int5_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_int6_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_int7_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_fl1_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_fl2_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_fl3_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_fl4_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_fl5_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_fl6_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_fl7_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_dl1_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_dl2_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_dl3_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_dl4_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_dl5_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_dl6_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_dl7_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         int_f *rank,
-                         hsize_t_f *dims,
-                         hid_t_f *type_id,
-                         void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_nint1_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *rank,
-                           hsize_t_f *dims,
-                           hid_t_f *type_id,
-                           void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_nint2_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *rank,
-                           hsize_t_f *dims,
-                           hid_t_f *type_id,
-                           void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_nint3_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *rank,
-                           hsize_t_f *dims,
-                           hid_t_f *type_id,
-                           void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_nint4_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *rank,
-                           hsize_t_f *dims,
-                           hid_t_f *type_id,
-                           void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_nint5_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *rank,
-                           hsize_t_f *dims,
-                           hid_t_f *type_id,
-                           void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_nint6_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *rank,
-                           hsize_t_f *dims,
-                           hid_t_f *type_id,
-                           void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_nint7_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *rank,
-                           hsize_t_f *dims,
-                           hid_t_f *type_id,
-                           void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_nfl1_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_nfl2_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_nfl3_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_nfl4_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_nfl5_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_nfl6_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_nfl7_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_ndl1_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_ndl2_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_ndl3_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_ndl4_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_ndl5_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_ndl6_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-int_f
-nh5ltmake_dataset_ndl7_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          int_f *rank,
-                          hsize_t_f *dims,
-                          hid_t_f *type_id,
-                          void *buf)
-{
-    return nh5ltmake_dataset_c (loc_id, namelen, name, rank, dims, type_id, buf);
-}
-/*-------------------------------------------------------------------------
-* Function: H5LTread_dataset_c
-*
-* Purpose: Call H5LTmake_dataset
-*
-* Return: Success: 0, Failure: -1
-*
-* Programmer: pvn at ncsa.uiuc.edu
-*
-* Date: September 09, 2004
-*
-* Comments:
-*
-* Modifications:
-*
-*
-*-------------------------------------------------------------------------
-*/
-
-int_f
-nh5ltread_dataset_c (hid_t_f *loc_id,
-                     size_t_f *namelen,
-                     _fcd name,
-                     hid_t_f *type_id,
-                     void *buf,
-                     hsize_t_f *dims)
-{
-    int     ret_value = -1;
-    herr_t  ret;
-    hid_t   c_loc_id;
-    hid_t   c_type_id;
-    char    *c_name = NULL;
-
-    /*
-    * convert FORTRAN name to C name
-    */
-    c_name = (char *)HD5f2cstring(name, (size_t)*namelen);
-    if (c_name == NULL)
-        goto done;
-
-    /*
-    * call H5LTread_dataset function.
-    */
-    c_loc_id = (hid_t)*loc_id;
-    c_type_id = (hid_t)*type_id;
-
-    ret = H5LTread_dataset(c_loc_id, c_name, c_type_id, buf );
-
-    if (ret < 0)
-        goto done;
-
-    ret_value = 0;
-
-done:
-    if(c_name!=NULL)
-        free(c_name);
-
-    return ret_value;
-}
-
-int_f
-nh5ltread_dataset_int1_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_int2_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_int3_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_int4_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_int5_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_int6_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_int7_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_fl1_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_fl2_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_fl3_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_fl4_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_fl5_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_fl6_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_fl7_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_dl1_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_dl2_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_dl3_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_dl4_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_dl5_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_dl6_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_dl7_c (hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd name,
-                         hid_t_f *type_id,
-                         void *buf,
-                         hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_nint1_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           hid_t_f *type_id,
-                           void *buf,
-                           hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_nint2_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           hid_t_f *type_id,
-                           void *buf,
-                           hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_nint3_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           hid_t_f *type_id,
-                           void *buf,
-                           hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_nint4_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           hid_t_f *type_id,
-                           void *buf,
-                           hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_nint5_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           hid_t_f *type_id,
-                           void *buf,
-                           hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_nint6_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           hid_t_f *type_id,
-                           void *buf,
-                           hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_nint7_c (hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           hid_t_f *type_id,
-                           void *buf,
-                           hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_nfl1_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_nfl2_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_nfl3_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_nfl4_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_nfl5_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_nfl6_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_nfl7_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_ndl1_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_ndl2_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_ndl3_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_ndl4_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_ndl5_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_ndl6_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-int_f
-nh5ltread_dataset_ndl7_c (hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          hid_t_f *type_id,
-                          void *buf,
-                          hsize_t_f *dims)
-{
-    return nh5ltread_dataset_c(loc_id, namelen, name, type_id, buf, dims);
-}
-/*-------------------------------------------------------------------------
-* Function: H5LTmake_dataset_string_c
-*
-* Purpose: Call H5LTmake_dataset
-*
-* Return: Success: 0, Failure: -1
-*
-* Programmer: pvn at ncsa.uiuc.edu
-*
-* Date: September 09, 2004
-*
-* Comments:
-*
-* Modifications:
-*
-*
-*-------------------------------------------------------------------------
-*/
-
-int_f
-nh5ltmake_dataset_string_c (hid_t_f *loc_id,
-                            size_t_f *namelen,
-                            _fcd name,
-                            size_t_f *buflen,
-                            char *buf)
-{
-    int     ret_value = -1;
-    herr_t  ret;
-    hid_t   c_loc_id;
-    char    *c_name = NULL;
-    char    *c_buf = NULL;
-
-    /*
-    * convert FORTRAN name to C name
-    */
-    c_name = (char *)HD5f2cstring(name, (size_t)*namelen);
-    if (c_name == NULL)
-        goto done;
-
-    c_buf = (char *)HD5f2cstring(buf, (size_t)*buflen);
-    if (c_buf == NULL)
-        goto done;
-
-    /*
-    * call H5LTmake_dataset_string function.
-    */
-    c_loc_id = (hid_t)*loc_id;
-
-    ret = H5LTmake_dataset_string(c_loc_id,c_name,c_buf);
-
-    if (ret < 0)
-        goto done;
-
-    ret_value = 0;
-
-done:
-    if(c_name!=NULL)
-        free(c_name);
-    if(c_buf!=NULL)
-        free(c_buf);
-
-    return ret_value;
-}
-
-
-/*-------------------------------------------------------------------------
-* Function: H5LTread_dataset_string_c
-*
-* Purpose: Call H5LTread_dataset_string
-*
-* Return: Success: 0, Failure: -1
-*
-* Programmer: pvn at ncsa.uiuc.edu
-*
-* Date: September 09, 2004
-*
-* Comments:
-*
-* Modifications:
-*
-*
-*-------------------------------------------------------------------------
-*/
-
-int_f
-nh5ltread_dataset_string_c (hid_t_f *loc_id,
-                            size_t_f *namelen,
-                            _fcd name,
-                            char *buf)
-{
-    int     ret_value = -1;
-    herr_t  ret;
-    hid_t   c_loc_id;
-    char    *c_name = NULL;
-
-    /*
-    * convert FORTRAN name to C name
-    */
-    c_name = (char *)HD5f2cstring(name, (size_t)*namelen);
-    if (c_name == NULL)
-        goto done;
-
-    /*
-    * call H5LTread_dataset_string function.
-    */
-    c_loc_id = (hid_t)*loc_id;
-
-    ret = H5LTread_dataset_string(c_loc_id,c_name,buf);
-
-    if (ret < 0)
-        goto done;
-
-    ret_value = 0;
-
-done:
-    if(c_name!=NULL)
-        free(c_name);
-
-    return ret_value;
-}
-
-
-
 /*-------------------------------------------------------------------------
-* Function: H5LTset_attribute_int_c
+* Function: H5LTread_dataset_c
 *
-* Purpose: Call H5LTset_attribute_int
+* Purpose: Call H5LTmake_dataset
 *
 * Return: Success: 0, Failure: -1
 *
 * Programmer: pvn at ncsa.uiuc.edu
 *
-* Date: October 05, 2004
+* Date: September 09, 2004
 *
 * Comments:
 *
@@ -1174,46 +109,32 @@ done:
 */
 
 int_f
-nh5ltset_attribute_int_c(hid_t_f *loc_id,
-                         size_t_f *namelen,
-                         _fcd dsetname,
-                         size_t_f *attrnamelen,
-                         _fcd attrname,
-                         size_t_f *size,
-                         void *buf)
+h5ltread_dataset_c (hid_t_f *loc_id,
+                     size_t_f *namelen,
+                     _fcd name,
+                     hid_t_f *type_id,
+                     void *buf)
 {
     int     ret_value = -1;
     herr_t  ret;
     hid_t   c_loc_id;
+    hid_t   c_type_id;
     char    *c_name = NULL;
-    char    *c_attrname = NULL;
-    size_t  c_size;
 
     /*
     * convert FORTRAN name to C name
     */
-    c_name = (char *)HD5f2cstring(dsetname, (size_t)*namelen);
+    c_name = (char *)HD5f2cstring(name, (size_t)*namelen);
     if (c_name == NULL)
         goto done;
 
-    c_attrname = (char *)HD5f2cstring(attrname, (size_t)*attrnamelen);
-    if (c_attrname == NULL)
-        goto done;
-
     /*
-    * call H5LTset_attribute_int function.
+    * call H5LTread_dataset function.
     */
     c_loc_id = (hid_t)*loc_id;
-    c_size   = (size_t)*size;
+    c_type_id = (hid_t)*type_id;
 
-    if (sizeof(int_f) == sizeof(int))
-        ret = H5LTset_attribute_int(c_loc_id,c_name,c_attrname,(const int *)buf,c_size);
-    else if (sizeof(int_f) == sizeof(long))
-      ret = H5LTset_attribute_long(c_loc_id,c_name,c_attrname,(const long *)buf,c_size);
-    else if (sizeof(int_f) == sizeof(long long))
-        ret = H5LTset_attribute_long_long(c_loc_id,c_name,c_attrname,(const long long *)buf,c_size);
-    else
-        goto done;
+    ret = H5LTread_dataset(c_loc_id, c_name, c_type_id, buf );
 
     if (ret < 0)
         goto done;
@@ -1222,92 +143,21 @@ nh5ltset_attribute_int_c(hid_t_f *loc_id,
 
 done:
     if(c_name!=NULL)
-        free(c_name);
-     if(c_attrname!=NULL)
-        free(c_attrname);
-
-    return ret_value;
-}
-
-/*-------------------------------------------------------------------------
-* Function: H5LTset_attribute_float_c
-*
-* Purpose: Call H5LTset_attribute_float
-*
-* Return: Success: 0, Failure: -1
-*
-* Programmer: pvn at ncsa.uiuc.edu
-*
-* Date: October 05, 2004
-*
-* Comments:
-*
-* Modifications:
-*
-*
-*-------------------------------------------------------------------------
-*/
-
-int_f
-nh5ltset_attribute_float_c(hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd dsetname,
-                           size_t_f *attrnamelen,
-                           _fcd attrname,
-                           size_t_f *size,
-                           void *buf)
-{
-    int     ret_value = -1;
-    herr_t  ret;
-    hid_t   c_loc_id;
-    char    *c_name = NULL;
-    char    *c_attrname = NULL;
-    size_t  c_size;
-
-    /*
-    * convert FORTRAN name to C name
-    */
-    c_name = (char *)HD5f2cstring(dsetname, (size_t)*namelen);
-    if (c_name == NULL)
-         goto done;
-
-    c_attrname = (char *)HD5f2cstring(attrname, (size_t)*attrnamelen);
-    if (c_attrname == NULL)
-         goto done;
-
-    /*
-    * Call H5LTset_attribute_float function.
-    */
-    c_loc_id = (hid_t)*loc_id;
-    c_size   = (size_t)*size;
-
-    ret = H5LTset_attribute_float(c_loc_id,c_name,c_attrname,(float *)buf,c_size);
-
-    if (ret < 0)
-         goto done;
-
-    ret_value = 0;
-
-done:
-    if(c_name!=NULL)
-        free(c_name);
-    if(c_attrname!=NULL)
-        free(c_attrname);
+        HDfree(c_name);
 
     return ret_value;
 }
 
-
 /*-------------------------------------------------------------------------
-* Function: H5LTset_attribute_double_c
+* Function: H5LTmake_dataset_string_c
 *
-* Purpose: Call H5LTset_attribute_double
+* Purpose: Call H5LTmake_dataset
 *
 * Return: Success: 0, Failure: -1
 *
 * Programmer: pvn at ncsa.uiuc.edu
 *
-* Date: October 05, 2004
+* Date: September 09, 2004
 *
 * Comments:
 *
@@ -1318,65 +168,61 @@ done:
 */
 
 int_f
-nh5ltset_attribute_double_c(hid_t_f *loc_id,
+h5ltmake_dataset_string_c (hid_t_f *loc_id,
                             size_t_f *namelen,
-                            _fcd dsetname,
-                            size_t_f *attrnamelen,
-                            _fcd attrname,
-                            size_t_f *size,
-                            void *buf)
+                            _fcd name,
+                            size_t_f *buflen,
+                            char *buf)
 {
     int     ret_value = -1;
     herr_t  ret;
     hid_t   c_loc_id;
     char    *c_name = NULL;
-    char    *c_attrname = NULL;
-    size_t  c_size;
+    char    *c_buf = NULL;
 
     /*
-    * Convert FORTRAN name to C name
+    * convert FORTRAN name to C name
     */
-    c_name = (char *)HD5f2cstring(dsetname, (size_t)*namelen);
+    c_name = (char *)HD5f2cstring(name, (size_t)*namelen);
     if (c_name == NULL)
         goto done;
 
-    c_attrname = (char *)HD5f2cstring(attrname, (size_t)*attrnamelen);
-    if (c_attrname == NULL)
+    c_buf = (char *)HD5f2cstring(buf, (size_t)*buflen);
+    if (c_buf == NULL)
         goto done;
 
     /*
-    * Call H5LTset_attribute_double function.
+    * call H5LTmake_dataset_string function.
     */
     c_loc_id = (hid_t)*loc_id;
-    c_size   = (size_t)*size;
 
-    ret = H5LTset_attribute_double(c_loc_id,c_name,c_attrname,(double *)buf,c_size);
+    ret = H5LTmake_dataset_string(c_loc_id,c_name,c_buf);
 
     if (ret < 0)
         goto done;
 
     ret_value = 0;
 
-
 done:
     if(c_name!=NULL)
-        free(c_name);
-    if(c_attrname!=NULL)
-        free(c_attrname);
+        HDfree(c_name);
+    if(c_buf!=NULL)
+        HDfree(c_buf);
 
     return ret_value;
 }
 
+
 /*-------------------------------------------------------------------------
-* Function: H5LTset_attribute_string_c
+* Function: H5LTread_dataset_string_c
 *
-* Purpose: Call H5LTset_attribute_string
+* Purpose: Call H5LTread_dataset_string
 *
 * Return: Success: 0, Failure: -1
 *
 * Programmer: pvn at ncsa.uiuc.edu
 *
-* Date: October 05, 2004
+* Date: September 09, 2004
 *
 * Comments:
 *
@@ -1387,65 +233,46 @@ done:
 */
 
 int_f
-nh5ltset_attribute_string_c(hid_t_f *loc_id,
+h5ltread_dataset_string_c (hid_t_f *loc_id,
                             size_t_f *namelen,
-                            _fcd dsetname,
-                            size_t_f *attrnamelen,
-                            _fcd attrname,
-                            size_t_f *buflen,
-                            void *buf)
+                            _fcd name,
+                            char *buf)
 {
     int     ret_value = -1;
     herr_t  ret;
     hid_t   c_loc_id;
     char    *c_name = NULL;
-    char    *c_attrname = NULL;
-    char    *c_buf = NULL;
 
     /*
     * convert FORTRAN name to C name
     */
-    c_name = (char *)HD5f2cstring(dsetname, (size_t)*namelen);
+    c_name = (char *)HD5f2cstring(name, (size_t)*namelen);
     if (c_name == NULL)
         goto done;
 
-    c_attrname = (char *)HD5f2cstring(attrname, (size_t)*attrnamelen);
-    if (c_attrname == NULL)
-        goto done;
-
-    c_buf = (char *)HD5f2cstring((_fcd)buf, (size_t)*buflen);
-    if (c_buf == NULL)
-        goto done;
-
-
     /*
-    * call H5LTset_attribute_string function.
+    * call H5LTread_dataset_string function.
     */
     c_loc_id = (hid_t)*loc_id;
 
-    ret = H5LTset_attribute_string(c_loc_id,c_name,c_attrname,c_buf);
+    ret = H5LTread_dataset_string(c_loc_id,c_name,buf);
 
     if (ret < 0)
         goto done;
 
     ret_value = 0;
 
-
 done:
     if(c_name!=NULL)
-        free(c_name);
-    if(c_attrname!=NULL)
-        free(c_attrname);
-    if(c_buf!=NULL)
-        free(c_buf);
+        HDfree(c_name);
 
     return ret_value;
 }
 
 /*-------------------------------------------------------------------------
-* Function: H5LTget_attribute_int_c
+* Function: H5LTset_attribute_int_c
 *
-* Purpose: Call H5LTget_attribute_int
+* Purpose: Call H5LTset_attribute_int
 *
 * Return: Success: 0, Failure: -1
 *
@@ -1462,18 +289,21 @@ done:
 */
 
 int_f
-nh5ltget_attribute_int_c(hid_t_f *loc_id,
+h5ltset_attribute_c(hid_t_f *loc_id,
                          size_t_f *namelen,
                          _fcd dsetname,
                          size_t_f *attrnamelen,
                          _fcd attrname,
-                         void *buf)
+                         size_t_f *size,
+		         void *buf, char *dtype, size_t_f *sizeof_val)
 {
     int     ret_value = -1;
-    herr_t  ret;
+    herr_t  ret = SUCCEED;
     hid_t   c_loc_id;
     char    *c_name = NULL;
     char    *c_attrname = NULL;
+    char    *c_buf = NULL;
+    size_t  c_size;
 
     /*
     * convert FORTRAN name to C name
@@ -1487,39 +317,59 @@ nh5ltget_attribute_int_c(hid_t_f *loc_id,
         goto done;
 
     /*
-    * call H5LTget_attribute_int function.
+    * call H5LTset_attribute_int function.
     */
     c_loc_id = (hid_t)*loc_id;
+    c_size   = (size_t)*size;
 
-    if(sizeof(int_f) == sizeof(int))
-      ret = H5LTget_attribute_int(c_loc_id,c_name,c_attrname,(int *)buf);
-    else if (sizeof(int_f) == sizeof(long))
-      ret = H5LTget_attribute_long(c_loc_id,c_name,c_attrname,(long *)buf);
-    else if (sizeof(int_f) == sizeof(long long))
-      ret = H5LTget_attribute_long_long(c_loc_id,c_name,c_attrname,(long long *)buf);
-    else
-        goto done;
-
+    if( HDstrncmp(dtype,"I",1) == 0 ) {
+      if ((size_t)*sizeof_val == sizeof(int))
+        ret = H5LT_set_attribute_numerical(c_loc_id,c_name,c_attrname, c_size, H5T_NATIVE_INT, (const int *)buf);
+      else if ((size_t)*sizeof_val == sizeof(long))
+	ret = H5LT_set_attribute_numerical(c_loc_id,c_name,c_attrname, c_size, H5T_NATIVE_LONG, (const long *)buf);
+      else if ((size_t)*sizeof_val == sizeof(long long))
+        ret = H5LT_set_attribute_numerical(c_loc_id,c_name,c_attrname, c_size, H5T_NATIVE_LLONG, (const long long *)buf);
+      else
+        goto done;
+    } else if ( HDstrncmp(dtype,"R",1) == 0 ) {
+      if((size_t)*sizeof_val == sizeof(float))
+	ret = H5LT_set_attribute_numerical(c_loc_id,c_name,c_attrname, c_size, H5T_NATIVE_FLOAT, (const float *)buf);
+      else if((size_t)*sizeof_val == sizeof(double))
+	ret = H5LT_set_attribute_numerical(c_loc_id,c_name,c_attrname, c_size, H5T_NATIVE_DOUBLE,  (const double *)buf);
+#if H5_SIZEOF_LONG_DOUBLE !=0
+      else if((size_t)*sizeof_val == sizeof(long double))
+	ret = H5LT_set_attribute_numerical(c_loc_id,c_name,c_attrname, c_size, H5T_NATIVE_LDOUBLE, (const long double *)buf);
+#endif
+      else
+        goto done;
+    } else if ( HDstrncmp(dtype,"C",1) == 0 ) {
+
+      c_buf = (char *)HD5f2cstring((_fcd)buf, c_size);
+      if (c_buf == NULL)
+        goto done;
+
+      ret = H5LTset_attribute_string(c_loc_id,c_name,c_attrname,c_buf);
+    }
     if (ret < 0)
-        goto done;
+      goto done;
 
     ret_value = 0;
 
 done:
     if(c_name!=NULL)
-        free(c_name);
-    if(c_attrname!=NULL)
-        free(c_attrname);
-
+        HDfree(c_name);
+     if(c_attrname!=NULL)
+        HDfree(c_attrname);
+    if(c_buf!=NULL)
+        HDfree(c_buf);
 
     return ret_value;
 }
 
-
 /*-------------------------------------------------------------------------
-* Function: H5LTget_attribute_float_c
+* Function: H5LTget_attribute_c
 *
-* Purpose: Call H5LTget_attribute_float
+* Purpose: Call H5LTget_attribute_int
 *
 * Return: Success: 0, Failure: -1
 *
@@ -1536,15 +386,15 @@ done:
 */
 
 int_f
-nh5ltget_attribute_float_c(hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd dsetname,
-                           size_t_f *attrnamelen,
-                           _fcd attrname,
-                           void *buf)
+h5ltget_attribute_c(hid_t_f *loc_id,
+                         size_t_f *namelen,
+                         _fcd dsetname,
+                         size_t_f *attrnamelen,
+                         _fcd attrname,
+		         void *buf, char *dtype, size_t_f *sizeof_val)
 {
     int     ret_value = -1;
-    herr_t  ret;
+    herr_t  ret = SUCCEED;
     hid_t   c_loc_id;
     char    *c_name = NULL;
     char    *c_attrname = NULL;
@@ -1565,84 +415,38 @@ nh5ltget_attribute_float_c(hid_t_f *loc_id,
     */
     c_loc_id = (hid_t)*loc_id;
 
-    ret = H5LTget_attribute_float(c_loc_id,c_name,c_attrname,(float*)buf);
-
-    if (ret < 0)
-        goto done;
-
-    ret_value = 0;
-
-done:
-    if(c_name!=NULL)
-        free(c_name);
-    if(c_attrname!=NULL)
-        free(c_attrname);
-
-    return ret_value;
-}
-
-/*-------------------------------------------------------------------------
-* Function: H5LTget_attribute_double_c
-*
-* Purpose: Call H5LTget_attribute_double
-*
-* Return: Success: 0, Failure: -1
-*
-* Programmer: pvn at ncsa.uiuc.edu
-*
-* Date: October 05, 2004
-*
-* Comments:
-*
-* Modifications:
-*
-*
-*-------------------------------------------------------------------------
-*/
-
-int_f
-nh5ltget_attribute_double_c(hid_t_f *loc_id,
-                            size_t_f *namelen,
-                            _fcd dsetname,
-                            size_t_f *attrnamelen,
-                            _fcd attrname,
-                            void *buf)
-{
-    int     ret_value = -1;
-    herr_t  ret;
-    hid_t   c_loc_id;
-    char    *c_name = NULL;
-    char    *c_attrname = NULL;
-
-    /*
-    * convert FORTRAN name to C name
-    */
-    c_name = (char *)HD5f2cstring(dsetname, (size_t)*namelen);
-    if (c_name == NULL)
-        goto done;
-
-    c_attrname = (char *)HD5f2cstring(attrname, (size_t)*attrnamelen);
-    if (c_attrname == NULL)
+    if( HDstrncmp(dtype,"I",1) == 0) {
+      if((size_t)*sizeof_val == sizeof(int))
+	ret = H5LTget_attribute(c_loc_id,c_name,c_attrname,H5T_NATIVE_INT,buf);
+      else if ((size_t)*sizeof_val == sizeof(long))
+	ret = H5LTget_attribute(c_loc_id,c_name,c_attrname,H5T_NATIVE_LONG,buf);
+      else if ((size_t)*sizeof_val == sizeof(long long))
+	ret = H5LTget_attribute(c_loc_id,c_name,c_attrname,H5T_NATIVE_LLONG,buf);
+      else
+        goto done;
+    } else if ( HDstrncmp(dtype,"R",1) == 0 ) {
+      if((size_t)*sizeof_val == sizeof(float))
+	ret = H5LTget_attribute(c_loc_id,c_name,c_attrname,H5T_NATIVE_FLOAT,buf);
+      else if((size_t)*sizeof_val == sizeof(double))
+	ret = H5LTget_attribute(c_loc_id,c_name,c_attrname,H5T_NATIVE_DOUBLE,buf);
+#if H5_SIZEOF_LONG_DOUBLE !=0
+      else if((size_t)*sizeof_val == sizeof(long double))
+	ret = H5LTget_attribute(c_loc_id,c_name,c_attrname,H5T_NATIVE_LDOUBLE,buf);
+#endif
+      else
         goto done;
-
-    /*
-    * call H5LTget_attribute_int function.
-    */
-    c_loc_id = (hid_t)*loc_id;
-
-    ret = H5LTget_attribute_double(c_loc_id,c_name,c_attrname,(double *)buf);
-
+    }
+ 
     if (ret < 0)
         goto done;
 
     ret_value = 0;
 
-
 done:
     if(c_name!=NULL)
-        free(c_name);
+        HDfree(c_name);
     if(c_attrname!=NULL)
-        free(c_attrname);
+        HDfree(c_attrname);
 
     return ret_value;
 }
@@ -1667,7 +471,7 @@ done:
 */
 
 int_f
-nh5ltget_attribute_string_c(hid_t_f *loc_id,
+h5ltget_attribute_string_c(hid_t_f *loc_id,
                             size_t_f *namelen,
                             _fcd dsetname,
                             size_t_f *attrnamelen,
@@ -1712,11 +516,11 @@ nh5ltget_attribute_string_c(hid_t_f *loc_id,
 
 done:
     if(c_name!=NULL)
-        free(c_name);
+        HDfree(c_name);
     if(c_attrname!=NULL)
-        free(c_attrname);
+        HDfree(c_attrname);
     if(c_buf!=NULL)
-        free(c_buf);
+        HDfree(c_buf);
 
     return ret_value;
 }
@@ -1742,7 +546,7 @@ done:
 */
 
 int_f
-nh5ltget_dataset_ndims_c(hid_t_f *loc_id,
+h5ltget_dataset_ndims_c(hid_t_f *loc_id,
                          size_t_f *namelen,
                          _fcd name,
                          int_f *rank)
@@ -1776,7 +580,7 @@ nh5ltget_dataset_ndims_c(hid_t_f *loc_id,
 
 done:
     if(c_name!=NULL)
-        free(c_name);
+        HDfree(c_name);
 
     return ret_value;
 }
@@ -1802,7 +606,7 @@ done:
 */
 
 int_f
-nh5ltfind_dataset_c(hid_t_f *loc_id,
+h5ltfind_dataset_c(hid_t_f *loc_id,
                     size_t_f *namelen,
                     _fcd name)
 {
@@ -1824,7 +628,7 @@ nh5ltfind_dataset_c(hid_t_f *loc_id,
     ret = H5LTfind_dataset(c_loc_id, c_name);
 
     if(c_name!=NULL)
-       free(c_name);
+       HDfree(c_name);
 
     return ret;
 
@@ -1850,7 +654,7 @@ nh5ltfind_dataset_c(hid_t_f *loc_id,
 */
 
 int_f
-nh5ltget_dataset_info_c(hid_t_f *loc_id,
+h5ltget_dataset_info_c(hid_t_f *loc_id,
                         size_t_f *namelen,
                         _fcd name,
                         hsize_t_f *dims,
@@ -1904,7 +708,7 @@ nh5ltget_dataset_info_c(hid_t_f *loc_id,
 
 done:
     if(c_name!=NULL)
-        free(c_name);
+        HDfree(c_name);
 
     return ret_value;
 }
@@ -1929,7 +733,7 @@ done:
 */
 
 int_f
-nh5ltget_attribute_ndims_c(hid_t_f *loc_id,
+h5ltget_attribute_ndims_c(hid_t_f *loc_id,
                            size_t_f *namelen,
                            _fcd dsetname,
                            size_t_f *attrnamelen,
@@ -1970,9 +774,9 @@ nh5ltget_attribute_ndims_c(hid_t_f *loc_id,
 
 done:
     if(c_name!=NULL)
-        free(c_name);
+        HDfree(c_name);
     if(c_attrname!=NULL)
-        free(c_attrname);
+        HDfree(c_attrname);
 
     return ret_value;
 }
@@ -1998,7 +802,7 @@ done:
 */
 
 int_f
-nh5ltget_attribute_info_c(hid_t_f *loc_id,
+h5ltget_attribute_info_c(hid_t_f *loc_id,
                           size_t_f *namelen,
                           _fcd name,
                           size_t_f *attrnamelen,
@@ -2059,9 +863,9 @@ nh5ltget_attribute_info_c(hid_t_f *loc_id,
 
 done:
     if(c_name!=NULL)
-        free(c_name);
+        HDfree(c_name);
     if(c_attrname!=NULL)
-        free(c_attrname);
+        HDfree(c_attrname);
 
 
     return ret_value;
@@ -2087,7 +891,7 @@ done:
 */
 
 int_f
-nh5ltpath_valid_c(hid_t_f *loc_id, 
+h5ltpath_valid_c(hid_t_f *loc_id, 
                   _fcd path, 
                   size_t_f *pathlen, 
                   int_f *check_object_valid_c)
@@ -2113,7 +917,7 @@ nh5ltpath_valid_c(hid_t_f *loc_id,
 
 done:
     if(c_path != NULL)
-      free(c_path);
+      HDfree(c_path);
 
     return (int_f)ret;
 }
diff --git a/hl/fortran/src/H5LTff.F90 b/hl/fortran/src/H5LTff.F90
new file mode 100644
index 0000000..d36d92c
--- /dev/null
+++ b/hl/fortran/src/H5LTff.F90
@@ -0,0 +1,1878 @@
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+!
+! This file contains FORTRAN interfaces for H5LT functions
+!
+! NOTES
+!
+!       _____ __  __ _____   ____  _____ _______       _   _ _______
+!      |_   _|  \/  |  __ \ / __ \|  __ \__   __|/\   | \ | |__   __|
+! ****   | | | \  / | |__) | |  | | |__) | | |  /  \  |  \| |  | |    ****
+! ****   | | | |\/| |  ___/| |  | |  _  /  | | / /\ \ | . ` |  | |    ****
+! ****  _| |_| |  | | |    | |__| | | \ \  | |/ ____ \| |\  |  | |    ****
+!      |_____|_|  |_|_|     \____/|_|  \_\ |_/_/    \_\_| \_|  |_|
+!                             
+!  If you add a new function here then you MUST add the function name to the
+!  Windows dll file 'hdf5_hl_fortrandll.def.in' in the hl/fortran/src directory.
+!  This is needed for Windows based operating systems.
+!
+
+#include <H5config_f.inc>
+
+MODULE H5LT_CONST
+  USE, INTRINSIC :: ISO_C_BINDING
+  USE h5fortran_types
+  USE hdf5
+
+  INTERFACE h5ltmake_dataset_f
+     MODULE PROCEDURE h5ltmake_dataset_f_ptr
+  END INTERFACE
+
+  INTERFACE h5ltread_dataset_f
+     MODULE PROCEDURE h5ltread_dataset_f_ptr
+  END INTERFACE
+
+  INTERFACE
+     INTEGER FUNCTION h5ltmake_dataset_c(loc_id,namelen,dset_name,rank,dims,type_id,buf) &
+          BIND(C,NAME='h5ltmake_dataset_c')
+       IMPORT :: C_CHAR, C_PTR
+       IMPORT :: HID_T, SIZE_T, HSIZE_T
+       IMPLICIT NONE
+       INTEGER(hid_t),   INTENT(in) :: loc_id                        ! file or group identifier
+       INTEGER(hid_t),   INTENT(in) :: type_id                       ! datatype identifier
+       INTEGER(size_t) :: namelen                                    ! length of name buffer
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name ! name of the dataset
+       INTEGER,          INTENT(in) :: rank                          ! rank
+       INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims            ! size of the buffer buf
+       TYPE(C_PTR), VALUE :: buf                                     ! data buffer
+     END FUNCTION h5ltmake_dataset_c
+  END INTERFACE
+
+  INTERFACE
+     INTEGER FUNCTION h5ltread_dataset_c(loc_id,namelen,dset_name,type_id,buf) &
+          BIND(C,NAME='h5ltread_dataset_c')
+       IMPORT :: C_CHAR, C_PTR
+       IMPORT :: HID_T, SIZE_T, HSIZE_T
+       IMPLICIT NONE
+       INTEGER(hid_t),   INTENT(in) :: loc_id                        ! file or group identifier
+       INTEGER(hid_t),   INTENT(in) :: type_id                       ! datatype identifier
+       INTEGER(size_t) :: namelen                                    ! length of name buffer
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name ! name of the dataset
+       TYPE(C_PTR), VALUE :: buf                                     ! data buffer
+     END FUNCTION h5ltread_dataset_c
+  END INTERFACE
+
+  INTERFACE
+     INTEGER FUNCTION h5ltset_attribute_c(loc_id,namelen,dset_name,attrlen,attr_name,size,buf,dtype, SizeOf_buf) &
+          BIND(C,NAME='h5ltset_attribute_c')
+       IMPORT :: C_CHAR, C_PTR
+       IMPORT :: HID_T, SIZE_T, HSIZE_T
+       IMPLICIT NONE
+       INTEGER(hid_t),   INTENT(in) :: loc_id                        ! file or group identifier
+       INTEGER(size_t) :: namelen                                    ! length of name buffer
+       INTEGER(size_t) :: attrlen                                    ! length of attr name buffer
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name ! name of the dataset
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: attr_name ! name of the attribute
+       INTEGER(size_t),  INTENT(in) :: size                          ! size of attribute array
+       TYPE(C_PTR), VALUE :: buf                                     ! data buffer
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dtype     ! flag indicating the datatype of the
+                                                                     ! the buffer:
+                                                                     ! R=Real, D=DOUBLE, I=Interger, C=Character
+       INTEGER(size_t) :: SizeOf_buf                                 ! Sizeof the buf datatype
+     END FUNCTION h5ltset_attribute_c
+  END INTERFACE
+
+  INTERFACE
+     INTEGER FUNCTION h5ltget_attribute_c(loc_id,namelen,dset_name,attrlen,attr_name,buf,dtype, SizeOf_buf) &
+          BIND(C,NAME='h5ltget_attribute_c')
+       IMPORT :: C_CHAR, C_PTR
+       IMPORT :: HID_T, SIZE_T, HSIZE_T
+       IMPLICIT NONE
+       INTEGER(hid_t),   INTENT(in) :: loc_id                        ! file or group identifier
+       INTEGER(size_t) :: namelen                                    ! length of name buffer
+       INTEGER(size_t) :: attrlen                                    ! length of attr name buffer
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name ! name of the dataset
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: attr_name ! name of the attribute
+       TYPE(C_PTR), VALUE :: buf                                     ! data buffer
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dtype     ! flag indicating the datatype of the
+                                                                     ! the buffer:
+                                                                     ! R=Real, D=DOUBLE, I=Interger
+       INTEGER(size_t) :: SizeOf_buf                                 ! Sizeof the buf datatype
+     END FUNCTION h5ltget_attribute_c
+  END INTERFACE
+
+CONTAINS
+  !-------------------------------------------------------------------------
+  ! Make/Read dataset functions
+  !-------------------------------------------------------------------------
+
+  !-------------------------------------------------------------------------
+  ! Function(s): h5ltmake_dataset_f_ptr
+  !
+  ! Purpose: Creates and writes a dataset of a type TYPE_ID
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: M. Scot Breitenfeld
+  !
+  ! Date: APR 29, 2015
+  !
+  ! Comments:
+  !
+  ! Modifications: 
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltmake_dataset_f_ptr(loc_id,&
+       dset_name,&
+       rank,&
+       dims,&
+       type_id,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER,          INTENT(in) :: rank               ! rank
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
+    TYPE(C_PTR) :: buf                                 ! data buffer
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                         ! name length
+
+    namelen = LEN(dset_name)
+    errcode = h5ltmake_dataset_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
+
+  END SUBROUTINE h5ltmake_dataset_f_ptr
+
+  !-------------------------------------------------------------------------
+  ! Function(s): h5ltmake_dataset_f_int(1-7)
+  !
+  ! Purpose: Creates and writes a dataset of a type TYPE_ID
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: September 1, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications: Changed to passing C_PTR.
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltmake_dataset_f_int1(loc_id,&
+       dset_name,&
+       rank,&
+       dims,&
+       type_id,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER,          INTENT(in) :: rank               ! rank
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
+    INTEGER, INTENT(in), DIMENSION(*), TARGET :: buf   ! data buffer
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                         ! name length
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1))
+    namelen = LEN(dset_name)
+    errcode = h5ltmake_dataset_c(loc_id,namelen,dset_name,rank,dims,type_id,f_ptr)
+
+  END SUBROUTINE h5ltmake_dataset_f_int1
+
+  SUBROUTINE h5ltmake_dataset_f_int2(loc_id,&
+       dset_name,&
+       rank,&
+       dims,&
+       type_id,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER,          INTENT(in) :: rank               ! rank
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                         ! name length
+    INTEGER, INTENT(in), &
+         DIMENSION(dims(1),dims(2)), TARGET :: buf     ! data buffer
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltmake_dataset_c(loc_id,namelen,dset_name,rank,dims,type_id,f_ptr)
+
+  END SUBROUTINE h5ltmake_dataset_f_int2
+
+  SUBROUTINE h5ltmake_dataset_f_int3(loc_id,&
+       dset_name,&
+       rank,&
+       dims,&
+       type_id,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER,          INTENT(in) :: rank               ! rank
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(in), &
+         DIMENSION(dims(1),dims(2),dims(3)), TARGET :: buf          ! data buffer
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltmake_dataset_c(loc_id,namelen,dset_name,rank,dims,type_id,f_ptr)
+
+  END SUBROUTINE h5ltmake_dataset_f_int3
+
+  SUBROUTINE h5ltmake_dataset_f_int4(loc_id, dset_name, rank, dims, &
+       type_id, buf, errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER,          INTENT(in) :: rank               ! rank
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(in), &
+         DIMENSION(dims(1),dims(2),dims(3),dims(4)), TARGET :: buf  ! data buffer
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltmake_dataset_c(loc_id,namelen,dset_name,rank,dims,type_id,f_ptr)
+
+  END SUBROUTINE h5ltmake_dataset_f_int4
+
+  SUBROUTINE h5ltmake_dataset_f_int5(loc_id, dset_name, rank, dims, &
+       type_id, buf, errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER,          INTENT(in) :: rank               ! rank
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(in), &
+         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)), TARGET :: buf  ! data buffer
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltmake_dataset_c(loc_id,namelen,dset_name,rank,dims,type_id,f_ptr)
+
+  END SUBROUTINE h5ltmake_dataset_f_int5
+
+  SUBROUTINE h5ltmake_dataset_f_int6(loc_id, dset_name, rank, dims, &
+       type_id, buf, errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER,          INTENT(in) :: rank               ! rank
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(in), &
+         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)), TARGET :: buf  ! data buffer
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1,1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltmake_dataset_c(loc_id,namelen,dset_name,rank,dims,type_id,f_ptr)
+
+  END SUBROUTINE h5ltmake_dataset_f_int6
+
+  SUBROUTINE h5ltmake_dataset_f_int7(loc_id, dset_name, rank, dims, &
+       type_id, buf, errcode )
+    
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER,          INTENT(in) :: rank               ! rank
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(in), &
+         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)), TARGET :: buf ! data buffer
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1,1,1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltmake_dataset_c(loc_id,namelen,dset_name,rank,dims,type_id,f_ptr)
+
+  END SUBROUTINE h5ltmake_dataset_f_int7
+
+
+  !-------------------------------------------------------------------------
+  ! Function(s): h5ltread_dataset_f_ptr
+  !
+  ! Purpose: Read a dataset of a type TYPE_ID
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: M. Scot Breitenfeld
+  !
+  ! Date: Apr 29, 2015
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltread_dataset_f_ptr(loc_id,&
+       dset_name,&
+       type_id,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id              ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name           ! name of the dataset
+    INTEGER(hid_t),   INTENT(in) :: type_id             ! datatype identifier
+    TYPE(C_PTR) :: buf                                  ! data buffer
+    INTEGER :: errcode                                  ! error code
+    INTEGER(size_t) :: namelen 
+
+    namelen = LEN(dset_name)
+    errcode = h5ltread_dataset_c(loc_id,namelen,dset_name,type_id, buf)
+
+  END SUBROUTINE h5ltread_dataset_f_ptr
+
+  !-------------------------------------------------------------------------
+  ! Function(s): h5ltread_dataset_f_int(1-7)
+  !
+  ! Purpose: Read a dataset of a type TYPE_ID
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: September 22, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltread_dataset_f_int1(loc_id,&
+       dset_name,&
+       type_id,&
+       buf,&
+       dims,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id              ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name           ! name of the dataset
+    INTEGER(hid_t),   INTENT(in) :: type_id             ! datatype identifier
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims  ! size of the buffer buf
+    INTEGER, INTENT(inout), DIMENSION(*), TARGET :: buf ! data buffer
+    INTEGER :: errcode                                  ! error code
+    INTEGER(size_t) :: namelen            
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltread_dataset_c(loc_id,namelen,dset_name,type_id,f_ptr)
+
+  END SUBROUTINE h5ltread_dataset_f_int1
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltread_dataset_f_int2
+  !
+  ! Purpose: Read a dataset of a type TYPE_ID
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: September 22, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltread_dataset_f_int2(loc_id,&
+       dset_name,&
+       type_id,&
+       buf,&
+       dims,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(inout), &
+         DIMENSION(dims(1),dims(2)), TARGET :: buf                 
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltread_dataset_c(loc_id,namelen,dset_name,type_id,f_ptr)
+
+  END SUBROUTINE h5ltread_dataset_f_int2
+
+  SUBROUTINE h5ltread_dataset_f_int3(loc_id,&
+       dset_name,&
+       type_id,&
+       buf,&
+       dims,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(inout), &
+         DIMENSION(dims(1),dims(2),dims(3)), TARGET :: buf         
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltread_dataset_c(loc_id,namelen,dset_name,type_id,f_ptr)
+
+  END SUBROUTINE h5ltread_dataset_f_int3
+
+  SUBROUTINE h5ltread_dataset_f_int4(loc_id, dset_name, type_id, buf, &
+       dims, errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(inout), &
+         DIMENSION(dims(1),dims(2),dims(3),dims(4)), TARGET :: buf         
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltread_dataset_c(loc_id,namelen,dset_name,type_id,f_ptr)
+
+  END SUBROUTINE h5ltread_dataset_f_int4
+
+  SUBROUTINE h5ltread_dataset_f_int5(loc_id, dset_name, type_id, buf, &
+       dims, errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(inout), &
+         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)), TARGET :: buf         
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltread_dataset_c(loc_id,namelen,dset_name,type_id,f_ptr)
+
+  END SUBROUTINE h5ltread_dataset_f_int5
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltread_dataset_f_int6
+  !
+  ! Purpose: Read a dataset of a type TYPE_ID
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: M. Scot Breitenfeld
+  !
+  ! Date: March 12, 2011
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltread_dataset_f_int6(loc_id, dset_name, type_id, buf, &
+       dims, errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(inout), &
+         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)), TARGET :: buf         
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1,1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltread_dataset_c(loc_id,namelen,dset_name,type_id,f_ptr)
+
+  END SUBROUTINE h5ltread_dataset_f_int6
+
+  SUBROUTINE h5ltread_dataset_f_int7(loc_id, dset_name, type_id, buf, &
+       dims, errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(inout), &
+         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)), TARGET :: buf         
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1,1,1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltread_dataset_c(loc_id,namelen,dset_name,type_id,f_ptr)
+
+  END SUBROUTINE h5ltread_dataset_f_int7
+
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltmake_dataset_int_f_1
+  !
+  ! Purpose: Creates and writes a dataset of H5T_NATIVE_INT type
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: September 22, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltmake_dataset_int_f_1 (loc_id,&
+       dset_name,&
+       rank,&
+       dims,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER,          INTENT(in) :: rank               ! rank
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER, INTENT(in), DIMENSION(*), TARGET :: buf   ! data buffer
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                         ! name length
+    TYPE(C_PTR) :: f_ptr
+    
+    f_ptr = C_LOC(buf(1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltmake_dataset_c(loc_id,namelen,dset_name,rank,dims,h5t_native_integer,f_ptr)
+
+  END SUBROUTINE h5ltmake_dataset_int_f_1
+
+  SUBROUTINE h5ltmake_dataset_int_f_2 (loc_id,&
+       dset_name,&
+       rank,&
+       dims,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER,          INTENT(in) :: rank               ! rank
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(in), &
+         DIMENSION(dims(1),dims(2)), TARGET :: buf                 
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltmake_dataset_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_INTEGER,f_ptr)
+
+  END SUBROUTINE h5ltmake_dataset_int_f_2
+
+  SUBROUTINE h5ltmake_dataset_int_f_3 (loc_id,&
+       dset_name,&
+       rank,&
+       dims,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER,          INTENT(in) :: rank               ! rank
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(in), &
+         DIMENSION(dims(1),dims(2),dims(3)), TARGET :: buf         
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltmake_dataset_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_INTEGER,f_ptr)
+
+  END SUBROUTINE h5ltmake_dataset_int_f_3
+
+  SUBROUTINE h5ltmake_dataset_int_f_4(loc_id, dset_name, rank, dims, &
+       buf, errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER,          INTENT(in) :: rank               ! rank
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(in), &
+         DIMENSION(dims(1),dims(2),dims(3),dims(4)), TARGET :: buf         
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltmake_dataset_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_INTEGER,f_ptr)
+
+  END SUBROUTINE h5ltmake_dataset_int_f_4
+
+  SUBROUTINE h5ltmake_dataset_int_f_5(loc_id, dset_name, rank, dims, &
+       buf, errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER,          INTENT(in) :: rank               ! rank
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(in), &
+         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)), TARGET :: buf         
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltmake_dataset_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_INTEGER,f_ptr)
+
+  END SUBROUTINE h5ltmake_dataset_int_f_5
+
+  SUBROUTINE h5ltmake_dataset_int_f_6(loc_id, dset_name, rank, dims, &
+       buf, errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER,          INTENT(in) :: rank               ! rank
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(in), &
+         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)), TARGET :: buf         
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1,1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltmake_dataset_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_INTEGER,f_ptr)
+
+  END SUBROUTINE h5ltmake_dataset_int_f_6
+
+  SUBROUTINE h5ltmake_dataset_int_f_7(loc_id, dset_name, rank, dims, &
+       buf, errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER,          INTENT(in) :: rank               ! rank
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                         ! name length
+    INTEGER, INTENT(in), &
+         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)), TARGET :: buf         
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1,1,1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltmake_dataset_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_INTEGER,f_ptr)
+
+  END SUBROUTINE h5ltmake_dataset_int_f_7
+
+  !-------------------------------------------------------------------------
+  ! Function(s): h5ltread_dataset_int_f_(1-7)
+  !
+  ! Purpose: Read a dataset
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: September 22, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltread_dataset_int_f_1(loc_id,&
+       dset_name,&
+       buf,&
+       dims,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(HID_T),   INTENT(IN) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(inout), &
+         DIMENSION(dims(1)), TARGET :: buf                         
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltread_dataset_c(loc_id,namelen,dset_name,H5T_NATIVE_INTEGER,f_ptr)
+
+  END SUBROUTINE h5ltread_dataset_int_f_1
+
+  SUBROUTINE h5ltread_dataset_int_f_2(loc_id,&
+       dset_name,&
+       buf,&
+       dims,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(inout), &
+         DIMENSION(dims(1),dims(2)), TARGET :: buf                 
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltread_dataset_c(loc_id,namelen,dset_name,H5T_NATIVE_INTEGER,f_ptr)
+
+  END SUBROUTINE h5ltread_dataset_int_f_2
+
+  SUBROUTINE h5ltread_dataset_int_f_3(loc_id,&
+       dset_name,&
+       buf,&
+       dims,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(inout), &
+         DIMENSION(dims(1),dims(2),dims(3)), TARGET :: buf         
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltread_dataset_c(loc_id,namelen,dset_name,H5T_NATIVE_INTEGER,f_ptr)
+
+  END SUBROUTINE h5ltread_dataset_int_f_3
+
+  SUBROUTINE h5ltread_dataset_int_f_4(loc_id, dset_name, buf, dims, errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(inout), &
+         DIMENSION(dims(1),dims(2),dims(3),dims(4)), TARGET :: buf         
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltread_dataset_c(loc_id,namelen,dset_name,H5T_NATIVE_INTEGER,f_ptr)
+
+  END SUBROUTINE h5ltread_dataset_int_f_4
+
+  SUBROUTINE h5ltread_dataset_int_f_5(loc_id, dset_name, buf, dims, errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(inout), &
+         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)), TARGET :: buf         
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltread_dataset_c(loc_id,namelen,dset_name,H5T_NATIVE_INTEGER,f_ptr)
+
+  END SUBROUTINE h5ltread_dataset_int_f_5
+
+  SUBROUTINE h5ltread_dataset_int_f_6(loc_id, dset_name, buf, dims, errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(inout), &
+         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)), TARGET :: buf         
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1,1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltread_dataset_c(loc_id,namelen,dset_name,H5T_NATIVE_INTEGER,f_ptr)
+
+  END SUBROUTINE h5ltread_dataset_int_f_6
+
+  SUBROUTINE h5ltread_dataset_int_f_7(loc_id, dset_name, buf, dims, errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER, INTENT(inout), &
+         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)), TARGET :: buf         
+    TYPE(C_PTR) :: f_ptr
+
+    f_ptr = C_LOC(buf(1,1,1,1,1,1,1))
+
+    namelen = LEN(dset_name)
+    errcode = h5ltread_dataset_c(loc_id,namelen,dset_name,H5T_NATIVE_INTEGER,f_ptr)
+
+  END SUBROUTINE h5ltread_dataset_int_f_7
+
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltmake_dataset_string_f
+  !
+  ! Purpose: Creates and writes a dataset
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: September 22, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltmake_dataset_string_f(loc_id,&
+       dset_name,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: buf                ! data buffer
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                         ! name length
+    INTEGER(size_t) :: buflen                          ! buffer length
+
+    INTERFACE
+       INTEGER FUNCTION h5ltmake_dataset_string_c(loc_id,namelen,dset_name,buflen,buf) &
+            BIND(C,NAME='h5ltmake_dataset_string_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id                          ! file or group identifier
+         INTEGER(size_t) :: namelen                                      ! length of name buffer
+         INTEGER(size_t) :: buflen                                       ! length of data buffer
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name   ! name of the dataset
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: buf         ! data buffer
+       END FUNCTION h5ltmake_dataset_string_c
+    END INTERFACE
+
+    namelen = LEN(dset_name)
+    buflen = LEN(buf)
+    errcode = h5ltmake_dataset_string_c(loc_id,namelen,dset_name,buflen,buf)
+
+  END SUBROUTINE h5ltmake_dataset_string_f
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltread_dataset_string_f
+  !
+  ! Purpose: Read a dataset
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: September 22, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltread_dataset_string_f(loc_id,&
+       dset_name,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    CHARACTER(LEN=*), INTENT(inout) :: buf             ! data buffer
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                         ! name length
+
+    INTERFACE
+       INTEGER FUNCTION h5ltread_dataset_string_c(loc_id,namelen,dset_name,buf) &
+            BIND(C,NAME='h5ltread_dataset_string_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
+         INTEGER(size_t) :: namelen                                       ! length of name buffer
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in)    :: dset_name ! name of the dataset
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(inout) :: buf       ! data buffer
+       END FUNCTION h5ltread_dataset_string_c
+    END INTERFACE
+
+    namelen = LEN(dset_name)
+    errcode = h5ltread_dataset_string_c(loc_id,namelen,dset_name,buf)
+
+  END SUBROUTINE h5ltread_dataset_string_f
+
+  !-------------------------------------------------------------------------
+  ! Make/Read attribute functions
+  !-------------------------------------------------------------------------
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltset_attribute_f
+  !
+  ! Purpose: Create and write an attribute
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: M. Scot Breitenfeld
+  !
+  ! Date: May 4, 2015
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltset_attribute_f(loc_id,&
+       dset_name,&
+       attr_name,&
+       buf,&
+       buf_type, SizeOf_buf_type, &
+       size,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: attr_name          ! name of the attribute
+    TYPE(C_PTR) :: buf                                 ! data buffer
+    CHARACTER(LEN=*), INTENT(in) :: buf_type           !
+    INTEGER(size_t),  INTENT(in) :: size               ! size of attribute array
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER(size_t) :: attrlen                                 ! name length 
+
+    CHARACTER(KIND=C_CHAR) :: buf_type_uppercase  
+    INTEGER(size_t) :: SizeOf_buf_type
+
+    namelen = LEN(dset_name)
+    attrlen = LEN(attr_name)
+
+    buf_type_uppercase(1:1) = buf_type(1:1)
+    IF(buf_type_uppercase(1:1).EQ.'i')THEN
+       buf_type_uppercase(1:1) = 'I'
+    ELSE IF(buf_type_uppercase(1:1).EQ.'r')THEN
+       buf_type_uppercase(1:1) = 'R'
+    ELSE IF(buf_type_uppercase(1:1).EQ.'c')THEN
+       buf_type_uppercase(1:1) = 'C'
+    ENDIF
+
+    errcode = h5ltset_attribute_c(loc_id,namelen,dset_name,attrlen,attr_name,size,&
+         buf,buf_type_uppercase(1:1)//C_NULL_CHAR, SizeOf_buf_type)
+
+  END SUBROUTINE h5ltset_attribute_f
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltset_attribute_int_f
+  !
+  ! Purpose: Create and write an attribute
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: October 05, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltset_attribute_int_f(loc_id,&
+       dset_name,&
+       attr_name,&
+       buf,&
+       size,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: attr_name          ! name of the attribute
+    INTEGER(size_t),  INTENT(in) :: size               ! size of attribute array
+    INTEGER :: errcode                                 ! error code
+    INTEGER, DIMENSION(*), TARGET :: buf   ! data buffer
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER(size_t) :: attrlen                                 ! name length          
+    TYPE(C_PTR) :: f_ptr
+    INTEGER(size_t) :: SizeOf_buf_type
+
+    f_ptr = C_LOC(buf(1:1))
+
+#if H5_FORTRAN_HAVE_STORAGE_SIZE!=0
+    SizeOf_buf_type = STORAGE_SIZE(buf(1), c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)
+#else
+    SizeOf_buf_type = SIZEOF(buf(1))
+#endif
+
+    namelen = LEN(dset_name)
+    attrlen = LEN(attr_name)
+    errcode = h5ltset_attribute_c(loc_id,namelen,dset_name,attrlen,attr_name,size,&
+         f_ptr,'I'//C_NULL_CHAR,SizeOf_buf_type)
+
+  END SUBROUTINE h5ltset_attribute_int_f
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltset_attribute_float_f
+  !
+  ! Purpose: Create and write an attribute
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: October 05, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltset_attribute_float_f(loc_id,&
+       dset_name,&
+       attr_name,&
+       buf,&
+       size,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: attr_name          ! name of the attribute
+    INTEGER(size_t),  INTENT(in) :: size               ! size of attribute array
+    INTEGER :: errcode                                 ! error code
+    REAL(KIND=C_FLOAT), INTENT(in), DIMENSION(*), TARGET :: buf ! data buffer
+    INTEGER(size_t) :: namelen                         ! name length
+    INTEGER(size_t) :: attrlen                         ! name length             
+    TYPE(C_PTR) :: f_ptr
+    INTEGER(size_t) :: SizeOf_buf_type
+
+    f_ptr = C_LOC(buf(1))
+#if H5_FORTRAN_HAVE_STORAGE_SIZE!=0
+    SizeOf_buf_type = STORAGE_SIZE(buf(1), c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)
+#else
+    SizeOf_buf_type = SIZEOF(buf(1))
+#endif
+
+    namelen = LEN(dset_name)
+    attrlen = LEN(attr_name)
+    errcode = h5ltset_attribute_c(loc_id,namelen,dset_name,attrlen,attr_name,size,&
+         f_ptr,'R'//C_NULL_CHAR, SizeOf_buf_type)
+
+  END SUBROUTINE h5ltset_attribute_float_f
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltset_attribute_double_f
+  !
+  ! Purpose: Create and write an attribute
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: October 05, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltset_attribute_double_f(loc_id,&
+       dset_name,&
+       attr_name,&
+       buf,&
+       size,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: attr_name          ! name of the attribute
+    INTEGER(size_t),  INTENT(in) :: size               ! size of attribute array
+    INTEGER :: errcode                                 ! error code
+    REAL(KIND=C_DOUBLE), INTENT(in), DIMENSION(*), TARGET :: buf  ! data buffer
+    INTEGER(size_t) :: namelen                         ! name length
+    INTEGER(size_t) :: attrlen                         ! name length
+    TYPE(C_PTR) :: f_ptr
+    INTEGER(size_t) :: SizeOf_buf_type
+
+    f_ptr = C_LOC(buf(1)) 
+
+#if H5_FORTRAN_HAVE_STORAGE_SIZE!=0
+    SizeOf_buf_type = STORAGE_SIZE(buf(1), c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)
+#else
+    SizeOf_buf_type = SIZEOF(buf(1))
+#endif
+
+    namelen = LEN(dset_name)
+    attrlen = LEN(attr_name)
+    errcode = h5ltset_attribute_c(loc_id,namelen,dset_name,attrlen,attr_name,size,&
+         f_ptr,'R'//C_NULL_CHAR,SizeOf_buf_type)
+
+  END SUBROUTINE h5ltset_attribute_double_f
+
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltset_attribute_string_f
+  !
+  ! Purpose: Create and write an attribute
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: October 05, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltset_attribute_string_f(loc_id,&
+       dset_name,&
+       attr_name,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: attr_name          ! name of the attribute
+    INTEGER :: errcode                                 ! error code
+    CHARACTER(LEN=*), DIMENSION(*), INTENT(in), TARGET :: buf    ! data buffer
+    INTEGER(size_t) :: namelen                         ! name length
+    INTEGER(size_t) :: attrlen                         ! name length
+    INTEGER(size_t) :: buflen                          ! data buffer length           
+    TYPE(C_PTR) :: f_ptr
+    INTEGER(size_t) :: SizeOf_buf_type
+
+    f_ptr = C_LOC(buf(1)(1:1))
+
+#if H5_FORTRAN_HAVE_STORAGE_SIZE!=0
+    SizeOf_buf_type = STORAGE_SIZE(buf(1)(1:1), c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)
+#else
+    SizeOf_buf_type = SIZEOF(buf(1:1)(1:1))
+#endif
+
+    namelen = LEN(dset_name)
+    attrlen = LEN(attr_name)
+    buflen = LEN(buf)
+    errcode = h5ltset_attribute_c(loc_id,namelen,dset_name,attrlen,attr_name,buflen,&
+         f_ptr,'C'//C_NULL_CHAR, SizeOf_buf_type)
+
+  END SUBROUTINE h5ltset_attribute_string_f
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltget_attribute_f
+  !
+  ! Purpose: Reads an attribute named ATTR_NAME
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: M. Scot Breitenfeld
+  !
+  ! Date: Apr 29, 2015
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltget_attribute_f(loc_id,&
+       dset_name,&
+       attr_name,&
+       buf, buf_type, SizeOf_buf_type, &
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: attr_name          ! name of the attribute
+    INTEGER, INTENT(out) :: errcode                    ! error code
+    CHARACTER(LEN=*), INTENT(in) :: buf_type
+    TYPE(C_PTR) :: buf! data buffer
+    INTEGER(size_t) :: namelen                         ! name length
+    INTEGER(size_t) :: attrlen                         ! name length
+    CHARACTER(KIND=C_CHAR) :: buf_type_uppercase
+    INTEGER(size_t) :: SizeOf_buf_type
+
+    namelen = LEN(dset_name)
+    attrlen = LEN(attr_name)
+
+    buf_type_uppercase(1:1) = buf_type(1:1)
+    IF(buf_type_uppercase(1:1).EQ.'i')THEN
+       buf_type_uppercase(1:1) = 'I'
+    ELSE IF(buf_type_uppercase(1:1).EQ.'r')THEN
+       buf_type_uppercase(1:1) = 'R'
+    ELSE IF(buf_type_uppercase(1:1).EQ.'c')THEN
+       buf_type_uppercase(1:1) = 'C'
+    ENDIF
+    errcode = h5ltget_attribute_c(loc_id,namelen,dset_name,attrlen,attr_name, &
+         buf, buf_type_uppercase//C_NULL_CHAR, SizeOf_buf_type)
+
+
+  END SUBROUTINE h5ltget_attribute_f
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltget_attribute_int_f
+  !
+  ! Purpose: Reads an attribute named ATTR_NAME
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: October 05, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltget_attribute_int_f(loc_id,&
+       dset_name,&
+       attr_name,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: attr_name          ! name of the attribute
+    INTEGER :: errcode                                 ! error code
+    INTEGER, INTENT(inout), DIMENSION(*), TARGET :: buf! data buffer
+    INTEGER(size_t) :: namelen                         ! name length
+    INTEGER(size_t) :: attrlen                         ! name length       
+    TYPE(C_PTR) :: f_ptr
+    INTEGER(size_t) :: SizeOf_buf
+
+    f_ptr = C_LOC(buf(1))   
+
+#if H5_FORTRAN_HAVE_STORAGE_SIZE!=0
+    SizeOf_buf = STORAGE_SIZE(buf(1), c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)
+#else
+    SizeOf_buf = SIZEOF(buf(1))
+#endif
+    namelen = LEN(dset_name)
+    attrlen = LEN(attr_name)
+    errcode = h5ltget_attribute_c(loc_id,namelen,dset_name,attrlen,attr_name,f_ptr,'I'//C_NULL_CHAR, SizeOf_buf)
+
+  END SUBROUTINE h5ltget_attribute_int_f
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltget_attribute_float_f
+  !
+  ! Purpose: Reads an attribute named ATTR_NAME
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: October 05, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltget_attribute_float_f(loc_id,&
+       dset_name,&
+       attr_name,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: attr_name          ! name of the attribute
+    INTEGER :: errcode                                 ! error code
+    REAL(KIND=C_FLOAT), INTENT(inout), DIMENSION(*), TARGET :: buf
+    INTEGER(size_t) :: namelen                         ! name length
+    INTEGER(size_t) :: attrlen                         ! name length          
+    TYPE(C_PTR) :: f_ptr
+    INTEGER(size_t) :: SizeOf_buf
+
+    f_ptr = C_LOC(buf(1))
+#if H5_FORTRAN_HAVE_STORAGE_SIZE!=0
+    SizeOf_buf = STORAGE_SIZE(buf(1), c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)
+#else
+    SizeOf_buf = SIZEOF(buf(1))
+#endif
+    namelen = LEN(dset_name)
+    attrlen = LEN(attr_name)
+    errcode = h5ltget_attribute_c(loc_id,namelen,dset_name,attrlen,attr_name,f_ptr,'R'//C_NULL_CHAR, SizeOf_buf)
+
+  END SUBROUTINE h5ltget_attribute_float_f
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltget_attribute_c_double_f
+  !
+  ! Purpose: Reads an attribute named ATTR_NAME
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: October 05, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltget_attribute_double_f(loc_id,&
+       dset_name,&
+       attr_name,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: attr_name          ! name of the attribute
+    INTEGER :: errcode                                 ! error code
+    REAL(KIND=C_DOUBLE),INTENT(inout),DIMENSION(*), TARGET :: buf
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER(size_t) :: attrlen                                 ! name length
+    TYPE(C_PTR) :: f_ptr
+    INTEGER(size_t) :: SizeOf_buf
+
+    f_ptr = C_LOC(buf(1))   
+#if H5_FORTRAN_HAVE_STORAGE_SIZE!=0
+    SizeOf_buf = STORAGE_SIZE(buf(1), c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)
+#else
+    SizeOf_buf = SIZEOF(buf(1))
+#endif
+
+    namelen = LEN(dset_name)
+    attrlen = LEN(attr_name)
+    errcode = h5ltget_attribute_c(loc_id,namelen,dset_name,attrlen,attr_name,f_ptr,'R'//C_NULL_CHAR, SizeOf_buf)
+
+  END SUBROUTINE h5ltget_attribute_double_f
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltget_attribute_string_f
+  !
+  ! Purpose: Reads an attribute named ATTR_NAME
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: October 05, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltget_attribute_string_f(loc_id,&
+       dset_name,&
+       attr_name,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: attr_name          ! name of the attribute
+    INTEGER :: errcode                                 ! error code
+    CHARACTER(LEN=*), INTENT(inout) :: buf
+    INTEGER(size_t) :: namelen                         ! name length
+    INTEGER(size_t) :: attrlen                         ! name length
+    INTEGER(size_t) :: buf_size                        ! buf size 
+
+   INTERFACE
+       INTEGER FUNCTION h5ltget_attribute_string_c(loc_id,namelen,dset_name,attrlen,attr_name,buf,buf_size) &
+            BIND(C,NAME='h5ltget_attribute_string_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
+         INTEGER(size_t) :: namelen                                      ! length of name buffer
+         INTEGER(size_t) :: attrlen                                      ! length of attr name buffer
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name               ! name of the dataset
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: attr_name               ! name of the attribute
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(inout) :: buf                  ! data buffer
+         INTEGER(size_t) :: buf_size                 ! data buffer size
+       END FUNCTION h5ltget_attribute_string_c
+    END INTERFACE
+
+    namelen  = LEN(dset_name)
+    attrlen  = LEN(attr_name)
+    buf_size = LEN(buf)
+
+    errcode = h5ltget_attribute_string_c(loc_id,namelen,dset_name,attrlen,attr_name,buf,buf_size)
+
+  END SUBROUTINE h5ltget_attribute_string_f
+
+  !-------------------------------------------------------------------------
+  ! Query dataset functions
+  !-------------------------------------------------------------------------
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltget_dataset_ndims_f
+  !
+  ! Purpose: Gets the dimensionality of a dataset
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: September 30, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltget_dataset_ndims_f(loc_id,&
+       dset_name,&
+       rank,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER,          INTENT(inout) :: rank            ! rank
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+
+    INTERFACE
+       INTEGER FUNCTION h5ltget_dataset_ndims_c(loc_id,namelen,dset_name,rank) &
+            BIND(C,NAME='h5ltget_dataset_ndims_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
+         INTEGER(size_t) :: namelen                                      ! length of name buffer
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name               ! name of the dataset
+         INTEGER,          INTENT(inout) :: rank                 ! rank
+       END FUNCTION h5ltget_dataset_ndims_c
+    END INTERFACE
+
+    namelen = LEN(dset_name)
+    errcode = h5ltget_dataset_ndims_c(loc_id,namelen,dset_name,rank)
+
+  END SUBROUTINE h5ltget_dataset_ndims_f
+
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltfind_dataset_f
+  !
+  ! Purpose: Inquires if a dataset named dset_name exists attached
+  !           to the object loc_id.
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: October 05, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  INTEGER FUNCTION h5ltfind_dataset_f(loc_id,&
+       dset_name)
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+
+    INTERFACE
+       INTEGER FUNCTION h5ltfind_dataset_c(loc_id,namelen,dset_name) &
+            BIND(C,NAME='h5ltfind_dataset_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
+         INTEGER(size_t) :: namelen                                      ! length of name buffer
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name               ! name of the dataset
+       END FUNCTION h5ltfind_dataset_c
+    END INTERFACE
+
+    namelen = LEN(dset_name)
+    errcode = h5ltfind_dataset_c(loc_id,namelen,dset_name)
+    h5ltfind_dataset_f = errcode
+
+  END FUNCTION h5ltfind_dataset_f
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltget_dataset_info_f
+  !
+  ! Purpose: Gets information about a dataset
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: September 30, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltget_dataset_info_f(loc_id,&
+       dset_name,&
+       dims,&
+       type_class,&
+       type_size,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER(hsize_t),DIMENSION(*),INTENT(inout):: dims ! dimensions
+    INTEGER, INTENT(inout)         :: type_class       ! type class
+    INTEGER(size_t), INTENT(inout) :: type_size        ! type size
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+
+    INTERFACE
+       INTEGER FUNCTION h5ltget_dataset_info_c(loc_id,namelen,dset_name,dims,type_class,type_size) &
+            BIND(C,NAME='h5ltget_dataset_info_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
+         INTEGER(size_t) :: namelen                                      ! length of name buffer
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name               ! name of the dataset
+         INTEGER(hsize_t),DIMENSION(*),INTENT(inout):: dims      ! dimensions
+         INTEGER, INTENT(inout)         :: type_class            ! type class
+         INTEGER(size_t), INTENT(inout) :: type_size             ! type size
+       END FUNCTION h5ltget_dataset_info_c
+    END INTERFACE
+
+    namelen = LEN(dset_name)
+    errcode = h5ltget_dataset_info_c(loc_id,namelen,dset_name,dims,type_class,type_size)
+
+  END SUBROUTINE h5ltget_dataset_info_f
+
+
+  !-------------------------------------------------------------------------
+  ! Query attribute functions
+  !-------------------------------------------------------------------------
+
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltget_attribute_ndims_f
+  !
+  ! Purpose: Create and write an attribute
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: October 05, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltget_attribute_ndims_f(loc_id,&
+       dset_name,&
+       attr_name,&
+       rank,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: attr_name          ! name of the attribute
+    INTEGER,          INTENT(inout) :: rank            ! rank
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                                 ! name length
+    INTEGER(size_t) :: attrlen                                 ! name length
+
+    INTERFACE
+       INTEGER FUNCTION h5ltget_attribute_ndims_c(loc_id,namelen,dset_name,attrlen,attr_name,rank) &
+            BIND(C,NAME='h5ltget_attribute_ndims_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
+         INTEGER(size_t) :: namelen                                      ! length of name buffer
+         INTEGER(size_t) :: attrlen                                      ! length of attr name buffer
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name               ! name of the dataset
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: attr_name               ! name of the attribute
+         INTEGER,          INTENT(inout) :: rank                 ! rank
+       END FUNCTION h5ltget_attribute_ndims_c
+    END INTERFACE
+
+    namelen = LEN(dset_name)
+    attrlen = LEN(attr_name)
+    errcode = h5ltget_attribute_ndims_c(loc_id,namelen,dset_name,attrlen,attr_name,rank)
+
+  END SUBROUTINE h5ltget_attribute_ndims_f
+
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltget_attribute_info_f
+  !
+  ! Purpose: Gets information about an attribute
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: pvn at ncsa.uiuc.edu
+  !
+  ! Date: September 30, 2004
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltget_attribute_info_f(loc_id,&
+       dset_name,&
+       attr_name,&
+       dims,&
+       type_class,&
+       type_size,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: attr_name          ! name of the attribute
+    INTEGER(hsize_t),DIMENSION(*),INTENT(inout):: dims ! dimensions
+    INTEGER, INTENT(inout)         :: type_class       ! type class
+    INTEGER(size_t), INTENT(inout) :: type_size        ! type size
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                         ! name length
+    INTEGER(size_t) :: attrlen                                 ! name length
+
+    INTERFACE
+       INTEGER FUNCTION h5ltget_attribute_info_c(loc_id,namelen,dset_name,attrlen,attr_name,dims,type_class,type_size) &
+            BIND(C,NAME='h5ltget_attribute_info_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
+         INTEGER(size_t) :: namelen                              ! length of name buffer
+         INTEGER(size_t) :: attrlen                                      ! length of attr name buffer
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name               ! name of the dataset
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: attr_name               ! name of the attribute
+         INTEGER(hsize_t),DIMENSION(*),INTENT(inout):: dims      ! dimensions
+         INTEGER, INTENT(inout)         :: type_class            ! type class
+         INTEGER(size_t), INTENT(inout) :: type_size             ! type size
+       END FUNCTION h5ltget_attribute_info_c
+    END INTERFACE
+
+    namelen = LEN(dset_name)
+    attrlen = LEN(attr_name)
+    errcode = h5ltget_attribute_info_c(loc_id,namelen,dset_name,attrlen,attr_name,dims,type_class,type_size)
+
+  END SUBROUTINE h5ltget_attribute_info_f
+
+  !-------------------------------------------------------------------------
+  ! Function: h5ltpath_valid_f
+  !
+  ! Purpose: Validates a path 
+  !
+  ! Return: Success: 0, Failure: -1
+  !
+  ! Programmer: M. Scot Breitenfeld
+  !
+  ! Date: February 18, 2012
+  !
+  ! Comments:
+  !
+  ! Modifications:
+  !
+  !-------------------------------------------------------------------------
+
+  SUBROUTINE h5ltpath_valid_f(loc_id, path, check_object_valid, path_valid, errcode)
+
+    IMPLICIT NONE
+    INTEGER(hid_t)  , INTENT(IN)  :: loc_id              ! An identifier of an object in the file.
+    CHARACTER(LEN=*), INTENT(IN)  :: path                ! Path to the object to check, relative to loc_id.
+    LOGICAL         , INTENT(IN)  :: check_object_valid  ! Indicates whether to check if the final component 
+                                                         !  of the path resolves to a valid object 
+    LOGICAL         , INTENT(OUT) :: path_valid          ! Object status
+    INTEGER         , INTENT(OUT) :: errcode             ! Error code: 0 on success and -1 on failure
+
+    INTEGER(size_t) :: pathlen
+    INTEGER :: check_object_valid_c
+    INTEGER :: status
+
+    INTERFACE
+       INTEGER FUNCTION h5ltpath_valid_c(loc_id, path, pathlen, check_object_valid_c) &
+            BIND(C,NAME='h5ltpath_valid_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id  
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: path
+         INTEGER(size_t) :: pathlen
+         INTEGER :: check_object_valid_c
+       END FUNCTION h5ltpath_valid_c
+    END INTERFACE
+
+    ! Initialize
+    path_valid = .FALSE.
+    errcode = 0
+    
+    check_object_valid_c = 0
+    IF(check_object_valid) check_object_valid_c = 1
+
+    pathlen = LEN(path)
+    status = h5ltpath_valid_c(loc_id, path, pathlen, check_object_valid_c)
+
+    IF(status.EQ.1)THEN
+       path_valid = .TRUE.
+    ELSE IF(status.LT.0)THEN
+       errcode = -1
+    ENDIF
+    
+  END SUBROUTINE h5ltpath_valid_f
+
+END MODULE H5LT_CONST
+
+
+
+
+
+
diff --git a/hl/fortran/src/H5LTff.f90 b/hl/fortran/src/H5LTff.f90
deleted file mode 100644
index 9393f7f..0000000
--- a/hl/fortran/src/H5LTff.f90
+++ /dev/null
@@ -1,6490 +0,0 @@
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!
-! This file contains FORTRAN90 interfaces for H5LT functions
-!
-
-MODULE h5lt
-  USE h5fortran_types
-  USE hdf5
-
-  INTERFACE h5ltmake_dataset_f
-     MODULE PROCEDURE h5ltmake_dataset_f_int1
-     MODULE PROCEDURE h5ltmake_dataset_f_int2
-     MODULE PROCEDURE h5ltmake_dataset_f_int3
-     MODULE PROCEDURE h5ltmake_dataset_f_int4
-     MODULE PROCEDURE h5ltmake_dataset_f_int5
-     MODULE PROCEDURE h5ltmake_dataset_f_int6
-     MODULE PROCEDURE h5ltmake_dataset_f_int7
-     MODULE PROCEDURE h5ltmake_dataset_f_float1
-     MODULE PROCEDURE h5ltmake_dataset_f_float2
-     MODULE PROCEDURE h5ltmake_dataset_f_float3
-     MODULE PROCEDURE h5ltmake_dataset_f_float4
-     MODULE PROCEDURE h5ltmake_dataset_f_float5
-     MODULE PROCEDURE h5ltmake_dataset_f_float6
-     MODULE PROCEDURE h5ltmake_dataset_f_float7
-     MODULE PROCEDURE h5ltmake_dataset_f_double1
-     MODULE PROCEDURE h5ltmake_dataset_f_double2
-     MODULE PROCEDURE h5ltmake_dataset_f_double3
-     MODULE PROCEDURE h5ltmake_dataset_f_double4
-     MODULE PROCEDURE h5ltmake_dataset_f_double5
-     MODULE PROCEDURE h5ltmake_dataset_f_double6
-     MODULE PROCEDURE h5ltmake_dataset_f_double7
-  END INTERFACE
-
-  INTERFACE h5ltread_dataset_f
-     MODULE PROCEDURE h5ltread_dataset_f_int1
-     MODULE PROCEDURE h5ltread_dataset_f_int2
-     MODULE PROCEDURE h5ltread_dataset_f_int3
-     MODULE PROCEDURE h5ltread_dataset_f_int4
-     MODULE PROCEDURE h5ltread_dataset_f_int5
-     MODULE PROCEDURE h5ltread_dataset_f_int6
-     MODULE PROCEDURE h5ltread_dataset_f_int7
-     MODULE PROCEDURE h5ltread_dataset_f_float1
-     MODULE PROCEDURE h5ltread_dataset_f_float2
-     MODULE PROCEDURE h5ltread_dataset_f_float3
-     MODULE PROCEDURE h5ltread_dataset_f_float4
-     MODULE PROCEDURE h5ltread_dataset_f_float5
-     MODULE PROCEDURE h5ltread_dataset_f_float6
-     MODULE PROCEDURE h5ltread_dataset_f_float7
-     MODULE PROCEDURE h5ltread_dataset_f_double1
-     MODULE PROCEDURE h5ltread_dataset_f_double2
-     MODULE PROCEDURE h5ltread_dataset_f_double3
-     MODULE PROCEDURE h5ltread_dataset_f_double4
-     MODULE PROCEDURE h5ltread_dataset_f_double5
-     MODULE PROCEDURE h5ltread_dataset_f_double6
-     MODULE PROCEDURE h5ltread_dataset_f_double7
-  END INTERFACE
-
-  INTERFACE h5ltmake_dataset_int_f
-     MODULE PROCEDURE h5ltmake_dataset_int_f_1
-     MODULE PROCEDURE h5ltmake_dataset_int_f_2
-     MODULE PROCEDURE h5ltmake_dataset_int_f_3
-     MODULE PROCEDURE h5ltmake_dataset_int_f_4
-     MODULE PROCEDURE h5ltmake_dataset_int_f_5
-     MODULE PROCEDURE h5ltmake_dataset_int_f_6
-     MODULE PROCEDURE h5ltmake_dataset_int_f_7
-  END INTERFACE
-
-  INTERFACE h5ltmake_dataset_float_f
-     MODULE PROCEDURE h5ltmake_dataset_float_f_1
-     MODULE PROCEDURE h5ltmake_dataset_float_f_2
-     MODULE PROCEDURE h5ltmake_dataset_float_f_3
-     MODULE PROCEDURE h5ltmake_dataset_float_f_4
-     MODULE PROCEDURE h5ltmake_dataset_float_f_5
-     MODULE PROCEDURE h5ltmake_dataset_float_f_6
-     MODULE PROCEDURE h5ltmake_dataset_float_f_7
-  END INTERFACE
-
-  INTERFACE h5ltmake_dataset_double_f
-     MODULE PROCEDURE h5ltmake_dataset_double_f_1
-     MODULE PROCEDURE h5ltmake_dataset_double_f_2
-     MODULE PROCEDURE h5ltmake_dataset_double_f_3
-     MODULE PROCEDURE h5ltmake_dataset_double_f_4
-     MODULE PROCEDURE h5ltmake_dataset_double_f_5
-     MODULE PROCEDURE h5ltmake_dataset_double_f_6
-     MODULE PROCEDURE h5ltmake_dataset_double_f_7
-  END INTERFACE
-
-  INTERFACE h5ltread_dataset_int_f
-     MODULE PROCEDURE h5ltread_dataset_int_f_1
-     MODULE PROCEDURE h5ltread_dataset_int_f_2
-     MODULE PROCEDURE h5ltread_dataset_int_f_3
-     MODULE PROCEDURE h5ltread_dataset_int_f_4
-     MODULE PROCEDURE h5ltread_dataset_int_f_5
-     MODULE PROCEDURE h5ltread_dataset_int_f_6
-     MODULE PROCEDURE h5ltread_dataset_int_f_7
-  END INTERFACE
-
-  INTERFACE h5ltread_dataset_float_f
-     MODULE PROCEDURE h5ltread_dataset_float_f_1
-     MODULE PROCEDURE h5ltread_dataset_float_f_2
-     MODULE PROCEDURE h5ltread_dataset_float_f_3
-     MODULE PROCEDURE h5ltread_dataset_float_f_4
-     MODULE PROCEDURE h5ltread_dataset_float_f_5
-     MODULE PROCEDURE h5ltread_dataset_float_f_6
-     MODULE PROCEDURE h5ltread_dataset_float_f_7
-  END INTERFACE
-
-  INTERFACE h5ltread_dataset_double_f
-     MODULE PROCEDURE h5ltread_dataset_double_f_1
-     MODULE PROCEDURE h5ltread_dataset_double_f_2
-     MODULE PROCEDURE h5ltread_dataset_double_f_3
-     MODULE PROCEDURE h5ltread_dataset_double_f_4
-     MODULE PROCEDURE h5ltread_dataset_double_f_5
-     MODULE PROCEDURE h5ltread_dataset_double_f_6
-     MODULE PROCEDURE h5ltread_dataset_double_f_7
-  END INTERFACE
-
-CONTAINS
-  !-------------------------------------------------------------------------
-  ! Make/Read dataset functions
-  !-------------------------------------------------------------------------
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_int1
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 1, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_int1(loc_id,&
-       dset_name,&
-       rank,&
-       dims,&
-       type_id,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_int1
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER, INTENT(in), DIMENSION(*) :: buf           ! data buffer
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                         ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_int1_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_INT1_C'::h5ltmake_dataset_int1_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), DIMENSION(*) :: buf                ! data buffer
-       END FUNCTION h5ltmake_dataset_int1_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_int1_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_int1
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_int2
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 1, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_int2(loc_id,&
-       dset_name,&
-       rank,&
-       dims,&
-       type_id,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_int2
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(in), &
-         DIMENSION(dims(1),dims(2)) :: buf                  ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_int2_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_INT2_C'::h5ltmake_dataset_int2_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                              ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), &
-              DIMENSION(dims(1),dims(2)) :: buf                       ! data buffer
-       END FUNCTION h5ltmake_dataset_int2_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_int2_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_int2
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_int3
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 1, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_int3(loc_id,&
-       dset_name,&
-       rank,&
-       dims,&
-       type_id,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_int3
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_int3_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_INT3_C'::h5ltmake_dataset_int3_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf               ! data buffer
-       END FUNCTION h5ltmake_dataset_int3_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_int3_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_int3
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_int4
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 7, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_int4(loc_id, dset_name, rank, dims, &
-       type_id, buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_int4
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf  ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_int4_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_INT4_C'::h5ltmake_dataset_int4_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf      ! data buffer
-       END FUNCTION h5ltmake_dataset_int4_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_int4_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_int4
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_int5
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 7, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_int5(loc_id, dset_name, rank, dims, &
-       type_id, buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_int5
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf  ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_int5_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_INT5_C'::h5ltmake_dataset_int5_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf      ! data buffer
-       END FUNCTION h5ltmake_dataset_int5_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_int5_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_int5
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_int6
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 7, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_int6(loc_id, dset_name, rank, dims, &
-       type_id, buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_int6
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf  ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_int6_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_INT6_C'::h5ltmake_dataset_int6_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf      ! data buffer
-       END FUNCTION h5ltmake_dataset_int6_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_int6_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_int6
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_int7
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 7, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_int7(loc_id, dset_name, rank, dims, &
-       type_id, buf, errcode )
-    
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_int7
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf  ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_int7_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_INT7_C'::h5ltmake_dataset_int7_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf      ! data buffer
-       END FUNCTION h5ltmake_dataset_int7_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_int7_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_int7
-
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_float1
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 1, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_float1(loc_id,&
-       dset_name,&
-       rank,&
-       dims,&
-       type_id,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_float1
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    REAL, INTENT(in), DIMENSION(*) :: buf              ! data buffer
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_fl1_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_FL1_C'::h5ltmake_dataset_fl1_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), DIMENSION(*) :: buf                   ! data buffer
-       END FUNCTION h5ltmake_dataset_fl1_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_fl1_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_float1
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_float2
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 1, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_float2(loc_id,&
-       dset_name,&
-       rank,&
-       dims,&
-       type_id,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_float2
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(in), &
-         DIMENSION(dims(1),dims(2)) :: buf                  ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_fl2_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_FL2_C'::h5ltmake_dataset_fl2_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), &
-              DIMENSION(dims(1),dims(2)) :: buf                       ! data buffer
-       END FUNCTION h5ltmake_dataset_fl2_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_fl2_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_float2
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_float3
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 1, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_float3(loc_id,&
-       dset_name,&
-       rank,&
-       dims,&
-       type_id,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_float3
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_fl3_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_FL3_C'::h5ltmake_dataset_fl3_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf               ! data buffer
-       END FUNCTION h5ltmake_dataset_fl3_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_fl3_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_float3
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_float4
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 7, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_float4(loc_id, dset_name, rank, dims,&
-       type_id, buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_float4
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_fl4_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_FL4_C'::h5ltmake_dataset_fl4_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3), dims(4)) :: buf ! data buffer
-       END FUNCTION h5ltmake_dataset_fl4_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_fl4_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_float4
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_float5
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 7, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_float5(loc_id, dset_name, rank, dims,&
-       type_id, buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_float5
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_fl5_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_FL5_C'::h5ltmake_dataset_fl5_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf ! data buffer
-       END FUNCTION h5ltmake_dataset_fl5_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_fl5_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_float5
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_float6
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 7, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_float6(loc_id, dset_name, rank, dims,&
-       type_id, buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_float6
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_fl6_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_FL6_C'::h5ltmake_dataset_fl6_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf ! data buffer
-       END FUNCTION h5ltmake_dataset_fl6_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_fl6_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_float6
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_float7
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 7, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_float7(loc_id, dset_name, rank, dims,&
-       type_id, buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_float7
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_fl7_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_FL7_C'::h5ltmake_dataset_fl7_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf ! data buffer
-       END FUNCTION h5ltmake_dataset_fl7_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_fl7_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_float7
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_double1
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 1, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_double1(loc_id,&
-       dset_name,&
-       rank,&
-       dims,&
-       type_id,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_double1
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    DOUBLE PRECISION, INTENT(in), DIMENSION(*) :: buf  ! data buffer
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_dl1_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_DL1_C'::h5ltmake_dataset_dl1_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), DIMENSION(*) :: buf       ! data buffer
-       END FUNCTION h5ltmake_dataset_dl1_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_dl1_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_double1
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_double2
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 1, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_double2(loc_id,&
-       dset_name,&
-       rank,&
-       dims,&
-       type_id,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_double2
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(in), &
-         DIMENSION(dims(1),dims(2)) :: buf                  ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_dl2_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_DL2_C'::h5ltmake_dataset_dl2_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), &
-              DIMENSION(dims(1),dims(2)) :: buf                       ! data buffer
-       END FUNCTION h5ltmake_dataset_dl2_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_dl2_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_double2
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_double3
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 1, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_double3(loc_id,&
-       dset_name,&
-       rank,&
-       dims,&
-       type_id,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_double3
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_dl3_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_DL3_C'::h5ltmake_dataset_dl3_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf               ! data buffer
-       END FUNCTION h5ltmake_dataset_dl3_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_dl3_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_double3
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_double4
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 7, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_double4(loc_id, dset_name, rank, dims, &
-       type_id, buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_double4
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3), dims(4)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_dl4_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_DL4_C'::h5ltmake_dataset_dl4_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf  ! data buffer
-       END FUNCTION h5ltmake_dataset_dl4_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_dl4_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_double4
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_double5
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 7, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_double5(loc_id, dset_name, rank, dims, &
-       type_id, buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_double5
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_dl5_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_DL5_C'::h5ltmake_dataset_dl5_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf  ! data buffer
-       END FUNCTION h5ltmake_dataset_dl5_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_dl5_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_double5
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_double6
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 7, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_double6(loc_id, dset_name, rank, dims, &
-       type_id, buf, errcode )
-    
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_double6
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_dl6_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_DL6_C'::h5ltmake_dataset_dl6_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf  ! data buffer
-       END FUNCTION h5ltmake_dataset_dl6_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_dl6_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_double6
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_f_double7
-  !
-  ! Purpose: Creates and writes a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 7, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_f_double7(loc_id, dset_name, rank, dims, &
-       type_id, buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_f_double7
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_dl7_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_DL7_C'::h5ltmake_dataset_dl7_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf  ! data buffer
-       END FUNCTION h5ltmake_dataset_dl7_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_dl7_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-
-  END SUBROUTINE h5ltmake_dataset_f_double7
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_int1
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_int1(loc_id,&
-       dset_name,&
-       type_id,&
-       buf,&
-       dims,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_int1
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER, INTENT(inout), DIMENSION(*) :: buf        ! data buffer
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_int1_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_INT1_C'::h5ltread_dataset_int1_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(HID_T),   INTENT(IN) :: loc_id                  ! file or group identifier
-         INTEGER(HID_T),   INTENT(IN) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(LEN=*), INTENT(IN) :: dset_name               ! name of the dataset
-         INTEGER(HSIZE_T), DIMENSION(*), INTENT(IN) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(IN), DIMENSION(*) :: buf                ! data buffer
-       END FUNCTION h5ltread_dataset_int1_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_int1_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_int1
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_int2
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_int2(loc_id,&
-       dset_name,&
-       type_id,&
-       buf,&
-       dims,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_int2
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(inout), &
-         DIMENSION(dims(1),dims(2)) :: buf                  ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_int2_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_INT2_C'::h5ltread_dataset_int2_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), &
-              DIMENSION(dims(1),dims(2)) :: buf                       ! data buffer
-       END FUNCTION h5ltread_dataset_int2_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_int2_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_int2
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_int3
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_int3(loc_id,&
-       dset_name,&
-       type_id,&
-       buf,&
-       dims,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_int3
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_int3_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_INT3_C'::h5ltread_dataset_int3_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_int3_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_int3_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_int3
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_int4
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 12, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_int4(loc_id, dset_name, type_id, buf, &
-       dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_int4
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_int4_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_INT4_C'::h5ltread_dataset_int4_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_int4_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_int4_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_int4
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_int5
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 12, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_int5(loc_id, dset_name, type_id, buf, &
-       dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_int5
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_int5_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_INT5_C'::h5ltread_dataset_int5_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_int5_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_int5_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_int5
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_int6
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 12, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_int6(loc_id, dset_name, type_id, buf, &
-       dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_int6
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_int6_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_INT6_C'::h5ltread_dataset_int6_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_int6_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_int6_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_int6
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_int7
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 12, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_int7(loc_id, dset_name, type_id, buf, &
-       dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_int7
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_int7_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_INT7_C'::h5ltread_dataset_int7_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_int7_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_int7_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_int7
-
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_float1
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_float1(loc_id,&
-       dset_name,&
-       type_id,&
-       buf,&
-       dims,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_float1
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    REAL, INTENT(inout), DIMENSION(*) :: buf           ! data buffer
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_fl1_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_FL1_C'::h5ltread_dataset_fl1_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), DIMENSION(*) :: buf                   ! data buffer
-       END FUNCTION h5ltread_dataset_fl1_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_fl1_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_float1
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_float2
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_float2(loc_id,&
-       dset_name,&
-       type_id,&
-       buf,&
-       dims,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_float2
-    !DEC$endif
-    !
-
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(inout), &
-         DIMENSION(dims(1),dims(2)) :: buf                  ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_fl2_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_FL2_C'::h5ltread_dataset_fl2_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), &
-              DIMENSION(dims(1),dims(2)) :: buf                       ! data buffer
-       END FUNCTION h5ltread_dataset_fl2_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_fl2_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_float2
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_float3
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_float3(loc_id,&
-       dset_name,&
-       type_id,&
-       buf,&
-       dims,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_float3
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_fl3_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_FL3_C'::h5ltread_dataset_fl3_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_fl3_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_fl3_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_float3
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_float4
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_float4(loc_id, dset_name, type_id, buf, &
-       dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_float4
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_fl4_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_FL4_C'::h5ltread_dataset_fl4_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_fl4_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_fl4_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_float4
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_float5
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_float5(loc_id, dset_name, type_id, buf, &
-       dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_float5
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_fl5_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_FL5_C'::h5ltread_dataset_fl5_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_fl5_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_fl5_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_float5
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_float6
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_float6(loc_id, dset_name, type_id, buf, &
-       dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_float6
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_fl6_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_FL6_C'::h5ltread_dataset_fl6_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_fl6_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_fl6_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_float6
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_float7
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_float7(loc_id, dset_name, type_id, buf, &
-       dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_float7
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_fl7_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_FL7_C'::h5ltread_dataset_fl7_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_fl7_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_fl7_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_float7
-
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_double1
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_double1(loc_id,&
-       dset_name,&
-       type_id,&
-       buf,&
-       dims,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport ::h5ltread_dataset_f_double1
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    DOUBLE PRECISION, INTENT(inout), DIMENSION(*) :: buf ! data buffer
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_dl1_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_DL1_C'::h5ltread_dataset_dl1_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), DIMENSION(*) :: buf       ! data buffer
-       END FUNCTION h5ltread_dataset_dl1_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_dl1_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_double1
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_double2
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_double2(loc_id,&
-       dset_name,&
-       type_id,&
-       buf,&
-       dims,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_double2
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(inout), &
-         DIMENSION(dims(1),dims(2)) :: buf                  ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_dl2_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_DL2_C'::h5ltread_dataset_dl2_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), &
-              DIMENSION(dims(1),dims(2)) :: buf                       ! data buffer
-       END FUNCTION h5ltread_dataset_dl2_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_dl2_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_double2
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_double3
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_double3(loc_id,&
-       dset_name,&
-       type_id,&
-       buf,&
-       dims,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_double3
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_dl3_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_DL3_C'::h5ltread_dataset_dl3_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_dl3_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_dl3_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_double3
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_double4
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_double4(loc_id, dset_name, type_id, buf, &
-       dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_double4
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_dl4_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_DL4_C'::h5ltread_dataset_dl4_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_dl4_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_dl4_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_double4
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_double5
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_double5(loc_id, dset_name, type_id, buf, &
-       dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_double5
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_dl5_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_DL5_C'::h5ltread_dataset_dl5_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_dl5_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_dl5_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_double5
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_double6
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_double6(loc_id, dset_name, type_id, buf, &
-       dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_double6
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_dl6_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_DL6_C'::h5ltread_dataset_dl6_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_dl6_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_dl6_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_double6
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_f_double7
-  !
-  ! Purpose: Read a dataset of a type TYPE_ID
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_f_double7(loc_id, dset_name, type_id, buf, &
-       dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_f_double7
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hid_t),   INTENT(in) :: type_id            ! datatype identifier
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_dl7_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_DL7_C'::h5ltread_dataset_dl7_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_dl7_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_dl7_c(loc_id,namelen,dset_name,type_id,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_f_double7
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_int_f_1
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_INT type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_int_f_1 (loc_id,&
-       dset_name,&
-       rank,&
-       dims,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_int_f_1
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER, INTENT(in), DIMENSION(*) :: buf           ! data buffer
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_nint1_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NINT1_C'::h5ltmake_dataset_nint1_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), DIMENSION(*) :: buf                ! data buffer
-       END FUNCTION h5ltmake_dataset_nint1_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_nint1_c(loc_id,namelen,dset_name,rank,dims,h5t_native_integer,buf)
-
-  END SUBROUTINE h5ltmake_dataset_int_f_1
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_int_f_2
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_INT type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_int_f_2 (loc_id,&
-       dset_name,&
-       rank,&
-       dims,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_int_f_2
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(in), &
-         DIMENSION(dims(1),dims(2)) :: buf                  ! data buffer
-
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_nint2_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NINT2_C'::h5ltmake_dataset_nint2_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), &
-              DIMENSION(dims(1),dims(2)) :: buf                  ! data buffer
-       END FUNCTION h5ltmake_dataset_nint2_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_nint2_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_INTEGER,buf)
-
-  END SUBROUTINE h5ltmake_dataset_int_f_2
-
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_int_f_3
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_INT type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_int_f_3 (loc_id,&
-       dset_name,&
-       rank,&
-       dims,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_int_f_3
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf          ! data buffer
-
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_nint3_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NINT3_C'::h5ltmake_dataset_nint3_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf               ! data buffer
-       END FUNCTION h5ltmake_dataset_nint3_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_nint3_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_INTEGER,buf)
-
-  END SUBROUTINE h5ltmake_dataset_int_f_3
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_int_f_4
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_INT type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_int_f_4(loc_id, dset_name, rank, dims, &
-       buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_int_f_4
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf          ! data buffer
-
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_nint4_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NINT4_C'::h5ltmake_dataset_nint4_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf  ! data buffer
-       END FUNCTION h5ltmake_dataset_nint4_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_nint4_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_INTEGER,buf)
-
-  END SUBROUTINE h5ltmake_dataset_int_f_4
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_int_f_5
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_INT type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_int_f_5(loc_id, dset_name, rank, dims, &
-       buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_int_f_5
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf          ! data buffer
-
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_nint5_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NINT5_C'::h5ltmake_dataset_nint5_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf  ! data buffer
-       END FUNCTION h5ltmake_dataset_nint5_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_nint5_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_INTEGER,buf)
-
-  END SUBROUTINE h5ltmake_dataset_int_f_5
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_int_f_6
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_INT type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_int_f_6(loc_id, dset_name, rank, dims, &
-       buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_int_f_6
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf          ! data buffer
-
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_nint6_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NINT6_C'::h5ltmake_dataset_nint6_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf  ! data buffer
-       END FUNCTION h5ltmake_dataset_nint6_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_nint6_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_INTEGER,buf)
-
-  END SUBROUTINE h5ltmake_dataset_int_f_6
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_int_f_7
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_INT type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_int_f_7(loc_id, dset_name, rank, dims, &
-       buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_int_f_7
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf          ! data buffer
-
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_nint7_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NINT7_C'::h5ltmake_dataset_nint7_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf  ! data buffer
-       END FUNCTION h5ltmake_dataset_nint7_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_nint7_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_INTEGER,buf)
-
-  END SUBROUTINE h5ltmake_dataset_int_f_7
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_float_f_1
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_FLOAT type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_float_f_1 (loc_id,&
-       dset_name,&
-       rank,&
-       dims,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_float_f_1
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    REAL, INTENT(in), DIMENSION(*) :: buf              ! data buffer
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_nfl1_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NFL1_C'::h5ltmake_dataset_nfl1_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), DIMENSION(*) :: buf                   ! data buffer
-       END FUNCTION h5ltmake_dataset_nfl1_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_nfl1_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_REAL,buf)
-
-  END SUBROUTINE h5ltmake_dataset_float_f_1
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_float_f_2
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_FLOAT type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_float_f_2 (loc_id,&
-       dset_name,&
-       rank,&
-       dims,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_float_f_2
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(in), &
-         DIMENSION(dims(1),dims(2)) :: buf                  ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_nfl2_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NFL2_C'::h5ltmake_dataset_nfl2_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), &
-              DIMENSION(dims(1),dims(2)) :: buf                  ! data buffer
-       END FUNCTION h5ltmake_dataset_nfl2_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_nfl2_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_REAL,buf)
-
-  END SUBROUTINE h5ltmake_dataset_float_f_2
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_float_f_3
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_FLOAT type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_float_f_3 (loc_id,&
-       dset_name,&
-       rank,&
-       dims,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_float_f_3
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_nfl3_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NFL3_C'::h5ltmake_dataset_nfl3_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf               ! data buffer
-       END FUNCTION h5ltmake_dataset_nfl3_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_nfl3_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_REAL,buf)
-
-  END SUBROUTINE h5ltmake_dataset_float_f_3
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_float_f_4
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_FLOAT type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_float_f_4 (loc_id, dset_name, rank, dims, &
-       buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_float_f_4
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_nfl4_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NFL4_C'::h5ltmake_dataset_nfl4_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf               ! data buffer
-       END FUNCTION h5ltmake_dataset_nfl4_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_nfl4_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_REAL,buf)
-
-  END SUBROUTINE h5ltmake_dataset_float_f_4
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_float_f_5
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_FLOAT type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_float_f_5 (loc_id, dset_name, rank, dims, &
-       buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_float_f_5
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_nfl5_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NFL5_C'::h5ltmake_dataset_nfl5_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf               ! data buffer
-       END FUNCTION h5ltmake_dataset_nfl5_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_nfl5_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_REAL,buf)
-
-  END SUBROUTINE h5ltmake_dataset_float_f_5
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_float_f_6
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_FLOAT type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_float_f_6 (loc_id, dset_name, rank, dims, &
-       buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_float_f_6
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_nfl6_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NFL6_C'::h5ltmake_dataset_nfl6_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf               ! data buffer
-       END FUNCTION h5ltmake_dataset_nfl6_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_nfl6_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_REAL,buf)
-
-  END SUBROUTINE h5ltmake_dataset_float_f_6
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_float_f_7
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_FLOAT type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_float_f_7 (loc_id, dset_name, rank, dims, &
-       buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_float_f_7
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_nfl7_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NFL7_C'::h5ltmake_dataset_nfl7_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf               ! data buffer
-       END FUNCTION h5ltmake_dataset_nfl7_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_nfl7_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_REAL,buf)
-
-  END SUBROUTINE h5ltmake_dataset_float_f_7
-
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_double_f_1
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_DOUBLE type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_double_f_1 (loc_id,&
-       dset_name,&
-       rank,&
-       dims,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_double_f_1
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(in), &
-         DIMENSION(dims(1)) :: buf                          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_ndl1_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NDL1_C'::h5ltmake_dataset_ndl1_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), &
-              DIMENSION(dims(1)) :: buf                               ! data buffer
-       END FUNCTION h5ltmake_dataset_ndl1_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_ndl1_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_DOUBLE,buf)
-
-  END SUBROUTINE h5ltmake_dataset_double_f_1
-
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_double_f_2
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_DOUBLE type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_double_f_2 (loc_id,&
-       dset_name,&
-       rank,&
-       dims,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_double_f_2
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(in), &
-         DIMENSION(dims(1),dims(2)) :: buf                  ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_ndl2_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NDL2_C'::h5ltmake_dataset_ndl2_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), &
-              DIMENSION(dims(1),dims(2)) :: buf                       ! data buffer
-       END FUNCTION h5ltmake_dataset_ndl2_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_ndl2_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_DOUBLE,buf)
-
-  END SUBROUTINE h5ltmake_dataset_double_f_2
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_double_f_3
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_DOUBLE type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_double_f_3 (loc_id,&
-       dset_name,&
-       rank,&
-       dims,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_double_f_3
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_ndl3_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NDL3_C'::h5ltmake_dataset_ndl3_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf               ! data buffer
-       END FUNCTION h5ltmake_dataset_ndl3_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_ndl3_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_DOUBLE,buf)
-
-  END SUBROUTINE h5ltmake_dataset_double_f_3
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_double_f_4
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_DOUBLE type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_double_f_4 (loc_id, dset_name, rank, dims,&
-       buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_double_f_4
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_ndl4_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NDL4_C'::h5ltmake_dataset_ndl4_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf               ! data buffer
-       END FUNCTION h5ltmake_dataset_ndl4_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_ndl4_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_DOUBLE,buf)
-
-  END SUBROUTINE h5ltmake_dataset_double_f_4
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_double_f_5
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_DOUBLE type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_double_f_5 (loc_id, dset_name, rank, dims,&
-       buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_double_f_5
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_ndl5_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NDL5_C'::h5ltmake_dataset_ndl5_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf               ! data buffer
-       END FUNCTION h5ltmake_dataset_ndl5_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_ndl5_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_DOUBLE,buf)
-
-  END SUBROUTINE h5ltmake_dataset_double_f_5
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_double_f_6
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_DOUBLE type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_double_f_6 (loc_id, dset_name, rank, dims,&
-       buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_double_f_5
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_ndl6_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NDL6_C'::h5ltmake_dataset_ndl6_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf               ! data buffer
-       END FUNCTION h5ltmake_dataset_ndl6_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_ndl6_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_DOUBLE,buf)
-
-  END SUBROUTINE h5ltmake_dataset_double_f_6
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_double_f_7
-  !
-  ! Purpose: Creates and writes a dataset of H5T_NATIVE_DOUBLE type
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_double_f_7 (loc_id, dset_name, rank, dims,&
-       buf, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_double_f_5
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(in) :: rank               ! rank
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(in), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_ndl7_c(loc_id,namelen,dset_name,rank,dims,type_id,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_NDL7_C'::h5ltmake_dataset_ndl7_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(in) :: rank                    ! rank
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(in), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf               ! data buffer
-       END FUNCTION h5ltmake_dataset_ndl7_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltmake_dataset_ndl7_c(loc_id,namelen,dset_name,rank,dims,H5T_NATIVE_DOUBLE,buf)
-
-  END SUBROUTINE h5ltmake_dataset_double_f_7
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_int_f_1
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_int_f_1(loc_id,&
-       dset_name,&
-       buf,&
-       dims,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_int_f_1
-    !DEC$endif
-    !
-
-    INTEGER(HID_T),   INTENT(IN) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(inout), &
-         DIMENSION(dims(1)) :: buf                          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_nint1_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NINT1_C'::h5ltread_dataset_nint1_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(inout), &
-              DIMENSION(dims(1)) :: buf                               ! data buffer
-       END FUNCTION h5ltread_dataset_nint1_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_nint1_c(loc_id,namelen,dset_name,H5T_NATIVE_INTEGER,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_int_f_1
-
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_int_f_2
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_int_f_2(loc_id,&
-       dset_name,&
-       buf,&
-       dims,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_int_f_2
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(inout), &
-         DIMENSION(dims(1),dims(2)) :: buf                  ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_nint2_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NINT2_C'::h5ltread_dataset_nint2_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(inout), &
-              DIMENSION(dims(1),dims(2)) :: buf                       ! data buffer
-       END FUNCTION h5ltread_dataset_nint2_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_nint2_c(loc_id,namelen,dset_name,H5T_NATIVE_INTEGER,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_int_f_2
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_int_f_3
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_int_f_3(loc_id,&
-       dset_name,&
-       buf,&
-       dims,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_int_f_3
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_nint3_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NINT3_C'::h5ltread_dataset_nint3_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(inout), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_nint3_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_nint3_c(loc_id,namelen,dset_name,H5T_NATIVE_INTEGER,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_int_f_3
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_int_f_4
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_int_f_4(loc_id, dset_name, buf, dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_int_f_4
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_nint4_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NINT4_C'::h5ltread_dataset_nint4_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(inout), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_nint4_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_nint4_c(loc_id,namelen,dset_name,H5T_NATIVE_INTEGER,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_int_f_4
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_int_f_5
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_int_f_5(loc_id, dset_name, buf, dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_int_f_5
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_nint5_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NINT5_C'::h5ltread_dataset_nint5_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(inout), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_nint5_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_nint5_c(loc_id,namelen,dset_name,H5T_NATIVE_INTEGER,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_int_f_5
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_int_f_6
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_int_f_6(loc_id, dset_name, buf, dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_int_f_6
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_nint6_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NINT6_C'::h5ltread_dataset_nint6_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(inout), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_nint6_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_nint6_c(loc_id,namelen,dset_name,H5T_NATIVE_INTEGER,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_int_f_6
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_int_f_7
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_int_f_7(loc_id, dset_name, buf, dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_int_f_7
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_nint7_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NINT7_C'::h5ltread_dataset_nint7_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         INTEGER, INTENT(inout), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_nint7_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_nint7_c(loc_id,namelen,dset_name,H5T_NATIVE_INTEGER,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_int_f_7
-
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_float_f_1
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_float_f_1(loc_id,&
-       dset_name,&
-       buf,&
-       dims,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_float_f_1
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(inout), &
-         DIMENSION(dims(1)) :: buf                          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_nfl1_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NFL1_C'::h5ltread_dataset_nfl1_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(inout), &
-              DIMENSION(dims(1)) :: buf                               ! data buffer
-       END FUNCTION h5ltread_dataset_nfl1_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_nfl1_c(loc_id,namelen,dset_name,H5T_NATIVE_REAL,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_float_f_1
-
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_float_f_2
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_float_f_2(loc_id,&
-       dset_name,&
-       buf,&
-       dims,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_float_f_2
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(inout), &
-         DIMENSION(dims(1),dims(2)) :: buf                  ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_nfl2_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NFL2_C'::h5ltread_dataset_nfl2_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(inout), &
-              DIMENSION(dims(1),dims(2)) :: buf                       ! data buffer
-       END FUNCTION h5ltread_dataset_nfl2_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_nfl2_c(loc_id,namelen,dset_name,H5T_NATIVE_REAL,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_float_f_2
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_float_f_3
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_float_f_3(loc_id,&
-       dset_name,&
-       buf,&
-       dims,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_float_f_3
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_nfl3_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NFL3_C'::h5ltread_dataset_nfl3_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(inout), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_nfl3_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_nfl3_c(loc_id,namelen,dset_name,H5T_NATIVE_REAL,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_float_f_3
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_float_f_4
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_float_f_4(loc_id, dset_name, buf, dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_float_f_4
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_nfl4_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NFL4_C'::h5ltread_dataset_nfl4_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(inout), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_nfl4_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_nfl4_c(loc_id,namelen,dset_name,H5T_NATIVE_REAL,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_float_f_4
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_float_f_5
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_float_f_5(loc_id, dset_name, buf, dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_float_f_5
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_nfl5_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NFL5_C'::h5ltread_dataset_nfl5_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(inout), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_nfl5_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_nfl5_c(loc_id,namelen,dset_name,H5T_NATIVE_REAL,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_float_f_5
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_float_f_6
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_float_f_6(loc_id, dset_name, buf, dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_float_f_6
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_nfl6_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NFL6_C'::h5ltread_dataset_nfl6_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(inout), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_nfl6_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_nfl6_c(loc_id,namelen,dset_name,H5T_NATIVE_REAL,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_float_f_6
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_float_f_7
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_float_f_7(loc_id, dset_name, buf, dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_float_f_7
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    REAL, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_nfl7_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NFL7_C'::h5ltread_dataset_nfl7_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         REAL, INTENT(inout), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_nfl7_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_nfl7_c(loc_id,namelen,dset_name,H5T_NATIVE_REAL,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_float_f_7
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_double_f_1
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_double_f_1(loc_id,&
-       dset_name,&
-       buf,&
-       dims,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_double_f_1
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(inout), &
-         DIMENSION(dims(1)) :: buf                          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_ndl1_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NDL1_C'::h5ltread_dataset_ndl1_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(inout), &
-              DIMENSION(dims(1)) :: buf                               ! data buffer
-       END FUNCTION h5ltread_dataset_ndl1_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_ndl1_c(loc_id,namelen,dset_name,H5T_NATIVE_DOUBLE,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_double_f_1
-
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_double_f_2
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_double_f_2(loc_id,&
-       dset_name,&
-       buf,&
-       dims,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_double_f_2
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(inout), &
-         DIMENSION(dims(1),dims(2)) :: buf                  ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_ndl2_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NDL2_C'::h5ltread_dataset_ndl2_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(inout), &
-              DIMENSION(dims(1),dims(2)) :: buf                       ! data buffer
-       END FUNCTION h5ltread_dataset_ndl2_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_ndl2_c(loc_id,namelen,dset_name,H5T_NATIVE_DOUBLE,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_double_f_2
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_double_f_3
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_double_f_3(loc_id,&
-       dset_name,&
-       buf,&
-       dims,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_double_f_3
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_ndl3_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NDL3_C'::h5ltread_dataset_ndl3_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(inout), &
-              DIMENSION(dims(1),dims(2),dims(3)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_ndl3_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_ndl3_c(loc_id,namelen,dset_name,H5T_NATIVE_DOUBLE,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_double_f_3
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_double_f_4
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_double_f_4(loc_id, dset_name, buf, dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_double_f_4
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_ndl4_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NDL4_C'::h5ltread_dataset_ndl4_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(inout), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_ndl4_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_ndl4_c(loc_id,namelen,dset_name,H5T_NATIVE_DOUBLE,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_double_f_4
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_double_f_5
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_double_f_5(loc_id, dset_name, buf, dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_double_f_5
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_ndl5_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NDL5_C'::h5ltread_dataset_ndl5_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(inout), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_ndl5_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_ndl5_c(loc_id,namelen,dset_name,H5T_NATIVE_DOUBLE,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_double_f_5
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_double_f_6
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_double_f_6(loc_id, dset_name, buf, dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_double_f_6
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    DOUBLE PRECISION, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_ndl6_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NDL6_C'::h5ltread_dataset_ndl6_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(inout), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_ndl6_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_ndl6_c(loc_id,namelen,dset_name,H5T_NATIVE_DOUBLE,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_double_f_6
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_double_f_7
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: March 8, 2011
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_double_f_7(loc_id, dset_name, buf, dims, errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_double_f_7
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims ! size of the buffer buf
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                         ! name length
-    DOUBLE PRECISION, INTENT(inout), &
-         DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf          ! data buffer
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_ndl7_c(loc_id,namelen,dset_name,type_id,buf,dims)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_NDL7_C'::h5ltread_dataset_ndl7_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(hid_t),   INTENT(in) :: type_id                 ! datatype identifier
-         INTEGER(size_t) :: namelen                              ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t), DIMENSION(*), INTENT(in) :: dims      ! size of the buffer buf
-         DOUBLE PRECISION, INTENT(inout), &
-              DIMENSION(dims(1),dims(2),dims(3),dims(4),dims(5),dims(6),dims(7)) :: buf               ! data buffer
-       END FUNCTION h5ltread_dataset_ndl7_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_ndl7_c(loc_id,namelen,dset_name,H5T_NATIVE_DOUBLE,buf,dims)
-
-  END SUBROUTINE h5ltread_dataset_double_f_7
-
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltmake_dataset_string_f
-  !
-  ! Purpose: Creates and writes a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltmake_dataset_string_f(loc_id,&
-       dset_name,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltmake_dataset_string_f
-    !DEC$endif
-    !
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    CHARACTER(len=*), INTENT(in) :: buf                ! data buffer
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                         ! name length
-    INTEGER(size_t) :: buflen                          ! buffer length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltmake_dataset_string_c(loc_id,namelen,dset_name,buflen,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTMAKE_DATASET_STRING_C'::h5ltmake_dataset_string_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(size_t) :: namelen                              ! length of name buffer
-         INTEGER(size_t) :: buflen                               ! length of data buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         CHARACTER(len=*), INTENT(in) :: buf                     ! data buffer
-       END FUNCTION h5ltmake_dataset_string_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    buflen = LEN(buf)
-    errcode = h5ltmake_dataset_string_c(loc_id,namelen,dset_name,buflen,buf)
-
-  END SUBROUTINE h5ltmake_dataset_string_f
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltread_dataset_string_f
-  !
-  ! Purpose: Read a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 22, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltread_dataset_string_f(loc_id,&
-       dset_name,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltread_dataset_string_f
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    CHARACTER(len=*), INTENT(inout) :: buf             ! data buffer
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltread_dataset_string_c(loc_id,namelen,dset_name,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTREAD_DATASET_STRING_C'::h5ltread_dataset_string_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         CHARACTER(len=*), INTENT(inout) :: buf                  ! data buffer
-       END FUNCTION h5ltread_dataset_string_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltread_dataset_string_c(loc_id,namelen,dset_name,buf)
-
-  END SUBROUTINE h5ltread_dataset_string_f
-
-
-
-
-  !-------------------------------------------------------------------------
-  ! Make/Read attribute functions
-  !-------------------------------------------------------------------------
-
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltset_attribute_int_f
-  !
-  ! Purpose: Create and write an attribute
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: October 05, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltset_attribute_int_f(loc_id,&
-       dset_name,&
-       attr_name,&
-       buf,&
-       size,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltset_attribute_int_f
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    CHARACTER(len=*), INTENT(in) :: attr_name          ! name of the attribute
-    INTEGER(size_t),  INTENT(in) :: size               ! size of attribute array
-    INTEGER :: errcode                                 ! error code
-    INTEGER, INTENT(in), DIMENSION(*) :: buf           ! data buffer
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER(size_t) :: attrlen                                 ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltset_attribute_int_c(loc_id,namelen,dset_name,attrlen,attr_name,size,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTSET_ATTRIBUTE_INT_C'::h5ltset_attribute_int_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         !DEC$ATTRIBUTES reference :: attr_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(size_t) :: namelen                              ! length of name buffer
-         INTEGER(size_t) :: attrlen                              ! length of attr name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         CHARACTER(len=*), INTENT(in) :: attr_name               ! name of the attribute
-         INTEGER(size_t),  INTENT(in) :: size                    ! size of attribute array
-         INTEGER, INTENT(in), DIMENSION(*) :: buf                ! data buffer
-       END FUNCTION h5ltset_attribute_int_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    attrlen = LEN(attr_name)
-    errcode = h5ltset_attribute_int_c(loc_id,namelen,dset_name,attrlen,attr_name,size,buf)
-
-  END SUBROUTINE h5ltset_attribute_int_f
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltset_attribute_float_f
-  !
-  ! Purpose: Create and write an attribute
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: October 05, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltset_attribute_float_f(loc_id,&
-       dset_name,&
-       attr_name,&
-       buf,&
-       size,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltset_attribute_float_f
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    CHARACTER(len=*), INTENT(in) :: attr_name          ! name of the attribute
-    INTEGER(size_t),  INTENT(in) :: size               ! size of attribute array
-    INTEGER :: errcode                                 ! error code
-    REAL, INTENT(in), DIMENSION(*) :: buf              ! data buffer
-    INTEGER(size_t) :: namelen                         ! name length
-    INTEGER(size_t) :: attrlen                         ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltset_attribute_float_c(loc_id,namelen,dset_name,attrlen,attr_name,size,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTSET_ATTRIBUTE_FLOAT_C'::h5ltset_attribute_float_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         !DEC$ATTRIBUTES reference :: attr_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(size_t) :: namelen                              ! length of name buffer
-         INTEGER(size_t) :: attrlen                              ! length of attr name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         CHARACTER(len=*), INTENT(in) :: attr_name               ! name of the attribute
-         INTEGER(size_t),  INTENT(in) :: size                    ! size of attribute array
-         REAL, INTENT(in), DIMENSION(*) :: buf                   ! data buffer
-       END FUNCTION h5ltset_attribute_float_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    attrlen = LEN(attr_name)
-    errcode = h5ltset_attribute_float_c(loc_id,namelen,dset_name,attrlen,attr_name,size,buf)
-
-  END SUBROUTINE h5ltset_attribute_float_f
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltset_attribute_double_f
-  !
-  ! Purpose: Create and write an attribute
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: October 05, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltset_attribute_double_f(loc_id,&
-       dset_name,&
-       attr_name,&
-       buf,&
-       size,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltset_attribute_double_f
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    CHARACTER(len=*), INTENT(in) :: attr_name          ! name of the attribute
-    INTEGER(size_t),  INTENT(in) :: size               ! size of attribute array
-    INTEGER :: errcode                                 ! error code
-    DOUBLE PRECISION, INTENT(in), DIMENSION(*) :: buf  ! data buffer
-    INTEGER(size_t) :: namelen                         ! name length
-    INTEGER(size_t) :: attrlen                         ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltset_attribute_double_c(loc_id,namelen,dset_name,attrlen,attr_name,size,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTSET_ATTRIBUTE_DOUBLE_C'::h5ltset_attribute_double_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         !DEC$ATTRIBUTES reference :: attr_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(size_t) :: namelen                              ! length of name buffer
-         INTEGER(size_t) :: attrlen                              ! length of attr name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         CHARACTER(len=*), INTENT(in) :: attr_name               ! name of the attribute
-         INTEGER(size_t),  INTENT(in) :: size                    ! size of attribute array
-         DOUBLE PRECISION, INTENT(in), DIMENSION(*) :: buf       ! data buffer
-       END FUNCTION h5ltset_attribute_double_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    attrlen = LEN(attr_name)
-    errcode = h5ltset_attribute_double_c(loc_id,namelen,dset_name,attrlen,attr_name,size,buf)
-
-  END SUBROUTINE h5ltset_attribute_double_f
-
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltset_attribute_string_f
-  !
-  ! Purpose: Create and write an attribute
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: October 05, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltset_attribute_string_f(loc_id,&
-       dset_name,&
-       attr_name,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltset_attribute_string_f
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    CHARACTER(len=*), INTENT(in) :: attr_name          ! name of the attribute
-    INTEGER :: errcode                                 ! error code
-    CHARACTER(len=*), INTENT(in) :: buf                ! data buffer
-    INTEGER(size_t) :: namelen                         ! name length
-    INTEGER(size_t) :: attrlen                         ! name length
-    INTEGER(size_t) :: buflen                          ! data buffer length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltset_attribute_string_c(loc_id,namelen,dset_name,attrlen,attr_name,buflen,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTSET_ATTRIBUTE_STRING_C'::h5ltset_attribute_string_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         !DEC$ATTRIBUTES reference :: attr_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(size_t) :: namelen                              ! length of name buffer
-         INTEGER(size_t) :: attrlen                              ! length of attr name buffer
-         INTEGER(size_t) :: buflen                               ! data buffer length
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         CHARACTER(len=*), INTENT(in) :: attr_name               ! name of the attribute
-         CHARACTER(len=*), INTENT(in) :: buf                     ! data buffer
-       END FUNCTION h5ltset_attribute_string_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    attrlen = LEN(attr_name)
-    buflen = LEN(buf)
-    errcode = h5ltset_attribute_string_c(loc_id,namelen,dset_name,attrlen,attr_name,buflen,buf)
-
-  END SUBROUTINE h5ltset_attribute_string_f
-
-
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltget_attribute_int_f
-  !
-  ! Purpose: Reads an attribute named ATTR_NAME
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: October 05, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltget_attribute_int_f(loc_id,&
-       dset_name,&
-       attr_name,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltget_attribute_int_f
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    CHARACTER(len=*), INTENT(in) :: attr_name          ! name of the attribute
-    INTEGER :: errcode                                 ! error code
-    INTEGER, INTENT(inout), DIMENSION(*) :: buf        ! data buffer
-    INTEGER(size_t) :: namelen                         ! name length
-    INTEGER(size_t) :: attrlen                         ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltget_attribute_int_c(loc_id,namelen,dset_name,attrlen,attr_name,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTGET_ATTRIBUTE_INT_C'::h5ltget_attribute_int_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         !DEC$ATTRIBUTES reference :: attr_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(size_t) :: namelen                              ! length of name buffer
-         INTEGER(size_t) :: attrlen                              ! length of attr name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         CHARACTER(len=*), INTENT(in) :: attr_name               ! name of the attribute
-         INTEGER, INTENT(inout), DIMENSION(*) :: buf     ! data buffer
-       END FUNCTION h5ltget_attribute_int_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    attrlen = LEN(attr_name)
-    errcode = h5ltget_attribute_int_c(loc_id,namelen,dset_name,attrlen,attr_name,buf)
-
-  END SUBROUTINE h5ltget_attribute_int_f
-
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltget_attribute_float_f
-  !
-  ! Purpose: Reads an attribute named ATTR_NAME
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: October 05, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltget_attribute_float_f(loc_id,&
-       dset_name,&
-       attr_name,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltget_attribute_float_f
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    CHARACTER(len=*), INTENT(in) :: attr_name          ! name of the attribute
-    INTEGER :: errcode                                 ! error code
-    REAL, INTENT(inout), DIMENSION(*) :: buf           ! data buffer
-    INTEGER(size_t) :: namelen                         ! name length
-    INTEGER(size_t) :: attrlen                         ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltget_attribute_float_c(loc_id,namelen,dset_name,attrlen,attr_name,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTGET_ATTRIBUTE_FLOAT_C'::h5ltget_attribute_float_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         !DEC$ATTRIBUTES reference :: attr_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         INTEGER(size_t) :: attrlen                                      ! length of attr name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         CHARACTER(len=*), INTENT(in) :: attr_name               ! name of the attribute
-         REAL, INTENT(inout), DIMENSION(*) :: buf                ! data buffer
-       END FUNCTION h5ltget_attribute_float_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    attrlen = LEN(attr_name)
-    errcode = h5ltget_attribute_float_c(loc_id,namelen,dset_name,attrlen,attr_name,buf)
-
-  END SUBROUTINE h5ltget_attribute_float_f
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltget_attribute_double_f
-  !
-  ! Purpose: Reads an attribute named ATTR_NAME
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: October 05, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltget_attribute_double_f(loc_id,&
-       dset_name,&
-       attr_name,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltget_attribute_double_f
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    CHARACTER(len=*), INTENT(in) :: attr_name          ! name of the attribute
-    INTEGER :: errcode                                 ! error code
-    DOUBLE PRECISION,INTENT(inout),DIMENSION(*) :: buf ! data buffer
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER(size_t) :: attrlen                                 ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltget_attribute_double_c(loc_id,namelen,dset_name,attrlen,attr_name,buf)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTGET_ATTRIBUTE_DOUBLE_C'::h5ltget_attribute_double_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         !DEC$ATTRIBUTES reference :: attr_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         INTEGER(size_t) :: attrlen                                      ! length of attr name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         CHARACTER(len=*), INTENT(in) :: attr_name               ! name of the attribute
-         DOUBLE PRECISION, INTENT(inout), DIMENSION(*) :: buf    ! data buffer
-       END FUNCTION h5ltget_attribute_double_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    attrlen = LEN(attr_name)
-    errcode = h5ltget_attribute_double_c(loc_id,namelen,dset_name,attrlen,attr_name,buf)
-
-  END SUBROUTINE h5ltget_attribute_double_f
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltget_attribute_string_f
-  !
-  ! Purpose: Reads an attribute named ATTR_NAME
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: October 05, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltget_attribute_string_f(loc_id,&
-       dset_name,&
-       attr_name,&
-       buf,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltget_attribute_string_f
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    CHARACTER(len=*), INTENT(in) :: attr_name          ! name of the attribute
-    INTEGER :: errcode                                 ! error code
-    CHARACTER(len=*), INTENT(inout) :: buf             ! data buffer
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER(size_t) :: attrlen                                 ! name length
-    INTEGER(size_t) :: buf_size                        ! buf size
-
-    INTERFACE
-       INTEGER FUNCTION h5ltget_attribute_string_c(loc_id,namelen,dset_name,attrlen,attr_name,buf,buf_size)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTGET_ATTRIBUTE_STRING_C'::h5ltget_attribute_string_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         !DEC$ATTRIBUTES reference :: attr_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         INTEGER(size_t) :: attrlen                                      ! length of attr name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         CHARACTER(len=*), INTENT(in) :: attr_name               ! name of the attribute
-         CHARACTER(len=*), INTENT(inout) :: buf                  ! data buffer
-         INTEGER(size_t) :: buf_size                 ! data buffer size
-       END FUNCTION h5ltget_attribute_string_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    attrlen = LEN(attr_name)
-    buf_size = LEN(buf)
-
-    errcode = h5ltget_attribute_string_c(loc_id,namelen,dset_name,attrlen,attr_name,buf,buf_size)
-
-  END SUBROUTINE h5ltget_attribute_string_f
-
-  !-------------------------------------------------------------------------
-  ! Query dataset functions
-  !-------------------------------------------------------------------------
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltget_dataset_ndims_f
-  !
-  ! Purpose: Gets the dimensionality of a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 30, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltget_dataset_ndims_f(loc_id,&
-       dset_name,&
-       rank,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltget_dataset_ndims_f
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER,          INTENT(inout) :: rank            ! rank
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltget_dataset_ndims_c(loc_id,namelen,dset_name,rank)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTGET_DATASET_NDIMS_C'::h5ltget_dataset_ndims_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER,          INTENT(inout) :: rank                 ! rank
-       END FUNCTION h5ltget_dataset_ndims_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltget_dataset_ndims_c(loc_id,namelen,dset_name,rank)
-
-  END SUBROUTINE h5ltget_dataset_ndims_f
-
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltfind_dataset_f
-  !
-  ! Purpose: Inquires if a dataset named dset_name exists attached
-  !           to the object loc_id.
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: October 05, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  INTEGER FUNCTION h5ltfind_dataset_f(loc_id,&
-       dset_name)
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltfind_dataset_f
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltfind_dataset_c(loc_id,namelen,dset_name)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTFIND_DATASET_C'::h5ltfind_dataset_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-       END FUNCTION h5ltfind_dataset_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltfind_dataset_c(loc_id,namelen,dset_name)
-    h5ltfind_dataset_f = errcode
-
-  END FUNCTION h5ltfind_dataset_f
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltget_dataset_info_f
-  !
-  ! Purpose: Gets information about a dataset
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 30, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltget_dataset_info_f(loc_id,&
-       dset_name,&
-       dims,&
-       type_class,&
-       type_size,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltget_dataset_info_f
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    INTEGER(hsize_t),DIMENSION(*),INTENT(inout):: dims ! dimensions
-    INTEGER, INTENT(inout)         :: type_class       ! type class
-    INTEGER(size_t), INTENT(inout) :: type_size        ! type size
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltget_dataset_info_c(loc_id,namelen,dset_name,dims,type_class,type_size)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTGET_DATASET_INFO_C'::h5ltget_dataset_info_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         INTEGER(hsize_t),DIMENSION(*),INTENT(inout):: dims      ! dimensions
-         INTEGER, INTENT(inout)         :: type_class            ! type class
-         INTEGER(size_t), INTENT(inout) :: type_size             ! type size
-       END FUNCTION h5ltget_dataset_info_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    errcode = h5ltget_dataset_info_c(loc_id,namelen,dset_name,dims,type_class,type_size)
-
-  END SUBROUTINE h5ltget_dataset_info_f
-
-
-  !-------------------------------------------------------------------------
-  ! Query attribute functions
-  !-------------------------------------------------------------------------
-
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltget_attribute_ndims_f
-  !
-  ! Purpose: Create and write an attribute
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: October 05, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltget_attribute_ndims_f(loc_id,&
-       dset_name,&
-       attr_name,&
-       rank,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltget_attribute_ndims_f
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    CHARACTER(len=*), INTENT(in) :: attr_name          ! name of the attribute
-    INTEGER,          INTENT(inout) :: rank            ! rank
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                                 ! name length
-    INTEGER(size_t) :: attrlen                                 ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltget_attribute_ndims_c(loc_id,namelen,dset_name,attrlen,attr_name,rank)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTGET_ATTRIBUTE_NDIMS_C'::h5ltget_attribute_ndims_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         !DEC$ATTRIBUTES reference :: attr_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(size_t) :: namelen                                      ! length of name buffer
-         INTEGER(size_t) :: attrlen                                      ! length of attr name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         CHARACTER(len=*), INTENT(in) :: attr_name               ! name of the attribute
-         INTEGER,          INTENT(inout) :: rank                 ! rank
-       END FUNCTION h5ltget_attribute_ndims_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    attrlen = LEN(attr_name)
-    errcode = h5ltget_attribute_ndims_c(loc_id,namelen,dset_name,attrlen,attr_name,rank)
-
-  END SUBROUTINE h5ltget_attribute_ndims_f
-
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltget_attribute_info_f
-  !
-  ! Purpose: Gets information about an attribute
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: pvn at ncsa.uiuc.edu
-  !
-  ! Date: September 30, 2004
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltget_attribute_info_f(loc_id,&
-       dset_name,&
-       attr_name,&
-       dims,&
-       type_class,&
-       type_size,&
-       errcode )
-
-    IMPLICIT NONE
-
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltget_attribute_info_f
-    !DEC$endif
-    !
-
-    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-    CHARACTER(len=*), INTENT(in) :: dset_name          ! name of the dataset
-    CHARACTER(len=*), INTENT(in) :: attr_name          ! name of the attribute
-    INTEGER(hsize_t),DIMENSION(*),INTENT(inout):: dims ! dimensions
-    INTEGER, INTENT(inout)         :: type_class       ! type class
-    INTEGER(size_t), INTENT(inout) :: type_size        ! type size
-    INTEGER :: errcode                                 ! error code
-    INTEGER(size_t) :: namelen                         ! name length
-    INTEGER(size_t) :: attrlen                                 ! name length
-
-    INTERFACE
-       INTEGER FUNCTION h5ltget_attribute_info_c(loc_id,namelen,dset_name,attrlen,attr_name,dims,type_class,type_size)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTGET_ATTRIBUTE_INFO_C'::h5ltget_attribute_info_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: dset_name
-         !DEC$ATTRIBUTES reference :: attr_name
-         INTEGER(hid_t),   INTENT(in) :: loc_id                  ! file or group identifier
-         INTEGER(size_t) :: namelen                              ! length of name buffer
-         INTEGER(size_t) :: attrlen                                      ! length of attr name buffer
-         CHARACTER(len=*), INTENT(in) :: dset_name               ! name of the dataset
-         CHARACTER(len=*), INTENT(in) :: attr_name               ! name of the attribute
-         INTEGER(hsize_t),DIMENSION(*),INTENT(inout):: dims      ! dimensions
-         INTEGER, INTENT(inout)         :: type_class            ! type class
-         INTEGER(size_t), INTENT(inout) :: type_size             ! type size
-       END FUNCTION h5ltget_attribute_info_c
-    END INTERFACE
-
-    namelen = LEN(dset_name)
-    attrlen = LEN(attr_name)
-    errcode = h5ltget_attribute_info_c(loc_id,namelen,dset_name,attrlen,attr_name,dims,type_class,type_size)
-
-  END SUBROUTINE h5ltget_attribute_info_f
-
-  !-------------------------------------------------------------------------
-  ! Function: h5ltpath_valid_f
-  !
-  ! Purpose: Validates a path 
-  !
-  ! Return: Success: 0, Failure: -1
-  !
-  ! Programmer: M. Scot Breitenfeld
-  !
-  ! Date: February 18, 2012
-  !
-  ! Comments:
-  !
-  ! Modifications:
-  !
-  !-------------------------------------------------------------------------
-
-  SUBROUTINE h5ltpath_valid_f(loc_id, path, check_object_valid, path_valid, errcode)
-
-    IMPLICIT NONE
-    !
-    !This definition is needed for Windows DLLs
-    !DEC$if defined(BUILD_HDF5_HL_DLL)
-    !DEC$attributes dllexport :: h5ltpath_valid_f
-    !DEC$endif
-    !
-    INTEGER(hid_t)  , INTENT(IN)  :: loc_id              ! An identifier of an object in the file.
-    CHARACTER(LEN=*), INTENT(IN)  :: path                ! Path to the object to check, relative to loc_id.
-    LOGICAL         , INTENT(IN)  :: check_object_valid  ! Indicates whether to check if the final component 
-                                                         !  of the path resolves to a valid object 
-    LOGICAL         , INTENT(OUT) :: path_valid          ! Object status
-    INTEGER         , INTENT(OUT) :: errcode             ! Error code: 0 on success and -1 on failure
-
-    INTEGER(size_t) :: pathlen
-    INTEGER :: check_object_valid_c
-    INTEGER :: status
-
-    INTERFACE
-       INTEGER FUNCTION h5ltpath_valid_c(loc_id, path, pathlen, check_object_valid_c)
-         USE h5global
-         IMPLICIT NONE
-         !DEC$IF DEFINED(HDF5F90_WINDOWS)
-         !DEC$ATTRIBUTES C,reference,decorate,alias:'H5LTPATH_VALID_C'::h5ltpath_valid_c
-         !DEC$ENDIF
-         !DEC$ATTRIBUTES reference :: path
-         INTEGER(hid_t),   INTENT(in) :: loc_id  
-         CHARACTER(len=*), INTENT(in) :: path
-         INTEGER(size_t) :: pathlen
-         INTEGER :: check_object_valid_c
-       END FUNCTION h5ltpath_valid_c
-    END INTERFACE
-
-    ! Initialize
-    path_valid = .FALSE.
-    errcode = 0
-    
-    check_object_valid_c = 0
-    IF(check_object_valid) check_object_valid_c = 1
-
-    pathlen = LEN(path)
-    status = h5ltpath_valid_c(loc_id, path, pathlen, check_object_valid_c)
-
-    IF(status.EQ.1)THEN
-       path_valid = .TRUE.
-    ELSE IF(status.LT.0)THEN
-       errcode = -1
-    ENDIF
-    
-  END SUBROUTINE h5ltpath_valid_f
-  !  end
-  !
-END MODULE H5LT
-
-
-
-
-
-
diff --git a/hl/fortran/src/H5TBfc.c b/hl/fortran/src/H5TBfc.c
index bf058fd..99a7800 100644
--- a/hl/fortran/src/H5TBfc.c
+++ b/hl/fortran/src/H5TBfc.c
@@ -37,7 +37,7 @@
 *-------------------------------------------------------------------------
 */
 int_f
-nh5tbmake_table_c(size_t_f *namelen1,
+h5tbmake_table_c(size_t_f *namelen1,
                   _fcd name1,
                   hid_t_f *loc_id,
                   size_t_f *namelen,
@@ -133,7 +133,7 @@ done:
         HDfree(c_field_types);
 
     return ret_value;
-} /* end nh5tbmake_table_c() */
+} /* end h5tbmake_table_c() */
 
 /*-------------------------------------------------------------------------
 * Function: h5tbwrite_field_name_c
@@ -151,7 +151,7 @@ done:
 *-------------------------------------------------------------------------
 */
 int_f
-nh5tbwrite_field_name_c(hid_t_f *loc_id,
+h5tbwrite_field_name_c(hid_t_f *loc_id,
                         size_t_f *namelen,
                         _fcd name,
                         size_t_f *namelen1,
@@ -190,65 +190,6 @@ done:
     return ret_value;
 }
 
-int_f
-nh5tbwrite_field_name_int_c(hid_t_f *loc_id,
-                            size_t_f *namelen,
-                            _fcd name,
-                            size_t_f *namelen1,
-                            _fcd field_name,
-                            hsize_t_f *start,
-                            hsize_t_f *nrecords,
-                            size_t_f *type_size,
-                            void *buf)
-{
-    return nh5tbwrite_field_name_c(loc_id, namelen, name, namelen1, field_name,
-            start, nrecords, type_size, buf);
-}
-
-int_f
-nh5tbwrite_field_name_fl_c(hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           size_t_f *namelen1,
-                           _fcd field_name,
-                           hsize_t_f *start,
-                           hsize_t_f *nrecords,
-                           size_t_f *type_size,
-                           void *buf)
-{
-    return nh5tbwrite_field_name_c(loc_id, namelen, name, namelen1, field_name,
-            start, nrecords, type_size, buf);
-}
-
-int_f
-nh5tbwrite_field_name_dl_c(hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           size_t_f *namelen1,
-                           _fcd field_name,
-                           hsize_t_f *start,
-                           hsize_t_f *nrecords,
-                           size_t_f *type_size,
-                           void *buf)
-{
-    return nh5tbwrite_field_name_c(loc_id, namelen, name, namelen1, field_name,
-            start, nrecords, type_size, buf);
-}
-
-int_f
-nh5tbwrite_field_name_st_c(hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           size_t_f *namelen1,
-                           _fcd field_name,
-                           hsize_t_f *start,
-                           hsize_t_f *nrecords,
-                           size_t_f *type_size,
-                           void *buf)
-{
-    return nh5tbwrite_field_name_c(loc_id, namelen, name, namelen1, field_name,
-            start, nrecords, type_size, buf);
-}
 
 /*-------------------------------------------------------------------------
 * Function: h5tbread_field_name_c
@@ -266,7 +207,7 @@ nh5tbwrite_field_name_st_c(hid_t_f *loc_id,
 *-------------------------------------------------------------------------
 */
 int_f
-nh5tbread_field_name_c(hid_t_f *loc_id,
+h5tbread_field_name_c(hid_t_f *loc_id,
                        size_t_f *namelen,
                        _fcd name,
                        size_t_f *namelen1,
@@ -305,66 +246,6 @@ done:
     return ret_value;
 }
 
-int_f
-nh5tbread_field_name_int_c(hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           size_t_f *namelen1,
-                           _fcd field_name,
-                           hsize_t_f *start,
-                           hsize_t_f *nrecords,
-                           size_t_f *type_size,
-                           void *buf)
-{
-    return nh5tbread_field_name_c(loc_id, namelen, name, namelen1, field_name,
-            start, nrecords, type_size, buf);
-}
-
-int_f
-nh5tbread_field_name_fl_c(hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          size_t_f *namelen1,
-                          _fcd field_name,
-                          hsize_t_f *start,
-                          hsize_t_f *nrecords,
-                          size_t_f *type_size,
-                          void *buf)
-{
-    return nh5tbread_field_name_c(loc_id, namelen, name, namelen1, field_name,
-            start, nrecords, type_size, buf);
-}
-
-int_f
-nh5tbread_field_name_dl_c(hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          size_t_f *namelen1,
-                          _fcd field_name,
-                          hsize_t_f *start,
-                          hsize_t_f *nrecords,
-                          size_t_f *type_size,
-                          void *buf)
-{
-    return nh5tbread_field_name_c(loc_id, namelen, name, namelen1, field_name,
-            start, nrecords, type_size, buf);
-}
-
-int_f
-nh5tbread_field_name_st_c(hid_t_f *loc_id,
-                          size_t_f *namelen,
-                          _fcd name,
-                          size_t_f *namelen1,
-                          _fcd field_name,
-                          hsize_t_f *start,
-                          hsize_t_f *nrecords,
-                          size_t_f *type_size,
-                          void *buf)
-{
-    return nh5tbread_field_name_c(loc_id, namelen, name, namelen1, field_name,
-            start, nrecords, type_size, buf);
-}
-
 /*-------------------------------------------------------------------------
 * Function: h5tbwrite_field_index_c
 *
@@ -381,7 +262,7 @@ nh5tbread_field_name_st_c(hid_t_f *loc_id,
 *-------------------------------------------------------------------------
 */
 int_f
-nh5tbwrite_field_index_c(hid_t_f *loc_id,
+h5tbwrite_field_index_c(hid_t_f *loc_id,
                          size_t_f *namelen,
                          _fcd name,
                          int_f *field_index,
@@ -416,62 +297,6 @@ done:
     return ret_value;
 }
 
-int_f
-nh5tbwrite_field_index_int_c(hid_t_f *loc_id,
-                             size_t_f *namelen,
-                             _fcd name,
-                             int_f *field_index,
-                             hsize_t_f *start,
-                             hsize_t_f *nrecords,
-                             size_t_f *type_size,
-                             void *buf)
-{
-    return nh5tbwrite_field_index_c(loc_id, namelen, name, field_index, start,
-            nrecords, type_size, buf);
-}
-
-int_f
-nh5tbwrite_field_index_fl_c(hid_t_f *loc_id,
-                            size_t_f *namelen,
-                            _fcd name,
-                            int_f *field_index,
-                            hsize_t_f *start,
-                            hsize_t_f *nrecords,
-                            size_t_f *type_size,
-                            void *buf)
-{
-    return nh5tbwrite_field_index_c(loc_id, namelen, name, field_index, start,
-            nrecords, type_size, buf);
-}
-
-int_f
-nh5tbwrite_field_index_dl_c(hid_t_f *loc_id,
-                            size_t_f *namelen,
-                            _fcd name,
-                            int_f *field_index,
-                            hsize_t_f *start,
-                            hsize_t_f *nrecords,
-                            size_t_f *type_size,
-                            void *buf)
-{
-    return nh5tbwrite_field_index_c(loc_id, namelen, name, field_index, start,
-            nrecords, type_size, buf);
-}
-
-int_f
-nh5tbwrite_field_index_st_c(hid_t_f *loc_id,
-                            size_t_f *namelen,
-                            _fcd name,
-                            int_f *field_index,
-                            hsize_t_f *start,
-                            hsize_t_f *nrecords,
-                            size_t_f *type_size,
-                            void *buf)
-{
-    return nh5tbwrite_field_index_c(loc_id, namelen, name, field_index, start,
-            nrecords, type_size, buf);
-}
-
 /*-------------------------------------------------------------------------
 * Function: h5tbread_field_index_c
 *
@@ -488,7 +313,7 @@ nh5tbwrite_field_index_st_c(hid_t_f *loc_id,
 *-------------------------------------------------------------------------
 */
 int_f
-nh5tbread_field_index_c(hid_t_f *loc_id,
+h5tbread_field_index_c(hid_t_f *loc_id,
                         size_t_f *namelen,
                         _fcd name,
                         int_f *field_index,
@@ -522,62 +347,6 @@ done:
     return ret_value;
 }
 
-int_f
-nh5tbread_field_index_int_c(hid_t_f *loc_id,
-                            size_t_f *namelen,
-                            _fcd name,
-                            int_f *field_index,
-                            hsize_t_f *start,
-                            hsize_t_f *nrecords,
-                            size_t_f *type_size,
-                            void *buf)
-{
-    return nh5tbread_field_index_c(loc_id, namelen, name, field_index, start,
-        nrecords, type_size, buf);
-}
-
-int_f
-nh5tbread_field_index_fl_c(hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *field_index,
-                           hsize_t_f *start,
-                           hsize_t_f *nrecords,
-                           size_t_f *type_size,
-                           void *buf)
-{
-    return nh5tbread_field_index_c(loc_id, namelen, name, field_index, start,
-            nrecords, type_size, buf);
-}
-
-int_f
-nh5tbread_field_index_dl_c(hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *field_index,
-                           hsize_t_f *start,
-                           hsize_t_f *nrecords,
-                           size_t_f *type_size,
-                           void *buf)
-{
-    return nh5tbread_field_index_c(loc_id, namelen, name, field_index, start,
-            nrecords, type_size, buf);
-}
-
-int_f
-nh5tbread_field_index_st_c(hid_t_f *loc_id,
-                           size_t_f *namelen,
-                           _fcd name,
-                           int_f *field_index,
-                           hsize_t_f *start,
-                           hsize_t_f *nrecords,
-                           size_t_f *type_size,
-                           void *buf)
-{
-    return nh5tbread_field_index_c(loc_id, namelen, name, field_index, start,
-            nrecords, type_size, buf);
-}
-
 /*-------------------------------------------------------------------------
 * Function: h5tbinsert_field_c
 *
@@ -594,7 +363,7 @@ nh5tbread_field_index_st_c(hid_t_f *loc_id,
 *-------------------------------------------------------------------------
 */
 int_f
-nh5tbinsert_field_c(hid_t_f *loc_id,
+h5tbinsert_field_c(hid_t_f *loc_id,
                     size_t_f *namelen,
                     _fcd name,
                     size_t_f *namelen1,
@@ -631,62 +400,6 @@ done:
     return ret_value;
 }
 
-int_f
-nh5tbinsert_field_int_c(hid_t_f *loc_id,
-                        size_t_f *namelen,
-                        _fcd name,
-                        size_t_f *namelen1,
-                        _fcd field_name,
-                        hid_t_f *field_type,
-                        int_f *position,
-                        void *buf)
-{
-    return nh5tbinsert_field_c(loc_id, namelen, name, namelen1, field_name,
-            field_type, position, buf);
-}
-
-int_f
-nh5tbinsert_field_fl_c(hid_t_f *loc_id,
-                       size_t_f *namelen,
-                       _fcd name,
-                       size_t_f *namelen1,
-                       _fcd field_name,
-                       hid_t_f *field_type,
-                       int_f *position,
-                       void *buf)
-{
-    return nh5tbinsert_field_c(loc_id, namelen, name, namelen1, field_name,
-            field_type, position, buf);
-}
-
-int_f
-nh5tbinsert_field_dl_c(hid_t_f *loc_id,
-                       size_t_f *namelen,
-                       _fcd name,
-                       size_t_f *namelen1,
-                       _fcd field_name,
-                       hid_t_f *field_type,
-                       int_f *position,
-                       void *buf)
-{
-    return nh5tbinsert_field_c(loc_id, namelen, name, namelen1, field_name,
-            field_type, position, buf);
-}
-
-int_f
-nh5tbinsert_field_st_c(hid_t_f *loc_id,
-                       size_t_f *namelen,
-                       _fcd name,
-                       size_t_f *namelen1,
-                       _fcd field_name,
-                       hid_t_f *field_type,
-                       int_f *position,
-                       void *buf)
-{
-    return nh5tbinsert_field_c(loc_id, namelen, name, namelen1, field_name,
-            field_type, position, buf);
-}
-
 /*-------------------------------------------------------------------------
 * Function: h5tbdelete_field_c
 *
@@ -703,7 +416,7 @@ nh5tbinsert_field_st_c(hid_t_f *loc_id,
 *-------------------------------------------------------------------------
 */
 int_f
-nh5tbdelete_field_c(hid_t_f *loc_id,
+h5tbdelete_field_c(hid_t_f *loc_id,
                     size_t_f *namelen,
                     _fcd name,
                     size_t_f *namelen1,
@@ -752,7 +465,7 @@ done:
 *-------------------------------------------------------------------------
 */
 int_f
-nh5tbget_table_info_c(hid_t_f *loc_id,
+h5tbget_table_info_c(hid_t_f *loc_id,
                       size_t_f *namelen,
                       _fcd name,
                       hsize_t_f *nfields,
@@ -802,7 +515,7 @@ done:
 *-------------------------------------------------------------------------
 */
 int_f
-nh5tbget_field_info_c(hid_t_f *loc_id,
+h5tbget_field_info_c(hid_t_f *loc_id,
                       size_t_f *namelen,
                       _fcd name,
                       hsize_t_f *nfields,
diff --git a/hl/fortran/src/H5TBff.F90 b/hl/fortran/src/H5TBff.F90
new file mode 100644
index 0000000..448d607
--- /dev/null
+++ b/hl/fortran/src/H5TBff.F90
@@ -0,0 +1,848 @@
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+!
+! This file contains FORTRAN interfaces for H5TB functions
+!
+!
+! NOTES
+!
+!       _____ __  __ _____   ____  _____ _______       _   _ _______
+!      |_   _|  \/  |  __ \ / __ \|  __ \__   __|/\   | \ | |__   __|
+! ****   | | | \  / | |__) | |  | | |__) | | |  /  \  |  \| |  | |    ****
+! ****   | | | |\/| |  ___/| |  | |  _  /  | | / /\ \ | . ` |  | |    ****
+! ****  _| |_| |  | | |    | |__| | | \ \  | |/ ____ \| |\  |  | |    ****
+!      |_____|_|  |_|_|     \____/|_|  \_\ |_/_/    \_\_| \_|  |_|
+!                             
+!  If you add a new function here then you MUST add the function name to the
+!  Windows dll file 'hdf5_hl_fortrandll.def.in' in the hl/fortran/src directory.
+!  This is needed for Windows based operating systems.
+!
+#include "H5config_f.inc"
+
+MODULE h5tb_CONST
+  
+  USE, INTRINSIC :: ISO_C_BINDING
+  USE h5fortran_types
+  USE hdf5
+
+  INTERFACE h5tbwrite_field_name_f
+     MODULE PROCEDURE h5tbwrite_field_name_f_int
+     MODULE PROCEDURE h5tbwrite_field_name_f_string
+  END INTERFACE
+  
+  INTERFACE h5tbread_field_name_f
+     MODULE PROCEDURE h5tbread_field_name_f_int
+     MODULE PROCEDURE h5tbread_field_name_f_string
+  END INTERFACE
+  
+  INTERFACE h5tbwrite_field_index_f
+     MODULE PROCEDURE h5tbwrite_field_index_f_int
+     MODULE PROCEDURE h5tbwrite_field_index_f_string
+  END INTERFACE
+  
+  INTERFACE h5tbread_field_index_f
+     MODULE PROCEDURE h5tbread_field_index_f_int
+     MODULE PROCEDURE h5tbread_field_index_f_string
+  END INTERFACE
+  
+  INTERFACE h5tbinsert_field_f
+     MODULE PROCEDURE h5tbinsert_field_f_int
+     MODULE PROCEDURE h5tbinsert_field_f_string
+  END INTERFACE
+
+  INTERFACE
+     INTEGER FUNCTION h5tbwrite_field_name_c(loc_id,namelen,dset_name,namelen1,field_name,&
+          start,nrecords,type_size,buf) &
+          BIND(C,NAME='h5tbwrite_field_name_c')
+       IMPORT :: C_CHAR, C_PTR
+       IMPORT :: HID_T, SIZE_T, HSIZE_T
+       IMPLICIT NONE
+       INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name    ! name of the dataset
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: field_name   ! name of the field
+       INTEGER(hsize_t), INTENT(in) :: start                            ! start record
+       INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
+       INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
+       TYPE(C_PTR), VALUE :: buf                                        ! data buffer
+       INTEGER :: errcode                                               ! error code
+       INTEGER(size_t) :: namelen                                       ! name length
+       INTEGER(size_t) :: namelen1                                      ! name length
+     END FUNCTION h5tbwrite_field_name_c
+  END INTERFACE
+
+  INTERFACE
+     INTEGER FUNCTION h5tbread_field_name_c(loc_id,namelen,dset_name,namelen1,field_name, &
+          start,nrecords,type_size,buf) &
+          BIND(C,NAME='h5tbread_field_name_c')
+       IMPORT :: C_CHAR, C_PTR
+       IMPORT :: HID_T, SIZE_T, HSIZE_T
+       IMPLICIT NONE
+       INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name    ! name of the dataset
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: field_name   ! name of the field
+       INTEGER(hsize_t), INTENT(in) :: start                            ! start record
+       INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
+       INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
+       TYPE(C_PTR), VALUE :: buf                                        ! data buffer
+       INTEGER :: errcode                                               ! error code
+       INTEGER(size_t) :: namelen                                       ! name length
+       INTEGER(size_t) :: namelen1                                      ! name length
+     END FUNCTION h5tbread_field_name_c
+  END INTERFACE
+
+  INTERFACE
+     INTEGER FUNCTION h5tbwrite_field_index_c(loc_id,namelen,dset_name,field_index,&
+          start,nrecords,type_size,buf) &
+          BIND(C,NAME='h5tbwrite_field_index_c')
+       IMPORT :: C_CHAR, C_PTR
+       IMPORT :: HID_T, SIZE_T, HSIZE_T
+       IMPLICIT NONE
+       INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name    ! name of the dataset
+       INTEGER, INTENT(in) :: field_index                               ! index
+       INTEGER(hsize_t), INTENT(in) :: start                            ! start record
+       INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
+       INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
+       TYPE(C_PTR), VALUE :: buf                                        ! data buffer
+       INTEGER :: errcode                                               ! error code
+       INTEGER(size_t) :: namelen                                       ! name length
+     END FUNCTION h5tbwrite_field_index_c
+  END INTERFACE
+
+  INTERFACE
+     INTEGER FUNCTION h5tbread_field_index_c(loc_id,namelen,dset_name,field_index,&
+          start,nrecords,type_size,buf) &
+          BIND(C,NAME='h5tbread_field_index_c')
+       IMPORT :: C_CHAR, C_PTR
+       IMPORT :: HID_T, SIZE_T, HSIZE_T
+       IMPLICIT NONE
+       INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name    ! name of the dataset
+       INTEGER, INTENT(in) :: field_index                               ! index
+       INTEGER(hsize_t), INTENT(in) :: start                            ! start record
+       INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
+       INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
+       TYPE(C_PTR), VALUE :: buf                                        ! data buffer
+       INTEGER :: errcode                                               ! error code
+       INTEGER(size_t) :: namelen                                       ! name length
+     END FUNCTION h5tbread_field_index_c
+  END INTERFACE
+
+
+  INTERFACE
+     INTEGER FUNCTION h5tbinsert_field_c(loc_id,namelen,dset_name,namelen1,field_name,&
+          field_type,field_index,buf) &
+          BIND(C,NAME='h5tbinsert_field_c')
+       IMPORT :: C_CHAR, C_PTR
+       IMPORT :: HID_T, SIZE_T, HSIZE_T
+       IMPLICIT NONE
+       INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name                        ! name of the dataset
+       CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: field_name                       ! name of the field
+       INTEGER(hid_t), INTENT(in)   :: field_type                       ! field type
+       INTEGER, INTENT(in) :: field_index                               ! field_index
+       TYPE(C_PTR), VALUE :: buf                                        ! data buffer
+       INTEGER(size_t) :: namelen                                       ! name length
+       INTEGER(size_t) :: namelen1                                      ! name length length
+     END FUNCTION h5tbinsert_field_c
+  END INTERFACE
+  
+CONTAINS
+
+!-------------------------------------------------------------------------
+! Function: h5tbmake_table_f
+!
+! Purpose: Make a table
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 06, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE h5tbmake_table_f(table_title,&
+       loc_id,&
+       dset_name,&
+       nfields,&
+       nrecords,&
+       type_size,&
+       field_names,&
+       field_offset,&
+       field_types,&
+       chunk_size,&
+       compress,&
+       errcode )
+
+    IMPLICIT NONE
+    CHARACTER(LEN=*), INTENT(in) :: table_title                      ! name of the dataset
+    INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
+    INTEGER(hsize_t), INTENT(in) :: nfields                          ! fields
+    INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
+    INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
+    CHARACTER(LEN=*), DIMENSION(1:nfields), INTENT(in) :: field_names  ! field names
+    INTEGER(size_t),  DIMENSION(1:nfields), INTENT(in) :: field_offset ! field offset
+    INTEGER(hid_t),   DIMENSION(1:nfields), INTENT(in) :: field_types  ! field types
+    INTEGER(hsize_t), INTENT(in) :: chunk_size                       ! chunk size
+    INTEGER,          INTENT(in) :: compress                         ! compress
+    INTEGER(size_t) :: namelen                                       ! name length
+    INTEGER(size_t) :: namelen1                                      ! name length
+    INTEGER :: errcode                                               ! error code
+    INTEGER(size_t), DIMENSION(1:nfields) :: char_len_field_names    ! field name lengths
+    INTEGER(size_t) :: max_char_size_field_names                     ! character len of field names
+    INTEGER(hsize_t) :: i                                            ! general purpose integer
+
+    INTERFACE
+       INTEGER FUNCTION h5tbmake_table_c(namelen1,&
+            table_title,&
+            loc_id,&
+            namelen,&
+            dset_name,&
+            nfields,&
+            nrecords,&
+            type_size,&
+            field_offset,&
+            field_types,&
+            chunk_size,&
+            compress,&
+            char_len_field_names,&
+            max_char_size_field_names,&
+            field_names) &
+            BIND(C,NAME='h5tbmake_table_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: table_title  ! name of the dataset
+         INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name    ! name of the dataset
+         INTEGER(hsize_t), INTENT(in) :: nfields                          ! fields
+         INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
+         INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
+         CHARACTER(KIND=C_CHAR), DIMENSION(nfields), INTENT(in) :: field_names  ! field names
+         INTEGER(size_t),  DIMENSION(nfields), INTENT(in) :: field_offset ! field offset
+         INTEGER(hid_t),   DIMENSION(nfields), INTENT(in) :: field_types  ! field types
+         INTEGER(hsize_t), INTENT(in) :: chunk_size                       ! chunk size
+         INTEGER,          INTENT(in) :: compress                         ! compress
+         INTEGER(size_t) :: namelen                                       ! name length
+         INTEGER(size_t) :: namelen1                                      ! name length
+         INTEGER(size_t), DIMENSION(nfields) :: char_len_field_names      ! field name's lengths
+         INTEGER(size_t) :: max_char_size_field_names                     ! character len of field names
+       END FUNCTION h5tbmake_table_c
+    END INTERFACE
+ 
+    namelen  = LEN(dset_name)
+    namelen1 = LEN(table_title)
+ 
+    ! Find the size of each character string in the array
+    DO i = 1, nfields
+       char_len_field_names(i) = LEN_TRIM(field_names(i))
+    END DO
+    
+    max_char_size_field_names = LEN(field_names(1)) 
+
+    errcode = h5tbmake_table_c(namelen1,&
+         table_title,&
+         loc_id,&
+         namelen,&
+         dset_name,&
+         nfields,&
+         nrecords,&
+         type_size,&
+         field_offset,&
+         field_types,&
+         chunk_size,&
+         compress,&
+         char_len_field_names, &
+         max_char_size_field_names, &
+         field_names)
+
+  END SUBROUTINE h5tbmake_table_f
+
+!-------------------------------------------------------------------------
+! Function: h5tbwrite_field_name_f_int
+!
+! Purpose: Writes one field
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 12, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE h5tbwrite_field_name_f_int(loc_id,&
+       dset_name,&
+       field_name,&
+       start,&
+       nrecords,&
+       type_size,&
+       buf,&
+       errcode )
+    
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
+    INTEGER(hsize_t), INTENT(in) :: start                            ! start record
+    INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
+    INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
+    INTEGER, INTENT(in), DIMENSION(*), TARGET :: buf                         ! data buffer
+    INTEGER :: errcode                                               ! error code
+    INTEGER(size_t) :: namelen                                       ! name length
+    INTEGER(size_t) :: namelen1                                      ! name length
+    TYPE(C_PTR) :: f_ptr
+    
+    f_ptr = C_LOC(buf(1))
+    namelen  = LEN(dset_name)
+    namelen1 = LEN(field_name)
+    
+    errcode = h5tbwrite_field_name_c(loc_id,namelen,dset_name,namelen1,field_name,&
+         start,nrecords,type_size,f_ptr)
+    
+  END SUBROUTINE h5tbwrite_field_name_f_int
+
+
+  SUBROUTINE h5tbwrite_field_name_f_string(loc_id,&
+       dset_name,&
+       field_name,&
+       start,&
+       nrecords,&
+       type_size,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+
+    INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
+    INTEGER(hsize_t), INTENT(in) :: start                            ! start record
+    INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
+    INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
+    CHARACTER(LEN=*), INTENT(in), DIMENSION(*), TARGET :: buf        ! data buffer
+    INTEGER :: errcode                                               ! error code
+    INTEGER(size_t) :: namelen                                       ! name length
+    INTEGER(size_t) :: namelen1
+    TYPE(C_PTR) :: f_ptr
+    
+    f_ptr = C_LOC(buf(1)(1:1))
+
+    namelen  = LEN(dset_name)
+    namelen1 = LEN(field_name)
+    
+    errcode = h5tbwrite_field_name_c(loc_id,namelen,dset_name,namelen1,field_name,&
+         start,nrecords,type_size,f_ptr)
+    
+  END SUBROUTINE h5tbwrite_field_name_f_string
+
+
+!-------------------------------------------------------------------------
+! Function: h5tbread_field_name_f_int
+!
+! Purpose: Reads one field
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 12, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE h5tbread_field_name_f_int(loc_id,&
+       dset_name,&
+       field_name,&
+       start,&
+       nrecords,&
+       type_size,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+
+    INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
+    INTEGER(hsize_t), INTENT(in) :: start                            ! start record
+    INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
+    INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
+    INTEGER, INTENT(in), DIMENSION(*), TARGET :: buf                 ! data buffer
+    INTEGER :: errcode                                               ! error code
+    INTEGER(size_t) :: namelen                                       ! name length
+    INTEGER(size_t) :: namelen1
+    TYPE(C_PTR) :: f_ptr
+    
+    f_ptr = C_LOC(buf(1))                                    ! name length
+
+    namelen  = LEN(dset_name)
+    namelen1 = LEN(field_name)
+    
+    errcode = h5tbread_field_name_c(loc_id,namelen,dset_name,namelen1,field_name,&
+         start,nrecords,type_size,f_ptr)
+    
+  END SUBROUTINE h5tbread_field_name_f_int
+
+  SUBROUTINE h5tbread_field_name_f_string(loc_id,&
+       dset_name,&
+       field_name,&
+       start,&
+       nrecords,&
+       type_size,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
+    INTEGER(hsize_t), INTENT(in) :: start                            ! start record
+    INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
+    INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
+    CHARACTER(LEN=*), INTENT(in), DIMENSION(*), TARGET :: buf        ! data buffer
+    INTEGER :: errcode                                               ! error code
+    INTEGER(size_t) :: namelen                                       ! name length
+    INTEGER(size_t) :: namelen1                                      ! name length
+    TYPE(C_PTR) :: f_ptr
+    
+    f_ptr = C_LOC(buf(1)(1:1)) 
+
+    namelen  = LEN(dset_name)
+    namelen1 = LEN(field_name)
+    
+    errcode = h5tbread_field_name_c(loc_id,namelen,dset_name,namelen1,field_name,&
+         start,nrecords,type_size,f_ptr)
+    
+  END SUBROUTINE h5tbread_field_name_f_string
+
+
+!-------------------------------------------------------------------------
+! Function: h5tbwrite_field_index_f_int
+!
+! Purpose: Writes one field
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 12, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+  
+  SUBROUTINE h5tbwrite_field_index_f_int(loc_id,&
+       dset_name,&
+       field_index,&
+       start,&
+       nrecords,&
+       type_size,&
+       buf,&
+       errcode )
+    
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
+    INTEGER, INTENT(in) :: field_index                               ! index
+    INTEGER(hsize_t), INTENT(in) :: start                            ! start record
+    INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
+    INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
+    INTEGER, INTENT(in), DIMENSION(*), TARGET :: buf                 ! data buffer
+    INTEGER :: errcode                                               ! error code
+    INTEGER(size_t) :: namelen                                       ! name length
+    TYPE(C_PTR) :: f_ptr
+    
+    f_ptr = C_LOC(buf(1))
+
+    namelen  = LEN(dset_name)
+    
+    errcode = h5tbwrite_field_index_c(loc_id,namelen,dset_name,field_index,&
+         start,nrecords,type_size,f_ptr)
+    
+  END SUBROUTINE h5tbwrite_field_index_f_int
+
+  SUBROUTINE h5tbwrite_field_index_f_string(loc_id,&
+       dset_name,&
+       field_index,&
+       start,&
+       nrecords,&
+       type_size,&
+       buf,&
+       errcode )
+    
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
+    INTEGER, INTENT(in) :: field_index                               ! index
+    INTEGER(hsize_t), INTENT(in) :: start                            ! start record
+    INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
+    INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
+    CHARACTER(LEN=*), INTENT(in), DIMENSION(*), TARGET :: buf                ! data buffer
+    INTEGER :: errcode                                               ! error code
+    INTEGER(size_t) :: namelen                                       ! name length
+    TYPE(C_PTR) :: f_ptr
+    
+    f_ptr = C_LOC(buf(1)(1:1))
+    namelen  = LEN(dset_name)
+    
+    errcode = h5tbwrite_field_index_c(loc_id,namelen,dset_name,field_index,&
+         start,nrecords,type_size,f_ptr)
+    
+  END SUBROUTINE h5tbwrite_field_index_f_string
+
+
+!-------------------------------------------------------------------------
+! Function: h5tbread_field_index_f_int
+!
+! Purpose: Reads one field
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 12, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE h5tbread_field_index_f_int(loc_id,&
+       dset_name,&
+       field_index,&
+       start,&
+       nrecords,&
+       type_size,&
+       buf,&
+       errcode )
+    
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
+    INTEGER, INTENT(in) :: field_index                               ! index
+    INTEGER(hsize_t), INTENT(in) :: start                            ! start record
+    INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
+    INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
+    INTEGER, INTENT(in), DIMENSION(*), TARGET :: buf                 ! data buffer
+    INTEGER :: errcode                                               ! error code
+    INTEGER(size_t) :: namelen                                       ! name length
+    TYPE(C_PTR) :: f_ptr
+    
+    f_ptr = C_LOC(buf(1))
+    namelen  = LEN(dset_name)
+    
+    errcode = h5tbread_field_index_c(loc_id,namelen,dset_name,field_index,&
+         start,nrecords,type_size,f_ptr)
+    
+  END SUBROUTINE h5tbread_field_index_f_int
+
+  SUBROUTINE h5tbread_field_index_f_string(loc_id,&
+       dset_name,&
+       field_index,&
+       start,&
+       nrecords,&
+       type_size,&
+       buf,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
+    INTEGER, INTENT(in) :: field_index                               ! index
+    INTEGER(hsize_t), INTENT(in) :: start                            ! start record
+    INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
+    INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
+    CHARACTER(LEN=*), INTENT(in), DIMENSION(*), TARGET :: buf        ! data buffer
+    INTEGER :: errcode                                               ! error code
+    INTEGER(size_t) :: namelen                                       ! name length
+    TYPE(C_PTR) :: f_ptr
+    
+    f_ptr = C_LOC(buf(1)(1:1))
+    namelen  = LEN(dset_name)
+    
+    errcode = h5tbread_field_index_c(loc_id,namelen,dset_name,field_index,&
+         start,nrecords,type_size,f_ptr)
+    
+  END SUBROUTINE h5tbread_field_index_f_string
+
+!-------------------------------------------------------------------------
+! Function: h5tbinsert_field_f
+!
+! Purpose: Inserts one field
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 13, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE h5tbinsert_field_f_int(loc_id,&
+       dset_name,&
+       field_name,&
+       field_type,&
+       field_index,&
+       buf,&
+       errcode )
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
+    INTEGER(hid_t), INTENT(in)   :: field_type                       ! field type
+    INTEGER, INTENT(in) :: field_index                               ! field_index
+    INTEGER, INTENT(in), DIMENSION(*), TARGET :: buf                 ! data buffer
+    INTEGER(size_t) :: namelen                                       ! name length
+    INTEGER(size_t) :: namelen1                                      ! name length
+    INTEGER :: errcode                                               ! error code
+    TYPE(C_PTR) :: f_ptr
+    
+    f_ptr = C_LOC(buf(1))
+
+    namelen  = LEN(dset_name)
+    namelen1 = LEN(field_name)
+    
+    errcode = h5tbinsert_field_c(loc_id,namelen,dset_name,namelen1,field_name,&
+         field_type,field_index,f_ptr)
+
+  END SUBROUTINE h5tbinsert_field_f_int
+
+  SUBROUTINE h5tbinsert_field_f_string(loc_id,&
+       dset_name,&
+       field_name,&
+       field_type,&
+       field_index,&
+       buf,&
+       errcode )
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
+    INTEGER(hid_t), INTENT(in)   :: field_type                       ! field type
+    INTEGER, INTENT(in) :: field_index                               ! field_index
+    CHARACTER(LEN=*), INTENT(in), DIMENSION(*), TARGET :: buf        ! data buffer
+    INTEGER(size_t) :: namelen                                       ! name length
+    INTEGER(size_t) :: namelen1                                      ! name length
+    INTEGER :: errcode                                               ! error code
+    TYPE(C_PTR) :: f_ptr
+    
+    f_ptr = C_LOC(buf(1)(1:1))
+    
+    namelen  = LEN(dset_name)
+    namelen1 = LEN(field_name)
+    
+    errcode = h5tbinsert_field_c(loc_id,namelen,dset_name,namelen1,field_name,&
+         field_type,field_index,f_ptr)
+    
+  END SUBROUTINE h5tbinsert_field_f_string
+
+!-------------------------------------------------------------------------
+! Function: h5tbdelete_field_f
+!
+! Purpose: Inserts one field
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 13, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE h5tbdelete_field_f(loc_id,&
+       dset_name,&
+       field_name,&
+       errcode )
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
+    CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
+    INTEGER(size_t) :: namelen                                       ! name length
+    INTEGER(size_t) :: namelen1                                      ! name length
+    INTEGER :: errcode                                               ! error code
+
+
+    INTERFACE
+       INTEGER FUNCTION h5tbdelete_field_c(loc_id,namelen,dset_name,namelen1,field_name) &
+            BIND(C,NAME='h5tbdelete_field_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(HID_T),   INTENT(IN) :: loc_id                           ! file or group identifier
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: dset_name    ! name of the dataset
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: field_name   ! name of the field
+         INTEGER(size_t) :: namelen                                       ! name length
+         INTEGER(size_t) :: namelen1                                      ! name length length
+       END FUNCTION h5tbdelete_field_c
+    END INTERFACE
+
+    namelen  = LEN(dset_name)
+    namelen1 = LEN(field_name)
+
+    errcode = h5tbdelete_field_c(loc_id,namelen,dset_name,namelen1,field_name)
+
+  END SUBROUTINE h5tbdelete_field_f
+
+!-------------------------------------------------------------------------
+! Function: h5tbget_table_info_f
+!
+! Purpose: Gets the number of records and fields of a table
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 13, 2004
+!
+! Comments:
+!
+! Modifications:
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE h5tbget_table_info_f(loc_id,&
+       dset_name,&
+       nfields,&
+       nrecords,&
+       errcode )
+
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
+    INTEGER(hsize_t), INTENT(inout):: nfields          ! nfields
+    INTEGER(hsize_t), INTENT(inout):: nrecords         ! nrecords
+    INTEGER :: errcode                                 ! error code
+    INTEGER(size_t) :: namelen                         ! name length
+
+    INTERFACE
+       INTEGER FUNCTION h5tbget_table_info_c(loc_id,namelen,dset_name,nfields,nrecords) &
+            BIND(C,NAME='h5tbget_table_info_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name ! name of the dataset
+         INTEGER(hsize_t), INTENT(inout):: nfields          ! nfields
+         INTEGER(hsize_t), INTENT(inout):: nrecords         ! nrecords
+         INTEGER(size_t) :: namelen                         ! name length
+       END FUNCTION h5tbget_table_info_c
+    END INTERFACE
+
+    namelen = LEN(dset_name)
+    errcode = h5tbget_table_info_c(loc_id,namelen,dset_name,nfields,nrecords)
+    
+  END SUBROUTINE h5tbget_table_info_f
+  
+
+!-------------------------------------------------------------------------
+! Function: h5tbget_field_info_f
+!
+! Purpose: Get information about fields
+!
+! Return: Success: 0, Failure: -1
+!
+! Programmer: pvn at ncsa.uiuc.edu
+!
+! Date: October 13, 2004
+!
+! Comments:
+!
+! Modifications: 
+!  Added optional parameter for returning the maximum character length
+!  in the field name array. March 3, 2011 
+!
+!-------------------------------------------------------------------------
+
+  SUBROUTINE h5tbget_field_info_f(loc_id,&
+       dset_name,&
+       nfields,&
+       field_names,&
+       field_sizes,&
+       field_offsets,&
+       type_size,&
+       errcode, maxlen_out )
+    
+    IMPLICIT NONE
+    INTEGER(hid_t),   INTENT(in) :: loc_id                                ! file or group identifier
+    CHARACTER(LEN=*), INTENT(in) :: dset_name                             ! name of the dataset
+    INTEGER(hsize_t), INTENT(in) :: nfields                               ! nfields
+    CHARACTER(LEN=*), DIMENSION(nfields), INTENT(inout) :: field_names    ! field names
+    INTEGER(size_t),  DIMENSION(nfields), INTENT(inout) :: field_sizes    ! field sizes
+    INTEGER(size_t),  DIMENSION(nfields), INTENT(inout) :: field_offsets  ! field offsets
+    INTEGER(size_t),  INTENT(inout):: type_size                           ! type size
+    INTEGER :: errcode                                                    ! error code
+    INTEGER, OPTIONAL :: maxlen_out                                       ! maximum character len of the field names
+    INTEGER(size_t) :: namelen                                            ! name length
+    INTEGER(size_t), DIMENSION(nfields) :: namelen2                       ! name lengths
+    INTEGER(hsize_t) :: i                                                          ! general purpose integer
+    INTEGER(size_t) :: maxlen
+    INTEGER(size_t) :: c_maxlen_out
+    
+    INTERFACE
+       INTEGER FUNCTION h5tbget_field_info_c(loc_id,namelen,dset_name,nfields,&
+            field_sizes,field_offsets,type_size,namelen2, maxlen, field_names, c_maxlen_out) &
+            BIND(C,NAME='h5tbget_field_info_c')
+         IMPORT :: C_CHAR
+         IMPORT :: HID_T, SIZE_T, HSIZE_T
+         IMPLICIT NONE
+         INTEGER(hid_t),   INTENT(in) :: loc_id                                 ! file or group identifier
+         CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(in) :: dset_name          ! name of the dataset
+         INTEGER(hsize_t), INTENT(in):: nfields                                 ! nfields
+         CHARACTER(KIND=C_CHAR), DIMENSION(1:nfields), INTENT(inout) :: field_names   ! field names
+         INTEGER(size_t),  DIMENSION(1:nfields), INTENT(inout) :: field_sizes   ! field sizes
+         INTEGER(size_t),  DIMENSION(1:nfields), INTENT(inout) :: field_offsets ! field offsets
+         INTEGER(size_t),  INTENT(inout):: type_size                            ! type size
+         INTEGER(size_t) :: namelen                                             ! name length
+         INTEGER(size_t) :: maxlen                                              ! maxiumum length of input field names
+         INTEGER(size_t), DIMENSION(1:nfields) :: namelen2                      ! name lengths
+         INTEGER(size_t) :: c_maxlen_out                  ! maximum character length of a field array element 
+       END FUNCTION h5tbget_field_info_c
+    END INTERFACE
+
+    namelen = LEN(dset_name)
+    DO i = 1, nfields
+       namelen2(i) = LEN_TRIM(field_names(i))
+    END DO
+    maxlen = LEN(field_names(1))
+    c_maxlen_out = 0
+    
+    errcode = h5tbget_field_info_c(loc_id, namelen,dset_name, nfields, &
+         field_sizes, field_offsets, type_size, namelen2, maxlen, field_names, c_maxlen_out)
+    
+    IF(PRESENT(maxlen_out)) maxlen_out = c_maxlen_out
+    
+  END SUBROUTINE h5tbget_field_info_f
+  
+END MODULE H5TB_CONST
+
+
+
+
+
+
diff --git a/hl/fortran/src/H5TBff.f90 b/hl/fortran/src/H5TBff.f90
deleted file mode 100644
index 5846f49..0000000
--- a/hl/fortran/src/H5TBff.f90
+++ /dev/null
@@ -1,1900 +0,0 @@
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!
-! This file contains FORTRAN90 interfaces for H5TB functions
-!
-
-MODULE h5tb
-USE h5fortran_types
-USE hdf5
-
-
-INTERFACE h5tbwrite_field_name_f
- MODULE PROCEDURE h5tbwrite_field_name_f_int
- MODULE PROCEDURE h5tbwrite_field_name_f_float
- MODULE PROCEDURE h5tbwrite_field_name_f_double
- MODULE PROCEDURE h5tbwrite_field_name_f_string
-END INTERFACE
-
-INTERFACE h5tbread_field_name_f
- MODULE PROCEDURE h5tbread_field_name_f_int
- MODULE PROCEDURE h5tbread_field_name_f_float
- MODULE PROCEDURE h5tbread_field_name_f_double
- MODULE PROCEDURE h5tbread_field_name_f_string
-END INTERFACE
-
-INTERFACE h5tbwrite_field_index_f
- MODULE PROCEDURE h5tbwrite_field_index_f_int
- MODULE PROCEDURE h5tbwrite_field_index_f_float
- MODULE PROCEDURE h5tbwrite_field_index_f_double
- MODULE PROCEDURE h5tbwrite_field_index_f_string
-END INTERFACE
-
-INTERFACE h5tbread_field_index_f
- MODULE PROCEDURE h5tbread_field_index_f_int
- MODULE PROCEDURE h5tbread_field_index_f_float
- MODULE PROCEDURE h5tbread_field_index_f_double
- MODULE PROCEDURE h5tbread_field_index_f_string
-END INTERFACE
-
-
-INTERFACE h5tbinsert_field_f
- MODULE PROCEDURE h5tbinsert_field_f_int
- MODULE PROCEDURE h5tbinsert_field_f_float
- MODULE PROCEDURE h5tbinsert_field_f_double
- MODULE PROCEDURE h5tbinsert_field_f_string
-END INTERFACE
-
-
-CONTAINS
-
-
-!-------------------------------------------------------------------------
-! Function: h5tbmake_table_f
-!
-! Purpose: Make a table
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 06, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbmake_table_f(table_title,&
-                            loc_id,&
-                            dset_name,&
-                            nfields,&
-                            nrecords,&
-                            type_size,&
-                            field_names,&
-                            field_offset,&
-                            field_types,&
-                            chunk_size,&
-                            compress,&
-                            errcode )
-
- IMPLICIT NONE
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbmake_table_f
-!DEC$endif
-!
- CHARACTER(LEN=*), INTENT(in) :: table_title                      ! name of the dataset
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- INTEGER(hsize_t), INTENT(in) :: nfields                          ! fields
- INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
- INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
- CHARACTER(LEN=*), DIMENSION(1:nfields), INTENT(in) :: field_names  ! field names
- INTEGER(size_t),  DIMENSION(1:nfields), INTENT(in) :: field_offset ! field offset
- INTEGER(hid_t),   DIMENSION(1:nfields), INTENT(in) :: field_types  ! field types
- INTEGER(hsize_t), INTENT(in) :: chunk_size                       ! chunk size
- INTEGER,          INTENT(in) :: compress                         ! compress
- INTEGER(size_t) :: namelen                                       ! name length
- INTEGER(size_t) :: namelen1                                      ! name length
- INTEGER :: errcode                                               ! error code
- INTEGER(size_t), DIMENSION(1:nfields) :: char_len_field_names    ! field name lengths
- INTEGER(size_t) :: max_char_size_field_names                     ! character len of field names
- INTEGER(hsize_t) :: i                                            ! general purpose integer
-
-
- INTERFACE
-    INTEGER FUNCTION h5tbmake_table_c(namelen1,&
-         table_title,&
-         loc_id,&
-         namelen,&
-         dset_name,&
-         nfields,&
-         nrecords,&
-         type_size,&
-         field_offset,&
-         field_types,&
-         chunk_size,&
-         compress,&
-         char_len_field_names,&
-         max_char_size_field_names,&
-         field_names)
-
-      USE h5global
-      IMPLICIT NONE
-      !DEC$IF DEFINED(HDF5F90_WINDOWS)
-      !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBMAKE_TABLE_C'::h5tbmake_table_c
-      !DEC$ENDIF
-      !DEC$ATTRIBUTES reference :: dset_name
-      !DEC$ATTRIBUTES reference :: table_title
-      CHARACTER(LEN=*), INTENT(in) :: table_title                      ! name of the dataset
-      INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-      CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-      INTEGER(hsize_t), INTENT(in) :: nfields                          ! fields
-      INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
-      INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
-      CHARACTER(LEN=*), DIMENSION(nfields), INTENT(in) :: field_names  ! field names
-      INTEGER(size_t),  DIMENSION(nfields), INTENT(in) :: field_offset ! field offset
-      INTEGER(hid_t),   DIMENSION(nfields), INTENT(in) :: field_types  ! field types
-      INTEGER(hsize_t), INTENT(in) :: chunk_size                       ! chunk size
-      INTEGER,          INTENT(in) :: compress                         ! compress
-      INTEGER(size_t) :: namelen                                       ! name length
-      INTEGER(size_t) :: namelen1                                      ! name length
-      INTEGER(size_t), DIMENSION(nfields) :: char_len_field_names      ! field name's lengths
-      INTEGER(size_t) :: max_char_size_field_names                     ! character len of field names
-    END FUNCTION h5tbmake_table_c
- END INTERFACE
- 
- namelen  = LEN(dset_name)
- namelen1 = LEN(table_title)
- 
- ! Find the size of each character string in the array
- DO i = 1, nfields
-    char_len_field_names(i) = LEN_TRIM(field_names(i))
- END DO
-
- max_char_size_field_names = LEN(field_names(1)) 
-
- errcode = h5tbmake_table_c(namelen1,&
-  table_title,&
-  loc_id,&
-  namelen,&
-  dset_name,&
-  nfields,&
-  nrecords,&
-  type_size,&
-  field_offset,&
-  field_types,&
-  chunk_size,&
-  compress,&
-  char_len_field_names, &
-  max_char_size_field_names, &
-  field_names)
-
-END SUBROUTINE h5tbmake_table_f
-
-
-!-------------------------------------------------------------------------
-! Function: h5tbwrite_field_name_f_int
-!
-! Purpose: Writes one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 12, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbwrite_field_name_f_int(loc_id,&
-                                      dset_name,&
-                                      field_name,&
-                                      start,&
-                                      nrecords,&
-                                      type_size,&
-                                      buf,&
-                                      errcode )
-
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbwrite_field_name_f_int
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
- INTEGER(hsize_t), INTENT(in) :: start                            ! start record
- INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
- INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
- INTEGER, INTENT(in), DIMENSION(*) :: buf                         ! data buffer
- INTEGER :: errcode                                               ! error code
- INTEGER(size_t) :: namelen                                       ! name length
- INTEGER(size_t) :: namelen1                                      ! name length
-
- INTERFACE
-  INTEGER FUNCTION h5tbwrite_field_name_int_c(loc_id,namelen,dset_name,namelen1,field_name,&
-  start,nrecords,type_size,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_NAME_INT_C'::h5tbwrite_field_name_int_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  !DEC$ATTRIBUTES reference :: field_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
-  INTEGER(hsize_t), INTENT(in) :: start                            ! start record
-  INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
-  INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
-  INTEGER, INTENT(in), DIMENSION(*) :: buf                         ! data buffer
-  INTEGER :: errcode                                               ! error code
-  INTEGER(size_t) :: namelen                                       ! name length
-  INTEGER(size_t) :: namelen1                                      ! name length
-  END FUNCTION h5tbwrite_field_name_int_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
- namelen1 = LEN(field_name)
-
- errcode = h5tbwrite_field_name_int_c(loc_id,namelen,dset_name,namelen1,field_name,&
-  start,nrecords,type_size,buf)
-
-END SUBROUTINE h5tbwrite_field_name_f_int
-
-!-------------------------------------------------------------------------
-! Function: h5tbwrite_field_name_f_float
-!
-! Purpose: Writes one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 12, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbwrite_field_name_f_float(loc_id,&
-                                      dset_name,&
-                                      field_name,&
-                                      start,&
-                                      nrecords,&
-                                      type_size,&
-                                      buf,&
-                                      errcode )
-
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbwrite_field_name_f_float
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
- INTEGER(hsize_t), INTENT(in) :: start                            ! start record
- INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
- INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
- REAL, INTENT(in), DIMENSION(*) :: buf                            ! data buffer
- INTEGER :: errcode                                               ! error code
- INTEGER(size_t) :: namelen                                       ! name length
- INTEGER(size_t) :: namelen1                                      ! name length
-
- INTERFACE
-  INTEGER FUNCTION h5tbwrite_field_name_fl_c(loc_id,namelen,dset_name,namelen1,field_name,&
-  start,nrecords,type_size,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_NAME_FL_C'::h5tbwrite_field_name_fl_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  !DEC$ATTRIBUTES reference :: field_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
-  INTEGER(hsize_t), INTENT(in) :: start                            ! start record
-  INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
-  INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
-  REAL, INTENT(in), DIMENSION(*) :: buf                            ! data buffer
-  INTEGER :: errcode                                               ! error code
-  INTEGER(size_t) :: namelen                                       ! name length
-  INTEGER(size_t) :: namelen1                                      ! name length
-  END FUNCTION h5tbwrite_field_name_fl_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
- namelen1 = LEN(field_name)
-
- errcode = h5tbwrite_field_name_fl_c(loc_id,namelen,dset_name,namelen1,field_name,&
-  start,nrecords,type_size,buf)
-
-END SUBROUTINE h5tbwrite_field_name_f_float
-
-
-
-!-------------------------------------------------------------------------
-! Function: h5tbwrite_field_name_f_double
-!
-! Purpose: Writes one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 12, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbwrite_field_name_f_double(loc_id,&
-                                      dset_name,&
-                                      field_name,&
-                                      start,&
-                                      nrecords,&
-                                      type_size,&
-                                      buf,&
-                                      errcode )
-
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbwrite_field_name_f_double
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
- INTEGER(hsize_t), INTENT(in) :: start                            ! start record
- INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
- INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
- DOUBLE PRECISION, INTENT(in), DIMENSION(*) :: buf                ! data buffer
- INTEGER :: errcode                                               ! error code
- INTEGER(size_t) :: namelen                                       ! name length
- INTEGER(size_t) :: namelen1                                      ! name length
-
- INTERFACE
-  INTEGER FUNCTION h5tbwrite_field_name_dl_c(loc_id,namelen,dset_name,namelen1,field_name,&
-  start,nrecords,type_size,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_NAME_DL_C'::h5tbwrite_field_name_dl_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  !DEC$ATTRIBUTES reference :: field_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
-  INTEGER(hsize_t), INTENT(in) :: start                            ! start record
-  INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
-  INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
-  DOUBLE PRECISION, INTENT(in), DIMENSION(*) :: buf                ! data buffer
-  INTEGER :: errcode                                               ! error code
-  INTEGER(size_t) :: namelen                                       ! name length
-  INTEGER(size_t) :: namelen1                                      ! name length
-  END FUNCTION h5tbwrite_field_name_dl_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
- namelen1 = LEN(field_name)
-
- errcode = h5tbwrite_field_name_dl_c(loc_id,namelen,dset_name,namelen1,field_name,&
-  start,nrecords,type_size,buf)
-
-END SUBROUTINE h5tbwrite_field_name_f_double
-
-!-------------------------------------------------------------------------
-! Function: h5tbwrite_field_name_f_string
-!
-! Purpose: Writes one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 12, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbwrite_field_name_f_string(loc_id,&
-                                      dset_name,&
-                                      field_name,&
-                                      start,&
-                                      nrecords,&
-                                      type_size,&
-                                      buf,&
-                                      errcode )
-
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbwrite_field_name_f_string
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
- INTEGER(hsize_t), INTENT(in) :: start                            ! start record
- INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
- INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
- CHARACTER(LEN=*), INTENT(in), DIMENSION(*) :: buf                ! data buffer
- INTEGER :: errcode                                               ! error code
- INTEGER(size_t) :: namelen                                       ! name length
- INTEGER(size_t) :: namelen1                                      ! name length
-
- INTERFACE
-  INTEGER FUNCTION h5tbwrite_field_name_st_c(loc_id,namelen,dset_name,namelen1,field_name,&
-  start,nrecords,type_size,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_NAME_ST_C'::h5tbwrite_field_name_st_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  !DEC$ATTRIBUTES reference :: field_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
-  INTEGER(hsize_t), INTENT(in) :: start                            ! start record
-  INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
-  INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
-  CHARACTER(LEN=*), INTENT(in), DIMENSION(*) :: buf                ! data buffer
-  INTEGER :: errcode                                               ! error code
-  INTEGER(size_t) :: namelen                                               ! name length
-  INTEGER(size_t) :: namelen1                                      ! name length
-  END FUNCTION h5tbwrite_field_name_st_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
- namelen1 = LEN(field_name)
-
- errcode = h5tbwrite_field_name_st_c(loc_id,namelen,dset_name,namelen1,field_name,&
-  start,nrecords,type_size,buf)
-
-END SUBROUTINE h5tbwrite_field_name_f_string
-
-
-!-------------------------------------------------------------------------
-! Function: h5tbread_field_name_f_int
-!
-! Purpose: Reads one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 12, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbread_field_name_f_int(loc_id,&
-                                      dset_name,&
-                                      field_name,&
-                                      start,&
-                                      nrecords,&
-                                      type_size,&
-                                      buf,&
-                                      errcode )
-
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbread_field_name_f_int
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
- INTEGER(hsize_t), INTENT(in) :: start                            ! start record
- INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
- INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
- INTEGER, INTENT(in), DIMENSION(*) :: buf                         ! data buffer
- INTEGER :: errcode                                               ! error code
- INTEGER(size_t) :: namelen                                       ! name length
- INTEGER(size_t) :: namelen1                                      ! name length
-
- INTERFACE
-  INTEGER FUNCTION h5tbread_field_name_int_c(loc_id,namelen,dset_name,namelen1,field_name,&
-  start,nrecords,type_size,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_NAME_INT_C'::h5tbread_field_name_int_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  !DEC$ATTRIBUTES reference :: field_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
-  INTEGER(hsize_t), INTENT(in) :: start                            ! start record
-  INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
-  INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
-  INTEGER, INTENT(in), DIMENSION(*) :: buf                         ! data buffer
-  INTEGER :: errcode                                               ! error code
-  INTEGER(size_t) :: namelen                                       ! name length
-  INTEGER(size_t) :: namelen1                                      ! name length
-  END FUNCTION h5tbread_field_name_int_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
- namelen1 = LEN(field_name)
-
- errcode = h5tbread_field_name_int_c(loc_id,namelen,dset_name,namelen1,field_name,&
-  start,nrecords,type_size,buf)
-
-END SUBROUTINE h5tbread_field_name_f_int
-
-!-------------------------------------------------------------------------
-! Function: h5tbread_field_name_f_float
-!
-! Purpose: Reads one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 12, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbread_field_name_f_float(loc_id,&
-                                      dset_name,&
-                                      field_name,&
-                                      start,&
-                                      nrecords,&
-                                      type_size,&
-                                      buf,&
-                                      errcode )
-
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbread_field_name_f_float
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
- INTEGER(hsize_t), INTENT(in) :: start                            ! start record
- INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
- INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
- REAL, INTENT(in), DIMENSION(*) :: buf                            ! data buffer
- INTEGER :: errcode                                               ! error code
- INTEGER(size_t) :: namelen                                       ! name length
- INTEGER(size_t) :: namelen1                                      ! name length
-
- INTERFACE
-  INTEGER FUNCTION h5tbread_field_name_fl_c(loc_id,namelen,dset_name,namelen1,field_name,&
-  start,nrecords,type_size,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_NAME_FL_C'::h5tbread_field_name_fl_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  !DEC$ATTRIBUTES reference :: field_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
-  INTEGER(hsize_t), INTENT(in) :: start                            ! start record
-  INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
-  INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
-  REAL, INTENT(in), DIMENSION(*) :: buf                            ! data buffer
-  INTEGER :: errcode                                               ! error code
-  INTEGER(size_t) :: namelen                                       ! name length
-  INTEGER(size_t) :: namelen1                                      ! name length
-  END FUNCTION h5tbread_field_name_fl_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
- namelen1 = LEN(field_name)
-
- errcode = h5tbread_field_name_fl_c(loc_id,namelen,dset_name,namelen1,field_name,&
-  start,nrecords,type_size,buf)
-
-END SUBROUTINE h5tbread_field_name_f_float
-
-!-------------------------------------------------------------------------
-! Function: h5tbread_field_name_f_double
-!
-! Purpose: Reads one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 12, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbread_field_name_f_double(loc_id,&
-                                      dset_name,&
-                                      field_name,&
-                                      start,&
-                                      nrecords,&
-                                      type_size,&
-                                      buf,&
-                                      errcode )
-
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbread_field_name_f_double
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
- INTEGER(hsize_t), INTENT(in) :: start                            ! start record
- INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
- INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
- DOUBLE PRECISION, INTENT(in), DIMENSION(*) :: buf                ! data buffer
- INTEGER :: errcode                                               ! error code
- INTEGER(size_t) :: namelen                                       ! name length
- INTEGER(size_t) :: namelen1                                      ! name length
-
- INTERFACE
-  INTEGER FUNCTION h5tbread_field_name_dl_c(loc_id,namelen,dset_name,namelen1,field_name,&
-  start,nrecords,type_size,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_NAME_DL_C'::h5tbread_field_name_dl_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  !DEC$ATTRIBUTES reference :: field_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
-  INTEGER(hsize_t), INTENT(in) :: start                            ! start record
-  INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
-  INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
-  DOUBLE PRECISION, INTENT(in), DIMENSION(*) :: buf                ! data buffer
-  INTEGER :: errcode                                               ! error code
-  INTEGER(size_t) :: namelen                                       ! name length
-  INTEGER(size_t) :: namelen1                                      ! name length
-  END FUNCTION h5tbread_field_name_dl_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
- namelen1 = LEN(field_name)
-
- errcode = h5tbread_field_name_dl_c(loc_id,namelen,dset_name,namelen1,field_name,&
-  start,nrecords,type_size,buf)
-
-END SUBROUTINE h5tbread_field_name_f_double
-
-!-------------------------------------------------------------------------
-! Function: h5tbread_field_name_f_string
-!
-! Purpose: Reads one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 12, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbread_field_name_f_string(loc_id,&
-                                      dset_name,&
-                                      field_name,&
-                                      start,&
-                                      nrecords,&
-                                      type_size,&
-                                      buf,&
-                                      errcode )
-
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbread_field_name_f_string
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
- INTEGER(hsize_t), INTENT(in) :: start                            ! start record
- INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
- INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
- CHARACTER(LEN=*), INTENT(in), DIMENSION(*) :: buf                ! data buffer
- INTEGER :: errcode                                               ! error code
- INTEGER(size_t) :: namelen                                       ! name length
- INTEGER(size_t) :: namelen1                                      ! name length
-
- INTERFACE
-  INTEGER FUNCTION h5tbread_field_name_st_c(loc_id,namelen,dset_name,namelen1,field_name,&
-  start,nrecords,type_size,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_NAME_ST_C'::h5tbread_field_name_st_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  !DEC$ATTRIBUTES reference :: field_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
-  INTEGER(hsize_t), INTENT(in) :: start                            ! start record
-  INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
-  INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
-  CHARACTER(LEN=*), INTENT(in), DIMENSION(*) :: buf                ! data buffer
-  INTEGER :: errcode                                               ! error code
-  INTEGER(size_t) :: namelen                                       ! name length
-  INTEGER(size_t) :: namelen1                                      ! name length
-  END FUNCTION h5tbread_field_name_st_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
- namelen1 = LEN(field_name)
-
- errcode = h5tbread_field_name_st_c(loc_id,namelen,dset_name,namelen1,field_name,&
-  start,nrecords,type_size,buf)
-
-END SUBROUTINE h5tbread_field_name_f_string
-
-
-!-------------------------------------------------------------------------
-! Function: h5tbwrite_field_index_f_int
-!
-! Purpose: Writes one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 12, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbwrite_field_index_f_int(loc_id,&
-                                      dset_name,&
-                                      field_index,&
-                                      start,&
-                                      nrecords,&
-                                      type_size,&
-                                      buf,&
-                                      errcode )
-
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbwrite_field_index_f_int
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- INTEGER, INTENT(in) :: field_index                               ! index
- INTEGER(hsize_t), INTENT(in) :: start                            ! start record
- INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
- INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
- INTEGER, INTENT(in), DIMENSION(*) :: buf                         ! data buffer
- INTEGER :: errcode                                               ! error code
- INTEGER(size_t) :: namelen                                       ! name length
-
- INTERFACE
-  INTEGER FUNCTION h5tbwrite_field_index_int_c(loc_id,namelen,dset_name,field_index,&
-  start,nrecords,type_size,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_INDEX_INT_C'::h5tbwrite_field_index_int_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  INTEGER, INTENT(in) :: field_index                               ! index
-  INTEGER(hsize_t), INTENT(in) :: start                            ! start record
-  INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
-  INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
-  INTEGER, INTENT(in), DIMENSION(*) :: buf                         ! data buffer
-  INTEGER :: errcode                                               ! error code
-  INTEGER(size_t) :: namelen                                       ! name length
-  END FUNCTION h5tbwrite_field_index_int_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
-
- errcode = h5tbwrite_field_index_int_c(loc_id,namelen,dset_name,field_index,&
-  start,nrecords,type_size,buf)
-
-END SUBROUTINE h5tbwrite_field_index_f_int
-
-!-------------------------------------------------------------------------
-! Function: h5tbwrite_field_index_f_float
-!
-! Purpose: Writes one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 12, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbwrite_field_index_f_float(loc_id,&
-                                      dset_name,&
-                                      field_index,&
-                                      start,&
-                                      nrecords,&
-                                      type_size,&
-                                      buf,&
-                                      errcode )
-
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbwrite_field_index_f_float
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- INTEGER, INTENT(in) :: field_index                               ! index
- INTEGER(hsize_t), INTENT(in) :: start                            ! start record
- INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
- INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
- REAL, INTENT(in), DIMENSION(*) :: buf                            ! data buffer
- INTEGER :: errcode                                               ! error code
- INTEGER(size_t) :: namelen                                       ! name length
-
- INTERFACE
-  INTEGER FUNCTION h5tbwrite_field_index_fl_c(loc_id,namelen,dset_name,field_index,&
-  start,nrecords,type_size,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_INDEX_FL_C'::h5tbwrite_field_index_fl_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  INTEGER, INTENT(in) :: field_index                               ! index
-  INTEGER(hsize_t), INTENT(in) :: start                            ! start record
-  INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
-  INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
-  REAL, INTENT(in), DIMENSION(*) :: buf                            ! data buffer
-  INTEGER :: errcode                                               ! error code
-  INTEGER(size_t) :: namelen                                       ! name length
-  END FUNCTION h5tbwrite_field_index_fl_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
-
- errcode = h5tbwrite_field_index_fl_c(loc_id,namelen,dset_name,field_index,&
-  start,nrecords,type_size,buf)
-
-END SUBROUTINE h5tbwrite_field_index_f_float
-
-
-
-!-------------------------------------------------------------------------
-! Function: h5tbwrite_field_index_f_double
-!
-! Purpose: Writes one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 12, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbwrite_field_index_f_double(loc_id,&
-                                      dset_name,&
-                                      field_index,&
-                                      start,&
-                                      nrecords,&
-                                      type_size,&
-                                      buf,&
-                                      errcode )
-
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbwrite_field_index_f_double
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- INTEGER, INTENT(in) :: field_index                               ! index
- INTEGER(hsize_t), INTENT(in) :: start                            ! start record
- INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
- INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
- DOUBLE PRECISION, INTENT(in), DIMENSION(*) :: buf                ! data buffer
- INTEGER :: errcode                                               ! error code
- INTEGER(size_t) :: namelen                                       ! name length
-
- INTERFACE
-  INTEGER FUNCTION h5tbwrite_field_index_dl_c(loc_id,namelen,dset_name,field_index,&
-  start,nrecords,type_size,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_INDEX_DL_C'::h5tbwrite_field_index_dl_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  INTEGER, INTENT(in) :: field_index                               ! index
-  INTEGER(hsize_t), INTENT(in) :: start                            ! start record
-  INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
-  INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
-  DOUBLE PRECISION, INTENT(in), DIMENSION(*) :: buf                ! data buffer
-  INTEGER :: errcode                                               ! error code
-  INTEGER(size_t) :: namelen                                       ! name length
-  END FUNCTION h5tbwrite_field_index_dl_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
-
- errcode = h5tbwrite_field_index_dl_c(loc_id,namelen,dset_name,field_index,&
-  start,nrecords,type_size,buf)
-
-END SUBROUTINE h5tbwrite_field_index_f_double
-
-!-------------------------------------------------------------------------
-! Function: h5tbwrite_field_index_f_string
-!
-! Purpose: Writes one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 12, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbwrite_field_index_f_string(loc_id,&
-                                      dset_name,&
-                                      field_index,&
-                                      start,&
-                                      nrecords,&
-                                      type_size,&
-                                      buf,&
-                                      errcode )
-
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbwrite_field_index_f_string
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- INTEGER, INTENT(in) :: field_index                               ! index
- INTEGER(hsize_t), INTENT(in) :: start                            ! start record
- INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
- INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
- CHARACTER(LEN=*), INTENT(in), DIMENSION(*) :: buf                ! data buffer
- INTEGER :: errcode                                               ! error code
- INTEGER(size_t) :: namelen                                       ! name length
-
- INTERFACE
-  INTEGER FUNCTION h5tbwrite_field_index_st_c(loc_id,namelen,dset_name,field_index,&
-  start,nrecords,type_size,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBWRITE_FIELD_INDEX_ST_C'::h5tbwrite_field_index_st_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  INTEGER, INTENT(in) :: field_index                               ! index
-  INTEGER(hsize_t), INTENT(in) :: start                            ! start record
-  INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
-  INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
-  CHARACTER(LEN=*), INTENT(in), DIMENSION(*) :: buf                ! data buffer
-  INTEGER :: errcode                                               ! error code
-  INTEGER(size_t) :: namelen                                       ! name length
-  END FUNCTION h5tbwrite_field_index_st_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
-
- errcode = h5tbwrite_field_index_st_c(loc_id,namelen,dset_name,field_index,&
-  start,nrecords,type_size,buf)
-
-END SUBROUTINE h5tbwrite_field_index_f_string
-
-
-!-------------------------------------------------------------------------
-! Function: h5tbread_field_index_f_int
-!
-! Purpose: Reads one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 12, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbread_field_index_f_int(loc_id,&
-                                      dset_name,&
-                                      field_index,&
-                                      start,&
-                                      nrecords,&
-                                      type_size,&
-                                      buf,&
-                                      errcode )
-
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport ::h5tbread_field_index_f_int
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- INTEGER, INTENT(in) :: field_index                               ! index
- INTEGER(hsize_t), INTENT(in) :: start                            ! start record
- INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
- INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
- INTEGER, INTENT(in), DIMENSION(*) :: buf                         ! data buffer
- INTEGER :: errcode                                               ! error code
- INTEGER(size_t) :: namelen                                       ! name length
-
- INTERFACE
-  INTEGER FUNCTION h5tbread_field_index_int_c(loc_id,namelen,dset_name,field_index,&
-  start,nrecords,type_size,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_INDEX_INT_C'::h5tbread_field_index_int_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  INTEGER, INTENT(in) :: field_index                               ! index
-  INTEGER(hsize_t), INTENT(in) :: start                            ! start record
-  INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
-  INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
-  INTEGER, INTENT(in), DIMENSION(*) :: buf                         ! data buffer
-  INTEGER :: errcode                                               ! error code
-  INTEGER(size_t) :: namelen                                       ! name length
-  END FUNCTION h5tbread_field_index_int_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
-
- errcode = h5tbread_field_index_int_c(loc_id,namelen,dset_name,field_index,&
-  start,nrecords,type_size,buf)
-
-END SUBROUTINE h5tbread_field_index_f_int
-
-!-------------------------------------------------------------------------
-! Function: h5tbread_field_index_f_float
-!
-! Purpose: Reads one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 12, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbread_field_index_f_float(loc_id,&
-                                      dset_name,&
-                                      field_index,&
-                                      start,&
-                                      nrecords,&
-                                      type_size,&
-                                      buf,&
-                                      errcode )
-
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbread_field_index_f_float
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- INTEGER, INTENT(in) :: field_index                               ! index
- INTEGER(hsize_t), INTENT(in) :: start                            ! start record
- INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
- INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
- REAL, INTENT(in), DIMENSION(*) :: buf                            ! data buffer
- INTEGER :: errcode                                               ! error code
- INTEGER(size_t) :: namelen                                       ! name length
-
- INTERFACE
-  INTEGER FUNCTION h5tbread_field_index_fl_c(loc_id,namelen,dset_name,field_index,&
-   start,nrecords,type_size,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_INDEX_FL_C'::h5tbread_field_index_fl_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  INTEGER, INTENT(in) :: field_index                               ! index
-  INTEGER(hsize_t), INTENT(in) :: start                            ! start record
-  INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
-  INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
-  REAL, INTENT(in), DIMENSION(*) :: buf                            ! data buffer
-  INTEGER :: errcode                                               ! error code
-  INTEGER(size_t) :: namelen                                       ! name length
-  END FUNCTION h5tbread_field_index_fl_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
-
- errcode = h5tbread_field_index_fl_c(loc_id,namelen,dset_name,field_index,&
-  start,nrecords,type_size,buf)
-
-END SUBROUTINE h5tbread_field_index_f_float
-
-!-------------------------------------------------------------------------
-! Function: h5tbread_field_index_f_double
-!
-! Purpose: Reads one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 12, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbread_field_index_f_double(loc_id,&
-                                      dset_name,&
-                                      field_index,&
-                                      start,&
-                                      nrecords,&
-                                      type_size,&
-                                      buf,&
-                                      errcode )
-
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbread_field_index_f_double
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- INTEGER, INTENT(in) :: field_index                               ! index
- INTEGER(hsize_t), INTENT(in) :: start                            ! start record
- INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
- INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
- DOUBLE PRECISION, INTENT(in), DIMENSION(*) :: buf                ! data buffer
- INTEGER :: errcode                                               ! error code
- INTEGER(size_t) :: namelen                                       ! name length
-
- INTERFACE
-  INTEGER FUNCTION h5tbread_field_index_dl_c(loc_id,namelen,dset_name,field_index,&
-   start,nrecords,type_size,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_INDEX_DL_C'::h5tbread_field_index_dl_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  INTEGER, INTENT(in) :: field_index                               ! index
-  INTEGER(hsize_t), INTENT(in) :: start                            ! start record
-  INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
-  INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
-  DOUBLE PRECISION, INTENT(in), DIMENSION(*) :: buf                ! data buffer
-  INTEGER :: errcode                                               ! error code
-  INTEGER(size_t) :: namelen                                       ! name length
-  END FUNCTION h5tbread_field_index_dl_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
-
- errcode = h5tbread_field_index_dl_c(loc_id,namelen,dset_name,field_index,&
-  start,nrecords,type_size,buf)
-
-END SUBROUTINE h5tbread_field_index_f_double
-
-!-------------------------------------------------------------------------
-! Function: h5tbread_field_index_f_string
-!
-! Purpose: Reads one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 12, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbread_field_index_f_string(loc_id,&
-                                      dset_name,&
-                                      field_index,&
-                                      start,&
-                                      nrecords,&
-                                      type_size,&
-                                      buf,&
-                                      errcode )
-
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbread_field_index_f_string
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- INTEGER, INTENT(in) :: field_index                               ! index
- INTEGER(hsize_t), INTENT(in) :: start                            ! start record
- INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
- INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
- CHARACTER(LEN=*), INTENT(in), DIMENSION(*) :: buf                ! data buffer
- INTEGER :: errcode                                               ! error code
- INTEGER(size_t) :: namelen                                       ! name length
-
- INTERFACE
-  INTEGER FUNCTION h5tbread_field_index_st_c(loc_id,namelen,dset_name,field_index,&
-   start,nrecords,type_size,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBREAD_FIELD_INDEX_ST_C'::h5tbread_field_index_st_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  INTEGER, INTENT(in) :: field_index                               ! index
-  INTEGER(hsize_t), INTENT(in) :: start                            ! start record
-  INTEGER(hsize_t), INTENT(in) :: nrecords                         ! records
-  INTEGER(size_t),  INTENT(in) :: type_size                        ! type size
-  CHARACTER(LEN=*), INTENT(in), DIMENSION(*) :: buf                ! data buffer
-  INTEGER :: errcode                                               ! error code
-  INTEGER(size_t) :: namelen                                       ! name length
-  END FUNCTION h5tbread_field_index_st_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
-
- errcode = h5tbread_field_index_st_c(loc_id,namelen,dset_name,field_index,&
-  start,nrecords,type_size,buf)
-
-END SUBROUTINE h5tbread_field_index_f_string
-
-
-!-------------------------------------------------------------------------
-! Function: h5tbinsert_field_f_int
-!
-! Purpose: Inserts one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 13, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbinsert_field_f_int(loc_id,&
-                                  dset_name,&
-                                  field_name,&
-                                  field_type,&
-                                  field_index,&
-                                  buf,&
-                                  errcode )
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbinsert_field_f_int
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
- INTEGER(hid_t), INTENT(in)   :: field_type                       ! field type
- INTEGER, INTENT(in) :: field_index                               ! field_index
- INTEGER, INTENT(in), DIMENSION(*) :: buf                         ! data buffer
- INTEGER(size_t) :: namelen                                       ! name length
- INTEGER(size_t) :: namelen1                                      ! name length
- INTEGER :: errcode                                               ! error code
-
-
- INTERFACE
-  INTEGER FUNCTION h5tbinsert_field_int_c(loc_id,namelen,dset_name,namelen1,field_name,&
-   field_type,field_index,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBINSERT_FIELD_INT_C'::h5tbinsert_field_int_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  !DEC$ATTRIBUTES reference :: field_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
-  INTEGER(hid_t), INTENT(in)   :: field_type                       ! field type
-  INTEGER, INTENT(in) :: field_index                               ! field_index
-  INTEGER, INTENT(in), DIMENSION(*) :: buf                         ! data buffer
-  INTEGER(size_t) :: namelen                                       ! name length
-  INTEGER(size_t) :: namelen1                                      ! name length length
-  END FUNCTION h5tbinsert_field_int_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
- namelen1 = LEN(field_name)
-
- errcode = h5tbinsert_field_int_c(loc_id,namelen,dset_name,namelen1,field_name,&
-   field_type,field_index,buf)
-
-END SUBROUTINE h5tbinsert_field_f_int
-
-
-
-!-------------------------------------------------------------------------
-! Function: h5tbinsert_field_f_float
-!
-! Purpose: Inserts one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 13, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbinsert_field_f_float(loc_id,&
-                                  dset_name,&
-                                  field_name,&
-                                  field_type,&
-                                  field_index,&
-                                  buf,&
-                                  errcode )
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbinsert_field_f_float
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
- INTEGER(hid_t), INTENT(in)   :: field_type                       ! field type
- INTEGER, INTENT(in) :: field_index                               ! field_index
- REAL, INTENT(in), DIMENSION(*) :: buf                            ! data buffer
- INTEGER(size_t) :: namelen                                       ! name length
- INTEGER(size_t) :: namelen1                                      ! name length
- INTEGER :: errcode                                               ! error code
-
-
- INTERFACE
-  INTEGER FUNCTION h5tbinsert_field_fl_c(loc_id,namelen,dset_name,namelen1,field_name,&
-   field_type,field_index,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBINSERT_FIELD_FL_C'::h5tbinsert_field_fl_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  !DEC$ATTRIBUTES reference :: field_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
-  INTEGER(hid_t), INTENT(in)   :: field_type                       ! field type
-  INTEGER, INTENT(in) :: field_index                               ! field_index
-  REAL, INTENT(in), DIMENSION(*) :: buf                            ! data buffer
-  INTEGER(size_t) :: namelen                                       ! name length
-  INTEGER(size_t) :: namelen1                                      ! name length length
-  END FUNCTION h5tbinsert_field_fl_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
- namelen1 = LEN(field_name)
-
- errcode = h5tbinsert_field_fl_c(loc_id,namelen,dset_name,namelen1,field_name,&
-   field_type,field_index,buf)
-
-END SUBROUTINE h5tbinsert_field_f_float
-
-
-
-!-------------------------------------------------------------------------
-! Function: h5tbinsert_field_f_double
-!
-! Purpose: Inserts one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 13, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbinsert_field_f_double(loc_id,&
-                                  dset_name,&
-                                  field_name,&
-                                  field_type,&
-                                  field_index,&
-                                  buf,&
-                                  errcode )
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbinsert_field_f_double
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
- INTEGER(hid_t), INTENT(in)   :: field_type                       ! field type
- INTEGER, INTENT(in) :: field_index                               ! field_index
- DOUBLE PRECISION, INTENT(in), DIMENSION(*) :: buf                ! data buffer
- INTEGER(size_t) :: namelen                                       ! name length
- INTEGER(size_t) :: namelen1                                      ! name length
- INTEGER :: errcode                                               ! error code
-
-
- INTERFACE
-  INTEGER FUNCTION h5tbinsert_field_dl_c(loc_id,namelen,dset_name,namelen1,field_name,&
-   field_type,field_index,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBINSERT_FIELD_DL_C'::h5tbinsert_field_dl_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  !DEC$ATTRIBUTES reference :: field_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
-  INTEGER(hid_t), INTENT(in)   :: field_type                       ! field type
-  INTEGER, INTENT(in) :: field_index                               ! field_index
-  DOUBLE PRECISION, INTENT(in), DIMENSION(*) :: buf                ! data buffer
-  INTEGER(size_t) :: namelen                                       ! name length
-  INTEGER(size_t) :: namelen1                                      ! name length length
-  END FUNCTION h5tbinsert_field_dl_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
- namelen1 = LEN(field_name)
-
- errcode = h5tbinsert_field_dl_c(loc_id,namelen,dset_name,namelen1,field_name,&
-   field_type,field_index,buf)
-
-END SUBROUTINE h5tbinsert_field_f_double
-
-
-
-
-!-------------------------------------------------------------------------
-! Function: h5tbinsert_field_f_string
-!
-! Purpose: Inserts one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 13, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbinsert_field_f_string(loc_id,&
-                                  dset_name,&
-                                  field_name,&
-                                  field_type,&
-                                  field_index,&
-                                  buf,&
-                                  errcode )
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbinsert_field_f_string
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
- INTEGER(hid_t), INTENT(in)   :: field_type                       ! field type
- INTEGER, INTENT(in) :: field_index                               ! field_index
- CHARACTER(LEN=*), INTENT(in), DIMENSION(*) :: buf                ! data buffer
- INTEGER(size_t) :: namelen                                       ! name length
- INTEGER(size_t) :: namelen1                                      ! name length
- INTEGER :: errcode                                               ! error code
-
-
- INTERFACE
-  INTEGER FUNCTION h5tbinsert_field_st_c(loc_id,namelen,dset_name,namelen1,field_name,&
-   field_type,field_index,buf)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBINSERT_FIELD_ST_C'::h5tbinsert_field_st_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  !DEC$ATTRIBUTES reference :: field_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
-  CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
-  INTEGER(hid_t), INTENT(in)   :: field_type                       ! field type
-  INTEGER, INTENT(in) :: field_index                               ! field_index
-  CHARACTER(LEN=*), INTENT(in), DIMENSION(*) :: buf                ! data buffer
-  INTEGER(size_t) :: namelen                                       ! name length
-  INTEGER(size_t) :: namelen1                                      ! name length length
-  END FUNCTION h5tbinsert_field_st_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
- namelen1 = LEN(field_name)
-
- errcode = h5tbinsert_field_st_c(loc_id,namelen,dset_name,namelen1,field_name,&
-   field_type,field_index,buf)
-
-END SUBROUTINE h5tbinsert_field_f_string
-
-
-
-
-!-------------------------------------------------------------------------
-! Function: h5tbdelete_field_f
-!
-! Purpose: Inserts one field
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 13, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbdelete_field_f(loc_id,&
-                              dset_name,&
-                              field_name,&
-                              errcode )
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbdelete_field_f
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id                           ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name                        ! name of the dataset
- CHARACTER(LEN=*), INTENT(in) :: field_name                       ! name of the field
- INTEGER(size_t) :: namelen                                       ! name length
- INTEGER(size_t) :: namelen1                                      ! name length
- INTEGER :: errcode                                               ! error code
-
-
- INTERFACE
-  INTEGER FUNCTION h5tbdelete_field_c(loc_id,namelen,dset_name,namelen1,field_name)
-
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBDELETE_FIELD_C'::h5tbdelete_field_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  !DEC$ATTRIBUTES reference :: field_name
-  INTEGER(HID_T),   INTENT(IN) :: loc_id                           ! file or group identifier
-  CHARACTER(LEN=*), INTENT(IN) :: dset_name                        ! name of the dataset
-  CHARACTER(LEN=*), INTENT(IN) :: field_name                       ! name of the field
-  INTEGER(size_t) :: namelen                                       ! name length
-  INTEGER(size_t) :: namelen1                                      ! name length length
-  END FUNCTION h5tbdelete_field_c
- END INTERFACE
-
- namelen  = LEN(dset_name)
- namelen1 = LEN(field_name)
-
- errcode = h5tbdelete_field_c(loc_id,namelen,dset_name,namelen1,field_name)
-
-END SUBROUTINE h5tbdelete_field_f
-
-
-
-!-------------------------------------------------------------------------
-! Function: h5tbget_table_info_f
-!
-! Purpose: Gets the number of records and fields of a table
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 13, 2004
-!
-! Comments:
-!
-! Modifications:
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbget_table_info_f(loc_id,&
-                                dset_name,&
-                                nfields,&
-                                nrecords,&
-                                errcode )
-
- IMPLICIT NONE
-
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbget_table_info_f
-!DEC$endif
-!
-
- INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
- CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
- INTEGER(hsize_t), INTENT(inout):: nfields          ! nfields
- INTEGER(hsize_t), INTENT(inout):: nrecords         ! nrecords
- INTEGER :: errcode                                 ! error code
- INTEGER(size_t) :: namelen                         ! name length
-
- INTERFACE
-  INTEGER FUNCTION h5tbget_table_info_c(loc_id,namelen,dset_name,nfields,nrecords)
-  USE h5global
-  IMPLICIT NONE
-  !DEC$IF DEFINED(HDF5F90_WINDOWS)
-  !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBGET_TABLE_INFO_C'::h5tbget_table_info_c
-  !DEC$ENDIF
-  !DEC$ATTRIBUTES reference :: dset_name
-  INTEGER(hid_t),   INTENT(in) :: loc_id             ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name          ! name of the dataset
-  INTEGER(hsize_t), INTENT(inout):: nfields          ! nfields
-  INTEGER(hsize_t), INTENT(inout):: nrecords         ! nrecords
-  INTEGER(size_t) :: namelen                         ! name length
-  END FUNCTION h5tbget_table_info_c
- END INTERFACE
-
- namelen = LEN(dset_name)
- errcode = h5tbget_table_info_c(loc_id,namelen,dset_name,nfields,nrecords)
-
-END SUBROUTINE h5tbget_table_info_f
-
-
-!-------------------------------------------------------------------------
-! Function: h5tbget_field_info_f
-!
-! Purpose: Get information about fields
-!
-! Return: Success: 0, Failure: -1
-!
-! Programmer: pvn at ncsa.uiuc.edu
-!
-! Date: October 13, 2004
-!
-! Comments:
-!
-! Modifications: 
-!  Added optional parameter for returning the maximum character length
-!  in the field name array. March 3, 2011 
-!
-!-------------------------------------------------------------------------
-
-SUBROUTINE h5tbget_field_info_f(loc_id,&
-                                dset_name,&
-                                nfields,&
-                                field_names,&
-                                field_sizes,&
-                                field_offsets,&
-                                type_size,&
-                                errcode, maxlen_out )
-
-  IMPLICIT NONE
-!
-!This definition is needed for Windows DLLs
-!DEC$if defined(BUILD_HDF5_HL_DLL)
-!DEC$attributes dllexport :: h5tbget_field_info_f
-!DEC$endif
-!
-  INTEGER(hid_t),   INTENT(in) :: loc_id                                ! file or group identifier
-  CHARACTER(LEN=*), INTENT(in) :: dset_name                             ! name of the dataset
-  INTEGER(hsize_t), INTENT(in) :: nfields                               ! nfields
-  CHARACTER(LEN=*), DIMENSION(nfields), INTENT(inout) :: field_names    ! field names
-  INTEGER(size_t),  DIMENSION(nfields), INTENT(inout) :: field_sizes    ! field sizes
-  INTEGER(size_t),  DIMENSION(nfields), INTENT(inout) :: field_offsets  ! field offsets
-  INTEGER(size_t),  INTENT(inout):: type_size                           ! type size
-  INTEGER :: errcode                                                    ! error code
-  INTEGER, OPTIONAL :: maxlen_out                                       ! maximum character len of the field names
-  INTEGER(size_t) :: namelen                                            ! name length
-  INTEGER(size_t), DIMENSION(nfields) :: namelen2                       ! name lengths
-  INTEGER(hsize_t) :: i                                                          ! general purpose integer
-  INTEGER(size_t) :: maxlen
-  INTEGER(size_t) :: c_maxlen_out
-
-  INTERFACE
-     INTEGER FUNCTION h5tbget_field_info_c(loc_id,namelen,dset_name,nfields,&
-          field_sizes,field_offsets,type_size,namelen2, maxlen, field_names, c_maxlen_out)
-
-       USE h5global
-       IMPLICIT NONE
-       !DEC$IF DEFINED(HDF5F90_WINDOWS)
-       !DEC$ATTRIBUTES C,reference,decorate,alias:'H5TBGET_FIELD_INFO_C'::h5tbget_field_info_c
-       !DEC$ENDIF
-       !DEC$ATTRIBUTES reference :: dset_name
-       INTEGER(hid_t),   INTENT(in) :: loc_id                                 ! file or group identifier
-       CHARACTER(LEN=*), INTENT(in) :: dset_name                              ! name of the dataset
-       INTEGER(hsize_t), INTENT(in):: nfields                                 ! nfields
-       CHARACTER(LEN=*), DIMENSION(1:nfields), INTENT(inout) :: field_names   ! field names
-       INTEGER(size_t),  DIMENSION(1:nfields), INTENT(inout) :: field_sizes   ! field sizes
-       INTEGER(size_t),  DIMENSION(1:nfields), INTENT(inout) :: field_offsets ! field offsets
-       INTEGER(size_t),  INTENT(inout):: type_size                            ! type size
-       INTEGER(size_t) :: namelen                                             ! name length
-       INTEGER(size_t) :: maxlen                                              ! maxiumum length of input field names
-       INTEGER(size_t), DIMENSION(1:nfields) :: namelen2                      ! name lengths
-       INTEGER(size_t) :: c_maxlen_out                  ! maximum character length of a field array element 
-     END FUNCTION h5tbget_field_info_c
-  END INTERFACE
-
-  namelen = LEN(dset_name)
-  DO i = 1, nfields
-     namelen2(i) = LEN_TRIM(field_names(i))
-  END DO
-  maxlen = LEN(field_names(1))
-  c_maxlen_out = 0
-
-  errcode = h5tbget_field_info_c(loc_id, namelen,dset_name, nfields, &
-       field_sizes, field_offsets, type_size, namelen2, maxlen, field_names, c_maxlen_out)
-
-  IF(PRESENT(maxlen_out)) maxlen_out = c_maxlen_out
-
-END SUBROUTINE h5tbget_field_info_f
-
-END MODULE H5TB
-
-
-
-
-
-
diff --git a/hl/fortran/src/Makefile.am b/hl/fortran/src/Makefile.am
index f4d39e3..d190ed1 100644
--- a/hl/fortran/src/Makefile.am
+++ b/hl/fortran/src/Makefile.am
@@ -30,7 +30,7 @@ AM_FCFLAGS+=-I$(top_builddir)/fortran/src $(F9XMODFLAG)$(top_builddir)/fortran/s
 lib_LTLIBRARIES=libhdf5hl_fortran.la
 
 # Add libtool numbers to the HDF5 HL Fortran library (from config/lt_vers.am)
-libhdf5hl_fortran_la_LDFLAGS= -version-info $(LT_HL_F_VERS_INTERFACE):$(LT_HL_F_VERS_REVISION):$(LT_HL_F_VERS_AGE) $(AM_LDFLAGS)
+libhdf5hl_fortran_la_LDFLAGS= -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
 
 # Some Fortran compilers can't build shared libraries, so sometimes we
 # want to build a shared C library and a static Fortran library.  If so,
@@ -42,14 +42,14 @@ endif
 
 # Source files for the library
 #if BUILD_PARALLEL_CONDITIONAL
-#    PARALLEL_COND_SRC=HDFDmpiof.c HDF5mpio.f90
+#    PARALLEL_COND_SRC=HDFDmpiof.c HDF5mpio.F90
 #endif
 
 # List sources to include in the HDF5 HL Fortran library.
-libhdf5hl_fortran_la_SOURCES=H5DSfc.c H5LTfc.c  H5IMfc.c H5IMcc.c H5TBfc.c \
-	H5DSff.f90 H5LTff.f90 H5IMff.f90 H5TBff.f90
+libhdf5hl_fortran_la_SOURCES=H5DSfc.c H5LTfc.c H5IMfc.c H5IMcc.c H5TBfc.c \
+	H5DSff.F90 H5LTff.F90 H5TBff.F90 H5IMff.F90 H5LTff_gen.F90 H5TBff_gen.F90
 
-# HDF5 HL Fortran library depends on HDF5 Library. 
+# HDF5 HL Fortran library depends on HDF5 Library.
 libhdf5hl_fortran_la_LIBADD=$(LIBH5_HL) $(LIBH5F)
 
 # Fortran module files can have different extensions and different names
@@ -60,7 +60,7 @@ maintainer-clean-local: clean-local
 distclean-local: clean-local
 clean-local:
 	@if test -n "$(F9XMODEXT)" && test "X$(F9XMODEXT)" != "Xo"; then \
-	  $(RM) *.$(F9XMODEXT);                                         \
+	  $(RM) *.$(F9XMODEXT) H5LTff_gen.F90 H5TBff_gen.F90; \
 	fi
 
 install-data-local:
@@ -75,13 +75,31 @@ uninstall-local:
 	  fi;                                                           \
 	fi
 
+# These are the helper programs we need to build.
+noinst_PROGRAMS = H5HL_buildiface
+
+# H5HL_buildiface.F90 generates all the APIs that have a KIND type associated
+# with them.
+
+H5LTff_gen.F90: H5HL_buildiface$(EXEEXT)
+	$(RUNSERIAL) ./H5HL_buildiface$(EXEEXT)
+
+H5TBff_gen.F90: H5HL_buildiface$(EXEEXT)
+
+#H5TBff_gen.F90: H5HL_buildiface$(EXEEXT)
+
+# H5HL_buildiface.F90 is included in the distribution, and Automake knows
+# how to compile a fortran program given its sources.
+
+H5HL_buildiface_SOURCES = H5HL_buildiface.F90
 # Hardcode the dependencies of these files. There isn't a known way of
 # determining this automagically (like we do with the C files). So, when
 # doing a parallel make, some modules could be made way before the
 # modules they depend upon are actually made. *sigh*
-H5DSff.lo:          $(srcdir)/H5DSff.f90
-H5LTff.lo:          $(srcdir)/H5LTff.f90
-H5IMff.lo:          $(srcdir)/H5IMff.f90
-H5TBff.lo:          $(srcdir)/H5TBff.f90
-
-include $(top_srcdir)/config/conclude.am
+H5DSff.lo:          $(srcdir)/H5DSff.F90
+H5LTff.lo:          $(srcdir)/H5LTff.F90
+H5IMff.lo:          $(srcdir)/H5IMff.F90
+H5TBff.lo:          $(srcdir)/H5TBff.F90
+H5LTff_gen.lo:      H5LTff.lo H5LTff_gen.F90
+H5TBff_gen.lo:      H5TBff.lo H5LTff_gen.F90 H5TBff_gen.F90
+include $(top_srcdir)/config/conclude_fc.am
diff --git a/hl/fortran/src/Makefile.in b/hl/fortran/src/Makefile.in
index 2c7ed0f..f31d001 100644
--- a/hl/fortran/src/Makefile.in
+++ b/hl/fortran/src/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -31,8 +31,23 @@
 #
 # HDF5 High-Level Fortran Makefile(.in)
 
+# Makefile.am include fragment with Fortran helper rules and macros.
+
+# AM_FCCPPFLAGS, FCCPPFLAGS are currently not used.
+
+
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -95,25 +110,26 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/lt_vers.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(top_srcdir)/bin/depcomp $(top_srcdir)/bin/test-driver
 
 # Some Fortran compilers can't build shared libraries, so sometimes we
 # want to build a shared C library and a static Fortran library.  If so,
 # pass the -static flag to the library linker.
 @FORTRAN_SHARED_CONDITIONAL_FALSE at am__append_1 = -static
+noinst_PROGRAMS = H5HL_buildiface$(EXEEXT)
 TESTS =
 subdir = hl/fortran/src
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
@@ -147,7 +163,8 @@ am__installdirs = "$(DESTDIR)$(libdir)"
 LTLIBRARIES = $(lib_LTLIBRARIES)
 libhdf5hl_fortran_la_DEPENDENCIES = $(LIBH5_HL) $(LIBH5F)
 am_libhdf5hl_fortran_la_OBJECTS = H5DSfc.lo H5LTfc.lo H5IMfc.lo \
-	H5IMcc.lo H5TBfc.lo H5DSff.lo H5LTff.lo H5IMff.lo H5TBff.lo
+	H5IMcc.lo H5TBfc.lo H5DSff.lo H5LTff.lo H5TBff.lo H5IMff.lo \
+	H5LTff_gen.lo H5TBff_gen.lo
 libhdf5hl_fortran_la_OBJECTS = $(am_libhdf5hl_fortran_la_OBJECTS)
 AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
@@ -157,6 +174,10 @@ libhdf5hl_fortran_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=FC \
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(FCLD) \
 	$(AM_FCFLAGS) $(FCFLAGS) $(libhdf5hl_fortran_la_LDFLAGS) \
 	$(LDFLAGS) -o $@
+PROGRAMS = $(noinst_PROGRAMS)
+am_H5HL_buildiface_OBJECTS = H5HL_buildiface.$(OBJEXT)
+H5HL_buildiface_OBJECTS = $(am_H5HL_buildiface_OBJECTS)
+H5HL_buildiface_LDADD = $(LDADD)
 AM_V_P = $(am__v_P_ at AM_V@)
 am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -169,10 +190,22 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
+AM_V_PPFC = $(am__v_PPFC_ at AM_V@)
+am__v_PPFC_ = $(am__v_PPFC_ at AM_DEFAULT_V@)
+am__v_PPFC_0 = @echo "  PPFC    " $@;
+am__v_PPFC_1 = 
+FCLD = $(FC)
+FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_FCLD = $(am__v_FCLD_ at AM_V@)
+am__v_FCLD_ = $(am__v_FCLD_ at AM_DEFAULT_V@)
+am__v_FCLD_0 = @echo "  FCLD    " $@;
+am__v_FCLD_1 = 
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
 	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
@@ -191,23 +224,9 @@ AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-FCCOMPILE = $(FC) $(AM_FCFLAGS) $(FCFLAGS)
-LTFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS)
-AM_V_FC = $(am__v_FC_ at AM_V@)
-am__v_FC_ = $(am__v_FC_ at AM_DEFAULT_V@)
-am__v_FC_0 = @echo "  FC      " $@;
-am__v_FC_1 = 
-FCLD = $(FC)
-FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_FCLD = $(am__v_FCLD_ at AM_V@)
-am__v_FCLD_ = $(am__v_FCLD_ at AM_DEFAULT_V@)
-am__v_FCLD_0 = @echo "  FCLD    " $@;
-am__v_FCLD_1 = 
-SOURCES = $(libhdf5hl_fortran_la_SOURCES)
-DIST_SOURCES = $(libhdf5hl_fortran_la_SOURCES)
+SOURCES = $(libhdf5hl_fortran_la_SOURCES) $(H5HL_buildiface_SOURCES)
+DIST_SOURCES = $(libhdf5hl_fortran_la_SOURCES) \
+	$(H5HL_buildiface_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -405,6 +424,11 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/depcomp \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am \
+	$(top_srcdir)/config/conclude_fc.am \
+	$(top_srcdir)/config/lt_vers.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -424,7 +448,6 @@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@ -I$(top_builddir)/fortran/src \
 	$(F9XMODFLAG)$(top_builddir)/fortran/src
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@ $(am__append_1)
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -469,14 +492,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -486,13 +517,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -534,9 +564,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -679,47 +720,37 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2
 # See libtool versioning documentation online.
 # After making changes, run bin/reconfigure to update other configure related
 # files like Makefile.in.
-LT_VERS_INTERFACE = 11
-LT_VERS_REVISION = 0
-LT_VERS_AGE = 1
-LT_CXX_VERS_INTERFACE = 11
-LT_CXX_VERS_REVISION = 0
-LT_CXX_VERS_AGE = 0
-LT_F_VERS_INTERFACE = 10
-LT_F_VERS_REVISION = 2
-LT_F_VERS_AGE = 0
-LT_HL_VERS_INTERFACE = 10
-LT_HL_VERS_REVISION = 2
-LT_HL_VERS_AGE = 0
-LT_HL_CXX_VERS_INTERFACE = 11
-LT_HL_CXX_VERS_REVISION = 0
-LT_HL_CXX_VERS_AGE = 0
-LT_HL_F_VERS_INTERFACE = 10
-LT_HL_F_VERS_REVISION = 2
-LT_HL_F_VERS_AGE = 0
-LT_TOOLS_VERS_INTERFACE = 10
-LT_TOOLS_VERS_REVISION = 2
-LT_TOOLS_VERS_AGE = 0
+LT_VERS_INTERFACE = 100
+LT_VERS_REVISION = 900
+LT_VERS_AGE = 0
 
 # Our main target, the high-level fortran library
 lib_LTLIBRARIES = libhdf5hl_fortran.la
 
 # Add libtool numbers to the HDF5 HL Fortran library (from config/lt_vers.am)
-libhdf5hl_fortran_la_LDFLAGS = -version-info $(LT_HL_F_VERS_INTERFACE):$(LT_HL_F_VERS_REVISION):$(LT_HL_F_VERS_AGE) $(AM_LDFLAGS)
+libhdf5hl_fortran_la_LDFLAGS = -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
 
 # Source files for the library
 #if BUILD_PARALLEL_CONDITIONAL
-#    PARALLEL_COND_SRC=HDFDmpiof.c HDF5mpio.f90
+#    PARALLEL_COND_SRC=HDFDmpiof.c HDF5mpio.F90
 #endif
 
 # List sources to include in the HDF5 HL Fortran library.
-libhdf5hl_fortran_la_SOURCES = H5DSfc.c H5LTfc.c  H5IMfc.c H5IMcc.c H5TBfc.c \
-	H5DSff.f90 H5LTff.f90 H5IMff.f90 H5TBff.f90
+libhdf5hl_fortran_la_SOURCES = H5DSfc.c H5LTfc.c H5IMfc.c H5IMcc.c H5TBfc.c \
+	H5DSff.F90 H5LTff.F90 H5TBff.F90 H5IMff.F90 H5LTff_gen.F90 H5TBff_gen.F90
 
 
-# HDF5 HL Fortran library depends on HDF5 Library. 
+# HDF5 HL Fortran library depends on HDF5 Library.
 libhdf5hl_fortran_la_LIBADD = $(LIBH5_HL) $(LIBH5F)
 
+#H5TBff_gen.F90: H5HL_buildiface$(EXEEXT)
+
+# H5HL_buildiface.F90 is included in the distribution, and Automake knows
+# how to compile a fortran program given its sources.
+H5HL_buildiface_SOURCES = H5HL_buildiface.F90
+PPFCCOMPILE = $(FC) $(FCDEFS) $(DEFAULT_INCLUDES)  $(FCINCLUDES) $(AM_FCCPPFLAGS) $(FCCPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)
+LTPPFCCOMPILE = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(PPFCCOMPILE)
+
 # Automake needs to be taught how to build lib, progs, and tests targets.
 # These will be filled in automatically for the most part (e.g.,
 # lib_LIBRARIES are built for lib target), but EXTRA_LIB, EXTRA_PROG, and
@@ -742,8 +773,8 @@ TEST_SCRIPT_PARA_CHKSH = $(TEST_SCRIPT_PARA:=.chkexe_)
 all: all-am
 
 .SUFFIXES:
-.SUFFIXES: .c .f90 .lo .log .o .obj .sh .sh$(EXEEXT) .trs
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/lt_vers.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
+.SUFFIXES: .F90 .c .f90 .lo .log .o .obj .sh .sh$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/lt_vers.am $(top_srcdir)/config/conclude_fc.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
@@ -755,7 +786,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/fortran/src/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign hl/fortran/src/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -764,7 +794,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/lt_vers.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/lt_vers.am $(top_srcdir)/config/conclude_fc.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -813,6 +843,19 @@ clean-libLTLIBRARIES:
 libhdf5hl_fortran.la: $(libhdf5hl_fortran_la_OBJECTS) $(libhdf5hl_fortran_la_DEPENDENCIES) $(EXTRA_libhdf5hl_fortran_la_DEPENDENCIES) 
 	$(AM_V_FCLD)$(libhdf5hl_fortran_la_LINK) -rpath $(libdir) $(libhdf5hl_fortran_la_OBJECTS) $(libhdf5hl_fortran_la_LIBADD) $(LIBS)
 
+clean-noinstPROGRAMS:
+	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+H5HL_buildiface$(EXEEXT): $(H5HL_buildiface_OBJECTS) $(H5HL_buildiface_DEPENDENCIES) $(EXTRA_H5HL_buildiface_DEPENDENCIES) 
+	@rm -f H5HL_buildiface$(EXEEXT)
+	$(AM_V_FCLD)$(FCLINK) $(H5HL_buildiface_OBJECTS) $(H5HL_buildiface_LDADD) $(LIBS)
+
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
 
@@ -825,6 +868,12 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5LTfc.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5TBfc.Plo at am__quote@
 
+.F90.obj:
+	$(AM_V_PPFC)$(PPFCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.F90.lo:
+	$(AM_V_PPFC)$(LTPPFCCOMPILE) -c -o $@ $<
+
 .c.o:
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@@ -846,15 +895,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
-.f90.o:
-	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
-
-.f90.obj:
-	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) `$(CYGPATH_W) '$<'`
-
-.f90.lo:
-	$(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
-
 mostlyclean-libtool:
 	-rm -f *.lo
 
@@ -943,7 +983,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1091,7 +1131,7 @@ distdir: $(DISTFILES)
 check-am: all-am
 	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
 check: check-am
-all-am: Makefile $(LTLIBRARIES) all-local
+all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) all-local
 installdirs:
 	for dir in "$(DESTDIR)$(libdir)"; do \
 	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
@@ -1132,7 +1172,7 @@ maintainer-clean-generic:
 clean: clean-am
 
 clean-am: clean-generic clean-libLTLIBRARIES clean-libtool clean-local \
-	mostlyclean-am
+	clean-noinstPROGRAMS mostlyclean-am
 
 distclean: distclean-am
 	-rm -rf ./$(DEPDIR)
@@ -1205,8 +1245,8 @@ uninstall-am: uninstall-libLTLIBRARIES uninstall-local
 
 .PHONY: CTAGS GTAGS TAGS all all-am all-local check check-TESTS \
 	check-am clean clean-generic clean-libLTLIBRARIES \
-	clean-libtool clean-local cscopelist-am ctags ctags-am \
-	distclean distclean-compile distclean-generic \
+	clean-libtool clean-local clean-noinstPROGRAMS cscopelist-am \
+	ctags ctags-am distclean distclean-compile distclean-generic \
 	distclean-libtool distclean-local distclean-tags distdir dvi \
 	dvi-am html html-am info info-am install install-am \
 	install-data install-data-am install-data-local install-dvi \
@@ -1221,6 +1261,8 @@ uninstall-am: uninstall-libLTLIBRARIES uninstall-local
 	uninstall uninstall-am uninstall-libLTLIBRARIES \
 	uninstall-local
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
@@ -1254,7 +1296,7 @@ maintainer-clean-local: clean-local
 distclean-local: clean-local
 clean-local:
 	@if test -n "$(F9XMODEXT)" && test "X$(F9XMODEXT)" != "Xo"; then \
-	  $(RM) *.$(F9XMODEXT);                                         \
+	  $(RM) *.$(F9XMODEXT) H5LTff_gen.F90 H5TBff_gen.F90; \
 	fi
 
 install-data-local:
@@ -1269,14 +1311,29 @@ uninstall-local:
 	  fi;                                                           \
 	fi
 
+# H5HL_buildiface.F90 generates all the APIs that have a KIND type associated
+# with them.
+
+H5LTff_gen.F90: H5HL_buildiface$(EXEEXT)
+	$(RUNSERIAL) ./H5HL_buildiface$(EXEEXT)
+
+H5TBff_gen.F90: H5HL_buildiface$(EXEEXT)
 # Hardcode the dependencies of these files. There isn't a known way of
 # determining this automagically (like we do with the C files). So, when
 # doing a parallel make, some modules could be made way before the
 # modules they depend upon are actually made. *sigh*
-H5DSff.lo:          $(srcdir)/H5DSff.f90
-H5LTff.lo:          $(srcdir)/H5LTff.f90
-H5IMff.lo:          $(srcdir)/H5IMff.f90
-H5TBff.lo:          $(srcdir)/H5TBff.f90
+H5DSff.lo:          $(srcdir)/H5DSff.F90
+H5LTff.lo:          $(srcdir)/H5LTff.F90
+H5IMff.lo:          $(srcdir)/H5IMff.F90
+H5TBff.lo:          $(srcdir)/H5TBff.F90
+H5LTff_gen.lo:      H5LTff.lo H5LTff_gen.F90
+H5TBff_gen.lo:      H5TBff.lo H5LTff_gen.F90 H5TBff_gen.F90
+
+# Treat all .f90 and .F90 files as preprocessed Fortran.
+.f90.o:
+	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+.F90.o:
+	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
 
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
diff --git a/hl/fortran/src/hdf5_hl_fortrandll.def.in b/hl/fortran/src/hdf5_hl_fortrandll.def.in
new file mode 100644
index 0000000..9a1231a
--- /dev/null
+++ b/hl/fortran/src/hdf5_hl_fortrandll.def.in
@@ -0,0 +1,88 @@
+EXPORTS
+; H5DS
+H5DS_mp_H5DSSET_SCALE_F
+H5DS_mp_H5DSATTACH_SCALE_F
+H5DS_mp_H5DSDETACH_SCALE_F
+H5DS_mp_H5DSIS_ATTACHED_F
+H5DS_mp_H5DSIS_SCALE_F
+H5DS_mp_H5DSSET_LABEL_F
+H5DS_mp_H5DSGET_LABEL_F
+H5DS_mp_H5DSGET_SCALE_NAME_F
+H5DS_mp_H5DSGET_NUM_SCALES_F
+; H5IM
+H5IM_mp_H5IMMAKE_IMAGE_8BIT_F
+H5IM_mp_H5IMREAD_IMAGE_F
+H5IM_mp_H5IMMAKE_IMAGE_24BIT_F
+H5IM_mp_H5IMGET_IMAGE_INFO_F
+H5IM_mp_H5IMIS_IMAGE_F
+H5IM_mp_H5IMMAKE_PALETTE_F
+H5IM_mp_H5IMLINK_PALETTE_F
+H5IM_mp_H5IMUNLINK_PALETTE_F
+H5IM_mp_H5IMGET_NPALETTES_F
+H5IM_mp_H5IMGET_PALETTE_INFO_F
+H5IM_mp_H5IMGET_PALETTE_F
+H5IM_mp_H5IMIS_PALETTE_F
+; H5LT
+H5LT_CONST_mp_H5LTMAKE_DATASET_F_PTR
+H5LT_CONST_mp_H5LTMAKE_DATASET_F_INT1
+H5LT_CONST_mp_H5LTMAKE_DATASET_F_INT2
+H5LT_CONST_mp_H5LTMAKE_DATASET_F_INT3
+H5LT_CONST_mp_H5LTMAKE_DATASET_F_INT4
+H5LT_CONST_mp_H5LTMAKE_DATASET_F_INT5
+H5LT_CONST_mp_H5LTMAKE_DATASET_F_INT6
+H5LT_CONST_mp_H5LTMAKE_DATASET_F_INT7
+H5LT_CONST_mp_H5LTREAD_DATASET_F_PTR
+H5LT_CONST_mp_H5LTREAD_DATASET_F_INT1
+H5LT_CONST_mp_H5LTREAD_DATASET_F_INT2
+H5LT_CONST_mp_H5LTREAD_DATASET_F_INT3
+H5LT_CONST_mp_H5LTREAD_DATASET_F_INT4
+H5LT_CONST_mp_H5LTREAD_DATASET_F_INT5
+H5LT_CONST_mp_H5LTREAD_DATASET_F_INT6
+H5LT_CONST_mp_H5LTREAD_DATASET_F_INT7
+H5LT_CONST_mp_H5LTMAKE_DATASET_INT_F_1
+H5LT_CONST_mp_H5LTMAKE_DATASET_INT_F_2
+H5LT_CONST_mp_H5LTMAKE_DATASET_INT_F_3
+H5LT_CONST_mp_H5LTMAKE_DATASET_INT_F_4
+H5LT_CONST_mp_H5LTMAKE_DATASET_INT_F_5
+H5LT_CONST_mp_H5LTMAKE_DATASET_INT_F_6
+H5LT_CONST_mp_H5LTMAKE_DATASET_INT_F_7
+H5LT_CONST_mp_H5LTREAD_DATASET_INT_F_1
+H5LT_CONST_mp_H5LTREAD_DATASET_INT_F_2
+H5LT_CONST_mp_H5LTREAD_DATASET_INT_F_3
+H5LT_CONST_mp_H5LTREAD_DATASET_INT_F_4
+H5LT_CONST_mp_H5LTREAD_DATASET_INT_F_5
+H5LT_CONST_mp_H5LTREAD_DATASET_INT_F_6
+H5LT_CONST_mp_H5LTREAD_DATASET_INT_F_7
+H5LT_CONST_mp_H5LTMAKE_DATASET_STRING_F
+H5LT_CONST_mp_H5LTREAD_DATASET_STRING_F
+H5LT_CONST_mp_H5LTSET_ATTRIBUTE_F
+H5LT_CONST_mp_H5LTSET_ATTRIBUTE_INT_F
+H5LT_CONST_mp_H5LTSET_ATTRIBUTE_FLOAT_F
+H5LT_CONST_mp_H5LTSET_ATTRIBUTE_DOUBLE_F
+H5LT_CONST_mp_H5LTSET_ATTRIBUTE_STRING_F
+H5LT_CONST_mp_H5LTGET_ATTRIBUTE_F
+H5LT_CONST_mp_H5LTGET_ATTRIBUTE_INT_F
+H5LT_CONST_mp_H5LTGET_ATTRIBUTE_FLOAT_F
+H5LT_CONST_mp_H5LTGET_ATTRIBUTE_DOUBLE_F
+H5LT_CONST_mp_H5LTGET_ATTRIBUTE_STRING_F
+H5LT_CONST_mp_H5LTGET_DATASET_NDIMS_F
+H5LT_CONST_mp_H5LTFIND_DATASET_F
+H5LT_CONST_mp_H5LTGET_DATASET_INFO_F
+H5LT_CONST_mp_H5LTGET_ATTRIBUTE_NDIMS_F
+H5LT_CONST_mp_H5LTGET_ATTRIBUTE_INFO_F
+H5LT_CONST_mp_H5LTPATH_VALID_F
+; H5TB
+H5TB_CONST_mp_H5TBMAKE_TABLE_F
+H5TB_CONST_mp_H5TBWRITE_FIELD_NAME_F_INT
+H5TB_CONST_mp_H5TBWRITE_FIELD_NAME_F_STRING
+H5TB_CONST_mp_H5TBREAD_FIELD_NAME_F_INT
+H5TB_CONST_mp_H5TBREAD_FIELD_NAME_F_STRING
+H5TB_CONST_mp_H5TBWRITE_FIELD_INDEX_F_INT
+H5TB_CONST_mp_H5TBWRITE_FIELD_INDEX_F_STRING
+H5TB_CONST_mp_H5TBREAD_FIELD_INDEX_F_INT
+H5TB_CONST_mp_H5TBREAD_FIELD_INDEX_F_STRING
+H5TB_CONST_mp_H5TBINSERT_FIELD_F_INT
+H5TB_CONST_mp_H5TBINSERT_FIELD_F_STRING
+H5TB_CONST_mp_H5TBDELETE_FIELD_F
+H5TB_CONST_mp_H5TBGET_TABLE_INFO_F
+H5TB_CONST_mp_H5TBGET_FIELD_INFO_F
diff --git a/hl/fortran/test/CMakeLists.txt b/hl/fortran/test/CMakeLists.txt
index d84ed4d..fc703dc 100644
--- a/hl/fortran/test/CMakeLists.txt
+++ b/hl/fortran/test/CMakeLists.txt
@@ -7,7 +7,7 @@ PROJECT (HDF5_HL_FORTRAN_TESTS C CXX Fortran)
 INCLUDE_DIRECTORIES (${CMAKE_Fortran_MODULE_DIRECTORY} ${HDF5_F90_BINARY_DIR} ${HDF5_F90_SRC_DIR}/src)
 
 #-- Adding test for hl_f90_tstds
-add_executable (hl_f90_tstds tstds.f90)
+add_executable (hl_f90_tstds tstds.F90)
 TARGET_NAMING (hl_f90_tstds STATIC)
 TARGET_FORTRAN_PROPERTIES (hl_f90_tstds STATIC " " " ")
 target_link_libraries (hl_f90_tstds ${HDF5_HL_F90_LIB_TARGET} ${HDF5_F90_LIB_TARGET})
@@ -15,7 +15,7 @@ target_include_directories (hl_f90_tstds PRIVATE ${CMAKE_Fortran_MODULE_DIRECTOR
 set_target_properties (hl_f90_tstds PROPERTIES LINKER_LANGUAGE Fortran)
 set_target_properties (hl_f90_tstds PROPERTIES FOLDER test/hl/fortran)
 if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-  add_executable (hl_f90_tstds-shared tstds.f90)
+  add_executable (hl_f90_tstds-shared tstds.F90)
   TARGET_NAMING (hl_f90_tstds-shared SHARED)
   TARGET_FORTRAN_PROPERTIES (hl_f90_tstds-shared SHARED " " " ")
   target_link_libraries (hl_f90_tstds-shared ${HDF5_HL_F90_LIBSH_TARGET} ${HDF5_F90_LIBSH_TARGET})
@@ -28,7 +28,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 
 #-- Adding test for hl_f90_tstlite
-add_executable (hl_f90_tstlite tstlite.f90)
+add_executable (hl_f90_tstlite tstlite.F90)
 TARGET_NAMING (hl_f90_tstlite STATIC)
 TARGET_FORTRAN_PROPERTIES (hl_f90_tstlite STATIC " " " ")
 target_link_libraries (hl_f90_tstlite ${HDF5_HL_F90_LIB_TARGET} ${HDF5_F90_LIB_TARGET})
@@ -36,7 +36,7 @@ target_include_directories (hl_f90_tstlite PRIVATE ${CMAKE_Fortran_MODULE_DIRECT
 set_target_properties (hl_f90_tstlite PROPERTIES LINKER_LANGUAGE Fortran)
 set_target_properties (hl_f90_tstlite PROPERTIES FOLDER test/hl/fortran)
 if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-  add_executable (hl_f90_tstlite-shared tstlite.f90)
+  add_executable (hl_f90_tstlite-shared tstlite.F90)
   TARGET_NAMING (hl_f90_tstlite-shared SHARED)
   TARGET_FORTRAN_PROPERTIES (hl_f90_tstlite-shared SHARED " " " ")
   target_link_libraries (hl_f90_tstlite-shared ${HDF5_HL_F90_LIBSH_TARGET} ${HDF5_F90_LIBSH_TARGET})
@@ -49,7 +49,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 
 #-- Adding test for hl_f90_tstimage
-add_executable (hl_f90_tstimage tstimage.f90)
+add_executable (hl_f90_tstimage tstimage.F90)
 TARGET_NAMING (hl_f90_tstimage STATIC)
 TARGET_FORTRAN_PROPERTIES (hl_f90_tstimage STATIC " " " ")
 target_link_libraries (hl_f90_tstimage  ${HDF5_HL_F90_LIB_TARGET} ${HDF5_F90_LIB_TARGET})
@@ -57,7 +57,7 @@ target_include_directories (hl_f90_tstimage PRIVATE ${CMAKE_Fortran_MODULE_DIREC
 set_target_properties (hl_f90_tstimage PROPERTIES LINKER_LANGUAGE Fortran)
 set_target_properties (hl_f90_tstimage PROPERTIES FOLDER test/hl/fortran)
 if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-  add_executable (hl_f90_tstimage-shared tstimage.f90)
+  add_executable (hl_f90_tstimage-shared tstimage.F90)
   TARGET_NAMING (hl_f90_tstimage-shared SHARED)
   TARGET_FORTRAN_PROPERTIES (hl_f90_tstimage-shared SHARED " " " ")
   target_link_libraries (hl_f90_tstimage-shared  ${HDF5_HL_F90_LIBSH_TARGET} ${HDF5_F90_LIBSH_TARGET})
@@ -70,7 +70,7 @@ if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 endif (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
 
 #-- Adding test for hl_f90_tsttable
-add_executable (hl_f90_tsttable tsttable.f90)
+add_executable (hl_f90_tsttable tsttable.F90)
 TARGET_NAMING (hl_f90_tsttable STATIC)
 TARGET_FORTRAN_PROPERTIES (hl_f90_tsttable STATIC " " " ")
 target_link_libraries (hl_f90_tsttable ${HDF5_HL_F90_LIB_TARGET} ${HDF5_F90_LIB_TARGET})
@@ -78,7 +78,7 @@ target_include_directories (hl_f90_tsttable PRIVATE ${CMAKE_Fortran_MODULE_DIREC
 set_target_properties (hl_f90_tsttable PROPERTIES LINKER_LANGUAGE Fortran)
 set_target_properties (hl_f90_tsttable PROPERTIES FOLDER test/hl/fortran)
 if (BUILD_SHARED_LIBS AND NOT SKIP_HDF5_FORTRAN_SHARED)
-  add_executable (hl_f90_tsttable-shared tsttable.f90)
+  add_executable (hl_f90_tsttable-shared tsttable.F90)
   TARGET_NAMING (hl_f90_tsttable-shared SHARED)
   TARGET_FORTRAN_PROPERTIES (hl_f90_tsttable-shared SHARED " " " ")
   target_link_libraries (hl_f90_tsttable-shared ${HDF5_HL_F90_LIBSH_TARGET} ${HDF5_F90_LIBSH_TARGET})
diff --git a/hl/fortran/test/Makefile.am b/hl/fortran/test/Makefile.am
index fa3a803..ca49817 100644
--- a/hl/fortran/test/Makefile.am
+++ b/hl/fortran/test/Makefile.am
@@ -39,10 +39,10 @@ check_PROGRAMS=$(TEST_PROG)
 LDADD= $(LIBH5F_HL) $(LIBH5F) $(LIBH5_HL)  $(LIBHDF5)
 
 # Source files for the programs
-tstds_SOURCES=tstds.f90
-tstlite_SOURCES=tstlite.f90
-tstimage_SOURCES=tstimage.f90
-tsttable_SOURCES=tsttable.f90
+tstds_SOURCES=tstds.F90
+tstlite_SOURCES=tstlite.F90
+tstimage_SOURCES=tstimage.F90
+tsttable_SOURCES=tsttable.F90
 
 # Temporary files.
 CHECK_CLEANFILES+=dsetf[1-5].h5 f1img.h5 f1tab.h5 tstds.h5
@@ -51,4 +51,4 @@ CHECK_CLEANFILES+=dsetf[1-5].h5 f1img.h5 f1tab.h5 tstds.h5
 # from tests in conclude.am)
 FORTRAN_API=yes
 
-include $(top_srcdir)/config/conclude.am
+include $(top_srcdir)/config/conclude_fc.am
diff --git a/hl/fortran/test/Makefile.in b/hl/fortran/test/Makefile.in
index 6725d26..4b71b17 100644
--- a/hl/fortran/test/Makefile.in
+++ b/hl/fortran/test/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -30,8 +30,22 @@
 #
 #
 # HDF5 High-Level Fortran Makefile(.in)
+
+# Makefile.am include fragment with Fortran helper rules and macros.
+
+# AM_FCCPPFLAGS, FCCPPFLAGS are currently not used.
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -94,10 +108,6 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(top_srcdir)/bin/test-driver
 
 # Some Fortran compilers can't build shared libraries, so sometimes we
 # need to make sure the Fortran programs link against the static version
@@ -108,11 +118,16 @@ TESTS = $(am__EXEEXT_1)
 subdir = hl/fortran/test
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 am__EXEEXT_1 = tstds$(EXEEXT) tstlite$(EXEEXT) tstimage$(EXEEXT) \
@@ -149,14 +164,11 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
-FCCOMPILE = $(FC) $(AM_FCFLAGS) $(FCFLAGS)
-LTFCCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=compile $(FC) $(AM_FCFLAGS) $(FCFLAGS)
-AM_V_FC = $(am__v_FC_ at AM_V@)
-am__v_FC_ = $(am__v_FC_ at AM_DEFAULT_V@)
-am__v_FC_0 = @echo "  FC      " $@;
-am__v_FC_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
+AM_V_PPFC = $(am__v_PPFC_ at AM_V@)
+am__v_PPFC_ = $(am__v_PPFC_ at AM_DEFAULT_V@)
+am__v_PPFC_0 = @echo "  PPFC    " $@;
+am__v_PPFC_1 = 
 FCLD = $(FC)
 FCLINK = $(LIBTOOL) $(AM_V_lt) --tag=FC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(FCLD) $(AM_FCFLAGS) $(FCFLAGS) \
@@ -395,6 +407,10 @@ am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
 TEST_LOGS = $(am__test_logs2:.sh.log=.log)
 SH_LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
 SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am \
+	$(top_srcdir)/config/conclude_fc.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -415,7 +431,6 @@ AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@ -I$(top_builddir)/fortran/src \
 	$(F9XMODFLAG)$(top_builddir)/fortran/src \
 	$(F9XMODFLAG)$(top_builddir)/hl/fortran/src
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@ $(am__append_1)
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -460,14 +475,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -477,13 +500,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -525,9 +547,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -674,14 +707,16 @@ TEST_PROG = tstds tstlite tstimage tsttable
 LDADD = $(LIBH5F_HL) $(LIBH5F) $(LIBH5_HL)  $(LIBHDF5)
 
 # Source files for the programs
-tstds_SOURCES = tstds.f90
-tstlite_SOURCES = tstlite.f90
-tstimage_SOURCES = tstimage.f90
-tsttable_SOURCES = tsttable.f90
+tstds_SOURCES = tstds.F90
+tstlite_SOURCES = tstlite.F90
+tstimage_SOURCES = tstimage.F90
+tsttable_SOURCES = tsttable.F90
 
 # Mark this directory as part of the Fortran API (this affects output
 # from tests in conclude.am)
 FORTRAN_API = yes
+PPFCCOMPILE = $(FC) $(FCDEFS) $(DEFAULT_INCLUDES)  $(FCINCLUDES) $(AM_FCCPPFLAGS) $(FCCPPFLAGS) $(AM_FCFLAGS) $(FCFLAGS)
+LTPPFCCOMPILE = $(LIBTOOL) --tag=FC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(PPFCCOMPILE)
 
 # Automake needs to be taught how to build lib, progs, and tests targets.
 # These will be filled in automatically for the most part (e.g.,
@@ -705,8 +740,8 @@ TEST_SCRIPT_PARA_CHKSH = $(TEST_SCRIPT_PARA:=.chkexe_)
 all: all-am
 
 .SUFFIXES:
-.SUFFIXES: .f90 .lo .log .o .obj .sh .sh$(EXEEXT) .trs
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
+.SUFFIXES: .F90 .f90 .lo .log .o .obj .sh .sh$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude_fc.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
@@ -718,7 +753,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/fortran/test/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign hl/fortran/test/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -727,7 +761,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude_fc.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -769,14 +803,11 @@ mostlyclean-compile:
 distclean-compile:
 	-rm -f *.tab.c
 
-.f90.o:
-	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
+.F90.obj:
+	$(AM_V_PPFC)$(PPFCCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
 
-.f90.obj:
-	$(AM_V_FC)$(FCCOMPILE) -c -o $@ $(FCFLAGS_f90) `$(CYGPATH_W) '$<'`
-
-.f90.lo:
-	$(AM_V_FC)$(LTFCCOMPILE) -c -o $@ $(FCFLAGS_f90) $<
+.F90.lo:
+	$(AM_V_PPFC)$(LTPPFCCOMPILE) -c -o $@ $<
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -866,7 +897,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1163,6 +1194,8 @@ uninstall-am:
 	mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
@@ -1175,6 +1208,12 @@ uninstall-am:
 help:
 	@$(top_srcdir)/bin/makehelp
 
+# Treat all .f90 and .F90 files as preprocessed Fortran.
+.f90.o:
+	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+.F90.o:
+	$(PPFCCOMPILE) -c -o $@ $(FCFLAGS) $<
+
 # lib/progs/tests targets recurse into subdirectories. build-* targets
 # build files in this directory.
 build-lib: $(LIB)
diff --git a/hl/fortran/test/tstds.f90 b/hl/fortran/test/tstds.F90
similarity index 100%
rename from hl/fortran/test/tstds.f90
rename to hl/fortran/test/tstds.F90
diff --git a/hl/fortran/test/tstimage.f90 b/hl/fortran/test/tstimage.F90
similarity index 100%
rename from hl/fortran/test/tstimage.f90
rename to hl/fortran/test/tstimage.F90
diff --git a/hl/fortran/test/tstlite.F90 b/hl/fortran/test/tstlite.F90
new file mode 100644
index 0000000..0ba7815
--- /dev/null
+++ b/hl/fortran/test/tstlite.F90
@@ -0,0 +1,1924 @@
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+!
+! This file contains the FORTRAN90 tests for H5LT
+!
+#include <H5config_f.inc>
+
+PROGRAM lite_test
+  
+  CALL test_dataset1D()
+  CALL test_dataset2D()
+  CALL test_dataset3D()
+  CALL test_datasetND(4)
+  CALL test_datasetND(5)
+  CALL test_datasetND(6)
+  CALL test_datasetND(7)
+  CALL test_datasets()
+  CALL test_attributes()
+
+END PROGRAM lite_test
+
+
+!-------------------------------------------------------------------------
+! test_dataset1D
+!-------------------------------------------------------------------------
+
+SUBROUTINE test_dataset1D()
+  
+  USE, INTRINSIC :: ISO_C_BINDING
+  USE H5LT ! module of H5LT
+  USE HDF5 ! module of HDF5 library
+  
+  IMPLICIT NONE
+  
+  INTEGER, PARAMETER :: DIM1 = 4                       ! Dimension of array
+  CHARACTER(len=9), PARAMETER :: filename = "dsetf1.h5"! File name
+  CHARACTER(LEN=5), PARAMETER :: dsetname1 = "dset1"   ! Dataset name
+  CHARACTER(LEN=5), PARAMETER :: dsetname2 = "dset2"   ! Dataset name
+  CHARACTER(LEN=5), PARAMETER :: dsetname3 = "dset3"   ! Dataset name
+  INTEGER(HID_T) :: file_id                            ! File identifier
+  INTEGER(HSIZE_T), DIMENSION(1) :: dims = (/DIM1/)    ! Dataset dimensions
+  INTEGER        :: rank = 1                           ! Dataset rank
+  INTEGER, DIMENSION(DIM1) :: buf1                     ! Data buffer
+  INTEGER, DIMENSION(DIM1) :: bufr1                    ! Data buffer
+  REAL, DIMENSION(DIM1)    :: buf2                     ! Data buffer
+  REAL, DIMENSION(DIM1)    :: bufr2                    ! Data buffer
+  DOUBLE PRECISION, DIMENSION(DIM1), TARGET :: buf3    ! Data buffer
+  DOUBLE PRECISION, DIMENSION(DIM1), TARGET :: bufr3   ! Data buffer
+  INTEGER        :: errcode                            ! Error flag
+  INTEGER        :: i                                  ! general purpose integer
+  TYPE(C_PTR) :: f_ptr
+  integer(HID_T) :: mytype
+
+  CALL test_begin(' Make/Read datasets (1D)        ')
+
+  !
+  ! Initialize the data array.
+  !
+  DO i = 1, DIM1
+     buf1(i) = i
+     buf2(i) = i
+     buf3(i) = i
+  END DO
+
+  !
+  ! Initialize FORTRAN predefined datatypes.
+  !
+  CALL h5open_f(errcode)
+
+  !
+  ! Create a new file using default properties.
+  !
+  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, errcode)
+
+  !-------------------------------------------------------------------------
+  ! H5T_NATIVE_INTEGER
+  !-------------------------------------------------------------------------
+
+  !
+  ! write dataset.
+  !
+  CALL h5ltmake_dataset_f(file_id, dsetname1, rank, dims, H5T_NATIVE_INTEGER, buf1, errcode)
+  !
+  ! read dataset.
+  !
+  CALL h5ltread_dataset_f(file_id, dsetname1, H5T_NATIVE_INTEGER, bufr1, dims, errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, DIM1
+     IF ( buf1(i) .NE. bufr1(i) ) THEN
+        PRINT *, 'read buffer differs from write buffer (I)'
+        PRINT *,  bufr1(i), ' and ',   buf1(i)
+        STOP
+     ENDIF
+  END DO
+
+  !-------------------------------------------------------------------------
+  ! H5T_NATIVE_REAL
+  !-------------------------------------------------------------------------
+
+  !
+  ! write dataset.
+  !
+  CALL h5ltmake_dataset_f(file_id, dsetname2, rank, dims, H5T_NATIVE_REAL, buf2, errcode)
+
+  !
+  ! read dataset.
+  !
+  CALL h5ltread_dataset_f(file_id, dsetname2, H5T_NATIVE_REAL, bufr2, dims, errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, DIM1
+     IF ( buf2(i) .NE. bufr2(i) ) THEN
+        PRINT *, 'read buffer differs from write buffer (R)'
+        PRINT *,  bufr2(i), ' and ',   buf2(i)
+        STOP
+     ENDIF
+  END DO
+
+  !-------------------------------------------------------------------------
+  ! H5T_NATIVE_DOUBLE
+  !-------------------------------------------------------------------------
+
+  !
+  ! write dataset.
+  !
+  f_ptr = C_LOC(buf3(1))
+  mytype = h5kind_to_type(KIND(buf3(1)), H5_REAL_KIND)
+  CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims, &
+       mytype, f_ptr, errcode)
+  !CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims, H5T_NATIVE_DOUBLE, buf3, errcode)
+  ! h5kind_to_type(KIND(buf3(1)), H5_REAL_KIND)
+  !
+  ! read dataset.
+  !
+  f_ptr = C_LOC(bufr3(1))
+  CALL h5ltread_dataset_f(file_id, dsetname3, &
+       h5kind_to_type(KIND(bufr3(1)), H5_REAL_KIND), f_ptr, errcode)
+  !CALL h5ltread_dataset_f(file_id, dsetname3, H5T_NATIVE_DOUBLE, bufr3, dims, errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, DIM1
+     IF ( buf3(i) .NE. bufr3(i) ) THEN
+        PRINT *, 'read buffer differs from write buffer (D)'
+        PRINT *,  bufr3(i), ' and ',   buf3(i)
+        STOP
+     ENDIF
+  END DO
+
+  !
+  ! Close the file.
+  !
+  CALL h5fclose_f(file_id, errcode)
+
+  !
+  ! Close FORTRAN predefined datatypes.
+  !
+  CALL h5close_f(errcode)
+
+  CALL passed()
+  !
+  ! end function.
+  !
+END SUBROUTINE test_dataset1D
+
+!-------------------------------------------------------------------------
+! test_dataset2D
+!-------------------------------------------------------------------------
+
+SUBROUTINE test_dataset2D()
+
+  USE, INTRINSIC :: ISO_C_BINDING
+  USE H5LT ! module of H5LT
+  USE HDF5 ! module of HDF5 library
+
+  IMPLICIT NONE
+
+
+  INTEGER(HSIZE_T), PARAMETER :: DIM1 = 4              ! columns
+  INTEGER(HSIZE_T), PARAMETER :: DIM2 = 6              ! rows
+  CHARACTER(len=9), PARAMETER :: filename = "dsetf2.h5"! File name
+  CHARACTER(LEN=5), PARAMETER :: dsetname1 = "dset1"   ! Dataset name
+  CHARACTER(LEN=5), PARAMETER :: dsetname2 = "dset2"   ! Dataset name
+  CHARACTER(LEN=5), PARAMETER :: dsetname3 = "dset3"   ! Dataset name
+  CHARACTER(LEN=5), PARAMETER :: dsetname4 = "dset4"   ! Dataset name
+  INTEGER(HID_T) :: file_id                            ! File identifier
+  INTEGER(HSIZE_T), DIMENSION(2) :: dims = (/4,6/)     ! Dataset dimensions
+  INTEGER        :: rank = 2                           ! Dataset rank
+  INTEGER, DIMENSION(DIM1*DIM2) :: buf                 ! Data buffer
+  INTEGER, DIMENSION(DIM1*DIM2) :: bufr                ! Data buffer
+  INTEGER, DIMENSION(DIM1,DIM2) :: buf2                ! Data buffer
+  INTEGER, DIMENSION(DIM1,DIM2) :: buf2r               ! Data buffer
+  REAL, DIMENSION(DIM1,DIM2), TARGET    :: buf3                ! Data buffer
+  REAL, DIMENSION(DIM1,DIM2), TARGET    :: buf3r               ! Data buffer
+  DOUBLE PRECISION, DIMENSION(DIM1,DIM2), TARGET :: buf4       ! Data buffer
+  DOUBLE PRECISION, DIMENSION(DIM1,DIM2), TARGET :: buf4r      ! Data buffer
+  INTEGER        :: errcode                            ! Error flag
+  INTEGER(HSIZE_T) :: i, j, n                            ! general purpose integers
+  TYPE(C_PTR) :: f_ptr
+
+  CALL test_begin(' Make/Read datasets (2D)        ')
+
+
+  !
+  ! Initialize the data arrays.
+  !
+  n=1
+  DO i = 1, DIM1*DIM2
+     buf(i) = INT(n)
+     n = n + 1
+  END DO
+
+  DO i = 1, dims(1)
+     DO j = 1, dims(2)
+        buf2(i,j) = INT((i-1)*dims(2) + j)
+        buf3(i,j) = INT((i-1)*dims(2) + j)
+        buf4(i,j) = INT((i-1)*dims(2) + j)
+     END DO
+  END DO
+
+  !
+  ! Initialize FORTRAN predefined datatypes.
+  !
+  CALL h5open_f(errcode)
+
+  !
+  ! Create a new file using default properties.
+  !
+  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, errcode)
+
+  !-------------------------------------------------------------------------
+  ! H5T_NATIVE_INT 1D buffer
+  !-------------------------------------------------------------------------
+
+  !
+  ! write dataset.
+  !
+  CALL h5ltmake_dataset_f(file_id, dsetname1, rank, dims, H5T_NATIVE_INTEGER, buf, errcode)
+
+  !
+  ! read dataset.
+  !
+  CALL h5ltread_dataset_f(file_id, dsetname1, H5T_NATIVE_INTEGER, bufr, dims, errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, DIM1*DIM2
+     IF ( buf(i) .NE. bufr(i) ) THEN
+        PRINT *, 'read buffer differs from write buffer'
+        PRINT *,  bufr(i), ' and ',   buf(i)
+        STOP
+     ENDIF
+  END DO
+
+  !-------------------------------------------------------------------------
+  ! H5T_NATIVE_INT 2D buffer
+  !-------------------------------------------------------------------------
+
+  !
+  ! write dataset.
+  !
+  CALL h5ltmake_dataset_f(file_id, dsetname2, rank, dims, H5T_NATIVE_INTEGER, buf2, errcode)
+
+  !
+  ! read dataset.
+  !
+  CALL h5ltread_dataset_f(file_id, dsetname2, H5T_NATIVE_INTEGER, buf2r, dims, errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, dims(1)
+     DO j = 1, dims(2)
+        IF ( buf2(i,j) .NE. buf2r(i,j) ) THEN
+           PRINT *, 'read buffer differs from write buffer'
+           PRINT *,  buf2r(i,j), ' and ',   buf2(i,j)
+           STOP
+        ENDIF
+     END DO
+  END DO
+
+  !-------------------------------------------------------------------------
+  ! H5T_NATIVE_REAL
+  !-------------------------------------------------------------------------
+
+  !
+  ! write dataset.
+  !
+  f_ptr = C_LOC(buf3(1,1))
+  CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims, H5T_NATIVE_REAL, f_ptr, errcode)
+  !CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims, H5T_NATIVE_REAL, buf3, errcode)
+
+  !
+  ! read dataset.
+  !
+  f_ptr = C_LOC(buf3r(1,1))
+  CALL h5ltread_dataset_f(file_id, dsetname3, H5T_NATIVE_REAL, f_ptr, errcode)
+  !CALL h5ltread_dataset_f(file_id, dsetname3, H5T_NATIVE_REAL, buf3r, dims, errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, dims(1)
+     DO j = 1, dims(2)
+        IF ( buf3(i,j) .NE. buf3r(i,j) ) THEN
+           PRINT *, 'read buffer differs from write buffer'
+           PRINT *,  buf3r(i,j), ' and ',   buf3(i,j)
+           STOP
+        ENDIF
+     END DO
+  END DO
+
+  !-------------------------------------------------------------------------
+  ! H5T_NATIVE_DOUBLE
+  !-------------------------------------------------------------------------
+
+  !
+  ! write dataset.
+  !
+  f_ptr = C_LOC(buf4(1,1))
+  CALL h5ltmake_dataset_f(file_id, dsetname4, rank, dims, H5T_NATIVE_DOUBLE, f_ptr, errcode)
+  !CALL h5ltmake_dataset_f(file_id, dsetname4, rank, dims, H5T_NATIVE_DOUBLE, buf4, errcode)
+
+  !
+  ! read dataset.
+  f_ptr = C_LOC(buf4r(1,1))
+  CALL h5ltread_dataset_f(file_id, dsetname4, H5T_NATIVE_DOUBLE, f_ptr, errcode)
+
+  !CALL h5ltread_dataset_f(file_id, dsetname4, H5T_NATIVE_DOUBLE, buf4r, dims, errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, dims(1)
+     DO j = 1, dims(2)
+        IF ( buf4(i,j) .NE. buf4r(i,j) ) THEN
+           PRINT *, 'read buffer differs from write buffer'
+           PRINT *,  buf4r(i,j), ' and ',   buf4(i,j)
+           STOP
+        ENDIF
+     END DO
+  END DO
+
+  !
+  ! Close the file.
+  !
+  CALL h5fclose_f(file_id, errcode)
+
+  !
+  ! Close FORTRAN predefined datatypes.
+  !
+  CALL h5close_f(errcode)
+
+  CALL passed()
+  !
+  ! end function.
+  !
+END SUBROUTINE test_dataset2D
+
+
+!-------------------------------------------------------------------------
+! test_dataset3D
+!-------------------------------------------------------------------------
+
+
+SUBROUTINE test_dataset3D()
+  USE, INTRINSIC :: ISO_C_BINDING
+  USE H5LT ! module of H5LT
+  USE HDF5 ! module of HDF5 library
+
+  IMPLICIT NONE
+
+  INTEGER, PARAMETER :: DIM1 = 6                             ! columns
+  INTEGER, PARAMETER :: DIM2 = 4                             ! rows
+  INTEGER, PARAMETER :: DIM3 = 2                             ! layers
+  CHARACTER(len=9), PARAMETER :: filename = "dsetf3.h5"       ! File name
+  CHARACTER(LEN=5), PARAMETER :: dsetname1 = "dset1"          ! Dataset name
+  CHARACTER(LEN=5), PARAMETER :: dsetname2 = "dset2"          ! Dataset name
+  CHARACTER(LEN=5), PARAMETER :: dsetname3 = "dset3"          ! Dataset name
+  CHARACTER(LEN=5), PARAMETER :: dsetname4 = "dset4"          ! Dataset name
+  INTEGER(HID_T) :: file_id                                   ! File identifier
+  INTEGER(HSIZE_T), DIMENSION(3) :: dims = (/DIM1,DIM2,DIM3/) ! Dataset dimensions
+  INTEGER(HSIZE_T), DIMENSION(3) :: dimsr                     ! Dataset dimensions
+  INTEGER, DIMENSION(DIM1*DIM2*DIM3) :: buf                   ! Data buffer
+  INTEGER, DIMENSION(DIM1*DIM2*DIM3) :: bufr                  ! Data buffer
+  INTEGER, DIMENSION(DIM1,DIM2,DIM3) :: buf2                  ! Data buffer
+  INTEGER, DIMENSION(DIM1,DIM2,DIM3) :: buf2r                 ! Data buffer
+  REAL, DIMENSION(DIM1,DIM2,DIM3), TARGET    :: buf3                  ! Data buffer
+  REAL, DIMENSION(DIM1,DIM2,DIM3), TARGET    :: buf3r                 ! Data buffer
+  DOUBLE PRECISION, DIMENSION(DIM1,DIM2,DIM3), TARGET :: buf4         ! Data buffer
+  DOUBLE PRECISION, DIMENSION(DIM1,DIM2,DIM3), TARGET :: buf4r        ! Data buffer
+  INTEGER        :: rank = 3                                  ! Dataset rank
+  INTEGER        :: errcode                                   ! Error flag
+  INTEGER(HSIZE_T) :: i, j, k, n                                ! general purpose integers
+  INTEGER          :: type_class
+  INTEGER(SIZE_T)  :: type_size
+  TYPE(C_PTR) :: f_ptr
+#if H5_HAVE_Fortran_INTEGER_SIZEOF_16!=0
+  INTEGER, PARAMETER :: int_kind_32 = SELECTED_INT_KIND(36) !should map to INTEGER*16 on most modern processors
+  INTEGER(int_kind_32), DIMENSION(DIM1,DIM2,DIM3), TARGET :: dset_data_i32, data_out_i32
+  INTEGER(HID_T) :: dset_id32     ! Dataset identifier
+  CHARACTER(LEN=7), PARAMETER :: dsetname16a = "dset16a"     ! Dataset name
+  CHARACTER(LEN=7), PARAMETER :: dsetname16b = "dset16b"     ! Dataset name
+  CHARACTER(LEN=7), PARAMETER :: dsetname16c = "dset16c"     ! Dataset name
+  INTEGER(HID_T) :: type_id
+#endif
+
+  CALL test_begin(' Make/Read datasets (3D)        ')
+
+
+  !
+  ! Initialize the data array.
+  !
+  n=1
+  DO i = 1, DIM1*DIM2*DIM3
+     buf(i) = INT(n)
+     n = n + 1
+  END DO
+
+  n = 1
+  DO i = 1, dims(1)
+     DO j = 1, dims(2)
+        DO k = 1, dims(3)
+           buf2(i,j,k) = INT(n)
+           buf3(i,j,k) = INT(n)
+           buf4(i,j,k) = INT(n)
+#if H5_HAVE_Fortran_INTEGER_SIZEOF_16!=0
+           dset_data_i32(i,j,k) = HUGE(1_int_kind_32)-INT(n,int_kind_32)
+#endif
+           n = n + 1
+        END DO
+     END DO
+  END DO
+
+  !
+  ! Initialize FORTRAN predefined datatypes.
+  !
+  CALL h5open_f(errcode)
+
+  !
+  ! Create a new file using default properties.
+  !
+  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, errcode)
+
+  !-------------------------------------------------------------------------
+  ! H5T_NATIVE_INT 1D buffer
+  !-------------------------------------------------------------------------
+
+  !
+  ! write dataset.
+  !
+  CALL h5ltmake_dataset_f(file_id, dsetname1, rank, dims, H5T_NATIVE_INTEGER, buf, errcode)
+
+  !
+  ! read dataset.
+  !
+  CALL h5ltread_dataset_f(file_id, dsetname1, H5T_NATIVE_INTEGER, bufr, dims, errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, DIM1*DIM2*DIM3
+     IF ( buf(i) .NE. bufr(i) ) THEN
+        PRINT *, 'read buffer differs from write buffer'
+        PRINT *,  bufr(i), ' and ',   buf(i)
+        STOP
+     ENDIF
+  END DO
+
+  !-------------------------------------------------------------------------
+  ! H5T_NATIVE_INT 3D buffer
+  !-------------------------------------------------------------------------
+
+  !
+  ! write dataset.
+  !
+  CALL h5ltmake_dataset_f(file_id, dsetname2, rank, dims, H5T_NATIVE_INTEGER, buf2, errcode)
+
+  !
+  ! read dataset.
+  !
+  CALL h5ltread_dataset_f(file_id, dsetname2, H5T_NATIVE_INTEGER, buf2r, dims, errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, dims(1)
+     DO j = 1, dims(2)
+        DO k = 1, dims(3)
+           IF ( buf2(i,j,k) .NE. buf2r(i,j,k) ) THEN
+              PRINT *, 'read buffer differs from write buffer'
+              PRINT *,  buf2r(i,j,k), ' and ',   buf2(i,j,k)
+              STOP
+           ENDIF
+        END DO
+     END DO
+  END DO
+
+  !-------------------------------------------------------------------------
+  ! H5T_NATIVE_REAL
+  !-------------------------------------------------------------------------
+
+  !
+  ! write dataset.
+  !
+  f_ptr = C_LOC(buf3(1,1,1))
+  CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims, H5T_NATIVE_REAL, f_ptr, errcode)
+  !CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims, H5T_NATIVE_REAL, buf3, errcode)
+
+  !
+  ! read dataset.
+  !
+  f_ptr = C_LOC(buf3r(1,1,1))
+  CALL h5ltread_dataset_f(file_id, dsetname3, H5T_NATIVE_REAL, f_ptr, errcode)
+  !CALL h5ltread_dataset_f(file_id, dsetname3, H5T_NATIVE_REAL, buf3r, dims, errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, dims(1)
+     DO j = 1, dims(2)
+        DO k = 1, dims(3)
+           IF ( buf3(i,j,k) .NE. buf3r(i,j,k) ) THEN
+              PRINT *, 'read buffer differs from write buffer'
+              PRINT *,  buf3r(i,j,k), ' and ',   buf3(i,j,k)
+              STOP
+           ENDIF
+        END DO
+     END DO
+  END DO
+
+  !-------------------------------------------------------------------------
+  ! H5T_NATIVE_DOUBLE
+  !-------------------------------------------------------------------------
+
+  !
+  ! write dataset.
+  !
+  f_ptr = C_LOC(buf4(1,1,1))
+  CALL h5ltmake_dataset_f(file_id, dsetname4, rank, dims, H5T_NATIVE_DOUBLE, f_ptr, errcode)
+
+  !
+  ! read dataset.
+  !
+  f_ptr = C_LOC(buf4r(1,1,1))
+  CALL h5ltread_dataset_f(file_id, dsetname4, H5T_NATIVE_DOUBLE, f_ptr, errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, dims(1)
+     DO j = 1, dims(2)
+        DO k = 1, dims(3)
+           IF ( buf4(i,j,k) .NE. buf4r(i,j,k) ) THEN
+              PRINT *, 'read buffer differs from write buffer'
+              PRINT *,  buf4r(i,j,k), ' and ',   buf4(i,j,k)
+              STOP
+           ENDIF
+        END DO
+     END DO
+  END DO
+
+  CALL h5ltget_dataset_info_f(file_id,dsetname4,dimsr,type_class,type_size,errcode )
+
+  !
+  ! compare dimensions
+  !
+  DO i = 1, rank
+     IF ( dimsr(i) .NE. dims(i) ) THEN
+        PRINT *, 'dimensions differ '
+        STOP
+     ENDIF
+  END DO
+
+  !-------------------------------------------------------------------------
+  ! CHECKING NON-NATIVE INTEGER TYPES
+  !-------------------------------------------------------------------------
+
+#if H5_HAVE_Fortran_INTEGER_SIZEOF_16!=0
+  ! (A) CHECKING INTEGER*16
+  !
+  !    (i.a) write dataset using F2003 interface
+  !
+  type_id = H5kind_to_type(KIND(dset_data_i32(1,1,1)), H5_INTEGER_KIND)
+  f_ptr = C_LOC(dset_data_i32(1,1,1))
+  CALL h5ltmake_dataset_f(file_id, dsetname16a, rank, dims, type_id, f_ptr, errcode)
+  !
+  !    (i.b) read dataset using F2003 interface
+  !
+  f_ptr = C_LOC(data_out_i32(1,1,1))
+  CALL h5ltread_dataset_f(file_id, dsetname16a, type_id, f_ptr, errcode)
+
+  !
+  !        compare read and write buffers.
+  !
+  DO i = 1, dims(1)
+     DO j = 1, dims(2)
+        DO k = 1, dims(3)
+           IF ( dset_data_i32(i,j,k) .NE. data_out_i32(i,j,k) ) THEN
+              PRINT *, 'read buffer differs from write buffer'
+              PRINT *,  dset_data_i32(i,j,k), ' and ', data_out_i32(i,j,k) 
+              STOP
+           ENDIF
+        END DO
+     END DO
+  ENDDO
+
+  !
+  !    (ii.a) write dataset using F90 interface
+  !
+  type_id = H5kind_to_type(KIND(dset_data_i32(1,1,1)), H5_INTEGER_KIND)
+  CALL h5ltmake_dataset_f(file_id, dsetname16b, rank, dims, type_id, dset_data_i32, errcode)
+  !
+  !    (ii.b) read dataset using F90 interface
+  !
+  CALL h5ltread_dataset_f(file_id, dsetname16b, type_id, data_out_i32, dims, errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, dims(1)
+     DO j = 1, dims(2)
+        DO k = 1, dims(3)
+           IF ( dset_data_i32(i,j,k) .NE. data_out_i32(i,j,k) ) THEN
+              PRINT *, 'read buffer differs from write buffer'
+              PRINT *,  dset_data_i32(i,j,k), ' and ', data_out_i32(i,j,k) 
+              STOP
+           ENDIF
+        END DO
+     END DO
+  ENDDO
+
+  !
+  !     (iii.a) write dataset using F90 H5LTmake_dataset_int_f interface
+  !
+  CALL h5ltmake_dataset_int_f(file_id, dsetname16c, rank, dims, dset_data_i32, errcode)
+
+  !
+  !     (iii.b) read dataset using F90 H5LTmake_dataset_int_f interface
+  !
+  CALL h5ltread_dataset_int_f(file_id, dsetname16c, data_out_i32, dims, errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, dims(1)
+     DO j = 1, dims(2)
+        DO k = 1, dims(3)
+           IF ( dset_data_i32(i,j,k) .NE. data_out_i32(i,j,k) ) THEN
+              PRINT *, 'read buffer differs from write buffer'
+              PRINT *,  dset_data_i32(i,j,k), ' and ', data_out_i32(i,j,k) 
+              STOP
+           ENDIF
+        END DO
+     END DO
+  ENDDO
+
+#endif
+
+  !
+  ! Close the file.
+  !
+  CALL h5fclose_f(file_id, errcode)
+
+  !
+  ! Close FORTRAN predefined datatypes.
+  !
+  CALL h5close_f(errcode)
+
+  CALL passed()
+  !
+  ! end function.
+  !
+END SUBROUTINE test_dataset3D
+
+!-------------------------------------------------------------------------
+! test_datasetND
+!-------------------------------------------------------------------------
+
+
+SUBROUTINE test_datasetND(rank)
+
+  USE, INTRINSIC :: ISO_C_BINDING
+  USE H5LT ! module of H5LT
+  USE HDF5 ! module of HDF5 library
+
+  IMPLICIT NONE
+
+  INTEGER            :: rank                                  ! Dataset rank
+
+  INTEGER, PARAMETER :: DIM1 = 2                              ! columns
+  INTEGER, PARAMETER :: DIM2 = 4                              ! rows
+  INTEGER, PARAMETER :: DIM3 = 2                              ! layers
+  INTEGER, PARAMETER :: DIM4 = 5                              ! columns
+  INTEGER, PARAMETER :: DIM5 = 4                              ! rows
+  INTEGER, PARAMETER :: DIM6 = 3                              ! layers
+  INTEGER, PARAMETER :: DIM7 = 2                              ! layers
+  CHARACTER(len=9), PARAMETER :: filename = "dsetf3.h5"       ! File name
+  CHARACTER(LEN=5), PARAMETER :: dsetname2 = "dset2"          ! Dataset name
+  CHARACTER(LEN=5), PARAMETER :: dsetname3 = "dset3"          ! Dataset name
+  CHARACTER(LEN=5), PARAMETER :: dsetname4 = "dset4"          ! Dataset name
+  CHARACTER(LEN=5), PARAMETER :: dsetname5 = "dset5"          ! Dataset name
+  INTEGER(HID_T) :: file_id                                   ! File identifier
+  INTEGER(HSIZE_T), DIMENSION(7) :: dims
+  INTEGER(HSIZE_T), DIMENSION(7) :: dimsr                       ! Dataset dimensions
+  INTEGER, ALLOCATABLE, DIMENSION(:,:,:,:) :: ibuf_4            ! Data buffer
+  INTEGER, ALLOCATABLE, DIMENSION(:,:,:,:) :: ibufr_4           ! Data buffer
+  INTEGER, ALLOCATABLE, DIMENSION(:,:,:,:,:), TARGET :: ibuf_5  ! Data buffer
+  INTEGER, ALLOCATABLE, DIMENSION(:,:,:,:,:), TARGET :: ibufr_5 ! Data buffer
+  INTEGER, ALLOCATABLE, DIMENSION(:,:,:,:,:,:) :: ibuf_6        ! Data buffer
+  INTEGER, ALLOCATABLE, DIMENSION(:,:,:,:,:,:) :: ibufr_6       ! Data buffer
+  INTEGER, ALLOCATABLE, DIMENSION(:,:,:,:,:,:,:) :: ibuf_7      ! Data buffer
+  INTEGER, ALLOCATABLE, DIMENSION(:,:,:,:,:,:,:) :: ibufr_7     ! Data buffer
+  REAL, ALLOCATABLE, DIMENSION(:,:,:,:), TARGET :: rbuf_4                ! Data buffer
+  REAL, ALLOCATABLE, DIMENSION(:,:,:,:), TARGET :: rbufr_4               ! Data buffer
+  REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:), TARGET :: rbuf_5      ! Data buffer
+  REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:), TARGET :: rbufr_5     ! Data buffer
+  REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:,:), TARGET :: rbuf_6            ! Data buffer
+  REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:,:), TARGET :: rbufr_6           ! Data buffer
+  REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:,:,:), TARGET :: rbuf_7          ! Data buffer
+  REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:,:,:), TARGET :: rbufr_7         ! Data buffer
+  DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:,:), TARGET :: dbuf_4    ! Data buffer
+  DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:,:), TARGET :: dbufr_4            ! Data buffer
+  DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:,:,:), TARGET :: dbuf_5           ! Data buffer
+  DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:,:,:), TARGET :: dbufr_5          ! Data buffer
+  DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:,:,:,:), TARGET :: dbuf_6         ! Data buffer
+  DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:,:,:,:), TARGET :: dbufr_6        ! Data buffer
+  DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:,:,:,:,:), TARGET :: dbuf_7       ! Data buffer
+  DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:,:,:,:,:), TARGET :: dbufr_7      ! Data buffer
+  CHARACTER(LEN=5), ALLOCATABLE, DIMENSION(:,:,:,:), TARGET :: cbuf_4            ! Data buffer
+  CHARACTER(LEN=5), ALLOCATABLE, DIMENSION(:,:,:,:), TARGET :: cbufr_4           ! Data buffer
+  CHARACTER(LEN=5), ALLOCATABLE, DIMENSION(:,:,:,:,:), TARGET :: cbuf_5          ! Data buffer
+  CHARACTER(LEN=5), ALLOCATABLE, DIMENSION(:,:,:,:,:), TARGET :: cbufr_5         ! Data buffer
+  CHARACTER(LEN=5), ALLOCATABLE, DIMENSION(:,:,:,:,:,:), TARGET :: cbuf_6        ! Data buffer
+  CHARACTER(LEN=5), ALLOCATABLE, DIMENSION(:,:,:,:,:,:), TARGET :: cbufr_6       ! Data buffer
+  CHARACTER(LEN=5), ALLOCATABLE, DIMENSION(:,:,:,:,:,:,:), TARGET :: cbuf_7      ! Data buffer
+  CHARACTER(LEN=5), ALLOCATABLE, DIMENSION(:,:,:,:,:,:,:), TARGET :: cbufr_7     ! Data buffer
+  INTEGER        :: errcode                            ! Error flag
+  INTEGER(HSIZE_T) :: i, j, k, l, m, n, o, nn   ! general purpose integers
+  INTEGER          :: type_class
+  INTEGER(SIZE_T)  :: type_size
+  CHARACTER(LEN=1) :: ichr1
+  CHARACTER(LEN=3) :: ichr3
+  TYPE(C_PTR) :: f_ptr
+  INTEGER(HID_T) :: type_id
+
+  WRITE(ichr1,'(I1.1)') rank
+  CALL test_begin(' Make/Read datasets ('//ichr1//'D)        ')
+  !
+  ! Initialize the data array.
+  !
+  IF(rank.EQ.4)THEN
+
+     ALLOCATE(ibuf_4 (1:DIM1,1:DIM2,1:DIM3,1:DIM4))
+     ALLOCATE(ibufr_4(1:DIM1,1:DIM2,1:DIM3,1:DIM4))
+     ALLOCATE(rbuf_4 (1:DIM1,1:DIM2,1:DIM3,1:DIM4))
+     ALLOCATE(rbufr_4(1:DIM1,1:DIM2,1:DIM3,1:DIM4))
+     ALLOCATE(dbuf_4 (1:DIM1,1:DIM2,1:DIM3,1:DIM4))
+     ALLOCATE(dbufr_4(1:DIM1,1:DIM2,1:DIM3,1:DIM4))
+     ALLOCATE(cbuf_4 (1:DIM1,1:DIM2,1:DIM3,1:DIM4))
+     ALLOCATE(cbufr_4(1:DIM1,1:DIM2,1:DIM3,1:DIM4))
+
+     dims(1:7) = (/DIM1,DIM2,DIM3,DIM4,0,0,0/)
+
+     nn = 1
+     DO i = 1, DIM1
+        DO j = 1, DIM2
+           DO k = 1, DIM3
+              DO l = 1, DIM4
+                 ibuf_4(i,j,k,l) = INT(nn)
+                 rbuf_4(i,j,k,l) = INT(nn)
+                 dbuf_4(i,j,k,l) = INT(nn)
+                 WRITE(cbuf_4(i,j,k,l),'(I5.5)') nn
+                 nn = nn + 1
+              END DO
+           END DO
+        END DO
+
+     ENDDO
+
+  ELSE IF(rank.EQ.5)THEN
+
+     ALLOCATE(ibuf_5 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5))
+     ALLOCATE(ibufr_5(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5))
+     ALLOCATE(rbuf_5 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5))
+     ALLOCATE(rbufr_5(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5))
+     ALLOCATE(dbuf_5 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5))
+     ALLOCATE(dbufr_5(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5))
+     ALLOCATE(cbuf_5 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5))
+     ALLOCATE(cbufr_5(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5))
+
+     dims(1:7) = (/DIM1,DIM2,DIM3,DIM4,DIM5,0,0/)
+
+     nn = 1
+     DO i = 1, DIM1
+        DO j = 1, DIM2
+           DO k = 1, DIM3
+              DO l = 1, DIM4
+                 DO m = 1, DIM5
+                    ibuf_5(i,j,k,l,m) = INT(nn)
+                    rbuf_5(i,j,k,l,m) = INT(nn)
+                    dbuf_5(i,j,k,l,m) = INT(nn)
+                    WRITE(cbuf_5(i,j,k,l,m),'(I5.5)') nn
+                    nn = nn + 1
+                 END DO
+              END DO
+           END DO
+        ENDDO
+     ENDDO
+
+  ELSE IF(rank.EQ.6)THEN
+
+     ALLOCATE(ibuf_6 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6))
+     ALLOCATE(ibufr_6(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6))
+     ALLOCATE(rbuf_6 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6))
+     ALLOCATE(rbufr_6(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6))
+     ALLOCATE(dbuf_6 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6))
+     ALLOCATE(dbufr_6(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6))
+     ALLOCATE(cbuf_6 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6))
+     ALLOCATE(cbufr_6(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6))
+
+     dims(1:7) = (/DIM1,DIM2,DIM3,DIM4,DIM5,DIM6,0/)
+
+     nn = 1
+     DO i = 1, DIM1
+        DO j = 1, DIM2
+           DO k = 1, DIM3
+              DO l = 1, DIM4
+                 DO m = 1, DIM5
+                    DO n = 1, DIM6
+                       ibuf_6(i,j,k,l,m,n) = INT(nn)
+                       rbuf_6(i,j,k,l,m,n) = INT(nn)
+                       dbuf_6(i,j,k,l,m,n) = INT(nn)
+                       WRITE(cbuf_6(i,j,k,l,m,n),'(I5.5)') nn
+                       nn = nn + 1
+                    END DO
+                 END DO
+              END DO
+           ENDDO
+        ENDDO
+     ENDDO
+
+  ELSE IF(rank.EQ.7)THEN
+
+     ALLOCATE(ibuf_7 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6,1:DIM7))
+     ALLOCATE(ibufr_7(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6,1:DIM7))
+     ALLOCATE(rbuf_7 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6,1:DIM7))
+     ALLOCATE(rbufr_7(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6,1:DIM7))
+     ALLOCATE(dbuf_7 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6,1:DIM7))
+     ALLOCATE(dbufr_7(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6,1:DIM7))
+     ALLOCATE(cbuf_7 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6,1:DIM7))
+     ALLOCATE(cbufr_7(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6,1:DIM7))
+
+     dims(1:7) = (/DIM1,DIM2,DIM3,DIM4,DIM5,DIM6,DIM7/)
+
+     nn = 1
+     DO i = 1, DIM1
+        DO j = 1, DIM2
+           DO k = 1, DIM3
+              DO l = 1, DIM4
+                 DO m = 1, DIM5
+                    DO n = 1, DIM6
+                       DO o = 1, DIM7
+                          ibuf_7(i,j,k,l,m,n,o) = INT(nn)
+                          rbuf_7(i,j,k,l,m,n,o) = INT(nn)
+                          dbuf_7(i,j,k,l,m,n,o) = INT(nn)
+                          WRITE(cbuf_7(i,j,k,l,m,n,o),'(I5.5)') nn
+                          nn = nn + 1
+                       END DO
+                    END DO
+                 END DO
+              ENDDO
+           ENDDO
+        ENDDO
+     ENDDO
+
+  ENDIF
+
+  !
+  ! Initialize FORTRAN predefined datatypes.
+  !
+  CALL h5open_f(errcode)
+
+  !
+  ! Create a new file using default properties.
+  !
+  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, errcode)
+
+  !-------------------------------------------------------------------------
+  ! H5T_NATIVE_INT ND buffer
+  !-------------------------------------------------------------------------
+
+  !
+  ! write dataset.
+  !
+  IF(rank.EQ.4)THEN
+     CALL h5ltmake_dataset_f(file_id, dsetname2, rank, dims(1:rank), H5T_NATIVE_INTEGER, ibuf_4, errcode)
+  ELSE IF(rank.EQ.5)THEN
+     f_ptr = C_LOC(ibuf_5(1,1,1,1,1))
+     CALL h5ltmake_dataset_f(file_id, dsetname2, rank, dims(1:rank), H5T_NATIVE_INTEGER, f_ptr, errcode)
+  ELSE IF(rank.EQ.6)THEN
+     CALL h5ltmake_dataset_f(file_id, dsetname2, rank, dims(1:rank), H5T_NATIVE_INTEGER, ibuf_6, errcode)
+  ELSE IF(rank.EQ.7)THEN
+     CALL h5ltmake_dataset_f(file_id, dsetname2, rank, dims(1:rank), H5T_NATIVE_INTEGER, ibuf_7, errcode)
+  ENDIF
+
+
+  !
+  ! read dataset.
+  !
+  IF(rank.EQ.4)THEN
+     CALL h5ltread_dataset_f(file_id, dsetname2, H5T_NATIVE_INTEGER, ibufr_4, dims(1:rank), errcode)
+  ELSE IF(rank.EQ.5)THEN
+     f_ptr = C_LOC(ibufr_5(1,1,1,1,1))
+     CALL h5ltread_dataset_f(file_id, dsetname2, H5T_NATIVE_INTEGER, f_ptr, errcode)
+  ELSE IF(rank.EQ.6)THEN
+     CALL h5ltread_dataset_f(file_id, dsetname2, H5T_NATIVE_INTEGER, ibufr_6, dims(1:rank), errcode)
+  ELSE IF(rank.EQ.7)THEN
+     CALL h5ltread_dataset_f(file_id, dsetname2, H5T_NATIVE_INTEGER, ibufr_7, dims(1:rank), errcode)
+  ENDIF
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, dims(1)
+     DO j = 1, dims(2)
+        DO k = 1, dims(3)
+           DO l = 1, dims(4)
+              IF(rank.EQ.4)THEN
+                 IF ( ibuf_4(i,j,k,l) .NE. ibufr_4(i,j,k,l) ) THEN
+                    PRINT *, 'read buffer differs from write buffer'
+                    PRINT *,  ibuf_4(i,j,k,l), ' and ', ibufr_4(i,j,k,l)
+                    STOP
+                 ENDIF
+              ENDIF
+              DO m = 1, dims(5)
+                 IF(rank.EQ.5)THEN
+                    IF ( ibuf_5(i,j,k,l,m) .NE. ibufr_5(i,j,k,l,m) ) THEN
+                       PRINT *, 'read buffer differs from write buffer'
+                       PRINT *,  ibuf_5(i,j,k,l,m), ' and ', ibufr_5(i,j,k,l,m)
+                       STOP
+                    ENDIF
+                 ENDIF
+                 DO n = 1, dims(6)
+                    IF(rank.EQ.6)THEN
+                       IF ( ibuf_6(i,j,k,l,m,n) .NE. ibufr_6(i,j,k,l,m,n) ) THEN
+                          PRINT *, 'read buffer differs from write buffer'
+                          PRINT *,  ibuf_6(i,j,k,l,m,n), ' and ', ibufr_6(i,j,k,l,m,n)
+                          STOP
+                       ENDIF
+                    ENDIF
+                    DO o = 1, dims(7)
+                       IF(rank.EQ.7)THEN
+                          IF ( ibuf_7(i,j,k,l,m,n,o) .NE. ibufr_7(i,j,k,l,m,n,o) ) THEN
+                             PRINT *, 'read buffer differs from write buffer'
+                             PRINT *,  ibuf_7(i,j,k,l,m,n,o), ' and ', ibufr_7(i,j,k,l,m,n,o)
+                             STOP
+                          ENDIF
+                       ENDIF
+                    ENDDO
+                 ENDDO
+              ENDDO
+           ENDDO
+        ENDDO
+     ENDDO
+  ENDDO
+  !-------------------------------------------------------------------------
+  ! H5T_NATIVE_REAL
+  !-------------------------------------------------------------------------
+
+  !
+  ! write dataset.
+  !
+  IF(rank.EQ.4)THEN
+     f_ptr = C_LOC(rbuf_4(1,1,1,1))
+     CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims(1:rank), H5T_NATIVE_REAL, f_ptr, errcode)
+     ! CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims(1:rank), H5T_NATIVE_REAL, rbuf_4, errcode)
+  ELSE IF(rank.EQ.5)THEN
+     f_ptr = C_LOC(rbuf_5(1,1,1,1,1))
+     CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims(1:rank), H5T_NATIVE_REAL, f_ptr, errcode)
+  ELSE IF(rank.EQ.6)THEN
+     f_ptr = C_LOC(rbuf_6(1,1,1,1,1,1))
+     CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims(1:rank), H5T_NATIVE_REAL, f_ptr, errcode)
+     !CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims(1:rank), H5T_NATIVE_REAL, rbuf_6, errcode)
+  ELSE IF(rank.EQ.7)THEN
+     f_ptr = C_LOC(rbuf_7(1,1,1,1,1,1,1))
+     CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims(1:rank), H5T_NATIVE_REAL, f_ptr, errcode)
+     !CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims(1:rank), H5T_NATIVE_REAL, rbuf_7, errcode)
+  ENDIF
+
+
+  !
+  ! read dataset.
+  !
+  IF(rank.EQ.4)THEN
+     f_ptr = C_LOC(rbufr_4(1,1,1,1))
+     CALL h5ltread_dataset_f(file_id, dsetname3, H5T_NATIVE_REAL, f_ptr, errcode)
+  ELSE IF(rank.EQ.5)THEN
+     f_ptr = C_LOC(rbufr_5(1,1,1,1,1))
+     CALL h5ltread_dataset_f(file_id, dsetname3, H5T_NATIVE_REAL, f_ptr, errcode)
+  ELSE IF(rank.EQ.6)THEN
+     f_ptr = C_LOC(rbufr_6(1,1,1,1,1,1))
+     CALL h5ltread_dataset_f(file_id, dsetname3, H5T_NATIVE_REAL, f_ptr, errcode)
+  ELSE IF(rank.EQ.7)THEN
+     f_ptr = C_LOC(rbufr_7(1,1,1,1,1,1,1))
+     CALL h5ltread_dataset_f(file_id, dsetname3, H5T_NATIVE_REAL, f_ptr, errcode)
+  ENDIF
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, dims(1)
+     DO j = 1, dims(2)
+        DO k = 1, dims(3)
+           DO l = 1, dims(4)
+              IF(rank.EQ.4)THEN
+                 IF ( rbuf_4(i,j,k,l) .NE. rbufr_4(i,j,k,l) ) THEN
+                    PRINT *, 'read buffer differs from write buffer'
+                    PRINT *,  rbuf_4(i,j,k,l), ' and ', rbufr_4(i,j,k,l)
+                    STOP
+                 ENDIF
+              ENDIF
+              DO m = 1, dims(5)
+                 IF(rank.EQ.5)THEN
+                    IF ( rbuf_5(i,j,k,l,m) .NE. rbufr_5(i,j,k,l,m) ) THEN
+                       PRINT *, 'read buffer differs from write buffer'
+                       PRINT *,  rbuf_5(i,j,k,l,m), ' and ', rbufr_5(i,j,k,l,m)
+                       STOP
+                    ENDIF
+                 ENDIF
+                 DO n = 1, dims(6)
+                    IF(rank.EQ.6)THEN
+                       IF ( rbuf_6(i,j,k,l,m,n) .NE. rbufr_6(i,j,k,l,m,n) ) THEN
+                          PRINT *, 'read buffer differs from write buffer'
+                          PRINT *,  rbuf_6(i,j,k,l,m,n), ' and ', rbufr_6(i,j,k,l,m,n)
+                          STOP
+                       ENDIF
+                    ENDIF
+                    DO o = 1, dims(7)
+                       IF(rank.EQ.7)THEN
+                          IF ( rbuf_7(i,j,k,l,m,n,o) .NE. rbufr_7(i,j,k,l,m,n,o) ) THEN
+                             PRINT *, 'read buffer differs from write buffer'
+                             PRINT *,  rbuf_7(i,j,k,l,m,n,o), ' and ', rbufr_7(i,j,k,l,m,n,o)
+                             STOP
+                          ENDIF
+                       ENDIF
+                    ENDDO
+                 ENDDO
+              ENDDO
+           ENDDO
+        ENDDO
+     ENDDO
+  ENDDO
+
+  !-------------------------------------------------------------------------
+  ! H5T_NATIVE_DOUBLE
+  !-------------------------------------------------------------------------
+
+  !
+  ! write dataset.
+  !
+  IF(rank.EQ.4)THEN
+     f_ptr = C_LOC(dbuf_4(1,1,1,1))
+     CALL h5ltmake_dataset_f(file_id, dsetname4, rank, dims(1:rank), H5T_NATIVE_DOUBLE, f_ptr, errcode)
+  ELSE IF(rank.EQ.5)THEN
+     f_ptr = C_LOC(dbuf_5(1,1,1,1,1))
+     CALL h5ltmake_dataset_f(file_id, dsetname4, rank, dims(1:rank), H5T_NATIVE_DOUBLE, f_ptr, errcode)
+  ELSE IF(rank.EQ.6)THEN
+     f_ptr = C_LOC(dbuf_6(1,1,1,1,1,1))
+     CALL h5ltmake_dataset_f(file_id, dsetname4, rank, dims(1:rank), H5T_NATIVE_DOUBLE, f_ptr, errcode)
+  ELSE IF(rank.EQ.7)THEN
+     f_ptr = C_LOC(dbuf_7(1,1,1,1,1,1,1))
+     CALL h5ltmake_dataset_f(file_id, dsetname4, rank, dims(1:rank), H5T_NATIVE_DOUBLE, f_ptr, errcode)
+  ENDIF
+
+  !
+  ! read dataset.
+  !
+  IF(rank.EQ.4)THEN
+     f_ptr = C_LOC(dbufr_4(1,1,1,1))
+     CALL h5ltread_dataset_f(file_id, dsetname4, H5T_NATIVE_DOUBLE, f_ptr, errcode)
+  ELSE IF(rank.EQ.5)THEN
+     f_ptr = C_LOC(dbufr_5(1,1,1,1,1))
+     CALL h5ltread_dataset_f(file_id, dsetname4, H5T_NATIVE_DOUBLE, f_ptr, errcode)
+  ELSE IF(rank.EQ.6)THEN
+     f_ptr = C_LOC(dbufr_6(1,1,1,1,1,1))
+     CALL h5ltread_dataset_f(file_id, dsetname4, H5T_NATIVE_DOUBLE, f_ptr, errcode)
+  ELSE IF(rank.EQ.7)THEN
+     f_ptr = C_LOC(dbufr_7(1,1,1,1,1,1,1))
+     CALL h5ltread_dataset_f(file_id, dsetname4, H5T_NATIVE_DOUBLE, f_ptr, errcode)
+  ENDIF
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, dims(1)
+     DO j = 1, dims(2)
+        DO k = 1, dims(3)
+           DO l = 1, dims(4)
+              IF(rank.EQ.4)THEN
+                 IF ( dbuf_4(i,j,k,l) .NE. dbufr_4(i,j,k,l) ) THEN
+                    PRINT *, 'read buffer differs from write buffer'
+                    PRINT *,  dbuf_4(i,j,k,l), ' and ', dbufr_4(i,j,k,l)
+                    STOP
+                 ENDIF
+              ENDIF
+              DO m = 1, dims(5)
+                 IF(rank.EQ.5)THEN
+                    IF ( dbuf_5(i,j,k,l,m) .NE. dbufr_5(i,j,k,l,m) ) THEN
+                       PRINT *, 'read buffer differs from write buffer'
+                       PRINT *,  dbuf_5(i,j,k,l,m), ' and ', dbufr_5(i,j,k,l,m)
+                       STOP
+                    ENDIF
+                 ENDIF
+                 DO n = 1, dims(6)
+                    IF(rank.EQ.6)THEN
+                       IF ( dbuf_6(i,j,k,l,m,n) .NE. dbufr_6(i,j,k,l,m,n) ) THEN
+                          PRINT *, 'read buffer differs from write buffer'
+                          PRINT *,  dbuf_6(i,j,k,l,m,n), ' and ', dbufr_6(i,j,k,l,m,n)
+                          STOP
+                       ENDIF
+                    ENDIF
+                    DO o = 1, dims(7)
+                       IF(rank.EQ.7)THEN
+                          IF ( dbuf_7(i,j,k,l,m,n,o) .NE. dbufr_7(i,j,k,l,m,n,o) ) THEN
+                             PRINT *, 'read buffer differs from write buffer'
+                             PRINT *,  dbuf_7(i,j,k,l,m,n,o), ' and ', dbufr_7(i,j,k,l,m,n,o)
+                             STOP
+                          ENDIF
+                       ENDIF
+                    ENDDO
+                 ENDDO
+              ENDDO
+           ENDDO
+        ENDDO
+     ENDDO
+  ENDDO
+
+  !-------------------------------------------------------------------------
+  ! H5T_NATIVE_CHARACTER ND buffer
+  !-------------------------------------------------------------------------
+
+  CALL H5Tcopy_f(H5T_FORTRAN_S1, type_id, errcode)
+  CALL H5Tset_size_f(type_id, 5_SIZE_T, errcode)
+  !
+  ! write dataset.
+  !
+  IF(rank.EQ.4)THEN
+     f_ptr = C_LOC(cbuf_4(1,1,1,1)(1:1))
+     CALL h5ltmake_dataset_f(file_id, dsetname5, rank, dims(1:rank), type_id, f_ptr, errcode)
+  ELSE IF(rank.EQ.5)THEN
+     f_ptr = C_LOC(cbuf_5(1,1,1,1,1)(1:1))
+     CALL h5ltmake_dataset_f(file_id, dsetname5, rank, dims(1:rank), type_id, f_ptr, errcode)
+  ELSE IF(rank.EQ.6)THEN
+     f_ptr = C_LOC(cbuf_6(1,1,1,1,1,1)(1:1))
+     CALL h5ltmake_dataset_f(file_id, dsetname5, rank, dims(1:rank), type_id, f_ptr, errcode)
+  ELSE IF(rank.EQ.7)THEN
+     f_ptr = C_LOC(cbuf_7(1,1,1,1,1,1,1)(1:1))
+     CALL h5ltmake_dataset_f(file_id, dsetname5, rank, dims(1:rank), type_id, f_ptr, errcode)
+  ENDIF
+
+  !
+  ! read dataset.
+  !
+  IF(rank.EQ.4)THEN
+     f_ptr = C_LOC(cbufr_4(1,1,1,1)(1:1))
+     CALL h5ltread_dataset_f(file_id, dsetname5, type_id, f_ptr, errcode)
+  ELSE IF(rank.EQ.5)THEN
+     f_ptr = C_LOC(cbufr_5(1,1,1,1,1)(1:1))
+     CALL h5ltread_dataset_f(file_id, dsetname5, type_id, f_ptr, errcode)
+  ELSE IF(rank.EQ.6)THEN
+     f_ptr = C_LOC(cbufr_6(1,1,1,1,1,1)(1:1))
+     CALL h5ltread_dataset_f(file_id, dsetname5, type_id, f_ptr, errcode)
+  ELSE IF(rank.EQ.7)THEN
+     f_ptr = C_LOC(cbufr_7(1,1,1,1,1,1,1)(1:1))
+     CALL h5ltread_dataset_f(file_id, dsetname5, type_id, f_ptr, errcode)
+  ENDIF
+
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, dims(1)
+     DO j = 1, dims(2)
+        DO k = 1, dims(3)
+           DO l = 1, dims(4)
+              IF(rank.EQ.4)THEN
+                 IF ( cbuf_4(i,j,k,l) .NE. cbufr_4(i,j,k,l) ) THEN
+                    PRINT *, 'read buffer differs from write buffer (character)'
+                    PRINT *,  cbuf_4(i,j,k,l), ' and ', cbufr_4(i,j,k,l)
+                    STOP
+                 ENDIF
+              ENDIF
+              DO m = 1, dims(5)
+                 IF(rank.EQ.5)THEN
+                    IF ( cbuf_5(i,j,k,l,m) .NE. cbufr_5(i,j,k,l,m) ) THEN
+                       PRINT *, 'read buffer differs from write buffer (character)'
+                       PRINT *,  cbuf_5(i,j,k,l,m), ' and ', cbufr_5(i,j,k,l,m)
+                       STOP
+                    ENDIF
+                 ENDIF
+                 DO n = 1, dims(6)
+                    IF(rank.EQ.6)THEN
+                       IF ( cbuf_6(i,j,k,l,m,n) .NE. cbufr_6(i,j,k,l,m,n) ) THEN
+                          PRINT *, 'read buffer differs from write buffer (character)'
+                          PRINT *,  cbuf_6(i,j,k,l,m,n), ' and ', cbufr_6(i,j,k,l,m,n)
+                          STOP
+                       ENDIF
+                    ENDIF
+                    DO o = 1, dims(7)
+                       IF(rank.EQ.7)THEN
+                          IF ( cbuf_7(i,j,k,l,m,n,o) .NE. cbufr_7(i,j,k,l,m,n,o) ) THEN
+                             PRINT *, 'read buffer differs from write buffer (character)'
+                             PRINT *,  cbuf_7(i,j,k,l,m,n,o), ' and ', cbufr_7(i,j,k,l,m,n,o)
+                             STOP
+                          ENDIF
+                       ENDIF
+                    ENDDO
+                 ENDDO
+              ENDDO
+           ENDDO
+        ENDDO
+     ENDDO
+  ENDDO
+
+  CALL h5ltget_dataset_info_f(file_id,dsetname4,dimsr,type_class,type_size,errcode )
+
+  CALL h5tclose_f(type_id,errcode)
+
+  !
+  ! compare dimensions
+  !
+  DO i = 1, rank
+     IF ( dimsr(i) .NE. dims(i) ) THEN
+        PRINT *, 'dimensions differ '
+        STOP
+     ENDIF
+  END DO
+
+  !
+  ! Close the file.
+  !
+  CALL h5fclose_f(file_id, errcode)
+
+  !
+  ! Close FORTRAN predefined datatypes.
+  !
+  CALL h5close_f(errcode)
+
+  ! DEALLOCATE RESOURCES
+
+  IF(rank.EQ.4)THEN
+     DEALLOCATE(ibuf_4, ibufr_4, rbuf_4, rbufr_4, dbuf_4, dbufr_4, cbuf_4, cbufr_4)
+  ELSE IF(rank.EQ.5)THEN
+     DEALLOCATE(ibuf_5, ibufr_5, rbuf_5, rbufr_5, dbuf_5, dbufr_5, cbuf_5, cbufr_5)
+  ELSE IF(rank.EQ.6)THEN
+     DEALLOCATE(ibuf_6, ibufr_6, rbuf_6, rbufr_6, dbuf_6, dbufr_6, cbuf_6, cbufr_6)
+  ELSE IF(rank.EQ.7)THEN
+     DEALLOCATE(ibuf_7, ibufr_7, rbuf_7, rbufr_7, dbuf_7, dbufr_7, cbuf_7, cbufr_7)
+  ENDIF
+
+  CALL passed()
+  !
+  ! end function.
+  !
+END SUBROUTINE test_datasetND
+
+
+!-------------------------------------------------------------------------
+! test_datasets
+!-------------------------------------------------------------------------
+
+SUBROUTINE test_datasets()
+
+  USE, INTRINSIC :: ISO_C_BINDING
+  USE H5LT ! module of H5LT
+  USE HDF5 ! module of HDF5 library
+
+  IMPLICIT NONE
+
+  CHARACTER(len=9), PARAMETER :: filename = "dsetf4.h5"! File name
+  INTEGER(HID_T) :: file_id                            ! File identifier
+  INTEGER        :: errcode                            ! Error flag
+  INTEGER, PARAMETER :: DIM1 = 10                      ! Dimension of array
+  CHARACTER(LEN=5), PARAMETER :: dsetname1 = "dset1"   ! Dataset name
+  CHARACTER(LEN=5), PARAMETER :: dsetname2 = "dset2"   ! Dataset name
+  CHARACTER(LEN=5), PARAMETER :: dsetname3 = "dset3"   ! Dataset name
+  CHARACTER(LEN=5), PARAMETER :: dsetname4 = "dset4"   ! Dataset name
+  CHARACTER(LEN=5), PARAMETER :: dsetname5 = "dset5"   ! Dataset name
+  INTEGER(HSIZE_T), DIMENSION(1) :: dims = (/DIM1/)    ! Dataset dimensions
+  INTEGER(HSIZE_T), DIMENSION(1) :: dimsr              ! Dataset dimensions
+  INTEGER        :: rank = 1                           ! Dataset rank
+  INTEGER        :: rankr                              ! Dataset rank
+  CHARACTER(LEN=8), PARAMETER :: buf1 = "mystring"     ! Data buffer
+  CHARACTER(LEN=8)            :: buf1r                 ! Data buffer
+  INTEGER, DIMENSION(DIM1)          :: buf2            ! Data buffer
+  INTEGER, DIMENSION(DIM1)          :: bufr2           ! Data buffer
+  REAL, DIMENSION(DIM1), TARGET             :: buf3    ! Data buffer
+  REAL, DIMENSION(DIM1) , TARGET            :: bufr3   ! Data buffer
+  DOUBLE PRECISION, DIMENSION(DIM1), TARGET :: buf4    ! Data buffer
+  DOUBLE PRECISION, DIMENSION(DIM1), TARGET :: bufr4   ! Data buffer
+  INTEGER          :: i, n                             ! general purpose integer
+  INTEGER          :: has                              ! general purpose integer
+  INTEGER          :: type_class
+  INTEGER(SIZE_T)  :: type_size
+  LOGICAL :: path_valid  ! status of the path
+  CHARACTER(LEN=6) :: chr_exact
+  CHARACTER(LEN=8) :: chr_lg
+  TYPE(C_PTR) :: f_ptr
+
+  !
+  ! Initialize FORTRAN predefined datatypes.
+  !
+  CALL h5open_f(errcode)
+
+  !
+  ! Create a new file using default properties.
+  !
+  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, errcode)
+
+  !
+  ! Initialize the data array.
+  !
+  n = 1
+  DO i = 1, DIM1
+     buf2(i) = n
+     buf3(i) = n
+     buf4(i) = n
+     n = n + 1
+  END DO
+
+  !-------------------------------------------------------------------------
+  ! int
+  !-------------------------------------------------------------------------
+
+  CALL test_begin(' Make/Read datasets (integer)   ')
+
+  !
+  ! write dataset.
+  !
+  CALL h5ltmake_dataset_int_f(file_id, dsetname2, rank, dims, buf2, errcode)
+
+  !
+  ! read dataset.
+  !
+  CALL h5ltread_dataset_int_f(file_id, dsetname2, bufr2, dims, errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, DIM1
+     IF ( buf2(i) .NE. bufr2(i) ) THEN
+        PRINT *, 'read buffer differs from write buffer'
+        PRINT *,  bufr2(i), ' and ',   buf2(i)
+        STOP
+     ENDIF
+  END DO
+
+  CALL passed()
+
+
+  !-------------------------------------------------------------------------
+  ! real
+  !-------------------------------------------------------------------------
+
+  CALL test_begin(' Make/Read datasets (float)     ')
+
+
+  !
+  ! write dataset.
+  !
+  f_ptr = C_LOC(buf3(1))
+  CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims, H5T_NATIVE_REAL, f_ptr, errcode)
+
+  !
+  ! read dataset.
+  !
+  f_ptr = C_LOC(bufr3(1))
+  CALL h5ltread_dataset_f(file_id, dsetname3, H5T_NATIVE_REAL, f_ptr, errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, DIM1
+     IF ( buf3(i) .NE. bufr3(i) ) THEN
+        PRINT *, 'read buffer differs from write buffer'
+        PRINT *,  bufr3(i), ' and ',   buf3(i)
+        STOP
+     ENDIF
+  END DO
+
+  CALL passed()
+
+  !-------------------------------------------------------------------------
+  ! double
+  !-------------------------------------------------------------------------
+
+  CALL test_begin(' Make/Read datasets (double)    ')
+
+
+  !
+  ! write dataset.
+  !
+  !f_ptr = C_LOC(buf4(1))
+  !CALL h5ltmake_dataset_f(file_id, dsetname4, rank, dims, H5T_NATIVE_DOUBLE, f_ptr, errcode)
+  CALL h5ltmake_dataset_double_f(file_id, dsetname4, rank, dims, buf4, errcode)
+
+  !
+  ! read dataset.
+  !
+  !f_ptr = C_LOC(buf4(1))
+  !CALL h5ltread_dataset_f(file_id, dsetname4, H5T_NATIVE_DOUBLE, f_ptr, errcode)
+  CALL h5ltread_dataset_double_f(file_id, dsetname4, bufr4, dims, errcode)
+
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, DIM1
+     IF ( buf4(i) .NE. bufr4(i) ) THEN
+        PRINT *, 'read buffer differs from write buffer'
+        PRINT *,  bufr4(i), ' and ',   buf4(i)
+        STOP
+     ENDIF
+  END DO
+
+  CALL passed()
+
+
+  !-------------------------------------------------------------------------
+  ! string
+  !-------------------------------------------------------------------------
+
+  CALL test_begin(' Make/Read datasets (string)    ')
+
+
+  !
+  ! write dataset.
+  !
+  CALL h5ltmake_dataset_string_f(file_id, dsetname5, buf1, errcode)
+
+  !
+  ! read dataset.
+  !
+  CALL h5ltread_dataset_string_f(file_id, dsetname5, buf1r, errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  IF ( buf1 .NE. buf1r ) THEN
+     PRINT *, 'read buffer differs from write buffer'
+     PRINT *,  buf1, ' and ',   buf1r
+     STOP
+  ENDIF
+
+  CALL passed()
+
+  CALL test_begin(' Test h5ltpath_valid_f          ')
+  !
+  ! test function h5ltpath_valid_f
+  !
+  chr_exact = "/"//dsetname2 ! test character buffer the exact size needed
+  CALL h5ltpath_valid_f(file_id, chr_exact, .TRUE., path_valid, errcode)
+  IF(errcode.LT.0.OR..NOT.path_valid)THEN
+     PRINT *, 'error in h5ltpath_valid_f'
+     STOP
+  ENDIF
+  chr_lg = "/"//dsetname2 ! test character buffer larger then needed
+  CALL h5ltpath_valid_f(file_id, chr_lg, .TRUE., path_valid, errcode)
+  IF(errcode.LT.0.OR..NOT.path_valid)THEN
+     PRINT *, 'error in h5ltpath_valid_f'
+     STOP
+  ENDIF
+
+  CALL h5ltpath_valid_f(file_id, chr_lg, .FALSE., path_valid, errcode)
+  IF(errcode.LT.0.OR..NOT.path_valid)THEN
+     PRINT *, 'error in h5ltpath_valid_f'
+     STOP
+  ENDIF
+
+  ! Should fail, dataset does not exist
+  CALL h5ltpath_valid_f(file_id, "/"//dsetname2//"junk", .TRUE., path_valid, errcode)
+  IF(errcode.LT.0.OR.path_valid)THEN
+     PRINT *, 'error in h5ltpath_valid_f'
+     STOP
+  ENDIF
+
+  CALL h5ltpath_valid_f(file_id, "/"//dsetname2//"junk", .FALSE., path_valid, errcode)
+  IF(errcode.LT.0.OR.path_valid)THEN
+     PRINT *, 'error in h5ltpath_valid_f'
+     STOP
+  ENDIF
+
+  ! Create a dangling soft link
+  CALL h5lcreate_soft_f("/G2", file_id, "/G3", errcode)
+
+  ! Should pass, does not check for dangled link
+  CALL h5ltpath_valid_f(file_id, "/G3", .FALSE., path_valid, errcode)
+  IF(.NOT.path_valid)THEN
+     PRINT *, 'error in h5ltpath_valid_f'
+     STOP
+  ENDIF
+
+  ! Should fail, dangled link
+  CALL h5ltpath_valid_f(file_id, "/G2", .TRUE., path_valid, errcode)
+  IF(path_valid)THEN
+     PRINT *, 'error in h5ltpath_valid_f'
+     STOP
+  ENDIF
+
+  CALL passed()
+
+
+  CALL test_begin(' Get dataset dimensions/info    ')
+
+  !-------------------------------------------------------------------------
+  ! h5ltget_dataset_ndims_f
+  !-------------------------------------------------------------------------
+
+  CALL h5ltget_dataset_ndims_f(file_id, dsetname4, rankr, errcode)
+  IF ( rankr .NE. rank ) THEN
+     PRINT *, 'h5ltget_dataset_ndims_f return error'
+     STOP
+  ENDIF
+
+  !-------------------------------------------------------------------------
+  ! test h5ltfind_dataset_f function
+  !-------------------------------------------------------------------------
+
+
+  has = h5ltfind_dataset_f(file_id,dsetname4)
+  IF ( has .NE. 1 ) THEN
+     PRINT *, 'h5ltfind_dataset_f return error'
+     STOP
+  ENDIF
+
+  !-------------------------------------------------------------------------
+  ! test h5ltget_dataset_info_f function
+  !-------------------------------------------------------------------------
+
+  CALL h5ltget_dataset_info_f(file_id,dsetname4,dimsr,type_class,type_size,errcode )
+
+  !
+  ! compare dimensions
+  !
+  DO i = 1, rank
+     IF ( dimsr(i) .NE. dims(i) ) THEN
+        PRINT *, 'dimensions differ '
+        STOP
+     ENDIF
+  END DO
+
+  IF ( type_class .NE. 1 ) THEN ! H5T_FLOAT
+     PRINT *, 'wrong type class '
+     STOP
+  ENDIF
+
+  !
+  ! Close the file.
+  !
+  CALL h5fclose_f(file_id, errcode)
+  !
+  ! Close FORTRAN predefined datatypes.
+  !
+  CALL h5close_f(errcode)
+
+  CALL passed()
+  !
+  ! end function.
+  !
+END SUBROUTINE test_datasets
+
+
+
+!-------------------------------------------------------------------------
+! test_attributes
+!-------------------------------------------------------------------------
+
+SUBROUTINE test_attributes()
+
+  USE, INTRINSIC :: ISO_C_BINDING
+  USE H5LT ! module of H5LT
+  USE HDF5 ! module of HDF5 library
+
+  IMPLICIT NONE
+
+  CHARACTER(len=9), PARAMETER :: filename = "dsetf5.h5"! File name
+  CHARACTER(len=9), PARAMETER :: filename1 ="tattr.h5" ! C written attribute file
+  INTEGER(HID_T) :: file_id                            ! File identifier
+  !  INTEGER(HID_T) :: file_id1
+  INTEGER, PARAMETER :: DIM1 = 10                     ! Dimension of array
+  CHARACTER(LEN=5), PARAMETER :: attrname1 = "attr1"   ! Attribute name
+  CHARACTER(LEN=5), PARAMETER :: attrname2 = "attr2"   ! Attribute name
+  CHARACTER(LEN=5), PARAMETER :: attrname3 = "attr3"   ! Attribute name
+  CHARACTER(LEN=5), PARAMETER :: attrname4 = "attr4"   ! Attribute name
+  CHARACTER(LEN=5), PARAMETER :: attrname5 = "attr5"   ! Attribute name
+  CHARACTER(LEN=8), PARAMETER :: buf1 = "mystring"     ! Data buffer
+  CHARACTER(LEN=16), PARAMETER :: buf_c = "string attribute"
+  CHARACTER(LEN=8)                  :: bufr1           ! Data buffer
+  CHARACTER(LEN=10)                 :: bufr1_lg        ! Data buffer
+  !  CHARACTER(LEN=16)                 :: bufr_c          ! Data buffer
+  !  CHARACTER(LEN=18)                 :: bufr_c_lg       ! Data buffer
+  INTEGER, DIMENSION(DIM1)          :: buf2            ! Data buffer
+  INTEGER, DIMENSION(DIM1)          :: bufr2           ! Data buffer
+  REAL, DIMENSION(DIM1), target     :: buf3            ! Data buffer
+  REAL, DIMENSION(DIM1), target     :: bufr3           ! Data buffer
+  DOUBLE PRECISION, DIMENSION(DIM1), TARGET :: buf4            ! Data buffer
+  DOUBLE PRECISION, DIMENSION(DIM1), TARGET :: bufr4           ! Data buffer
+  INTEGER        :: errcode                            ! Error flag
+  INTEGER        :: i, n                               ! general purpose integer
+  INTEGER(SIZE_T) size                                 ! size of attribute array
+  INTEGER        :: rankr                              ! rank
+  INTEGER(HSIZE_T), DIMENSION(1) :: dimsr              ! attribute dimensions
+  INTEGER          :: type_class
+  INTEGER(SIZE_T)  :: type_size
+  INTEGER(HSIZE_T), DIMENSION(1) :: dims = (/DIM1/)    ! Dataset dimensions
+  INTEGER        :: rank = 1                           ! Dataset rank
+  CHARACTER(LEN=5), PARAMETER :: dsetname1 = "dset1"   ! Dataset name
+  INTEGER, DIMENSION(DIM1)    :: buf                   ! Data buffer
+  INTEGER(SIZE_T)  :: SizeOf_buf_type
+  TYPE(C_PTR) :: f_ptr
+
+  !
+  ! Initialize FORTRAN predefined datatypes.
+  !
+  CALL h5open_f(errcode)
+  !
+  ! Create a new file using default properties.
+  !
+  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, errcode)
+  !
+  ! make a dataset.
+  !
+  CALL h5ltmake_dataset_int_f(file_id, dsetname1, rank, dims, buf, errcode)
+
+  !
+  ! Initialize the data array.
+  !
+  size = DIM1
+  n = 1
+  DO i = 1, DIM1
+     buf2(i) = n
+     buf3(i) = n
+     buf4(i) = n
+     n = n + 1
+  END DO
+
+
+  !-------------------------------------------------------------------------
+  ! int
+  !-------------------------------------------------------------------------
+
+  CALL test_begin(' Set/Get attributes int         ')
+
+
+  !
+  ! write attribute.
+  !
+  CALL h5ltset_attribute_int_f(file_id,dsetname1,attrname2,buf2,size,errcode)
+
+  !
+  ! read attribute.
+  !
+  CALL h5ltget_attribute_int_f(file_id,dsetname1,attrname2,bufr2,errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, DIM1
+     IF ( buf2(i) .NE. bufr2(i) ) THEN
+        PRINT *, 'read buffer differs from write buffer'
+        PRINT *,  bufr2(i), ' and ',   buf2(i)
+        STOP
+     ENDIF
+  END DO
+
+  CALL passed()
+
+  !-------------------------------------------------------------------------
+  ! float
+  !-------------------------------------------------------------------------
+
+  CALL test_begin(' Set/Get attributes float       ')
+
+
+  !
+  ! write attribute.
+  !
+#ifdef H5_FORTRAN_HAVE_STORAGE_SIZE
+  SizeOf_buf_type = STORAGE_SIZE(buf3(1), c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)
+#else
+  SizeOf_buf_type = SIZEOF(buf3(1))
+#endif
+  f_ptr = C_LOC(buf3(1))
+  CALL h5ltset_attribute_f(file_id,dsetname1,attrname3,f_ptr,"REAL", SizeOf_buf_type, size,errcode)
+  !CALL h5ltset_attribute_float_f(file_id,dsetname1,attrname3,buf3,size,errcode)
+  !
+  ! read attribute.
+  !
+#ifdef H5_FORTRAN_HAVE_STORAGE_SIZE
+  SizeOf_buf_type = STORAGE_SIZE(bufr3(1), c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)
+#else
+  SizeOf_buf_type = SIZEOF(bufr3(1))
+#endif
+
+  f_ptr = C_LOC(bufr3(1))
+  CALL h5ltget_attribute_f(file_id,dsetname1,attrname3,f_ptr,"REAL",SizeOf_buf_type,errcode)
+  !CALL h5ltget_attribute_float_f(file_id,dsetname1,attrname3,bufr3,errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, DIM1
+     IF ( buf3(i) .NE. bufr3(i) ) THEN
+        PRINT *, 'read buffer differs from write buffer'
+        PRINT *,  bufr3(i), ' and ',   buf3(i)
+        STOP
+     ENDIF
+  END DO
+
+  CALL passed()
+
+  !-------------------------------------------------------------------------
+  ! double
+  !-------------------------------------------------------------------------
+
+#ifdef H5_FORTRAN_HAVE_STORAGE_SIZE
+  SizeOf_buf_type = STORAGE_SIZE(buf4(1), c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)
+#else
+  SizeOf_buf_type = SIZEOF(buf4(1))
+#endif
+
+  IF(SizeOf_buf_type.LT.16)THEN ! MSB can't handle 16 byte reals
+
+     CALL test_begin(' Set/Get attributes double      ')
+
+     !
+     ! write attribute.
+     !
+     f_ptr = C_LOC(buf4(1))
+     CALL h5ltset_attribute_f(file_id,dsetname1,attrname4,f_ptr,"real", SizeOf_buf_type, size, errcode)
+
+     !  CALL h5ltset_attribute_double_f(file_id,dsetname1,attrname4,buf4, size, errcode)
+
+     !
+     ! read attribute.
+     !
+
+#ifdef H5_FORTRAN_HAVE_STORAGE_SIZE
+     SizeOf_buf_type = STORAGE_SIZE(bufr4(1), c_size_t)/STORAGE_SIZE(c_char_'a',c_size_t)
+#else
+     SizeOf_buf_type = SIZEOF(bufr4(1))
+#endif
+
+     f_ptr = C_LOC(bufr4(1))
+     CALL h5ltget_attribute_f(file_id,dsetname1,attrname4,f_ptr,"REAL",SizeOf_buf_type,errcode)
+
+     !
+     ! compare read and write buffers.
+     !
+     DO i = 1, DIM1
+        IF ( buf4(i) .NE. bufr4(i) ) THEN
+           PRINT *, 'read buffer differs from write buffer'
+           PRINT *,  bufr4(i), ' and ',   buf4(i)
+           STOP
+        ENDIF
+     END DO
+
+     CALL passed()
+
+  ENDIF
+
+  !-------------------------------------------------------------------------
+  ! string
+  !-------------------------------------------------------------------------
+
+  CALL test_begin(' Set/Get attributes string      ')
+
+  !
+  ! write attribute.
+  !
+  CALL h5ltset_attribute_string_f(file_id,dsetname1,attrname5,buf1,errcode)
+
+  !
+  ! read attribute into a fortran character buf that is the same size as buf1.
+  !
+  CALL h5ltget_attribute_string_f(file_id,dsetname1,attrname5,bufr1,errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  IF ( buf1 .NE. bufr1 ) THEN
+     PRINT *, 'read buffer differs from write buffer'
+     PRINT *,  buf1, ' and ',   bufr1
+     STOP
+  ENDIF
+
+  !
+  ! read attribute into a fortran character buf that is larger then buf1.
+  !
+  CALL h5ltget_attribute_string_f(file_id,dsetname1,attrname5,bufr1_lg,errcode)
+
+  !
+  ! compare read and write buffers, make sure C NULL character was removed.
+  !
+  IF ( buf1(1:8) .NE. bufr1_lg(1:8) .AND. bufr1_lg(9:10) .NE. '  ' ) THEN
+     PRINT *, 'larger read buffer differs from write buffer'
+     PRINT *,  buf1, ' and ',   bufr1_lg
+     STOP
+  ENDIF
+
+  ! 
+  ! ** Test reading a string that was created with a C program **
+  !
+
+!!$  CALL h5fopen_f(filename1, H5F_ACC_RDONLY_F, file_id1, errcode)
+!!$
+!!$  CALL h5ltget_attribute_string_f(file_id1, "/", "attr5", bufr_c, errcode)
+!!$  !
+!!$  ! compare read and write buffers.
+!!$  !
+!!$  IF ( bufr_c .NE. buf_c ) THEN
+!!$     PRINT *, 'read buffer differs from write buffer'
+!!$     PRINT *,  bufr1, ' and ',  buf_c 
+!!$     STOP
+!!$  ENDIF
+!!$  !
+!!$  ! read attribute into a fortran character buf that is larger then buf_c.
+!!$  !
+!!$  CALL h5ltget_attribute_string_f(file_id1, "/", "attr5", bufr_c_lg, errcode)
+!!$
+!!$  !
+!!$  ! compare read and write buffers, make sure C NULL character was removed.
+!!$  !
+!!$  IF ( buf_c(1:16) .NE. bufr_c_lg(1:16) .AND. bufr_c_lg(17:18) .NE. '  ' ) THEN
+!!$     PRINT *, 'larger read buffer differs from write buffer'
+!!$     PRINT *,  buf_c, ' and ',  bufr_c_lg 
+!!$     STOP
+!!$  ENDIF  
+
+!!$  CALL h5fclose_f(file_id1,  errcode)
+
+  CALL passed()
+
+  !-------------------------------------------------------------------------
+  ! get attribute rank
+  !-------------------------------------------------------------------------
+
+  CALL test_begin(' Get attribute rank/info        ')
+
+
+  CALL h5ltget_attribute_ndims_f(file_id,dsetname1,attrname2,rankr,errcode)
+
+  IF ( rankr .NE. 1 ) THEN
+     PRINT *, 'h5ltget_attribute_ndims_f return error'
+     STOP
+  ENDIF
+
+
+  CALL h5ltget_attribute_info_f(file_id,dsetname1,attrname2,dimsr,type_class,type_size,errcode)
+
+  !
+  ! compare dimensions
+  !
+  DO i = 1, rank
+     IF ( dimsr(i) .NE. dims(i) ) THEN
+        PRINT *, 'dimensions differ '
+        STOP
+     ENDIF
+  END DO
+
+
+  !
+  ! Close the file.
+  !
+  CALL h5fclose_f(file_id, errcode)
+  !
+  ! Close FORTRAN predefined datatypes.
+  !
+  CALL h5close_f(errcode)
+
+  CALL passed()
+  !
+  ! end function.
+  !
+END SUBROUTINE test_attributes
+
+!-------------------------------------------------------------------------
+! test_begin
+!-------------------------------------------------------------------------
+
+SUBROUTINE test_begin(string)
+  CHARACTER(LEN=*), INTENT(IN) :: string
+  WRITE(*, fmt = '(14a)', advance = 'no') string
+  WRITE(*, fmt = '(40x,a)', advance = 'no') ' '
+END SUBROUTINE test_begin
+
+!-------------------------------------------------------------------------
+! passed
+!-------------------------------------------------------------------------
+
+SUBROUTINE passed()
+  WRITE(*, fmt = '(6a)')  'PASSED'
+END SUBROUTINE passed
diff --git a/hl/fortran/test/tstlite.f90 b/hl/fortran/test/tstlite.f90
deleted file mode 100644
index d035b89..0000000
--- a/hl/fortran/test/tstlite.f90
+++ /dev/null
@@ -1,1628 +0,0 @@
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!
-! This file contains the FORTRAN90 tests for H5LT
-!
-
-PROGRAM lite_test
-
-  CALL test_dataset1D()
-  CALL test_dataset2D()
-  CALL test_dataset3D()
-  CALL test_datasetND(4)
-  CALL test_datasetND(5)
-  CALL test_datasetND(6)
-  CALL test_datasetND(7)
-  CALL test_datasets()
-  CALL test_attributes()
-
-END PROGRAM lite_test
-
-
-!-------------------------------------------------------------------------
-! test_dataset1D
-!-------------------------------------------------------------------------
-
-SUBROUTINE test_dataset1D()
-
-USE H5LT ! module of H5LT
-USE HDF5 ! module of HDF5 library
-
-IMPLICIT NONE
-
-INTEGER, PARAMETER :: DIM1 = 4;                      ! Dimension of array
-CHARACTER(len=9), PARAMETER :: filename = "dsetf1.h5"! File name
-CHARACTER(LEN=5), PARAMETER :: dsetname1 = "dset1"   ! Dataset name
-CHARACTER(LEN=5), PARAMETER :: dsetname2 = "dset2"   ! Dataset name
-CHARACTER(LEN=5), PARAMETER :: dsetname3 = "dset3"   ! Dataset name
-INTEGER(HID_T) :: file_id                            ! File identifier
-INTEGER(HSIZE_T), DIMENSION(1) :: dims = (/DIM1/)    ! Dataset dimensions
-INTEGER        :: rank = 1                           ! Dataset rank
-INTEGER, DIMENSION(DIM1) :: buf1                     ! Data buffer
-INTEGER, DIMENSION(DIM1) :: bufr1                    ! Data buffer
-REAL, DIMENSION(DIM1)    :: buf2                     ! Data buffer
-REAL, DIMENSION(DIM1)    :: bufr2                    ! Data buffer
-DOUBLE PRECISION, DIMENSION(DIM1) :: buf3            ! Data buffer
-DOUBLE PRECISION, DIMENSION(DIM1) :: bufr3           ! Data buffer
-INTEGER        :: errcode                            ! Error flag
-INTEGER        :: i                                  ! general purpose integer
-
-
-CALL test_begin(' Make/Read datasets (1D)        ')
-
-!
-! Initialize the data array.
-!
-DO i = 1, DIM1
-  buf1(i) = i;
-  buf2(i) = i;
-  buf3(i) = i;
-END DO
-
-!
-! Initialize FORTRAN predefined datatypes.
-!
-CALL h5open_f(errcode)
-
-!
-! Create a new file using default properties.
-!
-CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, errcode)
-
-!-------------------------------------------------------------------------
-! H5T_NATIVE_INTEGER
-!-------------------------------------------------------------------------
-
-!
-! write dataset.
-!
-CALL h5ltmake_dataset_f(file_id, dsetname1, rank, dims, H5T_NATIVE_INTEGER, buf1, errcode)
-
-!
-! read dataset.
-!
-CALL h5ltread_dataset_f(file_id, dsetname1, H5T_NATIVE_INTEGER, bufr1, dims, errcode)
-
-!
-! compare read and write buffers.
-!
-DO i = 1, DIM1
- IF ( buf1(i) .NE. bufr1(i) ) THEN
-   PRINT *, 'read buffer differs from write buffer'
-   PRINT *,  bufr1(i), ' and ',   buf1(i)
-   STOP
-  ENDIF
-END DO
-
-!-------------------------------------------------------------------------
-! H5T_NATIVE_REAL
-!-------------------------------------------------------------------------
-
-!
-! write dataset.
-!
-CALL h5ltmake_dataset_f(file_id, dsetname2, rank, dims, H5T_NATIVE_REAL, buf2, errcode)
-
-!
-! read dataset.
-!
-CALL h5ltread_dataset_f(file_id, dsetname2, H5T_NATIVE_REAL, bufr2, dims, errcode)
-
-!
-! compare read and write buffers.
-!
-DO i = 1, DIM1
- IF ( buf2(i) .NE. bufr2(i) ) THEN
-   PRINT *, 'read buffer differs from write buffer'
-   PRINT *,  bufr2(i), ' and ',   buf2(i)
-   STOP
-  ENDIF
-END DO
-
-!-------------------------------------------------------------------------
-! H5T_NATIVE_DOUBLE
-!-------------------------------------------------------------------------
-
-!
-! write dataset.
-!
-CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims, H5T_NATIVE_DOUBLE, buf3, errcode)
-
-!
-! read dataset.
-!
-CALL h5ltread_dataset_f(file_id, dsetname3, H5T_NATIVE_DOUBLE, bufr3, dims, errcode)
-
-!
-! compare read and write buffers.
-!
-DO i = 1, DIM1
- IF ( buf3(i) .NE. bufr3(i) ) THEN
-   PRINT *, 'read buffer differs from write buffer'
-   PRINT *,  bufr3(i), ' and ',   buf3(i)
-   STOP
-  ENDIF
-END DO
-
-!
-! Close the file.
-!
-CALL h5fclose_f(file_id, errcode)
-
-!
-! Close FORTRAN predefined datatypes.
-!
-CALL h5close_f(errcode)
-
-CALL passed()
-!
-! end function.
-!
-END SUBROUTINE test_dataset1D
-
-!-------------------------------------------------------------------------
-! test_dataset2D
-!-------------------------------------------------------------------------
-
-SUBROUTINE test_dataset2D()
-
-USE H5LT ! module of H5LT
-USE HDF5 ! module of HDF5 library
-
-IMPLICIT NONE
-
-
-INTEGER(HSIZE_T), PARAMETER :: DIM1 = 4;             ! columns
-INTEGER(HSIZE_T), PARAMETER :: DIM2 = 6;             ! rows
-CHARACTER(len=9), PARAMETER :: filename = "dsetf2.h5"! File name
-CHARACTER(LEN=5), PARAMETER :: dsetname1 = "dset1"   ! Dataset name
-CHARACTER(LEN=5), PARAMETER :: dsetname2 = "dset2"   ! Dataset name
-CHARACTER(LEN=5), PARAMETER :: dsetname3 = "dset3"   ! Dataset name
-CHARACTER(LEN=5), PARAMETER :: dsetname4 = "dset4"   ! Dataset name
-INTEGER(HID_T) :: file_id                            ! File identifier
-INTEGER(HSIZE_T), DIMENSION(2) :: dims = (/4,6/)     ! Dataset dimensions
-INTEGER        :: rank = 2                           ! Dataset rank
-INTEGER, DIMENSION(DIM1*DIM2) :: buf                 ! Data buffer
-INTEGER, DIMENSION(DIM1*DIM2) :: bufr                ! Data buffer
-INTEGER, DIMENSION(DIM1,DIM2) :: buf2                ! Data buffer
-INTEGER, DIMENSION(DIM1,DIM2) :: buf2r               ! Data buffer
-REAL, DIMENSION(DIM1,DIM2)    :: buf3                ! Data buffer
-REAL, DIMENSION(DIM1,DIM2)    :: buf3r               ! Data buffer
-DOUBLE PRECISION, DIMENSION(DIM1,DIM2) :: buf4       ! Data buffer
-DOUBLE PRECISION, DIMENSION(DIM1,DIM2) :: buf4r      ! Data buffer
-INTEGER        :: errcode                            ! Error flag
-INTEGER(HSIZE_T) :: i, j, n                            ! general purpose integers
-
-CALL test_begin(' Make/Read datasets (2D)        ')
-
-
-!
-! Initialize the data arrays.
-!
-n=1
-DO i = 1, DIM1*DIM2
-   buf(i) = INT(n)
-   n = n + 1
-END DO
-
-DO i = 1, dims(1)
- DO j = 1, dims(2)
-  buf2(i,j) = INT((i-1)*dims(2) + j)
-  buf3(i,j) = INT((i-1)*dims(2) + j)
-  buf4(i,j) = INT((i-1)*dims(2) + j)
- END DO
-END DO
-
-
-!
-! Initialize FORTRAN predefined datatypes.
-!
-CALL h5open_f(errcode)
-
-!
-! Create a new file using default properties.
-!
-CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, errcode)
-
-!-------------------------------------------------------------------------
-! H5T_NATIVE_INT 1D buffer
-!-------------------------------------------------------------------------
-
-!
-! write dataset.
-!
-CALL h5ltmake_dataset_f(file_id, dsetname1, rank, dims, H5T_NATIVE_INTEGER, buf, errcode)
-
-!
-! read dataset.
-!
-CALL h5ltread_dataset_f(file_id, dsetname1, H5T_NATIVE_INTEGER, bufr, dims, errcode)
-
-!
-! compare read and write buffers.
-!
-DO i = 1, DIM1*DIM2
-  IF ( buf(i) .NE. bufr(i) ) THEN
-    PRINT *, 'read buffer differs from write buffer'
-    PRINT *,  bufr(i), ' and ',   buf(i)
-    STOP
-  ENDIF
-END DO
-
-!-------------------------------------------------------------------------
-! H5T_NATIVE_INT 2D buffer
-!-------------------------------------------------------------------------
-
-!
-! write dataset.
-!
-CALL h5ltmake_dataset_f(file_id, dsetname2, rank, dims, H5T_NATIVE_INTEGER, buf2, errcode)
-
-!
-! read dataset.
-!
-CALL h5ltread_dataset_f(file_id, dsetname2, H5T_NATIVE_INTEGER, buf2r, dims, errcode)
-
-!
-! compare read and write buffers.
-!
-DO i = 1, dims(1)
- DO j = 1, dims(2)
-  IF ( buf2(i,j) .NE. buf2r(i,j) ) THEN
-    PRINT *, 'read buffer differs from write buffer'
-    PRINT *,  buf2r(i,j), ' and ',   buf2(i,j)
-    STOP
-  ENDIF
- END DO
-END DO
-
-!-------------------------------------------------------------------------
-! H5T_NATIVE_REAL
-!-------------------------------------------------------------------------
-
-!
-! write dataset.
-!
-CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims, H5T_NATIVE_REAL, buf3, errcode)
-
-!
-! read dataset.
-!
-CALL h5ltread_dataset_f(file_id, dsetname3, H5T_NATIVE_REAL, buf3r, dims, errcode)
-
-!
-! compare read and write buffers.
-!
-DO i = 1, dims(1)
- DO j = 1, dims(2)
-  IF ( buf3(i,j) .NE. buf3r(i,j) ) THEN
-    PRINT *, 'read buffer differs from write buffer'
-    PRINT *,  buf3r(i,j), ' and ',   buf3(i,j)
-    STOP
-  ENDIF
- END DO
-END DO
-
-!-------------------------------------------------------------------------
-! H5T_NATIVE_DOUBLE
-!-------------------------------------------------------------------------
-
-!
-! write dataset.
-!
-CALL h5ltmake_dataset_f(file_id, dsetname4, rank, dims, H5T_NATIVE_DOUBLE, buf4, errcode)
-
-!
-! read dataset.
-!
-CALL h5ltread_dataset_f(file_id, dsetname4, H5T_NATIVE_DOUBLE, buf4r, dims, errcode)
-
-!
-! compare read and write buffers.
-!
-DO i = 1, dims(1)
- DO j = 1, dims(2)
-  IF ( buf4(i,j) .NE. buf4r(i,j) ) THEN
-    PRINT *, 'read buffer differs from write buffer'
-    PRINT *,  buf4r(i,j), ' and ',   buf4(i,j)
-    STOP
-  ENDIF
- END DO
-END DO
-
-!
-! Close the file.
-!
-CALL h5fclose_f(file_id, errcode)
-
-!
-! Close FORTRAN predefined datatypes.
-!
-CALL h5close_f(errcode)
-
-CALL passed()
-!
-! end function.
-!
-END SUBROUTINE test_dataset2D
-
-
-!-------------------------------------------------------------------------
-! test_dataset3D
-!-------------------------------------------------------------------------
-
-
-SUBROUTINE test_dataset3D()
-
-USE H5LT ! module of H5LT
-USE HDF5 ! module of HDF5 library
-
-IMPLICIT NONE
-
-INTEGER, PARAMETER :: DIM1 = 6                             ! columns
-INTEGER, PARAMETER :: DIM2 = 4                             ! rows
-INTEGER, PARAMETER :: DIM3 = 2                             ! layers
-CHARACTER(len=9), PARAMETER :: filename = "dsetf3.h5"       ! File name
-CHARACTER(LEN=5), PARAMETER :: dsetname1 = "dset1"          ! Dataset name
-CHARACTER(LEN=5), PARAMETER :: dsetname2 = "dset2"          ! Dataset name
-CHARACTER(LEN=5), PARAMETER :: dsetname3 = "dset3"          ! Dataset name
-CHARACTER(LEN=5), PARAMETER :: dsetname4 = "dset4"          ! Dataset name
-INTEGER(HID_T) :: file_id                                   ! File identifier
-INTEGER(HSIZE_T), DIMENSION(3) :: dims = (/DIM1,DIM2,DIM3/) ! Dataset dimensions
-INTEGER(HSIZE_T), DIMENSION(3) :: dimsr                     ! Dataset dimensions
-INTEGER, DIMENSION(DIM1*DIM2*DIM3) :: buf                   ! Data buffer
-INTEGER, DIMENSION(DIM1*DIM2*DIM3) :: bufr                  ! Data buffer
-INTEGER, DIMENSION(DIM1,DIM2,DIM3) :: buf2                  ! Data buffer
-INTEGER, DIMENSION(DIM1,DIM2,DIM3) :: buf2r                 ! Data buffer
-REAL, DIMENSION(DIM1,DIM2,DIM3)    :: buf3                  ! Data buffer
-REAL, DIMENSION(DIM1,DIM2,DIM3)    :: buf3r                 ! Data buffer
-DOUBLE PRECISION, DIMENSION(DIM1,DIM2,DIM3) :: buf4         ! Data buffer
-DOUBLE PRECISION, DIMENSION(DIM1,DIM2,DIM3) :: buf4r        ! Data buffer
-INTEGER        :: rank = 3                                  ! Dataset rank
-INTEGER        :: errcode                                   ! Error flag
-INTEGER(HSIZE_T) :: i, j, k, n                                ! general purpose integers
-INTEGER          :: type_class
-INTEGER(SIZE_T)  :: type_size
-
-CALL test_begin(' Make/Read datasets (3D)        ')
-
-
-!
-! Initialize the data array.
-!
-n=1
-DO i = 1, DIM1*DIM2*DIM3
-   buf(i) = INT(n)
-   n = n + 1
-END DO
-
-n = 1
-DO i = 1, dims(1)
-   DO j = 1, dims(2)
-      DO k = 1, dims(3)
-         buf2(i,j,k) = INT(n)
-         buf3(i,j,k) = INT(n)
-         buf4(i,j,k) = INT(n)
-         n = n + 1
-      END DO
-   END DO
-END DO
-
-!
-! Initialize FORTRAN predefined datatypes.
-!
-CALL h5open_f(errcode)
-
-!
-! Create a new file using default properties.
-!
-CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, errcode)
-
-!-------------------------------------------------------------------------
-! H5T_NATIVE_INT 1D buffer
-!-------------------------------------------------------------------------
-
-!
-! write dataset.
-!
-CALL h5ltmake_dataset_f(file_id, dsetname1, rank, dims, H5T_NATIVE_INTEGER, buf, errcode)
-
-!
-! read dataset.
-!
-CALL h5ltread_dataset_f(file_id, dsetname1, H5T_NATIVE_INTEGER, bufr, dims, errcode)
-
-!
-! compare read and write buffers.
-!
-DO i = 1, DIM1*DIM2*DIM3
-  IF ( buf(i) .NE. bufr(i) ) THEN
-    PRINT *, 'read buffer differs from write buffer'
-    PRINT *,  bufr(i), ' and ',   buf(i)
-    STOP
-  ENDIF
-END DO
-
-!-------------------------------------------------------------------------
-! H5T_NATIVE_INT 3D buffer
-!-------------------------------------------------------------------------
-
-!
-! write dataset.
-!
-CALL h5ltmake_dataset_f(file_id, dsetname2, rank, dims, H5T_NATIVE_INTEGER, buf2, errcode)
-
-!
-! read dataset.
-!
-CALL h5ltread_dataset_f(file_id, dsetname2, H5T_NATIVE_INTEGER, buf2r, dims, errcode)
-
-!
-! compare read and write buffers.
-!
-DO i = 1, dims(1)
- DO j = 1, dims(2)
- DO k = 1, dims(3)
-  IF ( buf2(i,j,k) .NE. buf2r(i,j,k) ) THEN
-    PRINT *, 'read buffer differs from write buffer'
-    PRINT *,  buf2r(i,j,k), ' and ',   buf2(i,j,k)
-    STOP
-  ENDIF
- END DO
- END DO
-END DO
-
-!-------------------------------------------------------------------------
-! H5T_NATIVE_REAL
-!-------------------------------------------------------------------------
-
-!
-! write dataset.
-!
-CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims, H5T_NATIVE_REAL, buf3, errcode)
-
-!
-! read dataset.
-!
-CALL h5ltread_dataset_f(file_id, dsetname3, H5T_NATIVE_REAL, buf3r, dims, errcode)
-
-!
-! compare read and write buffers.
-!
-DO i = 1, dims(1)
- DO j = 1, dims(2)
- DO k = 1, dims(3)
-  IF ( buf3(i,j,k) .NE. buf3r(i,j,k) ) THEN
-    PRINT *, 'read buffer differs from write buffer'
-    PRINT *,  buf3r(i,j,k), ' and ',   buf3(i,j,k)
-    STOP
-  ENDIF
- END DO
- END DO
-END DO
-
-!-------------------------------------------------------------------------
-! H5T_NATIVE_DOUBLE
-!-------------------------------------------------------------------------
-
-!
-! write dataset.
-!
-CALL h5ltmake_dataset_f(file_id, dsetname4, rank, dims, H5T_NATIVE_DOUBLE, buf4, errcode)
-
-!
-! read dataset.
-!
-CALL h5ltread_dataset_f(file_id, dsetname4, H5T_NATIVE_DOUBLE, buf4r, dims, errcode)
-
-!
-! compare read and write buffers.
-!
-DO i = 1, dims(1)
- DO j = 1, dims(2)
- DO k = 1, dims(3)
-  IF ( buf4(i,j,k) .NE. buf4r(i,j,k) ) THEN
-    PRINT *, 'read buffer differs from write buffer'
-    PRINT *,  buf4r(i,j,k), ' and ',   buf4(i,j,k)
-    STOP
-  ENDIF
- END DO
- END DO
-END DO
-
-CALL h5ltget_dataset_info_f(file_id,dsetname4,dimsr,type_class,type_size,errcode )
-
-!
-! compare dimensions
-!
-DO i = 1, rank
- IF ( dimsr(i) .NE. dims(i) ) THEN
-   PRINT *, 'dimensions differ '
-   STOP
-  ENDIF
-END DO
-
-!
-! Close the file.
-!
-CALL h5fclose_f(file_id, errcode)
-
-!
-! Close FORTRAN predefined datatypes.
-!
-CALL h5close_f(errcode)
-
-CALL passed()
-!
-! end function.
-!
-END SUBROUTINE test_dataset3D
-
-!-------------------------------------------------------------------------
-! test_datasetND
-!-------------------------------------------------------------------------
-
-
-SUBROUTINE test_datasetND(rank)
-
-  USE H5LT ! module of H5LT
-  USE HDF5 ! module of HDF5 library
-
-  IMPLICIT NONE
-
-  INTEGER            :: rank                                  ! Dataset rank
-
-  INTEGER, PARAMETER :: DIM1 = 2                              ! columns
-  INTEGER, PARAMETER :: DIM2 = 4                              ! rows
-  INTEGER, PARAMETER :: DIM3 = 2                              ! layers
-  INTEGER, PARAMETER :: DIM4 = 5                              ! columns
-  INTEGER, PARAMETER :: DIM5 = 4                              ! rows
-  INTEGER, PARAMETER :: DIM6 = 3                              ! layers
-  INTEGER, PARAMETER :: DIM7 = 2                              ! layers
-  CHARACTER(len=9), PARAMETER :: filename = "dsetf3.h5"       ! File name
-  CHARACTER(LEN=5), PARAMETER :: dsetname2 = "dset2"          ! Dataset name
-  CHARACTER(LEN=5), PARAMETER :: dsetname3 = "dset3"          ! Dataset name
-  CHARACTER(LEN=5), PARAMETER :: dsetname4 = "dset4"          ! Dataset name
-  INTEGER(HID_T) :: file_id                                   ! File identifier
-  INTEGER(HSIZE_T), DIMENSION(7) :: dims
-  INTEGER(HSIZE_T), DIMENSION(7) :: dimsr                     ! Dataset dimensions
-  INTEGER, ALLOCATABLE, DIMENSION(:,:,:,:) :: ibuf_4          ! Data buffer
-  INTEGER, ALLOCATABLE, DIMENSION(:,:,:,:) :: ibufr_4         ! Data buffer
-  INTEGER, ALLOCATABLE, DIMENSION(:,:,:,:,:) :: ibuf_5        ! Data buffer
-  INTEGER, ALLOCATABLE, DIMENSION(:,:,:,:,:) :: ibufr_5       ! Data buffer
-  INTEGER, ALLOCATABLE, DIMENSION(:,:,:,:,:,:) :: ibuf_6      ! Data buffer
-  INTEGER, ALLOCATABLE, DIMENSION(:,:,:,:,:,:) :: ibufr_6     ! Data buffer
-  INTEGER, ALLOCATABLE, DIMENSION(:,:,:,:,:,:,:) :: ibuf_7    ! Data buffer
-  INTEGER, ALLOCATABLE, DIMENSION(:,:,:,:,:,:,:) :: ibufr_7   ! Data buffer
-  REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: rbuf_4                ! Data buffer
-  REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: rbufr_4               ! Data buffer
-  REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:) :: rbuf_5              ! Data buffer
-  REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:) :: rbufr_5             ! Data buffer
-  REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:,:) :: rbuf_6            ! Data buffer
-  REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:,:) :: rbufr_6           ! Data buffer
-  REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:,:,:) :: rbuf_7          ! Data buffer
-  REAL, ALLOCATABLE, DIMENSION(:,:,:,:,:,:,:) :: rbufr_7         ! Data buffer
-  DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:,:) :: dbuf_4    ! Data buffer
-  DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:,:) :: dbufr_4            ! Data buffer
-  DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:,:,:) :: dbuf_5           ! Data buffer
-  DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:,:,:) :: dbufr_5          ! Data buffer
-  DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:,:,:,:) :: dbuf_6         ! Data buffer
-  DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:,:,:,:) :: dbufr_6        ! Data buffer
-  DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:,:,:,:,:) :: dbuf_7       ! Data buffer
-  DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:,:,:,:,:) :: dbufr_7      ! Data buffer
-  INTEGER        :: errcode                                   ! Error flag
-  INTEGER(HSIZE_T)        :: i, j, k, l, m, n, o, nn                   ! general purpose integers
-  INTEGER          :: type_class
-  INTEGER(SIZE_T)  :: type_size
-  CHARACTER(LEN=1) :: ichr1
-
-  WRITE(ichr1,'(I1.1)') rank
-  CALL test_begin(' Make/Read datasets ('//ichr1//'D)        ')
-!
-! Initialize the data array.
-!
-  IF(rank.EQ.4)THEN
-     
-     ALLOCATE(ibuf_4 (1:DIM1,1:DIM2,1:DIM3,1:DIM4))
-     ALLOCATE(ibufr_4(1:DIM1,1:DIM2,1:DIM3,1:DIM4))
-     ALLOCATE(rbuf_4 (1:DIM1,1:DIM2,1:DIM3,1:DIM4))
-     ALLOCATE(rbufr_4(1:DIM1,1:DIM2,1:DIM3,1:DIM4))
-     ALLOCATE(dbuf_4 (1:DIM1,1:DIM2,1:DIM3,1:DIM4))
-     ALLOCATE(dbufr_4(1:DIM1,1:DIM2,1:DIM3,1:DIM4))
-
-     dims(1:7) = (/DIM1,DIM2,DIM3,DIM4,0,0,0/)
-     
-     nn = 1
-     DO i = 1, DIM1
-        DO j = 1, DIM2
-           DO k = 1, DIM3
-              DO l = 1, DIM4
-                 ibuf_4(i,j,k,l) = INT(nn)
-                 rbuf_4(i,j,k,l) = INT(nn)
-                 dbuf_4(i,j,k,l) = INT(nn)
-                 nn = nn + 1
-              END DO
-           END DO
-        END DO
-     ENDDO
-     
-  ELSE IF(rank.EQ.5)THEN
-
-     ALLOCATE(ibuf_5 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5))
-     ALLOCATE(ibufr_5(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5))
-     ALLOCATE(rbuf_5 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5))
-     ALLOCATE(rbufr_5(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5))
-     ALLOCATE(dbuf_5 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5))
-     ALLOCATE(dbufr_5(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5))
-
-     dims(1:7) = (/DIM1,DIM2,DIM3,DIM4,DIM5,0,0/)
-     
-     nn = 1
-     DO i = 1, DIM1
-        DO j = 1, DIM2
-           DO k = 1, DIM3
-              DO l = 1, DIM4
-                 DO m = 1, DIM5
-                    ibuf_5(i,j,k,l,m) = INT(nn)
-                    rbuf_5(i,j,k,l,m) = INT(nn)
-                    dbuf_5(i,j,k,l,m) = INT(nn)
-                    nn = nn + 1
-                 END DO
-              END DO
-           END DO
-        ENDDO
-     ENDDO
-
-  ELSE IF(rank.EQ.6)THEN
-
-     ALLOCATE(ibuf_6 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6))
-     ALLOCATE(ibufr_6(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6))
-     ALLOCATE(rbuf_6 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6))
-     ALLOCATE(rbufr_6(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6))
-     ALLOCATE(dbuf_6 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6))
-     ALLOCATE(dbufr_6(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6))
-
-     dims(1:7) = (/DIM1,DIM2,DIM3,DIM4,DIM5,DIM6,0/)
-     
-     nn = 1
-     DO i = 1, DIM1
-        DO j = 1, DIM2
-           DO k = 1, DIM3
-              DO l = 1, DIM4
-                 DO m = 1, DIM5
-                    DO n = 1, DIM6
-                       ibuf_6(i,j,k,l,m,n) = INT(nn)
-                       rbuf_6(i,j,k,l,m,n) = INT(nn)
-                       dbuf_6(i,j,k,l,m,n) = INT(nn)
-                       nn = nn + 1
-                    END DO
-                 END DO
-              END DO
-           ENDDO
-        ENDDO
-     ENDDO
-     
-  ELSE IF(rank.EQ.7)THEN
-     
-     ALLOCATE(ibuf_7 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6,1:DIM7))
-     ALLOCATE(ibufr_7(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6,1:DIM7))
-     ALLOCATE(rbuf_7 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6,1:DIM7))
-     ALLOCATE(rbufr_7(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6,1:DIM7))
-     ALLOCATE(dbuf_7 (1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6,1:DIM7))
-     ALLOCATE(dbufr_7(1:DIM1,1:DIM2,1:DIM3,1:DIM4,1:DIM5,1:DIM6,1:DIM7))
-
-     dims(1:7) = (/DIM1,DIM2,DIM3,DIM4,DIM5,DIM6,DIM7/)
-     
-     nn = 1
-     DO i = 1, DIM1
-        DO j = 1, DIM2
-           DO k = 1, DIM3
-              DO l = 1, DIM4
-                 DO m = 1, DIM5
-                    DO n = 1, DIM6
-                       DO o = 1, DIM7
-                          ibuf_7(i,j,k,l,m,n,o) = INT(nn)
-                          rbuf_7(i,j,k,l,m,n,o) = INT(nn)
-                          dbuf_7(i,j,k,l,m,n,o) = INT(nn)
-                          nn = nn + 1
-                       END DO
-                    END DO
-                 END DO
-              ENDDO
-           ENDDO
-        ENDDO
-     ENDDO
-
-  ENDIF
-
-  !
-  ! Initialize FORTRAN predefined datatypes.
-  !
-  CALL h5open_f(errcode)
-
-  !
-  ! Create a new file using default properties.
-  !
-  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, errcode)
-
-  !-------------------------------------------------------------------------
-  ! H5T_NATIVE_INT ND buffer
-  !-------------------------------------------------------------------------
-
-  !
-  ! write dataset.
-  !
-  IF(rank.EQ.4)THEN
-     CALL h5ltmake_dataset_f(file_id, dsetname2, rank, dims(1:rank), H5T_NATIVE_INTEGER, ibuf_4, errcode)
-  ELSE IF(rank.EQ.5)THEN
-     CALL h5ltmake_dataset_f(file_id, dsetname2, rank, dims(1:rank), H5T_NATIVE_INTEGER, ibuf_5, errcode)
-  ELSE IF(rank.EQ.6)THEN
-     CALL h5ltmake_dataset_f(file_id, dsetname2, rank, dims(1:rank), H5T_NATIVE_INTEGER, ibuf_6, errcode)
-  ELSE IF(rank.EQ.7)THEN
-     CALL h5ltmake_dataset_f(file_id, dsetname2, rank, dims(1:rank), H5T_NATIVE_INTEGER, ibuf_7, errcode)
-  ENDIF
-     
-
-  !
-  ! read dataset.
-  !
-  IF(rank.EQ.4)THEN
-     CALL h5ltread_dataset_f(file_id, dsetname2, H5T_NATIVE_INTEGER, ibufr_4, dims(1:rank), errcode)
-  ELSE IF(rank.EQ.5)THEN
-     CALL h5ltread_dataset_f(file_id, dsetname2, H5T_NATIVE_INTEGER, ibufr_5, dims(1:rank), errcode)
-  ELSE IF(rank.EQ.6)THEN
-     CALL h5ltread_dataset_f(file_id, dsetname2, H5T_NATIVE_INTEGER, ibufr_6, dims(1:rank), errcode)
-  ELSE IF(rank.EQ.7)THEN
-     CALL h5ltread_dataset_f(file_id, dsetname2, H5T_NATIVE_INTEGER, ibufr_7, dims(1:rank), errcode)
-  ENDIF
-
-  !
-  ! compare read and write buffers.
-  !
-  DO i = 1, dims(1)
-     DO j = 1, dims(2)
-        DO k = 1, dims(3)
-           DO l = 1, dims(4)
-              IF(rank.EQ.4)THEN
-                 IF ( ibuf_4(i,j,k,l) .NE. ibufr_4(i,j,k,l) ) THEN
-                    PRINT *, 'read buffer differs from write buffer'
-                    PRINT *,  ibuf_4(i,j,k,l), ' and ', ibufr_4(i,j,k,l)
-                    STOP
-                 ENDIF
-              ENDIF
-              DO m = 1, dims(5)
-                 IF(rank.EQ.5)THEN
-                    IF ( ibuf_5(i,j,k,l,m) .NE. ibufr_5(i,j,k,l,m) ) THEN
-                       PRINT *, 'read buffer differs from write buffer'
-                       PRINT *,  ibuf_5(i,j,k,l,m), ' and ', ibufr_5(i,j,k,l,m)
-                       STOP
-                    ENDIF
-                 ENDIF
-                 DO n = 1, dims(6)
-                    IF(rank.EQ.6)THEN
-                       IF ( ibuf_6(i,j,k,l,m,n) .NE. ibufr_6(i,j,k,l,m,n) ) THEN
-                          PRINT *, 'read buffer differs from write buffer'
-                          PRINT *,  ibuf_6(i,j,k,l,m,n), ' and ', ibufr_6(i,j,k,l,m,n)
-                          STOP
-                       ENDIF
-                    ENDIF
-                    DO o = 1, dims(7)
-                       IF(rank.EQ.7)THEN
-                          IF ( ibuf_7(i,j,k,l,m,n,o) .NE. ibufr_7(i,j,k,l,m,n,o) ) THEN
-                             PRINT *, 'read buffer differs from write buffer'
-                             PRINT *,  ibuf_7(i,j,k,l,m,n,o), ' and ', ibufr_7(i,j,k,l,m,n,o)
-                             STOP
-                          ENDIF
-                       ENDIF
-                    ENDDO
-                 ENDDO
-              ENDDO
-           ENDDO
-        ENDDO
-     ENDDO
-  ENDDO
-  !-------------------------------------------------------------------------
-  ! H5T_NATIVE_REAL
-  !-------------------------------------------------------------------------
-
-  !
-  ! write dataset.
-  !
-  IF(rank.EQ.4)THEN
-     CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims(1:rank), H5T_NATIVE_REAL, rbuf_4, errcode)
-  ELSE IF(rank.EQ.5)THEN
-     CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims(1:rank), H5T_NATIVE_REAL, rbuf_5, errcode)
-  ELSE IF(rank.EQ.6)THEN
-     CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims(1:rank), H5T_NATIVE_REAL, rbuf_6, errcode)
-  ELSE IF(rank.EQ.7)THEN
-     CALL h5ltmake_dataset_f(file_id, dsetname3, rank, dims(1:rank), H5T_NATIVE_REAL, rbuf_7, errcode)
-  ENDIF
-     
-
-  !
-  ! read dataset.
-  !
-  IF(rank.EQ.4)THEN
-     CALL h5ltread_dataset_f(file_id, dsetname3, H5T_NATIVE_REAL, rbufr_4, dims(1:rank), errcode)
-  ELSE IF(rank.EQ.5)THEN
-     CALL h5ltread_dataset_f(file_id, dsetname3, H5T_NATIVE_REAL, rbufr_5, dims(1:rank), errcode)
-  ELSE IF(rank.EQ.6)THEN
-     CALL h5ltread_dataset_f(file_id, dsetname3, H5T_NATIVE_REAL, rbufr_6, dims(1:rank), errcode)
-  ELSE IF(rank.EQ.7)THEN
-     CALL h5ltread_dataset_f(file_id, dsetname3, H5T_NATIVE_REAL, rbufr_7, dims(1:rank), errcode)
-  ENDIF
-
-  !
-  ! compare read and write buffers.
-  !
-  DO i = 1, dims(1)
-     DO j = 1, dims(2)
-        DO k = 1, dims(3)
-           DO l = 1, dims(4)
-              IF(rank.EQ.4)THEN
-                 IF ( rbuf_4(i,j,k,l) .NE. rbufr_4(i,j,k,l) ) THEN
-                    PRINT *, 'read buffer differs from write buffer'
-                    PRINT *,  rbuf_4(i,j,k,l), ' and ', rbufr_4(i,j,k,l)
-                    STOP
-                 ENDIF
-              ENDIF
-              DO m = 1, dims(5)
-                 IF(rank.EQ.5)THEN
-                    IF ( rbuf_5(i,j,k,l,m) .NE. rbufr_5(i,j,k,l,m) ) THEN
-                       PRINT *, 'read buffer differs from write buffer'
-                       PRINT *,  rbuf_5(i,j,k,l,m), ' and ', rbufr_5(i,j,k,l,m)
-                       STOP
-                    ENDIF
-                 ENDIF
-                 DO n = 1, dims(6)
-                    IF(rank.EQ.6)THEN
-                       IF ( rbuf_6(i,j,k,l,m,n) .NE. rbufr_6(i,j,k,l,m,n) ) THEN
-                          PRINT *, 'read buffer differs from write buffer'
-                          PRINT *,  rbuf_6(i,j,k,l,m,n), ' and ', rbufr_6(i,j,k,l,m,n)
-                          STOP
-                       ENDIF
-                    ENDIF
-                    DO o = 1, dims(7)
-                       IF(rank.EQ.7)THEN
-                          IF ( rbuf_7(i,j,k,l,m,n,o) .NE. rbufr_7(i,j,k,l,m,n,o) ) THEN
-                             PRINT *, 'read buffer differs from write buffer'
-                             PRINT *,  rbuf_7(i,j,k,l,m,n,o), ' and ', rbufr_7(i,j,k,l,m,n,o)
-                             STOP
-                          ENDIF
-                       ENDIF
-                    ENDDO
-                 ENDDO
-              ENDDO
-           ENDDO
-        ENDDO
-     ENDDO
-  ENDDO
-
-  !-------------------------------------------------------------------------
-  ! H5T_NATIVE_DOUBLE
-  !-------------------------------------------------------------------------
-
-  !
-  ! write dataset.
-  !
-  IF(rank.EQ.4)THEN
-     CALL h5ltmake_dataset_f(file_id, dsetname4, rank, dims(1:rank), H5T_NATIVE_DOUBLE, dbuf_4, errcode)
-  ELSE IF(rank.EQ.5)THEN
-     CALL h5ltmake_dataset_f(file_id, dsetname4, rank, dims(1:rank), H5T_NATIVE_DOUBLE, dbuf_5, errcode)
-  ELSE IF(rank.EQ.6)THEN
-     CALL h5ltmake_dataset_f(file_id, dsetname4, rank, dims(1:rank), H5T_NATIVE_DOUBLE, dbuf_6, errcode)
-  ELSE IF(rank.EQ.7)THEN
-     CALL h5ltmake_dataset_f(file_id, dsetname4, rank, dims(1:rank), H5T_NATIVE_DOUBLE, dbuf_7, errcode)
-  ENDIF
-     
-
-  !
-  ! read dataset.
-  !
-  IF(rank.EQ.4)THEN
-     CALL h5ltread_dataset_f(file_id, dsetname4, H5T_NATIVE_DOUBLE, dbufr_4, dims(1:rank), errcode)
-  ELSE IF(rank.EQ.5)THEN
-     CALL h5ltread_dataset_f(file_id, dsetname4, H5T_NATIVE_DOUBLE, dbufr_5, dims(1:rank), errcode)
-  ELSE IF(rank.EQ.6)THEN
-     CALL h5ltread_dataset_f(file_id, dsetname4, H5T_NATIVE_DOUBLE, dbufr_6, dims(1:rank), errcode)
-  ELSE IF(rank.EQ.7)THEN
-     CALL h5ltread_dataset_f(file_id, dsetname4, H5T_NATIVE_DOUBLE, dbufr_7, dims(1:rank), errcode)
-  ENDIF
-
-  !
-  ! compare read and write buffers.
-  !
-  DO i = 1, dims(1)
-     DO j = 1, dims(2)
-        DO k = 1, dims(3)
-           DO l = 1, dims(4)
-              IF(rank.EQ.4)THEN
-                 IF ( dbuf_4(i,j,k,l) .NE. dbufr_4(i,j,k,l) ) THEN
-                    PRINT *, 'read buffer differs from write buffer'
-                    PRINT *,  dbuf_4(i,j,k,l), ' and ', dbufr_4(i,j,k,l)
-                    STOP
-                 ENDIF
-              ENDIF
-              DO m = 1, dims(5)
-                 IF(rank.EQ.5)THEN
-                    IF ( dbuf_5(i,j,k,l,m) .NE. dbufr_5(i,j,k,l,m) ) THEN
-                       PRINT *, 'read buffer differs from write buffer'
-                       PRINT *,  dbuf_5(i,j,k,l,m), ' and ', dbufr_5(i,j,k,l,m)
-                       STOP
-                    ENDIF
-                 ENDIF
-                 DO n = 1, dims(6)
-                    IF(rank.EQ.6)THEN
-                       IF ( dbuf_6(i,j,k,l,m,n) .NE. dbufr_6(i,j,k,l,m,n) ) THEN
-                          PRINT *, 'read buffer differs from write buffer'
-                          PRINT *,  dbuf_6(i,j,k,l,m,n), ' and ', dbufr_6(i,j,k,l,m,n)
-                          STOP
-                       ENDIF
-                    ENDIF
-                    DO o = 1, dims(7)
-                       IF(rank.EQ.7)THEN
-                          IF ( dbuf_7(i,j,k,l,m,n,o) .NE. dbufr_7(i,j,k,l,m,n,o) ) THEN
-                             PRINT *, 'read buffer differs from write buffer'
-                             PRINT *,  dbuf_7(i,j,k,l,m,n,o), ' and ', dbufr_7(i,j,k,l,m,n,o)
-                             STOP
-                          ENDIF
-                       ENDIF
-                    ENDDO
-                 ENDDO
-              ENDDO
-           ENDDO
-        ENDDO
-     ENDDO
-  ENDDO
-
-  CALL h5ltget_dataset_info_f(file_id,dsetname4,dimsr,type_class,type_size,errcode )
-
-  !
-  ! compare dimensions
-  !
-  DO i = 1, rank
-     IF ( dimsr(i) .NE. dims(i) ) THEN
-        PRINT *, 'dimensions differ '
-        STOP
-     ENDIF
-  END DO
-
-  !
-  ! Close the file.
-  !
-  CALL h5fclose_f(file_id, errcode)
-
-  !
-  ! Close FORTRAN predefined datatypes.
-  !
-  CALL h5close_f(errcode)
-
-  ! DEALLOCATE RESOURCES
-
-  IF(rank.EQ.4)THEN
-     DEALLOCATE(ibuf_4, ibufr_4, rbuf_4, rbufr_4, dbuf_4, dbufr_4)
-  ELSE IF(rank.EQ.5)THEN
-     DEALLOCATE(ibuf_5, ibufr_5, rbuf_5, rbufr_5, dbuf_5, dbufr_5)
-  ELSE IF(rank.EQ.6)THEN
-     DEALLOCATE(ibuf_6, ibufr_6, rbuf_6, rbufr_6, dbuf_6, dbufr_6)
-  ELSE IF(rank.EQ.7)THEN
-     DEALLOCATE(ibuf_7, ibufr_7, rbuf_7, rbufr_7, dbuf_7, dbufr_7)
-  ENDIF
-
-  CALL passed()
-  !
-  ! end function.
-  !
-END SUBROUTINE test_datasetND
-
-
-
-!-------------------------------------------------------------------------
-! test_datasets
-!-------------------------------------------------------------------------
-
-SUBROUTINE test_datasets()
-
-  USE H5LT ! module of H5LT
-  USE HDF5 ! module of HDF5 library
-
-  IMPLICIT NONE
-
-  CHARACTER(len=9), PARAMETER :: filename = "dsetf4.h5"! File name
-  INTEGER(HID_T) :: file_id                            ! File identifier
-  INTEGER        :: errcode                            ! Error flag
-  INTEGER, PARAMETER :: DIM1 = 10                     ! Dimension of array
-  CHARACTER(LEN=5), PARAMETER :: dsetname1 = "dset1"   ! Dataset name
-  CHARACTER(LEN=5), PARAMETER :: dsetname2 = "dset2"   ! Dataset name
-  CHARACTER(LEN=5), PARAMETER :: dsetname3 = "dset3"   ! Dataset name
-  CHARACTER(LEN=5), PARAMETER :: dsetname4 = "dset4"   ! Dataset name
-  CHARACTER(LEN=5), PARAMETER :: dsetname5 = "dset5"   ! Dataset name
-  INTEGER(HSIZE_T), DIMENSION(1) :: dims = (/DIM1/)    ! Dataset dimensions
-  INTEGER(HSIZE_T), DIMENSION(1) :: dimsr              ! Dataset dimensions
-  INTEGER        :: rank = 1                           ! Dataset rank
-  INTEGER        :: rankr                              ! Dataset rank
-  CHARACTER(LEN=8), PARAMETER :: buf1 = "mystring"     ! Data buffer
-  CHARACTER(LEN=8)            :: buf1r                 ! Data buffer
-  INTEGER, DIMENSION(DIM1)          :: buf2            ! Data buffer
-  INTEGER, DIMENSION(DIM1)          :: bufr2           ! Data buffer
-  REAL, DIMENSION(DIM1)             :: buf3            ! Data buffer
-  REAL, DIMENSION(DIM1)             :: bufr3           ! Data buffer
-  DOUBLE PRECISION, DIMENSION(DIM1) :: buf4            ! Data buffer
-  DOUBLE PRECISION, DIMENSION(DIM1) :: bufr4           ! Data buffer
-  INTEGER          :: i, n                             ! general purpose integer
-  INTEGER          :: has                              ! general purpose integer
-  INTEGER          :: type_class
-  INTEGER(SIZE_T)  :: type_size
-  LOGICAL :: path_valid  ! status of the path
-  CHARACTER(LEN=6) :: chr_exact
-  CHARACTER(LEN=8) :: chr_lg
-
-  !
-  ! Initialize FORTRAN predefined datatypes.
-  !
-  CALL h5open_f(errcode)
-
-  !
-  ! Create a new file using default properties.
-  !
-  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, errcode)
-
-  !
-  ! Initialize the data array.
-  !
-  n = 1
-  DO i = 1, DIM1
-     buf2(i) = n
-     buf3(i) = n
-     buf4(i) = n
-     n = n + 1
-  END DO
-
-  !-------------------------------------------------------------------------
-  ! int
-  !-------------------------------------------------------------------------
-
-  CALL test_begin(' Make/Read datasets (integer)   ')
-
-  !
-  ! write dataset.
-  !
-  CALL h5ltmake_dataset_int_f(file_id, dsetname2, rank, dims, buf2, errcode)
-
-  !
-  ! read dataset.
-  !
-  CALL h5ltread_dataset_int_f(file_id, dsetname2, bufr2, dims, errcode)
-
-  !
-  ! compare read and write buffers.
-  !
-  DO i = 1, DIM1
-     IF ( buf2(i) .NE. bufr2(i) ) THEN
-        PRINT *, 'read buffer differs from write buffer'
-        PRINT *,  bufr2(i), ' and ',   buf2(i)
-        STOP
-     ENDIF
-  END DO
-
-  CALL passed()
-
-
-  !-------------------------------------------------------------------------
-  ! real
-  !-------------------------------------------------------------------------
-
-  CALL test_begin(' Make/Read datasets (float)     ')
-
-
-  !
-  ! write dataset.
-  !
-  CALL h5ltmake_dataset_float_f(file_id, dsetname3, rank, dims, buf3, errcode)
-
-  !
-  ! read dataset.
-  !
-  CALL h5ltread_dataset_float_f(file_id, dsetname3, bufr3, dims, errcode)
-
-  !
-  ! compare read and write buffers.
-  !
-  DO i = 1, DIM1
-     IF ( buf3(i) .NE. bufr3(i) ) THEN
-        PRINT *, 'read buffer differs from write buffer'
-        PRINT *,  bufr3(i), ' and ',   buf3(i)
-        STOP
-     ENDIF
-  END DO
-
-  CALL passed()
-
-  !-------------------------------------------------------------------------
-  ! double
-  !-------------------------------------------------------------------------
-
-  CALL test_begin(' Make/Read datasets (double)    ')
-
-
-  !
-  ! write dataset.
-  !
-  CALL h5ltmake_dataset_double_f(file_id, dsetname4, rank, dims, buf4, errcode)
-
-  !
-  ! read dataset.
-  !
-  CALL h5ltread_dataset_double_f(file_id, dsetname4, bufr4, dims, errcode)
-
-  !
-  ! compare read and write buffers.
-  !
-  DO i = 1, DIM1
-     IF ( buf4(i) .NE. bufr4(i) ) THEN
-        PRINT *, 'read buffer differs from write buffer'
-        PRINT *,  bufr4(i), ' and ',   buf4(i)
-        STOP
-     ENDIF
-  END DO
-
-  CALL passed()
-
-
-  !-------------------------------------------------------------------------
-  ! string
-  !-------------------------------------------------------------------------
-
-  CALL test_begin(' Make/Read datasets (string)    ')
-
-
-  !
-  ! write dataset.
-  !
-  CALL h5ltmake_dataset_string_f(file_id, dsetname5, buf1, errcode)
-
-  !
-  ! read dataset.
-  !
-  CALL h5ltread_dataset_string_f(file_id, dsetname5, buf1r, errcode)
-
-  !
-  ! compare read and write buffers.
-  !
-  IF ( buf1 .NE. buf1r ) THEN
-     PRINT *, 'read buffer differs from write buffer'
-     PRINT *,  buf1, ' and ',   buf1r
-     STOP
-  ENDIF
-
-  CALL passed()
-
-  CALL test_begin(' Test h5ltpath_valid_f          ')
-  !
-  ! test function h5ltpath_valid_f
-  !
-  chr_exact = "/"//dsetname2 ! test character buffer the exact size needed
-  CALL h5ltpath_valid_f(file_id, chr_exact, .TRUE., path_valid, errcode)
-  IF(errcode.LT.0.OR..NOT.path_valid)THEN
-     PRINT *, 'error in h5ltpath_valid_f'
-     STOP
-  ENDIF
-  chr_lg = "/"//dsetname2 ! test character buffer larger then needed
-  CALL h5ltpath_valid_f(file_id, chr_lg, .TRUE., path_valid, errcode)
-  IF(errcode.LT.0.OR..NOT.path_valid)THEN
-     PRINT *, 'error in h5ltpath_valid_f'
-     STOP
-  ENDIF
-
-  CALL h5ltpath_valid_f(file_id, chr_lg, .FALSE., path_valid, errcode)
-  IF(errcode.LT.0.OR..NOT.path_valid)THEN
-     PRINT *, 'error in h5ltpath_valid_f'
-     STOP
-  ENDIF 
-
-  ! Should fail, dataset does not exist
-  CALL h5ltpath_valid_f(file_id, "/"//dsetname2//"junk", .TRUE., path_valid, errcode)
-  IF(errcode.LT.0.OR.path_valid)THEN
-     PRINT *, 'error in h5ltpath_valid_f'
-     STOP
-  ENDIF
-
-  CALL h5ltpath_valid_f(file_id, "/"//dsetname2//"junk", .FALSE., path_valid, errcode)
-  IF(errcode.LT.0.OR.path_valid)THEN
-     PRINT *, 'error in h5ltpath_valid_f'
-     STOP
-  ENDIF
-
-  ! Create a dangling soft link
-  CALL h5lcreate_soft_f("/G2", file_id, "/G3", errcode)
-  
-  ! Should pass, does not check for dangled link
-  CALL h5ltpath_valid_f(file_id, "/G3", .FALSE., path_valid, errcode)
-  IF(.NOT.path_valid)THEN
-     PRINT *, 'error in h5ltpath_valid_f'
-     STOP
-  ENDIF
-     
-  ! Should fail, dangled link
-  CALL h5ltpath_valid_f(file_id, "/G2", .TRUE., path_valid, errcode)
-  IF(path_valid)THEN
-     PRINT *, 'error in h5ltpath_valid_f'
-     STOP
-  ENDIF
-
-  CALL passed()
-
-
-  CALL test_begin(' Get dataset dimensions/info    ')
-
-  !-------------------------------------------------------------------------
-  ! h5ltget_dataset_ndims_f
-  !-------------------------------------------------------------------------
-
-  CALL h5ltget_dataset_ndims_f(file_id, dsetname4, rankr, errcode)
-  IF ( rankr .NE. rank ) THEN
-     PRINT *, 'h5ltget_dataset_ndims_f return error'
-     STOP
-  ENDIF
-
-
-  !-------------------------------------------------------------------------
-  ! test h5ltfind_dataset_f function
-  !-------------------------------------------------------------------------
-
-
-  has = h5ltfind_dataset_f(file_id,dsetname4)
-  IF ( has .NE. 1 ) THEN
-     PRINT *, 'h5ltfind_dataset_f return error'
-     STOP
-  ENDIF
-
-  !-------------------------------------------------------------------------
-  ! test h5ltget_dataset_info_f function
-  !-------------------------------------------------------------------------
-
-
-  CALL h5ltget_dataset_info_f(file_id,dsetname4,dimsr,type_class,type_size,errcode )
-
-  !
-  ! compare dimensions
-  !
-  DO i = 1, rank
-     IF ( dimsr(i) .NE. dims(i) ) THEN
-        PRINT *, 'dimensions differ '
-        STOP
-     ENDIF
-  END DO
-
-  IF ( type_class .NE. 1 ) THEN ! H5T_FLOAT
-     PRINT *, 'wrong type class '
-     STOP
-  ENDIF
-
-  !
-  ! Close the file.
-  !
-  CALL h5fclose_f(file_id, errcode)
-  !
-  ! Close FORTRAN predefined datatypes.
-  !
-  CALL h5close_f(errcode)
-
-  CALL passed()
-  !
-  ! end function.
-  !
-END SUBROUTINE test_datasets
-
-
-
-!-------------------------------------------------------------------------
-! test_attributes
-!-------------------------------------------------------------------------
-
-SUBROUTINE test_attributes()
-
-  USE H5LT ! module of H5LT
-  USE HDF5 ! module of HDF5 library
-
-  IMPLICIT NONE
-
-  CHARACTER(len=9), PARAMETER :: filename = "dsetf5.h5"! File name
-  CHARACTER(len=9), PARAMETER :: filename1 ="tattr.h5" ! C written attribute file
-  INTEGER(HID_T) :: file_id                            ! File identifier
-!  INTEGER(HID_T) :: file_id1
-  INTEGER, PARAMETER :: DIM1 = 10                     ! Dimension of array
-  CHARACTER(LEN=5), PARAMETER :: attrname1 = "attr1"   ! Attribute name
-  CHARACTER(LEN=5), PARAMETER :: attrname2 = "attr2"   ! Attribute name
-  CHARACTER(LEN=5), PARAMETER :: attrname3 = "attr3"   ! Attribute name
-  CHARACTER(LEN=5), PARAMETER :: attrname4 = "attr4"   ! Attribute name
-  CHARACTER(LEN=5), PARAMETER :: attrname5 = "attr5"   ! Attribute name
-  CHARACTER(LEN=8), PARAMETER :: buf1 = "mystring"     ! Data buffer
-  CHARACTER(LEN=16), PARAMETER :: buf_c = "string attribute"
-  CHARACTER(LEN=8)                  :: bufr1           ! Data buffer
-  CHARACTER(LEN=10)                 :: bufr1_lg        ! Data buffer
-!  CHARACTER(LEN=16)                 :: bufr_c          ! Data buffer
-!  CHARACTER(LEN=18)                 :: bufr_c_lg       ! Data buffer
-  INTEGER, DIMENSION(DIM1)          :: buf2            ! Data buffer
-  INTEGER, DIMENSION(DIM1)          :: bufr2           ! Data buffer
-  REAL, DIMENSION(DIM1)             :: buf3            ! Data buffer
-  REAL, DIMENSION(DIM1)             :: bufr3           ! Data buffer
-  DOUBLE PRECISION, DIMENSION(DIM1) :: buf4            ! Data buffer
-  DOUBLE PRECISION, DIMENSION(DIM1) :: bufr4           ! Data buffer
-  INTEGER        :: errcode                            ! Error flag
-  INTEGER        :: i, n                               ! general purpose integer
-  INTEGER(SIZE_T) size                                 ! size of attribute array
-  INTEGER        :: rankr                              ! rank
-  INTEGER(HSIZE_T), DIMENSION(1) :: dimsr              ! attribute dimensions
-  INTEGER          :: type_class
-  INTEGER(SIZE_T)  :: type_size
-  INTEGER(HSIZE_T), DIMENSION(1) :: dims = (/DIM1/)    ! Dataset dimensions
-  INTEGER        :: rank = 1                           ! Dataset rank
-  CHARACTER(LEN=5), PARAMETER :: dsetname1 = "dset1"   ! Dataset name
-  INTEGER, DIMENSION(DIM1)    :: buf                   ! Data buffer
-  
-
-  !
-  ! Initialize FORTRAN predefined datatypes.
-  !
-  CALL h5open_f(errcode)
-  !
-  ! Create a new file using default properties.
-  !
-  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, errcode)
-  !
-  ! make a dataset.
-  !
-  CALL h5ltmake_dataset_int_f(file_id, dsetname1, rank, dims, buf, errcode)
-
-  !
-  ! Initialize the data array.
-  !
-  size = DIM1
-  n = 1
-  DO i = 1, DIM1
-     buf2(i) = n
-     buf3(i) = n
-     buf4(i) = n
-     n = n + 1
-  END DO
-
-
-  !-------------------------------------------------------------------------
-  ! int
-  !-------------------------------------------------------------------------
-
-  CALL test_begin(' Set/Get attributes int         ')
-
-
-  !
-  ! write attribute.
-  !
-  CALL h5ltset_attribute_int_f(file_id,dsetname1,attrname2,buf2,size,errcode)
-
-  !
-  ! read attribute.
-  !
-  CALL h5ltget_attribute_int_f(file_id,dsetname1,attrname2,bufr2,errcode)
-
-  !
-  ! compare read and write buffers.
-  !
-  DO i = 1, DIM1
-     IF ( buf2(i) .NE. bufr2(i) ) THEN
-        PRINT *, 'read buffer differs from write buffer'
-        PRINT *,  bufr2(i), ' and ',   buf2(i)
-        STOP
-     ENDIF
-  END DO
-
-  CALL passed()
-
-  !-------------------------------------------------------------------------
-  ! float
-  !-------------------------------------------------------------------------
-
-  CALL test_begin(' Set/Get attributes float       ')
-
-
-  !
-  ! write attribute.
-  !
-  CALL h5ltset_attribute_float_f(file_id,dsetname1,attrname3,buf3,size,errcode)
-  !
-  ! read attribute.
-  !
-  CALL h5ltget_attribute_float_f(file_id,dsetname1,attrname3,bufr3,errcode)
-
-  !
-  ! compare read and write buffers.
-  !
-  DO i = 1, DIM1
-     IF ( buf3(i) .NE. bufr3(i) ) THEN
-        PRINT *, 'read buffer differs from write buffer'
-        PRINT *,  bufr3(i), ' and ',   buf3(i)
-        STOP
-     ENDIF
-  END DO
-
-  CALL passed()
-
-  !-------------------------------------------------------------------------
-  ! double
-  !-------------------------------------------------------------------------
-
-  CALL test_begin(' Set/Get attributes double      ')
-  
-  !
-  ! write attribute.
-  !
-  CALL h5ltset_attribute_double_f(file_id,dsetname1,attrname4,buf4,size,errcode)
-
-  !
-  ! read attribute.
-  !
-  CALL h5ltget_attribute_double_f(file_id,dsetname1,attrname4,bufr4,errcode)
-
-  !
-  ! compare read and write buffers.
-  !
-  DO i = 1, DIM1
-     IF ( buf4(i) .NE. bufr4(i) ) THEN
-        PRINT *, 'read buffer differs from write buffer'
-        PRINT *,  bufr4(i), ' and ',   buf4(i)
-        STOP
-     ENDIF
-  END DO
-
-  CALL passed()
-
-  !-------------------------------------------------------------------------
-  ! string
-  !-------------------------------------------------------------------------
-
-  CALL test_begin(' Set/Get attributes string      ')
-
-  !
-  ! write attribute.
-  !
-  CALL h5ltset_attribute_string_f(file_id,dsetname1,attrname5,buf1,errcode)
-
-  !
-  ! read attribute into a fortran character buf that is the same size as buf1.
-  !
-  CALL h5ltget_attribute_string_f(file_id,dsetname1,attrname5,bufr1,errcode)
-
-  !
-  ! compare read and write buffers.
-  !
-  IF ( buf1 .NE. bufr1 ) THEN
-     PRINT *, 'read buffer differs from write buffer'
-     PRINT *,  buf1, ' and ',   bufr1
-     STOP
-  ENDIF
-
-  !
-  ! read attribute into a fortran character buf that is larger then buf1.
-  !
-  CALL h5ltget_attribute_string_f(file_id,dsetname1,attrname5,bufr1_lg,errcode)
-
-  !
-  ! compare read and write buffers, make sure C NULL character was removed.
-  !
-  IF ( buf1(1:8) .NE. bufr1_lg(1:8) .AND. bufr1_lg(9:10) .NE. '  ' ) THEN
-     PRINT *, 'larger read buffer differs from write buffer'
-     PRINT *,  buf1, ' and ',   bufr1_lg
-     STOP
-  ENDIF
-
-  ! 
-  ! ** Test reading a string that was created with a C program **
-  !
-
-!!$  CALL h5fopen_f(filename1, H5F_ACC_RDONLY_F, file_id1, errcode)
-!!$
-!!$  CALL h5ltget_attribute_string_f(file_id1, "/", "attr5", bufr_c, errcode)
-!!$  !
-!!$  ! compare read and write buffers.
-!!$  !
-!!$  IF ( bufr_c .NE. buf_c ) THEN
-!!$     PRINT *, 'read buffer differs from write buffer'
-!!$     PRINT *,  bufr1, ' and ',  buf_c 
-!!$     STOP
-!!$  ENDIF
-!!$  !
-!!$  ! read attribute into a fortran character buf that is larger then buf_c.
-!!$  !
-!!$  CALL h5ltget_attribute_string_f(file_id1, "/", "attr5", bufr_c_lg, errcode)
-!!$
-!!$  !
-!!$  ! compare read and write buffers, make sure C NULL character was removed.
-!!$  !
-!!$  IF ( buf_c(1:16) .NE. bufr_c_lg(1:16) .AND. bufr_c_lg(17:18) .NE. '  ' ) THEN
-!!$     PRINT *, 'larger read buffer differs from write buffer'
-!!$     PRINT *,  buf_c, ' and ',  bufr_c_lg 
-!!$     STOP
-!!$  ENDIF  
-
-!!$  CALL h5fclose_f(file_id1,  errcode)
-
-  CALL passed()
-
-  !-------------------------------------------------------------------------
-  ! get attribute rank
-  !-------------------------------------------------------------------------
-
-  CALL test_begin(' Get attribute rank/info        ')
-
-
-  CALL h5ltget_attribute_ndims_f(file_id,dsetname1,attrname2,rankr,errcode)
-
-  IF ( rankr .NE. 1 ) THEN
-     PRINT *, 'h5ltget_attribute_ndims_f return error'
-     STOP
-  ENDIF
-
-
-  CALL h5ltget_attribute_info_f(file_id,dsetname1,attrname2,dimsr,type_class,type_size,errcode)
-
-  !
-  ! compare dimensions
-  !
-  DO i = 1, rank
-     IF ( dimsr(i) .NE. dims(i) ) THEN
-        PRINT *, 'dimensions differ '
-        STOP
-     ENDIF
-  END DO
-
-
-  !
-  ! Close the file.
-  !
-  CALL h5fclose_f(file_id, errcode)
-  !
-  ! Close FORTRAN predefined datatypes.
-  !
-  CALL h5close_f(errcode)
-
-  CALL passed()
-  !
-  ! end function.
-  !
-END SUBROUTINE test_attributes
-
-
-
-
-
-
-!-------------------------------------------------------------------------
-! test_begin
-!-------------------------------------------------------------------------
-
-SUBROUTINE test_begin(string)
-  CHARACTER(LEN=*), INTENT(IN) :: string
-  WRITE(*, fmt = '(14a)', advance = 'no') string
-  WRITE(*, fmt = '(40x,a)', advance = 'no') ' '
-END SUBROUTINE test_begin
-
-!-------------------------------------------------------------------------
-! passed
-!-------------------------------------------------------------------------
-
-SUBROUTINE passed()
-  WRITE(*, fmt = '(6a)')  'PASSED'
-END SUBROUTINE passed
diff --git a/hl/fortran/test/tsttable.F90 b/hl/fortran/test/tsttable.F90
new file mode 100644
index 0000000..74029a5
--- /dev/null
+++ b/hl/fortran/test/tsttable.F90
@@ -0,0 +1,534 @@
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!   Copyright by The HDF Group.                                               *
+!   Copyright by the Board of Trustees of the University of Illinois.         *
+!   All rights reserved.                                                      *
+!                                                                             *
+!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
+!   terms governing use, modification, and redistribution, is contained in    *
+!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
+!   of the source code distribution tree; Copyright.html can be found at the  *
+!   root level of an installed copy of the electronic HDF5 document set and   *
+!   is linked from the top-level documents page.  It can also be found at     *
+!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+!   access to either file, you may request a copy from help at hdfgroup.org.     *
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+!
+!
+! This file contains the FORTRAN90 tests for H5LT
+!
+#include <H5config_f.inc>
+
+PROGRAM table_test
+
+  CALL test_table1()
+
+END PROGRAM table_test
+
+
+!-------------------------------------------------------------------------
+! test_table1
+!-------------------------------------------------------------------------
+
+SUBROUTINE test_table1()
+
+  USE H5TB ! module of H5TB
+  USE HDF5 ! module of HDF5 library
+
+  IMPLICIT NONE
+
+  CHARACTER(len=8), PARAMETER :: filename = "f1tab.h5"   ! File name
+  CHARACTER(LEN=5), PARAMETER :: dsetname1 = "dset1"     ! Dataset name
+  INTEGER(HID_T) :: file_id                              ! File identifier
+  INTEGER(HSIZE_T), PARAMETER :: nfields  = 4            ! nfields
+  INTEGER(HSIZE_T), PARAMETER :: nrecords = 5            ! nrecords
+  CHARACTER(LEN=10),DIMENSION(1:nfields) :: field_names  ! field names
+  INTEGER(SIZE_T),  DIMENSION(1:nfields) :: field_offset ! field offset
+  INTEGER(HID_T),   DIMENSION(1:nfields) :: field_types  ! field types
+  INTEGER(HSIZE_T), PARAMETER  :: chunk_size = 5         ! chunk size
+  INTEGER, PARAMETER :: compress = 0                     ! compress
+  INTEGER            :: errcode = 0                      ! Error flag
+  INTEGER            :: i                                ! general purpose integer
+  INTEGER(SIZE_T)    :: type_size                        ! Size of the datatype
+  INTEGER(SIZE_T)    :: type_sizec                       ! Size of the character datatype
+  INTEGER(SIZE_T)    :: type_sizei                       ! Size of the integer datatype
+  INTEGER(SIZE_T)    :: type_sized                       ! Size of the double precision datatype
+  INTEGER(SIZE_T)    :: type_sizer                       ! Size of the real datatype
+  INTEGER(HID_T)     :: type_id_c                        ! Memory datatype identifier (for character field)
+  INTEGER(SIZE_T)    :: offset                           ! Member's offset
+  INTEGER(HSIZE_T)   :: start = 0                        ! start record
+  INTEGER, DIMENSION(nrecords) :: bufi                   ! Data buffer
+  INTEGER, DIMENSION(nrecords) :: bufir                  ! Data buffer
+  REAL, DIMENSION(nrecords) :: bufr                      ! Data buffer
+  REAL, DIMENSION(nrecords) :: bufrr                     ! Data buffer
+  DOUBLE PRECISION, DIMENSION(nrecords) :: bufd          ! Data buffer
+  DOUBLE PRECISION, DIMENSION(nrecords) :: bufdr         ! Data buffer
+  CHARACTER(LEN=2), DIMENSION(nrecords), PARAMETER :: bufs = (/"AB","CD","EF","GH","IJ"/) ! Data buffer
+  CHARACTER(LEN=2), DIMENSION(nrecords) :: bufsr         ! Data buffer
+  INTEGER(HSIZE_T) :: nfieldsr                           ! nfields
+  INTEGER(HSIZE_T) :: nrecordsr                          ! nrecords
+  CHARACTER(LEN=9), DIMENSION(1:nfields) :: field_namesr  ! field names
+  INTEGER(SIZE_T),  DIMENSION(1:nfields) :: field_offsetr ! field offset
+  INTEGER(SIZE_T),  DIMENSION(1:nfields) :: field_sizesr  ! field sizes
+  INTEGER(SIZE_T)  :: type_sizeout = 0                    ! size of the datatype
+  INTEGER :: maxlen = 0                                   ! max chararter length of a field name
+  INTEGER :: Cs_sizeof_double = H5_SIZEOF_DOUBLE          ! C's sizeof double
+  INTEGER :: SIZEOF_X
+  LOGICAL :: Exclude_double
+
+  ! Find size of DOUBLE PRECISION
+#ifdef H5_FORTRAN_HAVE_STORAGE_SIZE
+  SIZEOF_X = storage_size(bufd(1))/storage_size(c_char_'a')
+#else
+  SIZEOF_X = SIZEOF(bufd(1))
+#endif
+
+  ! If Fortran DOUBLE PRECISION and C DOUBLE sizeofs don't match then disable 
+  ! creating a DOUBLE RECISION field, and instead create a REAL field. This
+  ! is needed to handle when DOUBLE PRECISION is promoted via a compiler flag.
+  Exclude_double = .FALSE.
+  IF(Cs_sizeof_double.NE.SIZEOF_X)THEN
+     Exclude_double = .TRUE.
+  ENDIF
+
+  !
+  ! Initialize the data arrays.
+  !
+  DO i = 1, nrecords
+     bufi(i) = i
+     bufr(i) = i
+     bufd(i) = i
+  END DO
+
+  !
+  ! Initialize FORTRAN predefined datatypes.
+  !
+  CALL h5open_f(errcode)
+
+  !
+  ! Create a new file using default properties.
+  !
+  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, errcode)
+
+
+  !-------------------------------------------------------------------------
+  ! make table
+  ! initialize the table parameters
+  !-------------------------------------------------------------------------
+
+  field_names(1) = "field1"
+  field_names(2) = "field2a"
+  field_names(3) = "field3ab"
+  field_names(4) = "field4abc"
+
+  !
+  ! calculate total size by calculating sizes of each member
+  !
+  CALL h5tcopy_f(H5T_NATIVE_CHARACTER, type_id_c, errcode)
+  type_size = 2
+  CALL h5tset_size_f(type_id_c, type_size, errcode)
+  CALL h5tget_size_f(type_id_c, type_sizec, errcode)
+  CALL h5tget_size_f(H5T_NATIVE_INTEGER, type_sizei, errcode)
+  IF(exclude_double)THEN
+     CALL h5tget_size_f(H5T_NATIVE_REAL, type_sized, errcode)
+  ELSE
+     CALL h5tget_size_f(H5T_NATIVE_DOUBLE, type_sized, errcode)
+  ENDIF
+  CALL h5tget_size_f(H5T_NATIVE_REAL, type_sizer, errcode)
+  type_size = type_sizec + type_sizei + type_sized + type_sizer
+
+  !
+  ! type ID's
+  !
+  field_types(1) = type_id_c
+  field_types(2) = H5T_NATIVE_INTEGER
+  IF(exclude_double)THEN
+     field_types(3) = H5T_NATIVE_REAL
+  ELSE
+     field_types(3) = H5T_NATIVE_DOUBLE
+  ENDIF
+  field_types(4) = H5T_NATIVE_REAL
+
+  !
+  ! offsets
+  !
+  offset = 0
+  field_offset(1) = offset
+  offset = offset + type_sizec ! Offset of the second memeber is 2
+  field_offset(2) = offset
+  offset = offset + type_sizei ! Offset of the second memeber is 6
+  field_offset(3) = offset
+  offset = offset + type_sized ! Offset of the second memeber is 14
+  field_offset(4) = offset
+
+  !-------------------------------------------------------------------------
+  ! make table
+  !-------------------------------------------------------------------------
+
+  CALL test_begin(' Make table                     ')
+
+  CALL h5tbmake_table_f(dsetname1,&
+       file_id,&
+       dsetname1,&
+       nfields,&
+       nrecords,&
+       type_size,&
+       field_names,&
+       field_offset,&
+       field_types,&
+       chunk_size,&
+       compress,&
+       errcode )
+
+  CALL passed()
+
+
+  !-------------------------------------------------------------------------
+  ! write field
+  !-------------------------------------------------------------------------
+
+  CALL test_begin(' Read/Write field by name       ')
+
+  CALL h5tbwrite_field_name_f(file_id,dsetname1,field_names(1),start,nrecords,type_sizec,&
+       bufs,errcode)
+
+  CALL h5tbwrite_field_name_f(file_id,dsetname1,field_names(2),start,nrecords,type_sizei,&
+       bufi,errcode)
+  IF(exclude_double)THEN
+     CALL h5tbwrite_field_name_f(file_id,dsetname1,field_names(3),start,nrecords,type_sized,&
+          bufr,errcode)
+  ELSE
+     CALL h5tbwrite_field_name_f(file_id,dsetname1,field_names(3),start,nrecords,type_sized,&
+          bufd,errcode)
+  ENDIF
+
+  CALL h5tbwrite_field_name_f(file_id,dsetname1,field_names(4),start,nrecords,type_sizer,&
+       bufr,errcode)
+
+  !-------------------------------------------------------------------------
+  ! read field
+  !-------------------------------------------------------------------------
+
+  ! Read an invalid field, should fail
+  CALL h5tbread_field_name_f(file_id,dsetname1,'DoesNotExist',start,nrecords,type_sizec,&
+       bufsr,errcode)
+
+  IF(errcode.GE.0)THEN
+     PRINT *, 'error in h5tbread_field_name_f'
+     CALL h5fclose_f(file_id, errcode)
+     CALL h5close_f(errcode)
+     STOP
+  ENDIF
+
+  ! Read a valid field, should pass
+  CALL h5tbread_field_name_f(file_id,dsetname1,field_names(1),start,nrecords,type_sizec,&
+       bufsr,errcode)
+  IF(errcode.LT.0)THEN
+     PRINT *, 'error in h5tbread_field_name_f'
+     CALL h5fclose_f(file_id, errcode)
+     CALL h5close_f(errcode)
+     STOP
+  ENDIF
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, nrecords
+     IF ( bufsr(i) .NE. bufs(i) ) THEN
+        PRINT *, 'read buffer differs from write buffer'
+        PRINT *,  bufsr(i), ' and ',   bufs(i)
+        STOP
+     ENDIF
+  END DO
+
+  CALL h5tbread_field_name_f(file_id,dsetname1,field_names(2),start,nrecords,type_sizei,&
+       bufir,errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, nrecords
+     IF ( bufir(i) .NE. bufi(i) ) THEN
+        PRINT *, 'read buffer differs from write buffer'
+        PRINT *,  bufir(i), ' and ',   bufi(i)
+        STOP
+     ENDIF
+  END DO
+
+  IF(exclude_double)THEN
+
+     CALL h5tbread_field_name_f(file_id,dsetname1,field_names(3),start,nrecords,type_sized,&
+          bufrr,errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+     DO i = 1, nrecords
+        IF ( bufrr(i) .NE. bufr(i) ) THEN
+           PRINT *, 'read buffer differs from write buffer'
+           PRINT *,  bufrr(i), ' and ',   bufr(i)
+           STOP
+        ENDIF
+     END DO
+
+  ELSE
+     CALL h5tbread_field_name_f(file_id,dsetname1,field_names(3),start,nrecords,type_sized,&
+          bufdr,errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+     DO i = 1, nrecords
+        IF ( bufdr(i) .NE. bufd(i) ) THEN
+           PRINT *, 'read buffer differs from write buffer'
+           PRINT *,  bufdr(i), ' and ',   bufd(i)
+           STOP
+        ENDIF
+     END DO
+  ENDIF
+
+
+
+  CALL h5tbread_field_name_f(file_id,dsetname1,field_names(4),start,nrecords,type_sizer,&
+       bufrr,errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, nrecords
+     IF ( bufrr(i) .NE. bufr(i) ) THEN
+        PRINT *, 'read buffer differs from write buffer'
+        PRINT *,  bufrr(i), ' and ',   bufr(i)
+        STOP
+     ENDIF
+  END DO
+
+  CALL passed()
+
+
+  !-------------------------------------------------------------------------
+  ! write field
+  !-------------------------------------------------------------------------
+
+  CALL test_begin(' Read/Write field by index      ')
+
+  CALL h5tbwrite_field_index_f(file_id,dsetname1,1,start,nrecords,type_sizec,&
+       bufs,errcode)
+
+  CALL h5tbwrite_field_index_f(file_id,dsetname1,2,start,nrecords,type_sizei,&
+       bufi,errcode)
+
+  IF(exclude_double)THEN
+     CALL h5tbwrite_field_index_f(file_id,dsetname1,3,start,nrecords,type_sized,&
+          bufr,errcode)
+  ELSE
+     CALL h5tbwrite_field_index_f(file_id,dsetname1,3,start,nrecords,type_sized,&
+          bufd,errcode)
+  ENDIF
+
+  CALL h5tbwrite_field_index_f(file_id,dsetname1,4,start,nrecords,type_sizer,&
+       bufr,errcode)
+
+
+
+  !-------------------------------------------------------------------------
+  ! read field
+  !-------------------------------------------------------------------------
+
+  CALL h5tbread_field_index_f(file_id,dsetname1,1,start,nrecords,type_sizec,&
+       bufsr,errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, nrecords
+     IF ( bufsr(i) .NE. bufs(i) ) THEN
+        PRINT *, 'read buffer differs from write buffer'
+        PRINT *,  bufsr(i), ' and ',   bufs(i)
+        STOP
+     ENDIF
+  END DO
+
+  CALL h5tbread_field_index_f(file_id,dsetname1,2,start,nrecords,type_sizei,&
+       bufir,errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, nrecords
+     IF ( bufir(i) .NE. bufi(i) ) THEN
+        PRINT *, 'read buffer differs from write buffer'
+        PRINT *,  bufir(i), ' and ',   bufi(i)
+        STOP
+     ENDIF
+  END DO
+  IF(exclude_double)THEN
+     CALL h5tbread_field_index_f(file_id,dsetname1,3,start,nrecords,type_sized,&
+          bufrr,errcode)
+
+     !
+     ! compare read and write buffers.
+     !
+     DO i = 1, nrecords
+        IF ( bufrr(i) .NE. bufr(i) ) THEN
+           PRINT *, 'read buffer differs from write buffer'
+           PRINT *,  bufrr(i), ' and ',   bufr(i)
+           STOP
+        ENDIF
+     END DO
+  ELSE
+     CALL h5tbread_field_index_f(file_id,dsetname1,3,start,nrecords,type_sized,&
+          bufdr,errcode)
+
+     !
+     ! compare read and write buffers.
+     !
+     DO i = 1, nrecords
+        IF ( bufdr(i) .NE. bufd(i) ) THEN
+           PRINT *, 'read buffer differs from write buffer'
+           PRINT *,  bufdr(i), ' and ',   bufd(i)
+           STOP
+        ENDIF
+     END DO
+  ENDIF
+
+  CALL h5tbread_field_index_f(file_id,dsetname1,4,start,nrecords,type_sizer,&
+       bufrr,errcode)
+
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, nrecords
+     IF ( bufrr(i) .NE. bufr(i) ) THEN
+        PRINT *, 'read buffer differs from write buffer'
+        PRINT *,  bufrr(i), ' and ',   bufr(i)
+        STOP
+     ENDIF
+  END DO
+
+
+  CALL passed()
+
+
+  !-------------------------------------------------------------------------
+  ! Insert field
+  ! we insert a field callsed "field5" with the same type and buffer as field 4 (Real)
+  !-------------------------------------------------------------------------
+
+  CALL test_begin(' Insert field                   ')
+
+  CALL h5tbinsert_field_f(file_id,dsetname1,"field5",field_types(4),4,bufr,errcode)
+  CALL h5tbread_field_index_f(file_id,dsetname1,5,start,nrecords,type_sizer,&
+       bufrr,errcode)
+  !
+  ! compare read and write buffers.
+  !
+  DO i = 1, nrecords
+     IF ( bufrr(i) .NE. bufr(i) ) THEN
+        PRINT *, 'read buffer differs from write buffer'
+        PRINT *,  bufrr(i), ' and ',   bufr(i)
+        STOP
+     ENDIF
+  END DO
+
+
+  CALL passed()
+
+  !-------------------------------------------------------------------------
+  ! Delete field
+  !-------------------------------------------------------------------------
+
+  CALL test_begin(' Delete field                   ')
+
+  CALL h5tbdelete_field_f(file_id,dsetname1,"field4abc",errcode)
+
+  CALL passed()
+
+
+  !-------------------------------------------------------------------------
+  ! Gets the number of records and fields
+  !-------------------------------------------------------------------------
+
+  CALL test_begin(' Get table info                 ')
+
+  CALL h5tbget_table_info_f(file_id,dsetname1,nfieldsr,nrecordsr,errcode )
+
+  IF ( nfieldsr .NE. nfields .AND. nrecordsr .NE. nrecords ) THEN
+     PRINT *, 'h5tbget_table_info_f return error'
+     STOP
+  ENDIF
+
+  CALL passed()
+
+  !-------------------------------------------------------------------------
+  ! Get information about fields
+  !-------------------------------------------------------------------------
+
+  CALL test_begin(' Get fields info                ')
+
+  CALL h5tbget_field_info_f(file_id, dsetname1, nfields, field_namesr, field_sizesr,&
+       field_offsetr, type_sizeout, errcode, maxlen )
+
+  IF ( errcode.NE.0 ) THEN
+     WRITE(*,'(/,5X,"H5TBGET_FIELD_INFO_F: RETURN ERROR")')
+     STOP
+  ENDIF
+
+  ! "field4abc" was deleted and "field5" was added.
+  field_names(4) = "field5"
+
+  IF ( maxlen .NE. 8 ) THEN
+     WRITE(*,'(/,5X,"H5TBGET_FIELD_INFO_F: INCORRECT MAXIMUM CHARACTER LENGTH OF THE FIELD NAMES")')
+     WRITE(*,'(5X,"RETURNED VALUE = ", I0, ", CORRECT VALUE = ", I0)') maxlen, 8 
+     STOP
+  ENDIF
+
+  DO i = 1,  nfields
+     IF ( field_namesr(i) .NE. field_names(i)) THEN
+        WRITE(*,'(/,5X,"H5TBGET_FIELD_INFO_F: READ/WRITE FIELD NAMES DIFFER")')
+        WRITE(*,'(27X,A," AND ",A)') TRIM(field_namesr(i)), TRIM(field_names(i))
+        STOP
+     ENDIF
+  END DO
+
+  CALL passed()
+
+
+  !-------------------------------------------------------------------------
+  ! end
+  !-------------------------------------------------------------------------
+
+  !
+  ! Close the file.
+  !
+  CALL h5fclose_f(file_id, errcode)
+
+  !
+  ! Close FORTRAN predefined datatypes.
+  !
+  CALL h5close_f(errcode)
+
+  !
+  ! end function.
+  !
+END SUBROUTINE test_table1
+
+
+!-------------------------------------------------------------------------
+! test_begin
+!-------------------------------------------------------------------------
+
+SUBROUTINE test_begin(string)
+  CHARACTER(LEN=*), INTENT(IN) :: string
+  WRITE(*, fmt = '(14a)', advance = 'no') string
+  WRITE(*, fmt = '(40x,a)', advance = 'no') ' '
+END SUBROUTINE test_begin
+
+!-------------------------------------------------------------------------
+! passed
+!-------------------------------------------------------------------------
+
+SUBROUTINE passed()
+  WRITE(*, fmt = '(6a)')  'PASSED'
+END SUBROUTINE passed
+
+
diff --git a/hl/fortran/test/tsttable.f90 b/hl/fortran/test/tsttable.f90
deleted file mode 100644
index bb88abf..0000000
--- a/hl/fortran/test/tsttable.f90
+++ /dev/null
@@ -1,466 +0,0 @@
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!   Copyright by The HDF Group.                                               *
-!   Copyright by the Board of Trustees of the University of Illinois.         *
-!   All rights reserved.                                                      *
-!                                                                             *
-!   This file is part of HDF5.  The full HDF5 copyright notice, including     *
-!   terms governing use, modification, and redistribution, is contained in    *
-!   the files COPYING and Copyright.html.  COPYING can be found at the root   *
-!   of the source code distribution tree; Copyright.html can be found at the  *
-!   root level of an installed copy of the electronic HDF5 document set and   *
-!   is linked from the top-level documents page.  It can also be found at     *
-!   http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-!   access to either file, you may request a copy from help at hdfgroup.org.     *
-! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-!
-!
-! This file contains the FORTRAN90 tests for H5LT
-!
-
-PROGRAM table_test
-
-  CALL test_table1()
-
-
-END PROGRAM table_test
-
-
-!-------------------------------------------------------------------------
-! test_table1
-!-------------------------------------------------------------------------
-
-SUBROUTINE test_table1()
-
-  USE H5TB ! module of H5TB
-  USE HDF5 ! module of HDF5 library
-
-  IMPLICIT NONE
-
-  CHARACTER(len=8), PARAMETER :: filename = "f1tab.h5"   ! File name
-  CHARACTER(LEN=5), PARAMETER :: dsetname1 = "dset1"     ! Dataset name
-  INTEGER(HID_T) :: file_id                              ! File identifier
-  INTEGER(HSIZE_T), PARAMETER :: nfields  = 4            ! nfields
-  INTEGER(HSIZE_T), PARAMETER :: nrecords = 5            ! nrecords
-  CHARACTER(LEN=10),DIMENSION(1:nfields) :: field_names  ! field names
-  INTEGER(SIZE_T),  DIMENSION(1:nfields) :: field_offset ! field offset
-  INTEGER(HID_T),   DIMENSION(1:nfields) :: field_types  ! field types
-  INTEGER(HSIZE_T), PARAMETER  :: chunk_size = 5         ! chunk size
-  INTEGER, PARAMETER :: compress = 0                     ! compress
-  INTEGER            :: errcode = 0                      ! Error flag
-  INTEGER            :: i                                ! general purpose integer
-  INTEGER(SIZE_T)    :: type_size                        ! Size of the datatype
-  INTEGER(SIZE_T)    :: type_sizec                       ! Size of the character datatype
-  INTEGER(SIZE_T)    :: type_sizei                       ! Size of the integer datatype
-  INTEGER(SIZE_T)    :: type_sized                       ! Size of the double precision datatype
-  INTEGER(SIZE_T)    :: type_sizer                       ! Size of the real datatype
-  INTEGER(HID_T)     :: type_id_c                        ! Memory datatype identifier (for character field)
-  INTEGER(SIZE_T)    :: offset                           ! Member's offset
-  INTEGER(HSIZE_T)   :: start = 0                        ! start record
-  INTEGER, DIMENSION(nrecords) :: bufi                   ! Data buffer
-  INTEGER, DIMENSION(nrecords) :: bufir                  ! Data buffer
-  REAL, DIMENSION(nrecords) :: bufr                      ! Data buffer
-  REAL, DIMENSION(nrecords) :: bufrr                     ! Data buffer
-  DOUBLE PRECISION, DIMENSION(nrecords) :: bufd          ! Data buffer
-  DOUBLE PRECISION, DIMENSION(nrecords) :: bufdr         ! Data buffer
-  CHARACTER(LEN=2), DIMENSION(nrecords), PARAMETER :: bufs = (/"AB","CD","EF","GH","IJ"/) ! Data buffer
-  CHARACTER(LEN=2), DIMENSION(nrecords) :: bufsr         ! Data buffer
-  INTEGER(HSIZE_T) :: nfieldsr                           ! nfields
-  INTEGER(HSIZE_T) :: nrecordsr                          ! nrecords
-  CHARACTER(LEN=9), DIMENSION(1:nfields) :: field_namesr  ! field names
-  INTEGER(SIZE_T),  DIMENSION(1:nfields) :: field_offsetr ! field offset
-  INTEGER(SIZE_T),  DIMENSION(1:nfields) :: field_sizesr  ! field sizes
-  INTEGER(SIZE_T)  :: type_sizeout = 0                    ! size of the datatype
-  INTEGER :: maxlen = 0                                   ! max chararter length of a field name
-
-
-  !
-  ! Initialize the data arrays.
-  !
-  DO i = 1, nrecords
-     bufi(i) = i
-     bufr(i) = i
-     bufd(i) = i
-  END DO
-
-  !
-  ! Initialize FORTRAN predefined datatypes.
-  !
-  CALL h5open_f(errcode)
-
-  !
-  ! Create a new file using default properties.
-  !
-  CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, errcode)
-
-
-  !-------------------------------------------------------------------------
-  ! make table
-  ! initialize the table parameters
-  !-------------------------------------------------------------------------
-
-  field_names(1) = "field1"
-  field_names(2) = "field2a"
-  field_names(3) = "field3ab"
-  field_names(4) = "field4abc"
-
-  !
-  ! calculate total size by calculating sizes of each member
-  !
-  CALL h5tcopy_f(H5T_NATIVE_CHARACTER, type_id_c, errcode)
-  type_size = 2
-  CALL h5tset_size_f(type_id_c, type_size, errcode)
-  CALL h5tget_size_f(type_id_c, type_sizec, errcode)
-  CALL h5tget_size_f(H5T_NATIVE_INTEGER, type_sizei, errcode)
-  CALL h5tget_size_f(H5T_NATIVE_DOUBLE, type_sized, errcode)
-  CALL h5tget_size_f(H5T_NATIVE_REAL, type_sizer, errcode)
-  type_size = type_sizec + type_sizei + type_sized + type_sizer
-
-  !
-  ! type ID's
-  !
-  field_types(1) = type_id_c
-  field_types(2) = H5T_NATIVE_INTEGER
-  field_types(3) = H5T_NATIVE_DOUBLE
-  field_types(4) = H5T_NATIVE_REAL
-
-  !
-  ! offsets
-  !
-  offset = 0
-  field_offset(1) = offset
-  offset = offset + type_sizec ! Offset of the second memeber is 2
-  field_offset(2) = offset
-  offset = offset + type_sizei ! Offset of the second memeber is 6
-  field_offset(3) = offset
-  offset = offset + type_sized ! Offset of the second memeber is 14
-  field_offset(4) = offset
-
-  !-------------------------------------------------------------------------
-  ! make table
-  !-------------------------------------------------------------------------
-
-  CALL test_begin(' Make table                     ')
-
-  CALL h5tbmake_table_f(dsetname1,&
-       file_id,&
-       dsetname1,&
-       nfields,&
-       nrecords,&
-       type_size,&
-       field_names,&
-       field_offset,&
-       field_types,&
-       chunk_size,&
-       compress,&
-       errcode )
-
-  CALL passed()
-
-
-  !-------------------------------------------------------------------------
-  ! write field
-  !-------------------------------------------------------------------------
-
-  CALL test_begin(' Read/Write field by name       ')
-
-  CALL h5tbwrite_field_name_f(file_id,dsetname1,field_names(1),start,nrecords,type_sizec,&
-       bufs,errcode)
-
-  CALL h5tbwrite_field_name_f(file_id,dsetname1,field_names(2),start,nrecords,type_sizei,&
-       bufi,errcode)
-
-  CALL h5tbwrite_field_name_f(file_id,dsetname1,field_names(3),start,nrecords,type_sized,&
-       bufd,errcode)
-
-  CALL h5tbwrite_field_name_f(file_id,dsetname1,field_names(4),start,nrecords,type_sizer,&
-       bufr,errcode)
-
-  !-------------------------------------------------------------------------
-  ! read field
-  !-------------------------------------------------------------------------
-
-  ! Read an invalid field, should fail
-  CALL h5tbread_field_name_f(file_id,dsetname1,'DoesNotExist',start,nrecords,type_sizec,&
-       bufsr,errcode)
-
-  IF(errcode.GE.0)THEN
-     PRINT *, 'error in h5tbread_field_name_f'
-     CALL h5fclose_f(file_id, errcode)
-     CALL h5close_f(errcode)
-     STOP
-  ENDIF
-
-  ! Read a valid field, should pass
-  CALL h5tbread_field_name_f(file_id,dsetname1,field_names(1),start,nrecords,type_sizec,&
-       bufsr,errcode)
-  IF(errcode.LT.0)THEN
-     PRINT *, 'error in h5tbread_field_name_f'
-     CALL h5fclose_f(file_id, errcode)
-     CALL h5close_f(errcode)
-     STOP
-  ENDIF
-
-  !
-  ! compare read and write buffers.
-  !
-  DO i = 1, nrecords
-     IF ( bufsr(i) .NE. bufs(i) ) THEN
-        PRINT *, 'read buffer differs from write buffer'
-        PRINT *,  bufsr(i), ' and ',   bufs(i)
-        STOP
-     ENDIF
-  END DO
-
-  CALL h5tbread_field_name_f(file_id,dsetname1,field_names(2),start,nrecords,type_sizei,&
-       bufir,errcode)
-
-
-  !
-  ! compare read and write buffers.
-  !
-  DO i = 1, nrecords
-     IF ( bufir(i) .NE. bufi(i) ) THEN
-        PRINT *, 'read buffer differs from write buffer'
-        PRINT *,  bufir(i), ' and ',   bufi(i)
-        STOP
-     ENDIF
-  END DO
-
-  CALL h5tbread_field_name_f(file_id,dsetname1,field_names(3),start,nrecords,type_sized,&
-       bufdr,errcode)
-
-  !
-  ! compare read and write buffers.
-  !
-  DO i = 1, nrecords
-     IF ( bufdr(i) .NE. bufd(i) ) THEN
-        PRINT *, 'read buffer differs from write buffer'
-        PRINT *,  bufdr(i), ' and ',   bufd(i)
-        STOP
-     ENDIF
-  END DO
-
-  CALL h5tbread_field_name_f(file_id,dsetname1,field_names(4),start,nrecords,type_sizer,&
-       bufrr,errcode)
-
-  !
-  ! compare read and write buffers.
-  !
-  DO i = 1, nrecords
-     IF ( bufrr(i) .NE. bufr(i) ) THEN
-        PRINT *, 'read buffer differs from write buffer'
-        PRINT *,  bufrr(i), ' and ',   bufr(i)
-        STOP
-     ENDIF
-  END DO
-
-
-  CALL passed()
-
-  !-------------------------------------------------------------------------
-  ! write field
-  !-------------------------------------------------------------------------
-
-  CALL test_begin(' Read/Write field by index      ')
-
-  CALL h5tbwrite_field_index_f(file_id,dsetname1,1,start,nrecords,type_sizec,&
-       bufs,errcode)
-
-  CALL h5tbwrite_field_index_f(file_id,dsetname1,2,start,nrecords,type_sizei,&
-       bufi,errcode)
-
-  CALL h5tbwrite_field_index_f(file_id,dsetname1,3,start,nrecords,type_sized,&
-       bufd,errcode)
-
-  CALL h5tbwrite_field_index_f(file_id,dsetname1,4,start,nrecords,type_sizer,&
-       bufr,errcode)
-
-
-
-  !-------------------------------------------------------------------------
-  ! read field
-  !-------------------------------------------------------------------------
-
-  CALL h5tbread_field_index_f(file_id,dsetname1,1,start,nrecords,type_sizec,&
-       bufsr,errcode)
-
-  !
-  ! compare read and write buffers.
-  !
-  DO i = 1, nrecords
-     IF ( bufsr(i) .NE. bufs(i) ) THEN
-        PRINT *, 'read buffer differs from write buffer'
-        PRINT *,  bufsr(i), ' and ',   bufs(i)
-        STOP
-     ENDIF
-  END DO
-
-  CALL h5tbread_field_index_f(file_id,dsetname1,2,start,nrecords,type_sizei,&
-       bufir,errcode)
-
-  !
-  ! compare read and write buffers.
-  !
-  DO i = 1, nrecords
-     IF ( bufir(i) .NE. bufi(i) ) THEN
-        PRINT *, 'read buffer differs from write buffer'
-        PRINT *,  bufir(i), ' and ',   bufi(i)
-        STOP
-     ENDIF
-  END DO
-
-  CALL h5tbread_field_index_f(file_id,dsetname1,3,start,nrecords,type_sized,&
-       bufdr,errcode)
-
-  !
-  ! compare read and write buffers.
-  !
-  DO i = 1, nrecords
-     IF ( bufdr(i) .NE. bufd(i) ) THEN
-        PRINT *, 'read buffer differs from write buffer'
-        PRINT *,  bufdr(i), ' and ',   bufd(i)
-        STOP
-     ENDIF
-  END DO
-
-  CALL h5tbread_field_index_f(file_id,dsetname1,4,start,nrecords,type_sizer,&
-       bufrr,errcode)
-
-  !
-  ! compare read and write buffers.
-  !
-  DO i = 1, nrecords
-     IF ( bufrr(i) .NE. bufr(i) ) THEN
-        PRINT *, 'read buffer differs from write buffer'
-        PRINT *,  bufrr(i), ' and ',   bufr(i)
-        STOP
-     ENDIF
-  END DO
-
-
-  CALL passed()
-
-
-  !-------------------------------------------------------------------------
-  ! Insert field
-  ! we insert a field callsed "field5" with the same type and buffer as field 4 (Real)
-  !-------------------------------------------------------------------------
-
-  CALL test_begin(' Insert field                   ')
-
-  CALL h5tbinsert_field_f(file_id,dsetname1,"field5",field_types(4),4,bufr,errcode)
-  CALL h5tbread_field_index_f(file_id,dsetname1,5,start,nrecords,type_sizer,&
-       bufrr,errcode)
-  !
-  ! compare read and write buffers.
-  !
-  DO i = 1, nrecords
-     IF ( bufrr(i) .NE. bufr(i) ) THEN
-        PRINT *, 'read buffer differs from write buffer'
-        PRINT *,  bufrr(i), ' and ',   bufr(i)
-        STOP
-     ENDIF
-  END DO
-
-
-  CALL passed()
-
-  !-------------------------------------------------------------------------
-  ! Delete field
-  !-------------------------------------------------------------------------
-
-  CALL test_begin(' Delete field                   ')
-
-  CALL h5tbdelete_field_f(file_id,dsetname1,"field4abc",errcode)
-
-  CALL passed()
-
-
-  !-------------------------------------------------------------------------
-  ! Gets the number of records and fields
-  !-------------------------------------------------------------------------
-
-  CALL test_begin(' Get table info                 ')
-
-  CALL h5tbget_table_info_f(file_id,dsetname1,nfieldsr,nrecordsr,errcode )
-
-  IF ( nfieldsr .NE. nfields .AND. nrecordsr .NE. nrecords ) THEN
-     PRINT *, 'h5tbget_table_info_f return error'
-     STOP
-  ENDIF
-
-  CALL passed()
-
-  !-------------------------------------------------------------------------
-  ! Get information about fields
-  !-------------------------------------------------------------------------
-
-  CALL test_begin(' Get fields info                ')
-
-  CALL h5tbget_field_info_f(file_id, dsetname1, nfields, field_namesr, field_sizesr,&
-       field_offsetr, type_sizeout, errcode, maxlen )
-
-  IF ( errcode.NE.0 ) THEN
-     WRITE(*,'(/,5X,"H5TBGET_FIELD_INFO_F: RETURN ERROR")')
-     STOP
-  ENDIF
-
-  ! "field4abc" was deleted and "field5" was added.
-  field_names(4) = "field5"
-
-  IF ( maxlen .NE. 8 ) THEN
-     WRITE(*,'(/,5X,"H5TBGET_FIELD_INFO_F: INCORRECT MAXIMUM CHARACTER LENGTH OF THE FIELD NAMES")')
-     WRITE(*,'(5X,"RETURNED VALUE = ", I0, ", CORRECT VALUE = ", I0)') maxlen, 8 
-     STOP
-  ENDIF
-
-  DO i = 1,  nfields
-     IF ( field_namesr(i) .NE. field_names(i)) THEN
-        WRITE(*,'(/,5X,"H5TBGET_FIELD_INFO_F: READ/WRITE FIELD NAMES DIFFER")')
-        WRITE(*,'(27X,A," AND ",A)') TRIM(field_namesr(i)), TRIM(field_names(i))
-        STOP
-     ENDIF
-  END DO
-
-  CALL passed()
-
-
-  !-------------------------------------------------------------------------
-  ! end
-  !-------------------------------------------------------------------------
-
-  !
-  ! Close the file.
-  !
-  CALL h5fclose_f(file_id, errcode)
-
-  !
-  ! Close FORTRAN predefined datatypes.
-  !
-  CALL h5close_f(errcode)
-
-  !
-  ! end function.
-  !
-END SUBROUTINE test_table1
-
-
-!-------------------------------------------------------------------------
-! test_begin
-!-------------------------------------------------------------------------
-
-SUBROUTINE test_begin(string)
-  CHARACTER(LEN=*), INTENT(IN) :: string
-  WRITE(*, fmt = '(14a)', advance = 'no') string
-  WRITE(*, fmt = '(40x,a)', advance = 'no') ' '
-END SUBROUTINE test_begin
-
-!-------------------------------------------------------------------------
-! passed
-!-------------------------------------------------------------------------
-
-SUBROUTINE passed()
-  WRITE(*, fmt = '(6a)')  'PASSED'
-END SUBROUTINE passed
-
-
diff --git a/hl/src/CMakeLists.txt b/hl/src/CMakeLists.txt
index 9673050..472f1ee 100644
--- a/hl/src/CMakeLists.txt
+++ b/hl/src/CMakeLists.txt
@@ -1,7 +1,6 @@
 cmake_minimum_required (VERSION 3.1.0)
 PROJECT (HDF5_HL_SRC)
 
-
 #-----------------------------------------------------------------------------
 # List Source files
 #-----------------------------------------------------------------------------
@@ -17,6 +16,7 @@ set (HL_SRCS
 )
 
 set (HL_HEADERS
+    ${HL_HEADERS}
     ${HDF5_HL_SRC_SOURCE_DIR}/H5DOpublic.h
     ${HDF5_HL_SRC_SOURCE_DIR}/H5DSpublic.h
     ${HDF5_HL_SRC_SOURCE_DIR}/H5IMpublic.h
@@ -42,7 +42,7 @@ if (BUILD_SHARED_LIBS)
   add_library (${HDF5_HL_LIBSH_TARGET} SHARED ${HL_SRCS} ${HL_HEADERS})
   TARGET_C_PROPERTIES (${HDF5_HL_LIBSH_TARGET} SHARED " " " ")
   target_link_libraries (${HDF5_HL_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
-  H5_SET_LIB_OPTIONS (${HDF5_HL_LIBSH_TARGET} ${HDF5_HL_LIB_NAME} SHARED ${HDF5_HL_PACKAGE_SOVERSION})
+  H5_SET_LIB_OPTIONS (${HDF5_HL_LIBSH_TARGET} ${HDF5_HL_LIB_NAME} SHARED)
   set_target_properties (${HDF5_HL_LIBSH_TARGET} PROPERTIES
       FOLDER libraries/hl
       COMPILE_DEFINITIONS "H5_BUILT_AS_DYNAMIC_LIB"
diff --git a/hl/src/H5DO.c b/hl/src/H5DO.c
index 99dbd93..3b80eba 100644
--- a/hl/src/H5DO.c
+++ b/hl/src/H5DO.c
@@ -97,3 +97,187 @@ done:
     return(ret_value);
 } /* end H5DOwrite_chunk() */
 
+

+/*
+ * Function:	H5DOappend()
+ *
+ * Purpose:     To append elements to a dataset.
+ *		axis: the dataset dimension (zero-based) for the append
+ *		extension: the # of elements to append for the axis-th dimension
+ *		memtype: the datatype
+ *		buf: buffer with data for the append
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; Jan 2014
+ *
+ * Note:
+ * 	This routine is copied from the fast forward feature branch: features/hdf5_ff
+ *	src/H5FF.c:H5DOappend() with the following modifications:
+ * 	1) Remove and replace macro calls such as
+ *		FUNC_ENTER_API, H5TRACE, HGOTO_ERROR 
+ * 	   accordingly because hl does not have these macros
+ *	2) Replace H5I_get_type() by H5Iget_type()
+ *	3) Replace H5P_isa_class() by H5Pisa_class()
+ *	4) Fix a bug in the following: replace extension by size[axis]
+ *		if(extension < old_size) {
+ *		  ret_value = FAIL;
+ *		  goto done;
+ *   		}
+ */
+herr_t
+H5DOappend(hid_t dset_id, hid_t dxpl_id, unsigned axis, size_t extension, 
+           hid_t memtype, const void *buf)
+{
+
+    hsize_t size[H5S_MAX_RANK];		/* The new size (after extension */
+    hsize_t old_size = 0; 		/* The size of the dimension to be extended */
+    int sndims; 			/* Number of dimensions in dataspace (signed) */
+    unsigned ndims; 			/* Number of dimensions in dataspace */
+    hid_t space_id = FAIL; 		/* Old file space */
+    hid_t new_space_id = FAIL; 		/* New file space (after extension) */
+    hid_t mem_space_id = FAIL; 		/* Memory space for data buffer */
+    hssize_t snelmts; 			/* Number of elements in selection (signed) */
+    hsize_t nelmts; 			/* Number of elements in selection */
+    hid_t dapl = FAIL;			/* Dataset access property list */
+
+    hsize_t start[H5S_MAX_RANK];	/* H5Sselect_Hyperslab: starting offset */
+    hsize_t count[H5S_MAX_RANK];	/* H5Sselect_hyperslab: # of blocks to select */
+    hsize_t stride[H5S_MAX_RANK];	/* H5Sselect_hyperslab: # of elements to move when selecting */
+    hsize_t block[H5S_MAX_RANK];	/* H5Sselect_hyperslab: # of elements in a block */
+
+    hsize_t *boundary = NULL;		/* Boundary set in append flush property */
+    H5D_append_cb_t append_cb;		/* Callback function set in append flush property */
+    void *udata;			/* User data set in append flush property */
+    hbool_t hit = FALSE;		/* Boundary is hit or not */
+    hsize_t k;				/* Local index variable */
+    unsigned u; 		        /* Local index variable */
+    herr_t ret_value = FAIL;		/* Return value */
+
+    /* check arguments */
+    if(H5I_DATASET != H5Iget_type(dset_id))
+	goto done;
+
+    /* Get the default dataset transfer property list if the user didn't provide one */
+    if(H5P_DEFAULT == dxpl_id)
+        dxpl_id = H5P_DATASET_XFER_DEFAULT;
+    else
+	if(TRUE != H5Pisa_class(dxpl_id, H5P_DATASET_XFER))
+	    goto done;
+
+    /* Get the dataspace of the dataset */
+    if(FAIL == (space_id = H5Dget_space(dset_id)))
+	goto done;
+
+    /* Get the rank of this dataspace */
+    if((sndims = H5Sget_simple_extent_ndims(space_id)) < 0)
+	goto done;
+    ndims = (unsigned)sndims;
+
+    /* Verify correct axis */
+    if(axis >= ndims)
+	goto done;
+
+    /* Get the dimensions sizes of the dataspace */
+    if(H5Sget_simple_extent_dims(space_id, size, NULL) < 0)
+	goto done;
+
+    /* Adjust the dimension size of the requested dimension, 
+       but first record the old dimension size */
+    old_size = size[axis];
+    size[axis] += extension;
+    if(size[axis] < old_size)
+	goto done;
+
+    /* Set the extent of the dataset to the new dimension */
+    if(H5Dset_extent(dset_id, size) < 0)
+	goto done;
+
+    /* Get the new dataspace of the dataset */
+    if(FAIL == (new_space_id = H5Dget_space(dset_id)))
+	goto done;
+
+    /* Select a hyperslab corresponding to the append operation */
+    for(u = 0 ; u < ndims ; u++) {
+        start[u] = 0;
+        stride[u] = 1;
+        count[u] = size[u];
+        block[u] = 1;
+        if(u == axis) {
+            count[u] = extension;
+            start[u] = old_size;
+        } /* end if */
+    } /* end for */
+    if(FAIL == H5Sselect_hyperslab(new_space_id, H5S_SELECT_SET, start, stride, count, block))
+	goto done;
+
+    /* The # of elemnts in the new extended dataspace */
+    if((snelmts = H5Sget_select_npoints(new_space_id)) < 0)
+	goto done;
+    nelmts = (hsize_t)snelmts;
+
+    /* create a memory space */
+    mem_space_id = H5Screate_simple(1, &nelmts, NULL);
+
+    /* Write the data */
+    if(H5Dwrite(dset_id, memtype, mem_space_id, new_space_id, dxpl_id, buf) < 0)
+	goto done;
+
+    /* Obtain the dataset's access property list */
+    if((dapl = H5Dget_access_plist(dset_id)) < 0)
+	goto done;
+
+    /* Allocate the boundary array */
+    boundary = (hsize_t *)HDmalloc(ndims * sizeof(hsize_t));
+
+    /* Retrieve the append flush property */
+    if(H5Pget_append_flush(dapl, ndims, boundary, &append_cb, &udata) < 0)
+	goto done;
+
+    /* No boundary for this axis */
+    if(boundary[axis] == 0)
+	goto done;
+
+    /* Determine whether a boundary is hit or not */
+    for(k = start[axis]; k < size[axis]; k++)
+	if(!((k + 1) % boundary[axis])) {
+	    hit = TRUE;
+	    break;
+	}
+
+    if(hit) { /* Hit the boundary */
+	/* Invoke callback if there is one */
+	if(append_cb && append_cb(dset_id, size, udata) < 0)
+	    goto done;
+
+	/* Do a dataset flush */
+	if(H5Dflush(dset_id) < 0)
+	    goto done;
+    } /* end if */
+
+    /* Indicate success */
+    ret_value = SUCCEED;
+
+done:
+    /* Close old dataspace */
+    if(space_id != FAIL && H5Sclose(space_id) < 0)
+	ret_value = FAIL;
+
+    /* Close new dataspace */
+    if(new_space_id != FAIL && H5Sclose(new_space_id) < 0)
+	ret_value = FAIL;
+
+    /* Close memory dataspace */
+    if(mem_space_id != FAIL && H5Sclose(mem_space_id) < 0)
+	ret_value = FAIL;
+
+    /* Close the dataset access property list */
+    if(dapl != FAIL && H5Pclose(dapl) < 0)
+	ret_value = FAIL;
+
+    if(boundary)
+	HDfree(boundary);
+
+    return ret_value;
+} /* H5DOappend() */
+
diff --git a/hl/src/H5DOpublic.h b/hl/src/H5DOpublic.h
index 774709e..1e5eb7a 100644
--- a/hl/src/H5DOpublic.h
+++ b/hl/src/H5DOpublic.h
@@ -22,17 +22,16 @@ extern "C" {
 
 /*-------------------------------------------------------------------------
  *
- * Direct chunk write function
+ * "Optimized dataset" routines.
  *
  *-------------------------------------------------------------------------
  */
 
-H5_HLDLL herr_t H5DOwrite_chunk(hid_t dset_id, 
-			hid_t dxpl_id, 
-			uint32_t filters, 
-			const hsize_t *offset, 
-         		size_t data_size, 
-			const void *buf);
+H5_HLDLL herr_t H5DOwrite_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters, 
+    const hsize_t *offset, size_t data_size, const void *buf);
+
+H5_HLDLL herr_t H5DOappend(hid_t dset_id, hid_t dxpl_id, unsigned axis,
+    size_t extension, hid_t memtype, const void *buf);
 
 #ifdef __cplusplus
 }
diff --git a/hl/src/H5DS.c b/hl/src/H5DS.c
index 0df4270..de6e66c 100644
--- a/hl/src/H5DS.c
+++ b/hl/src/H5DS.c
@@ -322,7 +322,7 @@ herr_t H5DSattach_scale(hid_t did,
             ref_j = ((hobj_ref_t *)buf[idx].p)[i];
 
             /* get the scale id for this REF */
-            if((dsid_j = H5Rdereference(did,H5R_OBJECT,&ref_j)) < 0)
+            if((dsid_j = H5Rdereference2(did, H5P_DEFAULT, H5R_OBJECT, &ref_j)) < 0)
                 goto out;
 
             /* get info for DS in the parameter list */
@@ -694,7 +694,7 @@ herr_t H5DSdetach_scale(hid_t did,
             ref = ((hobj_ref_t *)buf[idx].p)[j];
 
             /* get the DS id */
-            if ((dsid_j = H5Rdereference(did,H5R_OBJECT,&ref)) < 0)
+            if ((dsid_j = H5Rdereference2(did,H5P_DEFAULT,H5R_OBJECT,&ref)) < 0)
                 goto out;
 
             /* get info for this DS */
@@ -804,7 +804,7 @@ herr_t H5DSdetach_scale(hid_t did,
             ref = dsbuf[ii].ref;
 
             /* get the dataset id */
-            if ((did_i = H5Rdereference(did,H5R_OBJECT,&ref)) < 0)
+            if ((did_i = H5Rdereference2(did,H5P_DEFAULT,H5R_OBJECT,&ref)) < 0)
                 goto out;
 
             /* get info for this dataset */
@@ -1052,7 +1052,7 @@ htri_t H5DSis_attached(hid_t did,
             ref = ((hobj_ref_t *)buf[idx].p)[i];
 
             /* get the scale id for this REF */
-            if ((dsid_j = H5Rdereference(did,H5R_OBJECT,&ref)) < 0)
+            if ((dsid_j = H5Rdereference2(did,H5P_DEFAULT,H5R_OBJECT,&ref)) < 0)
                 goto out;
 
             /* get info for DS in the parameter list */
@@ -1142,7 +1142,7 @@ htri_t H5DSis_attached(hid_t did,
             if (ref)
             {
                 /* get the dataset id */
-                if ((did_i = H5Rdereference(did,H5R_OBJECT,&ref)) < 0)
+                if ((did_i = H5Rdereference2(did,H5P_DEFAULT,H5R_OBJECT,&ref)) < 0)
                     goto out;
 
                 /* get info for dataset in the parameter list */
@@ -1346,7 +1346,7 @@ herr_t H5DSiterate_scales(hid_t did,
                 /* disable error reporting, the ID might refer to a deleted dataset */
                 H5E_BEGIN_TRY {
                     /* get the DS id */
-                    if ((scale_id = H5Rdereference(did,H5R_OBJECT,&ref)) < 0)
+                    if ((scale_id = H5Rdereference2(did,H5P_DEFAULT,H5R_OBJECT,&ref)) < 0)
                         goto out;
                 } H5E_END_TRY;
 
@@ -1885,7 +1885,7 @@ ssize_t H5DSget_scale_name(hid_t did,
     if (buf)
         HDfree(buf);
 
-    return (ssize_t) MAX(0,nbytes-1);
+    return (ssize_t)(nbytes - 1);
 
     /* error zone */
 out:
diff --git a/hl/src/H5IM.c b/hl/src/H5IM.c
index 774ce2f..6d08f02 100644
--- a/hl/src/H5IM.c
+++ b/hl/src/H5IM.c
@@ -255,12 +255,12 @@ herr_t H5IMget_image_info( hid_t loc_id,
                           char *interlace,
                           hssize_t *npals )
 {
-    hid_t       did;
-    hid_t       sid;
+    hid_t       did                     = -1;
+    hid_t       sid                     = -1;
     hsize_t     dims[IMAGE24_RANK];
-    hid_t       aid;
-    hid_t       asid;
-    hid_t       atid;
+    hid_t       aid                     = -1;
+    hid_t       asid                    = -1;
+    hid_t       atid                    = -1;
     H5T_class_t aclass;
     int         has_pal;
     int         has_attr;
@@ -396,10 +396,14 @@ herr_t H5IMget_image_info( hid_t loc_id,
     return 0;
 
 out:
-    H5Dclose( did );
-    H5Aclose( aid );
-    H5Sclose( asid );
-    H5Tclose( atid );
+    if(did > 0)
+        H5Dclose( did );
+    if(aid > 0)
+        H5Aclose( aid );
+    if(asid > 0)
+        H5Sclose( asid );
+    if(atid > 0)
+        H5Tclose( atid );
     return -1;
 
 }
@@ -957,7 +961,7 @@ herr_t H5IMget_palette_info( hid_t loc_id,
             goto out;
 
         /* Get the actual palette */
-        if ( (pal_id = H5Rdereference( did, H5R_OBJECT, &refbuf[pal_number] )) < 0)
+        if ( (pal_id = H5Rdereference2(did, H5P_DEFAULT, H5R_OBJECT, &refbuf[pal_number])) < 0)
             goto out;
 
         if ( (pal_space_id = H5Dget_space( pal_id )) < 0)
@@ -1075,7 +1079,7 @@ herr_t H5IMget_palette( hid_t loc_id,
             goto out;
 
         /* Get the palette id */
-        if ( (pal_id = H5Rdereference( did, H5R_OBJECT, &refbuf[pal_number] )) < 0)
+        if ( (pal_id = H5Rdereference2(did, H5P_DEFAULT, H5R_OBJECT, &refbuf[pal_number])) < 0)
             goto out;
 
         /* Read the palette dataset */
diff --git a/hl/src/H5LD.c b/hl/src/H5LD.c
new file mode 100644
index 0000000..4abd740
--- /dev/null
+++ b/hl/src/H5LD.c
@@ -0,0 +1,639 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+* Copyright by The HDF Group.                                               *
+* Copyright by the Board of Trustees of the University of Illinois.         *
+* All rights reserved.                                                      *
+*                                                                           *
+* This file is part of HDF5.  The full HDF5 copyright notice, including     *
+* terms governing use, modification, and redistribution, is contained in    *
+* the files COPYING and Copyright.html.  COPYING can be found at the root   *
+* of the source code distribution tree; Copyright.html can be found at the  *
+* root level of an installed copy of the electronic HDF5 document set and   *
+* is linked from the top-level documents page.  It can also be found at     *
+* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+* access to either file, you may request a copy from help at hdfgroup.org.     *
+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <string.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <stdio.h>
+#include "H5LDprivate.h"
+
+/*-------------------------------------------------------------------------
+ *
+ * internal functions
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t H5LD_construct_info(H5LD_memb_t *memb, hid_t par_tid);
+static herr_t H5LD_get_dset_dims(hid_t did, hsize_t *cur_dims);
+static size_t H5LD_get_dset_type_size(hid_t did, const char *fields);
+static herr_t H5LD_get_dset_elmts(hid_t did, const hsize_t *prev_dims,
+    const hsize_t *cur_dims, const char *fields, void *buf);
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5LD_clean_vector
+ *
+ * Purpose: Process the vector of info:
+ *		1) free the array of pointers to member names in listv[n]
+ *		2) close the type id of the last member in listv[n]
+ *		3) free the H5LD_memb_t structure itself as pointed to by listv[n]
+ *
+ * Return: void
+ *
+ * Programmer:  Vailin Choi; Aug 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5LD_clean_vector(H5LD_memb_t *listv[])
+{
+    unsigned n;		/* Local index variable */
+
+    HDassert(listv);
+
+    /* Go through info for each field stored in listv[] */
+    for(n = 0; listv[n] != NULL; n++) {
+	if(listv[n]->names) {
+	    HDfree(listv[n]->names);
+	    listv[n]->names = NULL;
+	} /* end if */
+
+	/* Close the type id of the last member in the field */
+	if(!(listv[n]->last_tid < 0)) {
+	    H5Tclose(listv[n]->last_tid);
+	    listv[n]->last_tid = -1;
+	} /* end if */
+
+	/* Free the H5LD_memb_t structure for the field */
+	HDfree(listv[n]);
+	listv[n] = NULL;
+    } /* end for */
+} /* H5LD_clean_vector() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5LD_construct_info()
+ *
+ * Purpose: Get the remaining info for a field:
+ *		1) Get the type id of the last member in the field
+ *		2) Get the total offset of all the members in the field
+ *		3) Get the type size of the last member in the field
+ *
+ * Return: Success: 0
+ *	   Failure: negative
+ *
+ * Programmer:  Vailin Choi; Aug 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5LD_construct_info(H5LD_memb_t *memb, hid_t par_tid)
+{
+    hid_t tmp_tid = -1;	/* Dataset type id */
+    unsigned i;		/* Local index variable */
+    herr_t ret_value = FAIL;	/* Return value */
+
+    /* Make a copy of the incoming datatype */
+    tmp_tid = H5Tcopy(par_tid);
+
+    /* Validate all the members in a field */
+    for(i = 0; memb->names[i] != NULL; i++) {
+        hid_t memb_tid;         /* Type id for a member in a field */
+        int idx;		/* Index # of a member in a compound datatype */
+
+        /* Get the member index and member type id */
+        if((idx = H5Tget_member_index(tmp_tid, memb->names[i])) < 0)
+            goto done;
+        if((memb_tid = H5Tget_member_type(tmp_tid, (unsigned)idx)) < 0)
+            goto done;
+
+	/* Sum up the offset of all the members in the field */
+        memb->tot_offset += H5Tget_member_offset(tmp_tid, (unsigned)idx);
+        if(H5Tclose(tmp_tid) < 0)
+            goto done;
+        tmp_tid = memb_tid;
+    } /* end for */
+
+    /* Get the type size of the last member in the field */
+    memb->last_tsize = H5Tget_size(tmp_tid);
+
+    /* Save the type id of the last member in the field */
+    memb->last_tid = H5Tcopy(tmp_tid);
+
+    /* Indicate success */
+    ret_value = SUCCEED;
+
+done:
+    H5E_BEGIN_TRY
+	H5Tclose(tmp_tid);
+    H5E_END_TRY
+
+    return(ret_value);
+} /* H5LD_construct_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5LD_construct_vector
+ *
+ * Purpose: Process the comma-separated list of fields in "fields" as follows:
+ * 	Example:
+ *		"fields": "a.b.c,d"
+ *		listv[0]->tot_offset = total offset of "a" & "b" & "c"
+ *		listv[0]->last_tid = type id of "c"
+ *		listv[0]->last_tsize = type size of "c"
+ *		listv[0]->names[0] = "a"
+ *		listv[0]->names[1] = "b"
+ *		listv[0]->names[2] = "c"
+ *		listv[0]->names[3] = NULL
+ *
+ *		listv[1]->tot_offset = offset of "d"
+ *		listv[1]->last_tid = type id of "d"
+ *		listv[1]->last_tsize = type size of "d"
+ *		listv[1]->names[0] = "d"
+ *		listv[1]->names[1] = NULL
+ *
+ * Return: Success: # of comma-separated fields in "fields"
+ *	   Failure: negative value
+ *
+ * Programmer:  Vailin Choi; Aug 2010
+ *
+*-------------------------------------------------------------------------
+*/
+int
+H5LD_construct_vector(char *fields, H5LD_memb_t *listv[]/*OUT*/, hid_t par_tid)
+{
+    int nfields;	                /* The # of comma-separated fields in "fields" */
+    hbool_t end_of_fields = FALSE;	/* end of "fields" */
+    char *fields_ptr;	                /* Pointer to "fields" */
+    int ret_value = FAIL;		/* Return value */
+
+    HDassert(listv);
+    HDassert(fields);
+
+    fields_ptr = fields;
+    nfields = 0;
+
+    /* Process till end of "fields" */
+    while(!end_of_fields) {
+	H5LD_memb_t *memb = NULL; 	/* Pointer to structure for storing a field's info */
+        char *cur;	                /* Pointer to a member in a field */
+	size_t len;			/* Estimated # of members in a field */
+	hbool_t gotcomma = FALSE;	/* A comma encountered */
+	hbool_t gotmember = FALSE;	/* Getting member in a field */
+        hbool_t valid = TRUE;           /* Whether a field being processed is valid or not */
+	int j = 0;			/* The # of members in a field */
+
+	len = (HDstrlen(fields_ptr) / 2) + 2;
+
+	/* Allocate memory for an H5LD_memb_t for storing a field's info */
+	if(NULL == (memb = (H5LD_memb_t *)HDcalloc((size_t)1, sizeof(H5LD_memb_t))))
+	    goto done;
+
+	/* Allocate memory for an array of pointers to member names */
+	if(NULL == (memb->names = (char **)HDcalloc(len, sizeof(char *))))
+	    goto done;
+
+	memb->names[j] = fields_ptr;
+	memb->last_tid = -1;
+	cur = fields_ptr;
+
+	/* Continue processing till: not valid or comma encountered or "fields" ended */
+	while(valid && !gotcomma && !end_of_fields) {
+	    switch(*fields_ptr) {
+                case '\0':	/* end of list */
+                    if(gotmember) { /* getting something and end of "fields" */
+                        *cur++ = '\0';;
+                        memb->names[++j] = NULL;
+                    } /* end if */
+                    else /* getting nothing but end of list */
+                        valid = FALSE;
+                    end_of_fields = TRUE;
+                    break;
+	
+                case '\\': /* escape character */
+                    ++fields_ptr; /* skip it */
+                    if(*fields_ptr == '\0')
+                        valid = FALSE;
+                    else {
+                        *cur++ = *fields_ptr++;
+                        gotmember = TRUE;
+                    } /* end else */
+                    break;
+
+                case '.': /* nested field separator */
+                    *fields_ptr++ = *cur++ = '\0';;
+                    if(gotmember) {
+                        memb->names[++j] = cur;
+                        gotmember = FALSE;
+                    } /* end if */
+                    else
+                        valid = FALSE;
+                    break;
+
+                case ',': /* field separator */
+                    *fields_ptr++ = *cur++ = '\0';;
+                    if(gotmember) {
+                        memb->names[++j] = NULL;
+                        gotmember = FALSE;
+                    } /* end if */
+                    else
+                        valid = FALSE;
+                    gotcomma = TRUE;
+                    break;
+
+                default: 
+                    *cur++ = *fields_ptr++;
+                    gotmember = TRUE;
+                    break;
+	    } /* end switch */
+	} /* while (valid && !gotcomma && !end_of_fields) */
+
+	/* If valid, put into listv and continue processing further info */
+	if(valid) {
+	    listv[nfields++] = memb;
+	    if(H5LD_construct_info(memb, par_tid) < 0)
+		goto done;
+	} /* end if */
+        else {
+	    if(memb)
+                HDfree(memb);
+	    goto done;
+	} /* end else */
+    } /* while !end_of_fields */
+
+    /* Indicate success */
+    ret_value = nfields;
+
+done:
+    listv[nfields] = NULL;
+    if(ret_value == FAIL)
+	H5LD_clean_vector(listv);
+
+    return(ret_value);
+}  /* H5LD_construct_vector() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5LD_get_dset_dims
+ *
+ * Purpose: To return the current size for each dimension of the
+ *	    dataset's dataspace
+ *
+ * Return: Success: 0
+ *	   Failure: negative value
+ *
+ * Programmer:  Vailin Choi; March 2010
+ *
+*-------------------------------------------------------------------------
+*/
+static herr_t
+H5LD_get_dset_dims(hid_t did, hsize_t *cur_dims)
+{
+    hid_t sid = -1;             /* Dataspace ID */
+    herr_t ret_value = FAIL;    /* Return Value */
+
+    /* Verify parameter */
+    if(cur_dims == NULL)
+        goto done;
+
+    /* Get the dataset's dataspace */
+    if((sid = H5Dget_space(did)) < 0)
+        goto done;
+
+    /* Get the current dimension size */
+    if(H5Sget_simple_extent_dims(sid, cur_dims, NULL) < 0)
+        goto done;
+
+    /* Indicate success */
+    ret_value = SUCCEED;
+
+done:
+    H5E_BEGIN_TRY {
+        H5Sclose(sid);
+    } H5E_END_TRY;
+
+    return(ret_value);
+} /* H5LD_get_dset_dims() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5LD_get_dset_type_size
+ *
+ * Purpose: To return the size of the dataset's datatype in bytes
+ *	null "fields": return the size of the dataset's datatype
+ *	non-null "fields": return the size of the dataset's datatype
+ *			   with respect to the selection in "fields"
+ *
+ * Return: Success: size of the dataset's datatype
+ *	   Failure: 0 (valid datatypes are never zero size)
+ *
+ * Programmer:  Vailin Choi; March 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5LD_get_dset_type_size(hid_t did, const char *fields)
+{
+    hid_t dset_tid = -1;	/* Dataset's type identifier */
+    hid_t tid = -1;		/* Native Type identifier */
+    H5LD_memb_t **listv = NULL;	/* Vector for storing information in "fields" */
+    char *dup_fields = NULL;	/* A copy of "fields" */
+    size_t ret_value = 0;       /* Return value */
+
+    /* Get the datatype of the dataset */
+    if((dset_tid = H5Dget_type(did)) < 0)
+        goto done;
+    if((tid = H5Tget_native_type(dset_tid, H5T_DIR_DEFAULT)) < 0)
+        goto done;
+
+    if(fields == NULL) /* If no "fields" is specified */
+        ret_value = H5Tget_size(tid);
+    else { /* "fields" are specified */
+        size_t len;			/* Estimate the number of comma-separated fields in "fields" */
+        size_t tot = 0;			/* Data type size of all the fields in "fields" */
+        int n = 0, num = 0;		/* Local index variables */
+
+        HDassert(fields && *fields);
+
+        /* Should be a compound datatype if "fields" exists */
+        if(H5Tget_class(dset_tid) != H5T_COMPOUND)
+            goto done;
+
+	/* Get a copy of "fields" */
+        if(NULL == (dup_fields = HDstrdup(fields)))
+            goto done;
+
+	/* Allocate memory for a list of H5LD_memb_t pointers to store "fields" info */
+	len = (HDstrlen(fields) / 2) + 2;
+	if(NULL == (listv = (H5LD_memb_t **)HDcalloc(len, sizeof(H5LD_memb_t *))))
+            goto done;
+
+	/* Process and store info for "fields" */
+	if((num = H5LD_construct_vector(dup_fields, listv/*OUT*/, tid)) < 0)
+            goto done;
+
+	/* Sum up the size of all the datatypes in "fields" */
+	for(n = 0; n < num; n++)
+	    tot += listv[n]->last_tsize;
+
+	/* Clean up the vector of H5LD_memb_t structures */
+	H5LD_clean_vector(listv);
+
+	/* Return the total size */
+	ret_value = tot;
+    } /* end else */
+
+done:
+    H5E_BEGIN_TRY
+        H5Tclose(tid);
+        H5Tclose(dset_tid);
+    H5E_END_TRY
+
+    /* Free the array of H5LD_memb_t pointers */
+    if(listv)
+        HDfree(listv);
+
+    /* Free memory */
+    if(dup_fields)
+        HDfree(dup_fields);
+
+    return(ret_value);
+} /* H5LD_get_dset_type_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5LD_get_dset_elmts
+ *
+ * Purpose: To retrieve selected data from the dataset
+ *
+ * Return: Success: 0
+ *	   Failure: negative
+ *
+ * Programmer:  Vailin Choi; August 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5LD_get_dset_elmts(hid_t did, const hsize_t *prev_dims, const hsize_t *cur_dims,
+    const char *fields, void *buf)
+{
+    hid_t dtid = -1, tid = -1;	/* Dataset type id */
+    hid_t sid = -1, mid = -1;	/* Dataspace and memory space id */
+    hssize_t snum_elmts;        /* Number of dataset elements in the selection (signed) */
+    hsize_t num_elmts;          /* Number of dataset elements in the selection */
+    hsize_t start[H5S_MAX_RANK];/* Starting offset */
+    hsize_t count[H5S_MAX_RANK];/* ??offset */
+    H5LD_memb_t **listv = NULL;	/* Vector for storing information in "fields" */
+    char *dup_fields = NULL;	/* A copy of "fields" */
+    char *sav_buf = NULL;	/* Saved pointer temporary buffer */
+    unsigned ctr;	        /* Counter for # of curr_dims > prev_dims */
+    int ndims;		        /* Number of dimensions for the dataset */
+    int i; 		        /* Local index variable */
+    herr_t ret_value = FAIL;	/* Return value */
+
+    /* Verify parameters */
+    if(prev_dims == NULL || cur_dims == NULL || buf == NULL)
+	goto done;
+
+    /* Get dataset's dataspace */
+    if((sid = H5Dget_space(did)) < 0)
+	goto done;
+    
+    /* Get the number of dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(sid)) < 0)
+	goto done;
+
+    /* Verify that cur_dims must have one dimension whose size is greater than prev_dims */
+    HDmemset(start, 0, sizeof start);
+    HDmemset(count, 0, sizeof count);
+    ctr = 0;
+    for(i = 0; i < ndims; i++)
+	if(cur_dims[i] > prev_dims[i]) {
+	    ++ctr;
+	    count[i] = cur_dims[i] - prev_dims[i];
+	    start[i] = prev_dims[i];
+	} /* end if */
+        else { /* < or = */
+	    start[i] = 0;
+	    count[i] = MIN(prev_dims[i], cur_dims[i]);
+	} /* end else */
+    if(!ctr)
+	goto done;
+
+    if(ctr == 1) { /* changes for only one dimension */
+	/* Make the selection in the dataset based on "cur_dims" and "prev_dims" */
+	if(H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+	    goto done;
+    } /* end if */
+    else { /* changes for more than one dimensions */
+	HDmemset(start, 0, sizeof start);
+
+	/* Make the selection in the dataset based on "cur_dims" and "prev_dims" */
+	if(H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, NULL, cur_dims, NULL) < 0)
+	    goto done;
+	if(H5Sselect_hyperslab(sid, H5S_SELECT_NOTB, start, NULL, prev_dims, NULL) < 0)
+	    goto done;
+    } /* end else */
+
+    /* Get the number of elements in the selection */
+    if(0 == (snum_elmts = H5Sget_select_npoints(sid)))
+        goto done;
+    num_elmts = (hsize_t)snum_elmts;
+
+    /* Create the memory space for the selection */
+    if((mid = H5Screate_simple(1, &num_elmts, NULL)) < 0)
+	goto done;
+
+    /* Get the native datatype size */
+    if((dtid = H5Dget_type(did)) < 0)
+        goto done;
+    if((tid = H5Tget_native_type(dtid, H5T_DIR_DEFAULT)) < 0)
+        goto done;
+
+    if(fields == NULL) { /* nothing in "fields" */
+	/* Read and store all the elements in "buf" */
+	if(H5Dread(did, tid, mid, sid, H5P_DEFAULT, buf) < 0)
+	    goto done;
+    } /* end if */
+    else { /* "fields" is specified */
+	unsigned char *buf_p = (unsigned char *)buf;   /* Pointer to the destination buffer */
+        char *tmp_buf;          /* Temporary buffer for data read */
+        size_t tot_tsize;	/* Total datatype size */
+        size_t len;		/* Estimate the number of comma-separated fields in "fields" */
+
+	/* should be a compound datatype if "fields" exists */
+	if(H5Tget_class(tid) != H5T_COMPOUND)
+	    goto done;
+
+	/* Get the total size of the dataset's datatypes */
+	if(0 == (tot_tsize = H5LD_get_dset_type_size(did, NULL)))
+	    goto done;
+	
+	/* Allocate memory for reading in the elements in the dataset selection */
+	if(NULL == (sav_buf = tmp_buf = (char *)HDcalloc((size_t)num_elmts, tot_tsize)))
+	    goto done;
+
+	/* Read the dataset elements in the selection */
+	if(H5Dread(did, tid, mid, sid, H5P_DEFAULT, tmp_buf) < 0)
+	    goto done;
+
+	/* Make a copy of "fields" */
+	if(NULL == (dup_fields = HDstrdup(fields)))
+	    goto done;
+
+	/* Allocate memory for the vector of H5LD_memb_t pointers */
+	len = (HDstrlen(fields) / 2) + 2;
+        if(NULL == (listv = (H5LD_memb_t **)HDcalloc(len, sizeof(H5LD_memb_t *))))
+	    goto done;
+
+	/* Process and store information for "fields" */
+        if(H5LD_construct_vector(dup_fields, listv, tid) < 0)
+            goto done;
+
+	/* Copy data for each dataset element in the selection */
+	for(i = 0; i < (int)num_elmts; i++) {
+            int j; 		/* Local index variable */
+
+	    /* Copy data for "fields" to the input buffer */
+	    for(j = 0; listv[j] != NULL; j++) {
+		HDmemcpy(buf_p, tmp_buf + listv[j]->tot_offset, listv[j]->last_tsize);
+		buf_p += listv[j]->last_tsize;
+	    } /* end for */
+	    tmp_buf += tot_tsize;
+	} /* end for */
+
+	/* Clean up the vector of H5LD_memb_t structures */
+	H5LD_clean_vector(listv);
+    } /* end else */
+
+    /* Indicate success */
+    ret_value = SUCCEED;
+
+done:
+    H5E_BEGIN_TRY
+	H5Tclose(dtid);
+	H5Tclose(tid);
+	H5Sclose(sid);
+	H5Sclose(mid);
+    H5E_END_TRY
+
+    /* Free the array of H5LD_memb_t pointers */
+    if(listv)
+        HDfree(listv);
+
+    /* Free memory */
+    if(dup_fields)
+        HDfree(dup_fields);
+    if(sav_buf)
+        HDfree(sav_buf);
+
+    return(ret_value);
+} /* H5LD_get_dset_elmts() */
+
+/*-------------------------------------------------------------------------
+ *
+ * Public functions
+ *
+ *-------------------------------------------------------------------------
+ */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5LDget_dset_dims
+ *
+ * Purpose: To retrieve the current dimension sizes for a dataset
+ *
+ * Return: Success: 0
+ *	   Failure: negative value
+ *
+ * Programmer:  Vailin Choi; March 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5LDget_dset_dims(hid_t did, hsize_t *cur_dims)
+{
+    return(H5LD_get_dset_dims(did, cur_dims));
+} /* H5LDget_dset_dims() */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5LDget_dset_type_size
+ *
+ * Purpose:  To return the size in bytes of the datatype for the dataset
+ *
+ * Return: Success: size in bytes of the dataset's datatype
+ *	   Failure: 0 (valid datatypes are never zero size)
+ *
+ * Programmer:  Vailin Choi; March 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+size_t
+H5LDget_dset_type_size(hid_t did, const char *fields)
+{
+    return(H5LD_get_dset_type_size(did, fields));
+} /* H5LDget_dset_type_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5LDget_dset_elmts
+ *
+ * Purpose: To retrieve selected data from the dataset
+ *
+ * Return: Success: 0
+ *	   Failure: negative value
+ *
+ * Programmer:  Vailin Choi; March 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5LDget_dset_elmts(hid_t did, const hsize_t *prev_dims, const hsize_t *cur_dims, const char *fields, void *buf)
+{
+    return(H5LD_get_dset_elmts(did, prev_dims, cur_dims, fields, buf) );
+} /* H5LDget_dset_elmts() */
+
diff --git a/hl/src/H5LDprivate.h b/hl/src/H5LDprivate.h
new file mode 100644
index 0000000..13e0710
--- /dev/null
+++ b/hl/src/H5LDprivate.h
@@ -0,0 +1,49 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef _H5LDprivate_H
+#define _H5LDprivate_H
+
+/* High-level library internal header file */
+#include "H5HLprivate2.h"
+#include "H5LDpublic.h"
+
+/* Store information for a field in <list_of_fields> for a compound data type */
+/* 
+ *  Note: This data structure is used by both H5LD.c and hl/tools/h5watch
+ *	  This declaration is repeated in tools/lib/h5tools_str.c 
+ */
+typedef struct H5LD_memb_t {
+    size_t tot_offset;
+    size_t last_tsize;
+    hid_t last_tid;
+    char **names;
+} H5LD_memb_t;
+
+/* 
+ * Note that these two private routines are called by hl/tools/h5watch.
+ * Have considered the following options:
+ *   1) Repeat the coding in both H5LD.c and h5watch
+ *   2) Make these public routines
+ *   3) Break the rule "to avoid tools calling private routines in the library"
+ * #1: not good for maintenance
+ * #2: these two routines are too specific to be made as public routines
+ * Decide to do #3 at this point of time after some discussion.
+ */
+void H5LD_clean_vector(H5LD_memb_t *listv[]);
+int H5LD_construct_vector(char *fields, H5LD_memb_t *listv[], hid_t par_tid);
+
+#endif /* end _H5LDprivate_H */
+
diff --git a/hl/src/H5LDpublic.h b/hl/src/H5LDpublic.h
new file mode 100644
index 0000000..4844d42
--- /dev/null
+++ b/hl/src/H5LDpublic.h
@@ -0,0 +1,33 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef _H5LDpublic_H
+#define _H5LDpublic_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+H5_HLDLL herr_t H5LDget_dset_dims(hid_t did, hsize_t *cur_dims);
+H5_HLDLL size_t H5LDget_dset_type_size(hid_t did, const char *fields);
+H5_HLDLL herr_t H5LDget_dset_elmts(hid_t did, const hsize_t *prev_dims,
+    const hsize_t *cur_dims, const char *fields, void *buf);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _H5LDpublic_H */
+
diff --git a/hl/src/H5LT.c b/hl/src/H5LT.c
index 9b3a4a2..107e238 100644
--- a/hl/src/H5LT.c
+++ b/hl/src/H5LT.c
@@ -13,13 +13,12 @@
 * access to either file, you may request a copy from help at hdfgroup.org.     *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#include <string.h>
-#include <stdlib.h>
 #include <assert.h>
 #include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 
 #include "H5LTprivate.h"
-#include "H5private.h"
 
 /* For Lex and Yacc */
 #define         COL             3
@@ -867,13 +866,13 @@ out:
 */
 hid_t H5LTopen_file_image(void *buf_ptr, size_t buf_size, unsigned flags)
 {
-    hid_t		fapl, file_id;	/* HDF5 identifiers */
-    unsigned            file_open_flags;/* Flags for image open */
-    char                file_name[64];	/* Filename buffer */
-    size_t              alloc_incr;     /* Buffer allocation increment */
-    size_t              min_incr = 65536; /* Minimum buffer increment */
-    double              buf_prcnt = 0.1f;  /* Percentage of buffer size to set
-                                             as increment */
+    hid_t		        fapl=-1, file_id=-1;    /* HDF5 identifiers */
+    unsigned            file_open_flags;        /* Flags for image open */
+    char                file_name[64];	        /* Filename buffer */
+    size_t              alloc_incr;             /* Buffer allocation increment */
+    size_t              min_incr = 65536;       /* Minimum buffer increment */
+    double              buf_prcnt = 0.1f;       /* Percentage of buffer size to set
+                                                    as increment */
     static long         file_name_counter; 
     H5FD_file_image_callbacks_t callbacks = {&image_malloc, &image_memcpy, 
                                            &image_realloc, &image_free, 
@@ -3358,7 +3357,7 @@ herr_t H5LTget_attribute_long( hid_t loc_id,
 *
 * Date: June 17, 2005
 *
-* Comments: This funstion was added to suuport INTEGER*8 Fortran types
+* Comments: This function was added to support INTEGER*8 Fortran types
 *
 * Modifications:
 *
diff --git a/hl/src/H5LTanalyze.c b/hl/src/H5LTanalyze.c
index 54e443d..022e24f 100644
--- a/hl/src/H5LTanalyze.c
+++ b/hl/src/H5LTanalyze.c
@@ -5,9 +5,12 @@
 #pragma GCC diagnostic ignored "-Wmissing-prototypes"             
 #pragma GCC diagnostic ignored "-Wnested-externs"                 
 #pragma GCC diagnostic ignored "-Wold-style-definition"           
+#pragma GCC diagnostic ignored "-Wredundant-decls"                
 #pragma GCC diagnostic ignored "-Wsign-compare"                   
 #pragma GCC diagnostic ignored "-Wsign-conversion"                
+#pragma GCC diagnostic ignored "-Wstrict-overflow"                
 #pragma GCC diagnostic ignored "-Wstrict-prototypes"              
+#pragma GCC diagnostic ignored "-Wsuggest-attribute=pure"         
 #pragma GCC diagnostic ignored "-Wswitch-default"                 
 #pragma GCC diagnostic ignored "-Wunused-function"                
 #pragma GCC diagnostic ignored "-Wunused-macros"                  
@@ -17,9 +20,9 @@
 #elif defined _MSC_VER                                            
 #pragma warning(push, 1)                                          
 #endif                                                            
-#line 2 "H5LTanalyze.c"
+#line 2 "hl/src/H5LTanalyze.c"
 
-#line 4 "H5LTanalyze.c"
+#line 4 "hl/src/H5LTanalyze.c"
 
 #define  YY_INT_ALIGNED short int
 
@@ -47,7 +50,7 @@
 #define FLEX_SCANNER
 #define YY_FLEX_MAJOR_VERSION 2
 #define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 37
+#define YY_FLEX_SUBMINOR_VERSION 39
 #if YY_FLEX_SUBMINOR_VERSION > 0
 #define FLEX_BETA
 #endif
@@ -180,7 +183,15 @@ typedef unsigned int flex_uint32_t;
 
 /* Size of default input buffer. */
 #ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
 #define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
 #endif
 
 /* The state buf must be large enough to hold one state per character in the main buffer.
@@ -206,6 +217,7 @@ extern FILE *H5LTyyin, *H5LTyyout;
 #define EOB_ACT_LAST_MATCH 2
 
     #define YY_LESS_LINENO(n)
+    #define YY_LINENO_REWIND_TO(ptr)
     
 /* Return all but the first "n" matched characters back to the input stream. */
 #define yyless(n) \
@@ -863,7 +875,7 @@ goto find_rule; \
 #define YY_MORE_ADJ 0
 #define YY_RESTORE_YY_MORE_OFFSET
 char *H5LTyytext;
-#line 1 "H5LTanalyze.l"
+#line 1 "hl/src/H5LTanalyze.l"
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  * Copyright by The HDF Group.                                               *
  * Copyright by the Board of Trustees of the University of Illinois.         *
@@ -878,12 +890,22 @@ char *H5LTyytext;
  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-#line 17 "H5LTanalyze.l"
+/* NOTE!
+ *
+ * If you make any changes to H5LTanalyze.l, please run bin/genparser to
+ * recreate the output files.
+ */
+#line 23 "hl/src/H5LTanalyze.l"
 #include <stdlib.h>
 #include <string.h>
 #include <hdf5.h>
 #include "H5LTparse.h"
 
+/* Turn off suggest const attribute warning in gcc */
+#if __GNUC__ >= 4 && __GNUC_MINOR__ >=2 
+#pragma GCC diagnostic ignored "-Wsuggest-attribute=const"
+#endif 
+
 int my_yyinput(char *, int);
 #undef YY_INPUT
 #define YY_INPUT(b, r, ms) (r=my_yyinput(b, ms))
@@ -932,7 +954,7 @@ extern hbool_t is_opq_tag;
 hbool_t        first_quote = 1;
 
 
-#line 917 "H5LTanalyze.c"
+#line 936 "hl/src/H5LTanalyze.c"
 
 #define INITIAL 0
 #define TAG_STRING 1
@@ -1006,7 +1028,12 @@ static int input (void );
 
 /* Amount of stuff to slurp up with each read. */
 #ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
 #define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
 #endif
 
 /* Copy whatever the last rule matched to the standard output. */
@@ -1107,11 +1134,6 @@ YY_DECL
 	register char *yy_cp, *yy_bp;
 	register int yy_act;
     
-#line 73 "H5LTanalyze.l"
-
-
-#line 1095 "H5LTanalyze.c"
-
 	if ( !(yy_init) )
 		{
 		(yy_init) = 1;
@@ -1144,6 +1166,12 @@ YY_DECL
 		H5LTyy_load_buffer_state( );
 		}
 
+	{
+#line 84 "hl/src/H5LTanalyze.l"
+
+
+#line 1152 "hl/src/H5LTanalyze.c"
+
 	while ( 1 )		/* loops until end-of-file is reached */
 		{
 		yy_cp = (yy_c_buf_p);
@@ -1164,7 +1192,7 @@ YY_DECL
 yy_match:
 		do
 			{
-			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
 			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
 				{
 				yy_current_state = (int) yy_def[yy_current_state];
@@ -1204,277 +1232,277 @@ do_action:	/* This label is used only to access EOF actions. */
 	{ /* beginning of action switch */
 case 1:
 YY_RULE_SETUP
-#line 75 "H5LTanalyze.l"
+#line 86 "hl/src/H5LTanalyze.l"
 {return hid(H5T_STD_I8BE_TOKEN);}
 	YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 76 "H5LTanalyze.l"
+#line 87 "hl/src/H5LTanalyze.l"
 {return hid(H5T_STD_I8LE_TOKEN);}
 	YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 77 "H5LTanalyze.l"
+#line 88 "hl/src/H5LTanalyze.l"
 {return hid(H5T_STD_I16BE_TOKEN);}
 	YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 78 "H5LTanalyze.l"
+#line 89 "hl/src/H5LTanalyze.l"
 {return hid(H5T_STD_I16LE_TOKEN);}
 	YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 79 "H5LTanalyze.l"
+#line 90 "hl/src/H5LTanalyze.l"
 {return hid(H5T_STD_I32BE_TOKEN);}
 	YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 80 "H5LTanalyze.l"
+#line 91 "hl/src/H5LTanalyze.l"
 {return hid(H5T_STD_I32LE_TOKEN);}
 	YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 81 "H5LTanalyze.l"
+#line 92 "hl/src/H5LTanalyze.l"
 {return hid(H5T_STD_I64BE_TOKEN);}
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 82 "H5LTanalyze.l"
+#line 93 "hl/src/H5LTanalyze.l"
 {return hid(H5T_STD_I64LE_TOKEN);}
 	YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 84 "H5LTanalyze.l"
+#line 95 "hl/src/H5LTanalyze.l"
 {return hid(H5T_STD_U8BE_TOKEN);}
 	YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 85 "H5LTanalyze.l"
+#line 96 "hl/src/H5LTanalyze.l"
 {return hid(H5T_STD_U8LE_TOKEN);}
 	YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 86 "H5LTanalyze.l"
+#line 97 "hl/src/H5LTanalyze.l"
 {return hid(H5T_STD_U16BE_TOKEN);}
 	YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 87 "H5LTanalyze.l"
+#line 98 "hl/src/H5LTanalyze.l"
 {return hid(H5T_STD_U16LE_TOKEN);}
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 88 "H5LTanalyze.l"
+#line 99 "hl/src/H5LTanalyze.l"
 {return hid(H5T_STD_U32BE_TOKEN);}
 	YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 89 "H5LTanalyze.l"
+#line 100 "hl/src/H5LTanalyze.l"
 {return hid(H5T_STD_U32LE_TOKEN);}
 	YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 90 "H5LTanalyze.l"
+#line 101 "hl/src/H5LTanalyze.l"
 {return hid(H5T_STD_U64BE_TOKEN);}
 	YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 91 "H5LTanalyze.l"
+#line 102 "hl/src/H5LTanalyze.l"
 {return hid(H5T_STD_U64LE_TOKEN);}
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 93 "H5LTanalyze.l"
+#line 104 "hl/src/H5LTanalyze.l"
 {return hid(H5T_NATIVE_CHAR_TOKEN);}
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 94 "H5LTanalyze.l"
+#line 105 "hl/src/H5LTanalyze.l"
 {return hid(H5T_NATIVE_SCHAR_TOKEN);}
 	YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 95 "H5LTanalyze.l"
+#line 106 "hl/src/H5LTanalyze.l"
 {return hid(H5T_NATIVE_UCHAR_TOKEN);}
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 96 "H5LTanalyze.l"
+#line 107 "hl/src/H5LTanalyze.l"
 {return hid(H5T_NATIVE_SHORT_TOKEN);}
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 97 "H5LTanalyze.l"
+#line 108 "hl/src/H5LTanalyze.l"
 {return hid(H5T_NATIVE_USHORT_TOKEN);}
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 98 "H5LTanalyze.l"
+#line 109 "hl/src/H5LTanalyze.l"
 {return hid(H5T_NATIVE_INT_TOKEN);}
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 99 "H5LTanalyze.l"
+#line 110 "hl/src/H5LTanalyze.l"
 {return hid(H5T_NATIVE_UINT_TOKEN);}
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 100 "H5LTanalyze.l"
+#line 111 "hl/src/H5LTanalyze.l"
 {return hid(H5T_NATIVE_LONG_TOKEN);}
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 101 "H5LTanalyze.l"
+#line 112 "hl/src/H5LTanalyze.l"
 {return hid(H5T_NATIVE_ULONG_TOKEN);}
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 102 "H5LTanalyze.l"
+#line 113 "hl/src/H5LTanalyze.l"
 {return hid(H5T_NATIVE_LLONG_TOKEN);}
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 103 "H5LTanalyze.l"
+#line 114 "hl/src/H5LTanalyze.l"
 {return hid(H5T_NATIVE_ULLONG_TOKEN);}
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 105 "H5LTanalyze.l"
+#line 116 "hl/src/H5LTanalyze.l"
 {return hid(H5T_IEEE_F32BE_TOKEN);}
 	YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 106 "H5LTanalyze.l"
+#line 117 "hl/src/H5LTanalyze.l"
 {return hid(H5T_IEEE_F32LE_TOKEN);}
 	YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 107 "H5LTanalyze.l"
+#line 118 "hl/src/H5LTanalyze.l"
 {return hid(H5T_IEEE_F64BE_TOKEN);}
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 108 "H5LTanalyze.l"
+#line 119 "hl/src/H5LTanalyze.l"
 {return hid(H5T_IEEE_F64LE_TOKEN);}
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 109 "H5LTanalyze.l"
+#line 120 "hl/src/H5LTanalyze.l"
 {return hid(H5T_NATIVE_FLOAT_TOKEN);}
 	YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 110 "H5LTanalyze.l"
+#line 121 "hl/src/H5LTanalyze.l"
 {return hid(H5T_NATIVE_DOUBLE_TOKEN);}
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 111 "H5LTanalyze.l"
+#line 122 "hl/src/H5LTanalyze.l"
 {return hid(H5T_NATIVE_LDOUBLE_TOKEN);}
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 113 "H5LTanalyze.l"
+#line 124 "hl/src/H5LTanalyze.l"
 {return token(H5T_STRING_TOKEN);}
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 114 "H5LTanalyze.l"
+#line 125 "hl/src/H5LTanalyze.l"
 {return token(STRSIZE_TOKEN);}
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 115 "H5LTanalyze.l"
+#line 126 "hl/src/H5LTanalyze.l"
 {return token(STRPAD_TOKEN);}
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 116 "H5LTanalyze.l"
+#line 127 "hl/src/H5LTanalyze.l"
 {return token(CSET_TOKEN);}
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 117 "H5LTanalyze.l"
+#line 128 "hl/src/H5LTanalyze.l"
 {return token(CTYPE_TOKEN);}
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 118 "H5LTanalyze.l"
+#line 129 "hl/src/H5LTanalyze.l"
 {return token(H5T_STR_NULLTERM_TOKEN);} 
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 119 "H5LTanalyze.l"
+#line 130 "hl/src/H5LTanalyze.l"
 {return token(H5T_STR_NULLPAD_TOKEN);} 
 	YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 120 "H5LTanalyze.l"
+#line 131 "hl/src/H5LTanalyze.l"
 {return token(H5T_STR_SPACEPAD_TOKEN);} 
 	YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 121 "H5LTanalyze.l"
+#line 132 "hl/src/H5LTanalyze.l"
 {return token(H5T_CSET_ASCII_TOKEN);}
 	YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 122 "H5LTanalyze.l"
+#line 133 "hl/src/H5LTanalyze.l"
 {return token(H5T_CSET_UTF8_TOKEN);}
 	YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 123 "H5LTanalyze.l"
+#line 134 "hl/src/H5LTanalyze.l"
 {return token(H5T_C_S1_TOKEN);}
 	YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 124 "H5LTanalyze.l"
+#line 135 "hl/src/H5LTanalyze.l"
 {return token(H5T_FORTRAN_S1_TOKEN);}
 	YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 125 "H5LTanalyze.l"
+#line 136 "hl/src/H5LTanalyze.l"
 {return token(H5T_VARIABLE_TOKEN);}
 	YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 127 "H5LTanalyze.l"
+#line 138 "hl/src/H5LTanalyze.l"
 {return token(H5T_COMPOUND_TOKEN);}
 	YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 128 "H5LTanalyze.l"
+#line 139 "hl/src/H5LTanalyze.l"
 {return token(H5T_ENUM_TOKEN);}
 	YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 129 "H5LTanalyze.l"
+#line 140 "hl/src/H5LTanalyze.l"
 {return token(H5T_ARRAY_TOKEN);}
 	YY_BREAK
 case 51:
 YY_RULE_SETUP
-#line 130 "H5LTanalyze.l"
+#line 141 "hl/src/H5LTanalyze.l"
 {return token(H5T_VLEN_TOKEN);}
 	YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 132 "H5LTanalyze.l"
+#line 143 "hl/src/H5LTanalyze.l"
 {return token(H5T_OPAQUE_TOKEN);}
 	YY_BREAK
 case 53:
 YY_RULE_SETUP
-#line 133 "H5LTanalyze.l"
+#line 144 "hl/src/H5LTanalyze.l"
 {return token(OPQ_SIZE_TOKEN);}
 	YY_BREAK
 case 54:
 YY_RULE_SETUP
-#line 134 "H5LTanalyze.l"
+#line 145 "hl/src/H5LTanalyze.l"
 {return token(OPQ_TAG_TOKEN);}
 	YY_BREAK
 case 55:
 YY_RULE_SETUP
-#line 136 "H5LTanalyze.l"
+#line 147 "hl/src/H5LTanalyze.l"
 {    
                         if( is_str_size || (is_enum && is_enum_memb) || 
                             is_opq_size || (asindex>-1 && arr_stack[asindex].is_dim) ||
@@ -1487,7 +1515,7 @@ YY_RULE_SETUP
 	YY_BREAK
 case 56:
 YY_RULE_SETUP
-#line 146 "H5LTanalyze.l"
+#line 157 "hl/src/H5LTanalyze.l"
 {
                     /*if it's first quote, and is a compound field name or an enum symbol*/
                     if((is_opq_tag || is_enum || (csindex>-1 && cmpd_stack[csindex].is_field)) 
@@ -1502,7 +1530,7 @@ YY_RULE_SETUP
 case 57:
 /* rule 57 can match eol */
 YY_RULE_SETUP
-#line 156 "H5LTanalyze.l"
+#line 167 "hl/src/H5LTanalyze.l"
 {
 #ifdef H5_HAVE_WIN32_API
                     H5LTyylval.sval = _strdup(H5LTyytext);
@@ -1515,52 +1543,52 @@ YY_RULE_SETUP
 	YY_BREAK
 case 58:
 YY_RULE_SETUP
-#line 166 "H5LTanalyze.l"
+#line 177 "hl/src/H5LTanalyze.l"
 {return token('{');}
 	YY_BREAK
 case 59:
 YY_RULE_SETUP
-#line 167 "H5LTanalyze.l"
+#line 178 "hl/src/H5LTanalyze.l"
 {return token('}');}
 	YY_BREAK
 case 60:
 YY_RULE_SETUP
-#line 168 "H5LTanalyze.l"
+#line 179 "hl/src/H5LTanalyze.l"
 {return token('[');}
 	YY_BREAK
 case 61:
 YY_RULE_SETUP
-#line 169 "H5LTanalyze.l"
+#line 180 "hl/src/H5LTanalyze.l"
 {return token(']');}
 	YY_BREAK
 case 62:
 YY_RULE_SETUP
-#line 170 "H5LTanalyze.l"
+#line 181 "hl/src/H5LTanalyze.l"
 {return token(':');}
 	YY_BREAK
 case 63:
 YY_RULE_SETUP
-#line 171 "H5LTanalyze.l"
+#line 182 "hl/src/H5LTanalyze.l"
 {return token(';');}
 	YY_BREAK
 case 64:
 /* rule 64 can match eol */
 YY_RULE_SETUP
-#line 172 "H5LTanalyze.l"
+#line 183 "hl/src/H5LTanalyze.l"
 ;
 	YY_BREAK
 case 65:
 /* rule 65 can match eol */
 YY_RULE_SETUP
-#line 173 "H5LTanalyze.l"
+#line 184 "hl/src/H5LTanalyze.l"
 { return 0; }
 	YY_BREAK
 case 66:
 YY_RULE_SETUP
-#line 175 "H5LTanalyze.l"
+#line 186 "hl/src/H5LTanalyze.l"
 ECHO;
 	YY_BREAK
-#line 1545 "H5LTanalyze.c"
+#line 1570 "hl/src/H5LTanalyze.c"
 			case YY_STATE_EOF(INITIAL):
 			case YY_STATE_EOF(TAG_STRING):
 				yyterminate();
@@ -1692,6 +1720,7 @@ ECHO;
 			"fatal flex scanner internal error--no action found" );
 	} /* end of action switch */
 		} /* end of scanning one token */
+	} /* end of user's declarations */
 } /* end of H5LTyylex */
 
 /* yy_get_next_buffer - try to read in a new buffer
@@ -2291,7 +2320,7 @@ YY_BUFFER_STATE H5LTyy_scan_bytes  (yyconst char * yybytes, yy_size_t  _yybytes_
 	YY_BUFFER_STATE b;
 	char *buf;
 	yy_size_t n;
-	int i;
+	yy_size_t i;
     
 	/* Get memory for full buffer, including space for trailing EOB's. */
 	n = _yybytes_len + 2;
@@ -2529,7 +2558,7 @@ void H5LTyyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 175 "H5LTanalyze.l"
+#line 185 "hl/src/H5LTanalyze.l"
 
 
 int my_yyinput(char *buf, int max_size)
diff --git a/hl/src/H5LTanalyze.l b/hl/src/H5LTanalyze.l
index 6c883fc..a0c4f42 100644
--- a/hl/src/H5LTanalyze.l
+++ b/hl/src/H5LTanalyze.l
@@ -13,12 +13,23 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
+/* NOTE!
+ *
+ * If you make any changes to H5LTanalyze.l, please run bin/genparser to
+ * recreate the output files.
+ */
+
 %{
 #include <stdlib.h>
 #include <string.h>
 #include <hdf5.h>
 #include "H5LTparse.h"
 
+/* Turn off suggest const attribute warning in gcc */
+#if __GNUC__ >= 4 && __GNUC_MINOR__ >=2 
+#pragma GCC diagnostic ignored "-Wsuggest-attribute=const"
+#endif 
+
 int my_yyinput(char *, int);
 #undef YY_INPUT
 #define YY_INPUT(b, r, ms) (r=my_yyinput(b, ms))
diff --git a/hl/src/H5LTparse.c b/hl/src/H5LTparse.c
index 6ca95c5..5835dcc 100644
--- a/hl/src/H5LTparse.c
+++ b/hl/src/H5LTparse.c
@@ -5,9 +5,12 @@
 #pragma GCC diagnostic ignored "-Wmissing-prototypes"             
 #pragma GCC diagnostic ignored "-Wnested-externs"                 
 #pragma GCC diagnostic ignored "-Wold-style-definition"           
+#pragma GCC diagnostic ignored "-Wredundant-decls"                
 #pragma GCC diagnostic ignored "-Wsign-compare"                   
 #pragma GCC diagnostic ignored "-Wsign-conversion"                
+#pragma GCC diagnostic ignored "-Wstrict-overflow"                
 #pragma GCC diagnostic ignored "-Wstrict-prototypes"              
+#pragma GCC diagnostic ignored "-Wsuggest-attribute=pure"         
 #pragma GCC diagnostic ignored "-Wswitch-default"                 
 #pragma GCC diagnostic ignored "-Wunused-function"                
 #pragma GCC diagnostic ignored "-Wunused-macros"                  
@@ -17,22 +20,22 @@
 #elif defined _MSC_VER                                            
 #pragma warning(push, 1)                                          
 #endif                                                            
-/* A Bison parser, made by GNU Bison 2.7.  */
+/* A Bison parser, made by GNU Bison 3.0.2.  */
 
 /* Bison implementation for Yacc-like parsers in C
-   
-      Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc.
-   
+
+   Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
+
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
@@ -45,7 +48,7 @@
    special exception, which will cause the skeleton and the resulting
    Bison output files to be licensed under the GNU General Public
    License without this special exception.
-   
+
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
@@ -63,7 +66,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "2.7"
+#define YYBISON_VERSION "3.0.2"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -82,14 +85,14 @@
 #define yyparse         H5LTyyparse
 #define yylex           H5LTyylex
 #define yyerror         H5LTyyerror
-#define yylval          H5LTyylval
-#define yychar          H5LTyychar
 #define yydebug         H5LTyydebug
 #define yynerrs         H5LTyynerrs
 
+#define yylval          H5LTyylval
+#define yychar          H5LTyychar
+
 /* Copy the first part of user declarations.  */
-/* Line 371 of yacc.c  */
-#line 16 "H5LTparse.y"
+#line 22 "hl/src/H5LTparse.y" /* yacc.c:339  */
 
 #include <stdio.h>
 #include <string.h>
@@ -142,14 +145,13 @@ hbool_t is_opq_size = 0;            /*flag to lexer for opaque type size*/
 hbool_t is_opq_tag = 0;             /*flag to lexer for opaque type tag*/
 
 
-/* Line 371 of yacc.c  */
-#line 128 "H5LTparse.c"
+#line 127 "hl/src/H5LTparse.c" /* yacc.c:339  */
 
-# ifndef YY_NULL
+# ifndef YY_NULLPTR
 #  if defined __cplusplus && 201103L <= __cplusplus
-#   define YY_NULL nullptr
+#   define YY_NULLPTR nullptr
 #  else
-#   define YY_NULL 0
+#   define YY_NULLPTR 0
 #  endif
 # endif
 
@@ -163,9 +165,9 @@ hbool_t is_opq_tag = 0;             /*flag to lexer for opaque type tag*/
 
 /* In a future release of Bison, this section will be replaced
    by #include "H5LTparse.h".  */
-#ifndef YY_H5LTYY_H5LTPARSE_H_INCLUDED
-# define YY_H5LTYY_H5LTPARSE_H_INCLUDED
-/* Enabling traces.  */
+#ifndef YY_H5LTYY_HL_SRC_H5LTPARSE_H_INCLUDED
+# define YY_H5LTYY_HL_SRC_H5LTPARSE_H_INCLUDED
+/* Debug traces.  */
 #ifndef YYDEBUG
 # define YYDEBUG 0
 #endif
@@ -173,113 +175,97 @@ hbool_t is_opq_tag = 0;             /*flag to lexer for opaque type tag*/
 extern int H5LTyydebug;
 #endif
 
-/* Tokens.  */
+/* Token type.  */
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum yytokentype {
-     H5T_STD_I8BE_TOKEN = 258,
-     H5T_STD_I8LE_TOKEN = 259,
-     H5T_STD_I16BE_TOKEN = 260,
-     H5T_STD_I16LE_TOKEN = 261,
-     H5T_STD_I32BE_TOKEN = 262,
-     H5T_STD_I32LE_TOKEN = 263,
-     H5T_STD_I64BE_TOKEN = 264,
-     H5T_STD_I64LE_TOKEN = 265,
-     H5T_STD_U8BE_TOKEN = 266,
-     H5T_STD_U8LE_TOKEN = 267,
-     H5T_STD_U16BE_TOKEN = 268,
-     H5T_STD_U16LE_TOKEN = 269,
-     H5T_STD_U32BE_TOKEN = 270,
-     H5T_STD_U32LE_TOKEN = 271,
-     H5T_STD_U64BE_TOKEN = 272,
-     H5T_STD_U64LE_TOKEN = 273,
-     H5T_NATIVE_CHAR_TOKEN = 274,
-     H5T_NATIVE_SCHAR_TOKEN = 275,
-     H5T_NATIVE_UCHAR_TOKEN = 276,
-     H5T_NATIVE_SHORT_TOKEN = 277,
-     H5T_NATIVE_USHORT_TOKEN = 278,
-     H5T_NATIVE_INT_TOKEN = 279,
-     H5T_NATIVE_UINT_TOKEN = 280,
-     H5T_NATIVE_LONG_TOKEN = 281,
-     H5T_NATIVE_ULONG_TOKEN = 282,
-     H5T_NATIVE_LLONG_TOKEN = 283,
-     H5T_NATIVE_ULLONG_TOKEN = 284,
-     H5T_IEEE_F32BE_TOKEN = 285,
-     H5T_IEEE_F32LE_TOKEN = 286,
-     H5T_IEEE_F64BE_TOKEN = 287,
-     H5T_IEEE_F64LE_TOKEN = 288,
-     H5T_NATIVE_FLOAT_TOKEN = 289,
-     H5T_NATIVE_DOUBLE_TOKEN = 290,
-     H5T_NATIVE_LDOUBLE_TOKEN = 291,
-     H5T_STRING_TOKEN = 292,
-     STRSIZE_TOKEN = 293,
-     STRPAD_TOKEN = 294,
-     CSET_TOKEN = 295,
-     CTYPE_TOKEN = 296,
-     H5T_VARIABLE_TOKEN = 297,
-     H5T_STR_NULLTERM_TOKEN = 298,
-     H5T_STR_NULLPAD_TOKEN = 299,
-     H5T_STR_SPACEPAD_TOKEN = 300,
-     H5T_CSET_ASCII_TOKEN = 301,
-     H5T_CSET_UTF8_TOKEN = 302,
-     H5T_C_S1_TOKEN = 303,
-     H5T_FORTRAN_S1_TOKEN = 304,
-     H5T_OPAQUE_TOKEN = 305,
-     OPQ_SIZE_TOKEN = 306,
-     OPQ_TAG_TOKEN = 307,
-     H5T_COMPOUND_TOKEN = 308,
-     H5T_ENUM_TOKEN = 309,
-     H5T_ARRAY_TOKEN = 310,
-     H5T_VLEN_TOKEN = 311,
-     STRING = 312,
-     NUMBER = 313
-   };
+  enum yytokentype
+  {
+    H5T_STD_I8BE_TOKEN = 258,
+    H5T_STD_I8LE_TOKEN = 259,
+    H5T_STD_I16BE_TOKEN = 260,
+    H5T_STD_I16LE_TOKEN = 261,
+    H5T_STD_I32BE_TOKEN = 262,
+    H5T_STD_I32LE_TOKEN = 263,
+    H5T_STD_I64BE_TOKEN = 264,
+    H5T_STD_I64LE_TOKEN = 265,
+    H5T_STD_U8BE_TOKEN = 266,
+    H5T_STD_U8LE_TOKEN = 267,
+    H5T_STD_U16BE_TOKEN = 268,
+    H5T_STD_U16LE_TOKEN = 269,
+    H5T_STD_U32BE_TOKEN = 270,
+    H5T_STD_U32LE_TOKEN = 271,
+    H5T_STD_U64BE_TOKEN = 272,
+    H5T_STD_U64LE_TOKEN = 273,
+    H5T_NATIVE_CHAR_TOKEN = 274,
+    H5T_NATIVE_SCHAR_TOKEN = 275,
+    H5T_NATIVE_UCHAR_TOKEN = 276,
+    H5T_NATIVE_SHORT_TOKEN = 277,
+    H5T_NATIVE_USHORT_TOKEN = 278,
+    H5T_NATIVE_INT_TOKEN = 279,
+    H5T_NATIVE_UINT_TOKEN = 280,
+    H5T_NATIVE_LONG_TOKEN = 281,
+    H5T_NATIVE_ULONG_TOKEN = 282,
+    H5T_NATIVE_LLONG_TOKEN = 283,
+    H5T_NATIVE_ULLONG_TOKEN = 284,
+    H5T_IEEE_F32BE_TOKEN = 285,
+    H5T_IEEE_F32LE_TOKEN = 286,
+    H5T_IEEE_F64BE_TOKEN = 287,
+    H5T_IEEE_F64LE_TOKEN = 288,
+    H5T_NATIVE_FLOAT_TOKEN = 289,
+    H5T_NATIVE_DOUBLE_TOKEN = 290,
+    H5T_NATIVE_LDOUBLE_TOKEN = 291,
+    H5T_STRING_TOKEN = 292,
+    STRSIZE_TOKEN = 293,
+    STRPAD_TOKEN = 294,
+    CSET_TOKEN = 295,
+    CTYPE_TOKEN = 296,
+    H5T_VARIABLE_TOKEN = 297,
+    H5T_STR_NULLTERM_TOKEN = 298,
+    H5T_STR_NULLPAD_TOKEN = 299,
+    H5T_STR_SPACEPAD_TOKEN = 300,
+    H5T_CSET_ASCII_TOKEN = 301,
+    H5T_CSET_UTF8_TOKEN = 302,
+    H5T_C_S1_TOKEN = 303,
+    H5T_FORTRAN_S1_TOKEN = 304,
+    H5T_OPAQUE_TOKEN = 305,
+    OPQ_SIZE_TOKEN = 306,
+    OPQ_TAG_TOKEN = 307,
+    H5T_COMPOUND_TOKEN = 308,
+    H5T_ENUM_TOKEN = 309,
+    H5T_ARRAY_TOKEN = 310,
+    H5T_VLEN_TOKEN = 311,
+    STRING = 312,
+    NUMBER = 313
+  };
 #endif
 
-
+/* Value type.  */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
+typedef union YYSTYPE YYSTYPE;
+union YYSTYPE
 {
-/* Line 387 of yacc.c  */
-#line 68 "H5LTparse.y"
+#line 74 "hl/src/H5LTparse.y" /* yacc.c:355  */
 
     int     ival;         /*for integer token*/
     char    *sval;        /*for name string*/
     hid_t   hid;          /*for hid_t token*/
 
-
-/* Line 387 of yacc.c  */
-#line 236 "H5LTparse.c"
-} YYSTYPE;
+#line 232 "hl/src/H5LTparse.c" /* yacc.c:355  */
+};
 # define YYSTYPE_IS_TRIVIAL 1
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 #endif
 
+
 extern YYSTYPE H5LTyylval;
 
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-hid_t H5LTyyparse (void *YYPARSE_PARAM);
-#else
-hid_t H5LTyyparse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
 hid_t H5LTyyparse (void);
-#else
-hid_t H5LTyyparse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
 
-#endif /* !YY_H5LTYY_H5LTPARSE_H_INCLUDED  */
+#endif /* !YY_H5LTYY_HL_SRC_H5LTPARSE_H_INCLUDED  */
 
 /* Copy the second part of user declarations.  */
 
-/* Line 390 of yacc.c  */
-#line 264 "H5LTparse.c"
+#line 247 "hl/src/H5LTparse.c" /* yacc.c:358  */
 
 #ifdef short
 # undef short
@@ -293,11 +279,8 @@ typedef unsigned char yytype_uint8;
 
 #ifdef YYTYPE_INT8
 typedef YYTYPE_INT8 yytype_int8;
-#elif (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-typedef signed char yytype_int8;
 #else
-typedef short int yytype_int8;
+typedef signed char yytype_int8;
 #endif
 
 #ifdef YYTYPE_UINT16
@@ -317,8 +300,7 @@ typedef short int yytype_int16;
 #  define YYSIZE_T __SIZE_TYPE__
 # elif defined size_t
 #  define YYSIZE_T size_t
-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
+# elif ! defined YYSIZE_T
 #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
 #  define YYSIZE_T size_t
 # else
@@ -340,6 +322,33 @@ typedef short int yytype_int16;
 # endif
 #endif
 
+#ifndef YY_ATTRIBUTE
+# if (defined __GNUC__                                               \
+      && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__)))  \
+     || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
+#  define YY_ATTRIBUTE(Spec) __attribute__(Spec)
+# else
+#  define YY_ATTRIBUTE(Spec) /* empty */
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE_PURE
+# define YY_ATTRIBUTE_PURE   YY_ATTRIBUTE ((__pure__))
+#endif
+
+#ifndef YY_ATTRIBUTE_UNUSED
+# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
+#endif
+
+#if !defined _Noreturn \
+     && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
+# if defined _MSC_VER && 1200 <= _MSC_VER
+#  define _Noreturn __declspec (noreturn)
+# else
+#  define _Noreturn YY_ATTRIBUTE ((__noreturn__))
+# endif
+#endif
+
 /* Suppress unused-variable warnings by "using" E.  */
 #if ! defined lint || defined __GNUC__
 # define YYUSE(E) ((void) (E))
@@ -347,23 +356,25 @@ typedef short int yytype_int16;
 # define YYUSE(E) /* empty */
 #endif
 
-/* Identity function, used to suppress warnings about constant conditions.  */
-#ifndef lint
-# define YYID(N) (N)
+#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
+/* Suppress an incorrect diagnostic about yylval being uninitialized.  */
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+    _Pragma ("GCC diagnostic push") \
+    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
+    _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+    _Pragma ("GCC diagnostic pop")
 #else
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static int
-YYID (int yyi)
-#else
-static int
-YYID (yyi)
-    int yyi;
+# define YY_INITIAL_VALUE(Value) Value
 #endif
-{
-  return yyi;
-}
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
 #endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
+#endif
+
 
 #if ! defined yyoverflow || YYERROR_VERBOSE
 
@@ -382,8 +393,7 @@ YYID (yyi)
 #    define alloca _alloca
 #   else
 #    define YYSTACK_ALLOC alloca
-#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
+#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
 #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
       /* Use EXIT_SUCCESS as a witness for stdlib.h.  */
 #     ifndef EXIT_SUCCESS
@@ -395,8 +405,8 @@ YYID (yyi)
 # endif
 
 # ifdef YYSTACK_ALLOC
-   /* Pacify GCC's `empty if-body' warning.  */
-#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
+   /* Pacify GCC's 'empty if-body' warning.  */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
 #  ifndef YYSTACK_ALLOC_MAXIMUM
     /* The OS might guarantee only one guard page at the bottom of the stack,
        and a page size can be as small as 4096 bytes.  So we cannot safely
@@ -412,7 +422,7 @@ YYID (yyi)
 #  endif
 #  if (defined __cplusplus && ! defined EXIT_SUCCESS \
        && ! ((defined YYMALLOC || defined malloc) \
-	     && (defined YYFREE || defined free)))
+             && (defined YYFREE || defined free)))
 #   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
 #   ifndef EXIT_SUCCESS
 #    define EXIT_SUCCESS 0
@@ -420,15 +430,13 @@ YYID (yyi)
 #  endif
 #  ifndef YYMALLOC
 #   define YYMALLOC malloc
-#   if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
+#   if ! defined malloc && ! defined EXIT_SUCCESS
 void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
 #  ifndef YYFREE
 #   define YYFREE free
-#   if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
+#   if ! defined free && ! defined EXIT_SUCCESS
 void free (void *); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
@@ -438,7 +446,7 @@ void free (void *); /* INFRINGES ON USER NAME SPACE */
 
 #if (! defined yyoverflow \
      && (! defined __cplusplus \
-	 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+         || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
 
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
@@ -463,16 +471,16 @@ union yyalloc
    elements in the stack, and YYPTR gives the new location of the
    stack.  Advance YYPTR to a properly aligned location for the next
    stack.  */
-# define YYSTACK_RELOCATE(Stack_alloc, Stack)				\
-    do									\
-      {									\
-	YYSIZE_T yynewbytes;						\
-	YYCOPY (&yyptr->Stack_alloc, Stack, yysize);			\
-	Stack = &yyptr->Stack_alloc;					\
-	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
-	yyptr += yynewbytes / sizeof (*yyptr);				\
-      }									\
-    while (YYID (0))
+# define YYSTACK_RELOCATE(Stack_alloc, Stack)                           \
+    do                                                                  \
+      {                                                                 \
+        YYSIZE_T yynewbytes;                                            \
+        YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
+        Stack = &yyptr->Stack_alloc;                                    \
+        yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+        yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                 \
+    while (0)
 
 #endif
 
@@ -491,7 +499,7 @@ union yyalloc
           for (yyi = 0; yyi < (Count); yyi++)   \
             (Dst)[yyi] = (Src)[yyi];            \
         }                                       \
-      while (YYID (0))
+      while (0)
 #  endif
 # endif
 #endif /* !YYCOPY_NEEDED */
@@ -507,17 +515,19 @@ union yyalloc
 #define YYNNTS  46
 /* YYNRULES -- Number of rules.  */
 #define YYNRULES  95
-/* YYNRULES -- Number of states.  */
+/* YYNSTATES -- Number of states.  */
 #define YYNSTATES  143
 
-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
+   by yylex, with out-of-bounds checking.  */
 #define YYUNDEFTOK  2
 #define YYMAXUTOK   313
 
-#define YYTRANSLATE(YYX)						\
+#define YYTRANSLATE(YYX)                                                \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
 
-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
+   as returned by yylex, without out-of-bounds checking.  */
 static const yytype_uint8 yytranslate[] =
 {
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -555,64 +565,19 @@ static const yytype_uint8 yytranslate[] =
 };
 
 #if YYDEBUG
-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
-   YYRHS.  */
-static const yytype_uint8 yyprhs[] =
-{
-       0,     0,     3,     4,     6,     8,    10,    12,    14,    16,
-      18,    20,    22,    24,    26,    28,    30,    32,    34,    36,
-      38,    40,    42,    44,    46,    48,    50,    52,    54,    56,
-      58,    60,    62,    64,    66,    68,    70,    72,    74,    76,
-      78,    80,    82,    84,    86,    88,    90,    92,    93,    99,
-     100,   103,   104,   112,   114,   115,   118,   120,   121,   128,
-     129,   132,   133,   134,   140,   142,   147,   148,   149,   150,
-     151,   167,   169,   171,   172,   173,   174,   175,   176,   197,
-     199,   201,   203,   205,   207,   209,   211,   213,   215,   216,
-     224,   225,   228,   229,   236,   238
-};
-
-/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
-static const yytype_int8 yyrhs[] =
-{
-      67,     0,    -1,    -1,    68,    -1,    69,    -1,    72,    -1,
-      80,    -1,    87,    -1,    70,    -1,    71,    -1,    95,    -1,
-     105,    -1,    88,    -1,     3,    -1,     4,    -1,     5,    -1,
-       6,    -1,     7,    -1,     8,    -1,     9,    -1,    10,    -1,
-      11,    -1,    12,    -1,    13,    -1,    14,    -1,    15,    -1,
-      16,    -1,    17,    -1,    18,    -1,    19,    -1,    20,    -1,
-      21,    -1,    22,    -1,    23,    -1,    24,    -1,    25,    -1,
-      26,    -1,    27,    -1,    28,    -1,    29,    -1,    30,    -1,
-      31,    -1,    32,    -1,    33,    -1,    34,    -1,    35,    -1,
-      36,    -1,    -1,    53,    73,    59,    74,    60,    -1,    -1,
-      74,    75,    -1,    -1,    68,    76,    63,    77,    63,    78,
-      65,    -1,    57,    -1,    -1,    64,    79,    -1,    58,    -1,
-      -1,    55,    81,    59,    82,    68,    60,    -1,    -1,    82,
-      83,    -1,    -1,    -1,    61,    84,    86,    85,    62,    -1,
-      58,    -1,    56,    59,    68,    60,    -1,    -1,    -1,    -1,
-      -1,    50,    59,    51,    89,    93,    65,    90,    52,    91,
-      63,    94,    63,    65,    92,    60,    -1,    58,    -1,    57,
-      -1,    -1,    -1,    -1,    -1,    -1,    37,    59,    38,    96,
-     101,    65,    97,    39,   102,    65,    98,    40,   103,    65,
-      99,    41,   104,    65,   100,    60,    -1,    42,    -1,    58,
-      -1,    43,    -1,    44,    -1,    45,    -1,    46,    -1,    47,
-      -1,    48,    -1,    49,    -1,    -1,    54,    59,    70,    65,
-     106,   107,    60,    -1,    -1,   107,   108,    -1,    -1,    63,
-     110,    63,   109,   111,    65,    -1,    57,    -1,    58,    -1
-};
-
-/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+  /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   101,   101,   102,   104,   105,   106,   107,   109,   110,
-     111,   112,   113,   116,   117,   118,   119,   120,   121,   122,
-     123,   124,   125,   126,   127,   128,   129,   130,   131,   132,
-     133,   134,   135,   136,   137,   138,   139,   140,   141,   142,
-     145,   146,   147,   148,   149,   150,   151,   155,   154,   163,
-     164,   166,   166,   200,   206,   207,   210,   212,   212,   221,
-     222,   224,   225,   224,   232,   235,   241,   242,   247,   248,
-     239,   254,   256,   260,   261,   269,   278,   285,   258,   309,
-     310,   312,   313,   314,   316,   317,   319,   320,   324,   323,
-     328,   329,   331,   331,   383,   385
+       0,   107,   107,   108,   110,   111,   112,   113,   115,   116,
+     117,   118,   119,   122,   123,   124,   125,   126,   127,   128,
+     129,   130,   131,   132,   133,   134,   135,   136,   137,   138,
+     139,   140,   141,   142,   143,   144,   145,   146,   147,   148,
+     151,   152,   153,   154,   155,   156,   157,   161,   160,   169,
+     170,   172,   172,   209,   217,   218,   221,   223,   223,   232,
+     233,   235,   236,   235,   243,   246,   252,   253,   258,   259,
+     250,   267,   269,   273,   274,   282,   291,   298,   271,   322,
+     323,   325,   326,   327,   329,   330,   332,   333,   337,   336,
+     341,   342,   344,   344,   398,   400
 };
 #endif
 
@@ -649,13 +614,13 @@ static const char *const yytname[] =
   "$@5", "dimsize", "vlen_type", "opaque_type", "$@6", "@7", "$@8", "$@9",
   "opaque_size", "opaque_tag", "string_type", "$@10", "$@11", "$@12",
   "$@13", "@14", "strsize", "strpad", "cset", "ctype", "enum_type", "$@15",
-  "enum_list", "enum_def", "$@16", "enum_symbol", "enum_val", YY_NULL
+  "enum_list", "enum_def", "$@16", "enum_symbol", "enum_val", YY_NULLPTR
 };
 #endif
 
 # ifdef YYPRINT
-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
-   token YYLEX-NUM.  */
+/* YYTOKNUM[NUM] -- (External) token number corresponding to the
+   (internal) symbol number NUM (which must be that of a token).  */
 static const yytype_uint16 yytoknum[] =
 {
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
@@ -668,71 +633,18 @@ static const yytype_uint16 yytoknum[] =
 };
 # endif
 
-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-static const yytype_uint8 yyr1[] =
-{
-       0,    66,    67,    67,    68,    68,    68,    68,    69,    69,
-      69,    69,    69,    70,    70,    70,    70,    70,    70,    70,
-      70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
-      70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
-      71,    71,    71,    71,    71,    71,    71,    73,    72,    74,
-      74,    76,    75,    77,    78,    78,    79,    81,    80,    82,
-      82,    84,    85,    83,    86,    87,    89,    90,    91,    92,
-      88,    93,    94,    96,    97,    98,    99,   100,    95,   101,
-     101,   102,   102,   102,   103,   103,   104,   104,   106,   105,
-     107,   107,   109,   108,   110,   111
-};
+#define YYPACT_NINF -25
 
-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
-static const yytype_uint8 yyr2[] =
-{
-       0,     2,     0,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     0,     5,     0,
-       2,     0,     7,     1,     0,     2,     1,     0,     6,     0,
-       2,     0,     0,     5,     1,     4,     0,     0,     0,     0,
-      15,     1,     1,     0,     0,     0,     0,     0,    20,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     0,     7,
-       0,     2,     0,     6,     1,     1
-};
+#define yypact_value_is_default(Yystate) \
+  (!!((Yystate) == (-25)))
 
-/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
-   Performed when YYTABLE doesn't specify something else to do.  Zero
-   means the default is an error.  */
-static const yytype_uint8 yydefact[] =
-{
-       2,    13,    14,    15,    16,    17,    18,    19,    20,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,     0,     0,    47,     0,    57,
-       0,     0,     3,     4,     8,     9,     5,     6,     7,    12,
-      10,    11,     0,     0,     0,     0,     0,     0,     1,    73,
-      66,    49,     0,    59,     0,     0,     0,     0,    88,     0,
-      65,    79,    80,     0,    71,     0,    48,    51,    50,    90,
-      61,     0,    60,    74,    67,     0,     0,     0,    58,     0,
-       0,     0,    89,     0,    91,    64,    62,     0,    68,    53,
-       0,    94,     0,     0,    81,    82,    83,     0,     0,    54,
-      92,    63,    75,     0,     0,     0,     0,     0,    72,     0,
-      56,    55,    52,    95,     0,     0,     0,    93,    84,    85,
-       0,    69,    76,     0,     0,    70,     0,    86,    87,     0,
-      77,     0,    78
-};
+#define YYTABLE_NINF -1
 
-/* YYDEFGOTO[NTERM-NUM].  */
-static const yytype_int16 yydefgoto[] =
-{
-      -1,    41,    42,    43,    44,    45,    46,    54,    67,    78,
-      85,   100,   115,   121,    47,    56,    69,    82,    87,   103,
-      96,    48,    49,    66,    90,   108,   133,    75,   119,    50,
-      65,    89,   117,   134,   141,    73,   107,   130,   139,    51,
-      79,    86,    94,   116,   102,   124
-};
+#define yytable_value_is_error(Yytable_value) \
+  0
 
-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-   STATE-NUM.  */
-#define YYPACT_NINF -25
+  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+     STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
      114,   -25,   -25,   -25,   -25,   -25,   -25,   -25,   -25,   -25,
@@ -752,7 +664,29 @@ static const yytype_int16 yypact[] =
      -25,   143,   -25
 };
 
-/* YYPGOTO[NTERM-NUM].  */
+  /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+     Performed when YYTABLE does not specify something else to do.  Zero
+     means the default is an error.  */
+static const yytype_uint8 yydefact[] =
+{
+       2,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    38,    39,    40,    41,
+      42,    43,    44,    45,    46,     0,     0,    47,     0,    57,
+       0,     0,     3,     4,     8,     9,     5,     6,     7,    12,
+      10,    11,     0,     0,     0,     0,     0,     0,     1,    73,
+      66,    49,     0,    59,     0,     0,     0,     0,    88,     0,
+      65,    79,    80,     0,    71,     0,    48,    51,    50,    90,
+      61,     0,    60,    74,    67,     0,     0,     0,    58,     0,
+       0,     0,    89,     0,    91,    64,    62,     0,    68,    53,
+       0,    94,     0,     0,    81,    82,    83,     0,     0,    54,
+      92,    63,    75,     0,     0,     0,     0,     0,    72,     0,
+      56,    55,    52,    95,     0,     0,     0,    93,    84,    85,
+       0,    69,    76,     0,     0,    70,     0,    86,    87,     0,
+      77,     0,    78
+};
+
+  /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int8 yypgoto[] =
 {
      -25,   -25,   -21,   -25,   108,   -25,   -25,   -25,   -25,   -25,
@@ -762,10 +696,19 @@ static const yytype_int8 yypgoto[] =
      -25,   -25,   -25,   -25,   -25,   -25
 };
 
-/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
-   positive, shift that token.  If negative, reduce the rule which
-   number is the opposite.  If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -1
+  /* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_int16 yydefgoto[] =
+{
+      -1,    41,    42,    43,    44,    45,    46,    54,    67,    78,
+      85,   100,   115,   121,    47,    56,    69,    82,    87,   103,
+      96,    48,    49,    66,    90,   108,   133,    75,   119,    50,
+      65,    89,   117,   134,   141,    73,   107,   130,   139,    51,
+      79,    86,    94,   116,   102,   124
+};
+
+  /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
+     positive, shift that token.  If negative, reduce the rule whose
+     number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_uint8 yytable[] =
 {
        1,     2,     3,     4,     5,     6,     7,     8,     9,    10,
@@ -791,12 +734,6 @@ static const yytype_uint8 yytable[] =
      132,   136,   140,   142
 };
 
-#define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-25)))
-
-#define yytable_value_is_error(Yytable_value) \
-  YYID (0)
-
 static const yytype_uint8 yycheck[] =
 {
        3,     4,     5,     6,     7,     8,     9,    10,    11,    12,
@@ -822,8 +759,8 @@ static const yytype_uint8 yycheck[] =
       65,    41,    65,    60
 };
 
-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-   symbol of state STATE-NUM.  */
+  /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+     symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
        0,     3,     4,     5,     6,     7,     8,     9,    10,    11,
@@ -843,30 +780,46 @@ static const yytype_uint8 yystos[] =
       65,   100,    60
 };
 
-#define yyerrok		(yyerrstatus = 0)
-#define yyclearin	(yychar = YYEMPTY)
-#define YYEMPTY		(-2)
-#define YYEOF		0
-
-#define YYACCEPT	goto yyacceptlab
-#define YYABORT		goto yyabortlab
-#define YYERROR		goto yyerrorlab
-
-
-/* Like YYERROR except do call yyerror.  This remains here temporarily
-   to ease the transition to the new meaning of YYERROR, for GCC.
-   Once GCC version 2 has supplanted version 1, this can go.  However,
-   YYFAIL appears to be in use.  Nevertheless, it is formally deprecated
-   in Bison 2.4.2's NEWS entry, where a plan to phase it out is
-   discussed.  */
-
-#define YYFAIL		goto yyerrlab
-#if defined YYFAIL
-  /* This is here to suppress warnings from the GCC cpp's
-     -Wunused-macros.  Normally we don't worry about that warning, but
-     some users do, and we want to make it easy for users to remove
-     YYFAIL uses, which will produce warnings from Bison 2.5.  */
-#endif
+  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const yytype_uint8 yyr1[] =
+{
+       0,    66,    67,    67,    68,    68,    68,    68,    69,    69,
+      69,    69,    69,    70,    70,    70,    70,    70,    70,    70,
+      70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+      70,    70,    70,    70,    70,    70,    70,    70,    70,    70,
+      71,    71,    71,    71,    71,    71,    71,    73,    72,    74,
+      74,    76,    75,    77,    78,    78,    79,    81,    80,    82,
+      82,    84,    85,    83,    86,    87,    89,    90,    91,    92,
+      88,    93,    94,    96,    97,    98,    99,   100,    95,   101,
+     101,   102,   102,   102,   103,   103,   104,   104,   106,   105,
+     107,   107,   109,   108,   110,   111
+};
+
+  /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
+static const yytype_uint8 yyr2[] =
+{
+       0,     2,     0,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     0,     5,     0,
+       2,     0,     7,     1,     0,     2,     1,     0,     6,     0,
+       2,     0,     0,     5,     1,     4,     0,     0,     0,     0,
+      15,     1,     1,     0,     0,     0,     0,     0,    20,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     0,     7,
+       0,     2,     0,     6,     1,     1
+};
+
+
+#define yyerrok         (yyerrstatus = 0)
+#define yyclearin       (yychar = YYEMPTY)
+#define YYEMPTY         (-2)
+#define YYEOF           0
+
+#define YYACCEPT        goto yyacceptlab
+#define YYABORT         goto yyabortlab
+#define YYERROR         goto yyerrorlab
+
 
 #define YYRECOVERING()  (!!yyerrstatus)
 
@@ -883,27 +836,15 @@ do                                                              \
   else                                                          \
     {                                                           \
       yyerror (YY_("syntax error: cannot back up")); \
-      YYERROR;							\
-    }								\
-while (YYID (0))
+      YYERROR;                                                  \
+    }                                                           \
+while (0)
 
 /* Error token number */
-#define YYTERROR	1
-#define YYERRCODE	256
+#define YYTERROR        1
+#define YYERRCODE       256
 
 
-/* This macro is provided for backward compatibility. */
-#ifndef YY_LOCATION_PRINT
-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-#endif
-
-
-/* YYLEX -- calling `yylex' with the right arguments.  */
-#ifdef YYLEX_PARAM
-# define YYLEX yylex (YYLEX_PARAM)
-#else
-# define YYLEX yylex ()
-#endif
 
 /* Enable debugging if requested.  */
 #if YYDEBUG
@@ -913,40 +854,36 @@ while (YYID (0))
 #  define YYFPRINTF fprintf
 # endif
 
-# define YYDPRINTF(Args)			\
-do {						\
-  if (yydebug)					\
-    YYFPRINTF Args;				\
-} while (YYID (0))
+# define YYDPRINTF(Args)                        \
+do {                                            \
+  if (yydebug)                                  \
+    YYFPRINTF Args;                             \
+} while (0)
+
+/* This macro is provided for backward compatibility. */
+#ifndef YY_LOCATION_PRINT
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+#endif
 
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
-do {									  \
-  if (yydebug)								  \
-    {									  \
-      YYFPRINTF (stderr, "%s ", Title);					  \
-      yy_symbol_print (stderr,						  \
-		  Type, Value); \
-      YYFPRINTF (stderr, "\n");						  \
-    }									  \
-} while (YYID (0))
 
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                    \
+do {                                                                      \
+  if (yydebug)                                                            \
+    {                                                                     \
+      YYFPRINTF (stderr, "%s ", Title);                                   \
+      yy_symbol_print (stderr,                                            \
+                  Type, Value); \
+      YYFPRINTF (stderr, "\n");                                           \
+    }                                                                     \
+} while (0)
 
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
 
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
+/*----------------------------------------.
+| Print this symbol's value on YYOUTPUT.  |
+`----------------------------------------*/
+
 static void
 yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-#else
-static void
-yy_symbol_value_print (yyoutput, yytype, yyvaluep)
-    FILE *yyoutput;
-    int yytype;
-    YYSTYPE const * const yyvaluep;
-#endif
 {
   FILE *yyo = yyoutput;
   YYUSE (yyo);
@@ -955,14 +892,8 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep)
 # ifdef YYPRINT
   if (yytype < YYNTOKENS)
     YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-# else
-  YYUSE (yyoutput);
 # endif
-  switch (yytype)
-    {
-      default:
-        break;
-    }
+  YYUSE (yytype);
 }
 
 
@@ -970,22 +901,11 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep)
 | Print this symbol on YYOUTPUT.  |
 `--------------------------------*/
 
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 static void
 yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-#else
-static void
-yy_symbol_print (yyoutput, yytype, yyvaluep)
-    FILE *yyoutput;
-    int yytype;
-    YYSTYPE const * const yyvaluep;
-#endif
 {
-  if (yytype < YYNTOKENS)
-    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
-  else
-    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+  YYFPRINTF (yyoutput, "%s %s (",
+             yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
 
   yy_symbol_value_print (yyoutput, yytype, yyvaluep);
   YYFPRINTF (yyoutput, ")");
@@ -996,16 +916,8 @@ yy_symbol_print (yyoutput, yytype, yyvaluep)
 | TOP (included).                                                   |
 `------------------------------------------------------------------*/
 
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 static void
 yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
-#else
-static void
-yy_stack_print (yybottom, yytop)
-    yytype_int16 *yybottom;
-    yytype_int16 *yytop;
-#endif
 {
   YYFPRINTF (stderr, "Stack now");
   for (; yybottom <= yytop; yybottom++)
@@ -1016,49 +928,42 @@ yy_stack_print (yybottom, yytop)
   YYFPRINTF (stderr, "\n");
 }
 
-# define YY_STACK_PRINT(Bottom, Top)				\
-do {								\
-  if (yydebug)							\
-    yy_stack_print ((Bottom), (Top));				\
-} while (YYID (0))
+# define YY_STACK_PRINT(Bottom, Top)                            \
+do {                                                            \
+  if (yydebug)                                                  \
+    yy_stack_print ((Bottom), (Top));                           \
+} while (0)
 
 
 /*------------------------------------------------.
 | Report that the YYRULE is going to be reduced.  |
 `------------------------------------------------*/
 
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static void
-yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
-#else
 static void
-yy_reduce_print (yyvsp, yyrule)
-    YYSTYPE *yyvsp;
-    int yyrule;
-#endif
+yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule)
 {
+  unsigned long int yylno = yyrline[yyrule];
   int yynrhs = yyr2[yyrule];
   int yyi;
-  unsigned long int yylno = yyrline[yyrule];
   YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
-	     yyrule - 1, yylno);
+             yyrule - 1, yylno);
   /* The symbols being reduced.  */
   for (yyi = 0; yyi < yynrhs; yyi++)
     {
       YYFPRINTF (stderr, "   $%d = ", yyi + 1);
-      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
-		       &(yyvsp[(yyi + 1) - (yynrhs)])
-		       		       );
+      yy_symbol_print (stderr,
+                       yystos[yyssp[yyi + 1 - yynrhs]],
+                       &(yyvsp[(yyi + 1) - (yynrhs)])
+                                              );
       YYFPRINTF (stderr, "\n");
     }
 }
 
-# define YY_REDUCE_PRINT(Rule)		\
-do {					\
-  if (yydebug)				\
-    yy_reduce_print (yyvsp, Rule); \
-} while (YYID (0))
+# define YY_REDUCE_PRINT(Rule)          \
+do {                                    \
+  if (yydebug)                          \
+    yy_reduce_print (yyssp, yyvsp, Rule); \
+} while (0)
 
 /* Nonzero means print parse trace.  It is left uninitialized so that
    multiple parsers can coexist.  */
@@ -1072,7 +977,7 @@ int yydebug;
 
 
 /* YYINITDEPTH -- initial size of the parser's stacks.  */
-#ifndef	YYINITDEPTH
+#ifndef YYINITDEPTH
 # define YYINITDEPTH 200
 #endif
 
@@ -1095,15 +1000,8 @@ int yydebug;
 #   define yystrlen strlen
 #  else
 /* Return the length of YYSTR.  */
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 static YYSIZE_T
 yystrlen (const char *yystr)
-#else
-static YYSIZE_T
-yystrlen (yystr)
-    const char *yystr;
-#endif
 {
   YYSIZE_T yylen;
   for (yylen = 0; yystr[yylen]; yylen++)
@@ -1119,16 +1017,8 @@ yystrlen (yystr)
 #  else
 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
    YYDEST.  */
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 static char *
 yystpcpy (char *yydest, const char *yysrc)
-#else
-static char *
-yystpcpy (yydest, yysrc)
-    char *yydest;
-    const char *yysrc;
-#endif
 {
   char *yyd = yydest;
   const char *yys = yysrc;
@@ -1158,27 +1048,27 @@ yytnamerr (char *yyres, const char *yystr)
       char const *yyp = yystr;
 
       for (;;)
-	switch (*++yyp)
-	  {
-	  case '\'':
-	  case ',':
-	    goto do_not_strip_quotes;
-
-	  case '\\':
-	    if (*++yyp != '\\')
-	      goto do_not_strip_quotes;
-	    /* Fall through.  */
-	  default:
-	    if (yyres)
-	      yyres[yyn] = *yyp;
-	    yyn++;
-	    break;
-
-	  case '"':
-	    if (yyres)
-	      yyres[yyn] = '\0';
-	    return yyn;
-	  }
+        switch (*++yyp)
+          {
+          case '\'':
+          case ',':
+            goto do_not_strip_quotes;
+
+          case '\\':
+            if (*++yyp != '\\')
+              goto do_not_strip_quotes;
+            /* Fall through.  */
+          default:
+            if (yyres)
+              yyres[yyn] = *yyp;
+            yyn++;
+            break;
+
+          case '"':
+            if (yyres)
+              yyres[yyn] = '\0';
+            return yyn;
+          }
     do_not_strip_quotes: ;
     }
 
@@ -1201,11 +1091,11 @@ static int
 yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                 yytype_int16 *yyssp, int yytoken)
 {
-  YYSIZE_T yysize0 = yytnamerr (YY_NULL, yytname[yytoken]);
+  YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
   YYSIZE_T yysize = yysize0;
   enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
   /* Internationalized format string. */
-  const char *yyformat = YY_NULL;
+  const char *yyformat = YY_NULLPTR;
   /* Arguments of yyformat. */
   char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
   /* Number of reported tokens (one for the "unexpected", one per
@@ -1213,10 +1103,6 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
   int yycount = 0;
 
   /* There are many possibilities here to consider:
-     - Assume YYFAIL is not used.  It's too flawed to consider.  See
-       <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
-       for details.  YYERROR is fine as it does not invoke this
-       function.
      - If this state is a consistent state with a default action, then
        the only way this function was invoked is if the default action
        is an error action.  In that case, don't check for expected
@@ -1266,7 +1152,7 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                   }
                 yyarg[yycount++] = yytname[yyx];
                 {
-                  YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULL, yytname[yyx]);
+                  YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
                   if (! (yysize <= yysize1
                          && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
                     return 2;
@@ -1333,31 +1219,17 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
 | Release the memory associated to this symbol.  |
 `-----------------------------------------------*/
 
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 static void
 yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
-#else
-static void
-yydestruct (yymsg, yytype, yyvaluep)
-    const char *yymsg;
-    int yytype;
-    YYSTYPE *yyvaluep;
-#endif
 {
   YYUSE (yyvaluep);
-
   if (!yymsg)
     yymsg = "Deleting";
   YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
 
-  switch (yytype)
-    {
-
-      default:
-        break;
-    }
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+  YYUSE (yytype);
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
 }
 
 
@@ -1366,18 +1238,8 @@ yydestruct (yymsg, yytype, yyvaluep)
 /* The lookahead symbol.  */
 int yychar;
 
-
-#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
-# define YY_IGNORE_MAYBE_UNINITIALIZED_END
-#endif
-#ifndef YY_INITIAL_VALUE
-# define YY_INITIAL_VALUE(Value) /* Nothing. */
-#endif
-
 /* The semantic value of the lookahead symbol.  */
-YYSTYPE yylval YY_INITIAL_VALUE(yyval_default);
-
+YYSTYPE yylval;
 /* Number of syntax errors so far.  */
 int yynerrs;
 
@@ -1386,35 +1248,16 @@ int yynerrs;
 | yyparse.  |
 `----------*/
 
-#ifdef YYPARSE_PARAM
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-hid_t
-yyparse (void *YYPARSE_PARAM)
-#else
-hid_t
-yyparse (YYPARSE_PARAM)
-    void *YYPARSE_PARAM;
-#endif
-#else /* ! YYPARSE_PARAM */
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 hid_t
 yyparse (void)
-#else
-hid_t
-yyparse ()
-
-#endif
-#endif
 {
     int yystate;
     /* Number of tokens to shift before error messages enabled.  */
     int yyerrstatus;
 
     /* The stacks and their tools:
-       `yyss': related to states.
-       `yyvs': related to semantic values.
+       'yyss': related to states.
+       'yyvs': related to semantic values.
 
        Refer to the stacks through separate pointers, to allow yyoverflow
        to reallocate them elsewhere.  */
@@ -1482,23 +1325,23 @@ yyparse ()
 
 #ifdef yyoverflow
       {
-	/* Give user a chance to reallocate the stack.  Use copies of
-	   these so that the &'s don't force the real ones into
-	   memory.  */
-	YYSTYPE *yyvs1 = yyvs;
-	yytype_int16 *yyss1 = yyss;
-
-	/* Each stack pointer address is followed by the size of the
-	   data in use in that stack, in bytes.  This used to be a
-	   conditional around just the two extra args, but that might
-	   be undefined if yyoverflow is a macro.  */
-	yyoverflow (YY_("memory exhausted"),
-		    &yyss1, yysize * sizeof (*yyssp),
-		    &yyvs1, yysize * sizeof (*yyvsp),
-		    &yystacksize);
-
-	yyss = yyss1;
-	yyvs = yyvs1;
+        /* Give user a chance to reallocate the stack.  Use copies of
+           these so that the &'s don't force the real ones into
+           memory.  */
+        YYSTYPE *yyvs1 = yyvs;
+        yytype_int16 *yyss1 = yyss;
+
+        /* Each stack pointer address is followed by the size of the
+           data in use in that stack, in bytes.  This used to be a
+           conditional around just the two extra args, but that might
+           be undefined if yyoverflow is a macro.  */
+        yyoverflow (YY_("memory exhausted"),
+                    &yyss1, yysize * sizeof (*yyssp),
+                    &yyvs1, yysize * sizeof (*yyvsp),
+                    &yystacksize);
+
+        yyss = yyss1;
+        yyvs = yyvs1;
       }
 #else /* no yyoverflow */
 # ifndef YYSTACK_RELOCATE
@@ -1506,22 +1349,22 @@ yyparse ()
 # else
       /* Extend the stack our own way.  */
       if (YYMAXDEPTH <= yystacksize)
-	goto yyexhaustedlab;
+        goto yyexhaustedlab;
       yystacksize *= 2;
       if (YYMAXDEPTH < yystacksize)
-	yystacksize = YYMAXDEPTH;
+        yystacksize = YYMAXDEPTH;
 
       {
-	yytype_int16 *yyss1 = yyss;
-	union yyalloc *yyptr =
-	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
-	if (! yyptr)
-	  goto yyexhaustedlab;
-	YYSTACK_RELOCATE (yyss_alloc, yyss);
-	YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+        yytype_int16 *yyss1 = yyss;
+        union yyalloc *yyptr =
+          (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+        if (! yyptr)
+          goto yyexhaustedlab;
+        YYSTACK_RELOCATE (yyss_alloc, yyss);
+        YYSTACK_RELOCATE (yyvs_alloc, yyvs);
 #  undef YYSTACK_RELOCATE
-	if (yyss1 != yyssa)
-	  YYSTACK_FREE (yyss1);
+        if (yyss1 != yyssa)
+          YYSTACK_FREE (yyss1);
       }
 # endif
 #endif /* no yyoverflow */
@@ -1530,10 +1373,10 @@ yyparse ()
       yyvsp = yyvs + yysize - 1;
 
       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
-		  (unsigned long int) yystacksize));
+                  (unsigned long int) yystacksize));
 
       if (yyss + yystacksize - 1 <= yyssp)
-	YYABORT;
+        YYABORT;
     }
 
   YYDPRINTF ((stderr, "Entering state %d\n", yystate));
@@ -1562,7 +1405,7 @@ yybackup:
   if (yychar == YYEMPTY)
     {
       YYDPRINTF ((stderr, "Reading a token: "));
-      yychar = YYLEX;
+      yychar = yylex ();
     }
 
   if (yychar <= YYEOF)
@@ -1627,7 +1470,7 @@ yyreduce:
   yylen = yyr2[yyn];
 
   /* If YYLEN is nonzero, implement the default value of the action:
-     `$$ = $1'.
+     '$$ = $1'.
 
      Otherwise, the following line sets YYVAL to garbage.
      This behavior is undocumented and Bison
@@ -1641,433 +1484,439 @@ yyreduce:
   switch (yyn)
     {
         case 2:
-/* Line 1807 of yacc.c  */
-#line 101 "H5LTparse.y"
+#line 107 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { memset(arr_stack, 0, STACK_SIZE*sizeof(struct arr_info)); /*initialize here?*/ }
+#line 1468 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 3:
-/* Line 1807 of yacc.c  */
-#line 102 "H5LTparse.y"
+#line 108 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { return (yyval.hid);}
+#line 1474 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 13:
-/* Line 1807 of yacc.c  */
-#line 116 "H5LTparse.y"
+#line 122 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_STD_I8BE); }
+#line 1480 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 14:
-/* Line 1807 of yacc.c  */
-#line 117 "H5LTparse.y"
+#line 123 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_STD_I8LE); }
+#line 1486 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 15:
-/* Line 1807 of yacc.c  */
-#line 118 "H5LTparse.y"
+#line 124 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_STD_I16BE); }
+#line 1492 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 16:
-/* Line 1807 of yacc.c  */
-#line 119 "H5LTparse.y"
+#line 125 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_STD_I16LE); }
+#line 1498 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 17:
-/* Line 1807 of yacc.c  */
-#line 120 "H5LTparse.y"
+#line 126 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_STD_I32BE); }
+#line 1504 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 18:
-/* Line 1807 of yacc.c  */
-#line 121 "H5LTparse.y"
+#line 127 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_STD_I32LE); }
+#line 1510 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 19:
-/* Line 1807 of yacc.c  */
-#line 122 "H5LTparse.y"
+#line 128 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_STD_I64BE); }
+#line 1516 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 20:
-/* Line 1807 of yacc.c  */
-#line 123 "H5LTparse.y"
+#line 129 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_STD_I64LE); }
+#line 1522 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 21:
-/* Line 1807 of yacc.c  */
-#line 124 "H5LTparse.y"
+#line 130 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_STD_U8BE); }
+#line 1528 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 22:
-/* Line 1807 of yacc.c  */
-#line 125 "H5LTparse.y"
+#line 131 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_STD_U8LE); }
+#line 1534 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 23:
-/* Line 1807 of yacc.c  */
-#line 126 "H5LTparse.y"
+#line 132 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_STD_U16BE); }
+#line 1540 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 24:
-/* Line 1807 of yacc.c  */
-#line 127 "H5LTparse.y"
+#line 133 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_STD_U16LE); }
+#line 1546 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 25:
-/* Line 1807 of yacc.c  */
-#line 128 "H5LTparse.y"
+#line 134 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_STD_U32BE); }
+#line 1552 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 26:
-/* Line 1807 of yacc.c  */
-#line 129 "H5LTparse.y"
+#line 135 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_STD_U32LE); }
+#line 1558 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 27:
-/* Line 1807 of yacc.c  */
-#line 130 "H5LTparse.y"
+#line 136 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_STD_U64BE); }
+#line 1564 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 28:
-/* Line 1807 of yacc.c  */
-#line 131 "H5LTparse.y"
+#line 137 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_STD_U64LE); }
+#line 1570 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 29:
-/* Line 1807 of yacc.c  */
-#line 132 "H5LTparse.y"
+#line 138 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_NATIVE_CHAR); }
+#line 1576 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 30:
-/* Line 1807 of yacc.c  */
-#line 133 "H5LTparse.y"
+#line 139 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_NATIVE_SCHAR); }
+#line 1582 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 31:
-/* Line 1807 of yacc.c  */
-#line 134 "H5LTparse.y"
+#line 140 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_NATIVE_UCHAR); }
+#line 1588 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 32:
-/* Line 1807 of yacc.c  */
-#line 135 "H5LTparse.y"
+#line 141 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_NATIVE_SHORT); }
+#line 1594 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 33:
-/* Line 1807 of yacc.c  */
-#line 136 "H5LTparse.y"
+#line 142 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_NATIVE_USHORT); }
+#line 1600 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 34:
-/* Line 1807 of yacc.c  */
-#line 137 "H5LTparse.y"
+#line 143 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_NATIVE_INT); }
+#line 1606 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 35:
-/* Line 1807 of yacc.c  */
-#line 138 "H5LTparse.y"
+#line 144 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_NATIVE_UINT); }
+#line 1612 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 36:
-/* Line 1807 of yacc.c  */
-#line 139 "H5LTparse.y"
+#line 145 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_NATIVE_LONG); }
+#line 1618 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 37:
-/* Line 1807 of yacc.c  */
-#line 140 "H5LTparse.y"
+#line 146 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_NATIVE_ULONG); }
+#line 1624 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 38:
-/* Line 1807 of yacc.c  */
-#line 141 "H5LTparse.y"
+#line 147 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_NATIVE_LLONG); }
+#line 1630 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 39:
-/* Line 1807 of yacc.c  */
-#line 142 "H5LTparse.y"
+#line 148 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_NATIVE_ULLONG); }
+#line 1636 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 40:
-/* Line 1807 of yacc.c  */
-#line 145 "H5LTparse.y"
+#line 151 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_IEEE_F32BE); }
+#line 1642 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 41:
-/* Line 1807 of yacc.c  */
-#line 146 "H5LTparse.y"
+#line 152 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_IEEE_F32LE); }
+#line 1648 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 42:
-/* Line 1807 of yacc.c  */
-#line 147 "H5LTparse.y"
+#line 153 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_IEEE_F64BE); }
+#line 1654 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 43:
-/* Line 1807 of yacc.c  */
-#line 148 "H5LTparse.y"
+#line 154 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_IEEE_F64LE); }
+#line 1660 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 44:
-/* Line 1807 of yacc.c  */
-#line 149 "H5LTparse.y"
+#line 155 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_NATIVE_FLOAT); }
+#line 1666 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 45:
-/* Line 1807 of yacc.c  */
-#line 150 "H5LTparse.y"
+#line 156 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_NATIVE_DOUBLE); }
+#line 1672 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 46:
-/* Line 1807 of yacc.c  */
-#line 151 "H5LTparse.y"
+#line 157 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = H5Tcopy(H5T_NATIVE_LDOUBLE); }
+#line 1678 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 47:
-/* Line 1807 of yacc.c  */
-#line 155 "H5LTparse.y"
+#line 161 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { csindex++; cmpd_stack[csindex].id = H5Tcreate(H5T_COMPOUND, 1); /*temporarily set size to 1*/ }
+#line 1684 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 48:
-/* Line 1807 of yacc.c  */
-#line 157 "H5LTparse.y"
+#line 163 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.hid) = cmpd_stack[csindex].id; 
                               cmpd_stack[csindex].id = 0;
                               cmpd_stack[csindex].first_memb = 1; 
                               csindex--;
                             }
+#line 1694 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 51:
-/* Line 1807 of yacc.c  */
-#line 166 "H5LTparse.y"
+#line 172 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { cmpd_stack[csindex].is_field = 1; /*notify lexer a compound member is parsed*/ }
+#line 1700 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 52:
-/* Line 1807 of yacc.c  */
-#line 168 "H5LTparse.y"
+#line 174 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     {   
                             size_t origin_size, new_size;
                             hid_t dtype_id = cmpd_stack[csindex].id;
 
                             /*Adjust size and insert member, consider both member size and offset.*/
                             if(cmpd_stack[csindex].first_memb) { /*reclaim the size 1 temporarily set*/
-                                new_size = H5Tget_size((yyvsp[(1) - (7)].hid)) + (yyvsp[(6) - (7)].ival);
+                                new_size = H5Tget_size((yyvsp[-6].hid)) + (yyvsp[-1].ival);
                                 H5Tset_size(dtype_id, new_size);
                                 /*member name is saved in yylval.sval by lexer*/
-                                H5Tinsert(dtype_id, (yyvsp[(4) - (7)].sval), (yyvsp[(6) - (7)].ival), (yyvsp[(1) - (7)].hid));
+                                H5Tinsert(dtype_id, (yyvsp[-3].sval), (yyvsp[-1].ival), (yyvsp[-6].hid));
 
                                 cmpd_stack[csindex].first_memb = 0;
                             } else {
                                 origin_size = H5Tget_size(dtype_id);
                                 
-                                if((yyvsp[(6) - (7)].ival) == 0) {
-                                    new_size = origin_size + H5Tget_size((yyvsp[(1) - (7)].hid));
+                                if((yyvsp[-1].ival) == 0) {
+                                    new_size = origin_size + H5Tget_size((yyvsp[-6].hid));
                                     H5Tset_size(dtype_id, new_size);
-                                    H5Tinsert(dtype_id, (yyvsp[(4) - (7)].sval), origin_size, (yyvsp[(1) - (7)].hid));
+                                    H5Tinsert(dtype_id, (yyvsp[-3].sval), origin_size, (yyvsp[-6].hid));
                                 } else {
-                                    new_size = (yyvsp[(6) - (7)].ival) + H5Tget_size((yyvsp[(1) - (7)].hid));
+                                    new_size = (yyvsp[-1].ival) + H5Tget_size((yyvsp[-6].hid));
                                     H5Tset_size(dtype_id, new_size);
-                                    H5Tinsert(dtype_id, (yyvsp[(4) - (7)].sval), (yyvsp[(6) - (7)].ival), (yyvsp[(1) - (7)].hid));
+                                    H5Tinsert(dtype_id, (yyvsp[-3].sval), (yyvsp[-1].ival), (yyvsp[-6].hid));
                                 }
                             }
-                          
+                            if((yyvsp[-3].sval)) {
+                                free((yyvsp[-3].sval));
+                                (yyvsp[-3].sval) = NULL;
+                            }
                             cmpd_stack[csindex].is_field = 0;
-                            H5Tclose((yyvsp[(1) - (7)].hid));
+                            H5Tclose((yyvsp[-6].hid));
                              
                             new_size = H5Tget_size(dtype_id);
                         }
+#line 1739 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 53:
-/* Line 1807 of yacc.c  */
-#line 201 "H5LTparse.y"
+#line 210 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     {
-                            (yyval.sval) = yylval.sval;
+                            (yyval.sval) = strdup(yylval.sval);
+                            free(yylval.sval);
+                            yylval.sval = NULL;
                         }
+#line 1749 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 54:
-/* Line 1807 of yacc.c  */
-#line 206 "H5LTparse.y"
+#line 217 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.ival) = 0; }
+#line 1755 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 55:
-/* Line 1807 of yacc.c  */
-#line 208 "H5LTparse.y"
+#line 219 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { (yyval.ival) = yylval.ival; }
+#line 1761 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 57:
-/* Line 1807 of yacc.c  */
-#line 212 "H5LTparse.y"
+#line 223 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { asindex++; /*pushd onto the stack*/ }
+#line 1767 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 58:
-/* Line 1807 of yacc.c  */
-#line 214 "H5LTparse.y"
+#line 225 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { 
-                          (yyval.hid) = H5Tarray_create2((yyvsp[(5) - (6)].hid), arr_stack[asindex].ndims, arr_stack[asindex].dims);
+                          (yyval.hid) = H5Tarray_create2((yyvsp[-1].hid), arr_stack[asindex].ndims, arr_stack[asindex].dims);
                           arr_stack[asindex].ndims = 0;
                           asindex--;
-                          H5Tclose((yyvsp[(5) - (6)].hid));
+                          H5Tclose((yyvsp[-1].hid));
                         }
+#line 1778 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 61:
-/* Line 1807 of yacc.c  */
-#line 224 "H5LTparse.y"
+#line 235 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { arr_stack[asindex].is_dim = 1; /*notice lexer of dimension size*/ }
+#line 1784 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 62:
-/* Line 1807 of yacc.c  */
-#line 225 "H5LTparse.y"
+#line 236 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { unsigned ndims = arr_stack[asindex].ndims;
                                   arr_stack[asindex].dims[ndims] = (hsize_t)yylval.ival; 
                                   arr_stack[asindex].ndims++;
                                   arr_stack[asindex].is_dim = 0; 
                                 }
+#line 1794 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 65:
-/* Line 1807 of yacc.c  */
-#line 236 "H5LTparse.y"
-    { (yyval.hid) = H5Tvlen_create((yyvsp[(3) - (4)].hid)); H5Tclose((yyvsp[(3) - (4)].hid)); }
+#line 247 "hl/src/H5LTparse.y" /* yacc.c:1646  */
+    { (yyval.hid) = H5Tvlen_create((yyvsp[-1].hid)); H5Tclose((yyvsp[-1].hid)); }
+#line 1800 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 66:
-/* Line 1807 of yacc.c  */
-#line 241 "H5LTparse.y"
+#line 252 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { is_opq_size = 1; }
+#line 1806 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 67:
-/* Line 1807 of yacc.c  */
-#line 242 "H5LTparse.y"
+#line 253 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     {   
                                 size_t size = (size_t)yylval.ival;
                                 (yyval.hid) = H5Tcreate(H5T_OPAQUE, size);
                                 is_opq_size = 0;    
                             }
+#line 1816 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 68:
-/* Line 1807 of yacc.c  */
-#line 247 "H5LTparse.y"
+#line 258 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { is_opq_tag = 1; }
+#line 1822 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 69:
-/* Line 1807 of yacc.c  */
-#line 248 "H5LTparse.y"
+#line 259 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     {  
-                                H5Tset_tag((yyvsp[(7) - (13)].hid), yylval.sval);
+                                H5Tset_tag((yyvsp[-6].hid), yylval.sval);
+                                free(yylval.sval);
+                                yylval.sval = NULL;
                                 is_opq_tag = 0;
                             }
+#line 1833 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 70:
-/* Line 1807 of yacc.c  */
-#line 252 "H5LTparse.y"
-    { (yyval.hid) = (yyvsp[(7) - (15)].hid); }
+#line 265 "hl/src/H5LTparse.y" /* yacc.c:1646  */
+    { (yyval.hid) = (yyvsp[-8].hid); }
+#line 1839 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 73:
-/* Line 1807 of yacc.c  */
-#line 260 "H5LTparse.y"
+#line 273 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { is_str_size = 1; }
+#line 1845 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 74:
-/* Line 1807 of yacc.c  */
-#line 261 "H5LTparse.y"
+#line 274 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     {  
-                                if((yyvsp[(5) - (6)].ival) == H5T_VARIABLE_TOKEN)
+                                if((yyvsp[-1].ival) == H5T_VARIABLE_TOKEN)
                                     is_variable = 1;
                                 else 
                                     str_size = yylval.ival;
                                 is_str_size = 0; 
                             }
+#line 1857 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 75:
-/* Line 1807 of yacc.c  */
-#line 269 "H5LTparse.y"
+#line 282 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     {
-                                if((yyvsp[(9) - (10)].ival) == H5T_STR_NULLTERM_TOKEN)
+                                if((yyvsp[-1].ival) == H5T_STR_NULLTERM_TOKEN)
                                     str_pad = H5T_STR_NULLTERM;
-                                else if((yyvsp[(9) - (10)].ival) == H5T_STR_NULLPAD_TOKEN)
+                                else if((yyvsp[-1].ival) == H5T_STR_NULLPAD_TOKEN)
                                     str_pad = H5T_STR_NULLPAD;
-                                else if((yyvsp[(9) - (10)].ival) == H5T_STR_SPACEPAD_TOKEN)
+                                else if((yyvsp[-1].ival) == H5T_STR_SPACEPAD_TOKEN)
                                     str_pad = H5T_STR_SPACEPAD;
                             }
+#line 1870 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 76:
-/* Line 1807 of yacc.c  */
-#line 278 "H5LTparse.y"
+#line 291 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     {  
-                                if((yyvsp[(13) - (14)].ival) == H5T_CSET_ASCII_TOKEN)
+                                if((yyvsp[-1].ival) == H5T_CSET_ASCII_TOKEN)
                                     str_cset = H5T_CSET_ASCII;
-                                else if((yyvsp[(13) - (14)].ival) == H5T_CSET_UTF8_TOKEN)
+                                else if((yyvsp[-1].ival) == H5T_CSET_UTF8_TOKEN)
                                     str_cset = H5T_CSET_UTF8;
                             }
+#line 1881 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 77:
-/* Line 1807 of yacc.c  */
-#line 285 "H5LTparse.y"
+#line 298 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     {
-                                if((yyvsp[(17) - (18)].hid) == H5T_C_S1_TOKEN)
+                                if((yyvsp[-1].hid) == H5T_C_S1_TOKEN)
                                     (yyval.hid) = H5Tcopy(H5T_C_S1);
-                                else if((yyvsp[(17) - (18)].hid) == H5T_FORTRAN_S1_TOKEN)
+                                else if((yyvsp[-1].hid) == H5T_FORTRAN_S1_TOKEN)
                                     (yyval.hid) = H5Tcopy(H5T_FORTRAN_S1);
                             }
+#line 1892 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 78:
-/* Line 1807 of yacc.c  */
-#line 292 "H5LTparse.y"
+#line 305 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     {   
-                                hid_t str_id = (yyvsp[(19) - (20)].hid);
+                                hid_t str_id = (yyvsp[-1].hid);
 
                                 /*set string size*/
                                 if(is_variable) {
@@ -2082,71 +1931,71 @@ yyreduce:
 
                                 (yyval.hid) = str_id; 
                             }
+#line 1913 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 79:
-/* Line 1807 of yacc.c  */
-#line 309 "H5LTparse.y"
+#line 322 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     {(yyval.ival) = H5T_VARIABLE_TOKEN;}
+#line 1919 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 81:
-/* Line 1807 of yacc.c  */
-#line 312 "H5LTparse.y"
+#line 325 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     {(yyval.ival) = H5T_STR_NULLTERM_TOKEN;}
+#line 1925 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 82:
-/* Line 1807 of yacc.c  */
-#line 313 "H5LTparse.y"
+#line 326 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     {(yyval.ival) = H5T_STR_NULLPAD_TOKEN;}
+#line 1931 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 83:
-/* Line 1807 of yacc.c  */
-#line 314 "H5LTparse.y"
+#line 327 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     {(yyval.ival) = H5T_STR_SPACEPAD_TOKEN;}
+#line 1937 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 84:
-/* Line 1807 of yacc.c  */
-#line 316 "H5LTparse.y"
+#line 329 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     {(yyval.ival) = H5T_CSET_ASCII_TOKEN;}
+#line 1943 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 85:
-/* Line 1807 of yacc.c  */
-#line 317 "H5LTparse.y"
+#line 330 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     {(yyval.ival) = H5T_CSET_UTF8_TOKEN;}
+#line 1949 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 86:
-/* Line 1807 of yacc.c  */
-#line 319 "H5LTparse.y"
+#line 332 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     {(yyval.hid) = H5T_C_S1_TOKEN;}
+#line 1955 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 87:
-/* Line 1807 of yacc.c  */
-#line 320 "H5LTparse.y"
+#line 333 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     {(yyval.hid) = H5T_FORTRAN_S1_TOKEN;}
+#line 1961 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 88:
-/* Line 1807 of yacc.c  */
-#line 324 "H5LTparse.y"
-    { is_enum = 1; enum_id = H5Tenum_create((yyvsp[(3) - (4)].hid)); H5Tclose((yyvsp[(3) - (4)].hid)); }
+#line 337 "hl/src/H5LTparse.y" /* yacc.c:1646  */
+    { is_enum = 1; enum_id = H5Tenum_create((yyvsp[-1].hid)); H5Tclose((yyvsp[-1].hid)); }
+#line 1967 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 89:
-/* Line 1807 of yacc.c  */
-#line 326 "H5LTparse.y"
+#line 339 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     { is_enum = 0; /*reset*/ (yyval.hid) = enum_id; }
+#line 1973 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 92:
-/* Line 1807 of yacc.c  */
-#line 331 "H5LTparse.y"
+#line 344 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     {
                                                 is_enum_memb = 1; /*indicate member of enum*/
 #ifdef H5_HAVE_WIN32_API
@@ -2154,12 +2003,14 @@ yyreduce:
 #else /* H5_HAVE_WIN32_API */
                                                 enum_memb_symbol = strdup(yylval.sval); 
 #endif  /* H5_HAVE_WIN32_API */
+                                                free(yylval.sval);
+                                                yylval.sval = NULL;
                                             }
+#line 1988 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
   case 93:
-/* Line 1807 of yacc.c  */
-#line 340 "H5LTparse.y"
+#line 355 "hl/src/H5LTparse.y" /* yacc.c:1646  */
     {
                                 char char_val=(char)yylval.ival;
                                 short short_val=(short)yylval.ival;
@@ -2202,11 +2053,11 @@ yyreduce:
                                 H5Tclose(super);
                                 H5Tclose(native);
                             }
+#line 2035 "hl/src/H5LTparse.c" /* yacc.c:1646  */
     break;
 
 
-/* Line 1807 of yacc.c  */
-#line 2191 "H5LTparse.c"
+#line 2039 "hl/src/H5LTparse.c" /* yacc.c:1646  */
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -2228,7 +2079,7 @@ yyreduce:
 
   *++yyvsp = yyval;
 
-  /* Now `shift' the result of the reduction.  Determine what state
+  /* Now 'shift' the result of the reduction.  Determine what state
      that goes to, based on the state we popped back to and the rule
      number reduced by.  */
 
@@ -2243,9 +2094,9 @@ yyreduce:
   goto yynewstate;
 
 
-/*------------------------------------.
-| yyerrlab -- here on detecting error |
-`------------------------------------*/
+/*--------------------------------------.
+| yyerrlab -- here on detecting error.  |
+`--------------------------------------*/
 yyerrlab:
   /* Make sure we have latest lookahead translation.  See comments at
      user semantic actions for why this is necessary.  */
@@ -2296,20 +2147,20 @@ yyerrlab:
   if (yyerrstatus == 3)
     {
       /* If just tried and failed to reuse lookahead token after an
-	 error, discard it.  */
+         error, discard it.  */
 
       if (yychar <= YYEOF)
-	{
-	  /* Return failure if at end of input.  */
-	  if (yychar == YYEOF)
-	    YYABORT;
-	}
+        {
+          /* Return failure if at end of input.  */
+          if (yychar == YYEOF)
+            YYABORT;
+        }
       else
-	{
-	  yydestruct ("Error: discarding",
-		      yytoken, &yylval);
-	  yychar = YYEMPTY;
-	}
+        {
+          yydestruct ("Error: discarding",
+                      yytoken, &yylval);
+          yychar = YYEMPTY;
+        }
     }
 
   /* Else will try to reuse lookahead token after shifting the error
@@ -2328,7 +2179,7 @@ yyerrorlab:
   if (/*CONSTCOND*/ 0)
      goto yyerrorlab;
 
-  /* Do not reclaim the symbols of the rule which action triggered
+  /* Do not reclaim the symbols of the rule whose action triggered
      this YYERROR.  */
   YYPOPSTACK (yylen);
   yylen = 0;
@@ -2341,29 +2192,29 @@ yyerrorlab:
 | yyerrlab1 -- common code for both syntax error and YYERROR.  |
 `-------------------------------------------------------------*/
 yyerrlab1:
-  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
+  yyerrstatus = 3;      /* Each real token shifted decrements this.  */
 
   for (;;)
     {
       yyn = yypact[yystate];
       if (!yypact_value_is_default (yyn))
-	{
-	  yyn += YYTERROR;
-	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
-	    {
-	      yyn = yytable[yyn];
-	      if (0 < yyn)
-		break;
-	    }
-	}
+        {
+          yyn += YYTERROR;
+          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+            {
+              yyn = yytable[yyn];
+              if (0 < yyn)
+                break;
+            }
+        }
 
       /* Pop the current state because it cannot handle the error token.  */
       if (yyssp == yyss)
-	YYABORT;
+        YYABORT;
 
 
       yydestruct ("Error: popping",
-		  yystos[yystate], yyvsp);
+                  yystos[yystate], yyvsp);
       YYPOPSTACK (1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
@@ -2414,14 +2265,14 @@ yyreturn:
       yydestruct ("Cleanup: discarding lookahead",
                   yytoken, &yylval);
     }
-  /* Do not reclaim the symbols of the rule which action triggered
+  /* Do not reclaim the symbols of the rule whose action triggered
      this YYABORT or YYACCEPT.  */
   YYPOPSTACK (yylen);
   YY_STACK_PRINT (yyss, yyssp);
   while (yyssp != yyss)
     {
       yydestruct ("Cleanup: popping",
-		  yystos[*yyssp], yyvsp);
+                  yystos[*yyssp], yyvsp);
       YYPOPSTACK (1);
     }
 #ifndef yyoverflow
@@ -2432,8 +2283,5 @@ yyreturn:
   if (yymsg != yymsgbuf)
     YYSTACK_FREE (yymsg);
 #endif
-  /* Make sure YYID is used.  */
-  return YYID (yyresult);
+  return yyresult;
 }
-
-
diff --git a/hl/src/H5LTparse.h b/hl/src/H5LTparse.h
index 621dacd..3d7b4e8 100644
--- a/hl/src/H5LTparse.h
+++ b/hl/src/H5LTparse.h
@@ -1,19 +1,19 @@
-/* A Bison parser, made by GNU Bison 2.7.  */
+/* A Bison parser, made by GNU Bison 3.0.2.  */
 
 /* Bison interface for Yacc-like parsers in C
-   
-      Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc.
-   
+
+   Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
+
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
@@ -26,13 +26,13 @@
    special exception, which will cause the skeleton and the resulting
    Bison output files to be licensed under the GNU General Public
    License without this special exception.
-   
+
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
-#ifndef YY_H5LTYY_H5LTPARSE_H_INCLUDED
-# define YY_H5LTYY_H5LTPARSE_H_INCLUDED
-/* Enabling traces.  */
+#ifndef YY_H5LTYY_HL_SRC_H5LTPARSE_H_INCLUDED
+# define YY_H5LTYY_HL_SRC_H5LTPARSE_H_INCLUDED
+/* Debug traces.  */
 #ifndef YYDEBUG
 # define YYDEBUG 0
 #endif
@@ -40,105 +40,90 @@
 extern int H5LTyydebug;
 #endif
 
-/* Tokens.  */
+/* Token type.  */
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum yytokentype {
-     H5T_STD_I8BE_TOKEN = 258,
-     H5T_STD_I8LE_TOKEN = 259,
-     H5T_STD_I16BE_TOKEN = 260,
-     H5T_STD_I16LE_TOKEN = 261,
-     H5T_STD_I32BE_TOKEN = 262,
-     H5T_STD_I32LE_TOKEN = 263,
-     H5T_STD_I64BE_TOKEN = 264,
-     H5T_STD_I64LE_TOKEN = 265,
-     H5T_STD_U8BE_TOKEN = 266,
-     H5T_STD_U8LE_TOKEN = 267,
-     H5T_STD_U16BE_TOKEN = 268,
-     H5T_STD_U16LE_TOKEN = 269,
-     H5T_STD_U32BE_TOKEN = 270,
-     H5T_STD_U32LE_TOKEN = 271,
-     H5T_STD_U64BE_TOKEN = 272,
-     H5T_STD_U64LE_TOKEN = 273,
-     H5T_NATIVE_CHAR_TOKEN = 274,
-     H5T_NATIVE_SCHAR_TOKEN = 275,
-     H5T_NATIVE_UCHAR_TOKEN = 276,
-     H5T_NATIVE_SHORT_TOKEN = 277,
-     H5T_NATIVE_USHORT_TOKEN = 278,
-     H5T_NATIVE_INT_TOKEN = 279,
-     H5T_NATIVE_UINT_TOKEN = 280,
-     H5T_NATIVE_LONG_TOKEN = 281,
-     H5T_NATIVE_ULONG_TOKEN = 282,
-     H5T_NATIVE_LLONG_TOKEN = 283,
-     H5T_NATIVE_ULLONG_TOKEN = 284,
-     H5T_IEEE_F32BE_TOKEN = 285,
-     H5T_IEEE_F32LE_TOKEN = 286,
-     H5T_IEEE_F64BE_TOKEN = 287,
-     H5T_IEEE_F64LE_TOKEN = 288,
-     H5T_NATIVE_FLOAT_TOKEN = 289,
-     H5T_NATIVE_DOUBLE_TOKEN = 290,
-     H5T_NATIVE_LDOUBLE_TOKEN = 291,
-     H5T_STRING_TOKEN = 292,
-     STRSIZE_TOKEN = 293,
-     STRPAD_TOKEN = 294,
-     CSET_TOKEN = 295,
-     CTYPE_TOKEN = 296,
-     H5T_VARIABLE_TOKEN = 297,
-     H5T_STR_NULLTERM_TOKEN = 298,
-     H5T_STR_NULLPAD_TOKEN = 299,
-     H5T_STR_SPACEPAD_TOKEN = 300,
-     H5T_CSET_ASCII_TOKEN = 301,
-     H5T_CSET_UTF8_TOKEN = 302,
-     H5T_C_S1_TOKEN = 303,
-     H5T_FORTRAN_S1_TOKEN = 304,
-     H5T_OPAQUE_TOKEN = 305,
-     OPQ_SIZE_TOKEN = 306,
-     OPQ_TAG_TOKEN = 307,
-     H5T_COMPOUND_TOKEN = 308,
-     H5T_ENUM_TOKEN = 309,
-     H5T_ARRAY_TOKEN = 310,
-     H5T_VLEN_TOKEN = 311,
-     STRING = 312,
-     NUMBER = 313
-   };
+  enum yytokentype
+  {
+    H5T_STD_I8BE_TOKEN = 258,
+    H5T_STD_I8LE_TOKEN = 259,
+    H5T_STD_I16BE_TOKEN = 260,
+    H5T_STD_I16LE_TOKEN = 261,
+    H5T_STD_I32BE_TOKEN = 262,
+    H5T_STD_I32LE_TOKEN = 263,
+    H5T_STD_I64BE_TOKEN = 264,
+    H5T_STD_I64LE_TOKEN = 265,
+    H5T_STD_U8BE_TOKEN = 266,
+    H5T_STD_U8LE_TOKEN = 267,
+    H5T_STD_U16BE_TOKEN = 268,
+    H5T_STD_U16LE_TOKEN = 269,
+    H5T_STD_U32BE_TOKEN = 270,
+    H5T_STD_U32LE_TOKEN = 271,
+    H5T_STD_U64BE_TOKEN = 272,
+    H5T_STD_U64LE_TOKEN = 273,
+    H5T_NATIVE_CHAR_TOKEN = 274,
+    H5T_NATIVE_SCHAR_TOKEN = 275,
+    H5T_NATIVE_UCHAR_TOKEN = 276,
+    H5T_NATIVE_SHORT_TOKEN = 277,
+    H5T_NATIVE_USHORT_TOKEN = 278,
+    H5T_NATIVE_INT_TOKEN = 279,
+    H5T_NATIVE_UINT_TOKEN = 280,
+    H5T_NATIVE_LONG_TOKEN = 281,
+    H5T_NATIVE_ULONG_TOKEN = 282,
+    H5T_NATIVE_LLONG_TOKEN = 283,
+    H5T_NATIVE_ULLONG_TOKEN = 284,
+    H5T_IEEE_F32BE_TOKEN = 285,
+    H5T_IEEE_F32LE_TOKEN = 286,
+    H5T_IEEE_F64BE_TOKEN = 287,
+    H5T_IEEE_F64LE_TOKEN = 288,
+    H5T_NATIVE_FLOAT_TOKEN = 289,
+    H5T_NATIVE_DOUBLE_TOKEN = 290,
+    H5T_NATIVE_LDOUBLE_TOKEN = 291,
+    H5T_STRING_TOKEN = 292,
+    STRSIZE_TOKEN = 293,
+    STRPAD_TOKEN = 294,
+    CSET_TOKEN = 295,
+    CTYPE_TOKEN = 296,
+    H5T_VARIABLE_TOKEN = 297,
+    H5T_STR_NULLTERM_TOKEN = 298,
+    H5T_STR_NULLPAD_TOKEN = 299,
+    H5T_STR_SPACEPAD_TOKEN = 300,
+    H5T_CSET_ASCII_TOKEN = 301,
+    H5T_CSET_UTF8_TOKEN = 302,
+    H5T_C_S1_TOKEN = 303,
+    H5T_FORTRAN_S1_TOKEN = 304,
+    H5T_OPAQUE_TOKEN = 305,
+    OPQ_SIZE_TOKEN = 306,
+    OPQ_TAG_TOKEN = 307,
+    H5T_COMPOUND_TOKEN = 308,
+    H5T_ENUM_TOKEN = 309,
+    H5T_ARRAY_TOKEN = 310,
+    H5T_VLEN_TOKEN = 311,
+    STRING = 312,
+    NUMBER = 313
+  };
 #endif
 
-
+/* Value type.  */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
+typedef union YYSTYPE YYSTYPE;
+union YYSTYPE
 {
-/* Line 2065 of yacc.c  */
-#line 68 "H5LTparse.y"
+#line 74 "hl/src/H5LTparse.y" /* yacc.c:1909  */
 
     int     ival;         /*for integer token*/
     char    *sval;        /*for name string*/
     hid_t   hid;          /*for hid_t token*/
 
-
-/* Line 2065 of yacc.c  */
-#line 122 "H5LTparse.h"
-} YYSTYPE;
+#line 119 "hl/src/H5LTparse.h" /* yacc.c:1909  */
+};
 # define YYSTYPE_IS_TRIVIAL 1
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 #endif
 
+
 extern YYSTYPE H5LTyylval;
 
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int H5LTyyparse (void *YYPARSE_PARAM);
-#else
-int H5LTyyparse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
 int H5LTyyparse (void);
-#else
-int H5LTyyparse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
 
-#endif /* !YY_H5LTYY_H5LTPARSE_H_INCLUDED  */
+#endif /* !YY_H5LTYY_HL_SRC_H5LTPARSE_H_INCLUDED  */
diff --git a/hl/src/H5LTparse.y b/hl/src/H5LTparse.y
index 4c07533..80dcc42 100644
--- a/hl/src/H5LTparse.y
+++ b/hl/src/H5LTparse.y
@@ -13,6 +13,12 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
+/* NOTE!
+ *
+ * If you make any changes to H5LTparse.y, please run bin/genparser to
+ * recreate the output files.
+ */
+
 %{
 #include <stdio.h>
 #include <string.h>
@@ -190,7 +196,10 @@ memb_def        :       ddl_type { cmpd_stack[csindex].is_field = 1; /*notify le
                                     H5Tinsert(dtype_id, $<sval>4, $<ival>6, $<hid>1);
                                 }
                             }
-                          
+                            if($<sval>4) {
+                                free($<sval>4);
+                                $<sval>4 = NULL;
+                            }
                             cmpd_stack[csindex].is_field = 0;
                             H5Tclose($<hid>1);
                              
@@ -199,7 +208,9 @@ memb_def        :       ddl_type { cmpd_stack[csindex].is_field = 1; /*notify le
                 ;
 field_name      :       STRING
                         {
-                            $<sval>$ = yylval.sval;
+                            $<sval>$ = strdup(yylval.sval);
+                            free(yylval.sval);
+                            yylval.sval = NULL;
                         }                            
                 ;
 field_offset    :       /*empty*/
@@ -247,6 +258,8 @@ opaque_type     :       H5T_OPAQUE_TOKEN
                             OPQ_TAG_TOKEN { is_opq_tag = 1; } '"' opaque_tag '"' ';'
                             {  
                                 H5Tset_tag($<hid>7, yylval.sval);
+                                free(yylval.sval);
+                                yylval.sval = NULL;
                                 is_opq_tag = 0;
                             }                             
                         '}' { $<hid>$ = $<hid>7; }
@@ -335,6 +348,8 @@ enum_def        :       '"' enum_symbol '"' {
 #else /* H5_HAVE_WIN32_API */
                                                 enum_memb_symbol = strdup(yylval.sval); 
 #endif  /* H5_HAVE_WIN32_API */
+                                                free(yylval.sval);
+                                                yylval.sval = NULL;
                                             }
                         enum_val ';'
                             {
diff --git a/hl/src/H5TB.c b/hl/src/H5TB.c
index 0f90393..bcd3339 100644
--- a/hl/src/H5TB.c
+++ b/hl/src/H5TB.c
@@ -3248,7 +3248,7 @@ out:
 *
 *-------------------------------------------------------------------------
 */
-static
+H5_ATTR_PURE static
 hbool_t H5TB_find_field(const char *field, const char *field_list)
 {
     const char *start = field_list;
diff --git a/hl/src/Makefile.am b/hl/src/Makefile.am
index f2b90d0..c1e6810 100644
--- a/hl/src/Makefile.am
+++ b/hl/src/Makefile.am
@@ -28,15 +28,15 @@ AM_CPPFLAGS+=-I$(top_srcdir)/src
 lib_LTLIBRARIES=libhdf5_hl.la
 
 # Add libtool numbers to the HDF5 hl library (from config/lt_vers.am)
-libhdf5_hl_la_LDFLAGS= -version-info $(LT_HL_VERS_INTERFACE):$(LT_HL_VERS_REVISION):$(LT_HL_VERS_AGE) $(AM_LDFLAGS)
+libhdf5_hl_la_LDFLAGS= -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
 
 # List sources to include in the HDF5 HL Library.
-libhdf5_hl_la_SOURCES=H5DO.c H5DS.c H5IM.c H5LT.c H5LTanalyze.c H5LTparse.c H5PT.c H5TB.c
+libhdf5_hl_la_SOURCES=H5DO.c H5DS.c H5IM.c H5LT.c H5LTanalyze.c H5LTparse.c H5PT.c H5TB.c H5LD.c
 
-# HDF5 HL library depends on HDF5 Library. 
+# HDF5 HL library depends on HDF5 Library.
 libhdf5_hl_la_LIBADD=$(LIBHDF5)
 
 # Public header files (to be installed)
-include_HEADERS=hdf5_hl.h H5DOpublic.h H5IMpublic.h H5LTpublic.h H5TBpublic.h H5DSpublic.h H5PTpublic.h
+include_HEADERS=hdf5_hl.h H5DOpublic.h H5IMpublic.h H5LTpublic.h H5TBpublic.h H5DSpublic.h H5PTpublic.h H5LDpublic.h
 
 include $(top_srcdir)/config/conclude.am
diff --git a/hl/src/Makefile.in b/hl/src/Makefile.in
index 6f04a4f..268218c 100644
--- a/hl/src/Makefile.in
+++ b/hl/src/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -33,7 +33,17 @@
 
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -96,21 +106,21 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/lt_vers.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(top_srcdir)/bin/depcomp $(include_HEADERS) \
-	$(top_srcdir)/bin/test-driver COPYING
 TESTS =
 subdir = hl/src
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \
+	$(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
@@ -144,7 +154,7 @@ am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"
 LTLIBRARIES = $(lib_LTLIBRARIES)
 libhdf5_hl_la_DEPENDENCIES = $(LIBHDF5)
 am_libhdf5_hl_la_OBJECTS = H5DO.lo H5DS.lo H5IM.lo H5LT.lo \
-	H5LTanalyze.lo H5LTparse.lo H5PT.lo H5TB.lo
+	H5LTanalyze.lo H5LTparse.lo H5PT.lo H5TB.lo H5LD.lo
 libhdf5_hl_la_OBJECTS = $(am_libhdf5_hl_la_OBJECTS)
 AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
@@ -165,7 +175,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -387,6 +397,10 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/depcomp \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am \
+	$(top_srcdir)/config/lt_vers.am COPYING
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -405,7 +419,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -450,14 +463,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -467,13 +488,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -515,9 +535,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -660,42 +691,24 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2
 # See libtool versioning documentation online.
 # After making changes, run bin/reconfigure to update other configure related
 # files like Makefile.in.
-LT_VERS_INTERFACE = 11
-LT_VERS_REVISION = 0
-LT_VERS_AGE = 1
-LT_CXX_VERS_INTERFACE = 11
-LT_CXX_VERS_REVISION = 0
-LT_CXX_VERS_AGE = 0
-LT_F_VERS_INTERFACE = 10
-LT_F_VERS_REVISION = 2
-LT_F_VERS_AGE = 0
-LT_HL_VERS_INTERFACE = 10
-LT_HL_VERS_REVISION = 2
-LT_HL_VERS_AGE = 0
-LT_HL_CXX_VERS_INTERFACE = 11
-LT_HL_CXX_VERS_REVISION = 0
-LT_HL_CXX_VERS_AGE = 0
-LT_HL_F_VERS_INTERFACE = 10
-LT_HL_F_VERS_REVISION = 2
-LT_HL_F_VERS_AGE = 0
-LT_TOOLS_VERS_INTERFACE = 10
-LT_TOOLS_VERS_REVISION = 2
-LT_TOOLS_VERS_AGE = 0
+LT_VERS_INTERFACE = 100
+LT_VERS_REVISION = 900
+LT_VERS_AGE = 0
 
 # This library is our main target.
 lib_LTLIBRARIES = libhdf5_hl.la
 
 # Add libtool numbers to the HDF5 hl library (from config/lt_vers.am)
-libhdf5_hl_la_LDFLAGS = -version-info $(LT_HL_VERS_INTERFACE):$(LT_HL_VERS_REVISION):$(LT_HL_VERS_AGE) $(AM_LDFLAGS)
+libhdf5_hl_la_LDFLAGS = -version-info $(LT_VERS_INTERFACE):$(LT_VERS_REVISION):$(LT_VERS_AGE) $(AM_LDFLAGS)
 
 # List sources to include in the HDF5 HL Library.
-libhdf5_hl_la_SOURCES = H5DO.c H5DS.c H5IM.c H5LT.c H5LTanalyze.c H5LTparse.c H5PT.c H5TB.c
+libhdf5_hl_la_SOURCES = H5DO.c H5DS.c H5IM.c H5LT.c H5LTanalyze.c H5LTparse.c H5PT.c H5TB.c H5LD.c
 
-# HDF5 HL library depends on HDF5 Library. 
+# HDF5 HL library depends on HDF5 Library.
 libhdf5_hl_la_LIBADD = $(LIBHDF5)
 
 # Public header files (to be installed)
-include_HEADERS = hdf5_hl.h H5DOpublic.h H5IMpublic.h H5LTpublic.h H5TBpublic.h H5DSpublic.h H5PTpublic.h
+include_HEADERS = hdf5_hl.h H5DOpublic.h H5IMpublic.h H5LTpublic.h H5TBpublic.h H5DSpublic.h H5PTpublic.h H5LDpublic.h
 
 # Automake needs to be taught how to build lib, progs, and tests targets.
 # These will be filled in automatically for the most part (e.g.,
@@ -732,7 +745,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/src/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign hl/src/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -741,7 +753,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/lt_vers.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/lt_vers.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -799,6 +811,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5DO.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5DS.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5IM.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5LD.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5LT.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5LTanalyze.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5LTparse.Plo at am__quote@
@@ -935,7 +948,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1210,6 +1223,8 @@ uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am \
 	uninstall-includeHEADERS uninstall-libLTLIBRARIES
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/hl/src/hdf5_hl.h b/hl/src/hdf5_hl.h
index 4e5fe33..f55aa04 100644
--- a/hl/src/hdf5_hl.h
+++ b/hl/src/hdf5_hl.h
@@ -27,7 +27,8 @@
 #include "H5LTpublic.h" /* lite */
 #include "H5IMpublic.h" /* image */
 #include "H5TBpublic.h" /* table */
-#include "H5PTpublic.h" /* table */
+#include "H5PTpublic.h" /* packet table */
+#include "H5LDpublic.h" /* lite dataset */
 
 #endif /*H5_INCLUDE_HL*/
 
diff --git a/hl/test/Makefile.am b/hl/test/Makefile.am
index 0809deb..7aa3f6b 100644
--- a/hl/test/Makefile.am
+++ b/hl/test/Makefile.am
@@ -1,4 +1,3 @@
-#
 # Copyright by The HDF Group.
 # Copyright by the Board of Trustees of the University of Illinois.
 # All rights reserved.
@@ -29,7 +28,8 @@ LDADD=$(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
 
 # Test programs.  These are our main targets.  They should be listed in the
 # order to be executed, generally most specific tests to least specific tests.
-TEST_PROG=test_lite test_image test_file_image test_table test_ds test_packet test_dset_opt
+TEST_PROG=test_lite test_image test_file_image test_table test_ds test_packet test_dset_opt \
+	test_ld test_dset_append
 check_PROGRAMS=$(TEST_PROG)
 
 # These programs generate test files for the tests.  They don't need to be
@@ -37,7 +37,7 @@ check_PROGRAMS=$(TEST_PROG)
 # them in a conditional causes automake to generate rules so that they
 # can be built by hand.  They can also be built by specifying
 # --enable-build-all at configure time.
-BUILD_ALL_PROGS=gen_test_ds
+BUILD_ALL_PROGS=gen_test_ds gen_test_ld
 
 if BUILD_ALL_CONDITIONAL
   noinst_PROGRAMS=$(BUILD_ALL_PROGS)
@@ -47,6 +47,6 @@ endif
 CHECK_CLEANFILES+=combine_tables[1-2].h5 test_ds[1-9].h5 test_ds10.h5 \
 	test_image[1-3].h5 file_img[1-2].h5 test_lite[1-4].h5 test_table.h5 \
 	test_packet_table.h5 test_packet_compress.h5 test_detach.h5 \
-        test_dectris.h5
+    test_dectris.h5 test_append.h5
 
 include $(top_srcdir)/config/conclude.am
diff --git a/hl/test/Makefile.in b/hl/test/Makefile.in
index 6fc324b..5972885 100644
--- a/hl/test/Makefile.in
+++ b/hl/test/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -14,7 +14,6 @@
 
 @SET_MAKE@
 
-#
 # Copyright by The HDF Group.
 # Copyright by the Board of Trustees of the University of Illinois.
 # All rights reserved.
@@ -34,7 +33,17 @@
 #
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -97,28 +106,29 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/H5srcdir_str.h.in $(top_srcdir)/bin/depcomp \
-	$(top_srcdir)/bin/test-driver COPYING
 check_PROGRAMS = $(am__EXEEXT_1)
 @BUILD_ALL_CONDITIONAL_TRUE at noinst_PROGRAMS = $(am__EXEEXT_2)
 TESTS = $(am__EXEEXT_1)
 subdir = hl/test
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES = H5srcdir_str.h
 CONFIG_CLEAN_VPATH_FILES =
 am__EXEEXT_1 = test_lite$(EXEEXT) test_image$(EXEEXT) \
 	test_file_image$(EXEEXT) test_table$(EXEEXT) test_ds$(EXEEXT) \
-	test_packet$(EXEEXT) test_dset_opt$(EXEEXT)
-am__EXEEXT_2 = gen_test_ds$(EXEEXT)
+	test_packet$(EXEEXT) test_dset_opt$(EXEEXT) test_ld$(EXEEXT) \
+	test_dset_append$(EXEEXT)
+am__EXEEXT_2 = gen_test_ds$(EXEEXT) gen_test_ld$(EXEEXT)
 PROGRAMS = $(noinst_PROGRAMS)
 gen_test_ds_SOURCES = gen_test_ds.c
 gen_test_ds_OBJECTS = gen_test_ds.$(OBJEXT)
@@ -128,10 +138,18 @@ AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
+gen_test_ld_SOURCES = gen_test_ld.c
+gen_test_ld_OBJECTS = gen_test_ld.$(OBJEXT)
+gen_test_ld_LDADD = $(LDADD)
+gen_test_ld_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
 test_ds_SOURCES = test_ds.c
 test_ds_OBJECTS = test_ds.$(OBJEXT)
 test_ds_LDADD = $(LDADD)
 test_ds_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
+test_dset_append_SOURCES = test_dset_append.c
+test_dset_append_OBJECTS = test_dset_append.$(OBJEXT)
+test_dset_append_LDADD = $(LDADD)
+test_dset_append_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
 test_dset_opt_SOURCES = test_dset_opt.c
 test_dset_opt_OBJECTS = test_dset_opt.$(OBJEXT)
 test_dset_opt_LDADD = $(LDADD)
@@ -144,6 +162,10 @@ test_image_SOURCES = test_image.c
 test_image_OBJECTS = test_image.$(OBJEXT)
 test_image_LDADD = $(LDADD)
 test_image_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
+test_ld_SOURCES = test_ld.c
+test_ld_OBJECTS = test_ld.$(OBJEXT)
+test_ld_LDADD = $(LDADD)
+test_ld_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
 test_lite_SOURCES = test_lite.c
 test_lite_OBJECTS = test_lite.$(OBJEXT)
 test_lite_LDADD = $(LDADD)
@@ -168,7 +190,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -190,11 +212,12 @@ AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = gen_test_ds.c test_ds.c test_dset_opt.c test_file_image.c \
-	test_image.c test_lite.c test_packet.c test_table.c
-DIST_SOURCES = gen_test_ds.c test_ds.c test_dset_opt.c \
-	test_file_image.c test_image.c test_lite.c test_packet.c \
-	test_table.c
+SOURCES = gen_test_ds.c gen_test_ld.c test_ds.c test_dset_append.c \
+	test_dset_opt.c test_file_image.c test_image.c test_ld.c \
+	test_lite.c test_packet.c test_table.c
+DIST_SOURCES = gen_test_ds.c gen_test_ld.c test_ds.c \
+	test_dset_append.c test_dset_opt.c test_file_image.c \
+	test_image.c test_ld.c test_lite.c test_packet.c test_table.c
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -421,6 +444,10 @@ am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
 TEST_LOGS = $(am__test_logs2:.sh.log=.log)
 SH_LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
 SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/H5srcdir_str.h.in $(srcdir)/Makefile.in \
+	$(top_srcdir)/bin/depcomp $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am COPYING
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -442,7 +469,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -487,14 +513,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -504,13 +538,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -552,9 +585,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -697,21 +741,23 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 \
 	combine_tables[1-2].h5 test_ds[1-9].h5 test_ds10.h5 \
 	test_image[1-3].h5 file_img[1-2].h5 test_lite[1-4].h5 \
 	test_table.h5 test_packet_table.h5 test_packet_compress.h5 \
-	test_detach.h5 test_dectris.h5
+	test_detach.h5 test_dectris.h5 test_append.h5
 
 # The tests depend on the hdf5, hdf5 test,  and hdf5_hl libraries
 LDADD = $(LIBH5_HL) $(LIBH5TEST) $(LIBHDF5)
 
 # Test programs.  These are our main targets.  They should be listed in the
 # order to be executed, generally most specific tests to least specific tests.
-TEST_PROG = test_lite test_image test_file_image test_table test_ds test_packet test_dset_opt
+TEST_PROG = test_lite test_image test_file_image test_table test_ds test_packet test_dset_opt \
+	test_ld test_dset_append
+
 
 # These programs generate test files for the tests.  They don't need to be
 # compiled every time we want to test the library.  However, putting
 # them in a conditional causes automake to generate rules so that they
 # can be built by hand.  They can also be built by specifying
 # --enable-build-all at configure time.
-BUILD_ALL_PROGS = gen_test_ds
+BUILD_ALL_PROGS = gen_test_ds gen_test_ld
 
 # Automake needs to be taught how to build lib, progs, and tests targets.
 # These will be filled in automatically for the most part (e.g.,
@@ -748,7 +794,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/test/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign hl/test/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -757,7 +802,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -792,10 +837,18 @@ gen_test_ds$(EXEEXT): $(gen_test_ds_OBJECTS) $(gen_test_ds_DEPENDENCIES) $(EXTRA
 	@rm -f gen_test_ds$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(gen_test_ds_OBJECTS) $(gen_test_ds_LDADD) $(LIBS)
 
+gen_test_ld$(EXEEXT): $(gen_test_ld_OBJECTS) $(gen_test_ld_DEPENDENCIES) $(EXTRA_gen_test_ld_DEPENDENCIES) 
+	@rm -f gen_test_ld$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(gen_test_ld_OBJECTS) $(gen_test_ld_LDADD) $(LIBS)
+
 test_ds$(EXEEXT): $(test_ds_OBJECTS) $(test_ds_DEPENDENCIES) $(EXTRA_test_ds_DEPENDENCIES) 
 	@rm -f test_ds$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(test_ds_OBJECTS) $(test_ds_LDADD) $(LIBS)
 
+test_dset_append$(EXEEXT): $(test_dset_append_OBJECTS) $(test_dset_append_DEPENDENCIES) $(EXTRA_test_dset_append_DEPENDENCIES) 
+	@rm -f test_dset_append$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_dset_append_OBJECTS) $(test_dset_append_LDADD) $(LIBS)
+
 test_dset_opt$(EXEEXT): $(test_dset_opt_OBJECTS) $(test_dset_opt_DEPENDENCIES) $(EXTRA_test_dset_opt_DEPENDENCIES) 
 	@rm -f test_dset_opt$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(test_dset_opt_OBJECTS) $(test_dset_opt_LDADD) $(LIBS)
@@ -808,6 +861,10 @@ test_image$(EXEEXT): $(test_image_OBJECTS) $(test_image_DEPENDENCIES) $(EXTRA_te
 	@rm -f test_image$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(test_image_OBJECTS) $(test_image_LDADD) $(LIBS)
 
+test_ld$(EXEEXT): $(test_ld_OBJECTS) $(test_ld_DEPENDENCIES) $(EXTRA_test_ld_DEPENDENCIES) 
+	@rm -f test_ld$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(test_ld_OBJECTS) $(test_ld_LDADD) $(LIBS)
+
 test_lite$(EXEEXT): $(test_lite_OBJECTS) $(test_lite_DEPENDENCIES) $(EXTRA_test_lite_DEPENDENCIES) 
 	@rm -f test_lite$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(test_lite_OBJECTS) $(test_lite_LDADD) $(LIBS)
@@ -827,10 +884,13 @@ distclean-compile:
 	-rm -f *.tab.c
 
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_test_ds.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_test_ld.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/test_ds.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/test_dset_append.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/test_dset_opt.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/test_file_image.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/test_image.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/test_ld.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/test_lite.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/test_packet.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/test_table.Po at am__quote@
@@ -944,7 +1004,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1093,6 +1153,20 @@ test_dset_opt.log: test_dset_opt$(EXEEXT)
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
+test_ld.log: test_ld$(EXEEXT)
+	@p='test_ld$(EXEEXT)'; \
+	b='test_ld'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+test_dset_append.log: test_dset_append$(EXEEXT)
+	@p='test_dset_append$(EXEEXT)'; \
+	b='test_dset_append'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
 .sh.log:
 	@p='$<'; \
 	$(am__set_b); \
@@ -1265,6 +1339,8 @@ uninstall-am:
 	mostlyclean-local pdf pdf-am ps ps-am recheck tags tags-am \
 	uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/hl/test/gen_test_ld.c b/hl/test/gen_test_ld.c
new file mode 100644
index 0000000..1313d2a
--- /dev/null
+++ b/hl/test/gen_test_ld.c
@@ -0,0 +1,379 @@
+#include "hdf5.h"
+#include "H5LDprivate.h"
+#include <time.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <stdlib.h>
+
+/*
+ *  WATCH.h5: file with various types of datasets for testing--                                   
+ *
+ *  The following datasets are chunked, H5D_ALLOC_TIME_INCR, max. dimensional setting:       
+ *      DSET_ONE: one-dimensional dataset                                                   
+ *      DSET_TWO: two-dimensional dataset                                                  
+ *      DSET_CMPD: one-dimensional dataset with compound type                             
+ *      DSET_CMPD_ESC: one-dimensional dataset with compound type and member names with
+ *		       escape/separator characters 
+ *      DSET_CMPD_TWO: two-dimensional dataset with compound type                             
+ *                                                                                           
+ *  The following datasets are one-dimensional, chunked, max. dimension setting:              
+ *      DSET_ALLOC_EARLY: dataset with H5D_ALLOC_TIME_EARLY                                  
+ *      DSET_ALLOC_LATE: dataset H5D_ALLOC_TIME_LATE                                        
+ *                                                                                       
+ *  The following datasets are one-dimensional:                                           
+ *      DSET_NONE: fixed dimension setting, contiguous, H5D_ALLOC_TIME_LATE              
+ *      DSET_NOMAX: fixed dimension setting, chunked, H5D_ALLOC_TIME_INCR      
+ */
+#define ONE_DIMS0	10
+#define MAX_ONE_DIMS0	100
+
+#define DSET_ONE 	"DSET_ONE"
+#define DSET_NONE	"DSET_NONE"
+#define DSET_NOMAX	"DSET_NOMAX"
+#define DSET_ALLOC_LATE "DSET_ALLOC_LATE"
+#define DSET_ALLOC_EARLY "DSET_ALLOC_EARLY"
+#define DSET_CMPD 	"DSET_CMPD"
+#define DSET_CMPD_ESC 	"DSET_CMPD_ESC"
+#define DSET_NULL 	"DSET_NULL"
+#define DSET_SCALAR 	"DSET_SCALAR"
+
+#define TWO_DIMS0	4
+#define TWO_DIMS1	10
+#define MAX_TWO_DIMS0	60
+#define MAX_TWO_DIMS1	100
+
+#define DSET_TWO 	"DSET_TWO"
+#define DSET_CMPD_TWO 	"DSET_CMPD_TWO"
+
+#define CHUNK_SIZE	2
+
+#define FILE "test_ld.h5"
+
+/* Data structures for datasets with compound types */
+typedef struct sub22_t {
+    unsigned int a;
+    unsigned int b;
+    unsigned int c;
+} sub22_t;
+
+typedef struct sub2_t {
+    unsigned int a;
+    sub22_t b;
+    unsigned int c;
+} sub2_t;
+
+typedef struct sub4_t {
+    unsigned int a;
+    unsigned int b;
+} sub4_t;
+
+typedef struct set_t {
+    unsigned int field1;
+    sub2_t field2;
+    double field3;
+    sub4_t field4;
+} set_t;
+
+/*
+ **************************************************************************************
+ *
+ * Create a dataset with the given input parameters
+ * Write to the dataset with the given "data"
+ *
+ **************************************************************************************
+ */
+static int
+generate_dset(hid_t fid, const char *dname, int ndims, hsize_t *dims,
+    hsize_t *maxdims, hid_t dtid, void *data)
+{
+    hid_t dcpl = -1;	/* Dataset creation property */
+    hid_t did = -1;	/* Dataset id */
+    hid_t sid = -1;	/* Dataspace id */
+    int i;		/* Local index variable */
+
+    /* Create the dataspace */
+    if((sid = H5Screate_simple(ndims, dims, maxdims)) < 0)
+	goto done;
+
+    /* Set up dataset's creation properties */
+    if(!HDstrcmp(dname, DSET_NONE))
+	dcpl = H5P_DEFAULT;
+    else {
+        hsize_t chunk_dims[H5S_MAX_RANK];	/* Dimension sizes for chunks */
+
+	if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+	    goto done;
+	for(i = 0; i < ndims; i++)
+	    chunk_dims[i] = CHUNK_SIZE;
+	if(H5Pset_chunk(dcpl, ndims, chunk_dims) < 0)
+	    goto done;
+    } /* end else */
+
+    if(!HDstrcmp(dname, DSET_ALLOC_LATE)) {
+	if(H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_LATE) < 0)
+	    goto done;
+    } /* end if */
+    else if(!HDstrcmp(dname, DSET_ALLOC_EARLY)) {
+	if(H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY) < 0)
+	    goto done;
+    } /* end if */
+
+    /* Create the dataset */
+    if((did = H5Dcreate2(fid, dname, dtid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	goto done;
+
+    /* Write to the dataset */
+    if(H5Dwrite(did, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
+	goto done;
+
+    /* Closing */
+    if(H5Pclose(dcpl) < 0)
+        goto done;
+    if(H5Sclose(sid) < 0)
+        goto done;
+    if(H5Dclose(did) < 0)
+        goto done;
+
+    return(SUCCEED);
+
+done:
+    H5E_BEGIN_TRY
+	H5Sclose(sid);
+	H5Pclose(dcpl);
+	H5Dclose(did);
+    H5E_END_TRY
+
+    return(FAIL);
+} /* generate_dset() */
+
+int
+main(void)
+{
+    hid_t fid;			/* File id */
+    hid_t fapl;			/* File access property list */
+    hsize_t cur_dims[1];	/* Dimension sizes */
+    hsize_t max_dims[1];	/* Maximum dimension sizes */
+    hsize_t cur2_dims[2];	/* Current dimension sizes */
+    hsize_t max2_dims[2];	/* Maximum dimension sizes */
+    hid_t set_tid, esc_set_tid;	/* Compound type id */
+    hid_t sub22_tid;		/* Compound type id */
+    hid_t sub2_tid, esc_sub2_tid;	/* Compound type id */
+    hid_t sub4_tid, esc_sub4_tid;	/* Compound type id */
+    hid_t null_did, null_sid;		/* H5S_NULL dataset & dataspace ids */
+    hid_t scalar_did, scalar_sid;	/* H5S_SCALAR dataset & dataspace ids */
+    int one_data[ONE_DIMS0];		/* Buffer for data */
+    int two_data[TWO_DIMS0*TWO_DIMS1];	/* Buffer for data */
+    set_t one_cbuf[ONE_DIMS0];		/* Buffer for data with compound type */
+    set_t two_cbuf[TWO_DIMS0*TWO_DIMS1];	/* Buffer for data with compound type */
+    int i;			/* Local index variable */
+
+    /* Create a file access property list */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        goto done;
+
+    /* Set to use latest library format */
+    if((H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST)) < 0)
+        goto done;
+
+    /* Create a file */
+    if((fid = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+	goto done;
+
+    /* Initialization for one-dimensional dataset */
+    cur_dims[0] = ONE_DIMS0;
+    max_dims[0] = MAX_ONE_DIMS0;
+    for(i = 0; i < ONE_DIMS0; i++)
+        one_data[i] = i;
+
+    /* Generate DSET_ONE, DSET_NONE, DSET_NOMAX, DSET_ALLOC_LATE, DSET_EARLY */
+    if(generate_dset(fid, DSET_ONE, 1, cur_dims, max_dims, H5T_NATIVE_INT, one_data) < 0)
+	goto done;
+    if(generate_dset(fid, DSET_NONE, 1, cur_dims, NULL, H5T_NATIVE_INT, one_data) < 0)
+	goto done;
+    if(generate_dset(fid, DSET_NOMAX, 1, cur_dims, NULL, H5T_NATIVE_INT, one_data) < 0)
+	goto done;
+    if(generate_dset(fid, DSET_ALLOC_LATE, 1, cur_dims, max_dims, H5T_NATIVE_INT, one_data) < 0)
+	goto done;
+    if(generate_dset(fid, DSET_ALLOC_EARLY, 1, cur_dims, max_dims, H5T_NATIVE_INT, one_data) < 0)
+	goto done;
+
+    /* Initialization for two-dimensional dataset */
+    cur2_dims[0] = TWO_DIMS0;
+    cur2_dims[1] = TWO_DIMS1;
+    max2_dims[0] = MAX_TWO_DIMS0;
+    max2_dims[1] = MAX_TWO_DIMS1;
+
+    for(i = 0; i < (TWO_DIMS0 * TWO_DIMS1); i++)
+        two_data[i] = i;
+
+    /* Generate DSET_TWO */
+    if(generate_dset(fid, DSET_TWO, 2, cur2_dims, max2_dims, H5T_NATIVE_INT, two_data) < 0)
+	goto done;
+
+    /* Initialization for one-dimensional compound typed dataset */
+    cur_dims[0] = ONE_DIMS0;
+    max_dims[0] = MAX_ONE_DIMS0;
+
+    for (i = 0; i < ONE_DIMS0; i++) {
+        one_cbuf[i].field1 = 1;
+        one_cbuf[i].field2.a = 2;
+        one_cbuf[i].field2.c = 4;
+        one_cbuf[i].field2.b.a = 20;
+        one_cbuf[i].field2.b.b = 40;
+        one_cbuf[i].field2.b.c = 80;
+        one_cbuf[i].field3 = 3.0f;
+        one_cbuf[i].field4.a = 4;
+        one_cbuf[i].field4.b = 8;
+    } /* end for */
+
+    /* Create the compound type */
+    if((sub22_tid = H5Tcreate(H5T_COMPOUND, sizeof(sub22_t))) < 0)
+	goto done;
+    if(H5Tinsert(sub22_tid, "a", HOFFSET(sub22_t, a), H5T_NATIVE_INT) < 0)
+	goto done;
+    if(H5Tinsert(sub22_tid, "b", HOFFSET(sub22_t, b), H5T_NATIVE_INT) < 0)
+	goto done;
+    if(H5Tinsert(sub22_tid, "c", HOFFSET(sub22_t, c), H5T_NATIVE_INT) < 0)
+	goto done;
+
+    if((sub2_tid = H5Tcreate(H5T_COMPOUND, sizeof(sub2_t))) < 0)
+	goto done;
+    if(H5Tinsert(sub2_tid, "a", HOFFSET(sub2_t, a), H5T_NATIVE_INT) < 0)
+	goto done;
+    if(H5Tinsert(sub2_tid, "b", HOFFSET(sub2_t, b), sub22_tid) < 0)
+	goto done;
+    if(H5Tinsert(sub2_tid, "c", HOFFSET(sub2_t, c), H5T_NATIVE_INT) < 0)
+	goto done;
+
+    if((sub4_tid = H5Tcreate(H5T_COMPOUND, sizeof(sub4_t))) < 0)
+	goto done;
+    if(H5Tinsert(sub4_tid, "a", HOFFSET(sub4_t, a), H5T_NATIVE_INT) < 0)
+	goto done;
+    if(H5Tinsert(sub4_tid, "b", HOFFSET(sub4_t, b), H5T_NATIVE_INT) < 0)
+	goto done;
+
+    if((set_tid = H5Tcreate(H5T_COMPOUND, sizeof(set_t))) < 0)
+	goto done;
+    if(H5Tinsert(set_tid, "field1", HOFFSET(set_t, field1), H5T_NATIVE_INT) < 0)
+	goto done;
+    if(H5Tinsert(set_tid, "field2", HOFFSET(set_t, field2), sub2_tid) < 0)
+	goto done;
+    if(H5Tinsert(set_tid, "field3", HOFFSET(set_t, field3), H5T_NATIVE_DOUBLE) < 0)
+	goto done;
+    if(H5Tinsert(set_tid, "field4", HOFFSET(set_t, field4), sub4_tid) < 0)
+	goto done;
+
+    /* Create the compound type with escape/separator characters */
+    if((esc_sub2_tid = H5Tcreate(H5T_COMPOUND, sizeof(sub2_t))) < 0)
+	goto done;
+    if(H5Tinsert(esc_sub2_tid, ".a", HOFFSET(sub2_t, a), H5T_NATIVE_INT) < 0)
+	goto done;
+    if(H5Tinsert(esc_sub2_tid, ",b", HOFFSET(sub2_t, b), sub22_tid) < 0)
+	goto done;
+    if(H5Tinsert(esc_sub2_tid, "\\c", HOFFSET(sub2_t, c), H5T_NATIVE_INT) < 0)
+	goto done;
+
+    if((esc_sub4_tid = H5Tcreate(H5T_COMPOUND, sizeof(sub4_t))) < 0)
+	goto done;
+    if(H5Tinsert(esc_sub4_tid, "a.", HOFFSET(sub4_t, a), H5T_NATIVE_INT) < 0)
+	goto done;
+    if(H5Tinsert(esc_sub4_tid, "b,", HOFFSET(sub4_t, b), H5T_NATIVE_INT) < 0)
+	goto done;
+
+    if((esc_set_tid = H5Tcreate(H5T_COMPOUND, sizeof(set_t))) < 0)
+	goto done;
+    if(H5Tinsert(esc_set_tid, "field,1", HOFFSET(set_t, field1), H5T_NATIVE_INT) < 0)
+	goto done;
+    if(H5Tinsert(esc_set_tid, "field2.", HOFFSET(set_t, field2), esc_sub2_tid) < 0)
+	goto done;
+    if(H5Tinsert(esc_set_tid, "field\\3", HOFFSET(set_t, field3), H5T_NATIVE_DOUBLE) < 0)
+	goto done;
+    if(H5Tinsert(esc_set_tid, "field4,", HOFFSET(set_t, field4), esc_sub4_tid) < 0)
+	goto done;
+
+    /* Generate DSET_CMPD, DSET_CMPD_ESC */
+    if(generate_dset(fid, DSET_CMPD, 1, cur_dims, max_dims, set_tid, one_cbuf) < 0)
+	goto done;
+    if(generate_dset(fid, DSET_CMPD_ESC, 1, cur_dims, max_dims, esc_set_tid, one_cbuf) < 0)
+	goto done;
+
+    /* Initialization for two-dimensional compound typed dataset */
+    cur2_dims[0] = TWO_DIMS0;
+    cur2_dims[1] = TWO_DIMS1;
+    max2_dims[0] = MAX_TWO_DIMS0;
+    max2_dims[0] = MAX_TWO_DIMS1;
+
+    for (i = 0; i < (TWO_DIMS0 * TWO_DIMS1); i++) {
+        two_cbuf[i].field1 = 1;
+        two_cbuf[i].field2.a = 2;
+        two_cbuf[i].field2.c = 4;
+        two_cbuf[i].field2.b.a = 20;
+        two_cbuf[i].field2.b.b = 40;
+        two_cbuf[i].field2.b.c = 80;
+        two_cbuf[i].field3 = 3.0f;
+        two_cbuf[i].field4.a = 4;
+        two_cbuf[i].field4.b = 8;
+    } /* end for */
+
+    /* Generate DSET_CMPD_TWO */
+    if(generate_dset(fid, DSET_CMPD_TWO, 2, cur2_dims, max2_dims, set_tid, two_cbuf) < 0)
+	goto done;
+
+    /* Create NULL dataspace */
+    if((null_sid = H5Screate(H5S_NULL)) < 0)
+	goto done;
+
+    /* Create the NULL dataset */
+    if((null_did = H5Dcreate2(fid, DSET_NULL, H5T_NATIVE_UINT, null_sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	goto done;
+
+    /* Create SCALAR dataspace */
+    if((scalar_sid = H5Screate(H5S_SCALAR)) < 0)
+	goto done;
+
+    /* Create the SCALAR dataset */
+    if((scalar_did = H5Dcreate2(fid, DSET_SCALAR, H5T_NATIVE_INT, scalar_sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	goto done;
+
+    /* Closing */
+    if(H5Dclose(scalar_did) < 0) goto done;
+    if(H5Sclose(scalar_sid) < 0) goto done;
+
+    if(H5Dclose(null_did) < 0) goto done;
+    if(H5Sclose(null_sid) < 0) goto done;
+
+    if(H5Tclose(sub22_tid) < 0) goto done;
+    if(H5Tclose(sub2_tid) < 0) goto done;
+    if(H5Tclose(sub4_tid) < 0) goto done;
+    if(H5Tclose(set_tid) < 0) goto done;
+    if(H5Tclose(esc_sub2_tid) < 0) goto done;
+    if(H5Tclose(esc_sub4_tid) < 0) goto done;
+    if(H5Tclose(esc_set_tid) < 0) goto done;
+
+    if(H5Pclose(fapl) < 0) goto done;
+    if(H5Fclose(fid) < 0) goto done;
+
+    exit(EXIT_SUCCESS);
+
+done:
+    H5E_BEGIN_TRY
+	H5Tclose(sub22_tid);
+	H5Tclose(sub2_tid);
+	H5Tclose(sub4_tid);
+	H5Tclose(set_tid);
+	H5Tclose(esc_sub2_tid);
+	H5Tclose(esc_sub4_tid);
+	H5Tclose(esc_set_tid);
+
+	H5Dclose(null_did);
+	H5Sclose(null_sid);
+	H5Dclose(scalar_did);
+	H5Sclose(scalar_sid);
+
+	H5Pclose(fapl);
+	H5Fclose(fid);
+    H5E_END_TRY
+
+    exit(EXIT_FAILURE);
+} /* main() */
+
diff --git a/hl/test/test_ds.c b/hl/test/test_ds.c
index 3d5b728..7b6fb82 100644
--- a/hl/test/test_ds.c
+++ b/hl/test/test_ds.c
@@ -1105,10 +1105,10 @@ herr_t test_cmp_scalename(hid_t fid, hid_t did, const char *name, const char *sc
     if((dsid = H5Dopen2(fid, name, H5P_DEFAULT)) >= 0) {
         if(H5DSis_attached(did, dsid, idx) == 1) {
             if((name_len=H5DSget_scale_name(dsid,NULL,(size_t)0)) > 0) {
-	        name_out = (char*)HDmalloc((name_len+1) * sizeof (char));
+	        name_out = (char*)HDmalloc(((size_t)name_len+1) * sizeof (char));
                 if(name_out != NULL) {
                     if(H5DSget_scale_name(dsid, name_out, (size_t)name_len+1) >= 0) {
-                        if(HDstrcmp(scalename,name_out)==0) {
+                        if(HDstrncmp(scalename, name_out, (size_t)name_len)==0) {
                             ret_value = SUCCEED;
                         }
                         HDfree(name_out);
@@ -2174,15 +2174,7 @@ static int test_foreign_scaleattached(const char *fileforeign)
     hid_t   fid = -1;
     hid_t   did = -1;
     hid_t   dsid = -1;
-    char  *srcdir = getenv("srcdir"); /* the source directory */
-    char  filename[512]="";          /* buffer to hold name of existing file */
-
-    /* compose the name of the file to open, using the srcdir, if appropriate */
-    if (srcdir) {
-        HDstrcpy(filename,srcdir);
-        HDstrcat(filename,"/");
-    }
-    HDstrcat(filename, fileforeign);
+    const char *filename = H5_get_srcdir_filename(fileforeign);
 
     TESTING2("test_foreign_scaleattached");
 
@@ -3126,7 +3118,7 @@ static int test_simple(void)
         goto out;
 
     /* allocate a  buffer */
-    name_out = (char*)HDmalloc((name_len+1) * sizeof (char));
+    name_out = (char*)HDmalloc(((size_t)name_len+1) * sizeof (char));
     if(name_out == NULL)
         goto out;
 
@@ -4868,19 +4860,9 @@ static int read_data( const char* fname,
     size_t   nelms;
     FILE     *f;
     float    val;
-    char     *srcdir = getenv("srcdir");  /* the source directory */
-    char     data_file[512];              /* buffer to hold name of existing data file */
+    const char *data_file = H5_get_srcdir_filename(fname);
 
-    HDstrcpy(data_file, "");
-    /* compose the name of the file to open, using the srcdir, if appropriate */
-    if(srcdir)
-    {
-        HDstrcpy(data_file, srcdir);
-        HDstrcat(data_file, "/");
-    }
     /* read first data file */
-    HDstrcat(data_file,fname);
-
     f = HDfopen(data_file, "r");
     if( f == NULL ) {
         printf( "Could not open file %s\n", data_file );
diff --git a/hl/test/test_dset_append.c b/hl/test/test_dset_append.c
new file mode 100644
index 0000000..0f193d9
--- /dev/null
+++ b/hl/test/test_dset_append.c
@@ -0,0 +1,1196 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+* Copyright by The HDF Group.                                               *
+* Copyright by the Board of Trustees of the University of Illinois.         *
+* All rights reserved.                                                      *
+*                                                                           *
+* This file is part of HDF5.  The full HDF5 copyright notice, including     *
+* terms governing use, modification, and redistribution, is contained in    *
+* the files COPYING and Copyright.html.  COPYING can be found at the root   *
+* of the source code distribution tree; Copyright.html can be found at the  *
+* root level of an installed copy of the electronic HDF5 document set and   *
+* is linked from the top-level documents page.  It can also be found at     *
+* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+* access to either file, you may request a copy from help at hdfgroup.org.     *
+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <stdlib.h>
+#include <string.h>
+#include "h5hltest.h"
+#include "H5srcdir.h"
+#include "H5DOpublic.h"
+#include <math.h>
+
+#if defined(H5_HAVE_ZLIB_H) && !defined(H5_ZLIB_HEADER) 
+# define H5_ZLIB_HEADER "zlib.h"
+#endif
+#if defined(H5_ZLIB_HEADER)
+# include H5_ZLIB_HEADER /* "zlib.h" */
+#endif
+
+#define FILE		"test_append.h5"
+#define DNAME_UNLIM	"dataset_unlim"
+#define DNAME_LESS	"dataset_less"
+#define DNAME_VARY	"dataset_vary"
+#define DNAME_ROW	"dataset_row"
+#define DNAME_COLUMN	"dataset_column"
+#define DBUGNAME1	"dataset_bug1"
+#define DBUGNAME2	"dataset_bug2"
+
+/* The callback function for the object flush property */
+static herr_t
+flush_func(hid_t H5_ATTR_UNUSED obj_id, void *_udata)
+{
+    unsigned *flush_ct = (unsigned*)_udata;
+    ++(*flush_ct);
+    return 0;
+}
+
+/* The callback function for the append flush property */
+static herr_t
+append_func(hid_t H5_ATTR_UNUSED dset_id, hsize_t H5_ATTR_UNUSED *cur_dims, void *_udata)
+{
+    unsigned *append_ct = (unsigned *)_udata;
+    ++(*append_ct);
+    return 0;
+}
+
+/*-------------------------------------------------------------------------
+ * Function:	test_dataset_append_rows_columns
+ *
+ * Purpose:	Verify that the object flush property and the append flush property
+ *		are working properly when appending rows and columns to a dataset
+ *		with 2 extendible dimensions.
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:  Vailin Choi; Jan 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_dataset_append_rows_columns(hid_t fid)
+{
+    hid_t did = -1;			/* Dataset ID */
+    hid_t sid = -1;			/* Dataspace ID */
+    hid_t dcpl = -1;			/* A copy of dataset creation property */
+    hid_t dapl = -1;			/* A copy of dataset access property */
+    hid_t ffapl = -1;			/* The file's file access property list */
+
+    hsize_t dims[2] = {0, 10};					/* Current dimension sizes */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED};	/* Maximum dimension sizes */
+    hsize_t chunk_dims[2] = {2,5};				/* Chunk dimension sizes */
+    int lbuf[10], cbuf[6];		/* The data buffers */
+    int buf[6][13], rbuf[6][13];	/* The data buffers */
+
+    hsize_t boundary[2] = {1, 1};	/* Boundary sizes */
+    unsigned append_ct = 0;		/* The # of appends */
+    unsigned *flush_ptr;		/* Points to the flush counter */
+
+    int i, j;				/* Local index variables */
+
+    TESTING("Append flush with H5DOappend()--append rows & columns");
+
+    /* Get the file's file access property list */
+    if((ffapl = H5Fget_access_plist(fid)) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Set to create a chunked dataset with 2 extendible dimensions */
+    if((sid = H5Screate_simple(2, dims, maxdims)) < 0) 
+	FAIL_STACK_ERROR;
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) 
+	FAIL_STACK_ERROR;
+    if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Set append flush property */
+    if((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0) 
+	FAIL_STACK_ERROR;
+    if(H5Pset_append_flush(dapl, 2, boundary, append_func, &append_ct) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Create the dataset */
+    if((did = H5Dcreate2(fid, DNAME_UNLIM, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, dapl)) < 0) 
+	TEST_ERROR;
+
+    /* Append 6 rows to the dataset */
+    for(i = 0; i < 6; i++) {
+	for(j = 0; j < 10; j++)
+	    lbuf[j] = buf[i][j] = (i * 10) + (j + 1);
+	if(H5DOappend(did, H5P_DEFAULT, 0, (size_t)1, H5T_NATIVE_INT, lbuf) < 0)
+	    TEST_ERROR;
+    } /* end for */
+
+    /* Verify the # of appends */
+    if(append_ct != 6)
+	TEST_ERROR;
+
+    /* Retrieve and verify object flush counts */
+    if(H5Pget_object_flush_cb(ffapl, NULL, (void **)&flush_ptr) < 0)
+	FAIL_STACK_ERROR;
+    if(*flush_ptr != 6)
+	TEST_ERROR;
+
+    /* Append 3 columns to the dataset */
+    for(i = 0; i < 3; i++) {
+	for(j = 0; j < 6; j++)
+	    cbuf[j] = buf[j][i + 10] = ((i * 6) + (j + 1)) * -1;
+	if(H5DOappend(did, H5P_DEFAULT, 1, (size_t)1, H5T_NATIVE_INT, cbuf) < 0)
+	    TEST_ERROR;
+    } /* end for */
+
+    /* Verify the # of appends */
+    if(append_ct != 9)
+	TEST_ERROR;
+
+    /* Retrieve and verify object flush counts */
+    if(H5Pget_object_flush_cb(ffapl, NULL, (void **)&flush_ptr) < 0)
+	FAIL_STACK_ERROR;
+    if(*flush_ptr != 9)
+	TEST_ERROR;
+
+    /* Read the dataset */
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+	FAIL_STACK_ERROR;
+    
+    /* Verify the data */
+    for(i = 0; i < 6; i++)
+	for(j = 0; j < 13; j++)
+            if(buf[i][j] != rbuf[i][j])
+                TEST_ERROR;
+
+    /* Clear the buffer */
+    HDmemset(rbuf, 0, sizeof(rbuf));
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Open the dataset again */
+    if((did = H5Dopen2(fid, DNAME_UNLIM, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Read the dataset */
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Verify the data */
+    for(i = 0; i < 6; i++)
+	for(j = 0; j < 13; j++)
+            if(buf[i][j] != rbuf[i][j])
+                TEST_ERROR;
+
+    /* Closing */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Sclose(sid) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(dapl) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(dcpl) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(ffapl) < 0)
+	FAIL_STACK_ERROR;
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+	H5Pclose(dapl);
+	H5Pclose(dcpl);
+	H5Pclose(sid);
+	H5Dclose(did);
+	H5Pclose(ffapl);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_dataset_append_rows_columns() */
+
+/*-------------------------------------------------------------------------
+ * Function:	test_dataset_append_rows
+ *
+ * Purpose:	Verify that the object flush property and the append flush property
+ *		are working properly when appending rows to a dataset with
+ *		one extendible dimension (row).
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:  Vailin Choi; Jan 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_dataset_append_rows(hid_t fid)
+{
+    hid_t did = -1;			/* Dataset ID */
+    hid_t sid = -1;			/* Dataspace ID */
+    hid_t dcpl = -1;			/* A copy of dataset creation property */
+    hid_t dapl = -1;			/* A copy of dataset access property */
+    hid_t ffapl = -1;			/* The file's file access property list */
+
+    hsize_t dims[2] = {0, 10};			/* Current dimension sizes */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, 10};	/* Maximum dimension sizes */
+    hsize_t chunk_dims[2] = {2,5};		/* Chunk dimension sizes */
+    int lbuf[10];			/* The data buffer */
+    int buf[6][10], rbuf[6][10];	/* The data buffers */
+    int i, j;				/* Local index variables */
+
+    hsize_t boundary[2] = {1, 0};	/* Boundary sizes */
+    unsigned append_ct = 0;		/* The # of appends */
+    unsigned *flush_ptr;		/* Points to the flush counter */
+
+    TESTING("Append flush with H5DOappend()--append rows");
+
+    /* Get the file's file access property list */
+    if((ffapl = H5Fget_access_plist(fid)) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Set to create a chunked dataset with 1 extendible dimension */
+    if((sid = H5Screate_simple(2, dims, maxdims)) < 0) 
+	FAIL_STACK_ERROR;
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) 
+	FAIL_STACK_ERROR;
+    if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Set append flush property */
+    if((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0) 
+	FAIL_STACK_ERROR;
+    if(H5Pset_append_flush(dapl, 2, boundary, append_func, &append_ct) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Create the dataset */
+    if((did = H5Dcreate2(fid, DNAME_ROW, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, dapl)) < 0) 
+	TEST_ERROR;
+
+    /* Append 6 rows to the dataset */
+    for(i = 0; i < 6; i++) {
+	for(j = 0; j < 10; j++)
+	    lbuf[j] = buf[i][j] = (i * 10) + (j + 1);
+	if(H5DOappend(did, H5P_DEFAULT, 0, (size_t)1, H5T_NATIVE_INT, lbuf) < 0)
+	    TEST_ERROR;
+    } /* end for */
+
+    /* Verify the # of appends */
+    if(append_ct != 6)
+	TEST_ERROR;
+
+    if(H5Pget_object_flush_cb(ffapl, NULL, (void **)&flush_ptr) < 0)
+	FAIL_STACK_ERROR;
+    if(*flush_ptr != 6)
+	TEST_ERROR;
+
+    /* Read the dataset */
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+	FAIL_STACK_ERROR;
+    
+    /* Verify the data */
+    for(i = 0; i < 6; i++)
+	for(j = 0; j < 10; j++)
+            if(buf[i][j] != rbuf[i][j])
+                TEST_ERROR;
+
+    /* Clear the buffer */
+    HDmemset(rbuf, 0, sizeof(rbuf));
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Open the dataset again */
+    if((did = H5Dopen2(fid, DNAME_ROW, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Read the dataset */
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Verify the data */
+    for(i = 0; i < 6; i++)
+	for(j = 0; j < 10; j++)
+            if(buf[i][j] != rbuf[i][j])
+                TEST_ERROR;
+
+    /* Closing */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Sclose(sid) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(dapl) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(dcpl) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(ffapl) < 0)
+	FAIL_STACK_ERROR;
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+	H5Pclose(dapl);
+	H5Pclose(dcpl);
+	H5Pclose(sid);
+	H5Dclose(did);
+	H5Pclose(ffapl);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_dataset_append_rows() */
+
+/*-------------------------------------------------------------------------
+ * Function:	test_dataset_append_columns
+ *
+ * Purpose:	Verify that the object flush property and the append flush property
+ *		are working properly when appending columns to a dataset
+ *		with one extendible dimension (column).
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:  Vailin Choi; Jan 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_dataset_append_columns(hid_t fid)
+{
+    hid_t did = -1;			/* Dataset ID */
+    hid_t sid = -1;			/* Dataspace ID */
+    hid_t dcpl = -1;			/* A copy of dataset creation property */
+    hid_t dapl = -1;			/* A copy of dataset access property */
+    hid_t ffapl = -1;			/* The file's file access property list */
+
+    hsize_t dims[2] = {6, 0};			/* Current dimension sizes */
+    hsize_t maxdims[2] = {6, H5S_UNLIMITED};	/* Maximum dimension sizes */
+    hsize_t chunk_dims[2] = {2,5};		/* Chunk dimension sizes */
+    int cbuf[6];				/* The data buffer */
+    int buf[6][3], rbuf[6][3];			/* The data buffers */
+    int i, j;					/* Local index variable */
+
+    hsize_t boundary[2] = {0, 1};	/* Boundary sizes */
+    unsigned append_ct = 0;		/* The # of appends */
+    unsigned *flush_ptr;		/* Points to the flush counter */
+
+    TESTING("Append flush with H5DOappend()--append columns");
+
+    /* Get the file's file access property list */
+    if((ffapl = H5Fget_access_plist(fid)) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Set to create a chunked dataset with 1 extendible dimension */
+    if((sid = H5Screate_simple(2, dims, maxdims)) < 0) 
+	FAIL_STACK_ERROR;
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) 
+	FAIL_STACK_ERROR;
+    if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Set append flush property */
+    if((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0) 
+	FAIL_STACK_ERROR;
+    if(H5Pset_append_flush(dapl, 2, boundary, append_func, &append_ct) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Create the dataset */
+    if((did = H5Dcreate2(fid, DNAME_COLUMN, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, dapl)) < 0) 
+	TEST_ERROR;
+
+    /* Append 3 columns to the dataset */
+    for(i = 0; i < 3; i++) {
+	for(j = 0; j < 6; j++)
+	    cbuf[j] = buf[j][i] = ((i * 6) + (j + 1)) * -1;
+	if(H5DOappend(did, H5P_DEFAULT, 1, (size_t)1, H5T_NATIVE_INT, cbuf) < 0)
+	    TEST_ERROR;
+    } /* end for */
+
+    /* Verify the # of appends */
+    if(append_ct != 3)
+	TEST_ERROR;
+
+    /* Retrieve and verify object flush counts */
+    if(H5Pget_object_flush_cb(ffapl, NULL, (void **)&flush_ptr) < 0)
+	FAIL_STACK_ERROR;
+    if(*flush_ptr != 3)
+	TEST_ERROR;
+
+    /* Read the dataset */
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+	FAIL_STACK_ERROR;
+    
+    /* Verify the data */
+    for(i = 0; i < 6; i++)
+	for(j = 0; j < 3; j++)
+            if(buf[i][j] != rbuf[i][j])
+                TEST_ERROR;
+
+    /* Clear the buffer */
+    HDmemset(rbuf, 0, sizeof(rbuf));
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Open the dataset again */
+    if((did = H5Dopen2(fid, DNAME_COLUMN, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Read the dataset */
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Verify the data */
+    for(i = 0; i < 6; i++)
+	for(j = 0; j < 3; j++)
+            if(buf[i][j] != rbuf[i][j])
+                TEST_ERROR;
+
+    /* Closing */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Sclose(sid) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(dapl) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(dcpl) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(ffapl) < 0)
+	FAIL_STACK_ERROR;
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+	H5Pclose(dapl);
+	H5Pclose(dcpl);
+	H5Pclose(sid);
+	H5Dclose(did);
+	H5Pclose(ffapl);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_dataset_append_columns() */
+
+/*-------------------------------------------------------------------------
+ * Function:	test_dataset_append_BUG1
+ *
+ * Purpose:	Verify that the object flush property and the append flush property
+ *              are working properly when appending rows and columns to an
+ *              extendible dataset.
+ *		A BUG occurs:
+ *		 when the extendible dataset is set up as follows:
+ *			hsize_t dims[2] = {0, 10};
+ *		 	hsize_t maxdims[2] = {H5S_UNLIMITED, 50};
+ *		 when append 6 rows and 3 columns to the dataset;
+ *		 The data is correct when the dataset is read at this point;
+ *		 The data is incorrect when the dataset is closed, opened again, and read at this point;
+ *		 NOTE: the problem does not occur when H5Dflush() is not performed for each row/column.
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:  Vailin Choi; Jan 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_dataset_append_BUG1(hid_t fid)
+{
+    hid_t did = -1;			/* Dataset ID */
+    hid_t sid = -1;			/* Dataspace ID */
+    hid_t dcpl = -1;			/* Dataset creation property */
+    hid_t dapl = -1;			/* Dataset access property */
+    hid_t ffapl = -1;			/* The file's file access property list */
+
+    hsize_t dims[2] = {0, 10};			/* Current dimension sizes */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, 50};	/* Maximum dimension sizes */
+    hsize_t chunk_dims[2] = {2,5};		/* Chunk dimension sizes */
+    int lbuf[10], cbuf[6];		/* The data buffers */
+    int buf[6][13], rbuf[6][13];	/* The data buffers */
+    int i, j;				/* Local index variables */
+
+    hsize_t boundary[2] = {1, 1};	/* Boundary sizes */
+    unsigned append_ct = 0;		/* The # of appends */
+    unsigned *flush_ptr;		/* Points to the flush counter */
+
+    TESTING("Append flush with H5DOappend()--append rows & columns--BUG1");
+    
+    /* Get the file's file access property list */
+    if((ffapl = H5Fget_access_plist(fid)) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Set to create a chunked dataset with 2 extendible dimensions */
+    if((sid = H5Screate_simple(2, dims, maxdims)) < 0) 
+	FAIL_STACK_ERROR;
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) 
+	FAIL_STACK_ERROR;
+    if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Set append flush property */
+    if((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0) 
+	FAIL_STACK_ERROR;
+    if(H5Pset_append_flush(dapl, 2, boundary, append_func, &append_ct) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Create the dataset */
+    if((did = H5Dcreate2(fid, DBUGNAME1, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, dapl)) < 0) 
+	TEST_ERROR;
+
+    /* Append 6 rows to the dataset */
+    for(i = 0; i < 6; i++) {
+	for(j = 0; j < 10; j++)
+	    lbuf[j] = buf[i][j] = (i * 10) + (j + 1);
+	if(H5DOappend(did, H5P_DEFAULT, 0, (size_t)1, H5T_NATIVE_INT, lbuf) < 0)
+	    TEST_ERROR;
+    } /* end for */
+
+    /* Verify the # of appends */
+    if(append_ct != 6)
+	TEST_ERROR;
+
+    /* Retrieve and verify object flush counts */
+    if(H5Pget_object_flush_cb(ffapl, NULL, (void **)&flush_ptr) < 0)
+	FAIL_STACK_ERROR;
+    if(*flush_ptr != 6)
+	TEST_ERROR;
+
+    /* Append 3 columns to the dataset */
+    for(i = 0; i < 3; i++) {
+	for(j = 0; j < 6; j++)
+	    cbuf[j] = buf[j][i+10] = ((i * 6) + (j + 1)) * -1;
+	if(H5DOappend(did, H5P_DEFAULT, 1, (size_t)1, H5T_NATIVE_INT, cbuf) < 0)
+	    TEST_ERROR;
+    } /* end for */
+
+    /* Verify the # of appends */
+    if(append_ct != 9)
+	TEST_ERROR;
+
+    /* Retrieve and verify object flush counts */
+    if(H5Pget_object_flush_cb(ffapl, NULL, (void **)&flush_ptr) < 0)
+	FAIL_STACK_ERROR;
+    if(*flush_ptr != 9)
+	TEST_ERROR;
+
+    /* Read the dataset */
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+	FAIL_STACK_ERROR;
+    
+    /* Verify the data */
+    for(i = 0; i < 6; i++)
+	for(j = 0; j < 13; j++)
+            if(buf[i][j] != rbuf[i][j])
+                TEST_ERROR;
+
+#ifdef BUG1
+    HDmemset(rbuf, 0, sizeof(rbuf));
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Open the dataset again */
+    if((did = H5Dopen(fid, DBUGNAME1, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Read the dataset */
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Verify the data */
+    for(i = 0; i < 6; i++)
+	for(j = 0; j < 13; j++)
+            if(buf[i][j] != rbuf[i][j])
+                TEST_ERROR;
+#endif
+
+    /* Closing */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Sclose(sid) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(dapl) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(dcpl) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(ffapl) < 0)
+	FAIL_STACK_ERROR;
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+	H5Pclose(dcpl);
+	H5Pclose(dapl);
+	H5Pclose(sid);
+	H5Dclose(did);
+	H5Pclose(ffapl);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_dataset_append_BUG1() */
+
+/*-------------------------------------------------------------------------
+ * Function:	test_dataset_append_BUG2
+ *
+ * Purpose:	Verify that the object flush property and the append flush property
+ *              are working properly when appending rows and columns to an
+ *              extendible dataset.
+ *		A BUG occurs:
+ *		 when the extendible dataset is set up as follows:
+ *			hsize_t dims[2] = {0, 10};
+ *		 	hsize_t maxdims[2] = {50, H5S_UNLIMITED};
+ *		 when append 6 rows and 3 columns to the dataset;
+ *		 The data is correct when the dataset is read at this point;
+ *		 The data is incorrect when the dataset is closed, opened again, and read at this point;
+ *		 NOTE: the problem does not occur when H5Dflush() is not performed for each row/column.
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:  Vailin Choi; Jan 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_dataset_append_BUG2(hid_t fid)
+{
+    hid_t did = -1;			/* Dataset ID */
+    hid_t sid = -1;			/* Dataspace ID */
+    hid_t dcpl = -1;			/* Dataset creation property */
+    hid_t dapl = -1;			/* Dataset access property */
+    hid_t ffapl = -1;			/* The file's file access property list */
+
+    hsize_t dims[2] = {0, 10};			/* Current dimension sizes */
+    hsize_t maxdims[2] = {50, H5S_UNLIMITED};	/* Maximum dimension sizes */
+    hsize_t chunk_dims[2] = {2,5};		/* Chunk dimension sizes */
+    int lbuf[10], cbuf[6];			/* Data buffers */
+    int buf[6][13], rbuf[6][13];		/* Data buffers */
+    int i, j;					/* Local index variables */
+
+    hsize_t boundary[2] = {1, 1};	/* Boundary sizes */
+    unsigned append_ct = 0;		/* The # of appends */
+    unsigned *flush_ptr;		/* Points to the flush counter */
+
+    TESTING("Append flush with H5DOappend()--append rows & columns--BUG2");
+    
+    /* Get the file's file access property list */
+    if((ffapl = H5Fget_access_plist(fid)) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Set to create a chunked dataset with 2 extendible dimensions */
+    if((sid = H5Screate_simple(2, dims, maxdims)) < 0) 
+	FAIL_STACK_ERROR;
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) 
+	FAIL_STACK_ERROR;
+    if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Set append flush property */
+    if((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0) 
+	FAIL_STACK_ERROR;
+    if(H5Pset_append_flush(dapl, 2, boundary, append_func, &append_ct) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Create the dataset */
+    if((did = H5Dcreate2(fid, DBUGNAME2, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, dapl)) < 0) 
+	TEST_ERROR;
+
+    /* Append 6 rows to the dataset */
+    for(i = 0; i < 6; i++) {
+	for(j = 0; j < 10; j++)
+	    lbuf[j] = buf[i][j] = (i * 10) + (j + 1);
+	if(H5DOappend(did, H5P_DEFAULT, 0, (size_t)1, H5T_NATIVE_INT, lbuf) < 0)
+	    TEST_ERROR;
+    } /* end for */
+
+    /* Verify the # of appends */
+    if(append_ct != 6)
+	TEST_ERROR;
+
+    /* Retrieve and verify object flush counts */
+    if(H5Pget_object_flush_cb(ffapl, NULL, (void **)&flush_ptr) < 0)
+	FAIL_STACK_ERROR;
+    if(*flush_ptr != 6)
+	TEST_ERROR;
+
+
+    /* Append 3 columns to the dataset */
+    for(i = 0; i < 3; i++) {
+	for(j = 0; j < 6; j++)
+	    cbuf[j] = buf[j][i+10] = ((i * 6) + (j + 1)) * -1;
+	if(H5DOappend(did, H5P_DEFAULT, 1, (size_t)1, H5T_NATIVE_INT, cbuf) < 0)
+	    TEST_ERROR;
+    } /* end for */
+
+    /* Verify the # of appends */
+    if(append_ct != 9)
+	TEST_ERROR;
+
+    /* Retrieve and verify object flush counts */
+    if(H5Pget_object_flush_cb(ffapl, NULL, (void **)&flush_ptr) < 0)
+	FAIL_STACK_ERROR;
+    if(*flush_ptr != 9)
+	TEST_ERROR;
+
+    /* Read the dataset */
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+	FAIL_STACK_ERROR;
+    
+    /* Verify the data */
+    for(i = 0; i < 6; i++)
+	for(j = 0; j < 13; j++)
+            if(buf[i][j] != rbuf[i][j])
+                TEST_ERROR;
+
+#ifdef BUG2
+    HDmemset(rbuf, 0, sizeof(rbuf));
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Open the dataset again */
+    if((did = H5Dopen(fid, DBUGNAME2, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Read the dataset */
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Verify the data */
+    for(i = 0; i < 6; i++)
+	for(j = 0; j < 13; j++)
+            if(buf[i][j] != rbuf[i][j])
+                TEST_ERROR;
+#endif
+
+    /* Closing */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Sclose(sid) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(dapl) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(dcpl) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(ffapl) < 0)
+	FAIL_STACK_ERROR;
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+	H5Pclose(dcpl);
+	H5Pclose(dapl);
+	H5Pclose(sid);
+	H5Dclose(did);
+	H5Pclose(ffapl);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_dataset_append_BUG2() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:	test_dataset_append_less
+ *
+ * Purpose:	Verify that the object flush property and the append flush property
+ *		are working properly when appending rows and columns to an
+ *		extendible dataset where the append size is less than the boundary
+ *		size.
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:  Vailin Choi; Jan 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_dataset_append_less(hid_t fid)
+{
+    hid_t did = -1;			/* Dataset ID */
+    hid_t sid = -1;			/* Dataspace ID */
+    hid_t dcpl = -1;			/* A copy of dataset creation property */
+    hid_t dapl = -1;			/* A copy of dataset access property */
+    hid_t ffapl = -1;			/* The file's file access property list */
+
+    hsize_t dims[2] = {0, 10};		/* Current dimension sizes */
+    hsize_t maxdims[2] = {100, 100};	/* Maximum dimension sizes */
+    hsize_t chunk_dims[2] = {2,5};	/* Chunk dimension sizes */
+    int lbuf[20], cbuf[6][3];		/* Data buffers */
+    int buf[6][13], rbuf[6][13];	/* Data buffers */
+    int i, j, k;			/* Local index variables */
+
+    hsize_t boundary[2] = {3, 3};	/* Boundary sizes */
+    unsigned append_ct = 0;		/* The # of appends */
+    unsigned *flush_ptr;		/* Points to the flush counter */
+
+    TESTING("Append flush with H5DOappend()--append size < boundary size");
+
+    /* Get the file's file access property list */
+    if((ffapl = H5Fget_access_plist(fid)) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Set to create a chunked dataset with 2 extendible dimensions */
+    if((sid = H5Screate_simple(2, dims, maxdims)) < 0) 
+	FAIL_STACK_ERROR;
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) 
+	FAIL_STACK_ERROR;
+    if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Set append flush property */
+    if((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0) 
+	FAIL_STACK_ERROR;
+    if(H5Pset_append_flush(dapl, 2, boundary, append_func, &append_ct) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Create the dataset */
+    if((did = H5Dcreate2(fid, DNAME_LESS, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, dapl)) < 0) 
+	TEST_ERROR;
+
+    /* Append to the dataset 2 rows at a time for 3 times */
+    for(i = 0, k = 0; i < 6; i++) {
+	for(j = 0; j < 10; j++, k++)
+	    buf[i][j] = lbuf[k] = (i * 10) + (j + 1);
+
+	if((i + 1) % 2 == 0) {
+	    if(H5DOappend(did, H5P_DEFAULT, 0, (size_t)2, H5T_NATIVE_INT, lbuf) < 0)
+		TEST_ERROR;
+	    k = 0;
+	} /* end if */
+    } /* end for */
+
+    /* Verify the # of appends */
+    if(append_ct != 2)
+	TEST_ERROR;
+
+    /* Retrieve and verify object flush counts */
+    if(H5Pget_object_flush_cb(ffapl, NULL, (void **)&flush_ptr) < 0)
+	FAIL_STACK_ERROR;
+    if(*flush_ptr != 2)
+	TEST_ERROR;
+
+    /* Append 3 columns to the dataset, once */
+    for(i = 0; i < 3; i++)
+	for(j = 0; j < 6; j++, k++)
+	    cbuf[j][i] = buf[j][i + 10] = ((i * 6) + (j + 1)) * -1;
+    if(H5DOappend(did, H5P_DEFAULT, 1, (size_t)3, H5T_NATIVE_INT, cbuf) < 0)
+	TEST_ERROR;
+
+    /* Verify the # of appends */
+    if(append_ct != 3)
+	TEST_ERROR;
+
+    /* Retrieve and verify object flush counts */
+    if(H5Pget_object_flush_cb(ffapl, NULL, (void **)&flush_ptr) < 0)
+	FAIL_STACK_ERROR;
+    if(*flush_ptr != 3)
+	TEST_ERROR;
+
+    /* Read the dataset */
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+	FAIL_STACK_ERROR;
+    
+    /* Verify the data */
+    for(i = 0; i < 6; i++)
+	for(j = 0; j < 13; j++)
+            if(buf[i][j] != rbuf[i][j])
+                TEST_ERROR;
+
+    /* Clear the buffer */
+    HDmemset(rbuf, 0, sizeof(rbuf));
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Open the dataset again */
+    if((did = H5Dopen2(fid, DNAME_LESS, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Read the dataset */
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Verify the data */
+    for(i = 0; i < 6; i++)
+	for(j = 0; j < 13; j++)
+            if(buf[i][j] != rbuf[i][j])
+                TEST_ERROR;
+
+    /* Closing */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Sclose(sid) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(dapl) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(dcpl) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(ffapl) < 0)
+	FAIL_STACK_ERROR;
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+	H5Pclose(dapl);
+	H5Pclose(dcpl);
+	H5Pclose(sid);
+	H5Dclose(did);
+	H5Pclose(ffapl);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_dataset_append_less() */
+
+/*-------------------------------------------------------------------------
+ * Function:	test_dataset_append_vary
+ *
+ * Purpose:	Verify that the object flush property and the append flush property
+ *		are working properly when appending rows and columns to an
+ *		extendible dataset where 
+ *			row: the append size is 3 times of the boundary size
+ *			      the append callback/flush is performed on the 1st boundary hit
+ *			column: the boundary is greater than the append size
+ *				the boundary is not hit at all
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:  Vailin Choi; Jan 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_dataset_append_vary(hid_t fid)
+{
+    hid_t did = -1;			/* Dataset ID */
+    hid_t sid = -1;			/* Dataspace ID */
+    hid_t dcpl = -1;			/* A copy of dataset creation property */
+    hid_t dapl = -1;			/* A copy of dataset access property */
+    hid_t ffapl = -1;			/* The file's file access property list */
+
+    hsize_t dims[2] = {0, 10};					/* Current dimension sizes */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED};	/* Maximum dimension sizes */
+    hsize_t chunk_dims[2] = {2,5};				/* Chunk dimension sizes */
+    int lbuf[60], cbuf[6][3];		/* Data buffers */
+    int buf[6][13], rbuf[6][13];	/* Data buffers */
+    int i, j, k;			/* Local index variables */
+
+    hsize_t boundary[2] = {3, 7};	/* Boundary sizes */
+    unsigned append_ct = 0;		/* The # of appends */
+    unsigned *flush_ptr;		/* Points to the flush counter */
+
+    TESTING("Append flush with H5DOappend()--append & boundary size vary");
+
+    /* Get the file's file access property list */
+    if((ffapl = H5Fget_access_plist(fid)) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Set to create a chunked dataset with 2 extendible dimensions */
+    if((sid = H5Screate_simple(2, dims, maxdims)) < 0) 
+	FAIL_STACK_ERROR;
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) 
+	FAIL_STACK_ERROR;
+    if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Set append flush property */
+    if((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0) 
+	FAIL_STACK_ERROR;
+    if(H5Pset_append_flush(dapl, 2, boundary, append_func, &append_ct) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Create the dataset */
+    if((did = H5Dcreate2(fid, DNAME_VARY, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, dapl)) < 0) 
+	TEST_ERROR;
+
+    /* Append 6 rows to the dataset, once */
+    for(i = 0, k = 0; i < 6; i++)
+	for(j = 0; j < 10; j++, k++)
+	    buf[i][j] = lbuf[k] = (i * 10) + (j + 1);
+    if(H5DOappend(did, H5P_DEFAULT, 0, (size_t)6, H5T_NATIVE_INT, lbuf) < 0)
+	TEST_ERROR;
+
+    /* Verify the # of appends */
+    if(append_ct != 1)
+	TEST_ERROR;
+
+    /* Retrieve and verify object flush counts */
+    if(H5Pget_object_flush_cb(ffapl, NULL, (void **)&flush_ptr) < 0)
+	FAIL_STACK_ERROR;
+    if(*flush_ptr != 1)
+	TEST_ERROR;
+
+    /* Append 3 columns to the dataset, once */
+    for(i = 0; i < 3; i++)
+	for(j = 0; j < 6; j++, k++)
+	    cbuf[j][i] = buf[j][i + 10] = ((i * 6) + (j + 1)) * -1;
+    if(H5DOappend(did, H5P_DEFAULT, 1, (size_t)3, H5T_NATIVE_INT, cbuf) < 0)
+	TEST_ERROR;
+
+    /* Verify the # of appends */
+    if(append_ct != 1)
+	TEST_ERROR;
+
+    /* Retrieve and verify object flush counts */
+    if(H5Pget_object_flush_cb(ffapl, NULL, (void **)&flush_ptr) < 0)
+	FAIL_STACK_ERROR;
+    if(*flush_ptr != 1)
+	TEST_ERROR;
+
+    /* Read the dataset */
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+	FAIL_STACK_ERROR;
+    
+    /* Verify the data */
+    for(i = 0; i < 6; i++)
+	for(j = 0; j < 13; j++)
+            if(buf[i][j] != rbuf[i][j])
+                TEST_ERROR;
+
+    /* Clear the dataset */
+    HDmemset(rbuf, 0, sizeof(rbuf));
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Open the dataset again */
+    if((did = H5Dopen2(fid, DNAME_VARY, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Read the dataset */
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Verify the data */
+    for(i = 0; i < 6; i++)
+	for(j = 0; j < 13; j++)
+            if(buf[i][j] != rbuf[i][j])
+                TEST_ERROR;
+
+    /* Closing */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Sclose(sid) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(dapl) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(dcpl) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Pclose(ffapl) < 0)
+	FAIL_STACK_ERROR;
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+	H5Pclose(dapl);
+	H5Pclose(dcpl);
+	H5Pclose(sid);
+	H5Dclose(did);
+	H5Pclose(ffapl);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_dataset_append_vary() */
+
+/*-------------------------------------------------------------------------
+ * Function:	Main function
+ *
+ * Purpose:	Test H5Pset/get_object_flush_cb() and H5Pset/get_append_flush()
+ *		along with H5DOappend().
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:  Vailin Choi; Jan 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+int main(void)
+{
+    hid_t fid = -1;		/* File ID */
+    hid_t fapl = -1;		/* File access property list */
+    unsigned flush_ct = 0;	/* The # of flushes */
+    int   nerrors = 0;		/* The # of errors encountered */
+
+    /* Get a copy of file access property list */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) 
+	FAIL_STACK_ERROR;
+
+    /* Set to use the latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Set object flush property */
+    if(H5Pset_object_flush_cb(fapl, flush_func, &flush_ct) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Create the test file */
+    if((fid = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+	FAIL_STACK_ERROR;
+
+    nerrors += test_dataset_append_rows(fid);
+
+    flush_ct = 0;	/* Reset flush counter */
+    nerrors += test_dataset_append_columns(fid);
+
+    flush_ct = 0;	/* Reset flush counter */
+    nerrors += test_dataset_append_rows_columns(fid);
+
+#ifdef BUG1_BUG2
+/*
+ * The following tests illustrate the scenarios when H5DOappend does not work with extensible array indexing:
+ *	- when the the dataset has 1 unlimited dimension and the other dimension is fixed but extendible
+ *	- the dataset expands along 1 dimension and then expands along the other dimension
+ */
+     flush_ct = 0;	/* Reset flush counter */
+     nerrors += test_dataset_append_BUG1(fid);
+
+     flush_ct = 0;	/* Reset flush counter */
+     nerrors += test_dataset_append_BUG2(fid);
+#endif
+
+    flush_ct = 0;	/* Reset flush counter */
+    nerrors += test_dataset_append_less(fid);
+
+    flush_ct = 0;	/* Reset flush counter */
+    nerrors += test_dataset_append_vary(fid);
+
+    /* Closing */
+    if(H5Pclose(fapl) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Fclose(fid) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Check for errors */
+    if(nerrors)
+        goto error;
+
+    return 0;
+
+error:
+    return 1;
+}
+
diff --git a/hl/test/test_dset_opt.c b/hl/test/test_dset_opt.c
index a8ffa44..c1e369e 100644
--- a/hl/test/test_dset_opt.c
+++ b/hl/test/test_dset_opt.c
@@ -41,7 +41,7 @@
 #define CHUNK_NX     4
 #define CHUNK_NY     4
 
-#define DEFLATE_SIZE_ADJUST(s) (ceil(((double)(s))*1.001F)+12)
+#define DEFLATE_SIZE_ADJUST(s) (ceil(((double)(s))*(double)1.001F)+12)
 
 /* Temporary filter IDs used for testing */
 #define H5Z_FILTER_BOGUS1	305
diff --git a/hl/test/test_file_image.c b/hl/test/test_file_image.c
index 831fa23..6ff5bf4 100644
--- a/hl/test/test_file_image.c
+++ b/hl/test/test_file_image.c
@@ -20,6 +20,12 @@
 
 #define RANK 2
 
+/* For superblock version 0, 1: the offset to "file consistency flags" is 20 with size of 4 bytes */
+/* The file consistency flags is the "status_flags" field in H5F_super_t */
+/* Note: the offset and size will be different when using superblock version 2 for the test file */
+#define SUPER_STATUS_FLAGS_OFF_V0_V1    20
+#define SUPER_STATUS_FLAGS_SIZE_V0_V1   4
+
 /* Test of file image operations.
 
    The following code provides a means to thoroughly test the file image
@@ -158,7 +164,7 @@ test_file_image(size_t open_images, size_t nflags, unsigned *flags)
             FAIL_PUTS_ERROR("H5Dclose() failed");
 
         /* get size of the file image i */
-        if ((buf_size[i] = H5Fget_file_image(file_id[i], NULL, 0)) < 0)
+        if ((buf_size[i] = H5Fget_file_image(file_id[i], NULL, (size_t)0)) < 0)
             FAIL_PUTS_ERROR("H5Fget_file_image() failed");
 
         /* allocate buffer for the file image i */
@@ -214,10 +220,32 @@ test_file_image(size_t open_images, size_t nflags, unsigned *flags)
             else
                 VERIFY(*core_buf_ptr_ptr != buf_ptr[i], "vfd buffer and user buffer should be different");
 
-            /* test whether the contents of the user buffer and driver buffer */
-            /* are equal.                                                     */
-            if (HDmemcmp(*core_buf_ptr_ptr, buf_ptr[i], (size_t)buf_size[i]) != 0)
-                FAIL_PUTS_ERROR("comparison of vfd and user buffer failed");
+	    /*
+             *  When the vfd and user buffers are different and H5LT_FILE_IMAGE_OPEN_RW is enabled,
+             *  status_flags in the superblock needs to be cleared in the vfd buffer for
+             *  the comparison to proceed as expected.  The user buffer as returned from H5Fget_file_image()
+             *  has already cleared status_flags.  The superblock's status_flags is used for the
+             *  implementation of file locking.
+             */
+            if(input_flags[i] & H5LT_FILE_IMAGE_OPEN_RW && !(input_flags[i] & H5LT_FILE_IMAGE_DONT_COPY)) {
+
+                void *tmp_ptr = HDmalloc((size_t)buf_size[i]);
+                /* Copy vfd buffer to a temporary buffer */
+                HDmemcpy(tmp_ptr, (void *)*core_buf_ptr_ptr, (size_t)buf_size[i]);
+                /* Clear status_flags in the superblock for the vfd buffer: file locking is using status_flags */
+                HDmemset((uint8_t *)tmp_ptr + SUPER_STATUS_FLAGS_OFF_V0_V1, (int)0, (size_t)SUPER_STATUS_FLAGS_SIZE_V0_V1);
+                /* Does the comparision */
+                if(HDmemcmp(tmp_ptr, buf_ptr[i], (size_t)buf_size[i]) != 0)
+                    FAIL_PUTS_ERROR("comparison of TMP vfd and user buffer failed");
+                /* Free the temporary buffer */
+                if(tmp_ptr) HDfree(tmp_ptr);
+            } else {
+
+                /* test whether the contents of the user buffer and driver buffer */
+                /* are equal.                                                     */
+                if (HDmemcmp(*core_buf_ptr_ptr, buf_ptr[i], (size_t)buf_size[i]) != 0)
+                    FAIL_PUTS_ERROR("comparison of vfd and user buffer failed");
+            }
         } /* end else */
     } /* end for */
 
@@ -370,7 +398,9 @@ test_file_image(size_t open_images, size_t nflags, unsigned *flags)
                     H5Aclose(attr_id);
                 } H5E_END_TRY;
 #endif
-                file_id[i] = -1;
+		if (H5Dclose(dset_id[i]) < 0)
+		    FAIL_PUTS_ERROR("H5Dclose() failed");
+		dset_id[i] = -1;
             } /* end if */
             else {
                 /* write dataset without extending it */
@@ -399,7 +429,7 @@ test_file_image(size_t open_images, size_t nflags, unsigned *flags)
     /* read open file images and verify data */
     for (i = 0; i < open_images; i++) {
         /* if opening the file image failed, continue next iteration */
-        if ((file_id[i] <  0) || (!(input_flags[i] & H5LT_FILE_IMAGE_OPEN_RW )))
+        if ((dset_id[i] < 0) || (file_id[i] <  0) || (!(input_flags[i] & H5LT_FILE_IMAGE_OPEN_RW )))
             continue;
 
         /* open dataset in file image */ 
diff --git a/hl/test/test_image.c b/hl/test/test_image.c
index 5740d4b..8ba0083 100644
--- a/hl/test/test_image.c
+++ b/hl/test/test_image.c
@@ -540,13 +540,12 @@ static int test_generate(void)
 {
     hid_t    fid;
     hsize_t  pal_dims[2] = { 256, 3 };
-    float    *data;
+    float    *data = NULL;
     int      imax, jmax, kmax;
     int      n_elements;
     float    valex, xmin, xmax, value;
     FILE     *f = NULL;
-    char     *srcdir = getenv("srcdir"); /* the source directory */
-    char     data_file[512]="";          /* buffer to hold name of existing data file */
+    const char *data_file = H5_get_srcdir_filename(DATA_FILE4);
     int      i;
     int      retval = FAIL;
 
@@ -557,17 +556,6 @@ static int test_generate(void)
     printf("Testing read and process data and make indexed images\n");
 
     /*-------------------------------------------------------------------------
-    * compose the name of the file to open, using the srcdir, if appropriate
-    *-------------------------------------------------------------------------
-    */
-    if ( srcdir )
-    {
-        HDstrcpy(data_file, srcdir);
-        HDstrcat(data_file, "/");
-    }
-    HDstrcat(data_file,DATA_FILE4);
-
-    /*-------------------------------------------------------------------------
     * read data; the file data format is described below
     *-------------------------------------------------------------------------
     */
@@ -887,20 +875,7 @@ static int read_palette(const char* fname,
     unsigned int  green;
     unsigned int  blue;
     unsigned      nentries;
-    char          *srcdir = getenv("srcdir"); /* the source directory */
-    char          data_file[512];             /* buffer to hold name of existing data file */
-
-    /*-------------------------------------------------------------------------
-    * compose the name of the file to open, using "srcdir", if appropriate
-    *-------------------------------------------------------------------------
-    */
-    HDstrcpy(data_file, "");
-    if (srcdir)
-    {
-        HDstrcpy(data_file, srcdir);
-        HDstrcat(data_file, "/");
-    }
-    HDstrcat(data_file,fname);
+    const char *data_file = H5_get_srcdir_filename(fname);
 
     /* ensure the given palette is valid */
     if (!palette)
diff --git a/hl/test/test_ld.c b/hl/test/test_ld.c
new file mode 100644
index 0000000..df721e6
--- /dev/null
+++ b/hl/test/test_ld.c
@@ -0,0 +1,1430 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+* Copyright by The HDF Group.                                               *
+* Copyright by the Board of Trustees of the University of Illinois.         *
+* All rights reserved.                                                      *
+*                                                                           *
+* This file is part of HDF5.  The full HDF5 copyright notice, including     *
+* terms governing use, modification, and redistribution, is contained in    *
+* the files COPYING and Copyright.html.  COPYING can be found at the root   *
+* of the source code distribution tree; Copyright.html can be found at the  *
+* root level of an installed copy of the electronic HDF5 document set and   *
+* is linked from the top-level documents page.  It can also be found at     *
+* http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+* access to either file, you may request a copy from help at hdfgroup.org.     *
+* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <errno.h>
+#include <setjmp.h>
+#include "h5hltest.h"
+#include "H5srcdir.h"
+#include "H5LDpublic.h"
+
+/* File name */
+#define FILE "test_ld.h5"
+/* Copied file name */
+#define COPY_FILENAME "COPY_test_ld.h5"
+
+/* Dataset names */
+#define DSET_ONE        "DSET_ONE"
+#define DSET_ALLOC_LATE "DSET_ALLOC_LATE"
+#define DSET_ALLOC_EARLY "DSET_ALLOC_EARLY"
+#define DSET_TWO 	"DSET_TWO"
+#define TWO_DIM_1	4
+#define TWO_DIM_2	10
+#define DSET_CMPD 	"DSET_CMPD"
+#define DSET_CMPD_ESC 	"DSET_CMPD_ESC"
+#define DSET_CMPD_TWO 	"DSET_CMPD_TWO"
+#define DSET_NULL       "DSET_NULL"
+#define DSET_SCALAR     "DSET_SCALAR"
+
+/* Selected compound field members for testing */
+#define VALID_FIELDS1 "field1,field2.a,field3,field4" /* TEMPORORAY */
+#define VALID_FIELDS2 "field2.b.a,field2.c,field4.b"
+
+#define INVALID_FIELDS1 "field2.k.a,field2.c,field4.k"
+#define INVALID_FIELDS2 "field2.b.a,field2.c,field4.b."
+#define INVALID_FIELDS3 "field2.b.a,,field2.c,field4.b"
+
+#define VALID_ESC_FIELDS1 "field\\,1,field2\\..\\.a,field\\\\3,field4\\,"
+#define VALID_ESC_FIELDS2 "field2\\..\\,b.a,field2\\..\\\\c,field4\\,.b\\,"
+
+#define INVALID_ESC_FIELDS1 "field2\\..\\,k.a,field2\\..\\\\c,field4\\,.k\\,"
+#define INVALID_ESC_FIELDS2 "field2\\..\\,b.a,field2\\..\\\\c,field4\\,.b\\,."
+#define INVALID_ESC_FIELDS3 "field2\\..\\,,b.a,field2\\..\\\\c,field4\\,.b\\,"
+
+/* 
+ * Test variations (retained original) for one-dimensional dataset:
+ *	Varies from 10->13; 10->9, 10->10, 10->1, 10->11
+ */
+#define ONE_NTESTS      5
+int one_tests[ONE_NTESTS] = {3, -1, 0, -9, 1};
+
+/* 
+ * Test variations (retained original) for two-dimensional dataset:
+ * 	Varies from {4,10}->{6,12}; {4,10}->{6,9}; {4,10}->{6,10};
+ *		    {4,10}->{3,12}; {4,10}->{3,9}; {4,10}->{3,10};
+ *		    {4,10}->{4,12}; {4,10}->{4,9}; {4,10}->{4,10}
+ */
+#define TWO_NTESTS 	9
+int two_tests[TWO_NTESTS][2] = { {2,2},  {2,-1},  {2,0},
+			    	  {-1,2}, {-1,-1}, {-1,0},
+			      	  {0,2},  {0,-1},  {0,0} };
+
+
+/* Verify that the two input values are the same */
+#define VERIFY_EQUAL(_x, _y)						\
+{									\
+	long __x = (long)_x, __y = (long)_y;				\
+   	if(__x != __y) TEST_ERROR					\
+}
+
+/* Temporary buffer for reading in the test file */
+#define TMP_BUF_SIZE		2048
+char  g_tmp_buf[TMP_BUF_SIZE];
+
+/* Macros for verifying compound fields */
+/* Verify all fields */
+#define VERIFY_ELMTS_ALL(ent1, ent2)  {			\
+    VERIFY_EQUAL(ent1.field1, ent2.field1);		\
+    VERIFY_EQUAL(ent1.field2.a, ent2.field2.a);		\
+    VERIFY_EQUAL(ent1.field2.b.a, ent2.field2.b.a);	\
+    VERIFY_EQUAL(ent1.field2.b.b, ent2.field2.b.b);	\
+    VERIFY_EQUAL(ent1.field2.b.c, ent2.field2.b.c);	\
+    VERIFY_EQUAL(ent1.field2.c, ent2.field2.c);		\
+    VERIFY_EQUAL(ent1.field3, ent2.field3);		\
+    VERIFY_EQUAL(ent1.field4.a, ent2.field4.a);		\
+}
+
+/* Verify fields selected in VALID_FIELDS1 */
+#define VERIFY_ELMTS_VALID1(ent1, ent2)  {		\
+    VERIFY_EQUAL(ent1.field1, ent2.field1);		\
+    VERIFY_EQUAL(ent1.field2_a, ent2.field2.a);		\
+    VERIFY_EQUAL(ent1.field3, ent2.field3);		\
+    VERIFY_EQUAL(ent1.field4.a, ent2.field4.a);		\
+    VERIFY_EQUAL(ent1.field4.b, ent2.field4.b);		\
+}
+
+/* Verify fields selected in VALID_FIELDS2 */
+#define VERIFY_ELMTS_VALID2(ent1, ent2)  {		\
+    VERIFY_EQUAL(ent1.field2_b_a, ent2.field2.b.a);	\
+    VERIFY_EQUAL(ent1.field2_c, ent2.field2.c);		\
+    VERIFY_EQUAL(ent1.field4_b, ent2.field4.b);		\
+}
+
+/* The types of 2-dimensional dataset: DSET_TWO or DSET_CMPD_TWO */
+#define TWO_NONE                0       /* DSET_TWO */
+#define TWO_CMPD_NULL           1       /* DSET_CMPD_TWO with NULL fields */
+#define TWO_CMPD_VALID1         2       /* DSET_CMPD_TWO with VALID_FIELDS1 or VALID_ESC_FIELDS1 */
+#define TWO_CMPD_VALID2         3       /* DSET_CMPD_TWO with VALID_FIELDS2 or VALID_ESC_FIELDS2 */
+
+#define VERIFY_ELMTS(type, k, ind, _ldbuf, _buf) {			\
+    if(type == TWO_NONE) {						\
+	int *iib = (int *)_ldbuf;					\
+	int *ib = (int *)_buf;						\
+									\
+	VERIFY_EQUAL(iib[k], ib[ind + n])				\
+    } else if(type == TWO_CMPD_NULL) {					\
+	set_t *ccb = (set_t *)_ldbuf;					\
+	set_t *cb = (set_t *)_buf;					\
+									\
+	VERIFY_ELMTS_ALL(ccb[k], cb[ind + n])				\
+    } else if(type == TWO_CMPD_VALID1) {				\
+	test_valid_fields1 *vb1 = (test_valid_fields1 *)_ldbuf;		\
+	set_t *cb = (set_t *)_buf;					\
+									\
+	VERIFY_ELMTS_VALID1(vb1[k], cb[ind + n])			\
+    } else if(type == TWO_CMPD_VALID2) {				\
+	test_valid_fields2 *vb2 = (test_valid_fields2 *)_ldbuf;		\
+	set_t *cb = (set_t *)_buf;					\
+									\
+	VERIFY_ELMTS_VALID2(vb2[k], cb[ind + n])			\
+    }									\
+}
+
+/* Tests for test_LD_elmts_pipe() */
+#define ONE_TESTS	3
+int  onetests[ONE_TESTS] = {3, 9, 1};
+#define TWO_TESTS	5
+int twotests[TWO_TESTS][2] = { {2,2}, {2,-1}, {2,0}, {-1,2}, {0,2}  };
+
+
+static herr_t test_LD_dims_params(const char *file);
+static herr_t test_LD_dims(const char *file);
+
+static herr_t test_LD_size(const char *file);
+
+static herr_t test_LD_elmts_invalid(const char *file);
+static herr_t test_LD_elmts_one(const char *file, const char *dname, const char *fields);
+static herr_t test_LD_elmts_two(const char *file, const char *dname, const char *fields);
+
+static herr_t verify_elmts_two(int type, hsize_t *ext_dims, hsize_t *prev_dims,  void *_ldbuf, void *_buf);
+
+/* data structures for compound data type */
+typedef struct sub22_t {
+    int a;
+    int b;
+    int c;
+} sub22_t;
+
+typedef struct sub2_t {
+    int a;
+    sub22_t b;
+    int c;
+} sub2_t;
+
+typedef struct sub4_t {
+    int a;
+    int b;
+} sub4_t;
+
+typedef struct set_t {
+    int field1;
+    sub2_t field2;
+    double field3;
+    sub4_t field4;
+} set_t;
+
+/* NOTE: 
+ * This will fail on heiwa and amani when VALID_FIELDS1 is "field1,field3,field4" 
+ * because of alignment problems: 
+ *    amani and heiwa - 8 byte alignment
+ *    jam - 4 byte alignemnt
+ * This will need to be fixed in the library for H5Tget_native_type().
+ */
+/* VALID_FIELDS1 "field1,field2.a,field3,field4" */
+/* VALID_ESC_FIELDS1 "field\\,1,field2\\..\\.a,field\\\\3,field4\\," */
+typedef struct test_valid_fields1 {
+    int field1;
+    int field2_a;
+    double field3;
+    sub4_t field4;
+} test_valid_fields1;
+
+/* VALID_FIELDS2 "field2.b.a,field2.c,field4.b" */
+/* VALID_ESC_FIELDS2 "field2\\..\\,b.a,field2\\..\\\\c,field4\\,.b\\," */
+typedef struct test_valid_fields2 {
+    int field2_b_a;
+    int field2_c;
+    int field4_b;
+} test_valid_fields2;
+
+
+/* Temporary buffers for tests: test_LD_elmts_one() & test_LD_elmts_two() */
+#define TEST_BUF_SIZE 		100
+int *iibuf;			/* buffer for storing retrieved elements */
+int *ibuf;			/* buffer for storing retrieved elements (integer) */
+set_t *cbuf;			/* buffer for storing retrieved elemnets (compound) */
+set_t *ccbuf;			/* buffer for storing retrieved elemnets (compound) */
+test_valid_fields1 *vbuf1;	/* buffer for storing retrieved elements (FIELDS1) */
+test_valid_fields2 *vbuf2;	/* buffer for storing retrieved elements (FIELDS2) */
+
+

+/* 
+ *********************************************************************************
+ *
+ * Testing for the High Level public routine: H5LDget_dset_dims()
+ * 	1) An invalid dataset id
+ *	2) "DSET_ALLOC_EARLY": NULL cur_dims
+ *	3) "DSET_ALLOC_LATE": nonNULL cur_dims
+ *	4) "DSET_CMPD_TWO": nonNULL cur_dims
+ *	5) "DSET_NULL": nonNULL cur_dims
+ *	6) "DSET_SCALAR": nonNULL cur_dims
+ *
+ *********************************************************************************
+ */
+static herr_t
+test_LD_dims_params(const char *file)
+{
+    hid_t fid=-1;		/* file identifier */
+    hid_t did=-1;		/* dataset identifier */
+    hsize_t one_cur_dims[1];	/* current dimension sizes for 1-dimensonal dataset */
+    hsize_t two_cur_dims[2];	/* current dimension sizes for 2-dimensional dataset */
+    hid_t invalid_id = -1;
+    herr_t ret;			/* return value */
+
+    const char *filename = H5_get_srcdir_filename(file);
+
+    TESTING("H5LDget_dset_dims");
+
+    /* Open the copied file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* 
+     * 1. Verify failure with negative dataset id
+     */
+    H5E_BEGIN_TRY {
+	ret = H5LDget_dset_dims(invalid_id, one_cur_dims);
+    } H5E_END_TRY;
+    VERIFY_EQUAL(ret, FAIL)
+
+    /* 
+     * 2. Verify failure for NULL cur_dims
+     */
+    if((did = H5Dopen2(fid, DSET_ALLOC_EARLY, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+    H5E_BEGIN_TRY {
+	ret = H5LDget_dset_dims(did, NULL);
+    } H5E_END_TRY;
+    VERIFY_EQUAL(ret, FAIL)
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR
+
+    /* 
+     * 3. Verify for nonNULL cur_dims
+     */
+    if((did = H5Dopen2(fid, DSET_ALLOC_LATE, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+    if(H5LDget_dset_dims(did, one_cur_dims) < 0)
+	FAIL_STACK_ERROR
+    VERIFY_EQUAL(one_cur_dims[0], 10)
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR
+
+    /* 
+     * 4. Verify nonNULL cur_dims for a 2-dimensional dataset
+     */
+    if((did = H5Dopen2(fid, DSET_CMPD_TWO, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+    if(H5LDget_dset_dims(did, two_cur_dims) < 0)
+	FAIL_STACK_ERROR
+    VERIFY_EQUAL(two_cur_dims[0], TWO_DIM_1)
+    VERIFY_EQUAL(two_cur_dims[1], TWO_DIM_2)
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR
+
+    /* 
+     * 5. Verify nonNULL cur_dims for dataset with H5S_NULL dataspace
+     */
+    one_cur_dims[0] = 0;
+
+    if((did = H5Dopen2(fid, DSET_NULL, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    if(H5LDget_dset_dims(did, one_cur_dims) < 0)
+	FAIL_STACK_ERROR
+    VERIFY_EQUAL(one_cur_dims[0], 0)
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR
+
+    /* 
+     * 6. Verify nonNULL cur_dims for dataset with H5S_SCALAR dataspace
+     */
+    one_cur_dims[0] = 0;
+
+    if((did = H5Dopen2(fid, DSET_SCALAR, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    if(H5LDget_dset_dims(did, one_cur_dims) < 0)
+	FAIL_STACK_ERROR
+    VERIFY_EQUAL(one_cur_dims[0], 0)
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+	FAIL_STACK_ERROR
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+	H5Dclose(did);
+	H5Fclose(fid);
+    } H5E_END_TRY;
+
+    return(-1);
+} /* test_LD_dims_params() */
+
+

+/* 
+ *********************************************************************************
+ *
+ * Testing for the High Level public routine: H5LDget_dset_dims()
+ * Verify that the dimension sizes retrieved via H5LDget_dset_dims() are correct
+ * for the following cases:
+ *
+ *	DSET_ONE: one-dimensional dataset
+ *	  1. Increase dims[0]
+ *	  2. Decrease dims[0]
+ *	  3. same dims[0]
+ *	  4. Decrease dims[0]
+ *	  5. Increase dims[0]
+ *
+ *		one_tests[ONE_NTESTS] = {3, -1, 0, -9, 1}
+ *		Varies from 10->3; 10->9, 10->10, 10->1, 10->11
+ *
+ *	DSET_TWO: two-dimensional dataset
+ *	  1. Increase dims[0], increase dims[1]
+ *	  2. Increase dims[0], decrease dims[1]
+ *	  3. Increase dims[0], same dims[1]
+ *	  4. Decrease dims[0], increase dims[1]
+ *	  5. Decrease dims[0], decrease dims[1]
+ *	  6. Decrease dims[0], same dims[1]
+ *	  7. same dims[0], increase dims[1]
+ *	  8. same dims[0], decrease dims[1]
+ *	  9. same dims[0], same dims[1]
+ *
+ *		two_tests[TWO_NTESTS][2] = { {2,2},  {2,-1},  {2,0},
+ *					     {-1,2}, {-1,-1}, {-1,0},
+ * 					     {0,2},  {0,-1},  {0,0} }
+ *		Varies from {4,10}->{6,12}; {4,10}->{6,9}; {4,10}->{6,10};
+ *                  	    {4,10}->{3,12}; {4,10}->{3,9}; {4,10}->{3,10};
+ *                  	    {4,10}->{4,12}; {4,10}->{4,9}; {4,10}->{4,10}
+ *
+ *********************************************************************************
+ */
+static herr_t
+test_LD_dims(const char *file)
+{
+    hid_t fid=-1;		/* file identifier */
+    hid_t did=-1;		/* dataset identifier */
+    hsize_t one_prev_dims[1];	/* original dimension sizes for 1-dimensonal dataset */
+    hsize_t one_cur_dims[1];	/* current dimension sizes for 1-dimensonal dataset */
+    hsize_t one_ext_dims[1];	/* extended dimension sizes for 1-dimensonal dataset */
+    hsize_t two_prev_dims[2];	/* original dimension sizes for 2-dimensional dataset */
+    hsize_t two_cur_dims[2];	/* current dimension sizes for 2-dimensional dataset */
+    hsize_t two_ext_dims[2];	/* extended dimension sizes for 2-dimensional dataset*/
+    int i;			/* local index variable */
+
+    TESTING("H5LDget_dset_dims with H5Dset_extent");
+
+    /* Make a copy of the test file */
+    if(h5_make_local_copy(file, COPY_FILENAME) < 0)
+        TEST_ERROR
+
+    /* Open the copied file */
+    if((fid = H5Fopen(COPY_FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* 
+     * Testing with one-dimensional dataset: DSET_ONE
+     */
+    if((did = H5Dopen2(fid, DSET_ONE, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Retrieve dimension sizes */
+    if(H5LDget_dset_dims(did, one_prev_dims) < 0)
+	FAIL_STACK_ERROR
+
+    for(i = 0; i < ONE_NTESTS; i++) {
+
+	/* Set up the extended dimension sizes */
+	one_ext_dims[0] = (hsize_t)((int)one_prev_dims[0] + one_tests[i]);
+
+	/* Change the dimension size */
+	if(H5Dset_extent(did, one_ext_dims) < 0)
+	    FAIL_STACK_ERROR
+
+	/* Retrieve the dimension size */
+	if(H5LDget_dset_dims(did, one_cur_dims) < 0)
+	    FAIL_STACK_ERROR
+
+	/* Verify that the retrieved dimension size is correct as expected */
+	VERIFY_EQUAL(one_cur_dims[0], one_ext_dims[0])
+    }
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR
+
+    /* 
+     * Testing with two-dimensional dataset: DSET_TWO
+     */
+    if((did = H5Dopen2(fid, DSET_TWO, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Retrieve the dimension sizes */
+    if(H5LDget_dset_dims(did, two_prev_dims) < 0)
+	FAIL_STACK_ERROR
+
+    for(i = 0; i < TWO_NTESTS; i++) {
+
+	/* Set up the extended dimension sizes */
+	two_ext_dims[0] = (hsize_t)((int)two_prev_dims[0] + two_tests[i][0]);
+	two_ext_dims[1] = (hsize_t) ((int)two_prev_dims[1] + two_tests[i][1]);
+
+	/* Change the dimension sizes */
+	if(H5Dset_extent(did, two_ext_dims) < 0)
+	    FAIL_STACK_ERROR
+
+	/* Retrieve the dimension sizes */
+	if(H5LDget_dset_dims(did, two_cur_dims) < 0)
+	    FAIL_STACK_ERROR
+
+	/* Verify that the retrieved dimension sizes are correct as expected */
+	VERIFY_EQUAL(two_cur_dims[0], two_ext_dims[0])
+	VERIFY_EQUAL(two_cur_dims[1], two_ext_dims[1])
+    } /* end TWO_NTESTS */
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+	FAIL_STACK_ERROR
+
+    /* Remove the copied file */
+    HDremove(COPY_FILENAME);
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+	H5Dclose(did);
+	H5Fclose(fid);
+    } H5E_END_TRY;
+    return(-1);
+
+} /* test_LD_dims() */
+
+

+/* 
+ **********************************************************************************
+ *
+ * Testing for the High Level public routine: H5LDget_dset_type_size()
+ * Verify that the data type size returned via H5LDget_dset_type_size()
+ * are correct for the following cases:
+ *
+ *	Verify failure for an invalid dataset id
+ *
+ *	DSET_CMPD: one-dimensional dataset with compound type
+ *	  1. The whole element 
+ *	  2. VALID_FIELDS1: "field1,field2.a,field3,field4"
+ *	  3. VALID_FIELDS2: "field2.b.a,field2.c,field4.b"
+ *	  4. INVALID_FIELDS1: "field2.k.a,field2.c,field4.k"
+ *	  5. INVALID_FIELDS2: "field2.b.a,field2.c,field4.b."
+ *	  6. INVALID_FIELDS3: "field2.b.a,,field2.c,field4.b"
+ *
+ *	DSET_CMPD_ESC: one-dimensional dataset with compound type and
+ *		       member names with escape/separator characters
+ *	  1. The whole element
+ * 	  2. VALID_ESC_FIELDS1: "field\\,1,field2\\..\\.a,field\\\\3,field4\\,"
+ *	  3. VALID_ESC_FIELDS2: "field2\\..\\,b.a,field2\\..\\\\c,field4\\,.b\\,"
+ *	  4. INVALID_ESC_FIELDS1: "field2\\..\\,k.a,field2\\..\\\\c,field4\\,.k\\,"
+ *	  5. INVALID_ESC_FIELDS2: "field2\\..\\,b.a,field2\\..\\\\c,field4\\,.b\\,."
+ * 	  6. INVALID_ESC_FIELDS3: "field2\\..\\,,b.a,field2\\..\\\\c,field4\\,.b\\,"
+ *
+ **********************************************************************************
+ */
+static int
+test_LD_size(const char *file)
+{
+    hid_t fid=-1;	/* file identifier */
+    hid_t did=-1;	/* dataset identifier */
+    hid_t dtid=-1;	/* dataset's datatype identifier */
+    hid_t invalid_id=-1;
+    hid_t memb0_tid=-1;	/* type identifier for a member in the compound type */
+    hid_t memb1_tid=-1;	/* type identifier for a member in the compound type */
+    hid_t memb2_tid=-1;	/* type identifier for a member in the compound type */
+    hid_t memb3_tid=-1;	/* type identifier for a member in the compound type */
+    hid_t memb_tid=-1;	/* type identifier for a member in the compound type */
+    hid_t memb_tid2=-1;	/* type identifier for a member in the compound type */
+    size_t dsize;	/* size of the dataset's datatype */
+    size_t ck_dsize;	/* size of the dataset's datatype to be checked against */
+
+    const char *filename = H5_get_srcdir_filename(file);
+
+    TESTING("H5LDget_dset_type_size");
+
+    /* Open the file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* 
+     * Verify failure with an invalid dataset id
+     */
+    H5E_BEGIN_TRY {
+	dsize = H5LDget_dset_type_size(invalid_id, NULL);
+    } H5E_END_TRY;
+    VERIFY_EQUAL(dsize, 0)
+
+    /* 
+     * Testing one-dimensional dataset with compound datatype:
+     *		DSET_CMPD
+     */
+
+    /* Open dataset DSET_CMPD */
+    if((did = H5Dopen2(fid, DSET_CMPD, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Return size of the whole element */
+    if((dsize = H5LDget_dset_type_size(did, NULL)) == 0)
+	FAIL_STACK_ERROR
+
+    /* Get the dataset's datatype and then its datatype size */
+    if((dtid = H5Tget_native_type(H5Dget_type(did), H5T_DIR_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    if((ck_dsize = H5Tget_size(dtid)) == 0)
+	FAIL_STACK_ERROR
+
+    /* Verify case #1 */
+    VERIFY_EQUAL(dsize, ck_dsize)
+
+    /* Get datatype id for each member */
+    if((memb0_tid = H5Tget_member_type(dtid, 0)) < 0) /* "field1" */
+	FAIL_STACK_ERROR
+    if((memb1_tid = H5Tget_member_type(dtid, 1)) < 0) /* "field2" */
+	FAIL_STACK_ERROR
+    if((memb2_tid = H5Tget_member_type(dtid, 2)) < 0) /* "field3" */
+	FAIL_STACK_ERROR
+    if((memb3_tid = H5Tget_member_type(dtid, 3)) < 0) /* "field4" */
+	FAIL_STACK_ERROR
+
+    /* Obtain size for VALID_FIELDS1: "field1,field2.a,field3,field4" */
+    if((dsize = H5LDget_dset_type_size(did, VALID_FIELDS1)) == 0)
+	FAIL_STACK_ERROR
+
+    /* Get the datatype size for "field1" */
+    if((ck_dsize = H5Tget_size(memb0_tid)) == 0)
+	FAIL_STACK_ERROR
+
+    /* Add the datatype size for "field2.a" */
+    if((memb_tid = H5Tget_member_type(memb1_tid, 0)) < 0)
+	FAIL_STACK_ERROR
+    if((ck_dsize += H5Tget_size(memb_tid)) == 0)
+	FAIL_STACK_ERROR
+    if(H5Tclose(memb_tid) < 0)
+	FAIL_STACK_ERROR
+
+    /* Add the datatype size for "field3" */
+    if((ck_dsize += H5Tget_size(memb2_tid)) == 0)
+	FAIL_STACK_ERROR
+
+    /* Add the datatype size for "field4" */
+    if((ck_dsize += H5Tget_size(memb3_tid)) == 0)
+	FAIL_STACK_ERROR
+
+    /* Verify case #2 */
+    VERIFY_EQUAL(dsize, ck_dsize)
+
+    /* Obtain datatype size for VALID_FIELDS2: "field2.b.a,field2.c,field4.b" */
+    if((dsize = H5LDget_dset_type_size(did, VALID_FIELDS2)) == 0)
+	FAIL_STACK_ERROR
+
+    /* Get the datatype size for "field2.b.a" */
+    if((memb_tid = H5Tget_member_type(memb1_tid, 1)) < 0)
+	FAIL_STACK_ERROR
+    if((memb_tid2 = H5Tget_member_type(memb_tid, 0)) < 0)
+	FAIL_STACK_ERROR
+    if((ck_dsize = H5Tget_size(memb_tid2)) == 0)
+	FAIL_STACK_ERROR
+    if(H5Tclose(memb_tid) < 0)
+	FAIL_STACK_ERROR
+    if(H5Tclose(memb_tid2) < 0)
+	FAIL_STACK_ERROR
+
+    /* Add the datatype size for "field2.c" */
+    if((memb_tid = H5Tget_member_type(memb1_tid, 2)) < 0)
+	FAIL_STACK_ERROR
+    if((ck_dsize += H5Tget_size(memb_tid)) == 0)
+	FAIL_STACK_ERROR
+    if(H5Tclose(memb_tid) < 0)
+	FAIL_STACK_ERROR
+
+    /* Add the datatype size for "field4.b" */
+    if((memb_tid = H5Tget_member_type(memb3_tid, 1)) < 0)
+	FAIL_STACK_ERROR
+    if((ck_dsize += H5Tget_size(memb_tid)) == 0)
+	FAIL_STACK_ERROR
+    if(H5Tclose(memb_tid) < 0)
+	FAIL_STACK_ERROR
+
+    /* Verify case #3 */
+    VERIFY_EQUAL(dsize, ck_dsize)
+
+    /*
+     * Verify failure for the following invalid nested fields: 
+     *	INVALID_FIELDS1: "field2.k.a,field2.c,field4.k"
+     *  INVALID_FIELDS2: "field2.b.a,field2.c,field4.b."
+     *  INVALID_FIELDS3: "field2.b.a,,field2.c,field4.b"
+     */
+    /* Verify failure for case #4 */
+    dsize = H5LDget_dset_type_size(did, INVALID_FIELDS1);
+    VERIFY_EQUAL(dsize, 0)
+
+    /* Verify failure for case #5 */
+    dsize = H5LDget_dset_type_size(did, INVALID_FIELDS2);
+    VERIFY_EQUAL(dsize, 0)
+
+    /* Verify failure for case #6 */
+    dsize = H5LDget_dset_type_size(did, INVALID_FIELDS3);
+    VERIFY_EQUAL(dsize, 0)
+    
+    /* Closing */
+    if(H5Tclose(memb0_tid) < 0)
+	FAIL_STACK_ERROR
+    if(H5Tclose(memb1_tid) < 0)
+	FAIL_STACK_ERROR
+    if(H5Tclose(memb2_tid) < 0)
+	FAIL_STACK_ERROR
+    if(H5Tclose(memb3_tid) < 0)
+	FAIL_STACK_ERROR
+    if(H5Tclose(dtid) < 0)
+	FAIL_STACK_ERROR
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR
+
+    /* 
+     * Testing one-dimensional dataset with compound datatype and
+     *	 member names consisting of escape/separator characters:
+     *		DSET_CMPD_ESC
+     */
+
+    /* Open dataset DSET_CMPD_ESC */
+    if((did = H5Dopen2(fid, DSET_CMPD_ESC, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Return size of the whole element */
+    if((dsize = H5LDget_dset_type_size(did, NULL)) == 0)
+	FAIL_STACK_ERROR
+
+    /* Get the dataset's datatype and then its datatype size */
+    if((dtid = H5Tget_native_type(H5Dget_type(did), H5T_DIR_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+    if((ck_dsize = H5Tget_size(dtid)) == 0)
+	FAIL_STACK_ERROR
+
+    /* Verify case #1 */
+    VERIFY_EQUAL(dsize, ck_dsize)
+
+    /* Get datatype id for each member */
+    if((memb0_tid = H5Tget_member_type(dtid, 0)) < 0) /* "field,1" */
+	FAIL_STACK_ERROR
+    if((memb1_tid = H5Tget_member_type(dtid, 1)) < 0) /* "field2." */
+	FAIL_STACK_ERROR
+    if((memb2_tid = H5Tget_member_type(dtid, 2)) < 0) /* "field\3" */
+	FAIL_STACK_ERROR
+    if((memb3_tid = H5Tget_member_type(dtid, 3)) < 0) /* "field4," */
+	FAIL_STACK_ERROR
+
+    /* Obtain size for VALID_ESC_FIELDS1: "field\\,1,field2\\..\\.a,field\\\\3,field4\\," */
+    if((dsize = H5LDget_dset_type_size(did, VALID_ESC_FIELDS1)) == 0)
+	FAIL_STACK_ERROR
+
+    /* Get the datatype size for "field\\,1" */
+    if((ck_dsize = H5Tget_size(memb0_tid)) == 0)
+	FAIL_STACK_ERROR
+
+    /* Add the datatype size for "field2\\..\\.a" */
+    if((memb_tid = H5Tget_member_type(memb1_tid, 0)) < 0)
+	FAIL_STACK_ERROR
+    if((ck_dsize += H5Tget_size(memb_tid)) == 0)
+	FAIL_STACK_ERROR
+    if(H5Tclose(memb_tid) < 0)
+	FAIL_STACK_ERROR
+
+    /* Add the datatype size for "field\\\\3" */
+    if((ck_dsize += H5Tget_size(memb2_tid)) == 0)
+	FAIL_STACK_ERROR
+
+    /* Add the datatype size for "field4\\," */
+    if((ck_dsize += H5Tget_size(memb3_tid)) == 0)
+	FAIL_STACK_ERROR
+
+    /* Verify case #2 */
+    VERIFY_EQUAL(dsize, ck_dsize)
+
+    /* Obtain datatype size for VALID_ESC_FIELDS2: 
+	    "field2\\..\\,b.a,field2\\..\\\\c,field4\\,.b\\," */
+    if((dsize = H5LDget_dset_type_size(did, VALID_ESC_FIELDS2)) == 0)
+	FAIL_STACK_ERROR
+
+    /* Get the datatype size for "field2\..,b.a" */
+    if((memb_tid = H5Tget_member_type(memb1_tid, 1)) < 0)
+	FAIL_STACK_ERROR
+    if((memb_tid2 = H5Tget_member_type(memb_tid, 0)) < 0)
+	FAIL_STACK_ERROR
+    if((ck_dsize = H5Tget_size(memb_tid2)) == 0)
+	FAIL_STACK_ERROR
+    if(H5Tclose(memb_tid) < 0)
+	FAIL_STACK_ERROR
+    if(H5Tclose(memb_tid2) < 0)
+	FAIL_STACK_ERROR
+
+    /* Add the datatype size for "field2\..\\c" */
+    if((memb_tid = H5Tget_member_type(memb1_tid, 2)) < 0)
+	FAIL_STACK_ERROR
+    if((ck_dsize += H5Tget_size(memb_tid)) == 0)
+	FAIL_STACK_ERROR
+    if(H5Tclose(memb_tid) < 0)
+	FAIL_STACK_ERROR
+
+    /* Add the datatype size for "field4\,.b\," */
+    if((memb_tid = H5Tget_member_type(memb3_tid, 1)) < 0)
+	FAIL_STACK_ERROR
+    if((ck_dsize += H5Tget_size(memb_tid)) == 0)
+	FAIL_STACK_ERROR
+    if(H5Tclose(memb_tid) < 0)
+	FAIL_STACK_ERROR
+
+    /* Verify case #3 */
+    VERIFY_EQUAL(dsize, ck_dsize)
+
+    /*
+     * Verify failure for the following invalid nested fields: 
+     *   INVALID_ESC_FIELDS1: "field2\..\,k.a,field2\..\\c,field4\,.k\,"
+     *   INVALID_ESC_FIELDS2: "field2\..\,b.a,field2\..\\c,field4\,.b\,."
+     *   INVALID_ESC_FIELDS3: "field2\..\,,b.a,field2\..\\c,field4\,.b\,"
+     */
+    /* Verify failure for case #4 */
+    dsize = H5LDget_dset_type_size(did, INVALID_ESC_FIELDS1);
+    VERIFY_EQUAL(dsize, 0)
+
+    /* Verify failure for case #5 */
+    dsize = H5LDget_dset_type_size(did, INVALID_ESC_FIELDS2);
+    VERIFY_EQUAL(dsize, 0)
+
+    /* Verify failure for case #6 */
+    dsize = H5LDget_dset_type_size(did, INVALID_ESC_FIELDS3);
+    VERIFY_EQUAL(dsize, 0)
+
+    /* Closing */
+    if(H5Tclose(memb0_tid) < 0)
+	FAIL_STACK_ERROR
+    if(H5Tclose(memb1_tid) < 0)
+	FAIL_STACK_ERROR
+    if(H5Tclose(memb2_tid) < 0)
+	FAIL_STACK_ERROR
+    if(H5Tclose(memb3_tid) < 0)
+	FAIL_STACK_ERROR
+    if(H5Tclose(dtid) < 0)
+	FAIL_STACK_ERROR
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR
+
+    if(H5Fclose(fid) < 0)
+	FAIL_STACK_ERROR
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+	H5Tclose(memb0_tid);
+	H5Tclose(memb1_tid);
+	H5Tclose(memb2_tid);
+	H5Tclose(memb3_tid);
+	H5Tclose(memb_tid);
+	H5Tclose(memb_tid2);
+	H5Tclose(dtid);
+	H5Dclose(did);
+	H5Fclose(fid);
+    } H5E_END_TRY;
+    return(-1);
+
+} /* test_LD_size() */
+
+

+/* 
+ **************************************************************************************
+ * Testing for the High Level public routine: H5LDget_dset_elmts()
+ * 	Verify failures when calling H5LDget_dset_elmts() with the following
+ *   	invalid conditions: 
+ *
+ *	A. DSET_TWO: two-dimensional dataset
+ *		1. CUR_DIMS and PREV_DIMS are NULL
+ *		2. PREV_DIMS is NULL
+ *		3. CUR_DIMS is NULL
+ *		4. FIELDS is nonnull but the dataset is not compound datatype
+ *		5. BUF is NULL
+ *		6. CUR_DIMS is not greater than PREV_DIMS
+ *
+ *	B. DSET_CMPD: one-dimensional dataset with compound type
+ *		1. Invalid dataset id
+ *		2. FIELDS are not valid members in the compound type
+ *
+ **************************************************************************************
+ */
+static int
+test_LD_elmts_invalid(const char *file)
+{
+    hid_t fid=-1;		/* file identifier */
+    hid_t did=-1;		/* dataset identifier */
+    hid_t sid=-1;		/* dataspace identifier */
+    hid_t invalid_id=-1;
+    int ret;			/* return value */
+    hsize_t cur_dims[2];	/* current dimension sizes of the dataset */
+    hsize_t prev_dims[2];	/* previous dimension sizes of the dataset */
+    char tbuf[2];	/* temporary buffer for testing */
+    int ndims;		/* # of dimension sizes */
+    int i;		/* local index variable */
+
+    const char *filename = H5_get_srcdir_filename(file);
+
+    TESTING("H5LDget_dset_elmts on invalid conditions");
+
+    /* Open the copied file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* 
+     * Testing two-dimensional dataset: DSET_TWO
+     */
+
+    /* Open dataset: DSET_TWO */
+    if((did = H5Dopen2(fid, DSET_TWO, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Verify failure from case #1: cur_dims and prev_dims are NULL */
+    ret = H5LDget_dset_elmts(did, NULL, NULL, NULL, NULL);
+    VERIFY_EQUAL(ret, FAIL)
+
+    /* Verify failure from case #2: prev_dims is NULL */
+    ret = H5LDget_dset_elmts(did, cur_dims, NULL, NULL, NULL);
+    VERIFY_EQUAL(ret, FAIL)
+
+    /* Verify failure from case #3: cur_dims is NULL */
+    ret = H5LDget_dset_elmts(did, NULL, prev_dims, NULL, NULL);
+    VERIFY_EQUAL(ret, FAIL)
+
+    if((sid = H5Dget_space(did)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Get the # of dimensions and current dimension sizes */
+    if((ndims = H5Sget_simple_extent_dims(sid, cur_dims, NULL)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Set up valid cur_dims and prev_dims */
+    for(i = 0; i < ndims; i++)
+	prev_dims[i] = cur_dims[i] - 1;
+
+    /* Verify failure from case #4: FIELDS is nonNULL but the dataset is not compound datatype */
+    ret = H5LDget_dset_elmts(did, prev_dims, cur_dims, "field1", tbuf);
+    VERIFY_EQUAL(ret, FAIL)
+
+    /* Verify failure from case #5: BUF is NULL */
+    ret = H5LDget_dset_elmts(did, prev_dims, cur_dims, NULL, NULL);
+    VERIFY_EQUAL(ret, FAIL)
+
+    /* Verify failure from case #6: cur_dims is not > than prev_dims */
+    cur_dims[0] = prev_dims[0] - 1;
+    cur_dims[1] = prev_dims[1] - 1;
+    ret = H5LDget_dset_elmts(did, prev_dims, cur_dims, NULL, tbuf);
+    VERIFY_EQUAL(ret, FAIL)
+
+    /* Close DSET_TWO */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR
+
+    /* 
+     * Testing one-dimensional dataset with compound datatype:
+     *		DSET_CMPD
+     */
+
+    /* Verify failure from case #1: an invalid dataset id */
+    H5E_BEGIN_TRY {
+	ret = H5LDget_dset_elmts(invalid_id, prev_dims, cur_dims, NULL, tbuf);
+    } H5E_END_TRY;
+    VERIFY_EQUAL(ret, FAIL)
+
+    /* Open dataset: DSET_CMPD */
+    if((did = H5Dopen2(fid, DSET_CMPD, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Retrieve the current dimension sizes */
+    if(H5LDget_dset_dims(did, cur_dims) < 0)
+	FAIL_STACK_ERROR
+
+    /* Set up valid cur_dims, prev_dims */
+    prev_dims[0] = cur_dims[0] - 1;
+
+    /* Verify failure from case #2: invalid FIELDS */
+    ret = H5LDget_dset_elmts(did, prev_dims, cur_dims, "field2.k.a,field2.c,field4.k", tbuf);
+    VERIFY_EQUAL(ret, FAIL)
+
+    /* Close DSET_CMPD */
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+	FAIL_STACK_ERROR
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+	H5Sclose(sid);
+	H5Dclose(did);
+	H5Fclose(fid);
+    } H5E_END_TRY;
+    return(-1);
+
+} /* test_LD_elmts_invalid() */
+
+

+/* 
+ **************************************************************************************
+ * Testing for the High Level public routine: H5LDget_dset_elmts()
+ * 	Verify elements retrieved via H5LDget_dset_elmts() are correct as expected
+ *	when the dataset's dimension sizes are changed according to one_tests[]:
+ *
+ *	one-dimensional dataset : 
+ *		DSET_ONE with NULL fields
+ *		DSET_CMPD with fields: NULL, VALID_FIELDS1, VALID_FIELDS2
+ *		DSET_CMPD_ESC with fields: NULL, VALID_ESC_FIELDS1, VALID_ESC_FIELDS2
+ *	
+ *		case #1. increase dims[0]
+ *        	case #2. decrease dims[0]	(failure)
+ *        	case #3. same dims[0]		(failure)
+ *        	case #4. decrease dims[0]	(failure)
+ *        	case #5. increase dims[0]
+ *
+ **************************************************************************************
+ */
+static herr_t
+test_LD_elmts_one(const char *file, const char *dname, const char *fields)
+{
+    hid_t fid=-1;		/* file identifier */
+    hid_t did=-1;		/* dataset identifier */
+    hid_t dtype=-1;		/* dataset's data type */
+    hsize_t ext_dims[1];	/* extended dimension sizes of the dataset */
+    hsize_t prev_dims[1];	/* previous dimension sizes of the dataset */
+    int i, j;			/* local index variable */
+    int ret = 0;		/* return value */
+
+    TESTING("H5LDget_dset_elmts: one-dimensional dataset");
+
+    /* Copy the test file */
+    if(h5_make_local_copy(file, COPY_FILENAME) < 0)
+        TEST_ERROR
+
+    for(i = 0; i < TEST_BUF_SIZE; i++) {
+	cbuf[i].field1 = i;
+	cbuf[i].field2.a = i;
+	cbuf[i].field2.b.a = i;
+	cbuf[i].field2.b.b = i;
+	cbuf[i].field2.b.c = i;
+	cbuf[i].field2.c = i;
+	cbuf[i].field3 = (double)i;
+	cbuf[i].field4.a = i;
+	cbuf[i].field4.b = i;
+	ibuf[i] = i;
+    } /* end for */
+
+    /* Open the copied file */
+    if((fid = H5Fopen(COPY_FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Open the dataset */
+    if((did = H5Dopen2(fid, dname, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Get the dataset's data type */
+    if((dtype = H5Tget_native_type(H5Dget_type(did), H5T_DIR_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Get current dimension sizes before extending the dataset's dimension sizes */
+    if(H5LDget_dset_dims(did, prev_dims) < 0)
+	FAIL_STACK_ERROR
+
+    /* Loop through different variations of extending the dataset */
+    for(i = 0; i < ONE_NTESTS; i++) {
+	HDmemset(vbuf1, 0, TEST_BUF_SIZE * sizeof(test_valid_fields1));
+	HDmemset(vbuf2, 0, TEST_BUF_SIZE * sizeof(test_valid_fields2));
+	HDmemset(ccbuf, 0, TEST_BUF_SIZE * sizeof(set_t));
+	HDmemset(iibuf, 0, TEST_BUF_SIZE * sizeof(int));
+
+	ext_dims[0] = (hsize_t)((int)prev_dims[0] + one_tests[i]);
+
+	/* Change the dimension sizes of the dataset */
+	if(H5Dset_extent(did, ext_dims) < 0)
+	    FAIL_STACK_ERROR
+
+	/* Initialize data */
+	if(!HDstrcmp(dname, DSET_CMPD) || !HDstrcmp(dname, DSET_CMPD_ESC)) {
+	    if(H5Dwrite(did, dtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, cbuf) < 0)
+		FAIL_STACK_ERROR
+	} /* end if */
+        else if(!HDstrcmp(dname, DSET_ONE)) {
+	    if(H5Dwrite(did, dtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, ibuf) < 0)
+		FAIL_STACK_ERROR
+	} /* end if */
+
+	/* There are changes in dimension sizes */
+	if(one_tests[i] > 0) {
+	    if(!HDstrcmp(dname, DSET_CMPD) || !HDstrcmp(dname, DSET_CMPD_ESC)) {
+		if(fields) {
+                    if(!HDstrcmp(fields, VALID_FIELDS1) || !HDstrcmp(fields, VALID_ESC_FIELDS1)) {
+                        /* Retrieve the elmemts in BUF */
+                        if(H5LDget_dset_elmts(did, prev_dims, ext_dims, fields, vbuf1) < 0)
+                            TEST_ERROR
+                        for(j = 0; j < one_tests[i]; j++)
+                            VERIFY_ELMTS_VALID1(vbuf1[j], cbuf[prev_dims[0] + (hsize_t)j])
+                    } /* end if */
+                    else if(!HDstrcmp(fields, VALID_FIELDS2) || !HDstrcmp(fields, VALID_ESC_FIELDS2)) {
+                        /* Retrieve the elmemts in BUF */
+                        if(H5LDget_dset_elmts(did, prev_dims, ext_dims, fields, vbuf2) < 0)
+                            TEST_ERROR
+                        for(j = 0; j < one_tests[i]; j++)
+                            VERIFY_ELMTS_VALID2(vbuf2[j], cbuf[prev_dims[0] + (hsize_t)j])
+                    } /* end else-if */
+                    else
+			TEST_ERROR
+		} /* end if */
+                else {
+		    /* Retrieve the elmemts in BUF */
+		    if(H5LDget_dset_elmts(did, prev_dims, ext_dims, fields, ccbuf) < 0)
+			TEST_ERROR
+		    for(j = 0; j < one_tests[i]; j++)
+			VERIFY_ELMTS_ALL(ccbuf[j], cbuf[prev_dims[0] + (hsize_t)j])
+		} /* end else-if */
+	    } /* end if */
+            else {
+		/* Retrieve the elmemts in BUF */
+		if(H5LDget_dset_elmts(did, prev_dims, ext_dims, fields, iibuf) < 0)
+		    TEST_ERROR
+		for(j = 0; j < one_tests[i]; j++)
+		    VERIFY_EQUAL(iibuf[j], ibuf[prev_dims[0] + (hsize_t)j])
+	    } /* end else */
+	} /* end if */
+        else {
+            /* Verify failure when changes between prev_dims and ext_dims are same/decrease */
+            ret = H5LDget_dset_elmts(did, prev_dims, ext_dims, fields, iibuf);
+            VERIFY_EQUAL(ret, FAIL)
+        } /* end else */
+    } /* end for */
+
+    /* Closing */
+    if(H5Tclose(dtype) < 0)
+        FAIL_STACK_ERROR
+    if(H5Dclose(did) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Remove the copied file */
+    HDremove(COPY_FILENAME);
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+	H5Tclose(dtype);
+	H5Dclose(did);
+	H5Fclose(fid);
+    } H5E_END_TRY;
+    return(-1);
+} /* test_LD_elmts_one() */
+
+

+/*
+ **************************************************************************************
+ *
+ * Helper routine to verify elements of a 2-dimensional dataset 
+ *	_ldbuf contains the elements retrieved via H5LDget_dset_elmts()
+ *	_buf contains the data written to the dataset
+ *
+ *	e.g. prev_dims[2] = {4, 6}; ext_dims[2] = {6, 10}
+ *	     elements marked in 'v' in _buf are compared to elements in _ldbuf
+ *		0 1 2 3 4 5 | 6 7 8 9
+ *             0	    | v v v v
+ *	       1	    | v v v v
+ *	       2	    | v v v v
+ *	       3	    | v v v v
+ *	        ---------------------
+ *	       4 v v v v v v  v v v v	    
+ *	       5 v v v v v v  v v v v
+ *
+ **************************************************************************************
+ */
+static herr_t
+verify_elmts_two(int type, hsize_t *ext_dims, hsize_t *prev_dims,  void *_ldbuf, void *_buf)
+{
+    int k, m;		/* Local index variable */
+
+    k = 0;							
+    for(m = 0; m < (int)ext_dims[0]; m++) {
+        int n, ind;	/* Local index variable */
+
+	ind = m * (int)ext_dims[1];	
+	if(m < (int)prev_dims[0]) {
+	    for(n = (int)prev_dims[1]; n < (int)ext_dims[1]; n++) {
+		VERIFY_ELMTS(type, k, ind, _ldbuf, _buf)
+		++k;
+	    }  /* end for */
+	} /* end if */
+        else {					
+	    for(n = 0; n < (int)ext_dims[1]; n++) {
+		VERIFY_ELMTS(type, k, ind, _ldbuf, _buf)
+		++k;
+	    } /* end for */
+	} /* end else */
+    } /* end for */
+
+    return(0);
+
+error:
+    return(-1);
+} /* verify_elmts_two() */
+
+

+/* 
+ **************************************************************************************
+ * Testing for the High Level public routine: H5LDget_dset_elmts()
+ * 	Verify elements retrieved via H5LDget_dset_elmts() are correct as expected when
+ *	the datset's dimension sizes are changed accordingly to two_tests[]:
+ *
+ *	two-dimensional dataset: DSET_TWO with NULL fields
+ *				 DSET_CMPD_TWO with fields: NULL, VALID_FIELDS1, VALID_FIELDS2
+ *
+ *			dims[0]		dims[1]
+ *			-------		-------
+ *	case #1: 	increase	increase
+ *      case #2:	increase	decrease
+ *      case #3:	increase	same
+ *      case #4:	decrease	increase
+ *      case #5:	decrease	decrease	(failure)
+ *      case #6:	decrease	same		(failure)
+ *      case #7:	same		increase
+ *      case #8:	same		decrease	(failure)
+ *      case #9:	same		same		(failure)
+ *		
+ **************************************************************************************
+ */
+static herr_t
+test_LD_elmts_two(const char *file, const char *dname, const char *fields)
+{
+    hid_t fid=-1;		/* file identifier */
+    hid_t did=-1;		/* dataset identifier */
+    hid_t dtype=-1;		/* dataset's data type */
+    hsize_t ext_dims[2];	/* extended dimension sizes of the dataset */
+    hsize_t prev_dims[2];	/* previous dimension sizes of the dataset */
+    int i;			/* local index variable */
+    int ret = 0;		/* return value */
+
+    TESTING("H5LDget_dset_elmts: two-dimensional dataset");
+
+    /* Copy the test file */
+    if(h5_make_local_copy(file, COPY_FILENAME) < 0)
+        TEST_ERROR
+
+    for(i = 0; i < TEST_BUF_SIZE; i++) {
+	cbuf[i].field1 = i;
+	cbuf[i].field2.a = i;
+	cbuf[i].field2.b.a = i;
+	cbuf[i].field2.b.b = i;
+	cbuf[i].field2.b.c = i;
+	cbuf[i].field2.c = i;
+	cbuf[i].field3 = (double)i;
+	cbuf[i].field4.a = i;
+	cbuf[i].field4.b = i;
+	ibuf[i] = i;
+    } /* end for */
+
+    /* Open the copied file */
+    if((fid = H5Fopen(COPY_FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Open the dataset */
+    if((did = H5Dopen2(fid, dname, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Get the dataset's data type */
+    if((dtype = H5Tget_native_type(H5Dget_type(did), H5T_DIR_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Get current dimension sizes before extending the dataset's dimension sizes */
+    if(H5LDget_dset_dims(did, prev_dims) < 0)
+	FAIL_STACK_ERROR
+
+    /* Loop through different variations of extending the dataset */
+    for(i = 0; i < TWO_NTESTS; i++) {
+	HDmemset(vbuf1, 0, TEST_BUF_SIZE * sizeof(test_valid_fields1));
+	HDmemset(vbuf2, 0, TEST_BUF_SIZE * sizeof(test_valid_fields2));
+	HDmemset(ccbuf, 0, TEST_BUF_SIZE * sizeof(set_t));
+	HDmemset(iibuf, 0, TEST_BUF_SIZE * sizeof(int));
+
+	ext_dims[0] = (hsize_t)((int)prev_dims[0] + two_tests[i][0]);
+	ext_dims[1] = (hsize_t)((int)prev_dims[1] + two_tests[i][1]);
+
+	/* Change the dimension sizes of the dataset */
+	if(H5Dset_extent(did, ext_dims) < 0)
+	    FAIL_STACK_ERROR
+
+	/* Initialize data */
+	if(!HDstrcmp(dname, DSET_CMPD_TWO)) {
+	    if(H5Dwrite(did, dtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, cbuf) < 0)
+		FAIL_STACK_ERROR
+	} /* end if */
+        else if(!HDstrcmp(dname, DSET_TWO)) {
+	    if(H5Dwrite(did, dtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, ibuf) < 0)
+		FAIL_STACK_ERROR
+	} /* end else-if */
+        else
+            TEST_ERROR
+
+	/* There are changes in dimension sizes */
+	if(two_tests[i][0] > 0 || two_tests[i][1] > 0) {
+	    if(!HDstrcmp(dname, DSET_CMPD_TWO)) {
+		if(fields) {
+                     if(!HDstrcmp(fields, VALID_FIELDS1) || !HDstrcmp(fields, VALID_ESC_FIELDS1)) {
+                        /* Retrieve the elmemts in BUF */
+                        if(H5LDget_dset_elmts(did, prev_dims, ext_dims, fields, vbuf1) < 0)
+                            TEST_ERROR
+                        if(verify_elmts_two(TWO_CMPD_VALID1, ext_dims, prev_dims, vbuf1, cbuf) < 0)
+                            TEST_ERROR
+                    } /* end if */
+                    else if(!HDstrcmp(fields, VALID_FIELDS2) || !HDstrcmp(fields, VALID_ESC_FIELDS2)) {
+                        /* Retrieve the elmemts in BUF */
+                        if(H5LDget_dset_elmts(did, prev_dims, ext_dims, fields, vbuf2) < 0)
+                            TEST_ERROR
+                        if(verify_elmts_two(TWO_CMPD_VALID2, ext_dims, prev_dims, vbuf2, cbuf) < 0)
+                            TEST_ERROR
+                    } /* end else-if */
+                    else
+                        TEST_ERROR
+		} /* end if */
+                else {
+		    /* Retrieve the elmemts in BUF */
+		    if(H5LDget_dset_elmts(did, prev_dims, ext_dims, fields, ccbuf) < 0)
+			TEST_ERROR
+		    if(verify_elmts_two(TWO_CMPD_NULL, ext_dims, prev_dims, ccbuf, cbuf) < 0)
+			TEST_ERROR
+		} /* end else */
+	    } /* end if */
+            else { /* DSET_TWO */
+		/* Retrieve the elmemts in BUF */
+		if(H5LDget_dset_elmts(did, prev_dims, ext_dims, fields, iibuf) < 0)
+		    TEST_ERROR
+    		if(verify_elmts_two(TWO_NONE, ext_dims, prev_dims, iibuf, ibuf) < 0)
+		    TEST_ERROR
+	    } /* end else */
+	} /* end if */
+        else {
+	    /* Verify failure when changes between prev_dims and ext_dims are same/decrease */
+	    ret = H5LDget_dset_elmts(did, prev_dims, ext_dims, fields, iibuf);
+	    VERIFY_EQUAL(ret, FAIL)
+	} /* end else */
+    } /* end for */
+
+    /* Closing */
+    if(H5Tclose(dtype) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Dclose(did) < 0)
+	FAIL_STACK_ERROR;
+    if(H5Fclose(fid) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Remove the copied file */
+    HDremove(COPY_FILENAME);
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+	H5Tclose(dtype);
+	H5Dclose(did);
+	H5Fclose(fid);
+    } H5E_END_TRY;
+    return(-1);
+} /* test_LD_elmts_two() */
+
+/*
+ * Tests for High Level routines: 
+ *	H5LDget_dset_dims(), H5LDget_dset_elmts, H5LDget_dset_type_size()
+ */
+int main(void)
+{
+    int  nerrors = 0;
+
+    /* Set up temporary buffers for tests: test_LD_elmts_one() & test_LD_elmts_two() */
+    if(NULL == (ibuf = (int *)HDmalloc(sizeof(int) * TEST_BUF_SIZE)))
+	FAIL_STACK_ERROR;
+    if(NULL == (iibuf = (int *)HDmalloc(sizeof(int) * TEST_BUF_SIZE)))
+	FAIL_STACK_ERROR;
+
+    if(NULL == (cbuf = (set_t *)HDmalloc(sizeof(set_t) * TEST_BUF_SIZE)))
+	FAIL_STACK_ERROR;
+    if(NULL == (ccbuf = (set_t *)HDmalloc(sizeof(set_t) * TEST_BUF_SIZE)))
+	FAIL_STACK_ERROR;
+
+    if(NULL == (vbuf1 = (test_valid_fields1 *)HDmalloc(sizeof(test_valid_fields1) * TEST_BUF_SIZE)))
+	FAIL_STACK_ERROR;
+    if(NULL == (vbuf2 = (test_valid_fields2 *)HDmalloc(sizeof(test_valid_fields2) * TEST_BUF_SIZE)))
+	FAIL_STACK_ERROR;
+
+    /* 
+     * Testing H5LDget_dset_dims() 
+     */
+    nerrors += test_LD_dims_params(FILE);
+    nerrors += test_LD_dims(FILE);
+
+    /* 
+     * Testing H5LDget_dset_type_size() 
+     */
+    nerrors += test_LD_size(FILE);
+
+    /* 
+     * Testing invalid conditions for H5LDget_dset_elmts()
+     */
+    nerrors += test_LD_elmts_invalid(FILE);
+
+    /* 
+     * Testing H5LDget_dset_elmts(): 
+     *	 1-dimensional dataset
+     */
+    nerrors += test_LD_elmts_one(FILE, DSET_ONE, NULL);
+
+    /* 
+     * Testing H5LDget_dset_elmts(): 
+     *	 1-dimensional dataset w/ compound datatype
+     */
+    nerrors += test_LD_elmts_one(FILE, DSET_CMPD, NULL);
+    nerrors += test_LD_elmts_one(FILE, DSET_CMPD, VALID_FIELDS1);
+    nerrors += test_LD_elmts_one(FILE, DSET_CMPD, VALID_FIELDS2);
+
+    /* 
+     * Testing H5LDget_dset_elmts():
+     * 	 1-dimensional dataset with compound datatype and 
+     *   member names with escape/separator characters 
+     */
+    nerrors += test_LD_elmts_one(FILE, DSET_CMPD_ESC, NULL);
+    nerrors += test_LD_elmts_one(FILE, DSET_CMPD_ESC, VALID_ESC_FIELDS1);
+    nerrors += test_LD_elmts_one(FILE, DSET_CMPD_ESC, VALID_ESC_FIELDS2);
+
+    /* 
+     * Testing H5LDget_dset_elmts() for 2-dimensional datasets
+     */
+    nerrors += test_LD_elmts_two(FILE, DSET_TWO, NULL);
+    nerrors += test_LD_elmts_two(FILE, DSET_CMPD_TWO, NULL);
+    nerrors += test_LD_elmts_two(FILE, DSET_CMPD_TWO, VALID_FIELDS1);
+    nerrors += test_LD_elmts_two(FILE, DSET_CMPD_TWO, VALID_FIELDS2);
+
+    /* Free temporary buffers */
+    if(ibuf)
+        HDfree(ibuf);
+    if(iibuf)
+        HDfree(iibuf);
+    if(cbuf)
+        HDfree(cbuf);
+    if(ccbuf)
+        HDfree(ccbuf);
+    if(vbuf1)
+        HDfree(vbuf1);
+    if(vbuf2)
+        HDfree(vbuf2);
+
+    /* check for errors */
+    if(nerrors)
+	goto error;
+
+    puts("All tests for H5LD high level routines passed.");
+
+    return(0);
+
+error:
+    return(1);
+} /* main() */
+
diff --git a/hl/test/test_ld.h5 b/hl/test/test_ld.h5
new file mode 100644
index 0000000..bd5730c
Binary files /dev/null and b/hl/test/test_ld.h5 differ
diff --git a/hl/test/test_lite.c b/hl/test/test_lite.c
index fccc85f..f3258d6 100644
--- a/hl/test/test_lite.c
+++ b/hl/test/test_lite.c
@@ -300,7 +300,7 @@ static int test_dsets( void )
 
     for (i = 0; i < DIM; i++)
     {
-        if(!FLT_ABS_EQUAL(data_float_in[i],data_float_out[i])) {
+        if(!H5_FLT_ABS_EQUAL(data_float_in[i],data_float_out[i])) {
             goto out;
         }
     }
@@ -311,7 +311,7 @@ static int test_dsets( void )
 
     for (i = 0; i < DIM; i++)
     {
-        if(!FLT_ABS_EQUAL(data_float_in[i],data_float_out[i])) {
+        if(!H5_FLT_ABS_EQUAL(data_float_in[i],data_float_out[i])) {
             goto out;
         }
     }
@@ -336,7 +336,7 @@ static int test_dsets( void )
 
     for (i = 0; i < DIM; i++)
     {
-        if(!DBL_ABS_EQUAL(data_double_in[i],data_double_out[i])) {
+        if(!H5_DBL_ABS_EQUAL(data_double_in[i],data_double_out[i])) {
             goto out;
         }
     }
@@ -347,7 +347,7 @@ static int test_dsets( void )
 
     for (i = 0; i < DIM; i++)
     {
-        if(!DBL_ABS_EQUAL(data_double_in[i],data_double_out[i])) {
+        if(!H5_DBL_ABS_EQUAL(data_double_in[i],data_double_out[i])) {
             goto out;
         }
     }
@@ -959,7 +959,7 @@ static herr_t make_attributes( hid_t loc_id, const char* obj_name )
 
     for (i = 0; i < 5; i++)
     {
-        if(!FLT_ABS_EQUAL(attr_float_in[i],attr_float_out[i])) {
+        if(!H5_FLT_ABS_EQUAL(attr_float_in[i],attr_float_out[i])) {
             return -1;
         }
     }
@@ -970,7 +970,7 @@ static herr_t make_attributes( hid_t loc_id, const char* obj_name )
 
     for (i = 0; i < 5; i++)
     {
-        if(!FLT_ABS_EQUAL(attr_float_in[i],attr_float_out[i])) {
+        if(!H5_FLT_ABS_EQUAL(attr_float_in[i],attr_float_out[i])) {
             return -1;
         }
     }
@@ -1003,7 +1003,7 @@ static herr_t make_attributes( hid_t loc_id, const char* obj_name )
 
     for (i = 0; i < 5; i++)
     {
-        if(!DBL_ABS_EQUAL(attr_double_in[i],attr_double_out[i])) {
+        if(!H5_DBL_ABS_EQUAL(attr_double_in[i],attr_double_out[i])) {
             return -1;
         }
     }
@@ -1014,7 +1014,7 @@ static herr_t make_attributes( hid_t loc_id, const char* obj_name )
 
     for (i = 0; i < 5; i++)
     {
-        if(!DBL_ABS_EQUAL(attr_double_in[i],attr_double_out[i])) {
+        if(!H5_DBL_ABS_EQUAL(attr_double_in[i],attr_double_out[i])) {
             return -1;
         }
     }
@@ -1196,7 +1196,7 @@ static int test_strings(void)
     H5T_str_t   str_pad;
     H5T_cset_t  str_cset;
     H5T_class_t type_class;
-    char*   dt_str;
+    char*   dt_str = NULL;
     size_t  str_len;
 
     TESTING3("        text for string types");
@@ -1282,6 +1282,7 @@ static int test_strings(void)
       HDfree(dt_str);
       goto out;
     }
+    HDfree(dt_str);
 
     /* Length of the character buffer is smaller then needed */
     str_len = 21;
@@ -1764,18 +1765,10 @@ static int test_complicated_compound(void)
     char   *line = NULL;
     FILE   *fp = NULL;
     size_t  size = 1024;
-    char   *srcdir = getenv("srcdir"); /* the source directory */
-    char    filename[1024]="";
+    const char *filename = H5_get_srcdir_filename(INPUT_FILE);
 
     TESTING3("        text for complicated compound types");
 
-    /* compose the name of the file to open, using the srcdir, if appropriate */
-    if(srcdir) {
-        HDstrcpy(filename, srcdir);
-        HDstrcat(filename, "/");
-    }
-    HDstrcat(filename, INPUT_FILE);
-
     /* Open input file */
     fp = HDfopen(filename, "r");
     if(fp == NULL) {
@@ -1890,7 +1883,7 @@ static int test_valid_path(void)
   hid_t file_id, group;
   htri_t path_valid;
   const char *data_string_in = "test";
-  
+   
   TESTING("H5LTpath_valid");
     
   /* Create a new file using default properties. */
diff --git a/hl/test/test_packet.c b/hl/test/test_packet.c
index 256892b..345aecb 100644
--- a/hl/test/test_packet.c
+++ b/hl/test/test_packet.c
@@ -75,8 +75,8 @@ static int cmp_par(size_t i, size_t j, particle_t *rbuf, particle_t *wbuf )
  if ( ( HDstrcmp( rbuf[i].name, wbuf[j].name ) != 0 ) ||
   rbuf[i].lati != wbuf[j].lati ||
   rbuf[i].longi != wbuf[j].longi ||
-  !FLT_ABS_EQUAL(rbuf[i].pressure,wbuf[j].pressure) ||
-  !DBL_ABS_EQUAL(rbuf[i].temperature,wbuf[j].temperature) ) {
+  !H5_FLT_ABS_EQUAL(rbuf[i].pressure,wbuf[j].pressure) ||
+  !H5_DBL_ABS_EQUAL(rbuf[i].temperature,wbuf[j].temperature) ) {
   return -1;
  }
  return 0;
diff --git a/hl/test/test_table.c b/hl/test/test_table.c
index 0870546..c9c3c19 100644
--- a/hl/test/test_table.c
+++ b/hl/test/test_table.c
@@ -145,16 +145,7 @@ static hid_t h5file_open(const char *fname, unsigned flags)
 {
 
     hid_t fid;                        /* identifier for the file */
-    char  *srcdir = getenv("srcdir"); /* the source directory */
-    char  data_file[512]="";          /* buffer to hold name of existing file */
-
-    /* compose the name of the file to open, using the srcdir, if appropriate */
-    if (srcdir)
-    {
-        HDstrcpy(data_file,srcdir);
-        HDstrcat(data_file,"/");
-    }
-    HDstrcat(data_file,fname);
+    const char *data_file = H5_get_srcdir_filename(fname);
 
     /* open */
     if ((fid = H5Fopen(data_file,flags,H5P_DEFAULT))<0)
@@ -175,8 +166,8 @@ static int cmp_par(hsize_t i, hsize_t j, particle_t *rbuf, particle_t *wbuf )
     if ( ( HDstrcmp( rbuf[i].name, wbuf[j].name ) != 0 ) ||
         rbuf[i].lati != wbuf[j].lati ||
         rbuf[i].longi != wbuf[j].longi ||
-	!FLT_ABS_EQUAL(rbuf[i].pressure,wbuf[j].pressure)  ||
-	!DBL_ABS_EQUAL(rbuf[i].temperature,wbuf[j].temperature) )
+	!H5_FLT_ABS_EQUAL(rbuf[i].pressure,wbuf[j].pressure)  ||
+	!H5_DBL_ABS_EQUAL(rbuf[i].temperature,wbuf[j].temperature) )
     {
         HDfprintf(stderr,"read and write buffers have differences\n");
         HDfprintf(stderr,"%s %ld %f %f %d\n",
@@ -1149,7 +1140,7 @@ static int test_table(hid_t fid, int do_write)
                 {
                     if ( rbuf[i].lati       != position_in[i-NRECORDS_ADD+1].lati ||
                         rbuf[i].longi       != position_in[i-NRECORDS_ADD+1].longi ||
-			!FLT_ABS_EQUAL(rbuf[i].pressure,pressure_in[i-NRECORDS_ADD+1]) )
+			!H5_FLT_ABS_EQUAL(rbuf[i].pressure,pressure_in[i-NRECORDS_ADD+1]) )
                     {
                         HDfprintf(stderr,"%ld %f %d\n",
 				  rbuf[i].longi,(double)rbuf[i].pressure,rbuf[i].lati);
@@ -1211,7 +1202,7 @@ static int test_table(hid_t fid, int do_write)
     /* Compare the extracted table with the initial values */
     for ( i = 0; i < NRECORDS; i++ )
     {
-        if ( !FLT_ABS_EQUAL(pressure_out[i], pressure_in[i]) ) {
+        if ( !H5_FLT_ABS_EQUAL(pressure_out[i], pressure_in[i]) ) {
             goto out;
         }
     }
@@ -1274,7 +1265,7 @@ static int test_table(hid_t fid, int do_write)
     for( i = 0; i < NRECORDS; i++ )
     {
         if ( ( HDstrcmp( namepre_out[i].name,  namepre_in[i].name ) != 0 ) ||
-	     !FLT_ABS_EQUAL(namepre_out[i].pressure,namepre_in[i].pressure) ) {
+	     !H5_FLT_ABS_EQUAL(namepre_out[i].pressure,namepre_in[i].pressure) ) {
                 goto out;
         }
     }
@@ -1303,7 +1294,7 @@ static int test_table(hid_t fid, int do_write)
     {
         hsize_t iistart = start;
         if ( ( HDstrcmp( namepre_out[i].name,  namepre_in[iistart+i].name ) != 0 ) ||
-	     !FLT_ABS_EQUAL(namepre_out[i].pressure, namepre_in[iistart+i].pressure) ) {
+	     !H5_FLT_ABS_EQUAL(namepre_out[i].pressure, namepre_in[iistart+i].pressure) ) {
                 goto out;
         }
     }
@@ -1362,7 +1353,7 @@ static int test_table(hid_t fid, int do_write)
             {
                 if ( rbuf[i].lati        != position_in[i-NRECORDS_ADD+1].lati ||
                     rbuf[i].longi       != position_in[i-NRECORDS_ADD+1].longi ||
-		    !FLT_ABS_EQUAL(rbuf[i].pressure,pressure_in[i-NRECORDS_ADD+1]) )
+		    !H5_FLT_ABS_EQUAL(rbuf[i].pressure,pressure_in[i-NRECORDS_ADD+1]) )
                     goto out;
             }
         }
@@ -1415,7 +1406,7 @@ static int test_table(hid_t fid, int do_write)
     /* compare the extracted table with the initial values */
     for( i = 0; i < NRECORDS; i++ )
     {
-      if ( !FLT_ABS_EQUAL(pressure_out[i], pressure_in[i]) ) {
+      if ( !H5_FLT_ABS_EQUAL(pressure_out[i], pressure_in[i]) ) {
             goto out;
         }
     }
@@ -1481,7 +1472,7 @@ static int test_table(hid_t fid, int do_write)
     for( i = 0; i < NRECORDS; i++ )
     {
       if ( ( HDstrcmp( namepre_out[i].name,  namepre_in[i].name ) != 0 ) ||
-	   !FLT_ABS_EQUAL(namepre_out[i].pressure,namepre_in[i].pressure) ) {
+	   !H5_FLT_ABS_EQUAL(namepre_out[i].pressure,namepre_in[i].pressure) ) {
 	goto out;
       }
     }
@@ -1512,7 +1503,7 @@ static int test_table(hid_t fid, int do_write)
     {
         int iistart = (int) start;
         if ( ( HDstrcmp( namepre_out[i].name,  wbuf[iistart+(int)i].name ) != 0 ) ||
-	     !FLT_ABS_EQUAL(namepre_out[i].pressure, wbuf[iistart+(int)i].pressure) ) {
+	     !H5_FLT_ABS_EQUAL(namepre_out[i].pressure, wbuf[iistart+(int)i].pressure) ) {
                 goto out;
         }
     }
@@ -1555,8 +1546,8 @@ static int test_table(hid_t fid, int do_write)
             if ( ( HDstrcmp( rbuf2[i].name,  wbuf[i].name ) != 0 ) ||
                 rbuf2[i].lati          != wbuf[i].lati ||
                 rbuf2[i].longi         != wbuf[i].longi ||
-		!FLT_ABS_EQUAL(rbuf2[i].pressure,wbuf[i].pressure) ||
-		!DBL_ABS_EQUAL(rbuf2[i].temperature,wbuf[i].temperature) ||
+		!H5_FLT_ABS_EQUAL(rbuf2[i].pressure,wbuf[i].pressure) ||
+		!H5_DBL_ABS_EQUAL(rbuf2[i].temperature,wbuf[i].temperature) ||
                 rbuf2[i].new_field     != buf_new[i] ) {
                     goto out;
             }
@@ -1596,7 +1587,7 @@ static int test_table(hid_t fid, int do_write)
             if ( ( HDstrcmp( rbuf3[i].name, wbuf[i].name ) != 0 ) ||
                 rbuf3[i].lati != wbuf[i].lati ||
                 rbuf3[i].longi != wbuf[i].longi ||
-		!DBL_ABS_EQUAL(rbuf3[i].temperature,wbuf[i].temperature) ) {
+		!H5_DBL_ABS_EQUAL(rbuf3[i].temperature,wbuf[i].temperature) ) {
                     goto out;
             }
         }
diff --git a/hl/test/test_table_be.h5 b/hl/test/test_table_be.h5
index 3639695..970018e 100644
Binary files a/hl/test/test_table_be.h5 and b/hl/test/test_table_be.h5 differ
diff --git a/hl/test/test_table_cray.h5 b/hl/test/test_table_cray.h5
index d22dce3..1fcd75b 100644
Binary files a/hl/test/test_table_cray.h5 and b/hl/test/test_table_cray.h5 differ
diff --git a/hl/test/test_table_le.h5 b/hl/test/test_table_le.h5
index 6c330fd..ee5b532 100644
Binary files a/hl/test/test_table_le.h5 and b/hl/test/test_table_le.h5 differ
diff --git a/hl/tools/Makefile.am b/hl/tools/Makefile.am
index 5ef8a96..7fab05f 100644
--- a/hl/tools/Makefile.am
+++ b/hl/tools/Makefile.am
@@ -21,7 +21,9 @@
 
 include $(top_srcdir)/config/commence.am
 
+CONFIG=ordered
+
 # All subdirectories
-SUBDIRS=gif2h5
+SUBDIRS=gif2h5 h5watch
 
 include $(top_srcdir)/config/conclude.am
diff --git a/hl/tools/Makefile.in b/hl/tools/Makefile.in
index 77049d3..22cf3d7 100644
--- a/hl/tools/Makefile.in
+++ b/hl/tools/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -31,7 +31,17 @@
 # Tools HDF5 Makefile(.in)
 #
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -94,19 +104,20 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(top_srcdir)/bin/test-driver COPYING
 TESTS =
 subdir = hl/tools
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_P = $(am__v_P_ at AM_V@)
@@ -363,6 +374,9 @@ am__set_b = \
       b='$*';; \
   esac
 DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am COPYING
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 am__relativize = \
   dir0=`pwd`; \
@@ -404,7 +418,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -449,14 +462,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -466,13 +487,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -514,9 +534,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -654,9 +685,10 @@ TRACE = perl $(top_srcdir)/bin/trace
 # .chklog files are output from those tests.
 # *.clog and *.clog2 are from the MPE option.
 CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2
+CONFIG = ordered
 
 # All subdirectories
-SUBDIRS = gif2h5
+SUBDIRS = gif2h5 h5watch
 
 # Automake needs to be taught how to build lib, progs, and tests targets.
 # These will be filled in automatically for the most part (e.g.,
@@ -693,7 +725,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/tools/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign hl/tools/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -702,7 +733,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -848,7 +879,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1140,6 +1171,8 @@ uninstall-am:
 	mostlyclean-libtool mostlyclean-local pdf pdf-am ps ps-am \
 	recheck tags tags-am uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/hl/tools/gif2h5/Makefile.in b/hl/tools/gif2h5/Makefile.in
index 3da84e1..13486e3 100644
--- a/hl/tools/gif2h5/Makefile.in
+++ b/hl/tools/gif2h5/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -32,7 +32,17 @@
 #
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -95,22 +105,22 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/h52giftest.sh.in $(top_srcdir)/bin/depcomp \
-	$(top_srcdir)/bin/test-driver
 bin_PROGRAMS = gif2h5$(EXEEXT) h52gif$(EXEEXT)
 noinst_PROGRAMS = h52gifgentst$(EXEEXT)
 TESTS = $(TEST_SCRIPT)
 subdir = hl/tools/gif2h5
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES = h52giftest.sh
 CONFIG_CLEAN_VPATH_FILES =
 am__installdirs = "$(DESTDIR)$(bindir)"
@@ -150,7 +160,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -399,6 +409,10 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/h52giftest.sh.in \
+	$(top_srcdir)/bin/depcomp $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -418,7 +432,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -463,14 +476,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -480,13 +501,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -528,9 +548,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -719,7 +750,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/tools/gif2h5/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign hl/tools/gif2h5/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -728,7 +758,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -935,7 +965,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1211,6 +1241,8 @@ uninstall-am: uninstall-binPROGRAMS
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am \
 	uninstall-binPROGRAMS
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/hl/tools/gif2h5/hdf2gif.c b/hl/tools/gif2h5/hdf2gif.c
index 5c342ba..e03d5c4 100644
--- a/hl/tools/gif2h5/hdf2gif.c
+++ b/hl/tools/gif2h5/hdf2gif.c
@@ -64,7 +64,7 @@ int main(int argc , char **argv)
     int   ColorMapSize, InitCodeSize, Background, BitsPerPixel;
     int   j,nc;
     int   i;
-    int   numcols;
+    int   numcols = 0;
 
     BYTE pc2nc[256] , r1[256] , g1[256] , b1[256];
 
diff --git a/hl/tools/gif2h5/testfiles/REAMDE b/hl/tools/gif2h5/testfiles/README
similarity index 100%
rename from hl/tools/gif2h5/testfiles/REAMDE
rename to hl/tools/gif2h5/testfiles/README
diff --git a/hl/tools/h5watch/Makefile.am b/hl/tools/h5watch/Makefile.am
new file mode 100644
index 0000000..a5891ef
--- /dev/null
+++ b/hl/tools/h5watch/Makefile.am
@@ -0,0 +1,44 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+##
+## Makefile.am
+## Run automake to generate a Makefile.in from this file.
+#
+# HDF5 Library Makefile(.in)
+#
+
+include $(top_srcdir)/config/commence.am
+
+# Include src and tools/lib directories
+AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/tools/lib -I$(top_srcdir)/hl/src
+
+# These are our main targets, the tools
+TEST_SCRIPT=testh5watch.sh
+check_SCRIPTS=$(TEST_SCRIPT)
+SCRIPT_DEPEND=swmr_check_compat_vfd$(EXEEXT) extend_dset$(EXEEXT) h5watch$(EXEEXT)
+
+bin_PROGRAMS=h5watch
+noinst_PROGRAMS=swmr_check_compat_vfd h5watchgentest extend_dset
+
+# Add h5watch specific linker flags here
+h5watch_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# Programs all depend on the hdf5 library, the tools library, and the HL
+# library.
+LDADD=$(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5)
+#
+CHECK_CLEANFILES+=*.h5
+DISTCLEANFILES=testh5watch.sh
+
+include $(top_srcdir)/config/conclude.am
diff --git a/hl/tools/h5watch/Makefile.in b/hl/tools/h5watch/Makefile.in
new file mode 100644
index 0000000..cce6778
--- /dev/null
+++ b/hl/tools/h5watch/Makefile.in
@@ -0,0 +1,1458 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+#
+# HDF5 Library Makefile(.in)
+#
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+bin_PROGRAMS = h5watch$(EXEEXT)
+noinst_PROGRAMS = swmr_check_compat_vfd$(EXEEXT) \
+	h5watchgentest$(EXEEXT) extend_dset$(EXEEXT)
+TESTS = $(TEST_SCRIPT)
+subdir = hl/tools/h5watch
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
+CONFIG_CLEAN_FILES = testh5watch.sh
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
+extend_dset_SOURCES = extend_dset.c
+extend_dset_OBJECTS = extend_dset.$(OBJEXT)
+extend_dset_LDADD = $(LDADD)
+extend_dset_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+h5watch_SOURCES = h5watch.c
+h5watch_OBJECTS = h5watch.$(OBJEXT)
+h5watch_LDADD = $(LDADD)
+h5watch_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5)
+h5watch_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(h5watch_LDFLAGS) $(LDFLAGS) -o $@
+h5watchgentest_SOURCES = h5watchgentest.c
+h5watchgentest_OBJECTS = h5watchgentest.$(OBJEXT)
+h5watchgentest_LDADD = $(LDADD)
+h5watchgentest_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5)
+swmr_check_compat_vfd_SOURCES = swmr_check_compat_vfd.c
+swmr_check_compat_vfd_OBJECTS = swmr_check_compat_vfd.$(OBJEXT)
+swmr_check_compat_vfd_LDADD = $(LDADD)
+swmr_check_compat_vfd_DEPENDENCIES = $(LIBH5_HL) $(LIBH5TOOLS) \
+	$(LIBHDF5)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
+depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = extend_dset.c h5watch.c h5watchgentest.c \
+	swmr_check_compat_vfd.c
+DIST_SOURCES = extend_dset.c h5watch.c h5watchgentest.c \
+	swmr_check_compat_vfd.c
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.sh.log=.log)
+SH_LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
+SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/testh5watch.sh.in \
+	$(top_srcdir)/bin/depcomp $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
+AMTAR = @AMTAR@
+
+# H5_CFLAGS holds flags that should be used when building hdf5,
+# but which should not be exported to h5cc for building other programs.
+# AM_CFLAGS is an automake construct which should be used by Makefiles 
+# instead of CFLAGS, as CFLAGS is reserved solely for the user to define.
+# This applies to FCFLAGS, CXXFLAGS, CPPFLAGS, and LDFLAGS as well.
+AM_CFLAGS = @AM_CFLAGS@ @H5_CFLAGS@
+
+# Include src and tools/lib directories
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@ -I$(top_srcdir)/src \
+	-I$(top_srcdir)/tools/lib -I$(top_srcdir)/hl/src
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+CLEARFILEBUF = @CLEARFILEBUF@
+CODESTACK = @CODESTACK@
+CONFIG_DATE = @CONFIG_DATE@
+CONFIG_MODE = @CONFIG_MODE@
+CONFIG_USER = @CONFIG_USER@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CXX_VERSION = @CXX_VERSION@
+CYGPATH_W = @CYGPATH_W@
+DEBUG_PKG = @DEBUG_PKG@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DIRECT_VFD = @DIRECT_VFD@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXTERNAL_FILTERS = @EXTERNAL_FILTERS@
+
+# Make sure that these variables are exported to the Makefiles
+F9XMODEXT = @F9XMODEXT@
+F9XMODFLAG = @F9XMODFLAG@
+F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FCLIBS = @FCLIBS@
+FC_VERSION = @FC_VERSION@
+FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
+FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
+GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
+H5_CFLAGS = @H5_CFLAGS@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_LDFLAGS = @H5_LDFLAGS@
+H5_VERSION = @H5_VERSION@
+HADDR_T = @HADDR_T@
+HAVE_DMALLOC = @HAVE_DMALLOC@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
+HAVE_PTHREAD = @HAVE_PTHREAD@
+HDF5_HL = @HDF5_HL@
+HDF5_INTERFACES = @HDF5_INTERFACES@
+HDF_CXX = @HDF_CXX@
+HDF_FORTRAN = @HDF_FORTRAN@
+HID_T = @HID_T@
+HL = @HL@
+HL_FOR = @HL_FOR@
+HSIZE_T = @HSIZE_T@
+HSSIZE_T = @HSSIZE_T@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTRUMENT = @INSTRUMENT@
+INSTRUMENT_LIBRARY = @INSTRUMENT_LIBRARY@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LL_PATH = @LL_PATH@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_STATIC_EXEC = @LT_STATIC_EXEC@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+ROOT = @ROOT@
+RUNPARALLEL = @RUNPARALLEL@
+RUNSERIAL = @RUNSERIAL@
+R_INTEGER = @R_INTEGER@
+R_LARGE = @R_LARGE@
+SEARCH = @SEARCH@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIZE_T = @SIZE_T@
+STATIC_EXEC = @STATIC_EXEC@
+STATIC_SHARED = @STATIC_SHARED@
+STRICT_FORMAT_CHECKS = @STRICT_FORMAT_CHECKS@
+STRIP = @STRIP@
+TESTPARALLEL = @TESTPARALLEL@
+THREADSAFE = @THREADSAFE@
+TIME = @TIME@
+TR = @TR@
+TRACE_API = @TRACE_API@
+UNAME_INFO = @UNAME_INFO@
+USE_FILTER_DEFLATE = @USE_FILTER_DEFLATE@
+USE_FILTER_SZIP = @USE_FILTER_SZIP@
+USINGMEMCHECKER = @USINGMEMCHECKER@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+
+# Install directories that automake doesn't know about
+docdir = $(exec_prefix)/doc
+dvidir = @dvidir@
+enable_shared = @enable_shared@
+enable_static = @enable_static@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# Shell commands used in Makefiles
+RM = rm -f
+CP = cp
+
+# Some machines need a command to run executables; this is that command
+# so that our tests will run.
+# We use RUNEXEC instead of RUNSERIAL directly because it may be that
+# some tests need to be run with a different command.  Older versions
+# of the makefiles used the command
+# $(LIBTOOL) --mode=execute
+# in some directories, for instance.
+RUNEXEC = $(RUNSERIAL)
+
+# Libraries to link to while building
+LIBHDF5 = $(top_builddir)/src/libhdf5.la
+LIBH5TEST = $(top_builddir)/test/libh5test.la
+LIBH5F = $(top_builddir)/fortran/src/libhdf5_fortran.la
+LIBH5FTEST = $(top_builddir)/fortran/test/libh5test_fortran.la
+LIBH5CPP = $(top_builddir)/c++/src/libhdf5_cpp.la
+LIBH5TOOLS = $(top_builddir)/tools/lib/libh5tools.la
+LIBH5_HL = $(top_builddir)/hl/src/libhdf5_hl.la
+LIBH5F_HL = $(top_builddir)/hl/fortran/src/libhdf5hl_fortran.la
+LIBH5CPP_HL = $(top_builddir)/hl/c++/src/libhdf5_hl_cpp.la
+
+# Note that in svn revision 19400 the '/' after DESTDIR in H5* variables below  
+# has been removed. According to the official description of DESTDIR by Gnu at 
+# http://www.gnu.org/prep/standards/html_node/DESTDIR.html, DESTDIR is 
+# prepended to the normal and complete install path that it precedes for the 
+# purpose of installing in a temporary directory which is useful for building 
+# rpms and other packages.  The '/' after ${DESTDIR} will be followed by another 
+# '/' at the beginning of the normal install path.  When DESTDIR is empty the  
+# path then begins with '//', which is incorrect and causes problems at least for 
+# Cygwin.   
+
+# Scripts used to build examples
+# If only shared libraries have been installed, have h5cc build examples with
+# shared libraries instead of static libraries
+H5CC = ${DESTDIR}$(bindir)/h5cc
+H5CC_PP = ${DESTDIR}$(bindir)/h5pcc
+H5FC = ${DESTDIR}$(bindir)/h5fc
+H5FC_PP = ${DESTDIR}$(bindir)/h5pfc
+H5CPP = ${DESTDIR}$(bindir)/h5c++
+ACLOCAL_AMFLAGS = "-I m4"
+
+# The trace script; this is used on source files from the C library to
+# insert tracing macros.
+TRACE = perl $(top_srcdir)/bin/trace
+
+# .chkexe files are used to mark tests that have run successfully.
+# .chklog files are output from those tests.
+# *.clog and *.clog2 are from the MPE option.
+#
+CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.h5
+
+# These are our main targets, the tools
+TEST_SCRIPT = testh5watch.sh
+check_SCRIPTS = $(TEST_SCRIPT)
+SCRIPT_DEPEND = swmr_check_compat_vfd$(EXEEXT) extend_dset$(EXEEXT) h5watch$(EXEEXT)
+
+# Add h5watch specific linker flags here
+h5watch_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# Programs all depend on the hdf5 library, the tools library, and the HL
+# library.
+LDADD = $(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5)
+DISTCLEANFILES = testh5watch.sh
+
+# Automake needs to be taught how to build lib, progs, and tests targets.
+# These will be filled in automatically for the most part (e.g.,
+# lib_LIBRARIES are built for lib target), but EXTRA_LIB, EXTRA_PROG, and
+# EXTRA_TEST variables are supplied to allow the user to force targets to
+# be built at certain times. 
+LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
+      $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
+
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+TEST_EXTENSIONS = .sh
+SH_LOG_COMPILER = $(SHELL)
+AM_SH_LOG_FLAGS = 
+TEST_PROG_CHKEXE = $(TEST_PROG:=.chkexe_)
+TEST_PROG_PARA_CHKEXE = $(TEST_PROG_PARA:=.chkexe_)
+TEST_SCRIPT_CHKSH = $(TEST_SCRIPT:=.chkexe_)
+TEST_SCRIPT_PARA_CHKSH = $(TEST_SCRIPT_PARA:=.chkexe_)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .log .o .obj .sh .sh$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign hl/tools/h5watch/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign hl/tools/h5watch/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+testh5watch.sh: $(top_builddir)/config.status $(srcdir)/testh5watch.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+clean-noinstPROGRAMS:
+	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+extend_dset$(EXEEXT): $(extend_dset_OBJECTS) $(extend_dset_DEPENDENCIES) $(EXTRA_extend_dset_DEPENDENCIES) 
+	@rm -f extend_dset$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(extend_dset_OBJECTS) $(extend_dset_LDADD) $(LIBS)
+
+h5watch$(EXEEXT): $(h5watch_OBJECTS) $(h5watch_DEPENDENCIES) $(EXTRA_h5watch_DEPENDENCIES) 
+	@rm -f h5watch$(EXEEXT)
+	$(AM_V_CCLD)$(h5watch_LINK) $(h5watch_OBJECTS) $(h5watch_LDADD) $(LIBS)
+
+h5watchgentest$(EXEEXT): $(h5watchgentest_OBJECTS) $(h5watchgentest_DEPENDENCIES) $(EXTRA_h5watchgentest_DEPENDENCIES) 
+	@rm -f h5watchgentest$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(h5watchgentest_OBJECTS) $(h5watchgentest_LDADD) $(LIBS)
+
+swmr_check_compat_vfd$(EXEEXT): $(swmr_check_compat_vfd_OBJECTS) $(swmr_check_compat_vfd_DEPENDENCIES) $(EXTRA_swmr_check_compat_vfd_DEPENDENCIES) 
+	@rm -f swmr_check_compat_vfd$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(swmr_check_compat_vfd_OBJECTS) $(swmr_check_compat_vfd_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/extend_dset.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5watch.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5watchgentest.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/swmr_check_compat_vfd.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	elif test -n "$$redo_logs"; then \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+recheck: all $(check_SCRIPTS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+.sh.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(SH_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_SH_LOG_DRIVER_FLAGS) $(SH_LOG_DRIVER_FLAGS) -- $(SH_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.sh$(EXEEXT).log:
+ at am__EXEEXT_TRUE@	@p='$<'; \
+ at am__EXEEXT_TRUE@	$(am__set_b); \
+ at am__EXEEXT_TRUE@	$(am__check_pre) $(SH_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_SH_LOG_DRIVER_FLAGS) $(SH_LOG_DRIVER_FLAGS) -- $(SH_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(PROGRAMS) all-local
+installdirs:
+	for dir in "$(DESTDIR)$(bindir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-generic clean-libtool \
+	clean-noinstPROGRAMS mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool mostlyclean-local
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am all-local check check-TESTS \
+	check-am clean clean-binPROGRAMS clean-generic clean-libtool \
+	clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-binPROGRAMS install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-pdf install-pdf-am \
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \
+	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am \
+	uninstall-binPROGRAMS
+
+.PRECIOUS: Makefile
+
+
+# List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
+# This tells the Makefiles that these targets are not files to be built but
+# commands that should be executed even if a file with the same name already
+# exists.
+.PHONY: build-check-clean build-check-p build-check-s build-lib build-progs \
+        build-tests check-clean check-install check-p check-s check-vfd \
+        install-doc lib progs tests uninstall-doc _exec_check-s _test help
+
+help:
+	@$(top_srcdir)/bin/makehelp
+
+# lib/progs/tests targets recurse into subdirectories. build-* targets
+# build files in this directory.
+build-lib: $(LIB)
+build-progs: $(LIB) $(PROGS)
+build-tests: $(LIB) $(PROGS) $(chk_TESTS)
+
+# General rule for recursive building targets.
+# BUILT_SOURCES contain targets that need to be built before anything else
+# in the directory (e.g., for Fortran type detection)
+lib progs tests check-s check-p :: $(BUILT_SOURCES)
+	@$(MAKE) $(AM_MAKEFLAGS) build-$@ || exit 1;
+	@for d in X $(SUBDIRS); do                                             \
+	    if test $$d != X && test $$d != .; then                           \
+	        (set -x; cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1;     \
+	    fi;                                                               \
+	done
+
+# General rule for recursive cleaning targets.  Like the rule above,
+# but doesn't require building BUILT_SOURCES.
+check-clean ::
+	@$(MAKE) $(AM_MAKEFLAGS) build-$@ || exit 1;
+	@for d in X $(SUBDIRS); do                                             \
+	    if test $$d != X && test $$d != .; then                           \
+	        (set -x; cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1;     \
+	    fi;                                                               \
+	done
+
+# Tell Automake to build tests when the user types `make all' (this is
+# not its default behavior).  Also build EXTRA_LIB and EXTRA_PROG since
+# Automake won't build them automatically, either.
+all-local: $(EXTRA_LIB) $(EXTRA_PROG) $(chk_TESTS)
+
+# make install-doc doesn't do anything outside of doc directory, but
+# Makefiles should recognize it.
+# UPDATE: docs no longer reside in this build tree, so this target
+# is depreciated.
+install-doc uninstall-doc:
+	@echo "Nothing to be done."
+
+# clean up files generated by tests so they can be re-run.
+build-check-clean:
+	$(RM) -rf $(CHECK_CLEANFILES)
+
+# run check-clean whenever mostlyclean is run
+mostlyclean-local: build-check-clean
+
+# check-install is just a synonym for installcheck
+check-install: installcheck
+
+# Run each test in order, passing $(TEST_FLAGS) to the program.
+# Since tests are done in a shell loop, "make -i" does apply inside it.
+# Set HDF5_Make_Ignore to a non-blank string to ignore errors inside the loop.
+# The timestamps give a rough idea how much time the tests use.
+#
+# Note that targets in chk_TESTS (defined above) will be built when the user
+# types 'make tests' or 'make check', but only programs in TEST_PROG,
+# TEST_PROG_PARA, or TEST_SCRIPT will actually be executed.
+check-TESTS: test
+
+test _test:
+	@$(MAKE) build-check-s
+	@$(MAKE) build-check-p
+
+# Actual execution of check-s.
+build-check-s: $(LIB) $(PROGS) $(chk_TESTS)
+	@if test -n "$(TEST_PROG)$(TEST_SCRIPT)"; then      \
+	   echo "===Serial tests in `echo ${PWD} | sed -e s:.*/::` begin `date`==="; \
+	fi
+	@$(MAKE) $(AM_MAKEFLAGS) _exec_check-s
+	@if test -n "$(TEST_PROG)$(TEST_SCRIPT)"; then      \
+	    echo "===Serial tests in `echo ${PWD} | sed -e s:.*/::` ended `date`===";\
+	fi
+
+_exec_check-s: $(TEST_PROG_CHKEXE) $(TEST_SCRIPT_CHKSH)
+
+# The dummy.chkexe here prevents the target from being
+# empty if there are no tests in the current directory.
+# $${log} is the log file.
+# $${tname} is the name of test.
+$(TEST_PROG_CHKEXE) $(TEST_PROG_PARA_CHKEXE) dummy.chkexe_:
+	@if test "X$@" != "X.chkexe_" && test "X$@" != "Xdummy.chkexe_"; then \
+	   tname=$(@:.chkexe_=)$(EXEEXT);\
+	   log=$(@:.chkexe_=.chklog); \
+	   echo "============================"; \
+	   if $(top_srcdir)/bin/newer $(@:.chkexe_=.chkexe) $${tname}; then \
+	      echo "No need to test $${tname} again."; \
+	   else \
+	      echo "============================" > $${log}; \
+	      if test "X$(FORTRAN_API)" = "Xyes"; then \
+	         echo "Fortran API: Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \
+	         echo "Fortran API: $(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      elif test "X$(CXX_API)" = "Xyes"; then \
+	         echo "C++ API: Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \
+	         echo "C++ API: $(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log};\
+	      else \
+	         echo "Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \
+	         echo "$(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      fi; \
+	      echo "============================" >> $${log}; \
+	      srcdir="$(srcdir)" \
+	         $(TIME) $(RUNEXEC) ./$${tname} $(TEST_FLAGS) >> $${log} 2>&1 \
+	         && touch $(@:.chkexe_=.chkexe) || \
+	         (test $$HDF5_Make_Ignore && echo "*** Error ignored") || \
+	         (cat $${log} && false) || exit 1; \
+	      echo "" >> $${log}; \
+	      echo "Finished testing $${tname} $(TEST_FLAGS)" >> $${log}; \
+	      echo "============================" >> $${log}; \
+	      echo "Finished testing $${tname} $(TEST_FLAGS)"; \
+	      cat $${log}; \
+	   fi; \
+	fi
+
+# The dummysh.chkexe here prevents the target from being
+# empty if there are no tests in the current directory.
+# $${log} is the log file.
+# $${tname} is the name of test.
+$(TEST_SCRIPT_CHKSH) $(TEST_SCRIPT_PARA_CHKSH) dummysh.chkexe_:
+	@if test "X$@" != "X.chkexe_" && test "X$@" != "Xdummysh.chkexe_"; then \
+	   cmd=$(@:.chkexe_=);\
+	   tname=`basename $$cmd`;\
+	   chkname=`basename $(@:.chkexe_=.chkexe)`;\
+	   log=`basename $(@:.chkexe_=.chklog)`; \
+	   echo "============================"; \
+	   if $(top_srcdir)/bin/newer $${chkname} $$cmd $(SCRIPT_DEPEND); then \
+	      echo "No need to test $${tname} again."; \
+	   else \
+	      echo "============================" > $${log}; \
+	      if test "X$(FORTRAN_API)" = "Xyes"; then \
+	         echo "Fortran API: Testing $${tname} $(TEST_FLAGS)"; \
+	         echo "Fortran API: $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      elif test "X$(CXX_API)" = "Xyes"; then \
+	         echo "C++ API: Testing $${tname} $(TEST_FLAGS)"; \
+	         echo "C++ API: $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      else \
+	         echo "Testing $${tname} $(TEST_FLAGS)"; \
+	         echo "$${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      fi; \
+	      echo "============================" >> $${log}; \
+	      RUNSERIAL="$(RUNSERIAL)" RUNPARALLEL="$(RUNPARALLEL)"           \
+	      srcdir="$(srcdir)" \
+	         $(TIME) $(SHELL) $$cmd $(TEST_FLAGS) >> $${log} 2>&1 \
+	         && touch $${chkname} || \
+	         (test $$HDF5_Make_Ignore && echo "*** Error ignored") || \
+	         (cat $${log} && false) || exit 1; \
+	      echo "" >> $${log}; \
+	      echo "Finished testing $${tname} $(TEST_FLAGS)" >> $${log}; \
+	      echo "============================" >> $${log}; \
+	      echo "Finished testing $${tname} $(TEST_FLAGS)"; \
+	      cat $${log}; \
+	   fi; \
+	   echo "============================"; \
+	fi
+
+# Actual execution of check-p.
+build-check-p: $(LIB) $(PROGS) $(chk_TESTS)
+	@if test -n "$(TEST_PROG_PARA)$(TEST_SCRIPT_PARA)"; then      \
+	   echo "===Parallel tests in `echo ${PWD} | sed -e s:.*/::` begin `date`==="; \
+	fi
+	@if test -n "$(TEST_PROG_PARA)"; then                                \
+	    echo "**** Hint ****";                                            \
+	    echo "Parallel test files reside in the current directory"        \
+	         "by default.";                                               \
+	    echo "Set HDF5_PARAPREFIX to use another directory. E.g.,";       \
+	    echo "    HDF5_PARAPREFIX=/PFS/user/me";                          \
+	    echo "    export HDF5_PARAPREFIX";                                \
+	    echo "    make check";                                            \
+	    echo "**** end of Hint ****";                                     \
+	fi
+	@for test in $(TEST_PROG_PARA) dummy; do                             \
+	   if test $$test != dummy; then                                      \
+	      $(MAKE) $(AM_MAKEFLAGS) $$test.chkexe_ \
+	      RUNEXEC="$(RUNPARALLEL)" || exit 1; \
+	   fi;                                                                \
+	done
+	@for test in $(TEST_SCRIPT_PARA) dummy; do                           \
+	  if test $$test != dummy; then                                      \
+	    $(MAKE) $(AM_MAKEFLAGS) $$test.chkexe_ || exit 1; \
+	  fi;                                                                 \
+	done
+	@if test -n "$(TEST_PROG_PARA)$(TEST_SCRIPT_PARA)"; then      \
+	    echo "===Parallel tests in `echo ${PWD} | sed -e s:.*/::` ended `date`===";\
+	fi
+
+# Run test with different Virtual File Driver
+check-vfd: $(LIB) $(PROGS) $(chk_TESTS)
+	@for vfd in $(VFD_LIST) dummy; do                                     \
+	    if test $$vfd != dummy; then                                      \
+	        echo "============================";                          \
+	        echo "Testing Virtual File Driver $$vfd";                     \
+	        echo "============================";                          \
+	        $(MAKE) $(AM_MAKEFLAGS) check-clean || exit 1;                \
+	        HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1;    \
+	    fi;                                                               \
+	done
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/hl/tools/h5watch/extend_dset.c b/hl/tools/h5watch/extend_dset.c
new file mode 100644
index 0000000..7efdd3b
--- /dev/null
+++ b/hl/tools/h5watch/extend_dset.c
@@ -0,0 +1,489 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "H5HLprivate2.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <time.h>
+
+/*
+ * Extending datasets in WATCH.h5 generated by h5watchgentest.c
+ */
+#define DSET_ONE "DSET_ONE"
+#define DSET_TWO "DSET_TWO"
+#define DSET_CMPD "DSET_CMPD"
+#define DSET_CMPD_ESC "DSET_CMPD_ESC"
+#define DSET_CMPD_TWO "DSET_CMPD_TWO"
+#define DSET_ALLOC_LATE "DSET_ALLOC_LATE"
+#define DSET_ALLOC_EARLY "DSET_ALLOC_EARLY"
+
+/* The message sent by this process (extend_dset) to the test script to start "h5watch" */
+#define WRITER_MESSAGE  "writer_message"
+/* The message received from the test script to start extending dataset */
+#define READER_MESSAGE  "reader_message"
+/* Message timeout in seconds */
+#define MESSAGE_TIMEOUT 300
+
+/* Size of data buffer */
+#define TEST_BUF_SIZE 100
+
+/* 
+ * Test variations (incremental) for one-dimensional dataset:
+ * 	Varies from 10->13->12->12->1->3
+ */
+#define ONE_NTESTS	5
+int one_tests[ONE_NTESTS] = {3, -1, 0, -11, 2};
+
+/* 
+ * Test variations (incremental) for two-dimensional dataset:
+ *	Varies from {4,10}->{6,12}->{8,1}->{10,1}->
+ *	       	      	    {3,3}->{2,2}->{1,2}->
+ *		            {1,4}->{1,3}->{1,3}
+ */
+#define TWO_NTESTS  9
+int two_tests[TWO_NTESTS][2] = { {2, 2}, {2, -11}, {2, 0},
+                                 {-7, 2}, {-1, -1}, {-1, 0},
+                                 {0, 2}, {0, -1}, {0, 0}   
+			       };
+
+static int extend_dset_two(const char *file, char *dname);
+static int extend_dset_one(const char *file, char *dname);
+void send_message(const char *file);
+static int wait_message(const char *file);
+
+
+/* Data structures for datasets with compound data type */
+typedef struct sub22_t {
+    unsigned int a;
+    unsigned int b;
+    unsigned int c;
+} sub22_t;
+
+typedef struct sub2_t {
+    unsigned int a;
+    sub22_t b;
+    unsigned int c;
+} sub2_t;
+
+typedef struct sub4_t {
+    unsigned int a;
+    unsigned int b;
+} sub4_t;
+
+typedef struct set_t {
+    unsigned int field1;
+    sub2_t field2;
+    double field3;
+    sub4_t field4;
+} set_t;
+
+/*
+ * To send a message by creating the file.
+ */
+void
+send_message(const char *file)
+{
+    FILE *id;
+
+    id = fopen(file, "w+");
+    fclose(id);
+} /* send_message() */
+
+/*
+ *
+ * Repeatedly check for the message file.
+ * It will stop when the file exists or exceeds the timeout limit.
+ */
+static int
+wait_message(const char *file)
+{
+    FILE *id;           /* File pointer */
+    time_t t0, t1;      /* Time info */
+
+    /* Start timer */
+    time(&t0);
+
+    /* Wait for message from test script to start work */
+    while((id = fopen(file, "r")) == NULL) {
+        /* Get current time */
+        time(&t1);
+        /*
+         * Determine time difference--
+         *   if waiting too long for the message, then it is
+         *   unlikely the message will get sent, then fail rather
+         *   than loop forever.
+         */
+        if(difftime(t1, t0) > MESSAGE_TIMEOUT)
+            goto done;
+    }
+
+    fclose(id);
+    unlink(file);
+    return(SUCCEED);
+
+done:
+    return(FAIL);
+} /* wait_message() */
+
+/*
+ ***********************************************************************
+ *
+ * Extending a two-dimensional dataset:
+ *		  	dims[0]         dims[1]
+ *                      -------         -------
+ *      case #1:        increase        increase
+ *      case #2:        increase        decrease
+ *      case #3:        increase        same
+ *      case #4:        decrease        increase
+ *      case #5:        decrease        decrease        (no action)
+ *      case #6:        decrease        same            (no action)
+ *      case #7:        same            increase
+ *      case #8:        same            decrease        (no action)
+ *      case #9:        same            same            (no action)
+ *
+ *	two_tests[TWO_NTESTS][2] = { {2,2}, {2,-11}, {2,0},
+ *                                   {-7,2}, {-1,-1}, {-1,0},
+ *                                   {0,2}, {0,-1}, {0,0} }
+ *	varies from {4,10}->{6,12}->{8,1}->{10,1}->
+ *	       	      	    {3,3}->{2,2}->{1,2}->
+ *		            {1,4}->{1,3}->{1,3}
+ ***********************************************************************
+ */
+static int
+extend_dset_two(const char *file, char *dname)
+{
+    hid_t fid = -1;		/* file id */
+    hid_t fapl = -1;		/* file access property list id */
+    hid_t did = -1; 		/* dataset id */
+    hid_t sid = -1; 		/* dataspace id */
+    hid_t dtid = -1;		/* dataset's datatype id */
+    int ndims;		/* # of dimension sizes */
+    unsigned i, j;	/* local index variable */
+    hsize_t ext_dims[2];	/* new dimension sizes after extension */
+    hsize_t cur_dims[2];	/* current dimension sizes */
+    size_t dtype_size;	/* size of the dataset's datatype */
+    unsigned num_elmts; /* number of elements in the dataset */
+    int ibuf[TEST_BUF_SIZE];   	/* buffer for storing retrieved elements (integer) */
+    set_t cbuf[TEST_BUF_SIZE];	/* buffer for storing retrieved elemnets (compound) */
+
+    /* Create a copy of file access property list */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        return -1;
+
+    /* Set to use the latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        return -1;
+
+    /* Open the file and dataset with SWMR write */
+    if((fid = H5Fopen(file, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl)) < 0)
+	goto done;
+
+    if((did = H5Dopen2(fid, dname, H5P_DEFAULT)) < 0)
+	goto done;
+
+    /* Send message to the test script to start "h5watch" */
+    send_message(WRITER_MESSAGE);
+
+    if((sid = H5Dget_space(did)) < 0)
+	goto done;
+
+    if((ndims = H5Sget_simple_extent_ndims(sid)) < 0)
+	goto done;
+
+    /* Get the size of the dataset's datatype */
+    if((dtype_size = H5LDget_dset_type_size(did, NULL)) == 0)
+	goto done;
+
+    /* Get the dataset's data type */
+    if((dtid = H5Tget_native_type(H5Dget_type(did), H5T_DIR_DEFAULT)) < 0)
+	goto done;
+
+    /* Wait for message from the test script to start extending dataset */
+    if(wait_message(READER_MESSAGE) < 0)
+        goto done;
+
+    /* Loop through different variations of extending the dataset */
+    for(i = 0; i < TWO_NTESTS; i++) {
+
+	/* sleep to emulate about 2 seconds of application operation */
+	sleep(2);
+
+	/* Get current dimension sizes */ 
+        if(H5LDget_dset_dims(did, cur_dims) < 0)
+	    goto done;
+
+	/* Set up the new extended dimension sizes  */
+        ext_dims[0] = cur_dims[0] + (hsize_t)two_tests[i][0];
+        ext_dims[1] = cur_dims[1] + (hsize_t)two_tests[i][1];
+
+	/* Extend the dataset */
+	if(H5Dset_extent(did, ext_dims) < 0)
+	    goto done;
+
+	num_elmts = 1;
+	for(j = 0; j < (unsigned)ndims; j++)
+	    num_elmts *= (unsigned)ext_dims[j];
+	
+	/* Compound type */
+	if(!HDstrcmp(dname, DSET_CMPD_TWO)) {
+
+	    HDmemset(cbuf, 0, sizeof(cbuf));
+	    for(j = 0; j < num_elmts; j++) {
+		cbuf[j].field1 = i + 1;
+		cbuf[j].field2.a = i + 1;
+		cbuf[j].field2.c = i + 1;
+		cbuf[j].field2.b.a = i + 1;
+		cbuf[j].field2.b.b = i + 1;
+		cbuf[j].field2.b.c = i + 1;
+		cbuf[j].field3 = i + 1;
+		cbuf[j].field4.a = i + 1;
+		cbuf[j].field4.b = i + 1;
+	    }
+
+	    /* Write to the dataset */
+	    if(H5Dwrite(did, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, cbuf) < 0)
+		goto done;
+	} else { /* Integer type */
+	    HDmemset(ibuf, 0, sizeof(ibuf));
+	    for(j = 0; j < num_elmts; j++)
+		ibuf[j] = (int)(i + 1);
+
+	    /* Write to the dataset */
+	    if(H5Dwrite(did, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, ibuf) < 0)
+		goto done;
+	}
+
+	if(H5Dflush(did) < 0)
+	    goto done;
+
+    } /* end for TWO_NTESTS */
+
+    /* Closing */
+    if(H5Tclose(dtid) < 0) goto done;
+    if(H5Dclose(did) < 0) goto done;
+    if(H5Pclose(fapl) < 0) goto done;
+    if(H5Fclose(fid) < 0) goto done;
+
+    return(SUCCEED);
+
+done:
+    H5E_BEGIN_TRY
+        H5Tclose(dtid);
+        H5Dclose(did);
+	H5Pclose(fapl);
+	H5Fclose(fid);
+    H5E_END_TRY
+
+    return(FAIL);
+
+} /* extend_dset_two() */
+
+/*
+ ***********************************************************************
+ *
+ * Extending a one-dimensional dataset
+ *	Test cases: 
+ *		#1: increase 
+ *		#2: decrease
+ *		#3: same
+ *		#4: decrease
+ *		#5: increase
+ *
+ * 	one_tests[ONE_NTESTS] = {3, -1, 0, -11, 2}
+ * 	varies from 10->13->12->12->1->3
+ *
+ ***********************************************************************
+ */
+static int
+extend_dset_one(const char *file, char *dname)
+{
+    hid_t fid = -1;	/* file id */
+    hid_t fapl = -1;	/* file access property list id */
+    hid_t did = -1; 		/* dataset id */
+    hid_t dtid = -1;		/* dataset's datatype id */
+    hid_t sid = -1;		/* dataspace id */
+    hid_t mid = -1;		/* memory space id */
+    unsigned i, j;	/* local index variable */
+    int ibuf[TEST_BUF_SIZE];   	/* buffer for storing retrieved elements (integer) */
+    set_t cbuf[TEST_BUF_SIZE];	/* buffer for storing retrieved elemnets (compound) */
+    hsize_t cur_dims[1];	/* current dimension sizes */
+    hsize_t ext_dims[1];	/* new dimension sizes after extension */
+    hsize_t offset[1];	/* starting offsets of appended data */
+    hsize_t count[1];	/* dimension sizes of appended data */
+    size_t dtype_size;	/* size of the dataset's datatype */
+
+    /* Create a copy of file access property list */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        return -1;
+    /* Set to use the latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        return -1;
+
+    /* Open the file and dataset with SWMR write */
+    if((fid = H5Fopen(file, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl)) < 0)
+	goto done;
+
+    /* Send message to the test script to start "h5watch" */
+    send_message(WRITER_MESSAGE);
+
+    if((did = H5Dopen2(fid, dname, H5P_DEFAULT)) < 0)
+	goto done;
+
+    /* Get size of the dataset's datatype */
+    if((dtype_size = H5LDget_dset_type_size(did, NULL)) == 0)
+	goto done;
+
+    /* Get dataset's datatype */
+    if((dtid = H5Tget_native_type(H5Dget_type(did), H5T_DIR_DEFAULT)) < 0)
+	goto done;
+
+    /* Wait for message from the test script to start extending dataset */
+    wait_message(READER_MESSAGE);
+
+    /* Loop through different variations of extending the dataset */
+    for(i = 0; i < ONE_NTESTS; i++) {
+
+	/* sleep to emulate about 2 seconds of application operation */
+	sleep(2);
+
+	/* Get current dimension sizes */
+	if(H5LDget_dset_dims(did, cur_dims) < 0)
+	    goto done;
+
+	/* Set up the new extended dimension sizes  */
+	ext_dims[0] = cur_dims[0] + (hsize_t)one_tests[i];
+
+	/* Extend the dataset */
+	if(H5Dset_extent(did, ext_dims) < 0)
+	    goto done;
+
+	/* Write to the new appended region of the dataset */
+	if(one_tests[i] > 0) {
+
+	    /* Select the extended region */
+	    offset[0] = cur_dims[0];
+	    count[0] = (hsize_t)one_tests[i];
+	    if((sid = H5Dget_space(did)) < 0)
+		goto done;
+	    if(H5Sselect_hyperslab(sid, H5S_SELECT_SET, offset, NULL, count, NULL) < 0)
+		goto done;
+
+	    /* Set up memory space and get dataset's datatype */
+	    if((mid = H5Screate_simple(1, count, NULL)) < 0)
+		goto done;
+
+	    /* Initialize data for the extended region of the dataset */
+	    /* Compound type */
+	    if(!HDstrcmp(dname, DSET_CMPD) || !HDstrcmp(dname, DSET_CMPD_ESC)) {
+		HDmemset(cbuf, 0, sizeof(cbuf));
+		for(j = 0; j < (unsigned)one_tests[i]; j++) {
+		    cbuf[j].field1 = j + 1;
+		    cbuf[j].field2.a = j + 2;
+		    cbuf[j].field2.b.a = j + 2;
+		    cbuf[j].field2.b.b = j + 2;
+		    cbuf[j].field2.b.c = j + 2;
+		    cbuf[j].field2.c = j + 2;
+
+		    cbuf[j].field3 = j + 3;
+
+		    cbuf[j].field4.a = j + 4;
+		    cbuf[j].field4.b = j + 4;
+		} /* end for */
+
+		/* Write to the extended region of the dataset */
+		if(H5Dwrite(did, dtid, mid, sid, H5P_DEFAULT, cbuf) < 0)
+		    goto done;
+	    } else { /* Integer type */
+		for(j = 0; j < (unsigned)one_tests[i]; j++)
+		    ibuf[j] = (int)j;
+
+		/* Write to the extended region of the dataset */
+		if(H5Dwrite(did, dtid, mid, sid, H5P_DEFAULT, ibuf) < 0)
+		    goto done;
+	    }
+
+	    /* Closing */
+	    if(H5Sclose(sid) < 0) goto done;
+	    if(H5Sclose(mid) < 0) goto done;
+	} /* end if */
+
+	if(H5Dflush(did) < 0)
+	    goto done;
+
+    } /* end for ONE_NTESTS */
+
+    /* Closing */
+    if(H5Tclose(dtid) < 0) goto done;
+    if(H5Dclose(did) < 0) goto done;
+    if(H5Pclose(fapl) < 0) goto done;
+    if(H5Fclose(fid) < 0) goto done;
+
+    return(SUCCEED);
+
+done:
+    H5E_BEGIN_TRY
+	H5Sclose(sid);
+	H5Sclose(mid);
+        H5Tclose(dtid);
+        H5Dclose(did);
+	H5Pclose(fapl);
+	H5Fclose(fid);
+    H5E_END_TRY
+
+    return(FAIL);
+} /* extend_dset_one() */
+
+/* Usage: extend_dset xx.h5 dname */
+int
+main(int argc, const char *argv[])
+{
+    char *dname = NULL;
+    char *fname = NULL;
+
+    if(argc != 3) {
+	fprintf(stderr, "Should have file name and dataset name to be extended...\n");
+	goto done;
+    }
+
+    /* Get the dataset name to be extended */
+    fname = strdup(argv[1]);
+    dname = strdup(argv[2]);
+
+    if(!HDstrcmp(dname, DSET_CMPD) || !HDstrcmp(dname, DSET_CMPD_ESC)) {
+	if(extend_dset_one(fname, dname) < 0) 
+	    goto done;
+    } else if(!HDstrcmp(dname, DSET_ONE) || 
+	    !HDstrcmp(dname, DSET_ALLOC_LATE) || 
+	    !HDstrcmp(dname, DSET_ALLOC_EARLY)) {
+	if(extend_dset_one(fname, dname) < 0) 
+	    goto done;
+    } else if(!HDstrcmp(dname, DSET_TWO) || !HDstrcmp(dname, DSET_CMPD_TWO)) {
+	if(extend_dset_two(fname, dname) < 0) 
+	    goto done;
+    } else {
+	fprintf(stdout, "Dataset cannot be extended...\n");
+	goto done;
+    }
+    exit(EXIT_SUCCESS);
+
+done:
+    if(dname) HDfree(dname);
+    if(fname) HDfree(fname);
+    exit(EXIT_FAILURE);
+} /* main() */
diff --git a/hl/tools/h5watch/h5watch.c b/hl/tools/h5watch/h5watch.c
new file mode 100644
index 0000000..643b4e7
--- /dev/null
+++ b/hl/tools/h5watch/h5watch.c
@@ -0,0 +1,977 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <string.h>
+#include <unistd.h>
+#include <float.h>
+
+#include "h5tools.h"
+#include "h5tools_dump.h"
+#include "H5LDprivate.h"
+
+/*
+ * Note: This tool used private routine
+ */
+#define PROGRAMNAME "h5watch"	/* Name of tool */
+#define FIELD_SEP	","	/* nested field separator */
+#define DEFAULT_RETRY 	50	/* number of times to try opening the file */
+
+
+/*
+ * Note:(see comments in hl/src/H5LDprivate.h)
+ *	This tool uses private routines H5LD_construct_vector()and H5LD_clean_vector()
+ *	This tool uses H5LD_memb_t data structure declared in H5LDprivate.h
+ */
+
+const char  *progname = "h5watch";	/* tool name */
+static char *g_list_of_fields = NULL; 	/* command line input for "list_of_fields" */
+static char *g_dup_fields = NULL; 	/* copy of "list_of_fields" */
+static H5LD_memb_t **g_listv = NULL;   	/* vector info for "list_of_fields" */
+
+static hbool_t g_monitor_size_only = FALSE; /* monitor changes in dataset dimension sizes */
+static unsigned g_polling_interval = 1;	    /* polling interval to check appended data */
+static hbool_t g_label = FALSE;             /* label compound values */
+static int g_display_width = 80;	    /* output width in characters */
+static hbool_t g_simple_output = FALSE;     /* make output more machine-readable */
+static unsigned g_retry = DEFAULT_RETRY;    /* # of times to try opening the file if somehow file is unstable */
+static hbool_t g_display_hex = FALSE;	    /* display data in hexadecimal format : LATER */
+
+static herr_t doprint(hid_t did, hsize_t *start, hsize_t *block, int rank);
+static herr_t slicendump(hid_t did, hsize_t *prev_dims, hsize_t *cur_dims,
+  hsize_t *start, hsize_t *block, int rank, int subrank);
+static herr_t monitor_dataset(hid_t fid, char *dsetname);
+static herr_t process_cmpd_fields(hid_t fid, char *dsetname);
+static herr_t check_dataset(hid_t fid, char *dsetname);
+static void leave(int ret);
+static void usage(const char *prog);
+static void parse_command_line(int argc, const char *argv[]);
+
+
+/*
+ * Command-line options: The user can only specify long-named parameters.
+ * The long-named ones can be partially spelled. When
+ * adding more, make sure that they don't clash with each other.
+ */
+static const char *s_opts ="?";
+static struct long_options l_opts[] = {
+    { "help", no_arg, 'h' },
+    { "hel", no_arg, 'h' },
+    { "dim", no_arg, 'd' },
+    { "di", no_arg, 'd' },
+    { "label", no_arg, 'l' },
+    { "labe", no_arg, 'l' },
+    { "lab", no_arg, 'l' },
+    { "la", no_arg, 'l' },
+    { "simple", no_arg, 'S' },
+    { "simpl", no_arg, 'S' },
+    { "simp", no_arg, 'S' },
+    { "sim", no_arg, 'S' },
+    { "si", no_arg, 'S' },
+    { "hexdump", no_arg, 'x' },
+    { "hexdum", no_arg, 'x' },
+    { "hexdu", no_arg, 'x' },
+    { "hexd", no_arg, 'x' },
+    { "hex", no_arg, 'x' },
+    { "width", require_arg, 'w' },
+    { "widt", require_arg, 'w' },
+    { "wid", require_arg, 'w' },
+    { "wi", require_arg, 'w' },
+    { "polling", require_arg, 'p' },
+    { "pollin", require_arg, 'p' },
+    { "polli", require_arg, 'p' },
+    { "poll", require_arg, 'p' },
+    { "pol", require_arg, 'p' },
+    { "po", require_arg, 'p' },
+    { "fields", require_arg, 'f' },
+    { "field", require_arg, 'f' },
+    { "fiel", require_arg, 'f' },
+    { "fie", require_arg, 'f' },
+    { "fi", require_arg, 'f' },
+    { "version", no_arg, 'V' },
+    { "versio", no_arg, 'V' },
+    { "versi", no_arg, 'V' },
+    { "vers", no_arg, 'V' },
+    { "ver", no_arg, 'V' },
+    { "ve", no_arg, 'V' },
+    { NULL, 0, '\0' }
+};
+
+/*-------------------------------------------------------------------------
+ * Function: doprint()
+ *
+ * Purpose: Prepare to print the dataset's appended data.
+ *	    Call the tools library routine h5tools_dump_dset() to do the printing.
+ *	    (This routine is mostly copied from dump_dataset_values() in tools/h5ls/h5ls.c 
+ *	    and modified accordingly).
+ *
+ * Return: 0 on success; negative on failure
+ *
+ * Programmer: Vailin Choi; August 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+doprint(hid_t did, hsize_t *start, hsize_t *block, int rank)
+{
+    h5tools_context_t   ctx;  	/* print context  */
+    h5tool_format_t  info;	/* Format info for the tools library */
+    static char fmt_double[16], fmt_float[16];	/* Format info */
+    struct subset_t subset;	/* Subsetting info */
+    hsize_t ss_start[H5S_MAX_RANK];	/* Info for hyperslab */
+    hsize_t ss_stride[H5S_MAX_RANK];	/* Info for hyperslab */
+    hsize_t ss_block[H5S_MAX_RANK];	/* Info for hyperslab */
+    hsize_t ss_count[H5S_MAX_RANK];	/* Info for hyperslab */
+    int i;			/* Local index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    /* Subsetting information for the tools library printing routines */
+    subset.start.data = ss_start;
+    subset.stride.data = ss_stride;
+    subset.block.data = ss_block;
+    subset.count.data = ss_count;
+
+    /* Initialize subsetting information */
+    for(i = 0; i < rank; i++) {
+	subset.stride.data[i] = 1;
+	subset.count.data[i] = 1;
+	subset.start.data[i] = start[i];
+	subset.block.data[i] = block[i];
+    }
+
+    HDmemset(&ctx, 0, sizeof(ctx));
+
+    /* Set to all default values and then override */
+    HDmemset(&info, 0, sizeof info);
+
+    if(g_simple_output) {
+        info.idx_fmt = "";
+        info.line_ncols = 65535; /*something big*/
+        info.line_per_line = 1;
+        info.line_multi_new = 0;
+        info.line_pre  = "        ";
+        info.line_cont = "         ";
+
+        info.arr_pre = "";
+        info.arr_suf = "";
+        info.arr_sep = " ";
+
+        info.cmpd_pre = "";
+        info.cmpd_suf = "";
+        info.cmpd_sep = " ";
+
+	/* The "fields" selected by the user */
+	info.cmpd_listv = (const struct H5LD_memb_t **)g_listv;
+
+        if(g_label) info.cmpd_name = "%s=";
+
+        info.elmt_suf1 = " ";
+        info.str_locale = ESCAPE_HTML;
+
+    } else {
+        info.idx_fmt = "(%s)";
+        if(!g_display_width) {
+            info.line_ncols = 65535;
+            info.line_per_line = 1;
+        }
+        else
+            info.line_ncols = (unsigned)g_display_width;
+
+        info.line_multi_new = 1;
+
+	/* The "fields" selected by the user */
+	info.cmpd_listv = (const struct H5LD_memb_t **)g_listv;
+        if(g_label) info.cmpd_name = "%s=";
+        info.line_pre  = "        %s ";
+        info.line_cont = "        %s  ";
+        info.str_repeat = 8;
+    }
+
+    /* Floating point types should display full precision */
+    sprintf(fmt_float, "%%1.%dg", FLT_DIG);
+    info.fmt_float = fmt_float;
+    sprintf(fmt_double, "%%1.%dg", DBL_DIG);
+    info.fmt_double = fmt_double;
+
+    info.dset_format =  "DSET-%s ";
+    info.dset_hidefileno = 0;
+
+    info.obj_format = "-%lu:"H5_PRINTF_HADDR_FMT;
+    info.obj_hidefileno = 0;
+
+    info.dset_blockformat_pre = "%sBlk%lu: ";
+    info.dset_ptformat_pre = "%sPt%lu: ";
+
+    info.line_indent = "";
+
+    if(g_display_hex) {
+        /* Print all data in hexadecimal format if the `-x' or `--hexdump'
+         * command line switch was given. */
+        info.raw = TRUE;
+    } 
+
+    /* Print the values. */
+    if((ret_value = h5tools_dump_dset(stdout, &info, &ctx, did, &subset)) < 0)
+	error_msg("unable to print data\n");
+
+    HDfprintf(stdout, "\n");
+
+    return(ret_value);
+
+} /* doprint() */
+
+/*-------------------------------------------------------------------------
+ * Function: slicendump
+ *
+ * Purpose:  To dump the slice for each dimension
+ *	     For example: prev_dims[2] = {5, 4}; cur_dims[2] = {7, 8}
+ *		This routine will dump data as follows:
+ *		{0, 3} to {0, 7} (1x4 elements)
+ *		{1, 3} to {0, 7} (1x4 elements)
+ *		{2, 3} to {0, 7} (1x4 elements)
+ *		{3, 3} to {0, 7} (1x4 elements)
+ *		{4, 3} to {0, 7} (1x4 elements)
+ *		{5, 0} to {6, 7} (2x8 elements)
+ *
+ * Return:   Non-negative on success
+ *	     Negative on failure
+ *
+ * Programmer:  Vailin Choi; August 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+slicendump(hid_t did, hsize_t *prev_dims, hsize_t *cur_dims, hsize_t *start, hsize_t *block, int rank, int subrank)
+{
+    int i;	/* Local index variable */
+    int ind; 	/* Index for the current rank */
+    herr_t ret_value = SUCCEED;	/* Return value */
+    
+    ind = rank - subrank;
+
+    if((subrank - 1) > 0) {
+	/* continue onto the next dimension */
+	for (i = 0; i < (hssize_t)MIN(prev_dims[ind], cur_dims[ind]); i++){
+	    start[ind] = (hsize_t)i;
+	    if((ret_value = slicendump(did, prev_dims, cur_dims, start, block, rank, subrank-1)) < 0)
+		goto done;
+	}
+    }
+
+    /* this dimension remains the same or shrinking */
+    if(cur_dims[ind] <= prev_dims[ind])
+	goto done;
+
+    /* select first the slice for the faster changing dimension */
+    /* select later the whole slice for the slower changing dimension */
+    start[ind] = prev_dims[ind];
+    block[ind] = cur_dims[ind] - prev_dims[ind];
+
+    for(i = ind + 1; i < rank; i++){
+        start[i] = 0;
+        block[i] = cur_dims[i];
+    }
+
+    /* Print the appended data */
+    ret_value = doprint(did, start, block, rank);
+
+done:
+    return(ret_value);
+} /* slicendump() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    monitor_dataset
+ *
+ * Purpose:     To poll a dataset periodically for changes in dimension sizes.
+ *		For dataset with unchanged and/or decreased dimension sizes:
+ *		  it just prints the dimension size changes
+ *		For dataset with increase in at least one of its dimension sizes:
+ *		  it will print the new appended data to the dataset
+ *
+ * Return:      Non-negative on success: dataset can be monitored
+ *		Negative on failure: dataset cannot be monitored
+ *
+ * Programmer:  Vailin Choi; August 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+monitor_dataset(hid_t fid, char *dsetname)
+{
+    hid_t did;		/* dataset id */
+    hid_t sid;		/* dataspace id */
+    int	ndims;		/* # of dimensions in the dataspace */
+    int i, u;		/* local index variable */
+    hsize_t prev_dims[H5S_MAX_RANK];	/* current dataspace dimensions */
+    hsize_t cur_dims[H5S_MAX_RANK];	/* previous dataspace dimensions */
+    herr_t ret_value = SUCCEED;	/* return value */
+
+    HDfprintf(stdout, "Monitoring dataset %s...\n", dsetname);
+
+    /* Open the dataset for minitoring */
+    if((did = H5Dopen2(fid, dsetname, H5P_DEFAULT)) < 0) {
+	error_msg("error in opening dataset \"%s\"\n", dsetname);
+	ret_value = FAIL;
+	goto done;
+    }				
+    if((sid = H5Dget_space(did)) < 0) {
+	error_msg("error in getting dataspace id for dataset \"%s\"\n", dsetname);
+	ret_value = FAIL;
+	goto done;
+    }
+
+    /* Get the dataset's dimension sizes */
+    if((ndims = H5Sget_simple_extent_dims(sid, prev_dims, NULL)) < 0) {
+	error_msg("unable to get dimensions sizes for \"%s\"\n", dsetname);
+	ret_value = FAIL;
+	goto done;
+    }
+
+    while(1) {
+
+	/* Refreshes the dataset */
+	if(H5Drefresh(did) < 0) {
+	    ret_value = FAIL;
+	    goto done;
+	}
+
+	/* Get the dataset's current dimension sizes */
+	if(H5LDget_dset_dims(did, cur_dims) < 0) {
+	    error_msg("unable to get dimension sizes for \"%s\"\n", dsetname);
+	    ret_value = FAIL;
+	    goto done;
+	}
+
+	/* Check the dimension sizes */
+	for(i = 0; i < ndims; i++)
+	    if(cur_dims[i] != prev_dims[i])
+		break;
+
+	/* at least one dimension has changed */
+	if(i != ndims) {
+	    /* Printing changes in dimension sizes */
+	    for(u = 0; u < ndims; u++) {
+		HDfprintf(stdout, "dimension %u: %Hu->%Hu", (unsigned)u, prev_dims[u], cur_dims[u]);
+		if(cur_dims[u] > prev_dims[u])
+		    HDfprintf(stdout, " (increases)\n");
+		else if(cur_dims[u] < prev_dims[u])
+		    HDfprintf(stdout, " (decreases)\n");
+		else
+		    HDfprintf(stdout, " (unchanged)\n");
+	    }
+
+	    /* Printing elements appended to the dataset if there is */
+	    if(!g_monitor_size_only) {
+
+		/* See if at least one dimension size has increased */
+		for(u = 0; u < ndims; u++) {
+		    int j;
+		    hsize_t start[H5S_MAX_RANK];
+		    hsize_t block[H5S_MAX_RANK];
+
+		    /* Print the new appended data to the dataset */
+		    if(cur_dims[u] > prev_dims[u]) {
+			HDfprintf(stdout, "    Data:\n");
+
+			for(j = 0; j < ndims; j++) {
+			    start[j] = 0;
+			    block[j] = 1;
+			}
+
+			if((ret_value = slicendump(did, prev_dims, cur_dims, start, block, ndims, ndims)) < 0)
+			    goto done;
+			break;
+		    }
+		} /* end for */
+	    }
+	    HDfflush(stdout);
+	}
+	    
+	/* Save the current dimension sizes */
+	HDmemcpy(prev_dims, cur_dims, (size_t)ndims * sizeof(hsize_t));
+
+	/* Sleep before next monitor */
+        HDsleep(g_polling_interval);
+    } /* end while */
+
+done:
+    /* Closing */
+    H5E_BEGIN_TRY
+	H5Dclose(did);
+    H5E_END_TRY
+
+    return(ret_value);
+} /* monitor_dataset() */
+
+/*-------------------------------------------------------------------------
+ * Function:  process_cmpd_fields
+ *
+ * Purpose: To check whether the fields selected in "g_list_of_fields"
+ *	    are valid fields associated with the dataset.
+ *
+ * Return: 0 on success; negative on failure
+ *
+ * Programmer:  Vailin Choi; August 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+process_cmpd_fields(hid_t fid, char *dsetname)
+{
+    hid_t did=-1;			/* dataset id */
+    hid_t dtid=-1, tid=-1;	/* dataset's data type id */
+    size_t len;		/* number of comma-separated fields in "g_list_of_fields" */
+    herr_t ret_value = SUCCEED;	/* Return value */
+
+    HDassert(g_list_of_fields && *g_list_of_fields);
+    
+    /* Open the dataset */
+    if((did = H5Dopen2(fid, dsetname, H5P_DEFAULT)) < 0) {
+	error_msg("error in opening dataset \"%s\"\n", dsetname);
+	ret_value = FAIL;
+	goto done;
+    }
+
+    /* Get the dataset's datatype  */
+    if(((dtid = H5Dget_type(did)) < 0) || (tid = H5Tget_native_type(dtid, H5T_DIR_DEFAULT)) < 0) {
+	error_msg("error in getting dataset's datatype\n");
+        ret_value = FAIL;
+        goto done;
+    }
+
+    /* Check to make sure that the dataset's datatype is compound type */
+    if(H5Tget_class(dtid) != H5T_COMPOUND) {
+	error_msg("dataset should be compound type for <list_of_fields>\n");
+	ret_value = FAIL;
+	goto done;		
+    }
+
+    /* Make a copy of "g_list_of_fields" */
+    if((g_dup_fields = HDstrdup(g_list_of_fields)) == NULL) {
+	error_msg("error in duplicating g_list_of_fields\n");
+        ret_value = FAIL;
+	goto done;		
+    }
+
+    /* Estimate the number of comma-separated fields in "g_list of_fields" */
+    len = HDstrlen(g_list_of_fields)/2 + 2;
+
+    /* Allocate memory for a list vector of H5LD_memb_t structures to store "g_list_of_fields" info */
+    if((g_listv = (H5LD_memb_t **)HDcalloc(len, sizeof(H5LD_memb_t *))) == NULL) {
+	error_msg("error in allocating memory for H5LD_memb_t\n");
+        ret_value = FAIL;
+	goto done;		
+    }
+
+    /* Process and store info for "g_listv" */
+    if(H5LD_construct_vector(g_dup_fields, g_listv, tid) < 0) {
+	error_msg("error in processing <list_of_fields>\n");
+	ret_value = FAIL;
+        goto done;
+    }
+
+    /* Will free memory for g_listv and g_dup_fields when exiting from h5watch */
+done:
+    /* Closing */
+    H5E_BEGIN_TRY
+	H5Tclose(dtid);
+	H5Tclose(tid);
+	H5Dclose(did);
+    H5E_END_TRY
+    return(ret_value);
+} /* process_cmpd_fields() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_dataset
+ *
+ * Purpose:     To check whether a dataset can be monitored:
+ 		  A chunked dataset with unlimited or max. dimension setting
+ *
+ * Return:      Non-negative on success: dataset can be monitored
+ *		Negative on failure: dataset cannot be monitored
+ *
+ * Programmer:  Vailin Choi; August 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+check_dataset(hid_t fid, char *dsetname)
+{
+    hid_t did=-1;	/* Dataset id */
+    hid_t dcp=-1;	/* Dataset creation property */
+    hid_t sid=-1;	/* Dataset's dataspace id */
+    int	  ndims;	/* # of dimensions in the dataspace */
+    unsigned u;		/* Local index variable */
+    hsize_t cur_dims[H5S_MAX_RANK];	/* size of dataspace dimensions */
+    hsize_t max_dims[H5S_MAX_RANK];	/* maximum size of dataspace dimensions */
+    hbool_t unlim_max_dims = FALSE;	/* whether dataset has unlimited or max. dimension setting */
+    void               *edata;
+    H5E_auto2_t         func;
+    H5D_layout_t        layout;
+    herr_t ret_value = SUCCEED;	/* Return value */
+
+    /* Disable error reporting */
+    H5Eget_auto2(H5E_DEFAULT, &func, &edata);
+    H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
+
+    /* Open the dataset */
+    if((did = H5Dopen2(fid, dsetname, H5P_DEFAULT)) < 0) {
+	error_msg("unable to open dataset \"%s\"\n", dsetname);
+	ret_value = FAIL;
+	goto done;
+    }
+
+    /* Get dataset's creation property list */
+    if((dcp = H5Dget_create_plist(did)) < 0) {
+        error_msg("unable to get dataset's creation property list \"%s\"\n", dsetname);
+        ret_value = FAIL;
+        goto done;
+    }
+
+    /* Query dataset's layout; the layout should be chunked or virtual */
+    if((layout = H5Pget_layout(dcp)) < 0) {
+        error_msg("unable to get dataset layout \"%s\"\n", dsetname);
+        ret_value = FAIL;
+        goto done;
+    }
+    if(layout != H5D_CHUNKED && layout != H5D_VIRTUAL) {
+        error_msg("\"%s\" should be a chunked or virtual dataset\n", dsetname);
+        ret_value = FAIL;
+        goto done;
+    }
+
+    HDmemset(cur_dims, 0, sizeof cur_dims);
+    HDmemset(max_dims, 0, sizeof max_dims);
+
+    /* Get dataset's dataspace */
+    if((sid = H5Dget_space(did)) < 0) {
+	error_msg("can't get dataset's dataspace\"%s\"\n", dsetname);
+	ret_value = FAIL;
+	goto done;
+    }
+
+    /* Get dimension size of dataset's dataspace */
+    if((ndims = H5Sget_simple_extent_dims(sid, cur_dims, max_dims)) < 0) {
+	error_msg("can't get dataspace dimensions for dataset \"%s\"\n", dsetname);
+	ret_value = FAIL;
+	goto done;
+    }
+
+    /* Check whether dataset has unlimited dimension or max. dimension setting */
+    for(u = 0; u < (unsigned)ndims; u++)
+	if(max_dims[u] == H5S_UNLIMITED || cur_dims[u] != max_dims[u]) {
+    	    unlim_max_dims = TRUE;
+	    break;
+	}
+
+    if(!unlim_max_dims) {
+	error_msg("\"%s\" should have unlimited or max. dimension setting\n", dsetname);
+	ret_value = FAIL;
+    }
+
+done: 
+    H5Eset_auto2(H5E_DEFAULT, func, edata);
+
+    /* Closing */
+    H5E_BEGIN_TRY
+	H5Sclose(sid);
+	H5Pclose(dcp);
+	H5Dclose(did);
+    H5E_END_TRY
+
+    return(ret_value);
+} /* check_dataset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    leave
+ *
+ * Purpose:     Close the H5 Tools library and exit
+ *
+ * Return:      Does not return
+ *
+ * Programmer:  Vailin Choi; August 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+leave(int ret)
+{
+    h5tools_close();
+
+    exit(ret);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    usage
+ *
+ * Purpose:     Print the usage message about h5watch (only long options)
+ *
+ * Return:      void
+ *
+ * Programmer:  Vailin Choi; August 2010
+ *
+ * Modifications:
+ *-------------------------------------------------------------------------
+ */
+static void 
+usage(const char *prog)
+{
+    HDfflush(stdout);
+    HDfprintf(stdout, "Usage: %s [OPTIONS] [OBJECT]\n", prog);
+    HDfprintf(stdout, "\n");
+    HDfprintf(stdout, "     OPTIONS\n");
+    HDfprintf(stdout, "        --help            Print a usage message and exit.\n");
+    HDfprintf(stdout, "        --version         Print version number and exit.\n");
+    HDfprintf(stdout, "        --label           Label members of compound typed dataset.\n");
+    HDfprintf(stdout, "        --simple          Use a machine-readable output format.\n");
+    HDfprintf(stdout, "        --dim             Monitor changes in size of dataset dimensions only.\n");
+    HDfprintf(stdout, "        --width=N         Set the number of columns to N for output.\n");
+    HDfprintf(stdout, "                              A value of 0 sets the number of columns to the\n");
+    HDfprintf(stdout, "                              maximum (65535). The default width is 80 columns.\n");
+    HDfprintf(stdout, "        --polling=N       Set the polling interval to N (in seconds) when the\n");
+    HDfprintf(stdout, "                              dataset will be checked for appended data.  The default\n");
+    HDfprintf(stdout, "                              polling interval is 1.\n");
+    HDfprintf(stdout, "        --fields=<list_of_fields>\n");
+    HDfprintf(stdout, "                              Display data for the fields specified in <list_of_fields>\n");
+    HDfprintf(stdout, "                              for a compound data type.  <list_of_fields> can be\n");
+    HDfprintf(stdout, "                              specified as follows:\n");
+    HDfprintf(stdout, "                                   1) A comma-separated list of field names in a\n");
+    HDfprintf(stdout, "                                   compound data type.  \",\" is the separator\n"); 
+    HDfprintf(stdout, "                                   for field names while \".\" is the separator\n");
+    HDfprintf(stdout, "                                   for a nested field.\n");
+    HDfprintf(stdout, "                                   2) A single field name in a compound data type.\n");
+    HDfprintf(stdout, "                                   Can use this option multiple times.\n");
+    HDfprintf(stdout, "                              Note that backslash is the escape character to avoid\n");
+    HDfprintf(stdout, "                              characters in field names that conflict with the tool's\n");
+    HDfprintf(stdout, "                              separators.\n");
+    HDfprintf(stdout, "\n");
+    HDfprintf(stdout, "     OBJECT is specified as [<filename>/<path_to_dataset>/<dsetname>]\n");
+    HDfprintf(stdout, "        <filename>            Name of the HDF5 file.  It may be preceded by path\n");
+    HDfprintf(stdout, "                              separated by slashes to the specified HDF5 file.\n");
+    HDfprintf(stdout, "        <path_to_dataset>     Path separated by slashes to the specified dataset\n");
+    HDfprintf(stdout, "        <dsetname>            Name of the dataset\n");
+    HDfprintf(stdout, "\n");
+    HDfprintf(stdout, "     User can end the h5watch process by ctrl-C (SIGINT) or kill the process (SIGTERM).\n");
+
+} /* usage() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    parse_command_line
+ *
+ * Purpose:     Parse the command line for h5watch (take only long options)
+ *
+ * Return:      Success:    Set the corresponding command flags and return void
+ *              Failure:    Exits program with EXIT_FAILURE value.
+ *
+ * Programmer:  Vailin Choi; August 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+parse_command_line(int argc, const char *argv[])
+{
+    int	opt;	/* Command line option */
+    int tmp;
+
+     /* no arguments */
+    if (argc == 1) {
+        usage(h5tools_getprogname());
+        leave(EXIT_FAILURE);
+    }
+
+    /* parse command line options */
+    while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF) {
+        switch ((char)opt) {
+        case '?':
+        case 'h': /* --help */
+	    usage(h5tools_getprogname());
+            leave(EXIT_SUCCESS);
+
+        case 'V': /* --version */
+            print_version(progname);
+            leave(EXIT_SUCCESS);
+            break;
+
+        case 'w': /* --width=N */
+	    g_display_width = (int)HDstrtol(opt_arg, NULL, 0);
+	    if(g_display_width < 0) {
+		usage(h5tools_getprogname());
+		leave(EXIT_FAILURE);
+	    }
+            break;
+
+        case 'd': /* --dim */
+	    g_monitor_size_only = TRUE;
+            break;
+
+        case 'S': /* --simple */
+	    g_simple_output = TRUE;
+            break;
+	
+	case 'l': /* --label */
+	    g_label = TRUE;
+            break;
+
+        case 'p': /* --polling=N */
+	    /* g_polling_interval = HDstrtod(opt_arg, NULL); */
+	    if((tmp = (int)HDstrtol(opt_arg, NULL, 10)) <= 0) {
+		usage(h5tools_getprogname());
+		leave(EXIT_FAILURE);
+	    }
+	    g_polling_interval = (unsigned)tmp;
+            break;
+
+        case 'f': /* --fields=<list_of_fields> */
+	    if(g_list_of_fields == NULL) {
+		if((g_list_of_fields = HDstrdup(opt_arg)) == NULL) {
+		    error_msg("memory allocation failed (file %s:line %d)\n",
+			      __FILE__, __LINE__);
+		    leave(EXIT_FAILURE);
+		}
+	    } else {
+		char *str;
+
+		if((str = HDstrdup(opt_arg)) == NULL) {
+		    error_msg("memory allocation failed (file %s:line %d)\n",
+			      __FILE__, __LINE__);
+		    leave(EXIT_FAILURE);
+		}
+		if((g_list_of_fields = (char *)HDrealloc(g_list_of_fields, HDstrlen(g_list_of_fields) + HDstrlen(str) + 2)) == NULL) {
+		    error_msg("memory allocation failed (file %s:line %d)\n",
+			      __FILE__, __LINE__);
+		    leave(EXIT_FAILURE);
+
+		}
+		HDstrcat(g_list_of_fields, FIELD_SEP);
+		HDstrcat(g_list_of_fields, str);
+	    }
+
+            break;
+
+        default:
+	    usage(h5tools_getprogname());
+            leave(EXIT_FAILURE);
+        }
+    }
+    
+
+    /* check for object to be processed */
+    if (argc <= opt_ind) {
+        error_msg("missing dataset name\n");
+	usage(h5tools_getprogname());
+        leave(EXIT_FAILURE);
+    }
+} /* parse_command_line() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    catch_signal
+ *
+ * Purpose:     The signal handler to catch the signals:
+ *		SIGTERM and SIGINT and exit from h5watch
+ *
+ * Return:      No return
+ *
+ * Programmer:  Vailin Choi; November 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static void catch_signal(int H5_ATTR_UNUSED signo)
+{
+    /* Exit from h5watch */
+    leave(EXIT_SUCCESS);
+
+} /* catch_signal() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Purpose:     h5watch
+ *
+ * Return:      Success:    0
+ *              Failure:    1
+ *
+ * Programmer:  Vailin Choi; August 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(int argc, const char *argv[])
+{
+    char        drivername[50];
+    char 	*fname = NULL; 
+    char	*dname = NULL; 
+    void               *edata;
+    H5E_auto2_t         func;
+    char	*x;
+    hid_t	fid = -1;
+    hid_t	fapl = -1;
+
+    /* Set up tool name and exit status */
+    h5tools_setprogname(PROGRAMNAME);
+    h5tools_setstatus(EXIT_SUCCESS);
+
+    /* Disable error reporting */
+    H5Eget_auto2(H5E_DEFAULT, &func, &edata);
+    H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
+
+    /* Initialize h5tools lib */
+    h5tools_init();
+
+    /* To exit from h5watch for SIGTERM signal */
+    if(HDsignal(SIGTERM, catch_signal) == SIG_ERR) {
+	error_msg("An error occurred while setting a signal handler.\n");
+	leave(EXIT_FAILURE);
+    }
+
+    /* To exit from h5watch for SIGINT signal */
+    if(HDsignal(SIGINT, catch_signal) == SIG_ERR) {
+        error_msg("An error occurred while setting a signal handler.\n");
+	leave(EXIT_FAILURE);
+    }
+
+    /* parse command line options */
+    parse_command_line(argc, argv);
+
+    if(argc <= opt_ind) {
+        error_msg("missing dataset name\n");
+	usage(h5tools_getprogname());
+        leave(EXIT_FAILURE);
+    }
+
+    /* Mostly copied from tools/h5ls coding & modified accordingly */
+    /* 
+     * [OBJECT] is specified as 
+     *		[<filename>/<path_to_dataset>/<dsetname>]
+     *
+     * Example: ../dir1/foo/bar/dset
+     *          \_________/\______/
+     *             file       obj
+     *
+     * The dichotomy is determined by calling H5Fopen() repeatedly until it
+     * succeeds. The first call uses the entire name and each subsequent call
+     * chops off the last component. If we reach the beginning of the name
+     * then there must have been something wrong with the file (perhaps it
+     * doesn't exist). 
+     */
+    if((fname = HDstrdup(argv[opt_ind])) == NULL) {
+	error_msg("memory allocation failed (file %s:line %d)\n",
+                  __FILE__, __LINE__);
+	h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* Create a copy of file access property list */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        return -1;
+
+    /* Set to use the latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        return -1;
+
+    do {
+	while(fname && *fname) {
+	    fid = h5tools_fopen(fname, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl, NULL, drivername, sizeof drivername);
+
+	    if(fid >= 0) {
+		HDfprintf(stdout, "Opened \"%s\" with %s driver.\n", fname, drivername);
+		break; /*success*/
+	    } /* end if */
+
+	    /* Shorten the file name; lengthen the object name */
+	    x = dname;
+	    dname = HDstrrchr(fname, '/');
+	    if(x)
+		*x = '/';
+	    if(!dname)
+		break;
+	    *dname = '\0';
+	} /* end while */
+    /* Try opening the file again if somehow unstable */
+    } while(g_retry-- > 0 && fid == FAIL);
+
+    if(fid < 0) {
+	error_msg("unable to open file \"%s\"\n", fname);
+	if(fname) HDfree(fname);
+	if(fapl >= 0) H5Pclose(fapl);
+	leave(EXIT_FAILURE);
+    } 
+
+    if(!dname) {
+	error_msg("no dataset specified\n");
+	h5tools_setstatus(EXIT_FAILURE);
+    } else {
+	*dname = '/';
+	x = dname;
+	if((dname = HDstrdup(dname)) == NULL) {
+	    error_msg("memory allocation failed (file %s:line %d)\n",
+                      __FILE__, __LINE__);
+	    h5tools_setstatus(EXIT_FAILURE);
+	} else {
+	    *x = '\0';
+	    /* Validate dataset */
+	    if(check_dataset(fid, dname) < 0)
+		h5tools_setstatus(EXIT_FAILURE);
+	    /* Validate input "fields" */
+	    else if(g_list_of_fields && *g_list_of_fields)
+		if(process_cmpd_fields(fid, dname) < 0)
+		    h5tools_setstatus(EXIT_FAILURE);
+	}
+    } 
+
+    /* If everything is fine, start monitoring the datset */
+    if(h5tools_getstatus() != EXIT_FAILURE)
+	if(monitor_dataset(fid, dname) < 0)
+	    h5tools_setstatus(EXIT_FAILURE);
+     	    
+    /* Free spaces */
+    if(fname) HDfree(fname);
+    if(dname) HDfree(dname);
+    if(g_list_of_fields) HDfree(g_list_of_fields);
+    if(g_listv) {
+	H5LD_clean_vector(g_listv);
+	HDfree(g_listv);
+    }
+    if(g_dup_fields) HDfree(g_dup_fields);
+
+    /* Close the file access property list */
+    if(fapl >= 0 && H5Pclose(fapl) < 0) {
+	error_msg("unable to close file access property list\n");
+	h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0) {
+	error_msg("unable to close file\n");
+	h5tools_setstatus(EXIT_FAILURE);
+    }
+
+    H5Eset_auto2(H5E_DEFAULT, func, edata);
+    /* exit */
+    leave(h5tools_getstatus());
+} /* main() */
diff --git a/hl/tools/h5watch/h5watchgentest.c b/hl/tools/h5watch/h5watchgentest.c
new file mode 100644
index 0000000..d70a690
--- /dev/null
+++ b/hl/tools/h5watch/h5watchgentest.c
@@ -0,0 +1,355 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "hdf5.h"
+#include "H5HLprivate2.h"
+#include <time.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <string.h>
+
+/*
+ *  WATCH.h5: file with various types of datasets for testing--                                   
+ *
+ *  The following datasets are chunked, H5D_ALLOC_TIME_INCR, max. dimensional setting:       
+ *      DSET_ONE: one-dimensional dataset                                                   
+ *      DSET_TWO: two-dimensional dataset                                                  
+ *      DSET_CMPD: one-dimensional dataset with compound type                             
+ *      DSET_CMPD_ESC: one-dimensional dataset with compound type and member names with
+ *		       escape/separator characters 
+ *      DSET_CMPD_TWO: two-dimensional dataset with compound type                             
+ *                                                                                           
+ *  The following datasets are one-dimensional, chunked, max. dimension setting:              
+ *      DSET_ALLOC_EARLY: dataset with H5D_ALLOC_TIME_EARLY                                  
+ *      DSET_ALLOC_LATE: dataset H5D_ALLOC_TIME_LATE                                        
+ *                                                                                       
+ *  The following datasets are one-dimensional:                                           
+ *      DSET_NONE: fixed dimension setting, contiguous, H5D_ALLOC_TIME_LATE              
+ *      DSET_NOMAX: fixed dimension setting, chunked, H5D_ALLOC_TIME_INCR      
+ */
+#define ONE_DIMS0	10
+#define MAX_ONE_DIMS0	100
+
+#define DSET_ONE 	"DSET_ONE"
+#define DSET_NONE	"DSET_NONE"
+#define DSET_NOMAX	"DSET_NOMAX"
+#define DSET_ALLOC_LATE "DSET_ALLOC_LATE"
+#define DSET_ALLOC_EARLY "DSET_ALLOC_EARLY"
+#define DSET_CMPD 	"DSET_CMPD"
+#define DSET_CMPD_ESC 	"DSET_CMPD_ESC"
+
+#define TWO_DIMS0	4
+#define TWO_DIMS1	10
+#define MAX_TWO_DIMS0	60
+#define MAX_TWO_DIMS1	100
+
+#define DSET_TWO 	"DSET_TWO"
+#define DSET_CMPD_TWO 	"DSET_CMPD_TWO"
+
+#define CHUNK_SIZE	2
+
+#define FILE "WATCH.h5"
+
+/* Data structures for datasets with compound types */
+typedef struct sub22_t {
+    unsigned int a;
+    unsigned int b;
+    unsigned int c;
+} sub22_t;
+
+typedef struct sub2_t {
+    unsigned int a;
+    sub22_t b;
+    unsigned int c;
+} sub2_t;
+
+typedef struct sub4_t {
+    unsigned int a;
+    unsigned int b;
+} sub4_t;
+
+typedef struct set_t {
+    unsigned int field1;
+    sub2_t field2;
+    double field3;
+    sub4_t field4;
+} set_t;
+
+/*
+ **************************************************************************************
+ *
+ * Create a dataset with the given input parameters
+ * Write to the dataset with the given "data"
+ *
+ **************************************************************************************
+ */
+static int
+generate_dset(hid_t fid, const char *dname, int ndims, hsize_t *dims, hsize_t *maxdims, hid_t dtid, void *data)
+{
+    hid_t dcpl=-1;		/* Dataset creation property */
+    hid_t did=-1;		/* Dataset id */
+    hid_t sid=-1;		/* Dataspace id */
+    int i;		/* Local index variable */
+    hsize_t chunk_dims[H5S_MAX_RANK];	/* Dimension sizes for chunks */
+
+    /* Create the dataspace */
+    if((sid = H5Screate_simple(ndims, dims, maxdims)) < 0)
+	goto done;
+
+    /* Set up dataset's creation properties */
+    if(!HDstrcmp(dname, DSET_NONE))
+	dcpl = H5P_DEFAULT;
+    else {
+	if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+	    goto done;
+	for(i = 0; i < ndims; i++)
+	    chunk_dims[i] = CHUNK_SIZE;
+	if(H5Pset_chunk(dcpl, ndims, chunk_dims) < 0)
+	    goto done;
+    }
+
+    if(!HDstrcmp(dname, DSET_ALLOC_LATE)) {
+	if(H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_LATE) < 0)
+	    goto done;
+    } else if(!HDstrcmp(dname, DSET_ALLOC_EARLY)) {
+	if(H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY) < 0)
+	    goto done;
+    }
+
+    /* Create the dataset */
+    if((did = H5Dcreate2(fid, dname, dtid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	goto done;
+
+    /* Write to the dataset */
+    if(H5Dwrite(did, dtid, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0)
+	goto done;
+
+    /* Closing */
+    if(H5Pclose(dcpl) < 0) goto done;
+    if(H5Sclose(sid) < 0) goto done;
+    if(H5Dclose(did) < 0) goto done;
+
+    return(SUCCEED);
+
+done:
+    H5E_BEGIN_TRY
+	H5Sclose(sid);
+	H5Pclose(dcpl);
+	H5Dclose(did);
+    H5E_END_TRY
+
+    return(FAIL);
+} /* generate_dset() */
+
+int
+main(void)
+{
+    hid_t fid=-1;			/* File id */
+    hid_t fapl=-1;			/* File access property list id */
+    hsize_t cur_dims[1];		/* Dimension sizes */
+    hsize_t max_dims[1];		/* Maximum dimension sizes */
+    hsize_t cur2_dims[2];		/* Current dimension sizes */
+    hsize_t max2_dims[2];		/* Maximum dimension sizes */
+    hid_t set_tid=-1, esc_set_tid=-1;	/* Compound type id */
+    hid_t sub22_tid=-1;			/* Compound type id */
+    hid_t sub2_tid=-1, esc_sub2_tid=-1;	/* Compound type id */
+    hid_t sub4_tid=-1, esc_sub4_tid=-1;	/* Compound type id */
+    int one_data[ONE_DIMS0];		/* Buffer for data */
+    int two_data[TWO_DIMS0*TWO_DIMS1];	/* Buffer for data */
+    set_t one_cbuf[ONE_DIMS0];		/* Buffer for data with compound type */
+    set_t two_cbuf[TWO_DIMS0*TWO_DIMS1];	/* Buffer for data with compound type */
+    int i;				/* Local index variable */
+
+    /* Create a copy of file access property list */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        return -1;
+    /* Set to use the latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        return -1;
+
+    /* Create a file with the latest format */
+    if((fid = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+	goto done;
+
+    /* Initialization for one-dimensional dataset */
+    cur_dims[0] = ONE_DIMS0;
+    max_dims[0] = MAX_ONE_DIMS0;
+    for(i = 0; i < ONE_DIMS0; i++)
+        one_data[i] = i;
+
+    /* Generate DSET_ONE, DSET_NONE, DSET_NOMAX, DSET_ALLOC_LATE, DSET_EARLY */
+    if(generate_dset(fid, DSET_ONE, 1, cur_dims, max_dims, H5T_NATIVE_INT, one_data) < 0)
+	goto done;
+    if(generate_dset(fid, DSET_NONE, 1, cur_dims, NULL, H5T_NATIVE_INT, one_data) < 0)
+	goto done;
+    if(generate_dset(fid, DSET_NOMAX, 1, cur_dims, NULL, H5T_NATIVE_INT, one_data) < 0)
+	goto done;
+    if(generate_dset(fid, DSET_ALLOC_LATE, 1, cur_dims, max_dims, H5T_NATIVE_INT, one_data) < 0)
+	goto done;
+    if(generate_dset(fid, DSET_ALLOC_EARLY, 1, cur_dims, max_dims, H5T_NATIVE_INT, one_data) < 0)
+	goto done;
+
+    /* Initialization for two-dimensional dataset */
+    cur2_dims[0] = TWO_DIMS0;
+    cur2_dims[1] = TWO_DIMS1;
+    max2_dims[0] = MAX_TWO_DIMS0;
+    max2_dims[1] = MAX_TWO_DIMS1;
+
+    for(i = 0; i < (TWO_DIMS0 * TWO_DIMS1); i++)
+        two_data[i] = i;
+
+    /* Generate DSET_TWO */
+    if(generate_dset(fid, DSET_TWO, 2, cur2_dims, max2_dims, H5T_NATIVE_INT, two_data) < 0)
+	goto done;
+
+    /* Initialization for one-dimensional compound typed dataset */
+    cur_dims[0] = ONE_DIMS0;
+    max_dims[0] = MAX_ONE_DIMS0;
+
+    for (i = 0; i < ONE_DIMS0; i++) {
+        one_cbuf[i].field1 = 1;
+        one_cbuf[i].field2.a = 2;
+        one_cbuf[i].field2.c = 4;
+        one_cbuf[i].field2.b.a = 20;
+        one_cbuf[i].field2.b.b = 40;
+        one_cbuf[i].field2.b.c = 80;
+        one_cbuf[i].field3 = 3.0F;
+        one_cbuf[i].field4.a = 4;
+        one_cbuf[i].field4.b = 8;
+    }
+
+    /* Create the compound type */
+    if((sub22_tid = H5Tcreate(H5T_COMPOUND, sizeof(sub22_t))) < 0)
+	goto done;
+    if(H5Tinsert(sub22_tid, "a", HOFFSET(sub22_t, a), H5T_NATIVE_INT) < 0)
+	goto done;
+    if(H5Tinsert(sub22_tid, "b", HOFFSET(sub22_t, b), H5T_NATIVE_INT) < 0)
+	goto done;
+    if(H5Tinsert(sub22_tid, "c", HOFFSET(sub22_t, c), H5T_NATIVE_INT) < 0)
+	goto done;
+
+    if((sub2_tid = H5Tcreate(H5T_COMPOUND, sizeof(sub2_t))) < 0)
+	goto done;
+    if(H5Tinsert(sub2_tid, "a", HOFFSET(sub2_t, a), H5T_NATIVE_INT) < 0)
+	goto done;
+    if(H5Tinsert(sub2_tid, "b", HOFFSET(sub2_t, b), sub22_tid) < 0)
+	goto done;
+    if(H5Tinsert(sub2_tid, "c", HOFFSET(sub2_t, c), H5T_NATIVE_INT) < 0)
+	goto done;
+
+    if((sub4_tid = H5Tcreate(H5T_COMPOUND, sizeof(sub4_t))) < 0)
+	goto done;
+    if(H5Tinsert(sub4_tid, "a", HOFFSET(sub4_t, a), H5T_NATIVE_INT) < 0)
+	goto done;
+    if(H5Tinsert(sub4_tid, "b", HOFFSET(sub4_t, b), H5T_NATIVE_INT) < 0)
+	goto done;
+
+    if((set_tid = H5Tcreate(H5T_COMPOUND, sizeof(set_t))) < 0)
+	goto done;
+    if(H5Tinsert(set_tid, "field1", HOFFSET(set_t, field1), H5T_NATIVE_INT) < 0)
+	goto done;
+    if(H5Tinsert(set_tid, "field2", HOFFSET(set_t, field2), sub2_tid) < 0)
+	goto done;
+    if(H5Tinsert(set_tid, "field3", HOFFSET(set_t, field3), H5T_NATIVE_DOUBLE) < 0)
+	goto done;
+    if(H5Tinsert(set_tid, "field4", HOFFSET(set_t, field4), sub4_tid) < 0)
+	goto done;
+
+    /* Create the compound type with escape/separator characters */
+    if((esc_sub2_tid = H5Tcreate(H5T_COMPOUND, sizeof(sub2_t))) < 0)
+	goto done;
+    if(H5Tinsert(esc_sub2_tid, ".a", HOFFSET(sub2_t, a), H5T_NATIVE_INT) < 0)
+	goto done;
+    if(H5Tinsert(esc_sub2_tid, ",b", HOFFSET(sub2_t, b), sub22_tid) < 0)
+	goto done;
+    if(H5Tinsert(esc_sub2_tid, "\\K", HOFFSET(sub2_t, c), H5T_NATIVE_INT) < 0)
+	goto done;
+
+    if((esc_sub4_tid = H5Tcreate(H5T_COMPOUND, sizeof(sub4_t))) < 0)
+	goto done;
+    if(H5Tinsert(esc_sub4_tid, "a.", HOFFSET(sub4_t, a), H5T_NATIVE_INT) < 0)
+	goto done;
+    if(H5Tinsert(esc_sub4_tid, "b,", HOFFSET(sub4_t, b), H5T_NATIVE_INT) < 0)
+	goto done;
+
+    if((esc_set_tid = H5Tcreate(H5T_COMPOUND, sizeof(set_t))) < 0)
+	goto done;
+    if(H5Tinsert(esc_set_tid, "field,1", HOFFSET(set_t, field1), H5T_NATIVE_INT) < 0)
+	goto done;
+    if(H5Tinsert(esc_set_tid, "field2.", HOFFSET(set_t, field2), esc_sub2_tid) < 0)
+	goto done;
+    if(H5Tinsert(esc_set_tid, "field\\3", HOFFSET(set_t, field3), H5T_NATIVE_DOUBLE) < 0)
+	goto done;
+    if(H5Tinsert(esc_set_tid, "field4,", HOFFSET(set_t, field4), esc_sub4_tid) < 0)
+	goto done;
+
+    /* Generate DSET_CMPD, DSET_CMPD_ESC */
+    if(generate_dset(fid, DSET_CMPD, 1, cur_dims, max_dims, set_tid, one_cbuf) < 0)
+	goto done;
+    if(generate_dset(fid, DSET_CMPD_ESC, 1, cur_dims, max_dims, esc_set_tid, one_cbuf) < 0)
+	goto done;
+
+    /* Initialization for two-dimensional compound typed dataset */
+    cur2_dims[0] = TWO_DIMS0;
+    cur2_dims[1] = TWO_DIMS1;
+    max2_dims[0] = MAX_TWO_DIMS0;
+    max2_dims[0] = MAX_TWO_DIMS1;
+
+    for (i = 0; i < (TWO_DIMS0 * TWO_DIMS1); i++) {
+        two_cbuf[i].field1 = 1;
+        two_cbuf[i].field2.a = 2;
+        two_cbuf[i].field2.c = 4;
+        two_cbuf[i].field2.b.a = 20;
+        two_cbuf[i].field2.b.b = 40;
+        two_cbuf[i].field2.b.c = 80;
+        two_cbuf[i].field3 = 3.0F;
+        two_cbuf[i].field4.a = 4;
+        two_cbuf[i].field4.b = 8;
+    }
+
+    /* Generate DSET_CMPD_TWO */
+    if(generate_dset(fid, DSET_CMPD_TWO, 2, cur2_dims, max2_dims, set_tid, two_cbuf) < 0)
+	goto done;
+
+    /* Closing */
+    if(H5Tclose(sub22_tid) < 0) goto done;
+    if(H5Tclose(sub2_tid) < 0) goto done;
+    if(H5Tclose(sub4_tid) < 0) goto done;
+    if(H5Tclose(set_tid) < 0) goto done;
+    if(H5Tclose(esc_sub2_tid) < 0) goto done;
+    if(H5Tclose(esc_sub4_tid) < 0) goto done;
+    if(H5Tclose(esc_set_tid) < 0) goto done;
+    if(H5Pclose(fapl) < 0) goto done;
+    if(H5Fclose(fid) < 0) goto done;
+
+    exit(EXIT_SUCCESS);
+
+done:
+    H5E_BEGIN_TRY
+	H5Tclose(sub22_tid);
+	H5Tclose(sub2_tid);
+	H5Tclose(sub4_tid);
+	H5Tclose(set_tid);
+	H5Tclose(esc_sub2_tid);
+	H5Tclose(esc_sub4_tid);
+	H5Tclose(esc_set_tid);
+	H5Pclose(fapl);
+	H5Fclose(fid);
+    H5E_END_TRY
+
+    exit(EXIT_FAILURE);
+} /* main() */
diff --git a/hl/tools/h5watch/swmr_check_compat_vfd.c b/hl/tools/h5watch/swmr_check_compat_vfd.c
new file mode 100644
index 0000000..87b87c4
--- /dev/null
+++ b/hl/tools/h5watch/swmr_check_compat_vfd.c
@@ -0,0 +1,59 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Purpose:     This is a small program that checks if the HDF5_DRIVER
+ *              environment variable is set to a value that supports SWMR.
+ *              
+ *              It is intended for use in shell scripts.
+ */
+
+#include <stdlib.h>
+
+#include "H5private.h"
+
+/* This file needs to access the file driver testing code */
+#define H5FD_FRIEND		/*suppress error about including H5FDpkg	  */
+#define H5FD_TESTING
+#include "H5FDpkg.h"	/* File drivers	 			*/
+
+

+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Purpose:     Inspects the HDF5_DRIVER environment variable, which
+ *              determines the VFD that the test harness will use with
+ *              the majority of the tests.
+ *
+ * Return:      VFD supports SWMR:          EXIT_SUCCESS
+ *
+ *              VFD does not support SWMR
+ *              or failure:                 EXIT_FAILURE
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(void)
+{
+    char *driver = NULL;
+
+    driver = HDgetenv("HDF5_DRIVER");
+
+    if(H5FD_supports_swmr_test(driver))
+        return EXIT_SUCCESS;
+    else
+        return EXIT_FAILURE;
+
+} /* end main() */
+
diff --git a/hl/tools/h5watch/testh5watch.sh.in b/hl/tools/h5watch/testh5watch.sh.in
new file mode 100644
index 0000000..ff31768
--- /dev/null
+++ b/hl/tools/h5watch/testh5watch.sh.in
@@ -0,0 +1,395 @@
+#! /bin/sh
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+#
+# Tests for the h5watch tool
+#
+
+# Check to see if the VFD specified by the HDF5_DRIVER environment variable
+# supports SWMR.
+./swmr_check_compat_vfd
+rc=$?
+if [[ $rc != 0 ]] ; then
+    echo
+    echo "The VFD specified by the HDF5_DRIVER environment variable"
+    echo "does not support SWMR."
+    echo
+    echo "h5watch tests skipped"
+    echo
+    exit 0
+fi
+
+H5WATCH=h5watch               	# The tool name
+H5WATCH_BIN=`pwd`/$H5WATCH    	# The path of H5WATCH
+EXTEND_DSET=extend_dset 	# Routine to extend the dataset when watching
+EXTEND_BIN=`pwd`/$EXTEND_DSET 	# The path of EXTEND_DSET
+#
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+#
+GEN_TEST=h5watchgentest	      	# Generate HDF5 file with various datasets
+GEN_TEST_BIN=`pwd`/$GEN_TEST 	# Path of the binary GEN_TEST
+WATCHFILE=`pwd`/WATCH.h5        # The HDF5 file generated to test h5watch
+TESTFILE=TEST.h5                # The temporary file (a copy of WATCH.h5) used by tests
+#
+# These 3 defines should be the same as the defines in ./extend_dset.c
+WRITER_MESSAGE=writer_message   # The message file created by the "extend" process
+READER_MESSAGE=reader_message   # The message file created by the "watch" process
+MESSAGE_TIMEOUT=300             # Message timeout length in secs
+#
+CMP='cmp -s'
+DIFF='diff -c'
+NLINES=20			# Max. lines of output to display if test fails
+#
+# Mac OS: just to make sure echo "backslash backslash" behaves properly
+if test `uname -s` = 'Darwin'; then
+    ECHO='/bin/echo'
+else
+    ECHO='echo'
+fi
+#
+# Global variables
+nerrors=0
+verbose=yes
+
+# The build (current) directory might be different than the source directory.
+if test -z "$srcdir"; then
+    srcdir=.
+fi
+test -d ../testfiles || mkdir ../testfiles
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Testing".
+TESTING() {
+    SPACES="                                                               "
+    $ECHO "Testing $* $SPACES" |cut -c1-70 |tr -d '\012'
+}
+
+#
+# Overall algorithm:
+#
+# Run a test and print PASSED or FAILED
+# If a test did not return with the expected return code, 
+# increment the `nerrors' global variable and (if $verbose is set) display up to $NLINES
+# lines of the actual output from the test.  
+# If the test did return the expected code,
+# compare the actual output with the expected output;
+# If the outputs are the same, print PASSED,
+# Otherwise print FAILED and the difference between the two outputs.
+# The output files are not removed if $HDF5_NOCLEANUP has a non-zero value.
+#
+#
+# TOOLTEST():
+#
+# Arguments:
+#
+# $1 -- expected output
+# $2 -- expected return code
+# $3 and on -- arguments for h5watch
+TOOLTEST() {
+    expect="$srcdir/../testfiles/$1"
+    actual="../testfiles/`basename $1 .ddl`.out"
+    actual_err="../testfiles/`basename $1 .ddl`.err"
+    shift
+    retvalexpect=$1
+    shift
+    # Run test.
+    # Stderr is included in stdout so that the diff can detect
+    # any unexpected output from that stream too.
+    TESTING $H5WATCH $@
+    (
+	$ECHO "#############################"
+	$ECHO " output for '$H5WATCH $@'" 
+	$ECHO "#############################"
+        $RUNSERIAL $H5WATCH_BIN "$@"
+    ) > $actual 2>$actual_err
+    exitcode=$?
+    cat $actual_err >> $actual
+    if [ $exitcode -ne $retvalexpect ]; then
+	$ECHO "*FAILED*"
+	nerrors="`expr $nerrors + 1`"
+	if [ yes = "$verbose" ]; then
+	    $ECHO "test returned with exit code $exitcode"
+	    $ECHO "test output: (up to $NLINES lines)"
+	    head -$NLINES $actual
+	    $ECHO "***end of test output***"
+	    $ECHO ""
+	fi
+    elif $CMP $expect $actual; then
+        $ECHO " PASSED"
+    else
+        $ECHO "*FAILED*"
+	$ECHO "    Expected result differs from actual result"
+	nerrors="`expr $nerrors + 1`"
+	test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    fi
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+	rm -f $actual $actual_err
+    fi
+}
+#
+#
+#
+# TEST_WATCH():
+#
+# Arguments:
+#       $1 -- the specified dataset to watch and to extend
+#       $2 -- the options to h5watch (can be NULL)
+#       $3 -- expected output from watching the object
+#
+TEST_WATCH() {
+    cp $WATCHFILE $TESTFILE                             # Copy the file being watched/extended to a temporary file
+    actual="../testfiles/`basename $3 .ddl`.out"        # The actual output
+    expect="$srcdir/../testfiles/$3"                    # The expected output
+    #
+    # Set up options and object to h5watch
+    if test -z "$2"; then
+        OBJ="$TESTFILE/$1"                              # Empty options, just object to h5watch
+    else
+        OBJ="$2 $TESTFILE/$1"                           # Options + object to h5watch
+    fi
+    rm -f $WRITER_MESSAGE                               # Remove the file just to be sure
+    rm -f $READER_MESSAGE                               # Remove the file just to be sure
+    #
+    $EXTEND_BIN $TESTFILE $1 &                          # Extend the dataset; put in background
+    extend_pid=$!                                       # Get "extend" process ID
+    #
+    # Wait for message from "extend_dset" process to start h5watch--
+    # To wait for the writer message file or till the maximum # of seconds is reached
+    # This performs similar function as the routine h5_wait_message() in test/h5test.c
+    mexist=0                                    	# Indicate whether the message file is found
+    t0=`date +%s`                               	# Get current time in seconds
+    difft=0                                     	# Initialize the time difference
+    while [ $difft -lt $MESSAGE_TIMEOUT ] ;     	# Loop till message times out
+    do
+        t1=`date +%s`                           	# Get current time in seconds
+        difft=`expr $t1 - $t0`                  	# Calculate the time difference
+        if [ -e $WRITER_MESSAGE ]; then  		# If message file is found:
+            mexist=1                            	#       indicate the message file is found
+            rm $WRITER_MESSAGE				#       remove the message file
+            break                               	#       get out of the while loop
+        fi
+    done;
+    #
+    # If message file from "extend" process is found--
+    #   start h5watch
+    #   send message to "extend" process to start work
+    #   wait for "extend" process to complete, then kill h5watch
+    #   determine test result
+    # If message file from "extend" process is not found--
+    #   there is some problem; the test fails
+    #
+    if test $mexist -eq 0; then
+        $ECHO "*FAILED*"
+        $ECHO "Problem with extend_dset...this test failed."
+    else
+        #
+        # Run h5watch; put in background; collect output to a file
+        TESTING $H5WATCH $OBJ
+	head -n 3 $expect > $actual			# copy the first 3 lines from $expect (just the command line)
+        $RUNSERIAL $H5WATCH_BIN $2 "$TESTFILE/$1" >> $actual &
+        watch_pid=$!                                    # Get h5watch process ID
+        cp /dev/null $READER_MESSAGE                    # Send message to "extend" process to start work
+        wait $extend_pid                                # Wait for "extend" process to complete
+        extend_exit=$?                                  # Collect "extend" process' exit code
+        sleep 1                                         # Sleep to make sure output is flushed
+        kill $watch_pid                              	# Kill h5watch
+	wait $watch_pid					# Wait for "h5watch" process to complete
+        #
+        if [ $extend_exit -ne 0 ]; then                 # Error returned from "extend" process
+            $ECHO "*FAILED*"
+            nerrors="`expr $nerrors + 1`"
+            if [ yes = "$verbose" ]; then
+                $ECHO "extend test returned with exit code $extend_exit"
+                $ECHO "test output: (up to $NLINES lines)"
+                head -$NLINES $actual
+                $ECHO "***end of test output***"
+                $ECHO ""
+            fi
+        elif $CMP $expect $actual; then                 # Compare actual output with expected output
+            $ECHO " PASSED"
+        else
+            $ECHO "*FAILED*"                            # Actual and expected outputs are different
+            $ECHO "    Expected result differs from actual result"
+            nerrors="`expr $nerrors + 1`"
+            if test yes = "$verbose"; then
+                        $DIFF $expect $actual |sed 's/^/    /'
+            fi
+        fi
+        #
+        # Cleaning
+        rm -f $TESTFILE
+        if test -z "$HDF5_NOCLEANUP"; then
+            rm -f $actual
+        fi
+    fi
+}
+
+##############################################################################
+##############################################################################
+###			  T H E   T E S T S                                ###
+##############################################################################
+##############################################################################
+#
+#
+#################################################################################################
+#												#
+# WATCH.h5: file with various types of datasets for testing--					#
+#   The following datasets are chunked, H5D_ALLOC_TIME_INCR, max. dimensional setting:		#
+#   	DSET_ONE: one-dimensional dataset							#
+#   	DSET_TWO: two-dimensional dataset							#
+#   	DSET_CMPD: one-dimensional dataset with compound type 					#
+#   	DSET_CMPD_ESC: one-dimensional dataset with compound type & escape/separator characters	#
+#   	DSET_CMPD_TWO: two-dimensional dataset with compound type 				#
+#												#
+#   The following datasets are one-dimensional, chunked, max. dimension setting:		#
+#   	DSET_ALLOC_EARLY: dataset with H5D_ALLOC_TIME_EARLY					#
+#   	DSET_ALLOC_LATE: dataset H5D_ALLOC_TIME_LATE						#
+#												#
+#   The following datasets are one-dimensional:							#
+#	DSET_NONE: fixed dimension setting, contiguous, H5D_ALLOC_TIME_LATE			#
+#	DSET_NOMAX: fixed dimension setting, chunked, H5D_ALLOC_TIME_INCR			#
+#											 	#
+#################################################################################################
+#
+#
+#################################################################################################
+#												#
+# Tests on expected failures:									#
+#	Invalid file name									#
+#	Unable to find dataset, invalid dataset							#
+#	  DSET_NONE and DSET_NOMAX								#
+#	Invalid input to options --width and --polling						#
+#	Invalid field names for -f option							#
+#												#
+#################################################################################################
+#
+# Generate file with various types of datasets
+$GEN_TEST_BIN
+# Test on --help options
+TOOLTEST w-help1.ddl 0 --help
+#
+# Tests on expected failures
+TOOLTEST w-err-dset1.ddl 1 WATCH.h5
+TOOLTEST w-err-dset2.ddl 1 WATCH.h5/group/DSET_CMPD
+TOOLTEST w-err-dset-none.ddl 1 WATCH.h5/DSET_NONE
+TOOLTEST w-err-dset-nomax.ddl 1 WATCH.h5/DSET_NOMAX
+TOOLTEST w-err-file.ddl 1 ../WATCH.h5/DSET_CMPD
+TOOLTEST w-err-width.ddl 1 --width=-8 WATCH.h5/DSET_ONE
+TOOLTEST w-err-poll.ddl 1 --polling=-8 WATCH.h5/DSET_ONE
+TOOLTEST w-err-poll0.ddl 1 --polling=0 WATCH.h5/DSET_ONE
+#
+# Tests on invalid field names via --fields option for a compound typed dataset: DSET_CMPD
+TOOLTEST w-err-cmpd1.ddl 1 --fields=fieldx WATCH.h5/DSET_CMPD
+TOOLTEST w-err-cmpd2.ddl 1 --fields=field1,field2. WATCH.h5/DSET_CMPD
+TOOLTEST w-err-cmpd3.ddl 1 --fields=field1,field2, WATCH.h5/DSET_CMPD
+TOOLTEST w-err-cmpd4.ddl 1 --fields=field1,field2.b.k WATCH.h5/DSET_CMPD
+TOOLTEST w-err-cmpd5.ddl 1 --fields=field1 --fields=field2.b.k WATCH.h5/DSET_CMPD
+#
+echo "DONE WITH 1st SET OF TESTS"
+#
+#
+#
+#################################
+# Tests without options         #
+#################################
+#
+# Generate file WATCH.h5 with various types of datasets,
+$GEN_TEST_BIN
+#
+# Watching and extending: (TEST.h5 is a copy of WATCH.h5)
+#       TEST.h5/DSET_ONE
+#       TEST.h5/DSET_ALLOC_EARLY
+#       TEST.h5/DSET_ALLOC_LATE
+#       TEST.h5/DSET_CMPD
+#       TEST.h5/DSET_TWO
+#       TEST.h5/DSET_CMPD_TWO
+#       TEST.h5/DSET_CMPD_ESC
+#
+TEST_WATCH DSET_ONE '' w-ext-one.ddl
+TEST_WATCH DSET_ALLOC_EARLY '' w-ext-early.ddl
+TEST_WATCH DSET_ALLOC_LATE '' w-ext-late.ddl
+TEST_WATCH DSET_CMPD '' w-ext-cmpd.ddl
+TEST_WATCH DSET_TWO '' w-ext-two.ddl
+TEST_WATCH DSET_CMPD_TWO '' w-ext-cmpd-two.ddl
+TEST_WATCH DSET_CMPD_ESC '' w-ext-cmpd-esc.ddl
+#
+echo "DONE WITH 2nd SET OF TESTS"
+#
+#
+#
+#################################
+# Tests on --fields option      #
+#################################
+#
+# Watching and extending: (TEST.h5 is a copy of WATCH.h5)
+#       TEST.h5/DSET_CMPD with --fields=field1,field2
+#       TEST.h5/DSET_CMPD with --fields=field2.b,field4
+#       TEST.h5/DSET_CMPD with --fields=field2.b.a --fields=field2.c
+TEST_WATCH DSET_CMPD --fields=field1,field2 w-ext-cmpd-f1.ddl
+TEST_WATCH DSET_CMPD --fields=field2.b,field4 w-ext-cmpd-f2.ddl
+TEST_WATCH DSET_CMPD '--fields=field2.b.a --fields=field2.c' w-ext-cmpd-ff3.ddl
+#
+#
+#       TEST.h5/DSET_CMP_TWO with --fields=field1,field2
+#       TEST.h5/DSET_CMPD_TWO with --fields=field2.b --fields=field4
+#       TEST.h5/DSET_CMPD_TWO with --fields=field2.b.a,field2.c
+TEST_WATCH DSET_CMPD_TWO --fields=field1,field2 w-ext-cmpd-two-f1.ddl
+TEST_WATCH DSET_CMPD_TWO '--fields=field2.b --fields=field4' w-ext-cmpd-two-ff2.ddl
+TEST_WATCH DSET_CMPD_TWO --fields=field2.b.a,field2.c w-ext-cmpd-two-f3.ddl
+#
+#
+#       TEST.h5/DSET_CMPD_ESC with --fields=field\,1,field2\.
+#       TEST.h5/DSET_CMPD_ESC with --fields=field2\..\,b --fields=field4\,
+#       TEST.h5/DSET_CMPD_ESC with --fields=field2\..\,b.a,field2\..\\K
+TEST_WATCH DSET_CMPD_ESC '--fields=field\,1,field2\.' w-ext-cmpd-esc-f1.ddl
+TEST_WATCH DSET_CMPD_ESC '--fields=field2\..\,b --fields=field4\,' w-ext-cmpd-esc-ff2.ddl
+TEST_WATCH DSET_CMPD_ESC '--fields=field2\..\,b.a,field2\..\\K' w-ext-cmpd-esc-f3.ddl
+#
+#
+echo "DONE WITH 3rd SET OF TESTS"
+#
+#
+#
+#################################################
+# Tests on options:                             #
+#       --dim                                   #
+#       --width, --label, --simple, --help      #
+#################################################
+#
+# Watching and extending: (TEST.h5 is a copy of WATCH.h5)
+#       TEST.h5/DSET_ONE with -d option
+#       TEST.h5/DSET_TWO with --dim option
+#       TEST.h5/DSET_TWO with --width=60 option
+#       TEST.h5/DSET_CMPD with --label option
+#       TEST.h5/DSET_ONE with --simple option
+TEST_WATCH DSET_ONE --dim w-ext-one-d.ddl
+TEST_WATCH DSET_TWO --dim w-ext-two-d.ddl
+TEST_WATCH DSET_TWO --width=30 w-ext-two-width.ddl
+TEST_WATCH DSET_CMPD --label w-ext-cmpd-label.ddl
+TEST_WATCH DSET_ONE --simple w-ext-one-simple.ddl
+#
+echo "DONE WITH 4th SET OF TESTS"
+#
+#
+#
+if test $nerrors -eq 0 ; then
+    $ECHO "All h5watch tests passed."
+    exit $EXIT_SUCCESS
+else
+    $ECHO "h5watch tests failed with $nerrors errors."
+    exit $EXIT_FAILURE
+fi
diff --git a/hl/tools/testfiles/w-err-cmpd1.ddl b/hl/tools/testfiles/w-err-cmpd1.ddl
new file mode 100644
index 0000000..2a3f796
--- /dev/null
+++ b/hl/tools/testfiles/w-err-cmpd1.ddl
@@ -0,0 +1,5 @@
+#############################
+ output for 'h5watch --fields=fieldx WATCH.h5/DSET_CMPD'
+#############################
+Opened "WATCH.h5" with sec2 driver.
+h5watch error: error in processing <list_of_fields>
diff --git a/hl/tools/testfiles/w-err-cmpd2.ddl b/hl/tools/testfiles/w-err-cmpd2.ddl
new file mode 100644
index 0000000..4de3fe2
--- /dev/null
+++ b/hl/tools/testfiles/w-err-cmpd2.ddl
@@ -0,0 +1,5 @@
+#############################
+ output for 'h5watch --fields=field1,field2. WATCH.h5/DSET_CMPD'
+#############################
+Opened "WATCH.h5" with sec2 driver.
+h5watch error: error in processing <list_of_fields>
diff --git a/hl/tools/testfiles/w-err-cmpd3.ddl b/hl/tools/testfiles/w-err-cmpd3.ddl
new file mode 100644
index 0000000..f2f462e
--- /dev/null
+++ b/hl/tools/testfiles/w-err-cmpd3.ddl
@@ -0,0 +1,5 @@
+#############################
+ output for 'h5watch --fields=field1,field2, WATCH.h5/DSET_CMPD'
+#############################
+Opened "WATCH.h5" with sec2 driver.
+h5watch error: error in processing <list_of_fields>
diff --git a/hl/tools/testfiles/w-err-cmpd4.ddl b/hl/tools/testfiles/w-err-cmpd4.ddl
new file mode 100644
index 0000000..b11277b
--- /dev/null
+++ b/hl/tools/testfiles/w-err-cmpd4.ddl
@@ -0,0 +1,5 @@
+#############################
+ output for 'h5watch --fields=field1,field2.b.k WATCH.h5/DSET_CMPD'
+#############################
+Opened "WATCH.h5" with sec2 driver.
+h5watch error: error in processing <list_of_fields>
diff --git a/hl/tools/testfiles/w-err-cmpd5.ddl b/hl/tools/testfiles/w-err-cmpd5.ddl
new file mode 100644
index 0000000..7174d14
--- /dev/null
+++ b/hl/tools/testfiles/w-err-cmpd5.ddl
@@ -0,0 +1,5 @@
+#############################
+ output for 'h5watch --fields=field1 --fields=field2.b.k WATCH.h5/DSET_CMPD'
+#############################
+Opened "WATCH.h5" with sec2 driver.
+h5watch error: error in processing <list_of_fields>
diff --git a/hl/tools/testfiles/w-err-dset-nomax.ddl b/hl/tools/testfiles/w-err-dset-nomax.ddl
new file mode 100644
index 0000000..c2fd65f
--- /dev/null
+++ b/hl/tools/testfiles/w-err-dset-nomax.ddl
@@ -0,0 +1,5 @@
+#############################
+ output for 'h5watch WATCH.h5/DSET_NOMAX'
+#############################
+Opened "WATCH.h5" with sec2 driver.
+h5watch error: "/DSET_NOMAX" should have unlimited or max. dimension setting
diff --git a/hl/tools/testfiles/w-err-dset-none.ddl b/hl/tools/testfiles/w-err-dset-none.ddl
new file mode 100644
index 0000000..f9165aa
--- /dev/null
+++ b/hl/tools/testfiles/w-err-dset-none.ddl
@@ -0,0 +1,5 @@
+#############################
+ output for 'h5watch WATCH.h5/DSET_NONE'
+#############################
+Opened "WATCH.h5" with sec2 driver.
+h5watch error: "/DSET_NONE" should be a chunked or virtual dataset
diff --git a/hl/tools/testfiles/w-err-dset1.ddl b/hl/tools/testfiles/w-err-dset1.ddl
new file mode 100644
index 0000000..0594562
--- /dev/null
+++ b/hl/tools/testfiles/w-err-dset1.ddl
@@ -0,0 +1,5 @@
+#############################
+ output for 'h5watch WATCH.h5'
+#############################
+Opened "WATCH.h5" with sec2 driver.
+h5watch error: no dataset specified
diff --git a/hl/tools/testfiles/w-err-dset2.ddl b/hl/tools/testfiles/w-err-dset2.ddl
new file mode 100644
index 0000000..ce26109
--- /dev/null
+++ b/hl/tools/testfiles/w-err-dset2.ddl
@@ -0,0 +1,5 @@
+#############################
+ output for 'h5watch WATCH.h5/group/DSET_CMPD'
+#############################
+Opened "WATCH.h5" with sec2 driver.
+h5watch error: unable to open dataset "/group/DSET_CMPD"
diff --git a/hl/tools/testfiles/w-err-file.ddl b/hl/tools/testfiles/w-err-file.ddl
new file mode 100644
index 0000000..416fd44
--- /dev/null
+++ b/hl/tools/testfiles/w-err-file.ddl
@@ -0,0 +1,4 @@
+#############################
+ output for 'h5watch ../WATCH.h5/DSET_CMPD'
+#############################
+h5watch error: unable to open file "../WATCH.h5/DSET_CMPD"
diff --git a/hl/tools/testfiles/w-err-poll.ddl b/hl/tools/testfiles/w-err-poll.ddl
new file mode 100644
index 0000000..56c8d89
--- /dev/null
+++ b/hl/tools/testfiles/w-err-poll.ddl
@@ -0,0 +1,38 @@
+#############################
+ output for 'h5watch --polling=-8 WATCH.h5/DSET_ONE'
+#############################
+Usage: h5watch [OPTIONS] [OBJECT]
+
+     OPTIONS
+        --help            Print a usage message and exit.
+        --version         Print version number and exit.
+        --label           Label members of compound typed dataset.
+        --simple          Use a machine-readable output format.
+        --dim             Monitor changes in size of dataset dimensions only.
+        --width=N         Set the number of columns to N for output.
+                              A value of 0 sets the number of columns to the
+                              maximum (65535). The default width is 80 columns.
+        --polling=N       Set the polling interval to N (in seconds) when the
+                              dataset will be checked for appended data.  The default
+                              polling interval is 1.
+        --fields=<list_of_fields>
+                              Display data for the fields specified in <list_of_fields>
+                              for a compound data type.  <list_of_fields> can be
+                              specified as follows:
+                                   1) A comma-separated list of field names in a
+                                   compound data type.  "," is the separator
+                                   for field names while "." is the separator
+                                   for a nested field.
+                                   2) A single field name in a compound data type.
+                                   Can use this option multiple times.
+                              Note that backslash is the escape character to avoid
+                              characters in field names that conflict with the tool's
+                              separators.
+
+     OBJECT is specified as [<filename>/<path_to_dataset>/<dsetname>]
+        <filename>            Name of the HDF5 file.  It may be preceded by path
+                              separated by slashes to the specified HDF5 file.
+        <path_to_dataset>     Path separated by slashes to the specified dataset
+        <dsetname>            Name of the dataset
+
+     User can end the h5watch process by ctrl-C (SIGINT) or kill the process (SIGTERM).
diff --git a/hl/tools/testfiles/w-err-poll0.ddl b/hl/tools/testfiles/w-err-poll0.ddl
new file mode 100644
index 0000000..ff6f322
--- /dev/null
+++ b/hl/tools/testfiles/w-err-poll0.ddl
@@ -0,0 +1,38 @@
+#############################
+ output for 'h5watch --polling=0 WATCH.h5/DSET_ONE'
+#############################
+Usage: h5watch [OPTIONS] [OBJECT]
+
+     OPTIONS
+        --help            Print a usage message and exit.
+        --version         Print version number and exit.
+        --label           Label members of compound typed dataset.
+        --simple          Use a machine-readable output format.
+        --dim             Monitor changes in size of dataset dimensions only.
+        --width=N         Set the number of columns to N for output.
+                              A value of 0 sets the number of columns to the
+                              maximum (65535). The default width is 80 columns.
+        --polling=N       Set the polling interval to N (in seconds) when the
+                              dataset will be checked for appended data.  The default
+                              polling interval is 1.
+        --fields=<list_of_fields>
+                              Display data for the fields specified in <list_of_fields>
+                              for a compound data type.  <list_of_fields> can be
+                              specified as follows:
+                                   1) A comma-separated list of field names in a
+                                   compound data type.  "," is the separator
+                                   for field names while "." is the separator
+                                   for a nested field.
+                                   2) A single field name in a compound data type.
+                                   Can use this option multiple times.
+                              Note that backslash is the escape character to avoid
+                              characters in field names that conflict with the tool's
+                              separators.
+
+     OBJECT is specified as [<filename>/<path_to_dataset>/<dsetname>]
+        <filename>            Name of the HDF5 file.  It may be preceded by path
+                              separated by slashes to the specified HDF5 file.
+        <path_to_dataset>     Path separated by slashes to the specified dataset
+        <dsetname>            Name of the dataset
+
+     User can end the h5watch process by ctrl-C (SIGINT) or kill the process (SIGTERM).
diff --git a/hl/tools/testfiles/w-err-width.ddl b/hl/tools/testfiles/w-err-width.ddl
new file mode 100644
index 0000000..bf405a4
--- /dev/null
+++ b/hl/tools/testfiles/w-err-width.ddl
@@ -0,0 +1,38 @@
+#############################
+ output for 'h5watch --width=-8 WATCH.h5/DSET_ONE'
+#############################
+Usage: h5watch [OPTIONS] [OBJECT]
+
+     OPTIONS
+        --help            Print a usage message and exit.
+        --version         Print version number and exit.
+        --label           Label members of compound typed dataset.
+        --simple          Use a machine-readable output format.
+        --dim             Monitor changes in size of dataset dimensions only.
+        --width=N         Set the number of columns to N for output.
+                              A value of 0 sets the number of columns to the
+                              maximum (65535). The default width is 80 columns.
+        --polling=N       Set the polling interval to N (in seconds) when the
+                              dataset will be checked for appended data.  The default
+                              polling interval is 1.
+        --fields=<list_of_fields>
+                              Display data for the fields specified in <list_of_fields>
+                              for a compound data type.  <list_of_fields> can be
+                              specified as follows:
+                                   1) A comma-separated list of field names in a
+                                   compound data type.  "," is the separator
+                                   for field names while "." is the separator
+                                   for a nested field.
+                                   2) A single field name in a compound data type.
+                                   Can use this option multiple times.
+                              Note that backslash is the escape character to avoid
+                              characters in field names that conflict with the tool's
+                              separators.
+
+     OBJECT is specified as [<filename>/<path_to_dataset>/<dsetname>]
+        <filename>            Name of the HDF5 file.  It may be preceded by path
+                              separated by slashes to the specified HDF5 file.
+        <path_to_dataset>     Path separated by slashes to the specified dataset
+        <dsetname>            Name of the dataset
+
+     User can end the h5watch process by ctrl-C (SIGINT) or kill the process (SIGTERM).
diff --git a/hl/tools/testfiles/w-ext-cmpd-esc-f1.ddl b/hl/tools/testfiles/w-ext-cmpd-esc-f1.ddl
new file mode 100644
index 0000000..6e1d2b5
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-cmpd-esc-f1.ddl
@@ -0,0 +1,14 @@
+#############################
+ output for 'h5watch --fields=field\,1,field2\. TEST.h5/DSET_CMPD_ESC'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_CMPD_ESC...
+dimension 0: 10->13 (increases)
+    Data:
+        (10) {1, {2, {2, 2, 2}, 2}}, {2, {3, {3, 3, 3}, 3}},
+        (12) {3, {4, {4, 4, 4}, 4}}
+dimension 0: 13->12 (decreases)
+dimension 0: 12->1 (decreases)
+dimension 0: 1->3 (increases)
+    Data:
+        (1) {1, {2, {2, 2, 2}, 2}}, {2, {3, {3, 3, 3}, 3}}
diff --git a/hl/tools/testfiles/w-ext-cmpd-esc-f3.ddl b/hl/tools/testfiles/w-ext-cmpd-esc-f3.ddl
new file mode 100644
index 0000000..7623f3f
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-cmpd-esc-f3.ddl
@@ -0,0 +1,13 @@
+#############################
+ output for 'h5watch --fields=field2\..\,b.a,field2\..\\K TEST.h5/DSET_CMPD_ESC'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_CMPD_ESC...
+dimension 0: 10->13 (increases)
+    Data:
+        (10) {{{2}}, {2}}, {{{3}}, {3}}, {{{4}}, {4}}
+dimension 0: 13->12 (decreases)
+dimension 0: 12->1 (decreases)
+dimension 0: 1->3 (increases)
+    Data:
+        (1) {{{2}}, {2}}, {{{3}}, {3}}
diff --git a/hl/tools/testfiles/w-ext-cmpd-esc-ff2.ddl b/hl/tools/testfiles/w-ext-cmpd-esc-ff2.ddl
new file mode 100644
index 0000000..db331f0
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-cmpd-esc-ff2.ddl
@@ -0,0 +1,14 @@
+#############################
+ output for 'h5watch --fields=field2\..\,b --fields=field4\, TEST.h5/DSET_CMPD_ESC'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_CMPD_ESC...
+dimension 0: 10->13 (increases)
+    Data:
+        (10) {{{2, 2, 2}}, {4, 4}}, {{{3, 3, 3}}, {5, 5}}, {{{4, 4, 4}}, {6, 
+        (12)  6}}
+dimension 0: 13->12 (decreases)
+dimension 0: 12->1 (decreases)
+dimension 0: 1->3 (increases)
+    Data:
+        (1) {{{2, 2, 2}}, {4, 4}}, {{{3, 3, 3}}, {5, 5}}
diff --git a/hl/tools/testfiles/w-ext-cmpd-esc.ddl b/hl/tools/testfiles/w-ext-cmpd-esc.ddl
new file mode 100644
index 0000000..66eb48c
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-cmpd-esc.ddl
@@ -0,0 +1,16 @@
+#############################
+ output for 'h5watch TEST.h5/DSET_CMPD_ESC'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_CMPD_ESC...
+dimension 0: 10->13 (increases)
+    Data:
+        (10) {1, {2, {2, 2, 2}, 2}, 3, {4, 4}},
+        (11) {2, {3, {3, 3, 3}, 3}, 4, {5, 5}},
+        (12) {3, {4, {4, 4, 4}, 4}, 5, {6, 6}}
+dimension 0: 13->12 (decreases)
+dimension 0: 12->1 (decreases)
+dimension 0: 1->3 (increases)
+    Data:
+        (1) {1, {2, {2, 2, 2}, 2}, 3, {4, 4}}, {2, {3, {3, 3, 3}, 3}, 4, {5, 
+        (2)  5}}
diff --git a/hl/tools/testfiles/w-ext-cmpd-f1.ddl b/hl/tools/testfiles/w-ext-cmpd-f1.ddl
new file mode 100644
index 0000000..a722f68
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-cmpd-f1.ddl
@@ -0,0 +1,14 @@
+#############################
+ output for 'h5watch --fields=field1,field2 TEST.h5/DSET_CMPD'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_CMPD...
+dimension 0: 10->13 (increases)
+    Data:
+        (10) {1, {2, {2, 2, 2}, 2}}, {2, {3, {3, 3, 3}, 3}},
+        (12) {3, {4, {4, 4, 4}, 4}}
+dimension 0: 13->12 (decreases)
+dimension 0: 12->1 (decreases)
+dimension 0: 1->3 (increases)
+    Data:
+        (1) {1, {2, {2, 2, 2}, 2}}, {2, {3, {3, 3, 3}, 3}}
diff --git a/hl/tools/testfiles/w-ext-cmpd-f2.ddl b/hl/tools/testfiles/w-ext-cmpd-f2.ddl
new file mode 100644
index 0000000..b6561c5
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-cmpd-f2.ddl
@@ -0,0 +1,14 @@
+#############################
+ output for 'h5watch --fields=field2.b,field4 TEST.h5/DSET_CMPD'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_CMPD...
+dimension 0: 10->13 (increases)
+    Data:
+        (10) {{{2, 2, 2}}, {4, 4}}, {{{3, 3, 3}}, {5, 5}}, {{{4, 4, 4}}, {6, 
+        (12)  6}}
+dimension 0: 13->12 (decreases)
+dimension 0: 12->1 (decreases)
+dimension 0: 1->3 (increases)
+    Data:
+        (1) {{{2, 2, 2}}, {4, 4}}, {{{3, 3, 3}}, {5, 5}}
diff --git a/hl/tools/testfiles/w-ext-cmpd-ff3.ddl b/hl/tools/testfiles/w-ext-cmpd-ff3.ddl
new file mode 100644
index 0000000..c3d22f5
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-cmpd-ff3.ddl
@@ -0,0 +1,13 @@
+#############################
+ output for 'h5watch --fields=field2.b.a --fields=field2.c TEST.h5/DSET_CMPD'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_CMPD...
+dimension 0: 10->13 (increases)
+    Data:
+        (10) {{{2}}, {2}}, {{{3}}, {3}}, {{{4}}, {4}}
+dimension 0: 13->12 (decreases)
+dimension 0: 12->1 (decreases)
+dimension 0: 1->3 (increases)
+    Data:
+        (1) {{{2}}, {2}}, {{{3}}, {3}}
diff --git a/hl/tools/testfiles/w-ext-cmpd-label.ddl b/hl/tools/testfiles/w-ext-cmpd-label.ddl
new file mode 100644
index 0000000..63ac47e
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-cmpd-label.ddl
@@ -0,0 +1,21 @@
+#############################
+ output for 'h5watch --label TEST.h5/DSET_CMPD'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_CMPD...
+dimension 0: 10->13 (increases)
+    Data:
+        (10) {field1=1, field2={a=2, b={a=2, b=2, c=2}, c=2}, field3=3, 
+        (10)  field4={a=4, b=4}},
+        (11) {field1=2, field2={a=3, b={a=3, b=3, c=3}, c=3}, field3=4, 
+        (11)  field4={a=5, b=5}},
+        (12) {field1=3, field2={a=4, b={a=4, b=4, c=4}, c=4}, field3=5, 
+        (12)  field4={a=6, b=6}}
+dimension 0: 13->12 (decreases)
+dimension 0: 12->1 (decreases)
+dimension 0: 1->3 (increases)
+    Data:
+        (1) {field1=1, field2={a=2, b={a=2, b=2, c=2}, c=2}, field3=3, 
+        (1)  field4={a=4, b=4}},
+        (2) {field1=2, field2={a=3, b={a=3, b=3, c=3}, c=3}, field3=4, 
+        (2)  field4={a=5, b=5}}
diff --git a/hl/tools/testfiles/w-ext-cmpd-two-f1.ddl b/hl/tools/testfiles/w-ext-cmpd-two-f1.ddl
new file mode 100644
index 0000000..a49f9f1
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-cmpd-two-f1.ddl
@@ -0,0 +1,50 @@
+#############################
+ output for 'h5watch --fields=field1,field2 TEST.h5/DSET_CMPD_TWO'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_CMPD_TWO...
+dimension 0: 4->6 (increases)
+dimension 1: 10->12 (increases)
+    Data:
+        (0,10) {1, {1, {1, 1, 1}, 1}}, {1, {1, {1, 1, 1}, 1}}
+        (1,10) {1, {1, {1, 1, 1}, 1}}, {1, {1, {1, 1, 1}, 1}}
+        (2,10) {1, {1, {1, 1, 1}, 1}}, {1, {1, {1, 1, 1}, 1}}
+        (3,10) {1, {1, {1, 1, 1}, 1}}, {1, {1, {1, 1, 1}, 1}}
+        (4,0) {1, {1, {1, 1, 1}, 1}}, {1, {1, {1, 1, 1}, 1}},
+        (4,2) {1, {1, {1, 1, 1}, 1}}, {1, {1, {1, 1, 1}, 1}},
+        (4,4) {1, {1, {1, 1, 1}, 1}}, {1, {1, {1, 1, 1}, 1}},
+        (4,6) {1, {1, {1, 1, 1}, 1}}, {1, {1, {1, 1, 1}, 1}},
+        (4,8) {1, {1, {1, 1, 1}, 1}}, {1, {1, {1, 1, 1}, 1}},
+        (4,10) {1, {1, {1, 1, 1}, 1}}, {1, {1, {1, 1, 1}, 1}},
+        (5,0) {1, {1, {1, 1, 1}, 1}}, {1, {1, {1, 1, 1}, 1}},
+        (5,2) {1, {1, {1, 1, 1}, 1}}, {1, {1, {1, 1, 1}, 1}},
+        (5,4) {1, {1, {1, 1, 1}, 1}}, {1, {1, {1, 1, 1}, 1}},
+        (5,6) {1, {1, {1, 1, 1}, 1}}, {1, {1, {1, 1, 1}, 1}},
+        (5,8) {1, {1, {1, 1, 1}, 1}}, {1, {1, {1, 1, 1}, 1}},
+        (5,10) {1, {1, {1, 1, 1}, 1}}, {1, {1, {1, 1, 1}, 1}}
+dimension 0: 6->8 (increases)
+dimension 1: 12->1 (decreases)
+    Data:
+        (6,0) {2, {2, {2, 2, 2}, 2}},
+        (7,0) {2, {2, {2, 2, 2}, 2}}
+dimension 0: 8->10 (increases)
+dimension 1: 1->1 (unchanged)
+    Data:
+        (8,0) {3, {3, {3, 3, 3}, 3}},
+        (9,0) {3, {3, {3, 3, 3}, 3}}
+dimension 0: 10->3 (decreases)
+dimension 1: 1->3 (increases)
+    Data:
+        (0,1) {4, {4, {4, 4, 4}, 4}}, {4, {4, {4, 4, 4}, 4}}
+        (1,1) {4, {4, {4, 4, 4}, 4}}, {4, {4, {4, 4, 4}, 4}}
+        (2,1) {4, {4, {4, 4, 4}, 4}}, {4, {4, {4, 4, 4}, 4}}
+dimension 0: 3->2 (decreases)
+dimension 1: 3->2 (decreases)
+dimension 0: 2->1 (decreases)
+dimension 1: 2->2 (unchanged)
+dimension 0: 1->1 (unchanged)
+dimension 1: 2->4 (increases)
+    Data:
+        (0,2) {7, {7, {7, 7, 7}, 7}}, {7, {7, {7, 7, 7}, 7}}
+dimension 0: 1->1 (unchanged)
+dimension 1: 4->3 (decreases)
diff --git a/hl/tools/testfiles/w-ext-cmpd-two-f3.ddl b/hl/tools/testfiles/w-ext-cmpd-two-f3.ddl
new file mode 100644
index 0000000..a0ab9ac
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-cmpd-two-f3.ddl
@@ -0,0 +1,44 @@
+#############################
+ output for 'h5watch --fields=field2.b.a,field2.c TEST.h5/DSET_CMPD_TWO'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_CMPD_TWO...
+dimension 0: 4->6 (increases)
+dimension 1: 10->12 (increases)
+    Data:
+        (0,10) {{{1}}, {1}}, {{{1}}, {1}}
+        (1,10) {{{1}}, {1}}, {{{1}}, {1}}
+        (2,10) {{{1}}, {1}}, {{{1}}, {1}}
+        (3,10) {{{1}}, {1}}, {{{1}}, {1}}
+        (4,0) {{{1}}, {1}}, {{{1}}, {1}}, {{{1}}, {1}}, {{{1}}, {1}},
+        (4,4) {{{1}}, {1}}, {{{1}}, {1}}, {{{1}}, {1}}, {{{1}}, {1}},
+        (4,8) {{{1}}, {1}}, {{{1}}, {1}}, {{{1}}, {1}}, {{{1}}, {1}},
+        (5,0) {{{1}}, {1}}, {{{1}}, {1}}, {{{1}}, {1}}, {{{1}}, {1}},
+        (5,4) {{{1}}, {1}}, {{{1}}, {1}}, {{{1}}, {1}}, {{{1}}, {1}},
+        (5,8) {{{1}}, {1}}, {{{1}}, {1}}, {{{1}}, {1}}, {{{1}}, {1}}
+dimension 0: 6->8 (increases)
+dimension 1: 12->1 (decreases)
+    Data:
+        (6,0) {{{2}}, {2}},
+        (7,0) {{{2}}, {2}}
+dimension 0: 8->10 (increases)
+dimension 1: 1->1 (unchanged)
+    Data:
+        (8,0) {{{3}}, {3}},
+        (9,0) {{{3}}, {3}}
+dimension 0: 10->3 (decreases)
+dimension 1: 1->3 (increases)
+    Data:
+        (0,1) {{{4}}, {4}}, {{{4}}, {4}}
+        (1,1) {{{4}}, {4}}, {{{4}}, {4}}
+        (2,1) {{{4}}, {4}}, {{{4}}, {4}}
+dimension 0: 3->2 (decreases)
+dimension 1: 3->2 (decreases)
+dimension 0: 2->1 (decreases)
+dimension 1: 2->2 (unchanged)
+dimension 0: 1->1 (unchanged)
+dimension 1: 2->4 (increases)
+    Data:
+        (0,2) {{{7}}, {7}}, {{{7}}, {7}}
+dimension 0: 1->1 (unchanged)
+dimension 1: 4->3 (decreases)
diff --git a/hl/tools/testfiles/w-ext-cmpd-two-ff2.ddl b/hl/tools/testfiles/w-ext-cmpd-two-ff2.ddl
new file mode 100644
index 0000000..e32a818
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-cmpd-two-ff2.ddl
@@ -0,0 +1,50 @@
+#############################
+ output for 'h5watch --fields=field2.b --fields=field4 TEST.h5/DSET_CMPD_TWO'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_CMPD_TWO...
+dimension 0: 4->6 (increases)
+dimension 1: 10->12 (increases)
+    Data:
+        (0,10) {{{1, 1, 1}}, {1, 1}}, {{{1, 1, 1}}, {1, 1}}
+        (1,10) {{{1, 1, 1}}, {1, 1}}, {{{1, 1, 1}}, {1, 1}}
+        (2,10) {{{1, 1, 1}}, {1, 1}}, {{{1, 1, 1}}, {1, 1}}
+        (3,10) {{{1, 1, 1}}, {1, 1}}, {{{1, 1, 1}}, {1, 1}}
+        (4,0) {{{1, 1, 1}}, {1, 1}}, {{{1, 1, 1}}, {1, 1}},
+        (4,2) {{{1, 1, 1}}, {1, 1}}, {{{1, 1, 1}}, {1, 1}},
+        (4,4) {{{1, 1, 1}}, {1, 1}}, {{{1, 1, 1}}, {1, 1}},
+        (4,6) {{{1, 1, 1}}, {1, 1}}, {{{1, 1, 1}}, {1, 1}},
+        (4,8) {{{1, 1, 1}}, {1, 1}}, {{{1, 1, 1}}, {1, 1}},
+        (4,10) {{{1, 1, 1}}, {1, 1}}, {{{1, 1, 1}}, {1, 1}},
+        (5,0) {{{1, 1, 1}}, {1, 1}}, {{{1, 1, 1}}, {1, 1}},
+        (5,2) {{{1, 1, 1}}, {1, 1}}, {{{1, 1, 1}}, {1, 1}},
+        (5,4) {{{1, 1, 1}}, {1, 1}}, {{{1, 1, 1}}, {1, 1}},
+        (5,6) {{{1, 1, 1}}, {1, 1}}, {{{1, 1, 1}}, {1, 1}},
+        (5,8) {{{1, 1, 1}}, {1, 1}}, {{{1, 1, 1}}, {1, 1}},
+        (5,10) {{{1, 1, 1}}, {1, 1}}, {{{1, 1, 1}}, {1, 1}}
+dimension 0: 6->8 (increases)
+dimension 1: 12->1 (decreases)
+    Data:
+        (6,0) {{{2, 2, 2}}, {2, 2}},
+        (7,0) {{{2, 2, 2}}, {2, 2}}
+dimension 0: 8->10 (increases)
+dimension 1: 1->1 (unchanged)
+    Data:
+        (8,0) {{{3, 3, 3}}, {3, 3}},
+        (9,0) {{{3, 3, 3}}, {3, 3}}
+dimension 0: 10->3 (decreases)
+dimension 1: 1->3 (increases)
+    Data:
+        (0,1) {{{4, 4, 4}}, {4, 4}}, {{{4, 4, 4}}, {4, 4}}
+        (1,1) {{{4, 4, 4}}, {4, 4}}, {{{4, 4, 4}}, {4, 4}}
+        (2,1) {{{4, 4, 4}}, {4, 4}}, {{{4, 4, 4}}, {4, 4}}
+dimension 0: 3->2 (decreases)
+dimension 1: 3->2 (decreases)
+dimension 0: 2->1 (decreases)
+dimension 1: 2->2 (unchanged)
+dimension 0: 1->1 (unchanged)
+dimension 1: 2->4 (increases)
+    Data:
+        (0,2) {{{7, 7, 7}}, {7, 7}}, {{{7, 7, 7}}, {7, 7}}
+dimension 0: 1->1 (unchanged)
+dimension 1: 4->3 (decreases)
diff --git a/hl/tools/testfiles/w-ext-cmpd-two.ddl b/hl/tools/testfiles/w-ext-cmpd-two.ddl
new file mode 100644
index 0000000..90775e3
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-cmpd-two.ddl
@@ -0,0 +1,70 @@
+#############################
+ output for 'h5watch TEST.h5/DSET_CMPD_TWO'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_CMPD_TWO...
+dimension 0: 4->6 (increases)
+dimension 1: 10->12 (increases)
+    Data:
+        (0,10) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (0,11) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}}
+        (1,10) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (1,11) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}}
+        (2,10) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (2,11) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}}
+        (3,10) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (3,11) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}}
+        (4,0) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (4,1) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (4,2) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (4,3) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (4,4) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (4,5) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (4,6) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (4,7) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (4,8) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (4,9) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (4,10) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (4,11) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (5,0) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (5,1) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (5,2) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (5,3) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (5,4) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (5,5) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (5,6) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (5,7) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (5,8) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (5,9) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (5,10) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}},
+        (5,11) {1, {1, {1, 1, 1}, 1}, 1, {1, 1}}
+dimension 0: 6->8 (increases)
+dimension 1: 12->1 (decreases)
+    Data:
+        (6,0) {2, {2, {2, 2, 2}, 2}, 2, {2, 2}},
+        (7,0) {2, {2, {2, 2, 2}, 2}, 2, {2, 2}}
+dimension 0: 8->10 (increases)
+dimension 1: 1->1 (unchanged)
+    Data:
+        (8,0) {3, {3, {3, 3, 3}, 3}, 3, {3, 3}},
+        (9,0) {3, {3, {3, 3, 3}, 3}, 3, {3, 3}}
+dimension 0: 10->3 (decreases)
+dimension 1: 1->3 (increases)
+    Data:
+        (0,1) {4, {4, {4, 4, 4}, 4}, 4, {4, 4}},
+        (0,2) {4, {4, {4, 4, 4}, 4}, 4, {4, 4}}
+        (1,1) {4, {4, {4, 4, 4}, 4}, 4, {4, 4}},
+        (1,2) {4, {4, {4, 4, 4}, 4}, 4, {4, 4}}
+        (2,1) {4, {4, {4, 4, 4}, 4}, 4, {4, 4}},
+        (2,2) {4, {4, {4, 4, 4}, 4}, 4, {4, 4}}
+dimension 0: 3->2 (decreases)
+dimension 1: 3->2 (decreases)
+dimension 0: 2->1 (decreases)
+dimension 1: 2->2 (unchanged)
+dimension 0: 1->1 (unchanged)
+dimension 1: 2->4 (increases)
+    Data:
+        (0,2) {7, {7, {7, 7, 7}, 7}, 7, {7, 7}},
+        (0,3) {7, {7, {7, 7, 7}, 7}, 7, {7, 7}}
+dimension 0: 1->1 (unchanged)
+dimension 1: 4->3 (decreases)
diff --git a/hl/tools/testfiles/w-ext-cmpd.ddl b/hl/tools/testfiles/w-ext-cmpd.ddl
new file mode 100644
index 0000000..5512d17
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-cmpd.ddl
@@ -0,0 +1,16 @@
+#############################
+ output for 'h5watch TEST.h5/DSET_CMPD'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_CMPD...
+dimension 0: 10->13 (increases)
+    Data:
+        (10) {1, {2, {2, 2, 2}, 2}, 3, {4, 4}},
+        (11) {2, {3, {3, 3, 3}, 3}, 4, {5, 5}},
+        (12) {3, {4, {4, 4, 4}, 4}, 5, {6, 6}}
+dimension 0: 13->12 (decreases)
+dimension 0: 12->1 (decreases)
+dimension 0: 1->3 (increases)
+    Data:
+        (1) {1, {2, {2, 2, 2}, 2}, 3, {4, 4}}, {2, {3, {3, 3, 3}, 3}, 4, {5, 
+        (2)  5}}
diff --git a/hl/tools/testfiles/w-ext-early.ddl b/hl/tools/testfiles/w-ext-early.ddl
new file mode 100644
index 0000000..a822540
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-early.ddl
@@ -0,0 +1,13 @@
+#############################
+ output for 'h5watch TEST.h5/DSET_ALLOC_EARLY'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_ALLOC_EARLY...
+dimension 0: 10->13 (increases)
+    Data:
+        (10) 0, 1, 2
+dimension 0: 13->12 (decreases)
+dimension 0: 12->1 (decreases)
+dimension 0: 1->3 (increases)
+    Data:
+        (1) 0, 1
diff --git a/hl/tools/testfiles/w-ext-late.ddl b/hl/tools/testfiles/w-ext-late.ddl
new file mode 100644
index 0000000..724562f
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-late.ddl
@@ -0,0 +1,13 @@
+#############################
+ output for 'h5watch TEST.h5/DSET_ALLOC_LATE'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_ALLOC_LATE...
+dimension 0: 10->13 (increases)
+    Data:
+        (10) 0, 1, 2
+dimension 0: 13->12 (decreases)
+dimension 0: 12->1 (decreases)
+dimension 0: 1->3 (increases)
+    Data:
+        (1) 0, 1
diff --git a/hl/tools/testfiles/w-ext-one-d.ddl b/hl/tools/testfiles/w-ext-one-d.ddl
new file mode 100644
index 0000000..55d55ca
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-one-d.ddl
@@ -0,0 +1,9 @@
+#############################
+ output for 'h5watch --dim TEST.h5/DSET_ONE'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_ONE...
+dimension 0: 10->13 (increases)
+dimension 0: 13->12 (decreases)
+dimension 0: 12->1 (decreases)
+dimension 0: 1->3 (increases)
diff --git a/hl/tools/testfiles/w-ext-one-simple.ddl b/hl/tools/testfiles/w-ext-one-simple.ddl
new file mode 100644
index 0000000..f657748
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-one-simple.ddl
@@ -0,0 +1,16 @@
+#############################
+ output for 'h5watch --simple TEST.h5/DSET_ONE'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_ONE...
+dimension 0: 10->13 (increases)
+    Data:
+        0 
+        1 
+        2
+dimension 0: 13->12 (decreases)
+dimension 0: 12->1 (decreases)
+dimension 0: 1->3 (increases)
+    Data:
+        0 
+        1
diff --git a/hl/tools/testfiles/w-ext-one.ddl b/hl/tools/testfiles/w-ext-one.ddl
new file mode 100644
index 0000000..b46392e
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-one.ddl
@@ -0,0 +1,13 @@
+#############################
+ output for 'h5watch TEST.h5/DSET_ONE'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_ONE...
+dimension 0: 10->13 (increases)
+    Data:
+        (10) 0, 1, 2
+dimension 0: 13->12 (decreases)
+dimension 0: 12->1 (decreases)
+dimension 0: 1->3 (increases)
+    Data:
+        (1) 0, 1
diff --git a/hl/tools/testfiles/w-ext-two-d.ddl b/hl/tools/testfiles/w-ext-two-d.ddl
new file mode 100644
index 0000000..dda09e6
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-two-d.ddl
@@ -0,0 +1,21 @@
+#############################
+ output for 'h5watch --dim TEST.h5/DSET_TWO'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_TWO...
+dimension 0: 4->6 (increases)
+dimension 1: 10->12 (increases)
+dimension 0: 6->8 (increases)
+dimension 1: 12->1 (decreases)
+dimension 0: 8->10 (increases)
+dimension 1: 1->1 (unchanged)
+dimension 0: 10->3 (decreases)
+dimension 1: 1->3 (increases)
+dimension 0: 3->2 (decreases)
+dimension 1: 3->2 (decreases)
+dimension 0: 2->1 (decreases)
+dimension 1: 2->2 (unchanged)
+dimension 0: 1->1 (unchanged)
+dimension 1: 2->4 (increases)
+dimension 0: 1->1 (unchanged)
+dimension 1: 4->3 (decreases)
diff --git a/hl/tools/testfiles/w-ext-two-width.ddl b/hl/tools/testfiles/w-ext-two-width.ddl
new file mode 100644
index 0000000..47e9221
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-two-width.ddl
@@ -0,0 +1,44 @@
+#############################
+ output for 'h5watch --width=30 TEST.h5/DSET_TWO'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_TWO...
+dimension 0: 4->6 (increases)
+dimension 1: 10->12 (increases)
+    Data:
+        (0,10) 1, 1
+        (1,10) 1, 1
+        (2,10) 1, 1
+        (3,10) 1, 1
+        (4,0) 1, 1, 1, 1, 1,
+        (4,5) 1, 1, 1, 1, 1,
+        (4,10) 1, 1,
+        (5,0) 1, 1, 1, 1, 1,
+        (5,5) 1, 1, 1, 1, 1,
+        (5,10) 1, 1
+dimension 0: 6->8 (increases)
+dimension 1: 12->1 (decreases)
+    Data:
+        (6,0) 2,
+        (7,0) 2
+dimension 0: 8->10 (increases)
+dimension 1: 1->1 (unchanged)
+    Data:
+        (8,0) 3,
+        (9,0) 3
+dimension 0: 10->3 (decreases)
+dimension 1: 1->3 (increases)
+    Data:
+        (0,1) 4, 4
+        (1,1) 4, 4
+        (2,1) 4, 4
+dimension 0: 3->2 (decreases)
+dimension 1: 3->2 (decreases)
+dimension 0: 2->1 (decreases)
+dimension 1: 2->2 (unchanged)
+dimension 0: 1->1 (unchanged)
+dimension 1: 2->4 (increases)
+    Data:
+        (0,2) 7, 7
+dimension 0: 1->1 (unchanged)
+dimension 1: 4->3 (decreases)
diff --git a/hl/tools/testfiles/w-ext-two.ddl b/hl/tools/testfiles/w-ext-two.ddl
new file mode 100644
index 0000000..a98d333
--- /dev/null
+++ b/hl/tools/testfiles/w-ext-two.ddl
@@ -0,0 +1,40 @@
+#############################
+ output for 'h5watch TEST.h5/DSET_TWO'
+#############################
+Opened "TEST.h5" with sec2 driver.
+Monitoring dataset /DSET_TWO...
+dimension 0: 4->6 (increases)
+dimension 1: 10->12 (increases)
+    Data:
+        (0,10) 1, 1
+        (1,10) 1, 1
+        (2,10) 1, 1
+        (3,10) 1, 1
+        (4,0) 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+        (5,0) 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+dimension 0: 6->8 (increases)
+dimension 1: 12->1 (decreases)
+    Data:
+        (6,0) 2,
+        (7,0) 2
+dimension 0: 8->10 (increases)
+dimension 1: 1->1 (unchanged)
+    Data:
+        (8,0) 3,
+        (9,0) 3
+dimension 0: 10->3 (decreases)
+dimension 1: 1->3 (increases)
+    Data:
+        (0,1) 4, 4
+        (1,1) 4, 4
+        (2,1) 4, 4
+dimension 0: 3->2 (decreases)
+dimension 1: 3->2 (decreases)
+dimension 0: 2->1 (decreases)
+dimension 1: 2->2 (unchanged)
+dimension 0: 1->1 (unchanged)
+dimension 1: 2->4 (increases)
+    Data:
+        (0,2) 7, 7
+dimension 0: 1->1 (unchanged)
+dimension 1: 4->3 (decreases)
diff --git a/hl/tools/testfiles/w-help1.ddl b/hl/tools/testfiles/w-help1.ddl
new file mode 100644
index 0000000..8e75242
--- /dev/null
+++ b/hl/tools/testfiles/w-help1.ddl
@@ -0,0 +1,38 @@
+#############################
+ output for 'h5watch --help'
+#############################
+Usage: h5watch [OPTIONS] [OBJECT]
+
+     OPTIONS
+        --help            Print a usage message and exit.
+        --version         Print version number and exit.
+        --label           Label members of compound typed dataset.
+        --simple          Use a machine-readable output format.
+        --dim             Monitor changes in size of dataset dimensions only.
+        --width=N         Set the number of columns to N for output.
+                              A value of 0 sets the number of columns to the
+                              maximum (65535). The default width is 80 columns.
+        --polling=N       Set the polling interval to N (in seconds) when the
+                              dataset will be checked for appended data.  The default
+                              polling interval is 1.
+        --fields=<list_of_fields>
+                              Display data for the fields specified in <list_of_fields>
+                              for a compound data type.  <list_of_fields> can be
+                              specified as follows:
+                                   1) A comma-separated list of field names in a
+                                   compound data type.  "," is the separator
+                                   for field names while "." is the separator
+                                   for a nested field.
+                                   2) A single field name in a compound data type.
+                                   Can use this option multiple times.
+                              Note that backslash is the escape character to avoid
+                              characters in field names that conflict with the tool's
+                              separators.
+
+     OBJECT is specified as [<filename>/<path_to_dataset>/<dsetname>]
+        <filename>            Name of the HDF5 file.  It may be preceded by path
+                              separated by slashes to the specified HDF5 file.
+        <path_to_dataset>     Path separated by slashes to the specified dataset
+        <dsetname>            Name of the dataset
+
+     User can end the h5watch process by ctrl-C (SIGINT) or kill the process (SIGTERM).
diff --git a/html/ADGuide.html b/html/ADGuide.html
index eac8a2d..9d8d0c5 100644
--- a/html/ADGuide.html
+++ b/html/ADGuide.html
@@ -323,10 +323,10 @@
 </table>
 </center>
 <hr>
-<!-- #EndLibraryItem -->
+<!-- #EndLibraryItem --><address>
 
 <?php include("./ed_libs/Footer.htm"); ?>
- 
+
 Last modified:  5 November 2015
 
 <br />
diff --git a/html/ADGuide/Changes.html b/html/ADGuide/Changes.html
index 0e80e80..b5179a3 100755
--- a/html/ADGuide/Changes.html
+++ b/html/ADGuide/Changes.html
@@ -191,7 +191,51 @@ in the transition from HDF5 Release 1.8.15 to Release 1.8.16.
 <br />
 -->
 
- 
+
+
+<font color="red">
+    <h3>Editing Required Prior to Release 1.10.0:</h3>
+        <dl>    
+            <dd>Note to technical editor: 
+                <br>
+                Remove red comments in file image operations RM entries 
+                if review and update are not completed prior to 1.10.0.
+<pre>
+    RM/H5F/H5Fget_file_image.htm
+    RM/H5P/H5Pset_file_image.htm
+    RM/H5P/H5Pget_file_image_callbacks.htm
+    RM/H5P/H5Pset_file_image_callbacks.htm
+    RM/H5P/H5Pget_file_image.htm
+</pre>
+        </dl>    
+
+    <h3>Deprecated Function</h3>
+        <dir>
+
+<i>Potential entry, depending on development decision:</i>
+<p>
+
+        <dl>    
+            <dt>The following C function has been deprecated:
+                </dt>
+            <dd>
+                <li><a href="../RM/RM_H5P.html#Property-SetFcplMulti">
+                    <code>H5Pset_fapl_multi</code></a> 
+                <li><i>[Which will affect the file drivers discussion in 
+                    <a href="../RM/Tools.html#Tools-h5dump">
+                    <code>h5dump</code></a>.]</i>
+                </dd>
+                    <p>
+                    This function may be removed from the library
+                    in a future release.
+        </dl>    
+        </dir>
+
+</font>
+
+
+
+
 <a name="1816">
 <h2>Release 1.8.16 of November 2015 (current release) versus Release 1.8.15</h2>
 </a>
@@ -394,81 +438,22 @@ in the transition from HDF5 Release 1.8.15 to Release 1.8.16.
         </dl>
         </dir>
 
-    <h3>Compatibility Notes and Report</h3>
+    <h3>Compatibility Report and Comments</h3>
         <dir>
         <dl>    
-            <dt><strong>Decoupled shared object version numbers 
-                (<code>soname</code>)</strong>
-                </dt>
-                <dd>Shared object version numbers, <code>soname</code>, 
-                    for HDF5 wrapper libraries, 
-                    such as the C++ and Fortran libraries, 
-                    have been decoupled from the shared object version 
-                    number for the HDF5 library.  
-                    In this and future releases, each library’s
-                    <code>soname</code> will be maintained on an 
-                    individual basis according to the interface changes 
-                    specific to each wrapper library.
-                    <p />
-                </dd>
-
-            <dt><strong>Changed shared library interface version 
-                numbers (<code>soname</code>)</strong>
-                </dt>
-                <dd>
-                    For HDF5 Release 1.8.16, the shared object version number 
-                    have changed as follows.
-                    <dir>
-                    <table width="100%" border="0">
-                    <tr valign="top" align="left">
-                      <th>Library</td>
-                      <th>Release 1.8.15  </td>
-                      <th>Release 1.8.16  </td>
-                      <th>Reason for Change</td>
-                    </tr>
-                    <tr valign="top" align="left">
-                      <td>HDF5 Library  </td>
-                      <td>10.0.1</td>
-                      <td>10.1.0</td>
-                      <td>Added APIs</td>
-                    </tr>
-                    <tr valign="top" align="left">
-                      <td>C++ Library</td>
-                      <td>10.0.1</td>
-                      <td>11.0.0</td>
-                      <td>Changes in existing APIs</td>
-                    </tr>
-                    <tr valign="top" align="left">
-                      <td>High‐level C++ Library</td>
-                      <td>10.0.1</td>
-                      <td>11.0.0</td>
-                      <td>Changes in existing APIs</td>
-                    </tr>
-                    <tr valign="top" align="left">
-                      <td>All others</td>
-                      <td>10.0.1</td>
-                      <td>10.0.2</td>
-                      <td>Code changes that did not result in interface changes</td>
-                    </tr>
-                    </table>
-                    </dir>
-                    <p />
-                </dd>
-
             <dt><strong>Compatibility report for Release 1.8.16 versus 
                 Release 1.8.15</strong>
                 </dt>
                 <dd>
-                    The following interface compatibility report 
-                    provides a full list of the changed symbols:
-                    <p />
                     <a href="Compatibility_Report/CR_1.8.16.html">API 
                     compatibility report for the HDF5 Library 
                     between 1.8.15 and 1.8.16 versions on 
                     x86</a>
                 </dd>
 
-<!--
+
+
+
             <p>
             <dt><strong>Changed shared library interface version 
                 number (<code>soname</code>)</strong>
@@ -478,12 +463,11 @@ in the transition from HDF5 Release 1.8.15 to Release 1.8.16.
                     < More detailed description of changes >
 
                     <p> 
-                    Due to these changes, some shared library interface version 
-                    numbers (<code>soname</code>) have been increased.
+                    Due to these changes, the shared library interface version 
+                    number (<code>soname</code>) has been increased.
                     For a full list of the changed symbols, see the
                     interface compatibility report linked immediately above.
                 </dd>
--->
 
 
 <!--
@@ -937,7 +921,7 @@ Release to Release for HDF5 Releases 1.4.0 through 1.6.10</a>”.
 <!-- Created: Spring 1999 -->
 <!-- hhmts start -->
 <hr />
-Last modified: 10 November 2015
+Last modified: 4 November 2015
 <!-- hhmts end -->
 <br />
 <br />
@@ -945,3 +929,6 @@ Last modified: 10 November 2015
 
 </body>
 </html>
+
+
+
diff --git a/html/ADGuide/Changes_1_4-1_6.html b/html/ADGuide/Changes_1_4-1_6.html
old mode 100755
new mode 100644
diff --git a/html/ADGuide/Changes_1_8_x.html b/html/ADGuide/Changes_1_8_x.html
old mode 100755
new mode 100644
diff --git a/html/ADGuide/Compatibility_Report/CR_1.8.14.html b/html/ADGuide/Compatibility_Report/CR_1.8.14.html
deleted file mode 100644
index 7ad4130..0000000
--- a/html/ADGuide/Compatibility_Report/CR_1.8.14.html
+++ /dev/null
@@ -1,1176 +0,0 @@
-<!-- kind:binary;verdict:incompatible;affected:0.8;added:31;removed:14;type_problems_high:0;type_problems_medium:0;type_problems_low:1;interface_problems_high:0;interface_problems_medium:0;interface_problems_low:0;changed_constants:6;tool_version:1.99.9 -->
-<!-- kind:source;verdict:incompatible;affected:1.7;added:31;removed:31;type_problems_high:0;type_problems_medium:0;type_problems_low:1;interface_problems_high:0;interface_problems_medium:0;interface_problems_low:0;changed_constants:43;tool_version:1.99.9 -->
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-    <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    <meta name="keywords" content="hdf5, compatibility, API, report" />
-    <meta name="description" content="Compatibility report for the hdf5 library between 1.8.13 and 1.8.14 versions" />
-    <title>
-        hdf5: 1.8.13 to 1.8.14 compatibility report
-    </title>
-    <style type="text/css">
-    body {
-    font-family:Arial, sans-serif;
-    color:Black;
-    font-size:14px;
-}
-hr {
-    color:Black;
-    background-color:Black;
-    height:1px;
-    border:0;
-}
-h1 {
-    margin-bottom:0px;
-    padding-bottom:0px;
-    font-size:26px;
-}
-h2 {
-    margin-bottom:0px;
-    padding-bottom:0px;
-    font-size:20px;
-    white-space:nowrap;
-}
-span.section {
-    font-weight:bold;
-    cursor:pointer;
-    font-size:16px;
-    color:#003E69;
-    white-space:nowrap;
-    margin-left:5px;
-}
-span.new_sign {
-    font-weight:bold;
-    margin-left:26px;
-    font-size:16px;
-    color:#003E69;
-}
-span.new_sign_lbl {
-    margin-left:28px;
-    font-size:14px;
-    color:Black;
-}
-span:hover.section {
-    color:#336699;
-}
-span.section_affected {
-    cursor:pointer;
-    margin-left:7px;
-    padding-left:15px;
-    font-size:14px;
-    color:#cc3300;
-}
-span.section_info {
-    cursor:pointer;
-    margin-left:7px;
-    padding-left:15px;
-    font-size:14px;
-    color:Black;
-}
-span.extendable {
-    font-weight:100;
-    font-size:16px;
-}
-span.h_name {
-    color:#cc3300;
-    font-size:14px;
-    font-weight:bold;
-}
-div.h_list {
-    font-size:15px;
-    padding-left:5px;
-}
-span.ns {
-    color:#408080;
-    font-size:15px;
-}
-div.lib_list {
-    font-size:15px;
-    padding-left:5px;
-}
-span.lib_name {
-    color:Green;
-    font-size:14px;
-    font-weight:bold;
-}
-span.iname {
-    font-weight:bold;
-    font-size:16px;
-    color:#003E69;
-    margin-left:5px;
-}
-span.iname_b {
-    font-weight:bold;
-    font-size:15px;
-}
-span.iname_a {
-    color:#333333;
-    font-weight:bold;
-    font-size:15px;
-}
-span.sym_p {
-    font-weight:normal;
-    white-space:normal;
-}
-div.affect {
-    padding-left:15px;
-    padding-bottom:4px;
-    font-size:14px;
-    font-style:italic;
-    line-height:13px;
-}
-div.affected {
-    padding-left:30px;
-    padding-top:5px;
-}
-table.ptable {
-    border-collapse:collapse;
-    border:1px outset black;
-    line-height:16px;
-    margin-left:15px;
-    margin-top:3px;
-    margin-bottom:3px;
-    width:900px;
-}
-table.ptable td {
-    border:1px solid gray;
-    padding: 3px;
-}
-table.vtable {
-    border-collapse:collapse;
-    border:1px outset black;
-    line-height:16px;
-    margin-left:30px;
-    margin-top:10px;
-    width:100px;
-}
-table.vtable td {
-    border:1px solid gray;
-    white-space:nowrap;
-    padding: 3px;
-}
-table.ptable th, table.vtable th {
-    background-color:#eeeeee;
-    font-weight:bold;
-    color:#333333;
-    font-family:Verdana, Arial;
-    font-size:13px;
-    border:1px solid gray;
-    text-align:center;
-    vertical-align:top;
-    white-space:nowrap;
-    padding: 3px;
-}
-table.summary {
-    border-collapse:collapse;
-    border:1px outset black;
-}
-table.summary th {
-    background-color:#eeeeee;
-    font-weight:100;
-    text-align:left;
-    font-size:15px;
-    white-space:nowrap;
-    border:1px inset gray;
-    padding: 3px;
-}
-table.summary td {
-    text-align:right;
-    font-size:16px;
-    white-space:nowrap;
-    border:1px inset gray;
-    padding: 3px 5px 3px 10px;
-}
-table.code_view {
-    cursor:text;
-    margin-top:7px;
-    margin-left:15px;
-    font-family:Monaco, Consolas, 'DejaVu Sans Mono', 'Droid Sans Mono', Monospace;
-    font-size:14px;
-    padding:10px;
-    border:1px solid #e0e8e5;
-    color:#444444;
-    background-color:#eff3f2;
-    overflow:auto;
-}
-table.code_view td {
-    padding-left:15px;
-    text-align:left;
-    white-space:nowrap;
-}
-span.mangled {
-    padding-left:15px;
-    font-size:14px;
-    cursor:text;
-    color:#444444;
-}
-span.sym_ver {
-    color:#333333;
-    white-space:nowrap;
-    font-family:"DejaVu Sans Mono", Monospace;
-}
-span.attr {
-    color:#333333;
-    font-weight:100;
-}
-span.color_p {
-    font-style:italic;
-    color:Brown;
-}
-span.param {
-    font-style:italic;
-}
-span.focus_p {
-    font-style:italic;
-    color:Red;
-}
-span.ttype {
-    font-weight:100;
-}
-span.nowrap {
-    white-space:nowrap;
-}
-span.value {
-    white-space:nowrap;
-    font-weight:bold;
-}
-td.passed {
-    background-color:#CCFFCC;
-}
-td.warning {
-    background-color:#F4F4AF;
-}
-td.failed {
-    background-color:#FFCCCC;
-}
-td.new {
-    background-color:#C6DEFF;
-}
-.tabset {
-    float:left;
-}
-a.tab {
-    border:1px solid #AAA;
-    float:left;
-    margin:0px 5px -1px 0px;
-    padding:3px 5px 3px 5px;
-    position:relative;
-    font-size:14px;
-    background-color:#DDD;
-    text-decoration:none;
-    color:Black;
-}
-a.disabled:hover
-{
-    color:Black;
-    background:#EEE;
-}
-a.active:hover
-{
-    color:Black;
-    background:White;
-}
-a.active {
-    border-bottom-color:White;
-    background-color:White;
-}
-div.tab {
-    border:1px solid #AAA;
-    padding:0 7px 0 12px;
-    width:97%;
-    clear:both;
-}
-    </style>
-    <script type="text/javascript" language="JavaScript">
-    <!--
-    function showContent(header, id)
-{
-    e = document.getElementById(id);
-    if(e.style.display == 'none')
-    {
-        e.style.display = 'block';
-        e.style.visibility = 'visible';
-        header.innerHTML = header.innerHTML.replace(/\[[^0-9 ]\]/gi,"[−]");
-    }
-    else
-    {
-        e.style.display = 'none';
-        e.style.visibility = 'hidden';
-        header.innerHTML = header.innerHTML.replace(/\[[^0-9 ]\]/gi,"[+]");
-    }
-}
-function initTabs()
-{
-    var url = window.location.href;
-    if(url.indexOf('_Source_')!=-1 || url.indexOf('#Source')!=-1)
-    {
-        var tab1 = document.getElementById('BinaryID');
-        var tab2 = document.getElementById('SourceID');
-        tab1.className='tab disabled';
-        tab2.className='tab active';
-    }
-    var sets = document.getElementsByTagName('div');
-    for (var i = 0; i < sets.length; i++)
-    {
-        if (sets[i].className.indexOf('tabset') != -1)
-        {
-            var tabs = [];
-            var links = sets[i].getElementsByTagName('a');
-            for (var j = 0; j < links.length; j++)
-            {
-                if (links[j].className.indexOf('tab') != -1)
-                {
-                    tabs.push(links[j]);
-                    links[j].tabs = tabs;
-                    var tab = document.getElementById(links[j].href.substr(links[j].href.indexOf('#') + 1));
-                    //reset all tabs on start
-                    if (tab)
-                    {
-                        if (links[j].className.indexOf('active')!=-1) {
-                            tab.style.display = 'block';
-                        }
-                        else {
-                            tab.style.display = 'none';
-                        }
-                    }
-                    links[j].onclick = function()
-                    {
-                        var tab = document.getElementById(this.href.substr(this.href.indexOf('#') + 1));
-                        if (tab)
-                        {
-                            //reset all tabs before change
-                            for (var k = 0; k < this.tabs.length; k++)
-                            {
-                                document.getElementById(this.tabs[k].href.substr(this.tabs[k].href.indexOf('#') + 1)).style.display = 'none';
-                                this.tabs[k].className = this.tabs[k].className.replace('active', 'disabled');
-                            }
-                            this.className = 'tab active';
-                            tab.style.display = 'block';
-                            // window.location.hash = this.id.replace('ID', '');
-                            return false;
-                        }
-                    }
-                }
-            }
-        }
-    }
-    if(url.indexOf('#')!=-1) {
-        location.href=location.href;
-    }
-}
-if (window.addEventListener) window.addEventListener('load', initTabs, false);
-else if (window.attachEvent) window.attachEvent('onload', initTabs);
-    -->
-    </script>
-    </head><body><a name='Source'></a><a name='Binary'></a><a name='Top'></a><h1><span class='nowrap'>API compatibility report for the <span style='color:Blue;'>hdf5</span> library</span> <span class='nowrap'> between <span style='color:Red;'>1.8.13</span> and <span style='color:Red;'>1.8.14</span> versions on <span style='color:Blue;'>x86</span></span></h1>
-
-            <br/><div class='tabset'>
-            <a id='BinaryID' href='#BinaryTab' class='tab active'>Binary<br/>Compatibility</a>
-            <a id='SourceID' href='#SourceTab' style='margin-left:3px' class='tab disabled'>Source<br/>Compatibility</a>
-            </div><div id='BinaryTab' class='tab'>
-<h2>Test Info</h2><hr/>
-<table class='summary'>
-<tr><th>Library Name</th><td>hdf5</td></tr>
-<tr><th>Version #1</th><td>1.8.13</td></tr>
-<tr><th>Version #2</th><td>1.8.14</td></tr>
-<tr><th>CPU Type</th><td>x86</td></tr>
-<tr><th>GCC Version</th><td>4.1.2</td></tr>
-<tr><th>Subject</th><td width='150px'>Binary Compatibility</td></tr>
-</table>
-<h2>Test Results</h2><hr/>
-<table class='summary'><tr><th>Total Header Files</th><td><a href='#Headers' style='color:Blue;'>75</a></td></tr>
-<tr><th>Total Shared Libraries</th><td><a href='#Libs' style='color:Blue;'>6</a></td></tr>
-<tr><th>Total Symbols / Types</th><td>1754 / 540</td></tr>
-<tr><th>Verdict</th><td><span style='color:Red;'><b>Incompatible<br/>(0.8%)</b></span></td></tr>
-</table>
-<h2>Problem Summary</h2><hr/>
-<table class='summary'><tr><th></th><th style='text-align:center;'>Severity</th><th style='text-align:center;'>Count</th></tr><tr><th>Added Symbols</th><td>-</td><td class='new'><a href='#Binary_Added' style='color:Blue;'>31</a></td></tr>
-<tr><th>Removed Symbols</th><td>High</td><td class='failed'><a href='#Binary_Removed' style='color:Blue;'>14</a></td></tr>
-<tr><th rowspan='3'>Problems with<br/>Data Types</th><td>High</td><td>0</td></tr>
-<tr><td>Medium</td><td>0</td></tr>
-<tr><td>Low</td><td class='warning'><a href='#Type_Binary_Problems_Low' style='color:Blue;'>1</a></td></tr>
-<tr><th rowspan='3'>Problems with<br/>Symbols</th><td>High</td><td>0</td></tr>
-<tr><td>Medium</td><td>0</td></tr>
-<tr><td>Low</td><td>0</td></tr>
-<tr><th>Problems with<br/>Constants</th><td>Low</td><td class='warning'><a href='#Constant_Binary_Problems_Low' style='color:Blue;'>6</a></td></tr>
-<tr><th>Other Changes<br/>in Constants</th><td>-</td><td class='passed'><a href='#Other_Binary_Changes_In_Constants' style='color:Blue;'>1</a></td></tr>
-</table>
-
-<a name='Binary_Added'></a><h2>Added Symbols (31)</h2><hr/>
-<span class='h_name'>H5Ppublic.h</span>, <span class='lib_name'>libhdf5.so.9.0.0</span><br/>
-<span class="iname">H5P_CLS_ATTRIBUTE_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_DATASET_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_DATASET_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_DATASET_XFER_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_DATATYPE_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_DATATYPE_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_FILE_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_FILE_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_FILE_MOUNT_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_GROUP_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_GROUP_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_LINK_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_LINK_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_OBJECT_COPY_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_OBJECT_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_ROOT_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_STRING_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_ATTRIBUTE_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATASET_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATASET_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATASET_XFER_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATATYPE_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATATYPE_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_FILE_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_FILE_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_FILE_MOUNT_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_GROUP_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_GROUP_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_LINK_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_LINK_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_OBJECT_COPY_ID_g <span class='attr'>[data]</span></span><br/>
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Binary_Removed'></a><a name='Binary_Withdrawn'></a><h2>Removed Symbols (14)</h2><hr/>
-<span class='h_name'>H5Ppublic.h</span>, <span class='lib_name'>libhdf5.so.8.0.2</span><br/>
-<span class="iname">H5P_LST_ATTRIBUTE_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATASET_ACCESS_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATASET_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATASET_XFER_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATATYPE_ACCESS_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATATYPE_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_FILE_ACCESS_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_FILE_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_FILE_MOUNT_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_GROUP_ACCESS_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_GROUP_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_LINK_ACCESS_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_LINK_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_OBJECT_COPY_g <span class='attr'>[data]</span></span><br/>
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Low_Risk_Binary_Problems'></a><a name='Type_Binary_Problems_Low'></a>
-<h2>Problems with Data Types, Low Severity (1)</h2><hr/>
-<span class='h_name'>H5Lpublic.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_1')">
-<span class='extendable'>[+]</span> <span class='ttype'>typedef</span> H5L_traverse_func_t (1)</span>
-<br/>
-<div id="c_1" style="display:none;">
-<table class='ptable'><tr>
-<th width='2%'></th><th width='47%'>Change</th>
-<th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Base type has been changed from <span class='value'>herr_t(*)(char const*,hid_t,void const*,size_t,hid_t)</span> to <span class='value'>hid_t(*)(char const*,hid_t,void const*,size_t,hid_t)</span>.</td><td align='left' valign='top'>Replacement of the base data type may indicate a change in its semantic meaning.</td></tr>
-</table>
-<span class="section_affected" onclick="javascript:showContent(this, 'c_2')">
-[+] affected symbols (1)</span>
-<div id="c_2" style="display:none;">
-<div class='affected'><span class='iname_a'>H5Lregister <span class='sym_p'>( <span class='nowrap'>struct H5L_class_t const* <span class='focus_p'>cls</span> )</span></span></span><br/><div class='affect'>Field 'cls->trav_func' in 1st parameter 'cls' (pointer) has type 'H5L_traverse_func_t'.</div>
-</div></div>
-<br/><br/></div>
-
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Constant_Binary_Problems_Low'></a><h2>Problems with Constants, Low Severity (6)</h2><hr/>
-<span class='h_name'>H5Dpublic.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_3')">
-<span class='extendable'>[+]</span> H5D_CHUNK_CACHE_W0_DEFAULT</span>
-<br/>
-<div id="c_3" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5D_CHUNK_CACHE_W0_DEFAULT</b> has been changed from <b>-1.</b> to <b>(-1.0f)</b>.</td><td align='left' valign='top'>Applications will pass an old value of this constant as the parameter to the new-version library functions, that expect a new one. This may result in crash of incorrect behavior of applications.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5Epublic.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_4')">
-<span class='extendable'>[+]</span> H5E_DEFAULT</span>
-<br/>
-<div id="c_4" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5E_DEFAULT</b> has been changed from <b>0</b> to <b>(hid_t)0</b>.</td><td align='left' valign='top'>Applications will pass an old value of this constant as the parameter to the new-version library functions, that expect a new one. This may result in crash of incorrect behavior of applications.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5Gpublic.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_5')">
-<span class='extendable'>[+]</span> H5G_SAME_LOC</span>
-<br/>
-<div id="c_5" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5G_SAME_LOC</b> has been changed from <b>0</b> to <b>(hid_t)0</b>.</td><td align='left' valign='top'>Applications will pass an old value of this constant as the parameter to the new-version library functions, that expect a new one. This may result in crash of incorrect behavior of applications.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5Lpublic.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_6')">
-<span class='extendable'>[+]</span> H5L_SAME_LOC</span>
-<br/>
-<div id="c_6" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5L_SAME_LOC</b> has been changed from <b>0</b> to <b>(hid_t)0</b>.</td><td align='left' valign='top'>Applications will pass an old value of this constant as the parameter to the new-version library functions, that expect a new one. This may result in crash of incorrect behavior of applications.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5public.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_7')">
-<span class='extendable'>[+]</span> H5P_DEFAULT</span>
-<br/>
-<div id="c_7" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_DEFAULT</b> has been changed from <b>0</b> to <b>(hid_t)0</b>.</td><td align='left' valign='top'>Applications will pass an old value of this constant as the parameter to the new-version library functions, that expect a new one. This may result in crash of incorrect behavior of applications.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5Spublic.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_8')">
-<span class='extendable'>[+]</span> H5S_ALL</span>
-<br/>
-<div id="c_8" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5S_ALL</b> has been changed from <b>0</b> to <b>(hid_t)0</b>.</td><td align='left' valign='top'>Applications will pass an old value of this constant as the parameter to the new-version library functions, that expect a new one. This may result in crash of incorrect behavior of applications.</td></tr>
-</table><br/></div>
-
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Other_Binary_Changes'></a><a name='Other_Binary_Changes_In_Constants'></a><h2>Other Changes in Constants (1)</h2><hr/>
-<span class='h_name'>H5pubconf.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_9')">
-<span class='extendable'>[+]</span> H5_HAVE_ASPRINTF</span>
-<br/>
-<div id="c_9" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_ASPRINTF</b> with value <b>1</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Headers'></a><h2>Header Files (75)</h2><hr/>
-<div class='h_list'>
-H5AbstractDs.h<br/>
-H5ACpublic.h<br/>
-H5api_adpt.h<br/>
-H5Apublic.h<br/>
-H5ArrayType.h<br/>
-H5AtomType.h<br/>
-H5Attribute.h<br/>
-H5Classes.h<br/>
-H5CommonFG.h<br/>
-H5CompType.h<br/>
-H5Cpp.h<br/>
-H5CppDoc.h<br/>
-H5Cpublic.h<br/>
-H5DataSet.h<br/>
-H5DataSpace.h<br/>
-H5DataType.h<br/>
-H5DcreatProp.h<br/>
-H5DOpublic.h<br/>
-H5Dpublic.h<br/>
-H5DSpublic.h<br/>
-H5DxferProp.h<br/>
-H5EnumType.h<br/>
-H5Epubgen.h<br/>
-H5Epublic.h<br/>
-H5Exception.h<br/>
-H5f90i.h<br/>
-H5f90i_gen.h<br/>
-H5FaccProp.h<br/>
-H5FcreatProp.h<br/>
-H5FDcore.h<br/>
-H5FDdirect.h<br/>
-H5FDfamily.h<br/>
-H5FDlog.h<br/>
-H5FDmpi.h<br/>
-H5FDmpio.h<br/>
-H5FDmulti.h<br/>
-H5FDpublic.h<br/>
-H5FDsec2.h<br/>
-H5FDstdio.h<br/>
-H5File.h<br/>
-H5FloatType.h<br/>
-H5Fpublic.h<br/>
-H5Gpublic.h<br/>
-H5Group.h<br/>
-H5IdComponent.h<br/>
-H5IMpublic.h<br/>
-H5Include.h<br/>
-H5IntType.h<br/>
-H5Ipublic.h<br/>
-H5Library.h<br/>
-H5Location.h<br/>
-H5Lpublic.h<br/>
-H5LTpublic.h<br/>
-H5MMpublic.h<br/>
-H5Object.h<br/>
-H5Opublic.h<br/>
-H5overflow.h<br/>
-H5PacketTable.h<br/>
-H5PLextern.h<br/>
-H5Ppublic.h<br/>
-H5PredType.h<br/>
-H5PropList.h<br/>
-H5PTpublic.h<br/>
-H5pubconf.h<br/>
-H5public.h<br/>
-H5Rpublic.h<br/>
-H5Spublic.h<br/>
-H5StrType.h<br/>
-H5TBpublic.h<br/>
-H5Tpublic.h<br/>
-H5VarLenType.h<br/>
-H5version.h<br/>
-H5Zpublic.h<br/>
-hdf5.h<br/>
-hdf5_hl.h<br/>
-</div>
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Libs'></a><h2>Shared Libraries (6)</h2><hr/>
-<div class='lib_list'>
-libhdf5.so.8.0.2<br/>
-libhdf5_cpp.so.8.0.2<br/>
-libhdf5_fortran.so.8.0.2<br/>
-libhdf5_hl.so.8.0.2<br/>
-libhdf5_hl_cpp.so.8.0.2<br/>
-libhdf5hl_fortran.so.8.0.2<br/>
-</div>
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<br/><br/><br/></div><div id='SourceTab' class='tab'>
-<h2>Test Info</h2><hr/>
-<table class='summary'>
-<tr><th>Library Name</th><td>hdf5</td></tr>
-<tr><th>Version #1</th><td>1.8.13</td></tr>
-<tr><th>Version #2</th><td>1.8.14</td></tr>
-<tr><th>CPU Type</th><td>x86</td></tr>
-<tr><th>GCC Version</th><td>4.1.2</td></tr>
-<tr><th>Subject</th><td width='150px'>Source Compatibility</td></tr>
-</table>
-<h2>Test Results</h2><hr/>
-<table class='summary'><tr><th>Total Header Files</th><td><a href='#Headers' style='color:Blue;'>75</a></td></tr>
-<tr><th>Total Shared Libraries</th><td><a href='#Libs' style='color:Blue;'>6</a></td></tr>
-<tr><th>Total Symbols / Types</th><td>1807 / 543</td></tr>
-<tr><th>Verdict</th><td><span style='color:Red;'><b>Incompatible<br/>(1.7%)</b></span></td></tr>
-</table>
-<h2>Problem Summary</h2><hr/>
-<table class='summary'><tr><th></th><th style='text-align:center;'>Severity</th><th style='text-align:center;'>Count</th></tr><tr><th>Added Symbols</th><td>-</td><td class='new'><a href='#Source_Added' style='color:Blue;'>31</a></td></tr>
-<tr><th>Removed Symbols</th><td>High</td><td class='failed'><a href='#Source_Removed' style='color:Blue;'>31</a></td></tr>
-<tr><th rowspan='3'>Problems with<br/>Data Types</th><td>High</td><td>0</td></tr>
-<tr><td>Medium</td><td>0</td></tr>
-<tr><td>Low</td><td class='warning'><a href='#Type_Source_Problems_Low' style='color:Blue;'>1</a></td></tr>
-<tr><th rowspan='3'>Problems with<br/>Symbols</th><td>High</td><td>0</td></tr>
-<tr><td>Medium</td><td>0</td></tr>
-<tr><td>Low</td><td>0</td></tr>
-<tr><th>Problems with<br/>Constants</th><td>Low</td><td class='warning'><a href='#Constant_Source_Problems_Low' style='color:Blue;'>43</a></td></tr>
-<tr><th>Other Changes<br/>in Constants</th><td>-</td><td class='passed'><a href='#Other_Source_Changes_In_Constants' style='color:Blue;'>2</a></td></tr>
-</table>
-
-<a name='Source_Added'></a><h2>Added Symbols (31)</h2><hr/>
-<span class='h_name'>H5Ppublic.h</span><br/>
-<span class="iname">H5P_CLS_ATTRIBUTE_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_DATASET_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_DATASET_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_DATASET_XFER_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_DATATYPE_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_DATATYPE_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_FILE_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_FILE_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_FILE_MOUNT_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_GROUP_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_GROUP_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_LINK_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_LINK_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_OBJECT_COPY_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_OBJECT_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_ROOT_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_STRING_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_ATTRIBUTE_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATASET_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATASET_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATASET_XFER_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATATYPE_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATATYPE_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_FILE_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_FILE_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_FILE_MOUNT_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_GROUP_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_GROUP_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_LINK_ACCESS_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_LINK_CREATE_ID_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_OBJECT_COPY_ID_g <span class='attr'>[data]</span></span><br/>
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Source_Removed'></a><a name='Source_Withdrawn'></a><h2>Removed Symbols (31)</h2><hr/>
-<span class='h_name'>H5Ppublic.h</span><br/>
-<span class="iname">H5P_CLS_ATTRIBUTE_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_DATASET_ACCESS_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_DATASET_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_DATASET_XFER_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_DATATYPE_ACCESS_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_DATATYPE_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_FILE_ACCESS_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_FILE_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_FILE_MOUNT_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_GROUP_ACCESS_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_GROUP_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_LINK_ACCESS_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_LINK_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_OBJECT_COPY_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_OBJECT_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_ROOT_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_CLS_STRING_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_ATTRIBUTE_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATASET_ACCESS_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATASET_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATASET_XFER_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATATYPE_ACCESS_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_DATATYPE_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_FILE_ACCESS_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_FILE_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_FILE_MOUNT_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_GROUP_ACCESS_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_GROUP_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_LINK_ACCESS_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_LINK_CREATE_g <span class='attr'>[data]</span></span><br/>
-<span class="iname">H5P_LST_OBJECT_COPY_g <span class='attr'>[data]</span></span><br/>
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Low_Risk_Source_Problems'></a><a name='Type_Source_Problems_Low'></a>
-<h2>Problems with Data Types, Low Severity (1)</h2><hr/>
-<span class='h_name'>H5Lpublic.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_10')">
-<span class='extendable'>[+]</span> <span class='ttype'>typedef</span> H5L_traverse_func_t (1)</span>
-<br/>
-<div id="c_10" style="display:none;">
-<table class='ptable'><tr>
-<th width='2%'></th><th width='47%'>Change</th>
-<th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Base type has been changed from <span class='value'>herr_t(*)(char const*,hid_t,void const*,size_t,hid_t)</span> to <span class='value'>hid_t(*)(char const*,hid_t,void const*,size_t,hid_t)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table>
-<span class="section_affected" onclick="javascript:showContent(this, 'c_11')">
-[+] affected symbols (1)</span>
-<div id="c_11" style="display:none;">
-<div class='affected'><span class='iname_a'>H5Lregister <span class='sym_p'>( <span class='nowrap'>struct H5L_class_t const* <span class='focus_p'>cls</span> )</span></span></span><br/><div class='affect'>Field 'cls->trav_func' in 1st parameter 'cls' (pointer) has type 'H5L_traverse_func_t'.</div>
-</div></div>
-<br/><br/></div>
-
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Constant_Source_Problems_Low'></a><h2>Problems with Constants, Low Severity (43)</h2><hr/>
-<span class='h_name'>H5Dpublic.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_12')">
-<span class='extendable'>[+]</span> H5D_CHUNK_CACHE_W0_DEFAULT</span>
-<br/>
-<div id="c_12" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5D_CHUNK_CACHE_W0_DEFAULT</b> has been changed from <b>-1.</b> to <b>(-1.0f)</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5Epublic.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_13')">
-<span class='extendable'>[+]</span> H5E_DEFAULT</span>
-<br/>
-<div id="c_13" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5E_DEFAULT</b> has been changed from <b>0</b> to <b>(hid_t)0</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5Gpublic.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_14')">
-<span class='extendable'>[+]</span> H5G_SAME_LOC</span>
-<br/>
-<div id="c_14" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5G_SAME_LOC</b> has been changed from <b>0</b> to <b>(hid_t)0</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5Lpublic.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_15')">
-<span class='extendable'>[+]</span> H5L_SAME_LOC</span>
-<br/>
-<div id="c_15" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5L_SAME_LOC</b> has been changed from <b>0</b> to <b>(hid_t)0</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5Ppublic.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_16')">
-<span class='extendable'>[+]</span> H5P_ATTRIBUTE_CREATE</span>
-<br/>
-<div id="c_16" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_ATTRIBUTE_CREATE</b> has been changed from <span class='value'>(H5OPEN H5P_CLS_ATTRIBUTE_CREATE_g)</span> to <span class='value'>(H5OPEN H5P_CLS_ATTRIBUTE_CREATE_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_17')">
-<span class='extendable'>[+]</span> H5P_ATTRIBUTE_CREATE_DEFAULT</span>
-<br/>
-<div id="c_17" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_ATTRIBUTE_CREATE_DEFAULT</b> has been changed from <span class='value'>(H5OPEN H5P_LST_ATTRIBUTE_CREATE_g)</span> to <span class='value'>(H5OPEN H5P_LST_ATTRIBUTE_CREATE_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_18')">
-<span class='extendable'>[+]</span> H5P_DATASET_ACCESS</span>
-<br/>
-<div id="c_18" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_DATASET_ACCESS</b> has been changed from <span class='value'>(H5OPEN H5P_CLS_DATASET_ACCESS_g)</span> to <span class='value'>(H5OPEN H5P_CLS_DATASET_ACCESS_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_19')">
-<span class='extendable'>[+]</span> H5P_DATASET_ACCESS_DEFAULT</span>
-<br/>
-<div id="c_19" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_DATASET_ACCESS_DEFAULT</b> has been changed from <span class='value'>(H5OPEN H5P_LST_DATASET_ACCESS_g)</span> to <span class='value'>(H5OPEN H5P_LST_DATASET_ACCESS_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_20')">
-<span class='extendable'>[+]</span> H5P_DATASET_CREATE</span>
-<br/>
-<div id="c_20" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_DATASET_CREATE</b> has been changed from <span class='value'>(H5OPEN H5P_CLS_DATASET_CREATE_g)</span> to <span class='value'>(H5OPEN H5P_CLS_DATASET_CREATE_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_21')">
-<span class='extendable'>[+]</span> H5P_DATASET_CREATE_DEFAULT</span>
-<br/>
-<div id="c_21" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_DATASET_CREATE_DEFAULT</b> has been changed from <span class='value'>(H5OPEN H5P_LST_DATASET_CREATE_g)</span> to <span class='value'>(H5OPEN H5P_LST_DATASET_CREATE_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_22')">
-<span class='extendable'>[+]</span> H5P_DATASET_XFER</span>
-<br/>
-<div id="c_22" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_DATASET_XFER</b> has been changed from <span class='value'>(H5OPEN H5P_CLS_DATASET_XFER_g)</span> to <span class='value'>(H5OPEN H5P_CLS_DATASET_XFER_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_23')">
-<span class='extendable'>[+]</span> H5P_DATASET_XFER_DEFAULT</span>
-<br/>
-<div id="c_23" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_DATASET_XFER_DEFAULT</b> has been changed from <span class='value'>(H5OPEN H5P_LST_DATASET_XFER_g)</span> to <span class='value'>(H5OPEN H5P_LST_DATASET_XFER_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_24')">
-<span class='extendable'>[+]</span> H5P_DATATYPE_ACCESS</span>
-<br/>
-<div id="c_24" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_DATATYPE_ACCESS</b> has been changed from <span class='value'>(H5OPEN H5P_CLS_DATATYPE_ACCESS_g)</span> to <span class='value'>(H5OPEN H5P_CLS_DATATYPE_ACCESS_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_25')">
-<span class='extendable'>[+]</span> H5P_DATATYPE_ACCESS_DEFAULT</span>
-<br/>
-<div id="c_25" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_DATATYPE_ACCESS_DEFAULT</b> has been changed from <span class='value'>(H5OPEN H5P_LST_DATATYPE_ACCESS_g)</span> to <span class='value'>(H5OPEN H5P_LST_DATATYPE_ACCESS_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_26')">
-<span class='extendable'>[+]</span> H5P_DATATYPE_CREATE</span>
-<br/>
-<div id="c_26" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_DATATYPE_CREATE</b> has been changed from <span class='value'>(H5OPEN H5P_CLS_DATATYPE_CREATE_g)</span> to <span class='value'>(H5OPEN H5P_CLS_DATATYPE_CREATE_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_27')">
-<span class='extendable'>[+]</span> H5P_DATATYPE_CREATE_DEFAULT</span>
-<br/>
-<div id="c_27" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_DATATYPE_CREATE_DEFAULT</b> has been changed from <span class='value'>(H5OPEN H5P_LST_DATATYPE_CREATE_g)</span> to <span class='value'>(H5OPEN H5P_LST_DATATYPE_CREATE_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_28')">
-<span class='extendable'>[+]</span> H5P_FILE_ACCESS</span>
-<br/>
-<div id="c_28" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_FILE_ACCESS</b> has been changed from <span class='value'>(H5OPEN H5P_CLS_FILE_ACCESS_g)</span> to <span class='value'>(H5OPEN H5P_CLS_FILE_ACCESS_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_29')">
-<span class='extendable'>[+]</span> H5P_FILE_ACCESS_DEFAULT</span>
-<br/>
-<div id="c_29" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_FILE_ACCESS_DEFAULT</b> has been changed from <span class='value'>(H5OPEN H5P_LST_FILE_ACCESS_g)</span> to <span class='value'>(H5OPEN H5P_LST_FILE_ACCESS_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_30')">
-<span class='extendable'>[+]</span> H5P_FILE_CREATE</span>
-<br/>
-<div id="c_30" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_FILE_CREATE</b> has been changed from <span class='value'>(H5OPEN H5P_CLS_FILE_CREATE_g)</span> to <span class='value'>(H5OPEN H5P_CLS_FILE_CREATE_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_31')">
-<span class='extendable'>[+]</span> H5P_FILE_CREATE_DEFAULT</span>
-<br/>
-<div id="c_31" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_FILE_CREATE_DEFAULT</b> has been changed from <span class='value'>(H5OPEN H5P_LST_FILE_CREATE_g)</span> to <span class='value'>(H5OPEN H5P_LST_FILE_CREATE_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_32')">
-<span class='extendable'>[+]</span> H5P_FILE_MOUNT</span>
-<br/>
-<div id="c_32" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_FILE_MOUNT</b> has been changed from <span class='value'>(H5OPEN H5P_CLS_FILE_MOUNT_g)</span> to <span class='value'>(H5OPEN H5P_CLS_FILE_MOUNT_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_33')">
-<span class='extendable'>[+]</span> H5P_FILE_MOUNT_DEFAULT</span>
-<br/>
-<div id="c_33" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_FILE_MOUNT_DEFAULT</b> has been changed from <span class='value'>(H5OPEN H5P_LST_FILE_MOUNT_g)</span> to <span class='value'>(H5OPEN H5P_LST_FILE_MOUNT_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_34')">
-<span class='extendable'>[+]</span> H5P_GROUP_ACCESS</span>
-<br/>
-<div id="c_34" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_GROUP_ACCESS</b> has been changed from <span class='value'>(H5OPEN H5P_CLS_GROUP_ACCESS_g)</span> to <span class='value'>(H5OPEN H5P_CLS_GROUP_ACCESS_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_35')">
-<span class='extendable'>[+]</span> H5P_GROUP_ACCESS_DEFAULT</span>
-<br/>
-<div id="c_35" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_GROUP_ACCESS_DEFAULT</b> has been changed from <span class='value'>(H5OPEN H5P_LST_GROUP_ACCESS_g)</span> to <span class='value'>(H5OPEN H5P_LST_GROUP_ACCESS_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_36')">
-<span class='extendable'>[+]</span> H5P_GROUP_CREATE</span>
-<br/>
-<div id="c_36" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_GROUP_CREATE</b> has been changed from <span class='value'>(H5OPEN H5P_CLS_GROUP_CREATE_g)</span> to <span class='value'>(H5OPEN H5P_CLS_GROUP_CREATE_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_37')">
-<span class='extendable'>[+]</span> H5P_GROUP_CREATE_DEFAULT</span>
-<br/>
-<div id="c_37" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_GROUP_CREATE_DEFAULT</b> has been changed from <span class='value'>(H5OPEN H5P_LST_GROUP_CREATE_g)</span> to <span class='value'>(H5OPEN H5P_LST_GROUP_CREATE_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_38')">
-<span class='extendable'>[+]</span> H5P_LINK_ACCESS</span>
-<br/>
-<div id="c_38" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_LINK_ACCESS</b> has been changed from <span class='value'>(H5OPEN H5P_CLS_LINK_ACCESS_g)</span> to <span class='value'>(H5OPEN H5P_CLS_LINK_ACCESS_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_39')">
-<span class='extendable'>[+]</span> H5P_LINK_ACCESS_DEFAULT</span>
-<br/>
-<div id="c_39" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_LINK_ACCESS_DEFAULT</b> has been changed from <span class='value'>(H5OPEN H5P_LST_LINK_ACCESS_g)</span> to <span class='value'>(H5OPEN H5P_LST_LINK_ACCESS_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_40')">
-<span class='extendable'>[+]</span> H5P_LINK_CREATE</span>
-<br/>
-<div id="c_40" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_LINK_CREATE</b> has been changed from <span class='value'>(H5OPEN H5P_CLS_LINK_CREATE_g)</span> to <span class='value'>(H5OPEN H5P_CLS_LINK_CREATE_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_41')">
-<span class='extendable'>[+]</span> H5P_LINK_CREATE_DEFAULT</span>
-<br/>
-<div id="c_41" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_LINK_CREATE_DEFAULT</b> has been changed from <span class='value'>(H5OPEN H5P_LST_LINK_CREATE_g)</span> to <span class='value'>(H5OPEN H5P_LST_LINK_CREATE_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_42')">
-<span class='extendable'>[+]</span> H5P_NO_CLASS</span>
-<br/>
-<div id="c_42" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_NO_CLASS</b> has been changed from <span class='value'>(H5OPEN H5P_CLS_ROOT_g)</span> to <span class='value'>(H5OPEN H5P_CLS_ROOT_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_43')">
-<span class='extendable'>[+]</span> H5P_OBJECT_COPY</span>
-<br/>
-<div id="c_43" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_OBJECT_COPY</b> has been changed from <span class='value'>(H5OPEN H5P_CLS_OBJECT_COPY_g)</span> to <span class='value'>(H5OPEN H5P_CLS_OBJECT_COPY_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_44')">
-<span class='extendable'>[+]</span> H5P_OBJECT_COPY_DEFAULT</span>
-<br/>
-<div id="c_44" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_OBJECT_COPY_DEFAULT</b> has been changed from <span class='value'>(H5OPEN H5P_LST_OBJECT_COPY_g)</span> to <span class='value'>(H5OPEN H5P_LST_OBJECT_COPY_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_45')">
-<span class='extendable'>[+]</span> H5P_OBJECT_CREATE</span>
-<br/>
-<div id="c_45" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_OBJECT_CREATE</b> has been changed from <span class='value'>(H5OPEN H5P_CLS_OBJECT_CREATE_g)</span> to <span class='value'>(H5OPEN H5P_CLS_OBJECT_CREATE_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_46')">
-<span class='extendable'>[+]</span> H5P_ROOT</span>
-<br/>
-<div id="c_46" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_ROOT</b> has been changed from <span class='value'>(H5OPEN H5P_CLS_ROOT_g)</span> to <span class='value'>(H5OPEN H5P_CLS_ROOT_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_47')">
-<span class='extendable'>[+]</span> H5P_STRING_CREATE</span>
-<br/>
-<div id="c_47" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_STRING_CREATE</b> has been changed from <span class='value'>(H5OPEN H5P_CLS_STRING_CREATE_g)</span> to <span class='value'>(H5OPEN H5P_CLS_STRING_CREATE_ID_g)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5pubconf.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_48')">
-<span class='extendable'>[+]</span> H5_PACKAGE_STRING</span>
-<br/>
-<div id="c_48" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5_PACKAGE_STRING</b> has been changed from <span class='value'>"HDF5 1.8.13"</span> to <span class='value'>"HDF5 1.8.14"</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_49')">
-<span class='extendable'>[+]</span> H5_PACKAGE_VERSION</span>
-<br/>
-<div id="c_49" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5_PACKAGE_VERSION</b> has been changed from <b>"1.8.13"</b> to <b>"1.8.14"</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_50')">
-<span class='extendable'>[+]</span> H5_VERSION</span>
-<br/>
-<div id="c_50" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5_VERSION</b> has been changed from <b>"1.8.13"</b> to <b>"1.8.14"</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5public.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_51')">
-<span class='extendable'>[+]</span> H5_VERS_INFO</span>
-<br/>
-<div id="c_51" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5_VERS_INFO</b> has been changed from <span class='value'>"HDF5 library version: 1.8.13"</span> to <span class='value'>"HDF5 library version: 1.8.14"</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_52')">
-<span class='extendable'>[+]</span> H5_VERS_RELEASE</span>
-<br/>
-<div id="c_52" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5_VERS_RELEASE</b> has been changed from <b>13</b> to <b>14</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_53')">
-<span class='extendable'>[+]</span> H5P_DEFAULT</span>
-<br/>
-<div id="c_53" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5P_DEFAULT</b> has been changed from <b>0</b> to <b>(hid_t)0</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5Spublic.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_54')">
-<span class='extendable'>[+]</span> H5S_ALL</span>
-<br/>
-<div id="c_54" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5S_ALL</b> has been changed from <b>0</b> to <b>(hid_t)0</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Other_Source_Changes'></a><a name='Other_Source_Changes_In_Constants'></a><h2>Other Changes in Constants (2)</h2><hr/>
-<span class='h_name'>H5PLextern.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_55')">
-<span class='extendable'>[+]</span> H5PLUGIN_DLL</span>
-<br/>
-<div id="c_55" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5PLUGIN_DLL</b> with value <span class='value'>__attribute__ ((visibility("default")))</span> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5pubconf.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_56')">
-<span class='extendable'>[+]</span> H5_HAVE_ASPRINTF</span>
-<br/>
-<div id="c_56" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_ASPRINTF</b> with value <b>1</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Headers'></a><h2>Header Files (75)</h2><hr/>
-<div class='h_list'>
-H5AbstractDs.h<br/>
-H5ACpublic.h<br/>
-H5api_adpt.h<br/>
-H5Apublic.h<br/>
-H5ArrayType.h<br/>
-H5AtomType.h<br/>
-H5Attribute.h<br/>
-H5Classes.h<br/>
-H5CommonFG.h<br/>
-H5CompType.h<br/>
-H5Cpp.h<br/>
-H5CppDoc.h<br/>
-H5Cpublic.h<br/>
-H5DataSet.h<br/>
-H5DataSpace.h<br/>
-H5DataType.h<br/>
-H5DcreatProp.h<br/>
-H5DOpublic.h<br/>
-H5Dpublic.h<br/>
-H5DSpublic.h<br/>
-H5DxferProp.h<br/>
-H5EnumType.h<br/>
-H5Epubgen.h<br/>
-H5Epublic.h<br/>
-H5Exception.h<br/>
-H5f90i.h<br/>
-H5f90i_gen.h<br/>
-H5FaccProp.h<br/>
-H5FcreatProp.h<br/>
-H5FDcore.h<br/>
-H5FDdirect.h<br/>
-H5FDfamily.h<br/>
-H5FDlog.h<br/>
-H5FDmpi.h<br/>
-H5FDmpio.h<br/>
-H5FDmulti.h<br/>
-H5FDpublic.h<br/>
-H5FDsec2.h<br/>
-H5FDstdio.h<br/>
-H5File.h<br/>
-H5FloatType.h<br/>
-H5Fpublic.h<br/>
-H5Gpublic.h<br/>
-H5Group.h<br/>
-H5IdComponent.h<br/>
-H5IMpublic.h<br/>
-H5Include.h<br/>
-H5IntType.h<br/>
-H5Ipublic.h<br/>
-H5Library.h<br/>
-H5Location.h<br/>
-H5Lpublic.h<br/>
-H5LTpublic.h<br/>
-H5MMpublic.h<br/>
-H5Object.h<br/>
-H5Opublic.h<br/>
-H5overflow.h<br/>
-H5PacketTable.h<br/>
-H5PLextern.h<br/>
-H5Ppublic.h<br/>
-H5PredType.h<br/>
-H5PropList.h<br/>
-H5PTpublic.h<br/>
-H5pubconf.h<br/>
-H5public.h<br/>
-H5Rpublic.h<br/>
-H5Spublic.h<br/>
-H5StrType.h<br/>
-H5TBpublic.h<br/>
-H5Tpublic.h<br/>
-H5VarLenType.h<br/>
-H5version.h<br/>
-H5Zpublic.h<br/>
-hdf5.h<br/>
-hdf5_hl.h<br/>
-</div>
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Libs'></a><h2>Shared Libraries (6)</h2><hr/>
-<div class='lib_list'>
-libhdf5.so.8.0.2<br/>
-libhdf5_cpp.so.8.0.2<br/>
-libhdf5_fortran.so.8.0.2<br/>
-libhdf5_hl.so.8.0.2<br/>
-libhdf5_hl_cpp.so.8.0.2<br/>
-libhdf5hl_fortran.so.8.0.2<br/>
-</div>
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<br/><br/><br/></div><div style='width:97%;padding-top:3px;font-size:11px;' align='right'><i>Generated on Mon Nov 10 08:02:30 2014 for <span style='font-weight:bold'>hdf5</span> by <a href='http://ispras.linuxbase.org/index.php/ABI_compliance_checker'>ABI Compliance Checker</a> 1.99.9  <br/>A tool for checking backward compatibility of a C/C++ library API  </i></div>
-<div style='height:999px;'></div>
-</body></html>
\ No newline at end of file
diff --git a/html/ADGuide/Compatibility_Report/CR_1.8.15.html b/html/ADGuide/Compatibility_Report/CR_1.8.15.html
deleted file mode 100644
index 4e1ebcb..0000000
--- a/html/ADGuide/Compatibility_Report/CR_1.8.15.html
+++ /dev/null
@@ -1,1841 +0,0 @@
-<!-- kind:binary;verdict:incompatible;affected:3.7;added:15;removed:9;type_problems_high:2;type_problems_medium:0;type_problems_low:0;interface_problems_high:0;interface_problems_medium:0;interface_problems_low:2;changed_constants:20;tool_version:1.99.9 -->
-<!-- kind:source;verdict:incompatible;affected:4.5;added:17;removed:9;type_problems_high:2;type_problems_medium:0;type_problems_low:0;interface_problems_high:0;interface_problems_medium:0;interface_problems_low:0;changed_constants:26;tool_version:1.99.9 -->
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-    <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    <meta name="keywords" content="hdf5, compatibility, API, report" />
-    <meta name="description" content="Compatibility report for the hdf5 library between 1.8.14 and 1.8.15 versions" />
-    <title>
-        hdf5: 1.8.14 to 1.8.15 compatibility report
-    </title>
-    <style type="text/css">
-    body {
-    font-family:Arial, sans-serif;
-    color:Black;
-    font-size:14px;
-}
-hr {
-    color:Black;
-    background-color:Black;
-    height:1px;
-    border:0;
-}
-h1 {
-    margin-bottom:0px;
-    padding-bottom:0px;
-    font-size:26px;
-}
-h2 {
-    margin-bottom:0px;
-    padding-bottom:0px;
-    font-size:20px;
-    white-space:nowrap;
-}
-span.section {
-    font-weight:bold;
-    cursor:pointer;
-    font-size:16px;
-    color:#003E69;
-    white-space:nowrap;
-    margin-left:5px;
-}
-span.new_sign {
-    font-weight:bold;
-    margin-left:26px;
-    font-size:16px;
-    color:#003E69;
-}
-span.new_sign_lbl {
-    margin-left:28px;
-    font-size:14px;
-    color:Black;
-}
-span:hover.section {
-    color:#336699;
-}
-span.section_affected {
-    cursor:pointer;
-    margin-left:7px;
-    padding-left:15px;
-    font-size:14px;
-    color:#cc3300;
-}
-span.section_info {
-    cursor:pointer;
-    margin-left:7px;
-    padding-left:15px;
-    font-size:14px;
-    color:Black;
-}
-span.extendable {
-    font-weight:100;
-    font-size:16px;
-}
-span.h_name {
-    color:#cc3300;
-    font-size:14px;
-    font-weight:bold;
-}
-div.h_list {
-    font-size:15px;
-    padding-left:5px;
-}
-span.ns {
-    color:#408080;
-    font-size:15px;
-}
-div.lib_list {
-    font-size:15px;
-    padding-left:5px;
-}
-span.lib_name {
-    color:Green;
-    font-size:14px;
-    font-weight:bold;
-}
-span.iname {
-    font-weight:bold;
-    font-size:16px;
-    color:#003E69;
-    margin-left:5px;
-}
-span.iname_b {
-    font-weight:bold;
-    font-size:15px;
-}
-span.iname_a {
-    color:#333333;
-    font-weight:bold;
-    font-size:15px;
-}
-span.sym_p {
-    font-weight:normal;
-    white-space:normal;
-}
-div.affect {
-    padding-left:15px;
-    padding-bottom:4px;
-    font-size:14px;
-    font-style:italic;
-    line-height:13px;
-}
-div.affected {
-    padding-left:30px;
-    padding-top:5px;
-}
-table.ptable {
-    border-collapse:collapse;
-    border:1px outset black;
-    line-height:16px;
-    margin-left:15px;
-    margin-top:3px;
-    margin-bottom:3px;
-    width:900px;
-}
-table.ptable td {
-    border:1px solid gray;
-    padding: 3px;
-}
-table.vtable {
-    border-collapse:collapse;
-    border:1px outset black;
-    line-height:16px;
-    margin-left:30px;
-    margin-top:10px;
-    width:100px;
-}
-table.vtable td {
-    border:1px solid gray;
-    white-space:nowrap;
-    padding: 3px;
-}
-table.ptable th, table.vtable th {
-    background-color:#eeeeee;
-    font-weight:bold;
-    color:#333333;
-    font-family:Verdana, Arial;
-    font-size:13px;
-    border:1px solid gray;
-    text-align:center;
-    vertical-align:top;
-    white-space:nowrap;
-    padding: 3px;
-}
-table.summary {
-    border-collapse:collapse;
-    border:1px outset black;
-}
-table.summary th {
-    background-color:#eeeeee;
-    font-weight:100;
-    text-align:left;
-    font-size:15px;
-    white-space:nowrap;
-    border:1px inset gray;
-    padding: 3px;
-}
-table.summary td {
-    text-align:right;
-    font-size:16px;
-    white-space:nowrap;
-    border:1px inset gray;
-    padding: 3px 5px 3px 10px;
-}
-table.code_view {
-    cursor:text;
-    margin-top:7px;
-    margin-left:15px;
-    font-family:Monaco, Consolas, 'DejaVu Sans Mono', 'Droid Sans Mono', Monospace;
-    font-size:14px;
-    padding:10px;
-    border:1px solid #e0e8e5;
-    color:#444444;
-    background-color:#eff3f2;
-    overflow:auto;
-}
-table.code_view td {
-    padding-left:15px;
-    text-align:left;
-    white-space:nowrap;
-}
-span.mangled {
-    padding-left:15px;
-    font-size:14px;
-    cursor:text;
-    color:#444444;
-}
-span.sym_ver {
-    color:#333333;
-    white-space:nowrap;
-    font-family:"DejaVu Sans Mono", Monospace;
-}
-span.attr {
-    color:#333333;
-    font-weight:100;
-}
-span.color_p {
-    font-style:italic;
-    color:Brown;
-}
-span.param {
-    font-style:italic;
-}
-span.focus_p {
-    font-style:italic;
-    color:Red;
-}
-span.ttype {
-    font-weight:100;
-}
-span.nowrap {
-    white-space:nowrap;
-}
-span.value {
-    white-space:nowrap;
-    font-weight:bold;
-}
-td.passed {
-    background-color:#CCFFCC;
-}
-td.warning {
-    background-color:#F4F4AF;
-}
-td.failed {
-    background-color:#FFCCCC;
-}
-td.new {
-    background-color:#C6DEFF;
-}
-.tabset {
-    float:left;
-}
-a.tab {
-    border:1px solid #AAA;
-    float:left;
-    margin:0px 5px -1px 0px;
-    padding:3px 5px 3px 5px;
-    position:relative;
-    font-size:14px;
-    background-color:#DDD;
-    text-decoration:none;
-    color:Black;
-}
-a.disabled:hover
-{
-    color:Black;
-    background:#EEE;
-}
-a.active:hover
-{
-    color:Black;
-    background:White;
-}
-a.active {
-    border-bottom-color:White;
-    background-color:White;
-}
-div.tab {
-    border:1px solid #AAA;
-    padding:0 7px 0 12px;
-    width:97%;
-    clear:both;
-}
-    </style>
-    <script type="text/javascript" language="JavaScript">
-    <!--
-    function showContent(header, id)
-{
-    e = document.getElementById(id);
-    if(e.style.display == 'none')
-    {
-        e.style.display = 'block';
-        e.style.visibility = 'visible';
-        header.innerHTML = header.innerHTML.replace(/\[[^0-9 ]\]/gi,"[−]");
-    }
-    else
-    {
-        e.style.display = 'none';
-        e.style.visibility = 'hidden';
-        header.innerHTML = header.innerHTML.replace(/\[[^0-9 ]\]/gi,"[+]");
-    }
-}
-function initTabs()
-{
-    var url = window.location.href;
-    if(url.indexOf('_Source_')!=-1 || url.indexOf('#Source')!=-1)
-    {
-        var tab1 = document.getElementById('BinaryID');
-        var tab2 = document.getElementById('SourceID');
-        tab1.className='tab disabled';
-        tab2.className='tab active';
-    }
-    var sets = document.getElementsByTagName('div');
-    for (var i = 0; i < sets.length; i++)
-    {
-        if (sets[i].className.indexOf('tabset') != -1)
-        {
-            var tabs = [];
-            var links = sets[i].getElementsByTagName('a');
-            for (var j = 0; j < links.length; j++)
-            {
-                if (links[j].className.indexOf('tab') != -1)
-                {
-                    tabs.push(links[j]);
-                    links[j].tabs = tabs;
-                    var tab = document.getElementById(links[j].href.substr(links[j].href.indexOf('#') + 1));
-                    //reset all tabs on start
-                    if (tab)
-                    {
-                        if (links[j].className.indexOf('active')!=-1) {
-                            tab.style.display = 'block';
-                        }
-                        else {
-                            tab.style.display = 'none';
-                        }
-                    }
-                    links[j].onclick = function()
-                    {
-                        var tab = document.getElementById(this.href.substr(this.href.indexOf('#') + 1));
-                        if (tab)
-                        {
-                            //reset all tabs before change
-                            for (var k = 0; k < this.tabs.length; k++)
-                            {
-                                document.getElementById(this.tabs[k].href.substr(this.tabs[k].href.indexOf('#') + 1)).style.display = 'none';
-                                this.tabs[k].className = this.tabs[k].className.replace('active', 'disabled');
-                            }
-                            this.className = 'tab active';
-                            tab.style.display = 'block';
-                            // window.location.hash = this.id.replace('ID', '');
-                            return false;
-                        }
-                    }
-                }
-            }
-        }
-    }
-    if(url.indexOf('#')!=-1) {
-        location.href=location.href;
-    }
-}
-if (window.addEventListener) window.addEventListener('load', initTabs, false);
-else if (window.attachEvent) window.attachEvent('onload', initTabs);
-    -->
-    </script>
-    </head><body><a name='Source'></a><a name='Binary'></a><a name='Top'></a><h1><span class='nowrap'>API compatibility report for the <span style='color:Blue;'>hdf5</span> library</span> <span class='nowrap'> between <span style='color:Red;'>1.8.14</span> and <span style='color:Red;'>1.8.15</span> versions on <span style='color:Blue;'>x86</span></span></h1>
-
-            <br/><div class='tabset'>
-            <a id='BinaryID' href='#BinaryTab' class='tab active'>Binary<br/>Compatibility</a>
-            <a id='SourceID' href='#SourceTab' style='margin-left:3px' class='tab disabled'>Source<br/>Compatibility</a>
-            </div><div id='BinaryTab' class='tab'>
-<h2>Test Info</h2><hr/>
-<table class='summary'>
-<tr><th>Library Name</th><td>hdf5</td></tr>
-<tr><th>Version #1</th><td>1.8.14</td></tr>
-<tr><th>Version #2</th><td>1.8.15</td></tr>
-<tr><th>CPU Type</th><td>x86</td></tr>
-<tr><th>GCC Version</th><td>4.1.2</td></tr>
-<tr><th>Subject</th><td width='150px'>Binary Compatibility</td></tr>
-</table>
-<h2>Test Results</h2><hr/>
-<table class='summary'><tr><th>Total Header Files</th><td><a href='#Headers' style='color:Blue;'>75</a></td></tr>
-<tr><th>Total Shared Libraries</th><td><a href='#Libs' style='color:Blue;'>6</a></td></tr>
-<tr><th>Total Symbols / Types</th><td>1776 / 537</td></tr>
-<tr><th>Verdict</th><td><span style='color:Red;'><b>Incompatible<br/>(3.7%)</b></span></td></tr>
-</table>
-<h2>Problem Summary</h2><hr/>
-<table class='summary'><tr><th></th><th style='text-align:center;'>Severity</th><th style='text-align:center;'>Count</th></tr><tr><th>Added Symbols</th><td>-</td><td class='new'><a href='#Binary_Added' style='color:Blue;'>15</a></td></tr>
-<tr><th>Removed Symbols</th><td>High</td><td class='failed'><a href='#Binary_Removed' style='color:Blue;'>9</a></td></tr>
-<tr><th rowspan='3'>Problems with<br/>Data Types</th><td>High</td><td class='failed'><a href='#Type_Binary_Problems_High' style='color:Blue;'>2</a></td></tr>
-<tr><td>Medium</td><td>0</td></tr>
-<tr><td>Low</td><td>0</td></tr>
-<tr><th rowspan='3'>Problems with<br/>Symbols</th><td>High</td><td>0</td></tr>
-<tr><td>Medium</td><td>0</td></tr>
-<tr><td>Low</td><td class='warning'><a href='#Symbol_Binary_Problems_Low' style='color:Blue;'>2</a></td></tr>
-<tr><th>Problems with<br/>Constants</th><td>Low</td><td class='warning'><a href='#Constant_Binary_Problems_Low' style='color:Blue;'>20</a></td></tr>
-<tr><th>Other Changes<br/>in Symbols</th><td>-</td><td class='passed'><a href='#Other_Binary_Changes_In_Symbols' style='color:Blue;'>5</a></td></tr>
-<tr><th>Other Changes<br/>in Constants</th><td>-</td><td class='passed'><a href='#Other_Binary_Changes_In_Constants' style='color:Blue;'>5</a></td></tr>
-</table>
-
-<a name='Binary_Added'></a><h2>Added Symbols (15)</h2><hr/>
-<span class='h_name'>H5Attribute.h</span>, <span class='lib_name'>libhdf5_cpp.so.10.0.0</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_1')">
-f_Attribute_setId <span class='sym_p'>( <span class='nowrap'>Attribute* <span class='color_p'>attr</span>,</span> <span class='nowrap'>hid_t <span class='color_p'>new_id</span> )</span></span></span>
-<br/>
-<div id="c_1" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H517f_Attribute_setIdEPNS_9AttributeEi</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5CommonFG.h</span>, <span class='lib_name'>libhdf5_cpp.so.10.0.0</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_2')">
-CommonFG::childObjVersion <span class='sym_p'>( <span class='nowrap'>char const* <span class='color_p'>objname</span> )</span></span> const</span>
-<br/>
-<div id="c_2" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H58CommonFG15childObjVersionEPKc</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5DataSet.h</span>, <span class='lib_name'>libhdf5_cpp.so.10.0.0</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_3')">
-f_DataSet_setId <span class='sym_p'>( <span class='nowrap'>DataSet* <span class='color_p'>dset</span>,</span> <span class='nowrap'>hid_t <span class='color_p'>new_id</span> )</span></span></span>
-<br/>
-<div id="c_3" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H515f_DataSet_setIdEPNS_7DataSetEi</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5DataSpace.h</span>, <span class='lib_name'>libhdf5_cpp.so.10.0.0</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_4')">
-f_DataSpace_setId <span class='sym_p'>( DataSpace* <span class='color_p'>dspace</span>, <span class='nowrap'>hid_t <span class='color_p'>new_id</span> )</span></span></span>
-<br/>
-<div id="c_4" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H517f_DataSpace_setIdEPNS_9DataSpaceEi</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5DataType.h</span>, <span class='lib_name'>libhdf5_cpp.so.10.0.0</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_5')">
-DataType::DataType <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>PredType const& <span class='color_p'>pred_type</span> )</span></span></span>
-<br/>
-<div id="c_5" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H58DataTypeC1ERKNS_8PredTypeE</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_6')">
-DataType::DataType <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>PredType const& <span class='color_p'>pred_type</span> )</span></span></span>
-<br/>
-<div id="c_6" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H58DataTypeC2ERKNS_8PredTypeE</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_7')">
-f_DataType_setId <span class='sym_p'>( <span class='nowrap'>DataType* <span class='color_p'>dtype</span>,</span> <span class='nowrap'>hid_t <span class='color_p'>new_id</span> )</span></span></span>
-<br/>
-<div id="c_7" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516f_DataType_setIdEPNS_8DataTypeEi</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5FaccProp.h</span>, <span class='lib_name'>libhdf5_cpp.so.10.0.0</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_8')">
-FileAccPropList::getLibverBounds <span class='sym_p'>( H5F_libver_t& <span class='color_p'>libver_low</span>, <span class='nowrap'>H5F_libver_t& <span class='color_p'>libver_high</span> )</span></span> const</span>
-<br/>
-<div id="c_8" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H515FileAccPropList15getLibverBoundsER12H5F_libver_tS2_</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_9')">
-FileAccPropList::setLibverBounds <span class='sym_p'>( H5F_libver_t <span class='color_p'>libver_low</span>, <span class='nowrap'>H5F_libver_t <span class='color_p'>libver_high</span> )</span></span> const</span>
-<br/>
-<div id="c_9" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H515FileAccPropList15setLibverBoundsE12H5F_libver_tS1_</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5File.h</span>, <span class='lib_name'>libhdf5_cpp.so.10.0.0</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_10')">
-H5File::H5File <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>existing_id</span> )</span></span></span>
-<br/>
-<div id="c_10" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H56H5FileC1Ei</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_11')">
-H5File::H5File <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>existing_id</span> )</span></span></span>
-<br/>
-<div id="c_11" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H56H5FileC2Ei</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5PLpublic.h</span>, <span class='lib_name'>libhdf5.so.10.0.0</span><br/>
-<span class="iname">H5PLget_loading_state <span class='sym_p'>( <span class='nowrap'>unsigned int* <span class='color_p'>plugin_type</span> )</span></span></span><br/>
-<span class="iname">H5PLset_loading_state <span class='sym_p'>( <span class='nowrap'>unsigned int <span class='color_p'>plugin_type</span> )</span></span></span><br/>
-<br/>
-<span class='h_name'>H5public.h</span>, <span class='lib_name'>libhdf5.so.10.0.0</span><br/>
-<span class="iname">H5allocate_memory <span class='sym_p'>( <span class='nowrap'>size_t <span class='color_p'>size</span>,</span> <span class='nowrap'>hbool_t <span class='color_p'>clear</span> )</span></span></span><br/>
-<span class="iname">H5resize_memory <span class='sym_p'>( <span class='nowrap'>void* <span class='color_p'>mem</span>,</span> <span class='nowrap'>size_t <span class='color_p'>size</span> )</span></span></span><br/>
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Binary_Removed'></a><a name='Binary_Withdrawn'></a><h2>Removed Symbols (9)</h2><hr/>
-<span class='h_name'>H5AbstractDs.h</span>, <span class='lib_name'>libhdf5_cpp.so.9.0.0</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_12')">
-AbstractDs::AbstractDs <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>AbstractDs const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_12" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H510AbstractDsC1ERKS0_</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_13')">
-AbstractDs::AbstractDs <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>AbstractDs const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_13" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H510AbstractDsC2ERKS0_</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5File.h</span>, <span class='lib_name'>libhdf5_cpp.so.9.0.0</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_14')">
-H5File::getObjCount <span class='sym_p'>( )</span> const</span>
-<br/>
-<div id="c_14" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H56H5File11getObjCountEv</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5IdComponent.h</span>, <span class='lib_name'>libhdf5_cpp.so.9.0.0</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_15')">
-IdComponent::IdComponent <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>IdComponent const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_15" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H511IdComponentC1ERKS0_</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_16')">
-IdComponent::IdComponent <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>IdComponent const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_16" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H511IdComponentC2ERKS0_</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5Location.h</span>, <span class='lib_name'>libhdf5_cpp.so.9.0.0</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_17')">
-H5Location::H5Location <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>H5Location const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_17" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H510H5LocationC1ERKS0_</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_18')">
-H5Location::H5Location <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>H5Location const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_18" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H510H5LocationC2ERKS0_</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5Object.h</span>, <span class='lib_name'>libhdf5_cpp.so.9.0.0</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_19')">
-H5Object::H5Object <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>H5Object const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_19" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H58H5ObjectC1ERKS0_</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_20')">
-H5Object::H5Object <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>H5Object const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_20" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H58H5ObjectC2ERKS0_</b>]</span><br/><br/></div>
-
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='High_Risk_Binary_Problems'></a><a name='Type_Binary_Problems_High'></a>
-<h2>Problems with Data Types, High Severity (2)</h2><hr/>
-<span class='h_name'>H5AbstractDs.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_21')">
-<span class='extendable'>[+]</span> <span class='ttype'>class</span> AbstractDs (1)</span>
-<br/>
-<div id="c_21" style="display:none;">
-<table class='ptable'><tr>
-<th width='2%'></th><th width='47%'>Change</th>
-<th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Pure virtual method <span class='iname_b'>AbstractDs::getSpace <span class='sym_p'>( )</span> const</span> has been added to this class.</td><td align='left' valign='top'>1) Applications will not provide the implementation for this pure virtual method and therefore cause a crash in the library trying to call this method.<br/>2) The layout of v-table has been changed. Call of any virtual method at higher position in [...]
-</table>
-<span class="section_info" onclick="javascript:showContent(this, 'c_22')">
-[+] show v-table (old and new)</span>
-<br/>
-<div id="c_22" style="display:none;">
-<table class='vtable'><tr><th width='2%'>Offset</th><th width='45%'>Virtual Table (Old) - 7 entries</th><th>Virtual Table (New) - 8 entries</th></tr><tr><th>0</th>
-<td>(int (*)(...))0</td>
-<td>(int (*)(...))0</td></tr>
-<tr><th>4</th>
-<td>(int (*)(...))(& typeinfo)</td>
-<td>(int (*)(...))(& typeinfo)</td></tr>
-<tr><th>8</th>
-<td>__cxa_pure_virtual</td>
-<td>__cxa_pure_virtual</td></tr>
-<tr><th>12</th>
-<td>__cxa_pure_virtual</td>
-<td>__cxa_pure_virtual</td></tr>
-<tr><th>16</th>
-<td class='failed'>~AbstractDs</td>
-<td class='failed'>__cxa_pure_virtual</td></tr>
-<tr><th>20</th>
-<td>~AbstractDs</td>
-<td>~AbstractDs</td></tr>
-<tr><th>24</th>
-<td class='failed'>__cxa_pure_virtual</td>
-<td class='failed'>~AbstractDs</td></tr>
-<tr><th>28</th>
-<td></td>
-<td class='warning'>__cxa_pure_virtual</td></tr>
-</table><br/>
-</div>
-<span class="section_affected" onclick="javascript:showContent(this, 'c_23')">
-[+] affected symbols (17)</span>
-<div id="c_23" style="display:none;">
-<div class='affected'><span class='iname_a'>AbstractDs::AbstractDs <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span></span><br/><div class='affect'>This constructor is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::AbstractDs <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t const <span class='param'>ds_id</span> )</span></span></span><br/><div class='affect'>This constructor is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getArrayType <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getCompType <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getEnumType <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getFloatType <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getInMemDataSize <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getIntType <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getStorageSize <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getStrType <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getTypeClass <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getVarLenType <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::p_get_type <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::~AbstractDs <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span></span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>Attribute::close <span class='sym_p'>( )</span></span><br/><div class='affect'>This method is from derived class 'Attribute'.</div>
-<span class='iname_a'>Attribute::getId <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from derived class 'Attribute'.</div>
-<span class='iname_a'>Attribute::p_setId <span class='sym_p'>( <span class='nowrap'>hid_t const <span class='param'>new_id</span> )</span></span></span><br/><div class='affect'>This method is from derived class 'Attribute'.</div>
-</div></div>
-<br/><br/></div>
-
-<br/><span class='h_name'>H5CommonFG.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_24')">
-<span class='extendable'>[+]</span> <span class='ttype'>class</span> CommonFG (1)</span>
-<br/>
-<div id="c_24" style="display:none;">
-<table class='ptable'><tr>
-<th width='2%'></th><th width='47%'>Change</th>
-<th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Pure virtual method <span class='iname_b'>CommonFG::p_setId <span class='sym_p'>( <span class='nowrap'>hid_t const )</span></span></span> has been added to this class.</td><td align='left' valign='top'>1) Applications will not provide the implementation for this pure virtual method and therefore cause a crash in the library trying to call this method.<br/>2) The layout of v-table has been changed. Call of any virtu [...]
-</table>
-<span class="section_info" onclick="javascript:showContent(this, 'c_25')">
-[+] show v-table (old and new)</span>
-<br/>
-<div id="c_25" style="display:none;">
-<table class='vtable'><tr><th width='2%'>Offset</th><th width='45%'>Virtual Table (Old) - 6 entries</th><th>Virtual Table (New) - 7 entries</th></tr><tr><th>0</th>
-<td>(int (*)(...))0</td>
-<td>(int (*)(...))0</td></tr>
-<tr><th>4</th>
-<td>(int (*)(...))(& typeinfo)</td>
-<td>(int (*)(...))(& typeinfo)</td></tr>
-<tr><th>8</th>
-<td>__cxa_pure_virtual</td>
-<td>__cxa_pure_virtual</td></tr>
-<tr><th>12</th>
-<td>__cxa_pure_virtual</td>
-<td>__cxa_pure_virtual</td></tr>
-<tr><th>16</th>
-<td>~CommonFG</td>
-<td>~CommonFG</td></tr>
-<tr><th>20</th>
-<td>~CommonFG</td>
-<td>~CommonFG</td></tr>
-<tr><th>24</th>
-<td></td>
-<td class='warning'>__cxa_pure_virtual</td></tr>
-</table><br/>
-</div>
-<span class="section_affected" onclick="javascript:showContent(this, 'c_26')">
-[+] affected symbols (33)</span>
-<div id="c_26" style="display:none;">
-<div class='affected'><span class='iname_a'>CommonFG::childObjType <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>objname</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::childObjType <span class='sym_p'>( <span class='nowrap'>hsize_t <span class='param'>index</span>,</span> H5_index_t <span class='param'>index_type</span>, enum H5_iter_order_t <span class='param'>order</span>, <span class='nowrap'>char const* <span class='param'>objname</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::CommonFG <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span></span><br/><div class='affect'>This constructor is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::createDataSet <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span>,</span> DataType const& <span class='param'>data_type</span>, DataSpace const& <span class='param'>data_space</span>, <span class='nowrap'>DSetCreatPropList const& <span class='param'>create_plist</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::createGroup <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span>,</span> <span class='nowrap'>size_t <span class='param'>size_hint</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::getLocId <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::getNumObjs <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::getObjinfo <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span>,</span> <span class='nowrap'>H5G_stat_t& <span class='param'>statbuf</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::getObjinfo <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span>,</span> hbool_t <span class='param'>follow_link</span>, <span class='nowrap'>H5G_stat_t& <span class='param'>statbuf</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::getObjnameByIdx <span class='sym_p'>( <span class='nowrap'>hsize_t <span class='param'>idx</span>,</span> <span class='nowrap'>char* <span class='param'>name</span>,</span> <span class='nowrap'>size_t <span class='param'>size</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::getObjTypeByIdx <span class='sym_p'>( <span class='nowrap'>hsize_t <span class='param'>idx</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::getObjTypeByIdx <span class='sym_p'>( <span class='nowrap'>hsize_t <span class='param'>idx</span>,</span> <span class='nowrap'>char* <span class='param'>type_name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::iterateElems <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span>,</span> <span class='nowrap'>int* <span class='param'>idx</span>,</span> <span class='nowrap'>H5G_iterate_t <span class='param'>op</span>,</span> <span class='nowrap'>void* <span class='param'>op_data</span> )</span></span></span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::link <span class='sym_p'>( enum H5L_type_t <span class='param'>link_type</span>, char const* <span class='param'>curr_name</span>, <span class='nowrap'>char const* <span class='param'>new_name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::mount <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span>,</span> H5File const& <span class='param'>child</span>, <span class='nowrap'>PropList const& <span class='param'>plist</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::mount <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span>,</span> H5File& <span class='param'>child</span>, <span class='nowrap'>PropList& <span class='param'>plist</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::move <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>src</span>,</span> <span class='nowrap'>char const* <span class='param'>dst</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openArrayType <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openCompType <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openDataSet <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openDataType <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openEnumType <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openFloatType <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openGroup <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openIntType <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openStrType <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openVarLenType <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::throwException <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::unlink <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::unmount <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::~CommonFG <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span></span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>Group::throwException <span class='sym_p'>( std::string const& <span class='param'>func_name</span>, <span class='nowrap'>std::string const& <span class='param'>msg</span> )</span></span> const</span><br/><div class='affect'>This method is from derived class 'Group'.</div>
-<span class='iname_a'>H5File::throwException <span class='sym_p'>( std::string const& <span class='param'>func_name</span>, <span class='nowrap'>std::string const& <span class='param'>msg</span> )</span></span> const</span><br/><div class='affect'>This method is from derived class 'H5File'.</div>
-</div></div>
-<br/><br/></div>
-
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Low_Risk_Binary_Problems'></a><a name='Symbol_Binary_Problems_Low'></a><a name='Interface_Binary_Problems_Low'></a>
-<h2>Problems with Symbols, Low Severity (2)</h2><hr/>
-<span class='h_name'>H5AbstractDs.h</span>, <span class='lib_name'>libhdf5_cpp.so.9.0.0</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_27')">
-<span class='extendable'>[+]</span> AbstractDs::AbstractDs <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t const <span class='color_p'>ds_id</span> )</span></span> (1)</span>
-<br/>
-<div id="c_27" style="display:none;">
-
-
-<span class='new_sign_lbl'>changed to:</span><br/><span class='new_sign'>AbstractDs::AbstractDs <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t const <span class='color_p'>h5_id</span> )</span></span></span><br/>
-<span class='mangled'>    [symbol: <b>_ZN2H510AbstractDsC2Ei</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'><b>1st</b> parameter <b>ds_id</b> has been renamed to <b>h5_id</b>.</td><td align='left' valign='top'>Renaming of a parameter may indicate a change in its semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_28')">
-<span class='extendable'>[+]</span> AbstractDs::AbstractDs <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t const <span class='color_p'>ds_id</span> )</span></span> (1)</span>
-<br/>
-<div id="c_28" style="display:none;">
-
-
-<span class='new_sign_lbl'>changed to:</span><br/><span class='new_sign'>AbstractDs::AbstractDs <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t const <span class='color_p'>h5_id</span> )</span></span></span><br/>
-<span class='mangled'>    [symbol: <b>_ZN2H510AbstractDsC1Ei</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'><b>1st</b> parameter <b>ds_id</b> has been renamed to <b>h5_id</b>.</td><td align='left' valign='top'>Renaming of a parameter may indicate a change in its semantic meaning.</td></tr>
-</table><br/>
-</div>
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Constant_Binary_Problems_Low'></a><h2>Problems with Constants, Low Severity (20)</h2><hr/>
-<span class='h_name'>H5pubconf.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_29')">
-<span class='extendable'>[+]</span> H5_FP_TO_ULLONG_ACCURATE</span>
-<br/>
-<div id="c_29" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_FP_TO_ULLONG_ACCURATE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_30')">
-<span class='extendable'>[+]</span> H5_FP_TO_ULLONG_RIGHT_MAXIMUM</span>
-<br/>
-<div id="c_30" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_FP_TO_ULLONG_RIGHT_MAXIMUM</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_31')">
-<span class='extendable'>[+]</span> H5_GETTIMEOFDAY_GIVES_TZ</span>
-<br/>
-<div id="c_31" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_GETTIMEOFDAY_GIVES_TZ</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_32')">
-<span class='extendable'>[+]</span> H5_HAVE_FILTER_FLETCHER32</span>
-<br/>
-<div id="c_32" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_FILTER_FLETCHER32</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_33')">
-<span class='extendable'>[+]</span> H5_HAVE_FILTER_NBIT</span>
-<br/>
-<div id="c_33" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_FILTER_NBIT</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_34')">
-<span class='extendable'>[+]</span> H5_HAVE_FILTER_SCALEOFFSET</span>
-<br/>
-<div id="c_34" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_FILTER_SCALEOFFSET</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_35')">
-<span class='extendable'>[+]</span> H5_HAVE_FILTER_SHUFFLE</span>
-<br/>
-<div id="c_35" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_FILTER_SHUFFLE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_36')">
-<span class='extendable'>[+]</span> H5_HAVE_STRUCT_TIMEZONE</span>
-<br/>
-<div id="c_36" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_STRUCT_TIMEZONE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_37')">
-<span class='extendable'>[+]</span> H5_HAVE_STRUCT_TM_TM_ZONE</span>
-<br/>
-<div id="c_37" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_STRUCT_TM_TM_ZONE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_38')">
-<span class='extendable'>[+]</span> H5_HAVE_TM_ZONE</span>
-<br/>
-<div id="c_38" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_TM_ZONE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_39')">
-<span class='extendable'>[+]</span> H5_INTEGER_TO_LDOUBLE_ACCURATE</span>
-<br/>
-<div id="c_39" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_INTEGER_TO_LDOUBLE_ACCURATE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_40')">
-<span class='extendable'>[+]</span> H5_LDOUBLE_TO_INTEGER_ACCURATE</span>
-<br/>
-<div id="c_40" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_LDOUBLE_TO_INTEGER_ACCURATE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_41')">
-<span class='extendable'>[+]</span> H5_LDOUBLE_TO_INTEGER_WORKS</span>
-<br/>
-<div id="c_41" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_LDOUBLE_TO_INTEGER_WORKS</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_42')">
-<span class='extendable'>[+]</span> H5_LDOUBLE_TO_UINT_ACCURATE</span>
-<br/>
-<div id="c_42" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_LDOUBLE_TO_UINT_ACCURATE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_43')">
-<span class='extendable'>[+]</span> H5_LLONG_TO_FP_CAST_WORKS</span>
-<br/>
-<div id="c_43" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_LLONG_TO_FP_CAST_WORKS</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_44')">
-<span class='extendable'>[+]</span> H5_ULLONG_TO_FP_CAST_WORKS</span>
-<br/>
-<div id="c_44" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_ULLONG_TO_FP_CAST_WORKS</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_45')">
-<span class='extendable'>[+]</span> H5_ULLONG_TO_LDOUBLE_PRECISION</span>
-<br/>
-<div id="c_45" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_ULLONG_TO_LDOUBLE_PRECISION</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_46')">
-<span class='extendable'>[+]</span> H5_ULONG_TO_FLOAT_ACCURATE</span>
-<br/>
-<div id="c_46" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_ULONG_TO_FLOAT_ACCURATE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_47')">
-<span class='extendable'>[+]</span> H5_ULONG_TO_FP_BOTTOM_BIT_ACCURATE</span>
-<br/>
-<div id="c_47" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_ULONG_TO_FP_BOTTOM_BIT_ACCURATE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_48')">
-<span class='extendable'>[+]</span> H5_VSNPRINTF_WORKS</span>
-<br/>
-<div id="c_48" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_VSNPRINTF_WORKS</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Other_Binary_Changes'></a><a name='Other_Binary_Changes_In_Symbols'></a><a name='Other_Binary_Changes_In_Interfaces'></a>
-<h2>Other Changes in Symbols (5)</h2><hr/>
-<span class='h_name'>H5ArrayType.h</span>, <span class='lib_name'>libhdf5_cpp.so.9.0.0</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_49')">
-<span class='extendable'>[+]</span> ArrayType::ArrayType <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span> (1)</span>
-<br/>
-<div id="c_49" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H59ArrayTypeC1Ev</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>This method became <b>public</b>.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_50')">
-<span class='extendable'>[+]</span> ArrayType::ArrayType <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( )</span> (1)</span>
-<br/>
-<div id="c_50" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H59ArrayTypeC2Ev</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>This method became <b>public</b>.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5File.h</span>, <span class='lib_name'>libhdf5_cpp.so.9.0.0</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_51')">
-<span class='extendable'>[+]</span> H5File::getObjCount <span class='sym_p'>( <span class='nowrap'>unsigned int <span class='color_p'>types</span> )</span></span> const (1)</span>
-<br/>
-<div id="c_51" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZNK2H56H5File11getObjCountEj</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>31</b> of <b>1st</b> parameter <b>types</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5VarLenType.h</span>, <span class='lib_name'>libhdf5_cpp.so.9.0.0</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_52')">
-<span class='extendable'>[+]</span> VarLenType::VarLenType <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span> (1)</span>
-<br/>
-<div id="c_52" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H510VarLenTypeC1Ev</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>This method became <b>public</b>.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_53')">
-<span class='extendable'>[+]</span> VarLenType::VarLenType <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( )</span> (1)</span>
-<br/>
-<div id="c_53" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H510VarLenTypeC2Ev</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>This method became <b>public</b>.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/>
-</div>
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Other_Binary_Changes_In_Constants'></a><h2>Other Changes in Constants (5)</h2><hr/>
-<span class='h_name'>H5FDpublic.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_54')">
-<span class='extendable'>[+]</span> H5FD_FEAT_ALLOCATE_EARLY</span>
-<br/>
-<div id="c_54" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5FD_FEAT_ALLOCATE_EARLY</b> with value <b>0x00000200</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_55')">
-<span class='extendable'>[+]</span> H5FD_FEAT_HAS_MPI</span>
-<br/>
-<div id="c_55" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5FD_FEAT_HAS_MPI</b> with value <b>0x00000100</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5PLpublic.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_56')">
-<span class='extendable'>[+]</span> H5PL_ALL_PLUGIN</span>
-<br/>
-<div id="c_56" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5PL_ALL_PLUGIN</b> with value <b>0xFFFF</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_57')">
-<span class='extendable'>[+]</span> H5PL_FILTER_PLUGIN</span>
-<br/>
-<div id="c_57" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5PL_FILTER_PLUGIN</b> with value <b>0x0001</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5pubconf.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_58')">
-<span class='extendable'>[+]</span> H5_HAVE_TIMEZONE</span>
-<br/>
-<div id="c_58" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_TIMEZONE</b> with value <b>1</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Headers'></a><h2>Header Files (75)</h2><hr/>
-<div class='h_list'>
-H5AbstractDs.h<br/>
-H5ACpublic.h<br/>
-H5api_adpt.h<br/>
-H5Apublic.h<br/>
-H5ArrayType.h<br/>
-H5AtomType.h<br/>
-H5Attribute.h<br/>
-H5Classes.h<br/>
-H5CommonFG.h<br/>
-H5CompType.h<br/>
-H5Cpp.h<br/>
-H5CppDoc.h<br/>
-H5Cpublic.h<br/>
-H5DataSet.h<br/>
-H5DataSpace.h<br/>
-H5DataType.h<br/>
-H5DcreatProp.h<br/>
-H5DOpublic.h<br/>
-H5Dpublic.h<br/>
-H5DSpublic.h<br/>
-H5DxferProp.h<br/>
-H5EnumType.h<br/>
-H5Epubgen.h<br/>
-H5Epublic.h<br/>
-H5Exception.h<br/>
-H5f90i.h<br/>
-H5f90i_gen.h<br/>
-H5FaccProp.h<br/>
-H5FcreatProp.h<br/>
-H5FDcore.h<br/>
-H5FDdirect.h<br/>
-H5FDfamily.h<br/>
-H5FDlog.h<br/>
-H5FDmpi.h<br/>
-H5FDmpio.h<br/>
-H5FDmulti.h<br/>
-H5FDpublic.h<br/>
-H5FDsec2.h<br/>
-H5FDstdio.h<br/>
-H5File.h<br/>
-H5FloatType.h<br/>
-H5Fpublic.h<br/>
-H5Gpublic.h<br/>
-H5Group.h<br/>
-H5IdComponent.h<br/>
-H5IMpublic.h<br/>
-H5Include.h<br/>
-H5IntType.h<br/>
-H5Ipublic.h<br/>
-H5Library.h<br/>
-H5Location.h<br/>
-H5Lpublic.h<br/>
-H5LTpublic.h<br/>
-H5MMpublic.h<br/>
-H5Object.h<br/>
-H5Opublic.h<br/>
-H5overflow.h<br/>
-H5PacketTable.h<br/>
-H5PLextern.h<br/>
-H5Ppublic.h<br/>
-H5PredType.h<br/>
-H5PropList.h<br/>
-H5PTpublic.h<br/>
-H5pubconf.h<br/>
-H5public.h<br/>
-H5Rpublic.h<br/>
-H5Spublic.h<br/>
-H5StrType.h<br/>
-H5TBpublic.h<br/>
-H5Tpublic.h<br/>
-H5VarLenType.h<br/>
-H5version.h<br/>
-H5Zpublic.h<br/>
-hdf5.h<br/>
-hdf5_hl.h<br/>
-</div>
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Libs'></a><h2>Shared Libraries (6)</h2><hr/>
-<div class='lib_list'>
-libhdf5.so.9.0.0<br/>
-libhdf5_cpp.so.9.0.0<br/>
-libhdf5_fortran.so.9.0.0<br/>
-libhdf5_hl.so.9.0.0<br/>
-libhdf5_hl_cpp.so.9.0.0<br/>
-libhdf5hl_fortran.so.9.0.0<br/>
-</div>
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<br/><br/><br/></div><div id='SourceTab' class='tab'>
-<h2>Test Info</h2><hr/>
-<table class='summary'>
-<tr><th>Library Name</th><td>hdf5</td></tr>
-<tr><th>Version #1</th><td>1.8.14</td></tr>
-<tr><th>Version #2</th><td>1.8.15</td></tr>
-<tr><th>CPU Type</th><td>x86</td></tr>
-<tr><th>GCC Version</th><td>4.1.2</td></tr>
-<tr><th>Subject</th><td width='150px'>Source Compatibility</td></tr>
-</table>
-<h2>Test Results</h2><hr/>
-<table class='summary'><tr><th>Total Header Files</th><td><a href='#Headers' style='color:Blue;'>75</a></td></tr>
-<tr><th>Total Shared Libraries</th><td><a href='#Libs' style='color:Blue;'>6</a></td></tr>
-<tr><th>Total Symbols / Types</th><td>1811 / 540</td></tr>
-<tr><th>Verdict</th><td><span style='color:Red;'><b>Incompatible<br/>(4.5%)</b></span></td></tr>
-</table>
-<h2>Problem Summary</h2><hr/>
-<table class='summary'><tr><th></th><th style='text-align:center;'>Severity</th><th style='text-align:center;'>Count</th></tr><tr><th>Added Symbols</th><td>-</td><td class='new'><a href='#Source_Added' style='color:Blue;'>17</a></td></tr>
-<tr><th>Removed Symbols</th><td>High</td><td class='failed'><a href='#Source_Removed' style='color:Blue;'>9</a></td></tr>
-<tr><th rowspan='3'>Problems with<br/>Data Types</th><td>High</td><td class='failed'><a href='#Type_Source_Problems_High' style='color:Blue;'>2</a></td></tr>
-<tr><td>Medium</td><td>0</td></tr>
-<tr><td>Low</td><td>0</td></tr>
-<tr><th rowspan='3'>Problems with<br/>Symbols</th><td>High</td><td>0</td></tr>
-<tr><td>Medium</td><td>0</td></tr>
-<tr><td>Low</td><td>0</td></tr>
-<tr><th>Problems with<br/>Constants</th><td>Low</td><td class='warning'><a href='#Constant_Source_Problems_Low' style='color:Blue;'>26</a></td></tr>
-<tr><th>Other Changes<br/>in Symbols</th><td>-</td><td class='passed'><a href='#Other_Source_Changes_In_Symbols' style='color:Blue;'>7</a></td></tr>
-<tr><th>Other Changes<br/>in Constants</th><td>-</td><td class='passed'><a href='#Other_Source_Changes_In_Constants' style='color:Blue;'>13</a></td></tr>
-</table>
-
-<a name='Source_Added'></a><h2>Added Symbols (17)</h2><hr/>
-<span class='h_name'>H5Attribute.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_59')">
-Attribute::getSpace <span class='sym_p'>( )</span> const</span>
-<br/>
-<div id="c_59" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H59Attribute8getSpaceEv</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_60')">
-f_Attribute_setId <span class='sym_p'>( <span class='nowrap'>Attribute* <span class='color_p'>attr</span>,</span> <span class='nowrap'>hid_t <span class='color_p'>new_id</span> )</span></span></span>
-<br/>
-<div id="c_60" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H517f_Attribute_setIdEPNS_9AttributeEi</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5CommonFG.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_61')">
-CommonFG::childObjVersion <span class='sym_p'>( <span class='nowrap'>char const* <span class='color_p'>objname</span> )</span></span> const</span>
-<br/>
-<div id="c_61" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H58CommonFG15childObjVersionEPKc</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_62')">
-CommonFG::childObjVersion <span class='sym_p'>( <span class='nowrap'>int const <span class='color_p'>H5std_string</span> )</span></span> const</span>
-<br/>
-<div id="c_62" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H58CommonFG15childObjVersionEi</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5DataSet.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_63')">
-f_DataSet_setId <span class='sym_p'>( <span class='nowrap'>DataSet* <span class='color_p'>dset</span>,</span> <span class='nowrap'>hid_t <span class='color_p'>new_id</span> )</span></span></span>
-<br/>
-<div id="c_63" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H515f_DataSet_setIdEPNS_7DataSetEi</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5DataSpace.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_64')">
-f_DataSpace_setId <span class='sym_p'>( DataSpace* <span class='color_p'>dspace</span>, <span class='nowrap'>hid_t <span class='color_p'>new_id</span> )</span></span></span>
-<br/>
-<div id="c_64" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H517f_DataSpace_setIdEPNS_9DataSpaceEi</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5DataType.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_65')">
-DataType::DataType <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>PredType const& <span class='color_p'>pred_type</span> )</span></span></span>
-<br/>
-<div id="c_65" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H58DataTypeC1ERKNS_8PredTypeE</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_66')">
-DataType::DataType <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>PredType const& <span class='color_p'>pred_type</span> )</span></span></span>
-<br/>
-<div id="c_66" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H58DataTypeC2ERKNS_8PredTypeE</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_67')">
-f_DataType_setId <span class='sym_p'>( <span class='nowrap'>DataType* <span class='color_p'>dtype</span>,</span> <span class='nowrap'>hid_t <span class='color_p'>new_id</span> )</span></span></span>
-<br/>
-<div id="c_67" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516f_DataType_setIdEPNS_8DataTypeEi</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5FaccProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_68')">
-FileAccPropList::getLibverBounds <span class='sym_p'>( H5F_libver_t& <span class='color_p'>libver_low</span>, <span class='nowrap'>H5F_libver_t& <span class='color_p'>libver_high</span> )</span></span> const</span>
-<br/>
-<div id="c_68" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H515FileAccPropList15getLibverBoundsER12H5F_libver_tS2_</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_69')">
-FileAccPropList::setLibverBounds <span class='sym_p'>( H5F_libver_t <span class='color_p'>libver_low</span>, <span class='nowrap'>H5F_libver_t <span class='color_p'>libver_high</span> )</span></span> const</span>
-<br/>
-<div id="c_69" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H515FileAccPropList15setLibverBoundsE12H5F_libver_tS1_</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5File.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_70')">
-H5File::H5File <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>existing_id</span> )</span></span></span>
-<br/>
-<div id="c_70" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H56H5FileC1Ei</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_71')">
-H5File::H5File <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>existing_id</span> )</span></span></span>
-<br/>
-<div id="c_71" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H56H5FileC2Ei</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5PLpublic.h</span><br/>
-<span class="iname">H5PLget_loading_state <span class='sym_p'>( <span class='nowrap'>unsigned int* <span class='color_p'>plugin_type</span> )</span></span></span><br/>
-<span class="iname">H5PLset_loading_state <span class='sym_p'>( <span class='nowrap'>unsigned int <span class='color_p'>plugin_type</span> )</span></span></span><br/>
-<br/>
-<span class='h_name'>H5public.h</span><br/>
-<span class="iname">H5allocate_memory <span class='sym_p'>( <span class='nowrap'>size_t <span class='color_p'>size</span>,</span> <span class='nowrap'>hbool_t <span class='color_p'>clear</span> )</span></span></span><br/>
-<span class="iname">H5resize_memory <span class='sym_p'>( <span class='nowrap'>void* <span class='color_p'>mem</span>,</span> <span class='nowrap'>size_t <span class='color_p'>size</span> )</span></span></span><br/>
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Source_Removed'></a><a name='Source_Withdrawn'></a><h2>Removed Symbols (9)</h2><hr/>
-<span class='h_name'>H5AbstractDs.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_72')">
-AbstractDs::AbstractDs <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>AbstractDs const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_72" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H510AbstractDsC1ERKS0_</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_73')">
-AbstractDs::AbstractDs <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>AbstractDs const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_73" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H510AbstractDsC2ERKS0_</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5File.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_74')">
-H5File::getObjCount <span class='sym_p'>( )</span> const</span>
-<br/>
-<div id="c_74" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H56H5File11getObjCountEv</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5IdComponent.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_75')">
-IdComponent::IdComponent <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>IdComponent const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_75" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H511IdComponentC1ERKS0_</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_76')">
-IdComponent::IdComponent <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>IdComponent const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_76" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H511IdComponentC2ERKS0_</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5Location.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_77')">
-H5Location::H5Location <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>H5Location const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_77" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H510H5LocationC1ERKS0_</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_78')">
-H5Location::H5Location <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>H5Location const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_78" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H510H5LocationC2ERKS0_</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5Object.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_79')">
-H5Object::H5Object <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>H5Object const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_79" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H58H5ObjectC1ERKS0_</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_80')">
-H5Object::H5Object <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>H5Object const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_80" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H58H5ObjectC2ERKS0_</b>]</span><br/><br/></div>
-
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='High_Risk_Source_Problems'></a><a name='Type_Source_Problems_High'></a>
-<h2>Problems with Data Types, High Severity (2)</h2><hr/>
-<span class='h_name'>H5AbstractDs.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_81')">
-<span class='extendable'>[+]</span> <span class='ttype'>class</span> AbstractDs (1)</span>
-<br/>
-<div id="c_81" style="display:none;">
-<table class='ptable'><tr>
-<th width='2%'></th><th width='47%'>Change</th>
-<th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Pure virtual method <span class='iname_b'>AbstractDs::getSpace <span class='sym_p'>( )</span> const</span> has been added to this class.</td><td align='left' valign='top'>Recompilation of a client program may be broken with the error message: cannot allocate an object of abstract type <b>AbstractDs</b> because the following virtual functions are pure within <b>AbstractDs</b>: virtual <span class='iname_b'>AbstractD [...]
-</table>
-<span class="section_affected" onclick="javascript:showContent(this, 'c_82')">
-[+] affected symbols (13)</span>
-<div id="c_82" style="display:none;">
-<div class='affected'><span class='iname_a'>AbstractDs::AbstractDs <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span></span><br/><div class='affect'>This constructor is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::AbstractDs <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t const <span class='param'>ds_id</span> )</span></span></span><br/><div class='affect'>This constructor is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getArrayType <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getCompType <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getEnumType <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getFloatType <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getInMemDataSize <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getIntType <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getStorageSize <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getStrType <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getTypeClass <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::getVarLenType <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-<span class='iname_a'>AbstractDs::~AbstractDs <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span></span><br/><div class='affect'>This method is from 'AbstractDs' class.</div>
-</div></div>
-<br/><br/></div>
-
-<br/><span class='h_name'>H5CommonFG.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_83')">
-<span class='extendable'>[+]</span> <span class='ttype'>class</span> CommonFG (1)</span>
-<br/>
-<div id="c_83" style="display:none;">
-<table class='ptable'><tr>
-<th width='2%'></th><th width='47%'>Change</th>
-<th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Pure virtual method <span class='iname_b'>CommonFG::p_setId <span class='sym_p'>( <span class='nowrap'>hid_t const )</span></span></span> has been added to this class.</td><td align='left' valign='top'>Recompilation of a client program may be broken with the error message: cannot allocate an object of abstract type <b>CommonFG</b> because the following virtual functions are pure within <b>CommonFG</b>: virtual <spa [...]
-</table>
-<span class="section_affected" onclick="javascript:showContent(this, 'c_84')">
-[+] affected symbols (53)</span>
-<div id="c_84" style="display:none;">
-<div class='affected'><span class='iname_a'>CommonFG::childObjType <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>objname</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::childObjType <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::childObjType <span class='sym_p'>( <span class='nowrap'>hsize_t <span class='param'>index</span>,</span> H5_index_t <span class='param'>index_type</span>, enum H5_iter_order_t <span class='param'>order</span>, <span class='nowrap'>char const* <span class='param'>objname</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::CommonFG <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span></span><br/><div class='affect'>This constructor is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::createDataSet <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span>,</span> DataType const& <span class='param'>data_type</span>, DataSpace const& <span class='param'>data_space</span>, <span class='nowrap'>DSetCreatPropList const& <span class='param'>create_plist</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::createDataSet <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::createGroup <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span>,</span> <span class='nowrap'>size_t <span class='param'>size_hint</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::createGroup <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::getLocId <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::getNumObjs <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::getObjinfo <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span>,</span> <span class='nowrap'>H5G_stat_t& <span class='param'>statbuf</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::getObjinfo <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span>,</span> hbool_t <span class='param'>follow_link</span>, <span class='nowrap'>H5G_stat_t& <span class='param'>statbuf</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::getObjinfo <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::getObjnameByIdx <span class='sym_p'>( <span class='nowrap'>hsize_t <span class='param'>idx</span>,</span> <span class='nowrap'>char* <span class='param'>name</span>,</span> <span class='nowrap'>size_t <span class='param'>size</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::getObjnameByIdx <span class='sym_p'>( <span class='nowrap'>hsize_t <span class='param'>idx</span>,</span> <span class='nowrap'>int& <span class='param'>name</span>,</span> <span class='nowrap'>size_t <span class='param'>size</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::getObjTypeByIdx <span class='sym_p'>( <span class='nowrap'>hsize_t <span class='param'>idx</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::getObjTypeByIdx <span class='sym_p'>( <span class='nowrap'>hsize_t <span class='param'>idx</span>,</span> <span class='nowrap'>char* <span class='param'>type_name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::getObjTypeByIdx <span class='sym_p'>( <span class='nowrap'>hsize_t <span class='param'>idx</span>,</span> <span class='nowrap'>int& <span class='param'>type_name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::iterateElems <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span>,</span> <span class='nowrap'>int* <span class='param'>idx</span>,</span> <span class='nowrap'>H5G_iterate_t <span class='param'>op</span>,</span> <span class='nowrap'>void* <span class='param'>op_data</span> )</span></span></span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::iterateElems <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span></span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::link <span class='sym_p'>( enum H5L_type_t <span class='param'>link_type</span>, char const* <span class='param'>curr_name</span>, <span class='nowrap'>char const* <span class='param'>new_name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::link <span class='sym_p'>( enum H5L_type_t <span class='param'>link_type</span>, <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::mount <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span>,</span> H5File const& <span class='param'>child</span>, <span class='nowrap'>PropList const& <span class='param'>plist</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::mount <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span>,</span> H5File& <span class='param'>child</span>, <span class='nowrap'>PropList& <span class='param'>plist</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::mount <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::move <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>src</span>,</span> <span class='nowrap'>char const* <span class='param'>dst</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::move <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openArrayType <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openArrayType <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openCompType <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openCompType <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openDataSet <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openDataSet <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openDataType <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openDataType <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openEnumType <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openEnumType <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openFloatType <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openFloatType <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openGroup <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openGroup <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openIntType <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openIntType <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openStrType <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openStrType <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openVarLenType <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::openVarLenType <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::throwException <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::unlink <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::unlink <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::unmount <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::unmount <span class='sym_p'>( <span class='nowrap'>int const <span class='param'>H5std_string</span> )</span></span> const</span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-<span class='iname_a'>CommonFG::~CommonFG <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span></span><br/><div class='affect'>This method is from 'CommonFG' class.</div>
-</div></div>
-<br/><br/></div>
-
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Low_Risk_Source_Problems'></a><a name='Constant_Source_Problems_Low'></a><h2>Problems with Constants, Low Severity (26)</h2><hr/>
-<span class='h_name'>H5pubconf.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_85')">
-<span class='extendable'>[+]</span> H5_DEFAULT_VFD</span>
-<br/>
-<div id="c_85" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_DEFAULT_VFD</b> with value <b>(H5FD_sec2_init())</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_86')">
-<span class='extendable'>[+]</span> H5_FP_TO_ULLONG_ACCURATE</span>
-<br/>
-<div id="c_86" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_FP_TO_ULLONG_ACCURATE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_87')">
-<span class='extendable'>[+]</span> H5_FP_TO_ULLONG_RIGHT_MAXIMUM</span>
-<br/>
-<div id="c_87" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_FP_TO_ULLONG_RIGHT_MAXIMUM</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_88')">
-<span class='extendable'>[+]</span> H5_GETTIMEOFDAY_GIVES_TZ</span>
-<br/>
-<div id="c_88" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_GETTIMEOFDAY_GIVES_TZ</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_89')">
-<span class='extendable'>[+]</span> H5_HAVE_FILTER_FLETCHER32</span>
-<br/>
-<div id="c_89" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_FILTER_FLETCHER32</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_90')">
-<span class='extendable'>[+]</span> H5_HAVE_FILTER_NBIT</span>
-<br/>
-<div id="c_90" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_FILTER_NBIT</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_91')">
-<span class='extendable'>[+]</span> H5_HAVE_FILTER_SCALEOFFSET</span>
-<br/>
-<div id="c_91" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_FILTER_SCALEOFFSET</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_92')">
-<span class='extendable'>[+]</span> H5_HAVE_FILTER_SHUFFLE</span>
-<br/>
-<div id="c_92" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_FILTER_SHUFFLE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_93')">
-<span class='extendable'>[+]</span> H5_HAVE_STRUCT_TIMEZONE</span>
-<br/>
-<div id="c_93" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_STRUCT_TIMEZONE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_94')">
-<span class='extendable'>[+]</span> H5_HAVE_STRUCT_TM_TM_ZONE</span>
-<br/>
-<div id="c_94" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_STRUCT_TM_TM_ZONE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_95')">
-<span class='extendable'>[+]</span> H5_HAVE_TM_ZONE</span>
-<br/>
-<div id="c_95" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_TM_ZONE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_96')">
-<span class='extendable'>[+]</span> H5_INTEGER_TO_LDOUBLE_ACCURATE</span>
-<br/>
-<div id="c_96" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_INTEGER_TO_LDOUBLE_ACCURATE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_97')">
-<span class='extendable'>[+]</span> H5_LDOUBLE_TO_INTEGER_ACCURATE</span>
-<br/>
-<div id="c_97" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_LDOUBLE_TO_INTEGER_ACCURATE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_98')">
-<span class='extendable'>[+]</span> H5_LDOUBLE_TO_INTEGER_WORKS</span>
-<br/>
-<div id="c_98" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_LDOUBLE_TO_INTEGER_WORKS</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_99')">
-<span class='extendable'>[+]</span> H5_LDOUBLE_TO_UINT_ACCURATE</span>
-<br/>
-<div id="c_99" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_LDOUBLE_TO_UINT_ACCURATE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_100')">
-<span class='extendable'>[+]</span> H5_LLONG_TO_FP_CAST_WORKS</span>
-<br/>
-<div id="c_100" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_LLONG_TO_FP_CAST_WORKS</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_101')">
-<span class='extendable'>[+]</span> H5_PACKAGE_STRING</span>
-<br/>
-<div id="c_101" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5_PACKAGE_STRING</b> has been changed from <span class='value'>"HDF5 1.8.14"</span> to <span class='value'>"HDF5 1.8.15"</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_102')">
-<span class='extendable'>[+]</span> H5_PACKAGE_VERSION</span>
-<br/>
-<div id="c_102" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5_PACKAGE_VERSION</b> has been changed from <b>"1.8.14"</b> to <b>"1.8.15"</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_103')">
-<span class='extendable'>[+]</span> H5_ULLONG_TO_FP_CAST_WORKS</span>
-<br/>
-<div id="c_103" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_ULLONG_TO_FP_CAST_WORKS</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_104')">
-<span class='extendable'>[+]</span> H5_ULLONG_TO_LDOUBLE_PRECISION</span>
-<br/>
-<div id="c_104" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_ULLONG_TO_LDOUBLE_PRECISION</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_105')">
-<span class='extendable'>[+]</span> H5_ULONG_TO_FLOAT_ACCURATE</span>
-<br/>
-<div id="c_105" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_ULONG_TO_FLOAT_ACCURATE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_106')">
-<span class='extendable'>[+]</span> H5_ULONG_TO_FP_BOTTOM_BIT_ACCURATE</span>
-<br/>
-<div id="c_106" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_ULONG_TO_FP_BOTTOM_BIT_ACCURATE</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_107')">
-<span class='extendable'>[+]</span> H5_VERSION</span>
-<br/>
-<div id="c_107" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5_VERSION</b> has been changed from <b>"1.8.14"</b> to <b>"1.8.15"</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_108')">
-<span class='extendable'>[+]</span> H5_VSNPRINTF_WORKS</span>
-<br/>
-<div id="c_108" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_VSNPRINTF_WORKS</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5public.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_109')">
-<span class='extendable'>[+]</span> H5_VERS_INFO</span>
-<br/>
-<div id="c_109" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5_VERS_INFO</b> has been changed from <span class='value'>"HDF5 library version: 1.8.14"</span> to <span class='value'>"HDF5 library version: 1.8.15"</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_110')">
-<span class='extendable'>[+]</span> H5_VERS_RELEASE</span>
-<br/>
-<div id="c_110" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5_VERS_RELEASE</b> has been changed from <b>14</b> to <b>15</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Other_Source_Changes'></a><a name='Other_Source_Changes_In_Symbols'></a><a name='Other_Source_Changes_In_Interfaces'></a>
-<h2>Other Changes in Symbols (7)</h2><hr/>
-<span class='h_name'>H5AbstractDs.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_111')">
-<span class='extendable'>[+]</span> AbstractDs::AbstractDs <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t const <span class='color_p'>ds_id</span> )</span></span> (1)</span>
-<br/>
-<div id="c_111" style="display:none;">
-
-
-<span class='new_sign_lbl'>changed to:</span><br/><span class='new_sign'>AbstractDs::AbstractDs <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t const <span class='color_p'>h5_id</span> )</span></span></span><br/>
-<span class='mangled'>    [symbol: <b>_ZN2H510AbstractDsC2Ei</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'><b>1st</b> parameter <b>ds_id</b> has been renamed to <b>h5_id</b>.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_112')">
-<span class='extendable'>[+]</span> AbstractDs::AbstractDs <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t const <span class='color_p'>ds_id</span> )</span></span> (1)</span>
-<br/>
-<div id="c_112" style="display:none;">
-
-
-<span class='new_sign_lbl'>changed to:</span><br/><span class='new_sign'>AbstractDs::AbstractDs <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t const <span class='color_p'>h5_id</span> )</span></span></span><br/>
-<span class='mangled'>    [symbol: <b>_ZN2H510AbstractDsC1Ei</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'><b>1st</b> parameter <b>ds_id</b> has been renamed to <b>h5_id</b>.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5ArrayType.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_113')">
-<span class='extendable'>[+]</span> ArrayType::ArrayType <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span> (1)</span>
-<br/>
-<div id="c_113" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H59ArrayTypeC1Ev</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>This method became <b>public</b>.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_114')">
-<span class='extendable'>[+]</span> ArrayType::ArrayType <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( )</span> (1)</span>
-<br/>
-<div id="c_114" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H59ArrayTypeC2Ev</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>This method became <b>public</b>.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5File.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_115')">
-<span class='extendable'>[+]</span> H5File::getObjCount <span class='sym_p'>( <span class='nowrap'>unsigned int <span class='color_p'>types</span> )</span></span> const (1)</span>
-<br/>
-<div id="c_115" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZNK2H56H5File11getObjCountEj</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>31</b> of <b>1st</b> parameter <b>types</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5VarLenType.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_116')">
-<span class='extendable'>[+]</span> VarLenType::VarLenType <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span> (1)</span>
-<br/>
-<div id="c_116" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H510VarLenTypeC1Ev</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>This method became <b>public</b>.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_117')">
-<span class='extendable'>[+]</span> VarLenType::VarLenType <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( )</span> (1)</span>
-<br/>
-<div id="c_117" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H510VarLenTypeC2Ev</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>This method became <b>public</b>.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/>
-</div>
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Other_Source_Changes_In_Constants'></a><h2>Other Changes in Constants (13)</h2><hr/>
-<span class='h_name'>H5api_adpt.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_118')">
-<span class='extendable'>[+]</span> H5_DLLCPPVAR</span>
-<br/>
-<div id="c_118" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_DLLCPPVAR</b> with value <b>extern</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_119')">
-<span class='extendable'>[+]</span> H5_HLCPPDLLVAR</span>
-<br/>
-<div id="c_119" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HLCPPDLLVAR</b> with value <b>extern</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_120')">
-<span class='extendable'>[+]</span> H5_HLDLLVAR</span>
-<br/>
-<div id="c_120" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HLDLLVAR</b> with value <b>extern</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_121')">
-<span class='extendable'>[+]</span> HDF5_HL_F90CSTUBDLLVAR</span>
-<br/>
-<div id="c_121" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>HDF5_HL_F90CSTUBDLLVAR</b> with value <b>extern</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5f90i_gen.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_122')">
-<span class='extendable'>[+]</span> c_hsize_t_8</span>
-<br/>
-<div id="c_122" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>c_hsize_t_8</b> with value <b>hsize_t</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_123')">
-<span class='extendable'>[+]</span> c_size_t_4</span>
-<br/>
-<div id="c_123" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>c_size_t_4</b> with value <b>size_t</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5FDpublic.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_124')">
-<span class='extendable'>[+]</span> H5FD_FEAT_ALLOCATE_EARLY</span>
-<br/>
-<div id="c_124" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5FD_FEAT_ALLOCATE_EARLY</b> with value <b>0x00000200</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_125')">
-<span class='extendable'>[+]</span> H5FD_FEAT_HAS_MPI</span>
-<br/>
-<div id="c_125" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5FD_FEAT_HAS_MPI</b> with value <b>0x00000100</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5Include.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_126')">
-<span class='extendable'>[+]</span> H5O_VERSION_1</span>
-<br/>
-<div id="c_126" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5O_VERSION_1</b> with value <b>1</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_127')">
-<span class='extendable'>[+]</span> H5O_VERSION_2</span>
-<br/>
-<div id="c_127" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5O_VERSION_2</b> with value <b>2</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5PLpublic.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_128')">
-<span class='extendable'>[+]</span> H5PL_ALL_PLUGIN</span>
-<br/>
-<div id="c_128" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5PL_ALL_PLUGIN</b> with value <b>0xFFFF</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_129')">
-<span class='extendable'>[+]</span> H5PL_FILTER_PLUGIN</span>
-<br/>
-<div id="c_129" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5PL_FILTER_PLUGIN</b> with value <b>0x0001</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5pubconf.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_130')">
-<span class='extendable'>[+]</span> H5_HAVE_TIMEZONE</span>
-<br/>
-<div id="c_130" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_TIMEZONE</b> with value <b>1</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Headers'></a><h2>Header Files (75)</h2><hr/>
-<div class='h_list'>
-H5AbstractDs.h<br/>
-H5ACpublic.h<br/>
-H5api_adpt.h<br/>
-H5Apublic.h<br/>
-H5ArrayType.h<br/>
-H5AtomType.h<br/>
-H5Attribute.h<br/>
-H5Classes.h<br/>
-H5CommonFG.h<br/>
-H5CompType.h<br/>
-H5Cpp.h<br/>
-H5CppDoc.h<br/>
-H5Cpublic.h<br/>
-H5DataSet.h<br/>
-H5DataSpace.h<br/>
-H5DataType.h<br/>
-H5DcreatProp.h<br/>
-H5DOpublic.h<br/>
-H5Dpublic.h<br/>
-H5DSpublic.h<br/>
-H5DxferProp.h<br/>
-H5EnumType.h<br/>
-H5Epubgen.h<br/>
-H5Epublic.h<br/>
-H5Exception.h<br/>
-H5f90i.h<br/>
-H5f90i_gen.h<br/>
-H5FaccProp.h<br/>
-H5FcreatProp.h<br/>
-H5FDcore.h<br/>
-H5FDdirect.h<br/>
-H5FDfamily.h<br/>
-H5FDlog.h<br/>
-H5FDmpi.h<br/>
-H5FDmpio.h<br/>
-H5FDmulti.h<br/>
-H5FDpublic.h<br/>
-H5FDsec2.h<br/>
-H5FDstdio.h<br/>
-H5File.h<br/>
-H5FloatType.h<br/>
-H5Fpublic.h<br/>
-H5Gpublic.h<br/>
-H5Group.h<br/>
-H5IdComponent.h<br/>
-H5IMpublic.h<br/>
-H5Include.h<br/>
-H5IntType.h<br/>
-H5Ipublic.h<br/>
-H5Library.h<br/>
-H5Location.h<br/>
-H5Lpublic.h<br/>
-H5LTpublic.h<br/>
-H5MMpublic.h<br/>
-H5Object.h<br/>
-H5Opublic.h<br/>
-H5overflow.h<br/>
-H5PacketTable.h<br/>
-H5PLextern.h<br/>
-H5Ppublic.h<br/>
-H5PredType.h<br/>
-H5PropList.h<br/>
-H5PTpublic.h<br/>
-H5pubconf.h<br/>
-H5public.h<br/>
-H5Rpublic.h<br/>
-H5Spublic.h<br/>
-H5StrType.h<br/>
-H5TBpublic.h<br/>
-H5Tpublic.h<br/>
-H5VarLenType.h<br/>
-H5version.h<br/>
-H5Zpublic.h<br/>
-hdf5.h<br/>
-hdf5_hl.h<br/>
-</div>
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Libs'></a><h2>Shared Libraries (6)</h2><hr/>
-<div class='lib_list'>
-libhdf5.so.9.0.0<br/>
-libhdf5_cpp.so.9.0.0<br/>
-libhdf5_fortran.so.9.0.0<br/>
-libhdf5_hl.so.9.0.0<br/>
-libhdf5_hl_cpp.so.9.0.0<br/>
-libhdf5hl_fortran.so.9.0.0<br/>
-</div>
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<br/><br/><br/></div><div style='width:97%;padding-top:3px;font-size:11px;' align='right'><i>Generated on Tue May  5 08:57:06 2015 for <span style='font-weight:bold'>hdf5</span> by <a href='http://ispras.linuxbase.org/index.php/ABI_compliance_checker'>ABI Compliance Checker</a> 1.99.9  <br/>A tool for checking backward compatibility of a C/C++ library API  </i></div>
-<div style='height:999px;'></div>
-</body></html>
\ No newline at end of file
diff --git a/html/ADGuide/Compatibility_Report/CR_1.8.16.html b/html/ADGuide/Compatibility_Report/CR_1.8.16.html
deleted file mode 100644
index 0bc2aac..0000000
--- a/html/ADGuide/Compatibility_Report/CR_1.8.16.html
+++ /dev/null
@@ -1,6684 +0,0 @@
-<!-- kind:binary;verdict:incompatible;affected:3.9;added:35;removed:6;type_problems_high:0;type_problems_medium:0;type_problems_low:2;interface_problems_high:6;interface_problems_medium:131;interface_problems_low:158;changed_constants:5;tool_version:1.99.9 -->
-<!-- kind:source;verdict:incompatible;affected:4.2;added:35;removed:6;type_problems_high:0;type_problems_medium:0;type_problems_low:2;interface_problems_high:0;interface_problems_medium:164;interface_problems_low:131;changed_constants:11;tool_version:1.99.9 -->
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-    <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    <meta name="keywords" content="hdf5, compatibility, API, report" />
-    <meta name="description" content="Compatibility report for the hdf5 library between 1.8.15-patch1 and 1.8.16 versions" />
-    <title>
-        hdf5: 1.8.15-patch1 to 1.8.16 compatibility report
-    </title>
-    <style type="text/css">
-    body {
-    font-family:Arial, sans-serif;
-    color:Black;
-    font-size:14px;
-}
-hr {
-    color:Black;
-    background-color:Black;
-    height:1px;
-    border:0;
-}
-h1 {
-    margin-bottom:0px;
-    padding-bottom:0px;
-    font-size:26px;
-}
-h2 {
-    margin-bottom:0px;
-    padding-bottom:0px;
-    font-size:20px;
-    white-space:nowrap;
-}
-span.section {
-    font-weight:bold;
-    cursor:pointer;
-    font-size:16px;
-    color:#003E69;
-    white-space:nowrap;
-    margin-left:5px;
-}
-span.new_sign {
-    font-weight:bold;
-    margin-left:26px;
-    font-size:16px;
-    color:#003E69;
-}
-span.new_sign_lbl {
-    margin-left:28px;
-    font-size:14px;
-    color:Black;
-}
-span:hover.section {
-    color:#336699;
-}
-span.section_affected {
-    cursor:pointer;
-    margin-left:7px;
-    padding-left:15px;
-    font-size:14px;
-    color:#cc3300;
-}
-span.section_info {
-    cursor:pointer;
-    margin-left:7px;
-    padding-left:15px;
-    font-size:14px;
-    color:Black;
-}
-span.extendable {
-    font-weight:100;
-    font-size:16px;
-}
-span.h_name {
-    color:#cc3300;
-    font-size:14px;
-    font-weight:bold;
-}
-div.h_list {
-    font-size:15px;
-    padding-left:5px;
-}
-span.ns {
-    color:#408080;
-    font-size:15px;
-}
-div.lib_list {
-    font-size:15px;
-    padding-left:5px;
-}
-span.lib_name {
-    color:Green;
-    font-size:14px;
-    font-weight:bold;
-}
-span.iname {
-    font-weight:bold;
-    font-size:16px;
-    color:#003E69;
-    margin-left:5px;
-}
-span.iname_b {
-    font-weight:bold;
-    font-size:15px;
-}
-span.iname_a {
-    color:#333333;
-    font-weight:bold;
-    font-size:15px;
-}
-span.sym_p {
-    font-weight:normal;
-    white-space:normal;
-}
-div.affect {
-    padding-left:15px;
-    padding-bottom:4px;
-    font-size:14px;
-    font-style:italic;
-    line-height:13px;
-}
-div.affected {
-    padding-left:30px;
-    padding-top:5px;
-}
-table.ptable {
-    border-collapse:collapse;
-    border:1px outset black;
-    line-height:16px;
-    margin-left:15px;
-    margin-top:3px;
-    margin-bottom:3px;
-    width:900px;
-}
-table.ptable td {
-    border:1px solid gray;
-    padding: 3px;
-}
-table.vtable {
-    border-collapse:collapse;
-    border:1px outset black;
-    line-height:16px;
-    margin-left:30px;
-    margin-top:10px;
-    width:100px;
-}
-table.vtable td {
-    border:1px solid gray;
-    white-space:nowrap;
-    padding: 3px;
-}
-table.ptable th, table.vtable th {
-    background-color:#eeeeee;
-    font-weight:bold;
-    color:#333333;
-    font-family:Verdana, Arial;
-    font-size:13px;
-    border:1px solid gray;
-    text-align:center;
-    vertical-align:top;
-    white-space:nowrap;
-    padding: 3px;
-}
-table.summary {
-    border-collapse:collapse;
-    border:1px outset black;
-}
-table.summary th {
-    background-color:#eeeeee;
-    font-weight:100;
-    text-align:left;
-    font-size:15px;
-    white-space:nowrap;
-    border:1px inset gray;
-    padding: 3px;
-}
-table.summary td {
-    text-align:right;
-    font-size:16px;
-    white-space:nowrap;
-    border:1px inset gray;
-    padding: 3px 5px 3px 10px;
-}
-table.code_view {
-    cursor:text;
-    margin-top:7px;
-    margin-left:15px;
-    font-family:Monaco, Consolas, 'DejaVu Sans Mono', 'Droid Sans Mono', Monospace;
-    font-size:14px;
-    padding:10px;
-    border:1px solid #e0e8e5;
-    color:#444444;
-    background-color:#eff3f2;
-    overflow:auto;
-}
-table.code_view td {
-    padding-left:15px;
-    text-align:left;
-    white-space:nowrap;
-}
-span.mangled {
-    padding-left:15px;
-    font-size:14px;
-    cursor:text;
-    color:#444444;
-}
-span.sym_ver {
-    color:#333333;
-    white-space:nowrap;
-    font-family:"DejaVu Sans Mono", Monospace;
-}
-span.attr {
-    color:#333333;
-    font-weight:100;
-}
-span.color_p {
-    font-style:italic;
-    color:Brown;
-}
-span.param {
-    font-style:italic;
-}
-span.focus_p {
-    font-style:italic;
-    color:Red;
-}
-span.ttype {
-    font-weight:100;
-}
-span.nowrap {
-    white-space:nowrap;
-}
-span.value {
-    white-space:nowrap;
-    font-weight:bold;
-}
-td.passed {
-    background-color:#CCFFCC;
-}
-td.warning {
-    background-color:#F4F4AF;
-}
-td.failed {
-    background-color:#FFCCCC;
-}
-td.new {
-    background-color:#C6DEFF;
-}
-.tabset {
-    float:left;
-}
-a.tab {
-    border:1px solid #AAA;
-    float:left;
-    margin:0px 5px -1px 0px;
-    padding:3px 5px 3px 5px;
-    position:relative;
-    font-size:14px;
-    background-color:#DDD;
-    text-decoration:none;
-    color:Black;
-}
-a.disabled:hover
-{
-    color:Black;
-    background:#EEE;
-}
-a.active:hover
-{
-    color:Black;
-    background:White;
-}
-a.active {
-    border-bottom-color:White;
-    background-color:White;
-}
-div.tab {
-    border:1px solid #AAA;
-    padding:0 7px 0 12px;
-    width:97%;
-    clear:both;
-}
-    </style>
-    <script type="text/javascript" language="JavaScript">
-    <!--
-    function showContent(header, id)
-{
-    e = document.getElementById(id);
-    if(e.style.display == 'none')
-    {
-        e.style.display = 'block';
-        e.style.visibility = 'visible';
-        header.innerHTML = header.innerHTML.replace(/\[[^0-9 ]\]/gi,"[−]");
-    }
-    else
-    {
-        e.style.display = 'none';
-        e.style.visibility = 'hidden';
-        header.innerHTML = header.innerHTML.replace(/\[[^0-9 ]\]/gi,"[+]");
-    }
-}
-function initTabs()
-{
-    var url = window.location.href;
-    if(url.indexOf('_Source_')!=-1 || url.indexOf('#Source')!=-1)
-    {
-        var tab1 = document.getElementById('BinaryID');
-        var tab2 = document.getElementById('SourceID');
-        tab1.className='tab disabled';
-        tab2.className='tab active';
-    }
-    var sets = document.getElementsByTagName('div');
-    for (var i = 0; i < sets.length; i++)
-    {
-        if (sets[i].className.indexOf('tabset') != -1)
-        {
-            var tabs = [];
-            var links = sets[i].getElementsByTagName('a');
-            for (var j = 0; j < links.length; j++)
-            {
-                if (links[j].className.indexOf('tab') != -1)
-                {
-                    tabs.push(links[j]);
-                    links[j].tabs = tabs;
-                    var tab = document.getElementById(links[j].href.substr(links[j].href.indexOf('#') + 1));
-                    //reset all tabs on start
-                    if (tab)
-                    {
-                        if (links[j].className.indexOf('active')!=-1) {
-                            tab.style.display = 'block';
-                        }
-                        else {
-                            tab.style.display = 'none';
-                        }
-                    }
-                    links[j].onclick = function()
-                    {
-                        var tab = document.getElementById(this.href.substr(this.href.indexOf('#') + 1));
-                        if (tab)
-                        {
-                            //reset all tabs before change
-                            for (var k = 0; k < this.tabs.length; k++)
-                            {
-                                document.getElementById(this.tabs[k].href.substr(this.tabs[k].href.indexOf('#') + 1)).style.display = 'none';
-                                this.tabs[k].className = this.tabs[k].className.replace('active', 'disabled');
-                            }
-                            this.className = 'tab active';
-                            tab.style.display = 'block';
-                            // window.location.hash = this.id.replace('ID', '');
-                            return false;
-                        }
-                    }
-                }
-            }
-        }
-    }
-    if(url.indexOf('#')!=-1) {
-        location.href=location.href;
-    }
-}
-if (window.addEventListener) window.addEventListener('load', initTabs, false);
-else if (window.attachEvent) window.attachEvent('onload', initTabs);
-    -->
-    </script>
-    </head><body><a name='Source'></a><a name='Binary'></a><a name='Top'></a><h1><span class='nowrap'>API compatibility report for the <span style='color:Blue;'>hdf5</span> library</span> <span class='nowrap'> between <span style='color:Red;'>1.8.15-patch1</span> and <span style='color:Red;'>1.8.16</span> versions on <span style='color:Blue;'>x86_64</span></span></h1>
-
-            <br/><div class='tabset'>
-            <a id='BinaryID' href='#BinaryTab' class='tab active'>Binary<br/>Compatibility</a>
-            <a id='SourceID' href='#SourceTab' style='margin-left:3px' class='tab disabled'>Source<br/>Compatibility</a>
-            </div><div id='BinaryTab' class='tab'>
-<h2>Test Info</h2><hr/>
-<table class='summary'>
-<tr><th>Library Name</th><td>hdf5</td></tr>
-<tr><th>Version #1</th><td>1.8.15-patch1</td></tr>
-<tr><th>Version #2</th><td>1.8.16</td></tr>
-<tr><th>CPU Type</th><td>x86_64</td></tr>
-<tr><th>GCC Version</th><td>4.4.7</td></tr>
-<tr><th>Subject</th><td width='150px'>Binary Compatibility</td></tr>
-</table>
-<h2>Test Results</h2><hr/>
-<table class='summary'><tr><th>Total Header Files</th><td><a href='#Headers' style='color:Blue;'>76</a></td></tr>
-<tr><th>Total Shared Libraries</th><td>0 (not analyzed)</td></tr>
-<tr><th>Total Symbols / Types</th><td>1812 / 541</td></tr>
-<tr><th>Verdict</th><td><span style='color:Red;'><b>Incompatible<br/>(3.9%)</b></span></td></tr>
-</table>
-<h2>Problem Summary</h2><hr/>
-<table class='summary'><tr><th></th><th style='text-align:center;'>Severity</th><th style='text-align:center;'>Count</th></tr><tr><th>Added Symbols</th><td>-</td><td class='new'><a href='#Binary_Added' style='color:Blue;'>35</a></td></tr>
-<tr><th>Removed Symbols</th><td>High</td><td class='failed'><a href='#Binary_Removed' style='color:Blue;'>6</a></td></tr>
-<tr><th rowspan='3'>Problems with<br/>Data Types</th><td>High</td><td>0</td></tr>
-<tr><td>Medium</td><td>0</td></tr>
-<tr><td>Low</td><td class='warning'><a href='#Type_Binary_Problems_Low' style='color:Blue;'>2</a></td></tr>
-<tr><th rowspan='3'>Problems with<br/>Symbols</th><td>High</td><td class='failed'><a href='#Symbol_Binary_Problems_High' style='color:Blue;'>6</a></td></tr>
-<tr><td>Medium</td><td class='failed'><a href='#Symbol_Binary_Problems_Medium' style='color:Blue;'>131</a></td></tr>
-<tr><td>Low</td><td class='warning'><a href='#Symbol_Binary_Problems_Low' style='color:Blue;'>158</a></td></tr>
-<tr><th>Problems with<br/>Constants</th><td>Low</td><td class='warning'><a href='#Constant_Binary_Problems_Low' style='color:Blue;'>5</a></td></tr>
-<tr><th>Other Changes<br/>in Constants</th><td>-</td><td class='passed'><a href='#Other_Binary_Changes_In_Constants' style='color:Blue;'>3</a></td></tr>
-</table>
-
-<a name='Binary_Added'></a><h2>Added Symbols (35)</h2><hr/>
-<span class='h_name'>H5DataSpace.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_1')">
-DataSpace::deleteConstants <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_1" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H59DataSpace15deleteConstantsEv</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5DcreatProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_2')">
-DSetCreatPropList::deleteConstants <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_2" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H517DSetCreatPropList15deleteConstantsEv</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5DxferProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_3')">
-DSetMemXferPropList::deleteConstants <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_3" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H519DSetMemXferPropList15deleteConstantsEv</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5FaccProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_4')">
-FileAccPropList::deleteConstants <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_4" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H515FileAccPropList15deleteConstantsEv</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5FcreatProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_5')">
-FileCreatPropList::deleteConstants <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_5" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H517FileCreatPropList15deleteConstantsEv</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5IdComponent.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_6')">
-IdComponent::H5dontAtexit_called <span class='attr'>[data]</span></span>
-<br/>
-<div id="c_6" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H511IdComponent19H5dontAtexit_calledE</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5Library.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_7')">
-H5Library::initH5cpp <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_7" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H59H5Library9initH5cppEv</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_8')">
-H5Library::termH5cpp <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_8" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H59H5Library9termH5cppEv</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5OcreatProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_9')">
-ObjCreatPropList::DEFAULT <span class='attr'>[data]</span></span>
-<br/>
-<div id="c_9" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropList7DEFAULTE</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_10')">
-ObjCreatPropList::deleteConstants <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_10" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropList15deleteConstantsEv</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_11')">
-ObjCreatPropList::fromClass <span class='sym_p'>( )</span> const</span>
-<br/>
-<div id="c_11" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H516ObjCreatPropList9fromClassEv</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_12')">
-ObjCreatPropList::getAttrCrtOrder <span class='sym_p'>( )</span> const</span>
-<br/>
-<div id="c_12" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H516ObjCreatPropList15getAttrCrtOrderEv</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_13')">
-ObjCreatPropList::getAttrPhaseChange <span class='sym_p'>( unsigned int& <span class='color_p'>max_compact</span>, <span class='nowrap'>unsigned int& <span class='color_p'>min_dense</span> )</span></span> const</span>
-<br/>
-<div id="c_13" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H516ObjCreatPropList18getAttrPhaseChangeERjS1_</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_14')">
-ObjCreatPropList::ObjCreatPropList <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span></span>
-<br/>
-<div id="c_14" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropListC1Ev</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_15')">
-ObjCreatPropList::ObjCreatPropList <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>ObjCreatPropList const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_15" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropListC1ERKS0_</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_16')">
-ObjCreatPropList::ObjCreatPropList <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t const <span class='color_p'>plist_id</span> )</span></span></span>
-<br/>
-<div id="c_16" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropListC1Ei</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_17')">
-ObjCreatPropList::ObjCreatPropList <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( )</span></span>
-<br/>
-<div id="c_17" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropListC2Ev</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_18')">
-ObjCreatPropList::ObjCreatPropList <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>ObjCreatPropList const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_18" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropListC2ERKS0_</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_19')">
-ObjCreatPropList::ObjCreatPropList <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t const <span class='color_p'>plist_id</span> )</span></span></span>
-<br/>
-<div id="c_19" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropListC2Ei</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_20')">
-ObjCreatPropList::setAttrCrtOrder <span class='sym_p'>( <span class='nowrap'>unsigned int <span class='color_p'>crt_order_flags</span> )</span></span> const</span>
-<br/>
-<div id="c_20" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H516ObjCreatPropList15setAttrCrtOrderEj</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_21')">
-ObjCreatPropList::setAttrPhaseChange <span class='sym_p'>( unsigned int <span class='color_p'>max_compact</span>, <span class='nowrap'>unsigned int <span class='color_p'>min_dense</span> )</span></span> const</span>
-<br/>
-<div id="c_21" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H516ObjCreatPropList18setAttrPhaseChangeEjj</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_22')">
-ObjCreatPropList::~ObjCreatPropList <span class='attr'>[in-charge-deleting]</span> <span class='sym_p'>( )</span></span>
-<br/>
-<div id="c_22" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropListD0Ev</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_23')">
-ObjCreatPropList::~ObjCreatPropList <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span></span>
-<br/>
-<div id="c_23" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropListD1Ev</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_24')">
-ObjCreatPropList::~ObjCreatPropList <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( )</span></span>
-<br/>
-<div id="c_24" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropListD2Ev</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5PacketTable.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_25')">
-FL_PacketTable::FL_PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span>
-<br/>
-<div id="c_25" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN14FL_PacketTableC1EiPKc</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_26')">
-FL_PacketTable::FL_PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> char const* <span class='color_p'>name</span>, <span class='nowrap'>hid_t <span class='color_p'>dtypeID</span>,</span> hsize_t <span class='color_p'>chunkSize</span>, <span class='nowrap'>int <span class='color_p'>compression</span> )</span></span></span>
-<br/>
-<div id="c_26" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN14FL_PacketTableC1EiPKciyi</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_27')">
-FL_PacketTable::FL_PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span>
-<br/>
-<div id="c_27" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN14FL_PacketTableC2EiPKc</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_28')">
-FL_PacketTable::FL_PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> char const* <span class='color_p'>name</span>, <span class='nowrap'>hid_t <span class='color_p'>dtypeID</span>,</span> hsize_t <span class='color_p'>chunkSize</span>, <span class='nowrap'>int <span class='color_p'>compression</span> )</span></span></span>
-<br/>
-<div id="c_28" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN14FL_PacketTableC2EiPKciyi</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_29')">
-PacketTable::PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span>
-<br/>
-<div id="c_29" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN11PacketTableC1EiPKc</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_30')">
-PacketTable::PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span>
-<br/>
-<div id="c_30" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN11PacketTableC2EiPKc</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5PredType.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_31')">
-PredType::deleteConstants <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_31" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H58PredType15deleteConstantsEv</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_32')">
-PredType::PREDTYPE_CONST <span class='attr'>[data]</span></span>
-<br/>
-<div id="c_32" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H58PredType14PREDTYPE_CONSTE</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5PropList.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_33')">
-f_PropList_setId <span class='sym_p'>( <span class='nowrap'>PropList* <span class='color_p'>plist</span>,</span> <span class='nowrap'>hid_t <span class='color_p'>new_id</span> )</span></span></span>
-<br/>
-<div id="c_33" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516f_PropList_setIdEPNS_8PropListEi</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_34')">
-PropList::deleteConstants <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_34" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H58PropList15deleteConstantsEv</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5public.h</span><br/>
-<span class="iname">H5is_library_threadsafe <span class='sym_p'>( <span class='nowrap'>hbool_t* <span class='color_p'>is_ts</span> )</span></span></span><br/>
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Binary_Removed'></a><a name='Binary_Withdrawn'></a><h2>Removed Symbols (6)</h2><hr/>
-<span class='h_name'>H5PacketTable.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_35')">
-FL_PacketTable::FL_PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span> )</span></span></span>
-<br/>
-<div id="c_35" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN14FL_PacketTableC1EiPc</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_36')">
-FL_PacketTable::FL_PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span>,</span> <span class='nowrap'>hid_t <span class='color_p'>dtypeID</span>,</span> hsize_t <span class='color_p'>chunkSize</span>, <span class='nowrap'>int <span class='color_p'>compression</span> )</span></span></span>
-<br/>
-<div id="c_36" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN14FL_PacketTableC1EiPciyi</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_37')">
-FL_PacketTable::FL_PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span> )</span></span></span>
-<br/>
-<div id="c_37" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN14FL_PacketTableC2EiPc</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_38')">
-FL_PacketTable::FL_PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span>,</span> <span class='nowrap'>hid_t <span class='color_p'>dtypeID</span>,</span> hsize_t <span class='color_p'>chunkSize</span>, <span class='nowrap'>int <span class='color_p'>compression</span> )</span></span></span>
-<br/>
-<div id="c_38" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN14FL_PacketTableC2EiPciyi</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_39')">
-PacketTable::PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span> )</span></span></span>
-<br/>
-<div id="c_39" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN11PacketTableC1EiPc</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_40')">
-PacketTable::PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span> )</span></span></span>
-<br/>
-<div id="c_40" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN11PacketTableC2EiPc</b>]</span><br/><br/></div>
-
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='High_Risk_Binary_Problems'></a><a name='Symbol_Binary_Problems_High'></a><a name='Interface_Binary_Problems_High'></a>
-<h2>Problems with Symbols, High Severity (6)</h2><hr/>
-<span class='h_name'>H5PacketTable.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_41')">
-<span class='extendable'>[+]</span> FL_PacketTable::FL_PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span> )</span></span> (1)</span>
-<br/>
-<div id="c_41" style="display:none;">
-
-
-<span class='new_sign_lbl'>changed to:</span><br/><span class='new_sign'>FL_PacketTable::FL_PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span><br/>
-<span class='mangled'>    [symbol: <b>_ZN14FL_PacketTableC2EiPc</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Parameters list has been changed.</td><td align='left' valign='top'>The name of the appropriate symbol for this function on binary level has been changed from <b>_ZN14FL_PacketTableC2EiPc</b> to <b>_ZN14FL_PacketTableC2EiPKc</b>. This may cause "undefined reference" linker error in old client applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_42')">
-<span class='extendable'>[+]</span> FL_PacketTable::FL_PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span> )</span></span> (1)</span>
-<br/>
-<div id="c_42" style="display:none;">
-
-
-<span class='new_sign_lbl'>changed to:</span><br/><span class='new_sign'>FL_PacketTable::FL_PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span><br/>
-<span class='mangled'>    [symbol: <b>_ZN14FL_PacketTableC1EiPc</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Parameters list has been changed.</td><td align='left' valign='top'>The name of the appropriate symbol for this function on binary level has been changed from <b>_ZN14FL_PacketTableC1EiPc</b> to <b>_ZN14FL_PacketTableC1EiPKc</b>. This may cause "undefined reference" linker error in old client applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_43')">
-<span class='extendable'>[+]</span> FL_PacketTable::FL_PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span>,</span> <span class='nowrap'>hid_t <span class='color_p'>dtypeID</span>,</span> hsize_t <span class='color_p'>chunkSize</span>, <span class='nowrap'>int <span class='color_p'>compression</span> )</span></span> (1)</span>
-<br/>
-<div id="c_43" style="display:none;">
-
-
-<span class='new_sign_lbl'>changed to:</span><br/><span class='new_sign'>FL_PacketTable::FL_PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span><br/>
-<span class='mangled'>    [symbol: <b>_ZN14FL_PacketTableC1EiPciyi</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Parameters list has been changed.</td><td align='left' valign='top'>The name of the appropriate symbol for this function on binary level has been changed from <b>_ZN14FL_PacketTableC1EiPciyi</b> to <b>_ZN14FL_PacketTableC1EiPKc</b>. This may cause "undefined reference" linker error in old client applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_44')">
-<span class='extendable'>[+]</span> FL_PacketTable::FL_PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span>,</span> <span class='nowrap'>hid_t <span class='color_p'>dtypeID</span>,</span> hsize_t <span class='color_p'>chunkSize</span>, <span class='nowrap'>int <span class='color_p'>compression</span> )</span></span> (1)</span>
-<br/>
-<div id="c_44" style="display:none;">
-
-
-<span class='new_sign_lbl'>changed to:</span><br/><span class='new_sign'>FL_PacketTable::FL_PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span><br/>
-<span class='mangled'>    [symbol: <b>_ZN14FL_PacketTableC2EiPciyi</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Parameters list has been changed.</td><td align='left' valign='top'>The name of the appropriate symbol for this function on binary level has been changed from <b>_ZN14FL_PacketTableC2EiPciyi</b> to <b>_ZN14FL_PacketTableC2EiPKc</b>. This may cause "undefined reference" linker error in old client applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_45')">
-<span class='extendable'>[+]</span> PacketTable::PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span> )</span></span> (1)</span>
-<br/>
-<div id="c_45" style="display:none;">
-
-
-<span class='new_sign_lbl'>changed to:</span><br/><span class='new_sign'>PacketTable::PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span><br/>
-<span class='mangled'>    [symbol: <b>_ZN11PacketTableC1EiPc</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Parameters list has been changed.</td><td align='left' valign='top'>The name of the appropriate symbol for this function on binary level has been changed from <b>_ZN11PacketTableC1EiPc</b> to <b>_ZN11PacketTableC1EiPKc</b>. This may cause "undefined reference" linker error in old client applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_46')">
-<span class='extendable'>[+]</span> PacketTable::PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span> )</span></span> (1)</span>
-<br/>
-<div id="c_46" style="display:none;">
-
-
-<span class='new_sign_lbl'>changed to:</span><br/><span class='new_sign'>PacketTable::PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span><br/>
-<span class='mangled'>    [symbol: <b>_ZN11PacketTableC2EiPc</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Parameters list has been changed.</td><td align='left' valign='top'>The name of the appropriate symbol for this function on binary level has been changed from <b>_ZN11PacketTableC2EiPc</b> to <b>_ZN11PacketTableC2EiPKc</b>. This may cause "undefined reference" linker error in old client applications.</td></tr>
-</table><br/>
-</div>
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Medium_Risk_Binary_Problems'></a><a name='Symbol_Binary_Problems_Medium'></a><a name='Interface_Binary_Problems_Medium'></a>
-<h2>Problems with Symbols, Medium Severity (131)</h2><hr/>
-<span class='h_name'>H5DataSpace.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_47')">
-<span class='extendable'>[+]</span> DataSpace::ALL <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_47" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H59DataSpace3ALLE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>DataSpace const</span> to <span class='value'>DataSpace const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5DcreatProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_48')">
-<span class='extendable'>[+]</span> DSetCreatPropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_48" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H517DSetCreatPropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>DSetCreatPropList const</span> to <span class='value'>DSetCreatPropList const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5DxferProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_49')">
-<span class='extendable'>[+]</span> DSetMemXferPropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_49" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H519DSetMemXferPropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>DSetMemXferPropList const</span> to <span class='value'>DSetMemXferPropList const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5FaccProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_50')">
-<span class='extendable'>[+]</span> FileAccPropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_50" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H515FileAccPropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>FileAccPropList const</span> to <span class='value'>FileAccPropList const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5FcreatProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_51')">
-<span class='extendable'>[+]</span> FileCreatPropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_51" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H517FileCreatPropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>FileCreatPropList const</span> to <span class='value'>FileCreatPropList const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5PredType.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_52')">
-<span class='extendable'>[+]</span> PredType::ALPHA_B16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_52" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_B16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_53')">
-<span class='extendable'>[+]</span> PredType::ALPHA_B32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_53" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_B32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_54')">
-<span class='extendable'>[+]</span> PredType::ALPHA_B64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_54" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_B64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_55')">
-<span class='extendable'>[+]</span> PredType::ALPHA_B8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_55" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8ALPHA_B8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_56')">
-<span class='extendable'>[+]</span> PredType::ALPHA_F32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_56" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_F32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_57')">
-<span class='extendable'>[+]</span> PredType::ALPHA_F64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_57" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_F64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_58')">
-<span class='extendable'>[+]</span> PredType::ALPHA_I16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_58" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_I16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_59')">
-<span class='extendable'>[+]</span> PredType::ALPHA_I32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_59" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_I32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_60')">
-<span class='extendable'>[+]</span> PredType::ALPHA_I64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_60" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_I64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_61')">
-<span class='extendable'>[+]</span> PredType::ALPHA_I8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_61" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8ALPHA_I8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_62')">
-<span class='extendable'>[+]</span> PredType::ALPHA_U16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_62" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_U16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_63')">
-<span class='extendable'>[+]</span> PredType::ALPHA_U32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_63" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_U32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_64')">
-<span class='extendable'>[+]</span> PredType::ALPHA_U64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_64" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_U64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_65')">
-<span class='extendable'>[+]</span> PredType::ALPHA_U8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_65" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8ALPHA_U8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_66')">
-<span class='extendable'>[+]</span> PredType::C_S1 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_66" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType4C_S1E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_67')">
-<span class='extendable'>[+]</span> PredType::FORTRAN_S1 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_67" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10FORTRAN_S1E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_68')">
-<span class='extendable'>[+]</span> PredType::IEEE_F32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_68" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10IEEE_F32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_69')">
-<span class='extendable'>[+]</span> PredType::IEEE_F32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_69" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10IEEE_F32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_70')">
-<span class='extendable'>[+]</span> PredType::IEEE_F64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_70" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10IEEE_F64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_71')">
-<span class='extendable'>[+]</span> PredType::IEEE_F64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_71" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10IEEE_F64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_72')">
-<span class='extendable'>[+]</span> PredType::INTEL_B16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_72" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_B16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_73')">
-<span class='extendable'>[+]</span> PredType::INTEL_B32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_73" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_B32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_74')">
-<span class='extendable'>[+]</span> PredType::INTEL_B64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_74" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_B64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_75')">
-<span class='extendable'>[+]</span> PredType::INTEL_B8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_75" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8INTEL_B8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_76')">
-<span class='extendable'>[+]</span> PredType::INTEL_F32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_76" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_F32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_77')">
-<span class='extendable'>[+]</span> PredType::INTEL_F64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_77" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_F64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_78')">
-<span class='extendable'>[+]</span> PredType::INTEL_I16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_78" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_I16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_79')">
-<span class='extendable'>[+]</span> PredType::INTEL_I32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_79" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_I32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_80')">
-<span class='extendable'>[+]</span> PredType::INTEL_I64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_80" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_I64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_81')">
-<span class='extendable'>[+]</span> PredType::INTEL_I8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_81" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8INTEL_I8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_82')">
-<span class='extendable'>[+]</span> PredType::INTEL_U16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_82" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_U16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_83')">
-<span class='extendable'>[+]</span> PredType::INTEL_U32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_83" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_U32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_84')">
-<span class='extendable'>[+]</span> PredType::INTEL_U64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_84" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_U64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_85')">
-<span class='extendable'>[+]</span> PredType::INTEL_U8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_85" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8INTEL_U8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_86')">
-<span class='extendable'>[+]</span> PredType::MIPS_B16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_86" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_B16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_87')">
-<span class='extendable'>[+]</span> PredType::MIPS_B32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_87" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_B32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_88')">
-<span class='extendable'>[+]</span> PredType::MIPS_B64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_88" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_B64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_89')">
-<span class='extendable'>[+]</span> PredType::MIPS_B8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_89" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType7MIPS_B8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_90')">
-<span class='extendable'>[+]</span> PredType::MIPS_F32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_90" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_F32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_91')">
-<span class='extendable'>[+]</span> PredType::MIPS_F64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_91" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_F64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_92')">
-<span class='extendable'>[+]</span> PredType::MIPS_I16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_92" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_I16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_93')">
-<span class='extendable'>[+]</span> PredType::MIPS_I32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_93" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_I32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_94')">
-<span class='extendable'>[+]</span> PredType::MIPS_I64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_94" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_I64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_95')">
-<span class='extendable'>[+]</span> PredType::MIPS_I8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_95" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType7MIPS_I8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_96')">
-<span class='extendable'>[+]</span> PredType::MIPS_U16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_96" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_U16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_97')">
-<span class='extendable'>[+]</span> PredType::MIPS_U32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_97" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_U32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_98')">
-<span class='extendable'>[+]</span> PredType::MIPS_U64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_98" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_U64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_99')">
-<span class='extendable'>[+]</span> PredType::MIPS_U8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_99" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType7MIPS_U8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_100')">
-<span class='extendable'>[+]</span> PredType::NATIVE_B16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_100" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10NATIVE_B16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_101')">
-<span class='extendable'>[+]</span> PredType::NATIVE_B32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_101" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10NATIVE_B32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_102')">
-<span class='extendable'>[+]</span> PredType::NATIVE_B64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_102" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10NATIVE_B64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_103')">
-<span class='extendable'>[+]</span> PredType::NATIVE_B8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_103" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9NATIVE_B8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_104')">
-<span class='extendable'>[+]</span> PredType::NATIVE_CHAR <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_104" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_CHARE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_105')">
-<span class='extendable'>[+]</span> PredType::NATIVE_DOUBLE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_105" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_DOUBLEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_106')">
-<span class='extendable'>[+]</span> PredType::NATIVE_FLOAT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_106" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_FLOATE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_107')">
-<span class='extendable'>[+]</span> PredType::NATIVE_HBOOL <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_107" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_HBOOLE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_108')">
-<span class='extendable'>[+]</span> PredType::NATIVE_HERR <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_108" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_HERRE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_109')">
-<span class='extendable'>[+]</span> PredType::NATIVE_HSIZE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_109" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_HSIZEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_110')">
-<span class='extendable'>[+]</span> PredType::NATIVE_HSSIZE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_110" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_HSSIZEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_111')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_111" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10NATIVE_INTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_112')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_112" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_INT16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_113')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_113" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_INT32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_114')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_114" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_INT64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_115')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_115" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_INT8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_116')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_FAST16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_116" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_INT_FAST16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_117')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_FAST32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_117" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_INT_FAST32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_118')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_FAST64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_118" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_INT_FAST64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_119')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_FAST8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_119" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType16NATIVE_INT_FAST8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_120')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_LEAST16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_120" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_INT_LEAST16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_121')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_LEAST32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_121" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_INT_LEAST32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_122')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_LEAST64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_122" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_INT_LEAST64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_123')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_LEAST8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_123" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_INT_LEAST8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_124')">
-<span class='extendable'>[+]</span> PredType::NATIVE_LDOUBLE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_124" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType14NATIVE_LDOUBLEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_125')">
-<span class='extendable'>[+]</span> PredType::NATIVE_LLONG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_125" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_LLONGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_126')">
-<span class='extendable'>[+]</span> PredType::NATIVE_LONG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_126" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_LONGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_127')">
-<span class='extendable'>[+]</span> PredType::NATIVE_OPAQUE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_127" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_OPAQUEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_128')">
-<span class='extendable'>[+]</span> PredType::NATIVE_SCHAR <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_128" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_SCHARE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_129')">
-<span class='extendable'>[+]</span> PredType::NATIVE_SHORT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_129" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_SHORTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_130')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UCHAR <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_130" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_UCHARE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_131')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_131" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_UINTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_132')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_132" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_UINT16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_133')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_133" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_UINT32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_134')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_134" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_UINT64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_135')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_135" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_UINT8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_136')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_FAST16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_136" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_UINT_FAST16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_137')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_FAST32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_137" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_UINT_FAST32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_138')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_FAST64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_138" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_UINT_FAST64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_139')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_FAST8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_139" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_UINT_FAST8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_140')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_LEAST16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_140" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType19NATIVE_UINT_LEAST16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_141')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_LEAST32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_141" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType19NATIVE_UINT_LEAST32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_142')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_LEAST64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_142" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType19NATIVE_UINT_LEAST64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_143')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_LEAST8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_143" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_UINT_LEAST8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_144')">
-<span class='extendable'>[+]</span> PredType::NATIVE_ULLONG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_144" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_ULLONGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_145')">
-<span class='extendable'>[+]</span> PredType::NATIVE_ULONG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_145" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_ULONGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_146')">
-<span class='extendable'>[+]</span> PredType::NATIVE_USHORT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_146" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_USHORTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_147')">
-<span class='extendable'>[+]</span> PredType::STD_B16BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_147" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B16BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_148')">
-<span class='extendable'>[+]</span> PredType::STD_B16LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_148" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B16LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_149')">
-<span class='extendable'>[+]</span> PredType::STD_B32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_149" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_150')">
-<span class='extendable'>[+]</span> PredType::STD_B32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_150" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_151')">
-<span class='extendable'>[+]</span> PredType::STD_B64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_151" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_152')">
-<span class='extendable'>[+]</span> PredType::STD_B64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_152" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_153')">
-<span class='extendable'>[+]</span> PredType::STD_B8BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_153" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_B8BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_154')">
-<span class='extendable'>[+]</span> PredType::STD_B8LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_154" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_B8LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_155')">
-<span class='extendable'>[+]</span> PredType::STD_I16BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_155" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I16BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_156')">
-<span class='extendable'>[+]</span> PredType::STD_I16LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_156" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I16LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_157')">
-<span class='extendable'>[+]</span> PredType::STD_I32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_157" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_158')">
-<span class='extendable'>[+]</span> PredType::STD_I32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_158" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_159')">
-<span class='extendable'>[+]</span> PredType::STD_I64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_159" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_160')">
-<span class='extendable'>[+]</span> PredType::STD_I64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_160" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_161')">
-<span class='extendable'>[+]</span> PredType::STD_I8BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_161" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_I8BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_162')">
-<span class='extendable'>[+]</span> PredType::STD_I8LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_162" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_I8LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_163')">
-<span class='extendable'>[+]</span> PredType::STD_REF_DSETREG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_163" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType15STD_REF_DSETREGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_164')">
-<span class='extendable'>[+]</span> PredType::STD_REF_OBJ <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_164" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11STD_REF_OBJE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_165')">
-<span class='extendable'>[+]</span> PredType::STD_U16BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_165" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U16BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_166')">
-<span class='extendable'>[+]</span> PredType::STD_U16LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_166" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U16LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_167')">
-<span class='extendable'>[+]</span> PredType::STD_U32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_167" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_168')">
-<span class='extendable'>[+]</span> PredType::STD_U32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_168" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_169')">
-<span class='extendable'>[+]</span> PredType::STD_U64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_169" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_170')">
-<span class='extendable'>[+]</span> PredType::STD_U64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_170" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_171')">
-<span class='extendable'>[+]</span> PredType::STD_U8BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_171" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_U8BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_172')">
-<span class='extendable'>[+]</span> PredType::STD_U8LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_172" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_U8LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_173')">
-<span class='extendable'>[+]</span> PredType::UNIX_D32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_173" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10UNIX_D32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_174')">
-<span class='extendable'>[+]</span> PredType::UNIX_D32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_174" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10UNIX_D32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_175')">
-<span class='extendable'>[+]</span> PredType::UNIX_D64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_175" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10UNIX_D64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_176')">
-<span class='extendable'>[+]</span> PredType::UNIX_D64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_176" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10UNIX_D64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5PropList.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_177')">
-<span class='extendable'>[+]</span> PropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_177" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PropList const</span> to <span class='value'>PropList const&</span> of different format.</td><td align='left' valign='top'>This global data may be incorrectly accessed by applications.</td></tr>
-</table><br/>
-</div>
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Low_Risk_Binary_Problems'></a><a name='Type_Binary_Problems_Low'></a>
-<h2>Problems with Data Types, Low Severity (2)</h2><hr/>
-<span class='h_name'>H5DcreatProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_178')">
-<span class='extendable'>[+]</span> <span class='ttype'>class</span> DSetCreatPropList (2)</span>
-<br/>
-<div id="c_178" style="display:none;">
-<table class='ptable'><tr>
-<th width='2%'></th><th width='47%'>Change</th>
-<th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Base class <b>ObjCreatPropList</b> has been added.</td><td align='left' valign='top'>Possible incorrect access of applications to the memory occupied by the base classes.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>Base class <b>PropList</b> has been removed.</td><td align='left' valign='top'>Possible incorrect access of applications to the memory occupied by the base classes.</td></tr>
-</table>
-<span class="section_info" onclick="javascript:showContent(this, 'c_179')">
-[+] show v-table (old and new)</span>
-<br/>
-<div id="c_179" style="display:none;">
-<table class='vtable'><tr><th width='2%'>Offset</th><th width='45%'>Virtual Table (Old) - 8 entries</th><th>Virtual Table (New) - 8 entries</th></tr><tr><th>0</th>
-<td>(int (*)(...))0</td>
-<td>(int (*)(...))0</td></tr>
-<tr><th>8</th>
-<td>(int (*)(...))(& typeinfo)</td>
-<td>(int (*)(...))(& typeinfo)</td></tr>
-<tr><th>16</th>
-<td>PropList::getId</td>
-<td>PropList::getId</td></tr>
-<tr><th>24</th>
-<td>PropList::close</td>
-<td>PropList::close</td></tr>
-<tr><th>32</th>
-<td>DSetCreatPropList::fromClass</td>
-<td>DSetCreatPropList::fromClass</td></tr>
-<tr><th>40</th>
-<td>~DSetCreatPropList</td>
-<td>~DSetCreatPropList</td></tr>
-<tr><th>48</th>
-<td>~DSetCreatPropList</td>
-<td>~DSetCreatPropList</td></tr>
-<tr><th>56</th>
-<td>PropList::p_setId</td>
-<td>PropList::p_setId</td></tr>
-</table><br/>
-</div>
-<span class="section_affected" onclick="javascript:showContent(this, 'c_180')">
-[+] affected symbols (31)</span>
-<div id="c_180" style="display:none;">
-<div class='affected'><span class='iname_a'>DSetCreatPropList::allFiltersAvail <span class='sym_p'>( )</span></span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::DEFAULT <span class='attr'>[data]</span></span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::DSetCreatPropList <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span></span><br/><div class='affect'>This constructor is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::DSetCreatPropList <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>DSetCreatPropList const& <span class='param'>orig</span> )</span></span></span><br/><div class='affect'>This constructor is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::DSetCreatPropList <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t const <span class='param'>plist_id</span> )</span></span></span><br/><div class='affect'>This constructor is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::fromClass <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::getAllocTime <span class='sym_p'>( )</span></span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::getChunk <span class='sym_p'>( <span class='nowrap'>int <span class='param'>max_ndims</span>,</span> <span class='nowrap'>hsize_t* <span class='param'>dim</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::getExternal <span class='sym_p'>( <span class='nowrap'>unsigned int <span class='param'>idx</span>,</span> <span class='nowrap'>size_t <span class='param'>name_size</span>,</span> <span class='nowrap'>char* <span class='param'>name</span>,</span> <span class='nowrap'>off_t& <span class='param'>offset</span>,</span> <span class='nowrap'>hsize_t& <span class='param'>size</span> )</span></span> const</span><br/><div class='affect'>T [...]
-<span class='iname_a'>DSetCreatPropList::getExternalCount <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::getFillTime <span class='sym_p'>( )</span></span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::getFillValue <span class='sym_p'>( DataType const& <span class='param'>fvalue_type</span>, <span class='nowrap'>void* <span class='param'>value</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::getFilter <span class='sym_p'>( <span class='nowrap'>int <span class='param'>filter_number</span>,</span> unsigned int& <span class='param'>flags</span>, size_t& <span class='param'>cd_nelmts</span>, unsigned int* <span class='param'>cd_values</span>, <span class='nowrap'>size_t <span class='param'>namelen</span>,</span> <span class='nowrap'>char* <span class='param'>name</span>,</span> <span class='nowrap'>unsigned int& <spa [...]
-<span class='iname_a'>DSetCreatPropList::getFilterById <span class='sym_p'>( H5Z_filter_t <span class='param'>filter_id</span>, unsigned int& <span class='param'>flags</span>, size_t& <span class='param'>cd_nelmts</span>, unsigned int* <span class='param'>cd_values</span>, <span class='nowrap'>size_t <span class='param'>namelen</span>,</span> <span class='nowrap'>char* <span class='param'>name</span>,</span> <span class='nowrap'>unsigned int& <span class='param'>fil [...]
-<span class='iname_a'>DSetCreatPropList::getLayout <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::getNfilters <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::isFillValueDefined <span class='sym_p'>( )</span></span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::modifyFilter <span class='sym_p'>( H5Z_filter_t <span class='param'>filter_id</span>, unsigned int <span class='param'>flags</span>, <span class='nowrap'>size_t <span class='param'>cd_nelmts</span>,</span> <span class='nowrap'>unsigned int const* <span class='param'>cd_values</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::removeFilter <span class='sym_p'>( <span class='nowrap'>H5Z_filter_t <span class='param'>filter_id</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setAllocTime <span class='sym_p'>( <span class='nowrap'>H5D_alloc_time_t <span class='param'>alloc_time</span> )</span></span></span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setChunk <span class='sym_p'>( <span class='nowrap'>int <span class='param'>ndims</span>,</span> <span class='nowrap'>hsize_t const* <span class='param'>dim</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setDeflate <span class='sym_p'>( <span class='nowrap'>int <span class='param'>level</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setExternal <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span>,</span> <span class='nowrap'>off_t <span class='param'>offset</span>,</span> <span class='nowrap'>hsize_t <span class='param'>size</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setFillTime <span class='sym_p'>( <span class='nowrap'>H5D_fill_time_t <span class='param'>fill_time</span> )</span></span></span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setFillValue <span class='sym_p'>( DataType const& <span class='param'>fvalue_type</span>, <span class='nowrap'>void const* <span class='param'>value</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setFilter <span class='sym_p'>( H5Z_filter_t <span class='param'>filter</span>, unsigned int <span class='param'>flags</span>, <span class='nowrap'>size_t <span class='param'>cd_nelmts</span>,</span> <span class='nowrap'>unsigned int const* <span class='param'>cd_values</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setFletcher32 <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setLayout <span class='sym_p'>( <span class='nowrap'>H5D_layout_t <span class='param'>layout</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setShuffle <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setSzip <span class='sym_p'>( unsigned int <span class='param'>options_mask</span>, <span class='nowrap'>unsigned int <span class='param'>pixels_per_block</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::~DSetCreatPropList <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span></span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-</div></div>
-<br/><br/></div>
-
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Symbol_Binary_Problems_Low'></a><a name='Interface_Binary_Problems_Low'></a>
-<h2>Problems with Symbols, Low Severity (158)</h2><hr/>
-<span class='h_name'>H5DataSet.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_181')">
-<span class='extendable'>[+]</span> DataSet::read <span class='sym_p'>( std::string& <span class='color_p'>buf</span>, DataType const& <span class='color_p'>mem_type</span>, DataSpace const& <span class='color_p'>mem_space</span>, DataSpace const& <span class='color_p'>file_space</span>, <span class='nowrap'>DSetMemXferPropList const& <span class='color_p'>xfer_plist</span> )</span></span> const (3)</span>
-<br/>
-<div id="c_181" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZNK2H57DataSet4readERSsRKNS_8DataTypeERKNS_9DataSpaceES7_RKNS_19DSetMemXferPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>DataSpace::ALL</b> of <b>4th</b> parameter <b>file_space</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>The default argument <b>DataSpace::ALL</b> of <b>3rd</b> parameter <b>mem_space</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-<tr><th>3</th><td align='left' valign='top'>The default argument <b>DSetMemXferPropList::DEFAULT</b> of <b>5th</b> parameter <b>xfer_plist</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_182')">
-<span class='extendable'>[+]</span> DataSet::read <span class='sym_p'>( <span class='nowrap'>void* <span class='color_p'>buf</span>,</span> DataType const& <span class='color_p'>mem_type</span>, DataSpace const& <span class='color_p'>mem_space</span>, DataSpace const& <span class='color_p'>file_space</span>, <span class='nowrap'>DSetMemXferPropList const& <span class='color_p'>xfer_plist</span> )</span></span> const (3)</span>
-<br/>
-<div id="c_182" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZNK2H57DataSet4readEPvRKNS_8DataTypeERKNS_9DataSpaceES7_RKNS_19DSetMemXferPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>DataSpace::ALL</b> of <b>4th</b> parameter <b>file_space</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>The default argument <b>DataSpace::ALL</b> of <b>3rd</b> parameter <b>mem_space</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-<tr><th>3</th><td align='left' valign='top'>The default argument <b>DSetMemXferPropList::DEFAULT</b> of <b>5th</b> parameter <b>xfer_plist</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_183')">
-<span class='extendable'>[+]</span> DataSet::vlenReclaim <span class='sym_p'>( <span class='nowrap'>void* <span class='color_p'>buf</span>,</span> DataType const& <span class='color_p'>type</span>, DataSpace const& <span class='color_p'>space</span>, <span class='nowrap'>DSetMemXferPropList const& <span class='color_p'>xfer_plist</span> )</span></span> <span class='attr'>[static]</span> (2)</span>
-<br/>
-<div id="c_183" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H57DataSet11vlenReclaimEPvRKNS_8DataTypeERKNS_9DataSpaceERKNS_19DSetMemXferPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>DataSpace::ALL</b> of <b>3rd</b> parameter <b>space</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>The default argument <b>DSetMemXferPropList::DEFAULT</b> of <b>4th</b> parameter <b>xfer_plist</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_184')">
-<span class='extendable'>[+]</span> DataSet::write <span class='sym_p'>( std::string const& <span class='color_p'>buf</span>, DataType const& <span class='color_p'>mem_type</span>, DataSpace const& <span class='color_p'>mem_space</span>, DataSpace const& <span class='color_p'>file_space</span>, <span class='nowrap'>DSetMemXferPropList const& <span class='color_p'>xfer_plist</span> )</span></span> const (3)</span>
-<br/>
-<div id="c_184" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZNK2H57DataSet5writeERKSsRKNS_8DataTypeERKNS_9DataSpaceES8_RKNS_19DSetMemXferPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>DataSpace::ALL</b> of <b>4th</b> parameter <b>file_space</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>The default argument <b>DataSpace::ALL</b> of <b>3rd</b> parameter <b>mem_space</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-<tr><th>3</th><td align='left' valign='top'>The default argument <b>DSetMemXferPropList::DEFAULT</b> of <b>5th</b> parameter <b>xfer_plist</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_185')">
-<span class='extendable'>[+]</span> DataSet::write <span class='sym_p'>( <span class='nowrap'>void const* <span class='color_p'>buf</span>,</span> DataType const& <span class='color_p'>mem_type</span>, DataSpace const& <span class='color_p'>mem_space</span>, DataSpace const& <span class='color_p'>file_space</span>, <span class='nowrap'>DSetMemXferPropList const& <span class='color_p'>xfer_plist</span> )</span></span> const (3)</span>
-<br/>
-<div id="c_185" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZNK2H57DataSet5writeEPKvRKNS_8DataTypeERKNS_9DataSpaceES8_RKNS_19DSetMemXferPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>DataSpace::ALL</b> of <b>4th</b> parameter <b>file_space</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>The default argument <b>DataSpace::ALL</b> of <b>3rd</b> parameter <b>mem_space</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-<tr><th>3</th><td align='left' valign='top'>The default argument <b>DSetMemXferPropList::DEFAULT</b> of <b>5th</b> parameter <b>xfer_plist</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5DataSpace.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_186')">
-<span class='extendable'>[+]</span> DataSpace::ALL <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_186" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H59DataSpace3ALLE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5DataType.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_187')">
-<span class='extendable'>[+]</span> DataType::convert <span class='sym_p'>( DataType const& <span class='color_p'>dest</span>, <span class='nowrap'>size_t <span class='color_p'>nelmts</span>,</span> <span class='nowrap'>void* <span class='color_p'>buf</span>,</span> void* <span class='color_p'>background</span>, <span class='nowrap'>PropList const& <span class='color_p'>plist</span> )</span></span> const (1)</span>
-<br/>
-<div id="c_187" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZNK2H58DataType7convertERKS0_mPvS3_RKNS_8PropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>PropList::DEFAULT</b> of <b>5th</b> parameter <b>plist</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5DcreatProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_188')">
-<span class='extendable'>[+]</span> DSetCreatPropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_188" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H517DSetCreatPropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5DxferProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_189')">
-<span class='extendable'>[+]</span> DSetMemXferPropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_189" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H519DSetMemXferPropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5FaccProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_190')">
-<span class='extendable'>[+]</span> FileAccPropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_190" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H515FileAccPropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5FcreatProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_191')">
-<span class='extendable'>[+]</span> FileCreatPropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_191" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H517FileCreatPropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5File.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_192')">
-<span class='extendable'>[+]</span> H5File::H5File <span class='attr'>[in-charge]</span> <span class='sym_p'>( char const* <span class='color_p'>name</span>, unsigned int <span class='color_p'>flags</span>, FileCreatPropList const& <span class='color_p'>create_plist</span>, <span class='nowrap'>FileAccPropList const& <span class='color_p'>access_plist</span> )</span></span> (2)</span>
-<br/>
-<div id="c_192" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H56H5FileC1EPKcjRKNS_17FileCreatPropListERKNS_15FileAccPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>FileAccPropList::DEFAULT</b> of <b>4th</b> parameter <b>access_plist</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>The default argument <b>FileCreatPropList::DEFAULT</b> of <b>3rd</b> parameter <b>create_plist</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_193')">
-<span class='extendable'>[+]</span> H5File::H5File <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( char const* <span class='color_p'>name</span>, unsigned int <span class='color_p'>flags</span>, FileCreatPropList const& <span class='color_p'>create_plist</span>, <span class='nowrap'>FileAccPropList const& <span class='color_p'>access_plist</span> )</span></span> (2)</span>
-<br/>
-<div id="c_193" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H56H5FileC2EPKcjRKNS_17FileCreatPropListERKNS_15FileAccPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>FileAccPropList::DEFAULT</b> of <b>4th</b> parameter <b>access_plist</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>The default argument <b>FileCreatPropList::DEFAULT</b> of <b>3rd</b> parameter <b>create_plist</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_194')">
-<span class='extendable'>[+]</span> H5File::H5File <span class='attr'>[in-charge]</span> <span class='sym_p'>( std::string const& <span class='color_p'>name</span>, unsigned int <span class='color_p'>flags</span>, FileCreatPropList const& <span class='color_p'>create_plist</span>, <span class='nowrap'>FileAccPropList const& <span class='color_p'>access_plist</span> )</span></span> (2)</span>
-<br/>
-<div id="c_194" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H56H5FileC1ERKSsjRKNS_17FileCreatPropListERKNS_15FileAccPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>FileAccPropList::DEFAULT</b> of <b>4th</b> parameter <b>access_plist</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>The default argument <b>FileCreatPropList::DEFAULT</b> of <b>3rd</b> parameter <b>create_plist</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_195')">
-<span class='extendable'>[+]</span> H5File::H5File <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( std::string const& <span class='color_p'>name</span>, unsigned int <span class='color_p'>flags</span>, FileCreatPropList const& <span class='color_p'>create_plist</span>, <span class='nowrap'>FileAccPropList const& <span class='color_p'>access_plist</span> )</span></span> (2)</span>
-<br/>
-<div id="c_195" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H56H5FileC2ERKSsjRKNS_17FileCreatPropListERKNS_15FileAccPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>FileAccPropList::DEFAULT</b> of <b>4th</b> parameter <b>access_plist</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>The default argument <b>FileCreatPropList::DEFAULT</b> of <b>3rd</b> parameter <b>create_plist</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_196')">
-<span class='extendable'>[+]</span> H5File::openFile <span class='sym_p'>( char const* <span class='color_p'>name</span>, unsigned int <span class='color_p'>flags</span>, <span class='nowrap'>FileAccPropList const& <span class='color_p'>access_plist</span> )</span></span> (1)</span>
-<br/>
-<div id="c_196" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H56H5File8openFileEPKcjRKNS_15FileAccPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>FileAccPropList::DEFAULT</b> of <b>3rd</b> parameter <b>access_plist</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_197')">
-<span class='extendable'>[+]</span> H5File::openFile <span class='sym_p'>( std::string const& <span class='color_p'>name</span>, unsigned int <span class='color_p'>flags</span>, <span class='nowrap'>FileAccPropList const& <span class='color_p'>access_plist</span> )</span></span> (1)</span>
-<br/>
-<div id="c_197" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H56H5File8openFileERKSsjRKNS_15FileAccPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>FileAccPropList::DEFAULT</b> of <b>3rd</b> parameter <b>access_plist</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5Location.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_198')">
-<span class='extendable'>[+]</span> H5Location::createAttribute <span class='sym_p'>( char const* <span class='color_p'>name</span>, DataType const& <span class='color_p'>type</span>, DataSpace const& <span class='color_p'>space</span>, <span class='nowrap'>PropList const& <span class='color_p'>create_plist</span> )</span></span> const (1)</span>
-<br/>
-<div id="c_198" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZNK2H510H5Location15createAttributeEPKcRKNS_8DataTypeERKNS_9DataSpaceERKNS_8PropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>PropList::DEFAULT</b> of <b>4th</b> parameter <b>create_plist</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_199')">
-<span class='extendable'>[+]</span> H5Location::createAttribute <span class='sym_p'>( std::string const& <span class='color_p'>name</span>, DataType const& <span class='color_p'>type</span>, DataSpace const& <span class='color_p'>space</span>, <span class='nowrap'>PropList const& <span class='color_p'>create_plist</span> )</span></span> const (1)</span>
-<br/>
-<div id="c_199" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZNK2H510H5Location15createAttributeERKSsRKNS_8DataTypeERKNS_9DataSpaceERKNS_8PropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>PropList::DEFAULT</b> of <b>4th</b> parameter <b>create_plist</b> has been removed.</td><td align='left' valign='top'>Applications will pass an old default argument (that is not default any more) that may not be properly handled anymore. This may result in crash or incorrect behavior of applications.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5PredType.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_200')">
-<span class='extendable'>[+]</span> PredType::ALPHA_B16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_200" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_B16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_201')">
-<span class='extendable'>[+]</span> PredType::ALPHA_B32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_201" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_B32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_202')">
-<span class='extendable'>[+]</span> PredType::ALPHA_B64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_202" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_B64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_203')">
-<span class='extendable'>[+]</span> PredType::ALPHA_B8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_203" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8ALPHA_B8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_204')">
-<span class='extendable'>[+]</span> PredType::ALPHA_F32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_204" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_F32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_205')">
-<span class='extendable'>[+]</span> PredType::ALPHA_F64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_205" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_F64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_206')">
-<span class='extendable'>[+]</span> PredType::ALPHA_I16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_206" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_I16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_207')">
-<span class='extendable'>[+]</span> PredType::ALPHA_I32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_207" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_I32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_208')">
-<span class='extendable'>[+]</span> PredType::ALPHA_I64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_208" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_I64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_209')">
-<span class='extendable'>[+]</span> PredType::ALPHA_I8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_209" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8ALPHA_I8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_210')">
-<span class='extendable'>[+]</span> PredType::ALPHA_U16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_210" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_U16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_211')">
-<span class='extendable'>[+]</span> PredType::ALPHA_U32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_211" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_U32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_212')">
-<span class='extendable'>[+]</span> PredType::ALPHA_U64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_212" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_U64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_213')">
-<span class='extendable'>[+]</span> PredType::ALPHA_U8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_213" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8ALPHA_U8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_214')">
-<span class='extendable'>[+]</span> PredType::C_S1 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_214" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType4C_S1E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_215')">
-<span class='extendable'>[+]</span> PredType::FORTRAN_S1 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_215" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10FORTRAN_S1E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_216')">
-<span class='extendable'>[+]</span> PredType::IEEE_F32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_216" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10IEEE_F32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_217')">
-<span class='extendable'>[+]</span> PredType::IEEE_F32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_217" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10IEEE_F32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_218')">
-<span class='extendable'>[+]</span> PredType::IEEE_F64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_218" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10IEEE_F64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_219')">
-<span class='extendable'>[+]</span> PredType::IEEE_F64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_219" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10IEEE_F64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_220')">
-<span class='extendable'>[+]</span> PredType::INTEL_B16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_220" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_B16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_221')">
-<span class='extendable'>[+]</span> PredType::INTEL_B32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_221" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_B32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_222')">
-<span class='extendable'>[+]</span> PredType::INTEL_B64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_222" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_B64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_223')">
-<span class='extendable'>[+]</span> PredType::INTEL_B8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_223" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8INTEL_B8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_224')">
-<span class='extendable'>[+]</span> PredType::INTEL_F32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_224" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_F32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_225')">
-<span class='extendable'>[+]</span> PredType::INTEL_F64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_225" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_F64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_226')">
-<span class='extendable'>[+]</span> PredType::INTEL_I16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_226" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_I16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_227')">
-<span class='extendable'>[+]</span> PredType::INTEL_I32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_227" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_I32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_228')">
-<span class='extendable'>[+]</span> PredType::INTEL_I64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_228" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_I64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_229')">
-<span class='extendable'>[+]</span> PredType::INTEL_I8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_229" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8INTEL_I8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_230')">
-<span class='extendable'>[+]</span> PredType::INTEL_U16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_230" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_U16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_231')">
-<span class='extendable'>[+]</span> PredType::INTEL_U32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_231" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_U32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_232')">
-<span class='extendable'>[+]</span> PredType::INTEL_U64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_232" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_U64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_233')">
-<span class='extendable'>[+]</span> PredType::INTEL_U8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_233" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8INTEL_U8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_234')">
-<span class='extendable'>[+]</span> PredType::MIPS_B16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_234" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_B16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_235')">
-<span class='extendable'>[+]</span> PredType::MIPS_B32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_235" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_B32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_236')">
-<span class='extendable'>[+]</span> PredType::MIPS_B64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_236" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_B64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_237')">
-<span class='extendable'>[+]</span> PredType::MIPS_B8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_237" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType7MIPS_B8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_238')">
-<span class='extendable'>[+]</span> PredType::MIPS_F32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_238" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_F32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_239')">
-<span class='extendable'>[+]</span> PredType::MIPS_F64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_239" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_F64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_240')">
-<span class='extendable'>[+]</span> PredType::MIPS_I16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_240" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_I16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_241')">
-<span class='extendable'>[+]</span> PredType::MIPS_I32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_241" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_I32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_242')">
-<span class='extendable'>[+]</span> PredType::MIPS_I64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_242" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_I64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_243')">
-<span class='extendable'>[+]</span> PredType::MIPS_I8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_243" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType7MIPS_I8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_244')">
-<span class='extendable'>[+]</span> PredType::MIPS_U16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_244" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_U16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_245')">
-<span class='extendable'>[+]</span> PredType::MIPS_U32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_245" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_U32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_246')">
-<span class='extendable'>[+]</span> PredType::MIPS_U64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_246" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_U64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_247')">
-<span class='extendable'>[+]</span> PredType::MIPS_U8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_247" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType7MIPS_U8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_248')">
-<span class='extendable'>[+]</span> PredType::NATIVE_B16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_248" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10NATIVE_B16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_249')">
-<span class='extendable'>[+]</span> PredType::NATIVE_B32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_249" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10NATIVE_B32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_250')">
-<span class='extendable'>[+]</span> PredType::NATIVE_B64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_250" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10NATIVE_B64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_251')">
-<span class='extendable'>[+]</span> PredType::NATIVE_B8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_251" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9NATIVE_B8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_252')">
-<span class='extendable'>[+]</span> PredType::NATIVE_CHAR <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_252" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_CHARE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_253')">
-<span class='extendable'>[+]</span> PredType::NATIVE_DOUBLE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_253" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_DOUBLEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_254')">
-<span class='extendable'>[+]</span> PredType::NATIVE_FLOAT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_254" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_FLOATE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_255')">
-<span class='extendable'>[+]</span> PredType::NATIVE_HBOOL <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_255" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_HBOOLE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_256')">
-<span class='extendable'>[+]</span> PredType::NATIVE_HERR <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_256" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_HERRE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_257')">
-<span class='extendable'>[+]</span> PredType::NATIVE_HSIZE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_257" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_HSIZEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_258')">
-<span class='extendable'>[+]</span> PredType::NATIVE_HSSIZE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_258" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_HSSIZEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_259')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_259" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10NATIVE_INTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_260')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_260" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_INT16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_261')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_261" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_INT32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_262')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_262" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_INT64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_263')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_263" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_INT8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_264')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_FAST16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_264" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_INT_FAST16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_265')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_FAST32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_265" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_INT_FAST32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_266')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_FAST64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_266" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_INT_FAST64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_267')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_FAST8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_267" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType16NATIVE_INT_FAST8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_268')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_LEAST16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_268" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_INT_LEAST16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_269')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_LEAST32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_269" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_INT_LEAST32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_270')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_LEAST64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_270" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_INT_LEAST64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_271')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_LEAST8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_271" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_INT_LEAST8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_272')">
-<span class='extendable'>[+]</span> PredType::NATIVE_LDOUBLE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_272" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType14NATIVE_LDOUBLEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_273')">
-<span class='extendable'>[+]</span> PredType::NATIVE_LLONG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_273" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_LLONGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_274')">
-<span class='extendable'>[+]</span> PredType::NATIVE_LONG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_274" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_LONGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_275')">
-<span class='extendable'>[+]</span> PredType::NATIVE_OPAQUE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_275" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_OPAQUEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_276')">
-<span class='extendable'>[+]</span> PredType::NATIVE_SCHAR <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_276" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_SCHARE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_277')">
-<span class='extendable'>[+]</span> PredType::NATIVE_SHORT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_277" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_SHORTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_278')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UCHAR <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_278" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_UCHARE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_279')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_279" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_UINTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_280')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_280" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_UINT16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_281')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_281" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_UINT32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_282')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_282" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_UINT64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_283')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_283" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_UINT8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_284')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_FAST16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_284" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_UINT_FAST16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_285')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_FAST32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_285" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_UINT_FAST32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_286')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_FAST64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_286" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_UINT_FAST64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_287')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_FAST8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_287" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_UINT_FAST8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_288')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_LEAST16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_288" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType19NATIVE_UINT_LEAST16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_289')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_LEAST32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_289" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType19NATIVE_UINT_LEAST32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_290')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_LEAST64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_290" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType19NATIVE_UINT_LEAST64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_291')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_LEAST8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_291" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_UINT_LEAST8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_292')">
-<span class='extendable'>[+]</span> PredType::NATIVE_ULLONG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_292" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_ULLONGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_293')">
-<span class='extendable'>[+]</span> PredType::NATIVE_ULONG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_293" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_ULONGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_294')">
-<span class='extendable'>[+]</span> PredType::NATIVE_USHORT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_294" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_USHORTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_295')">
-<span class='extendable'>[+]</span> PredType::STD_B16BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_295" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B16BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_296')">
-<span class='extendable'>[+]</span> PredType::STD_B16LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_296" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B16LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_297')">
-<span class='extendable'>[+]</span> PredType::STD_B32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_297" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_298')">
-<span class='extendable'>[+]</span> PredType::STD_B32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_298" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_299')">
-<span class='extendable'>[+]</span> PredType::STD_B64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_299" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_300')">
-<span class='extendable'>[+]</span> PredType::STD_B64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_300" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_301')">
-<span class='extendable'>[+]</span> PredType::STD_B8BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_301" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_B8BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_302')">
-<span class='extendable'>[+]</span> PredType::STD_B8LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_302" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_B8LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_303')">
-<span class='extendable'>[+]</span> PredType::STD_I16BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_303" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I16BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_304')">
-<span class='extendable'>[+]</span> PredType::STD_I16LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_304" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I16LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_305')">
-<span class='extendable'>[+]</span> PredType::STD_I32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_305" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_306')">
-<span class='extendable'>[+]</span> PredType::STD_I32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_306" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_307')">
-<span class='extendable'>[+]</span> PredType::STD_I64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_307" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_308')">
-<span class='extendable'>[+]</span> PredType::STD_I64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_308" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_309')">
-<span class='extendable'>[+]</span> PredType::STD_I8BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_309" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_I8BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_310')">
-<span class='extendable'>[+]</span> PredType::STD_I8LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_310" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_I8LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_311')">
-<span class='extendable'>[+]</span> PredType::STD_REF_DSETREG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_311" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType15STD_REF_DSETREGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_312')">
-<span class='extendable'>[+]</span> PredType::STD_REF_OBJ <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_312" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11STD_REF_OBJE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_313')">
-<span class='extendable'>[+]</span> PredType::STD_U16BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_313" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U16BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_314')">
-<span class='extendable'>[+]</span> PredType::STD_U16LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_314" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U16LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_315')">
-<span class='extendable'>[+]</span> PredType::STD_U32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_315" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_316')">
-<span class='extendable'>[+]</span> PredType::STD_U32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_316" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_317')">
-<span class='extendable'>[+]</span> PredType::STD_U64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_317" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_318')">
-<span class='extendable'>[+]</span> PredType::STD_U64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_318" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_319')">
-<span class='extendable'>[+]</span> PredType::STD_U8BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_319" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_U8BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_320')">
-<span class='extendable'>[+]</span> PredType::STD_U8LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_320" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_U8LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_321')">
-<span class='extendable'>[+]</span> PredType::UNIX_D32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_321" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10UNIX_D32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_322')">
-<span class='extendable'>[+]</span> PredType::UNIX_D32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_322" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10UNIX_D32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_323')">
-<span class='extendable'>[+]</span> PredType::UNIX_D64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_323" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10UNIX_D64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_324')">
-<span class='extendable'>[+]</span> PredType::UNIX_D64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_324" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10UNIX_D64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5PropList.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_325')">
-<span class='extendable'>[+]</span> PropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_325" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Replacement of data type may indicate a change in semantic meaning.</td></tr>
-</table><br/>
-</div>
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Constant_Binary_Problems_Low'></a><h2>Problems with Constants, Low Severity (5)</h2><hr/>
-<span class='h_name'>H5Library.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_326')">
-<span class='extendable'>[+]</span> NOTATEXIT</span>
-<br/>
-<div id="c_326" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>NOTATEXIT</b> with value <b>(-10)</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5PredType.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_327')">
-<span class='extendable'>[+]</span> H5CPP_EXITED</span>
-<br/>
-<div id="c_327" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5CPP_EXITED</b> with value <b>-3</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5pubconf.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_328')">
-<span class='extendable'>[+]</span> H5_CONVERT_DENORMAL_FLOAT</span>
-<br/>
-<div id="c_328" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_CONVERT_DENORMAL_FLOAT</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_329')">
-<span class='extendable'>[+]</span> H5_FP_TO_INTEGER_OVERFLOW_WORKS</span>
-<br/>
-<div id="c_329" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_FP_TO_INTEGER_OVERFLOW_WORKS</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>The value of this constant may no longer be properly handled by new-version library functions.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5public.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_330')">
-<span class='extendable'>[+]</span> H5_VERS_SUBRELEASE</span>
-<br/>
-<div id="c_330" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5_VERS_SUBRELEASE</b> has been changed from <b>"patch1"</b> to <b>""</b>.</td><td align='left' valign='top'>Applications will pass an old value of this constant as the parameter to the new-version library functions, that expect a new one. This may result in crash of incorrect behavior of applications.</td></tr>
-</table><br/></div>
-
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Other_Binary_Changes'></a><a name='Other_Binary_Changes_In_Constants'></a><h2>Other Changes in Constants (3)</h2><hr/>
-<span class='h_name'>H5pubconf.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_331')">
-<span class='extendable'>[+]</span> H5_HAVE___INLINE</span>
-<br/>
-<div id="c_331" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE___INLINE</b> with value <b>1</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_332')">
-<span class='extendable'>[+]</span> H5_HAVE___INLINE__</span>
-<br/>
-<div id="c_332" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE___INLINE__</b> with value <b>1</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_333')">
-<span class='extendable'>[+]</span> H5_HAVE_INLINE</span>
-<br/>
-<div id="c_333" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_INLINE</b> with value <b>1</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Headers'></a><h2>Header Files (76)</h2><hr/>
-<div class='h_list'>
-H5AbstractDs.h<br/>
-H5ACpublic.h<br/>
-H5api_adpt.h<br/>
-H5Apublic.h<br/>
-H5ArrayType.h<br/>
-H5AtomType.h<br/>
-H5Attribute.h<br/>
-H5Classes.h<br/>
-H5CommonFG.h<br/>
-H5CompType.h<br/>
-H5Cpp.h<br/>
-H5CppDoc.h<br/>
-H5Cpublic.h<br/>
-H5DataSet.h<br/>
-H5DataSpace.h<br/>
-H5DataType.h<br/>
-H5DcreatProp.h<br/>
-H5DOpublic.h<br/>
-H5Dpublic.h<br/>
-H5DSpublic.h<br/>
-H5DxferProp.h<br/>
-H5EnumType.h<br/>
-H5Epubgen.h<br/>
-H5Epublic.h<br/>
-H5Exception.h<br/>
-H5f90i.h<br/>
-H5f90i_gen.h<br/>
-H5FaccProp.h<br/>
-H5FcreatProp.h<br/>
-H5FDcore.h<br/>
-H5FDdirect.h<br/>
-H5FDfamily.h<br/>
-H5FDlog.h<br/>
-H5FDmpi.h<br/>
-H5FDmpio.h<br/>
-H5FDmulti.h<br/>
-H5FDpublic.h<br/>
-H5FDsec2.h<br/>
-H5FDstdio.h<br/>
-H5File.h<br/>
-H5FloatType.h<br/>
-H5Fpublic.h<br/>
-H5Gpublic.h<br/>
-H5Group.h<br/>
-H5IdComponent.h<br/>
-H5IMpublic.h<br/>
-H5Include.h<br/>
-H5IntType.h<br/>
-H5Ipublic.h<br/>
-H5Library.h<br/>
-H5Location.h<br/>
-H5Lpublic.h<br/>
-H5LTpublic.h<br/>
-H5MMpublic.h<br/>
-H5Object.h<br/>
-H5Opublic.h<br/>
-H5overflow.h<br/>
-H5PacketTable.h<br/>
-H5PLextern.h<br/>
-H5PLpublic.h<br/>
-H5Ppublic.h<br/>
-H5PredType.h<br/>
-H5PropList.h<br/>
-H5PTpublic.h<br/>
-H5pubconf.h<br/>
-H5public.h<br/>
-H5Rpublic.h<br/>
-H5Spublic.h<br/>
-H5StrType.h<br/>
-H5TBpublic.h<br/>
-H5Tpublic.h<br/>
-H5VarLenType.h<br/>
-H5version.h<br/>
-H5Zpublic.h<br/>
-hdf5.h<br/>
-hdf5_hl.h<br/>
-</div>
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<br/><br/><br/></div><div id='SourceTab' class='tab'>
-<h2>Test Info</h2><hr/>
-<table class='summary'>
-<tr><th>Library Name</th><td>hdf5</td></tr>
-<tr><th>Version #1</th><td>1.8.15-patch1</td></tr>
-<tr><th>Version #2</th><td>1.8.16</td></tr>
-<tr><th>CPU Type</th><td>x86_64</td></tr>
-<tr><th>GCC Version</th><td>4.4.7</td></tr>
-<tr><th>Subject</th><td width='150px'>Source Compatibility</td></tr>
-</table>
-<h2>Test Results</h2><hr/>
-<table class='summary'><tr><th>Total Header Files</th><td><a href='#Headers' style='color:Blue;'>76</a></td></tr>
-<tr><th>Total Shared Libraries</th><td>0 (not analyzed)</td></tr>
-<tr><th>Total Symbols / Types</th><td>1815 / 541</td></tr>
-<tr><th>Verdict</th><td><span style='color:Red;'><b>Incompatible<br/>(4.2%)</b></span></td></tr>
-</table>
-<h2>Problem Summary</h2><hr/>
-<table class='summary'><tr><th></th><th style='text-align:center;'>Severity</th><th style='text-align:center;'>Count</th></tr><tr><th>Added Symbols</th><td>-</td><td class='new'><a href='#Source_Added' style='color:Blue;'>35</a></td></tr>
-<tr><th>Removed Symbols</th><td>High</td><td class='failed'><a href='#Source_Removed' style='color:Blue;'>6</a></td></tr>
-<tr><th rowspan='3'>Problems with<br/>Data Types</th><td>High</td><td>0</td></tr>
-<tr><td>Medium</td><td>0</td></tr>
-<tr><td>Low</td><td class='warning'><a href='#Type_Source_Problems_Low' style='color:Blue;'>2</a></td></tr>
-<tr><th rowspan='3'>Problems with<br/>Symbols</th><td>High</td><td>0</td></tr>
-<tr><td>Medium</td><td class='failed'><a href='#Symbol_Source_Problems_Medium' style='color:Blue;'>164</a></td></tr>
-<tr><td>Low</td><td class='warning'><a href='#Symbol_Source_Problems_Low' style='color:Blue;'>131</a></td></tr>
-<tr><th>Problems with<br/>Constants</th><td>Low</td><td class='warning'><a href='#Constant_Source_Problems_Low' style='color:Blue;'>11</a></td></tr>
-<tr><th>Other Changes<br/>in Constants</th><td>-</td><td class='passed'><a href='#Other_Source_Changes_In_Constants' style='color:Blue;'>3</a></td></tr>
-</table>
-
-<a name='Source_Added'></a><h2>Added Symbols (35)</h2><hr/>
-<span class='h_name'>H5DataSpace.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_334')">
-DataSpace::deleteConstants <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_334" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H59DataSpace15deleteConstantsEv</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5DcreatProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_335')">
-DSetCreatPropList::deleteConstants <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_335" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H517DSetCreatPropList15deleteConstantsEv</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5DxferProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_336')">
-DSetMemXferPropList::deleteConstants <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_336" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H519DSetMemXferPropList15deleteConstantsEv</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5FaccProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_337')">
-FileAccPropList::deleteConstants <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_337" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H515FileAccPropList15deleteConstantsEv</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5FcreatProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_338')">
-FileCreatPropList::deleteConstants <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_338" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H517FileCreatPropList15deleteConstantsEv</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5IdComponent.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_339')">
-IdComponent::H5dontAtexit_called <span class='attr'>[data]</span></span>
-<br/>
-<div id="c_339" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H511IdComponent19H5dontAtexit_calledE</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5Library.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_340')">
-H5Library::initH5cpp <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_340" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H59H5Library9initH5cppEv</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_341')">
-H5Library::termH5cpp <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_341" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H59H5Library9termH5cppEv</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5OcreatProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_342')">
-ObjCreatPropList::DEFAULT <span class='attr'>[data]</span></span>
-<br/>
-<div id="c_342" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropList7DEFAULTE</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_343')">
-ObjCreatPropList::deleteConstants <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_343" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropList15deleteConstantsEv</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_344')">
-ObjCreatPropList::fromClass <span class='sym_p'>( )</span> const</span>
-<br/>
-<div id="c_344" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H516ObjCreatPropList9fromClassEv</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_345')">
-ObjCreatPropList::getAttrCrtOrder <span class='sym_p'>( )</span> const</span>
-<br/>
-<div id="c_345" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H516ObjCreatPropList15getAttrCrtOrderEv</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_346')">
-ObjCreatPropList::getAttrPhaseChange <span class='sym_p'>( unsigned int& <span class='color_p'>max_compact</span>, <span class='nowrap'>unsigned int& <span class='color_p'>min_dense</span> )</span></span> const</span>
-<br/>
-<div id="c_346" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H516ObjCreatPropList18getAttrPhaseChangeERjS1_</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_347')">
-ObjCreatPropList::ObjCreatPropList <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span></span>
-<br/>
-<div id="c_347" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropListC1Ev</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_348')">
-ObjCreatPropList::ObjCreatPropList <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>ObjCreatPropList const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_348" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropListC1ERKS0_</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_349')">
-ObjCreatPropList::ObjCreatPropList <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t const <span class='color_p'>plist_id</span> )</span></span></span>
-<br/>
-<div id="c_349" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropListC1Ei</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_350')">
-ObjCreatPropList::ObjCreatPropList <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( )</span></span>
-<br/>
-<div id="c_350" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropListC2Ev</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_351')">
-ObjCreatPropList::ObjCreatPropList <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>ObjCreatPropList const& <span class='color_p'>original</span> )</span></span></span>
-<br/>
-<div id="c_351" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropListC2ERKS0_</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_352')">
-ObjCreatPropList::ObjCreatPropList <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t const <span class='color_p'>plist_id</span> )</span></span></span>
-<br/>
-<div id="c_352" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropListC2Ei</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_353')">
-ObjCreatPropList::setAttrCrtOrder <span class='sym_p'>( <span class='nowrap'>unsigned int <span class='color_p'>crt_order_flags</span> )</span></span> const</span>
-<br/>
-<div id="c_353" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H516ObjCreatPropList15setAttrCrtOrderEj</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_354')">
-ObjCreatPropList::setAttrPhaseChange <span class='sym_p'>( unsigned int <span class='color_p'>max_compact</span>, <span class='nowrap'>unsigned int <span class='color_p'>min_dense</span> )</span></span> const</span>
-<br/>
-<div id="c_354" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZNK2H516ObjCreatPropList18setAttrPhaseChangeEjj</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_355')">
-ObjCreatPropList::~ObjCreatPropList <span class='attr'>[in-charge-deleting]</span> <span class='sym_p'>( )</span></span>
-<br/>
-<div id="c_355" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropListD0Ev</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_356')">
-ObjCreatPropList::~ObjCreatPropList <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span></span>
-<br/>
-<div id="c_356" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropListD1Ev</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_357')">
-ObjCreatPropList::~ObjCreatPropList <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( )</span></span>
-<br/>
-<div id="c_357" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516ObjCreatPropListD2Ev</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5PacketTable.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_358')">
-FL_PacketTable::FL_PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span>
-<br/>
-<div id="c_358" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN14FL_PacketTableC1EiPKc</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_359')">
-FL_PacketTable::FL_PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> char const* <span class='color_p'>name</span>, <span class='nowrap'>hid_t <span class='color_p'>dtypeID</span>,</span> hsize_t <span class='color_p'>chunkSize</span>, <span class='nowrap'>int <span class='color_p'>compression</span> )</span></span></span>
-<br/>
-<div id="c_359" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN14FL_PacketTableC1EiPKciyi</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_360')">
-FL_PacketTable::FL_PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span>
-<br/>
-<div id="c_360" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN14FL_PacketTableC2EiPKc</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_361')">
-FL_PacketTable::FL_PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> char const* <span class='color_p'>name</span>, <span class='nowrap'>hid_t <span class='color_p'>dtypeID</span>,</span> hsize_t <span class='color_p'>chunkSize</span>, <span class='nowrap'>int <span class='color_p'>compression</span> )</span></span></span>
-<br/>
-<div id="c_361" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN14FL_PacketTableC2EiPKciyi</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_362')">
-PacketTable::PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span>
-<br/>
-<div id="c_362" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN11PacketTableC1EiPKc</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_363')">
-PacketTable::PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span>
-<br/>
-<div id="c_363" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN11PacketTableC2EiPKc</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5PredType.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_364')">
-PredType::deleteConstants <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_364" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H58PredType15deleteConstantsEv</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_365')">
-PredType::PREDTYPE_CONST <span class='attr'>[data]</span></span>
-<br/>
-<div id="c_365" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H58PredType14PREDTYPE_CONSTE</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5PropList.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_366')">
-f_PropList_setId <span class='sym_p'>( <span class='nowrap'>PropList* <span class='color_p'>plist</span>,</span> <span class='nowrap'>hid_t <span class='color_p'>new_id</span> )</span></span></span>
-<br/>
-<div id="c_366" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H516f_PropList_setIdEPNS_8PropListEi</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_367')">
-PropList::deleteConstants <span class='sym_p'>( )</span> <span class='attr'>[static]</span></span>
-<br/>
-<div id="c_367" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN2H58PropList15deleteConstantsEv</b>]</span><br/><br/></div>
-
-<br/>
-<span class='h_name'>H5public.h</span><br/>
-<span class="iname">H5is_library_threadsafe <span class='sym_p'>( <span class='nowrap'>hbool_t* <span class='color_p'>is_ts</span> )</span></span></span><br/>
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Source_Removed'></a><a name='Source_Withdrawn'></a><h2>Removed Symbols (6)</h2><hr/>
-<span class='h_name'>H5PacketTable.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_368')">
-FL_PacketTable::FL_PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span> )</span></span></span>
-<br/>
-<div id="c_368" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN14FL_PacketTableC1EiPc</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_369')">
-FL_PacketTable::FL_PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span>,</span> <span class='nowrap'>hid_t <span class='color_p'>dtypeID</span>,</span> hsize_t <span class='color_p'>chunkSize</span>, <span class='nowrap'>int <span class='color_p'>compression</span> )</span></span></span>
-<br/>
-<div id="c_369" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN14FL_PacketTableC1EiPciyi</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_370')">
-FL_PacketTable::FL_PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span> )</span></span></span>
-<br/>
-<div id="c_370" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN14FL_PacketTableC2EiPc</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_371')">
-FL_PacketTable::FL_PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span>,</span> <span class='nowrap'>hid_t <span class='color_p'>dtypeID</span>,</span> hsize_t <span class='color_p'>chunkSize</span>, <span class='nowrap'>int <span class='color_p'>compression</span> )</span></span></span>
-<br/>
-<div id="c_371" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN14FL_PacketTableC2EiPciyi</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_372')">
-PacketTable::PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span> )</span></span></span>
-<br/>
-<div id="c_372" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN11PacketTableC1EiPc</b>]</span><br/><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_373')">
-PacketTable::PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span> )</span></span></span>
-<br/>
-<div id="c_373" style="display:none;">
-<span class='mangled'>[symbol: <b>_ZN11PacketTableC2EiPc</b>]</span><br/><br/></div>
-
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Medium_Risk_Source_Problems'></a><a name='Symbol_Source_Problems_Medium'></a><a name='Interface_Source_Problems_Medium'></a>
-<h2>Problems with Symbols, Medium Severity (164)</h2><hr/>
-<span class='h_name'>H5DataSet.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_374')">
-<span class='extendable'>[+]</span> DataSet::read <span class='sym_p'>( std::string& <span class='color_p'>buf</span>, DataType const& <span class='color_p'>mem_type</span>, DataSpace const& <span class='color_p'>mem_space</span>, DataSpace const& <span class='color_p'>file_space</span>, <span class='nowrap'>DSetMemXferPropList const& <span class='color_p'>xfer_plist</span> )</span></span> const (3)</span>
-<br/>
-<div id="c_374" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZNK2H57DataSet4readERSsRKNS_8DataTypeERKNS_9DataSpaceES7_RKNS_19DSetMemXferPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>DataSpace::ALL</b> of <b>4th</b> parameter <b>file_space</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>The default argument <b>DataSpace::ALL</b> of <b>3rd</b> parameter <b>mem_space</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-<tr><th>3</th><td align='left' valign='top'>The default argument <b>DSetMemXferPropList::DEFAULT</b> of <b>5th</b> parameter <b>xfer_plist</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_375')">
-<span class='extendable'>[+]</span> DataSet::read <span class='sym_p'>( <span class='nowrap'>void* <span class='color_p'>buf</span>,</span> DataType const& <span class='color_p'>mem_type</span>, DataSpace const& <span class='color_p'>mem_space</span>, DataSpace const& <span class='color_p'>file_space</span>, <span class='nowrap'>DSetMemXferPropList const& <span class='color_p'>xfer_plist</span> )</span></span> const (3)</span>
-<br/>
-<div id="c_375" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZNK2H57DataSet4readEPvRKNS_8DataTypeERKNS_9DataSpaceES7_RKNS_19DSetMemXferPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>DataSpace::ALL</b> of <b>4th</b> parameter <b>file_space</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>The default argument <b>DataSpace::ALL</b> of <b>3rd</b> parameter <b>mem_space</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-<tr><th>3</th><td align='left' valign='top'>The default argument <b>DSetMemXferPropList::DEFAULT</b> of <b>5th</b> parameter <b>xfer_plist</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_376')">
-<span class='extendable'>[+]</span> DataSet::vlenReclaim <span class='sym_p'>( <span class='nowrap'>void* <span class='color_p'>buf</span>,</span> DataType const& <span class='color_p'>type</span>, DataSpace const& <span class='color_p'>space</span>, <span class='nowrap'>DSetMemXferPropList const& <span class='color_p'>xfer_plist</span> )</span></span> <span class='attr'>[static]</span> (2)</span>
-<br/>
-<div id="c_376" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H57DataSet11vlenReclaimEPvRKNS_8DataTypeERKNS_9DataSpaceERKNS_19DSetMemXferPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>DataSpace::ALL</b> of <b>3rd</b> parameter <b>space</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>The default argument <b>DSetMemXferPropList::DEFAULT</b> of <b>4th</b> parameter <b>xfer_plist</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_377')">
-<span class='extendable'>[+]</span> DataSet::write <span class='sym_p'>( std::string const& <span class='color_p'>buf</span>, DataType const& <span class='color_p'>mem_type</span>, DataSpace const& <span class='color_p'>mem_space</span>, DataSpace const& <span class='color_p'>file_space</span>, <span class='nowrap'>DSetMemXferPropList const& <span class='color_p'>xfer_plist</span> )</span></span> const (3)</span>
-<br/>
-<div id="c_377" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZNK2H57DataSet5writeERKSsRKNS_8DataTypeERKNS_9DataSpaceES8_RKNS_19DSetMemXferPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>DataSpace::ALL</b> of <b>4th</b> parameter <b>file_space</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>The default argument <b>DataSpace::ALL</b> of <b>3rd</b> parameter <b>mem_space</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-<tr><th>3</th><td align='left' valign='top'>The default argument <b>DSetMemXferPropList::DEFAULT</b> of <b>5th</b> parameter <b>xfer_plist</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_378')">
-<span class='extendable'>[+]</span> DataSet::write <span class='sym_p'>( <span class='nowrap'>void const* <span class='color_p'>buf</span>,</span> DataType const& <span class='color_p'>mem_type</span>, DataSpace const& <span class='color_p'>mem_space</span>, DataSpace const& <span class='color_p'>file_space</span>, <span class='nowrap'>DSetMemXferPropList const& <span class='color_p'>xfer_plist</span> )</span></span> const (3)</span>
-<br/>
-<div id="c_378" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZNK2H57DataSet5writeEPKvRKNS_8DataTypeERKNS_9DataSpaceES8_RKNS_19DSetMemXferPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>DataSpace::ALL</b> of <b>4th</b> parameter <b>file_space</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>The default argument <b>DataSpace::ALL</b> of <b>3rd</b> parameter <b>mem_space</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-<tr><th>3</th><td align='left' valign='top'>The default argument <b>DSetMemXferPropList::DEFAULT</b> of <b>5th</b> parameter <b>xfer_plist</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5DataSpace.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_379')">
-<span class='extendable'>[+]</span> DataSpace::ALL <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_379" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H59DataSpace3ALLE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>DataSpace const</span> to <span class='value'>DataSpace const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5DataType.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_380')">
-<span class='extendable'>[+]</span> DataType::convert <span class='sym_p'>( DataType const& <span class='color_p'>dest</span>, <span class='nowrap'>size_t <span class='color_p'>nelmts</span>,</span> <span class='nowrap'>void* <span class='color_p'>buf</span>,</span> void* <span class='color_p'>background</span>, <span class='nowrap'>PropList const& <span class='color_p'>plist</span> )</span></span> const (1)</span>
-<br/>
-<div id="c_380" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZNK2H58DataType7convertERKS0_mPvS3_RKNS_8PropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>PropList::DEFAULT</b> of <b>5th</b> parameter <b>plist</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5DcreatProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_381')">
-<span class='extendable'>[+]</span> DSetCreatPropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_381" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H517DSetCreatPropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>DSetCreatPropList const</span> to <span class='value'>DSetCreatPropList const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5DxferProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_382')">
-<span class='extendable'>[+]</span> DSetMemXferPropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_382" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H519DSetMemXferPropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>DSetMemXferPropList const</span> to <span class='value'>DSetMemXferPropList const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5FaccProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_383')">
-<span class='extendable'>[+]</span> FileAccPropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_383" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H515FileAccPropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>FileAccPropList const</span> to <span class='value'>FileAccPropList const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5FcreatProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_384')">
-<span class='extendable'>[+]</span> FileCreatPropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_384" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H517FileCreatPropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>FileCreatPropList const</span> to <span class='value'>FileCreatPropList const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5File.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_385')">
-<span class='extendable'>[+]</span> H5File::H5File <span class='attr'>[in-charge]</span> <span class='sym_p'>( char const* <span class='color_p'>name</span>, unsigned int <span class='color_p'>flags</span>, FileCreatPropList const& <span class='color_p'>create_plist</span>, <span class='nowrap'>FileAccPropList const& <span class='color_p'>access_plist</span> )</span></span> (2)</span>
-<br/>
-<div id="c_385" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H56H5FileC1EPKcjRKNS_17FileCreatPropListERKNS_15FileAccPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>FileAccPropList::DEFAULT</b> of <b>4th</b> parameter <b>access_plist</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>The default argument <b>FileCreatPropList::DEFAULT</b> of <b>3rd</b> parameter <b>create_plist</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_386')">
-<span class='extendable'>[+]</span> H5File::H5File <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( char const* <span class='color_p'>name</span>, unsigned int <span class='color_p'>flags</span>, FileCreatPropList const& <span class='color_p'>create_plist</span>, <span class='nowrap'>FileAccPropList const& <span class='color_p'>access_plist</span> )</span></span> (2)</span>
-<br/>
-<div id="c_386" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H56H5FileC2EPKcjRKNS_17FileCreatPropListERKNS_15FileAccPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>FileAccPropList::DEFAULT</b> of <b>4th</b> parameter <b>access_plist</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>The default argument <b>FileCreatPropList::DEFAULT</b> of <b>3rd</b> parameter <b>create_plist</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_387')">
-<span class='extendable'>[+]</span> H5File::H5File <span class='attr'>[in-charge]</span> <span class='sym_p'>( std::string const& <span class='color_p'>name</span>, unsigned int <span class='color_p'>flags</span>, FileCreatPropList const& <span class='color_p'>create_plist</span>, <span class='nowrap'>FileAccPropList const& <span class='color_p'>access_plist</span> )</span></span> (2)</span>
-<br/>
-<div id="c_387" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H56H5FileC1ERKSsjRKNS_17FileCreatPropListERKNS_15FileAccPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>FileAccPropList::DEFAULT</b> of <b>4th</b> parameter <b>access_plist</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>The default argument <b>FileCreatPropList::DEFAULT</b> of <b>3rd</b> parameter <b>create_plist</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_388')">
-<span class='extendable'>[+]</span> H5File::H5File <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( std::string const& <span class='color_p'>name</span>, unsigned int <span class='color_p'>flags</span>, FileCreatPropList const& <span class='color_p'>create_plist</span>, <span class='nowrap'>FileAccPropList const& <span class='color_p'>access_plist</span> )</span></span> (2)</span>
-<br/>
-<div id="c_388" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H56H5FileC2ERKSsjRKNS_17FileCreatPropListERKNS_15FileAccPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>FileAccPropList::DEFAULT</b> of <b>4th</b> parameter <b>access_plist</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>The default argument <b>FileCreatPropList::DEFAULT</b> of <b>3rd</b> parameter <b>create_plist</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_389')">
-<span class='extendable'>[+]</span> H5File::openFile <span class='sym_p'>( char const* <span class='color_p'>name</span>, unsigned int <span class='color_p'>flags</span>, <span class='nowrap'>FileAccPropList const& <span class='color_p'>access_plist</span> )</span></span> (1)</span>
-<br/>
-<div id="c_389" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H56H5File8openFileEPKcjRKNS_15FileAccPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>FileAccPropList::DEFAULT</b> of <b>3rd</b> parameter <b>access_plist</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_390')">
-<span class='extendable'>[+]</span> H5File::openFile <span class='sym_p'>( std::string const& <span class='color_p'>name</span>, unsigned int <span class='color_p'>flags</span>, <span class='nowrap'>FileAccPropList const& <span class='color_p'>access_plist</span> )</span></span> (1)</span>
-<br/>
-<div id="c_390" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H56H5File8openFileERKSsjRKNS_15FileAccPropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>FileAccPropList::DEFAULT</b> of <b>3rd</b> parameter <b>access_plist</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5Location.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_391')">
-<span class='extendable'>[+]</span> H5Location::createAttribute <span class='sym_p'>( char const* <span class='color_p'>name</span>, DataType const& <span class='color_p'>type</span>, DataSpace const& <span class='color_p'>space</span>, <span class='nowrap'>PropList const& <span class='color_p'>create_plist</span> )</span></span> const (1)</span>
-<br/>
-<div id="c_391" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZNK2H510H5Location15createAttributeEPKcRKNS_8DataTypeERKNS_9DataSpaceERKNS_8PropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>PropList::DEFAULT</b> of <b>4th</b> parameter <b>create_plist</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_392')">
-<span class='extendable'>[+]</span> H5Location::createAttribute <span class='sym_p'>( std::string const& <span class='color_p'>name</span>, DataType const& <span class='color_p'>type</span>, DataSpace const& <span class='color_p'>space</span>, <span class='nowrap'>PropList const& <span class='color_p'>create_plist</span> )</span></span> const (1)</span>
-<br/>
-<div id="c_392" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZNK2H510H5Location15createAttributeERKSsRKNS_8DataTypeERKNS_9DataSpaceERKNS_8PropListE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The default argument <b>PropList::DEFAULT</b> of <b>4th</b> parameter <b>create_plist</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5PacketTable.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_393')">
-<span class='extendable'>[+]</span> FL_PacketTable::FL_PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span> )</span></span> (1)</span>
-<br/>
-<div id="c_393" style="display:none;">
-
-
-<span class='new_sign_lbl'>changed to:</span><br/><span class='new_sign'>FL_PacketTable::FL_PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span><br/>
-<span class='mangled'>    [symbol: <b>_ZN14FL_PacketTableC2EiPc</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Parameters list has been changed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_394')">
-<span class='extendable'>[+]</span> FL_PacketTable::FL_PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span> )</span></span> (1)</span>
-<br/>
-<div id="c_394" style="display:none;">
-
-
-<span class='new_sign_lbl'>changed to:</span><br/><span class='new_sign'>FL_PacketTable::FL_PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span><br/>
-<span class='mangled'>    [symbol: <b>_ZN14FL_PacketTableC1EiPc</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Parameters list has been changed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_395')">
-<span class='extendable'>[+]</span> FL_PacketTable::FL_PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span>,</span> <span class='nowrap'>hid_t <span class='color_p'>dtypeID</span>,</span> hsize_t <span class='color_p'>chunkSize</span>, <span class='nowrap'>int <span class='color_p'>compression</span> )</span></span> (1)</span>
-<br/>
-<div id="c_395" style="display:none;">
-
-
-<span class='new_sign_lbl'>changed to:</span><br/><span class='new_sign'>FL_PacketTable::FL_PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span><br/>
-<span class='mangled'>    [symbol: <b>_ZN14FL_PacketTableC1EiPciyi</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Parameters list has been changed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_396')">
-<span class='extendable'>[+]</span> FL_PacketTable::FL_PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span>,</span> <span class='nowrap'>hid_t <span class='color_p'>dtypeID</span>,</span> hsize_t <span class='color_p'>chunkSize</span>, <span class='nowrap'>int <span class='color_p'>compression</span> )</span></span> (1)</span>
-<br/>
-<div id="c_396" style="display:none;">
-
-
-<span class='new_sign_lbl'>changed to:</span><br/><span class='new_sign'>FL_PacketTable::FL_PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span><br/>
-<span class='mangled'>    [symbol: <b>_ZN14FL_PacketTableC2EiPciyi</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Parameters list has been changed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_397')">
-<span class='extendable'>[+]</span> PacketTable::PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span> )</span></span> (1)</span>
-<br/>
-<div id="c_397" style="display:none;">
-
-
-<span class='new_sign_lbl'>changed to:</span><br/><span class='new_sign'>PacketTable::PacketTable <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span><br/>
-<span class='mangled'>    [symbol: <b>_ZN11PacketTableC1EiPc</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Parameters list has been changed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_398')">
-<span class='extendable'>[+]</span> PacketTable::PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char* <span class='color_p'>name</span> )</span></span> (1)</span>
-<br/>
-<div id="c_398" style="display:none;">
-
-
-<span class='new_sign_lbl'>changed to:</span><br/><span class='new_sign'>PacketTable::PacketTable <span class='attr'>[not-in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t <span class='color_p'>fileID</span>,</span> <span class='nowrap'>char const* <span class='color_p'>name</span> )</span></span></span><br/>
-<span class='mangled'>    [symbol: <b>_ZN11PacketTableC2EiPc</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Parameters list has been changed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5PredType.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_399')">
-<span class='extendable'>[+]</span> PredType::ALPHA_B16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_399" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_B16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_400')">
-<span class='extendable'>[+]</span> PredType::ALPHA_B32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_400" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_B32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_401')">
-<span class='extendable'>[+]</span> PredType::ALPHA_B64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_401" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_B64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_402')">
-<span class='extendable'>[+]</span> PredType::ALPHA_B8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_402" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8ALPHA_B8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_403')">
-<span class='extendable'>[+]</span> PredType::ALPHA_F32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_403" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_F32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_404')">
-<span class='extendable'>[+]</span> PredType::ALPHA_F64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_404" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_F64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_405')">
-<span class='extendable'>[+]</span> PredType::ALPHA_I16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_405" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_I16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_406')">
-<span class='extendable'>[+]</span> PredType::ALPHA_I32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_406" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_I32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_407')">
-<span class='extendable'>[+]</span> PredType::ALPHA_I64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_407" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_I64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_408')">
-<span class='extendable'>[+]</span> PredType::ALPHA_I8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_408" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8ALPHA_I8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_409')">
-<span class='extendable'>[+]</span> PredType::ALPHA_U16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_409" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_U16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_410')">
-<span class='extendable'>[+]</span> PredType::ALPHA_U32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_410" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_U32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_411')">
-<span class='extendable'>[+]</span> PredType::ALPHA_U64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_411" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_U64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_412')">
-<span class='extendable'>[+]</span> PredType::ALPHA_U8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_412" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8ALPHA_U8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_413')">
-<span class='extendable'>[+]</span> PredType::C_S1 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_413" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType4C_S1E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_414')">
-<span class='extendable'>[+]</span> PredType::FORTRAN_S1 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_414" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10FORTRAN_S1E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_415')">
-<span class='extendable'>[+]</span> PredType::IEEE_F32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_415" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10IEEE_F32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_416')">
-<span class='extendable'>[+]</span> PredType::IEEE_F32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_416" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10IEEE_F32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_417')">
-<span class='extendable'>[+]</span> PredType::IEEE_F64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_417" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10IEEE_F64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_418')">
-<span class='extendable'>[+]</span> PredType::IEEE_F64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_418" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10IEEE_F64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_419')">
-<span class='extendable'>[+]</span> PredType::INTEL_B16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_419" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_B16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_420')">
-<span class='extendable'>[+]</span> PredType::INTEL_B32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_420" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_B32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_421')">
-<span class='extendable'>[+]</span> PredType::INTEL_B64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_421" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_B64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_422')">
-<span class='extendable'>[+]</span> PredType::INTEL_B8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_422" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8INTEL_B8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_423')">
-<span class='extendable'>[+]</span> PredType::INTEL_F32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_423" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_F32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_424')">
-<span class='extendable'>[+]</span> PredType::INTEL_F64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_424" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_F64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_425')">
-<span class='extendable'>[+]</span> PredType::INTEL_I16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_425" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_I16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_426')">
-<span class='extendable'>[+]</span> PredType::INTEL_I32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_426" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_I32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_427')">
-<span class='extendable'>[+]</span> PredType::INTEL_I64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_427" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_I64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_428')">
-<span class='extendable'>[+]</span> PredType::INTEL_I8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_428" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8INTEL_I8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_429')">
-<span class='extendable'>[+]</span> PredType::INTEL_U16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_429" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_U16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_430')">
-<span class='extendable'>[+]</span> PredType::INTEL_U32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_430" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_U32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_431')">
-<span class='extendable'>[+]</span> PredType::INTEL_U64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_431" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_U64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_432')">
-<span class='extendable'>[+]</span> PredType::INTEL_U8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_432" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8INTEL_U8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_433')">
-<span class='extendable'>[+]</span> PredType::MIPS_B16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_433" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_B16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_434')">
-<span class='extendable'>[+]</span> PredType::MIPS_B32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_434" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_B32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_435')">
-<span class='extendable'>[+]</span> PredType::MIPS_B64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_435" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_B64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_436')">
-<span class='extendable'>[+]</span> PredType::MIPS_B8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_436" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType7MIPS_B8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_437')">
-<span class='extendable'>[+]</span> PredType::MIPS_F32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_437" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_F32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_438')">
-<span class='extendable'>[+]</span> PredType::MIPS_F64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_438" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_F64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_439')">
-<span class='extendable'>[+]</span> PredType::MIPS_I16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_439" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_I16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_440')">
-<span class='extendable'>[+]</span> PredType::MIPS_I32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_440" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_I32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_441')">
-<span class='extendable'>[+]</span> PredType::MIPS_I64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_441" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_I64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_442')">
-<span class='extendable'>[+]</span> PredType::MIPS_I8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_442" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType7MIPS_I8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_443')">
-<span class='extendable'>[+]</span> PredType::MIPS_U16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_443" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_U16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_444')">
-<span class='extendable'>[+]</span> PredType::MIPS_U32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_444" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_U32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_445')">
-<span class='extendable'>[+]</span> PredType::MIPS_U64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_445" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_U64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_446')">
-<span class='extendable'>[+]</span> PredType::MIPS_U8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_446" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType7MIPS_U8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_447')">
-<span class='extendable'>[+]</span> PredType::NATIVE_B16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_447" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10NATIVE_B16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_448')">
-<span class='extendable'>[+]</span> PredType::NATIVE_B32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_448" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10NATIVE_B32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_449')">
-<span class='extendable'>[+]</span> PredType::NATIVE_B64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_449" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10NATIVE_B64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_450')">
-<span class='extendable'>[+]</span> PredType::NATIVE_B8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_450" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9NATIVE_B8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_451')">
-<span class='extendable'>[+]</span> PredType::NATIVE_CHAR <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_451" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_CHARE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_452')">
-<span class='extendable'>[+]</span> PredType::NATIVE_DOUBLE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_452" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_DOUBLEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_453')">
-<span class='extendable'>[+]</span> PredType::NATIVE_FLOAT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_453" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_FLOATE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_454')">
-<span class='extendable'>[+]</span> PredType::NATIVE_HBOOL <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_454" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_HBOOLE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_455')">
-<span class='extendable'>[+]</span> PredType::NATIVE_HERR <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_455" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_HERRE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_456')">
-<span class='extendable'>[+]</span> PredType::NATIVE_HSIZE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_456" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_HSIZEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_457')">
-<span class='extendable'>[+]</span> PredType::NATIVE_HSSIZE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_457" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_HSSIZEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_458')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_458" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10NATIVE_INTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_459')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_459" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_INT16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_460')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_460" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_INT32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_461')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_461" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_INT64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_462')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_462" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_INT8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_463')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_FAST16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_463" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_INT_FAST16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_464')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_FAST32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_464" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_INT_FAST32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_465')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_FAST64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_465" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_INT_FAST64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_466')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_FAST8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_466" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType16NATIVE_INT_FAST8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_467')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_LEAST16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_467" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_INT_LEAST16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_468')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_LEAST32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_468" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_INT_LEAST32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_469')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_LEAST64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_469" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_INT_LEAST64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_470')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_LEAST8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_470" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_INT_LEAST8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_471')">
-<span class='extendable'>[+]</span> PredType::NATIVE_LDOUBLE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_471" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType14NATIVE_LDOUBLEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_472')">
-<span class='extendable'>[+]</span> PredType::NATIVE_LLONG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_472" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_LLONGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_473')">
-<span class='extendable'>[+]</span> PredType::NATIVE_LONG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_473" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_LONGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_474')">
-<span class='extendable'>[+]</span> PredType::NATIVE_OPAQUE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_474" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_OPAQUEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_475')">
-<span class='extendable'>[+]</span> PredType::NATIVE_SCHAR <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_475" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_SCHARE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_476')">
-<span class='extendable'>[+]</span> PredType::NATIVE_SHORT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_476" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_SHORTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_477')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UCHAR <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_477" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_UCHARE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_478')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_478" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_UINTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_479')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_479" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_UINT16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_480')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_480" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_UINT32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_481')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_481" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_UINT64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_482')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_482" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_UINT8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_483')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_FAST16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_483" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_UINT_FAST16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_484')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_FAST32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_484" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_UINT_FAST32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_485')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_FAST64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_485" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_UINT_FAST64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_486')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_FAST8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_486" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_UINT_FAST8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_487')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_LEAST16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_487" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType19NATIVE_UINT_LEAST16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_488')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_LEAST32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_488" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType19NATIVE_UINT_LEAST32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_489')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_LEAST64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_489" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType19NATIVE_UINT_LEAST64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_490')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_LEAST8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_490" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_UINT_LEAST8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_491')">
-<span class='extendable'>[+]</span> PredType::NATIVE_ULLONG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_491" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_ULLONGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_492')">
-<span class='extendable'>[+]</span> PredType::NATIVE_ULONG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_492" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_ULONGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_493')">
-<span class='extendable'>[+]</span> PredType::NATIVE_USHORT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_493" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_USHORTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_494')">
-<span class='extendable'>[+]</span> PredType::STD_B16BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_494" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B16BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_495')">
-<span class='extendable'>[+]</span> PredType::STD_B16LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_495" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B16LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_496')">
-<span class='extendable'>[+]</span> PredType::STD_B32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_496" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_497')">
-<span class='extendable'>[+]</span> PredType::STD_B32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_497" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_498')">
-<span class='extendable'>[+]</span> PredType::STD_B64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_498" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_499')">
-<span class='extendable'>[+]</span> PredType::STD_B64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_499" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_500')">
-<span class='extendable'>[+]</span> PredType::STD_B8BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_500" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_B8BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_501')">
-<span class='extendable'>[+]</span> PredType::STD_B8LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_501" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_B8LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_502')">
-<span class='extendable'>[+]</span> PredType::STD_I16BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_502" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I16BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_503')">
-<span class='extendable'>[+]</span> PredType::STD_I16LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_503" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I16LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_504')">
-<span class='extendable'>[+]</span> PredType::STD_I32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_504" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_505')">
-<span class='extendable'>[+]</span> PredType::STD_I32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_505" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_506')">
-<span class='extendable'>[+]</span> PredType::STD_I64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_506" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_507')">
-<span class='extendable'>[+]</span> PredType::STD_I64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_507" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_508')">
-<span class='extendable'>[+]</span> PredType::STD_I8BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_508" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_I8BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_509')">
-<span class='extendable'>[+]</span> PredType::STD_I8LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_509" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_I8LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_510')">
-<span class='extendable'>[+]</span> PredType::STD_REF_DSETREG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_510" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType15STD_REF_DSETREGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_511')">
-<span class='extendable'>[+]</span> PredType::STD_REF_OBJ <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_511" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11STD_REF_OBJE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_512')">
-<span class='extendable'>[+]</span> PredType::STD_U16BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_512" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U16BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_513')">
-<span class='extendable'>[+]</span> PredType::STD_U16LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_513" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U16LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_514')">
-<span class='extendable'>[+]</span> PredType::STD_U32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_514" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_515')">
-<span class='extendable'>[+]</span> PredType::STD_U32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_515" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_516')">
-<span class='extendable'>[+]</span> PredType::STD_U64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_516" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_517')">
-<span class='extendable'>[+]</span> PredType::STD_U64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_517" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_518')">
-<span class='extendable'>[+]</span> PredType::STD_U8BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_518" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_U8BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_519')">
-<span class='extendable'>[+]</span> PredType::STD_U8LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_519" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_U8LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_520')">
-<span class='extendable'>[+]</span> PredType::UNIX_D32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_520" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10UNIX_D32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_521')">
-<span class='extendable'>[+]</span> PredType::UNIX_D32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_521" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10UNIX_D32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_522')">
-<span class='extendable'>[+]</span> PredType::UNIX_D64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_522" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10UNIX_D64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_523')">
-<span class='extendable'>[+]</span> PredType::UNIX_D64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_523" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10UNIX_D64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PredType const</span> to <span class='value'>PredType const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5PropList.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_524')">
-<span class='extendable'>[+]</span> PropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_524" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <span class='value'>PropList const</span> to <span class='value'>PropList const&</span> of different format.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Low_Risk_Source_Problems'></a><a name='Type_Source_Problems_Low'></a>
-<h2>Problems with Data Types, Low Severity (2)</h2><hr/>
-<span class='h_name'>H5DcreatProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_525')">
-<span class='extendable'>[+]</span> <span class='ttype'>class</span> DSetCreatPropList (2)</span>
-<br/>
-<div id="c_525" style="display:none;">
-<table class='ptable'><tr>
-<th width='2%'></th><th width='47%'>Change</th>
-<th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Base class <b>ObjCreatPropList</b> has been added.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-<tr><th>2</th><td align='left' valign='top'>Base class <b>PropList</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table>
-<span class="section_affected" onclick="javascript:showContent(this, 'c_526')">
-[+] affected symbols (31)</span>
-<div id="c_526" style="display:none;">
-<div class='affected'><span class='iname_a'>DSetCreatPropList::allFiltersAvail <span class='sym_p'>( )</span></span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::DEFAULT <span class='attr'>[data]</span></span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::DSetCreatPropList <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span></span><br/><div class='affect'>This constructor is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::DSetCreatPropList <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>DSetCreatPropList const& <span class='param'>orig</span> )</span></span></span><br/><div class='affect'>This constructor is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::DSetCreatPropList <span class='attr'>[in-charge]</span> <span class='sym_p'>( <span class='nowrap'>hid_t const <span class='param'>plist_id</span> )</span></span></span><br/><div class='affect'>This constructor is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::fromClass <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::getAllocTime <span class='sym_p'>( )</span></span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::getChunk <span class='sym_p'>( <span class='nowrap'>int <span class='param'>max_ndims</span>,</span> <span class='nowrap'>hsize_t* <span class='param'>dim</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::getExternal <span class='sym_p'>( <span class='nowrap'>unsigned int <span class='param'>idx</span>,</span> <span class='nowrap'>size_t <span class='param'>name_size</span>,</span> <span class='nowrap'>char* <span class='param'>name</span>,</span> <span class='nowrap'>off_t& <span class='param'>offset</span>,</span> <span class='nowrap'>hsize_t& <span class='param'>size</span> )</span></span> const</span><br/><div class='affect'>T [...]
-<span class='iname_a'>DSetCreatPropList::getExternalCount <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::getFillTime <span class='sym_p'>( )</span></span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::getFillValue <span class='sym_p'>( DataType const& <span class='param'>fvalue_type</span>, <span class='nowrap'>void* <span class='param'>value</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::getFilter <span class='sym_p'>( <span class='nowrap'>int <span class='param'>filter_number</span>,</span> unsigned int& <span class='param'>flags</span>, size_t& <span class='param'>cd_nelmts</span>, unsigned int* <span class='param'>cd_values</span>, <span class='nowrap'>size_t <span class='param'>namelen</span>,</span> <span class='nowrap'>char* <span class='param'>name</span>,</span> <span class='nowrap'>unsigned int& <spa [...]
-<span class='iname_a'>DSetCreatPropList::getFilterById <span class='sym_p'>( H5Z_filter_t <span class='param'>filter_id</span>, unsigned int& <span class='param'>flags</span>, size_t& <span class='param'>cd_nelmts</span>, unsigned int* <span class='param'>cd_values</span>, <span class='nowrap'>size_t <span class='param'>namelen</span>,</span> <span class='nowrap'>char* <span class='param'>name</span>,</span> <span class='nowrap'>unsigned int& <span class='param'>fil [...]
-<span class='iname_a'>DSetCreatPropList::getLayout <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::getNfilters <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::isFillValueDefined <span class='sym_p'>( )</span></span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::modifyFilter <span class='sym_p'>( H5Z_filter_t <span class='param'>filter_id</span>, unsigned int <span class='param'>flags</span>, <span class='nowrap'>size_t <span class='param'>cd_nelmts</span>,</span> <span class='nowrap'>unsigned int const* <span class='param'>cd_values</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::removeFilter <span class='sym_p'>( <span class='nowrap'>H5Z_filter_t <span class='param'>filter_id</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setAllocTime <span class='sym_p'>( <span class='nowrap'>H5D_alloc_time_t <span class='param'>alloc_time</span> )</span></span></span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setChunk <span class='sym_p'>( <span class='nowrap'>int <span class='param'>ndims</span>,</span> <span class='nowrap'>hsize_t const* <span class='param'>dim</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setDeflate <span class='sym_p'>( <span class='nowrap'>int <span class='param'>level</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setExternal <span class='sym_p'>( <span class='nowrap'>char const* <span class='param'>name</span>,</span> <span class='nowrap'>off_t <span class='param'>offset</span>,</span> <span class='nowrap'>hsize_t <span class='param'>size</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setFillTime <span class='sym_p'>( <span class='nowrap'>H5D_fill_time_t <span class='param'>fill_time</span> )</span></span></span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setFillValue <span class='sym_p'>( DataType const& <span class='param'>fvalue_type</span>, <span class='nowrap'>void const* <span class='param'>value</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setFilter <span class='sym_p'>( H5Z_filter_t <span class='param'>filter</span>, unsigned int <span class='param'>flags</span>, <span class='nowrap'>size_t <span class='param'>cd_nelmts</span>,</span> <span class='nowrap'>unsigned int const* <span class='param'>cd_values</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setFletcher32 <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setLayout <span class='sym_p'>( <span class='nowrap'>H5D_layout_t <span class='param'>layout</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setShuffle <span class='sym_p'>( )</span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::setSzip <span class='sym_p'>( unsigned int <span class='param'>options_mask</span>, <span class='nowrap'>unsigned int <span class='param'>pixels_per_block</span> )</span></span> const</span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-<span class='iname_a'>DSetCreatPropList::~DSetCreatPropList <span class='attr'>[in-charge]</span> <span class='sym_p'>( )</span></span><br/><div class='affect'>This method is from 'DSetCreatPropList' class.</div>
-</div></div>
-<br/><br/></div>
-
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Symbol_Source_Problems_Low'></a><a name='Interface_Source_Problems_Low'></a>
-<h2>Problems with Symbols, Low Severity (131)</h2><hr/>
-<span class='h_name'>H5DataSpace.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_527')">
-<span class='extendable'>[+]</span> DataSpace::ALL <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_527" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H59DataSpace3ALLE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5DcreatProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_528')">
-<span class='extendable'>[+]</span> DSetCreatPropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_528" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H517DSetCreatPropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5DxferProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_529')">
-<span class='extendable'>[+]</span> DSetMemXferPropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_529" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H519DSetMemXferPropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5FaccProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_530')">
-<span class='extendable'>[+]</span> FileAccPropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_530" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H515FileAccPropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5FcreatProp.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_531')">
-<span class='extendable'>[+]</span> FileCreatPropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_531" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H517FileCreatPropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5PredType.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_532')">
-<span class='extendable'>[+]</span> PredType::ALPHA_B16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_532" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_B16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_533')">
-<span class='extendable'>[+]</span> PredType::ALPHA_B32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_533" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_B32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_534')">
-<span class='extendable'>[+]</span> PredType::ALPHA_B64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_534" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_B64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_535')">
-<span class='extendable'>[+]</span> PredType::ALPHA_B8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_535" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8ALPHA_B8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_536')">
-<span class='extendable'>[+]</span> PredType::ALPHA_F32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_536" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_F32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_537')">
-<span class='extendable'>[+]</span> PredType::ALPHA_F64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_537" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_F64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_538')">
-<span class='extendable'>[+]</span> PredType::ALPHA_I16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_538" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_I16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_539')">
-<span class='extendable'>[+]</span> PredType::ALPHA_I32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_539" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_I32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_540')">
-<span class='extendable'>[+]</span> PredType::ALPHA_I64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_540" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_I64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_541')">
-<span class='extendable'>[+]</span> PredType::ALPHA_I8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_541" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8ALPHA_I8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_542')">
-<span class='extendable'>[+]</span> PredType::ALPHA_U16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_542" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_U16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_543')">
-<span class='extendable'>[+]</span> PredType::ALPHA_U32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_543" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_U32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_544')">
-<span class='extendable'>[+]</span> PredType::ALPHA_U64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_544" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9ALPHA_U64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_545')">
-<span class='extendable'>[+]</span> PredType::ALPHA_U8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_545" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8ALPHA_U8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_546')">
-<span class='extendable'>[+]</span> PredType::C_S1 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_546" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType4C_S1E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_547')">
-<span class='extendable'>[+]</span> PredType::FORTRAN_S1 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_547" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10FORTRAN_S1E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_548')">
-<span class='extendable'>[+]</span> PredType::IEEE_F32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_548" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10IEEE_F32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_549')">
-<span class='extendable'>[+]</span> PredType::IEEE_F32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_549" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10IEEE_F32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_550')">
-<span class='extendable'>[+]</span> PredType::IEEE_F64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_550" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10IEEE_F64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_551')">
-<span class='extendable'>[+]</span> PredType::IEEE_F64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_551" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10IEEE_F64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_552')">
-<span class='extendable'>[+]</span> PredType::INTEL_B16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_552" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_B16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_553')">
-<span class='extendable'>[+]</span> PredType::INTEL_B32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_553" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_B32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_554')">
-<span class='extendable'>[+]</span> PredType::INTEL_B64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_554" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_B64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_555')">
-<span class='extendable'>[+]</span> PredType::INTEL_B8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_555" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8INTEL_B8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_556')">
-<span class='extendable'>[+]</span> PredType::INTEL_F32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_556" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_F32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_557')">
-<span class='extendable'>[+]</span> PredType::INTEL_F64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_557" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_F64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_558')">
-<span class='extendable'>[+]</span> PredType::INTEL_I16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_558" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_I16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_559')">
-<span class='extendable'>[+]</span> PredType::INTEL_I32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_559" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_I32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_560')">
-<span class='extendable'>[+]</span> PredType::INTEL_I64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_560" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_I64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_561')">
-<span class='extendable'>[+]</span> PredType::INTEL_I8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_561" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8INTEL_I8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_562')">
-<span class='extendable'>[+]</span> PredType::INTEL_U16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_562" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_U16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_563')">
-<span class='extendable'>[+]</span> PredType::INTEL_U32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_563" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_U32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_564')">
-<span class='extendable'>[+]</span> PredType::INTEL_U64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_564" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9INTEL_U64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_565')">
-<span class='extendable'>[+]</span> PredType::INTEL_U8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_565" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8INTEL_U8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_566')">
-<span class='extendable'>[+]</span> PredType::MIPS_B16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_566" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_B16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_567')">
-<span class='extendable'>[+]</span> PredType::MIPS_B32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_567" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_B32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_568')">
-<span class='extendable'>[+]</span> PredType::MIPS_B64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_568" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_B64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_569')">
-<span class='extendable'>[+]</span> PredType::MIPS_B8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_569" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType7MIPS_B8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_570')">
-<span class='extendable'>[+]</span> PredType::MIPS_F32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_570" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_F32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_571')">
-<span class='extendable'>[+]</span> PredType::MIPS_F64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_571" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_F64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_572')">
-<span class='extendable'>[+]</span> PredType::MIPS_I16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_572" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_I16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_573')">
-<span class='extendable'>[+]</span> PredType::MIPS_I32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_573" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_I32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_574')">
-<span class='extendable'>[+]</span> PredType::MIPS_I64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_574" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_I64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_575')">
-<span class='extendable'>[+]</span> PredType::MIPS_I8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_575" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType7MIPS_I8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_576')">
-<span class='extendable'>[+]</span> PredType::MIPS_U16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_576" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_U16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_577')">
-<span class='extendable'>[+]</span> PredType::MIPS_U32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_577" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_U32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_578')">
-<span class='extendable'>[+]</span> PredType::MIPS_U64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_578" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8MIPS_U64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_579')">
-<span class='extendable'>[+]</span> PredType::MIPS_U8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_579" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType7MIPS_U8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_580')">
-<span class='extendable'>[+]</span> PredType::NATIVE_B16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_580" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10NATIVE_B16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_581')">
-<span class='extendable'>[+]</span> PredType::NATIVE_B32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_581" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10NATIVE_B32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_582')">
-<span class='extendable'>[+]</span> PredType::NATIVE_B64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_582" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10NATIVE_B64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_583')">
-<span class='extendable'>[+]</span> PredType::NATIVE_B8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_583" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9NATIVE_B8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_584')">
-<span class='extendable'>[+]</span> PredType::NATIVE_CHAR <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_584" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_CHARE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_585')">
-<span class='extendable'>[+]</span> PredType::NATIVE_DOUBLE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_585" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_DOUBLEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_586')">
-<span class='extendable'>[+]</span> PredType::NATIVE_FLOAT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_586" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_FLOATE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_587')">
-<span class='extendable'>[+]</span> PredType::NATIVE_HBOOL <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_587" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_HBOOLE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_588')">
-<span class='extendable'>[+]</span> PredType::NATIVE_HERR <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_588" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_HERRE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_589')">
-<span class='extendable'>[+]</span> PredType::NATIVE_HSIZE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_589" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_HSIZEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_590')">
-<span class='extendable'>[+]</span> PredType::NATIVE_HSSIZE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_590" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_HSSIZEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_591')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_591" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10NATIVE_INTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_592')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_592" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_INT16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_593')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_593" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_INT32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_594')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_594" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_INT64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_595')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_595" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_INT8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_596')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_FAST16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_596" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_INT_FAST16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_597')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_FAST32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_597" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_INT_FAST32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_598')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_FAST64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_598" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_INT_FAST64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_599')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_FAST8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_599" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType16NATIVE_INT_FAST8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_600')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_LEAST16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_600" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_INT_LEAST16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_601')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_LEAST32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_601" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_INT_LEAST32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_602')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_LEAST64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_602" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_INT_LEAST64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_603')">
-<span class='extendable'>[+]</span> PredType::NATIVE_INT_LEAST8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_603" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_INT_LEAST8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_604')">
-<span class='extendable'>[+]</span> PredType::NATIVE_LDOUBLE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_604" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType14NATIVE_LDOUBLEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_605')">
-<span class='extendable'>[+]</span> PredType::NATIVE_LLONG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_605" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_LLONGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_606')">
-<span class='extendable'>[+]</span> PredType::NATIVE_LONG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_606" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_LONGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_607')">
-<span class='extendable'>[+]</span> PredType::NATIVE_OPAQUE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_607" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_OPAQUEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_608')">
-<span class='extendable'>[+]</span> PredType::NATIVE_SCHAR <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_608" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_SCHARE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_609')">
-<span class='extendable'>[+]</span> PredType::NATIVE_SHORT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_609" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_SHORTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_610')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UCHAR <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_610" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_UCHARE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_611')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_611" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11NATIVE_UINTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_612')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_612" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_UINT16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_613')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_613" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_UINT32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_614')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_614" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_UINT64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_615')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_615" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_UINT8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_616')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_FAST16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_616" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_UINT_FAST16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_617')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_FAST32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_617" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_UINT_FAST32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_618')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_FAST64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_618" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_UINT_FAST64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_619')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_FAST8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_619" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType17NATIVE_UINT_FAST8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_620')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_LEAST16 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_620" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType19NATIVE_UINT_LEAST16E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_621')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_LEAST32 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_621" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType19NATIVE_UINT_LEAST32E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_622')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_LEAST64 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_622" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType19NATIVE_UINT_LEAST64E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_623')">
-<span class='extendable'>[+]</span> PredType::NATIVE_UINT_LEAST8 <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_623" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType18NATIVE_UINT_LEAST8E</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_624')">
-<span class='extendable'>[+]</span> PredType::NATIVE_ULLONG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_624" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_ULLONGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_625')">
-<span class='extendable'>[+]</span> PredType::NATIVE_ULONG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_625" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType12NATIVE_ULONGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_626')">
-<span class='extendable'>[+]</span> PredType::NATIVE_USHORT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_626" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType13NATIVE_USHORTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_627')">
-<span class='extendable'>[+]</span> PredType::STD_B16BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_627" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B16BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_628')">
-<span class='extendable'>[+]</span> PredType::STD_B16LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_628" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B16LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_629')">
-<span class='extendable'>[+]</span> PredType::STD_B32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_629" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_630')">
-<span class='extendable'>[+]</span> PredType::STD_B32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_630" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_631')">
-<span class='extendable'>[+]</span> PredType::STD_B64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_631" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_632')">
-<span class='extendable'>[+]</span> PredType::STD_B64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_632" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_B64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_633')">
-<span class='extendable'>[+]</span> PredType::STD_B8BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_633" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_B8BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_634')">
-<span class='extendable'>[+]</span> PredType::STD_B8LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_634" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_B8LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_635')">
-<span class='extendable'>[+]</span> PredType::STD_I16BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_635" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I16BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_636')">
-<span class='extendable'>[+]</span> PredType::STD_I16LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_636" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I16LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_637')">
-<span class='extendable'>[+]</span> PredType::STD_I32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_637" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_638')">
-<span class='extendable'>[+]</span> PredType::STD_I32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_638" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_639')">
-<span class='extendable'>[+]</span> PredType::STD_I64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_639" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_640')">
-<span class='extendable'>[+]</span> PredType::STD_I64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_640" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_I64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_641')">
-<span class='extendable'>[+]</span> PredType::STD_I8BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_641" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_I8BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_642')">
-<span class='extendable'>[+]</span> PredType::STD_I8LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_642" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_I8LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_643')">
-<span class='extendable'>[+]</span> PredType::STD_REF_DSETREG <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_643" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType15STD_REF_DSETREGE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_644')">
-<span class='extendable'>[+]</span> PredType::STD_REF_OBJ <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_644" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType11STD_REF_OBJE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_645')">
-<span class='extendable'>[+]</span> PredType::STD_U16BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_645" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U16BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_646')">
-<span class='extendable'>[+]</span> PredType::STD_U16LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_646" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U16LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_647')">
-<span class='extendable'>[+]</span> PredType::STD_U32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_647" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_648')">
-<span class='extendable'>[+]</span> PredType::STD_U32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_648" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_649')">
-<span class='extendable'>[+]</span> PredType::STD_U64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_649" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_650')">
-<span class='extendable'>[+]</span> PredType::STD_U64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_650" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType9STD_U64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_651')">
-<span class='extendable'>[+]</span> PredType::STD_U8BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_651" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_U8BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_652')">
-<span class='extendable'>[+]</span> PredType::STD_U8LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_652" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType8STD_U8LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_653')">
-<span class='extendable'>[+]</span> PredType::UNIX_D32BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_653" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10UNIX_D32BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_654')">
-<span class='extendable'>[+]</span> PredType::UNIX_D32LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_654" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10UNIX_D32LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_655')">
-<span class='extendable'>[+]</span> PredType::UNIX_D64BE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_655" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10UNIX_D64BEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<span class="section" onclick="javascript:showContent(this, 'c_656')">
-<span class='extendable'>[+]</span> PredType::UNIX_D64LE <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_656" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PredType10UNIX_D64LEE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<br/><span class='h_name'>H5PropList.h</span><br/>
-<span class='ns'>namespace <b>H5</b></span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_657')">
-<span class='extendable'>[+]</span> PropList::DEFAULT <span class='attr'>[data]</span> (1)</span>
-<br/>
-<div id="c_657" style="display:none;">
-
-<span class='mangled'>    [symbol: <b>_ZN2H58PropList7DEFAULTE</b>]</span><br/>
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>Type of this global data has been changed from <b>0</b> to <b>1</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/>
-</div>
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Constant_Source_Problems_Low'></a><h2>Problems with Constants, Low Severity (11)</h2><hr/>
-<span class='h_name'>H5Fpublic.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_658')">
-<span class='extendable'>[+]</span> H5F_ACC_DEBUG</span>
-<br/>
-<div id="c_658" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5F_ACC_DEBUG</b> has been changed from <span class='value'>(H5CHECK 0x0008u)</span> to <span class='value'>(H5CHECK 0x0000u)</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5Library.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_659')">
-<span class='extendable'>[+]</span> NOTATEXIT</span>
-<br/>
-<div id="c_659" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>NOTATEXIT</b> with value <b>(-10)</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5PredType.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_660')">
-<span class='extendable'>[+]</span> H5CPP_EXITED</span>
-<br/>
-<div id="c_660" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5CPP_EXITED</b> with value <b>-3</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5pubconf.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_661')">
-<span class='extendable'>[+]</span> H5_CONVERT_DENORMAL_FLOAT</span>
-<br/>
-<div id="c_661" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_CONVERT_DENORMAL_FLOAT</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_662')">
-<span class='extendable'>[+]</span> H5_FP_TO_INTEGER_OVERFLOW_WORKS</span>
-<br/>
-<div id="c_662" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_FP_TO_INTEGER_OVERFLOW_WORKS</b> with value <b>1</b> has been removed.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_663')">
-<span class='extendable'>[+]</span> H5_PACKAGE_STRING</span>
-<br/>
-<div id="c_663" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5_PACKAGE_STRING</b> has been changed from <span class='value'>"HDF5 1.8.15-patch1"</span> to <span class='value'>"HDF5 1.8.16"</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_664')">
-<span class='extendable'>[+]</span> H5_PACKAGE_VERSION</span>
-<br/>
-<div id="c_664" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5_PACKAGE_VERSION</b> has been changed from <b>"1.8.15-patch1"</b> to <b>"1.8.16"</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_665')">
-<span class='extendable'>[+]</span> H5_VERSION</span>
-<br/>
-<div id="c_665" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5_VERSION</b> has been changed from <b>"1.8.15-patch1"</b> to <b>"1.8.16"</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<br/>
-<span class='h_name'>H5public.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_666')">
-<span class='extendable'>[+]</span> H5_VERS_INFO</span>
-<br/>
-<div id="c_666" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5_VERS_INFO</b> has been changed from <span class='value'>"HDF5 library version: 1.8.15-patch1"</span> to <span class='value'>"HDF5 library version: 1.8.16"</span>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_667')">
-<span class='extendable'>[+]</span> H5_VERS_RELEASE</span>
-<br/>
-<div id="c_667" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5_VERS_RELEASE</b> has been changed from <b>15</b> to <b>16</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_668')">
-<span class='extendable'>[+]</span> H5_VERS_SUBRELEASE</span>
-<br/>
-<div id="c_668" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The value of constant <b>H5_VERS_SUBRELEASE</b> has been changed from <b>"patch1"</b> to <b>""</b>.</td><td align='left' valign='top'>Recompilation of a client program may be broken.</td></tr>
-</table><br/></div>
-
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Other_Source_Changes'></a><a name='Other_Source_Changes_In_Constants'></a><h2>Other Changes in Constants (3)</h2><hr/>
-<span class='h_name'>H5pubconf.h</span><br/>
-<span class="section" onclick="javascript:showContent(this, 'c_669')">
-<span class='extendable'>[+]</span> H5_HAVE___INLINE</span>
-<br/>
-<div id="c_669" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE___INLINE</b> with value <b>1</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_670')">
-<span class='extendable'>[+]</span> H5_HAVE___INLINE__</span>
-<br/>
-<div id="c_670" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE___INLINE__</b> with value <b>1</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<span class="section" onclick="javascript:showContent(this, 'c_671')">
-<span class='extendable'>[+]</span> H5_HAVE_INLINE</span>
-<br/>
-<div id="c_671" style="display:none;">
-<table class='ptable'><tr><th width='2%'></th><th width='47%'>Change</th><th>Effect</th></tr><tr><th>1</th><td align='left' valign='top'>The constant <b>H5_HAVE_INLINE</b> with value <b>1</b> has been added.</td><td align='left' valign='top'>No effect.</td></tr>
-</table><br/></div>
-
-<br/>
-<a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<a name='Headers'></a><h2>Header Files (76)</h2><hr/>
-<div class='h_list'>
-H5AbstractDs.h<br/>
-H5ACpublic.h<br/>
-H5api_adpt.h<br/>
-H5Apublic.h<br/>
-H5ArrayType.h<br/>
-H5AtomType.h<br/>
-H5Attribute.h<br/>
-H5Classes.h<br/>
-H5CommonFG.h<br/>
-H5CompType.h<br/>
-H5Cpp.h<br/>
-H5CppDoc.h<br/>
-H5Cpublic.h<br/>
-H5DataSet.h<br/>
-H5DataSpace.h<br/>
-H5DataType.h<br/>
-H5DcreatProp.h<br/>
-H5DOpublic.h<br/>
-H5Dpublic.h<br/>
-H5DSpublic.h<br/>
-H5DxferProp.h<br/>
-H5EnumType.h<br/>
-H5Epubgen.h<br/>
-H5Epublic.h<br/>
-H5Exception.h<br/>
-H5f90i.h<br/>
-H5f90i_gen.h<br/>
-H5FaccProp.h<br/>
-H5FcreatProp.h<br/>
-H5FDcore.h<br/>
-H5FDdirect.h<br/>
-H5FDfamily.h<br/>
-H5FDlog.h<br/>
-H5FDmpi.h<br/>
-H5FDmpio.h<br/>
-H5FDmulti.h<br/>
-H5FDpublic.h<br/>
-H5FDsec2.h<br/>
-H5FDstdio.h<br/>
-H5File.h<br/>
-H5FloatType.h<br/>
-H5Fpublic.h<br/>
-H5Gpublic.h<br/>
-H5Group.h<br/>
-H5IdComponent.h<br/>
-H5IMpublic.h<br/>
-H5Include.h<br/>
-H5IntType.h<br/>
-H5Ipublic.h<br/>
-H5Library.h<br/>
-H5Location.h<br/>
-H5Lpublic.h<br/>
-H5LTpublic.h<br/>
-H5MMpublic.h<br/>
-H5Object.h<br/>
-H5Opublic.h<br/>
-H5overflow.h<br/>
-H5PacketTable.h<br/>
-H5PLextern.h<br/>
-H5PLpublic.h<br/>
-H5Ppublic.h<br/>
-H5PredType.h<br/>
-H5PropList.h<br/>
-H5PTpublic.h<br/>
-H5pubconf.h<br/>
-H5public.h<br/>
-H5Rpublic.h<br/>
-H5Spublic.h<br/>
-H5StrType.h<br/>
-H5TBpublic.h<br/>
-H5Tpublic.h<br/>
-H5VarLenType.h<br/>
-H5version.h<br/>
-H5Zpublic.h<br/>
-hdf5.h<br/>
-hdf5_hl.h<br/>
-</div>
-<br/><a style='font-size:11px;' href='#Top'>to the top</a><br/>
-<br/><br/><br/></div><div style='width:97%;padding-top:3px;font-size:11px;' align='right'><i>Generated on Tue Nov 10 11:48:32 2015 for <span style='font-weight:bold'>hdf5</span> by <a href='http://ispras.linuxbase.org/index.php/ABI_compliance_checker'>ABI Compliance Checker</a> 1.99.9  <br/>A tool for checking backward compatibility of a C/C++ library API  </i></div>
-<div style='height:999px;'></div>
-</body></html>
\ No newline at end of file
diff --git a/html/ADGuide/HISTORY.txt b/html/ADGuide/HISTORY.txt
index 05aee81..1327827 100644
--- a/html/ADGuide/HISTORY.txt
+++ b/html/ADGuide/HISTORY.txt
@@ -1,69 +1,684 @@
-HDF5 History 
+HDF5 HISTORY
 ============
+This file contains history of the HDF5 libraries releases
 
-This file contains development history of HDF5 1.8 branch
+CONTENTS
 
-7.      Release Information for hdf5-1.8.6
-6.      Release Information for hdf5-1.8.5
-5.      Release Information for hdf5-1.8.4
-4.      Release Information for hdf5-1.8.3
-3.      Release Information for hdf5-1.8.2
-2.      Release Information for hdf5-1.8.1
-1.      Release Information for hdf5-1.8.0
+19.     Release Information for hdf5-1.6.5
+18.     Release Information for hdf5-1.6.4
+17.     Release Information for hdf5-1.6.3
+16.     Release Information for hdf5-1.6.2
+15.     Release Information for hdf5-1.6.1
+14.     Release Information for hdf5-1.6.0
+13.     Release Information for hdf5-1.4.5
+12.     Release Information for hdf5-1.4.4
+11.     Release Information for hdf5-1.4.3
+10.     Release Information for hdf5-1.4.2
+9.      Release Information for hdf5-1.4.1
+8.      Release Information for hdf5-1.4.0
+7.      Release Information for hdf5-1.2.2
+6.      Release Information for hdf5-1.2.1
+5.      Release Information for hdf5-1.2.0
+4.      Changes from Release 1.0.0 to Release 1.0.1
+3.      Changes from the Beta 1.0.0 Release to Release 1.0.0
+2.      Changes from the Second Alpha 1.0.0 Release to the Beta 1.0.0 Release
+1.      Changes from the First Alpha 1.0.0 Release to the 
+                Second Alpha 1.0.0 Release
 
 [Search on the string '%%%%' for per-release section breaks.]
 
-%%%%1.8.6%%%%   
+%%%%1.6.5%%%%   Release Information for hdf5-1.6.5 (10/November/05)
 
 
-HDF5 version 1.8.6 released on Mon Feb 14 10:26:30 CST 2011
+HDF5 version 1.6.5 released on Thu Nov 10 18:17:53 CST 2005
 ================================================================================
 
 INTRODUCTION
 ============
+This document describes the differences between HDF5-1.6.4 and
+HDF5-1.6.5.  It contains information on the platforms tested and
+known problems in HDF5-1.6.5. For more details, check the HISTORY.txt
+file in the HDF5 source.
+
+The HDF5 documentation can be found on the NCSA ftp server
+(ftp.ncsa.uiuc.edu) in the directory:
+
+     /HDF/HDF5/docs/
+
+Documentation for the current release is also on the HDF web site:
+
+     http://hdf.ncsa.uiuc.edu/HDF5/doc/
+
+For more information look at the HDF5 home page at:
+
+    http://hdf.ncsa.uiuc.edu/HDF5/
+
+If you have any questions or comments, please send them to:
+
+    hdfhelp at ncsa.uiuc.edu
+
+
+CONTENTS
+========
+- New Features
+- Support for New Platforms, Languages and Compilers
+- Bug Fixes since HDF5-1.6.4
+- Documentation
+- Platforms Tested
+- Supported Configuration Features Summary
+- Known Problems
+
+
+New Features
+============
+    Configuration:
+    -------------------------
+	- Added yodconfigure, a configure tool, that patches up the configure
+	  file to allow configure to launch executable via the proper
+	  launching command like "yod -sz 1".  AKC - 2005/11/10
+	- Configure now recognizes the TR variable as the location of the
+          tr utility.  JML 2005/10/20
+
+    Source code distribution:
+    -------------------------
+	- Added g95 as a testing "platform" informally. AKC - 2005/10/04.
+        - Added MD5 checksumming to snapshot releases.  Releases will now
+          produce an .md5 file as well as a .tar archive.  md5sum can be
+          used to verify the arvhice with the .md5 checksum.  -JL 2005/09/06
+
+    Library:
+    --------
+        - Added HSYS_ERROR which retrieves the system error message and pushes
+          it to the error stack.  This provides more information regarding the 
+	  failed system call. AKC - 2005/08/04
+        - Added H5F_OBJ_LOCAL flag to H5Fget_obj_count() & H5Fget_obj_ids(), to
+          allow querying for objects in a file that was opened with a particular
+          file ID, instead of all objects opened in the file with any file ID.
+          QAK - 2005/06/01
+
+    Parallel Library:
+    -----------------
+	- Added mpich2 as a testing "platform" informally. AKC - 2005/10/04.
+	- HDF5 supports collective MPI-IO for irregular selection with HDF5
+	  dataset. Irregular selection is when users use API H5Sselect_hyperslab
+	  more than once for the same dataset.
+	  Currently, not all MPI-IO packages support the complicated 
+	  MPI derived datatypes used in the implementation of irregular 
+	  selections INSIDE HDF5. 
+	  1) DEC 5.x wdoes not support complicated derived datatypes.
+	  2) For AIX 5.1:
+	     If your poe version number is 3.2.0.20 or lower,
+	     please edit powerpc-ibm-aix5.x in the directory hdf5/config/.
+	     Find the line with
+	          << hdf5_mpi_complex_derived_datatype_works >>
+	     and UNCOMMENT this line before the configure.
+	     check poe version with the following command:
+	     lpp -l all | grep ppe.poe
+	  3) For Linux cluster,:
+	     If mpich version is 1.2.5 or lower, collective irregular selection
+	     IO is not supported; internally independent IO is used.
+	  4) For IRIX 6.5:
+	     if C compiler version is 7.3 or lower, collective irregular 
+	     selection IO is not supported; internally independent IO is used.
+	  5) For platforms which internally used mpich: 
+	     If the mpich version is 1.2.5 or lower, please find the 
+	     corresponding config (in hdf5/config) file and add
+	         hdf5_mpi_complex_derived_datatype_works='no' 
+	     at the end of the configuration file. For example, on the 
+	     NCSA SGI Altix, the internal mpich library is 1.2.5. So 
+	         hdf5_mpi_complex_derived_datatype_works='no' 
+	     should be added at the end of the config file ia64-linux-gnu.
+	     KY - 2005/09/12
+
+    Tools:
+    ------
+        - Removed obsolete pdb2hdf tool.  JML - 2005/10/28
+        - Sped up h5dump on files with large numbers of objects.
+            QAK - 2005/08/25
+
+    F90 API:
+    --------
+        - Added missing h5tget_member_class_f function
+                                            EIP 2005/04/06
+    C++ API:
+    --------
+        - Added missing member functions:
+		H5::CompType::getMemberArrayType
+		H5::CompType::getMemberVarLenType
+		H5::AbstractDs::getArrayType
+		H5::AbstractDs::getVarLenType
+		H5::CommonFG::openArrayType
+		H5::CommonFG::openVarLenType
+		H5::PropList::copyProp -- this will replace the current
+			H5::PropList::copyProp in later releases due
+			to incorrect prototype.
+		BMR - 2005/07/27
+
+
+Support for New Platforms, Languages and Compilers
+==================================================
+    - Added support for RedStorm platform (serial only.)  AKC 2005/11/10
+    - Added support for BG/L platform (serial only.)  LA 2005/11/10
+    - Added support for HPUX 11.23 (IA64); only C and C++ are supported
+      with the +DD64 flag 
+                                             EIP 2005/10/05
+ 
+
+    Configuration
+    -------------
+        - Added support for Cray X1.  JML 2005/10/03
+
+
+Bug Fixes since HDF5-1.6.4 Release
+==================================
+
+    Library
+    -------
+        - Fixed collective IO in chunking-storage.  HDF5 may have called the 
+            wrong routine when the shape of the dataspace in the file and in 
+            the bufferred chunk were different. This bug was fixed to make sure
+            the correct routine is called. KY - 2005/10/19
+        - Fixed core dump when closing root groups opened through two different
+            file handles that operate on the same actual file.  QAK - 2005/10/02
+        - The ./dsets tests used to fail in the TFLOPS machine if the
+            test program, dsets.c, was compiled with the -O option.
+            The HDF5 library still worked correctly with the -O option. Only
+            the ./dsets failed.  It is fixed. AKC - 2005/09/14
+        - Corrected errors when performing various operations on a group opened
+            by dereferencing an object reference.  QAK - 2005/07/30
+        - Fixed a bug with named datatypes where a copy of a named datatype
+            used to create a dataset would accidentally use the original
+            named datatype for the dataset's datatype.  QAK - 2005/07/23
+        - Made H5Fget_name() to be consistent and always return name of actual
+            file the ID is in.  (Instead of the name of the top file in a
+            file mounting hierarchy).  QAK - 2005/07/19
+        - Reworked internal file mounting semantics to hopefully eliminate
+            mounting problems.  We now require that files that are mounting
+            together all have the same "file close degree".  QAK - 2005/07/19
+        - More bug fixes on holding open files that are mounted and have
+            IDs open.  QAK - 2005/07/14
+        - Dataset sieve buffer cache was inadvertantly disabled; it has been
+            re-enabled.  QAK - 2005/07/08
+        - Don't unmount child files until the parent file actually closes.
+            (Previously, if an object was holding open a file, the child files
+            would get unmounted too early).  QAK - 2005/07/05
+        - Fixed bug where unmounted files could cause the library to go into
+            an infinite loop when shutting down.  QAK - 2005/06/30
+        - Fixed bug with hyperslab selections that use selection offsets and
+            operate on chunked datasets going into infinite loop or dumping
+            core.  QAK - 2005/06/17
+        - Corrected memory leak and possible corruption when opening a group.
+            QAK - 2005/06/17
+        - Added check for opaque datatype tags being too long (check against
+            H5T_OPAQUE_TAG_MAX, currently set to 256).  QAK - 2005/06/14
+        - Fixed various errors in maintaining names for open objects in the
+            face of unusual mount & unmount operations.  QAK - 2005/06/08
+        - "SEMI" and "STRONG" file close degree settings now apply only to the
+            particular file ID being closed, instead of operating on all open
+            file IDs for a given file.  QAK - 2005/06/01
+        - Fixed error in opening object in a group that was opened in a mounted
+            file which has been unmounted.  QAK - 2005/03/17
+
+    Configuration
+    -------------
+	- Configure can recognize -lmpich as a form of MPI library. -AKC-
+	  2005/9/28.
+	- Changed default C++ compiler for the IA64 platform from icc to
+	    icpc which is the preferred compiler for Intel Compiler version
+	    8. AKC - 2005/09/02
+
+    Performance
+    -------------
+        - Optimized I/O for enumerated datatypes that are a superset of a 
+            source enumerated datatype.  QAK - 2005/03/19
+   
+    Tools
+    -----
+
+    Documentation 
+    ------------- 
+
+    F90 API
+    -------
+       - h5pget_driver_f was returning information that could not be
+         interpreted by a Fortran application program; fixed. EIP - 2005/04/10
+                                
+    C++ API
+    -------
+	- Several member functions' prototype changed due to the 
+	  "int -> unsigned" change in the main library.  They are:
+		H5::CompType::getMemberDataType(unsigned member_num)
+		H5::CompType::getMemberCompType(unsigned member_num)
+		H5::CompType::getMemberEnumType(unsigned member_num)
+		H5::CompType::getMemberIntType(unsigned member_num)
+		H5::CompType::getMemberFloatType(unsigned member_num)
+		H5::CompType::getMemberStrType(unsigned member_num)
+		BMR - 2005/07/27
+
+
+
+   
+
+Platforms Tested
+================
+
+    AIX 5.1  (32 and 64-bit)      xlc 6.0.0.6
+                                  xlf 8.1.1.3
+    				  xlC 6.0.0.6
+				  mpcc_r 6.0.0.6
+                                  mpxlf_r 8.1.1.3
+				  xlc 5.0.2.5
+				  xlf 7.1.1.2
+				  xlC 5.0.2.5
+				  mpcc_r 5.0.2.5
+				  mpxlf_r 7.1.1.2
+    AIX 5.2 (32/64 bit)           xlc 6.0.0.8
+                                  xlC 6.0.0.9
+                                  xlf 8.1.1.7
+                                  mpcc_r 6.0.0.8
+                                  mpxlf_r 8.1.1.7
+    AIX 5.2 (32/64 bit, LLNL frost)    xlc 6.0.0.8
+                                  xlC 6.0.0.8
+                                  xlf 8.1.1.7
+                                  mpcc_r 6.0.0.8
+                                  mpxlf_r 8.1.1.7
+    AIX 5.3 (32/64 bit)           xlc 7.0.0.0
+                                  xlC 7.0.
+                                  xlf 9.1.0.3
+    Cray X1 water 3.0.35          Cray Standard C Version 5.4.0.7.4
+                                  Cray Fortran 5.4.0.7.3
+                                  Cray C++ 5.4.0.7.4
+    FreeBSD 4.11                  gcc 2.95.4
+                                  g++ 2.95.4
+                                  gcc 3.2.3, 3.3.6, 3.4.4, 4.0.0
+    HP-UX B.11.00                 HP C  HP92453-01 A.11.01.20 
+                                  HP F90 v2.4
+                                  HP ANSI C++ B3910B A.03.13
+    HP-UX B.11.23                 HP aC++/ANSI C B3910B A.06.00
+                                  HP F90 v2.9
+                                  HP aC++/ANSI C B3910B A.06.00
+    IRIX64 6.5 (tesla -64)        MIPSpro cc 7.4.2m
+                                  F90 MIPSpro 7.4.2m
+                                  C++ MIPSpro cc 7.4.2m
+    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.3.1.3m
+                                  F90 MIPSpro 7.3.1.3m (64 only)
+                                  C++ MIPSpro cc 7.3.1.3m
+				  mpt 1.6
+    Linux 2.4.20-28.7             gcc 2.96
+    (eirene, verbena)             gcc 3.3.2
+                                  PGI compilers (pgcc, pgf90, pgCC) 
+                                  version 5.2-1
+                                  Absoft Fortran compiler v9.0
+                         	  Intel(R) C++ 32-bit Version 8.1
+    				  Intel(R) Fortran 32-bit Version 8.1
+                                  MPIch 1.2.6
+    Linux 2.4.21-268-smp x86_64   gcc 3.3.1 (SuSE Linux, AMD)
+    (mir)                         PGI 5.2-1 C and F90 (with k3-32) 
+                         	  Intel(R) C++ 32-bit Version 8.1
+    				  Intel(R) Fortran 32-bit Version 8.1
+    Linux 2.4.21-sgi306rp21 Altix 
+          SMP ia64                Intel(R) C++ Version 8.1
+    (cobalt)                      Intel(R) Fortran Itanium(R) Version 8.1
+                                  SGI MPI
+    OSF1 V5.1 (QSC)               Compaq C V6.5-011 
+                                  HP Fortran V5.5A-3548
+				  Compaq C++ V6.5-036  
+				  MPIX200_64_r13.4
+    OSF1 V5.1 (PSC)               Compaq C V6.5-303 
+                                  HP Fortran V5.5A-3548
+				  Compaq C++ V6.5-040  
+    SunOS 5.8 32,46               Sun WorkShop 6 update 2 C 5.3
+     (Solaris 2.8)                Sun WorkShop 6 update 2 Fortran 90
+                                  Sun WorkShop 6 update 2 C++ 5.3
+    SunOS 5.9 32,64               Sun C 5.6 2004/07/15
+     (Solaris 2.9)                Sun Fortran 95 8.0 2004/07/15
+                                  Sun C++ 5.6 2004/07/15
+    SunOS 5.10                    Sun WorkShop 6 update 2 C 5.3
+                                  Sun WorkShop 6 update 2 Fortran 95 6.2
+                                  Sun WorkShop 6 update 2 C++ 5.3
+                                  Patch 111685-13 
+    Xeon Linux 2.4.21-32.0.1.ELsmp-perfctr-lustre
+    (tungsten)	                  Intel(R) C++ Version 9.0
+                                  Intel(R) Fortran Compiler Version 9.0
+    IA-64 Linux 2.4.21.SuSE_292.til1 ia64
+    (NCSA tg-login)               Intel(R) C++ Version 8.0
+                                  Intel(R) Fortran Compiler Version 8.0
+				  mpich-gm-1.2.5..10-intel-r2
+    Windows XP                    MSVC++.NET
+                                  MSVC++ 6.0
+                                  Intel 8.1 C++
+    MAC OS X                      Darwin 7.5
+                                  gcc and g++ Apple Computer, Inc. GCC 
+                                  version 1175, based on gcc version 3.3.2
+                                  IBM XL Fortran version 8.1 
+                                  Absoft Fortran compiler v8.2
+
+
+Supported Configuration Features Summary
+========================================
+
+Key:   y   = tested and supported
+       n   = not supported or not tested in this release
+       x   = not working in this release
+       dna = does not apply
+       ( ) = footnote appears below second table
+
+Platform                             C        F90    F90      C++  zlib  SZIP
+                                     parallel        parallel      
+IBM BG/L (16)			     n        n      n        n    y     y
+Solaris2.8 64-bit                    y        y      y(1)     y    y     y
+Solaris2.8 32-bit                    y        y      y(1)     y    y     y
+Solaris2.9 64-bit                    y(1)     y      y(1)     y    y     y
+Solaris2.9 32-bit                    y(1)     y      y(1)     y    y     y
+Solaris2.10 64-bit                   y(1)     y      n        y    y     y
+Solaris2.10 32-bit                   y(1)     y      n        y    y     y
+IRIX64_6.5 64-bit                    y(2)     y      y        y    y     y
+IRIX64_6.5 32-bit                    y(2)     n      n        n    y     y
+HPUX11.00                            y(1)     y      y        y    y     y
+HPUX11.23-32bit                      n        y      n        y    y     y
+HPUX11.23-64bit                      n        n      n        y    y     y
+OSF1 v5.1                            y        y      y        y    y     y
+X1                                   y        y      y        y    y     n
+AIX-5.1, 5.2 & 5.3 32-bit            y        y      y        y    y     y
+AIX-5.1, 5.2 & 5.3 64-bit            y        y      y        y    y     y
+WinXP Visual Studio 6.0              n        n(9)   n        y    y     y
+WinXP .Net                           n        n      n        y(8) y     y
+Mac OS X 10.3                        n        y(10)  n        y    y     y
+FreeBSD 4.11                         n        n      n        y    y     y
+RedHat 7.3  W (3)                    y(1)     y(11)  n        y    y     y
+RedHat 7.3  W Intel (3)              n        y      n        y    y     y
+RedHat 7.3  W PGI (3)                n        y      n        y    y     y
+RedStorm (16)			     n        y      n        y    y     n
+SuSe x86_64 gcc (3,13)               n        y(12)  n        y    y     y
+SuSe x86_64 icc (3,13)               n        y(14)  n        y    y     y
+Linux 2.4 Xeon C Lustre Intel (3,6)  n        y      n        y    y     y
+Linux 2.4 SuSE ia64 C Intel (3,7)    y        y      y        y    y     y
+Linux 2.4 SGI Altix ia64 Intel (3)   y        y      y        y    y     y
+
+
+Platform                             Shared        static-  Thread-  STREAM- 
+                                     libraries(4)  exec     safe     VFD    
+IBM BG/L 			     n              y       n        n
+Solaris2.8 64-bit                    y              x       y        y
+Solaris2.8 32-bit                    y              x       y        y
+Solaris2.9 64-bit                    y              x       y        y
+Solaris2.9 32-bit                    y              x       y        y
+Solaris2.10 64-bit                   y              x       y        y
+Solaris2.10 32-bit                   y              x       y        y
+IRIX64_6.5 64-bit                    y              y       y        y
+IRIX64_6.5 32-bit                    y              y       y        y
+HPUX11.00                            y              x       n        y
+HPUX11.23                            y              y       n        y
+OSF1 v5.1                            y              y       n        y
+X1                                   n              y       n        y
+AIX-5.1, 5.2 & 5.3 32-bit            n              y       n        y
+AIX-5.1, 5.2 & 5.3 64-bit            n              y       n        y
+WinXP Visual Studio 6.0              y              y       n        n
+WinXP .Net                           y              y       n        n
+Mac OS X 10.3                        y              y       n        y
+FreeBSD 4.11                         y              y       y        y
+RedHat 7.3   W (3)                   y              y       y        y
+RedHat 7.3  W  Intel (3)             n              y       n        y
+RedHat 7.3  W  PGI (3)               n              y       n        y
+RedStorm 			     n              y       n        y
+SuSe x86_64 gcc (3,13)               n              y       n        y
+SuSe x86_64 icc (3,13)               y              y(15)   n        y
+Linux 2.4 Xeon C Lustre Intel (3,6)  y              y       n        y
+Linux 2.4 SuSE ia64 C Intel (3,7)    y              y       n        n
+Linux 2.4 SGI Altix ia64 Intel  (3)  y              y       n        y
+
+
+Compiler versions for each platform are listed in the "Platforms Tested" 
+table found elsewhere in this file (RELEASE.txt).  Unless otherwise noted, 
+compilers used are the system compilers.
+
+Footnotes:  (1) Using mpich 1.2.6
+            (2) Using mpt and mpich 1.2.6.
+            (3) Linux 2.4 with GNU, Intel, and PGI compilers, as indicated.  
+                  W or C indicates workstation or cluster, respectively.
+            (4) Shared libraries are provided only for the C library, 
+                except on Windows where they are provided for C and C++.
+            (5) Using mpt.
+            (6) Linux 2.4.21-32.0.1.  Xeon cluster with ELsmp-perfctr-lustre 
+                and Intel compilers
+            (7) Linux 2.4.21, SuSE_292.til1.  Ia64 cluster with Intel compilers
+            (8) Intel 8.1
+            (9) One test of this release failed with Compaq Visual Fortran 6.6c.
+                No binary fortran release will be provided. Users should build
+                the library by themselves and use it at their own risk. 
+                We recommend that users use HDF5 1.7 instead 
+                or use Compaq Visual Fortran 6.0.
+           (10) IBM XLF and Absoft
+           (11) PGI, Absoft.  No shared libraries with Absoft; 
+                use '--disable-shared'.
+           (12) PGI and Intel compilers for both C and Fortran
+           (13) AMD Opteron x86_64
+           (14) ifort
+           (15) Yes with C and Fortran, but not with C++
+           (16) Only serial is ported.  PFS does not work for PHDF5 yet.
+           FMB/EIP - 2005/11/10
+
+
+Known Problems
+==============
+* Intel Compilers for Linux x86_86 platforms (EM64T-based, v8.1) has
+  optimization error in the data types conversion code.  Before running
+  configure, edit the file config/intel-flags by changing the setting of
+  PROD_CFLAGS from -O3 to -O0, then run configure.  AKC - 2005/11/10.
+
+* Fortran testing and compiling failures on windows XP 
+  1. Compaq visual fortran 6.6c with VS 6.0
+     The Fortran tests failed for both release, release dll, debug and debug
+     dll. The failure is a random one. We won't provide fortran libraries. The
+     same test passed with the 1.7.51 snapshot. You may find the 1.7.51 
+     snapshot under ftp://hdf.ncsa.uiuc.edu/pub/outgoing/hdf5/snapshots/.
+  2. Intel fortran 8.1 under .Net environment
+     The fortran library cannot even be compiled. Some users have pointed this
+     to intel forum.
+
+* When testing parallel HDF5 with the C compiler version MIPSpro 7.4.3 at IRIX
+  6.5, set enviroment variable MPI_TYPE_MAX to be a bigger number, for example 
+  120000, in order to pass the complicated collective IO tests inside parallel 
+  HDF5 library. This is not a problem inside parallel HDF5 library. You can 
+  always set a bigger number in your system.
+                                  KY - 2005/10/6
+
+* A contiguous or chunked dataset created by a sequential version may
+  not be modified with a parallel version of the library. 
+  Use the H5Pset_alloc_time function with H5D_ALLOC_TIME_EARLY to set up the 
+  dataset creation property list to avoid the problem.
+                                    EIP - 2005/09/09
+
+* The dataset created or rewritten with the v1.6.3 library or after can't 
+  be read with the v1.6.2 library or before when Fletcher32 EDC(filter) is 
+  enabled.  There was a bug in the calculating code of the Fletcher32 
+  checksum in the library before v1.6.3.  The checksum value wasn't consistent 
+  between big-endian and little-endian systems.  This bug was fixed in 
+  Release 1.6.3.  However, after fixing the bug, the checksum value is no 
+  longer the same as before on little-endian system.  The library release 
+  after 1.6.4 can still read the dataset created or rewritten with the library
+  of v1.6.2 or before.  SLU - 2005/7/8
+
+* For version 6 (6.02 and 6.04) of the Portland Group compiler on AMD Opteron
+  processor, there's a bug in the compiler for optimization(-O2).  The library
+  failed in several tests but all related to multi driver.  The problem has 
+  been reported to the vendor.  
+
+* test/big fails sometimes with the message "Possible overlap with another
+  region."  The test selects regions randomly, and this error occurs when
+  two regions overlap each other; it is a bug in the test and not in
+  HDF5.  Since the error is triggered by a random situation, it will
+  usually disappear if the test is re-run.
+
+* Newer SGI MIPSpro compilers (version 7.4.x) support C99 features but it
+  has a "guard" statement in stdint.h that will #error and skip the rest
+  of the header file if C99 option is not used explicitly.  Hardset
+  $CC to c99 will resolve the problem. AKC - 2004/12/13
+
+* On IBM AIX systems, parallel HDF5 mode will fail some tests with error
+  messages like "INFO: 0031-XXX ...".  This is from the command poe.
+  Set the environment variable MP_INFOLEVEL to 0 to minimize the messages
+  and run the tests again.
+  The tests may fail with messages like "The socket name is already
+  in use".  HDF5 does not use sockets (except for stream-VFD).  This is
+  due to problems of the poe command trying to set up the debug socket.
+  Check if there are many old /tmp/s.pedb.* staying around.  These are
+  sockets used by the poe command and left behind due to failed commands.
+  Ask your system administrator to clean them out.  Lastly, request IBM
+  to provide a means to run poe without the debug socket.
+
+* Two h5dump xml tests(h5dump --xml thlink.h5 and h5dump --xml tmany.h5) 
+  failed on windows xp with .NET for debug and debug dll. Release and 
+  Release dll work fine. 
+
+* The h5dump tests may fail to match the expected output on some platforms
+  (e.g. parallel jobs, Windows) where the error messages directed to
+  "stderr" do not appear in the "right order" with output from stdout.
+  This is not an error.
+
+* The stream-vfd test uses ip port 10007 for testing. If another
+  application is already using that port address, the test will hang
+  indefinitely and has to be terminated by the kill command. To try the
+  test again, change the port address in test/stream_test.c to one not
+  being used in the host.
+
+* The --enable-static-exec configure flag fails to compile for Solaris
+  platforms. This is due to the fact that not all of the system
+  libraries on Solaris are available in a static format.
+
+  The --enable-static-exec configure flag also fails to correctly compile
+  on IBM SP2 platform for the serial mode. The parallel mode works fine
+  with this option.
+
+  The --enable-static-exec configure flag also fails to correctly compile
+  on the HPUX 11.00.
+  
+  It is suggested that you don't use this option on these platforms
+  during configuration.
+
+* The Stream VFD was not tested yet under Windows.
+
+
+* Before building HDF5 F90 Library from source on Crays 
+  replace H5Aff.f90, H5Dff.f90 and H5Pff.f90 files in the fortran/src
+  subdirectory in the top level directory with the Cray-specific files
+  from the site:
+  ftp://ftp.ncsa.uiuc.edu/HDF/HDF5/current/src/patches/
+
+* Use --disable-shared configure flag if building with Absoft Fortran
+  compiler.
+
+* Information about building with PGI and Intel compilers is available in
+  INSTALL file sections 5.7 and 5.8.
+
+* In LANL QSC, the new cc compiler has problems converting small values of
+  long long (absolute values less than 1**-308) to double.  This triggers
+  the test/dtypes to report failure in the
+      Testing random sw long double -> double conversions
+  If -ieee is used, the converted doubles spread over the range 0.0 to 1**-308.
+  If -ieee is not used, the converted double values are mostly 0.0 but
+  occasionally as 1**-308.  This has been reported to the system staff.
+  All other tests have passed.
+
+* Fortran release DLL randomly failed with Compaq Visual Fortran 6.6c on
+  Windows. 
+
+* Fortran DLL built with Intel 8.1 in .NET environment crushed the compiler,
+  Building Fortran static library with Intel 8.1 in .NET environment 
+  requires manually setting the project file.
+  Please contact to hdfhelp at ncsa.uiuc.edu if you need to build
+  Fortran static library with Intel 8.1 with .NET environment.
+
+* On at least one system, SDSC DataStar, the scheduler (in this case
+  LoadLeveler) sends job status updates to standard error when you run
+  any executable that was compiled with the parallel compilers.
+
+  This causes problems when running "make check" on parallel builds, as
+  many of the tool tests function by saving the output from test runs,
+  and comparing it to an exemplar.
+
+  The best solution is to reconfigure the target system so it no longer
+  inserts the extra text.  However, this may not be practical.
+
+  In such cases, one solution is to "setenv HDF5_Make_Ignore yes" prior to
+  the configure and build.  This will cause "make check" to continue after
+  detecting errors in the tool tests.  However, in the case of SDSC DataStar,
+  it also leaves you with some 150 "failed" tests to examine by hand.
+
+  A second solution is to write a script to run serial tests and filter
+  out the text added by the scheduler.  A sample script used on SDSC
+  DataStar is given below, but you will probably have to customize it
+  for your installation.
+
+  Observe that the basic idea is to insert the script as the first item
+  on the command line which executes the test.  The script then
+  executes the test and filters out the offending text before passing
+  it on.
+
+        #!/bin/csh
+
+        set STDOUT_FILE=~/bin/serial_filter.stdout
+        set STDERR_FILE=~/bin/serial_filter.stderr
 
-This document describes the differences between HDF5-1.8.5 and 
-HDF5 1.8.6, and contains information on the platforms tested and 
-known problems in HDF5-1.8.6. 
-For more details, see the files HISTORY-1_0-1_8_0_rc3.txt 
-and HISTORY-1_8.txt in the release_docs/ directory of the HDF5 source.
+        rm -f $STDOUT_FILE $STDERR_FILE
+
+        ($* > $STDOUT_FILE) >& $STDERR_FILE
+
+        set RETURN_VALUE=$status
+
+        cat $STDOUT_FILE
+
+        tail +3 $STDERR_FILE
+
+        exit $RETURN_VALUE
 
-Links to the HDF5 1.8.6 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
+  You get the HDF make files and test scripts to execute your filter script
+  by setting the environment variable "RUNSERIAL" to the full path of the
+  script prior to running configure for parallel builds.  Remember to
+  "unsetenv RUNSERIAL" before running configure for a serial build.
 
-     http://www.hdfgroup.org/products/hdf5/
+  Note that the RUNSERIAL environment variable exists so that we can
+  prefix serial runs as necessary on the target system.  On DataStar,
+  no prefix is necessary.  However, on an MPICH system, the prefix might
+  have to be set to something like "/usr/local/mpi/bin/mpirun -np 1" to
+  get the serial tests to run at all.
 
-The HDF5 1.8.6 release can be obtained from:
+  In such cases, you will have to include the regular prefix in your
+  filter script.
 
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
+%%%%1.6.4%%%%   Release Information for hdf5-1.6.4 (15/March/05)
 
-User documentation for 1.8.6 can be accessed directly at this location: 
 
-     http://www.hdfgroup.org/HDF5/doc/
+HDF5 version 1.6.4 released on Tue Mar 15 20:38:48 CST 2005
+================================================================================
 
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
+INTRODUCTION
+============
+This document describes the differences between HDF5-1.6.3 and
+HDF5-1.6.4, and contains information on the platforms tested and
+known problems in HDF5-1.6.4. For more details check the HISTORY.txt
+file in the HDF5 source.
 
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
+The HDF5 documentation can be found on the NCSA ftp server
+(ftp.ncsa.uiuc.edu) in the directory:
 
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.6 (current 
-release) versus Release 1.8.5":
+     /HDF/HDF5/docs/
 
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
+For more information look at the HDF5 home page at:
+   
+    http://hdf.ncsa.uiuc.edu/HDF5/
 
-If you have any questions or comments, please send them to the HDF Help Desk:
+If you have any questions or comments, please send them to:
 
-     help at hdfgroup.org
+    hdfhelp at ncsa.uiuc.edu
 
 
 CONTENTS
 ========
-
 - New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.5
+- Support for new platforms and languages
+- Bug Fixes since HDF5-1.6.3
+- Documentation
 - Platforms Tested
 - Supported Configuration Features Summary
 - Known Problems
@@ -71,3869 +686,5752 @@ CONTENTS
 
 New Features
 ============
+    Source code distribution:
+    -------------------------
+
+    The High-Level (HL) C APIs were added to the source code distribution.
+    For HL documentation, see
+    http://hdf.ncsa.uiuc.edu/HDF5/hdf5_hl/doc/RM_hdf5hl.html.
+
+    The HL library, libhdf5_hl.a(so), is built and installed by default. 
+    Use --disable-hl configure flag to disable the HL library.
+
+    Library:
+    --------
+        - We recommend you to use SZIP v2.0 with this release. 
+          For more information see
+          http://hdf.ncsa.uiuc.edu/doc_resource/SZIP/ 
+        - The compound datatype has been enhanced with a new feature of size 
+            adjustment.  The size can be increased and decreased (without
+            cutting the last member).  No API change is involved.  SLU - 
+            2004/10/1
+        - Removed PABLO support.  2005/01/20 EIP 
+
+    Parallel Library:
+    -----------------
+        - Allow compressed, chunked datasets to be read in parallel.
+            QAK - 2004/10/04
+
+    Tools:
+    ------
+	- New tool, h5jam.  See HDF5 Reference Manual.  2004/10/08	      
+
+    F90 API:
+    --------
+          No new features in this release.
+
+    C++ API:
+    --------
+	- Started using C library's reference counting in place of the class
+	  RefCounter, which existed before the C mechanism was available.  
+	  As a result, RefCounter has been removed.  2005/03/12 BMR
+
+
+Support for new platforms, languages and compilers.
+=======================================
+
+    Configuration
+    -------------
+	- Upgraded from GNU autoconf 2.53 to autoconf 2.59.  JML - 2005/01/31
+
+
+Bug Fixes since HDF5-1.6.3 release
+==================================
+
+    Library
+    -------
+        - Fixed a racing condition in MPIPOSIX virtual file drive close
+	  function.  Now all processes must completed the close before any
+	  of them is returned.  This prevents some "faster" processes start
+	  accessing the file for another purpose (e.g., open with truncate)
+	  while other "slower" processes have not closed the same file with
+	  the previous purpose.  AKC - 2005/03/01
+	- H5Tget_member_value calls for enum datatype didn't return correct 
+          value if H5Tenum_valueof was called first.  It's fixed.  SLU - 
+          2005/02/08
+        - For variable-length string, H5Tget_class returned H5T_STRING as its
+          class.  But H5Tdetect_class and H5Tget_member_class considered it
+          as H5T_VLEN.  This is fixed to let all these 3 functions treat it
+          as H5T_STRING.  SLU - 2005/02/08
+        - The byte order of all 1-byte integer types was fixed as
+          little-endian even on a big-endian machine.  It's corrected.
+          SLU - 2005/02/07
+        - Fixed segmentation fault when calling H5Fflush with an attribute that
+          hasn't had a value written to it open.  QAK - 2004/10/18
+        - Backed out support for bitfield and time types in H5Tget_native_type.
+          Leave it to future support.  The function simply returns error 
+          message of "not support" for bitfield and time types. SLU - 2004/10/5
+        - Fixed address check in Core VFL driver to avoid spurious address/size
+          overflows for odd valued addresses and/or sizes.  QAK - 2004/09/27
+        - Fixed problem where chunked datasets were not able to be deleted
+          from a file under certain circumstances.  QAK - 2004/09/27/
+
+    Configuration
+    -------------
+	- IRIX64 MIPSpro compiler of 7.4.x supports C99 features.  Default
+	  to use the 'c99' compiler if available. AKC - 2004/12/13
+	- Intel v8.0 compiler would infinite loop when compiling some test
+	  code with -O3 option.  Changed enable-production default compiler
+	  option to -O2. AKC - 2004/12/06
+	- Long double is assumed to be a supported C data type.  It is a
+	  standard C89 type. AKC - 2004/10/22
+
+    Performance
+    -------------
+    Many changes were made to the library to improve performance,
+    especially for the variable-length datatypes and metadata cache.
+   
+    Tools
+    -----
+        - h5fc and h5c++ work correctly when -c compiler flag
+          is used.  EIP - 2005/03/14        
+	- Fixed h5dump to print attributes data in ASCII if -r option is used.
+	  AKC - 2004/11/18
+        - Fixed space utilization reported in h5ls to correct error 
+          in formula used.  QAK - 2004/10/22
+
+    Documentation 
+    ------------- 
+
+    F90 API
+    -------
+       - On windows, previously Fortran DLL built and tested failed.
+         Now Fortran DLL has been built and tested successfully
+         with Dec Fortran 6.6c or Dec Fortran 6.0.
+
+    C++ API
+    -------
+
+
+Documentation
+=============
+
+    HDF5 Library documentation
+    --------------------------
+    No substantive changes to the structure or types of content in the 
+    HDF5 Library documentation.
+
+    Windows installation documentation
+    ----------------------------------
+    1. On Windows zlib has been updated to 1.2.2. You may find the binary at
+       either http://www.zlib.net/zlib122-dll.zip or
+              ftp://hdf.ncsa.uiuc.edu/lib-external/zlib/bin/windows
+
+    2. Only DLLs of external libraries (zlib and szip) are linked with the 
+       HDF5 Library. We will no longer provide binary to link static library 
+       with HDF5. For details, please check INSTALL_Windows in this directory.
+        
+
+Platforms Tested
+================
+
+    AIX 5.1  (32 and 64-bit)      xlc 6.0.0.6
+                                  xlf 8.1.1.3
+    				  xlC 6.0.0.6
+				  mpcc_r 6.0.0.6
+                                  mpxlf_r 8.1.1.3
+				  xlc 5.0.2.5
+				  xlf 7.1.1.2
+				  xlC 5.0.2.5
+				  mpcc_r 5.0.2.5
+				  mpxlf_r 7.1.1.2
+    AIX 5.2 (32/64 bit)           xlc 6.0.0.8
+                                  xlC 6.0.0.9
+                                  xlf 8.1.1.7
+                                  mpcc_r 6.0.0.8
+                                  mpxlf_r 8.1.1.7
+    AIX 5.2 (32/64 bit, LLNL frost)    xlc 6.0.0.8
+                                  xlC 6.0.0.8
+                                  xlf 8.1.1.7
+                                  mpcc_r 6.0.0.8
+                                  mpxlf_r 8.1.1.7
+    Cray T90 sn7001 10.0.0md      Cray Standard C Version 6.4.0.3
+                                  Cray Fortran Version 3.4.0.0
+    Cray SV1 sn9617 10.0.1.2      Cray Standard C Version 6.6.0.3.6
+                                  Cray Fortran Version 3.6.0.3.1
+    FreeBSD 4.9                   gcc 2.95.4
+                                  g++ 2.95.4
+                                  gcc 3.2.3, 3.3.6, 3.4.4, 4.0.0
+    HP-UX B.11.00                 HP C  HP92453-01 A.11.01.20 
+                                  HP F90 v2.4
+                                  HP ANSI C++ B3910B A.03.13
+                                  MPIch 1.2.4
+    IRIX64 6.5 (tesla -64)        MIPSpro cc 7.4.2m
+                                  F90 MIPSpro 7.4.2m
+                                  C++ MIPSpro cc 7.4.2m
+    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.3.1.3m
+                                  F90 MIPSpro 7.3.1.3m (64 only)
+                                  C++ MIPSpro cc 7.3.1.3m
+				  mpt 1.6
+    Linux 2.4.20-28.7             gcc 2.96
+    (eirene, verbena)             gcc 3.3.2
+                                  PGI compilers (pgcc, pgf90, pgCC) 
+                                  version 5.2-1
+                                  Absoft Fortran compiler v9.0
+                         	  Intel(R) C++ 32-bit Version 8.1
+    				  Intel(R) Fortran 32-bit Version 8.1
+                                  MPIch 1.2.6
+    Linux 2.4.21-268-smp x86_64   gcc 3.3.1 (SuSE Linux, AMD)
+    (mir)                         PGI 5.2-1 C and F90 (with k3-32) 
+                         	  Intel(R) C++ 32-bit Version 8.1
+    				  Intel(R) Fortran 32-bit Version 8.1
+    Linux 2.4.21-sgi303r2 Altix 
+          SMP ia64                Intel(R) C++ Version 8.1
+    (cobalt)                      Intel(R) Fortran Itanium(R) Version 8.1
+                                  SGI MPI
+    OSF1 V5.1 (QSC)               Compaq C V6.5-011 
+                                  HP Fortran V5.5A-3548
+				  Compaq C++ V6.5-036  
+				  MPIX200_64_r13.4
+    OSF1 V5.1 (PSC)               Compaq C V6.5-303 
+                                  HP Fortran V5.5A-3548
+				  Compaq C++ V6.5-040  
+				  MPIX200_64_r13.4
+                                  FORTRAN 90 2.0 Patch 107356-04 
+    SunOS 5.8 32,46               Sun WorkShop 6 update 2 C 5.3
+     (Solaris 2.8)                Sun WorkShop 6 update 2 Fortran 90
+                                  Sun WorkShop 6 update 2 C++ 5.3
+    SunOS 5.9 32,64               Sun C 5.6 2004/07/15
+     (Solaris 2.9)                Sun Fortran 95 8.0 2004/07/15
+                                  Sun C++ 5.6 2004/07/15
+    TFLOPS r1.0.4 v4.5.2 i386     pgcc Rel 3.1-4i with mpich-1.2.4 with
+                                          local modifications
+    Xeon Linux 2.4.20-31.9smp_perfctr_lustre
+    (tungsten)	                  Intel(R) C++ Version 8.0
+                                  Intel(R) Fortran Compiler Version 8.0
+    IA-64 Linux 2.4.21.SuSE_128.bef1 ia64
+    (NCSA tg-login)               Intel(R) C++ Version 8.0
+                                  Intel(R) Fortran Compiler Version 8.0
+				  mpich-gm-1.2.5..intel
+    Windows XP                    MSVC++.NET
+                                  MSVC++ 6.0
+                                  Compaq Visual Fortran 6.6C
+                                  Intel 8.1 C++
+    MAC OS X                      Darwin 7.5
+                                  gcc and g++ Apple Computer, Inc. GCC 
+                                  version 1175, based on gcc version 3.3.2
+                                  IBM XL Fortran version 8.1 
+                                  Absoft Fortran compiler v8.2
+
+
+Supported Configuration Features Summary
+========================================
+
+Key:   y   = tested and supported
+       n   = not supported or not tested in this release
+       x   = not working in this release
+       dna = does not apply
+       ( ) = footnote appears below second table
+
+Platform                             C        F90    F90      C++  zlib  SZIP
+                                     parallel        parallel      
+Solaris2.8 64-bit                    y        y      y(1)     y    y     y
+Solaris2.8 32-bit                    y        y      y(1)     y    y     y
+Solaris2.9 64-bit                    y(1)     y      y(1)     y    y     y
+Solaris2.9 32-bit                    y(1)     y      y(1)     y    y     y
+IRIX64_6.5 64-bit                    y(2)     y      y        y    y     y
+IRIX64_6.5 32-bit                    y(2)     n      n        n    y     y
+HPUX11.00                            y(1)     y      y        y    y     y
+OSF1 v5.1                            y        y      y        y    y     y
+T90 IEEE                             n        y      n        n    y     n
+SV1                                  y(5)     y      y(5)     n    y     n
+TFLOPS                               y(1)     n      n        n    y     n
+AIX-5.1 & 5.2 32-bit                 y        y      y        y    y     y
+AIX-5.1 & 5.2 64-bit                 y        y      y        y    y     y
+WinXP Visual Studio 6.0              n        y(9)   n        y    y     y
+WinXP .Net                           n        n      n        y(8) y     y
+Mac OS X 10.3                        n        y(10)  n        y    y     y
+FreeBSD 4.9                          y(1)     n      n        y    y     y
+RedHat 7.3  W (3)                    y(1)     y(11)  n        y    y     y
+RedHat 7.3  W Intel (3)              n        y      n        y    y     y
+RedHat 7.3  W PGI (3)                n        y      n        y    y     y
+SuSe x86_64 gcc (3,13)               n        y(12)  n        y    y     y
+SuSe x86_64 icc (3,13)               n        y(14)  n        y    y     y
+Linux 2.4 Xeon C Lustre Intel (3,6)  n        y      n        y    y     y
+Linux 2.4 SuSE ia64 C Intel (3,7)    y        y      y        y    y     y
+Linux 2.4 SGI Altix ia64 Intel (3)   y        y      y        y    y     y
+
+
+Platform                             Shared        static-  Thread-  STREAM- 
+                                     libraries(4)  exec     safe     VFD    
+Solaris2.8 64-bit                    y              x       y        y
+Solaris2.8 32-bit                    y              x       y        y
+Solaris2.9 64-bit                    y              x       y        y
+Solaris2.9 32-bit                    y              x       y        y
+IRIX64_6.5 64-bit                    y              y       y        y
+IRIX64_6.5 32-bit                    y              y       y        y
+HPUX11.00                            y              x       n        y
+OSF1 v5.1                            y              y       n        y
+T90 IEEE                             n              y       n        y
+SV1                                  n              y       n        y
+TFLOPS                               n              y       n        n
+AIX-5.1 & 5.2 32-bit                 n              y       n        y
+AIX-5.1 & 5.2 64-bit                 n              y       n        y
+WinXP Visual Studio 6.0              y              y       n        n
+WinXP .Net                           y              y       n        n
+Mac OS X 10.3                        y              y       n        y
+FreeBSD 4.9                          y              y       y        y
+RedHat 7.3   W (3)                   y              y       y        y
+RedHat 7.3  W  Intel (3)             n              y       n        y
+RedHat 7.3  W  PGI (3)               n              y       n        y
+SuSe x86_64 gcc (3,13)               n              y       n        y
+SuSe x86_64 icc (3,13)               y              y(15)   n        y
+Linux 2.4 Xeon C Lustre Intel (3,6)  y              y       n        y
+Linux 2.4 SuSE ia64 C Intel (3,7)    y              y       n        n
+Linux 2.4 SGI Altix ia64 Intel  (3)  y              y       n        y
+
+
+Compiler versions for each platform are listed in the "Platforms Tested" 
+table found elsewhere in this file (RELEASE.txt).  Unless otherwise noted, 
+compilers used are the system compilers.
+
+Footnotes:  (1) Using mpich 1.2.6
+            (2) Using mpt and mpich 1.2.6.
+            (3) Linux 2.4 with GNU, Intel, and PGI compilers, as indicated.  
+                  W or C indicates workstation or cluster, respectively.
+            (4) Shared libraries are provided only for the C library, 
+                except on Windows where they are provided for C and C++.
+            (5) Using mpt.
+            (6) Linux 2.4.20-31.9.  Xeon cluster with smp_perfctr_lustre 
+                and Intel compilers
+            (7) Linux 2.4.21, SuSE_128.befl.  Ia64 cluster with Intel compilers
+            (8) Intel 8.1
+            (9) Compaq Visual Fortran 6.6C
+           (10) IBM XLF and Absoft
+           (11) PGI, Absoft.  No shared libraries with Absoft; 
+                use '--disable-shared'.
+           (12) PGI and Intel compilers for both C and Fortran
+           (13) AMD Opteron x86_64
+           (14) ifort
+           (15) Yes with C and Fortran, but not with C++
+       FMB/EIP - 2005/03/15
+
+
+Known Problems
+==============
+* test/big fails sometimes with the message "Possible overlap with another
+  region."  The test selects regions randomly, and this error occurs when
+  two regions overlap each other; it is an bug in the test and not in
+  HDF5.  Since the error is triggered by a random situation, it will
+  usually disappear if the test is re-run.
+
+* Cray SV1 fails to correctly convert between floating-point and "long double"
+  for software conversion.  Problem is being investigated. SLU - 2005/03/04
+
+* Newer SGI MIPSpro compilers (version 7.4.x) support C99 features but it
+  has a "guard" statement in stdint.h that will #error and skip the rest
+  of the header file if C99 option is not used explicitly.  Hardset
+  $CC to c99 will resolve the problem. AKC - 2004/12/13
+
+* On IBM AIX systems, parallel HDF5 mode will fail some tests with error
+  messages like "INFO: 0031-XXX ...".  This is from the command poe.
+  Set the environment variable MP_INFOLEVEL to 0 to minimize the messages
+  and run the tests again.
+  The tests may fail with messages like "The socket name is already
+  in use".  HDF5 does not use sockets (except for stream-VFD).  This is
+  due to problems of the poe command trying to set up the debug socket.
+  Check if there are many old /tmp/s.pedb.* staying around.  These are
+  sockets used by the poe command and left behind due to failed commands.
+  Ask your system administrator to clean them out.  Lastly, request IBM
+  to provide a mean to run poe without the debug socket.
+
+* Fortran subroutine h5pget_driver_f doesn't return a correct driver 
+  information.
+
+* There are two h5dump xml tests(h5dump --xml thlink.h5 and 
+  h5dump --xml tmany.h5) failed on windows xp with .NET for debug and 
+  debug dll. Release and Release dll work fine. 
+
+* The h5dump tests may fail to match the expected output on some platforms
+  (e.g. parallel jobs, Windows) where the error messages directed to
+  "stderr" do not appear in the "right order" with output from stdout.
+  This is not an error.
+
+* The stream-vfd test uses ip port 10007 for testing. If another
+  application is already using that port address, the test will hang
+  indefinitely and has to be terminated by the kill command. To try the
+  test again, change the port address in test/stream_test.c to one not
+  being used in the host.
+
+* The --enable-static-exec configure flag fails to compile for Solaris
+  platforms. This is due to the fact that not all of the system
+  libraries on Solaris are available in a static format.
+
+  The --enable-static-exec configure flag also fails to correctly compile
+  on IBM SP2 platform for the serial mode. The parallel mode works fine
+  with this option.
+  
+  It is suggested that you don't use this option on these platforms
+  during configuration.
+
+* The Stream VFD was not tested yet under Windows. It is not supported
+  in the TFLOPS machine.
+
+* The ./dsets tests failed in the TFLOPS machine if the test program,
+  dsets.c, is compiled with the -O option.  The hdf5 library still works
+  correctly with the -O option.  The test program works fine if it is
+  compiled with -O1 or -O0.  Only -O (same as -O2) causes the test
+  program to fail.
+
+* Certain platforms give false negatives when testing h5ls:
+    - Cray T90IEEE give errors during testing when displaying
+      some floating-point values. These are benign differences due to
+      the different precision in the values displayed.
+      h5ls appears to be dumping floating-point numbers correctly.
+
+* Before building HDF5 F90 Library from source on Crays 
+  replace H5Aff.f90, H5Dff.f90 and H5Pff.f90 files in the fortran/src
+  subdirectory in the top level directory with the Cray-specific files
+  from the site:
+  ftp://ftp.ncsa.uiuc.edu/HDF/HDF5/current/src/patches/
+
+* On some platforms that use Intel and Absoft compilers to build HDF5 fortran 
+  library, compilation may fail for fortranlib_test.f90, fflush1.f90 and 
+  fflush2.f90 complaining about exit subroutine. Comment out the line 
+  IF (total_error .ne. 0) CALL exit (total_error)
+
+* Use --disable-shared configure flag if building with Absoft Fortran
+  compiler
+
+* Information about building with PGI and Intel compilers is available in
+  INSTALL file sections 5.7 and 5.8
+
+* In LANL QSC, the new cc compiler has problems converting small values of
+  long long (absolute values less than 1**-308) to double.  This triggers
+  the test/dtypes to report failure in the
+      Testing random sw long double -> double conversions
+  If -ieee is used, the converted doubles spread over the range 0.0 to 1**-308.
+  If -ieee is not used, the converted double values are mostly 0.0 but
+  occasionally as 1**-308.  This has been reported to the system staff.
+  All other tests have passed.
+
+* The C++ library's tests fails when compiling with PGI C++ compiler.  The
+  workaround until the problem is correctly handled is to use the
+  flag "--instantiate=local" prior to the configure and build steps, as:
+        setenv CXX "pgCC --instantiate=local"  for pgCC 5.02 and higher
+        setenv CXX "pgCC -tlocal" for others
+
+* Fortran release DLL randomly failed with compaq visual fortran 6.6c on
+  windows. 
+
+* Fortran DLL built with Intel 8.1 in .NET environment crushed the compiler,
+  To build Fortran Static library with Intel 8.1 in .NET environment 
+  needs manually setting the project file,
+  please contact to hdfhelp at ncsa.uiuc.edu if you need to build
+  fortran static library with Intel 8.1 with .NET environment.
+
+* On at least one system, (SDSC DataStar), the scheduler (in this case
+  LoadLeveler) sends job status updates to standard error when you run
+  any executable that was compiled with the parallel compilers.
+
+  This causes problems when running "make check" on parallel builds, as
+  many of the tool tests function by saving the output from test runs,
+  and comparing it to an exemplar.
+
+  The best solution is to reconfigure the target system so it no longer
+  inserts the extra text.  However, this may not be practical.
+
+  In such cases, one solution is to "setenv HDF5_Make_Ignore yes" prior to
+  the configure and build.  This will cause "make check" to continue after
+  detecting errors in the tool tests.  However, in the case of SDSC DataStar,
+  it also leaves you with some 150 "failed" tests to examine by hand.
+
+  A second solution is to write a script to run serial tests and filter
+  out the text added by the scheduler.  A sample script used on SDSC
+  DataStar is given below, but you will probably have to customize it
+  for your installation.
+
+  Observe that the basic idea is to insert the script as the first item
+  on the command line which executes the test.  The script then
+  executes the test and filters out the offending text before passing
+  it on.
+
+        #!/bin/csh
+
+        set STDOUT_FILE=~/bin/serial_filter.stdout
+        set STDERR_FILE=~/bin/serial_filter.stderr
+
+        rm -f $STDOUT_FILE $STDERR_FILE
+
+        ($* > $STDOUT_FILE) >& $STDERR_FILE
+
+        set RETURN_VALUE=$status
+
+        cat $STDOUT_FILE
+
+        tail +3 $STDERR_FILE
+
+        exit $RETURN_VALUE
+
+  You get the HDF make files and test scripts to execute your filter script
+  by setting the environment variable "RUNSERIAL" to the full path of the
+  script prior to running configure for parallel builds.  Remember to
+  "unsetenv RUNSERIAL" before running configure for a serial build.
+
+  Note that the RUNSERIAL environment variable exists so that we can
+  can prefix serial runs as necessary on the target system.  On DataStar,
+  no prefix is necessary.  However on an MPICH system, the prefix might
+  have to be set to something like "/usr/local/mpi/bin/mpirun -np 1" to
+  get the serial tests to run at all.
+
+  In such cases, you will have to include the regular prefix in your
+  filter script.
+
+
+%%%%1.6.3%%%%   Release Information for hdf5-1.6.3 (22/September/04)
+
+HDF5 version 1.6.3 released on Wed Sep 22 11:30:11 CDT 2004
+================================================================================
+
+
+INTRODUCTION
+
+This document describes the differences between HDF5-1.6.2 and
+HDF5-1.6.3, and contains information on the platforms tested and
+known problems in HDF5-1.6.3. For more details check the HISTORY.txt
+file in the HDF5 source.
+
+The HDF5 documentation can be found on the NCSA ftp server
+(ftp.ncsa.uiuc.edu) in the directory:
+
+     /HDF/HDF5/docs/
+
+For more information look at the HDF5 home page at:
+   
+    http://hdf.ncsa.uiuc.edu/HDF5/
+
+If you have any questions or comments, please send them to:
+
+    hdfhelp at ncsa.uiuc.edu
+
+CONTENTS
+
+- New Features
+- Support for new platforms and languages
+- Bug Fixes since HDF5-1.6.2
+- Documentation
+- Platforms Tested
+- Supported Configuration Features Summary
+- Known Problems
+
+
+New Features
+============
+
+    Configuration:
+    --------------
+        - Added some initial support for making purify (or similar memory
+            checking products) happier by initializing buffers to zero and
+            disabling the internal free list code.  To take advantage of this,
+            define 'H5_USING_PURIFY' in your CFLAGS when building the library.
+            QAK - 2004/07/23
+
+        - WINDOWS building,testing and installing improvements
+
+          - On Windows, FORTRAN,C++ and C projects are merged into one zip file, 
+            users can choose an option to build either FORTRAN or C++ or both 
+            with basic C library.For detailed information,
+            please read INSTALL_Windows.txt.
+
+          - On Windows, szip compression library with or without encoder can be easily
+            turned off or on when building HDF5.  For detailed information,
+            please read INSTALL_Windows.txt, especially section V. 
+  
+          - On Windows, an optional procedure for building,testing and installing
+            HDF5 from command line is provided. This procedure is supposed to be
+            convenient for experienced users, please read 
+            INSTALL_windows_From_Command_Line.txt for details.
+
+          - On Windows, an alternative short instruction document for building,
+            testing and installing HDF5 is provided. This instruction is supposed to
+            be convenient for general users, please read 
+            INSTALL_Windows_Short.txt for details.
+
+          - On Windows, h5repack,h5diff,h5ls and h5import tool tests have been added.
+          KY - 2004/9/16
+  
+
+    Library:
+    --------
+        - Modified the way how HDF5 calculates 'pixels_per_scanline' parameter for
+          SZIP compression. Now there is no restriction on the size and shape of the 
+          chunk except that the total number of elements in the chunk cannot be 
+          bigger than 'pixels_per_block' parameter provided by the user.
+                                                                    EIP - 2004/07/21 
+        - HDF5 can now link to SZIP with or without szip's encoder.
+          The new API function H5Zget_filter_info can be used to check
+          szip's status.  Attempting to assign szip to a dataset property
+          list or attempting to write with szip will generate an error if
+          szip's encoder is disabled.  JL/NF - 2004/6/30
+        - SZIP always uses K13 compression.  This flag no longer needs to
+          be set when calling H5Pset_szip.  If the flag for CHIP
+          compression is set, it will be ignored (since the two are mutually
+          exclusive).  JL/NF - 2004/6/30
+        - A new API function H5Fget_name was added.  It returns the name
+          of the file by object(file, group, data set, named data type,
+          attribute) ID.  SLU - 2004/06/29
+        - A new API function H5Fget_filesize was added.  It returns the
+          actual file size of the opened file.  SLU - 2004/06/24
+	- Added option that if $HDF5_DISABLE_VERSION_CHECK is set to 2,
+	  will suppress all library version mismatch warning messages.
+	  AKC - 2004/4/14
+
+    Parallel Library:
+    -----------------
+
+    Tools:
+    ------
+        - h5repack was added to the tools suite. h5repack regenerates an HDF5 file 
+	  from another HDF5 file, optionally applying HDF5 filters (compression) 
+	  and/or chunking to the copied file. The filters options are read from 
+	  the command line. See /doc/html/Tools.html for more details.
+	  PVN - 2004/9/13
+
+        - h5dump includes new features:
+           1) Printing of dataset filters, storage layout and fill value information.
+           2) Print a list of the file contents.
+	   3) Escape non printing characters.
+	   4) Print the content of the boot block.
+	   5) Print array indices with the data (the default).
+	  These options are all switch controlled. See /doc/html/Tools.html for more details.
+	  PVN - 2004/9/13
+	      
+
+    F90 API:
+    --------
+        - added new subroutines:
+                h5fget_filesize_f
+                h5iget_file_id_f
+                h5premove_filter_f
+                h5zget_filter_info_f
+                                         EIP 2004/9/21
+ 
+        - added new h5fget_name_f and h5fget_filesize_f subroutines
+                                         EIP 2004/07/08
+
+    C++ API:
+    --------
+	- Added wrappers for array and variable length datatypes APIs
+	- Added wrappers for newly added APIs from H5T, H5F, and H5I
+	- Added many wrappers that were missing from the H5P API
+	- Added the ability to reference HDF5 objects to these classes:
+	  DataSet, DataType, Group, and H5File (wrappers for H5R APIs)
+	BMR 2004/08/04
+
+
+Support for new platforms, languages and compilers.
+=======================================
+        - Added PGI Fortran support for Linux64 (x86_64) systems
+                            EIP - 2004/08/19
+        - Absoft compiler f95 v9.0 is supported on Linux 2.4 32bit
+                            EIP - 2004/07/29 
+        - HDF5 Fortran APIs are supported on Mac OSX with IBM XL Fortran
+          compiler version 8.1. This is a default compiler.
+        - HDF5 Fortran APIs are supported on MAC OSX with Absoft F95 compiler
+          version 8.2; set F9X environment variable to f95, for example
+          setenv F9X f95
+          Use --disable-shared --enable-static configure flags when Absoft
+          compiler is used.
+                             EIP - 2004/07/27
+
+Bug Fixes since HDF5-1.6.2 release
+==================================
+
+    Library
+    -------
+	- Fixed parallel bug in which some processes attempted collective
+	  I/O while others did independent I/O.  Bug appeared when some
+	  processes used point selections, and others didn't.  JRM - 2004/9/15
+        - Corrected error where dataset region references were written in an
+          incorrect way on Cray machines.  PVN & QAK - 2004/09/13
+        - The H5Tget_native_type now determines the native type for integers
+          based on the precision. This is to avoid cases of wrongly converting        
+          an int to a short in machines that have a short of 8 bytes but with
+	  32bit precision (e.g Cray SV1). PVN - 2004/09/07 
+        - Changed H5Dread() to not overwrite data in an application's buffer
+          with garbage when accessing a chunked dataset with an undefined fill
+          value and an unwritten chunk is uncountered.  QAK - 2004/08/25
+        - Fixed error which could cause a core dump when a type conversion
+          routine was registered after a compound datatype had been
+          converted and then an equivalent compound datatype was converted
+          again.  QAK - 2004/08/07
+        - Fixed memory overwrite when encoding "multi" file driver information
+          for file's superblock.  QAK - 2004/08/05
+        - Fixed obscure bug where a filter which failed during chunk allocation
+          could allow library to write uncompressed data to disk but think
+          the data was compressed.  QAK - 2004/07/29
+        - Fixed bug where I/O to an extendible chunked dataset with zero-sized
+          dimensions would cause library to fail an assertion.
+          QAK - 2004/07/27
+        - Fixed bug where chunked datasets which have filters defined,
+          allocation time set to "late" and whose chunks don't align with
+          the dataspace bounds could have incorrect data stored when
+          overwriting the entire dataset on the first write.  QAK - 2004/07/27
+        - Added check to ensure that dataspaces have extents set. JML-2004/07/26
+        - Fixed bug on some Solaris systems where HDF5 would try to use
+          gettimeofday() when that function didn't work properly.
+          JML - 2004/07/23
+        - Fixed bug in H5Sset_extent_simple where setting maximum size to
+          non-zero, then to zero would cause an error.  JML - 2004/07/20
+        - Allow NULL pointer for buffer parameter to H5Dread & H5Dwrite
+          when not writing data ("none" selection or hyperslab or point
+          selection with no elements defined).  QAK - 2004/07/20
+        - Calling H5Gcreate() on "/" or "." throws an error instead of
+          failing quietly. JML - 2004/07/19
+        - Fixed bug where setting file address size to be very small could
+          trigger an assert if the file grew to more than 64 KB.  Now throws
+          an error and data can be recovered. JL/NF - 2004/07/14
+        - Fixed bug where "resurrecting" a dataset was failing.
+          QAK - 2004/07/14
+        - Fixed bug where incorrect data could be read from a chunked dataset
+          after it was extended.  QAK - 2004/07/12
+        - After compound datatype with variable-length string in the fields
+          is committed to file, the size is messed up when it's read back.
+          Fixed.  SLU - 2004/06/11
+        - Fixed potential file corruption bug when a block of metadata could
+          overlap the end of the internal metadata accumulator buffer and
+          the buffer would be extended correctly, but would incorrectly 
+          change it's starting address.  QAK - 2004/06/09
+        - Opaque datatype with no tag failed for some operations.  Fixed.
+          SLU - 2004/6/3
+        - Fixed potential file corruption bug where dimensions that were
+          too large (a value greater than could be represented in 32-bits)
+          could cause the incorrect amount of space to be allocated in a
+          file for the raw data for the dataset.  QAK - 2004/06/01
+	- Fixed dtypes "sw long double -> double" failure in QSC class
+	  machines.  AKC - 2004/4/16
+
+    Configuration
+    -------------
+        - Fixed the long compile time of H5detect.c when v7.x Intel Compiler
+	  is used with optimization NOT off.  AKC - 2004/05/20
+
+    Performance
+    -------------
+
+    Tools
+    -----
+        - On SGI h5dump displayed only part of the data due to the bug
+          in the system printf; fixed.
+                                             EIP - 2004/09/21 
+    Documentation 
+    ------------- 
+        - Several descriptive errors have been fixed throughout the 
+          documentation, particularly in the reference manual (RM).
+          A selection particularly worthy of note would be these: 
+        - The H5Pset_szip description in the RM has been expanded and
+          corrected to facilitate use of SZIP compression.
+        - A note has been added to the H5Dcreate description that an
+          unexplained failure is likely to be due to a property list error 
+          that is detected only at the time of dataset creation.
+        -
+        FMB - 2004/09/21
+
+    F90 API
+    -------
+    
+    Fortran functions h5dwrite/read_f and h5awrite/read_f do not
+    accept dims parameter of INTEGER type anymore. Code was removed.
+                                                    2004/04/15
+    C++ API
+    -------
+	- H5::Exception's and its subclasses' constructors that were 
+	  overloaded to take char pointers are removed and constructors
+	  that passed in reference of 'string' are changed to pass 
+	  by value.  In addition, the default value of the data member
+	  H5::Exception::detailMessage is changed from 0/NULL to 
+	  DEFAULT_MSG ("No detailed information provided".)
+	- Prototype for DSetCreatPropList::setLayout is changed: 1st parameter
+          is removed because it was there only by mistake.
+	BMR 2004/08/04
+
+Documentation
+=============
+    HDF5 Library documentation
+    --------------------------
+        - HDF5 C++ API Reference Manual
+          This document has been added to the HDF5 document set.  
+          The predecessor document, "HDF5 C++ Interfaces," has been removed.
+        - HDF5 C++ API Design Specification
+          A first draft of this document has been added to the HDF5 document 
+          set.  The draft has been posted on the HDF5 website and a link 
+          has been added to the HDF5 documents index (index.html at the top 
+          level of the document set).
+        - Parallel HDF5
+          In prior releases, the HDF5 document set included two parallel
+          HDF5 documents.  Those documents have been deleted and the 
+          HDF5 documents index (index.html) now links to a "Parallel HDF5" 
+          page on the HDF5 website (http://hdf.ncsa.uiuc.edu/HDF5/PHDF5/).
+        - HDF5 High Level APIs
+          Links to the HDF5 High Level APIs and to the HDF5 High Level 
+          Reference Manual have been added to the HDF5 documents index
+          (index.html).
+        - HDF5 Reference Manual
+          Tools: h5repack -- A description of the new h5repack tool has been 
+              added to the Tools page.
+          Tools: h5dump -- Several new options have been added to h5dump.
+          New functions -- All new functions have been added to the RM.
+          API changes -- Relevant function descriptions have been updated in
+              instances where programming interfaces have changed. 
+        FMB - 2004/09/21
+
+    Windows installation documentation
+    ----------------------------------
+        -  INSTALL_Windows.txt has been enhanced to include instructions building 
+           HDF5 with FORTRAN and C++. 
+        -  Two optional installation documents have been added. They are
+           INSTALL_Windows_Short.txt and INSTALL_Windows_From_Command_Line.txt.
+           INSTALL_Windows_Short.txt is supposed to help general users who
+           only want to build,test and install HDF5 in a quick way.
+           INSTALL_Windows_From_Command_Line.txt is supposed to help users who
+           would like to compile,test and install HDF5 in command line environment.
+        -  INSTALL_Windows_withcpp.txt and INSTALL_Windows_withF90.txt became
+           obsolete. Files are deleted from the release_docs directory.
+        KY 2004/09/16, EIP 2004/9/21
+        
+
+
+Platforms Tested
+================
+
+    AIX 5.1  (32 and 64-bit)      xlc 6.0.0.6
+                                  xlf 8.1.1.3
+    				  xlC 6.0.0.6
+				  mpcc_r 6.0.0.6
+                                  mpxlf_r 8.1.1.3
+				  xlc 5.0.2.5
+				  xlf 7.1.1.2
+				  xlC 5.0.2.5
+				  mpcc_r 5.0.2.5
+				  mpxlf_r 7.1.1.2
+    AIX 5.2                       xlc 6.0.0.8
+                                  xlC 6.0.0.8
+                                  xlf 8.1.1.6
+                                  mpcc_r 6.0.0.8
+                                  mpxlf_r 8.1.1.6
+    Cray T90 sn7001 10.0.0md      Cray Standard C Version 6.4.0.3
+                                  Cray Fortran Version 3.4.0.0
+    Cray T3E sn6606 2.0.6.08      Cray Standard C Version 6.6.0.3
+                                  Cray Fortran Version 3.6.0.3
+    Cray SV1 sn9617 10.0.1.2      Cray Standard C Version 6.6.0.3.6
+                                  Cray Fortran Version 3.6.0.3.1
+    FreeBSD 4.9                   gcc 2.95.4
+                                  g++ 2.95.4
+    HP-UX B.11.00                 HP C  HP92453-01 A.11.01.20 
+                                  HP F90 v2.4
+                                  HP ANSI C++ B3910B A.03.13
+                                  MPIch 1.2.4
+    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.3.1.3m
+                                  F90 MIPSpro 7.3.1.3m (64 only)
+                                  C++ MIPSpro cc 7.3.1.3m
+				  mpt 1.6
+    Linux 2.4.18                  gcc 2.96, 3.3.2
+                                  g++ 3.3.2
+                                  Intel(R) C++ Version 7.1
+                                  Intel(R) Fortran Compiler Version 7.1
+                                  PGI compilers (pgcc, pgf90, pgCC) version 5.0-2
+                                  MPIch 1.2.4
+                                  Absoft Fortran compiler v9.0
+    Linux 2.4.20-8                gcc 3.3.2
+                                  PGI compilers (pgcc, pgf90, pgCC) version 5.0-2
+                                  MPIch 1.2.4
+    Linux 2.4.21-2.9.5ws #3       gcc 3.2.3 (Red Hat Linux 3.2.3-16)
+          SMP x86_64              g++ 3.2.3
+    Linux 2.4.21-4.ELsmp	  Intel(R) C++ 32-bit Version 8.0
+    				  Intel(R) Fortran 32-bit Version 8.0
+				  gcc 3.4.0
+				  MPICH 1..5.2 Inmel 8.0
+    Linux 2.4.19-SMP  x86_64      gcc (GCC) 3.2.2 (SuSE Linux)
+                                  g++ 3.2.2
+    Linux 2.6.4-52smp x86_64      gcc 3.3.3 (SuSE Linux 9.1 AMD64))
+                                  PGI 5.2-1 C and F90 
+
+    Linux 2.4.21-sgi Altix 
+          SMP ia64                Intel(R) C++ Version 8.0
+                                  Intel(R) Fortran Itanium(R) Version 8.0
+                                  SGI MPI
+    OSF1 V5.1                     Compaq C V6.5-303 
+                                  HP Fortran V5.5A-3548
+				  Compaq C++ V6.5-040  
+				  MPI_64bit_R13
+    SunOS 5.7(32 and 64 bit)      WorkShop Compilers 5.0 98/12/15 C 5.0
+     (Solaris 2.7)                WorkShop Compilers 5.0 98/12/15 C++ 5.0 
+                                  WorkShop Compilers 5.0 98/10/25 
+                                  FORTRAN 90 2.0 Patch 107356-04 
+    SunOS 5.8(32 and 64 bit)      Sun WorkShop 6 update 2 C 5.3
+     (Solaris 2.8)                Sun WorkShop 6 update 2 Fortran 90
+                                  Sun WorkShop 6 update 2 C++ 5.3
+    TFLOPS r1.0.4 v4.4.3 i386     pgcc Rel 3.1-4i with mpich-1.2.4 with
+                                          local modifications
+    IA-32 Linux 2.4.18            gcc 2.96
+                                  Intel(R) C++ Version 7.0
+                                  Intel(R) Fortran Compiler Version 7.0
+
+    Xeon Linux 2.4.20-31.9smp_perfctr_lustre
+	                          Intel(R) C++ Version 8.0
+                                  Intel(R) Fortran Compiler Version 8.0
+                                  
+    IA-64 Linux 2.4.16 ia64       gcc version 3.0.4
+                                  Intel(R) C++ Version 7.1
+                                  Intel(R) Fortran Compiler Version 7.1
+
+    IA-64 Linux 2.4.21.SuSE_128.bef1 ia64
+                                  Intel(R) C++ Version 8.0
+                                  Intel(R) Fortran Compiler Version 8.0
+				  mpich-gm-1.2.5..intel
+
+    Windows 2000 (NT5.0)          MSVC++ 6.0
+                                  MSVC++ .NET
+                                  DEC Visual Fortran 6.0
+                                  Intel C and F90 compilers version 7.1
+				  Code Warrior 8.0
+    Windows XP                    MSVC++.NET
+                                  MSVC++ 6.0
+                                  DEC Visual Fortran 6.0
+
+    MAC OS X                      Darwin 7.5
+                                  gcc and g++ Apple Computer, Inc. GCC 
+                                  version 1175, based on gcc version 3.3.2
+                                  IBM XL Fortran version 8.1 
+                                  Absoft Fortran compiler v8.2
+                                  
+
+
+Supported Configuration Features Summary
+========================================
+
+Key:   y = tested and supported
+       n = not supported or not tested in this release
+       x = not working in this release
+       dna = does not apply
+       ( ) = footnote appears below second table
+
+Platform                             C        F90    F90      C++  zlib  SZIP
+                                     parallel        parallel      
+Solaris2.7 64-bit                    y (1)    y      y (1)    y    y     y
+Solaris2.7 32-bit                    y (1)    y      y (1)    y    y     y
+Solaris2.8 64-bit                    y (1)    y      y (1)    y    y     y
+Solaris2.8 32-bit                    y        y      y (1)    y    y     y
+IRIX64_6.5 64-bit                    y (2)    y      y        y    y     y
+IRIX64_6.5 32-bit                    y (2)    n      n        n    y     y
+HPUX11.00                            y (1)    y      y        y    y     y
+OSF1 v5.1                            y        y      y        y    y     y
+T90 IEEE                             n        y      n        n    y     n
+T3E                                  y (5)    y      y (5)    n    y     n
+SV1                                  y (5)    y      y (5)    n    y     n
+TFLOPS                               y (1)    n      n        n    y     n
+AIX-5.1 & 5.2 32-bit                 y        y      y        y    y     y
+AIX-5.1 & 5.2 64-bit                 y        y      y        y    y     y
+WinXP Visual Studio 6.0              n        y (9)  n        y    y     y
+WinXP .Net                           n        n      n        y    y     y
+WinXP Code Warrior                   n        n      n        n    y     y
+Win2000 Visual Studio 6.0            n        y (10) n        y    y     y
+Win2000 Visual Studio Intel (6)      n        y      n        y    y     y
+Win2000 .Net                         n        n      n        y    y     y
+Mac OS X 10.3                        n        y (11) n        y    y     y
+FreeBSD 4.9                          y (1)    n      n        y    y     y
+RedHat 7   W        (3)              y (1)    y (12) n        y    y     y
+RedHat 7.3  W Intel (3)              n        y      n        y    y     y
+RedHat 7.3  W PGI   (3)              n        y      n        y    y     y
+RedHat 8 & SuSe x86_64 gcc     (3)   n        y (13) n        y    y     y
+Linux 2.4 Xeon C Lustre Intel (3,7)  n        y      n        y    y     y
+Linux 2.4 SuSE ia64 C   Intel (3,8)  y        y      y        y    y     y
+Linux 2.4 SGI Altix ia64 Intel (3)   y        y      y        y    y     y
+
+
+Platform                             Shared         static-  Thread-  STREAM- 
+                                     libraries (4)  exec     safe     VFD    
+Solaris2.7 64-bit                    y              x        y        y
+Solaris2.7 32-bit                    y              x        y        y
+Solaris2.8 64-bit                    y              x        y        y
+Solaris2.8 32-bit                    y              x        y        y
+IRIX64_6.5 64-bit                    y              y        y        y
+IRIX64_6.5 32-bit                    y              y        y        y
+HPUX11.00                            y              x        n        y
+OSF1 v5.1                            y              y        n        y
+T90 IEEE                             n              y        n        y
+T3E                                  n              y        n        y
+SV1                                  n              y        n        y
+TFLOPS                               n              y        n        n
+AIX-5.1 & 5.2 32-bit                 n              y        n        y
+AIX-5.1 & 5.2 64-bit                 n              y        n        y
+WinXP Visual Studio 6.0              y              y        n        n
+WinXP .Net                           y              y        n        n
+WinXP Code Warrior                   n              y        n        n
+Win2000 Visual Studio 6.0            y              y        n        n
+Win2000 Visual Studio Intel (6)      y              y        n        n
+Win2000 .Net                         y              y        n        n
+Mac OS X 10.3                        y              y        n        y
+FreeBSD 4.9                          y              y        y        y
+RedHat 7    W       (3)              y              y        y        y
+RedHat 7.3  W Intel (3)              n              y        n        y
+RedHat 7.3  W PGI   (3)              n              y        n        y
+RedHat 8 & SuSe x86_64 gcc     (3)   n              y        n        y
+Linux 2.4 Xeon C Lustre Intel (3,7)  y              y        n        y
+Linux 2.4 SuSE ia64 C Intel   (3,8)  y              y        n        n
+Linux 2.4 SGI Altix ia64 Intel (3)   y              y        n        y
+
+
+
+Compiler versions for each platform are listed in the "Platforms Tested" 
+table found elsewhere in this file (RELEASE.txt).  Unless otherwise noted, 
+compilers used are the system compilers.
+
+Footnotes:  (1) Using mpich 1.2.4
+            (2) Using mpt and mpich 1.2.4
+            (3) Linux 2.4 with GNU, Intel, and PGI compilers, as indicated  
+                W or C indicates workstation or cluster, respectively
+            (4) Shared libraries are provided only for the C library, 
+                except on Windows where they are provided for C and C++
+            (5) Using mpt
+            (6) Intel 7.1 compilers in Visual Studio 6.0 environment
+            (7) Linux 2.4.20-31.9.  Xeon cluster with smp_perfctr_lustre 
+                and Intel compilers
+            (8) Linux 2.4.21, SuSE_128.befl.  Ia64 cluster with Intel compilers
+            (9) DEC Visual Fortran 6.0 and Intel 7.1
+            (10) DEC Visual Fortran 6.0
+            (11) IBM XLF and Absoft
+            (12) PGI, Absoft
+            (13) PGI
+       FMB/EIP - 2004/09/21
+
+
+
+Known Problems
+==============
+* h5fc and h5c++ compilation scripts have a bug: object files (*.o) cannot be
+  created when source code is compiled using h5fc or h5c++. We will provide
+  a fix. Please check ftp://ftp.ncsa.uiuc.edu/HDF/HDF5/current/src/patches/ 
+  for the patches.
+
+* Fortran subroutine h5pget_driver_f doesn't return a correct driver information.
+
+* There are two h5dump xml tests(h5dump --xml thlink.h5 and h5dump --xml tmany.h5)
+  failed on windows xp with .NET for debug and debug dll. Release and Release
+  dll work fine. 
+
+* The h5dump tests may fail to match the expected output on some platforms
+  (e.g. parallel jobs, Windows) where the error messages directed to
+  "stderr" do not appear in the "right order" with output from stdout.
+  This is not an error.
+
+* The stream-vfd test uses ip port 10007 for testing. If another
+  application is already using that port address, the test will hang
+  indefinitely and has to be terminated by the kill command. To try the
+  test again, change the port address in test/stream_test.c to one not
+  being used in the host.
+
+* The --enable-static-exec configure flag fails to compile for Solaris
+  platforms. This is due to the fact that not all of the system
+  libraries on Solaris are available in a static format.
+
+  The --enable-static-exec configure flag also fails to correctly compile
+  on IBM SP2 platform for the serial mode. The parallel mode works fine
+  with this option.
+  
+  It is suggested that you don't use this option on these platforms
+  during configuration.
+
+* The Stream VFD was not tested yet under Windows. It is not supported
+  in the TFLOPS machine.
+
+* The ./dsets tests failed in the TFLOPS machine if the test program,
+  dsets.c, is compiled with the -O option.  The hdf5 library still works
+  correctly with the -O option.  The test program works fine if it is
+  compiled with -O1 or -O0.  Only -O (same as -O2) causes the test
+  program to fail.
+
+* Certain platforms give false negatives when testing h5ls:
+    - Cray J90 and Cray T90IEEE give errors during testing when displaying
+      some floating-point values. These are benign differences due to
+      the different precision in the values displayed and h5ls appears to
+      be dumping floating-point numbers correctly.
+
+* Before building HDF5 F90 Library from source on Crays 
+  replace H5Aff.f90, H5Dff.f90 and H5Pff.f90 files in the fortran/src
+  subdirectory in the top level directory with the Cray-specific files
+  from the site:
+  ftp://ftp.ncsa.uiuc.edu/HDF/HDF5/current/src/patches/
+
+* On some platforms that use Intel and Absoft compilers to build HDF5 fortran library,
+  compilation may fail for fortranlib_test.f90, fflush1.f90 and fflush2.f90
+  complaining about exit subroutine. Comment out the line 
+  IF (total_error .ne. 0) CALL exit (total_error)
+
+* On IA32 and IA64 systems, if you use a compiler other than GCC (such as
+  Intel's ecc or icc compilers), you will need to modify the generated
+  "libtool" program after configuration is finished. On or around line 104 of
+  the libtool file, there are lines which look like:
+
+      # How to pass a linker flag through the compiler.
+      wl=""
+
+  change these lines to this:
+
+      # How to pass a linker flag through the compiler.
+      wl="-Wl,"
+
+  UPDATE: This is now done automatically by the configure script. However, if
+  you still experience a problem, you may want to check this line in the
+  libtool file and make sure that it has the correct value.
+
+* Information about building with PGI and Intel compilers is available in
+  INSTALL file sections 5.7 and 5.8
+
+* In LANL QSC, the new cc compiler has problems converting small values of
+  long long (absolute values less than 1**-308) to double.  This triggers
+  the test/dtypes to report failure in the
+      Testing random sw long double -> double conversions
+  If -ieee is used, the converted doubles spread over the range 0.0 to 1**-308.
+  If -ieee is not used, the converted double values are mostly 0.0 but
+  occasionally as 1**-308.  This has been reported to the system staff.
+  All other tests have passed.
+
+* On at least one system, (SDSC DataStar), the scheduler (in this case
+  LoadLeveler) sends job status updates to standard error when you run
+  any executable that was compiled with the parallel compilers.
+
+  This causes problems when running "make check" on parallel builds, as
+  many of the tool tests function by saving the output from test runs,
+  and comparing it to an exemplar.
+
+  The best solution is to reconfigure the target system so it no longer
+  inserts the extra text.  However, this may not be practical.
+
+  In such cases, one solution is to "setenv HDF5_Make_Ignore yes" prior to
+  the configure and build.  This will cause "make check" to continue after
+  detecting errors in the tool tests.  However, in the case of SDSC DataStar,
+  it also leaves you with some 150 "failed" tests to examine by hand.
+
+  A second solution is to write a script to run serial tests and filter
+  out the text added by the scheduler.  A sample script used on SDSC
+  DataStar is given below, but you will probably have to customize it
+  for your installation.
+
+  Observe that the basic idea is to insert the script as the first item
+  on the command line which executes the test.  The script then
+  executes the test and filters out the offending text before passing
+  it on.
+
+        #!/bin/csh
+
+        set STDOUT_FILE=~/bin/serial_filter.stdout
+        set STDERR_FILE=~/bin/serial_filter.stderr
+
+        rm -f $STDOUT_FILE $STDERR_FILE
+
+        ($* > $STDOUT_FILE) >& $STDERR_FILE
+
+        set RETURN_VALUE=$status
+
+        cat $STDOUT_FILE
+
+        tail +3 $STDERR_FILE
+
+        exit $RETURN_VALUE
+
+  You get the HDF make files and test scripts to execute your filter script
+  by setting the environment variable "RUNSERIAL" to the full path of the
+  script prior to running configure for parallel builds.  Remember to
+  "unsetenv RUNSERIAL" before running configure for a serial build.
+
+  Note that the RUNSERIAL environment variable exists so that we can
+  can prefix serial runs as necessary on the target system.  On DataStar,
+  no prefix is necessary.  However on an MPICH system, the prefix might
+  have to be set to something like "/usr/local/mpi/bin/mpirun -np 1" to
+  get the serial tests to run at all.
+
+  In such cases, you will have to include the regular prefix in your
+  filter script.
+
+%%%%1.6.2%%%%   Release Information for hdf5-1.6.2 (12/February/04)
+
+HDF5 version 1.6.2 released on Thu Feb 12 14:18:13 CST 2004
+================================================================================
+
+
+INTRODUCTION
+
+This document describes the differences between HDF5-1.6.1 and
+HDF5-1.6.2, and contains information on the platforms tested and
+known problems in HDF5-1.6.2. For more details check the HISTORY.txt
+file in the HDF5 source.
+
+The HDF5 documentation can be found on the NCSA ftp server
+(ftp.ncsa.uiuc.edu) in the directory:
+
+     /HDF/HDF5/docs/
+
+For more information look at the HDF5 home page at:
+   
+    http://hdf.ncsa.uiuc.edu/HDF5/
+
+If you have any questions or comments, please send them to:
+
+    hdfhelp at ncsa.uiuc.edu
+
+CONTENTS
+
+- New Features
+- Support for new platforms and languages
+- Bug Fixes since HDF5-1.6.1
+- Documentation
+- Platforms Tested
+- Supported Configuration Features Summary
+- Known Problems
+
+
+New Features
+============
+
+    Configuration:
+    --------------
+        - Default of $prefix is changed to $PWD/hdf5 so that multiple
+	  builds using --srcdir is possible in the same machine.
+	  AKC - 2003/12/1
+
+    Library:
+    --------
+        - Added H5Iget_ref, H5Iinc_ref and H5Idec_ref routines to the C
+          library and the FORTRAN wrapper.  See the reference manual for a
+          full description of these new routines.  QAK - 2003/12/11
+
+    Parallel Library:
+    -----------------
+	- The parallel tests in testpar/ now provides different levels of
+	  verbosity via the '-v' option.  The default is less verbose
+	  than before.  AKC - 2004/01/23
+        - Added parallel test, test_mpio_1wMr, which tests if the
+          underlaying parallel I/O system is conforming to the POSIX
+          write/read requirement. This version includes options of using
+          atomicity and file-sync.  AKC - 2003/11/27
+
+    Tools:
+    ------
+        - Added option -showconfig to compiler tools (h5cc,h5fc,h5c++).
+	  AKC - 2004/01/08
+	- Install the "h5cc" and "h5fc" tools as "h5pcc" and "h5pfc"
+	  respectively if library is built in parallel mode.  AKC - 2004/01/07
+        - Added metadata benchmark (perform/perf_meta).  SLU - 2003/10/03
+
+    C++ API:
+    --------
+
+
+Support for new platforms, languages and compilers.
+=======================================
+        - HDF5 Fortran APIs are supported on MAC OSX with IBM XL Fortran compiler
+          version 8.1 Beta  
+          Use --disbale-shared --enable-static flags with configure when 
+          building HDF5 Fortran Library on MAC OSX.
+        - C and C++ Libraries are available for Linux64 RH8
+        - C, C++ and Fortran sequential Libraries, and C and Fortran parallel
+          Libraries are available for Altix (Linux ia64)
+
+Bug Fixes since HDF5-1.6.1 release
+==================================
+
+    Library
+    -------
+        - Fixed problem with H5Tget_native_type() not handling opaque fields
+            correctly.  QAK - 2004/01/31
+        - Fixed several errors in B-tree deletion code which could cause a
+            B-tree (used with groups and chunked datasets) to become corrupt
+            with the right sequence of deleted objects.  QAK - 2004/01/19
+        - Fixed small internal memory leaks of fill-value information.
+            QAK - 2004/01/13
+        - Fixed bug that caused variable-length datatypes (strings or sequences)
+            used for datasets in files with objects that were unlinked to
+            fail to be read/written to a file.  QAK - 2004/01/13
+        - Detect situation where szip 'pixels per block' is larger than the
+            fastest changing dimension of a dataset's chunk size and disallow
+            this (due to limits in szip library).  QAK - 2003/12/31
+        - Fixed bug with flattened hyperslab selections that would generate
+            incorrect hyperslab information with certain high-dimensionality
+            combinations of start/stride/count/block information.
+            QAK - 2003/12/31
+        - Fixed bug with variable-length datatypes used in compound datatypes.
+            SLU - 2003/12/29
+        - Fixed bug in parallel I/O routines that would cause reads from
+            "short datasets" (datasets which were only partially written out)
+            to return invalid data.  QAK & AKC - 2003/12/19
+        - Fixed bug where scalar dataspaces for attributes were reporting as
+            simple dataspaces.  QAK - 2003/12/13
+        - Fixed problem with selection offsets of hyperslab selections in
+            chunked datasets causing the library to go into an infinite loop.
+            QAK - 2003/12/13
+        - Fixed H5Giterate to avoid re-using index parameter after iteration
+            callback has been called (allows iteration callback to modify the
+            index parameter itself).  QAK - 2003/12/06
+        - Fixed various floating-point conversion problems, including a
+            change which could corrupt data when converting from double->float.
+            QAK - 2003/11/24
+        - Changed "single process" metadata writing in library to collective
+            I/O by all processes, in order to guarantee correct data being
+            written with MPI-I/O.  QAK - 2003/11/20
+        - Fixed problems with fill values and variable-length types and also
+            I/O on VL values that were set to NULL.  QAK - 2003/11/08
+        - Fixed problems with MPI datatypes that caused ASCI Q machine to
+            hang.  QAK - 2003/10/28
+        - Removed HDF5_MPI_PREFER_DERIVED_TYPES environment variable support,
+            since it had no benefit.  QAK - 2003/10/28
+        - Single hyperslab selections (which were set with only one call to
+            H5Sselect_hyperslab) that had dimensions that could be "flattened"
+            but were interspersed with dimensions that could not be flattened
+            were not correctly handled, causing core dumps.  QAK - 2003/10/25
+        - Avoid metadata cache from preempting current dataset object header
+            when looking up information about the named datatype that the
+            dataset uses.  QAK - 2003/10/20
+
+    Configuration
+    -------------
+        - Parallel I/O with the MPI-I/O driver will no longer work if the
+            filesystem is not POSIX compliant.  The "HDF5_MPI_1_METAWRITE"
+            environment variable has been removed.  QAK - 2004/01/30
+
+    Performance
+    -------------
+        - More optimizations to inner loops of datatype conversions for
+            integers and floats which give a 10-50% speedup.  QAK - 2003/11/07
+        - Hoisted invariant 'if/else's out of inner datatype conversion loop for
+            integer and floating-point values, giving about a 20% speedup.
+            QAK - 2003/10/20
+
+    Tools
+    -----
+	- Fixed h5redeploy which sometimes complain too many argument for the
+	  test command. (The complain did not hinder the h5redploy to proceed
+	  correctly.) AKC - 2003/11/03
+
+    Documentation 
+    ------------- 
+
+
+Documentation
+=============
+
+
+
+Platforms Tested
+================
+
+    AIX 5.1  (32 and 64-bit)      xlc 6.0.0.2
+                                  xlf 8.1.0.3
+    				  xlC 6.0.0.4
+				  xlc 5.0.2.5
+				  xlf 7.1.1.2
+				  xlC 5.0.2.5
+				  mpcc_r 5.0.2.5
+				  mpxlf_r 7.1.1.2
+                                  poe 3.2.0.10
+    Cray T3E sn6606 2.0.6.08      Cray Standard C Version 6.6.0.2
+                                  Cray Fortran Version 3.6.0.2
+    Cray SV1 sn9617 10.0.1.2      Cray Standard C Version 6.6.0.2
+                                  Cray Fortran Version 3.6.0.2
+    Cray T90IEEE 10.0.0md         Cray Standard C Version 6.4.0.3
+                                  Cray Fortran Version 3.4.0.0
+    FreeBSD 4.9                   gcc 2.95.4
+                                  g++ 2.95.4
+    HP-UX B.11.00                 HP C  HP92453-01 A.11.01.20 
+                                  HP F90 v2.4
+                                  HP ANSI C++ B3910B A.03.13
+                                  MPIch 1.2.4
+    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.3.1.3m
+                                  F90 MIPSpro 7.3.1.3m (64 only)
+                                  C++ MIPSpro cc 7.3.1.3m
+    Linux 2.4.18                  gcc 2.96, 3.3.2
+                                  g++ 3.3.2
+                                  Intel(R) C++ Version 7.1
+                                  Intel(R) Fortran Compiler Version 7.1
+                                  PGI compilers (pgcc, pgf90, pgCC) version 5.0-2
+                                  MPIch 1.2.4
+    Linux 2.4.20-8                gcc 3.3.2
+                                  PGI compilers (pgcc, pgf90, pgCC) version 5.0-2
+                                  MPIch 1.2.4
+    Linux 2.4.21-2.9.5ws #3       gcc 3.2.3 (Red Hat Linux 3.2.3-16)
+          SMP x86_64              g++ 3.2.3
+    Linux 2.4.19-SMP  x86_64      gcc (GCC) 3.2.2 (SuSE Linux)
+                                  g++ 3.2.2
+
+    Linux 2.4.21-sgi Altix 
+          SMP ia64                Intel(R) C++ Version 7.1
+                                  Intel(R) Fortran Itanium(R) Version 7.1
+                                  SGI MPI
+    OSF1 V5.1                     Compaq C V6.4-014
+				  Compaq Fortran V5.5-2602
+				  Compaq Fortran V5.5-1877
+				  Compaq C++ V6.5-033
+				  Compaq C++ V6.5-030
+				  MPI_64bit_R13
+    SunOS 5.7(32 and 64 bit)      WorkShop Compilers 5.0 98/12/15 C 5.0
+     (Solaris 2.7)                WorkShop Compilers 5.0 98/12/15 C++ 5.0 
+                                  WorkShop Compilers 5.0 98/10/25 
+                                  FORTRAN 90 2.0 Patch 107356-04 
+    SunOS 5.8(32 and 64 bit)      Sun WorkShop 6 update 2 C 5.3
+     (Solaris 2.8)                Sun WorkShop 6 update 2 Fortran 90
+                                  Sun WorkShop 6 update 2 C++ 5.3
+    TFLOPS r1.0.4 v4.4.2 i386     pgcc Rel 3.1-4i with mpich-1.2.4 with
+                                          local modifications
+    IA-32 Linux 2.4.18            gcc 2.96
+                                  Intel(R) C++ Version 7.0
+                                  Intel(R) Fortran Compiler Version 7.0
+                                  
+    IA-64 Linux 2.4.16 ia64       gcc version 3.0.4
+                                  Intel(R) C++ Version 7.1
+                                  Intel(R) Fortran Compiler Version 7.1
+
+    IA-64 Linux 2.4.21.SuSE_128.bef1 ia64
+                                  Intel(R) C++ Version 7.1
+                                  Intel(R) Fortran Compiler Version 7.1
+				  mpich-gm-1.2.5..intel
+
+    Windows 2000 (NT5.0)          MSVC++ 6.0
+                                  DEC Visual Fortran 6.0
+                                  Intel C and F90 compilers version 7.1
+				  Code Warrior 8.0
+    Windows XP                    MSVC++.NET
+    MAC OS X                      Darwin 7.2
+                                  gcc and g++ Apple Computer, Inc. GCC 
+                                  version 1175, based on gcc version 3.3.2
+                                  IBM XL Fortran version 8.1 Beta
+                                  
+
+
+Supported Configuration Features Summary
+========================================
+
+Key:   y = tested and supported
+       n = not supported or not tested in this release
+       x = not working in this release
+       dna = does not apply
+       ( ) = footnote appears below second table
+
+Platform                    C   C        F90    F90      C++  Shared        zlib
+                                parallel        parallel      libraries (4)
+Solaris2.7 64-bit           y   y (1)    y      y (1)    y    y             y
+Solaris2.7 32-bit           y   y (1)    y      y (1)    y    y             y
+Solaris2.8 64-bit           y   y (1)    y      y (1)    y    y             y
+Solaris2.8 32-bit           y   y        y      y (1)    y    y             y
+IRIX64_6.5 64-bit           y   y (2)    y      y        y    y             y
+IRIX64_6.5 32-bit           y   y (2)    n      n        n    y             y
+HPUX11.00                   y   y (1)    y      y        y    y             y
+OSF1 v5.1                   y   y        y      y        y    y             y
+T3E                         y   y (5)    y      y (5)    n    n             y
+SV1                         y   y (5)    y      y (5)    n    n             y
+T90 IEEE                    y   y (5)    y      y (5)    n    n             y
+TFLOPS                      n   y (1)    n      n        n    n             y
+AIX-5.1 32-bit              y   y        y      y        y    n             y
+AIX-5.1 64-bit              y   y        y      y        y    n             y
+WinXP Visual Studio (7)     y   n        n      n        y    y             y
+WinXP Intel                 y   n        n      n        y    y             y
+WinXP CW                    y   n        n      n        n    n             y
+Win2000 Visual Studio       y   n        y      n        y    y             y
+Win2000 Intel               y   n        y      n        y    y             y
+Mac OS X 10.3               y   n        y      n        y    y             y
+FreeBSD 4.9                 y   y (1)    n      n        y    y             y
+RedHat 7, 8 & 9 ia32        y   y (1)    y(PGI) n        y    y             y
+    W gcc (3)
+RedHat 7.3 ia32 W Intel (3) y   n        y      n        y    n             y
+RedHat 7.3 ia32 W PGI (3)   y   n        y      n        y    n             y
+RedHat 7 ia32 C Intel (3)   y   n        y      n        y    n             y
+RedHat 7.1 ia64 C Intel (3) y   n        y      n        y    n             y
+RedHat 8 & SuSe x86_64      y   n        n      n        y    n             y
+    gcc (3)
+Linux 2.4 SGI Altix ia64    y   n        y      n        y    y             y
+    Intel (3) 
+
+
+Platform                    static-  Thread-  SZIP  GASS  STREAM-  High-  H4/H5 
+                            exec     safe                 VFD      level  tools
+                                                                   APIs   (6)
+Solaris2.7 64-bit           x        y        y     n     y        y      n
+Solaris2.7 32-bit           x        y        y     n     y        y      y
+Solaris2.8 64-bit           x        y        y     n     y        y      n
+Solaris2.8 32-bit           x        y        y     n     y        y      y
+IRIX64_6.5 64-bit           x        y        y     y     y        y      y
+IRIX64_6.5 32-bit           x        y        y     y     y        y      y
+HPUX11.00                   x        n        y     n     y        y      y
+OSF1 v5.1                   y        n        y     n     y        y      y
+T3E                         y        n        n     n     y        y      y
+SV1                         y        n        n     n     y        y      y
+T90 IEEE                    y        n        n     n     y        y      n
+TFLOPS                      y        n        n     n     n        n      n
+AIX-5.1 32-bit              y        n        y     n     y        y      y
+AIX-5.1 64-bit              y        n        y     n     y        y      y
+WinXP Visual Studio         y        n        y     n     n        y      y
+WinXP Intel                 y        n        y     n     n        y      y
+WinXP CW                    y        n        y     n     n        y      y
+Win2000 Visual Studio       y        n        y     n     n        y      y
+Win2000 Intel               y        n        y     n     n        y      y
+Mac OS X 10.3               y        n        y     n     y        y      n
+FreeBSD 4.9                 y        y        y     n     y        y      y
+RedHat 7, 8 & 9 ia32        y        y        y     n     y        y      y
+    W gcc (3)
+RedHat 7.3 ia32 W Intel (3) y        n        y     n     y        n      n
+RedHat 7.3 ia32 W PGI (3)   y        n        y     n     y        n      n
+RedHat 7 ia32 C Intel (3)   y        n        y     n     y        y      y
+RedHat 7.1 ia64 C Intel (3) y        n        y     n     y        y      y
+RedHat 8 & SuSe x86_64      y        n        y     n     y        y      y
+    gcc (3)
+Linux 2.4 SGI Altix ia64    y        n        y     n     y        y      y
+    Intel (3) 
+
+
+Compiler versions for each platform are listed in the "Platforms Tested" 
+table found elsewhere in this file (RELEASE.txt).  Unless otherwise noted, 
+compilers used are the system compilers.
+
+Footnotes:  (1) Using mpich 1.2.4.
+            (2) Using mpt and mpich 1.2.4.
+            (3) Linux 2.4 with GNU, Intel, and PGI compilers, as indicated.  
+                W or C indicates workstation or cluster, respectively.
+            (4) Shared libraries are provided only for the C library, 
+                except on Windows where they are provided for C and C++.
+            (5) Using mpt.
+            (6) Includes the H4toH5 Library and the h4toh5 and h5toh4 
+                utilities.
+
+
+Known Problems
+==============
+* Fortran subroutine h5pget_driver_f doesn't return a correct driver information.
+
+* There are two h5dump xml tests(h5dump --xml thlink.h5 and h5dump --xml tmany.h5)
+  failed on windows xp with .NET for debug and debug dll. Release and Release
+  dll work fine. 
+
+* The h5dump tests may fail to match the expected output on some platforms
+  (e.g. parallel jobs, Windows) where the error messages directed to
+  "stderr" do not appear in the "right order" with output from stdout.
+  This is not an error.
+
+* The stream-vfd test uses ip port 10007 for testing. If another
+  application is already using that port address, the test will hang
+  indefinitely and has to be terminated by the kill command. To try the
+  test again, change the port address in test/stream_test.c to one not
+  being used in the host.
+
+* The --enable-static-exec configure flag fails to compile for Solaris
+  platforms. This is due to the fact that not all of the system
+  libraries on Solaris are available in a static format.
+
+  The --enable-static-exec configure flag also fails to correctly compile
+  on IBM SP2 platform for the serial mode. The parallel mode works fine
+  with this option.
+  
+  It is suggested that you don't use this option on these platforms
+  during configuration.
+
+* The Stream VFD was not tested yet under Windows. It is not supported
+  in the TFLOPS machine.
+
+
+* The ./dsets tests failed in the TFLOPS machine if the test program,
+  dsets.c, is compiled with the -O option.  The hdf5 library still works
+  correctly with the -O option.  The test program works fine if it is
+  compiled with -O1 or -O0.  Only -O (same as -O2) causes the test
+  program to fail.
+
+* Certain platforms give false negatives when testing h5ls:
+    - Cray J90 and Cray T90IEEE give errors during testing when displaying
+      some floating-point values. These are benign differences due to
+      the different precision in the values displayed and h5ls appears to
+      be dumping floating-point numbers correctly.
+
+* Before building HDF5 F90 Library from source on Crays 
+  replace H5Aff.f90, H5Dff.f90 and H5Pff.f90 files in the fortran/src
+  subdirectory in the top level directory with the Cray-specific files
+  from the site:
+  ftp://hdf.ncsa.uiuc.edu/pub/outgoing/hdf5/hdf5-1.6.2/F90_source_for_Crays
+
+* On some platforms that use Intel compilers to build HDF5 fortran library,
+  compilation may fail for fortranlib_test.f90, fflush1.f90 and fflush2.f90
+  complaining about exit subroutine. Comment out the line 
+  IF (total_error .ne. 0) CALL exit (total_error)
+
+* On IA32 and IA64 systems, if you use a compiler other than GCC (such as
+  Intel's ecc or icc compilers), you will need to modify the generated
+  "libtool" program after configuration is finished. On or around line 104 of
+  the libtool file, there are lines which look like:
+
+      # How to pass a linker flag through the compiler.
+      wl=""
+
+  change these lines to this:
+
+      # How to pass a linker flag through the compiler.
+      wl="-Wl,"
+
+  UPDATE: This is now done automatically by the configure script. However, if
+  you still experience a problem, you may want to check this line in the
+  libtool file and make sure that it has the correct value.
+
+* Information about building with PGI and Intel compilers is available in
+  INSTALL file sections 5.7 and 5.8
+
+* In LANL QSC, the new cc compiler has problems converting small values of
+  long long (absolute values less than 1**-308) to double.  This triggers
+  the test/dtypes to report failure in the
+      Testing random sw long double -> double conversions
+  If -ieee is used, the converted doubles spread over the range 0.0 to 1**-308.
+  If -ieee is not used, the converted double values are mostly 0.0 but
+  occassionaly as 1**-308.  This has been reported to the system staff.
+  All other tests have passed.
+
+* On AIX 5.1 when 64-bit parallel C Library is built with zlib configured in,
+  compilation fails for H5Zdeflate.c. To bypass the problem, remove "const"
+  definition in front of H5Z_DEFLATE in H5Zpkg.h line 29.
+
+%%%%1.6.1%%%%   Release Information for hdf5-1.6.1 (16/October/03)
+
+15.  Release information for HDF5 version 1.6.1
+================================================
+
+INTRODUCTION
+
+This document describes the differences between HDF5-1.6.0 and
+HDF5-1.6.1, and contains information on the platforms tested and
+known problems in HDF5-1.6.1. For more details check the HISTORY.txt
+file in the HDF5 source.
+
+The HDF5 documentation can be found on the NCSA ftp server
+(ftp.ncsa.uiuc.edu) in the directory:
+
+     /HDF/HDF5/docs/
+
+For more information look at the HDF5 home page at:
+   
+    http://hdf.ncsa.uiuc.edu/HDF5/
+
+If you have any questions or comments, please send them to:
+
+    hdfhelp at ncsa.uiuc.edu
+
+CONTENTS
+
+- New Features
+- Support for new platforms and languages
+- Bug Fixes since HDF5-1.6.0
+- Documentation
+- Platforms Tested
+- Known Problems
+
+
+New Features
+============
+
+    Configuration:
+    --------------
+
+    Library:
+    --------
+        - Added new fields to the H5G_stat_t for more information about an
+            object's object header.  QAK 2003/10/06
+        - Added new H5Fget_freespace() routine to query the free space in a
+            given file.  QAK 2003/10/06
+
+    Parallel Library:
+    -----------------
+
+    Tools:
+    ------
+
+    C++ API:
+    --------
+        - Added overloaded functions read and write to H5::Attribute.
+          BMR - 2003/04/21
+        - Added an overloaded constructor H5::StrType so the need to separately
+          set the length of the string type can be eliminated. BMR - 2003/04/21
+        - Added overloaded functions read and write to H5::DataSet.
+          BMR - 2003/04/27
+
+        The following items were added but not documented in previous releases:
+
+        - On windows, any application, that uses the C++ API dll, must
+          include the name HDF5CPP_USEDLL in its project setting. (Feb 17, 2002)
+          BMR - 2003/10/10
+        - Added missing default constructor H5::H5File. (Apr 26, 2002)
+          BMR - 2003/10/10
+        - Added new member function H5::DataSet::fillMemBuf per the new C
+          API H5Dfill, which fills the elements in a selection for a memory
+          buffer with a fill value. (May 16, 2002) BMR - 2003/10/10
+        - Added the new member function getMemberIndex to H5::EnumType
+          and H5::CompType to match the new C API H5Tget_member_index.  Given
+          the name of a member of an enumeration or compound datatype, this
+          new function queries the index of the member. (May 16, 2002)
+          BMR - 2003/10/10
+        - Added these member functions to H5::Group per the new C functions
+          H5Gget_num_objs, H5Gget_objname_by_idx and H5Gget_objtype_by_idx:
+          + getNumObjs: Returns the number of objects in the group.
+          + getObjnameByIdx: Retrieves the name of an object in a group,
+                             given an index
+          + getObjTypeByIdx: Returns the type of an object in a group,
+                             given an index
+          (Jan 20, 2003) BMR - 2003/10/10
+
+
+Support for new platforms, languages and compilers.
+=======================================
+         - gcc 3.3.1 is supported on Linux.
+  
+
+Bug Fixes since HDF5-1.6.0 release
+==================================
+
+    Library
+    -------
+        - Fixed incorrect datatype of the third parameter to the Fortran90
+          h5pset(get)_cache_f functions (INTEGER to INTEGER(SIZE_T)) EIP - 2003/10/13
+        - Fixed problems with accessing variable-length data datatypes on
+            Crays.  QAK - 2003/10/10
+        - Fixed potential file corruption bug when too many object header
+            messages (probably attributes, from a user perspective) were
+            inserted into an object header and certain other conditions were
+            met.  QAK - 2003/10/08
+        - Changed implementation of internal ID searching algorithm to avoid
+            O(n) behavior for many common cases.  QAK - 2003/10/06
+        - Allow partial parallel writing to compact datasets.  QAK - 2003/10/06
+        - Correctly create reference to shared datatype in attribute, instead
+            of making a copy of the shared datatype in the attribute.
+            QAK - 2003/10/01
+        - Revert changes which caused files >2GB to fail when created with
+            MPI-I/O file driver on certain platforms.  QAK - 2003/09/16
+        - Allow compound datatypes to grow in size.  SLU - 2003/09/10
+        - Detect if a type is already packed before attempting to pack it
+            again or check if it is locked.  SLU - 2003/09/10
+        - Corrected bug when opening a file twice with read-only permission
+            for one open and then closing the read-only access file ID would
+            generate an error.  QAK - 2003/09/10
+        - Corrected bug in repeated calls to H5Pget_access_plist() which would
+            incorrectly manage reference counts of internal information and
+            eventually blow up.  QAK - 2003/09/02
+        - Return rank of the array datatype on successful call to
+            H5Tget_array_dims().  QAK - 2003/08/30
+        - Corrected bug in H5Tdetect_class which was not correctly detecting
+            datatype classes of fields in nested compound datatypes in some
+            circumstances.  QAK - 2003/08/30
+        - Corrected bug in sieve buffer code which could cause loss of data
+            when a small dataset was created and deleted in quick succession.
+            QAK - 2003/08/27
+        - Corrected bug in H5Gget_objname_by_idx which was not allowing NULL
+            for the name when just querying for the object name's length.
+            QAK - 2003/08/25
+        - Corrected bug in variable-length string handling which could
+            generate a core dump on writing variable-length strings as part
+            of a compound datatype on certain architectures.  QAK - 2003/08/25
+        - Corrected bug in H5Tget_native_type which would incorrectly compute
+            the size of certain compound datatypes and also incorrectly
+            compute the offset of the last field for those compound datatypes.
+            QAK - 2003/08/25
+        - Corrected bug in H5Tget_native_type which would drop string datatype
+            metadata (padding, etc.)  QAK - 2003/08/25
+        - Corrected bugs in H5Gget_num_objs, H5Gget_objname_by_idx and
+            H5Gget_objtype_by_idx to allow them to accept location IDs, not just
+            group IDs.  QAK - 2003/08/21
+        - Corrected bug when using scalar dataspace for memory selection and
+            operating on chunked dataset.  QAK - 2003/08/18
+        - Corrected bugs with multiple '/' characters in names for H5Glink
+            and H5Gunlink.  QAK - 2003/08/16
+        - Corrected bug with user blocks that didn't allow a user block to
+            be inserted in front of a file after the file was created.
+            QAK - 2003/08/13
+        - Corrected errors with using point selections to access data in
+            chunked datasets.  QAK - 2003/07/23
+        - Corrected error with variable-length datatypes and chunked datasets
+            which caused H5Dwrite to fail sometimes.  QAK - 2003/07/19
+        - Modified library and file format to support storing indexed storage
+            (chunked dataset) B-tree's with non-default internal 'K' values.
+            QAK - 2003/07/15
+        - Returned H5T_BKG_TEMP support to library after it was accidentally
+            removed.  QAK - 2003/07/14
+
+    Configuration
+    -------------
+        - Fixed the error that caused "make install" to fail because of the
+            macro definition syntax of "prefix?=..."  AKC - 2003/07/22
+
+    Performance
+    -------------
+
+    Tools
+    -----
+	- Fixed a segmentation fault of h5diff when percentage option is used.
+            AKC - 2003/08/27
+        - Switched away from tools using internal "fixtype" function(s) to use
+            H5Tget_native_type() internally.  QAK - 2003/08/25
+
+    Documentation 
+    ------------- 
+        - Added two missing Fortran APIs (h5pget_fapl_mpiposix_f and 
+            h5pset_fapl_mpiposix_f) to the reference manual.
+            FMB - 2003/10/15
+        - Corrected the reference manual descriptions of H5open/h5open_f and 
+            H5close/h5close_f to indicate that these calls are required in 
+            Fortran90 applications.   FMB - 2003/10/15
+
+
+Documentation
+=============
+
+    Fortran90 APIs are being integrated into the main body of the 
+    HDF5 Reference Manual (RM).  This process is complete in all RM sections
+    except H5P.
+
+    A PDF version of the RM will be posted on the HDF5 website
+    (at http://hdf.ncsa.uiuc.edu/HDF5/doc/PSandPDF/) approximately one week
+    after the release.
+
+
+Platforms Tested
+================
+
+    AIX 5.1  (32 and 64-bit)      xlc 6.0.0.2
+                                  xlf 8.1.0.3
+    				  xlC 6.0.0.4
+				  xlc 5.0.2.5
+				  xlf 7.1.1.2
+				  xlC 5.0.2.5
+				  mpcc_r 5.0.2.5
+				  mpxlf_r 7.1.1.2
+                                  poe 3.2.0.10
+    Cray T3E sn6606 2.0.6.08      Cray Standard C Version 6.6.0.2
+                                  Cray Fortran Version 3.6.0.2
+    Cray SV1 sn9617 10.0.1.2      Cray Standard C Version 6.6.0.2
+                                  Cray Fortran Version 3.6.0.2
+    Cray T90IEEE 10.0.1.01y       Cray Standard C Version 6.4.0.2.3
+                                  Cray Fortran Version 3.4.0.3
+    FreeBSD 4.9                   gcc 2.95.4
+                                  g++ 2.95.4
+    HP-UX B.11.00                 HP C  HP92453-01 A.11.01.20 
+                                  HP F90 v2.4
+                                  HP ANSI C++ B3910B A.03.13
+                                  HP MPI 01.07.00.00
+    IRIX 6.5                      MIPSpro cc 7.3.1.2m
+    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.3.1.3m
+                                  F90 MIPSpro 7.3.1.3m (64 only)
+                                  MPIch 1.2.4
+    Linux 2.4.18                  gcc 2.96, 3.2.2, 3.3.1
+                                  g++ 3.2.2, 3.2.3
+                                  Intel(R) C++ Version 7.1
+                                  Intel(R) Fortran Compiler Version 7.1
+                                  PGI compilers (pgcc, pgf90, pgCC) version 4.0-2
+                                  MPIch 1.2.4
+    Linux 2.4.20-8                gcc 3.2.2
+    OSF1 V5.1                     Compaq C V6.4-014
+                                  Compaq C V6.3-027
+				  Compaq Fortran V5.5-2602
+				  Compaq C++ V6.5-030
+				  MPI_64bit_R5
+                                  g++ version 3.0 for C++
+    SunOS 5.7(32 and 64 bit)      WorkShop Compilers 5.0 98/12/15 C 5.0
+     (Solaris 2.7)                WorkShop Compilers 5.0 98/12/15 C++ 5.0 
+                                  WorkShop Compilers 5.0 98/10/25 
+                                  FORTRAN 90 2.0 Patch 107356-04 
+    SunOS 5.8(32 and 64 bit)      Sun WorkShop 6 update 2 C 5.3
+     (Solaris 2.8)                Sun WorkShop 6 update 2 Fortran 90
+                                  Sun WorkShop 6 update 2 C++ 5.3
+    TFLOPS r1.0.4 v4.4.0 i386     pgcc Rel 3.1-4i with mpich-1.2.4 with
+                                          local modifications
+    IA-32 Linux 2.4.9             gcc 2.96
+                                  Intel(R) C++ Version 7.0
+                                  Intel(R) Fortran Compiler Version 7.0
+                                  
+    IA-64 Linux 2.4.16 ia64       gcc version 2.96 20000731
+                                  Intel(R) C++ Version 7.0
+                                  Intel(R) Fortran Compiler Version 7.0
+    Windows 2000 (NT5.0)          MSVC++ 6.0
+                                  DEC Visual Fortran 6.0
+                                  Intel C and F90 compilers version 7.1
+				  Code Warrior 8.0
+    Windows XP                    MSVC++.NET
+    MAC OS X                      Darwin 6.8
+                                  gcc and g++ Apple Computer, Inc. GCC 
+                                  version 1175, based on gcc version 3.1
+                                  
+
+
+Supported Configuration Features Summary
+========================================
+
+    In the tables below
+          y   = tested and supported
+          n   = not supported or not tested in this release
+          x   = not working in this release
+          dna = does not apply
+          ( ) = footnote appears below second table
+
+Platform              C   C         F90      F90       C++  Shared        zlib
+                          parallel           parallel       libraries (4)
+Solaris2.7 64-bit     y   y (1)     y        y (1)     y    y             y
+Solaris2.7 32-bit     y   y (1)     y        y (1)     y    y             y
+Solaris2.8 64-bit     y   y (1)     y        y (1)     y    y             y
+Solaris2.8 32-bit     y   y         y        y (1)     y    y             y
+IRIX6.5               y   y (1)     n        n         n    y             y 
+IRIX64_6.5 64-bit     y   y (2)     y        y         y    y             y
+IRIX64_6.5 32-bit     y   y (2)     n        n         n    y             y
+HPUX11.00             y   y (1)     y        y         y    y             y
+OSF1 v5.1             y   y         y        y         y    y             y
+T3E                   y   y (5)     y        y (5)     n    n             y
+SV1                   y   y (5)     y        y (5)     n    n             y
+T90 IEEE              y   y (5)     y        y (5)     n    n             y
+TFLOPS                n   y (1)     n        n         n    n             y
+AIX-5.1 32-bit        y   y         y        y         y    n             y
+AIX-5.1 64-bit        y   y         y        y         y    n             y
+WinXP           (6)   y   n         n        n         y    y             y
+WinXP Intel           y   n         n        n         y    y             y
+Win2000               y   n         y        n         y    y             y
+Win2000 Intel         y   n         y        n         y    y             y
+WinNT CW              y   n         n        n         n    n             y
+Mac OS X 10.2         y   n         n        n         y    y             y
+FreeBSD               y   y (1)     n        n         y    y             y
+Linux 2.4 gcc   (3)   y   y (1)     y (PGI)  n         y    y             y
+Linux 2.4 Intel (3)   y   n         y        n         y    n             y
+Linux 2.4 PGI   (3)   y   n         y        n         y    n             y
+Linux 2.4 IA32 Intel  y   n         y        n         y    n             y
+Linux 2.4 IA64 Intel  y   n         y        n         y    n             y
+
+
+ASCII Table 2 -- for RELEASE.txt
+
+Platform              static- Thread- SZIP GASS STREAM-  High-level  H4/H5 
+                      exec    safe              VFD      APIs        tools (7)
+Solaris2.7 64-bit     x       y       y    n    y        y           n
+Solaris2.7 32-bit     x       y       y    n    y        y           y
+Solaris2.8 64-bit     x       y       y    n    y        y           n
+Solaris2.8 32-bit     x       y       y    n    y        y           y
+IRIX6.5               x       n       y    n    y        y           y
+IRIX64_6.5 64-bit     x       y       y    y    y        y           y
+IRIX64_6.5 32-bit     x       y       y    y    y        y           y
+HPUX11.00             x       n       y    n    y        y           y
+OSF1 v5.1             y       n       y    n    y        y           y
+T3E                   y       n       n    n    y        y           y
+SV1                   y       n       n    n    y        y           y
+T90 IEEE              y       n       n    n    y        y           n
+TFLOPS                y       n       n    n    n        n           n
+AIX-5.1 32-bit        y       n       y    n    y        y           y
+AIX-5.1 64-bit        y       n       y    n    y        y           y
+WinXP           (6)   y       n       y    n    n        y           y
+WinXP Intel           y       n       y    n    n        y           y
+Win2000               y       n       y    n    n        y           y
+Win2000 Intel         y       n       y    n    n        y           y
+WinNT CW              y       n       y    n    n        y           y
+Mac OS X 10.2         y       n       y    n    y        y           n
+FreeBSD               y       y       y    n    y        y           y
+Linux 2.4 gcc   (3)   y       y       y    n    y        y           y
+Linux 2.4 Intel (3)   y       n       y    n    y        n           n
+Linux 2.4 PGI   (3)   y       n       y    n    y        n           n
+Linux 2.4 IA32 Intel  y       n       y    n    y        y           y
+Linux 2.4 IA64 Intel  y       n       y    n    y        y           y
+
+    Notes: (1) Using mpich 1.2.4.
+           (2) Using mpt and mpich 1.2.4.
+           (3) Linux 2.4 with GNU, Intel, and PGI compilers, respectively.
+           (4) Shared libraries are provided only for the C library, except 
+               on Windows where they are provided for C and C++.
+           (5) Using mpt.
+           (6) Binaries only; source code for this platform is not being 
+               released at this time.
+           (7) Includes the H4toH5 Library and the h4toh5 and h5toh4 
+               utilities.
+    Compiler versions for each platform are listed in the preceding
+    "Platforms Tested" table.
+
+
+
+Known Problems
+==============
+* Fortran subroutine h5pget_driver_f doesn't return a correct driver information.
+  The fix willl be available in the 1.6.2 release. 
+* There are two h5dump xml tests(h5dump --xml thlink.h5 and h5dump --xml tmany.h5)
+  failed on windows xp with .NET for debug and debug dll. Release and Release
+  dll work fine. 
+
+* The h5dump tests may fail to match the expected output on some platforms
+  (e.g. parallel jobs, Windows) where the error messages directed to
+  "stderr" do not appear in the "right order" with output from stdout.
+  This is not an error.
+
+* The stream-vfd test uses ip port 10007 for testing. If another
+  application is already using that port address, the test will hang
+  indefinitely and has to be terminated by the kill command. To try the
+  test again, change the port address in test/stream_test.c to one not
+  being used in the host.
+
+* The --enable-static-exec configure flag fails to compile for Solaris
+  platforms. This is due to the fact that not all of the system
+  libraries on Solaris are available in a static format.
+
+  The --enable-static-exec configure flag also fails to correctly compile
+  on IBM SP2 platform for the serial mode. The parallel mode works fine
+  with this option.
+  
+  It is suggested that you don't use this option on these platforms
+  during configuration.
+
+* With the gcc 2.95.2 compiler, HDF 5 uses the `-ansi' flag during
+  compilation. The ANSI version of the compiler complains about not being
+  able to handle the `long long' datatype with the warning:
+
+        warning: ANSI C does not support `long long'
+  
+  This warning is innocuous and can be safely ignored.
+
+
+* The Stream VFD was not tested yet under Windows. It is not supported
+  in the TFLOPS machine.
+
+
+* The ./dsets tests failed in the TFLOPS machine if the test program,
+  dsets.c, is compiled with the -O option.  The hdf5 library still works
+  correctly with the -O option.  The test program works fine if it is
+  compiled with -O1 or -O0.  Only -O (same as -O2) causes the test
+  program to fail.
+
+* Certain platforms give false negatives when testing h5ls:
+    - Cray J90 and Cray T90IEEE give errors during testing when displaying
+      some floating-point values. These are benign differences due to
+      the different precision in the values displayed and h5ls appears to
+      be dumping floating-point numbers correctly.
+
+* Before building HDF5 F90 Library from source on Crays 
+  replace H5Aff.f90, H5Dff.f90 and H5Pff.f90 files in the fortran/src
+  subdirectory in the top level directory with the Cray-specific files
+  from the site:
+
+* On some platforms that use Intel compilers to build HDF5 fortran library,
+  compilation may fail for fortranlib_test.f90, fflush1.f90 and fflush2.f90
+  complaining about exit subroutine. Comment out the line 
+  IF (total_error .ne. 0) CALL exit (total_error)
+
+  ftp://hdf.ncsa.uiuc.edu/pub/outgoing/hdf5/hdf5-1.6.0/F90_source_for_Crays
+
+* On IA32 and IA64 systems, if you use a compiler other than GCC (such as
+  Intel's ecc or icc compilers), you will need to modify the generated
+  "libtool" program after configuration is finished. On or around line 104 of
+  the libtool file, there are lines which look like:
+
+      # How to pass a linker flag through the compiler.
+      wl=""
+
+  change these lines to this:
+
+      # How to pass a linker flag through the compiler.
+      wl="-Wl,"
+
+  UPDATE: This is now done automatically by the configure script. However, if
+  you still experience a problem, you may want to check this line in the
+  libtool file and make sure that it has the correct value.
+
+* Information about building with PGI and Intel compilers is available in
+  INSTALL file sections 5.7 and 5.8
+%%%%1.6.0%%%%   Release Information for hdf5-1.6.0 (03/July/03)
+
+14.  Release information for HDF5 version 1.6.0
+================================================
+
+
+INTRODUCTION
+
+This document describes the differences between HDF5-1.4.* and
+HDF5-1.6.0, and contains information on the platforms tested and
+known problems in HDF5-1.6.0. For more details check the HISTORY.txt
+file in the HDF5 source.
+
+The HDF5 documentation can be found on the NCSA ftp server
+(ftp.ncsa.uiuc.edu) in the directory:
+
+     /HDF/HDF5/docs/
+
+For more information look at the HDF5 home page at:
+   
+    http://hdf.ncsa.uiuc.edu/HDF5/
+
+If you have any questions or comments, please send them to:
+
+    hdfhelp at ncsa.uiuc.edu
+
+CONTENTS
+
+- New Features
+- Support for new platforms and languages
+- Bug Fixes since HDF5-1.4.0
+- Platforms Tested
+- Known Problems
+
+
+New Features
+============
+
+Configuration:
+--------------
+The following flags have been added to the configuration script:
+--enable-hdf5v1_4       Compile the HDF5 v1.4 compatibility interface
+--enable-filters=all    Turn on all internal I/O filters. One may also
+                        specify a comma-separated list of filters or the
+                        word no. The default is all internal I/O filters.
+--with-mpe=DIR          Use MPE instrumentation [default=no]
+--with-szlib=DIR        Use szlib library for external szlib I/O filter
+                        [default=no]
+
+Library:
+--------
+    Summary: This release has the following new features that are not
+             available in 1.4.* releases
+
+    1. Generic properties to give application more control on I/O pipeline
+    2. Time allocation and fill value properties
+    3. New  filters: external compression filter szip
+                     internal shuffling and checksum filters
+    4. Compact storage layout for datasets
+    5. Redesigned I/O pipeline for better performance.
+
+    For more information see
+    http://hdf.ncsa.uiuc.edu/HDF5/doc_resource/SZIP/index.html
+    http://hdf.ncsa.uiuc.edu/HDF5/doc/ADGuide.html
+    http://hdf.ncsa.uiuc.edu/HDF5/doc/ADGuide/Changes.html 
+    
+    Complete list of changes:
+
+    * Changed dataset modification time to _not_ be updated when raw data is
+      written to a dataset.  The modification time is only updated when the
+      dataset's metadata is modified.  QAK - 2003/06/10
+    * Changed H5Sget_select_bounds to use 'hssize_t *' for start and end
+      parameters, instead of 'hsize_t *', to better match other parts of the
+      dataspace API.  QAK - 2003/06/04
+    * Changed raw data I/O to only access each chunk once, improving performance
+      in many situations with hyperslabs and large chunks or chunks with
+      filters.  These improvements are currently limited to serial I/O, with
+      similar parallel I/O improvements forthcoming sometime in the future.
+      QAK - 2003/05/07
+    * Added parameter to the MPI/POSIX driver. If GPFS is enabled (by
+      modifying the H5FDmpiposix.c file to uncomment the USE_GPFS_HINTS
+      macro), then this extra parameter will turn GPFS hints on and off
+      during runtime. BW - 2003/05/05
+    * Added option to print 1-byte integer datasets as ASCII to h5dump. BW -
+      2003/04/30
+    * Added a new utility "h5fc". It can be used to compile easily Fortran
+      programs which use HDF5. It automatically uses the compiler the HDF5
+      library was built with and links in any libraries HDF5 requires.
+      BW - 2003/04/10
+    * Added new dataset creation property list functions for working with
+      I/O filters: H5Pmodify_filter, H5Pget_filter_by_id and
+      H5Pall_filters_avail.  Also changed H5Zregister to use new method
+      of registering filters with library.  QAK - 2003/04/08
+    * The first version of szip compression support were implemented. 
+      User should have static szlib library installed. Using function
+      H5Pset_szip to pass the szip parameters to the HDF5 library.
+      More detailed decription of the process will be followed.
+      KY-2003/04/01
+    * Added Fletcher32 checksum as a filter in pipeline.  It only works in 
+      chunked dataset.  SLU - 2003/2/11
+    * MPICH/MPE instrumentation feature added.  Use --with-mpe[=DIR] to configure
+      it.  AKC - 2003/1/3
+    * New functions H5Gget_num_objs, H5Gget_objname_by_idx and H5Gget_objtype_by_idx 
+      are added to the library.  SLU - 2002/11/25
+    * H5Dget_offset is added to return the offset of a dataset's data relative
+      to the beginning of the file.  SLU - 2002/11/7
+    * Functions H5Tget_native_type and H5Tis_variable_str are added.  The first
+      one reconstructs a datatype based on native memory datatype.  The second
+      one checks if a datatype is variable string.  SLU - 2002/11/6
+    * Added environment variable "HDF5_DISABLE_VERSION_CHECK", which disables
+      the version checking between the header files and the library linked into
+      an application if set to '1'.  This should be used with caution, mis-
+      matched headers and library binaries can cause _serious_ problems.
+      QAK - 2002/10/15
+    * Added new API function to get the name of an object in a file, using
+      an open ID (hid_t).  QAK - 2002/10/14
+    * Added API functions to return pointer to low-level file handle
+      (H5Fget_vfd_handle and H5FDget_vfd_handle) and related property list
+      setting functions(H5Pset_family_offset and H5Pset_multi_type).
+      SLU - 2002/09/30
+    * Changed "H5P[set|get]_space_time" functions to "H5P[set|get]_alloc_time"
+      Unify all symbolic names for these functions to use "alloc time" instead
+      of other names.  QAK - 2002/09/13
+    * Added "H5D_SPACE_ALLOC_INCR" setting to H5D_SPACE_ALLOC_EARLY and
+      H5D_SPACE_ALLOC_LATE for H5Dset_space_time().  This allows chunked
+      datasets to be incrementally allocated as in the 1.4.x branch.
+      QAK - 2002/08/27
+    * Compact dataset is added to the library.  The data will be stored in 
+      the header message of dataset layout.  Space allocation time has to be
+      EARLY.  No hyperslab is supported for parallel collective write.  There
+      is no API changes except activating H5Pset_layout and H5Pget_layout for
+      compact dataset.  -SLU, 2002/8/20
+    * Added 'closing' parameter to VFL 'flush' callback function and H5FDflush.
+      This allows the library to indicate that the file will be closed
+      immediately following the call to 'flush' and can be used to avoid actions
+      that are duplicated in the VFL 'close' callback function.  QAK - 2002/05/20
+    * Added feature to parallel chunk allocation routine to not write fill
+      values to chunks allocated if the user has set the "fill time" to never.
+      This can improve parallel I/O performance for chunked
+      datasets.  QAK - 2002/05/17
+    * New functions H5Glink2 and H5Gmove2 were added to allow link and move to
+      be in different locations in the same file.  The old functions H5Glink 
+      and H5Gmove remain valid.  SLU - 2002/04/26 
+    * Fill-value's behaviors for contiguous dataset have been redefined.  
+      Basicly, dataset won't allocate space until it's necessary.  Full details
+      are available at http://hdf.ncsa.uiuc.edu/RFC/Fill_Value, at this moment.
+      SLU - 2002/04/11
+    * Added new routine "H5Dfill" to fill a selection with a particular value
+      in memory.  QAK - 2002/04/09
+    * Improved performance of "regular" hyperslab I/O when using MPI-IO and the
+      datatype conversion is unneccessary.  QAK - 2002/04/02
+    * Improved performance of single hyperslab I/O when datatype conversion is
+      unneccessary.  QAK - 2002/04/02
+    * Added new "H5Sget_select_type" API function to determine which type of
+      selection is defined for a dataspace ("all", "none", "hyperslab" or
+      "point"). QAK - 2002/02/07
+    * Added support to read/write portions of chunks directly, if they are
+      uncompressed and too large to cache.  This should speed up I/O on chunked
+      datasets for a few more cases.  QAK - 2002/01/31
+    * Added H5Rget_obj_type() API function, which performs the same functionality
+      as H5Rget_object_type(), but requires the reference type as a parameter
+      in order to correctly handle dataset region references.  Moved
+      H5Rget_object_type() to be only compiled into the library when v1.4
+      compatibility is enabled.
+    * Added a new file access property, file close degree, to control file 
+      close behavior.  It has four values, H5F_CLOSE_WEAK, H5F_CLOSE_SEMI,
+      H5F_CLOSE_STRONG, and H5F_CLOSE_DEFAULT.  Two correspont functions 
+      H5Pset_fclose_degree and H5Pget_fclose_degree are also provided.  Two 
+      new functions H5Fget_obj_count and H5Fget_obj_ids are offerted to assist
+      this new feature.  For full details, please refer to the reference 
+      manual under the description of H5Fcreate, H5Fopen, H5Fclose and the 
+      functions mentioned above. 
+    * Removed H5P(get|set)_hyper_cache API function, since the property is no
+      longer used.
+    * Improved performance of non-contiguous hyperslabs (built up with
+      several hyperslab selection calls).
+    * Improved performance of single, contiguous hyperslabs when reading or
+      writing.
+    * As part of the transition to using generic properties everywhere, the
+      parameter of H5Pcreate changed from H5P_class_t to hid_t, as well
+      the return type of H5Pget_class changed from H5P_class_t to hid_t.
+      Further changes are still necessary and will be documented here as they
+      are made.
+    * Improved regular hyperslab I/O by about a factor of 6 or so.
+    * Modified the Pablo build procedure to permit building of the instrumented
+      library to link either with the Trace libraries as before or with the
+      Pablo Performance Caputure Facility.
+    * Added new F90 APIs for generic properties, new filters, and
+      time/space allocation properties.
+    * C++ API:
+        - Added two new member functions: Exception::getFuncName() and
+          Exception::getCFuncName() to provide the name of the member
+          function, where an exception is thrown.
+        - IdComponent::operator= becomes a virtual function because
+          DataType, DataSpace, and PropList provide their own
+          implementation.  The new operator= functions invoke H5Tcopy,
+          H5Scopy, and H5Pcopy to make a copy of a datatype, dataspace,
+          and property list, respectively.
+
+Parallel Library:
+-----------------
+
+Tools:
+------
+    * When the "-S" option for "simple" output is chosen, h5ls now displays
+        modification times of datasets in UTC instead of local time.
+        QAK - 2003/06/06
+    * h5diff to compare two HDF5 files was added
+    * h5import to import ascii and binary data to an HDF5 file was added.
+      Old h5import tool in the tools/misc directory was renamed to 
+      h5createU8 to reflect its purpose. h5createU8 will be deleted in 
+      1.6.1 release. 
+    * Two new scripts h5fc and h5c++ were added to compile F90 and C++
+      HDF5 applications.
+
+Support for new platforms, languages and compilers.
+=======================================
+    * Added C++ API support on HPUX11.00.  BMR - 2003/03/19
+    * Absoft compiler is supported for Fortran HDF5 Library. 
+      When building with Absoft compiler, add -DH5_ABSOFT to
+      C compilation flags to get correct names of C functions
+      called by Fortran APIs. 
+
+
+Bug Fixes since HDF5-1.4.0 release
+==================================
+
+Library
+-------
+    * Don't attempt to perform collective I/O on chunked datasets with
+      parallel I/O.  QAK - 2003/06/05
+    * The library now correctly reuses space when objects are deleted in the
+      file.  This should be handled correctly for every situation, except
+      datasets with variable-length datatypes are not returning the space they
+      use in the global heap currently. QAK - 2003/04/13
+    * Fixed error in B-tree deletion routine which could cause groups to be
+      corrupted when objects are removed from them.
+      QAK - 2003/04/11
+    * Fixed error in file space freeing code which could cause metadata to
+      fail to be written to the file.
+      QAK - 2003/04/11
+    * -O caused errors in AIX 5.x platforms.  Removed it from
+      --enable-production mode.  AKC - 2003/03/31
+    * Corrected memory/resource leaks in per-thread key information when
+      thread-safe operation was enabled.  QAK - 2003/02/07
+    * Improved error assertion for nil VL strings, making it fails with error
+      stack instead of just assertion failure.  SLU - 2002/12/16
+    * Added two new API functions: H5Zunregister & H5Zfilter_avail.
+      QAK - 2002/11/16
+    * Add data shuffle filter(source code H5Zshuffle.c), the combination of the
+      shuffling and compression can make data compression better without suffering
+      much encoding and decoding CPU time for many application datasets(especially
+      for floating point data). This adds a new API function: H5Pset_shuffle.
+      KY - 2002/11/13
+    * Allow scalar dataspaces to be used for parallel I/O.  QAK - 2002/11/05
+    * New functions H5Gget_comment(modification), H5Aget_storage_size, 
+      H5Arename.  SLU - 2002/10/29
+    * Fixed an assertion of H5S_select_iterate that did not account for scalar
+      type that has no dimension sizes.   AKC - 2002/10/15
+    * Partially fixed space allocation inefficiencies in the file by
+      improving our algorithms for re-using freed space.  QAK - 2002/08/27
+    * Fixed data corruption problem which could occur when fill values were
+      written to a contiguously stored dataset in parallel.  QAK - 2002/08/27
+    * Fixed VL memory leak when data is overwritten.  The heap objects holding
+      old data are freed.  If the fill value writting time is set to 
+      H5D_FILL_TIME_NEVER, the library prohibits user to create VL type dataset.
+      The library free all the heap objects storing VL type if there is nested 
+      VL type(a VL type contains another VL type).  SLU - 2002/07/10 
+    * Tweaked a few API functions to use 'size_t' instead of 'unsigned' or
+      'hsize_t', which may cause errors in some cases.
+
+
+Configuration
+-------------
+    * Included the both the examples of fortran and c++ "make check-install"
+      testing. This tests the correctness of the h5fc command. AKC - 2003/04/22
+    * When using gcc 3.x, we use -std=c99 instead of -ansi for compiling.
+      QAK - 2003/04/11
+    * IA64 platform has its own configure setting and use Intel Compilers as
+      the default compilers (were gcc and pgf90 before.)  This also eliminated
+      the segmentation fault in the fortran test.  The missing reference of
+      "exit" is fixed too.  AKC - 2003/04/02
+
+Performance
+-------------
+    * Improved dataset creation time by about 30% (relative to the 1.4.x
+      branch).
+
+Tools
+-----
+
+    * Added a -force option to h5redeploy.  AKC - 2003/03/04 
+    * The VL string bug(data and datatype cannot be shown) in h5dump is fixed.
+      -SLU - 2002/11/18
+    * Fixed segfault if h5dump was invoked with some options but no file 
+      (e.g., h5dump -H). -AKC, 2002/10/15
+    * Fixed so that the "-i" flag works correctly with the h5dumper.
+    * Fixed segfault when "-v" flag was used with the h5dumper.
+
+
+Documentation 
+------------- 
+
+
+
+
+
+
+Platforms Tested
+================
+
+    AIX 5.1  (32 and 64-bit)      xlc 6.0.0.2
+                                  xlf 8.1.0.3
+    				  xlC 6.0.0.4
+				  xlc 5.0.2.5
+				  xlf 7.1.1.2
+				  xlC 5.0.2.5
+				  mpcc_r 5.0.2.5
+				  mpxlf_r 7.1.1.2
+                                  poe 3.2.0.10
+    Cray T3E sn6606 2.0.6.08      Cray Standard C Version 6.6.0.2
+                                  Cray Fortran Version 3.6.0.0.2
+                                  mpt 2.2.0.0
+    Cray SV1 sn9617 10.0.1.2      Cray Standard C Version 6.6.0.2
+                                  mpt 2.2.0.0
+                                  Cray Fortran Version 3.6.0.0.2
+    Cray T90IEEE 10.0.1.01y       Cray Standard C Version 6.4.0.2.3
+                                  Cray Fortran Version 3.4.0.3
+                                  mpt 2.1.0.0
+    FreeBSD 4.7                   gcc 2.95.4
+                                  g++ 2.95.5
+    HP-UX B.11.00                 HP C  HP92453-01 A.11.01.20 
+                                  HP F90 v2.4
+                                  HP ANSI C++ B3910B A.03.13
+                                  MPIch 1.2.4
+    IRIX 6.5                      MIPSpro cc 7.30
+    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.3.1.3m
+                                  F90 MIPSpro 7.3.1.3m (64 only)
+                                  MPIch 1.2.4
+    Linux 2.4.18                  gcc 2.96, 3.2.2, 3.2.3
+                                  g++ 3.2.2, 3.2.3
+                                  Intel(R) C++ Version 7.1
+                                  Intel(R) Fortran Compiler Version 7.1
+                                  PGI compilers (pgcc, pgf90, pgCC) version 4.0-2
+                                  MPIch 1.2.4
+    OSF1 V5.1                     Compaq C V6.4-014
+                                  Compaq C V6.3-027
+				  Compaq Fortran V5.5-1877
+				  Compaq C++ V6.5-014
+				  MPI_64bit_R5
+                                  g++ version 3.0 for C++
+    SunOS 5.7                     WorkShop Compilers 5.0 98/12/15 C 5.0
+     (Solaris 2.7)                WorkShop Compilers 5.0 98/12/15 C++ 5.0 
+                                  WorkShop Compilers 5.0 98/10/25 
+                                  FORTRAN 90 2.0 Patch 107356-04 
+    SunOS 5.8/32                  Sun WorkShop 6 update 2 C 5.3
+     (Solaris 2.8)                Sun WorkShop 6 update 2 Fortran 90
+                                  Sun WorkShop 6 update 2 C++ 5.3
+    SunOS 5.8/64                  Sun WorkShop 6 update 2 C 5.3
+     (Solaris 2.8)                Sun WorkShop 6 update 2 Fortran 90
+                                  Sun WorkShop 6 update 2 C++ 5.3
+    TFLOPS r1.0.4 v4.3.3 i386     pgcc Rel 3.1-4i with mpich-1.2.4 with
+                                          local modifications
+    IA-32 Linux 2.4.9             gcc 2.96
+                                  Intel(R) C++ Version 7.0
+                                  Intel(R) Fortran Compiler Version 7.0
+                                  
+    IA-64 Linux 2.4.16 ia64       gcc version 2.96 20000731
+                                  Intel(R) C++ Version 7.0
+                                  Intel(R) Fortran Compiler Version 7.0
+    Windows 2000 (NT5.0)          MSVC++ 6.0
+                                  DEC Visual Fortran 6.0
+                                  Intel C and F90 compilers version 7.1
+				  Code Warrior 8.0
+    Windows XP                    MSVC++.NET
+    MAC OS X                      Darwin 6.5
+                                  gcc and g++ Apple Computer, Inc. GCC 
+                                  version 1161, based on gcc version 3.1
+                                  
+
+
+Supported Configuration Features Summary
+========================================
+
+    In the tables below
+          y   = tested and supported
+          n   = not supported or not tested in this release
+          x   = not working in this release
+          dna = does not apply
+          ( ) = footnote appears below second table
+
+Platform              C   C         F90      F90       C++  Shared        zlib
+                          parallel           parallel       libraries (4)
+Solaris2.7 64-bit     y   y (1)     y        y (1)     y    y             y
+Solaris2.7 32-bit     y   y (1)     y        y (1)     y    y             y
+Solaris2.8 64-bit     y   y (1)     y        y (1)     y    y             y
+Solaris2.8 32-bit     y   y         y        y (1)     y    y             y
+IRIX6.5               y   y (1)     n        n         n    y             y 
+IRIX64_6.5 64-bit     y   y (2)     y        y         y    y             y
+IRIX64_6.5 32-bit     y   y (2)     n        n         n    y             y
+HPUX11.00             y   y (1)     y        y         y    y             y
+OSF1 v5.1             y   y         y        y         y    y             y
+T3E                   y   y (5)     y        y (5)     n    n             y
+SV1                   y   y (5)     y        y (5)     n    n             y
+T90 IEEE              y   y (5)     y        y (5)     n    n             y
+TFLOPS                n   y (1)     n        n         n    n             y
+AIX-5.1 32-bit        y   y         y        y         y    n             y
+AIX-5.1 64-bit        y   y         y        y         y    n             y
+WinXP           (6)   y   n         n        n         y    y             y
+WinXP Intel           y   n         n        n         y    y             y
+Win2000               y   n         y        n         y    y             y
+Win2000 Intel         y   n         y        n         y    y             y
+WinNT CW              y   n         n        n         n    n             y
+Mac OS X 10.2         y   n         n        n         y    y             y
+FreeBSD               y   y (1)     n        n         y    y             y
+Linux 2.4 gcc   (3)   y   y (1)     y (PGI)  n         y    y             y
+Linux 2.4 Intel (3)   y   n         y        n         y    n             y
+Linux 2.4 PGI   (3)   y   n         y        n         y    n             y
+Linux 2.4 IA32 Intel  y   n         y        n         y    n             y
+Linux 2.4 IA64 Intel  y   n         y        n         y    n             y
+
+
+ASCII Table 2 -- for RELEASE.txt
+
+Platform              static- Thread- SZIP GASS STREAM-  High-level  H4/H5 
+                      exec    safe              VFD      APIs        tools (7)
+Solaris2.7 64-bit     x       y       y    n    y        y           n
+Solaris2.7 32-bit     x       y       y    n    y        y           y
+Solaris2.8 64-bit     x       y       y    n    y        y           n
+Solaris2.8 32-bit     x       y       y    n    y        y           y
+IRIX6.5               x       n       y    n    y        y           y
+IRIX64_6.5 64-bit     x       y       y    y    y        y           y
+IRIX64_6.5 32-bit     x       y       y    y    y        y           y
+HPUX11.00             x       n       y    n    y        y           y
+OSF1 v5.1             y       n       y    n    y        y           y
+T3E                   y       n       n    n    y        y           y
+SV1                   y       n       n    n    y        y           y
+T90 IEEE              y       n       n    n    y        y           n
+TFLOPS                y       n       n    n    n        n           n
+AIX-5.1 32-bit        y       n       y    n    y        y           y
+AIX-5.1 64-bit        y       n       y    n    y        y           y
+WinXP           (6)   y       n       y    n    n        y           y
+WinXP Intel           y       n       y    n    n        y           y
+Win2000               y       n       y    n    n        y           y
+Win2000 Intel         y       n       y    n    n        y           y
+WinNT CW              y       n       y    n    n        y           y
+Mac OS X 10.2         y       n       y    n    y        y           n
+FreeBSD               y       y       y    n    y        y           y
+Linux 2.4 gcc   (3)   y       y       y    n    y        y           y
+Linux 2.4 Intel (3)   y       n       y    n    y        n           n
+Linux 2.4 PGI   (3)   y       n       y    n    y        n           n
+Linux 2.4 IA32 Intel  y       n       y    n    y        y           y
+Linux 2.4 IA64 Intel  y       n       y    n    y        y           y
+
+    Notes: (1) Using mpich 1.2.4.
+           (2) Using mpt and mpich 1.2.4.
+           (3) Linux 2.4 with GNU, Intel, and PGI compilers, respectively.
+           (4) Shared libraries are provided only for the C library, except 
+               on Windows where they are provided for C and C++.
+           (5) Using mpt.
+           (6) Binaries only; source code for this platform is not being 
+               released at this time.
+           (7) Includes the H4toH5 Library and the h4toh5 and h5toh4 
+               utilities.
+    Compiler versions for each platform are listed in the preceding
+    "Platforms Tested" table.
+
+
+
+Known Problems
+==============
+
+* PGI C++ compiler fails when compiling the C++ library's tests.
+  Therefore, we cannot verify that the C++ library built with the PGI C++
+  compiler is correct.
+
+* The h5dump tests may fail to match the expected output on some platforms
+  (e.g. parallel jobs, Windows) where the error messages directed to
+  "stderr" do not appear in the "right order" with output from stdout.
+  This is not an error.
+
+* The stream-vfd test uses ip port 10007 for testing. If another
+  application is already using that port address, the test will hang
+  indefinitely and has to be terminated by the kill command. To try the
+  test again, change the port address in test/stream_test.c to one not
+  being used in the host.
+
+* The --enable-static-exec configure flag fails to compile for Solaris
+  platforms. This is due to the fact that not all of the system
+  libraries on Solaris are available in a static format.
+
+  The --enable-static-exec configure flag also fails to correctly compile
+  on IBM SP2 platform for the serial mode. The parallel mode works fine
+  with this option.
+  
+  It is suggested that you don't use this option on these platforms
+  during configuration.
+
+* With the gcc 2.95.2 compiler, HDF 5 uses the `-ansi' flag during
+  compilation. The ANSI version of the compiler complains about not being
+  able to handle the `long long' datatype with the warning:
+
+        warning: ANSI C does not support `long long'
+  
+  This warning is innocuous and can be safely ignored.
+
+
+* The Stream VFD was not tested yet under Windows. It is not supported
+  in the TFLOPS machine.
+
+
+* The ./dsets tests failed in the TFLOPS machine if the test program,
+  dsets.c, is compiled with the -O option.  The hdf5 library still works
+  correctly with the -O option.  The test program works fine if it is
+  compiled with -O1 or -O0.  Only -O (same as -O2) causes the test
+  program to fail.
+
+* Certain platforms give false negatives when testing h5ls:
+    - Cray J90 and Cray T90IEEE give errors during testing when displaying
+      some floating-point values. These are benign differences due to
+      the different precision in the values displayed and h5ls appears to
+      be dumping floating-point numbers correctly.
+
+* Before building HDF5 F90 Library from source on Crays 
+  replace H5Aff.f90, H5Dff.f90 and H5Pff.f90 files in the fortran/src
+  subdirectory in the top level directory with the Cray-specific files
+  from the site:
+
+* On some platforms that use Intel compilers to build HDF5 fortran library,
+  compilation may fail for fortranlib_test.f90, fflush1.f90 and fflush2.f90
+  complaining about exit subroutine. Comment out the line 
+  IF (total_error .ne. 0) CALL exit (total_error)
+
+  ftp://hdf.ncsa.uiuc.edu/pub/outgoing/hdf5/hdf5-1.6.0/F90_source_for_Crays
+
+* On IA32 and IA64 systems, if you use a compiler other than GCC (such as
+  Intel's ecc or icc compilers), you will need to modify the generated
+  "libtool" program after configuration is finished. On or around line 104 of
+  the libtool file, there are lines which look like:
+
+      # How to pass a linker flag through the compiler.
+      wl=""
+
+  change these lines to this:
+
+      # How to pass a linker flag through the compiler.
+      wl="-Wl,"
+
+  UPDATE: This is now done automatically by the configure script. However, if
+  you still experience a problem, you may want to check this line in the
+  libtool file and make sure that it has the correct value.
+
+* Information about building with PGI and Intel compilers is available in
+  INSTALL file sections 5.7 and 5.8
+-----------------------------------------------------------------------
+%%%%1.4.5%%%%   Release Information for hdf5-1.4.5 (02/February/03)
+
+
+13.   Release information for HDF5 version 1.4.5
+==============================================================================
 
-    Configuration
-    -------------
-    - CMake: Improved CPack packaging, added parallel commands, improved
-      configuration options (better similarity to configure), added more
-      tests, better support for use in external cmake projects. 
-      (ADB - 2010/10/07)
-    - The default configuration setting for official releases is 
-      --enable-production. For unofficial releases, the default configuration 
-      setting has been --disable-production. (AKC  - 2010/05/28)
-    Library
-    -------
-    - Added support for thread safety on Windows using the Windows threads 
-      library. Use the HDF5_ENABLE_THREADSAFE option in CMake on a Windows 
-      platform to enable this functionality. This is supported on Windows 
-      Vista and newer Windows operating systems. (MAM - 2010/09/10)
-    - H5Tset_order and H5Tget_order now support all datatypes.  A new byte 
-      order, H5T_ORDER_MIXED, has been added specifically for a compound 
-      datatype and its derived type.  (SLU - 2010/8/23) 
-    - Improved performance of metadata I/O by changing the default algorithm 
-      to perform I/O from all processes (instead of just process 0) when using 
-      parallel I/O drivers. (QAK - 2010/07/19)
-    - Improved performance of I/O on datasets with the same shape, but 
-      different rank. (QAK - 2010/07/19)
-    - Improved performance of the chunk cache by avoiding unnecessary b-tree 
-      lookups of chunks already in cache. (NAF - 2010/06/15) 
-      
-    Parallel Library
-    ----------------
-    - None
- 
-    Tools
-    -----
-    - h5diff: Added a new flag: --exclude-path.  The specified path to an 
-      object will be excluded when comparing two files or two groups. If a 
-      group is specified to be excluded, all member objects of that group 
-      will be excluded.  (JKM - 2010/09/16).
-    - h5ls: Added a new flag: --no-dangling-links.  See --help output for 
-      details. (JKM - 2010/06/15)
-    - h5ls: Added a new flag --follow-symlinks.  See --help output for 
-      details. (JKM - 2010/05/25)
-      
-    High-Level APIs
-    ---------------
-    - None
 
-    F90 API
-    -------
-     - None
+INTRODUCTION
 
-    C++ API
-    -------
-    - None
+This document describes the differences between HDF5-1.4.4 and
+HDF5-1.4.5, and contains information on the platforms tested and
+known problems in HDF5-1.4.5. For additional information check the 
+HISTORY.txt file in the HDF5 source.
 
+The HDF5 documentation can be found on the NCSA ftp server
+(ftp.ncsa.uiuc.edu) in the directory:
 
-Support for New Platforms, Languages, and Compilers
-===================================================
-    - Sun C and C++ 5.10 and Sun Fortran 95 8.4.
-    - Mac OS X 10.6.4 with gcc 4.2.1 and gfortran 4.6
+    /HDF/HDF5/docs/
 
+For more information, see the HDF5 home page at:
+   
+    http://hdf.ncsa.uiuc.edu/HDF5/
 
-Bug Fixes since HDF5-1.8.5
-==========================
+If you have any questions or comments, please send them to:
 
-    Configuration
-    -------------
-    - The default number of MPI processes for testing purposes has been 
-      changed from 3 to 6.  (AKC - 2010/11/11)
-    - Some tests in tools/h5repack may fail in AIX systems when -q32 mode is 
-      used. The error is caused by not requesting enough memory in default.
-      Added "env LDR_CNTRL=MAXDATA=0x20000000 at DSA" into the $RUNSERIAL and
-      $RUNPARALLE in the AIX config file so that executables are tested with
-      more memory.  (AKC - 2010/11/11)
-    - Removed recognition of the parallel compilers of LAM(hcc) and
-      ChMPIon(cmpicc) since we have no access to these two MPI implementations
-      and cannot verify their correctness. (AKC - 2010/07/14 - Bug 1921)
-    - PHDF5 was changed to use "mpiexec" instead of mpirun as the default 
-      MPI applications startup command as defined in the MPI-2 definition, 
-      section 4.1. (AKC - 2010/06/11 - Bug 1921)
-      
-    Library
-    -------
-    - Fixed a bug that caused big endian machines to generate corrupt files
-      when using the scale-offset filter with floating point data or fill
-      values.  Note that such datasets will no longer be readable by any
-      by any machine after this patch.  (NAF - 2010/02/02 - Bug 2131)
-    - Retrieving a link's name by index in the case where the link is external
-      and the file that the link refers to doesn't exist will now fail 
-      gracefully rather than cause a segmentation fault. (MAM - 2010/11/17)
-    - Modified metadata accumulator to better track accumulated dirty metadata 
-      in an effort to reduce unnecessary I/O in certain situations and to 
-      fix some other corner cases which were prone to error. (MAM - 2010/10/15)
-    - Added a new set of unit tests that are run during 'make check' to verify 
-      the behavior of the metadata accumulator. (MAM - 2010/10/15)
-    - Modified library to always cache symbol table information.  Libraries
-      from version 1.6.3 and earler have a bug which causes them to require 
-      this information for some operations. (NAF - 2010/09/21 - Bug 1864)
-    - Fixed a bug where the library could generate an assertion/core dump when
-      a file that had been created with H5Pset_libver_bounds(fapl,
-      H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) but didn't have a superblock
-      extension was later reopened.  (QAK - 2010/09/16 - Bug 1968)
-    - Fixed a bug that could occur when getting information for a new-style
-      group that was previously opened through a file handle that was later
-      closed. (NAF - 2010/09/15)
-    - Added define check in H5public.h if stdint.h is supported by the C++
-      compiler. This define is only available on Windows with VS2010 and using
-      CMake to build the library. (ADB - 2010/09/13 - Bug 1938)
-    - When a mandatory filter failed to write data chunks, the dataset
-      couldn't close (bug 1260).  The fix releases all resources and closes
-      the dataset but returns a failure. (SLU - 2010/09/08) 
-    - H5Eset_current_stack now also closes the error stack set as the 
-      default. This is to avoid a potential problem. 
-      (SLU - 2010/09/07 - Bug 1799)
-    - Corrected situation where 1-D chunked dataset could get created by an
-      application without calling H5Pset_chunk().  H5Pset_chunk is now
-      required for creating all chunked datasets.  (QAK - 2010/09/02)
-    - Fixed many memory issues that valgrind exposed.  (QAK - 2010/08/24)
-    - Fixed the bug in the filter's public CAN_APPLY function.  The return
-      value should be htri_t not herr_t. (SLU - 2010/08/05 - Bug 1239)
-    - Fixed the STDIO VFD to use fseeko64 instead of fseek64 for 64-bit I/O 
-      support. (AKC - 2010/7/30)
-    - Fixed a bug in the direct I/O driver that could render files with certain
-      kinds of unaligned data unreadable or corrupt them. (NAF - 2010/07/28)
-    - valgrind reported an error of copying data to itself when a new attribute 
-      is written.  Fixed by taking out the memcpy step in the attribute code. 
-      (SLU - 2010/07/28 - Bug 1956)
-    - Corrected various issues in the MPI datatype creation code which could
-      cause resource leaks or incorrect behavior (and may improve the
-      performance as well).  (QAK - 2010/07/19)
-    - Fixed a bug that could cause file corruption when using non-default sizes
-      of addresses and/or lengths.  This bug could also cause uncorrupted files
-      with this property to be unreadable.  This bug was introduced in 1.8.5.
-      (NAF - 2010/07/16 - Bug 1951)
-
-    Parallel Library
-    ----------------
-    - None
+    hdfhelp at ncsa.uiuc.edu
 
-    Tools
-    -----
-    - Fixed h5diff to compare member objects and groups recursively when 
-      two files or groups are compared. (JKM - 2010/9/16 - Bug 1975)
-    - Fixed h5repack to be able to convert a dataset to COMPACT layout.
-      (JKM - 2010/09/15 - Bug 1896)
-    - Changed h5ls to not interpret special characters in object or attribute
-      names for output. (JKM - 2010/06/28 - Bug 1784)
-    - Revised the order of arguments for h5cc, h5fc, h5c++, h5pcc and h5pfc. 
-      CPPFLAGS, CFLAGS, LDFLAGS, and LIBS have been duplicated with an H5BLD_ 
-      prefix to put the flags and paths from the hdf5 build in the correct 
-      places and allow the script user to add entries in CPPFLAGS, CFLAGS, 
-      LDFLAGS, and LIBS that will take precedence over those from the hdf5 
-      build. The user can make these entries persistent by editing 
-      CFLAGSBASE, CPPFLAGSBASE, LDFLAGSBASE, and LIBSBASE near the top of 
-      the script or temporary by setting HDF5_CFLAGS, HDF5_CPPFLAGS, 
-      HDF5_LDFLAGS, or HDF5_LIBS in the environment. The new order of 
-      arguments in these scripts is $CLINKER $H5BLD_CPPFLAGS $CPPFLAGS 
-      $H5BLD_CFLAGS $CFLAGS $LDFLAGS $clibpath $link_objs $LIBS $link_args 
-      $shared_link. (LRK - 2010/10/25 - Bug 1973)
 
-    F90 API
-    ------
-    - None
+CONTENTS
 
-    C++ API
-    ------
-    - None
+- New Features
+- Bug Fixes since HDF5-1.4.4
+- Performance Improvements
+- Documentation
+- Platforms Tested
+- Supported Configuration Features
+- Known Problems
 
-    High-Level APIs:
-    ------
-    - None
 
-    Fortran High-Level APIs:
+New Features
+============
+  o Configuration
+  ================
+    * Added "unofficial support" for building with a C++ compiler (or at least
+      not failing badly when building with a C++ compiler).  QAK - 2003/01/09
+    * Added "unofficial support" for AIX 64bits.  See INSTALL for configure
+      details. AKC - 2002/08/29
+    * Added "--with-dmalloc" flag, to easily enable support for the 'dmalloc'
+      debugging malloc implementation. QAK - 2002/07/15
+
+  o Library
+  =========
+    o General
+    --------- 
+      * Allow scalar dataspaces to be used for parallel I/O.  QAK - 2002/11/05
+      * Added environment variable "HDF5_DISABLE_VERSION_CHECK", which disables
+        the version checking between the header files and the library linked
+        into an application if set to '1'.  This should be used with caution,
+        mis-matched headers and library binaries can cause _serious_ problems.
+        QAK - 2002/10/15
+      * Partially fixed space allocation inefficiencies in the file by
+        improving our algorithms for re-using freed space.  QAK - 2002/08/27
+      * API tracing has been improved. Nested API calls don't screw up the
+        output format; function call and return event times can be logged;
+        total time spent in each function can be logged.  The following
+        HDF5_DEBUG environment variable words affect tracing:
+	    trace   -- turn on/off basic tracing
+	    ttimes  -- turn on tracing and report event times and
+                       time spent in each API function.
+        ttop    -- turn on tracing but display only top-level
+                       API calls.
+
+    o APIs
     ------
-    - None
+      * Several missing fortran APIs have been added to the library:
+
+        h5get_libversion_f        h5tget_member_index_f  h5dget_storage_size_f 
+        h5check_version_f         h5tvlen_create_f       h5dvlen_get_max_len_f
+        h5garbage_collect_f                              h5dwrite_vl_f
+        h5dont_atexit_f                                  h5dread_vl_f
+
+      Functions h5dvlen_get_max_len_f, h5dwrite_vl_f, and h5dread_vl_f support
+      VL Length C APIs functionality for integer, real and string datatypes.
+      See HDF5 Reference Manual and HDF5 FORTRAN90 User's Notes for more
+      information and for the functions description.
+
+  o Parallel library
+  ==================
+    * The MPI-posix virtual file driver makes gpfs_fcntl() hints to tell
+        the underlying GPFS file system to avoid prefetching byte range
+        tokens if USE_GPFS_HINTS is defined when this file is compiled.
+        This temporary solution is intended to be removed once the HDF5
+        API supports the necessary functionality that makes it possible
+        for this sort of thing do be done at a higher software layer.
+        RPM - 2002/12/03
+    * Added MPI-posix VFL driver.  This VFL driver uses MPI functions to
+        coordinate actions, but performs I/O directly with POSIX sec(2)
+        (i.e. open/close/read/write/etc.) calls.  This driver should _NOT_
+        be used to access files that are not on a parallel filesystem.
+        The following API functions were added:
+            herr_t H5Pset_fapl_mpiposix(hid_t fapl_id, MPI_Comm comm);
+            herr_t H5Pget_fapl_mpiposix(hid_t fapl_id, MPI_Comm *comm/*out*/);
+        QAK - 2002/07/15
+
+
+
+  o Support for new platforms and languages
+  =========================================
+    * C++ API now works on the Origin2000 (IRIX6.5.14.)  BMR - 2002/11/14
+
+  
+  o Misc.
+  =========================================
+    HDF5 1.4.5 works with Portland Group Compilers (pgcc, pgf90 and pgCC 
+    version 4.0-2) on Linux 2.4 
+
+
+Bug Fixes since HDF5-1.4.4 Release
+==================================
+    * H5Fopen without the H5F_ACC_CREAT flag should not succeed in creating
+        a new file with the 'core' VFL driver.  QAK - 2003/01/24
+    * Corrected metadata caching bug in parallel I/O which could cause hangs
+        when chunked datasets were accessed with independent transfer mode.
+        QAK - 2003/01/23
+    * Allow opening objects with unknown object header messages.
+        QAK - 2003/01/21
+    * Added improved error assertion for nil VL strings.  It return error
+        stack instead of a simple assertion.  SLU - 2002/12/16
+    * Fixed h5dump bug(cannot dump data and datatype) for VL string. 
+        SLU - 2002/11/18 
+    * Fixed error condition where "none" selections were not being handled
+        correctly in serial & parallel.  QAK - 2002/10/29
+    * Fixed problem where optimized hyperslab routines were incorrectly
+        invoked for parallel I/O operations in collective mode.  QAK - 2002/07/22
+    * Fixed metadata corruption problem which could occur when many objects
+        are created in a file during parallel I/O.  QAK - 2002/07/19
+    * Fixed minor problem with configuration when users specified /usr/include
+        and /usr/lib for the --with-* options that some compilers can't
+        handle. BW - 2003/01/23
+
+
+
+Documentation
+=============
+    New PDF files are not available for this release.
 
 
 Platforms Tested
 ================
-The following platforms and compilers have been tested for this release.
-
-    AIX 6.1                       xlc 11.1.0.3
-    (NCSA BP)                     xlC 11.1.0.3
-                                  xlf 13.1.0.3
-                                  mpcc_r 11.1.0.3
-                                  mpxlf_r 13.1.0.3
-
-    FreeBSD 6.3-STABLE i386       gcc 3.4.6 [FreeBSD] 20060305
-    (duty)                        g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.4.5 20100803
-                                  g++ 4.4.5 20100803
-                                  gfortran 4.4.5 20100803
-
-    FreeBSD 6.3-STABLE amd64      gcc 3.4.6 [FreeBSD] 20060305
-    (liberty)                     g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.4.5 20100803
-                                  g++ 4.4.5 20100803
-                                  gfortran 4.4.5 20100803
-
-    Linux 2.6.18-194.3.1.el5PAE   gcc (GCC) 4.1.2 and 4.4.2
-    #1 SMP i686 i686 i386         G95 (GCC 4.0.3 (g95 0.93!) Apr 21 2010)
-    (jam)                         GNU Fortran (GCC) 4.1.2 20080704 
-                                      (Red Hat 4.1.2-48) and 4.4.2
-                                  PGI C, Fortran, C++ 10.4-0 32-bit
-                                  PGI C, Fortran, C++ 10.6-0 32-bit
-                                  Intel(R) C Compiler for 32-bit
-                                      applications, Version 11.1 
-                                  Intel(R) C++ Compiler for 32-bit
-                                      applications, Version 11.1
-                                  Intel(R) Fortran Compiler for 32-bit
-                                      applications, Version 11.1
-                                  Absoft 32-bit Fortran 95 10.0.7
-                                  MPICH mpich2-1.3.1 compiled with
-                                      gcc 4.1.2 and gfortran 4.1.2
-
-    Linux 2.6.18-194.17.1.el5     gcc 4.1.2 and 4.4.2
-    #1 SMP x86_64 GNU/Linux       G95 (GCC 4.0.3 (g95 0.93!) Apr 21 2010)
-    (amani)                           tested for both 32- and 64-bit binaries
-                                  GNU Fortran (GCC) 4.1.2 20080704
-                                      (Red Hat 4.1.2-46) and 4.4.2
-                                  Intel(R) C, C++, Fortran Compilers for 
-                                      applications running on Intel(R) 64, 
-                                      Version 11.1.
-                                  PGI C, Fortran, C++ Version 9.0-4
-                                      for 64-bit target on x86-64
-                                  MPICH mpich2-1.3.1 compiled with
-                                      gcc 4.1.2 and gfortran 4.1.2
-
-    SGI ProPack 7 Linux           Intel(R) C++ Version 11.1 20100806
-    2.6.32.19-0.3.1.1982.0.PTF-   Intel(R) Fortran Version 11.1 20100806
-    default #1 SMP                SGI MPT 2.01
-    SGI Altix UV
-    (NCSA ember)
-
-    SunOS 5.10 32- and 64-bit     Sun C 5.9 Sun OS_sparc Patch 124867-16
-    (linew)                       Sun Fortran 95 8.3 Sun OS_sparc Patch 127000-13
-                                  Sun C++ 5.9 Sun OS_sparc Patch 124863-62
-                                  Sun C 5.10 SunOS_sparc Patch 141861-07
-                                  Sun Fortran 95 8.4 SunOS_sparc Patch 128231-06
-                                  Sun C++ 5.10 SunOS_sparc 128228-11
-
-    Intel Xeon Linux 2.6.18-      gcc 4.2.4
-    92.1.10.el5_lustre.1.6.6smp-  Intel(R) C++ Version 10.1.017
-    perfctr #8 SMP                Intel(R) Fortran Compiler Version 10.1.017
-    (NCSA abe)                    Open MPI 1.3.2
-                                  MVAPICH2-1.5.1_pgi-10.8
-
-    Windows XP                    Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-                                  Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-                                  Visual Studio 2010 (cmake)
-                                  Cygwin(1.7.7 native gcc(4.3.4) compiler and gfortran)
-
-    Windows XP x64                Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-                                  Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-                                  Visual Studio 2010 (cmake)
-                                  Cygwin(1.7.7 native gcc(4.3.4) compiler and gfortran)
-
-    Windows Vista                 Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-                                  Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Windows Vista x64             Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-                                  Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Windows 7                     Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Windows 7 x64                 Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Mac OS X 10.6.3 (Intel 64-bit) i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1
-    Darwin Kernel Version 10.3.1  GNU Fortran (GCC) 4.5.0 20090910  
-                                  Intel C, C++ and Fortran compilers 11.1 20100806
-
-    Mac OS X 10.6.4 (Intel 32-bit) i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1
-    Darwin Kernel Version 10.4.0  GNU Fortran (GCC) 4.6.0 20101106
-                                  Intel C, C++ and Fortran compilers 12.0.0 20101110
-
-    Mac OS X 10.6.4 (Intel 64-bit) i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5659)
-    Darwin Kernel Version 10.6.0   GNU Fortran (GCC) 4.5.0 20090910 
-                                   Intel C, C++ and Fortran compilers 11.1 20100806
-
-    Fedora 12 2.6.32.16-150.fc12.ppc64 #1 SMP ppc64 GNU/Linux
-                                  gcc (GCC) 4.4.4 20100630 (Red Hat 4.4.4-10)
-                                  GNU Fortran (GCC) 4.4.4 20100630 (Red Hat 4.4.4-10)
-
-    Debian5.06 2.6.26-2-686 #1 SMP i686 GNU/Linux
-                                  gcc (Debian 4.3.2-1.1) 4.3.2
-                                  GNU Fortran (Debian 4.3.2-1.1) 4.3.2
-
-    Debian5.06 2.6.26-2-amd64 #1 SMP x86_64 GNU/Linux
-                                  gcc (Debian 4.3.2-1.1) 4.3.2
-                                  GNU Fortran (Debian 4.3.2-1.1) 4.3.2
-
-    Fedora14 2.6.35.6-48.fc14.i686.PAE #1 SMP i686 i686 i386 GNU/Linux
-                                  gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
-                                  GNU Fortran (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
-
-    Fedora14 2.6.35.6-48.fc14.x86_64 #1 SMP x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
-                                  GNU Fortran (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
-
-    SUSE 11.3 2.6.34.7-0.7-desktop #1 SMP PREEMPT i686 i686 i386 GNU/Linux
-                                  gcc (SUSE Linux) 4.5.0 20100604 [gcc-4_5-branch revision 160292]
-                                  GNU Fortran (SUSE Linux) 4.5.0 20100604 [gcc-4_5-branch revision 160292]
-
-    SUSE 11.3 2.6.34.7-0.7-desktop #1 SMP PREEMPT x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (SUSE Linux) 4.5.0 20100604 [gcc-4_5-branch revision 160292]
-                                  GNU Fortran (SUSE Linux) 4.5.0 20100604 [gcc-4_5-branch revision 160292]
-
-    Ubuntu 10.10 2.6.35-25-generic #44-Ubuntu SMP i686 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
-                                  GNU Fortran (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
-
-    Ubuntu 10.10 2.6.35-25-generic #44-Ubuntu SMP x86_64 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
-                                  GNU Fortran (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
-    
-    OpenVMS Alpha 8.3             HP C V7.3-009
-                                  HP Fortran V8.2-104679-48H9K
-                                  HP C++ V7.3-009
 
-Tested Configuration Features Summary
+    AIX 5.1  (32 and 64-bit)      C for AIX Compiler, Version 6
+                                  xlf 8.1.0.2
+                                  poe 3.2.0.11
+    Cray T3E sn6606 2.0.6.08      Cray Standard C Version 6.6.0.1.3 
+                                  Cray Fortran Version 3.6.0.0.12 
+    Cray SV1 10.0.1. 0            Cray Standard C Version 6.6.0.1.3
+                                  Cray Fortran Version 3.6.0.0.12
+    Cray T90IEEE 10.0.1.01u       Cray Standard C Version 6.4.0.2.3
+                                  Cray Fortran Version 3.4.0.3
+    FreeBSD 4.7                   gcc 2.95.4
+                                  g++ 2.95.5
+    HP-UX B.11.00                 HP C  HP92453-01 A.11.01.20 
+                                  HP F90 v2.4
+    IRIX 6.5                      MIPSpro cc 7.30
+    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.3.1.3m
+                                  F90 MIPSpro 7.3.1.3m (64 only)
+    Linux 2.4.18                  gcc 3.2.1
+                                  g++ 3.2.1
+                                  Intel(R) C++ Version 6.0
+                                  Intel(R) Fortran Compiler Version 6.0
+                                  PGI compilers (pgcc, pgf90, pgCC) version 4.0-2
+                                  pgf90  3.2-4
+    OSF1 V5.1                     Compaq C V6.4-014
+                                  Compaq Fortran X5.4A-1684
+                                  gcc version 3.0 for C++
+    SunOS 5.7                     WorkShop Compilers 5.0 98/12/15 C 5.0
+     (Solaris 2.7)                WorkShop Compilers 5.0 98/12/15 C++ 5.0 
+                                  WorkShop Compilers 5.0 98/10/25 
+                                  FORTRAN 90 2.0 Patch 107356-04 
+    SunOS 5.8/32                  Sun WorkShop 6 update 1 C 5.2 2000/09/11
+     (Solaris 2.8)                Sun WorkShop 6 update 1 Fortran 95 6.1 
+                                          Patch 109503-07 2001/08/11
+                                  Sun WorkShop 6 update 1 C++ 5.2 Patch
+                                        109508-04 2001/07/11
+    SunOS 5.8/64                  Sun WorkShop 6 update 1 C 5.2 2000/09/11
+     (Solaris 2.8)                Sun WorkShop 6 update 1 Fortran 95 6.1 
+                                          Patch 109503-07 2001/08/11
+                                  Sun WorkShop 6 update 1 C++ 5.2 Patch
+                                        109508-04 2001/07/11
+    TFLOPS r1.0.4 v4.3.3 i386     pgcc Rel 3.1-4i with mpich-1.2.4 with
+                                          local modifications
+    IA-32 Linux 2.4.9             gcc 2.96
+                                  Intel(R) C++ Version 7.0
+                                  Intel(R) Fortran Compiler Version 7.0
+                                  
+    IA-64 Linux 2.4.16 ia64       gcc version 2.96 20000731
+                                  Intel(R) C++ Version 7.0
+                                  Intel(R) Fortran Compiler Version 7.0
+    Windows 2000 (NT5.0)          MSVC++ 6.0
+                                  DEC Visual Fortran 6.0
+    Windows XP                    .NET
+    Windows NT4.0                 Code Warrior 6.0
+    MAC OS X                      Darwin 6.2
+                                  gcc and g++ Apple Computer, Inc. GCC 
+                                  version 1161, based on gcc version 3.1
+                                  
+
+
+Supported Configuration Features Summary
 ========================================
 
     In the tables below
-          y   = tested 
-          n   = not tested in this release
-          C   = Cluster
-          W   = Workstation
+          y   = tested and supported
+          n   = not supported or not tested in this release
           x   = not working in this release
           dna = does not apply
           ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                                 C        F90    F90      C++   zlib  SZIP
-                                         parallel        parallel
-Solaris2.10 32-bit                         n        y      n        y     y     y
-Solaris2.10 64-bit                         n        y      n        y     y     y
-Windows XP                                 n        y(4)   n        y     y     y
-Windows XP x64                             n        y(4)   n        y     y     y
-Windows Vista                              n        y(4)   n        y     y     y
-Windows Vista x64                          n        y(4)   n        y     y     y
-OpenVMS Alpha                              n        y      n        y     y     n
-Mac OS X 10.6 Intel                        n        y      n        y     y     y
-AIX 6.1 32- and 64-bit                     y        y      y        y     y     y
-FreeBSD 6.3-STABLE 32&64 bit               n        y      n        y     y     y
-CentOS 5.5 Linux 2.6.18-194 i686 GNU (1)W  y        y(2)   y        y     y     y
-CentOS 5.5 Linux 2.6.18-194 i686 Intel  W  n        y      n        y     y     n
-CentOS 5.5 Linux 2.6.18-194 i686 PGI    W  n        y      n        y     y     n
-CentOS 5.5 Linux 2.6.16 x86_64 GNU (1)  W  y        y(3)   y        y     y     y
-CentOS 5.5 Linux 2.6.16 x86_64 Intel    W  n        y      n        y     y     n
-CentOS 5.5 Linux 2.6.16 x86_64 PGI      W  n        y      n        y     y     y
-RedHat EL4 2.6.18 Xeon Lustre           C  y        y      y        y     y     n
-Fedora 12 Linux 2.6.32.16-150.fc12.ppc64   n        y      n        y     y     y
-SGI Linux 2.6.32.19                        y        y      y        y     y     y
-
-
-Platform                                 Shared  Shared    Shared    Thread-  
-                                         C libs  F90 libs  C++ libs  safe     
-Solaris2.10 32-bit                         y       y         y         y        
-Solaris2.10 64-bit                         y       y         y         y        
-Windows XP                                 y       y(4)      y         n        
-Windows XP x64                             y       y(4)      y         n        
-Windows Vista                              y       y(4)      y         y
-Windows Vista x64                          y       y(4)      y         y
-OpenVMS Alpha                              n       n         n         n
-Mac OS X 10.6                              y(5)    n         y         n        
-AIX 6.1 32- and 64-bit                     n       n         n         y        
-FreeBSD 6.3-STABLE 32&64 bit               y       n         y         y        
-CentOS 5.5 Linux 2.6.18-128 i686 GNU (1)W  y       y(2)      y         y        
-CentOS 5.5 Linux 2.6.18-128 i686 Intel  W  y       y         y         n        
-CentOS 5.5 Linux 2.6.18-128 i686 PGI    W  y       y         y         n        
-CentOS 5.5 Linux 2.6.16 x86_64 GNU (1)  W  y       y         y         y        
-CentOS 5.5 Linux 2.6.16 x86_64 Intel    W  y       y         y         n        
-CentOS 5.5 Linux 2.6.16 x86_64 PGI      W  y       y         y         n        
-RedHat EL4 2.6.18 Xeon Lustre           C  y       y         y         n
-Fedora 12 Linux 2.6.32.16-150.fc12.ppc64   y       y         y         y 
-SGI Linux 2.6.32.19                        y       y         y         y 
-
-           (1) Fortran compiled with gfortran.
-           (2) With PGI and Absoft compilers.
-           (3) With PGI compiler for Fortran.
-           (4) Using Visual Studio 2008 w/ Intel Fortran 10.1 (Cygwin shared libraries are not supported)
-           (5) C and C++ shared libraries will not be built when Fortran is enabled.
-    Compiler versions for each platform are listed in the preceding
-    "Platforms Tested" table.
 
 
-Known Problems
-==============
-* examples/run-all-ex.sh does not work on Cygwin. (NAF - 2011/02/11)
-
-* Parallel test, t_shapesame in testpar, is rather unstable as it continues to
-  have occasional errors in AIX and quite often in NCSA Abe. It is being built
-  but it is not run automatically in the "make check" command. One would have to
-  run it by hand to see if it works in a particular machine. AKC - 2011/01/28
-
-* Although OpenVMS Alpha is supported, there are several problems with the C
-  test suite - getname.c, lheap.c, lheap.c, mtime.c, and stab.c.  The test
-  suite for h5diff also fails.  These failures are from the tests, not the
-  library.  We have fixed these failures.  But it's too late to put the fixes
-  into this release.  If you install the 1.8.6 library, it should still work
-  despite of these test failures.  If you want the working copy without any
-  test failure, you can request it from us.  SLU - 2011/01/26 
-
-* If parallel gmake (e.g., gmake -j 4) is used, the "gmake clean" command
-  sometimes fails in the perform directory due to the attempt to remove the
-  executable of h5perf or h5perf_serial by two "parallel" commands. This error
-  has no consequence on the functionality of the HDF5 library or install. It
-  is fixed in the next release. AKC - 2011/01/25
-
-* While working on the 1.8.6 release of HDF5, a bug was discovered that can
-  occur when reading from a dataset in parallel shortly after it has been
-  written to collectively. The issue was exposed by a new test in the parallel
-  HDF5 test suite, but had existed before that. We believe the problem lies with
-  certain MPI implementations and/or filesystems.
-
-  We have provided a pure MPI test program, as well as a standalone HDF5
-  program, that can be used to determine if this is an issue on your system.
-  They should be run across multiple nodes with a varying number of processes.
-  These programs can be found at:
-  http://www.hdfgroup.org/ftp/HDF5/examples/known_problems/
-
-* The h5diff tool can display garbage values when variable-length strings in 
-  a compound type dataset are compared. This also occurs with variable-length 
-  string arrays in a compound type dataset. See bug #1989. This will be fixed 
-  in the next release. JKM - 2010/11/05
-
-* The AIX --enable-shared setting does not quite work. It can produce a shared 
-  library, but there cannot be more than one shared library that is 
-  interlinked. This means that the high level APIs will not work which is not 
-  very useful. We hope to have a solution in the next release. 
-  (AKC - 2010/10/15)
-  
-* H5Eset_auto can cause a seg fault for a library API call if the application
-  compiles with -DH5_USE_16_API (see bug 1707).  It will be fixed in the 
-  next release. SLU - 2010/10/5
-  
-* The library's test dt_arith.c showed a compiler's rounding problem on 
-  Cygwin when converting an unsigned long long to a long double.  The 
-  library's own conversion works fine.  We defined a macro for Cygwin to 
-  skip this test until we can solve the problem.  Please see bug #1813. 
-  SLU - 2010/5/5
-  
-* All the VFL drivers aren't backwardly compatible.  In H5FDpublic.h, the 
-  structure H5FD_class_t changed in 1.8.  A new parameter was added to the 
-  get_eoa and set_eoa callback functions, and a new callback function 
-  get_type_map was added. The public function H5FDrealloc was taken out in 
-  1.8.  The problem only happens when users define their own driver for 1.6 
-  and try to plug in a 1.8 library. This will be fixed in 1.10. SLU - 2010/2/2
-
-* MinGW has a missing libstdc++.dll.a library file and will not successfully link
-  C++ applications/tests. Do not use the enable-cxx configure option. Read all of
-  the INSTALL_MINGW.txt file for all restrictions. ADB - 2009/11/11
-  
-* The PathScale MPI implementation, accessing a Panasas file system, would 
-  cause H5Fcreate() with H5F_ACC_EXCL to fail even when the file does not 
-  exist. This is due to the MPI_File_open() call failing if the amode has 
-  the MPI_MODE_EXCL bit set. (See bug 1468 for details.) AKC - 2009/8/11
-
-* Parallel tests failed with 16 processes with data inconsistency at testphdf5
-  / dataset_readAll. Parallel tests also failed with 32 and 64 processes with
-  collective abort of all ranks at t_posix_compliant / allwrite_allread_blocks
-  with MPI IO. CMC - 2009/04/28
-
-* For Red Storm, a Cray XT3 system, the tools/h5ls/testh5ls.sh and 
-  tools/h5copy/testh5copy.sh will fail some of their sub-tests. These 
-  sub-tests are expected to fail and should exit with a non-zero code but 
-  the yod command does not propagate the exit code of the executables. Yod 
-  always returns 0 if it can launch the executable.  The test suite shell 
-  expects a non-zero for this particular test. Therefore, it concludes the 
-  test has failed when it receives 0 from yod.  To skip all the "failing" 
-  tests for now, change them as shown below.
-  
-  ======== Original tools/h5ls/testh5ls.sh =========
-  TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ======== Change to ===============================
-  echo SKIP TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ==================================================
-
-  ======== Original tools/h5copy/testh5copy.sh =========
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  H5LSTEST $FILEOUT
-  ======== Change to ===============================
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  echo SKIP H5LSTEST $FILEOUT
-  ==================================================
-  AKC - 2008/11/10
-
-* For Red Storm, a Cray XT3 system, the yod command sometimes gives the 
-  message  "yod allocation delayed for node recovery."  This interferes 
-  with test suites that do not expect to see this message.  See the "Red Storm" 
-  section in file INSTALL_parallel for a way to deal with this problem. 
-  AKC - 2008/05/28
-  
-* On an Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use the -mp -O1 compilation flags to build the libraries. A higher level 
-  of optimization causes failures in several HDF5 library tests.
-  
-* On mpich 1.2.5 and 1.2.6 on a system using four processors, if more than 
-  two processes contribute no I/O and the application asks to do collective 
-  I/O, we have found that a simple collective write will sometimes hang. This 
-  can be verified with the t_mpi test under testpar.
-  
-* A dataset created or rewritten with a v1.6.3 or later library cannot be 
-  read with the v1.6.2 or earlier library when the Fletcher32 EDC filter 
-  is enabled. There was a bug in the calculation of the Fletcher32 checksum 
-  in the library before v1.6.3; the checksum value was not consistent 
-  between big-endian and little-endian systems.  This bug was fixed in 
-  Release 1.6.3. However, after fixing the bug, the checksum value was no 
-  longer the same as before on little-endian system.  Library releases after 
-  1.6.4 can still read datasets created or rewritten with an HDF5 library of 
-  v1.6.2 or earlier. SLU - 2005/6/30
-  
-* On IBM AIX systems, parallel HDF5 mode will fail some tests with error 
-  messages like "INFO: 0031-XXX ...".  This is from the command `poe'. To 
-  work around this, set the environment variable MP_INFOLEVEL to 0 to 
-  minimize the messages and run the tests again. The tests may fail with 
-  messages like "The socket name is already in use", but HDF5 does not use 
-  sockets. This failure is due to problems with the poe command trying to 
-  set up the debug socket.  To resolve this problem, check to see whether 
-  there are any old /tmp/s.pedb.* files around. These are sockets used by 
-  the poe command and left behind if the command failed at some point. To 
-  resolve this, ask your system administrator to remove the 
-  old/tmp/s.pedb.* files, and then ask IBM to provide a means to run poe 
-  without the debug socket.
-
-* The --enable-static-exec configure flag will only statically link 
-  libraries if the static version of that library is present. If only the 
-  shared version of a library exists (i.e., most system libraries on 
-  Solaris, AIX, and Mac, for example, only have shared versions), the flag 
-  should still result in a successful compilation, but note that the 
-  installed executables will not be fully static. Thus, the only guarantee 
-  on these systems is that the executable is statically linked with just 
-  the HDF5 library.
-  
-* On an SGI Altix SMP ia64 system, the Intel compiler version 10.1 (which 
-  is the default on that system) does not work properly and results in 
-  failures during the make check (in a static build) and the make 
-  installcheck (in a shared build). This appears to be a compiler 
-  optimization problem. Reducing the optimization by setting CFLAGS to 
-  -O1 or below resolves the issue. Using a newer version of the compiler 
-  (11.0) avoids the issue. MAM - 2010/06/01
-  
-* On solaris systems, when running the examples with the scripts installed in
-  .../share/hdf5_examples, two of the c tests, h5_extlink and h5_elink_unix2win 
-  may fail or generate HDF5 errors because the script commands in c/run-c-ex.sh 
-  fail to create test directories red, blue, and u2w.  Moving the '!' in lines 
-  67, 70, 73 of run-c-ex.sh will fix the problem.  For example the script command 
-  "if ! test -d red; then" will work on solaris if changed to 
-  "if test ! -d red; then".
+    Platform             C   C         F90  F90       C++  Shared         zlib
+                             parallel       parallel       libraries (5)
+    Solaris2.6           y   n         y    n         y    y              y
+    Solaris2.7 64-bit    y   y (1)     y    y (1)     y    y              y
+    Solaris2.7 32-bit    y   y (1)     y    y (1)     y    y              y
+    Solaris2.8 64-bit    y   n         y    y (1)     y    y              y
+    Solaris2.8 32-bit    y   n         y    y (1)     y    y              y
+    IRIX6.5              y   y (1)     n    n         n    y              y 
+    IRIX64_6.5 64-bit    y   y (2)     y    y         y    y              y
+    IRIX64_6.5 32-bit    y   y (2)     n    n         n    y              y
+    HPUX11.00            y   y (1)     y    n         n    y              y
+    OSF1 v5.1            y   n         y    n         y    y              y
+    T3E             (6)  y   n         y    n         n    n              y
+    SV1                  y   n         y    n         n    n              y
+    T90 IEEE             y   n         y    n         n    n              y
+    TFLOPS               n   y (1)     n    n         n    n              y
+    AIX-5.1 32-bit       y   y         y    y         y    n              y
+    AIX-5.1 64-bit       y   y         y    y         y    n              y
+    WinXP           (7)  y   n         n    n         y    y              y
+    WinNT/2000           y   n         y    n         y    y              y
+    WinNT CW             y   n         n    n         n    n              y
+    Mac OS X 10.2        y   n         n    n         y    y              y
+    FreeBSD              y   y (1)     n    n         y    y              y
+    Linux 2.2            y   y (1)     y    y (1)     y    y              y
+    Linux 2.4 gcc   (3)  y   y (1)     y    n         y    y              y
+    Linux 2.4 Intel (3)  y   n         y    n         n    n              y
+    Linux 2.4 PGI   (3)  y   n         y    n         y    n              y
+    Linux 2.4 IA32       y   n         y    n         n    n              y
+    Linux 2.4 IA64       y   n         y    n         n    n              y
+    
 
+    Platform             static-  Thread-  SRB  GASS  STREAM-
+                         exec     safe                VFD
+    Solaris2.6           x        y        n    n     y
+    Solaris2.7 64-bit    x        y        n    n     y
+    Solaris2.7 32-bit    x        y        n    n     y
+    Solaris2.8 64-bit    x        n        n    n     y
+    Solaris2.8 32-bit    x        y        n    n     y
+    IRIX6.5              x        n        n    n     y
+    IRIX64_6.5 64-bit    x        y        n    y     y
+    IRIX64_6.5 32-bit    x        y        n    y     y
+    HPUX11.00            x        n        n    n     y
+    OSF1 v5.1            y        n        n    n     y
+    T3E             (6)  y        n        n    n     y
+    SV1                  y        n        n    n     y
+    T90 IEEE             y        n        n    n     y
+    TFLOPS               y        n        n    n     n
+    AIX-5.1 32-bit       y        n        n    n     y
+    AIX-5.1 64-bit       y        n        n    n     y
+    WinXP           (7)  dna      n        n    n     n
+    WinNT/2000           dna      n        n    n     n
+    WinNT CW             dna      n        n    n     n
+    Mac OS X 10.2        y        n        n    n     y
+    FreeBSD              y        y        n    n     y
+    Linux 2.2            y        y        n    n     y
+    Linux 2.4 gcc   (3)  y        y        n    n     y
+    Linux 2.4 Intel (3)  y        n        n    n     y
+    Linux 2.4 PGI   (3)  y        n        n    n     y
+    Linux 2.4 IA32       y        n        n    n     y
+    Linux 2.4 IA64       y        n        n    n     y
+
+    Notes: (1) Using mpich 1.2.4.
+           (2) Using mpt and mpich 1.2.4.
+           (3) Linux 2.4 with GNU, Intel, and PGI compilers.
+           (4) No HDF4-related tools.
+           (5) Shared libraries are provided only for the C library, 
+               except on Windows where they are provided for all languages.
+           (6) Debug mode only.
+           (7) Binaries only; source code for this platform is not being 
+               released at this time.
 
-%%%%1.8.5%%%%   
 
+Known Problems
+==============
 
-HDF5 version 1.8.5 released on Fri Jun  4 13:27:31 CDT 2010
-================================================================================
+    * On Linux 2.4 IA64, Fortran test fails for h5dwrite_vl_f 
+      for integer and real base datatypes.
 
-INTRODUCTION
-============
+    * When fortran library is built with Intel compilers, compilation
+      for fflush1.f90, fflush2.f90 and fortanlib_test.f90 will fail 
+      complaining about EXEC function. Comment the call to EXEC subroutine
+      in each program, or get a patch for the HDF5 Fortran source code. 
 
-This document describes the differences between HDF5-1.8.4 and HDF5 1.8.5, and
-contains information on the platforms tested and known problems in HDF5-1.8.5. 
-For more details, see the files HISTORY-1_0-1_8_0_rc3.txt and HISTORY-1_8.txt 
-in the release_docs/ directory of the HDF5 source.
+    * Fortran external dataset test fails on Linux 2.4 with pgf90 compiler.
 
-Links to the HDF5 1.8.5 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
+    * On Windows, h5dump may abort printing if a VL string is longer than 4096
+      bytes due to a compiler problem.  It'll be fixed in v1.6 release.
 
-     http://www.hdfgroup.org/products/hdf5/
+    * Datasets or attributes which have a variable-length string datatype are
+      not printing correctly with h5dump and h5ls.
 
-The HDF5 1.8.5 release can be obtained from:
+    * When a dataset with the variable-length datatype is overwritten, 
+      the library can develop memory leaks that cause the file to become 
+      unnecessarily large.  This is planned to be fixed in the next release.
 
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
+    * On the SV1, the h5ls test fails due to a difference between the 
+      SV1 printf precision and the printf precision on other platforms.
 
-User documentation for 1.8.5 can be accessed directly at this location: 
+    * The h5dump tests may fail to match the expected output on some
+      platforms (e.g. SP2 parallel, Windows) where the error messages
+      directed to "stderr" do not appear in the "right order" with output
+      from stdout.  This is not an error.
 
-     http://www.hdfgroup.org/HDF5/doc/
+    * The --enable-static-exec configure flag fails to compile for HP-UX
+      11.00 platforms.
 
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
+    * The executables are always dynamic on IRIX64 6.5(64 and n32) and 
+      IRIX 6.5 even if they are configured with --enable-static-exec.
 
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
+    * IRIX 6.5 fails to compile if configured with --enable-static-exec.
 
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.5 (current 
-release) versus Release 1.8.4":
+    * The executables are always dynamic on Solaris 2.7 ans 2.8(64 and n32)
+      even if they are configured with --enable-static-exec.
+    
+    * The HDF5_MPI_OPT_TYPES optimization code in the parallel HDF5 will cause
+      a hang in some cases when chunked storage is used.  This is now set to
+      be off by default.  One may turn it on by setting the environment 
+      variable HDF5_MPI_OPT_TYPES to a non-zero value such as 1.
 
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
+    * On OSF1 v5.1 and IA32 h5dumpgentst program that generates test files
+      for h5dump, gives segmentation fault.
 
-If you have any questions or comments, please send them to the HDF Help Desk:
+    * On Windows platforms, C and Fortran tests fail with the debug DLL version
+      of the Library if built from all_withf90.zip file.
 
-     help at hdfgroup.org
+    * On Cray T3E (sn6606 2.0.6.08 unicosmk CRAY T3E) with Cray Standard C Version 6.6.0.1.3
+      compiler optimization causes errors in many HDF5 Library tests. Use -g -h zero flags
+      to build HDF5 Library. 
 
+    * On Cray SV1 10.0.1. 0 datatype convertion test fails. Please check HDF FTP site
+      if patch is available. We will try to provide one in the nearest future. 
 
-CONTENTS
-========
+    * For configuration, building and testing with Intel and PGI compilers see
+      corresponding section in INSTALL file.
 
-- New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.4
-- Platforms Tested
-- Supported Configuration Features Summary
-- Known Problems
 
+%%%%1.4.4%%%%   Release Information for hdf5-1.4.4 (02/July/02)
 
-New Features
-============
+12.   Release information for HDF5 version 1.4.4
+==============================================================================
 
-    Configuration
-    -------------
-    - CMake Early Access: This release adds support for building HDF5 using
-      the CMake system. Initial work has targeted Windows, but other platforms
-      can be used. See the CMake.TXT file for more information. Version
-      2.8.1 of CMake is required.
-    - Configure now adds appropriate defines for supporting large (64-bit)
-      files on all systems, where supported, by default, instead of only Linux.
-      This large file support is controllable with the --enable-largefile 
-      configure option. The Linux-specific --enable-linux-lfs option has been 
-      deprecated in favor of this new option. Please note that specifying
-      --disable-large does NOT attempt to "turn off" largefile support if it
-      is natively supported by the compiler, but rather just disables 
-      configure from actively trying to add any additional compiler flags.
-      (MAM - 2010/05/05 - Bug # 1772/1434)
-    - Fixed an signal handling mask error in H5detect that might result in
-      SIGBUS or SIGSEGV failures in some platforms such as Linux on Sparc.
-      (AKC - 2010/4/28 - Bug # 1764)
-    - Fixed various "strict aliasing" problems, allowing higher levels
-      of compiler optimization (in particular, allowing '-O3' to work
-      with recent versions of GCC).  (QAK - 2010/04/26)
-    - Upgraded versions of autotools used to generate configuration suite.
-      We now use Automake 1.11.1, Autoconf 2.65, and Libtool 2.2.6b. 
-      (MAM - 2010/04/15)
-    - Added the xlc-* and mpcc_r-* BASENAME patterns to be recognized as IBM
-      compilers so that the IBM compiler options can be added properly.  This
-      allows non-system-default compiler command names (e.g. xlc-m.n.k.l) be
-      recognized. (AKC - 2009/11/26)
+INTRODUCTION
 
-    Library
-    -------
-    - Performance is substantially improved when extending a dataset with early 
-      allocation. (NAF - 2010/03/24 - Bug # 1637)
-    - Added support for filtering densely stored groups.  Many of the API
-      functions related to filters have been extended to support dense groups
-      as well as datasets.  Pipeline messages can now be stored in a group's
-      object header. (NAF/QAK - 2009/11/3)
-
-    Parallel Library
-    ----------------
-    - None
- 
-    Tools
-    -----
-    - h5dump: Added the new packed bits feature which prints packed bits stored
-      in an integer dataset. (AKC/ADB - 2010/5/7) 
-    - h5diff: Fixed incorrect behavior (hang) in parallel mode when specifying 
-      invalid options (ex: -v and -q). (JKM - 2010/02/17)
-    - h5diff: Added new flag --no-dangling-links (see --help for details).
-      (JKM - 2010/02/10) 
-    - h5diff: Added new flag --follow-symlinks (see --help for details).
-      (JKM - 2010/01/25)
-    - h5diff: Added a fix to correct the display of garbage values when 
-      displaying big-endian data on a little-endian machine. (JKM - 2009/11/20)
-
-    High-Level APIs
-    ---------------
-    - None
+This document describes the differences between HDF5-1.4.3 and
+HDF5-1.4.4, and contains information on the platforms tested and
+known problems in HDF5-1.4.4. For more details check the HISTORY.txt
+file in the HDF5 source.
 
-    F90 API
-    -------
-    - None
+The HDF5 documentation can be found on the NCSA ftp server
+(ftp.ncsa.uiuc.edu) in the directory:
 
-    C++ API
-    -------
-    - New member functions
-        + Overloaded CommonFG::getObjnameByIdx to take char* for name.
-        + Overloaded CommonFG::getObjTypeByIdx to return type name as a char*.
-          (BMR - 2010/05/10)
-        + Added DataSet::getInMemDataSize() to simplify getting the dataset's
-          data size in memory.  (BMR - 2009/07/26)
+    /HDF/HDF5/docs/
 
+For more information, see the HDF5 home page at:
+   
+    http://hdf.ncsa.uiuc.edu/HDF5/
 
-Support for New Platforms, Languages, and Compilers
-===================================================
-    - AIX 6.1 has been added. (AKC - 2010/1/4)
+If you have any questions or comments, please send them to:
 
+    hdfhelp at ncsa.uiuc.edu
 
-Bug Fixes since HDF5-1.8.4
-==========================
 
-    Configuration
-    -------------
-    - Fixed various "strict aliasing" problems, allowing higher levels
-      of compiler optimization (in particular, allowing '-O3' to work
-      with recent versions of GCC).  (QAK - 2010/04/26)
+CONTENTS
 
-    Library
-    -------
-    - Fixed a file corruption bug that could happen when shrinking a compressed
-      dataset. (NAF - 2010/05/20)
-    - Fixed some memory leaks in VL datatype conversion when strings are
-      used as fill values. (MAM - 2010/05/12 - Bug # 1826)
-    - Fixed an H5Rcreate failure when passing in a -1 for the dataspace 
-      identifier. (ADB - 2010/4/28)
-    - Fixed a bug when copying objects with NULL references with the
-      H5O_COPY_EXPAND_REFERENCE_FLAG flag set. (NAF - 2010/04/08 - Bug # 1815)
-    - Added a mechanism to the H5I interface to save returned object identifier 
-      structures for immediate re-use if needed. This addresses a potential 
-      performance issue by delaying the case when the next identifier to be
-      registered has grown so large that it wraps around and needs to be
-      checked to see whether it is available for distribution.
-      (MAM - 2010/03/15 - Bug # 1730)
-    - Files can now be concurrently opened more than once using the core file
-      driver, as long as the backing store is used. (NAF - 2010/03/09)
-    - Added support for H5O_COPY_EXPAND_EXT_LINK_FLAG to H5Ocopy.  External
-      links will now be expanded if this flag is set.
-      (NAF - 2010/03/05 - Bug # 1733)
-    - Fixed a bug where the library, when traversing an external link, would
-      reopen the source file if nothing else worked. (NAF - 2010/03/05)
-    - Fixed a bug where fractal heap identifiers for attributes and shared 
-      object header messages could be incorrectly encoded in the file for 
-      files created on big-endian platforms.  
-      Please see http://www.hdfgroup.org/HDF5/release/known_problems if you 
-      suspect you have a file with this problem.  
-      (QAK - 2010/02/23 - Bug # 1755)
-    - Fixed an intermittent bug in the b-tree code which could be triggered
-      by expanding and shrinking chunked datasets in certain ways.
-      (NAF - 2010/02/16)
-    - H5Tdetect_class said a VL string is a string type.  But when it's in
-      a compound type, it said it's a VL type.  THis has been fixed to be 
-      consistent; it now always returns a string type. 
-      (SLU - 2009/12/10 - Bug # 1584)
-    - Allow "child" files from external links to be correctly located when
-      relative to a "parent" file that is opened through a symbolic link.
-      (QAK - 2009/12/01)
-
-    Parallel Library
-    ----------------
-    - Parallel mode in AIX will fail some of the testcheck_version.sh tests
-      where it treats "exit(134) the same as if process 0 had received an abort
-      signal.  Fixed.  (AKC - 2009/11/3)
+- New Features
+- Bug Fixes since HDF5-1.4.3
+- Performance Improvements
+- Documentation
+- Platforms Tested
+- Supported Configuration Features
+- Known Problems
 
-    Tools
-    -----
-    - Fixed h5ls to return exit code 1 (error) when a non-existent file is
-      specified. (JKM - 2010/04/27 - Bug # 1793)
-    - Fixed h5copy failure when copying a dangling link that is specified 
-      directly. (JKM - 2010/04/22 - Bug # 1817)
-    - Fixed an h5repack failure that lost attributes from a dataset of 
-      reference type. (JKM - 2010/3/25 - Bug # 1726)
-    - Fixed h5repack error that set NULL for object reference values for
-      datasets, groups, or named datatypes. (JKM - 2010/03/19 - Bug # 1814)
 
-    F90 API
+New Features
+============
+  o Configuration
+  ================
+    * The H4 to H5 tools have been removed from the main source and placed 
+      in a separate package. You can get these tools from the HDF ftp site
+      (ftp://hdf.ncsa.uiuc.edu/). The "--with-hdf4" command-line option 
+      during configure is no longer valid.  BW - 2002/06/25
+
+  o Library
+  =========
+    o General
+    --------- 
+      * Fill-value forward-compatibility with release 1.5 was added.  SLU -
+        2002/04/11
+      * A new query function H5Tget_member_index has been added for compound
+        and enumeration data types.  This function retrieves a member's index 
+        by name.  SLU - 2002/04/05
+      * Added serial multi-gigabyte file size test.  "test/big -h" shows
+        the help page.  AKC - 2002/03/29
+ 
+    o APIs
     ------
-    - None 
+      * The F90 subroutines h5dwrite_f, h5dread_f, h5awrite_f, and h5aread_f 
+        were overloaded with a "dims" argument of type INTEGER(HSIZE_T) to 
+        specify the size of the array.  We recommend using these subroutines 
+        with the new type; module subroutines that accept "dims" as an i
+        INTEGER array of size 7 will be deprecated in release 1.6.  
+        EIP - 2002/05/06
+ 
+    o Performance
+    -------------
+      * Added internal "small data" aggregation, which can reduce the number of
+        actual I/O calls made, improving performance.  QAK - 2002/06/05
+      * Improved internal metadata aggregation, which can reduce the number of
+        actual I/O calls made, improving performance.  Additionally, this can
+        reduce the size of files produced.  QAK - 2002/06/04
+      * Improved internal metadata caching, which can reduce the number of
+        actual I/O calls made by a substantial amount, improving
+        performance.  QAK - 2002/06/03
+
+
+  o Parallel library
+  ==================
+    * Fixed bug in parallel I/O routines where a collective I/O which used
+      MPI derived types, followed by an independent I/O would cause the library
+      to hang.  QAK 2002/06/24
+    * Added environment variable flag to control whether creating MPI derived
+      types is preferred or not.  This can affect performance, depending on
+      which way the MPI-I/O library is optimized.  The default is set to
+      prefer MPI derived types for collective raw data transfers; setting the
+      HDF5_MPI_PREFER_DERIVED_TYPES environment variable to "0" (i.e.:
+      "setenv HDF5_MPI_PREFER_DERIVED_TYPES 0") changes the preference to avoid
+      using them whenever possible.  QAK - 2002/06/19
+    * Changed MPI I/O routines to avoid creating MPI derived types (and thus
+      needing to set the file view) for contiguous selections within datasets.
+      This should result in some performance improvement for those types of
+      selections.  QAK - 2002/06/18
+    * Changed MPI type support for collective I/O to be enabled by default.
+      This can be disabled by setting the HDF5_MPI_OPT_TYPES environment
+      variable to the value "0".  QAK - 2002/06/14
+    * Allowed chunks in chunked datasets to be cached when parallel file is
+      opened for read-only access (bug #709).  QAK - 2002/06/10
+    * Changed method for allocating chunked dataset blocks to only allocate
+      blocks that don't already exist, instead of attempting to create all the
+      blocks all the time.  This improves performance for chunked
+      datasets.  QAK - 2002/05/17
+    * Allowed the call to MPI_File_sync to be avoided when the file is going to
+      immediately be closed, improving performance.  QAK - 2002/05/13
+    * Allowed the metadata writes to be shared among all processes, easing the
+      burden on process 0.  QAK - 2002/05/10
+
+
+  o Tools
+  =======
+    * h5redeploy utility was added. It updates HDF5 compiler tools
+      after the HDF5 software has been installed in a new location.
+
+
+  o Support for new platforms and languages
+  =========================================
+    * Parallel Fortran Library works now on HP-UX B.11.00 Sys V.
+      EIP - 2002/05/06
+    * Intel C++ and F90 compilers Version 6.0 are supported on Linux 2.4.
+    * Intel C++ compilers Version 6.0 are supported on Windows 2000.
 
-    C++ API
-    ------
-    - The constructor PropList::PropList(id) was fixed to act properly
-      according to the nature of 'id'.  When 'id' is a property class 
-      identifier, a new property list will be created.  When 'id' is a 
-      property list identifier, a copy of the property list will be made. 
-      (BMR - 2010/5/9)
-    - The parameters 'size' and 'bufsize' in CommonFG::getLinkval and
-      CommonFG::getComment, respectively, now have default values for the
-      user's convenience.  (BMR - 2009/10/23)
-    - NULL pointer accessing was fixed.  (BMR - 2009/10/05 - Bug # 1061)
-    - Read/write methods of DataSet and Attribute classes were fixed
-      to handle string correctly.  (BMR - 2009/07/26)
-
-    High-Level APIs:
-    ------
-    - Fixed a bug in H5DSattach_scale, H5DSis_attached, and H5DSdetach_scale
-      caused by using the H5Tget_native_type function to determine the native
-      type for reading the REFERENCE_LIST attribute. This bug was exposed
-      on Mac PPC.  (EIP - 2010/05/22 - Bug # 1851) 
-    - Fixed a bug in the H5DSdetach_scale function when 0 bytes were   
-      allocated after the last reference to a dimension scale was removed         
-      from the list of references in a VL element of the DIMENSION_LIST 
-      attribute.  Modified the function to comply with the specification: 
-      the DIMENSION_LIST attribute is now deleted when no dimension scales 
-      are left attached.  (EIP - 2010/05/14 - Bug # 1822)
-
-    Fortran High-Level APIs:
-    ------
-    - None 
+  
+  o Misc.
+  =========================================
+   * zlib has been moved out of the Windows source release. Users should go to
+     the ZLIB homepage(http://www.zlib.org) to download the corresponding 
+     zlib library.
+   * The Windows binary release is built with the old version of the zlib 
+     library.  We expect users to use zlib 1.1.4 to build with the source 
+     release.  
+   * In the Windows-specific install document, we specify how to test backward
+     compatibility. However, in this release, we are not testing the backward
+     compatibility of HDF5.
+
+
+Bug Fixes since HDF5-1.4.3 Release
+==================================
+    * Fixed bug in chunking routines where they were using internal allocation
+        free routines, instead of malloc/free, preventing user filters from
+        working correctly.  Chunks are now allocated/freed with malloc/free and
+        so should the chunks in user filters.  QAK 2002/06/18
+    * Fixed bug where regular hyperslab selection could get incorrectly
+        transferred when the number of elements in a row did not fit evenly
+        into the buffer provided.  QAK 2002/06/12
+    * Fixed bug (#499) which allowed an "empty" compound or enumerated datatype
+        (one with no members) to be used to create a dataset or to be committed
+        to a file.  QAK - 2002/06/11
+    * Fixed bug (#777) which allowed a compound datatype to be inserted into
+        itself.  QAK - 2002/06/10
+    * Fixed bug (#789) where creating 1-D dataset region reference caused the
+        library to go into infinite loop.  QAK - 2002/06/10
+    * Fixed bug (#699, fix provided by a user) where a scalar dataspace was
+        written to the file and then subsequently queried with the
+        H5Sget_simple_extent_type function; type was reported as H5S_SIMPLE 
+        instead of H5S_SCALAR. EIP - 2002/06/04
+    * Clear symbol table node "dirty" flag when flushing symbol tables to
+        disk, to reduce I/O calls made & improve performance.  QAK - 2002/06/03
+    * Fixed bug where an object's header could get corrupted in certain
+        obscure situations when many objects were created in the
+        file.  QAK - 2002/05/31
+    * Fixed bug where read/write intent in file IDs created with H5Freopen
+        was not being kept the same as the original file.  QAK - 2002/05/14
+    * Fixed bug where selection offsets were not being used when iterating
+        through point and hyperslab selections with
+        H5Diterate().  QAK - 2002/04/29
+    * Fixed bug where the data for several level deep nested compound &
+        variable-length datatypes used for datasets were getting corrupted when
+        written to the file.  QAK - 2002/04/17
+    * Fixed bug where selection offset was being ignored for certain hyperslab
+        selections when optimized I/O was being performed.  QAK - 2002/04/02
+    * Fixed limitation in h5dumper with object names which reached over 1024
+        characters in length. We can now handle arbitrarily larger sizes for
+        object names. BW - 2002/03/29
+    * Fixed bug where variable-length string type did not behave as a
+        string.  SLU - 2002/03/28
+    * Fixed bug in H5Gget_objinfo() which was not setting the 'fileno'
+        of the H5G_stat_t struct.  QAK - 2002/03/27
+    * Fixed data corruption bug in hyperslab routines when contiguous
+        hyperslab that spans entire dimension and is larger than type
+        conversion buffer is attempted to be read.  QAK - 2002/03/26
+
+
+Performance Improvements
+========================
+    This release of the HDF5 library has been extensively tuned to improve
+performance, especially to improve parallel I/O performance.
+    Most of the specific information for particular performance improvements
+is mentioned in the "New Features" and "Bug Fixes since HDF5-1.4.3" sections
+of this document, but in general, the library should make fewer and larger
+I/O requests when accessing a file.  Additionally, improvements to the parallel
+I/O portions of the library should have reduced the communications and barriers
+used in various internal algorithms, improving the performance of the library.
+    However, with the extensive changes to some portions of the library that
+were required for these improvements, some errors or unanticipated results may
+have been introduced also.  Please report any problems encountered to our
+support team at hdfhelp at ncsa.uiuc.edu.
+    Hopefully these improvements will benefit all HDF5 applications, but if
+there are particular I/O patterns that appear to be slower than necessary,
+please send e-mail to hdfhelp at ncsa.uiuc.edu with a sample program showing the
+problem behavior; we will look into the issue to see if it is possible to
+address it.
+
+
+Documentation
+=============
+    * Documentation was updated for the hdf5-1.4.4 release.
+    * A new "HDF5 User's Guide" is under development.  See 
+      http://hdf.ncsa.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/current/.
+    * A "Parallel HDF5 Tutorial" is available at 
+      http://hdf.ncsa.uiuc.edu/HDF5/doc/Tutor/.
+    * The "HDF5 Tutorial" is not distributed with this release.  It is 
+      available at http://hdf.ncsa.uiuc.edu/HDF5/doc/Tutor/.
 
 
 Platforms Tested
 ================
-The following platforms and compilers have been tested for this release.
-
-    AIX 5.3                       xlc 7.0.0.9, 8.0.0.20, 9.0.0.4
-    (LLNL Up)                     xlC 7.0.0.9, 8.0.0.20, 9.0.0.4
-                                  xlf 9.1.0.9, 10.1.0.9, 11.1.0.7
-                                  mpcc_r 7.0.0.9
-                                  mpxlf_r 09.01.0000.0008
-
-    AIX 6.1                       xlc 10.1.0.6
-    (NCSA BP)                     xlC 10.1.0.6
-                                  xlf 12.1.0.7
-
-    Cray XT3 (2.1.56)             cc (pgcc) 10.0-0
-    (SNL red storm)               ftn (pgf90) 10.0-0
-                                  CC (pgCC) 10.0-0
-
-    FreeBSD 6.3-STABLE i386       gcc 3.4.6 [FreeBSD] 20060305
-    (duty)                        g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.3.4 20090419
-                                  g++ 4.3.4 20090419
-                                  gfortran 4.3.4 20090419
-
-    FreeBSD 6.3-STABLE amd64      gcc 3.4.6 [FreeBSD] 20060305
-    (liberty)                     g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.4.1 20090421
-                                  g++ 4.4.1 20090421
-                                  gfortran 4.4.1 20090421
-
-    Linux 2.6.18-128.1.6.el5xen   gcc (GCC) 4.1.2 20080704 and 4.4.2
-    #1 SMP i686 i686 i386         GNU Fortran (GCC) 4.1.2 20080704 and 4.4.2
-    (jam)                         g++ (GCC) 4.1.2 20080704 and 4.4.2
-                                  G95 (GCC 4.0.3 (g95 0.93!) Apr 21 2010)
-                                  Absoft 32-bit Fortran 95 10.0.7
-                                  PGI C, Fortran, C++ 10.4-0 32-bit
-                                  Intel(R) C, C++, Fortran Compilers for 32-bit
-                                     applications, Version 11.1 Build 20090827
-                                  MPICH mpich2-1.0.8 compiled with
-                                     gcc 4.1.2 and GNU Fortran (GCC) 4.1.2
-
-    Linux 2.6.18-164.el5 #1 SMP   gcc 4.1.2 20080704 and gcc 4.4.2 
-    x86_64 GNU/Linux              GNU Fortran (GCC) 4.1.2 20080704 and 4.4.2
-    (amani)                       g++ (GCC) 4.1.2 20080704 and 4.4.2 
-                                  G95 (GCC 4.0.3 (g95 0.93!) Apr 21 2010)
-                                  Intel(R) C, C++, Fortran Compilers for 
-                                     applications running on Intel(R) 64, 
-                                     Version 11.1 Build 20090827.
-                                  PGI C, Fortran, C++ Version 10.4-0
-                                         for 32 & 64-bit target on x86-64
-                                  MPICH mpich2-1.0.8 compiled with
-                                     gcc 4.1.2 and GNU Fortran (GCC) 4.1.2
-
-    Linux 2.6.16.54-0.2.5 #1      Intel(R) C++ Version 11.0.074
-    SGI Altix SMP ia64            Intel(R) Fortran Itanium(R) Version 11.0.074
-    (cobalt)                      SGI MPI 1.38
-
-    SunOS 5.10 32- and 64-bit     Sun C 5.9 SunOS_sparc Patch 124867-14
-    (linew)                       Sun Fortran 95 8.3 SunOS_sparc 
-                                     Patch 127000-13 
-                                  Sun C++ 5.9 SunOS_sparc Patch 124863-23
-                                  
-    Intel Xeon Linux 2.6.18-      Intel(R) C++ Version 10.0.026
-    92.1.10.el5_lustre.1.6.6smp-  Intel(R) Fortran Compiler Version 10.0.026
-    perfctr #7 SMP                Open MPI 1.2.2
-    (abe)                         MVAPICH2-0.9.8p28p2patched-intel-ofed-1.2
-                                  compiled with icc v10.0.026 and ifort 10.0.026
-                                  
-    Linux 2.6.18-76chaos #1 SMP   Intel(R) C, C++, Fortran Compilers for 
-    SMP x86_64 GNU/Linux          applications running on Intel(R) 64, 
-    (SNL Glory)                   Versions 11.1.
-    
-    Windows XP                    Visual Studio 2008 w/ Intel Fortran 10.1
-                                  Cygwin(1.7.5 native gcc(4.3.4) compiler and 
-                                  gfortran)
-
-    Windows XP x64                Visual Studio 2008 w/ Intel Fortran 10.1
 
-    Windows Vista                 Visual Studio 2008 w/ Intel Fortran 10.1
-
-    Windows Vista x64             Visual Studio 2008 w/ Intel Fortran 10.1
-
-    MAC OS  10.6.3 (Intel)        i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 
-    (pahra)                       GNU Fortran (GCC) 4.5.0 20090910
-                                  i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 
-                                  Intel C, C++ and Fortran compilers 11.1
-    
-    MAC OS  10.5.8 (Intel)        i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1
-    (tejeda)
-
-    MAC OS  10.5 (PPC)            powerpc-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1
-    (juniper-w)
+    AIX 4.3.3.0 (IBM SP powerpc)  xlc 5.0.2.0
+                                  mpcc_r 5.0.2.0
+                                  xlf 07.01.0000.0002
+                                  mpxlf 07.01.0000.0002
+    AIX 4.3 (IBM SP RS6000)       C for AIX Compiler, Version 5.0.2.0
+                                  xlf 7.1.0.2
+                                  poe 3.1.0.12 (includes mpi)
+    AIX 5.1                       xlc 5.0.2.0 
+                                  xlf 07.01.0000.0002
+                                  mpcc_r 5.0.2.0; mpxlf_r 07.01.0000.0002
+    Cray T3E sn6711 2.0.5.57      Cray Standard C Version 6.5.0.3
+                                  Cray Fortran Version 3.5.0.4
+    Cray SV1 10.0.1.1             Cray Standard C Version 6.5.0.3 
+                                  Cray Fortran Version 3.5.0.4
+    FreeBSD 4.6                   gcc 2.95.4
+                                  g++ 2.95.4
+    HP-UX B.10.20                 HP C  HP92453-01 A.10.32.30
+                                  HP F90 v2.3
+    HP-UX B.11.00                 HP C  HP92453-01 A.11.01.20 
+                                  HP F90 v2.4
+    HP-UX B.11.00 SysV            HP C  HP92453-01 A.11.01.20 
+                                  HP F90 v2.4
+                                  HP MPI [not a product] (03/24/2000) B6060BA
+    IRIX 6.5                      MIPSpro cc 7.30
+    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.3.1.3m
+                                  F90 MIPSpro 7.3.1.3m (64 only)
+    Linux 2.4.9-31smp             gcc 2.95.3
+                                  g++ 2.95.3
+                                  Intel(R) C++ Version 6.0
+                                  Intel(R) Fortran Compiler Version 6.0
+                                  MPICH 1.2.2
+    Linux 2.2.18smp               gcc 2.95.2
+                                  gcc 2.95.2 with mpich 1.2.1
+                                  g++ 2.95.2
+                                  pgf90 3.2-4
+    OSF1 V5.1                     Compaq C V6.4-014
+                                  Compaq Fortran V5.5-1877-48BBF
+                                  gcc version 3.0 for C++
+    SunOS 5.7                     WorkShop Compilers 5.0 98/12/15 C 5.0
+     (Solaris 2.7)                WorkShop Compilers 5.0 98/12/15 C++ 5.0 
+                                  WorkShop Compilers 5.0 98/10/25 
+                                  FORTRAN 90 2.0 Patch 107356-04 
+    SunOS 5.8/32                  Sun WorkShop 6 update 1 C 5.2 2000/09/11
+     (Solaris 2.8)                Sun WorkShop 6 update 1 Fortran 95 6.1 
+                                          Patch 109503-07 2001/08/11
+                                  Sun WorkShop 6 update 1 C++ 5.2 Patch
+                                        109508-04 2001/07/11
+    SunOS 5.8/64                  Sun WorkShop 6 update 1 C 5.2 2000/09/11
+     (Solaris 2.8)                Sun WorkShop 6 update 1 Fortran 95 6.1 
+                                          Patch 109503-07 2001/08/11
+                                  Sun WorkShop 6 update 1 C++ 5.2 Patch
+                                        109508-04 2001/07/11
+    TFLOPS r1.0.4 v4.2.2 i386     pgcc Rel 3.1-4i with mpich-1.2.3 with
+                                          local modifications
+    IA-32 Linux 2.4.9             cc Intel 5.0.1
+                                  gcc 2.96
+                                  Intel(R) C++ Version 6.0
+                                  Intel(R) Fortran Compiler Version 6.0
+                                  
+    IA-64 Linux 2.4.16 ia64       gcc version 2.96 20000731
+                                  Intel(R) C++ Version 6.0
+                                  Intel(R) Fortran Compiler Version 6.0
+    Windows 2000 (NT5.0)          MSVC++ 6.0
+                                  DEC Visual Fortran 6.0
+    Windows NT4.0                 MSVC++ 6.0
+                                  DEC Visual Fortran 6.0
+    Windows NT4.0                 Code Warrior 6.0
 
-    OpenVMS Alpha V8.3            HP C V7.3-009
-                                  HP C++ V7.3-009
-                                  HP Fortran V8.0-1-104669-48GBT      
 
 Supported Configuration Features Summary
 ========================================
 
     In the tables below
-          y   = tested and supported
-          n   = not supported or not tested in this release
-          C   = Cluster
-          W   = Workstation
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                           C        F90    F90      C++   zlib  SZIP
-                                   parallel        parallel
-Solaris2.10 32-bit                   n        y      n        y     y     y
-Solaris2.10 64-bit                   n        y      n        y     y     y
-Windows XP                           n        y(4)   n(4)     y     y     y
-Windows XP x64                       n        y(4)   n(4)     y     y     y
-Windows Vista                        n        y(4)   n(4)     y     y     y
-Windows Vista x64                    n        y(4)   n(4)     y     y     y
-Mac OS X 10.5 PPC                    n        n      n        n     y     n 
-Mac OS X 10.5 Intel                  n        y      n        y     y     y
-Mac OS X 10.6 Intel                  n        y      n        y     y     y
-AIX 5.3 32- and 64-bit               n        y      n        y     y     n
-AIX 6.1 32- and 64-bit               n        y      n        y     y     n
-FreeBSD 6.3-STABLE 32&64 bit         n        y      n        y     y     y
-RedHat EL4 2.6.9-42 i686 GNU (1)  W  y        y      y        y     y     y
-RedHat EL5 2.6.18-128 i686 GNU (1)W  y        y(2)   y        y     y     y
-RedHat EL5 2.6.18-128 i686 Intel  W  n        y      n        y     y     n
-RedHat EL5 2.6.18-128 i686 PGI    W  n        y      n        y     y     n
-SuSe Linux 2.6.16 x86_64 GNU (1)  W  y        y(3)   y        y     y     y
-SuSe Linux 2.6.16 x86_64 Intel    W  n        y      n        y     y     n
-SuSe Linux 2.6.16 x86_64 PGI      W  n        y      n        y     y     y
-SuSe Linux 2.6.16 SGI Altix ia64  C  y        y      y        y     y     y
-RedHat EL4 2.6.18 Xeon Lustre     C  y        y      y        y     y     n
-Cray XT3 2.1.56                      y        y      y        y     y     n
-OpenVMS Alpha V8.3                   n        y      n        y     y     n
-
-Platform                           Shared  Shared    Shared    Thread-  
-                                   C libs  F90 libs  C++ libs  safe     
-Solaris2.10 32-bit                   y       y         y         y        
-Solaris2.10 64-bit                   y       y         y         y        
-Windows XP                           y       y(4)      y         n        
-Windows XP x64                       y       y(4)      y         n        
-Windows Vista                        y       y(4)      y         n        
-Windows Vista x64                    y       y(4)      y         n        
-Mac OS X 10.5 PPC                    y       n         n         n        
-Mac OS X 10.5 (Intel)                y(5)    n         y         n        
-Mac OS X 10.6 (Intel)                y(5)    n         y         n        
-AIX 5.3 32- and 64-bit               n       n         n         n        
-AIX 6.1 32- and 64-bit               n       n         n         n        
-FreeBSD 6.3-STABLE 32&64 bit         y       n         y         y        
-RedHat EL4 2.6.9-42 i686 GNU (1)  W  y       y         y         y        
-RedHat EL5 2.6.18-128 i686 GNU (1)W  y       y(2)      y         y        
-RedHat EL5  2.6.18-128 i686 Intel W  y       y         y         n        
-RedHat EL5 2.6.18-128 i686 PGI    W  y       y         y         n        
-SuSe Linux 2.6.16 x86_64 GNU (1)  W  y       y         y         y        
-SuSe Linux 2.6.16 x86_64 Intel    W  y       y         y         n        
-SuSe Linux 2.6.16 x86_64 PGI      W  y       y         y         n        
-SuSe Linux 2.6.16 SGI Altix ia64  C  y                           n 
-RedHat EL4 2.6.18 Xeon Lustre     C  y       y         y         n
-Cray XT3 2.1.56                      n       n         n         n
-OpenVMS Alpha V8.3                   n       n         n         n
-
-           (1) Fortran compiled with g95.
-           (2) With PGI and Absoft compilers.
-           (3) With PGI compiler for Fortran.
-           (4) Using Visual Studio 2008. (Cygwin shared libraries are not 
-               supported.)
-           (5) Shared C and C++ are disabled when Fortran is configured in.
-    Compiler versions for each platform are listed in the preceding
-    "Platforms Tested" table.
+          y  = tested and supported
+          n  = not supported or not tested in this release
+          x  = not working in this release
+         ( ) = footnote appears below second table
+
+
+    Platform           C  C         F90  F90      C++  Shared       zlib  Tools
+                          parallel       parallel      libraries(5)
+    Solaris2.6         y  n         y    n        y    y            y     y
+    Solaris2.7 64      y  y (1)     y    n        y    y            y     y
+    Solaris2.7 32      y  y (1)     y    n        y    y            y     y
+    Solaris2.8 64      y  n         y    n        y    y            y     y
+    Solaris2.8 32      y  n         y    n        y    y            y     y
+    IRIX6.5            y  y (1)     n    n        n    y            y     y
+    IRIX64_6.5 64      y  y (2)     y    y        n    y            y     y
+    IRIX64_6.5 n32     y  y (2)     n    n        n    y            y     y
+    HPUX10.20          y  n         y    n        n    y            y     y
+    HPUX11.00          y  n         y    n        n    y            y     y
+    HPUX11 SysV        y  y         y    y        n    y            y     y
+    OSF1 v5.1          y  n         y    n        y    y            y     y
+    T3E                y  y         y    y        n    n            y     y
+    SV1                y  n         y    n        n    n            y     y
+    TFLOPS             n  y (1)     n    n        n    n            y     y (4)
+    AIX-4.3            y  y         y    y        y    n            y     y
+    AIX-5.1            y  y         y    y        n    n            y     y
+    WinNT/2000         y  n         y    n        y    y            y     y
+    WinNT CW           y  n         n    n        n    n            y     y
+    FreeBSD            y  n         n    n        y    y            y     y
+    Linux 2.2          y  y (1)     y    n        y    y            y     y
+    Linux 2.4          y  y (1)     n    n        y    y            y     y
+    Linux 2.4 Intel(6) y  n         y    n        y    n            y     y
+    Linux 2.4 IA32     y  n         y    n        n    n            y     y
+    Linux 2.4 IA64     y  n         y    n        n    n            y     y
+
+
+    Platform           1.2            static-  Thread-  SRB  GASS  STREAM-
+                       compatibility  exec     safe                VFD
+    Solaris2.6         y              x        y        n    n     y
+    Solaris2.7 64      y              x        y        n    n     y
+    Solaris2.7 32      y              x        y        n    n     y
+    Solaris2.8 64      y              y        n        n    n     y
+    Solaris2.8 32      y              x        y        n    n     y
+    IRIX6.5            y              x        n        n    n     y
+    IRIX64_6.5 64      y              x        y        n    y     y
+    IRIX64_6.5 n32     y              x        y        n    y     y
+    HPUX10.20          y              y        n        n    n     y
+    HPUX11.00          y              x        n        n    n     y
+    HPUX11 SysV        y              x        n        n    n     y
+    OSF1 v5.1          y              y        n        n    n     y
+    T3E                y              y        n        n    n     y
+    SV1                y              y        n        n    n     y
+    TFLOPS             y              y        n        n    n     n
+    AIX-4.3            y              y (3)    n        n    n     y
+    AIX-5.1            y              y        n        n    n     y
+    WinNT/2000         y              y        n        n    n     n
+    WinNT CW           n              n        n        n    n     n
+    FreeBSD            y              y        y        n    n     y
+    Linux 2.2          y              y        y        n    n     y
+    Linux 2.4          y              y        y        n    n     y
+    Linux 2.4 Intel(6) y              y        n        n    n     y
+    Linux 2.4 IA32     y              y        n        n    n     y
+    Linux 2.4 IA64     y              y        n        n    n     y
+
+
+    Footnotes: (1) Using mpich.
+               (2) Using mpt and mpich.
+               (3) When configured with static-exec enabled, tests fail in 
+                   serial mode.
+               (4) No HDF4-related tools.
+               (5) Shared libraries are provided only for the C library, 
+                   except on Windows where they are provided for all languages.
+               (6) Linux 2.4 with Intel compilers.
 
 
 Known Problems
 ==============
-* The library's test dt_arith.c exposed a compiler's rounding problem on
-  Cygwin when converting from unsigned long long to long double.  The 
-  library's own conversion works correctly.  A macro is defined for Cygwin 
-  to skip this test until we can solve the problem.  (Please see bug #1813.)
-  SLU - 2010/5/5 
-
-* All the VFL drivers aren't backward compatible.  In H5FDpublic.h, the
-  structure H5FD_class_t changed in 1.8.  There is a new parameter added to
-  get_eoa and set_eoa callback functions.  A new callback function
-  get_type_map was added.  The public function H5FDrealloc was taken
-  out in 1.8.  The problem only happens when users define their own driver
-  for 1.6 and try to plug it into a 1.8 library.  This affects a very small
-  number of users.  (See bug report #1279.)  SLU - 2010/2/2
-
-* MinGW has a missing libstdc++.dll.a library file and will not successfully 
-  link C++ applications/tests. Do not use the enable-cxx configure option. 
-  Read all of the INSTALL_MINGW.txt file for all restrictions. 
-  ADB - 2009/11/11
-  
-* Some tests in tools/h5repack may fail in AIX systems when -q32 mode is used.
-  The error is due to insufficient memory requested. Request a large amount
-  of runtime memory by setting the following environment variable for more
-  memory.
-     LDR_CNTRL=MAXDATA=0x20000000 at DSA
-  AKC - 2009/10/31
-
-* The PathScale MPI implementation, accessing a Panasas file system, would
-  cause H5Fcreate() with H5F_ACC_EXCL to fail even when the file is not
-  existing. This is due to the MPI_File_open() call failing if the amode has
-  the MPI_MODE_EXCL bit set. (See bug 1468 for details.) AKC - 2009/8/11
- 
-* Parallel tests failed with 16 processes with data inconsistency at testphdf5
-  / dataset_readAll. Parallel tests also failed with 32 and 64 processes with
-  collective abort of all ranks at t_posix_compliant / allwrite_allread_blocks
-  with MPI IO. CMC - 2009/04/28
-
-* For gcc v4.3 and v4.4, with production mode, if -O3 is used, H5Tinit.c
-  would fail to compile. Actually bad H5Tinit.c is produced.  If -O (same
-  as -O1) is used, H5Tinit.c compiled okay but test/dt_arith would fail.
-  When -O0 (no optimizatio) is used, H5Tinit.c compilete okay and all
-  tests passed. Therefore, -O0 is imposed for v4.3 and v4.4 of gcc.
-  AKC - 2009/04/20
-
-* For Red Storm, a Cray XT3 system, the tools/h5ls/testh5ls.sh and
-  tools/h5copy/testh5copy.sh will fail some of its sub-tests. These sub-tests
-  are expected to fail and should exit with a non-zero code but the yod
-  command does not propagate the exit code of the executables. Yod always
-  returns 0 if it can launch the executable.  The test suite shell expects
-  a non-zero for this particular test, therefore it concludes the test has
-  failed when it receives 0 from yod.  Skip all the "failing" test for now
-  by changing them as following.
-
-  ======== Original tools/h5ls/testh5ls.sh =========
-  TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ======== Change to ===============================
-  echo SKIP TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ==================================================
-
-  ======== Original tools/h5copy/testh5copy.sh =========
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  H5LSTEST $FILEOUT
-  ======== Change to ===============================
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  echo SKIP H5LSTEST $FILEOUT
-  ==================================================
-  AKC - 2008/11/10
-
-* For Red Storm, a Cray XT3 system, the yod command sometimes gives the
-  message,  "yod allocation delayed for node recovery".  This interferes with
-  test suites that do not expect seeing this message.  See the section of "Red
-  Storm" in file INSTALL_parallel for a way to deal with this problem.
-  AKC - 2008/05/28
-
-* On Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* On mpich 1.2.5 and 1.2.6, if more than two processes contribute no IO and 
-  the application asks to do collective IO, we have found that when using 4 
-  processors, a simple collective write will sometimes be hung. This can be 
-  verified with t_mpi test under testpar.
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  SLU - 2005/6/30
 
-* On IBM AIX systems, parallel HDF5 mode will fail some tests with error
-  messages like "INFO: 0031-XXX ...".  This is from the command `poe'.
-  Set the environment variable MP_INFOLEVEL to 0 to minimize the messages
-  and run the tests again.
+    * Datasets or attributes which have a variable-length string datatype are
+      not printing correctly with h5dump and h5ls.
 
-  The tests may fail with messages like "The socket name is already in use,"  
-  but HDF5 does not use sockets.  This failure is due to problems with the 
-  poe command trying to set up the debug socket.  To resolve this problem, 
-  check to see whether there are many old /tmp/s.pedb.* files staying around.  
-  These are sockets used by the poe command and left behind due to failed 
-  commands.  First, ask your system administrator to clean them out.  
-  Lastly, request IBM to provide a means to run poe without the debug socket.
-
-* The --enable-static-exec configure flag will only statically link libraries
-  if the static version of that library is present. If only the shared version
-  of a library exists (i.e., most system libraries on Solaris, AIX, and Mac,
-  for example, only have shared versions), the flag should still result in a 
-  successful compilation, but note that the installed executables will not be 
-  fully static. Thus, the only guarantee on these systems is that the 
-  executable is statically linked with just the HDF5 library.
-
-* There is also a configure error on Altix machines that incorrectly reports 
-  when a version of Szip without an encoder is being used.
-
-* On FREE-BSD systems when shared libraries are disabled, make install fails
-  in install-examples with the error '"Makefile", line 635: Need an operator'.
-  When this error occurs removing or commenting out the line "export
-  LD_LIBRARY_PATH=$(LL_PATH)" (line 635 in examples/Makefile) will allow make
-  install to finish installing examples.  The problem will be fixed in the
-  next release. LRK - 2010/05/26
-
-* On cobalt, an SGI Altix SMP ia64 system, Intel compiler version 10.1 (which
-  is the default on that system) does not work properly and results in
-  failures during make check (in a static build) and make installcheck (during
-  a shared build). This appears to be a compiler optimization problem.
-  Reducing optimization by setting CFLAGS to -O1 or below resolves the issue.
-  Alternatively, using a newer version of the compiler (11.0) also works as
-  intended. MAM - 2010/06/01
-
-
-%%%%1.8.4%%%%   
-
-
-HDF5 version 1.8.4 released on Tue Nov 10 15:33:14 CST 2009
-================================================================================
+    * When a dataset with the variable-length datatype is overwritten, 
+      the library can develop memory leaks that cause the file to become 
+      unnecessarily large.  This is planned to be fixed in the next release.
 
-INTRODUCTION
-============
+    * On the SV1, the h5ls test fails due to a difference between the 
+      SV1 printf precision and the printf precision on other platforms.
+
+    * The h5dump tests may fail to match the expected output on some
+      platforms (e.g. SP2 parallel, Windows) where the error messages
+      directed to "stderr" do not appear in the "right order" with output
+      from stdout.  This is not an error.
+
+    * The --enable-static-exec configure flag fails to compile for HP-UX
+      11.00 platforms.
+
+    * The executables are always dynamic on IRIX64 6.5(64 and n32) and 
+      IRIX 6.5 even if they are configured with --enable-static-exec.
+
+    * IRIX 6.5 fails to compile if configured with --enable-static-exec.
+    
+    * The HDF5_MPI_OPT_TYPES optimization code in the parallel HDF5 will cause
+      a hang in some cases when chunked storage is used.  This is now set to
+      be off by default.  One may turn it on by setting the environment 
+      variable HDF5_MPI_OPT_TYPES to a non-zero value such as 1.
+
+    * On IA32 and IA64 systems, if you use a compiler other than GCC (such as
+      Intel's ecc or icc compilers), you will need to modify the generated
+      "libtool" program after configuration is finished. On or around line 104
+      of the libtool file, there are lines which look like:
+
+          # How to pass a linker flag through the compiler.
+          wl=""
+
+      Change these lines to this:
 
-This document describes the differences between HDF5-1.8.3 and 
-HDF5 1.8.4, and contains information on the platforms tested and 
-known problems in HDF5-1.8.4
-For more details, see the files HISTORY-1_0-1_8_0_rc3.txt 
-and HISTORY-1_8.txt in the release_docs/ directory of the HDF5 source.
+          # How to pass a linker flag through the compiler.
+          wl="-Wl,"
 
-Links to the HDF5 1.8.4 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
+    * To build the Fortran library using Intel compilers, one has to 
+          x modify the source code in the fortran/src directory to remove the
+            !DEC and !MS compiler directives.
+          x The build will fail in the fortran/test directory and then in the
+            fortran/examples directory; to proceed, edit the work.pcl files in
+            those directories to contain two lines
 
-     http://www.hdfgroup.org/products/hdf5/
+                    work.pc
+                    ../src/work.pc 
 
-The HDF5 1.8.4 release can be obtained from:
+    * To build the Fortran library on IA64 use
+                   setenv CC "ecc -DIA64"
+                   setenv F9X "efc -cl,work.pcl"
+            before running configure and see the steps described above.
 
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
 
-User documentation for 1.8.4 can be accessed directly at this location: 
+%%%%1.4.3%%%%   Release Information for hdf5-1.4.3 (18/Februaru/02)
 
-     http://www.hdfgroup.org/HDF5/doc/
+11.  Release information for HDF5 version 1.4.3
+==============================================================================
 
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
 
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
+INTRODUCTION
+
+This document describes the differences between HDF5-1.4.2 and
+HDF5-1.4.3, and contains information on the platforms tested and
+known problems in HDF5-1.4.2. For more details check the HISTORY.txt
+file in the HDF5 source.
 
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.4 (current 
-release) versus Release 1.8.3":
+The HDF5 documentation can be found on the NCSA ftp server
+(ftp.ncsa.uiuc.edu) in the directory:
 
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
+     /HDF/HDF5/docs/
 
-If you have any questions or comments, please send them to the HDF Help Desk:
+For more information look at the HDF5 home page at:
+   
+    http://hdf.ncsa.uiuc.edu/HDF5/
 
-     help at hdfgroup.org
+If you have any questions or comments, please send them to:
+
+    hdfhelp at ncsa.uiuc.edu
 
 
 CONTENTS
-========
 
 - New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.3
+- Bug Fixes since HDF5-1.4.2
+- Documentation
 - Platforms Tested
-- Supported Configuration Features Summary
+- Supported Configuration Features
 - Known Problems
 
 
 New Features
 ============
+  o Configuration
+  ================
+    * Can use just enable-threadsafe if the C compiler has built-in pthreads
+      support.
+
+  o Library
+  =========
+   o General
+   --------- 
+    * Added a new test to verify the information provided by the configure
+      command.
+    * Changed internal error handling macros to reduce code size of library by
+      about 10%.
+
+   o APIs
+   ------
+    * Changed prototype for H5Awrite from:
+        H5Awrite(hid_t attr_id, hid_t type_id, void *buf)
+      to:
+        H5Awrite(hid_t attr_id, hid_t type_id, const void *buf)
+    * The H5Pset_fapl_split() accepts raw and meta file names similar to the
+      syntax of H5Pset_fapl_multi() in addition to what it used to accept.
+
+    C++ API:
+    * Added operator= to class PredType
+    * Add the overloaded member function Attribute::getName to return
+      the attribute name's length as in C API.  Note that the current
+      Attribute::getName, that returns "string", is still available.
+    * Following the change in the C library, the corresponding C++ API
+      is changed from:
+        void Attribute::write( const DataType& mem_type, void *buf )
+      to:
+        void Attribute::write( const DataType& mem_type, const void *buf )
+
+   o Performance
+   -------------
+    * Added perform programs to test the HDF5 library performance.  Programs
+      are installed in directory perform/.
+    * Improved performance of byte-swapping during data conversions.
+    * Improved performance of single, contiguous hyperslabs when reading or
+      writing.
+    * Added support to read/write portions of chunks directly, if they are
+      uncompressed and too large to cache.  This should speed up I/O on chunked
+      datasets for a few more cases.  -QAK, 1/31/02
+
+  o Parallel Library
+  ==================
+    * Parallel C HDF5 now works on HP-UX platforms, Compaq clusters,
+      Linux clusters, Cplants (alpha-linux clusters).
+
+  o Tools
+  =======
+    * A helper script called ``h5cc'', which helps compilation of HDF5
+      programs, is now distributed with HDF5. See the reference manual
+      for information on how to use this feature.
+    * The H5Dumper can now dump comments associated with groups. -WCW 01-05-02
+
+  o Support for new platforms and languages
+  =========================================
+    * HDF5 C++ Library is supported on Windows platforms (shared and static)
+    * HDF5 F90 shared library is supported on Windows platforms.
+    * HDF5 C Library is supported on IA32 and IA64 platforms.
+
+
+
+Bug Fixes since HDF5-1.4.2 Release
+==================================
+
+    * Fixed a bug when reading chunked datasets where the edge of the dataset
+      would be incorrectly detected and generate an assertion failure.
+    * Fixed a bug where reading an entire dataset wasn't being handled
+      optimally when the dataset had unlimited dimensions.  Dataset is read
+      in a single low-level I/O now, instead of being broken into separate
+      pieces internally.
+    * Fixed a bug where reading or writing chunked data which needed datatype
+      conversion could result in data values getting corrupted.
+    * Fixed a bug where appending a point selection to the current selection
+      would not actually append the point when there were no points defined
+      currently.
+    * Fixed a bug where 'or'ing a hyperslab with a 'none' selection would
+      fail.  Now adds that hyperslab as the first hyperlab in the selection.
+    * Fixed a bug in the 'big' test where quota limits weren't being detected
+      properly if they caused close() to fail.
+    * Fixed a bug in internal B-tree code where a B-tree was not being copied
+      correctly.
+    * Fixed an off-by-one error in H5Sselect_valid when hyperslab selections
+      which would allow hyperslab selections which overlapped the edge of the
+      selection by one element as valid.
+    * Fixed the internal macros used to encode & decode file metadata, to avoid
+      an unaligned access warning on IA64 machines.
+    * Corrected behavior of H5Tinsert to not allow compound datatype fields to
+      be inserted past the end of the datatype.
+    * Retired the DPSS virtual file driver (--with-gridstorage configure
+      option).
+    * Fixed bug where variable-length datatypes for attributes was not working
+      correctly.
+    * Fixed bug where raw data re-allocated from the free-list would sometimes
+      overlap with the metadata accumulator and get corrupted. QAK - 1/23/02
+    * Fixed bug where a preempted chunk in the chunk data could still be
+      used by an internal pointer and cause an assertion failure or core
+      dump. QAK - 2/13/02
+    * Fixed bug where non-zero fill-value was not being read correctly from
+      certain chunked datasets when using an "all" or contiguous hyperslab
+      selection.  QAK - 2/14/02
+
+
+Documentation
+=============
+    * Documentation was updated for the hdf5-1.4.3 release.
+    * A new "HDF5 User's Guide" is under development.  See 
+      http://hdf.ncsa.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/current/.
+    * Parallel Tutorial is available at http://hdf.ncsa.uiuc.edu/HDF5/doc/Tutor/
 
-    Configuration
-    -------------
-    - Configuration suite now uses Automake 1.11 and Autoconf 2.64.
-      MAM 2009/08/31.
-    - Changed default Gnu fortran compiler from g95 to gfortran since
-      gfortran is more likely installed with gcc now. -AKC 2009/07/19- 
 
-    Library
-    -------
-    - The embedded library information is displayed by H5check_version() if a
-      version mismatch is detected.  Also changed H5check_version() to
-      suppress the warning message totally if $HDF5_DISABLE_VERSION_CHECK is 2
-      or higher. (Old behavior treated 3 or higher the same as 1, that is
-      print a warning and allows the program to continue. (AKC - 2009/9/28)
-    - If a user does not care for the extra library information insert
-      in the executables, he may turn it off by --disable-embedded-libinfo
-      during configure. (AKC - 2009/9/15)
-
-    Parallel Library
-    ----------------
-    - None
- 
-    Tools
-    -----
-    - h5diff: h5diff treats two INFINITY values different. Fixed by checking
-      (value==expect) before call ABS(...) at h5diff_array.c. This will make 
-      that (INF==INF) is true (INF is treated as an number instead of NaN) 
-      (PC -- 2009/07/28)
-    - h5diff: add option "--use-system-epsilon" to print difference if 
-      (|a-b| > EPSILON).
-      Change default to use strict equality (PC -- 2009/09/12)
-
-    High-Level APIs
-    ---------------
-    - None
+Platforms Tested
+================
 
-    F90 API
-    -------
-     - Added H5Oopen_by_addr_f MSB - 9/14/09
+    AIX 4.3.3.0 (IBM SP powerpc)  xlc 5.0.2.0
+                                  mpcc_r 5.0.2.0
+                                  xlf 07.01.0000.0002
+                                  mpxlf 07.01.0000.0002
+    AIX 4.3 (IBM SP RS6000)       C for AIX Compiler, Version 5.0.2.0
+                                  xlf 7.1.0.2
+                                  poe 3.1.0.12 (includes mpi)
+    Cray T3E sn6711 2.0.5.57      Cray Standard C Version 6.5.0.3
+                                  Cray Fortran Version 3.5.0.4
+    Cray SV1 10.0.0.8             Cray Standard C Version 6.5.0.3 
+                                  Cray Fortran Version 3.5.0.4
+    FreeBSD 4.5                   gcc 2.95.3
+                                  g++ 2.95.3
+    HP-UX B.10.20                 HP C  HP92453-01 A.10.32.30
+                                  HP F90 v2.3
+    HP-UX B.11.00                 HP C  HP92453-01 A.11.01.20 
+                                  HP F90 v2.4
+    HP-UX B.11.00 SysV            HP C  HP92453-01 A.11.01.20 
+                                  HP F90 v2.4
+                                  HP MPI [not a product] (03/24/2000) B6060BA
+    IRIX 6.5                      MIPSpro cc 7.30
+    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.3.1.2m
+    Linux 2.4.4                   gcc 2.95.3
+                                  g++ 2.95.3
+    Linux 2.2.18smp               gcc 2.95.2
+                                  gcc 2.95.2 with mpich 1.2.1
+                                  g++ 2.95.2
+                                  pgf90 3.2-4
+    OSF1 V5.1                     Compaq C V6.3-028         
+                                  Compaq Fortran V5.4-1283
+    SunOS 5.7                     WorkShop Compilers 5.0 98/12/15 C 5.0
+     (Solaris 2.7)                Workshop Compilers 5.0 98/12/15 C++ 5.0 
+                                  Workshop Compilers 5.0 98/10/25 
+                                  FORTRAN 90 2.0 Patch 107356-04 
+    SunOS 5.8/32                  Sun WorkShop 6 update 1 C 5.2 2000/09/11
+     (Solaris 2.8)                Sun WorkShop 6 update 1 Fortran 95 6.1 
+                                          Patch 109503-07 2001/08/11
+                                  Sun WorkShop 6 update 1 C++ 5.2 Patch
+                                        109508-04 2001/07/11
+    SunOS 5.8/64                  Sun WorkShop 6 update 1 C 5.2 2000/09/11
+     (Solaris 2.8)                Sun WorkShop 6 update 1 Fortran 95 6.1 
+                                          Patch 109503-07 2001/08/11
+                                  Sun WorkShop 6 update 1 C++ 5.2 Patch
+                                        109508-04 2001/07/11
+    TFLOPS r1.0.4 v4.0.8 i386     pgcc Rel 3.1-4i with mpich-1.2.1 with
+                                          local modifications
+    IA-32 Linux 2.2.10smpx        cc Intel 5.0.1
+                                  egcs-2.91.66
+    IA-64 Linux 2.4.16 ia64       gcc version 2.96 20000731
+                                  Intel(R) C++ Itanium(TM) Compiler 
+                                  for the Itanium(TM)-based applications,
+                                  Version 6.0 Beta, Build 20010905       
+    Windows 2000 (NT5.0)          MSVC++ 6.0
+                                  DEC Visual Fortran 6.0
+    Windows NT4.0                 MSVC++ 6.0
+                                  DEC Visual Fortran 6.0
+    Windows NT4.0                 Code Warrior 6.0
+    Windows 98                    MSVC++ 6.0
+                                  DEC Visual Fortran 6.0
 
-    C++ API
-    -------
-    - None
 
+Supported Configuration Features Summary
+========================================
+
+    In the tables below
+          y  = tested and supported
+          n  = not supported or not tested in this release
+          x  = not working in this release
+         ( ) = footnote appears below second table
+
+
+    Platform       C  C         F90  F90       C++   Shared     zlib  Tools
+                      parallel       parallel        libraries
+                                                     (5)
+    Solaris2.7     y  y (1)     y    n         y     y          y     y
+    Solaris2.8 64  y  n         y    n         y     y          y     y
+    Solaris2.8 32  y  n         y    n         y     y          y     y
+    IA-64          y  n         n    n         n     n          y     y 
+    IRIX6.5        y  y (1)     n    n         n     y          y     y
+    IRIX64_6.5 64  y  y (2)     y    y         n     y          y     y
+    IRIX64_6.5 32  y  y (2)     n    n         n     y          y     y
+    HPUX10.20      y  n         y    n         n     y          y     y
+    HPUX11.00      y  y         y    n         n     y          y     y
+    HPUX11 SysV    y  y         y    n         n     y          y     y
+    DECOSF         y  n         y    n         y     y          y     y
+    T3E            y  y         y    y         n     n          y     y
+    SV1            y  n         y    n         n     n          y     y
+    TFLOPS         y  y (1)     n    n         n     n          y     y (4)
+    AIX-4.3 SP2    y  y         y    y         n     n          y     n
+    AIX-4.3 SP3    y  y         y    y         y     n          y     n
+    Win2000        y  n         y    n         y (6) y          y     y
+    Win98          y  n         y    n         y (6) y          y     y
+    WinNT          y  n         y    n         y (6) y          y     y
+    WinNT CW       y  n         n    n         n     n          y     y
+    FreeBSD        y  n         n    n         y     y          y     y
+    Linux 2.2      y  y (1)     y    n         y     y          y     y
+    Linux 2.4      y  y (1)     n    n         y     y          y     y
+
+
+    Platform       1.2            static-   Thread-  SRB  GASS	STREAM-
+                   compatibility  exec      safe                VFD
+    Solaris2.7     n              x         y        n    n     y
+    Solaris2.8 64  n              y         n        n    n     y
+    Solaris2.8 32  n              x         n        n    n     y
+    IA-64          n              n         n        n    n     y   
+    IRIX6.5        n              x         y        n    n     y
+    IRIX64_6.5 64  n              x         y        n    y     y
+    IRIX64_6.5 32  n              x         y        n    y     y
+    HPUX10.20      n              y         n        n    n     y
+    HPUX11.00      n              x         n        n    n     y
+    HPUX11 SysV    n              x         n        n    n     y
+    DECOSF         n              y         n        n    n     y
+    T3E            n              y         n        n    n     y
+    SV1            n              y         n        n    n     y
+    TFLOPS         n              y         n        n    n     n
+    AIX-4.3 SP2    n              y (3)     n        n    n     y
+    AIX-4.3 SP3    n              y         n        n    n     y
+    Win2000        n              y         n        n    n     n
+    Win98          n              y         n        n    n     n
+    WinNT          n              y         n        n    n     n
+    WinNT CW       n              n         n        n    n     n
+    FreeBSD        n              y         y        n    n     y
+    Linux 2.2      n              y         y        n    n     y
+    Linux 2.4      n              y         y        n    n     y
+
+
+    Footnotes:  (1) Using mpich.
+                (2) Using mpt and mpich.
+                (3) When configured with static-exec enabled, tests fail 
+                    in serial mode.
+                (4) No HDF4-related tools.
+                (5) Shared libraries are provided only for the C library.
+		(6) Exception of (5): DLL is available for C++ API on Windows
 
-Support for New Platforms, Languages, and Compilers
-===================================================
-    - PathScale compilers are recognized and can build the HDF5 library
-      properly. AKC - 2009/7/28 -
 
+Known Problems
+==============
 
-Bug Fixes since HDF5-1.8.3
-==========================
+    * Datasets or attributes which have a variable-length string datatype are
+      not printing correctly with h5dump and h5ls.
 
-    Configuration
-    -------------
-    - Removed the following config files, as we no longer support them:
-        config/dec-osf*, config/hpux11.00, config/irix5.x, 
-        config/powerpc-ibm-aix4.x config/rs6000-ibm-aix5.x config/unicos*
-      MAM - 2009/10/08
-    - Modified configure and make process to properly preserve user's CFLAGS
-      (and company) environment variables. Build will now properly use
-      automake's AM_CFLAGS for any compiler flags set by the configure
-      process. Configure will no longer modify CFLAGS directly, nor will 
-      setting CFLAGS during make completely replace what configure has set up.
-      MAM - 2009/10/08
-    - Support for TFLOPS, config/intel-osf1, is removed since the TFLOPS
-      machine has long retired. AKC - 2009/10/06.
-    - Added $(EXEEXT) extension to H5detect when it's executed in the
-      src/Makefile to generate H5Tinit.c so it works correctly on platforms 
-      that require the full extension when running executables.
-      MAM - 2009/10/01 - BZ #1613
-    - Configure will now set FC and CXX to "no" when fortran and c++
-      are not being compiled, respectively, so configure will not run
-      some of the compiler tests for these languages when they are not 
-      being used. MAM - 2009/10/01
-    - The --enable-static-exec flag will now properly place the -static flag
-      on the link line of all installed executables. This will force the 
-      executable to link with static libraries over shared libraries, provided
-      the static libraries are available. MAM - 2009/08/31 - BZ #1583
-    - The PathScale compiler (v3.2) was mistaken as gcc v4.2.0 but it fails to
-      recognize some gcc options. Fixed. (see bug 1301). AKC - 2009/7/28 -
+    * When a dataset with the variable-legth datatype is overwritten, 
+      the library can develop memory leaks that cause the file to become 
+      unnecessarily large.  This is planned to be fixed in the next release.
 
-    Library
-    -------
-    - Fixed a bug where writing and deleting many global heap objects (i.e.
-      variable length data) would render the file unreadable.  Previously
-      created files exhibiting this problem should now be readable.
-      NAF - 2009/10/27 - 1483
-    - Fixed error in library's internal caching mechanisms which could cause
-      an assertion failure (and attendent core dump) when encountering an
-      unusually formatted file.  (QAK - 2009/10/13)
-    - Fixed incorrect return value for H5Pget_preserve. AKC - 2009/10/08 - 1628
-    - Fixed an assertion failure that occurred when H5Ocopy was called on a
-      dataset using a vlen inside a compound. NAF - 2009/10/02 - 1597
-    - Fixed incorrect return value for H5Pget_filter_by_id1/2 in H5Ppublic.h.
-      NAF - 2009/09/25 - 1620
-    - Fixed a bug where properties weren't being compared with the registered
-      compare callback. NAF - 2009/09/25 - 1555
-    - Corrected problem where library would re-write the superblock in a file
-      opened for R/W access, even when no changes were made to the file.
-      (QAK - 2009/08/20, Bz#1473)
-    - Fixed a bug where H5Pget_filter_by_id would succeed when called for a
-      filter that wasn't present. NAF - 2009/06/25 - 1250
-    - Fixed an issue with committed compound datatypes containing a vlen. Also
-      fixed memory leaks involving committed datatypes. NAF - 2009/06/10 - 1593
-
-    Parallel Library
-    ----------------
-    - None
+    * On the SV1, the h5ls test fails due to a difference between the 
+      SV1 printf precision and the printf precision on other platforms.
 
-    Tools
-    -----
-    - h5dump/h5ls display buffer resize fixed in tools library.
-      ADB - 2009/7/21 - 1520
-    - perf_serial test added to Windows projects and check batch file. 
-      ADB - 2009/06/11 -1504
 
+    * The h5dump tests may fail to match the expected output in some
+      platforms (e.g. SP2 parallel, Windows) where the error messages
+      directed to "stderr" do not appear in the "right order" with output
+      from stdout.  This is not an error.
 
-    F90 API
-    ------
-    - Fixed bug in h5lget_info_by_idx_f by adding missing arguments, 
-      consequently changing the API. New API is:
+    * The --enable-static-exec configure flag fails to compile for HP-UX
+      11.00 platforms.
 
-      SUBROUTINE h5lget_info_by_idx_f(loc_id, group_name, index_field, order, n, &
-        link_type, f_corder_valid, corder, cset, address, val_size, hdferr, lapl_id)
+    * The executables are always dynamic on IRIX64 6.5(64 and n32) and 
+      IRIX 6.5 even if they are configured with --enable-static-exec.
 
-        MSB - 2009/9/17 - 1652
+    * IRIX 6.5 fails to compile if configured with --enable-static-exec.
+    
+    * The HDF5_MPI_OPT_TYPES optimization code in the parallel HDF5 will cause
+      a hang in some cases when chunked storage is used.  This is now set to
+      be off by default.  One may turn it on by setting environment variable
+      HDF5_MPI_OPT_TYPES to a non-zero value such as 1.
 
-    - Corrected the values for the H5L_flags FORTRAN constants: 
-        H5L_LINK_ERROR_F, H5L_LINK_HARD_F, H5L_LINK_SOFT_F, H5L_LINK_EXTERNAL_F
-        MSB - 2009-09-17 - 1653
+    * On IA64 systems one has to use -DIA64 compilation flag to compile
+      h4toh5 and h5toh4 utilites. After configuration step manually modify
+      Makefile in the tools/h4toh4 and tools/h5toh4 directories to add 
+      -DIA64 to the compilation flags.
 
-    - Added FORTRAN equivalent of C constant H5T_ORDER_NONE: H5T_ORDER_NONE_F
-        MSB - 2009-9-24 - 1471
+    * On IA32 ansd IA64 systems, if you use a compiler other than GCC 
+      (such as Intel's ecc compiler), you will need to modify the generated
+      "libtool" program after configuration is finished. On or around line 102 
+      of the libtool file, there are lines which look like:
 
-    C++ API
-    ------
-    - None
+          # How to pass a linker flag through the compiler.
+          wl=""
 
-    High-Level APIs:
-    ------
-    - Fixed a bug where the H5TB API would forget the order of fields when added
-      out of offset order. NAF - 2009/10/27 - 1582
-    - H5DSis_attached failed to account for different platform types. Added a
-      get native type call. ADB - 2009/9/29 - 1562
+      change the lines to this:
 
-    Fortran High-Level APIs:
-    ------
-    - Lite: the h5ltread_dataset_string_f and h5ltget_attribute_string_f functions 
-           had memory problems with the g95 fortran compiler. (PVN � 5/13/2009) 1522
+          # How to pass a linker flag through the compiler.
+          wl="-Wl,"
 
 
+%%%%1.4.2%%%%   Release Information for hdf5-1.4.2 (31/July/01)
+
+10.   Release Information for hdf5-1.4.2 
+=================================================================
+
+
+INTRODUCTION
+
+This document describes the differences between HDF5-1.4.1 and
+HDF5-1.4.2, and contains information on the platforms tested and
+known problems in HDF5-1.4.2.
+
+The HDF5 documentation can be found on the NCSA ftp server
+(ftp.ncsa.uiuc.edu) in the directory:
+
+     /HDF/HDF5/docs/
+
+For more information look at the HDF5 home page at:
+   
+    http://hdf.ncsa.uiuc.edu/HDF5/
+
+If you have any questions or comments, please send them to:
+
+    hdfhelp at ncsa.uiuc.edu
 
-Platforms Tested
-================
-The following platforms and compilers have been tested for this release.
-
-    AIX 5.3                       xlc 7.0.0.8
-    (LLNL Up)                     xlf 09.01.0000.0008
-                                  xlC 7.0.0.8
-                                  mpcc_r 7.0.0.8
-                                  mpxlf_r 09.01.0000.0008
-
-    Cray XT3 (2.0.41)             cc (pgcc) 7.1-4
-    (SNL red storm)               ftn (pgf90) 7.1-4
-                                  CC (pgCC) 7.1-4
-
-    FreeBSD 6.3-STABLE i386       gcc 3.4.6 [FreeBSD] 20060305
-    (duty)                        g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.3.5 20091004
-                                  g++ 4.3.5 20091004
-                                  gfortran 4.3.5 20091004
-
-    FreeBSD 6.3-STABLE amd64      gcc 3.4.6 [FreeBSD] 20060305
-    (liberty)                     g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.4.2 20091006
-                                  g++ 4.4.2 20091006
-                                  gfortran 4.4.2 20091006
-
-    Linux 2.6.18-164.el5          gcc (GCC) 4.1.2 20080704
-    #1 SMP i686 i686 i386         G95 (GCC 4.0.3 (g95 0.92!) Jun 24 2009)
-    (jam)                         GNU Fortran (GCC) 4.1.2 20080704 
-                                  (Red Hat 4.1.2-46)
-                                  PGI C, Fortran, C++ 8.0-5 32-bit
-                                  PGI C, Fortran, C++ 8.0-1 32-bit
-                                  Intel(R) C Compiler for 32-bit
-                                      applications, Versions 11.0, 11.1
-                                  Intel(R) C++ Compiler for 32-bit
-                                      applications, Version 11.0, 11.1
-                                  Intel(R) Fortran Compiler for 32-bit
-                                      applications, Version 11.0, 11.1
-                                  Absoft 32-bit Fortran 95 10.0.7
-                                  MPICH mpich2-1.0.8 compiled with
-                                  gcc (GCC) 4.1.2 and G95 
-                                  (GCC 4.0.3 (g95 0.92!)
-
-    Linux 2.6.18-164.el5 #1 SMP   gcc 4.1.2 20080704
-    x86_64 GNU/Linux              G95 (GCC 4.0.3 (g95 0.92!) Jun 24 2009)
-    (amani)                       tested for both 32- and 64-bit binaries
-                                  Intel(R) C, C++, Fortran Compilers for 
-                                  applications running on Intel(R) 64, 
-                                  Versions 11.1.
-                                  PGI C, Fortran, C++ Version 9.0-4
-                                         for 64-bit target on x86-64
-                                  gcc 4.1.2 and G95  (GCC 4.0.3 (g95 0.92!)
-                                  MPICH mpich2-1.0.8 compiled with
-                                  gcc 4.1.2 and G95 (GCC 4.0.3 (g95 0.92!)
-                                  GNU Fortran (GCC) 4.1.2 20080704
-                                  (Red Hat 4.1.2-46)
-
-
-    Linux 2.6.16.60-0.42.5 #1     Intel(R) C++ Version 10.1.017
-    SGI Altix SMP ia64            Intel(R) Fortran Itanium(R) Version 10.1.017
-    (cobalt)                      SGI MPI 1.38
-
-    SunOS 5.10 32- and 64-bit     Sun C 5.9 SunOS_sparc Patch 124867-11 2009/04/30
-    (linew)                       Sun Fortran 95 8.3 SunOS_sparc 
-                                  Patch 127000-11 2009/10/06
-                                  Sun C++ 5.9 SunOS_sparc 
-                                  Patch 124863-16 2009/09/15 
-
-    Intel Xeon Linux 2.6.18-      Intel(R) C++ Version 10.0.026
-    92.1.10.el5_lustre.1.6.6smp-  Intel(R) Fortran Compiler Version 10.0.026
-    perfctr #6 SMP                Open MPI 1.2.2
-    (abe)                         MVAPICH2-0.9.8p28p2patched-intel-ofed-1.2
-                                  compiled with icc v10.0.026 and ifort 10.0.026
-
-    IA-64 Linux 2.4.21-309.tg1    gcc (GCC) 3.2.2
-    #1 SMP ia64                   Intel(R) C++ Version 8.1.037
-    (NCSA tg-login)               Intel(R) Fortran Compiler Version 8.1.033
-                                  mpich-gm-1.2.7p1..16-intel-8.1.037-r1
-
-    Linux 2.6.9-55.0.9.EL_lustre  Intel(R) C, C++, Fortran Compilers for 
-    .1.4.11.1smp #1 SMP           applications running on Intel(R) 64, 
-    SMP x86_64 GNU/Linux          Versions 10.1.
-    (SNL Thunderbird)             
-                                  
-    Linux 2.6.18-76chaos #1 SMP   Intel(R) C, C++, Fortran Compilers for 
-    SMP x86_64 GNU/Linux          applications running on Intel(R) 64, 
-    (SNL Glory)                   Versions 10.1.
-    
-    Windows XP                    Visual Studio 2005 w/ Intel Fortran 9.1
-                                  Cygwin(native gcc compiler and g95)
 
-    Windows XP x64                Visual Studio 2005 w/ Intel Fortran 9.1
+CONTENTS
+
+- New Features
+- Bug Fixes since HDF5-1.4.1
+- Documentation
+- Platforms Tested
+- Supported Configuration Features
+- Known Problems
+
+
+New Features
+============
+
+    * File sizes greater than 2GB are now supported on Linux systems with
+      version 2.4.x or higher kernels.
+    * Added a global string variable H5_lib_vers_info_g which holds the
+      HDF5 library version information.  This can be used to identify
+      an hdf5 library or hdf5 application binary.
+      Also added a verification of the consistency between H5_lib_vers_info_g
+      and other version information in the source code.
+    * Parallel HDF5 now runs on the HP V2500 and HP N4000 machines.
+    * F90 API:
+        - Added aditional parameter "dims" to the h5dread_f/h5dwrite_f and
+          h5aread_f/h5awrite_f subroutines.  This parameter is a 1-D array 
+          of size 7 and contains the sizes of the data buffer dimensions. 
+          This change enables portability between Windows and UNIX platforms.
+          In previous versions of the F90 APIs, the data buffer parameters of 
+          the above functions were declared as assumed-shape arrays, which 
+          were passed to the C functions by a descriptor.  There is no 
+          portable means, however, of passing descriptors from F90 to C, 
+          causing portability problems between Windows and UNIX and among
+          UNIX platforms.  With this change, the data buffers are assumed-
+          size arrays, which can be portably passed to the C functions.
+    * F90 static library is available on Windows platforms. 
+      See INSTALL_Windows_withF90.txt for details.
+    * F90 APIs are available on HPUX 11.00 and 10.20 and IBM SP platforms.
+    * H5 <-> GIF convertor has been added. This is available under 
+      tools/gifconv. The convertor supports the ability to create animated
+      gifs as well.
+    * Verified correct operation of library on Solaris 2.8 in both 64-bit and
+      32-bit compilation modes.  See INSTALL document for instructions on
+      compiling the distribution with 64-bit support.
+    * Added support for the Metrowerks Code Warrior compiler for Windows.  
+    * For H4->H5 converter utility, added a new option to choose not to convert
+      HDF4 specified attributes(reference number, class) into HDF5 attributes.
+    * Added support chunking and compression in SDS and image in H4->H5 converter. 
+      Currently HDF5 only supports gzip compression, so by default an HDF4 file 
+      with any other compression method will be converted into an HDF5 file in 
+      gzip compression. 
+    * correct the order or reading HDF4 image array in H4->H5 conversion.  
+    * Added new parallel hdf5 tests in t_mpi.  The new test checks if the
+      filesystem or the MPI-IO can really handle greater than 2GB files.
+      If it fails, it prints information message only without failing the
+      test.
+    * Added a parallel HDF5 example examples/ph5example.c to illustrate
+      the basic way of using parallel HDF5.
+    * Added a new public macro, H5_VERS_INFO, which is a string holding
+      the HDF5 library version information.  This string is also compiled
+      into all HDF5 binary code which helps to identify the version information
+      of the binary code.  One may use the Unix strings command on the binary
+      file and looks for the pattern "HDF5 library version".
+    * Added new checking in H5check_version() to verify the five HDF5 version
+      information macros (H5_VERS_MAJOR, H5_VERS_MINOR, H5_VERS_RELEASE,
+      H5_VERS_SUBRELEASE and H5_VERS_INFO) are consistent.
+      
+         
+Bug Fixes since HDF5-1.4.1 Release
+==================================
+
+    * Fixed bug with non-zero userblock sizes causing raw data to not
+      write correctly.
+    * Fixed problems with Pablo build and linking with non-standard MPI I/O.
+    * Fixed build on Linux systems with --enable-static-exec flag. It now
+      works correctly.
+    * IMPORTANT: Fixed file metadata corruption bug which could cause 
+      metadata data loss in certain situations.
+    * The allocation by alignment (H5Pset_alignment) feature code somehow
+      got dropped in some 1.3.x version. Re-implemented it with "new and
+      improved" algorithm.  It keeps track of "wasted" file-fragment in
+      the free-list too.
+    * Removed limitation that the data transfer buffer size needed to be
+      set for datasets whose dimensions were too large for the 'all' 
+      selection code to handle.  Any size dimensioned datasets should be 
+      handled correctly now.
+    * Changed behavior of H5Tget_member_type to correctly emulate HDF5 v1.2.x
+      when --enable-hdf5v1_2 configure flag is enabled.
+    * Added --enable-linux-lfs flag to allow more control over whether to 
+      enable or disable large file support on Linux.
+    * Fixed various bugs releated to SDS dimensional scale conversions in H4->H5 
+      converter.
+    * Fixed a bug to correctly convert HDF4 objects with fill value into HDF5.
+    * Fixed a bug of H5pubconf.h causing repeated definitions if it is included
+      more than once.  hdf5.h now includes H5public.h which includes
+      H5pubconf.h.  Applications should #include hdf5.h which handles multiple
+      inclusion correctly.
+    * Fixed H5FDmpio.h to be C++ friendly by making Parallel HDF5 API's to be
+      external to C++.
+    * Fixed a bug in H5FD_mpio_flush() that might result in negative file seek
+      if both MPIO and Split-file drivers are used together.
+
+
+
+Documentation
+=============
+
+    * The H5T_conv_t and H5T_cdata_t structures are now properly defined
+      in the H5Tregister entry in the "H5T" section of the "HDF5 Reference 
+      Manual" and described in detail in section 12, "Data Conversions," in 
+      the "Datatypes" chapter of the "HDF5 User's Guide."
+    * The new tools h52gif and gif2h5 have been added to the "Tools" section
+      of the Reference Manual.
+    * A "Freespace Management" section has been added to the "Performance" 
+      chapter of the User's Guide.
+    * Several user-reported bugs have been fixed since Release 1.4.1.
+    * The "HDF5 Image and Palette Specification" (in the "HDF5 Application
+      Developer's Guide") has been heavily revised.  Based on extensive user 
+      feedback and input from visualization software developers, Version 1.2 
+      of the image specification is substantially different from prior 
+      versions.
 
-    Windows Vista                 Visual Studio 2005 w/ Intel Fortran 9.1
 
-    Windows Vista x64             Visual Studio 2005 w/ Intel Fortran 9.1
+Platforms Tested
+================
 
-    MAC OS  10.5.6 (Intel)        i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1
-                                  GNU Fortran (GCC) 4.3.0 20070810
-                                  G95 (GCC 4.0.3 (g95 0.91!) Apr 24 2008)
-                                  Intel C, C++ and Fortran compilers 10.1
+    AIX 4.3.3.0 (IBM SP powerpc)  xlc 3.6.6.0
+                                  mpcc_r 3.6.6.0
+                                  xlf 07.01.0000.0002
+                                  mpxlf 07.01.0000.0002
+    AIX 4.3 (IBM SP RS6000)       C for AIX Compiler, Version 5.0.2.0
+                                  xlf 7.1.0.2
+                                  poe 2.4.0.14 (includes mpi)
+    Cray T3E sn6711 2.0.5.49a     Cray Standard C Version 6.5.0.1
+    Cray SV1 10.0.0.2             Cray Standard C Version 6.5.0.1  
+                                  Cray Fortran Version 3.5.0.1
+    FreeBSD 4.3                   gcc 2.95.3
+                                  g++ 2.95.3
+    HP-UX B.10.20                 HP C  HP92453-01 A.10.32.30
+                                  HP F90 v2.3
+    HP-UX B.11.00                 HP C  HP92453-01 A.11.01.20 
+                                  HP F90 v2.4
+    HP-UX B.11.00 SysV            HP C  HP92453-01 A.11.01.20 
+                                  HP F90 v2.4
+    IRIX 6.5                      MIPSpro cc 7.30
+    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.3.1.2m
+    Linux 2.4.4                   gcc 2.95.3
+                                  g++ 2.95.3
+    Linux 2.2.18smp               gcc 2.95.2
+                                  gcc 2.95.2 with mpich 1.2.1
+                                  g++ 2.95.2
+                                  pgf90 3.2-4
+    OSF1 V4.0                     DEC-V5.2-040 on Digital UNIX V4.0 (Rev 564)
+                                  Digital Fortran 90 V4.1-270
+    SunOS 5.6                     WorkShop Compilers 5.0 98/12/15 C 5.0 
+     (Solaris 2.6)                WorkShop Compilers 5.0 98/10/25 FORTRAN 90 
+                                          2.0 Patch 107356-04
+    SunOS 5.7                     WorkShop Compilers 5.0 98/12/15 C 5.0
+     (Solaris 2.7)                Workshop Compilers 5.0 98/12/15 C++ 5.0 
+                                  Workshop Compilers 5.0 98/10/25 FORTRAN 90
+                                          2.0 Patch 107356-04 
+    SunOS 5.8/32                  Sun WorkShop 6 update 1 C 5.2 2000/09/11
+     (Solaris 2.8)                Sun WorkShop 6 update 1 Fortran 95 6.1 
+                                          2000/09/11
+                                  Sun WorkShop 6 update 1 C++ 5.2 2000/09/11
+    SunOS 5.8/64                  Sun WorkShop 6 update 1 C 5.2 2000/09/11
+     (Solaris 2.8)                Sun WorkShop 6 update 1 Fortran 95 6.1 
+                                          2000/09/11
+                                  Sun WorkShop 6 update 1 C++ 5.2 2000/09/11
+    TFLOPS r1.0.4 v4.0.7 i386     pgcc Rel 3.1-4i with mpich-1.2.1 with
+                                          local modifications
+    Windows 2000 (NT5.0)          MSVC++ 6.0
+    Windows NT4.0                 MSVC++ 6.0
+                                  DEC Visual Fortran 6.0
+    Windows NT4.0                 Code Warrior 6.0
+    Windows 98                    MSVC++ 6.0
+                                  DEC Visual Fortran 6.0
 
 
 Supported Configuration Features Summary
 ========================================
 
     In the tables below
-          y   = tested and supported
-          n   = not supported or not tested in this release
-          C   = Cluster
-          W   = Workstation
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                           C        F90    F90      C++   zlib  SZIP
-                                   parallel        parallel
-Solaris2.10 32-bit                   n        y      n        y     y     y
-Solaris2.10 64-bit                   n        y      n        y     y     y
-Windows XP                           n        y(4)   n(4)     y     y     y
-Windows XP x64                       n        y(4)   n(4)     y     y     y
-Windows Vista                        n        n      n        y     y     y
-Mac OS X 10.5 Intel                  n        y      n        y     y     y
-AIX 5.3 32- and 64-bit               n        y      n        y     y     n
-FreeBSD 6.3-STABLE 32&64 bit         n        y      n        y     y     y
-RedHat EL5 2.6.18-164 i686 GNU (1)W  y        y(2)   y        y     y     y
-RedHat EL5 2.6.18-164 i686 Intel  W  n        y      n        y     y     n
-RedHat EL5 2.6.18-164 i686 PGI    W  n        y      n        y     y     n
-RedHat EL5 2.6.18-164 x86_64 GNU(1)W y        y(3)   y        y     y     y
-RedHat EL5 2.6.18-164 x86_64 IntelW  n        y      n        y     y     n
-RedHat EL5 2.6.18-164 x86_64 PGI  W  n        y      n        y     y     y
-SuSe Linux 2.6.16 SGI Altix ia64  C  y        y      y        y     y     y
-RedHat EL4 2.6.18 Xeon Lustre     C  y        y      y        y     y     n
-SuSe Linux 2.4.21 ia64 Intel      C  y        y      y        y     y     n
-Cray XT3 2.0.62                      y        y      y        y     y     n
-
-
-Platform                           Shared  Shared    Shared    Thread-  
-                                   C libs  F90 libs  C++ libs  safe     
-Solaris2.10 32-bit                   y       y         y         y        
-Solaris2.10 64-bit                   y       y         y         y        
-Windows XP                           y       y(4)      y         y        
-Windows XP x64                       y       y(4)      y         y        
-Windows Vista                        y       n         n         y        
-Mac OS X 10.5                        y       n         y         n        
-AIX 5.3 32- and 64-bit               n       n         n         n        
-FreeBSD 6.3-STABLE 32&64 bit         y       y         y         y        
-RedHat EL5 2.6.18-164 i686 GNU (1)W  y       y(2)      y         y        
-RedHat EL5 2.6.18-164 i686 Intel  W  y       y         y         n        
-RedHat EL5 2.6.18-164 i686 PGI    W  y       y         y         n        
-RedHat EL5 2.6.18-164 x86_64 GNU(1)W y       y         y         y        
-RedHat EL5 2.6.18-164 x86_64 IntelW  y       y         y         n        
-RedHat EL5 2.6.18-164 x86_64 PGI  W  y       y         y         n        
-SuSe Linux 2.6.16 SGI Altix ia64  C  y                           n        
-RedHat EL4 2.6.18 Xeon Lustre     C  y       y         y         n
-SuSe Linux 2.4.21 ia64 Intel      C  y       y         y         n        
-Cray XT3 2.0.62                      n       n         n         n
-
-           (1) Fortran compiled with g95.
-           (2) With PGI and Absoft compilers.
-           (3) With PGI compiler for Fortran.
-           (4) Using Visual Studio 2005 or Cygwin
-    Compiler versions for each platform are listed in the preceding
-    "Platforms Tested" table.
+          y  = tested and supported
+          n  = not supported or not tested in this release
+          x  = not working in this release
+         ( ) = footnote appears below second table
+
+
+    Platform       C  C         F90  F90       C++  Shared     zlib  Tools
+                      parallel       parallel       libraries
+                                                    (5)
+    Solaris2.6     y  n         y    n         y    y          y     y
+    Solaris2.7     y  y (1)     y    n         y    y          y     y
+    Solaris2.8 64  y  n         n    n         y    y          y     y
+    Solaris2.8 32  y  n         y    n         y    y          y     y
+    IRIX6.5        y  y (1)     n    n         n    y          y     y
+    IRIX64_6.5 64  y  y (2)     y    y         n    y          y     y
+    IRIX64_6.5 32  y  y (2)     n    n         n    y          y     y
+    HPUX10.20      y  n         y    n         n    y          y     y
+    HPUX11.00      y  n         y    n         n    y          y     y
+    HPUX11 SysV    y  n         y    n         n    y          y     y
+    DECOSF         y  n         y    n         n    y          y     y
+    T3E            y  y         y    y         n    n          y     y
+    SV1            y  n         y    n         n    n          y     y
+    TFLOPS         y  y (1)     n    n         n    n          y     y (4)
+    AIX-4.3 SP2    y  y         y    y         n    n          y     n
+    AIX-4.3 SP3    y  y         y    y         n    n          y     n
+    Win2000        y  n         n    n         n    y          y     y
+    Win98          y  n         y    n         n    y          y     y
+    WinNT          y  n         y    n         n    y          y     y
+    WinNT CW       y  n         n    n         n    n          y     y
+    FreeBSD        y  n         n    n         y    y          y     y
+    Linux 2.2      y  y (1)     y    n         y    y          y     y
+    Linux 2.4      y  y (1)     n    n         y    y          y     y
+
+
+    Platform       1.2            static-   Thread-  SRB  GASS	STREAM-
+                   compatibility  exec      safe                VFD
+    Solaris2.6     y              x         n        n    n     y
+    Solaris2.7     y              x         y        n    n     y
+    Solaris2.8 64  y              y         n        n    n     y
+    Solaris2.8 32  y              x         n        n    n     y
+    IRIX6.5        y              x         y        n    n     y
+    IRIX64_6.5 64  y              x         n        n    n     y
+    IRIX64_6.5 32  y              x         n        n    n     y
+    HPUX10.20      y              y         n        n    n     y
+    HPUX11.00      y              x         n        n    n     y
+    HPUX11 SysV    y              x         n        n    n     y
+    DECOSF         y              y         n        n    n     y
+    T3E            y              y         n        n    n     y
+    SV1            y              y         n        n    n     y
+    TFLOPS         y              y         n        n    n     n
+    AIX-4.3 SP2    y              y (3)     n        n    n     y
+    AIX-4.3 SP3    y              y         n        n    n     y
+    Win2000        y              y         n        n    n     n
+    Win98          n              y         n        n    n     n
+    WinNT          y              y         n        n    n     n
+    WinNT CW       n              n         n        n    n     n
+    FreeBSD        y              y         n        n    n     y
+    Linux 2.2      y              y         y        n    n     y
+    Linux 2.4      y              y         y        n    n     y
+
+
+    Footnotes:  (1) Using mpich.
+                (2) Using mpt and mpich.
+                (3) When configured with static-exec enabled, tests fail 
+                    in serial mode.
+                (4) No HDF4-related tools.
+                (5) Shared libraries are provided only for the C library.
 
 
 Known Problems
 ==============
-* Parallel mode in AIX will fail some of the testcheck_version.sh tests where
-  it treats "exit(134) the same as if process 0 had received an abort signal.
-  This is fixed and will be available in the next release. AKC - 2009/11/3
-
-* Some tests in tools/h5repack may fail in AIX systems when -q32 mode is used.
-  The error is due to insufficient memory requested. Request a large amount
-  of runtime memory by setting the following environment variable for more
-  memory.
-     LDR_CNTRL=MAXDATA=0x20000000 at DSA
-  AKC - 2009/10/31
-
-* The PathScale MPI implementation, accessing a Panasas file system, would
-  cause H5Fcreate() with H5F_ACC_EXCL to fail even when the file is not
-  existing. This is due to the MPI_File_open() call failing if the amode has
-  the MPI_MODE_EXCL bit set. (See bug 1468 for details.) AKC - 2009/8/11
- 
-* Parallel tests failed with 16 processes with data inconsistency at testphdf5
-  / dataset_readAll. Parallel tests also failed with 32 and 64 processes with
-  collective abort of all ranks at t_posix_compliant / allwrite_allread_blocks
-  with MPI IO. CMC - 2009/04/28
-
-* There is a known issue in which HDF5 will change the timestamp on a file 
-  simply by opening it with read/write permissions, even if the file is not
-  modified in any way. This is due to the way in which HDF5 manages the file 
-  superblock. A fix is currently underway and should be included in the 1.8.4
-  release of HDF5. MAM - 2009/04/28
-
-* For gcc v4.3 and v4.4, with production mode, if -O3 is used, H5Tinit.c
-  would fail to compile. Actually bad H5Tinit.c is produced.  If -O (same
-  as -O1) is used, H5Tinit.c compiled okay but test/dt_arith would fail.
-  When -O0 (no optimizatio) is used, H5Tinit.c compilete okay and all
-  tests passed. Therefore, -O0 is imposed for v4.3 and v4.4 of gcc.
-  AKC - 2009/04/20
-
-* For Red Storm, a Cray XT3 system, the tools/h5ls/testh5ls.sh and
-  tools/h5copy/testh5copy.sh will fail some of its sub-tests. These sub-tests
-  are expected to fail and should exit with a non-zero code but the yod
-  command does not propagate the exit code of the executables. Yod always
-  returns 0 if it can launch the executable.  The test suite shell expects
-  a non-zero for this particular test, therefore it concludes the test has
-  failed when it receives 0 from yod.  Skip all the "failing" test for now
-  by changing them as following.
-
-  ======== Original tools/h5ls/testh5ls.sh =========
-  TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ======== Change to ===============================
-  echo SKIP TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ==================================================
-
-  ======== Original tools/h5copy/testh5copy.sh =========
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  H5LSTEST $FILEOUT
-  ======== Change to ===============================
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  echo SKIP H5LSTEST $FILEOUT
-  ==================================================
-  AKC - 2008/11/10
-
-* For Red Storm, a Cray XT3 system, the yod command sometimes gives the
-  message,  "yod allocation delayed for node recovery".  This interferes with
-  test suites that do not expect seeing this message.  See the section of "Red
-  Storm" in file INSTALL_parallel for a way to deal with this problem.
-  AKC - 2008/05/28
-
-* On Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* On mpich 1.2.5 and 1.2.6, if more than two processes contribute no IO and 
-  the application asks to do collective IO, we have found that when using 4 
-  processors, a simple collective write will sometimes be hung. This can be 
-  verified with t_mpi test under testpar.
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  SLU - 2005/6/30
 
-* On IBM AIX systems, parallel HDF5 mode will fail some tests with error
-  messages like "INFO: 0031-XXX ...".  This is from the command `poe'.
-  Set the environment variable MP_INFOLEVEL to 0 to minimize the messages
-  and run the tests again.
+    * When a dataset with the variable-legth datatype is overwritten, 
+      the library can develop memory leaks that cause the file to become 
+      unnecessarily large.  This is planned to be fixed in the next release.
 
-  The tests may fail with messages like "The socket name is already in use",  
-  but HDF5 does not use sockets.  This failure is due to problems with the 
-  poe command trying to set up the debug socket.  To resolve this problem, 
-  check to see whether there are many old /tmp/s.pedb.* files staying around.  
-  These are sockets used by the poe command and left behind due to failed 
-  commands.  First, ask your system administrator to clean them out.  
-  Lastly, request IBM to provide a means to run poe without the debug socket.
+    * On the SV1, the h5ls test fails due to a difference between the 
+      SV1 printf precision and the printf precision on other platforms.
 
-* The --enable-static-exec configure flag will only statically link libraries
-  if the static version of that library is present. If only the shared version
-  of a library exists (i.e., most system libraries on Solaris, AIX, and Mac, 
-  for example, only have shared versions), the flag should still result in a 
-  successful compilation, but note that the installed executables will not be 
-  fully static. Thus, the only guarantee on these systems is that the 
-  executable is statically linked with just the HDF5 library.
+    * The h5dump tests may fail to match the expected output in some
+      platforms (e.g. SP2 parallel, Windows) where the error messages
+      directed to "stderr" do not appear in the "right order" with output
+      from stdout.  This is not an error.
 
-* There is also a configure error on Altix machines that incorrectly reports 
-  when a version of Szip without an encoder is being used.
+    * The --enable-static-exec configure flag fails to compile for HP-UX
+      11.00 platforms.
 
-%%%%1.8.3%%%%   
+    * The executables are always dynamic on IRIX64 6.5(64 and n32) and 
+      IRIX 6.5 even if they are configured with --enable-static-exec.
 
+    * IRIX 6.5 fails to compile if configured with --enable-static-exec.
+    
+    * For 24-bit image conversion from H4->H5, the current conversion is
+      not consistent with HDF5 image specification. 
 
-HDF5 version 1.8.3 released on Mon May  4 09:21:00 CDT 2009
-================================================================================
+    * In some cases, and SDS with an UNLIMITED dimension that has not
+      been written (current size = 0) is not converted correctly.
 
-INTRODUCTION
-============
+    * After "make install" or "make install-doc" one may need to reload
+      the source from the tar file before doing another build.
 
-This document describes the differences between HDF5-1.8.2 and 
-HDF5 1.8.3, and contains information on the platforms tested and 
-known problems in HDF5-1.8.3. 
-For more details, see the files HISTORY-1_0-1_8_0_rc3.txt 
-and HISTORY-1_8.txt in the release_docs/ directory of the HDF5 source.
+    * The HDF5_MPI_OPT_TYPES optimization code in the parallel HDF5 will cause
+      a hang in some cases when chunked storage is used.  This is now set to
+      be off by default.  One may turn it on by setting environment variable
+      HDF5_MPI_OPT_TYPES to a non-zero value such as 1.
 
-Links to the HDF5 1.8.3 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
+%%%%1.4.1%%%%   Release Information for hdf5-1.4.1 (April/01)
 
-     http://www.hdfgroup.org/products/hdf5/
+9.   Release Information for hdf5-1.4.1 (April/01)
+=====================================================================
 
-The HDF5 1.8.3 release can be obtained from:
 
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
+ 
+                       HDF5 Release 1.4.1
 
-User documentation for 1.8.3 can be accessed directly at this location: 
 
-     http://www.hdfgroup.org/HDF5/doc/
+INTRODUCTION
 
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
+This document describes the differences between HDF5-1.4.0 and
+HDF5-1.4.1, and contains information on the platforms tested and
+known problems in HDF5-1.4.1.
 
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
+The HDF5 documentation can be found on the NCSA ftp server
+(ftp.ncsa.uiuc.edu) in the directory:
 
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.3 (current 
-release) versus Release 1.8.2":
+     /HDF/HDF5/docs/
 
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
+For more information look at the HDF5 home page at:
+   
+    http://hdf.ncsa.uiuc.edu/HDF5/
 
-If you have any questions or comments, please send them to the HDF Help Desk:
+If you have any questions or comments, please send them to:
 
-     help at hdfgroup.org
+    hdfhelp at ncsa.uiuc.edu
 
 
 CONTENTS
-========
 
 - New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.2
+- Bug Fixes since HDF5-1.4.0
+- Documentation
 - Platforms Tested
-- Supported Configuration Features Summary
+- Supported Configuration Features
 - Known Problems
 
 
 New Features
 ============
 
-    Configuration
-    -------------
-    - Added libtool version numbers to generated c++, fortran, and 
-      hl libraries. MAM 2009/04/19.
-    - Regenerated Makefile.ins using Automake 1.10.2. MAM 2009/04/19.
-    - Added a Make target of check-all-install to test the correctness of
-      installing via the prefix= or $DESTDIR options. AKC - 2009/04/14
-
-    Library
-    -------
-    - Embed the content of libhdf5.settings into the hdf5 executables
-      so that an "orphaned" executables can display (via the Unix
-      strings command, for example) the library settings used to build
-      the executables.  This is a prototype implementation. Improvement will
-      be added in next release.  AKC - 2009/04/20
-    - Separated "factory" free list class from block free lists. These free
-      lists are dynamically created and manage blocks of a fixed size.
-      H5set_free_list_limits() will use the same settings specified for block
-      free lists for factory free lists. NAF - 2009/04/08
-    - Added support for dense attributes to H5Ocopy. XCao/NAF - 2009/01/29
-    - Added H5Pset_elink_cb and H5Pget_elink_cb functions to support a
-      user-defined callback function for external link traversal.
-      NAF - 2009/01/08
-    - Added H5Pset_elink_acc_flags and H5Pget_elink_acc_flags functions to
-      allow the user to specify the file access flags used to open the target
-      file of an external link. NAF - 2009/01/08
-    - Added H5Pset_chunk_cache() and H5Pget_chunk_cache() functions to allow
-      individual rdcc configuration for each dataset.  Added
-      H5Dget_access_plist() function to retrieve a dataset access property
-      list from a dataset. NAF - 2008/11/12
-    - Added H5Iis_valid() function to check if an id is valid without
-      producing an error message. NAF - 2008/11/5
-    - Added code to maintain a min_clean_fraction in the metadata cache when
-      in serial mode. MAM - 2009/01/9
-
-    Parallel Library
-    ----------------
-    - Modified parallel tests to run with arbitrary number of processes. The
-      modified tests are testphdf5 (parallel dataset access), t_chunk_alloc
-      (chunk allocation), and t_posix_compliant (posix compliance). The rest of
-      the parallel tests already use in the code the number of processes
-      available in the communicator. (CMC - 2009/04/28)
- 
-    Tools
-    -----
-    - h5diff new flag, -c, --compare, list objects that are not comparable.
-      PVN - 2009/4/2 - 1368
-    - h5diff new flag, -N, --nan, avoids NaNs detection. PVN - 2009/4/2
-    - h5dump correctly specifies XML dtd / schema urls ADB - 2009/4/3 - 1519
-    - h5repack now handles group creation order. PVN - 2009/4/2 - 1402
-    - h5repack: When user doesn't specify a chunk size, h5repack now 
-      defines a default chunk size as the same size of the size of the 
-      hyperslab used to read the chunks. The size of the hyperslabs are 
-      defined as the size of each dimension or a predefined constant, 
-      whatever is smaller. This assures that the chunk read fits in the 
-      chunk cache. PVN - 2008/11/21
-
-    High-Level APIs
-    ---------------
-    - Table: In version 3.0 of Table, the writing of the "NROWS" attribute 
-      (used to store number of records) was deprecated. PVN - 2008/11/24
-
-    F90 API
-    -------
-    - Added for the C APIs the Fortran wrappers:
-          h5dget_access_plist_f
-          h5iis_valid_f
-          h5pset_chunk_cache_f
-          h5pget_chunk_cache_f
-      MSB - 2009/04/17
-
-    C++ API
-    -------
-    - None
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-
-
-Bug Fixes since HDF5-1.8.2
-==========================
-
-    Configuration
-    -------------
-    - The --includedir=DIR configuration option now works as intended, and 
-      can be used to specify the location to install C header files. The
-      default location remains unchanged, residing at ${prefix}/include.
-      MAM - 2009/03/10 - BZ #1381
-    - Configure no longer removes the '-g' flag from CFLAGS when in production
-      mode if it has been explicitly set in the CFLAGS environment variable 
-      prior to configuration. MAM - 2009/03/09 - BZ #1401
+   * XML output option for h5dump utility.
+  
+     A new option --xml to output data in XML format has been added. The
+     XML output contains a complete description of the file, marked up in
+     XML. 
 
-    Library
-    -------
-    - Added versioning to H5Z_class_t struct to allow compatibility with 1.6
-      API. NAF - 2009/04/20 - 1533
-    - Fixed a problem with using data transforms with non-native types in the
-      file. NAF - 2009/04/20 - 1548
-    - Added direct.h include file to windows section of H5private.h 
-      to fix _getcwd() warning. ADB - 2009/04/14 - 1536
-    - Fixed a bug that prevented external links from working after calling
-      H5close(). NAF - 2009/04/10 - 1539
-    - Modified library to write cached symbol table information to the
-      superblock, to allow library versions 1.3.0 to 1.6.3 to read files created
-      by this version. NAF - 2009/04/08 - 1423
-    - Changed skip lists to use a deterministic algorithm.  The library should
-      now never call rand() or srand(). NAF - 2009/04/08 - 503
-    - Fixed a bug where H5Lcopy and H5Lmove wouldn't create intermediate groups
-      when that property was set. NAF - 2009/04/07 - 1526
-    - Fixed a bug that caused files with a user block to grow by the size of the
-      user block every time they were opened. NAF - 2009/03/26 - 1499
-    - Fixed a rare problem that could occur with files using the old (pre 1.4)
-      array datatype. NAF - 2009/03/23
-    - Modified library to be able to open files with corrupt root group symbol
-      table messages, and correct these errors if they are found.  Such files
-      can only be successfully opened with write access. NAF - 2009/03/23 - 1189
-    - Removed the long_long #define and replaced all instances with 
-      "long long". This caused problems with third party products. All 
-      currently supported compliers support the type. ADB - 2009/03/05
-    - Fixed various bugs that could prevent the fill value from being written
-      in certain rare cases. NAF - 2009/02/26 - 1469
-    - Fixed a bug that prevented more than one dataset chunk from being cached
-      at a time. NAF - 2009/02/12 - 1015
-    - Fixed an assertion failure caused by opening an attribute multiple times
-      through multiple file handles. NAF - 2009/02/12 - 1420
-    - Fixed a problem that could prevent the user from adding attributes (or any
-      object header message) in some circumstances. NAF - 2009/02/12 - 1427
-    - Fixed a bug that could cause problems when an attribute was added to a
-      committed datatype using the committed datatype's datatype.
-      NAF - 2009/02/12
-    - Fixed a bug that could cause problems when copying an object with a shared
-      message in its own object header. NAF - 2009/01/29
-    - Changed H5Tset_order to properly reject H5T_ORDER_NONE for most datatypes.
-      NAF - 2009/01/27 - 1443
-    - Fixed a bug where H5Tpack wouldn't remove trailing space from an otherwise
-      packed compound type. NAF - 2009/01/14
-    - Fixed up some old v2 btree assertions that get run in debug mode that
-      were previously failing on compilation, and removed some of the 
-      more heavily outdated and non-rewritable ones. MAM - 2008/12/15
-    - Fixed a bug that could cause problems when "automatically" unmounting
-      multiple files. NAF - 2008/11/17
-    - H5Dset_extent: when shrinking dimensions, some chunks were not deleted.  
-      PVN - 2009/01/8 
-
-    Parallel Library
-    ----------------
-    - None
+     The XML conforms to the HDF5 Document Type Definition (DTD), which
+     is available at:
 
-    Tools
-    -----
-    - Fixed many problems that could occur when using h5repack with named
-      datatypes. NAF - 2009/4/20 - 1516/1466
-    - h5dump, h5diff, h5repack were not reading (by hyperslabs) datasets 
-      that have a datatype datum size greater than H5TOOLS_BUFSIZE, a constant
-      defined as 1024Kb, such as array types with large dimensions. 
-      PVN - 2009/4/1 - 1501
-    - h5import: By selecting a compression type, a big endian byte order 
-      was being selected. PVN - 2009/3/11 - 1462
-    - zip_perf.c had missing argument on one of the open() calls. Fixed.
-      AKC - 2008/12/9
+       http://hdf.ncsa.uiuc.edu/DTDs/HDF5-File.dtd
 
-    F90 API
-    ------
-    - None
+     The XML output is suitable for use with other tools, including the
+     Java Tools:
 
-    C++ API
-    ------
-    - None
+       http://hdf.ncsa.uiuc.edu/java-hdf5-html
 
-    High-Level APIs:
-    ------
-    - Dimension scales: The scale index return value in H5DSiterate_scales 
-      was not always incremented. PVN - 2009/4/8 - 1538
 
-    Fortran High-Level APIs:
-    ------
-    - Lite: The h5ltget_dataset_info_f function (gets information about 
-      a dataset) was not correctly returning the dimension array 
-                                   PVN - 2009/3/23
+Bug Fixes since HDF5-1.4.0 Release
+==================================
 
+   * h4toh5 utility: conversion of images is fixed
 
-Platforms Tested
-================
-The following platforms and compilers have been tested for this release.
-
-    AIX 5.3                       xlc 7.0.0.8
-    (LLNL Up)                     xlf 09.01.0000.0008
-                                  xlC 7.0.0.8
-                                  mpcc_r 7.0.0.8
-                                  mpxlf_r 09.01.0000.0008
-
-    Cray XT3 (2.0.41)             cc (pgcc) 7.1-4
-    (SNL red storm)               ftn (pgf90) 7.1-4
-                                  CC (pgCC) 7.1-4
-
-    FreeBSD 6.3-STABLE i386       gcc 3.4.6 [FreeBSD] 20060305
-    (duty)                        g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.3.4 20090419
-                                  g++ 4.3.4 20090419
-                                  gfortran 4.3.4 20090419
-
-    FreeBSD 6.3-STABLE amd64      gcc 3.4.6 [FreeBSD] 20060305
-    (liberty)                     g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.4.1 20090421
-                                  g++ 4.4.1 20090421
-                                  gfortran 4.4.1 20090421
-
-    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.4.4m
-                                  F90 MIPSpro 7.4.4m 
-                                  C++ MIPSpro cc 7.4.4m
-
-    Linux 2.6.18-128.1.6.el5xen   gcc (GCC) 4.1.2
-    #1 SMP i686 i686 i386         G95 (GCC 4.0.3 (g95 0.92!) Feb 4 2009)
-    (jam)                         PGI C, Fortran, C++ 7.2-1 32-bit
-                                  PGI C, Fortran, C++ 8.0-1 32-bit
-                                  Intel(R) C Compiler for 32-bit
-                                      applications, Versions 10.1, 11.0
-                                  Intel(R) C++ Compiler for 32-bit
-                                      applications, Version 10.1, 11.0
-                                  Intel(R) Fortran Compiler for 32-bit
-                                      applications, Version 10.1, 11.0
-                                  Absoft 32-bit Fortran 95 10.0.7
-                                  MPICH mpich2-1.0.8 compiled with
-                                  gcc 4.1.2 and G95  (GCC 4.0.3 (g95 0.92!)
-
-    Linux 2.6.9-42.0.10.ELsmp #1  gcc (GCC) 3.4.6
-    SMP i686 i686 i386            G95 (GCC 4.0.3 (g95 0.92!) Feb 4 2009)
-    (kagiso)                      MPICH mpich2-1.0.8 compiled with
-                                  gcc 3.4.6 and G95  (GCC 4.0.3 (g95 0.92!)
-
-    Linux 2.6.16.60-0.37-smp #1   gcc 4.1.2
-    SMP x86_64 GNU/Linux          G95 (GCC 4.0.3 (g95 0.92!) Feb 4 2009)
-    (smirom)                      Intel(R) C, C++, Fortran Compilers for 
-                                  applications running on Intel(R) 64, 
-                                  Versions 10.1, 11.0.
-                                  PGI C, Fortran, C++ Version 7.2-1, 8.0-1
-                                         for 64-bit target on x86-64
-                                  gcc 4.1.2 and G95  (GCC 4.0.3 (g95 0.92!)
-                                  MPICH mpich2-1.0.8 compiled with
-                                  gcc 4.1.2 and G95 (GCC 4.0.3 (g95 0.92!)
-                                  tested for both 32- and 64-bit binaries
-
-    Linux 2.6.16.54-0.2.5 #1      Intel(R) C++ Version 10.1.017
-    SGI Altix SMP ia64            Intel(R) Fortran Itanium(R) Version 10.1.017
-    (cobalt)                      SGI MPI 1.38
-
-    SunOS 5.10 32- and 64-bit     Sun WorkShop 6 update 2 C 5.9 Patch 124867-09
-    (linew)                       Sun WorkShop 6 update 2 Fortran 95 8.3 
-                                  Patch 127000-07
-                                  Sun WorkShop 6 update 2 C++ 5.8 
-                                  Patch 124863-11
-
-    Intel Xeon Linux 2.6.18-      gcc 3.4.6 20060404
-    92.1.10.el5_lustre.1.6.6smp-  Intel(R) C++ Version 10.0.026
-    perfctr #2 SMP                Intel(R) Fortran Compiler Version 10.0.026
-    (abe)                         Open MPI 1.2.2
-                                  MVAPICH2-0.9.8p28p2patched-intel-ofed-1.2
-                                  compiled with icc v10.0.026 and ifort 10.0.026
-
-    IA-64 Linux 2.4.21-309.tg1    gcc (GCC) 3.2.2
-    #1 SMP ia64                   Intel(R) C++ Version 8.1.037
-    (NCSA tg-login)               Intel(R) Fortran Compiler Version 8.1.033
-                                  mpich-gm-1.2.7p1..16-intel-8.1.037-r1
-
-    Linux 2.6.9-55.0.9.EL_lustre  Intel(R) C, C++, Fortran Compilers for 
-    .1.4.11.1smp #1 SMP           applications running on Intel(R) 64, 
-    SMP x86_64 GNU/Linux          Versions 9.1.
-    (SNL Spirit)             
-                                  
-    Linux 2.6.9-55.0.9.EL_lustre  Intel(R) C, C++, Fortran Compilers for 
-    .1.4.11.1smp #1 SMP           applications running on Intel(R) 64, 
-    SMP x86_64 GNU/Linux          Versions 10.1.
-    (SNL Thunderbird)             
-                                  
-    Linux 2.6.18-63chaos #1 SMP   Intel(R) C, C++, Fortran Compilers for 
-    SMP x86_64 GNU/Linux          applications running on Intel(R) 64, 
-    (SNL Glory)                   Versions 10.1.
-    
-    Linux 2.6.18-63chaos #1 SMP   Intel(R) C, C++, Fortran Compilers for 
-    SMP x86_64 GNU/Linux          applications running on Intel(R) 64, 
-    (LLNL Zeus)                   Versions 9.1.
-				  gcc/gfortran/g++ (GCC) 4.1.2.
+     Earlier releases of the h4toh5 utility produced images that did not
+     correctly conform to the HDF5 Image and Palette Specification.
 
-    Windows XP                    Visual Studio .NET
-                                  Visual Studio 2005 w/ Intel Fortran 9.1
-                                  Cygwin(native gcc compiler and g95)
+       http://hdf.ncsa.uiuc.edu/HDF5/doc/ImageSpec.html
 
-    Windows XP x64                Visual Studio 2005 w/ Intel Fortran 9.1
+     Several required HDF5 attributes are omitted, and the dataspace
+     is reversed (i.e., the ht. and width of the image dataset is
+     incorrectly described.)  For more information, please see:
 
-    Windows Vista                 Visual Studio 2005
+       http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageDetails.htm
 
-    MAC OS  10.5.6 (Intel)        i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1
-                                  GNU Fortran (GCC) 4.3.0 20070810
-                                  G95 (GCC 4.0.3 (g95 0.91!) Apr 24 2008)
-                                  Intel C, C++ and Fortran compilers 10.1
+   * Fixed bug with contiguous hyperslabs not being detected, causing
+     slower I/O than necessary.
+   * Fixed bug where non-aligned hyperslab I/O on chunked datasets was
+     causing errors during I/O
+   * The RCSID string in H5public.h was causing the C++ compiling problem
+     because when it was included multiple times, C++ did not like
+     multiple definitions of the same static variable. All occurance of
+     RCSID definition are removed since we have not used it consistently
+     before.
 
 
-Supported Configuration Features Summary
-========================================
+Documentation
+=============
 
-    In the tables below
-          y   = tested and supported
-          n   = not supported or not tested in this release
-          C   = Cluster
-          W   = Workstation
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                           C        F90    F90      C++   zlib  SZIP
-                                   parallel        parallel
-Solaris2.10 32-bit                   n        y      n        y     y     y
-Solaris2.10 64-bit                   n        y      n        y     y     y
-IRIX64_6.5 32-bit                    n        n      n        n     y     y
-IRIX64_6.5 64-bit                    n        y      y        y     y     y
-Windows XP                           n        y(4)   n(4)     y     y     y
-Windows XP x64                       n        y(4)   n(4)     y     y     y
-Windows Vista                        n        n      n        y     y     y
-Mac OS X 10.5 Intel                  n        y      n        y     y     y
-AIX 5.3 32- and 64-bit               n        y      n        y     y     n
-FreeBSD 6.3-STABLE 32&64 bit         n        y      n        y     y     y
-RedHat EL4 2.6.9-42 i686 GNU (1)  W  y        y      y        y     y     y
-RedHat EL5 2.6.18-128 i686 GNU (1)W  y        y(2)   y        y     y     y
-RedHat EL5 2.6.18-128 i686 Intel  W  n        y      n        y     y     n
-RedHat EL5 2.6.18-128 i686 PGI    W  n        y      n        y     y     n
-SuSe Linux 2.6.16 x86_64 GNU (1)  W  y        y(3)   y        y     y     y
-SuSe Linux 2.6.16 x86_64 Intel    W  n        y      n        y     y     n
-SuSe Linux 2.6.16 x86_64 PGI      W  n        y      n        y     y     y
-SuSe Linux 2.6.16 SGI Altix ia64  C  y        y      y        y     y     y
-RedHat EL4 2.6.18 Xeon Lustre     C  y        y      y        y     y     n
-SuSe Linux 2.4.21 ia64 Intel      C  y        y      y        y     y     n
-Cray XT3 2.0.41                      y        y      y        y     y     n
-
-
-Platform                           Shared  Shared    Shared    Thread-  
-                                   C libs  F90 libs  C++ libs  safe     
-Solaris2.10 32-bit                   y       y         y         y        
-Solaris2.10 64-bit                   y       y         y         y        
-IRIX64_6.5 32-bit                    y       dna       y         y        
-IRIX64_6.5 64-bit                    y       y         n         y        
-Windows XP                           y       y(4)      y         y        
-Windows XP x64                       y       y(4)      y         y        
-Windows Vista                        y       n         n         y        
-Mac OS X 10.5                        y       n         y         n        
-AIX 5.3 32- and 64-bit               n       n         n         n        
-FreeBSD 6.3-STABLE 32&64 bit         y       n         y         y        
-RedHat EL4 2.6.9-42 i686 GNU (1)  W  y       y         y         y        
-RedHat EL5 2.6.18-128 i686 GNU (1)W  y       y(2)      y         y        
-RedHat EL5  2.6.18-128 i686 Intel W  y       y         y         n        
-RedHat EL5 2.6.18-128 i686 PGI    W  y       y         y         n        
-SuSe Linux 2.6.16 x86_64 GNU (1)  W  y       y         y         y        
-SuSe Linux 2.6.16 x86_64 Intel    W  y       y         y         n        
-SuSe Linux 2.6.16 x86_64 PGI      W  y       y         y         n        
-SuSe Linux 2.6.16 SGI Altix ia64  C  y                           n        
-RedHat EL4 2.6.18 Xeon Lustre     C  y       y         y         n
-SuSe Linux 2.4.21 ia64 Intel      C  y       y         y         n        
-Cray XT3 2.0.41                      n       n         n         n
-
-           (1) Fortran compiled with g95.
-           (2) With PGI and Absoft compilers.
-           (3) With PGI compiler for Fortran.
-           (4) Using Visual Studio 2005 or Cygwin
-    Compiler versions for each platform are listed in the preceding
-    "Platforms Tested" table.
+    PDF and Postscript versions of the following documents are available 
+    for this release:
+        Document                                 Filename
+        --------                                 --------
+        Introduction to HDF5                     H5-R141-Introduction.pdf
+        HDF5 Reference Manual                    H5-R141-RefManual.pdf 
+        C++ APIs to HDF5 documents               H5-R141-Cplusplus.pdf
+        Fortran90 APIs to HDF5 documents         H5-R141-Fortran90.pdf
 
+        PDF and Postscript files containing      H5-R141-DocSet.pdf
+            all of the above                     H5-R141-DocSet.ps
 
-Known Problems
-==============
-* Parallel tests failed with 16 processes with data inconsistency at testphdf5
-  / dataset_readAll. Parallel tests also failed with 32 and 64 processes with
-  collective abort of all ranks at t_posix_compliant / allwrite_allread_blocks
-  with MPI IO. CMC - 2009/04/28
-
-* There is a known issue in which HDF5 will change the timestamp on a file 
-  simply by opening it with read/write permissions, even if the file is not
-  modified in any way. This is due to the way in which HDF5 manages the file 
-  superblock. A fix is currently underway and should be included in the 1.8.4
-  release of HDF5. MAM - 2009/04/28
-
-* For gcc v4.3 and v4.4, with production mode, if -O3 is used, H5Tinit.c
-  would fail to compile. Actually bad H5Tinit.c is produced.  If -O (same
-  as -O1) is used, H5Tinit.c compiled okay but test/dt_arith would fail.
-  When -O0 (no optimizatio) is used, H5Tinit.c compilete okay and all
-  tests passed. Therefore, -O0 is imposed for v4.3 and v4.4 of gcc.
-  AKC - 2009/04/20
-
-* For Red Storm, a Cray XT3 system, the tools/h5ls/testh5ls.sh and
-  tools/h5copy/testh5copy.sh will fail some of its sub-tests. These sub-tests
-  are expected to fail and should exit with a non-zero code but the yod
-  command does not propagate the exit code of the executables. Yod always
-  returns 0 if it can launch the executable.  The test suite shell expects
-  a non-zero for this particular test, therefore it concludes the test has
-  failed when it receives 0 from yod.  Skip all the "failing" test for now
-  by changing them as following.
-
-  ======== Original tools/h5ls/testh5ls.sh =========
-  TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ======== Change to ===============================
-  echo SKIP TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ==================================================
-
-  ======== Original tools/h5copy/testh5copy.sh =========
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  H5LSTEST $FILEOUT
-  ======== Change to ===============================
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  echo SKIP H5LSTEST $FILEOUT
-  ==================================================
-  AKC - 2008/11/10
-
-* For Red Storm, a Cray XT3 system, the yod command sometimes gives the
-  message,  "yod allocation delayed for node recovery".  This interferes with
-  test suites that do not expect seeing this message.  See the section of "Red
-  Storm" in file INSTALL_parallel for a way to deal with this problem.
-  AKC - 2008/05/28
-
-* We have discovered two problems when running collective IO parallel HDF5 
-  tests with chunking storage on the ChaMPIon MPI compiler on tungsten, a 
-  Linux cluster at NCSA.
-
-  Under some complex selection cases: 
-  1) MPI_Get_element returns the wrong value.
-  2) MPI_Type_struct also generates the wrong derived datatype and corrupt 
-     data may be generated.
-  These issues arise only when turning on collective IO with chunking storage 
-  with some complex selections. We have not found these problems on other 
-  MPI-IO compilers. If you encounter these problems, you may use independent 
-  IO instead.
-
-  To avoid this behavior, change the following line in your code
-      H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
-  to
-      H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_INDEPENDENT);
-  KY - 2007/08/24
-
-* On Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* For LLNL, uP: both serial and parallel tests pass.  
-  Zeus: Serial tests pass but parallel tests fail with a known problem in MPI.
-  ubgl: Serial tests pass but parallel tests fail. 
-
-* On mpich 1.2.5 and 1.2.6, if more than two processes contribute no IO and 
-  the application asks to do collective IO, we have found that when using 4 
-  processors, a simple collective write will sometimes be hung. This can be 
-  verified with t_mpi test under testpar.
-
-* On IRIX6.5, when the C compiler version is greater than 7.4, complicated
-  MPI derived datatype code will work. However, the user should increase
-  the value of the MPI_TYPE_MAX environment variable to some appropriate value 
-  to use collective irregular selection code.  For example, the current 
-  parallel HDF5 test needs to raise MPI_TYPE_MAX to 200,000 to pass the test. 
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  SLU - 2005/6/30
+    These files are not included in this distribution, but are available 
+    via the Web or FTP at the following locations:
+        http://hdf.ncsa.uiuc.edu/HDF5/doc/PSandPDF/
+        ftp://ftp.ncsa.uiuc.edu/HDF/HDF5/docs/
 
-* On IBM AIX systems, parallel HDF5 mode will fail some tests with error
-  messages like "INFO: 0031-XXX ...".  This is from the command `poe'.
-  Set the environment variable MP_INFOLEVEL to 0 to minimize the messages
-  and run the tests again.
+    While these documents are labeled Release 1.4.1, they describe 
+    Release 1.4.0 as well.  
 
-  The tests may fail with messages like "The socket name is already in use",  
-  but HDF5 does not use sockets.  This failure is due to problems with the 
-  poe command trying to set up the debug socket.  To resolve this problem, 
-  check to see whether there are many old /tmp/s.pedb.* files staying around.  
-  These are sockets used by the poe command and left behind due to failed 
-  commands.  First, ask your system administrator to clean them out.  
-  Lastly, request IBM to provide a means to run poe without the debug socket.
 
-* The --enable-static-exec configure flag fails to compile for Solaris
-  platforms. This is due to the fact that not all of the system libraries on 
-  Solaris are available in a static format.
+Platforms Tested
+================
 
-  The --enable-static-exec configure flag also fails to correctly compile
-  on IBM SP2 platforms for serial mode. The parallel mode works fine with 
-  this option.
-  
-  It is suggested that you do not use this option on these platforms
-  during configuration.
+Due to the nature of this release only C, C++ libraries and tools were tested.
+
+    AIX 4.3.3.0 (IBM SP powerpc)  xlc 3.6.6
+                                  mpcc_r 3.6.6
+    Cray T3E sn6711 2.0.5.47      Cray Standard C Version 6.5.0.0
+    Cray SV1 10.0.0.8             Cray Standard C Version 6.5.0.0
+    FreeBSD 4.3                   gcc 2.95.2
+    HP-UX B.10.20                 HP C  HP92453-01 A.10.32.30
+    HP-UX B.11.00                 HP C  HP92453-01 A.11.01.20
+    IRIX 6.5                      MIPSpro cc 7.30
+    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.3.1m
+    Linux 2.2.18smp               gcc-2.95.2
+                                  g++ 2.95.2
+    OSF1 V4.0                     DEC-V5.2-040
+                                  Digital Fortran 90 V4.1-270
+    SunOS 5.6                     WorkShop Compilers 5.0 98/12/15 C 5.0 
+     (Solaris 2.6)                
+
+    SunOS 5.7                     WorkShop Compilers 5.0 98/12/15 C 5.0
+     (Solaris 2.7)                Workshop Compilers 5.0 98/12/15 C++ 5.0
+    TFLOPS r1.0.4 v4.0            mpich-1.2.1 with local changes
+    Windows NT4.0, 2000 (NT5.0)   MSVC++ 6.0
+    Windows 98                    MSVC++ 6.0
 
-* There is also a configure error on Altix machines that incorrectly reports 
-  when a version of Szip without an encoder is being used.
 
-* Information about building with PGI and Intel compilers is available in
-  the INSTALL file sections 4.7 and 4.8.
+Supported Configuration Features Summary
+========================================
 
+    * See "Supported Configuration Features Summary" section for the HDF5
+      1.4.0 release in the HISTORY.txt file.
 
-%%%%1.8.2%%%%   
- 
+Known Problems
+==============
 
-HDF5 version 1.8.2 released on Mon Nov 10 15:43:09 CST 2008
-================================================================================
+    * The h5dump tests may fail to match the expected output in some
+      platforms (e.g. SP2 parallel, Windows) where the error messages
+      directed to "stderr" do not appear in the "right order" with output
+      from stdout.  This is not an error.
 
-INTRODUCTION
-============
+    * The --enable-static-exec configure flag fails to compile for HP-UX
+      11.00 platforms.
 
-This document describes the differences between HDF5-1.8.1 and HDF5 1.8.2, 
-and contains information on the platforms tested and known problems in 
-HDF5-1.8.2. For more details, see the files HISTORY-1_0-1_8_0_rc3.txt 
-and HISTORY-1_8.txt in the release_docs/ directory of the HDF5 source.
+    * The executable are always dynamic on IRIX64 6.5(64 and n32) and 
+      IRIX 6.5 even if they are configured with --enable-static-exec.
 
-Links to the HDF5 1.8.2 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
+    * The shared library failed compilation on IRIX 6.5.
+    
+    * After "make install" or "make install-doc" one may need to reload the source
+      from the tar file before doing another build.
 
-     http://www.hdfgroup.org/products/hdf5/
+    * See "Known problems" section for the HDF5 1.4.0 release in the
+      HISTORY.txt file.
 
-The HDF5 1.8.2 release can be obtained from:
+%%%%1.4.0%%%%   Release Information for hdf5-1.4.0 (2/22/01)
 
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
+8.  Release Information for hdf5-1.4.0
+===================================================================
+ 
+                       HDF5 Release 1.4.0
 
-User documentation for 1.8.2 can be accessed directly at this location: 
 
-     http://www.hdfgroup.org/HDF5/doc/
+INTRODUCTION
 
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
+This document describes the differences between HDF5-1.2.0 and
+HDF5-1.4.0, and contains information on the platforms tested and
+known problems in HDF5-1.4.0. For more details check the HISTORY.txt
+file in the HDF5 source.
 
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
+The HDF5 documentation can be found on the NCSA ftp server
+(ftp.ncsa.uiuc.edu) in the directory:
 
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.2 (current 
-release) versus Release 1.8.1":
+     /HDF/HDF5/docs/
 
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
+For more information look at the HDF5 home page at:
+   
+    http://hdf.ncsa.uiuc.edu/HDF5/
 
-If you have any questions or comments, please send them to the HDF Help Desk:
+If you have any questions or comments, please send them to:
 
-     help at hdfgroup.org
+    hdfhelp at ncsa.uiuc.edu
 
 
 CONTENTS
-========
 
 - New Features
-- Support for new platforms and languages
-- Bug Fixes since HDF5-1.8.1
+- h4toh5 Utility 
+- F90 Support
+- C++ Support
+- Pablo Support 
+- Bug Fixes since HDF5-1.2.0 
+- Bug Fixes since HDF5-1.4.0-beta2
+- Bug Fixes since HDF5-1.4.0
+- Documentation
 - Platforms Tested
-- Supported Configuration Features Summary
+- Supported Configuration Features
 - Known Problems
 
 
 New Features
 ============
+   * The Virtual File Layer, VFL, was added to replace the old file
+     drivers. It also provides an API for user defined file drivers.
+   * New features added to snapshots. Use 'snapshot help' to see a
+     complete list of features.
+   * Improved configure to detect if MPIO routines are available when
+     parallel mode is requested.
+   * Added Thread-Safe support. Phase I implemented. See:
+
+        http://hdf.ncsa.uiuc.edu/HDF5/papers/mthdf/MTHDFpaper.htm
+
+     for more details.
+   * Added data sieve buffering to raw data I/O path. This is enabled
+     for all VFL drivers except the mpio & core drivers. Setting the
+     sieve buffer size is controlled with the new API function,
+     H5Pset_sieve_buf_size(), and retrieved with H5Pget_sieve_buf_size().
+   * Added new Virtual File Driver, Stream VFD, to send/receive entire
+     HDF5 files via socket connections.
+   * As parts of VFL, HDF-GASS and HDF-SRB are also added to this
+     release. To find out details, please read INSTALL_VFL file. 
+   * Increased maximum number of dimensions for a dataset (H5S_MAX_RANK)
+     from 31 to 32 to align with HDF4 & netCDF.
+   * Added 'query' function to VFL drivers.  Also added 'type' parameter to
+     VFL 'read' & 'write' calls, so they are aware of the type of data
+     being accessed in the file.  Updated the VFL document also.
+   * A new h4toh5 utility, to convert HDF4 files to analogous HDF5 files.
+   * Added a new array datatype to the datatypes which can be created.  
+     Removed "array fields" from compound datatypes (use an array datatype 
+     instead).
+   * Parallel HDF5 works correctly with mpich-1.2.1 on Solaris, SGI, Linux.
+   * You can now install the HDF5 documentation using the
+     ``make install-doc'' command. The documentation is installed in the
+     $(prefix)/doc directory where $(prefix) is the prefix specified by
+     the (optional) ``--prefix'' flag during configuration.
+   * HDF5 can operate correctly in the OpenMP environment in a limited way.
+     Check doc/html/TechNotes/openmp-hdf5.html for details.
+
+
+h4toh5 Utility 
+==============
+    The h4toh5 utility is a new utility that converts an HDF4 file to an 
+    HDF5 file.  For details, see the document, "Mapping HDF4 Objects to 
+    HDF5 Objects":
+       http://hdf.ncsa.uiuc.edu/HDF5/papers/H4-H5MappingGuidelines.pdf
 
-        Configuration
-        -------------
-        - Upgraded libtool to version 2.2.6a. (MAM - 2008/10/15).
-
-        Library
-        -------
-	- Added two new public routines: H5Pget_elink_fapl() and
-      	  H5Pset_elink_fapl(). (see bug #1247) (VC - 2008/10/13)
-        - Improved free space tracking in file to be faster. (QAK - 2008/10/06)
-        - Added 'mounted' field to H5G_info_t struct. (QAK - 2008/07/15)
-
-        Parallel Library
-        ----------------
-        - None
-
-        Tools
-        -----
-        - h5repack: added new options -u and -b to add a userblock to an HDF5 
-          file during the repack.  (PVN - 2008/08/26)
-        - h5repack: added options -t and -a to call H5Pset_alignment while 
-          creating a repacked file. (PVN - 2008/08/29)
-        - h5ls: added capability to traverse through external links when the -r
-          (recursive) flag is given. (NAF - 2008/09/16)
-        - h5ls: added -E option to enable traversal of external links.  
-          h5ls will not traverse external links without this flag being set.
-            (NAF - 2008/10/06)
-        - h5dump: when -b flag is used without a keyword after it, binary 
-          output defaults to NATIVE. MEMORY keyword was deprecated 
-          and replaced by NATIVE keyword. (PVN - 2008/10/30)
-        - h5diff: returns 1 when file graphs differ by any object.  
-          Error return code was changed to 2 from -1.  (PVN - 2008/10/30)
-        - h5import: TEXTFPE (scientific format) was deprecated. Use TEXTFP 
-          instead (PVN - 2008/10/30)
-
-
-
-        F90 API
-        ------
-         - Added optional parameter 'mounted' to H5Gget_info_f, 
-           H5Gget_info_by_idx_f, H5Gget_info_by_name_f (MSB - 2008/09/24)
-	 - Added H5Tget_native_type_f (MSB - 2008/09/30)
-	 
-	 
-        C++ API
-        ------
-        - These member functions were added as wrapper for H5Rdereference to
-          replace the incorrect IdComponent::dereference().
-             void H5Object::dereference(H5Object& obj, void* ref, 
-                                        H5R_type_t ref_type=H5R_OBJECT)
-             void H5Object::dereference(H5File& h5file, void* ref, 
-                                        H5R_type_t ref_type=H5R_OBJECT)
-             void H5Object::dereference(Attribute& obj, void* ref, 
-                                        H5R_type_t ref_type=H5R_OBJECT)
-
-          In addition, these constructors were added to create the associated
-          objects by way of dereference:
-             DataSet(H5Object& obj, void* ref, H5R_type_t ref_type=H5R_OBJECT)
-             DataSet(H5File& file, void* ref, H5R_type_t ref_type=H5R_OBJECT)
-             DataSet(Attribute& attr, void* ref, H5R_type_t ref_type=H5R_OBJECT)
-             Group(H5Object& obj, void* ref, H5R_type_t ref_type=H5R_OBJECT)
-             Group(H5File& obj, void* ref, H5R_type_t ref_type=H5R_OBJECT)
-             Group(Attribute& attr, void* ref, H5R_type_t ref_type=H5R_OBJECT)
-             DataType(H5Object& obj, void* ref, H5R_type_t ref_type=H5R_OBJECT)
-             DataType(H5File& file, void* ref, H5R_type_t ref_type=H5R_OBJECT)
-             DataType(Attribute& attr, void* ref, H5R_type_t ref_type=H5R_OBJECT)
-          (BMR - 2008/10/29)
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-        - Intel 10.1 is supported on Mac OS X 10.5.4.
-          Note:
-          When Fortran is enabled, configure automatically
-          disables the build of shared libraries (i.e., only
-          static C and C++ HDF5 libraries will be built
-          along with the static HDF5 Fortran library).
-          Intel 10.1 C and C++ compilers require 
-          "-no-multibyte-chars" compilation flag due to the known
-          bug in the compilers.
-            (EIP - 2008/10/30)
-
-
-Bug Fixes since HDF5-1.8.1 
-==========================
-
-        Configuration
-        -------------
-        - Fixed error with 'make check install' failing due to h5dump
-          needing other tools built first. (MAM - 2008/10/15).
-        - When using shared szip, it is no longer necessary to specify
-          the path to the shared szip libraries in LD_LIBRARY_PATH.
-           (MAM - 2008/10/15).
-	- The file libhdf5_fortran.settings is not installed since its content
-	  is included in libhdf5.settings now. (AKC - 2008/10/21)
-        - "make DESTDIR=xxx install" failed to install some tools and files
-          (e.g., h5cc and fortran modules). Fixed. (AKC - 2008/10/8).
-
-        Library
-        -------
-        - H5Ovisit and H5Ovisit_by_name will now properly terminate when the
-            callback function returns a positive value on the starting object.
-            (NAF - 2008/11/03)
-        - Fixed an error where a null message could be created that was larger
-            than could be written to the file.  (NAF - 2008/10/23)
-        - Corrected error with family/split/multi VFD not updating driver info
-            when "latest" version of the file format used. (QAK - 2008/10/14)
-        - Corrected alignment+threshold errors to work correctly when metadata
-            aggregation is enabled. (QAK - 2008/10/06)
-        - Changed H5Fget_obj_count and H5Fget_obj_ids to ignore objects
-            registered by the library for internal library use.
-            (NAF - 2008/10/06)
-        - Fixed potential memory leak during compound conversion.
-            (NAF - 2008/10/06)
-        - Changed the return value of H5Fget_obj_count from INT to SSIZE_T. 
-            Also changed the return value of H5Fget_obj_ids from HERR_T to 
-            SSIZE_T and the type of the parameter MAX_OBJS from INT to SIZE_T. 
-            (SLU - 2008/09/26)
-        - Fixed an issue that could cause data to be improperly overwritten
-            during compound type conversion.  (NAF - 2008/09/19)
-        - Fixed pointer alignment violations that could occur during vlen
-            conversion.  (NAF - 2008/09/16)
-        - Fixed problem where library could cause a segmentation fault when
-            an invalid location ID was given to H5Giterate(). (QAK - 2008/08/19)
-        - Fixed improper shutdown when objects have reference count > 1.  The
-            library now tracks reference count due to the application separately
-            from that due to internal library routines.  (NAF - 2008/08/19)
-        - Fixed assertion failure caused by incorrect array datatype version.
-            (NAF - 2008/08/08)
-        - Fixed an issue where mount point traversal would fail when using
-            multiple handles for the child.  (NAF - 2008/08/07)
-        - Fixed an issue where mount points were inaccessible when using 
-            multiple file handles for the parent. The mount table is now in 
-            the shared file structure (the parent pointer is still in the 
-            top structure).  (NAF - 2008/08/07)
-        - Fixed assertion failure caused by incorrect array datatype version.
-            (NAF - 2008/08/04)
-        - Fixed issue where a group could have a file mounted on it twice.
-            (QAK - 2008/07/15)
-        - When an attribute was opened twice and data was written with 
-            one of the handles, the file didn't have the data. It happened 
-            because each handle had its own object structure, and the empty 
-            one overwrote the data with fill value.  This is fixed by making 
-            some attribute information like the data be shared in the 
-            attribute structure.  (SLU - 2008/07/07)
-        - Fixed a Windows-specific issue in the ohdr test which was causing 
-            users in some timezones to get false errors. This a deficiency in 
-            the Windows mktime() function, and has been handled properly.  
-            (SJW  - 2008/06/19)
-
-        Parallel Library
-        ----------------
-        - None
-
-        Tools
-        -----
-        - h5dump now checks for uniqueness of committed datatypes.
-            (NAF - 2008/10/15)
-        - Fixed unnecessary indentation of committed datatypes in h5dump.
-            (NAF - 2008/10/15)
-	- Fixed bugs in h5stat: segmemtation fault when printing groups and
-          print warning message when traversal of objects is unsuccessful.
-          (see bug #1253) (VC- 2008/10/13)
-        - Fixed bug in h5ls that prevented relative group listings (like
-            "h5ls foo.h5/bar") from working correctly (QAK - 2008/06/03)
-        - h5dump: when doing binary output (-b), the stdout printing of 
-             attributes was done incorrectly. Removed printing of attributes 
-             when doing binary output. (PVN - 2008/06/05)
-
-
-        F90 API
-        ------
-        - h5sselect_elements_f: Added additional operators H5S_SELECT_APPEND 
-            and H5S_SELECT_PREPEND (MSB - 2008/09/30)
-	- h5sget_select_elem_pointlist: Fixed list of returned points by 
-            rearranging the point list correctly by accounting for C 
-            conventions. (MSB - 2008/09/30)
-        - h5sget_select_hyper_blocklist_f: Fixed error in transposed dimension 
-            of arrays.(MSB - 2008/9/30)
-        - h5sget_select_bounds_f: Swapped array bounds to account for C and 
-            Fortran reversed array notation (MSB - 2008/9/30)
-	- Changed to initializing string to a blank character instead of a 
-            null type in tH5P.f90 to fix compiling error using AIX 5.3.0 
-            (MSB - 2008/7/29)
-        - Fixed missing commas in H5test_kind.f90 detected by NAG compiler 
-            (MSB - 2008/7/29)
-        - Fixed passing and array to a scalar in tH5A_1_8.f90 detected by 
-            NAG compiler (MSB - 2008/7/29)
-	- Added the ability of the test programs to use the status of 
-            HDF5_NOCLEANUP to determine if the *.h5 files should be removed 
-            or not after the tests are completed (MSB - 2008/10/1)
-	- In nh5tget_offset_c: (MSB 9/12/2008)
-           If offset was equal to 0 it returned the error code of -1, 
-           this was changed to return an error code of -1 when the offset 
-           value is < 0.
-        - Uses intrinsic Fortran function SIZEOF if available when detecting 
-           type of INTEGERs and REALs in H5test_kind.f90 (MSB - 2008/9/3)
-        - Put the DOUBLE PRECISION interfaces in a separate module and 
-           added a USE statement for the module. The interfaces are 
-           included/excluded depending on the state of FORTRAN_DEFAULT_REAL
-           is DBLE_F which detects if the default REAL is DOUBLE PRECISION.
-           This allows the library to be compiled with -r8 Fortran flag 
-           without the user needing to edit the source code. 
-           (MSB - 200/8/27)
-        - Enable building shared library for fortran by adding the flag -fPIC 
-          to the compile flags for versions of Intel Fortran compiler >=9
-           (MSB  - 2008/8/26)
-
-        C++ API
-        ------
-        - Fixed a design bug which allowed an Attribute object to create/modify
-          attributes (bugzilla #1068).  The API class hierarchy was revised
-          to address the problem.  Classes AbstractDS and Attribute are moved
-          out of H5Object.  Class Attribute now multiply inherits from
-          IdComponent and AbstractDs and class DataSet from H5Object and
-          AbstractDs.  In addition, the data member IdComponent::id was
-          moved into subclasses: Attribute, DataSet, DataSpace, DataType,
-          H5File, Group, and PropList. (BMR - 2008/05/20)
-        - IdComponent::dereference was incorrect and replaced as described
-          in "New Features" section.
-          (BMR - 2008/10/29)
-
-
-Platforms Tested
-================
-The following platforms and compilers have been tested for this release.
-
-    AIX 5.3			  xlc 7.0.0.8
-				  xlf 09.01.0000.0008
-				  xlC 7.0.0.8
-				  mpcc_r 7.0.0.8
-				  mpxlf_r 09.01.0000.0008
-
-    Cray XT3 (2.0.41)             cc (pgcc) 7.1-4
-    (red storm)                   ftn (pgf90) 7.1-4
-				  CC (pgCC) 7.1-4
-
-    FreeBSD 6.3-STABLE i386       gcc 3.4.6 [FreeBSD] 20060305
-    (duty)                        g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.2.5 20080702
-                                  g++ 4.2.5 20080702
-                                  gfortran 4.2.5 20080702
-
-    FreeBSD 6.3-STABLE amd64      gcc 3.4.6 [FreeBSD] 20060305
-    (liberty)                     g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.2.5 20080702
-                                  g++ 4.2.5 20080702
-                                  gfortran 4.2.5 20080702
-
-    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.4.4m
-                                  F90 MIPSpro 7.4.4m 
-                                  C++ MIPSpro cc 7.4.4m
-
-    Linux 2.6.9-42.0.10.ELsmp #1  gcc (GCC) 3.4.6
-    SMP i686 i386                 G95 (GCC 4.0.3 (g95 0.92!) April 18 2007)
-    (kagiso)                      PGI C, Fortran, C++ 7.2-1 32-bit
-                                  Intel(R) C Compiler for 32-bit
-                                      applications, Version 10.1
-                                  Intel(R) C++ Compiler for 32-bit
-                                      applications, Version 10.1
-                                  Intel(R) Fortran Compiler for 32-bit
-                                      applications, Version 10.1
-                                  Absoft 32-bit Fortran 95 10.0.4
-                                  MPICH mpich-1.2.7 compiled with
-                                  gcc 3.4.6 and G95  (GCC 4.0.3 (g95 0.92!)
-                                  MPICH mpich2-1.0.6p1 compiled with
-                                  gcc 3.4.6 and G95 (GCC 4.0.3 (g95 0.92!)
-
-    Linux 2.6.16.46-0.14-smp #1   Intel(R) C++ for Intel(R) EM64T 
-    SMP x86_64 GNU/Linux          Ver.  10.1.013
-    (smirom)                      Intel(R) Fortran Intel(R) EM64T 
-                                  Ver.  10.1.013
-                                  PGI C, Fortran, C++ Version 7.2-1
-                                         for 64-bit target on x86-64
-                                  MPICH mpich-1.2.7 compiled with
-                                  gcc 4.1.2 and G95  (GCC 4.0.3 (g95 0.92!)
-                                  MPICH mpich2-1.0.7 compiled with
-                                  gcc 4.1.2 and G95 (GCC 4.0.3 (g95 0.92!)
-                                  tested for both 32- and 64-bit binaries
-
-    Linux 2.6.16.54-0.2.5 #1      Intel(R) C++ Version 10.1.017
-    Altix SMP ia64                Intel(R) Fortran Itanium(R) Version 10.1.017
-    (cobalt)                      SGI MPI 1.16
-
-    SunOS 5.10 32- and 64-bit     Sun WorkShop 6 update 2 C 5.8
-    (linew)                       Sun WorkShop 6 update 2 Fortran 95 8.2
-                                  Sun WorkShop 6 update 2 C++ 5.8
-                                  Patch 121019-06
-
-    Xeon Linux 2.6.9-42.0.10.EL_lustre-1.4.10.1smp
-    (abe)                         Intel(R) C++ Version 10.0.026
-                                  Intel(R) Fortran Compiler Version 10.0.026
-                                  Open MPI 1.2.2
-                                  MVAPICH2-0.9.8p28p2patched-intel-ofed-1.2
-                                  compiled with icc v10.0.026 and 
-                                  ifort 10.0.026
-
-    IA-64 Linux 2.4.21-309.tg1 #1 SMP
-        ia64                      gcc (GCC) 3.2.2
-    (NCSA tg-login)               Intel(R) C++ Version 8.1.037
-                                  Intel(R) Fortran Compiler Version 8.1.033
-                                  mpich-gm-1.2.7p1..16-intel-8.1.037-r1
-
-    Intel 64 Linux 2.6.9-42.0.10.EL_lustre-1.4.10.1smp
-    (abe)                         gcc 3.4.6 20060404
-                                  Intel(R) C++ Version 10.0
-                                  Intel (R) Fortran Compiler Version 10.0
-                                  mvapich2-0.9.8p2patched-intel-ofed-1.2
-
-    Windows XP                    Visual Studio .NET
-                                  Visual Studio 2005 w/ Intel Fortran 9.1
-                                  Cygwin(native gcc compiler and g95)
-
-    Windows XP x64                Visual Studio 2005 w/ Intel Fortran 9.1
-
-    Windows Vista                 Visual Studio 2005
-
-    MAC OS  10.5.4 (Intel)        i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1
-                                  GNU Fortran (GCC) 4.3.0 20070810
-                                  G95 (GCC 4.0.3 (g95 0.91!) Apr 24 2008)
-                                  Intel C, C++ and Fortran compilers 10.1
-                                  
-
-Supported Configuration Features Summary
-========================================
-
-    In the tables below
-          y   = tested and supported
-          n   = not supported or not tested in this release
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                 C        F90    F90      C++   zlib  SZIP
-                         parallel        parallel
-Solaris2.10 32-bit       n        y      n        y     y     y
-Solaris2.10 64-bit       n        y      n        y     y     y
-IRIX64_6.5 32-bit        n        n      n        n     y     y
-IRIX64_6.5 64-bit        n        y      y        y     y     y
-Windows XP               n        y(15)  n(15)    y     y     y
-Windows XP x64           n        y(15)  n(15)    y     y     y
-Windows Vista            n        n      n        y     y     y
-Mac OS X 10.5 Intel      n        y      n        y     y     y
-AIX 5.3 32- and 64-bit   n        y      n        y     y     n
-FreeBSD 6.3-STABLE 
-32&64 bit                n        y      n        y     y     y
-RedHat EL4       (3)  W  y(1)     y(10)  y(1)     y     y     y
-RedHat EL4 Intel (3)  W  n        y      n        y     y     n
-RedHat EL4 PGI   (3)  W  n        y      n        y     y     n
-SuSe x86_64 gcc(3,12) W  y(2)     y(11)  y(2)     y     y     y
-SuSe x86_64 Int(3,12) W  n        y(13)  n        y     y     n
-SuSe x86_64 PGI(3,12) W  n        y(8)   n        y     y     y
-Linux 2.6 SuSE ia64   C 
-    Intel       (3,7)    y        y      y        y     y     n
-Linux 2.6 SGI Altix 
-    ia64 Intel    (3)    y        y      y        y     y     y
-Linux 2.6 RHEL        C
-    Lustre Intel  (5)    y(4)     y      y(4)     y     y     n
-Cray XT3 2.0.41          y        y      y        y     y     n
-
-
-Platform                 Shared  Shared    Shared    Thread-  
-                         C libs  F90 libs  C++ libs  safe     
-Solaris2.10 32-bit       y       y         y         y        
-Solaris2.10 64-bit       y       y         y         y        
-IRIX64_6.5 32-bit        y       dna       y         y        
-IRIX64_6.5 64-bit        y       y         n         y        
-Windows XP               y       y(15)     y         y        
-Windows XP x64           y       y(15)     y         y        
-Windows Vista            y       n         n         y        
-Mac OS X 10.5            y       n         y         n        
-AIX 5.3 32- and 64-bit   n       n         n         n        
-FreeBSD 6.2 32&64 bit    y       n         y         y        
-RedHat EL4       (3)  W  y       y(10)     y         y        
-RedHat EL4 Intel (3)  W  y       y         y         n        
-RedHat EL4 PGI   (3)  W  y       y         y         n        
-SuSe x86_64 GNU(3,12) W  y       y         y         y        
-SuSe x86_64 Int(3,12) W  y       y         y         n        
-SuSe x86_64 PGI(3,12) W  y       y         y         n        
-Linux 2.4 SuSE        C
-    ia64 C Intel (7)     y       y         y         n        
-Linux 2.4 SGI Altix   C
-    ia64 Intel           y                           n        
-Linux 2.6 RHEL        C
-    Lustre Intel (5)     y       y         y         n
-Cray XT3 2.0.41          n       n         n         n
-
-    Notes: (1)  Using mpich2 1.0.6.
-           (2)  Using mpich2 1.0.7.
-           (3)  Linux 2.6 with GNU, Intel, and PGI compilers, as indicated.  
-                  W or C indicates workstation or cluster, respectively.
-           (4)  Using mvapich2 0.9.8.
-           (5)  Linux 2.6.9-42.0.10.  Xeon cluster with ELsmp_perfctr_lustre 
-                  and Intel compilers
-           (6)  Linux 2.4.21-32.0.1.  Xeon cluster with ELsmp_perfctr_lustre 
-                  and Intel compilers
-           (7)  Linux 2.4.21, SuSE_292.till.  Ia64 cluster with Intel compilers
-           (8)  pgf90
-           (9)  With Compaq Visual Fortran 6.6c compiler.
-           (10) With PGI and Absoft compilers.
-           (11) PGI and Intel compilers for both C and Fortran
-           (12) AMD Opteron x86_64
-           (13) ifort
-           (14) Yes with C and Fortran, but not with C++
-           (15) Using Visual Studio 2005 or Cygwin
-           (16) Not tested for this release.
-    Compiler versions for each platform are listed in the preceding
-    "Platforms Tested" table.
-
+    Known Bugs:
 
-Known Problems
-==============
-* For Red Storm, a Cray XT3 system, the tools/h5ls/testh5ls.sh and
-  tools/h5copy/testh5copy.sh will fail some of its sub-tests. These sub-tests
-  are expected to fail and should exit with a non-zero code but the yod
-  command does not propagate the exit code of the executables. Yod always
-  returns 0 if it can launch the executable.  The test suite shell expects
-  a non-zero for this particular test, therefore it concludes the test has
-  failed when it receives 0 from yod.  Skip all the "failing" test for now
-  by changing them as following.
-
-  ======== Original tools/h5ls/testh5ls.sh =========
-  TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ======== Change to ===============================
-  echo SKIP TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ==================================================
-
-  ======== Original tools/h5copy/testh5copy.sh =========
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  H5LSTEST $FILEOUT
-  ======== Change to ===============================
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  echo SKIP H5LSTEST $FILEOUT
-  ==================================================
-  AKC - 2008/11/10
-
-* For Red Storm, a Cray XT3 system, the yod command sometimes gives the
-  message,  "yod allocation delayed for node recovery".  This interferes with
-  test suites that do not expect seeing this message.  See the section of "Red
-  Storm" in file INSTALL_parallel for a way to deal with this problem.
-  AKC - 2008/05/28
-
-* We have discovered two problems when running collective IO parallel HDF5 
-  tests with chunking storage on the ChaMPIon MPI compiler on tungsten, a 
-  Linux cluster at NCSA.
-
-  Under some complex selection cases: 
-  1) MPI_Get_element returns the wrong value.
-  2) MPI_Type_struct also generates the wrong derived datatype and corrupt 
-     data may be generated.
-  These issues arise only when turning on collective IO with chunking storage 
-  with some complex selections. We have not found these problems on other 
-  MPI-IO compilers. If you encounter these problems, you may use independent 
-  IO instead.
-
-  To avoid this behavior, change the following line in your code
-      H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
-  to
-      H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_INDEPENDENT);
-
-  KY - 2007/08/24
-
-* On Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* For LLNL, uP: both serial and parallel tests pass.  
-  Zeus: Serial tests pass but parallel tests fail with a known problem in MPI.
-  ubgl: Serial tests pass but parallel tests fail. 
-
-* On mpich 1.2.5 and 1.2.6, if more than two processes contribute no IO and 
-  the application asks to do collective IO, we have found that when using 4 
-  processors, a simple collective write will sometimes be hung. This can be 
-  verified with t_mpi test under testpar.
-
-* On IRIX6.5, when the C compiler version is greater than 7.4, complicated
-  MPI derived datatype code will work. However, the user should increase
-  the value of the MPI_TYPE_MAX environment variable to some appropriate value 
-  to use collective irregular selection code.  For example, the current 
-  parallel HDF5 test needs to raise MPI_TYPE_MAX to 200,000 to pass the test. 
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  SLU - 2005/6/30
+      The h4toh5 utility produces images that do not correctly conform
+      to the HDF5 Image and Palette Specification. 
 
-* On IBM AIX systems, parallel HDF5 mode will fail some tests with error
-  messages like "INFO: 0031-XXX ...".  This is from the command `poe'.
-  Set the environment variable MP_INFOLEVEL to 0 to minimize the messages
-  and run the tests again.
+        http://hdf.ncsa.uiuc.edu/HDF5/doc/ImageSpec.html
 
-  The tests may fail with messages like "The socket name is already in use",  
-  but HDF5 does not use sockets.  This failure is due to problems with the 
-  poe command trying to set up the debug socket.  To resolve this problem, 
-  check to see whether there are many old /tmp/s.pedb.* files staying around.  
-  These are sockets used by the poe command and left behind due to failed 
-  commands.  First, ask your system administrator to clean them out.  
-  Lastly, request IBM to provide a means to run poe without the debug socket.
+      Several required HDF5 attributes are omitted, and the dataspace 
+      is reversed (i.e., the ht. and width of the image dataset is 
+      incorrectly described.)  For more information, please see:
 
-* The --enable-static-exec configure flag fails to compile for Solaris
-  platforms. This is due to the fact that not all of the system libraries on 
-  Solaris are available in a static format.
+        http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageDetails.html
+ 
+      This bug has been fixed for the snapshot of hdf5 1.4 release. March 12th,2001
 
-  The --enable-static-exec configure flag also fails to correctly compile
-  on IBM SP2 platforms for serial mode. The parallel mode works fine with 
-  this option.
-  
-  It is suggested that you do not use this option on these platforms
-  during configuration.
+    Known Limitations of the h4toh5 release
+    ---------------------------------------------
 
-* There is also a configure error on Altix machines that incorrectly reports 
-  when a version of Szip without an encoder is being used.
+    1. Error handlings
 
-* Information about building with PGI and Intel compilers is available in
-  the INSTALL file sections 4.7 and 4.8.
+       h4toh5 utility will print out an error message when an error occurs.
 
+    2. String Datatype
 
+    HDF4 has no 'string' type. String valued data are usually defined as
+    an array of 'char' in HDF4. The h4toh5 utility will generally map
+    these to HDF5 'String' types rather than array of char, with the
+    following additional rules:
 
+       * For the data of an HDF4 SDS, image, and palette, if the data is
+         declared 'DFNT_CHAR8' it will be assumed to be integer and will
+         be an H5T_INTEGER type.
+       * For attributes of any HDF4 object, data of type 'DFNT_CHAR8'
+         will be converted to an HDF5 'H5T_STRING' type.
+       * For an HDF4 Vdata, it is difficult to determine whether data 
+         of type 'DFNT_CHAR8' is intended to be bytes or characters. The
+         h4toh5 utility will consider them to be C characters, and will
+         convert them to an HDF5 'H5T_STRING' type.
 
-%%%%1.8.1%%%%   
 
+    3. Compression, Chunking and External Storage
 
-HDF5 version 1.8.1 released on Thu May 29 15:28:55 CDT 2008
-================================================================================
+    Chunking is supported, but compression and external storage is not.
 
-INTRODUCTION
-============
+    An HDF4 object that uses chunking will be converted to an HDF5 file
+    with analogous chunked storage.
 
-This document describes the differences between the HDF5-1.8.1 release 
-and HDF5 1.8.0, and contains information on the platforms tested and known 
-problems in HDF5-1.8.1.  For more details, see the files
-HISTORY-1_0-1_8_0_rc3.txt and HISTORY-1_8.txt in the release_docs/ directory 
-of the HDF5 source.
+    An HDF4 object that uses compression will be converted to an
+    uncompressed HDF5 object.  
 
-Links to the HDF5 1.8.1 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
+    An HDF4 object that uses external storage will be converted to an
+    HDF5 object without external storage.  
 
-     http://www.hdfgroup.org/products/hdf5/
+    4. Memory Use
 
-The HDF5 1.8.1 release can be obtained from:
+    This version of the h4toh5 utility copies data from HDF4 objects
+    in a single read followed by a single write to the HDF5 object. For
+    large objects, this requires a very large amount of memory, which may
+    be extremely slow or fail on some platforms.
 
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
+    Note that a dataset that has only been partly written will
+    be read completely, including uninitialized data, and all the
+    data will be written to the HDF5 object.
 
-User documentation for 1.8.1 can be accessed directly at this location: 
+    5. Platforms
 
-     http://www.hdfgroup.org/HDF5/doc/
+    The h4toh5 utility requires HDF5-1.4.0 and HDF4r1.4
 
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
+    h4toh5 utility has been tested on all platforms listed below (see 
+    section "Platforms Tested") except TFLOPS.
 
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
+ 
+F90 Support
+===========
+    This is the first release of the HDF5 Library with fully integrated 
+    F90 API support.  The Fortran Library is created when the 
+    --enable-fortran flag is specified during configuration.
+
+    Not all F90 subroutines are implemented. Please refer to the HDF5 
+    Reference Manual for more details.
+   
+    F90 APIs are available for the Solaris 2.6 and 2.7, Linux, DEC UNIX, 
+    T3E, SV1 and O2K (64 bit option only) platforms. The Parallel version of 
+    the HDF5 F90 Library is supported on the O2K and T3E platforms.
+
+    Changes since the last prototype release (July 2000)
+    ----------------------------------------------------
+       * h5open_f and h5close_f must be called instead of h5init_types and 
+         h5close_types.
+
+       * The following subroutines are no longer available: 
+
+             h5pset_xfer_f
+             h5pget_xfer_f
+             h5pset_mpi_f
+             h5pget_mpi_f
+             h5pset_stdio_f
+             h5pget_stdio_f
+             h5pset_sec2_f
+             h5pget_sec2_f
+             h5pset_core_f
+             h5pget_core_f
+             h5pset_family_f
+             h5pget_family_f
+             
+       * The following functions have been added:
+
+             h5pset_fapl_mpio_f
+             h5pget_fapl_mpio_f
+             h5pset_dxpl_mpio_f
+             h5pget_dxpl_mpio_f
+        
+       * In the previous HDF5 F90 releases, the implementation of object 
+         references and dataset region references was not portable. This 
+         release introduces a portable implementation, but it also introduces 
+         changes to the read/write APIs that handle references.  If object or 
+         dataset region references are written or read to/from an HDF5 file, 
+         h5dwrite_f and h5dread_f must use the extra parameter, n, for the 
+         buffer size:
+
+            h5dwrite(read)_f(dset_id, mem_type_id, buf, n, hdferr, &
+                                                       ^^^ 
+                             mem_space_id, file_space_id, xfer_prp)
+
+         For other datatypes the APIs were not changed. 
+              
+             
+C++ Support
+===========
+    This is the first release of the HDF5 Library with fully integrated 
+    C++ API support. The HDF5 C++ library is built when the --enable-cxx
+    flag is specified during configuration.
+
+    Check the HDF5 Reference Manual for available C++ documentation.
+
+    C++ APIs are available for Solaris 2.6 and 2.7, Linux, and FreeBSD. 
+
+
+Pablo Support
+=============
+    This version does not allow proper building of the Pablo-instrumented
+    version of the library.  A version supporting the pablo build is
+    available on the Pablo Website at 
+    www-pablo.cs.uiuc.edu/pub/Pablo.Release.5/HDFLibrary/hdf5_v1.4.tar.gz
+
+
+Bug Fixes since HDF5-1.2.0
+==========================
 
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.1 (current 
-release) versus Release 1.8.0":
+Library
+-------
+   * The function H5Pset_mpi is renamed as H5Pset_fapl_mpio.
+   * Corrected a floating point number conversion error for the Cray J90
+     platform. The error did not convert the value 0.0 correctly.
+   * Error was fixed which was not allowing dataset region references to
+     have their regions retrieved correctly.
+   * Corrected a bug that caused non-parallel file drivers to fail in
+     the parallel version.
+   * Added internal free-lists to reduce memory required by the library
+     and H5garbage_collect API function
+   * Fixed error in H5Giterate which was not updating the "index"
+     parameter correctly.
+   * Fixed error in hyperslab iteration which was not walking through the
+     correct sequence of array elements if hyperslabs were staggered in a
+     certain pattern
+   * Fixed several other problems in hyperslab iteration code.
+   * Fixed another H5Giterate bug which was causes groups with large
+     numbers of objects in them to misbehave when the callback function
+     returned non-zero values.
+   * Changed return type of H5Aiterate and H5A_operator_t typedef to be
+     herr_t, to align them with the dataset and group iterator functions.
+   * Changed H5Screate_simple and H5Sset_extent_simple to not allow
+     dimensions of size 0 with out the same dimension being unlimited.
+   * QAK - 4/19/00 - Improved metadata hashing & caching algorithms to
+     avoid many hash flushes and also remove some redundant I/O when
+     moving metadata blocks in the file.
+   * The "struct(opt)" type conversion function which gets invoked for
+     certain compound datatype conversions was fixed for nested compound
+     types. This required a small change in the datatype conversion
+     function API.
+   * Re-wrote lots of the hyperslab code to speed it up quite a bit.
+   * Added bounded garbage collection for the free lists when they run
+     out of memory and also added H5set_free_list_limits API call to
+     allow users to put an upper limit on the amount of memory used for
+     free lists.
+   * Checked for non-existent or deleted objects when dereferencing one
+     with object or region references and disallow dereference.
+   * "Time" datatypes (H5T_UNIX_D*) were not being stored and retrieved
+     from object headers correctly, fixed now.
+   * Fixed H5Dread or H5Dwrite calls with H5FD_MPIO_COLLECTIVE requests
+     that may hang because not all processes are transfer the same amount
+     of data. (A.K.A. prematured collective return when zero amount data
+     requested.) Collective calls that may cause hanging is done via the
+     corresponding MPI-IO independent calls.
+   * If configure with --enable-debug=all, couple functions would issue
+     warning messages to "stderr" that the operation is expensive time-wise.
+     This messed up applications (like testings) that did not expect the
+     extra output. It is changed so that the warning will be printed only
+     if the corresponding Debug key is set.
+
+Configuration
+-------------
+   * The hdf5.h include file was fixed to allow the HDF5 Library to be
+     compiled with other libraries/applications that use GNU autoconf. 
+   * Configuration for parallel HDF5 was improved. Configure now attempts
+     to link with libmpi.a and/or libmpio.a as the MPI libraries by
+     default. It also uses "mpirun" to launch MPI tests by default. It
+     tests to link MPIO routines during the configuration stage, rather
+     than failing later as before. One can just do "./configure
+     --enable-parallel" if the MPI library is in the system library.
+   * Added support for pthread library and thread-safe option.
+   * The libhdf5.settings file shows the correct machine byte-sex.
+   * Added option "--enable-stream-vfd" to configure w/o the Stream VFD.
+     For Solaris, added -lsocket to the LIBS list of libraries.
+
+Tools
+-----
+   * h5dump now accepts both short and long command-line parameters:
+         -h, --help          Print a usage message and exit
+         -B, --bootblock     Print the content of the boot block
+         -H, --header        Print the header only; no data is displayed
+         -i, --object-ids    Print the object ids
+         -V, --version       Print version number and exit
+         -a P, --attribute=P Print the specified attribute
+         -d P, --dataset=P   Print the specified dataset
+         -g P, --group=P     Print the specified group and all members
+         -l P, --soft-link=P Print the value(s) of the specified soft link
+         -o F, --output=F    Output raw data into file F
+         -t T, --datatype=T  Print the specified named data type
+         -w #, --width=#     Set the number of columns
+
+     P - is the full path from the root group to the object.
+     T - is the name of the data type.
+     F - is a filename.
+     # - is an integer greater than 1.
+   * A change from the old way command line parameters were interpreted
+     is that multiple attributes, datasets, groups, soft-links, and
+     object-ids cannot be specified with just one flag but you have to
+     use a flag with each object. I.e., instead of doing this:
+
+       h5dump -a /attr1 /attr2 foo.h5
+
+     do this:
+
+       h5dump -a /attr1 -a /attr2 foo.h5
+
+     The cases are similar for the other object types.
+   * h5dump correctly displays compound datatypes.
+   * Corrected an error in h5toh4 which did not convert the 32bits
+     int from HDF5 to HDF4 correctly for the T3E platform.
+   * h5dump correctly displays the committed copy of predefined types
+     correctly.
+   * Added an option, -V, to show the version information of h5dump.
+   * Fixed a core dumping bug of h5toh4 when executed on platforms like 
+     TFLOPS.
+   * The test script for h5toh4 used to not able to detect the hdp
+     dumper command was not valid.  It now detects and reports the
+     failure of hdp execution.
+   * Merged the tools with the 1.2.2 branch. Required adding new
+     macros, VERSION12 and VERSION13, used in conditional compilation.
+     Updated the Windows project files for the tools.            
+   * h5dump displays opaque and bitfield data correctly.
+   * h5dump and h5ls can browse files created with the Stream VFD
+     (eg. "h5ls <hostname>:<port>").
+   * h5dump has a new feature "-o <filename>" which outputs the raw data
+     of the dataset into ascii text file <filename>.
+   * h5toh4 used to converts hdf5 strings type to hdf4 DFNT_INT8 type.
+     Corrected to produce hdf4 DFNT_CHAR type instead.
+   * h5dump and h5ls displays array data correctly.
+
+
+Bug Fixes since HDF5-1.4.0-beta2
+================================
+   * Fixed a bug in the conversion from a little endian double to a big 
+     endian float in some special cases.
+   * Corrected configuration error which was not including compression 
+     support correctly. 
+   * Cleaned up lots of warnings.
+   * Changed a few h5dump command line switches and added long versions of
+     the switches.
+   * Changed parameters for H5Tconvert, H5Pset_bufer and H5Pget_buffer from
+     size_t to hsize_t
+   * Fixed fairly obscure bug in hyperslab I/O which could (in rare cases)
+     not copy all the data during a transfer.
+   * Removed ragged array code from library.
+   * F90 library and module files are installed properly now on all supported 
+     platforms.
+
+
+Bug Fixes since HDF5-1.4.0 Release
+==================================
+
+   * Fixed bug with contiguous hyperslabs not being detected, causing
+     slower I/O than necessary.
+   * Fixed bug where non-aligned hyperslab I/O on chunked datasets was
+     causing errors during I/O
+   * Implemented XML support in h5dump.
+
+
+Documentation
+=============
+   * A new document summarizing the changes in the library leading up to 
+     the current release has been added: 
+           HDF5 Software Changes from Release to Release
+     This document is in the Application Developer's Guide and is of 
+     particular interest to developers who must keep an application 
+     synchronized with the library.
+   * The documentation for the Fortran90 and C++ APIs is linked to the
+     opening page of the Reference Manual.  Fortran90 functions are 
+     individually referenced from the corresponding C functions through-
+     out the Reference Manual.
+   * User's Guide and Reference Manual were updated to reflect changed 
+     function syntax and to fix reported bugs. 
+   * Functions that are new at this release were added to the Reference 
+     Manual.  
+   * Functions that have been removed from the library were removed from 
+     the User's Guide and the Reference Manual.
+   * PostScript and PDF versions of the Release 1.4 document set are 
+     not available at the time of Release 1.4.0.
+
+   
+Platforms Tested
+================
+    AIX 4.3.3.0 (IBM SP powerpc)  xlc 3.6.6
+                                  mpcc_r 3.6.6
+    Cray T3E sn6711 2.0.5.45      Cray Standard C Version 6.4.0.0
+                                  Cray Fortran Version 3.4.0.2
+    Cray SV1 sn9605 10.0.0.7      Cray Standard C Version 6.4.0.0
+                                  Cray Fortran Version 3.4.0.2
+    FreeBSD 4.2                   gcc 2.95.2
+                                  g++ 2.95.2
+    HP-UX B.10.20                 HP C  HP92453-01 A.10.32.30
+    HP-UX B.11.00                 HP C  HP92453-01 A.11.00.13
+    IRIX 6.5                      MIPSpro cc 7.30
+                                  mpich-1.2.1
+    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.3.1m
+                                  mpt.1.4.0.2
+                                  mpich-1.2.1
+    Linux 2.2.16-3smp             gcc-2.95.2
+                                  g++ 2.95.2
+                                  pgf90 3.1-3
+                                  mpich-1.2.1
+    OSF1 V4.0                     DEC-V5.2-040
+                                  Digital Fortran 90 V4.1-270
+    SunOS 5.6                     WorkShop Compilers 5.0 98/12/15 C 5.0 
+    (Solaris 2.6)                 WorkShop Compilers 5.0 99/10/25 Fortran 90
+                                         2.0 Patch 107356-04
+                                  Workshop Compilers 5.0 98/12/15 C++ 5.0
+    SunOS 5.7                     WorkShop Compilers 5.0 98/12/15 C 5.0
+     (Solaris 2.7)                WorkShop Compilers 5.0 99/10/25 Fortran 90
+                                         2.0 Patch 107356-04
+                                  Workshop Compilers 5.0 98/12/15 C++ 5.0
+                                  mpich-1.2.1
+    SunOS 5.5.1                   gcc-2.7.2 
+     (Solaris 2.5.1 (x86))
+    TFLOPS r1.0.4 v4.0            mpich-1.2.1 with local changes
+    Windows NT4.0, 2000 (NT5.0)   MSVC++ 6.0
+    Windows 98                    MSVC++ 6.0
 
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
 
-If you have any questions or comments, please send them to the HDF Help Desk:
+Supported Configuration Features Summary
+========================================
+    In the tables below
+          y  = tested and supported
+          n  = not supported or not working in this release
+         ( ) = footnote appears below table
+
+    Platform       C   C         F90  F90       C++  Shared     zlib   Tools
+                       parallel       parallel       libraries
+    Solaris2.6     y   n         y    n         y    y          y      y
+    Solaris2.7     y   y (1)     y    n         y    y          y      y
+    Solarisx86     y   n         n    n         n    y          y      y
+    IRIX6.5        y   y (1)     n    n         n    n          y      y
+    IRIX64_6.5 64  y   y (2)     y    y         n    y          y      y
+    IRIX64_6.5 32  y   y (2)     n    n         n    y          y      y
+    HPUX10.20      y   n         n    n         n    y          y      y
+    DECOSF         y   n         y    n         n    y          y      y
+    T3E            y   y         y    y         n    n          y      y
+    SV1            y   n         y    n         n    n          y      y
+    TFLOPS         y   y (1)     n    n         n    n          y      y (4)
+    AIX-4.3        y   y         n    n         n    n          y      n
+    Win2000        y   n         n    n         n    y          y      y
+    Win98          y   n         n    n         n    y          y      y
+    WinNT          y   n         n    n         n    y          y      y
+    FreeBSD        y   n         n    n         y    y          y      y
+    Linux          y   y (1)     y    n         y    y          y      y
+
+
+    Platform       1.2            static-   Thread-  SRB  GASS  STREAM-
+                   compatibility  exec      safe                VFD
+    Solaris2.6     y              n         n        n    n     y
+    Solaris2.7     y              n         y        n    n     y
+    Solarisx86     y              n         n        n    n     y
+    IRIX6.5        y              n         y        n    n     y
+    IRIX64_6.5 64  y              n         n        n    n     y
+    IRIX64_6.5 32  y              n         n        n    n     y
+    HPUX10.20      y              y         n        n    n     y
+    DECOSF         y              y         n        n    n     y
+    T3E            y              y         n        n    n     y
+    SV1            y              y         n        n    n     y
+    TFLOPS         y              y         n        n    n     n
+    AIX-4.3        y              y (3)     n        n    n     y
+    Win2000        y              y         n        n    n     n
+    Win98          y              y         n        n    n     n
+    WinNT          y              y         n        n    n     n
+    FreeBSD        y              y         n        n    n     y
+    Linux          y              n         y        n    n     y
+
+    Footnotes:  (1) Using mpich.
+                (2) Using mpt and mpich.
+                (3) When configured with static-exec enabled, tests fail 
+                    in serial mode.
+                (4) No HDF4-related tools.
 
-     help at hdfgroup.org
 
+Known Problems
+==============
+   * The stream-vfd test uses ip port 10007 for testing.  If another 
+     application is already using that port address, the test will hang 
+     indefinitely and has to be terminated by the kill command.  To try the 
+     test again, change the port address in test/stream_test.c to one not 
+     being used in the host.
+
+   * The --enable-static-exec configure flag fails to compile for Solaris
+     platforms. This is due to the fact that not all of the system
+     libraries on Solaris are available in a static format.
+
+     The --enable-static-exec configure flag also fails to correctly compile
+     on Linux platforms using the gcc-2.95.2 compiler.
+   
+     The --enable-static-exec configure flag also fails to correctly compile
+     on IBM SP2 platform for the serial mode.  The parallel mode works fine
+     with this option.
+
+     The compilation fails if configured with --enable-static-exec on IRIX 6.5.
+
+     The executable files in hdf5/bin are dynamic-linked for IRIX64 6.5(64 and
+     n32 modes) and IRIX 6.5, even though they are compiled with static library.
+  
+     It is suggested that you don't use this option on these platforms
+     during configuration.
 
-CONTENTS
-========
+   * testhdf5 got bus error with configuration options --prefix and --with-hdf4
+     on IRIX 6.5.
 
-- New Features
-- Support for new platforms and languages
-- Bug Fixes since HDF5-1.8.0
-- Platforms Tested
-- Supported Configuration Features Summary
-- Known Problems
+   * With the gcc 2.95.2 compiler, HDF 5 uses the `-ansi' flag during
+     compilation. The ANSI version of the compiler complains about not being
+     able to handle the `long long' datatype with the warning:
 
+           warning: ANSI C does not support `long long'
+  
+     This warning is innocuous and can be safely ignored.
 
-New Features
-============
+   * SunOS 5.6 with C WorkShop Compilers 4.2:  Hyperslab selections will 
+     fail if library is compiled using optimization of any level.
 
-        Configuration
-        -------------
-        - The lib/libhdf5.settings file contains much more configure
-          information. (AKC - 2008/05/18)
-
-        - The new configure option "--disable-sharedlib-rpath" disables 
-          embedding the '-Wl,-rpath' information into executables when 
-          shared libraries are produced, and instead solely relies on the 
-          information in LD_LIBRARY_PATH. (MAM - 2008/05/15)
-
-        - Configuration suite now uses Autoconf 2.61, Automake 1.10.1, and 
-          Libtool 2.2.2 (MAM - 2008/05/01)
-
-        Source code distribution
-        ========================
-
-        Library
-        -------
-        - None
-
-        Parallel Library
-        ----------------
-        - None
-
-        Tools
-        -----
-        - h5repack: Reinstated the -i and -o command line flags to specify 
-          input and output files.  h5repack now understands both the old
-          syntax (with -i and -o) and the new syntax introduced in Release
-          1.8.0.  (PVN - 2008/05/23)
-        - h5dump: Added support for external links, displaying the object that 
-          an external link points to. (PVN - 2008/05/12)
-        - h5dump: Added an option, -m, to allow user-defined formatting in the 
-          output of floating point numbers. (PVN - 2008/05/06)
-        - h5dump, in output of the -p option: Added effective data compression 
-          ratio to the dataset storage layout output when a compression filter 
-          has been applied to a dataset.  (PVN - 2008/05/01)
-
-        F90 API
-        ------
-        New H5A, H5G, H5L, H5O, and H5P APIs to enable 1.8 features were
-        added. See "Release 1.8.1 (current release) versus Release 1.8.0" in 
-        the document "HDF5 Software Changes from Release to Release"
-        (http://hdfgroup.org/HDF5/doc/ADGuide/Changes.html) for the 
-        complete list of the new APIs.
-
-        C++ API
-        ------
-        - None
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-        - Both serial and parallel HDF5 are supported for the Red Storm machine 
-          which is a Cray XT3 system.
-
-        - The Fortran library will work correctly if compiled with the -i8 
-          flag.  This has been tested with the g95, PGI and Intel Fortran 
-          compilers.
-
-
-Bug Fixes since HDF5-1.8.0 
-==========================
+   * When building hdf5 tools and applications on windows platform, a linking
+     warning: defaultlib "LIBC" conflicts with use of other libs will appear
+     on debug version when running VC++6.0. This warning doesn't affect building
+     and testing hdf5 applications. We will continue investigating this.
 
-        Configuration
-        -------------
-        - None
-
-        Source code distribution
-        ========================
-
-        Library
-        -------
-        - Chunking:  Chunks greater than 4GB are disallowed. 
-          (QAK - 2008/05/16)
-        - Fixed the problem with searching for a target file when following 
-          an external link.  The search pattern will depend on whether the 
-          target file's pathname is an absolute or a relative path. 
-          Please see the H5Lcreate_external description in the "HDF5 
-          Reference Manual" (http://hdfgroup.org/HDF5/doc/RM/RM_H5L.html).
-          (VC - 2008/04/08)
-        - Fixed possible file corruption bug when encoding datatype
-          descriptions for compound datatypes whose size was between
-          256 and 511 bytes and the file was opened with the "use the
-          latest format" property enabled (with H5Pset_libver_bounds).
-          (QAK - 2008/03/13)
-        - Fixed bug in H5Aget_num_attrs() routine to correctly handle an 
-          invalid location identifier.  (QAK - 2008/03/11)
-
-        Parallel Library
-        ----------------
-        - None
-
-        Tools
-        -----
-        - Fixed bug in h5diff that prevented datasets and attributes with
-          variable-length string elements from comparing correctly.
-          (QAK - 2008/02/28)
-        - Fixed bug in h5dump that caused binary output to be made only for 
-          the first dataset, when several datasets were requested.
-          (PVN - 2008/04/07)
-
-        F90 API
-        ------
-        - The h5tset(get)_fields subroutines were missing the parameter to 
-          specify a sign position; fixed.  (EIP - 2008/05/23)
-        - Many APIs were fixed to work with the 8-byte integers in Fortran vs.
-          4-byte integers in C. This change is trasparent to user applications.
-
-        C++ API
-        ------
-        - The class hierarchy was revised to address the problem reported
-          in bugzilla #1068, Attribute should not be derived from base
-          class H5Object.  Classes AbstractDS was moved out of H5Object.
-          Class Attribute now multiply inherits from IdComponent and
-          AbstractDs and class DataSet from H5Object and AbstractDs.
-          In addition, data member IdComponent::id was moved into subclasses:
-          Attribute, DataSet, DataSpace, DataType, H5File, Group, and PropList.
-          (BMR - 2008/05/20)
-	- IdComponent::dereference was incorrect; it was changed from:
-		void IdComponent::dereference(IdComponent& obj, void* ref)
-	  to:
-		void H5Object::dereference(H5File& h5file, void* ref)
-		void H5Object::dereference(H5Object& obj, void* ref)
-	  (BMR - 2008/05/20)
-        - Revised Attribute::write and Attribute::read wrappers to handle
-          memory allocation/deallocation properly. (bugzilla 1045)
-          (BMR - 2008/05/20)
+   * h5toh4 converter fails two cases(tstr.h5 and tmany.h5) for release dll 
+     version on windows 2000 and NT.  The reason is possibly due to Windows NT 
+     DLL convention on freeing memory. It seems that memory cannot be freed
+     across library or DLL. It is still under investigation.
 
+   * HDF-GASS testings and testhdf5 in the test directory will get bus error if
+     the configured with --with-gass.
 
-Platforms Tested
-================
-The following platforms and compilers have been tested for this release.
+   * HDF-SRB testing got segmentation error on Solaris 2.7.
+    
+   * The Stream VFD was not tested yet under Windows.
+     It is not supported in the TFLOPS machine.
 
-    Cray XT3 (2.0.41)             cc (pgcc) 7.1-4
-    (red storm)                   ftn (pgf90) 7.1-4
-				  CC (pgCC) 7.1-4
-                                  mpicc 1.0.2
-                                  mpif90 1.0.2
+   * Shared library option is broken for IBM SP and some Origin 2000 platforms.
+     One needs to run ./configure with '--disable-shared --enable-static'.
 
-    FreeBSD 6.2-STABLE i386       gcc 3.4.6 [FreeBSD] 20060305
-    (duty)                        g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.2.1 20080123
-                                  g++ 4.2.1 20080123
-                                  gfortran 4.2.1 20070620
+   * The ./dsets tests failed in the TFLOPS machine if the test program,
+     dsets.c, is compiled with the -O option.  The hdf5 library still works
+     correctly with the -O option.  The test program works fine if it is
+     compiled with -O1 or -O0.  Only -O (same as -O2) causes the test
+     program to fail.
 
-    FreeBSD 6.2-STABLE amd64      gcc 3.4.6 [FreeBSD] 20060305
-    (liberty)                     g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.2.1 20080123
-                                  g++ 4.2.1 20080123
-                                  gfortran 4.2.1 20080123
+   * Certain platforms give false negatives when testing h5ls:
+       - Solaris x86 2.5.1, Cray T3E and Cray J90 give errors during testing
+         when displaying object references in certain files.  These are benign 
+         differences due to the difference in sizes of the objects created on
+         those platforms.  h5ls appears to be dumping object references
+         correctly.
+       - Cray J90 give errors during testing when displaying
+         some floating-point values.  These are benign differences due to the
+         different precision in the values displayed and h5ls appears to be
+         dumping floating-point numbers correctly.
 
-    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.4.4m
-                                  F90 MIPSpro 7.4.4m 
-                                  C++ MIPSpro cc 7.4.4m
+   * Before building HDF5 F90 Library from source on Crays (T3E and SV1) 
+     replace H5Aff.f90, H5Dff.f90 and H5Pff.f90 files in the fortran/src 
+     subdirectory in the top level directory with the Cray-specific files from 
+     the ftp://ftp.ncsa.uiuc.edu/HDF/HDF5/hdf5-1.4.0/src/crayf90/  directory.
 
-    Linux 2.6.9 (RHEL4)           Intel 10.0 compilers
-    (abe.ncsa.uiuc.edu)
+   * The h4toh5 utility produces images that do not correctly conform
+     to the HDF5 Image and Palette Specification. 
 
-    Linux 2.4.21-47               gcc 3.2.3 20030502
-    (osage)
+         http://hdf.ncsa.uiuc.edu/HDF5/doc/ImageSpec.html
 
-    Linux 2.6.9-42.0.10           gcc,g++ 3.4.6 20060404, G95 (GCC 4.0.3) 
-    (kagiso)                      PGI 7.1-6 (pgcc, pgf90, pgCC)
-                                  Intel 9.1 (icc, ifort, icpc)
+     Several required HDF5 attributes are omitted, and the dataspace 
+     is reversed (i.e., the ht. and width of the image dataset is 
+     incorrectly described.)  For more information, please see:
 
-    Linux 2.6.16.27 x86_64 AMD    gcc 4.1.0 (SuSE Linux), g++ 4.1.0, 
-    (smirom)                          g95 (GCC 4.0.3)
-                                  PGI 7.1-6 (pgcc, pgf90, pgCC)
-                                  Intel 9.1 (icc, ifort, icpc)
+         http://hdf.ncsa.uiuc.edu/HDF5/H5Image/ImageDetails.htm
 
-    Linux 2.6.5-7.252.1-rtgfx #1  Intel(R) C++ Version 9.0
-          SMP ia64                Intel(R) Fortran Itanium(R) Version 9.0 
-    (cobalt)                      SGI MPI
+%%%%1.2.2%%%%   Release Information for hdf5-1.2.2 (6/23/00)
 
-    SunOS 5.8 32,46               Sun WorkShop 6 update 2 C 5.3
-     (Solaris 2.8)                Sun WorkShop 6 update 2 Fortran 95 6.2
-                                  Sun WorkShop 6 update 2 C++ 5.3
+7.  Release Information for hdf5-1.2.2
+=================================================================
+INTRODUCTION
 
-    SunOS 5.10                    cc: Sun C 5.8 
-    (linew)                       f90: Sun Fortran 95 8.2 
-                                  CC: Sun C++ 5.8 
+This document describes the differences between HDF5-1.2.1 and 
+HDF5-1.2.2, and contains information on the platforms where HDF5-1.2.2
+was tested and known problems in HDF5-1.2.2. 
 
-    Xeon Linux 2.4.21-32.0.1.ELsmp-perfctr-lustre
-    (tungsten)                    gcc 3.2.2 20030222
-                                  Intel(R) C++ Version 9.0
-                                  Intel(R) Fortran Compiler Version 9.0
+The HDF5 documentation can be found on the NCSA ftp server 
+(ftp.ncsa.uiuc.edu) in the directory:
 
-    IA-64 Linux 2.4.21.SuSE_309.tg1 ia64
-    (NCSA tg-login)               gcc 3.2.2
-                                  Intel(R) C++ Version 8.1
-                                  Intel(R) Fortran Compiler Version 8.1
-                                  mpich-gm-1.2.6..14b-intel-r2
+     /HDF/HDF5/docs/
 
-    Intel 64 Linux 2.6.9-42.0.10.EL_lustre-1.4.10.1smp
-    (abe)                         gcc 3.4.6 20060404
-                                  Intel(R) C++ Version 10.0
-                                  Intel (R) Fortran Compiler Version 10.0
-                                  mvapich2-0.9.8p2patched-intel-ofed-1.2
+For more information look at the HDF5 home page at:
+   
+    http://hdf.ncsa.uiuc.edu/HDF5/
 
-    Windows XP                    Visual Studio .NET
-                                  Visual Studio 2005 w/ Intel Fortran 9.1
-                                  Cygwin(native gcc compiler and g95)
-                                  MinGW(native gcc compiler and g95)
+If you have any questions or comments, please send them to:
 
-    Windows XP x64                Visual Studio 2005 w/ Intel Fortran 9.1
+    hdfhelp at ncsa.uiuc.edu
 
-    Windows Vista                 Visual Studio 2005
 
-    MAC OS  10.5.2 (Intel)        i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1
-                                  GNU Fortran (GCC) 4.3.0 20070810
-                                  G95 (GCC 4.0.3 (g95 0.91!) Apr 24 2008)
+CONTENTS
 
+- Features Added since HDF5-1.2.1 
+- Bug Fixes since HDF5-1.2.1
+- Known Problems
+- Platforms Tested
 
-Supported Configuration Features Summary
-========================================
 
-    In the tables below
-          y   = tested and supported
-          n   = not supported or not tested in this release
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                 C        F90    F90      C++   zlib  SZIP
-                         parallel        parallel
-SunOS5.10 64-bit         n        y      n        y     y     y
-SunOS5.10 32-bit         n        y      n        y     y     y
-IRIX64_6.5 64-bit        n        y      y        y     y     y
-IRIX64_6.5 32-bit        n        n      n        n     y     y
-Windows XP               n        y(15)  n(15)    y     y     y
-Windows XP x64           n        y(15)  n(15)    y     y     y
-Windows Vista            n        n      n        y     y     y
-Mac OS X 10.5 Intel      n        y      n        y     y     y
-FreeBSD 4.11             n        n      n        y     y     y
-RedHat EL3  W       (3)  y(1)     y(10)  y(1)     y     y     y
-RedHat EL3  W Intel (3)  n        y      n        y     y     n
-RedHat EL3  W PGI   (3)  n        y      n        y     y     n
-SuSe x86_64 gcc  (3,12)  y(2)     y(11)  y(2)     y     y     y
-SuSe x86_64 Int  (3,12)  n        y(13)  n        y     y     n
-SuSe x86_64 PGI  (3,12)  n        y(8)   n        y     y     y
-Linux 2.4 Xeon C 
-    Lustre Intel  (3,6)  n        y      n        y     y     n
-Linux 2.6 SuSE ia64 C 
-    Intel         (3,7)  y        y      y        y     y     n
-Linux 2.6 SGI Altix 
-    ia64 Intel      (3)  y        y      y        y     y     y
-Linux 2.6 RHEL C
-    Lustre Intel    (5)  y(4)     y      y(4)     y     y     n
-Cray XT3 2.0.41          y        y      y        y     y     n
-
-
-Platform                 Shared  Shared    Shared    Thread-  
-                         C libs  F90 libs  C++ libs  safe     
-Solaris2.10 64-bit       y       y         y         y        
-Solaris2.10 32-bit       y       y         y         y        
-IRIX64_6.5 64-bit        y       y         n         y        
-IRIX64_6.5 32-bit        y       dna       y         y        
-Windows XP               y       y(15)     y         y        
-Windows XP x64           y       y(15)     y         y        
-Windows Vista            y       n         n         y        
-Mac OS X 10.3            y                           n        
-FreeBSD 4.11             y       n         y         y        
-RedHat EL3  W       (3)  y       y(10)     y         y        
-RedHat EL3  W Intel (3)  y       y         y         n        
-RedHat EL3  W PGI   (3)  y       y         y         n        
-SuSe x86_64 W GNU (3,12) y       y         y         y        
-SuSe x86_64 W Int (3,12) y       y         y         n        
-SuSe x86_64 W PGI (3,12) y       y         y         n        
-Linux 2.4 Xeon C 
-    Lustre Intel    (6)  y       y         y         n        
-Linux 2.4 SuSE 
-    ia64 C Intel    (7)  y       y         y         n        
-Linux 2.4 SGI Altix 
-    ia64 Intel           y                           n        
-Linux 2.6 RHEL C
-    Lustre Intel    (5)  y        y        y         n
-Cray XT3 2.0.41          n       n         n         n        n
-
-    Notes: (1)  Using mpich2 1.0.6.
-           (2)  Using mpich2 1.0.7.
-           (3)  Linux 2.6 with GNU, Intel, and PGI compilers, as indicated.  
-                  W or C indicates workstation or cluster, respectively.
-           (4)  Using mvapich2 0.9.8.
-           (5)  Linux 2.6.9-42.0.10.  Xeon cluster with ELsmp_perfctr_lustre 
-                  and Intel compilers
-           (6)  Linux 2.4.21-32.0.1.  Xeon cluster with ELsmp_perfctr_lustre 
-                  and Intel compilers
-           (7)  Linux 2.4.21, SuSE_292.till.  Ia64 cluster with Intel compilers
-           (8)  pgf90
-           (9)  With Compaq Visual Fortran 6.6c compiler.
-           (10) With PGI and Absoft compilers.
-           (11) PGI and Intel compilers for both C and Fortran
-           (12) AMD Opteron x86_64
-           (13) ifort
-           (14) Yes with C and Fortran, but not with C++
-           (15) Using Visual Studio 2005 or Cygwin
-           (16) Not tested for this release.
-    Compiler versions for each platform are listed in the preceding
-    "Platforms Tested" table.
+Features Added since HDF5-1.2.1
+===============================
+   * Added internal free-lists to reduce memory required by the library and
+     H5garbage_collect API function.
+   * h5dump displays opaque and bitfield types.
+   * New features added to snapshots.  Use 'snapshot help' to see a
+     complete list of features.
+   * Improved configure to detect if MPIO routines are available when
+     parallel mode is requested.
 
+Bug Fixes since HDF5-1.2.1
+==========================
+   * h5dump correctly displays compound datatypes, including simple and
+     nested compound types.
+   * h5dump correctly displays the committed copy of predefined types.
+   * Corrected an error in h5toh4 which did not convert the 32-bit
+     int from HDF5 to HDF4 correctly for the T3E platform.
+   * Corrected a floating point number conversion error for the
+     Cray J90 platform.  The error did not convert the value 0.0
+     correctly.
+   * Fixed error in H5Giterate which was not updating the "index" parameter
+     correctly.
+   * Fixed error in hyperslab iteration which was not walking through the
+     correct sequence of array elements if hyperslabs were staggered in a
+     certain pattern.
+   * Fixed several other problems in hyperslab iteration code.
+   * Fixed another H5Giterate bug which caused groups with large numbers
+     of objects in them to misbehave when the callback function returned
+     non-zero values.
+   * Changed return type of H5Aiterate and H5A_operator_t typedef to be
+     herr_t, to align them with the dataset and group iterator functions.
+   * Changed H5Screate_simple and H5Sset_extent_simple to not allow dimensions
+     of size 0 without the same dimension being unlimited.
+   * Improved metadata hashing & caching algorithms to avoid
+     many hash flushes and also removed some redundant I/O when moving metadata
+     blocks in the file.
+   * The libhdf5.settings file shows the correct machine byte-sex.
+   * The "struct(opt)" type conversion function which gets invoked for
+     certain compound datatype conversions was fixed for nested compound
+     types. This required a small change in the datatype conversion
+     function API.
 
 Known Problems
 ==============
-* For Red Storm, a Cray XT3 system, the yod command sometimes gives the
-  message,  "yod allocation delayed for node recovery".  This interferes with
-  test suites that do not expect seeing this message.  See the section of "Red
-  Storm" in file INSTALL_parallel for a way to deal with this problem.
-  AKC - 2008/05/28
-
-* For Red Storm, a Cray XT3 system, the tools/h5ls/testh5ls.sh will fail on
-  the test "Testing h5ls -w80 -r -g tgroup.h5" fails.  This test is
-  expected to fail and exit with a non-zero code but the yod command does
-  not propagate the exit code of the executables. Yod always returns 0 if it
-  can launch the executable.  The test suite shell expects a non-zero for
-  this particular test, therefore it concludes the test has failed when it
-  receives 0 from yod.  To bypass this problem for now, change the following
-  lines in the tools/h5ls/testh5ls.sh.
-  ======== Original =========
-  # The following combination of arguments is expected to return an error message
-  # and return value 1
-  TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ======== Skip the test =========
-  echo SKIP TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ======== end of bypass ========
-  AKC - 2008/05/28
-
-* We have discovered two problems when running collective IO parallel HDF5 
-  tests with chunking storage on the ChaMPIon MPI compiler on tungsten, a 
-  Linux cluster at NCSA.
-
-  Under some complex selection cases: 
-  1) MPI_Get_element returns the wrong value.
-  2) MPI_Type_struct also generates the wrong derived datatype and corrupt 
-     data may be generated.
-  These issues arise only when turning on collective IO with chunking storage 
-  with some complex selections. We have not found these problems on other 
-  MPI-IO compilers. If you encounter these problems, you may use independent 
-  IO instead.
-
-  To avoid this behavior, change the following line in your code
-      H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
-  to
-      H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_INDEPENDENT);
-
-  KY - 2007/08/24
-
-* For SNL, spirit/liberty/thunderbird: The serial tests pass but parallel
-  tests failed with MPI-IO file locking message. AKC - 2007/6/25
-
-* On Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* For LLNL, uP: both serial and parallel tests pass.  
-  Zeus: Serial tests pass but parallel tests fail with a known problem in MPI.
-  ubgl: Serial tests pass but parallel tests fail. 
-
-* Configuring with --enable-debug=all produces compiler errors on most
-  platforms:  Users who want to run HDF5 in debug mode should use
-  --enable-debug rather than --enable-debug=all to enable debugging
-  information on most modules.
-
-* On Mac OS 10.4, test/dt_arith.c has some errors in conversion from long
-  double to (unsigned) long long and from (unsigned) long long to long double. 
-
-* On Altix SGI with Intel 9.0, testmeta.c would not compile with -O3
-  optimization flag.
-
-* On VAX, the Scaleoffset filter is not supported.  The Scaleoffset filter 
-  supports only the IEEE standard for floating-point data; it cannot be applied 
-  to HDF5 data generated on VAX. 
-
-* On Cray X1, a lone colon on the command line of h5dump --xml (as in
-  the testh5dumpxml.sh script) is misinterpereted by the operating system
-  and causes an error.
-
-* On mpich 1.2.5 and 1.2.6, if more than two processes contribute no IO and 
-  the application asks to do collective IO, we have found that when using 4 
-  processors, a simple collective write will sometimes be hung. This can be 
-  verified with t_mpi test under testpar.
-
-* On IRIX6.5, when the C compiler version is greater than 7.4, complicated
-  MPI derived datatype code will work. However, the user should increase
-  the value of the MPI_TYPE_MAX environment variable to some appropriate value 
-  to use collective irregular selection code.  For example, the current 
-  parallel HDF5 test needs to raise MPI_TYPE_MAX to 200,000 to pass the test. 
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  SLU - 2005/6/30
-
-* For version 6 (6.02 and 6.04) of the Portland Group compiler on the AMD 
-  Opteron processor, there is a bug in the compiler for optimization(-O2).  
-  The library failed in several tests, all related to the MULTI driver.  
-  The problem has been reported to the vendor.  
 
-* On IBM AIX systems, parallel HDF5 mode will fail some tests with error
-  messages like "INFO: 0031-XXX ...".  This is from the command `poe'.
-  Set the environment variable MP_INFOLEVEL to 0 to minimize the messages
-  and run the tests again.
+o SunOS 5.6 with C WorkShop Compilers 4.2:  hyperslab selections will 
+  fail if library is compiled using optimization of any level.
+o TFLOPS: dsets test fails if compiled with optimization turned on.
+o J90: tools fail to dispay data for the datasets with a compound datatype. 
 
-  The tests may fail with messages like "The socket name is already in use",  
-  but HDF5 does not use sockets.  This failure is due to problems with the 
-  poe command trying to set up the debug socket.  To resolve this problem, 
-  check to see whether there are many old /tmp/s.pedb.* files staying around.  
-  These are sockets used by the poe command and left behind due to failed 
-  commands.  First, ask your system administrator to clean them out.  
-  Lastly, request IBM to provide a means to run poe without the debug socket.
+Platforms Tested
+================
 
-* The --enable-static-exec configure flag fails to compile for Solaris
-  platforms. This is due to the fact that not all of the system libraries on 
-  Solaris are available in a static format.
+  AIX 4.3.3 (IBM SP)            3.6.6                               | binaries
+                                mpicc using mpich 1.1.2             | are not
+                                mpicc_r using IBM MPI-IO prototype  | available
+  AIX 4.3.2.0 (IBM SP)          xlc 5.0.1.0
+  Cray J90 10.0.0.7             cc 6.3.0.2
+  Cray T3E 2.0.5.29             cc 6.3.0.2
+                                mpt.1.3
+  FreeBSD 4.0                   gcc 2.95.2
+  HP-UX B.10.20                 HP C  HP92453-01 A.10.32
+  HP-UX B.11.00                 HP92453-01 A.11.00.13 HP C Compiler 
+                                (static library only, h5toh4 tool is not available) 
+  IRIX 6.5                      MIPSpro cc 7.30
+  IRIX64 6.5 (64 & n32)         MIPSpro cc 7.3.1m
+                                mpt.1.4
+
+  Linux 2.2.10 SMP              gcc 2.95.1 
+                                mpicc(gcc-2.95.1)
+                                gcc (egcs-2.91.66)
+                                mpicc (egcs-2.91.66)
+  Linux 2.2.16 (RedHat 6.2)     gcc 2.95.2
+
+  OSF1 V4.0                     DEC-V5.2-040
+  SunOS 5.6                     cc WorkShop Compilers 5.0 no optimization
+  SunOS 5.7                     cc WorkShop Compilers 5.0
+  SolarisX86 SunOS 5.5.1        gcc version 2.7.2 with --disable-hsizet
+  TFLOPS 3.2.1                  pgcc Rel 3.1-3i
+                                mpich-1.1.2 with local changes
+  Windows NT4.0 sp5             MSVC++ 6.0
+  Windows 98                    MSVC++ 6.0
+  Windows 2000                  MSVC++ 6.0
+
+
+
+%%%%1.2.1%%%%   Release Information for hdf5-1.2.1
+
+6.  Release Information for hdf5-1.2.1
+================================================================
+
+
+Bug fixes since HDF5-1.2.0
+==========================
 
-  The --enable-static-exec configure flag also fails to correctly compile
-  on IBM SP2 platforms for serial mode. The parallel mode works fine with 
-  this option.
-  
-  It is suggested that you do not use this option on these platforms
-  during configuration.
+Configuration
+-------------
 
-* With the gcc 2.95.2 compiler, HDF5 uses the `-ansi' flag during
-  compilation. The ANSI version of the compiler complains about not being
-  able to handle the `long long' datatype with the warning:
+   * The hdf5.h include file was fixed to allow the HDF5 Library to be compiled
+     with other libraries/applications that use GNU autoconf. 
+   * Configuration for parallel HDF5 was improved. Configure now attempts to
+     link with libmpi.a and/or libmpio.a as the MPI libraries by default.
+     It also uses "mpirun" to launch MPI tests by default.  It tests to
+     link MPIO routines during the configuration stage, rather than failing
+     later as before.  One can just do "./configure --enable-parallel"
+     if the MPI library is in the system library.
+
+Library
+-------
+
+   * Error was fixed which was not allowing dataset region references to have
+     their regions retrieved correctly.
+   * Added internal free-lists to reduce memory required by the library and
+     H5garbage_collect API function
+   * Fixed error in H5Giterate which was not updating the "index" parameter
+     correctly.
+   * Fixed error in hyperslab iteration which was not walking through the
+     correct sequence of array elements if hyperslabs were staggered in a
+     certain pattern
+   * Fixed several other problems in hyperslab iteration code.
+
+Tests
+------
+
+   * Added additional tests for group and attribute iteration.
+   * Added additional test for staggered hyperslab iteration.
+   * Added additional test for random 5-D hyperslab selection.
+
+Tools
+------
+
+   * Added an option, -V, to show the version information of h5dump.
+   * Fixed a core dumping bug of h5toh4 when executed on platforms like 
+     TFLOPS.
+   * The test script for h5toh4 used to not able to detect the hdp
+     dumper command was not valid.  It now detects and reports the
+     failure of hdp execution.
+
+Documentation
+-------------
 
-        warning: ANSI C does not support `long long'
-  
-  This warning is innocuous and can be safely ignored.
+   * User's Guide and Reference Manual were updated. 
+     See doc/html/PSandPDF/index.html for more details. 
 
-* The ./dsets tests fail on the TFLOPS machine if the test program,
-  dsets.c, is compiled with the -O option.  The HDF5 library still works
-  correctly with the -O option.  The test program works fine if it is
-  compiled with -O1 or -O0.  Only -O (same as -O2) causes the test
-  program to fail.
+   
+Platforms Tested:
+================
+Note: Due to the nature of bug fixes, only static versions of the library and tools were tested.
+
+
+  AIX 4.3.2 (IBM SP)            3.6.6
+  Cray T3E 2.0.4.81             cc 6.3.0.1
+                                mpt.1.3
+  FreeBSD 3.3-STABLE            gcc 2.95.2
+  HP-UX B.10.20                 HP C  HP92453-01 A.10.32
+  IRIX 6.5                      MIPSpro cc 7.30
+  IRIX64 6.5 (64 & n32)         MIPSpro cc 7.3.1m
+                                mpt.1.3 (SGI MPI 3.2.0.0)
+
+  Linux 2.2.10 SuSE             egcs-2.91.66               configured with
+  (i686-pc-linux-gnu)                                      --disable-hsizet
+                                mpich-1.2.0 egcs-2.91.66 19990314/Linux 
+
+  OSF1 V4.0                     DEC-V5.2-040
+  SunOS 5.6                     cc WorkShop Compilers 4.2  no optimization
+  SunOS 5.7                     cc WorkShop Compilers 5.0
+  TFLOPS 2.8                    cicc (pgcc Rel 3.0-5i)
+                                mpich-1.1.2 with local changes
+  Windows NT4.0 sp5             MSVC++ 6.0
+
+Known Problems:
+==============
 
-* Not all platforms behave correctly with Szip's shared libraries. Szip is
-  disabled in these cases, and a message is relayed at configure time. Static
-  libraries should be working on all systems that support Szip and should be
-  used when shared libraries are unavailable. 
+o SunOS 5.6 with C WorkShop Compilers 4.2:  Hyperslab selections will 
+  fail if library is compiled using optimization of any level.
 
-  There is also a configure error on Altix machines that incorrectly reports 
-  when a version of Szip without an encoder is being used.
 
-* On some platforms that use Intel and Absoft compilers to build the HDF5 
-  Fortran library, compilation may fail for fortranlib_test.f90, fflush1.f90 
-  and fflush2.f90 complaining about the exit subroutine. Comment out the line 
-  IF (total_error .ne. 0) CALL exit (total_error).
 
-* Information about building with PGI and Intel compilers is available in
-  the INSTALL file sections 4.7 and 4.8.
+%%%%1.2.0%%%%   Release Information for hdf5-1.2.0
+         
+5. Release Information for hdf5-1.2.0
+===================================================================
 
-* On at least one system, SDSC DataStar, the scheduler (in this case
-  LoadLeveler) sends job status updates to standard error when you run 
-  any executable that was compiled with the parallel compilers.
+A. Platforms Supported
+   -------------------
 
-  This causes problems when running "make check" on parallel builds, as 
-  many of the tool tests function by saving the output from test runs,
-  and comparing it to an exemplar.  
+Operating systems listed below with compiler information and MPI library, if
+applicable, are systems that HDF5 1.2.0 was tested on.
 
-  The best solution is to reconfigure the target system so it no longer
-  inserts the extra text.  However, this may not be practical.
+                           Compiler & libraries
+  Platform                      Information              Comment
+  --------                      ----------               -------- 
+                                
+  AIX 4.3.2 (IBM SP)            3.6.6
 
-  In such cases, one solution is to "setenv HDF5_Make_Ignore yes" prior to 
-  the configure and build.  This will cause "make check" to continue after 
-  detecting errors in the tool tests.  However, in the case of SDSC DataStar,
-  it also leaves you with some 150 "failed" tests to examine by hand.
+  Cray J90 10.0.0.6             cc 6.3.0.0
 
-  A second solution is to write a script to run serial tests and filter
-  out the text added by the scheduler.  A sample script used on SDSC
-  DataStar is given below, but you will probably have to customize it 
-  for your installation.  
+  Cray T3E 2.0.4.61             cc 6.2.1.0 
+                                mpt.1.3
 
-  Observe that the basic idea is to insert the script as the first item 
-  on the command line which executes the the test.  The script then 
-  executes the test and filters out the offending text before passing
-  it on.
+  FreeBSD 3.2                   gcc 2.95.1
 
-        #!/bin/csh
+  HP-UX B.10.20                 HP C  HP92453-01 A.10.32
+                                gcc 2.8.1
 
-        set STDOUT_FILE=~/bin/serial_filter.stdout
-        set STDERR_FILE=~/bin/serial_filter.stderr
+  IRIX 6.5                      MIPSpro cc 7.30 
 
-        rm -f $STDOUT_FILE $STDERR_FILE
+  IRIX64 6.5 (64 & n32)         MIPSpro cc 7.3.1m
+  			        mpt.1.3 (SGI MPI 3.2.0.0)
 
-        ($* > $STDOUT_FILE) >& $STDERR_FILE
+  Linux 2.2.10                  egcs-2.91.66               configured with
+  						         --disable-hsizet
+                                                           lbraries: glibc2
 
-        set RETURN_VALUE=$status
+  OSF1 V4.0                     DEC-V5.2-040
 
-        cat $STDOUT_FILE
+  SunOS 5.6                     cc WorkShop Compilers 4.2   
+                                                           no optimization
+  			        gcc 2.8.1
 
-        tail +3 $STDERR_FILE
+  SunOS 5.7                     cc WorkShop Compilers 5.0
+                                gcc 2.8.1
+ 
+  TFLOPS 2.7.1                  cicc (pgcc Rel 3.0-4i)
+  			        mpich-1.1.2 with local changes
 
-        exit $RETURN_VALUE
+  Windows NT4.0 intel           MSVC++ 5.0 and 6.0
 
-  You get the HDF5 make files and test scipts to execute your filter script
-  by setting the environment variable "RUNSERIAL" to the full path of the 
-  script prior to running configure for parallel builds.  Remember to 
-  "unsetenv RUNSERIAL" before running configure for a serial build.
+  Windows NT alpha 4.0          MSVC++ 5.0 
 
-  Note that the RUNSERIAL environment variable exists so that we can 
-  prefix serial runs as necessary on the target system.  On DataStar,
-  no prefix is necessary.  However on an MPICH system, the prefix might
-  have to be set to something like "/usr/local/mpi/bin/mpirun -np 1" to
-  get the serial tests to run at all.
+  Windows 98                    MSVC++ 5.0
 
-  In such cases, you will have to include the regular prefix in your
-  filter script.
 
-* H5Ocopy() does not copy reg_ref attributes correctly when shared-message
-  is turn on. The value of the reference in the destination attriubte is
-  wrong. This H5Ocopy problem will affect the h5copy tool.
+B. Known Problems
+   --------------
 
-* In the C++ API, it appears that there are bugs in Attribute::write/read
-  and DataSet::write/read for fixed- and variable-len strings.  The problems
-  are being worked on and a patch will be provided when the fixes are
-  available.
+* NT alpha 4.0
+  Dumper utiliy h5dump fails if linked with DLL.
 
+* SunOS 5.6 with C WorkShop Compilers 4.2
+  Hyperslab selections will fail if library is compiled using optimization
+  of any level.
 
-%%%%1.8.0%%%%   
+ 
+C. Changes Since Version 1.0.1
+   ---------------------------
 
+1. Documentation
+   -------------
 
-HDF5 version 1.8.0 released on Tue Feb 12 20:41:19 CST 2008
-================================================================================
+* More examples
 
-INTRODUCTION
-============
+* Updated user guide, reference manual, and format specification.
 
-This document describes the differences between the HDF5-1.6.x release series
-and HDF5 1.8.0, and contains information on the platforms tested and known 
-problems in HDF5-1.8.0.  For more details, see the HISTORY-1_0-1_8_0_rc3.txt
-file in the 
-release_docs/ directory of the HDF5 source.
+* Self-contained documentation for installations isolated from the
+  Internet.
 
-Links to the HDF5 1.8.0 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
+* HDF5 Tutorial was added to the documentation  
 
-     http://www.hdfgroup.org/products/hdf5/
+2. Configuration
+   -------------
 
-The HDF5 1.8.0 release can be obtained from:
+* Better detection and support for MPI-IO.
 
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
+* Recognition of compilers with known code generation problems.
 
-User documentation for 1.8.0 can be accessed directly at this location: 
+* Support for various compilers on a single architecture (e.g., the
+  native compiler and the GNU compilers).
 
-     http://www.hdfgroup.org/HDF5/doc/
+* Ability to build from read-only media and with different compilers
+  and/or options concurrently.
 
-New features in 1.8.0, including brief general descriptions of some new 
-and modified APIs, are described in the "What's New in 1.8.0?" document:
+* Added a libhdf5.settings file which summarizes the configuration
+  information and is installed along with the library.
 
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
+* Builds a shared library on most systems that support it.
 
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.0 (current 
-release) versus Release 1.6.x":
+* Support for Cray T3E, J90 and Windows/NT.
 
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
+3. Debugging
+   ---------
 
-If you have any questions or comments, please send them to the HDF Help Desk:
+* Improved control and redirection of debugging and tracing messages.
 
-     help at hdfgroup.org
+4. Datatypes
+   ---------
 
+* Optimizations to compound datatype conversions and I/O operations.
 
-CONTENTS
-========
+* Added nearly 100 optimized conversion functions for native datatypes 
+  including support for non-aligned data.
 
-- New Features
-- Removed Feature
-- Support for new platforms and languages
-- Bug Fixes since HDF5-1.6.0
-- Platforms Tested
-- Supported Configuration Features Summary
-- Known Problems
+* Added support for bitfield, opaque, and enumeration types.
 
+* Added distinctions between signed and unsigned char types to the
+  list of predefined native hdf5 datatypes.
 
-New Features
-============
+* Added HDF5 type definitions for C9x types like int32_t.
 
-   HDF5 Release 1.8.0 is a major release with many changes and new features.
+* Application-defined type conversion functions can handle non-packed
+  data.
 
-   New format and interface features discussed in the "What's New in 
-   HDF5 1.8.0" document include the following:
+* Changed the H5Tunregister() function to use wildcards when matching
+  conversion functions.  H5Tregister_hard() and H5Tregister_soft()
+  were combined into H5Tregister().
 
-       Enhanced group object management
-       Enhanced attribute management and more efficient meta data handling
-       Expanded datatype features
-       Creation order tracking and indexing
-       Improved meta data caching and cache control
-       UTF-8 encoding
-       New I/O filters: n-bit and scale+offset compression
-       New link (H5L) and object (H5O) interfaces and features
-       External and user-defined links
-       New high-level APIs: 
-           HDF5 Packet Table (H5PT) and HDF5 Dimension Scale (H5DS)
-       C++ and Fortran interfaces for older high-level APIs:
-           H5Lite (H5LT), H5Image (H5IM), and H5Table (H5TB)
-       New and improved tools
-       And more...
+* Support for variable-length datatypes (arrays of varying length per
+  dataset element). Variable length strings currently supported only
+  as variable length arrays of 1-byte integers.
 
-       http://hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
+5. Dataspaces
+   ----------
 
+* New query functions for selections.
 
-    New APIs associated with these features, other interface changes 
-    (e.g., ENUM and struct definitions), and new library configuration flags
-    are listed in the "Release 1.8.0 (current release) versus Release 1.6.x" 
-    section of "HDF5 Software Changes from Release to Release."
+* I/O operations bypass the stripmining loop and go directly to
+  storage for certain contiguous selections in the absense of type
+  conversions.  In other cases the stripmining buffers are used more
+  effectively.
 
-        http://hdfgroup.org/HDF5/doc/ADGuide/Changes.html
+* Reduced the number of I/O requests under certain circumstances,
+  improving performance on systems with high I/O latency.
 
-Compatibility
--------------
-    Many HDF5 users and user communities have existing applications that 
-    they may wish to port to Release 1.8.0.  Alternatively, some users may 
-    wish to take advantage of Release 1.8.0's improved performance without
-    having to port such applications.  To facilitate managing application
-    compatibility and porting applications from release to release, the HDF 
-    Team has implemented the following features:
-        Individually-configurable macros that selectively map common 
-            interface names to the old and new interfaces
-        Library configuration options to configure the macro mappings
-
-    Two related documents accompany this release:
-        "API Compatibility Macros in HDF5" discusses the specifics of the 
-        new individually-configurable macros and library configuration 
-        options.
-        http://hdfgroup.org/HDF5/doc/RM/APICompatMacros.html
- 
-        "New Features in HDF5 Release 1.8.0 and Backward/Forward Format
-        Compatibility Issues" discusses each new feature with regard to 
-        its impact on format compatibility.
-        http://hdfgroup.org/HDF5/doc/ADGuide/CompatFormat180.html
+6. Persistent Pointers
+   -------------------
 
-Referenced documents
---------------------
-    http://hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
-        "What's New in HDF5 1.8.0"
+* Object (serial and parallel) and dataset region (serial only)
+  references are implemented.
 
-    http://hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-        The "Release 1.8.0 (current release) versus Release 1.6.x "
-        section in "HDF5 Software Changes from Release to Release"
+7. Parallel Support
+   ----------------
 
-    http://hdfgroup.org/HDF5/doc/RM/APICompatMacros.html
-        "API Compatibility Macros in HDF5"
+* Improved parallel I/O performance.
 
-    http://hdfgroup.org/HDF5/doc/ADGuide/CompatFormat180.html
-        "New Features in HDF5 Release 1.8.0 and Backward/Forward Format
-        Compatibility Issues"
+* Supported new platforms: Cray T3E, Linux, DEC Cluster.
 
+* Use vendor supported version of MPIO on SGI O2K and Cray platforms.
 
-Removed Feature
-===============
-The stream virtual file driver (H5FD_STREAM) have been removed in this 
-release. This affects the functions H5Pset_fapl_stream and H5Pget_fapl_stream 
-and the constant H5FD_STREAM.
+* Improved the algorithm that translates an HDF5 hyperslab selection
+  into an MPI type for better collective I/O performance.
 
-This virtual file driver will be available at 
-http://hdf5-addons.origo.ethz.ch/. Note that at the time of this release, 
-the transition is still in progress; the necessary integration tools may 
-not be available when HDF5 Release 1.8.0 first comes out.
+8. New API functions 
+   -----------------
 
+  a. Property List Interface:
+     ------------------------
 
-Support for New Platforms, Languages, and Compilers
-===================================================
-    - Support for Open VMS 7.3 was added.
+  H5Pset_xfer		- set data transfer properties
+  H5Pset_preserve      - set dataset transfer property list status 
+  H5Pget_preserve      - get dataset transfer property list status
+  H5Pset_hyper_cache   - indicates whether to cache hyperslab blocks during I/O
+  H5Pget_hyper_cache   - returns information regarding the caching of 
+                         hyperslab blocks during I/O
+  H5Pget_btree_ratios  - sets B-tree split ratios for a dataset 
+                         transfer property list
+  H5Pset_btree_ratios  - gets B-tree split ratios for a dataset
+                         transfer property list
+  H5Pset_vlen_mem_manager - sets the memory manager for variable-length 
+                            datatype allocation
+  H5Pget_vlen_mem_manager - sets the memory manager for variable-length
+                            datatype allocation
 
+  b. Dataset Interface:
+     ------------------
 
-Bug Fixes since HDF5-1.6.0 
-==========================
-    This release contains numerous bug fixes. For details, see the 
-    "Changes from 1.6.0 to 1.8.0-rc3" section of the HISTORY.txt file for
-    this release.
+  H5Diterate           - iterate over all selected elements in a dataspace
+  H5Dget_storage_size  - return the amount of storage required for a dataset
+  H5Dvlen_reclaim      - reclaim VL datatype memory buffers
 
+  c. Dataspace Interface:
+     --------------------
+  H5Sget_select_hyper_nblocks   - get number of hyperslab blocks
+  H5Sget_select_hyper_blocklist - get the list of hyperslab blocks 
+                                  currently selected
+  H5Sget_select_elem_npoints    - get the number of element points 
+                                  in the current selection
+  H5Sget_select_elem_pointlist  - get the list of element points 
+                                  currently selected
+  H5Sget_select_bounds          - gets the bounding box containing 
+                                  the current selection
 
-Platforms Tested
-================
-The following platforms and compilers have been tested for for this release.
+  d. Datatype Interface:
+     -------------------
+  H5Tget_super         - return the base datatype from which a 
+                         datatype is derived
+  H5Tvlen_create       - creates a new variable-length dataype
+  H5Tenum_create       - creates a new enumeration datatype
+  H5Tenum_insert       - inserts a new enumeration datatype member
+  H5Tenum_nameof       - returns the symbol name corresponding to a 
+                         specified member of an enumeration datatype
+  H5Tvalueof           - return the value corresponding to a 
+                         specified member of an enumeration datatype 
+  H5Tget_member_value  - return the value of an enumeration datatype member
+  H5Tset_tag           - tags an opaque datatype
+  H5Tget_tag           - gets the tag associated with an opaque datatype
+
+  e. Identifier Interface:
+     ---------------------
+  H5Iget_type          - retrieve the type of an object
+
+  f. Reference Interface:
+     --------------------
+  H5Rcreate            - creates a reference
+  H5Rdereference       - open the HDF5 object referenced
+  H5Rget_region        - retrieve a dataspace with the specified region selected
+  H5Rget_object_type   - retrieve the type of object that an 
+                         object reference points to
+
+  g. Ragged Arrays (alpha) (names of those API functions were changed):
+     ------------------------------------------------------------------
+   H5RAcreate		- create a new ragged array (old name was H5Rcreate)
+   H5RAopen		- open an existing array    (old name was H5Ropen)
+   H5RAclose		- close a ragged array      (old name was H5Rclose)
+   H5RAwrite		- write to an array         (old name was H5Rwrite)
+   H5RAread		- read from an array        (old name was H5Rread)
+
+
+9. Tools
+   -----
+
+* Enhancements to the h5ls tool including the ability to list objects
+  from more than one file, to display raw hexadecimal data, to
+  show file addresses for raw data, to format output more reasonably,
+  to show object attributes, and to perform a recursive listing, 
 
-    AIX 5.2 (32/64 bit)           xlc 8.0.0.11
-                                  xlC 8.0
-                                  xlf 10.01.0000.0 
-                                  mpcc_r 6.0.0.8
-                                  mpxlf_r 8.1.1.7
+* Enhancements to h5dump: support new data types added since previous
+  versions.
 
-    FreeBSD 6.2-STABLE i386       gcc 3.4.6 [FreeBSD] 20060305
-    (duty)                        g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.2.1 20080123
-                                  g++ 4.2.1 20080123
-                                  gfortran 4.2.1 20070620
+* h5toh4: An hdf5 to hdf4 converter.
 
-    FreeBSD 6.2-STABLE amd64      gcc 3.4.6 [FreeBSD] 20060305
-    (liberty)                     g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.2.1 20080123
-                                  g++ 4.2.1 20080123
-                                  gfortran 4.2.1 20080123
 
-    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.4.4m
-                                  F90 MIPSpro 7.4.4m 
-                                  C++ MIPSpro cc 7.4.4m
 
-    Linux 2.6.9 (RHEL4)           Intel 10.0 compilers
-    (abe.ncsa.uiuc.edu)
+%%%%1.0.1%%%%   Release Information for hdf5-1.0.1
+         
+4.  Changes from Release 1.0.0 to Release 1.0.1
+=====================================================================
 
-    Linux 2.4.21-47               gcc 3.2.3 20030502
-    (osage)
+* [Improvement]: configure sets up the Makefile in the parallel tests
+  suit (testpar/) correctly.
 
-    Linux 2.6.9-42.0.10           gcc 3.4.6 20060404
-    (kagiso)                      PGI 7.0-7 (pgcc, pgf90, pgCC)
-                                  Intel 9.1 (icc, ifort, icpc)
+* [Bug-Fix]: Configure failed for all IRIX versions other than 6.3.
+  It now configures correctly for all IRIX 6.x version.
 
-    Linux 2.6.16.27 x86_64 AMD    gcc 4.1.0 (SuSE Linux), g++ 4.1.0, 
-    (smirom)                          g95 (GCC 4.0.3)
-                                  PGI 6.2-5 (pgcc, pgf90, pgCC)
-                                  Intel 9.1 (icc, iort, icpc)
+* Released Parallel HDF5 
 
-    Linux 2.6.5-7.252.1-rtgfx #1  Intel(R) C++ Version 9.0
-          SMP ia64                Intel(R) Fortran Itanium(R) Version 9.0 
-    (cobalt)                      SGI MPI
+     Supported Features:
+     ------------------
 
-    SunOS 5.8 32,46               Sun WorkShop 6 update 2 C 5.3
-     (Solaris 2.8)                Sun WorkShop 6 update 2 Fortran 95 6.2
-                                  Sun WorkShop 6 update 2 C++ 5.3
+     HDF5 files are accessed according to the communicator and INFO
+     object defined in the property list set by H5Pset_mpi.
 
-    SunOS 5.10                    cc: Sun C 5.8 
-    (linew)                       f90: Sun Fortran 95 8.2 
-                                  CC: Sun C++ 5.8 
+     Independent read and write accesses to fixed and extendable dimension
+     datasets.
 
-    Xeon Linux 2.4.21-32.0.1.ELsmp-perfctr-lustre
-    (tungsten)                    gcc 3.2.2 20030222
-                                  Intel(R) C++ Version 9.0
-                                  Intel(R) Fortran Compiler Version 9.0
+     Collective read and write accesses to fixed dimension datasets.
 
-    IA-64 Linux 2.4.21.SuSE_292.til1 ia64
-    (NCSA tg-login)               gcc 3.2.2
-                                  Intel(R) C++ Version 8.1
-                                  Intel(R) Fortran Compiler Version 8.1
-                                  mpich-gm-1.2.5..10-intel-r2
+     Supported Platforms:
+     -------------------
 
-    Windows XP                    Visual Studio .NET
-                                  Visual Studio 2005 w/ Intel Fortran 9.1
-                                  Cygwin(native gcc compiler and g95)
-                                  MinGW(native gcc compiler and g95)
+     Intel Red
+     IBM SP2
+     SGI Origin 2000
 
-    Windows XP x64                Visual Studio 2005 w/ Intel Fortran 9.1
+     Changes In This Release: 
+     -----------------------
 
-    Windows Vista                 Visual Studio 2005
+   o Support of Access to Extendable Dimension Datasets.
+     Extendable dimension datasets must use chunked storage methods.
+     A new function, H5Dextend, is created to extend the current
+     dimensions of a dataset.  The current release requires the
+     MPI application must make a collective call to extend the
+     dimensions of an extendable dataset before writing to the
+     newly extended area.  (The serial does not require the
+     call of H5Dextend.  The dimensions of an extendable
+     dataset is increased when data is written to beyond the
+     current dimensions but within the maximum dimensions.)
+     The required collective call of H5Dextend may be relaxed
+     in future release.
 
-    MAC OS  10.4 (Intel)          gcc i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 
-                                  G95 (GCC 4.0.3 (g95 0.91!) Nov 21 2006)
+     This release only support independent read and write accesses
+     to extendable datasets.  Collective accesses to extendable
+     datasets will be implemented in future releases.
 
-    Alpha Open VMS 7.3            Compaq C V6.5-001-48BCD
-                                  HP Fortran V7.6-3276
-                                  Compaq C++ V6.5-004
+   o Collective access to fixed dimension datasets.
+     Collective access to a dataset can be specified in the transfer
+     property list argument in H5Dread and H5Dwrite.  The current
+     release supports collective access to fixed dimension datasets.
+     Collective access to extendable datasets will be implemented in
+     future releases.
 
+   o HDF5 files are opened according to Communicator and INFO object.
+     H5Dopen now records the communicator and INFO setup by H5Pset_mmpi
+     and pass them to the corresponding MPIO open file calls for
+     processing.
 
-Supported Configuration Features Summary
-========================================
+   o This release has been tested on IBM SP2, Intel Red and SGI Origin 2000
+     systems.  It uses the ROMIO version of MPIO interface for parallel
+     I/O supports.
 
-    In the tables below
-          y   = tested and supported
-          n   = not supported or not tested in this release
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                 C        F90    F90      C++   zlib  SZIP
-                         parallel        parallel
-SunOS5.8 64-bit          n        y      n        y     y     y
-SunOS5.8 32-bit          n        y      n        y     y     y
-SunOS5.10 64-bit         y(1)     y      n        y     y     y
-SunOS5.10 32-bit         y(1)     y      n        y     y     y
-IRIX64_6.5 64-bit        n        y      y        y     y     y
-IRIX64_6.5 32-bit        n        n      n        n     y     y
-AIX-5.2  32-bit          y        y      y        y     y     y
-AIX-5.2  64-bit          y        y      y        y     y     y
-Windows XP               n        y(15)  n(15)    y     y     y
-Windows XP x64           n        y(15)  n(15)    y     y     y
-Windows Vista            n        n      n        y     y     y
-Mac OS X 10.4 PowerPC    n               n
-Mac OS X 10.4 Intel      n        y      n        y     y     y
-FreeBSD 4.11             n        n      n        y     y     y
-RedHat EL3  W       (3)  y(1a)    y(10)  y(1a)    y     y     y
-RedHat EL3  W Intel (3)  n        y      n        y     y     n
-RedHat EL3  W PGI   (3)  n        y      n        y     y     n
-SuSe x86_64 gcc  (3,12)  y(1a)    y(11)  n        y     y     y
-SuSe x86_64 Int  (3,12)  n        y(13)  n        y     y     n
-SuSe x86_64 PGI  (3,12)  n        y(8)   n        y     y     y
-Linux 2.4 Xeon C 
-    Lustre Intel  (3,6)  n        y      n        y     y     n
-Linux 2.6 SuSE ia64 C 
-    Intel         (3,7)  y        y      y        y     y     n
-Linux 2.6 SGI Altix 
-    ia64 Intel      (3)  y        y      y        y     y     y
-Alpha OpenVMS 7.3.2      n        y      n        y     n     n
-
-
-
-Platform                 Shared  Shared    Shared    static-  Thread-  
-                         C libs  F90 libs  C++ libs  exec     safe     
-Solaris2.8 64-bit        y       y         y         x        y        
-Solaris2.8 32-bit        y       y         y         x        y        
-Solaris2.10 64-bit       y                           x        y        
-Solaris2.10 32-bit       y                           x        y        
-IRIX64_6.5 64-bit        y       y         n         y        y        
-IRIX64_6.5 32-bit        y       dna       y         y        y        
-AIX-5.2 & 5.3 32-bit     n       n         n         y        n        
-AIX-5.2 & 5.3 64-bit     n       n         n         y        n        
-Windows XP               y       y(15)     y         y        y        
-Windows XP x64           y       y(15)     y         y        y        
-Windows Vista            y       n         n         y        y        
-Mac OS X 10.3            y                           y        n        
-FreeBSD 4.11             y       n         y         y        y        
-RedHat EL3  W       (3)  y       y(10)     y         y        y        
-RedHat EL3  W Intel (3)  y       y         y         y        n        
-RedHat EL3  W PGI   (3)  y       y         y         y        n        
-SuSe x86_64 W GNU (3,12) y       y         y         y        y        
-SuSe x86_64 W Int (3,12) y       y         y         y(14)    n        
-SuSe x86_64 W PGI (3,12) y       y         y         y(14)    n        
-Linux 2.4 Xeon C 
-    Lustre Intel    (6)  y       y         y         y        n        
-Linux 2.4 SuSE 
-    ia64 C Intel    (7)  y       y         y         y        n        
-Linux 2.4 SGI Altix 
-    ia64 Intel           y                           y        n        
-Alpha OpenVMS 7.3.2      n       n         n         y        n        
-
-    Notes: (1)  Using mpich 1.2.6.
-           (1a) Using mpich2 1.0.6.
-           (2)  Using mpt and mpich 1.2.6.
-           (3)  Linux 2.6 with GNU, Intel, and PGI compilers, as indicated.  
-                  W or C indicates workstation or cluster, respectively.
 
-           (6)  Linux 2.4.21-32.0.1.  Xeon cluster with ELsmp_perfctr_lustre 
-                  and Intel compilers
-           (7)  Linux 2.4.21, SuSE_292.till.  Ia64 cluster with Intel
-compilers
-           (8)  pgf90
-           (9)  With Compaq Visual Fortran 6.6c compiler.
-           (10) With PGI and Absoft compilers.
-           (11) PGI and Intel compilers for both C and Fortran
-           (12) AMD Opteron x86_64
-           (13) ifort
-           (14) Yes with C and Fortran, but not with C++
-	   (15) Using Visual Studio 2005 or Cygwin
-           (16) Not tested for this release.
-    Compiler versions for each platform are listed in the preceding
-    "Platforms Tested" table.
 
+%%%%1.0.0%%%%   Release Information for hdf5-1.0.0
 
-Known Problems
-==============
-* We have discovered two problems when running collective IO parallel HDF5 
-  tests with chunking storage on the ChaMPIon MPI compiler on tungsten, a 
-  Linux cluster at NCSA.
-
-  Under some complex selection cases: 
-  1) MPI_Get_element returns the wrong value.
-  2) MPI_Type_struct also generates the wrong derived datatype and corrupt 
-     data may be generated.
-  These issues arise only when turning on collective IO with chunking storage 
-  with some complex selections. We have not found these problems on other 
-  MPI-IO compilers. If you encounter these problems, you may use independent 
-  IO instead.
-
-  To avoid this behavior, change the following line in your code
-      H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
-
-  to
-      H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_INDEPENDENT);
-
-  KY - 2007/08/24
-
-* For SNL, spirit/liberty/thunderbird: The serial tests pass but parallel
-  tests failed with MPI-IO file locking message. AKC - 2007/6/25
-
-* On Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* For SNL, Red Storm: Only parallel HDF5 is supported.  The serial tests pass
-  when run against the parallel library; the parallel tests also pass, but
-  with lots of non-fatal error messages.
-
-* For LLNL, uP: both serial and parallel tests pass.  
-  Zeus: Serial tests pass but parallel tests fail with a known problem in MPI.
-  ubgl: Serial tests pass but parallel tests fail. 
-
-* On SUN 5.10 C++, testing fails in the "Testing Shared Datatypes with 
-  Attributes" test. 
-
-* Configuring with --enable-debug=all produces compiler errors on most
-  platforms:  Users who want to run HDF5 in debug mode should use
-  --enable-debug rather than --enable-debug=all to enable debugging
-  information on most modules.
-
-* On Mac OS 10.4, test/dt_arith.c has some errors in conversion from long
-  double to (unsigned) long long and from (unsigned) long long to long double. 
-
-* On Altix SGI with Intel 9.0, testmeta.c would not compile with -O3
-  optimization flag.
-
-* On VAX, the Scaleoffset filter is not supported. The filter cannot be 
-  applied to HDF5 data generated on VAX. The Scaleoffset filter only supports 
-  the IEEE standard for floating-point data.
-
-* On Cray X1, a lone colon on the command line of h5dump --xml (as in
-  the testh5dumpxml.sh script) is misinterpereted by the operating system
-  and causes an error.
-
-* On mpich 1.2.5 and 1.2.6, if more than two processes contribute no IO and 
-  the application asks to do collective IO, we have found that when using 4 
-  processors, a simple collective write will sometimes be hung. This can be 
-  verified with t_mpi test under testpar.
-
-* On IRIX6.5, when the C compiler version is greater than 7.4, complicated
-  MPI derived datatype code will work. However, the user should increase
-  the value of the MPI_TYPE_MAX environment variable to some appropriate value 
-  to use collective irregular selection code.  For example, the current 
-  parallel HDF5 test needs to raise MPI_TYPE_MAX to 200,000 to pass the test. 
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculating code of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  SLU - 2005/6/30
-
-* For version 6 (6.02 and 6.04) of the Portland Group compiler on the AMD 
-  Opteron processor, there is a bug in the compiler for optimization(-O2).  
-  The library failed in several tests, all related to the MULTI driver.  
-  The problem has been reported to the vendor.  
+3.  Changes from the Beta 1.0.0 Release to Release 1.0.0
+====================================================================
 
-* On IBM AIX systems, parallel HDF5 mode will fail some tests with error
-  messages like "INFO: 0031-XXX ...".  This is from the command `poe'.
-  Set the environment variable MP_INFOLEVEL to 0 to minimize the messages
-  and run the tests again.
+* Added fill values for datasets.  For contiguous datasets fill value
+  performance may be quite poor since the fill value is written to the 
+  entire dataset when the dataset is created.  This will be remedied
+  in a future version.  Chunked datasets using fill values do not
+  incur any additional overhead. See H5Pset_fill_value().
 
-  The tests may fail with messages like "The socket name is already in use",  
-  but HDF5 does not use sockets.  This failure is due to problems with the 
-  poe command trying to set up the debug socket.  To resolve this problem, 
-  check to see whether there are many old /tmp/s.pedb.* files staying around.  
-  These are sockets used by the poe command and left behind due to failed 
-  commands.  First, ask your system administrator to clean them out.  
-  Lastly, request IBM to provide a means to run poe without the debug socket.
+* Multiple hdf5 files can be "mounted" on one another to create a
+  larger virtual file. See H5Fmount().
 
-* The --enable-static-exec configure flag fails to compile for Solaris
-  platforms. This is due to the fact that not all of the system libraries on 
-  Solaris are available in a static format.
+* Object names can be removed or changed but objects are never
+  actually removed from the file yet. See H5Gunlink() and H5Gmove().
 
-  The --enable-static-exec configure flag also fails to correctly compile
-  on IBM SP2 platform for the serial mode. The parallel mode works fine with 
-  this option.
-  
-  It is suggested that you do not use this option on these platforms
-  during configuration.
+* Added a tuning mechanism for B-trees to insure that sequential
+  writes to chunked datasets use less overhead.  See H5Pset_btree_ratios().
 
-* With the gcc 2.95.2 compiler, HDF5 uses the `-ansi' flag during
-  compilation. The ANSI version of the compiler complains about not being
-  able to handle the `long long' datatype with the warning:
+* Various optimizations and bug fixes.
 
-        warning: ANSI C does not support `long long'
-  
-  This warning is innocuous and can be safely ignored.
 
-* The ./dsets tests fail on the TFLOPS machine if the test program,
-  dsets.c, is compiled with the -O option.  The HDF5 library still works
-  correctly with the -O option.  The test program works fine if it is
-  compiled with -O1 or -O0.  Only -O (same as -O2) causes the test
-  program to fail.
 
-* Not all platforms behave correctly with Szip's shared libraries. Szip is
-  disabled in these cases, and a message is relayed at configure time. Static
-  libraries should be working on all systems that support Szip and should be
-  used when shared libraries are unavailable. 
+%%%%1.0.0 Beta%%%%   Release Information for hdf5-1.0.0 Beta
 
-  There is also a configure error on Altix machines that incorrectly reports 
-  when a version of Szip without an encoder is being used.
+2. Changes from the Second Alpha 1.0.0 Release to the Beta 1.0.0 Release
+=========================================================================
 
-* On some platforms that use Intel and Absoft compilers to build the HDF5 
-  Fortran library, compilation may fail for fortranlib_test.f90, fflush1.f90 
-  and fflush2.f90 complaining about the exit subroutine. Comment out the line 
-  IF (total_error .ne. 0) CALL exit (total_error).
+* Strided hyperslab selections in dataspaces now working.
 
-* Information about building with PGI and Intel compilers is available in
-  the INSTALL file sections 4.7 and 4.8.
+* The compression API has been replaced with a more general filter
+  API.  See doc/html/Filters.html for details.
 
-* On at least one system, SDSC DataStar, the scheduler (in this case
-  LoadLeveler) sends job status updates to standard error when you run 
-  any executable that was compiled with the parallel compilers.
+* Alpha-quality 2d ragged arrays are implemented as a layer built on
+  top of other hdf5 objects.  The API and storage format will almost
+  certainly change.
 
-  This causes problems when running "make check" on parallel builds, as 
-  many of the tool tests function by saving the output from test runs,
-  and comparing it to an exemplar.  
+* More debugging support including API tracing.  See Debugging.html.
 
-  The best solution is to reconfigure the target system so it no longer
-  inserts the extra text.  However, this may not be practical.
+* C and Fortran style 8-bit fixed-length character string types are
+  supported with space or null padding or null termination and
+  translations between them.
 
-  In such cases, one solution is to "setenv HDF5_Make_Ignore yes" prior to 
-  the configure and build.  This will cause "make check" to continue after 
-  detecting errors in the tool tests.  However, in the case of SDSC DataStar,
-  it also leaves you with some 150 "failed" tests to examine by hand.
+* Added function H5Fflush() to write all cached data immediately to
+  the file.
 
-  A second solution is to write a script to run serial tests and filter
-  out the text added by the scheduler.  A sample script used on SDSC
-  DataStar is given below, but you will probably have to customize it 
-  for your installation.  
+* Datasets maintain a modification time which can be retrieved with
+  H5Gstat().
 
-  Observe that the basic idea is to insert the script as the first item 
-  on the command line which executes the the test.  The script then 
-  executes the test and filters out the offending text before passing
-  it on.
+* The h5ls tool can display much more information, including all the
+  values of a dataset.
 
-        #!/bin/csh
 
-        set STDOUT_FILE=~/bin/serial_filter.stdout
-        set STDERR_FILE=~/bin/serial_filter.stderr
 
-        rm -f $STDOUT_FILE $STDERR_FILE
+%%%%1.0.0 Alpha 2%%%%   Release Information for hdf5-1.0.0 Alpha 2
 
-        ($* > $STDOUT_FILE) >& $STDERR_FILE
+1.  Changes from the First Alpha 1.0.0 Release to 
+     the Second Alpha 1.0.0 Release
+=====================================================================
 
-        set RETURN_VALUE=$status
+* Two of the packages have been renamed.  The data space API has been
+  renamed from `H5P' to `H5S' and the property list (template) API has 
+  been renamed from `H5C' to `H5P'.
 
-        cat $STDOUT_FILE
+* The new attribute API `H5A' has been added.  An attribute is a small 
+  dataset which can be attached to some other object (for instance, a
+  4x4 transformation matrix attached to a 3-dimensional dataset, or an 
+  English abstract attached to a group).
 
-        tail +3 $STDERR_FILE
+* The error handling API `H5E' has been completed.  By default, when an
+  API function returns failure an error stack is displayed on the
+  standard error stream.  The H5Eset_auto() controls the automatic
+  printing and H5E_BEGIN_TRY/H5E_END_TRY macros can temporarily
+  disable the automatic error printing.
 
-        exit $RETURN_VALUE
+* Support for large files and datasets (>2GB) has been added.  There
+  is an html document that describes how it works.  Some of the types
+  for function arguments have changed to support this: all arguments
+  pertaining to sizes of memory objects are `size_t' and all arguments 
+  pertaining to file sizes are `hsize_t'.
 
-  You get the HDF5 make files and test scipts to execute your filter script
-  by setting the environment variable "RUNSERIAL" to the full path of the 
-  script prior to running configure for parallel builds.  Remember to 
-  "unsetenv RUNSERIAL" before running configure for a serial build.
+* More data type conversions have been added although none of them are
+  fine tuned for performance.  There are new converters from integer
+  to integer and float to float, but not between integers and floating
+  points.  A bug has been fixed in the converter between compound
+  types.
 
-  Note that the RUNSERIAL environment variable exists so that we can 
-  can prefix serial runs as necessary on the target system.  On DataStar,
-  no prefix is necessary.  However on an MPICH system, the prefix might
-  have to be set to something like "/usr/local/mpi/bin/mpirun -np 1" to
-  get the serial tests to run at all.
+* The numbered types have been removed from the API: int8, uint8,
+  int16, uint16, int32, uint32, int64, uint64, float32, and float64.
+  Use standard C types instead.  Similarly, the numbered types were
+  removed from the H5T_NATIVE_* architecture; use unnumbered types
+  which correspond to the standard C types like H5T_NATIVE_INT.
 
-  In such cases, you will have to include the regular prefix in your
-  filter script.
+* More debugging support was added.  If tracing is enabled at
+  configuration time (the default) and the HDF5_TRACE environment
+  variable is set to a file descriptor then all API calls will emit
+  the function name, argument names and values, and return value on
+  that file number.  There is an html document that describes this.
+  If appropriate debugging options are enabled at configuration time,
+  some packages will display performance information on stderr.
+
+* Data types can be stored in the file as independent objects and
+  multiple datasets can share a data type.
+
+* The raw data I/O stream has been implemented and the application can 
+  control meta and raw data caches, so I/O performance should be
+  improved from the first alpha release.
+
+* Group and attribute query functions have been implemented so it is
+  now possible to find out the contents of a file with no prior
+  knowledge.
+
+* External raw data storage allows datasets to be written by other
+  applications or I/O libraries and described and accessed through
+  HDF5.
+
+* Hard and soft (symbolic) links are implemented which allow groups to 
+  share objects. Dangling and recursive symbolic links are supported.
+
+* User-defined data compression is implemented although we may
+  generalize the interface to allow arbitrary user-defined filters
+  which can be used for compression, checksums, encryption,
+  performance monitoring, etc.  The publicly-available `deflate'
+  method is predefined if the GNU libz.a can be found at configuration 
+  time.
+
+* The configuration scripts have been modified to make it easier to
+  build debugging vs. production versions of the library.
+
+* The library automatically checks that the application was compiled
+  with the correct version of header files.
+
+
+		    Parallel HDF5 Changes
+
+* Parallel support for fixed dimension datasets with contiguous or
+  chunked storages.  Also, support unlimited dimension datasets which
+  must use chunk storage.  No parallel support for compressed datasets.
+
+* Collective data transfer for H5Dread/H5Dwrite.  Collective access
+  support for datasets with contiguous storage only, thus only fixed
+  dimension datasets for now.
+
+* H5Pset_mpi and H5Pget_mpi no longer have the access_mode
+  argument.  It is taken over by the data-transfer property list
+  of H5Dread/H5Dwrite.
+
+* New functions H5Pset_xfer and H5Pget_xfer to handle the
+  specification of independent or collective data transfer_mode
+  in the dataset transfer properties list.  The properties
+  list can be used to specify data transfer mode in the H5Dwrite
+  and H5Dread function calls.
+
+* Added parallel support for datasets with chunked storage layout.
+  When a dataset is extend in a PHDF5 file, all processes that open
+  the file must collectively call H5Dextend with identical new dimension
+  sizes.
+
+
+			LIST OF API FUNCTIONS
+
+The following functions are implemented. Errors are returned if an
+attempt is made to use some feature which is not implemented and
+printing the error stack will show `not implemented yet'.
+
+Library
+   H5check		- check that lib version matches header version
+   H5open		- initialize library (happens automatically)
+   H5close		- shut down the library (happens automatically)
+   H5dont_atexit	- don't call H5close on exit
+   H5get_libversion	- retrieve library version info
+   H5check_version	- check for specific library version
+
+Property Lists
+   H5Pclose		- release template resources
+   H5Pcopy		- copy a template
+   H5Pcreate		- create a new template
+   H5Pget_chunk		- get chunked storage properties
+   H5Pset_chunk		- set chunked storage properties
+   H5Pget_class		- get template class
+   H5Pget_istore_k	- get chunked storage properties
+   H5Pset_istore_k	- set chunked storage properties
+   H5Pget_layout	- get raw data layout class
+   H5Pset_layout	- set raw data layout class
+   H5Pget_sizes		- get address and size sizes
+   H5Pset_sizes		- set address and size sizes
+   H5Pget_sym_k		- get symbol table storage properties
+   H5Pset_sym_k		- set symbol table storage properties
+   H5Pget_userblock	- get user-block size
+   H5Pset_userblock	- set user-block size
+   H5Pget_version	- get file version numbers
+   H5Pget_alignment	- get data alignment properties
+   H5Pset_alignment	- set data alignment properties
+   H5Pget_external_count- get count of external data files
+   H5Pget_external	- get information about an external data file
+   H5Pset_external	- add a new external data file to the list
+   H5Pget_driver	- get low-level file driver class
+   H5Pget_stdio		- get properties for stdio low-level driver
+   H5Pset_stdio		- set properties for stdio low-level driver
+   H5Pget_sec2		- get properties for sec2 low-level driver
+   H5Pset_sec2		- set properties for sec2 low-level driver
+   H5Pget_core		- get properties for core low-level driver
+   H5Pset_core		- set properties for core low-level driver
+   H5Pget_split		- get properties for split low-level driver
+   H5Pset_split		- set properties for split low-level driver
+   H5P_get_family	- get properties for family low-level driver
+   H5P_set_family	- set properties for family low-level driver
+   H5Pget_cache		- get meta- and raw-data caching properties
+   H5Pset_cache		- set meta- and raw-data caching properties
+   H5Pget_buffer	- get raw-data I/O pipe buffer properties
+   H5Pset_buffer	- set raw-data I/O pipe buffer properties
+   H5Pget_preserve	- get type conversion preservation properties
+   H5Pset_preserve	- set type conversion preservation properties
+   H5Pget_nfilters	- get number of raw data filters
+   H5Pget_filter	- get raw data filter properties
+   H5Pset_filter	- set raw data filter properties
+   H5Pset_deflate	- set deflate compression filter properties
+   H5Pget_mpi		- get MPI-IO properties
+   H5Pset_mpi		- set MPI-IO properties
+   H5Pget_xfer		- get data transfer properties
+ + H5Pset_xfer		- set data transfer properties
+ + H5Pset_preserve      - set dataset transfer property list status 
+ + H5Pget_preserve      - get dataset transfer property list status
+ + H5Pset_hyper_cache   - indicates whether to cache hyperslab blocks during I/O
+ + H5Pget_hyper_cache   - returns information regarding the caching of 
+                          hyperslab blocks during I/O
+ + H5Pget_btree_ratios  - sets B-tree split ratios for a dataset 
+                          transfer property list
+ + H5Pset_btree_ratios  - gets B-tree split ratios for a dataset
+                          transfer property list
+ + H5Pset_vlen_mem_manager - sets the memory manager for variable-length 
+                             datatype allocation
+ + H5Pget_vlen_mem_manager - sets the memory manager for variable-length
+                             datatype allocation
+
+Datasets
+   H5Dclose		- release dataset resources
+   H5Dcreate		- create a new dataset
+   H5Dget_space		- get data space
+   H5Dget_type		- get data type
+   H5Dget_create_plist	- get dataset creation properties
+   H5Dopen		- open an existing dataset
+   H5Dread		- read raw data
+   H5Dwrite		- write raw data
+   H5Dextend		- extend a dataset
+ + H5Diterate           - iterate over all selected elements in a dataspace
+ + H5Dget_storage_size  - return the amount of storage required for a dataset
+ + H5Dvlen_reclaim      - reclaim VL datatype memory buffers
+
+Attributes
+   H5Acreate		- create a new attribute
+   H5Aopen_name		- open an attribute by name
+   H5Aopen_idx		- open an attribute by number
+   H5Awrite		- write values into an attribute
+   H5Aread		- read values from an attribute
+   H5Aget_space		- get attribute data space
+   H5Aget_type		- get attribute data type
+   H5Aget_name		- get attribute name
+   H5Anum_attrs		- return the number of attributes for an object
+   H5Aiterate		- iterate over an object's attributes
+   H5Adelete		- delete an attribute
+   H5Aclose		- close an attribute
+
+Errors
+   H5Eclear		- clear the error stack
+   H5Eprint		- print an error stack
+   H5Eget_auto		- get automatic error reporting settings
+   H5Eset_auto		- set automatic error reporting
+   H5Ewalk		- iterate over the error stack
+   H5Ewalk_cb		- the default error stack iterator function
+   H5Eget_major		- get the message for the major error number
+   H5Eget_minor		- get the message for the minor error number
+
+Files
+   H5Fclose		- close a file and release resources
+   H5Fcreate		- create a new file
+   H5Fget_create_plist	- get file creation property list
+   H5Fget_access_plist	- get file access property list
+   H5Fis_hdf5		- determine if a file is an hdf5 file
+   H5Fopen		- open an existing file
+   H5Freopen            - reopen an HDF5 file
+   H5Fmount             - mount a file
+   H5Funmount           - unmount a file
+   H5Fflush             - flush all buffers associated with a file to disk
+
+Groups
+   H5Gclose		- close a group and release resources
+   H5Gcreate    	- create a new group
+   H5Gopen		- open an existing group
+   H5Giterate   	- iterate over the contents of a group
+   H5Gmove		- change the name of some object
+   H5Glink		- create a hard or soft link to an object
+   H5Gunlink    	- break the link between a name and an object
+   H5Gget_objinfo	- get information about a group entry
+   H5Gget_linkval	- get the value of a soft link
+   H5Gget_comment	- get the comment string for an object
+   H5Gset_comment	- set the comment string for an object
+
+Dataspaces
+   H5Screate	        - create a new data space
+   H5Scopy		- copy a data space
+   H5Sclose		- release data space
+   H5Screate_simple	- create a new simple data space
+   H5Sset_space		- set simple data space extents
+   H5Sis_simple		- determine if data space is simple
+   H5Sset_extent_simple	- set simple data space dimensionality and size
+   H5Sget_simple_extent_npoints	- get number of points in simple extent
+   H5Sget_simple_extent_ndims - get simple data space dimensionality
+   H5Sget_simple_extent_dims - get simple data space size
+   H5Sget_simple_extent_type - get type of simple extent
+   H5Sset_extent_none	- reset extent to be empty
+   H5Sextent_copy	- copy the extent from one data space to another
+   H5Sget_select_npoints - get number of points selected for I/O
+   H5Sselect_hyperslab	- set hyperslab dataspace selection
+   H5Sselect_elements   - set element sequence dataspace selection
+   H5Sselect_all	- select entire extent for I/O
+   H5Sselect_none	- deselect all elements of extent
+   H5Soffset_simple	- set selection offset
+   H5Sselect_valid	- determine if selection is valid for extent
+ + H5Sget_select_hyper_nblocks   - get number of hyperslab blocks
+ + H5Sget_select_hyper_blocklist - get the list of hyperslab blocks 
+                                   currently selected
+ + H5Sget_select_elem_npoints    - get the number of element points 
+                                   in the current selection
+ + H5Sget_select_elem_pointlist  - get the list of element points 
+                                   currently selected
+ + H5Sget_select_bounds          - gets the bounding box containing 
+                                   the current selection
+
+Datatypes
+   H5Tclose		- release data type resources
+   H5Topen		- open a named data type
+   H5Tcommit		- name a data type
+   H5Tcommitted		- determine if a type is named
+   H5Tcopy		- copy a data type
+   H5Tcreate		- create a new data type
+   H5Tequal		- compare two data types
+   H5Tlock		- lock type to prevent changes
+   H5Tfind		- find a data type conversion function
+   H5Tconvert		- convert data from one type to another
+   H5Tregister    	- register a conversion function
+   H5Tunregister	- remove a conversion function
+   H5Tget_overflow	- get function that handles overflow conv. cases
+   H5Tset_overflow	- set function to handle overflow conversion cases
+   H5Tget_class		- get data type class
+   H5Tget_cset		- get character set
+   H5Tget_ebias		- get exponent bias
+   H5Tget_fields	- get floating point fields
+   H5Tget_inpad		- get inter-field padding
+   H5Tget_member_dims	- get struct member dimensions
+   H5Tget_member_name	- get struct member name
+   H5Tget_member_offset	- get struct member byte offset
+   H5Tget_member_type	- get struct member type
+   H5Tget_nmembers	- get number of struct members
+   H5Tget_norm		- get floating point normalization
+   H5Tget_offset	- get bit offset within type
+   H5Tget_order		- get byte order
+   H5Tget_pad		- get padding type
+   H5Tget_precision	- get precision in bits
+   H5Tget_sign		- get integer sign type
+   H5Tget_size		- get size in bytes
+   H5Tget_strpad	- get string padding
+   H5Tinsert		- insert scalar struct member
+   H5Tinsert_array	- insert array struct member
+   H5Tpack		- pack struct members
+   H5Tset_cset		- set character set
+   H5Tset_ebias		- set exponent bias
+   H5Tset_fields	- set floating point fields
+   H5Tset_inpad		- set inter-field padding
+   H5Tset_norm		- set floating point normalization
+   H5Tset_offset	- set bit offset within type
+   H5Tset_order		- set byte order
+   H5Tset_pad		- set padding type
+   H5Tset_precision	- set precision in bits
+   H5Tset_sign		- set integer sign type
+   H5Tset_size		- set size in bytes
+   H5Tset_strpad	- set string padding
+ + H5Tget_super         - return the base datatype from which a 
+                          datatype is derived
+ + H5Tvlen_create       - creates a new variable-length dataype
+ + H5Tenum_create       - creates a new enumeration datatype
+ + H5Tenum_insert       - inserts a new enumeration datatype member
+ + H5Tenum_nameof       - returns the symbol name corresponding to a 
+                          specified member of an enumeration datatype
+ + H5Tvalueof           - return the value corresponding to a 
+                          specified member of an enumeration datatype 
+ + H5Tget_member_value  - return the value of an enumeration datatype member
+ + H5Tset_tag           - tags an opaque datatype
+ + H5Tget_tag           - gets the tag associated with an opaque datatype
+
+ - H5Tregister_hard	- register specific type conversion function
+ - H5Tregister_soft	- register general type conversion function
+
+Filters
+   H5Tregister		- register a conversion function 
+
+Compression
+   H5Zregister		- register new compression and uncompression 
+                          functions for a method specified by a method number
+
+Identifiers
+ + H5Iget_type          - retrieve the type of an object
+
+References
+ + H5Rcreate            - creates a reference
+ + H5Rdereference       - open the HDF5 object referenced
+ + H5Rget_region        - retrieve a dataspace with the specified region selected
+ + H5Rget_object_type   - retrieve the type of object that an 
+                          object reference points to
+
+Ragged Arrays (alpha)
+   H5RAcreate		- create a new ragged array
+   H5RAopen		- open an existing array
+   H5RAclose		- close a ragged array
+   H5RAwrite		- write to an array
+   H5RAread		- read from an array
 
-* H5Ocopy() does not copy reg_ref attributes correctly when shared-message
-  is turn on. The value of the reference in the destination attriubte is
-  wrong. This H5Ocopy problem will affect the h5copy tool.
 
diff --git a/html/ADGuide/RELEASE.txt b/html/ADGuide/RELEASE.txt
index 41d7640..6af47e9 100644
--- a/html/ADGuide/RELEASE.txt
+++ b/html/ADGuide/RELEASE.txt
@@ -1,610 +1,785 @@
-HDF5 version 1.8.7 released on Tue May 10 09:24:44 CDT 2011
+HDF5 version 1.9.74 currently under development
 ================================================================================
 
-INTRODUCTION 
-============
-
-This document describes the differences between HDF5-1.8.6 and 
-HDF5 1.8.7, and contains information on the platforms tested and 
-known problems in HDF5-1.8.7. 
-For more details, see the files HISTORY-1_0-1_8_0_rc3.txt 
-and HISTORY-1_8.txt in the release_docs/ directory of the HDF5 source.
-
-Links to the HDF5 1.8.7 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
-
-     http://www.hdfgroup.org/products/hdf5/
-
-The HDF5 1.8.7 release can be obtained from:
 
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
+INTRODUCTION
 
-User documentation for 1.8.7 can be accessed directly at this location: 
+This document describes the differences between HDF5-1.9.0 and
+HDF5 1.9.x snapshot, and contains information on the platforms 
+tested and known problems in HDF5-1.9.x. 
+For more details check the HISTORY*.txt files in the HDF5 source.
 
-     http://www.hdfgroup.org/HDF5/doc/
 
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
+Links to HDF5 1.9.x source code can be found on The HDF Group's 
+development FTP server at the following location:
+     ftp://ftp.hdfgroup.uiuc.edu/pub/outgoing/hdf5/snapshots
+User documentation for the snapshot can be accessed directly at this location: 
+     http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_dev/
 
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
-
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.7 (current 
-release) versus Release 1.8.6":
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
+For more information, see the HDF5 home page:
+   
+    http://www.hdfgroup.org/HDF5/
 
 If you have any questions or comments, please send them to the HDF Help Desk:
 
-     help at hdfgroup.org
+    help at hdfgroup.org
 
 
 CONTENTS
-========
 
 - New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.6
+- Support for new platforms and languages
+- Bug Fixes since HDF5-1.8.0
 - Platforms Tested
-- Supported Configuration Features Summary
 - Known Problems
 
 
 New Features
 ============
 
-    Configuration
+    Configuration:
     -------------
-    - Configure now generates Makefiles that build in "silent make mode"
-      by default in which compile and link lines are significantly
-      simplified for clarity. To override this and view actual compile and
-      link lines during building, the --disable-silent-rules flag can be used
-      at configure time, or the 'make' command can be followed by V=1, to
-      indicate a "verbose" make. (MAM - 2011/4/14).
-    - Added mpicc and mpif90 as the default C and Fortran compilers for Linux
-      systems when --enable-parallel is specified but no $CC or $FC is defined.
-      (AKC - 2011/2/7)
-    - Added a new configure option, "--enable-unsupported", which can
-      be used to stop configure from preventing the use of unsupported
-      configure option combinations, such as c++ in parallel or Fortran
-      with threadsafe. Use at your own risk, as it may result in a 
-      library that won't compile or run as expected!
-      (MAM - 2010/11/17 - Bug 2061)
-
-    Library
-    -------
-    - The library allows the dimension size of a dataspace to be zero.  In 
-      the past, the library would allow this only if the maximal dimension 
-      size was unlimited. Now there is no such restriction, but no data 
-      can be written to this kind of dataset. (SLU - 2011/4/20)
-    - We added two new macros, H5_VERSION_GE and H5_VERSION_LE, to let users
-      compare certain version numbers with the library being used. (SLU -
-      2011/4/20) 
-    - Added ability to cache files opened through external links.  Added new
-      public functions H5Pset_elink_file_cache_size(),
-      H5Pget_elink_file_cache_size(), and H5Fclear_elink_file_cache().
-      (NAF - 2011/02/17)
-    - Finished implementing all options for 'log' VFD.  (QAK - 2011/1/25)
-    - Removed all old code for Metrowerks compilers, bracketed by
-      __MWERKS__). Metrowerks compiler is long gone. (AKC - 2010/11/17) 
-
-    Parallel Library
+    - PHDF5 changed to use "mpiexec", instead of mpirun, as the default MPI
+      applications startup command as defined in the MPI-2 definition, section
+      4.1. (AKC - 2010/6/11 - Bug 1921)
+    - Configure now adds appropriate defines for supporting large (64-bit)
+      files on all systems, where supported, by default, instead of only linux.
+      This largefile support is controllable with the --enable-largefile 
+      configure option. This is replacing the linux-specific --enable-linux-lfs
+      option, which has been removed from configure. 
+      (MAM - 2010/05/05 - 1772/1434)
+    - Upgraded versions of autotools used to generate configuration suite.
+      We now use Automake 1.11.1, Autoconf 2.65, and Libtool 2.2.6b. 
+      MAM 2010/04/15.
+    - Added the xlc-* and mpcc_r-* BASENAME patterns to be recognized as IBM
+      compilers so that the ibm compiler options can be added properly.  This
+      allows non-system-default compiler command names (e.g. xlc-m.n.k.l) be
+      recognized. AKC 2009/11/26.
+    - Configuration suite now uses Automake 1.11 and Autoconf 2.64.
+      MAM 2009/08/11.
+    - Changed default Gnu fortran compiler from g95 to gfortran since
+      gfortran is more likely installed with gcc now. -AKC 2009/07/19- 
+    - Added libtool version numbers to generated c++, fortran, and 
+      hl libraries. MAM 2009/04/19.
+    - Regenerated Makefile.ins using Automake 1.10.2. MAM 2009/04/19.
+    - Added a Make target of check-all-install to test the correctness of
+      installing via the prefix= or $DESTDIR options. AKC - 2009/04/14
+    - Configuration suite now uses Libtool 2.2.6a. MAM 2008/10/24
+
+    - Configuration suite now uses Autoconf 2.61, Automake 1.10.1. 
+      MAM 2008/05/05. 
+
+    - The new configure option "--disable-sharedlib-rpath" disables
+      embedding the '-Wl,-rpath' information into executables when
+      shared libraries are produced, and instead solely relies on the
+      information in LD_LIBRARY_PATH. (MAM - 2008/05/15)
+
+    Library:
+    --------
+    - Improved performance of the chunk cache by avoiding unnecessary b-tree
+      lookups of chunks already in cache. (NAF - 2010/06/15) 
+    - Greatly improved performance of extending a dataset with early
+      allocation. (NAF - 2010/03/24 - 1637)
+    - Added support for filtering densely stored groups.  Many of the API
+      functions related to filters have been extended to support dense groups
+      as well as datasets.  Pipeline messages can now be stored in a group's
+      object header. (NAF/QAK - 2009/10/8)
+    - The embedded library information is displayed by H5check_version() if a
+      version mismatch is detected.  Also changed H5check_version() to
+      suppress the warning message totally if $HDF5_DISABLE_VERSION_CHECK is 2
+      or higher. (Old behavior treated 3 or higher the same as 1, that is
+      print a warning and allows the program to continue. (AKC - 2009/9/28)
+    - If a user does not care for the extra library information insert
+      in the executables, he may turn it off by --disable-embedded-libinfo
+      during configure. (AKC - 2009/9/15)
+    - Corrected problem where library would re-write the superblock in a file
+      opened for R/W access, even when no changes were made to the file.
+      (QAK - 2009/08/20, Bz#1473)
+    - Separated "factory" free list class from block free lists. These free
+      lists are dynamically created and manage blocks of a fixed size.
+      H5set_free_list_limits() will use the same settings specified for block
+      free lists for factory free lists. (NAF - 2009/04/08)
+    - Added support for dense attributes to H5Ocopy. (XCao/NAF - 2009/01/29)
+    - Added H5Pset_elink_cb and H5Pget_elink_cb functions to support a
+      user-defined callback function for external link traversal.
+      (NAF - 2009/01/08)
+    - Added H5Pset_elink_acc_flags and H5Pget_elink_acc_flags functions to
+      allow the user to specify the file access flags used to open the target
+      file of an external link. (NAF - 2009/01/08)
+    - Added H5Pset_chunk_cache() and H5Pget_chunk_cache() functions to allow
+      individual rdcc configuration for each dataset.  Added
+      H5Dget_access_plist() function to retrieve a dataset access property
+      list from a dataset. (NAF - 2008/11/12)
+    - Added H5Iis_valid() function to check if an id is valid without producing
+      an error message. (NAF - 2008/11/5)
+    - Added two new public routines: H5Pget_elink_fapl() and
+      H5Pset_elink_fapl(). (see bug #1247) (VC - 2008/10/13)
+    - Improved free space tracking in file to be faster. (QAK - 2008/10/06)
+    - Added 'mounted' field to H5G_info_t struct. (QAK - 2008/07/15)
+
+    Parallel Library:
+    -----------------
+    - Modified parallel tests to run with arbitrary number of processes. The
+      modified tests are testphdf5 (parallel dataset access), t_chunk_alloc 
+      (chunk allocation), and t_posix_compliant (posix compliance). The rest of
+      the parallel tests already use in the code the number of processes
+      available in the communicator. (CMC - 2009/04/28) 
+
+    Fortran Library:
     ----------------
-    - None
- 
-    Tools
-    -----
-     - h5diff: Added new "verbose with levels" option, '-vN, --verbose=N'.
-       The old '-v, --verbose' option is deprecated but remains available;
-       it is exactly equivalent to '-v0, --verbose=0'.
-       The new levels 1 ('-v1' or '--verbose=1') and 2 ('-v2' or 
-       '--verbose=2') can be specified to view more information regarding 
-       attributes differences.  Bug #2121 (JKM 2011/3/23)
-     - h5dump: Added new option --enable-error-stack. This option will 
-       display error stack information in the output stream. This is 
-       useful when the "h5dump: Unable to print data" message is output.
-       (ADB - 2011/03/03)
-
-    High-Level APIs
-    ---------------
-    - Fortran LT make datasets routines (H5LTmake_dataset_f, 
-      h5ltmake_dataset_int_f, h5ltmake_dataset_float_f, h5ltmake_dataset_double_f) 
-      and LT read datasets routines (h5ltread_dataset_f,h5ltread_dataset_int_f,
-      h5ltread_dataset_float_f, 5ltread_dataset_double_f) can now handle 
-      4-dimensional to 7-dimensional rank datasets. HDFFV-1217 (MSB-2011/4/24/2011)
-
-    F90 API
-    -------
-     - None
-
-    C++ API
-    -------
-    - None
 
+        - Added for the C APIs the Fortran wrappers:
+            h5dget_access_plist_f
+            h5iis_valid_f
+            h5pset_chunk_cache_f
+            h5pget_chunk_cache_f 
+          (MSB - 2009/04/17)
+
+
+    C++ Library:
+    ------------
+	- New member functions
+	  + Overloaded CommonFG::getObjnameByIdx to take char* for name
+	  + Overloaded CommonFG::getObjTypeByIdx to return type name as a char*.
+            (BMR - 2010/05/02)
+	  + DataSet::getInMemDataSize() to simplify getting the dataset's
+            data size in memory.  (BMR - 2009/07/26)
+        - These member functions were added as wrapper for H5Rdereference to
+          replace the incorrect IdComponent::dereference().
+                void H5Object::dereference(H5File& h5file, void* ref)
+                void H5Object::dereference(H5Object& obj, void* ref)
+          In addition, these constructors were added to create the associated
+          objects by way of dereference:
+                Attribute(H5Object& obj, void* ref);
+                Attribute(H5File& file, void* ref);
+                DataSet(H5Object& obj, void* ref);
+                DataSet(H5File& file, void* ref);
+                DataType(H5Object& obj, void* ref);
+                DataType(H5File& file, void* ref);
+                Group(H5Object& obj, void* ref);
+                Group(H5File& obj, void* ref);
+          (BMR - 2008/08/10)
+
+
+
+    Tools:
+    ------
+     - h5ls: Add new flag --no-dangling-links. (refer to --help for details)
+               (JKM - 2010/06/15) 
+     - h5ls: Add new flag --follow-symlinks. (refer to --help for details)
+               (JKM - 2010/05/25)
+     - h5diff: Add new flag --no-dangling-links. (refer to --help for details)
+               (JKM - 2010/02/10) 
+     - h5diff: Add new flag --follow-symlinks. (refer to --help for details)
+               (JKM - 2010/01/25) 
+     - h5diff: fix for displaying garbage value on LE machine for BE data.
+	   (JKM - 2009/11/20)
+     - h5dump subsetting now allows default for count. Also trailing ; in short form
+       can be omitted after last specified value. (ADB - 2009/09/04)
+     - h5dump/h5ls now can display data in region references 
+       using new -R, --region flag.  (ADB - 2009/09/04)
+     - h5diff new flag, -c, --compare, list objects that are not comparable.
+        (PVN - 2009/4/10 - 1368)
+     - h5diff new flag, -N, --nan, avoids NaNs detection. (PVN - 2009/4/10)
+     - h5dump correctly specifies XML dtd / schema urls (ADB - 2009/4/3 - 1519)
+     - h5repack now handles group creation order. (PVN - 2009/4/2 - 1402)
+     - h5dump: added a printing of the compression ratio of uncompressed and compressed 
+         sizes for cases where compression  filters are present. (PVN - 2008/05/01)
+     - h5dump: added an option to allow a user defined formatting string for printf 
+         regarding floating point numbers. (PVN - 2008/05/06)
+     - h5dump: support for external links, display the object that the external link 
+         points to. (PVN - 2008/05/12)
+     - h5repack: add a userblock to an HDF5 file during the repack. (PVN - 2008/08/26)
+     - h5repack: add 2 options that call H5Pset_alignment in the repacked file. (PVN - 2008/08/29)
+     - h5ls: added capability to traverse through external links when the -r
+         (recursive) flag is given. (NAF - 2008/09/16)
+     - h5ls: added -E option to enable traversal of external links.  h5ls will
+         not traverse external links without this flag being set.
+         (NAF - 2008/10/06)
+     - h5diff: added support for long double (PVN - 2008/10/28)
+     - h5dump: binary output defaults to NATIVE with -b optionally accepting
+            the form of binary output (NATIVE, FILE, BE, LE). (PVN - 2008/10/30)
+     - h5diff: return 1 for file differences when both file graphs differ by any object. 
+            Error return code was changed to 2 from -1. (PVN - 2008/10/30)
+     - h5import: TEXTFPE (scientific format) was deprecated. Use TEXTFP 
+            instead (PVN - 2008/10/30)
+     - h5repack: When user doesn't specify a chunk size, h5repack now defines a default 
+            chunk size as the same size of the size of the hyperslab used to read the chunks. 
+            The size of the hyperslabs are defined as the size of each dimension or a 
+            predefined constant, whatever is smaller. This assures that the chunk 
+            read fits in the chunk cache. (PVN - 2008/11/21)
+     - h5diff: h5diff treats two INFINITY values different. Fixed by checking  (value==expect) 
+            before call ABS(...) at h5diff_array.c This will make that (INF==INF) is true 
+            (INF is treated as an number instead of NaN) (PC -- 2009/07/28)
+     - h5diff: add option "--use-system-epsilon" to print difference if (|a-b| > EPSILON)
+            Change default to use strict equality (PC -- 2009/09/12)
 
-Support for New Platforms, Languages, and Compilers
-===================================================
-    - Intel V11.1 uses now -O3 optimization in production mode (EIP - 2010/10/08)
-             
+    
+    High-Level APIs:
+    ------
+     - Table: In version 3.0 of Table, "NROWS" (used to store number of records) was 
+           deprecated (PVN - 2008/11/24)
 
+    
+    Documentation 
+    ------------- 
 
-Bug Fixes since HDF5-1.8.6
-==========================
+Support for new platforms, languages and compilers.
+=======================================
+    - PathScale compilers are recognized and can build the HDF5 library
+      properly. AKC - 2009/7/28 -
 
-    Configuration
-    -------------
-    - Shared C++ and HL libraries on AIX should now be working correctly.
-      Note that Fortran shared libraries are still not working on AIX. 
-      (See the Known Problems section, below). (MAM - 2011/4/20)
-    - Removed config/ibm-aix6.x. All IBM-AIX settings are in one file,
-      ibm-aix. (AKC - 2011/4/14)
-    - Shared C libraries are no longer disabled on Mac when Fortran
-      is enabled. Shared Fortran libraries are still not supported on Mac,
-      so configure will disable them by default, but this is overrideable
-      with the new --enable-unsupported configure option. The configure
-      summary has been updated to reflect the fact that the shared-ness of 
-      the C++/Fortran wrapper libraries may not align with the C library.
-      (MAM - 2011/04/11 - HDFFV-4353).
+Bug Fixes since HDF5-1.8.0 release
+==================================
 
     Library
     -------
-    - Changed assertion failure when decoding a compound datatype with no
-      fields into a normal error failure.  Also prohibit using this sort
-      of datatype for creating an attribute (as is already the case for
-      datasets and committed (named) datatypes).  (QAK - 2011/04/15, Jira 
-      issue #HDFFV-2766)
-    - Tell the VFL flush call that the file will be closing, allowing
-      the VFDs to avoid sync'ing the file (particularly valuable in parallel).
-      (QAK - 2011/03/09)
-    - The datatype handler created with H5Tencode/decode used to have the 
-      reference count 0 (zero); it now has the reference count 1 (one).
-      (SLU - 2011/2/18)
-    - Fixed the definition of H5_HAVE_GETTIMEOFDAY on Windows so that
-      HDgettimeofday() is defined and works properly.  Bug HDFFV-5931
-      (DER - 2011/04/14)
-    - Added basic VFD tests for the Windows, STDIO and log VFD tests.
-      (DER - 2011/04/11)
-
-    Parallel Library
-    ----------------
-    - None
+      - Fixed a file corruption bug that could happen when shrinking a
+            compressed dataset. (NAF - 2010/05/20)
+      - Fixed some memory leaks in VL datatype conversion when strings are
+            used as fill values. (MAM - 2010/05/12 - BZ# 1826)
+      - Fixed a bug when copying objects with NULL references with the
+            H5O_COPY_EXPAND_REFERENCE_FLAG flag set. (NAF - 2010/04/08 - 1815)
+      - Files can now be concurrently opened more than once using the core file
+            driver, as long as the backing store is used. (NAF - 2010/03/09)
+      - Added support for H5O_COPY_EXPAND_EXT_LINK_FLAG to H5Ocopy.  External
+            links will now be expanded if this flag is set.
+            (NAF - 2010/03/05 - 1733)
+      - Fixed a bug where the library, when traversing an external link, would
+            reopen the source file if nothing else worked. (NAF - 2010/03/05)
+      - Fixed an intermittent bug in the b-tree code which could be triggered
+            by expanding and shrinking chunked datasets in certain ways.
+            (NAF - 2010/02/16)
+      - H5Tdetect_class said a VL string is a string type.  But when it's
+            in a compound type, it said it's a VL type (Bug #1584).  I fixed it 
+            to be consistent.  It always return string type. (SLU - 2009/12/10)
+      - Fixed a bug where writing and deleting many global heap objects (i.e.
+            variable length data) would render the file unreadable.  Previously
+            created files exhibiting this problem should now be readable.
+            (NAF - 2009/10/27 - 1483)
+      - Fixed incorrect return value for H5Pget_preserve. (AKC - 2009/10/08 - 1628)
+      - Fixed an assertion failure that occurred when H5Ocopy was called on a
+            dataset using a vlen inside a compound. (NAF - 2009/10/02 - 1597)
+      - Fixed incorrect return value for H5Pget_filter_by_id1/2 in H5Ppublic.h.
+            (NAF - 2009/09/25 - 1620)
+      - Fixed a bug where properties weren't being compared with the registered
+            compare callback. (NAF - 2009/09/25 - 1555)
+      - Fixed a bug where H5Pget_fitler_by_id would succeed when called for a
+            filter that wasn't present. (NAF - 2009/06/25 - 1250)
+      - Fixed an issue with committed compound datatypes containing a vlen.
+            Also fixed memory leaks involving committed datatypes.
+            (NAF - 2009/06/10 - 1593)
+      - Added versioning to H5Z_class_t struct to allow compatibility with 1.6
+            API. (NAF - 2009/04/20 - 1533)
+      - Fixed a problem with using data transforms with non-native types in the
+            file. (NAF - 2009/04/20 - 1548)
+      - Added direct.h include file to windows section of H5private.h 
+            to fix _getcwd() warning. (ADB - 2009/04/14 - 1536)
+      - Fixed a bug that prevented external links from working after calling
+            H5close(). (NAF - 2009/04/10 - 1539)
+      - Modified library to write cached symbol table information to the
+            superblock, to allow library versions 1.3.0 to 1.6.3 to read files
+            created by this version. (NAF - 2009/04/08 - 1423)
+      - Changed skip lists to use a deterministic algorithm.  The library should
+            now never call rand() or srand(). (NAF - 2009/04/08 - 503)
+      - Fixed a bug where H5Lcopy and H5Lmove wouldn't create intermediate
+            groups when that property was set. (NAF - 2009/04/07 - 1526)
+      - Fixed a bug that caused files with a user block to grow by the size of
+            the user block every time they were opened.
+            (NAF - 2009/03/26 - 1499)
+      - Fixed a rare problem that could occur with files using the old (pre 1.4)
+            array datatype. (NAF - 2009/03/23)
+      - Modified library to be able to open files with corrupt root group symbol
+            table messages, and correct these errors if they are found.  Such
+            files can only be successfully opened with write access.
+            (NAF - 2009/03/23 - 1189)
+      - Removed the long_long #define and replaced all instances with 
+            "long long". This caused problems with third party products. All 
+            currently supported compliers support the type. (ADB - 2009/03/05)
+      - Fixed various bugs that could prevent the fill value from being written
+            in certain rare cases. (NAF - 2009/02/26 - 1469)
+      - Fixed a bug that prevented more than one dataset chunk from being cached
+            at a time. (NAF - 2009/02/12 - 1015)
+      - Fixed an assertion failure caused by opening an attribute multiple times
+            through multiple file handles. (NAF - 2009/02/12 - 1420)
+      - Fixed a problem that could prevent the user from adding attributes (or
+            any object header message) in some circumstances.
+            (NAF - 2009/02/12 - 1427)
+      - Fixed a bug that could cause problems when an attribute was added to a
+            committed datatype using the committed datatype's datatype.
+            (NAF - 2009/02/12)
+      - Fixed a bug that could cause problems when copying an object with a
+            shared message in its own object header. (NAF - 2009/01/29)
+      - Changed H5Tset_order to properly reject H5T_ORDER_NONE for most
+            datatypes. (NAF - 2009/01/27 - 1443)
+      - Fixed a bug where H5Tpack wouldn't remove trailing space from an
+            otherwise packed compound type. (NAF - 2009/01/14)
+      - Fixed up some old v2 btree assertions that get run in debug mode that
+            were previously failing on compilation, and removed some of the 
+            more heavily outdated and non-rewritable ones. (MAM - 2008/12/15)
+      - Fixed a bug that could cause problems when "automatically" unmounting
+            multiple files. (NAF - 2008/11/17)
+      - H5Ovisit and H5Ovisit_by_name will now properly terminate when the
+            callback function returns a positive value on the starting object.
+            (NAF - 2008/11/03)
+      - Fixed an error where a null message could be created that was larger
+            than could be written to the file. (NAF - 2008/10/23)
+      - Corrected error with family/split/multi VFD not updating driver info
+            when "latest" version of the file format used. (QAK - 2008/10/14)
+      - Corrected alignment+threshold errors to work correctly when metadata
+            aggregation is enabled. (QAK - 2008/10/06)
+      - Changed H5Fget_obj_count and H5Fget_obj_ids to ignore objects registered
+            by the library for internal library use. (NAF - 2008/10/06)
+      - Fixed potential memory leak during compound conversion.
+            (NAF - 2008/10/06)
+      - Changed the return value of H5Fget_obj_count from INT to SSIZE_T. Also
+            changed the return value of H5Fget_obj_ids from HERR_T to SSIZE_T and
+            the type of the parameter MAX_OBJS from INT to SIZE_T. (SLU - 2008/09/26) 
+      - Fixed an issue that could cause data to be improperly overwritten
+            during compound type conversion. (NAF - 2008/09/19)
+      - Fixed pointer alignment violations that could occur during vlen
+            conversion. (NAF - 2008/09/16)
+      - Fixed problem where library could cause a segmentation fault when
+            an invalid location ID was given to H5Giterate(). (QAK - 2008/08/19)
+      - Fixed improper shutdown when objects have reference count > 1.  The
+            library now tracks reference count due to the application separately
+            from that due to internal library routines. (NAF - 2008/08/19)
+      - Fixed assertion failure caused by incorrect array datatype version.
+            (NAF - 2008/08/08)
+      - Fixed an issue where mount point traversal would fail when using
+            multiple handles for the child. (NAF - 2008/08/07)
+      - Fixed an issue where mount points were inaccessible when using multiple
+            file handles for the parent.  The mount table is now in the shared
+            file structure (the parent pointer is still in the top structure).
+            (NAF - 2008/08/07)
+      - when an attribute was opened twice and data was written with one of the handles,
+            the file didn't have the data.  It happened because each handle had its own
+            object structure, and the empty one overwrote the data with fill value.  This is
+            fixed by making some attribute information like the data be shared in the
+            attribute structure.  SLU - 2008/07/22
+      - Fixed issue where a group could have a file mounted on it twice.
+            (QAK - 2008/07/15)
+      - Fixed a Windows-specific issue in the ohdr test which was causing users
+        in some timezones to get false errors.  This a deficiency in the Windows
+        mktime() function, and has been handled properly.  SJW  - 2008/06/19
+      - Fixed the problem with the searching of target file for H5Lcreate_external().
+	    The searching pattern will depend on whether the target file's
+	    pathname is an absolute or a relative path. Please see the description
+	    in the RM for H5Lcreate_external().  (VC - 2008/04/08)
+      - Fixed possible file corruption bug when encoding datatype
+            descriptions for compound datatypes whose size was between
+            256 & 511 bytes and the file was opened with the "use the
+            latest format" property enabled (with H5Pset_libver_bounds).
+            (QAK - 2008/03/13)
+      - Fixed bug in H5Aget_num_attrs() routine to handle invalid location
+            ID correctly.  (QAK - 2008/03/11)
+      - H5Dset_extent: when shrinking dimensions, some chunks were not deleted.  
+            (PVN - 2009/01/8)
+      - Added code to maintain a min_clean_fraction in the metadata cache when
+            in serial mode. (MAM - 2009/01/9)
+
+
+
+    Configuration
+    -------------
+    - Removed recognition of the parallel compilers of LAM(hcc) and
+      ChMPIon(cmpicc) since we have no access to these two MPI implementations
+      and cannot verify their correctness. (AKC - 2010/7/14 - Bug 1921)
+    - Removed the following config files, as we no longer support them:
+        config/dec-osf*, config/hpux11.00, config/irix5.x, 
+        config/powerpc-ibm-aix4.x config/rs6000-ibm-aix5.x config/unicos*
+      MAM - 2009/10/08
+    - Modified configure and make process to properly preserve user's CFLAGS
+      (and company) environment variables. Build will now properly use
+      automake's AM_CFLAGS for any compiler flags set by the configure
+      process. Configure will no longer modify CFLAGS directly, nor will 
+      setting CFLAGS during make completely replace what configure has set up.
+      MAM - 2009/10/08
+    - Support for TFLOPS, config/intel-osf1, is removed since the TFLOPS
+      machine has long retired. AKC - 2009/10/06.
+    - Added $(EXEEXT) extension to H5detect when it's executed in the 
+      src/Makfile to generate H5Tinit.c so it works correctly on platforms 
+      that require the full extension when running executables.
+      MAM - 2009/10/01 - BZ #1613
+    - Configure will now set FC and CXX to "no" when fortran and c++
+      are not being compiled, respectively, so configure will not run
+      some of the compiler tests for these languages when they are not
+      being used. MAM - 2009/10/01
+    - The PathScale compiler (v3.2) was mistaken as gcc v4.2.0 but it fails to
+      recognize some gcc options. Fixed. (see bug 1301). AKC - 2009/7/28 -
+    - The --enable-static-exec flag will now properly place the -static flag
+      on the link line of all installed executables. This will force the
+      executable to link with static libraries over shared libraries, provided
+      the static libraries are available. MAM - 2009/08/31 - BZ #1583
+    - The --includedir=DIR configuration option now works as intended, and can
+      be used to specify the location to install C header files. The default
+      location remains unchanged, residing at ${prefix}/include. 
+      MAM - 2009/03/10 - BZ #1381
+    - Configure no longer removes the '-g' flag from CFLAGS when in production
+      mode if it has been explicitly set in the CFLAGS environment variable 
+      prior to configuration. MAM - 2009/03/09 - BZ #1401.
+    - Fixed error with 'make check install' failing due to h5dump
+      needing other tools built first. MAM - 2008/10/24.
+    - When using shared szip, it is no longer necessary to specify
+      the path to the shared szip libraries in LD_LIBRARY_PATH. MAM - 
+      2008/10/24.
+    - The file libhdf5_fortran.settings is not installed since its content
+      is included in libhdf5.settings now. AKC - 2008/10/21
+    - "make DESTDIR=xxx install" failed to install some tools and files
+      (e.g., h5cc and fortran modules). Fixed. AKC - 2008/10/8.
+
+    Performance
+    -------------
+      - perf_serial test added to Windows projects and check batch file. 
+        (ADB - 2009/06/11)
 
     Tools
     -----
-    - Updated h5dump test case script to prevent entire test failure when 
-      source directory is read-only. Bug #HDFFV-4342 (JKM 2011/4/12)
-    - Fixed h5dump displaying incorrect values for H5T_STD_I8BE type data in
-      attribute on Big-Endian machine. H5T_STD_I8BE is unsigned 8bit type,
-      so h5dump is supposed to display -2 instead of 254. It worked correctly
-      on Little-Endian system , but not on Big-Endian system.  Bug #HDFFV-4358
-      (JKM 04/08/2011)
-    - Updated some HDF5 tools to standardize the option name as 
-      '--enable-error-stack' for printing HDF5 error stack messages. h5ls and 
-      h5dump have been updated. For h5ls, this replaces "-e/--errors" option, 
-      which is deprecated. For h5dump, this is a new option. Bug #2182 
-      (JKM 2011/3/30)
-    - Fixed the h5diff --use-system-epsilon option. The formula used in the 
-      calculation was changed from ( |a - b| / b ) to ( |a - b| ). 
-      This was done to improve performance. Bug #2184 (JKM 2011/3/24)
-    - Fixed output for H5T_REFERENCE in h5dump. According to the BNF document
-      the output of a H5T_REFERENCE should be followed by the type;
-      <reference> ::= H5T_REFERENCE { <ref_type> }
-      <ref_type> ::= H5T_STD_REF_OBJECT | H5T_STD_REF_DSETREG
-      Previously this was only displayed if the -R option was used.
-      Bug #1725 (ADB 2011/3/28)
-    - Fixed two h5diff issues. 1) h5diff compared attributes correctly only 
-      when two objects had the same number of attributes and the attribute 
-      names were identical. 2) h5diff did not display useful information about 
-      attribute differences. Bug #2121 (JKM 2011/3/17)
-    - Fixed a memory leak in h5diff that occurred when accessing symbolic links 
-      with the --follow-symlink option. Bug #2214  (JKM 2011/3/18)
-    - Fixed a memory leak in h5diff that occurred when accessing variable length 
-      string data. Bug #2216 (JKM 2011/3/18)
-    - Fixed and improved the help page for h5ls -a, --address option. 
-      Bug #1904 (JKM 2011/3/11)
-    - Fixed h5copy to enable copying an object into the same HDF5 file.
-      Previously h5copy displayed an error message when the target file 
-      was the same as the source file. (XCAO 2011/3/8)
-    - Fixed an h5dump problem that caused the tool to skip some data elements 
-      in large datasets with a large array datatype on Windows. This issue 
-      arose only on Windows due to the different return behavior of the 
-      _vsnprintf() function.  Bug #2161 (JKM 2011/3/3)
-    - Fixed h5dump which was skipping some array indices in large datasets 
-      with a relatively large array datatype. The interval of skipped indices
-      varied according to the size of the array. Bug #2092 (JKM 2011/2/15)
-    - Fixed h5diff which was segfaulting when comparing compound datasets
-      with a combination of fixed-length string datatypes and variable-length
-      string datatypes in certain orders. Bug #2089 (JKM 2010/12/28)
-    - Improved h5diff performance. 1) Now use HDmemcmp() before comparing two 
-      elements. 2) Replace expensive H5Tequals() calls. 3) Retrieve datatype
-      information at dataset level, not at each element level for compound 
-      datasets. HDFFV-7516 (JKM 2011/4/18) 
-    - Fixed h5ls to display nested compound types with curly brackets 
-      when -S (--simple) option is used with -l (--label), so it shows  
-      which members (in curly brackets) belong to which nested compound type, 
-      making the output clearer.  Bug #1979 (JKM 2010/11/09)
-    - Fixed h5diff to handle variable-length strings in a compound dataset 
-      and variable-length string arrays in a compound dataset correctly.
-      Garbage values were previously displayed when h5diff compared multiple 
-      variable-length strings in a compound type dataset. 
-      Bug #1989 (JKM 2010/10/28)
-    - Fixed h5copy to fail gracefully when copying an object to a non-
-      existing group without the -p option. Bug #2040 (JKM 2010/10/18)
-
-    F90 API
-    ------
-    - None
-
-    C++ API
-    ------
-    - None
+        - Change h5ls not to manipulate special characters in object name or 
+          attribute name for smart display.  bug#1784 (JKM 2010/06/28)
+        - Fixed h5ls to return exit code 1 (error) when non-existent file is
+          specified. bug#1793. (JKM 2010/04/27)
+        - h5copy failed to copy dangling link when the link is specified 
+          directly. bug#1817. (JKM 2010/04/22)
+        - h5repack lost attributes from a dataset of reference type. bug#1726.
+          (JKM 2010/3/25)
+        - h5repack sets NULL for object reference value for group or 
+          named datatype. bug#1814. (JKM 2010/03/19)
+        - h5diff: fixed incorrect behavior (hang) in parallel mode when
+                  specify invalid options (ex: -v and -q) (JKM 2010/02/17)
+        - h5dump/h5ls display buffer resize fixed in tools library.  
+            (ADB - 2009/07/21 - 1520)
+        - Fixed many problems that could occur when using h5repack with named
+            datatypes. (NAF - 2009/4/20 - 1516/1466)
+        - h5dump, h5diff, h5repack were not reading (by hyperslabs) datasets 
+            that have a datatype datum size greater than H5TOOLS_BUFSIZE, a 
+            constant defined as 1024Kb, such as array types with large 
+            dimensions (PVN - 2009/4/1 - 1501)
+        - h5import: By selecting a compression type, a big endian byte order was being 
+            selected (PVN - 2009/3/11 - 1462)
+        - zip_perf.c had missing argument on one of the open() calls. Fixed.
+            (AKC - 2008/12/9)
+        - h5dump now checks for uniqueness of committed datatypes.
+            (NAF - 2008/10/15)
+        - Fixed unnecessary indentation of committed datatypes in h5dump.
+            (NAF - 2008/10/15)
+	- Fixed bugs in h5stat:segmemtation fault when printing groups and
+          print warning message when traversal of objects is unsuccessful.
+          (see bug #1253) (VC- 2008/10/13)
+        - Fixed bug in h5ls that prevented relative group listings (like
+            "h5ls foo.h5/bar") from working correctly (QAK - 2008/06/03)
+        - Fixed bug in h5diff that prevented datasets & attributes with
+            variable-length string elements from comparing correctly.
+            (QAK - 2008/02/28)
+        - h5import bug on Windows w/binary datasets. fread in windows needs a
+            binary file to be open with 'rb' instead of 'r' otherwise it
+            terminates execution if an end of file character is found on the
+            input file. Besides that the binary file generated needs to be open
+            with 'wb' , otherwise an end of line character is read twice.
+            (PVN - 2008/02/19)
+        - Fixed bug in h5dump that caused binary output to be made only for the first 
+           dataset, when several datasets were requested. (PVN - 2008/04/07)
+        - h5dump: when doing binary output (-b), the stdout printing of attributes 
+           was done incorrectly. Removed printing of attributes when doing binary 
+           output. PVN - 2008/06/05
 
     High-Level APIs:
-    ------
-    - None
+     ------
+      - Fixed a bug in H5DSattach_scale, H5DSis_attached and H5DSdetach_scale
+        caused by using H5Tget_native_type function to determine the native
+        type for reading REFERENCE_LIST attribute. The bug was exposed
+        on Mac PPC.
+                                     (EIP - 2010/05/22 -1851) 
+      - Fixed a bug in the H5DSdetach_scale function when 0 bytes  
+        were allocated after the last reference to a dim. scale  
+        was removed from the list of references in a VL element of the 
+        DIMENSION_LIST attribute; modified the function to comply
+        with the Spec: DIMENSION_LIST attribute is deleted now when no 
+        dimension scales left attached.
+                                     (EIP - 2010/05/14 -1822) 
+      - Fixed a bug where the H5TB API would forget the order of fields when
+          added out of offset order. (NAF - 2009/10/27 - 1582)
+      - H5DSis_attached failed to account for different platform types. Added a
+          get native type call. (ADB - 2009/9/29 - 1562)
+      - Dimension scales: The scale index return value in H5DSiterate_scales was not always 
+          incremented. (PVN - 2009/4/8 - 1538)
 
     Fortran High-Level APIs:
-    ------
-    -  h5tbmake_table_f: Fixed error in passing an array of characters with different 
-       length field names.
-    -  h5tget_field_info_f: Fixed error with packing the C strings into a Fortran 
-       array of strings. Added optional argument called 'maxlen_out' which returns 
-       the maximum string character length in a field name element.
-       Bug HDFFV-1255 (MSB- 4/17/2011)
+     ------
+      - Lite: The h5ltget_dataset_info_f function (gets information about a dataset) 
+           was not correctly returning the dimension array. (PVN - 2009/3/23)
+      - Lite: the h5ltread_dataset_string_f and h5ltget_attribute_string_f functions 
+           had memory problems with the g95 fortran compiler. (PVN � 5/13/2009) 1522
+
+
 
 
 
 
+    Documentation 
+    ------------- 
+
+
+    F90 APIs
+    --------
+
+
+    C++ APIs
+    --------
+	- The constructor PropList::PropList(id) was fixed to act properly
+	  according to the nature of 'id'.  When 'id' is a property class id,
+	  a new property list will be created.  When 'id' id a property list id,
+	  a copy of the property list will be made. (BMR - 2010/5/9)
+	- The parameters 'size' and 'bufsize' in CommonFG::getLinkval and
+	  CommonFG::getComment, respectively, now have default values for
+	  user's convenience.  (BMR - 2009/10/23)
+	- NULL pointer accessing was fixed, bugzilla 1061.  (BMR - 2009/10/05)
+	- read/write methods of DataSet and Attribute classes were fixed
+	  to handle string correctly.  (BMR - 2009/07/26)
+        - Fixed bug that caused segfaults in Attribute::read. (BMR - 2008/04/20)
+        - Fixed bug in PropList::getClassName to use portable HDfree instead
+            of free. (BMR - 2008/04/20)
+        - Fixed a design bug which allowed an Attribute object to create/modify
+          attributes (bugzilla #1068).  The API class hierarchy was revised
+          to address the problem.  Classes AbstractDS and Attribute are moved
+          out of H5Object.  Class Attribute now multiply inherits from
+          IdComponent and AbstractDs and class DataSet from H5Object and
+          AbstractDs.  In addition, the data member IdComponent::id was
+          moved into subclasses: Attribute, DataSet, DataSpace, DataType,
+          H5File, Group, and PropList. (BMR - 2008/08/10)
+        - IdComponent::dereference was incorrect and replaced as described
+          in "New Features" section.
+          (BMR - 2008/08/10)
+
+
+
 Platforms Tested
 ================
-The following platforms and compilers have been tested for this release.
-
-    AIX 6.1                       xlc 11.1.0.3
-    (NCSA BP)                     xlC 11.1.0.3
-                                  xlf90 13.1.0.3
-                                  mpcc_r 11.1.0.3
-                                  mpxlf90_r 13.1.0.3
-
-    FreeBSD 8.2-STABLE i386       gcc 4.2.1 [FreeBSD] 20070719
-    (loyalty)                     g++ 4.2.1 [FreeBSD] 20070719
-                                  gcc 4.6.1 20110422
-                                  g++ 4.6.1 20110422
-                                  gfortran 4.6.1 20110422
-
-    FreeBSD 8.2-STABLE amd64      gcc 4.2.1 [FreeBSD] 20070719
-    (freedom)                     g++ 4.2.1 [FreeBSD] 20070719
-                                  gcc 4.6.1 20110422
-                                  g++ 4.6.1 20110422
-                                  gfortran 4.6.1 20110422
-
-    Linux 2.6.18-194.3.1.el5PAE   gcc (GCC) 4.1.2 and 4.4.2
-    #1 SMP i686 i686 i386         G95 (GCC 4.0.3 (g95 0.93!) Apr 21 2010)
-    (jam)                         GNU Fortran (GCC) 4.1.2 20080704 
-                                      (Red Hat 4.1.2-48) and 4.4.2
-                                  PGI C, Fortran, C++ 10.4-0 32-bit
-                                  PGI C, Fortran, C++ 10.6-0 32-bit
-                                  Intel(R) C Compiler for 32-bit
-                                      applications, Version 11.1 
-                                  Intel(R) C++ Compiler for 32-bit
-                                      applications, Version 11.1
-                                  Intel(R) Fortran Compiler for 32-bit
-                                      applications, Version 11.1
-                                  Absoft 32-bit Fortran 95 10.0.7
-                                  MPICH mpich2-1.3.1 compiled with
-                                      gcc 4.1.2 and gfortran 4.1.2
-
-    Linux 2.6.18-194.17.1.el5     gcc 4.1.2 and 4.4.2
-    #1 SMP x86_64 GNU/Linux       G95 (GCC 4.0.3 (g95 0.93!) Apr 21 2010)
-    (amani)                           tested for both 32- and 64-bit binaries
-                                  GNU Fortran (GCC) 4.1.2 20080704
-                                      (Red Hat 4.1.2-46) and 4.4.2
-                                  Intel(R) C, C++, Fortran Compilers for 
-                                      applications running on Intel(R) 64, 
-                                      Version 11.1.
-                                  PGI C, Fortran, C++ Version 9.0-4
-                                      for 64-bit target on x86-64
-                                  MPICH mpich2-1.3.1 compiled with
-                                      gcc 4.1.2 and gfortran 4.1.2
-
-    SGI ProPack 7 Linux           Intel(R) C++ Version 11.1 20100806
-    2.6.32.24-0.2.1.2230.2.PTF-   Intel(R) Fortran Version 11.1 20100806
-    default #1 SMP                SGI MPT 2.01
-    SGI Altix UV
-    (NCSA ember)
-
-    SunOS 5.10 32- and 64-bit     Sun C 5.9 Sun OS_sparc Patch 124867-16
-    (linew)                       Sun Fortran 95 8.3 Sun OS_sparc Patch 127000-13
-                                  Sun C++ 5.9 Sun OS_sparc Patch 124863-26
-                                  Sun C 5.10 SunOS_sparc Patch 141861-07
-                                  Sun Fortran 95 8.4 SunOS_sparc Patch 128231-06
-                                  Sun C++ 5.10 SunOS_sparc 128228-11
-
-    Intel Xeon Linux 2.6.18-      gcc 4.2.4
-    92.1.10.el5_lustre.1.6.6smp-  Intel(R) C++ Version 10.1.017
-    perfctr #8 SMP                Intel(R) Fortran Compiler Version 10.1.017
-    (NCSA abe)                    Open MPI 1.3.2
-                                  MVAPICH2-1.5.1_pgi-10.8
-
-    Windows XP                    Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-                                  Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-                                  Visual Studio 2010 (cmake)
-                                  Cygwin(1.7.7 native gcc(4.3.4) compiler and gfortran)
-
-    Windows XP x64                Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-                                  Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-                                  Visual Studio 2010 (cmake)
-                                  Cygwin(1.7.7 native gcc(4.3.4) compiler and gfortran)
-
-    Windows Vista                 Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Windows Vista x64             Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Windows 7                     Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Windows 7 x64                 Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Mac OS X 10.7.0 (Intel 64-bit) i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1
-    Darwin Kernel Version 10.7.0  GNU Fortran (GCC) 4.6.0 20101106 (experimental)
-                                  Intel C, C++ and Fortran compilers 12.0.1.122 20101110
-
-    Mac OS X 10.7.0 (Intel 32-bit) i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
-    Darwin Kernel Version 10.7.0  GNU Fortran (GCC) version 4.4.0 20090123 (experimental) 
-							[trunk revision 143587]
-
-    Fedora 12 2.6.32.16-150.fc12.ppc64 #1 SMP ppc64 GNU/Linux
-                                  gcc (GCC) 4.4.4 20100630 (Red Hat 4.4.4-10)
-                                  GNU Fortran (GCC) 4.4.4 20100630 (Red Hat 4.4.4-10)
-
-    Debian6.01 2.6.32-5-686 #1 SMP i686 GNU/Linux
-                                  gcc (Debian 4.4.5-8) 4.4.5
-                                  GNU Fortran (Debian 4.4.5-8) 4.4.5
-
-    Debian6.01 2.6.32-5-amd64 #1 SMP x86_64 GNU/Linux
-                                  gcc (Debian 4.4.5-8) 4.4.5
-                                  GNU Fortran (Debian 4.4.5-8) 4.4.5
-
-    Fedora14 2.6.35.12-88.fc14.i686.PAE #1 SMP i686 i686 i386 GNU/Linux
-                                  gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
-                                  GNU Fortran (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
-
-    Fedora14 2.6.35.12-88.fc14.x86_64 #1 SMP x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
-                                  GNU Fortran (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
-
-    SUSE 11.4 2.6.37.1-1.2-desktop #1 SMP PREEMPT i686 i686 i386 GNU/Linux
-                                  gcc (SUSE Linux) 4.5.1 20101208
-                                  GNU Fortran (SUSE Linux) 4.5.1 20101208
-
-    SUSE 11.4 2.6.37.1-1.2-desktop #1 SMP PREEMPT x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (SUSE Linux) 4.5.1 20101208
-                                  GNU Fortran (SUSE Linux) 4.5.1 20101208
-
-    Ubuntu 10.10 2.6.35-28-generic #50-Ubuntu SMP i686 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
-                                  GNU Fortran (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
-
-    Ubuntu 10.10 2.6.35-28-generic #50-Ubuntu SMP x86_64 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
-                                  GNU Fortran (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
-    
-    OpenVMS Alpha 8.3             HP C V7.3-009
-                                  HP Fortran V8.2-104679-48H9K
-                                  HP C++ V7.3-009
 
-Tested Configuration Features Summary
+    AIX 5.3                       xlc 7.0.0.8, 8.0.0.20, 9.0.0.4
+    (LLNL Up)                     xlC 7.0.0.8, 8.0.0.20, 9.0.0.4
+                                  xlf 9.1.0.8, 10.1.0.9, 11.1.0.7
+                                  mpcc_r 7.0.0.8
+                                  mpxlf_r 09.01.0000.0008
+    FreeBSD 6.2-STABLE i386       gcc 3.4.6 [FreeBSD] 20060305
+    (duty)                        g++ 3.4.6 [FreeBSD] 20060305
+                                  gcc 4.2.1 20080123
+                                  g++ 4.2.1 20080123
+                                  gfortran 4.2.1 20070620
+    FreeBSD 6.2-STABLE amd64      gcc 3.4.6 [FreeBSD] 20060305
+    (liberty)                     g++ 3.4.6 [FreeBSD] 20060305
+                                  gcc 4.2.1 20080123
+                                  g++ 4.2.1 20080123
+                                  gfortran 4.2.1 20080123
+
+    Linux 2.6.9 (RHEL4)           Intel 10.0 compilers
+    (abe.ncsa.uiuc.edu)
+    Linux 2.4.21-47               gcc 3.2.3 20030502
+    (osage)
+    Linux 2.6.9-42.0.10           gcc 3.4.6 20060404
+    (kagiso)                      PGI 7.0-7 (pgcc, pgf90, pgCC)
+                                  Intel 9.1 (icc, ifort, icpc)
+    Linux 2.6.16.27 x86_64 AMD    gcc 4.1.0 (SuSE Linux), g++ 4.1.0, g95 (GCC 4.0.3)
+    (smirom)                      PGI 6.2-5 (pgcc, pgf90, pgCC)
+                         	  Intel 9.1 (icc, iort, icpc)
+    Linux 2.6.5-7.252.1-rtgfx #1 
+          SMP ia64                Intel(R) C++ Version 9.0
+    (cobalt)                      Intel(R) Fortran Itanium(R) Version 9.0 
+                                  SGI MPI
+    SunOS 5.10                    Sun C 5.9 SunOS_sparc 
+                                  Patch 124867-11 2009/04/30
+    (linew)                       Sun Fortran 95 8.3 SunOS_sparc 
+                                  Patch 127000-11 2009/10/06
+                                  Sun C++ 5.9 SunOS_sparc 
+                                  Patch 124863-16 2009/09/15
+    IA-64 Linux 2.4.21.SuSE_292.til1 ia64
+    (NCSA tg-login)               gcc 3.2.2
+                                  Intel(R) C++ Version 8.1
+                                  Intel(R) Fortran Compiler Version 8.1
+				  mpich-gm-1.2.5..10-intel-r2
+				  
+    Windows XP                    Visual Studio 2008 w/ Intel Fortran 10.1
+                                  Cygwin(1.7.5 native gcc compiler and gfortran)
+
+    Windows XP x64                Visual Studio 2008 w/ Intel Fortran 10.1
+
+    Windows Vista                 Visual Studio 2008 w/ Intel Fortran 10.1
+
+    Windows Vista x64             Visual Studio 2008 w/ Intel Fortran 10.1
+
+    MAC OS  10.5 (Intel)          gcc i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 
+                                  G95 (GCC 4.0.3 (g95 0.91!) Nov 21 2006)
+                                  GNU Fortran (GCC) 4.3.0 20070810
+    Alpha Open VMS 7.3
+
+
+Supported Configuration Features Summary
 ========================================
 
     In the tables below
-          y   = tested 
-          n   = not tested in this release
-          C   = Cluster
-          W   = Workstation
+          y   = tested and supported
+          n   = not supported or not tested in this release
           x   = not working in this release
-          dna = does not apply
           ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                                 C        F90    F90      C++   zlib  SZIP
-                                         parallel        parallel
-Solaris2.10 32-bit                         n        y      n        y     y     y
-Solaris2.10 64-bit                         n        y      n        y     y     y
-Windows XP                                 n        y(4)   n        y     y     y
-Windows XP x64                             n        y(4)   n        y     y     y
-Windows Vista                              n        y(4)   n        y     y     y
-Windows Vista x64                          n        y(4)   n        y     y     y
-OpenVMS Alpha                              n        y      n        y     y     n
-Mac OS X 10.7 Intel 32-bit                 n        y      n        y     y     y
-Mac OS X 10.7 Intel 64-bit                 n        y      n        y     y     y
-AIX 6.1 32- and 64-bit                     y        y      y        y     y     y
-FreeBSD 8.2-STABLE 32&64 bit               n        x      n        x     y     y
-CentOS 5.5 Linux 2.6.18-194 i686 GNU (1)W  y        y(2)   y        y     y     y
-CentOS 5.5 Linux 2.6.18-194 i686 Intel  W  n        y      n        y     y     n
-CentOS 5.5 Linux 2.6.18-194 i686 PGI    W  n        y      n        y     y     n
-CentOS 5.5 Linux 2.6.16 x86_64 GNU (1)  W  y        y(3)   y        y     y     y
-CentOS 5.5 Linux 2.6.16 x86_64 Intel    W  n        y      n        y     y     n
-CentOS 5.5 Linux 2.6.16 x86_64 PGI      W  n        y      n        y     y     y
-RedHat EL4 2.6.18 Xeon Lustre           C  y        y      y        y     y     n
-Fedora 12 Linux 2.6.32.16-150.fc12.ppc64   n        y      n        y     y     y
-SGI Linux 2.6.32.19                        y        y      y        y     y     y
-
-
-Platform                                 Shared  Shared    Shared    Thread-  
-                                         C libs  F90 libs  C++ libs  safe     
-Solaris2.10 32-bit                         y       y         y         y        
-Solaris2.10 64-bit                         y       y         y         y        
-Windows XP                                 y       y(4)      y         n        
-Windows XP x64                             y       y(4)      y         n        
-Windows Vista                              y       y(4)      y         y
-Windows Vista x64                          y       y(4)      y         y
-OpenVMS Alpha                              n       n         n         n
-Mac OS X 10.7 Intel 32-bit                 y(5)    n         y         n        
-Mac OS X 10.7 Intel 64-bit                 y(5)    n         y         n        
-AIX 6.1 32- and 64-bit                     n       n         n         y        
-FreeBSD 8.2-STABLE 32&64 bit               y       x         x         y        
-CentOS 5.5 Linux 2.6.18-128 i686 GNU (1)W  y       y(2)      y         y        
-CentOS 5.5 Linux 2.6.18-128 i686 Intel  W  y       y         y         n        
-CentOS 5.5 Linux 2.6.18-128 i686 PGI    W  y       y         y         n        
-CentOS 5.5 Linux 2.6.16 x86_64 GNU (1)  W  y       y         y         y        
-CentOS 5.5 Linux 2.6.16 x86_64 Intel    W  y       y         y         n        
-CentOS 5.5 Linux 2.6.16 x86_64 PGI      W  y       y         y         n        
-RedHat EL4 2.6.18 Xeon Lustre           C  y       y         y         n
-Fedora 12 Linux 2.6.32.16-150.fc12.ppc64   y       y         y         y 
-SGI Linux 2.6.32.19                        y       y         y         y 
-
-           (1) Fortran compiled with gfortran.
-           (2) With PGI and Absoft compilers.
-           (3) With PGI compiler for Fortran.
-           (4) Using Visual Studio 2008 w/ Intel Fortran 10.1 (Cygwin shared libraries are not supported)
-           (5) C and C++ shared libraries will not be built when Fortran is enabled.
+          <blank> = testing incomplete on this feature or platform
+          W or C indicates workstation or cluster, respectively.
+
+Platform                          C        F90    F90      C++   zlib  SZIP
+                                  parallel        parallel
+SunOS5.10 64-bit                   n        y      n        y     y     y
+SunOS5.10 32-bit                   n        y      n        y     y     y
+AIX-5.2  32-bit                    y        y      y        y     y     y
+AIX-5.2  64-bit                    y        y      y        y     y     y
+Cray XT3 (not tested
+          for this release)        n        n      n        n     n     n
+Windows XP                         n        y(3)   n(3)     y     y     y
+Windows XP x64                     n        y(3)   n(3)     y     y     y
+Windows Vista                      n        y(3)   n(3)     y     y     y
+Windows Vista x64                  n        y(3)   n(3)     y     y     y
+Mac OS X 10.5 Intel                n        y      n        y     y     y
+FreeBSD 6.2 32-bit                 n        n      n        y     y     y
+FreeBSD 6.2 64-bit
+RedHat EL4 2.6.9 i686 GNU        W y(2)     y(4)   y(2)     y     y     y
+RedHat EL4 2.6.9 i686 Intel      W n        y      n        y     y     n
+RedHat EL4 2.6.9 i686 PGI        W n        y      n        y     y     n
+SuSe Linux 2.6.16 x86_64 GNU (5) W y(2)     y      n        y     y     y
+SuSe Linux 2.6.16 x86_64 Int (5) W n        y      n        y     n     n
+SuSe Linux 2.6.16 x86_64 PGI (5) W n        y      n        y     n     n
+RHL9 Linux 2.4 Xeon Lustre Intel C n        y      n        y     y     n
+RHEL3 Linux 2.4 Xeon Intel       W n        y      n        n     y     n
+RHEL4 Linux 2.6 Xeon Lustre Int  C n        y      n        y     y     n
+SuSE Linux 2.4 ia64 Intel        C y(1)     y      y        y     y     y
+SuSe Linux 2.6.5
+       SGI Altix ia64 Intel      C n        y      n        y     n     y
+Alpha OpenVMS 7.3.2                n        y      n        y     n     n
+
+
+
+Platform                          Shared   Shared    Shared    static-  Thread-
+                                  C libs   F90 libs  C++ libs  exec     safe
+SunOS 5.10 32-bit                   y        y         y         x        y
+SunOS 5.10 64-bit                   y        y         y         x        y
+AIX-5.2 32-bit                      n        n         n         x        n
+AIX-5.2 64-bit                      n        n         n         x        n
+Cray XT3 (not tested
+          for this release)         n        n         n         x        n
+Windows XP                          y        y(3)      y         y        n
+Windows XP x64                      y        y(3)      y         y        n
+Windows Vista                       y        y(3)      y         y        n
+Windows Vista x64                   y        y(3)      y         y        n
+Mac OS X 10.5 Intel                 y        y         y         x        n
+FreeBSD 6.2 32-bit                  y        y         y         x        n
+FreeBSD 6.2 64-bit                  y        y         y         x        n
+RHEL4 2.6.9 i686 GNU              W y        y(4)      y         x        y
+RHEL4 2.6.9 i686 Intel            W y        y         y         x        n
+RHEL4 2.6.9 i686 PGI              W y        y         y         x        n
+SuSE Linux 2.6.16 x86_64 GNU (5)  W y        y         y         x        y
+SuSE Linux 2.6.16 x86_64 Intel(5) W y        y         y         x        n
+SuSE Linux 2.6.16 x86_64 PGI(5)   W y        y         y         x        n
+RHL9 Linux 2.4 Xeon Lustre Intel  C y        y         y         x        n
+RHEL3 Linux 2.4 Xeon Intel        W y        n         n         x        n
+RHEL4 Linux 2.6 Xeon Lustre Intel C y        y         y         x        n
+SuSE Linux 2.4 ia64 Intel         C y        y         y         x        n
+SuSe Linux 2.6.5
+           SGI Altix ia64 Intel   C n        n         n         x        n
+
+    Notes: (1)  Using mpich 1.2.6.
+           (2) Using mpich2 1.0.6.
+           (3) Using Visual Studio 2008 (Cygwin shared libraries are not supported)
+           (4) With PGI and Absoft compilers.
+           (5) AMD Opteron x86_64
     Compiler versions for each platform are listed in the preceding
     "Platforms Tested" table.
 
 
+
 Known Problems
 ==============
-* After the shared library support was fixed for some bugs, it was discovered
-  that "make prefix=XXX install" no longer works for shared libraries. It
-  still works correctly for static libraries. Therefore, if you want to
-  install the HDF5 shared libraries in a location such as /usr/local/hdf5,
-  you need to specify the location via the --prefix option during configure 
-  time. E.g, ./configure --prefix=/usr/local/hdf5 ...
-  (AKC - 2011/05/07 HDFFV-7583)
-
-* The parallel test, t_shapesame, in testpar/, may run for a long time and may
-  be terminated by the alarm signal.  If that happens, one can increase the
-  alarm seconds (default is 1200 seconds = 20 minutes) by setting the
-  environment variable, $HDF5_ALARM_SECONDS, to a larger value such as 3600
-  (60 minutes).  Note that the t_shapesame test may fail in some systems 
-  (see the "While working on the 1.8.6 release..." problem below).  If 
-  it does, it will waste more time if $HDF5_ALARM_SECONDS is set
-  to a larger value. (AKC - 2011/05/07)
-
-* The C++ and FORTRAN bindings are not currently working on FreeBSD.
-  (QAK - 2011/04/26)
-
-* Shared Fortran libraries are not quite working on AIX. While they are
-  generated when --enable-shared is specified, the fortran and hl/fortran
-  tests fail. We are looking into the issue. HL and C++ shared libraries
-  should now be working as intended, however. (MAM - 2011/04/20)
-
-* The --with-mpe configure option does not work with Mpich2. AKC - 2011/03/10
-
-* If parallel gmake (e.g., gmake -j 4) is used, the "gmake clean" command
-  sometimes fails in the perform directory due to the attempt to remove the
-  executable of h5perf or h5perf_serial by two "parallel" commands. This error
-  has no consequence on the functionality of the HDF5 library or install. It
-  is fixed in the next release. AKC - 2011/01/25
-
-* While working on the 1.8.6 release of HDF5, a bug was discovered that can
-  occur when reading from a dataset in parallel shortly after it has been
-  written to collectively. The issue was exposed by a new test in the parallel
-  HDF5 test suite, but had existed before that. We believe the problem lies with
-  certain MPI implementations and/or file systems.
-
-  We have provided a pure MPI test program, as well as a standalone HDF5
-  program, that can be used to determine if this is an issue on your system.
-  They should be run across multiple nodes with a varying number of processes.
-  These programs can be found at:
-  http://www.hdfgroup.org/ftp/HDF5/examples/known_problems/
-
-* The library's test dt_arith.c showed a compiler's rounding problem on
-  Cygwin when converting from unsigned long long to long double.  The 
-  library's own conversion works fine.  We defined a macro for Cygwin to
-  skip this test until we can solve the problem.  Please see bug #1813.
-  SLU - 2010/5/5 
-
-* All the VFL drivers aren't backward compatible.  In H5FDpublic.h, the
-  structure H5FD_class_t changed in 1.8.  There is new parameter added to
-  get_eoa and set_eoa callback functions.  A new callback function
-  get_type_map was added in.  The public function H5FDrealloc was taken
-  out in 1.8.  The problem only happens when users define their own driver
-  for 1.6 and try to plug in 1.8 library.  Because there's only one user 
-  complaining about it, we (Elena, Quincey, and I) decided to leave it as 
-  it is (see bug report #1279).  Quincey will make a plan for 1.10.
-  SLU - 2010/2/2
-
-* MinGW has a missing libstdc++.dll.a library file and will not successfully link
-  C++ applications/tests. Do not use the enable-cxx configure option. Read all of
-  the INSTALL_MINGW.txt file for all restrictions. ADB - 2009/11/11
-  
+* Parallel mode in AIX will fail some of the testcheck_version.sh tests where
+  it treats "exit(134) the same as if process 0 had received an abort signal.
+  This is fixed and will be available in the next release. AKC - 2009/11/3
+
+* Some tests in tools/h5repack may fail in AIX systems when -q32 mode is used.
+  The error is due to insufficient memory requested. Request a large amount
+  of runtime memory by setting the following environment variable for more
+  memory.
+     LDR_CNTRL=MAXDATA=0x20000000 at DSA
+  AKC - 2009/10/31
+
 * The PathScale MPI implementation, accessing a Panasas file system, would
-  cause H5Fcreate() with H5F_ACC_EXCL to fail even when the file does not
-  exist. This is due to the MPI_File_open() call failing if the mode has
+  cause H5Fcreate() with H5F_ACC_EXCL to fail even when the file is not
+  existing. This is due to the MPI_File_open() call failing if the amode has
   the MPI_MODE_EXCL bit set. (See bug 1468 for details.) AKC - 2009/8/11
  
 * Parallel tests failed with 16 processes with data inconsistency at testphdf5
   / dataset_readAll. Parallel tests also failed with 32 and 64 processes with
   collective abort of all ranks at t_posix_compliant / allwrite_allread_blocks
-  with MPI IO. CMC - 2009/04/28
-
-* For Red Storm, a Cray XT3 system, the tools/h5ls/testh5ls.sh and
-  tools/h5copy/testh5copy.sh will fail some of its sub-tests. These sub-tests
-  are expected to fail and should exit with a non-zero code but the yod
-  command does not propagate the exit code of the executables. Yod always
-  returns 0 if it can launch the executable.  The test suite shell expects
-  a non-zero for this particular test, therefore it concludes the test has
-  failed when it receives 0 from yod.  Skip all the "failing" test for now
-  by changing them as following.
-
-  ======== Original tools/h5ls/testh5ls.sh =========
-  TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ======== Change to ===============================
-  echo SKIP TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ==================================================
-
-  ======== Original tools/h5copy/testh5copy.sh =========
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  H5LSTEST $FILEOUT
-  ======== Change to ===============================
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  echo SKIP H5LSTEST $FILEOUT
-  ==================================================
-  AKC - 2008/11/10
-
-* For Red Storm, a Cray XT3 system, the yod command sometimes gives the
-  message,  "yod allocation delayed for node recovery".  This interferes with
-  test suites that do not expect to see this message.  See the section of "Red
-  Storm" in file INSTALL_parallel for a way to deal with this problem.
-  AKC - 2008/05/28
-
-* On an Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* On mpich 1.2.5 and 1.2.6, if more than two processes contribute no IO and 
-  the application asks to do collective IO, we have found that when using 4 
-  processors, a simple collective write will sometimes be hung. This can be 
-  verified with t_mpi test under testpar.
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  SLU - 2005/6/30
-
+  with MPI IO. (CMC - 2009/04/28)
+
+* For SNL, spirit/liberty/thunderbird: The serial tests pass but parallel
+  tests failed with MPI-IO file locking message. AKC - 2007/6/25.
+* On Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers use
+  -mp -O1 compilation flags to build the libraries. Higher level of optimization 
+  causes failures in several HDF5 library tests. 
+* For HPUX 11.23 many tools tests failed for 64-bit version when linked to the
+  shared libraries (tested for 1.8.0-beta2)
+* For SNL, Red Storm: only paralle HDF5 is supported.  The serial tests pass
+  and the parallel tests also pass with lots of non-fatal error messages.
+* on SUN 5.10 C++ test fails in the "Testing Shared Datatypes with Attributes" test 
+* configuring with --enable-debug=all produces compiler errors on most
+  platforms.  Users who want to run HDF5 in debug mode should use
+  --enable-debug rather than --enable-debug=all to enable debugging
+  information on most modules.
+* On Mac OS 10.4, test/dt_arith.c has some errors in conversion from long
+  double to (unsigned) long long and from (unsigned)long long to long double. 
+* On Altix SGI with Intel 9.0 testmeta.c would not compile with -O3
+  optimization flag.
+* On VAX, Scaleoffset filter isn't supported. The filter cannot be applied to
+  HDF5 data generated on VAX. Scaleoffset filter only supports IEEE standard
+  for floating-point data.
+* On Cray X1, a lone colon on the command line of h5dump --xml (as in
+  the testh5dumpxml.sh script) is misinterpereted by the operating system
+  and causes an error.
+* On mpich 1.2.5 and 1.2.6, we found that if more than two processes
+  contribute no IO and the application asks to do IO with collective, we found
+  that when using 4 processors, a simple collective write will be hung
+  sometimes. This can be verified with t_mpi test under testpar.
+* The dataset created or rewritten with the v1.6.3 library or after can't 
+  be read with the v1.6.2 library or before when Fletcher32 EDC(filter) is 
+  enabled.  There was a bug in the calculating code of the Fletcher32 
+  checksum in the library before v1.6.3.  The checksum value wasn't consistent 
+  between big-endian and little-endian systems.  This bug was fixed in 
+  Release 1.6.3.  However, after fixing the bug, the checksum value is no 
+  longer the same as before on little-endian system.  The library release 
+  after 1.6.4 can still read the dataset created or rewritten with the library
+  of v1.6.2 or before.  SLU - 2005/6/30
+* For the version 6(6.02 and 6.04) of Portland Group compiler on AMD Opteron
+  processor, there's a bug in the compiler for optimization(-O2).  The library
+  failed in several tests but all related to multi driver.  The problem has 
+  been reported to the vendor.  
 * On IBM AIX systems, parallel HDF5 mode will fail some tests with error
-  messages like "INFO: 0031-XXX ...".  This is from the command `poe'.
+  messages like "INFO: 0031-XXX ...".  This is from the command poe.
   Set the environment variable MP_INFOLEVEL to 0 to minimize the messages
   and run the tests again.
-
-  The tests may fail with messages like "The socket name is already in use",  
-  but HDF5 does not use sockets.  This failure is due to problems with the 
-  poe command trying to set up the debug socket.  To resolve this problem, 
-  check to see whether there are many old /tmp/s.pedb.* files staying around.  
-  These are sockets used by the poe command and left behind due to failed 
-  commands.  First, ask your system administrator to clean them out.  
-  Lastly, request IBM to provide a means to run poe without the debug socket.
+  The tests may fail with messages like "The socket name is already
+  in use".  HDF5 does not use sockets (except for stream-VFD).  This is
+  due to problems of the poe command trying to set up the debug socket.
+  Check if there are many old /tmp/s.pedb.* staying around.  These are
+  sockets used by the poe command and left behind due to failed commands.
+  Ask your system administrator to clean them out.  Lastly, request IBM
+  to provide a mean to run poe without the debug socket.
+
+* The C++ library's tests fails when compiling with PGI C++ compiler.  The
+  workaround until the problem is correctly handled is to use the 
+  flag "--instantiate=local" prior to the configure and build steps, as:
+        setenv CXX "pgCC --instantiate=local"  for pgCC 5.02 and higher
+
+
+* The stream-vfd test uses ip port 10007 for testing. If another
+  application is already using that port address, the test will hang
+  indefinitely and has to be terminated by the kill command. To try the
+  test again, change the port address in test/stream_test.c to one not
+  being used in the host.
 
 * The --enable-static-exec configure flag will only statically link libraries
   if the static version of that library is present. If only the shared version
@@ -614,17 +789,93 @@ Known Problems
   fully static. Thus, the only guarantee on these systems is that the 
   executable is statically linked with just the HDF5 library.
 
-* There is also a configure error on Altix machines that incorrectly reports 
-  when a version of Szip without an encoder is being used.
+* With the gcc 2.95.2 compiler, HDF 5 uses the `-ansi' flag during
+  compilation. The ANSI version of the compiler complains about not being
+  able to handle the `long long' datatype with the warning:
+
+        warning: ANSI C does not support `long long'
+  
+  This warning is innocuous and can be safely ignored.
+
+* Certain platforms give false negatives when testing h5ls:
+    - Cray J90 and Cray T90IEEE give errors during testing when displaying
+      some floating-point values. These are benign differences due to
+      the different precision in the values displayed and h5ls appears to
+      be dumping floating-point numbers correctly.
+
+* Not all platforms behave correctly with szip's shared libraries. Szip is
+  disabled in these cases, and a message is relayed at configure time. Static
+  libraries should be working on all systems that support szip, and should be
+  used when shared libraries are unavailable. There is also a configure error
+  on Altix machines that incorrectly reports when a version of szip without
+  an encoder is being used.
+
+* On some platforms that use Intel and Absoft compilers to build HDF5 fortran library,
+  compilation may fail for fortranlib_test.f90, fflush1.f90 and fflush2.f90
+  complaining about exit subroutine. Comment out the line 
+  IF (total_error .ne. 0) CALL exit (total_error)
+
+* Information about building with PGI and Intel compilers is available in
+  INSTALL file sections 5.7 and 5.8
+
+* On at least one system, (SDSC DataStar), the scheduler (in this case
+  LoadLeveler) sends job status updates to standard error when you run 
+  any executable that was compiled with the parallel compilers.
+
+  This causes problems when running "make check" on parallel builds, as 
+  many of the tool tests function by saving the output from test runs,
+  and comparing it to an exemplar.  
+
+  The best solution is to reconfigure the target system so it no longer
+  inserts the extra text.  However, this may not be practical.
+
+  In such cases, one solution is to "setenv HDF5_Make_Ignore yes" prior to 
+  the configure and build.  This will cause "make check" to continue after 
+  detecting errors in the tool tests.  However, in the case of SDSC DataStar,
+  it also leaves you with some 150 "failed" tests to examine by hand.
+
+  A second solution is to write a script to run serial tests and filter
+  out the text added by the scheduler.  A sample script used on SDSC
+  DataStar is given below, but you will probably have to customize it 
+  for your installation.  
+
+  Observe that the basic idea is to insert the script as the first item 
+  on the command line which executes the the test.  The script then 
+  executes the test and filters out the offending text before passing
+  it on.
+
+        #!/bin/csh
+
+        set STDOUT_FILE=~/bin/serial_filter.stdout
+        set STDERR_FILE=~/bin/serial_filter.stderr
+
+        rm -f $STDOUT_FILE $STDERR_FILE
+
+        ($* > $STDOUT_FILE) >& $STDERR_FILE
+
+	set RETURN_VALUE=$status
+
+        cat $STDOUT_FILE
+
+        tail +3 $STDERR_FILE
+
+	exit $RETURN_VALUE
+
+  You get the HDF make files and test scipts to execute your filter script
+  by setting the environment variable "RUNSERIAL" to the full path of the 
+  script prior to running configure for parallel builds.  Remember to 
+  "unsetenv RUNSERIAL" before running configure for a serial build.
+
+  Note that the RUNSERIAL environment variable exists so that we can 
+  can prefix serial runs as necessary on the target system.  On DataStar,
+  no prefix is necessary.  However on an MPICH system, the prefix might
+  have to be set to something like "/usr/local/mpi/bin/mpirun -np 1" to
+  get the serial tests to run at all.
+
+  In such cases, you will have to include the regular prefix in your
+  filter script.
 
-* On cobalt, an SGI Altix SMP ia64 system, Intel compiler version 10.1 (which
-  is the default on that system) does not work properly and results in
-  failures during make check (in a static build) and make installcheck (during
-  a shared build). This appears to be a compiler optimization problem.
-  Reducing optimization by setting CFLAGS to -O1 or below resolves the issue.
-  Alternatively, using a newer version of the compiler (11.0) also works as
-  intended. MAM - 2010/06/01
+* H5Ocopy() does not copy reg_ref attributes correctly when shared-message
+  is turn on. The value of the reference in the destination attriubte is
+  wrong. This H5Ocopy problem will affect h5copy tool
 
-* h5diff will not report enum value differences when one or both of the values
-  is not a valid enumeration value.  The source of this bug has been identified
-  and it will be fixed in 1.8.8. DER - 2011/04/27
diff --git a/html/ADGuide/TechNote-HDF5-ImprovingCompressionPerformance.docx b/html/ADGuide/TechNote-HDF5-ImprovingCompressionPerformance.docx
new file mode 100644
index 0000000..1ed1cbd
Binary files /dev/null and b/html/ADGuide/TechNote-HDF5-ImprovingCompressionPerformance.docx differ
diff --git a/html/Advanced.html b/html/Advanced.html
index 39411b7..720e1d6 100644
--- a/html/Advanced.html
+++ b/html/Advanced.html
@@ -200,6 +200,20 @@
           <hr color="green" size="1"/>
           </td></tr>
 
+      <tr><td valign="top"><a href="Advanced/FileSpaceManagement/FileSpaceManagement.pdf">
+          HDF5 File Space</a>
+          <br />   
+          <a href="Advanced/FileSpaceManagement/FileSpaceManagement.pdf">Management<a>
+        </td><td></td><td valign="top">Provides detailed information regarding
+          space allocation and the management of free space in an HDF5 file.
+          <br />
+          <i>(PDF only)</i> 
+          <b>??????? Unreleased development work. Not for 1.8 release 
+          yet if ever. ???????</b>
+        </td></tr>
+
+      <tr><td colspan="3"> </td></tr>
+
       <tr><td valign="top"><a href="Advanced/MetadataCache/index.html">Metadata 
               Caching</a>
           <br />   
@@ -323,7 +337,7 @@
 </table>
 </center>
 <hr>
-<!-- #EndLibraryItem -->
+<!-- #EndLibraryItem --><address>
 
 <?php include("./ed_libs/Footer.htm"); ?>
 
diff --git a/html/Advanced/Chunking/index.html b/html/Advanced/Chunking/index.html
index bdc0c9a..191e1cf 100644
--- a/html/Advanced/Chunking/index.html
+++ b/html/Advanced/Chunking/index.html
@@ -542,9 +542,11 @@ Example 2: Writing part of a column to a chunked dataset
 <hr /><br />
 <p>Return to the <a href="../../Advanced.html">"Advanced Topics"</a> page.</p>
 <br />
-<hr />
 
-<?php include("../../ed_libs/Footer3.htm"); ?>
+
+<hr>
+
+<?php include("../../ed_libs/Footer-THGonly3.htm"); ?>
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
diff --git a/html/Advanced/CommittedDatatypeCopying/AdvancedTopicsPageNotesLink.txt b/html/Advanced/CommittedDatatypeCopying/AdvancedTopicsPageNotesLink.txt
new file mode 100644
index 0000000..301e29e
--- /dev/null
+++ b/html/Advanced/CommittedDatatypeCopying/AdvancedTopicsPageNotesLink.txt
@@ -0,0 +1,43 @@
+Committed Datatypes Copying, links to pdf from advanced topics
+
+
+
+add the following to Advanced.html:
+
+In the broadly applicable section, add this
+
+left column:
+Copying Committed Datatypes 
+with H5Ocopy
+
+right column:
+Describes how to copy to another file a dataset that uses a committed 
+datatype or an object with an attribute that uses a committed datatype 
+so that the committed datatype in the destination file can be used by 
+multiple objects.
+(PDF only)
+
+place the row above after the chunking row
+
+the actual link for the Additional Resources page should be the following:
+<a href="../Advanced/CommittedDatatypeCopying/CopyingCommittedDatatypesWithH5Ocopy.pdf">
+Copying Committed Datatypes with H5Ocopy</a>
+
+i think the info above can apply to add resources page too
+
+
+
+
+link from datatypes chapter
+
+This sentence is in section 6.8: 
+    Note that a committed datatype can be shared by objects within the same 
+    HDF5 file, but not by objects in other files. 
+
+put the following after the sentence above as a link to the "Additional 
+Resources" page:
+
+    For more information on copying committed datatypes to other HDF5 
+    files, see the “Copying Committed Datatypes with H5Ocopy” topic on 
+    the “<a href="17_Additional.html">Additional Resources</a>” 
+    chapter.
diff --git a/html/Advanced/CommittedDatatypeCopying/CopyingCommittedDatatypesWithH5Ocopy_120320.docx b/html/Advanced/CommittedDatatypeCopying/CopyingCommittedDatatypesWithH5Ocopy_120320.docx
new file mode 100644
index 0000000..d5937bf
Binary files /dev/null and b/html/Advanced/CommittedDatatypeCopying/CopyingCommittedDatatypesWithH5Ocopy_120320.docx differ
diff --git a/html/Advanced/CommittedDatatypeCopying/CopyingCommittedDatatypesWithH5Ocopy_120321.docx b/html/Advanced/CommittedDatatypeCopying/CopyingCommittedDatatypesWithH5Ocopy_120321.docx
new file mode 100644
index 0000000..d6b0086
Binary files /dev/null and b/html/Advanced/CommittedDatatypeCopying/CopyingCommittedDatatypesWithH5Ocopy_120321.docx differ
diff --git a/html/Advanced/CommittedDatatypeCopying/HDF5CommittedDatatypeCopying_120320.docx b/html/Advanced/CommittedDatatypeCopying/HDF5CommittedDatatypeCopying_120320.docx
new file mode 100644
index 0000000..955e641
Binary files /dev/null and b/html/Advanced/CommittedDatatypeCopying/HDF5CommittedDatatypeCopying_120320.docx differ
diff --git a/html/Advanced/CommittedDatatypeCopying/HDF5CommittedDatatypesCopying_120316-QAK.docx b/html/Advanced/CommittedDatatypeCopying/HDF5CommittedDatatypesCopying_120316-QAK.docx
new file mode 100644
index 0000000..4ba34f0
Binary files /dev/null and b/html/Advanced/CommittedDatatypeCopying/HDF5CommittedDatatypesCopying_120316-QAK.docx differ
diff --git a/html/Advanced/CommittedDatatypeCopying/HDF5CommittedDatatypesCopying_120316.docx b/html/Advanced/CommittedDatatypeCopying/HDF5CommittedDatatypesCopying_120316.docx
new file mode 100644
index 0000000..7170a47
Binary files /dev/null and b/html/Advanced/CommittedDatatypeCopying/HDF5CommittedDatatypesCopying_120316.docx differ
diff --git a/html/Advanced/CommittedDatatypeCopying/RFC_H5Ocopy_Named_DT_v3.docx b/html/Advanced/CommittedDatatypeCopying/RFC_H5Ocopy_Named_DT_v3.docx
new file mode 100644
index 0000000..ad7bc3b
Binary files /dev/null and b/html/Advanced/CommittedDatatypeCopying/RFC_H5Ocopy_Named_DT_v3.docx differ
diff --git a/html/Advanced/CommittedDatatypeCopying/RMentriesMergeCommittedDatatypes.html b/html/Advanced/CommittedDatatypeCopying/RMentriesMergeCommittedDatatypes.html
new file mode 100644
index 0000000..d302c17
--- /dev/null
+++ b/html/Advanced/CommittedDatatypeCopying/RMentriesMergeCommittedDatatypes.html
@@ -0,0 +1,1462 @@
+<html>
+<!-- the RM entries for the various APIs for the merge committed datatypes 
+functionality are listed below. -->
+
+<p>H5Pset_copy_object.htm</p>
+<p>H5Pget_mcdt_search_cb.htm</p>
+<p>H5Pset_mcdt_search_cb.htm</p>
+<p>H5Padd_merge_committed_dtype_path.htm</p>
+<p>H5Pfree_merge_committed_dtype_paths.htm</p>
+<p>H5O_mcdt_search_cb_t.htm</p>
+<p>H5Ocopy.htm</p>
+
+
+
+
+
+
+<br /><hr />
+<br />
+<h1>H5Pset_copy_object.htm</h1>
+<br />
+<hr />
+<br />
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * Copyright by The HDF Group.                                               *
+  * Copyright by the Board of Trustees of the University of Illinois.         *
+  * All rights reserved.                                                      *
+  *                                                                           *
+  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+  * terms governing use, modification, and redistribution, is contained in    *
+  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+  * of the source code distribution tree; Copyright.html can be found at the  *
+  * root level of an installed copy of the electronic HDF5 document set and   *
+  * is linked from the top-level documents page.  It can also be found at     *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
+  * access to either file, you may request a copy from help at hdfgroup.org.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pset_copy_object" -->
+<hr>
+<dl>
+
+  <dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 14 March 2012
+    </i></font></div>
+
+  <dt><strong>Name:</strong> 
+      <a name="Property-SetCopyObject">H5Pset_copy_object</a>
+
+  <dt><strong>Signature:</strong>
+    <dd><em>herr_t </em><code>H5Pset_copy_object</code>(
+            <em>hid_t </em><code>ocpypl_id</code>,
+            <em>unsigned </em><code>copy_options</code>
+        )
+
+  <p>
+  <dt><strong>Purpose:</strong>
+    <dd>Sets properties to be used when an object is copied.
+
+  <p>
+  <dt><strong>Description:</strong>
+    <dd><code>H5Pset_copy_object</code> sets properties 
+      in the object copy property list <code>ocpypl_id</code>. 
+      When an existing object is copied, that property list will 
+      determine how the new copy is created.
+      <p>
+      The following flags are available for use in an object copy property list:
+      <ul><table>
+          <td valign="top">
+              <code>H5O_COPY_SHALLOW_HIERARCHY_FLAG</code>
+          </td>
+          <td valign="top">
+              Copy only immediate members of a group.
+              <br>
+              <i>Default behavior, without flag:</i> 
+              Recursively copy all objects in and below the group.
+          </td></tr>
+        <tr>
+          <td valign="top"><code>H5O_COPY_EXPAND_SOFT_LINK_FLAG</code>
+          </td>
+          <td valign="top">
+              Expand soft links into new objects.
+              <br>
+              <i>Default behavior, without flag:</i> 
+              Copy soft links as they are.
+          </td></tr>
+        <tr>
+          <td valign="top"><code>H5O_COPY_EXPAND_EXT_LINK_FLAG</code>
+          </td>
+          <td valign="top">
+              Expand external link into new objects.
+              <br>
+              <i>Default behavior, without flag:</i> 
+              Copy external links as they are.
+          </td></tr>
+        <tr>
+          <td valign="top"><code>H5O_COPY_EXPAND_REFERENCE_FLAG</code>
+          </td>
+          <td valign="top">
+              Copy objects that are pointed to by references.
+              <br>
+              <i>Default behavior, without flag:</i> 
+              Update only the values of object references.
+          </td></tr>
+        <tr>
+          <td valign="top"><code>H5O_COPY_WITHOUT_ATTR_FLAG</code>
+          </td>
+          <td valign="top">
+              Copy object without copying attributes.
+              <br>
+              <i>Default behavior, without flag:</i> 
+              Copy object with all its attributes.
+          </td></tr>
+        <tr>
+          <td valign="top"><code>H5O_COPY_MERGE_COMMITTED_DTYPE_FLAG  </code>
+          </td>
+          <td valign="top">
+              Use a matching committed datatype in the destination file 
+	      when copying a committed datatype, 
+                           a dataset with a committed datatype, or 
+                           an object with an attribute of committed datatype.
+              <br>
+              <i>Default behavior without flag:</i>
+              <ul>
+                  <li>A committed datatype in the source will be copied 
+                      to the destination as a committed datatype. 
+                  <li>If a dataset in the source uses a committed datatype 
+                      or an object in the source has an attribute of a 
+                      committed datatype, that committed datatype will be 
+                      written to the destination as an 
+                      anonymous committed datatype.
+              </ul>
+              <p>
+              See the “See Also” section immediately below 
+              for functions related to the use of this flag.
+          </td></tr>
+
+        <!-- *** *** *** *** *** -->
+        <!-- H5O_COPY_ALL is used in HDF5 testing and debugging;      -->
+        <!-- it is not intended for use in user applications.         -->
+        <!--
+        <tr>
+          <td valign="top"><code>H5O_COPY_ALL</code>
+          </td>
+          <td valign="top">
+              Switches all flags from the default to the non-default setting.
+              <br>
+              <i>Default:</i> 
+              Use default properties unless individually set.
+          </td></tr>
+          *** *** *** *** *** -->
+
+      </table></ul>
+
+  <p>
+  <dt><strong>Parameters:</strong>
+    <dd><table>
+      <tr>
+        <td valign="top"><em>hid_t </em><code>ocpypl_id</code>
+        </td>
+        <td valign="top">IN: Object copy property list identifier 
+        </td></tr>
+      <tr>
+        <td valign="top"><em>unsigned </em><code>copy_options</code>    
+        </td>
+        <td valign="top">IN: Copy option(s) to be set
+        </td></tr>
+    </table></dd>
+
+  <p>
+  <dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful;
+        otherwise returns a negative value.
+
+  <p>
+  <dt><strong>See Also:</strong>
+    <dd><table width="100%">
+          <tr valign="top">
+              <td colspan="3">
+                  <a href="RM_H5O.html#Object-Copy"><code>H5Ocopy</code></a>
+                  <p>
+                  The following functions and callback function can be used 
+                  to tune copy behavior when the flag 
+                  <code>H5O_COPY_MERGE_COMMITTED_DTYPE_FLAG</code> is used:
+              </td></tr>
+          <tr valign="top">
+              <td width="46%">
+<!--
+                  <a href="RM_H5P.html#Property-SetCopyObject">
+                  <code>H5Pset_copy_object</code></a>
+                  <br>
+-->
+                  <a href="RM_H5P.html#Property-AddMergeCommittedDtypePath">
+                  <code>H5Padd_merge_committed_dtype_path</code></a>
+                  <br>
+                  <a href="RM_H5P.html#Property-FreeMergeCommittedDtypePaths">
+                  <code>H5Pfree_merge_committed_dtype_paths</code></a>
+              </td><td width="4%"> </td><td width="46%">
+                  <a href="RM_H5P.html#Property-SetMcdtSearchCb">
+                  <code>H5Pset_mcdt_search_cb</code></a>
+                  <br>
+                  <a href="RM_H5P.html#Property-GetMcdtSearchCb">
+                  <code>H5Pget_mcdt_search_cb</code></a>
+                  <br>
+                  <a href="RM_H5O.html#Object-McdtSearchCb_t">
+                  <code>H5O_mcdt_search_cb_t</code></a>
+          </tr>
+        </table>
+
+  <p>
+  <dt><strong>Fortran90 Interface:</strong> h5pset_copy_object_f
+    <dd><pre>
+SUBROUTINE h5pset_copy_object_f(ocpypl_id, copy_options, hdferr)
+  IMPLICIT NONE
+  INTEGER(HID_T), INTENT(IN) :: ocpypl_id 
+                              ! Object copy property list identifier
+  INTEGER, INTENT(IN) :: copy_options 
+                              ! Copy option(s) to be set, valid options are:
+                              !   H5O_COPY_SHALLOW_HIERARCHY_F
+                              !   H5O_COPY_EXPAND_SOFT_LINK_F 
+                              !   H5O_COPY_EXPAND_EXT_LINK_F
+                              !   H5O_COPY_EXPAND_REFERENCE_F
+                              !   H5O_COPY_WITHOUT_ATTR_FLAG_F
+                              !   H5O_COPY_MERGE_COMMITTED_DTYPE_FLAG_F
+</pre>
+<!-- NEW PAGE -->
+<pre>
+  INTEGER, INTENT(OUT) :: hdferr      
+                              ! Error code
+                              ! 0 on success and -1 on failure
+END SUBROUTINE h5pset_copy_object_f
+    </pre></dd>
+
+
+  <p>
+  <dt><strong>History:</strong>
+    <dd><table width="90%">
+        <tr>
+          <td valign="top" align="left" width="10%">
+            <strong>Release</strong>    </td>
+          <td valign="top" align="left">
+            <strong>C</strong></td></tr>
+        <tr>
+          <td valign="top">1.8.0</td>
+          <td valign="top">
+            Function introduced in this release.</td></tr>
+        <tr>
+          <td valign="top">1.**.**</td>
+          <td valign="top">
+            <code>H5O_COPY_MERGE_COMMITTED_DTYPE_FLAG</code> 
+            added in this release. </td></tr>
+    </table></dd>
+</dl>
+
+
+
+<br /><hr />
+<br />
+<h1>H5Pget_mcdt_search_cb.htm</h1>
+<br />
+<hr />
+<br />
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * Copyright by The HDF Group.                                               *
+  * Copyright by the Board of Trustees of the University of Illinois.         *
+  * All rights reserved.                                                      *
+  *                                                                           *
+  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+  * terms governing use, modification, and redistribution, is contained in    *
+  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+  * of the source code distribution tree; Copyright.html can be found at the  *
+  * root level of an installed copy of the electronic HDF5 document set and   *
+  * is linked from the top-level documents page.  It can also be found at     *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
+  * access to either file, you may request a copy from help at hdfgroup.org.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pget_mcdt_search_cb" -->
+<hr>
+<dl>
+  <dt><div align=right><font color=999999 size=-1><i>
+      Last modified: 14 March 2012 
+      </i></font></div>
+
+  <dt><strong>Name:</strong> 
+      <a name="Property-GetMcdtSearchCb">H5Pget_mcdt_search_cb</a>
+
+  <dt><strong>Signature:</strong>
+    <dd><em>herr_t </em><code>H5Pget_mcdt_search_cb</code>(
+            <em>hid_t </em><code>ocpypl_id</code>,
+            <em>H5O_mcdt_search_cb_t *</em><code>func</code>,
+            <em>void **</em><code>op_data</code>
+        )
+
+  <p>
+  <dt><strong>Purpose:</strong>
+    <dd>Retrieves the callback function from the specified object
+        copy property list.
+
+  <p>
+  <dt><strong>Description:</strong>
+    <dd><code>H5Pget_mcdt_search_cb</code> retrieves the user-defined 
+	callback function and the user data that are set via 
+        <a href="RM_H5P.html#Property-SetMcdtSearchCb">
+        <code>H5Pset_mcdt_search_cb</code></a>
+        in the object copy property list <code>ocpypl_id</code>.
+        <p>
+        The callback function will be returned in the parameter 
+        <code>func</code> and the user data will be returned in the 
+        parameter <code>op_data</code>.
+
+  <p>
+  <dt><strong>Parameters:</strong>
+    <dd><table>
+        <tr valign="top">
+          <td><em>hid_t </em><code>ocpypl_id</code>
+              </td><td>    </td>
+          <td>IN: Object copy property list identifier
+              </td></tr>
+        <tr valign="top">
+          <td><em><a href="RM_H5O.html#Object-McdtSearchCb_t">H5O_mcdt_search_cb_t</a> *</em><code>func</code>
+              </td><td> </td>
+          <td>OUT: User-defined callback function
+              </td></tr>
+        <tr valign="top">
+          <td><em>void **</em><code>op_data</code>
+              </td><td> </td>
+          <td>OUT: User-defined input data for the callback function
+              </td></tr>
+        </table>
+
+  <p>
+  <dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful;
+        otherwise returns a negative value.
+
+  <p>
+  <dt><strong>Failure Modes:</strong>
+    <dd><code>H5Pget_mcdt_search_cb</code> will fail 
+        if the object copy property list is invalid.
+
+  <p>
+  <dt><strong>See Also:</strong>
+    <dd><table width="90%">
+          <tr valign="top">
+              <td width="46%">
+                  <a href="RM_H5O.html#Object-Copy"><code>H5Ocopy</code></a>
+                  <br>
+                  <a href="RM_H5P.html#Property-SetCopyObject">
+                  <code>H5Pset_copy_object</code></a>
+              </td><td width="4%"> </td><td width="46%">
+                  <a href="RM_H5P.html#Property-SetMcdtSearchCb">
+                  <code>H5Pset_mcdt_search_cb</code></a>
+<!--
+                  <br>
+                  <a href="RM_H5P.html#Property-FreeMergeCommittedDtypePaths">
+                  <code>H5Pfree_merge_committed_dtype_paths</code></a>
+                  <br>
+                  <a href="RM_H5P.html#Property-AddMergeCommittedDtypePath">
+                  <code>H5Padd_merge_committed_dtype_path</code></a>
+                  <br>
+                  <a href="RM_H5P.html#Property-GetMcdtSearchCb">
+                  <code>H5Pget_mcdt_search_cb</code></a>
+-->
+                  <br>
+                  <a href="RM_H5O.html#Object-McdtSearchCb_t">
+                  <code>H5O_mcdt_search_cb_t</code></a>
+          </tr>
+        </table>
+
+  <p>
+  <dt><strong>History:</strong>
+    <dd><table width="90%">
+        <tr>
+          <td valign="top" align="left" width="10%">
+            <strong>Release</strong>    </td>
+          <td valign="top" align="left">
+            <strong>Change</strong></td>
+        </tr>
+
+        <tr>
+          <td valign="top">*.**.**</td>
+          <td valign="top">
+            C function introduced in this release.</td>
+        </tr>
+        </table>
+</dl>
+
+
+
+<br /><hr />
+<br />
+<h1>H5Pset_mcdt_search_cb.htm</h1>
+<br />
+<hr />
+<br />
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * Copyright by The HDF Group.                                               *
+  * Copyright by the Board of Trustees of the University of Illinois.         *
+  * All rights reserved.                                                      *
+  *                                                                           *
+  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+  * terms governing use, modification, and redistribution, is contained in    *
+  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+  * of the source code distribution tree; Copyright.html can be found at the  *
+  * root level of an installed copy of the electronic HDF5 document set and   *
+  * is linked from the top-level documents page.  It can also be found at     *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
+  * access to either file, you may request a copy from help at hdfgroup.org.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pset_mcdt_search_cb" -->
+<hr>
+<dl>
+
+  <dt><div align=right><font color=999999 size=-1><i>
+      Last modified: 14 March 2012 
+      </i></font></div>
+
+  <dt><strong>Name:</strong> 
+      <a name="Property-SetMcdtSearchCb">H5Pset_mcdt_search_cb</a>
+
+  <dt><strong>Signature:</strong>
+    <dd><em>herr_t </em><code>H5Pset_mcdt_search_cb</code>(
+            <em>hid_t </em><code>ocpypl_id</code>,
+            <em>H5O_mcdt_search_cb_t </em><code>func</code>,
+            <em>void *</em><code>op_data</code>
+        )
+
+  <p>
+  <dt><strong>Purpose:</strong>
+    <dd>Sets the callback function that 
+        <a href="RM_H5O.html#Object-Copy"><code>H5Ocopy</code></a>
+        will invoke before searching the entire destination file 
+        for a matching committed datatype.
+
+  <p>
+  <dt><strong>Motivation:</strong>
+    <dd><code>H5Pset_mcdt_search_cb</code> 
+        provides the means to define a callback function. 
+        An application can then use that callback 
+        to take an additiional action before the default search of all 
+        committed datayptes in the destination file
+        or to take an action that replaces that default search.
+        This mechanism is intended to improve performance when the 
+        global search might take a long time.
+
+  <p>
+  <dt><strong>Description:</strong>
+    <dd><code>H5Pset_mcdt_search_cb</code> 
+        allows an application to set a callback function, <code>func</code>, 
+        that will be invoked before searching the destination file 
+        for a matching committed datatype.
+        The default, global search process is described in
+        <a href="RM_H5P.html#Property-AddMergeCommittedDtypePath">
+        <code>H5Padd_merge_committed_dtype_path</code></a>.
+        <p>
+        The callback function must conform to the 
+        <a href="RM_H5O.html#Object-McdtSearchCb_t">
+        <code>H5O_mcdt_search_cb_t</code></a> prototype 
+        and will return an instruction for one of the following actions:
+	<ul>
+	    <li>Continue the search for a matching committed datatype in 
+	        the destination file.
+	    <li>Discontinue the search for a matching committed datatype.
+	        <a href="RM_H5O.html#Object-Copy"><code>H5Ocopy</code></a>
+	        will then apply the default behavior of creating an anonymous 
+                committed datatype.
+	    <li>Abort the copy operation and exit
+	        <a href="RM_H5O.html#Object-Copy"><code>H5Ocopy</code></a>.
+	</ul>
+
+  <p>
+  <dt><strong>Warning:</strong>
+    <dd>If the callback function return value causes <code>H5Ocopy</code> 
+      to abort, the destination file may be left in an 
+      inconsistent or corrupted state.
+
+  <p>
+  <dt><strong>Parameters:</strong>
+    <dd><table>
+        <tr valign="top">
+          <td><em>hid_t </em><code>ocpypl_id</code>
+              </td><td>    </td>
+          <td>IN: Object copy property list identifier
+              </td></tr>
+        <tr valign="top">
+          <td><em><a href="RM_H5O.html#Object-McdtSearchCb_t">H5O_mcdt_search_cb_t</a> </em><code>func</code>
+              </td><td> </td>
+          <td>IN: User-defined callback function
+              </td></tr>
+        <tr valign="top">
+          <td><em>void *</em><code>op_data</code>
+              </td><td> </td>
+          <td>IN: User-defined input data for the callback function
+              </td></tr>
+    </table>
+
+  <p>
+  <dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful;
+        otherwise returns a negative value.
+
+  <p>
+  <dt><strong>Failure Modes:</strong>
+    <dd><code>H5Pset_mcdt_search_cb</code> will fail 
+        if the object copy property list is invalid.
+
+  <p>
+  <dt><strong>Example Usage:</strong>
+    <dd>This example defines a callback function in the object copy property list.
+        <dir><pre>
+/* The user-defined callback function */
+static H5O_mcdt_search_ret_t
+mcdt_search_cb(void *_udata)
+{
+    H5O_mcdt_search_ret_t action = *((H5O_mcdt_search_ret_t *)_udata);
+
+    return(action);
+}
+
+int main(void) {
+    hid_t ocpypl_id = H5Pcreate(H5P_OBJECT_COPY);
+
+    /* Enable the merging committed datatype feature. */
+    H5Pset_copy_object(ocpypl_id, H5O_COPY_MERGE_COMMITTED_DTYPE_FLAG);
+
+    /* Add a path to search for a matching committed datatype. */
+    H5Padd_merge_committed_dtype_path(ocpypl_id, "/group/committed_dtypeA");
+
+    /* 
+     * Set the callback function to discontinue the global search
+     * if H5Ocopy cannot find a matching committed datatype from the 
+     * above suggested path.
+     */
+    action = H5O_MCDT_SEARCH_STOP;
+    H5Pset_mcdt_search_cb(ocpypl_id, mcdt_search_cb, &action);
+    H5Ocopy(...ocpypl_id...);
+    ...
+    ...
+}
+</pre></dir>
+
+  <p>
+  <dt><strong>See Also:</strong>
+    <dd><table width="90%">
+          <tr valign="top">
+              <td width="46%">
+                  <a href="RM_H5O.html#Object-Copy"><code>H5Ocopy</code></a>
+                  <br>
+                  <a href="RM_H5P.html#Property-SetCopyObject">
+                  <code>H5Pset_copy_object</code></a>
+              </td><td width="4%"> </td><td width="46%">
+<!--
+                  <a href="RM_H5P.html#Property-SetMcdtSearchCb">
+                  <code>H5Pset_mcdt_search_cb</code></a>
+                  <br>
+                  <a href="RM_H5P.html#Property-FreeMergeCommittedDtypePaths">
+                  <code>H5Pfree_merge_committed_dtype_paths</code></a>
+                  <br>
+-->
+                  <a href="RM_H5P.html#Property-AddMergeCommittedDtypePath">
+                  <code>H5Padd_merge_committed_dtype_path</code></a>
+                  <br>
+                  <a href="RM_H5P.html#Property-GetMcdtSearchCb">
+                  <code>H5Pget_mcdt_search_cb</code></a>
+                  <br>
+                  <a href="RM_H5O.html#Object-McdtSearchCb_t">
+                  <code>H5O_mcdt_search_cb_t</code></a>
+          </tr>
+        </table>
+
+  <p>
+  <dt><strong>History:</strong>
+    <dd><table width="90%">
+        <tr>
+          <td valign="top" align="left" width="10%">
+            <strong>Release</strong>    </td>
+          <td valign="top" align="left">
+            <strong>Change</strong></td>
+        </tr>
+
+        <tr>
+          <td valign="top">*.**.**</td>
+          <td valign="top">
+            C function introduced in this release.</td>
+        </tr>
+        </table>
+</dl>
+
+
+
+<br /><hr />
+<br />
+<h1>H5Padd_merge_committed_dtype_path.htm</h1>
+<br />
+<hr />
+<br />
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * Copyright by The HDF Group.                                               *
+  * Copyright by the Board of Trustees of the University of Illinois.         *
+  * All rights reserved.                                                      *
+  *                                                                           *
+  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+  * terms governing use, modification, and redistribution, is contained in    *
+  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+  * of the source code distribution tree; Copyright.html can be found at the  *
+  * root level of an installed copy of the electronic HDF5 document set and   *
+  * is linked from the top-level documents page.  It can also be found at     *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
+  * access to either file, you may request a copy from help at hdfgroup.org.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Padd_merge_committed_dtype_path" -->
+<hr>
+<dl>
+
+  <dt><div align=right><font color=999999 size=-1><i>
+      Last modified: 14 March 2012 
+      </i></font></div>
+
+  <dt><strong>Name:</strong> <a name="Property-AddMergeCommittedDtypePath">H5Padd_merge_committed_dtype_path</a>
+
+  <dt><strong>Signature:</strong>
+    <dd><em>herr_t </em><code>H5Padd_merge_committed_dtype_path</code>(
+            <em>hid_t </em><code>ocpypl_id</code>,
+            <em>char *</em><code>path</code>
+        )
+
+  <p>
+  <dt><strong>Purpose:</strong>
+    <dd>Adds a path to the list of paths that will be be searched in the 
+        destination file for a matching committed datatype.
+
+  <p>
+  <dt><strong>Motivation:</strong>
+    <dd><code>H5Padd_merge_committed_dtype_path</code> 
+        provides a means to override the default behavior of
+        <a href="RM_H5O.html#Object-Copy"><code>H5Ocopy</code></a> 
+        when <code>H5O_COPY_MERGE_COMMITTED_DTYPE_FLAG</code> is set in an
+        object copy property list.
+        <p>
+        <code>H5Padd_merge_committed_dtype_path</code> 
+        is the mechanism for suggesting search paths where
+        <a href="RM_H5O.html#Object-Copy"><code>H5Ocopy</code></a>
+        will look for a matching committed datatype.
+        This can be substantially faster than the default approach of
+        searching the entire destination file for a match.
+
+  <p>
+  <dt><strong>Description:</strong>
+    <dd><code>H5Padd_merge_committed_dtype_path</code> adds a path, 
+        <code>path</code>, which points to a committed datatype, to the current
+        list of suggested paths stored in the object copy property list 
+        <code>ocpypl_id</code>.
+        The search as described in the next paragraph is effective only if 
+        the <code>H5O_COPY_MERGE_COMMITTED_DTYPE_FLAG</code> is enabled
+        in the object copy property list via 
+        <a href="RM_H5P.html#Property-SetCopyObject">
+        <code>H5Pset_copy_object</code></a>.
+        <p>
+        When copying a committed datatype, a dataset with a committed datatype, 
+        or an object with an attribute of a committed datatype, the default
+        behavior of
+        <a href="RM_H5O.html#Object-Copy"><code>H5Ocopy</code></a>
+        is to search for a matching committed datatype:
+        <ol>
+          <li>First search the list of suggested paths in the 
+              object copy property list.
+          <li>Then, if no match has been found, search all the 
+              committed datatypes in the destination file.
+        </ol>
+        <p>
+        The default Step 2 in this search process can changed by 
+        setting a callback function 
+        (see <a href="RM_H5P.html#Property-SetMcdtSearchCb">
+        <code>H5Pset_mcdt_search_cb</code></a>).
+        <p>
+        Two datatypes are determined equal if their descriptions are identical,
+        in a manner similar to
+        <a href="RM_H5T.html#Datatype-Equal"><code>H5Tequal</code></a>.
+        If either committed datatype has one or more attributes,
+        then all attributes must be present in both committed datatypes
+        and they must be identical.  
+        Two attributes are considered identical if their datatype
+        description, dataspace, and raw data values are the same.
+        However, if an attribute uses a committed datatype, that committed 
+        datatype’s attributes will not be compared.
+        <p>
+        If a match is found, 
+        <a href="RM_H5O.html#Object-Copy"><code>H5Ocopy</code></a>
+        will perform the following in the destination file:
+        <ul>
+          <li>For a committed datatype, the library will create a hard link to 
+              the found datatype.
+          <li>For a dataset that uses a committed datatype, the library 
+              will modify the copied dataset to use the found committed 
+              datatype as its datatype.
+          <li>For an object with an attribute of a committed datatype, 
+              the library will modify the copied object’s attribute to 
+              use the found committed datatype as its datatype.
+        </ul>
+        <p>
+        If no match is found,
+        <a href="RM_H5O.html#Object-Copy"><code>H5Ocopy</code></a>
+        will perform the following in the destination file:
+        <ul>
+          <li>For a committed datatype, the library will copy it
+              as it would any other object, creating a 
+              named committed datatype at the destination.
+              That is, the library will create a committed datatype that is 
+              accessible in the file by a unique path.
+          <li>For a dataset that uses a committed datatype, the library 
+              will copy the datatype as an anonymous committed datatype 
+              and use that as the dataset’s datatype.
+          <li>For an object with an attribute of a committed datatype, 
+              the library will copy the datatype as 
+              an anonymous committed datatype 
+              and use that as the attribute’s datatype.
+        </ul>
+
+  <p>
+  <dt><strong>Parameters:</strong>
+    <dd>
+    <table>
+      <tr valign="top">
+        <td><em>hid_t </em><code>ocpypl_id</code>
+            </td><td>    </td>
+        <td>IN: Object copy property list identifier.
+            </td></tr>
+      <tr valign="top">
+        <td><em>char *</em><code>path</code>
+            </td><td> </td>
+        <td>IN: The path to be added.
+            </td></tr>
+    </table>
+
+
+  <p>
+  <dt><strong>Returns:</strong>
+
+    <dd>Returns a non-negative value if successful;
+        otherwise returns a negative value.
+
+  <p>
+  <dt><strong>Failure Modes:</strong>
+    <dd><code>H5Padd_merge_committed_dtype_path</code> will fail if the 
+        object copy property list is invalid.
+        <p>
+        It will also fail if there is insufficient memory when 
+        duplicating <code>path</code>.
+
+  <p>
+  <dt><strong>Example Usage:</strong>
+    <dd>This example adds two paths to the object copy property list.
+        <code>H5Ocopy</code> will search the two suggested paths for a match
+        before searching all the committed datatypes in the 
+        destination file.
+        <dir><pre>
+
+int main(void) {
+    hid_t ocpypl_id = H5Pcreate(H5P_OBJECT_COPY);
+
+    /* Enable the merging committed datatype feature */
+    H5Pset_copy_object(ocpypl_id, H5O_COPY_MERGE_COMMITTED_DTYPE_FLAG);
+
+    /* Add a path to a committed datatype */
+    H5Padd_merge_committed_dtype_path(ocpypl_id, "/group/committed_dtypeA");
+
+    /* Add a path to a dataset with committed datatype */
+    H5Padd_merge_committed_dtype_path(ocpypl_id, "/group2/committed_dset");
+    
+    /* Does the copy */
+    H5Ocopy(...ocpypl_id...);
+    ...
+    ...
+}
+        </pre></dir>
+
+  <p>
+  <dt><strong>See Also:</strong>
+    <dd><table width="90%">
+          <tr valign="top">
+              <td width="46%">
+                  <a href="RM_H5O.html#Object-Copy"><code>H5Ocopy</code></a>
+                  <br>
+                  <a href="RM_H5P.html#Property-SetCopyObject">
+                  <code>H5Pset_copy_object</code></a>
+<!--
+                  <br>
+                  <a href="RM_H5P.html#Property-AddMergeCommittedDtypePath">
+                  <code>H5Padd_merge_committed_dtype_path</code></a>
+-->
+              </td><td width="4%"> </td><td width="46%">
+                  <a href="RM_H5P.html#Property-SetMcdtSearchCb">
+                  <code>H5Pset_mcdt_search_cb</code></a>
+                  <br>
+                  <a href="RM_H5P.html#Property-FreeMergeCommittedDtypePaths">
+                  <code>H5Pfree_merge_committed_dtype_paths</code></a>
+<!--
+                  <br>
+                  <a href="RM_H5P.html#Property-GetMcdtSearchCb">
+                  <code>H5Pget_mcdt_search_cb</code></a>
+                  <br>
+                  <a href="RM_H5O.html#Object-McdtSearchCb_t">
+                  <code>H5O_mcdt_search_cb_t</code></a>
+-->
+          </tr>
+        </table>
+
+  <p>
+  <dt><strong>History:</strong>
+    <dd><table width="90%">
+        <tr>
+          <td valign="top" align="left" width="10%">
+            <strong>Release</strong>    </td>
+          <td valign="top" align="left">
+            <strong>Change</strong></td>
+        </tr>
+        <tr>
+          <td valign="top">*.**.**</td>
+          <td valign="top">
+            C function introduced in this release.</td>
+        </tr>
+        </table>
+</dl>
+
+
+
+
+
+<br /><hr />
+<br />
+<h1>H5Pfree_merge_committed_dtype_paths.htm</h1>
+<br />
+<hr />
+<br />
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * Copyright by The HDF Group.                                               *
+  * Copyright by the Board of Trustees of the University of Illinois.         *
+  * All rights reserved.                                                      *
+  *                                                                           *
+  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+  * terms governing use, modification, and redistribution, is contained in    *
+  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+  * of the source code distribution tree; Copyright.html can be found at the  *
+  * root level of an installed copy of the electronic HDF5 document set and   *
+  * is linked from the top-level documents page.  It can also be found at     *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
+  * access to either file, you may request a copy from help at hdfgroup.org.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pfree_merge_committed_dtype_paths" -->
+<hr>
+<dl>
+
+  <dt><div align=right><font color=999999 size=-1><i>
+      Last modified: 14 March 2012 
+      </i></font></div>
+
+  <dt><strong>Name:</strong> <a name="Property-FreeMergeCommittedDtypePaths">H5Pfree_merge_committed_dtype_paths</a>
+
+  <dt><strong>Signature:</strong>
+    <dd><em>herr_t </em><code>H5Pfree_merge_committed_dtype_paths</code>(
+            <em>hid_t </em><code>ocpypl_id</code>
+        )
+
+  <p>
+  <dt><strong>Purpose:</strong>
+    <dd>Clears the list of paths stored in the object copy
+        property list <code>ocpypl_id</code>.
+        These are the suggested paths previously set with
+        <a href="RM_H5P.html#Property-AddMergeCommittedDtypePath">
+        <code>H5Padd_merge_committed_dtype_path</code></a>.
+
+  <p>
+  <dt><strong>Description:</strong>
+    <dd><code>H5Pfree_merge_committed_dtype_paths</code> clears the 
+        suggested paths stored in the object copy property list 
+        <code>ocpypl_id</code>.
+
+  <p>
+  <dt><strong>Parameters:</strong>
+    <dd>
+    <table>
+      <tr valign="top">
+        <td><em>hid_t </em><code>ocpypl_id</code>
+            </td><td>    </td>
+        <td>IN: Object copy property list identifier.
+            </td></tr>
+    </table>
+
+  <p>
+  <dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful;
+        otherwise returns a negative value.
+
+  <p>
+  <dt><strong>Failure Modes:</strong>
+    <dd><code>H5Pfree_merge_committed_dtype_paths</code> will fail if the 
+        object copy property list is invalid.
+
+  <p>
+  <dt><strong>Example Usage:</strong>
+    <dd>This example adds a suggested path to the object copy property
+        list, does the copy, clears the list, and then adds a new suggested
+        path to the list for another copy.
+
+        <dir><pre>
+int main(void) {
+    hid_t ocpypl_id = H5Pcreate(H5P_OBJECT_COPY);
+
+    /* Enable the merging committed datatype feature. */
+    H5Pset_copy_object(ocpypl_id, H5O_COPY_MERGE_COMMITTED_DTYPE_FLAG);
+
+    /* Add a path to search for a matching committed datatype. */
+    H5Padd_merge_committed_dtype_path(ocpypl_id, "/group/committed_dtypeA");
+
+    /* Do the copy. */
+    H5Ocopy(...ocpypl_id...);
+    ...
+    ...
+    /* Free the previous suggested path. */
+    H5Pfree_merge_committed_dtype_paths(ocpypl_id);
+
+    /* Add a path to search for a matching committed datatype. */
+    H5Padd_merge_committed_dtype_path(ocpypl_id, "/group2/committed_dtypeB");
+
+    /* Do the copy. */
+    H5Ocopy(...ocpypl_id...);
+    ...
+    ...
+}
+</pre></dir>
+
+  <p>
+  <dt><strong>See Also:</strong>
+    <dd><table width="90%">
+          <tr valign="top">
+              <td width="46%">
+                  <a href="RM_H5O.html#Object-Copy"><code>H5Ocopy</code></a>
+                  <br>
+                  <a href="RM_H5P.html#Property-SetCopyObject">
+                  <code>H5Pset_copy_object</code></a>
+              </td><td width="4%"> </td><td width="46%">
+                  <a href="RM_H5P.html#Property-SetMcdtSearchCb">
+                  <code>H5Pset_mcdt_search_cb</code></a>
+                  <br>
+<!--
+                  <a href="RM_H5P.html#Property-FreeMergeCommittedDtypePaths">
+                  <code>H5Pfree_merge_committed_dtype_paths</code></a>
+                  <br>
+-->
+                  <a href="RM_H5P.html#Property-AddMergeCommittedDtypePath">
+                  <code>H5Padd_merge_committed_dtype_path</code></a>
+<!--
+                  <br>
+                  <a href="RM_H5P.html#Property-GetMcdtSearchCb">
+                  <code>H5Pget_mcdt_search_cb</code></a>
+                  <br>
+                  <a href="RM_H5O.html#Object-McdtSearchCb_t">
+                  <code>H5O_mcdt_search_cb_t</code></a>
+-->
+          </tr>
+        </table>
+
+  <p>
+  <dt><strong>History:</strong>
+    <dd><table>
+        <tr>
+          <td valign="top" align="left" width="10%">
+            <strong>Release</strong>    </td>
+          <td valign="top" align="left">
+            <strong>Change</strong></td>
+        </tr>
+        <tr>
+          <td valign="top">*.**.**</td>
+          <td valign="top">
+            C function introduced in this release.</td>
+        </tr>
+        </table>
+
+</dl>
+
+
+
+
+
+<br /><hr />
+<br />
+<h1>H5O_mcdt_search_cb_t.htm</h1>
+<br />
+<hr />
+<br />
+
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * Copyright by The HDF Group.                                               *
+  * Copyright by the Board of Trustees of the University of Illinois.         *
+  * All rights reserved.                                                      *
+  *                                                                           *
+  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+  * terms governing use, modification, and redistribution, is contained in    *
+  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+  * of the source code distribution tree; Copyright.html can be found at the  *
+  * root level of an installed copy of the electronic HDF5 document set and   *
+  * is linked from the top-level documents page.  It can also be found at     *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
+  * access to either file, you may request a copy from help at hdfgroup.org.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5O_mcdt_search_cb_t" -->
+<hr>
+<dl>
+
+<p><i><font color="red">
+      Current plan: Place this entry in H5O/ and publish it on the H5O RM page.
+      Links to it will be to the entry within the H5O page rather than to the 
+      free-standing entry.
+      It could be published adjacent to <code>H5Pset_mcdt_search_cb</code>, 
+      but that breaks standard practice and would probably be more confusing.
+</font></i>
+
+  <dt><div align=right><font color=999999 size=-1><i>
+      Last modified: 14 March 2012
+      </i></font></div>
+
+  <dt><strong>Name:</strong> <a name="Object-McdtSearchCb_t">H5O_mcdt_search_cb_t</a>
+
+  <dt><strong>Signature:</strong>
+    <dd><code>typedef</code> <em>H5O_mcdt_search_ret_t </em>(
+            <code>*H5O_mcdt_search_cb_t</code>
+            )(
+            <em>void *</em><code>op_data</code>
+            )
+
+  <p>
+  <dt><strong>Purpose:</strong>
+    <dd>Provides the mechanism by which a user application may set an action for
+        <a href="RM_H5O.html#Object-Copy"><code>H5Ocopy</code></a>
+        to take after checking all suggested paths for a matching committed datatype
+        but before starting the global search of the destination file. 
+
+  <p>
+  <dt><strong>Description:</strong>
+    <dd><code>H5O_mcdt_search_cb_t</code>
+        is the callback function that
+        <a href="RM_H5O.html#Object-Copy"><code>H5Ocopy</code></a>
+        will invoke if the callback is set and 
+        when the merge committed datatype feature is enabled
+        in the object copy property list (see 
+        <a href="RM_H5P.html#Property-SetCopyObject">
+        <code>H5Pset_copy_object</code></a>).
+        <p>
+        After searching the list of suggested committed datatype paths,
+        <a href="RM_H5O.html#Object-Copy"><code>H5Ocopy</code></a>
+        will invoke this callback before searching all committed datatypes
+        in the destination file. This allows a user application
+        to add a customized step to the search process.
+        The callback function is set with 
+        <a href="RM_H5P.html#Property-SetMcdtSearchCb">
+        <code>H5Pset_mcdt_search_cb</code></a>
+        and the search process is described in 
+        <a href="RM_H5P.html#Property-AddMergeCommittedDtypePath">
+        <code>H5Padd_merge_committed_dtype_path</code></a>.
+        <p>
+        Valid return values from this callback function are as follows
+        (defined in the enumerated datatype 
+        <code>H5O_mcdt_search_ret_t</code> in <code>H5Opublic.h</code>):
+        <table width="85%" align="center">
+          <tr><td valign="top">
+              <code>H5O_MCDT_SEARCH_ERROR</code>
+              </td><td>    </td><td valign="top">
+                  Aborts <code>H5Ocopy</code>. 
+              </td>
+          </tr><tr><td valign="top">
+                  <code>H5O_MCDT_SEARCH_CONT</code>
+              </td><td> </td><td valign="top">
+                  Continues the global search of all committed datatypes 
+                  in the destination file. 
+              </td>
+          </tr><tr><td valign="top">
+                  <code>H5O_MCDT_SEARCH_STOP<code>
+              </td><td> </td><td valign="top">
+                  Stops the search, but continues copying.
+              </td>
+          </tr>
+        </table>
+
+
+  <p>
+  <dt><strong>Warning:</strong>
+    <dd>If the callback’s return value is 
+        <code>H5O_MCDT_SEARCH_ERROR</code>, <code>H5Ocopy</code> 
+        will abort and the destination file may be left in an 
+        inconsistent or corrupted state.
+
+  <p>
+  <dt><strong>Parameters:</strong>
+    <dd>
+    <table>
+      <tr valign="top">
+        <td><em>void *</em><code>op_data</code>
+            </td><td> </td>
+        <td>IN/OUT: Pointer to user-defined input data. This is a pass-through
+            of the data that was passed to 
+            <a href="RM_H5P.html#Property-SetMcdtSearchCb">
+            <code>H5Pset_mcdt_search_cb</code></a>.
+            </td></tr>
+    </table>
+
+  <p>
+  <dt><strong>Returns:</strong>
+    <dd>Returns one of the <code>H5O_MCDT_SEARCH_*</code> values described above.
+  <p>
+  <dt><strong>Failure Modes:</strong>
+    <dd><code>H5O_mcdt_search_cb_t</code> failure modes are dependent on the
+        implementation of the callback function.
+
+  <p>
+  <dt><strong>Example Usage:</strong>
+    <dd>This example defines a callback function in the object copy property 
+        list to discontinue the global search if a matching committed datatype 
+        cannot be found among the suggested paths.
+
+        <dir><pre>
+/* The user-defined callback function */
+static H5O_mcdt_search_ret_t
+mcdt_search_cb(void *_udata)
+{
+    H5O_mcdt_search_ret_t action = *((H5O_mcdt_search_ret_t *)_udata);
+
+    return(action);
+}
+
+int main(void) {
+    hid_t ocpypl_id = H5Pcreate(H5P_OBJECT_COPY);
+
+    /* Enable the merging committed datatype feature. */
+    H5Pset_copy_object(ocpypl_id, H5O_COPY_MERGE_COMMITTED_DTYPE_FLAG);
+
+    /* Add the path to search for a matching committed datatype. */
+    H5Padd_merge_committed_dtype_path(ocpypl_id, "/group/committed_dtypeA");
+
+    /*
+     * Set the callback function to discontinue the global search
+     * if H5Ocopy cannot find a matching committed datatype from the
+     * above suggested path.
+     */
+    action = H5O_MCDT_SEARCH_STOP;
+    H5Pset_mcdt_search_cb(ocpypl_id, mcdt_search_cb, &action);
+
+    /* Do the copy. */
+    H5Ocopy(...ocpypl_id...);
+    ...
+    ...
+}
+        </pre></dir>
+
+<!--__ *** FORTRAN90 INTERFACE  **********************************  -->
+<!--__ When the Fortran90 interface is complete, replace this       -->
+<!--__ section with the Fortran90 subroutine description.           -->
+<!--__                                                              -->
+<!--__ See the file h5fortran_f_insert.htm for a template and       -->
+<!--__ instructions.                                                -->
+<!--__ ***********************************************************  -->
+
+  <p>
+  <dt><strong>See Also:</strong>
+    <dd><table width="90%">
+          <tr valign="top">
+              <td width="46%">
+                  <a href="RM_H5O.html#Object-Copy"><code>H5Ocopy</code></a>
+                  <br>
+                  <a href="RM_H5P.html#Property-SetCopyObject">
+                  <code>H5Pset_copy_object</code></a>
+              </td><td width="4%"> </td><td width="46%">
+                  <a href="RM_H5P.html#Property-SetMcdtSearchCb">
+                  <code>H5Pset_mcdt_search_cb</code></a>
+                  <br>
+<!--
+                  <a href="RM_H5P.html#Property-FreeMergeCommittedDtypePaths">
+                  <code>H5Pfree_merge_committed_dtype_paths</code></a>
+                  <br>
+                  <a href="RM_H5P.html#Property-AddMergeCommittedDtypePath">
+                  <code>H5Padd_merge_committed_dtype_path</code></a>
+                  <br>
+-->
+                  <a href="RM_H5P.html#Property-GetMcdtSearchCb">
+                  <code>H5Pget_mcdt_search_cb</code></a>
+<!--
+                  <br>
+                  <a href="RM_H5O.html#Object-McdtSearchCb_t">
+                  <code>H5O_mcdt_search_cb_t</code></a>
+-->
+          </tr>
+        </table>
+
+  <p>
+  <dt><strong>History:</strong>
+    <dd><table width="90%">
+        <tr>
+          <td valign="top" align="left" width="10%">
+            <strong>Release</strong>    </td>
+          <td valign="top" align="left">
+            <strong>Change</strong></td>
+        </tr>
+
+        <tr>
+          <td valign="top">*.**.**</td>
+          <td valign="top">
+            C function type introduced in this release.</td>
+        </tr>
+
+        </tr>
+        </table>
+</dl>
+
+
+
+
+<br /><hr />
+<br />
+<h1>H5Ocopy.htm</h1>
+<br />
+<hr />
+<br />
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * Copyright by The HDF Group.                                               *
+  * Copyright by the Board of Trustees of the University of Illinois.         *
+  * All rights reserved.                                                      *
+  *                                                                           *
+  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+  * terms governing use, modification, and redistribution, is contained in    *
+  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+  * of the source code distribution tree; Copyright.html can be found at the  *
+  * root level of an installed copy of the electronic HDF5 document set and   *
+  * is linked from the top-level documents page.  It can also be found at     *
+  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * access to either file, you may request a copy from help at hdfgroup.org.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Ocopy" -->
+<hr>
+<dl>
+
+  <dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 14 March 2012
+    </i></font></div>
+
+  <dt><strong>Name:</strong> <a name="Object-Copy">H5Ocopy</a>
+  <dt><strong>Signature:</strong>
+    <dd><em>herr_t </em><code>H5Ocopy</code>(
+            <em>hid_t </em><code>src_loc_id</code>,
+            <em>const char *</em><code>src_name</code>,
+            <em>hid_t </em><code>dst_loc_id</code>,
+            <em>const char *</em><code>dst_name</code>,
+            <em>hid_t </em><code>ocpypl_id</code>,
+            <em>hid_t </em><code>lcpl_id</code>
+        )
+  <p>
+  <dt><strong>Purpose:</strong>
+    <dd>Copies an object in an HDF5 file.
+
+  <p>
+  <dt><strong>Description:</strong>
+    <dd><code>H5Ocopy</code> copies the group, dataset or committed datatype
+      specified by <code>src_name</code> 
+      from the file or group specified by <code>src_loc_id</code> 
+      to the destination location <code>dst_loc_id</code>.
+      <p>
+      The destination location, as specified in <code>dst_loc_id</code>,
+      may be a group in the current file or a location in a different file.
+      If <code>dst_loc_id</code> is a file identifier, the copy will
+      be placed in that file’s root group.
+      <p>
+      The new copy will be created with the name <code>dst_name</code>. 
+      <code>dst_name</code> must not pre-exist in the destination location;
+      if <code>dst_name</code> already exists at the location
+      <code>dst_loc_id</code>, <code>H5Ocopy</code> will fail.
+      <p>
+      The new copy of the object is created with the creation property lists
+      specified by <code>ocpypl_id</code> and <code>lcpl_id</code>.
+      <p>
+      <code>H5Ocopy</code> will always try to make a copy of the object
+      specified in <code>src_name</code>.
+      <ul>
+          <li>If the <i>object</i> specified by <code>src_name</code> is a 
+              group containing a soft or external link, 
+              the default is that the new copy will contain a 
+              soft or external link with the same value as the original. 
+              See <a href="RM_H5P.html#Property-SetCopyObject">
+              <code>H5Pset_copy_object</code></a> for optional settings.
+          <li>If the <i>path</i> specified in <code>src_name</code> 
+              is or contains a soft link or an external link,
+              <code>H5Ocopy</code> will copy the target object.  
+              Use <a href="RM_H5L.html#Link-Copy"><code>H5Lcopy</code></a> 
+              if the intent is to create a new soft or external link 
+              with the same value as the original link.
+      </ul>
+      <p>
+      Several flags are available to govern the behavior of 
+      <code>H5Ocopy</code>:
+      <ul>
+          <li>A flag controlling the creation of intermediate groups 
+              that may not yet exist is set in the link creation property list
+              <code>lcpl_id</code> with
+              <a href="RM_H5P.html#Property-SetCreateIntermediateGroup">
+              <code>H5Pset_create_intermediate_group</code></a>.
+          <li>Copying of committed datatypes can be tuned through the use of
+              <a href="RM_H5P.html#Property-SetCopyObject">
+              <code>H5Pset_copy_object</code></a>,
+              <a href="RM_H5P.html#Property-AddMergeCommittedDtypePath">
+              <code>H5Padd_merge_committed_dtype_path</code></a>,
+              <a href="RM_H5P.html#Property-SetMcdtSearchCb">
+              <code>H5Pset_mcdt_search_cb</code></a>,
+              and related functions.
+          <li>Flags controlling other aspects of object copying are set in 
+              the object copy property list <code>ocpypl_id</code> with 
+              <a href="RM_H5P.html#Property-SetCopyObject">
+              <code>H5Pset_copy_object</code></a>. 
+      </ul>
+
+  <p>
+  <dt><strong>Parameters:</strong>
+    <ul><table>
+      <tr>
+        <td valign="top"><em>hid_t </em><code>src_loc_id</code>
+        </td>
+        <td valign="top">IN: Object identifier indicating the
+            location of the source object to be copied
+        </td></tr>
+      <tr>
+        <td valign="top"><em>const char *</em><code>src_name</code>
+        </td>
+        <td valign="top">IN: Name of the source object to be copied
+        </td></tr>
+      <tr>
+        <td valign="top"><em>hid_t </em><code>dst_loc_id</code>
+        </td>
+        <td valign="top">IN: Location identifier specifying the destination
+        </td></tr>
+      <tr>
+        <td valign="top"><em>const char *</em><code>dst_name    </code>
+        </td>
+        <td valign="top">IN: Name to be assigned to the new copy
+        </td></tr>
+      <tr>
+        <td valign="top"><em>hid_t </em><code>ocpypl_id</code>
+        </td>
+        <td valign="top">IN: Object copy property list
+        </td></tr>
+      <tr>
+        <td valign="top"><em>hid_t </em><code>lcpl_id</code>
+        </td>
+        <td valign="top">IN: Link creation property list for the new hard link 
+        </td></tr>
+    </table></ul>
+
+  <p>
+  <dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful;
+        otherwise returns a negative value.
+
+  <p>
+  <dt><strong>See Also:</strong>
+    <dd><table width="100%" border="0">
+          <tr><td width="4%"> </td><td width="46%" valign="top" align="left">
+              <a href="RM_H5P.html#Property-SetCopyObject">
+              <code>H5Pset_copy_object</code></a> 
+              <br>
+              <a href="RM_H5P.html#Property-SetCreateIntermediateGroup">
+              <code>H5Pset_create_intermediate_group</code></a>
+          </td><td width="4%"> </td><td width="46%" valign="top" align="left">
+              <a href="RM_H5P.html#Property-AddMergeCommittedDtypePath">
+              <code>H5Padd_merge_committed_dtype_path</code></a>
+              <br>
+              <a href="RM_H5P.html#Property-SetMcdtSearchCb">
+              <code>H5Pset_mcdt_search_cb</code></a>
+          </td></tr>
+        </table>
+
+  <p>
+  <dt><strong>Fortran90 Interface:</strong> <!--h5ocopy_f-->
+    <dd>
+      None.
+<!--
+    <pre>
+    </pre>
+-->
+
+<p>
+<dt><strong>History:</strong>
+    <ul><table width="90%">
+        <tr>
+          <td valign="top" align="left" width="10%">
+            <strong>Release</strong>    </td>
+          <td valign="top" align="left">
+            <strong>C</strong></td></tr>
+        <tr>
+          <td valign="top">1.8.0</td>
+          <td valign="top">
+            Function introduced in this release.</td></tr>
+    </table></ul>
+</dl>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</html>
\ No newline at end of file
diff --git a/html/Advanced/CommittedDatatypeCopying/TimeEstimateNotes_120316.txt b/html/Advanced/CommittedDatatypeCopying/TimeEstimateNotes_120316.txt
new file mode 100644
index 0000000..93652d4
--- /dev/null
+++ b/html/Advanced/CommittedDatatypeCopying/TimeEstimateNotes_120316.txt
@@ -0,0 +1,30 @@
+Time Estimate for Committed Datatypes Copying
+
+This estimate is for changes that need to be done to the HDF5 User's Guide.
+
+Location: The problem behavior comes about when an object that uses a 
+committed datatype is copied. We do not currently have a chapter in the UG 
+for the object interface, H5O. If we did have such a chapter, then we 
+would put this new documentation in that chapter. Until we have a chapter 
+for H5O, we will put this in the "Advanced Topics" and "Additional Resources" 
+pages. We will also add a cross reference to this documentation from the 
+"Datatypes" chapter.
+
+Purpose: This topic will describe the behavior of committed datatypes when 
+an object that uses the committed datatype is copied and will describe how 
+to work around the behavior.
+
+Output Format: PDF
+
+Tasks:
+    _ Add cross reference to "Datatypes" chapter pointing to the "Advanced Topics"
+      page. 1h
+    _ Add to "Advanced Topics" and "Additional Resources" pages a link and brief 
+      description to the PDF that holds this doc. 1-2h
+    _ Create the PDF using Word. 
+        _ Talk with FB to learn about the APIs. 2h
+        _ Edit RFC. 16h (This is probably high, but I'm not sure how detailed
+          the doc will need to be and how long it will take me to add that 
+          level of detail). 
+    _ Develop this estimate: I have spent 2.8h so far.
+    _ Total time: 23-24h
diff --git a/html/Advanced/DirectChunkWrite/Using Direct Chunk Write 130227.docx b/html/Advanced/DirectChunkWrite/Using Direct Chunk Write 130227.docx
index 482df6a..fa47408 100644
Binary files a/html/Advanced/DirectChunkWrite/Using Direct Chunk Write 130227.docx and b/html/Advanced/DirectChunkWrite/Using Direct Chunk Write 130227.docx differ
diff --git a/html/Advanced/DirectChunkWrite/index.html b/html/Advanced/DirectChunkWrite/index.html
index bf0c89c..00343ef 100644
--- a/html/Advanced/DirectChunkWrite/index.html
+++ b/html/Advanced/DirectChunkWrite/index.html
@@ -80,7 +80,7 @@ The following documents describe the use of this feature:
 
 <hr>
 
-<?php include("../../ed_libs/Footer3.htm"); ?>
+<?php include("../../ed_libs/Footer-THGonly3.htm"); ?>
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
diff --git a/html/Advanced/DynamicallyLoadedFilters/Design-HDF5-Programmatic_Control_of_Dynamic_Plugins.docx b/html/Advanced/DynamicallyLoadedFilters/Design-HDF5-Programmatic_Control_of_Dynamic_Plugins.docx
new file mode 100644
index 0000000..c9b8f48
Binary files /dev/null and b/html/Advanced/DynamicallyLoadedFilters/Design-HDF5-Programmatic_Control_of_Dynamic_Plugins.docx differ
diff --git a/html/Advanced/DynamicallyLoadedFilters/HDF5DynamicallyLoadedFilters_130521.docx b/html/Advanced/DynamicallyLoadedFilters/HDF5DynamicallyLoadedFilters_130521.docx
new file mode 100644
index 0000000..3df5b58
Binary files /dev/null and b/html/Advanced/DynamicallyLoadedFilters/HDF5DynamicallyLoadedFilters_130521.docx differ
diff --git a/html/Advanced/DynamicallyLoadedFilters/HDF5_Dynamic_Plugin_Programatic_Control(Preliminary).docx b/html/Advanced/DynamicallyLoadedFilters/HDF5_Dynamic_Plugin_Programatic_Control(Preliminary).docx
new file mode 100644
index 0000000..0868f93
Binary files /dev/null and b/html/Advanced/DynamicallyLoadedFilters/HDF5_Dynamic_Plugin_Programatic_Control(Preliminary).docx differ
diff --git a/html/Advanced/DynamicallyLoadedFilters/index.html b/html/Advanced/DynamicallyLoadedFilters/index.html
index dad6e83..608ade6 100644
--- a/html/Advanced/DynamicallyLoadedFilters/index.html
+++ b/html/Advanced/DynamicallyLoadedFilters/index.html
@@ -1,6 +1,6 @@
 <html>
 <head>
-<title> UTF-8 in HDF5</title>
+<title> Dynamic Plugins in HDF5</title>
 </head>
 
 <body>
@@ -86,7 +86,7 @@ Return to “<a href="../../Advanced.html">Advanced Topics</a>.”</p>
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 28 August 2015");
+document.writeln("Last modified: 17 December 2015");
 -->
 </SCRIPT>
  
diff --git a/html/Advanced/FileFreeSpace/FileSpaceManagement.docx b/html/Advanced/FileFreeSpace/FileSpaceManagement.docx
new file mode 100644
index 0000000..8875ef1
Binary files /dev/null and b/html/Advanced/FileFreeSpace/FileSpaceManagement.docx differ
diff --git a/html/Advanced/FileImageOperations/load_core_file_driver_from_image_RFC_v17.docx b/html/Advanced/FileImageOperations/load_core_file_driver_from_image_RFC_v17.docx
new file mode 100644
index 0000000..8d0ebd7
Binary files /dev/null and b/html/Advanced/FileImageOperations/load_core_file_driver_from_image_RFC_v17.docx differ
diff --git a/html/Advanced/FileImageOperations/load_core_file_driver_from_image_RFC_v18.docx b/html/Advanced/FileImageOperations/load_core_file_driver_from_image_RFC_v18.docx
new file mode 100644
index 0000000..5ab0df5
Binary files /dev/null and b/html/Advanced/FileImageOperations/load_core_file_driver_from_image_RFC_v18.docx differ
diff --git a/html/Advanced/FileSpaceManagement/FileSpaceManagement.docx b/html/Advanced/FileSpaceManagement/FileSpaceManagement.docx
new file mode 100644
index 0000000..8875ef1
Binary files /dev/null and b/html/Advanced/FileSpaceManagement/FileSpaceManagement.docx differ
diff --git a/html/Advanced/FileSpaceManagement/FileSpaceManagement_120425.docx b/html/Advanced/FileSpaceManagement/FileSpaceManagement_120425.docx
new file mode 100644
index 0000000..b3e3b76
Binary files /dev/null and b/html/Advanced/FileSpaceManagement/FileSpaceManagement_120425.docx differ
diff --git a/html/Advanced/FreeingMemory/FreeingMemoryAllocatedByTheHdf5Library.docx b/html/Advanced/FreeingMemory/FreeingMemoryAllocatedByTheHdf5Library.docx
new file mode 100644
index 0000000..965a5b0
Binary files /dev/null and b/html/Advanced/FreeingMemory/FreeingMemoryAllocatedByTheHdf5Library.docx differ
diff --git a/html/Advanced/HDF5_Metadata/index.html b/html/Advanced/HDF5_Metadata/index.html
index 38dc43f..669027b 100644
--- a/html/Advanced/HDF5_Metadata/index.html
+++ b/html/Advanced/HDF5_Metadata/index.html
@@ -24,7 +24,7 @@
  -->
 
 <!-- This file provides a reasonably complete description of HDF5 metadata.  -->
-<!-- If a brief overview can be found in the file _topics/metadata.htm,      -->
+<!-- A brief overview can be found in the file _topics/metadata.htm,         -->
 <!-- which is designed for PHP-inclusion in running text.                    -->
 
 <br />
@@ -574,7 +574,7 @@ Return to “<a href="../../Advanced.html">Advanced Topics</a>.”</p>
 
 <hr>
 
-<?php include("../../ed_libs/Footer3.htm"); ?>
+<?php include("../../ed_libs/Footer-THGonly3.htm"); ?>
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
diff --git a/html/Advanced/UsingIdentifiers/index.html b/html/Advanced/UsingIdentifiers/index.html
index 3d52890..b7858db 100644
--- a/html/Advanced/UsingIdentifiers/index.html
+++ b/html/Advanced/UsingIdentifiers/index.html
@@ -165,7 +165,7 @@
 
 <hr>
 
-<?php include("../../ed_libs/Footer3.htm"); ?>
+<?php include("../../ed_libs/Footer-THGonly3.htm"); ?>
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
diff --git a/html/Advanced/UsingUnicode/index.html b/html/Advanced/UsingUnicode/index.html
index 81fa1de..eccd533 100644
--- a/html/Advanced/UsingUnicode/index.html
+++ b/html/Advanced/UsingUnicode/index.html
@@ -292,7 +292,7 @@ Return to “<a href="../../Advanced.html">Advanced Topics</a>.”</p>
 
 <hr>
 
-<?php include("../../ed_libs/Footer3.htm"); ?>
+<?php include("../../ed_libs/Footer-THGonly3.htm"); ?>
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
diff --git a/html/Advanced/UsingUnicode/index_FullQuestions.html b/html/Advanced/UsingUnicode/index_FullQuestions.html
new file mode 100644
index 0000000..8121bf4
--- /dev/null
+++ b/html/Advanced/UsingUnicode/index_FullQuestions.html
@@ -0,0 +1,314 @@
+<html>
+<head>
+<title> UTF-8 in HDF5</title>
+</head>
+
+<body>
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * Copyright by The HDF Group.                                               *
+  * Copyright by the Board of Trustees of the University of Illinois.         *
+  * All rights reserved.                                                      *
+  *                                                                           *
+  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+  * terms governing use, modification, and redistribution, is contained in    *
+  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+  * of the source code distribution tree; Copyright.html can be found at the  *
+  * root level of an installed copy of the electronic HDF5 document set and   *
+  * is linked from the top-level documents page.  It can also be found at     *
+  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * access to either file, you may request a copy from help at hdfgroup.org.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+<!-- This file provides a high-level description of the use of UTF-8 Unicode -->
+<!-- encodings in HDF5 applications.  The caveats section is incomplete at   -->
+<!-- time, but will be completed as time permits.                            -->
+
+<br />
+<p>
+Return to “<a href="../../Advanced.html">Advanced Topics</a>.”</p>
+<hr />
+
+
+
+<h1>Using UTF-8 Encoding in HDF5 Applications</h1>
+
+<h2>Introduction</h2>
+    <dir>
+
+    Text and character data are often discussed as though 
+    <i>text</i> means <i>ASCII text</i>.  We even go so far 
+    as to call a file containing only ASCII text a <i>plain text</i> file.
+    This works reasonably well for English (though better for 
+    American English than British English),
+    but what if that plain text file is in French, German, Chinese,
+    or any of several hundred other languages?
+    This document introduces the use of UTF-8 Unicode, 
+    a much more extensive and flexible character set 
+    that can faithfully represent any of those languages.
+
+    <p>
+    This document assumes a working familiarity with UTF-8 Unicode (UTF-8).  
+    Any reader who is unfamiliar with UTF-8 encoding should read the 
+    <a href="https://en.wikipedia.org/wiki/UTF-8">Wikipedia UTF-8 article</a>
+    (<code>https://en.wikipedia.org/wiki/UTF-8</code>) 
+    before proceeding; it provides an excellent primer.  
+    <p>
+    For our context, the most important UTF-8 concepts are:
+    <ul>
+      <li>Multi-byte and variable-size character encodings 
+      <li>Limitations of the ASCII character set 
+      <li>Risks associated with the use of the term <i>plain text</i>
+      <li>Representation of multiple language alphabets or characters 
+          in a single document 
+    </ul>
+    <p>
+    More specific technical details will only become important if they
+    affect the specifics of your application design or implementation.
+    </dir>
+
+
+    <p>
+<h2>How and Where May UTF-8 Be Used in HDF5?</h2>
+    <dir>
+
+    HDF5 uses characters in object names (which are actually link names, 
+    but that’s a story for a different article), dataset data,
+    attribute names, and attribute data.  
+    Though the mechanisms differ, you can use either 
+    ASCII or UTF-8 character sets in all of these situations.
+
+    <h3>Object and Attribute Names</h3>
+    By default, HDF5 creates object and attribute names with ASCII character 
+    encoding.  An object or attribute creation property list setting is 
+    required to create object names with UTF-8 characters.
+    This uses the function <code>H5Pset_char_encoding</code>,
+    which sets the character encoding used for object and attribute names.
+    <p>
+    For example, the following call sequence could be used to create a dataset 
+    with its name encoded with the UTF-8 character set:
+    <pre>
+    lcpl_id = H5Pcreate(H5P_LINK_CREATE) ;
+    error =   H5Pset_char_encoding(lcpl_id, H5T_CSET_UTF8) ;
+    dset_id = H5Dcreate2(group_id, "datos_ñ", dtype_id, dspace_id, 
+              lcpl_id, H5P_DEFAULT, H5P_DEFAULT) ;
+    </pre>
+    <p>
+    If the character encoding of an object name is unknown,
+    the combination of an <code>H5Dget_create_plist</code> call 
+    and an <code>H5Pget_char_encoding</code> call will reveal that 
+    information.
+
+    <h3>Character Datatypes in Datasets and Attributes</h3>
+    Like object names, HDF5 character data in datasets and attributes
+    is encoded as ASCII by default.
+    Setting up attribute or dataset character data to be UTF-8-encoded is 
+    accomplished while defining the attribute or dataset datatype.
+    This makes use of the function <code>H5Tset_cset</code>,
+    which sets the character encoding to be used in building a character 
+    datatype.
+    <p>
+    For example, the following commands could be used to create an
+    8-character, UTF-8 encoded, string datatype for use in either 
+    an attribute or dataset:
+    <pre>
+    utf8_8char_dtype_id = H5Tcopy(H5T_C_S1) ;
+    error =    H5Tset_cset(utf8_8char_dtype_id, H5T_CSET_UTF8) ;
+    error =    H5Tset_size(utf8_8char_dtype_id, "8") ;
+    </pre>
+    <p>
+    If a character or string datatype’s character encoding is unkonwn,
+    an <code>H5Tget_cset</code> call can be used to determine that.
+    </dir>
+
+
+    <p>
+<h2>Caveats, Pitfalls, and Things to Watch For</h2>
+    <dir>
+    <i><font color="#999999">
+       [ This section remains under development; 
+         it will be posted as soon as it is available. — FMB ]
+    </font></i>
+    <p>
+    Programmers who are accustomed to using ASCII text without accommodating 
+    other text encodings will have to be aware of certain common issues as 
+    they begin using UTF-8.
+    </dir>
+    <dir>
+
+    <h3>Cross-platform Portability</h3>
+        Since the HDF5 Library handles datatypes directly,
+        UTF-8 encoded text in dataset and attribute datatypes in an 
+        HDF5 file should work transparently across platforms.  
+        The same should be true of handling names of  groups, datasets, 
+        committed datatypes, and attributes within a file.
+<font color="gray">
+<br>
+<i>Is this actually true? On Windows systems?
+<br>
+The platform-specific content, here and below, is sketchy and tentative
+and must be reviewed by someone who understands the issues and platform 
+differences.</i>
+</font>
+    </dir>
+    <dir>
+        <p>
+        Be aware, however, of system or application limitations 
+        once data or other information has been extracted from an HDF5 file.
+        The application or system must be designed to accommodate UTF-8
+        if the information is then used elsewhere in the application
+        or system environment. 
+        <p>
+        Data from a UTF-8 encoded HDF5 datatype, in either a dataset or an 
+        attribute, that has been established within an HDF5 application 
+        should “just work” within the HDF5 portions of the 
+        application.
+    </dir>
+    <dir>
+
+    <h3>Filenames</h3>
+        Since file access is a system issue, filenames do not fall within 
+        the scope of HDF5’s UTF-8 capabilities; 
+        filenames are encoded at the system level.
+    </dir>
+    <dir>
+
+    <h3>The <i>Plain Text</i> Illusion</h3>
+        Beware the use of the term <i>plain text</i>.  
+        <i>Plain text</i> is at best ambiguous, but often misleading.  
+        Many will assume that <i>plain text</i> means ASCII, 
+        but plain text German or French, for example, 
+        cannot be represented in ASCII.
+        Plain text is only unambiguous in the context of English (and even 
+        then can be problematic!).
+    </dir>
+    <dir>
+
+    <h3>Storage Size</h3>
+        Programmers and data users accustomed to working strictly with
+        ASCII data generally make the reasonable assumption that 1 character, 
+        be it in an object name or in data, requires 1 byte of storage.  
+        This equation does not work when using UTF-8 or any other Unicode 
+        encoding.
+        With Unicode encoding, <i>number of characters</i> 
+        is not synonymous with <i>number of bytes</i>.  
+        One must get used to thinking in terms of <i>number of characters</i> 
+        when talking about content, reserving <i>number of bytes</i> 
+        for discussions of storage size.
+        <p>
+        When working with Unicode text, one can no longer assume 
+        a 1:1 correspondence between the number of characters and 
+        the data storage requirement.
+    </dir>
+    <dir>
+
+    <p>
+    <h3>System Dependencies</h3>
+        <strong>Linux</strong>, <strong>Unix</strong>, and similar systems
+        generally handle UTF-8 in correct and predictable ways.
+        There is an apparent consensus in the Linux community that
+        “UTF-8 is just the right way to go.”
+    </dir>
+    <dir>
+        <p>
+        <strong>Mac OS</strong> also generally handles UTF-8 correctly.
+<font color="gray">
+        <br><i>But must investigate.</i>
+</font>
+    </dir>
+    <dir>
+        <p>
+        <strong>Windows</strong> systems internally use a different 
+        Unicode encoding (UCS-2, discussed in this 
+        <a href="https://en.wikipedia.org/wiki/UTF-16">UTF-16</a> article).  
+<font color="gray">
+        <br>
+        <i>What’s the appropriate thing to say about UTF-8 on Windows?
+        <br>
+        Do we know that “A carefully designed HDF5 application
+        using UTF-8 encoding within an HDF5 file can be expected to
+        function as expected.”
+        <br>
+        I have seen references implying that 
+        “Windows has the reputation of a somewhat schizophrenic 
+        approach to text handling.”
+        <br>
+        Have we seen a situation where Windows silently used UCS-2 or 
+        UTF-16 when UTF-8 had been specified in an HDF5 application?
+        Have we seen situations where HDF5 app[lications successfully use 
+        UTF-s encoding on Windows?
+        </i>
+</font>
+    </dir>
+
+
+    <p>
+<h2>Common Characters in UTF-8 and ASCII</h2>
+    <dir>
+        One interesting feature of UTF-8 and ASCII is that the ASCII
+        character set is a discrete subset of the UTF-8 character set
+        and where they overlap, the encodings are identical.
+        This means that a character string consisting entirely of
+        members of the ASCII character set 
+        can be encoded in either ASCII or UTF-8,
+        the two encodings will be indistinguishable, and 
+        the encodings will require exactly the same storage space.
+    </dir>
+
+
+    <p>
+<h2>See Also</h2>
+    <dir>
+        <table width="100%">
+          <tr valign="top" align="left">
+            <td width="50%">
+               For object and attibute names:
+               <br>
+               <a href="../../RM/RM_H5P.html#Property-SetCharEncoding"
+                  ><code>H5Pset_char_encoding</code></a>
+               <br>
+               <a href="../../RM/RM_H5P.html#Property-GetCharEncoding"
+                  ><code>H5Pget_char_encoding</code></a>
+            </td>
+            <td width="50%">
+               For dataset and attribute datatypes:
+               <br>
+               <a href="../../RM/RM_H5T.html#Datatype-SetCset"
+                  ><code>H5Tset_cset</code></a>
+               <br>
+               <a href="../../RM/RM_H5T.html#Datatype-GetCset"
+                  ><code>H5Tget_cset</code></a>
+            </td>
+          </tr>
+          <tr valign="top" align="left">
+            <td colspan="2">
+                <br>
+               <a href="https://en.wikipedia.org/wiki/UTF-8"
+                  >UTF-8 article on Wikipedia</a>
+            </td>
+          </tr>
+        </table>
+    </dir>
+ 
+
+<hr /><br />
+<p>
+Return to “<a href="../../Advanced.html">Advanced Topics</a>.”</p>
+<br />
+
+
+<hr>
+
+<?php include("../../ed_libs/Footer-THGonly3.htm"); ?>
+
+<SCRIPT LANGUAGE="JAVASCRIPT">
+<!--
+document.writeln("Last modified: 12 November 2013");
+-->
+</SCRIPT>
+ 
+</body>
+</html>
diff --git a/html/Glossary.html b/html/Glossary.html
index c82a22c..6287764 100644
--- a/html/Glossary.html
+++ b/html/Glossary.html
@@ -25,6 +25,29 @@ HDF5 Glossary and Terms
  -->
 <!-- #EndLibraryItem --><!-- #BeginLibraryItem "/ed_libs/NavBar_ADevG.lbi" -->
 <hr>
+
+<!-- CANDIDATE TERMS -- CANDIDATE TERMS -- CANDIDATE TERMS -->
+<!-- List last updated: 25 September 2013                  -->
+<!-- Terms we should consider adding to the Glossary
+
+---- Inspired by the File Space documentation work ----------------------
+free space
+file space
+file space management
+file space management strategies
+raw data
+metadata
+file metadata
+HDF5 Library
+HDF5 attributes
+HDF5 tools
+HDF5 command-line utilities
+HDF5 [file] format
+
+---- Inspired by ????????? ----------------------------------------------
+
+-->
+
 <center>
 <table border=0 width=98%>
 <tr><td valign=top align=left>
diff --git a/html/H5.format.test.html b/html/H5.format.test.html
new file mode 100644
index 0000000..d4b61fc
--- /dev/null
+++ b/html/H5.format.test.html
@@ -0,0 +1,14386 @@
+<html>
+  <head>
+    <title>
+      Test - HDF5 File Format Specification Version 2.0 - Test
+    </title>
+
+<style type="text/css">
+
+<!-- P { text-indent: 2em} -->
+P { text-indent: 0em}
+P.item { margin-left: 2em; text-indent: -2em}
+P.item2 { margin-left: 2em; text-indent: 2em}
+
+TABLE.format { border:solid; border-collapse:collapse; caption-side:top; text-align:center; width:80%; background-color:Plum}
+TABLE.format TH { border:ridge; padding:4px; width:25%;}
+TABLE.format TD { border:ridge; padding:4px; }
+TABLE.format CAPTION { font-weight:bold; font-size:larger;}
+
+TABLE.note {border:none; text-align:right; width:80%; background-color:wheat }
+
+TABLE.desc { border:solid; border-collapse:collapse; caption-size:top; text-align:left; width:80%; background-color:Thistle }
+TABLE.desc TR { vertical-align:top;}
+TABLE.desc TH { border-style:ridge; font-size:larger; padding:4px; text-decoration:underline;}
+TABLE.desc TD { border-style:ridge; padding:4px; }
+TABLE.desc CAPTION { font-weight:bold; font-size:larger;}
+
+TABLE.list { border:none; background-color:SkyBlue; width:100% }
+TABLE.list TR { vertical-align:text-top; }
+TABLE.list TH { border:none; text-decoration:underline; vertical-align:text-top; }
+TABLE.list TD { border:none; vertical-align:text-top; }
+
+<!-- mee, 10.2.2015: the msgDesc table type is used to format the 
+Description element of message types. See header message type 0x0003
+for an example. -->
+TABLE.msgDesc { border:none; background-color:MediumOrchid; width:100% }
+TABLE.msgDesc TR { vertical-align:text-top; }
+TABLE.msgDesc TH { border:none; text-decoration:underline; vertical-align:text-top; }
+TABLE.msgDesc TD { border:none; vertical-align:text-top; background-color:CadetBlue; }
+
+TABLE.list80 { border:none; background-color:MediumOrchid; width:80% }
+TABLE.list80 TR { vertical-align:text-top; }
+TABLE.list80 TH { border:none; text-decoration:underline; vertical-align:text-top; } 
+TABLE.list80 TD { border:none; vertical-align:text-top; }
+
+DIV { page-break-inside:avoid; page-break-after:auto }
+
+</style>
+       
+<!-- #BeginLibraryItem "/ed_libs/styles_Format.lbi" -->
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * Copyright by The HDF Group.                                               *
+  * Copyright by the Board of Trustees of the University of Illinois.         *
+  * All rights reserved.                                                      *
+  *                                                                           *
+  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+  * terms governing use, modification, and redistribution, is contained in    *
+  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+  * of the source code distribution tree; Copyright.html can be found at the  *
+  * root level of an installed copy of the electronic HDF5 document set and   *
+  * is linked from the top-level documents page.  It can also be found at     *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
+  * access to either file, you may request a copy from help at hdfgroup.org.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+<!-- #EndLibraryItem --><!-- #BeginLibraryItem "/ed_libs/NavBar_ADevG.lbi" -->
+</head>
+<body>
+<hr />
+<center>
+<table border="0" width="98%">
+<tr><td valign="top" align="left">
+    <a href="index.html">HDF5 documents and links</a> <br />
+    <a href="H5.intro.html">Introduction to HDF5</a> <br />
+    <!--
+    <a href="Glossary.html">Glossary</a><br />
+    -->
+</td>
+<td valign="top" align="right">
+    <a href="UG/index.html">HDF5 User’s Guide</a> <br />
+    <a href="RM/RM_H5Front.html">HDF5 Reference Manual</a> <br />
+    <a href="ADGuide.html">HDF5 Application Developer’s Guide</a> <br />
+</td></tr>
+</table>
+</center>
+<hr />
+<!-- #EndLibraryItem --><center><h1>Test - HDF5 File Format Specification 
+Version 2.0 - Test</h1></center>
+
+    <h2><a name="FileMetaData">
+	Disk Format: Level 0 - File Metadata</a></h2>
+
+    <h3><a name="Superblock">
+	Disk Format: Level 0A - Format Signature and Superblock</a></h3>
+
+    <p>The superblock may begin at certain predefined offsets within
+      the HDF5 file, allowing a block of unspecified content for
+      users to place additional information at the beginning (and
+      end) of the HDF5 file without limiting the HDF5 Library’s
+      ability to manage the objects within the file itself.  This
+      feature was designed to accommodate wrapping an HDF5 file in
+      another file format or adding descriptive information to an HDF5
+      file without requiring the modification of the actual file’s
+      information.  The superblock is located by searching for the
+      HDF5 format signature at byte offset 0, byte offset 512, and at
+      successive locations in the file, each a multiple of two of
+      the previous location; in other words, at these byte offsets: 
+      0, 512, 1024, 2048, and so on.</p>
+
+    <p>The superblock is composed of the format signature, followed by a
+      superblock version number and information that is specific to each
+      version of the superblock.
+      Currently, there are three versions of the superblock format.
+      Version 0 is the default format, while version 1 is basically the same
+      as version 0 with additional information when a non-default B-tree ‘K’
+      value is stored.  Version 2 is the latest format, with some fields
+      eliminated or compressed and with superblock extension and checksum
+      support.</p>
+
+    <p>Version 0 and 1 of the superblock are described below:</p>
+
+    
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Superblock (Versions 0 and 1)
+	</caption>
+
+	<tr>
+	  <th>byte</th>
+	  <th>byte</th>
+	  <th>byte</th>
+	  <th>byte</th>
+	</tr>  
+
+	<tr>
+	  <td colspan="4"><br />Format Signature (8 bytes)<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td>Version # of Superblock</td>
+	  <td>Version # of File’s Free Space Storage</td>
+	  <td>Version # of Root Group Symbol Table Entry</td>
+	  <td>Reserved (zero)</td>
+	</tr>
+
+	<tr>
+	  <td>Version # of Shared Header Message Format</td>
+	  <td>Size of Offsets</td>
+	  <td>Size of Lengths</td>
+	  <td>Reserved (zero)</td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Group Leaf Node K</td>
+	  <td colspan="2">Group Internal Node K</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">File Consistency Flags</td>
+	</tr>
+
+	<tr>
+	  <td colspan="2" style="border:dotted;">Indexed Storage Internal Node K<sup>1</sup></td>
+	  <td colspan="2" style="border:dotted;">Reserved (zero)<sup>1</sup></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Base Address<sup>O</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Address of File Free space Info<sup>O</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />End of File Address<sup>O</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Driver Information Block Address<sup>O</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Root Group Symbol Table Entry</td>
+	</tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are
+	    of the size specified in “Size of Offsets.”)
+        </td></tr>
+        <tr>
+        <td> </td>
+        <td>
+            (Items marked with a ‘1’ in the above table are
+            new in version 1 of the superblock)
+        </td></tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Format Signature</td>
+	  <td>
+            <p>This field contains a constant value and can be used to
+	    quickly identify a file as being an HDF5 file.  The
+	    constant value is designed to allow easy identification of
+	    an HDF5 file and to allow certain types of data corruption
+	    to be detected.  The file signature of an HDF5 file always
+	    contains the following values:
+            </p>
+
+            <center>
+	      <table border align="center" cellpadding="4">
+		<tr align="center">
+		  <td align="right">Decimal:</td>
+                  <td width="8%">137</td>
+		  <td width="8%">72</td>
+		  <td width="8%">68</td>
+		  <td width="8%">70</td>
+		  <td width="8%">13</td>
+		  <td width="8%">10</td>
+		  <td width="8%">26</td>
+		  <td width="8%">10</td>
+		</tr>
+
+		<tr align="center">
+		  <td align="right">Hexadecimal:</td>
+		  <td>89</td>
+		  <td>48</td>
+		  <td>44</td>
+		  <td>46</td>
+		  <td>0d</td>
+		  <td>0a</td>
+		  <td>1a</td>
+		  <td>0a</td>
+		</tr>
+
+		<tr align="center">
+		  <td align="right">ASCII C Notation:</td>
+		  <td>\211</td>
+		  <td>H</td>
+		  <td>D</td>
+		  <td>F</td>
+		  <td>\r</td>
+		  <td>\n</td>
+		  <td>\032</td>
+		  <td>\n</td>
+		</tr>
+	      </table>
+	    </center>
+	    <br />
+
+	    <p>This signature both identifies the file as an HDF5 file
+	    and provides for immediate detection of common
+	    file-transfer problems. The first two bytes distinguish
+	    HDF5 files on systems that expect the first two bytes to
+	    identify the file type uniquely. The first byte is
+	    chosen as a non-ASCII value to reduce the probability
+	    that a text file may be misrecognized as an HDF5 file;
+	    also, it catches bad file transfers that clear bit
+	    7. Bytes two through four name the format. The CR-LF
+	    sequence catches bad file transfers that alter newline
+	    sequences. The control-Z character stops file display
+	    under MS-DOS. The final line feed checks for the inverse
+	    of the CR-LF translation problem.  (This is a direct
+	    descendent of the <a href="http://www.libpng.org/pub/png/spec/iso/index-object.html#5PNG-file-signature">PNG</a> file
+            signature.)
+            </p>
+
+            <p><em>This field is present in version 0+ of the superblock.</em>
+            </p>
+            </td>
+	</tr>
+
+	<tr>
+	  <td>Version Number of the Superblock</td>
+	  <td>
+            <p>This value is used to determine the format of the
+	    information in the superblock.  When the format of the
+	    information in the superblock is changed, the version number
+	    is incremented to the next integer and can be used to
+	    determine how the information in the superblock is
+	    formatted.
+            </p>
+
+            <p>Values of 0, 1 and 2 are defined for this field.  (The format
+            of version 2 is described below, not here)
+            </p>
+
+            <p><em>This field is present in version 0+ of the superblock.</em>
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Version Number of the File’s Free Space Information</td>
+	  <td>
+            <p>This value is used to determine the format of the
+	    file’s free space information.
+            </p>
+            <p>The only value currently valid in this field is ‘0’, which
+            indicates that the file’s free space is as described 
+            <a href="#FreeSpaceManager">below</a>.
+            </p>
+
+            <p><em>This field is present in version 0 and 1 of the superblock.</em>
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Version Number of the Root Group Symbol Table Entry</td>
+	  <td>
+            <p>This value is used to determine the format of the
+	    information in the Root Group Symbol Table Entry.  When the
+            format of the information in that field is changed, the
+	    version number is incremented to the next integer and can be
+	    used to determine how the information in the field
+	    is formatted.
+            </p>
+            <p>The only value currently valid in this field is ‘0’, which
+            indicates that the root group symbol table entry is formatted as
+            described <a href="#SymbolTableEntry">below</a>.
+            </p>
+
+            <p><em>This field is present in version 0 and 1 of the superblock.</em>
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Version Number of the Shared Header Message Format</td>
+	  <td>
+            <p>This value is used to determine the format of the
+	    information in a shared object header message. Since the format
+	    of the shared header messages differs from the other private
+	    header messages, a version number is used to identify changes
+	    in the format.
+            </p>
+            <p>The only value currently valid in this field is ‘0’, which
+            indicates that shared header messages are formatted as
+            described <a href="#ObjectHeaderMessages">below</a>.
+            </p>
+
+            <p><em>This field is present in version 0 and 1 of the superblock.</em>
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Size of Offsets</td>
+	  <td>
+            <p>This value contains the number of bytes used to store
+	    addresses in the file.  The values for the addresses of
+	    objects in the file are offsets relative to a base address,
+	    usually the address of the superblock signature.  This
+	    allows a wrapper to be added after the file is created
+	    without invalidating the internal offset locations.
+            </p>
+
+            <p><em>This field is present in version 0+ of the superblock.</em>
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Size of Lengths</td>
+	  <td>
+            <p>This value contains the number of bytes used to store
+	    the size of an object.
+            </p>
+
+            <p><em>This field is present in version 0+ of the superblock.</em>
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Group Leaf Node K</td>
+	  <td>
+            <p>Each leaf node of a group B-tree will have at
+	    least this many entries but not more than twice this
+	    many.  If a group has a single leaf node then it
+	    may have fewer entries.
+            </p>
+            <p>This value must be greater than zero.
+            </p>
+            <p>See the <a href="#Btrees">description</a> of B-trees below.
+            </p>
+
+            <p><em>This field is present in version 0 and 1 of the superblock.</em>
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Group Internal Node K</td>
+	  <td>
+            <p>Each internal node of a group B-tree will have at
+	    least this many entries but not more than twice this
+	    many.  If the group has only one internal
+	    node then it might have fewer entries.
+            </p>
+            <p>This value must be greater than zero.
+            </p>
+            <p>See the <a href="#Btrees">description</a> of B-trees below.
+            </p>
+
+            <p><em>This field is present in version 0 and 1 of the superblock.</em>
+            </p>
+          </td>
+	</tr>
+
+        <tr>
+          <td>File Consistency Flags</td>
+          <td>
+            <p>This value contains flags to indicate information
+            about the consistency of the information contained
+            within the file.  Currently, the following bit flags are
+            defined: 
+            <ul>
+            <li>Bit 0 set indicates that the file is opened for
+            write-access.</li>
+            <li>Bit 1 set indicates that the file has
+            been verified for consistency and is guaranteed to be
+            consistent with the format defined in this document.</li>
+            <li>Bits 2-31 are reserved for future use.</li>
+            </ul>
+            Bit 0 should be
+            set as the first action when a file is opened for write
+            access and should be cleared only as the final action
+            when closing a file.  Bit 1 should be cleared during
+            normal access to a file and only set after the file’s
+            consistency is guaranteed by the library or a
+            consistency utility.
+            </p>
+
+            <p><em>This field is present in version 0+ of the superblock.</em>
+            </p>
+          </td>
+        </tr>
+
+	<tr>
+	  <td>Indexed Storage Internal Node K</td>
+	  <td>
+            <p>Each internal node of an indexed storage B-tree will have at
+	    least this many entries but not more than twice this
+	    many.  If the index storage B-tree has only one internal
+	    node then it might have fewer entries.
+            </p>
+            <p>This value must be greater than zero.
+            </p>
+            <p>See the <a href="#Btrees">description</a> of B-trees below.
+            </p>
+
+            <p><em>This field is present in version 1 of the superblock.</em>
+            </p>
+          </td>
+	</tr>
+
+        <tr>
+          <td>Base Address</td>
+          <td>
+            <p>This is the absolute file address of the first byte of
+            the HDF5 data within the file.  The library currently 
+            constrains this value to be the absolute file address 
+            of the superblock itself when creating new files; 
+            future versions of the library may provide greater 
+            flexibility.  When opening an existing file and this address does
+            not match the offset of the superblock, the library assumes
+            that the entire contents of the HDF5 file have been adjusted in
+            the file and adjusts the base address and end of file address to
+            reflect their new positions in the file.  Unless otherwise noted,
+            all other file addresses are relative to this base
+            address.
+            </p>
+
+            <p><em>This field is present in version 0+ of the superblock.</em>
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Address of Global Free-space Index</td>
+          <td>
+            <p>The file’s free space is not persistent for version 0 and 1 of
+	    the superblock.
+            Currently this field always contains the 
+            <a href="#UndefinedAddress">undefined address</a>. 
+            </p>
+
+            <p><em>This field is present in version 0 and 1 of the superblock.</em>
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>End of File Address</td>
+          <td>
+            <p>This is the absolute file address of the first byte past
+            the end of all HDF5 data.  It is used to determine whether a
+            file has been accidently truncated and as an address where
+            file data allocation can occur if space from the free list is
+            not used.
+            </p>
+
+            <p><em>This field is present in version 0+ of the superblock.</em>
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Driver Information Block Address</td>
+          <td>
+            <p>This is the relative file address of the file driver
+            information block which contains driver-specific
+            information needed to reopen the file. If there is no
+            driver information block then this entry should be the
+            <a href="#UndefinedAddress">undefined address</a>.
+            </p>
+
+            <p><em>This field is present in version 0 and 1 of the superblock.</em>
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Root Group Symbol Table Entry</td>
+          <td>
+            <p>This is the <a href="#SymbolTableEntry">symbol table entry</a>
+            of the root group, which serves as the entry point into 
+            the group graph for the file.
+            </p>
+
+            <p><em>This field is present in version 0 and 1 of the superblock.</em>
+            </p>
+          </td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <p>Version 2 of the superblock is described below:</p>
+
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Superblock (Version 2)
+	</caption>
+
+	<tr>
+	  <th>byte</th>
+	  <th>byte</th>
+	  <th>byte</th>
+	  <th>byte</th>
+	</tr>  
+
+	<tr>
+	  <td colspan="4"><br />Format Signature (8 bytes)<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td>Version # of Superblock</td>
+	  <td>Size of Offsets</td>
+	  <td>Size of Lengths</td>
+	  <td>File Consistency Flags</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Base Address<sup>O</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Superblock Extension Address<sup>O</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />End of File Address<sup>O</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Root Group Object Header Address<sup>O</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Superblock Checksum</td>
+	</tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are
+	    of the size specified in “Size of Offsets.”)
+        </td></tr>
+      </table>
+
+    </div>
+ 
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Format Signature</td>
+	  <td>
+            <p>This field is the same as described for versions 0 and 1 of the
+                superblock.
+            </p></td>
+	</tr>
+
+	<tr>
+	  <td>Version Number of the Superblock</td>
+	  <td>
+            <p>This field has a value of 2 and has the same meaning as for
+                versions 0 and 1.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Size of Offsets</td>
+	  <td>
+            <p>This field is the same as described for versions 0 and 1 of the
+                superblock.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Size of Lengths</td>
+	  <td>
+            <p>This field is the same as described for versions 0 and 1 of the
+                superblock.
+            </p>
+          </td>
+	</tr>
+
+        <tr>
+          <td>File Consistency Flags</td>
+          <td>
+            <p>This field is the same as described for versions 0 and 1 except
+            that it is smaller (the number of reserved bits has been reduced
+            from 30 to 6).
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Base Address</td>
+          <td>
+            <p>This field is the same as described for versions 0 and 1 of the
+                superblock.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Superblock Extension Address</td>
+          <td>
+            <p>The field is the address of the object header for the
+                <a href="#SuperblockExt">superblock extension</a>.
+		If there is no extension then this entry should be the
+		<a href="#UndefinedAddress">undefined address</a>.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>End of File Address</td>
+          <td>
+            <p>This field is the same as described for versions 0 and 1 of the
+                superblock.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Root Group Object Header Address</td>
+          <td>
+            <p>This is the address of 
+		the <a href="#DataObject">root group object header</a>, 
+		which serves as the entry point into the group graph for the file.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Superblock Checksum</td>
+          <td>
+            <p>The checksum for the superblock.
+            </p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <h3><a name="DriverInfo">
+	Disk Format: Level 0B - File Driver Info</a></h3>
+
+    <p>The <b>driver information block</b> is an optional region of the
+      file which contains information needed by the file driver
+      to reopen a file.  The format is described below:</p>
+
+    
+    <div align="center">
+      <table class="format">
+        <caption>
+          Driver Information Block (mee: table class="format")
+        </caption>
+ 
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+	</tr>  
+ 
+        <tr>
+          <td>Version</td>
+          <td colspan="3">Reserved</td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Driver Information Size</td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Driver Identification (8 bytes)<br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br /><br />Driver Information (<em>variable size</em>)<br /><br /><br /></td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description (mee: table class="desc")</th>
+        </tr>
+
+        <tr>
+          <td>Version</td>
+          <td>
+            <p>The version number of the Driver Information Block.
+	       This document describes version 0.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Driver Information Size</td>
+          <td>
+            <p>The size in bytes of the <em>Driver Information</em> field.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Driver Identification</td>
+          <td>
+            <p>This is an eight-byte ASCII string without null
+            termination which identifies the driver and/or version number 
+            of the Driver Information Block. The predefined driver encoded
+            in this field by the HDF5 Library is identified by the
+            letters <code>NCSA</code> followed by the first four characters of
+            the driver name. If the Driver Information block is not
+            the original version then the last letter(s) of the
+            identification will be replaced by a version number in
+            ASCII, starting with 0.
+            </p>
+            <p>
+            Identification for user-defined drivers is also eight-byte long.  
+	    It can be arbitrary but should be unique to avoid 
+            the four character prefix “NCSA”.
+            </p>
+          </td>
+        </tr>
+
+        <tr valign="top">
+          <td>Driver Information</td>
+          <td>Driver information is stored in a format defined by the
+            file driver (see description below).</td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    The two drivers encoded in the <em>Driver Identification</em> field are as follows:
+    <ul>
+    <li>
+    Multi driver:
+    <p>
+    The identifier for this driver is “NCSAmulti”.  
+    This driver provides a mechanism for segregating raw data and different types of metadata 
+    into multiple files.
+    These files are viewed by the library as a single virtual HDF5 file with a single file address.
+    A maximum of 6 files will be created for the following data:
+    superblock, B-tree, raw data, global heap, local heap, and object header.  
+    More than one type of data can be written to the same file.
+    </p></li>
+    <li>
+    Family driver
+    <p>
+    The identifier for this driver is “NCSAfami” and is encoded in this field for library version 1.8 and after.
+    This driver is designed for systems that do not support files larger than 2 gigabytes
+    by splitting the HDF5 file address space across several smaller files. 
+    It does nothing to segregate metadata and raw data; 
+    they are mixed in the address space just as they would be in a single contiguous file.
+    </p></li>
+    </ul>
+    <p>The format of the <em>Driver Information</em> field for the 
+    above two drivers are described below:</p>
+
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Multi Driver Information
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Member Mapping</td>
+	  <td>Member Mapping</td>
+	  <td>Member Mapping</td>
+	  <td>Member Mapping</td>
+	</tr>
+
+	<tr>
+	  <td>Member Mapping</td>
+	  <td>Member Mapping</td>
+	  <td>Reserved</td>
+	  <td>Reserved</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Address of Member File 1<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />End of Address for Member File 1<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Address of Member File 2<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />End of Address for Member File 2<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />... ...<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Address of Member File N<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />End of Address for Member File N<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Name of Member File 1 <em>(variable size)</em><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Name of Member File 2 <em>(variable size)</em><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />... ...<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Name of Member File N <em>(variable size)</em><br /><br /></td>
+	</tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+	  <th width="30%">Field Name</th>
+	  <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Member Mapping</td>
+	  <td><p>These fields are integer values from 1 to 6 
+            indicating how the data can be mapped to or merged with another type of
+            data.
+	        <table class="list">
+                    <tr>
+                    <th width="20%">Member Mapping</th>
+                    <th width="80%" align="left">Description</th>
+                    </tr>
+                    <tr>
+                        <td align="center">1</td>
+                        <td>The superblock data.</td>
+                    </tr>
+                    <tr>
+                        <td align="center">2</td>
+                        <td>The B-tree data.</td>
+                    </tr>
+                    <tr>
+                        <td align="center">3</td>
+                        <td>The raw data.</td>
+                    </tr>
+                    <tr>
+                        <td align="center">4</td>
+                        <td>The global heap data.</td>
+                    </tr>
+                    <tr>
+                        <td align="center">5</td>
+                        <td>The local heap data.</td>
+                    </tr>
+                    <tr>
+                        <td align="center">6</td>
+                        <td>The object header data.</td>
+                    </tr>
+                </table></p>
+            <p>For example, if the third field has the value 3 and all the rest have the 
+            value 1, it means there are two files: one for raw data, and one for superblock,
+            B-tree, global heap, local heap, and object header.</p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Reserved</td>
+	  <td><p>These fields are reserved and should always be zero.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Address of Member File N</td>
+	  <td><p>This field Specifies the virtual address at which the member file starts.</p>
+	      <p>N is the number of member files.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>End of Address for Member File N</td>
+	  <td><p>This field is the end of the allocated address for the member file.
+            </p></td>
+	</tr>
+
+	<tr>
+	  <td>Name of Member File N</td>
+	  <td><p>This field is the null-terminated name of the member file and
+		its length should be multiples of 8 bytes.  
+		Additional bytes will be padded with <em>NULL</em>s. The default naming
+		convention is <em>%s-X.h5</em>, where <em>X</em> is one of the letters 
+            <em>s</em> (for superblock), <em>b</em> (for B-tree), <em>r</em> (for raw data),
+            <em>g</em> (for global heap), <em>l</em> (for local heap), and <em>o</em> (for 
+            object header). The name of the whole HDF5 file will substitute the <em>%s</em>
+            in the string. 
+          </p>
+          </td> 
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Family Driver Information
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="8"><br />Size of member file<br /><br /></td>
+	</tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+	  <th width="30%">Field Name</th>
+	  <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Size of member file</td>
+	  <td><p>This field is the size of the member file in the family of files.</p></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <h3><a name="SuperblockExt">
+	Disk Format: Level 0C - Superblock Extension</a></h3>
+
+    <p>The <em>superblock extension</em> is used to store superblock metadata
+      which is either optional, or added after the version of the superblock
+      was defined.  Superblock extensions may only exist when version 2+ of
+      superblock is used.  A superblock extension is an object header which may
+      hold the following messages:</p>
+	<ul>
+	<li>
+	<a href="#SOHMTableMessage">Shared Message Table message</a> containing
+        information to locate the master table of shared object header message
+        indices.</li>
+	<li>
+	<a href="#BtreeKValuesMessage">B-tree ‘K’ Values message</a> containing
+        non-default B-tree ‘K’ values.</li>
+	<li>
+	<a href="#DrvInfoMessage">Driver Info message</a> containing information
+        needed by the file driver in order to reopen a file. 
+        See also the 
+        <a href="#DriverInfo">“Disk Format: Level 0B - File Driver 
+        Info”</a> section above.</li>
+	<li>
+	<a href="#FsinfoMessage">File Space Info message</a> containing
+	information about file space handling in the file.</li>
+	</ul>
+
+    <br />
+    <hr />
+
+    <h2><a name="FileInfra">
+        Disk Format: Level 1 - File Infrastructure</a></h2>
+    <h3><a name="Btrees">
+        Disk Format: Level 1A - B-Trees and B-Tree Nodes</a></h3>
+
+    <p>B-Trees allow flexible storage for objects which tend to grow
+      in ways that cause the object to be stored discontiguously.  B-trees
+      are described in various algorithms books including “Introduction to
+      Algorithms” by Thomas H. Cormen, Charles E. Leiserson, and Ronald
+      L. Rivest.  B-trees are used in several places in the HDF5 file format,
+      when an index is needed for another data structure.</p>
+
+    <p>The version 1 B-tree structure described below is the original index
+      structure, but are limited by some bugs in our implementation (mainly in
+      how they handle deleting records).  The version 1 B-trees are being phased
+      out in favor of the version 2 B-trees described below, although both
+      types of structures may be found in the same file, depending on
+      application settings when creating the file.</p>
+
+    <h4><a name="V1Btrees">
+        Disk Format: Level 1A1 - Version 1 B-trees</a></h4>
+
+    <p>Version 1 B-trees in HDF5 files an implementation of the B-link tree,
+      in which the sibling nodes at a particular level in the tree are stored
+      in a doubly-linked list, is described in the “Efficient Locking for
+      Concurrent Operations on B-trees” paper by Phillip Lehman and S. Bing Yao
+      as published in the <cite>ACM Transactions on Database Systems</cite>,
+      Vol. 6, No. 4, December 1981.</p>
+
+    <p>The B-link trees implemented by the file format contain one more
+      key than the number of children.  In other words, each child
+      pointer out of a B-tree node has a left key and a right key.
+      The pointers out of internal nodes point to sub-trees while
+      the pointers out of leaf nodes point to symbol nodes and 
+      raw data chunks.
+      Aside from that difference, internal nodes and leaf nodes
+      are identical.</p>
+
+    <div align="center">
+      <table class="format">
+        <caption>
+          B-link Tree Nodes
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4">Signature</td>
+        </tr>
+
+        <tr>
+          <td>Node Type</td>
+          <td>Node Level</td>
+          <td colspan="2">Entries Used</td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Address of Left Sibling<sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Address of Right Sibling<sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Key 0 (variable size)</td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Address of Child 0<sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Key 1 (variable size)</td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Address of Child 1<sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4">...</td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Key 2<em>K</em> (variable size)</td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Address of Child 2<em>K</em><sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Key 2<em>K</em>+1 (variable size)</td>
+        </tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Signature</td>
+          <td>
+            <p>The ASCII character string “<code>TREE</code>” is 
+            used to indicate the
+            beginning of a B-link tree node.  This gives file
+            consistency checking utilities a better chance of
+            reconstructing a damaged file.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Node Type</td>
+          <td>
+            <p>Each B-link tree points to a particular type of data.
+            This field indicates the type of data as well as
+            implying the maximum degree <em>K</em> of the tree and
+            the size of each Key field.
+            
+
+            <table class="list">
+                <tr>
+                <th width="20%">Node Type</th>
+                <th width="80%" align="left">Description</th>
+                </tr>
+                <tr>
+                    <td align="center">0</td>
+                    <td>This tree points to group nodes.</td>
+                </tr>
+                <tr>
+                    <td align="center">1</td>
+                    <td>This tree points to raw data chunk nodes.</td>
+                </tr>
+            </table></p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Node Level</td>
+          <td>
+            <p>The node level indicates the level at which this node
+            appears in the tree (leaf nodes are at level zero).  Not
+            only does the level indicate whether child pointers
+            point to sub-trees or to data, but it can also be used
+            to help file consistency checking utilities reconstruct
+            damaged trees.
+            </p>
+          </td>
+        </tr>
+
+        <tr valign="top">
+          <td>Entries Used</td>
+          <td>
+            <p>This determines the number of children to which this
+            node points.  All nodes of a particular type of tree
+            have the same maximum degree, but most nodes will point
+            to less than that number of children.  The valid child
+            pointers and keys appear at the beginning of the node
+            and the unused pointers and keys appear at the end of
+            the node.  The unused pointers and keys have undefined
+            values.
+            </p>
+          </td>
+        </tr>
+
+        <tr valign="top">
+          <td>Address of Left Sibling</td>
+          <td>
+            <p>This is the relative file address of the left sibling of
+            the current node.  If the current
+            node is the left-most node at this level then this field
+            is the <a href="#UndefinedAddress">undefined address</a>.
+            </p>
+          </td>
+        </tr>
+
+        <tr valign="top">
+          <td>Address of Right Sibling</td>
+          <td>
+            <p>This is the relative file address of the right sibling of
+            the current node.  If the current
+            node is the right-most node at this level then this
+            field is the <a href="#UndefinedAddress">undefined address</a>.
+            </p>
+          </td>
+        </tr>
+
+        <tr valign="top">
+          <td>Keys and Child Pointers</td>
+          <td>
+            <p>Each tree has 2<em>K</em>+1 keys with 2<em>K</em>
+            child pointers interleaved between the keys.  The number
+            of keys and child pointers actually containing valid
+            values is determined by the node’s <em>Entries Used</em> field.
+            If that field is <em>N</em> then the B-link tree contains
+            <em>N</em> child pointers and <em>N</em>+1 keys.
+            </p>
+          </td>
+        </tr>
+
+        <tr valign="top">
+          <td>Key</td>
+          <td>
+            <p>The format and size of the key values is determined by
+            the type of data to which this tree points.  The keys are
+            ordered and are boundaries for the contents of the child
+            pointer; that is, the key values represented by child
+            <em>N</em> fall between Key <em>N</em> and Key
+            <em>N</em>+1. Whether the interval is open or closed on
+            each end is determined by the type of data to which the
+            tree points.
+            </p>
+
+            <p>
+            The format of the key depends on the node type.
+            For nodes of node type 0 (group nodes), the key is formatted as
+            follows:
+            
+            <table class="list">
+            <tr>
+              <td width="20%">A single field of <i>Size of Lengths</i> 
+                bytes:</td>
+              <td width="80%">Indicates the byte offset into the local heap 
+                for the first object name in the subtree which 
+                that key describes.
+              </td>
+            </tr>
+            </table>
+            </p>
+            
+
+            <p>
+            For nodes of node type 1 (chunked raw data nodes), the key is
+            formatted as follows:
+            
+            <table class="list">
+            <tr>
+              <td width="20%">Bytes 1-4:</td>
+              <td width="80%">Size of chunk in bytes.</td>
+            </tr>
+            <tr>
+              <td>Bytes 4-8:</td>
+              <td>Filter mask, a 32-bit bit field indicating which 
+                filters have been skipped for this chunk.  Each filter
+                has an index number in the pipeline (starting at 0, with
+                the first filter to apply) and if that filter is skipped,
+                the bit corresponding to its index is set.</td>
+            </tr>
+            <tr>
+              <td>(<em>D + 1</em>) 64-bit fields:</td>
+              <td>The offset of the 
+                chunk within the dataset where <i>D</i> is the number 
+                of dimensions of the dataset, and the last value is the
+                offset within the dataset’s datatype and should always be
+                zero.  For example, if 
+                a chunk in a 3-dimensional dataset begins at the
+                position <code>[5,5,5]</code>, there will be three
+                such 64-bit values, each with the value of 
+                <code>5</code>, followed by a <code>0</code> value.</td>
+            </tr>
+            </table>
+            </p>
+            
+          </td>
+        </tr>
+
+        <tr valign="top">
+          <td>Child Pointer</td>
+          <td>
+            <p>The tree node contains file addresses of subtrees or
+            data depending on the node level.  Nodes at Level 0 point 
+            to data addresses, either raw data chunks or group nodes.
+            Nodes at non-zero levels point to other nodes of the 
+            same B-tree.
+            </p>
+            <p>For raw data chunk nodes, the child pointer is the address
+            of a single raw data chunk.  For group nodes, the child pointer
+            points to a <a href="#SymbolTable">symbol table</a>, which contains
+            information for multiple symbol table entries.
+            </p>
+          </td>
+        </tr>
+      </table>
+    </div>
+
+    <p>
+     Conceptually, each B-tree node looks like this:</p>
+     <center>
+     <table>
+       <tr valign="top" align="center">
+         <td>key[0]</td><td> </td>
+         <td>child[0]</td><td> </td>
+         <td>key[1]</td><td> </td>
+         <td>child[1]</td><td> </td>
+         <td>key[2]</td><td> </td>
+         <td>...</td><td> </td>
+         <td>...</td><td> </td>
+         <td>key[<i>N</i>-1]</td><td> </td>
+         <td>child[<i>N</i>-1]</td><td> </td>
+         <td>key[<i>N</i>]</td>
+       </tr>
+     </table>
+     </center>
+     <br />
+
+     where child[<i>i</i>] is a pointer to a sub-tree (at a level 
+     above Level 0) or to data (at Level 0).  
+     Each key[<i>i</i>] describes an <i>item</i> stored by the B-tree 
+     (a chunk or an object of a group node).  The range of values 
+     represented by child[<i>i</i>] is indicated by key[<i>i</i>] 
+     and key[<i>i</i>+1].
+
+
+    <p>The following question must next be answered: 
+     “Is the value described by key[<i>i</i>] contained in 
+     child[<i>i</i>-1] or in child[<i>i</i>]?”  
+     The answer depends on the type of tree. 
+     In trees for groups (node type 0) the object described by 
+     key[<i>i</i>] is the greatest object contained in 
+     child[<i>i</i>-1] while in chunk trees (node type 1) the 
+     chunk described by key[<i>i</i>] is the least chunk in 
+     child[<i>i</i>].</p>
+
+    <p>That means that key[0] for group trees is sometimes unused; 
+     it points to offset zero in the heap, which is always the 
+     empty string and compares as “less-than” any valid object name.</p>
+
+    <p>And key[<i>N</i>] for chunk trees is sometimes unused; 
+     it contains a chunk offset which compares as “greater-than” 
+     any other chunk offset and has a chunk byte size of zero 
+     to indicate that it is not actually allocated.</p>
+
+    <h4><a name="V2Btrees">
+        Disk Format: Level 1A2 - Version 2 B-Trees</a></h4>
+
+    <p>Version 2 B-trees are “traditional” B-trees, with one major difference.
+        Instead of just using a simple pointer (or address in the file) to a
+        child of an internal node, the pointer to the child node contains two
+        additional pieces of information: the number of records in the child
+        node itself, and the total number of records in the child node and
+        all its descendants.  Storing this additional information allows fast
+        array-like indexing to locate the n<sup>th</sup> record in the B-tree.</p>
+
+    <p>The entry into a version 2 B-tree is a header which contains global
+        information about the structure of the B-tree.  The <em>root node
+        address</em>
+        field in the header points to the B-tree root node, which is either an
+        internal or leaf node, depending on the value in the header’s
+        <em>depth</em> field.  An internal node consists of records plus
+        pointers to further leaf or internal nodes in the tree.  A leaf node
+        consists of solely of records.  The format of the records depends on
+        the B-tree type (stored in the header).</p>
+
+    <div align="center">
+      <table class="format">
+        <caption>
+          Version 2 B-tree Header
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+
+        <tr>
+          <td colspan="4">Signature</td>
+        </tr>
+        <tr>
+          <td>Version</td>
+          <td>Type</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+	<tr>
+          <td colspan="4">Node Size</td>
+	</tr>
+	<tr>
+          <td colspan="2">Record Size</td>
+          <td colspan="2">Depth</td>
+	</tr>
+	<tr>
+          <td>Split Percent</td>
+          <td>Merge Percent</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+	<tr>
+          <td colspan="4"><br />Root Node Address<sup>O</sup><br /><br /></td>
+	</tr>
+	<tr>
+          <td colspan="2">Number of Records in Root Node</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+	<tr>
+          <td colspan="4"><br />Total Number of Records in B-tree<sup>L</sup><br /><br /></td>
+	</tr>
+	<tr>
+          <td colspan="4">Checksum</td>
+	</tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+        <tr>
+        <td> </td>
+        <td>
+            (Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Signature</td>
+          <td>
+            <p>The ASCII character string “<code>BTHD</code>” is 
+            used to indicate the header of a version 2 B-link tree node.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Version</td>
+          <td>
+            <p>The version number for this B-tree header.  This document
+                describes version 0.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Type</td>
+          <td>
+            <p>This field indicates the type of B-tree:
+            <table class="list">
+                <tr>
+                <th width="20%">Value</th>
+                <th width="80%" align="left">Description</th>
+                </tr>
+                <tr>
+                    <td align="center">0</td>
+                    <td>A “testing” B-tree, this value should <em>not</em> be
+                        used for storing records in actual HDF5 files.
+                    </td>
+                </tr>
+                <tr>
+                    <td align="center">1</td>
+                    <td>This B-tree is used for indexing indirectly accessed,
+                        non-filtered ‘huge’ fractal heap objects.
+                    </td>
+                </tr>
+                <tr>
+                    <td align="center">2</td>
+                    <td>This B-tree is used for indexing indirectly accessed,
+                        filtered ‘huge’ fractal heap objects.
+                    </td>
+                </tr>
+                <tr>
+                    <td align="center">3</td>
+                    <td>This B-tree is used for indexing directly accessed,
+                        non-filtered ‘huge’ fractal heap objects.
+                    </td>
+                </tr>
+                <tr>
+                    <td align="center">4</td>
+                    <td>This B-tree is used for indexing directly accessed,
+                        filtered ‘huge’ fractal heap objects.
+                    </td>
+                </tr>
+                <tr>
+                    <td align="center">5</td>
+                    <td>This B-tree is used for indexing the ‘name’ field for
+                        links in indexed groups.
+                    </td>
+                </tr>
+                <tr>
+                    <td align="center">6</td>
+                    <td>This B-tree is used for indexing the ‘creation order’
+                        field for links in indexed groups.
+                    </td>
+                </tr>
+                <tr>
+                    <td align="center">7</td>
+                    <td>This B-tree is used for indexing shared object header
+                        messages.
+                    </td>
+                </tr>
+                <tr>
+                    <td align="center">8</td>
+                    <td>This B-tree is used for indexing the ‘name’ field for
+                        indexed attributes.
+                    </td>
+                </tr>
+                <tr>
+                    <td align="center">9</td>
+                    <td>This B-tree is used for indexing the ‘creation order’
+                        field for indexed attributes.
+                    </td>
+                </tr>
+            </table></p>
+            <p>The format of records for each type is described below.</p>
+          </td>
+        </tr>
+
+        <tr valign="top">
+          <td>Node Size</td>
+          <td>
+            <p>This is the size in bytes of all B-tree nodes.
+            </p>
+          </td>
+        </tr>
+
+        <tr valign="top">
+          <td>Record Size</td>
+          <td>
+            <p>This field is the size in bytes of the B-tree record.
+            </p>
+          </td>
+        </tr>
+
+        <tr valign="top">
+          <td>Depth</td>
+          <td>
+            <p>This is the depth of the B-tree.
+            </p>
+          </td>
+        </tr>
+
+        <tr valign="top">
+          <td>Split Percent</td>
+          <td>
+            <p>The percent full that a node needs to increase above before it
+                is split.
+            </p>
+          </td>
+        </tr>
+
+        <tr valign="top">
+          <td>Merge Percent</td>
+          <td>
+            <p>The percent full that a node needs to be decrease below before it
+                is split.
+            </p>
+          </td>
+        </tr>
+
+        <tr valign="top">
+          <td>Root Node Address</td>
+          <td>
+            <p>This is the address of the root B-tree node.  A B-tree with
+                no records will have the <a href="#UndefinedAddress">undefined
+                address</a> in this field.
+            </p>
+          </td>
+        </tr>
+
+        <tr valign="top">
+          <td>Number of Records in Root Node</td>
+          <td>
+            <p>This is the number of records in the root node.
+            </p>
+          </td>
+        </tr>
+
+        <tr valign="top">
+          <td>Total Number of Records in B-tree</td>
+          <td>
+            <p>This is the total number of records in the entire B-tree.
+            </p>
+          </td>
+        </tr>
+
+        <tr valign="top">
+          <td>Checksum</td>
+          <td>
+            <p>This is the checksum for the B-tree header.
+            </p>
+          </td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Version 2 B-tree Internal Node
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4">Signature</td>
+        </tr>
+        <tr>
+          <td>Version</td>
+          <td>Type</td>
+          <td colspan="2">Records 0, 1, 2...N-1 <em>(variable size)</em></td>
+        </tr>
+	<tr>
+	  <td colspan="4"><br />Child Node Pointer 0<sup>O</sup><br /><br /></td>
+	</tr>
+    <tr>
+	  <td colspan="4"><br />Number of Records N<sub>0</sub> for Child Node 0 <em>(variable size)</em></td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Total Number of Records for Child Node 0 <em>(optional, variable size)</em></td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Child Node Pointer 1<sup>O</sup><br /><br /></td>
+	</tr>
+	  <td colspan="4"><br />Number of Records N<sub>1</sub> for Child Node 1 <em>(variable size)</em></td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Total Number of Records for Child Node 1 <em>(optional, variable size)</em></td>
+	</tr>
+	<tr>
+	  <td colspan="4">...</td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Child Node Pointer N<sup>O</sup><br /><br /></td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Number of Records N<sub>n</sub> for Child Node N <em>(variable size)</em></td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Total Number of Records for Child Node N <em>(optional, variable size)</em></td>
+	</tr>
+	<tr>
+	  <td colspan="4">Checksum</td>
+    </tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+      </table>
+    </div>
+
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Signature</td>
+          <td>
+            <p>The ASCII character string “<code>BTIN</code>” is 
+            used to indicate the internal node of a B-link tree.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Version</td>
+          <td>
+            <p>The version number for this B-tree internal node.  
+	       This document describes version 0.
+           </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Type</td>
+          <td>
+            <p>This field is the type of the B-tree node.  It should always
+                be the same as the B-tree type in the header.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Records</td>
+          <td>
+            <p>The size of this field is determined by the number of records
+	       for this node and the record size (from the header).  The format
+               of records depends on the type of B-tree.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Child Node Pointer</td>
+          <td>
+            <p>This field is the address of the child node pointed to by the
+                internal node.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Number of Records in Child Node</td>
+          <td>
+            <p>This is the number of records in the child node pointed to by
+                the corresponding <em>Node Pointer</em>.
+            </p>
+            <p>The number of bytes used to store this field is determined by
+                the maximum possible number of records able to be stored in the
+                child node.
+            </p>
+            <p>
+                The maximum number of records in a child node is computed 
+                in the following way: 
+                <dir>
+                <ul>
+                <li>Subtract the fixed size overhead for 
+                the child node (for example, its signature, version, 
+                checksum, and so on and <em>one</em> pointer triplet 
+                of information for the child node (because there is one 
+                more pointer triplet than records in each internal node)) 
+                from the size of nodes for the B-tree. </li>
+                <li>Divide that result by the size of a record plus the 
+                pointer triplet of information stored to reach each 
+                child node from this node.
+                </ul>
+                </dir>
+            </p>
+            <p>
+                Note that leaf nodes do not encode any
+                child pointer triplets, so the maximum number of records in a
+                leaf node is just the node size minus the leaf node overhead,
+                divided by the record size.
+            </p>
+            <p>
+                Also note that the first level of internal nodes above the
+                leaf nodes do not encode the <em>Total Number of Records in Child
+                Node</em> value in the child pointer triplets (since it is the
+                same as the <em>Number of Records in Child Node</em>), so the
+                maximum number of records in these nodes is computed with the
+                equation above, but using (<em>Child Pointer</em>, <em>Number of
+                Records in Child Node</em>) pairs instead of triplets.
+            </p>
+            <p>
+                The number of
+                bytes used to encode this field is the least number of bytes
+                required to encode the maximum number of records in a child
+                node value for the child nodes below this level
+                in the B-tree.
+            </p>
+            <p>
+                For example, if the maximum number of child records is 
+                123, one byte will be used to encode these values in this 
+                node; if the maximum number of child records is 
+                20000, two bytes will be used to encode these values in this
+                node; and so on. The maximum number of bytes used to 
+                encode these values is 8 (in other words, an unsigned 
+                64-bit integer).
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Total Number of Records in Child Node</td>
+          <td>
+            <p>This is the total number of records for the node pointed to by
+               the corresponding <em>Node Pointer</em> and all its children.
+               This field exists only in nodes whose depth in the B-tree node
+               is greater than 1 (in other words, the “twig” 
+               internal nodes, just above leaf nodes, do not store this 
+               field in their child node pointers).
+            </p>
+            <p>The number of bytes used to store this field is determined by
+                the maximum possible number of records able to be stored in the
+                child node and its descendants.
+            </p>
+            <p>
+                The maximum possible number of records able to be stored in a
+                child node and its descendants is computed iteratively, in the
+                following way:  The maximum number of records in a leaf node
+                is computed, then that value is used to compute the maximum
+                possible number of records in the first level of internal nodes
+                above the leaf nodes.  Multiplying these two values together
+                determines the maximum possible number of records in child node
+                pointers for the level of nodes two levels above leaf nodes.
+                This process is continued up to any level in the B-tree.
+            </p>
+            <p>
+                The number of bytes used to encode this value is computed in
+                the same way as for the <em>Number of Records in Child Node</em>
+                field.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Checksum</td>
+          <td>
+            <p>This is the checksum for this node.
+            </p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Version 2 B-tree Leaf Node
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4">Signature</td>
+        </tr>
+        <tr>
+          <td>Version</td>
+          <td>Type</td>
+          <td colspan="2">Record 0, 1, 2...N-1 <em>(variable size)</em></td>
+	</tr>
+	<tr>
+	  <td colspan="4">Checksum</td>
+      </tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Signature</td>
+          <td>
+            <p>The ASCII character string “<code>BTLF</code>“ is 
+                used to indicate the leaf node of a version 2 B-link tree.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Version</td>
+          <td>
+            <p>The version number for this B-tree leaf node.  
+	       This document describes version 0.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Type</td>
+          <td>
+            <p>This field is the type of the B-tree node.  It should always
+                be the same as the B-tree type in the header.
+            </p>
+          </td>
+          </tr>
+
+        <tr>
+          <td>Records</td>
+          <td>
+            <p>The size of this field is determined by the number of records
+	       for this node and the record size (from the header).  The format
+               of records depends on the type of B-tree.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Checksum</td>
+          <td>
+            <p>This is the checksum for this node.
+            </p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <p>The record layout for each stored (in other words, non-testing) 
+    B-tree type is as follows:</p>
+    
+    <div align="center">
+      <table class="format">
+        <caption>
+          Version 2 B-tree, Type 1 Record Layout - Indirectly Accessed, Non-Filtered,
+            ‘Huge’ Fractal Heap Objects
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+	</tr>
+
+        <tr>
+          <td colspan="4"><br />Huge Object Address<sup>O</sup><br /><br /></td>
+        </tr>
+        <tr>
+          <td colspan="4"><br />Huge Object Length<sup>L</sup><br /><br /></td>
+        </tr>
+        <tr>
+          <td colspan="4"><br />Huge Object ID<sup>L</sup><br /><br /></td>
+        </tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+        <tr>
+        <td> </td>
+        <td>
+            (Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Huge Object Address</td>
+          <td>
+            <p>The address of the huge object in the file.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Huge Object Length</td>
+          <td>
+            <p>The length of the huge object in the file.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Huge Object ID</td>
+          <td>
+            <p>The heap ID for the huge object.
+            </p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Version 2 B-tree, Type 2 Record Layout - Indirectly Accessed, Filtered,
+            ‘Huge’ Fractal Heap Objects
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Filtered Huge Object Address<sup>O</sup><br /><br /></td>
+        </tr>
+        <tr>
+          <td colspan="4"><br />Filtered Huge Object Length<sup>L</sup><br /><br /></td>
+        </tr>
+        <tr>
+          <td colspan="4">Filter Mask</td>
+        </tr>
+        <tr>
+          <td colspan="4"><br />Filtered Huge Object Memory Size<sup>L</sup><br /><br /></td>
+        </tr>
+        <tr>
+          <td colspan="4"><br />Huge Object ID<sup>L</sup><br /><br /></td>
+        </tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+        <tr>
+        <td> </td>
+        <td>
+            (Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Filtered Huge Object Address</td>
+          <td>
+            <p>The address of the filtered huge object in the file.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Filtered Huge Object Length</td>
+          <td>
+            <p>The length of the filtered huge object in the file.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Filter Mask</td>
+          <td>
+            <p>A 32-bit bit field indicating which filters have been skipped for
+                this chunk.  Each filter has an index number in the pipeline
+                (starting at 0, with the first filter to apply) and if that
+                filter is skipped, the bit corresponding to its index is set.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Filtered Huge Object Memory Size</td>
+          <td>
+            <p>The size of the de-filtered huge object in memory.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Huge Object ID</td>
+          <td>
+            <p>The heap ID for the huge object.
+            </p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Version 2 B-tree, Type 3 Record Layout - Directly Accessed, Non-Filtered,
+            ‘Huge’ Fractal Heap Objects
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+	</tr>
+
+        <tr>
+          <td colspan="4"><br />Huge Object Address<sup>O</sup><br /><br /></td>
+        </tr>
+        <tr>
+          <td colspan="4"><br />Huge Object Length<sup>L</sup><br /><br /></td>
+        </tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+        <tr>
+        <td> </td>
+        <td>
+            (Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Huge Object Address</td>
+          <td>
+            <p>The address of the huge object in the file.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Huge Object Length</td>
+          <td>
+            <p>The length of the huge object in the file.
+            </p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Version 2 B-tree, Type 4 Record Layout - Directly Accessed, Filtered,
+            ‘Huge’ Fractal Heap Objects
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Filtered Huge Object Address<sup>O</sup><br /><br /></td>
+        </tr>
+        <tr>
+          <td colspan="4"><br />Filtered Huge Object Length<sup>L</sup><br /><br /></td>
+        </tr>
+        <tr>
+          <td colspan="4">Filter Mask</td>
+        </tr>
+        <tr>
+          <td colspan="4"><br />Filtered Huge Object Memory Size<sup>L</sup><br /><br /></td>
+        </tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+        <tr>
+        <td> </td>
+        <td>
+            (Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Filtered Huge Object Address</td>
+          <td>
+            <p>The address of the filtered huge object in the file.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Filtered Huge Object Length</td>
+          <td>
+            <p>The length of the filtered huge object in the file.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Filter Mask</td>
+          <td>
+            <p>A 32-bit bit field indicating which filters have been skipped for
+                this chunk.  Each filter has an index number in the pipeline
+                (starting at 0, with the first filter to apply) and if that
+                filter is skipped, the bit corresponding to its index is set.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Filtered Huge Object Memory Size</td>
+          <td>
+            <p>The size of the de-filtered huge object in memory.
+            </p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Version 2 B-tree, Type 5 Record Layout - Link Name for Indexed Group
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+	</tr>
+
+        <tr>
+          <td colspan="4">Hash of Name</td>
+        </tr>
+        <tr>
+          <td colspan="4">ID <em>(bytes 1-4)</em></td>
+	</tr>
+
+        <tr>
+          <td colspan="3">ID <em>(bytes 5-7)</em></td>
+	</tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Hash</td>
+          <td>
+            <p>This field is hash value of the name for the link.  The hash 
+                value is the Jenkins’ lookup3 checksum algorithm applied to
+                the link’s name.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>ID</td>
+          <td>
+            <p>This is a 7-byte sequence of bytes and is the heap ID for the
+                link record in the group’s fractal heap.</p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Version 2 B-tree, Type 6 Record Layout - Creation Order for Indexed Group
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Creation Order <em>(8 bytes)</em><br /><br /></td>
+        </tr>
+        <tr>
+          <td colspan="4">ID <em>(bytes 1-4)</em></td>
+        </tr>
+        <tr>
+          <td colspan="3">ID <em>(bytes 5-7)</em></td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Creation Order</td>
+          <td>
+            <p>This field is the creation order value for the link.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>ID</td>
+          <td>
+            <p>This is a 7-byte sequence of bytes and is the heap ID for the
+                link record in the group’s fractal heap.</p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Version 2 B-tree, Type 7 Record Layout - Shared Object Header Messages (Sub-Type 0 - Message in Heap)
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan>Message Location</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+        <tr>
+          <td colspan="4">Hash</td>
+        </tr>
+        <tr>
+          <td colspan="4">Reference Count</td>
+        </tr>
+        <tr>
+          <td colspan="4"><br />Heap ID <em>(8 bytes)</em><br /><br /></td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Message Location</td>
+          <td>
+            <p>This field Indicates the location where the message is stored:
+            <table class="list">
+                <tr>
+                <th width="20%">Value</th>
+                <th width="80%" align="left">Description</th>
+                </tr>
+                <tr>
+                    <td align="center">0</td>
+                    <td>Shared message is stored in shared message index heap.
+                    </td>
+                </tr>
+                <tr>
+                    <td align="center">1</td>
+                    <td>Shared message is stored in object header.
+                    </td>
+                </tr>
+            </table></p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Hash</td>
+          <td>
+            <p>This field is hash value of the shared message.  The hash 
+                value is the Jenkins’ lookup3 checksum algorithm applied to
+                the shared message.</p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Reference Count</td>
+          <td>
+            <p>The number of objects which reference this message.</p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Heap ID</td>
+          <td>
+            <p>This is an 8-byte sequence of bytes and is the heap ID for the
+                shared message in the shared message index’s fractal heap.</p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Version 2 B-tree, Type 7 Record Layout - Shared Object Header Messages (Sub-Type 1 - Message in Object Header)
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan>Message Location</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+        <tr>
+          <td colspan="4">Hash</td>
+        </tr>
+        <tr>
+          <td>Reserved (zero)</td>
+          <td>Message Type</td>
+          <td colspan="2">Object Header Index</td>
+        </tr>
+        <tr>
+          <td colspan="4"><br />Object Header Address<sup>O</sup><br /><br /></td>
+        </tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Message Location</td>
+          <td>
+            <p>This field Indicates the location where the message is stored:
+            <table class="list">
+                <tr>
+                <th width="20%">Value</th>
+                <th width="80%" align="left">Description</th>
+                </tr>
+                <tr>
+                    <td align="center">0</td>
+                    <td>Shared message is stored in shared message index heap.
+                    </td>
+                </tr>
+                <tr>
+                    <td align="center">1</td>
+                    <td>Shared message is stored in object header.
+                    </td>
+                </tr>
+            </table></p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Hash</td>
+          <td>
+            <p>This field is hash value of the shared message.  The hash 
+                value is the Jenkins’ lookup3 checksum algorithm applied to
+                the shared message.</p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Message Type</td>
+          <td>
+            <p>The object header message type of the shared message.</p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Object Header Index</td>
+          <td>
+            <p>This field indicates that the shared message is the n<sup>th</sup> message
+                of its type in the specified object header.</p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Object Header Address</td>
+          <td>
+            <p>The address of the object header containing the shared message.</p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Version 2 B-tree, Type 8 Record Layout - Attribute Name for Indexed Attributes
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Heap ID <em>(8 bytes)</em><br /><br /></td>
+        </tr>
+        <tr>
+          <td colspan>Message Flags</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+        <tr>
+          <td colspan="4">Creation Order</td>
+        </tr>
+        <tr>
+          <td colspan="4">Hash of Name</td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Heap ID</td>
+          <td>
+            <p>This is an 8-byte sequence of bytes and is the heap ID for the
+                attribute in the object’s attribute fractal heap.</p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Message Flags</td>
+          <td>
+            <p>The object header message flags for the attribute message.</p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Creation Order</td>
+          <td>
+            <p>This field is the creation order value for the attribute.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Hash</td>
+          <td>
+            <p>This field is hash value of the name for the attribute.  The hash 
+                value is the Jenkins’ lookup3 checksum algorithm applied to
+                the attribute’s name.
+            </p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Version 2 B-tree, Type 9 Record Layout- Creation Order for Indexed Attributes
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Heap ID <em>(8 bytes)</em><br /><br /></td>
+        </tr>
+        <tr>
+          <td colspan>Message Flags</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+        <tr>
+          <td colspan="4">Creation Order</td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Heap ID</td>
+          <td>
+            <p>This is an 8-byte sequence of bytes and is the heap ID for the
+                attribute in the object’s attribute fractal heap.</p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Message Flags</td>
+          <td>
+            <p>The object header message flags for the attribute message.</p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Creation Order</td>
+          <td>
+            <p>This field is the creation order value for the attribute.
+            </p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+
+    <h3><a name="SymbolTable">Disk Format: Level 1B - Group Symbol Table Nodes</a></h3>
+
+    <p>A group is an object internal to the file that allows
+      arbitrary nesting of objects within the file (including other groups).
+      A group maps a set of link names in the group to a set of relative
+      file addresses of objects in the file.  Certain metadata for an object to
+      which the group points can be cached in the group’s symbol table entry in
+      addition to being in the object’s header.</p>
+
+    <p>An HDF5 object name space can be stored hierarchically by
+      partitioning the name into components and storing each
+      component as a link in a group.  The link for a
+      non-ultimate component points to the group containing
+      the next component.  The link for the last
+      component points to the object being named.</p>
+
+    <p>One implementation of a  group is a collection of symbol table nodes
+      indexed by a B-link tree.  Each symbol table node contains entries
+      for one or more links.  If an attempt is made to add a link to an already
+      full symbol table node containing 2<em>K</em> entries, then the node is
+      split and one node contains <em>K</em> symbols and the other contains
+      <em>K</em>+1 symbols.</p>
+
+    <div align="center">
+      <table class="format">
+        <caption>
+          Symbol Table Node (A Leaf of a B-link tree)
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+        
+        <tr>
+          <td colspan="4">Signature</td>
+        </tr>
+
+        <tr>
+          <td>Version Number</td>
+          <td>Reserved (zero)</td>
+          <td colspan="2">Number of Symbols</td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br /><br />Group Entries<br /><br /><br /></td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Signature</td>
+          <td>
+            <p>The ASCII character string “<code>SNOD</code>” is 
+            used to indicate the
+            beginning of a symbol table node.  This gives file
+            consistency checking utilities a better chance of
+            reconstructing a damaged file.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Version Number</td>
+          <td>
+            <p>The version number for the symbol table node.  This
+            document describes version 1. (There is no version ‘0’
+            of the symbol table node)
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Number of Entries</td>
+          <td>
+            <p>Although all symbol table nodes have the same length,
+            most contain fewer than the maximum possible number of
+            link entries.  This field indicates how many entries
+            contain valid data.  The valid entries are packed at the
+            beginning of the symbol table node while the remaining
+            entries contain undefined values.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Symbol Table Entries</td>
+          <td>
+            <p>Each link has an entry in the symbol table node.
+            The format of the entry is described below.
+            There are 2<em>K</em> entries in each group node, where
+            <em>K</em> is the “Group Leaf Node K” value from the
+            <a href="#Superblock">superblock</a>.
+            </p>
+          </td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <h3><a name="SymbolTableEntry">
+        Disk Format: Level 1C - Symbol Table Entry </a></h3>
+
+    <p>Each symbol table entry in a symbol table node is designed 
+      to allow for very fast browsing of stored objects.
+      Toward that design goal, the symbol table entries
+      include space for caching certain constant metadata from the
+      object header.</p>
+
+    <div align="center">
+      <table class="format">
+        <caption>
+          Symbol Table Entry
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Link Name Offset<sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Object Header Address<sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Cache Type</td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Reserved (zero)</td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br /><br />Scratch-pad Space (16 bytes)<br /><br /><br /></td>
+        </tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Link Name Offset</td>
+          <td>
+            <p>This is the byte offset into the group’s local
+            heap for the name of the link. The name is null
+            terminated.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Object Header Address</td>
+          <td>
+            <p>Every object has an object header which serves as a
+            permanent location for the object’s metadata.  In addition
+            to appearing in the object header, some of the object’s metadata
+            can be cached in the scratch-pad space.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Cache Type</td>
+          <td>
+            <p>The cache type is determined from the object header.
+            It also determines the format for the scratch-pad space:
+            
+            <table class="list">
+                <tr>
+                    <th width="20%" align="center">Type</th>
+                    <th width="80%" align="left">Description</th>
+                </tr>
+                <tr>
+                    <td align="center">0</td>
+                    <td>No data is cached by the group entry.  This
+                        is guaranteed to be the case when an object header
+                        has a link count greater than one.
+                    </td>
+                </tr>
+                <tr>
+                    <td align="center">1</td>
+                    <td>Group object header metadata is cached in the
+                        scratch-pad space.  This implies that the symbol table
+                        entry refers to another group.
+                    </td>
+                </tr>
+                <tr>
+                    <td align="center">2</td>
+                    <td>The entry is a symbolic link.  The first four bytes
+                        of the scratch-pad space are the offset into the local
+                        heap for the link value.  The object header address
+                        will be undefined.
+                    </td>
+                </tr>
+            </table></p>
+            
+          </td>
+        </tr>
+
+        <tr>
+          <td>Reserved</td>
+          <td>
+            <p>These four bytes are present so that the scratch-pad
+            space is aligned on an eight-byte boundary.  They are
+            always set to zero.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Scratch-pad Space</td>
+          <td>
+            <p>This space is used for different purposes, depending
+            on the value of the Cache Type field. Any metadata
+            about an object represented in the scratch-pad
+            space is duplicated in the object header for that
+            object.
+            </p>
+            <p>
+            Furthermore, no data is cached in the group
+            entry scratch-pad space if the object header for
+            the object has a link count greater than one.
+            </p>
+          </td>
+        </tr>
+      </table>
+    </div>
+
+    <h4>Format of the Scratch-pad Space</h4>
+
+    <p>The symbol table entry scratch-pad space is formatted
+      according to the value in the Cache Type field.</p>  
+
+    <p>If the Cache Type field contains the value zero 
+      <code>(0)</code> then no information is
+      stored in the scratch-pad space.</p>
+
+    <p>If the Cache Type field contains the value one
+      <code>(1)</code>, then the scratch-pad space
+      contains cached metadata for another object header 
+      in the following format:</p>
+
+    <div align="center">
+      <table class="format">
+        <caption>
+          Object Header Scratch-pad Format
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Address of B-tree<sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Address of Name Heap<sup>O</sup><br /><br /></td>
+        </tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Address of B-tree</td>
+          <td>
+            <p>This is the file address for the root of the 
+                group’s B-tree.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Address of Name Heap</td>
+          <td>
+            <p>This is the file address for the group’s local
+                heap, in which are stored the group’s symbol names.
+            </p>
+          </td>
+        </tr>
+      </table>
+    </div>
+
+
+    <br />
+    <p>If the Cache Type field contains the value two
+      <code>(2)</code>, then the scratch-pad space
+      contains cached metadata for a symbolic link
+      in the following format:</p>
+
+    <div align="center">
+      <table class="format">
+        <caption>
+          Symbolic Link Scratch-pad Format
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4">Offset to Link Value</td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Offset to Link Value</td>
+          <td>
+            <p>The value of a symbolic link (that is, the name of the
+                thing to which it points) is stored in the local heap.
+                This field is the 4-byte offset into the local heap for
+                the start of the link value, which is null terminated.
+            </p>
+          </td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <h3><a name="LocalHeap">Disk Format: Level 1D - Local Heaps</a></h3>
+
+    <p>A local heap is a collection of small pieces of data that are particular
+      to a single object in the HDF5 file.  Objects can be
+      inserted and removed from the heap at any time.  
+      The address of a heap does not change once the heap is created. 
+      For example, a group stores addresses of objects in symbol table nodes
+      with the names of links stored in the group’s local heap.
+    </p>
+
+    <div align="center">
+      <table class="format">
+        <caption>
+          Local Heap
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4">Signature</td>
+        </tr>
+
+        <tr>
+          <td>Version</td>
+          <td colspan="3">Reserved (zero)</td>
+        </tr>
+          
+        <tr>
+          <td colspan="4"><br />Data Segment Size<sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Offset to Head of Free-list<sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Address of Data Segment<sup>O</sup><br /><br /></td>
+        </tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+        <tr>
+        <td> </td>
+        <td>
+            (Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Signature</td>
+          <td>
+            <p>The ASCII character string “<code>HEAP</code>”
+            is used to indicate the
+            beginning of a heap.  This gives file consistency
+            checking utilities a better chance of reconstructing a
+            damaged file.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Version</td>
+          <td>
+            <p>Each local heap has its own version number so that new
+            heaps can be added to old files.  This document
+            describes version zero (0) of the local heap.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Data Segment Size</td>
+          <td>
+            <p>The total amount of disk memory allocated for the heap
+            data.  This may be larger than the amount of space
+            required by the objects stored in the heap.  The extra
+            unused space in the heap holds a linked list of free blocks.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Offset to Head of Free-list</td>
+          <td>
+            <p>This is the offset within the heap data segment of the
+            first free block (or the
+            <a href="#UndefinedAddress">undefined address</a> if there is no
+            free block).  The free block contains “Size of Lengths” bytes that
+            are the offset of the next free block (or the
+            value ‘1’ if this is the
+            last free block) followed by “Size of Lengths” bytes that store
+            the size of this free block.  The size of the free block includes
+            the space used to store the offset of the next free block and
+            the size of the current block, making the minimum size of a free 
+            block 2 * “Size of Lengths”.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Address of Data Segment</td>
+          <td>
+            <p>The data segment originally starts immediately after
+            the heap header, but if the data segment must grow as a
+            result of adding more objects, then the data segment may
+            be relocated, in its entirety, to another part of the 
+            file.
+            </p>
+          </td>
+        </tr>
+      </table>
+    </div>
+
+    <p>Objects within a local heap should be aligned on an 8-byte boundary.</p>
+
+    <h3><a name="GlobalHeap">Disk Format: Level 1E - Global Heap</a></h3>
+
+    <p>Each HDF5 file has a global heap which stores various types of
+      information which is typically shared between datasets.  The
+      global heap was designed to satisfy these goals:</p>
+
+    <ol type="A">
+      <li>Repeated access to a heap object must be efficient without
+        resulting in repeated file I/O requests. Since global heap
+        objects will typically be shared among several datasets, it is
+        probable that the object will be accessed repeatedly.</li>
+      <li>Collections of related global heap objects should result in
+        fewer and larger I/O requests.  For instance, a dataset of
+        object references will have a global heap object for each
+        reference.  Reading the entire set of object references
+        should result in a few large I/O requests instead of one small
+        I/O request for each reference.</li>
+      <li>It should be possible to remove objects from the global heap
+        and the resulting file hole should be eligible to be reclaimed
+        for other uses.</li>
+    </ol>
+    
+
+    <p>The implementation of the heap makes use of the memory management
+        already available at the file level and combines that with a new
+        object called a <em>collection</em> to achieve goal B. The global heap
+        is the set of all collections.  Each global heap object belongs to
+        exactly one collection and each collection contains one or more global
+        heap objects. For the purposes of disk I/O and caching, a collection is
+        treated as an atomic object, addressing goal A.
+    </p>
+
+    <p>When a global heap object is deleted from a collection (which occurs
+        when its reference count falls to zero), objects located after the
+        deleted object in the collection are packed down toward the beginning
+        of the collection and the collection’s global heap object 0 is created
+        (if possible) or its size is increased to account for the recently
+        freed space.  There are no gaps between objects in each collection,
+        with the possible exception of the final space in the collection, if
+        it is not large enough to hold the header for the collection’s global
+        heap object 0.  These features address goal C.
+    </p>
+
+    <p>The HDF5 Library creates global heap collections as needed, so there may
+        be multiple collections throughout the file. The set of all of them is
+        abstractly called the “global heap”, although they do not actually link
+        to each other, and there is no global place in the file where you can
+        discover all of the collections.  The collections are found simply by
+        finding a reference to one through another object in the file.  For
+        example, data of variable-length datatype elements is stored in the
+        global heap and is accessed via a global heap ID.  The format for
+        global heap IDs is described at the end of this section.
+    </p>
+
+    <div align="center">
+      <table class="format">
+        <caption>
+          A Global Heap Collection
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4">Signature</td>
+        </tr>
+          
+        <tr>
+          <td>Version</td>
+          <td colspan="3">Reserved (zero)</td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Collection Size<sup>L</sup><br /><br /></td>
+        </tr>
+          
+        <tr>
+          <td colspan="4"><br />Global Heap Object 1<br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Global Heap Object 2<br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />...<br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Global Heap Object <em>N</em><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Global Heap Object 0 (free space)<br /><br /></td>
+        </tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Signature</td>
+          <td>
+            <p>The ASCII character string “<code>GCOL</code>”
+            is used to indicate the
+            beginning of a collection.  This gives file consistency
+            checking utilities a better chance of reconstructing a
+            damaged file.
+            </p>
+          </td>
+        </tr>
+          
+        <tr>
+          <td>Version</td>
+          <td>
+            <p>Each collection has its own version number so that new
+            collections can be added to old files.  This document
+            describes version one (1) of the collections (there is no
+            version zero (0)).
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Collection Size</td>
+          <td>
+            <p>This is the size in bytes of the entire collection
+            including this field.  The default (and minimum)
+            collection size is 4096 bytes which is a typical file
+            system block size.  This allows for 127 16-byte heap
+            objects plus their overhead (the collection header of 16 bytes
+            and the 16 bytes of information about each heap object).
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Global Heap Object 1 through <em>N</em></td> 
+          <td>
+            <p>The objects are stored in any order with no 
+            intervening unused space.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Global Heap Object 0</td>
+          <td>
+            <p>Global Heap Object 0 (zero), when present, represents the free
+            space in the collection.  Free space always appears at the end of
+            the collection.  If the free space is too small to store the header
+            for Object 0 (described below) then the header is implied and the
+            collection contains no free space.
+            </p>
+          </td>
+        </tr>
+      </table>
+    </div>
+    
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Global Heap Object
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+          
+        <tr>
+          <td colspan="2">Heap Object Index</td>
+          <td colspan="2">Reference Count</td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Reserved (zero)</td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Object Size<sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Object Data<br /><br /></td>
+        </tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Heap Object Index</td>
+          <td>
+            <p>Each object has a unique identification number within a
+            collection.  The identification numbers are chosen so that
+            new objects have the smallest value possible with the
+            exception that the identifier <code>0</code> always refers to the
+            object which represents all free space within the
+            collection.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Reference Count</td>
+          <td>
+            <p>All heap objects have a reference count field.  An
+            object which is referenced from some other part of the
+            file will have a positive reference count. The reference
+            count for Object 0 is always zero.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Reserved</td>
+          <td>
+            <p>Zero padding to align next field on an 8-byte boundary.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Object Size</td>
+          <td>
+            <p>This is the size of the object data stored for the object.
+            The actual storage space allocated for the object data is rounded
+            up to a multiple of eight.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Object Data</td>
+          <td>
+            <p>The object data is treated as a one-dimensional array
+            of bytes to be interpreted by the caller.
+            </p>
+          </td>
+        </tr>
+      </table>
+
+    </div>
+
+    <br />
+    <p>
+    The format for the ID used to locate an object in the global heap is
+    described here:</p>
+
+    <div align="center">
+      <table class="format">
+        <caption>
+          Global Heap ID
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Collection Address<sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Object Index</td>
+        </tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Collection Address</td>
+          <td>
+            <p>This field is the address of the global heap collection
+		where the data object is stored.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>ID</td>
+          <td>
+            <p>This field is the index of the data object within the
+		global heap collection.
+            </p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+    
+
+    <br />
+    <h3><a name="FractalHeap">Disk Format: Level 1F - Fractal Heap</a></h3>
+
+        <p>
+	    Each fractal heap consists of a header and zero or more direct and
+            indirect blocks (described below).  The header contains general
+            information as well as
+            initialization parameters for the doubling table.  The <em>Root
+            Block Address</em> in the header points to the first direct or
+            indirect block in the heap.
+        </p>
+
+        <p>
+            Fractal heaps are based on a data structure called a <em>doubling
+            table</em>.  A doubling table provides a mechanism for quickly
+            extending an array-like data structure that minimizes the number of
+            empty blocks in the heap, while retaining very fast lookup of any
+            element within the array.  More information on fractal heaps and
+            doubling tables can be found in the RFC 
+            “<a href="Supplements/FractalHeap/PrivateHeap.pdf">Private
+            Heaps in HDF5</a>.”
+        </p>
+
+        <p>
+            The fractal heap implements the doubling table structure with
+            indirect and direct blocks.
+            Indirect blocks in the heap do not actually contain data for
+            objects in the heap, their “size” is abstract - 
+            they represent the indexing structure for locating the
+            direct blocks in the doubling table.
+            Direct blocks
+            contain the actual data for objects stored in the heap.
+        </p>
+
+        <p>
+            All indirect blocks have a constant number of block entries in each
+            row, called the <em>width</em> of the doubling table (stored in
+            the heap header).
+
+            The number
+            of rows for each indirect block in the heap is determined by the
+            size of the block that the indirect block represents in the
+            doubling table (calculation of this is shown below) and is
+            constant, except for the “root”
+            indirect block, which expands and shrinks its number of rows as
+            needed. 
+        </p>
+
+        <p>
+            Blocks in the first <em>two</em> rows of an indirect block 
+            are <em>Starting Block Size</em> number of bytes in size, 
+            and the blocks in each subsequent row are twice the size of 
+            the blocks in the previous row. In other words, blocks in 
+            the third row are twice the <em>Starting Block Size</em>, 
+            blocks in the fourth row are four times the 
+            <em>Starting Block Size</em>, and so on.  Entries for
+            blocks up to the <em>Maximum Direct Block Size</em> point to 
+            direct blocks, and entries for blocks greater than that size 
+            point to further indirect blocks (which have their own 
+            entries for direct and indirect blocks).
+        </p>
+
+        <p>
+            The number of rows of blocks, <em>nrows</em>, in an
+            indirect block of size <em>iblock_size</em> is given by the
+            following expression:
+            <br /> <br />
+                <em>nrows</em> = (log<sub>2</sub>(<em>iblock_size</em>) -
+                    log<sub>2</sub>(<em><Starting Block Size></em> *
+                        <em><Width></em>)) + 1
+        </p>
+
+        <p>
+            The maximum number of rows of direct blocks, <em>max_dblock_rows</em>,
+            in any indirect block of a fractal heap is given by the
+            following expression:
+            <br /> <br />
+                <em>max_dblock_rows</em> =
+                    (log<sub>2</sub>(<em><Max. Direct Block Size></em>) -
+                    log<sub>2</sub>(<em><Starting Block Size></em>)) + 2
+        </p>
+
+        <p>
+            Using the computed values for <em>nrows</em> and
+            <em>max_dblock_rows</em>, along with the <em>Width</em> of the
+            doubling table, the number of direct and indirect block entries
+            (<em>K</em> and <em>N</em> in the indirect block description, below)
+            in an indirect block can be computed:
+            <br /> <br />
+                <em>K</em> = MIN(<em>nrows</em>, <em>max_dblock_rows</em>) *
+                    <em>Width</em>
+
+            <br /> <br />
+            If <em>nrows</em> is less than or equal to <em>max_dblock_rows</em>,
+            <em>N</em> is 0.  Otherwise, <em>N</em> is simply computed:
+            <br /> <br />
+                <em>N</em> = <em>K</em> - (<em>max_dblock_rows</em> *
+                    <em>Width</em>)
+        </p>
+
+        <p>
+            The size indirect blocks on disk is determined by the number
+            of rows in the indirect block (computed above).  The size of direct
+            blocks on disk is exactly the size of the block in the doubling
+            table.
+        </p>
+
+    <div align="center">
+      <table class="format">
+        <caption>
+          Fractal Heap Header
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4">Signature</td>
+        </tr>
+          
+        <tr>
+          <td>Version</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="2">Heap ID Length</td>
+          <td colspan="2">I/O Filters’ Encoded Length</td>
+        </tr>
+          
+        <tr>
+          <td>Flags</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Maximum Size of Managed Objects</td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Next Huge Object ID<sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />v2 B-tree Address of Huge Objects<sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Amount of Free Space in Managed Blocks<sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Address of Managed Block Free Space Manager<sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Amount of Managed Space in Heap<sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Amount of Allocated Managed Space in Heap<sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Offset of Direct Block Allocation Iterator in Managed Space<sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Number of Managed Objects in Heap<sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Size of Huge Objects in Heap<sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Number of Huge Objects in Heap<sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Size of Tiny Objects in Heap<sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Number of Tiny Objects in Heap<sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="2">Table Width</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Starting Block Size<sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Maximum Direct Block Size<sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="2">Maximum Heap Size</td>
+          <td colspan="2">Starting # of Rows in Root Indirect Block</td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Address of Root Block<sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="2">Current # of Rows in Root Indirect Block</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Size of Filtered Root Direct Block <em>(optional)</em><sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4">I/O Filter Mask<em> (optional)</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4">I/O Filter Information<em> (optional, variable size)</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Checksum</td>
+        </tr>
+
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+        <tr>
+        <td> </td>
+        <td>
+            (Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="40%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Signature</td>
+          <td>
+            <p>The ASCII character string “<code>FRHP</code>”
+            is used to indicate the
+            beginning of a fractal heap header.  This gives file consistency
+            checking utilities a better chance of reconstructing a
+            damaged file.
+            </p>
+          </td>
+        </tr>
+          
+        <tr>
+          <td>Version</td>
+          <td>
+            <p>This document describes version 0.</p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Heap ID Length</td>
+          <td>
+            <p>This is the length in bytes of heap object IDs for this heap.</p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>I/O Filters’ Encoded Length</td>
+        <td>
+	    <p>This is the size in bytes of the encoded <em>I/O Filter Information</em>.
+            </p>
+        </td>
+        </tr>
+
+        <tr>
+        <td>Flags</td>
+        <td>
+            <p>This field is the heap status flag and is a bit field 
+            indicating additional information about the fractal heap.
+            <table class="list">
+                <tr>
+                  <th width="20%">Bit(s)</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>0</code></td>
+                  <td>If set, the ID value to use for huge object has wrapped
+                    around.  If the value for the <em>Next Huge Object ID</em>
+                    has wrapped around, each new huge object inserted into the
+                    heap will require a search for an ID value.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>1</code></td>
+                  <td>If set, the direct blocks in the heap are checksummed.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>2-7</code></td>
+                  <td>Reserved</td>
+                </tr>
+            </table></p>
+            
+          </td>
+        </tr>
+	
+        <tr>
+        <td>Maximum Size of Managed Objects</td>
+        <td>
+	    <p>This is the maximum size of managed objects allowed in the heap.
+        Objects greater than this this are ‘huge’ objects and will be
+        stored in the file directly, rather than in a direct block for
+        the heap.
+	    </p>
+        </td>
+        </tr>
+
+        <tr>
+        <td>Next Huge Object ID</td>
+        <td>
+	    <p>This is the next ID value to use for a huge object in the heap.
+	    </p>
+        </td>
+        </tr>
+
+        <tr>
+        <td>v2 B-tree Address of Huge Objects</td>
+        <td>
+	    <p>This is the address of the <a href="#V2Btrees">v2 B-tree</a>
+        used to track huge objects in the heap.  The type of records
+        stored in the <em>v2 B-tree</em> will
+        be determined by whether the address & length of a huge object
+        can fit into a heap ID (if yes, it is a “directly” accessed
+        huge object) and whether there is a filter used on objects
+        in the heap.
+	    </p>
+        </td>
+        </tr>
+
+        <tr>
+        <td>Amount of Free Space in Managed Blocks</td>
+        <td>
+	    <p>This is the total amount of free space in managed direct blocks
+                (in bytes).
+	    </p>
+        </td>
+        </tr>
+
+        <tr>
+          <td>Address of Managed Block Free Space Manager</td>
+          <td>
+	      <p>This is the address of the
+          <em><a href="#FreeSpaceManager">Free-Space Manager</a></em> for
+          managed blocks.
+          </p>
+          </td>
+        </tr>
+
+        <tr>
+        <td>Amount of Managed Space in Heap</td>
+	    <td>
+	    <p>This is the total amount of managed space in the heap (in bytes),
+        essentially the upper bound of the heap’s linear address space.
+	    </p>
+        </td>
+        </tr>
+
+	<tr>
+          <td>Amount of Allocated Managed Space in Heap</td>
+	  <td>
+	    <p>This is the total amount of managed space (in bytes) actually
+                allocated in
+                the heap.  This can be less than the <em>Amount of Managed Space
+                in Heap</em> field, if some direct blocks in the heap’s linear
+                address space are not allocated.
+	    </p>
+	  </td>
+	</tr>
+
+	<tr>
+          <td>Offset of Direct Block Allocation Iterator in Managed Space</td>
+	  <td>
+	    <p>This is the linear heap offset where the next direct
+                block should be allocated at (in bytes).  This may be less than
+                the <em>Amount of Managed Space in Heap</em> value because the
+                heap’s address space is increased by a “row” of direct blocks
+                at a time, rather than by single direct block increments.
+	    </p>
+	  </td>
+	</tr>
+
+	<tr>
+          <td>Number of Managed Objects in Heap</td>
+	  <td>
+	    <p>This is the number of managed objects in the heap.
+	    </p>
+	  </td>
+	</tr>
+
+	<tr>
+          <td>Size of Huge Objects in Heap</td>
+	  <td>
+	    <p>This is the total size of huge objects in the heap (in bytes).
+	    </p>
+	  </td>
+	</tr>
+
+	<tr>
+          <td>Number of Huge Objects in Heap</td>
+	  <td>
+	    <p>This is the number of huge objects in the heap.
+	    </p>
+	  </td>
+	</tr>
+
+	<tr>
+          <td>Size of Tiny Objects in Heap</td>
+	  <td>
+	    <p>This is the total size of tiny objects that are packed in heap
+                IDs (in bytes).
+	    </p>
+	  </td>
+	</tr>
+
+	<tr>
+          <td>Number of Tiny Objects in Heap</td>
+	  <td>
+	    <p>This is the number of tiny objects that are packed in heap IDs.
+	    </p>
+	  </td>
+	</tr>
+
+	<tr>
+          <td>Table Width</td>
+	  <td>
+	    <p>This is the number of columns in the doubling table for managed
+                blocks.  This value must be a power of two.
+	    </p>
+	  </td>
+	</tr>
+
+	<tr>
+          <td>Starting Block Size</td>
+	  <td>
+	    <p>This is the starting block size to use in the doubling table for 
+	       managed blocks (in bytes).  This value must be a power of two.
+	    </p>
+	  </td>
+	</tr>
+
+	<tr>
+          <td>Maximum Direct Block Size</td>
+	  <td>
+	    <p>This is the maximum size allowed for a managed direct block.
+                Objects inserted into the heap that are larger than this value
+                (less the # of bytes of direct block prefix/suffix)
+                are stored as ‘huge’ objects.  This value must be a power of
+                two.
+	    </p>
+	  </td>
+	</tr>
+
+	<tr>
+          <td>Maximum Heap Size</td>
+	  <td>
+	    <p>This is the maximum size of the heap’s linear address space for
+                managed objects (in bytes).  The value stored is the log2 of
+                the actual value, that is: the # of bits of the address space.
+                ‘Huge’ and ‘tiny’ objects are not counted in this value, since
+                they do not store objects in the linear address space of the
+                heap.
+	    </p>
+	  </td>
+	</tr>
+
+	<tr>
+          <td>Starting # of Rows in Root Indirect Block</td>
+	  <td>
+	    <p>This is the starting number of rows for the root indirect block.
+	       A value of 0 indicates that the root indirect block will have
+               the maximum number of rows needed to address the heap’s <em>Maximum
+               Heap Size</em>.
+	    </p>
+	  </td>
+	</tr>
+
+	<tr>
+          <td>Address of Root Block</td>
+	  <td>
+	    <p>This is the address of the root block for the heap.  It can
+                be the <a href="#UndefinedAddress">undefined address</a> if
+                there is no data in the heap.  It either points to a direct
+                block (if the <em>Current # of Rows in the Root Indirect Block</em>
+                value is 0), or an indirect block.
+	    </p>
+	  </td>
+	</tr>
+
+	<tr>
+          <td>Current # of Rows in Root Indirect Block</td>
+	  <td>
+	    <p>This is the current number of rows in the root indirect block.
+		A value of 0 indicates that <em>Address of Root Block</em>
+                points to direct block instead of indirect block.
+	    </p>
+	  </td>
+	</tr>
+
+	<tr>
+          <td>Size of Filtered Root Direct Block</td>
+	  <td>
+	    <p>This is the size of the root direct block, if filters are
+                applied to heap objects (in bytes).  This field is only
+                stored in the header if the <em>I/O Filters’ Encoded Length</em>
+                is greater than 0.
+	    </p>
+	  </td>
+	</tr>
+
+	<tr>
+          <td>I/O Filter Mask</td>
+	  <td>
+	    <p>This is the filter mask for the root direct block, if filters
+                are applied to heap objects.  This mask has the same format as
+                that used for the filter mask in chunked raw data records in a
+                <a href="#V1Btrees">v1 B-tree</a>.
+                This field is only
+                stored in the header if the <em>I/O Filters’ Encoded Length</em>
+                is greater than 0.
+	    </p>
+	  </td>
+	</tr>
+
+        <tr>
+          <td>I/O Filter Information</td>
+	  <td>
+	    <p>This is the I/O filter information encoding direct blocks and
+                huge objects, if filters are applied to heap objects.  This
+                field is encoded as a <a href="#FilterMessage">Filter Pipeline</a>
+                message.
+                The size of this field is determined by <em>I/O Filters’
+                Encoded Length</em>.
+	    </p>
+	  </td>
+        </tr>
+
+        <tr>
+          <td>Checksum</td>
+          <td>
+            <p>This is the checksum for the header.</p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Fractal Heap Direct Block
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4">Signature</td>
+        </tr>
+          
+        <tr>
+          <td>Version</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Heap Header Address<sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Block Offset <em>(variable size)</em></td>
+        </tr>
+          
+        <tr>
+          <td colspan="4">Checksum <em>(optional)</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Object Data <em>(variable size)</em><br /><br /></td>
+        </tr>
+          
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Signature</td>
+          <td>
+            <p>The ASCII character string “<code>FHDB</code>”
+            is used to indicate the
+            beginning of a fractal heap direct block.  This gives file consistency
+            checking utilities a better chance of reconstructing a
+            damaged file.
+            </p>
+          </td>
+        </tr>
+          
+        <tr>
+          <td>Version</td>
+          <td>
+            <p>This document describes version 0.</p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Heap Header Address</td>
+          <td>
+            <p>This is the address for the fractal heap header that this
+                block belongs to.  This field is principally used for file
+                integrity checking.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Block Offset</td>
+          <td>
+            <p>This is the offset of the block within the fractal heap’s
+                address space (in bytes).  The number of bytes used to encode
+                this field is the <em>Maximum Heap Size</em> (in the heap’s
+                header) divided by 8 and rounded up to the next highest integer,
+                for values that are not a multiple of 8.  This value is
+                principally used for file integrity checking.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Checksum</td>
+          <td>
+            <p>This is the checksum for the direct block.</p>
+	    <p>This field is only present if bit 1 of <em>Flags</em> in the
+                heap’s header is set.</p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Object Data</td>
+          <td>
+            <p>This section of the direct block stores the actual data for
+                objects in the heap.  The size of this section is determined by
+                the direct block’s size, minus the size of the other fields
+                stored in the direct block (the <em>Signature</em>,
+                <em>Version</em>, etc., including the <em>Checksum</em> if it is
+                present).
+            </p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Fractal Heap Indirect Block
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4">Signature</td>
+        </tr>
+          
+        <tr>
+          <td>Version</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Heap Header Address<sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Block Offset <em>(variable size)</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Child Direct Block #0 Address<sup>O</sup><br /><br /></td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Size of Filtered Direct Block #0 <em>(optional)</em> <sup>L</sup><br /><br /></td>
+	</tr>
+	<tr>
+	  <td colspan="4">Filter Mask for Direct Block #0 <em>(optional)</em></td>
+	</tr>
+
+        <tr>
+          <td colspan="4"><br />Child Direct Block #1 Address<sup>O</sup><br /><br /></td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Size of Filtered Direct Block #1 <em>(optional)</em><sup>L</sup><br /><br /></td>
+	</tr>
+	<tr>
+	  <td colspan="4">Filter Mask for Direct Block #1 <em>(optional)</em></td>
+	</tr>
+
+	<tr>
+	    <td colspan="4">...</td>
+	</tr>
+
+        <tr>
+          <td colspan="4"><br />Child Direct Block #K-1 Address<sup>O</sup><br /><br /></td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Size of Filtered Direct Block #K-1 <em>(optional)</em><sup>L</sup><br /><br /></td>
+	</tr>
+	<tr>
+	  <td colspan="4">Filter Mask for Direct Block #K-1 <em>(optional)</em></td>
+	</tr>
+
+        <tr>
+          <td colspan="4"><br />Child Indirect Block #0 Address<sup>O</sup><br /><br /></td>
+	</tr>
+
+        <tr>
+          <td colspan="4"><br />Child Indirect Block #1 Address<sup>O</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">...</td>
+	</tr>
+
+        <tr>
+          <td colspan="4"><br />Child Indirect Block #N-1 Address<sup>O</sup><br /><br /></td>
+	</tr>
+          
+        <tr>
+	  <td colspan="4">Checksum</td>
+        </tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+        <tr>
+        <td> </td>
+        <td>
+            (Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Signature</td>
+          <td>
+            <p>The ASCII character string “<code>FHIB</code>” is used to
+                indicate the beginning of a fractal heap indirect block.  This
+                gives file consistency checking utilities a better chance of
+                reconstructing a damaged file.
+            </p>
+          </td>
+        </tr>
+          
+        <tr>
+          <td>Version</td>
+          <td>
+            <p>This document describes version 0.</p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Heap Header Address</td>
+          <td>
+            <p>This is the address for the fractal heap header that this
+                block belongs to.  This field is principally used for file
+                integrity checking.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Block Offset</td>
+          <td>
+            <p>This is the offset of the block within the fractal heap’s
+                address space (in bytes).  The number of bytes used to encode
+                this field is the <em>Maximum Heap Size</em> (in the heap’s
+                header) divided by 8 and rounded up to the next highest integer,
+                for values that are not a multiple of 8.  This value is
+                principally used for file integrity checking.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Child Direct Block #K Address</td>
+          <td>
+	    <p>This field is the address of the child direct block.
+                The size of the [uncompressed] direct block can be computed by
+                its offset in the heap’s linear address space.  
+            </p>
+          </td>
+        </tr>
+
+	<tr>
+	  <td>Size of Filtered Direct Block #K</td>
+	  <td>
+	    <p>This is the size of the child direct block after passing through
+                the I/O filters defined for this heap (in bytes).  If no I/O
+                filters are present for this heap, this field is not present.
+            </p>
+	  </td>
+	</tr>
+	<tr>
+	  <td>Filter Mask for Direct Block #K</td>
+	  <td>
+            <p>This is the I/O filter mask for the filtered direct block.
+                This mask has the same format as that used for the filter mask
+                in chunked raw data records in a <a href="#V1Btrees">v1 B-tree</a>.
+                If no I/O filters are present for this heap, this field is not
+                present.
+            </p>
+	  </td>
+        </tr>
+
+        <tr>
+          <td>Child Indirect Block #N Address</td>
+          <td>
+	    <p>This field is the address of the child indirect block.
+                The size of the indirect block can be computed by
+                its offset in the heap’s linear address space.  
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Checksum</td>
+          <td>
+            <p>This is the checksum for the indirect block.</p>
+          </td>
+        </tr>
+
+      </table>
+
+    </div>
+
+    <br />
+    <p>An object in the fractal heap is identified by means of a fractal heap ID, 
+	which encodes information to locate the object in the heap.
+	Currently, the fractal heap stores an object in one of three ways,
+        depending on the object’s size:</p>
+
+    <div align="center">
+      <table class="list80">
+        <tr>
+          <th width="20%">Type</th>
+          <th width="80%" align="left">Description</th>
+        </tr>
+
+        <tr>
+          <td align="center">Tiny</td>
+          <td>
+            <p>When an object is small enough to be encoded in the heap ID, the
+            object’s data is embedded in the fractal heap ID itself.  There are
+            2 sub-types for this type of object: normal and extended.  The
+            sub-type for tiny heap IDs depends on whether the heap ID is large
+            enough to store objects greater than 16 bytes or not.  If the
+            heap ID length is 18 bytes or smaller, the ‘normal’ tiny heap ID
+            form is used.  If the heap ID length is greater than 18 bytes in
+            length, the “extented” form is used.  See format description below
+            for both sub-types.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td align="center">Huge</td>
+          <td>
+            <p>When the size of an object is larger than <em>Maximum Size of
+            Managed Objects</em> in the <em>Fractal Heap Header</em>, the
+            object’s data is stored on its own in the file and the object
+            is tracked/indexed via a version 2 B-tree.  All huge objects
+            for a particular fractal heap use the same v2 B-tree.  All huge
+            objects for a particular fractal heap use the same format for
+            their huge object IDs.
+            </p>
+
+            <p>Depending on whether the IDs for a heap are large enough to hold
+            the object’s retrieval information and whether I/O pipeline filters
+            are applied to the heap’s objects, 4 sub-types are derived for
+            huge object IDs for this heap:</p>
+
+            <div align="center">
+              <table class="list">
+                <tr>
+                  <th align="left" width="35%">Sub-type</th>
+                  <th align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="left">Directly accessed, non-filtered</td>
+                  <td>
+                    <p>The object’s address and length are embedded in the
+                    fractal heap ID itself and the object is directly accessed
+                    from them.  This allows the object to be accessed without
+                    resorting to the B-tree.
+                    </p>
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="left">Directly accessed, filtered</td>
+                  <td>
+                    <p>The filtered object’s address, length, filter mask and
+                    de-filtered size are embedded in the fractal heap ID itself
+                    and the object is accessed directly with them.  This allows
+                    the object to be accessed without resorting to the B-tree.
+                    </p>
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="left">Indirectly accessed, non-filtered</td>
+                  <td>
+                    <p>The object is located by using a B-tree key embedded in
+                    the fractal heap ID to retrieve the address and length from
+                    the version 2 B-tree for huge objects.  Then, the address
+                    and length are used to access the object.
+                    </p>
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="left">Indirectly accessed, filtered</td>
+                  <td>
+                    <p>The object is located by using a B-tree key embedded in
+                    the fractal heap ID to retrieve the filtered object’s
+                    address, length, filter mask and de-filtered size from the
+                    version 2 B-tree for huge objects.  Then, this information
+                    is used to access the object.
+                    </p>
+                  </td>
+                </tr>
+              </table>
+            </div>
+
+          </td>
+        </tr>
+
+        <tr>
+          <td align="center">Managed</td>
+          <td>
+            <p>When the size of an object does not meet the above two
+            conditions, the object is stored and managed via the direct and
+            indirect blocks based on the doubling table.
+            </p>
+          </td>
+        </tr>
+      </table>
+    </div>
+    
+
+    <p>The specific format for each type of heap ID is described below:
+    </p>
+
+    <div align="center">
+      <table class="format">
+        <caption>Fractal Heap ID for Tiny Objects (sub-type 1 - ‘Normal’)
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+	</tr>
+
+        <tr>
+          <td>Version, Type & Length</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Data <em>(variable size)</em></td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Version, Type & Length</td>
+          <td>
+            <p>This is a bit field with the following definition:
+            <table class="list">
+                <tr>
+                  <th width="20%">Bit</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>6-7</code></td>
+                  <td>The current version of ID format.  This document
+                    describes version 0.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>4-5</code></td>
+                  <td>The ID type.  Tiny objects have a value of <code>2</code>.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>0-3</code></td>
+                  <td>The length of the tiny object.  The value stored is one
+                    less than the actual length (since zero-length objects are
+                    not allowed to be stored in the heap).
+		    For example, an object of actual length 1 has an encoded
+		    length of 0, an object of actual length 2 has an encoded
+		    length of 1, etc.
+                  </td>
+                </tr>
+	    </table></p>
+            
+          </td>
+        </tr>
+
+        <tr>
+          <td>Data</td>
+          <td>
+            <p>This is the data for the object.
+            </p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>Fractal Heap ID for Tiny Objects (sub-type 2 - ‘Extended’)
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+	</tr>
+
+        <tr>
+          <td>Version, Type & Length</td>
+          <td>Extended Length</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Data <em>(variable size)</em></td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Version, Type & Length</td>
+          <td>
+            <p>This is a bit field with the following definition:
+            <table class="list">
+                <tr>
+                  <th width="20%">Bit</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>6-7</code></td>
+                  <td>The current version of ID format.  This document
+                    describes version 0.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>4-5</code></td>
+                  <td>The ID type.  Tiny objects have a value of <code>2</code>.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>0-3</code></td>
+                  <td>These 4 bits, together with the next byte, form an
+                    unsigned 12-bit integer for holding the length of the
+                    object.  These 4-bits are bits 8-11 of the 12-bit integer.
+                    See description for the <em>Extended Length</em> field below.
+                  </td>
+                </tr>
+	    </table></p>
+            
+          </td>
+        </tr>
+
+        <tr>
+          <td>Extended Length</td>
+          <td>
+            <p>This byte, together with the 4 bits in the previous byte, 
+		forms an unsigned 12-bit integer for holding the length of the
+                tiny object.  These 8 bits are bits 0-7 of the 12-bit integer
+                formed.  The value stored is one less than the actual length
+                (since zero-length objects are not allowed to be stored in the
+                heap).  For example, an object of actual length 1 has an encoded
+		length of 0, an object of actual length 2 has an encoded
+		length of 1, etc.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Data</td>
+          <td>
+            <p>This is the data for the object.
+            </p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>Fractal Heap ID for Huge Objects (sub-type 1 & 2): indirectly accessed, non-filtered/filtered
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td>Version & Type</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />v2 B-tree Key<sup>L</sup><em> (variable size)</em><br /><br /></td>
+        </tr>
+
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Version & Type</td>
+          <td>
+            <p>This is a bit field with the following definition:
+            <table class="list">
+                <tr>
+                  <th width="20%">Bit</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>6-7</code></td>
+                  <td>The current version of ID format.  This document
+                    describes version 0.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>4-5</code></td>
+                  <td>The ID type.  Huge objects have a value of <code>1</code>.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>0-3</code></td>
+                  <td>Reserved.
+                  </td>
+                </tr>
+            </table></p>
+            
+          </td>
+        </tr>
+
+        <tr>
+            <td>v2 B-tree Key</td>
+            <td><p>This field is the B-tree key for retrieving the information
+            from the version 2 B-tree for huge objects needed to access the
+            object.  See the description of <a href="#V2Btrees">v2 B-tree</a>
+            records sub-type 1 & 2 for a description of the fields.  New key
+            values are derived from <em>Next Huge Object ID</em> in the
+            <em>Fractal Heap Header</em>.</p>
+            </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>Fractal Heap ID for Huge Objects (sub-type 3): directly accessed, non-filtered
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td>Version & Type</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Address <sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Length <sup>L</sup><br /><br /></td>
+        </tr>
+
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+        <tr>
+        <td> </td>
+        <td>
+            (Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Version & Type</td>
+          <td>
+            <p>This is a bit field with the following definition:
+            <table class="list">
+                <tr>
+                  <th width="20%">Bit</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>6-7</code></td>
+                  <td>The current version of ID format.  This document
+                    describes version 0.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>4-5</code></td>
+                  <td>The ID type.  Huge objects have a value of <code>1</code>.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>0-3</code></td>
+                  <td>Reserved.
+                  </td>
+                </tr>
+            </table></p>
+            
+          </td>
+        </tr>
+
+        <tr>
+            <td>Address</td>
+            <td><p>This field is the address of the object in the file.</p>
+            </td>
+        </tr>
+
+        <tr>
+            <td>Length</td>
+            <td><p>This field is the length of the object in the file.</p>
+            </td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>Fractal Heap ID for Huge Objects (sub-type 4): directly accessed, filtered
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td>Version & Type</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Address <sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Length <sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Filter Mask</td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />De-filtered Size <sup>L</sup><br /><br /></td>
+        </tr>
+
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td>
+        </tr>
+        <tr>
+        <td> </td>
+        <td>(Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Version & Type</td>
+          <td>
+            <p>This is a bit field with the following definition:
+            <table class="list">
+                <tr>
+                  <th width="20%">Bit</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>6-7</code></td>
+                  <td>The current version of ID format.  This document
+                    describes version 0.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>4-5</code></td>
+                  <td>The ID type.  Huge objects have a value of <code>1</code>.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>0-3</code></td>
+                  <td>Reserved.
+                  </td>
+                </tr>
+            </table></p>
+            
+          </td>
+        </tr>
+
+        <tr>
+            <td>Address</td>
+            <td><p>This field is the address of the filtered object in the file.</p>
+        </td>
+	</tr>
+
+	<tr>
+	    <td>Length</td>
+	    <td><p>This field is the length of the filtered object in the file.</p>
+	    </td>
+	</tr>
+
+	<tr>
+	    <td>Filter Mask</td>
+	    <td><p>This field is the I/O pipeline filter mask for the 
+		filtered object in the file.</p>
+	    </td>
+	</tr>
+
+	<tr>
+	    <td>Filtered Size</td>
+	    <td><p>This field is the size of the de-filtered object in the file.</p>
+	    </td>
+	</tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>Fractal Heap ID for Managed Objects
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+	</tr>
+
+        <tr>
+          <td>Version & Type</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+        <tr>
+          <td colspan="4">Offset <em>(variable size)</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Length <em>(variable size)</em></td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Version & Type</td>
+          <td>
+            <p>This is a bit field with the following definition:
+            <table class="list">
+                <tr>
+                  <th width="20%">Bit</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>6-7</code></td>
+                  <td>The current version of ID format.  This document
+                    describes version 0.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>4-5</code></td>
+                  <td>The ID type.  Managed objects have a value of <code>0</code>.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>0-3</code></td>
+                  <td>Reserved.
+                  </td>
+                </tr>
+	    </table></p>
+            
+          </td>
+        </tr>
+
+        <tr>
+          <td>Offset</td>
+          <td>
+            <p>This field is the offset of the object in the heap.  This field’s
+                size is the minimum number of bytes necessary to encode the
+                <em>Maximum Heap Size</em> value (from the <em>Fractal Heap
+                Header</em>).  For example, if the value of the <em>Maximum
+                Heap Size</em> is less than 256 bytes, this field is 1 byte
+                in length, a <em>Maximum Heap Size</em> of 256-65535 bytes
+                uses a 2 byte length, etc.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Length</td>
+          <td>
+            <p>This field is the length of the object in the heap.
+		It is determined by taking the minimum value of 
+		<em>Maximum Direct Block Size</em>
+		and <em>Maximum Size of Managed Objects</em> in the
+		<em>Fractal Heap Header</em>.  Again, the minimum number of
+                bytes needed to encode that value is used for the size of
+                this field.
+            </p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <h3><a name="FreeSpaceManager">Disk Format: Level 1G - Free-Space Manager</a></h3>
+
+        <p>
+            Free-space managers are used to describe space within a heap or
+            the entire HDF5 file that is not currently used for that heap or
+            file.
+        </p>
+
+        <p>
+            The <em>free-space manager header</em> contains metadata information
+            about the space being tracked, along with the address of the list
+            of <em>free space sections</em> which actually describes the free
+            space. The header records information about free-space sections being
+            tracked, creation parameters for handling free-space sections of a
+            client, and section information used to locate the collection of
+            free-space sections.
+        </p>
+            
+        <p>
+            The <em>free-space section list</em> stores a collection of
+            free-space sections that is specific to each <em>client</em> of the
+            free-space manager.
+
+            For example, the fractal heap is a client of the free space manager
+            and uses it to track unused space within the heap.  There are 4
+            types of section records for the fractal heap, each of which has
+            its own format, listed below.
+        </p>
+
+    <div align="center">
+      <table class="format">
+        <caption>
+          Free-Space Manager Header
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4">Signature</td>
+        </tr>
+          
+        <tr>
+          <td>Version</td>
+          <td>Client ID</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Total Space Tracked<sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Total Number of Sections<sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Number of Serialized Sections<sup>L</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Number of Un-Serialized Sections<sup>L</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Number of Section Classes</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+        <tr>
+          <td colspan="2">Shrink Percent</td>
+          <td colspan="2">Expand Percent</td>
+        </tr>
+
+        <tr>
+          <td colspan="2">Size of Address Space</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+        <tr>
+          <td colspan="4"><br />Maximum Section Size <sup>L</sup><br /><br /></td>
+	</tr>
+
+        <tr>
+          <td colspan="4"><br />Address of Serialized Section List<sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Size of Serialized Section List Used<sup>L</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Allocated Size of Serialized Section List<sup>L</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Checksum</td>
+	</tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+        <tr>
+        <td> </td>
+        <td>
+            (Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="35%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Signature</td>
+          <td>
+            <p>The ASCII character string “<code>FSHD</code>” is used to
+                indicate the beginning of the Free-Space Manager Header.
+                This gives file consistency checking utilities a better chance of
+                reconstructing a damaged file.
+            </p>
+          </td>
+        </tr>
+          
+        <tr>
+          <td>Version</td>
+          <td>
+            <p>This is the version number for the Free-Space Manager Header
+		and this document describes version 0.</p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Client ID</td>
+          <td>
+            <p>This is the client ID for identifying the user of this
+                free-space manager:
+                
+                <table class="list">
+                    <tr>
+                      <th width="20%" align="center">ID</th>
+                      <th width="80%" align="left">Description</th>
+                    </tr>
+                    
+                    <tr>
+                      <td align="center"><code>0</code></td>
+                      <td>Fractal heap
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>1</code></td>
+                      <td>File
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>2+</code></td>
+                      <td>Reserved.
+                      </td>
+                    </tr>
+                </table></p>
+            
+          </td>
+        </tr>
+
+	<tr>
+          <td>Total Space Tracked</td>
+	  <td>
+            <p>This is the total amount of free space being tracked, in bytes.
+            </p>
+          </td>
+	</tr>
+
+        <tr>
+          <td>Total Number of Sections</td>
+          <td>
+	    <p>This is the total number of free-space sections being tracked.
+            </p>
+          </td>
+        </tr>
+
+	<tr>
+	  <td>Number of Serialized Sections</td>
+	  <td>
+	    <p>This is the number of serialized free-space sections being
+                tracked.
+            </p>
+	  </td>
+	</tr>
+	<tr>
+	  <td>Number of Un-Serialized Sections</td>
+	  <td>
+            <p>This is the number of un-serialized free-space sections being
+                managed.  Un-serialized sections are created by the free-space
+                client when the list of sections is read in.
+            </p>
+	  </td>
+        </tr>
+
+        <tr>
+          <td>Number of Section Classes</td>
+          <td>
+	    <p>This is the number of section classes handled by this free space
+                manager for the free-space client.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Shrink Percent</td>
+          <td>
+	    <p>This is the percent of current size to shrink the allocated
+                serialized free-space section list.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Expand Percent</td>
+          <td>
+	    <p>This is the percent of current size to expand the allocated
+                serialized free-space section list.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Size of Address Space</td>
+          <td>
+            <p>This is the size of the address space that free-space sections
+                are within.  This is stored as the log<sub>2</sub> of the
+                actual value (in other words, the number of bits required 
+                to store values within that address space).
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Maximum Section Size</td>
+          <td>
+            <p>This is the maximum size of a section to be tracked.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Address of Serialized Section List</td>
+          <td>
+            <p>This is the address where the serialized free-space section
+                list is stored.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Size of Serialized Section List Used</td>
+          <td>
+            <p>This is the size of the serialized free-space section
+                list used (in bytes).  This value must be less than
+                or equal to the <em>allocated size of serialized section
+                list</em>, below.
+	    </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Allocated Size of Serialized Section List</td>
+          <td>
+            <p>This is the size of serialized free-space section list
+                actually allocated (in bytes).
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Checksum</td>
+          <td>
+            <p>This is the checksum for the free-space manager header.</p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <p>
+        The free-space sections being managed are stored in a <em>free-space
+        section list</em>, described below.  The sections in the <em>free-space
+        section list</em> are stored in the following way: a count of the
+        number of
+        sections describing a particular size of free space and the size of the
+        free-space described (in bytes), followed by a list of section
+        description records; then another section count & size, followed by
+        the list of section descriptions for that size; etc.
+    </p>
+
+    <div align="center">
+      <table class="format">
+        <caption>
+          Free-Space Section List
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4">Signature</td>
+        </tr>
+        
+        <tr>
+          <td>Version</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Free-Space Manager Header Address<sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Number of Section Records in Set #0 <em>(variable size)</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Size of Free-Space Section Described in Record Set #0 <em>(variable size)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Record Set #0 Section Record #0 Offset<em>(variable size)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="1">Record Set #0 Section Record #0 Type</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Record Set #0 Section Record #0 Data <em>(variable size)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">...</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Record Set #0 Section Record #K-1 Offset<em>(variable size)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="1">Record Set #0 Section Record #K-1 Type</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Record Set #0 Section Record #K-1 Data <em>(variable size)</em></td>
+	</tr>
+
+        <tr>
+          <td colspan="4">Number of Section Records in Set #1 <em>(variable size)</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Size of Free-Space Section Described in Record Set #1 <em>(variable size)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Record Set #1 Section Record #0 Offset<em>(variable size)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="1">Record Set #1 Section Record #0 Type</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Record Set #1 Section Record #0 Data <em>(variable size)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">...</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Record Set #1 Section Record #K-1 Offset<em>(variable size)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="1">Record Set #1 Section Record #K-1 Type</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Record Set #1 Section Record #K-1 Data <em>(variable size)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><strong>...</strong></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><strong>...</strong></td>
+	</tr>
+
+        <tr>
+          <td colspan="4">Number of Section Records in Set #N-1 <em>(variable size)</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Size of Free-Space Section Described in Record Set #N-1 <em>(variable size)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Record Set #N-1 Section Record #0 Offset<em>(variable size)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="1">Record Set #N-1 Section Record #0 Type</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Record Set #N-1 Section Record #0 Data <em>(variable size)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">...</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Record Set #N-1 Section Record #K-1 Offset<em>(variable size)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="1">Record Set #N-1 Section Record #K-1 Type</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Record Set #N-1 Section Record #K-1 Data <em>(variable size)</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Checksum</td>
+	</tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="35%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Signature</td>
+          <td>
+            <p>The ASCII character string “<code>FSSE</code>” is used to
+                indicate the beginning of the Free-Space Section Information.
+                This gives file consistency checking utilities a better chance of
+                reconstructing a damaged file.
+            </p>
+          </td>
+        </tr>
+          
+        <tr>
+          <td>Version</td>
+          <td>
+            <p>This is the version number for the Free-Space Section List
+		and this document describes version 0.</p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Free-Space Manager Header Address</td>
+          <td>
+            <p>This is the address of the <em>Free-Space Manager Header</em>.
+                This field is principally used for file
+                integrity checking.
+            </p>
+          </td>
+        </tr>
+
+	<tr>
+          <td>Number of Section Records for Set #N</td>
+	  <td>
+            <p>This is the number of free-space section records for set #N.
+		The length of this field is the minimum number of bytes needed
+                to store the <em>number of serialized sections</em> (from the
+                <em>free-space manager header</em>).
+            </p>
+
+            <p>
+                The number of sets of free-space section records is
+                determined by the <em>size of serialized section list</em> in
+                the <em>free-space manager header</em>.
+            </p>
+          </td>
+	</tr>
+
+        <tr>
+          <td>Section Size for Record Set #N</td>
+          <td>
+	    <p>This is the size (in bytes) of the free-space section described
+                for <em>all</em> the section records in set #N.
+            </p>
+
+            <p>
+		The length of this field is the minimum number of bytes needed
+                to store the <em>maximum section size</em> (from the
+                <em>free-space manager header</em>).
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Record Set #N Section #K Offset</td>
+          <td>
+	    <p>This is the offset (in bytes) of the free-space section within
+                the client for the free-space manager.
+            </p>
+
+            <p>
+		The length of this field is the minimum number of bytes needed
+                to store the <em>size of address space</em> (from the
+                <em>free-space manager header</em>).
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Record Set #N Section #K Type</td>
+          <td>
+	    <p>This is the type of the section record, used to decode the
+        <em>record set #N section #K data</em> information. The defined 
+        record type for <em>file</em> client is:
+        
+                <table class="list">
+                    <tr>
+                      <th width="20%">Type</th>
+                      <th width="80%" align="left">Description</th>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>0</code></td>
+                      <td>File’s section (a range of actual bytes in file)
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>1+</code></td>
+                      <td>Reserved.
+                      </td>
+                    </tr>
+                </table></p>
+	    
+	    <p>The defined record types for a <em>fractal heap</em> client are:
+        
+                <table class="list">
+                    <tr>
+                      <th width="20%">Type</th>
+                      <th width="80%" align="left">Description</th>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>0</code></td>
+                      <td>Fractal heap “single” section
+                      </td>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>1</code></td>
+                      <td>Fractal heap “first row” section
+                      </td>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>2</code></td>
+                      <td>Fractal heap “normal row” section
+                      </td>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>3</code></td>
+                      <td>Fractal heap “indirect” section
+                      </td>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>4+</code></td>
+                      <td>Reserved.
+                      </td>
+                    </tr>
+                </table></p>
+            
+          </td>
+        </tr>
+
+        <tr>
+          <td>Record Set #N Section #K Data</td>
+          <td>
+	    <p>This is the section-type specific information for each record
+                in the record set, described below.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Checksum</td>
+          <td>
+	    <p>This is the checksum for the <em>Free-Space Section List</em>.
+            </p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <p>
+        The section-type specific data for each free-space section record is
+        described below:
+    </p>
+
+    <div align="center">
+      <table class="format">
+        <caption>
+          File’s Section Data Record
+        </caption>
+
+        <tr>
+          <td colspan="4"><em>No additional record data stored</em></td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Fractal Heap “Single” Section Data Record
+        </caption>
+
+        <tr>
+          <td colspan="4"><em>No additional record data stored</em></td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Fractal Heap “First Row” Section Data Record
+        </caption>
+
+        <tr>
+          <td colspan="4"><em>Same format as “indirect” section data</em></td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Fractal Heap “Normal Row” Section Data Record
+        </caption>
+
+        <tr>
+          <td colspan="4"><em>No additional record data stored</em></td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Fractal Heap “Indirect” Section Data Record
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4">Fractal Heap Indirect Block Offset <em>(variable size)</em></td>
+        </tr>
+
+        <tr>
+          <td colspan="2">Block Start Row</td>
+          <td colspan="2">Block Start Column</td>
+        </tr>
+
+        <tr>
+          <td colspan="2">Number of Blocks</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Fractal Heap Block Offset</td>
+          <td>
+            <p>The offset of the indirect block in the fractal heap’s address
+                space containing the empty blocks.
+            </p>
+            <p>
+                The number of bytes used to encode this field is the minimum
+                number of bytes needed to encode values for the <em>Maximum
+                Heap Size</em> (in the fractal heap’s header).
+            </p>
+          </td>
+        </tr>
+          
+        <tr>
+          <td>Block Start Row</td>
+          <td>
+            <p>This is the row that the empty blocks start in.
+	    </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Block Start Column</td>
+          <td>
+            <p>This is the column that the empty blocks start in.
+	    </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Number of Blocks</td>
+          <td>
+            <p>This is the number of empty blocks covered by the section.
+	    </p>
+          </td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <h3><a name="SOHMTable">Disk Format: Level 1H - Shared Object Header Message Table</a></h3>
+
+        <p>
+            The <em>shared object header message table</em> is used to locate
+            object
+            header messages that are shared between two or more object headers
+            in the file.  Shared object header messages are stored and indexed
+            in the file in one of two ways: indexed sequentially in a
+            <em>shared header message list</em> or indexed with a v2 B-tree.
+            The shared messages themselves are either stored in a fractal
+            heap (when two or more objects share the message), or remain in an
+            object’s header (when only one object uses the message currently,
+            but the message can be shared in the future).
+        </p>
+
+        <p>
+            The <em>shared object header message table</em>
+            contains a list of shared message index headers.  Each index header
+            records information about the version of the index format, the index
+            storage type, flags for the message types indexed, the number of
+            messages in the index, the address where the index resides,
+            and the fractal heap address if shared messages are stored there.
+        </p>
+
+        <p>
+            Each index can be either a list or a v2 B-tree and may transition
+            between those two forms as the number of messages in the index
+            varies.  Each shared message record contains information used to
+            locate the shared message from either a fractal heap or an object
+            header.  The types of messages that can be shared are: <em>Dataspace,
+            Datatype, Fill Value, Filter Pipeline and Attribute</em>.
+        </p>
+
+        <p>
+            The <em>shared object header message table</em> is pointed to
+            from a <a href="#SOHMTableMessage">shared message table</a> message
+            in the superblock extension for a file.  This message stores the
+            version of the table format, along with the number of index headers
+            in the table.
+        </p>
+
+    <div align="center">
+      <table class="format">
+        <caption>
+          Shared Object Header Message Table
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4">Signature</td>
+        </tr>
+          
+        <tr>
+          <td>Version for index #0</td>
+          <td>Index Type for index #0</td>
+          <td colspan="2">Message Type Flags for index #0</td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Minimum Message Size for index #0</td>
+        </tr>
+
+        <tr>
+          <td colspan="2">List Cutoff for index #0</td>
+          <td colspan="2">v2 B-tree Cutoff for index #0</td>
+        </tr>
+
+        <tr>
+          <td colspan="2">Number of Messages for index #0</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Index Address<sup>O</sup> for index #0<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Fractal Heap Address<sup>O</sup> for index #0<br /><br /></td>
+	</tr>
+
+        <tr>
+          <td colspan="4">...</td>
+	</tr>
+
+        <tr>
+          <td colspan="4">...</td>
+	</tr>
+
+        <tr>
+          <td>Version for index #N-1</td>
+          <td>Index Type for index #N-1</td>
+          <td colspan="2">Message Type Flags for index #N-1</td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Minimum Message Size for index #N-1</td>
+        </tr>
+
+        <tr>
+          <td colspan="2">List Cutoff for index #N-1</td>
+          <td colspan="2">v2 B-tree Cutoff for index #N-1</td>
+        </tr>
+
+        <tr>
+          <td colspan="2">Number of Messages for index #N-1</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Index Address<sup>O</sup> for index #N-1<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Fractal Heap Address<sup>O</sup> for index #N-1<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Checksum</td>
+	</tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="35%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Signature</td>
+          <td>
+            <p>The ASCII character string “<code>SMTB</code>” is used to
+                indicate the beginning of the Shared Object Header Message table.
+                This gives file consistency checking utilities a better chance of
+                reconstructing a damaged file.
+            </p>
+          </td>
+        </tr>
+          
+        <tr>
+          <td>Version for index #N</td>
+          <td>
+            <p>This is the version number for the list of shared object header message
+		indexes and this document describes version 0.</p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Index Type for index #N</td>
+          <td>
+            <p>The type of index can be an unsorted list or a v2 B-tree.
+            </p>
+          </td>
+        </tr>
+
+	<tr>
+          <td>Message Type Flags for index #N</td>
+	  <td>
+            <p>This field indicates the type of messages tracked in the index,
+                as follows:
+                <table class="list">
+                    <tr>
+                      <th width="20%">Bits</th>
+                      <th width="80%" align="left">Description</th>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>0</code></td>
+                      <td>If set, the index tracks <em>Dataspace Messages</em>.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>1</code></td>
+                      <td>If set, the message tracks <em>Datatype Messages</em>.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>2</code></td>
+                      <td>If set, the message tracks <em>Fill Value Messages</em>.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>3</code></td>
+                      <td>If set, the message tracks <em>Filter Pipeline Messages</em>.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>4</code></td>
+                      <td>If set, the message tracks <em>Attribute Messages</em>.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>5-15</code></td>
+                      <td>Reserved (zero).
+                      </td>
+                    </tr>
+                </table></p>
+            
+
+            <p>
+                An index can track more than one type of message, but each type
+                of message can only by in one index.
+            </p>
+          </td>
+	</tr>
+
+        <tr>
+          <td>Minimum Message Size for index #N</td>
+          <td>
+	    <p>This is the message size sharing threshold for the index.
+		If the encoded size of the message is less than this value, the
+                message is not shared.
+            </p>
+          </td>
+        </tr>
+
+	<tr>
+	  <td>List Cutoff for index #N</td>
+	  <td>
+	    <p>This is the cutoff value for the indexing of messages to
+                switch from a list to a v2 B-tree.  If the number of messages
+                is greater than this value, the index should be a v2 B-tree.
+            </p>
+	  </td>
+	</tr>
+	<tr>
+	  <td>v2 B-tree Cutoff for index #N</td>
+	  <td>
+            <p>This is is the cutoff value for the indexing of messages to 
+		switch from a v2 B-tree back to a list.  If the number of
+                messages is less than this value, the index should be a list.
+            </p>
+	  </td>
+        </tr>
+
+        <tr>
+          <td>Number of Messages for index #N</td>
+          <td>
+	    <p>The number of shared messages being tracked for the index.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Index Address for index #N</td>
+          <td>
+	    <p>This field is the address of the list or v2 B-tree where the
+                index nodes reside.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Fractal Heap Address for index #N</td>
+          <td>
+	    <p>This field is the address of the fractal heap if shared messages
+                are stored there.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Checksum</td>
+          <td>
+            <p>This is the checksum for the table.</p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <p>
+        Shared messages are indexed either with a <em>shared message record
+        list</em>, described below, or using a v2 B-tree (using record type 7).
+        The number of records in the <em>shared message record list</em> is
+        determined in the index’s entry in the <em>shared object header message
+        table</em>.
+    </p>
+
+    <div align="center">
+      <table class="format">
+        <caption>
+          Shared Message Record List
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4">Signature</td>
+        </tr>
+          
+        <tr>
+          <td colspan="4">Shared Message Record #0</td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Shared Message Record #1</td>
+        </tr>
+
+        <tr>
+          <td colspan="4">...</td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Shared Message Record #N-1</td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Checksum</td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Signature</td>
+          <td>
+            <p>The ASCII character string “<code>SMLI</code>” is used to
+                indicate the beginning of a list of index nodes.
+                This gives file consistency checking utilities a better chance of
+                reconstructing a damaged file.
+            </p>
+          </td>
+        </tr>
+          
+        <tr>
+          <td>Shared Message Record #N</td>
+          <td>
+            <p>The record for locating the shared message, either in the
+                fractal heap for the index, or an object header (see format for
+                <em>index nodes</em> below).
+	    </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Checksum</td>
+          <td>
+            <p>This is the checksum for the list.
+            </p>
+          </td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <p>
+        The record for each shared message in an index is stored in one of the
+        following forms:
+    </p>
+
+    <div align="center">
+      <table class="format">
+        <caption>
+          Shared Message Record, for messages stored in a fractal heap
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td>Message Location</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+          
+        <tr>
+          <td colspan="4">Hash Value</td>
+        </tr>
+
+        <tr>
+          <td colspan="4">Reference Count</td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Fractal Heap ID<br /><br /></td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Message Location</td>
+          <td>
+            <p>This has a value of 0 indicating that the message is stored in
+                the heap.
+            </p>
+          </td>
+        </tr>
+          
+        <tr>
+          <td>Hash Value</td>
+          <td>
+            <p>This is the hash value for the message.
+	    </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Reference Count</td>
+          <td>
+            <p>This is the number of times the message is used in the file.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Fractal Heap ID</td>
+          <td>
+	    <p>This is an 8-byte fractal heap ID for the message as stored in
+                the fractal heap for the index.
+            </p>
+          </td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Shared Message Record, for messages stored in an object header
+        </caption>
+
+        <tr>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+          <th>byte</th>
+        </tr>
+
+        <tr>
+          <td>Message Location</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+        </tr>
+          
+        <tr>
+          <td colspan="4">Hash Value</td>
+        </tr>
+
+        <tr>
+          <td>Reserved</td>
+          <td>Message Type</td>
+          <td colspan="2">Creation Index</td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Object Header Address<sup>O</sup><br /><br /></td>
+        </tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Message Location</td>
+          <td>
+            <p>This has a value of 1 indicating that the message is stored in
+                an object header.
+            </p>
+          </td>
+        </tr>
+          
+        <tr>
+          <td>Hash Value</td>
+          <td>
+            <p>This is the hash value for the message.
+	    </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Message Type</td>
+          <td>
+            <p>This is the message type in the object header.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Creation Index</td>
+          <td>
+	    <p>This is the creation index of the message within the object
+                header.
+            </p>
+          </td>
+        </tr>
+
+        <tr>
+          <td>Object Header Address</td>
+          <td>
+	    <p>This is the address of the object header where the message is
+                located.
+            </p>
+          </td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <hr />
+
+    <h2><a name="DataObject">Disk Format: Level 2 - Data Objects </a></h2>
+
+    <p>Data objects contain the “real” user-visible information in the file.
+      These objects compose the scientific data and other information which
+      are generally thought of as “data” by the end-user.  All the
+      other information in the file is provided as a framework for
+      storing and accessing these data objects.
+    </p>
+
+    <p>A data object is composed of header and data
+      information.  The header information contains the information
+      needed to interpret the data information for the object as
+      well as additional “metadata” or pointers to additional
+      “metadata” used to describe or annotate each object.
+    </p>
+
+    <h3><a name="ObjectHeader">
+	Disk Format: Level 2A - Data Object Headers</a></h3>
+
+    <p>The header information of an object is designed to encompass
+      all the information about an object, except for the data itself.
+      This information includes
+      the dataspace, datatype, information about how the data
+      is stored on disk (in external files, compressed, broken up in
+      blocks, etc.), as well as other information used by the library
+      to speed up access to the data objects or maintain a file’s
+      integrity.  Information stored by user applications as attributes
+      is also stored in the object’s header.  The header of each object is
+      not necessarily located immediately prior to the object’s data in the
+      file and in fact may be located in any position in the file.  The order
+      of the messages in an object header is not significant.
+    </p>
+
+    <p>Object headers are composed of a prefix and a set of messages.  The
+      prefix contains the information needed to interpret the messages and
+      a small amount of metadata about the object, and the messages contain
+      the majority of the metadata about the object.
+    </p>
+
+    <h3><a name="ObjectHeaderPrefix">
+	Disk Format: Level 2A1 - Data Object Header Prefix</a></h3>
+
+    <h4><a name="V1ObjectHeaderPrefix">
+	Version 1 Data Object Header Prefix</a></h4>
+
+    <p>Header messages are aligned on 8-byte boundaries for version 1 
+        object headers.
+    </p>
+
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Version 1 Object Header
+	</caption>
+
+	<tr>
+	  <th>byte</th>
+	  <th>byte</th>
+	  <th>byte</th>
+	  <th>byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>Reserved (zero)</td>
+	  <td colspan="2">Total Number of Header Messages</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Object Reference Count</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Object Header Size</td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Header Message Type #1</td>
+	  <td colspan="2">Size of Header Message Data #1</td>
+	</tr>
+
+	<tr>
+	  <td>Header Message #1 Flags</td>
+	  <td colspan="3">Reserved (zero)</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Header Message Data #1<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">.<br />.<br />.<br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Header Message Type #n</td>
+	  <td colspan="2">Size of Header Message Data #n</td>
+	</tr>
+
+	<tr>
+	  <td>Header Message #n Flags</td>
+	  <td colspan="3">Reserved (zero)</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Header Message Data #n<br /><br /></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>
+            <p>This value is used to determine the format of the
+                information in the object header.  When the format of the
+                object header is changed, the version number
+                is incremented and can be used to determine how the
+                information in the object header is formatted.  This
+                is version one (1) (there was no version zero (0)) of the
+                object header.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Total Number of Header Messages</td>
+	  <td>
+            <p>This value determines the total number of messages listed in
+                object headers for this object.  This value includes the messages
+                in continuation messages for this object.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Object Reference Count</td>
+	  <td>
+            <p>This value specifies the number of “hard links” to this object
+                within the current file.  References to the object from external
+                files, “soft links” in this file and object references in this
+                file are not tracked.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Object Header Size</td>
+	  <td>
+            <p>This value specifies the number of bytes of header message data
+                following this length field that contain object header messages
+                for this object header.  This value does not include the size of
+                object header continuation blocks for this object elsewhere in the
+                file.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Header Message #n Type</td>
+	  <td>
+            <p>This value specifies the type of information included in the
+                following header message data.  The message types for 
+                header messages are defined in sections below.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Size of Header Message #n Data</td>
+	  <td>
+            <p>This value specifies the number of bytes of header
+                message data following the header message type and length
+                information for the current message. The size includes
+                padding bytes to make the message a multiple of eight
+                bytes.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Header Message #n Flags</td>
+	  <td>
+            <p>This is a bit field with the following definition:
+            <table class="list">
+                <tr>
+                  <th width="20%">Bit</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>0</code></td>
+                  <td>If set, the message data is constant.  This is used
+                    for messages like the datatype message of a dataset.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>1</code></td>
+                  <td>If set, the message is <em>shared</em> and stored 
+                    in another location than the object header.  The Header
+                    Message Data field contains a Shared Message
+                    (described in the <a href="#ObjectHeaderMessages">Data Object Header Messages</a>
+                    section below)
+                    and the Size of Header Message Data field
+                    contains the size of that Shared Message.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>2</code></td>
+                  <td>If set, the message should not be shared.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>3</code></td>
+                  <td>If set, the HDF5 decoder should fail to open this object
+                    if it does not understand the message’s type and the file
+                    is open with permissions allowing write access to the file.
+                    (Normally, unknown messages can just be ignored by HDF5
+                    decoders)
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>4</code></td>
+                  <td>If set, the HDF5 decoder should set bit 5 of this
+                    message’s flags (in other words, this bit field) 
+                    if it does not understand the message’s type 
+                    and the object is modified in any way. (Normally, 
+                    unknown messages can just be ignored by HDF5
+                    decoders)
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>5</code></td>
+                  <td>If set, this object was modified by software that did not
+                    understand this message.
+                    (Normally, unknown messages should just be ignored by HDF5
+                    decoders)  (Can be used to invalidate an index or a similar
+                    feature)
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>6</code></td>
+                  <td>If set, this message is shareable.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>7</code></td>
+                  <td>If set, the HDF5 decoder should always fail to open this
+                    object if it does not understand the message’s type (whether
+                    it is open for read-only or read-write access).  (Normally,
+                    unknown messages can just be ignored by HDF5 decoders)
+                  </td>
+                </tr>
+	    </table></p>
+            
+          </td>
+        </tr>
+
+	<tr>
+	  <td>Header Message #n Data</td>
+	  <td>
+            <p>The format and length of this field is determined by the
+                header message type and size respectively.  Some header
+                message types do not require any data and this information
+                can be eliminated by setting the length of the message to
+                zero. The data is padded with enough zeroes to make the
+                size a multiple of eight.
+            </p>
+          </td>
+	</tr>
+      </table>
+    </div>
+
+    <h4><a name="V2ObjectHeaderPrefix">
+	Version 2 Data Object Headers</a></h4>
+
+    <p>Note that the “total number of messages” field has been dropped from
+        the data object header prefix in this version.  The number of messages
+        in the data object header is just determined by the messages encountered
+        in all the object header blocks.</p>
+
+    <p>Note also that the fields and messages in this version of data object
+        headers have <em>no</em> alignment or padding bytes inserted - they are 
+        stored packed together.</p>
+
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Version 2 Object Header
+	</caption>
+
+	<tr>
+	  <th>byte</th>
+	  <th>byte</th>
+	  <th>byte</th>
+	  <th>byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Signature</td>
+	</tr>
+	<tr>
+	  <td>Version</td>
+	  <td>Flags</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Access time <em>(optional)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Modification Time <em>(optional)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Change Time <em>(optional)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Birth Time <em>(optional)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Maximum # of compact attributes <em>(optional)</em></td>
+	  <td colspan="2">Minimum # of dense attributes <em>(optional)</em></td>
+	</tr>
+
+	<tr>
+	  <td>Size of Chunk #0 <em>(variable size)</em></td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td>Header Message Type #1</td>
+	  <td colspan="2">Size of Header Message Data #1</td>
+	  <td>Header Message #1 Flags</td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Header Message #1 Creation Order <em>(optional)</em></td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Header Message Data #1<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">.<br />.<br />.<br /></td>
+	</tr>
+
+	<tr>
+	  <td>Header Message Type #n</td>
+	  <td colspan="2">Size of Header Message Data #n</td>
+	  <td>Header Message #n Flags</td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Header Message #n Creation Order <em>(optional)</em></td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Header Message Data #n<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Gap <em>(optional, variable size)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Checksum</td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Signature</td>
+	  <td>
+            <p>The ASCII character string “<code>OHDR</code>”
+                is used to indicate the
+                beginning of an object header.  This gives file consistency
+                checking utilities a better chance of reconstructing a
+                damaged file.
+	    </p>
+	  </td>
+	</tr>
+	
+	<tr>
+	  <td>Version</td>
+	  <td>
+            <p>This field has a value of 2 indicating version 2 of the object header.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Flags</td>
+	  <td>
+            <p>This field is a bit field indicating additional information
+                about the object header.
+            <table class="list">
+                <tr>
+                  <th width="20%">Bit(s)</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>0-1</code></td>
+                  <td>This two bit field determines the size of the
+                    <em>Size of Chunk #0</em> field.  The values are:
+                    <table class="list">
+                        <tr>
+                          <th width="20%">Value</th>
+                          <th width="80%" align="left">Description</th>
+                        </tr>
+
+                        <tr>
+                          <td align="center"><code>0</code></td>
+                          <td>The <em>Size of Chunk #0</em> field is 1 byte.
+                          </td>
+                        </tr>
+                        <tr>
+                          <td align="center"><code>1</code></td>
+                          <td>The <em>Size of Chunk #0</em> field is 2 bytes.
+                          </td>
+                        </tr>
+                        <tr>
+                          <td align="center"><code>2</code></td>
+                          <td>The <em>Size of Chunk #0</em> field is 4 bytes.
+                          </td>
+                        </tr>
+                        <tr>
+                          <td align="center"><code>3</code></td>
+                          <td>The <em>Size of Chunk #0</em> field is 8 bytes.
+                          </td>
+                        </tr>
+                    </table></p>
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>2</code></td>
+                  <td>If set, attribute creation order is tracked.</td>
+                </tr>
+                <tr>
+                  <td align="center"><code>3</code></td>
+                  <td>If set, attribute creation order is indexed.</td>
+                </tr>
+                <tr>
+                  <td align="center"><code>4</code></td>
+                  <td>If set, non-default attribute storage phase change
+                      values are stored.</td>
+                </tr>
+                <tr>
+                  <td align="center"><code>5</code></td>
+                  <td>If set, access, modification, change and birth times
+                      are stored.</td>
+                </tr>
+                <tr>
+                  <td align="center"><code>6-7</code></td>
+                  <td>Reserved</td>
+                </tr>
+	    </table></p>
+            
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Access Time</td>
+	  <td>
+            <p>This 32-bit value represents the number of seconds after the
+                UNIX epoch when the object’s raw data was last accessed 
+                (in other  words, read or written).
+            </p>
+	    <p>This field is present if bit 5 of <em>flags</em> is set.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Modification Time</td>
+	  <td>
+            <p>This 32-bit value represents the number of seconds after 
+            the UNIX epoch when the object’s raw data was last 
+            modified (in other words, written).
+            </p>
+	    <p>This field is present if bit 5 of <em>flags</em> is set.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Change Time</td>
+	  <td>
+            <p>This 32-bit value represents the number of seconds after the
+                UNIX epoch when the object’s metadata was last changed.
+            </p>
+	    <p>This field is present if bit 5 of <em>flags</em> is set.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Birth Time</td>
+	  <td>
+            <p>This 32-bit value represents the number of seconds after the
+                UNIX epoch when the object was created.
+            </p>
+	    <p>This field is present if bit 5 of <em>flags</em> is set.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Maximum # of compact attributes</td>
+	  <td>
+            <p>This is the maximum number of attributes to store in the compact
+                format before switching to the indexed format.
+            </p>
+	    <p>This field is present if bit 4 of <em>flags</em> is set.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Minimum # of dense attributes</td>
+	  <td>
+            <p>This is the minimum number of attributes to store in the indexed
+                format before switching to the compact format.
+            </p>
+	    <p>This field is present if bit 4 of <em>flags</em> is set.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Size of Chunk #0</td>
+	  <td>
+            <p>
+               This unsigned value specifies the number of bytes of header
+               message data following this field that contain object header
+               information.
+            </p>
+            <p>
+               This value does not include the size of object header
+               continuation blocks for this object elsewhere in the file.
+            </p>
+            <p>
+	       The length of this field varies depending on bits 0 and 1 of
+	       the <em>flags</em> field.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Header Message #n Type</td>
+	  <td>
+            <p>Same format as version 1 of the object header, described above.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Size of Header Message #n Data</td>
+	  <td>
+            <p>This value specifies the number of bytes of header
+                message data following the header message type and length
+                information for the current message. The size of messages
+                in this version does <em>not</em> include any padding bytes.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Header Message #n Flags</td>
+	  <td>
+            <p>Same format as version 1 of the object header, described above.
+            </p>
+          </td>
+        </tr>
+
+	<tr>
+	  <td>Header Message #n Creation Order</td>
+	  <td>
+            <p>This field stores the order that a message of a given type
+                was created in.
+            </p>
+	    <p>This field is present if bit 2 of <em>flags</em> is set.
+            </p>
+          </td>
+        </tr>
+
+	<tr>
+	  <td>Header Message #n Data</td>
+	  <td>
+            <p>Same format as version 1 of the object header, described above.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Gap</td>
+	  <td>
+            <p>A gap in an object header chunk is inferred by the end of the
+                messages for the chunk before the beginning of the chunk’s
+                checksum.  Gaps are always smaller than the size of an
+                object header message prefix (message type + message size +
+                message flags).
+            </p>
+            <p>Gaps are formed when a message (typically an attribute message)
+                in an earlier chunk is deleted and a message from a later
+                chunk that does not quite fit into the free space is moved
+                into the earlier chunk.
+            </p>
+          </td>
+	</tr>
+
+        <tr>
+          <td>Checksum</td>
+          <td>
+            <p>This is the checksum for the object header chunk.
+            </p>
+          </td>
+        </tr>
+      </table>
+    </div>
+
+    <p>The header message types and the message data associated with
+      them compose the critical “metadata” about each object.  Some
+      header messages are required for each object while others are
+      optional.  Some optional header messages may also be repeated
+      several times in the header itself, the requirements and number
+      of times allowed in the header will be noted in each header
+      message description below.
+    </p>
+
+    <br />
+    <hr />
+
+    <h3><a name="ObjectHeaderMessages">
+	Disk Format: Level 2A2 - Data Object Header Messages</a></h3>
+
+    <p>Data object header messages are small pieces of metadata that are
+      stored in the data object header for each object in an HDF5 file.
+      Data object header messages provide the metadata required to describe
+      an object and its contents, as well as optional pieces of metadata
+      that annotate the meaning or purpose of the object.
+    </p>
+
+    <p>Data object header messages are either stored directly in the data
+      object header for the object or are shared between multiple objects
+      in the file.  When a message is shared, a flag in the <em>Message Flags</em>
+      indicates that the actual <em>Message Data</em>
+      portion of that message is stored in another location (such as another
+      data object header, or a heap in the file) and the <em>Message Data</em>
+      field contains the information needed to locate the actual information
+      for the message.
+    </p>
+
+    <p class="item">
+    The format of shared message data is described here:</p>
+
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Shared Message (Version 1)
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>Type</td>
+	  <td colspan="2">Reserved (zero)</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Reserved (zero)</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
+	</tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td><p>The version number is used when there are changes in the format
+            of a shared object message and is described here:
+	    <table class="list">
+	      <tr>
+		<th width="20%">Version</th>
+		<th width="80%" align="left">Description</th>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>0</code></td>
+		<td>Never used.</td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>1</code></td>
+		<td>Used by the library before version 1.6.1.
+                </td>
+	      </tr>
+	    </table></p>
+        </td>
+	</tr>
+
+	<tr>
+	  <td>Type</td>
+	  <td><p>The type of shared message location:
+	    <table class="list">
+	      <tr>
+		<th width="20%">Value</th>
+		<th width="80%" align="left">Description</th>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>0</code></td>
+		<td>Message stored in another object’s header (a <em>committed</em>
+                    message).
+                </td>
+	      </tr>
+	    </table></p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Address</td>
+	  <td><p>The address of the object header
+            containing the message to be shared.</p>
+          </td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Shared Message (Version 2)
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>Type</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
+	</tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td><p>The version number is used when there are changes in the format
+            of a shared object message and is described here:
+	    <table class="list">
+	      <tr>
+		<th width="20%">Version</th>
+		<th width="80%" align="left">Description</th>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>2</code></td>
+		<td>Used by the library of version 1.6.1 and after.
+                </td>
+	      </tr>
+	    </table></p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Type</td>
+	  <td><p>The type of shared message location:
+	    <table class="list">
+	      <tr>
+		<th width="20%">Value</th>
+		<th width="80%" align="left">Description</th>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>0</code></td>
+		<td>Message stored in another object’s header (a <em>committed</em>
+                    message).
+                </td>
+	      </tr>
+	    </table></p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Address</td>
+	  <td><p>The address of the object header
+            containing the message to be shared.</p></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Shared Message (Version 3)
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>Type</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Location <em>(variable size)</em></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td><p>The version number indicates changes in the format of shared 
+	    object message and is described here:
+	    <table class="list">
+	      <tr>
+		<th width="20%">Version</th>
+		<th width="80%" align="left">Description</th>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>3</code></td>
+		<td>Used by the library of version 1.8 and after.  In this
+                    version, the <em>Type</em> field can indicate that
+                    the message is stored in the fractal heap.
+                </td>
+	      </tr>
+	    </table></p>
+        </td>
+	</tr>
+
+	<tr>
+	  <td>Type</td>
+	  <td><p>The type of shared message location:
+	    <table class="list">
+	      <tr>
+		<th width="20%">Value</th>
+		<th width="80%" align="left">Description</th>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>0</code></td>
+		<td>Message is not shared and is not shareable.
+                </td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>1</code></td>
+		<td>Message stored in file’s <em>shared object header message</em>
+                    heap (a <em>shared</em> message).
+                </td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>2</code></td>
+		<td>Message stored in another object’s header (a <em>committed</em>
+                    message).
+                </td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>3</code></td>
+		<td>Message stored is not shared, but is sharable.
+                </td>
+	      </tr>
+
+	    </table></p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Location</td>
+	  <td><p>This field contains either a <em>Size of Offsets</em>-bytes
+            address of the object header
+            containing the message to be shared, or an 8-byte fractal heap ID
+            for the message in the file’s <em>shared object header message</em>
+            heap.
+	    </p>
+          </td>
+	</tr>
+      </table>
+    </div>
+    
+
+    <p>The following is a list of currently defined header messages:
+    </p>
+
+    <hr />
+    <h4><a name="NILMessage">Name: NIL</a></h4>
+
+    <p class="item"><b>Header Message Type: </b>0x0000
+    </p>
+    <p class="item"><b>Length:</b> Varies
+    </p>
+    <p class="item"><b>Status:</b> Optional; may be repeated.
+    </p>
+    <p class="item"><b>Description:</b> The NIL message is used to indicate a
+        message which is to be ignored when reading the header messages for a
+        data object.  [Possibly one which has been deleted for some reason.]
+    </p>
+    <p class="item"><b>Format of Data:</b> Unspecified
+    </p>
+
+    <br />
+    <hr />
+    <h4><a name="DataspaceMessage">Name: Dataspace</a></h4>
+
+    <p class="item"><b>Header Message Type: </b>0x0001
+    </p>
+    <p class="item"><b>Length:</b> Varies according to the number of dimensions, 
+      as described in the following table.
+    </p>
+    <p class="item"><b>Status:</b> Required for dataset objects; may not be
+        repeated.
+    </p>
+    <p class="item"><b>Description:</b> The dataspace message describes 
+    the number of dimensions (in other words, “rank”) and 
+    size of each dimension that the data object has. This message is 
+    only used for datasets which have a simple, rectilinear, array-like 
+    layout; datasets requiring a more complex layout are not yet 
+    supported.
+    </p>
+
+    <p class="item"><b>Format of Data:</b></p>
+    
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Dataspace Message - Version 1
+	</caption>
+
+	<tr>
+	  <th>byte</th>
+	  <th>byte</th>
+	  <th>byte</th>
+	  <th>byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>Dimensionality</td>
+	  <td>Flags</td>
+	  <td>Reserved</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Reserved</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Dimension #1 Size<sup>L</sup><br /><br /></td>
+    </tr>
+	<tr>
+	  <td colspan="4">.<br />.<br />.<br /></td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Dimension #n Size<sup>L</sup><br /><br /></td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Dimension #1 Maximum Size<sup>L</sup> <em>(optional)</em><br /><br /></td>
+	</tr>
+	<tr>
+	  <td colspan="4">.<br />.<br />.<br /></td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Dimension #n Maximum Size<sup>L</sup> <em>(optional)</em><br /><br /></td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Permutation Index #1<sup>L</sup> <em>(optional)</em><br /><br /></td>
+	</tr>
+	<tr>
+	  <td colspan="4">.<br />.<br />.<br /></td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Permutation Index #n<sup>L</sup> <em>(optional)</em><br /><br /></td>
+    </tr>
+	  </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>
+            <p>This value is used to determine the format of the
+	    Dataspace Message.  When the format of the
+	    information in the message is changed, the version number
+	    is incremented and can be used to determine how the
+	    information in the object header is formatted.  This
+            document describes version one (1) (there was no version
+            zero (0)).
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Dimensionality</td>
+	  <td>
+            <p>This value is the number of dimensions that the data
+	    object has.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Flags</td>
+	  <td>
+            <p>This field is used to store flags to indicate the
+	    presence of parts of this message.  Bit 0 (the least
+	    significant bit) is used to indicate that maximum
+	    dimensions are present.  Bit 1 is used to indicate that
+	    permutation indices are present.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Dimension #n Size</td>
+	  <td>
+            <p>This value is the current size of the dimension of the
+	    data as stored in the file.  The first dimension stored in
+	    the list of dimensions is the slowest changing dimension
+	    and the last dimension stored is the fastest changing
+	    dimension.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Dimension #n Maximum Size</td>
+	  <td>
+            <p>This value is the maximum size of the dimension of the
+	    data as stored in the file.  This value may be the special
+            “<a href="#UnlimitedDim">unlimited</a>” size which indicates
+	    that the data may expand along this dimension indefinitely.
+            If these values are not stored, the maximum size of each
+            dimension is assumed to be the dimension’s current size.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Permutation Index #n</td>
+	  <td>
+            <p>This value is the index permutation used to map
+	    each dimension from the canonical representation to an
+	    alternate axis for each dimension.  If these values are
+	    not stored, the first dimension stored in the list of
+	    dimensions is the slowest changing dimension and the last
+	    dimension stored is the fastest changing dimension.
+            </p>
+          </td>
+	</tr>
+      </table>
+    </div>
+
+    
+
+    <p>Version 2 of the dataspace message dropped the optional permutation
+        index value support, as it was never implemented in the HDF5 Library:</p>
+
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Dataspace Message - Version 2
+	</caption>
+
+	<tr>
+	  <th>byte</th>
+	  <th>byte</th>
+	  <th>byte</th>
+	  <th>byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>Dimensionality</td>
+	  <td>Flags</td>
+	  <td>Type</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Dimension #1 Size<sup>L</sup><br /><br /></td>
+      </tr>
+	<tr>
+	  <td colspan="4">.<br />.<br />.<br /></td>
+      </tr>
+	<tr>
+	  <td colspan="4"><br />Dimension #n Size<sup>L</sup><br /><br /></td>
+      </tr>
+	<tr>
+	  <td colspan="4"><br />Dimension #1 Maximum Size<sup>L</sup> <em>(optional)</em><br /><br /></td>
+      </tr>
+	<tr>
+	  <td colspan="4">.<br />.<br />.<br /></td>
+      </tr>
+	<tr>
+	  <td colspan="4"><br />Dimension #n Maximum Size<sup>L</sup> <em>(optional)</em><br /><br /></td>
+      </tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>
+            <p>This value is used to determine the format of the
+                Dataspace Message.  This field should be ‘2’ for version 2
+                format messages.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Dimensionality</td>
+	  <td>
+            <p>This value is the number of dimensions that the data object has.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Flags</td>
+	  <td>
+            <p>This field is used to store flags to indicate the
+                presence of parts of this message.  Bit 0 (the least
+                significant bit) is used to indicate that maximum
+                dimensions are present.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Type</td>
+	  <td>
+            <p>This field indicates the type of the dataspace:
+            <table class="list">
+                <tr>
+                  <th width="20%">Value</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>0</code></td>
+                  <td>A <em>scalar</em> dataspace; in other words, 
+                  a dataspace with a single, dimensionless element.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>1</code></td>
+                  <td>A <em>simple</em> dataspace; in other words, 
+                  a dataspace with a rank > 0 and an appropriate # of 
+                  dimensions.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>2</code></td>
+                  <td>A <em>null</em> dataspace; in other words, 
+                  a dataspace with no elements.
+                  </td>
+                </tr>
+            </table></p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Dimension #n Size</td>
+	  <td>
+            <p>This value is the current size of the dimension of the
+                data as stored in the file.  The first dimension stored in
+                the list of dimensions is the slowest changing dimension
+                and the last dimension stored is the fastest changing
+                dimension.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Dimension #n Maximum Size</td>
+	  <td>
+            <p>This value is the maximum size of the dimension of the
+                data as stored in the file.  This value may be the special
+                “<a href="#UnlimitedDim">unlimited</a>” size which indicates
+                that the data may expand along this dimension indefinitely.
+                If these values are not stored, the maximum size of each
+                dimension is assumed to be the dimension’s current size.
+            </p>
+          </td>
+	</tr>
+
+      </table>
+    </div>
+
+    
+
+<!--
+    <hr />
+    <h4><a name="DataSpaceMessage">Name: Complex Dataspace (Fiber Bundle?)</a></h4>
+    <b>Header Message Type: </b>0x0002<br />
+    <b>Length:</b> Varies<br />
+
+    <b>Status:</b> One of the <em>Simple Dataspace</em> or
+    <em>Complex Dataspace</em> messages is required (but not both) and may
+    not be repeated.<br /> <b>Description:</b> The
+    <em>Dataspace</em> message describes space that the dataset is
+    mapped onto in a more comprehensive way than the <em>Simple
+    Dimensionality</em> message is capable of handling.  The
+    dataspace of a dataset encompasses the type of coordinate system
+    used to locate the dataset’s elements as well as the structure and
+    regularity of the coordinate system.  The dataspace also
+    describes the number of dimensions which the dataset inhabits as
+    well as a possible higher dimensional space in which the dataset
+    is located within.
+
+    <br />
+    <p><b>Format of Data:</b></p>
+
+    <center>
+      <table border cellpadding="4" width="80%">
+	<caption align="bottom">
+	  <b>HDF5 Dataspace Message Layout</b>
+	</caption>
+
+	<tr align="center">
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+      </tr>
+
+	<tr align="center">
+	  <td colspan="4">Mesh Type</td>
+      </tr>
+	<tr align="center">
+	  <td colspan="4">Logical Dimensionality</td>
+      </tr>
+      </table>
+    </center>
+
+    <br />
+    <dl>
+      <dt>The elements of the dimensionality message are described below: 
+      <dd>
+	<dl>
+	  <dt>Mesh Type: (unsigned 32-bit integer)
+	  <dd>This value indicates whether the grid is
+	    polar/spherical/cartesion, 
+	    structured/unstructured and regular/irregular. <br />
+	    The mesh type value is broken up as follows: <br />
+
+	    <br />
+	    <center>
+	      <table border cellpadding="4" width="80%">
+		<caption align="bottom">
+		  <b>HDF5 Mesh-type Layout</b>
+		</caption>
+
+		<tr align="center">
+		  <th width="25%">byte</th>
+		  <th width="25%">byte</th>
+		  <th width="25%">byte</th>
+		  <th width="25%">byte</th>
+        </tr>
+
+		<tr align="center">
+		  <td colspan="1">Mesh Embedding</td>
+		  <td colspan="1">Coordinate System</td>
+		  <td colspan="1">Structure</td>
+		  <td colspan="1">Regularity</td>
+        </tr>
+	      </table>
+	    </center>
+	    The following are the definitions of mesh-type bytes:
+	    <dl>
+	      <dt>Mesh Embedding
+	      <dd>This value indicates whether the dataset dataspace
+		is located within 
+		another dataspace or not:
+		<dl> <dl>
+		    <dt><STANDALONE>
+		    <dd>The dataset mesh is self-contained and is not
+		      embedded in another mesh. 
+		    <dt><EMBEDDED>
+		    <dd>The dataset’s dataspace is located within
+		      another dataspace, as 
+		      described in information below.
+		  </dl> </dl>
+	      <dt>Coordinate System
+	      <dd>This value defines the type of coordinate system
+		used for the mesh: 
+		<dl> <dl>
+		    <dt><POLAR>
+		    <dd>The last two dimensions are in polar
+		      coordinates, higher dimensions are 
+		      cartesian.
+		    <dt><SPHERICAL>
+		    <dd>The last three dimensions are in spherical
+		      coordinates, higher dimensions 
+		      are cartesian.
+		    <dt><CARTESIAN>
+		    <dd>All dimensions are in cartesian coordinates.
+		  </dl> </dl>
+	      <dt>Structure
+	      <dd>This value defines the locations of the grid-points
+		on the axes: 
+		<dl> <dl>
+		    <dt><STRUCTURED>
+		    <dd>All grid-points are on integral, sequential
+		      locations, starting from 0. 
+		    <dt><UNSTRUCTURED>
+		    <dd>Grid-points locations in each dimension are
+		      explicitly defined and 
+		      may be of any numeric datatype.
+		  </dl> </dl>
+	      <dt>Regularity
+	      <dd>This value defines the locations of the dataset
+		points on the grid: 
+		<dl> <dl>
+		    <dt><REGULAR>
+		    <dd>All dataset elements are located at the
+		      grid-points defined. 
+		    <dt><IRREGULAR>
+		    <dd>Each dataset element has a particular
+		      grid-location defined. 
+		  </dl> </dl>
+	    </dl>
+	    <p>The following grid combinations are currently allowed:</p>
+	    <dl> <dl>
+		<dt><POLAR-STRUCTURED-REGULAR>
+		<dt><SPHERICAL-STRUCTURED-REGULAR>
+		<dt><CARTESIAN-STRUCTURED-REGULAR>
+		<dt><POLAR-UNSTRUCTURED-REGULAR>
+		<dt><SPHERICAL-UNSTRUCTURED-REGULAR>
+		<dt><CARTESIAN-UNSTRUCTURED-REGULAR>
+		<dt><CARTESIAN-UNSTRUCTURED-IRREGULAR>
+	      </dl> </dl>
+	    All of the above grid types can be embedded within another
+	    dataspace.
+	    <br /> <br />
+	  <dt>Logical Dimensionality: (unsigned 32-bit integer)
+	  <dd>This value is the number of dimensions that the dataset occupies.
+
+	    <br />
+	    <center>
+	      <table border cellpadding="4" width="80%">
+		<caption align="bottom">
+		  <b>HDF5 Dataspace Embedded Dimensionality Information</b>
+		</caption>
+
+		<tr align="center">
+		  <th width="25%">byte</th>
+		  <th width="25%">byte</th>
+		  <th width="25%">byte</th>
+		  <th width="25%">byte</th>
+        </tr>
+
+		<tr align="center">
+		  <td colspan="4">Embedded Dimensionality</td>
+        </tr>
+		<tr align="center">
+		  <td colspan="4">Embedded Dimension Size #1</td>
+        </tr>
+		<tr align="center">
+		  <td colspan="4">.<br />.<br />.<br /></td>
+        </tr>
+		<tr align="center">
+		  <td colspan="4">Embedded Dimension Size #n</td>
+        </tr>
+		<tr align="center">
+		  <td colspan="4">Embedded Origin Location #1</td>
+        </tr>
+		<tr align="center">
+		  <td colspan="4">.<br />.<br />.<br /></td>
+        </tr>
+		<tr align="center">
+		  <td colspan="4">Embedded Origin Location #n</td>
+        </tr>
+	      </table>
+	    </center>
+
+	  <dt>Embedded Dimensionality: (unsigned 32-bit integer)
+	  <dd>This value is the number of dimensions of the space the
+	    dataset is located within: in other words, a planar dataset 
+        located within a 3-D space, a 3-D dataset 
+	    which is a subset of another 3-D space, and so on.
+	  <dt>Embedded Dimension Size: (unsigned 32-bit integer)
+	  <dd>These values are the sizes of the dimensions of the
+	    embedded dataspace 
+	    that the dataset is located within.
+	  <dt>Embedded Origin Location: (unsigned 32-bit integer)
+	  <dd>These values comprise the location of the dataset’s
+	    origin within the embedded dataspace. 
+	</dl>
+    </dl>
+    [Comment: need some way to handle different orientations of the
+    dataset dataspace 
+    within the embedded dataspace]<br />
+
+    <br />
+    <center>
+      <table border cellpadding="4" width="80%">
+	<caption align="bottom">
+	  <b>HDF5 Dataspace Structured/Regular Grid Information</b>
+	</caption>
+
+	<tr align="center">
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+    </tr>
+
+	<tr align="center">
+	  <td colspan="4">Logical Dimension Size #1</td>
+    </tr>
+	<tr align="center">
+	  <td colspan="4">Logical Dimension Maximum #1</td>
+    </tr>
+	<tr align="center">
+	  <td colspan="4">.<br />.<br />.<br /></td>
+    </tr>
+	<tr align="center">
+	  <td colspan="4">Logical Dimension Size #n</td>
+    </tr>
+	<tr align="center">
+	  <td colspan="4">Logical Dimension Maximum #n</td>
+    </tr>
+      </table>
+    </center>
+
+    <br />
+    <dl>
+      <dt>The elements of the dimensionality message are described below: 
+      <dd>
+	<dl>
+	  <dt>Logical Dimension Size #n: (unsigned 32-bit integer)
+	  <dd>This value is the current size of the dimension of the
+	    data as stored in 
+	    the file.  The first dimension stored in the list of
+	    dimensions is the slowest 
+	    changing dimension and the last dimension stored is the
+	    fastest changing 
+	    dimension. 
+	  <dt>Logical Dimension Maximum #n: (unsigned 32-bit integer)
+	  <dd>This value is the maximum size of the dimension of the
+	    data as stored in 
+	    the file.  This value may be the special value
+	    <UNLIMITED> which 
+	    indicates that the data may expand along this dimension
+	    indefinitely. 
+	</dl>
+    </dl>
+    <br />
+    <center>
+      <table border cellpadding="4" width="80%">
+	<caption align="bottom">
+	  <b>HDF5 Dataspace Structured/Irregular Grid Information</b>
+	</caption>
+
+	<tr align="center">
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+    </tr>
+
+	<tr align="center">
+	  <td colspan="4"># of Grid Points in Dimension #1</td>
+    </tr>
+	<tr align="center">
+	  <td colspan="4">.<br />.<br />.<br /></td>
+    </tr>
+	<tr align="center">
+	  <td colspan="4"># of Grid Points in Dimension #n</td>
+    </tr>
+	<tr align="center">
+	  <td colspan="4">Datatype of Grid Point Locations</td>
+    </tr>
+	<tr align="center">
+	  <td colspan="4">Location of Grid Points in Dimension #1</td>
+    </tr>
+	<tr align="center">
+	  <td colspan="4">.<br />.<br />.<br /></td>
+    </tr>
+	<tr align="center">
+	  <td colspan="4">Location of Grid Points in Dimension #n</td>
+    </tr>
+      </table>
+    </center>
+
+    <br />
+    <center>
+      <table border cellpadding="4" width="80%">
+	<caption align="bottom">
+	  <b>HDF5 Dataspace Unstructured Grid Information</b>
+	</caption>
+
+	<tr align="center">
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+    </tr>
+
+	<tr align="center">
+	  <td colspan="4"># of Grid Points</td>
+    </tr>
+	<tr align="center">
+	  <td colspan="4">Datatype of Grid Point Locations</td>
+    </tr>
+	<tr align="center">
+	  <td colspan="4">Grid Point Locations<br />.<br />.<br /></td>
+    </tr>
+      </table>
+    </center>
+-->
+
+    <br />
+    <hr />
+    <h4><a name="LinkInfoMessage">Name: Link Info</a></h4>
+
+    <p class="item"><b>Header Message Type:</b> 0x002 </p>
+    <p class="item"><b>Length:</b> Varies </p>
+    <p class="item"><b>Status:</b> Optional; may not be repeated. </p>
+
+    <p class="item"><b>Description:</b> This message tracks variable information
+        about the current state of the links for a “new style” group’s behavior.
+        Variable information
+        will be stored in this message and constant information will be stored
+        in the <a href="#GroupInfoMessage">Group Info</a> message.</p>
+    
+
+    <p class="item"><b>Format of Data:</b></p>
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Link Info
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>Flags</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Maximum Creation Index <em>(8 bytes, optional)</em><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Fractal Heap Address<sup>O</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Address of v2 B-tree for Name Index<sup>O</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Address of v2 B-tree for Creation Order Index<sup>O</sup> <em>(optional)</em><br /><br /></td>
+	</tr>
+	
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>
+            <p>The version number for this message. This document describes
+                version 0.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	<td>Flags</td>
+	  <td><p>This field determines various optional aspects of the link
+                info message:
+	      
+            <table class="list">
+                <tr>
+                  <th width="20%">Bit</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>0</code></td>
+                  <td>If set, creation order for the links is tracked.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>1</code></td>
+                  <td>If set, creation order for the links is indexed.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>2-7</code></td>
+                  <td>Reserved</td>
+                </tr>
+	    </table></p>
+           
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Maximum Creation Index</td>
+	  <td><p>This 64-bit value is the maximum creation order index value
+                stored for a link in this group.</p>
+	    <p>This field is present if bit 0 of <em>flags</em> is set.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Fractal Heap Address</td>
+	  <td>
+            <p>
+                This is the address of the fractal heap to store dense links.
+                Each link stored in the fractal heap is stored as a
+                <a href="#LinkMessage">Link Message</a>.
+            </p>
+            <p>
+                If there are no links in the group, or the group’s links
+                are stored “compactly” (as object header messages), this
+                value will be the <a href="#UndefinedAddress">undefined
+                address</a>. 
+            </p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Address of v2 B-tree for Name Index</td>
+	  <td><p>This is the address of the version 2 B-tree to index names of links.</p>
+                <p>If there are no links in the group, or the group’s links
+                    are stored “compactly” (as object header messages), this
+                    value will be the <a href="#UndefinedAddress">undefined
+                    address</a>. 
+                </p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Address of v2 B-tree for Creation Order Index</td>
+	  <td><p>This is the address of the version 2 B-tree to index creation order of links.</p>
+                <p>If there are no links in the group, or the group’s links
+                    are stored “compactly” (as object header messages), this
+                    value will be the <a href="#UndefinedAddress">undefined
+                    address</a>. 
+                </p>
+	    <p>This field exists if bit 1 of <em>flags</em> is set.</p>
+	  </td>
+	</tr>
+
+      </table>
+    </div>
+
+
+    <br />
+    <hr />
+    <h4><a name="DatatypeMessage">Name: Datatype</a></h4>
+
+    <p class="item"><b>Header Message Type:</b> 0x0003
+    </p>
+    <p class="item"><b>Length:</b> Variable
+    </p>
+    <p class="item"><b>Status:</b> Required for dataset or committed 
+    datatype (formerly named datatype) objects; may not be repeated.
+    </p>
+
+    <table class="msgDesc">
+    <tr>
+    <td>
+    <b>Description:</b></td>
+    <td><p>The datatype message defines the datatype 
+    for each element of a dataset or a common datatype for sharing 
+    between multiple datasets.  A datatype can describe an atomic type 
+    like a fixed- or floating-point type or more complex types like a C 
+    struct (compound datatype), array (array datatype) or C++ vector 
+    (variable-length datatype).</p>
+    <p>Datatype messages that are part of a dataset object do not 
+    describe how elements are related to one another; the dataspace 
+    message is used for that purpose. Datatype messages that are part 
+    of a committed datatype (formerly named datatype) message describe 
+    a common datatype that can be shared by multiple datasets in the 
+    file.</p>
+    </td></tr>
+    </table>
+    
+    <p class="item"><b>Format of Data:</b></p>
+    
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Datatype Message
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Class and Version</td>
+	  <td>Class Bit Field, Bits 0-7</td>
+	  <td>Class Bit Field, Bits 8-15</td>
+	  <td>Class Bit Field, Bits 16-23</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Size</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br /><br />Properties<br /><br /><br /></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Class and Version</td>
+	  <td>
+            <p>The version of the datatype message and the datatype’s class
+                information are packed together in this field.  The version
+                number is packed in the top 4 bits of the field and the class
+                is contained in the bottom 4 bits.
+            </p>
+            <p>The version number information is used for changes in the
+                format of the datatype message and is described here:
+                <table class="list">
+                    <tr>
+                      <th width="20%">Version</th>
+                      <th width="80%" align="left">Description</th>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>0</code></td>
+                      <td>Never used
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>1</code></td>
+                      <td>Used by early versions of the library to encode
+                            compound datatypes with explicit array fields.
+                            See the compound datatype description below for
+                            further details.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>2</code></td>
+                      <td>Used when an array datatype needs to be encoded.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>3</code></td>
+                      <td>Used when a VAX byte-ordered type needs to be
+                        encoded.  Packs various other datatype classes more
+                        efficiently also.
+                      </td>
+                    </tr>
+                </table></p>
+            
+            <p>The class of the datatype determines the format for the class
+                bit field and properties portion of the datatype message, which
+                are described below.  The
+                following classes are currently defined:
+                
+                <table class="list">
+                    <tr>
+                      <th width="20%">Value</th>
+                      <th width="80%" align="left">Description</th>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>0</code></td>
+                      <td>Fixed-Point</td>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>1</code></td>
+                      <td>Floating-Point</td>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>2</code></td>
+                      <td>Time</td>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>3</code></td>
+                      <td>String</td>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>4</code></td>
+                      <td>Bit field</td>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>5</code></td>
+                      <td>Opaque</td>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>6</code></td>
+                      <td>Compound</td>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>7</code></td>
+                      <td>Reference</td>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>8</code></td>
+                      <td>Enumerated</td>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>9</code></td>
+                      <td>Variable-Length</td>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>10</code></td>
+                      <td>Array</td>
+                    </tr>
+                </table></p>
+            
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Class Bit Fields</td>
+	  <td>
+            <p>The information in these bit fields is specific to each datatype
+                class and is described below.  All bits not defined for a
+                datatype class are set to zero.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Size</td>
+	  <td>
+            <p>The size of a datatype element in bytes.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Properties</td>
+	  <td>
+            <p>This variable-sized sequence of bytes encodes information
+                specific to each datatype class and is described for each class
+                below.  If there is no property information specified for a
+                datatype class, the size of this field is zero bytes.
+            </p>
+          </td>
+	</tr>
+
+      </table>
+    </div>
+    
+
+    <br />
+    <p>Class specific information for Fixed-Point Numbers (Class 0):</p>
+
+    <div align="center">
+      <table class="desc">
+	<caption>
+	  Fixed-Point Bit Field Description
+	</caption>
+
+	<tr>
+	  <th width="10%">Bits</th>
+	  <th>Meaning</th>
+	</tr>
+
+	<tr>
+	  <td>0</td>
+	  <td><b>Byte Order.</b> If zero, byte order is little-endian;
+	    otherwise, byte order is big endian.</td>
+	</tr>
+
+	<tr>
+	  <td>1, 2</td>
+	  <td><b>Padding type.</b>  Bit 1 is the lo_pad bit and bit 2
+	    is the hi_pad bit.  If a datum has unused bits at either
+	    end, then the lo_pad or hi_pad bit is copied to those
+	    locations.</td>
+	</tr>
+
+	<tr>
+	  <td>3</td>
+	  <td><b>Signed.</b> If this bit is set then the fixed-point
+	    number is in 2’s complement form.</td>
+	</tr>
+
+	<tr>
+	  <td>4-23</td>
+	  <td>Reserved (zero).</td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Fixed-Point Property Description
+	</caption>
+
+	<tr>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Bit Offset</td>
+	  <td colspan="2">Bit Precision</td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Bit Offset</td>
+	  <td>
+            <p>The bit offset of the first significant bit of the fixed-point
+                value within the datatype.  The bit offset specifies the number
+                of bits “to the right of” the value (which are set to the
+                lo_pad bit value).
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Bit Precision</td>
+	  <td>
+            <p>The number of bits of precision of the fixed-point value
+                within the datatype.  This value, combined with the datatype
+                element’s size and the Bit Offset field specifies the number
+                of bits “to the left of” the value (which are set to the
+                hi_pad bit value).
+            </p>
+          </td>
+	</tr>
+
+      </table>
+    </div>
+    
+
+    <br />
+    <p>Class specific information for Floating-Point Numbers (Class 1):</p>
+
+    <div align="center">
+      <table class="desc">
+	<caption>
+	  Floating-Point Bit Field Description
+	</caption>
+
+	<tr>
+	  <th width="10%">Bits</th>
+	  <th>Meaning</th>
+	</tr>
+
+	<tr>
+	  <td>0, 6</td>
+	  <td><p><b>Byte Order.</b> These two non-contiguous bits specify the 
+            “endianness” of the bytes in the datatype element.
+            <table class="list">
+                <tr>
+                  <th width="10%">Bit 6</th>
+                  <th width="10%">Bit 0</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>0</code></td>
+                  <td align="center"><code>0</code></td>
+                  <td>Byte order is little-endian
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>0</code></td>
+                  <td align="center"><code>1</code></td>
+                  <td>Byte order is big-endian
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>1</code></td>
+                  <td align="center"><code>0</code></td>
+                  <td>Reserved
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>1</code></td>
+                  <td align="center"><code>1</code></td>
+                  <td>Byte order is VAX-endian
+                  </td>
+                </tr>
+            </table></p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>1, 2, 3</td>
+	  <td><p><b>Padding type.</b>  Bit 1 is the low bits pad type, bit 2
+	    is the high bits pad type, and bit 3 is the internal bits
+	    pad type.  If a datum has unused bits at either end or between
+	    the sign bit, exponent, or mantissa, then the value of bit
+	    1, 2, or 3 is copied to those locations.</p></td>
+	</tr>
+
+	<tr>
+	  <td>4-5</td>
+	  <td><p><b>Mantissa Normalization.</b> This 2-bit bit field specifies
+            how the most significant bit of the mantissa is managed.
+                <table class="list">
+                    <tr>
+                      <th width="20%">Value</th>
+                      <th width="80%" align="left">Description</th>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>0</code></td>
+                      <td>No normalization
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>1</code></td>
+                      <td>The most significant bit of the mantissa is always set
+                        (except for 0.0).
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>2</code></td>
+                      <td>The most significant bit of the mantissa is not stored,
+                        but is implied to be set.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>3</code></td>
+                      <td>Reserved.
+                      </td>
+                    </tr>
+                </table></p>
+            </td>
+	</tr>
+
+	<tr>
+	  <td>7</td>
+	  <td><p>Reserved (zero).</p></td>
+	</tr>
+
+	<tr>
+	  <td>8-15</td>
+	  <td><p><b>Sign Location.</b> This is the bit position of the sign
+	    bit.  Bits are numbered with the least significant bit zero.</p></td>
+	</tr>
+
+	<tr>
+	  <td>16-23</td>
+	  <td><p>Reserved (zero).</p></td>
+	</tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Floating-Point Property Description
+	</caption>
+
+	<tr>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Bit Offset</td>
+	  <td colspan="2">Bit Precision</td>
+	</tr>
+
+	<tr>
+	  <td>Exponent Location</td>
+	  <td>Exponent Size</td>
+	  <td>Mantissa Location</td>
+	  <td>Mantissa Size</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Exponent Bias</td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Bit Offset</td>
+	  <td>
+            <p>The bit offset of the first significant bit of the floating-point
+                value within the datatype.  The bit offset specifies the number
+                of bits “to the right of” the value.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Bit Precision</td>
+	  <td>
+            <p>The number of bits of precision of the floating-point value
+                within the datatype.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Exponent Location</td>
+	  <td>
+            <p>The bit position of the exponent field.  Bits are numbered with
+                the least significant bit number zero.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Exponent Size</td>
+	  <td>
+            <p>The size of the exponent field in bits.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Mantissa Location</td>
+	  <td>
+            <p>The bit position of the mantissa field.  Bits are numbered with
+                the least significant bit number zero.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Mantissa Size</td>
+	  <td>
+            <p>The size of the mantissa field in bits.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Exponent Bias</td>
+	  <td>
+            <p>The bias of the exponent field.
+            </p>
+          </td>
+	</tr>
+
+      </table>
+    </div>
+    
+
+    <br />
+    <p>Class specific information for Time (Class 2):</p>
+
+    
+    <div align="center">
+      <table class="desc">
+	<caption>
+	  Time Bit Field Description
+	</caption>
+
+	<tr>
+	  <th width="10%">Bits</th>
+	  <th>Meaning</th>
+	</tr>
+
+	<tr>
+	  <td>0</td>
+	  <td><p><b>Byte Order.</b> If zero, byte order is little-endian;
+	    otherwise, byte order is big endian.</p></td>
+	</tr>
+
+	<tr>
+	  <td>1-23</td>
+	  <td><p>Reserved (zero).</p></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Time Property Description
+	</caption>
+
+	<tr>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Bit Precision</td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Bit Precision</td>
+	  <td>
+            <p>The number of bits of precision of the time value.
+            </p>
+          </td>
+	</tr>
+
+      </table>
+    </div>
+    
+
+    <br />
+    <p>Class specific information for Strings (Class 3):</p>
+
+    
+    <div align="center">
+      <table class="desc">
+	<caption>
+	  String Bit Field Description
+	</caption>
+
+	<tr>
+	  <th width="10%">Bits</th>
+	  <th>Meaning</th>
+	</tr>
+
+	<tr>
+	  <td>0-3</td>
+	  <td><p><b>Padding type.</b>  This four-bit value determines the
+	    type of padding to use for the string.  The values are:
+
+            <table class="list">
+                <tr>
+                  <th width="20%">Value</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>0</code></td>
+                  <td>Null Terminate: A zero byte marks the end of the
+                    string and is guaranteed to be present after
+                    converting a long string to a short string.  When
+                    converting a short string to a long string the value is
+                    padded with additional null characters as necessary.
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>1</code></td>
+                  <td>Null Pad: Null characters are added to the end of
+                    the value during conversions from short values to long
+                    values but conversion in the opposite direction simply
+                    truncates the value.
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>2</code></td>
+                  <td>Space Pad: Space characters are added to the end of
+                    the value during conversions from short values to long
+                    values but conversion in the opposite direction simply
+                    truncates the value.  This is the Fortran
+                    representation of the string.
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>3-15</code></td>
+                  <td>Reserved
+                  </td>
+                </tr>
+            </table></p>
+            </td>
+	</tr>
+
+	<tr>
+	  <td>4-7</td>
+	  <td><p><b>Character Set.</b>  The character set used to
+	    encode the string.
+            <table class="list">
+                <tr>
+                  <th width="20%">Value</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>0</code></td>
+                  <td>ASCII character set encoding
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>1</code></td>
+                  <td>UTF-8 character set encoding
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>2-15</code></td>
+                  <td>Reserved
+                  </td>
+                </tr>
+            </table></p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>8-23</td>
+	  <td>Reserved (zero).</td>
+	</tr>
+      </table>
+    </div>
+
+    <p>There are no properties defined for the string class.
+    </p>
+    
+
+    <p>Class specific information for bit fields (Class 4):</p>
+    
+    <div align="center">
+      <table class="desc">
+	<caption>
+	  Bitfield Bit Field Description
+	</caption>
+
+	<tr>
+	  <th width="10%">Bits</th>
+	  <th>Meaning</th>
+	</tr>
+
+	<tr>
+	  <td>0</td>
+	  <td><b>Byte Order.</b> If zero, byte order is little-endian;
+	    otherwise, byte order is big endian.</td>
+	</tr>
+
+	<tr>
+	  <td>1, 2</td>
+	  <td><b>Padding type.</b>  Bit 1 is the lo_pad type and bit 2
+	    is the hi_pad type.  If a datum has unused bits at either
+	    end, then the lo_pad or hi_pad bit is copied to those
+	    locations.</td>
+	</tr>
+
+	<tr>
+	  <td>3-23</td>
+	  <td>Reserved (zero).</td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Bit Field Property Description
+	</caption>
+
+	<tr>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Bit Offset</td>
+	  <td colspan="2">Bit Precision</td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Bit Offset</td>
+	  <td>
+            <p>The bit offset of the first significant bit of the bit field
+                within the datatype.  The bit offset specifies the number
+                of bits “to the right of” the value.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Bit Precision</td>
+	  <td>
+            <p>The number of bits of precision of the bit field
+                within the datatype.
+            </p>
+          </td>
+	</tr>
+      </table>
+    </div>
+    
+
+    <br />
+    <p>Class specific information for Opaque (Class 5):</p>
+    
+    <div align="center">
+      <table class="desc">
+	<caption>
+	  Opaque Bit Field Description
+	</caption>
+
+	<tr>
+	  <th width="10%">Bits</th>
+	  <th>Meaning</th>
+	</tr>
+
+	<tr>
+	  <td>0-7</td>
+	  <td>Length of ASCII tag in bytes.</td>
+	</tr>
+
+	<tr>
+	  <td>8-23</td>
+	  <td>Reserved (zero).</td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Opaque Property Description
+	</caption>
+
+	<tr>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />ASCII Tag<br />
+	    <br /></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>ASCII Tag</td>
+	  <td>
+            <p>This NUL-terminated string provides a description for the
+                opaque type.  It is NUL-padded to a multiple of 8 bytes.
+            </p>
+          </td>
+	</tr>
+      </table>
+    </div>
+    
+
+    <br />
+    <p>Class specific information for Compound (Class 6):</p>
+    
+    <div align="center">
+      <table class="desc">
+	<caption>
+	  Compound Bit Field Description
+	</caption>
+
+	<tr>
+	  <th width="10%">Bits</th>
+	  <th>Meaning</th>
+	</tr>
+
+	<tr>
+	  <td>0-15</td>
+	  <td><b>Number of Members.</b> This field contains the number
+	    of members defined for the compound datatype.  The member
+	    definitions are listed in the Properties field of the data
+	    type message.</td>
+	</tr>
+
+	<tr>
+	  <td>16-23</td>
+	  <td>Reserved (zero).</td>
+	</tr>
+      </table>
+    </div>
+    
+
+    <p>The Properties field of a compound datatype is a list of the
+      member definitions of the compound datatype.  The member
+      definitions appear one after another with no intervening bytes.
+      The member types are described with a (recursively) encoded datatype
+      message.</p>
+
+    <p>Note that the property descriptions are different for different
+      versions of the datatype version.  Additionally note that the version
+      0 datatype encoding is deprecated and has been replaced with later
+      encodings in versions of the HDF5 Library from the 1.4 release 
+      onward.</p>
+
+    
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Compound Properties Description for Datatype Version 1
+	</caption>
+
+	<tr>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Name<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Byte Offset of Member</td>
+	</tr>
+
+	<tr>
+	  <td>Dimensionality</td>
+	  <td colspan="3">Reserved (zero)</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Dimension Permutation</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Reserved (zero)</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Dimension #1 Size (required)</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Dimension #2 Size (required)</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Dimension #3 Size (required)</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Dimension #4 Size (required)</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Member Type Message<br /><br /></td>
+	</tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Name</td>
+	  <td>
+            <p>This NUL-terminated string provides a description for the
+                opaque type.  It is NUL-padded to a multiple of 8 bytes.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Byte Offset of Member</td>
+	  <td>
+            <p>This is the byte offset of the member within the datatype.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Dimensionality</td>
+	  <td>
+            <p>If set to zero, this field indicates a scalar member.  If set
+                to a value greater than zero, this field indicates that the
+                member is an array of values.  For array members, the size of
+                the array is indicated by the ‘Size of Dimension n’ field in
+                this message.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Dimension Permutation</td>
+	  <td>
+            <p>This field was intended to allow an array field to have 
+                its dimensions permuted, but this was never implemented.
+                This field should always be set to zero.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Dimension #n Size</td>
+	  <td>
+            <p>This field is the size of a dimension of the array field as
+            stored in the file.  The first dimension stored in the list of
+            dimensions is the slowest changing dimension and the last
+            dimension stored is the fastest changing dimension.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Member Type Message</td>
+	  <td>
+            <p>This field is a datatype message describing the datatype of
+            the member.
+            </p>
+          </td>
+	</tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Compound Properties Description for Datatype Version 2
+	</caption>
+
+	<tr>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Name<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Byte Offset of Member</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Member Type Message<br /><br /></td>
+	</tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Name</td>
+	  <td>
+            <p>This NUL-terminated string provides a description for the
+                opaque type.  It is NUL-padded to a multiple of 8 bytes.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Byte Offset of Member</td>
+	  <td>
+            <p>This is the byte offset of the member within the datatype.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Member Type Message</td>
+	  <td>
+            <p>This field is a datatype message describing the datatype of
+            the member.
+            </p>
+          </td>
+	</tr>
+
+      </table>
+    </div>
+    
+
+    <br />
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Compound Properties Description for Datatype Version 3
+	</caption>
+
+	<tr>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Name<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Byte Offset of Member <em>(variable size)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Member Type Message<br /><br /></td>
+	</tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Name</td>
+	  <td>
+            <p>This NUL-terminated string provides a description for the
+                opaque type.  It is <em>not</em> NUL-padded to a multiple of
+                8 bytes.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Byte Offset of Member</td>
+	  <td>
+            <p>This is the byte offset of the member within the datatype.  The
+                field size is the minimum # of bytes necessary, based on size
+                of the datatype element.  For example, a datatype element size
+                of less than 256 bytes uses a 1 byte length, a datatype element
+                size of 256-65535 bytes uses a 2 byte length, etc.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Member Type Message</td>
+	  <td>
+            <p>This field is a datatype message describing the datatype of
+            the member.
+            </p>
+          </td>
+	</tr>
+
+      </table>
+    </div>
+    
+
+    <br />
+    <p>Class specific information for Reference (Class 7):</p>
+    
+    <div align="center">
+      <table class="desc">
+	<caption>
+	  Reference Bit Field Description
+	</caption>
+
+	<tr>
+	  <th width="10%">Bits</th>
+	  <th>Meaning</th>
+	</tr>
+
+	<tr>
+	  <td>0-3</td>
+	  <td><p><b>Type.</b> This four-bit value contains the type of reference
+            described.  The values defined are:
+
+            <table class="list">
+                <tr>
+                  <th width="20%">Value</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>0</code></td>
+                  <td>Object Reference: A reference to another object in this
+                    HDF5 file.
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>1</code></td>
+                  <td>Dataset Region Reference: A reference to a region within
+                    a dataset in this HDF5 file.
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>2-15</code></td>
+                  <td>Reserved
+                  </td>
+                </tr>
+            </table></p>
+
+            </td>
+	</tr>
+
+	<tr>
+	  <td>4-23</td>
+	  <td>Reserved (zero).</td>
+	</tr>
+      </table>
+    </div>
+
+    <p>There are no properties defined for the reference class.
+    </p>
+    
+
+    <br />
+    <p>Class specific information for Enumeration (Class 8):</p>
+    
+    <div align="center">
+      <table class="desc">
+	<caption>
+	  Enumeration Bit Field Description
+	</caption>
+
+	<tr>
+	  <th width="10%">Bits</th>
+	  <th>Meaning</th>
+	</tr>
+
+	<tr>
+	  <td>0-15</td>
+	  <td><b>Number of Members.</b> The number of name/value
+	    pairs defined for the enumeration type.</td>
+	</tr>
+
+	<tr>
+	  <td>16-23</td>
+	  <td>Reserved (zero).</td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Enumeration Property Description for Datatype Versions 1 & 2
+	</caption>
+
+	<tr>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Base Type<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Names<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Values<br /><br /></td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Base Type</td>
+	  <td>
+            <p>Each enumeration type is based on some parent type, usually an
+                integer. The information for that parent type is described
+                recursively by this field.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Names</td>
+	  <td>
+            <p>The name for each name/value pair. Each name is stored as a null
+                terminated ASCII string in a multiple of eight bytes. The names
+                are in no particular order.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Values</td>
+	  <td>
+            <p>The list of values in the same order as the names.  The values
+                are packed (no inter-value padding) and the size of each value
+                is determined by the parent type.
+            </p>
+          </td>
+	</tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Enumeration Property Description for Datatype Version 3
+	</caption>
+
+	<tr>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	  <th width="25%">Byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Base Type<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Names<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Values<br /><br /></td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Base Type</td>
+	  <td>
+            <p>Each enumeration type is based on some parent type, usually an
+                integer. The information for that parent type is described
+                recursively by this field.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Names</td>
+	  <td>
+            <p>The name for each name/value pair. Each name is stored as a null
+                terminated ASCII string, <em>not</em> padded to a multiple of
+                eight bytes. The names are in no particular order.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Values</td>
+	  <td>
+            <p>The list of values in the same order as the names.  The values
+                are packed (no inter-value padding) and the size of each value
+                is determined by the parent type.
+            </p>
+          </td>
+	</tr>
+
+      </table>
+    </div>
+    
+
+
+    <br />
+    <p>Class specific information for Variable-Length (Class 9):</p>
+    
+    <div align="center">
+      <table class="desc">
+	<caption>
+	  Variable-Length Bit Field Description
+	</caption>
+
+	<tr>
+	  <th width="10%">Bits</th>
+	  <th>Meaning</th>
+	</tr>
+
+	<tr>
+	  <td>0-3</td>
+	  <td><p><b>Type.</b> This four-bit value contains the type of
+            variable-length datatype described.  The values defined are:
+
+            <table class="list">
+                <tr>
+                  <th width="20%">Value</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>0</code></td>
+                  <td>Sequence: A variable-length sequence of any datatype.
+                    Variable-length sequences do not have padding or
+                    character set information.
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>1</code></td>
+                  <td>String: A variable-length sequence of characters.
+                    Variable-length strings have padding and character set
+                    information.
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>2-15</code></td>
+                  <td>Reserved
+                  </td>
+                </tr>
+            </table></p>
+
+            </td>
+	</tr>
+
+	<tr>
+	  <td>4-7</td>
+	  <td><p><b>Padding type.</b> (variable-length string only)
+                  This four-bit value determines the type of padding 
+                  used for variable-length strings.  The values are the same 
+                  as for the string padding type, as follows:
+            <table class="list">
+                <tr>
+                  <th width="20%">Value</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>0</code></td>
+                  <td>Null terminate: A zero byte marks the end of a string
+                    and is guaranteed to be present after converting a long
+                    string to a short string.  When converting a short string
+                    to a long string, the value is padded with additional null
+                    characters as necessary.
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>1</code></td>
+                  <td>Null pad: Null characters are added to the end of the
+                    value during conversion from a short string to a longer
+                    string.  Conversion from a long string to a shorter string
+                    simply truncates the value.
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>2</code></td>
+                  <td>Space pad: Space characters are added to the end of the
+                    value during conversion from a short string to a longer
+                    string.  Conversion from a long string to a shorter string
+                    simply truncates the value.  This is the Fortran
+                    representation of the string.
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>3-15</code></td>
+                  <td>Reserved
+                  </td>
+                </tr>
+            </table></p>
+
+            <p>This value is set to zero for variable-length sequences.</p>
+
+          </td>
+	</tr>
+
+	<tr>
+	  <td>8-11</td>
+	  <td><p><b>Character Set.</b> (variable-length string only)
+                  This four-bit value specifies the character set 
+                  to be used for encoding the string:
+            <table class="list">
+                <tr>
+                  <th width="20%">Value</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>0</code></td>
+                  <td>ASCII character set encoding
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>1</code></td>
+                  <td>UTF-8 character set encoding
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>2-15</code></td>
+                  <td>Reserved
+                  </td>
+                </tr>
+            </table></p>
+
+            <p>This value is set to zero for variable-length sequences.</p>
+
+          </td>
+	</tr>
+
+	<tr>
+	  <td>12-23</td>
+	  <td><p>Reserved (zero).</p></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Variable-Length Property Description
+        </caption>
+
+        <tr>
+          <th width="25%">Byte</th>
+          <th width="25%">Byte</th>
+          <th width="25%">Byte</th>
+          <th width="25%">Byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Base Type<br /><br /></td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="10%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Base Type</td>
+	  <td>
+            <p>Each variable-length type is based on some parent type.  The
+                information for that parent type is described recursively by
+                this field.
+            </p>
+          </td>
+	</tr>
+
+      </table>
+    </div>
+    
+
+    <br />
+    <p>Class specific information for Array (Class 10):</p>
+
+    <p>There are no bit fields defined for the array class.
+    </p>
+
+    <p>Note that the dimension information defined in the property for this
+      datatype class is independent of dataspace information for a dataset.
+      The dimension information here describes the dimensionality of the
+      information within a data element (or a component of an element, if the
+      array datatype is nested within another datatype) and the dataspace for a
+      dataset describes the size and locations of the elements in a dataset.
+    </p>
+
+    
+    <div align="center">
+      <table class="format">
+        <caption>
+          Array Property Description for Datatype Version 2
+        </caption>
+
+        <tr>
+          <th width="25%">Byte</th>
+          <th width="25%">Byte</th>
+          <th width="25%">Byte</th>
+          <th width="25%">Byte</th>
+        </tr>
+
+	<tr>
+	  <td>Dimensionality</td>
+	  <td colspan="3">Reserved (zero)</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Dimension #1 Size</td>
+	</tr>
+	<tr>
+	  <td colspan="4">.<br />.<br />.<br /></td>
+	</tr>
+	<tr>
+	  <td colspan="4">Dimension #n Size</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Permutation Index #1</td>
+	</tr>
+	<tr>
+	  <td colspan="4">.<br />.<br />.<br /></td>
+	</tr>
+	<tr>
+	  <td colspan="4">Permutation Index #n</td>
+	</tr>
+
+        <tr>
+          <td colspan="4"><br />Base Type<br /><br /></td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Dimensionality</td>
+	  <td>
+            <p>This value is the number of dimensions that the array has.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Dimension #n Size</td>
+	  <td>
+            <p>This value is the size of the dimension of the array
+	    as stored in the file.  The first dimension stored in
+	    the list of dimensions is the slowest changing dimension
+	    and the last dimension stored is the fastest changing
+	    dimension.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Permutation Index #n</td>
+	  <td>
+            <p>This value is the index permutation used to map 
+            each dimension from the canonical representation to an 
+            alternate axis for each dimension. Currently, dimension 
+            permutations are not supported, and these indices should 
+            be set to the index position minus one. In other words, 
+            the first dimension should be set to 0, the second dimension 
+            should be set to 1, and so on.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Base Type</td>
+	  <td>
+            <p>Each array type is based on some parent type.  The
+                information for that parent type is described recursively by
+                this field.
+            </p>
+          </td>
+	</tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+        <caption>
+          Array Property Description for Datatype Version 3
+        </caption>
+
+        <tr>
+          <th width="25%">Byte</th>
+          <th width="25%">Byte</th>
+          <th width="25%">Byte</th>
+          <th width="25%">Byte</th>
+        </tr>
+
+	<tr>
+	  <td>Dimensionality</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Dimension #1 Size</td>
+	</tr>
+	<tr>
+	  <td colspan="4">.<br />.<br />.<br /></td>
+	</tr>
+	<tr>
+	  <td colspan="4">Dimension #n Size</td>
+	</tr>
+
+        <tr>
+          <td colspan="4"><br />Base Type<br /><br /></td>
+        </tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Dimensionality</td>
+	  <td>
+            <p>This value is the number of dimensions that the array has.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Dimension #n Size</td>
+	  <td>
+            <p>This value is the size of the dimension of the array
+	    as stored in the file.  The first dimension stored in
+	    the list of dimensions is the slowest changing dimension
+	    and the last dimension stored is the fastest changing
+	    dimension.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Base Type</td>
+	  <td>
+            <p>Each array type is based on some parent type.  The
+                information for that parent type is described recursively by
+                this field.
+            </p>
+          </td>
+	</tr>
+
+      </table>
+    </div>
+
+    
+
+    <br />
+    <hr />
+    <h4><a name="OldFillValueMessage">Name: Data Storage - Fill Value (Old)</a></h4>
+
+    <p class="item"><b>Header Message Type:</b> 0x0004
+    </p>
+    <p class="item"><b>Length:</b> Varies
+    </p>
+    <p class="item"><b>Status:</b> Optional; may not be repeated.
+    </p>
+
+    <p class="item"><b>Description:</b> The fill value message stores a single
+        data value which is returned to the application when an uninitialized
+        data element is read from a dataset.  The fill value is interpreted
+        with the same datatype as the dataset.  If no fill value message is
+        present then a fill value of all zero bytes is assumed.
+    </p>
+
+    <p class="item2">This fill value message is deprecated in favor of the “new”
+        fill value message (Message Type 0x0005) and is only written to the
+        file for forward compatibility with versions of the HDF5 Library before
+        the 1.6.0 version.  Additionally, it only appears for datasets with a
+        user defined fill value (as opposed to the library default fill value
+        or an explicitly set “undefined” fill value).
+    </p>
+
+    <p class="item"><b>Format of Data:</b></p>
+    
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Fill Value Message (Old)
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Size</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Fill Value <em>(optional, variable size)</em><br /><br /></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Size</td>
+	  <td>
+            <p>This is the size of the Fill Value field in bytes.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Fill Value</td>
+	  <td>
+            <p>The fill value.  The bytes of the fill value are interpreted
+                using the same datatype as for the dataset.
+            </p>
+          </td>
+	</tr>
+      </table>
+    </div>
+    
+
+    <br />
+    <hr />
+    <h4><a name="FillValueMessage">Name: Data Storage - Fill Value </a></h4>
+
+    <p class="item"><b>Header Message Type:</b> 0x0005
+    </p>
+    <p class="item"><b>Length:</b> Varies
+    </p>
+    <p class="item"><b>Status:</b> Required for dataset objects; may 
+    not be repeated.</p>
+
+    <p class="item"><b>Description:</b> The fill value message stores a single
+        data value which is returned to the application when an uninitialized
+        data element is read from a dataset.  The fill value is interpreted
+        with the same datatype as the dataset.
+    </p>
+
+    <p class="item"><b>Format of Data:</b></p>
+    
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Fill Value Message - Versions 1 & 2
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>Space Allocation Time</td>
+	  <td>Fill Value Write Time</td>
+	  <td>Fill Value Defined</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Size <em>(optional)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Fill Value <em>(optional, variable size)</em><br /><br /></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>
+            <p>The version number information is used for changes in the
+                format of the fill value message and is described here:
+                <table class="list">
+                    <tr>
+                      <th width="20%">Version</th>
+                      <th width="80%" align="left">Description</th>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>0</code></td>
+                      <td>Never used
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>1</code></td>
+                      <td>Initial version of this message.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>2</code></td>
+                      <td>In this version, the Size and Fill Value fields are
+                        only present if the Fill Value Defined field is set
+                        to 1.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>3</code></td>
+                      <td>This version packs the other fields in the message
+                        more efficiently than version 2.
+                      </td>
+                    </tr>
+                </table></p>
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Space Allocation Time</td>
+	  <td>
+            <p>When the storage space for the dataset’s raw data will be
+                allocated.  The allowed values are:
+                <table class="list">
+                    <tr>
+                      <th width="20%">Value</th>
+                      <th width="80%" align="left">Description</th>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>0</code></td>
+                      <td>Not used.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>1</code></td>
+                      <td>Early allocation.  Storage space for the entire dataset
+                        should be allocated in the file when the dataset is
+                        created.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>2</code></td>
+                      <td>Late allocation.  Storage space for the entire dataset
+                        should not be allocated until the dataset is written
+                        to.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>3</code></td>
+                      <td>Incremental allocation.  Storage space for the
+                        dataset should not be allocated until the portion
+                        of the dataset is written to.  This is currently
+                        used in conjunction with chunked data storage for
+                        datasets.
+                      </td>
+                    </tr>
+                </table></p>
+            
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Fill Value Write Time</td>
+	  <td>
+            <p>At the time that storage space for the dataset’s raw data is
+                allocated, this value indicates whether the fill value should
+                be written to the raw data storage elements.  The allowed values
+                are:
+                <table class="list">
+                    <tr>
+                      <th width="20%">Value</th>
+                      <th width="80%" align="left">Description</th>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>0</code></td>
+                      <td>On allocation.  The fill value is always written to
+                        the raw data storage when the storage space is allocated.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>1</code></td>
+                      <td>Never.  The fill value should never be written to
+                        the raw data storage.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>2</code></td>
+                      <td>Fill value written if set by user.  The fill value
+                        will be written to the raw data storage when the storage
+                        space is allocated only if the user explicitly set
+                        the fill value.  If the fill value is the library
+                        default or is undefined, it will not be written to
+                        the raw data storage.
+                      </td>
+                    </tr>
+                </table></p>
+            
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Fill Value Defined</td>
+	  <td>
+            <p>This value indicates if a fill value is defined for this
+                dataset.  If this value is 0, the fill value is undefined.
+                If this value is 1, a fill value is defined for this dataset.
+                For version 2 or later of the fill value message, this value
+                controls the presence of the Size and Fill Value fields.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Size</td>
+	  <td>
+            <p>This is the size of the Fill Value field in bytes.  This field
+                is not present if the Version field is greater than 1, 
+                and the Fill Value Defined field is set to 0.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Fill Value</td>
+	  <td>
+            <p>The fill value.  The bytes of the fill value are interpreted
+                using the same datatype as for the dataset.  This field is
+                not present if the Version field is greater than 1, 
+                and the Fill Value Defined field is set to 0.
+            </p>
+          </td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Fill Value Message - Version 3
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>Flags</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Size <em>(optional)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Fill Value <em>(optional, variable size)</em><br /><br /></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>
+            <p>The version number information is used for changes in the
+                format of the fill value message and is described here:
+                <table class="list">
+                    <tr>
+                      <th width="20%">Version</th>
+                      <th width="80%" align="left">Description</th>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>0</code></td>
+                      <td>Never used
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>1</code></td>
+                      <td>Initial version of this message.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>2</code></td>
+                      <td>In this version, the Size and Fill Value fields are
+                        only present if the Fill Value Defined field is set
+                        to 1.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>3</code></td>
+                      <td>This version packs the other fields in the message
+                        more efficiently than version 2.
+                      </td>
+                    </tr>
+                </table></p>
+            
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Flags</td>
+	  <td>
+            <p>When the storage space for the dataset’s raw data will be
+                allocated.  The allowed values are:
+                <table class="list">
+                    <tr>
+                      <th width="20%">Bits</th>
+                      <th width="80%" align="left">Description</th>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>0-1</code></td>
+                      <td>Space Allocation Time, with the same
+                        values as versions 1 and 2 of the message.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>2-3</code></td>
+                      <td>Fill Value Write Time, with the same
+                        values as versions 1 and 2 of the message.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>4</code></td>
+                      <td>Fill Value Undefined, indicating that the fill
+                        value has been marked as “undefined” for this dataset.
+                        Bits 4 and 5 cannot both be set.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>5</code></td>
+                      <td>Fill Value Defined, with the same values as
+                        versions 1 and 2 of the message.
+                        Bits 4 and 5 cannot both be set.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>6-7</code></td>
+                      <td>Reserved (zero).
+                      </td>
+                    </tr>
+                </table></p>
+            
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Size</td>
+	  <td>
+            <p>This is the size of the Fill Value field in bytes.  This field
+                is not present if the Version field is greater than 1, 
+                and the Fill Value Defined flag is set to 0.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Fill Value</td>
+	  <td>
+            <p>The fill value.  The bytes of the fill value are interpreted
+                using the same datatype as for the dataset.  This field is
+                not present if the Version field is greater than 1, 
+                and the Fill Value Defined flag is set to 0.
+            </p>
+          </td>
+	</tr>
+      </table>
+    </div>
+    
+
+    <br />
+    <hr />
+    <h4><a name="LinkMessage">Name: Link Message</a></h4>
+    <p class="item"><b>Header Message Type:</b> 0x0006</p>
+    <p class="item"><b>Length:</b> Varies </p>
+    <p class="item"><b>Status:</b> Optional; may be repeated. </p>
+
+    <p class="item"><b>Description:</b> This message encodes the information
+        for a link in a group’s object header, when the group is storing its
+        links “compactly”, or in the group’s fractal heap, when the group is
+        storing its links “densely”.
+    </p>
+    <p>
+        A group is storing its links compactly when the fractal heap address in
+        the <em><a href="#LinkInfoMessage">Link Info Message</a></em>
+        is set to the “undefined address” value.
+    </p>
+
+    <p class="item"><b>Format of Data:</b></p>
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Link Message
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>Flags</td>
+	  <td>Link type <em>(optional)</em></td>
+          <td bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Creation Order <em>(8 bytes, optional)</em><br /><br /></td>
+	</tr>
+	<tr>
+	  <td>Link Name Character Set <em>(optional)</em></td>
+	  <td>Length of Link Name (variable size)</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+	<tr>
+	  <td colspan="4">Link Name (variable size)</td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Link Information (variable size)<br /><br /></td>
+	</tr>
+    </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td><p>The version number for this message. This document describes version 1.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	<td>Flags</td>
+	  <td><p>This field contains information about the link and controls
+                the presence of other fields below.
+                <table class="list">
+                    <tr>
+                      <th width="20%">Bits</th>
+                      <th width="80%" align="left">Description</th>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>0-1</code></td>
+                      <td>Determines the size of the <em>Length of Link Name</em>
+                        field.
+                        <table class="list">
+                            <tr>
+                              <th width="20%">Value</th>
+                              <th width="80%" align="left">Description</th>
+                            </tr>
+
+                            <tr>
+                              <td align="center"><code>0</code></td>
+                              <td>The size of the <em>Length of Link Name</em>
+                                field is 1 byte.
+                              </td>
+                            </tr>
+                            <tr>
+                              <td align="center"><code>1</code></td>
+                              <td>The size of the <em>Length of Link Name</em>
+                                field is 2 bytes.
+                              </td>
+                            </tr>
+                            <tr>
+                              <td align="center"><code>2</code></td>
+                              <td>The size of the <em>Length of Link Name</em>
+                                field is 4 bytes.
+                              </td>
+                            </tr>
+                            <tr>
+                              <td align="center"><code>3</code></td>
+                              <td>The size of the <em>Length of Link Name</em>
+                                field is 8 bytes.
+                              </td>
+                            </tr>
+                        </table>
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>2</code></td>
+                      <td>Creation Order Field Present: if set, the <em>Creation
+                        Order</em> field is present.  If not set, creation order
+                        information is not stored for links in this group.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>3</code></td>
+                      <td>Link Type Field Present: if set, the link is not
+                        a hard link and the <em>Link Type</em> field is present.
+                        If not set, the link is a hard link.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>4</code></td>
+                      <td>Link Name Character Set Field Present: if set, the
+                        link name is not represented with the ASCII character
+                        set and the <em>Link Name Character Set</em> field is
+                        present.  If not set, the link name is represented with
+                        the ASCII character set.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>5-7</code></td>
+                      <td>Reserved (zero).
+                      </td>
+                    </tr>
+                </table></p>
+          
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Link type</td>
+	  <td><p>This is the link class type and can be one of the following
+                values:
+                <table class="list">
+                    <tr>
+                      <th width="20%">Value</th>
+                      <th width="80%" align="left">Description</th>
+                    </tr>
+
+                    <tr>
+                      <td align="center"><code>0</code></td>
+                      <td>A hard link (should never be stored in the file)
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>1</code></td>
+                      <td>A soft link.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>2-63</code></td>
+                      <td>Reserved for future HDF5 internal use.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>64</code></td>
+                      <td>An external link.
+                      </td>
+                    </tr>
+                    <tr>
+                      <td align="center"><code>65-255</code></td>
+                      <td>Reserved, but available for user-defined link types.
+                      </td>
+                    </tr>
+                </table></p>
+            
+	    <p>This field is present if bit 3 of <em>Flags</em> is set.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Creation Order</td>
+	  <td><p>This 64-bit value is an index of the link’s creation time within
+            the group.  Values start at 0 when the group is created an increment
+            by one for each link added to the group.  Removing a link from a
+            group does not change existing links’ creation order field.
+            </p>
+	    <p>This field is present if bit 2 of <em>Flags</em> is set.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Link Name Character Set</td>
+	  <td><p>This is the character set for encoding the link’s name:
+            <table class="list">
+                <tr>
+                  <th width="20%">Value</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>0</code></td>
+                  <td>ASCII character set encoding (this should never be stored
+                    in the file)
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>1</code></td>
+                  <td>UTF-8 character set encoding
+                  </td>
+                </tr>
+            </table></p>
+            
+	    <p>This field is present if bit 4 of <em>Flags</em> is set.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Length of link name</td>
+	  <td><p>This is the length of the link’s name.  The size of this field 
+	    depends on bits 0 and 1 of <em>Flags</em>.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Link name</td>
+	  <td><p>This is the name of the link, non-NULL terminated.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Link information</td>
+	  <td><p>The format of this field depends on the <em>link type</em>.</p>
+            <p>For <b>hard</b> links, the field is formatted as follows:
+            
+            <table class="list">
+                <tr>
+                  <td width="20%"><i>Size of Offsets</i> bytes:</td>
+                  <td width="80%">The address of the object header for the object that the
+                    link points to.
+                  </td>
+                </tr>
+            </table>
+            </p>
+
+            <p>
+            For <b>soft</b> links, the field is formatted as follows:
+            
+            <table class="list">
+                <tr>
+                  <td width="20%">Bytes 1-2:</td>
+                  <td width="80%">Length of soft link value.</td>
+                </tr>
+                <tr>
+                  <td><em>Length of soft link value</em> bytes:</td>
+                  <td>A non-NULL-terminated string storing the value of the
+                    soft link.
+                  </td>
+                </tr>
+	    </table>
+        </p>
+
+            <p>
+            For <b>external</b> links, the field is formatted as follows:
+            
+            <table class="list">
+                <tr>
+                  <td width="20%">Bytes 1-2:</td>
+                  <td width="80%">Length of external link value.</td>
+                </tr>
+                <tr>
+                  <td><em>Length of external link value</em> bytes:</td>
+                  <td>The first byte contains the version number in the 
+                  upper 4 bits and flags in the lower 4 bits for the external 
+                  link. Both version and flags are defined to be zero in 
+                  this document. The remaining bytes consist of two 
+                  NULL-terminated strings, with no padding between them. 
+                  The first string is the name of the HDF5 file containing 
+                  the object linked to and the second string is the full path 
+                  to the object linked to, within the HDF5 file’s 
+                  group hierarchy.
+                  </td>
+                </tr>
+            </table>
+            </p>
+
+            <p>
+            For <b>user-defined</b> links, the field is formatted as follows:
+            
+            <table class="list">
+                <tr>
+                  <td width="20%">Bytes 1-2:</td>
+                  <td width="80%">Length of user-defined data.</td>
+                </tr>
+                <tr>
+                  <td><em>Length of user-defined link value</em> bytes:</td>
+                  <td>The data supplied for the user-defined link type.</td>
+                </tr>
+            </table>
+            </p>
+
+          </td>
+        </tr>
+      </table>
+    </div>
+
+    <br />
+    <hr />
+    <h4><a name="ExternalFileListMessage">Name: Data Storage -
+	External Data Files</a></h4>
+    <p class="item"><b>Header Message Type:</b> 0x0007 </p>
+    <p class="item"><b>Length:</b> Varies</p>
+    <p class="item"><b>Status:</b> Optional; may not be repeated.</p>
+
+    <p class="item"><b>Description:</b> The external data storage
+      message indicates that the data for an object is stored outside the HDF5
+      file.  The filename of the object is stored as a Universal
+      Resource Location (URL) of the actual filename containing the
+      data. An external file list record also contains the byte offset
+      of the start of the data within the file and the amount of space
+      reserved in the file for that data.</p>
+
+    <p class="item"><b>Format of Data:</b></p>
+    
+    <div align="center">
+      <table class="format">
+	<caption>
+	  External File List Message
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td colspan="3">Reserved (zero)</td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Allocated Slots</td>
+	  <td colspan="2">Used Slots</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Heap Address<sup>O</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Slot Definitions...<br /><br /></td>
+	</tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>	
+
+    <br />
+    <div align="center">
+	<table class="desc">
+	  <tr>
+	    <th width="30%">Field Name</th>
+	    <th>Description</th>
+	  </tr>
+	
+	  <tr>
+	    <td>Version</td>
+	    <td>
+	      <p>The version number information is used for changes in the format of
+                External Data Storage Message and is described here:
+		 <table class="list">
+		     <tr>
+			<th width="20%">Version</th>
+			<th width="80%" align="left">Description</th>
+		     </tr>
+		     <tr>
+			<td align="center"><code>0</code></td>
+			<td>Never used.</td>
+		     </tr>
+		     <tr>
+			<td align="center"><code>1</code></td>
+			<td>The current version used by the library.</td>
+		     </tr>
+		  </table></p>
+	      
+	    </td>
+	  </tr>
+
+	  <tr>
+	    <td>Allocated Slots</td>
+	    <td>
+	      <p>The total number of slots allocated in the message.  Its value must be at least as
+		 large as the value contained in the Used Slots field. (The current library simply
+		 uses the number of Used Slots for this message)</p>
+	    </td>
+	  </tr>
+
+	  <tr>
+	    <td>Used Slots</td>
+	    <td>
+	      <p>The number of initial slots which contains valid information.</p>
+	    </td>
+	  </tr>
+
+	  <tr>
+	    <td>Heap Address</td>
+	    <td>
+	      <p>This is the address of a local heap which contains the names for the external 
+		 files (The local heap information can be found in Disk Format Level 1D in this
+		 document).  The name at offset zero in the heap is always the empty string.</p>
+	    </td>
+	  </tr>
+
+	  <tr>
+	    <td>Slot Definitions</td>
+	    <td>
+	      <p>The slot definitions are stored in order according to the array addresses they 
+		 represent.</p>
+	    </td>
+	  </tr>
+
+	</table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+	<caption>
+	  External File List Slot 
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Name Offset in Local Heap<sup>L</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Offset in External Data File<sup>L</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Data Size in External File<sup>L</sup><br /><br /></td>
+	</tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>	
+
+    <br />
+    <div align="center">
+	<table class="desc">
+	  <tr>
+	    <th width="30%">Field Name</th>
+	    <th>Description</th>
+	  </tr>
+	
+	  <tr>
+	    <td>Name Offset in Local Heap</td>
+	    <td>
+		<p>The byte offset within the local name heap for the name
+	    	of the file.  File names are stored as a URL which has a
+	    	protocol name, a host name, a port number, and a file
+	    	name:
+		<code><em>protocol</em>:<em>port</em>//<em>host</em>/<em>file</em></code>.
+		If the protocol is omitted then “file:” is assumed.  If
+		the port number is omitted then a default port for that
+		protocol is used.  If both the protocol and the port
+		number are omitted then the colon can also be omitted. If
+		the double slash and host name are omitted then
+		“localhost” is assumed.  The file name is the only
+		mandatory part, and if the leading slash is missing then
+		it is relative to the application’s current working
+		directory (the use of relative names is not
+		recommended).
+                </p>
+	    </td>
+	  </tr>
+
+	  <tr>
+	    <td>Offset in External Data File</td>
+	    <td>
+	  	<p>This is the byte offset to the start of the data in the
+	        specified file. For files that contain data for a single
+	        dataset this will usually be zero.</p>
+	    </td>
+	  </tr>
+
+	  <tr>
+	    <td>Data Size in External File</td>
+	    <td>
+		<p>This is the total number of bytes reserved in the
+		specified file for raw data storage.  For a file that
+		contains exactly one complete dataset which is not
+		extendable, the size will usually be the exact size of the
+		dataset.  However, by making the size larger one allows
+		HDF5 to extend the dataset. The size can be set to a value
+		larger than the entire file since HDF5 will read zeroes
+		past the end of the file without failing.</p>
+	    </td>
+	  </tr>
+	</table>
+    </div>
+    
+
+    <br />
+    <hr />
+    <h4><a name="LayoutMessage">Name: Data Storage - Layout</a></h4>
+
+    <p class="item"><b>Header Message Type:</b> 0x0008</p>
+    <p class="item"><b>Length:</b> Varies</p>
+    <p class="item"><b>Status:</b> Required for datasets; may not be repeated.</p>
+
+    <p class="item"><b>Description:</b> Data layout describes how the
+      elements of a multi-dimensional array are stored in the HDF5 file.
+      Three types of data layout are supported:</p>
+
+    <ol>
+      <li>Contiguous: The array is stored in one contiguous area of the file.
+	This layout requires that the size of the array be constant and
+	does not permit chunking, compression, checksums, encryption,
+	etc.  The message stores the total storage size of the array.  The
+	offset of an element from the beginning of the storage area is
+	computed as in a C array.</li>
+
+      <li>Chunked: The array domain is regularly decomposed into chunks and
+	each chunk is allocated and stored separately.  This layout supports
+	arbitrary element traversals, compression, encryption, and
+	checksums, etc.  (these features are described in other
+	messages).  The message stores the size of a chunk instead of
+	the size of the entire array; the storage size of the entire array can
+	be calculated by traversing the B-tree that stores the chunk
+	addresses.</li>
+
+      <li>Compact: The array is stored in one contiguous block, as part of
+        this object header message.</li>
+    </ol>
+    
+    <p class="item"><b>Format of Data:</b></p>
+    
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Data Layout Message (Versions 1 and 2)
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>Dimensionality</td>
+	  <td>Layout Class</td>
+	  <td>Reserved <em>(zero)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Reserved <em>(zero)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Data Address<sup>O</sup> <em>(optional)</em><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Dimension 0 Size</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Dimension 1 Size</td>
+	</tr>
+	
+	<tr>
+	  <td colspan="4">...</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Dimension #n Size</td>
+	</tr>
+	
+	<tr>
+	  <td colspan="4">Dataset Element Size <em>(optional)</em></td>
+	</tr>
+	
+	<tr>
+	  <td colspan="4">Compact Data Size <em>(optional)</em></td>
+	</tr>
+	
+	<tr>
+	  <td colspan="4"><br />Compact Data... <em>(variable size, optional)</em><br /><br /></td>
+	</tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+	  <th width="30%">Field Name</th>
+	  <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>
+	    <p>The version number information is used for changes in the format of the data 
+	    layout message and is described here:
+	      <table class="list">
+		<tr>
+		  <th width="20%">Version</th>
+		  <th width="80%" align="left">Description</th>
+		</tr>
+
+		<tr>
+		  <td align="center"><code>0</code></td>
+		  <td>Never used.</td>
+		</tr>
+
+		<tr>
+		  <td align="center"><code>1</code></td>
+		  <td>Used by version 1.4 and before of the library to encode layout information.
+		      Data space is always allocated when the data set is created.</td>
+		</tr>
+
+		<tr>
+		  <td align="center"><code>2</code></td>
+		  <td>Used by version 1.6.x of the library to encode layout information.
+		      Data space is allocated only when it is necessary.</td>
+		</tr>
+	      </table></p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Dimensionality</td>
+	  <td><p>An array has a fixed dimensionality.  This field 
+	    specifies the number of dimension size fields later in the 
+	    message. The value stored for chunked storage is 1 greater than 
+        the number of dimensions in the dataset’s dataspace. 
+        For example, 2 is stored for a 1 dimensional dataset.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Layout Class</td>
+	  <td><p>The layout class specifies the type of storage for the data
+            and how the other fields of the layout message are to be
+            interpreted.
+            
+	      <table class="list">
+		<tr>
+		  <th width="20%">Value</th>
+		  <th width="80%" align="left">Description</th>
+		</tr>
+
+		<tr>
+		  <td align="center"><code>0</code></td>
+		  <td>Compact Storage
+                  </td>
+		</tr>
+
+		<tr>
+		  <td align="center"><code>1</code></td>
+		  <td>Contiguous Storage
+                  </td>
+		</tr>
+
+		<tr>
+		  <td align="center"><code>2</code></td>
+		  <td>Chunked Storage
+                  </td>
+		</tr>
+	      </table>
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Data Address</td>
+	  <td><p>For contiguous storage, this is the address of the raw
+	    data in the file.  For chunked storage this is the address
+	    of the v1 B-tree that is used to look up the addresses of the
+	    chunks.  This field is not present for compact storage.
+            If the version for this message is greater than 1, the address
+            may have the “undefined address” value, to indicate that
+            storage has not yet been allocated for this array.</p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Dimension #n Size</td>
+	  <td><p>For contiguous and compact storage the dimensions define
+            the entire size of the array while for chunked storage they define
+            the size of a single chunk.  In all cases, they are in units of 
+            array elements (not bytes).  The first dimension stored in the list
+            of dimensions is the slowest changing dimension and the last
+            dimension stored is the fastest changing dimension.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Dataset Element Size</td>
+	  <td><p>The size of a dataset element, in bytes.  This field is only
+            present for chunked storage.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Compact Data Size</td>
+	  <td><p>This field is only present for compact data storage.
+            It contains the size of the raw data for the dataset array, in
+            bytes.</p>
+          </td>
+    </tr>
+
+	<tr>
+	  <td>Compact Data</td>
+	  <td><p>This field is only present for compact data storage.
+            It contains the raw data for the dataset array.</p>
+          </td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <p>Version 3 of this message re-structured the format into specific
+        properties that are required for each layout class.</p>
+
+    
+    <div align="center">
+      <table class="format">
+	<caption>
+	  <b>Data Layout Message (Version 3)</b>
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>Layout Class</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Properties <em>(variable size)</em><br /><br /></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+	  <th width="30%">Field Name</th>
+	  <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>
+	    <p>The version number information is used for changes in the format of layout message
+	       and is described here:
+	      <table class="list">	
+		<tr>
+		  <th width="20%">Version</th>
+		  <th width="80%" align="left">Description</th>
+		</tr>
+
+		<tr>
+		  <td align="center"><code>3</code></td>
+		  <td>Used by the version 1.6.3 and later of the library to store properties 
+		      for each layout class.</td>
+		</tr>
+	      </table></p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Layout Class</td>
+	  <td><p>The layout class specifies the type of storage for the data
+            and how the other fields of the layout message are to be
+            interpreted.
+	      <table class="list">
+		<tr>
+		  <th width="20%">Value</th>
+		  <th width="80%" align="left">Description</th>
+		</tr>
+
+		<tr>
+		  <td align="center"><code>0</code></td>
+		  <td>Compact Storage 
+                  </td>
+		</tr>
+
+		<tr>
+		  <td align="center"><code>1</code></td>
+		  <td>Contiguous Storage
+                  </td>
+		</tr>
+
+		<tr>
+		  <td align="center"><code>2</code></td>
+		  <td>Chunked Storage
+                  </td>
+		</tr>
+	      </table>
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Properties</td>
+	  <td><p>This variable-sized field encodes information specific to each
+            layout class and is described below.  If there is no property
+            information specified for a layout class, the size of this field
+            is zero bytes.</p></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <p>Class-specific information for compact layout (Class 0):  (Note: The dimensionality information
+       is in the Dataspace message)</p>
+
+    
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Compact Storage Property Description
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Size</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+	
+	<tr>
+	  <td colspan="4"><br />Raw Data... <em>(variable size)</em><br /><br /></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Size</td>
+	  <td><p>This field contains the size of the raw data for the dataset
+                array, in bytes.
+              </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Raw Data</td>
+	  <td><p>This field contains the raw data for the dataset array.</p></td>
+	</tr>
+      </table>
+    </div>
+    
+
+    <br />
+    <p>Class-specific information for contiguous layout (Class 1):  (Note: The dimensionality information
+       is in the Dataspace message)</p>
+
+    
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Contiguous Storage Property Description
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Size<sup>L</sup><br /><br /></td>
+	</tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+        <tr>
+        <td> </td>
+        <td>
+            (Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Address</td>
+	  <td><p>This is the address of the raw data in the file.
+            The address may have the “undefined address” value, to indicate
+            that storage has not yet been allocated for this array.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Size</td>
+	  <td><p>This field contains the size allocated to store the raw data,
+                in bytes.
+              </p>
+          </td>
+	</tr>
+      </table>
+    </div>
+    
+
+    <br />
+    <p>Class-specific information for chunked layout (Class 2):</p>
+
+    
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Chunked Storage Property Description
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Dimensionality</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Address<sup>O</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Dimension 0 Size</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Dimension 1 Size</td>
+	</tr>
+	
+	<tr>
+	  <td colspan="4">...</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Dimension #n Size</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Dataset Element Size</td>
+	</tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Dimensionality</td>
+	  <td><p>A chunk has a fixed dimensionality.  This field specifies 
+	    the number of dimension size fields later in the message.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Address</td>
+	  <td><p>This is the address of the v1 B-tree that is used to look up the
+            addresses of the chunks that actually store portions of the array
+            data.  The address may have the “undefined address” value, to
+            indicate that storage has not yet been allocated for this array.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Dimension #n Size</td>
+	  <td><p>These values define the dimension size of a single chunk, in
+            units of array elements (not bytes).  The first dimension stored in
+            the list of dimensions is the slowest changing dimension and the
+            last dimension stored is the fastest changing dimension.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Dataset Element Size</td>
+	  <td><p>The size of a dataset element, in bytes.
+            </p>
+          </td>
+	</tr>
+      </table>
+    </div>
+    <br />
+
+    <hr />
+    <h4><a name="BogusMessage">Name: Bogus</a></h4>
+    <p class="item"><b>Header Message Type:</b> 0x0009</p>
+    <p class="item"><b>Length:</b> 4 bytes</p>
+    <p class="item"><b>Status:</b> For testing only; should never be 
+    stored in a valid file.</p>
+    <p class="item"><b>Description:</b> This message is used for
+        testing the HDF5 Library’s response to an “unknown” message type and
+        should never be encountered in a valid HDF5 file.</p>
+    <p class="item"><b>Format of Data:</b></p>
+    
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Bogus Message
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Bogus Value</td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+	  <th width="30%">Field Name</th>
+	  <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Bogus Value</td>
+	  <td>
+	    <p>This value should always be: <code>0xdeadbeef</code>.</p>
+	  </td>
+	</tr>
+      </table>
+    </div>
+    <br />
+
+    <hr />
+    <h4><a name="GroupInfoMessage">Name: Group Info</a></h4>
+    <p class="item"><b>Header Message Type:</b> 0x000A</p>
+    <p class="item"><b>Length:</b> Varies</p>
+    <p class="item"><b>Status:</b> Optional; may not be repeated.</p>
+    <p class="item"><b>Description:</b> This message stores information for the
+        constants defining a “new style” group’s behavior.  Constant information
+        will be stored in this message and variable information will be stored
+        in the <a href="#LinkInfoMessage">Link Info</a> message.</p>
+
+    <p>Note: the “estimated entry” information below is used when determining
+        the size of the object header for the group when it is created.
+    </p>
+
+    <p class="item"><b>Format of Data:</b></p>
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Group Info Message
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>Flags</td>
+	  <td colspan="2">Link Phase Change: Maximum Compact Value <em>(optional)</em></td>
+	</tr>
+	<tr>
+	  <td colspan="2">Link Phase Change: Minimum Dense Value <em>(optional)</em></td>
+	  <td colspan="2">Estimated Number of Entries <em>(optional)</em></td>
+	</tr>
+	<tr>
+	  <td colspan="2">Estimated Link Name Length of Entries <em>(optional)</em></td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td><p>The version number for this message. This document describes version 0.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	<td>Flags</td>
+	  <td><p>This is the group information flag with the following definition:
+	      
+            <table class="list">
+                <tr>
+                  <th width="20%">Bit</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>0</code></td>
+                  <td>If set, link phase change values are stored.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>1</code></td>
+                  <td>If set, the estimated entry information is non-default
+                    and is stored.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>2-7</code></td>
+                  <td>Reserved</td>
+                </tr>
+	    </table></p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Link Phase Change: Maximum Compact Value</td>
+	  <td><p>The is the maximum number of links to store “compactly” (in
+                the group’s object header).</p>
+	      <p>This field is present if bit 0 of <em>Flags</em> is set.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Link Phase Change: Minimum Dense Value</td>
+	  <td><p>This is the minimum number of links to store “densely” (in
+                the group’s fractal heap).  The fractal heap’s address is
+                located in the <a href="#LinkInfoMessage">Link Info</a>
+                message.</p>
+	      <p>This field is present if bit 0 of <em>Flags</em> is set.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Estimated Number of Entries</td>
+	  <td><p>This is the estimated number of entries in groups.</p>
+	      <p>If this field is not present, the default value of <code>4</code>
+                will be used for the estimated number of group entries.</p>
+	      <p>This field is present if bit 1 of <em>Flags</em> is set.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Estimated Link Name Length of Entries</td>
+	  <td><p>This is the estimated length of entry name.</p>
+	      <p>If this field is not present, the default value of <code>8</code>
+                will be used for the estimated link name length of group entries.</p>
+	      <p>This field is present if bit 1 of <em>Flags</em> is set.</p>
+	  </td>
+	</tr>
+
+      </table>
+    </div>
+    </p>
+    <br />
+
+    <hr />
+    <h4><a name="FilterMessage">Name: Data Storage - Filter Pipeline</a></h4>
+    <p class="item"><b>Header Message Type:</b> 0x000B</p>
+    <p class="item"><b>Length:</b> Varies</p>
+    <p class="item"><b>Status:</b> Optional; may not be repeated.</p>
+
+    <p class="item"><b>Description:</b> This message describes the
+      filter pipeline which should be applied to the data stream by
+      providing filter identification numbers, flags, a name, and
+      client data.</p>
+
+    <p>This message may be present in the object headers of both
+        dataset and group objects. For datasets, it specifies the
+        filters to apply to raw data. For groups, it specifies the
+        filters to apply to the group’s fractal heap. Currently,
+        only datasets using chunked data storage use the filter
+        pipeline on their raw data.</p>
+
+    <p class="item"><b>Format of Data:</b></p>
+    
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Filter Pipeline Message - Version 1
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>  
+
+	<tr>
+	  <td>Version</td>
+	  <td>Number of Filters</td>
+	  <td colspan="2">Reserved (zero)</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Reserved (zero)</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Filter Description List <em>(variable size)</em><br /><br /></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td><p>The version number for this message.  This table
+	    describes version 1.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Number of Filters</td>
+	  <td><p>The total number of filters described in this
+	    message. The maximum possible number of filters in a
+	    message is 32.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Filter Description List</td>
+	  <td><p>A description of each filter.  A filter description
+	    appears in the next table.</p></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Filter Description
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>  
+
+	<tr>
+	  <td colspan="2">Filter Identification Value</td>
+	  <td colspan="2">Name Length</td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Flags</td>
+	  <td colspan="2">Number Client Data Values</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Name <em>(variable size, optional)</em><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Client Data <em>(variable size, optional)</em><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Padding <em>(variable size, optional)</em></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Filter Identification Value</td>
+	  <td>
+            <p>
+            This value, often referred to as a filter identifier,
+            is designed to be a unique identifier for the filter. 
+            Values from zero through 32,767 are reserved for filters 
+            supported by The HDF Group in the HDF5 Library and for 
+            filters requested and supported by third parties. 
+            Filters supported by The HDF Group are documented immediately
+            below.  Information on 3rd-party filters can be found at 
+            The HDF Group’s 
+            <a href="http://www.hdfgroup.org/services/contributions.html">
+            Contributions</a> page.</p>
+            
+            <p>
+            To request a filter identifier, please contact 
+            The HDF Group’s Help Desk at
+            <img src="Graphics/help.png" valign="middle" height="14"
+            alt="The HDF Group Help Desk">.
+            You will be asked to provide the following information:</p>
+            <ol>
+              <li>Contact information for the developer requesting the
+                  new identifier</li> 
+              <li>A short description of the new filter</li> 
+              <li>Links to any relevant information, including licensing 
+                  information</li> 
+            </ol>
+            <p>
+            Values from 32768 to 65535 are reserved for non-distributed uses 
+            (for example, internal company usage) or for application usage 
+            when testing a feature. The HDF Group does not track or document 
+            the use of the filters with identifiers from this range.</p>
+
+            <p>
+            The filters currently in library version 1.8.0 are 
+	    listed below:
+        
+	    <table class="list">
+	      <tr>
+		<th width="15%">Identification</th>
+		<th width="15%" align="left">Name</th>
+		<th width="70%" align="left">Description</th>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>0</code></td>
+		<td>N/A</td>
+		<td>Reserved</td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>1</code></td>
+		<td>deflate</td>
+		<td>GZIP deflate compression</td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>2</code></td>
+		<td>shuffle</td>
+		<td>Data element shuffling</td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>3</code></td>
+		<td>fletcher32</td>
+		<td>Fletcher32 checksum</td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>4</code></td>
+		<td>szip</td>
+		<td>SZIP compression</td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>5</code></td>
+		<td>nbit</td>
+		<td>N-bit packing</td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>6</code></td>
+		<td>scaleoffset</td>
+		<td>Scale and offset encoded values</td>
+	      </tr>
+	    </table>
+        </p></td>
+	</tr>
+
+	<tr>
+	  <td>Name Length</td>
+	  <td><p>Each filter has an optional null-terminated ASCII name
+	    and this field holds the length of the name including the
+	    null termination padded with nulls to be a multiple of
+	    eight. If the filter has no name then a value of zero is
+	    stored in this field.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Flags</td>
+	  <td><p>The flags indicate certain properties for a filter.  The 
+	    bit values defined so far are:
+	    <table class="list">
+	      <tr>
+		<th width="20%">Bit</th>
+		<th width="80%" align="left">Description</th>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>0</code></td>
+	        <td>If set then the filter is an optional filter.
+		During output, if an optional filter fails it will be
+		silently skipped in the pipeline.</td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>1-15</code></td>
+	        <td>Reserved (zero)</td>
+	      </tr>
+	    </table></p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Number of Client Data Values</td>
+	  <td><p>Each filter can store integer values to control
+	    how the filter operates.  The number of entries in the
+	    <em>Client Data</em> array is stored in this field.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Name</td>
+	  <td><p>If the <em>Name Length</em> field is non-zero then it will
+	    contain the size of this field, padded to a multiple of eight.  This 
+	    field contains a null-terminated, ASCII character
+	    string to serve as a comment/name for the filter.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Client Data</td>
+	  <td><p>This is an array of four-byte integers which will be
+	    passed to the filter function.  The <em>Client Data Number</em> of
+	    Values determines the number of elements in the array.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Padding</td>
+	  <td><p>Four bytes of zeroes are added to the message at this
+	    point if the Client Data Number of Values field contains
+	    an odd number.</p></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Filter Pipeline Message - Version 2
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>  
+
+	<tr>
+	  <td>Version</td>
+	  <td>Number of Filters</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Filter Description List <em>(variable size)</em><br /><br /></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td><p>The version number for this message.  This table
+	    describes version 2.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Number of Filters</td>
+	  <td><p>The total number of filters described in this
+	    message. The maximum possible number of filters in a
+	    message is 32.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Filter Description List</td>
+	  <td><p>A description of each filter.  A filter description
+	    appears in the next table.</p></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Filter Description
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>  
+
+	<tr>
+	  <td colspan="2">Filter Identification Value</td>
+	  <td colspan="2">Name Length <em>(optional)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Flags</td>
+	  <td colspan="2">Number Client Data Values</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Name <em>(variable size, optional)</em><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Client Data <em>(variable size, optional)</em><br /><br /></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Filter Identification Value</td>
+	  <td>
+            <p>
+            This value, often referred to as a filter identifier,
+            is designed to be a unique identifier for the filter. 
+            Values from zero through 32,767 are reserved for filters 
+            supported by The HDF Group in the HDF5 Library and for 
+            filters requested and supported by third parties. 
+            Filters supported by The HDF Group are documented immediately
+            below.  Information on 3rd-party filters can be found at 
+            The HDF Group’s 
+            <a href="http://www.hdfgroup.org/services/contributions.html">
+            Contributions</a> page.</p>
+            
+            <p>
+            To request a filter identifier, please contact 
+            The HDF Group’s Help Desk at
+            <img src="Graphics/help.png" valign="middle" height="14"
+            alt="The HDF Group Help Desk">.
+            You will be asked to provide the following information:</p>
+            <ol>
+              <li>Contact information for the developer requesting the
+                  new identifier</li> 
+              <li>A short description of the new filter</li> 
+              <li>Links to any relevant information, including licensing 
+                  information</li> 
+            </ol>
+            <p>
+            Values from 32768 to 65535 are reserved for non-distributed uses 
+            (for example, internal company usage) or for application usage 
+            when testing a feature. The HDF Group does not track or document 
+            the use of the filters with identifiers from this range.</p>
+
+            <p>
+            The filters currently in library version 1.8.0 are 
+	    listed below:
+        
+	    <table class="list">
+	      <tr>
+		<th width="15%">Identification</th>
+		<th width="15%" align="left">Name</th>
+		<th width="70%" align="left">Description</th>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>0</code></td>
+		<td>N/A</td>
+		<td>Reserved</td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>1</code></td>
+		<td>deflate</td>
+		<td>GZIP deflate compression</td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>2</code></td>
+		<td>shuffle</td>
+		<td>Data element shuffling</td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>3</code></td>
+		<td>fletcher32</td>
+		<td>Fletcher32 checksum</td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>4</code></td>
+		<td>szip</td>
+		<td>SZIP compression</td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>5</code></td>
+		<td>nbit</td>
+		<td>N-bit packing</td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>6</code></td>
+		<td>scaleoffset</td>
+		<td>Scale and offset encoded values</td>
+	      </tr>
+	    </table>
+	  </p></td>
+	</tr>
+
+	<tr>
+	  <td>Name Length</td>
+	  <td><p>Each filter has an optional null-terminated ASCII name
+	    and this field holds the length of the name including the
+	    null termination padded with nulls to be a multiple of
+	    eight. If the filter has no name then a value of zero is
+	    stored in this field.</p>
+            <p>Filters with IDs less than 256 (in other words, filters 
+            that are defined in this format documentation) do not store 
+            the <em>Name Length</em> or <em>Name</em> fields.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Flags</td>
+	  <td><p>The flags indicate certain properties for a filter.  The 
+	    bit values defined so far are:
+	    <table class="list">
+	      <tr>
+		<th width="20%">Bit</th>
+		<th width="80%" align="left">Description</th>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>0</code></td>
+	        <td>If set then the filter is an optional filter.
+		During output, if an optional filter fails it will be
+		silently skipped in the pipeline.</td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>1-15</code></td>
+	        <td>Reserved (zero)</td>
+	      </tr>
+	    </table></p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Number of Client Data Values</td>
+	  <td><p>Each filter can store integer values to control
+	    how the filter operates.  The number of entries in the
+	    <em>Client Data</em> array is stored in this field.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Name</td>
+	  <td><p>If the <em>Name Length</em> field is non-zero then it will
+                contain the size of this field, <em>not</em> padded to a multiple
+                of eight.  This field contains a <em>non-</em>null-terminated,
+                ASCII character string to serve as a comment/name for the filter.
+            </p>
+            <p>Filters that are defined in this format documentation (deflate,
+                shuffle, etc.) do not store the <em>Name Length</em> or
+                <em>Name</em> fields.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Client Data</td>
+	  <td><p>This is an array of four-byte integers which will be
+	    passed to the filter function.  The Client Data Number of
+	    Values</em> determines the number of elements in the array.</p>
+          </td>
+	</tr>
+      </table>
+    </div>
+    <br />
+    
+    <hr />
+    <h4><a name="AttributeMessage">Name: Attribute</a></h4>
+    <p class="item"><b>Header Message Type:</b> 0x000C</p>
+    <p class="item"><b>Length:</b> Varies</p>
+    <p class="item"><b>Status:</b> Optional; may be repeated.</p>
+    
+    <p class="item"><b>Description:</b> The <em>Attribute</em>
+      message is used to store objects in the HDF5 file which are used
+      as attributes, or “metadata” about the current object.  An
+      attribute is a small dataset; it has a name, a datatype, a data
+      space, and raw data.  Since attributes are stored in the object
+      header, they should be relatively small (in other words, less than 64KB). 
+      They can be associated with any type of object which has an object 
+      header (groups, datasets, or committed (named) datatypes).</p>
+
+    <p class="item2">In 1.8.x versions of the library, attributes can be larger than 
+      64KB. See the 
+      <a href="UG/13_Attributes.html#SpecIssues">“Special Issues”</a> 
+      section of the Attributes chapter in the <cite>HDF5 User’s Guide</cite> 
+      for more information.</p>
+    
+    <p class="item2">Note: Attributes on an object must have unique names 
+      (The HDF5 Library currently enforces this by causing the creation 
+      of an attribute with a duplicate name to fail). Attributes on 
+      different objects may have the same name, however.</p>
+
+    <p class="item"><b>Format of Data:</b></p>
+    
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Attribute Message (Version 1)
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>Reserved (zero)</td>
+	  <td colspan="2">Name Size</td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Datatype Size</td>
+	  <td colspan="2">Dataspace Size</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Name <em>(variable size)</em><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Datatype <em>(variable size)</em><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Dataspace <em>(variable size)</em><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Data <em>(variable size)</em><br /><br /></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td><p>The version number information is used for changes in the format of the 
+	    attribute message and is described here:
+	    <table class="list">
+	      <tr>
+		<th width="20%">Version</th>
+		<th width="80%" align="left">Description</th>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>0</code></td>
+		<td>Never used.</td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>1</code></td>
+		<td>Used by the library before version 1.6 to encode attribute message.
+		    This version does not support shared datatypes.</td>
+	      </tr>
+	    </table></p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Name Size</td>
+	  <td><p>The length of the attribute name in bytes including the
+	    null terminator.  Note that the <em>Name</em> field below may
+	    contain additional padding not represented by this
+	    field.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Datatype Size</td>
+	  <td><p>The length of the datatype description in the <em>Datatype</em>
+	    field below.  Note that the <em>Datatype</em> field may contain
+	    additional padding not represented by this field.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Dataspace Size</td>
+	  <td><p>The length of the dataspace description in the <em>Dataspace</em>
+	    field below.  Note that the <em>Dataspace</em> field may contain
+	    additional padding not represented by this field.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Name</td>
+	  <td><p>The null-terminated attribute name.  This field is
+	    padded with additional null characters to make it a
+	    multiple of eight bytes.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Datatype</td>
+	  <td><p>The datatype description follows the same format as
+	    described for the datatype object header message.  This
+	    field is padded with additional zero bytes to make it a
+	    multiple of eight bytes.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Dataspace</td>
+	  <td><p>The dataspace description follows the same format as
+	    described for the dataspace object header message.  This
+	    field is padded with additional zero bytes to make it a
+	    multiple of eight bytes.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Data</td>
+	  <td><p>The raw data for the attribute.  The size is determined
+	    from the datatype and dataspace descriptions.  This
+	    field is <em>not</em> padded with additional bytes.</p></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Attribute Message (Version 2)
+	</caption>
+
+	<tr align="center">
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>Flags</td>
+	  <td colspan="2">Name Size</td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Datatype Size</td>
+	  <td colspan="2">Dataspace Size</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Name <em>(variable size)</em><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Datatype <em>(variable size)</em><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Dataspace <em>(variable size)</em><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Data <em>(variable size)</em><br /><br /></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td><p>The version number information is used for changes in the
+                format of the attribute message and is described here:
+                <table class="list">
+                  <tr>
+                    <th width="20%">Version</th>
+                    <th width="80%" align="left">Description</th>
+                  </tr>
+
+                  <tr>
+                    <td align="center"><code>2</code></td>
+                    <td>Used by the library of version 1.6.x and after to encode
+                        attribute messages.
+                        This version supports shared datatypes.  The fields of
+                        name, datatype, and dataspace are not padded with
+                        additional bytes of zero.
+                    </td>
+                  </tr>
+                </table></p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Flags</td>
+	  <td><p>This bit field contains extra information about 
+                interpreting the attribute message:
+              
+	    <table class="list">
+	      <tr>
+		<th width="20%">Bit</th>
+		<th width="80%" align="left">Description</th>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>0</code></td>
+		<td>If set, datatype is shared.</td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>1</code></td>
+		<td>If set, dataspace is shared.</td>
+	      </tr>
+	    </table></p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Name Size</td>
+	  <td><p>The length of the attribute name in bytes including the
+	    null terminator.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Datatype Size</td>
+	  <td><p>The length of the datatype description in the <em>Datatype</em>
+	    field below.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Dataspace Size</td>
+	  <td><p>The length of the dataspace description in the <em>Dataspace</em>
+	    field below.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Name</td>
+	  <td><p>The null-terminated attribute name.  This field is <em>not</em>
+	    padded with additional bytes.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Datatype</td>
+	  <td><p>The datatype description follows the same format as
+                described for the datatype object header message.
+            </p>
+            <p>If the
+                <em>Flag</em> field indicates this attribute’s datatype is
+                shared, this field will contain a “shared message” encoding
+                instead of the datatype encoding.
+            </p>
+            <p>This field is <em>not</em> padded with additional bytes.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Dataspace</td>
+	  <td><p>The dataspace description follows the same format as
+                described for the dataspace object header message.
+            </p>
+            <p>If the
+                <em>Flag</em> field indicates this attribute’s dataspace is
+                shared, this field will contain a “shared message” encoding
+                instead of the dataspace encoding.
+            </p>
+            <p>This field is <em>not</em> padded with additional bytes.</p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Data</td>
+	  <td><p>The raw data for the attribute.  The size is determined
+                from the datatype and dataspace descriptions.
+            </p>
+            <p>This field is <em>not</em> padded with additional zero bytes.
+            </p>
+          </td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Attribute Message (Version 3)
+	</caption>
+
+	<tr align="center">
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>Flags</td>
+	  <td colspan="2">Name Size</td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Datatype Size</td>
+	  <td colspan="2">Dataspace Size</td>
+	</tr>
+
+	<tr>
+	  <td>Name Character Set Encoding</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Name <em>(variable size)</em><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Datatype <em>(variable size)</em><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Dataspace <em>(variable size)</em><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Data <em>(variable size)</em><br /><br /></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td><p>The version number information is used for changes in the
+                format of the attribute message and is described here:
+                <table class="list">
+                  <tr>
+                    <th width="20%">Version</th>
+                    <th width="80%" align="left">Description</th>
+                  </tr>
+
+                  <tr>
+                    <td align="center"><code>3</code></td>
+                    <td>Used by the library of version 1.8.x and after to
+                        encode attribute messages.
+                        This version supports attributes with non-ASCII names.
+                    </td>
+                  </tr>
+                </table></p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Flags</td>
+	  <td><p>This bit field contains extra information about 
+                interpreting the attribute message:
+              
+	    <table class="list">
+	      <tr>
+		<th width="20%">Bit</th>
+		<th width="80%" align="left">Description</th>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>0</code></td>
+		<td>If set, datatype is shared.</td>
+	      </tr>
+
+	      <tr>
+		<td align="center"><code>1</code></td>
+		<td>If set, dataspace is shared.</td>
+	      </tr>
+	    </table></p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Name Size</td>
+	  <td><p>The length of the attribute name in bytes including the
+	    null terminator.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Datatype Size</td>
+	  <td><p>The length of the datatype description in the <em>Datatype</em>
+	    field below.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Dataspace Size</td>
+	  <td><p>The length of the dataspace description in the <em>Dataspace</em>
+	    field below.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Name Character Set Encoding</td>
+	  <td><p>The character set encoding for the attribute’s name:
+            <table class="list">
+                <tr>
+                  <th width="20%">Value</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>0</code></td>
+                  <td>ASCII character set encoding
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>1</code></td>
+                  <td>UTF-8 character set encoding
+                  </td>
+                </tr>
+            </table>
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Name</td>
+	  <td><p>The null-terminated attribute name.  This field is <em>not</em>
+	    padded with additional bytes.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Datatype</td>
+	  <td><p>The datatype description follows the same format as
+                described for the datatype object header message.
+            </p>
+            <p>If the
+                <em>Flag</em> field indicates this attribute’s datatype is
+                shared, this field will contain a “shared message” encoding
+                instead of the datatype encoding.
+            </p>
+            <p>This field is <em>not</em> padded with additional bytes.
+            </p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Dataspace</td>
+	  <td><p>The dataspace description follows the same format as
+                described for the dataspace object header message.
+            </p>
+            <p>If the
+                <em>Flag</em> field indicates this attribute’s dataspace is
+                shared, this field will contain a “shared message” encoding
+                instead of the dataspace encoding.
+            </p>
+            <p>This field is <em>not</em> padded with additional bytes.</p>
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Data</td>
+	  <td><p>The raw data for the attribute.  The size is determined
+                from the datatype and dataspace descriptions.
+            </p>
+            <p>This field is <em>not</em> padded with additional zero bytes.
+            </p>
+          </td>
+	</tr>
+      </table>
+    </div>
+    <br />
+    
+    <hr />
+    <h4><a name="CommentMessage">Name: Object Comment</a></h4>
+
+    <p class="item"><b>Header Message Type:</b> 0x000D</p>
+    <p class="item"><b>Length:</b> Varies</p>
+    <p class="item"><b>Status:</b> Optional; may not be repeated.</p>
+
+    <p class="item"><b>Description:</b> The object comment is
+      designed to be a short description of an object.  An object comment
+      is a sequence of non-zero (<code>\0</code>) ASCII characters with no
+      other formatting included by the library.</p>
+
+    <p class="item"><b>Format of Data:</b></p>
+    
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Name Message
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Comment <em>(variable size)</em><br /><br /></td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Name</td>
+	  <td>A null terminated ASCII character string.</td>
+	</tr>
+      </table>
+    </div>
+    <br />
+    
+    <hr />
+    <h4><a name="OldModificationTimeMessage">Name: Object Modification Time (Old)</a></h4>
+
+    <p class="item"><b>Header Message Type:</b> 0x000E</p>
+    <p class="item"><b>Length:</b> Fixed</p>
+    <p class="item"><b>Status:</b> Optional; may not be repeated.</p>
+
+    <p class="item"><b>Description:</b> The object modification date
+      and time is a timestamp which indicates (using ISO-8601 date and
+      time format) the last modification of an object.  The time is
+      updated when any object header message changes according to the
+      system clock where the change was posted.  All fields of this message
+      should be interpreted as coordinated universal time (UTC).
+
+      <br /><br />This modification time message is deprecated in 
+      favor of the “new”
+      <a href="#ModificationTimeMessage">Object Modification Time</a>
+      message and is no longer written
+      to the file in versions of the HDF5 Library after the 1.6.0 version.
+    </p>
+
+    <p class="item"><b>Format of Data:</b></p>
+    
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Modification Time Message
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Year</td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Month</td>
+	  <td colspan="2">Day of Month</td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Hour</td>
+	  <td colspan="2">Minute</td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Second</td>
+	  <td colspan="2">Reserved</td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Year</td>
+	  <td><p>The four-digit year as an ASCII string. For example,
+	    <code>1998</code>.
+            </p></td>
+	</tr>
+
+	<tr>
+	  <td>Month</td>
+	  <td><p>The month number as a two digit ASCII string where
+	    January is <code>01</code> and December is <code>12</code>.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Day of Month</td>
+	  <td><p>The day number within the month as a two digit ASCII
+	    string. The first day of the month is <code>01</code>.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Hour</td>
+	  <td><p>The hour of the day as a two digit ASCII string where
+	    midnight is <code>00</code> and 11:00pm is <code>23</code>.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Minute</td>
+	  <td><p>The minute of the hour as a two digit ASCII string where
+	    the first minute of the hour is <code>00</code> and 
+	    the last is <code>59</code>.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Second</td>
+	  <td><p>The second of the minute as a two digit ASCII string
+	    where the first second of the minute is <code>00</code> 
+	    and the last is <code>59</code>.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Reserved</td>
+	  <td><p>This field is reserved and should always be zero.</p></td>
+	</tr>
+      </table>
+    </div>
+    <br />
+    
+    <hr />
+    <h4><a name="SOHMTableMessage">Name: Shared Message Table</a></h4>
+    <p class="item"><b>Header Message Type:</b> 0x000F</p>
+    <p class="item"><b>Length:</b> Fixed </p>
+    <p class="item"><b>Status:</b> Optional; may not be repeated.</p>
+
+    <p class="item"><b>Description:</b> This message is used to locate the
+        table of shared object header message (SOHM) indexes.  Each
+        index consists of information to find the shared messages from either
+        the heap or object header.  This message is <em>only</em> found in the
+        superblock extension.
+    </p>
+
+    <p class="item"><b>Format of Data:</b></p>
+    
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Shared Message Table Message
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Shared Object Header Message Table Address<sup>O</sup><br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td>Number of Indices</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td><p>The version number for this message.  This document describes version 0.</p></td>
+	</tr>
+
+	<tr>
+	  <td>Shared Object Header Message Table Address</td>
+	  <td><p>This field is the address of the master table for shared
+            object header message indexes.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Number of Indices</td>
+	  <td><p>This field is the number of indices in the master table.
+      </p></td>
+	</tr>
+
+      </table>
+    </div>
+    <br />
+
+    <hr />
+    <h4><a name="ContinuationMessage">Name: Object Header Continuation</a></h4>
+    <p class="item"><b>Header Message Type:</b> 0x0010</p>
+    <p class="item"><b>Length:</b> Fixed</p>
+    <p class="item"><b>Status:</b> Optional; may be repeated.</p>
+    <p class="item"><b>Description:</b> The object header continuation is the
+        location in the file of a block containing more header messages for the
+        current data object.  This can be used when header blocks become too
+        large or are likely to change over time.</p>
+
+    <p class="item"><b>Format of Data:</b></p>
+    
+    <div align="center">
+      <table class="format">
+        <caption>
+          Object Header Continuation Message
+        </caption>
+
+        <tr>
+          <th width=25%>byte</th>
+          <th width=25%>byte</th>
+          <th width=25%>byte</th>
+          <th width=25%>byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Offset<sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Length<sup>L</sup><br /><br /></td>
+        </tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+        <tr>
+        <td> </td>
+        <td>
+            (Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>Offset</td>
+          <td><p>This value is the address in the file where the
+              header continuation block is located.</p></td>
+        </tr>
+
+        <tr>
+          <td>Length</td>
+          <td><p>This value is the length in bytes of the header continuation
+              block in the file.</p></td>
+        </tr>
+      </table>
+    </div>
+    <br />
+
+    <p>The format of the header continuation block that this message points
+        to depends on the version of the object header that the message is
+        contained within.
+    </p>
+
+    <p>
+        Continuation blocks for version 1 object headers have no special
+        formatting information; they are merely a list of object header
+        message info sequences (type, size, flags, reserved bytes and data
+        for each message sequence).  See the description 
+	of <a href="#V1ObjectHeaderPrefix">Version 1 Data Object Header Prefix.</a>
+    </p>
+
+    <p>Continuation blocks for version 2 object headers <em>do</em> have
+        special formatting information as described here
+        (see also the description of
+	<a href="#V2ObjectHeaderPrefix">Version 2 Data Object Header Prefix.</a>):
+    </p>
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Version 2 Object Header Continuation Block
+	</caption>
+
+	<tr>
+	  <th>byte</th>
+	  <th>byte</th>
+	  <th>byte</th>
+	  <th>byte</th>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Signature</td>
+	</tr>
+	<tr>
+	  <td>Header Message Type #1</td>
+	  <td colspan="2">Size of Header Message Data #1</td>
+	  <td>Header Message #1 Flags</td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Header Message #1 Creation Order <em>(optional)</em></td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Header Message Data #1<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">.<br />.<br />.<br /></td>
+	</tr>
+
+	<tr>
+	  <td>Header Message Type #n</td>
+	  <td colspan="2">Size of Header Message Data #n</td>
+	  <td>Header Message #n Flags</td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Header Message #n Creation Order <em>(optional)</em></td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br />Header Message Data #n<br /><br /></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Gap <em>(optional, variable size)</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Checksum</td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Signature</td>
+	  <td>
+            <p>The ASCII character string “<code>OCHK</code>”
+            is used to indicate the
+            beginning of an object header continuation block.  This gives file
+            consistency checking utilities a better chance of reconstructing a
+            damaged file.
+	    </p>
+	  </td>
+	</tr>
+	
+	<tr>
+	  <td>Header Message #n Type</td>
+	  <td>
+            <p>Same format as version 1 of the object header, described above.
+          </p></td>
+	</tr>
+
+	<tr>
+	  <td>Size of Header Message #n Data</td>
+	  <td>
+            <p>Same format as version 1 of the object header, described above.
+          </p></td>
+	</tr>
+
+	<tr>
+	  <td>Header Message #n Flags</td>
+	  <td>
+            <p>Same format as version 1 of the object header, described above.
+          </p></td>
+        </tr>
+
+	<tr>
+	  <td>Header Message #n Creation Order</td>
+	  <td>
+            <p>This field stores the order that a message of a given type
+                was created in.</p>
+	    <p>This field is present if bit 2 of <em>flags</em> is set.</p>
+          </td>
+        </tr>
+
+	<tr>
+	  <td>Header Message #n Data</td>
+	  <td>
+            <p>Same format as version 1 of the object header, described above.
+          </p></td>
+	</tr>
+
+	<tr>
+	  <td>Gap</td>
+	  <td>
+            <p>A gap in an object header chunk is inferred by the end of the
+                messages for the chunk before the beginning of the chunk’s
+                checksum.  Gaps are always smaller than the size of an
+                object header message prefix (message type + message size +
+                message flags).</p>
+            <p>Gaps are formed when a message (typically an attribute message)
+                in an earlier chunk is deleted and a message from a later
+                chunk that does not quite fit into the free space is moved
+                into the earlier chunk.</p>
+          </td>
+	</tr>
+
+        <tr>
+          <td>Checksum</td>
+          <td>
+            <p>This is the checksum for the object header chunk.
+            </p>
+          </td>
+        </tr>
+      </table>
+    </div>
+    <br />
+
+    <hr />
+    <h4><a name="SymbolTableMessage">Name: Symbol Table Message</a></h4>
+    <p class="item"><b>Header Message Type:</b> 0x0011</p>
+    <p class="item"><b>Length:</b> Fixed</p>
+    <p class="item"><b>Status:</b> Required for “old style” 
+    groups; may not be repeated.</p>
+    <p class="item"><b>Description:</b> Each “old style” group has a v1 B-tree
+        and a local heap for storing symbol table entries, which are located
+        with this message.</p>
+
+    <p class="item"><b>Format of data:</b></p>
+
+    
+    <div align="center">
+      <table class="format">
+        <caption>
+          <b>Symbol Table Message</b>
+        </caption>
+
+        <tr>
+          <th width="25%">byte</th>
+          <th width="25%">byte</th>
+          <th width="25%">byte</th>
+          <th width="25%">byte</th>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />v1 B-tree Address<sup>O</sup><br /><br /></td>
+        </tr>
+
+        <tr>
+          <td colspan="4"><br />Local Heap Address<sup>O</sup><br /><br /></td>
+        </tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+        <tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+        </tr>
+
+        <tr>
+          <td>v1 B-tree Address</td>
+          <td><p>This value is the address of the v1 B-tree containing the
+            symbol table entries for the group.</p></td>
+        </tr>
+
+        <tr>
+          <td>Local Heap Address</td>
+          <td><p>This value is the address of the local heap containing
+            the link names for the symbol table entries for the group.</p></td>
+        </tr>
+      </table>
+    </div>
+    <br />
+
+    <hr />
+    <h4><a name="ModificationTimeMessage">Name: Object Modification Time</a></h4>
+
+    <p class="item"><b>Header Message Type:</b> 0x0012 </p>
+    <p class="item"><b>Length:</b> Fixed </p>
+    <p class="item"><b>Status:</b> Optional; may not be repeated. </p>
+
+    <p class="item"><b>Description:</b> The object modification 
+      time is a timestamp which indicates the time of the last modification of
+      an object.  
+      The time is updated when any object header message changes according to
+      the system clock where the change was posted.
+    </p>
+
+    <p class="item"><b>Format of Data:</b></p>
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Modification Time Message
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td colspan="3">Reserved (zero)</td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Seconds After UNIX Epoch</td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td><p>The version number is used for changes in the format of Object Modification Time
+	      and is described here:
+	     <table class="list">
+		<tr>
+		  <th width="20%">Version</th>
+		  <th width="80%" align="left">Description</th>
+		</tr>
+
+		<tr>
+		  <td align="center"><code>0</code></td>
+		  <td>Never used.</td>
+		</tr>
+
+		<tr>
+		  <td align="center"><code>1</code></td>
+		  <td>Used by Version 1.6.1 and after of the library to encode time.  In
+		    this version, the time is the seconds after Epoch.</td>
+		</tr>
+	      </table></p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Seconds After UNIX Epoch</td>
+	  <td><p>A 32-bit unsigned integer value that stores the number of
+            seconds since 0 hours, 0 minutes, 0 seconds, January 1, 1970,
+            Coordinated Universal Time.</p></td>
+	</tr>
+      </table>
+    </div>
+    <br />
+
+    <hr />
+    <h4><a name="BtreeKValuesMessage">Name: B-tree ‘K’ Values Message</a></h4>
+
+    <p class="item"><b>Header Message Type:</b> 0x0013 </p>
+    <p class="item"><b>Length:</b> Fixed </p>
+    <p class="item"><b>Status:</b> Optional; may not be repeated. </p>
+
+    <p class="item"><b>Description:</b>This message retrieves non-default ‘K’
+        values for internal and leaf nodes of a group or indexed storage
+        v1 B-trees.  This message is <em>only</em> found in the
+        superblock extension.
+    </p>
+
+    <p class="item"><b>Format of Data:</b></p>
+    <div align="center">
+      <table class="format">
+	<caption>
+	  B-tree ‘K’ Values Message
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td colspan="2">Indexed Storage Internal Node K</td>
+          <td bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Group Internal Node K</td>
+	  <td colspan="2">Group Leaf Node K</td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td><p>The version number for this message. This document describes
+            version 0.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Indexed Storage Internal Node K</td>
+	  <td><p>This is the node ‘K’ value for each internal node of an
+                indexed storage v1 B-tree.  See the description of this field
+                in version 0 and 1 of the superblock as well the section on
+                v1 B-trees.
+	      </p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Group Internal Node K</td>
+	  <td><p>This is the node ‘K’ value for each internal node of a group 
+                v1 B-tree.  See the description of this field in version 0 and
+                1 of the superblock as well as the section on v1 B-trees.
+	      </p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Group Leaf Node K</td>
+	  <td><p>This is the node ‘K’ value for each leaf node of a group v1
+                B-tree.  See the description of this field in version 0 and 1
+                of the superblock as well as the section on v1 B-trees.
+	      </p>
+	  </td>
+	</tr>
+
+      </table>
+    </div>
+    <br />
+
+    <hr />
+    <h4><a name="DrvInfoMessage">Name: Driver Info Message</a></h4>
+
+    <p class="item"><b>Header Message Type:</b> 0x0014 </p>
+    <p class="item"><b>Length:</b> Varies </p>
+    <p class="item"><b>Status:</b> Optional; may not be repeated. </p>
+
+    <p class="item">
+    <b>Description:</b> This message contains information needed by the
+		file driver to reopen a file. This message is <em>only</em> 
+        found in the superblock extension: see the 
+        <a href="#SuperblockExt">
+        “Disk  Format: Level 0C - Superblock Extension”</a> 
+        section for more information. For more information on the fields 
+        in the driver info message, see the 
+        <a href="#DriverInfo">
+        “Disk Format : Level 0B - File Driver Info”</a> 
+        section; those who use the multi and family file drivers will 
+        find this section particularly helpful.
+    </p>
+
+    <p class="item"><b>Format of Data:</b></p>
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Driver Info Message
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Driver Identification</td>
+	</tr>
+
+	<tr>
+	  <td colspan="2">Driver Information Size</td>
+          <td colspan="2" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4"><br /><br />Driver Information <em>(variable size)</em><br /><br /><br /></td>
+	</tr>
+	
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td><p>The version number for this message. This document describes
+                version 0.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	<td>Driver Identification</td>
+	  <td><p>This is an eight-byte ASCII string without null termination which
+                identifies the driver.
+	      </p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Driver Information Size</td>
+	  <td><p>The size in bytes of the <em>Driver Information</em> field of this
+                message.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Driver Information</td>
+	  <td><p>Driver information is stored in a format defined by the file driver.</p>
+	  </td>
+	</tr>
+      </table>
+    </div>
+    <br />
+
+    <hr />
+    <h4><a name="AinfoMessage">Name: Attribute Info Message</a></h4>
+
+    <p class="item"><b>Header Message Type:</b> 0x0015</p>
+    <p class="item"><b>Length:</b> Varies </p>
+    <p class="item"><b>Status:</b> Optional; may not be repeated. </p>
+
+    <p class="item"><b>Description:</b> This message stores information about the
+        attributes on an object, such as the maximum creation index for
+        the attributes created and the location of the attribute storage when
+        the attributes are stored “densely”.
+    </p>
+
+    <p class="item"><b>Format of Data:</b></p>
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Attribute Info Message
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>Flags</td>
+	  <td colspan="2">Maximum Creation Index <em>(optional)</em></td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Fractal Heap Address<sup>O</sup><br /><br /></td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Attribute Name v2 B-tree Address<sup>O</sup><br /><br /></td>
+	</tr>
+	<tr>
+	  <td colspan="4"><br />Attribute Creation Order v2 B-tree Address<sup>O</sup> <em>(optional)</em><br /><br /></td>
+	</tr>
+	
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td><p>The version number for this message. This document describes
+                version 0.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	<td>Flags</td>
+	  <td><p>This is the attribute index information flag with the
+                following definition:
+	      
+            <table class="list">
+                <tr>
+                  <th width="20%">Bit</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>0</code></td>
+                  <td>If set, creation order for attributes is tracked.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>1</code></td>
+                  <td>If set, creation order for attributes is indexed.
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>2-7</code></td>
+                  <td>Reserved</td>
+                </tr>
+	    </table></p>
+            
+          </td>
+	</tr>
+
+	<tr>
+	  <td>Maximum Creation Index</td>
+	  <td><p>The is the maximum creation order index value for the
+                attributes on the object.</p>
+	      <p>This field is present if bit 0 of <em>Flags</em> is set.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Fractal Heap Address</td>
+	  <td><p>This is the address of the fractal heap to store dense
+                attributes.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Attribute Name v2 B-tree Address</td>
+	  <td><p>This is the address of the version 2 B-tree to index the
+                names of densely stored attributes.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Attribute Creation Order v2 B-tree Address</td>
+	  <td><p>This is the address of the version 2 B-tree to index the
+                creation order of densely stored attributes.</p>
+	      <p>This field is present if bit 1 of <em>Flags</em> is set.</p>
+	  </td>
+	</tr>
+
+      </table>
+    </div>
+    <br />
+
+    <hr />
+    <h4><a name="RefCountMessage">Name: Object Reference Count</a></h4>
+
+    <p class="item"><b>Header Message Type:</b> 0x0016 </p>
+    <p class="item"><b>Length:</b> Fixed </p>
+    <p class="item"><b>Status:</b> Optional; may not be repeated. </p>
+
+    <p class="item"><b>Description:</b> This message stores the number 
+    of hard links (in groups or objects) pointing to an object: in 
+    other words, its <em>reference count</em>.
+    </p>
+
+    <p class="item"><b>Format of Data:</b></p>
+    <div align="center">
+      <table class="format">
+	<caption>
+	  Object Reference Count
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+          <td colspan="3" bgcolor="#DDDDDD"><em>This space inserted only to align table nicely</em></td>
+	</tr>
+
+	<tr>
+	  <td colspan="4">Reference count</td>
+	</tr>
+      </table>
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td><p>The version number for this message. This document describes
+            version 0.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Reference Count</td>
+	  <td><p>The unsigned 32-bit integer is the reference count for the
+                object.  This message is only present in “version 2” 
+                (or later) 
+                object headers, and if not present those object header versions,
+                the reference count for the object is assumed to be 1.
+            </p>
+	  </td>
+	</tr>
+
+      </table>
+    </div>
+    <br />
+    
+    <hr />
+    <h4><a name="FsinfoMessage">Name: File Space Info</a></h4>
+
+    <p class="item"><b>Header Message Type:</b> 0x0018 </p>
+    <p class="item"><b>Length:</b> Fixed </p>
+    <p class="item"><b>Status:</b> Optional; may not be repeated. </p>
+
+    <p class="item"><b>Description:</b> This message stores the file space management strategy
+	(see description below) that the library uses in handling file space request for the file.
+	It also contains the free-space section threshold used by the
+	library’s free-space managers for the file.
+	If the strategy is 1,
+	this message also contains the addresses of the file’s
+	free-space managers which track free space for each type of file space allocation.  
+	There are six basic types of file space allocation: superblock, B-tree, raw data,
+	global heap, local heap and object header.
+	See the description of <a href="#FreeSpaceManager">Free-space Manager</a>
+	as well the description of allocation types in <a href="#AppendixB">Appendix B</a>.
+    </p>
+
+    <p class="item"><b>Format of Data:</b></p>
+    <div align="center">
+      <table class="format">
+	<caption>
+	  File Space Info
+	</caption>
+
+	<tr>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	  <th width="25%">byte</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td>Strategy</td>
+          <td colspan="2">Threshold<sup>L</sup></td>
+	</tr>
+	<tr>
+	  <td colspan="4">Super-block Free-space Manager Address<sup>O</sup></td>
+	</tr>
+	<tr>
+	  <td colspan="4">B-tree Free-space Manager Address<sup>O</sup></td>
+	</tr>
+	<tr>
+	  <td colspan="4">Raw Data Free-space Manager Address<sup>O</sup></td>
+	</tr>
+	<tr>
+	  <td colspan="4">Global Heap Free-space Manager Address<sup>O</sup></td>
+	</tr>
+	<tr>
+	  <td colspan="4">Local Heap Free-space Manager Address<sup>O</sup></td>
+	</tr>
+	<tr>
+	  <td colspan="4">Object Header Free-space Manager Address<sup>O</sup></td>
+	</tr>
+      </table>
+
+      <table class="note">
+        <tr>
+        <td width="60%"> </td>
+        <td width="40%">
+            (Items marked with an ‘O’ in the above table are of the size
+	    specified in “Size of Offsets” field in the superblock.)
+        </td></tr>
+        <tr>
+        <td> </td>
+        <td>
+            (Items marked with an ‘L’ in the above table are of the size
+	    specified in “Size of Lengths” field in the superblock.)
+        </td></tr>
+      </table>
+
+    </div>
+
+    <br />
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Field Name</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>Version</td>
+	  <td><p>This is the version number of this message. This document describes
+            version 0.</p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Strategy</td>
+	  <td><p>This is the  file space management strategy for the file.
+		 There are four types of strategies:
+            <table class="list">
+                <tr>
+                  <th width="20%">Value</th>
+                  <th width="80%" align="left">Description</th>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>1</code></td>
+                  <td>With this strategy, the HDF5 Library’s free-space managers track the
+		      free space that results from the manipulation of HDF5 objects
+		      in the HDF5 file.  The free space information is saved when the
+		      file is closed, and reloaded when the file is reopened.
+		    <br />
+		      When space is needed for file metadata or raw data, 
+		      the HDF5 Library first requests space from the library’s free-space 
+		      managers. If the request is not satisfied, the library requests space 
+		      from the aggregators. If the request is still not satisfied, 
+		      the library requests space from the virtual file driver. 
+		      That is, the library will use all of the mechanisms for allocating
+		      space.
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>2</code></td>
+                  <td>This is the HDF5 Library’s default file space management strategy. 
+		      With this strategy, the library’s free-space managers track the free space
+		      that results from the manipulation of HDF5 objects in the HDF5 file.
+		      The free space information is NOT saved when the file is closed and
+		      the free space that exists upon file closing becomes unaccounted
+		      space in the file.
+		    <br />
+		      As with strategy #1, the library will try all of the mechanisms 
+		      for allocating space.  When space is needed for file metadata or 
+		      raw data, the library first requests space from the free-space
+		      managers.  If the request is not satisfied, the library requests
+		      space from the aggregators.  If the request is still not satisfied,
+		      the library requests space from the virtual file driver.
+                  </td>
+                </tr>
+
+                <tr>
+                  <td align="center"><code>3</code></td>
+                  <td>With this strategy, the HDF5 Library does not track free space that results
+		      from the manipulation of HDF5 objects in the HDF5 file and
+		      the free space becomes unaccounted space in the file.
+		    <br />
+		      When space is needed for file metadata or raw data,
+		      the library first requests space from the aggregators. 
+		      If the request is not satisfied, the library requests space from 
+		      the virtual file driver. 
+                  </td>
+                </tr>
+                <tr>
+                  <td align="center"><code>4</code></td>
+                  <td>With this strategy, the HDF5 Library does not track free space that results
+		      from the manipulation of HDF5 objects in the HDF5 file and
+		      the free space becomes unaccounted space in the file.
+		    <br />
+		      When space is needed for file metadata or raw data,
+		      the library requests space from the virtual file driver. 
+                  </td>
+                </tr>
+            </table></p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Threshold</td>
+	  <td><p>This is the free-space section threshold.
+	    The library’s free-space managers will track only free-space sections
+	    with size greater than or equal to <em>threshold</em>.
+	    The default is to track free-space sections of all sizes.</p>
+	  </td>
+	</tr>
+	<tr>
+	  <td>Superblock Free-space Manager Address</td>
+	  <td><p>This is the address of the free-space manager for H5FD_MEM_SUPER allocation type.
+            </p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>B-tree Free-space Manager Address</td>
+	  <td><p>This is the address of the free-space manager for H5FD_MEM_BTREE allocation type.
+            </p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Raw Data Free-space Manager Address</td>
+	  <td><p>This is the address of the free-space manager for H5FD_MEM_DRAW allocation type.
+            </p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Global Heap Free-space Manager Address</td>
+	  <td><p>This is the address of the free-space manager for H5FD_MEM_GHEAP allocation type.
+            </p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Local Heap Free-space Manager Address</td>
+	  <td><p>This is the address of the free-space manager for H5FD_MEM_LHEAP allocation type.
+            </p>
+	  </td>
+	</tr>
+
+	<tr>
+	  <td>Object Header Free-space Manager Address</td>
+	  <td><p>This is the address of the free-space manager for H5FD_MEM_OHDR allocation type.
+            </p>
+	  </td>
+	</tr>
+      </table>
+    </div>
+    <br />
+
+<hr />
+<h3><a name="DataStorage">Disk Format: Level 2B - Data Object Data Storage</a></h3>
+
+<p>The data for an object is stored separately from its header
+    information in the file and may not actually be located in the HDF5 file
+    itself if the header indicates that the data is stored externally.  The
+    information for each record in the object is stored according to the
+    dimensionality of the object (indicated in the dataspace header message).
+    Multi-dimensional array data is stored in C order; in other words, the
+    “last” dimension changes fastest.</p>
+
+<p>Data whose elements are composed of atomic datatypes are stored in IEEE
+    format, unless they are specifically defined as being stored in a different
+    machine format with the architecture-type information from the datatype
+    header message.  This means that each architecture will need to [potentially]
+    byte-swap data values into the internal representation for that particular
+    machine.</p>
+
+<p> Data with a variable-length datatype is stored in the global heap
+    of the HDF5 file.  Global heap identifiers are stored in the 
+    data object storage.</p>
+
+<p>Data whose elements are composed of reference datatypes are stored in
+    several different ways depending on the particular reference type involved.
+    Object pointers are just stored as the offset of the object header being
+    pointed to with the size of the pointer being the same number of bytes as
+    offsets in the file.</p>
+
+<p>Dataset region references are stored as a heap-ID which points to 
+the following information within the file-heap: an offset of the object 
+pointed to, number-type information (same format as header message), 
+dimensionality information (same format as header message), sub-set start 
+and end information (in other words, a coordinate location for each), 
+and field start and end names (in other words, a [pointer to the] string 
+indicating the first field included and a [pointer to the] string name 
+for the last field).  </p>
+
+<p>Data of a compound datatype is stored as a contiguous stream of the items
+    in the structure, with each item formatted according to its datatype.</p>
+    <br />
+
+<hr />
+<h3><a name="AppendixA">Appendix A: Definitions</a></h3>
+<p>Definitions of various terms used in this document.
+</p>
+
+<p>The <a name="UndefinedAddress">“undefined address”</a> 
+for a file is a file address with all bits set: in other words, 
+<code>0xffff...ff</code>.</p>
+
+<p>The <a name="UnlimitedDim">“unlimited size”</a> for a 
+size is a value with all bits set: in other words, 
+<code>0xffff...ff</code>.</p>
+<br />
+
+<hr />
+<h3><a name="AppendixB">Appendix B: File Memory Allocation Types</a></h3>
+<p>There are six basic types of file memory allocation as follows:
+</p>
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Basic Allocation Type</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>H5FD_MEM_SUPER</td>
+	  <td>File memory allocated for <em>Superblock.</em></td>
+	</tr>
+
+	<tr>
+	  <td>H5FD_MEM_BTREE</td>
+	  <td>File memory allocated for <em>B-tree.</em></td>
+	</tr>
+
+	<tr>
+	  <td>H5FD_MEM_DRAW</td>
+	  <td>File memory allocated for raw data.</td>
+	</tr>
+
+	<tr>
+	  <td>H5FD_MEM_GHEAP</td>
+	  <td>File memory allocated for <em>Global Heap.</em></td>
+	</tr>
+
+	<tr>
+	  <td>H5FD_MEM_LHEAP</td>
+	  <td>File memory allocated for <em>Local Heap.</em></td>
+	</tr>
+
+	<tr>
+	  <td>H5FD_MEM_OHDR</td>
+	  <td>File memory allocated for <em>Object Header.</em></td>
+	</tr>
+      </table>
+    </div>
+    
+<p>There are other file memory allocation types that are mapped to the
+above six basic allocation types because they are similar in nature.
+The mapping is listed in the following table:
+</p>
+    
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Basic Allocation Type</th>
+          <th>Mapping of Allocation Types to Basic Allocation Types</th>
+	</tr>
+
+	<tr>
+	  <td>H5FD_MEM_SUPER</td>
+	  <td><em>none</em></td>
+	</tr>
+
+	<tr>
+	  <td>H5FD_MEM_BTREE</td>
+	  <td>H5FD_MEM_SOHM_INDEX</td>
+	</tr>
+
+	<tr>
+	  <td>H5FD_MEM_DRAW</td>
+	  <td>H5FD_MEM_FHEAP_HUGE_OBJ</td>
+	</tr>
+
+	<tr>
+	  <td>H5FD_MEM_GHEAP</td>
+	  <td><em>none</em></td>
+	</tr>
+
+	<tr>
+	  <td>H5FD_MEM_LHEAP</td>
+	  <td>H5FD_MEM_FHEAP_DBLOCK, H5FD_MEM_FSPACE_SINFO</td>
+	</tr>
+
+	<tr>
+	  <td>H5FD_MEM_OHDR</td>
+	  <td>H5FD_MEM_FHEAP_HDR, H5FD_MEM_FHEAP_IBLOCK, H5FD_MEM_FSPACE_HDR, H5FD_MEM_SOHM_TABLE</td>
+	</tr>
+      </table>
+    </div>
+    
+<p>Allocation types that are mapped to basic allocation types are described below:
+</p>
+    
+    <div align="center">
+      <table class="desc">
+	<tr>
+          <th width="30%">Allocation Type</th>
+          <th>Description</th>
+	</tr>
+
+	<tr>
+	  <td>H5FD_MEM_FHEAP_HDR</td>
+	  <td>File memory allocated for <em>Fractal Heap Header.</em></td>
+	</tr>
+
+	<tr>
+	  <td>H5FD_MEM_FHEAP_DBLOCK</td>
+	  <td>File memory allocated for <em>Fractal Heap Direct Blocks.</em></td>
+	</tr>
+
+	<tr>
+	  <td>H5FD_MEM_FHEAP_IBLOCK</td>
+	  <td>File memory allocated for <em>Fractal Heap Indirect Blocks.</em></td>
+	</tr>
+
+	<tr>
+	  <td>H5FD_MEM_FHEAP_HUGE_OBJ</td>
+	  <td>File memory allocated for huge objects in the fractal heap.</td>
+	</tr>
+
+	<tr>
+	  <td>H5FD_MEM_FSPACE_HDR</td>
+	  <td>File memory allocated for <em>Free-space Manager Header.</em></td>
+	</tr>
+
+	<tr>
+	  <td>H5FD_MEM_FSPACE_SINFO</td>
+	  <td>File memory allocated for <em>Free-space Section List</em> of the free-space manager.</td>
+	</tr>
+	<tr>
+	  <td>H5FD_MEM_SOHM_TABLE</td>
+	  <td>File memory allocated for <em>Shared Object Header Message Table.</em></td>
+	</tr>
+	<tr>
+	  <td>H5FD_MEM_SOHM_INDEX</td>
+	  <td>File memory allocated for <em>Shared Message Record List.</em></td>
+	</tr>
+      </table>
+    </div>
+    <br />
+
+<!-- #BeginLibraryItem "/ed_libs/NavBar_ADevG.lbi" -->
+<hr />
+<center>
+<table border="0" width="98%">
+<tr><td valign="top" align="left">
+    <a href="index.html">HDF5 documents and links</a> <br />
+    <a href="H5.intro.html">Introduction to HDF5</a> <br />
+    <!--
+    <a href="Glossary.html">Glossary</a><br />
+    -->
+</td>
+<td valign="top" align="right">
+    <a href="UG/index.html">HDF5 User’s Guide</a> <br />
+    <a href="RM/RM_H5Front.html">HDF5 Reference Manual</a> <br />
+    <a href="ADGuide.html">HDF5 Application Developer’s Guide</a> <br />
+</td></tr>
+</table>
+</center>
+<hr />
+<!-- #EndLibraryItem -->
+
+<?php include("./ed_libs/Footer.htm"); ?>
+
+<!-- hhmts start -->
+Last modified: 24 September 2015
+<!-- hhmts end -->
+
+</body>
+</html>
diff --git a/html/H5.intro.html b/html/H5.intro.html
index 21af110..02a6d8b 100644
--- a/html/H5.intro.html
+++ b/html/H5.intro.html
@@ -3137,10 +3137,10 @@ For the example codes, see
 </table>
 </center>
 <hr>
-<!-- #EndLibraryItem -->
+<!-- #EndLibraryItem --><address>
  
 <?php include("./ed_libs/Footer.htm"); ?>
- 
+
 Last modified: 6 February 2006 
 <br>
 Links updated: 17 June 2010
diff --git a/html/H5.user.html b/html/H5.user.html
index 359b8d0..a334cb7 100644
--- a/html/H5.user.html
+++ b/html/H5.user.html
@@ -20,7 +20,7 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
diff --git a/html/H5.user/Attributes.html b/html/H5.user/Attributes.html
index 89a26dd..05eb2f9 100644
--- a/html/H5.user/Attributes.html
+++ b/html/H5.user/Attributes.html
@@ -1,4 +1,4 @@
-
+
 <html>
   <head>
     <title>Attribute Interface (H5A)</title>
@@ -16,7 +16,7 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
diff --git a/html/H5.user/Caching.html b/html/H5.user/Caching.html
index 7658ea0..9aa74f5 100644
--- a/html/H5.user/Caching.html
+++ b/html/H5.user/Caching.html
@@ -16,7 +16,7 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
diff --git a/html/H5.user/Chunking.html b/html/H5.user/Chunking.html
index 412b3b7..0567cb1 100644
--- a/html/H5.user/Chunking.html
+++ b/html/H5.user/Chunking.html
@@ -16,7 +16,7 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
diff --git a/html/H5.user/Datasets.html b/html/H5.user/Datasets.html
index b6b3a86..a396b4e 100644
--- a/html/H5.user/Datasets.html
+++ b/html/H5.user/Datasets.html
@@ -16,7 +16,7 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
diff --git a/html/H5.user/Dataspaces.html b/html/H5.user/Dataspaces.html
index 9bdff29..899518c 100644
--- a/html/H5.user/Dataspaces.html
+++ b/html/H5.user/Dataspaces.html
@@ -16,7 +16,7 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
diff --git a/html/H5.user/Datatypes.html b/html/H5.user/Datatypes.html
index 96d2801..2c4a909 100644
--- a/html/H5.user/Datatypes.html
+++ b/html/H5.user/Datatypes.html
@@ -16,7 +16,7 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
diff --git a/html/H5.user/Debugging.html b/html/H5.user/Debugging.html
index 1b97d7c..e65dda3 100644
--- a/html/H5.user/Debugging.html
+++ b/html/H5.user/Debugging.html
@@ -16,7 +16,7 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
diff --git a/html/H5.user/Environment.html b/html/H5.user/Environment.html
index 7b125fa..216f521 100644
--- a/html/H5.user/Environment.html
+++ b/html/H5.user/Environment.html
@@ -17,7 +17,7 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
diff --git a/html/H5.user/Errors.html b/html/H5.user/Errors.html
index d6792b4..bfced02 100644
--- a/html/H5.user/Errors.html
+++ b/html/H5.user/Errors.html
@@ -16,7 +16,7 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
diff --git a/html/H5.user/Files.html b/html/H5.user/Files.html
index 22d6dd9..2975f20 100644
--- a/html/H5.user/Files.html
+++ b/html/H5.user/Files.html
@@ -16,7 +16,7 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
diff --git a/html/H5.user/Filters.html b/html/H5.user/Filters.html
index 3fb99e0..159fe45 100644
--- a/html/H5.user/Filters.html
+++ b/html/H5.user/Filters.html
@@ -16,7 +16,7 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
diff --git a/html/H5.user/Groups.html b/html/H5.user/Groups.html
index 13b5161..4b90952 100644
--- a/html/H5.user/Groups.html
+++ b/html/H5.user/Groups.html
@@ -16,7 +16,7 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
diff --git a/html/H5.user/MountingFiles.html b/html/H5.user/MountingFiles.html
index 0c653e9..7924903 100644
--- a/html/H5.user/MountingFiles.html
+++ b/html/H5.user/MountingFiles.html
@@ -15,7 +15,7 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
diff --git a/html/H5.user/Performance.html b/html/H5.user/Performance.html
index 5edf6c1..1b3422e 100644
--- a/html/H5.user/Performance.html
+++ b/html/H5.user/Performance.html
@@ -16,7 +16,7 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
@@ -206,7 +206,6 @@
       <code><a href="http://www-pablo.cs.uiuc.edu/">http://www-pablo.cs.uiuc.edu/</a></code>.</p>
 -->
 
-
 <!-- #BeginLibraryItem "/ed_libs/NavBar_UG.lbi" --><hr>
 <center>
 <table border=0 width=98%>
diff --git a/html/H5.user/Properties.html b/html/H5.user/Properties.html
index 85d7eb7..0948ea7 100644
--- a/html/H5.user/Properties.html
+++ b/html/H5.user/Properties.html
@@ -16,7 +16,7 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
diff --git a/html/H5.user/References.html b/html/H5.user/References.html
index c77738e..6490f53 100644
--- a/html/H5.user/References.html
+++ b/html/H5.user/References.html
@@ -16,7 +16,7 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
diff --git a/html/HL/RM_H5LT.html b/html/HL/RM_H5LT.html
index 865b72f..2f37b07 100755
--- a/html/HL/RM_H5LT.html
+++ b/html/HL/RM_H5LT.html
@@ -355,7 +355,7 @@ cases.</p>
       <p>
       <code>path</code> can be any one of the following: 
       <ul>
-           <li>An absolute path, which starts with a slash ( <code>/</code> )
+          <li>An absolute path, which starts with a slash ( <code>/</code> )
               indicating the file’s root group, followed by the members</li>
           <li>A relative path with respect to <code>loc_id</code></li>
           <li>A dot ( . ), if <code>loc_id</code> is the object identifier 
diff --git a/html/HL/RM_HDF5Optimized.html b/html/HL/RM_HDF5Optimized.html
index 9cfa5f7..81a5972 100755
--- a/html/HL/RM_HDF5Optimized.html
+++ b/html/HL/RM_HDF5Optimized.html
@@ -434,7 +434,7 @@ if(H5Dread(dataset, H5T_NATIVE_LONG, H5S_ALL, H5S_ALL, H5P_DEFAULT,
   
 <hr> 
 
-<?php include("../ed_libs/Footer-THGonly2.htm"); ?>
+<?php include("../ed_libs/Footer2.htm"); ?>
 
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
diff --git a/html/Intro/IntroExamples.html b/html/Intro/IntroExamples.html
index a4544b7..ba896f9 100644
--- a/html/Intro/IntroExamples.html
+++ b/html/Intro/IntroExamples.html
@@ -2104,10 +2104,10 @@ main(void)
 </table>
 </center>
 <hr>
-<!-- #EndLibraryItem -->
+<!-- #EndLibraryItem --><address>
 
 <?php include("../ed_libs/Footer2.htm"); ?>
- 
+
 Last modified: 3 August 2004
  
 
diff --git a/html/RM/APICompatMacros.html b/html/RM/APICompatMacros.html
index 1a1112a..5baf0f4 100644
--- a/html/RM/APICompatMacros.html
+++ b/html/RM/APICompatMacros.html
@@ -39,7 +39,8 @@
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -70,12 +71,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
@@ -774,7 +774,8 @@ and address any failures to complete the application migration process.
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -805,12 +806,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
diff --git a/html/RM/CollectiveCalls.html b/html/RM/CollectiveCalls.html
index fee6a16..2937554 100644
--- a/html/RM/CollectiveCalls.html
+++ b/html/RM/CollectiveCalls.html
@@ -39,7 +39,8 @@ Collective HDF5 Calls in Parallel
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -70,12 +71,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
@@ -1930,7 +1930,8 @@ In the
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -1961,12 +1962,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
diff --git a/html/RM/H5/H5check_version.htm b/html/RM/H5/H5check_version.htm
index d6c97ad..da98339 100644
--- a/html/RM/H5/H5check_version.htm
+++ b/html/RM/H5/H5check_version.htm
@@ -117,8 +117,7 @@
 
         <?php include("H5/h5check_version_f_F90.htm"); ?>
 
-
-<p>
+  <p>
   <dt><strong>History:</strong>
 	<ul><table width="90%">
         <tr>
diff --git a/html/RM/H5/H5dont_atexit.htm b/html/RM/H5/H5dont_atexit.htm
index 8b21196..26332d3 100644
--- a/html/RM/H5/H5dont_atexit.htm
+++ b/html/RM/H5/H5dont_atexit.htm
@@ -19,7 +19,7 @@
 
 
 <!-- NEW PAGE -->
-<!-- HEADER RIGHT "H5dont_atexit" -->
+<!-- HEADER RIGHT "H5H5dont_atexit" -->
 <hr>
 <dl>
 
diff --git a/html/RM/H5/H5is_library_threadsafe.htm b/html/RM/H5/H5is_library_threadsafe.htm
index 9f56da7..5a6f38e 100644
--- a/html/RM/H5/H5is_library_threadsafe.htm
+++ b/html/RM/H5/H5is_library_threadsafe.htm
@@ -45,7 +45,7 @@
 
 <dt><strong>Signature:</strong></dt>
     <dd><code><em>herr_t</em> H5is_library_threadsafe(/*OUT*/ 
-    <em>hbool_t</em> is_ts)</code></dd>
+    <em>hbool_t*</em> is_ts)</code></dd>
     <br />
 
 <dt><strong>Purpose:</strong></dt>
@@ -65,7 +65,7 @@
 <dt><strong>Parameters:</strong></dt>
     <dd><table width="100%">
         <tr>
-            <td valign="top"><code><em>hbool_t</em> is_ts    </code></td>
+            <td valign="top" width="15%"><code><em>hbool_t*</em> is_ts    </code></td>
             <td valign="top">OUT: Boolean value indicating 
                 whether the library was built with thread-safety enabled.</td>
         </tr></table></dd>
diff --git a/html/RM/H5A/H5Aget_name_by_idx.htm b/html/RM/H5A/H5Aget_name_by_idx.htm
index 3736c9d..d3ee88f 100644
--- a/html/RM/H5A/H5Aget_name_by_idx.htm
+++ b/html/RM/H5A/H5Aget_name_by_idx.htm
@@ -22,6 +22,11 @@
 <!-- HEADER RIGHT "H5Aget_name_by_idx" -->
 <hr>
 <dl>
+
+  <dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 3 April 2013
+      </i></font></div>
+
   <dt><strong>Name:</strong> <a name="Annot-GetNameByIdx">H5Aget_name_by_idx</a>
   <dt><strong>Signature:</strong>
     <dd><em>ssize_t</em> <code>H5Aget_name_by_idx</code>(
@@ -34,9 +39,11 @@
             <em>size_t</em> <code>size</code>, 
             <em>hid_t</em> <code>lapl_id</code>
     )
+
   <p>
   <dt><strong>Purpose:</strong>
     <dd>Gets an attribute name, by attribute index position
+
   <p>
   <dt><strong>Description:</strong>
     <dd><code>H5Aget_name_by_idx</code> retrieves 
@@ -64,12 +71,16 @@
       The function’s return value will provide 
       the correct value for <code>size</code>.
       <p>
-      <p>
       The link access property list, <code>lapl_id</code>,
       may provide information regarding the properties of links
       required to access the object, <code>obj_name</code>.
       See “Link Access Properties” in the 
       <a href ="RM_H5P.html">H5P</a> APIs.
+
+  <p>
+  <dt><strong>Note:</strong>
+    <dd>
+
   <p>
   <dt><strong>Parameters:</strong>
     <dd><table>
@@ -116,16 +127,18 @@
         <td valign="top">IN: Link access property list
         </td></tr>
     </table>
+
   <p>
   <dt><strong>Returns:</strong>
     <dd>Returns attribute name size, in bytes, if successful;
         otherwise returns a negative value.
+
   <p>
   <dt><strong>Fortran90 Interface:</strong> h5aget_name_by_idx_f
     <dd>
-	<pre>
+    <pre>
 SUBROUTINE h5aget_name_by_idx_f(loc_id, obj_name, idx_type, order, &
-       n, name, hdferr, size, lapl_id) 
+       n, name, size, lapl_id, hdferr) 
   IMPLICIT NONE
   INTEGER(HID_T), INTENT(IN) :: loc_id ! Identifer for object to which 
                                        ! attribute is attached
@@ -146,28 +159,23 @@ SUBROUTINE h5aget_name_by_idx_f(loc_id, obj_name, idx_type, order, &
                                !  H5_ITER_DEC_F     - Decreasing order
                                !  H5_ITER_NATIVE_F  - No particular order, 
                                !                      whatever is fastest
-                               !  H5_ITER_N_F 	    - Number of iteration orders
+                               !  H5_ITER_N_F       - Number of iteration orders
 
   INTEGER(HSIZE_T), INTENT(IN) :: n      
                                ! Attribute’s position in index
   CHARACTER(LEN=*), INTENT(OUT) :: name  
                                ! Attribute name
+  INTEGER(SIZE_T), INTENT(INOUT) :: size 
+                               ! Buffer size
+  INTEGER(HID_T), INTENT(IN) :: lapl_id  
+                               ! Link access property list
   INTEGER, INTENT(OUT) :: hdferr        
                                ! Error code:
                                !  Returns attribute name size,
                                !  -1 if fail
-  INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id  
-                               ! Link access property list
-  INTEGER(SIZE_T), OPTIONAL, INTENT(OUT) :: size 
-                               ! exact buffer size, in number of characters
 END SUBROUTINE h5aget_name_by_idx_f
-	</pre>
-        <!--<dt><strong>Non-C API(s):</strong>
-    	<dd>
-        
-        <img src="Graphics/Java.gif"> 
-        <img src="Graphics/C++.gif">
-        -->
+    </pre>
+
   <p>
   <dt><strong>History:</strong>
     <dd><table width="90%">
diff --git a/html/RM/H5D/H5Dget_type.htm b/html/RM/H5D/H5Dget_type.htm
index cc352d6..9985645 100644
--- a/html/RM/H5D/H5Dget_type.htm
+++ b/html/RM/H5D/H5Dget_type.htm
@@ -44,7 +44,7 @@ Last modified: 9 October 2014</i></font></div></dt>
         Otherwise, the returned datatype is read-only.  
         If atomization of the datatype fails, then the datatype is closed.
 
-        <p>The datatype identifier returned from this function 
+        <p>A datatype identifier returned from this function 
         should be released with <code>H5Tclose</code> when the identifier
         is no longer needed so that resource leaks will not occur.</p>
 
diff --git a/html/RM/H5F/H5Fget_file_image.htm b/html/RM/H5F/H5Fget_file_image.htm
index 9203385..9167052 100644
--- a/html/RM/H5F/H5Fget_file_image.htm
+++ b/html/RM/H5F/H5Fget_file_image.htm
@@ -89,7 +89,6 @@
 
 <!--__ *** NOTES AND WARNINGS ************************************  -->
 
-<!--
       <p>
       <b>Note/Warning:</b> 
 
@@ -97,7 +96,7 @@
 <font color="red">
 Anything here?
 </font>
--->
+
 
   <p>
   <dt><strong>Parameters:</strong>
@@ -137,12 +136,11 @@ Anything here?
     <dd><code>H5Pget_file_image</code> will fail, returning a negative value,
       if the file is too large for the supplied buffer.
 
-<!--
 <font color="red">
 <p>
 Others?
 </font>
--->
+
 
 <!--
   <p>
diff --git a/html/RM/H5F/H5Fget_free_sections.htm b/html/RM/H5F/H5Fget_free_sections.htm
new file mode 100644
index 0000000..fa2da7b
--- /dev/null
+++ b/html/RM/H5F/H5Fget_free_sections.htm
@@ -0,0 +1,258 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * Copyright by The HDF Group.                                               *
+  * Copyright by the Board of Trustees of the University of Illinois.         *
+  * All rights reserved.                                                      *
+  *                                                                           *
+  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+  * terms governing use, modification, and redistribution, is contained in    *
+  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+  * of the source code distribution tree; Copyright.html can be found at the  *
+  * root level of an installed copy of the electronic HDF5 document set and   *
+  * is linked from the top-level documents page.  It can also be found at     *
+  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * access to either file, you may request a copy from help at hdfgroup.org.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Fget_free_sections" -->
+<hr>
+<dl>
+
+  <dt><div align=right><font color=999999 size=-1><i>
+      Last modified: 5 April 2012
+      </i></font></div>
+
+  <dt><strong>Name:</strong> <a name="File-GetFreeSections">H5Fget_free_sections</a>
+
+  <dt><strong>Signature:</strong>
+    <dd><em>ssize_t </em><code>H5Fget_free_sections</code>(
+            <em>hid_t </em><code>fcpl_id</code>,
+            <em>H5F_mem_t </em><code>type</code>,
+            <em>size_t </em><code>nsects</code>,
+            <em>H5F_sect_info_t * </em><code>sect_info</code>
+        )
+
+  <dt><strong>Purpose:</strong>
+    <dd>Retrieves free-space section information for a file.
+
+  <p>
+  <dt><strong>Description:</strong>
+    <dd><code>H5Fget_free_sections</code> 
+      retrieves free-space section information for the free-space manager with
+      <code>type</code> that is associated with file <code>fcpl_id</code>.
+      If <code>type</code> is H5FD_MEM_DEFAULT, this routine retrieves free-space 
+      section information for all the free-space managers in the file.
+      <p>
+      This routine retrieves free-space section information for <code>nsects</code> 
+      sections or at most the maximum number of sections in the specified 
+      free-space manager.  If the number of sections is not known,
+      a preliminary <code>H5Fget_free_sections()</code> call can be made by
+      setting <code>sect_info</code> to NULL and the total number of free-space
+      sections for the specified free-space manager will be returned.  
+      Users can then allocate space for entries
+      in <code>sect_info</code>, each of which is defined as an 
+      <code>H5F_sect_info_t</code> struct 
+      (see the “Parameters:” section below).
+      <p>
+
+  <p>
+  <dt><strong>Parameters:</strong>
+    <dd>
+    <table>
+      <tr valign="top">
+        <td><em>hid_t </em><code>fcpl_id</code>
+            </td><td>    </td>
+        <td>IN: The file creation property list identifier.
+            </td></tr>
+
+      <tr valign="top">
+        <td><em>H5F_mem_t</em> <code>type</code>
+        </td><td>    </td>
+        <td>IN: The file memory allocation type.
+            <p>
+            Valid values are as follows:
+            <table border=0>
+              <tr valign="top">
+                <td><code>H5FD_MEM_DEFAULT</code>  </td>
+                <td>The default file memory allocation type.
+              <tr valign="top">
+                <td><code>H5FD_MEM_SUPER</code></td>
+                <td>File memory allocated for <em>Superblock</em>.
+              <tr valign="top">
+                <td><code>H5FD_MEM_BTREE</code></td>
+                <td>File memory allocated for <em>B-tree</em>.
+              <tr valign="top">
+                <td><code>H5FD_MEM_DRAW</code></td>
+                <td>File memory allocated for raw data.
+              <tr valign="top">
+                <td><code>H5FD_MEM_GHEAP</code></td>
+                <td>File memory allocated for <em>Global Heap</em>.
+              <tr valign="top">
+                <td><code>H5FD_MEM_LHEAP</code></td>
+                <td>File memory allocated for <em>Local Heap</em>.
+              <tr valign="top">
+                <td><code>H5FD_MEM_OHDR</code></td>
+                <td>File memory allocated for <em>Object Header</em>.
+            </table>
+            <p>
+            There are other file memory allocation types that are mapped 
+	    to the above six basic types.  
+            The <code><em>H5F_mem_t</em></code> <small>ENUM</small>
+            is fully described in <a href="../examples/H5F_mem_t.html">
+            <code>H5F_mem_t.html</code></a>.
+            </td></tr>
+
+      <tr valign="top">
+        <td><em>hsize_t </em><code>nsects</code>
+            </td><td> </td>
+        <td>IN: The number of free-space sections.
+            </td></tr>
+
+      <tr>      
+        <td valign="top"><em>H5F_sect_info_t *</em><code>sect_info</code>
+        </td> 
+        <td> </td>
+        <td valign="top">IN/OUT:  Pointer to instances of
+            <a href="H5F_sect_info_t.html">
+            <code><em>H5F_sect_info_t</em></code></a>
+            in which the free-space section information is to be returned.
+	    <p>
+	    An <em>H5F_sect_info_t</em> struct is defined as follows
+	    (in <code>H5Fpublic.h</code>):
+	<pre>
+typedef struct H5F_sect_info_t {
+    haddr_t           addr;	/* address of the free-space section */
+    hsize_t           size;	/* size of the free-space section */
+} H5F_sect_info_t; </pre>
+
+    </table>
+
+  <p>
+  <dt><strong>Returns:</strong>
+
+    <dd>Returns the number of free-space sections for the 
+	specified free-space manager in the file;
+        otherwise returns a negative value.
+
+  <p>
+
+  <p>
+  <dt><strong>Failure Modes:</strong>
+    <dd>This routine will fail when the following is true:
+        <ul>
+            <li>The library fails to retrieve the file creation property list 
+                <code>fcpl_id</code>.
+            <li>If the parameter <code>sect_info</code> is nonnull, 
+                but the parameter <code>nsects</code> is equal to 0.
+            <li>The library fails to retrieve free-space section information 
+                for the file associated with the file creation property list 
+                <code>fcpl_id</code>.
+        </ul>
+
+  <p>
+  <dt><strong>Example Usage:</strong>
+
+    <dd>The first example shows that the first call to 
+	<code>H5Fget_free_sections()</code> returns the total number of 
+        free-space sections in <code>nsects</code> for all
+	the free-space managers in the file that is associated with 
+        <code>fcpl</code>.
+	The second call to <code>H5Fget_free_sections()</code> retrieves 
+	free-space section information in <code>sect_info</code>
+	for <code>nsects</code> sections.
+	The value in <code>ret</code> is the same as <code>nsects</code>.
+<dir><pre>
+nsects = H5Fget_free_sections(fcpl, H5FD_MEM_DEFAULT, 0, NULL);
+:
+: <em>Allocate space for entries in sect_info</em>
+:
+ret = H5F_get_free_sections(fcpl, H5FD_MEM_DEFAULT, nsects, sect_info);
+</pre></dir>
+    <p>
+
+    <dd>The second example shows that the first call to 
+        <code>H5Fget_free_sections()</code>
+	returns the total number of free-space sections in <code>nsects</code> 
+	for the <code>H5FD_MEM_SUPER</code> free-space manager in the file 
+	that is associated with <code>fcpl</code>.
+	Even though there are <code>nsects</code> sections for the specified 
+	free-space manager, the second call to 
+        <code>H5Fget_free_sections()</code> retrieves 
+	free-space section information in <code>sect_info</code>
+	for <code>nsects-1</code> sections as requested.
+	The value in <code>ret</code> is the same as <code>nsects</code>.
+<dir><pre>
+nsects = H5Fget_free_sections(fcpl, H5FD_MEM_SUPER, 0, NULL);
+:
+: <em>Allocate space for entries in sect_info</em>
+:
+ret = H5F_get_free_sections(fcpl, H5FD_MEM_SUPER, nsects-1, sect_info);
+</pre></dir>
+  <p>
+
+    <dd>The third example shows that the first call to 
+	<code>H5Fget_free_sections()</code> returns the total number of 
+        free-space sections in <code>nsects</code> for
+	the <code>H5FD_MEM_BTREE</code> free-space manager in the file that 
+	is associated with <code>fcpl</code>.
+	Even though the second call to <code>H5Fget_free_sections()</code>
+	requests <code>nsects+1</code> sections,
+	the routine retrieves free-space section information in 
+	<code>sect_info</code> for only <code>nsects</code> sections.
+	The value in <code>ret</code> is the same as <code>nsects</code>.
+<dir><pre>
+nsects = H5Fget_free_sections(fcpl, H5FD_MEM_BTREE, 0, NULL);
+:
+: <em>Allocate space for entries in sect_info</em>
+:
+ret = H5F_get_free_sections(fcpl, H5FD_MEM_BTREE, nsects+1, sect_info);
+</pre></dir>
+
+
+<!--__ *** FORTRAN90 INTERFACE  **********************************  -->
+<!--__ When the Fortran90 interface is complete, replace this       -->
+<!--__ section with the Fortran90 subroutine description.           -->
+<!--__                                                              -->
+<!--__ See the file h5fortran_f_insert.htm for a template and       -->
+<!--__ instructions.                                                -->
+<!--__ ***********************************************************  -->
+
+
+  <p>
+  <dt><strong>See Also:</strong>
+    <dd>
+        <a href="../html/RM/Tools.html#h5stat"><code>h5stat</code></a>
+        <p>
+        <a href="../../html/Advanced.html"><cite>HDF5 Guide to File Space 
+        Management</cite></a> ??????? Update this link when the 
+        document has been published. ???????</p>
+
+  <p>
+  <dt><strong>History:</strong>
+    <dd><table width="90%">
+        <tr>
+          <td valign="top" align="left" width="10%">
+            <strong>Release</strong>    </td>
+          <td valign="top" align="left">
+            <strong>Change</strong></td>
+        </tr>
+        <tr>
+          <td valign="top">*.**.**</td>
+          <td valign="top">
+            C function introduced in this release.</td>
+        </tr>
+        <tr>
+          <td valign="top">*.**.**</td>
+          <td valign="top">
+            Fortran90 subroutine introduced in this release.</td>
+        </tr>
+        </table>
+
+</dl>
+
+
diff --git a/html/RM/H5F/H5Fget_info.htm b/html/RM/H5F/H5Fget_info.htm
index e5f3227..f23d486 100644
--- a/html/RM/H5F/H5Fget_info.htm
+++ b/html/RM/H5F/H5Fget_info.htm
@@ -40,37 +40,60 @@
       <code>obj_id</code> is an identifier for any object 
       in the file of interest.
       <p>
-      An <em>H5F_info_t</em> struct is defined as follows 
-      (in <code>H5Fpublic.h</code>):
+      An <em>H5F_info_t</em> struct is defined in <code>H5Fpublic.h</code> as follows:
 <pre>
         typedef struct H5F_info_t {
-            hsize_t           super_ext_size; 
+	    struct {
+		unsigned      vers;	
+		hsize_t	      super_size;
+		hsize_t	      super_ext_size;	
+	    } super;
+	    struct {
+		unsigned      vers;
+		hsize_t	      hdr_size;
+		hsize_t	      tot_space;
+	    } free;
             struct {
-                hsize_t       hdr_size;      
-                H5_ih_info_t  msgs_info;      
+		unsigned      vers;
+                hsize_t       hdr_size;		
+                H5_ih_info_t  msgs_info; 
             } sohm;
         } H5F_info_t; 
 </pre>
-      <code>super_ext_size</code> is the size of the superblock extension.
+      The <em>super</em> sub-struct contains the following information:
+	<ul>
+	<li><code>vers</code> is the version # of the superblock.
+	<li><code>super_size</code> is the size of the superblock.
+        <li><code>super_ext_size</code> is the size of the superblock extension.
+	</ul>
+      <p>
+      The <em>free</em> sub-struct contains the following information:
+	<ul>
+	<li><code>vers</code> is the version # of the free-space manager.
+	<li><code>hdr_size</code> is the size of the free-space manager header.
+        <li><code>tot_space</code> is the total amount of free space in the file.
+	</ul>
       <p>
       The <em>sohm</em> sub-struct contains shared object header message
-      information:
-      <code>hdr_size</code> is the size of shared of object header messages.
-      <code>msgs_info</code> is a <code>H5_ih_info_t</code> struct 
-      containing the cumulative shared object header message index size 
-      and heap size;
-      an <em>H5_ih_info_t</em> struct is defined as follows 
-      (in <code>H5public.h</code>):
+      information as follows:
+	<ul>
+	<li><code>vers</code> is the version # of the shared object header info.
+	<li><code>hdr_size</code> is the size of the shared object header message.
+	<li><code>msgs_info</code> is an <code>H5_ih_info_t</code> struct defined
+	    in <code>H5public.h</code> as follows:
 <pre>
         typedef struct H5_ih_info_t {
             hsize_t     index_size;     
             hsize_t     heap_size;
         } H5_ih_info_t;
 </pre>
-      <code>index_size</code> is the summed size of all of the 
-      shared of object header indexes.  
-      Each index might be either a B-tree or a list.
-      <code>heap_size</code> is the size of the heap.
+	<ul>
+	<li><code>index_size</code> is the summed size of all the
+	    shared object header indexes.  Each index might be either a B-tree or a list.
+	<li><code>heap_size</code> is the size of the heap.
+	</ul>
+      </ul>
+      </p>
   <p>
   <dt><strong>Parameters:</strong>
     <dd><table>
diff --git a/html/RM/H5F/H5Fget_intent.htm b/html/RM/H5F/H5Fget_intent.htm
index 8288606..9d59cc9 100644
--- a/html/RM/H5F/H5Fget_intent.htm
+++ b/html/RM/H5F/H5Fget_intent.htm
@@ -50,7 +50,7 @@
     <p>The value of the flag is returned in <code>intent</code>.
     Valid values are as follows:</p>
     
-    <dir>
+    <dir>
     <table width="100%">
         <tr>
         <td width="10%"><code>H5F_ACC_RDWR</code></td>
@@ -60,7 +60,7 @@
         <td>File was opened with read-only access.</td></tr>
         </table>
         </dir>
-        
+        
         <p>The function will not return an error if <code>intent</code>
         is <code>NULL</code>; it will simply do nothing.</p></dd>
         
@@ -114,5 +114,4 @@
 <br />
 <br />
 <br />
-
 
diff --git a/html/RM/H5F/H5Fget_obj_count.htm b/html/RM/H5F/H5Fget_obj_count.htm
index fe151f2..932a838 100644
--- a/html/RM/H5F/H5Fget_obj_count.htm
+++ b/html/RM/H5F/H5Fget_obj_count.htm
@@ -140,7 +140,7 @@ SUBROUTINE h5fget_obj_count_f(file_id, obj_type, obj_count, hdferr)
                                             !     H5F_OBJ_DATATYPE_F
                                             !     H5F_OBJ_ALL_F
   INTEGER(SIZE_T), INTENT(OUT) :: obj_count ! Number of opened objects
-  INTEGER, INTENT(OUT)        :: hdferr     ! Error code 
+  INTEGER, INTENT(OUT)         :: hdferr    ! Error code 
                                             ! 0 on success and -1 on failure
 END SUBROUTINE h5fget_obj_count_f
     </pre>
diff --git a/html/RM/H5F/H5Fget_obj_ids.htm b/html/RM/H5F/H5Fget_obj_ids.htm
index ff3c149..cc40886 100644
--- a/html/RM/H5F/H5Fget_obj_ids.htm
+++ b/html/RM/H5F/H5Fget_obj_ids.htm
@@ -84,7 +84,7 @@
 <dt><strong>Fortran90 Interface:</strong> h5fget_obj_ids_f
     <dd>
     <pre>
-SUBROUTINE h5fget_obj_ids_f(file_id, obj_type, max_objs, obj_ids, hdferr)
+SUBROUTINE h5fget_obj_ids_f(file_id, obj_type, max_objs, obj_ids, hdferr, num_objs)
 
   IMPLICIT NONE 
   INTEGER(HID_T), INTENT(IN)   :: file_id  ! File identifier
@@ -94,13 +94,15 @@ SUBROUTINE h5fget_obj_ids_f(file_id, obj_type, max_objs, obj_ids, hdferr)
                                            !     H5F_OBJ_DATASET_F
                                            !     H5F_OBJ_DATATYPE_F
                                            !     H5F_OBJ_ALL_F
-  INTEGER, INTENT(IN)          :: max_objs ! Maximum number of object 
+  INTEGER(SIZE_T), INTENT(IN)  :: max_objs ! Maximum number of object 
                                            ! identifiers to retrieve
   INTEGER(HID_T), DIMENSION(*), INTENT(OUT) :: obj_ids
                                            ! Array of requested object 
                                            ! identifiers
   INTEGER, INTENT(OUT)        :: hdferr    ! Error code 
                                            ! 0 on success and -1 on failure
+  INTEGER(SIZE_T), INTENT(OUT), OPTIONAL :: num_objs 
+                                           ! number of open objects of the specified type
 END SUBROUTINE h5fget_obj_ids_f
     </pre>
 
diff --git a/html/RM/H5G/H5Gget_info.htm b/html/RM/H5G/H5Gget_info.htm
index 9facd2f..8ca8dab 100644
--- a/html/RM/H5G/H5Gget_info.htm
+++ b/html/RM/H5G/H5Gget_info.htm
@@ -119,6 +119,7 @@ SUBROUTINE h5gget_info_f(group_id, storage_type, nlinks, max_corder, hdferr, &
                             ! 0 on success and -1 on failure
   LOGICAL, INTENT(OUT), OPTIONAL :: mounted      
                             ! Whether group has a file mounted on it
+
 END SUBROUTINE h5gget_info_f
     </pre>
 
diff --git a/html/RM/H5G/H5Gget_info_by_idx.htm b/html/RM/H5G/H5Gget_info_by_idx.htm
index 1758dd0..d47da3b 100644
--- a/html/RM/H5G/H5Gget_info_by_idx.htm
+++ b/html/RM/H5G/H5Gget_info_by_idx.htm
@@ -160,9 +160,9 @@ SUBROUTINE h5gget_info_by_idx_f(loc_id, group_name, index_type, order, n, &
   CHARACTER(LEN=*), INTENT(IN) :: group_name 
                                ! Name of group containing group for which 
                                ! information is to be retrieved
-  INTEGER, INTENT(IN) :: index_type 
+  INTEGER(HID_T), INTENT(IN) :: index_type 
                                ! Index type
-  INTEGER, INTENT(IN) :: order      
+  INTEGER(HID_T), INTENT(IN) :: order      
                                ! Order of the count in the index
   INTEGER(HSIZE_T), INTENT(IN) :: n          
                                ! Position in the index of the group for which 
@@ -179,8 +179,6 @@ SUBROUTINE h5gget_info_by_idx_f(loc_id, group_name, index_type, order, n, &
   INTEGER, INTENT(OUT) :: hdferr       
                                ! Error code:
                                ! 0 on success and -1 on failure
-  INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id 
-                               ! Link access property list
   LOGICAL, INTENT(OUT), OPTIONAL :: mounted      
                                ! Whether group has a file mounted on it
 END SUBROUTINE h5gget_info_by_idx_f
diff --git a/html/RM/H5G/H5Gget_info_by_name.htm b/html/RM/H5G/H5Gget_info_by_name.htm
index 469ed9f..dc5549d 100644
--- a/html/RM/H5G/H5Gget_info_by_name.htm
+++ b/html/RM/H5G/H5Gget_info_by_name.htm
@@ -143,7 +143,7 @@ SUBROUTINE h5gget_info_by_name_f(loc_id, group_name, &
   INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id 
                              ! Link access property list
   LOGICAL, INTENT(OUT), OPTIONAL :: mounted      
-                               ! Whether group has a file mounted on it
+                             ! Whether group has a file mounted on it
 END SUBROUTINE h5gget_info_by_name_f
     </pre>
 
diff --git a/html/RM/H5L/H5Lget_name_by_idx.htm b/html/RM/H5L/H5Lget_name_by_idx.htm
index 3d49a5c..b24e394 100644
--- a/html/RM/H5L/H5Lget_name_by_idx.htm
+++ b/html/RM/H5L/H5Lget_name_by_idx.htm
@@ -22,6 +22,11 @@
 <!-- HEADER RIGHT "H5Lget_name_by_idx" -->
 <hr>
 <dl>
+
+  <dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 3 April 2013
+      </i></font></div>
+
   <dt><strong>Name:</strong> <a name="Link-GetNameByIdx">H5Lget_name_by_idx</a>
   <dt><strong>Signature:</strong>
     <dd><em>ssize_t</em> <code>H5Lget_name_by_idx</code>(
@@ -34,10 +39,12 @@
         <em>size_t</em> <code>size</code>,
         <em>hid_t</em> <code>lapl_id</code>
     )
+
   <p>
   <dt><strong>Purpose:</strong>
     <dd>Retrieves name of the <i>n</i>th link in a group, 
         according to the order within a specified field or index.
+
   <p>
   <dt><strong>Description:</strong>
     <dd><code>H5Lget_name_by_idx</code> retrieves the name of the <i>n</i>th 
@@ -53,6 +60,11 @@
         initial <code>H5Lget_name_by_idx</code> call with <code>name</code>
         set to <code>NULL</code>; the function's return value will be the
         size of the name.
+
+  <p>
+  <dt><strong>Note:</strong>
+    <dd>
+
   <p>
   <dt><strong>Parameters:</strong>
     <dd><table>
@@ -83,57 +95,60 @@
         <td valign="top"><em>hid_t</em> <code>lapl_id</code></td>
         <td valign="top">IN: Link access property list</td></tr>
     </table>
+
   <p>
   <dt><strong>Returns:</strong>
     <dd>Returns the size of the link name if successful;
         otherwise returns a negative value.
+
   <p>
-  <dt><strong>Fortran90 Interface:</strong> h5lget_name_by_idx_f
+  <dt><strong>Fortran90 Interface:</strong> h5lget_info_by_idx_f
     <dd>
     <pre>
-SUBROUTINE h5lget_name_by_idx_f(loc_id, group_name, index_field, order, n, &
-      name, hdferr, lapl_id, size)
+SUBROUTINE h5lget_info_by_idx_f(loc_id, group_name, index_field, order, n, &
+     f_corder_valid, corder, cset, data_size, hdferr, lapl_id)
   IMPLICIT NONE
-  INTEGER(HID_T), INTENT(IN) :: loc_id       
-                            ! File or group identifier specifying location of 
-                            ! subject group  
+  INTEGER(HID_T), INTENT(IN) :: loc_id  
+                    ! File/group identifier specifying location of subject group
   CHARACTER(LEN=*), INTENT(IN) :: group_name 
-                            ! Name of subject group
+                    ! Name of subject group
   INTEGER, INTENT(IN) :: index_field  
-                            ! Index or field which determines the order
-                            !  H5_INDEX_UNKNOWN_F   - Unknown index type
-                            !  H5_INDEX_NAME_F      - Index on names
-                            !  H5_INDEX_CRT_ORDER_F - Index on creation order
-                            !  H5_INDEX_N_F         - Number of indices defined
+                    ! Index or field which determines the order
+                    !    H5_INDEX_UNKNOWN_F   - Unknown index type
+                    !    H5_INDEX_NAME_F      - Index on names
+                    !    H5_INDEX_CRT_ORDER_F - Index on creation order
+                    !    H5_INDEX_N_F         - Number of indices defined
   INTEGER, INTENT(IN) :: order        
-                            ! Order in which to iterate over index:
-                            !    H5_ITER_UNKNOWN_F  - Unknown order
-                            !    H5_ITER_INC_F      - Increasing order
-                            !    H5_ITER_DEC_F      - Decreasing order
-                            !    H5_ITER_NATIVE_F   - No particular order, 
-                            !                         whatever is fastest
+                    ! Order in which to iterate over index; Possible values are:
+                    !    H5_ITER_UNKNOWN_F  - Unknown order
+                    !    H5_ITER_INC_F      - Increasing order
+                    !    H5_ITER_DEC_F      - Decreasing order
+                    !    H5_ITER_NATIVE_F   - No particular order
+                    !                         whatever is fastest
     </pre>
 <!-- NEW PAGE -->
     <pre>
   INTEGER(HSIZE_T), INTENT(IN) :: n   
-                            ! Attribute’s position in index
-  CHARACTER(LEN=*), INTENT(OUT) :: name 
-                            ! Buffer in which link value is returned
-  INTEGER, INTENT(OUT) :: hdferr        ! Error code:
-                            ! 0 on success and -1 on failure
-  INTEGER(SIZE_T), OPTIONAL, INTENT(OUT) :: size   
-                            ! Indicates the size, in the number of characters,
-                            ! of the link, returns exact size
-  INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id
-                            ! Link access property list
-END SUBROUTINE h5lget_name_by_idx_f
+                    ! Attribute’s position in index
+  LOGICAL, INTENT(OUT) :: f_corder_valid 
+                    ! Indicates whether the creation order data is valid for 
+                    ! this attribute 
+  INTEGER, INTENT(OUT) :: corder 
+                    ! Is a positive integer containing the creation order of the
+                    ! attribute
+  INTEGER, INTENT(OUT) :: cset 
+                    ! Indicates the character set used for the attribute’s name
+  INTEGER(HSIZE_T), INTENT(OUT) :: data_size   
+                    ! Indicates the size, in the number of characters, of 
+                    ! the attribute
+  INTEGER, INTENT(OUT) :: hdferr       
+                    ! Error code:
+                    ! 0 on success and -1 on failure
+  INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lapl_id  
+                    ! Link access property list
+END SUBROUTINE h5lget_info_by_idx_f
     </pre>
-        <!--<dt><strong>Non-C API(s):</strong>
-    	<dd>
-        
-        <img src="Graphics/Java.gif"> 
-        <img src="Graphics/C++.gif">
-        -->
+
   <p>
   <dt><strong>History:</strong>
     <dd><table width="90%">
diff --git a/html/RM/H5L/H5Literate.htm b/html/RM/H5L/H5Literate.htm
index 4c67c79..f79f90e 100644
--- a/html/RM/H5L/H5Literate.htm
+++ b/html/RM/H5L/H5Literate.htm
@@ -22,7 +22,7 @@
 <!-- HEADER RIGHT "H5Literate" -->
 <hr>
 <dl>
-  <dt><div align=right><font color=999999 size=-1><i>
+  <dt><div align=right><font color="999999" size=-1><i>
       Last modified: 26 September 2014
       </i></font></div>
 
diff --git a/html/RM/H5L/H5Lvisit.htm b/html/RM/H5L/H5Lvisit.htm
index ac76563..3eaa68e 100644
--- a/html/RM/H5L/H5Lvisit.htm
+++ b/html/RM/H5L/H5Lvisit.htm
@@ -221,6 +221,31 @@
       successfully, every link or object below the specified point in the 
       file has been presented to the application for whatever 
       processing the application requires.
+
+
+  <p>
+  <dt><strong>Programming Note for C++ Developers Using C Functions:</strong>
+    <dd>
+      <p>If a C routine that takes a function pointer as an argument is 
+      called from within C++ code, the C routine should be returned from 
+      normally. </p>
+
+      <p>Examples of this kind of routine include callbacks such as 
+      <code>H5Pset_elink_cb</code> and <code>H5Pset_type_conv_cb</code> 
+      and functions such as <code>H5Tconvert</code> and 
+      <code>H5Ewalk2</code>.</p>
+
+      <p>Exiting the routine in its normal fashion allows the HDF5 C 
+      Library to clean up its work properly. In other words, if the C++ 
+      application jumps out of the routine back to the C++ 
+      “catch” statement, the library is not given the 
+      opportunity to close any temporary data structures that were set 
+      up when the routine was called. The C++ application should save 
+      some state as the routine is started so that any problem that 
+      occurs might be diagnosed.</p>
+
+
+
       
   <p>
   <dt><strong>Parameters:</strong>
diff --git a/html/RM/H5L/H5Lvisit_by_name.htm b/html/RM/H5L/H5Lvisit_by_name.htm
index 31fa029..f521335 100644
--- a/html/RM/H5L/H5Lvisit_by_name.htm
+++ b/html/RM/H5L/H5Lvisit_by_name.htm
@@ -247,6 +247,31 @@
       successfully, every link or object below the specified point in the 
       file has been presented to the application for whatever 
       processing the application requires.
+
+
+  <p>
+  <dt><strong>Programming Note for C++ Developers Using C Functions:</strong>
+    <dd>
+      <p>If a C routine that takes a function pointer as an argument is 
+      called from within C++ code, the C routine should be returned from 
+      normally. </p>
+
+      <p>Examples of this kind of routine include callbacks such as 
+      <code>H5Pset_elink_cb</code> and <code>H5Pset_type_conv_cb</code> 
+      and functions such as <code>H5Tconvert</code> and 
+      <code>H5Ewalk2</code>.</p>
+
+      <p>Exiting the routine in its normal fashion allows the HDF5 C 
+      Library to clean up its work properly. In other words, if the C++ 
+      application jumps out of the routine back to the C++ 
+      “catch” statement, the library is not given the 
+      opportunity to close any temporary data structures that were set 
+      up when the routine was called. The C++ application should save 
+      some state as the routine is started so that any problem that 
+      occurs might be diagnosed.</p>
+
+
+
       
   <p>
   <dt><strong>Parameters:</strong>
diff --git a/html/RM/H5O/H5Oincr_refcount.htm b/html/RM/H5O/H5Oincr_refcount.htm
index 2820bb5..3bf1ee0 100644
--- a/html/RM/H5O/H5Oincr_refcount.htm
+++ b/html/RM/H5O/H5Oincr_refcount.htm
@@ -99,7 +99,7 @@
           <td valign="top" align="left" width="10%">
             <strong>Release</strong>    </td>
           <td valign="top" align="left">
-            <strong>Change</strong></td></tr>
+            <strong>Change</strong></td></tr>
         <tr>
           <td valign="top">1.8.11</td>
           <td valign="top">
diff --git a/html/RM/H5P/H5Pdecode.htm b/html/RM/H5P/H5Pdecode.htm
new file mode 100644
index 0000000..203c1ab
--- /dev/null
+++ b/html/RM/H5P/H5Pdecode.htm
@@ -0,0 +1,124 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * Copyright by The HDF Group.                                               *
+  * Copyright by the Board of Trustees of the University of Illinois.         *
+  * All rights reserved.                                                      *
+  *                                                                           *
+  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+  * terms governing use, modification, and redistribution, is contained in    *
+  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+  * of the source code distribution tree; Copyright.html can be found at the  *
+  * root level of an installed copy of the electronic HDF5 document set and   *
+  * is linked from the top-level documents page.  It can also be found at     *
+  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * access to either file, you may request a copy from help at hdfgroup.org.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pdecode" -->
+<hr>
+<dl>
+
+<dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 28 September 2012</i></font></div>
+
+<dt><strong>Name:</strong> <a name="Property-Decode">H5Pdecode</a>
+
+<p></p>
+<dt><strong>Signature:</strong>
+    <dd><em>hid_t</em> <code>H5Pdecode</code>(
+            <em>void *</em><code>buf</code>
+            )
+
+<p></p>
+<dt><strong>Purpose:</strong>
+    <dd>Decodes property list received in a binary object buffer
+        and returns a new property list identifier.
+
+<p></p>
+<dt><strong>Description:</strong>
+    <dd>Given an binary property list description in a buffer, 
+        <code>H5Pdecode</code> reconstructs the HDF5 property list and 
+        returns an identifier for the new property list. 
+        The binary description of the property list is encoded by 
+        <a href="RM_H5P.html#Property-Encode"><code>H5Pencode</code></a>.
+<!--
+        <p>
+        A property’s decode callback decodes the property 
+        and sets it in the property list.
+-->
+        <p>
+        Note that some properties cannot be encoded and therefore will 
+        not be available in the decoded property list.
+        These properties are discussed in 
+        <a href="RM_H5P.html#Property-Encode"><code>H5Pencode</code></a>.
+        <p>
+        The user is responsible for passing in the correct buffer.
+        <p>
+        The property list identifier returned by this function should be 
+        released with <code>H5Pclose</code> when the identifier is 
+        no longer needed so that resource leaks will not develop.</p>
+
+<p></p>
+<dt><strong>Parameters:</strong>
+    <dd><table>
+        <tr>
+            <td valign="top"><em>void *</em><code>buf</code>    </td>
+            <td valign="top">IN: Buffer holding the encoded property list
+	    </td>
+	</tr>
+      </table>
+    </dd>
+
+<p></p>
+<dt><strong>Returns:</strong>
+    <dd>Returns an object identifier (non-negative) if successful; 
+        otherwise returns a negative value.
+
+<p></p>
+<dt><strong>Fortran90 Interface:</strong> <!--h5pdecode_f-->
+    <dd> None.
+<!--
+<pre>
+SUBROUTINE h5pdecode_f(buf, obj_id, hdferr)
+  IMPLICIT NONE
+  CHARACTER(LEN=*), INTENT(IN) :: buf     ! Property list buffer to be decoded
+  INTEGER(HID_T), INTENT(OUT) :: plist_id ! Property list identifier 
+  INTEGER, INTENT(OUT) :: hdferr          ! Error code
+                                          ! 0 on success and -1 on failure
+END SUBROUTINE h5pdecode_f
+    </pre>
+-->
+    </dd>
+
+  <p>
+  <dt><strong>See Also:</strong>
+    <dd>
+        <table border="0">
+          <tr><td valign="top" align="left">
+              <a href="RM_H5P.html#Property-Encode">
+              <code>H5Pencode</code></a><code>  </code>
+              </td><td>
+               
+              </td></tr>
+        </table>
+
+  <p>
+  <dt><strong>History:</strong>
+    <ul><table width="90%">
+        <tr>
+          <td valign="top" align="left" width="10%">
+            <strong>Release</strong>    </td>
+          <td valign="top" align="left">
+            <strong>Change</strong></td></tr>
+        <tr>
+          <td valign="top">1.10.0</td>
+          <td valign="top">
+            Function introduced in this release.</td></tr>
+    </table></ul>
+</dl>
+
diff --git a/html/RM/H5P/H5Pencode.htm b/html/RM/H5P/H5Pencode.htm
new file mode 100644
index 0000000..125b17c
--- /dev/null
+++ b/html/RM/H5P/H5Pencode.htm
@@ -0,0 +1,160 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * Copyright by The HDF Group.                                               *
+  * Copyright by the Board of Trustees of the University of Illinois.         *
+  * All rights reserved.                                                      *
+  *                                                                           *
+  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+  * terms governing use, modification, and redistribution, is contained in    *
+  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+  * of the source code distribution tree; Copyright.html can be found at the  *
+  * root level of an installed copy of the electronic HDF5 document set and   *
+  * is linked from the top-level documents page.  It can also be found at     *
+  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * access to either file, you may request a copy from help at hdfgroup.org.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pencode" -->
+<hr>
+<dl>
+
+<dt><div align=right><font color=999999 size=-1><i>
+    Last modified: 28 September 2012</i></font></div>
+
+<dt><strong>Name:</strong> <a name="Property-Encode">H5Pencode</a>
+
+<dt><strong>Signature:</strong>
+    <dd><em>herr_t</em> <code>H5Pencode</code>(
+            <em>hid_t</em> <code>plist_id</code>, 
+            <em>void *</em><code>buf</code>, 
+            <em>size_t *</em><code>nalloc</code>
+            )
+
+<p>
+<dt><strong>Purpose:</strong>
+    <dd>Encodes the property values in a property list into a binary buffer.
+
+<p>
+<dt><strong>Motivation:</strong>
+    <dd><code>H5Pencode</code> creates a computer-readable description 
+        of a property list that can be passed 
+        to another process within an application or
+        to another application.
+        This capability allows an application or a developer 
+        to create a property list once and encode it for use elsewhere.
+        The property list can then be decoded with 
+        <a href="RM_H5P.html#Property-Decode"><code>H5Pdecode</code></a>
+        to replicate the property list in another process or application.
+        Since the binary buffer containing the encoded description is
+        portable, it can be passed across systems.
+
+<p>
+<dt><strong>Description:</strong>
+    <dd><code>H5Pencode</code> encodes the property list 
+        <code>plist_id</code> into the binary buffer <code>buf</code>.
+        <p>
+        If the required buffer size is unknown,
+        <code>buf</code> can be passed in as <code>NULL</code> and the
+        function will set the required buffer size in <code>nalloc</code>.
+        The buffer can then be created and the property list encoded with 
+        a subsequent <code>H5Pencode</code> call.
+        <p>
+        If the buffer passed in is not big enough to hold the encoded 
+        properties, the <code>H5Pencode</code> call can be expected
+        to fail with a segmentation fault.
+        <p>
+        Properties that do not have encode callbacks will be skipped.
+        There is currently no mechanism to register
+        an encode callback for a user-defined property, so user-defined
+        properties cannot currently be encoded.
+        <p>
+        Some properties cannot be encoded, particularly properties that 
+        are reliant on local context.
+        Such properties include:
+        <ul>
+<font color="red"><i>
+            <li>Identify properties and list them here.
+            <li>Properties that do not have an encode callback.
+</i></font>
+        </ul>
+
+<p>
+<dt><strong>Parameters:</strong>
+    <dd><table>
+        <tr>
+            <td valign="top"><em>hid_t</em> <code>plist_id    </code></td>
+            <td valign="top">IN: Identifier of the property list to be 
+	      encoded.</td>
+	</tr>
+        <tr>
+            <td valign="top"><em>void *</em><code>buf</code></td>
+            <td valign="top">OUT: Buffer into which the property list 
+	      will be encoded.  
+              <br>
+              If the provided buffer is <code>NULL</code>, 
+	      the size of the buffer required is returned through 
+              <code>nalloc</code>; the function does nothing more.
+              </td>
+	</tr>
+        <tr>
+            <td valign="top"><em>size_t *</em><code>nalloc</code></td>
+            <td valign="top">OUT: The size of the required buffer.</td>
+	</tr>
+      </table>
+    </dd>
+
+<p>
+<dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful; 
+        otherwise returns a negative value.
+    </dd>
+
+<p>
+<dt><strong>Fortran90 Interface:</strong> <!--h5pencode_f-->
+    <dd> None.
+<!--<pre>
+SUBROUTINE h5pencode_f(plist_id, buf, nalloc, hdferr)
+  IMPLICIT NONE
+  INTEGER(HID_T), INTENT(IN) :: plist_id ! Identifier of the property list 
+                                         ! to be encoded
+  CHARACTER(LEN=*), INTENT(OUT) :: buf   ! Buffer object to be encoded into
+  INTEGER(SIZE_T), INTENT(INOUT) :: nalloc 
+                                         ! The size of the allocated buffer
+  INTEGER, INTENT(OUT) :: hdferr         ! Error code
+                                         ! 0 on success and -1 on failure
+END SUBROUTINE h5pencode_f
+    </pre>-->
+    </dd>
+
+  <p>
+  <dt><strong>See Also:</strong>
+    <dd>
+        <table border="0">
+          <tr><td valign="top" align="left">
+              <a href="RM_H5P.html#Property-Decode">
+              <code>H5Pdecode</code></a><code>  </code>
+              </td><td>
+               
+              </td></tr>
+        </table>
+
+<p>
+<dt><strong>History:</strong>
+    <ul><table width="90%">
+        <tr>
+          <td valign="top" align="left" width="10%">
+            <strong>Release</strong>    </td>
+          <td valign="top" align="left">
+            <strong>Change</strong></td></tr>
+        <tr>
+          <td valign="top">1.10.0</td>
+          <td valign="top">
+            Function introduced in this release.</td></tr>
+    </table></ul>
+</dl>
+
diff --git a/html/RM/H5P/H5Pget_char_encoding.htm b/html/RM/H5P/H5Pget_char_encoding.htm
index 1075d60..25d2fed 100644
--- a/html/RM/H5P/H5Pget_char_encoding.htm
+++ b/html/RM/H5P/H5Pget_char_encoding.htm
@@ -88,7 +88,7 @@
         otherwise returns a negative value.
 
   <p>
-  <dt><strong>Fortran90 Interface:</strong> h5pget_char_encoding_f
+  <dt><strong>Fortran90 Interface:</strong> h5get_char_encoding_f
     <dd><pre>
 SUBROUTINE h5pget_char_encoding_f(plist_id, encoding, hdferr)
   IMPLICIT NONE
diff --git a/html/RM/H5P/H5Pget_data_transform.htm b/html/RM/H5P/H5Pget_data_transform.htm
index 214a22c..c52e949 100644
--- a/html/RM/H5P/H5Pget_data_transform.htm
+++ b/html/RM/H5P/H5Pget_data_transform.htm
@@ -65,20 +65,13 @@
   <dt><strong>Returns:</strong>
     <dd>Success: size of the transform expression.
     <dd>Failure: a negative value.
-  <dt><strong>Fortran90 Interface:</strong> h5pget_data_transform_f
+  <dt><strong>Fortran90 Interface:</strong>
+    <dd>None.
+<!--
     <dd><pre>
-SUBROUTINE h5pget_data_transform_f(plist_id, expression, hdferr, size)
-  IMPLICIT NONE
-  INTEGER(HID_T), INTENT(IN) :: plist_id 
-                                     ! Identifier of the property list or class
-  CHARACTER(LEN=*), INTENT(OUT) :: expression  
-                                     ! Buffer to hold transform expression
-  INTEGER(SIZE_T), INTENT(OUT), OPTIONAL :: size 
-                                     ! Registered size for transform expression
-  INTEGER, INTENT(OUT) :: hdferr     ! Error code
-                                     ! 0 on success and -1 on failure
-END SUBROUTINE h5pget_data_transform_f
+SUBROUTINE
         </pre>
+-->
 
   <dt><strong>History:</strong>
     <dd><table width="90%">
diff --git a/html/RM/H5P/H5Pget_elink_fapl.htm b/html/RM/H5P/H5Pget_elink_fapl.htm
index 0709c8a..cd35761 100644
--- a/html/RM/H5P/H5Pget_elink_fapl.htm
+++ b/html/RM/H5P/H5Pget_elink_fapl.htm
@@ -22,69 +22,59 @@
 <!-- HEADER RIGHT "H5Pget_elink_fapl" -->
 <hr>
 <dl>
-  <dt><strong>Name:</strong> 
-    <a name="Property-GetELinkFapl">H5Pget_elink_fapl</a>
+  <dt><strong>Name:</strong> <a name="Property-GetELinkFapl">H5Pget_elink_fapl</a>
   <dt><strong>Signature:</strong>
-    <dd><em>hid_t</em> <code>H5Pget_elink_fapl</code>(
+    <dd><em>hid_t</em> <code>H5Pget_elink_prefix</code>(
         <em>hid_t</em> <code>lapl_id</code>
-        )
-    <p>
+    )
+  <p></p>
   <dt><strong>Purpose:</strong>
-    <dd>Retrieves the file access property list identifier associated 
-        with the link access property list.
-  <p>
+    <dd>Retrieves the file access property list identifier associated with the link access property list.
+  <p></p>
   <dt><strong>Description:</strong>
-    <dd><code>H5Pget_elink_fapl</code> retrieves the 
-        file access property list identifier that is set for the 
-        link access property list identifier, <code>lapl_id</code>.
-        The library uses this file access property list identifier to open 
-        the target file for the external link access.
-        <p>
-        When no such identifier is set, this routine returns 
-        <code>H5P_DEFAULT</code>.
-        <p>
-        See also <a href="#Property-SetELinkFapl">H5Pset_elink_fapl</a> and 
-        <a href="RM_H5L.html#Link-CreateExternal">H5Lcreate_external</a>.
-  <p>
+    <dd><code>H5Pget_elink_fapl</code> retrieves the file access property list identifier that is set for the link access property list identifier, <code>lapl_id</code>.
+	The library uses this file access property list identifier to open the target file
+	for the external link access.
+	See also <a href="#Property-SetELinkFapl">H5Pset_elink_fapl</a> and 
+	<a href="RM_H5L.html#Link-CreateExternal">H5Lcreate_external</a>.
+	When no such identifier is set, this routine returns <code>H5P_DEFAULT</code>.
+  </p>
   <dt><strong>Parameters:</strong>
-    <dd>
-    <table>
-      <tr>
-        <td valign="top"><em>hid_t</em> <code>lapl_id</code></td>
-        <td>    </td>
-        <td valign="top">IN: Link access property list identifier.</td>
-      </tr>
-    </table>
-  <p>
+    <ul><table>
+        <tr>
+		    <td valign="top"><em>hid_t</em> <code>lapl_id    </code></td>
+            <td valign="top">IN: Link access property list identifier.</td></tr>
+    </table></ul>
+  <p></p>
   <dt><strong>Returns:</strong>
-    <dd>Returns a non-negative value if successful; 
-        otherwise returns a negative value.
-  <p>
+    <dd>Returns a non-negative value if successful; otherwise returns a negative value.
+  <p></p>
   <dt><strong>Fortran90 Interface:</strong> <!--h5p...._f-->
     <dd>
       None.
-<!--__ *** FORTRAN90 INTERFACE  **********************************  -->
-<!--__ When the Fortran90 interface is complete, replace this       -->     
-<!--__ section with the Fortran90 subroutine description.           -->     
-<!--__                                                              -->     
-<!--__ See the file h5fortran_f_template.html for a template and    -->
-<!--__ instructions.                                                -->     
-<!--__ ***********************************************************  -->
-  <p>
+<!--
+	<pre>
+	</pre>		
+-->
+<!--
+  </p>
+  <dt><strong>Non-C API(s):</strong>
+    	<dd>
+        <img src="Graphics/Java.gif"> 
+        <img src="Graphics/C++.gif">
+        -->
+  <p></p>
   <dt><strong>History:</strong>
-    <dd>
-    <table width="90%">
-      <tr>
-        <td valign="top" align="left" width="10%">
-            <strong>Release</strong>    </td>
-        <td valign="top" align="left">
-            <strong>C</strong></td>
-      </tr>
-      <tr>
-        <td valign="top">1.8.2</td>
-        <td valign="top">
-            Function introduced in this release.</td>
-      </tr>
+    <dd><table width="90%">
+        <tr>
+		  <td valign="top" align="left" width="10%">
+		    <strong>Release</strong>    </td>
+          <td valign="top" align="left">
+		    <strong>C</strong></td></tr>
+        <tr>
+		  <td valign="top">1.9.0</td>
+          <td valign="top">
+		    Function introduced in this release.</td></tr>
     </table>
 </dl>
 
diff --git a/html/RM/H5P/H5Pget_est_link_info.htm b/html/RM/H5P/H5Pget_est_link_info.htm
index 8e3736d..a665f65 100644
--- a/html/RM/H5P/H5Pget_est_link_info.htm
+++ b/html/RM/H5P/H5Pget_est_link_info.htm
@@ -77,20 +77,12 @@
     <dd>Returns a non-negative value if successful;
         otherwise returns a negative value.
   <p>
-  <dt><strong>Fortran90 Interface:</strong> h5pget_est_link_info_f
+  <dt><strong>Fortran90 Interface:</strong> <!-- h5pget_est_link_info_f -->
+    <dd>None.
+<!--
     <dd><pre>
-SUBROUTINE h5pget_est_link_info_f(gcpl_id,est_num_entries, est_name_len,hdferr)
-
-  IMPLICIT NONE
-  INTEGER(HID_T), INTENT(IN) :: gcpl_id   ! Group creation property list id
-  INTEGER, INTENT(OUT) :: est_num_entries ! Estimated number of links to be 
-                                          ! inserted into group
-  INTEGER, INTENT(OUT) :: est_name_len    ! Estimated average length of link 
-                                          ! names
-  INTEGER, INTENT(OUT) :: hdferr          ! Error code
-                                          ! 0 on success and -1 on failure
-END SUBROUTINE h5pget_est_link_info_f 
-        </pre>
+    </pre>
+-->
 
   <p>
   <dt><strong>History:</strong>
diff --git a/html/RM/H5P/H5Pget_fapl_direct.htm b/html/RM/H5P/H5Pget_fapl_direct.htm
index 5fc7f3d..6977ef8 100644
--- a/html/RM/H5P/H5Pget_fapl_direct.htm
+++ b/html/RM/H5P/H5Pget_fapl_direct.htm
@@ -75,17 +75,17 @@
     <dd>Returns a non-negative value if successful;
         otherwise returns a negative value.
   <p>
-  <dt><strong>Fortran90 Interface:</strong>
+  <dt><strong>Fortran90 Interface:</strong> H5Pget_fapl_direct_f
     <dd><pre>
-SUBROUTINE H5Pget_fapl_direct_f(fapl_id, alignment, block_size, cbuf_size, &
+ SUBROUTINE H5Pget_fapl_direct_f(fapl_id, alignment, block_size, cbuf_size, &
                                 hdferr)
   IMPLICIT NONE  
   INTEGER(HID_T), INTENT(IN) :: fapl_id ! File access property list identifier
-  INTEGER(SIZE_T), INTENT(OUT) :: alignment 	  
+  INTEGER(SIZE_T), INTENT(OUT) :: alignment           
                                         ! Required memory alignment boundary!
-  INTEGER(SIZE_T), INTENT(OUT) :: block_size     
+  INTEGER(SIZE_T), INTENT(OUT) :: block_size         
                                         ! File system block size
-  INTEGER(SIZE_T), INTENT(OUT) :: cbuf_size 	  
+  INTEGER(SIZE_T), INTENT(OUT) :: cbuf_size           
                                         ! Copy buffer size
   INTEGER, INTENT(OUT) :: hdferr        ! Error code
                                         ! 0 on success and -1 on failure
diff --git a/html/RM/H5P/H5Pget_file_image.htm b/html/RM/H5P/H5Pget_file_image.htm
index d565912..1994d9b 100644
--- a/html/RM/H5P/H5Pget_file_image.htm
+++ b/html/RM/H5P/H5Pget_file_image.htm
@@ -83,7 +83,6 @@
       or with the appropriate method if file image callbacks have been set.
       <p>
 
-<!--
       <p>
       <b>Note/Warning:</b> 
 
@@ -92,7 +91,6 @@ This seems like one that might not require a note or warning.
 <br>
 Silent failure or unintended consequences that might go unnoticed, for example.
 </font>
--->
 
 
   <p>
@@ -145,7 +143,6 @@ Silent failure or unintended consequences that might go unnoticed, for example.
     <dd>Returns a non-negative value if successful;
         otherwise returns a negative value.
 
-<!--
   <p>
   <dt><strong>Failure Modes:</strong>
     <dd>
@@ -153,7 +150,6 @@ Silent failure or unintended consequences that might go unnoticed, for example.
 <font color="red">
 None known to date.
 </font>
--->
 
 <!--
   <p>
diff --git a/html/RM/H5P/H5Pget_file_image_callbacks.htm b/html/RM/H5P/H5Pget_file_image_callbacks.htm
index bd38841..555127a 100644
--- a/html/RM/H5P/H5Pget_file_image_callbacks.htm
+++ b/html/RM/H5P/H5Pget_file_image_callbacks.htm
@@ -128,7 +128,6 @@ For example, though it's still not that easy to read:
 -->
 
 
-<!--
       <p>
       <b>Note/Warning:</b> 
 
@@ -136,7 +135,6 @@ For example, though it's still not that easy to read:
 <font color="red">
 Any notes or warnings to pass along?
 </font>
--->
 
 
   <p>
@@ -174,7 +172,6 @@ Any notes or warnings to pass along?
     <dd>Returns a non-negative value if successful;
         otherwise returns a negative value.
 
-<!--
   <p>
   <dt><strong>Failure Modes:</strong>
     <dd>
@@ -182,7 +179,6 @@ Any notes or warnings to pass along?
 <font color="red">
 None known to date.
 </font>
--->
 
 
 <!--
diff --git a/html/RM/H5P/H5Pget_file_space.htm b/html/RM/H5P/H5Pget_file_space.htm
new file mode 100644
index 0000000..52e66fd
--- /dev/null
+++ b/html/RM/H5P/H5Pget_file_space.htm
@@ -0,0 +1,195 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * Copyright by The HDF Group.                                               *
+  * Copyright by the Board of Trustees of the University of Illinois.         *
+  * All rights reserved.                                                      *
+  *                                                                           *
+  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+  * terms governing use, modification, and redistribution, is contained in    *
+  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+  * of the source code distribution tree; Copyright.html can be found at the  *
+  * root level of an installed copy of the electronic HDF5 document set and   *
+  * is linked from the top-level documents page.  It can also be found at     *
+  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * access to either file, you may request a copy from help at hdfgroup.org.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pget_file_space" -->
+<hr>
+<dl>
+
+  <dt><div align=right><font color=999999 size=-1><i>
+      Last modified: 19 April 2012
+      </i></font></div>
+
+  <dt><strong>Name:</strong> <a name="Property-GetFileSpace">H5Pget_file_space</a>
+
+  <dt><strong>Signature:</strong>
+    <dd><em>herr_t </em><code>H5Pget_file_space</code>(
+            <em>hid_t </em><code>fcpl_id</code>,
+            <em>H5F_file_space_type_t *</em><code>strategy</code>,
+            <em>hsize_t *</em><code>threshold</code>
+        )
+
+  <p>
+  <dt><strong>Purpose:</strong>
+    <dd>Retrieves the file space management strategy and/or
+	free-space section threshold for an HDF5 file.
+
+  <p>
+  <dt><strong>Motivation:</strong>
+    <dd><code>H5Pget_file_space</code> 
+      provides the means for applications to manage an HDF5 file’s 
+      file space to meet specific needs.
+
+  <p>
+  <dt><strong>Description:</strong>
+    <dd><code>H5Pget_file_space</code>
+      retrieves the file space management strategy and/or 
+      the free-space threshold specified for a file.
+      <p>
+      The first parameter, <code>fcpl_id</code>, is the file creation 
+      property list identifier associated with an HDF5 file.
+      <p>
+      If <code>strategy</code> is non-null, 
+      this routine will retrieve the existing file space management strategy 
+      in use for the file and store it in <code>strategy</code>.  
+      <p>
+      If <code>threshold</code> is non-null, 
+      this routine will retrieve the existing free-space section threshold 
+      used by the library’s free space managers for the file and store it 
+      in <code>threshold</code>.
+      Any pointer parameters which are passed as NULL are not queried. 
+
+  <p>
+  <dt><strong>Parameters:</strong>
+    <dd>
+    <table>
+      <tr valign="top">
+        <td><em>hid_t </em><code>fcpl_id</code>
+            </td><td>    </td>
+        <td>IN: The file creation property list identifier.
+            </td></tr>
+
+      <tr valign="top">
+        <td><em>H5F_file_space_type_t *</em><code>strategy</code>
+        </td><td>    </td>
+        <td>IN/OUT: The file space management strategy currently in use 
+            for the file.
+<!--
+            <p>
+            The <code><em>H5F_file_space_type_t</em></code> 
+            <small>ENUM</small> is fully described in 
+            <a href="../examples/H5F_file_space_type_t.html">
+            <code>H5F_file_space_type_t.html</code></a>.
+-->
+            </td></tr>
+
+      <tr valign="top">
+        <td><em>hsize_t *</em><code>threshold</code>
+            </td><td> </td>
+        <td>IN/OUT: The free-space section threshold currently in use.
+            </td></tr>
+    </table>
+
+  <p>
+  <dt><strong>Returns:</strong>
+
+    <dd>Returns a non-negative value if successful;
+        otherwise returns a negative value.
+
+  <p>
+  <dt><strong>Failure Modes:</strong>
+    <dd>This routine will fail when either of the following is true:
+        <ul>
+            <li>The library fails to retrieve the file creation property list 
+                <de>fcpl_id</de>.
+            <li>The library fails to retrieve the strategy and/or threshold 
+                in the file creation property list <de>fcpl_id</de>.
+        </ul>
+
+  <p>
+  <dt><strong>Example Usage:</strong>
+
+    <dd>The first example retrieves the file space management handling strategy 
+        in use for the file associated with <code>fcpl</code> 
+        in the parameter <code>strategy</code>.
+	It also retrieves the free-space section threshold in use for the file 
+	in the parameter <code>threshold</code>. 
+<dir><pre>
+H5Pget_file_space(fcpl, &strategy, &threshold);
+</pre></dir>
+    <p>
+
+    <dd>The second example retrieves the file space management strategy for 
+	the file associated with <code>fcpl</code> in the parameter 
+        <code>strategy</code>.
+	Since the second parameter is null, this routine does not retrieve the 
+	free-space section threshold in use for the file.
+<dir><pre>
+H5Pset_file_space(fcpl, &strategy, NULL);
+</pre></dir>
+
+
+<!--__ *** FORTRAN90 INTERFACE  **********************************  -->
+<!--__ When the Fortran90 interface is complete, replace this       -->
+<!--__ section with the Fortran90 subroutine description.           -->
+<!--__                                                              -->
+<!--__ See the file h5fortran_f_insert.htm for a template and       -->
+<!--__ instructions.                                                -->
+<!--__ ***********************************************************  -->
+
+
+  <p>
+  <dt><strong>See Also:</strong>
+    <dd><a href="../RM/RM_H5P.html#Property-SetFileSpace">
+        <code>H5Pset_file_space</code></a>
+        <p>
+
+<!--
+        <a href="../html/RM/H5function.html#H5F_file_space_type_t">
+        <code>H5F_file_space_type_t</code></a>
+        <p>
+-->
+
+        <a href="../RM/Tools.html#Tools-Repack"><code>h5repack</code></a>
+        <p>
+        <a href="../RM/Tools.html#Tools-Dump"><code>h5dump</code></a>
+        <p>
+        <a href="../RM/Tools.html#Tools-Stat"><code>h5stat</code></a>
+        <p>
+        <a href="../Advanced/FileSpaceManagement/FileSpaceManagement.pdf">
+           <cite>HDF5 File Space Management</cite></a>
+
+
+  <p>
+  <dt><strong>History:</strong>
+    <dd><table width="90%">
+        <tr>
+          <td valign="top" align="left" width="10%">
+            <strong>Release</strong>    </td>
+          <td valign="top" align="left">
+            <strong>Change</strong></td>
+        </tr>
+        <tr>
+          <td valign="top">1.10.0</td>
+          <td valign="top">
+            C function introduced in this release.</td>
+        </tr>
+<!--
+        <tr>
+          <td valign="top">*.**.**</td>
+          <td valign="top">
+            Fortran90 subroutine introduced in this release.</td>
+        </tr>
+-->
+        </table>
+
+</dl>
+
+
diff --git a/html/RM/H5P/H5Pget_libver_bounds.htm b/html/RM/H5P/H5Pget_libver_bounds.htm
index 6f15d1e..6de5c58 100644
--- a/html/RM/H5P/H5Pget_libver_bounds.htm
+++ b/html/RM/H5P/H5Pget_libver_bounds.htm
@@ -22,18 +22,26 @@
 <!-- HEADER RIGHT "H5Pget_libver_bounds" -->
 <hr>
 <dl>
-
-  <dt><div align=right><font color=999999 size=-1><i>
-      Last modified: 5 January 2011
-      </i></font></div>
-
   <dt><strong>Name:</strong> <a name="Property-GetLibverBounds">H5Pget_libver_bounds</a>
   <dt><strong>Signature:</strong>
     <dd><em>herr_t</em> <code>H5Pget_libver_bounds</code>(
             <em>hid_t</em> <code>fapl_id</code>,
-            <em>H5F_libver_t *</em><code>libver_low</code>,
-            <em>H5F_libver_t *</em><code>libver_high</code>
+            <em>H5F_libver_t *</em><code>low</code>,
+            <em>H5F_libver_t *</em><code>high</code>
     )
+
+<!--                           --NOTICE--                            -->
+<!--         H5Pset_libver_bounds and H5Pget_libver_bounds           -->
+<!--                                                                 -->
+<!-- H5F_LIBVER_18 has been added in 1.8 and 1.8.6+, but not yet     -->
+<!-- in the trunk.  These functions are therefore out of sync with   -->
+<!-- the 1.8 branches.                                               -->
+<!--                                                                 -->
+<!-- Any changes will need to made independently until H5F_LIBVER_18 -->
+<!-- has been added to the trunk.                                    -->
+<!--                                                                 -->
+<!--                           --NOTICE--                            -->
+
   <p>
   <dt><strong>Purpose:</strong>
     <dd>Retrieves library version bounds settings that indirectly control 
@@ -41,8 +49,8 @@
   <p>
   <dt><strong>Description:</strong>
     <dd><code>H5Pget_libver_bounds</code> retrieves the lower and upper bounds
-        on the HDF5 Library versions that indirectly determine the object 
-        formats versions used when creating objects in the file.
+        on the HDF5 Library versions that indirectly determine the object formats versions 
+        used when creating objects in the file.
         <p>
         This property is retrieved from the file access property list specified
         by <code>fapl_id</code>. 
@@ -54,57 +62,39 @@
         </td>
         <td valign="top">IN: File access property list identifier
         </td></tr>
-
       <tr>
-        <td valign="top"><em>H5F_libver_t *</em><code>libver_low</code>
+        <td valign="top"><em>H5F_libver_t *</em><code>low</code>    
         </td>
-        <td valign="top">OUT: The earliest version of the library that will 
-           be used for writing objects.  The library version indirectly 
-           specifies the earliest object format version that can be used 
-           when creating objects in the file.
+        <td valign="top">OUT: The earliest version of the library that will be used for 
+           writing objects.  The library version indirectly specifies the earliest object
+           format version that can be used when creating objects in the file.
+           <p>
+           Currently, <code>H5F_LIBVER_EARLIEST</code> and <code>H5F_LIBVER_LATEST</code> 
+           are the only valid values for <code>low</code>.
            <p>
-           Valid values of <code>libver_low</code> are as follows:
-           <table border="0">
-             <tr valign="top"><td>    </td><td>
-                 <code>H5F_LIBVER_EARLIEST</code>
-             </td></tr><tr valign="top"><td> </td><td>
-               <code>H5F_LIBVER_18</code>
-             </td></tr><tr valign="top"><td> </td><td>
-               <code>H5F_LIBVER_LATEST</code>
-               </td></tr>
-           </table>
         </td></tr>
-
       <tr>
-        <td valign="top"><em>H5F_libver_t *</em><code>libver_high</code>    
+        <td valign="top"><em>H5F_libver_t *</em><code>high</code>    
         </td>
-        <td valign="top">OUT: The latest version of the library that 
-           will be used for writing objects.  
-           The library version indirectly specifies the latest object
+        <td valign="top">OUT: The latest version of the library that will be used for 
+           writing objects.  The library version indirectly specifies the latest object
            format version that can be used when creating objects in the file.
            <p>
-           <p>
-           Valid values of <code>libver_high</code> are as follows:
-           <table border="0">
-             <tr valign="top"><td>    </td><td>
-               <code>H5F_LIBVER_18</code>
-             </td></tr><tr valign="top"><td> </td><td>
-               <code>H5F_LIBVER_LATEST</code>
-               </td></tr>
-           </table>
+           Currently, <code>H5F_LIBVER_LATEST</code> is the only valid 
+           value for <code>high</code>.
         </td></tr>
-
     </table>
   <p>
   <dt><strong>Returns:</strong>
     <dd>Returns a non-negative value if successful;
         otherwise returns a negative value.
   <p>
-  <dt><strong>Fortran90 Interface:</strong>
+  <dt><strong>Fortran90 Interface:</strong> <!-- h5pfunc_f -->
     <dd>None.
 <!--
-    <dd><pre>
-        </pre>
+    <pre>
+  
+    </pre>
 -->
   <p>
   <dt><strong>History:</strong>
@@ -118,11 +108,6 @@
           <td valign="top">1.8.0</td>
           <td valign="top">
             Function introduced in this release.</td></tr>
-        <tr>
-          <td valign="top">1.8.6</td>
-          <td valign="top">
-            <code>H5F_LIBVER_18</code> version boundary setting added 
-            in this release.</td></tr>
     </table>
 </dl>
 
diff --git a/html/RM/H5P/H5Pget_link_creation_order.htm b/html/RM/H5P/H5Pget_link_creation_order.htm
index cb74afb..9019e43 100644
--- a/html/RM/H5P/H5Pget_link_creation_order.htm
+++ b/html/RM/H5P/H5Pget_link_creation_order.htm
@@ -55,16 +55,13 @@
     <dd>Returns a non-negative value if successful;
         otherwise returns a negative value.
   <p>
-  <dt><strong>Fortran90 Interface:</strong> h5pget_link_creation_order_f
+  <dt><strong>Fortran90 Interface:</strong> <!-- h5pget_est_link_info_f -->
+    <dd>None.
+<!--
     <dd><pre>
-SUBROUTINE h5pget_link_creation_order_f(gcpl_id, crt_order_flags, hdferr)
-  IMPLICIT NONE
-  INTEGER(HID_T), INTENT(IN) :: gcpl_id   ! Group creation property list id
-  INTEGER, INTENT(OUT) :: crt_order_flags ! Creation order flag(s)
-  INTEGER, INTENT(OUT) :: hdferr          ! Error code
-                                          ! 0 on success and -1 on failure
-END SUBROUTINE h5pget_link_creation_order_f  
+  
     </pre>
+-->
 
   <p>
   <dt><strong>History:</strong>
diff --git a/html/RM/H5P/H5Pget_link_phase_change.htm b/html/RM/H5P/H5Pget_link_phase_change.htm
index cb4cb71..1006587 100644
--- a/html/RM/H5P/H5Pget_link_phase_change.htm
+++ b/html/RM/H5P/H5Pget_link_phase_change.htm
@@ -79,7 +79,7 @@
     <dd>Returns a non-negative value if successful;
         otherwise returns a negative value.
   <p>
-  <dt><strong>Fortran90 Interface:</strong>
+  <dt><strong>Fortran90 Interface:</strong> h5pset_link_phase_change 
     <dd><pre>
 SUBROUTINE h5pset_link_phase_change_f(gcpl_id, max_compact, min_dense, hdferr)
   IMPLICIT NONE
diff --git a/html/RM/H5P/H5Pget_local_heap_size_hint.htm b/html/RM/H5P/H5Pget_local_heap_size_hint.htm
index 745d1aa..8be4b25 100644
--- a/html/RM/H5P/H5Pget_local_heap_size_hint.htm
+++ b/html/RM/H5P/H5Pget_local_heap_size_hint.htm
@@ -58,19 +58,8 @@
     <dd>Returns a non-negative value if successful;
         otherwise returns a negative value.
   <p>
-  <dt><strong>Fortran90 Interface:</strong>
-    <dd>
-    <pre>
-SUBROUTINE h5pget_local_heap_size_hint_f(gcpl_id, size_hint, hdferr)
-  IMPLICIT NONE
-  INTEGER(HID_T), INTENT(IN) :: gcpl_id 
-                                  ! Group creation property list identifier
-  INTEGER(SIZE_T), INTENT(OUT) :: size_hint 
-                                  ! Hint for size of local heap
-  INTEGER, INTENT(OUT) :: hdferr  ! Error code
-                                  ! 0 on success and -1 on failure
-END SUBROUTINE h5pget_local_heap_size_hint_f
-    </pre>
+  <dt><strong>Fortran90 Interface:</strong> <!-- h5pget_local_heap_size_hint_f -->
+    <dd>None.
   <p>
   <dt><strong>History:</strong>
     <dd><table width="90%">
diff --git a/html/RM/H5P/H5Pget_obj_track_time.htm b/html/RM/H5P/H5Pget_obj_track_time.htm
index 058f3c0..584d4c8 100644
--- a/html/RM/H5P/H5Pget_obj_track_time.htm
+++ b/html/RM/H5P/H5Pget_obj_track_time.htm
@@ -73,7 +73,7 @@
     <dd>Returns a non-negative value if successful;
         otherwise returns a negative value.
   <p>
-  <dt><strong>Fortran90 Interface:</strong> h5pget_obj_track_times_f 
+  <dt><strong>Fortran90 Interface:</strong> h5pset_obj_track_times_f
     <dd><pre>
 SUBROUTINE h5pget_obj_track_times_f(plist_id, flag, hdferr)
     IMPLICIT NONE
diff --git a/html/RM/H5P/H5Pget_version.htm b/html/RM/H5P/H5Pget_version.htm
index 0387a6d..4fcbe2d 100644
--- a/html/RM/H5P/H5Pget_version.htm
+++ b/html/RM/H5P/H5Pget_version.htm
@@ -33,6 +33,11 @@
   <dt><strong>Purpose:</strong>
     <dd>Retrieves the version information of various objects for 
         a file creation property list.  
+
+  <dt><strong>Notice:</strong>
+    <dd><i>This function is deprecated in favor of the function
+        <a href="RM_H5F.html#File-GetInfo"><code>H5Fget_info</code></a>.</i>
+
   <dt><strong>Description:</strong>
         <dd><code>H5Pget_version</code> retrieves the version information of various objects
             for a file creation property list.  Any pointer parameters which are
diff --git a/html/RM/H5P/H5Pset_attr_phase_change.htm b/html/RM/H5P/H5Pset_attr_phase_change.htm
index bc48af9..877500e 100644
--- a/html/RM/H5P/H5Pset_attr_phase_change.htm
+++ b/html/RM/H5P/H5Pset_attr_phase_change.htm
@@ -83,7 +83,7 @@
     <dd>Returns a non-negative value if successful;
         otherwise returns a negative value.
   <p>
-  <dt><strong>Fortran90 Interface:</strong> h5pset_attr_phase_change_f
+  <dt><strong>Fortran90 Interface:</strong>  h5pset_attr_phase_change_f
     <dd><pre>
 SUBROUTINE h5pset_attr_phase_change_f(ocpl_id, max_compact, min_dense, hdferr)
   IMPLICIT NONE
diff --git a/html/RM/H5P/H5Pset_char_encoding.htm b/html/RM/H5P/H5Pset_char_encoding.htm
index fd03e28..541bcb5 100644
--- a/html/RM/H5P/H5Pset_char_encoding.htm
+++ b/html/RM/H5P/H5Pset_char_encoding.htm
@@ -104,7 +104,7 @@
         otherwise returns a negative value.
 
   <p>
-  <dt><strong>Fortran90 Interface:</strong> h5pset_char_encoding_f
+  <dt><strong>Fortran90 Interface:</strong> h5set_char_encoding_f
     <dd><pre>
 SUBROUTINE h5pset_char_encoding_f(plist_id, encoding, hdferr)
   IMPLICIT NONE
diff --git a/html/RM/H5P/H5Pset_data_transform.htm b/html/RM/H5P/H5Pset_data_transform.htm
index 7ef8107..be723c7 100644
--- a/html/RM/H5P/H5Pset_data_transform.htm
+++ b/html/RM/H5P/H5Pset_data_transform.htm
@@ -65,7 +65,7 @@
   <dt><strong>Returns:</strong>
     <dd>Success: a non-negative value
     <dd>Failure: a negative value
-  <dt><strong>Fortran90 Interface:</strong> SUBROUTINE h5pset_data_transform_f 
+  <dt><strong>Fortran90 Interface:</strong> h5pset_data_transform_f
     <dd><pre>
 SUBROUTINE h5pset_data_transform_f(plist_id, expression, hdferr)
   IMPLICIT NONE
diff --git a/html/RM/H5P/H5Pset_elink_cb.htm b/html/RM/H5P/H5Pset_elink_cb.htm
index d40627a..7064acc 100644
--- a/html/RM/H5P/H5Pset_elink_cb.htm
+++ b/html/RM/H5P/H5Pset_elink_cb.htm
@@ -12,7 +12,7 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
diff --git a/html/RM/H5P/H5Pset_elink_fapl.htm b/html/RM/H5P/H5Pset_elink_fapl.htm
index 9ad4af4..3c9b318 100644
--- a/html/RM/H5P/H5Pset_elink_fapl.htm
+++ b/html/RM/H5P/H5Pset_elink_fapl.htm
@@ -22,7 +22,7 @@
 <!-- HEADER RIGHT "H5Pset_elink_fapl" -->
 <hr>
 <dl>
-  <dt><div align=right><font color=999999 size=-1><i>
+<dt><div align=right><font color=999999 size=-1><i>
       Last modified: 18 June 2013
       </i></font></div>
 
@@ -31,7 +31,7 @@
     <dd><em>herr_t</em> <code>H5Pset_elink_fapl</code>(
         <em>hid_t</em> <code>lapl_id</code>,
         <em>hid_t</em> <code>fapl_id</code>
-        )
+    )
 
   <p>
   <dt><strong>Purpose:</strong>
@@ -55,15 +55,12 @@
 
   <p>
   <dt><strong>Parameters:</strong>
-    <dd>
-    <table>
+    <dd><table>
       <tr>
-        <td valign="top"><em>hid_t</em> <code>lapl_id</code></td>
-        <td>    </td>
+        <td valign="top"><em>hid_t</em> <code>lapl_id    </code></td>
         <td valign="top">IN: Link access property list identifier</td></tr>
       <tr>
         <td valign="top"><em>hid_t</em> <code>fapl_id</code></td>
-        <td> </td>
         <td valign="top">IN: File access property list identifier</td></tr>
       </table>
 
@@ -82,13 +79,6 @@
   <dt><strong>Fortran90 Interface:</strong> <!--h5p...._f-->
     <dd>
       None.
-<!--__ *** FORTRAN90 INTERFACE  **********************************  -->
-<!--__ When the Fortran90 interface is complete, replace this       -->     
-<!--__ section with the Fortran90 subroutine description.           -->     
-<!--__                                                              -->     
-<!--__ See the file h5fortran_f_template.html for a template and    -->
-<!--__ instructions.                                                -->     
-<!--__ ***********************************************************  -->
 
   <p>
   <dt><strong>History:</strong>
@@ -105,4 +95,3 @@
     </table>
 </dl>
 
-
diff --git a/html/RM/H5P/H5Pset_elink_file_cache_size.htm b/html/RM/H5P/H5Pset_elink_file_cache_size.htm
index 83ad9af..9782488 100644
--- a/html/RM/H5P/H5Pset_elink_file_cache_size.htm
+++ b/html/RM/H5P/H5Pset_elink_file_cache_size.htm
@@ -148,6 +148,7 @@
                 <br>
                 <a href="RM_H5P.html#Property-SetELinkFapl">
                 <code>H5Pset_elink_fapl</code></a>
+            </td>
         </tr>
       </table>
 
diff --git a/html/RM/H5P/H5Pset_est_link_info.htm b/html/RM/H5P/H5Pset_est_link_info.htm
index 9834264..4e860bf 100644
--- a/html/RM/H5P/H5Pset_est_link_info.htm
+++ b/html/RM/H5P/H5Pset_est_link_info.htm
@@ -78,15 +78,15 @@
     <dd>Returns a non-negative value if successful;
         otherwise returns a negative value.
   <p>
-  <dt><strong>Fortran90 Interface:</strong>
+  <dt><strong>Fortran90 Interface:</strong> h5pset_est_link_info_f 
     <dd><pre>
-SUBROUTINE H5Pset_est_link_info_f(gcpl_id, est_num_entries, est_name_len, &
+SUBROUTINE h5pset_est_link_info_f(gcpl_id, est_num_entries, est_name_len, &
                                   hdferr)
   IMPLICIT NONE
   INTEGER(HID_T), INTENT(IN) :: gcpl_id 
                                     ! Group creation property list identifier
   INTEGER, INTENT(IN) :: est_num_entries 
-                                    ! Estimated number of links to be 
+                                    ! Estimated number of links to be  
                                     ! inserted into group
   INTEGER, INTENT(IN) :: est_name_len    
                                     ! Estimated average length of link names
diff --git a/html/RM/H5P/H5Pset_fapl_direct.htm b/html/RM/H5P/H5Pset_fapl_direct.htm
index 6f4f0e3..805a6d6 100644
--- a/html/RM/H5P/H5Pset_fapl_direct.htm
+++ b/html/RM/H5P/H5Pset_fapl_direct.htm
@@ -107,18 +107,18 @@ SUBROUTINE h5pset_fapl_direct_f(fapl_id, alignment, block_size, cbuf_size, &
                                 hdferr)
   IMPLICIT NONE  
   INTEGER(HID_T), INTENT(IN) :: fapl_id ! File access property list identifier
-  INTEGER(SIZE_T), INTENT(IN) :: alignment 	  
+  INTEGER(SIZE_T), INTENT(IN) :: alignment    
                                         ! Required memory alignment boundary
-  INTEGER(SIZE_T), INTENT(IN) :: block_size     
+  INTEGER(SIZE_T), INTENT(IN) :: block_size    
                                         ! File system block size
 </pre>
 <!-- NEW PAGE -->
 <pre>
-  INTEGER(SIZE_T), INTENT(IN) :: cbuf_size 	  
+  INTEGER(SIZE_T), INTENT(IN) :: cbuf_size
                                         ! Copy buffer size
   INTEGER, INTENT(OUT) :: hdferr        ! Error code
                                         ! 0 on success and -1 on failure
-END SUBROUTINE H5Pset_fapl_direct_f 
+END SUBROUTINE H5Pset_fapl_direct_f
     </pre></dd>
 
   <p>
diff --git a/html/RM/H5P/H5Pset_fapl_stdio.htm b/html/RM/H5P/H5Pset_fapl_stdio.htm
index 564b101..8e409cf 100644
--- a/html/RM/H5P/H5Pset_fapl_stdio.htm
+++ b/html/RM/H5P/H5Pset_fapl_stdio.htm
@@ -72,4 +72,3 @@ END SUBROUTINE h5pset_fapl_stdio_f
     </table></ul>
 </dl>
 
-
diff --git a/html/RM/H5P/H5Pset_file_image.htm b/html/RM/H5P/H5Pset_file_image.htm
index d9750d5..918ff59 100644
--- a/html/RM/H5P/H5Pset_file_image.htm
+++ b/html/RM/H5P/H5Pset_file_image.htm
@@ -63,21 +63,17 @@
       Calling <code>H5Pset_file_image</code> makes a copy of the buffer
       specified in <code>buf_ptr</code> 
       of size <code>buf_len</code>.
-<!--
       <p>
       <code>H5Pset_file_image</code> copies . . .
--->
        
 
 <!--__ *** NOTES AND WARNINGS ************************************  -->
-<!--
       <p>
       <b>Note/Warning:</b> 
 
 <font color="red">
 Notes?  Warnings?
 </font>
--->
 
   <p>
   <dt><strong>Parameters:</strong>
@@ -111,7 +107,6 @@ Notes?  Warnings?
 <!--__ Replace the text following the <dd> with a description       -->
 <!--__ of how the function may fail.                                -->
 <!--__ ***********************************************************  -->
-<!--
   <p>
   <dt><strong>Failure Modes:</strong>
     <dd>
@@ -119,7 +114,6 @@ Notes?  Warnings?
 <font color="red">
 None known to date.
 </font>
--->
 
 <!--
   <p>
diff --git a/html/RM/H5P/H5Pset_file_image_callbacks.htm b/html/RM/H5P/H5Pset_file_image_callbacks.htm
index 657fb32..3a19722 100644
--- a/html/RM/H5P/H5Pset_file_image_callbacks.htm
+++ b/html/RM/H5P/H5Pset_file_image_callbacks.htm
@@ -38,6 +38,10 @@
   <dt><strong>Purpose:</strong>
     <dd>Sets the callbacks for working with file images.
 
+<font color="red">
+
+</font>
+
   <p>
   <dt><strong>Motivation:</strong>
     <dd><code>H5Pset_file_image_callbacks</code> and other elements of HDF5 are
@@ -502,7 +506,6 @@
 
 <!--__ *** NOTES AND WARNINGS ************************************  -->
 
-<!--
   <p>
   <dt><strong>Notes/Warnings:</strong>
     <dd>
@@ -515,7 +518,6 @@ Surely we can provide a few dire warnings for <i>this</i> one . . .
       unintended consequences that might go unnoticed.  
       That sort of thing.
 </font>
--->
 
 
   <p>
@@ -549,12 +551,10 @@ Surely we can provide a few dire warnings for <i>this</i> one . . .
       file image has already been set in the target file access property list, 
       <code>fapl_id</code>.
 
-<!--
 <font color="red">
 <p>
 Other likely failure modes?  Rare failure modes?  Corner or edge cases?
 </font>
--->
 
 
 
diff --git a/html/RM/H5P/H5Pset_file_space.htm b/html/RM/H5P/H5Pset_file_space.htm
new file mode 100644
index 0000000..67fdcdd
--- /dev/null
+++ b/html/RM/H5P/H5Pset_file_space.htm
@@ -0,0 +1,284 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * Copyright by The HDF Group.                                               *
+  * Copyright by the Board of Trustees of the University of Illinois.         *
+  * All rights reserved.                                                      *
+  *                                                                           *
+  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+  * terms governing use, modification, and redistribution, is contained in    *
+  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+  * of the source code distribution tree; Copyright.html can be found at the  *
+  * root level of an installed copy of the electronic HDF5 document set and   *
+  * is linked from the top-level documents page.  It can also be found at     *
+  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * access to either file, you may request a copy from help at hdfgroup.org.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Pset_file_space" -->
+<hr>
+<dl>
+
+  <dt><div align=right><font color=999999 size=-1><i>
+      Last modified: 19 April 2012
+      </i></font></div>
+
+  <dt><strong>Name:</strong> <a name="Property-SetFileSpace">H5Pset_file_space</a>
+
+  <dt><strong>Signature:</strong>
+    <dd><em>herr_t </em><code>H5Pset_file_space</code>(
+            <em>hid_t </em><code>fcpl_id</code>,
+            <em>H5F_file_space_type_t </em><code>strategy</code>,
+            <em>hsize_t </em><code>threshold</code>
+        )
+
+  <p>
+  <dt><strong>Purpose:</strong>
+    <dd>Sets the file space management strategy and/or
+        free-space section threshold for an HDF5 file.
+
+  <p>
+  <dt><strong>Motivation:</strong>
+    <dd><code>H5Pset_file_space</code> 
+      provides the means for applications to manage an HDF5 file’s 
+      file space to meet specific needs.
+
+  <p>
+  <dt><strong>Description:</strong>
+    <dd><code>H5Pset_file_space</code> 
+      sets the file space management strategy for the file associated with 
+      <code>fcpl_id</code> as specified in <code>strategy</code>  
+      and sets the file-space threshold to <code>threshold</code>.
+      <p>
+      Available strategies are described in the 
+      “Parameters:” section below.
+      <p>
+      This routine can also set the free-space section threshold to
+      <code>threshold</code> so that the library’s free-space managers 
+      will track only free-space sections whose size is 
+      greater than or equal to <code>threshold</code> for the file.
+      <p>
+      Passing <code>0</code> (zero) for <code>strategy</code> or 
+      <code>thresold</code> indicates that the corresponding parameter’s 
+      value should not be modified as a result of the call.
+      <p>
+      <b>Note:</b> The file space management strategy and/or free-space 
+      section threshold that are set via this routine cannot be changed once
+      the file is created. 
+
+  <p>
+  <dt><strong>Parameters:</strong>
+    <dd>
+    <table>
+      <tr valign="top">
+        <td><em>hid_t </em><code>fcpl_id</code>
+            </td><td>    </td>
+        <td>IN: The file creation property list identifier.
+            </td></tr>
+
+      <tr valign="top">
+        <td colspan="3"><em>H5F_file_space_type_t</em> <code>strategy</code>
+        </td></tr>
+        <tr><td> </td><td>    </td>
+        <td>IN: The strategy for file space management.
+            <p>
+            Valid values are as follows:
+            <table border="0">
+              <tr valign="top">
+                <td colspan="2">
+                    <code>H5F_FILE_SPACE_ALL_PERSIST    </code>
+                </td></tr>
+                <tr><td> </td>
+                <td>With this strategy, the free-space managers track the
+                    free space that results from the manipulation of HDF5 
+                    objects in the HDF5 file.  The free space information 
+                    is saved when the file is closed, and reloaded when the 
+                    file is reopened.
+                    <br>
+                    When space is needed for file metadata or raw data, 
+                    the HDF5 library first requests space from the library’s 
+                    free-space managers. If the request is not satisfied, 
+                    the library requests space from the aggregators. 
+                    If the request is still not satisfied, 
+                    the library requests space from the virtual file driver. 
+                    That is, the library will use all of the mechanisms for 
+                    allocating space.
+                </td>
+              </tr>
+
+              <tr valign="top">
+                <td><code>H5F_FILE_SPACE_ALL   </code></td>
+                <td>This is the library’s default file space management 
+                    strategy. 
+                    With this strategy, the free-space managers track the 
+                    free space that results from the manipulation of HDF5 
+                    objects in the HDF5 file.
+                    The free space information is NOT saved when the file is 
+                    closed and the free space that exists upon file closing 
+                    becomes unaccounted space in the file.
+                    <br>
+                    Like the previous strategy, the library will try all of 
+                    the mechanisms for allocating space.  
+                    When space is needed for file metadata or raw data, 
+                    the library first requests space from the free-space
+                    managers.  If the request is not satisfied, the library 
+                    requests space from the aggregators.  If the request is 
+                    still not satisfied, the library requests space from the 
+                    virtual file driver.
+                </td>
+              </tr>
+
+              <tr valign="top">
+                <td colspan="2"><code>H5F_FILE_SPACE_AGGR_VFD</code>
+                </td></tr>
+                <tr><td> </td>
+                <td>With this strategy, the library does not track free space 
+                    that results from the manipulation of HDF5 obejcts in the 
+                    HDF5 file and the free space becomes unaccounted space in 
+                    the file.
+                    <br>
+                    When space is needed for file metadata or raw data,
+                    the library first requests space from the aggregators. 
+                    If the request is not satisfied, the library requests 
+                    space from the virtual file driver. 
+                </td>
+              </tr>
+
+              <tr valign="top">
+                <td><code>H5F_FILE_SPACE_VFD</code></td>
+                <td>With this strategy, the library does not track free space 
+                    that results from the manipulation of HDF5 obejcts in the 
+                    HDF5 file and the free space becomes unaccounted space 
+                    in the file.
+                    <br>
+                    When space is needed for file metadata or raw data,
+                    the library requests space from the virtual file driver. 
+                </td>
+              </tr>
+
+            </table>
+<!--
+            <p>
+            The <code><em>H5F_file_space_type_t</em></code> 
+            <small>ENUM</small> is fully described in 
+            <a href="../examples/H5F_file_space_type_t.html">
+            <code>H5F_file_space_type_t.html</code></a>.
+            </td></tr>
+-->
+
+      <tr valign="top">
+        <td><em>hsize_t </em><code>threshold</code>
+            </td><td> </td>
+        <td>IN: The free-space section threshold, in bytes.
+            Can be any non-negative integer value.
+            <br>
+            A value of <code>0</code> (zero) specifies to retain the current
+            setting.
+            <p>
+            <i>Default:</i> <code>1</code> (one). 
+            Track all free-space sections of 1 byte or larger; 
+            in other words, track all free-space sections.
+            </td></tr>
+    </table>
+
+  <p>
+  <dt><strong>Returns:</strong>
+    <dd>Returns a non-negative value if successful;
+        otherwise returns a negative value.
+
+  <p>
+  <dt><strong>Failure Modes:</strong>
+    <dd>This routine will fail when any of the following is true:
+        <ul>
+            <li><code>strategy</code> is not one of the valid values listed 
+                above.
+            <li>The library fails to retrieve the file creation property list 
+                <code>fcpl_id</code>.
+            <li>The library fails to set the strategy and/or threshold 
+                in the file creation property list <code>fcpl_id</code>.
+        </ul>
+
+  <p>
+  <dt><strong>Example Usage:</strong>
+
+    <dd>The first example sets the file space management strategy for the 
+        file associated with <code>fcpl</code> to 
+        <code>H5F_FILE_SPACE_ALL_PERSIST</code>.
+        It also sets the free-space section threshold to <code>10</code>, 
+        which means that the library’s free-space managers will track only 
+        free-space sections whose size is >= 10 for the file.
+<dir><pre>
+H5Pset_file_space(fcpl, H5F_FILE_SPACE_ALL_PERSIST, (hsize_t)10);
+</pre></dir>
+    <p>
+
+    <dd>The second example sets the file space management strategy for the
+        file associated with <code>fcpl</code> to 
+        <code>H5F_FILE_SPACE_VFD</code>.  It does not change the free-space 
+        section threshold in use for the file.
+<dir><pre>
+H5Pset_file_space(fcpl, H5F_FILE_SPACE_VFD, (hsize_t)0);
+</pre></dir>
+  <p>
+
+
+<!--__ *** FORTRAN90 INTERFACE  **********************************  -->
+<!--__ When the Fortran90 interface is complete, replace this       -->
+<!--__ section with the Fortran90 subroutine description.           -->
+<!--__                                                              -->
+<!--__ See the file h5fortran_f_insert.htm for a template and       -->
+<!--__ instructions.                                                -->
+<!--__ ***********************************************************  -->
+
+
+  <p>
+  <dt><strong>See Also:</strong>
+    <dd><a href="../RM/RM_H5P.html#Property-GetFileSpace">
+        <code>H5Pget_file_space</code></a>
+        <p>
+
+<!--
+        <a href="../html/RM/H5function.html#H5F_file_space_type_t">
+        <code>H5F_file_space_type_t</code></a>
+        <p>
+-->
+
+        <a href="../RM/Tools.html#Tools-Repack"><code>h5repack</code></a>
+        <p>
+        <a href="../RM/Tools.html#Tools-Dump"><code>h5dump</code></a>
+        <p>
+        <a href="../RM/Tools.html#Tools-Stat"><code>h5stat</code></a>
+        <p>
+        <a href="../Advanced/FileSpaceManagement/FileSpaceManagement.pdf">
+           <cite>HDF5 File Space Management</cite></a>
+
+  <p>
+  <dt><strong>History:</strong>
+    <dd><table width="90%">
+        <tr>
+          <td valign="top" align="left" width="10%">
+            <strong>Release</strong>    </td>
+          <td valign="top" align="left">
+            <strong>Change</strong></td>
+        </tr>
+        <tr>
+          <td valign="top">1.10.0</td>
+          <td valign="top">
+            C function introduced in this release.</td>
+        </tr>
+<!--
+        <tr>
+          <td valign="top">*.**.**</td>
+          <td valign="top">
+            Fortran90 subroutine introduced in this release.</td>
+        </tr>
+-->
+        </table>
+
+</dl>
+
+
diff --git a/html/RM/H5P/H5Pset_istore_k.htm b/html/RM/H5P/H5Pset_istore_k.htm
index 23e777d..2378aba 100644
--- a/html/RM/H5P/H5Pset_istore_k.htm
+++ b/html/RM/H5P/H5Pset_istore_k.htm
@@ -50,11 +50,11 @@
             or have an average rank of 1.5 times the value of 
             <code>ik</code>.
 	    <p>
- 	    The HDF5 library uses <code>(ik*2)</code> as the maximum # of entries before splitting a
- 	    B-tree node.
- 	    Since only 2 bytes are used in storing # of entries for a B-tree node in an HDF5 file,
- 	    <code>(ik*2)</code> cannot exceed <code>65536</code>.
- 	    The default value for <code>ik</code> is <code>32</code>.
+	    The HDF5 library uses <code>(ik*2)</code> as the maximum # of entries before splitting a
+	    B-tree node.  
+	    Since only 2 bytes are used in storing # of entries for a B-tree node in an HDF5 file,
+	    <code>(ik*2)</code> cannot exceed <code>65536</code>.
+	    The default value for <code>ik</code> is <code>32</code>. 
   <p>
   <dt><strong>Parameters:</strong>
     <dd><table>
diff --git a/html/RM/H5P/H5Pset_libver_bounds.htm b/html/RM/H5P/H5Pset_libver_bounds.htm
index 580f895..5c9c27b 100644
--- a/html/RM/H5P/H5Pset_libver_bounds.htm
+++ b/html/RM/H5P/H5Pset_libver_bounds.htm
@@ -22,36 +22,38 @@
 <!-- HEADER RIGHT "H5Pset_libver_bounds" -->
 <hr>
 <dl>
-
-  <dt><div align=right><font color=999999 size=-1><i>
-      Last modified: 7 January 2011
-      </i></font></div>
-
   <dt><strong>Name:</strong> <a name="Property-SetLibverBounds">H5Pset_libver_bounds</a>
   <dt><strong>Signature:</strong>
     <dd><em>herr_t</em> <code>H5Pset_libver_bounds</code>(
             <em>hid_t</em> <code>fapl_id</code>,
-            <em>H5F_libver_t</em> <code>libver_low</code>,
-            <em>H5F_libver_t</em> <code>libver_high</code>
+            <em>H5F_libver_t</em> <code>low</code>,
+            <em>H5F_libver_t</em> <code>high</code>
     )
+
+<!--                           --NOTICE--                            -->
+<!--         H5Pset_libver_bounds and H5Pget_libver_bounds           -->
+<!--                                                                 -->
+<!-- H5F_LIBVER_18 has been added in 1.8 and 1.8.6+, but not yet     -->
+<!-- in the trunk.  These functions are therefore out of sync with   -->
+<!-- the 1.8 branches.                                               -->
+<!--                                                                 -->
+<!-- Any changes will need to made independently until H5F_LIBVER_18 -->
+<!-- has been added to the trunk.                                    -->
+<!--                                                                 -->
+<!--                           --NOTICE--                            -->
+
   <p>
   <dt><strong>Purpose:</strong>
-    <dd>Sets bounds on library versions, and indirectly format versions, 
-        to be used when creating objects.
+    <dd>Sets bounds on library versions, and indirectly format versions, to be used 
+        when creating objects.
   <p>
   <dt><strong>Description:</strong>
-    <dd><code>H5Pset_libver_bounds</code> controls the versions of the object 
-        formats that will be used when creating objects in a file.  
-        The object format versions are determined indirectly from the 
-        HDF5 Library versions specified in the call.
+    <dd><code>H5Pset_libver_bounds</code> controls the versions of the object formats
+        that will be used when creating objects in a file.  The object format versions 
+        are determined indirectly from the HDF5 Library versions specified in the call.
         <p>
         This property is set in the file access property list specified
         by <code>fapl_id</code>. 
-        <p>
-        When bounds have been set through an <code>H5Pset_libver_bounds</code>
-        call, a function that creates an object will fail if the object 
-        cannot be created within the boundaries set in
-        <code>libver_low</code> and <code>libver_high</code>.
   <p>
   <dt><strong>Parameters:</strong>
     <dd><table>
@@ -61,84 +63,62 @@
         <td valign="top">IN: File access property list identifier
         </td></tr>
       <tr>
-        <td valign="top"><em>H5F_libver_t</em> <code>libver_low</code>
+        <td valign="top"><em>H5F_libver_t</em> <code>low</code>    
         </td>
-        <td valign="top">IN: The earliest version of the library that 
-            will be used for writing objects, indirectly specifying 
-            the earliest object format version that can be used when 
-            creating objects in the file.
-            <p>
-            Valid values of <code>libver_low</code> are as follows:
-            <table border="0">
-              <tr valign="top"><td>    </td><td>
-                  <code>H5F_LIBVER_EARLIEST</code>   <i>(Default)</i>
-              </td></tr><tr valign="top"><td> </td><td>
-                <code>H5F_LIBVER_18</code>
-              </td></tr><tr valign="top"><td> </td><td>
-                <code>H5F_LIBVER_LATEST</code>
-              </td></tr>
-            </table>
+        <td valign="top">IN: The earliest version of the library that will be used
+            for writing objects.  The library version indirectly specifies the earliest object 
+            format version that can be used when creating objects in the file.
             <p>
+            Currently, <code>low</code> must be one of two pre-defined values:
             <p>
-            Setting <code>libver_low</code> to <code>H5F_LIBVER_EARLIEST</code> 
-            will result in objects being created using the 
-            <em>earliest possible</em> format for each object. 
+            Setting <code>low</code> to <code>H5F_LIBVER_EARLIEST</code> will result in 
+            objects being created using the <em>earliest possible</em> format 
+            for each object. 
             Note that <em>earliest possible</em> is different from 
             <em>earliest</em>, as some features introduced in library versions
             later than 1.0.0 resulted in updates to object formats.  
-            With <code>libver_low</code>=<code>H5F_LIBVER_EARLIEST</code>, 
+            With <code>low</code>=<code>H5F_LIBVER_EARLIEST</code>, 
             if the application creates an object that requires a feature introduced
             in library versions later than 1.0.0, the earliest possible version
             that supports the requested feature will be used. 
             <p>
-            Setting <code>libver_low</code> to <code>H5F_LIBVER_LATEST</code> 
-            will result in objects being created using the 
-            <em>latest available</em> format for each object.   
-            This setting means that objects will be created with the latest 
-            format versions available (within the range of library versions 
-            specified in the call), and can take advantage of the latest 
-            features and performance enhancements.
+            The upper bound
+            on the range of possible library versions used to create the object
+            is controlled by the <code>high</code> parameter.
+            <p>
+            This is the default behavior of the library if 
+            <code>H5Pset_libver_bounds</code> is not called.
+            <p>
+            Setting <code>low</code> to <code>H5F_LIBVER_LATEST</code> will result in 
+            objects being created using the <em>latest available</em> format for each object.   
+            This setting means that objects will be created with the latest format versions 
+            available (within the range of library versions specified in the call),
+            and can take advantage of the latest features and performance enhancements.
+            
             Objects written with the <code>H5F_LIBVER_LATEST</code> setting for 
-            <code>libver_low</code> may be accessible to a smaller range of 
-            library versions than would be the case if the 
-            <code>H5F_LIBVER_EARLIEST</code> value had been used.
+            <code>low</code> may be accessible to a smaller range of library versions 
+            than would be the case if the <code>H5F_LIBVER_EARLIEST</code> value had been used.
 <!-- NEW PAGE -->
             <p>
-            Setting <code>libver_low</code> to the intermediate value
-            <code>H5F_LIBVER_18</code> specifies that created or modifed objects 
-            must be readable by the HDF5 Release 1.8 series 
-            but do not need to be readable by earlier versions.
-            <p />
+            The upper bound
+            on the range of possible library versions used to create the object
+            is controlled by the <code>high</code> parameter.
+            <p>
         </td></tr>
       <tr>
-        <td valign="top"><em>H5F_libver_t</em> <code>libver_high</code>    
+        <td valign="top"><em>H5F_libver_t</em> <code>high</code>    
         </td>
         <td valign="top">IN: The latest version of the library that will be used
-            for writing objects, indirectly specifying the latest object format 
-            version that can be used when creating objects in the file.
-            <p>
-            Valid values of <code>libver_high</code> are as follows:
-            <table border="0">
-              <tr valign="top"><td>    </td><td>
-                <code>H5F_LIBVER_18</code>
-              </td></tr><tr valign="top"><td> </td><td>
-                <code>H5F_LIBVER_LATEST</code>   <i>(Default)</i>
-              </td></tr>
-            </table>
+            for writing objects.  The library version indirectly specifies the latest object 
+            format version that can be used when creating objects in the file.
             <p>
-            <code>H5F_LIBVER_18</code> specifies that objects may be
-            created in a format used by releases up to and including the
-            HDF5 Release 1.8 series. 
-            Object formats introduced in later releases may not be used.
-            <p>
-            <code>H5F_LIBVER_LATEST</code> specifies that objects may be
-            created in the latest format available; there is no requirement
-            that earlier versions of the HDF5 library be able to read all
-            objects in the file.
+            Currently, <code>high</code> must be set to the pre-defined value 
+            <code>H5F_LIBVER_LATEST</code>.   <code>H5F_LIBVER_LATEST</code> corresponds
+            to the version of the HDF5 Library in use.
+            <br>
         </td></tr>
     </table>
-
-  <p />
+  <p>
   <dt><strong>Returns:</strong>
     <dd>Returns a non-negative value if successful;
         otherwise returns a negative value.
@@ -147,7 +127,8 @@
     <dd><pre>
 SUBROUTINE h5pset_libver_bounds_f(fapl_id, low, high, hdferr)
   IMPLICIT NONE
-  INTEGER(HID_T), INTENT(IN) :: fapl_id ! File access property list identifier
+  INTEGER(HID_T), INTENT(IN) :: fapl_id 
+                             ! File access property list identifier
   INTEGER, INTENT(IN) :: low ! The earliest version of the library that 
                              ! will be used for writing objects.
                              ! Currently, low must be either:
@@ -176,11 +157,6 @@ END SUBROUTINE h5pset_libver_bounds_f
           <td valign="top">1.8.0</td>
           <td valign="top">
             Function introduced in this release.</td></tr>
-        <tr>
-          <td valign="top">1.8.6</td>
-          <td valign="top">
-            <code>H5F_LIBVER_18</code> version boundary setting added 
-            in this release.</td></tr>
     </table>
 </dl>
 
diff --git a/html/RM/H5P/H5Pset_link_creation_order.htm b/html/RM/H5P/H5Pset_link_creation_order.htm
index 2de1f65..71d671e 100644
--- a/html/RM/H5P/H5Pset_link_creation_order.htm
+++ b/html/RM/H5P/H5Pset_link_creation_order.htm
@@ -102,7 +102,7 @@ SUBROUTINE h5pset_link_creation_order_f(gcpl_id, crt_order_flags, hdferr)
                                          !   H5P_CRT_ORDER_INDEXED_F
   INTEGER, INTENT(OUT) :: hdferr         ! Error code
                                          ! 0 on success and -1 on failure
-END SUBROUTINE h5pset_link_creation_order_f  
+END SUBROUTINE h5pset_link_creation_order_f
     </pre></dd>
 
   <p>
diff --git a/html/RM/H5P/H5Pset_link_phase_change.htm b/html/RM/H5P/H5Pset_link_phase_change.htm
index 291394d..d5e8188 100644
--- a/html/RM/H5P/H5Pset_link_phase_change.htm
+++ b/html/RM/H5P/H5Pset_link_phase_change.htm
@@ -84,9 +84,9 @@
 SUBROUTINE h5pset_link_phase_change_f(gcpl_id, max_compact, min_dense, hdferr)
   IMPLICIT NONE
   INTEGER(HID_T), INTENT(IN) :: gcpl_id ! Group creation property list id
-  INTEGER, INTENT(IN) :: max_compact    ! Maximum number of attributes to be 
+  INTEGER, INTENT(IN) :: max_compact    ! Maximum number of attributes to be  
                                         ! stored in compact storage
-  INTEGER, INTENT(IN) :: min_dense      ! Minimum number of attributes to be 
+  INTEGER, INTENT(IN) :: min_dense      ! Minimum number of attributes to be  
                                         ! stored in dense storage
   INTEGER, INTENT(OUT) :: hdferr        ! Error code 
                                         ! 0 on success and -1 on failure
diff --git a/html/RM/H5P/H5Pset_local_heap_size_hint.htm b/html/RM/H5P/H5Pset_local_heap_size_hint.htm
index 5507d62..ad76868 100644
--- a/html/RM/H5P/H5Pset_local_heap_size_hint.htm
+++ b/html/RM/H5P/H5Pset_local_heap_size_hint.htm
@@ -114,17 +114,8 @@
     <dd>Returns a non-negative value if successful;
         otherwise returns a negative value.
   <p>
-  <dt><strong>Fortran90 Interface:</strong> h5pset_local_heap_size_hint_f
-    <dd>
-    <pre>
-SUBROUTINE h5pset_local_heap_size_hint_f(gcpl_id, size_hint, hdferr) 
-  IMPLICIT NONE
-  INTEGER(HID_T), INTENT(IN) :: gcpl_id    ! Group creation property list id
-  INTEGER(SIZE_T), INTENT(IN) :: size_hint ! Hint for size of local heap
-  INTEGER, INTENT(OUT) :: hdferr           ! Error code 
-                                           ! 0 on success and -1 on failure
-END SUBROUTINE h5pset_local_heap_size_hint_f  
-    </pre>
+  <dt><strong>Fortran90 Interface:</strong> <!-- h5pset_local_heap_size_hint_f -->
+    <dd>None.
   <p>
   <dt><strong>History:</strong>
     <dd><table width="90%">
diff --git a/html/RM/H5P/H5Pset_mdc_config.htm b/html/RM/H5P/H5Pset_mdc_config.htm
index 0ab0c72..eaf49ac 100644
--- a/html/RM/H5P/H5Pset_mdc_config.htm
+++ b/html/RM/H5P/H5Pset_mdc_config.htm
@@ -213,8 +213,8 @@
               a larger value is needed -- see the overview of the metadata
               cache in the 
               “<a href="../Advanced/MetadataCache/index.html">
-              Metadata Caching in HDF5</a>” section of the 
-              <cite>HDF5 User’s Guide</cite> for details.</td></tr>
+              Metadata Caching in HDF5</a>” section of the 
+              <cite>HDF5 User’s Guide</cite> for details.</td></tr>
         <tr>
 		    <td valign="top"><em>size_t</em> <code>max_size</code>
 			      </td>
diff --git a/html/RM/H5P/H5Pset_sym_k.htm b/html/RM/H5P/H5Pset_sym_k.htm
index 4148501..8a6c53d 100644
--- a/html/RM/H5P/H5Pset_sym_k.htm
+++ b/html/RM/H5P/H5Pset_sym_k.htm
@@ -64,8 +64,7 @@
             When symbols are inserted randomly into a group, the group's
             symbol table nodes are 75% full on average.  That is, they
             contain 1.5 times the number of symbols specified by 
-	    <code>lk</code>.  The default value for <code>lk</code> is <code>4</code>.
-
+            <code>lk</code>.  The default value for <code>lk</code> is <code>4</code>.
   <p>
   <dt><strong>Parameters:</strong>
     <dd><table>
diff --git a/html/RM/H5R/H5Rget_name.htm b/html/RM/H5R/H5Rget_name.htm
index 03c7929..5f86b75 100644
--- a/html/RM/H5R/H5Rget_name.htm
+++ b/html/RM/H5R/H5Rget_name.htm
@@ -134,6 +134,7 @@
 
         <?php include("H5R/h5rget_name_object_f_F90.htm"); ?>
 
+    <p> 
     <p><strong>To get name of a region reference:</strong> h5rget_name_region_f
     <br>
 
diff --git a/html/RM/H5R/H5Rget_region-before.htm b/html/RM/H5R/H5Rget_region-before.htm
new file mode 100644
index 0000000..5c2f182
--- /dev/null
+++ b/html/RM/H5R/H5Rget_region-before.htm
@@ -0,0 +1,81 @@
+
+
+<!--
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+  * Copyright by The HDF Group.                                               *
+  * Copyright by the Board of Trustees of the University of Illinois.         *
+  * All rights reserved.                                                      *
+  *                                                                           *
+  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+  * terms governing use, modification, and redistribution, is contained in    *
+  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+  * of the source code distribution tree; Copyright.html can be found at the  *
+  * root level of an installed copy of the electronic HDF5 document set and   *
+  * is linked from the top-level documents page.  It can also be found at     *
+  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * access to either file, you may request a copy from help at hdfgroup.org.     *
+  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ -->
+
+
+<!-- NEW PAGE -->
+<!-- HEADER RIGHT "H5Rget_region" -->
+<hr>
+<dl>
+<dt><strong>Name:</strong> <a name="Reference-GetRegion">H5Rget_region</a>
+<dt><strong>Signature:</strong>
+    <dd><em>hid_t</em> <code>H5Rget_region</code>(<em>hid_t</em> <code>dataset</code>,
+    <em>H5R_type_t</em> <code>ref_type</code>,
+    <em>void *</em><code>ref</code>
+    )
+<dt><strong>Purpose:</strong>
+    <dd>Retrieves a dataspace with the specified region selected.
+<dt><strong>Description:</strong>
+    <dd>Given a reference to an object <code>ref</code>, 
+        <code>H5Rget_region</code> creates a copy of the dataspace 
+        of the dataset pointed to and defines a selection in the copy 
+        which is the region pointed to.
+        <p>
+        The parameter <code>ref_type</code> specifies the reference type
+        of <code>ref</code>. 
+        <code>ref_type</code> may contain the following value:
+        <ul>
+        <li><code>H5R_DATASET_REGION</code>  (<code>1</code>)
+        </ul>
+<dt><strong>Parameters:</strong>
+    <ul><table>
+        <tr>
+		    <td valign="top"><em>hid_t</em> <code>dataset</code></td>
+            <td valign="top">IN: Dataset containing reference object.</td></tr>
+        <tr>
+		    <td valign="top"><em>H5R_type_t</em> <code>ref_type    </code></td>
+            <td valign="top">IN: The reference type of <code>ref</code>.</td></tr>
+        <tr>
+		    <td valign="top"><em>void *</em><code>ref</code></td>
+            <td valign="top">IN: Reference to open.</td></tr>
+    </table></ul>
+<dt><strong>Returns:</strong>
+    <dd>Returns a valid identifier if successful;
+        otherwise returns a negative value.
+<dt><strong>Fortran90 Interface:</strong> h5rget_region_f
+    <dd>
+	<pre>
+SUBROUTINE h5rget_region_f(dset_id, ref, space_id, hdferr) 
+  IMPLICIT NONE
+  INTEGER(HID_T), INTENT(IN) :: dset_id       ! Dataset identifier 
+  TYPE(hdset_reg_ref_t_f), INTENT(IN) :: ref  ! Dataset region reference 
+  INTEGER(HID_T), INTENT(OUT) :: space_id     ! Space identifier 
+  INTEGER, INTENT(OUT) :: hdferr              ! Error code 
+                                              ! 0 on success and -1 on failure
+ 
+END SUBROUTINE h5rget_region_f
+	</pre>		
+		
+		<!--<dt><strong>Non-C API(s):</strong>
+    	<dd>
+        
+        <img src="Graphics/Java.gif"> 
+        <img src="Graphics/C++.gif">
+        -->
+</dl>
+
diff --git a/html/RM/H5S/H5Screate.htm b/html/RM/H5S/H5Screate.htm
index 0b24505..4601e51 100644
--- a/html/RM/H5S/H5Screate.htm
+++ b/html/RM/H5S/H5Screate.htm
@@ -92,7 +92,7 @@ SUBROUTINE h5screate_f(classtype, space_id, hdferr)
                                           ! are: 
                                           !    H5S_SCALAR_F 
                                           !    H5S_SIMPLE_F 
-                                          !    H5S_NULL_F (Not yet implemented)
+                                          !    H5S_NULL_F
   INTEGER(HID_T), INTENT(OUT) :: space_id ! Dataspace identifier 
   INTEGER, INTENT(OUT) :: hdferr          ! Error code
                                           ! 0 on success and -1 on failure
diff --git a/html/RM/H5S/H5Sdecode.htm b/html/RM/H5S/H5Sdecode.htm
index 7897fbc..45d259d 100644
--- a/html/RM/H5S/H5Sdecode.htm
+++ b/html/RM/H5S/H5Sdecode.htm
@@ -52,17 +52,5 @@
 <dt><strong>Returns:</strong>
     <dd>Returns an object ID(non-negative) if successful; 
       otherwise returns a negative value.
-<dt><strong>Fortran90 Interface:</strong> h5sdecode_f
-    <dd>
-	<pre>
-SUBROUTINE h5sdecode_f(buf, obj_id, hdferr)
-  IMPLICIT NONE
-  CHARACTER(LEN=*), INTENT(IN) :: buf   ! Buffer of data space object to 
-                                        ! be decoded.
-  INTEGER(HID_T), INTENT(OUT) :: obj_id ! Object ID
-  INTEGER, INTENT(OUT) :: hdferr        ! Error code
-                                        ! 0 on success and -1 on failure
-END SUBROUTINE h5sdecode_f
-	</pre>	
 </dl>
 
diff --git a/html/RM/H5S/H5Sencode.htm b/html/RM/H5S/H5Sencode.htm
index be92098..8674084 100644
--- a/html/RM/H5S/H5Sencode.htm
+++ b/html/RM/H5S/H5Sencode.htm
@@ -68,18 +68,5 @@
 <dt><strong>Returns:</strong>
     <dd>Returns a non-negative value if successful;
         otherwise returns a negative value.
-<dt><strong>Fortran90 Interface:</strong> h5sencode_f
-    <dd>
-	<pre>
-SUBROUTINE h5sencode_f(obj_id, buf, nalloc, hdferr)
-  IMPLICIT NONE
-  INTEGER(HID_T), INTENT(IN) :: obj_id ! Identifier of the object to be encoded
-  CHARACTER(LEN=*), INTENT(OUT) :: buf ! Buffer of object to be encoded into
-  INTEGER(SIZE_T), INTENT(INOUT) :: nalloc 
-                                       ! Size of the allocated buffer
-  INTEGER, INTENT(OUT) :: hdferr       ! Error code
-                                       ! 0 on success and -1 on failure
-END SUBROUTINE h5sencode_f
-	</pre>	
 </dl>
 
diff --git a/html/RM/H5S/H5Sextent_equal.htm b/html/RM/H5S/H5Sextent_equal.htm
index 9a5b651..a539285 100644
--- a/html/RM/H5S/H5Sextent_equal.htm
+++ b/html/RM/H5S/H5Sextent_equal.htm
@@ -63,18 +63,5 @@
 <dt><strong>Returns:</strong>
     <dd>Returns <code>TRUE</code> if equal, <code>FALSE</code> 
       if unequal, if successful; otherwise returns a negative value.
-
-<dt><strong>Fortran90 Interface:</strong> h5sextent_equal_f
-    <dd>
-	<pre>
-SUBROUTINE h5sextent_equal_f(space1_id, space2_id, equal, hdferr)
-  IMPLICIT NONE
-  INTEGER(HID_T), INTENT(IN) :: space1_id ! First dataspace identifier
-  INTEGER(HID_T), INTENT(IN) :: space2_id ! Second dataspace identifier
-  LOGICAL, INTENT(OUT) :: Equal           ! .TRUE. if equal, .FALSE. if unequal
-  INTEGER, INTENT(OUT) :: hdferr          ! Error code
-                                          ! 0 on success and -1 on failure 
-END SUBROUTINE h5sextent_equal_f 
-	</pre>		
 </dl>
 
diff --git a/html/RM/H5S/H5Sset_extent_simple.htm b/html/RM/H5S/H5Sset_extent_simple.htm
index da1fe65..70a320a 100644
--- a/html/RM/H5S/H5Sset_extent_simple.htm
+++ b/html/RM/H5S/H5Sset_extent_simple.htm
@@ -106,3 +106,4 @@ END SUBROUTINE h5sset_extent_simple_f
 
 </dl>
 
+
diff --git a/html/RM/H5T/H5Tcommit.htm b/html/RM/H5T/H5Tcommit.htm
index b13f902..c47cfe4 100644
--- a/html/RM/H5T/H5Tcommit.htm
+++ b/html/RM/H5T/H5Tcommit.htm
@@ -101,24 +101,25 @@
       </dir>
       
   <p>
-  <dt><strong>Fortran90 Interface:</strong> h5tcommit_f
+  <dt><strong>Fortran90 Interface:</strong>  h5tcommit_f
     <dd><pre>
 SUBROUTINE h5tcommit_f(loc_id, name, type_id, hdferr, &
                        lcpl_id, tcpl_id, tapl_id ) 
-  IMPLICIT NONE
-  INTEGER(HID_T), INTENT(IN) :: loc_id  ! File or group identifier 
+  IMPLICIT NONE            
+  INTEGER(HID_T), INTENT(IN) :: loc_id  ! File or group identifier
   CHARACTER(LEN=*), INTENT(IN) :: name  ! Datatype name within file or group
   INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier 
   INTEGER, INTENT(OUT) :: hdferr        ! Error code
                                         ! 0 on success and -1 on failure
-  INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lcpl_id 
+  INTEGER(HID_T), OPTIONAL, INTENT(IN) :: lcpl_id  
                                         ! Link creation property list
-  INTEGER(HID_T), OPTIONAL, INTENT(IN) :: tcpl_id 
+  INTEGER(HID_T), OPTIONAL, INTENT(IN) :: tcpl_id  
                                         ! Datatype creation property list
   INTEGER(HID_T), OPTIONAL, INTENT(IN) :: tapl_id 
                                         ! Datatype access property list
-END SUBROUTINE h5tcommit_f
+END SUBROUTINE h5tcommit_f                  
     </pre></dd>
+
   <p>
   <dt><strong>History:</strong>
     <dd><table width="90%">
diff --git a/html/RM/H5T/H5Tcommit1.htm b/html/RM/H5T/H5Tcommit1.htm
index cd5c4f0..714c255 100644
--- a/html/RM/H5T/H5Tcommit1.htm
+++ b/html/RM/H5T/H5Tcommit1.htm
@@ -86,8 +86,18 @@
     <dd>Returns a non-negative value if successful;
         otherwise returns a negative value.
 <p>
-<dt><strong>Fortran90 Interface:</strong>  See listing under <a href="RM_H5T.html#Datatype-Commit"><code>H5Tcommit</code></a>.
-    <dd>	
+<dt><strong>Fortran90 Interface:</strong> h5tcommit_f
+    <dd>
+	<pre>
+SUBROUTINE h5tcommit_f(loc_id, name, type_id, hdferr) 
+  IMPLICIT NONE
+  INTEGER(HID_T), INTENT(IN) :: loc_id  ! File or group identifier 
+  CHARACTER(LEN=*), INTENT(IN) :: name  ! Datatype name within file or group
+  INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier 
+  INTEGER, INTENT(OUT) :: hdferr        ! Error code
+                                        ! 0 on success and -1 on failure
+END SUBROUTINE h5tcommit_f
+	</pre>		
 		
 <p>
 <dt><strong>History:</strong>
diff --git a/html/RM/H5T/H5Tcommit2.htm b/html/RM/H5T/H5Tcommit2.htm
index a9a2c86..3756635 100644
--- a/html/RM/H5T/H5Tcommit2.htm
+++ b/html/RM/H5T/H5Tcommit2.htm
@@ -24,7 +24,7 @@
 <dl>
 
   <dt><div align=right><font color=999999 size=-1><i>
-      Last modified: 3 May 2011
+      Last modified: 20 March 2012
       </i></font></div>
 
   <dt><strong>Name:</strong> <a name="Datatype-Commit2">H5Tcommit2</a>
@@ -37,14 +37,24 @@
             <em>hid_t</em> <code>tcpl_id</code>, 
             <em>hid_t</em> <code>tapl_id</code>
     )
+
   <p>
   <dt><strong>Purpose:</strong>
     <dd>Commits a transient datatype, linking it into the file 
-        and creating a new named datatype.
+        and creating a new committed datatype.
+
+  <p>
+  <dt><strong>Motivation:</strong>
+    <dd>Committed datatypes can be used 
+        to save space in a file where many datasets or attributes 
+        use the same datatype or
+        to avoid defining a complex compound datatype more than once.
+        Committed datatypes can also be used to ensure that 
+        multiple instances of the same datatype are truly identical.
   <p>
   <dt><strong>Description:</strong>
     <dd><code>H5Tcommit2</code> saves a transient datatype 
-        as an immutable named datatype in a file.
+        as an immutable committed datatype in a file.
 	The datatype specified by <code>dtype_id</code>
 	is committed to the file 
 	with the name <code>name</code> at the location 
@@ -60,7 +70,7 @@
 	newly-commited datatype.
         <p>
         The link creation property list, <code>lcpl_id</code>,
-        governs creation of the link(s) by which the new named datatype
+        governs creation of the link(s) by which the new committed datatype
         is accessed and the creation of any intermediate groups that 
         may be missing. 
         <p>
@@ -103,6 +113,9 @@ THAT HDF5 WAS MODIFIED IN 1.4.? (1.4.0?) TO NOT ACCEPT 'UNUSABLE' DTYPEs.
         a compound datatype with no fields or 
         an enumerated datatype with no members.
 -->
+        <p>
+        Committed datatypes are sometimes referred to as named datatypes.
+
   <p>
   <dt><strong>Parameters:</strong>
     <dd><table>
diff --git a/html/RM/H5T/H5Tcommit_anon.htm b/html/RM/H5T/H5Tcommit_anon.htm
index 3d8bca4..04407df 100644
--- a/html/RM/H5T/H5Tcommit_anon.htm
+++ b/html/RM/H5T/H5Tcommit_anon.htm
@@ -143,6 +143,7 @@ END SUBROUTINE h5tcommit_anon_f
         <br>
         <a href="RM_H5T.html#Datatype-Commit"><code>H5Tcommit</code></a> 
 
+        <p>
 <dt><strong>History:</strong>
     <dd><table width="90%">
         <tr>
diff --git a/html/RM/H5T/H5Tcommitted.htm b/html/RM/H5T/H5Tcommitted.htm
index 57fd1a5..f3e81e1 100644
--- a/html/RM/H5T/H5Tcommitted.htm
+++ b/html/RM/H5T/H5Tcommitted.htm
@@ -51,14 +51,10 @@
 <dt><strong>Fortran90 Interface:</strong> h5tcommitted_f
     <dd>
 	<pre>
-SUBROUTINE h5tcommitted_f(dtype_id, committed, hdferr)
+SUBROUTINE h5tcommitted_f(type_id, hdferr) 
   IMPLICIT NONE
-  INTEGER(HID_T), INTENT(IN) :: dtype_id  
-                                    ! A datatype identifier
-  LOGICAL, INTENT(OUT) :: committed ! .TRUE., if the datatype committed
-                                    ! .FALSE., if the datatype not committed.
-  INTEGER, INTENT(OUT) :: hdferr    ! Error code
-                                    ! 0 on success and -1 on failure
+  INTEGER(HID_T), INTENT(IN) :: type_id ! Datatype identifier 
+  INTEGER, INTENT(OUT) :: hdferr        ! Error code
 END SUBROUTINE h5tcommitted_f
 	</pre>		
 		
diff --git a/html/RM/H5T/H5Tget_create_plist.htm b/html/RM/H5T/H5Tget_create_plist.htm
index 269d16e..cef9c5f 100644
--- a/html/RM/H5T/H5Tget_create_plist.htm
+++ b/html/RM/H5T/H5Tget_create_plist.htm
@@ -54,16 +54,14 @@
     <dd>Returns a datatype property list identifier if successful;
         otherwise returns a negative value.
   <p>
-  <dt><strong>Fortran90 Interface:</strong> h5tget_create_plist_f
+  <dt><strong>Fortran90 Interface:</strong><!--h5tget_create_plist_f--> 
+    <dd>None.
+
+<!--
     <dd><pre>
-SUBROUTINE h5tget_create_plist_f(dtype_id, dtpl_id, hdferr)
-  IMPLICIT NONE
-  INTEGER(HID_T), INTENT(IN) :: dtype_id ! Datatype identifier
-  INTEGER(HID_T), INTENT(OUT) :: dtpl_id ! Datatype property list identifier.
-  INTEGER, INTENT(OUT) :: hdferr         ! Error code:
-                                         ! 0 on success and -1 on failure
-END SUBROUTINE h5tget_create_plist_f 
+  
     </pre></dd>
+-->
   <p>
   <dt><strong>History:</strong>
     <dd><table width="90%">
diff --git a/html/RM/H5T/H5Tget_precision.htm b/html/RM/H5T/H5Tget_precision.htm
index 76d68bd..d6be5fa 100644
--- a/html/RM/H5T/H5Tget_precision.htm
+++ b/html/RM/H5T/H5Tget_precision.htm
@@ -22,31 +22,29 @@
 <!-- HEADER RIGHT "H5Tget_precision" -->
 <hr>
 <dl>
-
-<dt><div align="right"><font color="999999" size="-1"><i>
-    Last modified: 12 August 2011
-    </i></font></div>
-
-<dt><strong>Name:</strong> <a name="Datatype-GetPrecision">H5Tget_precision</a>
-</dt>
-<br />
+
+  <dt><div align="right"><font color="999999" size="-1"><i>
+  Last modified: 29 August 2012</i></font></div>
+
+<dt><strong>Name:</strong> <a name="Datatype-GetPrecision">H5Tget_precision</a>
+<p></p>
 <dt><strong>Signature:</strong>
     <dd><em>size_t </em><code>H5Tget_precision</code>(
         <em>hid_t </em><code>dtype_id</code>
     )
 
-<p>
+<p></p>
 <dt><strong>Purpose:</strong>
     <dd>Returns the precision of an atomic datatype.
 
-<p>
+<p></p>
 <dt><strong>Description:</strong>
     <dd><code>H5Tget_precision</code> returns the precision of an atomic 
         datatype.  The precision is the number of significant bits which, 
         unless padding is present, is 8 times larger than the value returned 
         by <code>H5Tget_size</code>.
 
-<p>
+<p></p>
 <dt><strong>Parameters:</strong>
     <dd><table>
         <tr>
@@ -54,12 +52,12 @@
             <td valign="top">IN: Identifier of datatype to query.</td></tr>
     </table></dd>
 
-<p>
+<p></p>
 <dt><strong>Returns:</strong>
     <dd>Returns the number of significant bits if successful;
         otherwise 0.
 
-<p>
+<p></p>
 <dt><strong>Fortran90 Interface:</strong> h5tget_precision_f
     <dd>
     <pre>
diff --git a/html/RM/H5T/H5Tget_strpad.htm b/html/RM/H5T/H5Tget_strpad.htm
index 6e37201..60e733d 100644
--- a/html/RM/H5T/H5Tget_strpad.htm
+++ b/html/RM/H5T/H5Tget_strpad.htm
@@ -74,7 +74,6 @@ SUBROUTINE h5tget_strpad_f(type_id, strpad, hdferr)
                                   !    Pad with spaces (as FORTRAN does): 
                                   !        H5T_STR_SPACEPAD_F(1)
   INTEGER, INTENT(OUT) :: hdferr  ! Error code
-                                  ! 0 on success and -1 on failure
 END SUBROUTINE h5tget_strpad_f
     </pre>
 
diff --git a/html/RM/H5T/H5Tget_super.htm b/html/RM/H5T/H5Tget_super.htm
index 79de4f5..d15925c 100644
--- a/html/RM/H5T/H5Tget_super.htm
+++ b/html/RM/H5T/H5Tget_super.htm
@@ -74,7 +74,6 @@ SUBROUTINE h5tget_super_f(type_id, base_type_id, hdferr)
   INTEGER(HID_T), INTENT(IN) :: type_id  ! Datatype identifier 
   INTEGER(HID_T), INTENT(OUT) :: type_id ! Base datatype identifier 
   INTEGER, INTENT(OUT) :: hdferr         ! Error code
-                                         ! 0 on success and -1 on failure
 END SUBROUTINE h5tget_super_f
     </pre>
 
diff --git a/html/RM/H5T/H5Tget_tag.htm b/html/RM/H5T/H5Tget_tag.htm
index 9ed3888..a919fbf 100644
--- a/html/RM/H5T/H5Tget_tag.htm
+++ b/html/RM/H5T/H5Tget_tag.htm
@@ -70,7 +70,6 @@ SUBROUTINE h5tget_tag_f(type_id, tag,taglen, hdferr)
                                          ! opaque datatype is to be tagged
   INTEGER, INTENT(OUT) :: taglen         ! Length of tag 
   INTEGER, INTENT(OUT) :: hdferr         ! Error code
-                                         ! 0 on success and -1 on failure
 END SUBROUTINE h5tget_tag_f
     </pre>
 
diff --git a/html/RM/H5T/H5Tinsert.htm b/html/RM/H5T/H5Tinsert.htm
index 0f7bc54..b86805b 100644
--- a/html/RM/H5T/H5Tinsert.htm
+++ b/html/RM/H5T/H5Tinsert.htm
@@ -90,7 +90,6 @@ SUBROUTINE h5tinsert_f(type_id,  name, offset, field_id, hdferr)
   INTEGER(HID_T), INTENT(IN) :: field_id ! Datatype identifier of the 
                                          ! new member
   INTEGER, INTENT(OUT) :: hdferr         ! Error code
-                                         ! 0 on success and -1 on failure
 END SUBROUTINE h5tinsert_f
     </pre>
 
diff --git a/html/RM/H5T/H5Tis_variable_str.htm b/html/RM/H5T/H5Tis_variable_str.htm
index 2d592fb..319779a 100644
--- a/html/RM/H5T/H5Tis_variable_str.htm
+++ b/html/RM/H5T/H5Tis_variable_str.htm
@@ -70,7 +70,6 @@ SUBROUTINE h5tis_variable_str_f(type_id, status, hdferr)
                                           !         variable string
                                           !    .FALSE. otherwise 
   INTEGER, INTENT(OUT) :: hdferr          ! Error code
-                                          ! 0 on success and -1 on failure
 END SUBROUTINE h5tis_variable_str_f
     </pre>
 
diff --git a/html/RM/H5T/H5Topen.htm b/html/RM/H5T/H5Topen.htm
index b65d95a..2c61e9e 100644
--- a/html/RM/H5T/H5Topen.htm
+++ b/html/RM/H5T/H5Topen.htm
@@ -26,8 +26,8 @@
   <dt><div align=right><font color=999999 size=-1><i>
   Last modified: 14 October 2014</i></font></div></dt>
 
-  <dt><strong>Name:</strong> <a name="Datatype-Open">H5Topen</a></dt>
-  <br />
+  <dt><strong>Name:</strong> <a name="Datatype-Open">H5Topen</a>
+  <p></p>
   <dt><strong>Signature:</strong>
     <dd><em>hid_t</em> <code>H5Topen</code>(
         <em>hid_t</em> <code>loc_id</code>,
@@ -39,10 +39,10 @@
         <em>const char *</em> <code>name</code>,
         <em>hid_t</em> <code>tapl_id</code>
     )
-  <p>
+  <p></p>
   <dt><strong>Purpose:</strong>
     <dd>Opens a committed (named) datatype.
-  <p>
+  <p></p>
   <dt><strong>Description:</strong>
     <dd><code>H5Topen</code> is a macro that is mapped to either
       <a href="#Datatype-Open1"><code>H5Topen1</code></a> or
@@ -104,27 +104,24 @@
       released with <code>H5Tclose</code> when the identifier is 
       no longer needed so that resource leaks will not develop.</p>
       
-  <p></p>
-  <dt><strong>Fortran90 Interface:</strong> h5topen_f
+<p></p>
+  <dt><strong>Fortran90 Interface:</strong>  h5gcreate_f</dt>
+    <dd><i><font color=red>
+      Holding this space in case we need to say something about Fortran.
+      <br>
+      Will Fortran subroutine names do anything with the 1s and 2s 
+      of the C functions?
+      </font></i></dd>
+<!--
     <dd><pre>
-SUBROUTINE h5topen_f(loc_id, name, type_id, hdferr, tapl_id)
-  IMPLICIT NONE
-  INTEGER(HID_T), INTENT(IN) :: loc_id   ! File or group identifier 
-  CHARACTER(LEN=*), INTENT(IN) :: name   ! Datatype name within file or group
-  INTEGER(HID_T), INTENT(OUT) :: type_id ! Datatype identifier
-  INTEGER, INTENT(OUT) :: hdferr         ! Error code
-                                         ! 0 on success and -1 on failure
-  INTEGER(HID_T), OPTIONAL, INTENT(IN) :: tapl_id 
-                                         ! Datatype access property list id
-END SUBROUTINE h5topen_f
-    </pre></dd>
+    </pre></dd>
 <!-- NEW PAGE -->
-
+<br />
   <dt><strong>See Also:</a></strong></dt>
     <dd>
     <a href="http://www.hdfgroup.org/HDF5/doc/Advanced/UsingIdentifiers/index.html">
     “Using Identifiers”</a></dd>
-  <br />
+<p></p>
   <dt><strong>History:</strong>
     <dd><table width="90%">
         <tr>
diff --git a/html/RM/H5T/H5Topen1.htm b/html/RM/H5T/H5Topen1.htm
index 9d5dc17..adcc770 100644
--- a/html/RM/H5T/H5Topen1.htm
+++ b/html/RM/H5T/H5Topen1.htm
@@ -59,8 +59,19 @@
     <dd>Returns a named datatype identifier if successful;
         otherwise returns a negative value.
 <p>
-<dt><strong>Fortran90 Interface:</strong> See listing under <a href="RM_H5T.html#Datatype-Open"><code>H5Topen</code></a>.
-    <dd>		
+<dt><strong>Fortran90 Interface:</strong> h5topen_f
+    <dd>
+	<pre>
+SUBROUTINE h5topen_f(loc_id, name, type_id, hdferr) 
+  IMPLICIT NONE
+  INTEGER(HID_T), INTENT(IN) :: loc_id    ! File or group identifier 
+  CHARACTER(LEN=*), INTENT(IN) :: name    ! Datatype name within file or
+                                          ! group
+  INTEGER(HID_T), INTENT(out) :: type_id  ! Datatype identifier 
+  INTEGER, INTENT(OUT) :: hdferr          ! Error code
+                                          ! 0 on success and -1 on failure
+END SUBROUTINE h5topen_f
+	</pre>		
 		
 		<!--<dt><strong>Non-C API(s):</strong>
     	<dd>
diff --git a/html/RM/H5T/H5Topen2.htm b/html/RM/H5T/H5Topen2.htm
index 6973c7f..1e5881a 100644
--- a/html/RM/H5T/H5Topen2.htm
+++ b/html/RM/H5T/H5Topen2.htm
@@ -22,31 +22,30 @@
 <!-- HEADER RIGHT "H5Topen2" -->
 <hr>
 <dl>
-
 <dt><div align=right><font color=999999 size=-1><i>
 Last modified: 14 October 2014</i></font></div></dt>
-
 
-<dt><strong>Name:</strong> <a name="Datatype-Open2">H5Topen2</a>
+<dt><strong>Name:</strong> <a name="Datatype-Open2">H5Topen2</a></dt>
+<br />
 <dt><strong>Signature:</strong>
     <dd><em>hid_t</em> <code>H5Topen2</code>(
         <em>hid_t</em> <code>loc_id</code>,
         <em>const char *</em> <code>name</code>,
         <em>hid_t</em> <code>tapl_id</code>
-    )
-<p>
+    )</dd>
+<br />
 <dt><strong>Purpose:</strong>
     <dd>Opens a committed (named) datatype.
 <p>
 <dt><strong>Description:</strong>
-    <dd><code>H5Topen2</code> opens a committed datatype at the 
-    location specified by <code>loc_id</code> and returns an identifier 
-    for the datatype.  <code>loc_id</code> is either a file or 
-    group identifier.  The identifier should eventually be closed 
-    by calling <code>H5Tclose</code> to release resources.    
-    <p>
-    The committed datatype is opened with the datatype access property list
-    <code>tapl_id</code>.
+    <dd><code>H5Topen2</code> opens a committed datatype at the location
+        specified by <code>loc_id</code> and returns an identifier 
+        for the datatype.  <code>loc_id</code> is either a file or 
+        group identifier.  The identifier should eventually be closed 
+        by calling <code>H5Tclose</code> to release resources.    
+        <p>
+        The committed datatype is opened with the datatype access property list
+        <code>tapl_id</code>.
 <p>
 <dt><strong>Parameters:</strong>
     <ul><table>
@@ -67,10 +66,17 @@ Last modified: 14 October 2014</i></font></div></dt>
     <dd>Returns a committed datatype identifier if successful;
         otherwise returns a negative value.
 <p>
-<dt><strong>Fortran90 Interface:</strong> See listing under 
-<a href="RM_H5T.html#Datatype-Open"><code>H5Topen</code></a>.</dt>
-
-<br />
+<dt><strong>Fortran90 Interface:</strong> <!--h5topen2_f--></dt>
+    <dd> None</dd>
+    <br />
+<!--
+	<pre>
+SUBROUTINE h5topen2_f(                     )
+
+
+END SUBROUTINE h5topen2_f
+-->
+		
 
         <!--<dt><strong>Non-C API(s):</strong>
     	<dd>
@@ -78,8 +84,7 @@ Last modified: 14 October 2014</i></font></div></dt>
         <img src="Graphics/Java.gif"> 
         <img src="Graphics/C++.gif">
         -->
-
-  <dt><strong>See Also:</a></strong></dt>
+<dt><strong>See Also:</a></strong></dt>
     <dd>
     <a href="http://www.hdfgroup.org/HDF5/doc/Advanced/UsingIdentifiers/index.html">
     “Using Identifiers”</a></dd>
diff --git a/html/RM/PredefDTypes.html b/html/RM/PredefDTypes.html
index cbf6f7f..15f3c39 100644
--- a/html/RM/PredefDTypes.html
+++ b/html/RM/PredefDTypes.html
@@ -39,7 +39,8 @@ HDF5/Predefined Datatypes
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -70,12 +71,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
@@ -516,7 +516,8 @@ The following datatypes are predefined in HDF5.
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -547,12 +548,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
diff --git a/html/RM/Properties_ReferenceTable.html b/html/RM/Properties_ReferenceTable.html
new file mode 100644
index 0000000..ba5a52d
--- /dev/null
+++ b/html/RM/Properties_ReferenceTable.html
@@ -0,0 +1,8581 @@
+<html>
+
+<head>
+<meta http-equiv=Content-Type content="text/html; charset=utf-8">
+<meta name=ProgId content=Excel.Sheet>
+<meta name=Generator content="Microsoft Excel 14">
+<link rel=File-List
+href="HDF5%20Properties%20Table%20150204a%20RefTable%20TrialHTML_files/filelist.xml">
+<style>
+<!--table
+	{mso-displayed-decimal-separator:"\.";
+	mso-displayed-thousand-separator:"\,";}
+ at page
+	{margin:1.0in .75in .75in .75in;
+	mso-header-margin:.5in;
+	mso-footer-margin:.5in;
+	mso-page-orientation:landscape;}
+.font0
+	{color:black;
+	font-size:12.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Calibri, sans-serif;
+	mso-font-charset:0;}
+.font5
+	{color:black;
+	font-size:12.0pt;
+	font-weight:700;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Calibri, sans-serif;
+	mso-font-charset:0;}
+.font6
+	{color:black;
+	font-size:10.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font9
+	{color:black;
+	font-size:12.0pt;
+	font-weight:400;
+	font-style:italic;
+	text-decoration:none;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font10
+	{color:red;
+	font-size:12.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Calibri, sans-serif;
+	mso-font-charset:0;}
+.font12
+	{color:windowtext;
+	font-size:12.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font13
+	{color:black;
+	font-size:12.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font15
+	{color:black;
+	font-size:12.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font18
+	{color:#DA9694;
+	font-size:12.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Calibri, sans-serif;
+	mso-font-charset:0;}
+.font19
+	{color:#DA9694;
+	font-size:10.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font21
+	{color:#DA9694;
+	font-size:12.0pt;
+	font-weight:400;
+	font-style:italic;
+	text-decoration:none;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font22
+	{color:#DA9694;
+	font-size:12.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font23
+	{color:windowtext;
+	font-size:10.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font27
+	{color:windowtext;
+	font-size:12.0pt;
+	font-weight:700;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font29
+	{color:black;
+	font-size:10.0pt;
+	font-weight:400;
+	font-style:italic;
+	text-decoration:none;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font30
+	{color:#DA9694;
+	font-size:10.0pt;
+	font-weight:400;
+	font-style:italic;
+	text-decoration:none;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font32
+	{color:red;
+	font-size:10.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font33
+	{color:green;
+	font-size:12.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font35
+	{color:green;
+	font-size:12.0pt;
+	font-weight:700;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font36
+	{color:black;
+	font-size:11.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font37
+	{color:black;
+	font-size:11.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font38
+	{color:black;
+	font-size:11.0pt;
+	font-weight:400;
+	font-style:italic;
+	text-decoration:none;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font39
+	{color:black;
+	font-size:12.0pt;
+	font-weight:700;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font40
+	{color:black;
+	font-size:10.0pt;
+	font-weight:700;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font41
+	{color:black;
+	font-size:12.0pt;
+	font-weight:700;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font42
+	{color:#DA9694;
+	font-size:12.0pt;
+	font-weight:700;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font43
+	{color:#DA9694;
+	font-size:10.0pt;
+	font-weight:700;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font44
+	{color:green;
+	font-size:12.0pt;
+	font-weight:700;
+	font-style:italic;
+	text-decoration:none;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font45
+	{color:green;
+	font-size:12.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font46
+	{color:windowtext;
+	font-size:12.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font47
+	{color:windowtext;
+	font-size:12.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font48
+	{color:black;
+	font-size:12.0pt;
+	font-weight:700;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.font49
+	{color:#DA9694;
+	font-size:12.0pt;
+	font-weight:700;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;}
+.style461
+	{color:blue;
+	font-size:12.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:underline;
+	text-underline-style:single;
+	font-family:Calibri, sans-serif;
+	mso-font-charset:0;
+	mso-style-name:Hyperlink;
+	mso-style-id:8;}
+a:link
+	{color:blue;
+	font-size:12.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:underline;
+	text-underline-style:single;
+	font-family:Calibri, sans-serif;
+	mso-font-charset:0;}
+a:visited
+	{color:purple;
+	font-size:12.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:underline;
+	text-underline-style:single;
+	font-family:Calibri, sans-serif;
+	mso-font-charset:0;}
+.style0
+	{mso-number-format:General;
+	text-align:general;
+	vertical-align:bottom;
+	white-space:nowrap;
+	mso-rotate:0;
+	mso-background-source:auto;
+	mso-pattern:auto;
+	color:black;
+	font-size:12.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Calibri, sans-serif;
+	mso-font-charset:0;
+	border:none;
+	mso-protection:locked visible;
+	mso-style-name:Normal;
+	mso-style-id:0;}
+td
+	{mso-style-parent:style0;
+	padding-top:1px;
+	padding-right:1px;
+	padding-left:1px;
+	mso-ignore:padding;
+	color:black;
+	font-size:12.0pt;
+	font-weight:400;
+	font-style:normal;
+	text-decoration:none;
+	font-family:Calibri, sans-serif;
+	mso-font-charset:0;
+	mso-number-format:General;
+	text-align:general;
+	vertical-align:bottom;
+	border:none;
+	mso-background-source:auto;
+	mso-pattern:auto;
+	mso-protection:locked visible;
+	white-space:nowrap;
+	mso-rotate:0;}
+.xl65
+	{mso-style-parent:style0;
+	font-weight:700;
+	mso-number-format:"\@";
+	text-align:center;
+	vertical-align:top;
+	white-space:normal;}
+.xl66
+	{mso-style-parent:style0;
+	white-space:normal;}
+.xl67
+	{mso-style-parent:style0;
+	vertical-align:top;}
+.xl68
+	{mso-style-parent:style0;
+	vertical-align:top;
+	white-space:normal;}
+.xl69
+	{mso-style-parent:style0;
+	text-align:left;
+	vertical-align:top;}
+.xl70
+	{mso-style-parent:style0;
+	text-align:left;
+	vertical-align:top;
+	white-space:normal;}
+.xl71
+	{mso-style-parent:style0;
+	font-size:10.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;}
+.xl72
+	{mso-style-parent:style0;
+	font-size:10.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	white-space:normal;}
+.xl73
+	{mso-style-parent:style0;
+	font-size:14.0pt;
+	font-weight:700;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;}
+.xl74
+	{mso-style-parent:style0;
+	font-weight:700;
+	mso-number-format:"\@";
+	text-align:left;
+	vertical-align:top;
+	white-space:normal;}
+.xl75
+	{mso-style-parent:style0;
+	font-weight:700;
+	mso-number-format:"\@";
+	text-align:left;
+	vertical-align:top;}
+.xl76
+	{mso-style-parent:style0;
+	font-size:14.0pt;
+	font-weight:700;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	text-align:left;
+	vertical-align:top;}
+.xl77
+	{mso-style-parent:style0;
+	font-weight:700;
+	vertical-align:top;}
+.xl78
+	{mso-style-parent:style0;
+	text-align:left;
+	vertical-align:middle;
+	white-space:normal;}
+.xl79
+	{mso-style-parent:style0;
+	color:windowtext;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	text-align:left;
+	vertical-align:top;
+	white-space:normal;}
+.xl80
+	{mso-style-parent:style0;
+	font-size:10.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	text-align:left;
+	vertical-align:top;}
+.xl81
+	{mso-style-parent:style0;
+	text-align:left;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl82
+	{mso-style-parent:style0;
+	text-align:left;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;
+	white-space:normal;}
+.xl83
+	{mso-style-parent:style0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl84
+	{mso-style-parent:style0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;
+	white-space:normal;}
+.xl85
+	{mso-style-parent:style0;
+	font-size:10.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl86
+	{mso-style-parent:style0;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;
+	white-space:normal;}
+.xl87
+	{mso-style-parent:style0;
+	font-size:10.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	text-align:left;
+	vertical-align:top;
+	white-space:normal;}
+.xl88
+	{mso-style-parent:style0;
+	font-size:10.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;
+	white-space:normal;}
+.xl89
+	{mso-style-parent:style0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:.5pt solid windowtext;
+	border-left:none;}
+.xl90
+	{mso-style-parent:style0;
+	text-align:left;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:.5pt solid windowtext;
+	border-left:none;}
+.xl91
+	{mso-style-parent:style0;
+	font-size:10.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:.5pt solid windowtext;
+	border-left:none;}
+.xl92
+	{mso-style-parent:style0;
+	mso-number-format:"dd\\-mmm";
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl93
+	{mso-style-parent:style0;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl94
+	{mso-style-parent:style0;
+	vertical-align:top;
+	border-top:2.0pt double windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl95
+	{mso-style-parent:style0;
+	text-align:left;
+	vertical-align:top;
+	border-top:2.0pt double windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl96
+	{mso-style-parent:style0;
+	text-align:left;
+	vertical-align:top;
+	border-top:2.0pt double windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;
+	white-space:normal;}
+.xl97
+	{mso-style-parent:style0;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:2.0pt double windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl98
+	{mso-style-parent:style0;
+	border-top:2.0pt double windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;
+	white-space:normal;}
+.xl99
+	{mso-style-parent:style0;
+	vertical-align:top;
+	border-top:2.0pt double windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;
+	white-space:normal;}
+.xl100
+	{mso-style-parent:style0;
+	font-style:italic;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:2.0pt double windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl101
+	{mso-style-parent:style0;
+	font-size:10.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:2.0pt double windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl102
+	{mso-style-parent:style0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:2.0pt double windowtext;
+	border-left:none;}
+.xl103
+	{mso-style-parent:style0;
+	text-align:left;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:2.0pt double windowtext;
+	border-left:none;}
+.xl104
+	{mso-style-parent:style0;
+	font-size:10.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:2.0pt double windowtext;
+	border-left:none;}
+.xl105
+	{mso-style-parent:style0;
+	mso-number-format:"\@";
+	text-align:center;
+	vertical-align:top;
+	white-space:normal;}
+.xl106
+	{mso-style-parent:style461;
+	color:blue;
+	font-size:10.0pt;
+	text-decoration:underline;
+	text-underline-style:single;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;}
+.xl107
+	{mso-style-parent:style461;
+	color:blue;
+	font-size:10.0pt;
+	text-decoration:underline;
+	text-underline-style:single;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl108
+	{mso-style-parent:style0;
+	color:#DA9694;
+	vertical-align:top;}
+.xl109
+	{mso-style-parent:style0;
+	color:#DA9694;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:.5pt solid windowtext;
+	border-left:none;}
+.xl110
+	{mso-style-parent:style0;
+	color:#DA9694;
+	font-size:10.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:.5pt solid windowtext;
+	border-left:none;}
+.xl111
+	{mso-style-parent:style0;
+	color:#DA9694;
+	font-style:italic;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:.5pt solid windowtext;
+	border-left:none;}
+.xl112
+	{mso-style-parent:style0;
+	color:#DA9694;
+	text-align:left;
+	vertical-align:top;}
+.xl113
+	{mso-style-parent:style0;
+	color:#DA9694;
+	vertical-align:top;
+	white-space:normal;}
+.xl114
+	{mso-style-parent:style0;
+	color:#DA9694;
+	font-size:10.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;}
+.xl115
+	{mso-style-parent:style0;
+	color:#DA9694;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl116
+	{mso-style-parent:style0;
+	color:#DA9694;
+	text-align:left;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl117
+	{mso-style-parent:style0;
+	color:#DA9694;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;
+	white-space:normal;}
+.xl118
+	{mso-style-parent:style0;
+	color:#DA9694;
+	font-size:10.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl119
+	{mso-style-parent:style0;
+	color:#DA9694;
+	white-space:normal;}
+.xl120
+	{mso-style-parent:style0;
+	color:#DA9694;
+	font-size:10.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	white-space:normal;}
+.xl121
+	{mso-style-parent:style0;
+	color:#DA9694;
+	text-align:left;
+	vertical-align:top;
+	white-space:normal;}
+.xl122
+	{mso-style-parent:style0;
+	color:windowtext;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;}
+.xl123
+	{mso-style-parent:style0;
+	color:#DA9694;
+	font-style:italic;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl124
+	{mso-style-parent:style461;
+	color:#DA9694;
+	font-size:10.0pt;
+	text-decoration:underline;
+	text-underline-style:single;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl125
+	{mso-style-parent:style0;
+	color:#DA9694;
+	font-style:italic;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;}
+.xl126
+	{mso-style-parent:style0;
+	font-size:10.0pt;
+	text-decoration:underline;
+	text-underline-style:single;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl127
+	{mso-style-parent:style0;
+	font-size:14.0pt;
+	font-weight:700;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl128
+	{mso-style-parent:style0;
+	font-size:14.0pt;
+	font-weight:700;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:2.0pt double windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl129
+	{mso-style-parent:style0;
+	font-size:14.0pt;
+	vertical-align:top;
+	border-top:2.0pt double windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl130
+	{mso-style-parent:style0;
+	font-size:14.0pt;
+	text-align:left;
+	vertical-align:top;
+	border-top:2.0pt double windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl131
+	{mso-style-parent:style0;
+	font-size:14.0pt;
+	vertical-align:top;
+	border-top:2.0pt double windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;
+	white-space:normal;}
+.xl132
+	{mso-style-parent:style0;
+	font-size:14.0pt;
+	text-align:left;
+	vertical-align:top;
+	border-top:2.0pt double windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;
+	white-space:normal;}
+.xl133
+	{mso-style-parent:style0;
+	font-size:14.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:2.0pt double windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl134
+	{mso-style-parent:style0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:2.0pt double windowtext;
+	border-left:none;
+	white-space:normal;}
+.xl135
+	{mso-style-parent:style0;
+	text-align:left;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:2.0pt double windowtext;
+	border-left:none;
+	white-space:normal;}
+.xl136
+	{mso-style-parent:style0;
+	font-size:10.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	text-align:left;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:2.0pt double windowtext;
+	border-left:none;
+	white-space:normal;}
+.xl137
+	{mso-style-parent:style0;
+	color:windowtext;
+	font-size:10.0pt;
+	font-weight:700;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	text-align:left;
+	vertical-align:top;
+	white-space:normal;}
+.xl138
+	{mso-style-parent:style0;
+	color:#DA9694;
+	text-align:left;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:.5pt solid windowtext;
+	border-left:none;
+	white-space:normal;}
+.xl139
+	{mso-style-parent:style0;
+	color:black;
+	text-align:left;
+	vertical-align:top;}
+.xl140
+	{mso-style-parent:style0;
+	color:black;
+	vertical-align:top;}
+.xl141
+	{mso-style-parent:style0;
+	color:black;
+	font-size:10.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;}
+.xl142
+	{mso-style-parent:style0;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;}
+.xl143
+	{mso-style-parent:style0;
+	mso-number-format:"dd\\-mmm";
+	vertical-align:top;
+	border-top:none;
+	border-right:none;
+	border-bottom:.5pt solid windowtext;
+	border-left:none;}
+.xl144
+	{mso-style-parent:style0;
+	text-align:left;
+	vertical-align:top;
+	border-top:none;
+	border-right:none;
+	border-bottom:.5pt solid windowtext;
+	border-left:none;}
+.xl145
+	{mso-style-parent:style0;
+	vertical-align:top;
+	border-top:none;
+	border-right:none;
+	border-bottom:.5pt solid windowtext;
+	border-left:none;}
+.xl146
+	{mso-style-parent:style0;
+	color:black;
+	text-align:left;
+	vertical-align:top;
+	border-top:none;
+	border-right:none;
+	border-bottom:.5pt solid windowtext;
+	border-left:none;}
+.xl147
+	{mso-style-parent:style0;
+	color:black;
+	font-size:10.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:none;
+	border-right:none;
+	border-bottom:.5pt solid windowtext;
+	border-left:none;}
+.xl148
+	{mso-style-parent:style0;
+	color:windowtext;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl149
+	{mso-style-parent:style0;
+	color:windowtext;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	text-align:left;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl150
+	{mso-style-parent:style0;
+	color:windowtext;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;
+	white-space:normal;}
+.xl151
+	{mso-style-parent:style0;
+	color:windowtext;
+	font-size:10.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:.5pt solid windowtext;
+	border-right:none;
+	border-bottom:none;
+	border-left:none;}
+.xl152
+	{mso-style-parent:style461;
+	color:blue;
+	font-size:10.0pt;
+	text-decoration:underline;
+	text-underline-style:single;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:none;
+	border-right:none;
+	border-bottom:.5pt solid windowtext;
+	border-left:none;}
+.xl153
+	{mso-style-parent:style0;
+	vertical-align:top;
+	border-top:none;
+	border-right:none;
+	border-bottom:2.0pt double windowtext;
+	border-left:none;}
+.xl154
+	{mso-style-parent:style0;
+	text-align:left;
+	vertical-align:top;
+	border-top:none;
+	border-right:none;
+	border-bottom:2.0pt double windowtext;
+	border-left:none;}
+.xl155
+	{mso-style-parent:style0;
+	font-size:10.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:none;
+	border-right:none;
+	border-bottom:2.0pt double windowtext;
+	border-left:none;}
+.xl156
+	{mso-style-parent:style0;
+	border-top:none;
+	border-right:none;
+	border-bottom:2.0pt double windowtext;
+	border-left:none;}
+.xl157
+	{mso-style-parent:style0;
+	color:black;
+	vertical-align:top;
+	white-space:normal;}
+.xl158
+	{mso-style-parent:style461;
+	color:#DA9694;
+	font-size:10.0pt;
+	text-decoration:underline;
+	text-underline-style:single;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;}
+.xl159
+	{mso-style-parent:style0;
+	color:red;
+	vertical-align:top;}
+.xl160
+	{mso-style-parent:style0;
+	color:green;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	text-align:left;
+	vertical-align:top;
+	white-space:normal;}
+.xl161
+	{mso-style-parent:style0;
+	font-style:italic;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;}
+.xl162
+	{mso-style-parent:style0;
+	color:black;
+	font-style:italic;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	text-align:left;
+	vertical-align:top;}
+.xl163
+	{mso-style-parent:style0;
+	color:green;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	white-space:normal;}
+.xl164
+	{mso-style-parent:style0;
+	color:red;
+	font-weight:700;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;}
+.xl165
+	{mso-style-parent:style0;
+	font-weight:700;
+	text-align:left;
+	vertical-align:top;}
+.xl166
+	{mso-style-parent:style0;
+	color:#DA9694;
+	font-style:italic;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:none;
+	border-right:none;
+	border-bottom:.5pt solid windowtext;
+	border-left:none;}
+.xl167
+	{mso-style-parent:style0;
+	color:#DA9694;
+	text-align:left;
+	vertical-align:top;
+	border-top:none;
+	border-right:none;
+	border-bottom:.5pt solid windowtext;
+	border-left:none;}
+.xl168
+	{mso-style-parent:style0;
+	color:#DA9694;
+	vertical-align:top;
+	border-top:none;
+	border-right:none;
+	border-bottom:.5pt solid windowtext;
+	border-left:none;}
+.xl169
+	{mso-style-parent:style0;
+	color:#DA9694;
+	font-size:10.0pt;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	border-top:none;
+	border-right:none;
+	border-bottom:.5pt solid windowtext;
+	border-left:none;}
+.xl170
+	{mso-style-parent:style0;
+	text-align:left;
+	vertical-align:top;
+	border-top:none;
+	border-right:none;
+	border-bottom:.5pt solid windowtext;
+	border-left:none;
+	white-space:normal;}
+.xl171
+	{mso-style-parent:style0;
+	color:black;
+	font-style:italic;
+	font-family:Calibri;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	text-align:left;
+	vertical-align:top;
+	white-space:normal;}
+.xl172
+	{mso-style-parent:style0;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	white-space:normal;}
+.xl173
+	{mso-style-parent:style0;
+	font-family:Courier;
+	mso-generic-font-family:auto;
+	mso-font-charset:0;
+	vertical-align:top;
+	white-space:normal;}
+.xl174
+	{mso-style-parent:style0;
+	text-align:left;
+	vertical-align:top;
+	border-top:none;
+	border-right:none;
+	border-bottom:none;
+	border-left:.5pt solid windowtext;
+	white-space:normal;}
+.xl175
+	{mso-style-parent:style0;
+	color:black;
+	text-align:left;
+	vertical-align:top;
+	white-space:normal;}
+.xl176
+	{mso-style-parent:style0;
+	color:black;
+	text-align:left;
+	vertical-align:top;
+	border-top:none;
+	border-right:none;
+	border-bottom:.5pt solid windowtext;
+	border-left:none;
+	white-space:normal;}
+-->
+</style>
+</head>
+
+<body link=blue vlink=purple class=xl67>
+
+<table border=0 cellpadding=0 cellspacing=0 width=1085 style='border-collapse:
+ collapse;table-layout:fixed;width:1085pt'>
+ <col class=xl67 width=34 style='mso-width-source:userset;mso-width-alt:1450;
+ width:34pt'>
+ <col class=xl67 width=23 style='mso-width-source:userset;mso-width-alt:981;
+ width:23pt'>
+ <col class=xl69 width=174 style='mso-width-source:userset;mso-width-alt:7424;
+ width:174pt'>
+ <col class=xl67 width=23 style='mso-width-source:userset;mso-width-alt:981;
+ width:23pt'>
+ <col class=xl67 width=235 style='mso-width-source:userset;mso-width-alt:10026;
+ width:235pt'>
+ <col class=xl67 width=11 style='mso-width-source:userset;mso-width-alt:469;
+ width:11pt'>
+ <col class=xl71 width=23 style='mso-width-source:userset;mso-width-alt:981;
+ width:23pt'>
+ <col class=xl71 width=164 style='mso-width-source:userset;mso-width-alt:6997;
+ width:164pt'>
+ <col class=xl69 width=268 style='mso-width-source:userset;mso-width-alt:11434;
+ width:268pt'>
+ <col class=xl67 width=65 span=2 style='width:65pt'>
+ <tr height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 colspan=5 width=489 style='height:18.0pt;mso-ignore:
+  colspan;width:489pt'><a name="Print_Area">HDF5 Property Lists, Properties and
+  Property Values</a></td>
+  <td class=xl67 width=11 style='width:11pt'></td>
+  <td class=xl67 width=23 style='width:23pt'></td>
+  <td class=xl67 width=164 style='width:164pt'></td>
+  <td class=xl67 width=268 style='width:268pt'></td>
+  <td class=xl67 width=65 style='width:65pt'></td>
+  <td class=xl67 width=65 style='width:65pt'></td>
+ </tr>
+ <tr height=8 style='mso-height-source:userset;height:8.0pt'>
+  <td height=8 class=xl73 style='height:8.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl77 colspan=3 style='height:15.0pt;mso-ignore:colspan'>Property
+  List Class</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl65 height=15 style='height:15.0pt'>
+  <td height=15 class=xl105 width=34 style='height:15.0pt;width:34pt'></td>
+  <td class=xl75 colspan=2 style='mso-ignore:colspan'>Property</td>
+  <td class=xl75 colspan=2 style='mso-ignore:colspan'>Additional Description</td>
+  <td class=xl74 width=11 style='width:11pt'></td>
+  <td class=xl75 colspan=2 style='mso-ignore:colspan'>Set/Get Call</td>
+  <td class=xl74 width=268 style='width:268pt'>Valid Values</td>
+  <td class=xl65 width=65 style='width:65pt'></td>
+  <td class=xl65 width=65 style='width:65pt'></td>
+ </tr>
+ <tr height=19 style='mso-height-source:userset;height:19.0pt'>
+  <td height=19 class=xl67 style='height:19.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl74 width=174 style='width:174pt'>Parameter(s) or Flag(s)</td>
+  <td class=xl67></td>
+  <td class=xl69><font class="font5">Additional Description </font><font
+  class="font0">(where necessary)</font></td>
+  <td class=xl69></td>
+  <td class=xl80></td>
+  <td class=xl137 width=164 style='width:164pt'><font class="font27">Parameter</font></td>
+  <td class=xl165></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>HDF5 knobs that can be adjusted</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl102 height=8 style='mso-height-source:userset;height:8.0pt'>
+  <td height=8 class=xl102 style='height:8.0pt'> </td>
+  <td class=xl102> </td>
+  <td class=xl103> </td>
+  <td class=xl102> </td>
+  <td class=xl102> </td>
+  <td class=xl102> </td>
+  <td class=xl104> </td>
+  <td class=xl104> </td>
+  <td class=xl103> </td>
+  <td class=xl102> </td>
+  <td class=xl102> </td>
+ </tr>
+ <tr height=16 style='height:16.0pt'>
+  <td height=16 class=xl67 style='height:16.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 colspan=3 style='height:18.0pt;mso-ignore:colspan'>File
+  Creation Property Lists (FCPL)</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>B-tree control parameter</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get size parameter
+  controlling B-trees for indexing chunked datasets.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetIstoreK"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_istore_k</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetIstoreK"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_istore_k</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>FCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>fcpl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FCPL identifier<br>
+  <font
+  class="font5">Default: No default value<span
+  style="mso-spacerun:yes"> </span></font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>B-tree control parameter</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>One-half the rank of chunked
+  storage B-tree.<span style="mso-spacerun:yes"> </span></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>ik</td>
+  <td class=xl66 width=268 style='width:268pt'>Unsigned integer specifying
+  one-half the rank of a tree that stores chunked raw data.<br>
+  <font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>32<span style="mso-spacerun:yes"> </span></font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Sizes of object offsets
+  and lengths</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get byte size
+  of<span style="mso-spacerun:yes">  </span>offsets and lengths used to address
+  objects in HDF5 file.</td>
+  <td class=xl86 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetSizes"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_sizes</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetSizes"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_sizes</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>FCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>fcpl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FCPL identifier<br>
+  <font
+  class="font5">Default: No default value<span
+  style="mso-spacerun:yes"> </span></font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Object offset</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>sizeof_addr</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  size, in bytes, of offsets used to address an object.<br>
+  0 (zero) retains current setting.<br>
+  <font
+  class="font5">Default:</font><font class="font39"> sizeof(hsize_t) </font><font
+  class="font0">Normally 8 bytes<span style="mso-spacerun:yes"> </span></font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Object length</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>sizeof_size</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  size, in bytes, of lengths used to address an object.<br>
+  0 (zero) retains current setting.<br>
+  <font
+  class="font5">Default:</font><font class="font39"> sizeof(hsize_t) </font><font
+  class="font0">Normally 8 bytes<span style="mso-spacerun:yes"> </span></font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td colspan=2 class=xl84 width=197 style='width:197pt'>Size of parameters to
+  control symbol table nodes</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get size of
+  parameters used to control symbol table nodes.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetSymK"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_sym_k</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetSymK"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_sym_k</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>FCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>fcpl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FCPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Symbol table tree rank</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Controls rank of symbol table
+  tree for group; rank is twice the value of this setting.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>ik</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  one-half of rank of symbol table tree.<br>
+  0 (zero) retains current value.<br>
+  <font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>16</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Symbol table node size</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Controls number of symbols that
+  can be stored in symbol table node; rank is twice the value of this setting.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>lk</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  one-half of number of symbols that can be stored in symbol table node.<br>
+  0 (zero) retains current value.<br>
+  <font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>4<span style="mso-spacerun:yes"> </span></font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='page-break-before:always;mso-height-source:userset;
+  height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Userblock size</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get size of
+  userblock associated with an HDF5 file.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetUserblock"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_userblock</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetUserblock"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_userblock</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>FCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>fcpl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FCPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67>Size of userblock</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>size</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying size
+  of userblock in bytes.<br>
+  Must be power of 2 and equal to 512 or greater.<br>
+  <font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>0</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl89> </td>
+  <td class=xl90> </td>
+  <td class=xl89> </td>
+  <td class=xl89> </td>
+  <td class=xl89> </td>
+  <td class=xl91> </td>
+  <td class=xl91> </td>
+  <td class=xl90> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=18 style='height:18.0pt'>
+  <td height=18 class=xl67 style='height:18.0pt'></td>
+  <td class=xl127 colspan=4 style='mso-ignore:colspan'>Shared object header
+  message (SOHM) properties</td>
+  <td class=xl83 style='border-top:none'> </td>
+  <td class=xl85 style='border-top:none'> </td>
+  <td class=xl85 style='border-top:none'> </td>
+  <td class=xl81 style='border-top:none'> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl67 colspan=2 style='mso-ignore:colspan'>SOHM index configuration</td>
+  <td colspan=2 class=xl68 width=258 style='width:258pt'>Set/get shared object
+  header message (SOHM) index configuration.</td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetSharedMesgIndex"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_shared_mesg_index</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetSharedMesgIndex"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_shared_mesg_index</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FCPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fcpl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FCPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Index to configure</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>index_num</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer identifying
+  index to be configured.<br>
+  <font class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=106 style='height:106.0pt'>
+  <td height=106 class=xl67 style='height:106.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Message types in index</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Types of messages to be stored
+  in index.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>mesg_type_flags</td>
+  <td class=xl87 width=268 style='width:268pt'><font class="font13">H5O_SHMESG_SDSPACE_FLAG<br>
+  H5O_SHMESG_DTYPE_FLAG<br>
+  H5O_SHMESG_FILL_FLAG<br>
+  H5O_SHMESG_PLINE_FLAG<br>
+  H5O_SHMESG_ATTR_FLAG<br>
+  H5O_SHMESG_ALL_FLAG<br>
+  H5O_SHMESG_NONE_FLAG</font><font
+  class="font6"><br>
+  </font><font class="font5">Default:</font><font
+  class="font40"> </font><font class="font39">H5O_SHMESG_NONE_FLAG<span
+  style="mso-spacerun:yes"> </span></font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Minimum message size</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>min_mesg_size</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  minimum message size for this index.<br>
+  <font class="font5">Default: No
+  default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Number of SOHM indexes</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get number of
+  shared object header message (SOHM) indexes to be available in files.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetSharedMesgNIndexes"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_shared_mesg_nindexes</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetSharedMesgNIndexes"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_shared_mesg_nindexes</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FCPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fcpl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FCPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Number of indexes</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>nindexes</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  number of shared object header message indexes to be available in files.<br>
+  0 (zero) disables shared object header messages.<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='page-break-before:always;mso-height-source:userset;
+  height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td colspan=2 class=xl84 width=197 style='width:197pt'>SOHM index storage
+  phase change thresholds</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get phase change
+  thresholds for SOHM index storage.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=3 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetSharedMesgPhaseChange"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_shared_mesg_phase_change</span></a></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=3 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetSharedMesgPhaseChange"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_shared_mesg_phase_change</span></a></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FCPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fcpl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FCPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=75 style='height:75.0pt'>
+  <td height=75 class=xl67 style='height:75.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Maximum list size threshold</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Threshold above which storage of
+  a SOHM index shifts from list to B-tree.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>max_list</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  maximum number of SOHM indexes to be stored in a list.<br>
+  0 (zero) sets SOHM index storage to B-tree, never reverting to list.<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Minimum B-tree size threshold</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Threshold below which storage of
+  a SOHM index reverts to list format.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>min_btree</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  minimum number of SOHM indexes to be stored in a B-tree.<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=16 style='height:16.0pt'>
+  <td height=16 class=xl67 style='height:16.0pt'></td>
+  <td class=xl102> </td>
+  <td class=xl102> </td>
+  <td class=xl102> </td>
+  <td class=xl102> </td>
+  <td class=xl102> </td>
+  <td class=xl102> </td>
+  <td class=xl102> </td>
+  <td class=xl102> </td>
+  <td class=xl67></td>
+  <td class=xl77></td>
+ </tr>
+ <tr class=xl94 height=16 style='page-break-before:always;height:16.0pt'>
+  <td height=16 class=xl94 style='height:16.0pt'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+ </tr>
+ <tr height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 colspan=3 style='height:18.0pt;mso-ignore:colspan'>File
+  Access Property Lists (FAPL)</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Align objects</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get alignment of
+  objects larger than threshold size on specified boundaries in file.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetAlignment"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_alignment</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetAlignment"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_alignment</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67>Alignment threshold</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>threshold</td>
+  <td class=xl70 width=268 style='width:268pt'>Minimum size object to
+  align.<br>
+  0 (zero) forces all objects to be aligned.<br>
+  <font
+  class="font13">1</font><font class="font0"> implies no alignment.<br>
+  </font><font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>1</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Alignment boundary</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>alignment</td>
+  <td class=xl70 width=268 style='width:268pt'>Non-negative integer, preferably
+  multiple of system block size.<br>
+  <font class="font13">1</font><font
+  class="font0"> turns alignment off.<br>
+  </font><font class="font5">Default:</font><font
+  class="font39"><span style="mso-spacerun:yes"> </span>1</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=29 style='mso-height-source:userset;height:29.0pt'>
+  <td height=29 class=xl67 style='height:29.0pt'></td>
+  <td colspan=2 class=xl82 width=197 style='width:197pt'>Raw data chunk cache
+  (RDCC) properties</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get chunk cache
+  properties on per-file basis.</td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetCache"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_cache</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='mso-height-source:userset;height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetCache"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_cache</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl162>Deprecated parameter</td>
+  <td class=xl140></td>
+  <td class=xl161>No longer used.</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71>mdc_nelmts</td>
+  <td class=xl171 width=268 style='width:268pt'>Any value passed is
+  ignored.<br>
+  <font class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Number of elements in RDCC</td>
+  <td class=xl67></td>
+  <td>Number of chunk slots in RDCC for this file.</td>
+  <td></td>
+  <td class=xl71></td>
+  <td class=xl71>rdcc_nslots</td>
+  <td class=xl70 width=268 style='width:268pt'>Non-negative integer.<br>
+  <font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>521</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Total size of RDCC</td>
+  <td class=xl67></td>
+  <td>Total size of RDCC for this file.</td>
+  <td></td>
+  <td class=xl71></td>
+  <td class=xl71>rdcc_nbytes</td>
+  <td class=xl70 width=268 style='width:268pt'>Non-negative integer stating
+  size in bytes.<br>
+  <font class="font5">Default: 1MB per dataset</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Preemption policy</td>
+  <td class=xl67></td>
+  <td>Chunk preemption policy for this file.</td>
+  <td></td>
+  <td class=xl71></td>
+  <td class=xl71>rdcc_w0</td>
+  <td class=xl70 width=268 style='width:268pt'>Real number between 0 (zero) and
+  1 (one), inclusive.<br>
+  <font class="font5">Default:</font><font
+  class="font39"><span style="mso-spacerun:yes"> </span>0.75</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Maximum number of files
+  held open</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get maximum number
+  of files that can be held open in external link open file cache</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetELinkFileCacheSize"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_elink_file_cache_size</span></a></td>
+  <td class=xl83> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetELinkFileCacheSize"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_elink_file_cache_size</span></a></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>External link file cache size</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>efc_size</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  maximum number of files that can be held open.<br>
+  <font class="font5">Default:</font><font
+  class="font39"> 0 </font><font class="font13"> </font><font class="font0">(zero)</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='page-break-before:always;mso-height-source:userset;
+  height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Garbage collection
+  references flag</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get region
+  reference garbage collection flag.</td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetGCReferences"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_gc_references</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='mso-height-source:userset;height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetGCReferences"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_gc_references</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl68 width=174 style='width:174pt'>Region reference garbage
+  collection flag</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>gc_ref</td>
+  <td class=xl68 width=268 style='width:268pt'><font class="font13">0</font><font
+  class="font0"> (OFF)<br>
+  </font><font class="font13">1</font><font
+  class="font0"> (ON)<br>
+  </font><font class="font5">Default: </font><font
+  class="font39">0</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=77 style='mso-height-source:userset;height:77.0pt'>
+  <td height=77 class=xl67 style='height:77.0pt'></td>
+  <td colspan=2 class=xl84 width=197 style='width:197pt'>Version bounds for
+  HDF5 object formats</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get limits on
+  versions of HDF5 format to be used when writing objects.<br>
+  <font
+  class="font9">Allows only the 'latest', </font><font class="font29">H5F_LIBVER_LATEST</font><font
+  class="font9">, and 'earliest'', </font><font class="font29">H5F_LIBVER_EARLIEST</font><font
+  class="font9">, boundaries; per-release limits not available.</font></td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetLibverBounds"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_libver_bounds</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetLibverBounds"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_libver_bounds</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=54 style='height:54.0pt'>
+  <td height=54 class=xl67 style='height:54.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Earliest version to be used</td>
+  <td class=xl67></td>
+  <td colspan=2 style='mso-ignore:colspan'></td>
+  <td class=xl71></td>
+  <td class=xl71>libver_low</td>
+  <td class=xl172 width=268 style='width:268pt'>H5F_LIBVER_EARLIEST<br>
+  H5F_LIBVER_18<br>
+  H5F_LIBVER_LATEST<br>
+  <font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>H5F_LIBVER_EARLIEST</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=41 style='height:41.0pt'>
+  <td height=41 class=xl67 style='height:41.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Latest version to be used</td>
+  <td class=xl67></td>
+  <td colspan=2 style='mso-ignore:colspan'></td>
+  <td class=xl71></td>
+  <td class=xl71>libver_high</td>
+  <td class=xl172 width=268 style='width:268pt'>H5F_LIBVER_18<br>
+  H5F_LIBVER_LATEST<br>
+  <font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>H5F_LIBVER_LATEST</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Metadata cache
+  configuration</td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Set/get initial metadata
+  cache configuration.</td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetMdcConfig"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_mdc_config</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetMdcConfig"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_mdc_config</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl70 width=174 style='width:174pt'>Pointer to struct of
+  configuration settings</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>config_ptr</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid pointer to <font
+  class="font6">H5AC_cache_config_t</font><font class="font0"> struct.<br>
+  </font><font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=46 style='mso-height-source:userset;height:46.0pt'>
+  <td height=46 class=xl67 style='height:46.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Minimum metadata block
+  size</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get minimum
+  metadata block size.<br>
+  <font class="font9">Valid only when </font><font
+  class="font29">H5FD_FEAT_AGGREGATE_METADATA</font><font class="font9"><span
+  style="mso-spacerun:yes"> </span>has been set by a VFL driver.</font></td>
+  <td class=xl93> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetMetaBlockSize"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_meta_block_size</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetMetaBlockSize"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_meta_block_size</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td></td>
+  <td class=xl69>Minimum metadata block size</td>
+  <td class=xl67></td>
+  <td colspan=2 style='mso-ignore:colspan'></td>
+  <td class=xl71></td>
+  <td class=xl71>size</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  minimum metadata block allocations in bytes.<br>
+  0 (zero) turns off metadata aggregation.<br>
+  <font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>2048</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='page-break-before:always;height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Maximum size of data
+  sieve buffer</td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Set/get maximum size of
+  data sieve buffer.</td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetSieveBufSize"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_sieve_buf_size</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetSieveBufSize"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_sieve_buf_size</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Maximum data sieve buffer size</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>size</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  maximum data sieve buffer size in bytes.<br>
+  0 (zero) turns off data sieving.<br>
+  <font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>64KB</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td colspan=2 class=xl84 width=197 style='width:197pt'>Size of contiguous
+  block reserved for small data</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get size of
+  contiguous block reserved for contiguous storage of small data.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetSmallData"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_small_data_block_size</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetSmallData"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_small_data_block_size</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Size of shared contiguous block</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>size</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  size, in bytes, of shared contiguous block.<br>
+  0 (zero) disables small data block mechanism.<br>
+  <font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>2048</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>File close degree</td>
+  <td colspan=2 rowspan=2 class=xl84 width=258 style='width:258pt'>Set/get how
+  aggressively to close file when H5Fclose is called while object(s) in file
+  remain open.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFcloseDegree"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_fclose_degree</span></a></td>
+  <td class=xl83> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='mso-height-source:userset;height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetFcloseDegree"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_fclose_degree</span></a></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=97 style='height:97.0pt'>
+  <td height=97 class=xl67 style='height:97.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>File close degree</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Level of aggression.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>fc_degree</td>
+  <td class=xl173 width=268 style='width:268pt'>H5F_CLOSE_WEAK<br>
+  H5F_CLOSE_SEMI<br>
+  H5F_CLOSE_STRONG<br>
+  H5F_CLOSE_DEFAULT<br>
+  <font
+  class="font5">Defaults:<br>
+  </font><font class="font39">  </font><font
+  class="font5">For </font><font class="font39">H5FD_MPIO</font><font
+  class="font5"> driver:</font><font class="font39"> H5F_CLOSE_SEMI<br>
+    </font><font
+  class="font5">All other drivers:</font><font class="font39">
+  H5F_CLOSE_DEFAULT</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83> </td>
+  <td class=xl81> </td>
+  <td class=xl83> </td>
+  <td class=xl84 width=235 style='width:235pt'> </td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl85> </td>
+  <td class=xl85> </td>
+  <td class=xl88 width=268 style='width:268pt'> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl72 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl77></td>
+ </tr>
+ <tr height=18 style='page-break-before:always;height:18.0pt'>
+  <td height=18 class=xl67 style='height:18.0pt'></td>
+  <td class=xl127 colspan=2 style='mso-ignore:colspan'>Drivers</td>
+  <td class=xl83> </td>
+  <td class=xl84 width=235 style='width:235pt'> </td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl85> </td>
+  <td class=xl85> </td>
+  <td class=xl88 width=268 style='width:268pt'> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl67 height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67 colspan=2 style='mso-ignore:colspan'>Core driver</td>
+  <td class=xl67 colspan=2 style='mso-ignore:colspan'>Set/get use of core
+  driver (<font class="font6">H5FD_CORE</font><font class="font0">).</font></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFaplCore"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_fapl_core</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl67 height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetFaplCore"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_fapl_core</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67>Increment</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Size of increment when memory
+  is<span style="mso-spacerun:yes">  </span>increased.<span
+  style="mso-spacerun:yes"> </span></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>increment</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer indicating
+  size, in bytes, of increment when memory must be increased.<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67>Backing store</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Flag specifying whether file
+  contents are ever written to disk.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>backing_store</td>
+  <td class=xl70 width=268 style='width:268pt'>Boolean value indicating that
+  file is never written to disk (<font class="font13">0</font><font
+  class="font0">) or is written to disk (</font><font class="font13">1</font><font
+  class="font0">) when file is closed or access to file terminates in
+  memory.<br>
+  </font><font class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>0<span style="mso-spacerun:yes"> </span></font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='mso-height-source:userset;height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Direct I/O driver</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get use of direct
+  I/O driver  (<font class="font6">H5FD_DIRECT</font><font class="font0">).</font></td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFaplDirect"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_fapl_direct</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='mso-height-source:userset;height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetFaplDirect"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_fapl_direct</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Memory alignment</td>
+  <td class=xl67></td>
+  <td class=xl67>Required alignment boundary in memory.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>alignment</td>
+  <td class=xl160 width=268 style='width:268pt'>Unsigned integer specifying
+  required boundary alignment in  memory in bytes.<br>
+  Default:<font
+  class="font45"> 4096  </font><font class="font33">(4KB)</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>File system block size</td>
+  <td class=xl67></td>
+  <td class=xl67>File system block size.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>block_size</td>
+  <td class=xl160 width=268 style='width:268pt'>Unsigned integer indicating
+  file system block size in bytes.<br>
+  0 (zero) specifies HDF5 Library default value of 4KB.<br>
+  Default:<font
+  class="font45"> 4096  </font><font class="font33">(4KB)</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Copy buffer size</td>
+  <td class=xl67></td>
+  <td class=xl67>Copy buffer size.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>cbuf_size</td>
+  <td class=xl160 width=268 style='width:268pt'>Unsigned integer specifying
+  required copy buffer size in bytes.<br>
+  Default:<font class="font45">
+  16777216  </font><font class="font33">(16MB)</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Family driver</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get use of
+  "family of files" driver  (<font class="font6">H5FD_FAMILY</font><font
+  class="font0">).</font></td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFaplFamily"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_fapl_family</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetFaplFamily"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_fapl_family</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=46 style='height:46.0pt'>
+  <td height=46 class=xl67 style='height:46.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Member size</td>
+  <td class=xl67></td>
+  <td class=xl67>Size of each member file.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>memb_size</td>
+  <td class=xl79 width=268 style='width:268pt'>Unsigned integer specifying
+  size, in bytes, of each member file.<br>
+  Default:<font class="font46">
+  H5F_FAMILY_DEFAULT</font><font class="font12"> </font><font class="font47"><sup>4</sup></font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=33 style='mso-height-source:userset;height:33.0pt'>
+  <td height=33 class=xl67 style='height:33.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl68 width=174 style='width:174pt'>Member file access property list
+  identifier<span style="mso-spacerun:yes"> </span></td>
+  <td class=xl67></td>
+  <td class=xl66 width=235 style='width:235pt'>One file access property list
+  identifier to be used with all family members.</td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>memb_fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid file access property list
+  identifier.<br>
+  Default:<font class="font13"> H5P_DEFAULT</font><font
+  class="font0"> </font><font class="font15"><sup>1</sup></font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=46 style='page-break-before:always;mso-height-source:userset;
+  height:46.0pt'>
+  <td height=46 class=xl67 style='height:46.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Log driver</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set up use of logging
+  driver (<font class="font6">H5FD_LOG</font><font class="font0">).<br>
+  </font><font
+  class="font9">This is a standard POSIX driver (</font><font class="font29">H5FD_SEC2</font><font
+  class="font9">) with logging capabilities.</font></td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFaplLog"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_fapl_log</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Log file</td>
+  <td class=xl78 width=23 style='width:23pt'></td>
+  <td class=xl66 width=235 style='width:235pt'>Name of file in which logging
+  entries are to be recorded.</td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>logfile</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid filename with relative or
+  absolute path.<br>
+  <font class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=75 style='height:75.0pt'>
+  <td height=75 class=xl67 style='height:75.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Logging flags</td>
+  <td class=xl78 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'>Flags specifying actions to be
+  logged.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>flags</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid flag(s) for action(s) to
+  be logged, as listed in <font class="font6">H5Pset_fapl_log</font><font
+  class="font0"> reference manual entry. <br>
+  Multiple flags expressed with logical OR and in parentheses.<br>
+  </font><font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=75 style='height:75.0pt'>
+  <td height=75 class=xl67 style='height:75.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Buffer size</td>
+  <td class=xl78 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'>Size of logging buffers.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>buf_size</td>
+  <td class=xl160 width=268 style='width:268pt'>Unsigned integer specifying
+  size, in bytes, of logging buffers.<br>
+  Must be at least the maximum size, in bytes, of the file to be logged while
+  the log driver is in use.<br>
+  <font class="font35">Default: No default
+  value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>MPI I/O driver</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get use of MPI I/O
+  driver (<font class="font6">H5FD_MPIO</font><font class="font0">).<br>
+  </font><font
+  class="font9">Available only in parallel HDF5.</font></td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFaplMpio"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_fapl_mpio</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetFaplMpio"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_fapl_mpio</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67>MPI-2 communicator</td>
+  <td class=xl67></td>
+  <td>MPI communicator to be used for file open.</td>
+  <td></td>
+  <td class=xl71></td>
+  <td class=xl71>comm</td>
+  <td class=xl160 width=268 style='width:268pt'>Valid MPI-2 communicator<br>
+  <font
+  class="font35">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67>MPI-2 Info object</td>
+  <td class=xl67></td>
+  <td>MPI Info object to be used for file open.</td>
+  <td></td>
+  <td class=xl71></td>
+  <td class=xl71>info</td>
+  <td class=xl160 width=268 style='width:268pt'>Valid MPI Info object<br>
+  <font
+  class="font35">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl108 height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl108 style='height:31.0pt'></td>
+  <td class=xl123 colspan=2 style='mso-ignore:colspan'>MPI POSIX driver
+  (removed from HDF5)</td>
+  <td colspan=2 class=xl117 width=258 style='width:258pt'>Set/get use of MPI
+  POSIX driver (<font class="font19">H5FD_MPIPOSIX</font><font class="font18">).<br>
+  </font><font
+  class="font21">Removed from HDF5 ar Release 1.8.13.</font></td>
+  <td class=xl117 width=11 style='width:11pt'> </td>
+  <td class=xl124 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFaplMpiPosix"><span
+  style='color:#DA9694;font-size:10.0pt;font-family:Courier;mso-generic-font-family:
+  auto;mso-font-charset:0'>H5Pset_fapl_mpiposix</span></a></td>
+  <td class=xl116> </td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+ </tr>
+ <tr class=xl108 height=15 style='height:15.0pt'>
+  <td height=15 class=xl108 style='height:15.0pt'></td>
+  <td class=xl125></td>
+  <td class=xl108></td>
+  <td class=xl113 width=23 style='width:23pt'></td>
+  <td class=xl113 width=235 style='width:235pt'></td>
+  <td class=xl113 width=11 style='width:11pt'></td>
+  <td class=xl158 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetFaplMpiPosix"><span
+  style='color:#DA9694;font-size:10.0pt;font-family:Courier;mso-generic-font-family:
+  auto;mso-font-charset:0'>H5Pget_fapl_mpiposix</span></a></td>
+  <td class=xl112></td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl108></td>
+  <td class=xl112>FAPL identifier</td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+  <td class=xl114>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl108 height=30 style='height:30.0pt'>
+  <td height=30 class=xl108 style='height:30.0pt'></td>
+  <td class=xl125></td>
+  <td class=xl108>MPI-2 communicator</td>
+  <td class=xl108></td>
+  <td class=xl108>MPI communicator to be used for file open.</td>
+  <td class=xl108></td>
+  <td class=xl114></td>
+  <td class=xl114>comm</td>
+  <td class=xl160 width=268 style='width:268pt'>Valid MPI-2 communicator<br>
+  <font
+  class="font35">Default: No default value</font></td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+ </tr>
+ <tr class=xl108 height=60 style='height:60.0pt'>
+  <td height=60 class=xl108 style='height:60.0pt'></td>
+  <td class=xl125></td>
+  <td class=xl108>Use of GPFS hints</td>
+  <td class=xl108></td>
+  <td class=xl108>Calls for use of GPFS hints.</td>
+  <td class=xl108></td>
+  <td class=xl114></td>
+  <td class=xl114>use_gpfs_hints</td>
+  <td class=xl121 width=268 style='width:268pt'>Boolean value specifying
+  whether to use GPFS hints:<br>
+  0 (zero) for FALSE<br>
+  1 (one) for TRUE<br>
+  <font
+  class="font42">Default: 0<span style="mso-spacerun:yes">  </span></font></td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+ </tr>
+ <tr class=xl108 height=15 style='height:15.0pt'>
+  <td height=15 class=xl108 style='height:15.0pt'></td>
+  <td class=xl111> </td>
+  <td class=xl109> </td>
+  <td class=xl109> </td>
+  <td class=xl109> </td>
+  <td class=xl109> </td>
+  <td class=xl110> </td>
+  <td class=xl110> </td>
+  <td class=xl138 width=268 style='width:268pt'> </td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+ </tr>
+ <tr class=xl108 height=15 style='mso-height-source:userset;height:15.0pt'>
+  <td height=15 class=xl108 style='height:15.0pt'></td>
+  <td class=xl115 colspan=2 style='mso-ignore:colspan'>Multi driver</td>
+  <td colspan=2 class=xl117 width=258 style='width:258pt'>Set/get use of
+  multi-file driver (<font class="font19">H5FD_MULTI</font><font class="font18">).</font></td>
+  <td class=xl117 width=11 style='border-top:none;width:11pt'> </td>
+  <td class=xl118 colspan=2 style='mso-ignore:colspan'>H5Pset_fapl_multi</td>
+  <td class=xl116 style='border-top:none'> </td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+ </tr>
+ <tr class=xl108 height=15 style='mso-height-source:userset;height:15.0pt'>
+  <td height=15 class=xl108 style='height:15.0pt'></td>
+  <td class=xl108></td>
+  <td class=xl112></td>
+  <td class=xl113 width=23 style='width:23pt'></td>
+  <td class=xl113 width=235 style='width:235pt'></td>
+  <td class=xl113 width=11 style='width:11pt'></td>
+  <td class=xl114 colspan=2 style='mso-ignore:colspan'>H5Pget_fapl_multi</td>
+  <td class=xl112></td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl108></td>
+  <td class=xl112>FAPL identifier</td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+  <td class=xl114>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl108 height=45 style='height:45.0pt'>
+  <td height=45 class=xl108 style='height:45.0pt'></td>
+  <td class=xl108></td>
+  <td class=xl112>Memory usage map</td>
+  <td class=xl108></td>
+  <td class=xl113 width=235 style='width:235pt'>Map memory usage types to other
+  memory usage types.</td>
+  <td class=xl113 width=11 style='width:11pt'></td>
+  <td class=xl114></td>
+  <td class=xl120 width=164 style='width:164pt'>mem_map</td>
+  <td class=xl119 width=268 style='width:268pt'>Array of <font class="font19">H5FD_MEM_NTYPES</font><font
+  class="font18"> entries, each either the value </font><font class="font19">H5FD_MEM_DEFAULT</font><font
+  class="font18"> or a memory usage type.<br>
+  </font><font class="font42">Default:
+  Array of </font><font class="font43">H5FD_MEM_DEFAULT</font></td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+ </tr>
+ <tr class=xl108 height=46 style='height:46.0pt'>
+  <td height=46 class=xl108 style='height:46.0pt'></td>
+  <td class=xl108></td>
+  <td class=xl112>Memory usage types property list</td>
+  <td class=xl108></td>
+  <td class=xl113 width=235 style='width:235pt'>Property list for each memory
+  usage type.</td>
+  <td class=xl113 width=11 style='width:11pt'></td>
+  <td class=xl114></td>
+  <td class=xl120 width=164 style='width:164pt'>mem_fapl</td>
+  <td class=xl113 width=268 style='width:268pt'>Array of property list for each
+  memory usage type that will be associated with a file.<br>
+  <font
+  class="font42">Default: Array of </font><font class="font43">H5P_DEFAULT</font><font
+  class="font18"> </font><font class="font22"><sup>1</sup></font></td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+ </tr>
+ <tr class=xl108 height=45 style='height:45.0pt'>
+  <td height=45 class=xl108 style='height:45.0pt'></td>
+  <td class=xl108></td>
+  <td class=xl112>Name generator</td>
+  <td class=xl108></td>
+  <td class=xl113 width=235 style='width:235pt'>Name generator for names of
+  member files.</td>
+  <td class=xl113 width=11 style='width:11pt'></td>
+  <td class=xl114></td>
+  <td class=xl120 width=164 style='width:164pt'>memb_name</td>
+  <td class=xl163 width=268 style='width:268pt'>Array of printf-style strings,
+  defined in the reference manual entry.<br>
+  <font class="font35">Default: 
+  %s-</font><font class="font44">X</font><font class="font35">.h5</font></td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+ </tr>
+ <tr class=xl108 height=42 style='height:42.0pt'>
+  <td height=42 class=xl108 style='height:42.0pt'></td>
+  <td class=xl108></td>
+  <td class=xl112>Virtual address space offsets</td>
+  <td class=xl108></td>
+  <td class=xl113 width=235 style='width:235pt'>Offsets within the virtual
+  address space at which each type of data storage begins.</td>
+  <td class=xl113 width=11 style='width:11pt'></td>
+  <td class=xl114></td>
+  <td class=xl120 width=164 style='width:164pt'>memb_addr</td>
+  <td class=xl113 width=268 style='width:268pt'>Array of unsigned integers from
+  <font class="font19">0</font><font class="font18"> (zero) to </font><font
+  class="font19">HADDR_MAX.<br>
+  </font><font class="font42">Default: 0 </font><font
+  class="font18"><span style="mso-spacerun:yes"> </span>(zero)</font></td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+ </tr>
+ <tr class=xl108 height=75 style='height:75.0pt'>
+  <td height=75 class=xl108 style='height:75.0pt'></td>
+  <td class=xl108></td>
+  <td class=xl112>Relaxed access</td>
+  <td class=xl108></td>
+  <td class=xl113 width=235 style='width:235pt'>Allow read-only access to
+  incomplete file sets.</td>
+  <td class=xl113 width=11 style='width:11pt'></td>
+  <td class=xl114></td>
+  <td class=xl120 width=164 style='width:164pt'>relax</td>
+  <td class=xl121 width=268 style='width:268pt'>Boolean value specifying
+  whether to allow read access to incomplete file sets:<br>
+  0 (zero) for FALSE<br>
+  1 (one) for TRUE<br>
+  <font
+  class="font42">Default: 0</font><font class="font18"><span
+  style="mso-spacerun:yes">  </span></font></td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+ </tr>
+ <tr height=46 style='mso-height-source:userset;height:46.0pt'>
+  <td height=46 class=xl67 style='height:46.0pt'></td>
+  <td class=xl92 colspan=2 style='mso-ignore:colspan'>Sec2 driver</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set up use of sec2
+  driver (<font class="font6">H5FD_SEC2</font><font class="font0">), HDF5's
+  default default driver and its standard POSIX-compliant driver.</font></td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFaplSec2"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_fapl_sec2</span></a></td>
+  <td class=xl84 width=268 style='width:268pt'> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl143> </td>
+  <td class=xl146>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl145> </td>
+  <td class=xl145> </td>
+  <td class=xl147>fapl_id</td>
+  <td class=xl170 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl67 colspan=2 style='mso-ignore:colspan'>Split driver</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set up use of split
+  driver (<font class="font6">H5FD_SPLIT</font><font class="font0">), a special
+  case of the </font><font class="font6">H5FD_MULTI</font><font class="font0"><span
+  style="mso-spacerun:yes"> </span>driver.</font></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFaplSplit"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_fapl_split</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67>Metadata file extension</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>meta_ext</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid string for use as filename
+  extension.<br>
+  <font class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=32 style='mso-height-source:userset;height:32.0pt'>
+  <td height=32 class=xl67 style='height:32.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67>FAPL identifier for metadata file</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>meta_plist_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid file access property list
+  identifier. <br>
+  <font class="font5">Default:</font><font class="font39">
+  H5P_DEFAULT</font><font class="font5"> </font><font class="font48"><sup>1</sup></font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67>Raw data file extension</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>raw_ext</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid string for use as filename
+  extension.<br>
+  <font class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=32 style='mso-height-source:userset;height:32.0pt'>
+  <td height=32 class=xl67 style='height:32.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67>FAPL identifier for raw data file</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>raw_plist_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid file access property list
+  identifier. <br>
+  <font class="font5">Default:</font><font class="font39">
+  H5P_DEFAULT</font><font class="font5"> </font><font class="font48"><sup>1</sup></font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl122 height=15 style='page-break-before:always;mso-height-source:
+  userset;height:15.0pt'>
+  <td height=15 class=xl122 style='height:15.0pt'></td>
+  <td class=xl148 colspan=2 style='mso-ignore:colspan'>Standard I/O driver</td>
+  <td colspan=2 class=xl150 width=258 style='width:258pt'>Set up use of
+  standard I/O driver (<font class="font23">H5FD_STDIO</font><font
+  class="font12">).</font></td>
+  <td class=xl150 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFaplStdio"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_fapl_stdio</span></a></td>
+  <td class=xl149> </td>
+  <td class=xl122></td>
+  <td class=xl122></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl108 height=15 style='height:15.0pt'>
+  <td height=15 class=xl108 style='height:15.0pt'></td>
+  <td class=xl123 colspan=4 style='mso-ignore:colspan'>STREAM driver (removed
+  from HDF5 and not to be included in table)</td>
+  <td class=xl115> </td>
+  <td class=xl118 colspan=2 style='mso-ignore:colspan'>H5Pset_fapl_stream</td>
+  <td class=xl116> </td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+ </tr>
+ <tr class=xl108 height=15 style='height:15.0pt'>
+  <td height=15 class=xl108 style='height:15.0pt'></td>
+  <td class=xl166> </td>
+  <td class=xl167> </td>
+  <td class=xl168> </td>
+  <td class=xl168> </td>
+  <td class=xl168> </td>
+  <td class=xl169 colspan=2 style='mso-ignore:colspan'>H5Pget_fapl_stream</td>
+  <td class=xl167> </td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+ </tr>
+ <tr height=61 style='mso-height-source:userset;height:61.0pt'>
+  <td height=61 class=xl67 style='height:61.0pt'></td>
+  <td class=xl67 colspan=2 style='mso-ignore:colspan'>Windows I/O driver</td>
+  <td colspan=2 class=xl68 width=258 style='width:258pt'>Set up use of default
+  HDF5 I/O driver for Windows systems (<font class="font6">H5FD_WINDOWS</font><font
+  class="font0">).<br>
+  </font><font class="font9">Supported only on Windows
+  systems and the only HDF5 driver tested on Windows systems.</font></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFaplWindows"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_fapl_windows</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=77 style='mso-height-source:userset;height:77.0pt'>
+  <td height=77 class=xl67 style='height:77.0pt'></td>
+  <td colspan=2 class=xl84 width=197 style='width:197pt'>Offset for low-level
+  access to file in family of files</td>
+  <td colspan=2 class=xl82 width=258 style='width:258pt'>Set offset of specific
+  data in logical HDF5 file, enabling retrieval of file handle  for relevant
+  member of HDF5 family of files.<br>
+  <font class="font9">Meaningful only if
+  file is created as an HDF5 family of files (</font><font class="font29">H5FD_FAMILY</font><font
+  class="font9">, </font><font class="font29">H5Pset_fapl_family</font><font
+  class="font9">).</font></td>
+  <td class=xl86 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFamilyOffset"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_family_offset</span></a></td>
+  <td class=xl83> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl70 width=23 style='width:23pt'></td>
+  <td class=xl70 width=235 style='width:235pt'></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetFamilyOffset"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_family_offset</span></a></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67>Offset within HDF5 file</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>offset</td>
+  <td class=xl68 width=268 style='width:268pt'>Unsigned integer specifying
+  offset, in bytes, of data that user seeks within logical HDF5 file.<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=61 style='mso-height-source:userset;height:61.0pt'>
+  <td height=61 class=xl67 style='height:61.0pt'></td>
+  <td colspan=2 class=xl84 width=197 style='width:197pt'>Type of data to be
+  accessed by multi driver</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get type of data
+  to be accessed by H5FD_MULTI driver.<br>
+  <font class="font9">Appropriate
+  only with HDF5 files written as set of files with multi file driver, </font><font
+  class="font29">H5FD_MULTI</font><font class="font9">.</font></td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetMultiType"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_multi_type</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetMultiType"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_multi_type</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=76 style='mso-height-source:userset;height:76.0pt'>
+  <td height=76 class=xl67 style='height:76.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Type of data</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Type of data to be accessed.
+  <br>
+  Specify exactly one: <br>
+  super block data, B-tree data, dataset raw data, global heap data, local
+  heap data, or object header data.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>type</td>
+  <td class=xl72 width=268 style='width:268pt'>H5D_MEM_SUPER<br>
+  H5D_MEM_BTREE<br>
+  H5D_MEM_DRAW<br>
+  H5D_MEM_GHEAP<br>
+  H5D_MEM_LHEAP<br>
+  H5D_MEM_OHDR<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='page-break-before:always;height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl81 colspan=2 style='mso-ignore:colspan'>Core driver write
+  tracking properties</td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Set/get core driver write
+  tracking properties.</td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetCoreWriteTracking"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_core_write_tracking</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetCoreWriteTracking"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_core_write_tracking</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Enable write tracking</td>
+  <td class=xl67></td>
+  <td class=xl67>Enable or disable write tracking.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>is_enabled</td>
+  <td class=xl70 width=268 style='width:268pt'>1 (one) for ENABLED.<br>
+  0 (zero) for DISABLED.<br>
+  <font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>0</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Write tracking page size</td>
+  <td class=xl67></td>
+  <td class=xl67>Page size.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>page_size</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying page
+  size in bytes. <br>
+  Preferably a power of 2.<br>
+  1 (one) forces tracking with no paging.<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>File image (core driver)</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get file image for
+  working with a file in memory.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFileImage"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_file_image</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetFileImage"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_file_image</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Buffer pointer</td>
+  <td class=xl67></td>
+  <td class=xl67>Pointer to initial file image.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>buf_ptr</td>
+  <td class=xl174 width=268 style='width:268pt'>Valid pointer to file
+  image.<br>
+  <font class="font6">NULL</font><font class="font0"> if no
+  initial file image.<br>
+  </font><font class="font5">Default:</font><font
+  class="font39"><span style="mso-spacerun:yes"> </span>NULL</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Buffer size</td>
+  <td class=xl67></td>
+  <td class=xl67>Size of supplied buffer.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>buf_len</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid buffer size in bytes.<br>
+  <font
+  class="font6">0</font><font class="font0"> (zero) if no initial file
+  image.<br>
+  </font><font class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>0</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>File image callbacks
+  (core driver)</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get callback
+  functions for working with a file image in memory.</td>
+  <td class=xl86 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFileImageCallbacks"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_file_image_callbacks</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetFileImageCallbacks"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_file_image_callbacks</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl139>FAPL identifier</td>
+  <td class=xl140></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>fapl_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67>Callbacks pointer</td>
+  <td class=xl67></td>
+  <td class=xl66 width=235 style='width:235pt'>Pointer to instance of <font
+  class="font6">H5_file_image_callbacks_t</font><font class="font0"><span
+  style="mso-spacerun:yes"> </span>structure.</font></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>callbacks_ptr</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid pointer to valid structure
+  defining callback functions.<br>
+  <font class="font5">Default: No default
+  value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=16 style='height:16.0pt'>
+  <td height=16 class=xl67 style='height:16.0pt'></td>
+  <td class=xl102> </td>
+  <td class=xl102> </td>
+  <td class=xl102> </td>
+  <td class=xl102> </td>
+  <td class=xl102> </td>
+  <td class=xl102> </td>
+  <td class=xl102> </td>
+  <td class=xl102> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl94 height=16 style='page-break-before:always;height:16.0pt'>
+  <td height=16 class=xl94 style='height:16.0pt'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+ </tr>
+ <tr height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 colspan=3 style='height:18.0pt;mso-ignore:colspan'>Object
+  Creation Property Lists (OCPL)</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td colspan=2 class=xl82 width=197 style='width:197pt'>Track and index
+  attribute creation order</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get tracking and
+  indexing on attribute creation order.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetAttrCreationOrder"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_attr_creation_order</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetAttrCreationOrder"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_attr_creation_order</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>OCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>ocpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid OCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=57 style='height:57.0pt'>
+  <td height=57 class=xl67 style='height:57.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67>Creation order flags</td>
+  <td class=xl67></td>
+  <td class=xl67>Tracked or tracked-and-indexed</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>crt_order_flags</td>
+  <td class=xl72 width=268 style='width:268pt'>H5P_CRT_ORDER_TRACKED<br>
+  H5P_CRT_ORDER_INDEXED    <font
+  class="font9"> (Requires 'tracked'.)<br>
+  </font><font class="font5">Default:</font><font
+  class="font0"> </font><font class="font5">Attribute creation order is neither
+  tracked nor indexed.</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=29 style='mso-height-source:userset;height:29.0pt'>
+  <td height=29 class=xl67 style='height:29.0pt'></td>
+  <td colspan=2 class=xl84 width=197 style='width:197pt'>Attribute storage
+  phase change properties</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get attribute
+  storage phase change thresholds.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetAttrPhaseChange"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_attr_phase_change</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='mso-height-source:userset;height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetAttrPhaseChange"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_attr_phase_change</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>OCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>ocpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid OCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl68 width=174 style='width:174pt'>Maximum number for compact
+  storage</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Maximum number of links to store
+  in compact storage before converting group to dense format.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>max_compact</td>
+  <td class=xl70 width=268 style='width:268pt'>Any unsigned integer.<br>
+  0 (zero) forces compact storage to always be used.<br>
+  <font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>8</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl68 width=174 style='width:174pt'>Minimum number for dense storage</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Minimum number of links to store
+  in dense format before converting group to compact format.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>min_dense</td>
+  <td class=xl70 width=268 style='width:268pt'>Any unsigned integer.<br>
+  <font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>6</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=29 style='mso-height-source:userset;height:29.0pt'>
+  <td height=29 class=xl67 style='height:29.0pt'></td>
+  <td colspan=2 class=xl84 width=197 style='width:197pt'>Recording of times
+  associated with object</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Recording of times
+  associated with object.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetObjTrackTimes"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_obj_track_times</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='mso-height-source:userset;height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetObjTrackTimes"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_obj_track_times</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>OCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>ocpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid OCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Track times<span style="mso-spacerun:yes"> </span></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Track times associated with
+  object.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>track_times</td>
+  <td class=xl70 width=268 style='width:268pt'><font class="font13">TRUE</font><font
+  class="font0"> -- Times are recorded.<br>
+  </font><font class="font13">FALSE
+  </font><font class="font0">-- Times are not recorded.<br>
+  </font><font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>FALSE</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=16 style='height:16.0pt'>
+  <td height=16 class=xl67 style='height:16.0pt'></td>
+  <td class=xl83> </td>
+  <td class=xl81> </td>
+  <td class=xl83> </td>
+  <td class=xl84 width=235 style='width:235pt'> </td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl85> </td>
+  <td class=xl85> </td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl94 height=16 style='page-break-before:always;height:16.0pt'>
+  <td height=16 class=xl94 style='height:16.0pt'> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+ </tr>
+ <tr height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 colspan=3 style='height:18.0pt;mso-ignore:colspan'>Object
+  Copy Property Lists (OCPYPL)</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Object copy properties</td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Set/get properties
+  governing object copying.</td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetCopyObject"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_copy_object</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetCopyObject"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_copy_object</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>OCPYPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>ocpypl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid OCPYPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Copy options</td>
+  <td class=xl67></td>
+  <td class=xl67>Copy property settings.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>copy_options</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid flag(s) for copy property
+  settings (below). <br>
+  Multiple flags are expressed with logical OR and in parentheses.<br>
+  <font
+  class="font5">Default: See below</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl70 width=235 style='width:235pt'>Recursive copy.</td>
+  <td class=xl70 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl72 width=268 style='width:268pt'>H5O_COPY_SHALLOW_HIERARCHY_FLAG<font
+  class="font0"><br>
+  Copy only immediate members of a group.<br>
+  </font><font
+  class="font5">Default: Recursively copy all objects in and below group.</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl70 width=235 style='width:235pt'>Soft link expansion.</td>
+  <td class=xl70 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl72 width=268 style='width:268pt'>H5O_COPY_EXPAND_SOFT_LINK_FLAG<font
+  class="font0"><br>
+  Expand soft links into new objects.<br>
+  </font><font
+  class="font5">Default: Copy soft links as unchanged soft links.</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl70 width=235 style='width:235pt'>External link expansion.</td>
+  <td class=xl70 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl72 width=268 style='width:268pt'>H5O_COPY_EXPAND_EXT_LINK_FLAG<font
+  class="font0"><br>
+  Expand external link into new objects.<br>
+  </font><font
+  class="font5">Default: Copy external links as unchanged external links.</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=75 style='height:75.0pt'>
+  <td height=75 class=xl67 style='height:75.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl70 width=235 style='width:235pt'>Copying references.</td>
+  <td class=xl70 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl72 width=268 style='width:268pt'>H5O_COPY_EXPAND_REFERENCE_FLAG<font
+  class="font0"><br>
+  Copy objects that are pointed to by references and update reference values
+  in destination file.<br>
+  </font><font class="font5">Default: Set reference
+  values in destination file to zero (0).</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl70 width=235 style='width:235pt'>Copying attributes.</td>
+  <td class=xl70 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl72 width=268 style='width:268pt'>H5O_COPY_WITHOUT_ATTR_FLAG<font
+  class="font0"><br>
+  Copy object without copying attributes.<br>
+  </font><font
+  class="font5">Default: Copy object with all attributes.</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=165 style='height:165.0pt'>
+  <td height=165 class=xl67 style='height:165.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl70 width=235 style='width:235pt'>Matching shared committed
+  datatypes.</td>
+  <td class=xl70 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl72 width=268 style='width:268pt'>H5O_COPY_MERGE_COMMITTED_DTYPE_FLAG<font
+  class="font0"><br>
+  Use matching committed datatype in destination file when copying committed
+  datatype, dataset with committed datatype, or object with attribute of
+  committed datatype.<br>
+  </font><font class="font5">Default: If copied in
+  single H5Ocopy operation, objects sharing committed datatype in source will
+  share anonymous committed datatype in destination copy. Subsequent H5Ocopy
+  operations will be unaware of prior anonymous committed datatypes.</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=29 style='mso-height-source:userset;height:29.0pt'>
+  <td height=29 class=xl67 style='height:29.0pt'></td>
+  <td colspan=2 class=xl82 width=197 style='width:197pt'>List of merged
+  committed datatype paths</td>
+  <td class=xl81 colspan=2 style='mso-ignore:colspan'>Add new path to list of
+  paths in property list.</td>
+  <td class=xl82 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=3 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-AddMergeCommittedDtypePath"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Padd_merge_committed_dtype_path.htm</span></a></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>OCPYPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>ocpypl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid OCPYPL identifier<font
+  class="font41"><br>
+  Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl70 width=174 style='width:174pt'>Path to be added.</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl70 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>path</td>
+  <td class=xl68 width=268 style='width:268pt'>Valid path where matching
+  committed datatypes can be found in destination copy.<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl70 width=235 style='width:235pt'>Remove list of paths from
+  property list.</td>
+  <td class=xl70 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=3 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-FreeMergeCommittedDtypePaths"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pfree_merge_committed_dtype_paths.htm</span></a></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69>OCPYPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl70 width=235 style='width:235pt'></td>
+  <td class=xl70 width=11 style='width:11pt'></td>
+  <td class=xl106></td>
+  <td class=xl141>ocpypl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid OCPYPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=46 style='mso-height-source:userset;height:46.0pt'>
+  <td height=46 class=xl67 style='height:46.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'><font class="font6">H5Ocopy</font><font
+  class="font0"><span style="mso-spacerun:yes"> </span>callback function</font></td>
+  <td colspan=2 class=xl82 width=258 style='width:258pt'>Set/get callback
+  function for H5Ocopy to invoke before searching entire destination file for
+  matching committed datatype.</td>
+  <td class=xl86 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetMcdtSearchCb"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_mcdt_search_cb</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl70 width=23 style='width:23pt'></td>
+  <td class=xl70 width=235 style='width:235pt'></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetMcdtSearchCb"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_mcdt_search_cb</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>OCPYPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>ocpypl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid OCPYPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl68 width=174 style='width:174pt'>User-defined <font class="font6">H5Ocopy</font><font
+  class="font0"><span style="mso-spacerun:yes"> </span>callback function</font></td>
+  <td class=xl67></td>
+  <td class=xl66 width=235 style='width:235pt'></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>func</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid user-defined callback
+  function.<br>
+  <font class="font5">Default: No callback function</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl68 width=174 style='width:174pt'>User-defined<span
+  style="mso-spacerun:yes">  </span>callback function input data</td>
+  <td class=xl67></td>
+  <td class=xl66 width=235 style='width:235pt'></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>op_data</td>
+  <td class=xl70 width=268 style='width:268pt'>User-defined callback function
+  data.<br>
+  <font class="font5">Default: No input data</font></td>
+  <td class=xl67></td>
+  <td class=xl77></td>
+ </tr>
+ <tr class=xl67 height=16 style='height:16.0pt'>
+  <td height=16 class=xl67 style='height:16.0pt'></td>
+  <td class=xl102> </td>
+  <td class=xl103> </td>
+  <td class=xl102> </td>
+  <td class=xl134 width=235 style='width:235pt'> </td>
+  <td class=xl134 width=11 style='width:11pt'> </td>
+  <td class=xl104> </td>
+  <td class=xl104> </td>
+  <td class=xl103> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl94 height=16 style='page-break-before:always;height:16.0pt'>
+  <td height=16 class=xl94 style='height:16.0pt'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl95 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl97 style='border-top:none'> </td>
+  <td class=xl97 style='border-top:none'> </td>
+  <td class=xl96 width=268 style='border-top:none;width:268pt'> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+ </tr>
+ <tr height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 colspan=3 style='height:18.0pt;mso-ignore:colspan'>Link
+  Creation Property Lists (LCPL)</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl69 colspan=2 style='mso-ignore:colspan'>Character encoding</td>
+  <td colspan=2 class=xl68 width=258 style='width:258pt'>Set/get character
+  encoding used for link and attribute names.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetCharEncoding"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_char_encoding</span></a></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetCharEncoding"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_char_encoding</span></a></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>LCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>lcpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid LCPL or ACPL
+  identifier<br>
+  <font class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69>Character encoding</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>encoding</td>
+  <td class=xl173 width=268 style='width:268pt'>H5T_CSET_ASCII  <font
+  class="font0">(US ASCII)</font><font class="font13"><br>
+  H5T_CSET_UTF8  </font><font
+  class="font0">(UTF-8 Unicode)<br>
+  </font><font class="font5">Default:</font><font
+  class="font39"><span style="mso-spacerun:yes"> </span>H5T_CSET_ASCII</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=46 style='mso-height-source:userset;height:46.0pt'>
+  <td height=46 class=xl67 style='height:46.0pt'></td>
+  <td class=xl81 colspan=2 style='mso-ignore:colspan'>Create missing
+  intermediate groups</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get create missing
+  intermediate groups property when object is created at location that does not
+  yet exist.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=3 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetCreateIntermediateGroup"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_create_intermediate_group</span></a></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=3 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetCreateIntermediateGroup"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_create_intermediate_group</span></a></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>LCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>lcpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid LCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl70 width=174 style='width:174pt'>Missing intermediate group
+  creation flag</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Flag specifying whether to
+  create missing intermediate groups</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>crt_intermed_group</td>
+  <td class=xl70 width=268 style='width:268pt'>Positive value [ ON ]<br>
+  Non-positive value  [ OFF ]<br>
+  <font
+  class="font5">Default: OFF</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl81> </td>
+  <td class=xl81> </td>
+  <td class=xl83> </td>
+  <td class=xl84 width=235 style='width:235pt'> </td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl85> </td>
+  <td class=xl85> </td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=16 style='height:16.0pt'>
+  <td height=16 class=xl67 style='height:16.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl66 width=235 style='width:235pt'></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl94 height=16 style='page-break-before:always;height:16.0pt'>
+  <td height=16 class=xl94 style='height:16.0pt'> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+  <td class=xl98 width=235 style='width:235pt'> </td>
+  <td class=xl98 width=11 style='width:11pt'> </td>
+  <td class=xl97> </td>
+  <td class=xl97> </td>
+  <td class=xl99 width=268 style='width:268pt'> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+ </tr>
+ <tr height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 colspan=3 style='height:18.0pt;mso-ignore:colspan'>Link
+  Access Property Lists (LAPL)</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>External link traversal
+  file access</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get file access
+  settings in LAPL used to open files reached through external links. <font
+  class="font15"><sup>3</sup></font></td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetELinkAccFlags"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_elink_acc_flags</span></a></td>
+  <td class=xl83> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetELinkAccFlags"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_elink_acc_flags</span></a></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>LAPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>lapl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid LAPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=105 style='height:105.0pt'>
+  <td height=105 class=xl67 style='height:105.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl70 width=174 style='width:174pt'>External link traversal file
+  access flags</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Flags for setting file access
+  when traversing external links.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>flags</td>
+  <td class=xl70 width=268 style='width:268pt'><font class="font13">H5F_ACC_RDWR</font><font
+  class="font0"> <br>
+          Open with read/write access.<br>
+  </font><font
+  class="font13">H5F_ACC_RDONLY</font><font class="font0"> <br>
+          Open with read-only access.<br>
+  </font><font
+  class="font13">H5F_ACC_DEFAULT </font><font class="font0"><br>
+          File access flag settings taken from parent file.<br>
+  </font><font
+  class="font5">Default: </font><font class="font39">H5F_ACC_DEFAULT<span
+  style="mso-spacerun:yes"> </span></font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=16 style='height:16.0pt'>
+  <td height=16 class=xl67 style='height:16.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>External link callback
+  function</td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Set/get external link
+  traversal callback function <font class="font15"><sup>3</sup></font></td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetELinkCb"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_elink_cb</span></a></td>
+  <td class=xl83> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetELinkCb"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_elink_cb</span></a></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>LAPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>lapl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid LAPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Callback function</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>func</td>
+  <td class=xl68 width=268 style='width:268pt'>User-defined external link
+  traversal callback function.<br>
+  <font class="font5">Default: No callback
+  function<span style="mso-spacerun:yes"> </span></font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Callback data</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>op_data</td>
+  <td class=xl68 width=268 style='width:268pt'>User-supplied data for callback
+  function.<br>
+  <font class="font5">Default: No user-supplied data</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>FAPL for file accessed
+  via external link</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get file access
+  property list (FAPL) for use in accessing file pointed to by external link.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetELinkFapl"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_elink_fapl</span></a></td>
+  <td class=xl83> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>LAPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>lapl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid LAPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=61 style='mso-height-source:userset;height:61.0pt'>
+  <td height=61 class=xl67 style='height:61.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl70 width=174 style='width:174pt'>File access property list (FAPL)
+  to use for files accessed through external links</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>fapl_id</td>
+  <td class=xl68 width=268 style='width:268pt'>Valid FAPL identifier<br>
+  <font
+  class="font9">Any file close degree property setting (</font><font
+  class="font29">H5Pset_fclose_degree</font><font class="font9">) in this FAPL
+  will be ignored.<br>
+  </font><font class="font5">Default: File access
+  identifier from existing LAPL</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl70 width=174 style='width:174pt'></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetELinkFapl"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_elink_fapl</span></a></td>
+  <td class=xl68 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>LAPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106></td>
+  <td class=xl141>lapl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid LAPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=29 style='page-break-before:always;mso-height-source:userset;
+  height:29.0pt'>
+  <td height=29 class=xl67 style='height:29.0pt'></td>
+  <td colspan=2 class=xl84 width=197 style='width:197pt'>Prefix to be applied
+  to external link paths</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get prefix to be
+  applied to external link paths.</td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetELinkPrefix"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_elink_prefix</span></a></td>
+  <td class=xl83> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>LAPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>lapl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid LAPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Prefix for external link paths</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>prefix</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid file system path to be
+  prepended to filename stored in external link.<br>
+  <font class="font5">Default:
+  No prefix</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetELinkPrefix"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_elink_prefix</span></a></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>LAPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl106></td>
+  <td class=xl141>lapl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid LAPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Prefix for external link paths</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>prefix</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid file system path to be
+  prepended to filename stored in external link.<br>
+  <font class="font5">Default:
+  No prefix</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Size of prefix</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>size</td>
+  <td class=xl70 width=268 style='width:268pt'>Size of string specifying
+  prefix, with NULL terminator.<br>
+  <font class="font5">Default: No default
+  value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td colspan=2 class=xl84 width=197 style='width:197pt'>Maximum number of soft
+  or UD link<span style="mso-spacerun:yes">  </span>traversals</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get maximum number
+  of allowed soft or user-defined link traversals.</td>
+  <td class=xl86 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetNLinks"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_nlinks</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetNLinks"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_nlinks</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>LAPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>lapl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid LAPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Number of links</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Maximum number of links that may
+  be traversed.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>nlinks</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  maximum number of allowed link traversals.<br>
+  Default:<font class="font13"><span
+  style="mso-spacerun:yes"> </span>16</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=16 style='height:16.0pt'>
+  <td height=16 class=xl67 style='height:16.0pt'></td>
+  <td class=xl102> </td>
+  <td class=xl103> </td>
+  <td class=xl102> </td>
+  <td class=xl134 width=235 style='width:235pt'> </td>
+  <td class=xl134 width=11 style='width:11pt'> </td>
+  <td class=xl104> </td>
+  <td class=xl104> </td>
+  <td class=xl135 width=268 style='width:268pt'> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl94 height=16 style='page-break-before:always;height:16.0pt'>
+  <td height=16 class=xl94 style='height:16.0pt'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl95 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl99 width=235 style='border-top:none;width:235pt'> </td>
+  <td class=xl99 width=11 style='border-top:none;width:11pt'> </td>
+  <td class=xl101 style='border-top:none'> </td>
+  <td class=xl101 style='border-top:none'> </td>
+  <td class=xl96 width=268 style='border-top:none;width:268pt'> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+ </tr>
+ <tr height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 colspan=3 style='height:18.0pt;mso-ignore:colspan'>Group
+  Creation Property Lists (GCPL)</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=61 style='mso-height-source:userset;height:61.0pt'>
+  <td height=61 class=xl67 style='height:61.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Number of links and size
+  of link names</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get estimated
+  number lf links and length of link names.<br>
+  <font class="font9">Accurate
+  estimates will help reduce wasted file space.</font></td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetEstLinkInfo"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_est_link_info</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetEstLinkInfo"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_est_link_info</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>GCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>gcpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid GCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Number of links</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Estimated number of links to be
+  inserted into group.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>est_num_entries</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  expected number of links.<br>
+  <font class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Length of link names</td>
+  <td class=xl67></td>
+  <td class=xl67>Estimated average length of link names.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>est_num_len</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer indicating
+  expected average length of link names, in characters.<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Local heap size hint</td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Set/get anticipated
+  maximum local heap size.</td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetLocalHeapSizeHint"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_local_heap_size_hint</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl164></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetLocalHeapSizeHint"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_local_heap_size_hint</span></a></td>
+  <td class=xl69></td>
+  <td class=xl164></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>GCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>gcpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid GCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl159></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=90 style='height:90.0pt'>
+  <td height=90 class=xl67 style='height:90.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Size hint</td>
+  <td class=xl67></td>
+  <td class=xl67>Anticipated maximum local heap size.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>size_hint</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  anticipated maximum local heap size in bytes.<br>
+  0 (zero) directs HDF5 Library to make reasonable estimate.<br>
+  <font
+  class="font5">Default: 88 bytes </font><font class="font0">Estimate
+  calculated by HDF5 Library</font></td>
+  <td class=xl159></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Link creation order</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get tracking and
+  indexing on link creation order.</td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetLinkCreationOrder"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_link_creation_order</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetLinkCreationOrder"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_link_creation_order</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>GCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>gcpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid GCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=57 style='height:57.0pt'>
+  <td height=57 class=xl67 style='height:57.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Link creation order flags</td>
+  <td class=xl67></td>
+  <td class=xl67>Tracked or tracked-and-indexed.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>crt_order_flags</td>
+  <td class=xl72 width=268 style='width:268pt'>H5P_CRT_ORDER_TRACKED<br>
+  H5P_CRT_ORDER_INDEXED    <font
+  class="font29"> </font><font class="font9">(Requires 'tracked'.)</font><font
+  class="font0"><br>
+  </font><font class="font5">Default: Link creation order
+  is neither indexed nor tracked.</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='page-break-before:always;mso-height-source:userset;
+  height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Link storage phase change</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get thresholds for
+  conversion between compact and dense groups.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetLinkPhaseChange"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_link_phase_change</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetLinkPhaseChange"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_link_phase_change</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>GCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>gcpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid GCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl68 width=174 style='width:174pt'>Maximum number for compact
+  storage</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Maximum number of links to store
+  as header messages in group header before converting group to dense format.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>max_compact</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  maximum number of links for compact storage.<br>
+  <font class="font5">Default:
+  </font><font class="font39">8</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl68 width=174 style='width:174pt'>Minimum number for dense storage</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Minimum number of links to store
+  in dense format before converting group to compact format.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>min_dense</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  minimum number of links for dense storage.<br>
+  <font class="font5">Default:
+  </font><font class="font39">6</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='mso-height-source:userset;height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Gzip compression</td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Set/get gzip compression
+  and compression level.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetDeflate"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_deflate</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>GCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>gcpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid GCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=90 style='height:90.0pt'>
+  <td height=90 class=xl67 style='height:90.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Compression level</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Desired compression level .<br>
+  <font
+  class="font9">Setting compression level to 0 (zero) does not turn off use of
+  gzip filter, but sets filter to perform no compression as it processes the
+  data.</font></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>level</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer 0 (zero)
+  through 9:<br>
+  0 -- No compression.<br>
+  1 -- Best compression speed; least compression.<br>
+  2 through 8 -- Compression improves; speed slows.<br>
+  9 -- Best compression ratio; slowest speed.<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='mso-height-source:userset;height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Fletcher32 error
+  detection (checksum)</td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Set/get checksum error
+  detection (Fletcher32)</td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFletcher32"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_fletcher32</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl145> </td>
+  <td class=xl144>GCPL identifier</td>
+  <td class=xl145> </td>
+  <td class=xl145> </td>
+  <td class=xl145> </td>
+  <td class=xl145> </td>
+  <td class=xl147>gcpl_id</td>
+  <td class=xl176 width=268 style='width:268pt'>Valid GCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=16 style='height:16.0pt'>
+  <td height=16 class=xl67 style='height:16.0pt'></td>
+  <td class=xl153> </td>
+  <td class=xl153> </td>
+  <td class=xl153> </td>
+  <td class=xl153> </td>
+  <td class=xl153> </td>
+  <td class=xl155> </td>
+  <td class=xl155> </td>
+  <td class=xl154> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl94 height=16 style='page-break-before:always;height:16.0pt'>
+  <td height=16 class=xl94 style='height:16.0pt'> </td>
+  <td class=xl100 style='border-top:none'> </td>
+  <td class=xl95 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl97 style='border-top:none'> </td>
+  <td class=xl97 style='border-top:none'> </td>
+  <td class=xl95 style='border-top:none'> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+ </tr>
+ <tr height=18 style='mso-height-source:userset;height:18.0pt'>
+  <td height=18 class=xl73 colspan=3 style='height:18.0pt;mso-ignore:colspan'>Dataset
+  Creation Property Lists (DCPL)</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Allocation time</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get time at which
+  to allocate dataset storage.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetAllocTime"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_alloc_time</span></a></td>
+  <td class=xl83> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetAllocTime"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_alloc_time</span></a></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dcpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=67 style='height:67.0pt'>
+  <td height=67 class=xl67 style='height:67.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Allocation time</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>alloc_time</td>
+  <td class=xl173 width=268 style='width:268pt'>H5D_ALLOC_TIME_EARLY<br>
+  H5D_ALLOC_TIME_INCR <br>
+  H5D_ALLOC_TIME_LATE<br>
+  H5D_ALLOC_TIME_DEFAULT<br>
+  <font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>H5D_ALLOC_TIME_DEFAULT</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl81 colspan=2 style='mso-ignore:colspan'>Chunk size</td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Set/get chunk size.</td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetChunk"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_chunk</span></a></td>
+  <td class=xl82 width=268 style='width:268pt'> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetChunk"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_chunk</span></a></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dcpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl70 width=174 style='width:174pt'>Number of dimensions for each
+  chunk</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>ndims</td>
+  <td class=xl70 width=268 style='width:268pt'>Number of dimensions in array <font
+  class="font6">dim.</font><font class="font0"><br>
+  Must match rank of dataset.<br>
+  </font><font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69>Array specifying chunk size</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>dim</td>
+  <td class=xl66 width=268 style='width:268pt'>Unsigned integer array defining
+  chunk size in each dimension, in dataset elements.<br>
+  <font class="font5">Default:
+  No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=77 style='mso-height-source:userset;height:77.0pt'>
+  <td height=77 class=xl67 style='height:77.0pt'></td>
+  <td colspan=2 class=xl84 width=197 style='width:197pt'>External storage and
+  external file names</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get external
+  storage property and add file to list of external files. <br>
+  <font
+  class="font9">First call sets external storage property and adds first file
+  to list of external files. Subsequent calls add file as next file in list.</font></td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetExternal"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_external</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dcpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>External file name</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Name of external file.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>name</td>
+  <td class=xl68 width=268 style='width:268pt'>Name of external file.<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Data offset<span style="mso-spacerun:yes"> </span></td>
+  <td class=xl67></td>
+  <td class=xl67>Offset in file to beginning of data.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>offset</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  offset, in bytes, from beginning of file to data location.<br>
+  If passed as <font
+  class="font36">NULL</font><font class="font0"> in '</font><font class="font36">get</font><font
+  class="font0">' call, value is not returned.<br>
+  </font><font class="font5">Default:
+  No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Bytes reserved</td>
+  <td class=xl67></td>
+  <td class=xl67>Number of bytes reserved for data.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>size</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  number of bytes reserved in external file for data.<br>
+  If passed as <font
+  class="font36">NULL</font><font class="font0"> in </font><font class="font37">'</font><font
+  class="font36">get</font><font class="font37">'</font><font class="font0">
+  call, value is not returned.<br>
+  </font><font class="font5">Default: No
+  default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='page-break-before:always;height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetExternal"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_external</span></a></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl141>dcpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl68 width=174 style='width:174pt'>External file index</td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>idx</td>
+  <td class=xl70 width=268 style='width:268pt'>Value from <font class="font36">0</font><font
+  class="font0"> (zero) to </font><font class="font38">N</font><font
+  class="font36">-1</font><font class="font0">, where </font><font
+  class="font38">N</font><font class="font0"> is the value returned by </font><font
+  class="font36">H5Pget_external_count</font><font class="font0">.<br>
+  </font><font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67>External file name length</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>name_size</td>
+  <td class=xl70 width=268 style='width:268pt'>Length of name of external
+  file.<br>
+  If passed as <font class="font36">0</font><font class="font0">
+  (zero), value is not returned.<br>
+  </font><font class="font5">Default: No
+  default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>External file name</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Name of external file.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>name</td>
+  <td class=xl68 width=268 style='width:268pt'>Name of external file.<br>
+  </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Data offset<span style="mso-spacerun:yes"> </span></td>
+  <td class=xl67></td>
+  <td class=xl67>Offset in file to beginning of data.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>offset</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  offset, in bytes, from beginning of file to data location.<br>
+  If passed as <font
+  class="font36">NULL</font><font class="font0"> in '</font><font class="font36">get</font><font
+  class="font0">' call, value is not returned.<br>
+  </font><font class="font5">Default:
+  No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Bytes reserved</td>
+  <td class=xl67></td>
+  <td class=xl67>Number of bytes reserved for data.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>size</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  number of bytes reserved in external file for data.<br>
+  If passed as <font
+  class="font36">NULL</font><font class="font0"> in </font><font class="font37">'</font><font
+  class="font36">get</font><font class="font37">'</font><font class="font0">
+  call, value is not returned.<br>
+  </font><font class="font5">Default: No
+  default value</font></td>
+  <td class=xl67></td>
+  <td class=xl77></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Retrieve number of
+  external files</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Retrieve number of
+  external files associated with a dataset.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetExternalCount"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_external_count</span></a></td>
+  <td class=xl82 width=268 style='width:268pt'>Number of external files
+  returned<span style="mso-spacerun:yes">  </span>in function return value.</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl145> </td>
+  <td class=xl144>DCPL identifier</td>
+  <td class=xl145> </td>
+  <td class=xl145> </td>
+  <td class=xl145> </td>
+  <td class=xl152><u style='visibility:hidden;mso-ignore:visibility'> </u></td>
+  <td class=xl147>dcpl_id</td>
+  <td class=xl176 width=268 style='width:268pt'>Valid DCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67 colspan=2 style='mso-ignore:colspan'>Dataset layout</td>
+  <td class=xl67 colspan=2 style='mso-ignore:colspan'>Set/get dataset layout.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetLayout"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_layout</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dcpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=54 style='height:54.0pt'>
+  <td height=54 class=xl67 style='height:54.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67>Layout</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Flag specifying compact,
+  contiguous, or chunked storage layout.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>layout</td>
+  <td class=xl173 width=268 style='width:268pt'>H5D_COMPACT<br>
+  H5D_CONTIGUOUS<br>
+  H5D_CHUNKED<br>
+  <font
+  class="font5">Default:</font><font class="font39"> H5D_CONTIGUOUS</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetLayout"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_layout</span></a></td>
+  <td class=xl173 width=268 style='width:268pt'><font class="font0">Layout
+  returned as </font><font class="font13">H5Pget_layout</font><font
+  class="font0"><span style="mso-spacerun:yes"> </span>return value.</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106></td>
+  <td class=xl141>dcpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='page-break-before:always;height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Fill time</td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Set/get timing for
+  writing fill values to data.</td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFillTime"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_fill_time</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl159></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetFillTime"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_fill_time</span></a></td>
+  <td class=xl69></td>
+  <td class=xl159></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>dcpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl159></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=54 style='height:54.0pt'>
+  <td height=54 class=xl67 style='height:54.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl67>Fill time</td>
+  <td class=xl67></td>
+  <td class=xl67>Time at which to write fill values.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>fill_time</td>
+  <td class=xl173 width=268 style='width:268pt'>H5D_FILL_TIME_IFSET<br>
+  H5D_FILL_TIME_ALLOC<br>
+  H5D_FILL_TIME_NEVER<br>
+  <font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>H5D_FILL_TIME_IFSET</font></td>
+  <td class=xl159></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Fill value</td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Set/get value to be used
+  for fill value in data.</td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFillValue"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_fill_value</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl164></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetFillValue"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_fill_value</span></a></td>
+  <td class=xl69></td>
+  <td class=xl164></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>dcpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl159></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=75 style='height:75.0pt'>
+  <td height=75 class=xl67 style='height:75.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Fill value datatype</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>type_id</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid datatype identifier for
+  suitable datatype.<br>
+  <font class="font9">Datatype may differ from dataset
+  datatype, but HDF5 must be able to convert value to dataset datatype at
+  dataset creation</font><font class="font0">.<br>
+  </font><font class="font5">Default:
+  Dataset datatype specified at creation<span style="mso-spacerun:yes"> </span></font></td>
+  <td class=xl159></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Fill value</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>value</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid pointer to buffer
+  containing desired value.<br>
+  <font class="font5">Default:</font><font
+  class="font39"> 0 </font><font class="font5">(zero)</font></td>
+  <td class=xl159></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Gzip compression</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set gzip compression <font
+  class="font6">(H5Z_FILTER_DEFLATE</font><font class="font0">) and compression
+  level.</font></td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetDeflate"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_deflate</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dcpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=90 style='height:90.0pt'>
+  <td height=90 class=xl67 style='height:90.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Compression level</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Desired compression level .<br>
+  <font
+  class="font9">Setting compression level to 0 (zero) does not turn off use of
+  gzip filter, but sets filter to perform no compression as it processes the
+  data.</font></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>level</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer 0 (zero)
+  through 9:<br>
+  0 -- No compression.<br>
+  1 -- Best compression speed; least compression.<br>
+  2 through 8 -- Compression improves; speed slows.<br>
+  9 -- Best compression ratio; slowest speed.<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Fletcher32 error
+  detection (checksum)</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set checksum error
+  detection <font class="font6">(H5Z_FILTER_FLETCHER32</font><font class="font0">).</font></td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFletcher32"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_fletcher32</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl145> </td>
+  <td class=xl144>DCPL identifier</td>
+  <td class=xl145> </td>
+  <td class=xl145> </td>
+  <td class=xl145> </td>
+  <td class=xl145> </td>
+  <td class=xl147>dcpl_id</td>
+  <td class=xl176 width=268 style='width:268pt'>Valid DCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67 colspan=2 style='mso-ignore:colspan'>N-bit filter</td>
+  <td class=xl67 colspan=2 style='mso-ignore:colspan'>Set up use of n-bit
+  filter (<font class="font6">H5Z_FILTER_NBIT</font><font class="font0">).</font></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetNbit"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_nbit</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl145> </td>
+  <td class=xl144>DCPL identifier</td>
+  <td class=xl145> </td>
+  <td class=xl145> </td>
+  <td class=xl145> </td>
+  <td class=xl145> </td>
+  <td class=xl147>dcpl_id</td>
+  <td class=xl176 width=268 style='width:268pt'>Valid DCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=61 style='mso-height-source:userset;height:61.0pt'>
+  <td height=61 class=xl67 style='height:61.0pt'></td>
+  <td class=xl67 colspan=2 style='mso-ignore:colspan'>Scale-offset filter</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set up use of
+  scale-offset filter (<font class="font6">H5Z_FILTER_SCALEOFFSET</font><font
+  class="font0">).<br>
+  </font><font class="font9">Risk of unintentional lossy
+  compression; see reference manual entry.</font></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetScaleoffset"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_scaleoffset</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dcpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=43 style='height:43.0pt'>
+  <td height=43 class=xl67 style='height:43.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Compression method</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>scale_type</td>
+  <td class=xl172 width=268 style='width:268pt'>H5Z_SO_FLOAT_DSCALE<font
+  class="font9"><br>
+  </font><font class="font13">H5Z_SO_INT <br>
+  </font><font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=56 style='height:56.0pt'>
+  <td height=56 class=xl67 style='height:56.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Scale factor</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>scale_factor</td>
+  <td class=xl172 width=268 style='width:268pt'>H5Z_SO_FLOAT_DSCALE <font
+  class="font9"><br>
+  </font><font class="font13">H5Z_SO_INT <br>
+  H5Z_SO_INT_MINBITS_DEFAULT<br>
+  </font><font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='mso-height-source:userset;height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Shuffle filter</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set up use of shuffle
+  filter (<font class="font6">H5Z_FILTER_SHUFFLE</font><font class="font0">).</font></td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetShuffle"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_shuffle</span></a></td>
+  <td class=xl82 width=268 style='width:268pt'> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl145> </td>
+  <td class=xl144>DCPL identifier</td>
+  <td class=xl145> </td>
+  <td class=xl145> </td>
+  <td class=xl145> </td>
+  <td class=xl145> </td>
+  <td class=xl147>dcpl_id</td>
+  <td class=xl176 width=268 style='width:268pt'>Valid DCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=46 style='mso-height-source:userset;height:46.0pt'>
+  <td height=46 class=xl67 style='height:46.0pt'></td>
+  <td class=xl67 colspan=2 style='mso-ignore:colspan'>SZIP filter</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set up use of SZIP
+  filter (<font class="font6">H5Z_FILTER_SZIP</font><font class="font0">).<br>
+  </font><font
+  class="font9">Review "Limitations" section in RM entry before
+  using.</font></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetSzip"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_szip</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DCPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dcpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=56 style='height:56.0pt'>
+  <td height=56 class=xl67 style='height:56.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl70 width=174 style='width:174pt'>Entropy coding or nearest
+  neighbor coding as an unsigned integer bit mask</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>options_mask</td>
+  <td class=xl173 width=268 style='width:268pt'><font class="font0">Unsigned
+  integer bit mask specifying one of:</font><font class="font13"><br>
+  H5_SZIP_EC_OPTION_MASK<br>
+  H5_SZIP_NN_OPTION_MASK<br>
+  </font><font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=61 style='height:61.0pt'>
+  <td height=61 class=xl67 style='height:61.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl70 width=174 style='width:174pt'>Number of data elements (pixels <font
+  class="font15"><sup>2</sup></font><font class="font0">) per compression block</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>pixels_per_block</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  number of data elements (pixels <font class="font15"><sup>2 </sup></font><font
+  class="font0">) per block.<br>
+  Even integer greater than 0 and not exceeding 32.<br>
+  </font><font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=46 style='mso-height-source:userset;height:46.0pt'>
+  <td height=46 class=xl67 style='height:46.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Number of filters
+  associated with DCPL</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Query number of
+  filters set on a dataset creation property list (DCPL).<br>
+  Number of filters returned in function return value.</td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetNFilters"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_nfilters</span></a></td>
+  <td class=xl81>Number of filters returned as function return value.</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl145> </td>
+  <td class=xl144>DCPL identifier</td>
+  <td class=xl145> </td>
+  <td class=xl145> </td>
+  <td class=xl145> </td>
+  <td class=xl152><u style='visibility:hidden;mso-ignore:visibility'> </u></td>
+  <td class=xl147>dcpl_id</td>
+  <td class=xl176 width=268 style='width:268pt'>Valid DCPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=16 style='height:16.0pt'>
+  <td height=16 class=xl67 style='height:16.0pt'></td>
+  <td class=xl153> </td>
+  <td class=xl154> </td>
+  <td class=xl153> </td>
+  <td class=xl156> </td>
+  <td class=xl156> </td>
+  <td class=xl155> </td>
+  <td class=xl155> </td>
+  <td class=xl154> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl94 height=14 style='page-break-before:always;mso-height-source:
+  userset;height:14.0pt'>
+  <td height=14 class=xl94 style='height:14.0pt'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl95 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl101 style='border-top:none'> </td>
+  <td class=xl101 style='border-top:none'> </td>
+  <td class=xl95 style='border-top:none'> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+ </tr>
+ <tr height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 colspan=3 style='height:18.0pt;mso-ignore:colspan'>Dataset
+  Access Property Lists (DCPL)</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl72 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td colspan=2 class=xl82 width=197 style='width:197pt'>Raw data chunk cache
+  (RDCC) properties</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get chunk cache
+  properties on per-dataset basis.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetChunkSize"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_chunk_cache</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetChunkSize"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_chunk_cache</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DAPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dapl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DAPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Number of elements in RDCC</td>
+  <td class=xl67></td>
+  <td class=xl67 colspan=2 style='mso-ignore:colspan'>Number of chunk slots in
+  RDCC for this dataset.</td>
+  <td class=xl71></td>
+  <td class=xl71>rdcc_nslots</td>
+  <td class=xl70 width=268 style='width:268pt'>Non-negative integer.<br>
+  If passed as <font
+  class="font36">NULL</font><font class="font0"> in '</font><font class="font36">get</font><font
+  class="font0">' call, value is not returned.<br>
+  </font><font class="font5">Default:</font><font
+  class="font39"><span style="mso-spacerun:yes"> </span>521</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Total size of RDCC</td>
+  <td class=xl67></td>
+  <td class=xl67>Total size of RDCC for this dataset.</td>
+  <td></td>
+  <td class=xl71></td>
+  <td class=xl71>rdcc_nbytes</td>
+  <td class=xl70 width=268 style='width:268pt'>Non-negative integer stating
+  size in bytes.<br>
+  If passed as <font class="font36">NULL</font><font
+  class="font0"> in '</font><font class="font36">get</font><font class="font0">'
+  call, value is not returned.<br>
+  </font><font class="font5">Default:</font><font
+  class="font39"><span style="mso-spacerun:yes"> </span>1024</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Preemption policy</td>
+  <td class=xl67></td>
+  <td class=xl67>Chunk preemption policy for this dataset.</td>
+  <td></td>
+  <td class=xl71></td>
+  <td class=xl71>rdcc_w0</td>
+  <td class=xl70 width=268 style='width:268pt'>Real number between 0 (zero) and
+  1 (one), inclusive.<br>
+  If passed as <font class="font36">NULL</font><font
+  class="font0"> in '</font><font class="font36">ge</font><font class="font0">t'
+  call, value is not returned.<br>
+  </font><font class="font5">Default:</font><font
+  class="font39"><span style="mso-spacerun:yes"> </span>0.75</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83> </td>
+  <td class=xl81> </td>
+  <td class=xl83> </td>
+  <td class=xl83> </td>
+  <td class=xl83> </td>
+  <td class=xl85> </td>
+  <td class=xl85> </td>
+  <td class=xl82 width=268 style='width:268pt'> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=16 style='height:16.0pt'>
+  <td height=16 class=xl67 style='height:16.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl94 height=16 style='page-break-before:always;height:16.0pt'>
+  <td height=16 class=xl94 style='height:16.0pt'> </td>
+  <td class=xl94> </td>
+  <td class=xl95> </td>
+  <td class=xl94> </td>
+  <td class=xl98 width=235 style='width:235pt'> </td>
+  <td class=xl98 width=11 style='width:11pt'> </td>
+  <td class=xl101> </td>
+  <td class=xl101> </td>
+  <td class=xl95> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+ </tr>
+ <tr height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 colspan=3 style='height:18.0pt;mso-ignore:colspan'>Dataset
+  Transfer Property Lists (DXPL)</td>
+  <td class=xl67></td>
+  <td class=xl66 width=235 style='width:235pt'></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Btree ratios</td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Set/get B-tree split
+  ratios.</td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetBTreeRatios"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_btree_ratios</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetBTreeRatios"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_btree_ratios</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DXPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dxpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DXPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Left-most nodes</td>
+  <td class=xl67></td>
+  <td class=xl67>Split ratio for left-most node at a level.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>left</td>
+  <td class=xl70 width=268 style='width:268pt'>Real number between 0 (zero) and
+  1 (one), inclusive.<br>
+  <font class="font5">Default:</font><font
+  class="font39"><span style="mso-spacerun:yes"> </span>0.1</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Right-most nodes</td>
+  <td class=xl67></td>
+  <td class=xl67>Split ratio for right-most node at a level.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>middle</td>
+  <td class=xl70 width=268 style='width:268pt'>Real number between 0 (zero) and
+  1 (one), inclusive.<br>
+  <font class="font5">Default:</font><font
+  class="font39"><span style="mso-spacerun:yes"> </span>0.5</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>All other nodes</td>
+  <td class=xl67></td>
+  <td class=xl67>Split ratio for all other nodes at a level.</td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>right</td>
+  <td class=xl70 width=268 style='width:268pt'>Real number between 0 (zero) and
+  1 (one), inclusive.<br>
+  <font class="font5">Default:</font><font
+  class="font39"><span style="mso-spacerun:yes"> </span>0.9</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='mso-height-source:userset;height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Buffer properties</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get type
+  conversion and background buffers.</td>
+  <td class=xl93> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetBuffer"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_buffer</span></a></td>
+  <td class=xl83> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='mso-height-source:userset;height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td></td>
+  <td class=xl106></td>
+  <td class=xl71></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DXPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dxpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DXPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Size of buffer</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>size</td>
+  <td class=xl70 width=268 style='width:268pt'>Must be large enough to
+  accommodate complete slice that encompasses all but first dimension.<br>
+  <font
+  class="font5">Default: 1MB</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Conversion buffer</td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl71></td>
+  <td class=xl71>tconv</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid void pointer to conversion
+  buffer.<br>
+  <font class="font5">Default: No conversion buffer</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Background buffer</td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl71></td>
+  <td class=xl71>bkg</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid void pointer to background
+  buffer.<br>
+  <font class="font5">Default: No background buffer</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetBuffer"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_buffer</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DXPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl106></td>
+  <td class=xl141>dxpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DXPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Conversion buffer</td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl71></td>
+  <td class=xl71>tconv</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid void pointer to conversion
+  buffer.<br>
+  <font class="font5">Default: No conversion buffer</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Background buffer</td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl71></td>
+  <td class=xl71>bkg</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid void pointer to background
+  buffer.<br>
+  <font class="font5">Default: No background buffer</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=77 style='page-break-before:always;mso-height-source:userset;
+  height:77.0pt'>
+  <td height=77 class=xl67 style='height:77.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Data transform expression</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get transform
+  expression to be used upon reading a dataset.<br>
+  Null-terminated string containing an algebraic expression, such as '<font
+  class="font6">(5/9.0)*(x-32</font><font class="font0">)'<br>
+  or  '</font><font
+  class="font6">x*(x-5)'.</font></td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetDataTransform"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_data_transform</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DXPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dxpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DXPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Transform expression</td>
+  <td class=xl67></td>
+  <td class=xl66 width=235 style='width:235pt'>Pointer to null-terminated data
+  transform expression.</td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>expression</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid pointer to buffer
+  containing transform expression.<br>
+  <font class="font5">Default: No
+  transform expression</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl66 width=235 style='width:235pt'></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetDataTransform"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_data_transform</span></a></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DXPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl66 width=235 style='width:235pt'></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl106></td>
+  <td class=xl141>dxpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DXPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Transform expression</td>
+  <td class=xl67></td>
+  <td class=xl66 width=235 style='width:235pt'></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>expression</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid pointer to buffer
+  containing transform expression.<br>
+  <font class="font5">Default: No
+  transform expression</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Size of transform expression</td>
+  <td class=xl67></td>
+  <td class=xl66 width=235 style='width:235pt'></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>size</td>
+  <td class=xl70 width=268 style='width:268pt'>Size in bytes of transform
+  expressioin to copy to.<br>
+  <font class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Data transfer mode
+  (application level)</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get collective or
+  independent I/O mode with MPI at application level.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetDxplMpio"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_dxpl_mpio</span></a></td>
+  <td class=xl83> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetDxplMpio"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_dxpl_mpio</span></a></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DXPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dxpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DXPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Transfer mode flag</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>xfer mode</td>
+  <td class=xl70 width=268 style='width:268pt'><font class="font13">H5FD_MPIO_INDEPENDENT
+  </font><font class="font0">(Independent I/O)</font><font class="font13"><br>
+  H5FD_MPIO_COLLECTIVE </font><font
+  class="font0">(Collective I/O)</font><font class="font13"><br>
+  </font><font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>H5FD_MPIO_INDEPENDENT<span
+  style="mso-spacerun:yes"> </span></font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=61 style='mso-height-source:userset;height:61.0pt'>
+  <td height=61 class=xl67 style='height:61.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Data transfer mode
+  (internally in HDF5)</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set flag for
+  HDF5-internal use of collective or independent I/O.<br>
+  For use only when<font
+  class="font6"> H5FD_MPIO_COLLECTIVE</font><font class="font0"> has been set (</font><font
+  class="font6">H5Pset_dxpl_mpio</font><font class="font0">).</font></td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=3 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetDxplMpioCollectiveOpt"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_dxpl_mpio_collective_opt</span></a></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DXPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dxpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DXPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Optimization flag</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>opt_mode</td>
+  <td class=xl70 width=268 style='width:268pt'><font class="font36">H5FD_MPIO_INDEPENDENT_IO
+  </font><font class="font0">(Independent I/O)</font><font class="font13"><br>
+  </font><font
+  class="font36">H5FD_MPIO_COLLECTIVE_IO </font><font class="font0">(Collective
+  I/O)</font><font class="font13"><br>
+  </font><font class="font5">Default:</font><font
+  class="font39"><span style="mso-spacerun:yes"> </span>H5FD_MPIO_COLLECTIVE_IO</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='page-break-before:always;mso-height-source:userset;
+  height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Linked-chunk and
+  multi-chunk I/O</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set linked-chunk I/O
+  or multi-chunk I/O.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetDxplMpioChunkOpt"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_dxpl_mpio_chunk_opt</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DXPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dxpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DXPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=75 style='height:75.0pt'>
+  <td height=75 class=xl67 style='height:75.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Optimization flag</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>opt_mode</td>
+  <td class=xl70 width=268 style='width:268pt'><font class="font6">H5FD_MPIO_CHUNK_ONE_IO</font><font
+  class="font0">  <br>
+          Single linked-chunk operation.<br>
+  </font><font
+  class="font6">H5FD_MPIO_CHUNK_MULTI_IO  </font><font class="font0"><br>
+          Multi-chunk operation.<br>
+  </font><font
+  class="font5">Default: Selected by HDF5 Library</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Linked-chunk I/O
+  threshold count</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set threshold count
+  over which linked-chunk I/O is to be performed.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetDxplMpioChunkOptNum"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_dxpl_mpio_chunk_opt_num</span></a></td>
+  <td class=xl83> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DXPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dxpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DXPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl70 width=174 style='width:174pt'>Numeric threshold<span
+  style="mso-spacerun:yes"> </span></td>
+  <td class=xl67></td>
+  <td class=xl70 width=235 style='width:235pt'>Numeric threshold for performing
+  linked-chunk I/O.</td>
+  <td class=xl70 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>num_chunk_per_proc</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer specifying
+  count threshold.<br>
+  <font class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl67 height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Linked-chunk I/O
+  threshold ratio</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set threshold ratio
+  over which linked-chunk I/O is to be performed.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=3 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetDxplMpioChunkOptRatio"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_dxpl_mpio_chunk_opt_ratio</span></a></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DXPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dxpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DXPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Percent threshold</td>
+  <td class=xl67></td>
+  <td class=xl70 width=235 style='width:235pt'>Percent threshold for performing
+  linked-chunk I/O.</td>
+  <td class=xl70 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>percent_chunk_per_proc</td>
+  <td class=xl70 width=268 style='width:268pt'>Unsigned integer, between 0
+  (zero) and 100 inclusive, specifying percent threshold .<br>
+  <font
+  class="font5">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl108 height=61 style='mso-height-source:userset;height:61.0pt'>
+  <td height=61 class=xl108 style='height:61.0pt'></td>
+  <td class=xl115 colspan=2 style='mso-ignore:colspan'>Multi driver for I/O
+  access</td>
+  <td colspan=2 class=xl117 width=258 style='width:258pt'>Set/get use of
+  multi-file driver (<font class="font19">H5FD_MULTI</font><font class="font18">)
+  for each memory usage type.<br>
+  </font><font class="font21">Requires that
+  H5FD_MULTI driver be set (</font><font class="font30">H5Pset_fapl_multi</font><font
+  class="font21">)</font></td>
+  <td class=xl117 width=11 style='width:11pt'> </td>
+  <td class=xl124 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetDxplMulti"><span
+  style='color:#DA9694;font-size:10.0pt;font-family:Courier;mso-generic-font-family:
+  auto;mso-font-charset:0'>H5Pset_dxpl_multi</span></a></td>
+  <td class=xl115> </td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+ </tr>
+ <tr class=xl108 height=15 style='height:15.0pt'>
+  <td height=15 class=xl108 style='height:15.0pt'></td>
+  <td class=xl108></td>
+  <td class=xl112></td>
+  <td class=xl113 width=23 style='width:23pt'></td>
+  <td class=xl113 width=235 style='width:235pt'></td>
+  <td class=xl113 width=11 style='width:11pt'></td>
+  <td class=xl158 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetDxplMulti"><span
+  style='color:#DA9694;font-size:10.0pt;font-family:Courier;mso-generic-font-family:
+  auto;mso-font-charset:0'>H5Pget_dxpl_multi</span></a></td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl108></td>
+  <td class=xl112>DXPL identifier</td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+  <td class=xl108></td>
+  <td class=xl114>dxpl_id</td>
+  <td class=xl121 width=268 style='width:268pt'>Valid DXPL identifier<br>
+  <font
+  class="font42">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl108></td>
+  <td class=xl112>Member file DXPLs</td>
+  <td class=xl108></td>
+  <td class=xl108>Array of data access property lists.</td>
+  <td class=xl108></td>
+  <td class=xl114></td>
+  <td class=xl114>memb_dxpl</td>
+  <td class=xl121 width=268 style='width:268pt'>Array of dataset access
+  property lists per memory type.<br>
+  <font class="font42">Default:</font><font
+  class="font49"> H5P_DEFAULT </font><font class="font42">for each element</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=61 style='page-break-before:always;mso-height-source:userset;
+  height:61.0pt'>
+  <td height=61 class=xl67 style='height:61.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Checksum error checking</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Enable or disable
+  error detection (Fletcher32 checksum) when reading data.<br>
+  <font
+  class="font9">Requires that error checking is set (</font><font class="font29">H5Pset_fletcher32</font><font
+  class="font9">).</font></td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetEdcCheck"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_edc_check</span></a></td>
+  <td class=xl83> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DXPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dxpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DXPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=41 style='height:41.0pt'>
+  <td height=41 class=xl67 style='height:41.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Enable/Disable flag</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'>Flag specifying whether to
+  enable or disable error detection.</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>check</td>
+  <td class=xl173 width=268 style='width:268pt'>H5Z_ENABLE_EDC <br>
+  H5Z_DISABLE_EDC<br>
+  <font
+  class="font5">Default: </font><font class="font39">H5Z_ENABLE_EDC<span
+  style="mso-spacerun:yes"> </span></font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetEdcCheck"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_edc_check</span></a></td>
+  <td class=xl68 width=268 style='width:268pt'>Setting returned in function
+  return value.</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DXPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl141>dxpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DXPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Filter callback function</td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Set user-defined filter
+  callback function.</td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFilterCallback"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_filter_callback</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DXPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dxpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DXPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl68 width=174 style='width:174pt'>User-defined filter callback
+  function</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>func</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid user-defined callback
+  function.<br>
+  <font class="font5">Default: No user-defined callback
+  function</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl68 width=174 style='width:174pt'>User-defined<span
+  style="mso-spacerun:yes">  </span>callback function input data</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>op_data</td>
+  <td class=xl70 width=268 style='width:268pt'>User-defined callback function
+  data.<br>
+  <font class="font5">Default: No user-defined input data</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td colspan=2 class=xl84 width=197 style='width:197pt'>Number of I/O vectors
+  for hyperslab I/O</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get number of I/O
+  vectors to accumulate before being issued for lower-level I/O</td>
+  <td class=xl86 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetHyperVectorSize"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_hyper_vector_size</span></a></td>
+  <td class=xl82 width=268 style='width:268pt'> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetHyperVectorSize"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_hyper_vector_size</span></a></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DXPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dxpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DXPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=60 style='height:60.0pt'>
+  <td height=60 class=xl67 style='height:60.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Number of vectors to accumulate</td>
+  <td class=xl67></td>
+  <td class=xl66 width=235 style='width:235pt'>Number of I/O vectors to
+  accumulate in memory before issuing for lower-level reading or writing of
+  actual data.</td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>vector_size</td>
+  <td class=xl70 width=268 style='width:268pt'>Number of I/O vectors to
+  accumulate in memory for I/O operations.<br>
+  Must be greater than 1 (one).<br>
+  <font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>1024</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=61 style='mso-height-source:userset;height:61.0pt'>
+  <td height=61 class=xl67 style='height:61.0pt'></td>
+  <td colspan=2 class=xl84 width=197 style='width:197pt'>Preserve status of
+  partial compound type writes</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Preserve read or write
+  status when destination compound datatypes are partially initialized.<br>
+  <font
+  class="font9">Functions deprecated because this status is now always
+  preserved.</font></td>
+  <td class=xl86 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetPreserve"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_preserve</span></a></td>
+  <td class=xl84 width=268 style='width:268pt'> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DXPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dxpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DXPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>Status</td>
+  <td class=xl67></td>
+  <td class=xl66 width=235 style='width:235pt'></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>status</td>
+  <td class=xl70 width=268 style='width:268pt'><font class="font13">TRUE </font><font
+  class="font0">-- Status preserved.</font><font class="font0"><br>
+  </font><font
+  class="font13">FALSE </font><font class="font0">-- Status not preserved.<br>
+  </font><font
+  class="font5">Default:</font><font class="font39"><span
+  style="mso-spacerun:yes"> </span>FALSE</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='page-break-before:always;height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl66 width=235 style='width:235pt'></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetPreserve"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_preserve</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DXPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl66 width=235 style='width:235pt'></td>
+  <td class=xl66 width=11 style='width:11pt'></td>
+  <td class=xl106></td>
+  <td class=xl141>dxpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DXPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Datatype conversion
+  callback function</td>
+  <td class=xl83 colspan=2 style='mso-ignore:colspan'>Set/get datatype
+  conversion callback function.</td>
+  <td class=xl83> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetTypeConvCb"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pset_type_conv_cb</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetTypeConvCb"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_type_conv_cb</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DXPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dxpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DXPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl70 width=174 style='width:174pt'>User-defined datatype conversion
+  callback function</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>func</td>
+  <td class=xl70 width=268 style='width:268pt'>Valid user-defined callback
+  function.<br>
+  <font class="font5">Default: No user-defined callback
+  function</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl68 width=174 style='width:174pt'>User-provided data for callback
+  function</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>op_data</td>
+  <td class=xl70 width=268 style='width:268pt'>User-defined callback function
+  data.<br>
+  <font class="font5">Default: No user-defined input data</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td colspan=2 class=xl84 width=197 style='width:197pt'>Memory manager for VL
+  datatype allocation</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get memory manager
+  for variable-length (VL) datatype allocation.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="../RM/RM_H5P.html#Property-SetVLMemManager"><span style='font-size:
+  10.0pt;font-family:Courier;mso-generic-font-family:auto;mso-font-charset:
+  0'>H5Pset_vlen_mem_manager</span></a></td>
+  <td class=xl81> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetVLMemManager"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_vlen_mem_manager</span></a></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>DXPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>dxpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid DXPL identifier<br>
+  <font
+  class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>User-defined allocation routine</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>alloc</td>
+  <td class=xl70 width=268 style='width:268pt'>User-defined allocation
+  routine.<br>
+  <font class="font6">NULL</font><font class="font0"> for system
+  </font><font class="font6">malloc.<br>
+  </font><font class="font5">Default:
+  No user-defined allocation routine</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl70 width=174 style='width:174pt'>Extra parameter that wil be
+  passed to user-defined allocation routine</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>alloc_info</td>
+  <td class=xl70 width=268 style='width:268pt'>Extra parameter to be passed to
+  allocation routine.<br>
+  Ignored if routine is <font class="font6">NULL</font><font
+  class="font0">.<br>
+  </font><font class="font5">Default: No suppementary
+  data</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>User-defined free routine</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>free</td>
+  <td class=xl70 width=268 style='width:268pt'>User-defined free routine.<br>
+  <font
+  class="font6">NULL</font><font class="font0"> for system </font><font
+  class="font6">free.<br>
+  </font><font class="font5">Default: No user-defined
+  free routine</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl70 width=174 style='width:174pt'>Extra parameter that will be
+  passed to user-defined free routine</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl71></td>
+  <td class=xl71>free_info</td>
+  <td class=xl70 width=268 style='width:268pt'>Extra parameter to be passed to
+  free routine.<br>
+  Ignored if routine is <font class="font6">NULL</font><font
+  class="font0">.<br>
+  </font><font class="font5">Default: No supplementary
+  data</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=16 style='height:16.0pt'>
+  <td height=16 class=xl67 style='height:16.0pt'></td>
+  <td class=xl102> </td>
+  <td class=xl103> </td>
+  <td class=xl102> </td>
+  <td class=xl134 width=235 style='width:235pt'> </td>
+  <td class=xl134 width=11 style='width:11pt'> </td>
+  <td class=xl104> </td>
+  <td class=xl104> </td>
+  <td class=xl136 width=268 style='width:268pt'> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl94 height=16 style='page-break-before:always;height:16.0pt'>
+  <td height=16 class=xl94 style='height:16.0pt'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl95 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl94 style='border-top:none'> </td>
+  <td class=xl101 style='border-top:none'> </td>
+  <td class=xl101 style='border-top:none'> </td>
+  <td class=xl96 width=268 style='border-top:none;width:268pt'> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+ </tr>
+ <tr height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 colspan=4 style='height:18.0pt;mso-ignore:colspan'>Attribution
+  Creation Property Lists (ACPL)</td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=31 style='mso-height-source:userset;height:31.0pt'>
+  <td height=31 class=xl67 style='height:31.0pt'></td>
+  <td class=xl81 colspan=2 style='mso-ignore:colspan'>Character encoding</td>
+  <td colspan=2 class=xl84 width=258 style='width:258pt'>Set/get character
+  encoding used for link and attribute names.</td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl107 colspan=2 style='mso-ignore:colspan'><a
+  href="../RM/RM_H5P.html#Property-SetCharEncoding"><span style='font-size:
+  10.0pt;font-family:Courier;mso-generic-font-family:auto;mso-font-charset:
+  0'>H5Pset_char_encoding</span></a></td>
+  <td class=xl83> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl68 width=23 style='width:23pt'></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl106 colspan=2 style='mso-ignore:colspan'><a
+  href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-GetCharEncoding"><span
+  style='font-size:10.0pt;font-family:Courier;mso-generic-font-family:auto;
+  mso-font-charset:0'>H5Pget_char_encoding</span></a></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=30 style='height:30.0pt'>
+  <td height=30 class=xl67 style='height:30.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69>ACPL identifier</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+  <td class=xl141>acpl_id</td>
+  <td class=xl175 width=268 style='width:268pt'>Valid ACPL or LCPL
+  identifier<br>
+  <font class="font41">Default: No default value</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=45 style='height:45.0pt'>
+  <td height=45 class=xl67 style='height:45.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69>Character encoding</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71>encoding</td>
+  <td class=xl173 width=268 style='width:268pt'>H5T_CSET_ASCII <font
+  class="font0">(US ASCII)</font><font class="font13"><br>
+  H5T_CSET_UTF8 </font><font
+  class="font0">(UTF-8 Unicode)<br>
+  </font><font class="font5">Default:</font><font
+  class="font39"><span style="mso-spacerun:yes"> </span>H5T_CSET_ASCII</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl81> </td>
+  <td class=xl81> </td>
+  <td class=xl83> </td>
+  <td class=xl84 width=235 style='width:235pt'> </td>
+  <td class=xl84 width=11 style='width:11pt'> </td>
+  <td class=xl85> </td>
+  <td class=xl85> </td>
+  <td class=xl88 width=268 style='width:268pt'> </td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl72 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl72 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl72 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl72 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl69></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl72 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=16 style='height:16.0pt'>
+  <td height=16 class=xl67 style='height:16.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl94 height=16 style='height:16.0pt'>
+  <td height=16 class=xl94 style='height:16.0pt'> </td>
+  <td class=xl94> </td>
+  <td class=xl95> </td>
+  <td class=xl94> </td>
+  <td class=xl99 width=235 style='width:235pt'> </td>
+  <td class=xl99 width=11 style='width:11pt'> </td>
+  <td class=xl101> </td>
+  <td class=xl101> </td>
+  <td class=xl96 width=268 style='width:268pt'> </td>
+  <td class=xl94> </td>
+  <td class=xl94> </td>
+ </tr>
+ <tr class=xl67 height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 style='height:18.0pt'></td>
+  <td class=xl77 colspan=2 style='mso-ignore:colspan'>Footnotes</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=15 style='height:15.0pt'>
+  <td height=15 class=xl67 style='height:15.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl157 width=174 style='width:174pt'></td>
+  <td class=xl157 width=23 style='width:23pt'></td>
+  <td class=xl157 width=235 style='width:235pt'></td>
+  <td class=xl157 width=11 style='width:11pt'></td>
+  <td class=xl157 width=23 style='width:23pt'></td>
+  <td class=xl157 width=164 style='width:164pt'></td>
+  <td class=xl157 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=18 style='mso-height-source:userset;height:18.0pt'>
+  <td height=18 class=xl67 style='height:18.0pt'></td>
+  <td class=xl67 align=right>1</td>
+  <td class=xl69 colspan=7 style='mso-ignore:colspan'><font class="font6">H5P_DEFAULT</font><font
+  class="font0"> is HDF5's default property list for the appropriate class. 
+  For example, in a file access property list (FAPL) context, </font><font
+  class="font6">H5P_DEFAULT</font><font class="font0"><span
+  style="mso-spacerun:yes"> </span>would represent the default FAPL.</font></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr height=18 style='mso-height-source:userset;height:18.0pt'>
+  <td height=18 class=xl67 style='height:18.0pt'></td>
+  <td class=xl67 align=right>2</td>
+  <td colspan=6 class=xl69><font class="font9">Pixel</font><font class="font0">
+  is SZIP terminology referring, in this context, to</font><font class="font0"><span
+  style="mso-spacerun:yes"> </span>an HDF5 data element.</font></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl67 height=18 style='mso-height-source:userset;height:18.0pt'>
+  <td height=18 class=xl73 style='height:18.0pt'></td>
+  <td class=xl67 align=right>3</td>
+  <td colspan=6 class=xl68 width=630 style='width:630pt'>An external link
+  traversal callback function set by <font class="font6">H5Pset_elink_cb</font><font
+  class="font0"> can override access settings from </font><font class="font6">H5Pset_elink_acc_flags</font><font
+  class="font0">.</font></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl67 height=18 style='mso-height-source:userset;height:18.0pt'>
+  <td height=18 class=xl73 style='height:18.0pt'></td>
+  <td class=xl67 align=right>4</td>
+  <td class=xl69 colspan=3 style='mso-ignore:colspan'><font class="font6">H5F_FAMILY_DEFAULT</font><font
+  class="font0"><span style="mso-spacerun:yes"> </span>is the default size of
+  member files for the family driver.</font></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl67 height=19 style='height:19.0pt'>
+  <td height=19 class=xl73 style='height:19.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl129 height=19 style='height:19.0pt'>
+  <td height=19 class=xl128 style='height:19.0pt'> </td>
+  <td class=xl129> </td>
+  <td class=xl130> </td>
+  <td class=xl129> </td>
+  <td class=xl131 width=235 style='width:235pt'> </td>
+  <td class=xl131 width=11 style='width:11pt'> </td>
+  <td class=xl133> </td>
+  <td class=xl133> </td>
+  <td class=xl132 width=268 style='width:268pt'> </td>
+  <td class=xl129> </td>
+  <td class=xl129> </td>
+ </tr>
+ <tr class=xl67 height=19 style='page-break-before:always;height:19.0pt'>
+  <td height=19 class=xl73 style='height:19.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl129 height=19 style='height:19.0pt'>
+  <td height=19 class=xl128 style='height:19.0pt'> </td>
+  <td class=xl129> </td>
+  <td class=xl130> </td>
+  <td class=xl129> </td>
+  <td class=xl131 width=235 style='width:235pt'> </td>
+  <td class=xl131 width=11 style='width:11pt'> </td>
+  <td class=xl133> </td>
+  <td class=xl133> </td>
+  <td class=xl132 width=268 style='width:268pt'> </td>
+  <td class=xl129> </td>
+  <td class=xl129> </td>
+ </tr>
+ <tr class=xl67 height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 style='height:18.0pt'></td>
+  <td class=xl77 colspan=4 style='mso-ignore:colspan'>Development notes<font
+  class="font0"><span style="mso-spacerun:yes"> </span>(Delete before
+  publication)</font></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl67 height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 style='height:18.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl159 colspan=4 style='mso-ignore:colspan'>H5Pset_scale_offset: The
+  parameter value  <font class="font32">H5Z_SO_FLOAT_ESCALE </font><font
+  class="font10">is not implemented.</font></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl67 height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 style='height:18.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl159 colspan=6 style='mso-ignore:colspan'>H5Pget_sizes: Will
+  "Normally 8 bytes" change when address space changes (anticipated
+  for 1.10)?</td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl67 height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 style='height:18.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl159 colspan=7 style='mso-ignore:colspan'>H5Pset_fapl_log: In
+  "Maximum size, in bytes, of the file to be logged", is that the
+  size of the 'logfile' or of the file being accessed?</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl67 height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 style='height:18.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl159 colspan=3 style='mso-ignore:colspan'>H5Pset_fapl_multi:
+  Deprecation status?</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl67 height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 style='height:18.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl159>H5Pset_fapl_split:<span
+  style="mso-spacerun:yes">                  </span>"</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl67 height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 style='height:18.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl159>H5Pset_dxpl_multi:<span
+  style="mso-spacerun:yes">                </span>"</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl67 height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 style='height:18.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl159>H5Pset_multi_type:<span
+  style="mso-spacerun:yes">               </span>"</td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl67 height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 style='height:18.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl159 colspan=3 style='mso-ignore:colspan'>H5Pset_fapl_multi: Need
+  help with what to say for this function (or its parameters).</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl67 height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 style='height:18.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl159></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl67 height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 style='height:18.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl159 colspan=6 style='mso-ignore:colspan'>For the above MULTI
+  driver functions, should we say they're deprecated (the very miniumum) or
+  just not include them at all?</td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl67 height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 style='height:18.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl159 colspan=3 style='mso-ignore:colspan'>And should the STREAM
+  driver properties<span style="mso-spacerun:yes">  </span>be listed?</td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl67 height=18 style='height:18.0pt'>
+  <td height=18 class=xl73 style='height:18.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl159 colspan=7 style='mso-ignore:colspan'>In both cases, the issue
+  is that while these functions are no longer in the library, users may
+  continue to run across files containing obects written with the properties.</td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl67 height=19 style='height:19.0pt'>
+  <td height=19 class=xl73 style='height:19.0pt'></td>
+  <td class=xl67></td>
+  <td class=xl69></td>
+  <td class=xl67></td>
+  <td class=xl68 width=235 style='width:235pt'></td>
+  <td class=xl68 width=11 style='width:11pt'></td>
+  <td class=xl71></td>
+  <td class=xl71></td>
+  <td class=xl70 width=268 style='width:268pt'></td>
+  <td class=xl67></td>
+  <td class=xl67></td>
+ </tr>
+ <tr class=xl129 height=19 style='height:19.0pt'>
+  <td height=19 class=xl128 style='height:19.0pt'> </td>
+  <td class=xl129> </td>
+  <td class=xl130> </td>
+  <td class=xl129> </td>
+  <td class=xl131 width=235 style='width:235pt'> </td>
+  <td class=xl131 width=11 style='width:11pt'> </td>
+  <td class=xl133> </td>
+  <td class=xl133> </td>
+  <td class=xl132 width=268 style='width:268pt'> </td>
+  <td class=xl129> </td>
+  <td class=xl129> </td>
+ </tr>
+</table>
+
+</body>
+
+</html>
diff --git a/html/RM/Properties_ReferenceTable.xlsx b/html/RM/Properties_ReferenceTable.xlsx
new file mode 100644
index 0000000..1185576
Binary files /dev/null and b/html/RM/Properties_ReferenceTable.xlsx differ
diff --git a/html/RM/RM_H5.html b/html/RM/RM_H5.html
index fe4b66a..c22f4db 100644
--- a/html/RM/RM_H5.html
+++ b/html/RM/RM_H5.html
@@ -39,7 +39,8 @@ HDF5/H5 API Specification
 <td valign="top" align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -70,12 +71,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
@@ -266,12 +266,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
diff --git a/html/RM/RM_H5A.html b/html/RM/RM_H5A.html
index 5921836..7d7c3a2 100644
--- a/html/RM/RM_H5A.html
+++ b/html/RM/RM_H5A.html
@@ -43,7 +43,8 @@ HDF5/H5A API Specification
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -74,12 +75,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
@@ -341,7 +341,8 @@ in the <cite>HDF5 User’s Guide</cite> for more information.
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -372,12 +373,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
diff --git a/html/RM/RM_H5D.html b/html/RM/RM_H5D.html
index 3e74446..f0c261d 100644
--- a/html/RM/RM_H5D.html
+++ b/html/RM/RM_H5D.html
@@ -41,7 +41,8 @@ HDF5/H5D API Specification
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -72,12 +73,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
@@ -290,7 +290,8 @@ as the corresponding C function.
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -321,12 +322,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
diff --git a/html/RM/RM_H5E.html b/html/RM/RM_H5E.html
index af7bd09..acf7ca6 100644
--- a/html/RM/RM_H5E.html
+++ b/html/RM/RM_H5E.html
@@ -41,7 +41,8 @@ HDF5/H5E API Specification
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -72,12 +73,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
@@ -325,7 +325,8 @@ errors within the H5E package.
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -356,12 +357,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
diff --git a/html/RM/RM_H5F.html b/html/RM/RM_H5F.html
index 712d17c..f607939 100644
--- a/html/RM/RM_H5F.html
+++ b/html/RM/RM_H5F.html
@@ -42,7 +42,8 @@ HDF5/H5F API Specification
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -73,12 +74,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
@@ -123,6 +123,7 @@ documented below.
 </ul>
 </td><td>      </td><td valign=top>
 <ul>
+    <li><a href="#File-GetFreeSections">H5Fget_free_sections</a>
     <li><a href="#File-GetFreespace">H5Fget_freespace</a>
     <li><a href="#File-ClearELinkFileCache">H5Fclear_elink_file_cache</a>
     <li><a href="#File-SetMdcConfig">H5Fset_mdc_config</a>
@@ -151,7 +152,7 @@ documented below.
       <li><a href="#File-GetCreatePlist">H5Fget_create_plist</a>
       <li><a href="#File-GetFileImage">H5Fget_file_image</a>
       <li><a href="#File-GetFilesize">H5Fget_filesize</a>
-      <li><a href="#File-GetFreespace">H5Fget_freespace</a> 
+      <li><a href="#File-GetFreeSections">H5Fget_free_sections</a>
     </ul>      
     </td>
     
@@ -159,6 +160,7 @@ documented below.
     
     <td valign="top">
     <ul>
+      <li><a href="#File-GetFreespace">H5Fget_freespace</a> 
       <li><a href="#File-GetInfo">H5Fget_info</a>
       <li><a href="#File-GetIntent">H5Fget_intent</a>
       <li><a href="#File-GetMdcConfig">H5Fget_mdc_config</a>
@@ -213,9 +215,10 @@ as the corresponding C function.
     <li><a href="#File-Unmount">h5funmount_f</a>
 <!--    <li><a href="#File-GetVfdHandle">h5fget_vfd_handle_f</a>            -->
     <li><a href="#File-GetFilesize">h5fget_filesize_f</a>
+<!--<li><a href="#File-GetFreeSections">h5fget_free_sections_f</a>          -->
     <li><a href="#File-GetFreespace">h5fget_freespace_f</a>
-<!--<li><a href="#File-GetInfo">H5Fget_info</a>-->
-<!--<li><a href="#File-GetIntent">H5Fget_intent</a>-->
+<!--<li><a href="#File-GetInfo">H5Fget_info</a>                             -->
+<!--<li><a href="#File-GetIntent">H5Fget_intent</a>                         -->
     <li><a href="#File-GetName">h5fget_name_f</a>
     <li><a href="#File-GetCreatePlist">h5fget_create_plist_f</a>
 </ul>
@@ -255,6 +258,7 @@ as the corresponding C function.
 <?php include("H5F/H5Fget_create_plist.htm"); ?>
 <?php include("H5F/H5Fget_file_image.htm"); ?>
 <?php include("H5F/H5Fget_filesize.htm"); ?>
+<?php include("H5F/H5Fget_free_sections.htm"); ?>
 <?php include("H5F/H5Fget_freespace.htm"); ?>
 <?php include("H5F/H5Fget_info.htm"); ?>
 <?php include("H5F/H5Fget_intent.htm"); ?>
@@ -292,7 +296,8 @@ as the corresponding C function.
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -323,12 +328,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
diff --git a/html/RM/RM_H5Front.html b/html/RM/RM_H5Front.html
index 02e634c..2565f3e 100644
--- a/html/RM/RM_H5Front.html
+++ b/html/RM/RM_H5Front.html
@@ -1,6 +1,5 @@
 <html>
 <head>
-<a name="TopofRM"></a>
 <title>
 HDF5 API Specification
 </title>
@@ -9,6 +8,8 @@ HDF5 API Specification
 
 <body bgcolor="#FFFFFF">
 
+
+<a name="TopofRM"></a>
 <!-- #BeginLibraryItem "/ed_libs/styles_RM.lbi" -->
 <!--
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -45,7 +46,8 @@ HDF5 API Specification
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -76,12 +78,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
@@ -447,7 +448,8 @@ which are described in the following documents.
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -478,12 +480,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
@@ -495,7 +496,7 @@ In the
 <table width="100%" border="0"> <tr valign="top"> <td align="left">
 <SCRIPT LANGUAGE="JAVASCRIPT">
 <!--
-document.writeln("Last modified: 13 November 2015");
+document.writeln("Last modified: 16 October 2015");
 -->
 </SCRIPT>
 </td></tr></table>
diff --git a/html/RM/RM_H5G.html b/html/RM/RM_H5G.html
index e9d680a..7b79187 100644
--- a/html/RM/RM_H5G.html
+++ b/html/RM/RM_H5G.html
@@ -42,7 +42,8 @@ HDF5/H5G API Specification
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -73,12 +74,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
@@ -299,7 +299,8 @@ as the corresponding C function.
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -330,12 +331,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
diff --git a/html/RM/RM_H5I.html b/html/RM/RM_H5I.html
index b532b77..6c73131 100644
--- a/html/RM/RM_H5I.html
+++ b/html/RM/RM_H5I.html
@@ -42,7 +42,8 @@ HDF5/H5I API Specification
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -73,12 +74,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
@@ -142,6 +142,7 @@ object names.
         <li><a href="#Identify-DestroyType">H5Idestroy_type</a>
         <li><a href="#Identify-GetFileId">H5Iget_file_id</a>
         <li><a href="#Identify-GetName">H5Iget_name</a>
+        <li><a href="#Identify-GetRef">H5Iget_ref</a>
         </ul>     
     </td>
     
@@ -149,7 +150,6 @@ object names.
     
     <td valign="top">
         <ul>
-        <li><a href="#Identify-GetRef">H5Iget_ref</a>
         <li><a href="#Identify-GetType">H5Iget_type</a>
         <li><a href="#Identify-GetTypeRef">H5Iget_type_ref</a>
         <li><a href="#Identify-IncRef">H5Iinc_ref</a>
@@ -249,7 +249,8 @@ as the corresponding C function.
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -280,12 +281,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
diff --git a/html/RM/RM_H5L.html b/html/RM/RM_H5L.html
index 1c31071..f38df8c 100644
--- a/html/RM/RM_H5L.html
+++ b/html/RM/RM_H5L.html
@@ -42,7 +42,8 @@ HDF5/H5L API Specification
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -73,12 +74,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
@@ -257,6 +257,8 @@ as the corresponding C function.
 <?php include("H5L/H5Lcreate_hard.htm"); ?>
 <?php include("H5L/H5Lcreate_soft.htm"); ?>
 <?php include("H5L/H5Lcreate_ud.htm"); ?>
+<?php include("H5L/H5Ldelete.htm"); ?>
+<?php include("H5L/H5Ldelete_by_idx.htm"); ?>
 <?php include("H5L/H5Lexists.htm"); ?>
 <?php include("H5L/H5Lget_info.htm"); ?>
 <?php include("H5L/H5Lget_info_by_idx.htm"); ?>
@@ -268,8 +270,6 @@ as the corresponding C function.
 <?php include("H5L/H5Literate_by_name.htm"); ?>
 <?php include("H5L/H5Lmove.htm"); ?>
 <?php include("H5L/H5Lregister.htm"); ?>
-<?php include("H5L/H5Ldelete.htm"); ?>
-<?php include("H5L/H5Ldelete_by_idx.htm"); ?>
 <?php include("H5L/H5Lunpack_elink_val.htm"); ?>
 <?php include("H5L/H5Lunregister.htm"); ?>
 <?php include("H5L/H5Lvisit.htm"); ?>
@@ -292,7 +292,8 @@ as the corresponding C function.
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -323,12 +324,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
diff --git a/html/RM/RM_H5O.html b/html/RM/RM_H5O.html
index 457b8ec..12c7ed0 100644
--- a/html/RM/RM_H5O.html
+++ b/html/RM/RM_H5O.html
@@ -42,7 +42,8 @@ HDF5/H5O API Specification
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -73,12 +74,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
@@ -243,6 +243,7 @@ as the corresponding C function.
 
 <p>
 
+
 <!-- NEW PAGE -->
 <!-- HEADER RIGHT " " -->
 
@@ -296,7 +297,8 @@ as the corresponding C function.
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -327,12 +329,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
diff --git a/html/RM/RM_H5P.html b/html/RM/RM_H5P.html
index 79d5c25..9ee3a46 100644
--- a/html/RM/RM_H5P.html
+++ b/html/RM/RM_H5P.html
@@ -264,12 +264,9 @@ Symbolic notation in the following index is interpreted as follows:
     <a href="#Property-Close">H5Pclose</a>
     </td>
 <td width="32%" align="left" valign="top">
- 
-<!-- ====== WHEN EXPOSING, REMOVE FORCED BLANK SPACE IMMEDIATELY ABOVE. =====
     <a href="#Property-Encode">H5Pencode</a>
     <br />
     <a href="#Property-Decode">H5Pdecode</a>
--->
     </td></tr>
 </table>
 
@@ -302,12 +299,10 @@ Symbolic notation in the following index is interpreted as follows:
     <a href="#Property-SetIstoreK">H5Pset_istore_k</a>
     <br />
     <a href="#Property-GetIstoreK">H5Pget_istore_k</a>
-<!--
     <br />
     <a href="#Property-SetFileSpace">H5Pset_file_space</a>
     <br />
     <a href="#Property-GetFileSpace">H5Pget_file_space</a>
--->
     </td>
 <td width="32%" align="left" valign="top">
     <a href="#Property-SetSharedMesgNIndexes">H5Pset_shared_mesg_nindexes</a>
@@ -975,12 +970,8 @@ Symbolic notation in the following index is interpreted as follows:
     <li><a href="#Property-GetClass">H5Pget_class</a>
     <li><a href="#Property-Copy">H5Pcopy</a>
     <li><a href="#Property-Close">H5Pclose</a>
--->
-<!-- ====== =====
     <li><a href="#Property-Encode">H5Pencode</a>
     <li><a href="#Property-Decode">H5Pdecode</a>
--->
-<!--
     </ul>
 
     <p><i>Generic Property Functions (Advanced)</i> 
@@ -1088,12 +1079,8 @@ Symbolic notation in the following index is interpreted as follows:
     <li><a href="#Property-GetSymK">H5Pget_sym_k</a>
     <li><a href="#Property-SetIstoreK">H5Pset_istore_k</a>
     <li><a href="#Property-GetIstoreK">H5Pget_istore_k</a>
--->
-<!--
     <li><a href="#Property-SetFileSpace">H5Pset_file_space</a>
     <li><a href="#Property-GetFileSpace">H5Pget_file_space</a>
--->
-<!--
     <li><a href="#Property-SetSharedMesgNIndexes">H5Pset_shared_mesg_nindexes</a>
     <li><a href="#Property-GetSharedMesgNIndexes">H5Pget_shared_mesg_nindexes</a>
     <li><a href="#Property-SetSharedMesgIndex">H5Pset_shared_mesg_index</a>
@@ -1129,7 +1116,6 @@ Symbolic notation in the following index is interpreted as follows:
     <li><a href="#Property-SetFaplSplit">H5Pset_fapl_split</a>
     <li><a href="#Property-SetFaplSec2">H5Pset_fapl_sec2</a>
     <li><a href="#Property-SetFaplStdio">H5Pset_fapl_stdio</a>
--->
 <!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
 <!--<li><a href="#Property-SetFaplStream">H5Pset_fapl_stream</a>      -->
 <!--<li><a href="#Property-GetFaplStream">H5Pget_fapl_stream</a>      -->
@@ -1169,7 +1155,6 @@ Symbolic notation in the following index is interpreted as follows:
     <li><a href="#Property-SetChunk">H5Pset_chunk</a>
     <li><a href="#Property-GetChunk">H5Pget_chunk</a>
     <li><a href="#Property-SetDeflate">H5Pset_deflate</a>
--->
 <!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
 <!--
     <li><a href="#Property-GetDeflate">H5Pget_deflate</a>
@@ -1271,8 +1256,7 @@ Symbolic notation in the following index is interpreted as follows:
 
 
 </td></tr>
--->
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
+<!-- FOR USE WITH ELECTRONIC VERSION -----------------------------------
 <!--
 <tr><td colspan=5 align=right>
 <br>
@@ -1280,9 +1264,8 @@ Symbolic notation in the following index is interpreted as follows:
 </td></tr>
 -->
 <!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-<!--
 </table>
--->
+<!-- FOR USE WITH ELECTRONIC VERSION -----------------------------------
 
 
 
@@ -1297,12 +1280,8 @@ Symbolic notation in the following index is interpreted as follows:
     <li><a href="#Property-GetClass">H5Pget_class</a>
     <li><a href="#Property-Copy">H5Pcopy</a>
     <li><a href="#Property-Close">H5Pclose</a>
--->
-<!-- ====== =====
     <li><a href="#Property-Encode">H5Pencode</a>
     <li><a href="#Property-Decode">H5Pdecode</a>
--->
-<!--
   </ul>
 
   <i>Generic Property Operations (Advanced)</i> 
@@ -1362,7 +1341,6 @@ Symbolic notation in the following index is interpreted as follows:
 
 
 </td></tr>
--->
 <!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
 <!--
 <tr><td colspan=5 align=right>
@@ -1387,12 +1365,8 @@ Symbolic notation in the following index is interpreted as follows:
     <li><a href="#Property-GetClass">H5Pget_class</a>
     <li><a href="#Property-Copy">H5Pcopy</a>
     <li><a href="#Property-Close">H5Pclose</a>
--->
-<!-- ====== =====
     <li><a href="#Property-Encode">H5Pencode</a>
     <li><a href="#Property-Decode">H5Pdecode</a>
--->
-<!--
   </ul>
 
   <i>Generic Property Operations (Advanced)</i> 
@@ -1451,7 +1425,6 @@ Symbolic notation in the following index is interpreted as follows:
     <li><a href="#Property-SetFaplSplit">H5Pset_fapl_split</a>
     <li><a href="#Property-SetFaplSec2">H5Pset_fapl_sec2</a>
     <li><a href="#Property-SetFaplStdio">H5Pset_fapl_stdio</a>
--->
 <!-- FOR USE WITH PRINT VERSION ---------------------------------------->
 <!--<li><a href="#Property-SetFaplStream">H5Pset_fapl_stream</a>      -->
 <!--<li><a href="#Property-GetFaplStream">H5Pget_fapl_stream</a>      -->
@@ -1501,12 +1474,8 @@ Symbolic notation in the following index is interpreted as follows:
     <li><a href="#Property-GetSymK">H5Pget_sym_k</a>
     <li><a href="#Property-SetIstoreK">H5Pset_istore_k</a>
     <li><a href="#Property-GetIstoreK">H5Pget_istore_k</a>
--->
-<!--
     <li><a href="#Property-SetFileSpace">H5Pset_file_space</a>
     <li><a href="#Property-GetFileSpace">H5Pget_file_space</a>
--->
-<!--
     <li><a href="#Property-SetSharedMesgNIndexes">H5Pset_shared_mesg_nindexes</a>
     <li><a href="#Property-GetSharedMesgNIndexes">H5Pget_shared_mesg_nindexes</a>
     <li><a href="#Property-SetSharedMesgIndex">H5Pset_shared_mesg_index</a>
@@ -1522,7 +1491,6 @@ Symbolic notation in the following index is interpreted as follows:
 </td>
 </tr>
 </table>
--->
 <!-- FOR USE WITH PRINT VERSION ---------------------------------------->
 
 <!-- NEW PAGE -->
@@ -1538,7 +1506,6 @@ Symbolic notation in the following index is interpreted as follows:
     <li><a href="#Property-SetChunk">H5Pset_chunk</a>
     <li><a href="#Property-GetChunk">H5Pget_chunk</a>
     <li><a href="#Property-SetDeflate">H5Pset_deflate</a>
--->
 <!-- FOR USE WITH PRINT VERSION ---------------------------------------->
 <!--
     <li><a href="#Property-GetDeflate">H5Pget_deflate</a>
@@ -1636,7 +1603,6 @@ Symbolic notation in the following index is interpreted as follows:
 </td>
 </table>
 
--->
 <!-- FOR USE WITH PRINT VERSION ---------------------------------------->
 <!-- NEW PAGE -->
 <!-- FOR USE WITH PRINT VERSION ----------------------------------------
@@ -1700,7 +1666,7 @@ Symbolic notation in the following index is interpreted as follows:
     <li><a href="#Property-GetELinkAccFlags">H5Pget_elink_acc_flags</a>
     </ul>
 
-  <p><i>String Properties</i>
+  <p><i>String Creation Property</i>
    <ul>
      <li><a href="#Property-SetCharEncoding">H5Pset_char_encoding</a>
      <li><a href="#Property-GetCharEncoding">H5Pget_char_encoding</a>
@@ -1709,7 +1675,6 @@ Symbolic notation in the following index is interpreted as follows:
 </td>
 </tr>
 </table>
--->
 <!-- FOR USE WITH PRINT VERSION ---------------------------------------->
 
 <br>
@@ -1770,12 +1735,10 @@ See further notes in the description of each function.
       <a href="#Property-Create">H5Pcreate</a>
       <br />
       <a href="#Property-CreateClass">H5Pcreate_class</a>
-<!-- ====== =====
       <br />
       <a href="#Property-Decode">H5Pdecode</a>
       <br />
       <a href="#Property-Encode">H5Pencode</a>
--->
       <br />
       <a href="#Property-Equal">H5Pequal</a>
       <br />
@@ -1870,10 +1833,8 @@ See further notes in the description of each function.
       <a href="#Property-GetFileImage">H5Pget_file_image</a>
       <br />
       <a href="#Property-GetFileImageCallbacks">H5Pget_file_image_callbacks</a>
-<!--
       <br />
       <a href="#Property-GetFileSpace">H5Pget_file_space</a>
--->
       <br />
       <a href="#Property-GetFillTime">H5Pget_fill_time</a>
       <br />
@@ -2085,10 +2046,8 @@ See further notes in the description of each function.
       <a href="#Property-SetFileImage">H5Pset_file_image</a>
       <br />
       <a href="#Property-SetFileImageCallbacks">H5Pset_file_image_callbacks</a>
-<!--
       <br />
       <a href="#Property-SetFileSpace">H5Pset_file_space</a>
--->
       <br />
       <a href="#Property-SetFillTime">H5Pset_fill_time</a>
       <br />
@@ -2185,12 +2144,8 @@ See further notes in the description of each function.
       <li><a href="#Property-CopyProp">H5Pcopy_prop</a>
       <li><a href="#Property-Create">H5Pcreate</a>
       <li><a href="#Property-CreateClass">H5Pcreate_class</a>
--->
-<!-- ====== =====
       <li><a href="#Property-Decode">H5Pdecode</a>
       <li><a href="#Property-Encode">H5Pencode</a>
--->
-<!--
       <li><a href="#Property-Equal">H5Pequal</a>
       <li><a href="#Property-Exist">H5Pexist</a>
       <li><a href="#Property-FillValueDefined">H5Pfill_value_defined</a>
@@ -2230,7 +2185,6 @@ See further notes in the description of each function.
       <li><a href="#Property-GetFaplMpio">H5Pget_fapl_mpio</a>   ||
       <li><a href="#Property-GetFaplMpiPosix">H5Pget_fapl_mpiposix</a>   ||
       <li><a href="#Property-GetFaplMulti">H5Pget_fapl_multi</a>
--->
 <!-- FOR USE WITH PRINT VERSION ---------------------------------------->
 <!--  <li><a href="#Property-GetFaplStream">H5Pget_fapl_stream</a>        -->
 <!-- FOR USE WITH PRINT VERSION ----------------------------------------
@@ -2244,11 +2198,7 @@ See further notes in the description of each function.
       <li><a href="#Property-GetFcloseDegree">H5Pget_fclose_degree</a>
       <li><a href="#Property-GetFileImage">H5Pget_file_image</a>
       <li><a href="#Property-GetFileImageCallbacks">H5Pget_file_image_callbacks</a>
--->
-<!--
       <li><a href="#Property-GetFileSpace">H5Pget_file_space</a>
--->
-<!--
       <li><a href="#Property-GetFillTime">H5Pget_fill_time</a>
       <li><a href="#Property-GetFillValue">H5Pget_fill_value</a>
       <li><a href="#Property-GetFilter"><i>H5Pget_filter</i></a>
@@ -2303,7 +2253,6 @@ See further notes in the description of each function.
     </td>
   </tr>
 </table>
--->
 <!-- FOR USE WITH PRINT VERSION ---------------------------------------->
 <!-- NEW PAGE -->
 <!-- FOR USE WITH PRINT VERSION ----------------------------------------
@@ -2356,7 +2305,6 @@ See further notes in the description of each function.
       <li><a href="#Property-SetFaplSec2">H5Pset_fapl_sec2</a>
       <li><a href="#Property-SetFaplSplit">H5Pset_fapl_split</a>
       <li><a href="#Property-SetFaplStdio">H5Pset_fapl_stdio</a>
--->
 <!-- FOR USE WITH PRINT VERSION ---------------------------------------->
 <!--  <li><a href="#Property-SetFaplStream">H5Pset_fapl_stream</a>        -->
 <!-- FOR USE WITH PRINT VERSION ----------------------------------------
@@ -2371,11 +2319,7 @@ See further notes in the description of each function.
       <li><a href="#Property-SetFcloseDegree">H5Pset_fclose_degree</a>
       <li><a href="#Property-SetFileImage">H5Pset_file_image</a>
       <li><a href="#Property-SetFileImageCallbacks">H5Pset_file_image_callbacks</a>
--->
-<!--
       <li><a href="#Property-SetFileSpace">H5Pset_file_space</a>
--->
-<!--
       <li><a href="#Property-SetFillTime">H5Pset_fill_time</a>
       <li><a href="#Property-SetFillValue">H5Pset_fill_value</a>
       <li><a href="#Property-SetFilter">H5Pset_filter</a>
@@ -2420,7 +2364,6 @@ See further notes in the description of each function.
     </td>
   </tr>
 </table>
--->
 <!-- FOR USE WITH PRINT VERSION ---------------------------------------->
 
 <br>
@@ -3501,10 +3444,8 @@ See further notes in the description of each function.
 <?php include("H5P/H5Pcopy_prop.htm"); ?>
 <?php include("H5P/H5Pcreate.htm"); ?>
 <?php include("H5P/H5Pcreate_class.htm"); ?>
-<!-- ====== =====
 <?php include("H5P/H5Pdecode.htm"); ?>
 <?php include("H5P/H5Pencode.htm"); ?>
--->
 <?php include("H5P/H5Pequal.htm"); ?>
 <?php include("H5P/H5Pexist.htm"); ?>
 <?php include("H5P/H5Pfill_value_defined.htm"); ?>
@@ -3551,7 +3492,7 @@ See further notes in the description of each function.
 <?php include("H5P/H5Pget_fclose_degree.htm"); ?>
 <?php include("H5P/H5Pget_file_image.htm"); ?>
 <?php include("H5P/H5Pget_file_image_callbacks.htm"); ?>
-<!-- <?php include("H5P/H5Pget_file_space.htm"); ?> -->
+<?php include("H5P/H5Pget_file_space.htm"); ?>
 <?php include("H5P/H5Pget_fill_time.htm"); ?>
 <?php include("H5P/H5Pget_fill_value.htm"); ?>
 <?php include("H5P/H5Pget_filter.htm"); ?>
@@ -3650,7 +3591,7 @@ See further notes in the description of each function.
 <?php include("H5P/H5Pset_fclose_degree.htm"); ?>
 <?php include("H5P/H5Pset_file_image.htm"); ?>
 <?php include("H5P/H5Pset_file_image_callbacks.htm"); ?>
-<!-- <?php include("H5P/H5Pset_file_space.htm"); ?> -->
+<?php include("H5P/H5Pset_file_space.htm"); ?>
 <?php include("H5P/H5Pset_fill_time.htm"); ?>
 <?php include("H5P/H5Pset_fill_value.htm"); ?>
 <?php include("H5P/H5Pset_filter.htm"); ?>
diff --git a/html/RM/RM_H5R.html b/html/RM/RM_H5R.html
index caa82e8..4e469d8 100644
--- a/html/RM/RM_H5R.html
+++ b/html/RM/RM_H5R.html
@@ -41,7 +41,8 @@ HDF5/H5R API Specification
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -72,12 +73,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
@@ -197,10 +197,10 @@ as the corresponding C function.
 
 <?php include("H5R/H5Rcreate.htm"); ?>
 <?php include("H5R/H5Rdereference.htm"); ?>
+<?php include("H5R/H5Rget_name.htm"); ?>
 <?php include("H5R/H5Rget_obj_type.htm"); ?>
 <?php include("H5R/H5Rget_obj_type1.htm"); ?>
 <?php include("H5R/H5Rget_obj_type2.htm"); ?>
-<?php include("H5R/H5Rget_name.htm"); ?>
 <?php include("H5R/H5Rget_region.htm"); ?>
 
 
@@ -220,7 +220,8 @@ as the corresponding C function.
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -251,12 +252,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
diff --git a/html/RM/RM_H5S.html b/html/RM/RM_H5S.html
index df681e0..2f97962 100644
--- a/html/RM/RM_H5S.html
+++ b/html/RM/RM_H5S.html
@@ -41,7 +41,8 @@ HDF5/H5S API Specification
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -72,12 +73,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
@@ -195,8 +195,6 @@ as the corresponding C function.
     <li><a href="#Dataspace-Create">h5screate_f</a>
     <li><a href="#Dataspace-Copy">h5scopy_f</a>
     <li><a href="#Dataspace-Close">h5sclose_f</a>
-    <li><a href="#Dataspace-Decode">h5sdecode_f</a>
-    <li><a href="#Dataspace-Encode">h5sencode_f</a>
     <li><a href="#Dataspace-CreateSimple">h5screate_simple_f</a>
     <li><a href="#Dataspace-IsSimple">h5sis_simple_f</a>
     <li><a href="#Dataspace-OffsetSimple">h5soffset_simple_f</a>
@@ -206,7 +204,6 @@ as the corresponding C function.
     <li><a href="#Dataspace-ExtentNpoints">h5sget_simple_extent_npoints_f</a>
     <li><a href="#Dataspace-ExtentType">h5sget_simple_extent_type_f</a>
     <li><a href="#Dataspace-ExtentCopy">h5sextent_copy_f</a>
-    <li><a href="#Dataspace-ExtentEqual">h5sextent_equal_f</a>
     <li><a href="#Dataspace-SetExtentSimple">h5sset_extent_simple_f</a>
     <li><a href="#Dataspace-SetExtentNone">h5sset_extent_none_f</a>
     <li><a href="#Dataspace-GetSelectType">h5sget_select_type_f</a>
@@ -316,7 +313,8 @@ of the <cite>HDF5 User's Guide.</cite>.
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -347,12 +345,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
diff --git a/html/RM/RM_H5T.html b/html/RM/RM_H5T.html
index 60ec7a8..223a1a6 100644
--- a/html/RM/RM_H5T.html
+++ b/html/RM/RM_H5T.html
@@ -41,7 +41,8 @@ HDF5/H5T API Specification
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -72,12 +73,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
@@ -318,23 +318,21 @@ as the corresponding C function.
 <tr><td valign=top width=32%>
 <i>General Datatype Operations</i>
     <li><a href="#Datatype-Create">h5tcreate_f</a>
-    <li><a href="#Datatype-Decode">h5tdecode_f</a>
-    <li><a href="#Datatype-Encode">h5tencode_f</a>
     <li><a href="#Datatype-Open">h5topen_f</a>
 <!--<li><a href="#Datatype-Open2">h5topen2_f</a>                        -->
     <li><a href="#Datatype-Commit">h5tcommit_f</a>
-    <li><a href="#Datatype-CommitAnon">h5tcommit_anon_f</a>
+<!--<li><a href="#Datatype-Commit2">h5tcommit2_f</a>                    -->
+<!--<li><a href="#Datatype-CommitAnon">h5tcommit_anon_f</a>             -->
     <li><a href="#Datatype-Committed">h5tcommitted_f</a>
-    <li><a href="#Datatype-CompilerConv">H5tcompiler_conv_f</a>
     <li><a href="#Datatype-Copy">h5tcopy_f</a>
     <li><a href="#Datatype-Equal">h5tequal_f</a>
 <!--<li><a href="#Datatype-Lock">h5tlock_f</a>                          -->
-    <li><a href="#Datatype-GetCreatePlist">h5tget_create_plist_f</a>
+<!--<li><a href="#Datatype-GetCreatePlist">h5tget_create_plist_f</a>    -->
     <li><a href="#Datatype-GetClass">h5tget_class_f</a>
     <li><a href="#Datatype-SetSize">h5tset_size_f</a>
     <li><a href="#Datatype-GetSize">h5tget_size_f</a>
     <li><a href="#Datatype-GetSuper">h5tget_super_f</a>
-<!--<li><a href="#Datatype-GetNativeType">h5tget_native_type_f</a>      -->
+    <li><a href="#Datatype-GetNativeType">h5tget_native_type_f</a>
 <!--<li><a href="#Datatype-DetectClass">h5tdetect_class_f</a>           -->
     <li><a href="#Datatype-Close">h5tclose_f</a>
     <br><br>
@@ -344,7 +342,6 @@ as the corresponding C function.
     <li><a href="#Datatype-EnumNameOf">h5tenum_nameof_f</a>
     <li><a href="#Datatype-EnumValueOf">h5tenum_valueof_f</a>
     <li><a href="#Datatype-GetMemberValue">h5tget_member_value_f</a>
-    <li><a href="#Datatype-GetNativeType">h5tget_native_type_f</a>
     <li><a href="#Datatype-GetNmembers">h5tget_nmembers_f</a>
     <li><a href="#Datatype-GetMemberName">h5tget_member_name_f</a>
     <li><a href="#Datatype-GetMemberIndex">h5tget_member_index_f</a>
@@ -544,7 +541,8 @@ in the <cite>HDF5 User’s Guide</cite> for more information.
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -575,12 +573,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
diff --git a/html/RM/RM_H5Z.html b/html/RM/RM_H5Z.html
index dc0ac61..35db2af 100644
--- a/html/RM/RM_H5Z.html
+++ b/html/RM/RM_H5Z.html
@@ -74,12 +74,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size="-1">(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
@@ -274,12 +273,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size="-1">(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
diff --git a/html/RM/Tools.html b/html/RM/Tools.html
index 8162fc2..be2045f 100644
--- a/html/RM/Tools.html
+++ b/html/RM/Tools.html
@@ -40,7 +40,8 @@ HDF5/Tools API Specification
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -71,12 +72,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
@@ -283,7 +283,8 @@ installed with HDF5.
 <td valign=top align=right>
 In the 
 <a href="RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -314,12 +315,11 @@ In the
 <a href="APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
 -->
-
+</font>
 </td></tr>
 </table>
 </center>
diff --git a/html/RM/Tools/h5diff.htm b/html/RM/Tools/h5diff.htm
index 66ce745..1725196 100644
--- a/html/RM/Tools/h5diff.htm
+++ b/html/RM/Tools/h5diff.htm
@@ -75,12 +75,22 @@
         (soft links or external links)
         and must be expressed as absolute 
         paths from the respective file’s root group.
+<!--
+<INLINE, replacing part of preceding paragraph>
+If no objects [obj1[ obj2]] are specified, the h5diff comparison proceeds as a comparison of the two files' root groups.  That is, h5diff first compares the names of root group members, generates a report of root group objects that appear in only one file or in both files, and recursively compares common objects.
+-->
         <ul>
             <li>If these objects are groups, <code>h5diff</code>
                 first compares the names of member objects (the relative path 
                 from the specified group) and generates a report of objects 
                 that appear in only one group or in both groups. 
                 Common objects are then compared recursively.
+<!--
+<INLINE, replacing preceding bullet>
+            <li>If these objects are groups, <code>h5diff</code> first compares the names of member objects (relative path, from the specified group) and generates a report of objects that appear in only one group or in both groups.
+                 < INSERT SAMPLE REPORT with explanatory text >
+                 Common objects are then compared recursively.
+-->
             <li>If these objects are datasets, array rank and dimensions, 
                 datatypes, and data values are compared.
             <li>If these objects are named datatypes, the comparison 
diff --git a/html/RM/Tools/h5ls.htm b/html/RM/Tools/h5ls.htm
index 88a7fbe..dfccea4 100644
--- a/html/RM/Tools/h5ls.htm
+++ b/html/RM/Tools/h5ls.htm
@@ -92,7 +92,6 @@
               it does not provide any information regarding the target object
               or determine whether the link is a dangling link.</p><p></p>
               </td></tr>
-
         <tr>
             <td valign="top"><code>--no-dangling-links</code></td>
             <td valign="top">
@@ -240,7 +239,6 @@
               <br>
               Replaced by <code>--follow-symlinks</code>.
               </td></tr>
-
     </table></ul>
 
 <p>
diff --git a/html/RM/Tools/h5perf_serial.htm b/html/RM/Tools/h5perf_serial.htm
index 143214a..0e50954 100644
--- a/html/RM/Tools/h5perf_serial.htm
+++ b/html/RM/Tools/h5perf_serial.htm
@@ -256,7 +256,7 @@
               </td>
         </tr>
       </table
-    ></ul>
+    </ul>
     <p>
 <dt><strong>Exit Status:</strong></dt>
     <dd><table border=0>
diff --git a/html/RM/Tools/h5repack.htm b/html/RM/Tools/h5repack.htm
index 8e5141d..c6cf8e5 100644
--- a/html/RM/Tools/h5repack.htm
+++ b/html/RM/Tools/h5repack.htm
@@ -322,6 +322,38 @@
                 This file contains only the filter and layout flags.
             <p>
 
+        <dt><code>-S</code> <em>fs_strategy</em>
+              or 
+            <code>--fs_strategy</code>=<em>fs_strategy</em>
+            <dd>The type of file space management strategy to use for the 
+            output file
+            <p>
+            <em>fs_strategy</em> is a string as listed below:
+                <br>    
+                    <code>ALL_PERSIST</code>: Use persistent free-space 
+                     managers, aggregators and virtual file
+                     driver for file space allocation
+                <br>    
+                    <code>ALL</code>: Use non-persistent free-space managers, 
+                     aggregators and virtual file driver for file space 
+                     allocation
+                <br>    
+                    <code>AGGR_VFD</code>: Use aggregators and virtual file 
+                     driver for file space allocation
+                <br>    
+                    <code>VFD</code>: Use virtual file driver for 
+                     file space allocation
+            <p>
+
+        <dt><code>-T</code> <em>fs_threshold</em>
+              or 
+            <code>--fs_threshold</code>=<em>fs_threshold</em>
+            <dd>The free-space section threshold to use for the output file.
+            <p>
+            <em>fs_threshold</em> is the minimum size (in bytes) of 
+            free-space sections to be tracked by
+            the library's free-space managers.
+            <p>
         <dt><em>in_file</em>
             <dd>Input HDF5 file
             <p>
diff --git a/html/RM/Tools/h5stat.htm b/html/RM/Tools/h5stat.htm
index 630d0ab..4c6562b 100644
--- a/html/RM/Tools/h5stat.htm
+++ b/html/RM/Tools/h5stat.htm
@@ -129,7 +129,13 @@
                <br>
 	       <i>N</i> is an integer greater than 0.  
                The default threshold is 10.
-	  </td></tr>
+	  </td>
+	</tr>
+	<tr>
+          <td valign="top"><code>-s</code>
+                 or  
+               <code>--freespace</code></td>
+          <td valign="top">Print free space information.</td></tr>
         <tr>
           <td valign="top"><code>-S</code>
                  or  
@@ -160,6 +166,13 @@
           <td valign="top" align="left">
             <strong>Change</strong></td></tr>
         <tr>
+          <td valign="top">1.10.0</td>
+          <td valign="top">
+            Option added in this release:
+            <br><code>    </code>
+                <code>-s, --freespace</code> 
+            </td></tr>
+        <tr>
           <td valign="top">1.8.12</td>
           <td valign="top">
             Options added in this release:
diff --git a/html/Supplements/._H5_CompatFormat180 070730 v.xls b/html/Supplements/._H5_CompatFormat180 070730 v.xls
new file mode 100755
index 0000000..bf8d6d2
Binary files /dev/null and b/html/Supplements/._H5_CompatFormat180 070730 v.xls differ
diff --git a/html/TechNotes.html b/html/TechNotes.html
index 92adfe9..69169a5 100644
--- a/html/TechNotes.html
+++ b/html/TechNotes.html
@@ -50,7 +50,9 @@ HDF5 Special Topics and Technical Notes  
 </table>
 </center>
 <hr>
-<!-- #EndLibraryItem --><center>
+<!-- #EndLibraryItem -->
+
+<center>
 <h1>HDF5 Technical Notes</h1>
 <!--
 <h3>Technical Notes for HDF5 Library and Driver Developers</h3>
@@ -400,13 +402,12 @@ HDF5 Technical Notes  
 </table>
 </center>
 <hr>
-<!-- #EndLibraryItem -->
+<!-- #EndLibraryItem --><address>
 
 <?php include("./ed_libs/Footer.htm"); ?>
 
 Last modified: 24 April 2015
 
 
-
 </body>
 </html>
diff --git a/html/TechNotes/VFL.html b/html/TechNotes/VFL.html
index 30a854a..d2f084e 100644
--- a/html/TechNotes/VFL.html
+++ b/html/TechNotes/VFL.html
@@ -1600,11 +1600,9 @@ file(s). Thus, in general the mapping must be known before the file superblock
 can be read. However, the user usually knows enough about the mapping for the
 superblock to be readable and once the superblock is read the library can fill
 in the missing parts of the mapping.
-<P><HR>
+<P><HR><P>
 
 <?php include("../ed_libs/Footer2.htm"); ?>
 
-<P>
-
 </BODY>
 </HTML>
diff --git a/html/TechNotes/VLTypes.html b/html/TechNotes/VLTypes.html
index 33afb14..6d9f6c5 100644
--- a/html/TechNotes/VLTypes.html
+++ b/html/TechNotes/VLTypes.html
@@ -113,7 +113,7 @@
     </P>
 
     <H3>Chunking and Filters</H3>
-    <P>Storing data as VL information has some affects on chunked storage and
+    <P>Storing data as VL information has some effects on chunked storage and
         the filters that can be applied to chunked data.  Because the data that
         is stored in each chunk is the location to access the VL information,
         the actual VL information is not broken up into chunks in the same way
diff --git a/html/UG/FmSource/AdditionalResources.fm b/html/UG/FmSource/AdditionalResources.fm
deleted file mode 100644
index ad57627..0000000
Binary files a/html/UG/FmSource/AdditionalResources.fm and /dev/null differ
diff --git a/html/UG/FmSource/Attributes.fm b/html/UG/FmSource/Attributes.fm
deleted file mode 100644
index 28f10cd..0000000
Binary files a/html/UG/FmSource/Attributes.fm and /dev/null differ
diff --git a/html/UG/FmSource/Copyrights.fm b/html/UG/FmSource/Copyrights.fm
deleted file mode 100644
index cffacbf..0000000
Binary files a/html/UG/FmSource/Copyrights.fm and /dev/null differ
diff --git a/html/UG/FmSource/DataModelAndFileStructure.fm b/html/UG/FmSource/DataModelAndFileStructure.fm
deleted file mode 100644
index ac02ccf..0000000
Binary files a/html/UG/FmSource/DataModelAndFileStructure.fm and /dev/null differ
diff --git a/html/UG/FmSource/Datasets.fm b/html/UG/FmSource/Datasets.fm
deleted file mode 100644
index b10896d..0000000
Binary files a/html/UG/FmSource/Datasets.fm and /dev/null differ
diff --git a/html/UG/FmSource/Dataspaces.fm b/html/UG/FmSource/Dataspaces.fm
deleted file mode 100644
index f49a71e..0000000
Binary files a/html/UG/FmSource/Dataspaces.fm and /dev/null differ
diff --git a/html/UG/FmSource/Datatypes.fm b/html/UG/FmSource/Datatypes.fm
deleted file mode 100644
index 9417655..0000000
Binary files a/html/UG/FmSource/Datatypes.fm and /dev/null differ
diff --git a/html/UG/FmSource/ErrorHandling.fm b/html/UG/FmSource/ErrorHandling.fm
deleted file mode 100644
index 0fd7195..0000000
Binary files a/html/UG/FmSource/ErrorHandling.fm and /dev/null differ
diff --git a/html/UG/FmSource/Groups.fm b/html/UG/FmSource/Groups.fm
deleted file mode 100644
index f2e3557..0000000
Binary files a/html/UG/FmSource/Groups.fm and /dev/null differ
diff --git a/html/UG/FmSource/HDF5_UG_LOCE.fm b/html/UG/FmSource/HDF5_UG_LOCE.fm
deleted file mode 100644
index 1a19bd6..0000000
Binary files a/html/UG/FmSource/HDF5_UG_LOCE.fm and /dev/null differ
diff --git a/html/UG/FmSource/HDF5_UG_LOF.fm b/html/UG/FmSource/HDF5_UG_LOF.fm
deleted file mode 100644
index 346891c..0000000
Binary files a/html/UG/FmSource/HDF5_UG_LOF.fm and /dev/null differ
diff --git a/html/UG/FmSource/HDF5_UG_LOFL.fm b/html/UG/FmSource/HDF5_UG_LOFL.fm
deleted file mode 100644
index c88c4e3..0000000
Binary files a/html/UG/FmSource/HDF5_UG_LOFL.fm and /dev/null differ
diff --git a/html/UG/FmSource/HDF5_UG_LOT.fm b/html/UG/FmSource/HDF5_UG_LOT.fm
deleted file mode 100644
index 67e2ca4..0000000
Binary files a/html/UG/FmSource/HDF5_UG_LOT.fm and /dev/null differ
diff --git a/html/UG/FmSource/HDF5_UG_TOC.fm b/html/UG/FmSource/HDF5_UG_TOC.fm
deleted file mode 100644
index b3b9da4..0000000
Binary files a/html/UG/FmSource/HDF5_UG_TOC.fm and /dev/null differ
diff --git a/html/UG/FmSource/HDF5_UG_Title.fm b/html/UG/FmSource/HDF5_UG_Title.fm
deleted file mode 100644
index 25221ae..0000000
Binary files a/html/UG/FmSource/HDF5_UG_Title.fm and /dev/null differ
diff --git a/html/UG/FmSource/HDF5_Users_Guide.book b/html/UG/FmSource/HDF5_Users_Guide.book
deleted file mode 100644
index 6ea4108..0000000
Binary files a/html/UG/FmSource/HDF5_Users_Guide.book and /dev/null differ
diff --git a/html/UG/FmSource/HDF5_Users_GuideIX.fm b/html/UG/FmSource/HDF5_Users_GuideIX.fm
deleted file mode 100644
index e24ee53..0000000
Binary files a/html/UG/FmSource/HDF5_Users_GuideIX.fm and /dev/null differ
diff --git a/html/UG/FmSource/HDF_favicon_16x16.png b/html/UG/FmSource/HDF_favicon_16x16.png
deleted file mode 100644
index 6d2aeea..0000000
Binary files a/html/UG/FmSource/HDF_favicon_16x16.png and /dev/null differ
diff --git a/html/UG/FmSource/LibraryAndProgrammingModel.fm b/html/UG/FmSource/LibraryAndProgrammingModel.fm
deleted file mode 100644
index bd0e21f..0000000
Binary files a/html/UG/FmSource/LibraryAndProgrammingModel.fm and /dev/null differ
diff --git a/html/UG/FmSource/PropertyLists.fm b/html/UG/FmSource/PropertyLists.fm
deleted file mode 100644
index 42e4a84..0000000
Binary files a/html/UG/FmSource/PropertyLists.fm and /dev/null differ
diff --git a/html/UG/FmSource/TheFile.fm b/html/UG/FmSource/TheFile.fm
deleted file mode 100644
index 909e982..0000000
Binary files a/html/UG/FmSource/TheFile.fm and /dev/null differ
diff --git a/html/UG/FmSource/ThgUgTemplate.fm b/html/UG/FmSource/ThgUgTemplate.fm
deleted file mode 100644
index ef1cdce..0000000
Binary files a/html/UG/FmSource/ThgUgTemplate.fm and /dev/null differ
diff --git a/html/UG/FmSource/UpdateStatus.fm b/html/UG/FmSource/UpdateStatus.fm
deleted file mode 100644
index 63a208c..0000000
Binary files a/html/UG/FmSource/UpdateStatus.fm and /dev/null differ
diff --git a/html/UG/FmSource/back.png b/html/UG/FmSource/back.png
deleted file mode 100644
index b4ecc01..0000000
Binary files a/html/UG/FmSource/back.png and /dev/null differ
diff --git a/html/UG/FmSource/forward.png b/html/UG/FmSource/forward.png
deleted file mode 100644
index 5bcfd48..0000000
Binary files a/html/UG/FmSource/forward.png and /dev/null differ
diff --git a/html/UG/FmSource/html_and_xml_tags.fm b/html/UG/FmSource/html_and_xml_tags.fm
deleted file mode 100644
index 3c5d787..0000000
Binary files a/html/UG/FmSource/html_and_xml_tags.fm and /dev/null differ
diff --git a/html/UG/Images/1ImageDrawingWorkspace.docx b/html/UG/Images/1ImageDrawingWorkspace.docx
deleted file mode 100644
index 9510679..0000000
Binary files a/html/UG/Images/1ImageDrawingWorkspace.docx and /dev/null differ
diff --git a/html/UG/Images/ChunkingFig001.png b/html/UG/Images/ChunkingFig001.png
deleted file mode 100644
index 8d68cb9..0000000
Binary files a/html/UG/Images/ChunkingFig001.png and /dev/null differ
diff --git a/html/UG/Images/ChunkingFig002.png b/html/UG/Images/ChunkingFig002.png
deleted file mode 100644
index 44cf415..0000000
Binary files a/html/UG/Images/ChunkingFig002.png and /dev/null differ
diff --git a/html/UG/Images/ChunkingFig003.png b/html/UG/Images/ChunkingFig003.png
deleted file mode 100644
index f3003e6..0000000
Binary files a/html/UG/Images/ChunkingFig003.png and /dev/null differ
diff --git a/html/UG/Images/ChunkingFig004.png b/html/UG/Images/ChunkingFig004.png
deleted file mode 100644
index 4e17136..0000000
Binary files a/html/UG/Images/ChunkingFig004.png and /dev/null differ
diff --git a/html/UG/Images/ChunkingFig005.png b/html/UG/Images/ChunkingFig005.png
deleted file mode 100644
index dc6c319..0000000
Binary files a/html/UG/Images/ChunkingFig005.png and /dev/null differ
diff --git a/html/UG/Images/ChunkingFig006.png b/html/UG/Images/ChunkingFig006.png
deleted file mode 100644
index 4b014ae..0000000
Binary files a/html/UG/Images/ChunkingFig006.png and /dev/null differ
diff --git a/html/UG/Images/ChunkingFig007.png b/html/UG/Images/ChunkingFig007.png
deleted file mode 100644
index fb7dcb8..0000000
Binary files a/html/UG/Images/ChunkingFig007.png and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig1.JPG b/html/UG/Images/Dmodel_fig1.JPG
deleted file mode 100644
index 872df24..0000000
Binary files a/html/UG/Images/Dmodel_fig1.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig1.psd b/html/UG/Images/Dmodel_fig1.psd
deleted file mode 100644
index 6e43b34..0000000
Binary files a/html/UG/Images/Dmodel_fig1.psd and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig10.JPG b/html/UG/Images/Dmodel_fig10.JPG
deleted file mode 100644
index 8167d0e..0000000
Binary files a/html/UG/Images/Dmodel_fig10.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig10.PSD b/html/UG/Images/Dmodel_fig10.PSD
deleted file mode 100644
index 17f03dc..0000000
Binary files a/html/UG/Images/Dmodel_fig10.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig11_a.PSD b/html/UG/Images/Dmodel_fig11_a.PSD
deleted file mode 100644
index dfc487e..0000000
Binary files a/html/UG/Images/Dmodel_fig11_a.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig11_a.jpg b/html/UG/Images/Dmodel_fig11_a.jpg
deleted file mode 100644
index eed7d2b..0000000
Binary files a/html/UG/Images/Dmodel_fig11_a.jpg and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig11_b.jpg b/html/UG/Images/Dmodel_fig11_b.jpg
deleted file mode 100644
index 149a3e0..0000000
Binary files a/html/UG/Images/Dmodel_fig11_b.jpg and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig12.JPG b/html/UG/Images/Dmodel_fig12.JPG
deleted file mode 100644
index 3e538c6..0000000
Binary files a/html/UG/Images/Dmodel_fig12.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig12.PSD b/html/UG/Images/Dmodel_fig12.PSD
deleted file mode 100644
index b952435..0000000
Binary files a/html/UG/Images/Dmodel_fig12.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig18_a.JPG b/html/UG/Images/Dmodel_fig18_a.JPG
deleted file mode 100644
index b482da2..0000000
Binary files a/html/UG/Images/Dmodel_fig18_a.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig18_a.PSD b/html/UG/Images/Dmodel_fig18_a.PSD
deleted file mode 100644
index 67a6db1..0000000
Binary files a/html/UG/Images/Dmodel_fig18_a.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig18_b.JPG b/html/UG/Images/Dmodel_fig18_b.JPG
deleted file mode 100644
index 786e52b..0000000
Binary files a/html/UG/Images/Dmodel_fig18_b.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig18_b.PSD b/html/UG/Images/Dmodel_fig18_b.PSD
deleted file mode 100644
index 8901f69..0000000
Binary files a/html/UG/Images/Dmodel_fig18_b.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig18_c.JPG b/html/UG/Images/Dmodel_fig18_c.JPG
deleted file mode 100644
index cd49f1f..0000000
Binary files a/html/UG/Images/Dmodel_fig18_c.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig18_c.PSD b/html/UG/Images/Dmodel_fig18_c.PSD
deleted file mode 100644
index 9e645cc..0000000
Binary files a/html/UG/Images/Dmodel_fig18_c.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig18_d.JPG b/html/UG/Images/Dmodel_fig18_d.JPG
deleted file mode 100644
index 753a153..0000000
Binary files a/html/UG/Images/Dmodel_fig18_d.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig18_d.PSD b/html/UG/Images/Dmodel_fig18_d.PSD
deleted file mode 100644
index 700e4be..0000000
Binary files a/html/UG/Images/Dmodel_fig18_d.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig18_e.JPG b/html/UG/Images/Dmodel_fig18_e.JPG
deleted file mode 100644
index c3a7be5..0000000
Binary files a/html/UG/Images/Dmodel_fig18_e.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig18_e.PSD b/html/UG/Images/Dmodel_fig18_e.PSD
deleted file mode 100644
index c807a00..0000000
Binary files a/html/UG/Images/Dmodel_fig18_e.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig2.JPG b/html/UG/Images/Dmodel_fig2.JPG
deleted file mode 100644
index addd135..0000000
Binary files a/html/UG/Images/Dmodel_fig2.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig2.PSD b/html/UG/Images/Dmodel_fig2.PSD
deleted file mode 100644
index ada9456..0000000
Binary files a/html/UG/Images/Dmodel_fig2.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig37.JPG b/html/UG/Images/Dmodel_fig37.JPG
deleted file mode 100644
index a4ee353..0000000
Binary files a/html/UG/Images/Dmodel_fig37.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig37.PSD b/html/UG/Images/Dmodel_fig37.PSD
deleted file mode 100644
index 81e6eb8..0000000
Binary files a/html/UG/Images/Dmodel_fig37.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig38_a.JPG b/html/UG/Images/Dmodel_fig38_a.JPG
deleted file mode 100644
index 3710d2f..0000000
Binary files a/html/UG/Images/Dmodel_fig38_a.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig38_a.PSD b/html/UG/Images/Dmodel_fig38_a.PSD
deleted file mode 100644
index 45a92a0..0000000
Binary files a/html/UG/Images/Dmodel_fig38_a.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig38_b.JPG b/html/UG/Images/Dmodel_fig38_b.JPG
deleted file mode 100644
index 5c6c48d..0000000
Binary files a/html/UG/Images/Dmodel_fig38_b.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig38_b.PSD b/html/UG/Images/Dmodel_fig38_b.PSD
deleted file mode 100644
index dcc523f..0000000
Binary files a/html/UG/Images/Dmodel_fig38_b.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig3_a.JPG b/html/UG/Images/Dmodel_fig3_a.JPG
deleted file mode 100644
index f29ad57..0000000
Binary files a/html/UG/Images/Dmodel_fig3_a.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig3_a.PSD b/html/UG/Images/Dmodel_fig3_a.PSD
deleted file mode 100644
index f8e64fe..0000000
Binary files a/html/UG/Images/Dmodel_fig3_a.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig3_b.JPG b/html/UG/Images/Dmodel_fig3_b.JPG
deleted file mode 100644
index e24dd68..0000000
Binary files a/html/UG/Images/Dmodel_fig3_b.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig3_b.PSD b/html/UG/Images/Dmodel_fig3_b.PSD
deleted file mode 100644
index d225783..0000000
Binary files a/html/UG/Images/Dmodel_fig3_b.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig3_c.JPG b/html/UG/Images/Dmodel_fig3_c.JPG
deleted file mode 100644
index d3fb473..0000000
Binary files a/html/UG/Images/Dmodel_fig3_c.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig3_c.PSD b/html/UG/Images/Dmodel_fig3_c.PSD
deleted file mode 100644
index ababd72..0000000
Binary files a/html/UG/Images/Dmodel_fig3_c.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig40_a.JPG b/html/UG/Images/Dmodel_fig40_a.JPG
deleted file mode 100644
index 4cc7df1..0000000
Binary files a/html/UG/Images/Dmodel_fig40_a.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig40_a.PSD b/html/UG/Images/Dmodel_fig40_a.PSD
deleted file mode 100644
index cc73d33..0000000
Binary files a/html/UG/Images/Dmodel_fig40_a.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig40_b.JPG b/html/UG/Images/Dmodel_fig40_b.JPG
deleted file mode 100644
index 5734b46..0000000
Binary files a/html/UG/Images/Dmodel_fig40_b.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig40_b.PSD b/html/UG/Images/Dmodel_fig40_b.PSD
deleted file mode 100644
index 8549d57..0000000
Binary files a/html/UG/Images/Dmodel_fig40_b.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig40_c.JPG b/html/UG/Images/Dmodel_fig40_c.JPG
deleted file mode 100644
index 8f3ef85..0000000
Binary files a/html/UG/Images/Dmodel_fig40_c.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig40_c.PSD b/html/UG/Images/Dmodel_fig40_c.PSD
deleted file mode 100644
index e6ad93a..0000000
Binary files a/html/UG/Images/Dmodel_fig40_c.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig40_d+g3.jpg b/html/UG/Images/Dmodel_fig40_d+g3.jpg
deleted file mode 100644
index 65854f0..0000000
Binary files a/html/UG/Images/Dmodel_fig40_d+g3.jpg and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig40_d.JPG b/html/UG/Images/Dmodel_fig40_d.JPG
deleted file mode 100644
index 2fcd57e..0000000
Binary files a/html/UG/Images/Dmodel_fig40_d.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig40_d.PSD b/html/UG/Images/Dmodel_fig40_d.PSD
deleted file mode 100644
index 6599d99..0000000
Binary files a/html/UG/Images/Dmodel_fig40_d.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig4_a.JPG b/html/UG/Images/Dmodel_fig4_a.JPG
deleted file mode 100644
index fb9f241..0000000
Binary files a/html/UG/Images/Dmodel_fig4_a.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig4_a.PSD b/html/UG/Images/Dmodel_fig4_a.PSD
deleted file mode 100644
index 0196cb0..0000000
Binary files a/html/UG/Images/Dmodel_fig4_a.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig4_b.JPG b/html/UG/Images/Dmodel_fig4_b.JPG
deleted file mode 100644
index 90337a2..0000000
Binary files a/html/UG/Images/Dmodel_fig4_b.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig5.JPG b/html/UG/Images/Dmodel_fig5.JPG
deleted file mode 100644
index 24c8474..0000000
Binary files a/html/UG/Images/Dmodel_fig5.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig5.PSD b/html/UG/Images/Dmodel_fig5.PSD
deleted file mode 100644
index e8f4010..0000000
Binary files a/html/UG/Images/Dmodel_fig5.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig6.JPG b/html/UG/Images/Dmodel_fig6.JPG
deleted file mode 100644
index 1896f39..0000000
Binary files a/html/UG/Images/Dmodel_fig6.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig6.PSD b/html/UG/Images/Dmodel_fig6.PSD
deleted file mode 100644
index c350eda..0000000
Binary files a/html/UG/Images/Dmodel_fig6.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig7_b.JPG b/html/UG/Images/Dmodel_fig7_b.JPG
deleted file mode 100644
index fff5bd3..0000000
Binary files a/html/UG/Images/Dmodel_fig7_b.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig7_b.PSD b/html/UG/Images/Dmodel_fig7_b.PSD
deleted file mode 100644
index 0a536f2..0000000
Binary files a/html/UG/Images/Dmodel_fig7_b.PSD and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig8.JPG b/html/UG/Images/Dmodel_fig8.JPG
deleted file mode 100644
index bf7397b..0000000
Binary files a/html/UG/Images/Dmodel_fig8.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig9.JPG b/html/UG/Images/Dmodel_fig9.JPG
deleted file mode 100644
index 410060c..0000000
Binary files a/html/UG/Images/Dmodel_fig9.JPG and /dev/null differ
diff --git a/html/UG/Images/Dmodel_fig9.PSD b/html/UG/Images/Dmodel_fig9.PSD
deleted file mode 100644
index 248e72d..0000000
Binary files a/html/UG/Images/Dmodel_fig9.PSD and /dev/null differ
diff --git a/html/UG/Images/Dsets_NbitFloating1.JPG b/html/UG/Images/Dsets_NbitFloating1.JPG
deleted file mode 100644
index 410a285..0000000
Binary files a/html/UG/Images/Dsets_NbitFloating1.JPG and /dev/null differ
diff --git a/html/UG/Images/Dsets_NbitFloating2.JPG b/html/UG/Images/Dsets_NbitFloating2.JPG
deleted file mode 100644
index 795527e..0000000
Binary files a/html/UG/Images/Dsets_NbitFloating2.JPG and /dev/null differ
diff --git a/html/UG/Images/Dsets_NbitInteger1.JPG b/html/UG/Images/Dsets_NbitInteger1.JPG
deleted file mode 100644
index 392e603..0000000
Binary files a/html/UG/Images/Dsets_NbitInteger1.JPG and /dev/null differ
diff --git a/html/UG/Images/Dsets_NbitInteger2.JPG b/html/UG/Images/Dsets_NbitInteger2.JPG
deleted file mode 100644
index f129768..0000000
Binary files a/html/UG/Images/Dsets_NbitInteger2.JPG and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig1.JPG b/html/UG/Images/Dsets_fig1.JPG
deleted file mode 100644
index 41f11a8..0000000
Binary files a/html/UG/Images/Dsets_fig1.JPG and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig1.PSD b/html/UG/Images/Dsets_fig1.PSD
deleted file mode 100644
index 6ed9e04..0000000
Binary files a/html/UG/Images/Dsets_fig1.PSD and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig10.JPG b/html/UG/Images/Dsets_fig10.JPG
deleted file mode 100644
index 54fb442..0000000
Binary files a/html/UG/Images/Dsets_fig10.JPG and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig10.PSD b/html/UG/Images/Dsets_fig10.PSD
deleted file mode 100644
index dc8d762..0000000
Binary files a/html/UG/Images/Dsets_fig10.PSD and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig12.JPG b/html/UG/Images/Dsets_fig12.JPG
deleted file mode 100755
index 5e6b318..0000000
Binary files a/html/UG/Images/Dsets_fig12.JPG and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig12.PSD b/html/UG/Images/Dsets_fig12.PSD
deleted file mode 100755
index 2e335b6..0000000
Binary files a/html/UG/Images/Dsets_fig12.PSD and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig13.JPG b/html/UG/Images/Dsets_fig13.JPG
deleted file mode 100755
index e7ca7a1..0000000
Binary files a/html/UG/Images/Dsets_fig13.JPG and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig13.PSD b/html/UG/Images/Dsets_fig13.PSD
deleted file mode 100755
index bf4c77c..0000000
Binary files a/html/UG/Images/Dsets_fig13.PSD and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig14.JPG b/html/UG/Images/Dsets_fig14.JPG
deleted file mode 100755
index 1973ccf..0000000
Binary files a/html/UG/Images/Dsets_fig14.JPG and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig14.PSD b/html/UG/Images/Dsets_fig14.PSD
deleted file mode 100755
index 20d270e..0000000
Binary files a/html/UG/Images/Dsets_fig14.PSD and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig15.JPG b/html/UG/Images/Dsets_fig15.JPG
deleted file mode 100644
index 01bd576..0000000
Binary files a/html/UG/Images/Dsets_fig15.JPG and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig15.PSD b/html/UG/Images/Dsets_fig15.PSD
deleted file mode 100644
index 0f60a02..0000000
Binary files a/html/UG/Images/Dsets_fig15.PSD and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig16.JPG b/html/UG/Images/Dsets_fig16.JPG
deleted file mode 100644
index 21874ee..0000000
Binary files a/html/UG/Images/Dsets_fig16.JPG and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig16.PSD b/html/UG/Images/Dsets_fig16.PSD
deleted file mode 100644
index be76bb2..0000000
Binary files a/html/UG/Images/Dsets_fig16.PSD and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig19.JPG b/html/UG/Images/Dsets_fig19.JPG
deleted file mode 100644
index 37a700e..0000000
Binary files a/html/UG/Images/Dsets_fig19.JPG and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig19.PSD b/html/UG/Images/Dsets_fig19.PSD
deleted file mode 100644
index 4ee52d7..0000000
Binary files a/html/UG/Images/Dsets_fig19.PSD and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig2.JPG b/html/UG/Images/Dsets_fig2.JPG
deleted file mode 100644
index f3692c7..0000000
Binary files a/html/UG/Images/Dsets_fig2.JPG and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig2.PSD b/html/UG/Images/Dsets_fig2.PSD
deleted file mode 100644
index b74e560..0000000
Binary files a/html/UG/Images/Dsets_fig2.PSD and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig20.jpg b/html/UG/Images/Dsets_fig20.jpg
deleted file mode 100755
index 75848dc..0000000
Binary files a/html/UG/Images/Dsets_fig20.jpg and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig20.ppt b/html/UG/Images/Dsets_fig20.ppt
deleted file mode 100755
index b4a5262..0000000
Binary files a/html/UG/Images/Dsets_fig20.ppt and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig20.psd b/html/UG/Images/Dsets_fig20.psd
deleted file mode 100755
index ab9b65a..0000000
Binary files a/html/UG/Images/Dsets_fig20.psd and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig21.GIF b/html/UG/Images/Dsets_fig21.GIF
deleted file mode 100644
index 780c236..0000000
Binary files a/html/UG/Images/Dsets_fig21.GIF and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig5.JPG b/html/UG/Images/Dsets_fig5.JPG
deleted file mode 100644
index b788715..0000000
Binary files a/html/UG/Images/Dsets_fig5.JPG and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig5.PSD b/html/UG/Images/Dsets_fig5.PSD
deleted file mode 100644
index 43e3e60..0000000
Binary files a/html/UG/Images/Dsets_fig5.PSD and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig9.JPG b/html/UG/Images/Dsets_fig9.JPG
deleted file mode 100644
index 6dc43f2..0000000
Binary files a/html/UG/Images/Dsets_fig9.JPG and /dev/null differ
diff --git a/html/UG/Images/Dsets_fig9.PSD b/html/UG/Images/Dsets_fig9.PSD
deleted file mode 100644
index 3d15b40..0000000
Binary files a/html/UG/Images/Dsets_fig9.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig02-UNUSED.JPG b/html/UG/Images/Dspace_fig02-UNUSED.JPG
deleted file mode 100644
index b9184eb..0000000
Binary files a/html/UG/Images/Dspace_fig02-UNUSED.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig02.PSD b/html/UG/Images/Dspace_fig02.PSD
deleted file mode 100644
index 3266049..0000000
Binary files a/html/UG/Images/Dspace_fig02.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig03.JPG b/html/UG/Images/Dspace_fig03.JPG
deleted file mode 100644
index 1b8bfd4..0000000
Binary files a/html/UG/Images/Dspace_fig03.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig03.PSD b/html/UG/Images/Dspace_fig03.PSD
deleted file mode 100644
index a471970..0000000
Binary files a/html/UG/Images/Dspace_fig03.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig1.JPG b/html/UG/Images/Dspace_fig1.JPG
deleted file mode 100644
index 41f11a8..0000000
Binary files a/html/UG/Images/Dspace_fig1.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig1.PSD b/html/UG/Images/Dspace_fig1.PSD
deleted file mode 100644
index 6ed9e04..0000000
Binary files a/html/UG/Images/Dspace_fig1.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig10-2.JPG b/html/UG/Images/Dspace_fig10-2.JPG
deleted file mode 100644
index 3dc9ff5..0000000
Binary files a/html/UG/Images/Dspace_fig10-2.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig10-2.PSD b/html/UG/Images/Dspace_fig10-2.PSD
deleted file mode 100644
index 460877f..0000000
Binary files a/html/UG/Images/Dspace_fig10-2.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig10.JPG b/html/UG/Images/Dspace_fig10.JPG
deleted file mode 100644
index e970b0e..0000000
Binary files a/html/UG/Images/Dspace_fig10.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig10.PSD b/html/UG/Images/Dspace_fig10.PSD
deleted file mode 100644
index 89eb17b..0000000
Binary files a/html/UG/Images/Dspace_fig10.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig11.JPG b/html/UG/Images/Dspace_fig11.JPG
deleted file mode 100644
index bc59a22..0000000
Binary files a/html/UG/Images/Dspace_fig11.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig11.PSD b/html/UG/Images/Dspace_fig11.PSD
deleted file mode 100644
index f3bfc81..0000000
Binary files a/html/UG/Images/Dspace_fig11.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig14.JPG b/html/UG/Images/Dspace_fig14.JPG
deleted file mode 100644
index 05c1bd1..0000000
Binary files a/html/UG/Images/Dspace_fig14.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig14.PSD b/html/UG/Images/Dspace_fig14.PSD
deleted file mode 100644
index cdba33b..0000000
Binary files a/html/UG/Images/Dspace_fig14.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig16a.jpg b/html/UG/Images/Dspace_fig16a.jpg
deleted file mode 100755
index 769b1f7..0000000
Binary files a/html/UG/Images/Dspace_fig16a.jpg and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig16a.psd b/html/UG/Images/Dspace_fig16a.psd
deleted file mode 100755
index 7a723fa..0000000
Binary files a/html/UG/Images/Dspace_fig16a.psd and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig16b.jpg b/html/UG/Images/Dspace_fig16b.jpg
deleted file mode 100755
index 6c6a7e4..0000000
Binary files a/html/UG/Images/Dspace_fig16b.jpg and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig16b.ppt b/html/UG/Images/Dspace_fig16b.ppt
deleted file mode 100755
index d8a3a05..0000000
Binary files a/html/UG/Images/Dspace_fig16b.ppt and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig16c.jpg b/html/UG/Images/Dspace_fig16c.jpg
deleted file mode 100755
index 0a21921..0000000
Binary files a/html/UG/Images/Dspace_fig16c.jpg and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig16c.psd b/html/UG/Images/Dspace_fig16c.psd
deleted file mode 100755
index 6ab0250..0000000
Binary files a/html/UG/Images/Dspace_fig16c.psd and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig19.JPG b/html/UG/Images/Dspace_fig19.JPG
deleted file mode 100644
index 0ae5b70..0000000
Binary files a/html/UG/Images/Dspace_fig19.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig19.PSD b/html/UG/Images/Dspace_fig19.PSD
deleted file mode 100644
index 7a1afdb..0000000
Binary files a/html/UG/Images/Dspace_fig19.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig19a.PSD b/html/UG/Images/Dspace_fig19a.PSD
deleted file mode 100755
index 8dc42eb..0000000
Binary files a/html/UG/Images/Dspace_fig19a.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig19a.jpg b/html/UG/Images/Dspace_fig19a.jpg
deleted file mode 100755
index 2167e68..0000000
Binary files a/html/UG/Images/Dspace_fig19a.jpg and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig19b.jpg b/html/UG/Images/Dspace_fig19b.jpg
deleted file mode 100755
index 42a3ba7..0000000
Binary files a/html/UG/Images/Dspace_fig19b.jpg and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig19b.ppt b/html/UG/Images/Dspace_fig19b.ppt
deleted file mode 100755
index 7eaf8eb..0000000
Binary files a/html/UG/Images/Dspace_fig19b.ppt and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig19c.jpg b/html/UG/Images/Dspace_fig19c.jpg
deleted file mode 100755
index 506ef25..0000000
Binary files a/html/UG/Images/Dspace_fig19c.jpg and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig19c.psd b/html/UG/Images/Dspace_fig19c.psd
deleted file mode 100755
index 4173415..0000000
Binary files a/html/UG/Images/Dspace_fig19c.psd and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig1new.JPG b/html/UG/Images/Dspace_fig1new.JPG
deleted file mode 100644
index 92fc47a..0000000
Binary files a/html/UG/Images/Dspace_fig1new.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig21.JPG b/html/UG/Images/Dspace_fig21.JPG
deleted file mode 100644
index 3ef1f18..0000000
Binary files a/html/UG/Images/Dspace_fig21.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig21.PSD b/html/UG/Images/Dspace_fig21.PSD
deleted file mode 100644
index b841adb..0000000
Binary files a/html/UG/Images/Dspace_fig21.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig22.JPG b/html/UG/Images/Dspace_fig22.JPG
deleted file mode 100644
index e0cfbc5..0000000
Binary files a/html/UG/Images/Dspace_fig22.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig22.PSD b/html/UG/Images/Dspace_fig22.PSD
deleted file mode 100644
index de0eb41..0000000
Binary files a/html/UG/Images/Dspace_fig22.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig23.JPG b/html/UG/Images/Dspace_fig23.JPG
deleted file mode 100644
index e3276ba..0000000
Binary files a/html/UG/Images/Dspace_fig23.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig23.PSD b/html/UG/Images/Dspace_fig23.PSD
deleted file mode 100644
index 15b31ec..0000000
Binary files a/html/UG/Images/Dspace_fig23.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig24.JPG b/html/UG/Images/Dspace_fig24.JPG
deleted file mode 100644
index 0af6643..0000000
Binary files a/html/UG/Images/Dspace_fig24.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig24.PSD b/html/UG/Images/Dspace_fig24.PSD
deleted file mode 100644
index 7253795..0000000
Binary files a/html/UG/Images/Dspace_fig24.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig2a.JPG b/html/UG/Images/Dspace_fig2a.JPG
deleted file mode 100644
index 9e31f17..0000000
Binary files a/html/UG/Images/Dspace_fig2a.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig2b.JPG b/html/UG/Images/Dspace_fig2b.JPG
deleted file mode 100644
index 6b8be73..0000000
Binary files a/html/UG/Images/Dspace_fig2b.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig2c.JPG b/html/UG/Images/Dspace_fig2c.JPG
deleted file mode 100644
index be317e9..0000000
Binary files a/html/UG/Images/Dspace_fig2c.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig2d.JPG b/html/UG/Images/Dspace_fig2d.JPG
deleted file mode 100644
index 880bf5c..0000000
Binary files a/html/UG/Images/Dspace_fig2d.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig4-2.JPG b/html/UG/Images/Dspace_fig4-2.JPG
deleted file mode 100644
index ced30e2..0000000
Binary files a/html/UG/Images/Dspace_fig4-2.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig4-2.PSD b/html/UG/Images/Dspace_fig4-2.PSD
deleted file mode 100644
index 239de89..0000000
Binary files a/html/UG/Images/Dspace_fig4-2.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig4.JPG b/html/UG/Images/Dspace_fig4.JPG
deleted file mode 100644
index cf633b3..0000000
Binary files a/html/UG/Images/Dspace_fig4.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig4.PSD b/html/UG/Images/Dspace_fig4.PSD
deleted file mode 100644
index 3777f7e..0000000
Binary files a/html/UG/Images/Dspace_fig4.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig4a.gif b/html/UG/Images/Dspace_fig4a.gif
deleted file mode 100644
index e142b11..0000000
Binary files a/html/UG/Images/Dspace_fig4a.gif and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig5.JPG b/html/UG/Images/Dspace_fig5.JPG
deleted file mode 100644
index b83dd4b..0000000
Binary files a/html/UG/Images/Dspace_fig5.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig5.PSD b/html/UG/Images/Dspace_fig5.PSD
deleted file mode 100644
index 072512e..0000000
Binary files a/html/UG/Images/Dspace_fig5.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig6.JPG b/html/UG/Images/Dspace_fig6.JPG
deleted file mode 100644
index 911ae0f..0000000
Binary files a/html/UG/Images/Dspace_fig6.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig6.PSD b/html/UG/Images/Dspace_fig6.PSD
deleted file mode 100644
index 35da219..0000000
Binary files a/html/UG/Images/Dspace_fig6.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig7-2.JPG b/html/UG/Images/Dspace_fig7-2.JPG
deleted file mode 100644
index 657911e..0000000
Binary files a/html/UG/Images/Dspace_fig7-2.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig7-2.PSD b/html/UG/Images/Dspace_fig7-2.PSD
deleted file mode 100644
index f9e109a..0000000
Binary files a/html/UG/Images/Dspace_fig7-2.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig7.JPG b/html/UG/Images/Dspace_fig7.JPG
deleted file mode 100644
index ae04f11..0000000
Binary files a/html/UG/Images/Dspace_fig7.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig7.PSD b/html/UG/Images/Dspace_fig7.PSD
deleted file mode 100644
index 59269b3..0000000
Binary files a/html/UG/Images/Dspace_fig7.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig8.JPG b/html/UG/Images/Dspace_fig8.JPG
deleted file mode 100644
index 0b99610..0000000
Binary files a/html/UG/Images/Dspace_fig8.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig8.PSD b/html/UG/Images/Dspace_fig8.PSD
deleted file mode 100644
index 2bd0aa4..0000000
Binary files a/html/UG/Images/Dspace_fig8.PSD and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig9.JPG b/html/UG/Images/Dspace_fig9.JPG
deleted file mode 100644
index e3492ed..0000000
Binary files a/html/UG/Images/Dspace_fig9.JPG and /dev/null differ
diff --git a/html/UG/Images/Dspace_fig9.PSD b/html/UG/Images/Dspace_fig9.PSD
deleted file mode 100644
index 29012ef..0000000
Binary files a/html/UG/Images/Dspace_fig9.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig1.JPG b/html/UG/Images/Dtypes_fig1.JPG
deleted file mode 100644
index ec21f6e..0000000
Binary files a/html/UG/Images/Dtypes_fig1.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig1.PSD b/html/UG/Images/Dtypes_fig1.PSD
deleted file mode 100644
index 6f27070..0000000
Binary files a/html/UG/Images/Dtypes_fig1.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig10.JPG b/html/UG/Images/Dtypes_fig10.JPG
deleted file mode 100644
index 1db74f3..0000000
Binary files a/html/UG/Images/Dtypes_fig10.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig11.JPG b/html/UG/Images/Dtypes_fig11.JPG
deleted file mode 100644
index f2a7fb7..0000000
Binary files a/html/UG/Images/Dtypes_fig11.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig14.JPG b/html/UG/Images/Dtypes_fig14.JPG
deleted file mode 100644
index c3665ed..0000000
Binary files a/html/UG/Images/Dtypes_fig14.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig14.PSD b/html/UG/Images/Dtypes_fig14.PSD
deleted file mode 100644
index 2dade06..0000000
Binary files a/html/UG/Images/Dtypes_fig14.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig16.JPG b/html/UG/Images/Dtypes_fig16.JPG
deleted file mode 100644
index 4f53724..0000000
Binary files a/html/UG/Images/Dtypes_fig16.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig16.PSD b/html/UG/Images/Dtypes_fig16.PSD
deleted file mode 100644
index a2eb76f..0000000
Binary files a/html/UG/Images/Dtypes_fig16.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig16a.JPG b/html/UG/Images/Dtypes_fig16a.JPG
deleted file mode 100644
index 1007e59..0000000
Binary files a/html/UG/Images/Dtypes_fig16a.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig16b.JPG b/html/UG/Images/Dtypes_fig16b.JPG
deleted file mode 100644
index fb0250b..0000000
Binary files a/html/UG/Images/Dtypes_fig16b.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig16c.JPG b/html/UG/Images/Dtypes_fig16c.JPG
deleted file mode 100644
index 5ff5860..0000000
Binary files a/html/UG/Images/Dtypes_fig16c.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig16d.JPG b/html/UG/Images/Dtypes_fig16d.JPG
deleted file mode 100644
index 960501d..0000000
Binary files a/html/UG/Images/Dtypes_fig16d.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig17a.JPG b/html/UG/Images/Dtypes_fig17a.JPG
deleted file mode 100644
index f9e0854..0000000
Binary files a/html/UG/Images/Dtypes_fig17a.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig17b.JPG b/html/UG/Images/Dtypes_fig17b.JPG
deleted file mode 100644
index acffeea..0000000
Binary files a/html/UG/Images/Dtypes_fig17b.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig18.JPG b/html/UG/Images/Dtypes_fig18.JPG
deleted file mode 100644
index 171e9aa..0000000
Binary files a/html/UG/Images/Dtypes_fig18.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig18.PSD b/html/UG/Images/Dtypes_fig18.PSD
deleted file mode 100644
index 9c2b8d1..0000000
Binary files a/html/UG/Images/Dtypes_fig18.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig18_a.PSD b/html/UG/Images/Dtypes_fig18_a.PSD
deleted file mode 100644
index e08d533..0000000
Binary files a/html/UG/Images/Dtypes_fig18_a.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig18_a.jpg b/html/UG/Images/Dtypes_fig18_a.jpg
deleted file mode 100644
index dabaf29..0000000
Binary files a/html/UG/Images/Dtypes_fig18_a.jpg and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig18_b.PSD b/html/UG/Images/Dtypes_fig18_b.PSD
deleted file mode 100644
index 76c4095..0000000
Binary files a/html/UG/Images/Dtypes_fig18_b.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig18_b.jpg b/html/UG/Images/Dtypes_fig18_b.jpg
deleted file mode 100644
index 006b2fd..0000000
Binary files a/html/UG/Images/Dtypes_fig18_b.jpg and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig19.JPG b/html/UG/Images/Dtypes_fig19.JPG
deleted file mode 100644
index ee1d0d6..0000000
Binary files a/html/UG/Images/Dtypes_fig19.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig19.PSD b/html/UG/Images/Dtypes_fig19.PSD
deleted file mode 100644
index 49484a0..0000000
Binary files a/html/UG/Images/Dtypes_fig19.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig19_a.PSD b/html/UG/Images/Dtypes_fig19_a.PSD
deleted file mode 100755
index c4d2900..0000000
Binary files a/html/UG/Images/Dtypes_fig19_a.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig19_a.jpg b/html/UG/Images/Dtypes_fig19_a.jpg
deleted file mode 100755
index baa9ac4..0000000
Binary files a/html/UG/Images/Dtypes_fig19_a.jpg and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig19_b.PSD b/html/UG/Images/Dtypes_fig19_b.PSD
deleted file mode 100755
index 1f30cf2..0000000
Binary files a/html/UG/Images/Dtypes_fig19_b.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig19_b.jpg b/html/UG/Images/Dtypes_fig19_b.jpg
deleted file mode 100755
index 118b666..0000000
Binary files a/html/UG/Images/Dtypes_fig19_b.jpg and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig19_c.PSD b/html/UG/Images/Dtypes_fig19_c.PSD
deleted file mode 100755
index a6ad127..0000000
Binary files a/html/UG/Images/Dtypes_fig19_c.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig19_c.jpg b/html/UG/Images/Dtypes_fig19_c.jpg
deleted file mode 100755
index 98fb9e0..0000000
Binary files a/html/UG/Images/Dtypes_fig19_c.jpg and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig19_d.PSD b/html/UG/Images/Dtypes_fig19_d.PSD
deleted file mode 100755
index a7cc3de..0000000
Binary files a/html/UG/Images/Dtypes_fig19_d.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig19_d.jpg b/html/UG/Images/Dtypes_fig19_d.jpg
deleted file mode 100755
index 0b2a367..0000000
Binary files a/html/UG/Images/Dtypes_fig19_d.jpg and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig2.JPG b/html/UG/Images/Dtypes_fig2.JPG
deleted file mode 100644
index 4f34ca1..0000000
Binary files a/html/UG/Images/Dtypes_fig2.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig2.PSD b/html/UG/Images/Dtypes_fig2.PSD
deleted file mode 100644
index 13c602c..0000000
Binary files a/html/UG/Images/Dtypes_fig2.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig20a.JPG b/html/UG/Images/Dtypes_fig20a.JPG
deleted file mode 100644
index caaaeb3..0000000
Binary files a/html/UG/Images/Dtypes_fig20a.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig20b.JPG b/html/UG/Images/Dtypes_fig20b.JPG
deleted file mode 100644
index c77269b..0000000
Binary files a/html/UG/Images/Dtypes_fig20b.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig20c.JPG b/html/UG/Images/Dtypes_fig20c.JPG
deleted file mode 100644
index ad84072..0000000
Binary files a/html/UG/Images/Dtypes_fig20c.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig20d.JPG b/html/UG/Images/Dtypes_fig20d.JPG
deleted file mode 100644
index bd843d0..0000000
Binary files a/html/UG/Images/Dtypes_fig20d.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig23.JPG b/html/UG/Images/Dtypes_fig23.JPG
deleted file mode 100644
index 7659f10..0000000
Binary files a/html/UG/Images/Dtypes_fig23.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig23.PSD b/html/UG/Images/Dtypes_fig23.PSD
deleted file mode 100644
index 450cdfc..0000000
Binary files a/html/UG/Images/Dtypes_fig23.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig25.JPG b/html/UG/Images/Dtypes_fig25.JPG
deleted file mode 100644
index 7861add..0000000
Binary files a/html/UG/Images/Dtypes_fig25.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig25.PSD b/html/UG/Images/Dtypes_fig25.PSD
deleted file mode 100644
index bd0afe5..0000000
Binary files a/html/UG/Images/Dtypes_fig25.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig26_pic1of4.JPG b/html/UG/Images/Dtypes_fig26_pic1of4.JPG
deleted file mode 100644
index 3b3dfdb..0000000
Binary files a/html/UG/Images/Dtypes_fig26_pic1of4.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig26_pic1of4.PSD b/html/UG/Images/Dtypes_fig26_pic1of4.PSD
deleted file mode 100644
index 3eab09b..0000000
Binary files a/html/UG/Images/Dtypes_fig26_pic1of4.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig26_pic2of4.JPG b/html/UG/Images/Dtypes_fig26_pic2of4.JPG
deleted file mode 100644
index 29d0323..0000000
Binary files a/html/UG/Images/Dtypes_fig26_pic2of4.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig26_pic2of4.PSD b/html/UG/Images/Dtypes_fig26_pic2of4.PSD
deleted file mode 100644
index f4afe69..0000000
Binary files a/html/UG/Images/Dtypes_fig26_pic2of4.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig26_pic3of4.JPG b/html/UG/Images/Dtypes_fig26_pic3of4.JPG
deleted file mode 100644
index 1e2fea1..0000000
Binary files a/html/UG/Images/Dtypes_fig26_pic3of4.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig26_pic3of4.PSD b/html/UG/Images/Dtypes_fig26_pic3of4.PSD
deleted file mode 100644
index f630a28..0000000
Binary files a/html/UG/Images/Dtypes_fig26_pic3of4.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig26_pic4of4.JPG b/html/UG/Images/Dtypes_fig26_pic4of4.JPG
deleted file mode 100644
index 723a5f7..0000000
Binary files a/html/UG/Images/Dtypes_fig26_pic4of4.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig26_pic4of4.PSD b/html/UG/Images/Dtypes_fig26_pic4of4.PSD
deleted file mode 100644
index 7ad6a84..0000000
Binary files a/html/UG/Images/Dtypes_fig26_pic4of4.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig28.JPG b/html/UG/Images/Dtypes_fig28.JPG
deleted file mode 100644
index 43e3062..0000000
Binary files a/html/UG/Images/Dtypes_fig28.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig28.PSD b/html/UG/Images/Dtypes_fig28.PSD
deleted file mode 100644
index 20e1c59..0000000
Binary files a/html/UG/Images/Dtypes_fig28.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig3.JPG b/html/UG/Images/Dtypes_fig3.JPG
deleted file mode 100644
index 53b0929..0000000
Binary files a/html/UG/Images/Dtypes_fig3.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig3.PSD b/html/UG/Images/Dtypes_fig3.PSD
deleted file mode 100644
index c480252..0000000
Binary files a/html/UG/Images/Dtypes_fig3.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig33.JPG b/html/UG/Images/Dtypes_fig33.JPG
deleted file mode 100644
index b7a30f2..0000000
Binary files a/html/UG/Images/Dtypes_fig33.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig33.PSD b/html/UG/Images/Dtypes_fig33.PSD
deleted file mode 100644
index a9098b2..0000000
Binary files a/html/UG/Images/Dtypes_fig33.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig34.JPG b/html/UG/Images/Dtypes_fig34.JPG
deleted file mode 100644
index 3aa050a..0000000
Binary files a/html/UG/Images/Dtypes_fig34.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig34.PSD b/html/UG/Images/Dtypes_fig34.PSD
deleted file mode 100644
index 60bae79..0000000
Binary files a/html/UG/Images/Dtypes_fig34.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig4.JPG b/html/UG/Images/Dtypes_fig4.JPG
deleted file mode 100644
index e2a5c59..0000000
Binary files a/html/UG/Images/Dtypes_fig4.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig4.PSD b/html/UG/Images/Dtypes_fig4.PSD
deleted file mode 100644
index 675adda..0000000
Binary files a/html/UG/Images/Dtypes_fig4.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig40.JPG b/html/UG/Images/Dtypes_fig40.JPG
deleted file mode 100644
index 416a17d..0000000
Binary files a/html/UG/Images/Dtypes_fig40.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig40.PSD b/html/UG/Images/Dtypes_fig40.PSD
deleted file mode 100644
index bada0c0..0000000
Binary files a/html/UG/Images/Dtypes_fig40.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig45.JPG b/html/UG/Images/Dtypes_fig45.JPG
deleted file mode 100644
index 93cf7ff..0000000
Binary files a/html/UG/Images/Dtypes_fig45.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig45.PSD b/html/UG/Images/Dtypes_fig45.PSD
deleted file mode 100644
index 92b9bdb..0000000
Binary files a/html/UG/Images/Dtypes_fig45.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig47.JPG b/html/UG/Images/Dtypes_fig47.JPG
deleted file mode 100644
index 168bbed..0000000
Binary files a/html/UG/Images/Dtypes_fig47.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig47.PSD b/html/UG/Images/Dtypes_fig47.PSD
deleted file mode 100644
index 8abb500..0000000
Binary files a/html/UG/Images/Dtypes_fig47.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig5.JPG b/html/UG/Images/Dtypes_fig5.JPG
deleted file mode 100644
index 94135ed..0000000
Binary files a/html/UG/Images/Dtypes_fig5.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig50.JPG b/html/UG/Images/Dtypes_fig50.JPG
deleted file mode 100644
index 449fa20..0000000
Binary files a/html/UG/Images/Dtypes_fig50.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig50.PSD b/html/UG/Images/Dtypes_fig50.PSD
deleted file mode 100644
index 042f9a9..0000000
Binary files a/html/UG/Images/Dtypes_fig50.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig51.JPG b/html/UG/Images/Dtypes_fig51.JPG
deleted file mode 100644
index 8896aa9..0000000
Binary files a/html/UG/Images/Dtypes_fig51.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig51.PSD b/html/UG/Images/Dtypes_fig51.PSD
deleted file mode 100644
index 6ff677d..0000000
Binary files a/html/UG/Images/Dtypes_fig51.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig53.JPG b/html/UG/Images/Dtypes_fig53.JPG
deleted file mode 100644
index 2916d14..0000000
Binary files a/html/UG/Images/Dtypes_fig53.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig53.PSD b/html/UG/Images/Dtypes_fig53.PSD
deleted file mode 100644
index 8b30dc1..0000000
Binary files a/html/UG/Images/Dtypes_fig53.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig54.JPG b/html/UG/Images/Dtypes_fig54.JPG
deleted file mode 100644
index 5a16486..0000000
Binary files a/html/UG/Images/Dtypes_fig54.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig54.PSD b/html/UG/Images/Dtypes_fig54.PSD
deleted file mode 100644
index 12a2e31..0000000
Binary files a/html/UG/Images/Dtypes_fig54.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig57_arrow.jpg b/html/UG/Images/Dtypes_fig57_arrow.jpg
deleted file mode 100644
index e0a8ac8..0000000
Binary files a/html/UG/Images/Dtypes_fig57_arrow.jpg and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig57_arrow.psd b/html/UG/Images/Dtypes_fig57_arrow.psd
deleted file mode 100644
index 972aff3..0000000
Binary files a/html/UG/Images/Dtypes_fig57_arrow.psd and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig57a.JPG b/html/UG/Images/Dtypes_fig57a.JPG
deleted file mode 100644
index d36c6b3..0000000
Binary files a/html/UG/Images/Dtypes_fig57a.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig57b.JPG b/html/UG/Images/Dtypes_fig57b.JPG
deleted file mode 100644
index 5cac65e..0000000
Binary files a/html/UG/Images/Dtypes_fig57b.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig58.JPG b/html/UG/Images/Dtypes_fig58.JPG
deleted file mode 100644
index 4199403..0000000
Binary files a/html/UG/Images/Dtypes_fig58.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig58_arrow.PSD b/html/UG/Images/Dtypes_fig58_arrow.PSD
deleted file mode 100644
index b6934d6..0000000
Binary files a/html/UG/Images/Dtypes_fig58_arrow.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig58_arrow.jpg b/html/UG/Images/Dtypes_fig58_arrow.jpg
deleted file mode 100644
index 26128a8..0000000
Binary files a/html/UG/Images/Dtypes_fig58_arrow.jpg and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig6.JPG b/html/UG/Images/Dtypes_fig6.JPG
deleted file mode 100644
index ae895e0..0000000
Binary files a/html/UG/Images/Dtypes_fig6.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig60.JPG b/html/UG/Images/Dtypes_fig60.JPG
deleted file mode 100644
index 5432c7e..0000000
Binary files a/html/UG/Images/Dtypes_fig60.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig60.PSD b/html/UG/Images/Dtypes_fig60.PSD
deleted file mode 100644
index c9a31e9..0000000
Binary files a/html/UG/Images/Dtypes_fig60.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig62.JPG b/html/UG/Images/Dtypes_fig62.JPG
deleted file mode 100644
index 3d4b531..0000000
Binary files a/html/UG/Images/Dtypes_fig62.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig62.PSD b/html/UG/Images/Dtypes_fig62.PSD
deleted file mode 100644
index 8d066a4..0000000
Binary files a/html/UG/Images/Dtypes_fig62.PSD and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig7.JPG b/html/UG/Images/Dtypes_fig7.JPG
deleted file mode 100644
index 78d60e2..0000000
Binary files a/html/UG/Images/Dtypes_fig7.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig8.JPG b/html/UG/Images/Dtypes_fig8.JPG
deleted file mode 100644
index f44b368..0000000
Binary files a/html/UG/Images/Dtypes_fig8.JPG and /dev/null differ
diff --git a/html/UG/Images/Dtypes_fig9.JPG b/html/UG/Images/Dtypes_fig9.JPG
deleted file mode 100644
index 7a9181f..0000000
Binary files a/html/UG/Images/Dtypes_fig9.JPG and /dev/null differ
diff --git a/html/UG/Images/Files_fig3.JPG b/html/UG/Images/Files_fig3.JPG
deleted file mode 100644
index 73591fa..0000000
Binary files a/html/UG/Images/Files_fig3.JPG and /dev/null differ
diff --git a/html/UG/Images/Files_fig4.JPG b/html/UG/Images/Files_fig4.JPG
deleted file mode 100644
index 1d5918f..0000000
Binary files a/html/UG/Images/Files_fig4.JPG and /dev/null differ
diff --git a/html/UG/Images/Group_fig1.PSD b/html/UG/Images/Group_fig1.PSD
deleted file mode 100644
index 7a6c6d2..0000000
Binary files a/html/UG/Images/Group_fig1.PSD and /dev/null differ
diff --git a/html/UG/Images/Group_fig1.jpg b/html/UG/Images/Group_fig1.jpg
deleted file mode 100644
index ada18bc..0000000
Binary files a/html/UG/Images/Group_fig1.jpg and /dev/null differ
diff --git a/html/UG/Images/Group_fig2,8.PSD b/html/UG/Images/Group_fig2,8.PSD
deleted file mode 100644
index 1cfaae6..0000000
Binary files a/html/UG/Images/Group_fig2,8.PSD and /dev/null differ
diff --git a/html/UG/Images/Group_fig2,8.jpg b/html/UG/Images/Group_fig2,8.jpg
deleted file mode 100644
index aaee4f8..0000000
Binary files a/html/UG/Images/Group_fig2,8.jpg and /dev/null differ
diff --git a/html/UG/Images/Group_fig3.jpg b/html/UG/Images/Group_fig3.jpg
deleted file mode 100644
index 7c268ad..0000000
Binary files a/html/UG/Images/Group_fig3.jpg and /dev/null differ
diff --git a/html/UG/Images/Group_fig3.psd b/html/UG/Images/Group_fig3.psd
deleted file mode 100644
index 6e20bb4..0000000
Binary files a/html/UG/Images/Group_fig3.psd and /dev/null differ
diff --git a/html/UG/Images/Groups_fig5a.JPG b/html/UG/Images/Groups_fig5a.JPG
deleted file mode 100644
index aa991ec..0000000
Binary files a/html/UG/Images/Groups_fig5a.JPG and /dev/null differ
diff --git a/html/UG/Images/Groups_fig6.JPG b/html/UG/Images/Groups_fig6.JPG
deleted file mode 100644
index 5ad8ffa..0000000
Binary files a/html/UG/Images/Groups_fig6.JPG and /dev/null differ
diff --git a/html/UG/Images/Pmodel_fig2.JPG b/html/UG/Images/Pmodel_fig2.JPG
deleted file mode 100644
index af077f8..0000000
Binary files a/html/UG/Images/Pmodel_fig2.JPG and /dev/null differ
diff --git a/html/UG/Images/Pmodel_fig26.JPG b/html/UG/Images/Pmodel_fig26.JPG
deleted file mode 100755
index 2c5e7aa..0000000
Binary files a/html/UG/Images/Pmodel_fig26.JPG and /dev/null differ
diff --git a/html/UG/Images/Pmodel_fig26.PSD b/html/UG/Images/Pmodel_fig26.PSD
deleted file mode 100755
index 96fbae1..0000000
Binary files a/html/UG/Images/Pmodel_fig26.PSD and /dev/null differ
diff --git a/html/UG/Images/Pmodel_fig3.JPG b/html/UG/Images/Pmodel_fig3.JPG
deleted file mode 100644
index da8fba6..0000000
Binary files a/html/UG/Images/Pmodel_fig3.JPG and /dev/null differ
diff --git a/html/UG/Images/Pmodel_fig5_a.jpg b/html/UG/Images/Pmodel_fig5_a.jpg
deleted file mode 100755
index 08397e8..0000000
Binary files a/html/UG/Images/Pmodel_fig5_a.jpg and /dev/null differ
diff --git a/html/UG/Images/Pmodel_fig5_a.ppt b/html/UG/Images/Pmodel_fig5_a.ppt
deleted file mode 100755
index 4656a48..0000000
Binary files a/html/UG/Images/Pmodel_fig5_a.ppt and /dev/null differ
diff --git a/html/UG/Images/Pmodel_fig5_a.psd b/html/UG/Images/Pmodel_fig5_a.psd
deleted file mode 100755
index 9b647a2..0000000
Binary files a/html/UG/Images/Pmodel_fig5_a.psd and /dev/null differ
diff --git a/html/UG/Images/Pmodel_fig5_b.jpg b/html/UG/Images/Pmodel_fig5_b.jpg
deleted file mode 100755
index 4924fb6..0000000
Binary files a/html/UG/Images/Pmodel_fig5_b.jpg and /dev/null differ
diff --git a/html/UG/Images/Pmodel_fig5_b.ppt b/html/UG/Images/Pmodel_fig5_b.ppt
deleted file mode 100755
index 8f13e6b..0000000
Binary files a/html/UG/Images/Pmodel_fig5_b.ppt and /dev/null differ
diff --git a/html/UG/Images/Pmodel_fig5_b.psd b/html/UG/Images/Pmodel_fig5_b.psd
deleted file mode 100755
index d4b12af..0000000
Binary files a/html/UG/Images/Pmodel_fig5_b.psd and /dev/null differ
diff --git a/html/UG/Images/Pmodel_fig5_c.jpg b/html/UG/Images/Pmodel_fig5_c.jpg
deleted file mode 100755
index 3a20bfc..0000000
Binary files a/html/UG/Images/Pmodel_fig5_c.jpg and /dev/null differ
diff --git a/html/UG/Images/Pmodel_fig5_c.ppt b/html/UG/Images/Pmodel_fig5_c.ppt
deleted file mode 100755
index 223518c..0000000
Binary files a/html/UG/Images/Pmodel_fig5_c.ppt and /dev/null differ
diff --git a/html/UG/Images/Pmodel_fig5_c.psd b/html/UG/Images/Pmodel_fig5_c.psd
deleted file mode 100755
index 4f6cf18..0000000
Binary files a/html/UG/Images/Pmodel_fig5_c.psd and /dev/null differ
diff --git a/html/UG/Images/Pmodel_fig5_d.jpg b/html/UG/Images/Pmodel_fig5_d.jpg
deleted file mode 100755
index f93a187..0000000
Binary files a/html/UG/Images/Pmodel_fig5_d.jpg and /dev/null differ
diff --git a/html/UG/Images/Pmodel_fig5_d.ppt b/html/UG/Images/Pmodel_fig5_d.ppt
deleted file mode 100755
index f63cf24..0000000
Binary files a/html/UG/Images/Pmodel_fig5_d.ppt and /dev/null differ
diff --git a/html/UG/Images/Pmodel_fig5_d.psd b/html/UG/Images/Pmodel_fig5_d.psd
deleted file mode 100755
index 44fa4d7..0000000
Binary files a/html/UG/Images/Pmodel_fig5_d.psd and /dev/null differ
diff --git a/html/UG/Images/Pmodel_fig5_e.jpg b/html/UG/Images/Pmodel_fig5_e.jpg
deleted file mode 100755
index a99eaf6..0000000
Binary files a/html/UG/Images/Pmodel_fig5_e.jpg and /dev/null differ
diff --git a/html/UG/Images/Pmodel_fig5_e.ppt b/html/UG/Images/Pmodel_fig5_e.ppt
deleted file mode 100755
index 7221f5e..0000000
Binary files a/html/UG/Images/Pmodel_fig5_e.ppt and /dev/null differ
diff --git a/html/UG/Images/Pmodel_fig5_e.psd b/html/UG/Images/Pmodel_fig5_e.psd
deleted file mode 100755
index 591d298..0000000
Binary files a/html/UG/Images/Pmodel_fig5_e.psd and /dev/null differ
diff --git a/html/UG/Images/PropListClassInheritance.png b/html/UG/Images/PropListClassInheritance.png
deleted file mode 100644
index ea7bdc3..0000000
Binary files a/html/UG/Images/PropListClassInheritance.png and /dev/null differ
diff --git a/html/UG/Images/PropListEcosystem.png b/html/UG/Images/PropListEcosystem.png
deleted file mode 100644
index 01d5f81..0000000
Binary files a/html/UG/Images/PropListEcosystem.png and /dev/null differ
diff --git a/html/UG/Images/Shared_Attribute.jpg b/html/UG/Images/Shared_Attribute.jpg
deleted file mode 100644
index 058eeec..0000000
Binary files a/html/UG/Images/Shared_Attribute.jpg and /dev/null differ
diff --git a/html/UG/Images/Shared_Attribute.psd b/html/UG/Images/Shared_Attribute.psd
deleted file mode 100644
index 02218b4..0000000
Binary files a/html/UG/Images/Shared_Attribute.psd and /dev/null differ
diff --git a/html/UG/Images/UML_Attribute.PSD b/html/UG/Images/UML_Attribute.PSD
deleted file mode 100644
index 4c568f7..0000000
Binary files a/html/UG/Images/UML_Attribute.PSD and /dev/null differ
diff --git a/html/UG/Images/UML_Attribute.jpg b/html/UG/Images/UML_Attribute.jpg
deleted file mode 100644
index 5b3db7d..0000000
Binary files a/html/UG/Images/UML_Attribute.jpg and /dev/null differ
diff --git a/html/UG/Images/UML_FileAndProps.gif b/html/UG/Images/UML_FileAndProps.gif
deleted file mode 100644
index 1de96c6..0000000
Binary files a/html/UG/Images/UML_FileAndProps.gif and /dev/null differ
diff --git a/html/UG/Images/VFL_Drivers.gif b/html/UG/Images/VFL_Drivers.gif
deleted file mode 100644
index 4b626c6..0000000
Binary files a/html/UG/Images/VFL_Drivers.gif and /dev/null differ
diff --git a/html/UG/Images/VFL_Drivers.jpg b/html/UG/Images/VFL_Drivers.jpg
deleted file mode 100755
index 38d0ca5..0000000
Binary files a/html/UG/Images/VFL_Drivers.jpg and /dev/null differ
diff --git a/html/UG/Images/VFL_Drivers.psd b/html/UG/Images/VFL_Drivers.psd
deleted file mode 100755
index 22f82fa..0000000
Binary files a/html/UG/Images/VFL_Drivers.psd and /dev/null differ
diff --git a/html/UG/Images/back.png b/html/UG/Images/back.png
deleted file mode 100644
index b4ecc01..0000000
Binary files a/html/UG/Images/back.png and /dev/null differ
diff --git a/html/UG/Images/dtypes_fig51new.JPG b/html/UG/Images/dtypes_fig51new.JPG
deleted file mode 100644
index 99ce753..0000000
Binary files a/html/UG/Images/dtypes_fig51new.JPG and /dev/null differ
diff --git a/html/UG/Images/dtypes_fig57_arrowWithText.JPG b/html/UG/Images/dtypes_fig57_arrowWithText.JPG
deleted file mode 100644
index a2eec7a..0000000
Binary files a/html/UG/Images/dtypes_fig57_arrowWithText.JPG and /dev/null differ
diff --git a/html/UG/Images/forward.png b/html/UG/Images/forward.png
deleted file mode 100644
index 5bcfd48..0000000
Binary files a/html/UG/Images/forward.png and /dev/null differ
diff --git a/html/UG/Images/groups_fig1a.JPG b/html/UG/Images/groups_fig1a.JPG
deleted file mode 100644
index 1607149..0000000
Binary files a/html/UG/Images/groups_fig1a.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig20.JPG b/html/UG/Images/groups_fig20.JPG
deleted file mode 100644
index 33a4c8f..0000000
Binary files a/html/UG/Images/groups_fig20.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig20.PSD b/html/UG/Images/groups_fig20.PSD
deleted file mode 100644
index 1017e02..0000000
Binary files a/html/UG/Images/groups_fig20.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig21.JPG b/html/UG/Images/groups_fig21.JPG
deleted file mode 100644
index 96c1004..0000000
Binary files a/html/UG/Images/groups_fig21.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig21.PSD b/html/UG/Images/groups_fig21.PSD
deleted file mode 100644
index 567c9c0..0000000
Binary files a/html/UG/Images/groups_fig21.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig22.JPG b/html/UG/Images/groups_fig22.JPG
deleted file mode 100644
index 21383e2..0000000
Binary files a/html/UG/Images/groups_fig22.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig22.PSD b/html/UG/Images/groups_fig22.PSD
deleted file mode 100644
index 81795c6..0000000
Binary files a/html/UG/Images/groups_fig22.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig23.JPG b/html/UG/Images/groups_fig23.JPG
deleted file mode 100644
index cc1e469..0000000
Binary files a/html/UG/Images/groups_fig23.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig23.PSD b/html/UG/Images/groups_fig23.PSD
deleted file mode 100644
index d431f51..0000000
Binary files a/html/UG/Images/groups_fig23.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig24.JPG b/html/UG/Images/groups_fig24.JPG
deleted file mode 100644
index 48b6154..0000000
Binary files a/html/UG/Images/groups_fig24.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig24.PSD b/html/UG/Images/groups_fig24.PSD
deleted file mode 100644
index aa805e6..0000000
Binary files a/html/UG/Images/groups_fig24.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig25_a.JPG b/html/UG/Images/groups_fig25_a.JPG
deleted file mode 100644
index 17d0995..0000000
Binary files a/html/UG/Images/groups_fig25_a.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig25_a.PSD b/html/UG/Images/groups_fig25_a.PSD
deleted file mode 100644
index 736bc25..0000000
Binary files a/html/UG/Images/groups_fig25_a.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig25_b.JPG b/html/UG/Images/groups_fig25_b.JPG
deleted file mode 100644
index 71cb8ba..0000000
Binary files a/html/UG/Images/groups_fig25_b.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig25_b.PSD b/html/UG/Images/groups_fig25_b.PSD
deleted file mode 100644
index aec245b..0000000
Binary files a/html/UG/Images/groups_fig25_b.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig25_c.JPG b/html/UG/Images/groups_fig25_c.JPG
deleted file mode 100644
index b080e31..0000000
Binary files a/html/UG/Images/groups_fig25_c.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig25_c.PSD b/html/UG/Images/groups_fig25_c.PSD
deleted file mode 100644
index f41ff95..0000000
Binary files a/html/UG/Images/groups_fig25_c.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig26.JPG b/html/UG/Images/groups_fig26.JPG
deleted file mode 100644
index f8a451e..0000000
Binary files a/html/UG/Images/groups_fig26.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig26.PSD b/html/UG/Images/groups_fig26.PSD
deleted file mode 100644
index be3a18e..0000000
Binary files a/html/UG/Images/groups_fig26.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig27_a.JPG b/html/UG/Images/groups_fig27_a.JPG
deleted file mode 100644
index e71be62..0000000
Binary files a/html/UG/Images/groups_fig27_a.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig27_a.PSD b/html/UG/Images/groups_fig27_a.PSD
deleted file mode 100644
index 73d9ad8..0000000
Binary files a/html/UG/Images/groups_fig27_a.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig27_aa.JPG b/html/UG/Images/groups_fig27_aa.JPG
deleted file mode 100644
index b080e31..0000000
Binary files a/html/UG/Images/groups_fig27_aa.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig27_aa.PSD b/html/UG/Images/groups_fig27_aa.PSD
deleted file mode 100644
index cc56201..0000000
Binary files a/html/UG/Images/groups_fig27_aa.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig27_b.JPG b/html/UG/Images/groups_fig27_b.JPG
deleted file mode 100644
index ee53b0f..0000000
Binary files a/html/UG/Images/groups_fig27_b.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig27_b.PSD b/html/UG/Images/groups_fig27_b.PSD
deleted file mode 100644
index a03e267..0000000
Binary files a/html/UG/Images/groups_fig27_b.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig27_bb.JPG b/html/UG/Images/groups_fig27_bb.JPG
deleted file mode 100644
index 88ccdf6..0000000
Binary files a/html/UG/Images/groups_fig27_bb.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig27_bb.PSD b/html/UG/Images/groups_fig27_bb.PSD
deleted file mode 100644
index 5c5feb6..0000000
Binary files a/html/UG/Images/groups_fig27_bb.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig28_a.JPG b/html/UG/Images/groups_fig28_a.JPG
deleted file mode 100644
index 83eb2a1..0000000
Binary files a/html/UG/Images/groups_fig28_a.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig28_a.PSD b/html/UG/Images/groups_fig28_a.PSD
deleted file mode 100644
index d14fdbc..0000000
Binary files a/html/UG/Images/groups_fig28_a.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig28_b.JPG b/html/UG/Images/groups_fig28_b.JPG
deleted file mode 100644
index afb2dd5..0000000
Binary files a/html/UG/Images/groups_fig28_b.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig28_b.PSD b/html/UG/Images/groups_fig28_b.PSD
deleted file mode 100644
index a928bb1..0000000
Binary files a/html/UG/Images/groups_fig28_b.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig28_c.JPG b/html/UG/Images/groups_fig28_c.JPG
deleted file mode 100644
index 327802f..0000000
Binary files a/html/UG/Images/groups_fig28_c.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig28_c.PSD b/html/UG/Images/groups_fig28_c.PSD
deleted file mode 100644
index 306d87f..0000000
Binary files a/html/UG/Images/groups_fig28_c.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig28_d.JPG b/html/UG/Images/groups_fig28_d.JPG
deleted file mode 100644
index 87fd464..0000000
Binary files a/html/UG/Images/groups_fig28_d.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig28_d.PSD b/html/UG/Images/groups_fig28_d.PSD
deleted file mode 100644
index 6a34364..0000000
Binary files a/html/UG/Images/groups_fig28_d.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig29_a.JPG b/html/UG/Images/groups_fig29_a.JPG
deleted file mode 100644
index 22bc1b5..0000000
Binary files a/html/UG/Images/groups_fig29_a.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig29_a.PSD b/html/UG/Images/groups_fig29_a.PSD
deleted file mode 100644
index fe45da6..0000000
Binary files a/html/UG/Images/groups_fig29_a.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig29_b.JPG b/html/UG/Images/groups_fig29_b.JPG
deleted file mode 100644
index 91fc309..0000000
Binary files a/html/UG/Images/groups_fig29_b.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig29_b.PSD b/html/UG/Images/groups_fig29_b.PSD
deleted file mode 100644
index f7d5b08..0000000
Binary files a/html/UG/Images/groups_fig29_b.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig29_c.JPG b/html/UG/Images/groups_fig29_c.JPG
deleted file mode 100644
index 8294b99..0000000
Binary files a/html/UG/Images/groups_fig29_c.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig29_c.PSD b/html/UG/Images/groups_fig29_c.PSD
deleted file mode 100644
index 244defd..0000000
Binary files a/html/UG/Images/groups_fig29_c.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig29_d.JPG b/html/UG/Images/groups_fig29_d.JPG
deleted file mode 100644
index 48617ba..0000000
Binary files a/html/UG/Images/groups_fig29_d.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig29_d.PSD b/html/UG/Images/groups_fig29_d.PSD
deleted file mode 100644
index 2ef268a..0000000
Binary files a/html/UG/Images/groups_fig29_d.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig2a.JPG b/html/UG/Images/groups_fig2a.JPG
deleted file mode 100644
index 21c5a0a..0000000
Binary files a/html/UG/Images/groups_fig2a.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig2a_Ex5.JPG b/html/UG/Images/groups_fig2a_Ex5.JPG
deleted file mode 100644
index 2c4652e..0000000
Binary files a/html/UG/Images/groups_fig2a_Ex5.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig2a_Ex8.JPG b/html/UG/Images/groups_fig2a_Ex8.JPG
deleted file mode 100644
index 7def09a..0000000
Binary files a/html/UG/Images/groups_fig2a_Ex8.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig3a.JPG b/html/UG/Images/groups_fig3a.JPG
deleted file mode 100644
index c86fd17..0000000
Binary files a/html/UG/Images/groups_fig3a.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig3b.JPG b/html/UG/Images/groups_fig3b.JPG
deleted file mode 100644
index 6de3a5a..0000000
Binary files a/html/UG/Images/groups_fig3b.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig4.JPG b/html/UG/Images/groups_fig4.JPG
deleted file mode 100644
index 9b6341b..0000000
Binary files a/html/UG/Images/groups_fig4.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig4.PSD b/html/UG/Images/groups_fig4.PSD
deleted file mode 100644
index 6d4619a..0000000
Binary files a/html/UG/Images/groups_fig4.PSD and /dev/null differ
diff --git a/html/UG/Images/groups_fig5.JPG b/html/UG/Images/groups_fig5.JPG
deleted file mode 100644
index aec9e2e..0000000
Binary files a/html/UG/Images/groups_fig5.JPG and /dev/null differ
diff --git a/html/UG/Images/groups_fig5.PSD b/html/UG/Images/groups_fig5.PSD
deleted file mode 100644
index 1b360bb..0000000
Binary files a/html/UG/Images/groups_fig5.PSD and /dev/null differ
diff --git a/html/UG/Images/logo_bluegreen_txt.jpg b/html/UG/Images/logo_bluegreen_txt.jpg
deleted file mode 100644
index 862ace7..0000000
Binary files a/html/UG/Images/logo_bluegreen_txt.jpg and /dev/null differ
diff --git a/html/UG/OldHtmlSource/03_DataModel.html b/html/UG/OldHtmlSource/03_DataModel.html
deleted file mode 100755
index 1d2fc81..0000000
--- a/html/UG/OldHtmlSource/03_DataModel.html
+++ /dev/null
@@ -1,1217 +0,0 @@
-<!doctype HTML public "-//W3C//DTD HTML 4.0 Frameset//EN">
-<html>
-<head>
-<title>Chapter 1: The HDF5 Data Model and File Structure</title>
-
-<!--(Meta)==========================================================-->
-
-<!--(Links)=========================================================-->
-
-<!--( Begin styles definition )=====================================-->
-<link href="ed_styles/NewUGelect.css" rel="stylesheet" type="text/css">
-<!--( End styles definition )=======================================-->
-
-</head> 
-
-<body>
-
-<!-- #BeginLibraryItem "/ed_libs/styles_UG.lbi" -->
-<!--
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-  * Copyright by The HDF Group.                                               *
-  * Copyright by the Board of Trustees of the University of Illinois.         *
-  * All rights reserved.                                                      *
-  *                                                                           *
-  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
-  * terms governing use, modification, and redistribution, is contained in    *
-  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
-  * of the source code distribution tree; Copyright.html can be found at the  *
-  * root level of an installed copy of the electronic HDF5 document set and   *
-  * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-  * access to either file, you may request a copy from help at hdfgroup.org.     *
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- -->
-<!-- #EndLibraryItem --><!--( TOC )=========================================================-->
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ('\
-<table x-use-null-cells\
-                align="right"\
-		width=240\
-		cellspacing="0"\
-		class="tocTable">\
-  <tr valign="top"> \
-    <td class="tocTableHeaderCell" colspan="2"> \
-        <span class="TableHead">Chapter Contents</span></td>\
-  </tr>\
--->
-<!-- Table Version 3 -->\
-<!--
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Intro">1.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Intro">Introduction</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#AbstractDMod">2.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#AbstractDMod">The Abstract Data Model</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#SModel">3.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#SModel">The HDF5 Storage Model</a></td> \
-  </tr>\
-\
-  <tr valign="top"> \
-    <td class="tocTableContentCell"> \
--->
-<!-- editingComment -- "tocTableContentCell" and "tocTableContentCell4" \
--->\
-<!-- are the table-closing cell class.\
-    <td class="tocTableContentCell2"> \
--->\
-<!--
-      <a href="#Structure">4.</a></td>\
-    <td class="tocTableContentCell4">\
-	  <a href="#Structure">The Structure of an HDF5 File</a>\
--->
-<!-- editingComment -- This section not currently complete or validated.\
-  </tr><tr valign="top"> \
-    <td class="tocTableContentCell"> \
-    <a href="#Appendix">10</a></td>\
-    <td class="tocTableContentCell4"><a href="#Appendix">Appendix</a></td>\
--->\
-<!--
-  </td></tr>\
-</table>\
-')
--->
-</SCRIPT>
-<!--(End TOC)=======================================================-->
-
-<div align="center">
-<a name="TOP">
-<h2>Chapter 1<br /><font size="6">The HDF5 Data Model and File Structure</font></h2>
-</a>
-</div>
-
-
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  ] ] ]</span>
--->
-
-<!-- HEADER LEFT " " -->
-<!-- HEADER RIGHT " " -->
-
-<!-- HEADER LEFT "HDF5 User's Guide" -->
-<!-- HEADER RIGHT "HDF5 Data Model" -->
-
-
-<a name="Intro">
-<h3>1.1. Introduction</h3>
-</a>
-  
-  <p>The Hierarchical Data Format (HDF) implements a model for managing 
-  and storing data. The model includes an abstract data model and an 
-  abstract storage model (the data format), and libraries to implement the 
-  abstract model and to map the storage model to different storage 
-  mechanisms. The HDF5 library provides a programming interface to a 
-  concrete implementation of the abstract models. The library also 
-  implements a model of data transfer, i.e., efficient movement of data 
-  from one stored representation to another stored representation. The 
-  figure below illustrates the relationships between the models and 
-  implementations. This chapter explains these models in detail.</p>
-  
-
-<table width = 600 cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dmodel_fig1.JPG"> 
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 1. HDF5 models and implementations</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>The <em>Abstract Data Model</em> is a conceptual model of data, data types, 
-  and data organization. The abstract data model is independent of storage 
-  medium or programming environment. The <em>Storage Model</em> is a 
-  standard representation for the objects of the abstract data model. 
-  The <a href="../H5.format.html" target="H5DocWin"><cite>HDF5 File Format 
-  Specification</cite></a> defines the storage model.</p>
-   
-  <p>The <em>Programming Model</em> is a model of the computing environment
-  and includes platforms from small single systems to large multiprocessors 
-  and clusters. The programming model manipulates (instantiates, populates, 
-  and retrieves) objects from the abstract data model.</p>
-  
-  <p>The <em>Library</em> is the concrete implementation of the programming 
-  model. The Library exports the HDF5 APIs as its interface. 
-  In addition to implementing the objects of the abstract data model, 
-  the Library manages data transfers from one stored form to another. 
-  Data transfer examples include reading from disk to memory and writing 
-  from memory to disk. </p>
-  
-  <p><em>Stored Data</em> is the concrete implementation of the storage 
-  model. The storage model is mapped to several storage 
-  mechanisms including single disk files, multiple files (family of files), 
-  and memory representations.</p>
-  
-  <p>The HDF5 Library is a C module that implements the programming model 
-  and abstract data model. The HDF5 Library calls the operating system 
-  or other storage management software (e.g., the MPI/IO Library) to store and 
-  retrieve persistent data. The HDF5 Library may also link to other software 
-  such as filters for compression. The HDF5 Library is linked to an application 
-  program which may be written in C, C++, Fortran, or Java. The application 
-  program implements problem specific algorithms and data structures and calls 
-  the HDF5 Library to store and retrieve data. The figure below shows the 
-  dependencies of these modules.</p>
-  
-
-
-<table width = 600 cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dmodel_fig2.JPG">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 2. The library, the application 
-        program, and other modules</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-<br />
-  <p>It is important to realize that each of the software components manages 
-  data using models and data structures that are appropriate to the 
-  component. When data is passed between layers (during storage or 
-  retrieval), it is transformed from one representation to another. The 
-  figure below <!-- Figure 3 --> suggests some of the kinds of data 
-  structures used in the different layers.</p>
-  
-  <p>The <em>Application Program</em> uses data structures that represent 
-  the problem and algorithms including variables, tables, arrays, and 
-  meshes among other data structures. Depending on its design and function, 
-  an application may have quite a few different kinds of data structures 
-  and different numbers and sizes of objects.</p>
-  
-  <p>The HDF5 Library implements the objects of the HDF5 abstract 
-  data model. Some of these objects include groups, datasets, and 
-  attributes. The application program maps the application data 
-  structures to a hierarchy of HDF5 objects. Each application will create a 
-  mapping best suited to its purposes.  </p>
-<!-- editingComment
-  <span class="editingComment">For suggestions and examples, see ???. 
-  [ [ [ Do we have such a document? ] ] ]</em></span>
--->
-  <p>The objects of the HDF5 abstract data model are mapped to the objects 
-  of the HDF5 storage model, and stored in a storage medium. 
-<!-- editingComment
-  (Section ?? below) 
--->
-  The stored objects include header blocks, free lists, data blocks, 
-  B-trees, and other objects. Each group or dataset is stored as one or 
-  more header and data blocks. See the 
-  <a href="../H5.format.html" target="H5DocWin"><cite>HDF5 File Format 
-  Specification</cite></a> for more information on how these objects are 
-  organized.
-  The HDF5 Library can also use other 
-  libraries and modules such as compression.</p>
-  
-<!-- NEW PAGE -->
-<table width = 600 cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dmodel_fig3_a.JPG"><br />
-        <img src="Images/Dmodel_fig3_b.JPG"><br />
-        <img src="Images/Dmodel_fig3_c.JPG">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 3. Data structures in different layers</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>The important point to note is that there is not necessarily any simple 
-  correspondence between the  objects of the application program, 
-  the abstract data model, and those of the <em>Format Specification</em>. 
-  The organization of the data of application program, and how it is mapped 
-  to the HDF5 abstract data model is up to the application developer. 
-  The application program only needs to deal with the library and the 
-  abstract data model. Most applications need not consider any details of 
-  the <a href="../H5.format.html" target="H5DocWin"><cite>HDF5 File Format 
-  Specification</cite></a> 
-  or the details of how objects of abstract data model 
-  are translated to and from storage.</p>
-  
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<div align="right">
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<a name="AbstractDMod">
-
-<h3 class="pagebefore">1.2. The Abstract Data Model</h3>
-</a>
-
-<!-- editingComment
-  <span class="editingComment">[ [ [ Note:  In this section some of the figures 
-  are included twice.  These are alternative versions of the same diagram, 
-  included for comparison and selection. ] ] ]</span>
--->
- 
-  <p>The abstract data model (ADM) defines concepts for defining and 
-  describing complex data stored in files. The ADM is a very general model 
-  which is designed to conceptually cover many specific models. Many different 
-  kinds of data can be mapped to objects of the ADM, and therefore stored and 
-  retrieved using HDF5. The ADM is not, however, a model of any particular problem or 
-  application domain. Users need to map their data to the concepts of the ADM.</p>
-  
-  <p>The key concepts include:</p>
-  
-  <ul>
-      <li><em>File</em> - a contiguous string of bytes in a computer 
-          store (memory, disk, etc.), and 
-	  the bytes represent zero or more objects of the model</li>
-      <li><em>Group</em> - a collection of objects (including groups)</li>
-      <li><em>Dataset</em> - a multidimensional array of data elements 
-          with attributes and other metadata </li>
-      <li><em>Dataspace</em> - a description of the dimensions of a 
-          multidimensional array</li>
-      <li><em>Datatype</em> - a description of a specific class of data 
-          element including its storage layout as a pattern of bits</li>
-      <li><em>Attribute</em> - a named data value associated with a group, 
-          dataset, or named datatype</li>
-      <li><em>Property List</em> - a collection of parameters (some permanent 
-          and some transient) controlling options in the library </li>
-       <li><em>Link</em> - the way objects are connected </li>
-  </ul>
-
-
-<p>These key concepts are described in more detail below.</p>
-
-<h4>1.2.1. File</h4>
-
-  <p>Abstractly, an HDF5 file is a container for an organized 
-  collection of objects. 
-  The objects are groups, datasets, and other objects as defined below. 
-  The objects are organized as a rooted, directed graph. Every HDF5 file has at 
-  least one object, the root group. See the figure below. All objects are 
-  members of the 
-  root group or descendents of the root group.</p>
-  
-<!-- NEW PAGE -->
-<table width = 600 cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        </tr>
-    <tr>
-        <td><br />
-        <table align="center" border="1">
-            <tr>
-                <td valign="top" align="center"><code>File</code></td>
-                </tr>
-            <tr>
-                <td valign="top" align="left">
-                <code>
-                superblock_vers:int<br />
-                global_freelist_vers:int<br />
-                symtable_vers:int<br />
-                sharedobjectheader_vers:int<br />
-                userblock:size_t<br />
-                sizeof_addr:size_t<br />
-                sizeof_size:size_t<br />
-                symtable_tree_rank:int<br />
-                symtable_node_size:int<br />
-                btree_istore_size:int
-                </code>
-                </td>
-                </tr>
-            <tr>
-                <td align="left"> </td>
-                </tr>
-        </table>
-        </td>
-        </tr>
-    <tr>
-        <td valign="top" align="center"><img src="Images/Dmodel_fig4_a.JPG"></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 4. The HDF5 file</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>HDF5 objects have a unique identity <em>within a single HDF5 file</em> and 
-  can be accessed only by its names within the hierarchy of the file. HDF5 
-  objects in different files do not necessarily have unique identities, and 
-  it is not possible to access a permanent HDF5 object except through a file. 
-  See the section <a href="#Structure">“The Structure of an HDF5 
-  File”</a> below for an explanation of the structure of the HDF5 file.
-  
-  <p>When the file is created, the <em>file creation properties</em> specify 
-  settings for the file. The file creation properties include version information 
-  and parameters of global data structures. When the file is opened, 
-  the <em>file access properties</em> specify settings for the current access to 
-  the file. File access properties include parameters for storage drivers 
-<!-- editingComment
-  <span class="editingComment">(see section ??  below)</span>
--->
-  and parameters for caching and garbage collection. 
-  The file creation properties are set permanently for the life 
-  of the file, and 
-  the file access properties can be changed by closing and reopening 
-  the file. 
-<!-- editingComment
-  <span class="editingComment">
-  See PPP for more information about Property Lists and properties. 
-  </span>
--->
-  
-  <p>An HDF5 file can be “mounted” as part of another HDF5 file. 
-  This is analogous to Unix file system mounts. The root of the mounted file 
-  is attached to a group in the mounting file, and all the contents can be 
-  accessed as if the mounted file were part of the mounting file.   
-<!-- editingComment
-  <span class="editingComment">
-  See XXX for an explanation of mounted files.
-  </span>
--->
-
-<h4>1.2.2. Group</h4>
-  
-  <p>An HDF5 group is analogous to a file system directory. Abstractly, 
-  a group contains zero or more objects, and every object must be a member of at 
-  least one group. The root group is a special case; it may not be a member 
-  of any group.</p>
-  
-  <p>Group membership is actually implemented via link objects. See the 
-  figure below. A link object is owned by a group and points to a 
-  <em>named object</em>. Each link has a <em>name</em>, and each link 
-  points to exactly one object. Each named object has at least one and 
-  possibly many links to it.</p>
-    
-
-<table width = 600 cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dmodel_fig5.JPG">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 5. Group membership via link objects</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<!-- NEW PAGE -->
-  <p>There are three classes of named objects: group, dataset, and named 
-  datatype. See the figure below.  Each of these objects is the member of 
-  at least one group, and this means there is at least one link to it.</p>
-
-
-<table width = 600 cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dmodel_fig6.JPG">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 6. Classes of named objects</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<h4>1.2.3. Dataset</h4>
-
-  <p>An HDF5 dataset is a multidimensional (rectangular) array 
-  of data elements. See the figure below. The shape of the array 
-  (number of dimensions, size of 
-  each dimension) is described by the dataspace object (described 
-  in the next section below).</p>
-  
-  <p>A data element is a single unit of data which may be a number, a character, 
-  an array of numbers or characters, or a record of heterogeneous data elements.  
-  A data element is a set of bits. The layout of the bits is described by the 
-  datatype (see below).</p>
-  
-  <p>The dataspace and datatype are set when the 
-  dataset is created, and they cannot be changed for the life 
-  of the dataset. The <em>dataset creation properties</em> are set when the 
-  dataset is created. The dataset creation properties include the fill 
-  value and storage properties such as chunking and compression.  These 
-  properties cannot be changed after the dataset is created.</p>
-  
-  <p>The dataset object manages the storage and access to the data. While 
-  the data 
-  is conceptually a contiguous rectangular array, it is physically stored 
-  and 
-  transferred in different ways depending on the storage properties and 
-  the storage 
-  mechanism used. The actual storage may be a set of compressed chunks, 
-  and the access may be through different storage mechanisms and caches. 
-  The dataset 
-  maps between the conceptual array of elements and the actual stored data.</p>
-  
-<!-- NEW PAGE -->
-<table width = 600 cellspacing="0" align="center">
-  <tr valign="top"> 
-    <td align="center">
-    <hr color="green" size="3"/>
-    <img src="Images/Dmodel_fig7_b.JPG">
-    </td>
-  </tr>
-<tr><td><hr color="green" size="1" /></td></tr>
-<tr valign="top">
-    <td align="left" >
-        <b>Figure 7. The dataset</b>
-        <hr color="green" size="3"/></td>
-  </tr>
-</table>
-<br />
-
-
-<h4>1.2.4. Dataspace</h4>
-  
-  <p>The HDF5 dataspace describes the layout of the elements of a 
-  multidimensional 
-  array. Conceptually, the array is a hyper-rectangle with one to 32 dimensions. 
-  HDF5 dataspaces can be extendable. Therefore, each dimension has a current 
-  size and a 
-  maximum size, and the maximum may be unlimited. The dataspace describes 
-  this hyper-rectangle: it is a list of dimensions with the current and maximum 
-  (or unlimited) sizes. See the figure below.</p>
-  
-<!-- NEW PAGE -->
-<table width = 600 cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <table border="1">
-            <tr><td align="center">
-                <code>Dataspace</code>
-                </td></tr>
-            <tr><td align="left">
-                <code>
-                  rank:int<br />
-                  current_size:hsize_t[ rank ]  <br />
-                  maximum_size:hsize_t[ rank ]
-                </code>
-                </td></tr>
-            <tr><td align="left"> </td></tr>
-            </table>
-         
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 8. The dataspace</b><hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>Dataspace objects are also used to describe hyperslab selections 
-  from a dataset. Any subset of the elements of a dastaset can be selected 
-  for read or write by specifying a set of hyperslabs. A non-rectangular 
-  region can be selected by the union of several (rectangular) dataspaces.</p>
-<!-- editingComment
-  <span class="editingComment">
-  See SSS for more 
-  information about data selection and hyperslabs.
-  </span>
--->
-
-<h4>1.2.5. Datatype</h4>
-  
-  <p>The HDF5 datatype object describes the layout of a single data element. 
-  A data element is a single element of the array; it may be a single number, 
-  a character, an array of numbers or carriers, or other data. The datatype 
-  object describes the storage layout of this data. </p>
-
-  <p>Data types are categorized into 11 classes of datatype. Each class is 
-  interpreted according to a set of rules and has a specific set of properties 
-  to describe its storage. For instance, floating point numbers have exponent 
-  position and sizes which are interpreted according to appropriate standards 
-  for number representation. Thus, the datatype class tells what the element 
-  means, and the datatype describes how it is stored.</p>
-  
-
-  <p>The figure below <!-- formerly Figure 9 --> shows the classification 
-  of datatypes. Atomic datatypes are 
-  indivisible. each may be a single object; a number, a string, or some other 
-  objects. Composite datatypes are composed of multiple elements of atomic 
-  datatypes. In addition to the standard types, users can define additional 
-  datatypes such as a 24-bit integer or a 16-bit float.</p>
-  
-  <p>A dataset or attribute has a single datatype object associated with 
-  it. See Figure 7 above. The datatype object may be used in the definition 
-  of several objects, but by default, a copy of the datatype object will 
-  be private to the dataset. </p>
-
-  <p>Optionally, a datatype object can be stored in the HDF5 file. The 
-  datatype is linked into a group, and therefore given a name. A 
-  <em>named datatype</em> can be opened and used in any way that a datatype 
-  object can be used.</p>
-  
-  <p>The details of datatypes, their properties, and how they are used are 
-  explained in the 
-  “<a href="11_Datatypes.html">HDF5 Datatypes</a>” chapter.</p>
-<!-- NEW PAGE -->
-<table width = 600 cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dmodel_fig9.JPG">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 9. Datatype classifications</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-<h4>1.2.6. Attribute</h4>
-  
-  <p>Any HDF5 named data object (group, dataset, or named datatype) may 
-  have zero or more user defined attributes. Attributes are used to document 
-  the object. The attributes of an object are stored with the object.</p>
-  
-  <p>An HDF5 attribute has a name and data. The data portion is similar 
-  in structure to a dataset: a dataspace defines the layout of an array of 
-  data elements, and a datatype defines the storage layout and interpretation 
-  of the elements See the figure below <!-- formerly Figure 10-->.</p>
-  
-
-<table width = 600 cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dmodel_fig10.JPG">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 10. Attribute data elements</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-  <p>In fact, an attribute is very similar to a dataset with 
-  the following limitations:</p>
-  
-  <ul>
-      <li>An attribute can only be accessed via the object</li>
-      <li>Attribute names are significant only within the object</li>
-      <li>An attribute should be a small object
-      <li>The data of an attribute must be read or written in a single access 
-          (partial reading or writing is not allowed)</li>
-      <li>Attributes do not have attributes</li>
-  </ul>
-
-  <p>Note that the value of an attribute can be an <em>object reference</em>.  
-  A shared attribute or an attribute that is a large array can be implemented 
-  as a reference to a dataset.</p>
-  
-<!-- NEW PAGE -->
-  <p>The name, dataspace, and datatype of an attribute are specified when it 
-  is created and cannot be changed over the life of the attribute.  An 
-  attribute can be opened by name, by index, or by iterating through all 
-  the attributes of the object.</p>
-
-<h4>1.2.7. Property List</h4>
-  
-  <p>HDF5 has a generic property list object. Each list is a collection of 
-  <em>name-value</em> pairs.  Each class of property list has a specific set 
-  of properties.  
-  Each property has an implicit name, a datatype, and a value. See the figure 
-  below. <!-- formerly Figure 11 -->
-  A property list object is created and used in ways similar to the other 
-  objects of the HDF5 library.</p>
-  
-  <p>Property Lists are attached to the object in the library, they can be 
-  used by any part of the library. Some properties are permanent (e.g., the 
-  chunking strategy for a dataset), others are transient (e.g., buffer sizes 
-  for data transfer). A common use of a Property List is to pass parameters 
-  from the calling program to a VFL driver or a module of the pipeline.</p>
-  
-  <p>Property lists are conceptually similar to attributes. Property lists are 
-  information relevant to the behavior of the library while attributes are 
-  relevant to the user’s data and application.</p>
-  
-
-<table width = 600 cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        
-    <table width="95%" cellspacing="0" align="center">
-        <tr>
-            <td align="center"><br />
-                <table border="1">
-                    <tr><td align="center">
-                        <code>Property List</code>
-                        </td></tr>
-                    <tr><td align="left" valign="middle">
-                        <code>
-                         class:H5P_class_t 
-                        </code>
-                        </td></tr>
-                    <tr><td align="left" valign="middle">
-                        <code>
-                         create(class)<br />
-                         get_class()
-                        </code>      
-                        </td></tr>
-                </table>	
-            </td>
-            </tr>
-        <tr>
-            <td valign="top" align="center">
-            <img src="Images/Dmodel_fig11_a.jpg"></td>
-            </tr>
-        <tr>
-            <td align="center">
-                <table border="1">
-                    <tr><td align="center">
-                        <code>Property</code>
-                        </td></tr>
-                    <tr><td align="left" valign="middle">
-                        <code>
-                         name:string<br />
-                         value:H5TDatatype 
-                        </code>
-                        </td></tr>
-                    <tr><td align="left" valign="middle">
-                        <code>
-                         <br /> 
-                        </code>      
-                        </td></tr>
-                    </table> 
-            </td>
-            </tr>
-        </table>
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 11. The property list</b>
-        <hr color="green" size="3"/></span>
-        </td>
-        </tr>
-</table>
-<br />
-
-<!-- NEW PAGE -->
-  <p>Property lists are used to control optional behavior for file creation, 
-  file access, dataset creation, dataset transfer (read, write), and file 
-  mounting. Some property list classes are shown in the table below.
-  <!-- Table 1--> Details of the different property lists are explained in 
-  the relevant sections of this document.</p>
-  
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Table 1. Property list classes and their usage
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="34%"> 
-        <b>Property List Class</b></td>
-        <td width="33%"> 
-        <b>Used</b></td>
-        <td width="33%"> 
-        <b>Examples</b></td>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5P_FILE_CREATE</code></td>
-        <td>Properties for file creation.</td>
-        <td>Set size of user block.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5P_FILE_ACCESS</code></td>
-        <td> 
-        Properties for file access.</td>
-        <td> 
-        Set parameters for VFL driver. An example is MPI I/O.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5P_DATASET_CREATE</code></td>
-        <td>Properties for dataset creation.</td>
-        <td>Set chunking, compression, or fill 
-        value.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5P_DATASET_XFER</code></td>
-        <td>Properties for raw data transfer 
-        (read and write).</td>
-        <td>Tune buffer sizes or memory management.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5P_FILE_MOUNT</code></td>
-        <td>Properties for file mounting.</td>
-        <td> </td>
-        </tr>
-        <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="SModel">
-<div align="right">
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-<br />
-<h4>1.2.8. Link</h4>
-<p>This section is under construction.</p>
-
-<br />
-
-<!-- NEW PAGE -->
-<a name="SModel">
-<h3 class="pagebefore">1.3. The HDF5 Storage Model</h3>
-</a>
-
-<h4>1.3.1. The Abstract Storage Model: the HDF5 Format Specification</h4> 
-  
-  <p>The <a name="SupScript1" href="../H5.format.html">
-  <em>HDF5 File Format Specification</em></a> 
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  [cite it] 
-  ] ] ]</span>
--->
-  defines how HDF5 objects 
-  and data are mapped to a <em>linear address space</em>. The address space is 
-  assumed to be a contiguous array of bytes stored on some random access 
-  medium.<a href="#FootNote"><sup><font size="-1">1</font></sup></a> 
-  The format defines the standard for how the objects of the 
-  abstract data model are mapped to linear addresses. The stored 
-  representation is self-describing in the sense that the format defines all 
-  the information necessary to read and reconstruct the original 
-  objects of the abstract data model.</p>
-  
-  <p>The <em>HDF5 File Format Specification</em> is organized in three parts:
-
-  <ol>
-      <li><strong>Level 0</strong>: File signature and super block</li>
-      <li><strong>Level 1</strong>: File infrastructure</li>
-        <ol type="a">
-          <li><strong>Level 1A</strong>: B-link trees and B-tree nodes</li>
-          <li><strong>Level 1B</strong>: Group</li>
-          <li><strong>Level 1C</strong>: Group entry</li>
-          <li><strong>Level 1D</strong>: Local heaps</li>
-          <li><strong>Level 1E</strong>: Global heap</li>
-          <li><strong>Level 1F</strong>:  Free-space index</li>
-        </ol>
-      <li><strong>Level 2</strong>: Data object</li>
-        <ol type="a">
-          <li><strong>Level 2A</strong>: Data object headers</li>
-          <li><strong>Level 2B</strong>: Shared data object headers</li>
-          <li><strong>Level 2C</strong>: Data object data storage</li>
-        </ol>
-  </ol>
-
-  <p>The <strong>Level 0</strong> specification defines the header block for 
-  the file. Header block elements include a signature, version information, 
-  key parameters of the file 
-  layout (such as which VFL file drivers are needed), and pointers to the rest of 
-  the file. <strong>Level 1</strong> defines the data structures used throughout 
-  the file: the B-trees, heaps, and groups. <strong>Level 2</strong> defines the 
-  data structure for storing the data objects and data. In all cases, the data 
-  structures are completely specified so that every bit in the file can be 
-  faithfully interpreted.</p>
-
-  <p>It is important to realize that the structures defined in the HDF5 file 
-  format are not the same as the abstract data model: the object headers, heaps, 
-  and B-trees of the file specification are not represented in the abstract 
-  data model. The format defines a number of objects for managing the storage 
-  including header blocks, B-trees, and heaps. The <em>HDF5 File Format 
-  Specification</em> 
-  defines how the abstract objects (for example, groups and datasets) are 
-  represented as headers, B-tree blocks, and other elements.</p>
-
-  <p>The HDF5 Library implements operations to write HDF5 objects to the linear 
-  format and to read from the linear format to create HDF5 objects. It is 
-  important to realize that a single HDF5 abstract object is usually stored 
-  as several objects. A dataset, for example, might be stored in a header 
-  and in one or more data blocks, and these objects
-  might not be contiguous on the hard disk.</p>
-
-<!-- NEW PAGE -->
-<h4>1.3.2. Concrete Storage Model</h4>
-  
-  <p>The HDF5 file format defines an abstract linear address space. This 
-  can be implemented in different storage media such as a single file or 
-  multiple files on disk or in memory. 
-  The HDF5 Library defines an open interface called the <em>Virtual File 
-  Layer</em> (VFL). The VFL allows different concrete storage models to be 
-  selected. </p>
-<!-- editingComment
-  <span class="editingComment">
-  See Ch. XXX and the VFL document [cite].
-  </span>
--->
-  
-  <p>The VFL defines an abstract model, an API for random access storage, 
-  and an API to plug in alternative VFL driver modules. The model defines 
-  the operations that the VFL driver must and may support, and the plug-in 
-  API enables the HDF5 Library to recognize the driver and pass it control 
-  and data.</p>
-  
-  <p>A number of VFL drivers have been defined in the HDF5 Library. Some 
-  work with a single file, and some work with multiple files split in 
-  various ways. Some work in serial computing environments, and some 
-  work in parallel computing environments. Most work with disk copies of 
-  HDF5 files, but one works with a memory copy. These drivers are listed 
-  in the table in the <a href="08_TheFile.html#Drivers">“Alternate 
-  File Storage Layouts and Low-level File Drivers”</a> 
-  section in “The File” chapter. </p>
-  
-<!-- 
-<table width = 600 cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dmodel_fig12.JPG">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 12. Conceptual hierarchy of VFL drivers</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-9.28.2011. I removed the figure above. Drivers have changed a lot since
-the figure was created. MEE -->
-
-  <p>Each driver isolates the details of reading and writing storage so 
-  that the rest of the HDF5 Library and user program can be almost the same 
-  for different storage methods. The exception to this rule is that some VFL 
-  drivers need information from the calling application. This information is 
-  passed using property lists. For example, the Parallel driver requires 
-  certain control information that must be provided by the application.</p>
-  
-
-<br />
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<div align="right">
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-<br />
-<a name="Structure">
-<!-- NEW PAGE -->
-<h3 class="pagebefore">1.4. The Structure of an HDF5 File</h3>
-</a>
-
-<h4>1.4.1. Overall File Structure</h4>
-  
-  <p>An HDF5 file is organized as a rooted, directed graph. Named data 
-  objects are the nodes of the graph, and links are the directed arcs. Each 
-  arc of the graph has a name, and the root group has the name “/”. 
-  Objects are created and then inserted into the graph with the link operation 
-  which creates a named link from a group to the object. For example, the 
-  figure below <!-- formerly Figure 38 -->illustrates the structure of an HDF5 
-  file when one dataset is created. An object can be the 
-  target of more than one link. <a name="SupScript2">The names on the links 
-  must be unique within each group, but there may be many links with the 
-  same name in different groups. Link names are unambiguous: some ancestor 
-  will have a different name, or they are the same object. The graph is 
-  navigated with path names similar to Unix file systems.
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  [cite something]
-  ] ] ]</span>
--->
-  An object can be opened with a full path starting at the root group or 
-  with a relative path and a starting node (group). Note that all paths are 
-  relative to a single HDF5 file. In this sense, an HDF5 file is analogous 
-  to a single Unix file system.</a>
-  <a href="#FootNote"><sup><font size="-1">2</font></sup></a></p>
-  
-
-  
-
-<table width = 300 cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dmodel_fig38_a.JPG"><br />
-        a) Newly created file: one group, <code>/</code><br />
-        <img src="Images/Dmodel_fig38_b.JPG"><br />
-        b) Create a dataset called <code>/dset1</code><br />
-        (<code>HDcreate(..., “/dset2”, ...</code>)<br /><br />
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 12. An HDF5 file with one dataset
-        <!-- formerly Figure 38 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-  <p>It is important to note that, just like the Unix file system, HDF5 
-  objects do not have <em>names</em>. The names are associated with 
-  <em>paths</em>. An object has a unique (within the file) <em>object 
-  ID</em>, but a single object may have many names because there 
-  may be many paths to the same object. An object can be renamed (moved to 
-  another group) by adding and deleting links. In this case, the object 
-  itself never moves. For that matter, membership in a group has no 
-  implication for the physical location of the stored object.</p>
-  
-<!-- NEW PAGE -->
-  <p><a name="SupScript3">Deleting a link to an object does not necessarily 
-  delete the object. The object remains available as long as there is at 
-  least one link to it.  After all the links to an object are deleted, it 
-  can no longer be opened although the storage may or may not be 
-  reclaimed.</a><a href="#FootNote"><sup><font size="-1">3</font></sup></a></p>
-  
-  <p>It is important to realize that the linking mechanism can be used to 
-  construct very complex graphs of objects. For example, it is possible for 
-  an object to be shared between several groups and even to have more than 
-  one name in the same group. It is also possible for a group to be a 
-  member of itself or to be in a “cycle” in the graph. An example of a cycle
-  is where a child is the parent of one of its own ancestors. </p>
-  
-  <!-- move the following paragraph to the Links chapter when it is written:
-  <p>HDF5 also has <em>soft links</em> similar to Unix soft links. 
-  A soft link is an object that contains a name and a path name for the 
-  target object. The soft link can be followed to open the target of the link 
-  just like a regular (hard) link. Unlike hard links, the target of a soft 
-  link has no count of the soft link to it.  The reference count of an object 
-  is the number of hard Links (which must be >= 1). A second difference is 
-  that the hard link cannot be created if the target object does not exist, 
-  and always points to the same object. A Soft Link can be created with any 
-  path name, whether or not the object exists. Therefore, it may or may not 
-  be possible to follow a Soft Link, or the target object 
-  may change from one access to another access of the same Soft Link. </p>-->
-
-<h4>1.4.2. HDF5 Path Names and Navigation</h4>
-  
-  <p>The structure of the file constitutes the name space for the objects 
-  in the file. A path name is a string of components separated by 
-  ‘/’. Each component is the name of a link or the special 
-  character “.” for the current group. Link names (components) 
-  can be any string of ASCII characters not containing ‘/’ 
-  (except the string “.” which is reserved). However, users 
-  are advised to avoid the use of punctuation and non-printing characters 
-  because they may create problems for other software. The figure below 
-  <!-- formerly Figure 39 -->gives a BNF grammar for HDF5 path names.</p>
-  
-
-<table width = 600 cellspacing="0" align="center">
-  <tr valign="top"> 
-    <td align="left">
-    <hr color="green" size="3"/>
-    <pre>
-    
-  PathName ::= AbsolutePathName | RelativePathName
-  Separator ::= "/" ["/"]*
-  AbsolutePathName ::= Separator [ RelativePathName ]
-  RelativePathName ::= Component [ Separator RelativePathName ]*
-  Component ::=  "." |  Name
-  Name ::= Character+  -  {"."}
-  Character ::= {<em>c</em>:  <em>c</em> in {{ <em>legal ASCII characters</em> }  -  {'/'}}
-    </pre></td>
-  </tr>
-<tr><td><hr color="green" size="1" /></td></tr>
-<tr valign="top">
-    <td align="left" >
-        <b>Figure 13. A BNF grammar for path names
-        <!-- formerly Figure 39--></b>
-        <hr color="green" size="3"/></td>
-  </tr>
-</table>
-<br />
-
-  <p>An object can always be addressed by a <em>full or absolute path</em>
-  which would start at the root group.  As already noted, a given object 
-  can have more than one full path name. An object can also be addressed 
-  by a relative path which would start at a group and include the path 
-  to the object.</p>
-  
-  <p>The structure of an HDF5 file is “self-describing.” This 
-  means that it is possible to navigate the file to discover all the 
-  objects in the file. Basically, the structure is traversed as a graph 
-  starting at one node and recursively visiting the nodes of the graph.</p>
-  
-  <!-- move the following paragraph to the Links chapter when it is written:
-  <p>The members of a group can be discovered with the H5Giterate function, 
-  and a description of the object can be retrieved with the H5Gget_obj_info 
-  function. In this way, all the members of a given group can be determined, 
-  and each can be opened to retrieve a description, or the data and 
-  attributes of the object.</p> --> 
-<!-- editingComment
-  <span class="editingComment">
-  See ??? for more information about navigating and discovering the contents 
-  of and HDF5 file.
-  </span>
--->
-
-
-<h4>1.4.3. Examples of HDF5 File Structures</h4>
-  
-  <p>The figure below <!-- formerly Figure 40 -->shows some possible HDF5 
-  file structures with groups and datasets. Part a of the figure shows the 
-  structure of a file with three groups. 
-  Part b of the figure shows a dataset created in “/group1”. Part 
-  c shows the structure after a dataset called dset2 has been added to the 
-  root group. Part d the structure after another group and dataset have been 
-  added.</p>
-  
-<!-- NEW PAGE -->
-
-<table width = 600 cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        
-        <table width="100%">
-            <tr valign="top" align="left">
-                <td width="48%">a) Three groups; two are members of the root 
-                group,<br />
-                <code>/group1</code> and <code>/group2</code></td>
-                <td width="4%">  </td>
-                <td width="48%">b) Create a dataset in <code>/group1</code>: 
-                <br /> 
-                <code>/group1/dset1</code></td>
-                </tr>
-            <tr valign="middle" align="center">
-                <td width="48%"><img src="Images/Dmodel_fig40_a.JPG" 
-                width="230"></td>
-                <td width="4%">  </td>
-                <td width="48%"><img src="Images/Dmodel_fig40_b.JPG" 
-                width="230"></td>
-                </tr>
-            <tr valign="top" align="left">
-                <td width="48%">c) Another dataset, a member of the root 
-                group: <br /> 
-                <code>/dset2</code></td>
-                <td width="4%">  </td>
-                <td width="48%">d) And another group and dataset, reusing 
-                object names: <br /> 
-                <code>/group2/group2/dset2</code></td>
-                </tr>
-            <tr valign="middle" align="center">
-                <td width="48%"><img src="Images/Dmodel_fig40_c.JPG" 
-                width="230"></td>
-                <td width="4%">  </td>
-                <td width="48%"><img src="Images/Dmodel_fig40_d.JPG" 
-                width="282"></td>
-                </tr>
-            </table>
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 14. 
-        <!-- formerly Figure 40: -->
-        Examples of HDF5 file structures with groups and datasets</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-<br /><br /><br />
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-
-<p> </p>
-<a name="FootNote"><hr width="200px" align="left"></a>
-
-  <font size="-1"><sup><a href="#SupScript1">1</a></sup>HDF5 requires random 
-  access to the linear address space. For this reason it is not well suited for 
-  some data media such as streams.</font>
-  
-  <br />
-<!--  <font size="-1"><sup><a href="#SupScript2">2</a></sup>However, a compound 
-  datatype with zero members can have no data, so it is useless.</font>
-<br />  -->  
-
-  <font size="-1"><sup><a href="#SupScript2">2</a></sup>It could be said that 
-  HDF5 extends the organizing concepts of a file system to the internal 
-  structure of a single file.</font>
-  
-  <br />
-  <font size="-1"><sup><a href="#SupScript3">3</a></sup>As of HDF5-1.4, the 
-  storage used for an object is reclaimed, even if all links 
-  are deleted.</font>
-  
-</body>
-</html>
diff --git a/html/UG/OldHtmlSource/04_ProgModel.html b/html/UG/OldHtmlSource/04_ProgModel.html
deleted file mode 100755
index 8068d31..0000000
--- a/html/UG/OldHtmlSource/04_ProgModel.html
+++ /dev/null
@@ -1,1921 +0,0 @@
-<!doctype HTML public "-//W3C//DTD HTML 4.0 Frameset//EN">
-<html>
-<head>
-<title>Chapter 2: The HDF5 Library and Programming Model</title>
-
-<!--(Meta)==========================================================-->
-
-<!--(Links)=========================================================-->
-
-<!--( Begin styles definition )=====================================-->
-<link href="ed_styles/NewUGelect.css" rel="stylesheet" type="text/css">
-<!--( End styles definition )=======================================-->
-
-</head> 
-
-<body>
-
-<!-- #BeginLibraryItem "/ed_libs/styles_UG.lbi" -->
-<!--
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-  * Copyright by The HDF Group.                                               *
-  * Copyright by the Board of Trustees of the University of Illinois.         *
-  * All rights reserved.                                                      *
-  *                                                                           *
-  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
-  * terms governing use, modification, and redistribution, is contained in    *
-  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
-  * of the source code distribution tree; Copyright.html can be found at the  *
-  * root level of an installed copy of the electronic HDF5 document set and   *
-  * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-  * access to either file, you may request a copy from help at hdfgroup.org.     *
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- -->
-<!-- #EndLibraryItem --><!--( TOC )=========================================================-->
-<SCRIPT language="JavaScript">
-<!--
-document.writeln (' \
-<table x-use-null-cells\
-                align="right"\
-		width="240"\
-		cellspacing="0"\
-		class="tocTable">\
-  <tr valign="top"> \
-    <td class="tocTableHeaderCell" colspan="2"> \
-        <span class="TableHead">Chapter Contents</span></td>\
-  </tr>\
--->
-<!-- Table Version 3 -->\
-<!--
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Intro">1.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Intro">Introduction</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#ProgModel">2.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#ProgModel">Programming Model</a><br />\
-    <font size="-1">\
-         \
-    <a href="#CreateFile">Create file</a>\
-    <br /> \
-         \
-    <a href="#CreateDataset">Create dataset</a>\
-    <br /> \
-         \
-    <a href="#CloseObject">Close objects</a>\
-    <br /> \
-         \
-    <a href="#WriteRead">Write and read</a>\
-    <br /> \
-         \
-    <a href="#PartialWR">Partial write/read</a>\
-    <br /> \
-         \
-    <a href="#GetInfo">Get information</a>\
-    <br /> \
-         \
-    <a href="#CreateCDType">Create compound</a>\
-    <br /> \
-            \
-    <a href="#CreateCDType">datatype</a>\
-    <br /> \
-         \
-    <a href="#ExtendChunked">Create extendable or</a>\
-    <br /> \
-            \
-    <a href="#ExtendChunked">chunked dataset</a>\
-	  </td>\
-  </tr>\
-\
-  <tr valign="top"> \
-    <td class="tocTableContentCell"> \
--->
-<!-- editingComment -- "tocTableContentCell" and "tocTableContentCell4" \
--->\
-<!-- are the table-closing cell class.\
-    <td class="tocTableContentCell2"> \
--->\
-<!--
-      <a href="#IOPipeline">3.</a></td>\
-    <td class="tocTableContentCell4">\
-	  <a href="#IOPipeline">Data Transfer Pipeline</a>\
--->
-<!-- editingComment -- This section not currently complete or validated.\
-  </tr><tr valign="top"> \
-    <td class="tocTableContentCell"> \
-    <a href="#Appendix">10</a></td>\
-    <td class="tocTableContentCell4"><a href="#Appendix">Appendix</a></td>\
--->\
-<!--
-  </td></tr>\
-</table>\
-')
--->
-</SCRIPT>
-<!--(End TOC 1)=====================================================-->
-
-<!--( TOC 2 )=======================================================-->
-<!--
-<table x-use-null-cells
-                align="right"
-		width="240"
-		cellspacing="0"
-		class="tocTable">
-  <tr valign="top"> 
-    <td class="tocTableHeaderCell"> 
-    <span class="TableHead">Chapter Contents</span></td>
-  </tr>
-  <tr valign="top"> 
-    <td class="tocTableContentCell"> 
-    <a href="#Intro">1. Introduction</a>
-    <br /> 
-    <a href="#AbstractDMod">2. Abstract Data Model</a>
-    <br /> 
-    <a href="#SModel">3. HDF5 Storage Model</a> 
-    <br /> 
-    <a href="#LibPModel">4. Library and</a>
-    <br /> 
-        <a href="#LibPModel">Programming Model</a>
-    <br /> 
-    <a href="#IOPipeline">3. Data Transfer Pipeline</a> 
-    <br /> 
-        <a href="#Structure">HDF5 File</a>
-    </td>
-  </tr>
-</table>
--->
-<!--(End TOC 2)=====================================================-->
-
-<div align="center">
-<a name="TOP">
-<h2>Chapter 2<br /><font size="6">The HDF5 Library and Programming Model</font></h2>
-</a>
-</div>
-
-
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  ] ] ]</span>
--->
-
-<!-- HEADER LEFT " " -->
-<!-- HEADER RIGHT " " -->
-
-<!-- HEADER LEFT "HDF5 User's Guide" -->
-<!-- HEADER RIGHT "HDF5 Library and Programming Model" -->
-
-
-<a name="Intro">
-<h3>2.1. Introduction</h3>
-</a>
-
-
-
-
-
-
-
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="LibPModel">
-<div align="right">
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-  
-
-  <p>The HDF5 Library implements the HDF5 abstract data model and storage 
-  model. These models were described in the preceding chapter, 
-  “<a href="03_DataModel.html">The HDF5 Data Model</a>”. </p>
-
-  <p>Two major objectives of the HDF5 products are to provide tools 
-  that can be used on as many computational platforms as possible 
-  (portability), and to provide a reasonably object-oriented data model
-  and programming interface. </p>
-
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  Explain?  E.g., Java is portable, 
-  but there are many platforms on which it does not run. 
-  ] ] ]</span>
--->
-  
-  <p>To be as portable as possible, the HDF5 Library is implemented in 
-  portable C. C is not an object-oriented language, but the library uses 
-  several mechanisms and conventions to implement an object model.</p>
-  
-  <p>One mechanism the HDF5 library uses is to implement the objects 
-  as data structures. To refer to an object, the HDF5 library implements 
-  its own pointers. These pointers are called identifiers. 
-  An identifier is then used to invoke operations on a specific instance 
-  of an object. For example, when a group is opened,  
-  the API returns a group identifier. This identifier is a reference to that 
-  specific group and will be used to invoke future operations on that group. 
-  The identifier is valid only within the context it is created 
-  and remains valid until it is closed or the file is closed.
-  This mechanism is essentially the same as the mechanism that C++ or 
-  other object-oriented languages use to refer to objects except that the 
-  syntax is C. </p>
-
-  <p>Similarly, object-oriented languages collect all the methods for 
-  an object in a single name space. An example is the methods of a C++ class. 
-  The C language does not have any such mechanism, 
-  but the HDF5 Library simulates this through its API naming convention. 
-  API function names begin with a common prefix that is related to the 
-  class of objects that the function operates on. 
-  The table below lists the HDF5 objects and the standard prefixes 
-  used by the corresponding HDF5 APIs. 
-  For example, functions that operate on datatype objects all have names 
-  beginning with H5T.</p>
-
-<!-- NEW PAGE -->
-<table width="300" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 1. The HDF5 API naming scheme</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top">
-        <td>
-        <b>Prefix </b></td>
-        <td>
-        <b>Operates on  </b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>H5A</td>
-        <td>Attributes </td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>H5D</td>
-        <td>Datasets </td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>H5E</td>
-        <td>Error reports</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>H5F</td>
-        <td>Files</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>H5G</td>
-        <td>Groups</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>H5I</td>
-        <td>Identifiers</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>H5L</td>
-        <td>Links</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>H5O</td>
-        <td>Objects</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>H5P</td>
-        <td>Property lists</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>H5R</td>
-        <td>References</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>H5S</td>
-        <td>Dataspaces</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>H5T</td>
-        <td>Datatypes</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>H5Z</td>
-        <td>Filters</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
- 
-
-<!-- NEW PAGE -->
-<a name="ProgModel">
-<h3>2.2. The HDF5 Programming Model</h3>
-</a>
-
-  <p>In this section we introduce the HDF5 
-  <span class="termDefinition">programming model</span> by means of 
-  a series of short code samples. These samples illustrate a broad 
-  selection of common HDF5 tasks. More details are provided in the 
-  following chapters and in the 
-  <a href="../RM/RM_H5Front.html" TARGET="H5DocWin"> 
-  <cite>HDF5 Reference Manual</cite></a></p>
-
-<!-- editingComment
-  <span class="editingComment"><p>[ [ [
-  The following is based on text from the old "Intro to HDF5"  
-  and presumably needs some technical verification.
-  ] ] ]</span>
--->
-
-<a name="CreateFile">
-<h4>2.2.1. Creating an HDF5 File</h4></a>
-
-  <p>Before an HDF5 file can be used or referred to in any manner, 
-  it must be explicitly created or opened. When the need for access to 
-  a file ends, the file must be closed. The example below provides a C 
-  code fragment illustrating these steps. In this example, the values
-  for the file creation property list and the file access property list
-  are set to the defaults <code>H5P_DEFAULT</code>.</p>
-  
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  hid_t       file;                 /* declare file identifier */
-  /*
-  * Create a new file using H5F_ACC_TRUNC 
-  * to truncate and overwrite any file of the same name,
-  * default file creation properties, and 
-  * default file access properties.
-  * Then close the file.
-  */
-  file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-  status = H5Fclose(file); </pre></td>
-    </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 1. Creating and closing an HDF5 file</b>
-        <hr color="green" size="3"/></td>
-        <!-- formerly Figure 1-->
-        </tr>
-</table>
-<br />
-
-  <p>Note: If there is a possibility that a file of the declared name
-  already exists and you wish to open a new file regardless of that
-  possibility, the flag <code>H5F_ACC_TRUNC</code> will cause the
-  operation to overwrite the previous file. If the operation should
-  fail in such a circumstance, use the flag <code>H5F_ACC_EXCL</code>
-  instead.</p>
-  
-
-
-
-<a name="CreateDataset">
-<h4>2.2.2. Creating and Initializing a Dataset</h4></a>
-  
-  <p>The essential objects within a dataset are datatype and dataspace. 
-  These are independent objects and are created separately from any dataset 
-  to which they may be attached. Hence, creating a dataset requires, 
-  at a minimum, the following steps:</p>
-  
-  <ol> 
-      <li>Create and initialize a dataspace for the dataset</li>
-      <li>Define a datatype for the dataset</li>
-      <li>Create and initialize the dataset</li>
-  </ol>
-  
-<!-- NEW PAGE -->
-  <p>The code in the example below illustrates the execution of these steps.</p>
-  
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  hid_t    dataset, datatype, dataspace;  /* declare identifiers */
-  
-  /* 
-   * Create a dataspace: Describe the size of the array and 
-   * create the dataspace for a fixed-size dataset. 
-   */
-  dimsf[0] = NX;
-  dimsf[1] = NY;
-  dataspace = H5Screate_simple(RANK, dimsf, NULL); 
-  /*
-   * Define a datatype for the data in the dataset.
-   * We will store little endian integers.
-   */
-  datatype = H5Tcopy(H5T_NATIVE_INT);
-  status = H5Tset_order(datatype, H5T_ORDER_LE);
-  /*
-   * Create a new dataset within the file using the defined 
-   * dataspace and datatype and default dataset creation
-   * properties.
-   * NOTE: H5T_NATIVE_INT can be used as the datatype if 
-   * conversion to little endian is not needed.
-   */
-  dataset = H5Dcreate(file, DATASETNAME, datatype, dataspace,
-              H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); </pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 2. Create a dataset</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<a name="CloseObject">
-<h4>2.2.3. Closing an Object </h4></a>
-  
-  <p>An application should close an object such as a datatype, dataspace, 
-  or dataset once the object is no longer needed.
-  Since each is an independent object, each must be released 
-  (or closed) separately. This action is frequently referred to as 
-  <span class="termDefinition">releasing the object’s identifier</span>.
-  The code in the example below <!-- formerly Figure 3 -->closes the 
-  datatype, dataspace, and dataset that were created in the preceding 
-  section.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  H5Tclose(datatype); 
-  H5Dclose(dataset); 
-  H5Sclose(dataspace);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 3. Close an object</b>
-        <hr color="green" size="3"/></td>
-        <!-- formerly Figure 3 -->
-        </tr>
-</table>
-<br />
-
-<p>There is a long list of HDF5 Library items that return a unique 
-identifier when the item is created or opened. Each time that one of 
-these items is opened, a unique identifier is returned. Closing a file 
-does not mean that the groups, datasets, or other open items are also 
-closed. Each opened item must be closed separately. </p>
-
-<!-- FOR USE WITH ELECTRONIC VERSION --------------------------------->
-<p>For more information, see 
-<a href="../Advanced/UsingIdentifiers/index.html">“Using Identifiers”</a> 
-in the “Advanced Topics” page.</p>
-
-<!-- FOR USE WITH ELECTRONIC VERSION --------------------------------->
-
-
-<!-- FOR USE WITH PRINT VERSION --------------------------------------
-<p>For more information, see “Using Identifiers” in the 
-“Additional Resources” chapter.</p>
-<!-- FOR USE WITH PRINT VERSION -------------------------------------->
-
-
-<a name="ClosingAFileNotes">
-<h4>How Closing a File Effects Other Open Structural Elements</h4></a>
-<p>Every structural element in an HDF5 file can be opened, and these 
-elements can be opened more than once. Elements range in size from 
-the entire file down to attributes. When an element is opened, the 
-HDF5 Library returns a unique identifier to the application. Every 
-element that is opened must be closed. If an element was opened more 
-than once, each identifier that was returned to the application must 
-be closed. For example, if a dataset was opened twice, both dataset 
-identifiers must be released (closed) before the dataset can be 
-considered closed. Suppose an application has opened a file, a group in 
-the file, and two datasets in the group. In order for the file to be 
-totally closed, the file, group, and datasets must each be closed. 
-Closing the file before the group or the datasets will not effect the 
-state of the group or datasets: the group and datasets will still be 
-open.</p>
-
-<p>There are several exceptions to the above general rule. One is when 
-the <code>H5close</code> function is used. <code>H5close</code> causes a 
-general shutdown of the library: all data is written to disk, all 
-identifiers are closed, and all memory used by the library is 
-cleaned up. Another exception occurs on parallel processing systems. 
-Suppose on a parallel system an application has opened a file, a 
-group in the file, and two datasets in the group. If the application 
-uses the <code>H5Fclose</code> function to close the file, the call 
-will fail with an error. The open group and datasets must be closed 
-before the file can be closed. A third exception is when the file 
-access property list includes the property <code>H5F_CLOSE_STRONG</code>. 
-This property closes any open elements when the file is closed with 
-<code>H5Fclose</code>. For more information, see the 
-<a href="../RM/RM_H5P.html#Property-SetFcloseDegree">
-<code>H5Pset_fclose_degree</code></a> function in the 
-<cite>HDF5 Reference Manual</cite>.</p>
-
-<a name="WriteRead">
-<h4>2.2.4. Writing or Reading a Dataset to or from a File</h4></a>
-
-  <p>Having created the dataset, the actual data can be written 
-  with a call to <code>H5Dwrite</code>. See the example below.</p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  /*
-  * Write the data to the dataset using default transfer
-  * properties.
-  */
-  status = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL,
-            H5P_DEFAULT, data);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 4. Writing a dataset</b>
-        <hr color="green" size="3"/></td>
-        <!-- formerly Figure 4 -->
-        </tr>
-</table>
-<br />
-
-  <p>Note that the third and fourth <code>H5Dwrite</code> parameters in 
-  the above example describe the dataspaces in memory and in the file, 
-  respectively. For now, these are both set to <code>H5S_ALL</code> which 
-  indicates that the entire dataset is to be written. 
-  The selection of partial datasets and the use of differing dataspaces
-  in memory and in storage will be discussed later in this chapter and 
-  in more detail elsewhere in this guide.</p>
-  
-  <p>Reading the dataset from storage is similar to writing the dataset to 
-  storage. To read an entire dataset, substitute <code>H5Dread</code> for 
-  <code>H5Dwrite</code> in the above example.</p>
-
-
-<a name="PartialWR">
-<h4>2.2.5. Reading and Writing a Portion of a Dataset</h4>
-</a>
-
-  <p>The previous section described writing or reading an entire 
-  dataset. HDF5 also supports access to portions of a dataset. These parts of
-  datasets are known as <span class="termDefinition">selections</span>. 
-  
-  <p>The simplest type of selection is a 
-  <span class="termDefinition">simple hyperslab</span>. This is 
-  an <span class="codeVar">n</span>-dimensional rectangular sub-set of 
-  a dataset where <span class="codeVar">n</span> is equal to the 
-  dataset’s rank. Other available selections include 
-  a more complex hyperslab with user-defined stride and block size,
-  a list of independent points, or the union of any of these.</p>
-
-  <p>The figure below <!-- formerly Figure 5 -->shows several 
-  sample selections.</p>
-  
-<!-- NEW PAGE -->
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Pmodel_fig5_a.jpg"><br />
-        <img src="Images/Pmodel_fig5_b.jpg"><br />
-        <img src="Images/Pmodel_fig5_c.jpg"><br />
-        <img src="Images/Pmodel_fig5_d.jpg"><br />
-        <img src="Images/Pmodel_fig5_e.jpg"><br />
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 1. Dataset selections</b><br />
-        <!-- formerly Figure 5. -->
-        Selections can take the form of a simple hyperslab, 
-        a hyperslab with user-defined stride and block,
-        a selection of points, or a union of any of these forms.
-        <!--
-            <span class="editingComment"><br />[ [ [ 
-            Edit figures to retain... 
-                upper left, 
-                maybe a second simple hyperslab, 
-                2nd left, 
-                box on right (3-D point),
-                and an interesting-looking union.
-            None of the text in the JPEGs need be retained.
-            Use new figure filenames as we are holding the current figure for possible reuse elsewhere.
-            <br />
-            If it's not already been done, remember that the original figure is to be used, in toto, 
-            in the "Memory<-->Disk Data Transfer" discussion, with "Key" to add characters '(hyperslab)'
-            immediately to the right of the hyperslab icon.
-            ] ] ]</span>
-            -->
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-<!-- NEW PAGE -->
-  <p>Selections and hyperslabs are portions of a dataset. 
-  As described above, a <span class="termDefinition">simple hyperslab</span> 
-  is a rectangular array of data elements with the same rank as the 
-  dataset’s dataspace. Thus, a simple hyperslab is a 
-  logically contiguous collection of points within the dataset. </p>
-
-  <p>The more general case of a <span class="termDefinition">hyperslab</span>
-  can also be a regular pattern of points or blocks within the dataspace. 
-  Four parameters are required to describe a general hyperslab: the 
-  starting coordinates, the block size, the stride or space between 
-  blocks, and the number of blocks. These parameters are each expressed 
-  as a one-dimensional array with length equal to the rank of the dataspace 
-  and are described in the table below 
-  <!-- formerly table 2-->.</p>
-  
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 2. Hyperslab parameters</b>
-        </td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td> 
-        <b>Parameter  </b></td>
-        <td> 
-        <b>Definition</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code><i>start</i></code></td>
-        <td> 
-        The coordinates of the starting location of the hyperslab 
-        in the dataset’s dataspace.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code><i>block</i></code></td>
-        <td> 
-        The size of each block to be selected from the dataspace. 
-        If the <code>block</code> parameter is set to NULL, 
-        the block size defaults to a single element in each dimension, 
-        as if the block array was set to all <code>1</code>s (all ones).
-        This will result in the selection of 
-        a uniformly spaced set of <code>count</code> points 
-        starting at <code>start</code> and 
-        on the interval defined by <code>stride</code>.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code><i>stride</i></code></td>
-        <td> 
-        The number of elements separating the starting point of each element 
-        or block to be selected. 
-        If the <code>stride</code> parameter is set to NULL, 
-        the stride size defaults to 1 (one) in each dimension 
-        and no elements are skipped.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code><i>count</i></code></td>
-        <td> 
-        The number of elements or blocks to select along each dimension.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-  <h4>Reading Data into a Differently Shaped Memory Block</h4>
-  
-  <p>For maximum flexibility in user applications, a selection in storage 
-  can be mapped into a differently-shaped selection in memory. All that 
-  is required is that the two selections contain the same number of data 
-  elements. In this example, we will first define the selection to be 
-  read from the dataset in storage, and then we will define the 
-  selection as it will appear in application memory.</p>
-
-  <p>Suppose we want to read a 3 x 4 hyperslab from a two-dimensional 
-  dataset in a file beginning at the dataset element <1,2>. 
-  The first task is to create the dataspace that describes the 
-  overall rank and dimensions of the dataset in the file and to 
-  specify the position and size of the in-file hyperslab that we 
-  are extracting from that dataset. See the code below.  
-  <!-- formerly Figure 6--></p>
-    
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  /* 
-  * Define dataset dataspace in file.
-  */
-  dataspace = H5Dget_space(dataset);    /* dataspace identifier */
-  rank      = H5Sget_simple_extent_ndims(dataspace);
-  status_n  = H5Sget_simple_extent_dims(dataspace, dims_out, NULL);
-
-  /* 
-  * Define hyperslab in the dataset. 
-  */
-  offset[0] = 1;
-  offset[1] = 2;
-  count[0]  = 3;
-  count[1]  = 4;
-  status = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, offset, NULL, 
-           count, NULL);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 5. Define the selection to be read from storage </b>
-        <!-- formerly Figure 6.-->
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>The next task is to define a dataspace in memory. 
-  Suppose that we have in memory a three-dimensional 7 x 7 x 3 array 
-  into which we wish to read the two-dimensional 3 x 4 hyperslab 
-  described above and that we want the memory selection to begin at 
-  the element <3,0,0> and reside in the plane of the first two 
-  dimensions of the array. Since the in-memory dataspace is 
-  three-dimensional, we have to describe the in-memory selection as 
-  three-dimensional. Since we are keeping the selection in the plane 
-  of the first two dimensions of the in-memory dataset, the in-memory 
-  selection will be a 3 x 4 x 1 array defined as <3,4,1>. </p>
-  
-<!-- NOT EDITED TO..... ----->
-  <p>Notice that we must describe two things: the dimensions of the 
-  in-memory array, and the size and position of the hyperslab that we 
-  wish to read in. The code below <!--formerly Figure 7 -->illustrates 
-  how this would be done.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  /*
-  * Define memory dataspace.
-  */
-  dimsm[0] = 7;
-  dimsm[1] = 7;
-  dimsm[2] = 3;
-  memspace = H5Screate_simple(RANK_OUT,dimsm,NULL);   
-
-  /* 
-  * Define memory hyperslab. 
-  */
-  offset_out[0] = 3;
-  offset_out[1] = 0;
-  offset_out[2] = 0;
-  count_out[0]  = 3;
-  count_out[1]  = 4;
-  count_out[2]  = 1;
-  status = H5Sselect_hyperslab(memspace, H5S_SELECT_SET, offset_out, NULL, 
-           count_out, NULL);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 6. Define the memory dataspace and selection </b>
-        <hr color="green" size="3"/></td>
-        <!-- formerly Figure 7.-->
-        </tr>
-</table>
-<br />
-
-  <p>The hyperslab defined in the code above has the following parameters: 
-  <code>start=(3,0,0)</code>, <code>count=(3,4,1)</code>, stride and 
-  block size are <code>NULL</code>.</p>
-<!-- .....TO HERE ----->  
-
-
-
-
-  <h4>Writing Data into a Differently Shaped Disk Storage Block</h4>
-
-  <p>Now let’s consider the opposite process of 
-  writing a selection from memory to a selection in a dataset in a file.
-  Suppose that the source dataspace in memory is a 50-element, 
-  one-dimensional array called <code>vector</code> 
-  <!-- formerly Figure 8--> 
-  and that the source selection is a 48-element simple hyperslab 
-  that starts at the second element of <code>vector</code>. 
-  See the figure below.</p>
-  
-
-<table width="400" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-
-    <tr>
-        <td align="center"><br />	  
-        <table align="center" border="1">
-            <tr valign="top" align="center">
-                <td>  <code>-1</code>  </td>
-                <td>  <code>1</code>  </td>
-                <td>  <code>2</code>  </td>
-                <td>  <code>3</code>  </td>
-                <td>  <code>...</code>  </td>
-                <td>  <code>49</code>  </td>
-                <td>  <code>50</code>  </td>
-                <td>  <code>-1</code>  </td>
-                </tr>
-                </table> 
-            </td></tr>
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 2. A one-dimensional array</b>
-        <!-- formerly Figure 8-->
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<!-- NEW PAGE -->
-  <p>Further suppose that we wish to write this data to the file as 
-  a series of 3 x 2-element blocks in a two-dimensional dataset, 
-  skipping one row and one column between blocks.
-  Since the source selection contains 48 data elements and   
-  each block in the destination selection contains 6 data elements, 
-  we must define the destination selection with 8 blocks. 
-  We will write 2 blocks in the first dimension and 4 in the second.
-  The code below <!-- formerly Figure 9 --> shows how to achieve this 
-  objective.</p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  /* Select the hyperslab for the dataset in the file, using 3 x 2 blocks, 
-   * a (4,3) stride, a (2,4) count, and starting at the position (0,1).
-   */
-  start[0]  = 0; start[1]  = 1;
-  stride[0] = 4; stride[1] = 3;
-  count[0]  = 2; count[1]  = 4;    
-  block[0]  = 3; block[1]  = 2;
-  ret = H5Sselect_hyperslab(fid, H5S_SELECT_SET, start, stride, count, block);
-
-  /*
-   * Create dataspace for the first dataset.
-   */
-  mid1 = H5Screate_simple(MSPACE1_RANK, dim1, NULL);
-
-  /*
-  /*
-   * Select hyperslab. 
-   * We will use 48 elements of the vector buffer starting at the second element.
-   * Selected elements are 1 2 3 . . . 48
-   */
-  start[0]  = 1;
-  stride[0] = 1;
-  count[0]  = 48;
-  block[0]  = 1;
-  ret = H5Sselect_hyperslab(mid1, H5S_SELECT_SET, start, stride, count, block);
- 
-  /*
-   * Write selection from the vector buffer to the dataset in the file.
-   *
-  ret = H5Dwrite(dataset, H5T_NATIVE_INT, mid1, fid, H5P_DEFAULT, vector)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 7. The destination selection
-        <!-- formerly Figure 9--></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<!-- NEW PAGE -->
-<a name="GetInfo">
-<h4>2.2.6. Getting Information about a Dataset</h4>
-</a>
-  
-  <p>Although reading is analogous to writing, it is often first necessary 
-  to query a file to obtain information about the dataset to be read. 
-  For instance, we often need to determine the datatype associated with a 
-  dataset, or its dataspace (i.e., rank and dimensions). 
-  As illustrated in the code example below <!--formerly Figure 10-->, 
-  there are several <span class="termDefinition">get</span> routines for 
-  obtaining this information.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  /*
-  * Get datatype and dataspace identifiers,  
-  * then query datatype class, order, and size, and 
-  * then query dataspace rank and dimensions.
-  */
-
-   datatype = H5Dget_type (dataset);  /* datatype identifier */
-   class = H5Tget_class (datatype);
-   if (class == H5T_INTEGER) printf("Dataset has INTEGER type \n");
-   order = H5Tget_order (datatype);
-   if (order == H5T_ORDER_LE) printf("Little endian order \n");
-
-   size = H5Tget_size (datatype);
-   printf ("Size is %d \n", size);
-   dataspace = H5Dget_space (dataset); /* dataspace identifier */
-
-   /* Find rank and retrieve current and maximum dimension sizes */ 
-
-   rank = H5Sget_simple_extent_dims (dataspace, dims, max_dims);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 8. Routines to get dataset parameters
-        <!--formerly Figure 10--></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<a name="CreateCDType">
-<h4>2.2.7. Creating and Defining Compound Datatypes</h4></a>
-  
-  <p>A <span class="termDefinition">compound datatype</span> is a 
-  collection of one or more data elements. Each element might be an 
-  atomic type, a small array, or another compound datatype. </p>
-  
-  <p>The provision for nested compound datatypes allows these structures 
-  to become quite complex. An HDF5 compound datatype has some similarities 
-  to a C struct or a Fortran common block. Though not originally designed 
-  with databases in mind, HDF5 compound datatypes are sometimes used 
-  in a way that is similar to a database record. Compound datatypes 
-  can become either a powerful tool or a complex and difficult-to-debug 
-  construct. Reasonable caution is advised.</p>
-
-  <p>To create and use a compound datatype, 
-  you need to create a datatype with class 
-  <span class="termDefinition">compound</span> (<code>H5T_COMPOUND</code>) 
-  and specify the total size of the data element in bytes. 
-  A compound datatype consists of zero or more uniquely named members. 
-  Members can be defined in any order but must occupy non-overlapping regions 
-  within the datum. The table below <!-- formerly 
-  Table 3 -->lists the properties of compound datatype members.</p>
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 3. Compound datatype member properties</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="2" /></td></tr>
-    <tr valign="top"> 
-        <td width="20%"><b>Parameter</b></td>
-        <td width="80%"><b>Definition</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Index</td>
-        <td>An index number between zero and N-1, where N is the number of 
-        members in the compound. The elements are indexed in the order of 
-        their location in the array of bytes.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Name</td>
-        <td>A string that must be unique within the members 
-        of the same datatype.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Datatype</td>
-        <td>An HDF5 datatype.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Offset</td>
-        <td>A fixed byte offset which defines the location of the first 
-        byte of that member in the compound datatype.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="2" /></td></tr>
-</table>
-<br />
-
-  <p>Properties of the members of a compound datatype are 
-  defined when the member is added to the compound type. These 
-  properties cannot be modified later. </p>
-  
-
-<h4>Defining Compound Datatypes</h4> 
-  
-  <p>Compound datatypes must be built out of other datatypes. 
-  To do this, you first create an empty compound datatype and specify 
-  its total size. Members are then added to the compound datatype 
-  in any order. </p>
-  
-  <p>Each member must have a descriptive name. This is the 
-  key used to uniquely identify the member within the 
-  compound datatype. A member name in an HDF5 datatype does 
-  not necessarily have to be the same as the name of the 
-  corresponding member in the C struct in memory although 
-  this is often the case. You also do not need to define all the 
-  members of the C struct in the HDF5 compound datatype 
-  (or vice versa). </p>
-  
-  <p>Usually a C struct will be defined to hold a data 
-  point in memory, and the offsets of the members in memory 
-  will be the offsets of the struct members from the beginning 
-  of an instance of the struct. The library defines the macro 
-  that computes the offset of member <code>m</code> within a 
-  struct variable <code>s</code>.: </p>
-  
-  <dir><code>HOFFSET(s,m)</code></dir>
-  
-  <p>The code below <!-- formerly Figure 11 -->shows an example in 
-  which a compound datatype is created to describe complex numbers 
-  whose type is defined by the <code>complex_t</code> struct.</p>
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  Typedef struct {
-     double re;   /*real part */
-     double im;   /*imaginary part */
-  } complex_t;
-
-  complex_t tmp;  /*used only to compute offsets */
-  hid_t complex_id = H5Tcreate (H5T_COMPOUND, sizeof tmp);
-  H5Tinsert (complex_id, "real", HOFFSET(tmp,re),
-            H5T_NATIVE_DOUBLE);
-  H5Tinsert (complex_id, "imaginary", HOFFSET(tmp,im),
-            H5T_NATIVE_DOUBLE);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 9. A compound datatype for complex numbers</b>
-        <!-- formerly Figure 11-->
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<!-- editingComment
-  <span class="editingComment">
-  <p>For more information about Datatypes, see Chapter ???.
-  </span>
--->
-
-
-<a name="ExtendChunked">
-<h4>2.2.8. Creating and Writing Extendable Datasets</h4>
-</a>
-  
-  <p>An extendable dataset is one whose dimensions can grow. 
-  One can define an HDF5 dataset to have certain initial 
-  dimensions with the capacity to later increase the size 
-  of any of the initial dimensions. For example, the figure below 
-  <!-- formerly Figure 12 -->shows a  3 x 3 dataset (a) 
-  which is later extended to be a 10 x 3 dataset by adding 7 
-  rows (b), and further extended to be a 10 x 5 dataset by 
-  adding two columns (c).</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-
-    <table width="80%" cellspacing="0" class="fullImgTable" align="center">
-        <tr>
-            <td align="center"><br />
-    
-    <table align="center">
-      <tr>
-        <td valign="middle" align="center" width="45%">
-          
-          <table align="center" border="1">
-            <tr>
-              <td>  <code>1</code>  </td>
-              <td>  <code>1</code>  </td>
-              <td>  <code>1</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>1</code>  </td>
-              <td>  <code>1</code>  </td>
-              <td>  <code>1</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>1</code>  </td>
-              <td>  <code>1</code>  </td>
-              <td>  <code>1</code>  </td>
-            </tr>
-          </table>
-          a) Initially, 3 x 3
-          <br /> <br />
-          <table align="center" border="1">
-            <tr>
-              <td>  <code>1</code>  </td>
-              <td>  <code>1</code>  </td>
-              <td>  <code>1</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>1</code>  </td>
-              <td>  <code>1</code>  </td>
-              <td>  <code>1</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>1</code>  </td>
-              <td>  <code>1</code>  </td>
-              <td>  <code>1</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-            </tr>
-          </table>
-          b) Extend to 10 x 3
-
-        </td>
-        <td valign="middle" align="center" width="55%">
-        <code>      </code>
-        </td>
-        <td valign="middle" align="center" width="55%">
-        
-          <table align="center" border="1">
-            <tr>
-              <td>  <code>1</code>  </td>
-              <td>  <code>1</code>  </td>
-              <td>  <code>1</code>  </td>
-              <td>  <code>3</code>  </td>
-              <td>  <code>3</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>1</code>  </td>
-              <td>  <code>1</code>  </td>
-              <td>  <code>1</code>  </td>
-              <td>  <code>3</code>  </td>
-              <td>  <code>3</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>1</code>  </td>
-              <td>  <code>1</code>  </td>
-              <td>  <code>1</code>  </td>
-              <td>  <code>3</code>  </td>
-              <td>  <code>3</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>3</code>  </td>
-              <td>  <code>3</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>3</code>  </td>
-              <td>  <code>3</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>3</code>  </td>
-              <td>  <code>3</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>3</code>  </td>
-              <td>  <code>3</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>3</code>  </td>
-              <td>  <code>3</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>3</code>  </td>
-              <td>  <code>3</code>  </td>
-            </tr>
-            <tr>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>2</code>  </td>
-              <td>  <code>3</code>  </td>
-              <td>  <code>3</code>  </td>
-            </tr>
-          </table>
-          c) Extend to 10 x 5
-      </tr>
-    </table> 
-    </td></tr>
-    </table>
-    </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 3. Extending a dataset</b>
-        <!-- formerly Figure 12-->
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>HDF5 requires the use of chunking when defining 
-  extendable datasets. Chunking makes it possible to extend 
-  datasets efficiently without having to reorganize contiguous 
-  storage excessively. </p>
-  
-  <p>To summarize, an extendable dataset requires two conditions:</p>
-  
-  <ol> 
-      <li>Define the dataspace of the dataset as unlimited in 
-          all dimensions that might eventually be extended</li>
-      <li>Enable chunking in the dataset creation properties</li>
-  </ol>
-  
-  <p>For example, suppose we wish to create a dataset similar 
-  to the one shown in the figure above<!-- formerly Figure 12-->. 
-  We want to start with a 3 x 3 dataset, and then later we will 
-  extend it. To do this, go through the steps below.</p>
-  
-  <p>First, declare the dataspace to have unlimited dimensions. See 
-  the code shown below. Note the use of the predefined constant 
-  <code>H5S_UNLIMITED</code> to specify that a dimension is 
-  unlimited.</p>
-  
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  Hsize_t dims[2] = {3, 3}; /* dataset dimensions
-  at the creation time */ 
-  hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED};
-  /*
-   * Create the data space with unlimited dimensions. 
-   */
-  dataspace = H5Screate_simple(RANK, dims, maxdims);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 10. Declaring a dataspace with unlimited dimensions</b>
-        <!-- formerly Figure 13-->
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-  <p>Next, set the dataset creation property list to 
-  enable chunking. See the code below.</p> 
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  hid_t cparms; 
-  hsize_t chunk_dims[2] ={2, 5};
-  /* 
-   * Modify dataset creation properties to enable chunking.
-   */
-  cparms = H5Pcreate (H5P_DATASET_CREATE);
-  status = H5Pset_chunk(cparms, RANK, chunk_dims);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 11. Enable chunking
-        <!-- formerly Figure 14--></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<!-- NEW PAGE -->
-
-  <p>The next step is to create the dataset. See the code below.</p> 
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  /*
-   * Create a new dataset within the file using cparms
-   * creation properties.
-   */
-  dataset = H5Dcreate(file, DATASETNAME, H5T_NATIVE_INT, dataspace,
-            H5P_DEFAULT, cparms, H5P_DEFAULT);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 12. Create a dataset 
-        <!-- formerly Figure 15--></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>Finally, when the time comes to extend the size of 
-  the dataset, invoke <code>H5Dextend</code>. Extending 
-  the dataset along the first dimension by seven rows 
-  leaves the dataset with new dimensions of <10,3>. See the 
-  code below.</p> 
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  /*
-   * Extend the dataset. Dataset becomes 10 x 3.
-   */
-  dims[0] = dims[0] + 7;
-  size[0] = dims[0]; 
-  size[1] = dims[1]; 
-  status = H5Dextend (dataset, size);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 13. Extend the dataset by seven rows</b>
-        <!-- formerly Figure 16-->
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<a name="Groups">
-<h4>2.2.9. Creating and Working with Groups</h4>
-</a>
-  
-  <p>Groups provide a mechanism for organizing meaningful 
-  and extendable sets of datasets within an HDF5 file. The H5G 
-  API provides several routines for working with groups. </p>
-
-<h4>Creating a Group</h4>
-  
-  <p>With no datatype, dataspace, or storage layout to define, 
-  creating a group is considerably simpler than creating a 
-  dataset. For example, the following code creates a group 
-  called <code>Data</code> in the root group of 
-  <code>file</code>.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  /*
-   *  Create a group in the file.
-   */
-  grp = H5Gcreate(file, "/Data", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 14. Create a group</b>
-        <!-- formerly Figure 17-->
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<!-- NEW PAGE -->
-  <p>A group may be created within another group by providing 
-  the absolute name of the group to the <code>H5Gcreate</code> function 
-  or by specifying its location. For example, to create the 
-  group <code>Data_new</code> in the group <code>Data</code>, you might use 
-  the sequence of calls shown below.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-   /*
-    * Create group "Data_new" in the group "Data" by specifying
-    * absolute name of the group.
-    */
-   grp_new = H5Gcreate(file, "/Data/Data_new", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-  or 
-
-   /*
-    * Create group "Data_new" in the "Data" group.
-    */
-   grp_new = H5Gcreate(grp, "Data_new", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 15. Create a group within a group</b> 
-        <!-- formerly Figure 18-->
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>This first parameter of <code>H5Gcreate</code> is a location 
-  identifier. <code>file</code> in the first example specifies only 
-  the file. <code>grp</code> in the second example specifies 
-  a particular group in a particular file. Note that in 
-  this instance, the group identifier <code>grp</code> is 
-  used as the first parameter in the <code>H5Gcreate</code> 
-  call so that the relative name of <code>Data_new</code> 
-  can be used.</p>
-  
-  <p>The third parameter of <code>H5Gcreate</code> optionally specifies 
-  how much file space to reserve to store the names of objects that 
-  will be created in this group. If a non-positive value is supplied, 
-  the library provides a default size.</p> 
-  
-  <p>Use <code>H5Gclose</code> to close the group and release 
-  the group identifier. </p>
-  
-<!-- NEW PAGE -->
-  <h4>Creating a Dataset within a Group</h4> 
-  
-  <p>As with groups, a dataset can be created in a particular group 
-  by specifying either its absolute name in the file or its relative 
-  name with respect to that group. The next code excerpt 
-  uses the absolute name.</p> 
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  /*
-   * Create the dataset "Compressed_Data" in the group Data using the 
-   * absolute name. The dataset creation property list is modified 
-   * to use GZIP compression with the compression effort set to 6.
-   * Note that compression can be used only when the dataset is 
-   * chunked.
-   */
-  dims[0] = 1000;
-  dims[1] = 20;
-  cdims[0] = 20;
-  cdims[1] = 20;
-  dataspace = H5Screate_simple(RANK, dims, NULL);
-  plist     = H5Pcreate(H5P_DATASET_CREATE);
-            H5Pset_chunk(plist, 2, cdims);
-            H5Pset_deflate(plist, 6);
-  dataset = H5Dcreate(file, "/Data/Compressed_Data", 
-            H5T_NATIVE_INT, dataspace, H5P_DEFAULT, plist, H5P_DEFAULT);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 16. Create a dataset within 
-        a group using an absolute name </b> 
-        <!-- formerly Figure 19-->
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-  <p>Alternatively, you can first obtain an identifier for 
-  the group in which the dataset is to be created, and then 
-  create the dataset with a relative name.</p> 
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  /* 
-   * Open the group.
-   */
-  grp = H5Gopen(file, "Data", H5P_DEFAULT);
-
-  /*
-   * Create the dataset "Compressed_Data" in the "Data" group
-   * by providing a group identifier and a relative dataset 
-   * name as parameters to the H5Dcreate function.
-   */
-  dataset = H5Dcreate(grp, "Compressed_Data", H5T_NATIVE_INT,
-                dataspace, H5P_DEFAULT, plist, H5P_DEFAULT);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 17. Create a dataset within a group using a relative name</b>
-        <!-- formerly Figure 20-->
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<!-- NEW PAGE -->
-
-  <h4>Accessing an Object in a Group</h4>
-  
-  <p>Any object in a group 
-  can be accessed by its absolute or relative name. The 
-  first code snippet below illustrates the use of the absolute 
-  name to access the dataset <code>Compressed_Data</code> in 
-  the group <code>Data</code> created in the examples above. 
-  The second code snippet illustrates the use of the 
-  relative name.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  /*
-   * Open the dataset "Compressed_Data" in the "Data" group. 
-   */
-  dataset = H5Dopen(file, "/Data/Compressed_Data", H5P_DEFAULT);
-    </pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 18. Accessing a group using its absolute name</b>
-        <!-- formerly Figure 21--> 
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  /*
-   * Open the group "data" in the file.
-   */
-  grp  = H5Gopen(file, "Data", H5P_DEFAULT);
- 
-  /*
-   * Access the "Compressed_Data" dataset in the group.
-   */
-  dataset = H5Dopen(grp, "Compressed_Data", H5P_DEFAULT);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 19. Accessing a group using its relative name</b>
-        <!-- formerly Figure 22-->
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<!-- NEW PAGE -->
-<a name="Attrs">
-<h4>2.2.10. Working with Attributes</h4>
-</a>
-  
-  <p>An attribute is a small dataset that is attached to 
-  a normal dataset or group. Attributes share many of the 
-  characteristics of datasets, so the programming model for 
-  working with attributes is similar in many ways to the 
-  model for working with datasets. The primary differences 
-  are that an attribute must be attached to a dataset or a 
-  group and sub-setting operations cannot be performed on 
-  attributes. </p>
-  
-  <p>To create an attribute belonging to a particular 
-  dataset or group, first create a dataspace for the attribute 
-  with the call to <code>H5Screate</code>, and then create the 
-  attribute using <code>H5Acreate</code>. For example, the 
-  code shown below creates an attribute called 
-  <code>Integer_attribute</code> that is a member of a dataset 
-  whose identifier is <code>dataset</code>. The attribute identifier is 
-  <code>attr2</code>. <code>H5Awrite</code> then sets the value of 
-  the attribute of that of the integer variable point. 
-  <code>H5Aclose</code> then releases the attribute 
-  identifier.</p>
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  Int point = 1;                         /* Value of the scalar attribute */ 
-
-  /*
-   * Create scalar attribute.
-   */
-  aid2  = H5Screate(H5S_SCALAR);
-  attr2 = H5Acreate(dataset, "Integer attribute", H5T_NATIVE_INT, aid2,
-                H5P_DEFAULT, H5P_DEFAULT);
-
-  /*
-   * Write scalar attribute.
-   */
-   ret = H5Awrite(attr2, H5T_NATIVE_INT, &point); 
-
-  /*
-   * Close attribute dataspace.
-   */
-  ret = H5Sclose(aid2); 
-
-  /*
-   * Close attribute.
-   */
-  ret = H5Aclose(attr2); </pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 20. Create an attribute</b>
-        <!-- formerly Figure 23--> 
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>To read a scalar attribute whose name and datatype 
-  are known, first open the attribute using 
-  <code>H5Aopen_by_name</code>, and then use <code>H5Aread</code> 
-  to get its value. For example, the code shown below reads a scalar 
-  attribute called <code>Integer_attribute</code> whose 
-  datatype is a native integer and whose parent dataset 
-  has the identifier <code>dataset</code>.</p> 
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  /*
-   * Attach to the scalar attribute using attribute name, then read and 
-   * display its value.
-   */
-  attr = H5Aopen_by_name(file_id, dataset_name, "Integer attribute",
-                    H5P_DEFAULT, H5P_DEFAULT);
-  ret  = H5Aread(attr, H5T_NATIVE_INT, &point_out);
-  printf("The value of the attribute \"Integer attribute\" is %d \n", point_out); 
-  ret =  H5Aclose(attr);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 21. Read a known attribute</b>
-        <!-- formerly Figure 24--> 
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-  <p>To read an attribute whose characteristics are 
-  not known, go through these steps. First, query the file to 
-  obtain information about the attribute such as its name, 
-  datatype, rank, and dimensions, and then read the attribute. The 
-  following code opens an attribute by its index value using 
-  <code>H5Aopen_by_idx</code>, and then it reads in information about 
-  the datatype with <code>H5Aread</code>.</p> 
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  /*
-   * Attach to the string attribute using its index, then read and display the value.
-   */
-  attr =  H5Aopen_by_idx(file_id, dataset_name, index_type, iter_order, 2,
-                    H5P_DEFAULT, H5P_DEFAULT);
-  atype = H5Tcopy(H5T_C_S1);
-          H5Tset_size(atype, 4);
-  ret   = H5Aread(attr, atype, string_out);
-  printf("The value of the attribute with the index 2 is %s \n", string_out);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 22. Read an unknown attribute
-        <!-- formerly Figure 25--></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>In practice, if the characteristics of attributes 
-  are not known, the code involved in accessing and processing 
-  the attribute can be quite complex. For this reason, HDF5 
-  includes a function called <code>H5Aiterate</code>. This function 
-  applies a user-supplied function to each of a set of attributes. 
-  The user-supplied function can contain the code that 
-  interprets, accesses, and processes each attribute.</p> 
-
-<!-- NEW PAGE -->
-<a name="IOPipeline">
-<h3>2.3. The Data Transfer Pipeline</h3>
-</a>
-  
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  This section needs to be reviewed in detail by QAK and others.
-  ] ] ]<
-  br><br />
-  [ [ [
-  There probably should be a whole chapter on data transfer, 
-  selection, transformation, etc.}</em>
-  ] ] ]</span>
--->
-
-  <p>The HDF5 Library implements data transfers between 
-  different storage locations. At the lowest levels, the 
-  HDF5 Library reads and writes blocks of bytes to and from 
-  storage using calls to the virtual file layer (VFL) drivers. 
-  In addition to this, the HDF5 Library manages caches of metadata 
-  and a data I/O pipeline. The data I/O pipeline applies compression 
-  to data blocks, transforms data elements, and implements selections.  </p>
-  
-  <p>A substantial portion of the HDF5 Library’s work is in 
-  transferring data from one environment or media to another. This 
-  most often involves a transfer between system memory and a storage 
-  medium. Data transfers are affected by compression, encryption, 
-  machine-dependent differences in numerical representation, and other 
-  features. So, the bit-by-bit arrangement of a given dataset is 
-  often substantially different in the two environments.</p>
-  
-  <p>Consider the representation on disk of a compressed and 
-  encrypted little-endian array as compared to the same array 
-  after it has been read from disk, decrypted, decompressed, and loaded 
-  into memory on a big-endian system. HDF5 performs all of the 
-  operations necessary to make that transition during the I/O 
-  process with many of the operations being handled by the VFL 
-  and the data transfer pipeline.</p>
-  
-  <p>The figure below <!-- formerly Figure 26 -->provides a simplified 
-  view of a sample data transfer with four stages. Note that the 
-  modules are used only when needed. For example, if the data is 
-  not compressed, the compression stage is omitted.</p>
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Pmodel_fig26.JPG" height="75%" width="95%">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 4. A data transfer from storage to memory</b>
-        <!-- formerly Figure 26-->
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-  <p>For a given I/O request, different combinations of 
-  actions may be performed by the pipeline. The library 
-  automatically sets up the pipeline and passes data through 
-  the processing steps. For example, for a <em>read</em> request 
-  (from disk to memory), the library must determine which 
-  logical blocks contain the requested data elements and fetch 
-  each block into the library’s cache. If the data needs to be 
-  decompressed, then the compression algorithm is applied to 
-  the block after it is read from disk. If the data is a selection, 
-  the selected elements are extracted from the data block after it 
-  is decompressed. If the data needs to be transformed (for example, 
-  byte swapped), then the data elements are transformed after 
-  decompression and selection.</p>
-  
-  <p>While an application must sometimes set up some elements 
-  of the pipeline, use of the pipeline is normally transparent to 
-  the user program. The library determines what must be done 
-  based on the metadata for the file, the object, and the 
-  specific request. An example of when an application might be required 
-  to set up some elements in the pipeline is if the application used 
-  a custom error-checking algorithm. </p>
-<!-- editingComment
-  <span class="editingComment">
-  For more details of the pipeline, see [citeit].</p>
-  </span>
--->
-  
-  <p>In some cases, it is necessary to pass parameters to 
-  and from modules in the pipeline or among other parts 
-  of the library that are not directly called through the 
-  programming API. This is accomplished through the use of 
-  dataset transfer and data access property lists. </p>
-  
-  <p>The VFL provides an interface whereby user applications 
-  can add custom modules to the data transfer pipeline. For example, 
-  a custom compression algorithm can be used with the HDF5 Library 
-  by linking an appropriate module into the pipeline through the 
-  VFL. This requires creating an appropriate wrapper for the 
-  compression module 
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  [cite filter doc and ref manual] 
-  ] ] ]</span>
--->
-  and registering it with the library with <code>H5Zregister</code>.
-  The algorithm can then be applied to a dataset with an 
-  <code>H5Pset_filter</code> call which will add the algorithm to the 
-  selected dataset’s transfer property list.</p>
-  
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<div align="right">
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<br /><br /><br />
-<br /><br /><br />
-
-
-</body>
-</html>
diff --git a/html/UG/OldHtmlSource/08_TheFile.html b/html/UG/OldHtmlSource/08_TheFile.html
deleted file mode 100755
index 7ebdfda..0000000
--- a/html/UG/OldHtmlSource/08_TheFile.html
+++ /dev/null
@@ -1,3068 +0,0 @@
-<!doctype HTML public "-//W3C//DTD HTML 4.0 Frameset//EN">
-<html>
-<head>
-<title>Chapter 3: The HDF5 File</title>
-
-<!--(Meta)==========================================================-->
-
-
-<!--(Links)=========================================================-->
-
-<!--( Begin styles definition )=====================================-->
-<link href="ed_styles/NewUGelect.css" rel="stylesheet" type="text/css">
-<!--( End styles definition )=======================================-->
-
-</head>
-
-<body>
-
-<!-- #BeginLibraryItem "/ed_libs/styles_UG.lbi" -->
-<!--
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-  * Copyright by The HDF Group.                                               *
-  * Copyright by the Board of Trustees of the University of Illinois.         *
-  * All rights reserved.                                                      *
-  *                                                                           *
-  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
-  * terms governing use, modification, and redistribution, is contained in    *
-  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
-  * of the source code distribution tree; Copyright.html can be found at the  *
-  * root level of an installed copy of the electronic HDF5 document set and   *
-  * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-  * access to either file, you may request a copy from help at hdfgroup.org.     *
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- -->
-<!-- #EndLibraryItem --><!-- HEADER LEFT "HDF5 User's Guide" -->
-<!-- HEADER RIGHT "The HDF5 File" -->
-
-<!--( TOC )=========================================================-->
-<!--<SCRIPT language="JavaScript">                                  -->
-<!--
-document.writeln ('\
-<table x-use-null-cells\
-                align="right"\
-		width="240"\
-		cellspacing="0"\
-		class="tocTable">\
-  <tr valign="top"> \
-    <td class="tocTableHeaderCell" colspan="2"> \
-        <span class="TableHead">Chapter Contents</span></td>\
-  </tr>\
--->
-<!-- Table Version 3 --><!--\-->
-<!--
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Intro">1.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Intro">Introduction</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#PModel">2.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#PModel">Programming Model</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#H5Dump">3.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#H5Dump">Using <code>h5dump</code></a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#FuncSumms">4.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#FuncSumms">File Function Summaries</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#CrOpen">5.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#CrOpen">Create or Open a File</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Close">6.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Close">Close a File</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#PLists">7.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#PLists">File Property Lists</a>\
-\
-<br />\
-   \
-Creating a list\
-\
-<br />\
-   \
-Creation properties\
-\
-<br />\
-   \
-Access properties\
-\
-	  </td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Drivers">8.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Drivers">Storage Layouts and Drivers</a>\
-\
-<br />\
-   \
-<span class="smallcaps">SEC2</span>, \
-<span class="smallcaps">STDIO</span>,\
-<br />\
-   \
-<span class="smallcaps">FAMILY</span>, \
-<span class="smallcaps">MULTI</span>,\
-<br />\
-   \
-<span class="smallcaps">SPLIT</span>, \
-<span class="smallcaps">MPI</span>, \
-<span class="smallcaps">CORE</span>,\
-<br />\
-   \
---><!--<span class=code>STREAM</span>, --><!--\
-<span class="smallcaps">LOG</span>\
-\
-	  </td>\
-  </tr>\
-\
-  <tr valign="top"> \
-    <td class="tocTableContentCell"> \
--->
-<!-- editingComment -- "tocTableContentCell" and "tocTableContentCell4" \
---><!--\-->
-<!-- are the table-closing cell class.\
-    <td class="tocTableContentCell2"> \
---><!--\
-      <a href="#Examples">9.</a></td>\
-    <td class="tocTableContentCell4">\
-	  <a href="#Examples">Code Examples</a>\
-  </td></tr>\
-</table>\
-')
--->
-<!-- </SCRIPT> -->
-<!--(End TOC)=======================================================-->
-
-<!-- editingComment
--->
-
-
-<div align="center">
-<a name="TOP">
-<h2>Chapter 3<br /><font size="7">The HDF5 File</font></h2>
-</a>
-</div>
-
-
-<a name="Intro">
-<h3>3.1. Introduction</h3>
-</a>
-<p>The purpose of this chapter is to describe how to work with HDF5 data 
-files. </p>
-
-<p>If HDF5 data is to be written to or read from a file, the file must 
- first be explicitly created or opened with the appropriate file driver 
- and access privileges. Once all work with the file is complete, the file 
- must be explicitly closed. </p>
-
-<p>This chapter discusses the following:</p>
-
-<ul>
-	
-	<li>File access modes</li>
-	<li>Creating, opening, and closing files</li>
-	<li>The use of file creation property lists</li>
-	<li>The use of file access property lists</li>
-        <li>The use of low-level file drivers</li>
-</ul>
-
- <p>This chapter assumes an understanding of the material presented 
- in the data model chapter, “<a href="03_DataModel.html">HDF5 
- Data Model and File Structure</a>.”</p>
-
-<h4>3.1.1. <a name="FileAccessModes">File Access Modes</a></h4> 
-
-
-<p>There are two issues regarding file access:</p>
-  <ul>
-      <li>What should happen when a new file is created but a file
-          of the same name already exists?  Should the create action
-          fail, or should the existing file be overwritten?</li>
-      <li>Is a file to be opened with read-only or read-write access?</li>
-  </ul>
-
-<p>Four access modes address these concerns. Two of these modes can 
-be used with <code>H5Fcreate</code>, and two modes can be used with 
-<code>H5Fopen</code>.</p>
-    <ul>
-	<li><code>H5Fcreate</code> accepts <code>H5F_ACC_EXCL</code> or 
-        <code>H5F_ACC_TRUNC</code> </li>
-	<li><code>H5Fopen</code> accepts <code>H5F_ACC_RDONLY</code> 
-            or <code>H5F_ACC_RDWR</code></li>
-    </ul>
-<p>The access modes are described in the table below.</p>
-
-<!-- NEW PAGE -->
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 1. Access flags and modes</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="25%"> 
-        <b>Access Flag</b></td>
-        <td width="75%"> 
-        <b>Resulting Access Mode</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5F_ACC_EXCL</code></td>
-        <td>
-        If the file already exists, <code>H5Fcreate</code> fails.  
-        If the file does not exist, it is created and opened with 
-        read-write access. <i>(Default)</i></td></tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5F_ACC_TRUNC</code></td>
-        <td>
-        If the file already exists, the file is opened with read-write access, 
-        and new data will overwrite any existing data. If the file does not 
-        exist, it is created and opened with read-write access.</td></tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5F_ACC_RDONLY</code></td>
-        <td>
-        An existing file is opened with read-only access.  
-        If the file does not exist, <code>H5Fopen</code> fails.
-        <i>(Default)</i></td></tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5F_ACC_RDWR</code></td>
-        <td>
-        An existing file is opened with read-write access.  
-        If the file does not exist, <code>H5Fopen</code> fails.</td></tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-
-<p>By default, <code>H5Fopen</code> opens a file for read-only access; 
- passing <code>H5F_ACC_RDWR</code> allows read-write access to the file. </p>
-
-<p>By default, <code>H5Fcreate</code> fails if the file already exists; 
- only passing <code>H5F_ACC_TRUNC</code> allows the truncating of an 
- existing file.</p>
-
-
-<h4>3.1.2. File Creation and File Access Properties</h4>
-
- <p>File creation and file access property lists control the 
-    more complex aspects of creating and accessing files.  </p>
-
-<p><span class="termDefinition">File creation property lists</span> 
-    control the characteristics of a file such as 
-    the size of the user-block, a user-definable data block;
-    the size of data address parameters; properties of the B-trees 
-    that are used to manage the data in the file; and certain 
-    HDF5 library versioning information. </p>
-
- <p>See the <a href="#FileCreationProperties">“File Creation 
-    Properties,”</a> section below, for a more detailed discussion 
-    of file creation properties and appropriate references to the 
-    <a href="../RM/RM_H5Front.html"> 
-    <cite>HDF5 Reference Manual</cite></a>.
-    If you have no special requirements for these file characteristics, 
-    you can simply specify <code>H5P_DEFAULT</code> for the default 
-    file creation property list when a file creation property list 
-    is called for.</p>
-
-<p><span class="termDefinition">File access property lists</span> 
-    control properties and means of accessing a file such as 
-    data alignment characteristics, metadata block and cache sizes,
-    data sieve buffer size, garbage collection settings, and 
-    parallel I/O. Data alignment, metadata block and cache sizes, 
-    and data sieve buffer size are factors in improving I/O performance.</p>
-
-    <p>See the <a href="#FileAccessProperties">“File Access 
-    Properties”</a> section below for a more detailed discussion of 
-    file access properties and appropriate references to the 
-    <cite>HDF5 Reference Manual</cite>. If you have no special 
-    requirements for these file access characteristics, you can simply 
-    specify <code>H5P_DEFAULT</code> for the default file access 
-    property list when a file access property list is called for.</p>
-
-<!--(UML Model Box)=================================================-->
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/UML_FileAndProps.gif">
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 1. UML model for an HDF5 file and its property lists</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<h4>3.1.3. Low-level File Drivers</h4>
-
-<p>The concept of an HDF5 file is actually rather abstract: 
- the address space for what is normally thought of as an HDF5 file
- might correspond to any of the following at the storage level:</p>
- <ul>
-     <li>Single file on a standard file system</li>
-     <li>Multiple files on a standard file system</li>
-     <li>Multiple files on a parallel file system</li>
-     <li>Block of memory within an application’s memory space</li>
-     <li>More abstract situations such as virtual files</li>
- </ul>
- <p>This HDF5 address space is generally referred to as an <em>HDF5 file</em> 
-    regardless of its organization at the storage level. </p>
-
- <p>HDF5 accesses a file (the address space) through various types of 
-    <em>low-level file drivers</em>. The default HDF5 file storage 
-    layout is as an unbuffered permanent file which is a single, 
-    contiguous file on local disk. Alternative layouts are designed to 
-    suit the needs of a variety of systems, environments, and applications.</p>
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="PModel">
-<div align="right">
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<!-- NEW PAGE -->
-<a name="PModel">
-<h3 class="pagebefore">3.2. Programming Model</h3>
-</a>
-    <p>Programming models for creating, opening, and closing HDF5 files 
-    are described in the sub-sections below.</p>
-    
-<h4>3.2.1. Creating a New File</h4>
-
-<p>The programming model for creating 
- a new HDF5 file can be summarized as follows:</p>
-
-<ul>
-	<li>Define the file creation property list</li>
-	<li>Define the file access property list</li>
-	<li>Create the file</li>
-</ul>
-
-<p>First, consider the simple case where we use the default 
-values for the property lists. See the example below.</p>
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  file_id = H5Fcreate ("SampleFile.h5", H5F_ACC_EXCL,
-      H5P_DEFAULT, H5P_DEFAULT)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 1. Creating an HDF5 file using property list defaults</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
- <p>Note that this example specifies that <code>H5Fcreate</code> should fail 
- if <code>SampleFile.h5</code> already exists.</p>
-
-    <p>A more complex case is shown in the example below. In this example, 
-    we define file creation and access property lists (though we do not 
-    assign any properties), specify that <code>H5Fcreate</code> should 
-    fail if <code>SampleFile.h5</code> already exists, and create a 
-    new file named <code>SampleFile.h5</code>. The example does not 
-    specify a driver, so the default driver, 
-    <code>H5FD_SEC2</code>, will be used.</p>
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  fcplist_id = H5Pcreate (H5P_FILE_CREATE)
-    <...<em>set desired file creation properties</em>...>
-  faplist_id = H5Pcreate (H5P_FILE_ACCESS)
-    <...<em>set desired file access properties</em>...>
-  file_id = H5Fcreate ("SampleFile.h5", H5F_ACC_EXCL, fcplist_id, faplist_id)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 2. Creating an HDF5 file using property lists</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-    <p>Notes: </p>
-    <p>A root group is automatically created in a file when the file 
-    is first created.</p>
-    <p>File property lists, once defined, can be reused when another 
-    file is created within the same application.</p>
-
-
-<h4>3.2.2. Opening an Existing File</h4>
-
-<p>The programming model for opening an existing HDF5 file can be summarized 
- as follows:</p>
-
-<ul>
-	<li>Define or modify the file access property list 
-            including a low-level file driver (optional)</li>
-	<li>Open the file</li>
-</ul>
-
-
-    <p>The code in the example below shows how to open an existing file with
-    read-only access.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  faplist_id = H5Pcreate (H5P_FILE_ACCESS)
-  status = H5Pset_fapl_stdio (faplist_id)
-  file_id = H5Fopen ("SampleFile.h5", H5F_ACC_RDONLY, faplist_id)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 3. Opening an HDF5 file</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<h4>3.2.3. Closing a File</h4>
-
-<p>The programming model for closing an HDF5 file is very simple:</p>
-
-<ul>
-    <li>Close file</li>
-</ul>
-
-<p>We close <code>SampleFile.h5</code> with the code in the example below.</p>
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  status = H5Fclose (file_id)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 4. Closing an HDF5 file</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<p>Note that <code>H5Fclose</code> flushes all unwritten data to storage and 
-that <code>file_id</code> is the identifier returned for 
-<code>SampleFile.h5</code> by <code>H5Fopen</code>.</p>
-
-<p>More comprehensive discussions regarding all of these steps 
-   are provided below.</p>
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="H5Dump">
-<div align="right">
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<!-- NEW PAGE -->
-<a name="H5Dump">
-<h3 class="pagebefore">3.3. Using <code>h5dump</code> to View a File</h3>
-</a>
-
-<p><code>h5dump</code> is a command-line utility that is included in 
-the HDF5 distribution. This program provides a straight-forward means of 
-inspecting the contents of an HDF5 file. You can use <code>h5dump</code>
-to verify that a program is generating the intended HDF5 file. 
-<code>h5dump</code> displays ASCII output formatted according to the 
-HDF5 DDL grammar.</p>
-
-<p>The following <code>h5dump</code> command will display the 
-contents of <code>SampleFile.h5</code>:</p>
-
-<pre>
-    h5dump SampleFile.h5 
-</pre>
-
-<p>If no datasets or groups have been created in and 
-no data has been written to the file, 
-the output will look something like the following:</p>
-
-<pre>
-    HDF5 "SampleFile.h5" {
-    GROUP "/" {
-    }
-    }
-</pre>
-
-<p>Note that the root group, indicated above by <code>/</code>, 
- was automatically created when the file was created.</p>
-
-<p><code>h5dump</code> is fully described on the 
- <a href="../RM/Tools.html" target="RMwindow">Tools</a> page of the 
- <a href="../RM/RM_H5Front.html" target="RMwindow">
- <cite>HDF5 Reference Manual</cite></a>.
- The HDF5 DDL grammar is fully described in the document
- <a href="../ddl.html" target="RMwindow">DDL in BNF for HDF5</a>,
- an element of this <cite>HDF5 User’s Guide</cite>.</p>
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="FuncSumms">
-<div align="right">
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<!-- NEW PAGE -->
-<a name="FuncSumms">
-<h3 class="pagebefore">3.4. File Function Summaries</h3>
-</a>
-<p>General library functions and macros (H5), file functions (H5F), file 
-   related property list functions (H5P), and file driver functions (H5P) 
-   are listed below.</p>
-
-   
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 1. General library functions and macros (H5)
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b></td><td> </td>
-        <td>
-        <b>Purpose</b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5check_version</code>
-        <br />
-        <code>h5check_version_f</code></td><td> </td>
-        <td>
-        Verifies that HDF5 library versions are consistent.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5close</code>
-        <br />
-        <code>h5close_f</code></td><td> </td>
-        <td>
-        Flushes all data to disk, closes all open identifiers, and cleans up 
-        memory.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5dont_atexit</code>
-        <br />
-        <code>h5dont_atexit_f</code></td><td> </td>
-        <td>
-        Instructs the library not to install the <code>atexit</code> cleanup 
-        routine. </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5garbage_collect</code>
-        <br />
-        <code>h5garbage_collect_f</code></td><td> </td>
-        <td>
-        Garbage collects on all free-lists of all types. </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5get_libversion</code>
-        <br />
-        <code>h5get_libversion_f</code></td><td> </td>
-        <td>
-        Returns the HDF library release number.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5open</code>
-        <br />
-        <code>h5open_f</code></td><td> </td>
-        <td>
-        Initializes the HDF5 library.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5set_free_list_limits</code>
-        <br />
-        <code>h5set_free_list_limits_f</code></td><td> </td>
-        <td>
-        Sets free-list size limits.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5_VERSION_GE</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Determines whether the version of the library being used is greater 
-        than or equal to the specified version.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5_VERSION_LE</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Determines whether the version of the library being used is less than 
-        or equal to the specified version.</td>
-        </tr>
-        <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br /><br />
-   
-   
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 2. File functions (H5F)
-        </b></td></tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b></td><td> </td>
-        <td>
-        <b>Purpose</b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fclear_elink_file_cache</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Clears the external link open file cache for a file. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fclose</code>
-        <br />
-        <code>h5fclose_f</code></td><td> </td>
-        <td>
-        Closes HDF5 file.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fcreate</code>
-        <br />
-        <code>h5fcreate_f</code></td><td> </td>
-        <td>
-        Creates new HDF5 file.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fflush</code>
-        <br />
-        <code>h5fflush_f</code></td><td> </td>
-        <td>
-        Flushes data to HDF5 file on storage medium.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fget_access_plist</code>
-        <br />
-        <code>h5fget_access_plist_f</code></td><td> </td>
-        <td>
-        Returns a file access property list identifier.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fget_create_plist</code>
-        <br />
-        <code>h5fget_create_plist_f</code></td><td> </td>
-        <td>
-        Returns a file creation property list identifier.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fget_file_image</code>
-        <br />
-        <code>h5fget_file_image_f</code></td><td> </td>
-        <td>
-        Retrieves a copy of the image of an existing, open file. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fget_filesize</code>
-        <br />
-        <code>h5fget_filesize_f</code></td><td> </td>
-        <td>
-        Returns the size of an HDF5 file.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fget_freespace</code>
-        <br />
-        <code>h5fget_freespace_f</code></td><td> </td>
-        <td>
-        Returns the amount of free space in a file.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fget_info</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Returns global information for a file.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fget_intent</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Determines the read/write or read-only status of a file.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fget_mdc_config</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Obtain current metadata cache configuration for target file.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fget_mdc_hit_rate</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Obtain target file’s metadata cache hit rate.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fget_mdc_size</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Obtain current metadata cache size data for specified file.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fget_mpi_atomicity</code>
-        <br />
-        <code>h5fget_mpi_atomicity_f</code></td><td> </td>
-        <td>
-        Retrieves the atomicity mode in use. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fget_name</code>
-        <br />
-        <code>h5fget_name_f</code></td><td> </td>
-        <td>
-        Retrieves the name of the file to which the object belongs.
-        </td>
-        </tr>
-    <!-- NEW PAGE -->
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fget_obj_count</code>
-        <br />
-        <code>h5fget_obj_count_f</code></td><td> </td>
-        <td>
-        Returns the number of open object identifiers for an open file.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fget_obj_ids</code>
-        <br />
-        <code>h5fget_obj_ids_f</code></td><td> </td>
-        <td>
-        Returns a list of open object identifiers.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fget_vfd_handle</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Returns pointer to the file handle from the virtual file driver.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fis_hdf5</code>
-        <br />
-        <code>h5fis_hdf5_f</code></td><td> </td>
-        <td>
-        Determines whether a file is in the HDF5 format.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fmount</code>
-        <br />
-        <code>h5fmount_f</code></td><td> </td>
-        <td>
-        Mounts a file.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fopen</code>
-        <br />
-        <code>h5fopen_f</code></td><td> </td>
-        <td>
-        Opens existing HDF5 file.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Freopen</code>
-        <br />
-        <code>h5freopen_f</code></td><td> </td>
-        <td>
-        Returns a new identifier for a previously-opened HDF5 file.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Freset_mdc_hit_rate_stats</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Reset hit rate statistics counters for the target file. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fset_mdc_config</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Use to configure metadata cache of target file. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fset_mpi_atomicity</code>
-        <br />
-        <code>h5fset_mpi_atomicity_f</code></td><td> </td>
-        <td>
-        Use to set the MPI atomicity mode. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Funmount</code>
-        <br />
-        <code>h5funmount_f</code></td><td> </td>
-        <td>
-        Unmounts a file.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br /><br />
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 3. File creation property list functions (H5P)
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top">
-        <td>
-        <b>C Function<br />Fortran Function</b></td><td> </td>
-        <td>
-        <b>Purpose</b></td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset/get_userblock</code>
-        <br />
-        <code>h5pset/get_userblock_f</code></td><td> </td>
-        <td>
-        Sets/retrieves size of user-block.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset/get_sizes</code>
-        <br />
-        <code>h5pset/get_sizes_f</code></td><td> </td>
-        <td>
-        Sets/retrieves byte size of offsets and lengths used to 
-        address objects in HDF5 file.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset/get_sym_k</code>
-        <br />
-        <code>h5pset/get_sym_k_f</code></td><td> </td>
-        <td>
-        Sets/retrieves size of parameters used to control 
-        symbol table nodes.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset/get_istore_k</code>
-        <br />
-        <code>h5pset/get_istore_k_f</code></td><td> </td>
-        <td>
-        Sets/retrieves size of parameter used to control B-trees 
-        for indexing chunked datasets.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_file_image</code>
-        <br />
-        <code>h5pget_file_image_f</code></td><td> </td>
-        <td>
-        Retrieves a copy of the file image designated as the initial 
-        content and structure of a file. </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_file_image</code>
-        <br />
-        <code>h5pset_file_image_f</code></td><td> </td>
-        <td>
-        Sets an initial file image in a memory buffer. </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_shared_mesg_nindexes</code>
-        <br />
-        <code>h5pset_shared_mesg_nindexes_f</code></td><td> </td>
-        <td>
-        Sets number of shared object header message indexes. </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_shared_mesg_nindexes</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Retrieves number of shared object header message indexes in 
-        file creation property list. </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_shared_mesg_index</code>
-        <br />
-        <code>h5pset_shared_mesg_index_f</code></td><td> </td>
-        <td>
-        Configures the specified shared object header message index.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_shared_mesg_index</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Retrieves the configuration settings for a shared message index. 
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_shared_mesg_phase_change</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Sets shared object header message storage phase change thresholds. 
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_shared_mesg_phase_change</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Retrieves shared object header message phase change information. 
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_version</code>
-        <br />
-        <code>h5pget_version_f</code></td><td> </td>
-        <td>
-        Retrieves version information for various objects for 
-        file creation property list.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br /><br />
-
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 4. File access property list functions (H5P)
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset/get_alignment</code>
-        <br />
-        <code>h5pset/get_alignment_f</code></td><td> </td>
-        <td>
-        Sets/retrieves alignment properties.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset/get_cache</code>
-        <br />
-        <code>h5pset/get_cache_f</code></td><td> </td>
-        <td>
-        Sets/retrieves metadata cache and raw data chunk cache 
-        parameters.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset/get_elink_file_cache_size</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Sets/retrieves the size of the external link open file cache 
-        from the specified file access property list. </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset/get_fclose_degree</code>
-        <br />
-        <code>h5pset/get_fclose_degree_f</code></td><td> </td>
-        <td>
-        Sets/retrieves file close degree property.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset/get_gc_references</code>
-        <br />
-        <code>h5pset/get_gc_references_f</code></td><td> </td>
-        <td>
-        Sets/retrieves garbage collecting references flag.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_family_offset</code>
-        <br />
-        <code>h5pset_family_offset_f</code></td><td> </td>
-        <td>
-        Sets offset property for low-level access to a file in a family of 
-        files.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_family_offset</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Retrieves a data offset from the file access property list.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset/get_meta_block_size</code>
-        <br />
-        <code>h5pset/get_meta_block_size_f</code></td><td> </td>
-        <td>
-        Sets the minimum metadata block size or 
-        retrieves the current metadata block size setting.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_mdc_config</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Set the initial metadata cache configuration in the indicated 
-        File Access Property List to the supplied value.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_mdc_config</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Get the current initial metadata cache configuration from the 
-        indicated File Access Property List.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset/get_sieve_buf_size</code>
-        <br />
-        <code>h5pset/get_sieve_buf_size_f</code></td><td> </td>
-        <td>
-        Sets/retrieves maximum size of data sieve buffer.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_libver_bounds</code>
-        <br />
-        <code>h5pset_libver_bounds_f</code></td><td> </td>
-        <td>
-        Sets bounds on library versions, and indirectly format versions, 
-        to be used when creating objects.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_libver_bounds</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Retrieves library version bounds settings that indirectly control 
-        the format versions used when creating objects.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_small_data_block_size</code>
-        <br />
-        <code>h5pset_small_data_block_size_f</code></td><td> </td>
-        <td>
-        Sets the size of a contiguous block reserved for small data.</td>
-        </tr>
-    <!-- NEW PAGE -->
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_small_data_block_size</code>
-        <br />
-        <code>h5pget_small_data_block_size_f</code></td><td> </td>
-        <td>
-        Retrieves the current small data block size setting.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br /><br />
-
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 5. File driver functions (H5P)
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_driver</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Sets a file driver.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_driver</code>
-        <br />
-        <code>h5pget_driver_f</code></td><td> </td>
-        <td>
-        Returns the identifier for the driver used to create a file.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_driver_info</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Returns a pointer to file driver information.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset/get_fapl_core</code>
-        <br />
-        <code>h5pset/get_fapl_core_f</td><td> </td>
-        <td>
-        Sets driver for buffered memory files (i.e., in RAM) 
-        or retrieves information regarding driver.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_fapl_direct</code>
-        <br />
-        <code>h5pset_fapl_direct_f</td><td> </td>
-        <td>
-        Sets up use of the direct I/O driver.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_fapl_direct</code>
-        <br />
-        <code>h5pget_fapl_direct_f</td><td> </td>
-        <td>
-        Retrieves direct I/O driver settings.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset/get_fapl_family</code>
-        <br />
-        <code>h5pset/get_fapl_family_f</code></td><td> </td>
-        <td>
-        Sets driver for file families, 
-        designed for systems that do not support files larger than 2 gigabytes,
-        or retrieves information regarding driver.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_fapl_log</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Sets logging driver.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset/get_fapl_mpio</code>
-        <br />
-        <code>h5pset/get_fapl_mpio_f</code></td><td> </td>
-        <td>
-        Sets driver for files on parallel file systems (MPI I/O)
-        or retrieves information regarding the driver.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_fapl_mpiposix</code>
-        <br />
-        <code>h5pset_fapl_mpiposix_f</code></td><td> </td>
-        <td>
-        No longer available.
-        </td>
-        <!-- vfd no longer available. 3.28.2014.
-        <td>
-        Stores MPI IO communicator information to a file access property list.
-        </td>
-        -->
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_fapl_mpiposix</code>
-        <br />
-        <code>h5pget_fapl_mpiposix_f</code></td><td> </td>
-        <td>
-        No longer available.
-        </td>
-        <!-- vfd no longer available. 3.28.2014.
-        <td>
-        Returns MPI communicator information.
-        </td>
-        -->
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset/get_fapl_multi</code>
-        <br />
-        <code>h5pset/get_fapl_multi_f</code></td><td> </td>
-        <td>
-        Sets driver for multiple files, 
-        separating categories of metadata and raw data,
-        or retrieves information regarding driver.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_fapl_sec2</code>
-        <br />
-        <code>h5pset_fapl_sec2_f</code></td><td> </td>
-        <td>
-        Sets driver for unbuffered permanent files or retrieves information 
-        regarding driver.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_fapl_split</code>
-        <br />
-        <code>h5pset_fapl_split_f</code></td><td> </td>
-        <td>
-        Sets driver for split files, a limited case of multiple files
-        with one metadata file and one raw data file.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_fapl_stdio</code>
-        <br />
-        <code>H5Pset_fapl_stdio_f</code></td><td> </td>
-        <td>
-        Sets driver for buffered permanent files.</td></tr>
-<!--
-<tr valign="top">
-<td colspan="1"
-	rowspan="1"
-	style="padding-right: 10px; padding-left: 10px;
-                        border-bottom-width: 1px;
-                        border-bottom-color: #008000;
-                        border-bottom-style: Solid;"
-	width="23.025%">
-<code>H5Pset/get_fapl_stream</code>
-   <br />
-   (none)</td>
-<td colspan="1"
-	rowspan="1"
-	style="padding-right: 10px; padding-left: 10px;
-                        border-bottom-width: 1px;
-                        border-bottom-color: #008000;
-                        border-bottom-style: Solid;"
-	width="76.975%">
-Sets driver for streaming data (i.e., no stored file)
- or retrieves information regarding driver.</td></tr>
--->
-
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_fapl_windows</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Sets the Windows I/O driver.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_multi_type</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Specifies type of data to be accessed via the MULTI driver 
-        enabling more direct access.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_multi_type</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Retrieves type of data property for MULTI driver.</td></tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="CrOpen">
-<div align="right">
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<!-- NEW PAGE -->
-<a name="CrOpen">
-<h3 class="pagebefore">3.5. Creating or Opening an HDF5 File</h3>
-</a>
-
-<!-- editingComment
-  <span class="editingComment">
-  [ [ [ Link each function in 8.5 through 8.8 to its RM entry. ] ] ]
-  </span>
--->
-<p>This section describes in more detail how to create and how to open 
-files. </p>
-
-<p>New HDF5 files are created and opened with <code>H5Fcreate</code>; 
- existing files are opened with <code>H5Fopen</code>. 
- Both functions return an object identifier which must eventually 
- be released by calling <code>H5Fclose</code>.</p>
-
-<dl>
- <dt><span class="RunningHead">To create a new file</span>, call 
- <code>H5Fcreate</code>:
-
- <dd>
-            
-    <code>hid_t H5Fcreate (const char *<em>name</em>, 
-          unsigned <em>flags</em>, 
-          <br />
-                  
-          hid_t <em>fcpl_id</em>, 
-          hid_t <em>fapl_id</em>)</code>
-</dl>
-
-<p><code>H5Fcreate</code> creates a new file named <code><em>name</em></code> 
- in the current directory. 
- The file is opened with read and write access; 
- if the <code>H5F_ACC_TRUNC</code> flag is set, any pre-existing file 
- of the same name in the same directory is truncated.
- If <code>H5F_ACC_TRUNC</code> is not set or
- <code>H5F_ACC_EXCL</code> is set and if a file of the same name exists,
- <code>H5Fcreate</code> will fail. </p>
-
-<p>The new file is created with the properties specified in the property 
- lists <code><em>fcpl_id</em></code> and <code><em>fapl_id</em></code>. 
- <code>fcpl</code> is short for file creation property list. 
- <code>fapl</code> is short for file access property list. Specifying 
- <code>H5P_DEFAULT</code> for either the creation or access property 
- list calls for the library’s default creation or access properties.
- See “<a href="#PLists">File Property Lists</a>” below 
- for details on setting property list values. 
- See “<a href="#FileAccessModes">File Access Modes</a>” 
- above for the list of file access flags and their descriptions.</p>
- 
-<p>If <code>H5Fcreate</code> successfully creates the file, 
- it returns a file identifier for the new file. This identifier will be 
- used by the application any time an object identifier, an OID, for the 
- file is required. Once the application has finished working with a file, 
- the identifier should be released and the file closed with 
- <code>H5Fclose</code>. </p>
-
-
-<dl>
-  <dt><span class="RunningHead">To open an existing file</span>, 
-      call <code>H5Fopen</code>:
-
-  <dd>
-            
-    <code>hid_t H5Fopen (const char *<em>name</em>, unsigned <em>flags</em>, 
-          hid_t <em>fapl_id</em>) </code>
-</dl>
-
-<p><code>H5Fopen</code> opens an existing file with 
- read-write access if <code>H5F_ACC_RDWR</code> is set and 
- read-only access if <code>H5F_ACC_RDONLY</code> is set. </p>
-
-<p><em>fapl_id</em> is the file access property list identifier.
- Alternatively, <code>H5P_DEFAULT</code> indicates that the application
- relies on the default I/O access parameters. 
- Creating and changing access property lists is documented further below. </p>
-
-<p>A file can be opened more than once via multiple <code>H5Fopen</code> 
- calls. Each such call returns a unique file identifier and the file can 
- be accessed through any of these file identifiers as long as they remain 
- valid. Each of these file identifiers must be released by calling 
- <code>H5Fclose</code> when it is no longer needed. </p>
- 
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="Close">
-<div align="right">
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<!-- NEW PAGE -->
-<a name="Close">
-<h3 class="pagebefore">3.6. Closing an HDF5 File</h3>
-</a>
-
-<p><code>H5Fclose</code> both closes a file and releases the 
- file identifier returned by <code>H5Fopen</code> or <code>H5Fcreate</code>. 
- <code>H5Fclose</code> must be called when an application 
- is done working with a file; 
- while the HDF5 Library makes every effort to maintain file integrity,
- failure to call <code>H5Fclose</code> may result in the file 
- being abandoned in an incomplete or corrupted state. </p>
-
-<dl>
-  <dt><span class="RunningHead">To close a file</span>, 
-      call <code>H5Fclose</code>:
-
-  <dd>
-            
-    <code>herr_t H5Fclose (hid_t <em>file_id</em>)</code>
-</dl>
-
-<p>This function releases resources associated with an open file.
- After closing a file, the file identifier, 
- <code><em>file_id</em></code>, cannnot be used again 
- as it will be undefined.</p>
-
-<p><code>H5Fclose</code> fulfills three purposes: 
- to ensure that the file is left in an uncorrupted state, 
- to ensure that all data has been written to the file, 
- and to release resources.   Use 
- <a href="../RM/RM_H5F.html#File-Flush" target="RMwindow">
- <code>H5Fflush</code></a> if you wish to ensure that all data has 
- been written to the file but it is premature to close it.</p>
-
-<p><em>Note regarding serial mode behavior:</em>
- When <code>H5Fclose</code> is called in serial mode, 
- it closes the file and terminates new access to it, 
- but it does not terminate access to objects that remain 
- individually open within the file.  
- That is, if <code>H5Fclose</code> is called for a file but one or 
- more objects within the file remain open, those objects will remain 
- accessible until they are individually closed.  
- To illustrate, assume that a file, <code>fileA</code>, contains 
- a dataset, <code>data_setA</code>, and that both are open when 
- <code>H5Fclose</code> is called for <code>fileA</code>. 
- <code>data_setA</code> will remain open and accessible, 
- including writable, until it is explicitly closed.  
- The file will be automatically and finally closed once all objects within 
- it have been closed.</p>
-
-<p><em>Note regarding parallel mode behavior:</em>
- Once <code>H5Fclose</code> has been called in parallel mode,
- access is no longer available to any object within the file.</p>
-
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="PLists">
-<div align="right">
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<!-- NEW PAGE -->
-<a name="PLists">
-<h3 class="pagebefore">3.7. File Property Lists</h3>
-</a>
-
-<p>Additional information regarding file structure and access 
- are passed to <code>H5Fcreate</code> and <code>H5Fopen</code> 
- through property list objects.
- Property lists provide a portable and extensible method of 
- modifying file properties via simple API functions. 
- There are two kinds of file-related property lists: </p>
- <ul>
-    <li>File creation property lists
-    <li>File access property lists
- </ul>
-
-<p>
- In the following sub-sections, we discuss only one file creation property, 
- user-block size, in detail as a model for the user.  
- Other file creation and file access properties are mentioned and 
- defined briefly, but the model is not expanded for each; 
- complete syntax, parameter, and usage information for every 
- property list function is provided in the
- “<a href="../RM/RM_H5P.html" target="RMwindow">H5P: Property List 
- Interface</a>” chapter of the 
- <a href="../RM/RM_H5Front.html" target="RMwindow">
- <cite>HDF5 Reference Manual</cite></a>.</p>
- 
-<!-- editingComment
-Also see 
- <span class=EditingComment>[ [ [ property lists chapter -- definitional 
- discussion ] ] ]</span> 
- in this <cite>HDF5 User's Guide</cite> for further discussion of 
- property lists.</p>
--->
-
-
-<h4>3.7.1. Creating a Property List</h4>
-
-
-<p>If you do not wish to rely on the default file creation and 
- access properties, you must first create a property list with 
- <code>H5Pcreate</code>.</p>
-
-<dir><pre>
-hid_t H5Pcreate (hid_t <em>cls_id</em>)
-</pre></dir>
-
-<p><code><em>type</em></code> is the type of property list being created.
-In this case, the appropriate values are 
- <code>H5P_FILE_CREATE</code> for a file creation property list and
- <code>H5P_FILE_ACCESS</code> for a file access property list.</p>
-
-
-<p>Thus, the following calls create a file creation property list and a 
- file access property list with identifiers <code><em>fcpl_id</em></code> 
- and <code><em>fapl_id</em></code>, respectively:
-<dir><pre>
-fcpl_id = H5Pcreate (H5P_FILE_CREATE) 
-fapl_id = H5Pcreate (H5P_FILE_ACCESS) 
-</pre></dir>
-
-Once the property lists have been created, the properties themselves can 
-be modified via the functions described in the following sub-sections.
-
-<a name="FileCreationProperties">
-<p> </p>
-</a>
-
-
-<h4>3.7.2. File Creation Properties</h4>
-
-
-<p>File creation property lists control the file metadata, which is 
-maintained in the superblock of the file. These properties are used 
-only when a file is first created.</p>
-
-<p><span class="RunningHead">User-block size </span></p>
-
-            
-    <code>herr_t H5Pset_userblock (hid_t <em>plist</em>, 
-          hsize_t <em>size</em>)</code>
-    <br />
-            
-    <code>herr_t H5Pget_userblock (hid_t <em>plist</em>, 
-          hsize_t *<em>size</em>)</code>
-
- <p>The <em>user-block</em> is a fixed-length block of data 
- located at the beginning of the file and is ignored by the 
- HDF5 Library. 
- This block is specifically set aside for any data or information 
- that developers determine to be useful to their applications but 
- that will not be used by the HDF5 Library. 
- The <code><em>size</em></code> of the user-block is defined in bytes
- and may be set to any power of two with a minimum size of 512 bytes. 
- In other words, user-blocks might be 512, 1024, or 2048 bytes in size.</p>
- 
- <p>This property is set with <code>H5Pset_userblock</code> 
- and queried via <code>H5Pget_userblock</code>. For example, if an 
- application needed a 4K user-block, then the following function call
- could be used:</p>
-
-            
-    <code>status = H5Pset_userblock(fcpl_id, 4096)</code>
-
-    <p>The property list could later be queried with</p>
-
-            
-    <code>status = H5Pget_userblock(fcpl_id, size)</code>
-
-    <p>and the value <code>4096</code> would be returned in the parameter
- <code><em>size</em></code>.</p>
-
- <p>Other properties, described below, are set and queried in exactly 
- the same manner. Syntax and usage are detailed in the 
- “<a href="../RM/RM_H5P.html" target="RMwindow">H5P: Property List 
- Interface</a>” section of the <a href="../RM/RM_H5Front.html" 
- target="RMwindow"><cite>HDF5 Reference Manual</cite></a>.
-<!-- editingComment
- <span class=editingcomment>[ [ [ Though we could spell it all out here if 
- deemed necessary. ] ] ]</span>
--->
- </p>
-
-<span class="RunningHead">Offset and length sizes </span>
-
- <p>This property specifies the number of bytes used to store 
- the offset and length of objects in the HDF5 file. 
- Values of 2, 4, and 8 bytes are currently supported 
- to accommodate 16-bit, 32-bit, and 64-bit file address spaces. </p>
- 
- <p>These properties are set and queried via 
- <code>H5Pset_sizes</code> and <code>H5Pget_sizes</code>. 
- </p>
-
-<span class="RunningHead">Symbol table parameters </span>
-
-
- <p>The size of symbol table B-trees can be controlled by 
- setting the 1/2-rank and 1/2-node size parameters of the B-tree. </p>
- 
- <p>These properties are set and queried via 
- <code>H5Pset_sym_k</code> and <code>H5Pget_sym_k</code>. </p>
-
-<span class="RunningHead">Indexed storage parameters </span>
-
-
- <p>The size of indexed storage B-trees can be controlled 
- by setting the 1/2-rank and 1/2-node size parameters of the B-tree. </p>
- 
- <p>These properties are set and queried via 
- <code>H5Pset_istore_k</code> and <code>H5Pget_istore_k</code>. </p>
-
-<span class="RunningHead">Version information </span>
-
- <p>Various objects in an HDF5 file may over time appear in different
- versions.  The HDF5 Library keeps track of the version of each object 
- in the file.  </p>
-
- <p>Version information is retrieved via <code>H5Pget_version</code>.</p>
-
-<a name="FileAccessProperties">
-<p> </p>
-</a>
-
-<!-- NEW PAGE -->
-<h4>3.7.3. File Access Properties</h4>
-
-
-<p>This section discusses file access properties that are not related to 
- the low-level file drivers.  
- File drivers are discussed separately in 
- “<a href="#Drivers">Alternate File Storage Layouts and Low-level 
- File Drivers</a>,” later in this chapter. </p>
-
-<p>File access property lists control various aspects of file I/O
- and structure.  </p>
-
-<dl>
-
-<dt><span class="RunningHead">Data alignment </span>
-
-<dd>Sometimes file access is faster if certain data elements are 
- aligned in a specific manner.  This can be controlled by setting alignment 
- properties via the <code>H5Pset_alignment</code> function. 
- There are two values involved:
- <ul>
-    <li>A threshhold value</li>
-    <li>An alignment interval</li>
- </ul>
- <p>Any allocation request at least as large as the threshold will 
- be aligned on an address that is a multiple of the alignment interval. </p>
-
-<dt><span class="RunningHead">Metadata block allocation size</span>
-
-<dd>Metadata typically exists as very small chunks of data;
- storing metadata elements in a file without blocking them can
- result in hundreds or thousands of very small data elements 
- in the file.  This can result in a highly fragmented file and 
- seriously impede I/O. By blocking metadata elements, these small 
- elements can be grouped in larger sets, thus alleviating both problems.
- 
- <p>
- <code>H5Pset_meta_block_size</code> sets the minimum size in bytes
- of metadata block allocations.
- <code>H5Pget_meta_block_size</code> retrieves the current 
- minimum metadata block allocation size.</p>
-
-<dt><span class="RunningHead">Metadata cache</span>
-
-<dd>Metadata and raw data I/O speed are often governed by the size 
- and frequency of disk reads and writes.  In many cases, the speed 
- can be substantially improved by the use of an appropriate cache.
- 
- <p>
- <code>H5Pset_cache</code> sets the minimum cache size for both 
- metadata and raw data and a preemption value for raw data chunks.
- <code>H5Pget_cache</code> retrieves the current values.
- </p>
-
-<dt><span class="RunningHead">Data sieve buffer size</span>
-
-<dd>Data sieve buffering is used by certain file drivers to speed
- data I/O and is most commonly when working with dataset hyperslabs.
- For example, using a buffer large enough to hold several pieces of 
- a dataset as it is read in for hyperslab selections will boost 
- performance noticeably.
-
- <p>
- <code>H5Pset_sieve_buf_size</code> sets the maximum size in bytes
- of the data sieve buffer.
- <code>H5Pget_sieve_buf_size</code> retrieves the current maximum size 
- of the data sieve buffer.
- </p>
-
-<dt><span class="RunningHead">Garbage collection references</span>
-
-<dd>Dataset region references and other reference types use space 
- in an HDF5 file’s global heap. 
- If garbage collection is on (<code>1</code>) and the 
- user passes in an uninitialized value in a reference structure, 
- the heap might become corrupted. 
- When garbage collection is off (<code>0</code>), however, 
- and the user re-uses a reference, the previous heap block 
- will be orphaned and not returned to the free heap space.  
- When garbage collection is on, the user must initialize the 
- reference structures to <code>0</code> or risk heap corruption.
-
- <p>
- <code>H5Pset_gc_references</code> sets the garbage collecting 
- references flag. 
- </p>
-
-</dl>
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="Drivers">
-<div align="right">
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<!-- NEW PAGE -->
-<a name="Drivers">
-<h3 class="pagebefore">3.8. Alternate File Storage Layouts and Low-level 
-File Drivers</h3></a>
-
-<p>The concept of an HDF5 file is actually rather abstract: 
- the address space for what is normally thought of as an HDF5 file
- might correspond to any of the following:
- <ul>
-     <li>Single file on standard file system</li>
-     <li>Multiple files on standard file system</li>
-     <li>Multiple files on parallel file system</li>
-     <li>Block of memory within application’s memory space</li>
-     <li>More abstract situations such as virtual files </li>
-         <!--
-         or streaming I/O
-         -->
- </ul>
- <p>This HDF5 address space is generally referred to as an <em>HDF5 file</em> 
- regardless of its organization at the storage level. </p>
-
-<p>HDF5 employs an extremely flexible mechanism called the 
- <em>virtual file layer</em>, or VFL, for file I/O.  
- A full understanding of the VFL is only necessary if you plan to write 
- your own drivers (see “Virtual File Layer”
- and “List of VFL Functions” in the 
- <a href="../TechNotes.html" target="RMwindow">
- <cite>HDF5 Technical Notes</cite></a>). For our purposes here, it is 
- sufficient to know that the low-level drivers used for file I/O 
- reside in the VFL, as illustrated in the following figure.
- Note that <code>H5FD_STREAM</code> is not available with 1.8.x 
- and later versions of the library.</p>
-
-
- 
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/VFL_Drivers.jpg">
-        </td></tr>
-<tr><td><hr color="green" size="1" /></td></tr>
-<tr valign="top">
-    <td align="left" >
-        <b>Figure 2. I/O path from application 
-        through VFL and low-level drivers to storage</b>
-        <hr color="green" size="3"/></td></tr>
-</table>
-<br />
-
-<p>As mentioned above, HDF5 applications access HDF5 files through 
- various <em>low-level file drivers</em>. 
- The default driver for that layout is the POSIX driver (also known 
- as the SEC2 driver), <code>H5FD_SEC2</code>. Alternative layouts and 
- drivers are designed to suit the needs of a variety of systems, 
- environments, and applications. The drivers are listed in the table below.
- </p>
-
-<!-- NEW PAGE -->
-
-
-<!-- 
-<p>??????? php include statement for Table 2. Supported file drivers
-??????? </p>
--->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="7" align="left" valign="bottom">
-        <b>Table 2. Supported file drivers</b></td>
-        </tr>
-
-<?php include("../_topic/DriversTable.htm"); ?> 
- 
-</table>
- 
- 
-
-  <p>For more information, see the 
-  <a href="../RM/RM_H5Front.html" target="RMwindow"><cite>HDF5 Reference 
-  Manual</cite></a> entries for the function calls shown in the column on 
-  the right in the table above. </p>
-
-  <p>Note that the low-level file drivers manage alternative <i>file</i> 
-  storage layouts. <i>Dataset</i> storage layouts (chunking, 
-  compression, and external dataset storage) are managed independently 
-  of file storage layouts. </p>
-
-  <p>If an application requires a special-purpose low-level driver,
-  the VFL provides a public API for creating one.
-  For more information on how to create a driver, 
-  see “Virtual File Layer”
-  and “List of VFL Functions” in the 
-  <a href="../TechNotes.html" target="RMwindow"><cite>HDF5 Technical 
-  Notes</cite></a>.</p>
-
-
-<!-- NEW PAGE -->
-<h4>3.8.1. Identifying the Previously-used File Driver</h4>
-
-<p>When creating a new HDF5 file, no history exists, so the 
- file driver must be specified if it is to be other than the default.</p>
-
-<p>When opening existing files, however, the application may need 
- to determine which low-level driver was used to create the file.
- The function <code>H5Pget_driver</code> is used for this purpose. 
- See the example below.</p>
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  hid_t H5Pget_driver (hid_t <em>fapl_id</em>)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 5. Identifying a driver</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<p><code>H5Pget_driver</code> returns a constant identifying the 
- low-level driver for the access property list <em>fapl_id</em>. 
- For example, if the file was created with the POSIX (aka SEC2) 
- driver, <code>H5Pget_driver</code> returns <code>H5FD_SEC2</code>.</p>
-
-<p>If the application opens an HDF5 file without both determining 
- the driver used to create the file and setting up the use of that 
- driver, the HDF5 Library will examine the superblock and the 
- driver definition block to identify the driver.  
- See the <cite><a href="../H5.format.html" 
- target="FFSwindow">HDF5 File Format Specification</a></cite> 
- for detailed descriptions of the superblock and the driver definition 
- block.</p>
-
-
-<h4>3.8.2. The POSIX (aka SEC2) Driver</h4>
-
-  <p>The POSIX driver, <code>H5FD_SEC2</code>, uses functions from 
-  section 2 of the POSIX manual to access unbuffered files stored on 
-  a local file system. This driver is also known as the SEC2 driver. 
-  The HDF5 Library buffers metadata regardless of the low-level driver, 
-  but using this driver prevents data from being buffered again by the 
-  lowest layers of the library.</p>
-
-  <p>The function <code>H5Pset_fapl_sec2</code> sets the file access 
-   properties to use the POSIX driver. See the example below.</p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  herr_t H5Pset_fapl_sec2 (hid_t <em>fapl_id</em>)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 6. Using the POSIX, aka SEC2, driver</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>Any previously-defined driver properties are erased from the property 
-  list.</p>
-
-  <p>Additional parameters may be added to this function in the future. 
-  Since there are no additional variable settings associated with 
-  the POSIX driver, there is no <code>H5Pget_fapl_sec2</code> function.</p>
-
-
-  
-<h4>3.8.3. The Direct Driver</h4>
-
-  <p>The Direct driver, <code>H5FD_DIRECT</code>, functions like the 
-  POSIX driver except that data is written to or read from the file 
-  synchronously without being cached by the system.</p>
-
-  <p>The functions <code>H5Pset_fapl_direct</code> and 
-  <code>H5Pget_fapl_direct</code> are used to manage file access properties. 
-  See the example below.</p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  herr_t H5Pset_fapl_direct( hid_t <i>fapl_id</i>, size_t <i>alignment</i>, 
-        size_t <i>block_size</i>, size_t <i>cbuf_size</i> )
-
-  herr_t H5Pget_fapl_direct( hid_t <i>fapl_id</i>, size_t <i>*alignment</i>, 
-        size_t <i>*block_size</i>, size_t <i>*cbuf_size</i> )</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 7. Using the Direct driver</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p><code>H5Pset_fapl_direct</code> sets the file access properties 
-  to use the Direct driver; any previously defined driver properties 
-  are erased from the property list. <code>H5Pget_fapl_direct</code> 
-  retrieves the file access properties used with the Direct driver. 
-  <code>fapl_id</code> is the file access property list identifier. 
-  <code>alignment</code> is the memory alignment boundary. 
-  <code>block_size</code> is the file system block size. 
-  <code>cbuf_size</code> is the copy buffer size.</p>
-
-  <p>Additional parameters may be added to this function in the future. </p>
-
-
-
-<h4>3.8.4. The Log Driver</h4>
-
-<p>The Log driver, <code>H5FD_LOG</code>, is 
- designed for situations where it is necessary to log file access activity.</p>
-
-<p>The function <code>H5Pset_fapl_log</code> is used to manage
- logging properties. See the example below.</p>
- 
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  herr_t H5Pset_fapl_log (hid_t <em>fapl_id</em>, const char *<em>logfile</em>,
-           unsigned int <em>flags</em>, size_t <em>buf_size</em>)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 8. Logging file access</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p><code>H5Pset_fapl_log</code> sets the file access property list 
-  to use the Log driver. File access characteristics are identical to 
-  access via the POSIX driver. Any previously defined driver properties 
-  are erased from the property list. </p>
-
-  <p>Log records are written to the file <code><em>logfile</em></code>.</p>
-
-  <p>The logging levels set with the <code><em>verbosity</em></code> 
-  parameter are shown in the table below. </p>
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 3. Logging levels</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="10%"><b>Level</b></td>
-        <td width="90%"><b>Comments</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>0</td>
-        <td>Performs no logging.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>1</td>
-        <td>Records where writes and reads occur in the file.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>2</td>
-        <td>Records where writes and reads occur in the file and what 
-        kind of data is written at each location. This includes raw 
-        data or any of several types of metadata (object headers, 
-        superblock, B-tree data, local headers, or global headers).</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-<p>There is no <code>H5Pget_fapl_log</code> function.</p>
-
-<p>Additional parameters may be added to this function in the future. </p>
-
-
-
-<h4>3.8.5. The Windows Driver</h4>
-
-  <p>The Windows driver, <code>H5FD_WINDOWS</code>, was modified in 
-  HDF5-1.8.8 to be a wrapper of the POSIX driver, <code>H5FD_SEC2</code>. 
-  In other words, if the Windows drivers is used, any file I/O will 
-  instead use the functionality of the POSIX driver. This change should 
-  be transparent to all user applications. The Windows driver used to be 
-  the default driver for Windows systems. The POSIX driver is now the 
-  default. </p>
-
-  <p>The function <code>H5Pset_fapl_windows</code> sets the file access 
-   properties to use the Windows driver. See the example below.</p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  herr_t H5Pset_fapl_windows (hid_t <em>fapl_id</em>)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 9. Using the Windows driver</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>Any previously-defined driver properties are erased from the property 
-  list.</p>
-
-  <p>Additional parameters may be added to this function in the future. 
-  Since there are no additional variable settings associated with 
-  the POSIX driver, there is no <code>H5Pget_fapl_windows</code> function.</p>
-
-
-
-<h4>3.8.6. The STDIO Driver</h4>
-
-  <p>The STDIO driver, <code>H5FD_STDIO</code>, accesses permanent files 
-  in a local file system like the POSIX driver does. The STDIO driver also 
-  has an additional layer of buffering beneath the HDF5 Library. </p>
-
-  <p>The function <code>H5Pset_fapl_stdio</code> sets the file access 
-  properties to use the STDIO driver. See the example below.</p>
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  herr_t H5Pset_fapl_stdio (hid_t <em>fapl_id</em>)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 10. Using the STDIO driver</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>Any previously defined driver properties are erased from the property 
-  list.</p>
-
-  <p>Additional parameters may be added to this function in the future. 
-  Since there are no additional variable settings associated with 
-  the STDIO driver, there is no <code>H5Pget_fapl_stdio</code> function.</p>
-
-  
-  
-<h4>3.8.7. The Memory (aka Core) Driver</h4>
-
-<p>There are several situations in which it is reasonable, 
- sometimes even required, to maintain a file entirely in system memory.
- You might want to do so if, for example, either of the following 
- conditions apply:</p>
- <ul>
-    <li>Performance requirements are so stringent that 
-        disk latency is a limiting factor</li>
-    <li>You are working with small, temporary files that will not 
-        be retained and, thus, need not be written to storage media</li>
- </ul>
-
-  <p>The Memory driver, <code>H5FD_CORE</code>, provides a mechanism 
-  for creating and managing such in-memory files. The functions 
-  <code>H5Pset_fapl_core</code> and <code>H5Pget_fapl_core</code> 
-  manage file access properties. See the example below.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  herr_t H5Pset_fapl_core (hid_t <em>access_properties</em>, 
-           size_t <em>block_size</em>, hbool_t <em>backing_store</em>)
-  herr_t H5Pget_fapl_core (hid_t <em>access_properties</em>, 
-           size_t *<em>block_size</em>), hbool_t *<em>backing_store</em>)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 11. Managing file access for in-memory files</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p><code>H5Pset_fapl_core</code> sets the file access property list
-  to use the Memory driver; any previously defined driver properties 
-  are erased from the property list. </p>
- 
-  <p>Memory for the file will always be allocated in units of the 
-  specified <code><em>block_size</em></code>. </p>
-
-
-  <p>The <code><em>backing_store</em></code> Boolean flag is set when 
-  the in-memory file is created. <code><em>backing_store</em></code> 
-  indicates whether to write the file contents to disk when the file 
-  is closed. If <code><em>backing_store</em></code> is set to 1 (TRUE), 
-  the file contents are flushed to a file with the same name as the 
-  in-memory file when the file is closed or access to the file is 
-  terminated in memory. If <code><em>backing_store</em></code> is set 
-  to 0 (FALSE), the file is not saved.</p>
-  
-  <p>The application is allowed to open an existing file with the 
-  <code><em>H5FD_CORE</em></code> driver.  While using 
-  <code><em>H5Fopen</em></code> to open an existing file, if 
-  <code><em>backing_store</em></code> is set to <code><em>1</em></code> 
-  and the <code><em>flag</em></code> for <code><em>H5Fopen</em></code>
-  is set to <code><em>H5F_ACC_RDWR</em></code>, changes to the file 
-  contents will be saved to the file when the file is closed.  If 
-  <code><em>backing_store</em></code> is set to <code><em>0</em></code> 
-  and the <code><em>flag</em></code> for <code><em>H5Fopen</em></code> 
-  is set to <code><em>H5F_ACC_RDWR</em></code>, changes to the file 
-  contents will be lost when the file is closed.  If the 
-  <code><em>flag</em></code> for <code><em>H5Fopen</em></code> is set to 
-  <code><em>H5F_ACC_RDONLY</em></code>, no change to the file will be allowed 
-  either in memory or on file.</p>
-
-  <p>If the file access property list is set to use the Memory driver, 
-  <code>H5Pget_fapl_core</code> will return <code><em>block_size</em></code> 
-  and <code><em>backing_store</em></code> with the relevant file access 
-  property settings.</p>
-
-<p>Note the following important points regarding in-memory files:</p>
-    <ul>
-    <li>Local temporary files are created and accessed directly 
-        from memory without ever being written to disk</li>
-    <li>Total file size must not exceed the available virtual memory</li>
-    <li>Only one HDF5 file identifier can be opened for the file, the 
-        identifier returned by <code>H5Fcreate</code> or 
-        <code>H5Fopen</code></li>
-    <li>The changes to the file will be discarded when access is 
-        terminated unless <code><em>backing_store</em></code> is set 
-        to <code>1</code></li>
-    </ul>
-
-<p>Additional parameters may be added to these functions in the future. </p>
-
-<p>See the “<a href=
-"../Advanced/FileImageOperations/HDF5FileImageOperations.pdf">HDF5 
-File Image Operations</a>” section for information on more 
-advanced usage of the Memory file driver, and see the 
-“<a href=
-"../Advanced/ModifiedRegionWrites/ModifiedRegionWrites.pdf">
-Modified Region Writes</a>” section for information on how to 
-set write operations so that only modified regions are written to 
-storage.
-</p>
-
-
-<h4>3.8.8. The Family Driver</h4>
-
-  <p>HDF5 files can become quite large, and this can create problems on 
-  systems that do not support files larger than 2 gigabytes.
-  The HDF5 <b><i>file family</i></b> mechanism 
-  is designed to solve the problems this creates by splitting 
-  the HDF5 file address space across several smaller files.  
-  This structure does not affect how metadata and raw data are stored:
-  they are mixed in the address space just as they would be in a 
-  single, contiguous file.</p>
-
-  <p>HDF5 applications access a family of files via the 
-  Family driver, <code>H5FD_FAMILY</code>. The functions 
-  <code>H5Pset_fapl_family</code> and <code>H5Pget_fapl_family</code> 
-  are used to manage file family properties. See the example below.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  herr_t H5Pset_fapl_family (hid_t <em>fapl_id</em>, hsize_t <em>memb_size</em>, 
-        hid_t <em>member_properties</em>)
-
-  herr_t H5Pget_fapl_family (hid_t <em>fapl_id</em>, hsize_t *<em>memb_size</em>, 
-        hid_t *<em>member_properties</em>)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 12. Managing file family properties</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>Each member of the family is the same <i>logical</i> size though 
-  the size and disk storage reported by file system listing tools may be 
-  substantially smaller. Examples of file system listing tools are 
-  <code>’ls -l’</code> on a Unix system or the detailed folder 
-  listing on an Apple Macintosh or Microsoft Windows system.
-  The name passed to <code>H5Fcreate</code> or <code>H5Fopen</code> 
-  should include a <code>printf(3c)</code>-style integer format specifier 
-  which will be replaced with the family member number.
-  The first family member is numbered zero (<code>0</code>). </p>
-
-<!-- NEW PAGE -->
-  <p><code>H5Pset_fapl_family</code> sets the access properties to use 
-  the Family driver; any previously defined driver properties are erased 
-  from the property list. <code><em>member_properties</em></code> will 
-  serve as the file access property list for each member of the file family.
-  <code><em>memb_size</em></code> specifies the logical size, in bytes,
-  of each family member. <code><em>memb_size</em></code> is used only 
-  when creating a new file or truncating an existing file; otherwise 
-  the member size is determined by the size of the first member of the 
-  family being opened. Note: If the size of the <code>off_t</code> 
-  type is four bytes, the maximum family member size is usually 
-  2^31-1 because the byte at offset 2,147,483,647 is generally inaccessible. </p>
-
-  <p><code>H5Pget_fapl_family</code> is used to retrieve file family 
-  properties. If the file access property list is set to use the 
-  Family driver, <em>member_properties</em> will be returned with a 
-  pointer to a copy of the appropriate member access property list.
-  If <code><em>memb_size</em></code> is non-null, it will contain 
-  the logical size, in bytes, of family members. </p>
-
-  <p>Additional parameters may be added to these functions in the future. </p>
-
-
-<h4>Unix Tools and an HDF5 Utility</h4>
-
-  <p>It occasionally becomes necessary to <b>repartition</b> a file family.
-  A command-line utility for this purpose, <code>h5repart</code>, is 
-  distributed with the HDF5 Library.</p>
-
- <dl>
-    <dd><code>h5repart</code> [<code>-v</code>] 
-        [<code>-b</code> <em>block_size</em>[<em>suffix</em>]] 
-        [<code>-m</code> <em>member_size</em>[<em>suffix</em>]] 
-        <em>source destination</em> 
- </dl>
-
-  <p><code>h5repart</code> repartitions an HDF5 file by copying the source file 
-  or file family to the destination file or file family, preserving holes 
-  in the underlying UNIX files. Families are used for the source and/or 
-  destination if the name includes a <code>printf</code>-style integer 
-  format such as <code>%d</code>.  
-  The <code>-v</code> switch prints input and output file names on the 
-  standard error stream for progress monitoring, 
-  <code>-b</code> sets the I/O block size (the default is 1KB), and 
-  <code>-m</code> sets the output member size if the destination is a 
-  family name (the default is 1GB).  
-  <code><em>block_size</em></code> and <code><em>member_size</em></code>
-  may be suffixed with the letters <code>g</code>, <code>m</code>, or 
-  <code>k</code> for GB, MB, or KB respectively. </p>
-
-  <p>The <code>h5repart</code> utility is described on the 
-  <a href="../RM/Tools.html" target="RMwindow">Tools</a> page of the 
-  <a href="../RM/RM_H5Front.html" target="RMwindow">
-  <cite>HDF5 Reference Manual</cite></a>.</p>
-
-  <p>An existing HDF5 file can be split into a family of files by running
-  the file through <code>split(1)</code> on a UNIX system and numbering 
-  the output files. However, the HDF5 Library is lazy about extending 
-  the size of family members, so a valid file cannot generally be 
-  created by concatenation of the family members. </p>
-
-  <p>Splitting the file and rejoining the segments by concatenation
-  (<code>split(1)</code> and <code>cat(1)</code> on UNIX systems)
-  does not generate files with holes; holes are preserved only through 
-  the use of <code>h5repart</code>. </p>
-
-  
-  
-  
-  
-<!-- NEW PAGE -->
-<h4>3.8.9. The Multi Driver</h4>
-
-  <p>In some circumstances, it is useful to separate metadata from 
-  raw data and some types of metadata from other types of metadata. 
-  Situations that would benefit from use of the Multi driver include 
-  the following:</p>
-  <ul>
-    <li>In networked situations where the small metadata files 
-      can be kept on local disks but larger raw data files 
-      must be stored on remote media</li>
-    <li>In cases where the raw data is extremely large</li>
-    <li>In situations requiring frequent access to metadata held
-      in RAM while the raw data can be efficiently held on disk</li>
-  </ul>
-  <p>In either case, access to the metadata is substantially 
-  easier with the smaller, and possibly more localized, metadata files.
-  This often results in improved application performance.</p>
-
-  <p>The Multi driver, <code>H5FD_MULTI</code>, provides a mechanism 
-  for segregating raw data and different types of metadata into multiple 
-  files. The functions <code>H5Pset_fapl_multi</code> and 
-  <code>H5Pget_fapl_multi</code> are used to manage access properties 
-  for these multiple files. See the example below.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  herr_t H5Pset_fapl_multi (hid_t <em>fapl_id</em>, const H5FD_mem_t *<em>memb_map</em>,
-            const hid_t *<em>memb_fapl</em>, const char * const *<em>memb_name</em>,
-            const haddr_t *<em>memb_addr</em>, hbool_t <em>relax</em>)
-  herr_t H5Pget_fapl_multi (hid_t <em>fapl_id</em>, const H5FD_mem_t *<em>memb_map</em>,
-            const hid_t *<em>memb_fapl</em>, const char **<em>memb_name</em>,
-            const haddr_t *<em>memb_addr</em>, hbool_t *<em>relax</em>)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 13. Managing access properties for multiple files</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p><code>H5Pset_fapl_multi</code> sets the file access properties 
-  to use the Multi driver; any previously defined driver properties are 
-  erased from the property list. With the Multi driver invoked, the 
-  application will provide a base name to <code>H5Fopen</code> or 
-  <code>H5Fcreate</code>. The files will be named by that base name as 
-  modified by the rule indicated in <code><em>memb_name</em></code>.
-  File access will be governed by the file access property list 
-  <code><em>memb_properties</em></code>. </p>
-
-  <p>See 
-  <a href="../RM/RM_H5P.html#Property-SetFaplMulti"
-  target="RMwindow"><code>H5Pset_fapl_multi</code></a>  and
-  <a href="../RM/RM_H5P.html#Property-GetFaplMulti"
-  target="RMwindow"><code>H5Pget_fapl_multi</code></a>  
-  in the <cite>HDF5 Reference Manual</cite> for descriptions 
-  of these functions and their usage.</p>
-
-  <p>Additional parameters may be added to these functions in the future. </p>
-
-
-<h4>3.8.10. The Split Driver</h4>
-
-  <p>The Split driver, <code>H5FD_SPLIT</code>, is a limited case of the 
-  Multi driver where only two files are created. One file holds metadata, 
-  and the other file holds raw data. </p>
-
-  <p>The function <code>H5Pset_fapl_split</code> is used to manage Split 
-  file access properties. See the example below.</p>
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  herr_t H5Pset_fapl_split (hid_t <em>access_properties</em>, 
-      const char *<em>meta_extension</em>, hid_t <em>meta_properties</em>, 
-      const char *<em>raw_extension</em>, hid_t <em>raw_properties</em></pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 14. Managing access properties for split files</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p><code>H5Pset_fapl_split</code> sets the file access properties 
-  to use the Split driver; any previously defined driver properties 
-  are erased from the property list. </p>
-
-
-  <p>With the Split driver invoked, the application will provide a base 
-  file name such as <code><em>file_name</em></code> to 
-  <code>H5Fcreate</code> or <code>H5Fopen</code>. The metadata and raw 
-  data files in storage will then be named 
-  <code><em>file_name.meta_extension</em></code> and 
-  <code><em>file_name.raw_extension</em></code>, respectively. For 
-  example, if <code><em>meta_extension</em></code> is defined as 
-  <code>.meta</code> and <code><em>raw_extension</em></code> is defined 
-  as <code>.raw</code>, the final filenames will be 
-  <code><em>file_name</em>.meta</code> and 
-  <code><em>file_name</em>.raw</code>.</p>
-
-  <p>Each file can have its own file access property list. 
-  This allows the creative use of other low-level file drivers.
-  For instance, the metadata file can be held in RAM and accessed 
-  via the Memory driver while the raw data file is stored on disk and 
-  accessed via the POSIX driver. Metadata file access will be governed 
-  by the file access property list in <em>meta_properties</em>. 
-  Raw data file access will be governed by the file access property
-  list in <em>raw_properties</em>. </p>
-
-  <p>Additional parameters may be added to these functions in the future. 
-  Since there are no additional variable settings associated with 
-  the Split driver, there is no <code>H5Pget_fapl_split</code> function.</p>
-
-
-
-<h4>3.8.11. The Parallel Driver</h4>
-
-  <p>Parallel environments require a parallel low-level driver. HDF5’s 
-  default driver for parallel systems is called the Parallel driver, 
-  <code>H5FD_MPIO</code>. This driver uses the MPI standard for both 
-  communication and file I/O.</p>
-
-  <p>The functions <code>H5Pset_fapl_mpio</code> and 
-  <code>H5Pget_fapl_mpio</code> are used to manage file access properties 
-  for the <code>H5FD_MPIO</code> driver. See the example below.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  herr_t H5Pset_fapl_mpio (hid_t <em>fapl_id</em>, MPI_Comm <em>comm</em>, 
-           MPI_info <em>info</em>)
-  herr_t H5Pget_fapl_mpio (hid_t <em>fapl_id</em>, MPI_Comm *<em>comm</em>, 
-           MPI_info *<em>info</em>)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 15. Managing parallel file access properties</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>The file access properties managed by <code>H5Pset_fapl_mpio</code> 
-  and retrieved by <code>H5Pget_fapl_mpio</code> are 
-  the MPI communicator, <code><em>comm</em></code>, and
-  the MPI info object, <code><em>info</em></code>. <code>comm</code> 
-  and <code>info</code> are used for file open. <code>info</code> is an 
-  information object much like an HDF5 property list. Both are defined 
-  in <code>MPI_FILE_OPEN</code> of MPI-2. </p>
-
-  <p>The communicator and the info object are saved in the file access 
-  property list <code><em>fapl_id</em></code>.
-  <code><em>fapl_id</em></code> can then be passed to 
-  <code>MPI_FILE_OPEN</code> to create and/or open the file. </p>
-
-  <p><code>H5Pset_fapl_mpio</code> and <code>H5Pget_fapl_mpio</code> 
-  are available only in the parallel HDF5 Library and are not collective 
-  functions. The Parallel driver is available only in 
-  the parallel HDF5 Library.</p>
-
-  <p>Additional parameters may be added to these functions in the future. </p>
-
-
-<!-- as of 3.24.2014, the parallel posix driver, mpi-posix, is no longer 
-available.
-<h4>3.8.12. The Parallel POSIX Driver</h4>
-
-  <p>In addition to the Parallel driver, <code>H5FD_MPIO</code>, HDF5 
-  has the Parallel POSIX driver, <code>H5FD_MPIPOSIX</code>. This Parallel 
-  POSIX driver uses MPI for communication and POSIX file-system calls 
-  for file I/O.</p>
-
-  <p>The functions <code>H5Pset_fapl_mpiposix</code> and 
-  <code>H5Pget_fapl_mpiposix</code> are used to manage file access properties 
-  for the <code>H5FD_MPIPOSIX</code> driver. See the example below.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  herr_t H5Pset_fapl_mpiposix (hid_t <em>fapl_id</em>, MPI_Comm <em>comm</em>, 
-        hbool_t <em>use_gpfs_hints</em>)
-
-  herr_t H5Pget_fapl_mpiposix (hid_t <em>fapl_id</em>, MPI_Comm *<em>comm</em>, 
-        hbool_t *<em>use_gpfs_hints</em>)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 16. Managing parallel POSIX file access properties</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>The file access properties managed 
-  by <code>H5Pset_fapl_mpiposix</code> and retrieved by 
-  <code>H5Pget_fapl_mpiposix</code> are the MPI communicator, 
-  <code><em>comm</em></code>, and the parameter 
-  <code><em>use_gpfs_hints</em></code>. <code><em>comm</em></code> and 
-  <code><em>use_gpfs_hints</em></code> are used for file 
-  open. <code><em>comm</em></code> is defined in <code>MPI_FILE_OPEN</code> of MPI-2. 
-  </p>
-
-  <p>The <code><em>comm</em></code> and the 
-  <code><em>use_gpfs_hints</em></code> parameter values 
-  are saved in the file access property list <code><em>fapl_id</em></code>.
-  </p>
-
-  <p>
-  <code>H5Pset_fapl_mpiposix</code> and <code>H5Pget_fapl_mpiposix</code> 
-  are available only in the parallel HDF5 Library and are not collective 
-  functions. The Parallel POSIX driver is available only in 
-  the parallel HDF5 Library.</p>
-
-  <p>Additional parameters may be added to these functions in the future. </p>
--->
-<br />
-
-
-<!-- re-insert printing page break header here -->
-<!--
-                     STREAM DRIVER REMOVED FROM HDF5 
-                       DECEMBER 2007/RELEASE 1.8.0
-                        DUE TO LICENSING CONCERNS	
-
-<h4>8.9 Streaming I/O -- 
-    <span class="smallcaps">STREAM</span> driver</h4>
-
-
-<p>The <span class="smallcaps">STREAM</span> driver is designed 
- for situations where data is to be streamed across the network 
- rather than written to a local file.
-
-<p>The functions <code>H5Pset_fapl_stream</code> and
- <code>H5Pget_fapl_stream</code> are used to manage 
- streaming file access properties: 
-
- <dl>
-    <dd><code>herr_t H5Pset_fapl_stream (hid_t <em>fapl_id</em>,
-                     H5FD_stream_fapl_t *<em>fapl</em>)</code>
-    <dd><code>herr_t H5Pget_fapl_stream (hid_t <em>fapl_id</em>,
-                     H5FD_stream_fapl_t *<em>fapl</em>)</code>
- </dl>
-
-<p><code>H5Pset_fapl_stream</code> sets up the use of the 
- <span class="smallcaps">STREAM</span> driver.
-
-<p><code><em>fapl_id</em></code> is the identifier for the 
- file access property list currently in use.
-
-<p><code><em>fapl</em></code> is the streaming file access property list
- and is an <code>H5FD_stream_fapl_t</code> struct containing the 
- following elements:
-
- <div align="center">
-   <table border="0">
-     <tr align="left">
-       <td><code>size_t</code></td>
-       <td><code><em>increment</em></code></td></tr>
-     <tr align="left">
-       <td><code>H5FD_STREAM_SOCKET_TYPE </code></td>
-       <td><code><em>socket</em></code></td></tr>
-     <tr align="left">
-       <td><code>hbool_t</code></td>
-       <td><code><em>do_socket_io</em></code></td></tr>
-     <tr align="left">
-       <td><code>unsigned int</code></td>
-       <td><code><em>backlog</em></code></td></tr>
-     <tr align="left">
-       <td><code>H5FD_stream_broadcast_t </code></td>
-       <td><code><em>broadcast_fn</em></code></td></tr>
-     <tr align="left">
-       <td><code>void *</code></td>
-       <td><code><em>broadcast_arg</em></code></td></tr>
-   </table>
- </div>
-
- <ul>
-   <li><code><em>increment</em></code> specifies how much memory 
-     to allocate each time additional memory is required.  
-   <li><code><em>socket</em></code> is an external socket descriptor;
-     if a valid socket argument is provided, that socket will be used.
-   <li><code><em>do_socket_io</em></code> is a boolean value specifying 
-     whether to perform I/O on <code><em>socket</em></code>.
-   <li><code><em>backlog</em></code> is the argument for the 
-     <code>listen</code> call.
-   <li><code><em>broadcast_fn</em></code> is the broadcast callback 
-     function.
-   <li><code><em>broadcast_arg</em></code> is the user argument to 
-     the broadcast callback function.
- </ul>
-
-<p><code>H5Pget_fapl_stream</code> retrieves the values stored in
- the <code><em>fapl</em></code> struct.
-
-<p><code>H5Pset_fapl_stream</code> and <code>H5Pget_fapl_stream</code> 
- are not intended for use in parallel environments.
-
--->
-
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="Examples">
-<div align="right">
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-
-<a name="Examples">
-<h3 class="pagebefore">3.9. Code Examples for Opening and Closing Files</h3>
-</a>
-
-<!-- editingComment
-<p class=editingcomment>[ [ [ Comprehensive example set yet to be prepared. ] ] ]</p>
--->
-<br />
-
-<h4>3.9.1. Example Using the <code>H5F_ACC_TRUNC</code> Flag</h4>
-
-<p>The following example uses the <code>H5F_ACC_TRUNC</code> flag when it 
- creates a new file. The default file creation and file access properties
- are also used. Using <code>H5F_ACC_TRUNC</code> means the function 
- will look for an existing file with the name specified by the function. 
- In this case, that name is <code>FILE</code>. If the function does not 
- find an existing file, it will create one. If it does find an existing 
- file, it will empty the file in preparation for a new set of data. 
- The identifier for the "new" file will be passed back to the application 
- program. See the "<a href="#FileAccessModes">File Access Modes</a>" 
- section for more information.</p>
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  hid_t file;                                     /*  identifier   */
-  
-  /* Create a new file using H5F_ACC_TRUNC access, default file 
-   * creation properties, and default file access properties.      */
-  file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-  
-  /* Close the file.                                               */
-  status = H5Fclose(file);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 17. Creating a file with default creation and 
-        access properties</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<h4>3.9.2. Example with the File Creation Property List</h4>
-
-<p>The example below shows how to create a file with 64-bit object 
-offsets and lengths.</p>
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  hid_t create_plist;
-  hid_t file_id;
-  create_plist = H5Pcreate(H5P_FILE_CREATE);
-  H5Pset_sizes(create_plist, 8, 8);
-  file_id = H5Fcreate("test.h5", H5F_ACC_TRUNC,
-                      create_plist, H5P_DEFAULT);
-      .
-      .
-      .
-  H5Fclose(file_id);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 18. Creating a file with 64-bit offsets</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<!-- NEW PAGE -->
-<h4>3.9.3. Example with File Access Property List</h4>
-
-<p>This example shows how to open an existing file for independent datasets 
- access by MPI parallel I/O:</p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  hid_t access_plist;
-  hid_t file_id;
-  access_plist = H5Pcreate(H5P_FILE_ACCESS);
-  H5Pset_fapl_mpi(access_plist, MPI_COMM_WORLD, MPI_INFO_NULL);
-  
-  /* H5Fopen must be called collectively */
-  file_id = H5Fopen("test.h5", H5F_ACC_RDWR, access_plist); 
-     .
-     .
-     .
-  /* H5Fclose must be called collectively */
-  H5Fclose(file_id);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 19. Opening an existing file for parallel I/O</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<a name="MountingFiles">
-<h3>3.10. Working with Multiple HDF5 Files</h3>
-</a>
-<p>Multiple HDF5 files can be associated so that the files can be worked 
-with as though all the information is in a single HDF5 file. A temporary 
-association can be set up by means of the <code>H5Fmount</code> function. 
-A permanent association can be set up by means of the external link 
-function <code>H5Lcreate_external</code>. </p>
-
-<p>The purpose of this section is to describe what happens when the 
-<code>H5Fmount</code> function is used to mount one file on another. </p>
-
-<p>When a file is mounted on another, the mounted file is mounted at 
-a group, and the root group of the mounted file takes the place of that 
-group until the mounted file is unmounted or until the files are closed. </p>
-
-<p>The figure below shows two files before one is mounted on the other. 
-File1 has two groups and three datasets. The group that is the target of 
-the A link has links, Z and Y, to two of the datasets. The group that is 
-the target of the B link has a link, W, to the other dataset. File2 has 
-three groups and three datasets. The groups in File2 are the targets of 
-the AA, BB, and CC links. The datasets in File2 are the targets of the 
-ZZ, YY, and WW links. </p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img height="300"src="Images/Files_fig3.JPG">
-        </td></tr>
-<tr><td><hr color="green" size="1" /></td></tr>
-<tr valign="top">
-    <td align="left" >
-        <b>Figure 3. Two separate files</b>
-        <hr color="green" size="3"/></td></tr>
-</table>
-<br />
-
-
-
-<p>The figure below shows the two files after File2 has been mounted 
-File1 at the group that is the target of the B link.</p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img height="300" src="Images/Files_fig4.JPG">
-        </td></tr>
-<tr><td><hr color="green" size="1" /></td></tr>
-<tr valign="top">
-    <td align="left" >
-        <b>Figure 4. File2 mounted on File1 </b>
-
-        <hr color="green" size="3"/></td></tr>
-</table>
-<br />
-
-
-
-<p>Note that the dataset that is the target of the W link is not shown 
-in the figure above. That dataset is masked by the mounted file. </p>
-
-<p>If a file is mounted on a group that has members, those members are 
-hidden until the mounted file is unmounted. There are two ways around this 
-if you need to work with a group member. One is to mount the file on an 
-empty group. Another is to open the group member before you mount the 
-file. Opening the group member will return an identifier that you can 
-use to locate the group member. </p>
-
-<p>The example below shows how <code>H5Fmount</code> might be used to 
-mount File2 onto File1. </p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  status = H5Fmount(loc_id, "/B", child_id, plist_id) </pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-
-    <tr valign="top">
-        <td align="left">
-        <b>Example 20.Using <code>H5Fmount</code> </b><br />
-        loc_id is the file identifier for File1, /B is the link path to the 
-        group where File2 is mounted, child_id is the file identifier 
-        for File2, and plist_id is a property list identifier.
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<p>For more information, see the 
-“<a href="09_Groups.html">HDF5 Groups</a>” chapter, and the 
-<code>H5Fmount</code>, <code>H5Funmount</code>, and 
-<code>H5Lcreate_external</code> functions in the 
-<a href="../RM/RM_H5Front.html"><cite>HDF5 Reference Manual</cite></a>.</p>
-
-
-
-
-
-
-<br /><br />
-</body>
-</html>
diff --git a/html/UG/OldHtmlSource/09_Groups.html b/html/UG/OldHtmlSource/09_Groups.html
deleted file mode 100755
index e4750b0..0000000
--- a/html/UG/OldHtmlSource/09_Groups.html
+++ /dev/null
@@ -1,3005 +0,0 @@
-<!doctype HTML public "-//W3C//DTD HTML 4.0 Frameset//EN">
-<html>
-<head>
-<title>Chapter 4: HDF5 Groups</title>
-
-<!--(Meta)==========================================================-->
-
-<!--(Links)=========================================================-->
-
-<!--( Begin styles definition )=====================================-->
-<link href="ed_styles/NewUGelect.css" rel="stylesheet" type="text/css">
-<!--( End styles definition )=======================================-->
-
-</head> 
-
-<body>
-
-<!-- #BeginLibraryItem "/ed_libs/styles_UG.lbi" -->
-<!--
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-  * Copyright by The HDF Group.                                               *
-  * Copyright by the Board of Trustees of the University of Illinois.         *
-  * All rights reserved.                                                      *
-  *                                                                           *
-  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
-  * terms governing use, modification, and redistribution, is contained in    *
-  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
-  * of the source code distribution tree; Copyright.html can be found at the  *
-  * root level of an installed copy of the electronic HDF5 document set and   *
-  * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-  * access to either file, you may request a copy from help at hdfgroup.org.     *
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- -->
-<!-- #EndLibraryItem --><!-- HEADER LEFT "HDF5 User's Guide" -->
-<!-- HEADER RIGHT "HDF5 Groups" -->
-
-<!--( TOC )=========================================================-->
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ('\
-<table x-use-null-cells\
-                align=right\
-		width=240\
-		cellspacing="0"\
-		class="tocTable">\
-  <tr valign="top"> \
-    <td class="tocTableHeaderCell" colspan="2"> \
-        <span class="TableHead">Chapter Contents</span></td>\
-  </tr>\
--->
-<!-- Table Version 3 -->\
-<!--
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Intro">1.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Intro">Introduction</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#DGroupObj">2.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#DGroupObj">Description of the Group Object</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#H5Dump">3.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#H5Dump">Using <code>h5dump</code></a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#GroupFuncSums">4.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#GroupFuncSums">Group (H5G) Function Summaries</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#ProgModel">5.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#ProgModel">Programming Model</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#DiscoverInfo">6.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#DiscoverInfo">Discovering Information About Objects</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#DiscoverGrObjs">7.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#DiscoverGrObjs">Discovering Objects in a Group</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#DiscoverAll">8.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#DiscoverAll">Discovering All the Objects in the File</a></td>\
-  </tr>\
-\
-  <tr valign="top"> \
-    <td class="tocTableContentCell"> \
--->
-<!-- editingComment -- "tocTableContentCell" and "tocTableContentCell4" \
--->\
-<!-- are the table-closing cell class.\
-    <td class="tocTableContentCell2"> \
--->\
-<!--
-      <a href="#Examples">9.</a></td>\
-    <td class="tocTableContentCell4">\
-	  <a href="#Examples">Examples of File Structures</a>\
--->
-<!-- editingComment -- This section not currently complete or validated.\
-  </tr><tr valign="top"> \
-    <td class="tocTableContentCell"> \
-    <a href="#Appendix">10</a></td>\
-    <td class="tocTableContentCell4"><a href="#Appendix">Appendix</a></td>\
--->\
-<!--
-  </td></tr>\
-</table>\
-')
--->
-</SCRIPT>
-<!--(End TOC)=======================================================-->
-
-<!--(TOC VERS 1 and 2)==============================================-->
-<!-- Table Version 1
-  <tr valign="top"> 
-    <td class="tocTableContentCell" colspan="2"> 
-    <a href="#Intro">1: Introduction</a> 
-    <br /> 
-    <a href="#DGroupObj">2: Description of the Group</a>
-    <br /> 
-    <a href="#h5dump">3: Using <code>h5dump</code></a>
-    <br />
-        <a href="#DGroupObj">Object</a> 
-    <br />
-    <a href="#GroupFuncSums">4: Group Function</a> 
-    <br />
-        <a href="#GroupFuncSums">Summaries</a> 
-    <br /> 
-    <a href="#ProgModel">5: The Programming Model</a> 
-    <br /> 
-    <a href="#DiscoverInfo">6: Discovering Information</a> 
-    <br />
-        <a href="#DiscoverInfo">About Objects</a>
-    <br />
-    <a href="#DiscoverAll">7: Discovering All the</a>
-    <br />
-        <a href="#DiscoverAll">Objects in the File</a>
-    <br />
-    <a href="#Examples">8: Examples of File</a> 
-    <br />
-        <a href="#Examples">Structures</a>
-    <br />
-    <a href="#Appendix">9: Appendix</a> 
-    </td>
-  </tr>
--->
-
-<!-- Table Version 2
-  <tr valign="top"> 
-    <td class="tocTableContentCell2"> 
-    <a href="#Intro">1</a></td>
-    <td class="tocTableContentCell3"><a href="#Intro">Introduction</a> 
-  </tr><tr valign="top"> 
-    <td class="tocTableContentCell2"> 
-    <a href="#DGroupObj">2</a></td>
-    <td class="tocTableContentCell3"><a href="#DGroupObj">Description of the Group Object</a>
-  </tr><tr valign="top"> 
-    <td class="tocTableContentCell2"> 
-    <a href="#h5dump">3</a></td>
-    <td class="tocTableContentCell3"><a href="#h5dump">Using <code>h5dump</code></a> 
-  </tr><tr valign="top"> 
-    <td class="tocTableContentCell2"> 
-    <a href="#GroupFuncSums">4</a></td>
-    <td class="tocTableContentCell3"><a href="#GroupFuncSums">Group Function Summaries</a> 
-  </tr><tr valign="top"> 
-    <td class="tocTableContentCell2"> 
-    <a href="#ProgModel">5</a></td>
-    <td class="tocTableContentCell3"><a href="#ProgModel">Programming Model</a> 
-  </tr><tr valign="top"> 
-    <td class="tocTableContentCell2"> 
-    <a href="#DiscoverInfo">6</a></td>
-    <td class="tocTableContentCell3"><a href="#DiscoverInfo">Discovering Information About Objects</a>
-  </tr><tr valign="top"> 
-    <td class="tocTableContentCell2"> 
-    <a href="#DiscoverAll">7</a></td>
-    <td class="tocTableContentCell3"><a href="#DiscoverGrObjs">Discovering Objects in a Group</a>
-  </tr><tr valign="top"> 
-    <td class="tocTableContentCell2"> 
-    <a href="#DiscoverAll">8</a></td>
-    <td class="tocTableContentCell3"><a href="#DiscoverAll">Discovering All the Objects in the File</a>
-  </tr><tr valign="top"> 
-    <td class="tocTableContentCell2"> 
-    <a href="#Examples">9</a></td>
-    <td class="tocTableContentCell3"><a href="#Examples">Examples of File Structures</a>
-  </tr><tr valign="top"> 
-    <td class="tocTableContentCell"> 
-    <a href="#Appendix">10</a></td>
-    <td class="tocTableContentCell4"><a href="#Appendix">Appendix</a></td>
-  </tr>
--->
-
-<!--(END TOC VERS 1 and 2)==========================================-->
-
-<div align="center">
-<a name="TOP">
-<h2>Chapter 4<br /><font size="7">HDF5 Groups</font></h2>
-</a>
-</div>
-
-<a name="Intro">
-<h3>4.1. Introduction</h3>
-</a>
-
-<!-- editingComment
-<span class="editingComment">
-   [ [ [ 
-   The use of the term "path name" becomes rather stilted in this chapter.  
-   Add a note early on that the shorthand "path" is generally used as an 
-   equivalent.  Then edit "path name" ==> "path" where appropriate. 
-   ] ] ]
-  </span>
--->
-
-  <p>
-  As suggested by the name Hierarchical Data Format, 
-  an HDF5 file is hierarchically structured.  
-  The HDF5 group and link objects implement this hierarchy. </p>
-
-  <p>
-  In the simple and most common case, 
-  the file structure is a tree structure;
-  in the general case, the file structure may be a 
-  directed graph with a designated entry point.
-  The tree structure is very similar to the file system 
-  structures employed on UNIX systems, directories and files, 
-  and on Apple Macintosh and Microsoft Windows systems, 
-  folders and files.
-  HDF5 groups are analogous to the directories and folders;
-  HDF5 datasets are analogous to the files.</p>
- 
-  <p>
-  The one <span class="termemphasis">very important difference</span> 
-  between the HDF5 file structure and 
-  the above-mentioned file system analogs 
-  is that HDF5 groups are linked as a directed graph, 
-  allowing circular references;  
-  the file systems are strictly hierarchical, 
-  allowing no circular references.
-  The figures below illustrate the range of possibilities.  </p>
-
-  <p>
-  In Figure 1, the group structure is strictly hierarchical, 
-  identical to the file system analogs.</p>
-  
-
-   <p>
-   In Figures 2 and 3, the structure takes advantage of the 
-   directed graph’s allowance of circular references.  
-   In Figure 2, <code>GroupA</code> is not only 
-   a member of the root group, <code>/</code>, 
-   but a member of <code>GroupC</code>.  
-   Since Group C is a member of Group B 
-   and Group B is a member of Group A, 
-   Dataset1 can be accessed by means of the circular reference
-   <code>/Group A/Group B/Group C/Group A/Dataset1</code>.
-   Figure 3 illustrates an extreme case in which 
-   <code>GroupB</code> is a member of itself, enabling a 
-   reference to a member dataset such as 
-   <code>/Group A/Group B/Group B/Group B/Dataset2</code>.</p>
-
-
-<table align="center" width="400" border="0">
-    <tr valign="center" align="center">
-        <td>
-        <hr color="green" size="3"/>
-        <img height="250" src="Images/Group_fig1.jpg"></td>
-        </tr>
-    <tr valign="top" align="left">
-        <td>
-        <hr color="green" size="1" />
-        <b>Figure 1. An HDF5 file with a strictly hierarchical group structure</b> 
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-<table align="center" width="400" border="0">
-    <tr valign="center" align="center">
-        <td><hr color="green" size="3"/>
-        <img height="250" src="Images/Group_fig2,8.jpg"></td>
-        </tr>
-    <tr valign="top" align="left">
-        <td >
-        <hr color="green" size="1" />
-        <b>Figure 2. An HDF5 file with a directed graph group structure
-        including a circular reference</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-<table align="center" width="400" border="0">
-    <tr valign="center" align="center">
-        <td><hr color="green" size="3"/>
-        <img height="250" src="Images/Group_fig3.jpg"></td>
-        </tr>
-    <tr valign="top" align="left">
-        <td ><hr color="green" size="1" />
-        <b>Figure 3. An HDF5 file with a directed graph group structure
-        and one group as a member of itself</b><br />
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-
-
-<!-- NEW PAGE -->
-  <p>
-  As becomes apparent upon reflection,
-  directed graph structures can become quite complex;
-  caution is advised!</p>
-
-  <p>
-  The balance of this chapter discusses the following topics:</p>
-  <ul>
-    <li>The HDF5 group object (or a group)
-        and its structure in more detail</li>
-    <li>HDF5 link objects (or links)</li>
-    <li>The programming model for working with groups and links</li>
-    <li>HDF5 functions provided for working with groups, group members, and 
-        links</li>
-    <li>Retrieving information about objects in a group</li>
-    <li>Discovery of the structure of an HDF5 file and the contained objects</li>
-    <li>Examples of file structures</li>
-  </ul>
-
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="DGroupObj">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-
-<a name="DGroupObj">
-<h3 class=pagebefore>4.2. Description of the Group Object</h3>
-</a>
-
-<h4>4.2.1 The Group Object</h4>
-
-  <p>
-  Abstractly, an HDF5 group contains zero or more objects 
-  and every object must be a member of at least one group. 
-  The root group, the sole exception, may not belong to any group.</p>
-  
-  
-<table width = 400 cellspacing="0" align="center">
-  <tr valign="top"> 
-    <td align="center">
-    <hr color="green" size="3"/>
-    <img src="Images/groups_fig4.JPG">
-</td></tr>
-<tr><td><hr color="green" size="1" /></td></tr>
-<tr valign="top">
-<td align="left" >
-    <b>Figure 4. Abstract model of the HDF5 group object</b>
-     <hr color="green" size="3"/>
-</td></tr>
-</table>
-<br />
-
-
-
-  <p>
-  Group membership is actually implemented via 
-  <em>link</em> objects. See the figure above. 
-  A link object is owned by a group and points to a 
-  <em>named object</em>. 
-  Each link has a <em>name</em>, and each link points to 
-  exactly one object. 
-  Each named object has at least one and possibly many links to it.</p>
-
-  <p>There are three classes of named objects: <em>group</em>, 
-  <em>dataset</em>, and <em>named datatype</em>. See the figure below.  
-  Each of these objects is the member of at least one group, 
-  which means there is at least one link to it.</p>
-
-<table width="500" cellspacing="0" align="center">
-  <tr valign="top">
-    <td align="center"><hr color="green" size="3"/>
-    <img src="Images/groups_fig5.JPG">
-</td></tr>
-<tr><td><hr color="green" size="1" /></td></tr>
-<tr>
-<td align="left" ><b>Figure 5. Classes of named objects</b>
-     <hr color="green" size="3"/>
-</td></tr>
-</table>
-<br />
-
-
-  
-
-  <p>
-  The primary operations on a group are to 
-  add and remove members and to discover member objects. 
-  These abstract operations, as listed in the figure below, 
-  are implemented in the H5G APIs, as listed in section 4, 
-  “<a href="#GroupFuncSums">Group Function Summaries</a>.”</p>
-  
-  <p>
-  To add and delete members of a group, 
-  links from the group to <em>existing</em> objects in the file 
-  are created and deleted with the 
-  <code><em>link</em></code> and <code><em>unlink</em></code> operations. 
-  When a <em>new</em> named object is created,
-  the HDF5 Library executes the link operation in the background 
-  immediately after creating the object 
-  (i.e., a new object is added as a member of the group in which it 
-  is created without further user intervention).</p>
-  <p>
-  Given the name of an object, the <em>get_object_info</em> 
-  method retrieves a description of the object, 
-  including the number of references to it. 
-  The <em>iterate</em> method iterates through the members of 
-  the group, returning the name and type of each object.</p>
-  
-  
-<!--
-<table x-use-null-cells
-		width="600"
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-  <tr valign="top"> 
-    <td class="fullImgTableImgCell" align="center">
-    <img src="Images/groups_fig3.JPG">
--->
-
-<!-- NEW PAGE -->
-<table border="0" width ="300" align="center">
-  <tr valign="top"><td>  </td>
-    <td align="center"><hr color="green" size="3"/>
-    <br />
-    <table align="center" border="1">
-    <tr><td align="center"><code><b>Group</b></code></td></tr>
-    <tr><td align="left"><code>size:size_t</code></td></tr>
-    <tr><td align="left"><code>create()<br />
-                               open()<br />
-			       close()<br />
-			       <br />
-			       link()<br />
-			       unlink()<br />
-			       move()<br />
-			       <br />
-			       iterate()<br />
-			       get_object_info()<br />
-			       get_link_info()</code></td></tr>
-    </table>
-    <br />
-</td><td>  </td></tr>
-<tr><td>  </td>
-<td align="left" ><hr color="green" size="1"/>
-    <b>Figure 6. The group object</b><br />
-    <hr color="green" size="3"/>
-</td><td>  </td></tr>
-</table>
-<br />
-
-  <p>
-  Every HDF5 file has a single root group, with the 
-  name <code>/</code>.  The root group is identical to any 
-  other HDF5 group, except:</p>
-
-  <ul>
-      <li>The root group is automatically created when the 
-          HDF5 file is created (<code>H5Fcreate</code>).</li>
-      <li>The root group has no parent, but, by convention 
-          has a reference count of 1.</li>
-      <li>The root group cannot be deleted (i.e., unlinked)!</li>
-  </ul>
-
-
-<h4>4.2.2 The Hierarchy of Data Objects</h4>
-
-  <p>An HDF5 file is organized as a rooted, directed graph using 
-  HDF5 group objects.  The named data objects are the nodes of the graph, 
-  and the links are the directed arcs. 
-  Each arc of the graph has a name, with the special name <code>/</code>
-  reserved for the root group.  
-  New objects are created and then inserted into the graph with a link 
-  operation tht is automatically executed by the library;
-  existing objects are inserted into the graph with a link operation  
-  explicitly called by the user, which creates a named link from 
-  a group to the object. </p>
- 
-  <p>An object can be the target of more than one link.</p>
-  
-  <p>
-  <a name="SupScript1">The names on the links must be 
-  unique within each group, but there may be 
-  many links with the same name in different groups. 
-  These are unambiguous, because some ancestor must have a different name, 
-  or else they are the same object. 
-  The graph is navigated with path names, analogous to Unix file 
-  systems (see section 2.3, 
-  “<a href="#PathNames">HDF5 Path Names</a>”). 
-  An object can be opened with a full path starting 
-  at the root group, or with a relative path and a starting point.
-  That starting point is always a group, though it may be the 
-  current working group, another specified group, or 
-  the root group of the file. 
-  Note that all paths are relative to a single HDF5 file. 
-  In this sense, an HDF5 file is analogous to a single UNIX file system.
-  <a href="#FootNote"><sup><font size="-1">1</font></sup></a></p>
-  
-  <p>
-  It is important to note that, just like the UNIX file system, 
-  HDF5 objects do not have <em>names</em>, the names are associated 
-  with <em>paths</em>. 
-  An object has an <em>object identifier</em> that is unique within the file, 
-  but a single object may have many <em>names</em> because there may be  
-  many paths to the same object. 
-  An object can be renamed, or moved to another group, by adding and 
-  deleting links. In this case, the object itself never moves.  
-  For that matter, membership in a group has no implication 
-  for the physical location of the stored object.</p>
-  
-  <p>
-  Deleting a link to an object does not 
-  necessarily delete the object. 
-  The object remains available as long as there is at least one link to it.  
-  After all links to an object are deleted, it can no longer be opened, 
-  and the storage may be reclaimed.</p>
-    
-  <p>
-  It is also important to realize that the linking mechanism 
-  can be used to construct very complex graphs of objects. 
-  For example, it is possible for object to be shared between several 
-  groups and even to have more than one name in the same group. 
-  It is also possible for a group to be a member of itself, 
-  or to create other <em>cycles</em> in the graph, such as 
-  in the case where a child group is linked to one of its ancestors. </p>
-  
-  <p>
-  HDF5 also has <em>soft links</em> similar to UNIX soft links. 
-  A <em>soft link</em> is an object that has a name and a path name for 
-  the target object.  The soft link can be followed to open the target 
-  of the link just like a regular or <em>hard</em> link. 
-  The differences are that the hard link cannot be created if the 
-  target object does not exist and it always points to the same object. 
-  A soft link can be created with any path name, whether or not the 
-  object exists; it may or may not, therefore, be possible to follow 
-  a soft link.
-  Furthermore, a soft link’s target object may be changed.</p>
-
-<a name="PathNames">
-
-
-<h4>4.2.3 HDF5 Path Names</h4></a>
-
-<!-- editingComment
-  <span class="editingComment">  
-       [ [ [ 
-       The opening paragraph here is still foggy, and now a bit redundant.  
-       A discussion of objects before launching into the discussion of l
-       inks might be helpful? 
-       ] ] ]
-       </span>
--->
-       
-  <p>
-  The structure of the HDF5 file constitutes the name space 
-  for the objects in the file. 
-  A path name is a string of components separated by slashes 
-  (<code>/</code>). 
-  Each component is the name of a hard or soft link which points to 
-  an object in the file. 
-  The slash not only separates the components, but indicates their
-  hierarchical releationship; the component indicated by the link name  
-  following a slash is a always a member of the component indicated by 
-  the link name preceding that slash.</p>
-  
-  <p>
-  The first component in the path name may be any of the following:</p>
-  <ul><li>the special character dot (<code>.</code>, a period), 
-          indicating the current group </li>
-      <li>the special character slash (<code>/</code>), 
-          indicating the root group </li>
-      <li>any member of the current group </li>
-  </ul>
-  
-  <p>
-  Component link names may be any string of ASCII characters 
-  not containing a slash or a dot 
-  (<code>/</code> and <code>.</code>, which are reserved as noted above).
-  However, users are advised to avoid the use of punctuation and 
-  non-printing characters, as they may create problems for other software. 
-  The figure below provides a BNF grammar for HDF5 path names.</p>
-  
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top">
-        <td><hr color="green" size="3"/>
-<pre><code>
-  PathName ::= AbsolutePathName | RelativePathName
-  Separator ::= "/" ["/"]*
-  AbsolutePathName ::= Separator [ RelativePathName ]
-  RelativePathName ::= Component [ Separator RelativePathName ]*
-  Component ::=  "." |  Characters
-  Characters ::= Character+   -  { "." }
-  Character ::= {c:  c � { { legal ASCII characters } - {'/'} }
-</code></pre>
-        </td></tr>
-    <tr>
-        <td align="left"><hr color="green" size="1"/>
-        <b>Figure 7. A BNF grammar for HDF5 path names</b>
-    <hr color="green" size="3"/>
-</td></tr>
-</table>
-<br />
-
-
-<!-- NEW PAGE -->
-  An object can always be addressed by a either a
-  <em>full or absolute</em> path name, starting at the root group,
-  or by a <em>relative</em> path name, starting in a known location 
-  such as the current working group.
-  As noted elsewhere, a given object may have multiple full and 
-  relative path names. 
-  
-  <p>
-  Consider, for example, the file illustrated in the figure below.
-  <code>Dataset1</code> can be identified by either of these 
-  absolute path names:</p>
-  <pre>
-    /GroupA/Dataset1
-    /GroupA/GroupB/GroupC/Dataset1</pre>
-    
-  <p>
-  Since an HDF5 file is a directed graph structure, and is therefore 
-  not limited to a strict tree structure, and 
-  since this illustrated file includes the sort of circular reference
-  that a directed graph enables, 
-  <code>Dataset1</code> can also be identified by this absolute path name:</p>
-  <pre>
-    /GroupA/GroupB/GroupC/GroupA/Dataset1</pre>
-
-  <p>
-  Alternatively, if the current working location is <code>GroupB</code>,
-  <code>Dataset1</code> can be identified by either of these 
-  relative path names:</p>
-  <pre>
-    GroupC/Dataset1
-    GroupC/GroupA/Dataset1</pre>
-  
-  <p>
-  Note that relative path names in HDF5 do not employ the 
-  <code>../</code> notation, the UNIX notation indicating a 
-  parent directory, to indicate a parent group.</p>
-
-<table width="400" align="center" border="0">
-    <tr valign="bottom" align="center">
-        <td><hr color="green" size="3"/>
-            <img src="Images/Group_fig2,8.jpg">
-            </td></tr>
-    <tr valign="top" align="left">
-        <td ><hr color="green" size="1"/>
-        <b>Figure 8.
-        An HDF5 file with a directed graph group structure
-        including a circular reference</b>
-        <hr color="green" size="3"/>
-        </td></tr>
-</table>
-<br />
-
-
-
-<!-- *** BEGIN _topic/group_implementations.htm NEAR DUPLICATE *** -->
-<!-- *** SEE editingComment FOLLOWING SECTION HEADING          *** -->
-
-<a name="GroupStyles">
-<h4>4.2.4 Group Implementations in HDF5</h4></a>
-
-<!-- editingComment
-  <span class="editingComment">  
-       [ [ [ 
-       This section is a close copy of but not identical to 
-       _topic/group_implementations.htm, which is sourced into the RM.
-       If/when the UG is broken into smaller files, re-unifying these 
-       sections should be considered.
-       ] ] ]
-       </span>
--->
-       
-  <p>
-  The original HDF5 group implementation provided 
-  a single indexed structure for link storage.
-  A new group implementation, in HDF5 Release 1.8.0,
-  enables more efficient compact storage for very small groups,
-  improved link indexing for large groups,
-  and other advanced features.</p>
-  <ul>
-    <li>The <i>original indexed</i> format remains the default.
-        Links are stored in a B-tree in the group’s local heap.</li>
-    <li>Groups created in the new <i>compact-or-indexed</i> format, 
-        the implementation introduced with Release 1.8.0,
-        can be tuned for performance, 
-        switching between the compact and indexed formats 
-        at thresholds set in the user application.</li>
-    <ul>
-        <li>The <i>compact</i> format will conserve file space
-            and processing overhead when working with small groups and 
-            is particularly valuable when a group contains no links.
-            Links are stored as a list of messages in the group’s
-            header.</li>
-        <li>The <i>indexed</i> format will yield improved performance
-            when working with large groups, e.g., groups containing
-            thousands to millions of members.
-            Links are stored in a fractal heap and 
-            indexed with an improved B-tree.</li>
-    </ul>
-    <li>The new implementation also enables the use of link names 
-        consisting of non-ASCII character sets 
-        (see <a href="../RM/RM_H5P.html#Property-SetCharEncoding">
-        <code>H5Pset_char_encoding</code></a>)
-        and is required for all link types other than hard or soft links,
-        e.g., external and user-defined links
-        (see the <a href="../RM/RM_H5L.html">H5L APIs</a>).</li>
-  </ul>
-
-  <p>
-  The original group structure and the newer structures 
-  are not directly interoperable. 
-  By default, a group will be created in the original indexed format.
-  An existing group can be changed to a compact-or-indexed format 
-  if the need arises; there is no capability to change back.
-  As stated above, once in the compact-or-indexed format, 
-  a group can switch between compact and indexed as needed.</p>
-
-  <p>
-  Groups will be initially created in the compact-or-indexed format
-  only when one or more of the following conditions is met:</p>
-  <ul>
-    <li>The <i>low version bound</i> value of 
-        the <i>library version bounds</i> property 
-        has been set to Release 1.8.0 or later 
-        in the file access property list
-        (see <a href="../RM/RM_H5P.html#Property-SetLibverBounds">
-        <code>H5Pset_libver_bounds</code></a>).
-        Currently, that would require an <code>H5Pset_libver_bounds</code>
-        call with the <em>low</em> parameter set to
-        <code>H5F_LIBVER_LATEST</code>.
-        <p>
-        When this property is set for an HDF5 file, all objects in the file 
-        will be created using the latest available format; no effort will
-        be made to create a file that can be read by older libraries.</li>
-    <li>The creation order tracking property, 
-        <code>H5P_CRT_ORDER_TRACKED</code>, has been set  
-        in the group creation property list
-        (see <a href="../RM/RM_H5P.html#Property-SetLinkCreationOrder">
-        <code>H5Pset_link_creation_order</code></a>).</li>
-  </ul>
-
-  <p>
-  <!--
-  The compact-or-indexed format also enables completely new capabilities:
-  user-defined and external links and non-ASCII link names.
-  -->
-  An existing group, currently in the original indexed format, 
-  will be converted to the compact-or-indexed format 
-  upon the occurrence of any of the following events:</p>
-  <ul>
-    <li>An external or user-defined link is inserted into the group.</li>
-    <li>A link named with a string composed of non-ASCII characters 
-        is inserted into the group.</li>
-
-  <!-- QUESTION -- REVEAL THIS CIRCUMSTANCE ONLY AFTER (AND IF!) 
-                -- IT IS IMPLEMENTED, THEN DELETE THE COMMENT
-
-    <li>The <code>max_compact</code> and <code>min_dense</code>
-        properties have been set in the group creation property list
-        (see <a href="../RM/RM_H5P.html#Property-SetLinkPhaseChange">
-        <code>H5Pset_link_phase_change</code></a>).
-                                                         <br /><i><b>
-                                                              [ [ [
-                                  Masked bullet, immediately above:
-                                         Not currently implemented.  
-                                                  -- June 2007, FMB
-                    Confirmed with NF that H5Pset_link_phase_change 
-                       still does not trigger a group style change.
-                                                -- August 2010, FMB
-                                                              ] ] ]
-                                                           </b></i>
-  -->
-  </ul>
-
-  <p>
-  The compact-or-indexed format offers performance improvements 
-  that will be most notable at the extremes, 
-  i.e., in groups with zero members 
-  and in groups with tens of thousands of members.  
-  But measurable differences may sometimes appear 
-  at a threshold as low as eight group members.
-  Since these performance thresholds and criteria differ from
-  application to application, tunable settings are provided to 
-  govern the switch between the compact and indexed formats
-  (see <a href="../RM/RM_H5P.html#Property-SetLinkPhaseChange">
-  <code>H5Pset_link_phase_change</code></a>).
-  Optimal thresholds will depend on the application and the 
-  operating environment.</p>
-
-  <p>
-  Future versions of HDF5 will retain the ability to 
-  create, read, write, and manipulate 
-  all groups stored in either the original indexed format or
-  the compact-or-indexed format.</p>
-
-<!-- *** END _topic/group_implementations.htm NEAR DUPLICATE *** -->
-
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="h5dump">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<!-- NEW PAGE -->
-<a name="H5Dump">
-<h3 class=pagebefore>4.3. Using <code>h5dump</code></h3>
-</a>
-
-  <p>You can use <code>h5dump</code>, the command-line utility 
-  distributed with HDF5, to examine a file for purposes either of 
-  determining where to create an object within an HDF5 file or 
-  to verify that you have created an object in the intended place.
-  inspecting the contents of an HDF5 file.</p>
-
-  <p>
-  In the case of the new group created in section 5.1, 
-  “<a href="#ModelCreateGroup">Creating a group</a>,” 
-  the following <code>h5dump</code> command will display the 
-  contents of <code>FileA.h5</code>:</p>
-
-<dir><pre>
-h5dump FileA.h5 
-</pre></dir>
-
-  <p>
-  Assuming that the discussed objects, <code>GroupA</code> and 
-  <code>GroupB</code> are the only objects that exist in 
-  <code>FileA.h5</code>, the output will look something like the 
-  following:</p>
-
-<dir><pre>
-HDF5 "FileA.h5" {
-GROUP "/" {
-GROUP GroupA {
-GROUP GroupB {
-}
-}
-}
-}
-</pre></dir>
-
-  <p>
-  <code>h5dump</code> is fully described on the 
-  <a href="../RM/Tools.html" target="RMwindow">Tools</a> page of the 
-  <a href="../RM/RM_H5Front.html" 
-  target="RMwindow"><cite>HDF5 Reference Manual</cite></a>.</p>
-  
-  <p>The HDF5 DDL grammar is fully described in the document
-  <a href="../ddl.html" target="RMwindow">DDL in BNF for HDF5</a>, 
-  an element of this <cite>HDF5 User’s Guide</cite>.</p>
-
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="GroupFuncSums">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<!-- NEW PAGE -->
-<a name="GroupFuncSums">
-<h3 class=pagebefore>4.4. Group Function Summaries</h3>
-</a>
-<p>Functions that can be used with groups (H5G functions) and property 
-list functions that can used with groups (H5P functions) are listed below. 
-A number of group functions have been deprecated. Most of these have become 
-link (H5L) or object (H5O) functions. These replacement functions are also
-listed below.</p>
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 1. Group functions (H5G)</b></td>
-        </tr>
-    <tr height="5"><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td colspan=1 rowspan=1>
-        <code>H5Gcreate<br />h5gcreate_f</code> 
-        </td><td> </td>
-        <td colspan=1 rowspan=1>
-        Creates a new empty group and gives it a name. The C function is a 
-        macro: see <a href="../RM/APICompatMacros.html">“API 
-        Compatibility Macros in HDF5.”</a>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td colspan=1 rowspan=1>
-        <code>H5Gcreate_anon<br />h5gcreate_anon_f</code> 
-        </td><td> </td>
-        <td colspan=1 rowspan=1>
-        Creates a new empty group without linking it into the file structure. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Gopen<br />h5gopen_f</code> 
-        </td><td> </td>
-        <td>
-        Opens an existing group for modification and returns a group 
-        identifier for that group. The C function is a 
-        macro: see <a href="../RM/APICompatMacros.html">“API 
-        Compatibility Macros in HDF5.”</a>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Gclose<br />h5gclose_f</code> 
-        </td><td> </td>
-        <td>
-        Closes the specified group.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Gget_create_plist<br />h5gget_create_plist_f</code> 
-        </td><td> </td>
-        <td>
-        Gets a group creation property list identifier. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Gget_info<br />h5gget_info_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves information about a group. 
-        Use instead of <code>H5Gget_num_objs</code>.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Gget_info_by_idx<br />h5gget_info_by_idx_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves information about a group according to the group�s 
-        position within an index. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Gget_info_by_name<br />h5gget_info_by_name_f</code>
-        </td><td> </td>
-        <td>
-        Retrieves information about a group. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>(none)<br />h5gget_obj_info_idx_f</code> 
-        </td><td> </td>
-        <td>
-        Returns name and type of the group member identified by its index.
-        Use with the <code>h5gn_members_f</code> function. 
-        <code>h5gget_obj_info_idx_f</code> and <code>h5gn_members_f</code> 
-        are the Fortran equivalent of 
-        the C function <code>H5Literate</code>.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>(none)<br />h5gn_members_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the number of group members.
-        Use with the <code>h5gget_obj_info_idx_f</code> function. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 2. Link (H5L) and object (H5O) functions
-        </b></td>
-    </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-  <tr valign="top"> 
-    <td>
-        <b>C Function<br />Fortran Function</b>
-    </td><td> </td>
-    <td>
-        <b>Purpose</b>
-    </td>
-  </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-  <tr valign="top"> 
-    <td>
-	<code>H5Lcreate_hard<br />h5lcreate_hard_f</code> 
-    </td><td> </td>
-    <td>
-	Creates a hard link to an object. 
-        Replaces <code>H5Glink</code> and <code>H5Glink2</code>.
-    </td>
-  </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-  <tr valign="top"> 
-    <td>
-	<code>H5Lcreate_soft<br />h5lcreate_soft_f</code> 
-    </td><td> </td>
-    <td>
-	Creates a soft link to an object. 
-        Replaces <code>H5Glink</code> and <code>H5Glink2</code>.
-    </td>
-  </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-  <tr valign="top"> 
-    <td>
-	<code>H5Lcreate_external<br />h5lcreate_external_f</code> 
-    </td><td> </td>
-    <td>
-	Creates a soft link to an object in a different file. 
-        Replaces <code>H5Glink</code> and <code>H5Glink2</code>.
-    </td>
-  </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-  <tr valign="top"> 
-    <td>
-	<code>H5Lcreate_ud<br />(none)</code> 
-    </td><td> </td>
-    <td>
-	Creates a link of a user-defined type. 
-    </td>
-  </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-  <tr valign="top"> 
-    <td>
-	<code>H5Lget_val<br />(none)</code> 
-    </td><td> </td>
-    <td>
-	Returns the value of a symbolic link. 
-        Replaces <code>H5Gget_linkval</code>.
-    </td>
-  </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-  <tr valign="top"> 
-    <td>
-	<code>H5Literate<br />h5literate_f</code> 
-    </td><td> </td>
-    <td>
-	Iterates through links in a group. 
-        Replaces <code>H5Giterate</code>.
-        See also <code>H5Ovisit</code> and <code>H5Lvisit</code>.
-    </td>
-  </tr>
-  <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-  <tr valign="top"> 
-        <td>
-        <code>H5Literate_by_name<br />h5literate_by_name_f</code> 
-        </td><td> </td>
-        <td>
-        Iterates through links in a group. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Lvisit<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Recursively visits all links starting from a specified group. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Ovisit<br />h5ovisit_f</code> 
-        </td><td> </td>
-        <td>
-        Recursively visits all objects accessible from a specified object. 
-        </td>
-        </tr>
-  <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-  <tr valign="top"> 
-    <td>
-	<code>H5Lget_info<br />h5lget_info_f</code> 
-    </td><td> </td>
-    <td>
-	Returns information about a link. 
-        Replaces <code>H5Gget_objinfo</code>. 
-    </td>
-  </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-  <tr valign="top"> 
-    <td>
-	<code>H5Oget_info<br />(none)</code> 
-    </td><td> </td>
-    <td>
-	Retrieves the metadata for an object specified by an identifier. 
-        Replaces <code>H5Gget_objinfo</code>. 
-    </td>
-  </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-  <tr valign="top"> 
-    <td>
-	<code>H5Lget_name_by_idx<br />h5lget_name_by_idx_f</code> 
-    </td><td> </td>
-    <td>
-	Retrieves name of the nth link in a group, according to the order 
-        within a specified field or index.
-        Replaces <code>H5Gget_objname_by_idx</code>.
-    </td>
-  </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-  <tr valign="top"> 
-    <td>
-	<code>H5Oget_info_by_idx<br />(none)</code> 
-    </td><td> </td>
-    <td>
-	Retrieves the metadata for an object, identifying the object by an 
-        index position. 
-        Replaces <code>H5Gget_objtype_by_idx</code>.
-    </td>
-  </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-  <tr valign="top"> 
-    <td>
-	<code>H5Oget_info_by_name<br />h5oget_info_by_name_f</code> 
-    </td><td> </td>
-    <td>
-    Retrieves the metadata for an object, identifying the object by 
-    location and relative name. 
-    </td>
-  </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-  <tr valign="top"> 
-    <td>
-	<code>H5Oset_comment<br />(none)</code> 
-    </td><td> </td>
-    <td>
-	Sets the comment for specified object. 
-        Replaces <code>H5Gset_comment</code>.
-    </td>
-  </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-  <tr valign="top"> 
-    <td>
-	<code>H5Oget_comment<br />(none)</code> 
-    </td><td> </td>
-    <td>
-	Gets the comment for specified object. 
-        Replaces <code>H5Gget_comment</code>.
-    </td>
-  </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-  <tr valign="top"> 
-    <td>
-	<code>H5Ldelete<br />h5ldelete_f</code> 
-    </td><td> </td>
-    <td>
-	Removes a link from a group. 
-        Replaces <code>H5Gunlink</code>.
-    </td>
-  </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-  <tr valign="top"> 
-    <td>
-	<code>H5Lmove<br />h5lmove_f</code> 
-    </td><td> </td>
-    <td>
-	Renames a link within an HDF5 file. 
-        Replaces <code>H5Gmove</code> and <code>H5Gmove2</code>.
-    </td>
-  </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 3. Group creation property list functions (H5P)
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <span class="TableHead">C Function<br />Fortran Function</span>
-        </td><td> </td>
-        <td>
-        <span class="TableHead">Purpose</span>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pall_filters_avail<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Verifies that all required filters are available.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_filter<br />h5pget_filter_f</code> 
-        </td><td> </td>
-        <td>
-        Returns information about a filter in a pipeline. The C function 
-        is a macro: see <a href="../RM/APICompatMacros.html">“API 
-        Compatibility Macros in HDF5.”</a>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_filter_by_id<br />h5pget_filter_by_id_f</code> 
-        </td><td> </td>
-        <td>
-        Returns information about the specified filter. The C function 
-        is a macro: see <a href="../RM/APICompatMacros.html">“API 
-        Compatibility Macros in HDF5.”</a>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_nfilters<br />h5pget_nfilters_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the number of filters in the pipeline.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pmodify_filter<br />h5pmodify_filter_f</code> 
-        </td><td> </td>
-        <td>
-        Modifies a filter in the filter pipeline.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Premove_filter<br />h5premove_filter_f</code> 
-        </td><td> </td>
-        <td>
-        Deletes one or more filters in the filter pipeline.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_deflate<br />h5pset_deflate_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the deflate (GNU gzip) compression method and compression 
-        level.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_filter<br />h5pset_filter_f</code> 
-        </td><td> </td>
-        <td>
-        Adds a filter to the filter pipeline.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_fletcher32<br />h5pset_fletcher32_f</code> 
-        </td><td> </td>
-        <td>
-        Sets up use of the Fletcher32 checksum filter.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_fletcher32<br />h5pset_fletcher32_f</code> 
-        </td><td> </td>
-        <td>
-        Sets up use of the Fletcher32 checksum filter.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_link_phase_change<br />h5pset_link_phase_change_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the parameters for conversion between compact and dense groups.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_link_phase_change<br />h5pget_link_phase_change_f</code> 
-        </td><td> </td>
-        <td>
-        Queries the settings for conversion between compact and dense groups. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_est_link_info<br />h5pset_est_link_info_f</code> 
-        </td><td> </td>
-        <td>
-        Sets estimated number of links and length of link names in a group. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_est_link_info<br />h5pget_est_link_info_f</code> 
-        </td><td> </td>
-        <td>
-        Queries data required to estimate required local heap or object 
-        header size. 
-        </td>
-        </tr>
-    <!-- NEW PAGE -->
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_nlinks<br />h5pset_nlinks_f</code> 
-        </td><td> </td>
-        <td>
-        Sets maximum number of soft or user-defined link traversals. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_nlinks<br />h5pget_nlinks_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the maximum number of link traversals. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_link_creation_order<br />
-        h5pset_link_creation_order_f</code> 
-        </td><td> </td>
-        <td>
-        Sets creation order tracking and indexing for links in a group. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_link_creation_order<br />
-        h5pget_link_creation_order_f</code> 
-        </td><td> </td>
-        <td>
-        Queries whether link creation order is tracked and/or indexed 
-        in a group. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_create_intermediate_group<br />
-        h5pset_create_inter_group_f</code> 
-        </td><td> </td>
-        <td>
-        Specifies in the property list whether to create missing intermediate 
-        groups. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_create_intermediate_group<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Determines whether the property is set to enable creating missing 
-        intermediate groups. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_char_encoding<br />h5pset_char_encoding_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the character encoding used to encode a string. 
-        Use to set ASCII or UTF-8 character encoding for object names.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_char_encoding<br />h5pget_char_encoding_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the character encoding used to create a string. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 4. Other external link functions
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset/get_elink_file_cache_size</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Sets/retrieves the size of the external link open file cache 
-        from the specified file access property list. </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Fclear_elink_file_cache</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Clears the external link open file cache for a file. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="ProgModel">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<!-- NEW PAGE -->
-<a name="ProgModel">
-<h3 class=pagebefore>4.5. Programming Model: Working with Groups</h3>
-</a>
-
-  <p>The programming model for working with groups is as follows:</p>
-
-  <ol>
-      <li>Create a new group or open an existing one. </li>
-      <li>Perform the desired operations on the group.  </li>
-      <ul>
-          <li>Create new objects in the group.</li>
-          <li>Insert existing objects as group members.</li>
-	  <li>Delete existing members.</li>
-	  <li>Open and close member objects.</li>
-	  <li>Access information regarding member objects.</li>
-	  <li>Iterate across group members.</li>
-	  <li>Manipulate links.</li>
-      </ul>
-      <li>Terminate access to the group.  (Close the group.)</li>
-  </ol>
- 
-<a name="ModelCreateGroup"> 
-<h4>4.5.1 Creating a Group</h4></a>
- 
-  <p>
-  To create a group, use <code>H5Gcreate</code>, specifying the 
-  location and the path of the new group. 
-  The location is the identifier of the file or the group in a file
-  with respect to which the new group is to be identified.  
-  The path is a string that provides wither an absolute path or a 
-  relative path to the new group (see section 2.3, 
-  “<a href="#PathNames">HDF5 Path Names</a>”).  
-  A path that begins with a slash (<code>/</code>) is an absolute path
-  indicating that it locates the new group from the root group of the 
-  HDF5 file.  
-  A path that begins with any other character is a relative path. 
-  When the location is a file, a relative path is a path from that 
-  file’s root group; 
-  when the location is a group, a relative path is a path from that group.</p>
-  
-  <p>
-  The sample code in the example below creates three groups. 
-  The group <code>Data</code> is created in the root directory;  
-  two groups are then created in <code>/Data</code>, 
-  one with absolute path, the other with a relative path.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-<pre>
-  hid_t file;
-  file = H5Fopen(....);
-
-  group = H5Gcreate(file, "/Data", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-  group_new1 = H5Gcreate(file, "/Data/Data_new1", H5P_DEFAULT, H5P_DEFAULT, 
-      H5P_DEFAULT);
-  group_new2 = H5Gcreate(group, "Data_new2", H5P_DEFAULT, H5P_DEFAULT, 
-      H5P_DEFAULT);
-</pre>
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Example 1. Creating three new groups</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>
-  The third <code>H5Gcreate</code> parameter optionally specifies 
-  how much file space to reserve to store the names that will 
-  appear in this group.  If a non-positive value is supplied, 
-  a default size is chosen.  </p>
-<!-- editingComment
-  <span class="editingComment"> 
-      (See XXX for an explanation of performance tuning.)
-      </span>
--->  
-
-<!-- NEW PAGE -->
-<h4>4.5.2 Opening a Group and Accessing an Object in that Group</h4>
-  
-  <p>Though it is not always necessary, it is often useful to explicitely
-  open a group when working with objects in that group. Using the file 
-  created in the example above, the example below illustrates the use 
-  of a previously-acquired file identifier and a path relative to that 
-  file to open the group <code>Data</code>.</p> 
-
-  <p>
-  Any object in a group can be also accessed by its absolute or relative path. 
-  To open an object using a relative path, an application must first open 
-  the group or file on which that relative path is based.  
-  To open an object using an absolute path, the application can use any 
-  location identifier in the same file as the target object;
-  the file identifier is commonly used, but object identifier for any object 
-  in that file will work.  
-  Both of these approaches are illustrated in the example below. </p>
-  
-  <p>
-  Using the file created in the examples above, 
-  the example below provides sample code illustrating the use of both 
-  relative and absolute paths to access an HDF5 data object.  
-  The first sequence (two function calls) uses a previously-acquired 
-  file identifier to open the group <code>Data</code>, and 
-  then uses the returned group identifier and a relative path to open 
-  the dataset <code>CData</code>.  
-  The second approach (one function call) uses the same previously-acquired 
-  file identifier and an absolute path to open the same dataset. </p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-<pre>
-  group = H5Gopen(file, "Data", H5P_DEFAULT);
-  dataset1 = H5Dopen(group, "CData", H5P_DEFAULT);
-  
-  dataset2 = H5Dopen(file, "/Data/CData", H5P_DEFAULT);
-</pre>
-</td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Example 2. Open a dataset with relative and absolute paths</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<h4>4.5.3 Creating a Dataset in a Specific Group</h4>
-  
-  <p>Any dataset must be created in a particular group. 
-  As with groups, a dataset may be created in a particular group 
-  by specifying its absolute path or a relative path. 
-  The example below illustrates both approaches to creating a 
-  dataset in the group <code>/Data</code>.</p>
-  
-  
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-<pre>
-  dataspace = H5Screate_simple(RANK, dims, NULL);
-  dataset1 = H5Dcreate(file, "/Data/CData", H5T_NATIVE_INT,
-                    dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-  group = H5Gopen(file, "Data", H5P_DEFAULT);
-  dataset2 = H5Dcreate(group, "Cdata2", H5T_NATIVE_INT,
-                    dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-</pre>
-</td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Example 3. Create a dataset with absolute and relative paths</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<!-- NEW PAGE -->
-<h4>4.5.4 Closing a Group</h4>
-  
-  <p>To ensure the integrity of HDF5 objects and to release system 
-  resources, an application should always call the appropriate 
-  close function when it is through working with an HDF5 object. 
-  In the case of groups, <code>H5Gclose</code> ends access to the group 
-  and releases any resources the HDF5 Library has maintained 
-  in support of that access, including the group identifier.  </p>
-  
-  <p> 
-  As illustrated in the example below, all that is required for an 
-  <code>H5Gclose</code> call is the group identifier acquired when 
-  the group was opened; there are no relative versus absolute path 
-  considerations.</p>
-  
-  
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-<pre>
-  herr_t status;
-  status = H5Gclose(group);
-</pre>
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Example 4. Close a group</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-  <p>
-  A non-negative return value indicates that the group was successuflly 
-  closed and the resources released; a negative return value indicates that
-  the attempt to close the group or release resources failed.</p>
-
-<!-- editingComment
-  <span class="editingComment">  
-         [ [ [ 
-	 Return values have been decidely under-discussed prior to this mention. 
-	 Probably ought to be mentioned with the discussion of each new function call. 
-	 ] ] ]
-	 </span> 
--->
-
-
-<h4>4.5.5 Creating Links </h4>
-
-  <p>As previously mentioned, every object is created in a specific group. 
-  Once created, an object can be made a member of additional groups by means  
-  of links created with one of the <code>H5Lcreate_*</code> functions.</p>
-
-  <p>
-  A <span class="termDefinition">link</span> is, in effect, a path 
-  by which the target object can be accessed; it therefore has a 
-  name which functions as a single path component. 
-  A link can be removed with an <code>H5Ldelete</code> call, effectively 
-  removing the target object from the group that contained the link
-  (assuming, of course, that the removed link was the only link to the 
-  target object in the group). </p>
-  
-  
-  <p>
-  <strong>Hard Links</strong><br />
-  There are two kinds of links, <span class="termDefinition">hard links</span> 
-  and <span class="termDefinition">symbolic links</span>. 
-  Hard links are reference counted; symbolic links are not. 
-  When an object is created, a hard link is automatically created.
-  An object can be deleted from the file by removing all the hard links to it.</p>
-
-  <p>
-  Working with the file from the previous examples, 
-  the code in the example below illustrates the creation of a hard link,
-  named <code>Data_link</code>, in the root group, <code>/</code>, 
-  to the group <code>Data</code>. 
-  Once that link is created, the dataset <code>Cdata</code> can be accessed 
-  via either of two absolute paths, <code>/Data/Cdata</code> or 
-  <code>/Data_Link/Cdata</code>.</p>
-  
-  
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-<pre>
-  status = H5Lcreate_hard(Data_loc_id, "Data", DataLink_loc_id, "Data_link", 
-            H5P_DEFAULT, H5P_DEFAULT)
-
-  dataset1 = H5Dopen(file, "/Data_link/CData", H5P_DEFAULT);
-  dataset2 = H5Dopen(file, "/Data/CData", H5P_DEFAULT);
-</pre>
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 5. Create a hard link</b> 
-        <hr color="green" size="3"/></td></tr>
-</table>
-<br />
-
-
-
-<!-- NEW PAGE -->
-  <p>
-  The example below shows example code to delete a link,
-  deleting the hard link <code>Data</code> from the root group. 
-  The group <code>/Data</code> and its members are still in the file, 
-  but they can no longer be accessed via a path using the component 
-  <code>/Data</code>.</p>
-  
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-<pre>
-  status = H5Ldelete(Data_loc_id, "Data", H5P_DEFAULT);
-
-  dataset1 = H5Dopen(file, "/Data_link/CData", H5P_DEFAULT);
-             /*  This call should succeed; all path component still exist*/
-  dataset2 = H5Dopen(file, "/Data/CData", H5P_DEFAULT);  
-             /*  This call will fail; the path component '/Data' has been deleted*/
-</pre>
-</td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 6. Delete a link </b> 
-        <hr color="green" size="3"/></td></tr>
-</table>
-<br />
-
-
-
-  <p>
-  When the last hard link to an object is deleted, the object is no longer 
-  accessible. <code>H5Ldelete</code> will not prevent you from deleting 
-  the last link to an object. To see if an object has only one link, 
-  use the <code>H5Oget_info</code> function. If the value of the rc 
-  (reference count) field in the is greater than 1, then the link can 
-  be deleted without making the object inaccessible.</p>
-  
-  <p>The example below shows <code>H5Oget_info</code> 
-  to the group originally called <code>Data</code>. </p>
-
-  
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-<pre>
-  status = H5Oget_info(Data_loc_id, object_info);
-</pre>
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 7. Finding the number of links to an object</b>
-        <hr color="green" size="3"/></td></tr>
-</table>
-<br />
-
-
-
-  <p>It is possible to delete the last hard link to an object and not make 
-  the object inaccessible. Suppose your application opens a dataset, and 
-  then deletes the last hard link to the dataset. While
-  the dataset is open, your application still has a connection to the 
-  dataset. If your application creates a hard link to the dataset before 
-  it closes the dataset, then the dataset will still be accessible.</p>
-  <p>
-  <strong>Symbolic Links</strong><br />
-  <span class="termDefinition">Symbolic links</span> are objects that assign a name 
-  in a group to a path. 
-  Notably, the target object is determined only when the symbolic link is accessed, 
-  and may, in fact, not exist.  Symbolic links are not reference counted, 
-  so there may be zero, one, or more symbolic links to an object. </p>
-
-  <p>
-  The major types of symbolic links are soft links and external links. Soft 
-  links are symbolic links within an HDF5 file and are created with the 
-  <code>H5Lcreate_soft</code> function. Symbolic links to 
-  objects located in external files, in other words external links, can be 
-  created with the <code>H5Lcreate_external</code> function. Symbolic links 
-  are removed with the <code>H5Ldelete</code> function.</p>
-  
-
-  <p>
-  The example below shows the creating two soft links to the 
-  group <code>/Data</code>. </p>
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-<pre>
-  status = H5Lcreate_soft(path_to_target, link_loc_id, "Soft2", H5P_DEFAULT, H5P_DEFAULT);
-  status = H5Lcreate_soft(path_to_target, link_loc_id, "Soft3", H5P_DEFAULT, H5P_DEFAULT);
-
-  dataset = H5Dopen(file, "/Soft2/CData", H5P_DEFAULT);
-</pre>
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 8. Create a soft link </b> 
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>
-  With the soft links defined in the example above, the dataset <code>CData</code> 
-  in the group <code>/Data</code> can now be opened with any of the names 
-  <code>/Data/CData</code>, <code>/Soft2/CData</code>, or 
-  <code>/Soft3/CData</code>.</p>
-
-  <p>In release 1.8.7, a cache was added to hold the names of files 
-  accessed via external links. The size of this cache can be changed 
-  to help improve performance. For more information, see the entry 
-  in the <a href="../RM/RM_H5Front.html" target="RMwindow">
-  <cite>HDF5 Reference Manual</cite></a> for the 
-  <code>H5Pset_elink_file_cache_size</code> function call. 
-  </p>
-
-
-  
-  <p>
-  <strong>Note Regarding Hard Links and Soft Links</strong><br />
-  Note that an object’s existence in a file is governed by the presence
-  of at least one hard link to that object.
-  If the last hard link to an object is removed, the object is removed 
-  from the file and any remaining soft link becomes a 
-  <span class="termDefinition">dangling link</span>, a link whose target
-  object does not exist.</p>
-  
-  <p>
-  <strong>Moving or Renaming Objects, and a Warning</strong></p>
-  
-  <p>An object can be renamed by changing the name of a link to it with 
-  <code>H5Lmove</code>. 
-  This has the same effect as creating a new link with the new name and 
-  deleting the link with the old name.</p>
-  
-
-  <p>
-  Exercise caution in the use of <code>H5Lmove</code>
-  and <code>H5Ldelete</code> as these functions each include a step that 
-  unlinks a pointer to an HDF5 object. 
-  If the link that is removed is on the only path leading to an HDF5 object, 
-  that object will become permanently inaccessible in the file. </p>
-
-  <p>Scenario 1: Removing the Last Link</p>
-  <p>To avoid removing the last link to an object or otherwise making an 
-  object inaccessible, use the <code>H5Oget_info</code> 
-  function. Make sure that the value of the reference count field (rc) is 
-  greater than 1. 
-  </p>
-
-  <p>Scenario 2: Moving a Link that Isolates an Object</p>
-  <p>Consider the following example: assume that the group <code>group2</code> 
-  can only be accessed via the following path, where <code>top_group</code> 
-  is a member of the file’s root group: </p>
-  
-  <code>/top_group/group1/group2/</code>
-
-  <p>
-  Using <code>H5Lmove</code>, <code>top_group</code> 
-  is renamed to be a member  of <code>group2</code>. At this point, 
-  since <code>top_group</code> was the only route from the root group to 
-  <code>group1</code>, there is no longer a path by which one can access 
-  <code>group1</code>, <code>group2</code>, or any member datasets. 
-  And since <code>top_group</code> is now a member of <code>group2</code>,
-  <code>top_group</code> itself and any member datasets have thereby also 
-  become inaccessible.</p>
-  
-
-  
-  
-  <b>Mounting a File</b>
-  <p>An external link is a permanent connection between two files. A 
-  temporary connection can be set up with the <code>H5Fmount</code> 
-  function. For more information, see the 
-  “<a href="08_TheFile.html">The HDF5 File</a>” chapter, 
-  and the <code>H5Fmount</code> function in the 
-  <a href="../RM/RM_H5Front.html"><cite>HDF5 Reference Manual</cite></a>.</p>
-  
-
-
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="DiscoverInfo">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-
-
-
-<a name="DiscoverInfo">
-<h4 class=pagebefore>4.5.6 Discovering Information about Objects</h4>
-</a>
-
-  <p>There is often a need to retrieve information about a particular object.
-  The <code>H5Lget_info</code> and <code>H5Oget_info</code> functions fill 
-  this niche by returning a description of the object or link in an 
-  <code>H5L_info_t</code> or <code>H5O_info_t</code> structure.</p>
-  
-  <!-- <p> ??????? the rest of section 6 has been commented out </p> -->
-  
-  <!-- start of a section of 6 that has been commented out
-  These structures contains the following information: </p>
-  
-  <p> ??????? what about the new structures? do they also contain the following information? ??????? </p>
-  <p> ??????? MEE: because more work needs to be done to translate the old version to the new version, I think we should comment out most of this section starting with
-  the sentence above "These structures contain the following information:" and including everything down to the start of the next section. The next section is 
-  chapter 7 "Discovering Objects in a Group". ??????? </p>
-  <ul> 
-      <li>The file and object identifiers, which together provide unique 
-          identification of the object
--->
-<!-- end of a section of 6 that has been commented out -->          
-<!-- editingComment
-	  <span class="editingComment"><br />
-	        [ [ [ 
-		Why are there 2 of each? 
-		] ] ]
-	        </span>
--->
-<!-- start of another section of 6 that has been commented out -->
-<!--
-      <li>The number of references, or hard links, to the object
-      <li>The object type: group, dataset, named datatype, or soft link, 
-          returned as <code>H5G_GROUP</code>, <code>H5G_DATASET</code>, 
-	  <code>H5G_TYPE</code>, or <code>H5G_LINK</code>, respectively
-      <li>The modification time (datasets only)
-      <li>A link length value; the length of the path name of a symbolic 
-          link's target object 
-	  (returned for symolic links, or soft links, only)
-  </ul>
-  
-  <p>
-  The <code>H5G_stat_t</code> structure specification and the 
-  <code>H5Gget_objinfo</code> function signature appear in Figure 17.
-  The <code>H5G_stat_t</code> structure elements are as listed above.
-  The <code>H5Gget_objinfo</code> function parameters are used follows:
-  <ul>
-      <li><code><em>loc_id</em></code> specifies the object for which 
-          information being sought.
-      <li>A path to the object is returned in <code><em>name</em></code>.
--->
-<!-- end of a section of 6 that has been commented out -->      
-          <!--  editingComment
-	        "A path"  -- Per Quincey, this tries to be the first path, 
-	        but it becomes problematic when an object has moved around much.
-	  -->
-<!-- beginning of a section of 6 that has been commented out
-          <li><code><em>follow_link</em></code> is a Boolean value specifying
-          whether to follow a soft link and open the target object 
-	  (<code>TRUE</code>) or not (<code>FALSE</code>).
-      <li>The <code>H5G_stat_t</code> struct is returned in the
-          <code><em>statbuf</em></code> buffer.   
-  </ul> 
-    
-  <p>
-<table x-use-null-cells
-		width="600"
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-		<tr valign="top">
-<td class="fullImgTableImgCell">
-<pre>
-  typedef struct H5G_stat_t {
-                             unsigned long fileno[2];
-                             unsigned long objno[2];
-                             unsigned nlink;
-                             int type;
-                             time_t mtime; 
-                             size_t linklen;
-                          } H5G_stat_t
-
-  herr_t H5Gget_objinfo(hid_t loc_id, const char *name, hbool_t follow_link, H5G_stat_t *statbuf )
-</pre>
-</td></tr>
-<tr>
-<td align=center class="fullImgTableCapCell">
-    <span class="figureNumber">Figure 17. 
-    The <code>H5G_stat_t</code> struct specification and 
-    the <code>H5Gget_objinfo</code> function signature</span>
-</td></tr>
-</table>
--->
-<!-- end of another section of 6 that has been commented out -->
-<!-- NEW <> PAGE -->
-  <!-- part of section 6 that is commented out <p>
-  Figure 18 provides a code example that prints the local paths 
-  to the members of a group, following a soft link when it is found.    
-  
-  
-  <p>
-<table x-use-null-cells
-		width="600"
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-		<tr valign="top">
-<td class="fullImgTableImgCell">
-<pre><code>
-    H5G_stat_t statbuf;
-
-    H5Gget_objinfo(loc_id, name, FALSE, &statbuf);
-    switch (statbuf.type) {
-    case H5G_GROUP: 
-         printf(" Object with name %s is a group \n", name);
-         break;
-    case H5G_DATASET: 
-         printf(" Object with name %s is a dataset \n", name);
-         break;
-    case H5G_TYPE: 
-         printf(" Object with name %s is a named datatype \n", name);
-         break;
-    case H5G_LINK: 	
-        lname = (char *)malloc(statbuf.linklen);
-
-         H5Gget_linkval(loc_id, name, statbuf.linklen, lname);
-         printf(" Object with name %s is a link to %s \n", name, lname);
-         H5Gget_objinfo(loc_id, name, TRUE, &statbuf);
-         switch (statbuf.type) {
-             case H5G_GROUP: 
-                 printf(" Target of link name %s is a group \n", name);
-                 break;
-            case H5G_DATASET: 
-                 printf(" Target of link name %s is a dataset \n", name);
-                 break;
-            case H5G_TYPE: 
-                 printf(" Target of link name %s is a named datatype \n", name);
-                 break;
-           case H5G_LINK: 
-                printf(" Target of link name %s is a soft link \n", name);
-                break;
-           default:
-              printf(" Unable to identify target ");
-           }
-          break;
-    default:
-         printf(" Unable to identify an object ");
-    }
-</code></pre>
-</td></tr>
-<tr>
-<td align=center class="fullImgTableCapCell">
-    <span class="figureNumber">Figure 18. 
-    Printing a specified object's name and type and, 
-    in the case of a link, opening the target object</span>
-</td></tr>
-</table>
-  <p> ??????? H5Gget_linkval is mentioned above. it was deprecated in 1.8. this section above needs to be rewritten. ??????? </p>
-
-  
-  --> 
-  <!-- end of section 6 text that is commented out -->
-  
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="DiscoverGrObjs">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-
-<a name="DiscoverGrObjs">
-<h4 class=pagebefore>4.5.7 Discovering Objects in a Group</h4>
-</a>
-
-  <!-- the paragraph below no longer mentions the previously included alternate way because the alternate way used deprecated functions. --> 
-  <!-- the functions that replace the deprecated functions could be included if the text is edited. -->
-  <p>To examine all the objects or links in a group, 
-  use the <code>H5Literate</code> or <code>H5Ovisit</code> functions to 
-  examine the objects, and use 
-  the <code>H5Lvisit</code> function to examine the links.
-  <code>H5Literate</code> is useful both with a single group and 
-  in an iterative process that examines an entire file 
-  or section of a file (such as the contents of a group or the contents 
-  of all the groups that are members of that group)
-  and acts on objects as they are encountered. <code>H5Ovisit</code> 
-  recursively visits all objects accessible from a specified object. 
-  <code>H5Lvisit</code> recursively visits all the links starting from a 
-  specified group. </p>
-   
-  <!-- start of commenting out the rest of section 7. the commented out parts use deprecated functions to look at objects. this section can be used if the deprecated functions
-  are replaced and the text edited.
-  
-  <p>
-  An alternative approach is to determine the number of objects
-  in a group then approach them one at a time.  
-  This is accomplished with the functions
-  <code>H5Gget_num_objs</code>,
-  <code>H5Gget_objname_by_idx</code>, and
-  <code>H5Gget_objtype_by_idx</code>.
-  
-  <p>??????? the three H5G functions above were deprecated in 1.8. this section needs to be rewritten ??????? </p>
-  
-  
-  <p>
-  <code>H5Gget_num_objs</code> retrieves the number of objects,
-  say <code><em>n</em></code>, in the group.  
-  The values from <code>0</code> through <code><em>n</em> - 1</code>
-  can then be used as indices to access the members of the group.
-  For example, 
-  an index value of <code>0</code> identifies the first member,
-  an index value of <code>1</code> identifies the second member, and
-  an index value of <code><em>n</em> - 1</code> identifies the last member.
-  (Note that HDF5 objects do not have permanent indices; 
-  these values are strictly transient and may be different each time a 
-  group is opened.)
-  
-  <p>
-  Using the index described above, the name and object type can
-  be retrieved using <code>H5Gget_objname_by_idx</code> and
-  <code>H5Gget_objtype_by_idx</code>, respectively.
-  With the name and object type, an application can proceed to
-  operate as necessary on all or selected group members.
--->
-<!-- end of commenting out of section 7 -->
-
-<!--  editingComment
-      Need examples (and maybe illustration?).
--->
-  
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="DiscoverAll">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-
-<a name="DiscoverAll">
-<h4 class=pagebefore>4.5.8 Discovering All the Objects in the File</h4>
-</a>
-
-  <p>The structure of an HDF5 file is 
-  <span class="termDefinition">self-describing</span>, 
-  meaning that an application can navigate an HDF5 file 
-  to discover and understand all the objects it contains. 
-  This is an iterative process wherein the structure is traversed as a graph, 
-  starting at one node and recursively visiting linked nodes. 
-  To explore the entire file, the traversal should start at the root group.</p>
-  
-  <!-- the rest of section 8 describes how to use H5Giterate. H5Literate replaces H5Giterate. the parameters aren't exactly the same, so I don't want to 
-  just do a 1:1 replacing of old with new. so, the rest of this section should be commented out.-->
-  <!-- start commenting out part of section 8 
-  <p>
-  The function <code>H5Giterate</code>, used to discover the members of 
-  a group, is the key to the discovery process. 
-  An application calls <code>H5Giterate</code> with a pointer to a 
-  callback function (see Figure 19). 
-  The HDF5 Library iterates through the group specified by the 
-  <code>loc_id</code> and <code>name</code> parameters, 
-  calling the callback function once for each group member. 
-  The callback function must have the signature defined by 
-  <code>H5G_iterate_t</code>. 
-  When invoked, the arguments to the callback function are 
-      the group being iterated, 
-      the group member’s name (the object name), and 
-      a pointer set by the user program. 
-  The callback function is part of the application, 
-  so it can execute any actions the program requires 
-  to discover and store information about the objects.</p>
-
-
-
-  
-  <p>
-<table x-use-null-cells
-		width="600"
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-		<tr valign="top">
-<td class="fullImgTableImgCell">
-<pre>
-  typedef herr_t (*H5G_iterate_t)(hid_t group_id, const char *member_name, 
-      void *operator_data);
-  H5Giterate(hid_t loc_id, const char * name, int *idx, H5G_iterate_t operator, 
-      void *operator_data );
-</pre>
-</td></tr>
-<tr>
-<td align=center class="fullImgTableCapCell">
-    <span class="figureNumber">Figure 19. </span>
-</td></tr>
-</table>
-
-  <p>
-  Note that the <code>H5Giterate</code> function follows the links 
-  from a single group and that 
-  these links correspond to the components in a path name. 
-  To iterate over an entire substructure, <code>H5Giterate</code> must be called
-  recursively on every member of the original group that turns out to also
-  be a group.
-  To iterate over an entire file, the first call to <code>H5Giterate</code> 
-  must iterate over the root group; subsequent calls to <code>H5Giterate</code> 
-  must then iterate over every subsequent group.
-  -->
-  <!-- end commented out part of section 8 -->
-<!-- NEW <> PAGE -->
-<!-- start commenting out part of section 8
-  <p>
-  Figure 20 illustrates the relationship between the calling module
-  of the application, the callback function (<code>do_obj</code>), 
-  and calls to the HDF5 Library.  
-  In this diagram, “Global Variables and Functions” 
-  symbolizes the fact that the callback function executes as part 
-  of the application, and may therefore call functions and 
-  update data structures to describe the file and its objects.
-  
-  <p>
-<table x-use-null-cells
-		width="600"
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-  <tr valign="top"> 
-    <td class="fullImgTableImgCell" align="center">
-    <img src="Images/groups_fig20.JPG">
-</td></tr>
-<tr>
-<td align=center class="fullImgTableCapCell">
-    <span class="figureNumber">Figure 20. 
-    Relationships between a calling module, the callback function,
-    and the callback function's calls back to the HDF5 library</span>
-</td></tr>
-</table>
--->
-<!-- end commented out part of section 8 -->
-
-<!-- NEW <> PAGE -->
-
-<!-- start commenting out part of section 8
-  <p>
-  Figure 21 illustrates the sequence of events precipitated by an 
-  <code>H5Giterate</code> call. 
-  <ol>
-    <li>The application first calls <code>H5Giterate</code>, 
-        passing a pointer to a callback function 
-	(<code>do_obj</code> in the figure).
-        Note that the callback function is part of the application.
-    <li>The HDF5 Library then iterates through the members of the group, 
-        calling the callback function in the application once for each
-	group member.
-    <li>When the iteration is complete, the <code>H5Giterate</code> 
-        call returns to the calling application.
-  </ol>
-  
-  <p> 
-<table x-use-null-cells
-		width="600"
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-  <tr valign="top"> 
-    <td class="fullImgTableImgCell" align="center">
-    <img src="Images/groups_fig21.JPG">
-</td></tr>
-<tr>
-<td height="24" align=center class="fullImgTableCapCell"> 
-    <span class="figureNumber">Figure 21. </span>
-</td></tr>
-</table>
-
--->
-<!-- end commented out part of section 8 -->
-
-<!-- NEW <> PAGE -->
-<!-- start commenting out part of section 8
-  <p>
-  Figure 22 shows the sequence of calls involved in one iteration of a 
-  callback function that employs the HDF5 function <code>H5Gget_objinfo</code> 
-  to discover properties of the object that is the subject of the current step 
-  of the iteration (e.g., the object’s type and reference count). 
-  The HDF5 Library then calls the application’s callback function 
-  <code>do_obj()</code>, which in turn calls the HDF5 Library to get the 
-  object information. 
-  The callback function can process the information as needed, 
-  accessing any function or data structure of the application program, 
-  and it can call the HDF5 Library again to, for example, 
-  iterate through a group member that is itself a group.
-  
-  <p>
-<table x-use-null-cells
-		width="600"
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-  <tr valign="top"> 
-    <td class="fullImgTableImgCell" align="center">
-    <img src="Images/groups_fig22.JPG">
-</td></tr>
-<tr>
-    <td height="24" align=center class="fullImgTableCapCell"> 
-    <span class="figureNumber">Figure 22. </span> </td>
-  </tr>
-</table>
-
--->
-<!-- end commented out part of section 8 -->
-
-<!-- NEW <> PAGE -->
-<!-- start commenting out part of section 8
-  <p>
-  Over the course of a successful <code>H5Giterate</code> call, 
-  the HDF5 Library will call the application’s callback function 
-  once for each member of the group, as illustrated in Figure 23. 
-  At each iteration, the callback function must return a status which
-  implies a subsequent course of action: <br />
-      
-      <code>1  </code>
-      Continue iterating.<br />
-      
-      <code>0  </code>
-      Stop iterating and return to the caller.<br />
-  Once the iteration has been completed, <code>H5Giterate</code> returns 
-  to the calling application.</p>
-
-  <p>
-<table x-use-null-cells
-		width="600"
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-  <tr valign="top"> 
-    <td class="fullImgTableImgCell" align="center">
-    <img src="Images/groups_fig23.JPG">
-</td></tr>
-<tr>
-    <td height="24" align=center class="fullImgTableCapCell"> 
-    <span class="figureNumber">Figure 23. </span> </td>
-  </tr>
-</table>
-
-  <p>
-  The overall sequence of calls can become quite complex, especially when 
-  the callback function in turn calls the HDF5 Library. 
-  Figure 24 provides a sequence diagram for a case similar to the simple
-  case described above: 
-  <ol>
-      <li>The calling program invokes <code>H5Giterate</code> on a group,
-      <li>which calls <code>do_obj</code> once for each group members
-          (three group members in this case).
-      <li>The <em>do_obj</em> callback function in turn calls 
-          <code>H5Gget_objinfo</code> each time it is invoked to discover 
-	  information about each object.
-  </ol> 
-    
-  <p>
-<table x-use-null-cells
-		width="600"
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-  <tr valign="top"> 
-    <td class="fullImgTableImgCell" align="center">
-    <img src="Images/groups_fig24.JPG">
-</td></tr>
-<tr>
-    <td height="24" align=center class="fullImgTableCapCell"> 
-    <span class="figureNumber">Figure 24. </span> </td>
-  </tr>
-</table>
-
--->
-<!-- end commented out part of section 8 -->
-
-<!-- NEW <> PAGE -->
-<!-- start commenting out part of section 8
-  <p>
-  Recursively iterating through the members of every group will result in 
-  visiting an object once for each link to it. 
-  This may result in visiting an object more than once. 
-  The calling application must be prepared to recognize this case and 
-  handle it appropriately.  
-  If an action should be undertaken only once per object, 
-  the application must make sure that it does not repeat the action for an 
-  object with two links. 
-  For example, if the objects are being copied, it is important that 
-  an object with two names be copied once, not twice.  
-  Figure 25 illustrates this case.
-  
-  <p>
-<table x-use-null-cells
-		width="600"
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-  <tr valign="top"> 
-    <td colspan="2" align="center" class="fullImgTableImgTopCell"> 
-      <img src="Images/groups_fig25_a.JPG"><br />
-      a) The required action is to copy all the objects from one file 
-      to another.</td>
-  </tr>
-  <tr valign="top"> 
-    <td align="center" class="fullImgTableImgBottomCell"> 
-      <img src="Images/groups_fig25_b.JPG" align="left">      
-    </td>
-    <td align="center" class="fullImgTableImgBottomCell"> 
-      <img src="Images/groups_fig25_c.JPG" align="right">
-    </td>
-  </tr>
-  <tr>
-    <td align="center">
-	  b) A shared dataset should not be copied twice.
-	</td>
-	<td align="center">
-	  c) A shared dataset should be copied once and 
-	  the apppropriate link should be created.
-	</td>
-  </tr>
-  <tr> 
-    <td height="24" colspan="2" align=center class="fullImgTableCapCell"> 
-    <span class="figureNumber">Figure 25. </span> 
-    </td>
-  </tr>
-</table>
-
--->
-<!-- end commented out part of section 8 -->
-
-
-  
-<!--
-<table x-use-null-cells
-		width="600"
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-  <tr valign="top"> 
-    <td class="fullImgTableImgCell" align="center">
-    <img src="Images/groups_fig21.JPG">
-</td></tr>
-<tr>
-    <td height="24" align=center class="fullImgTableCapCell"> 
-    <span class="figureNumber">Figure 26. </span> </td>
-  </tr>
-</table>
--->
-
-<!-- editingComment  Revisit right-alignment of following table. 
-     It's centered for now simply because right-alignment yields an 
-     over-write that I don't have time to fix right now.   
-     Remove the width definition at that point.                  -->
-     
-     <!-- start commenting out part of section 8
-<table x-use-null-cells
-		cellspacing="0"
-		width="600"
-		align="center">
-  <tr valign="top"> 
-    <td class="fullImgTableImgCell" align="center">
-    <img src="Images/groups_fig26.JPG">
-</td></tr>
-<tr>
-    <td height="24" align=center class="fullImgTableCapCell"> 
-    <span class="figureNumber">Figure 26. </span> </td>
-  </tr>
-</table>
-
-  There is a second important case when the twice-visited member is a group. 
-  Any group with more than one link to it can potentially be part of a 
-  circular path. 
-  I.e., recursively iterating through member groups may eventually bring the 
-  the iteration back to the current group and may generate an infinite path
-  within the file’s linked structure.
-  To embark upon the resulting infinite iteration would clearly be unacceptable
-  in the general case. 
-  Figure 26 illustrates an HDF5 file with such potential.
-    
-  <p>
-  In such a case, the callback function should check the reference count in 
-  the <code>H5G_stat_t</code> buffer as returned by <em>H5Gget_objinfo</em>. 
-  If the count is greater than one, there is more than one path to 
-  the object in question and it may be in a loop; 
-  the program should act accordingly. 
-  For example, it may be necessary to construct a global table of all the 
-  objects visited. 
-  Note that the object’s name is not unique, but the full path and the
-  object number (found in the above-mentioned <code>H5G_stat_t</code> buffer) 
-  are unique within an individual HDF5 file.
-  
--->
-<!-- end commented out part of section 8 -->
-
-  
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="Examples">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-<br />
-<!-- NEW PAGE -->
-<a name="Examples">
-<h3 class=pagebefore>4.6. Examples of File Structures</h3></a>
-
-
-  <p>This section presents several samples of HDF5 file structures.</p>
-  
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td align="center"> 
-        <img src="Images/groups_fig27_a.JPG">
-        </td>
-        <td align="center" valign="top">  </td>
-        <td align="center">
-        <img src="Images/groups_fig27_b.JPG"> 
-        </td>
-        </tr>
-    <tr>
-        <td align="center" width="50%">
-        a) The file contains three groups: 
-        the root group, <code>/group1</code>, and <code>/group2</code>.
-        </td>
-        <td align="center" valign="top">  </td>
-        <td align="center" width="50%">
-        b) The dataset <code>dset1</code> (or <code>/group1/dset1</code>) 
-        is created in <code>/group1</code>.
-        </td> 
-        </tr>
-    <tr valign="top"> 
-        <td align="center"> 
-        <img src="Images/groups_fig27_aa.JPG">
-        </td>
-        <td align="center" valign="top">  </td>
-        <td align="center">
-        <img src="Images/groups_fig27_bb.JPG"> 
-        </td>
-        </tr>
-    <tr> 
-        <td align="center" valign="top">
-        c) A link named <code>dset2</code> to the same dataset 
-        is created in <code>/group2</code>. 
-        </td>
-        <td align="center" valign="top">  </td>
-        <td align="center">
-        d) The link from <code>/group1</code> to <code>dset1</code> is removed. 
-        The dataset is still in the file, but can be accessed only as 
-        <code>/group2/dset2</code>.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr> 
-        <td colspan="3" align="left"> 
-        <b>Figure 9. Some file structures</b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-<!-- NEW PAGE -->
-  <p>
-  The figure above shows examples of the structure of a file with three groups 
-  and one dataset. The file in Figure 9a contains three groups: 
-  the root group and two member groups. 
-  In Figure 9b, the dataset <code>dset1</code> has been created 
-  in <code>/group1</code>. 
-  In Figure 9c, a link named <code>dset2</code> from <code>/group2</code> 
-  to the dataset has been added. 
-  Note that there is only one copy of the dataset; 
-  there are two links to it and it can be accessed either as 
-  <code>/group1/dset1</code> or as <code>/group2/dset2</code>.</p>
-  
-<p>
-
-  Figure 9d above illustrates that one of the two links to the dataset 
-  can be deleted. 
-  In this case, the link from <code>/group1</code> has been removed.  
-  The dataset itself has not been deleted; it is still in the file 
-  but can only be accessed as <code>/group1/dset2</code>.</p>
-  
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td align="center"> 
-        <img src="Images/groups_fig28_a.JPG">
-        </td>
-        <td align="center" valign="top">  </td>
-        <td align="center">
-        <img src="Images/groups_fig28_b.JPG"> 
-        </td>
-        </tr>
-    <tr>
-        <td align="center" width="50%">
-        a) <code>dset1</code> has two names: 
-        <code>/group2/dset1</code> and <code>/group1/GXX/dset1</code>.
-        </td>
-        <td>  </td>
-        <td align="center" width="50%">
-        b) <code>dset1</code> again has two names: 
-        <code>/group1/dset1</code> and <code>/group1/dset2</code>.
-        </td> 
-        </tr>
-    <tr valign="top"> 
-        <td align="center"> 
-        <img src="Images/groups_fig28_c.JPG">
-        </td>
-        <td>  </td>
-        <td align="center">
-        <img src="Images/groups_fig28_d.JPG"> 
-        </td>
-        </tr>
-    <tr> 
-        <td align="center" valign="top">
-        c) <code>dset1</code> has three names: 
-        <code>/group1/dset1</code>, <code>/group2/dset2</code>, 
-        and <code>/group1/GXX/dset2</code>.
-        </td>
-        <td align="center" valign="top">  </td>
-        <td align="center">
-        d) <code>dset1</code> has an infinite number of available path names.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr> 
-        <td colspan="3" align="left"> 
-        <b>Figure 10. More sample file structures</b> 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-<!-- NEW PAGE -->
-  <p>
-  The figure above illustrates loops in an HDF5 file structure. 
-  The file in Figure 10a contains three groups and a dataset;
-  <code>group2</code> is a member of the root group and of the 
-  root group’s other member group, <code>group1</code>. 
-  <code>group2</code> thus can be accessed by either of two paths: 
-  <code>/group2</code> or <code>/group1/GXX</code>. 
-  Similarly, the dataset can be accessed either as 
-  <code>/group2/dset1</code> or as <code>/group1/GXX/dset1</code>.</p>
-
-  <p>
-  Figure 10b illustrates a different case: the dataset is a 
-  member of a single group but with two links, or names, in that group. 
-  In this case, the dataset again has two names,
-  <code>/group1/dset1</code> and <code>/group1/dset2</code>.</p>
-  
-  
-
-  <p>In Figure 10c, the dataset <code>dset1</code> is a member of two groups, 
-  one of which can be accessed by either of two names. 
-  The dataset thus has three path names: <code>/group1/dset1</code>, 
-  <code>/group2/dset2</code>, and <code>/group1/GXX/dset2</code>. </p>
-  
-  <p>
-  And in Figure 10d, two of the groups are members of 
-  each other and the dataset is a member of both groups. 
-  In this case, there are an infinite number of paths to the dataset 
-  because <code>GXX</code> and <code>GYY</code> can be traversed 
-  any number of times on the way from the root group, <code>/</code>, 
-  to the dataset.
-  This can yield a path name such as 
-  <code>/group1/GXX/GYY/GXX/GYY/GXX/dset2</code>.</p>
-
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td align="center"> 
-        <img src="Images/groups_fig29_a.JPG"></td>
-        <td align="center" valign="top">  </td>
-        <td align="center">
-        <img src="Images/groups_fig29_b.JPG"></td>
-        </tr>
-    <tr>
-        <td align="center" valign="top" width="48%">
-        a) The file contains only hard links.</td>
-        <td>  </td>
-        <td align="center" valign="top" width="48%">
-        b) A soft link is added from <code>group2</code> 
-        to <code>/group1/dset1</code>.</td> 
-        </tr>
-    <tr valign="top"> 
-        <td align="center"> 
-        <img src="Images/groups_fig29_c.JPG"></td>
-        <td>  </td>
-        <td align="center">
-        <img src="Images/groups_fig29_d.JPG"></td>
-        </tr>
-    <tr> 
-        <td align="center" valign="top">
-        c) A soft link named <code>dset3</code> is added with a target 
-        that does not yet exist.</td>
-        <td align="center" valign="top">  </td>
-        <td align="center" valign="top">
-        d) The target of the soft link is created or linked.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr> 
-        <td colspan="3" align="left">
-        <b>Figure 11. Hard and soft links</b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-
-
-<!-- NEW PAGE -->
-  <p>
-  The figure above takes us into the realm of soft links.
-  The original file, in Figure 11a, contains only three hard links.
-  In Figure 11b, a soft link named <code>dset2</code> from 
-  <code>group2</code> to <code>/group1/dset1</code> has been created, 
-  making this dataset accessible as <code>/group2/dset2</code>.</p>
-  
-  <p>
-  In Figure 11c, another soft link has been created in <code>group2</code>.  
-  But this time the soft link, <code>dset3</code>, points to a target object 
-  that does not yet exist.  
-  That target object, <code>dset</code>, has been added in Figure 11d 
-  and is now accessible as either <code>/group2/dset</code> or
-  <code>/group2/dset3</code>.</p>
-   
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="Appendix">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<!-- editingComment -- Removed until we can make sure it's (1) finished and (2) right.
-
-<h3 class=pagebefore>10. Appendix:  Mapping HDF5 to a Graph</h3>
-
-<dir>
-
-  <span class="editingComment">
-        [ [ [
-	Unless someone says it ought to be otherwise, 
-	this section will be commented out for this release.
-	] ] ]
-	</span>
-  <p>{<em>Is this material wanted?  It will take some effort to flesh this out 
-  and make sure it is correct.</em>}</p>
-  
-<table x-use-null-cells
-		class="ColumnTable"
-		width="600"
-		cellspacing="0"
-		align="center">
-  <tr valign="top"> 
-    <td class="ColumnHdr"> 
-        <p><span class="TableHead">Box 1:  An HDF5 file can be mapped to a 
-	rooted directed graph.</span>	
-	<p>A rooted, directed graph can be defined as a 
-	set: G = {V(G), A(G), <em>root</em> },</p>
-	
-        <dir>
-	<p>V(G) = the set of vertices
-	<br />A(G) = the set of arcs	
-	<p>The graph is directed. By definition <em>a</em> ε A(G): 
-	<em>a</em> = (<em>s, d</em>), for some source vertex <em>s</em> 
-	in V(G) and destination vertex <em>d</em> ε V(G).	
-	<p><em>root</em> ε V(G), <em>root</em> is a distinguished node.
-	</dir>
-	
-	<p>HDF5 can be mapped to this graph:
-	
-	<dir>
-	<p>An HDF5 file is a graph: {V(G), A(G), <em>root</em>}
-	<p>V(G) = { Named Objects } = { Datasets Groups Named Datatypes }
-	<br />       Vertices (nodes) are labeled with <em>object ids</em>.
-	<br />A(G) = { hard links ]
-	<br />       Arcs are labeled with <em>path components</em>.
-	<p>The root group is the <em>root</em> vertex. The root vertex is distinguished by the special path name, "/". By convention, the root group has in-degree of 1.
-	</dir>
-	
-	<p>Some properties of the HDF5 file graph:
-	<p>1. The HDF5 file is a connected graph.
-	
-	<dir>
-	<p>a) Every node (vertex) must have an in-degree of 1.
-	<p>b) When a link is deleted, if the in-degree of the node becomes 0, the node is permanently inaccessible and may be deleted.
-	</dir>
-	
-	<p>2. A Group may have out-degree 0.
-	<p>3. A Dataset or Named Datatype has an out-degree = 0.
-	<p>4. The HDF5 file may contain loops, cycles, and circuits.
-	
-	<dir>
-	<p>A loop is an arc with the same source and destination: <em>a</em> = (<em>v, v</em>).
-	<p>A <em>path</em> is a sequence of arcs, { <em>a&sub1;, a&sub2;, ... </em>}, such that the source of each arc is the destination of the previous arc, except for the first and last arc.
-	<p>A <em>circuit</em> is a path for which the last vertex is the same as the first vertex.
-	<p>If the graph is considered undirected, so that:
-	<br />   For any <em>a&sub1;</em> = (<em>v, w</em>), and <em>a&sub2;</em> = (<em>w, v</em>), <em>w</em>, <em>v</em> ε V(G) <em>a&sub1;</em> = <em>a&sub2;</em>.
-	<p>....{finish this...}
-	</dir>	
-    </td>
-</table>
-
-<br />
-
-<table x-use-null-cells
-		class="ColumnTable"
-		width="600"
-		cellspacing="0"
-		align="center">
-  <tr valign="top"> 
-    <td class="ColumnHdr"> 
-        <p><span class="TableHead">Box 2: Applying graph algorithms to HDF5</span>
-	<p>It follows from the observation that an HDF5 can be mapped to a rooted directed graph, that graph algorithms can be applied to the structure of the HDF5 file. For example, the objects of the HDF5 file can be visited by "traversing" the graph.
-	<h4><em>Algorithm 1: Depth First Traversal</em></h4>
-	<pre>
-	      visit_df (Group g) {
-                 process (g);  // a pre-order traversal
-                 for all m in g.members() {
-                         if (m is a group) {
-                                  visit_df(m);  // recur
-                         } else {
-                                 process (m);  //  m is a dataset or named datatype
-                         }
-                 }
-        }
-	</pre>	
-    </td>
-</table>
-
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</dir>
-
--->
-
-<br /><br /><br />
-<!-- FOR USE WITH PRINT VERSION --------------------------------------
-<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
-<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
-<br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
-<br /><br /><br /><br /><br />
-<!-- FOR USE WITH PRINT VERSION -------------------------------------->
-
-<a name="FootNote"><hr width="200px" align="left"></a>
-
-  <p><font size="-1"><sup><a href="#SupScript1">1</a></sup>It could be said 
-  that HDF5 extends the organizing concepts of a file system to the 
-  internal structure of a single file.</font></p>
-  
-
-<!-- HEADER RIGHT " " -->
-  
-</body>
-</html>
-
diff --git a/html/UG/OldHtmlSource/10_Datasets.html b/html/UG/OldHtmlSource/10_Datasets.html
deleted file mode 100755
index 2069df1..0000000
--- a/html/UG/OldHtmlSource/10_Datasets.html
+++ /dev/null
@@ -1,5085 +0,0 @@
-<!doctype HTML public "-//W3C//DTD HTML 4.0 Frameset//EN">
-<html>
-<head>
-<title>Chapter 5: HDF5 Datasets</title>
-
-<!--(Meta)==========================================================-->
-
-<!--(Links)=========================================================-->
-
-<!--( Begin styles definition )=====================================-->
-<link href="ed_styles/NewUGelect.css" rel="stylesheet" type="text/css">
-<!--( End styles definition )=======================================-->
-
-</head> 
-
-<body>
-
-<!-- #BeginLibraryItem "/ed_libs/styles_UG.lbi" -->
-<!--
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-  * Copyright by The HDF Group.                                               *
-  * Copyright by the Board of Trustees of the University of Illinois.         *
-  * All rights reserved.                                                      *
-  *                                                                           *
-  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
-  * terms governing use, modification, and redistribution, is contained in    *
-  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
-  * of the source code distribution tree; Copyright.html can be found at the  *
-  * root level of an installed copy of the electronic HDF5 document set and   *
-  * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-  * access to either file, you may request a copy from help at hdfgroup.org.     *
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- -->
-<!-- #EndLibraryItem --><!-- HEADER LEFT "HDF5 User's Guide" -->
-<!-- HEADER RIGHT "HDF5 Datasets" -->
-
-<!--( TOC )=========================================================-->
-<!--<SCRIPT language="JavaScript">-->
-<!--
-document.writeln ('\
-<table x-use-null-cells\
-                align=right\
-		width=240\
-		cellspacing="0"\
-		class="tocTable">\
--->
-<!-- Table Version 3 --><!-- \ -->
-<!--
-  <tr valign="top"> \
-    <td class="tocTableHeaderCell" colspan="2"> \
-        <span class="TableHead">Chapter Contents</span></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Intro">1.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Intro">Introduction</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#FileFunctSums">2.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#FileFunctSums">Dataset (H5D) Function Summaries</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#PModel">3.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#PModel">Programming Model</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#DTransfer">4.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#DTransfer">Data Transfer</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Allocation">5.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Allocation">Allocation of Space</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell"> \
-      <a href="#UseFilters">6.</a></td>\
-    <td class="tocTableContentCell4">\
-	  <a href="#UseFilters">Specialized Filters</a>\
-          <br>    \
-	  <a href="#N-Bit">N-bit</a>\
-          <br>    \
-	  <a href="#ScaleOffset">Scale-offset</a></td>\
-  </tr>\
-  </td></tr>\
-</table>\
-')
--->
-<!--</SCRIPT>-->
-<!--(End TOC)=======================================================-->
-
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  ] ] ]</span>
--->
-
-<!-- editingComment
--->
-
-<div align="center">
-<a name="TOP">
-<h2>Chapter 5<br><font size="7">HDF5 Datasets</font></h2>
-</a>
-</div>
-
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  Original title.  Which is proper?
-  <h2>10. Datasets I/O</h2>
-  ] ] ]</span>
--->
-<br />
-<a name="Intro">
-<h3>5.1. Introduction</h3>
-</a>
-
-  <p>An HDF5 dataset is an object composed of a collection of data elements, 
-  or raw data, and metadata that stores a description of the data elements, 
-  data layout, and all other information necessary to write, read, and interpret 
-  the stored data. From the viewpoint of the application the raw data is stored 
-  as a one-dimensional or multi-dimensional array of elements (the <em>raw 
-  data</em>), those elements can be any of several numerical or character 
-  types, small arrays, or even compound types similar to C structs. The 
-  dataset object may have attribute objects. See the figure below.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dsets_fig1.JPG">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 1. Application view of a dataset</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<!-- editingComment
-  <span class="editingComment">
-  <p>Datatypes are described in  [ [ [ "Datatypes" ] ] ]. and in the [ [ [ "HDF5 
-  Datatypes" chapter in this guide ] ] ], Dataspace objects are described in 
-  [ [ [ Dataspace ] ] ], and Attributes are described in [ [ [ Attributes ] ] ].
-  </span>
--->
-
-  <p>A dataset object is stored in a file in two parts: a header and a data 
-  array. The header contains information that is needed to interpret the 
-  array portion of the dataset, as well as metadata (or pointers to metadata) 
-  that describes or annotates the dataset. Header information includes the 
-  name of the object, its dimensionality, its number-type, information about 
-  how the data itself is stored on disk (the <em>storage layout</em>), and 
-  other information used by the library to speed up access to the dataset 
-  or maintain the file’s integrity. </p>
-
-  <p>The HDF5 dataset interface, comprising the H5D functions, provides a 
-  mechanism for managing HDF5 datasets including the transfer of data 
-  between memory and disk and the description of dataset properties. </p>
-
-  <p>A dataset is used by other HDF5 APIs, either by name or by an 
-  identifier (e.g., returned by <code>H5Dopen</code>).</p>
-
-
-<h4><em>Link/Unlink</em></h4>
-
-  <p>A dataset can be added to a group with one of the <code>H5Lcreate</code> 
-  calls, and deleted from a group with <code>H5Ldelete</code>. The link and 
-  unlink operations use the name of an object, which may be a dataset. The 
-  dataset does not have to open to be linked or unlinked.</p>
-
-<h4><em>Object reference</em></h4>
-
-  <p>A dataset may be the target of an object reference.  The object 
-  reference is created by <code>H5Rcreate</code> with the name of an object 
-  which may be a dataset and the reference type <code>H5R_OBJECT</code>. 
-  The dataset does not have to be open to create a reference to it.</p>
-
-  <p>An object reference may also refer to a region (selection) of a dataset. 
-  The reference is created with <code>H5Rcreate</code> and a reference type of 
-  <code>H5R_DATASET_REGION</code>.</p>
-
-  <p>An object reference can be accessed by a call to <code>H5Rdereference</code>. When the 
-  reference is to a dataset or dataset region, the <code>H5Rdeference</code> 
-  call returns an identifier to the dataset just as if <code>H5Dopen</code> 
-  has been called.</p>
-
-<h4><em>Adding attributes</em></h4>
-
-  <p>A dataset may have user-defined attributes which are created with 
-  <code>H5Acreate</code> and accessed through the H5A API. To create an 
-  attribute for a dataset, the dataset must be open, and the identifier is 
-  passed to <code>H5Acreate</code>. The attributes of a dataset are 
-  discovered and opened using <code>H5Aopen_name</code>, 
-  <code>H5Aopen_idx</code>, or <code>H5Aiterate</code>; these functions 
-  use the identifier of the dataset. An attribute can be deleted with 
-  <code>H5Adelete</code> which also uses the identifier of the dataset.</p>
-
-<!-- editingComment
-  <span class="editingComment">
-  <p>The remaining sections of this chapter discuss... [To be written last.]</p>
-  </span>
--->
-
-<br>
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="FileFunctSums">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<!-- NEW PAGE -->
-<a name="FileFunctSums">
-<h3 class=pagebefore>5.2. Dataset Function Summaries</h3>
-</a>
-<p>Functions that can be used with datasets (H5D functions) and property 
-list functions that can used with datasets (H5P functions) are listed below.</p>
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 1. Dataset functions (H5D)
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br>Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Dcreate<br>h5dcreate_f</code> 
-        </td><td> </td>
-        <td>
-        Creates a dataset at the specified location. The C function is a 
-        macro: see <a href="../RM/APICompatMacros.html">“API 
-        Compatibility Macros in HDF5.”</a>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Dcreate_anon<br>h5dcreate_anon_f</code> 
-        </td><td> </td>
-        <td>
-        Creates a dataset in a file without linking it into the file structure. 
-        </td>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Dopen<br>h5dopen_f</code> 
-        </td><td> </td>
-        <td>
-        Opens an existing dataset. The C function is a 
-        macro: see <a href="../RM/APICompatMacros.html">“API 
-        Compatibility Macros in HDF5.”</a>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Dclose<br>h5dclose_f</code> 
-        </td><td> </td>
-        <td>
-        Closes the specified dataset.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Dget_space<br>h5dget_space_f</code> 
-        </td><td> </td>
-        <td>
-        Returns an identifier for a copy of the dataspace for a dataset.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Dget_space_status<br>h5dget_space_status_f</code> 
-        </td><td> </td>
-        <td>
-        Determines whether space has been allocated for a dataset.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Dget_type<br>h5dget_type_f</code> 
-        </td><td> </td>
-        <td>
-        Returns an identifier for a copy of the datatype for a dataset.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Dget_create_plist<br>h5dget_create_plist_f</code> 
-        </td><td> </td>
-        <td>
-        Returns an identifier for a copy of the dataset creation property 
-        list for a dataset.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Dget_access_plist<br>(none)</code> 
-        </td><td> </td>
-        <td>
-        Returns the dataset access property list associated with a dataset. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Dget_offset<br>h5dget_offset_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the dataset address in a file.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Dget_storage_size<br>h5dget_storage_size_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the amount of storage required for a dataset.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Dvlen_get_buf_size<br>h5dvlen_get_max_len_f</code> 
-        </td><td> </td>
-        <td>
-        Determines the number of bytes required to store variable-length (VL) 
-        data.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Dvlen_reclaim<br>h5dvlen_reclaim_f</code> 
-        </td><td> </td>
-        <td>
-        Reclaims VL datatype memory buffers.
-        </td>
-        </tr>
-    <!-- NEW PAGE -->
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Dread<br>h5dread_f</code> 
-        </td><td> </td>
-        <td>
-        Reads raw data from a dataset into a buffer.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Dwrite<br>h5dwrite_f</code> 
-        </td><td> </td>
-        <td>
-        Writes raw data from a buffer to a dataset.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Diterate<br>(none)</code> 
-        </td><td> </td>
-        <td>
-        Iterates over all selected elements in a dataspace.
-        </td>
-        </tr>
-
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Dgather<br>(none)</code> 
-        </td><td> </td>
-        <td>
-        Gathers data from a selection within a memory buffer. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Dscatter<br>(none)</code> 
-        </td><td> </td>
-        <td>
-        Scatters data into a selection within a memory buffer. 
-        </td>
-        </tr>
-
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Dfill<br>h5dfill_f</code> 
-        </td><td> </td>
-        <td>
-        Fills dataspace elements with a fill value in a memory buffer.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Dset_extent<br>h5dset_extent_f</code> 
-        </td><td> </td>
-        <td>
-        Changes the sizes of a dataset’s dimensions. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-<!-- NEW PAGE -->
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 2. Dataset creation property list functions (H5P)
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br>Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_layout<br>h5pset_layout_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the type of storage used to store the raw data for a dataset.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_layout<br>h5pget_layout_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the layout of the raw data for a dataset.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_chunk<br>h5pset_chunk_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the size of the chunks used to store a chunked layout dataset.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_chunk<br>h5pget_chunk_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the size of chunks for the raw data of a chunked layout 
-        dataset.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_deflate<br>h5pset_deflate_f</code> 
-        </td><td> </td>
-        <td>
-        Sets compression method and compression level.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_fill_value<br>h5pset_fill_value_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the fill value for a dataset.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_fill_value<br>h5pget_fill_value_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves a dataset fill value.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pfill_value_defined<br>(none)</code> 
-        </td><td> </td>
-        <td>
-        Determines whether the fill value is defined.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_fill_time<br>h5pset_fill_time_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the time when fill values are written to a dataset.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_fill_time<br>h5pget_fill_time_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the time when fill value are written to a dataset.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_alloc_time<br>h5pset_alloc_time_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the timing for storage space allocation.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_alloc_time<br>h5pget_alloc_time_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the timing for storage space allocation.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_filter<br>h5pset_filter_f</code> 
-        </td><td> </td>
-        <td>
-        Adds a filter to the filter pipeline.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pall_filters_avail<br>(none)</code> 
-        </td><td> </td>
-        <td>
-        Verifies that all required filters are available.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_nfilters<br>h5pget_nfilters_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the number of filters in the pipeline.
-        </td>
-        </tr>
-    <!-- NEW PAGE -->
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_filter<br>h5pget_filter_f</code> 
-        </td><td> </td>
-        <td>
-        Returns information about a filter in a pipeline. The C function is a 
-        macro: see <a href="../RM/APICompatMacros.html">“API 
-        Compatibility Macros in HDF5.”</a>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_filter_by_id<br>h5pget_filter_by_id_f</code> 
-        </td><td> </td>
-        <td>
-        Returns information about the specified filter. The C function is a 
-        macro: see <a href="../RM/APICompatMacros.html">“API 
-        Compatibility Macros in HDF5.”</a>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pmodify_filter<br>h5pmodify_filter_f</code> 
-        </td><td> </td>
-        <td>
-        Modifies a filter in the filter pipeline.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Premove_filter<br>h5premove_filter_f</code> 
-        </td><td> </td>
-        <td>
-        Deletes one or more filters in the filter pipeline.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_fletcher32<br>h5pset_fletcher32_f</code> 
-        </td><td> </td>
-        <td>
-        Sets up use of the Fletcher32 checksum filter.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_nbit<br>h5pset_nbit_f</code> 
-        </td><td> </td>
-        <td>
-        Sets up use of the n-bit filter.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_scaleoffset<br>h5pset_scaleoffset_f</code> 
-        </td><td> </td>
-        <td>
-        Sets up use of the scale-offset filter.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_shuffle<br>h5pset_shuffle_f</code> 
-        </td><td> </td>
-        <td>
-        Sets up use of the shuffle filter.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_szip<br>h5pset_szip_f</code> 
-        </td><td> </td>
-        <td>
-        Sets up use of the Szip compression filter.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_external<br>h5pset_external_f</code> 
-        </td><td> </td>
-        <td>
-        Adds an external file to the list of external files.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_external_count<br>h5pget_external_count_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the number of external files for a dataset.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_external<br>h5pget_external_f</code> 
-        </td><td> </td>
-        <td>
-        Returns information about an external file.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_char_encoding<br>h5pset_char_encoding_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the character encoding used to encode a string. 
-        Use to set ASCII or UTF-8 character encoding for object names.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_char_encoding<br>h5pget_char_encoding_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the character encoding used to create a string. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br/>
-
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 3. Dataset access property list functions (H5P)
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br>Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_buffer<br>h5pset_buffer_f</code> 
-        </td><td> </td>
-        <td>
-        Sets type conversion and background buffers.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_buffer<br>h5pget_buffer_f</code> 
-        </td><td> </td>
-        <td>
-        Reads buffer settings.
-        </td>
-        </tr>
-<!-- 8.10.10, MEE: I removed two dataset access property list functions: 
-                   H5Pset_preserve and H5Pget_preserve. -->
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_chunk_cache<br>h5pset_chunk_cache_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the raw data chunk cache parameters.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_chunk_cache<br>h5pget_chunk_cache_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the raw data chunk cache parameters. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_edc_check<br>h5pset_edc_check_f</code> 
-        </td><td> </td>
-        <td>
-        Sets whether to enable error-detection when reading a dataset.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_edc_check<br>h5pget_edc_check_f</code> 
-        </td><td> </td>
-        <td>
-        Determines whether error-detection is enabled for dataset reads.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_filter_callback<br>(none)</code> 
-        </td><td> </td>
-        <td>
-        Sets user-defined filter callback function.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_data_transform<br>h5pset_data_transform_f</code> 
-        </td><td> </td>
-        <td>
-        Sets a data transform expression.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_data_transform<br>h5pget_data_transform_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves a data transform expression.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_type_conv_cb<br>(none)</code> 
-        </td><td> </td>
-        <td>
-        Sets user-defined datatype conversion callback function.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_type_conv_cb<br>(none)</code> 
-        </td><td> </td>
-        <td>
-        Gets user-defined datatype conversion callback function.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_hyper_vector_size<br>h5pset_hyper_vector_size_f</code> 
-        </td><td> </td>
-        <td>
-        Sets number of I/O vectors to be read/written in hyperslab I/O.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_hyper_vector_size<br>h5pget_hyper_vector_size_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves number of I/O vectors to be read/written in hyperslab I/O.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_btree_ratios<br>h5pset_btree_ratios_f</code> 
-        </td><td> </td>
-        <td>
-        Sets B-tree split ratios for a dataset transfer property list.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_btree_ratios<br>h5pget_btree_ratios_f</code> 
-        </td><td> </td>
-        <td>
-        Gets B-tree split ratios for a dataset transfer property list.
-        </td>
-        </tr>
-    <!-- NEW PAGE -->
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_vlen_mem_manager<br>(none)</code> 
-        </td><td> </td>
-        <td>
-        Sets the memory manager for variable-length datatype allocation in 
-        <code>H5Dread</code> and <code>H5Dvlen_reclaim</code>.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_vlen_mem_manager<br>(none)</code> 
-        </td><td> </td>
-        <td>
-        Gets the memory manager for variable-length datatype allocation in 
-        <code>H5Dread</code> and <code>H5Dvlen_reclaim</code>.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_dxpl_mpio<br>h5pset_dxpl_mpio_f</code> 
-        </td><td> </td>
-        <td>
-        Sets data transfer mode.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_dxpl_mpio<br>h5pget_dxpl_mpio_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the data transfer mode.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_dxpl_mpio_chunk_opt<br>(none)</code> 
-        </td><td> </td>
-        <td>
-        Sets a flag specifying linked-chunk I/O or multi-chunk I/O.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_dxpl_mpio_chunk_opt_num<br>(none)</code> 
-        </td><td> </td>
-        <td>
-        Sets a numeric threshold for linked-chunk I/O.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_dxpl_mpio_chunk_opt_ratio<br>(none)</code> 
-        </td><td> </td>
-        <td>
-        Sets a ratio threshold for collective I/O.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_dxpl_mpio_collective_opt<br>(none)</code> 
-        </td><td> </td>
-        <td>
-        Sets a flag governing the use of independent versus collective I/O. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_multi_type<br>(none)</code> 
-        </td><td> </td>
-        <td>
-        Sets the type of data property for the MULTI driver.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_multi_type<br>(none)</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the type of data property for the MULTI driver.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_small_data_block_size<br>h5pset_small_data_block_size_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the size of a contiguous block reserved for small data.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_small_data_block_size<br>h5pget_small_data_block_size_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the current small data block size setting.
-        </td>
-        </tr>
-        <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-
-
-
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="PModel">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<!-- NEW PAGE -->
-<a name="PModel">
-<h3 class=pagebefore>5.3. Programming Model</h3>
-</a>
-
-  <p>This section explains the programming model for datasets.</p>
-<br />
-<h4>5.3.1. General Model</h4>
-
-  <p>The programming model for using a dataset has three main phases:</p>
-  
-  <ul>
-    <li>Obtain access to the dataset </li>
-    <li>Operate on the dataset using the dataset identifier returned 
-    at access </li>
-    <li>Release the dataset</li>
-  </ul>
-  <p>These three phases or steps are described in more detail below the 
-  figure.</p>
-  
-  <p>A dataset may be opened several times and operations performed 
-  with several different identifiers to the same dataset. All the 
-  operations affect the dataset although the calling program must 
-  synchronize if necessary to serialize accesses.</p>
-
-  <p>Note that the dataset remains open until every identifier is closed. 
-  The figure below shows the basic sequence of operations.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dsets_fig2.JPG">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 2. Dataset programming sequence</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>Creation and data access operations may have optional parameters 
-  which are set with property lists.  The general programming model is:</p>
-
-  <ul>
-      <li>Create property list of appropriate class (dataset create, 
-          dataset transfer)</li>
-      <li>Set properties as needed; each type of property has its own 
-          format and datatype</li>
-      <li>Pass the property list as a parameter of the API call</li>
-  </ul>
-  <p>The steps below describe the programming phases or steps for using a 
-  dataset.</p>
-
-<h4><em>Step 1. Obtain Access</em></h4>
-
-  <p>A new dataset is created by a call to <code>H5Dcreate</code>. If 
-  successful, the call returns an identifier for the newly created dataset.</p>
-
-  <p>Access to an existing dataset is obtained by a call to <code>H5Dopen</code>. This call 
-  returns an identifier for the existing dataset.</p>
-
-  <p>An object reference 
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  (Chapter ???) 
-  ] ] ]</span>
--->
-  may be dereferenced to obtain an identifier to 
-  the dataset it points to.</p>
-  
-  <p>In each of these cases, the successful call returns an identifier 
-  to the dataset. The identifier is used in subsequent operations until 
-  the dataset is closed.</p>
-
-<h4><em>Step 2. Operate on the Dataset</em></h4>
-
-  <p>The dataset identifier can be used to write and read data to the dataset, 
-  to query and set properties, and to perform other operations such as 
-  adding attributes, linking in groups, and creating references.</p>
-
-  <p>The dataset identifier can be used for any number of 
-  operations until the dataset is closed.</p>
-
-<h4><em>Step 3. Close the Dataset</em></h4>
-
-  <p>When all operations are completed, the dataset identifier should 
-  be closed. This releases the dataset. </p>
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  { and writes all metadata to the file? }
-  ] ] ]</span>
--->
-
-  <p>After the identifier is closed, it cannot be used for further operations.</p>
-
-<h4>5.3.2. Create Dataset</h4>
-
-  <p>A dataset is created and initialized with a call to <code>H5Dcreate</code>. The dataset 
-  create operation sets permanent properties of the dataset:</p>
-
-  <ul>
-      <li>Name</li>
-      <li>Dataspace</li>
-      <li>Datatype</li>
-      <li>Storage properties</li>
-  </ul>
-
-  <p>These properties cannot be changed for the life of the dataset, 
-  although the dataspace may be expanded up to its maximum dimensions.</p>
-
-<h4><em>Name</em></h4>
-
-  <p>A dataset name is a sequence of alphanumeric ASCII characters. The 
-  full name would include a tracing of the group hierarchy from the root 
-  group of the file, e.g., /rootGroup/groupA/subgroup23/dataset1. The 
-  local name or relative name within the lowest-level group containing 
-  the dataset would include none of the group hierarchy. e.g., Dataset1.</p>
-
-
-<h4><em>Dataspace</em></h4>
-
-  <p>The dataspace of a dataset defines the number of dimensions and the 
-  size of each dimension. 
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  [[Dataspace]]. 
-  ] ] ]</span>
--->
-  The dataspace defines the number of dimensions, 
-  and the maximum dimension sizes and current size of each dimension. 
-  The maximum dimension size can be a fixed value or the constant 
-  <code>H5D_UNLIMITED</code>, in which case the actual dimension size 
-  can be changed with calls to <code>H5Dset_extent</code>, up to the 
-  maximum set with the <code>maxdims</code> parameter in the 
-  <a href="../RM/RM_H5S.html#Dataspace-CreateSimple" target=RMwindow>
-  <code>H5Screate_simple</code></a> call that established the 
-  dataset’s original dimensions. The maximum dimension size is set 
-  when the dataset is created and cannot be changed.</p>
-
-<h4><em>Datatype</em></h4>
-
-  <p>Raw data has a datatype which describes the layout of the raw data 
-  stored in the file. 
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  (See [[Datatype]]. 
-  ] ] ]</span>
--->
-  The datatype is set when the dataset is created 
-  and can never be changed. When data is transferred to and from the dataset, 
-  the HDF5 Library will assure that the data is transformed to and 
-  from the stored format.</p>
-
-<h4><em>Storage Properties</em></h4>
-
-  <p>Storage properties of the dataset are set when it is created. The 
-  required inputs table 
-  below shows the categories of storage properties. The storage properties 
-  cannot be changed after the dataset is created. </p>
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  in [[storage properties]]
-  ] ] ]</span>
--->
-
-<h4><em>Filters</em></h4>
-
-  <p>When a dataset is created, optional filters are specified. The 
-  filters are added to the data transfer pipeline when data is read or 
-  written. The standard library includes filters to implement compression, 
-  data shuffling, and error detection code.  Additional user-defined 
-  filters may also be used. </p>
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  See [[[filter]]].
-  ] ] ]</span>
--->
-
-  <p>The required filters are stored as part of the dataset, and the list may 
-  not be changed after the dataset is created. The HDF5 Library automatically 
-  applies the filters whenever data is transferred.</p>
-
-<h4><em>Summary</em></h4>
-
-  <p>A newly created dataset has no attributes and no data values. The 
-  dimensions, datatype, storage properties, and selected filters are set. 
-  The table below lists the required inputs, and the second table below lists 
-  the optional inputs.</p>
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 1. Required inputs</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="25%"><b>Required Inputs</b></td>
-        <td width="75%"><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Dataspace</td>
-        <td>The shape of the array.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Datatype</td>
-        <td>The layout of the stored elements.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Name</td>
-        <td>The name of the dataset in the group.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 2. Optional inputs</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="25%"><b>Optional Inputs</b></td>
-        <td width="75%"><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Storage Layout</td>
-        <td>How the data is organized in the file including chunking.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td> Fill Value</td>
-        <td>The behavior and value for uninitialized data.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td> External Storage</td>
-        <td>Option to store the raw data in an external file.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td> Filters</td>
-        <td>Select optional filters to be applied. One of the filters 
-        that might be applied is compression.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-<!-- NEW PAGE -->
-<h4><em>Example</em></h4>
-
-<p>To create a new dataset, go through the following general steps:</p>
-
-<ul>
-    <li>Set dataset characteristics (optional where default settings are 
-    acceptable)</li>
-    <ul>               
-        <li>Datatype</li>
-        <li>Dataspace</li>
-        <li>Dataset creation property list</li>
-    </ul> 
-    <li>Create the dataset</li>
-    <li>Close the datatype, dataspace, and property list (as necessary)</li>
-    <li>Close the dataset</li>
-    </ul>
-
-
-
-
-  <p>Example 1 below shows example code to create an empty dataset. The 
-  dataspace is 7 x 8, and the datatype is a big-endian integer. The dataset 
-  is created with the name “dset1” and is a member of the root 
-  group, “/”.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  hid_t    dataset, datatype, dataspace;   
-
-  /* 
-   * Create dataspace: Describe the size of the array and 
-   * create the dataspace for fixed-size dataset. 
-   */
-  dimsf[0] = 7;
-  dimsf[1] = 8;
-  dataspace = H5Screate_simple(2, dimsf, NULL); 
-  /*
-   * Define datatype for the data in the file.
-   * For this example, store little-endian integer numbers.
-   */
-  datatype = H5Tcopy(H5T_NATIVE_INT);
-  status = H5Tset_order(datatype, H5T_ORDER_LE);
-  /*
-   * Create a new dataset within the file using defined 
-   * dataspace and datatype. No properties are set.
-   */
-  dataset = H5Dcreate(file, "/dset", datatype, dataspace, H5P_DEFAULT, 
-            H5P_DEFAULT, H5P_DEFAULT);
-
-  H5Dclose(dataset);
-  H5Sclose(dataspace);
-  H5Tclose(datatype);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 1. Create an empty dataset</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<!-- NEW PAGE -->
-  <p>Example 2 below shows example code to create a similar dataset with a 
-  fill value of ‘-1’. 
-  This code has the same steps as in the example above, but uses a non-default 
-  property list. A file creation property list is created, and then the 
-  fill value is set to the desired value. Then the property list is passed 
-  to the <code>H5Dcreate</code> call.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  hid_t    dataset, datatype, dataspace;
-  hid_t plist;  /* property list */
-  int fillval = -1;
-  dimsf[0] = 7;
-  dimsf[1] = 8;
-  dataspace = H5Screate_simple(2, dimsf, NULL); 
-  
-  datatype = H5Tcopy(H5T_NATIVE_INT);
-  status = H5Tset_order(datatype, H5T_ORDER_LE);
-
-  /*
-   * Example of Dataset Creation property list: set fill value to '-1'
-   */
-  plist = H5Pcreate(H5P_DATASET_CREATE);
-  status = H5Pset_fill_value(plist, datatype, &fillval);
-
-  /* Same as above, but use the property list */
-  dataset = H5Dcreate(file, "/dset", datatype, dataspace, H5P_DEFAULT, 
-            plist, H5P_DEFAULT);
-
-  H5Dclose(dataset);
-  H5Sclose(dataspace);
-  H5Tclose(datatype);
-  H5Pclose(plist);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 2. Create a dataset with fill value set</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>After this code is executed, the dataset has been created and written to 
-  the file. The data array is uninitialized.  Depending on the storage 
-  strategy and fill value options that have been selected, some or all of the 
-  space may be allocated in the file, and fill values may be written in the 
-  file.</p>
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  See <<below>>.
-  ] ] ]</span>
--->
-
-<h4>5.3.3. Data Transfer Operations on a Dataset</h4>
-
-  <p>Data is transferred between memory and the raw data array of the dataset 
-  through <code>H5Dwrite</code> and <code>H5Dread</code> operations. A data 
-  transfer has the following basic steps:</p>
-  
-  <ol>
-      <li>Allocate and initialize memory space as needed</li>
-      <li>Define the datatype of the memory elements</li>
-      <li>Define the elements to be transferred (a selection, or all the 
-      elements)</li>
-      <li>Set data transfer properties (including parameters for filters or 
-          file drivers) as needed</li>
-      <li>Call the H5D API</li>
-  </ol>
-
-  <p>Note that the location of the data in the file, the datatype of the data in 
-  the file, the storage properties, and the filters do not need to be specified 
-  because these are stored as a permanent part of the dataset. A selection of 
-  elements from the dataspace is specified; the selected elements may be the 
-  whole dataspace.</p>
-
-<!-- NEW PAGE -->
-  <p>The figure below shows a diagram of a write operation which transfers a 
-  data array from memory to a dataset in the file (usually on disk). A read 
-  operation has similar parameters with the data flowing the other direction.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dsets_fig5.JPG" width="670">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 3. A write operation</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<h4><em>Memory Space</em></h4>
-
-  <p>The calling program must allocate sufficient memory to store the data 
-  elements to be transferred. For a write (from memory to the file), the 
-  memory must be initialized with the data to be written to the file. For 
-  a read, the memory must be large enough to store the elements that 
-  will be read. The amount of storage needed can be computed from the 
-  memory datatype (which defines the size of each data element) and the 
-  number of elements in the selection.</p>
-
-<!-- NEW PAGE -->
-<h4><em>Memory Datatype</em></h4>
-
-  <p>The memory layout of a single data element is specified by the memory 
-  datatype. This specifies the size, alignment, and byte order of the 
-  element as well as the datatype class. Note that the memory datatype 
-  must be the same datatype class as the file, but may have different byte 
-  order and other properties.  The HDF5 Library automatically transforms 
-  data elements between the source and destination layouts. See the chapter 
-  “<a href="11_Datatypes.html">HDF5 Datatypes</a>” 
-  for more details.</p>
-
-  <p>For a write, the memory datatype defines the layout of the data to be 
-  written; an example is IEEE floating-point numbers in native byte order. 
-  If the file datatype (defined when the dataset is created) is different 
-  but compatible, the HDF5 Library will transform each data element when 
-  it is written. For example, if the file byte order is different than 
-  the native byte order, the HDF5 Library will swap the bytes.</p>
-
-  <p>For a read, the memory datatype defines the desired layout of the 
-  data to be read. This must be compatible with the file datatype, but 
-  should generally use native formats, e.g., byte orders. The HDF5 Library 
-  will transform each data element as it is read.</p>
-
-<h4><em>Selection</em></h4>
-
-  <p>The data transfer will transfer some or all of the elements of the 
-  dataset depending on the dataspace selection. The selection has two 
-  dataspace objects: one for the source, and one for the destination. 
-  These objects describe which elements of the dataspace to be transferred. 
-  Some (partial I/O) or all of the data may be transferred. Partial I/O 
-  is defined by defining hyperslabs or lists of elements in a dataspace 
-  object.</p>
-
-  <p>The dataspace selection for the source defines the indices of the elements 
-  to be read or written. The two selections must define the same number of 
-  points, but the order and layout may be different.  The HDF5 Library 
-  automatically selects and distributes the elements according to the 
-  selections. It might, for example, perform a scatter-gather or 
-  sub-set of the data. </p>
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  See [[Selections]].
-  ] ] ]</span>
--->
-
-<h4><em>Data Transfer Properties</em></h4>
-
-  <p>For some data transfers, additional parameters should be set using the 
-  transfer property list. The table below lists the categories of transfer 
-  properties. These properties set parameters for the HDF5 Library and may 
-  be used to pass parameters for optional filters and file drivers. For 
-  example, transfer properties are used to select independent or collective 
-  operation when using MPI-I/O.</p>
-  
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 3. Categories of transfer properties</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td><b>Properties</b></td>
-        <td><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Library parameters</td>
-        <td>Internal caches, buffers, B-Trees, etc.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Memory management</td>
-        <td>Variable-length memory management, data overwrite</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>File driver management</td>
-        <td>Parameters for file drivers</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Filter management</td>
-        <td>Parameters for filters</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-<h4><em>Data Transfer Operation (Read or Write)</em></h4>
-
-  <p>The data transfer is done by calling <code>H5Dread</code> or 
-  <code>H5Dwrite</code> with the parameters described above. The HDF5 
-  Library constructs the required pipeline, which will scatter-gather, 
-  transform datatypes, apply the requested filters, and use the correct 
-  file driver.</p>
-
-  <p>During the data transfer, the transformations and filters are applied to 
-  each element of the data in the required order until all the 
-  data is transferred.</p>
-
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  <p>[[See Data Transfer Below]]
-  ] ] ]</span>
--->
-
-<h4><em>Summary</em></h4>
-
-  <p>To perform a data transfer, it is necessary to allocate and initialize 
-  memory, describe the source and destination, set required and optional 
-  transfer properties, and call the H5D API. </p>
-
-<h4><em>Examples</em></h4>
-
-  <p>The basic procedure to <b>write</b> to a dataset is the following:</p>
-
-<dir>
-  Open the dataset.<br>
-  Set the dataset dataspace for the write (optional if dataspace is 
-  <code>H5S_SELECT_ALL</code>).<br>
-  Write data.<br>
-  Close the datatype, dataspace, and property list (as necessary).<br>
-  Close the dataset.<br>
-</dir> 
-
-  <p>Example 3 below shows example code to write a 4 x 6 array of integers. 
-  In the example, the data is initialized in the memory array dset_data.  
-  The dataset has already been created in the file, so it is opened 
-  with <code>H5Dopen</code>.</p>
-
-  <p>The data is written with <code>H5Dwrite</code>. The arguments are the 
-  dataset identifier, the memory datatype (<code>H5T_NATIVE_INT</code>), the 
-  memory and file selections (<code>H5S_ALL</code> in this case: 
-  the whole array), and the default (empty) property list. The last argument 
-  is the data to be transferred.</p>
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  hid_t       file_id, dataset_id;  /* identifiers */
-  herr_t      status;
-  int         i, j, dset_data[4][6];
-
-  /* Initialize the dataset. */
-  for (i = 0; i < 4; i++)
-     for (j = 0; j < 6; j++)
-        dset_data[i][j] = i * 6 + j + 1;
-
-  /* Open an existing file. */
-  file_id = H5Fopen("dset.h5", H5F_ACC_RDWR, H5P_DEFAULT);
-
-  /* Open an existing dataset. */
-  dataset_id = H5Dopen(file_id, "/dset", H5P_DEFAULT);
-
-  /* Write the entire dataset, using 'dset_data': 
-        memory type is 'native int'
-        write the entire dataspace to the entire dataspace,
-        no transfer properties,
-   */
-  status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, 
-          H5S_ALL, H5P_DEFAULT, dset_data);
-
-  status = H5Dclose(dataset_id);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 3. Write an array of integers</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-  <p>Example 4 below shows a similar write except for setting a non-default 
-  value for the transfer buffer. 
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  <<explain what this does>>.  
-  ] ] ]</span>
--->
-  The code is the same as Example 3, but a transfer 
-  property list is created, and the desired buffer size is set. The 
-  <code>H5Dwrite</code> function has the same arguments, but uses the 
-  property list to set the buffer.</p>
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  hid_t       file_id, dataset_id;  
-  hid_t       xferplist;
-  herr_t      status;
-  int         i, j, dset_data[4][6];
-
-  file_id = H5Fopen("dset.h5", H5F_ACC_RDWR, H5P_DEFAULT);
-
-  dataset_id = H5Dopen(file_id, "/dset", H5P_DEFAULT);
-
-  /*
-   * Example: set type conversion buffer to 64MB
-   */
-  xferplist = H5Pcreate(H5P_DATASET_XFER);
-  status = H5Pset_buffer( xferplist, 64 * 1024 *1024, NULL, NULL);
-
-  /* Write the entire dataset, using 'dset_data': 
-        memory type is 'native int'
-        write the entire dataspace to the entire dataspace,
-        set the buffer size with the property list,
-   */
-  status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, 
-        H5S_ALL, xferplist, dset_data);
-
-  status = H5Dclose(dataset_id);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 4. Write an array using a property list</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  <p>Partial writes (i.e., of selected data elements, such as a hyperslab) 
-  are explained below [[partial I/O]]
-  ] ] ]</span>
--->
-
-  <p>The basic procedure to <b>read</b> from a dataset is the 
-  following:</p>
-
-<dir>
-  Define the memory dataspace of the read (optional if dataspace is 
-  <code>H5S_SELECT_ALL</code>).<br> 
-  Open the dataset.<br> 
-  Get the dataset dataspace (if using <code>H5S_SELECT_ALL</code> above).<br> 
-
-<dir>Else define dataset dataspace of read.</dir> 
-  Define the memory datatype (optional).<br> 
-  Define the memory buffer.<br> 
-  Open the dataset.<br> 
-  Read data.<br> 
-  Close the datatype, dataspace, and property list (as necessary).<br> 
-  Close the dataset.
-</dir>
-  
-
-  <p>The example below shows code that reads a 4 x 6 array of integers from 
-  a dataset called “dset1”. First, the dataset is opened. 
-  The <code>H5Dread</code> call has parameters:</p>
-<!-- NEW PAGE -->
-
-  <ul>
-      <li>The dataset identifier (from <code>H5Dopen</code>)</li>
-      <li>The memory datatype (<code>H5T_NATVE_INT</code>)</li>
-      <li>The memory and file dataspace (<code>H5S_ALL</code>, the whole array)</li>
-      <li>A default (empty) property list</li>
-      <li>The memory to be filled</li>
-  </ul>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  hid_t       file_id, dataset_id;  
-  herr_t      status;
-  int         i, j, dset_data[4][6];
-
-  /* Open an existing file. */
-  file_id = H5Fopen("dset.h5", H5F_ACC_RDWR, H5P_DEFAULT);
-
-  /* Open an existing dataset. */
-  dataset_id = H5Dopen(file_id, "/dset", H5P_DEFAULT);
-
-  /* read the entire dataset, into 'dset_data': 
-        memory type is 'native int'
-        read the entire dataspace to the entire dataspace,
-        no transfer properties,
-   */
-  status = H5Dread(dataset_id, H5T_NATIVE_INT, H5S_ALL, 
-        H5S_ALL, H5P_DEFAULT, dset_data);
-
-  status = H5Dclose(dataset_id);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 5. Read an array from a dataset</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<h4>5.3.4. Retrieve the Properties of a Dataset</h4>
-
-  <p>
-  The functions listed below allow the user to retrieve 
-  information regarding a dataset including the datatype, 
-  the dataspace, the dataset creation property list, 
-  and the total stored size of the data.</p>
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 4. Retrieve dataset information
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td> 
-        <b>Query Function</b></td><td> </td>
-        <td> 
-        <b>Description</b></td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td> <code>H5Dget_space</code></td><td> </td>
-        <td> Retrieve the dataspace of the dataset 
-        as stored in the file.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td> <code>H5Dget_type</code></td><td> </td>
-        <td> Retrieve the datatype of the dataset 
-        as stored in the file.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td> <code>H5Dget_create_plist</code></td><td> </td>
-        <td> Retrieve the 
-        dataset creation properties.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td> <code>H5Dget_storage_size</code></td><td> </td>
-        <td> 
-        Retrieve the total bytes for all the data of the dataset.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td> <code>H5Dvlen_get_buf_size</code></td><td> </td>
-        <td> 
-        Retrieve the total bytes for all the variable-length 
-        data of the dataset.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-<!-- NEW PAGE -->
-
-<p>The example below illustrates how to retrieve dataset information.</p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  hid_t       file_id, dataset_id;
-  hid_t       dspace_id, dtype_id, plist_id; 
-  herr_t      status;
-
-  /* Open an existing file. */
-  file_id = H5Fopen("dset.h5", H5F_ACC_RDWR, H5P_DEFAULT);
-
-  /* Open an existing dataset. */
-  dataset_id = H5Dopen(file_id, "/dset", H5P_DEFAULT);
-
-  dspace_id = H5Dget_space(dataset_id);
-  dtype_id = H5Dget_type(dataset_id);
-  plist_id = H5Dget_create_plist(dataset_id);
-
-  /* use the objects to discover the properties of the dataset */
-
-  status = H5Dclose(dataset_id);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 6. Retrieve dataset</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="DTransfer">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-
-<a name="DTransfer">
-<h3 class=pagebefore>5.4. Data Transfer</h3>
-</a>
-
-  <p>The HDF5 Library implements data transfers through a pipeline which 
-  implements data transformations (according to the datatype and selections), 
-  chunking (as requested), and I/O operations using different mechanisms 
-  (file drivers). The pipeline is automatically configured by the HDF5 
-  Library. Metadata is stored in the file so that the correct pipeline 
-  can be constructed to retrieve the data. In addition, optional filters 
-  such as compression may be added to the standard pipeline. </p>
-
-  <p>The figure below illustrates data layouts for different layers of an 
-  application using HDF5. The application data is organized as a 
-  multidimensional array of elements. The HDF5 format specification
-<!-- editingComment
-  <span class="editingComment">[ [ [
-   [[cite it]] 
-  ] ] ]</span>
--->
-  defines the stored layout of the data and metadata.  The storage layout 
-  properties define the organization of the abstract data. This data is 
-  written and read to and from some storage medium.</p>
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dsets_fig9.JPG" width="95%">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 4. Data layouts in an application </b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-  <p>The last stage of a write (and first stage of a read) is managed by 
-  an HDF5 file driver module.  The virtual file layer of the HDF5 Library 
-  implements a standard interface to alternative I/O methods, including 
-  memory (AKA “core”) files, single serial file I/O, multiple 
-  file I/O, and parallel I/O. The file driver maps a simple abstract HDF5 
-  file to the specific access methods.</p>
-
-  <p>The raw data of an HDF5 dataset is conceived to be a multidimensional 
-  array of data elements. This array may be stored in the file according to 
-  several storage strategies:</p> 
-
-
-  <ul>
-      <li>Contiguous</li>
-      <li>Chunked</li>
-      <li>Compact</li>
-  </ul>
-
-  <p>The storage strategy does not affect data access methods except that 
-  certain operations may be more or less efficient depending on the storage 
-  strategy and the access patterns.</p>
-
-  <p>Overall, the data transfer operations (<code>H5Dread</code> and 
-  <code>H5Dwrite</code>) work identically for any storage method, for any 
-  file driver, and for any filters and transformations. The HDF5 Library 
-  automatically manages the data transfer process. In some cases, transfer 
-  properties should or must be used to pass additional parameters such as 
-  MPI/IO directives when used the parallel file driver.</p>
-
-<h4>5.4.1. The Data Pipeline</h4>
-
-  <p>When data is written or read to or from an HDF5 file, the HDF5 
-  Library passes the data through a sequence of processing steps which 
-  are known as the HDF5 data pipeline. This data pipeline performs 
-  operations on the data in memory such as byte swapping, alignment, 
-  scatter-gather, and hyperslab selections. The HDF5 Library automatically 
-  determines which operations are needed and manages the organization 
-  of memory operations such as extracting selected elements from a 
-  data block. The data pipeline modules operate on data buffers: each 
-  module processes a buffer and passes the transformed buffer to the 
-  next stage.</p>
-
-  <p>The table below lists the stages of the data pipeline. The figure below 
-  the table shows the order of processing 
-  during a read or write.</p>
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 4. Stages of the data pipeline</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="35%"><b>Layers</b></td>
-        <td width="65%"><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>I/O initiation</td>
-        <td>Initiation of HDF5 I/O activities (<code>H5Dwrite</code> and 
-        <code>H5Dread</code>) in a user’s application program. </td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Memory hyperslab operation</td>
-        <td>Data is scattered to (for read), or gathered from (for write) 
-        the application’s memory buffer (bypassed if no datatype 
-        conversion is needed).</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Datatype conversion</td>
-        <td>Datatype is converted if it is different between memory and 
-        storage (bypassed if no datatype conversion is needed).</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>File hyperslab operation</td>
-        <td>Data is gathered from (for read), or scattered to (for write) to 
-        file space in memory (bypassed if no datatype conversion is needed).</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Filter pipeline</td>
-        <td>Data is processed by filters when it passes.  Data can be 
-        modified and restored here (bypassed if no datatype conversion 
-        is needed, no filter is enabled, or dataset is not chunked).</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Virtual File Layer</td>
-        <td>Facilitate easy plug-in file drivers such as MPIO or 
-        POSIX I/O.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Actual I/O</td>
-        <td>Actual file driver used by the library such as MPIO or STDIO.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dsets_fig10.JPG"><br>
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 5. The processing order in the data pipeline</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>The HDF5 Library automatically applies the stages as needed. </p>
-
-  <p>When the memory dataspace selection is other than the whole dataspace, 
-  the memory hyperslab stage scatters/gathers the data elements between 
-  the application memory (described by the selection) and a contiguous 
-  memory buffer for the pipeline. On a write, this is a gather operation; 
-  on a read, this is a scatter operation.</p>
-
-  <p>When the memory datatype is different from the file datatype, the 
-  datatype conversion stage transforms each data element. For example, if 
-  data is written from 32-bit big-endian memory, and the file datatype is 
-  32-bit little-endian, the datatype conversion stage will swap the bytes 
-  of every elements.  Similarly, when data is read from the file to 
-  native memory, byte swapping will be applied automatically when needed.</p>
-
-  <p>The file hyperslab stage is similar to the memory hyperslab stage, 
-  but is managing the arrangement of the elements according to the 
-  dataspace selection. When data is read, data elements are gathered from 
-  the data blocks from the file to fill the contiguous buffers which are then 
-  processed by the pipeline. When data is read, the elements from a buffer 
-  are scattered to the data blocks of the file.</p>
-
-<h4>5.4.2. Data Pipeline Filters</h4>
-
-  <p>In addition to the standard pipeline, optional stages, called filters, 
-  can be inserted in the pipeline. 
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  see [[chunked]]) 
-  ] ] ]</span>
--->
-  The standard distribution includes optional filters to 
-  implement compression and error checking. User applications may 
-  add custom filters as well.</p>
-
-  <p>The HDF5 Library distribution includes or employs 
-  several optional filters. These are listed in the table below. 
-  The filters are applied in the pipeline between the virtual file layer and 
-  the file hyperslab operation. See the figure above. The application can 
-  use any number of filters in any order.</p>
-  
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 5. Data pipeline filters</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="35%"><b>Filter</b></td>
-        <td width="65%"><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>gzip compression</td>
-        <td>Data compression using <code>zlib</code>.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Szip compression</td>
-        <td>Data compression using the Szip library. See The HDF Group 
-        website for more information regarding the 
-        <a href="http://www.hdfgroup.org/doc_resource/SZIP/" 
-        target="Ext1">Szip</a> filter.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>N-bit compression</td>
-        <td>Data compression using an algorithm specialized for 
-        n-bit datatypes.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Scale-offset compression</td>
-        <td>Data compression using using a “scale and 
-        offset” algorithm.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Shuffling</td>
-        <td>To improve compression performance, data is regrouped by 
-        its byte position in the data unit. In other words, the 
-        1<sup><font size="-1">st</font></sup>, 
-        2<sup><font size="-1">nd</font></sup>, 
-        3<sup><font size="-1">rd</font></sup>, and 
-        4<sup><font size="-1">th</font></sup> bytes of integers are 
-        stored together respectively.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Fletcher32</td>
-        <td>Fletcher32 checksum for error-detection.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-  <p>Filters may be used only for chunked data and are applied to chunks of 
-  data between the file hyperslab stage and the virtual file layer. At this 
-  stage in the pipeline, the data is organized as fixed-size blocks of 
-  elements, and the filter stage processes each chunk separately.</p>
-
-  <p>Filters are selected by dataset creation properties, and some behavior may 
-  be controlled by data transfer properties. The library determines what 
-  filters must be applied and applies them in the order in which they were
-  set by the application. That is, if an application calls
-  <code>H5Pset_shuffle</code> and then <code>H5Pset_deflate</code> when 
-  creating
-  a dataset’s creation property list, the library will apply the 
-  shuffle filter first and then the deflate filter.</p>
-  
-  <p>Information regarding the n-bit and scale-offset filters 
-  can be found in the “<a href="#N-Bit">Using the N-bit Filter</a>”
-  and “<a href="#ScaleOffset">Using the Scale-offset Filter</a>” 
-  sections, respectively.</p>
-
-<h4>5.4.3. File Drivers</h4>
-
-  <p>I/O is performed by the HDF5 virtual file layer. The file driver 
-  interface writes and reads blocks of data; each driver module implements 
-  the interface using different I/O mechanisms. The table below lists the 
-  file drivers currently supported. Note that the I/O mechanisms are 
-  separated from the pipeline processing: the pipeline and filter 
-  operations are identical no matter what data access mechanism is used.</p>
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 6. I/O file drivers</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td><b>File Driver</b></td>
-        <td><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5FD_CORE</code></td>
-        <td>Store in memory (optional backing store to disk file).</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5FD_FAMILY</code></td>
-        <td>Store in a set of files.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5FD_LOG</code></td>
-        <td>Store in logging file.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5FD_MPIO</code></td>
-        <td>Store using MPI/IO.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5FD_MULTI</code></td>
-        <td>Store in multiple files. There are several options to control 
-        layout.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5FD_SEC2</code></td>
-        <td>Serial I/O to file using Unix “section 2” functions.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5FD_STDIO</code></td>
-        <td>Serial I/O to file using Unix “stdio” functions.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-  <p>Each file driver writes/reads contiguous blocks of bytes from a logically 
-  contiguous address space. The file driver is responsible for managing the 
-  details of the different physical storage methods.</p>
-
-  <p>In serial environments, everything above the virtual file layer tends 
-  to work identically no matter what storage method is used. </p>
-  
-  <p>Some options may have substantially different performance depending 
-  on the file driver that is used. In particular, multi-file and parallel 
-  I/O may perform considerably differently from serial drivers depending 
-  on chunking and other settings.</p>
-
-<h4>5.4.4. Data Transfer Properties to Manage the Pipeline</h4>
-
-  <p>Data transfer properties set optional parameters that control parts of the 
-  data pipeline. The function listing below shows transfer properties 
-  that control the behavior of the library.</p>
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  <<Developers: explain what these do!>></p>
-  ] ] ]</span>
--->
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 5. Data transfer property list functions
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td> 
-        <b>Property</b></td><td> </td>
-        <td> 
-        <b>Description</b></td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td> <code>H5Pset_buffer</code></td><td> </td>
-        <td> 
-        Maximum size for the type conversion buffer and the background 
-        buffer. May also  
-        supply pointers to application-allocated buffers.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td> <code>H5Pset_hyper_cache</code></td><td> </td>
-        <td> 
-        Whether to cache hyperslab blocks during I/O.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td> <code>H5Pset_btree_ratios</code></td><td> </td>
-        <td> 
-        Set the B-tree split ratios for a dataset transfer property list. 
-        The split ratios determine what percent of children go in the 
-        first node when a node splits.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-  <p>Some filters and file drivers require or use additional parameters 
-  from the application program. These can be passed in the data transfer 
-  property list. The table below shows file driver property list functions.</p>
-  
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 6. File driver property list functions
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td> 
-        <b>Property</b></td><td> </td>
-        <td> 
-        <b>Description</b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td> <code>H5Pset_dxpl_mpio</code></td><td> </td>
-        <td> 
-        Control the MPI I/O transfer mode (independent or collective) 
-        during data I/O operations.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td> <code>H5Pset_small_data_block_size</code></td><td> </td>
-        <td> 
-        Reserves blocks of size bytes for the contiguous storage of the raw 
-        data portion of small datasets. The HDF5 Library then writes the raw data 
-        from small datasets to this reserved space which reduces unnecessary 
-        discontinuities within blocks of metadata and 
-        improves I/O performance.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td> <code>H5Pset_edc_check</code></td><td> </td>
-        <td> 
-        Disable/enable EDC checking for read. When selected, EDC 
-        is always written.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-  <p>The transfer properties are set in a property list which is passed as a 
-  parameter of the <code>H5Dread</code> or <code>H5Dwrite</code> call.  The 
-  transfer properties are passed to each pipeline stage. Each stage may use 
-  or ignore any property in the list. In short, there is one property list 
-  that contains all the properties.</p>
-
-
-<h4>5.4.5. Storage Strategies</h4>
-
-  <p>The raw data is conceptually a multi-dimensional array of elements that 
-  is stored as a contiguous array of bytes. The data may be physically stored 
-  in the file in several ways. The table below lists the storage strategies 
-  for a dataset.</p>
-  
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 7. Dataset storage strategies</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td><b>Storage Strategy</b></td>
-        <td><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Contiguous</td>
-        <td>The dataset is stored as one continuous array of bytes.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Chunked</td>
-        <td>The dataset is stored as fixed-size chunks.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Compact</td>
-        <td>A small dataset is stored in the metadata header.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-  <p>The different storage strategies do not affect the data transfer 
-  operations of the dataset: reads and writes work the same for any 
-  storage strategy.</p>
-
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  <p><<Relationship between storage strategies, and pipeline, filters, 
-  and file drivers.??>>
-  ] ] ]</span>
--->
-
-  <p>These strategies are described in the following sections.</p>
-
-<h4><em>Contiguous</em></h4>
-
-  <p>A contiguous dataset is stored in the file as a header and a single 
-  continuous array of bytes. See the figure below. In the case of a 
-  multi-dimensional array, the data is serialized in row major order. 
-  By default, data is stored contiguously.</p>
-
-
-<table width="400" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dsets_fig12.JPG">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 6. Contiguous data storage</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>Contiguous storage is the simplest model. It has several limitations. 
-  First, the dataset must be a fixed-size: it is not possible to extend 
-  the limit of the dataset or to have unlimited dimensions. In other 
-  words, if the number of dimensions of the array might change over 
-  time, then chunking storage must be used instead of contiguous. 
-  Second, because data is passed through the pipeline as fixed-size 
-  blocks, compression and other filters cannot be used with contiguous 
-  data.</p>
-
-  <!-- NEW PAGE -->
-<h4><em>Chunked</em></h4>
-
-  <p>The data of a dataset may be stored as fixed-size chunks. See the 
-  figure below. 
-  A chunk is a hyper-rectangle of any shape. 
-  When a dataset is chunked, each chunk is read or written as a single I/O 
-  operation, and individually passed from stage to stage of the data pipeline. 
-  </p>
-
-
-<table width="400" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dsets_fig13.JPG">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 7. Chunked data storage</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-  <p>Chunks may be any size and shape that fits in the dataspace of the dataset.
-  For example, a three dimensional dataspace can be chunked as 3-D cubes, 
-  2-D planes, or 1-D lines. The chunks may extend beyond the size of the 
-  dataspace. For example, a 3 x 3 dataset might by chunked in 2 x 2 chunks. 
-  Sufficient chunks will be allocated to store the array, and any extra space 
-  will not be accessible. So, to store the 3 x 3 array, four 2 x 2 chunks would 
-  be allocated with 5 unused elements stored.</p>
-
-  <p>Chunked datasets can be unlimited in any direction 
-  and can be compressed or filtered.</p>
-
-  <p>Since the data is read or written by chunks, chunking can have a dramatic 
-  effect on performance by optimizing what is read and written.  Note, too, 
-  that for specific access patterns such as parallel I/O, decomposition into 
-  chunks can have a large impact on performance.</p>
-
-  <p>Two restrictions have been placed on chunk shape and size:</p>
-
-  <ul>
-    <li>The rank of a chunk must be less than or equal to 
-        the rank of the dataset</li>
-    <li>Chunk size cannot exceed the size of a fixed-size dataset; 
-        for example, a dataset consisting of a 5 x 4 fixed-size array 
-        cannot be defined with 10 x 10 chunks</li>
-    </ul>
-
-
-<!-- NEW PAGE -->
-<h4><em>Compact</em></h4>
-
-  <p>For contiguous and chunked storage, the dataset header information and data 
-  are stored in two (or more) blocks. Therefore, at least two I/O operations 
-  are required to access the data: one to access the header, and one (or more) 
-  to access data. For a small dataset, this is considerable overhead.</p>
-
-  <p>A small dataset may be stored in a continuous array of bytes in the 
-  header block using the compact storage option. This dataset can be read 
-  entirely in one operation which retrieves the header and data.  
-  The dataset must fit in the header. This may vary depending on the 
-  metadata that is stored. In general, a compact dataset should be 
-  approximately 30 KB or less total size.
-  See the figure below.</p>
-
-
-<table width="400" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dsets_fig14.JPG">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 8. Compact data storage</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-<h4>5.4.6. Partial I/O Sub-setting and Hyperslabs</h4>
-
-  <p>Data transfers can write or read some of the data elements of the dataset. 
-  This is controlled by specifying two selections: one for the source and 
-  one for the destination. Selections are specified by creating a dataspace 
-  with selections. </p>
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  (see [[dataspace chapter]])
-  ] ] ]</span>
--->
-
-  <p>Selections may be a union of hyperslabs or a list of points.
-  A hyperslab is a contiguous hyper-rectangle from the dataspace. 
-  Selected fields of a compound datatype may be read or written. 
-  In this case, the selection is controlled by the memory and file 
-  datatypes.</p>
-
-  <p>Summary of procedure:</p>
-  
-  <ol>
-      <li>Open the dataset</li>
-      <li>Define the memory datatype</li>
-      <li>Define the memory dataspace selection and file dataspace 
-      selection</li>
-      <li>Transfer data (<code>H5Dread</code> or <code>H5Dwrite</code>)</li>
-  </ol>
-
-  <p>For a detailed explanation of selections, see the chapter
-  “<a href="12_Dataspaces.html">HDF5 Dataspaces and Partial I/O</a>.
-  ”</p>
-  
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="Allocation">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-
-
-
-
-
-
-
-<br />
-<!-- NEW PAGE -->
-<a name="Allocation">
-<h3 class=pagebefore>5.5. Allocation of Space in the File</h3>
-</a>
-
-  <p>When a dataset is created, space is allocated in the file for its 
-  header and initial data. The amount of space allocated when the dataset 
-  is created depends on the storage properties. When the dataset is 
-  modified (data is written, attributes added, or other changes), 
-  additional storage may be allocated if necessary.</p>
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 8. Initial dataset size</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="15%"><b>Object</b></td>
-        <td width="85%"><b>Size</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Header</td>
-        <td>Variable, but typically around 256 bytes at the creation of 
-        a simple dataset with a simple datatype.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Data</td>
-        <td>Size of the data array (number of elements x size of element). 
-        Space allocated in the file depends on the storage strategy 
-        and the allocation strategy.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-<h4><em>Header</em></h4>
-
-  <p>A dataset header consists of one or more header messages containing 
-  persistent metadata describing various aspects of the dataset. 
-  These records are defined in the <a href="../H5.format.html"><i>HDF5 File 
-  Format Specification</i></a>. The amount of storage required for the 
-  metadata depends on the metadata to be stored. The table below 
-  summarizes the metadata.</p>
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 9. Metadata storage sizes</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="25%"><b>Header Information</b></td>
-        <td width="70%"><b>Approximate Storage Size</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Datatype (required)</td>
-        <td>Bytes  or more. Depends on type.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Dataspace (required)</td>
-        <td>Bytes or more. Depends on number of dimensions and hsize_t.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Layout (required)</td>
-        <td>Points to the stored data. Bytes or more. Depends on hsize_t and 
-        number of dimensions.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Filters</td>
-        <td>Depends on the number of filters. The size of the filter message 
-        depends on the name and data that will be passed.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-  <p>The header blocks also store the name and values of attributes, so 
-  the total storage depends on the number and size of the attributes.</p>
-
-  <p>In addition, the dataset must have at least one link, including a name, 
-  which is stored in the file and in the group it is linked from.</p>
-
-  <p>The different storage strategies determine when and how much space is 
-  allocated for the data array. See the discussion of fill values below
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  Link
-  ] ] ]</span>
--->
-  for a detailed explanation of the storage allocation.</p>
-
-  <!-- NEW PAGE -->
-<h4><em>Contiguous Storage</em></h4>
-
-  <p>For a continuous storage option, the data is stored in a single, 
-  contiguous block in the file.  The data is nominally a fixed-size, 
-  (number of elements x size of element). The figure below shows an example 
-  of a two dimensional array stored as a contiguous dataset.</p>
-
-  <p>Depending on the fill value properties, the space may be allocated 
-  when the dataset is created or when first written (default), and filled 
-  with fill values if specified. For parallel I/O, by default the space 
-  is allocated when the dataset is created.</p>
-  
-
-<table width="400" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dsets_fig15.JPG">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 9. A two dimensional array stored as a contiguous dataset</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<h4><em>Chunked</em></h4>
-
-  <p>For chunked storage, the data is stored in one or more chunks.  Each chunk 
-  is a continuous block in the file, but chunks are not necessarily stored 
-  contiguously. Each chunk has the same size.  The data array has the same 
-  nominal size as a contiguous array (number of elements x size of element), 
-  but the storage is allocated in chunks, so the total size in the file can 
-  be larger that the nominal size of the array. See the figure below.</p>
-  
-  <p>If a fill value is defined, each chunk will be filled with the fill value. 
-  Chunks must be allocated when data is written, but they may be allocated when 
-  the file is created, as the file expands, or when data is written. </p>
-
-  <p>For serial I/O, by default chunks are allocated incrementally, as data is 
-  written to the chunk. For a sparse dataset, chunks are allocated only for the 
-  parts of the dataset that are written. In this case, if the dataset is 
-  extended, no storage is allocated.</p>
-
-  <p>For parallel I/O, by default chunks are allocated when the dataset is 
-  created or extended with fill values written to the chunk.</p>
-
-  <p>In either case, the default can be changed using fill value properties.  
-  For example, using serial I/O, the properties can select to allocate 
-  chunks when the dataset is created.</p>
-
-  
-
-<table width="400" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dsets_fig16.JPG">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 10. A two dimensional array stored in chunks</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-<h4><em>Changing Dataset Dimensions</em></h4>  
-  
-  <p><code>H5Dset_extent</code> is used to change the current dimensions 
-  of the dataset within the limits of the dataspace.  Each dimension can 
-  be extended up to its maximum or unlimited. Extending the dataspace may 
-  or may not allocate space in the file and may or may not write fill 
-  values, if they are defined. See the example code below.</p>
-
-  <p>The dimensions of the dataset can also reduced. If the sizes specified 
-  are smaller than the dataset�s current dimension sizes, 
-  <code>H5Dset_extent</code> will reduce the dataset�s dimension sizes to 
-  the specified values. It is the user�s responsibility to ensure that 
-  valuable data is not lost; <code>H5Dset_extent</code> does not check.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  hid_t       file_id, dataset_id;  
-  Herr_t      status;
-  size_t      newdims[2];
-
-  /* Open an existing file. */
-  file_id = H5Fopen("dset.h5", H5F_ACC_RDWR, H5P_DEFAULT);
-
-  /* Open an existing dataset. */
-  dataset_id = H5Dopen(file_id, "/dset", H5P_DEFAULT);
-
-  /* Example:  dataset is 2 x 3, each dimension is UNLIMITED */
-  /* extend to 2 x 7 */
-  newdims[0] = 2;
-  newdims[1] = 7;
-
-  status = H5Dset_extent(dataset_id, newdims);
-
-  /* dataset is now 2 x 7 */
-
-  status = H5Dclose(dataset_id);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 7. Using <code>H5Dset_extent</code> 
-        to increase the size of a dataset</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<h4>5.5.1. Storage Allocation in the File: Early, Incremental, Late</h4>
-
-  <p>The HDF5 Library implements several strategies for when storage is 
-  allocated if and when it is filled with fill values for elements not 
-  yet written by the user. Different strategies are recommended for 
-  different storage layouts and file drivers. In particular, a parallel 
-  program needs storage allocated during a collective call (for example, 
-  create or extend) while serial programs may benefit from delaying the 
-  allocation until the data is written.</p>
-
-  <p>Two file creation properties control when to allocate space, when to 
-  write the fill value, and the actual fill value to write. </p>
-
- 
-  <h4><em>When to Allocate Space</em></h4>  
-
-  <p>The table below shows the options for when data is allocated in the 
-  file. “Early” allocation is done during the dataset create 
-  call. Certain file drivers (especially MPI-I/O and MPI-POSIX) require 
-  space to be allocated when a dataset is created, so all processors will 
-  have the correct view of the data.</p>
-  
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 10. File storage allocation options</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="20%"><b>Strategy</b></td>
-        <td width="80%"><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Early</td>
-        <td>Allocate storage for the dataset immediately when the dataset 
-        is created. </td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Late</td>
-        <td>Defer allocating space for storing the dataset until the 
-        dataset is written.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Incremental</td>
-        <td>Defer allocating space for storing each chunk until 
-        the chunk is written.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Default</td>
-        <td>Use the strategy (Early, Late, or Incremental) for the storage method 
-        and access method. This is the recommended strategy.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-  <p>“Late” allocation is done at the time of the first write to 
-  dataset. Space for the whole dataset is allocated at the first write.</p>
-
-  <p>“Incremental” allocation (chunks only) is done at the time 
-  of the first write to the chunk. Chunks that have never been written are 
-  not allocated in the file. In a sparsely populated dataset, this option 
-  allocates chunks only where data is actually written.</p>
-
-
-  <p>The “Default” property selects the option recommended as 
-  appropriate for the storage method and access method. The defaults are 
-  shown in the table below. Note that “Early” allocation is 
-  recommended for all Parallel I/O, while other options are recommended 
-  as the default for serial I/O cases.</p>
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Table 11. Default storage options</b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="33%"> 
-        <b> </b></td>
-        <td width="34%"> 
-        <b>Serial I/O</b></td>
-        <td width="33%"> 
-        <b>Parallel I/O</b></td>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Contiguous Storage</td>
-        <td>Late</td>
-        <td>Early</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Chunked Storage</td>
-        <td>Incremental</td>
-        <td>Early</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Compact Storage</td>
-        <td>Early</td>
-        <td>Early</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
- 
-<h4><em>When to Write the Fill Value</em></h4>  
-
-  <p>The second property is when to write the fill value. The possible values 
-  are “Never” and “Allocation”. 
-  The table below shows these options.</p>
-  
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 12. When to write fill values</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="15%"><b>When</b></td>
-        <td width="85%"><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Never</td>
-        <td>Fill value will never be written.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Allocation</td>
-        <td>Fill value is written when space is allocated. (Default for 
-        chunked and contiguous data storage.)</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-<h4><em>Fill Values</em></h4>  
-
-  <p>The third property is the fill value to write. The table below shows the 
-  values. By default, the data is filled with zeroes. The application may 
-  choose no fill value (Undefined). In this case, uninitialized data may have 
-  random values. The application may define a fill value of an 
-  appropriate type. See the chapter “<a href="11_Datatypes.html">HDF5 
-  Datatypes</a>” for more information regarding fill values.</p>
-  
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 13. Fill values</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td><b>What to Write</b></td>
-        <td><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Default</td>
-        <td>By default, the library fills allocated space with zeroes.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Undefined</td>
-        <td>Allocated space is filled with random values.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>User-defined</td>
-        <td>The application specifies the fill value.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-  <p>Together these three properties control the library’s behavior. 
-  The table below summarizes the possibilities during the dataset 
-  create-write-close cycle.</p>
-  
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="4" align="left" valign="bottom">
-        <b>Table 14. Storage allocation and fill summary</b></td>
-        </tr>
-    <tr><td colspan="4"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="17%"> 
-        <b>When to<br />allocate<br />space</b></td>
-        <td width="17%"> 
-        <b>When to<br />write fill<br />value</b></td>
-        <td width="17%"> 
-        <b>What fill<br />value to<br />write</b></td>
-        <td width="49%"> 
-        <b>Library create-write-close behavior</b></td>
-    <tr><td colspan="4"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Early</td>
-        <td>Never</td>
-        <td>-</td>
-        <td>Library allocates space when dataset is created, but never 
-        writes a fill value to dataset. A read of unwritten data returns 
-        undefined values.</td>
-        </tr>
-    <tr><td colspan="4"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Late</td>
-        <td>Never</td>
-        <td>-</td>
-        <td>Library allocates space when dataset is written to, but never 
-        writes a fill value to the dataset. A read of unwritten data 
-        returns undefined values.</td>
-        </tr>
-    <tr><td colspan="4"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Incremental</td>
-        <td>Never</td>
-        <td>-</td>
-        <td>Library allocates space when a dataset or chunk (whichever 
-        is the smallest unit of space) is written to, but it never writes 
-        a fill value to a dataset or a chunk. A read of unwritten data 
-        returns undefined values.</td>
-        </tr>
-    <tr><td colspan="4"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>-</td>
-        <td>Allocation</td>
-        <td>Undefined</td>
-        <td><b>Error</b> on creating the dataset. The dataset is not 
-        created.</td>
-        </tr>
-    <tr><td colspan="4"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Early</td>
-        <td>Allocation</td>
-        <td>Default or User-defined</td>
-        <td>Allocate space for the dataset when the dataset is created. 
-        Write the fill value (default or user-defined) to the entire 
-        dataset when the dataset is created.</td>
-        </tr>
-    <tr><td colspan="4"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Late</td>
-        <td>Allocation</td>
-        <td>Default or User-defined</td>
-        <td>Allocate space for the dataset when the application first 
-        writes data values to the dataset. Write the fill value to the 
-        entire dataset before writing application data values.</td>
-        </tr>
-    <tr><td colspan="4"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Incremental</td>
-        <td>Allocation</td>
-        <td>Default or User-defined</td>
-        <td>Allocate space for the dataset when the application first 
-        writes data values to the dataset or chunk (whichever is the 
-        smallest unit of space). Write the fill value to the entire dataset 
-        or chunk before writing application data values. </td>
-        </tr>
-    <tr><td colspan="4"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-
-
-
-<!-- NEW PAGE -->
-  <p>During the <code>H5Dread</code> function call, the library behavior 
-  depends on whether space has been allocated, whether the fill value has 
-  been written to storage, how the fill value is defined, and when to 
-  write the fill value. The table below summarizes the different behaviors.</p>
-  
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="4" align="left" valign="bottom">
-        <b>Table 15. <code>H5Dread</code> summary</b></td>
-        </tr>
-    <tr><td colspan="4"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="17%"> 
-        <b>Is space<br />allocated<br />in the file?</b></td>
-        <td width="17%"> 
-        <b>What is the<br />fill value?</b></td>
-        <td width="17%"> 
-        <b>When to<br />write the<br />fill value?</b></td>
-        <td width="49%"> 
-        <b>Library read behavior</b></td>
-    <tr><td colspan="4"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>No</td>
-        <td>Undefined</td>
-        <td><<any>></td>
-        <td><b>Error</b>. Cannot create this dataset.</td>
-        </tr>
-    <tr><td colspan="4"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>No</td>
-        <td>Default or User-defined</td>
-        <td><<any>></td>
-        <td>Fill the memory buffer with the fill value.</td>
-        </tr>
-    <tr><td colspan="4"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Yes</td>
-        <td>Undefined</td>
-        <td><<any>></td>
-        <td>Return data from storage (dataset). Trash is possible if 
-        the application has not written data to the portion of the 
-        dataset being read.</td>
-        </tr>
-    <tr><td colspan="4"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Yes</td>
-        <td>Default or User-defined</td>
-        <td>Never</td>
-        <td>Return data from storage (dataset). Trash is possible if the 
-        application has not written data to the portion of the dataset being 
-        read.</td>
-        </tr>
-    <tr><td colspan="4"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Yes</td>
-        <td>Default or User-defined</td>
-        <td>Allocation</td>
-        <td>Return data from storage (dataset).</td>
-        </tr>
-    <tr><td colspan="4"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-  <p>There are two cases to consider depending on whether the space in the 
-  file has been allocated before the read or not. When space has not yet 
-  been allocated and if a fill value is defined, the memory buffer will 
-  be filled with the fill values and returned. In other words, no data 
-  has been read from the disk. If space has been allocated, the values 
-  are returned from the stored data. The unwritten elements will be 
-  filled according to the fill value.</p>
-  
-
-<h4>5.5.2.  Deleting a Dataset from a File and Reclaiming Space</h4>
-
-  <p>HDF5 does not at this time provide an easy mechanism to remove a dataset 
-  from a file or to reclaim the storage space occupied by a deleted object. </p>
-  
-  <p>Removing a dataset and reclaiming the space it used can be done with 
-  the <code>H5Ldelete</code> function and the 
-  <a href="../RM/Tools.html#Tools-Repack">h5repack</a> utility program.
-  With the <code>H5Ldelete</code> function, links to a dataset can be 
-  removed from the file structure. After all the links have been removed, 
-  the dataset becomes inaccessible to any application and is effectively 
-  removed from the file. The way to recover the space occupied by an 
-  unlinked dataset is to write all of the objects of the file into a 
-  new file. Any unlinked object is inaccessible to the application and 
-  will not be included in the new file. Writing objects to a new file 
-  can be done with a custom program or with the h5repack utility program.</p>
-
-  <!-- 8.11.10, MEE: in the paragraph below, the link should be changed.
-  Links are now done separately from groups, but there is no HDF5 Links 
-  chapter yet. -->
-  <p>See the chapter “<a href="09_Groups.html">HDF5 Groups</a>” for 
-  further discussion of HDF5 file structures and the use of links. </p>
-
-<h4>5.5.3. Releasing Memory Resources</h4>
-
-  <p>The system resources required for HDF5 objects such as datasets, 
-  datatypes, and dataspaces should be released once access to the object is 
-  no longer needed. This is accomplished via the appropriate close function. 
-  This is not unique to datasets but a general requirement when working 
-  with the HDF5 Library; failure to close objects will result in resource leaks. </p>
-
-  <p>In the case where a dataset is created or data has been transferred, 
-  there are several objects that must be closed. These objects 
-<!-- editingComment
-<span class="editingComment">
-   [ [ [ 
-   (T? above) 
-   originally appeared here.  On the full editorial pass, 
-   see if there is any apparent reason for the question.
-   ] ] ]
-  </span>
--->
-  include datasets, 
-  datatypes, dataspaces, and property lists. </p>
-
-  <p>The application program must free any memory variables and buffers it 
-  allocates. When accessing data from the file, the amount of memory required 
-  can be determined by calculating the size of the memory datatype and the 
-  number of elements in the memory selection.</p>
-
-  <p>Variable-length data are organized in two or more areas of memory. 
-  See “<a href="11_Datatypes.html">HDF5 Datatypes</a>” for 
-  more information. When writing data, the application creates an array 
-  of <code>vl_info_t</code> which contains pointers to the elements. 
-  The elements might be, for example, strings. In the file, the 
-  variable-length data is stored in two parts: a heap with the 
-  variable-length values of the data elements and an array of 
-  <code>vlinfo_t</code> elements. When the data is read, the amount of 
-  memory required for the heap can be determined with the 
-  <code>H5Dget_vlen_buf_size</code> call.</p>
-
-  <p>The data transfer property may be used to set a custom memory manager 
-  for allocating variable-length data for a <code>H5Dread</code>. This is 
-  set with the <code>H5Pset_vlen_mem_manager</code> call.</p>
-
-  <p>To free the memory for variable-length data, it is necessary to visit 
-  each element, free the variable-length data, and reset the element. The 
-  application must free the memory it has allocated. For memory allocated 
-  by the HDF5 Library during a read, the <code>H5Dvlen_reclaim</code> 
-  function can be used to perform this operation.</p>
-
-<h4>5.5.4. External Storage Properties</h4>
-
-  <p>The external storage format allows data to be stored across a set of 
-  non-HDF5 files. A set of segments (offsets and sizes) in one or more files 
-  is defined as an external file list, or EFL, and the contiguous logical 
-  addresses of the data storage are mapped onto these segments. Currently, 
-  only the <code>H5D_CONTIGUOUS</code> storage format allows external storage. 
-  External storage is enabled by a dataset creation property. The table 
-  below shows the API.</p>
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 16. External storage API</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td><b>Function</b></td>
-        <td><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td width="50%">
-        <code>herr_t H5Pset_external (hid_t plist, const char *name, 
-        off_t offset, hsize_t size)</code></td>
-        <td width="50%">This function adds a new segment to the end of 
-        the external file list of the specified dataset creation property 
-        list. The segment begins a byte offset of file name and continues 
-        for size bytes. The space represented by this segment is adjacent 
-        to the space already represented by the external file list. The 
-        last segment in a file list may have the size 
-        <code>H5F_UNLIMITED</code>, in which case the external file may 
-        be of unlimited size and no more files can be added to the 
-        external files list.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>int H5Pget_external_count (hid_t plist)</code></td>
-        <td>Calling this function returns the number of segments in an 
-        external file list. If the dataset creation property list has no 
-        external data, then zero is returned.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Pget_external (hid_t plist, int idx, size_t 
-        name_size,<br />char *name, off_t *offset,<br />hsize_t *size)</code></td>
-        <td>This is the counterpart for the <code>H5Pset_external()</code> 
-        function. Given a dataset creation property list and a zero-based 
-        index into that list, the file name, byte offset, and segment 
-        size are returned through non-null arguments. At most name_size 
-        characters are copied into the name argument which is not null 
-        terminated if the file name is longer than the supplied name 
-        buffer (this is similar to <code>strncpy()</code>). </td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-  <p>The figure below shows an example of how a contiguous, one-dimensional 
-  dataset is partitioned into three parts and each of those parts is stored 
-  in a segment of an external file. The top rectangle represents the logical 
-  address space of the dataset while the bottom rectangle represents an 
-  external file.</p>
-  
-
-<table width="500" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dsets_fig19.JPG">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 11. External file storage</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>The example below shows code that defines the external storage for the 
-  example. Note that the segments are defined in order of the logical 
-  addresses they represent, not their order within the external file. It 
-  would also have been possible to put the segments in separate files. 
-  Care should be taken when setting up segments in a single file since 
-  the library does not automatically check for segments that overlap.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  Plist = H5Pcreate (H5P_DATASET_CREATE);
-  H5Pset_external (plist, "velocity.data", 3000, 1000);
-  H5Pset_external (plist, "velocity.data", 0, 2500);
-  H5Pset_external (plist, "velocity.data", 4500, 1500);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 8. External storage</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-  <p>The figure below shows an example of how a contiguous, two-dimensional 
-  dataset is partitioned into three parts and each of those parts is 
-  stored in a separate external file. The top rectangle represents the 
-  logical address space of the dataset while the bottom rectangles 
-  represent external files.</p>
-  
-  
-<table width="500" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dsets_fig20.jpg">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 12. Partitioning a 2-D dataset for external storage</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>The example below shows code for the partitioning described above.
-  In this example, the library maps the multi-dimensional array onto a linear 
-  address space as defined by the HDF5 format specification, and then maps that 
-  address space into the segments defined in the external file list. </p>
-
-  
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  Plist = H5Pcreate (H5P_DATASET_CREATE);
-  H5Pset_external (plist, "scan1.data", 0, 24);
-  H5Pset_external (plist, "scan2.data", 0, 24);
-  H5Pset_external (plist, "scan3.data", 0, 16);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 9. Partitioning a 2-D dataset for external storage</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>The segments of an external file can exist beyond the end of the 
-  (external) file. The library reads that part of a segment as zeros. When 
-  writing to a segment that exists beyond the end of a file, the external 
-  file is automatically extended. Using this feature, one can create a 
-  segment (or set of segments) which is larger than the current size of 
-  the dataset. This allows the dataset to be extended at a future time 
-  (provided the dataspace also allows the extension).</p>
-
-  <p>All referenced external data files must exist before performing raw 
-  data I/O on the dataset. This is normally not a problem since those files 
-  are being managed directly by the application or indirectly through some 
-  other library. However, if the file is transferred from its original 
-  context, care must be taken to assure that all the external files are 
-  accessible in the new location.</p>
-
-<br />
-<!-- NEW PAGE -->
-<a name="UseFilters">
-<h3 class=pagebefore>5.6. Using HDF5 Filters</h3>
-</a>
-<p>This section describes in detail how to use the n-bit and 
-scale-offset filters. </p>
-
-
-<a name="N-Bit">
-<h3>5.6.1. Using the N-bit Filter</h3>
-</a>
-
-<p>N-bit data has <i>n</i> significant bits,  
-  where <i>n</i> may not correspond to a precise number of bytes.
-  On the other hand, computing systems and applications universally, 
-  or nearly so, run most efficiently when manipulating data as 
-  whole bytes or multiple bytes.</p>
-
-<p>Consider the case of 12-bit integer data.  
-  In memory, that data will be handled in at least 2 bytes, or 16 bits, 
-  and on some platforms in 4 or even 8 bytes.
-  The size of such a dataset can be significantly reduced when written 
-  to disk if the unused bits are stripped out.</p>
-  
-<p>The <i>n-bit filter</i> is provided for this purpose,  
-  <i>packing</i> n-bit data on output by stripping off all unused bits 
-  and <i>unpacking</i> on input, restoring the extra bits required
-  by the computational processor.</p>
-  
-<h4><em>N-bit Datatype</em></h4>
-
-<p>An <i>n-bit datatype</i> is a datatype of <i>n</i> significant bits.
-  Unless it is packed, an <i>n</i>-bit datatype is presented as an 
-  <i>n</i>-bit bitfield within a larger-sized value.  
-  For example, a 12-bit datatype might be presented as a 12-bit field 
-  in a 16-bit, or 2-byte, value.</p>
-
-<p>Currently, the datatype classes of n-bit datatype or n-bit field of a 
-  compound datatype or an array datatype are limited to integer or 
-  floating-point.</p>
-  
-<p>The HDF5 user can create an n-bit datatype through a series of
-  of function calls.
-  For example, the following calls create a 16-bit datatype 
-  that is stored in a 32-bit value with a 4-bit offset:</p>
-<dir><pre>
-hid_t nbit_datatype = H5Tcopy(H5T_STD_I32LE);
-H5Tset_precision(nbit_datatype, 16);
-H5Tset_offset(nbit_datatype, 4);
-</pre></dir>
-  
-<p>In memory, one value of the above example n-bit datatype would be stored on 
-  a little-endian machine as follows:</p>
-  
-<dl>
-      <dt>
-        <table border="1" width="80%" align="center">
-          <tr>
-            <td width="25%" align="center">byte 3</td>
-            <td width="25%" align="center">byte 2</td>
-            <td width="25%" align="center">byte 1</td>
-            <td width="25%" align="center">byte 0</td>
-          </tr>
-          <tr>
-            <td width="25%" align="center"><code>????????</code></td>
-            <td width="25%" align="center"><code>????SPPP</code></td>
-            <td width="25%" align="center"><code>PPPPPPPP</code></td>
-            <td width="25%" align="center"><code>PPPP????</code></td>
-          </tr>
-        </table>
-        <table width="80%" border="0" align="center">
-          <tr>
-            <td colspan="4"><font size="-1">
-              Key: 
-                  <code>S</code> - sign bit, 
-                  <code>P</code> - significant bit, 
-                  <code>?</code> - padding bit 
-              <br>
-              Sign bit is included in signed integer datatype precision.
-	    </font></td>
-          </tr>
-        </table>
-        <br>
-        
-      </dt>
-</dl>
-<br />
-
-<!-- NEW PAGE -->
-<h4><em>N-bit Filter</em></h4>
-
-<p>When data of an n-bit datatype is stored on disk using the 
-  n-bit filter, the filter <i>packs</i> the data by stripping off the 
-  padding bits; only the significant bits are retained and stored.  
-  The values on disk will appear as follows:</p>
-  
-<dl>
-      <dt>
-        <table border="1" width="80%" align="center">
-          <tr>
-            <td width="45%" align="center">1st value</td>
-            <td width="45%" align="center">2nd value</td>
-            <td width="10%" align="center"> </td>
-          </tr>
-          <tr>
-            <td width="45%" align="center"><code>SPPPPPPP PPPPPPPP</code></td>
-            <td width="45%" align="center"><code>SPPPPPPP PPPPPPPP</code></td>
-            <td width="10%" align="center">...</td>
-          </tr>
-        </table>
-        <table width="80%" border="0" align="center">
-          <tr>
-            <td colspan="4"><font size="-1">
-              Key: 
-                  <code>S</code> - sign bit, 
-                  <code>P</code> - significant bit, 
-                  <code>?</code> - padding bit 
-              <br>
-              Sign bit is included in signed integer datatype precision.
-	    </font></td>
-          </tr>
-        </table>
-      </dt>
-</dl>
-<br />
-
-
-<p>The n-bit filter can be used effectively for compressing data of an n-bit
-  datatype, including arrays and the n-bit fields of compound datatypes. 
-  The filter supports complex situations where a compound datatype 
-  contains member(s) of a compound datatype or an array datatype has
-  a compound datatype as the base type.</p>
-
-<p>At present, the n-bit filter supports all datatypes. 
-  For datatypes of class time, string,
-  opaque, reference, <small>ENUM</small>, and 
-  variable-length, the n-bit filter acts as a no-op which is short for no 
-  operation. 
-  For convenience, the rest of this section refers to such datatypes 
-  as <i>no-op datatypes</i>.</p>
-
-<p>As is the case with all HDF5 filters, an application using 
-  the n-bit filter must store data with chunked storage.</p>
-  
-<h4><em>How Does the N-bit Filter Work?</em></h4>
-
-<p>The n-bit filter always compresses and decompresses according to
-  dataset properties supplied by the HDF5 Library in the 
-  datatype, dataspace, or dataset creation property list.</p>
-
-<p>The dataset datatype refers to how data is stored in an HDF5 file while 
-  the memory datatype refers to how data is stored in memory.
-  The HDF5 Library will do datatype conversion when writing data 
-  in memory to the dataset or reading data from the dataset to memory if 
-  the memory datatype differs from the dataset datatype. 
-  Datatype conversion is performed by HDF5 Library before n-bit compression 
-  and after n-bit decompression.</p>
-  
-<p>The following sub-sections examine the common cases:</p>
-  <ul>
-    <li>N-bit integer conversions</li>
-    <li>N-bit floating-point conversions</li>
-  </ul>
-
-<h5><em>N-bit Integer Conversions</em></h5>
-
-<p>Integer data with a dataset of integer datatype of less than 
-  full precision and a memory datatype of <code>H5T_NATIVE_INT</code>,
-  provides the simplest application of the n-bit filter.</p>
-
-<p>The precision of <code>H5T_NATIVE_INT</code> is 8 muliplied by 
-  <code>sizeof(int)</code>. 
-  This value, the size of an <code>int</code> in bytes, differs from 
-  platform to platform; we assume a value of <code>4</code> 
-  for the following illustration.
-  We further assume the memory byte order to be little-endian.</p>
-
-  <!-- NEW PAGE -->
-<p>In memory, therefore, the precision of <code>H5T_NATIVE_INT</code> 
-  is 32 and the offset is 0. 
-  One value of <code>H5T_NATIVE_INT</code> is laid out in memory 
-  as follows:</p>
- 
-<table border="0" width="80%" align="center">
-  <tr>
-    <td>
-<pre>
-| byte 3 | byte 2 | byte 1 | byte 0 |
-                                
-|SPPPPPPP|PPPPPPPP|PPPPPPPP|PPPPPPPP|
-
-</pre>
-    </td>
-  </tr>
-  <tr>
-    <td colspan="4"><font size="-1">
-      Key: 
-        <code>S</code> - sign bit, 
-        <code>P</code> - significant bit, 
-        <code>?</code> - padding bit 
-      <br>
-      Sign bit is included in signed integer datatype precision.
-      </font></td>
-  </tr>
-</table>
-  
-<p>Suppose the dataset datatype has a precision of 16 and an offset of 4. 
-  After HDF5 converts values from the memory datatype to the dataset datatype, 
-  it passes something like the following to the n-bit filter for 
-  compression:</p>
-
-<table border="0" width="80%" align="center">
-  <tr>
-    <td>
-<pre>
-| byte 3 |  byte 2 | byte 1 |  byte 0 |
-               |                 |
-|????????|????S|PPP|PPPPPPPP|PPPP|????|
-               |_________________|
-                 truncated bits
-</pre>
-    </td>
-  </tr>
-  <tr>
-    <td colspan="4"><font size="-1">
-      Key: 
-        <code>S</code> - sign bit, 
-        <code>P</code> - significant bit, 
-        <code>?</code> - padding bit 
-      <br>
-      Sign bit is included in signed integer datatype precision.
-      </font></td>
-  </tr>
-</table>
-  
-<p>Notice that only the specified 16 bits (15 significant bits and the 
-  sign bit) are retained in the conversion.  All other significant bits 
-  of the memory datatype are discarded because the dataset datatype 
-  calls for only 16 bits of precision. 
-  After n-bit compression, none of these discarded bits, known as 
-  <i>padding bits</i> will be stored on disk.</p>
-  
-<h5><em>N-bit Floating-point Conversions</em></h5>
-
-<p>Things get more complicated in the case of a floating-point dataset 
-  datatype class.  This sub-section provides an example that 
-  illustrates the conversion from a memory datatype of 
-  <code>H5T_NATIVE_FLOAT</code> to a dataset datatype of class 
-  floating-point.</p>
-
-
-<p>As before, let the <code>H5T_NATIVE_FLOAT</code> be 4 bytes long, 
-  and let the memory byte order be little-endian. 
-  Per the IEEE standard, one value of <code>H5T_NATIVE_FLOAT</code> 
-  is laid out in memory as follows:</p>
-  
-<table border="0" width="80%" align="center">
-  <tr>
-    <td>
-<pre>
-| byte 3 | byte 2 | byte 1 | byte 0 |
-                         
-|SEEEEEEE|EMMMMMMM|MMMMMMMM|MMMMMMMM|
-
-</pre>
-  </td></tr>
-  <tr>
-    <td colspan="4"><font size="-1">
-      Key: 
-        <code>S</code> - sign bit, 
-        <code>E</code> - exponent bit, 
-        <code>M</code> - mantissa bit, 
-        <code>?</code> - padding bit 
-      <br>
-      Sign bit is included in floating-point datatype precision.
-      </font></td>
-  </tr>
-</table>
- 
-  <br>
-  
-<p>Suppose the dataset datatype has a precision of 20, offset of 7, 
-  mantissa size of 13, mantissa position of 7, 
-  exponent size of 6, exponent position of 20, 
-  and sign position of 26. 
-  (See “Definition of Datatypes,” section 4.3 of the 
-  “<a href="UG_frame11Datatypes.html">Datatypes</a>” chapter in 
-  the <a href="index.html"><cite>HDF5 User’s Guide</cite></a> 
-  for a discussion of creating and modifying datatypes.)</p>
-  
-<p>After HDF5 converts values from the memory datatype to the dataset datatype, 
-  it passes something like the following to the n-bit filter for 
-  compression:</p>
-  
-<table border="0" width="80%" align="center">
-  <tr>
-    <td>
-<pre>
-| byte 3 | byte 2  | byte 1 | byte 0  |
-              |               |
-|?????SEE|EEEE|MMMM|MMMMMMMM|M|???????|
-              |_______________|
-              truncated mantissa
-</pre>
-  </td></tr>
-  <tr>
-    <td colspan="4"><font size="-1">
-      Key: 
-        <code>S</code> - sign bit, 
-        <code>E</code> - exponent bit, 
-        <code>M</code> - mantissa bit, 
-        <code>?</code> - padding bit 
-      <br>
-      Sign bit is included in floating-point datatype precision.
-      </font></td>
-  </tr>
-</table>
-  
-<p>The sign bit and truncated mantissa bits are not changed during 
-  datatype conversion by the HDF5 Library. On the other hand,
-  the conversion of the 8-bit exponent to a 6-bit exponent
-  is a little tricky:</p>
-  
-<dir>
-  <p>The bias for the new exponent in the n-bit datatype is: </p>
-          <code>2<sup>(n-1)</sup>-1</code> 
-      <br>
-  <p>The following formula is used for this exponent conversion:</p>
-  
-      
-          
-      <code>exp8 - (2<sup>(8-1)</sup>-1)</code> = 
-      <code>exp6 - (2<sup>(6-1)</sup>-1)</code> = 
-      <i>actual exponent value</i> 
-
-      <br /><br />
-              
-      where <code>exp8</code> is the stored decimal value 
-      as represented by the 8-bit exponent,
-      <br>
-              
-      and <code>exp6</code> is the stored decimal value 
-      as represented by the 6-bit exponent
-</dir>
-
-<p>In this example, caution must be taken to ensure that, 
-  after conversion, the actual exponent value is 
-  within the range that can be represented by a 6-bit exponent. 
-  For example, 
-  an 8-bit exponent can represent values  from -127 to 128 while 
-  a 6-bit exponent can represent values only from -31 to 32.</p>
-  
-<a name="Design">
-<h4><em>N-bit Filter Behavior</em></h4>
-</a>
-
-  <p>The n-bit filter was designed to treat the incoming data byte by byte at 
-  the lowest level. The purpose was to make the n-bit filter as generic as 
-  possible so that no pointer cast related to the datatype is needed.</p>
-
-  <p>Bitwise operations are employed for packing and unpacking at the byte 
-  level.</p>
-
-  <p>Recursive function calls are used to treat compound and array datatypes.</p>
-
-<h5><em>N-bit Compression</em></h5>
-
-  <p>The main idea of n-bit compression is to use a loop to compress each  
-  data element in a chunk. Depending on the datatype of each element, 
-  the n-bit filter will call one of four functions.  Each of these functions
-  performs one of the following tasks:  </p>
-
-    <ul>
-      <li>Compress a data element of a no-op datatype</li>
-      <li>Compress a data element of an atomic datatype</li>
-      <li>Compress a data element of a compound datatype</li>
-      <li>Compress a data element of an array datatype</li>
-    </ul> 
-
-
-<p><b>No-op datatypes:</b>
-  The n-bit filter does not actually compress no-op datatypes.  
-  Rather, it copies the data buffer of the no-op datatype from the 
-  noncompressed buffer to the proper location in the compressed buffer; 
-  the compressed buffer has no holes. The term “compress” 
-  is used here simply to distinguish this function  from the function 
-  that performs the reverse operation during decompression.</p>
-  
-
-<p><b>Atomic datatypes:</b>
-  The n-bit filter will find the bytes where significant bits are 
-  located and try to compress these bytes, one byte at a time, using a loop. 
-  At this level, the filter needs the following information:</p>
-  <ul>
-    <li>The byte offset of the beginning of the current data element with 
-        respect to the beginning of the input data buffer</li>
-    <li>Datatype size, precision, offset, and byte order  </li>
-  </ul>
-
-<p>The n-bit filter compresses from the most significant byte containing 
-  significant bits to the least significant byte.  
-  For big-endian data, therefore, the loop index progresses from smaller
-  to larger while for little-endian, the loop index progresses from larger
-  to smaller.</p>
-
-<p>In the extreme case of when the n-bit datatype has full precision,
-  this function copies the content of the entire noncompressed datatype 
-  to the compressed output buffer.</p>
-
-
-<p><b>Compound datatypes:</b>
-  The n-bit filter will compress each data member of the compound datatype. 
-  If the member datatype is of an integer or floating-point datatype, 
-  the n-bit filter will call the function described above<!-- in section 2.1.2-->. 
-  If the member datatype is of a no-op datatype, 
-  the filter will call the function described above<!-- in section 2.1.1-->. 
-  If the member datatype is of a compound datatype, the filter will make a 
-  recursive call to itself. 
-<!--
-  (i.e., to the function described in this section, 2.1.3). 
--->
-  If the member datatype is of an array datatype, the filter will call the 
-  function described below<!-- in section 2.1.4.--></p>
-
-
-<p><b>Array datatypes:</b>
-  The n-bit filter will use a loop to compress each array element in 
-  the array. If the base datatype of array element is of an integer or 
-  floating-point datatype, the n-bit filter will call the function described 
-  above<!-- in section 2.1.2.--> 
-  If the base datatype is of a no-op datatype, the filter will call the
-  function described above<!-- in section 2.1.1.--> 
-  If the base datatype is of a compound datatype, the filter will call the
-  function described above<!-- in section 2.1.3-->. 
-  If the member datatype is of an array datatype, the filter will make a 
-  recursive call of itself.</p>
-<!--
-  (i.e., to the function described in this section, 2.1.4).
--->
-  
-<h5><em>N-bit Decompression</em></h5>
-
-<p>The n-bit decompression algorithm is very similar to n-bit compression. 
-  The only difference is that at the byte level, compression packs out all 
-  padding bits and stores only significant bits into a continous buffer 
-  (unsigned char) while decompression unpacks significant bits and inserts 
-  padding bits (zeros) at the proper positions to recover the data bytes 
-  as they existed before compression.</p>
-  
-<h5><em>Storing N-bit Parameters to Array</em> <code>cd_value[]</code></h5>
-
-<p>All of the information, or parameters, required by the n-bit filter 
-  are gathered and stored in the array <code>cd_values[]</code> by the 
-  private function <code>H5Z_set_local_nbit</code> and are passed 
-  to another private function, 
-  <code>H5Z_filter_nbit</code>, by the HDF5 Library. </p>
-  
-<p>These parameters are as follows:</p>
-  <ol>
-    <li>Parameters related to the datatype</li>
-    <li>The number of elements within the chunk</li>
-    <li>A flag indicating whether compression is needed</li>
-  </ol>
-
-<p>The first and second parameters can be obtained using the HDF5 dataspace
-  and datatype interface calls. </p>
-<!--
-  The third parameter is set during the storing process as described 
-  in section 3.2.
--->
-
-  <p>A compound datatype can have members of array or compound datatype. 
-  An array datatype’s base datatype can be a complex compound datatype. 
-  Recursive calls are required to set parameters for these complex situations.</p>
-
-  <p>Before setting the parameters, the number of parameters should be 
-  calculated to dynamically allocate the array <code>cd_values[]</code>,
-  which will be passed to the HDF5 Library. 
-  This also requires recursive calls.</p>
-  
-<p>For an atomic datatype (integer or floating-point), parameters that will 
-  be stored include the datatype’s size, endianness, precision, and 
-  offset. </p>
-  
-<p>For a no-op datatype, only the size is required.</p>
-
-<p>For a compound datatype, parameters that will be stored include the 
-  datatype’s total size and number of members. For each member, 
-  its member offset needs to be stored. Other parameters for members 
-  will depends on the respective datatype class.</p>
-
-<p>For an array datatype, the total size parameter should be stored. 
-  Other parameters for the array’s base type depend on the base 
-  type’s datatype class. </p>
-  
-<p>Further, to correctly retrieve the parameter for use of n-bit 
-  compression or decompression later, parameters for distinguishing  
-  between datatype classes should be stored.</p>
-  
-<a name="implementation">
-<h4><em>Implementation</em></h4>
-</a>
-
-<p>Three filter callback functions were written for the n-bit filter:</p>
-  <ul>
-    <li><code>H5Z_can_apply_nbit</code></li>
-    <li><code>H5Z_set_local_nbit</code></li>
-    <li><code>H5Z_filter_nbit</code></li>
-  </ul>
-  <p>These functions are called internally by the HDF5 Library. 
-  A number of utility functions were written for the function 
-  <code>H5Z_set_local_nbit</code>. Compression and decompression functions 
-  were written and are called by function <code>H5Z_filter_nbit</code>. 
-  All these functions are included in the file <code>H5Znbit.c</code>.</p>
-
-<p>The public function <code>H5Pset_nbit</code> is called by 
-  the application to set up the use of the n-bit filter. 
-  This function is included in the file <code>H5Pdcpl.c</code>. 
-  The application does not need to supply any parameters.</p>
-  
-<h5><em>How N-bit Parameters are Stored</em></h5>
-
-<p>A scheme of storing parameters required by the n-bit filter in the 
-  array <code>cd_values[]</code> was developed utilizing recursive 
-  function calls.</p>
-
-<p>Four private utility functions were written for storing the parameters 
-  associated with atomic (integer or floating-point), no-op, array, and 
-  compound datatypes:</p>
-  <ul>
-  <li><code>H5Z_set_parms_atomic</code></li>
-  <li><code>H5Z_set_parms_array</code></li>
-  <li><code>H5Z_set_parms_nooptype</code></li>
-  <li><code>H5Z_set_parms_compound</code> </li>
-  </ul>
-  
-<!-- NEW PAGE -->
-<p>The scheme is briefly described below.</p>
-
-<dir>
-
-  First, assign a numeric code for datatype class atomic (integer or float), 
-  no-op, array, and compound datatype. The code is stored before other 
-  datatype related parameters are stored.
-  
-<dl>
-  <dd>
-  <dt>The first three parameters of <code>cd_values[]</code> are reserved for:
-    <ol>
-      <li>The number of valid entries in the array <code>cd_values[]</code></li>
-      <li>A flag indicating whether compression is needed</li>
-      <li>The number of elements in the chunk</li>
-    </ol>
-  
-    
-  <dt>Throughout the balance of this explanation, 
-    <code>i</code> represents the index of <code>cd_values[]</code>.
-    <br> 
-
-  <dt>In the function <code>H5Z_set_local_nbit</code>:
-  <dd>
-      <ol>
-        <li><code>i</code> = 2</li>
-        <li>Get the number of elements in the chunk and store in
-          <code>cd_value[i]</code>; increment <code>i</code></li>
-        <li>Get the class of the datatype:
-          <br>  For an integer or floating-point datatype, call 
-          <code>H5Z_set_parms_atomic</code>
-          <br>  For an array datatype, call 
-            <code>H5Z_set_parms_array</code>
-          <br>  For a compound datatype, call 
-            <code>H5Z_set_parms_compound</code>
-          <br>  For none of the above, call 
-            <code>H5Z_set_parms_noopdatatype</code></li>
-        <li>Store <code>i</code> in <code>cd_value[0]</code> and 
-          flag in <code>cd_values[1]</code></li>
-      </ol>
-  </dd>
-</dl>
-
-<dl>
-  <dt>In the function <code>H5Z_set_parms_atomic</code>:</dt>
-    <dd>
-      <ol>
-        <li>Store the assigned numeric code for the atomic datatype in 
-          <code>cd_value[i]</code>; increment <code>i</code></li>
-        <li>Get the size of the atomic datatype and store in 
-          <code>cd_value[i]</code>; increment <code>i</code></li>
-        <li>Get the order of the atomic datatype and store in 
-          <code>cd_value[i]</code>; increment <code>i</code></li>
-        <li>Get the precision of the atomic datatype and store in 
-          <code>cd_value[i]</code>; increment <code>i</code></li>
-        <li>Get the offset of the atomic datatype and store in 
-          <code>cd_value[i]</code>; increment <code>i</code></li>
-        <li>Determine the need to do compression at this point</li>
-      </ol>
-  </dd>
-</dl>
-
-<dl>
-  <dt>In the function <code>H5Z_set_parms_nooptype</code>:
-  <dd>
-      <ol>
-        <li>Store the assigned numeric code for the no-op datatype in 
-          <code>cd_value[i]</code>; increment <code>i</code></li>
-        <li>Get the size of the no-op datatype and store in 
-          <code>cd_value[i]</code>; increment <code>i</code></li>
-      </ol>
-  </dd>
-</dl>
-
-<dl>
-  <dt>In the function <code>H5Z_set_parms_array</code>:
-  <dd>
-      <ol>
-        <li>Store the assigned numeric code for the array datatype in 
-          <code>cd_value[i]</code>; increment <code>i</code></li>
-        <li>Get the size of the array datatype and store in 
-          <code>cd_value[i]</code>; increment <code>i</code></li>
-        <li>Get the class of the array'’s base datatype.
-          <br>  For an integer or floating-point datatype, 
-            call <code>H5Z_set_parms_atomic</code>
-          <br>  For an array datatype, call 
-            <code>H5Z_set_parms_array</code>
-          <br>  For a compound datatype, call 
-            <code>H5Z_set_parms_compound</code>
-          <br>  If none of the above, 
-            call <code>H5Z_set_parms_noopdatatype</code></li>
-      </ol>
-  </dd>
-</dl>
-
-<dl>
-  <dt>In the function <code>H5Z_set_parms_compound</code>:
-  <dd>
-      <ol>
-        <li>Store the assigned numeric code for the compound datatype in 
-          <code>cd_value[i]</code>; increment <code>i</code></li>
-        <li>Get the size of the compound datatype and store in 
-          <code>cd_value[i]</code>; increment <code>i</code></li>
-        <li>Get the number of members and store in 
-          <code>cd_values[i]</code>; increment <code>i</code></li>
-        <li>For each member
-          <br>  Get the member offset and store in 
-            <code>cd_values[i]</code>; increment <code>i</code>
-          <br>  Get the class of the member datatype
-          <br>  For an integer or floating-point datatype, 
-            call <code>H5Z_set_parms_atomic</code>
-          <br>  For an array datatype, 
-            call <code>H5Z_set_parms_array</code>
-          <br>  For a compound datatype, 
-            call <code>H5Z_set_parms_compound</code>
-          <br>  If none of the above, 
-            call <code>H5Z_set_parms_noopdatatype</code></li>
-      </ol>
-  </dd>
-</dl>
-
-</dir>
-
-<h5><em>N-bit Compression and Decompression Functions</em></h5>
-
-<p>The n-bit compression and decompression functions above are called 
-  by the private HDF5 function <code>H5Z_filter_nbit</code>. 
-  The compress and decompress functions retrieve the n-bit parameters
-  from <code>cd_values[]</code> as it was passed by
-  <code>H5Z_filter_nbit</code>. Parameters are retrieved in exactly the 
-  same order in which they are stored and lower-level compression and 
-  decompression functions for different datatype classes are called. </p>
-<!--
-  These functions are implementated according to the descriptions 
-  in sections 2.1 and 2.2.
--->
-  
-<p>N-bit compression is not implemented in place. Due to the 
-  difficulty of calculating actual output buffer size after compression, 
-  the same space as that of the input buffer is allocated for the output 
-  buffer as passed to the compression function. However, the size of the 
-  output buffer passed by reference to the compression function will 
-  be changed (smaller) after the compression is complete.</p>
-  
-<a name="examples">
-<h4><em>Usage Examples</em></h4>
-</a>
-
-<p>The following code example illustrates the use of the n-bit filter 
-  for writing and reading n-bit integer data.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-<pre>
-#include "hdf5.h"
-#include "stdlib.h"
-#include "math.h"
-#define H5FILE_NAME  "nbit_test_int.h5"
-#define DATASET_NAME "nbit_int"
-#define NX 200
-#define NY 300
-#define CH_NX 10
-#define CH_NY 15
-
-int main(void)
-{
-   hid_t   file, dataspace, dataset, datatype, mem_datatype, dset_create_props;
-   hsize_t dims[2], chunk_size[2];
-   int     orig_data[NX][NY];
-   int     new_data[NX][NY];
-   int     i, j;
-   size_t  precision, offset;
-
-
-   /* Define dataset datatype (integer), and set precision, offset */
-   datatype = H5Tcopy(H5T_NATIVE_INT);
-   precision = 17; /* precision includes sign bit */
-   if(H5Tset_precision(datatype,precision)<0) {
-      printf("Error: fail to set precision\n");
-      return -1;
-   }
-   offset = 4;
-   if(H5Tset_offset(datatype,offset)<0) {
-      printf("Error: fail to set offset\n");
-      return -1;
-   }
-
-
-   /* Copy to memory datatype */
-   mem_datatype = H5Tcopy(datatype);
-
-
-   /* Set order of dataset datatype */
-   if(H5Tset_order(datatype, H5T_ORDER_BE)<0) {
-      printf("Error: fail to set endianness\n");
-      return -1;
-   }
-
-
-  /* Initiliaze data buffer with random data within correct range
-   * corresponding to the memory datatype's precision and offset.
-   */
-   for (i=0; i < NX; i++)
-       for (j=0; j < NY; j++)
-           orig_data[i][j] = rand() % (int)pow(2, precision-1) <<offset;
-
-
-   /* Describe the size of the array. */
-   dims[0] = NX;
-   dims[1] = NY;
-   if((dataspace = H5Screate_simple (2, dims, NULL))<0) {
-      printf("Error: fail to create dataspace\n");
-      return -1;
-   }
-
-
-  /*
-   * Create a new file using read/write access, default file
-   * creation properties, and default file access properties.
-   */
-   if((file = H5Fcreate (H5FILE_NAME, H5F_ACC_TRUNC,
-                         H5P_DEFAULT, H5P_DEFAULT))<0) {
-      printf("Error: fail to create file\n");
-      return -1;
-   }
-
-
-  /*
-   * Set the dataset creation property list to specify that
-   * the raw data is to be partitioned into 10 x 15 element
-   * chunks and that each chunk is to be compressed.
-   */
-   chunk_size[0] = CH_NX;
-   chunk_size[1] = CH_NY;
-   if((dset_create_props = H5Pcreate (H5P_DATASET_CREATE))<0) {
-      printf("Error: fail to create dataset property\n");
-      return -1;
-   }
-   if(H5Pset_chunk (dset_create_props, 2, chunk_size)<0) {
-      printf("Error: fail to set chunk\n");
-      return -1;
-   }
-
-
-</pre><!-- NEW PAGE -->
-<pre>
-  /*
-   * Set parameters for n-bit compression; check the description of
-   * the H5Pset_nbit function in the HDF5 Reference Manual for more
-   * information.
-   */
-   if(H5Pset_nbit (dset_create_props)<0) {
-      printf("Error: fail to set nbit filter\n");
-      return -1;
-   }
-
-
-  /*
-   * Create a new dataset within the file.  The datatype
-   * and dataspace describe the data on disk, which may
-   * be different from the format used in the application's
-   * memory.
-   */
-   if((dataset = H5Dcreate(file, DATASET_NAME, datatype,
-                          dataspace, H5P_DEFAULT, 
-                          dset_create_props, H5P_DEFAULT))<0) {
-      printf("Error: fail to create dataset\n");
-      return -1;
-   }
-
-
-  /*
-   * Write the array to the file. The datatype and dataspace
-   * describe the format of the data in the 'orig_data' buffer.
-   * The raw data is translated to the format required on disk,
-   * as defined above. We use default raw data transfer properties.
-   */
-   if(H5Dwrite (dataset, mem_datatype, H5S_ALL, H5S_ALL,
-                H5P_DEFAULT, orig_data)<0) {
-      printf("Error: fail to write to dataset\n");
-      return -1;
-   }
-
-
-   H5Dclose (dataset);
-
-
-   if((dataset = H5Dopen(file, DATASET_NAME, H5P_DEFAULT))<0) {
-      printf("Error: fail to open dataset\n");
-      return -1;
-   }
-
-
-  /*
-   * Read the array. This is similar to writing data,
-   * except the data flows in the opposite direction.
-   * Note: Decompression is automatic.
-   */
-   if(H5Dread (dataset, mem_datatype, H5S_ALL, H5S_ALL,
-               H5P_DEFAULT, new_data)<0) {
-      printf("Error: fail to read from dataset\n");
-      return -1;
-   }
-
-
-</pre><!-- NEW PAGE -->
-<pre>
-   H5Tclose (datatype);
-   H5Tclose (mem_datatype);
-   H5Dclose (dataset);
-   H5Sclose (dataspace);
-   H5Pclose (dset_create_props);
-   H5Fclose (file);
-
-   return 0;
-}</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 10. N-bit compression for integer data</b><br /> 
-         Illustrates the use of the n-bit filter for writing and reading 
-         n-bit integer data.
-         <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-
-
-<p>The following code example illustrates the use of the n-bit filter 
-  for writing and reading n-bit floating-point data.</p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-<pre>
-#include "hdf5.h"
-#define H5FILE_NAME  "nbit_test_float.h5"
-#define DATASET_NAME "nbit_float"
-#define NX 2
-#define NY 5
-#define CH_NX 2
-#define CH_NY 5
-
-
-int main(void)
-{
-   hid_t   file, dataspace, dataset, datatype, dset_create_props;
-   hsize_t dims[2], chunk_size[2];
-  /* orig_data[] are initialized to be within the range that can be
-   * represented by dataset datatype (no precision loss during
-   * datatype conversion)
-   */
-   float   orig_data[NX][NY] = {{188384.00, 19.103516, -1.0831790e9,
-   -84.242188, 5.2045898}, {-49140.000, 2350.2500, -3.2110596e-1,
-   6.4998865e-5, -0.0000000}};
-   float   new_data[NX][NY];
-   size_t  precision, offset;
-
-
-  /* Define single-precision floating-point type for dataset
-   *-------------------------------------------------------------------
-   * size=4 byte, precision=20 bits, offset=7 bits,
-   * mantissa size=13 bits, mantissa position=7,
-   * exponent size=6 bits, exponent position=20,
-   * exponent bias=31.
-   * It can be illustrated in little-endian order as:
-   * (S - sign bit, E - exponent bit, M - mantissa bit,
-   *  ? - padding bit)
-   *
-   *           3        2        1        0
-   *       ?????SEE EEEEMMMM MMMMMMMM M???????
-   *
-   * To create a new floating-point type, the following
-   * properties must be set in the order of
-   *     set fields -> set offset -> set precision -> set size.
-   * All these properties must be set before the type can function.
-   * Other properties can be set anytime. Derived type size cannot
-   * be expanded bigger than original size but can be decreased.
-   * There should be no holes among the significant bits. Exponent
-   * bias usually is set 2^(n-1)-1, where n is the exponent size.
-
-
-*-------------------------------------------------------------------*/
-   datatype = H5Tcopy(H5T_IEEE_F32BE);
-   if(H5Tset_fields(datatype, 26, 20, 6, 7, 13)<0) {
-      printf("Error: fail to set fields\n");
-      return -1;
-   }
-   offset = 7;
-   if(H5Tset_offset(datatype,offset)<0) {
-      printf("Error: fail to set offset\n");
-      return -1;
-   }
-   precision = 20;
-   if(H5Tset_precision(datatype,precision)<0) {
-      printf("Error: fail to set precision\n");
-      return -1;
-   }
-   if(H5Tset_size(datatype, 4)<0) {
-      printf("Error: fail to set size\n");
-      return -1;
-   }
-   if(H5Tset_ebias(datatype, 31)<0) {
-      printf("Error: fail to set exponent bias\n");
-      return -1;
-   }
-
-
-   /* Describe the size of the array. */
-   dims[0] = NX;
-   dims[1] = NY;
-   if((dataspace = H5Screate_simple (2, dims, NULL))<0) {
-      printf("Error: fail to create dataspace\n");
-      return -1;
-   }
-
-
-  /*
-   * Create a new file using read/write access, default file
-   * creation properties, and default file access properties.
-   */
-   if((file = H5Fcreate (H5FILE_NAME, H5F_ACC_TRUNC,
-                         H5P_DEFAULT, H5P_DEFAULT))<0) {
-      printf("Error: fail to create file\n");
-      return -1;
-   }
-
-
-  /*
-   * Set the dataset creation property list to specify that
-   * the raw data is to be partitioned into 2 x 5 element
-   * chunks and that each chunk is to be compressed.
-   */
-   chunk_size[0] = CH_NX;
-   chunk_size[1] = CH_NY;
-   if((dset_create_props = H5Pcreate (H5P_DATASET_CREATE))<0) {
-      printf("Error: fail to create dataset property\n");
-      return -1;
-   }
-   if(H5Pset_chunk (dset_create_props, 2, chunk_size)<0) {
-      printf("Error: fail to set chunk\n");
-      return -1;
-   }
-
-
-  /*
-   * Set parameters for n-bit compression; check the description
-   * of the H5Pset_nbit function in the HDF5 Reference Manual
-   * for more information.
-   */
-   if(H5Pset_nbit (dset_create_props)<0) {
-      printf("Error: fail to set nbit filter\n");
-      return -1;
-   }
-
-
-  /*
-   * Create a new dataset within the file.  The datatype
-   * and dataspace describe the data on disk, which may
-   * be different from the format used in the application's
-   * memory.
-   */
-   if((dataset = H5Dcreate(file, DATASET_NAME, datatype,
-                          dataspace, H5P_DEFAULT, 
-                          dset_creat_plists, H5P_DEFAULT))<0) {
-      printf("Error: fail to create dataset\n");
-      return -1;
-   }
-
-
-  /*
-   * Write the array to the file. The datatype and dataspace
-   * describe the format of the data in the 'orig_data' buffer.
-   * The raw data is translated to the format required on disk,
-   * as defined above. We use default raw data transfer properties.
-   */
-   if(H5Dwrite (dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL,
-                H5P_DEFAULT, orig_data)<0) {
-      printf("Error: fail to write to dataset\n");
-      return -1;
-   }
-
-
-   H5Dclose (dataset);
-
-
-   if((dataset = H5Dopen(file, DATASET_NAME, H5P_DEFAULT))<0) {
-      printf("Error: fail to open dataset\n");
-      return -1;
-   }
-
-
-  /*
-   * Read the array. This is similar to writing data,
-   * except the data flows in the opposite direction.
-   * Note: Decompression is automatic.
-   */
-   if(H5Dread (dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL,
-               H5P_DEFAULT, new_data)<0) {
-      printf("Error: fail to read from dataset\n");
-      return -1;
-   }
-
-
-   H5Tclose (datatype);
-   H5Dclose (dataset);
-   H5Sclose (dataspace);
-   H5Pclose (dset_create_props);
-   H5Fclose (file);
-
-
-   return 0;
-}</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 11. N-bit compression for floating-point data</b><br /> 
-        Illustrates the use of the n-bit filter for writing and reading 
-        n-bit floating-point data.
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-
-<a name="limitations">
-<h4><em>Limitations</em></h4>
-</a>
-
-<p>Because the array <code>cd_values[]</code> has to fit into an object 
-  header message of 64K, the n-bit filter has an upper limit on the number 
-  of n-bit parameters that can be stored in it. To be conservative, a maximum 
-  of 4K is allowed for the number of parameters.</p>
-
-<p>The n-bit filter currently only compresses n-bit datatypes or fields derived 
-  from integer or floating-point datatypes. The n-bit filter assumes padding 
-  bits of zero. This may not be true since the HDF5 user can set padding bit 
-  to be zero, one, or leave the background alone. However, it is expected 
-  the n-bit filter will be modified to adjust to such situations.</p>
-
-<p>The n-bit filter does not have a way to handle the situation where the  
-  fill value of a dataset is defined and the fill value is not of an n-bit 
-  datatype although the dataset datatype is.</p>
-
-
-<!-- NEW PAGE -->
-<a name="ScaleOffset">
-<h3>5.6.2. Using the Scale-offset Filter</h3>
-</a> 
-
-<p>Generally speaking, scale-offset compression performs a scale and/or 
-  offset operation on each data value and truncates the resulting value 
-  to a minimum number of bits (minimum-bits) before storing it. </p>
-
-<p>The current scale-offset filter supports integer and floating-point 
-  datatypes only. For the floating-point datatype, float and double are 
-  supported, but long double is not supported.</p>
-
-<p>Integer data compression uses a straight-forward algorithm. Floating-point 
-  data compression adopts the GRiB data packing mechanism which offers 
-  two alternate methods: a fixed minimum-bits method, and a variable 
-  minimum-bits method. Currently, only the variable minimum-bits method 
-  is implemented. <!-- 9.3.10, MEE: according to Kent, the fixed minimum-bits 
-  method has not yet been implemented, and they do not have any plans to 
-  implement it. --></p>
-
-  <p>Like other I/O filters supported by the HDF5 Library, applications 
-  using the scale-offset filter must store data with chunked storage.</p>
-  
-  <p><b><i>Integer type:</i></b>
-  The minimum-bits of integer data can be determined by the filter. 
-  For example, if the maximum value of data to be compressed is 7065 
-  and the minimum value is 2970. Then the “span” of dataset 
-  values is equal to (max-min+1), which is 4676. If no fill value is 
-  defined for the dataset, the minimum-bits is: 
-  <code>ceiling(log2(span)) = 12</code>. With fill value set, the 
-  minimum-bits is: <code>ceiling(log2(span+1)) = 13</code>.</p>
-
-  <p>HDF5 users can also set the minimum-bits. However, if the user gives 
-  a minimum-bits that is less than that calculated by the filter, 
-  the compression will be lossy.</p>
-
-  <p><b><i>Floating-point type:</i></b>
-  The basic idea of the scale-offset filter for the floating-point type is 
-  to transform the data by some kind of scaling to integer data, and 
-  then to follow the procedure of the scale-offset filter for the integer 
-  type to do the data compression. Due to the data transformation from 
-  floating-point to integer, the scale-offset filter is 
-  lossy in nature. </p>
-
-  <p>Two methods of scaling the floating-point data are used: the so-called 
-  D-scaling and E-scaling. D-scaling is more straightforward and easy to 
-  understand. For HDF5 1.8 release, only the D-scaling method has been 
-  implemented. <!-- 9.3.10, MEE: According to Kent, E-scaling has not yet 
-  been implemented, and they have no plans to implement it in the future. --></p>
-  
-<h4><em>Design</em></h4>
-
-  <p>Before the filter does any real work, it needs to gather some information 
-  from the HDF5 Library through API calls. The parameters the filter needs 
-  are: </p>
-  <ul>
-    <li>The minimum-bits of the data value</li>
-    <li>The number of data elements in the chunk</li>
-    <li>The datatype class, size, sign (only for integer type), byte order, 
-    and fill value 
-    if defined</li> 
-  </ul>
-  
-  <p>Size and sign are needed to determine what kind of pointer 
-  cast to use when retrieving values from the data buffer.</p>
-  <p>The pipeline of the filter can be divided into four parts: 
-  (1)pre-compression; (2)compression; (3)decompression; 
-  (4)post-decompression.</p>
-
-  <p>Depending on whether a fill value is defined or not, the filter will 
-  handle pre-compression and post-decompression differently. </p>
-
-  <p>The scale-offset filter only needs the memory byte order, size of 
-  datatype, and minimum-bits for compression and decompression.</p>
-
-  <p>Since decompression has no access to the original data, the minimum-bits 
-  and the minimum value need to be stored with the compressed data for 
-  decompression and post-decompression.</p>
-  
-
-<h5><em>Integer Type</em></h5>
-
-  <p><i>Pre-compression: </i>
-  During pre-compression minimum-bits is calculated if it is not 
-  set by the user. For more information on how minimum-bits are calculated, 
-  see section 6.1. “The N-bit Filter.” </p>
- 
-  <p>If the fill value is defined, finding the maximum and minimum values 
-  should ignore the data element whose value is equal to the fill value. </p>
-
-  <p>If no fill value is defined, the value of each data element is subtracted 
-  by the minimum value during this stage.</p>
-
-  <p>If the fill value is defined, the fill value is assigned to the maximum 
-  value. In this way minimum-bits can represent a data element whose value 
-  is equal to the fill value and subtracts the minimum value from a data 
-  element whose value is not equal to the fill value.</p>
-<!-- 8.19.10, MEE: the paragraph belowis is Frank's revision of my editing -->
-<!-- 9.3.10, MEE: Kent reviewed the paragraph below and said it was clear. -->
-  <p>The fill value (if defined), the number of elements in a chunk, the 
-  class of the datatype, the size of the datatype, the memory order of the 
-  datatype, and other similar elements will be stored in the HDF5 object 
-  header for the post-decompression usage.</p>
-
-  <p>After pre-compression, all values are non-negative and are within the 
-  range that can be stored by minimum-bits.</p>
-  
-
-
-  <p><i>Compression: </i>
-  All modified data values after pre-compression are packed together 
-  into the compressed data buffer. The number of bits for each data value 
-  decreases from the number of bits of integer (32 for most platforms) to 
-  minimum-bits. The value of minimum-bits and the minimum value are added to 
-  the data buffer and the whole buffer is sent back to the library. In this 
-  way, the number of bits for each modified value is no more than 
-  the size of minimum-bits.</p>
-  
-
-  <p><i>Decompression: </i>
-  In this stage, the number of bits for each data value is resumed from 
-  minimum-bits to the number of bits of integer.</p>
-
-
-  <p><i>Post-decompression: </i>
-  For the post-decompression stage, the filter does the opposite 
-  of what it does during pre-compression except that it does not calculate 
-  the minimum-bits or the minimum value. These values were saved during 
-  compression and can be retrieved through the resumed data buffer. If 
-  no fill value is defined, the filter adds the minimum value back to 
-  each data element.</p>
-
-  <p>If the fill value is defined, the filter assigns the fill value to the 
-  data element whose value is equal to the maximum value that minimum-bits can 
-  represent and adds the minimum value back to each data element whose value 
-  is not equal to the maximum value that minimum-bits can represent.</p>
-
-<a name="SO_FloatingPoint"><p> </p></a>
-  
-
-<h5><em>Floating-point Type</em></h5>
-
-  <p>The filter will do data transformation from floating-point type to 
-  integer type and then handle the data by using the procedure for handling 
-  the integer data inside the filter.  
-  Insignificant bits of floating-point data will be cut off 
-  during data transformation, so this filter is a lossy compression method.</p>
-
-  <p>There are two scaling methods: D-scaling and E-scaling. 
-  The HDF5 1.8 release only supports D-scaling. D-scaling is short for 
-  decimal scaling. E-scaling should be similar conceptually. In order 
-  to transform data from floating-point to 
-  integer, a scale factor is introduced. The minimum value will be calculated. 
-  Each data element value will subtract the minimum value. The modified data 
-  will be multiplied by 10 (Decimal) to the power of <code>scale_factor</code>, 
-  and only the integer part will be kept and manipulated through the routines 
-  for the integer type of the filter during pre-compression and compression. 
-  Integer data will be divided by 10 to the power of 
-  <code>scale_factor</code> to transform back to floating-point data 
-  during decompression and post-decompression.  
-  Each data element value will then add the minimum value, and the 
-  floating-point data are resumed. However, the resumed data will lose some 
-  insignificant bits compared with the original value.</p>
-
-  <p>For example, the following floating-point data are manipulated by the 
-  filter, and the D-scaling factor is 2.</p>
-  
-  <code>{104.561, 99.459, 100.545, 105.644}</code>
-
-  <p>The minimum value is 99.459, each data element subtracts 99.459, the 
-  modified data is </p>
-  
-  <code>{5.102, 0, 1.086, 6.185}</code>
-
-  <p>Since the D-scaling factor is 2, all floating-point data will be 
-  multiplied by 10^2 with this result: </p>
-
-  <code>{510.2, 0, 108.6, 618.5}</code>
-
-  <p>The digit after decimal point will be rounded off, and then the set looks 
-  like: </p>
-  
-  <code>{510 , 0, 109, 619}</code>
-
-  <p>After decompression, each value will be divided by 10^2 and will be added 
-  to the offset 99.459.</p>
-
-<p>The floating-point data becomes </p>
-
-  <code>{104.559, 99.459, 100.549, 105.649}</code>.
-
-<p>The relative error for each value should be no more than 
-  5* (10^(D-scaling factor +1)). D-scaling sometimes is also referred 
-  as a variable minimum-bits method since for different datasets the 
-  minimum-bits to represent the same decimal precision will vary. The 
-  data value is modified to 2 to power of <code>scale_factor</code> for 
-  E-scaling. E-scaling is also called fixed-bits method since for different 
-  datasets the minimum-bits will always be fixed to the scale factor of 
-  E-scaling. 
-  Currently HDF5 ONLY supports D-scaling (variable minimum-bits) method.</p>
-  
-<h4><em>Implementation</em></h4>
-
-<p>The scale-offset filter implementation was written and included in the file 
-  <code>H5Zscaleoffset.c</code>. Function <code>H5Pset_scaleoffset</code> was 
-  written and included in the file “<code>H5Pdcpl.c</code>”. The 
-  HDF5 user can supply minimum-bits by calling function 
-  <code>H5Pset_scaleoffset</code>.</p>
-
-<!-- NEW PAGE -->
-<p>The scale-offset filter was implemented based on the design outlined in 
-  this section. However, the following factors need to be considered:</p>
-  
-<dl>
-  <dd>
-    <ol>
-      <li>The filter needs the appropriate cast pointer whenever it needs 
-        to retrieve data values.</li>
-      <li>The HDF5 Library passes to the filter the to-be-compressed data 
-        in the format of the dataset datatype, and the filter passes back the 
-        decompressed data in the same format. If a fill value is defined, 
-        it is also in dataset datatype format. 
-        For example, if the byte order of the dataset datatype is different 
-        from that of the memory datatype of the platform, compression or 
-        decompression performs an endianness conversion of data buffer. 
-        Moreover, it should be aware that memory byte order can be different 
-        during compression and decompression.</li>
-      <li>The difference of endianness and datatype between file and memory 
-        should be considered when saving and retrieval of minimum-bits, 
-        minimum value, and fill value.</li>
-      <li>If the user sets the minimum-bits to full precision of the datatype, 
-        no operation is needed at the filter side. If the full precision is 
-        a result of calculation by the filter, then the minimum-bits needs 
-        to be saved for decompression but no compression or decompression 
-        is needed (only a copy of the input buffer is needed).</li>
-      <li>If by calculation of the filter, the minimum-bits is equal to zero, 
-        special handling is needed. Since it means all values are the same, 
-        no compression or decompression is needed. But the minimum-bits 
-        and minimum value still need to be saved during compression.</li>
-      <li>For floating-point data, the minimum value of the dataset should 
-        be calculated at first. Each data element value will then subtract 
-        the minimum value to obtain the “offset” data. 
-        The offset data will then follow the steps outlined above in the
-        discussion of <a href="#SO_FloatingPoint">floating-point types</a>
-        to do data transformation to integer and rounding.</li>
-    </ol>
-  </dd>
-</dl>
-
-<h4><em>Usage Examples</em></h4>
-
-<p>The following code example illustrates the use of the scale-offset filter 
-  for writing and reading integer data.</p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-<pre>
-#include "hdf5.h"
-#include "stdlib.h"
-#define H5FILE_NAME  "scaleoffset_test_int.h5"
-#define DATASET_NAME "scaleoffset_int"
-#define NX 200
-#define NY 300
-#define CH_NX 10
-#define CH_NY 15
-</pre>
-
-<pre>
-int main(void)
-{
-   hid_t   file, dataspace, dataset, datatype, dset_create_props;
-   hsize_t dims[2], chunk_size[2];
-   int     orig_data[NX][NY];
-   int     new_data[NX][NY];   
-   int     i, j, fill_val;   
-
-   /* Define dataset datatype */
-   datatype = H5Tcopy(H5T_NATIVE_INT);   
-   
-   /* Initiliaze data buffer */
-   for (i=0; i < NX; i++) 
-       for (j=0; j < NY; j++)
-           orig_data[i][j] = rand() % 10000;
-
-   /* Describe the size of the array. */
-   dims[0] = NX;
-   dims[1] = NY;
-   if((dataspace = H5Screate_simple (2, dims, NULL))<0) {
-      printf("Error: fail to create dataspace\n");
-      return -1;
-   }
-
-  /*
-   * Create a new file using read/write access, default file
-   * creation properties, and default file access properties.
-   */
-   if((file = H5Fcreate (H5FILE_NAME, H5F_ACC_TRUNC, 
-                         H5P_DEFAULT, H5P_DEFAULT))<0) {
-      printf("Error: fail to create file\n");
-      return -1;
-   }
-
-  /*
-   * Set the dataset creation property list to specify that
-   * the raw data is to be partitioned into 10 x 15 element
-   * chunks and that each chunk is to be compressed.
-   */
-   chunk_size[0] = CH_NX;
-   chunk_size[1] = CH_NY;
-   if((dset_create_props = H5Pcreate (H5P_DATASET_CREATE))<0) {
-      printf("Error: fail to create dataset property\n");
-      return -1;
-   }
-   if(H5Pset_chunk (dset_create_props, 2, chunk_size)<0) {
-      printf("Error: fail to set chunk\n");
-      return -1;
-   }
-
-   /* Set the fill value of dataset */
-   fill_val = 10000;
-   if (H5Pset_fill_value(dset_create_props, H5T_NATIVE_INT, 
-       &fill_val)<0) {
-      printf("Error: can not set fill value for dataset\n");
-      return -1;
-   }
-
-  /*
-   * Set parameters for scale-offset compression. Check the 
-   * description of the H5Pset_scaleoffset function in the 
-   * HDF5 Reference Manual for more information [3].
-   */
-   if(H5Pset_scaleoffset (dset_create_props, H5Z_SO_INT, 
-                          H5Z_SO_INT_MINIMUMBITS_DEFAULT)<0) {
-      printf("Error: fail to set scaleoffset filter\n");
-      return -1;
-   }
-
-  /*
-   * Create a new dataset within the file. The datatype
-   * and dataspace describe the data on disk, which may
-   * or may not be different from the format used in the 
-   * application's memory.  The link creation and 
-   * dataset access property list parameters are passed 
-   * with default values.
-   */
-   if((dataset = H5Dcreate (file, DATASET_NAME, datatype,
-                           dataspace, H5P_DEFAULT,
-                           dset_create_props, H5P_DEFAULT))<0) {
-      printf("Error: fail to create dataset\n");
-      return -1;
-   }
-
-  /*
-   * Write the array to the file. The datatype and dataspace
-   * describe the format of the data in the 'orig_data' buffer.
-   * We use default raw data transfer properties.
-   */
-   if(H5Dwrite (dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL,
-                H5P_DEFAULT, orig_data)<0) {
-      printf("Error: fail to write to dataset\n");
-      return -1;
-   }
-
-   H5Dclose (dataset);
-
-   if((dataset = H5Dopen(file, DATASET_NAME, H5P_DEFAULT))<0) {
-      printf("Error: fail to open dataset\n");
-      return -1;
-   }   
-
-  /*
-   * Read the array. This is similar to writing data,
-   * except the data flows in the opposite direction.
-   * Note: Decompression is automatic.
-   */
-   if(H5Dread (dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL,
-               H5P_DEFAULT, new_data)<0) {
-      printf("Error: fail to read from dataset\n");
-      return -1;
-   }
-
-   H5Tclose (datatype);
-   H5Dclose (dataset);
-   H5Sclose (dataspace);
-   H5Pclose (dset_create_props);
-   H5Fclose (file);
-
-   return 0;
-}</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 12. Scale-offset compression integer data</b><br />
-        Illustrates the use of the scale-offset filter for writing 
-        and reading integer data.
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<!-- NEW PAGE -->
-<p>The following code example illustrates the use of the scale-offset filter 
-  (set for variable minimum-bits method) for writing and reading 
-  floating-point data.</p>
-  
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-<pre>
-#include "hdf5.h"
-#include "stdlib.h"
-#define H5FILE_NAME  "scaleoffset_test_float_Dscale.h5"
-#define DATASET_NAME "scaleoffset_float_Dscale"
-#define NX 200
-#define NY 300
-#define CH_NX 10
-#define CH_NY 15
-</pre>
-
-<pre>
-int main(void)
-{
-   hid_t   file, dataspace, dataset, datatype, dset_create_props;
-   hsize_t dims[2], chunk_size[2];
-   float   orig_data[NX][NY];
-   float   new_data[NX][NY];
-   float   fill_val;   
-   int     i, j;   
-
-   /* Define dataset datatype */
-   datatype = H5Tcopy(H5T_NATIVE_FLOAT);   
-   
-   /* Initiliaze data buffer */
-   for (i=0; i < NX; i++) 
-       for (j=0; j < NY; j++)
-           orig_data[i][j] = (rand() % 10000) / 1000.0;
-
-   /* Describe the size of the array. */
-   dims[0] = NX;
-   dims[1] = NY;
-   if((dataspace = H5Screate_simple (2, dims, NULL))<0) {
-      printf("Error: fail to create dataspace\n");
-      return -1;
-   }
-
-  /*
-   * Create a new file using read/write access, default file
-   * creation properties, and default file access properties.
-   */
-   if((file = H5Fcreate (H5FILE_NAME, H5F_ACC_TRUNC, 
-                         H5P_DEFAULT, H5P_DEFAULT))<0) {
-      printf("Error: fail to create file\n");
-      return -1;
-   }
-
-  /*
-   * Set the dataset creation property list to specify that
-   * the raw data is to be partitioned into 10 x 15 element
-   * chunks and that each chunk is to be compressed.
-   */
-   chunk_size[0] = CH_NX;
-   chunk_size[1] = CH_NY;
-   if((dset_create_props = H5Pcreate (H5P_DATASET_CREATE))<0) {
-      printf("Error: fail to create dataset property\n");
-      return -1;
-   }
-   if(H5Pset_chunk (dset_create_props, 2, chunk_size)<0) {
-      printf("Error: fail to set chunk\n");
-      return -1;
-   }
-
-   /* Set the fill value of dataset */
-   fill_val = 10000.0;
-   if (H5Pset_fill_value(dset_create_props, H5T_NATIVE_FLOAT, 
-       &fill_val)<0) {
-      printf("Error: can not set fill value for dataset\n");
-      return -1;
-   }
-
-  /*
-   * Set parameters for scale-offset compression; use variable
-   * minimum-bits method, set decimal scale factor to 3. Check the 
-   * description of the H5Pset_scaleoffset function in the HDF5 
-   * Reference Manual for more information [3].
-   */
-   if(H5Pset_scaleoffset (dset_create_props, H5Z_SO_FLOAT_DSCALE, 3)<0) {
-      printf("Error: fail to set scaleoffset filter\n");
-      return -1;
-   }
-
-  /*
-   * Create a new dataset within the file. The datatype
-   * and dataspace describe the data on disk, which may
-   * or may not be different from the format used in the 
-   * application's memory.
-   */
-   if((dataset = H5Dcreate (file, DATASET_NAME, datatype,
-                            dataspace, H5P_DEFAULT, 
-                            dset_create_props, H5P_DEFAULT))<0) {
-      printf("Error: fail to create dataset\n");
-      return -1;
-   }
-
-  /*
-   * Write the array to the file. The datatype and dataspace
-   * describe the format of the data in the 'orig_data' buffer.
-   * We use default raw data transfer properties.
-   */
-   if(H5Dwrite (dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL,
-                H5P_DEFAULT, orig_data)<0) {
-      printf("Error: fail to write to dataset\n");
-      return -1;
-   }
-
-   H5Dclose (dataset);
-
-   if((dataset = H5Dopen(file, DATASET_NAME, H5P_DEFAULT))<0) {
-      printf("Error: fail to open dataset\n");
-      return -1;
-   }   
-
-  /*
-   * Read the array. This is similar to writing data,
-   * except the data flows in the opposite direction.
-   * Note: Decompression is automatic.
-   */
-   if(H5Dread (dataset, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL,
-               H5P_DEFAULT, new_data)<0) {
-      printf("Error: fail to read from dataset\n");
-      return -1;
-   }
-
-   H5Tclose (datatype);
-   H5Dclose (dataset);
-   H5Sclose (dataspace);
-   H5Pclose (dset_create_props);
-   H5Fclose (file);
-
-   return 0;
-}</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 13. Scale-offset compression floating-point data</b><br />
-        Illustrates the use of the scale-offset filter for writing 
-        and reading floating-point data.
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-
-<h4><em>Limitations</em></h4>
-
-  <p>For floating-point data handling, there are some algorithmic 
-  limitations to the GRiB data packing mechanism:</p>
-
-<dl>
-  <dd>
-    <ol>
-      <li>Both the E-scaling and D-scaling methods are lossy compression</li>
-      <li>For the D-scaling method, since data values have been rounded to 
-        integer values (positive) before truncating to the minimum-bits, 
-        their range is limited by the maximum value that can be represented 
-        by the corresponding unsigned integer type (the same size as that of 
-        the floating-point type)</li>
-    </ol>
-  </dd>
-</dl>
-
-<h4><em>Suggestions</em></h4>
-
-<p>The following are some suggestions for using the filter for 
-floating-point data:</p>
-
-<dl>
-  <dd>
-    <ol>
-      <li>It is better to convert the units of data so that the units are 
-        within certain common range (for example, 1200m to 1.2km)</li>
-      <li>If data values to be compressed are very near to zero, it 
-        is strongly recommended that the user sets the fill value away 
-        from zero (for example, a large positive number); if the user 
-        does 
-        nothing, the HDF5 Library will set the fill value to zero, and 
-        this may cause undesirable compression results</li>
-      <li>Users are not encouraged to use a very large decimal scale 
-        factor (e.g. 100) for the D-scaling method; this can cause the 
-        filter not to ignore the fill value when finding maximum and minimum 
-        values, and they will get a much larger minimum-bits (poor 
-        compression)</li>
-    </ol>
-  </dd>
-</dl>
-
-
-
-  
-
-<a name="Szip">
-<h3>5.6.3. Using the Szip Filter</h3>
-</a>
-
-  <p>See The HDF Group website for 
-  <a href="http://www.hdfgroup.org/doc_resource/SZIP/" target="Ext1">further 
-  information</a> regarding the Szip filter.</p>
-
-<p> </p>
-<p> </p>
-
-
-
-
-
-<!-- HEADER RIGHT " " -->
-
-</body>
-</html>
-
-  
diff --git a/html/UG/OldHtmlSource/11_Datatypes.html b/html/UG/OldHtmlSource/11_Datatypes.html
deleted file mode 100755
index 5eaeeeb..0000000
--- a/html/UG/OldHtmlSource/11_Datatypes.html
+++ /dev/null
@@ -1,7494 +0,0 @@
-<!doctype HTML public "-//W3C//DTD HTML 4.0 Frameset//EN">
-<html>
-<head>
-<title>Chapter 6: HDF5 Datatypes</title>
-
-<!--(Meta)==========================================================-->
-
-<!--(Links)=========================================================-->
-
-<!--( Begin styles definition )=====================================-->
-<link href="ed_styles/NewUGelect.css" rel="stylesheet" type="text/css">
-<!--( End styles definition )=======================================-->
-
-</head> 
-
-<body>
-
-<!-- #BeginLibraryItem "/ed_libs/Copyright.lbi" -->
-<!--
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-  * Copyright by The HDF Group.                                               *
-  * Copyright by the Board of Trustees of the University of Illinois.         *
-  * All rights reserved.                                                      *
-  *                                                                           *
-  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
-  * terms governing use, modification, and redistribution, is contained in    *
-  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
-  * of the source code distribution tree; Copyright.html can be found at the  *
-  * root level of an installed copy of the electronic HDF5 document set and   *
-  * is linked from the top-level documents page.  It can also be found at     *
-  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
-  * access to either file, you may request a copy from help at hdfgroup.org.     *
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- -->
-<!-- #EndLibraryItem --><!-- HEADER LEFT "HDF5 User's Guide" -->
-<!-- HEADER RIGHT "HDF5 Datatypes" -->
-
-<!--( TOC )=========================================================-->
-<!--<SCRIPT language="JavaScript">-->
-<!--
-document.writeln ('\
-<table x-use-null-cells\
-                align=right\
-		width="240"\
-		cellspacing="0"\
-		class="tocTable">\
-  <tr valign="top"> \
-    <td class="tocTableHeaderCell" colspan="2"> \
-        <span class="TableHead">Chapter Contents</span></td>\
-  </tr>\
--->
-<!-- Table Version 3 -->
-<!--
-\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Intro">1.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Intro">Introduction</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#DtypesUsed">2.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#DtypesUsed">How Datatypes Are Used</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#FileFunctSums">3.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#FileFunctSums">Datatype (H5T) Function Summaries</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Pmodel">4.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Pmodel">The Programming Model</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#NonNumDtypes">5.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#NonNumDtypes">Other Non-numeric Datatypes</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Fvalues">6.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Fvalues">Fill Values</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#CCDtypes">7.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#CCDtypes">Complex Combinations of Datatypes</a>\
-	  </td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#LCDtypeObj">8.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#LCDtypeObj">Life Cycle of the Datatype Object</a>\
-	  </td>\
-  </tr>\
-\
-  <tr valign="top"> \
-    <td class="tocTableContentCell"> \
--->
-<!-- editingComment -- "tocTableContentCell" and "tocTableContentCell4" \
-\-->
-<!-- are the table-closing cell class.\
-    <td class="tocTableContentCell2"> \
-\-->
-<!--
-      <a href="#Dtransfer">9.</a></td>\
-    <td class="tocTableContentCell4">\
-	  <a href="#Dtransfer">Data Transfer: Datatype Conversion and Selection</a>\
-  </td></tr>\
-</table>\
-')
--->
-<!-- </SCRIPT> -->
-<!--(End TOC)=======================================================-->
-
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  ] ] ]</span>
--->
-
-<!-- editingComment
--->
-
-<div align="center">
-<a name="top">
-<h2>Chapter 6<br /><font size="7">HDF5 Datatypes</font></h2>
-</a>
-</div>
-
-
-<dir>
-
-<!-- editingComment
-  <span class="editingComment">[ [ [
-<h1 class=editingComment align=center>- - - DRAFT - - -</h1>
-  <p class="editingComment">- - - This is an early draft of the Datatypes chapter 
-  of the new HDF5 User's Guide; much of this material will appear in the published 
-  version of the new UG, but some will appear in other documents, such as the 
-  HDF5 Reference Manual or the HDF5 Tutorial.  A PDF version of this draft is 
-  being made available to HDF5 users prior to publication of the new UG because 
-  it contains a great deal of information that is not otherwise available.  
-  ] ] ]</span>
--->
-</dir>
-
-<a name="Intro">
-<h3>6.1. Introduction</h3>
-</a>
-
-
-<h4>6.1.1. Introduction and Definitions</h4>
-
-  <p>An HDF5 dataset is an array of data elements, arranged according to the 
-  specifications of the dataspace.  In general, a data element is the smallest 
-  addressable unit of storage in the HDF5 file. (Compound datatypes are the 
-  exception to this rule.) The HDF5 datatype defines the storage format for a 
-  single data element. See the figure below.</p>
-  
-  <p>The model for HDF5 attributes is extremely similar to datasets: 
-  an attribute has a dataspace and a datatype, as shown in the figure below. 
-  The information in this chapter applies to both datasets and attributes.</p>
-  
-
-<table width="500" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dtypes_fig1.JPG">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 1. Datatypes, dataspaces, and datasets</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>Abstractly, each data element within the dataset is a sequence of bits, 
-  interpreted as a single value from a set of values (e.g., a number or a 
-  character). For a given datatype, there is a standard or convention for 
-  representing the values as bits, and when the bits are represented in 
-  a particular storage the bits are laid out in a specific storage 
-  scheme, e.g., as 8-bit bytes, with a specific ordering and alignment 
-  of bytes within the storage array.</p>
-  
-  <p>HDF5 datatypes implement a flexible, extensible, and portable mechanism 
-  for specifying and discovering the storage layout of the data elements, 
-  determining how to interpret the elements (e.g., as floating point numbers), 
-  and for transferring data from different compatible layouts.</p>
-  
-<!-- NEW PAGE -->
-  <p>An HDF5 datatype describes one specific layout of bits. A dataset has a 
-  single datatype which applies to every data element. When a dataset is 
-  created, the storage datatype is defined. After the dataset or attribute 
-  is created, the datatype cannot be changed.</p>
-  
-<ul>
-    <li>The datatype describes the storage layout of a single data element</li>
-    <li>All elements of the dataset must have the same type</li>
-    <li>The datatype of a dataset is immutable</li>
-</ul>
-
-  <p>When data is transferred (e.g., a read or write), each end point of the 
-  transfer has a datatype, which describes the correct storage for the elements. 
-  The source and destination may have different (but compatible) layouts, in which 
-  case the data elements are automatically transformed during the transfer.</p>
-  
-  <p>HDF5 datatypes describe commonly used binary formats for numbers (integers 
-  and floating point) and characters (ASCII). A given computing architecture and 
-  programming language supports certain number and character representations. 
-  For example, a computer may support 8-, 16-, 32-, and 64-bit signed integers, 
-  stored in memory in little-endian byte order. These would presumably correspond 
-  to the C programming language types ‘char’, ‘short’, 
-  ‘int’, and ‘long’.</p>
-  
-  <p>When reading and writing from memory, the HDF5 library must know the 
-  appropriate datatype that describes the architecture specific layout. 
-  The HDF5 library provides the platform independent ‘NATIVE’ 
-  types, which are mapped to an appropriate datatype for each platform. So 
-  the type ‘<code>H5T_NATIVE_INT</code>’ is an alias for 
-  the appropriate descriptor for each platform.</p>
-  
-  <p>Data in memory has a datatype:</p>
-
-<ul>
-    <li>The storage layout in memory is architecture-specific</li>
-    <li>The HDF5 ‘NATIVE’ types are predefined aliases for the 
-        architecture-specific memory layout</li>
-    <li>The memory datatype need not be the same as the stored datatype of 
-        the dataset</li>
-</ul>
-
-  <p>In addition to numbers and characters, an HDF5 datatype can describe more 
-  abstract classes of types, including 
-  <!-- date-times, 
-            (TIME REFERENCES COMMENTED OUT 6 FEB 2006,
-            UNTIL TIME DATATYPE IS PROPERLY SUPPORTED IN THE LIBRARY) -->
-  enumerations, strings, bit strings, and references (pointers to objects 
-  in the HDF5 file). HDF5 supports several classes of composite datatypes 
-  which are combinations of one or more other datatypes. In addition to 
-  the standard predefined datatypes, users can define new datatypes 
-  within the datatype classes.</p>
-
-  <p>The HDF5 datatype model is very general and flexible:</p>
-  
-<ul>
-    <li>For common simple purposes, only predefined types will be needed</li>
-    <li>Datatypes can be combined to create complex structured datatypes</li>
-    <li>If needed, users can define custom atomic datatypes</li>
-    <li>Committed datatypes can be shared by datasets or attributes</li>
-</ul>
-
-<!-- NEW PAGE -->
-<h4>6.1.2. HDF5 Datatype Model</h4>
-
-  <p>The HDF5 Library implements an object-oriented model of datatypes. 
-  HDF5 datatypes are organized as a logical set of base types, or datatype 
-  classes. Each datatype class defines a format for representing logical 
-  values as a sequence of bits. For example the <code>H5T_INTEGER</code> 
-  class is a format for representing twos complement integers of various 
-  sizes.</p>
-  
-  <p>A datatype class is defined as a set of one or more datatype properties.  
-  A datatype property is a property of the bit string. The datatype properties 
-  are defined by the logical model of the datatype class.  For example, the 
-  integer class (twos complement integers) has properties such as 
-  “signed or unsigned”, “length”, and 
-  “byte-order”. The float class (IEEE floating point 
-  numbers) has these properties, plus “exponent bits”, 
-  “exponent sign”, etc.</p>
-  
-  <p>A datatype is derived from one datatype class: a given datatype has 
-  a specific value for the datatype properties defined by the class. 
-  For example, for 32-bit signed integers, stored big-endian, the HDF5 
-  datatype is a sub-type of integer with the properties set to 
-  <code>signed=1</code>, <code>size=4</code> (bytes), and 
-  <code>byte-order=BE</code>.</p>
-  
-  <p>The HDF5 datatype API (H5T functions) provides methods to create 
-  datatypes of different datatype classes, to set the datatype properties 
-  of a new datatype, and to discover the datatype properties of an 
-  existing datatype.</p>
-  
-  <p>The datatype for a dataset is stored in the HDF5 file as part of 
-  the metadata for the dataset.</p>
-  
-  <p>A datatype can be shared by more than one dataset in the file if the 
-  datatype is saved to the file with a name. This shareable datatype is known
-  as a committed datatype. In the past, this kind of datatype was called 
-  a named datatype. </p>
-  
-  <p>When transferring data (e.g., a read or write), the data elements of 
-  the source and destination storage must have compatible types.  As a 
-  general rule, data elements with the same datatype class are compatible 
-  while elements from different datatype classes are not compatible. When 
-  transferring data of one datatype to another compatible datatype, the 
-  HDF5 Library uses the datatype properties of the source and 
-  destination to automatically transform each data element.  For 
-  example, when reading from data stored as 32-bit signed integers, 
-  big-endian into 32-bit signed integers, little-endian, the HDF5 
-  Library will automatically swap the bytes.</p>
-  
-  <p>Thus, data transfer operations (<code>H5Dread</code>, 
-  <code>H5Dwrite</code>, <code>H5Aread</code>, <code>H5Awrite</code>) require 
-  a datatype for both the source and the destination.</p>
-  
-<!-- NEW PAGE -->
-<table width="500" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dtypes_fig2.JPG">
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 2. The datatype model</b> 
-        <hr color="green" size="3"/></td></tr>
-</table>
-<br />
-
-
-  <p>The HDF5 Library defines a set of predefined datatypes, corresponding to 
-  commonly used storage formats, such as twos complement integers, IEEE Floating 
-  point numbers, etc., 4- and 8-byte sizes, big-endian and little-endian 
-  byte orders.  In addition, a user can derive types with custom values 
-  for the properties. For example, a user program may create a datatype 
-  to describe a 6-bit integer, or a 600-bit floating point number.</p>
-  
-  <p>In addition to atomic datatypes, the HDF5 Library supports 
-  composite datatypes. A composite datatype is an aggregation of one 
-  or more datatypes. Each class of composite datatypes has properties 
-  that describe the organization of the composite datatype. See the 
-  figure below. Composite datatypes include:</p>
-
-<ul>
-    <li>Compound datatypes: structured records</li>
-    <li>Array: a multidimensional array of a datatype</li>
-    <li>Variable-length: a one-dimensional array of a datatype</li>
-</ul>
-
-<br />
-
-<!-- NEW PAGE -->
-<table width="400" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dtypes_fig3.JPG">
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 3. Composite datatypes</b> 
-        <hr color="green" size="3"/></td></tr>
-</table>
-<br />
-
-
-<h4><em>6.1.2.1. Datatype Classes and Properties</em></h4>
-
-  <p>The figure below shows the HDF5 datatype classes. Each class is 
-  defined to have a set of properties which describe the layout of the 
-  data element and the interpretation of the bits. The table below 
-  lists the properties for the datatype classes.</p>
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dtypes_fig4.JPG">
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 4. Datatype classes</b> 
-        <hr color="green" size="3"/></td></tr>
-</table>
-<br />
-<br />
-<!-- NEW PAGE -->
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="7" align="left" valign="bottom">
-        <b>Table 1. Datatype classes and their properties</b></td>
-        </tr>
-    <tr><td colspan="7"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="20%"><b>Class</b></td>
-        <td width="2%"> </td>
-        <td width="18%"><b>Description</b></td>
-        <td width="2%"> </td>
-        <td width="28%"><b>Properties</b></td>
-        <td width="2%"> </td>
-        <td width="28%"><b>Notes</b></td>
-        </tr>
-    <tr><td colspan="7"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Integer</td>
-        <td> </td>
-        <td>Twos complement integers</td>
-        <td> </td>
-        <td>Size (bytes), precision (bits), offset (bits), 
-        pad, byte order, signed/unsigned</td>
-        <td> </td>
-        <td> </td>
-        </tr>
-    <tr><td colspan="7"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Float</td>
-        <td> </td>
-        <td>Floating Point numbers</td>
-        <td> </td>
-        <td>Size (bytes), precision (bits), offset (bits), 
-        pad, byte order, sign position, exponent position, exponent size (bits), 
-        exponent sign, exponent bias, mantissa position, mantissa (size) bits, 
-        mantissa sign, mantissa normalization, internal padding</td>
-        <td> </td>
-        <td>See IEEE 754 for a definition of these properties. These 
-        properties describe non-IEEE 754 floating point formats as well.</td>
-        </tr>
-    <tr><td colspan="7"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Character</td>
-        <td> </td>
-        <td>Array of 1-byte character encoding </td>
-        <td> </td>
-        <td>Size (characters), Character set, byte order, 
-        pad/no pad, pad character</td>
-        <td> </td>
-        <td>Currently, ASCII and UTF-8 are supported.</td>
-        </tr>
-    <tr><td colspan="7"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Bitfield</td>
-        <td> </td>
-        <td>String of bits</td>
-        <td> </td>
-        <td>Size (bytes), precision (bits), offset (bits), 
-        pad, byte order</td>
-        <td> </td>
-        <td>A sequence of bit values packed into one or more bytes.</td>
-        </tr>
-    <tr><td colspan="7"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Opaque</td>
-        <td> </td>
-        <td>Uninterpreted data</td>
-        <td> </td>
-        <td>Size (bytes), precision (bits), offset (bits), 
-        pad, byte order, tag</td>
-        <td> </td>
-        <td>A sequence of bytes, stored and retrieved as a block. The 
-        ‘tag’ is a string that can be used to label 
-        the value.</td>
-        </tr>
-    <tr><td colspan="7"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Enumeration</td>
-        <td> </td>
-        <td>A list of discrete values, with symbolic names 
-        in the form of strings.</td>
-        <td> </td>
-        <td>Number of elements, element names, element values</td>
-        <td> </td>
-        <td>Enumeration is a list of pairs, (name, value). The name is 
-        a string, the value is an unsigned integer.</td>
-        </tr>
-    <tr><td colspan="7"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Reference</td>
-        <td> </td>
-        <td>Reference to object or region within the HDF5 file</td>
-        <td> </td>
-        <td> </td>
-        <td> </td>
-        <td> See the Reference API, H5R</td>
-        </tr>
-    <tr><td colspan="7"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Array</td>
-        <td> </td>
-        <td>Array (1-4 dimensions) of data elements</td>
-        <td> </td>
-        <td>Number of dimensions, dimension sizes, base datatype</td>
-        <td> </td>
-        <td>The array is accessed atomically: no selection or sub-setting.</td>
-        </tr>
-    <!-- NEW PAGE -->
-    <tr><td colspan="7"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Variable-length</td>
-        <td> </td>
-        <td>A variable-length 1-dimensional array of data data elements</td>
-        <td> </td>
-        <td>Current size, base type</td>
-        <td> </td>
-        <td> </td>
-        </tr>
-    <tr><td colspan="7"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Compound</td>
-        <td> </td>
-        <td>A Datatype  of a sequence of Datatypes</td>
-        <td> </td>
-        <td>Number of members, member names, member types, 
-        member offset, member class, member size, byte order </td>
-        <td> </td>
-        <td> </td>
-        </tr>
-    <tr><td colspan="7"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-
-<h4><em>6.1.2.2. Predefined Datatypes</em></h4>
-
-  <p>The HDF5 library predefines a modest number of commonly used datatypes. 
-  These types have standard symbolic names of the form 
-  <code>H5T_<em>arch_base</em></code> where <em>arch</em> is an architecture 
-  name and <em>base</em> is a programming type name (Table 2). New types can 
-  be derived from the predefined types by copying the predefined type (see 
-  <code>H5Tcopy()</code>) and then modifying the result. </p>
-  
-  <p>The base name of most types consists of a letter to indicate the class 
-  (Table 3), a precision in bits, and an indication of the byte order (Table 4).</p>
-  
-  <p>Table 5 shows examples of predefined datatypes. 
-  The full list can be found  in the “HDF5 Predefined Datatypes” 
-  section of the <a href="../RM/RM_H5Front.html">
-  <cite>HDF5 Reference Manual</cite></a>.</p>
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  Link to ../PredefDTypes.html
-  ] ] ]</span>
--->
-<br />
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 2. Architectures used in predefined datatypes</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="20%"> 
-        <b>Architecture<br />Name</b></td>
-        <td width="80%"> 
-        <b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>IEEE</code> </td>
-        <td>IEEE-754 standard floating point types in 
-        various byte orders.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>STD</code> </td>
-        <td>
-        This is an architecture that contains semi-standard 
-        datatypes like signed two’s complement integers, unsigned 
-        integers, and bitfields in various byte orders.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>C <br /> FORTRAN</code> </td>
-        <td>Types which are specific to the C or Fortran 
-        programming languages are defined in these architectures. For instance, 
-        <code>H5T_C_S1</code> defines a base string type with null termination 
-        which can be used to derive string types of other lengths.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>NATIVE</code> </td>
-        <td>This architecture contains C-like 
-        datatypes for the machine on which the library was compiled. The 
-        types were actually defined by running the <code>H5detect</code> 
-        program when the library was compiled. In order to be portable, 
-        applications should almost always use this architecture to describe 
-        things in memory.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>CRAY</code> </td>
-        <td>Cray architectures. These are 
-        word-addressable, big-endian systems with non-IEEE floating point.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>INTEL</code> </td>
-        <td>All Intel and compatible CPU’s 
-        including 80286, 80386, 80486, Pentium, Pentium-Pro, and Pentium-II. 
-        These are little-endian systems with IEEE floating-point.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>MIPS</code> </td>
-        <td>All MIPS CPU’s commonly used in 
-        SGI systems. These are big-endian systems with IEEE floating-point.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>ALPHA</code> </td>
-        <td>All DEC Alpha CPU’s, 
-        little-endian systems with IEEE floating-point.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-
-<table width="200" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 3. Base types</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="50">B</td>
-        <td width="150">Bitfield</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>F</td>
-        <td>Floating point</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>I</td>
-        <td>Signed integer</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>R</td>
-        <td>References</td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>S</td>
-        <td>Character string</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>U</td>
-        <td>Unsigned integer</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-<!-- NEW PAGE -->
-<table width="200" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 4. Byte order</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="50">BE</td>
-        <td width="150">Big-endian</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>LE</td>
-        <td>Little-endian</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 5. Some predefined datatypes</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="25%"> 
-        <b>Example</b></td>
-        <td width="75%"> 
-        <b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_IEEE_F64LE</code> </td>
-        <td>Eight-byte, little-endian, IEEE floating-point</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_IEEE_F32BE</code> </td>
-        <td>Four-byte, big-endian, IEEE floating point</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_STD_I32LE</code> </td>
-        <td>Four-byte, little-endian, signed two’s complement 
-        integer</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_STD_U16BE</code> </td>
-        <td>Two-byte, big-endian, unsigned integer</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_C_S1</code> </td>
-        <td>One-byte, null-terminated string of eight-bit characters</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_INTEL_B64</code> </td>
-        <td>Eight-byte bit field on an Intel CPU</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_CRAY_F64</code> </td>
-        <td>Eight-byte Cray floating point</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_STD_ROBJ</code> </td>
-        <td>Reference to an entire object in a file</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-
-
-
-  <p>The HDF5 Library predefines a set of <code>NATIVE</code> datatypes which 
-  are similar to C type names. The native types are set to be an alias for the 
-  appropriate HDF5 datatype for each platform. For example, 
-  <code>H5T_NATIVE_INT</code> corresponds to a C <code>int</code> type. 
-  On an Intel based PC, this type is the same as <code>H5T_STD_I32LE</code>, 
-  while on a MIPS system this would be equivalent to <code>H5T_STD_I32BE</code>. 
-  Table 6 shows examples of <code>NATIVE</code> types and corresponding 
-  C types for a common 32-bit workstation.</p>
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 6. Native and 32-bit C datatypes</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td><b>Example</b></td>
-        <td><b>Corresponding C Type</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_CHAR</code> </td>
-        <td>char</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_SCHAR</code> </td>
-        <td>signed char</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_UCHAR</code> </td>
-        <td>unsigned char</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_SHORT</code> </td>
-        <td>short</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_USHORT</code> </td>
-        <td>unsigned short</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_INT</code> </td>
-        <td>int</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_UINT</code> </td>
-        <td>unsigned</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_LONG</code> </td>
-        <td>long</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_ULONG</code> </td>
-        <td>unsigned long</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_LLONG</code> </td>
-        <td>long long</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_ULLONG</code> </td>
-        <td>unsigned long long</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_FLOAT</code> </td>
-        <td>float</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_DOUBLE</code> </td>
-        <td>double</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_LDOUBLE</code> </td>
-        <td>long double</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_HSIZE</code> </td>
-        <td>hsize_t</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_HSSIZE</code> </td>
-        <td>hssize_t</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_HERR</code> </td>
-        <td>herr_t</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_HBOOL</code> </td>
-        <td>hbool_t</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_B8</code> </td>
-        <td>8-bit unsigned integer or 8-bit buffer in memory</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_B16</code> </td>
-        <td>16-bit unsigned integer or 16-bit buffer in memory</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_B32</code> </td>
-        <td>32-bit unsigned integer or 32-bit buffer in memory</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_NATIVE_B64</code> </td>
-        <td>64-bit unsigned integer or 64-bit buffer in memory</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="DtypesUsed">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<!-- NEW PAGE -->
-<a name="DtypesUsed">
-<h3 class=pagebefore>6.2. How Datatypes are Used</h3>
-</a>
-
-<h4>6.2.1. The Datatype Object and the HDF5 Datatype API</h4>
-
-  <p>The HDF5 Library manages datatypes as objects. The HDF5 datatype API 
-  manipulates the datatype objects through C function calls.  New datatypes 
-  can be created from scratch or copied from existing datatypes. When a 
-  datatype is no longer needed its resources should be released by calling 
-  <code>H5Tclose()</code>. </p>
-  
-  <p>The datatype object is used in several roles in the HDF5 data model 
-  and library. Essentially, a datatype is used whenever the format of 
-  data elements is needed. There are four major uses of datatypes in 
-  the HDF5 Library: at dataset creation, during data transfers, when 
-  discovering the contents of a file, and for specifying user-defined 
-  datatypes. See the table below.</p>
-  
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 7. Datatype uses</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td> 
-        <b>Use</b></td>
-        <td> 
-        <b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Dataset creation</td>
-        <td>The datatype of the data elements must be 
-        declared when the dataset is created.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Data transfer</td>
-        <td>The datatype (format) of the data elements 
-        must be defined for both the source and destination.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Discovery</td>
-        <td>The datatype of a dataset can be 
-        interrogated to retrieve a complete description of the storage layout.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Creating user-defined datatypes</td>
-        <td>Users can define their own datatypes by 
-        creating datatype objects and setting their properties.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-
-<h4>6.2.2. Dataset Creation</h4>
-
-  <p>All the data elements of a dataset have the same datatype. When a dataset 
-  is created, the datatype for the data elements must be specified. The 
-  datatype of a dataset can never be changed. The example below shows 
-  the use of a datatype to create a dataset called “/dset”.  In 
-  this example, the dataset will be stored as 32-bit signed integers in 
-  big-endian order.</p>
-  
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-<pre>
-  hid_t dt;
-  dt = H5Tcopy(H5T_STD_I32BE);
-  dataset_id = H5Dcreate(file_id, “/dset”, dt, dataspace_id,   
-      H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 1. Using a datatype to create a dataset </b> 
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<h4>6.2.3. Data Transfer (Read and Write)</h4>
-
-  <p>Probably the most common use of datatypes is to write or read data from a 
-  dataset or attribute. In these operations, each data element is transferred 
-  from the source to the destination (possibly rearranging the order of the 
-  elements). Since the source and destination do not need to be identical 
-  (i.e., one is disk and the other is memory) the transfer requires both the 
-  format of the source element and the destination element. Therefore, data 
-  transfers use two datatype objects, for the source and destination.</p>
-   
-  <p>When data is written, the source is memory and the destination is disk 
-  (file). The memory datatype describes the format of the data element in the 
-  machine memory, and the file datatype describes the desired format of the data 
-  element on disk. Similarly, when reading, the source datatype describes the 
-  format of the data element on disk, and the destination datatype describes the 
-  format in memory.</p>
-  
-
-  <p>In the most common cases, the file datatype is the datatype specified 
-  when the dataset was created, and the memory datatype should be the 
-  appropriate NATIVE type.</p>
-  
-  <p>The examples below show samples of writing data to and reading data 
-  from a dataset. The data in memory is declared C type ‘int’, 
-  and the datatype <code>H5T_NATIVE_INT</code> corresponds to this type. 
-  The datatype of the dataset should be of datatype class 
-  <code>H5T_INTEGER</code>.</p>
-  
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-<pre>
-   int  dset_data[DATA_SIZE];
-
-   status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
-         H5P_DEFAULT, dset_data);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 2. Writing to a dataset</b> 
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-<pre>
-  int dset_data[DATA_SIZE];
-
-  status = H5Dread(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, 
-      H5P_DEFAULT,  dset_data);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 3. Reading from a dataset</b> 
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<h4>6.2.4. Discovery of Data Format</h4>
-
-  <p>The HDF5 Library enables a program to determine the datatype class and 
-  properties for any datatype. In order to discover the storage format of data 
-  in a dataset, the datatype is obtained, and the properties are determined 
-  by queries to the datatype object. The example below shows code that 
-  analyzes the datatype for an integer and prints out a description of 
-  its storage properties (byte order, signed, size.)</p>
-<!-- NEW PAGE -->
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-<pre>
-  switch (H5Tget_class(type)) {
-  case H5T_INTEGER:
-  ord = H5Tget_order(type);
-  sgn = H5Tget_sign(type);
-  printf(“Integer ByteOrder= ”);
-  switch (ord) {
-  case H5T_ORDER_LE:
-      printf(“LE”);
-      break;
-  case H5T_ORDER_BE:
-      printf(“BE”);
-      break;
-  }
-  printf(“ Sign= ”);
-  switch (sgn) {
-  case H5T_SGN_NONE:
-      printf(“false”);
-      break;
-  case H5T_SGN_2:
-      printf(“true”);
-      break;
-  }
-  printf(“ Size= ”);
-  sz = H5Tget_size(type);
-  printf(“%d”, sz);
-  printf(“\n”);
-  break;</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 4. Discovering datatype properties</b> 
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<h4>6.2.5. Creating and Using User-defined Datatypes</h4>
-
-  <p>Most programs will primarily use the predefined datatypes described above, 
-  possibly in composite datatypes such as compound or array datatypes.  
-  However, the HDF5 datatype model is extremely general; a user program can 
-  define a great variety of atomic datatypes (storage layouts). In particular, 
-  the datatype properties can define signed and unsigned integers of any size 
-  and byte order, and floating point numbers with different formats, size, and 
-  byte order. The HDF5 datatype API provides methods to set these properties.</p>
-  
-  <p>User-defined types can be used to define the layout of data in memory, 
-  e.g., to match some platform specific number format or application 
-  defined bit-field. The user-defined type can also describe data in 
-  the file, e.g., some application-defined format.  The user-defined 
-  types can be translated to and from standard types of the same class, 
-  as described above.</p>
-  
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  <p><em>{Simple programming example�}</em>
-  ] ] ]</span>
--->
-  
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="FileFunctSums">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<!-- NEW PAGE -->
-<a name="FileFunctSums">
-<h3 class=pagebefore>6.3. Datatype (H5T) Function Summaries</h3>
-</a>
-  <p>Functions that can be used with datatypes (H5T functions) and property 
-  list functions that can be used with datatypes (H5P functions) are listed 
-  below.</p>
-<br />
-
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 1. General datatype operations
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"><td width="25%"><b>C Function<br />Fortran Function</b></td>
-        <td width="2%"> </td>
-        <td width="73%"><b>Purpose</b></td>
-
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tcreate<br />h5tcreate_f</code> 
-        </td><td> </td>
-        <td>
-        Creates a new datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Topen<br />h5topen_f</code> 
-        </td><td> </td>
-        <td>
-        Opens a committed datatype. The C function is a 
-        macro: see <a href="../RM/APICompatMacros.html">“API 
-        Compatibility Macros in HDF5.”</a>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tcommit<br />h5tcommit_f</code> 
-        </td><td> </td>
-        <td>
-        Commits a transient datatype to a file. The datatype is now a 
-        committed datatype. The C function is a 
-        macro: see <a href="../RM/APICompatMacros.html">“API 
-        Compatibility Macros in HDF5.”</a>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tcommit_anon<br />h5tcommit_anon_f</code> 
-        </td><td> </td>
-        <td>
-        Commits a transient datatype to a file. The datatype is now a 
-        committed datatype, but it is not linked into the file structure. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tcommitted<br />h5tcommitted_f</code> 
-        </td><td> </td>
-        <td>
-        Determines whether a datatype is a committed or a transient type.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tcopy<br />h5tcopy_f</code> 
-        </td><td> </td>
-        <td>
-        Copies an existing datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tequal<br />h5tequal_f</code> 
-        </td><td> </td>
-        <td>
-        Determines whether two datatype identifiers refer to the same datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tlock<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Locks a datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_class<br />h5tget_class_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the datatype class identifier.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_create_plist<br />h5tget_create_plist_f</code> 
-        </td><td> </td>
-        <td>
-        Returns a copy of a datatype creation property list. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_size<br />h5tget_size_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the size of a datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_super<br />h5tget_super_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the base datatype from which a datatype is derived.
-        </td>
-        </tr>
-    <!-- NEW PAGE -->
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_native_type<br />h5tget_native_type_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the native datatype of a specified datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tdetect_class<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Determines whether a datatype is of the given datatype class.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_order<br />h5tget_order_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the byte order of a datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tset_order<br />h5tset_order_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the byte ordering of a datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tdecode<br />h5tdecode_f</code> 
-        </td><td> </td>
-        <td>
-        Decode a binary object description of datatype and return a new 
-        object identifier. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tencode<br />h5tencode</code> 
-        </td><td> </td>
-        <td>
-        Encode a datatype object description into a binary buffer. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tclose<br />h5tclose_f</code> 
-        </td><td> </td>
-        <td>
-        Releases a datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-
-
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 2. Conversion functions
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tconvert<br />h5tconvert_f</code> 
-        </td><td> </td>
-        <td>
-        Converts data between specified datatypes. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tcompiler_conv<br />h5tcompiler_conv_f</code> 
-        </td><td> </td>
-        <td>
-        Check whether the library�s default conversion is hard conversion. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tfind<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Finds a conversion function.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tregister<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Registers a conversion function.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tunregister<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Removes a conversion function from all conversion paths.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 3. Atomic datatype properties 
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tset_size<br />h5tset_size_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the total size for an atomic datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_precision<br />h5tget_precision_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the precision of an atomic datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tset_precision<br />h5tset_precision_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the precision of an atomic datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_offset<br />h5tget_offset_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the bit offset of the first significant bit.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tset_offset<br />h5tset_offset_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the bit offset of the first significant bit.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_pad<br />h5tget_pad_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the padding type of the least and most-significant bit 
-        padding.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tset_pad<br />h5tset_pad_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the least and most-significant bits padding types.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_sign<br />h5tget_sign_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the sign type for an integer type.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tset_sign<br />h5tset_sign_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the sign property for an integer type.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_fields<br />h5tget_fields_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves floating point datatype bit field information.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tset_fields<br />h5tset_fields_f</code> 
-        </td><td> </td>
-        <td>
-        Sets locations and sizes of floating point bit fields.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_ebias<br />h5tget_ebias_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the exponent bias of a floating-point type.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tset_ebias<br />h5tset_ebias_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the exponent bias of a floating-point type.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_norm<br />h5tget_norm_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves mantissa normalization of a floating-point datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tset_norm<br />h5tset_norm_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the mantissa normalization of a floating-point datatype.
-        </td>
-        </tr>
-    <!-- NEW PAGE -->
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_inpad<br />h5tget_inpad_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the internal padding type for unused bits in floating-point 
-        datatypes.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tset_inpad<br />h5tset_inpad_f</code> 
-        </td><td> </td>
-        <td>
-        Fills unused internal floating point bits.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_cset<br />h5tget_cset_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the character set type of a string datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tset_cset<br />h5tset_cset_f</code> 
-        </td><td> </td>
-        <td>
-        Sets character set to be used.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_strpad<br />h5tget_strpad_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the storage mechanism for a string datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tset_strpad<br />h5tset_strpad_f</code> 
-        </td><td> </td>
-        <td>
-        Defines the storage mechanism for character strings.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 4. Enumeration datatypes 
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tenum_create<br />h5tenum_create_f</code> 
-        </td><td> </td>
-        <td>
-        Creates a new enumeration datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tenum_insert<br />h5tenum_insert_f</code> 
-        </td><td> </td>
-        <td>
-        Inserts a new enumeration datatype member.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tenum_nameof<br />h5tenum_nameof_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the symbol name corresponding to a specified member of an 
-        enumeration datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tenum_valueof<br />h5tenum_valueof_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the value corresponding to a specified member of an 
-        enumeration datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_member_value<br />h5tget_member_value_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the value of an enumeration datatype member.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_nmembers<br />h5tget_nmembers_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the number of elements in a compound or enumeration datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_member_name<br />h5tget_member_name_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the name of a compound or enumeration datatype member.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_member_index<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the index of a compound or enumeration datatype member.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 5. Compound datatype properties 
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_nmembers<br />h5tget_nmembers_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the number of elements in a compound or enumeration datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_member_class<br />h5tget_member_class_f</code> 
-        </td><td> </td>
-        <td>
-        Returns datatype class of compound datatype member.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_member_name<br />h5tget_member_name_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the name of a compound or enumeration datatype member.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_member_index<br />h5tget_member_index_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the index of a compound or enumeration datatype member.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_member_offset<br />h5tget_member_offset_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the offset of a field of a compound datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_member_type<br />h5tget_member_type_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the datatype of the specified member.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tinsert<br />h5tinsert_f</code> 
-        </td><td> </td>
-        <td>
-        Adds a new member to a compound datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tpack<br />h5tpack_f</code> 
-        </td><td> </td>
-        <td>
-        Recursively removes padding from within a compound datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 6. Array datatypes 
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tarray_create<br />h5tarray_create_f</code> 
-        </td><td> </td>
-        <td>
-        Creates an array datatype object. The C function is a 
-        macro: see <a href="../RM/APICompatMacros.html">“API 
-        Compatibility Macros in HDF5.”</a>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_array_ndims<br />h5tget_array_ndims_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the rank of an array datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_array_dims<br />h5tget_array_dims_f</code> 
-        </td><td> </td>
-        <td>
-        Returns sizes of array dimensions and dimension permutations. 
-        The C function is a 
-        macro: see <a href="../RM/APICompatMacros.html">“API 
-        Compatibility Macros in HDF5.”</a>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-
-
-<!-- NEW PAGE -->
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 7. Variable-length datatypes 
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tvlen_create<br />h5tvlen_create_f</code> 
-        </td><td> </td>
-        <td>
-        Creates a new variable-length datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tis_variable_str<br />h5tis_variable_str_f</code> 
-        </td><td> </td>
-        <td>
-        Determines whether datatype is a variable-length string.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 8. Opaque datatypes 
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tset_tag<br />h5tset_tag_f</code> 
-        </td><td> </td>
-        <td>
-        Tags an opaque datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Tget_tag<br />h5tget_tag_f</code> 
-        </td><td> </td>
-        <td>
-        Gets the tag associated with an opaque datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 9. Conversions between datatype and text 
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5LTtext_to_dtype<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Creates a datatype from a text description.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5LTdtype_to_text<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Generates a text description of a datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 10. Datatype creation property list 
-        functions (H5P)</b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_char_encoding<br />h5pset_char_encoding_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the character encoding used to encode a string. 
-        Use to set ASCII or UTF-8 character encoding for object names.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_char_encoding<br />h5pget_char_encoding_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the character encoding used to create a string. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 11. Datatype access property list 
-        functions (H5P)</b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pset_type_conv_cb<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Sets user-defined datatype conversion callback function.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Pget_type_conv_cb<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Gets user-defined datatype conversion callback function. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-
-
-  
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="Pmodel">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<!-- NEW PAGE -->
-<a name="Pmodel">
-<h3 class=pagebefore>6.4. The Programming Model</h3>
-</a>
- 
-<h4>6.4.1. Introduction</h4>
-
-  <p>The HDF5 Library implements an object-oriented model of datatypes. HDF5 
-  datatypes 
-  are organized as a logical set of base types, or datatype classes. The HDF5 
-  Library manages datatypes as objects. The HDF5 datatype API manipulates the 
-  datatype objects through C function calls. The figure below shows the 
-  abstract view 
-  of the datatype object. The table below shows the methods (C functions) 
-  that operate on datatype objects. New datatypes can be created from 
-  scratch or copied from existing datatypes.</p>
-
-
-<table width="550" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-
-        <table align="center" border="1">
-            <tr>
-                <td valign="middle" align="center"><code>Datatype</code></td>
-                </tr>
-            <tr>
-                <td valign="middle" align="left">
-                <code> size:int?<br />
-                 byteOrder:BOtype</code></td>
-                </tr>
-            <tr>
-                <td valign="middle" align="left">
-                <code> open(hid_t loc, char *, name):return hid_t<br />
-                 copy(hid_t tid) return hid_t<br />
-                 create(hid_class_t clss, size_t size)
-                 return hid_t </code>
-                </td>
-                </tr>
-            </table>
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 5. The datatype object</b>
-        <hr color="green" size="3"/></td></tr>
-</table>
-<br />
-<br />
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 8. General operations on datatype objects</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="50%"><b>API Function</b></td>
-        <td width="50%"><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>hid_t H5Tcreate (H5T_class_t 
-        <i>class</i>, size_t <i>size</i>)</code></td>
-        <td>Create a new datatype object of 
-        datatype class <i>class</i>. The following datatype classes are 
-        supported with this function: 
-        <ul>
-            <li><code>H5T_COMPOUND</code></li>
-            <li><code>H5T_OPAQUE</code> </li>
-            <li><code>H5T_ENUM </code></li>
-        </ul>
-        Other datatypes are created with <code>H5Tcopy()</code>.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>hid_t H5Tcopy (hid_t <i>type</i>)
-        </code></td>
-        <td>Obtain a modifiable transient datatype 
-        which is a copy of <i>type</i>. If <i>type</i> is a dataset 
-        identifier then the type returned is a modifiable transient copy 
-        of the datatype of the specified dataset. </td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>hid_t H5Topen (hid_t <i>location</i>, <br />
-        const char *<i>name</i>, H5P_DEFAULT)</code></td>
-        <td>Open a committed datatype. The 
-        committed datatype returned by this function is read-only.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>htri_t H5Tequal (hid_t <i>type1</i>, <br />
-        hid_t <i>type2</i>)</code></td>
-        <td>Determines if two types are equal. </td>
-        </tr>
-<!-- NEW PAGE -->
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tclose (hid_t <i>type</i>)
-        </code></td>
-        <td>Releases resources associated with a 
-        datatype obtained from <code>H5Tcopy</code>, <code>H5Topen</code>, or 
-        <code>H5Tcreate</code>. It is illegal to close an 
-        immutable transient datatype (e.g., predefined types).</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tcommit (hid_t 
-        <i>location</i>, const char *<i>name</i>, hid_t <i>type</i>, 
-        H5P_DEFAULT, H5P_DEFAULT, <br />H5P_DEFAULT)</code></td>
-        <td>Commit a transient datatype (not immutable) 
-        to a file to become a committed datatype. Committed datatypes can be shared.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>htri_t H5Tcommitted (hid_t 
-        <i>type</i>)</code></td>
-        <td>Test whether the datatype is 
-        transient or committed (named).</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tlock (hid_t 
-        <i>type</i>)</code></td>
-        <td>Make a transient datatype immutable 
-        (read-only and not closable). Predefined types are locked.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-  <p>In order to use a datatype, the object must be created 
-  (<code>H5Tcreate</code>), or a reference obtained by cloning from an 
-  existing type (<code>H5Tcopy</code>), or opened (<code>H5Topen</code>). 
-  In addition, a reference to the datatype of a dataset or attribute 
-  can be obtained with <code>H5Dget_type</code> or 
-  <code>H5Aget_type</code>. For composite datatypes a reference 
-  to the datatype for members or base types can be obtained 
-  (<code>H5Tget_member_type</code>, <code>H5Tget_super</code>). 
-  When the datatype object is no longer needed, the reference is 
-  discarded with <code>H5Tclose</code>. </p>
-
-  <p>Two datatype objects can be tested to see if they are the same with 
-  <code>H5Tequal</code>. This function returns true if the two datatype 
-  references refer to the same datatype object. However, if two datatype 
-  objects define equivalent datatypes (the same datatype class and 
-  datatype properties), they will not be considered ‘equal’.</p>
-  
-  <p>A datatype can be written to the file as a first class object 
-  (<code>H5Tcommit</code>). This is a committed datatype and can be used 
-  in the same way as any other datatype.</p>
-
-
-<h4>6.4.2. Discovery of Datatype Properties</h4>
-  
-  <p>Any HDF5 datatype object can be queried to discover all of its 
-  datatype properties. For each datatype class, there are a set of 
-  API functions to retrieve the datatype properties for this class. </p>
-
-<h4>6.4.2.1. Properties of Atomic Datatypes</h4>
-  
-  <p>Table 9 lists the functions to discover the properties of atomic 
-  datatypes. Table 10 lists the queries relevant to specific numeric 
-  types. Table 11 gives the properties for atomic string datatype, and 
-  Table 12 gives the property of the opaque datatype.</p>
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 9. Functions to discover properties of atomic datatypes</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="50%"><b>Functions</b></td>
-        <td width="50%"><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_class_t H5Tget_class (hid_t 
-        <i>type</i>)</code></td>
-        <td>The datatype class: <code>H5T_INTEGER, 
-        H5T_FLOAT, H5T_STRING, or H5T_BITFIELD, H5T_OPAQUE, 
-        H5T_COMPOUND, H5T_REFERENCE, H5T_ENUM, H5T_VLEN, H5T_ARRAY</code></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>size_t H5Tget_size 
-        (hid_t <i>type</i>)</code></td>
-        <td>The total size of the element in bytes, including padding 
-        which may appear on either side of the actual value.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_order_t H5Tget_order 
-        (hid_t <i>type</i>)</code></td>
-        <td>The byte order describes how the bytes of the datatype are 
-        laid out in memory. If the lowest memory address contains the 
-        least significant byte of the datum then it is 
-        said to be <i>little-endian</i> or <code>H5T_ORDER_LE</code>. If 
-        the bytes are in the opposite order then they are said to be 
-        <i>big-endian</i> or <code>H5T_ORDER_BE.</code></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>size_t H5Tget_precision 
-        (hid_t <i>type</i>)</code></td>
-        <td>The <code>precision</code> property identifies the number 
-        of significant bits of a datatype and the 
-        <code>offset</code> property (defined below) identifies its location. 
-        Some datatypes occupy more bytes than what is needed to store the 
-        value. For instance, a <code>short</code> on a Cray is 32 significant 
-        bits in an eight-byte field.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>int H5Tget_offset (hid_t <i>type</i>)</code></td>
-        <td>The <code>offset</code> property defines the bit location 
-        of the least significant bit of a bit 
-        field whose length is <code>precision</code>.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tget_pad 
-        (hid_t <i>type</i>, H5T_pad_t <i>*lsb</i>, H5T_pad_t 
-        <i>*msb</i>)</code></td>
-        <td>Padding is the bits of a data element 
-        which are not significant as defined by the <code>precision</code> 
-        and <code>offset</code> properties. Padding in the low-numbered 
-        bits is <i>lsb</i> padding and padding in the high-numbered 
-        bits is <i>msb</i> padding. Padding bits can be set to zero 
-        (<code>H5T_PAD_ZERO</code>) or one (<code>H5T_PAD_ONE</code>).</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-<!-- NEW PAGE -->
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 10. Functions to discover properties of atomic 
-        numeric datatypes</b> </td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="50%"><b>Functions</b></td>
-        <td width="50%"><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_sign_t H5Tget_sign 
-        (hid_t <i>type</i>)</code></td>
-        <td><b>(INTEGER)</b> Integer data can be signed two’s 
-        complement (<code>H5T_SGN_2</code>) 
-        or unsigned (<code>H5T_SGN_NONE</code>).</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tget_fields 
-        (hid_t <i>type</i>, size_t *<i>spos</i>, size_t *<i>epos</i>, 
-        size_t *<i>esize</i>, size_t *<i>mpos</i>, 
-        size_t *<i>msize</i>)</code> </td>
-        <td><b>(FLOAT)</b> A floating-point 
-        data element has bit fields which are the exponent and mantissa 
-        as well as a mantissa sign bit. These properties define the 
-        location (bit position of least significant bit of the field) 
-        and size (in bits) of each field. The sign bit is always of 
-        length one and none of the fields are allowed to overlap.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>size_t H5Tget_ebias 
-        (hid_t <i>type</i>)</code></td>
-        <td><b>(FLOAT)</b> The exponent is stored as a non-negative 
-        value which is <code>ebias</code> larger than the true exponent. </td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_norm_t H5Tget_norm 
-        (hid_t <i>type</i>)</code></td>
-        <td><b>(FLOAT)</b> This property describes the normalization 
-        method of the mantissa. 
-        <ul>
-            <li><code>H5T_NORM_MSBSET</code>: the mantissa is shifted left 
-            (if non-zero) until the first bit after the radix point is 
-            set and the exponent is adjusted accordingly. All bits of 
-            the mantissa after the radix point are stored. </li>
-            <li><code>H5T_NORM_IMPLIED</code>: the mantissa is shifted left \ 
-            (if non-zero) until the first bit after the radix point is set 
-            and the exponent is adjusted accordingly. The first bit after 
-            the radix point is not stored since it’s always set. </li>
-            <li><code>H5T_NORM_NONE</code>: the fractional part of the 
-            mantissa is stored without normalizing it. </li>
-        </ul></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_pad_t H5Tget_inpad 
-        (hid_t <i>type</i>)</code></td>
-        <td><b>(FLOAT)</b> If any internal bits (that is, bits between 
-        the sign bit, the mantissa field, and the exponent field but 
-        within the precision field) are unused, then they will be 
-        filled according to the value of this property. The padding can 
-        be: <code>H5T_PAD_NONE</code>, <code>H5T_PAD_ZERO</code> 
-        or <code>H5T_PAD_ONE</code>.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 11. Functions to discover properties of atomic 
-        string datatypes</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="50%"><b>Functions</b></td>
-        <td width="50%"><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_cset_t H5Tget_cset 
-        (hid_t <em>type</em>)</code></td>
-        <td>Two character sets are currently 
-        supported: ASCII (<code>H5T_CSET_ASCII</code>) and UTF-8 
-        (<code>H5T_CSET_UTF8</code>).</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_str_t H5Tget_strpad 
-        (hid_t <em>type</em>)</code></td>
-        <td>The string datatype has a fixed 
-        length, but the string may be shorter than the length. This 
-        property defines the storage mechanism for the left over bytes. 
-        The options are: <code>H5T_STR_NULLTERM</code>, 
-        <code>H5T_STR_NULLPAD</code>, or <code>H5T_STR_SPACEPAD</code>.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 12. Functions to discover properties of atomic opaque 
-        datatypes</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="50%"><b>Functions</b></td>
-        <td  width="50%"><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>char *H5Tget_tag(hid_t type_id)</code></td>
-        <td>A user-defined string.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-<h4><em>6.4.2.2. Properties of Composite Datatypes</em></h4>
-
-  <p>The composite datatype classes can also be analyzed to discover their 
-  datatype properties and the datatypes that are members or base types 
-  of the composite datatype. The member or base type can, in turn, be 
-  analyzed. The table below lists the functions that can access the 
-  datatype properties of the different composite datatypes.</p>
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 13. Functions to discover properties of composite datatypes</b>
-        </td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="50%"><b>Functions</b></td>
-        <td width="50%"><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>int H5Tget_nmembers(hid_t type_id)</code></td>
-        <td><b>(COMPOUND)</b>The number of fields in the compound 
-        datatype.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5T_class_t H5Tget_member_class<br />
-        (hid_t cdtype_id, unsigned member_no)</code></td>
-        <td><b>(COMPOUND)</b> The datatype class of compound datatype 
-        member <code>member_no</code>.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>char * H5Tget_member_name
-        (hid_t type_id, unsigned field_idx)</code></td>
-        <td><b>(COMPOUND)</b> The name of field <code>field_idx</code> 
-        of a compound datatype.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>size_t H5Tget_member_offset
-        (hid_t type_id, unsigned memb_no)</code></td>
-        <td><b>(COMPOUND)</b> The byte offset 
-        of the beginning of a field within a compound datatype.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>hid_t H5Tget_member_type
-        (hid_t type_id, unsigned field_idx)</code></td>
-        <td><b>(COMPOUND)</b> The datatype of the specified member.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>int H5Tget_array_ndims
-        (hid_t adtype_id)</code></td>
-        <td><b>(ARRAY)</b> The number of dimensions (rank) of the array 
-        datatype object.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>int H5Tget_array_dims
-        (hid_t adtype_id, hsize_t *dims[])</code></td>
-        <td><b>(ARRAY)</b> The sizes of the dimensions and the dimension 
-        permutations of the array datatype object.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>hid_t H5Tget_super(hid_t type)
-        </code></td>
-        <td><b>(ARRAY, VL, ENUM)</b>The base datatype from which the 
-        datatype type is derived.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tenum_nameof(hid_t type <br />
-        void *value, char *name, size_t size)</code></td>
-        <td><b>(ENUM)</b> The symbol name 
-        that corresponds to the specified value of the enumeration datatype</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tenum_valueof(hid_t type <br />
-        char *name, void *value)</code></td>
-        <td><b>(ENUM)</b> The value that corresponds to the specified 
-        name of the enumeration datatype</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tget_member_value<br />
-        (hid_t type unsigned memb_no, <br />void *value)</code></td>
-        <td><b>(ENUM)</b> The value of the 
-        enumeration datatype member <code>memb_no</code></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-<!-- NEW PAGE -->
-<h4>6.4.3. Definition of Datatypes</h4>
-  
-  <p>The HDF5 Library enables user programs to create and modify datatypes. The 
-  essential steps are: 
-
-  <ol>
-    <li>a) Create a new datatype object of a specific composite datatype class, 
-      or <br />
-      b) Copy an existing atomic datatype object</li>
-    <li>Set properties of the datatype object</li>
-    <li>Use the datatype object</li>
-    <li>Close the datatype object</li>
-  </ol>
-  
-  <p>To create a user-defined atomic datatype, the procedure is to clone 
-    a predefined datatype of the appropriate datatype class 
-    (<code>H5Tcopy</code>), and then set the datatype properties appropriate 
-    to the datatype class. The table below shows how to create a datatype 
-    to describe a 1024-bit unsigned integer.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  hid_t new_type = H5Tcopy (H5T_NATIVE_INT);
-  H5Tset_precision(new_type, 1024);
-  H5Tset_sign(new_type, H5T_SGN_NONE);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 5. Create a new datatype</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-  
-  <p>Composite datatypes are created with a specific API call for each datatype 
-  class. The table below shows the creation method for each datatype class. A 
-  newly created 
-  datatype cannot be used until the datatype properties are set. For example, 
-  a newly created compound datatype has no members and cannot be used.</p>
-
-
-
-<table width="400" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 14. Functions to create each datatype class</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="50%"><b>Datatype Class</b></td>
-        <td width="50%"><b>Function to Create</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>COMPOUND</td>
-        <td><code>H5Tcreate</code></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>OPAQUE</td>
-        <td><code>H5Tcreate</code></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>ENUM</td>
-        <td><code>H5Tenum_create</code></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>ARRAY</td>
-        <td><code>H5Tarray_create</code></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>VL</td>
-        <td><code>H5Tvlen_create</code></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-  <p>Once the datatype is created and the datatype properties set, the datatype 
-  object can be used. </p>
-  
-  <p>Predefined datatypes are defined by the library during initialization 
-  using the same mechanisms as described here. Each predefined datatype is 
-  locked (<code>H5Tlock</code>), so that it cannot be changed or destroyed. 
-  User-defined datatypes may also be locked using <code>H5Tlock</code>. </p>
-
-<!-- NEW PAGE -->
-<h4><em>6.4.3.1. User-defined Atomic Datatypes</em></h4>
-  
-  <p>Table 15 summarizes the API methods that set properties of atomic 
-  types. Table 16 shows properties specific to numeric types, Table 17 
-  shows properties specific to the string datatype class. Note that 
-  offset, pad, etc. do not apply to strings. Table 18 shows the specific 
-  property of the OPAQUE datatype class.</p>
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 15. API methods that set properties of atomic datatypes</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="50%"><b>Functions</b></td>
-        <td width="50%"><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tset_size (hid_t <i>type</i>, 
-        <br />size_t <i>size</i>)</code></td>
-        <td>Set the total size of the element 
-        in bytes. This includes padding which may appear on either side of the 
-        actual value. If this property is reset to a smaller value which 
-        would cause the significant part of the data to extend beyond the 
-        edge of the datatype, then the offset property is decremented a 
-        bit at a time. If the offset reaches zero and the significant 
-        part of the data still extends beyond the edge of the datatype 
-        then the precision property is decremented a bit at a time. 
-        Decreasing the size of a datatype may fail if the 
-        <code>H5T_FLOAT</code> bit fields would extend beyond the significant 
-        part of the type. </td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tset_order 
-        (hid_t <i>type</i>, H5T_order_t <i>order</i>)</code></td>
-         <td>Set the byte order to little-endian 
-        (<code>H5T_ORDER_LE</code>) or big-endian (<code>H5T_ORDER_BE</code>).</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tset_precision 
-        (hid_t <i>type</i>, size_t <i>precision</i>)</code></td>
-        <td>Set the number of significant bits 
-        of a datatype. The <code>offset</code> property (defined below) 
-        identifies its location. The size property defined above represents 
-        the entire size (in bytes) of the datatype. If the precision is 
-        decreased then padding bits are inserted on the MSB side of the 
-        significant bits (this will fail for <code>H5T_FLOAT</code> types 
-        if it results in the sign, mantissa, or exponent bit field extending 
-        beyond the edge of the significant bit field). On the other hand, 
-        if the precision is increased so that it “hangs over” 
-        the edge of the total size then the offset property is decremented 
-        a bit at a time. If the offset reaches zero and the significant 
-        bits still hang over the edge, then the total size is increased 
-        a byte at a time. </td>
-        </tr>
-<!-- NEW PAGE -->
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tset_offset 
-        (hid_t <i>type</i>, size_t <i>offset</i>)</code></td>
-        <td>Set the bit location of the least 
-        significant bit of a bit field whose length is <code>precision</code>. 
-        The bits of the entire data are numbered beginning at zero at the 
-        least significant bit of the least significant byte (the byte at 
-        the lowest memory address for a little-endian type or the byte 
-        at the highest address for a big-endian type). The offset property 
-        defines the bit location of the least significant bit of a bit field 
-        whose length is precision. If the offset is increased so the 
-        significant bits “hang over” the edge of the datum, then 
-        the size property is automatically incremented.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tset_pad (hid_t 
-        <i>type</i>, H5T_pad_t <i>lsb</i>, H5T_pad_t <i>msb</i>)</code></td>
-        <td>Set the padding to zeros 
-        (<code>H5T_PAD_ZERO</code>) or ones (<code>H5T_PAD_ONE</code>). Padding 
-        is the bits of a data element which are not significant as defined 
-        by the <code>precision</code> and <code>offset</code> properties. 
-        Padding in the low-numbered bits is <code><i>lsb</i></code> 
-        padding and padding in the high-numbered bits is 
-        <code><i>msb</i></code> padding. </td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-<!-- NEW PAGE -->
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 16. API methods that set properties of numeric datatypes</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="50%"><b>Functions</b></td>
-        <td width="50%"><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tset_sign 
-        (hid_t <i>type</i>, H5T_sign_t <i>sign</i>)</code></td>
-        <td><b>(INTEGER)</b> Integer 
-        data can be signed two’s complement (<code>H5T_SGN_2</code>) 
-        or unsigned (<code>H5T_SGN_NONE</code>).</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tset_fields 
-        (hid_t <i>type</i>, size_t <i>spos</i>, size_t <i>epos</i>, 
-        size_t <i>esize</i>, size_t <i>mpos</i>, size_t <i>msize</i>)
-        </code></td>
-        <td><b>(FLOAT)</b> Set the 
-        properties define the location (bit position of least significant 
-        bit of the field) and size (in bits) of each field. The sign bit 
-        is always of length one and none of the fields are allowed to overlap.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tset_ebias (hid_t <i>type</i>, 
-        size_t <i>ebias</i>)</code></td>
-        <td><b>(FLOAT)</b> The exponent 
-        is stored as a non-negative value which is <code>ebias</code> larger 
-        than the true exponent.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tset_norm 
-        (hid_t <i>type</i>, H5T_norm_t <i>norm</i>)</code></td>
-        <td><b>(FLOAT)</b> This 
-        property describes the normalization method of the mantissa. 
-        <ul>
-            <li><code>H5T_NORM_MSBSET</code>: the mantissa is shifted left 
-            (if non-zero) until the first bit after the radix point is set and 
-            the exponent is adjusted accordingly. All bits of the mantissa 
-            after the radix point are stored. </li>
-            <li><code>H5T_NORM_IMPLIED</code>: the mantissa is shifted left 
-            (if non-zero) until the first bit after the radix point is set and 
-            the exponent is adjusted accordingly. The first bit after the 
-            radix point is not stored since it is always set. </li>
-            <li><code>H5T_NORM_NONE</code>: the fractional part of the 
-            mantissa is stored without normalizing it. </li></ul></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tset_inpad 
-        (hid_t <i>type</i>, H5T_pad_t <i>inpad</i>)</code></td>
-        <td><b>(FLOAT)</b> If any 
-        internal bits (that is, bits between the sign bit, the mantissa field, 
-        and the exponent field but within the precision field) are unused, 
-        then they will be filled according to the value of this property. 
-        The padding can be: <code>H5T_PAD_NONE</code>, <code>H5T_PAD_ZERO</code> 
-        or <code>H5T_PAD_ONE</code>.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-<!-- NEW PAGE -->
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 17. API methods that set properties of string datatypes</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="50%"><b>Functions</b></td>
-        <td width="50%"><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tset_size (hid_t <i>type</i>, 
-        <br />size_t <i>size</i>)</code></td>
-        <td>Set the length of the string, in bytes. 
-        The precision is automatically set to 8*<code>size</code>.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tset_precision 
-        (hid_t <i>type</i>, size_t <i>precision</i>)</code></td>
-        <td>The precision must be a multiple of 8.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tset_cset
-        (hid_t type_id, H5T_cset_t cset )</code></td>
-        <td>Two character sets are currently 
-        supported: ASCII (<code>H5T_CSET_ASCII</code>) and UTF-8 
-        (<code>H5T_CSET_UTF8</code>).</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tset_strpad
-        (hid_t type_id, H5T_str_t strpad )</code></td>
-        <td>The string datatype has a fixed 
-        length, but the string may be shorter than the length. This property 
-        defines the storage mechanism for the left over bytes. The method 
-        used to store character strings differs with the programming language: 
-        <ul>
-            <li>C usually null terminates strings </li>
-            <li>Fortran left-justifies and space-pads strings</li>
-        </ul>
-        <p>Valid string padding values, as passed in the parameter strpad, 
-        are as follows: </p>
-        <dl>
-            <dt><code>H5T_STR_NULLTERM</code> (0) 
-            <dd>Null terminate (as C does) 
-            <dt><code>H5T_STR_NULLPAD</code> (1) 
-            <dd>Pad with zeros 
-            <dt><code>H5T_STR_SPACEPAD</code> (2) 
-            <dd>Pad with spaces (as FORTRAN does).
-            </dl></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 18. API methods that set properties of opaque datatypes</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="50%"><b>Functions</b></td>
-        <td width="50%"><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tset_tag (hid_t type_id 
-        <br />const char *tag )</code></td>
-        <td>Tags the opaque datatype type_id 
-        with an ASCII identifier tag.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-<!-- NEW PAGE -->
-<h4>Examples</h4>
-  
-  <p>The example below shows how to create a 128-bit little-endian signed 
-  integer type. Increasing the precision of a type automatically increases 
-  the total size. Note that the proper procedure is to begin from a type 
-  of the intended datatype class which in this case is a 
-  <code>NATIVE INT</code>.</p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  hid_t new_type = H5Tcopy (H5T_NATIVE_INT);
-  H5Tset_precision (new_type, 128);
-  H5Tset_order (new_type, H5T_ORDER_LE);</pre> </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 6. Create a new 128-bit little-endian signed integer 
-        datatype</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-  <p>The figure below shows the storage layout as the type is defined. The 
-  <code>H5Tcopy</code> creates a datatype that is the same as 
-  <code>H5T_NATIVE_INT</code>. In this example, suppose this is a 32-bit 
-  big-endian number (Figure a). The precision is set to 128 bits, 
-  which automatically extends the size to 8 bytes (Figure b). Finally, 
-  the byte order is set to little-endian (Figure c).</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <table align="center" border="0" width="100%">
-        <tr><td>
-
-        <table border="1" align="left">
-            <tr>
-                <td valign="middle" align="center"><code>Byte 0</code></td>
-                <td valign="middle" align="center"><code>Byte 1</code></td>
-                <td valign="middle" align="center"><code>Byte 2</code></td>
-                <td valign="middle" align="center"><code>Byte 3</code></td>
-                </tr>
-            <tr>
-                <td valign="middle" align="center"><code>01234567</code></td>
-                <td valign="middle" align="center"><code>89012345</code></td>
-                <td valign="middle" align="center"><code>67890123</code></td>
-                <td valign="middle" align="center"><code>45678901</code></td>
-                </tr>
-                </table>
-
-        </td></tr>
-        <tr><td>
-        
-        <table border="0" align="left">
-            <tr>
-            <td>a) The <code>H5T_NATIVE_INT</code> datatype<br /> </td></tr>
-            </table>
-
-        </td></tr>
-        <tr><td>
-      
-        <table border="1" align="left">
-            <tr>
-            <td valign="middle" align="center"><code>Byte 0</code></td>
-            <td valign="middle" align="center"><code>Byte 1</code></td>
-            <td valign="middle" align="center"><code>Byte 2</code></td>
-            <td valign="middle" align="center"><code>Byte 3</code></td>
-            <td valign="middle" align="center"><code>Byte 4</code></td>
-            <td valign="middle" align="center"><code>Byte 5</code></td>
-            <td valign="middle" align="center"><code>Byte 6</code></td>
-            <td valign="middle" align="center"><code>Byte 7</code></td>
-            </tr>
-            <tr>
-            <td valign="middle" align="center"><code>01234567</code></td>
-            <td valign="middle" align="center"><code>89012345</code></td>
-            <td valign="middle" align="center"><code>67890123</code></td>
-            <td valign="middle" align="center"><code>45678901</code></td>
-            <td valign="middle" align="center"><code>23456789</code></td>
-            <td valign="middle" align="center"><code>01234567</code></td>
-            <td valign="middle" align="center"><code>89012345</code></td>
-            <td valign="middle" align="center"><code>67890123</code></td>
-            </tr>	
-            </table>
-
-        </td></tr>
-        <tr><td>
-	  
-        <table border="0" align="left">
-            <tr>
-            <td>b) Precision is extended to 128-bits, and the size is 
-            automatically adjusted.<br /> </td></tr>
-            </table>
-
-        </td></tr>
-        <tr><td>
-
-        <table border="1" align="left">
-            <tr>
-            <td valign="middle" align="center"><code>Byte 0</code></td>
-            <td valign="middle" align="center"><code>Byte 1</code></td>
-            <td valign="middle" align="center"><code>Byte 2</code></td>
-            <td valign="middle" align="center"><code>Byte 3</code></td>
-            <td valign="middle" align="center"><code>Byte 4</code></td>
-            <td valign="middle" align="center"><code>Byte 5</code></td>
-            <td valign="middle" align="center"><code>Byte 6</code></td>
-            <td valign="middle" align="center"><code>Byte 7</code></td>
-            </tr>
-            <tr>
-            <td valign="middle" align="center"><code>01234567</code></td>
-            <td valign="middle" align="center"><code>89012345</code></td>
-            <td valign="middle" align="center"><code>67890123</code></td>
-            <td valign="middle" align="center"><code>45678901</code></td>
-            <td valign="middle" align="center"><code>23456789</code></td>
-            <td valign="middle" align="center"><code>01234567</code></td>
-            <td valign="middle" align="center"><code>89012345</code></td>
-            <td valign="middle" align="center"><code>67890123</code></td>
-            </tr>
-            </table>
-
-        </td></tr>
-        <tr><td>
-
-        <table border="0" align="left">
-            <tr><td>c) The byte order is switched.</td></tr>
-            </table>
-        </td></tr>
-        </table>
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 6. The storage layout for a new 128-bit little-endian 
-        signed integer datatype</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>The significant bits of a data element can be offset from the beginning of 
-  the memory for that element by an amount of padding. The <code>offset</code> 
-  property specifies the number of bits of padding that appear to the 
-  “right of” the value. The table and figure below show how 
-  a 32-bit unsigned integer with 16-bits of precision having the value 
-  <code>0x1122</code> will be laid out in memory.</p>
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="5" align="left" valign="bottom">
-        <b>Table 19. Memory Layout for a 32-bit unsigned integer</b></td>
-        </tr>
-    <tr><td colspan="5"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td><b>Byte Position</b></td>
-        <td><b>Big-Endian <br />Offset=0</b></td>
-        <td><b>Big-Endian <br />Offset=16</b></td>
-        <td><b>Little-Endian <br />Offset=0</b></td>
-        <td><b>Little-Endian <br />Offset=16</b></td>
-    <tr><td colspan="5"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>0:</td>
-        <td>[pad]</td>
-        <td>[0x11]</td>
-        <td>[0x22]</td>
-        <td>[pad]</td>
-        </tr>
-    <tr><td colspan="5"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>1:</td>
-        <td>[pad]</td>
-        <td>[0x22]</td>
-        <td>[0x11]</td>
-        <td>[pad]</td>
-        </tr>
-    <tr><td colspan="5"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>2:</td>
-        <td>[0x11]</td>
-        <td>[pad]</td>
-        <td>[pad]</td>
-        <td>[0x22]</td>
-        </tr>
-    <tr><td colspan="5"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>3:</td>
-        <td>[0x22]</td>
-        <td>[pad]</td>
-        <td>[pad]</td>
-        <td>[0x11]</td>
-        </tr>
-    <tr><td colspan="5"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-<table width="400" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-
-    <table align="center" border="0" width="100%">
-        <tr>
-        <td valign="middle" align="center">Big-Endian: Offset = 0</td>
-        </tr>
-        <tr><td>
-
-        <table border="1" align="center">
-            <tr>
-            <td valign="middle" align="center"><code>Byte 0</code></td>
-            <td valign="middle" align="center"><code>Byte 1</code></td>
-            <td valign="middle" align="center"><code>Byte 2</code></td>
-            <td valign="middle" align="center"><code>Byte 3</code></td>
-            </tr>
-            <tr>
-            <td valign="middle" align="center"><code>01234567</code></td>
-            <td valign="middle" align="center"><code>89012345</code></td>
-            <td valign="middle" align="center"><code>67890123</code></td>
-            <td valign="middle" align="center"><code>45678901</code></td>
-            </tr>
-            <tr>
-            <td valign="middle" align="center"><code><em>PPPPPPPP</em></code></td>
-            <td valign="middle" align="center"><code><em>PPPPPPPP</em></code></td>
-            <td valign="middle" align="center"><code>00010001</code></td>
-            <td valign="middle" align="center"><code>00100010</code></td>
-            </tr>
-            </table>
-
-            </td></tr>
-        <tr>
-            <td valign="middle" align="center"> <br />Big-Endian: Offset = 16</td>
-            </tr>
-        <tr>
-            <td>
-      
-        <table border="1" align="center">
-            <tr>
-            <td valign="middle" align="center"><code>Byte 0</code></td>
-            <td valign="middle" align="center"><code>Byte 1</code></td>
-            <td valign="middle" align="center"><code>Byte 2</code></td>
-            <td valign="middle" align="center"><code>Byte 3</code></td>
-            </tr>
-            <tr>
-            <td valign="middle" align="center"><code>01234567</code></td>
-            <td valign="middle" align="center"><code>89012345</code></td>
-            <td valign="middle" align="center"><code>67890123</code></td>
-            <td valign="middle" align="center"><code>45678901</code></td>
-            </tr>
-            <tr>
-            <td valign="middle" align="center"><code>00010001</code></td>
-            <td valign="middle" align="center"><code>00100010</code></td>
-            <td valign="middle" align="center"><code><em>PPPPPPPP</em></code></td>
-            <td valign="middle" align="center"><code><em>PPPPPPPP</em></code></td>
-            </tr>	
-            </table>
-
-            </td></tr>
-        <tr>
-            <td valign="middle" align="center"> <br />Little-Endian: 
-            Offset = 0</td>
-            </tr>
-
-        <tr>
-            <td>
-
-        <table border="1" align="center">
-            <tr>
-            <td valign="middle" align="center"><code>Byte 0</code></td>
-            <td valign="middle" align="center"><code>Byte 1</code></td>
-            <td valign="middle" align="center"><code>Byte 2</code></td>
-            <td valign="middle" align="center"><code>Byte 3</code></td>
-            </tr>
-            <tr>
-            <td valign="middle" align="center"><code>01234567</code></td>
-            <td valign="middle" align="center"><code>89012345</code></td>
-            <td valign="middle" align="center"><code>67890123</code></td>
-            <td valign="middle" align="center"><code>45678901</code></td>
-            </tr>
-            <tr>
-            <td valign="middle" align="center"><code>00010001</code></td>
-            <td valign="middle" align="center"><code>00100010</code></td>
-            <td valign="middle" align="center"><code><em>PPPPPPPP</em></code></td>
-            <td valign="middle" align="center"><code><em>PPPPPPPP</em></code></td>
-            </tr>	
-            </table>
-
-            </td></tr>
-        <tr>
-            <td valign="middle" align="center"> <br />Little-Endian: 
-            Offset = 16</td>
-            </tr>
-        <tr>
-            <td>
-        <table border="1" align="center">
-            <tr>
-            <td valign="middle" align="center"><code>Byte 0</code></td>
-            <td valign="middle" align="center"><code>Byte 1</code></td>
-            <td valign="middle" align="center"><code>Byte 2</code></td>
-            <td valign="middle" align="center"><code>Byte 3</code></td>
-            </tr>
-            <tr>
-            <td valign="middle" align="center"><code>01234567</code></td>
-            <td valign="middle" align="center"><code>89012345</code></td>
-            <td valign="middle" align="center"><code>67890123</code></td>
-            <td valign="middle" align="center"><code>45678901</code></td>
-            </tr>
-            <tr>
-            <td valign="middle" align="center"><code><em>PPPPPPPP</em></code></td>
-            <td valign="middle" align="center"><code><em>PPPPPPPP</em></code></td>
-            <td valign="middle" align="center"><code>00010001</code></td>
-            <td valign="middle" align="center"><code>00100010</code></td>
-            </tr>
-            </table>
-
-            </td></tr>	  
-        </table> 
-
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 7. Memory Layout for a 32-bit unsigned integer</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>If the offset is incremented then the total size is incremented also 
-  if necessary to prevent significant bits of the value from hanging over 
-  the edge of the datatype. </p>
-  
-  <p>The bits of the entire data are numbered beginning at zero at the 
-  least significant bit of the least significant byte (the byte at the 
-  lowest memory address for a little-endian type or the byte at the 
-  highest address for a big-endian type). The <code>offset</code> 
-  property defines the bit location of the least signficant bit of a 
-  bit field whose length is <code>precision</code>. If the offset is 
-  increased so the significant bits “hang over” the edge 
-  of the datum, then the <code>size</code> property is automatically 
-  incremented. </p>
-  
-
-  <p>To illustrate the properties of the integer datatype class, the example 
-  below shows how to create a user-defined datatype that describes a 
-  24-bit signed integer that starts on the third bit of a 32-bit word. 
-  The datatype is specialized from a 32-bit integer, the <em>precision</em> 
-  is set to 24 bits, and the <em>offset</em> is set to 3.</p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  hid_t dt;
-
-  dt = H5Tcopy(H5T_SDT_I32LE);
-
-  H5Tset_precision(dt, 24);
-  H5Tset_offset(dt,3);
-  H5Tset_pad(dt, H5T_PAD_ZERO, H5T_PAD_ONE);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 7. A user-defined datatype with a 24-bit signed integer</b> 
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>The figure below shows the storage layout for a data element. Note that 
-  the unused bits in the offset will be set to zero and the unused bits at 
-  the end will be 
-  set to one, as specified in the <code>H5Tset_pad</code> call.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <br />
-    <table border="1" align="center" width="67%">
-        <tr>
-            <td valign="middle" align="center"><code>Byte 0</code></td>
-            <td valign="middle" align="center"><code>Byte 1</code></td>
-            <td valign="middle" align="center"><code>Byte 2</code></td>
-            <td valign="middle" align="center"><code>Byte 3</code></td>
-            </tr>
-        <tr>
-            <td valign="middle" align="center"><code>01234567</code></td>
-            <td valign="middle" align="center"><code>89012345</code></td>
-            <td valign="middle" align="center"><code>67890123</code></td>
-            <td valign="middle" align="center"><code>45678901</code></td>
-            </tr>
-        <tr>
-            <td valign="middle" align="center"><code><strong><em>ooo</em></strong>00000</code></td>
-            <td valign="middle" align="center"><code>00000000</code></td>
-            <td valign="middle" align="center"><code>00000000</code></td>
-            <td valign="middle" align="center"><code>00s<strong><em>ppppp</em></strong></code></td>
-            </tr>
-        <tr>
-            <td valign="middle" align="center" colspan="4">
-            <img src="Images/Dtypes_fig14.JPG">
-            </td>
-            </tr>
-        </table>
-        <br />
-        <tr><td>
-        </td>
-        </tr>
-  
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 8. A user-defined integer datatype a range of -1,048,583 
-        to 1,048,584</b>
-        <hr color="green" size="3"/></td>
-  </tr>
-</table>
-<br />
-
-
-
-  <p>To illustrate a user-defined floating point number, the example below 
-  shows how to create a 24-bit floating point number that starts 5 bits 
-  into a 4 byte word. The floating point number is defined to have a 
-  mantissa of 19 bits (bits 5-23), an exponent of 3 bits (25-27), and 
-  the sign bit is bit 28. (Note that this is an illustration of what 
-  can be done and is not necessarily a floating point format that a 
-  user would require.)</p>
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  hid_t dt;
-
-  dt = H5Tcopy(H5T_IEEE_F32LE);
-
-  H5Tset_precision(dt, 24);
-  H5Tset_fields (dt, 28, 25, 3, 5, 19);
-  H5Tset_pad(dt, H5T_PAD_ZERO, H5T_PAD_ONE);
-  H5Tset_inpad(dt, H5T_PAD_ZERO);</pre> </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 8. A user-defined 24-bit floating point datatype</b>
-        <hr color="green" size="3"/></td>
-  </tr>
-</table>
-<br />
-<br />
-
-
-
-<table width="500" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-
-        <table border="1" align="center" width="67%">
-            <tr>
-            <td valign="middle" align="center"><code>Byte 0</code></td>
-            <td valign="middle" align="center"><code>Byte 1</code></td>
-            <td valign="middle" align="center"><code>Byte 2</code></td>
-            <td valign="middle" align="center"><code>Byte 3</code></td>
-            </tr>
-            <tr>
-            <td valign="middle" align="center"><code>01234567</code></td>
-            <td valign="middle" align="center"><code>89012345</code></td>
-            <td valign="middle" align="center"><code>67890123</code></td>
-            <td valign="middle" align="center"><code>45678901</code></td>
-            </tr>
-            <tr>
-            <td valign="middle" align="center"><code><strong><em>ooooo</em>
-                </strong>mmm</code></td>
-            <td valign="middle" align="center"><code>mmmmmmmm</code></td>
-            <td valign="middle" align="center"><code>mmmmmmmm</code></td>
-            <td valign="middle" align="center"><code><strong>i</strong>eees<strong>
-                <em>ppp</em></strong></code></td>
-            </tr>
-            <tr>
-            <td valign="middle" align="center" colspan="4">
-            <img src="Images/Dtypes_fig16.JPG">
-            </td>
-            </tr>
-            </table>
-
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 9. A user-defined floating point datatype</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  
-  <p>The figure above shows the storage layout of a data element for this 
-  datatype. Note that there is an unused bit (24) between the mantissa and 
-  the exponent. This bit is filled with the <em>inpad</em> value which 
-  in this case is 0. </p>
-  
-  <p>The sign bit is always of length one and none of the fields are allowed 
-  to overlap. When expanding a floating-point type one should set the 
-  precision first; when decreasing the size one should set the field 
-  positions and sizes first. </p>
-
-<h4>6.4.3.2. Composite Datatypes</h4>
-  
-  <p>All composite datatypes must be user-defined; 
-    there are no predefined composite datatypes. </p>
-
-<h4>6.4.3.2.1. Compound Datatypes</h4>
-
-  <p>The subsections below describe how to create a compound datatype 
-    and how to write and read data of a compound datatype.
-
-<h4>6.4.3.2.1.1. Defining Compound Datatypes</h4>
-  
-  <p>Compound datatypes are conceptually similar to a C struct or 
-    Fortran derived types. The compound datatype defines a contiguous 
-    sequence of bytes, which are formatted using one up to 2^16 datatypes 
-    (members). A compound datatype may have any number of members, in 
-    any order, and the members may have any datatype, including compound. 
-    Thus, complex nested compound datatypes can be created. The total 
-    size of the compound datatype is greater than or equal to the sum 
-    of the size of its members, up to a maximum of 2^32 bytes. HDF5 does 
-    not support datatypes with distinguished records or the equivalent 
-    of C unions or Fortran EQUIVALENCE statements.</p>
-  
-  <p>Usually a C struct or Fortran derived type will be defined to hold 
-    a data point in memory, and the offsets of the members in memory will 
-    be the offsets of the struct members from the beginning of an instance 
-    of the struct. The HDF5 C library provides a macro 
-    <code>HOFFSET (s,m)</code> to calculate the member’s offset. The HDF5 
-    Fortran applications have to calculate offsets by using sizes of members 
-    datatypes and by taking in consideration the order of members in the 
-    Fortran derived type.</p>
-    
-<dl>
-<dt><code>HOFFSET(s,m)</code>
-  <dd>This macro computes the offset of member <em>m</em> within a struct 
-    <em>s</em></dd>
-<dt><code>offsetof(s,m)</code>
-  <dd>This macro defined in <code>stddef.h</code> does exactly the same 
-    thing as the <code>HOFFSET()</code> macro.</dd>
-</dl>
-    
-  <p><em>Note for Fortran users</em>: Offsets of Fortran structure members 
-    correspond to the offsets within a packed datatype (see explanation below) 
-    stored in an HDF5 file.</p>
-    
-  <p>Each member of a compound datatype must have a descriptive name which 
-    is the key used to uniquely identify the member within the compound 
-    datatype. A member name in an HDF5 datatype does not necessarily have 
-    to be the same as the name of the member in the C struct or Fortran 
-    derived type, although this is often the case. Nor does one need to 
-    define all members of the C struct or Fortran derived type in the HDF5 
-    compound datatype (or vice versa).</p>
-    
-  <p>Unlike atomic datatypes which are derived from other atomic datatypes, 
-    compound datatypes are created from scratch. First, one creates an empty 
-    compound datatype and specifies its total size. Then members are added to 
-    the compound datatype in any order. Each member type is inserted at a 
-    designated offset. Each member has a name which is the key used to uniquely 
-    identify the member within the compound datatype.</p>
-    
-  <p>The example below shows a way of creating an HDF5 C compound datatype to 
-    describe a complex number. This is a structure with two components, 
-    “real” and “imaginary”, and each component 
-    is a double. An equivalent C struct whose type is defined by the 
-    <code>complex_t</code> struct is shown.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  typedef struct {
-      double re;   /*real part*/
-      double im;   /*imaginary part*/
-   } complex_t;
-
-   hid_t complex_id = H5Tcreate (H5T_COMPOUND, sizeof (complex_t));
-   H5Tinsert (complex_id, “real”, HOFFSET(complex_t,re),
-            H5T_NATIVE_DOUBLE);
-   H5Tinsert (complex_id, “imaginary”, HOFFSET(complex_t,im),
-            H5T_NATIVE_DOUBLE);</pre> </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 9. A compound datatype for complex numbers in C</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>The example below shows a way of creating an HDF5 Fortran compound 
-  datatype to describe a complex number. This is a Fortran derived type 
-  with two components, “real” and “imaginary”, 
-  and each component is DOUBLE PRECISION. An equivalent Fortran TYPE 
-    whose type is defined by the TYPE <code>complex_t</code> is shown.</p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  TYPE complex_t
-     DOUBLE PRECISION re   ! real part
-     DOUBLE PRECISION im;  ! imaginary part
-  END TYPE complex_t
-
-  CALL h5tget_size_f(H5T_NATIVE_DOUBLE, re_size, error)
-  CALL h5tget_size_f(H5T_NATIVE_DOUBLE, im_size, error)
-  complex_t_size = re_size + im_size
-  CALL h5tcreate_f(H5T_COMPOUND_F, complex_t_size, type_id)
-  offset = 0
-  CALL h5tinsert_f(type_id, “real”, offset, H5T_NATIVE_DOUBLE, error)
-  offset = offset + re_size
-  CALL h5tinsert_f(type_id, “imaginary”, offset, H5T_NATIVE_DOUBLE, error)</pre> </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 10. A compound datatype for complex numbers in Fortran</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p><em>Important Note</em>: The compound datatype is created with a size 
-    sufficient to hold all its members. In the C example above, the size of 
-    the C struct and the <code>HOFFSET</code> macro are used as a convenient 
-    mechanism to determine the appropriate size and offset. Alternatively, the 
-    size and offset could be manually determined: the size can be set to 
-    16 with “real” at offset 0 and “imaginary” at 
-    offset 8. However, different platforms and compilers have different 
-    sizes for “double” and may have alignment restrictions 
-    which require additional padding within the structure. It is much 
-    more portable to use the <code>HOFFSET</code> macro which assures 
-    that the values will be correct for any platform.</p>
-  
-  <p>The figure below shows how the compound datatype would be laid out 
-  assuming that <code>NATIVE_DOUBLE</code> are 64-bit numbers and that 
-  there are no alignment requirements. The total size of the compound 
-  datatype will be 16 bytes, the “real” component will 
-  start at byte 0, and “imaginary” will start at byte 8.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-
-      <table border="1" align="center" width="550">
-	    <tr>
-		  <td valign="top" align="right" rowspan="4" width="150">
-		    <img src="Images/Dtypes_fig18_a.jpg">
-		  </td>
-	      <td valign="middle" align="center" width="100"><code>Byte 0</code></td>
-		  <td valign="middle" align="center" width="100"><code>Byte 1</code></td>
-		  <td valign="middle" align="center" width="100"><code>Byte 2</code></td>
-		  <td valign="middle" align="center" width="100"><code>Byte 3</code></td>
-	</tr>
-		<tr>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		</tr>
-	    <tr>
-	      <td valign="middle" align="center"><code>Byte 4</code></td>
-		  <td valign="middle" align="center"><code>Byte 5</code></td>
-		  <td valign="middle" align="center"><code>Byte 6</code></td>
-		  <td valign="middle" align="center"><code>Byte 7</code></td>
-	</tr>
-		<tr>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		</tr>
-	    <tr>
-		  <td valign="top" align="right" rowspan="4" width="150">
-		    <img src="Images/Dtypes_fig18_b.jpg">
-	      </td>
-	      <td valign="middle" align="center"><code>Byte 8</code></td>
-		  <td valign="middle" align="center"><code>Byte 9</code></td>
-		  <td valign="middle" align="center"><code>Byte 10</code></td>
-		  <td valign="middle" align="center"><code>Byte 11</code></td>
-	</tr>
-		<tr>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		</tr>
-	    <tr>
-	      <td valign="middle" align="center"><code>Byte 12</code></td>
-		  <td valign="middle" align="center"><code>Byte 13</code></td>
-		  <td valign="middle" align="center"><code>Byte 14</code></td>
-		  <td valign="middle" align="center"><code>Byte 15</code></td>
-	</tr>
-		<tr>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		</tr>
-      </table>
-	  
-	  <table align="center" border="0" width="550">
-        <tr>
-		  <td valign="top" align="right" width="150"> </td>
-		  <td valign="top" align="left" colspan="4">Total size of 
-          compound datatype is 16 bytes</td>
-	    </tr>
-	  </table>
-	  
-    </td>
-  </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 10. Layout of a compound datatype</b>
-        <hr color="green" size="3"/></td>
-  </tr>
-</table>
-<br />
-
-
-
-  <p>The members of a compound datatype may be any HDF5 datatype 
-    including the compound, array, and variable-length (VL) types. The 
-    figure and example below show the memory layout and code 
-    which creates a compound datatype composed of two complex 
-    values, and each complex value is also a compound datatype as in the 
-    figure above.</p>
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-
-	  <table border="1" align="center" width="550">
-	    <tr>
-		  <td valign="top" align="right" rowspan="4" width="150">
-		  <img src="Images/Dtypes_fig19_a.jpg">
-		  </td>
-	      <td valign="middle" align="center" width="100"><code>Byte 0</code></td>
-		  <td valign="middle" align="center" width="100"><code>Byte 1</code></td>
-		  <td valign="middle" align="center" width="100"><code>Byte 2</code></td>
-		  <td valign="middle" align="center" width="100"><code>Byte 3</code></td>
-	    </tr>
-		<tr>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		</tr>
-	    <tr>
-	      <td valign="middle" align="center"><code>Byte 4</code></td>
-		  <td valign="middle" align="center"><code>Byte 5</code></td>
-		  <td valign="middle" align="center"><code>Byte 6</code></td>
-		  <td valign="middle" align="center"><code>Byte 7</code></td>
-	    </tr>
-		<tr>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		</tr>
-	    <tr>
-		  <td valign="top" align="right" rowspan="4">
-		  <img src="Images/Dtypes_fig19_b.jpg" align="middle">
-		  </td>
-	      <td valign="middle" align="center"><code>Byte 8</code></td>
-		  <td valign="middle" align="center"><code>Byte 9</code></td>
-		  <td valign="middle" align="center"><code>Byte 10</code></td>
-		  <td valign="middle" align="center"><code>Byte 11</code></td>
-	    </tr>
-		<tr>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		</tr>
-	    <tr>
-	      <td valign="middle" align="center"><code>Byte 12</code></td>
-		  <td valign="middle" align="center"><code>Byte 13</code></td>
-		  <td valign="middle" align="center"><code>Byte 14</code></td>
-		  <td valign="middle" align="center"><code>Byte 15</code></td>
-	    </tr>
-		<tr>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		</tr>
-	    <tr>
-		  <td valign="top" align="right" rowspan="4">
-		  <img src="Images/Dtypes_fig19_c.jpg"></td>
-	      <td valign="middle" align="center" width="100"><code>Byte 16</code></td>
-		  <td valign="middle" align="center" width="100"><code>Byte 17</code></td>
-		  <td valign="middle" align="center" width="100"><code>Byte 18</code></td>
-		  <td valign="middle" align="center" width="100"><code>Byte 19</code></td>
-	    </tr>
-		<tr>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		</tr>
-	    <tr>
-	      <td valign="middle" align="center"><code>Byte 20</code></td>
-		  <td valign="middle" align="center"><code>Byte 21</code></td>
-		  <td valign="middle" align="center"><code>Byte 22</code></td>
-		  <td valign="middle" align="center"><code>Byte 23</code></td>
-	    </tr>
-		<tr>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>rrrrrrrr</strong></code></td>
-		</tr>
-	    <tr>
-		  <td valign="top" align="right" rowspan="4">
-		  <img src="Images/Dtypes_fig19_d.jpg"></td>
-	      <td valign="middle" align="center"><code>Byte 24</code></td>
-		  <td valign="middle" align="center"><code>Byte 25</code></td>
-		  <td valign="middle" align="center"><code>Byte 26</code></td>
-		  <td valign="middle" align="center"><code>Byte 27</code></td>
-	    </tr>
-		<tr>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		</tr>
-	    <tr>
-	      <td valign="middle" align="center"><code>Byte 28</code></td>
-		  <td valign="middle" align="center"><code>Byte 29</code></td>
-		  <td valign="middle" align="center"><code>Byte 30</code></td>
-		  <td valign="middle" align="center"><code>Byte 31</code></td>
-	    </tr>
-		<tr>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		  <td valign="middle" align="center"><code><strong>iiiiiiii</strong></code></td>
-		</tr>
-	  </table>
-	  
-	  <table align="center" width="550">
-	    <tr>
-		  <td width="150"> </td>
-		  <td>Total size of compound datatype is 32 bytes.</td>
-	    </tr>
-	  </table>
-    </td>
-  </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 11. Layout of a compound datatype nested within a compound 
-        datatype</b>
-        <hr color="green" size="3"/></td>
-  </tr>
-</table>
-<br />
-<br />
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  typedef struct {
-     complex_t x;
-     complex_t y;
-  } surf_t;
-
-  hid_t complex_id, surf_id; /*hdf5 datatypes*/
-
-  complex_id = H5Tcreate (H5T_COMPOUND, sizeof(complex_t));
-  H5Tinsert (complex_id, “re”, HOFFSET(complex_t,re),
-            H5T_NATIVE_DOUBLE);
-  H5Tinsert (complex_id, “im”, HOFFSET(complex_t,im),
-            H5T_NATIVE_DOUBLE);
-
-  surf_id = H5Tcreate (H5T_COMPOUND, sizeof(surf_t));
-  H5Tinsert (surf_id, “x”, HOFFSET(surf_t,x), complex_id);
-  H5Tinsert (surf_id, “y”, HOFFSET(surf_t,y), complex_id);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 11. Code for a compound datatype nested within a compound 
-        datatype</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>Note that a similar result could be accomplished by creating a 
-    compound datatype and inserting four fields. See the figure below. This 
-    results in the same layout as the figure above. The difference 
-    would be how the fields are addressed. In the first case, the 
-    real part of ‘y’ is called ‘y.re’; in the 
-    second case it is ‘y-re’.</p>
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  typedef struct {
-      complex_t x;
-      complex_t y;
-   } surf_t;
-
-  hid_t surf_id = H5Tcreate (H5T_COMPOUND, sizeof(surf_t));
-  H5Tinsert (surf_id, “x-re”, HOFFSET(surf_t,x.re),
-            H5T_NATIVE_DOUBLE);
-  H5Tinsert (surf_id, “x-im”, HOFFSET(surf_t,x.im),
-            H5T_NATIVE_DOUBLE);
-  H5Tinsert (surf_id, “y-re”, HOFFSET(surf_t,y.re),
-            H5T_NATIVE_DOUBLE);
-  H5Tinsert (surf_id, “y-im”, HOFFSET(surf_t,y.im),
-            H5T_NATIVE_DOUBLE);        </pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 12. Another compound datatype nested within a 
-        compound datatype </b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>The members of a compound datatype do not always 
-    fill all the bytes. The <code>HOFFSET</code> macro 
-    assures that the members will be laid out according 
-    to the requirements of the platform and language. 
-    The example below shows an example of a C struct which requires 
-    extra bytes of padding on many platforms. The second 
-    element, ‘b’, is a 1-byte character followed by an 8 
-    byte double, ‘c’. On many systems, the 8-byte value must 
-    be stored on a 4- or 8-byte boundary. This requires the struct 
-    to be larger than the sum of the size of its elements. </p>
-  
-
-  <p>In the example below, <code>sizeof</code> and 
-    <code>HOFFSET</code> are used to assure that the 
-    members are inserted at the correct offset to match the 
-    memory conventions of the platform. The figure below shows how 
-    this data element would be stored in memory, assuming the 
-    double must start on a 4-byte boundary. Notice the extra 
-    bytes between ‘b’ and ‘c’.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-<pre>
-  typedef struct s1_t {                
-     int    a;         
-     char  b;                  
-     double c;          
-  } s1_t;
- 
-  s1_tid = H5Tcreate (H5T_COMPOUND, sizeof(s1_t));
-  H5Tinsert(s1_tid, “a_name”, HOFFSET(s1_t, a), H5T_NATIVE_INT);
-  H5Tinsert(s1_tid, “b_name”, HOFFSET(s1_t, b), H5T_NATIVE_CHAR);
-  H5Tinsert(s1_tid, “c_name”, HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 13. A compound datatype that requires padding</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-<!-- NEW PAGE -->
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dtypes_fig23.JPG">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 12. Memory layout of a compound datatype that requires 
-        padding </b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-  <p>However, data stored on disk does not require 
-    alignment, so unaligned versions of compound data 
-    structures can be created to improve space efficiency 
-    on disk. These unaligned compound datatypes can be 
-    created by computing offsets by hand to eliminate 
-    inter-member padding, or the members can be packed by 
-    calling <code>H5Tpack</code> (which modifies a datatype 
-    directly, so it is usually preceded by a call to 
-    <code>H5Tcopy</code>).  </p>
-  
-  <p>The example below shows how to create a disk version of the 
-    compound datatype from the figure above in order to store 
-    data on disk in as compact a form as possible. 
-    
-    Packed compound datatypes should generally not be used to 
-    describe memory as they may violate alignment constraints 
-    for the architecture being used. Note also that using a 
-    packed datatype for disk storage may involve a higher 
-    data conversion cost.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  hid_t s2_tid = H5Tcopy (s1_tid);
-                 H5Tpack (s2_tid);</pre> </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 14. Create a packed compound datatype in C</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-
-  <p>The example below shows the sequence of Fortran calls to 
-    create a packed compound datatype. An HDF5 Fortran 
-    compound datatype never describes a compound datatype 
-    in memory and compound data is <em>ALWAYS</em> written 
-    by fields as described in the next section. Therefore 
-    packing is not needed unless the offset of each consecutive 
-    member is not equal to the sum of the sizes of the 
-    previous members.</p>
-    
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  CALL h5tcopy_f(s1_id, s2_id, error)
-  CALL h5tpack_f(s2_id, error)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 15. Create a packed compound datatype in Fortran</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<h4>6.4.3.2.1.2. Creating and Writing Datasets with Compound Datatypes</h4>
-
-  <p>Creating datasets with compound datatypes is similar 
-    to creating datasets with any other HDF5 datatypes. But 
-    writing and reading may be different since datasets that 
-    have compound datatypes can be written or read by a field 
-    (member) or subsets of fields (members). The compound datatype 
-    is the only composite datatype that supports “sub-setting” by 
-    the elements the datatype is built from.</p>
-    
-  <p>The example below shows a C example of creating and writing a dataset 
-    with a compound datatype.</p>
-    
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  typedef struct s1_t {
-     int    a;
-     float  b;
-     double c;
-  } s1_t;
-
-  s1_t data[LENGTH];
-
-  /* Initialize data */
-  for (i = 0; i < LENGTH; i++) {
-       data[i].a = i;
-       data[i].b = i*i;
-       data[i].c = 1./(i+1);
-  ...
-  s1_tid = H5Tcreate (H5T_COMPOUND, sizeof(s1_t));
-  H5Tinsert(s1_tid, “a_name”, HOFFSET(s1_t, a), H5T_NATIVE_INT);
-  H5Tinsert(s1_tid, “b_name”, HOFFSET(s1_t, b), H5T_NATIVE_FLOAT);
-  H5Tinsert(s1_tid, “c_name”, HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE);
-  ...
-  dataset_id = H5Dcreate(file_id, “SDScompound.h5”, s1_t, space_id, 
-                 H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-  H5Dwrite (dataset_id, s1_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);</pre> </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 16. Create and write a dataset with a compound datatype in C</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-<!-- NEW PAGE -->
-  <p>The example below shows the content of the file written on 
-    a little-endian machine.</p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  HDF5 “SDScompound.h5” {
-  GROUP “/” {
-      DATASET “ArrayOfStructures” {
-         DATATYPE  H5T_COMPOUND {
-            H5T_STD_I32LE “a_name”;
-            H5T_IEEE_F32LE “b_name”;
-            H5T_IEEE_F64LE “c_name”;
-         }
-         DATASPACE  SIMPLE { ( 3 ) / ( 3 ) }
-         DATA {
-         (0): {
-               0,
-               0,
-               1
-            },
-         (1): {
-               1,
-               1,
-               0.5
-            },
-         (2): {
-               2,
-               4,
-               0.333333
-            }
-         }
-      }
-  }
-  }</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 17. Create and write a little-endian dataset with a compound 
-        datatype in C</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-<!-- NEW PAGE -->
-  <p>It is not necessary to write the whole data at once. 
-    Datasets with compound datatypes can be written by 
-    field or by subsets of fields. In order to do this one 
-    has to remember to set the transfer property of the dataset 
-    using the <code>H5Pset_preserve</code> call and to define the 
-    memory datatype that corresponds to a field. The example below 
-    shows how float and double fields are  written to the 
-    dataset.</p>
-    
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  typedef struct sb_t {
-     float  b;
-     double c;
-  } sb_t;
-
-  typedef struct sc_t {
-     float  b;
-     double c;
-  } sc_t;
-  sb_t data1[LENGTH];
-  sc_t data2[LENGTH];
-
-  /* Initialize data */
-  for (i = 0; i < LENGTH; i++) {
-       data1.b = i*i;
-       data2.c = 1./(i+1);
-  }
-  ...
-  /* Create dataset as in example 15 */
-  ...
-  /* Create memory datatypes corresponding to float and 
-  double datatype fileds */
-
-  sb_tid = H5Tcreate (H5T_COMPOUND, sizeof(sb_t));
-  H5Tinsert(sb_tid, “b_name”, HOFFSET(sb_t, b), H5T_NATIVE_FLOAT);
-  sc_tid = H5Tcreate (H5T_COMPOUND, sizeof(sc_t));
-  H5Tinsert(sc_tid, “c_name”, HOFFSET(sc_t, c), H5T_NATIVE_DOUBLE);
-  ...
-  /* Set transfer property */
-  xfer_id = H5Pcreate(H5P_DATASET_XFER);
-  H5Pset_preserve(xfer_id, 1);
-  H5Dwrite (dataset_id, sb_tid, H5S_ALL, H5S_ALL, xfer_id, data1);
-  H5Dwrite (dataset_id, sc_tid, H5S_ALL, H5S_ALL, xfer_id, data2);</pre> </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 18. Writing floats and doubles to a dataset</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<!-- NEW PAGE -->
-  <p>The figure below shows the content of the file written on a 
-    little-endian machine. Only float and double fields are 
-    written. The default fill value is used to initialize the 
-    unwritten integer field.</p>
-    
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  HDF5 “SDScompound.h5” {
-  GROUP “/” {
-      DATASET “ArrayOfStructures” {
-         DATATYPE  H5T_COMPOUND {
-            H5T_STD_I32LE “a_name”;
-            H5T_IEEE_F32LE “b_name”;
-            H5T_IEEE_F64LE “c_name”;
-         }
-         DATASPACE  SIMPLE { ( 3 ) / ( 3 ) }
-         DATA {
-         (0): {
-               0,
-               0,
-               1
-            },
-         (1): {
-               0,
-               1,
-               0.5
-            },
-         (2): {
-               0,
-               4,
-               0.333333
-            }
-         }
-      }
-  }
-  }</pre> </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 19. Writing floats and doubles to a dataset on a little-endian 
-        system</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<!-- NEW PAGE -->
-  <p>The example below contains a Fortran example that creates and writes 
-    a dataset with a compound datatype. As this example illustrates, 
-    writing and reading compound datatypes in Fortran is <em>always</em> 
-    done by fields. The content of the written file is the same as 
-    shown in the example above.</p>
-    
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  ! One cannot write an array of a derived datatype in Fortran.
-  TYPE s1_t
-     INTEGER          a
-     REAL             b
-     DOUBLE PRECISION c
-  END TYPE s1_t
-  TYPE(s1_t) d(LENGTH)
-  ! Therefore, the following code initializes an array corresponding 
-  ! to each field in the derived datatype and writes those arrays 
-  ! to the dataset
-
-  INTEGER, DIMENSION(LENGTH)          :: a
-  REAL, DIMENSION(LENGTH)             :: b
-  DOUBLE PRECISION, DIMENSION(LENGTH) :: c
-  
-  ! Initialize data
-   do i = 1, LENGTH
-      a(i) = i-1
-      b(i) = (i-1) * (i-1)
-      c(i) = 1./i
-   enddo
-
-  ...
-
-   ! Set dataset transfer property to preserve partially initialized fields
-   ! during write/read to/from dataset with compound datatype.
-   !
-   CALL h5pcreate_f(H5P_DATASET_XFER_F, plist_id, error)
-   CALL h5pset_preserve_f(plist_id, .TRUE., error)
-  ...
-   !
-   ! Create compound datatype.
-   !
-   ! First calculate total size by calculating sizes of each member
-   !
-   CALL h5tget_size_f(H5T_NATIVE_INTEGER, type_sizei, error)
-   CALL h5tget_size_f(H5T_NATIVE_REAL, type_sizer, error)
-   CALL h5tget_size_f(H5T_NATIVE_DOUBLE, type_sized, error)
-   type_size = type_sizei + type_sizer + type_sized
-   CALL h5tcreate_f(H5T_COMPOUND_F, type_size, dtype_id, error)
-   !
-   ! Insert memebers
-   !
-   !
-   ! INTEGER member
-   !
-   offset = 0
-   CALL h5tinsert_f(dtype_id, “a_name”, offset, H5T_NATIVE_INTEGER, error)
-   !
-   ! REAL member
-   !
-   offset = offset + type_sizei
-   CALL h5tinsert_f(dtype_id, “b_name”, offset, H5T_NATIVE_REAL, error)
-   !
-   ! DOUBLE PRECISION member
-   !
-   offset = offset + type_sizer
-   CALL h5tinsert_f(dtype_id, “c_name”, offset, H5T_NATIVE_DOUBLE, error)
-
-   !
-   ! Create the dataset with compound datatype.
-   !
-   CALL h5dcreate_f(file_id, dsetname, dtype_id, dspace_id, &
-                    dset_id, error, H5P_DEFAULT_F, H5P_DEFAULT_F, H5P_DEFAULT_F)
-   !
-  ...
-   ! Create memory types. We have to create a compound datatype
-   ! for each member we want to write.
-   !
-   !
-   CALL h5tcreate_f(H5T_COMPOUND_F, type_sizei, dt1_id, error)
-   offset = 0
-   CALL h5tinsert_f(dt1_id, “a_name”, offset, H5T_NATIVE_INTEGER, error)
-   !
-   CALL h5tcreate_f(H5T_COMPOUND_F, type_sizer, dt2_id, error)
-   offset = 0
-   CALL h5tinsert_f(dt2_id, “b_name”, offset, H5T_NATIVE_REAL, error)
-   !
-   CALL h5tcreate_f(H5T_COMPOUND_F, type_sized, dt3_id, error)
-   offset = 0
-   CALL h5tinsert_f(dt3_id, “c_name”, offset, H5T_NATIVE_DOUBLE, error)
-   !
-   ! Write data by fields in the datatype. Fields order is not important.
-   !
-   CALL h5dwrite_f(dset_id, dt3_id, c, data_dims, error, xfer_prp = plist_id)
-   CALL h5dwrite_f(dset_id, dt2_id, b, data_dims, error, xfer_prp = plist_id)
-   CALL h5dwrite_f(dset_id, dt1_id, a, data_dims, error, xfer_prp = plist_id)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 20. Create and write a dataset with a compound datatype in 
-        Fortran</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<!-- NEW PAGE -->
-<h4>6.4.3.2.1.3. Reading Datasets with Compound Datatypes</h4>
-
-  <p>Reading datasets with compound datatypes may be a 
-    challenge. For general applications there is no way to 
-    know <em>a priori</em> the corresponding C structure. 
-    Also, C structures cannot be allocated on the fly during discovery 
-    of the dataset’s datatype. For general C , C++, Fortran 
-    and Java application the following steps will be required 
-    to read and to interpret data from the dataset with 
-    compound datatype:</p>
- 
-  <dl>    
-  <dt>
-  <ol>
-    <li>Get the identifier of the compound datatype in the file 
-      with the <code>H5Dget_type</code> call</li>
-    <li>Find the number of the compound datatype members 
-      with the <code>H5Tget_nmembers</code> call</li>
-    <li>Iterate through compound datatype members</li>
-  </ol>
-    <dd>
-      <ul>
-        <li>Get member class with the 
-	  <code>H5Tget_member_class</code> call</li>
-	<li>Get member name with the 
-	  <code>H5Tget_member_name</code> call</li>
-	<li>Check class type against predefined classes</li>
-        
-	<ul>
-	  <li><code>H5T_INTEGER</code></li>
-          <li><code>H5T_FLOAT</code></li>
-          <li><code>H5T_STRING</code></li>
-          <li><code>H5T_BITFIELD</code></li>
-          <li><code>H5T_OPAQUE</code></li>
-          <li><code>H5T_COMPOUND</code></li>
-          <li><code>H5T_REFERENCE</code></li>
-          <li><code>H5T_ENUM</code></li>
-          <li><code>H5T_VLEN</code></li>
-          <li><code>H5T_ARRAY</code></li>
-	</ul>
-	
-	<li>If class is <code>H5T_COMPOUND</code>, 
-	  then go to step 2 and repeat all steps under 
-	  step 3. If class is not <code>H5T_COMPOUND</code>, 
-	  then a member is of an atomic class and can be 
-	  read to a corresponding buffer after discovering 
-	  all necessary information specific to each atomic 
-	  type (e.g. size of the integer or floats, super 
-	  class for enumerated and array datatype, 
-	  and it sizes, etc.)</li>
-      </ul>
-    </dd>
-  </dl>
-
-
-  <p>The examples below show how to read a dataset with a known 
-    compound datatype.</p>
-    
-  <p>The first example below shows the steps needed to read data of a 
-    known structure. First, build a memory datatype 
-    the same way it was built when the dataset was created, and then
-    second use the datatype in a <code>H5Dread</code> call.</p>
-    
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  typedef struct s1_t {
-     int    a;
-     float  b;
-     double c;
-  } s1_t;
-
-  s1_t *data;
-
-  ...
-  s1_tid = H5Tcreate(H5T_COMPOUND, sizeof(s1_t));
-  H5Tinsert(s1_tid, “a_name”, HOFFSET(s1_t, a), H5T_NATIVE_INT);
-  H5Tinsert(s1_tid, “b_name”, HOFFSET(s1_t, b), H5T_NATIVE_FLOAT);
-  H5Tinsert(s1_tid, “c_name”, HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE);
-  ...
-  dataset_id = H5Dopen(file_id, “SDScompound.h5”, H5P_DEFAULT);
-  ...
-  data = (s1_t *) malloc (sizeof(s1_t)*LENGTH);
-  H5Dread(dataset_id, s1_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);</pre> </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 21. Read a dataset using a memory datatype
-        <!-- used to be Figure 25f --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>Instead of building a memory datatype, the application could use the 
-  <code>H5Tget_native_type</code> function. See the example below.</p>
-    
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  typedef struct s1_t {
-     int    a;
-     float  b;
-     double c;
-  } s1_t;
-
-  s1_t *data;
-  hid_t file_s1_t, mem_s1_t;
-  ...
-  dataset_id = H5Dopen(file_id, “SDScompound.h5”, H5P_DEFAULT);
-  /* Discover datatype in the file */
-  file_s1_t  = H5Dget_type(dataset_id);
-  /* Find corresponding memory datatype */
-  mem_s1_t   = H5Tget_native_type(file_s1_t, H5T_DIR_DEFAULT); 
-  
-  ...
-  data = (s1_t *) malloc (sizeof(s1_t)*LENGTH);
-  H5Dread (dataset_id, mem_s1_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 22. Read a dataset using <code>H5Tget_native_type</code>
-        <!-- used to be Figure 25g --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-<!-- NEW PAGE -->
-
-
-  <p>The example below shows how to read just one float member of a 
-  compound datatype.</p>
-  <!-- used to be Example 25h -->
-  
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  typedef struct s1_t {
-     float  b;
-  } sf_t;
-
-  sf_t *data;
-
-  ...
-  sf_tid = H5Tcreate(H5T_COMPOUND, sizeof(sf_t));
-  H5Tinsert(s1_tid, “b_name”, HOFFSET(sf_t, b), H5T_NATIVE_FLOAT);
-  ...
-  dataset_id = H5Dopen(file_id, “SDScompound.h5”, H5P_DEFAULT);
-  ...
-  data = (sf_t *) malloc (sizeof(sf_t)*LENGTH);
-  H5Dread(dataset_id, sf_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);</pre> </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 23. Read one floating point member of a compound datatype
-        <!-- used to be Figure 25h --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>The example below <!-- used to be Figure 25i --> shows how to read float 
-    and 
-    double members of a compound datatype into 
-    a structure that has those fields in a different 
-    order. Please notice that <code>H5Tinsert</code> 
-    calls can be used in an order different from the 
-    order of the structure�s members.</p>
-    
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  typedef struct s1_t {
-     double c;
-     float  b;
-  } sdf_t;
-
-  sdf_t *data;
-
-  ...
-  sdf_tid = H5Tcreate(H5T_COMPOUND, sizeof(sdf_t));
-  H5Tinsert(sdf_tid, “b_name”, HOFFSET(sdf_t, b), H5T_NATIVE_FLOAT);
-  H5Tinsert(sdf_tid, “c_name”, HOFFSET(sdf_t, c), H5T_NATIVE_DOUBLE);
-  ...
-  dataset_id = H5Dopen(file_id, “SDScompound.h5”, H5P_DEFAULT);
-  ...
-  data = (sdf_t *) malloc (sizeof(sdf_t)*LENGTH);
-  H5Dread(dataset_id, sdf_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 24. Read float and double members of a compound datatype 
-        <!-- used to be Figure 25i --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<!-- NEW PAGE -->
-<h4>6.4.3.2.2. Array</h4>
-  
-  <p>Many scientific datasets have multiple measurements for each point 
-  in a space. There are several natural ways to represent this data, 
-  depending on the variables and how they are used in computation. 
-  See the table and the figure below.</p>
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Table 20. Representing data with multiple measurements</b></td>
-        </tr>
-    <tr><td colspan="5"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="25%"><b>Storage Strategy</b></td>
-        <td width="2%"> </td>
-        <td width="25%"><b>Stored as</b></td>
-        <td width="2%"> </td>
-        <td width="46%"><b>Remarks</b></td>
-        <tr><td colspan="5"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Mulitple planes</td>
-        <td> </td>
-        <td>Several datasets with identical dataspaces</td>
-        <td> </td>
-        <td>This is optimal when variables are 
-        accessed individually, or when often uses only selected variables.</td>
-        </tr>
-    <tr><td colspan="5"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Additional dimension</td>
-        <td> </td>
-        <td>One dataset, the last “dimension” 
-        is a vector of variables</td>
-        <td> </td>
-        <td>This can give good performance, although 
-        selecting only a few variables may be slow. This may not reflect the 
-        science.</td>
-        </tr>
-    <tr><td colspan="5"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Record with multiple values</td>
-        <td> </td>
-        <td>One dataset with compound datatype</td>
-        <td> </td>
-        <td>This enables the variables to be read all 
-        together or selected. Also handles “vectors” of 
-        heterogenous data.</td>
-        </tr>
-    <tr><td colspan="5"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Vector or Tensor value</td>
-        <td> </td>
-        <td>One dataset, each data element is a small 
-        array of values.</td>
-        <td> </td>
-        <td>This uses the same amount of space as 
-        the previous two, and may represent the science model better.</td>
-        </tr>
-    <tr><td colspan="5"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-<!-- NEW PAGE -->
-<table width="400" cellspacing="0" align="center">
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td align="left">
-        <img src="Images/Dtypes_fig26_pic1of4.JPG"></td>
-        <td> </td>
-        <td align="center"> 
-        <img src="Images/Dtypes_fig26_pic2of4.JPG"></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td align="left">
-        <img src="Images/Dtypes_fig26_pic3of4.JPG"></td>
-        <td> </td>
-        <td align="center"> 
-        <img src="Images/Dtypes_fig26_pic4of4.JPG"></td>
-        </tr>
-
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" colspan="3" >
-        <b>Figure 13. Representing data with multiple measurements</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-
-  <p>The HDF5 <code>H5T_ARRAY</code> datatype defines 
-    the data element to be a homogeneous, multi-dimensional 
-    array. See Figure 13d above. The elements of the array 
-    can be any HDF5 datatype (including compound and array), and 
-    the size of the datatype is the total size of the array. 
-    A dataset of array datatype cannot be subdivided for I/O 
-    within the data element: the entire array of the data element 
-    must be transferred. If the data elements need to be accessed 
-    separately, e.g., by plane, then the array datatype should not 
-    be used. The table below <!-- formerly Table 22 --> 
-    shows advantages and disadvantages of various 
-    storage methods.</p>
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="5" align="left" valign="bottom">
-        <b>Table 21. Storage method advantages and disadvantages</b></td>
-        </tr>
-    <tr><td colspan="5"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="20%"><b>Method</b></td>
-        <td width="2%"> </td>
-        <td width="38%"><b>Advantages</b></td>
-        <td width="2%"> </td>
-        <td width="38%"><b>Disadvantages</b></td>
-    <tr><td colspan="5"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>a) Multiple Datasets</td>
-        <td> </td>
-        <td>Easy to access each plane, can select any plane(s)</td>
-        <td> </td>
-        <td>Less efficient to access a ‘column’ through the 
-            planes</td>
-        </tr>
-    <tr><td colspan="5"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>b) N+1 Dimension</td>
-        <td> </td>
-        <td>All access patterns supported</td>
-        <td> </td>
-        <td>Must be homogeneous datatype<br /><br />
-        The added dimension may not make sense in the scientific 
-        model</td>
-        </tr>
-    <tr><td colspan="5"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>c) Compound Datatype</td>
-        <td> </td>
-        <td>Can be heterogenous datatype</td>
-        <td> </td>
-        <td>Planes must be named, selection is by plane<br /><br />
-        Not a natural representation for a matrix</td>
-        </tr>
-    <tr><td colspan="5"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>d) Array</td>
-        <td> </td>
-        <td>A natural representation for vector or tensor data</td>
-        <td> </td>
-        <td>Cannot access elements separately (no access by plane)</td>
-        </tr>
-    <tr><td colspan="5"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-
-  <p>An array datatype may be multi-dimensional with 1 to 
-  <code>H5S_MAX_RANK</code> (the maximum rank of a dataset is currently 
-  32) dimensions. The dimensions can be any size greater than 0, but 
-  unlimited dimensions are not supported (although the datatype can be 
-  a variable-length datatype).</p>
-  
-  <p>An array datatype is created with the <code>H5Tarray_create</code> 
-  call, which specifies the number of dimensions, the size of each 
-  dimension, and the base type of the array. The array datatype can 
-  then be used in any way that any datatype object is used. The example 
-  below <!-- formerly Figure 27 --> shows the creation of a datatype 
-  that is a two-dimensional array of native integers, and this is then 
-  used to create a dataset. Note that the dataset can be a dataspace 
-  that is any number and size of dimensions. The figure below 
-  <!-- formerly Figure 28 --> shows the layout in memory assuming that 
-  the native integers are 4 bytes. Each data element has 6 elements, 
-  for a total of 24 bytes.</p>
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  hid_t       file, dataset;
-  hid_t       datatype, dataspace;
-  hsize_t     adims[] = {3, 2}; 
-  
-  datatype = H5Tarray_create(H5T_NATIVE_INT, 2, adims, NULL);
-
-  dataset = H5Dcreate(file, datasetname, datatype, dataspace,
-        H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 25. Create a two-dimensional array datatype
-        <!-- formerly Figure 27 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dtypes_fig28.JPG" width="550">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 14. Memory layout of a two-dimensional array datatype
-        <!-- formerly Figure 28 --></b>
-        <hr color="green" size="3"/></td>
-  </tr>
-</table>
-<br />
-
-
-
-<!-- NEW PAGE -->
-<h4>6.4.3.2.3. Variable-length Datatypes</h4>
-  
-  <p>A variable-length (VL) datatype is a one-dimensional sequence of a 
-  datatype which are not fixed in length from one dataset location to 
-  another, i.e., each data element may have a different number of members. 
-  Variable-length datatypes cannot be divided, the entire data element 
-  must be transferred.</p>
-  
-  <p>VL datatypes are useful to the scientific community in many different 
-  ways, possibly including: </p>
-  <ul>
-    <li><em>Ragged arrays</em>: Multi-dimensional ragged arrays can be 
-    implemented with the last (fastest changing) dimension being ragged by 
-    using a VL datatype as the type of the element stored. </li>
-    <li><em>Fractal arrays</em>: A nested VL datatype can be used to implement 
-    ragged arrays of ragged arrays, to whatever nesting depth is required 
-    for the user. </li>
-    <li><em>Polygon lists</em>: A common storage requirement is to 
-    efficiently store arrays of polygons with different numbers of 
-    vertices. A VL datatypes can be used to efficiently and succinctly 
-    describe an array of polygons with different numbers of vertices. </li>
-    <li><em>Character strings</em>: Perhaps the most common use of VL 
-    datatypes will be to store C-like VL character strings in dataset 
-    elements or as attributes of objects. </li>
-    <li><em>Indices, e.g. of objects within the file</em>: An array of 
-    VL object references could be used as an index to all the objects 
-    in a file which contain a particular sequence of dataset values. </li>
-    <li><em>Object Tracking</em>: An array of VL dataset region references 
-    can be used as a method of tracking objects or features appearing 
-    in a sequence of datasets. </li>
-  </ul>
-  
-  <p>A VL datatype is created by calling <code>H5Tvlen_create</code> which 
-  specifies the base datatype. The first example below <!-- formerly 
-  Figure 29 --> shows an example of code that creates a VL datatype 
-  of unsigned integers. Each data element is a one-dimensional array of 
-  zero or more members and is stored in the <code>hvl_t</code> structure. 
-  See the second example below. <!-- formerly Figure 30 --></p>
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  tid1 = H5Tvlen_create (H5T_NATIVE_UINT);
-
-  dataset=H5Dcreate(fid1, “Dataset1”, tid1, sid1, H5P_DEFAULT, 
-            H5P_DEFAULT, H5P_DEFAULT);</pre> </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 26. Create a variable-length datatype of unsigned integers
-        <!-- formerly Figure 29 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
- typedef struct  {
-     size_t len; /* Length of VL data (in base type units) */      
-     void *p;    /* Pointer to VL data */        
- } hvl_t;</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 27. Data element storage for members of the VL datatype
-        <!-- formerly Figure 30 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<!-- NEW PAGE -->
-  <p>The first example below <!-- formerly Figure 31 --> shows how the VL 
-  data is written. For each of the 10 data elements, 
-  a length and data buffer must be allocated. Below the two examples is a 
-  figure <!-- formerly Figure 33 --> that shows how the data is 
-  laid out in memory. </p>
-  
-  <p>An analogous procedure must be used to read the data. See the second 
-  example below. 
-  An appropriate array of <code>vl_t</code> must be allocated, 
-  and the data read. It is then traversed one data element at a time. 
-  The <code>H5Dvlen_reclaim</code> call frees the data buffer for the buffer. 
-  With each element possibly being of different sequence lengths for a 
-  dataset with a VL datatype, the memory for the VL datatype 
-  must be dynamically allocated. Currently there are two methods of managing the 
-  memory for VL datatypes: the standard C malloc/free memory allocation routines 
-  or a method of calling user-defined memory management routines to allocate or 
-  free memory (set with <code>H5Pset_vlen_mem_manager</code>). Since the memory 
-  allocated when reading (or writing) may be complicated to release, 
-  the <code>H5Dvlen_reclaim</code> function
-  is provided to traverse a memory buffer and free the VL datatype information 
-  without leaking memory.</p>
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  hvl_t wdata[10];           /* Information to write */
-  
-  /* Allocate and initialize VL data to write */
-  for(i=0; i < 10; i++) {
-      wdata[i].p = malloc((i+1)*sizeof(unsigned int));
-      wdata[i].len = i+1;
-      for(j=0; j<(i+1); j++)
-           ((unsigned int *)wdata[i].p)[j]=i*10+j;
-   }
-
-   ret=H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);</pre> </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 28. Write VL data 
-        <!-- formerly Figure 31 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  hvl_t rdata[SPACE1_DIM1];      
-  ret=H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, xfer_pid, rdata);
-
-  for(i=0; i<SPACE1_DIM1; i++) {
-    printf(“%d: len %d ”,rdata[i].len);
-    for(j=0; j<rdata[i].len; j++) {
-       printf(“ value: %u\n”,((unsigned int *)rdata[i].p)[j]);
-    }
-  } 
-  ret=H5Dvlen_reclaim(tid1, sid1, xfer_pid, rdata);</pre> </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 29. Read VL data 
-        <!-- formerly Figure 32 --></b>
-        <hr color="green" size="3"/></td>
-  </tr>
-</table>
-<br />
-<br />
-
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dtypes_fig33.JPG" width="550">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 15. Memory layout of a VL datatype
-        <!-- formerly Figure 33 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>The user program must carefully manage these relatively complex data 
-  structures. 
-  The <code>H5Dvlen_reclaim</code> function performs a standard traversal, 
-  freeing all the data. This function analyzes the datatype and dataspace 
-  objects, and visits each VL data element, recursing through nested 
-  types. By default, the system <code>free</code> is called for the 
-  pointer in each <code>vl_t</code>. Obviously, this call assumes that 
-  all of this memory was allocated with the system <code>malloc</code>.</p>
-  
-  <p>The user program may specify custom memory manager routines, one for 
-  allocating and one for freeing. These may be set with the 
-  <code>H5Pvlen_mem_manager</code>, and must have the following prototypes: </p>
-  
-  <ul>
-    <li><code>typedef void *(*H5MM_allocate_t)(size_t size, void *info);</code> </li>
-    <li><code>typedef void (*H5MM_free_t)(void *mem, void *free_info);</code> </li>
-  </ul>
-  
-  <p>The utility function <code>H5Dget_vlen_buf_size</code> checks the 
-  number of bytes required to store the VL data from the dataset. This 
-  function analyzes the datatype and dataspace object to visit all the 
-  VL data elements, to determine the number of bytes required to store 
-  the data for the in the destination storage (memory). The 
-  <code>size</code> value is adjusted for data conversion and alignment 
-  in the destination.</p>
-
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="NonNumDtypes">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-
-<a name="NonNumDtypes">
-<h3 class=pagebefore>6.5. Other Non-numeric Datatypes</h3>
-</a>
-
-  <p>Several datatype classes define special types of objects.</p>
-  
-<h4>6.5.1. Strings</h4>
-
-  <p>Text data is represented by arrays of characters, called strings. 
-  Many programming languages support different conventions for storing strings, 
-  which may be fixed or variable-length, and may have different rules for 
-  padding unused storage.  HDF5 can represent strings in several ways. 
-  See the figure below.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-	
-	<table align="center" width="100%">
-	  <tr align="left">
-	    <td width="5%"> </td>
-	    <td width="25%" align="left" valign="top">The Strings to store are: </td>
-		<td width="70%" align="left">“Four score”,<br /> “lazy programmers.”</td>
-	  </tr>
-	  <tr>
-	    <td colspan="3"> </td>
-	  </tr>
-
-      </table>
-  <table width="100%">
-    <tr align="left">
-      <td width="5%"> </td>
-      <td valign="top" align="right">
-        <strong>a)</strong>
-      </td>
-      <td><code>H5T_NATIVE_CHAR</code> the dataset is a one-dimensional 
-        array with 29 elements, each element is a single character.
-      </td>
-    </tr>
-  </table>
-  
-  <table align="center" width="100%">
-	  <tr>
-	    <td width="5%"> </td>
-		<td colspan="2">
-		  <table border="1" width="100%">
-		    <tr>
-			  <td align="center">0</td>
-			  <td align="center">1</td>
-			  <td align="center">2</td>
-			  <td align="center">3</td>
-			  <td align="center">4</td>
-			  <td align="center">...</td>
-			  <td align="center">25</td>
-			  <td align="center">26</td>
-			  <td align="center">27</td>
-			  <td align="center">28</td>
-		    </tr>
-		    <tr>
-			  <td align="center">‘F’</td>
-			  <td align="center">‘o’</td>
-			  <td align="center">‘u’</td>
-			  <td align="center">‘r’</td>
-			  <td align="center">‘ ’</td>
-			  <td align="center">...</td>
-			  <td align="center">‘r’</td>
-			  <td align="center">‘s’</td>
-			  <td align="center">‘.’</td>
-			  <td align="center">‘\0’</td>
-		    </tr>
-		  </table>
-		</td>
-	  </tr>
-	  <tr><td colspan="3"> </td></tr>
-      </table>
-	
-	<table width="100%">
-	  <tr align="left">
-	    <td width="5%"> </td>
-		<td align="right" valign="top"><strong>b)</strong></td>
-		<td>Fixed-length string<br />
-		  The dataset is a one-dimensional array with 2 elements, 
-                  each element is 20 characters.
-		</td>
-	  </tr>
-	</table>
-    
-	<table align="center" width="100%">
-	  <tr>
-	    <td width="15%"> </td>
-		<td colspan="2">
-		  <table border="1" width="50%">
-		    <tr align="center">
-			  <td>  0  </td>
-			  <td><pre>“Four score\0       ”</pre></td>
-		    </tr>
-			<tr align="center">
-			  <td>  1  </td>
-			  <td><pre>“lazy programmers.\0”</pre></td>
-			</tr>
-		  </table>
-		</td>
-	  </tr>
-      <tr><td colspan="3"> </td></tr>
-	</table>
-
-	<table width="100%">
-	  <tr align="left">
-	    <td width="5%"> </td>
-		<td align="right" valign="top"><strong>c)</strong></td>
-		<td>Variable-length string<br />
-		  The dataset is a one-dimensional array with 2 
-		  elements, each element is a variable-length string.<br />
-		  This is the same result when stored as fixed-length
-		  string, except that first element of the array will 
-		  need only 11 bytes for storage instead of 20.
-		</td>
-	  </tr>
-	</table>
-	
-        <table align="center" width="100%">
-	  <tr>
-	    <td width="15%"> </td>
-		<td colspan="2">
-		  <table border="1" width="50%">
-		    <tr align="center">
-			  <td>  0  </td>
-			  <td><pre>“Four score\0”</pre></td>
-		    </tr>
-			<tr align="center">
-			  <td>  1  </td>
-			  <td><pre>“lazy programmers.\0”</pre></td>
-			</tr>
-		  </table>
-		</td>
-	  </tr>
-      <tr><td colspan="3"> </td></tr>
-	</table>
-	
-	<table align="center" width="100%">
-	  <tr>
-	    <td width="15%"> </td>
-		<td colspan="2">
-          <img src="Images/Dtypes_fig34.JPG">
-		</td>
-	</table>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 16. Ways to represent strings
-        <!-- formerly Figure 34 --></b><hr color="green" size="3"/></td>
-        </tr>  
-</table>
-<br />
-
-
-
-  <p>First, a dataset may have a dataset with datatype 
-  <code>H5T_NATIVE_CHAR</code>, with each character of the string as an 
-  element of the dataset. This will store an unstructured block of text 
-  data, but gives little indication of any structure in the text. See 
-  item a in the figure above. </p>
-  
-
-  <p>A second alternative is to store the data using the datatype class 
-  <code>H5T_STRING</code>, 
-  with each element a fixed length. See item b in the figure above. In this 
-  approach, each element might be a word or a sentence, addressed by 
-  the dataspace. The dataset reserves space for the specified number of 
-  characters, although some strings may be shorter. This approach is 
-  simple and usually is fast to access, but can waste storage space if 
-  the length of the Strings varies.</p>
-  
-  <p>A third alternative is to use a variable-length datatype. See item c in 
-  the figure above. This can be done using the standard mechanisms 
-  described above (e.g., using <code>H5T_NATIVE_CHAR</code> 
-  instead of <code>H5T_NATIVE_INT</code> in Example 25 above).  The 
-  program would use <code>vl_t</code> structures to write and 
-  read the data.</p>
-
-  <p>A fourth alternative is to use a special feature of the string datatype 
-  class to set the size of the datatype to <code>H5T_VARIABLE</code>. See 
-  item c in the figure above. The example below <!-- formerly Figure 35 -->
-  shows a declaration of a datatype of type <code>H5T_C_S1</code> 
-  which is set to <code>H5T_VARIABLE</code>.  The HDF5 Library automatically 
-  translates between this and the <code>vl_t</code> structure. (Note: the 
-  <code>H5T_VARIABLE</code> size can only be used with string datatypes.)</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  tid1 = H5Tcopy (H5T_C_S1); 
-                    
-  ret = H5Tset_size (tid1, H5T_VARIABLE);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 30. Set the string datatype size to <code>H5T_VARIABLE</code>
-        <!-- formerly Figure 35 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>Variable-length strings can be read into C strings (i.e., pointers to zero 
-  terminated arrays of <code>char</code>). See the figure below.  </p>
-  
-
-<table width="650" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  char *rdata[SPACE1_DIM1];  
-
-  ret=H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, xfer_pid, rdata);
-
-  for(i=0; i<SPACE1_DIM1; i++) {   
-           printf(“%d: len: %d, str is: %s\n”, i, strlen(rdata[i]),rdata[i]);
-  } 
-
-  ret=H5Dvlen_reclaim(tid1, sid1, xfer_pid, rdata);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 31. Read variable-length strings into C strings
-        <!-- formerly Figure 36 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-<!-- 
-3.23.2012. I commented out the "Strings in Mixed Environments" section below. 
-I have spent too many GMQS hours and have to stop charging GMQS for awhile. MEE.
-
-<a name="stringsInMixedEnvironments">
-<b>Strings in Mixed Environments</b></a>
-
-  <p>In the figures above, the strings are terminated with NULLs. 
-  Suppose in another scenario that the strings were stored on disk and 
-  were not terminated with NULLs, and suppose that the users of the data 
-  would be using applications that expected strings to be terminated with 
-  NULLs? What APIs might an application use to properly handle the strings? 
-  </p>
-
-  <p>The figure below shows the strings “Four score” and 
-  “seven years ago” stored as fixed-length dataset elements 
-  without NULL terminators.</p>
-  
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-
-    
-  <table align="center" width="100%">
-	  <tr>
-		<td colspan="2">
-		  <table align="center" border="1" width="70%">
-		    <tr>
-			  <td width="50%" align="center">0</td>
-			  <td width="50%" align="center">1</td>
-		    </tr>
-		    <tr>
-			  <td align="center">‘Four score
-                       ’</td>
-			  <td align="center">‘seven years ago
-                  ’</td>
-		    </tr>
-		  </table>
-		</td>
-	  </tr>
-      </table>
-
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 17???. Strings stored as fixed-length dataset elements
-        and not terminated with NULLs
-        </b><hr color="green" size="3"/></td>
-        </tr>  
-</table>
-<br />
-  
-  <p>
-  
-
-  <p>??????? rewrite for this new example
-  The figure below shows how these strings might be stored using 
-  a <b>fixed-length</b> datatype. This one-dimensional array uses the 
-  <code>H5T_STRING</code> datatype. The dataset reserves space for a 
-  specified number of characters in each string although some strings may 
-  be shorter. In the example below, the size is set to 20. This approach 
-  is simple and usually fast to access, but this approach can waste storage 
-  space if the lengths of the strings vary. The single quotation marks are 
-  used to show the 20 characters included in each dataset element.</p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-
-    
-  <table align="center" width="100%">
-	  <tr>
-		<td colspan="2">
-		  <table align="center" border="1" width="70%">
-		    <tr>
-			  <td width="50%" align="center">0</td>
-			  <td width="50%" align="center">1</td>
-		    </tr>
-		    <tr>
-			  <td align="center">‘Four score\0
-                       ’</td>
-			  <td align="center">‘seven years ago\0
-                  ’</td>
-		    </tr>
-		  </table>
-		</td>
-	  </tr>
-      </table>
-
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 17???. Strings stored as fixed-length dataset elements
-        </b><hr color="green" size="3"/></td>
-        </tr>  
-</table>
-<br />
-
-  <p>Please note that a data element of size 1 might be useful in an 
-  environment where a NULL is not needed to terminate a string. If a NULL 
-  is needed to terminate a string, then a data element of size 1 
-  would not be useful.</p>
-  
-  
-  
-  
-  
-<br /><br />
--->
-
-
-
-
-<h4>6.5.2. Reference</h4>
-  
-  <p>In HDF5, objects (i.e. groups, datasets, and committed datatypes) 
-  are usually accessed by name. There is another way to access stored 
-  objects - by reference. There are two reference datatypes: object 
-  reference and region reference. Object reference objects are created 
-  with <code>H5Rcreate</code> and other calls (cross reference). These 
-  objects can be stored and retrieved in a dataset as elements with 
-  reference datatype. The first example below <!-- formerly Figure 37 -->
-  shows an example of code that creates references to four objects, 
-  and then writes the array of object references to a dataset. The 
-  second example below <!-- formerly Figure 38 -->shows a dataset of datatype 
-  reference being read and one of the reference objects being 
-  dereferenced to obtain an object pointer.</p>
-  
-  <p>In order to store references to regions of a dataset, the datatype 
-  should be <code>H5T_REGION_OBJ</code>. Note that a data element must 
-  be either an object reference or a region reference: these are different 
-  types and cannot be mixed within a single array.</p>
-  
-
-  <p>A reference datatype cannot be divided for I/O: an element is read or 
-  written completely.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  dataset=H5Dcreate(fid1, “Dataset3”, H5T_STD_REF_OBJ, sid1,
-            H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create reference to dataset */
-    ret = H5Rcreate(&wbuf[0], fid1,“/Group1/Dataset1”, H5R_OBJECT, -1);
-
-    /* Create reference to dataset */
-    ret = H5Rcreate(&wbuf[1], fid1, “/Group1/Dataset2”, H5R_OBJECT, -1);
-
-    /* Create reference to group */
-    ret = H5Rcreate(&wbuf[2], fid1, “/Group1”, H5R_OBJECT, -1);
-
-    /* Create reference to committed datatype */
-    ret = H5Rcreate(&wbuf[3], fid1, “/Group1/Datatype1”, H5R_OBJECT, -1);
-
-    /* Write selection to disk */
-      
-  ret=H5Dwrite(dataset, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 32. Create object references and write to a dataset
-        <!-- formerly Figure 37 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  rbuf = malloc(sizeof(hobj_ref_t)*SPACE1_DIM1);
-
-  /* Read selection from disk */
-  ret=H5Dread(dataset, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf);
-
-  /* Open dataset object */
-  dset2 = H5Rdereference(dataset, H5R_OBJECT, &rbuf[0]);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 33. Read a dataset with a reference datatype
-        <!-- formerly Figure 38 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<!-- NEW PAGE -->
-<h4>6.5.3. ENUM</h4>
-  
-  <p>The enum datatype implements a set of (name, value) pairs, similar 
-  to C/C++ enum.  The values are currently limited to native integer datatypes.  
-  Each name can be the name of only one value, and each value can have only 
-  one name.  </p>
-  
-  <p>The data elements of the ENUMERATION are stored according to the datatype, 
-  e.g., as an array of integers. The example below <!-- formerly Figure 39 -->
-  shows an example of how to create 
-  an enumeration with five elements. The elements map symbolic names to 
-  2-byte integers. See the table below.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-hid_t hdf_en_colors = H5Tcreate(H5T_ENUM, sizeof(short));
-short val;
-    H5Tenum_insert(hdf_en_colors, “RED”,   (val=0,&val));
-    H5Tenum_insert(hdf_en_colors, “GREEN”, (val=1,&val));
-    H5Tenum_insert(hdf_en_colors, “BLUE”,  (val=2,&val));
-    H5Tenum_insert(hdf_en_colors, “WHITE”, (val=3,&val));
-    H5Tenum_insert(hdf_en_colors, “BLACK”, (val=4,&val));
-
-    H5Dcreate(fileid, datasetname, hdf_en_colors, spaceid, H5P_DEFAULT, 
-        H5P_DEFAULT, H5P_DEFAULT);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 34. Create an enumeration with five elements
-        <!-- formerly Figure 39 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-<table width="200" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 22. An enumeration<br />with five elements</b>
-        <!-- formerly Table 23 --></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="50%"><b>Name</b></td>
-        <td width="50%"><b>Value</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>RED</td>
-        <td>0</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>GREEN</td>
-        <td>1</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>BLUE</td>
-        <td>2</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>WHITE</td>
-        <td>3</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>BLACK</td>
-        <td>4</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-
-<!-- NEW PAGE -->
-  <p>The figure below <!-- formerly Figure 40 -->shows how an array of eight 
-  values might be stored. Conceptually, 
-  the array is an array of symbolic names [BLACK, RED, WHITE, BLUE, ...]. See 
-  item a in the figure below. <!-- formerly Figure 40a --> 
-  These are stored as the values and are short integers. So, the first 2 bytes 
-  are the value associated with “BLACK”, which is the number 4, 
-  and so on. See item b in the figure below. <!-- formerly Figure 40b --></p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-      <table align="center" width="100%">
-	  <tr>
-	    <td align="center">a) Logical data to be written - 
-            eight elements</td>
-	  </tr>
-		<tr>
-		  <td align="center">
-		    <table>
-			  <tr>
-			    <td width="50" align="center">Index</td>
-				<td width="135" align="center">Name</td>
-			  </tr>
-		    </table>
-		    <table border="1">
-			  <tr>
-			    <td width="30" align="center">0</td>
-				<td width="130" align="left">:BLACK</td>
-			  </tr>
-			  <tr>
-			    <td width="30" align="center">1</td>
-				<td width="130" align="left">RED</td>
-			  </tr>
-			  <tr>
-			    <td width="30" align="center">2</td>
-				<td width="130" align="left">WHITE</td>
-			  </tr>
-			  <tr>
-			    <td width="30" align="center">3</td>
-				<td width="130" align="left">BLUE</td>
-			  </tr>
-			  <tr>
-			    <td width="30" align="center">4</td>
-				<td width="130" align="left">RED</td>
-			  </tr>
-			  <tr>
-			    <td width="30" align="center">5</td>
-				<td width="130" align="left">WHITE</td>
-			  </tr>
-			  <tr>
-			    <td width="30" align="center">6</td>
-				<td width="130" align="left">BLUE</td>
-			  </tr>
-			  <tr>
-			    <td width="30" align="center">7</td>
-				<td width="130" align="left">GREEN</td>
-			  </tr>
-		    </table>
-		  </td>
-		</tr>
-		<tr><td> </td></tr>
-		<tr>
-		  <td align="center"><img src="Images/Dtypes_fig40.JPG"></td>
-		</tr>
-		<tr>
-		  <td align="center">b) The storage layout. Total size of the 
-                  array is 16 bytes, 2 bytes per element.
-		  </td>
-		</tr>
-
-      </table>
-    </td>
-    </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 17. Storing an enum array
-        <!-- formerly Figure 40 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>The order that members are inserted into an enumeration type is 
-  unimportant; the important part is the associations between the symbol 
-  names and the values. Thus, two enumeration datatypes will be considered 
-  equal if and only if both types have the same symbol/value associations 
-  and both have equal underlying integer datatypes. Type equality is 
-  tested with the <code>H5Tequal</code> function.</p>
-
-  <p>If a particular architecture type is required, a little-endian or 
-  big-endian datatype for example, use a native integer datatype as the 
-  ENUM base datatype and use <code>H5Tconvert</code> on values as they 
-  are read from or written to a dataset. </p>
-  
-  <!-- NEW PAGE -->
-<h4>6.5.4. Opaque</h4>
-  
-  <p>In some cases, a user may have data objects that should be stored and 
-  retrieved as blobs with no attempt to interpret them.  For example, 
-  an application might wish to store an array of encrypted certificates 
-  which are 100 bytes long.</p>
-  
-  <p>While an arbitrary block of data may always be stored as bytes, 
-  characters, integers, or whatever, this might mislead programs about 
-  the meaning of the data. The opaque datatype defines data elements which 
-  are uninterpreted by HDF5. The opaque data may be labeled with 
-  <code>H5Tset_tag</code> with a string that might be used by an 
-  application. For example, the encrypted certificates might have 
-  a tag to indicate the encryption and the certificate standard.</p>
-
-<h4>6.5.5. Bitfield</h4>
-  
-  <p>Some data is represented as bits, where the number of bits is not an 
-  integral byte and the bits are not necessarily interpreted as a standard 
-  type. Some examples might include readings from machine registers (e.g., 
-  switch positions), a cloud mask, or data structures with several small 
-  integers that should be store in a single byte.</p>
-  
-  <p>This data could be stored as integers, strings, or enumerations.  
-  However, these storage methods would likely result in considerable wasted 
-  space. For example, storing a cloud mask with one byte per value would 
-  use up to eight times the space of a packed array of bits. </p>
-  
-  <p>The HDF5 bitfield datatype class defines a data element that is a 
-  contiguous sequence of bits, which are stored on disk in a packed array. 
-  The programming model is the same as for unsigned integers:  the datatype 
-  object is created by copying a predefined datatype, and then the 
-  precision, offset, and padding are set.</p>
-
-  <p>While the use of the bitfield datatype will reduce storage space 
-  substantially, there will still be wasted space if the bitfield as a 
-  whole does not match the 1-, 2-, 4-, or 8-byte unit in which it is 
-  written.  The remaining unused space can be removed by applying the 
-  <a href="10_Datasets.html#N-Bit">N-bit filter</a> to the dataset 
-  containing the bitfield data. </p>
-
-<!--
-<h4>5.6. Time</h4>
-
-  <p>The HDF5 time datatype defines storage layout for various date and 
-  time standards. Currently, only Unix "time" and "timeval" structs are 
-  supported. The H5T_UNIX_D32BE (LE) defines storage for 4 bytes 
-  (sufficient for the time struct), H5T_UNIX_D64BE (LE) is sufficient 
-  for timeval.  The data is treated as a single opaque value.</p>
--->
-  
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="Fvalues">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-
-<a name="Fvalues">
-<h3 class=pagebefore>6.6. Fill Values</h3>
-</a>
-
-  <p>The “fill value” for a dataset is the specification of 
-  the default value assigned to data elements that have not yet been 
-  written. In the case of a dataset with an atomic datatype, the fill 
-  value is a single value of the appropriate datatype, such as 
-  ‘0’ or ‘-1.0’. In the case of a dataset with 
-  a composite datatype, the fill value is a single data element of the 
-  appropriate type. For example, for an array or compound datatype, 
-  the fill value is a single data element with values for all the 
-  component elements of the array or compound datatype.</p>
-  
-  <p>The fill value is set (permanently) when the dataset is created. 
-  The fill value is set in the dataset creation properties 
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  (see chapter ??) 
-  ] ] ]</span>
--->
-  in the <code>H5Dcreate</code> call. Note that the <code>H5Dcreate</code> 
-  call must also include the datatype of the dataset, and the value provided 
-  for the fill value will be interpreted as a single element of this datatype. 
-  The example below <!-- formerly Figure 41 -->shows code which creates a 
-  dataset of integers with fill 
-  value -1. Any unwritten data elements will be set to -1.</p>
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  hid_t       plist_id;  
-  int filler;
-
-  filler = -1;
-  plist_id = H5Pcreate(H5P_DATASET_CREATE);
-  H5Pset_fill_value(plist_id, H5T_NATIVE_INT, &filler);
-
-  /* Create the dataset with fill value ‘-1’. */
-  dataset_id = H5Dcreate(file_id, “/dset”, H5T_STD_I32BE, 
-      dataspace_id, H5P_DEFAULT, plist_id, H5P_DEFAULT);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 35. Create a dataset with a fill value of -1
-        <!-- formerly Figure 41 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  typedef struct s1_t {
-  int    a;
-  char  b;
-  double c; 
-  } s1_t;
-  s1_t       filler;
-
-  s1_tid = H5Tcreate (H5T_COMPOUND, sizeof(s1_t));
-  H5Tinsert(s1_tid, “a_name”, HOFFSET(s1_t, a), H5T_NATIVE_INT);
-  H5Tinsert(s1_tid, “b_name”, HOFFSET(s1_t, b), H5T_NATIVE_CHAR);
-  H5Tinsert(s1_tid, “c_name”, HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE);
-
-  filler.a = -1;
-  filler.b = ‘*’;
-  filler.c = -2.0;
-
-  plist_id = H5Pcreate(H5P_DATASET_CREATE);
-  H5Pset_fill_value(plist_id, s1_tid, &filler);
-
-  /* Create the dataset with fill value (-1, ‘*’, -2.0). */
-  dataset = H5Dcreate(file, datasetname, s1_tid, space, H5P_DEFAULT, 
-      plist_id, H5P_DEFAULT);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 36. Create a fill value for a compound datatype
-        <!-- formerly Figure 42 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>The figure above <!-- formerly Figure 42 -->shows how to create a fill 
-  value for a compound datatype. The procedure is the same as the previous 
-  example except the filler must be a structure with the correct fields. 
-  Each field is initialized to the desired fill value.</p>
-  
-
-  <p>The fill value for a dataset can be retrieved by reading the dataset 
-  creation properties of the dataset and then by reading the fill value with 
-  <code>H5Pget_fill_value</code>. The data will be read into memory using 
-  the storage layout specified by the datatype. This transfer will convert 
-  data in the same way as <code>H5Dread</code>. 
-
-  The figure below <!-- formerly Figure 43 --> shows how to get the fill 
-  value from the dataset created in Example 33 above.</p>
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  hid_t plist2;
-  int filler;
-  
-  dataset_id = H5Dopen(file_id, “/dset”, H5P_DEFAULT);
-  plist2 = H5Dget_create_plist(dataset_id);
-
-  H5Pget_fill_value(plist2, H5T_NATIVE_INT, &filler);
-
-  /* filler has the fill value, ‘-1’ */</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 37. Retrieve a fill value
-        <!-- formerly Figure 43 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>A similar procedure is followed for any datatype. The example below 
-  <!-- formerly Figure 45 -->shows how to 
-  read the fill value for the compound datatype created in an example above 
-  <!-- formerly Figure 42 -->. Note that the program must pass an 
-  element large enough to hold a fill value of the datatype indicated by the 
-  argument to <code>H5Pget_fill_value</code>.  Also, the program must 
-  understand the datatype in order to interpret its components. This may 
-  be difficult to determine without knowledge of the application that 
-  created the dataset.</p>
-  
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  char *       fillbuf;
-  int sz;
-  dataset = H5Dopen( file, DATASETNAME, H5P_DEFAULT);
-
-  s1_tid = H5Dget_type(dataset);
-
-  sz = H5Tget_size(s1_tid);
-
-  fillbuf = (char *)malloc(sz);
-
-  plist_id = H5Dget_create_plist(dataset);
-
-  H5Pget_fill_value(plist_id, s1_tid, fillbuf);
-
-  printf(“filler.a: %d\n”,((s1_t *) fillbuf)->a);
-  printf(“filler.b: %c\n”,((s1_t *) fillbuf)->b);
-  printf(“filler.c: %f\n”,((s1_t *) fillbuf)->c);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 38. Read the fill value for a compound datatype
-        <!-- formerly Figure 44 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="CCDtypes">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<!-- NEW PAGE -->
-<a name="CCDtypes">
-<h3 class=pagebefore>6.7. Complex Combinations of Datatypes</h3>
-</a>
-
-  
-  <p>Several composite datatype classes define collections of other datatypes, 
-  including other composite datatypes.  In general, a datatype can be nested 
-  to any depth, with any combination of datatypes.</p>
-  
-  <p>For example, a compound datatype can have members that are other compound 
-  datatypes, arrays, VL datatypes.  An array can be an array of array, 
-  an array of compound, or an array of VL.  And a VL datatype can be a 
-  variable-length array of compound, array, or VL datatypes.</p>
-
-  <p>These complicated combinations of datatypes form a logical tree, 
-  with a single root datatype, and leaves which must be atomic datatypes 
-  (predefined or user-defined). The figure below <!-- formerly Figure 45 --> 
-  shows an example of a logical 
-  tree describing a compound datatype constructed from different datatypes.</p>
-
-  <p>Recall that the datatype is a description of the layout of storage. 
-  The complicated compound datatype is constructed from component datatypes, 
-  each of which describe the layout of part of the storage. Any datatype can 
-  be used as a component of a compound datatype, with the following 
-  restrictions:</p>
-
-  <ol>
-      <li>No byte can be part of more than one component datatype (i.e., the 
-          fields cannot overlap within the compound datatype)</li><br />
-      <li>The total size of the components must be less than or equal to the 
-          total size of the compound datatype</li>
-  </ol>
-  
-  <p>These restrictions are essentially the rules for C structures and similar 
-  record types familiar from programming languages.  Multiple typing, such 
-  as a C union, is not allowed in HDF5 datatypes.</p>
-  
-
-<table width="500" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dtypes_fig45.JPG">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 18. A compound datatype built with 
-        different datatypes<!-- formerly Figure 45 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<!-- NEW PAGE -->
-<h4>6.7.1. Creating a Complicated Compound Datatype</h4>
-  
-  <p>To construct a complicated compound datatype, each component is 
-  constructed, and then added to the enclosing datatype description. 
-  The example below <!-- formerly Figure 46 --> shows  
-  how to create a compound datatype with four members:</p>
-  
-  <ul>
-      <li>“T1”, a compound datatype with three members</li>
-      <li>“T2”, a compound datatype with two members</li>
-      <li>“T3”, a one-dimensional array of integers</li>
-      <li>“T4”, a string</li>
-  </ul>
-  
-  <p>Below the example code is a figure that shows this datatype as a logical 
-  tree. <!-- formerly Figure 47 --> The output of the 
-  <em>h5dump</em> utility is shown in the example below the figure. 
-  <!-- the example was formerly called Figure 48.--></p>
-  
-  <p>Each datatype is created as a separate datatype object. Figure 20 below 
-  <!-- formerly Figure 49 --> shows 
-  the storage layout for the four individual datatypes. Then the datatypes are 
-  inserted into the outer datatype at an appropriate offset. Figure 21 below 
-  <!-- formerly Figure 50 -->shows 
-  the resulting storage layout. The combined record is 89 bytes long.</p>
-  
-  <p>The Dataset is created using the combined compound datatype. The dataset 
-  is declared to be a 4 by 3 array of compound data.  Each data element is an 
-  instance of the 89-byte compound datatype. Figure 22 below 
-  <!-- formerly Figure 51 -->shows the layout of 
-  the dataset, and expands one of the elements to show the relative position 
-  of the component data elements.</p>
-  
-  <p>Each data element is a compound datatype, which can be written or read 
-  as a record, or each field may be read or written individually. The first 
-  field (“T1”) is itself a compound datatype with three fields 
-  (“T1.a”, “T1.b”, and “T1.c”). 
-  “T1” can be read or written as a record, or individual 
-  fields can be accessed. Similarly, the second filed is a compound datatype 
-  with two fields (“T2.f1”, “T2.f2”).</p>
-  
-  <p>The third field (“T3”) is an array datatype.  Thus, 
-  “T3” should be accessed as an array of 40 integers. Array 
-  data can only be read or written as a single element, so all 40 
-  integers must be read or written to the third field. The fourth 
-  field (“T4”) is a single string of length 25.</p>
-  
-<!-- NEW PAGE -->
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  typedef struct s1_t {
-  int    a;
-  char  b;
-  double c; 
-  } s1_t;
-
-  typedef struct s2_t {
-  float f1;
-  float f2;
-  } s2_t;
-  hid_t      s1_tid, s2_tid, s3_tid, s4_tid, s5_tid;
-
-  /* Create a datatype for s1 */
-  s1_tid = H5Tcreate (H5T_COMPOUND, sizeof(s1_t));
-  H5Tinsert(s1_tid, “a_name”, HOFFSET(s1_t, a), H5T_NATIVE_INT);
-  H5Tinsert(s1_tid, “b_name”, HOFFSET(s1_t, b), H5T_NATIVE_CHAR);
-  H5Tinsert(s1_tid, “c_name”, HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE);
-
-  /* Create a datatype for s2. *.
-  s2_tid = H5Tcreate (H5T_COMPOUND, sizeof(s2_t));
-  H5Tinsert(s2_tid, “f1”, HOFFSET(s2_t, f1), H5T_NATIVE_FLOAT);
-  H5Tinsert(s2_tid, “f2”, HOFFSET(s2_t, f2), H5T_NATIVE_FLOAT);
-
-  /* Create a datatype for an Array of integers */
-  s3_tid = H5Tarray_create(H5T_NATIVE_INT, RANK, dim);
-
-  /* Create a datatype for a String of 25 characters */
-  s4_tid = H5Tcopy(H5T_C_S1);
-  H5Tset_size(s4_tid, 25);
-
-  /* 
-   * Create a compound datatype composed of one of each of these
-   *  types.
-   * The total size is the sum of the size of each.
-   */ 
-
-  sz = H5Tget_size(s1_tid) + H5Tget_size(s2_tid) + H5Tget_size(s3_tid) 
-       + H5Tget_size(s4_tid);
-  
-  s5_tid = H5Tcreate (H5T_COMPOUND, sz);
-
-  /* insert the component types at the appropriate offsets */
-
-  H5Tinsert(s5_tid, “T1”, 0, s1_tid);
-  H5Tinsert(s5_tid, “T2”, sizeof(s1_t), s2_tid);
-  H5Tinsert(s5_tid, “T3”, sizeof(s1_t)+sizeof(s2_t), s3_tid);
-  H5Tinsert(s5_tid, “T4”, (sizeof(s1_t) +sizeof(s2_t)+ 
-          H5Tget_size(s3_tid)), s4_tid);
-
-  /* 
-   * Create the dataset with this datatype.
-   */
-  dataset = H5Dcreate(file, DATASETNAME, s5_tid, space, H5P_DEFAULT, 
-      H5P_DEFAULT, H5P_DEFAULT);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 39. Create a compound datatype with four members
-        <!-- formerly Figure 46 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-    <img src="Images/Dtypes_fig47.JPG">
-    </td>
-  </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 19. Logical tree for the compound 
-        datatype with four members<!-- formerly Figure 47 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  DATATYPE  H5T_COMPOUND {
-   H5T_COMPOUND {
-      H5T_STD_I32LE “a_name”;
-      H5T_STD_I8LE “b_name”;
-      H5T_IEEE_F64LE “c_name”;
-   } “T1”;
-   H5T_COMPOUND {
-      H5T_IEEE_F32LE “f1”;
-      H5T_IEEE_F32LE “f2”;
-   } “T2”;
-   H5T_ARRAY { [10] H5T_STD_I32LE } “T3”;
-   H5T_STRING {
-      STRSIZE 25;
-      STRPAD H5T_STR_NULLTERM;
-      CSET H5T_CSET_ASCII;
-      CTYPE H5T_C_S1;
-   } “T4”;
-  }</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 40. Output from h5dump for the compound datatype
-        <!-- formerly Figure 48 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-	  <table align="center" border="0" width="100%">
-	    <tr>
-		  <td valign="middle" align="left">a) Compound type ‘s1_t’, size 16 bytes.</td>
-	    </tr>	     	  
-		<tr><td>
-		
-	  <table border="1" align="center" width="100%">
-		<tr>
-	      <td valign="middle" align="center" width="25%"><code>Byte 0</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 1</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 2</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 3</code></td>
-		</tr>
-		<tr>
-		  <td valign="middle" align="center"><code>aaaaaaaa</code></td>
-		  <td valign="middle" align="center"><code>aaaaaaaa</code></td>
-		  <td valign="middle" align="center"><code>aaaaaaaa</code></td>
-		  <td valign="middle" align="center"><code>aaaaaaaa</code></td>
-		</tr>
-		<tr>
-		  <td valign="middle" align="center"><code>Byte 4</code></td>
-		  <td valign="middle" align="center"><code>Byte 5</code></td>
-		  <td valign="middle" align="center"><code>Byte 6</code></td>
-		  <td valign="middle" align="center"><code>Byte 7</code></td>
-		</tr>
-		<tr>
-		  <td valign="middle" align="center"><code>bbbbbbbb</code></td>
-		  <td valign="middle" align="center"><code> </code></td>
-		  <td valign="middle" align="center"><code> </code></td>
-		  <td valign="middle" align="center"><code> </code></td>
-		</tr>
-	  </table>
-	  
-	  <table border="1" align="center" width="100%">
-		<tr>
-	      <td valign="middle" align="center" width="25%"><code>Byte 8</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 9</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 10</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 11</code></td>
-		</tr>
-		<tr>
-		  <td valign="middle" align="center"><code>cccccccc</code></td>
-		  <td valign="middle" align="center"><code>cccccccc</code></td>
-		  <td valign="middle" align="center"><code>cccccccc</code></td>
-		  <td valign="middle" align="center"><code>cccccccc</code></td>
-		</tr>
-		<tr>
-		  <td valign="middle" align="center"><code>Byte 12</code></td>
-		  <td valign="middle" align="center"><code>Byte 13</code></td>
-		  <td valign="middle" align="center"><code>Byte 14</code></td>
-		  <td valign="middle" align="center"><code>Byte 15</code></td>
-		</tr>
-		<tr>
-		  <td valign="middle" align="center"><code>cccccccc</code></td>
-		  <td valign="middle" align="center"><code>cccccccc</code></td>
-		  <td valign="middle" align="center"><code>cccccccc</code></td>
-		  <td valign="middle" align="center"><code>cccccccc</code></td>
-		</tr>
-	  </table>
-	  
-	  </td></tr>
-	  <tr>
-	    <td valign="middle" align="left"> <br />b) Compound type ‘s2_t’, size 8 bytes.</td>
-	  </tr>	  
-
-	  <tr><td>
-      
-	  <table border="1" align="center" width="100%">
-	    <tr>
-		  <td valign="middle" align="center" width="25%"><code>Byte 0</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 1</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 2</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 3</code></td>
-	      </tr>
-		<tr>
-		  <td valign="middle" align="center"><code>ffffffff</code></td>
-		  <td valign="middle" align="center"><code>ffffffff</code></td>
-		  <td valign="middle" align="center"><code>ffffffff</code></td>
-		  <td valign="middle" align="center"><code>ffffffff</code></td>
-		</tr>
-		<tr>
-		  <td valign="middle" align="center"><code>Byte 4</code></td>
-		  <td valign="middle" align="center"><code>Byte 5</code></td>
-		  <td valign="middle" align="center"><code>Byte 6</code></td>
-		  <td valign="middle" align="center"><code>Byte 7</code></td>
-		</tr>
-		<tr>
-		  <td valign="middle" align="center"><code>gggggggg</code></td>
-		  <td valign="middle" align="center"><code>gggggggg</code></td>
-		  <td valign="middle" align="center"><code>gggggggg</code></td>
-		  <td valign="middle" align="center"><code>gggggggg</code></td>
-		</tr>	
-      </table>
-	  
-	  </td></tr>
-      <tr>
-	    <td valign="middle" align="left"> <br />c) Array type ‘s3_tid’, 40 integers, total size 40 bytes.</td>
-	  </tr>
-		
-	  <tr><td>
-	  
-	  <table border="1" align="center" width="100%">
-	    <tr>
-		  <td valign="middle" align="center" width="25%"><code>Byte 0</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 1</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 2</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 3</code></td>
-	      </tr>
-		<tr>
-		  <td valign="middle" align="center"><code>00000000</code></td>
-		  <td valign="middle" align="center"><code>00000000</code></td>
-		  <td valign="middle" align="center"><code>00000000</code></td>
-		  <td valign="middle" align="center"><code>00000000</code></td>
-		</tr>
-		<tr>
-		  <td valign="middle" align="center"><code>Byte 4</code></td>
-		  <td valign="middle" align="center"><code>Byte 5</code></td>
-		  <td valign="middle" align="center"><code>Byte 6</code></td>
-		  <td valign="middle" align="center"><code>Byte 7</code></td>
-		</tr>
-		<tr>
-		  <td valign="middle" align="center"><code>00000000</code></td>
-		  <td valign="middle" align="center"><code>00000000</code></td>
-		  <td valign="middle" align="center"><code>00000000</code></td>
-		  <td valign="middle" align="center"><code>00000001</code></td>
-		</tr>	
-      </table>
-	  
-	  <table align="center" width="100%">
-		<tr>
-		  <td align="center" colspan="4"> ... <br /> </td>
-		</tr>
-	  </table>
-	  
-	  <table border="1" align="center" width="100%">
-        <tr>
-		  <td valign="middle" align="center" width="25%"><code>Byte 36</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 37</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 38</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 39</code></td>
-	      </tr>
-		<tr>
-		  <td valign="middle" align="center"><code>00000000</code></td>
-		  <td valign="middle" align="center"><code>00000000</code></td>
-		  <td valign="middle" align="center"><code>00000000</code></td>
-		  <td valign="middle" align="center"><code>00001010</code></td>
-		</tr>
-	  </table>
-	  
-	  </td></tr>
-      <tr>
-	    <td valign="middle" align="left"> <br />d) String type ‘s4_tid’, size 25 bytes.</td>
-	  </tr>
-	  <tr><td>
-	  
-	  <table border="1" align="center" width="100%">
-		<tr>
-	      <td valign="middle" align="center" width="25%"><code>Byte 0</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 1</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 2</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 3</code></td>
-		</tr>
-		<tr>
-		  <td valign="middle" align="center"><code>‘a’</code></td>
-		  <td valign="middle" align="center"><code>‘b’</code></td>
-		  <td valign="middle" align="center"><code>‘c’</code></td>
-		  <td valign="middle" align="center"><code>‘d’</code></td>
-		</tr>
-	  </table>
-	  
-	  <table align="center" width="100%">
-		<tr>
-		  <td align="center" colspan="4"> ... <br /> </td>
-		</tr>
-	  </table>
-	  
-	  <table border="1" align="center" width="100%">
-		<tr>
-	      <td valign="middle" align="center" width="25%"><code>Byte 24</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 25</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 26</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 27</code></td>
-		</tr>
-		<tr>
-		  <td valign="middle" align="center"><code>00000000</code></td>
-		  <td valign="middle" align="center"><code> </code></td>
-		  <td valign="middle" align="center"><code> </code></td>
-		  <td valign="middle" align="center"><code> </code></td>
-		</tr>
-	  </table>
-	  
-	  </td></tr>	  
-	  </table>
-	  
-    </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 20. The storage layout for the 
-        four member datatypes<!-- formerly Figure 49 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dtypes_fig50.JPG" width="550">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 21. The storage layout of the combined four members
-        <!-- formerly Figure 50 --></b>
-        <hr color="green" size="3"/></td>
-  </tr>
-</table>
-<br />
-<br />
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/></td>
-        </tr>
-    <tr align="center">
-        <td align="center"><img src="Images/Dtypes_fig51.JPG" 
-        width="550"></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 22. The layout of the dataset
-        <!-- formerly Figure 51 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-<!-- 9.1.10, the JPG above, Dtypes_fig51.jpg, spells Element incorrectly -->
-<!-- 9.1.10, the section above has text and many examples and figures. 
-Should the text be interspersed with the examples and figures at some 
-point? -->
-</table>
-<br />
-
-
-
-<!-- NEW PAGE -->
-<h4>6.7.2. Analyzing and Navigating a Compound Datatype</h4>
-  
-  <p>A complicated compound datatype can be analyzed piece by piece to 
-  discover the exact storage layout. In the example above, the outer 
-  datatype is analyzed to discover that it is a compound datatype with 
-  four members. Each member is analyzed in turn to construct a complete 
-  map of the storage layout.</p>
-  
-  <p>The example below <!-- formerly Figure 52 -->shows an example of code 
-  that partially analyzes a nested 
-  compound datatype. The name and overall offset and size of the component 
-  datatype is discovered, and then its type is analyzed depending on the 
-  datatype class. Through this method, the complete storage layout can be 
-  discovered.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  s1_tid = H5Dget_type(dataset);
-
-  if (H5Tget_class(s1_tid) == H5T_COMPOUND) {
-      printf(“COMPOUND DATATYPE {\n”);
-      sz = H5Tget_size(s1_tid);
-      nmemb = H5Tget_nmembers(s1_tid);
-      printf(“  %d bytes\n”,sz);
-      printf(“  %d members\n”,nmemb);
-      for (i =0; i < nmemb; i++) {
-        s2_tid = H5Tget_member_type(s1_tid, i);
-        if (H5Tget_class(s2_tid) == H5T_COMPOUND) {
-            /* recursively analyze the nested type. */
-      
-        } else if (H5Tget_class(s2_tid) == H5T_ARRAY) {
-            sz2 = H5Tget_size(s2_tid);
-            printf(“  %s: NESTED ARRAY DATATYPE offset %d size %d  {\n”,
-                H5Tget_member_name(s1_tid, i),
-                H5Tget_member_offset(s1_tid, i),
-                 sz2);
-                H5Tget_array_dims(s2_tid, dim);
-                 s3_tid = H5Tget_super(s2_tid);
-                /* Etc., analyze the base type of the array */
-        } else {
-                /* analyze a simple type */
-                printf(“    %s: type code %d offset %d size %d\n”,
-                              H5Tget_member_name(s1_tid, i),
-                              H5Tget_class(s2_tid),
-                              H5Tget_member_offset(s1_tid, i),
-                              H5Tget_size(s2_tid));
-        }
-        /* and so on�. */</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 41. Analyzing a compound datatype and its members
-        <!-- formerly Figure 52--></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="LCDtypeObj">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-<br />
-
-<!-- NEW PAGE -->
-<a name="LCDtypeObj">
-<h3 class=pagebefore>6.8. Life Cycle of the Datatype Object</h3>
-</a>
-
-  <p>Application programs access HDF5 datatypes through identifiers. 
-  Identifiers are obtained by creating a new datatype or by copying 
-  or opening an existing datatype. The identifier can be used until 
-  it is closed or until the library shuts down. See items a and b in 
-  the figure below. <!-- formerly Figure 53a,b --> By default, a 
-  datatype is <em>transient</em>, and it disappears when it is closed. </p>
-  
-  <p>When a dataset or attribute is created (<code>H5Dcreate</code> or 
-  <code>H5Acreate</code>), its datatype is stored in the HDF5 
-  file as part of the dataset or attribute object. See item c in 
-  the figure below. Once an object created, its datatype cannot 
-  be changed or deleted. The datatype can be accessed by calling 
-  <code>H5Dget_type</code>, <code>H5Aget_type</code>, 
-  <code>H5Tget_super</code>, or <code>H5Tget_member_type</code>. 
-  See item d in the figure below. These calls return an identifier to a 
-  <em>transient</em> copy of the datatype of the dataset or attribute 
-  unless the datatype is a committed datatype. </p>
-  
-  <p>Note that when an object is created, the stored datatype is a copy 
-  of the transient datatype. If two objects are created with the same 
-  datatype, the information is stored in each object with the same 
-  effect as if two different datatypes were created and used. </p>
-  
-  <p>A transient datatype can be stored using <code>H5Tcommit</code> in the 
-  HDF5 file as an independent, named object, called a committed datatype. 
-  Committed datatypes were formerly known as named datatypes. 
-  See item e in the figure below. Subsequently, when a committed datatype 
-  is opened with <code>H5Topen</code> (item f), or is obtained with 
-  <code>H5Tget_type</code> or similar call (item k), the return 
-  is an identifier to a transient copy of the stored datatype. The identifier 
-  can be used in the same way as other datatype identifiers except that 
-  the committed datatype cannot be modified. When a committed datatype is 
-  copied with <code>H5Tcopy</code>, the return is a new, modifiable, 
-  transient datatype object (item f). </p>
-  
-  <p>When an object is created using a committed datatype (<code>H5Dcreate</code>, 
-  <code>H5Acreate</code>), the stored datatype is used without copying 
-  it to the object. See item j in the figure below. In this case, if 
-  multiple objects are created using the same committed datatype, they 
-  all share the exact same datatype object. This saves space and makes 
-  clear that the datatype is shared. Note that a committed datatype can 
-  be shared by objects within the same HDF5 file, but not by objects 
-  in other files. For more information on copying committed datatypes to 
-  other HDF5 files, see the 
-  “Copying Committed Datatypes with H5Ocopy” topic in 
-  the “<a href="17_Additional.html">Additional Resources</a>” 
-  chapter.</p>
-  
-  <p>A committed datatype can be deleted from the file by calling 
-  <code>H5Ldelete</code> which replaces <code>H5Gunlink</code>. 
-  See item i in the figure below.  If one or more objects are still using the 
-  datatype, the committed datatype cannot be accessed with <code>H5Topen</code>, 
-  but will not be removed from the file until it is no longer used. 
-  <code>H5Tget_type</code> and similar calls will return a transient 
-  copy of the datatype.</p>
-
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-    <img src="Images/Dtypes_fig53.JPG">
-    </td>
-  </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 23. Life cycle of a datatype
-        <!-- formerly Figure 53 --> </b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>Transient datatypes are initially modifiable. Note that 
-  when a datatype is copied or when it is written to the file (when an 
-  object is created) or the datatype is used to create a composite 
-  datatype, a copy of the current state of the datatype is used. If 
-  the datatype is then modified, the changes have no effect on 
-  datasets, attributes, or datatypes that have already been created. 
-  See the figure below.</p>
-
-  <p>A transient datatype can be made <em>read-only</em> 
-  (<code>H5Tlock</code>). Note that the datatype is still transient, 
-  and otherwise does not change. A datatype that is <em>immutable</em> 
-  is <em>read-only</em> but cannot be closed except when the entire 
-  library is closed. The predefined types such as 
-  <code>H5T_NATIVE_INT</code> are <em>immutable transient</em> types.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dtypes_fig54.JPG">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 24. Transient datatype states: modifiable, read-only, and 
-        immutable <!-- formerly Figure 54 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>To create two or more datasets that share a common datatype, 
-  first commit the datatype, and then use that datatype to create the 
-  datasets. See the example below.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  hid_t t1 = ...some transient type...;
-  H5Tcommit (file, “shared_type”, t1, H5P_DEFAULT, H5P_DEFAULT, 
-      H5P_DEFAULT);
-  hid_t dset1 = H5Dcreate (file, “dset1”, t1, space, H5P_DEFAULT, 
-      H5P_DEFAULT, H5P_DEFAULT);
-  hid_t dset2 = H5Dcreate (file, “dset2”, t1, space, H5P_DEFAULT, 
-      H5P_DEFAULT, H5P_DEFAULT);
-               
-
-  hid_t dset1 = H5Dopen (file, “dset1”, H5P_DEFAULT);
-  hid_t t2 = H5Dget_type (dset1);
-  hid_t dset3 = H5Dcreate (file, “dset3”, t2, space, H5P_DEFAULT, 
-      H5P_DEFAULT, H5P_DEFAULT);
-  hid_t dset4 = H5Dcreate (file, “dset4”, t2, space, H5P_DEFAULT, 
-      H5P_DEFAULT, H5P_DEFAULT);</pre> </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 42. Create a shareable datatype
-        <!-- formerly Figure 55 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-
-
-<!-- NEW PAGE -->
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 23. Datatype APIs</b> 
-        <!-- formerly Table 24 --></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="50%"><b>Function</b></td>
-        <td width="50%"><b>Description</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>hid_t H5Topen (hid_t location, <br />const 
-        char *name)</code></td>
-        <td>A committed datatype can be opened by 
-        calling this function, which returns a datatype identifier. The 
-        identifier should eventually be released by calling 
-        <code>H5Tclose()</code> to release resources. The committed 
-        datatype returned by this function is read-only or a negative 
-        value is returned for failure. The location is either a file or 
-        group identifier.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>herr_t H5Tcommit (hid_t location, 
-        const char *name, hid_t type, H5P_DEFAULT, H5P_DEFAULT, 
-        <br />H5P_DEFAULT)</code></td>
-        <td>A transient datatype (not immutable) can 
-        be written to a file and turned into a committed datatype by calling this 
-        function. The location is either a file or group identifier and when 
-        combined with name refers to a new committed datatype.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>htri_t H5Tcommitted 
-        (hid_t type)</code></td>
-        <td>A type can be queried to determine 
-        if it is a committed type or a transient type. If this function returns a 
-        positive value then the type is committed. Datasets which return committed 
-        datatypes with <code>H5Dget_type()</code> are able to share the 
-        datatype with other datasets in the same file.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="Dtransfer">
-<div align=right>
-<a href="#TOP"><font size="-1">(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-<br />
-<!-- NEW PAGE -->
-<a name="Dtransfer">
-<h3 class=pagebefore>6.9. Data Transfer: Datatype Conversion and Selection</h3>
-</a>
-
-  <p>When data is transferred (write or read), the storage layout of the data 
-  elements may be different. For example, an integer might be stored on disk 
-  in big-endian byte order and read into memory with little-endian byte order. 
-  In this case, each data element will be transformed by the HDF5 Library 
-  during the data transfer.</p>
-  
-  <p>The conversion of data elements is controlled by specifying the datatype 
-  of 
-  the source and specifying the intended datatype of the destination. 
-  The storage format on disk is the datatype specified when the dataset 
-  is created. The datatype of memory must be specified in the library call.</p>
-  
-  <p>In order to be convertible, the datatype of the source and destination 
-  must have the same datatype class (with the exception of enumeration 
-  type). Thus, integers can be converted to other integers, and floats to 
-  other floats, but integers cannot (yet) be converted to floats. For 
-  each atomic datatype class, the possible conversions are defined. An 
-  enumeration datatype can be converted to an integer or a 
-  floating-point number datatype.</p>
-  
-  <p>Basically, any datatype can be converted to another datatype of the same 
-  datatype class. The HDF5 Library automatically converts all properties. 
-  If the destination is too small to hold the source value then an overflow 
-  or underflow exception occurs. If a handler is defined with the 
-  <code>H5Pset_type_conv_cb</code> function, 
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  (see Chapter??) 
-  ] ] ]</span>
--->
-  it will be called. Otherwise, 
-  a default action will be performed. The table below <!-- formerly Table 25-->
-  summarizes the default actions.</p>
-  
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Table 24. Default actions for datatype conversion exceptions</b>
-        <!-- formerly Table 25 --></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td><b>Datatype Class</b></td>
-        <td><b>Possible Exceptions</b></td>
-        <td><b>Default Action</b></td>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Integer</td>
-        <td>Size, offset, pad</td>
-        <td> </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Float</td>
-        <td>Size, offset, pad, ebits</td>
-        <td> </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>String</td>
-        <td>Size</td>
-        <td>Truncates, zero terminate if required.</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Enumeration</td>
-        <td>No field</td>
-        <td>All bits set</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-
-
-  <p>For example, when reading data from a dataset, the source datatype is the 
-  datatype set when the dataset was created, and the destination datatype is 
-  the description of the storage layout in memory. The destination datatype 
-  must be specified in 
-  the <code>H5Dread</code> call. The example below <!-- formerly Figure 56 --> 
-  shows an example of reading a dataset 
-  of 32-bit integers. The figure <!-- formerly Figure 57 -->below the example 
-  shows the data transformation 
-  that is performed.</p>
-  
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  /* Stored as H5T_STD_BE32 */
-  /* Use the native memory order in the destination */
-  mem_type_id = H5Tcopy(H5T_NATIVE_INT);
-  status = H5Dread(dataset_id, mem_type_id, mem_space_id, 
-                  file_space_id,  xfer_plist_id,  buf );</pre> </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 43. Specify the destination datatype 
-        with <code>H5Dread</code><!-- formerly Figure 56 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-
-<!-- NEW PAGE -->
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-	  
-	<table align="center" width="100%">
-	  <tr><td>
-	  
-	  <table align="left">
-	    <tr>
-		  <td align="left">Source Datatype: <code>H5T_STD_BE32</code></td>
-	      </tr>
-	  </table>
-	  
-	  </td></tr>
-	  <tr><td>
-	  
-	  <table align="left" border="1" width="100%">
-	    <tr>
-		  <td valign="middle" align="center" width="25%"><code>Byte 0</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 1</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 2</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 3</code></td>
-	      </tr>
-		<tr>
-		  <td valign="middle" align="center"><code>aaaaaaaa</code></td>
-		  <td valign="middle" align="center"><code>bbbbbbbb</code></td>
-		  <td valign="middle" align="center"><code>cccccccc</code></td>
-		  <td valign="middle" align="center"><code>dddddddd</code></td>
-		</tr>
-		<tr>
-		  <td valign="middle" align="center"><code>Byte 4</code></td>
-		  <td valign="middle" align="center"><code>Byte 5</code></td>
-		  <td valign="middle" align="center"><code>Byte 6</code></td>
-		  <td valign="middle" align="center"><code>Byte 7</code></td>
-		</tr>
-		<tr>
-		  <td valign="middle" align="center"><code>wwwwwwww</code></td>
-		  <td valign="middle" align="center"><code>xxxxxxxx</code></td>
-		  <td valign="middle" align="center"><code>yyyyyyyy</code></td>
-		  <td valign="middle" align="center"><code>zzzzzzzz</code></td>
-		</tr>
-	  </table>
-		
-	  </td></tr>
-	  <tr>
-	    <td>. . . .</td>
-	  </tr>
-	  <tr><td>
-	  
-	  <table align="center" width="100%">
-	    <tr>
-		  <td width="45%"> </td>
-		  <td width="10%" align="center"><img src="Images/Dtypes_fig57_arrow.jpg"></td>
-		  <td width="45%" align="left">Automatically byte swapped<br /> during the <code>H5Dread</code></td>
-	      </tr>
-	  </table>
-	  
-	  </td></tr>
-	  <tr><td>
-	  
-      <table align="left">
-	    <tr>
-		  <td align="left">Destination Datatype: <code>H5T_STD_LE32</code></td>
-	      </tr>
-	  </table>
-	  
-      </td></tr>
-	  <tr><td>
-	  
-	  <table align="left" border="1" width="100%">
-	    <tr>
-		  <td valign="middle" align="center" width="25%"><code>Byte 0</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 1</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 2</code></td>
-		  <td valign="middle" align="center" width="25%"><code>Byte 3</code></td>
-	      </tr>
-		<tr>
-		  <td valign="middle" align="center"><code>bbbbbbbb</code></td>
-		  <td valign="middle" align="center"><code>aaaaaaaa</code></td>
-		  <td valign="middle" align="center"><code>dddddddd</code></td>
-		  <td valign="middle" align="center"><code>cccccccc</code></td>
-		</tr>
-		<tr>
-		  <td valign="middle" align="center"><code>Byte 4</code></td>
-		  <td valign="middle" align="center"><code>Byte 5</code></td>
-		  <td valign="middle" align="center"><code>Byte 6</code></td>
-		  <td valign="middle" align="center"><code>Byte 7</code></td>
-		</tr>
-		<tr>
-		  <td valign="middle" align="center"><code>xxxxxxxx</code></td>
-		  <td valign="middle" align="center"><code>wwwwwwww</code></td>
-		  <td valign="middle" align="center"><code>zzzzzzzz</code></td>
-		  <td valign="middle" align="center"><code>yyyyyyyy</code></td>
-		</tr>
-	  </table>
-	  
-      </td></tr>
-	  <tr>
-	    <td>. . . .</td>
-	  </tr>
-	  <tr><td>	  
-	</table>
-	
-    </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 25. Layout of a datatype conversion
-        <!-- formerly Figure 57 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-
-  <p>One thing to note in the example above <!-- formerly Figure 56 -->is the 
-  use of the predefined native datatype <code>H5T_NATIVE_INT</code>. 
-  Recall that in this example, the data was stored as a 4-bytes 
-  in big-endian order. The application wants to read this data into an array 
-  of integers in memory. Depending on the system, the storage layout of memory 
-  might be either big or little-endian, so the data may need to be transformed 
-  on some platforms and not on others.  The <code>H5T_NATIVE_INT</code> type 
-  is set by the HDF5 Library to be the correct type to describe the storage 
-  layout of the memory on the system. Thus, the code in the example above 
-  <!-- Figure 56 -->will work correctly on any platform, performing a 
-  transformation when needed.</p>
-  
-  <p>There are predefined native types for most atomic datatypes, and 
-  these can be combined in composite datatypes. In general, the predefined 
-  native datatypes should always be used for data stored in memory.</p>
-  
-
-<table align="center" width="300" >
-    <tr >
-        <td style="background-color:#E6F2E6">
-        <hr color="green" size="3"/>
-        <b>Storage Properties </b><br />
-        <p>Predefined native datatypes describe the storage properties 
-        of memory.</p>
-        <hr color="green" size="3"/></td>
-        </tr>
-  </table>
-<br />
-
-
-
-  <p>For composite datatypes, the component atomic datatypes will be converted. 
-  For a variable-length datatype, the source and destination must have 
-  compatible base datatypes. For a fixed-size string datatype, the length 
-  and padding of the strings will be converted. Variable-length strings 
-  are converted as variable-length datatypes.</p>
-  
-  <p>For an array datatype, the source and destination must have the same rank 
-  and dimensions, and the base datatype must be compatible.  For example an 
-  array datatype of 4 x 3 32-bit big-endian integers can be transferred to an 
-  array datatype of 4 x 3 little-endian integers, but not to a 3 x 4 array.</p>
-  
-  <p>For an enumeration datatype, data elements are converted by matching the 
-  symbol names of the source and destination datatype. The figure below 
-  <!-- formerly Figure 58 -->shows an example 
-  of how two enumerations with the same names and different values would be 
-  converted. The value ‘2’ in the source dataset would be converted 
-  to ‘0x0004’ in the destination.</p>
-  
-  <p>If the source data stream contains values which are not in the domain of 
-  the conversion map then an overflow exception is raised within the library.</p>
-  
-
-<table width="400" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-	
-	<table border="0">
-	  <tr>
-	    <td width="%">       0 </td>
-		<td width="%">  </td>
-		<td width="%">RED</td>
-		<td width="%"><img src="Images/Dtypes_fig58_arrow.jpg"></td>
-		<td align="right" width="%">RED</td>
-		<td width="%">  </td>
-		<td width="%"> 0x0001</td>
-	  </tr>
-	  <tr>
-	    <td width="%">       1 </td>
-		<td width="%">  </td>
-		<td width="%">GREEN  </td>
-		<td width="%"><img src="Images/Dtypes_fig58_arrow.jpg"></td>
-		<td align="right" width="%">  GREEN</td>
-		<td width="%">  </td>
-		<td width="%"> 0x0002</td>
-	  </tr>
-	  <tr>
-	    <td width="%">       2 </td>
-		<td width="%">  </td>
-		<td width="%">BLUE</td>
-		<td width="%"><img src="Images/Dtypes_fig58_arrow.jpg"></td>
-		<td align="right" width="%">BLUE</td>
-		<td width="%">  </td>
-		<td width="%"> 0x0004</td>
-	  </tr>
-	  <tr>
-	    <td width="%">       3 </td>
-		<td width="%">  </td>
-		<td width="%">WHITE</td>
-		<td width="%"><img src="Images/Dtypes_fig58_arrow.jpg"></td>
-		<td align="right" width="%">WHITE</td>
-		<td width="%">  </td>
-		<td width="%"> 0x0008</td>
-	  </tr>
-	  <tr>
-	    <td width="%">       4 </td>
-		<td width="%">  </td>
-		<td width="%">BLACK  </td>
-		<td width="%"><img src="Images/Dtypes_fig58_arrow.jpg"></td>
-		<td align="right" width="%">  BLACK</td>
-		<td width="%">  </td>
-		<td width="%"> 0x0010</td>
-	  </tr>
-	</table>
-    </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 26. An enum datatype conversion
-        <!-- formerly Figure 58 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>The library also allows conversion from enumeration to a numeric 
-  datatype. A numeric datatype is either an integer or a floating-point 
-  number. This conversion can simplify the application program because 
-  the base type for an enumeration datatype is an integer datatype. The 
-  application program can read the data from a dataset of enumeration 
-  datatype in file into a memory buffer of numeric datatype. And it can 
-  write enumeration data from memory into a dataset of numeric datatype 
-  in file, too. </p>
-
-  <p>For compound datatypes, each field of the source and destination 
-  datatype is converted according to its type. The name of the fields 
-  must be the same in the source and the destination in order for the 
-  data to be converted. </p>
-  
-  <p>The example below <!-- formerly Figure 59 -->shows the compound 
-  datatypes shows sample code to create a 
-  compound datatype with the fields aligned on word boundaries (s1_tid) 
-  and with the fields packed (s2_tid). The former is suitable as a description 
-  of the storage layout in memory, the latter would give a more compact store 
-  on disk. These types can be used for transferring data, with 
-  <code>s2_tid</code> used to create the dataset, and 
-  <code>s1_tid</code> used as the memory datatype.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  typedef struct s1_t {                
-    int    a;         
-    char  b;                  
-    double c;          
-  } s1_t;
-          s1_tid = H5Tcreate (H5T_COMPOUND, sizeof(s1_t));
-  H5Tinsert(s1_tid, “a_name”, HOFFSET(s1_t, a), H5T_NATIVE_INT);
-  H5Tinsert(s1_tid, “b_name”, HOFFSET(s1_t, b), H5T_NATIVE_CHAR);
-  H5Tinsert(s1_tid, “c_name”, HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE);
-
-  s2_tid = H5Tcopy(s1_tid);
-  H5Tpack(s2_tid);</pre> </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 44. Create an aligned and packed compound datatype 
-        <!-- formerly Figure 59 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>When the data is transferred, the fields within each data element will be 
-  aligned according to the datatype specification. The figure below 
-  <!-- formerly Figure 60 -->shows how one data 
-  element would be aligned in memory and on disk. Note that the size and byte 
-  order of the elements might also be converted during the transfer.</p>
-  
-  <p>It is also possible to transfer some of the fields of compound datatypes. 
-  Based on the example above, <!-- formerly Figure 59 --> the example below 
-  <!-- formerly Figure 61 -->shows a compound datatype 
-  that selects the first and third fields of the <code>s1_tid</code>. 
-  The second datatype can be used as the memory datatype, in which case data 
-  is read from or written to these two fields, while skipping the middle field. 
-  The second figure below <!-- formerly Figure 62 -->shows the layout for 
-  two data elements.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dtypes_fig60.JPG" width="550">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 27. Alignment of a compound datatype 
-        <!-- formerly Figure 60 --></b>
-        <hr color="green" size="3"/></td>
-  </tr>
-</table>
-<br />
-<br />
-
-
-
-<!-- NEW PAGE -->
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  typedef struct s1_t {                
-    int    a;         
-    char  b;                  
-    double c;          
-  } s1_t;
-
-  typedef struct s2_t {   /* two fields from s1_t */             
-     int    a;                           
-     double c;          
-  } s2_t;
- 
-        s1_tid = H5Tcreate (H5T_COMPOUND, sizeof(s1_t));
-  H5Tinsert(s1_tid, “a_name”, HOFFSET(s1_t, a), H5T_NATIVE_INT);
-  H5Tinsert(s1_tid, “b_name”, HOFFSET(s1_t, b), H5T_NATIVE_CHAR);
-  H5Tinsert(s1_tid, “c_name”, HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE);
-
-  s2_tid = H5Tcreate (H5T_COMPOUND, sizeof(s2_t));
-  H5Tinsert(s1_tid, “a_name”, HOFFSET(s2_t, a), H5T_NATIVE_INT);
-  H5Tinsert(s1_tid, “c_name”, HOFFSET(s2_t, c), H5T_NATIVE_DOUBLE);
-        </pre> </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 45. Transfer some fields of a compound datatype
-        <!-- formerly Figure 61 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-
-<!-- NEW PAGE -->
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dtypes_fig62.JPG" width="550">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 28. Layout when an element is skipped
-        <!-- formerly Figure 62 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-
-<!-- NEW PAGE -->
-<a name="TextDescriptions">
-<h3 class=pagebefore>6.10. Text Descriptions of Datatypes: Conversion to 
-and from</h3></a>
-
-  <p>HDF5 provides a means for generating a portable and human-readable 
-    text descripition of a datatype and 
-    for generating a datatype from such a text description.
-    This capability is particularly useful 
-    for creating complex datatypes in a single step,
-    for creating a text description of a datatype for debugging purposes, 
-    and for creating a portable datatype definition that can then be used
-    to recreate the datatype on many platforms or in other applications.</p>
-    
-  <p>These tasks are handled by two functions provided in the HDF5 high-level 
-    library (<a href="../HL/RM_H5LT.html" target="ExtWin">H5HL</a>):</p>
-    <div align="left">
-    <table >
-      <tr valign="top" align="left">
-        <td><span class="codeText">H5LTtext_to_dtype</span>    </td>
-	<td>Creates an HDF5 datatype in a single step.</td>
-      </tr><tr valign="top" align="left">
-        <td><span class="codeText">H5LTdtype_to_text</span></td>
-	<td>Translates an HDF5 datatype into a text description.</td>
-      </tr>
-    </table>
-    </div>
-  <p>Note that this functionality requires that the 
-    HDF5 High-Level Library (H5LT) be installed. 
-<!-- editingComment
-    See 
-    <span class="editingComment">< < Quick Start > ></span>.
--->
-  <p>While <span class="codeText">H5LTtext_to_dtype</span> can be used to 
-    generate any sort of datatype, it is particularly useful for 
-    complex datatypes. </p>
-    
-  <p><span class="codeText">H5LTdtype_to_text</span> is most likely to be
-    used in two sorts of situations: 
-    when a datatype must be closely examined for debugging purpose 
-    or to create a portable text description of the datatype
-    that can then be used to recreate the datatype on other platforms 
-    or in other applications.</p>
-
-   <p>These two functions work for all valid HDF5 datatypes
-     except time, bitfield, and reference datatypes.</p>
-
-  <p>The currently supported text format used by 
-    <span class="codeText">H5LTtext_to_dtype</span> and 
-    <span class="codeText">H5LTdtype_to_text</span> is the
-    data description language (DDL) and conforms to the 
-    <a href="../ddl.html" target="ExtWin"><cite>HDF5 DDL</cite></a>.  
-    The portion of the <cite>HDF5 DDL</cite> that defines HDF5 datatypes  
-    appears below.
-  </p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  <datatype> ::= <atomic_type> | <compound_type> | <array_type> |
-          <variable_length_type>
-
-  <atomic_type> ::= <integer>  | <float>  | <time>      | <string> |
-                    <bitfield> | <opaque> | <reference> | <enum>
-
-  <integer> ::=  H5T_STD_I8BE     | H5T_STD_I8LE      |
-                 H5T_STD_I16BE    | H5T_STD_I16LE     |
-                 H5T_STD_I32BE    | H5T_STD_I32LE     |
-                 H5T_STD_I64BE    | H5T_STD_I64LE     |
-                 H5T_STD_U8BE     | H5T_STD_U8LE      |
-                 H5T_STD_U16BE    | H5T_STD_U16LE     |
-                 H5T_STD_U32BE    | H5T_STD_U32LE     |
-                 H5T_STD_U64BE    | H5T_STD_U64LE     |
-                 H5T_NATIVE_CHAR  | H5T_NATIVE_UCHAR  |
-                 H5T_NATIVE_SHORT | H5T_NATIVE_USHORT |
-                 H5T_NATIVE_INT   | H5T_NATIVE_UINT   |
-                 H5T_NATIVE_LONG  | H5T_NATIVE_ULONG  |
-                 H5T_NATIVE_LLONG | H5T_NATIVE_ULLONG
-
-  <float> ::= H5T_IEEE_F32BE   | H5T_IEEE_F32LE     |
-              H5T_IEEE_F64BE   | H5T_IEEE_F64LE     |
-              H5T_NATIVE_FLOAT | H5T_NATIVE_DOUBLE  |
-              H5T_NATIVE_LDOUBLE
-
-  <time> ::= TBD
-
-  <string> ::= H5T_STRING { STRSIZE <strsize> ;
-    STRPAD <strpad> ;
-    CSET <cset> ;
-    CTYPE <ctype> ;}
-  
-  <strsize> ::= <int_value> | H5T_VARIABLE
-  <strpad> ::= H5T_STR_NULLTERM | H5T_STR_NULLPAD | H5T_STR_SPACEPAD
-  <cset> ::= H5T_CSET_ASCII | H5T_CSET_UTF8
-  <ctype> ::= H5T_C_S1 | H5T_FORTRAN_S1
-
-  <bitfield> ::= TBD
-
-  <opaque> ::= H5T_OPAQUE { OPQ_SIZE <opq_size>;
-            OPQ_TAG <opq_tag>; }
-  opq_size ::= <int_value>
-  opq_tag ::= "<string>"
-
-  <reference> ::= Not supported
-
-  <compound_type> ::= H5T_COMPOUND { <member_type_def>+ }
-  <member_type_def> ::= <datatype> <field_name> <offset><font size=1.7>opt</font> ;
-  <field_name> ::= "<identifier>"
-  <offset> ::= : <int_value>
-
-  <variable_length_type> ::= H5T_VLEN { <datatype> }
-
-  <array_type> ::= H5T_ARRAY { <dim_sizes> <datatype> }
-  <dim_sizes> ::= [<dimsize>] | [<dimsize>] <dim_sizes>
-  <dimsize> ::= <int_value>
-
-  <enum> ::= H5T_ENUM { <enum_base_type>; <enum_def>+ }
-  <enum_base_type> ::= <integer>
-  // Currently enums can only hold integer type data, but they may be 
-  //expanded in the future to hold any datatype
-  <enum_def> ::= <enum_symbol> <enum_val>;
-  <enum_symbol> ::= "<identifier>"
-  <enum_val> ::= <int_value>
-        </pre>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 46. The definition of HDF5 datatypes from the 
-        <!-- formerly Figure 63: -->
-        <a href="../ddl.html" target="ExtWin"><cite>HDF5 DDL</cite></a></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>The definitions of opaque and compound datatype above are  
-    revised for HDF5 Release 1.8.  In Release 1.6.5. and earlier, 
-    they were were defined as follows:
-  </p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  <opaque> ::= H5T_OPAQUE { <identifier> }
-
-
-  <compound_type> ::= H5T_COMPOUND { <member_type_def>+ }
-  <member_type_def> ::= <datatype> <field_name> ;
-  <field_name> ::= <identifier></pre>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 47. 
-        <!-- formerly Figure 64: -->
-        Old definitions of the opaque and compound datatypes</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-
-<h4><em>Examples</em></h4>
-
-  <p>The code sample below illustrates the use of
-    <span class="codeText">H5LTtext_to_dtype</span> to generate a
-    variable-length string datatype.
-  </p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  hid_t   dtype;
-  if((dtype = H5LTtext_to_dtype(“H5T_STRING { 
-                                             STRSIZE H5T_VARIABLE; 
-                                             STRPAD H5T_STR_NULLPAD; 
-                                             CSET H5T_CSET_ASCII; 
-                                             CTYPE H5T_C_S1; 
-                                            }”, H5LT_DDL))<0)
-          goto out;</pre>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 48. Creating a variable-length string datatype from 
-        a text description<!-- formerly Figure 65: --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>The code sample below illustrates the use of
-    <span class="codeText">H5LTtext_to_dtype</span> to generate a
-    complex array datatype.
-  </p>
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  hid_t   dtype;
-  if((dtype = H5LTtext_to_dtype(“H5T_ARRAY { [5][7][13] H5T_ARRAY 
-                                             { [17][19] H5T_COMPOUND
-                                               {                 
-                                                        H5T_STD_I8BE 
-                                                          \“arr_compound_1\”; 
-                                                        H5T_STD_I32BE 
-                                                          \“arr_compound_2\”; 
-                                               } 
-                                             } 
-                                           }”, H5LT_DDL))<0)
-          goto out;</pre>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 49. <!-- formerly Figure 66: -->
-        Creating a complex array datatype from a text description</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-<br />
-
-<!-- NEW PAGE -->
-</body>
-</html> 
-
-
diff --git a/html/UG/OldHtmlSource/12_Dataspaces.html b/html/UG/OldHtmlSource/12_Dataspaces.html
deleted file mode 100755
index f93d0b4..0000000
--- a/html/UG/OldHtmlSource/12_Dataspaces.html
+++ /dev/null
@@ -1,3001 +0,0 @@
-<!doctype HTML public "-//W3C//DTD HTML 4.0 Frameset//EN">
-<html>
-<head>
-<title>Chapter 7: HDF5 Dataspaces and Partial I/O</title>
-
-<!--(Meta)==========================================================-->
-
-<!--(Links)=========================================================-->
-
-<!--( Begin styles definition )=====================================-->
-<link href="ed_styles/NewUGelect.css" rel="stylesheet" type="text/css">
-<!--( End styles definition )=======================================-->
-
-</head> 
-
-<body>
-
-<!-- #BeginLibraryItem "/ed_libs/Copyright.lbi" -->
-<!--
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-  * Copyright by The HDF Group.                                               *
-  * Copyright by the Board of Trustees of the University of Illinois.         *
-  * All rights reserved.                                                      *
-  *                                                                           *
-  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
-  * terms governing use, modification, and redistribution, is contained in    *
-  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
-  * of the source code distribution tree; Copyright.html can be found at the  *
-  * root level of an installed copy of the electronic HDF5 document set and   *
-  * is linked from the top-level documents page.  It can also be found at     *
-  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
-  * access to either file, you may request a copy from help at hdfgroup.org.     *
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- -->
-<!-- #EndLibraryItem --><!-- HEADER LEFT "HDF5 User's Guide" -->
-<!-- HEADER RIGHT "HDF5 Dataspaces and Partial I/O" -->
-
-<!--( TOC )=========================================================-->
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ('\
-<table x-use-null-cells\
-                align="right"\
-		width="240"\
-		cellspacing="0"\
-		class="tocTable">\
-  <tr valign="top"> \
-    <td class="tocTableHeaderCell" colspan="2"> \
-        <span class="TableHead">Chapter Contents</span></td>\
-  </tr>\
--->
-<!-- Table Version 3 -->\
-<!--
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Intro">1.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Intro">Introduction</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#DSpaceFunctSums">2.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#DSpaceFunctSums">Dataspace (H5S) Function Summaries</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#DefDataObjs">3.1</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#DefDataObjs">Dataspace Objects</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#ProgModel">3.2</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#ProgModel">Programming Model</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#DTransfer">4.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#DTransfer">Dataspaces and Data Transfer</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#DSelectTransfer">5.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#DSelectTransfer">Selection Operations and Data Transfer</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#DRegions">6.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#DRegions">References to Dataset Regions</a>\
-	  </td>\
-  </tr>\
-\
-  <tr valign="top"> \
-    <td class="tocTableContentCell"> \
--->
-<!-- editingComment -- "tocTableContentCell" and "tocTableContentCell4" \
--->\
-<!-- are the table-closing cell class.\
-    <td class="tocTableContentCell2"> \
--->\
-<!--
-      <a href="#Programs">7.</a></td>\
-    <td class="tocTableContentCell4">\
-	  <a href="#Programs">Sample Programs</a>\
-  </td></tr>\
-</table>\
-')
--->
-</SCRIPT>
-<!--(End TOC)=======================================================-->
-
-<div align="center">
-<a name="TOP">
-<h2>Chapter 7<br /><font size="6">HDF5 Dataspaces and Partial I/O</font></h2>
-</a>
-</div>
-
-<!--
-<dir>
-<h1 class="editingcomment" align="center">- - - DRAFT - - -</h1>
-</dir>
--->
-
-<a name="Intro">
-<h3>7.1. Introduction</h3>
-</a>
-
-
-  <p>The HDF5 <em>dataspace</em> is a required component of an HDF5 dataset
-  or attribute definition.  The dataspace defines the size and shape of the 
-  dataset or attribute raw data. In other words, 
-  a dataspace defines the number of dimensions and the size of each dimension 
-  of the multidimensional array in which the raw data is represented.
-  The dataspace must be defined when the dataset or attribute is created.</p>
-
-  <p>The <em>dataspace</em> is also used during dataset I/O operations,
-  defining the elements of the dataset that participate in the I/O operation.</p>
-  
-  <p>This chapter explains the <em>dataspace</em> object and 
-  its use in dataset and attribute creation and data transfer.
-  It also describes selection operations on a dataspace used to
-  implement sub-setting, sub-sampling, and scatter-gather access to datasets.
-  </p>
-  
-  <p>The rest of this chapter is structured as follows:</p>
-  <ul>
-      <li>Section 2, “Dataspace Function Summaries,” 
-          provides a categorized list of dataspace functions, 
-	  also known as the H5S APIs</li>
-      <li>Section 3, “Definition of Dataspace Objects and 
-          the Dataspace Programming Model,” 
-          describes dataspace objects and the programming model, 
-          including the creation and use of dataspaces</li>
-      <li>Section 4, “Dataspaces and Data Transfer,” 
-          describes the use of dataspaces in data transfer</li>
-      <li>Section 5, “Dataspace Selection Operations and Data 
-          Transfer,” describes selection operations on dataspaces 
-          and their usage in data transfer</li>
-      <li>Section 6, “References to Dataset Regions,” 
-          briefly discusses references to dataset regions</li>
-       <li>Section 7, “Sample Programs,” 
-          contains the full programs from which several of the code samples 
-	  in this chapter were derived</li>
- </ul>
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="DSpaceFunctSums">
-<div align="right">
-<a href="#TOP"><font size=-1>(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-<br />
-<!-- NEW PAGE -->
-<a name="DSpaceFunctSums">
-<h3 class="pagebefore">7.2. Dataspace (H5S) Function Summaries</h3>
-</a>
-
-
-
-  <p>This section provides a reference list of dataspace functions, 
-  the H5S APIs, with brief descriptions.
-  The functions are presented in the following catagories:</p>
-<ul>
-  <li>Dataspace management functions</li>
-  <li>Dataspace query functions</li>
-  <li>Dataspace selection functions: hyperslabs</li>
-  <li>Dataspace selection functions: points</li>
-</ul>
-
-  <p>The rest of the chapter will provide examples and explanations 
-  of how to use these functions.</p>
-
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 1. 
-        Dataspace management functions</b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Screate<br />h5screate_f</code> 
-        </td><td> </td>
-        <td>
-        Creates a new dataspace of a specified type.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Scopy<br />h5scopy_f</code> 
-        </td><td> </td>
-        <td>
-        Creates an exact copy of a dataspace.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sclose<br />h5sclose_f</code> 
-        </td><td> </td>
-        <td>
-        Releases and terminates access to a dataspace.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sdecode<br />h5sdecode_f</code> 
-        </td><td> </td>
-        <td>
-        Decode a binary object description of a dataspace and return a new 
-        object identifier. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sencode<br />h5sencode</code> 
-        </td><td> </td>
-        <td>
-        Encode a dataspace object description into a binary buffer. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Screate_simple<br />h5screate_simple_f</code> 
-        </td><td> </td>
-        <td>
-        Creates a new simple dataspace and opens it for access.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sis_simple<br />h5sis_simple_f</code> 
-        </td><td> </td>
-        <td>
-        Determines whether a dataspace is a simple dataspace.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sextent_copy<br />h5sextent_copy_f</code> 
-        </td><td> </td>
-        <td>
-        Copies the extent of a dataspace.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sextent_equal<br />h5sextent_equal_f</code> 
-        </td><td> </td>
-        <td>
-        Determines whether two dataspace extents are equal.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sset_extent_simple<br />h5sset_extent_simple_f</code> 
-        </td><td> </td>
-        <td>
-        Sets or resets the size of an existing dataspace.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sset_extent_none<br />h5sset_extent_none_f</code> 
-        </td><td> </td>
-        <td>
-        Removes the extent from a dataspace.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 2. Dataspace query functions</b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sget_simple_extent_dims<br />h5sget_simple_extent_dims_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves dataspace dimension size and maximum size.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sget_simple_extent_ndims<br />h5sget_simple_extent_ndims_f</code> 
-        </td><td> </td>
-        <td>
-        Determines the dimensionality of a dataspace.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sget_simple_extent_npoints<br />
-        h5sget_simple_extent_npoints_f</code> 
-        </td><td> </td>
-        <td>
-        Determines the number of elements in a dataspace.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sget_simple_extent_type<br />h5sget_simple_extent_type_f</code> 
-        </td><td> </td>
-        <td>
-        Determine the current class of a dataspace.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 3. Dataspace selection functions: hyperslabs
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Soffset_simple<br />h5soffset_simple_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the offset of a simple dataspace.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sget_select_type<br />h5sget_select_type_f</code> 
-        </td><td> </td>
-        <td>
-        Determines the type of the dataspace selection.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sget_select_hyper_nblocks<br />
-        h5sget_select_hyper_nblocks_f</code> 
-        </td><td> </td>
-        <td>
-        Get number of hyperslab blocks.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sget_select_hyper_blocklist<br />
-        h5sget_select_hyper_blocklist_f</code> 
-        </td><td> </td>
-        <td>
-        Gets the list of hyperslab blocks currently selected.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sget_select_bounds<br />h5sget_select_bounds_f</code> 
-        </td><td> </td>
-        <td>
-        Gets the bounding box containing the current selection.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sselect_all<br />h5sselect_all_f</code> 
-        </td><td> </td>
-        <td>
-        Selects the entire dataspace.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sselect_none<br />h5sselect_none_f</code> 
-        </td><td> </td>
-        <td>
-        Resets the selection region to include no elements.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sselect_valid<br />h5sselect_valid_f</code> 
-        </td><td> </td>
-        <td>
-        Verifies that the selection is within the extent of the dataspace.
-        </td>
-        </tr>
-    <!-- NEW PAGE -->
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sselect_hyperslab<br />h5sselect_hyperslab_f</code> 
-        </td><td> </td>
-        <td>
-        Selects a hyperslab region to add to the current selected region.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 4. Dataspace selection functions: points
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sget_select_npoints<br />h5sget_select_npoints_f</code>
-        </td><td> </td>
-        <td>
-        Determines the number of elements in a dataspace selection.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sget_select_elem_npoints<br />h5sget_select_elem_npoints_f</code> 
-        </td><td> </td>
-        <td>
-        Gets the number of element points in the current selection.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sget_select_elem_pointlist<br />
-        h5sget_select_elem_pointlist_f</code> 
-        </td><td> </td>
-        <td>
-        Gets the list of element points currently selected.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Sselect_elements<br />h5sselect_elements_f</code> 
-        </td><td> </td>
-        <td>
-        Selects array elements to be included in the selection for a dataspace.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="DefDataObjs">
-<div align="right">
-<a href="#TOP"><font size=-1>(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-
-<br />
-<!-- NEW PAGE -->
-<a name="DefDataObjs">
-<h3 class="pagebefore">7.3. Definition of Dataspace Objects and 
-    the Dataspace Programming Model</h3></a>
-
-
-
-  <p>This section introduces the notion of the HDF5 dataspace object 
-  and a programming model for creating and working with dataspaces.</p>
-  
-<h4>7.3.1. Dataspace Objects</h4>
- 
-  <p>An HDF5 dataspace is a required component of an HDF5 dataset or attribute. 
-  A dataspace defines the size and the shape of a dataset’s or an 
-  attribute’s raw data. 
-  Currently, HDF5 supports the following types of the dataspaces: </p>
-  <ul>
-    <li>Scalar dataspaces</li> 
-    <li>Simple dataspaces</li>
-    <li>Null dataspaces</li>
-  </ul>
-  
-  <p>A <em>scalar dataspace</em>, <code>H5S_SCALAR</code>, 
-  represents just one element, a scalar. 
-  Note that the datatype of this one element may be very complex, 
-  e.g., a compound structure with members being of 
-  any allowed HDF5 datatype, including 
-  multidimensional arrays, strings, and nested compound structures.
-  By convention, the rank of a scalar dataspace is always 
-  <code>0</code> (zero); think of it geometrically as a single, 
-  dimensionless point, though that point may be complex.</p>
-
-  <p>A <i>simple dataspace</i>, <code>H5S_SIMPLE</code>, 
-  is a multidimensional array of elements. 
-  The dimensionality of the dataspace (or the rank of the array) 
-  is fixed and is defined at creation time. 
-  The size of each dimension can grow during the life time of the dataspace 
-  from the <i>current size</i> up to the <i>maximum size</i>. 
-  Both the current size and the maximum size are specified at 
-  creation time. 
-  The sizes of dimensions at any particular time in the life of a dataspace 
-  are called the <i>current dimensions</i>, or the <i>dataspace extent</i>. 
-  They can be queried along with the maximum sizes.</p>
-  
-  <p>A <em>null dataspace</em>, <code>H5S_NULL</code>, 
-  contains no data elements.
-  Note that no selections can be applied to a null dataset 
-  as there is nothing to select.</p>
-
-  <p>As shown in the UML diagram in the figure below, an HDF5 simple 
-  dataspace object has three attributes: the rank or number of dimensions; 
-  the current sizes, expressed as an array of length 
-  <span class="codeVar">rank</span> with each element of the array 
-  denoting the current size of the corresponding dimension; and the 
-  maximum sizes, expressed as an array of length 
-  <span class="codeVar">rank</span> with each element of the array 
-  denoting the maximum size of the corresponding dimension. </p>
-
-
-
-<table width="400" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <table border="1">
-            <tr><td align="center">
-            <code>Simple dataspace</code>
-            </td></tr>
-            <tr><td align="left">
-            <code>
-              rank:int<br />
-              current_size:hsize_t[rank]  <br />
-              maximum_size:hsize_t[rank]</code>
-            </td></tr>
-            <tr><td align="left"> 
-            </td></tr>
-        </table>
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 1. A simple dataspace</b> <br />
-        A simple dataspace is defined by its rank, 
-        the current size of each dimension, and
-        the maximum size of each dimension.
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-  <p>The size of a current dimension cannot be greater than 
-  the maximum size, which can be unlimited, 
-  specified as <code>H5S_UNLIMITED</code>. 
-  Note that while the HDF5 file format and library impose no maximum size
-  on an unlimited dimension, practically speaking its size 
-  will always be limited to the biggest integer available on the 
-  particular system being used. </p>
-<!--  editingComment
-  <span class="editingComment">[ [ [ Prior excessively casual phrasing replaced (...the caveat that the value of infinity is limited to...). ] ] ]</span>) 
--->
-  
-  <p>Dataspace rank is restricted to 32, 
-  the standard limit in C on the rank of an array, 
-  in the current implementation of the HDF5 Library. 
-  The HDF5 file format, on the other hand, allows any rank up to the 
-  maximum integer value on the system, so the library restriction can be 
-  raised in the future if higher dimensionality is required.</p>
-  
-  <p>Note that most of the time Fortran applications calling HDF5 will 
-  work with dataspaces of rank less than or equal to seven,
-  since seven is  the maximum number of dimensions in a Fortran array.  
-  But dataspace rank is not limited to seven for Fortran applications.</p>
-<!--  editingComment
-  <span class="editingComment">[ [ [ or "But with the use of XXX, Fortran applications can [easily?] work with dataspace rank of up to 32." ] ] ]</span>) 
--->
-
-  <p>The current dimensions of a dataspace, also referred to as the 
-  dataspace extent, define the bounding box for dataset elements that 
-  can participate in I/O operations.</p>
-
-
-
-<a name="ProgModel"> 
-<h4>7.3.2. Programming Model</h4>
-</a> 
-
-  <p>
-  The programming model for creating and working with HDF5 dataspaces 
-  can be summarized as follows:</p>
-
-  <ol><li>Create a dataspace</li>
-      <li>Use the dataspace to create a dataset in the file or 
-          to describe a data array in memory</li>
-      <li>Modify the dataspace to define dataset elements that will 
-          participate in I/O operations</li>
-      <li>Use the modified dataspace while reading/writing dataset raw 
-          data or to create a region reference</li>
-      <li>Close the dataspace when no longer needed</li>
-  </ol>
-
-  <p>The rest of this section will address 
-  steps 1, 2, and 5 of the programming model;
-  steps 3 and 4 will be discussed in later sections of this chapter.</p>
-
-
-  <h4>7.3.2.1. Creating a Dataspace</h4>
-
-  <p>A dataspace can be created by calling the
-  <span class="codeText">H5Screate</span> function
-  (<span class="codeText">h5screate_f</span> in Fortran). 
-  Since the definition of a simple dataspace requires the specification of 
-  dimensionality (or rank) and initial and maximum dimension sizes, 
-  the HDF5 Library provides a <i>convenience</i> API, 
-  <span class="codeText">H5Screate_simple</span> 
-  (<span class="codeText">h5screate_simple_f</span>) 
-  to create a simple dataspace in one step.</p>
-  <p>The following examples illustrate the usage of these APIs.</p>
-
-  <h4>7.3.2.2. Creating a Scalar Dataspace</h4>
-  
-  <p>A scalar dataspace is created with the <code>H5Screate</code>
-  or the <code>h5screate_f</code> function.</p>
-  
-  <p>In C:</p>
-  <pre>
-          hid_t space_id;
-          . . .
-          space_id = H5Screate(H5S_SCALAR);
-  </pre>
-
-  <p>In Fortran:</p>
-  <pre>
-          INTEGER(HID_T) :: space_id
-          . . .
-          CALL h5screate_f(H5S_SCALAR_F, space_id, error)
-  </pre>
-
-  <p>As mentioned above, the dataspace will contain only one element.
-  Scalar dataspaces are used more often for describing attributes 
-  that have just one value, e.g. the attribute 
-  <span class="codeText">temperature</span> with the value 
-  <span class="codeText">celsius</span> is used to indicate that the 
-  dataset with this attribute stores temperature values using the celsius scale.</p>
-
-  
-  <h4>7.3.2.3. Creating a Null Dataspace</h4>
-  
-  <p>A null dataspace is created with the <code>H5Screate</code>
-  or the <code>h5screate_f</code> function.</p>
-  
-  <p>In C:</p>
-  <pre>
-          hid_t space_id;
-          . . .
-          space_id = H5Screate(H5S_NULL);
-  </pre>
-
-  <p>In Fortran: </p>
-     (<code>H5S_NULL</code> not yet implemented in Fortran.)
-  <pre>
-          INTEGER(HID_T) :: space_id
-          . . .
-          CALL h5screate_f(H5S_NULL_F, space_id, error)
-  </pre>
-
-  As mentioned above, the dataspace will contain no elements.
-<!--
-               NEED MORE INFO.  
-               SPECIFICALLY, HOW ARE SUCH DATASPACES USED? 
-               AND WHAT ATTRIBUTES ARE RELEVANT?
--->
-
-  
-
-
-  <h4>7.3.2.4. Creating a Simple Dataspace</h4>
-  
-  <p>Let’s assume that an application wants to store a 
-  two-dimensional array of data, A(20,100). 
-  During the life of the application, the first dimension of the array 
-  can grow up to 30; there is no restriction on the size of the 
-  second dimension. 
-  The following steps are used to declare a dataspace for the dataset 
-  in which the array data will be stored.</p>
-  
-  <p>In C:</p>
-  <pre>
-          hid_t space_id;
-          int rank = 2;
-          hsize_t current_dims[2] = {20, 100};
-          hsize_t max_dims[2] = {30, H5S_UNLIMITED};
-          . . .
-          space_id = H5Screate(H5S_SIMPLE);
-          H5Sset_extent_simple(space_id,rank,current_dims,max_dims);
-  </pre>
-
-  <p>In Fortran:</p>
-  <pre>
-          INTEGER(HID_T) :: space_id
-          INTEGER :: rank = 2
-          INTEGER(HSIZE_T) :: current dims = /( 20, 100)/
-          INTEGER(HSIZE_T) :: max_dims = /(30, H5S_UNLIMITED_F)/
-          INTEGER error 
-          . . .
-          CALL h5screate_f(H5S_SIMPLE_F, space_id, error)
-          CALL h5sset_extent_simple_f(space_id, rank, current_dims, max_dims, error)
-  </pre>
-
-  <p>Alternatively, the convenience APIs 
-  <span class="codeText">H5Screate_simple</span>/<span class="codeText">h5screate_simple_f</span> 
-  can replace the <span class="codeText">H5Screate</span>/<span class="codeText">h5screate_f</span> 
-  and <span class="codeText">H5Sset_extent_simple</span>/<span class="codeText">h5sset_extent_simple_f</span> 
-  calls.</p>
-
-  <p>In C:</p>
-  <pre>
-          space_id = H5Screate_simple(rank, current_dims, max_dims);
-  </pre>
-
-  <p>In Fortran:</p>
-  <pre>
-          CALL h5screate_simple_f(rank, current_dims, space_id, error, max_dims)
-  </pre>
-
-
-  <p>In this example, a dataspace with current dimensions of 20 by 100 
-  is created. The first dimension can be extended only up to 30. The 
-  second dimension, however, is declared unlimited; it can be extended 
-  up to the largest available integer value on the system.</p>
-  
-  <p>Note that when there is a difference between the current dimensions 
-  and the maximum dimensions of an array, then chunking storage must be 
-  used. In other words, if the number of dimensions may change over the 
-  life of the dataset, then chunking must be used. If the array dimensions 
-  are fixed (if the number of current dimensions is equal to the maximum 
-  number of dimensions when the dataset is created), then contiguous 
-  storage can be used. See the “
-  <a href="10_Datasets.html#DTransfer">Data Transfer</a>” 
-  section in the “<a href="UG_frame10Datasets.html" target=_top>
-  Datasets</a>” chapter.</p>
-
-
-  <p>Maximum dimensions can be the same as current dimensions. 
-  In such a case, the sizes of dimensions cannot be changed during the life 
-  of the dataspace object. 
-  In C, <span class="codeText">NULL</span> can be used to indicate to 
-  the <span class="codeText">H5Screate_simple</span> and 
-  <span class="codeText">H5Sset_extent_simple</span> functions that the 
-  maximum sizes of all dimensions are the same as the current sizes. 
-  In Fortran, the maximum size parameter is optional for 
-  <span class="codeText">h5screate_simple_f</span> and can be omitted 
-  when the sizes are the same.</p>
-
-  <p>In C:</p>
-  <pre>
-          space_id = H5Screate_simple(rank, current_dims, NULL);
-  </pre>
-
-  <p>In Fortran:</p>
-  <pre>
-          CALL h5screate_f(rank, current_dims, space_id, error)
-  </pre>
-
-  <p>The created dataspace will have current and maximum dimensions 
-  of 20 and 100 correspondingly, 
-  and the sizes of those dimensions cannot be changed.</p>
-
-
-  <h4>7.3.2.5. C versus Fortran Dataspaces</h4>
-
-  <p>Dataspace dimensions are numbered from 1 to 
-  <span class="codeVar">rank</span>. HDF5 uses C storage conventions, 
-  assuming that the last listed dimension is the fastest-changing dimension 
-  and the first-listed dimension is the slowest changing.  
-<!--  editingComment
-  <span class="editingComment">[ [ [ Fortran, on the other hand, .... ? ] ] ]</span>
--->
-  The HDF5 file format storage layout specification adheres to the C convention 
-  and the HDF5 Library adheres to the same convention 
-  when storing dataspace dimensions in the file. 
-  This affects how C programs and tools interpret data written 
-  from Fortran programs and vice versa. 
-  The example below illustrates the issue.</p>
-
-  <p>When a Fortran application describes a dataspace to store an array 
-  as A(20,100), it specifies the value of the first dimension to be 20 
-  and the second to be 100.  
-  Since Fortran stores data by columns, 
-  the first-listed dimension with the value 20 is the fastest-changing
-  dimension and the last-listed dimension with the value 100 is the 
-  slowest-changing. 
-  In order to adhere to the HDF5 storage convention, 
-  the HDF5 Fortran wrapper transposes dimensions, 
-  so the first dimension becomes the last. 
-  The dataspace dimensions stored in the file will be 100,20 instead 
-  of 20,100 in order to correctly describe the Fortran data that is 
-  stored in 100 columns, each containing 20 elements.</p>
-
-  <p>When a Fortran application reads the data back, 
-  the HDF5 Fortran wrapper transposes the dimensions once more, 
-  returning the first dimension to be 20 and the second to be 100, 
-  describing correctly the sizes of the array that should be used 
-  to read data in the Fortran array A(20,100).</p>
-
-  <p>When a C application reads data back, 
-  the dimensions will come out as 100 and 20, 
-  correctly describing the size of the array to read data into, 
-  since the data was written as 100 records of 20 elements each. 
-  Therefore C tools such as <span class="codeText">h5dump</span> 
-  and <span class="codeText">h5ls</span> always display 
-  transposed dimensions and values for the data written 
-  by a Fortran application.  </p>
-
-  <p>Consider the following simple example of equivalent 
-  C 3 x 5 and Fortran 5 x 3 arrays.
-  As illustrated in the figure <!-- formerly Figure 3 -->below, 
-  a C applications will store 
-  a 3 x 5 2-dimensional array as three 5-element rows.
-  In order to store the same data in the same order, 
-  a Fortran application must view the array as as a 5 x 3 array with 
-  three 5-element columns.
-  The dataspace of this dataset, as written from Fortran, 
-  will therefore be described as 5 x 3 in the application 
-  but stored and described in the file according to the C convention 
-  as a 3 x 5 array.
-  This ensures that C and Fortran applications will always read 
-  the data in the order in which it was written.
-  The HDF5 Fortran interface handles this transposition automatically.</p>
-
-  <p>In C (from <a href="#h5_write_c"><code>h5_write.c</code></a>):</p>
-  <pre>
-          #define NX     3                      /* dataset dimensions */
-          #define NY     5
-          . . .
-          int         data[NX][NY];          /* data to write */
-          . . .
-          /*
-           * Data  and output buffer initialization.
-           */
-          for (j = 0; j < NX; j++) {
-             for (i = 0; i < NY; i++)
-                 data[j][i] = i + 1 + j*NY;
-          }
-          /*
-           *  1  2  3  4  5
-           *  6  7  8  9 10
-           * 11 12 13 14 15
-           */
-          . . .
-          dims[0] = NX;
-          dims[1] = NY;
-          dataspace = H5Screate_simple(RANK, dims, NULL);
-  </pre>
-
-  <!-- NEW PAGE -->
-  <p>In Fortran (from <a href="#h5_write_f90"><code>h5_write.f90</code>)</a>:</p>
-  <pre>
-          INTEGER, PARAMETER :: NX = 3
-          INTEGER, PARAMETER :: NY = 5
-          . . .
-          INTEGER(HSIZE_T), DIMENSION(2) :: dims = (/3,5/) ! Dataset dimensions
-          ---
-          INTEGER     ::    data(NX,NY)
-          . . .
-          !
-          ! Initialize data
-          !
-            do i = 1, NX
-               do j = 1, NY
-                  data(i,j) = j + (i-1)*NY
-               enddo
-            enddo
-          !
-          ! Data
-          !
-          !  1  2  3  4  5
-          !  6  7  8  9 10
-          ! 11 12 13 14 15
-          . . .
-          CALL h5screate_simple_f(rank, dims, dspace_id, error)
-  </pre>
-
-  
-  <p>In Fortran (from <a href=#h5_write_tr_f90>
-  <code>h5_write_tr.f90</code>):</a></p>
-  <pre>
-          INTEGER, PARAMETER :: NX = 3
-          INTEGER, PARAMETER :: NY = 5
-          . . .
-          INTEGER(HSIZE_T), DIMENSION(2) :: dims = (/NY, NX/) ! Dataset dimensions
-          . . .
-          !
-          ! Initialize data
-          !
-            do i = 1, NY
-               do j = 1, NX
-                  data(i,j) = i + (j-1)*NY
-               enddo
-            enddo
-          !
-          ! Data
-          !
-          !  1  6  11
-          !  2  7  12
-          !  3  8  13
-          !  4  9  14
-          !  5 10  15
-          . . .
-          CALL h5screate_simple_f(rank, dims, dspace_id, error)
-  </pre> 
-  
-<br />
-
-
-
-<!-- NEW PAGE -->
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-    <br />
-    <table border="0" width="95%">
-    <tr align="left" valign="top">
-      <td width="35%">
-        <p>A dataset stored by a<br />C program in a 3 x 5 array:</p>
-        <table border="1" width="100%">
-        <tr align="center">
-          <td width="20%">1</td>
-          <td width="20%">2</td>
-          <td width="20%">3</td>
-          <td width="20%">4</td>
-          <td width="20%">5</td>
-        </tr>
-        <tr align="center">
-          <td width="20%">6</td>
-          <td width="20%">7</td>
-          <td width="20%">8</td>
-          <td width="20%">9</td>
-          <td width="20%">10</td>
-        </tr>
-        <tr align="center">
-          <td width="20%">11</td>
-          <td width="20%">12</td>
-          <td width="20%">13</td>
-          <td width="20%">14</td>
-          <td width="20%">15</td>
-        </tr>
-        </table>
-      </td>
-      <td width="15%"> </td>
-      <td width="45%">
-        <p>The same dataset stored by a<br />Fortran program in a 5 x 3 array:</p>
-        <table border="1" width="48%">
-        <tr align="center">
-          <td width="33%">1</td>
-          <td width="34%">6</td>
-          <td width="33%">11</td>
-        </tr>
-        <tr align="center">
-          <td width="33%">2</td>
-          <td width="34%">7</td>
-          <td width="33%">12</td>
-        </tr>
-        <tr align="center">
-          <td width="33%">3</td>
-          <td width="34%">8</td>
-          <td width="33%">13</td>
-        </tr>
-        <tr align="center">
-          <td width="33%">4</td>
-          <td width="34%">9</td>
-          <td width="33%">14</td>
-        </tr>
-        <tr align="center">
-          <td width="33%">5</td>
-          <td width="34%">10</td>
-          <td width="33%">15</td>
-        </tr>
-        </table>
-      </td>
-      <td width="5%"> </td>
-    </tr>
-    </table>
-    
-    <table width="95%" align="center">
-        <tr>
-        <td align="left"><br />
-        The left-hand dataset above as written to an HDF5 
-        file from C or the right-hand dataset as written from Fortran:
-        </td>
-        </tr>
-    </table>
-    <br />
-    <table border="1" width="95%">
-    <tr>
-      <td align="center" width="6.5%">1</td>
-      <td align="center" width="6.5%">2</td>
-      <td align="center" width="6.5%">3</td>
-      <td align="center" width="6.5%">4</td>
-      <td align="center" width="6.5%">5</td>
-      <td align="center" width="6.5%">6</td>
-      <td align="center" width="6.5%">7</td>
-      <td align="center" width="6.5%">8</td>
-      <td align="center" width="6.5%">9</td>
-      <td align="center" width="6.5%">10</td>
-      <td align="center" width="6.5%">11</td>
-      <td align="center" width="6.5%">12</td>
-      <td align="center" width="6.5%">13</td>
-      <td align="center" width="6.5%">14</td>
-      <td align="center" width="6.5%">15</td>
-    </tr>
-    </table>
-    
-    <table width="95%" align="center">
-        <tr>
-        <td align="left"><br />
-        The left-hand dataset above as written to an HDF5 
-        file from Fortran:
-        </td>
-        </tr>
-    </table>
-    <br />
-
-    <table border="1" width="95%">
-    <tr>
-      <td align="center" width="6.5%">1</td>
-      <td align="center" width="6.5%">6</td>
-      <td align="center" width="6.5%">11</td>
-      <td align="center" width="6.5%">2</td>
-      <td align="center" width="6.5%">7</td>
-      <td align="center" width="6.5%">12</td>
-      <td align="center" width="6.5%">3</td>
-      <td align="center" width="6.5%">8</td>
-      <td align="center" width="6.5%">13</td>
-      <td align="center" width="6.5%">4</td>
-      <td align="center" width="6.5%">9</td>
-      <td align="center" width="6.5%">14</td>
-      <td align="center" width="6.5%">5</td>
-      <td align="center" width="6.5%">10</td>
-      <td align="center" width="6.5%">15</td>
-    </tr>
-    </table>
-    <br />
-</td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 2. Comparing C and Fortran dataspaces
-        <!-- formerly Figure 3 --></b><br />
-        The HDF5 Library stores arrays along the fastest-changing 
-        dimension. This approach is often referred to as being “in 
-        C order.” C, C++, and Java work with arrays in row-major 
-        order. In other words, the row, or the last dimension, is the 
-        fastest-changing dimension. Fortran, on the other hand, handles 
-        arrays in column-major order making the column, or the first 
-        dimension, the fastest-changing dimension. Therefore, the C and 
-        Fortran arrays illustrated in the top portion of this figure are 
-        stored identically in an HDF5 file. This ensures that data 
-        written by any language can be meaningfully read, interpreted, 
-        and manipulated by any other.
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-
-<!--  editingComment this entire section needs to be -->
-<!--  written properly then reincluded.              -->
-<!--  
-  <h4>Extending a dataspace</h4>
-
-  <p>
-  <span class="editingComment">[ [ [ Text here describing the extension of the dataset, per the following diagram. ] ]</span>
-
-  <p>
-<table x-use-null-cells
-		width="600"
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-  <tr valign="top"> 
-    <td class="fullImgTableImgCell" align="center">
-    <img src="Images/Dspace_fig03.jpg">
-</td></tr>
-  <tr> 
-    <td align="center" class="fullImgTableCapCell"> 
-        <span class="figurenumber">Figure 4</span> 
-	Extend the simple dataspace array to 12x130
--->
-	<!-- The next 10 lines were already commented out -->
-	<!-- before this entire section was removed.      -->
-	<!--
-	<p align="left">
-        To extend (conceptual): 
-	<br />    
-	        
-	<code>err = H5Sset_extent_simple(id,rank,new_dims,max_dims)</code>
-	<br />
-	To extend (concrete): 
-	<br />    
-	    
-        <code>err = H5Sset_extent_simple(id,2,[12,130],[H5S_UNLIMITED,200])</code>
-	-->
-<!--
-    </td>
-  </tr>
-</table>
-
--->
-
-  <h4>7.3.2.6. Finding Dataspace Charateristics</h4>
-
-  <p>The HDF5 Library provides several APIs designed to query 
-  the characteristics of a dataspace.</p>
-
-  <p>The function <span class="codeText">H5Sis_simple</span> 
-  (<span class="codeText">h5sis_simple_f</span>) 
-  returns information about the type of a dataspace. 
-  This function is rarely used and 
-  currently supports only simple and scalar dataspaces.</p>
-<!--  editingComment
-  <span class="editingComment">[ [ [ Isn't that all of them?  What other types are there? ] ] ]</span>
--->
-
-  <p>To find out the dimensionality, or rank, of a dataspace, 
-  use <span class="codeText">H5Sget_simple_extent_ndims</span> 
-  (<span class="codeText">h5sget_simple_extent_ndims_f</span>).  
-  <span class="codeText">H5Sget_simple_extent_dims</span> 
-  can also be used to find out the rank. 
-  See the example below. 
-  If both functions return <span class="codeText">0</span> for the 
-  value of <span class="codeVar">rank</span>, then the dataspace is scalar.</p>
-
-  <p>To query the sizes of the current and maximum dimensions, 
-  use <span class="codeText">H5Sget_simple_extent_dims</span> 
-  (<span class="codeText">h5sget_simple_extent_dims_f)</span>. </p>
-  
-  <p>The following example illustrates querying the rank and dimensions 
-  of a dataspace using these functions. </p>
-
-<!-- NEW PAGE -->
-  <p>In C:</p>
-  <pre>
-          hid_t space_id;
-          int rank;
-          hsize_t  *current_dims;
-          hsize_t  *max_dims;
-          ---------
-
-          rank=H5Sget_simple_extent_ndims(space_id); 
-              (or rank=H5Sget_simple_extent_dims(space_id, NULL, NULL);)
-          current_dims= (hsize_t)malloc(rank*sizeof(hsize_t));
-          max_dims=(hsize_t)malloc(rank*sizeof(hsize_t));
-          H5Sget_simple_extent_dims(space_id, current_dims, max_dims);
-          Print values here for the previous example
-  </pre>
-
-<!--  editingComment
-  <p>In Fortran:
-  <pre>
-          Example ??????????
-  </pre>
--->
-
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="DTransfer">
-<div align="right"> 
-<a href="#TOP"><font size=-1>(Top)</font></a> 
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-
-<br />
-<!-- NEW PAGE -->
-<a name="DTransfer">
-<h3 class="pagebefore">7.4. Dataspaces and Data Transfer</h3>
-</a>
-
-  <p>Read and write operations transfer data between an HDF5 file on 
-  disk and in memory. The shape that the array data takes in the file 
-  and in memory may be the same, but HDF5 also allows users the ability 
-  to represent data in memory in a different shape than in the file. 
-  If the shape of an array in the file and in memory will be the same, 
-  then the same dataspace definition can be used for both. If the shape 
-  of an array in memory needs to be different than the shape in the file, 
-  then the dataspace definition for the shape of the array in memory can 
-  be changed. During a read operation, the array will be read into the 
-  different shape in memory, and during a write operation, the array 
-  will be written to the file in the shape specified by the dataspace 
-  in the file. The only qualification is that the number of elements 
-  read or written must be the same in both the source and the destination 
-  dataspaces.</p>
-  
-  <p>Item a in the figure below shows a simple example of a read operation 
-  in which the data is stored as a 3 by 4 array in the file (item b) on 
-  disk, but the program wants it to be a 4 by 3 array in memory. This 
-  is accomplished by setting the memory dataspace to describe the 
-  desired memory layout, as in item c. The read operation reads the 
-  data in the file array into the memory array.</p>
-  
-  
-<table width="500" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dspace_fig4.JPG">
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 3. Data layout before and after a read operation
-        <!-- formerly Figure 4 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-
-<!-- NEW PAGE -->
-
-<table width="500" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dspace_fig5.JPG">
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 4. Moving data from disk to memory
-        <!-- formerly Figure 5 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>Both the source and destination are stored as contiguous blocks of storage 
-  with the elements in the order specified by the <em>dataspace</em>. 
-  The figure above <!-- formerly Figure 5 -->shows one way the elements might 
-  be organized. In item a<!-- formerly Figure 5a-->, 
-  the elements are stored as 3 blocks of 4 elements.  The destination is 
-  an array of 12 elements in memory (see item c<!-- formerly Figure 5c -->).  
-  As the figure suggests, the transfer reads the disk blocks into a 
-  memory buffer (see item b<!-- formerly Figure 5b-->), and then 
-  writes the elements to the correct locations in memory.  A similar 
-  process occurs in reverse when data is written to disk.</p>
-  
-<h4>7.4.1. Data Selection</h4>
-
-  <p>In addition to rearranging data, the transfer may select the data 
-  elements from the source and destination.</p>
-  
-  <p>Data selection is implemented by creating a <em>dataspace</em> 
-  object that describes the selected elements (within the hyper rectangle) 
-  rather than the whole array. Two <em>dataspace</em> objects with 
-  selections can be used in data transfers to read selected elements 
-  from the source and write selected elements to the destination.  When 
-  data is transferred using the dataspace object, only the selected 
-  elements will be transferred.</p>
-  
-  <p>This can be used to implement partial I/O, including:</p>
-  
-<ul>
-    <li>Sub-setting - reading part of a large dataset</li>
-    <li>Sampling - reading selected elements (e.g., every second element) 
-        of a dataset</li>
-    <li>Scatter-gather - read non-contiguous elements into contiguous locations 
-        (gather) or read contiguous elements into non-contiguous locations 
-	(scatter) or both</li>
-</ul>
-
-  <p>To use selections, the following steps are followed:</p>
-  
-<ol>
-    <li>Get or define the dataspace for the source and destination</li>
-    <li>Specify one or more selections for source and destination dataspaces</li>
-    <li>Transfer data using the dataspaces with selections</li>
-</ol>
-
-<!-- NEW PAGE -->
-  <p>A selection is created by applying one or more selections to a 
-  <em>dataspace</em>.  A selection may override any other selections 
-  (<code>H5T_SELECT_SET</code>) 
-  or may be “Ored” with previous selections on the same dataspace 
-  (<code>H5T_SELECT_OR</code>). 
-  In the latter case, the resulting selection is the union of the selection and 
-  all previously selected selections. Arbitrary sets of points from a dataspace 
-  can be selected by specifying an appropriate set of selections.</p>
-  
-  <p>Two selections are used in data transfer, so the source and destination 
-  must be compatible, as described below.</p>
-  
-  <p>There are two forms of selection, hyperslab and point.  A selection must 
-  be either a point selection or a set of hyperslab selections.  
-  Selections cannot be mixed.</p>
-  
-  <p>The definition of a selection within a dataspace, not the data 
-  in the selection, cannot be saved to the file unless the selection 
-  definition is saved as a region reference. See the <a href="#DRegions">
-  �References to Dataset Regions�</a> section for more information.</p>
-  
-<h4>7.4.1.1. Hyperslab selection</h4>
-
-  <p>A hyperslab is a selection of elements from a hyper rectangle.  
-  An HDF5 hyperslab is a rectangular pattern defined by four arrays. The 
-  four arrays are summarized in the table below <!-- formerly Table 1-->. </p>
-  
-  <p>The <em>offset</em> defines the origin of the hyperslab in the original 
-  dataspace.</p>
-  <p>The <em>stride</em> is the number of elements to increment between 
-  selected elements. A stride of ‘1’ is every element, a 
-  stride of ‘2’ is every second element, etc. Note that there 
-  may be a different stride for each dimension of the dataspace. The 
-  default stride is 1.</p>
-  
-  <p>The <em>count</em> is the number of elements in the hyperslab selection.  
-  When the stride is 1, the selection is a hyper rectangle with a corner at 
-  the offset and size count[0] by count[1] by.... When stride is greater 
-  than one, the hyperslab bounded by the offset and the corners defined 
-  by stride[n] * count[n].</p>
-  
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 1. Hyperslab elements</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="15%"><b>Parameter</b></td>
-        <td width="85%"><b>Description</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Offset</td>
-        <td>The starting location for the hyperslab.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Stride</td>
-        <td>The number of elements to separate each element or block 
-        to be selected.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Count</td>
-        <td>The number of elements or blocks to select along each 
-        dimension.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Block</td>
-        <td>The size of the block selected from the dataspace.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-
-  <p>The <em>block</em> is a count on the number of repetitions of the 
-  hyperslab. The default block size is ‘1’, which is one 
-  hyperslab.  A block of 2 would be two hyperslabs in that dimension, 
-  with the second starting at offset[n]+ (count[n] * stride[n]) + 1.</p>
-  
-  <p>A hyperslab can be used to access a sub-set of a large dataset. 
-  The figure below <!-- formerly Figure 6 -->shows an example of a hyperslab 
-  that reads a rectangle from the middle of a larger two dimensional 
-  array. The destination is the same shape as the source.</p>
-  
-
-<table width="500" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dspace_fig6.JPG">
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 5. Access a sub-set of data 
-        with a hyperslab<!-- formerly Figure 6--></b>
-        <hr color="green" size="3"/></td>
-  </tr>
-</table>
-<br />
-
-
-
-  <p>Hyperslabs can be combined to select complex regions of the source and 
-  destination. The figure below <!-- formerly Figure 7 -->shows an example 
-  of a transfer from one non-rectangular 
-  region into another non-rectangular region. The source is defined as the 
-  union of two hyperslabs, and the destination is the union of three 
-  hyperslabs.</p>
-
-
-<table width="500" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dspace_fig7.JPG">
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 6. Build complex regions with 
-        hyperslab unions<!-- formerly Figure 7--></b>
-        <hr color="green" size="3"/></td>
-  </tr>
-</table>
-<br />
-
-
-<!-- NEW PAGE -->
-  <p>Hyperslabs may also be used to collect or scatter data from regular 
-  patterns. The figure below <!-- formerly Figure 8 -->shows an example 
-  where the source is a repeating pattern of blocks, and the destination 
-  is a single, one dimensional array.</p>
-  
-
-<table width="500" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dspace_fig8.JPG">
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 7. Use hyperslabs to combine or disperse data
-        <!-- formerly Figure 8--></b>
-        <hr color="green" size="3"/></td>
-  </tr>
-</table>
-<br />
-
-
-
-<h4>7.4.1.2. Select Points</h4>
-
-  <p>The second type of selection is an array of points, i.e., coordinates.  
-  Essentially, this selection is a list of all the points to include. 
-  The figure below <!-- formerly Figure 9 -->shows an example of a transfer 
-  of seven elements from a two dimensional dataspace to a three 
-  dimensional dataspace using a point selection to specify the points.</p>
-  
-<table width="500" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dspace_fig9.JPG">
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 8. Point selection
-        <!-- formerly Figure 9--></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<h4>7.4.1.3. Rules for Defining Selections</h4>
-
-  <p>A selection must have the same number of dimensions (rank) as the 
-  dataspace it is applied to, although it may select from only a small 
-  region, e.g., a plane from a 3D dataspace. Selections do not affect the 
-  extent of the <em>dataspace</em>, the selection may be larger than 
-  the <em>dataspace</em>. The boundaries of selections are reconciled 
-  with the extent at the time of the data transfer.</p>
-  
-<h4>7.4.1.4. Data Transfer with Selections</h4>
-
-  <p>A data transfer (read or write) with selections is the same as any 
-  read or write, except the source and destination <em>dataspace</em> 
-  have compatible selections. </p>
-  
-  <p>During the data transfer, the following steps are executed by the 
-  library:</p>
-  
-  <ul>
-  <li>The source and destination <em>dataspaces</em> are checked to assure 
-  that the selections are compatible.</li>
-  <ul>
-  
-  <li>Each selection must be within the current extent of the <em>dataspace</em>.  
-  A selection may be defined to extend outside the current extent of the 
-  <em>dataspace</em>, but the <em>dataspace</em> cannot be accessed if the 
-  selection is not valid at the time of the access.</li>
-  <li>The total number of points selected in the source and destination must 
-  be the same.  Note that the dimensionality of the source and destination can 
-  be different (e.g., the source could be 2D, the destination 1D or 3D), and 
-  the shape can be different, but the number of elements selected must be 
-  the same.</li>
-  </ul>
-  
-
-  <li>The data is transferred, element by element.</li>
-  </ul>
-  
-  <p>Selections have an iteration order for the points selected, which can be 
-  any permutation of the dimensions involved (defaulting to ‘C’ 
-  array order) or a specific order for the selected points, for selections 
-  composed of single array elements with <code>H5Sselect_elements</code>.</p>
-  
-  <p>The elements of the selections are transferred in row-major, or C order. 
-  That is, it is assumed that the first dimension varies slowest, the second 
-  next slowest, and so forth. For hyperslab selections, the order can be any 
-  permutation of the dimensions involved (defaulting to ‘C’ 
-  array order). When multiple hyperslabs are combined, the hyperslabs 
-  are coalesced into contiguous reads and writes.</p>
-  
-  <p>In the case of point selections, the points are read and written in the 
-  order specified.</p>
-  
-  
-<h4>7.4.2. Programming Model</h4>
-
-<h4>7.4.2.1. Selecting Hyperslabs</h4>
-
-  <p>Suppose we want to read a 3x4 hyperslab from a dataset in a file beginning 
-  at the element <1,2> in the dataset, and read it into a 7 x 7 x 3 array 
-  in memory. See the figure below. <!-- formerly (Figure 10).--> In order 
-  to do this, we must create a dataspace that describes the overall rank 
-  and dimensions of the dataset in the file as well as the position and 
-  size of the hyperslab that we are extracting from that dataset.</p>
-  
-<!-- NEW PAGE -->
-<table width="400" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dspace_fig10.JPG">
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 9. Selecting a hyperslab
-        <!-- formerly Figure 10--></b>
-        <hr color="green" size="3"/></td>
-  </tr>
-</table>
-<br />
-
-
-
-  <p>The code in the first example below <!-- formerly Figure 11 -->
-  illustrates the selection of the hyperslab in the 
-  file dataspace. The second example below <!-- formerly Figure 12 -->shows 
-  the definition of the destination dataspace in 
-  memory. Since the in-memory dataspace has three dimensions, the hyperslab is 
-  an array with three dimensions with the last dimension being 
-  1: <3,4,1>.  The third example below <!-- formerly Figure 13 -->
-  shows the read using the source and destination <em>dataspaces</em> 
-  with selections.</p>
-  
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  /* 
-  * get the file dataspace.
-  */
-  dataspace = H5Dget_space(dataset);    /* dataspace identifier */
-
-  /* 
-  * Define hyperslab in the dataset. 
-  */
-  offset[0] = 1;
-  offset[1] = 2;
-  count[0]  = 3;
-  count[1]  = 4;
-  status = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, offset, NULL, 
-       count, NULL);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 1. Selecting a hyperslab
-        <!-- formerly Figure 11--></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-
-<!-- NEW PAGE -->
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  /*
-  * Define memory dataspace.
-  */
-  dimsm[0] = 7;
-  dimsm[1] = 7;
-  dimsm[2] = 3;
-  memspace = H5Screate_simple(3,dimsm,NULL);   
-
-  /* 
-  * Define memory hyperslab. 
-  */
-  offset_out[0] = 3;
-  offset_out[1] = 0;
-  offset_out[2] = 0;
-  count_out[0]  = 3;
-  count_out[1]  = 4;
-  count_out[2]  = 1;
-  status = H5Sselect_hyperslab(memspace, H5S_SELECT_SET, offset_out, NULL, 
-       count_out, NULL);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 2. Defining the destination memory
-        <!-- formerly Figure 12--></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  ret = H5Dread(dataset, H5T_NATIVE_INT, memspace, dataspace, H5P_DEFAULT,    
-        data);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 3. A sample read specifying source 
-        and destination dataspaces
-        <!-- formerly Figure 13--></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-
-<h4>7.4.2.2. Example with Strides and Blocks</h4>
-
-  <p>Consider an 8 x 12 dataspace into which we want to write eight 3 x 2 
-  blocks in a two dimensional array 
-  from a source dataspace in memory that is a 50-element one dimensional 
-  array. 
-  See the figure below.<!-- formerly (Figure 14).--></p>
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-    <table>
-        <tr>
-        <td width="80"> </td>
-        <td width="440">a) The source is a 1D array with 50 elements</td>
-        <td width="80"> </td>
-        </tr>
-        <tr valign="top"><td> </td> 
-        <td align="center">
-        <img src="Images/Dspace_fig14.JPG">
-        </td><td> </td></tr>
-        <tr>
-        <td width="80"> </td>
-        <td width="440">b) The destination on disk is a 2D array 
-        with 48 selected elements</td>
-        <td width="80"> </td>
-        </tr>
-    </table>
-    </td></tr> 
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 10. Write from a one dimensional 
-        array to a two dimensional array<!-- Figure 14--></b>
-        <hr color="green" size="3"/></td>
-  </tr>
-</table>
-<br />
-
-
-  <p>The example below <!-- formerly Figure 15 -->shows code to write 48 
-  elements from the one dimensional array to the 
-  file dataset starting with the second element in vector. The destination 
-  hyperslab has the following parameters: offset=(0,1), stride=(4,3), 
-  count=(2,4), block=(3,2). The source has the parameters:  offset=(1), 
-  stride=(1), count=(48), block=(1). After these operations, the file 
-  dataspace will have the values shown in item b in the figure above
-  <!-- formerly Figure 14-->.  Notice that the values are inserted in 
-  the file dataset in row-major order.</p>
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  /* Select hyperslab for the dataset in the file, using 3 x 2 blocks, (4,3) stride
-   * (2,4) count starting at the position (0,1).
-   */
-  offset[0]  = 0; offset[1]  = 1;
-  stride[0] = 4; stride[1] = 3;
-  count[0]  = 2; count[1]  = 4;    
-  block[0]  = 3; block[1]  = 2;
-  ret = H5Sselect_hyperslab(fid, H5S_SELECT_SET, offset, stride, count, block);
-
-  /*
-   * Create dataspace for the first dataset.
-   */
-  mid1 = H5Screate_simple(MSPACE1_RANK, dim1, NULL);
-
-  /*
-   * Select hyperslab. 
-   * We will use 48 elements of the vector buffer starting at the second element.
-   * Selected elements are 1 2 3 . . . 48
-   */
-  offset[0]  = 1;
-  stride[0] = 1;
-  count[0]  = 48;
-  block[0]  = 1;
-  ret = H5Sselect_hyperslab(mid1, H5S_SELECT_SET, offset, stride, count, block);
- 
-  /*
-   * Write selection from the vector buffer to the dataset in the file.
-   *
-  ret = H5Dwrite(dataset, H5T_NATIVE_INT, midd1, fid, H5P_DEFAULT, vector)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 4. Write from a one dimensional 
-        array to a two dimensional array 
-        <!-- formerly Figure 15--></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<h4>7.4.2.3. Selecting a Union of Hyperslabs</h4>
-  
-  <p>The HDF5 Library allows the user to select a union of hyperslabs and 
-  write or read the selection into another selection. The shapes of the 
-  two selections may differ, but the number of elements must be equal. </p>
-  
-
-<!-- NEW PAGE -->
-<table width="400" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dspace_fig16a.jpg">
-        <br />
-        <img src="Images/Dspace_fig16b.jpg">
-        <br />
-        <img src="Images/Dspace_fig16c.jpg">
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 11. Transferring hyperslab unions
-        <!-- formerly Figure 16--></b>
-        <hr color="green" size="3"/></td>
-  </tr>
-</table>
-<br />
-
-
-
-  <p>The figure above <!-- formerly Figure 16 -->shows the transfer of a 
-  selection that is two overlapping hyperslabs 
-  from the dataset into a union of hyperslabs in the memory dataset. Note that 
-  the destination dataset has a different shape from the source dataset. 
-  Similarly, the selection in the memory dataset could have a different shape 
-  than the selected union of hyperslabs in the original file. For simplicity, 
-  the selection is that same shape at the destination.</p>
-  
-  <p>To implement this transfer, it is necessary to:</p>
-  
-<ol>
-    <li>Get the source dataspace</li>
-    <li>Define one hyperslab selection for the source</li>
-    <li>Define a second hyperslab selection, unioned with the first</li>
-    <li>Get the destination dataspace</li>
-    <li>Define one hyperslab selection for the destination</li>
-    <li>Define a second hyperslab seletion, unioned with the first</li>
-    <li>Execute the data transfer (<code>H5Dread</code> or 
-    <code>H5Dwrite</code>) using the source and 
-        destination dataspaces</li>
-</ol><br />
-
-  <p>The example below <!-- formerly Figure 17 -->shows example code to 
-  create the selections for the source 
-  dataspace (the file). The first hyperslab is size 3 x 4 and the left upper 
-  corner at the position (1,2).  The hyperslab is a simple rectangle, so the 
-  stride and block are 1. The second hyperslab is 6 x 5 at the position (2,4). 
-  The second selection is a union with the first hyperslab 
-  (<code>H5S_SELECT_OR</code>).</p>
-
-<br />
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  fid = H5Dget_space(dataset);
-
-  /*
-   * Select first hyperslab for the dataset in the file. 
-   *   
-   */ 
-  offset[0] = 1; offset[1] = 2;
-  block[0] = 1; block[1] = 1;
-  stride[0] = 1; stride[1] = 1;
-  count[0]  = 3; count[1]  = 4;
-  ret = H5Sselect_hyperslab(fid, H5S_SELECT_SET, offset, stride, count, block); 
-  /*
-   * Add second selected hyperslab to the selection.
-   */
-  offset[0] = 2; offset[1] = 4;
-  block[0] = 1; block[1] = 1;
-  stride[0] = 1; stride[1] = 1;
-  count[0]  = 6; count[1]  = 5;
-  ret = H5Sselect_hyperslab(fid, H5S_SELECT_OR, offset, stride, count, block);</pre>
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 5. Select source hyperslabs 
-        <!-- formerly Figure 17 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>The example below <!-- formerly Figure 18 -->shows example code to 
-  create the selection for the destination 
-  in memory. The steps are similar.  In this example, the hyperslabs are the 
-  same shape, but located in different positions in the dataspace. The first 
-  hyperslab is 3 x 4 and starts at (0,0), and the second is 6 x 5 and starts at (1,2).</p>
-  
-  <p>Finally, the <code>H5Dread</code> call transfers the selected data from 
-  the file dataspace 
-  to the selection in memory.</p>
-  
-  <p>In this example, the source and destination selections are two 
-  overlapping rectangles.  In general, any number of rectangles can be 
-  OR’ed, and they do not have to be contiguous.  The order of the 
-  selections does not matter, but the first should use 
-  <code>H5S_SELECT_SET</code>; subsequent selections are unioned 
-  using <code>H5S_SELECT_OR</code>.</p>
-  
-
-  <p>It is important to emphasize that the source and destination do not 
-  have to be the same shape (or number of rectangles). As long as the two 
-  selections have the same number of elements, the data can be transferred.</p>
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  /*
-   * Create memory dataspace.
-   */
-  mid = H5Screate_simple(MSPACE_RANK, mdim, NULL);
-   
-  /*
-   * Select two hyperslabs in memory. Hyperslabs has the same
-   * size and shape as the selected hyperslabs for the file dataspace.
-   */
-  offset[0] = 0; offset[1] = 0;
-  block[0] = 1; block[1] = 1;
-  stride[0] = 1; stride[1] = 1;
-  count[0]  = 3; count[1]  = 4;
-  ret = H5Sselect_hyperslab(mid, H5S_SELECT_SET, offset, stride, count, block);     
-  offset[0] = 1; offset[1] = 2;
-  block[0] = 1; block[1] = 1;
-  stride[0] = 1; stride[1] = 1;
-  count[0]  = 6; count[1]  = 5;
-  ret = H5Sselect_hyperslab(mid, H5S_SELECT_OR, offset, stride, count, block);
-
-ret = H5Dread(dataset, H5T_NATIVE_INT, mid, fid, H5P_DEFAULT, matrix_out);</pre>
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 6. Select destination hyperslabs
-        <!-- formerly Figure 18--></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<h4>7.4.2.4. Selecting a List of Independent Points</h4>
- 
-  <p>It is also possible to specify a list of elements to read or write using 
-  the function <code>H5Sselect_elements</code>. The procedure is similar 
-  to hyperslab selections.</p>
-  
-<ol>
-    <li>Get the source dataspace</li>
-    <li>Set the selected points</li>
-    <li>Get the destination dataspacev
-    <li>Set the selected points</li>
-    <li>Transfer the data using the source and destination dataspaces</li>
-</ol><br />
-
-  <p>The figure below <!-- formerly Figure 19 -->shows an example where 
-  four values are to be written to four separate points in a two 
-  dimensional dataspace. The source dataspace is a one dimensional 
-  array with the values 53, 59, 61, 67. The destination dataspace 
-  is an 8 x 12 array.  The elements are to be written to the points 
-  (0,0), (3,3), (3,5), and (5,6). In this example, the source does not 
-  require a selection. The example below the figure 
-  <!-- formerly Figure 20 -->shows example code to implement this 
-  transfer.</p>
-  
-  <p>A point selection lists the exact points to be transferred and the order 
-  they will be transferred. The source and destination are required to have 
-  the same number of elements. A point selection can be used with a hyperslab 
-  (e.g., the source could be a point selection and the destination a hyperslab, 
-  or vice versa), so long as the number of elements selected are the same.</p>
-  
-
-<table width="400" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dspace_fig19a.jpg">
-        <br />
-        <img src="Images/Dspace_fig19b.jpg">
-        <br />
-        <img src="Images/Dspace_fig19c.jpg">
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 12. Write data to separate points
-        <!-- formerly Figure 19--></b>
-        <hr color="green" size="3"/></td>
-  </tr>
-</table>
-<br />
-<br />
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  hsize_t dim2[] = {4};       
-  int     values[] = {53, 59, 61, 67}; 
-  
-  hssize_t coord[4][2]; /* Array to store selected points 
-                                         from the file dataspace */ 
-
-  /*
-   * Create dataspace for the second dataset.
-   */
-  mid2 = H5Screate_simple(1, dim2, NULL);
-
-  /*
-   * Select sequence of NPOINTS points in the file dataspace.
-   */
-  coord[0][0] = 0; coord[0][1] = 0;
-  coord[1][0] = 3; coord[1][1] = 3;
-  coord[2][0] = 3; coord[2][1] = 5;
-  coord[3][0] = 5; coord[3][1] = 6;
-
-  ret = H5Sselect_elements(fid, H5S_SELECT_SET, NPOINTS, 
-                   (const hssize_t **)coord);
-
-  ret = H5Dwrite(dataset, H5T_NATIVE_INT, mid2, fid, H5P_DEFAULT, values);</pre>
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 7. Write data to separate points
-        <!-- formerly Figure 20 --></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<!-- NEW PAGE -->
-<h4>7.4.2.5. Combinations of Selections</h4>
-
-  <p>Selections are a very flexible mechanism for reorganizing data during a 
-  data transfer. With different combinations of <em>dataspaces</em> and 
-  selections, it is possible to implement many kinds of data transfers 
-  including sub-setting, sampling, and reorganizing the data. The table below 
-  <!-- formerly Table 2 -->gives some example combinations of 
-  source and destination, and the operations they implement.</p>
-  
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Table 2. Selection operations</b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="38%"><b>Source</b></td>
-        <td width="37%"><b>Destination</b></td>
-        <td width="25%"><b>Operation</b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>All</td>
-        <td>All</td>
-        <td>Copy whole array</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>All</td>
-        <td>All (different shape)</td>
-        <td>Copy and reorganize array</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Hyperslab</td>
-        <td>All</td>
-        <td>Sub-set</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Hyperslab</td>
-        <td>Hyperslab (same shape)</td>
-        <td>Selection</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Hyperslab</td>
-        <td>Hyperslab (different shape)</td>
-        <td>Select and rearrange</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Hyperslab with stride or block</td>
-        <td>All or hyperslab with stride 1</td>
-        <td>Sub-sample, scatter</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Hyperslab</td>
-        <td>Points</td>
-        <td>Scatter</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Points</td>
-        <td>Hyperslab or all</td>
-        <td>Gather</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Points</td>
-        <td>Points (same)</td>
-        <td>Selection</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>Points</td>
-        <td>Points (different)</td>
-        <td>Reorder points</td>
-        </tr>    
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="DSelectTransfer">
-<div align="right">
-<a href="#TOP"><font size=-1>(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-
-<br />
-
-<a name="DSelectTransfer">
-<h3 class="pagebefore">7.5. Dataspace Selection Operations and Data Transfer</h3>
-</a>
-
-
-
-  <p><em>This section is under construction.</em></p>
-  <br />
-
-
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="DRegions">
-<div align="right">
-<a href="#TOP"><font size=-1>(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-
-<!-- NEW PAGE -->
-<a name="DRegions">
-<h3 class="pagebefore">7.6. References to Dataset Regions</h3>
-</a>
-
-  <p>Another use of selections is to store a reference to a region of a 
-  dataset. An HDF5 object reference object is a pointer to an object 
-  (dataset, group, or committed datatype) in the file.  A selection can be 
-  used to create a pointer to a set of selected elements of a 
-  <em>dataset</em>, called a region reference. The selection can be 
-  either a point selection or a hyperslab selection.  </p>
-
-  <!-- editingComment
-  <span class="editingComment">
-  WORKING TOWARD AN IMPROVED PARAGRAPH:
-  In addition to the object reference, HDF5 also provides a regions reference.
-  An HDF5 Region Reference is a pointer to a selection within a dataset.
-  The selection can be either a point or hyperslab selection.  
-  </span>
-  -->
-  A more complete description of region references can be found in the
-  chapter “<a href="11_Datatypes.html">HDF5 Datatypes</a>.”
-  
-  <p>A region reference is an object maintained by the HDF5 Library. 
-  The region reference can be stored in a dataset or attribute, and then read. 
-  The dataset or attribute is defined to have the special datatype, 
-  <code>H5T_STD_REF_DSETREG</code>. </p>
-  
-  <p>To discover the elements and/or read the data, the region reference can 
-  be dereferenced. The <code>H5Rdefrerence</code> call returns an 
-  identifier for the <em>dataset</em>, and then the selected dataspace can 
-  be retrieved with <code>H5Rget_select</code> call. The selected 
-  <em>dataspace</em> can be used to read the selected data elements.</p>
-
-
-  
-<h4>7.6.1. Example Uses for Region References</h4>
-  <p>Region references are used to implement stored pointers to data within 
-  a dataset. For example, features in a large dataset might be indexed 
-  by a table. See the figure below<!-- formerly Figure 21-->. This table 
-  could be stored as an HDF5 dataset with a compound datatype, for example, 
-  with a field for the name of the feature and a region reference 
-  to point to the feature in the dataset. See the second figure below.
-  <!-- formerly Figure 22--></p>
- 
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dspace_fig21.JPG">
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 13. Features indexed by a table
-        <!-- formerly Figure 21--></b>
-        <hr color="green" size="3"/></td>
-  </tr>
-</table>
-<br />
-<br />
-
-
-
-<!-- NEW PAGE -->
-
-<table width="500" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Dspace_fig22.JPG">
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 14. Storing the table with a 
-        compound datatype<!-- formerly Figure 22--></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<h4>7.6.2. Creating References to Regions</h4>
-
-  <p>To create a region reference:</p>
-  
-<ol>
-    <li>Create or open the dataset that contains the region</li>
-    <li>Get the dataspace for the dataset</li>
-    <li>Define a selection that specifies the region</li>
-    <li>Create a region reference using the dataset and dataspace with 
-    selection</li>
-    <li>Write the region reference(s) to the desired dataset or attribute</li>
-</ol>
-
-  <p>The figure below <!-- formerly Figure 23 -->shows a diagram of a file 
-  with three datasets.  Dataset D1 and D2 are two dimensional arrays of 
-  integers. Dataset R1 is a one dimensional array of references to 
-  regions in D1 and D2.  The regions can be any valid selection 
-  of the dataspace of the target dataset.</p>
-  
-<!-- NEW PAGE -->
-<table width="400" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        a) 1 D array of region pointers, <br />each pointer refers to a 
-        <br />selection in one Dataset.<br />
-        <img src="Images/Dspace_fig23.JPG">	  
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 15. A file with three datasets
-        <!-- formerly Figure 23--></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-  <p>The example below <!-- formerly Figure 24 -->shows code to 
-  create the array of region references. 
-  The references are created in an array of type <code>hdset_reg_ref_t</code>. 
-  Each region is defined as a selection on the dataspace of the dataset, 
-  and a reference is created using <code>H5Rcreate()</code>. The call 
-  to <code>H5Rcreate()</code> specifies the file, dataset, and the 
-  dataspace with selection.</p>
-  
-  <!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  /* create an array of 4 region references */
-  hdset_reg_ref_t ref[4];
-  /*
-   * Create a reference to the first hyperslab in the first Dataset.
-   */
-  offset[0] = 1; offset[1] = 1; 
-  count[0] = 3; count[1] = 2;
-  status =  H5Sselect_hyperslab(space_id, H5S_SELECT_SET, offset, NULL, 
-        count, NULL);
-  status = H5Rcreate(&ref[0], file_id, "D1", H5R_DATASET_REGION, 
-           space_id);
-
-  /*
-   * The second reference is to a union of hyperslabs in the first
-   * Dataset
-   */
-
-  offset[0] = 5;  offset[1] = 3; 
-  count[0] = 1; count[1] = 4;
-  status = H5Sselect_none(space_id);
-  status = H5Sselect_hyperslab(space_id, H5S_SELECT_SET,offset, 
-             NULL, count, NULL);
-  offset[0] = 6;   offset[1] = 5; 
-  count[0] = 1;  count[1] = 2;
-  status = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, offset, NULL, 
-        count, NULL);
-  status = H5Rcreate(&ref[1], file_id, "D1", H5R_DATASET_REGION, 
-         space_id);
-
-  /*
-   * the fourth reference is to a selection of points in the first
-   * Dataset
-   */
-  status = H5Sselect_none(space_id);
-  coord[0][0] = 4; coord[0][1] = 4;
-  coord[1][0] = 2; coord[1][1] = 6;
-  coord[2][0] = 3; coord[2][1] = 7;
-  coord[3][0] = 1; coord[3][1] = 5;
-  coord[4][0] = 5; coord[4][1] = 8;
-  status = H5Sselect_elements(space_id, H5S_SELECT_SET,num_points,
-                              (const hssize_t **)coord);
-  status = H5Rcreate(&ref[3], file_id, "D1", H5R_DATASET_REGION, 
-       space_id);
-  /*
-   * the third reference is to a hyperslab in the second Dataset
-   */
-  offset[0] = 0;  offset[1] = 0; 
-  count[0] = 4; count[1] = 6;
-  status = H5Sselect_hyperslab(space_id2, H5S_SELECT_SET, offset, NULL, 
-          count, NULL);
-  status = H5Rcreate(&ref[2], file_id, "D2", H5R_DATASET_REGION, 
-          space_id2);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 8. Create an array of region references
-        <!-- formerly Figure 24--></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-
-  <p>When all the references are created, the array of references is written 
-  to the dataset R1. The dataset is declared to have datatype 
-  <code>H5T_STD_REF_DSETREG</code>. See the example below.
-  <!-- formerly Figure 25--></p>
-  
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  Hsize_t dimsr[1];
-  dimsr[0] = 4;
-  /* 
-   * Dataset with references.
-   */
-  spacer_id = H5Screate_simple(1, dimsr, NULL);
-  dsetr_id = H5Dcreate(file_id, "R1", H5T_STD_REF_DSETREG, 
-           spacer_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-  /*
-   * Write dataset with the references.
-   */
-  status = H5Dwrite(dsetr_id, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, 
-          H5P_DEFAULT,ref);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 9. Write the array of references to a dataset
-        <!-- formerly Figure 25--></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-
-
-
-  <p>When creating region references, the following rules are enforced.</p>
-  
-<ul>
-    <li>The selection must be a valid selection for the target <em>dataset</em>, 
-        just as when transferring data</li>
-    <li>The <em>dataset</em> must exist in the file when the reference is 
-        created (<code>H5Rcreate</code>)</li>
-    <li>The target <em>dataset</em> must be in the same file as the 
-        stored reference</li>
-</ul>
-
-<br />
-<h4>7.6.3. Reading References to Regions</h4>
-
-  <p>To retrieve data from a region reference, the reference must be read from 
-  the file, and then the data can be retrieved. The steps are:</p>
-  
-<ol>
-    <li>Open the dataset or attribute containing the reference objects</li>
-    <li>Read the reference object(s)</li>
-    <li>For each region reference, get the dataset (<code>H5R_dereference</code>) and 
-        dataspace (<code>H5Rget_space</code>)</li>
-    <li>Use the dataspace and datatype to discover what space is needed to 
-        store the data, allocate the correct storage and create a dataspace 
-        and datatype to define the memory data layout</li>
-</ol>
-
-  <p>The example below <!-- formerly Figure 26 -->shows code to read an 
-  array of region references from a 
-  dataset, and then read the data from the first selected region. Note that the 
-  region reference has information that records the dataset (within the file) 
-  and the selection on the <em>dataspace</em> of the <em>dataset</em>. 
-  After dereferencing the regions reference, the <em>datatype</em>, 
-  number of points, and some aspects of the selection can be discovered.  
-  (For a union of hyperslabs, it may not be possible to determine the exact 
-  set of hyperslabs that has been combined.) The table below the code example 
-  <!-- formerly Table 3 -->shows the inquiry functions.</p>
-<!-- NEW PAGE -->
-
-  <p>When reading data from a region reference, the following rules are 
-  enforced:</p>
-  
-<ul>
-    <li>The target <em>dataset</em> must be present and accessible in the 
-    file</li>
-    <li>The selection must be a valid selection for the <em>dataset</em></li>
-</ul>
-
-<br />
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  dsetr_id = H5Dopen (file_id, "R1", H5P_DEFAULT);
-
-  status = H5Dread(dsetr_id, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, 
-                 H5P_DEFAULT, ref_out);
-
-  /* 
-   * Dereference the first reference.
-   *   1) get the dataset (H5Rdereference)
-   *   2) get the selected dataspace (H5Rget_region)
-   */
-  dsetv_id = H5Rdereference(dsetr_id, H5R_DATASET_REGION, 
-         &ref_out[0]);
-  space_id = H5Rget_region(dsetr_id, H5R_DATASET_REGION,&ref_out[0]);
-
-
-  /*
-   *  Discover how many points and shape of the data
-   */
-  ndims = H5Sget_simple_extent_ndims(space_id);
-
-  H5Sget_simple_extent_dims(space_id,dimsx,NULL);
-
-  /* 
-   * Read and display hyperslab selection from the dataset.
-   */
-  dimsy[0] = H5Sget_select_npoints(space_id);
-  spacex_id = H5Screate_simple(1, dimsy, NULL);
-
-  status = H5Dread(dsetv_id, H5T_NATIVE_INT, H5S_ALL, space_id, 
-                 H5P_DEFAULT, data_out);
-  printf("Selected hyperslab: ");
-  for (i = 0; i < 8; i++)
-  {   
-      printf("\n");
-      for (j = 0; j < 10; j++)
-          printf("%d ", data_out[i][j]);
-  }
-  printf("\n");</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 10. Read an array of region references, and then 
-        read from the first selection
-        <!-- formerly Figure 26--></b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<br />
-
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="2" align="left" valign="bottom">
-        <b>Table 3. The inquiry functions</b></td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td width="45%"><b>Function</b></td>
-        <td width="55%"><b>Information</b></td>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5Sget_select_npoints</code></td>
-        <td>The number of elements in the selection (hyperslab 
-        or point selection).</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5Sget_select_bounds</code></td>
-        <td>The bounding box that encloses the selected 
-        points (hyperslab or point selection).</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5Sget_select_hyper_nblocks</code></td>
-        <td>The number of blocks in the selection.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5Sget_select_hyper_blocklist</code></td>
-        <td>A list of the blocks in the selection.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5Sget_select_elem_npoints</code></td>
-        <td>The number of points in the selection.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td><code>H5Sget_select_elem_pointlist</code></td>
-        <td>The points.</td>
-        </tr>
-    <tr><td colspan="2"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ("
-<a name="Programs">
-<div align="right">
-<a href="#TOP"><font size=-1>(Top)</font></a>
-</div>
-</a>
-");
--->
-</SCRIPT>
-
-
-<br />
-<!-- NEW PAGE -->
-<a name="Programs">
-<h3 class="pagebefore">7.7. Sample Programs</h3>
-</a>
-
-
-
-  This section contains the full programs from which several of the 
-  code examples in this chapter were derived.
-  The <code>h5dump</code> output from the program’s output file 
-  immediately follows each program.
-
-
-<h4>7.7.1. <a name="h5_write_c"><code>h5_write.c</code></a></h4>
-  <pre>
-----------
-#include "hdf5.h"
-
-#define H5FILE_NAME        "SDS.h5"
-#define DATASETNAME "C Matrix"
-#define NX     3                      /* dataset dimensions */
-#define NY     5
-#define RANK   2
-
-int
-main (void)
-{
-     hid_t       file, dataset;         /* file and dataset identifiers */
-     hid_t       datatype, dataspace;   /* identifiers */
-     hsize_t     dims[2];               /* dataset dimensions */
-     herr_t      status;
-     int         data[NX][NY];          /* data to write */
-     int         i, j;
-
-     /*
-      * Data  and output buffer initialization.
-      */
-     for (j = 0; j < NX; j++) {
-        for (i = 0; i < NY; i++)
-            data[j][i] = i + 1 + j*NY;
-     }
-     /*
-      *  1  2  3  4  5
-      *  6  7  8  9 10
-      * 11 12 13 14 15
-      */
-
-     /*
-      * Create a new file using H5F_ACC_TRUNC access,
-      * default file creation properties, and default file
-      * access properties.
-      */
-     file = H5Fcreate(H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-     /*
-      * Describe the size of the array and create the data space for fixed
-      * size dataset.
-      */
-     dims[0] = NX;
-     dims[1] = NY;
-     dataspace = H5Screate_simple(RANK, dims, NULL);
-
-     /*
-      * Create a new dataset within the file using defined dataspace and
-      * datatype and default dataset creation properties.
-      */
-     dataset = H5Dcreate(file, DATASETNAME, H5T_NATIVE_INT, dataspace,
-                        H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);</pre>
-<!-- NEW PAGE -->
-<pre>
-     /*
-      * Write the data to the dataset using default transfer properties.
-      */
-     status = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL,
-                      H5P_DEFAULT, data);
-
-     /*
-      * Close/release resources.
-      */
-     H5Sclose(dataspace);
-     H5Dclose(dataset);
-     H5Fclose(file);
-
-     return 0;
-}
-
-
-
-SDS.out
--------
-HDF5 "SDS.h5" {
-GROUP "/" {
-    DATASET "C Matrix" {
-       DATATYPE  H5T_STD_I32BE
-       DATASPACE  SIMPLE { ( 3, 5 ) / ( 3, 5 ) }
-       DATA {
-          1, 2, 3, 4, 5,
-          6, 7, 8, 9, 10,
-          11, 12, 13, 14, 15
-       }
-    }
-}
-}
-</pre>
-<br />
-
-<h4>7.7.2. <a name="h5_write_f90"><code>h5_write.f90</code></a></h4>
-<pre>
-------------
-      PROGRAM DSETEXAMPLE
-
-      USE HDF5 ! This module contains all necessary modules
-
-      IMPLICIT NONE
-
-      CHARACTER(LEN=7), PARAMETER :: filename = "SDSf.h5" ! File name
-      CHARACTER(LEN=14), PARAMETER :: dsetname = "Fortran Matrix" ! Dataset name
-      INTEGER, PARAMETER :: NX = 3
-      INTEGER, PARAMETER :: NY = 5
-
-      INTEGER(HID_T) :: file_id       ! File identifier
-      INTEGER(HID_T) :: dset_id       ! Dataset identifier
-      INTEGER(HID_T) :: dspace_id     ! Dataspace identifier
-
-
-      INTEGER(HSIZE_T), DIMENSION(2) :: dims = (/3,5/) ! Dataset dimensions
-      INTEGER     ::    rank = 2                       ! Dataset rank
-      INTEGER     ::    data(NX,NY)
-
-      INTEGER     ::   error ! Error flag
-      INTEGER     :: i, j</pre>
-
-<pre>
-      !
-      ! Initialize data
-      !
-        do i = 1, NX
-           do j = 1, NY
-              data(i,j) = j + (i-1)*NY
-           enddo
-        enddo
-      !
-      ! Data
-      !
-      !  1  2  3  4  5
-      !  6  7  8  9 10
-      ! 11 12 13 14 15
-
-      !
-      ! Initialize FORTRAN interface.
-      !
-      CALL h5open_f(error)
-
-      !
-      ! Create a new file using default properties.
-      !
-      CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, error)
-
-      !
-      ! Create the dataspace.
-      !
-      CALL h5screate_simple_f(rank, dims, dspace_id, error)
-
-      !
-      ! Create and write dataset using default properties.
-      !
-      CALL h5dcreate_f(file_id, dsetname, H5T_NATIVE_INTEGER, dspace_id, &
-                       dset_id, error, H5P_DEFAULT_F, H5P_DEFAULT_F, &
-                       H5P_DEFAULT_F)
-
-      CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, data, dims, error)
-
-      !
-      ! End access to the dataset and release resources used by it.
-      !
-      CALL h5dclose_f(dset_id, error)
-
-      !
-      ! Terminate access to the data space.
-      !
-      CALL h5sclose_f(dspace_id, error)
-
-      !
-      ! Close the file.
-      !
-      CALL h5fclose_f(file_id, error)
-
-      !
-      ! Close FORTRAN interface.
-      !
-      CALL h5close_f(error)
-
-      END PROGRAM DSETEXAMPLE</pre>
-
-<pre>
-SDSf.out
---------
-HDF5 "SDSf.h5" {
-GROUP "/" {
-    DATASET "Fortran Matrix" {
-       DATATYPE  H5T_STD_I32BE
-       DATASPACE  SIMPLE { ( 5, 3 ) / ( 5, 3 ) }
-       DATA {
-          1, 6, 11,
-          2, 7, 12,
-          3, 8, 13,
-          4, 9, 14,
-          5, 10, 15
-       }
-    }
-}
-}
-</pre>
-<br />
-
-<h4>7.7.3. <a name="h5_write_tr_f90"><code>h5_write_tr.f90</code></a></h4>
-<pre>
----------------
-      PROGRAM DSETEXAMPLE
-
-      USE HDF5 ! This module contains all necessary modules
-
-      IMPLICIT NONE
-
-      CHARACTER(LEN=10), PARAMETER :: filename = "SDSf_tr.h5" ! File name
-      CHARACTER(LEN=24), PARAMETER :: dsetname = "Fortran Transpose Matrix"
-                                                  ! Dataset name
-      INTEGER, PARAMETER :: NX = 3
-      INTEGER, PARAMETER :: NY = 5
-
-      INTEGER(HID_T) :: file_id       ! File identifier
-      INTEGER(HID_T) :: dset_id       ! Dataset identifier
-      INTEGER(HID_T) :: dspace_id     ! Dataspace identifier
-
-
-      INTEGER(HSIZE_T), DIMENSION(2) :: dims = (/NY, NX/) ! Dataset dimensions
-      INTEGER     ::    rank = 2                       ! Dataset rank
-      INTEGER     ::    data(NY,NX)
-
-      INTEGER     ::   error ! Error flag
-      INTEGER     :: i, j
-
-      !
-      ! Initialize data
-      !
-        do i = 1, NY
-           do j = 1, NX
-              data(i,j) = i + (j-1)*NY
-           enddo
-        enddo
-      !
-      ! Data
-      !
-      !  1  6  11
-      !  2  7  12
-      !  3  8  13
-      !  4  9  14
-      !  5 10  15
-
-      !
-      ! Initialize FORTRAN interface.
-      !
-      CALL h5open_f(error)
-
-      !
-      ! Create a new file using default properties.
-      !
-      CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, error)
-
-      !
-      ! Create the dataspace.
-      !
-      CALL h5screate_simple_f(rank, dims, dspace_id, error)
-
-      !
-      ! Create and write dataset using default properties.
-      !
-      CALL h5dcreate_f(file_id, dsetname, H5T_NATIVE_INTEGER, dspace_id, &
-                       dset_id, error, H5P_DEFAULT_F, H5P_DEFAULT_F, &
-                       H5P_DEFAULT_F)
-
-      CALL h5dwrite_f(dset_id, H5T_NATIVE_INTEGER, data, dims, error)
-
-      !
-      ! End access to the dataset and release resources used by it.
-      !
-      CALL h5dclose_f(dset_id, error)
-
-      !
-      ! Terminate access to the data space.
-      !
-      CALL h5sclose_f(dspace_id, error)
-
-      !
-      ! Close the file.
-      !
-      CALL h5fclose_f(file_id, error)
-
-      !
-      ! Close FORTRAN interface.
-      !
-      CALL h5close_f(error)
-
-      END PROGRAM DSETEXAMPLE</pre>
-<!-- NEW PAGE -->
-
-<pre>
-SDSf_tr.out
------------
-HDF5 "SDSf_tr.h5" {
-GROUP "/" {
-    DATASET "Fortran Transpose Matrix" {
-       DATATYPE  H5T_STD_I32LE
-       DATASPACE  SIMPLE { ( 3, 5 ) / ( 3, 5 ) }
-       DATA {
-          1, 2, 3, 4, 5,
-          6, 7, 8, 9, 10,
-          11, 12, 13, 14, 15
-       }
-    }
-}
-}</pre>
-
-<br /><br />
-
-</body>
-</html>
diff --git a/html/UG/OldHtmlSource/13_Attributes.html b/html/UG/OldHtmlSource/13_Attributes.html
deleted file mode 100755
index ba0fee9..0000000
--- a/html/UG/OldHtmlSource/13_Attributes.html
+++ /dev/null
@@ -1,1255 +0,0 @@
-<!doctype HTML public "-//W3C//DTD HTML 4.0 Frameset//EN">
-<html>
-<head>
-<title>Chapter 8: HDF5 Attributes</title>
-
-<!--(Meta)==========================================================-->
-
-
-<!--(Links)=========================================================-->
-
-<link href="ed_styles/NewUGelect.css" rel="stylesheet" type="text/css">
-
-<!--( Begin styles definition )=====================================-->
-<!--     Replaced with external stylesheet 'styles_NewUG.css'.      -->
-<!--( End styles definition )=======================================-->
-
-</head>
-
-<body>
-
-<!-- #BeginLibraryItem "/ed_libs/Copyright.lbi" -->
-<!--
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-  * Copyright by The HDF Group.                                               *
-  * Copyright by the Board of Trustees of the University of Illinois.         *
-  * All rights reserved.                                                      *
-  *                                                                           *
-  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
-  * terms governing use, modification, and redistribution, is contained in    *
-  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
-  * of the source code distribution tree; Copyright.html can be found at the  *
-  * root level of an installed copy of the electronic HDF5 document set and   *
-  * is linked from the top-level documents page.  It can also be found at     *
-  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
-  * access to either file, you may request a copy from help at hdfgroup.org.     *
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- -->
-<!-- #EndLibraryItem --><!-- HEADER LEFT "HDF5 User's Guide" -->
-<!-- HEADER RIGHT "HDF5 Attributes" -->
-
-<!--( TOC )=========================================================-->
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ('\
-<table x-use-null-cells\
-                align="right"\
-		width=240\
-		cellspacing=0\
-		class="tocTable">\
-  <tr valign="top"> \
-    <td class="tocTableHeaderCell" colspan="2"> \
-        <span class="TableHead">Chapter Contents</span></td>\
-  </tr>\
--->
-<!-- Table Version 3 -->\
-<!--
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Intro">1.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Intro">Introduction</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Model">2.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Model">Programming Model</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Functions">3.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Functions">Attribute (H5A) Function Summaries</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Working1">4.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Working1">Working with Attributes</a><br />\
-	    Attribute structure<br /> \
-		Create, write, read<br /> \
-		Access by name or index<br /> \
-		Obtain information<br /> \
-		Iterate, delete, close \
-	  </td>\
-  </tr>\
-\
-  <tr valign="top"> \
-    <td class="tocTableContentCell"> \
--->
-<!-- editingComment -- "tocTableContentCell" and "tocTableContentCell4" \
--->\
-<!-- are the table-closing cell class.\
-    <td class="tocTableContentCell2"> \
--->\
-<!--
-      <a href="#SpecIssues">5.</a></td>\
-    <td class="tocTableContentCell4">\
-	  <a href="#SpecIssues">Special Issues</a><br />\
-	    Large attributes<br />\
-		Attribute names<br />\
-		No partial I/O\
-  </td></tr>\
-</table>\
-')
--->
-</SCRIPT>
-<!--(End TOC)=======================================================-->
-
-
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  ] ] ]</span>
--->
-
-<!-- editingComment
--->
-
-<div align="center">
-<a name="TOP">
-<h2>Chapter 8<br /><font size="7">HDF5 Attributes</font></h2>
-</a>
-</div>
-
-
-<a name="Intro">
-<h3>8.1. Introduction</h3>
-</a>
-
-<p>An HDF5 <span class="termdefinition">attribute</span> is 
- a small metadata object describing the nature and/or 
- intended usage of a 
- <span class="termdefinition">primary data object</span>.
- A primary data object may be a dataset, group, or committed datatype.
-</p>
- 
-<p>Attributes are assumed to be very small as data objects go, so 
- storing them as standard HDF5 datasets would be quite inefficient.
- HDF5 attributes are therefore managed through a special 
- attributes interface, H5A, which is designed to easily 
- attach attributes to primary data objects as 
- small datasets containing metadata information and 
- to minimize storage requirements.</p>
-
-<p>Consider, as examples of the simplest case, a set of 
- laboratory readings taken under known temperature and 
- pressure conditions of 18.0 degrees celsius and 
- 0.5 atmospheres, respectively.  
- The temperature and pressure stored as attributes of the 
- dataset could be described as the following name/value pairs:</p>
-<pre>
-   temp=18.0
-   pressure=0.5</pre>
-
-<p>While HDF5 attributes are not standard HDF5 datasets, 
- they have much in common:</p>
-<ul>
-    <li>An attribute has a user-defined dataspace and 
-        the included metadata has a user-assigned datatype</li>
-    <li>Metadata can be of any valid HDF5 datatype</li>
-    <li>Attributes are addressed by name</li>
-</ul>
-
-<p>But there are some very important differences:</p>
- <ul>
-    <li>There is no provision for special storage such as 
-    compression or chunking</li>
-    <li>There is no partial I/O or sub-setting capability for attribute 
-    data</li>
-    <li>Attributes cannot be shared</li>
-    <li>Attributes cannot have attributes</li>
-    <li>Being small, an attribute is stored in the object header 
-        of the object it describes and is thus attached directly to 
-        that object</li>
- </ul>
-
-<p>The “<a href="#SpecIssues">Special Issues</a>” section below
- describes how to handle attributes that are large in size and how to handle
- large numbers of attributes.</p>
-
-<!-- NEW PAGE -->
-<p>This chapter discusses or lists the following:</p>
-
-<ul>
-	<li>The HDF5 attributes programming model</li>
-	<li>H5A function summaries</li>
-	<li>Working with HDF5 attributes</li>
-        <ul>
-	<li>The structure of an attribute</li>
-	<li>Creating, writing, and reading attributes</li>
-	<li>Accessing attributes by name or index</li>
-	<li>Obtaining information regarding 
-	    an object’s attributes </li>
-	<li>Iterating across an object’s attributes </li>
-	<li>Deleting an attribute </li>
-	<li>Closing attributes </li>
-        </ul>
-	<li>Special issues regarding attributes</li>
-</ul>
-
-
-<p>In the following discussions, attributes are generally 
- attached to datasets.  Attributes attached to other 
- primary data objects, i.e., groups or committed datatypes, 
- are handled in exactly the same manner.</p>
-
-
-
-
-<a name="Model">
-<h3 class="pagebefore">8.2. Programming Model</h3>
-</a>
-<p>The figure below shows the UML model for an HDF5 attribute 
-    and its associated dataspace and datatype.</p>
-
-<!--( UML Model Box )===============================================-->
-
-<table width="350" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/UML_Attribute.jpg" 
-        alt="Image of UML model for an HDF5 attribute and its 
-        associated dataspace and datatype"></td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 1. The UML model for an HDF5 attribute</b>
-        <!-- formerly Figure 2:-->
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<!--( End UML Model )===============================================-->
-
-<p>Creating an attribute is similar to creating a dataset. 
- To create an attribute, the application must specify the object 
- to which the attribute is attached, the datatype and dataspace 
- of the attribute data, and the attribute creation property list. 
-</p>
-
-<!-- NEW PAGE -->
-<p>The following steps are required to create and write 
- an HDF5 attribute:</p>
-<ol>
-     <li>Obtain the object identifier for the attribute’s primary 
-         data object</li>
-     <li>Define the characteristics of the attribute and specify the 
-         attribute creation property list</li>
-         <ul>
-         <li>Define the datatype</li>
-         <li>Define the dataspace</li>
-         <li>Specify the attribute creation property list</li>
-         </ul>
-     <li>Create the attribute</li>
-     <li>Write the attribute data (optional)</li>
-     <li>Close the attribute (and datatype, dataspace, and 
-         attribute creation property list, if necessary)</li>
-     <li>Close the primary data object (if appropriate)</li>
-</ol>
-
-
-<h4>8.2.2. To Open and Read or Write an Existing Attribute</h4>
-
-<p>The following steps are required to open and read/write
- an existing attribute.  Since HDF5 attributes allow no partial I/O,
- you need specify only the attribute and the attribute’s memory datatype 
- to read it:</p>
-<ol>
-     <li>Obtain the object identifier for the attribute’s primary 
-         data object</li>
-     <li>Obtain the attribute’s name or index</li>
-     <li>Open the attribute</li>
-         <ul>
-         <li>Get attribute dataspace and datatype (optional)</li>
-         </ul>
-     <li>Specify the attribute’s memory type</li>
-     <li>Read and/or write the attribute data</li>
-     <li>Close the attribute</li>
-     <li>Close the primary data object (if appropriate)</li>
-</ol>
-
-
-<!--
-<p>The programming model for element 1 
- can be summarized as follows:</p>
-
-<ul>
-	<li class=BulletCompact>Step 1 (optional).
-	<li class=BulletCompact>Step 2.
-	<li class=BulletCompact>Step 3.
-</ul>
-
-<p>
- First consider the simple case, text text, 
- followed by program line:
-
-<dir><pre>
-return_var = H5Xfunction (param1, 
-    param2, param3,
-    param4)
-</dir></pre>
-
- Text text text.  
-
-<p>Now consider the more generalized case, text text text.
-
-<dir><pre>
-return_var = H5Xfunction (param1, param2, param3)
-   <...<em>text text text</em>...>
-return_var = H5Xfunction (param1, param2, param3)
-   <...<em>text text text</em>...>
-return_var = H5Xfunction (param1, param2, param3)
-</pre></dir>
-
-<p>Notes: 
- Text, text text.
-
-<div class=pagenever>
-
-<h4>2.2 Programming model element 2</h4>
-
--->
-
-
-<!--
-<a name="h5dump">
-<p> </p>
-<h3 class="pagebefore">3 Using <code>h5dump</code></h3>
-</a>
-<dir>
-
-</dir>
--->
-
-<a name="Functions">
-<p> </p><!-- NEW PAGE -->
-<h3 class="pagebefore">8.3. Attribute (H5A) Function Summaries</h3>
-</a>
-<p>Functions that can be used with attributes (H5A functions) and functions 
-that can be used with property lists (H5P functions) are listed below.</p>
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 1. Attribute functions (H5A)
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Acreate</code>
-        <br />
-        <code>h5acreate_f</code></td><td> </td>
-        <td>
-        Creates a dataset as an attribute of another group, dataset, 
-        or committed datatype. 
-        The C function is a macro: see <a href="../RM/APICompatMacros.html">
-        “API Compatibility Macros in HDF5.”</a>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Acreate_by_name</code>
-        <br />
-        <code>h5acreate_by_name_f</code></td><td> </td>
-        <td>
-        Creates an attribute attached to a specified object. 
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Aexists</code>
-        <br />
-        <code>h5aexists_f</code></td><td> </td>
-        <td>
-        Determines whether an attribute with a given name exists on an object. 
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Aexists_by_name</code>
-        <br />
-        <code>h5aexists_by_name_f</code></td><td> </td>
-        <td>
-        Determines whether an attribute with a given name exists on an object. 
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Aclose</code>
-        <br />
-        <code>h5aclose_f</code></td><td> </td>
-        <td>
-        Closes the specified attribute.
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Adelete</code>
-        <br />
-        <code>h5adelete_f</code></td><td> </td>
-        <td>
-        Deletes an attribute.
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Adelete_by_idx</code>
-        <br />
-        <code>h5adelete_by_idx_f</code></td><td> </td>
-        <td>
-        Deletes an attribute from an object according to index order. 
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Adelete_by_name</code>
-        <br />
-        <code>h5adelete_by_name_f</code></td><td> </td>
-        <td>
-        Removes an attribute from a specified location. 
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Aget_create_plist</code>
-        <br />
-        <code>h5aget_create_plist_f</code></td><td> </td>
-        <td>
-        Gets an attribute creation property list identifier. 
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Aget_info</code>
-        <br />
-        <code>h5aget_info_f</code></td><td> </td>
-        <td>
-        Retrieves attribute information by attribute identifier. 
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Aget_info_by_idx</code>
-        <br />
-        <code>h5aget_info_by_idx_f</code></td><td> </td>
-        <td>
-        Retrieves attribute information by attribute index position. 
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Aget_info_by_name</code>
-        <br />
-        <code>h5aget_info_by_name_f</code></td><td> </td>
-        <td>
-        Retrieves attribute information by attribute name. 
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Aget_name</code>
-        <br />
-        <code>h5aget_name_f</code></td><td> </td>
-        <td>
-        Gets an attribute name.
-        </td></tr>
-    <!-- NEW PAGE -->
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Aget_name_by_idx</code>
-        <br />
-        <code>h5aget_name_by_idx_f</code></td><td> </td>
-        <td>
-        Gets an attribute name by attribute index position.
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Aget_space</code>
-        <br />
-        <code>h5aget_space_f</code></td><td> </td>
-        <td>
-        Gets a copy of the dataspace for an attribute.
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Aget_storage_size</code>
-        <br />
-        <code>h5aget_storage_size_f</code></td><td> </td>
-        <td>
-        Returns the amount of storage required for an attribute. 
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Aget_type</code>
-        <br />
-        <code>h5aget_type_f</code></td><td> </td>
-        <td>
-        Gets an attribute datatype.
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Aiterate</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Calls a user’s function for each attribute 
-        attached to a data object.
-        The C function is a macro: see <a href="../RM/APICompatMacros.html">
-        “API Compatibility Macros in HDF5.”</a>
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Aiterate_by_name</code>
-        <br />
-        <code>(none)</code></td><td> </td>
-        <td>
-        Calls user-defined function for each attribute on an object. 
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Aopen</code>
-        <br />
-        <code>h5aopen_f</code></td><td> </td>
-        <td>
-        Opens an attribute for an object specified by object identifier and 
-        attribute name. 
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Aopen_by_idx</code>
-        <br />
-        <code>h5aopen_by_idx_f</code></td><td> </td>
-        <td>
-        Opens an existing attribute that is attached to an object specified by 
-        location and name.
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Aopen_by_name</code>
-        <br />
-        <code>h5aopen_by_name_f</code></td><td> </td>
-        <td>
-        Opens an attribute for an object by object name and attribute name. 
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Aread</code>
-        <br />
-        <code>h5aread_f</code></td><td> </td>
-        <td>
-        Reads an attribute.
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Arename</code>
-        <br />
-        <code>h5arename_f</code></td><td> </td>
-        <td>
-        Renames an attribute. 
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Arename_by_name</code>
-        <br />
-        <code>h5arename_by_name_f</code></td><td> </td>
-        <td>
-        Renames an attribute. 
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Awrite</code>
-        <br />
-        <code>H5awrite_f</code></td><td> </td>
-        <td>
-        Writes an attribute.
-        </td></tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-<br />
-
-
-
-
-
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 2. Attribute creation property list 
-        functions (H5P) </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign=top> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign=top> 
-        <td>
-        <code>H5Pset_char_encoding<br />h5pset_char_encoding_f</code> 
-        </td><td> </td>
-        <td>
-        Sets the character encoding used to encode a string. 
-        Use to set ASCII or UTF-8 character encoding for object names.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign=top> 
-        <td>
-        <code>H5Pget_char_encoding<br />h5pget_char_encoding_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the character encoding used to create a string. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign=top> 
-        <td>
-        <code>H5Pget_attr_creation_order<br />h5pget_attr_creation_order_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves tracking and indexing settings for attribute creation order. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign=top> 
-        <td>
-        <code>H5Pget_attr_phase_change<br />h5pget_attr_phase_change_f</code> 
-        </td><td> </td>
-        <td>
-        Retrieves attribute storage phase change thresholds. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign=top> 
-        <td>
-        <code>H5Pset_attr_creation_order<br />h5pget_attr_creation_order_f</code> 
-        </td><td> </td>
-        <td>
-        Sets tracking and indexing of attribute creation order. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign=top> 
-        <td>
-        <code>H5Pset_attr_phase_change<br />h5pset_attr_phase_change_f</code> 
-        </td><td> </td>
-        <td>
-        Sets attribute storage phase change thresholds. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-
-<a name="Working1">
-<p> </p><!-- NEW PAGE -->
-<h3 class="pagebefore">8.4. Working with Attributes</h3>
-</a>
-
-
-<h4>8.4.1. The Structure of an Attribute</h4>
-
-<p>An attribute has two parts: name and value(s)</p>
-<p>HDF5 attributes are sometimes discussed as name/value pairs 
- in the form <code>name=value</code>.</p>
-
-<p>An attribute’s name is a null-terminated ASCII or UTF-8 
-character string. Each attribute attached to an object has a unique name.
-</p>
-
-<p>The value portion of the attribute contains 
- one or more data elements of the same datatype. 
-</p>
-
-<p>HDF5 attributes have all the characteristics of HDF5 datasets
- except that there is no partial I/O capability. In other words,
- attributes can be written and read only in full with no sub-setting.
-</p>
-
-
-<h4>8.4.2. Creating, Writing, and Reading Attributes</h4>
-
-<p>If attributes are used in an HDF5 file, 
- these functions will be employed: <code>H5Acreate</code>, 
- <code>H5Awrite</code>, and <code>H5Aread</code>.
- <code>H5Acreate</code> and <code>H5Awrite</code> are used together
- to place the attribute in the file.
- If an attribute is to be used and is not currently in memory,
- <code>H5Aread</code> generally comes into play 
- usually in concert with one each of the 
- <code>H5Aget_*</code> and <code>H5Aopen_*</code> functions.
-</p>
-
-<dl>
- <dt><span class="RunningHead">To create an attribute</span>, 
-     call <code>H5Acreate</code>:
-
- <dd>
-            
-    <code>hid_t H5Acreate (hid_t <em>loc_id</em>, 
-          const char *<em>name</em>, 
-          <br />
-                  
-          hid_t <em>type_id</em>, 
-          hid_t <em>space_id</em>, 
-          hid_t <em>create_plist</em>,
-          <br />
-                  
-          hid_t <em>access_plist</em>)</code>
-</dl>
- 
-<p><code>loc_id</code> identifies the object (dataset, group, or committed 
-datatype) to which the attribute is to be attached. 
- 
- <code>name</code>, 
- <code>type_id</code>,
- <code>space_id</code>, and 
- <code>create_plist</code>
- convey, respectively, the attribute’s name, datatype, dataspace, 
- and attribute creation property list.
- The attribute’s name must be locally unique: 
- it must be unique within the context of the object 
- to which it is attached.</p>
-
-<p><code>H5Acreate</code> creates the attribute in memory. 
- The attribute does not exist in the file until <code>H5Awrite</code> 
- writes it there.
-</p>
-
-<dl>
- <dt><span class="RunningHead">To write or read an attribute</span>, 
-     call <code>H5Awrite</code> or <code>H5Aread</code>, respectively:
-
- <dd>
-            
-    <code>herr_t H5Awrite (hid_t <em>attr_id</em>, 
-          hid_t <em>mem_type_id</em>, 
-          <br />
-                  
-          const void *<em>buf</em>)</code>
-
- <dd>
-            
-    <code>herr_t H5Aread (hid_t <em>attr_id</em>, 
-          hid_t <em>mem_type_id</em>, 
-          <br />
-                  
-          void *<em>buf</em>)</code>
-</dl>
-
-<p><code>attr_id</code> identifies the attribute while
- <code>mem_type_id</code> identifies the in-memory datatype 
- of the attribute data.
-</p>
-
-<p><code>H5Awrite</code> writes the attribute data 
- from the buffer <code>buf</code> to the file. 
- <code>H5Aread</code> reads attribute data from the file into
- <code>buf</code>.
-</p>
-
-<p>The HDF5 Library converts the metadata between the 
- in-memory datatype, <code>mem_type_id</code>, and 
- the in-file datatype, defined when the attribute was created,
- without user intervention.</p>
-
- 
-
-<h4>8.4.3. Accessing Attributes by Name or Index</h4>
-
-<p>Attributes can be accessed by name or index value. 
- The use of an index value makes it possible to iterate 
- through all of the attributes associated with a given object. </p>
-
-<p><span class="RunningHead">To access an attribute by its name</span>, 
-use the <code>H5Aopen_by_name</code> function. <code>H5Aopen_by_name</code> 
-returns an attribute identifier that can then be used by any function that 
-must access an attribute such as <code>H5Aread</code>.
-Use the function <code>H5Aget_name</code> to determine an attribute’s name.
-</p>
-
-<p><span class="RunningHead">To access an attribute by its index value
-</span>, use the <code>H5Aopen_by_idx</code> function. To determine an 
-attribute index value when it is not already known, 
-use the <code>H5Oget_info</code>function. <code>H5Aopen_by_idx</code> is 
-generally used in the course of opening several attributes for later access. 
-Use <code>H5Aiterate</code> if the intent is to 
-perform the same operation on every attribute attached to an object.
-</p>
-
-
-<h4>8.4.4. Obtaining Information Regarding an Object’s Attributes</h4>
-
-<p>In the course of working with HDF5 attributes, one may need to 
- obtain any of several pieces of information:</p>
-<ul>
-	<li>An attribute name</li>
-	<li>The dataspace of an attribute </li>
-	<li>The datatype of an attribute </li>
-	<li>The number of attributes attached to an object</li>
-</ul>
-
-<span class="RunningHead">To obtain an attribute’s name</span>, 
-     call <code>H5Aget_name</code> with an attribute identifier, 
-     <code>attr_id</code>:
-
- <pre>
-        <code>ssize_t H5Aget_name (hid_t attr_id, size_t buf_size, 
-            char *buf)</code>
-</pre>
-
-<p>As with other attribute functions, <code>attr_id</code> 
- identifies the attribute; <code>buf_size</code> defines the size of the 
- buffer; and <code>buf</code> is the buffer to which the attribute’s name 
- will be read. 
-</p>
-
-<p>If the length of the attribute name, and hence the value required for 
- <code>buf_size</code>, is unknown, a first call to 
- <code>H5Aget_name</code> will return that size.  If the value of
- <code>buf_size</code> used in that first call is too small,
- the name will simply be truncated in <code>buf</code>.
- A second <code>H5Aget_name</code> call can then be used to retrieve the 
- name in an appropriately-sized buffer.
-</p>
-
-
-
-<span class="RunningHead">To determine the dataspace or datatype 
-     of an attribute</span>, call <code>H5Aget_space</code> or 
-     <code>H5Aget_type</code>, respectively:
-
-<pre>
-        <code>hid_t H5Aget_space (hid_t <em>attr_id</em>)</code>
-
-        <code>hid_t H5Aget_type (hid_t <em>attr_id</em>)</code>
-
-</pre>
-<p><code>H5Aget_space</code> returns the dataspace identifier
- for the attribute <code>attr_id</code>.
-</p>
-
-<p><code>H5Aget_type</code> returns the datatype identifier
- for the attribute <code>attr_id</code>.
-</p>
-
-
-<span class="RunningHead">To determine the number of attributes 
-     attached to an object</span>, use the <code>H5Oget_info</code> function.
-     The function signature is below. 
-
-<pre>
-        herr_t H5Oget_info( hid_t object_id, H5O_info_t *object_info  ) 
-</pre>
-
-<p>The number of attributes will be returned in the <code>object_info</code> 
-buffer. This is generally the preferred first step in determining attribute 
-index values. If the call returns <code>N</code>, the 
-attributes attached to the object <code>object_id</code> 
-have index values of <code>0</code> through <code>N</code>
-<code>-1</code>.
-</p>
-
-
-<h4>8.4.5. Iterating across an Object’s Attributes</h4>
-
-<p>It is sometimes useful to be able to perform the identical operation
- across all of the attributes attached to an object.  
- At the simplest level, you might just want to open each attribute.
- At a higher level, you might wish to perform a rather complex operation 
- on each attribute as you iterate across the set.
-</p>
-
-<dl>
- <dt><span class="RunningHead">To iterate an operation across the 
-     attributes attached to an object</span>, 
-     one must make a series of calls to <code>H5Aiterate</code>:
-
- <dd>
-            
-    <code>herr_t H5Aiterate (hid_t <em>obj_id</em>, 
-          H5_index_t <em>index_type</em>, 
-          <br />
-                  
-          H5_iter_order_t <em>order</em>, 
-          hsize_t *<em>n</em>,
-          H5A_operator2_t <em>op</em>, 
-          <br />
-                  
-          void *<em>op_data</em>)</code>
-
-</dl>
-
-<p><code>H5Aiterate</code> successively marches across all of the 
- attributes attached to the object specified in 
- <code>loc_id</code>, performing the operation(s) 
- specified in <code>op_func</code> with the data
- specified in <code>op_data</code> on each attribute.
-</p>
-
-<p>When <code>H5Aiterate</code> is called, 
-<code>index</code> contains the index of the attribute 
-to be accessed in this call. 
-When <code>H5Aiterate</code> returns, <code>index</code> 
-will contain the index of the next attribute. 
-If the returned <code>index</code> is the null pointer, 
-then all attributes have been processed, and the iterative process 
-is complete. 
-</p>
-
-<p><code>op_func</code> is a user-defined operation 
- that adheres to the <code>H5A_operator_t</code> prototype.
- This prototype and certain requirements imposed on the operator’s 
- behavior are  described in the <code>H5Aiterate</code> entry
- in the <a href="../RM/RM_H5Front.html">
- <cite>HDF5 Reference Manual</cite></a>.
-</p>
-
-<p><code>op_data</code> is also user-defined to meet
- the requirements of <code>op_func</code>.
- Beyond providing a parameter with which to pass this data, 
- HDF5 provides no tools for its management and imposes no restrictions.
-</p>
-
-
-<!-- editingComment
-  <p class=editingcommentlt>[ [ [ Need example? ] ] ]</p>
--->
-
-
-<h4>8.4.6. Deleting an Attribute</h4>
-
-<p>Once an attribute has outlived its usefulness or 
- is no longer appropriate, it may become necessary to delete it.
-</p>
-
-<dl>
- <dt><span class="RunningHead">To delete an attribute</span>, 
-     call <code>H5Adelete</code>:
-
- <dd>
-            
-    <code>herr_t H5Adelete (hid_t <em>loc_id</em>, 
-          const char *<em>name</em>)</code>
-</dl>
-
-<p><code>H5Adelete</code> removes the attribute 
- <code>name</code> from the group, dataset, or 
- committed datatype specified in <code>loc_id</code>.
-</p>
-
-<p><code>H5Adelete</code> must not be called if there are 
- any open attribute identifiers on the object 
- <code>loc_id</code>.  Such a call can cause 
- the internal attribute indexes to change; future writes to 
- an open attribute would then produce unintended results.
-</p>
-
-
-<!-- NEW PAGE -->
-<h4>8.4.7. Closing an Attribute</h4>
-
-<p>As is the case with all HDF5 objects, once access to an attribute 
- it is no longer needed, that attribute must be closed.
- It is best practice to close it as soon as practicable;
- it is mandatory that it be closed prior to the <code>H5close</code> 
- call closing the HDF5 Library.
-</p>
-
-<dl>
- <dt><span class="RunningHead">To close an attribute</span>, 
-     call <code>H5Aclose</code>:
-
- <dd>
-            
-    <code>herr_t H5Aclose (hid_t <em>attr_id</em>)</code>
-</dl>
-
-<p><code>H5Aclose</code> closes the specified attribute by terminating 
- access to its identifier, <code>attr_id</code>.
-</p>
-
-<a name="SpecIssues">
-<h3 class="pagebefore">8.5. Special Issues</h3>
-</a>
-<p>Some special issues for attributes are discussed below.</p>
-
-
-
-<h4>Large Numbers of Attributes Stored in Dense Attribute Storage</h4>
-<p>The dense attribute storage scheme was added in version 1.8 so that
-datasets, groups, and committed datatypes that have large numbers of 
-attributes could be processed more quickly.</p> 
-
-<p>Attributes start out being stored in an object's header. This is 
-known as compact storage. See the <a href="UG_frame10Datasets.html">
-“Datasets”</a> chapter for more information on compact, 
-contiguous, and chunked storage.</p>
-
-<p>As the number of attributes grows, attribute-related performance 
-slows. To improve performance, dense attribute storage can be initiated 
-with the <code>H5Pset_attr_phase_change</code> function. See the 
-<a href=http://www.hdfgroup.org/HDF5/doc/RM/RM_H5Front.html>
-<cite>HDF5 Reference Manual</cite></a> for more information. </p>
-
-<p>When dense attribute storage is enabled, a threshold is defined for
-the number of attributes kept in compact storage. When the number
-is exceeded, the library moves all of the attributes into dense 
-storage at another location. The library handles the movement of
-attributes and the pointers between the locations automatically. 
-If some of the attributes are deleted so that the number falls below
-the threshold, then the attributes are moved back to compact storage
-by the library.</p> 
-
-<p>The improvements in performance from using dense attribute storage 
-are the result of holding attributes in a heap and indexing the heap
-with a B-tree.</p>
-
-<p>Note that there are some disadvantages to using dense attribute 
-storage. One is that this is a new feature. Datasets, groups, and 
-committed datatypes that use dense storage cannot be read by 
-applications built with earlier versions of the library. Another 
-disadvantage is that attributes in dense storage cannot be compressed.</p>
-
-<h4>Large Attributes Stored in Dense Attribute Storage</h4>
-
-<p>We generally consider the maximum size of an attribute to be 64K 
-bytes. The library has two ways of storing attributes larger than 64K 
-bytes: in dense attribute storage or in a separate dataset. Using dense
-attribute storage is described in this section, and storing in a 
-separate dataset is described in the next section.</p>
-
-<p>To use dense attribute storage to store large attributes, set the 
-number of attributes that will be stored in compact storage to 0 with 
-the <code>H5Pset_attr_phase_change</code> function. This will force 
-all attributes to be put into dense attribute storage and will avoid 
-the 64KB size limitation for a single attribute in compact attribute 
-storage.</p>
-
-<p>The example code below illustrates how to create a large attribute 
-that will be kept in dense storage.</p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-/*
-Test use of dense attribute
-
-*/
-#define N 82000000
-#include "hdf5.h"
-#include <stdio.h>
-#include <stdlib.h>
-
-int main(){
-
-hid_t fid, gid, sid, aid, gpid, fpid;
-hsize_t dims[] = {N};
-double *buf;
-int i;
-herr_t status;
-
-buf = (double *) malloc(sizeof(double) * N);
-for (i=0; i <N; i++) { buf[i] = -100.0; }
-fpid = H5Pcreate (H5P_FILE_ACCESS);
-status = H5Pset_libver_bounds (fpid, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
-fid = H5Fcreate("adense.h5", H5F_ACC_TRUNC, H5P_DEFAULT, fpid);
-gpid = H5Pcreate (H5P_GROUP_CREATE);
-status = H5Pset_attr_phase_change (gpid, 0, 0);
-
-gid = H5Gcreate(fid, "testgrp", H5P_DEFAULT, gpid, H5P_DEFAULT);
-sid = H5Screate_simple(1, dims, NULL);
-
-aid = H5Acreate(gid, "bar", H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT);
-status = H5Awrite(aid, H5T_NATIVE_DOUBLE, buf);
-
-/* If you remove these two lines, it doesn't crash */
-status = H5Aclose(aid);
-status = H5Pclose (gpid);
-status = H5Pclose (fpid);
-status = H5Gclose(gid);
-status = H5Fclose (fid);
-
-return 0;
-}
-
-</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-
-    <tr valign="top">
-        <td align="left">
-        <b>Example 1. Create a large attribute in dense storage</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<h4>Large Attributes Stored in a Separate Dataset</h4>
-
-<p>In addition to dense attribute storage (see above), a large attribute 
-can be stored in a separate dataset. In the figure below, DatasetA holds 
-an attribute that is too large for the object header in Dataset1. By putting 
-a pointer to DatasetA as an attribute in Dataset1, the attribute becomes 
-available to those working with Dataset1.</p>
-<!-- formerly Figure 3 -->
-
-<p>This way of handling large attributes can be used in situations where
-backward compatibility is important and where compression is important. 
-Applications built with versions before 1.8.x can read large 
-attributes stored in separate datasets. Datasets can be compressed 
-while attributes cannot. </p>
-
-
-<table width="400" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <img src="Images/Shared_Attribute.jpg"></td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 2. A large or shared HDF5 attribute 
-        and its associated dataset(s)</b>
-        <!-- formerly Figure 3: -->
-        <br /><code>DatasetA</code> is an attribute of 
-        <code>Dataset1</code> that is too large 
-        to store in <code>Dataset1's</code> header.  
-        <code>DatasetA</code> is associated with <code>Dataset1</code> 
-        by means of an object reference pointer attached as an 
-        attribute to <code>Dataset1</code>. The attribute in 
-        <code>DatasetA</code> can be shared among multiple datasets by 
-        means of additional object reference pointers attached
-        to additional datasets.
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-<h4>Shared Attributes</h4>
-<p>Attributes written and managed through the H5A interface cannot 
-be shared. If shared attributes are required, they must be handled 
-in the manner described above for large attributes and illustrated 
-in the figure above<!-- formerly Figure 3 -->.</p>
-
-<h4>Attribute Names</h4>
-<p>While any ASCII or UTF-8 character may be used in the name given 
-to an attribute, it is usually wise to avoid the following kinds of 
-characters:</p>
-<ul>
-    <li>Commonly used separators or delimiters such as slash, backslash, 
-    colon, and semi-colon (\, /, :, ;)</li>
-    <li>Escape characters</li>
-    <li>Wild cards such as asterisk and question mark (*, ?)</li>
-</ul>
-<p>NULL can be used within a name, but HDF5 names are terminated with 
-a NULL: whatever comes after the NULL will be ignored by HDF5.</p>
-
-<p>The use of ASCII or UTF-8 characters is determined by the character 
-encoding property. See <code>H5Pset_char_encoding</code> in the 
-<a href="http://www.hdfgroup.org/HDF5/doc/RM/RM_H5Front.html">
-<cite>HDF5 Reference Manual</cite></a>.</p>
-
-<h4>No Special I/O or Storage</h4>
-<p>HDF5 attributes have all the characteristics of HDF5 datasets 
-     except the following:</p>
-     <ul>
-     <li>Attributes are written and read only in full: 
-       there is no provision for partial I/O or sub-setting</li>
-     <li>No special storage capability is provided for attributes: 
-       there is no compression or chunking, and 
-       attributes are not extendable</li>
-    </ul>
-        
-
-<!--
-<a name="Examples">
-<p> </p>
-<h3 class="pagebefore">13.00 Code Examples for Text Text Text</h3>
-</a>
-<dir>
-
-
-<p class=editingcomment>[ [ [ Comprehensive example set yet to be prepared. ] ] ]</p>
-
-
-<h4>13.00.1 Example using text text text</h4>
-
-
-<p>The following example ....:
- </p>
-
-<dir><pre>
-code
-code
-code
-</pre></dir>
-
-<h4>13.00.2 Example using text text text</h4>
-
-<p>This example shows how ....:
- </p>
-
-<dir><pre>
-code
-code
-code
-</pre></dir>
-
-</dir>
--->
- 
-
-</body>
-</html>
diff --git a/html/UG/OldHtmlSource/13_ErrorHandling.html b/html/UG/OldHtmlSource/13_ErrorHandling.html
deleted file mode 100755
index f696e4e..0000000
--- a/html/UG/OldHtmlSource/13_ErrorHandling.html
+++ /dev/null
@@ -1,1121 +0,0 @@
-<!doctype HTML public "-//W3C//DTD HTML 4.0 Frameset//EN">
-<html>
-<head>
-<title>Chapter 9: HDF5 Error Handling</title>
-
-<!--(Meta)==========================================================-->
-
-<!--(Links)=========================================================-->
-
-<!--( Begin styles definition )=====================================-->
-<link href="ed_styles/NewUGelect.css" rel="stylesheet" type="text/css">
-<!--( End styles definition )=======================================-->
-
-</head> 
-
-<body>
-
-<!-- #BeginLibraryItem "/ed_libs/Copyright.lbi" -->
-<!--
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-  * Copyright by The HDF Group.                                               *
-  * Copyright by the Board of Trustees of the University of Illinois.         *
-  * All rights reserved.                                                      *
-  *                                                                           *
-  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
-  * terms governing use, modification, and redistribution, is contained in    *
-  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
-  * of the source code distribution tree; Copyright.html can be found at the  *
-  * root level of an installed copy of the electronic HDF5 document set and   *
-  * is linked from the top-level documents page.  It can also be found at     *
-  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
-  * access to either file, you may request a copy from help at hdfgroup.org.     *
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- -->
-<!-- #EndLibraryItem --><!--( TOC )=========================================================-->
-<SCRIPT language="JavaScript">
-<!--
-document.writeln ('\
-<table x-use-null-cells\
-                align="right"\
-		width="240"\
-		cellspacing="0"\
-		class="tocTable">\
-  <tr valign="top"> \
-    <td class="tocTableHeaderCell" colspan="2"> \
-        <span class="TableHead">Chapter Contents</span></td>\
-  </tr>\
--->
-<!-- Table Version 3 -->\
-<!--
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Intro">1.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Intro">Introduction</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#ProgModel">2.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#ProgModel">Programming Model</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#ErrorHandling">3.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#ErrorHandling">Error Handling (H5E) Function Summaries</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#BasicErrorHandling">4.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#BasicErrorHandling">Basic Error Handling Operations</a>\
-	  </td>\
-  </tr>\
-  <tr valign="top">\
-    <td class="tocTableContentCell">\
-      <a href="#AdvancedErrorHandling">5.</a></td>\
-    <td class="tocTableContentCell4">\
-      <a href="#AdvancedErrorHandling">Advanced Error Handling Operations</a>\
-      </td>\
-\
--->
-<!-- editingComment -- "tocTableContentCell" and "tocTableContentCell4" \
--->\
-<!-- are the table-closing cell class.\
--->\
-<!--
-\
-</table>\
-')
--->
-</SCRIPT>
-<!--(End TOC)=======================================================-->
-
-<!-- HEADER LEFT "HDF5 User's Guide" -->
-<!-- HEADER RIGHT "HDF5 Error Handling" -->
-
-<div align="center">
-<a name="TOP">
-<h2>Chapter 9<br><font size="7">HDF5 Error Handling</font></h2>
-</a>
-</div>
-
-<a name="Intro">
-<h3>9.1. Introduction</h3>
-</a>
-
-<p>The HDF5 Library provides an error reporting mechanism for both 
-  the library itself and for user application programs.  It can trace 
-  errors through function stack and error information like file name, 
-  function name, line number, and error description.  </p>
-
-<p>Section 2 of this chapter discusses the HDF5 error handling programming 
-  model.  </p>
-
-<p>Section 3 presents summaries of HDF5’s error handling functions.</p>
-
-<p>Section 4 discusses the basic error concepts such as error 
-  stack, error record, and error message and describes the related API 
-  functions.  
-  These concepts and functions are sufficient for application programs to 
-  trace errors inside the HDF5 Library.</p>
-
-<p>Section 5 talks about the advanced concepts of error class and error 
-  stack handle and talks about the related functions.  With these concepts 
-  and functions, 
-  an application library or program using the HDF5 Library can have its own 
-  error report blended with HDF5’s error report.</p>
-
-<p>Starting with Release 1.8, we have a new set of Error Handling API functions.
-  For the purpose of backward compatibility with version 1.6 and before, we 
-  still keep the old API functions, <code>H5Epush</code>, <code>H5Eprint</code>,
-  <code>H5Ewalk</code>, <code>H5Eclear</code>, <code>H5Eget_auto</code>, 
-  <code>H5Eset_auto</code>.  These functions do not have the error stack as 
-  parameter.  The library allows them to operate on the default error stack.  
-  Users do not have to change their code to catch up with the new Error API 
-  but are encouraged to do so.</p>
-
-<p>The old API is similar to functionality discussed in Section 4.  The 
-  functionality discussed in Section 5, the ability of allowing applications to 
-  add their own error records, is the library new design for the Error API.</p>
-
-
-<a name="ProgModel">
-<h3 class="pagebefore">9.2. Programming Model</h3>
-</a>
-<p><i>This section is under construction.</i></p>
-
-<!-- NEW PAGE -->
-<a name="ErrorHandling">
-<h3 class="pagebefore">9.3. Error Handling (H5E) Function Summaries</h3>
-</a>
-<p>Functions that can be used to handle errors (H5E functions) are listed 
-below. </p>
-<br />
-
-
-<table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <b>Function Listing 1. Error handling functions (H5E)
-        </b></td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <b>C Function<br />Fortran Function</b>
-        </td><td> </td>
-        <td>
-        <b>Purpose</b>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Eauto_is_v2<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Determines the type of error stack.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Eclear<br />h5eclear_f</code> 
-        </td><td> </td>
-        <td>
-        Clears the error stack for the current thread.
-        The C function is a macro: see <a href="../RM/APICompatMacros.html">
-        “API Compatibility Macros in HDF5.”</a>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Eclear_stack<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Clears the error stack for the current thread.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Eclose_msg<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Closes an error message identifier.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Eclose_stack<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Closes object handle for error stack.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Ecreate_msg<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Add major error message to an error class.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Eget_auto<br />h5eget_auto_f</code> 
-        </td><td> </td>
-        <td>
-        Returns the current settings for the automatic error stack 
-        traversal function and its data.
-        The C function is a macro: see <a href="../RM/APICompatMacros.html">
-        “API Compatibility Macros in HDF5.”</a>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Eget_class_name<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Retrieves error class name.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Eget_current_stack<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Registers the current error stack.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Eget_msg<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Retrieves an error message.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Eget_num<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Retrieves the number of error messages in an error stack.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Epop<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Deletes specified number of error messages from the error stack.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Eprint<br />h5eprint_f</code> 
-        </td><td> </td>
-        <td>
-        Prints the error stack in a default manner.
-        The C function is a macro: see <a href="../RM/APICompatMacros.html">
-        “API Compatibility Macros in HDF5.”</a>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Epush<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Pushes new error record onto error stack.
-        The C function is a macro: see <a href="../RM/APICompatMacros.html">
-        “API Compatibility Macros in HDF5.”</a>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Eregister_class<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Registers a client library or application program 
-        to the HDF5 error API.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Eset_auto<br />h5eset_auto_f</code> 
-        </td><td> </td>
-        <td>
-        Turns automatic error printing on or off.
-        The C function is a macro: see <a href="../RM/APICompatMacros.html">
-        “API Compatibility Macros in HDF5.”</a>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Eset_current_stack<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Replaces the current error stack.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Eunregister_class<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Removes an error class.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top"> 
-        <td>
-        <code>H5Ewalk<br />(none)</code> 
-        </td><td> </td>
-        <td>
-        Walks the error stack for the current thread, 
-        calling a specified function.
-        The C function is a macro: see <a href="../RM/APICompatMacros.html">
-        “API Compatibility Macros in HDF5.”</a>
-        </td>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-</table>
-<br />
-
-
-
-<!-- NEW PAGE -->
-<a name="BasicErrorHandling">
-<h3>9.4. Basic Error Handling Operations</h3>
-</a>
-
-<h4>9.4.1. Introduction</h4>
-
-<p>Let us first try to understand the error stack.  An <em>error stack</em> 
-  is a collection of error records.   Error records can be pushed onto or 
-  popped off the error stack.  By default, when an error occurs deep within 
-  the HDF5 Library, an error record is pushed onto an error stack and that 
-  function returns a failure indication. Its caller detects the failure, pushes 
-  another record onto the stack, and returns a failure indication.  This 
-  continues until the API function called by the application returns a failure 
-  indication.  The next API function being called will reset the error stack.  
-  All HDF5 Library error records belong to the same error class (explained in 
-  Section 5).</p>
-  
-<h4>9.4.2. Error Stack and Error Message</h4>
-
-<p>In normal circumstances, an error causes the stack to be printed on the 
-  standard error stream automatically.  This automatic error stack is the 
-  library’s default stack.  For all the functions in this section, 
-  whenever an error stack ID is needed as a parameter, <code>H5E_DEFAULT</code> 
-  can be used to indicate the library’s default stack.  The first 
-  error record of the error stack, number <code>#000</code>, is produced 
-  by the API function itself and is usually sufficient to indicate to 
-  the application what went wrong.</p>
-  
-<h4>Example: An Error Report</h4>
-
-<p>If an application calls <code>H5Tclose</code> on a predefined datatype, 
-  then the message in the example below is printed on the standard error 
-  stream. 
-  This is a simple error that has only one component, the API function; 
-  other errors may have many components.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  HDF5-DIAG: Error detected in HDF5 (1.6.4) thread 0.
-    #000: H5T.c line 462 in H5Tclose(): predefined datatype
-      major: Function argument
-      minor: Bad value</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 1. An error report</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<p>In the example above, we can see that an <em>error record</em> has a major 
-  message and a minor message. A <em>major message</em> generally 
-  indicates where the error happens.  The location can be a dataset or 
-  a dataspace, for example.  A <em>minor message</em> explains further 
-  details of the error. An example is “unable to open file”.  
-  Another 
-  specific detail about the error can be found at the end of the first 
-  line of each error record.  This <em>error description</em> is usually 
-  added by the library designer to tell what exactly goes wrong.  
-  In the example above, the “predefined datatype” is an error 
-  description.</p>
-  
-<h4>9.4.3. Print and Clear an Error Stack</h4>
-
-<p>Besides the automatic error report, the error stack can also be printed 
-  and cleared by the functions <code>H5Eprint()</code> and 
-  <code>H5Eclear_stack()</code>.  If an application wishes to make explicit 
-  calls to <code>H5Eprint()</code> to print the error stack, the 
-  automatic printing should be turned off to prevent error messages from 
-  being displayed twice (see <code>H5Eset_auto()</code> below). </p>
-
-<!-- NEW PAGE -->
-  <p><b>To print an error stack</b></p>
-  
-<p><code><em>herr_t</em> H5Eprint(<em>hid_t</em> 
-  error_stack, <em>FILE *</em> stream)</code></p>
-
-<p>This function prints the error stack specified by <code>error_stack</code> 
-  on the 
-  specified stream, <code>stream</code>. If the error stack is empty, 
-  a one-line message will be printed. The following is an example of such a 
-  message. This message would be generated if the error was in the HDF5 
-  Library. </p>
-  <p><code>HDF5-DIAG: Error detected in HDF5 Library 
-  version: 1.5.62 thread 0.</code></p>
-
-
-<p><b>To clear an error stack</b></p>
-  
-<p><code><em>herr_t</em> H5Eclear_stack(<em>hid_t</em> 
-  error_stack)</code></p>
-
-<p>The <code>H5Eclear_stack</code> function shown above clears the error 
-  stack specified by 
-  <code>error_stack</code>. <code>H5E_DEFAULT</code> can be passed in to 
-  clear the current error stack.  The current stack is also cleared 
-  whenever an API function is called; there are certain exceptions to this 
-  rule such as <code>H5Eprint()</code>. </p>
-  
-<h4>9.4.4. Mute Error Stack</h4>
-
-<p>Sometimes an application calls a function for the sake of its return value, 
-  fully expecting the function to fail; sometimes the application wants to 
-  call <code>H5Eprint()</code> explicitly.  In these situations, it 
-  would be misleading if an error message were still automatically printed.  
-  Using the <code>H5Eset_auto()</code> function can control the automatic 
-  printing of error messages.</p>
-  
-  <p><b>To enable or disable automatic printing of errors</b></p>
-    
-<p><code><em>herr_t</em> H5Eset_auto(<em>hid_t</em> 
-  error_stack, <em>H5E_auto_t</em> func, 
-  <em>void</em> *client_data)</code></p>
-  
-  <p>The H5Eset_auto function can be used to turns on or off the automatic 
-  printing of errors for the error stack 
-  specified by <code>error_stack</code>. When turned on (non-null <code>func</code> 
-  pointer), any API function which returns an error indication will first call 
-  <code>func</code>, passing it <code>client_data</code> as an argument.  
-  When the library is first initialized the auto printing function is set to 
-  <code>H5Eprint()</code> (cast appropriately) and <code>client_data</code> is 
-  the standard error stream pointer, <code>stderr</code>.</p>
-
-  <p><b>To see the current settings</b></p>
-  
-<p><code><em>herr_t</em> H5Eget_auto(<em>hid_t</em> 
-  error_stack, <em>H5E_auto_t</em> * func, 
-  <em>void</em> **client_data )</code></p>
-  
-  <p>The function above returns the current settings for the automatic error 
-  stack traversal 
-  function, <code>func</code>, and its data, <code>client_data</code>. 
-  If either or both of the arguments are null, then the value is not 
-  returned.</p>
-  
-  <!-- NEW PAGE -->
-<h4>Example: Error Control</h4>
-
-<p>An application can temporarily turn off error messages while 
-“probing” a function. See the example below.</p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  /* Save old error handler */
-  H5E_auto2_t  oldfunc;
-  void *old_client_data;
-  
-  H5Eget_auto(error_stack, &old_func, &old_client_data);
-
-  /* Turn off error handling */
-  H5Eset_auto(error_stack, NULL, NULL);
-
-  /* Probe. Likely to fail, but that’s okay */
-  status = H5Fopen (......);
-
-  /* Restore previous error handler */
-  H5Eset_auto(error_stack, old_func, old_client_data);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 2. Turn off error messages while probing a function</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<p>Or automatic printing can be disabled altogether and error messages 
-  can be explicitly printed.</p>
-  
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  /* Turn off error handling permanently */
-  H5Eset_auto(error_stack, NULL, NULL);
-
-  /* If failure, print error message */
-  if (H5Fopen (....)<0) {
-      H5Eprint(H5E_DEFAULT, stderr);
-      exit (1);
-  }</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 3. Disable automatic printing and explicitly print 
-        error messages</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<h4>9.4.5. Customized Printing of an Error Stack</h4>
-
-<p>Applications are allowed to define an automatic error traversal 
-  function other than the default <code>H5Eprint()</code>. For 
-  instance, one can define a function that prints a simple, one-line 
-  error message to the standard error stream and then exits. The first 
-  example below defines a such a function. The second example below installs
-  the function as the error handler.</p>
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  herr_t
-  my_hdf5_error_handler(void *unused)
-  {
-     fprintf (stderr, “An HDF5 error was detected. Bye.\n”);
-     exit (1);
-  }</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 4. Defining a function to print a simple error message</b>
-        <hr color="green" size="3"/></td></tr>
-</table>
-<br />
-<br />
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-H5Eset_auto(H5E_DEFAULT, my_hdf5_error_handler, NULL);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 5. The user-defined error handler</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<h4>9.4.6. Walk through the Error Stack</h4>
-
-<p>The <code>H5Eprint()</code> function is actually just a 
-  wrapper around the more complex <code>H5Ewalk()</code> 
-  function which traverses an error stack and calls a user-defined 
-  function for each member of the stack. The example below shows how 
-  <code>H5Ewalk</code> is used.</p>
-  
-<p><code><em>herr_t</em> H5Ewalk(<em>hid_t</em> 
-  err_stack, <em>H5E_direction_t</em> 
-  direction, <em>H5E_walk_t</em> func, 
-  <em>void</em> *client_data)</code></p>
-  
-  <p>The error stack <code>err_stack</code> is traversed and 
-  <code>func</code> is 
-  called for each member of the stack. Its arguments are an integer 
-  sequence number beginning at zero (regardless of <code>direction</code>) 
-  and the <code>client_data</code> pointer. If <code>direction</code> 
-  is <code>H5E_WALK_UPWARD</code>, then traversal begins at the inner-most 
-  function that detected the error and concludes with the API function. 
-  Use <code>H5E_WALK_DOWNWARD</code> for the opposite order.</p>
-  
-  <h4>9.4.7. Traverse an Error Stack with a Callback Function</h4>
-  
-  <p>An error stack traversal callback function takes three arguments: 
-  <code>n</code> is a sequence number beginning at zero for each traversal, 
-  <code>eptr</code> is a pointer to an error stack member, and 
-  <code>client_data</code> is the same pointer used in the example above 
-  passed to <code>H5Ewalk()</code>. See the example below.</p>
-
-<p><code>typedef <em>herr_t</em> (*H5E_walk_t)(<em>unsigned</em> 
-  n, <em>H5E_error2_t</em> *eptr, <em>void</em> *client_data)</code></p>
-
-<p>The <code>H5E_error2_t</code> structure is shown below.</p>
-<!-- NEW PAGE -->
-<pre>
-typedef struct {
-    hid_t	cls_id;
-    hid_t       maj_num;
-    hid_t       min_num;
-    unsigned    line;
-    const char  *func_name;
-    const char  *file_name;
-    const char  *desc;
-} H5E_error2_t;
-</pre>
-
-<p>The <code>maj_num</code> and <code>min_num</code> are major and minor 
-error IDs, <code>func_name</code> is the name of the function where the error 
-was detected, <code>file_name</code> and <code>line</code> locate the 
-error within the HDF5 Library source code, and <code>desc</code> points 
-to a description of the error.</p>
-  
-
-<h4>Example: Callback Function</h4>
-<p>The following example shows a user-defined callback function.</p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-#define MSG_SIZE       64
-
-herr_t
-custom_print_cb(unsigned n, const H5E_error2_t *err_desc, void* client_data)
-{
-    FILE		*stream  = (FILE *)client_data;
-    char                maj[MSG_SIZE];
-    char                min[MSG_SIZE];
-    char                cls[MSG_SIZE];
-    const int		indent = 4;
-
-    /* Get descriptions for the major and minor error numbers */
-    if(H5Eget_class_name(err_desc->cls_id, cls, MSG_SIZE)<0)
-        TEST_ERROR;
-
-    if(H5Eget_msg(err_desc->maj_num, NULL, maj, MSG_SIZE)<0)
-        TEST_ERROR;
-
-    if(H5Eget_msg(err_desc->min_num, NULL, min, MSG_SIZE)<0)
-        TEST_ERROR;
-
-    fprintf (stream, “%*serror #%03d: %s in %s(): line %u\n”,
-	     indent, “”, n, err_desc->file_name,
-	     err_desc->func_name, err_desc->line);
-    fprintf (stream, “%*sclass: %s\n”, indent*2, “”, cls);
-    fprintf (stream, “%*smajor: %s\n”, indent*2, “”, maj);
-    fprintf (stream, “%*sminor: %s\n”, indent*2, “”, min);
-
-    return 0;
-
-  error:
-    return -1;
-}</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 6. A user-defined callback function</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-<p><b>Programming Note for C++ Developers Using C Functions</b> </p>
-
-<p>If a C routine that takes a function pointer as an argument is called 
-from within C++ code, the C routine should be returned from normally. </p>
-
-<p>Examples of this kind of routine include callbacks such as 
-<code>H5Pset_elink_cb</code> and <code>H5Pset_type_conv_cb</code> 
-and functions such as <code>H5Tconvert</code> and <code>H5Ewalk2</code>.</p>
-
-<p>Exiting the routine in its normal fashion allows the HDF5 C Library 
-to clean up its work properly. In other words, if the C++ application 
-jumps out of the routine back to the C++ “catch” 
-statement, the library is not given the opportunity to close any 
-temporary data structures that were set up when the routine was 
-called. The C++ application should save some state as the routine is 
-started so that any problem that occurs might be diagnosed.</p>
-
-
-<!-- NEW PAGE -->
-<a name="AdvancedErrorHandling">
-<h3>9.5. Advanced Error Handling Operations</h3>
-</a>
-
-<h4>9.5.1. Introduction</h4>
-
-<p>Section 4 discusses the basic error handling operations of the library.  
-  In that section, all the error records on the error stack are from the 
-  library itself.  In this section, we are going to introduce the operations 
-  that allow an application program to push its own error records onto the 
-  error stack once it declares an error class of its own through the 
-  HDF5 Error API.</p>
-  
-<h4>Example: An Error Report</h4>
-
-<p>An error report shows both the library’s error record and the 
-application’s error records. See the example below.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  Error Test-DIAG: Error detected in Error Program (1.0) thread 8192:
-    #000: ../../hdf5/test/error_test.c line 468 in main(): Error test failed
-      major: Error in test
-      minor: Error in subroutine
-    #001: ../../hdf5/test/error_test.c line 150 in test_error(): H5Dwrite failed 
-        as supposed to
-      major: Error in IO
-      minor: Error in H5Dwrite
-  HDF5-DIAG: Error detected in HDF5 (1.7.5) thread 8192:
-    #002: ../../hdf5/src/H5Dio.c line 420 in H5Dwrite(): not a dataset
-      major: Invalid arguments to routine
-      minor: Inappropriate type </pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 7. An error report</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<p>In the line above error record <code>#002</code> in the example above, 
-  the starting phrase is <code>HDF5</code>.  This is the error class name 
-  of the HDF5 Library.  All of the library’s error messages 
-  (major and minor) are in this default error class.  
-  The <code>Error Test</code> in the beginning of the line above error record 
-  <code>#000</code> is the name of the application’s error class.  
-  The first two error records, <code>#000</code> and <code>#001</code>, 
-  are from application’s error class.</p>
-  
-  <p>By definition, an error class is a group of major and minor error messages 
-  for a library (the HDF5 Library or an application library built on 
-  top of the 
-  HDF5 Library) or an application program.  The error class can be registered 
-  for a 
-  library or program through the HDF5 Error API.  Major 
-  and minor messages can be defined in an error class.  An application will 
-  have object handles for the error class and for major and minor messages for 
-  further operation. See the example below.</p>
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  #define MSG_SIZE       64
-
-  herr_t
-  custom_print_cb(unsigned n, const H5E_error2_t *err_desc, void* client_data)
-  {
-      FILE		*stream  = (FILE *)client_data;
-      char                maj[MSG_SIZE];
-      char                min[MSG_SIZE];
-      char                cls[MSG_SIZE];
-      const int		indent = 4;
-
-      /* Get descriptions for the major and minor error numbers */
-      if(H5Eget_class_name(err_desc->cls_id, cls, MSG_SIZE)<0)
-          TEST_ERROR;
-
-      if(H5Eget_msg(err_desc->maj_num, NULL, maj, MSG_SIZE)<0)
-          TEST_ERROR;
-
-      if(H5Eget_msg(err_desc->min_num, NULL, min, MSG_SIZE)<0)
-          TEST_ERROR;
-
-      fprintf (stream, “%*serror #%03d: %s in %s(): line %u\n”,
-	       indent, “”, n, err_desc->file_name,
-	       err_desc->func_name, err_desc->line);
-      fprintf (stream, “%*sclass: %s\n”, indent*2, “”, cls);
-      fprintf (stream, “%*smajor: %s\n”, indent*2, “”, maj);
-      fprintf (stream, “%*sminor: %s\n”, indent*2, “”, min);
-
-      return 0;
-
-    error:
-      return -1;
-  }</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 8. Defining an error class</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<h4>9.5.2. More Error API Functions</h4>
-
-<p>The Error API has functions that can be used to register or unregister 
-  an error class, 
-  to create or close error messages, and to query an error class or 
-  error message. These functions are illustrated below.</p>
-  
-  <p><b>To register an error class</b></p>
-  
-<code><em>hid_t</em> H5Eregister_class(<em>const char*</em> 
-  cls_name, <em>const char*</em> lib_name, 
-  <em>const char*</em> version)</code>
-<p>This function registers an error class with the HDF5 Library so that the 
-  application 
-  library or program can report errors together with the HDF5 Library.</p>
-
-  <p><b>To add an error message to an error class</b></p>
-  
-<p><code><em>hid_t</em> H5Ecreate_msg(<em>hid_t</em> class, 
-  <em>H5E_type_t</em> msg_type, <em>const char*</em> mesg)</code></p>
-  <p>This function adds an error message to an error class defined by an 
-  application library or program. The error message can be either major 
-  or minor which is indicated by parameter <code>msg_type</code>.</p>
-  
-    <p><b>To get the name of an error class</b></p>
-  
-<p><code><em>ssize_t</em> H5Eget_class_name(<em>hid_t</em> class_id, 
-  <em>char*</em> name, <em>size_t</em> size)</code></p>
-  <p>This function retrieves the name of the error class specified by 
-  the class <code>ID</code>.</p>
-  
-    <p><b>To retrieve an error message</b></p>
-  
-<p><code><em>ssize_t</em> H5Eget_msg(<em>hid_t</em> mesg_id, 
-  <em>H5E_type_t*</em> mesg_type, <em>char*</em> mesg, 
-  <em>size_t</em> size)</code></p>
-  <p>This function retrieves the error message including its length and 
-  type.</p>
-  
-
-    <p><b>To close an error message</b></p>
-  
-<p><code><em>herr_t</em> H5Eclose_msg(<em>hid_t</em> 
-  mesg_id)</code></p>
-  <p>This function closes an error message.</p>
-  
-    <p><b>To remove an error class</b></p>
-  
-<p><code><em>herr_t</em> H5Eunregister_class(<em>hid_t</em> 
-  class_id)</code></p>
-  <p>This function removes an error class from the Error API.</p>
-  <br />
-<h4>Example: Error Class and its Message</h4>
-
-<p>The example below shows how an application creates an error class and 
-error messages.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-/* Create an error class */
-class_id = H5Eregister_class(ERR_CLS_NAME, PROG_NAME, PROG_VERS);
-
-/* Retrieve class name */
-H5Eget_class_name(class_id, cls_name, cls_size); 
-
-/* Create a major error message in the class */
-maj_id = H5Ecreate_msg(class_id, H5E_MAJOR, “... ...”);
-
-/* Create a minor error message in the class */
-min_id = H5Ecreate_msg(class_id, H5E_MINOR, “... ...”);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 9. Create an error class and error messages</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<p>The example below shows how an application closes error messages and 
-unregisters the error class.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  H5Eclose_msg(maj_id);
-  H5Eclose_msg(min_id);
-  H5Eunregister_class(class_id);</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 10. Closing error messages and unregistering the error 
-        class</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<h4>9.5.3. Pushing an Application Error Message onto Error Stack</h4>
-
-<p>An application can push error records onto or pop error records 
-  off of the error stack just as the library does internally.  An 
-  error stack can be registered, and an object handle can be 
-  returned to the application so that the application can 
-  manipulate a registered error stack.</p>
-  
-  <p><b>To register the current stack</b></p>
-  
-<p><code><em>hid_t</em> H5Eget_current_stack(void)</code></p>
-  <p>This function registers the current error stack, returns an object 
-  handle, and clears the current error stack. An empty error stack will 
-  also be assigned an ID.</p>
-
-
-  <p><b>To replace the current error stack with another</b></p>
-  
-<p><code><em>herr_t</em> H5Eset_current_stack(<em>hid_t</em> 
-  error_stack)</code></p>
-  <p>This function replaces the current error stack with another error stack 
-  specified by <code>error_stack</code> and clears the current error stack.  
-  The object handle <code>error_stack</code> is closed after this function 
-  call.</p>
-  
-  <p><b>To push a new error record to the error stack</b></p>
-  
-<p><code><em>herr_t</em> H5Epush(<em>hid_t</em> 
-  error_stack, <em>const char*</em> file, 
-  <em>const char*</em> func, <em>unsigned</em> line, 
-  <em>hid_t</em> cls_id, <em>hid_t</em> major_id, 
-  <em>hid_t</em> minor_id, <em>const char*</em> desc, 
-  ... )</code></p>
-  <p>This function pushes a new error record onto the error stack for the 
-  current thread.</p>
-  
-  <p><b>To delete some error messages</b></p>
-  
-<p><code><em>herr_t</em> H5Epop(<em>hid_t</em> error_stack, 
-  <em>size_t</em> count)</code></p>
-  <p>This function deletes some error messages from the error stack.</p>
-
-
-  
-  <p><b>To retrieve the number of error records</b></p>
-  
-<p><code>int H5Eget_num(<em>hid_t</em> error_stack)</code>
-  <p>This function retrieves the number of error records from an error 
-  stack.</p>
-
-<!-- NEW PAGE -->  
-  <p><b>To clear the error stack</b></p>
-  
-<p><code><em>herr_t</em> H5Eclear_stack(<em>hid_t</em> 
-  error_stack)</code></p>
-  <p>This function clears the error stack.</p>
-  
-  <p><b>To close the object handle for an error stack</b></p>
-  
-<p><code><em>herr_t</em> H5Eclose_stack(<em>hid_t</em> 
-  error_stack</code>)</p>
-  <p>This function closes the object handle for an error stack and 
-  releases its resources.</p>
-  
-  <br />
-
-  
-<h4>Example: Working with an Error Stack</h4>
-
-<p>The example below shows how an application pushes an error record onto 
-the default error stack.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-  /* Make call to HDF5 I/O routine */
-  if((dset_id=H5Dopen(file_id, dset_name, access_plist))<0)
-  {
-      /* Push client error onto error stack */
-      H5Epush(H5E_DEFAULT,__FILE__,FUNC,__LINE__,cls_id,CLIENT_ERR_MAJ_IO,
-          CLIENT_ERR_MINOR_OPEN,“H5Dopen failed”);
-
-      /* Indicate error occurred in function */
-      return(0);
-  }</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 11. Pushing an error message to an error stack</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<p>The example below shows how an application registers the current error 
-stack and creates an object handle to avoid another HDF5 function 
-from clearing the error stack.</p>
-  
-<!-- NEW PAGE -->
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-if(H5Dwrite(dset_id, mem_type_id, mem_space_id, file_space_id, 
-            dset_xfer_plist_id, buf)<0)
-{
-    /* Push client error onto error stack */
-    H5Epush(H5E_DEFAULT,__FILE__,FUNC,__LINE__,cls_id,CLIENT_ERR_MAJ_IO,
-            CLIENT_ERR_MINOR_HDF5,“H5Dwrite failed”);
-
-    /* Preserve the error stack by assigning an object handle to it */
-    error_stack = H5Eget_current_stack();
-
-    /* Close dataset */
-    H5Dclose(dset_id);
-
-    /* Replace the current error stack with the preserved one */
-    H5Eset_current_stack(error_stack);
-
-    Return(0);
-}</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 12. Registering the error stack</b>
-        <hr color="green" size="3"/></td></tr>
-</table>
-<br />
-<br />
-<br />
-
-
-
-<!-- HEADER RIGHT " " -->
-</body>
-</html>
diff --git a/html/UG/OldHtmlSource/14_PropertyLists.html b/html/UG/OldHtmlSource/14_PropertyLists.html
deleted file mode 100755
index 199ae0d..0000000
--- a/html/UG/OldHtmlSource/14_PropertyLists.html
+++ /dev/null
@@ -1,2828 +0,0 @@
-<!doctype HTML public "-//W3C//DTD HTML 4.0 Frameset//EN">
-<html>
-<head>
-<title>Chapter 10: Properties and Property Lists in HDF5</title>
-
-<!--(Meta)==========================================================-->
-
-
-<!--(Links)=========================================================-->
-
-<!--( Begin styles definition )=====================================-->
-<link href="ed_styles/NewUGelect.css" rel="stylesheet" type="text/css">
-<!--( End styles definition )=======================================-->
-
-</head>
-
-<body>
-
-<!-- CONTENT STARTS AT LINE 162 -->
-
-
-<!-- #BeginLibraryItem "/ed_libs/styles_UG.lbi" -->
-<!--
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-  * Copyright by The HDF Group.                                               *
-  * Copyright by the Board of Trustees of the University of Illinois.         *
-  * All rights reserved.                                                      *
-  *                                                                           *
-  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
-  * terms governing use, modification, and redistribution, is contained in    *
-  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
-  * of the source code distribution tree; Copyright.html can be found at the  *
-  * root level of an installed copy of the electronic HDF5 document set and   *
-  * is linked from the top-level documents page.  It can also be found at     *
-  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
-  * access to either file, you may request a copy from help at hdfgroup.org.     *
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- -->
-<!-- #EndLibraryItem --><!-- HEADER LEFT "HDF5 User's Guide" -->
-<!-- HEADER RIGHT "Property Lists in HDF5" -->
-
-<!--( TOC )=========================================================-->
-<!--<SCRIPT language="JavaScript">                                  -->
-<!--
-document.writeln ('\
-<table x-use-null-cells\
-                align="right"\
-		width="240"\
-		cellspacing="0"\
-		class="tocTable">\
-  <tr valign="top"> \
-    <td class="tocTableHeaderCell" colspan="2"> \
-        <span class="TableHead">Chapter Contents</span></td>\
-  </tr>\
--->
-<!-- Table Version 3 --><!--\-->
-<!--
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Intro">1.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Intro">Introduction</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#ProgModel">2.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#ProgModel">Programming Model</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#H5Dump">3.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#H5Dump">Using <code>h5dump</code></a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#FunctionSumms">4.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#FunctionSumms">File Function Summaries</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#CrOpen">5.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#CrOpen">Create or Open a File</a></td> \
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Close">6.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Close">Close a File</a></td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#PLists">7.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#PLists">File Property Lists</a>\
-\
-<br />\
-   \
-Creating a list\
-\
-<br />\
-   \
-Creation properties\
-\
-<br />\
-   \
-Access properties\
-\
-	  </td>\
-  </tr>\
-  <tr valign="top"> \
-    <td class="tocTableContentCell2"> \
-      <a href="#Drivers">8.</a></td>\
-    <td class="tocTableContentCell3">\
-	  <a href="#Drivers">Storage Layouts and Drivers</a>\
-\
-<br />\
-   \
-<span class="smallcaps">SEC2</span>, \
-<span class="smallcaps">STDIO</span>,\
-<br />\
-   \
-<span class="smallcaps">FAMILY</span>, \
-<span class="smallcaps">MULTI</span>,\
-<br />\
-   \
-<span class="smallcaps">SPLIT</span>, \
-<span class="smallcaps">MPI</span>, \
-<span class="smallcaps">CORE</span>,\
-<br />\
-   \
---><!--<span class=code>STREAM</span>, --><!--\
-<span class="smallcaps">LOG</span>\
-\
-	  </td>\
-  </tr>\
-\
-  <tr valign="top"> \
-    <td class="tocTableContentCell"> \
--->
-<!-- editingComment -- "tocTableContentCell" and "tocTableContentCell4" \
---><!--\-->
-<!-- are the table-closing cell class.\
-    <td class="tocTableContentCell2"> \
---><!--\
-      <a href="#Examples">9.</a></td>\
-    <td class="tocTableContentCell4">\
-	  <a href="#Examples">Code Examples</a>\
-  </td></tr>\
-</table>\
-')
--->
-<!-- </SCRIPT> -->
-<!--(End TOC)=======================================================-->
-
-<!-- editingComment
--->
-
-
-<div align="center">
-<a name="TOP">
-<h2>Chapter 10<br /><font size="7">Properties and Property Lists 
-    in HDF5</font></h2>
-</a>
-</div>
-
-
-<!-- ??????? REDACTED FOR REVIEW &/OR PUBLICATION ???????
-
-<font color="red">
-<i>
-
-<h3>10.0. Background</h3>
-<p>
-This document will answer the following questions:
-<ul>
-    <li>What should new users know about property lists?</li>
-    <li>Is there a key idea?</li>
-    <li>What are the principles of property lists so to speak?</li>
-    <li>What would help new users get started?</li>
-    <li>What might help them use property lists fully and effectively?</li>
-</ul>
-
-</i>
-</font>
-
-??????? END REDACTION ??????? ??????? -->
-
-
-
-<a name="Intro">
-<h3>10.1. Introduction</h3>
-</a>
-
-    <p>
-    HDF5 properties and property lists make it possible to shape or modify
-    an HDF5 file, group, dataset, attribute, committed datatype, 
-    or even an I/O stream, in a number of ways.
-    For example, you can do any of the following:
-    <ul>
-        <li>Customize the storage layout of a file to suit
-            a project or task.</li>
-        <li>Create a chunked dataset.</li>
-        <li>Apply compression or filters to raw data.</li>
-        <li>Use either ASCII or UTF-8 character encodings.</li>
-        <li>Create missing groups on the fly.</li>
-        <li>Switch between serial and parallel I/O.</li>
-        <li>Create consistency within a single file or 
-            across an international project.</li>
-    </ul>
-    Some properties enable an HDF5 application 
-    to take advantage of the capabilities of a specific computing environment 
-    while others make a file more compact;
-    some speed the reading or writing of data 
-    while others enable more record-keeping at a per-object level.
-    HDF5 offers nearly one hundred specific properties that can be used
-    in literally thousands of combinations to maximize the usability
-    of HDF5-stored data.
-
-    <br /> 
-    </p>
-    <p>
-
-<!-- ??????? REDACTED FOR REVIEW &/OR PUBLICATION ???????
-     ??????? Restart on Introduction           ???????
-
-    HDF5 properties and property lists make it possible to shape or modify
-    an HDF5 file, group, or object, or even an I/O stream, in a number of ways.
-    Consider the case of an HDF5 dataset, which has creation, access, and 
-    transfer properties.
-    <pre>
-    New dataset 
-        Size, growth rate & pattern, etc
-        ==> Creation property requirements
-        Acc
-    </pre>
-
-    </p>
-    <p> 
-    </p>
-    <p>
-
-??????? END REDACTION ?????????????? -->
-
-    At the most basic level,
-    
-    <a name="PListEcosystem"> </a>
-
-    <table border="0" cellspacing="10" align="right"><tr><td>
-    <table border="0" cellspacing="0">
-        <tr valign="top"> 
-            <td align="center">
-            <hr color="green" size="3"/>
-            <img src="Images/PropListEcosystem.png" width="150" 
-                 alt="Graphic illustration of HDF5’s property environment">
-            </td>
-            </tr>
-        <tr><td><hr color="green" size="1" /></td></tr>
-        <tr valign="top">
-            <td align="left" width="200">
-            <b>Figure 1. 
-               The HDF5 property environment</b>
-            <hr color="green" size="3"/></td>
-            </tr>
-    </table>
-    </td></tr></table>
-
-    a property list is a collection of properties, 
-    represented by name/value pairs that can be
-    passed to various HDF5 functions, usually modifying default settings.  
-    A property list inherits a set of properties and values from 
-    a property list class. 
-    But that statement hardly provides a complete picture; 
-    in the rest of this section and in the next section, 
-    “Property List Classes, Property Lists, and Properties”,
-    we will discuss these things in much more detail.
-    After reading that material, the reader should have a reasonably 
-    complete understanding of how properties and property lists can 
-    be used in HDF5 applications.
-
-    <br />   
-    </p>
-    <p>
-
-    The remaining sections in this chapter discuss the following topics:
-    </p>
-
-    <ul>
-        <li>What are properties, property lists, 
-            and property list classes?</li>
-        <li>Property list programming model</li>
-	<li>Generic property functions</li>
-	<li>Summary listings of property list functions</li>
-	<li>Additional resources</li>
-    </ul>
-    </p>
-
-    <p>
-    The discussions and function listings in this chapter focus on
-    general property operations, 
-    object and link properties, 
-    and related functions.  
-    </p>
-    <p>
-    File, group, dataset, datatype, and attribute properties 
-    are discussed in the chapters devoted to those features,
-<!--
-    are discussed in the chapters devoted to those features;
-    generic property operations are an advanced feature and are 
-    beyond the scope of this guide.
-    </p>
-    <p>
-    Property lists and property list functions that apply only to 
-    specific types of HDF5 objects are generally listed and discussed 
-    in the chapter discussing those objects, 
--->
-    where that information will be most convenient to users.
-    For example, the <a href="10_Datasets.html">Datasets</a> chapter 
-    discusses dataset creation property lists and functions, 
-    dataset access property lists and functions, and 
-    dataset transfer property lists and functions. 
-    This chapter does not duplicate those discussions.
-    </p>
-    <p>
-    Generic property operations are an advanced feature and are 
-    beyond the scope of this guide.
-    </p>
-    <p>
-    This chapter assumes an understanding of the following chapters
-    of this <cite>HDF5 User’s Guide</cite>:
-    <ul>
-        <li><a href="UG_frame03DataModel.html" 
-            target="_TOP">HDF5 Data Model and File Structure</a>
-        <li><a href="UG_frame04ProgModel.html" 
-            target="_TOP">HDF5 Library and Programming Model</a>
-    </ul>
-
-
-    </p>
-
-
-<a name="PListHierarchy">
-<h3 class="pagebefore">10.2. Property List Classes, Property Lists, 
-    and Properties
-    </h3>
-</a>
-
-    </p>
-    <p>
-    HDF5 property lists and the property list interface 
-    (<a href="../RM/RM_H5P.html">H5P</a>) provide a mechanism for
-    storing characteristics of objects in an HDF5 file and economically 
-    passing them around in an HDF5 application.  
-    In this capacity, property lists significantly reduce the burden of 
-    additional function parameters throughout the HDF5 API.
-    Another advantage of  property lists is that features can often 
-    be added to HDF5 by adding only property list functions to the API; 
-    this is particularly true when all other requirements of the feature 
-    can be accomplished internally to the library.
-    </p>
-    <p>
-    For instance, a file creation operation needs to know several
-    things about a file, such as the size of the user-block 
-    or the sizes of various file data structures.  
-    Bundling this information as a property list simplifies the 
-    interface by reducing the number of parameters to the function
-    <code>H5Fcreate</code>.
-    </p>
-    <p>
-    As illustrated in <a href="#PListEcosystem">the figure above</a>, 
-    the HDF5 property environment is a three-level hierarchy: 
-    <ul>
-        <li>Property list classes</li>
-        <li>Property lists</li>
-        <li>Properties</li>
-    </ul>
-    </p>
-    <p>
-    The following subsections discuss property list classes, property lists, 
-    and properties in more detail.
-    
-
-<a name="PListClassesTable"> </a>
-    </p>
-<a name="PListClasses">
-<h4 class="pagebefore">10.2.1. Property List Classes</h4>
-</a>
-
-    A <i>property list class</i> defines the roles that property lists 
-    of that class can play.
-    Each class includes all properties that are valid for that class with
-    each property set to its default value.
-    HDF5 offers a property lists class for each of the following situations.
-    <p />
-
-    <table border="0">
-    <tr><th> </th>
-        <th colspan="4" align="left">Table 1: 
-            Property list classes in HDF5</th></tr>
-    <tr><td> </td>
-        <td colspan="4"><hr color="green" size="3" /></td></tr>
-    <tr align="left" valign="bottom">
-        <th> </th>
-        <th colspan="2">Property List Class
-            <hr color="green" size="1" />
-            </th>
-        <th><code>   </code></th>
-        <th>For further discussion
-            <hr color="green" size="1" />
-            </th>
-        </tr>
-    <tr align="left" valign="top">
-        <td width="5%"> </td>
-        <td>File creation (<small>FCPL</small>)</td>
-        <td><code>H5P_FILE_CREATE</code> </td>
-        <td> </td>
-        <td width="50%" rowspan="2"><font size=-1>
-            See various sections of
-            “<a href="UG_frame08TheFile.html" target="_TOP">The 
-            HDF5 File</a>” chapter.
-            </font>
-            </td>
-        </tr>
-    <tr align="left" valign="top">
-        <td> </td>
-        <td>File access (<small>FAPL</small>)</td>
-        <td><code>H5P_FILE_ACCESS</code> </td>
-        <td> </td>
-        </tr>
-    <tr align="left" valign="top">
-        <td> </td>
-        <td>File mount (<small>FMPL</small>)</td>
-        <td><code>H5P_FILE_MOUNT</code> </td>
-        <td> </td>
-        <td><font size=-1>
-        Used only as <code>H5P_DEFAULT</code>
-        (see <a href="#H5P_FILE_MOUNT">footnote 1</a>). 
-        </font>
-        </td>
-        </tr>
-    <tr><td> </td>
-        <td colspan="2"><hr color="green" size="1" /></td>
-        <td> </td>
-        <td colspan="1"><hr color="green" size="1" /></td></tr>
-    <tr align="left" valign="top">
-        <td> </td>
-        <td>Object creation (<small>OCPL</small>)</td>
-        <td><code>H5P_OBJECT_CREATE</code> </td>
-        <td> </td>
-        <td rowspan="2"><font size=-1>
-            See table of 
-            <a href="#ObjectPropFunctions">object property functions</a> 
-            below.
-            </font>
-            </td>
-        </tr>
-    <tr align="left" valign="top">
-        <td> </td>
-        <td>Object copy (<small>OCPYPL</small>)</td>
-        <td><code>H5P_OBJECT_COPY</code> </td>
-        <td> </td>
-        </tr>
-    <tr><td> </td>
-        <td colspan="2"><hr color="green" size="1" /></td>
-        <td> </td>
-        <td colspan="1"><hr color="green" size="1" /></td></tr>
-    <tr align="left" valign="top">
-        <td> </td>
-        <td>Group creation (<small>GCPL</small>)</td>
-        <td><code>H5P_GROUP_CREATE</code> </td>
-        <td> </td>
-        <td rowspan="2"><font size="-1">
-            See “Programming Model” section of
-            “<a href="UG_frame09Groups.html" target="_TOP">HDF5 
-            Groups</a>” chapter.
-            </font>
-            </td>
-        </tr>
-    <tr align="left" valign="top">
-        <td> </td>
-        <td>Group access (<small>GAPL</small>)</td>
-        <td><code>H5P_GROUP_ACCESS</code> </td>
-        <td> </td>
-        </tr>
-    <tr><td> </td>
-        <td colspan="2"><hr color="green" size="1" /></td>
-        <td> </td>
-        <td colspan="1"><hr color="green" size="1" /></td></tr>
-    <tr align="left" valign="top">
-        <td> </td>
-        <td>Link creation (<small>LCPL</small>)</td>
-        <td><code>H5P_LINK_CREATE</code> </td>
-        <td> </td>
-        <td rowspan="2"><font size=-1>
-            See examples in 
-            “<a href="#ProgModel">Programming Model</a>”
-            section in this chapter and the table of 
-            <a href="#LinkCreationTable">link creation property functions</a> 
-            below.
-            </font>
-            </td>
-        </tr>
-    <tr align="left" valign="top">
-        <td> </td>
-        <td>Link access (<small>LAPL</small>)</td>
-        <td><code>H5P_LINK_ACCESS</code> </td>
-        <td> </td>
-        </tr>
-    <tr><td> </td>
-        <td colspan="2"><hr color="green" size="1" /></td>
-        <td> </td>
-        <td colspan="1"><hr color="green" size="1" /></td></tr>
-    <tr align="left" valign="top">
-        <td> </td>
-        <td>Dataset creation (<small>DCPL</small>)</td>
-        <td><code>H5P_DATASET_CREATE</code> </td>
-        <td> </td>
-        <td rowspan="3"><font size=-1>
-            See “Programming Model” section of
-            “<a href="UG_frame10Datasets.html" target="_TOP">HDF5 
-            Datasets</a>” chapter.
-            </font>
-            </td>
-        </tr>
-    <tr align="left" valign="top">
-        <td> </td>
-        <td>Dataset access (<small>DAPL</small>)</td>
-        <td><code>H5P_DATASET_ACCESS</code> </td>
-        <td> </td>
-        </tr>
-    <tr align="left" valign="top">
-        <td> </td>
-        <td>Dataset transfer (<small>DXPL</small>)</td>
-        <td><code>H5P_DATASET_XFER</code> </td>
-        <td> </td>
-        </tr>
-    <tr><td> </td>
-        <td colspan="2"><hr color="green" size="1" /></td>
-        <td> </td>
-        <td colspan="1"><hr color="green" size="1" /></td></tr>
-    <tr align="left" valign="top">
-        <td> </td>
-        <td>Datatype creation (<small>TCPL</small>)</td>
-        <td><code>H5P_DATATYPE_CREATE</code> </td>
-        <td> </td>
-        <td rowspan="2"><font size=-1>
-            See various sections of
-            “<a href="UG_frame11Datatypes.html" target="_TOP">HDF5 
-            Datatypes</a>” chapter.
-            </font>
-            </td>
-        </tr>
-    <tr align="left" valign="top">
-        <td> </td>
-        <td>Datatype access (<small>TAPL</small>)</td>
-        <td><code>H5P_DATATYPE_ACCESS</code> </td>
-        <td> </td>
-        </tr>
-    <tr><td> </td>
-        <td colspan="2"><hr color="green" size="1" /></td>
-        <td> </td>
-        <td colspan="1"><hr color="green" size="1" /></td></tr>
-    <tr align="left" valign="top">
-        <td> </td>
-        <td>String creation (<small>STRCPL</small>)</td>
-        <td><code>H5P_STRING_CREATE</code> </td>
-        <td> </td>
-        <td><font size=-1>
-            See “Programming Model” sections of
-            “<a href="UG_frame10Datasets.html" target="_TOP">HDF5 
-            Datasets</a>”
-            and
-            “<a href="UG_frame11Datatypes.html" target="_TOP">HDF5 
-            Datatypes</a>” chapters.
-            </font>
-            </td>
-        </tr>
-    <tr><td> </td>
-        <td colspan="2"><hr color="green" size="1" /></td>
-        <td> </td>
-        <td colspan="1"><hr color="green" size="1" /></td></tr>
-    <tr align="left" valign="top">
-        <td> </td>
-        <td>Attribute creation (<small>ACPL</small>)<code>  </code></td>
-        <td><code>H5P_ATTRIBUTE_CREATE</code> </td>
-        <td> </td>
-        <td><font size=-1>
-            See “Working with Attributes” 
-            (or “Attribute Usage”) section of
-            “<a href="UG_frame13Attributes.html" target="_TOP">HDF5 
-            Attributes</a>” chapter.
-            </font>
-            </td>
-        </tr>
-
-<!-- ???????                                                        ??????? -->
-<!-- DISCUSSION OF H5P_ROOT will not be included in the chapter.            -->
-<!-- Yes, it's the root of the property list structure, but there's not     -->
-<!-- much (maybe nothing?) interesting that the user can do with it.        -->
-<!--                                                                        -->
-<!-- Also note that the root of this structure was originally H5P_NO_CLASS; -->
-<!-- when that was changed to H5P_ROOT, code was added to set               -->
-<!-- H5P_NO_CLASS = H5P_ROOT solely to maintain backward compatibility.     -->
-<!--                                                                        -->
-<!-- To clean up the public interface, Quincey may move H5P_ROOT out of     -->
-<!-- H5Ppublic.h.                                                           -->
-<!-- ???????                                                        ??????? -->
-<!--
-
-
-    <tr align="left" valign="top">
-        <td> </td>
-        <td>No property list class</td>
-        <td><code>H5P_ROOT</code> </td>
-        <td> </td>
-        <td>Represents the root of the property list class hierarchy.</td>
-        </tr>
--->
-    <tr><td> </td>
-        <td colspan="4"><hr color="green" size="1" /></td></tr>
-    <tr><td> </td>
-        <td colspan="4">
-        <font size="-1">
-        The abbreviations to the right of each property list class name 
-        in this table are widely used in both HDF5 programmer documentation 
-        and HDF5 source code.  
-        For example, 
-        FCPL is file creation property list,
-        OCPL is object creation property list,
-        OCPYPL is object copy property list, and
-        STRCPL is string creation property list.
-        These abbreviations may appear in either uppercase or lowercase.
-        </font>
-        <hr color="green" size="3" />
-        </td></tr>
-    </table>
-
-
-    <p>
-    The “HDF5 property list class inheritance hierarchy”
-    figure, immediately following, illustrates the 
-    inheritance hierarchy of HDF5’s property list classes.
-    Properties are defined at the root of the HDF5 property environment
-    (“Property List Class Root” in the figure below).
-    Property list classes then inherit properties from that root,
-    either directly or indirectly through a parent class. 
-    In every case, a property list class inherits only the properties 
-    relevant to its role. 
-    For example, the object creation property list class (OCPL) 
-    inherits all properties that are relevant to the creation of 
-    any object while the group creation property list class (GCPL) 
-    inherits only those properties that are relevant to group creation.
-    </p>
-    <p>
-   
-    <table width="90%" cellspacing="0" align="center" border="0">
-        <tr valign="top"> 
-            <td align="center">
-            <hr color="green" size="3"/>
-            <img src="Images/PropListClassInheritance.png" width="100%" 
-                 alt="Graphic illustration of property list class 
-                 inheritance hierarchy">
-            </td>
-            </tr>
-        <tr><td><hr color="green" size="1" /></td></tr>
-        <tr valign="top">
-            <td align="left">
-            <b>Figure 2. HDF5 property list class inheritance hierarchy</b>
-            <font size="-1">
-            <br />
-            Property list classes displayed above in <u>black</u> are 
-            directly accessible through the programming interface;
-            the root of the property environment and the STRCPL and OCPL 
-            property list classes, in <font color="888888"><u>gray</u></font> 
-            above, are not user-accessible.
-            <br />
-            The red <i>empty set</i> symbol (<font color="red">∅</font>)
-            indicates that the file mount property list class 
-            (<small>FMPL</small>) is an empty class; 
-            that is, it has no settable properties 
-            (see <a href="#H5P_FILE_MOUNT">footnote 1</a>). 
-            <br />
-            Abbreviations used in this figure are defined in the preceding
-            table, “Property list classes in HDF5”. 
-            </font> 
-            <hr color="green" size="3"/>
-            </td>
-            </tr>
-    </table>
-
-<!-- ??????? REDACTED as "certainly out of place"        ??????? -->
-<!-- ???????          and "probably repetitious".        ??????? 
-    </p>
-    <p>
-    To illustrate the inheritance diagrammed above, 
-    consider the following example: 
-    Before creating an HDF5 dataset, you will need to determine the 
-    creation properties the dataset must have.  
-    That is, you must establish the dataset’s dataset creation
-    property list (DCPL).
-    This DCPL will be derived from the dataset creation property list class
-    and will inherit all of the appropriate properties, each set to a
-    default value.
-    If necessary, you may then change any of those default values 
-    in the new DCPL with the appropriate H5P calls; 
-    <code>H5Pset_layout</code> and <code>H5Pset_chunk</code> calls, 
-    for example, would set up dataset chunking.
-    You can then use the newly-created and modified DCPL to create 
-    any dataset that has the same creation property requirements.
-    </p>
-    <p>
-    Code examples appear in later sections of this chapter
-    and in other chapters where properties and property lists are
-    discussed in the context of specific objects.
-    For example, properties and property lists relevant to datasets are 
-    discussed in the “Programming Model” section 
-    of the “<a href="UG_frame10Datasets.html" target="_TOP">HDF5 
-    Datasets</a>” chapter
-    in this <cite>HDF5 User’s Guide</cite>.
-     ??????? END REDACTION                               ??????? -->
-
-<!-- ??????? REDACTED FOR REVIEW &/OR PUBLICATION          ???????
-     ??????? AS BEING REDUNDANT IN THE CURRENT DISCUSSION. ???????
-     ??????? THEY MAY, HOWEVER, BE USEFUL ELSEWHERE.       ???????
-<font color="AAAAAA">
-    </p>
-    <p>
-    A dataset creation property list is used when a dataset is created
-    and may govern features of the dataset or how it is to be created.
-    For example, if a dataset is to be chunked, 
-    chunking (<code>H5Pset_layout</code>) and 
-    chunk size (<code>H5Pset_chunk</code>)
-    must be set in the dataset creation property list used to create 
-    the dataset.
-    </p>
-    <p>
-    Creation properties are permanent and <i>immutable</i>; 
-    they cannot be changed during the life of the dataset.
-    </p>
-    <p>
-    A dataset access property list governs access to the dataset.
-    For example, a user may wish to tune the chunk cache to optimize
-    the use of the system on which an analysis is to be run.
-    This optimization might be different on every system.
-    Chunk cache optimization parameters are set in the 
-    dataset access property list with <code>H5Pset_chache</code>.
-    </p>
-    <p>
-    Access properties are <i>transient</i> and can be changed.
-    In fact, applications do not generally have any knowledge
-    of access properties used in the past.
-</font>
-
-??????? ??????? -->
-    </p>
-
-<a name="PropertyLists">
-<h4 class="pagebefore">10.2.2. Property Lists</h4>
-</a>
-
-    A <i>property list</i> is a collection of related properties 
-    that are used together in specific circumstances.  
-    A new property list created from a property list class inherits 
-    the properties of the property list class 
-    and each property’s default value.  
-    A fresh dataset creation property list, for example, includes 
-    all of the HDF5 properties relevant to the creation of a new dataset.  
-    </p>
-    <p>
-    Property lists are implemented as containers holding a collection of 
-    name/value pairs.  
-    Each pair specifies a property name and a value for the property.
-    A property list usually contains information for one to many properties.
-    </p>
-    <p>
-    HDF5’s default property values are designed to be 
-    reasonable for general use cases. Therefore, an application can 
-    often use a property list without modification.
-    On the other hand, adjusting property list settings is a routine action
-    and there are many reasons for an application to do so.
-    </p>
-    <p>
-    A new property list may either be derived from a property list class
-    or copied from an existing property list.
-    When a property list is created from a property list class, 
-    it contains all the properties that are relevant to the class,
-    with each property set to its default value.
-    A new property list created by copying an existing property list
-    will contain the same properties and property values as the 
-    original property list.
-    In either case, the property values can be changed as needed through 
-    the HDF5 API.
-    </p>
-    <p>
-    Property lists can be freely reused to create consistency.
-    For example, a single set of file, group, and dataset 
-    creation property lists might be created at the beginning of a 
-    project and used to create hundreds, thousands, even millions, of
-    consistent files, file structures, and datasets over the 
-    project’s life.
-    When such consistency is important to a project, this is an
-    economical means of providing it.
-
-<!-- ??????? REDACTED                                    ??????? -->
-<!-- ??????? as the statement seems not to be useful.    ??????? 
-    </p>
-    <p>
-    Note that the HDF5 property list functions generate fully populated 
-    property lists and that additional properties are rarely added 
-    by an application.
-    If customized properties and property lists are required by an
-    application or project, they can be created through the use HDF5’s
-    <a href="#GenericPLists">generic property</a> functionality.
-     ??????? END REDACTION                               ??????? -->
-
-    </p>
-
-
-<a name="Properties">
-<h4 class="pagebefore">10.2.3. Properties</h4>
-</a>
-
-    A <i>property</i> is the basic element of the property list hierarchy.
-    HDF5 offers nearly one hundred properties controlling things ranging 
-    from file access rights,  
-    to the storage layout of a dataset, 
-    through optimizing the use of a parallel computing environment.
-    </p>
-    <p>
-    Further examples include the following:</p>
-
-    <table border="0">
-    <tr valign="bottom" align="left">
-        <th><code>    </code></th>
-        <th>Purpose</td>
-        <th><code>  </code></th>
-        <th>Examples</th>
-        <th><code>  </code></th>
-        <th>Property List</th>
-        </tr>
-    <tr valign="top">
-        <td> </td>
-        <td>Specify the driver to be used to open a file</td>
-        <td> </td>
-        <td>A <small>POSIX</small> driver or an MPI IO driver</td>
-        <td> </td>
-        <td>FAPL</td>
-        </tr>
-    <tr valign="top">
-        <td> </td>
-        <td>Specify filters to be applied to a dataset</td>
-        <td> </td>
-        <td>Gzip compression or checksum evaluation</td>
-        <td> </td>
-        <td>DCPL</td>
-        </tr>
-    <tr valign="top">
-        <td> </td>
-        <td>Specify whether to record key times associated with an 
-            object</td>
-        <td> </td>
-        <td>Creation time and/or last-modified time</td>
-        <td> </td>
-        <td>OCPL</td>
-        </tr>
-    <tr valign="top">
-        <td> </td>
-        <td>Specify the access mode for a file opened via an external 
-            link</td>
-        <td> </td>
-        <td>Read-only or read-write</td>
-        <td> </td>
-        <td>LAPL</td>
-        </tr>
-    </table>
-
-    </p>
-    <p>
-    Each property is initialized with a default value.
-    For each property, there are one or more dedicated <code>H5Pset_*</code> 
-    calls that can be used to change that value.
-    </p>
-    <p>
-
-    <b><i>Creation, access, and transfer properties:</i></b>
-    <br>
-    Properties fall into one of several major categories: 
-    creation properties, access properties, and transfer properties.
-    </p>
-    <p>
-    <i>Creation properties</i> control <i>permanent</i> object 
-    characteristics.  These characteristics must be established when an 
-    object is created, cannot change through the life of the object
-    (they are <i>immutable</i>), and the property setting usually has a
-    permanent presence in the file. 
-    
-    </p>
-    <p>
-    Examples of creation properties include:
-    <ul>
-        <li>Whether a dataset is stored in a compact, contiguous,
-            or chunked layout
-            </p>
-            <p>
-            The default for this dataset creation property 
-            (<code>H5Pset_layout</code>) is that a dataset is stored 
-            in a contiguous block.
-            This works well for datasets with a known size limit that will 
-            fit easily in system memory.
-            </p>
-            <p>
-            A chunked layout is important if a dataset is to be compressed, 
-            to enable extending the dataset’s size,
-            or to enable caching during I/O.
-            </p>
-            <p>
-            A compact layout is suitable only for very small datasets 
-            because the raw data is stored in the object header.
-<!--
-            Some datasets, when analyzed later in their lifetime,
-            will be accessed by means of hyperslabs or subsetting; 
-            such datasets will often enable better performance if they 
-            are stored in a chunked layout so that the entire dataset
-            does not have to be read into memory every time it is accessed.
-            Many HDF5 datasets are either sparse or very large (or both)
-            and application performance will benefit from compression.
-            All of these datasets must be stored in a chunked layout.
-            (Such chunks can also be optimized to facilitate anticipated
-            access patterns.)
-<font color="red">
-<p>
-Things you can do with chunked but not contiguous datasets:
-<br>
--- Compression and other filters
-<br>
--- Caching
-<br>
--- Extension (very limited, and non-existent behind the curtain, for contiguous;
-             unlimited for chunked)
-</font>
--->
-            </li>
-        <li>Creation of intermediate groups when adding an object 
-            to an HDF5 file
-            </p>
-            <p>
-            This link creation property 
-           (<code>H5Pset_create_intermediate_group</code>)
-            enables an application to add an object in a file without 
-            having to know that the group or group hierarchy containing 
-            that object already exists. 
-            With this property set, HDF5 automatically creates missing groups.
-            If this property is not set, an application must verify that each
-            group in the path exists, and create those that do not,
-            before creating the new object; if any group is missing, 
-            the create operation will fail.
-
-<!-- ??????? REDACTED                                    ??????? -->
-<!-- ??????? as not necessarily helpful                  ??????? 
-<!-- ??????? and potentially confusing.                  ??????? 
-            </p>
-            <p>
-            Note that this property is an exception to the general rule.
-            It is a creation property not because it is immutable
-            but because it is used only in the creation process.
-     ??????? END REDACTION                               ??????? -->
-
-            </li>
-        <li>Whether an HDF5 file is a single file
-            or a set of tightly related files that form a virtual HDF5 file
-            </p>
-            <p>
-            Certain file creation properties enable the application 
-            to select one of several file layouts. 
-            Examples of the available layouts include
-            a standard <small>POSIX</small>-compliant layout 
-            (<code>H5Pset_fapl_sec2</code>),
-            a family of files (<code>H5Pset_fapl_family</code>), 
-            and a split file layout that separates raw data and metadata 
-            into separate files (<code>H5Pset_fapl_split</code>).
-            These and other file layout options are discussed in the 
-            “Storage Layouts and Drivers” section of the
-            “<a href="UG_frame08TheFile.html" target="_top">HDF5
-            File</a>” chapter of this <cite>HDF5 User’s 
-            Guide</cite>.
-            </li>
-        <li>To enable error detection when creating a dataset
-            <p>
-            In settings where data integrity is vulnerable,
-            it may be desirable to set checksumming when datasets are created
-            (<code>H5Pset_fletcher32</code>). A subsequent application will 
-            then have a means to verify data integrity when reading the 
-            dataset. 
-            </li>
-    </ul>
-
-    </p>
-    <p>
-    <i>Access properties</i> control <i>transient</i> object characteristics.
-    These characteristics may change with the circumstances under which an 
-    object is accessed.
-    </p>
-    <p>
-    Examples of access properties include:
-    <ul>
-        <li>The driver used to open a file
-            <p>
-            For example, a file might be created with the MPI I/O driver
-            (<code>H5Pset_fapl_mpio</code>) during high-speed 
-            data acquisition in a parallel computing environment.
-            The same file might later be analyzed in a serial computing 
-            environment with I/O access handled through the serial 
-            POSIX driver (<code>H5Pset_fapl_sec2</code>).
-            </li>
-        <li>Optimization settings in specialized environments
-            <p>
-            Optimizations differ across computing environments and
-            according to the needs of the task being performed,
-            so are transient by nature.
-            </li>
-    </ul>
-
-    </p>
-    <p>
-    <i>Transfer properties</i> apply only to datasets and 
-    control <i>transient</i> aspects of data I/O. 
-    These characteristics may change with the circumstances under which 
-    data is accessed.
-    </p>
-    <p>
-    Examples of dataset trasfer properties include:
-    <ul>
-        <li>To enable error detection when reading a dataset
-            <p>
-            If checksumming has been set on a dataset
-            (with <code>H5Pset_fletcher32</code>, 
-            in the dataset creation prpertiy list), 
-            an application reading that dataset can choose whether
-            check for data integrity (<code>H5Pset_edc_check</code>).
-            </li>
-        <li>Various properties to optimize chunked data I/O on
-            parallel computing systems
-            <p>
-            HDF5 provides several properties for tuning I/O of 
-            chunked datasets in a parallel computing environment
-            (<code>H5Pset_dxpl_mpio_chunk_opt</code>,
-            <code>H5Pset_dxpl_mpio_chunk_opt_num</code>, 
-            <code>H5Pset_dxpl_mpio_chunk_opt_ratio</code>, and
-            <code>H5Pget_mpio_actual_chunk_opt_mode</code>).
-            <p>
-            Optimal settings differ 
-            due to the characteristics of a computing environment 
-            and due to an application’s data access patterns;
-            even when working with the same file, these settings might 
-            change for every application and every platform.
-            </li>
-    </ul>
-
-    </p>
-    <p>
-
-<!-- ??????? REDACTED FOR REVIEW & PUBLICATION                  ???????
-     ??????? Questions for QK:                                  ???????
-     ???????     Only 2 DAPL calls? (1 get, 1 set)              ???????
-     ???????     All others are labelled DXPL.                  ???????
-     ???????     Yet opaque to me why there are both types.     ???????
-
-    <i>Dataset transfer properties:</i>
-
-<font color="red">
-<i>
-Similar discussion of DXPLs.
-</i>
-</font>
-    </p>
-    <p>
-
-??????? END REDACTION ??????? ??????? -->
-
-
-
-
-<!-- NEW PAGE -->
-<a name="ProgModel">
-<h3 class="pagebefore">10.3. Programming Model</h3>
-</a>
-    <p>
-    The programming model for HDF5 property lists is actually quite simple:
-    <ol>
-        <li>Create a property list.</li>
-        <li>Modify the property list, if required.</li>
-        <li>Use the property list.</li>
-        <li>Close the property list.</li>
-    </ol>
-    There are nuances, of course, but that is the basic process.
-    </p>
-    <p>
-    In some cases, you will not have to define property lists at all.  
-    If the default property settings are sufficient for your application, 
-    you can tell HDF5 to use the default property list.
-    </p>
-    <p>
-    The following sections 
-    first discuss the use of default property lists,
-    then each step of the programming model, 
-    and finally a few less frequently used property list operations.
-
-
-
-
-<!-- ??????? REDACTED FOR REVIEW &/OR PUBLICATION ???????
-     ??????? Restart on Introduction              ???????
-
-
-  <p>
-  This section describes the programming model for 
-  creating, populating, and using HDF5 property lists.
-  </p>
-    
-  <h4>10.3.1. Creating a New Property List</h4>
-
-  <p>
-  The programming model for creating, populating, and using 
-  a new HDF5 property list can be summarized as follows:
-
-  <ul>
-	<li>Create the property list</li>
-	<li>Populate the property list with the required properties</li>
-	<li>Use the property list when creating or accessing
-            the relevant kinds of objects
-            </li>
-  </ul>
-
-  </p>
-  <p>
-  Consider the simple case of creating _ _ _
-  See the example below.</p>
-
-
-
-
-<font color="red">
-<i>
-<p>
-<u>From notes:</u>
-<ul>
-<li>How do property lists work?</li>
-<li>How are property lists used? Include sample code. 
-    Diagrams can also be included.</li>
-<li>How are property lists configured? How are they set up? 
-    How are they changed?</li>
-<li>When can a property list be changed and when is it immutable?</li>
-<li>Which property lists are recorded in the file and which are transient?</li>
-<li>What property lists are available, and what does each do? 
-    See the “Available Property Lists” section below for more information.</li>
-<li>What are the most used property lists? </li>
-<li>What property lists seem to make the most difference when they are used?</li>
-</ul>
-</i>
-</font>
-
-    
-  <h4>10.3.2. Adding Properties to a  Property List</h4>
-
-    
-  <h4>10.3.3. Using Property Lists</h4>
-
-
-??????? END REDACTION ??????? ??????? -->
-
-</i>
-
-<a name="UsingH5P_DEFAULT">
-<h4 class="pagebefore">10.3.1. Using Default Property Lists</h4>
-</a>
-
-    Default property lists can simplify many routine HDF5 tasks because
-    you do not always have to create every property list you use.
-    </p>
-    <p>
-    An application that would be well-served by HDF5’s default
-    property settings can use the default property lists simply by
-    substituting the value <code>H5P_DEFAULT</code> 
-    for a property list identifier.  HDF5 will then apply the 
-    default property list for the appropriate property list class.
-    </p>
-    <p>
-    For example, the function <code>H5Dcreate2</code> calls for 
-    a link creation property list,
-    a dataset creation property list, and 
-    a dataset access property list.
-    If the default properties are suitable for a dataset, 
-    this call can be made as
-
-    <dir>
-    <dl>
-      <dt><code>dset_id = H5Dcreate2( <i>loc_id</i>, <i>name</i>, <i>dtype_id</i>, <i>space_id</i></code>;
-          </dt>
-      <dt><code>      
-          H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT );
-</code>
-          </dt>
-    </dl>
-    </dir>
-    
-    HDF5 will then apply the default link creation, dataset creation, 
-    and dataset access property lists correctly.
-    </p>
-    <p>
-    Of course, you would not want to do this without considering where 
-    it is appropriate, as there may be unforeseen consequences.
-    Consider, for example, the use of chunked datasets.  
-    Optimal chunking is quite dependent on the makeup of the dataset 
-    and the most common access patterns, both of which must be 
-    taken into account in setting up the size and shape of chunks.  
-    </p>
-
-
-<a name="BasicProgModSteps">
-<h4 class="pagebefore">10.3.2. Basic Steps of the Programming Model</h4>
-</a>
-
-    The steps of the property list programming model are described 
-    in the sub-sections below.
-
-<a name="CreatePList">
-<h5 class="pagebefore">10.3.2.1. Create a Property List</h5>
-</a>
-
-    A new property list can be created either as an instance of
-    a property list class or by copying an existing property list.
-    Consider the following examples.
-    A new dataset creation property list is first created 
-    “from scratch” with <code>H5Pcreate</code>.
-    A second dataset creation property list is then created
-    by copying the first one with <code>H5Pcopy</code>.
-    
-    <dir>
-    <dl>
-      <dt><code>dcplA_id = H5Pcreate (H5P_DATASET_CREATE)</code>;
-          <br /> 
-          </dt>
-          <dd>
-          The new dataset creation property list is created as an instance 
-	  of the property list class <code>H5P_DATASET_CREATE</code>.
-          <p>
-          The new dataset creation  property list’s identifier
-          is returned in <code>dcplA_id</code> and the 
-          property list is initialized with default dataset creation 
-          property values.
-          <p>
-          A list of valid  classes appears above in 
-          “<a href="#PListClassesTable">Table 1: Property List Classes 
-          in HDF5</a>”.
-          </dd>
-      <dt><code>dcplB_id = H5Pcopy (dcplA_id)</code>;
-          <br /> 
-          </dt>
-          <dd>
-          A new dataset creation property list, <code>dcplB_id</code>, 
-          is created as a copy of <code>dcplA_id</code> and is 
-          initialized with dataset creation property values currently 
-          in <code>dcplA_id</code>.
-          </dd>
-    </dl>
-    </dir>
-    At this point, <code>dcplA_id</code> and <code>dcplB_id</code>
-    are identical; they will both contain any modified property values 
-    that were changed in <code>dcplA_id</code> before <code>dcplB_id</code> 
-    was created.  They may, however, diverge as additional property values 
-    are reset in each.
-
-    </p>
-    <p>
-    While we are creating property lists, let’s 
-    create a link creation property list;  
-    we will need this property list when the new dataset 
-    is linked into the file below:
-    <dir>
-    <dl>
-      <dt><code>lcplAB_id = H5Pcreate (H5P_LINK_CREATE)</code>;
-          </dt>
-    </dl>
-    </dir>
-    </p>
-
-<a name="ChangeProperty">
-<h5 class="pagebefore">10.3.2.2. Change Property Values</h5>
-</a>
-
-    This section describes how to set property values.
-    </p>
-    <p>
-    Later in this section, the dataset creation property lists
-    <code>dcplA_id</code> and <code>dcplB_id</code> created in the 
-    section above will be used respectively to create 
-    chunked and contiguous datasets.
-    To set this up, we must set the layout property in each property list.
-    The following example sets 
-    <code>dcplA_id</code> for chunked datasets and
-    <code>dcplB_id</code> for contiguous datasets:
-
-    <dir>
-    <dl>
-      <dt><code>error = H5Pset_layout (dcplA_id, H5D_CHUNKED)</code>;
-          </dt>
-      <dt><code>error = H5Pset_layout (dcplB_id, H5D_CONTIGUOUS)</code>;
-          </dt>
-    </dl>
-    </dir>
-    
-    <p>
-    Since <code>dcplA_id</code> specifies a chunked layout, 
-    we must also set the number of dimensions and the size of the chunks.  
-    The example below specifies that datasets created with 
-    <code>dcplA_id</code> will be 3-dimensional and 
-    that the chunk size will be 100 in each dimension:
-    <dir>
-    <dl>
-      <dt><code>error = H5Pset_chunk (dcplA_id, 3, [100,100,100])</code>;
-          </dt>
-    </dl>
-    </dir>
-
-    </p>
-    <p>
-    These datasets will be created with UTF-8 encoded names.
-    To accomplish that, the following example sets the character encoding 
-    property in the link creation property list to create link names
-    with UTF-8 encoding:
-    <dir>
-    <dl>
-      <dt><code>error = H5Pset_char_encoding (lcplAB_id, H5T_CSET_UTF8)</code>;
-          </dt>
-    </dl>
-    </dir>
-    <code>dcplA_id</code> can now be used to create chunked datasets 
-    and <code>dcplB_id</code> to create contiguous datasets. 
-    And with the use of <code>lcplAB_id</code>, they will be created
-    with UTF-8 encoded names.
-
-
-<a name="UsePropertyList">
-<h5 class="pagebefore">10.3.2.3. Use the Property List</h5>
-</a>
-
-    Once the required property lists have been created, they can be used 
-    to control various HDF5 processes.
-    For illustration, consider dataset creation.
-    </p>
-    <p>
-    Assume that the datatype <code>dtypeAB</code> and the 
-    dataspaces <code>dspaceA</code> and <code>dspaceB</code>
-    have been defined 
-    and that the location identifier <code>locAB_id</code> specifies
-    the group <code>AB</code> in the current HDF5 file.
-    We have already created the required link creation and dataset creation 
-    property lists.  For the sake of illustration, we assume that the
-    default dataset access property list meets our application requirements.
-    The following calls would create the datasets <code>dsetA</code>
-    and <code>dsetB</code> in the group <code>AB</code>.
-    The raw data in <code>dsetA</code> will be contiguous 
-    while <code>dsetB</code> raw data will be chunked; 
-    both datasets will have UTF-8 encoded link names:
-<pre>
-    dsetA_id = H5Dcreate2( locAB_id, dsetA, dtypeAB, dspaceA_id, 
-                        lcplAB_id, dcplA_id, H5P_DEFAULT );
-    dsetB_id = H5Dcreate2( locAB_id, dsetB, dtypeAB, dspaceB_id, 
-                        lcplAB_id, dcplB_id, H5P_DEFAULT ); 
-</pre>
-
-
-
-<a name="ClosePList">
-<h5 class="pagebefore">10.3.2.4. Close the Property List</h5>
-</a>
-
-    Generally, creating or opening anything in an HDF5 file 
-    results in an HDF5 identifier.  These identifiers are of 
-    HDF5 type <code>hid_t</code> and include things like
-    file identifiers, often expressed as <code><i>file_id</i></code>;
-    dataset identifiers, <code><i>dset_id</i></code>; and
-    property list identifiers, <code><i>plist_id</i></code>.
-    To reduce the risk of memory leaks, all of these identifiers must 
-    be closed once they are no longer needed.
-    </p>
-    <p>
-    Property list identifiers are no exception to this rule,
-    and <code>H5Pclose</code> is used for this purpose.
-    The calls immediately following would close the 
-    property lists created and used in the examples above.
-    <dir>
-    <dl>
-      <dt><code>error = H5Pclose (dcplA_id)</code>;
-          </dt>
-      <dt><code>error = H5Pclose (dcplB_id)</code>;
-          </dt>
-      <dt><code>error = H5Pclose (lcplAB_id)</code>;
-          </dt>
-    </dl>
-    </dir>
-    </p>
-
-
-<a name="AdditionalPListOps">
-<h4 class="pagebefore">10.3.3. Additional Property List Operations</h4>
-</a>
-
-    A few property list operations fall outside of the programming model 
-    described above.  This section describes those operations.
-
-<a name="QueryPListClass">
-<h5 class="pagebefore">10.3.3.1. Query the Class of an Existing 
-    Property List</h5>
-</a>
-
-    Occasionally an application will have a property list
-    but not know the corresponding property list class.
-    A call such as in the following example will retrieve
-    the unknown class of a known property list:
-    
-    <dir>
-    <dl>
-      <dt><code><em>PList_Class</em> = H5Pget_class (dcplA_id)</code>;
-          </dt>
-    </dl>
-    </dir>
-    Upon this function’s return, <code><em>PList_Class</em></code>
-    will contain the value <code>H5P_DATASET_CREATE</code>
-    indicating that <code>dcplA_id</code> is a dataset creation property list.
-
-
-<a name="GetCreationPValues">
-<h5 class="pagebefore">10.3.3.2. Determine Current Creation Property List 
-    Settings in an Existing Object</h5>
-</a>
-
-    After a file has been created, another application may work on the file
-    without knowing how the creation properties for the file were set up.
-    Retrieving these property values is often unnecessary; HDF5 can
-    read the data and knows how to deal with any properties it encounters.
-    </p>
-    <p>
-    But sometimes an application must do something that requires knowing 
-    the creation property settings.  HDF5 makes the acquisition of this
-    information fairly straight-forward;
-    for each property setting call, <code>H5Pset_*</code>,
-    there is a corresponding <code>H5Pget_*</code> call
-    to retrieve the property’s current setting.
-    </p>
-    <p>
-    Consider the following examples which illustrate the determination of
-    dataset layout and chunking settings:
-    
-    <dir>
-    <dl>
-        <dt>The application must first identify the creation property list
-            with the appropriate <i>get creation property list</i> call.
-            There is one such call for each kind of object.</dt>
-            </p>
-        <dd><code>H5Dget_create_plist</code> will return a property list
-            identifier for the creation property list that was used 
-            to create the dataset. Call it <code>DCPL1_id</code>.</dd>
-            </p>
-        <dt><code>H5Pset_layout</code> sets a dataset’s layout to be
-            compact, contiguous, or chunked.</dt>
-            </p>
-        <dd><code>H5Pget_layout</code> called with <code>DCPL1_id</code> 
-            will return the dataset’s layout, either
-            <code>H5D_COMPACT</code>, <code>H5D_CONTIGUOUS</code>, 
-            or <code>H5D_CHUNKED</code>.</dd>
-            </p>
-        <dt><code>H5Pset_chunk</code> sets the rank of a dataset, 
-            that is the number of dimensions it will have, 
-            and the maximum size of each dimension.</dt>
-            </p>
-        <dd><code>H5Pget_chunk</code>, also called with <code>DCPL1_id</code>,
-            will return the rank of the dataset
-            and the maximum size of each dimension.</dd>
-            </p>
-    </dl>
-    </dir>
-    If a creation property value has not been explicitly set,
-    these <code>H5Pget_</code> calls will return the property’s 
-    default value.
-    
-<!-- ??????? REDACTED FOR REVIEW &/OR PUBLICATION       ???????
-     ??????? REMOVE H5Piterate DISCUSSION; GENERIC PROP ???????
-     ??????? FUNCTIONS BEYOND SCOPE                     ??????? 
-    </p>
-    <p>
-    A more comprehensive approach is to perform a 
-    systematic analysis of the properties in a property list.
-    This approach could be based on <code>H5Piterate</code>, which
-    enables an application discover all the properties in a property list 
-    (or all the property lists in a property list class).
-    The application can then assess each property (or property list)
-    that is of interest.  Further discussion of this function 
-    is beyond the current scope of this document.
-??????? END REDACTION ??????? ??????? -->
-    </p>
-
-
-
-<a name="GetAccessPValues">
-<h5 class="pagebefore">10.3.3.3. Determine Access Property Settings</h5>
-</a>
-
-     Access property settings are quite different from creation properties.
-     Since access property settings are not retained in an HDF5 file
-     or object, there is normally no knowledge of the settings that 
-     were used in the past.
-     On the other hand, since access properties do not affect 
-     characteristics of the file or object, this is not normally an issue.
-     (See <a href="#APL,CPLexceptions">footnote 2</a> for exceptions.) 
-     </p>
-     <p>
-     One circumstance under which an application might need
-     to determine access property settings might be when a file or object
-     is already open but the application does not know the property list 
-     settings.
-     In that case, the application can use the appropriate 
-     <i>get access property list</i> call to retrieve a property list
-     identifier.  For example, if the dataset <code>dsetA</code>
-     from the earlier examples is still open, the following call 
-     would return an identifier for the dataset access property list
-     in use:
-<pre>
-    dsetA_dacpl_id = H5Dget_access_plist( dsetA_id ); 
-</pre>
-    The application could then use the returned property list identifier
-    to analyze the property settings.
-
-<!-- ??????? REDACTED FOR REVIEW & PUBLICATION                    ???????
-
-<font color="red">
-<i>
-</p>
-<p>
-Before putting more time into this subsection,
-under what circumstance might an application need to do this?
-If never or exceedingly rare, this can be dropped.
-</p>
-</i>
-</font>
-
-??????? END REDACTION ??????? ??????? -->
-
-
-<!-- ??????? REDACTED FOR REVIEW &/OR PUBLICATION ???????
-     ??????? This is a 1.10 feature.              ???????
-    
-<a name="EncodeDecodePList">
-<h5 class="pagebefore">10.3.3.4. Encode and Decode Property Lists</h5>
-</a>
-
-<font color="red">
-<i>
-
-A discussion of property list encoding and decoding,
-<code>H5Pencode</code> and <code>H5Pdecode</code>, 
-will be added when these functions appear in a public release,
-anticipated to be HDF5 Release 1.10.
-    </p>
-
-</i>
-</font>
-
-??????? END REDACTION ??????? ??????? -->
-     
-  
-
-<!-- ??????? REDACTED FOR REVIEW &/OR PUBLICATION ???????
-
-<a name="GeneralPListOps">
-<h3 class="pagebefore">10.4. General Property List Operations</h3>
-</a>
-
-    In many ways, property lists are handled much like objects in HDF5.
-    Property lists can be created and modified,
-    and information for many creation properties is retained in the file.
-    On the other hand, while access properties can be created, changed 
-    as needed, and discarded, access property information is not generally 
-    retained in the file or object.
-    <sup size="-1"><a href="#APL,CPLexceptions">1</a></sup>
-    </p>
-    <p>
-    The following sections provide general instructions for creating
-    and using property lists.
-    </p>
-
-
-<a name="CharEncoding">
-<h4 class="pagebefore">10.4.1. Set Object and Attribute Name 
-    Character Encoding</h4>
-</a>
-
-    Object and attribute names can be created with either ASCII or UTF-8 
-    character encoding. 
-    The relevant HDF5 property functions are:
-    <dir>
-    <dl>
-        <dt><code>H5Pset_char_encoding</code></dt>
-        <dt><code>H5Pget_char_encoding</code></dt>
-    </dl>
-    </dir>
-    </p>
-    <p>
-    ASCII and UTF-8 encodings and the use of these functions are discussed 
-    in the “Object and Attribute Names” section of
-    “<a href="../Advanced/UsingUnicode/index.html">Using UTF-8 Encoding 
-    in HDF5 Applications</a>”.
-
-??????? END REDACTION ??????? ??????? -->
-
-
-<!-- ??????? REDACTED FOR REVIEW &/OR PUBLICATION ???????
-     ??????? Section isn't quite right.           ???????
-     ???????                                      ???????
-     ??????? Is there an actual OCPL?             ???????
-     ??????? Is is it always a DCPL or GCPL?      ???????
-     ???????       and possibly TCPL?             ???????
- 
-
-<a name="Object+LinkOps">
-<h3 class="pagebefore">10.4. Object Properties and Property Lists</h5>
-</a>
-
-    The HDF5 <i>object creation properties</i> govern certain aspects of 
-    object creation and can be used with several types of objects.
-    Object creation properties include setting the recording of times
-    associated with a file (<code>H5Pset_obj_track_times</code>)
-    and setting the tracking of attribute creation order and indexing
-    an object’s attributes on that creation order
-    (<code>H5Pset_attr_creation_order</code>).
-    </p>
-    <p>
-    Object creation properties are set in an object creation property list,
-    often represented by <code><i>ocpl_id</i></code>), 
-    and can be used in any create or open call that accepts an
-    object creation property list.
-    </p>
-    <p>
-    <i>Object copy properties</i> govern aspects of copying objects 
-    and, like object creation properties, can be used with several types 
-    of objects.
-    Object copying properties include setting various aspects of copying
-    an object (<code>H5Pset_copy_object</code>) and 
-    managing the duplication of copied committed datatypes 
-    (<code>H5Padd_merge_committed_dtype_path</code> and
-    <code>H5Pfree_merge_committed_dtype_paths</code>)
-    to ensure that committed datatypes used commonly by several data objects 
-    before a copy operation remain shared after the copy operation.
-    whether to copy recursively when copying a group.
-    </p>
-    <p>
-    Object copy properties are set in an object copy property list,
-    often represented by <code><i>ocpypl_id</i></code>), and
-    can be used in any call that accepts an object copy property list.
-    </p>
-
-??????? END REDACTION ??????? ??????? -->
-
-
-<a name="GenericPLists">
-<h3 class="pagebefore">10.4. Generic Properties Interface and 
-    User-defined Properties</h3>
-</a>
-
-    HDF5’s generic property interface provides tools for 
-    managing the entire property hierarchy and for the creation 
-    and management of user-defined property lists and properties.
-    This interface also makes it possible for an application or a 
-    driver to create, modify, and manage custom properties, 
-    property lists, and property list classes. 
-    A comprehensive list of functions for this interface appears under 
-    “<a href="../RM/RM_H5P.html#GenericPropFuncs" target="_TOP">Generic 
-    Property Operations (Advanced)</a>” in the 
-    “<a href="../RM/RM_H5P.html" target="_TOP">H5P: Property List 
-    Interface</a>” section of the 
-    <a href="../RM/RM_H5Front.html" target="_TOP"><cite>HDF5 Reference 
-    Manual</cite></a>.
-    <p>
-    </p>
-    Further discussion of HDF5’s generic property interface
-    and user-defined properties and property lists 
-    is beyond the scope of this document.
-
-
-<!-- ??????? REDACTED FOR REVIEW &/OR PUBLICATION       ???????
-     ??????? BEGIN MORE SERIOUS Generic Properties TEXT ???????
-     ??????? But it's beyond scope for this version     ???????
-
-
-    <p>
-    </p>
-    Property names beginning with ‘<code>H5</code>’ 
-    are reserved for HDF5 Library use and should not be used for
-    user-defined properties.
-    </p>
-    <p>
-    HDF5’s generic property functions provide a general foundation
-    for managing the entire property hierarchy.
-    The generic property functions enable an application or a driver to 
-    create, modify, and manage custom properties, property lists, 
-    and property list classes.
-    In fact, the HDF5 Library itself uses private versions of these 
-    functions to some extent when initializing the basic properties, 
-    property lists, and property list classes described elsewhere. 
-    </p>
-    <p>
-    Applications and drivers (the virtual file layer (VFL) and 
-    datatype conversion, for example) can use the generic property
-    functions to create properties that control features they add 
-    in an HDF5 environment. 
-    The ability of a driver to create properties when installed at 
-    run-time enables new features to be easily created and controlled 
-    while localizing changes to the code being added or modified.
-    This facilitates software maintainence and the evolution of 
-    both the application or driver's properties and HDF5’s 
-    properties ecosystem. 
-    </p>
-    <p>
-    The generic property functions also enable users to create and set 
-    properties which are temporary in nature and do not need to be stored 
-    longer than the application is active. This would allow users to 
-    set and query application-specific properties during an 
-    application’s execution without impacting another application 
-    or leaving unnecessary “residue” in the file.
-    </p>
-
-<a name="UsingGenericPLists">
-<h4 class="pagebefore">10.541. Using Generic Property List Functions</h4>
-</a>
-
-    Generic property functions can be used to do anything that
-    the more the focussed property list functions do.  For example, 
-    functionality of the function <code>H5Pset_fapl_mpio</code> 
-    could be completely implemented with generic function calls.  
-    Of course, these tasks can be more simply performed with the 
-    existing functions.
-    </p>
-    <p>
-    The value of the generic property functions comes into play 
-    when an application requires a property not included with HDF5.
-    For exmaple, 
-
-<font color="red">
-<i>
-< example needed >
-</i>
-</font>.
-
-    </p>
-    <p>
-    A new property list class can be derived from an existing class 
-    by calling <code>H5Pcreate_class</code> with the 
-    <em><code>parent_class</code></em> parameter set to the existing class
-    that the new class is to inherit from.
-    Properties that differentiate the new class can then be added and set
-    with <code>H5Pregister</code> and, if necessary, <code>H5Pset</code>.
-    </p>
-    <p>
-    If the new property list class is unlike any existing class and 
-    is being created from scratch, the new class is created with 
-    <code>H5Pcreate_class</code> with the 
-    <em><code>parent_class</code></em> parameter set to <code>NULLL</code>.
-    At this point, an <i>empty</i> property list class exists.
-    The new empty property list class can then be populated with 
-    a set of properties using <code>H5Pregister</code> and, 
-    if necessary, <code>H5Pset</code>.
-
-<font color="red">
-<i>
-< Correct?  >
-</i>
-</font>
-
-    </p>
-    <p>
-    Additional new property list classes can be derived from 
-    any existing property list class, including a new <i>empty</i>
-    property list class, other user-derived property list classes,
-    or a property list class defined by the HDF5 Library. 
-    User-derived property list classes which are derived from the 
-    HDF5 Library-defined classes may be passed to HDF5 functions 
-    that expect library-defined property lists and the functions 
-    will traverse the inherited classes to find the correct class to 
-    retrieve information.
-    </p>
-    <p>
-    New properties can be added to a property list class with 
-    <code>H5Pregister</code>.
-    The property will become a permanent part of the property list 
-    and will be present in new property lists subsequently created 
-    with that class.
-    Registered properties can have default values for 
-    each new property list created for that class.
-    </p>
-    <p>
-    New properties can be added to a property list with 
-    <code>H5Pinsert</code>.
-    Such a property can be temporary and will no longer exist once the 
-    application quits.
-    Properties inserted into a property list will not affect 
-    property lists created with the parent property list class.
-
-<font color="red">
-<i>
-<br>
-< Can inserted properties be temporary such that they 
-will no longer exist once the application quits?  
-This was proposed in the design, but was it implemented that way? >
-</i>
-</font>
-
-    </p>
-    <p>
-    Property names beginning with '<code>H5</code>' are reserved 
-    for HDF5 Library use and should not be used by third-party 
-    applications or libraries.
-    </p>
-    <p>
-    The names and sizes of property values for each property 
-    are local to each property list; changing them in a 
-    property list class does not affect existing property lists.
-    </p>
-    <p>
-    A comprehensive list of generic property functions appears
-    below in the “<a href="#GenericPropFunctions">generic 
-    property functions</a>” table.
-
-
-<font color="red">
-<i>
-    </p>
-    <p>
-This section will continue with discussions of 
-selected generic property functions to give the user 
-a better sense of how they can be used.
-</i>
-</font>
-
-<br>
-??????? END "beyond scope" Generic Properties discussion ??????? ??????? 
-??????? END REDACTION                                    ??????? ??????? -->
-    </p>
-
-
-
-
-
-<!-- ??????? REDACTED FOR REVIEW &/OR PUBLICATION     ???????
-     ??????? MASK UNUSED TEMPLATES                    ???????
-
-<a name="CodeSnip">
-<h3 class="pagebefore">10.6. Code Snippets</h3>
-</a>
-
-<font color="red">
-<i>
-This section simply provides templates; none of the text is apropos.
-</i>
-</font>
-
-<p>
-Consider the the short example below and the longer one immediately following.
-</p>
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  file_id = H5Fcreate ("SampleFile.h5", H5F_ACC_EXCL,
-      H5P_DEFAULT, H5P_DEFAULT)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 1. Creating an HDF5 file using property list defaults</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-<p>
-And the more complex case.
-<p>
-In this more complex case, 
-we define file creation and access property lists (though we do not 
-assign any properties), specify that <code>H5Fcreate</code> should 
-fail if <code>SampleFile.h5</code> already exists, and create a 
-new file named <code>SampleFile.h5</code>. The example does not 
-specify a driver, so the default driver, 
-<code>H5FD_SEC2</code>, will be used.</p>
-
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-    <pre>
-  fcplist_id = H5Pcreate (H5P_FILE_CREATE)
-    <...<em>set desired file creation properties</em>...>
-  faplist_id = H5Pcreate (H5P_FILE_ACCESS)
-    <...<em>set desired file access properties</em>...>
-  file_id = H5Fcreate ("SampleFile.h5", H5F_ACC_EXCL, fcplist_id, faplist_id)</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 2. Creating an HDF5 file using property lists</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-     <tr valign="top" align="left">
-     <td>
-     <font size="-1">
-     Notes: 
-     <br>
-     A root group is automatically created in a file when the file 
-     is first created.
-     <br>
-     File property lists, once defined, can be reused when another 
-     file is created within the same application.
-     </font>
-     </td>
-     </tr>
-</table>
-<br />
-
-<dir>
-    <p>Notes: 
-    <br>A root group is automatically created in a file when the file 
-    is first created.
-    <br>File property lists, once defined, can be reused when another 
-    file is created within the same application.
-    </p>
-</dir>
-
-??????? END UNUSED TEMPLATES MASK ???????
-??????? END REDACTION             ??????? -->
-
-
-<!-- NEW PAGE -->
-<a name="FunctionSumms">
-<h3 class="pagebefore">10.5. Property List Function Summaries</h3>
-</a>
-
-    <p>
-    General property functions, 
-    generic property functions and macros, 
-    property functions that are used with multiple types of objects,
-    and object and link property functions
-    are listed below.
-    </p>
-    <p>
-    Property list functions that apply to a specific type of object
-    are listed in the chapter that discusses that object.
-    For example, the Datasets chapter has two property list function listings: 
-    one for dataset creation property list functions and
-    one for dataset access property list functions. 
-    As has been stated, this chapter is not intended to describe 
-    every property list function.
-    </p>
-
-   
-    <table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom" align="left">
-        <th colspan="3" valign="bottom">
-        Function Listing 1. General property list functions (H5P)
-        </th>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top" align="left"> 
-        <th>
-        C Function<br />Fortran Subroutine    
-        </th>
-        <th> </th>
-        <th>
-        Purpose</th>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pcreate</code>
-        <br />
-        <code>h5pcreate_f   </code>
-        </td>
-        <td> </td>
-        <td>
-        Creates a new property list as an instance of a specified 
-        parent property list class.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pcopy</code>
-        <br />
-        <code>h5pcopy_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Creates a new property list by copying the specified 
-        existing property list.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_class</code>
-        <br />
-        <code>h5pget_class_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Retrieves the parent property list class of the specified 
-        property list.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pclose</code>
-        <br />
-        <code>h5pclose_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Closes the specified property list.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    </table>
-    </p>
-    <p>
-
-
-    <a name="ObjectPropFunctions">
-    Object property functions can be used with several kinds of objects.
-    </a>
-
-
-    </p>
-    <p>
-   
-    <table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <th colspan="3" align="left" valign="bottom">
-        Function Listing 2. Object property functions (H5P)
-        </th>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top"> 
-        <th align="left">
-        C Function
-        <br />
-        Fortran Subroutine    </b>
-        </th>
-        <th> </th>
-        <th align="left">
-        Purpose</td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr><th colspan="3" align="left">
-        Object Creation Properties
-        </th></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_attr_creation_order</code>
-        <br />
-        <code>h5pget_attr_creation_order_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Retrieves tracking and indexing settings for attribute creation order. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_attr_phase_change</code>
-        <br />
-        <code>h5pget_attr_phase_change_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Retrieves attribute storage phase change thresholds.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_obj_track_times</code>
-        <br />
-        <code>h5pget_obj_track_times_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Determines whether times associated with an object are being recorded.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_attr_creation_order</code>
-        <br />
-        <code>h5pset_attr_creation_order_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Sets tracking and indexing of attribute creation order.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_attr_phase_change</code>
-        <br />
-        <code>h5pset_attr_phase_change_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Sets attribute storage phase change thresholds.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_obj_track_times</code>
-        <br />
-        <code>h5pset_obj_track_times_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Sets the recording of times associated with an object.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr><th colspan="3" align="left">
-        Object Copy Properties
-        </th></tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Padd_merge_committed_dtype_path</code>
-        <br />
-        <code>(none)</code>
-        </td>
-        <td> </td>
-        <td>
-        Adds a path to the list of paths that will be searched in 
-        the destination file for a matching committed datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pfree_merge_committed_dtype_paths   </code>
-        <br />
-        <code>(none)</code>
-        </td>
-        <td> </td>
-        <td>
-        Clears the list of paths stored in an object copy property list. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_copy_object</code>
-        <br />
-        <code>h5pget_copy_object_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Retrieves the properties to be used when an object is copied.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_mcdt_search_cb</code>
-        <br />
-        <code>(none)</code>
-        </td>
-        <td> </td>
-        <td>
-        Retrieves the callback function from the 
-        specified object copy property list.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_copy_object</code>
-        <br />
-        <code>h5pset_copy_object_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Sets the properties to be used when an object is copied.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_mcdt_search_cb</code>
-        <br />
-        <code>(none)</code>
-        </td>
-        <td> </td>
-        <td>
-        Sets the callback function that H5Ocopy will invoke 
-        before searching the entire destination file 
-        for a matching committed datatype.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    </table>
-    </p>
-    <p>
-
-
-    <a name="LinkCreationTable">
-    The following table lists link creation properties.</a>
-    Since the creation of a link is almost always a step in the 
-    creation of an object, these properties may also be set in 
-    group creation property lists, 
-    dataset creation property lists, 
-    datatype creation property lists, 
-    and the more generic object creation property lists. 
-    Some are also applicable to the attribute creation property lists.
-    <a name="WidelyUsedProps"> </a>
-    <a name="LinkCreateProps"> </a>
-    </p>
-    <p>
-
-    <table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <th colspan="3" align="left" valign="bottom">
-        Function Listing 3. Link creation property functions (H5P)
-        </th>
-        </tr>
-    <tr valign="bottom">
-        <td colspan="3" align="left" valign="bottom">
-        <font size="-1"><i>
-        These properties can be used with any of the indicated 
-        property lists.
-        </i></font>
-        </th>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top" align="left"> 
-        <th>
-        C Function
-           <br />
-           Fortran Subroutine    
-        </th>
-        <th> </th>
-        <th>
-        Purpose</th>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_char_encoding</code>
-        <br />
-        <code>h5pget_char_encoding_f   </code>
-        </td>
-        <td> </td>
-        <td>
-        Queries the character encoding used to encode link or attribute names. 
-        <br>
-        <font size="-1"><i>
-        Any link, object, dataset, datatype, group, or attribute 
-        creation property list
-        </i></font>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_char_encoding</code>
-        <br />
-        <code>h5pset_char_encoding_f   </code>
-        </td>
-        <td> </td>
-        <td>
-        Sets the character encoding used to encode link and attribute names. 
-        <br>
-        <font size="-1"><i>
-        Any link, object, dataset, datatype, group, or attribute 
-        creation property list
-        </i></font>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_create_intermediate_group</code>
-        <br />
-        <code>h5pget_create_intermediate_group_f   </code>
-        </td>
-        <td> </td>
-        <td>
-        Queries setting for creation of intermediate groups.
-        <br>
-        <font size="-1"><i>
-        Link creation property list, which in turn can be used in the
-        create call for any dataset, datatype, or group 
-        </i></font>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset_create_intermediate_group</code>
-        <br />
-        <code>h5pset_create_intermediate_group_f   </code>
-        </td>
-        <td> </td>
-        <td>
-        Specifies whether to create intermediate groups 
-        when they do not already exist.
-        <br>
-        <font size="-1"><i>
-        Link creation property list, which in turn can be used in the
-        create call for any dataset, datatype, or group 
-        </i></font>
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    </table>
-    </p>
-    <p>
-
-
-<!-- ??????? GENERIC PROPERTY OPERATIONS TABLE REMOVED FROM UG ??????? -->
-<!-- ??????? Property Lists CHAPTER (UG/14_PropertyLists.html) ??????? -->
-<!-- ??????? AND CORRESPONDING TEXT REDUCED IN FAVOR OF        ??????? -->
-<!-- ??????? EVENTUAL (AND AS YET UNSCUEDULED) DOCUMENT        ??????? -->
-<!-- ??????? SEPARATELY DOCUMENTING GENERIC PROPERTY OPS.      ??????? -->
-<!-- ??????? THIS WILL PROBABLY BE AN "ADVANCED TOPIC".        ??????? -->
-<!-- ???????                                   9 July 2014     ??????? -->
-
-<!-- ??????? SEE hdf5doc/trunk/sandbox/GenericProperties/.     ??????? 
-
-    Generic property functions allow an application to create 
-    properties, property lists, and property list classes 
-    beyond those provided by HDF5.
-    Beyond this function listing and the 
-    <a href="#GenericPLists">generic and user-defined properties</a>
-    section above, discussions of HDF5’s generic property interface
-    and user-defined properties and property lists are beyond 
-    the current scope of this document.
-
-    <a name="GenericPropFunctions"> </a>
-
-    </p>
-    <p>
-   
-    <table width="600" cellspacing="0" align="center" cellpadding="0">
-    <tr valign="bottom">
-        <th colspan="3" align="left" valign="bottom">
-        Function Listing 4. Generic property functions (H5P)
-        </th>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    <tr valign="top" align="left" valign="top"> 
-        <th>
-        C Function or Macro
-           <br />
-           Fortran Subroutine    
-        </th>
-        <th> </th>
-        <th>
-        Purpose</th>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pclose_class</code>
-        <br />
-        <code>h5pclose_class_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Closes an existing property list class.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pcopy_prop</code>
-        <br />
-        <code>h5pcopy_prop_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Copies a property from one property list or property list class 
-        to another.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pcreate_class</code>
-        <br />
-        <code>h5pcreate_class_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Creates a new property list class.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pequal</code>
-        <br />
-        <code>h5pequal_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Compares two property lists or property list classes for equality. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pexist</code>
-        <br />
-        <code>h5pexist_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Queries whether a property name exists in a property list 
-        or property list class.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget</code>
-        <br />
-        <code>h5pget_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Queries the value of a property. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_class_name</code>
-        <br />
-        <code>h5pget_class_name_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Retrieves the name of a property list class.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_class_parent</code>
-        <br />
-        <code>h5pget_class_parent_f   </code>
-        </td>
-        <td> </td>
-        <td>
-        Retrieves the parent class of a property list class.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_nprops</code>
-        <br />
-        <code>h5pget_nprops_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Queries the number of properties in a property list or 
-        property list class. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pget_size</code>
-        <br />
-        <code>h5pget_size_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Queries the size of a property value in bytes. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pinsert</code>
-        <br />
-        <code>h5pinsert_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Registers a temporary property with a property list.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pisa_class</code>
-        <br />
-        <code>h5pisa_class_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Determines whether a property list is a member of a class.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Piterate</code>
-        <br />
-        <code>h5piterate_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Iterates over the properties in a property list or
-        property list class.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pregister</code>
-        <br />
-        <code>h5pregister_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Registers a permanent property with a property list class.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Premove</code>
-        <br />
-        <code>h5premove_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Removes a property from a property list. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Pset</code>
-        <br />
-        <code>h5pset_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Sets a property list value.
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td>
-        <code>H5Punregister</code>
-        <br />
-        <code>h5punregister_f</code>
-        </td>
-        <td> </td>
-        <td>
-        Removes a property from a property list class. 
-        </td>
-        </tr>
-    <tr><td colspan="3"><hr color="green" size="3" /></td></tr>
-    </table>
-    </p>
-
--->
-<!-- ??????? END OF REMOVED GENERIC PROPERTY OPERATIONS TABLE. ??????? -->
-
-
-<a name="AddlPListResources">
-<h3 class="pagebefore">10.6. Additional Property List Resources</h3>
-</a>
-
-    Property lists are ubiquitous in an HDF5 environment and are therefore 
-    discussed in many places in HDF5 documentation.
-    The following sections and listings in the
-    <a href="UG_frame.html"><cite>HDF5 User’s Guide</cite></a> 
-    are of particular interest: 
-    <dir>
-    <dl>
-    <dt>In the “<a href="UG_frame03DataModel.html" target="_top">HDF5
-        Data Model and File Structure</a>” chapter, 
-        see the “Property List” section.
-            <br /> 
-    <dt>In the “<a href="UG_frame08TheFile.html" target="_top">HDF5
-        File</a>” chapter, see the following sections and listings:
-        <dd>File Creation and File Access Properties
-        <dd>File Property Lists and its sub-sections
-        <dd>Example with the File Creation Property List
-        <dd>Example with File Access Property List
-        <dd>File creation property list functions
-        <dd>File access property list functions
-        <dd>File driver functions
-            <br /> 
-    <dt>In the “<a href="UG_frame13Attributes.html" target="_top">HDF5
-        Attributes</a>” chapter, see the “Attribute creation 
-        property list functions” listing.
-            <br /> 
-    <dt>In the “<a href="UG_frame09Groups.html" target="_top">HDF5
-        Groups</a>” chapter, see the “Group creation 
-        property list functions” listing.
-            <br /> 
-    <dt>Property lists are discussed throughout the 
-            “<a href="UG_frame10Datasets.html" 
-            target="_top">HDF5 Datasets</a>” chapter.
-    </dl>
-    </dir>
-    </p>
-    <p>
-
-    All property list functions are described in the
-    “<a href="../RM/RM_H5P.html">H5P: Property List 
-    Interface</a>” section of the 
-    <a href="../RM/RM_H5Front.html"><cite>HDF5 Reference Manual</cite></a>.
-    The function index at the top of the page provides a categorized listing 
-    grouped by property list class.  Those classes are listed below:
-    <ul>
-        <ul>
-            <li>File creation properties
-            <li>File access properties
-            <li>Group creation properties
-            <li>Dataset creation properties
-            <li>Dataset access properties
-            <li>Dataset transfer properties
-            <li>Link creation properties
-            <li>Link access properties
-            <li>Object creation properties
-            <li>Object copy properties
-            <li>String creation property
-                <br /> 
-        </ul>
-        <li>Additional categories not related to the class structure 
-            are as follows:
-        <ul>
-            <li>General property list operations
-            <li>Generic property list functions
-        </ul>
-        The general property functions can be used with any property list;
-        the generic property functions constitute an advanced feature.
-    </ul>
-    </p>
-    <p>
-
-    The in-memory file image feature of HDF5 uses property lists 
-    in a manner that differs substantially from their use elsewhere in HDF5.
-    Those who plan to use in-memory file images must study “<a href=
-    "../Advanced/FileImageOperations/HDF5FileImageOperations.pdf">File 
-    Image Operations</a>” (PDF) in the
-    <a href="../Advanced.html"><cite>Advanced Topics in HDF5</cite></a>
-    collection. 
-    </ul>
-    </p>
-
-
-<hr>
-
-<a name="Footnotes">
-<h3 class="pagebefore">Footnotes</h3>
-</a>
-
-    <a name="H5P_FILE_MOUNT">
-    <dl>
-    <dt>1. File mount properties
-        </dt></a>
-        <dd>While the file mount property list class 
-            <code>H5P_FILE_MOUNT</code> is a valid HDF5 property list class,
-            no file mount properties are defined by the HDF5 Library.
-            References to a file mount property list should always be
-            expressed as <code>H5P_DEFAULT</code>, meaning the 
-            default file mount property list.
-    </dl>
-
-    </p>
-    <p>
-
-    <a name="APL,CPLexceptions">
-    <dl>
-    <dt>2. Access and creation property exceptions
-        </dt></a>  
-        <dd>There are a small number of exceptions to the rule that 
-            creation properties are always retained in a file or object and 
-            access properties are never retained.
-            </p>
-            <p>
-            The following properties are file access properties
-            but they are not transient; 
-            they have permanent and different effects on a file. 
-            They could be validly classified as file creation properties 
-            as they must be set at creation time to properly create the file.
-            But they are access properties because they must also be set 
-            when a file is reopened to properly access the file.
-            <table>
-            <tr align="left" valign="top">
-                <th><code>    </code></th>
-                <th>Property</th>
-                <th><code>  </code></th>
-                <th>Related function</th>
-                </tr>
-            <tr align="left" valign="top">
-                <td><code>    </code></td>
-                <td>Family file driver</td>
-                <td><code> </code></td>
-                <td><code>H5Pset_fapl_family</code></td>
-                </tr>
-            <tr align="left" valign="top">
-                <td><code>    </code></td>
-                <td>Split file driver</td>
-                <td><code> </code></td>
-                <td><code>H5Pset_fapl_split</code></td>
-                </tr>
-            <tr align="left" valign="top">
-                <td><code>    </code></td>
-                <td>Core file driver</td>
-                <td><code> </code>
-                </p>
-                <p>
-                </td>
-                <td><code>H5Pset_fapl_core</code></td>
-                </tr>
-
-            <tr align="left" valign="top">
-                <td colspan="4">
-                    The following is a link creation property, but
-                    it is not relevant after an object has been created
-                    and is not retained in the file or object.
-            <tr align="left" valign="top">
-                <th><code>    </code></th>
-                <th>Property</th>
-                <th><code> </code></th>
-                <th>Related function</th>
-                </tr>
-            <tr align="left" valign="top">
-                <td><code>    </code></td>
-                <td>Create missing intermediate groups</td>
-                <td><code> </code></td>
-                <td><code>H5Pset_create_intermediate_groups</code></td>
-                </tr>
-            </table>
-    </dl>
-
-
-
-<!-- ??????? REDACTED FOR REVIEW &/OR PUBLICATION        ???????
-     ??????? NOT RELEVANT TO THE USER PUBLICATION        ???????
-<p>
-<u>Additional writing resources:</u>
-</p>
-<p>
-The <code>Topic-7.7-File Image Operations.pptx</code> file has a section titled “Digression: Property Lists” that includes slides 8-9. This might be a resource for the property lists chapter in the UG. 
-<br>
-This PowerPoint file is located in <code>C:\1 MEE\Working\hdf5_trunk\projects\PSI\Day 2</code>.
-
-<font color="red">
-<br>
-<i>
-This info is incorporated.
-</i>
-</font>
-
-</p>
-<p>
-See slide 48 of <code>Topic-6-HDF-Parallel.pptx</code> in <code>C:\1 MEE\Working\hdf5_trunk\projects\PSI\</code>Day 1. Parallel HDF5 programming model. 
-<br>
-Comment on slide: "HDF5 uses access template object (property list) to control the file access mechanism."
-
-<font color="red">
-<br>
-<i>
-May be useful if a Parallel I/O example is included.
-</i>
-</font>
-</p>
-
-??????? END REDACTION ??????? ??????? -->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<br /><br />
-</body>
-</html>
diff --git a/html/UG/OldHtmlSource/17_Additional.html b/html/UG/OldHtmlSource/17_Additional.html
deleted file mode 100755
index 8abc894..0000000
--- a/html/UG/OldHtmlSource/17_Additional.html
+++ /dev/null
@@ -1,1445 +0,0 @@
-<!doctype HTML public "-//W3C//DTD HTML 4.0 Frameset//EN">
-<html>
-<head>
-<title>Chapter 10: Additional Resources</title>
-
-<!--(Meta)==========================================================-->
-
-
-<!--(Links)=========================================================-->
-
-<link href="ed_styles/NewUGelect.css" rel="stylesheet" type="text/css">
-
-<!--( Begin styles definition )=====================================-->
-<!--     Replaced with external stylesheet 'styles_NewUG.css'.      -->
-<!--( End styles definition )=======================================-->
-
-</head>
-
-<body>
-
-<!-- #BeginLibraryItem "/ed_libs/Copyright.lbi" -->
-<!--
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-  * Copyright by The HDF Group.                                               *
-  * Copyright by the Board of Trustees of the University of Illinois.         *
-  * All rights reserved.                                                      *
-  *                                                                           *
-  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
-  * terms governing use, modification, and redistribution, is contained in    *
-  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
-  * of the source code distribution tree; Copyright.html can be found at the  *
-  * root level of an installed copy of the electronic HDF5 document set and   *
-  * is linked from the top-level documents page.  It can also be found at     *
-  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
-  * access to either file, you may request a copy from help at hdfgroup.org.     *
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- -->
-<!-- #EndLibraryItem -->
-
-<!-- HEADER LEFT "HDF5 User's Guide" -->
-<!-- HEADER RIGHT "Additional Resources" -->
-
-<div align="center">
-<a name="TOP">
-<h2>Chapter 11<br /><font size="7">Additional Resources</font></h2>
-</a>
-</div>
-
-<!-- FOR USE WITH ELECTRONIC VERSION --------------------------------->
-
-<center>
-<table border="0" width="80%">
-
-    <tr>
-      <td valign="top" colspan="3">
-      <p>These documents supplement the <cite>HDF5 User’s Guide</cite>
-      and provide additional detailed information for the use and tuning 
-      of specific HDF5 features.</p></td>
-      </tr>
-
-    <tr>
-      <td>   </td>
-      <td>   </td>
-      <td>   </td>
-      </tr>
-
-    <tr>
-      <td valign="top">
-      <a href="http://www.hdfgroup.org/HDF5/examples/">
-      HDF5 Examples</a></td>
-      <td>   </td>
-      <td valign="top">Code examples by API. 
-        <!-- 11.2.10, keep code examples at the top of the list of links -->
-        </td>
-      </tr>
-
-    <tr><td colspan="3"> </td></tr>
-
-    <tr>
-      <td valign="top">
-      <a href="../Advanced/Chunking/index.html">Chunking in HDF5</a></td>
-      <td>   </td>
-      <td valign="top">Structuring the use of chunking and tuning it for 
-      performance.</td>
-      </tr>
-
-    <tr><td colspan="3"> </td></tr>
-
-    <tr>
-      <td valign="top">
-      <a href="../Advanced/DirectChunkWrite/UsingDirectChunkWrite.pdf">
-      Using the Direct Chunk Write Function</a></td>
-      <td>   </td>
-      <td valign="top">Describes another way that chunks can be written 
-      to datasets.</td>
-      </tr>
-
-    <tr><td colspan="3"> </td></tr>
-
-    <tr>
-      <td valign="top">
-      <a href="../Advanced/CommittedDatatypeCopying/CopyingCommittedDatatypesWithH5Ocopy.pdf">
-      Copying Committed Datatypes with H5Ocopy</a></td>
-      <td>   </td>
-      <td valign="top">
-      Describes how to copy to another file a dataset that uses a committed 
-      datatype or an object with an attribute that uses a committed datatype 
-      so that the committed datatype in the destination file can be used by 
-      multiple objects.</td>
-      </tr>
-
-    <tr><td colspan="3"> </td></tr>
-
-    <tr>
-      <td valign="top"><a href="../Advanced/MetadataCache/index.html">
-      Metadata Caching in HDF5</a></td>
-      <td>   </td>
-      <td valign="top">Managing the HDF5 metadata cache and tuning it for 
-      performance.</td>
-      </tr>
-
-    <tr><td colspan="3"> </td></tr>
-
-    <tr><td valign="top">
-      <a href="../Advanced/DynamicallyLoadedFilters/HDF5DynamicallyLoadedFilters.pdf">
-      HDF5 Dynamically Loaded Filters</a>
-      <td> </td>
-      <td valign="top">
-      Describes how an HDF5 application can apply a filter that is not 
-      registered with the HDF5 Library.
-      </td>
-      </tr>
-
-    <tr><td colspan="3"> </td></tr>
-
-    <tr><td valign="top">
-      <a href="../Advanced/FileImageOperations/HDF5FileImageOperations.pdf">
-      HDF5 File Image Operations</a></td>
-      <td> </td>
-      <td valign="top">
-      Describes how to work with HDF5 files in memory. Disk I/O is not 
-      required when file images are opened, created, read from, or 
-      written to.</td>
-      </tr>
-
-    <tr><td colspan="3"> </td></tr>
-
-    <tr><td valign="top">
-      <a href="../Advanced/ModifiedRegionWrites/ModifiedRegionWrites.pdf">
-      Modified Region Writes</a></td>
-      <td> </td>
-      <td valign="top">
-      Describes how to set write operations for in-memory files so that 
-      only modified regions are written to storage. Available when 
-      the Core (Memory) VFD is used. 
-      </td>
-      </tr>
-
-    <tr><td colspan="3"> </td></tr>
-
-    <tr><td valign="top"><a href="../Advanced/UsingIdentifiers/index.html">
-      Using Identifiers</a></td>
-      <td>   </td>
-      <td valign="top">
-      Describes how identifiers behave and how they should be treated.</td>
-      </tr>
-
-    <tr><td colspan="3"> </td></tr>
-    
-    <tr><td valign="top"><a href="../Advanced/UsingUnicode/index.html">
-      Using UTF-8 Encoding in </a>
-      <br />
-      <a href="../Advanced/UsingUnicode/index.html">HDF5 Applications</a>
-      
-      </td>
-      <td>   </td>
-      <td valign="top">
-      Describes the use of UTF-8 Unicode character encodings in HDF5 
-      applications.</td>
-      </tr>
-      
-    <tr><td colspan="3"> </td></tr>
-    
-    <tr><td valign="top"><a href="../Advanced/FreeingMemory/FreeingMemoryAllocatedByTheHdf5Library.pdf">
-      Freeing Memory Allocated</a>
-      <br />
-      <a href="../Advanced/FreeingMemory/FreeingMemoryAllocatedByTheHdf5Library.pdf">by the HDF5 Library</a>
-      </td>
-      <td>   </td>
-      <td valign="top">
-      Describes how inconsistent memory management can cause heap 
-      corruption or resource leaks and possible solutions.</td>
-      </tr>
-      
-    <tr><td colspan="3"> </td></tr>
-    
-    <tr>
-      <td valign="top"><a href="../Glossary.html">
-      HDF5 Glossary</a></td>
-      <td>   </td>
-      <td valign="top">A glossary of terms.
-      <!-- 11.2.10, keep Glossary at the bottom of the list of links --></td>
-      </tr>
-
-      <tr><td colspan="3"> </td></tr>
-      
-
-
-
-
-</table>
-</center>
-
-
-
-
-
-
-
-
-
-<!-- FOR USE WITH ELECTRONIC VERSION --------------------------------->
-
-<!-- PRINT VERSION INCLUDES THE TEXT TO THE END OF THE FILE -->
-<!-- FOR USE WITH PRINT VERSION --------------------------------------
-
-
-
-<p> This chapter provides supplemental material for the 
-    <cite>HDF5 User’s Guide</cite>. </p>
-
-<p> To see code examples by API, go to the <cite>HDF5 Examples</cite> 
-    page at this address: 
-    <pre>    http://www.hdfgroup.org/HDF5/examples/
-    </pre></p>
-<p> For more information on how to manage the metadata cache and how 
-    to configure it for better performance, go to the <cite>Metadata
-    Caching in HDF5</cite> page at this address:
-    <pre>
-    http://www.hdfgroup.org/hdf5/doc/Advanced/MetadataCache/index.html
-    </pre></p>
-<p> A number of functions are macros. For more information on how
-    to use the macros, see the <cite>API Compatibility Macros in HDF5</cite>
-    page at this address:
-    <pre>
-    http://www.hdfgroup.org/HDF5/doc/RM/APICompatMacros.html
-    </pre>
-    
-<p>The following sections are included in this chapter:</p>
-<ul>
-    <li><i>Using Identifiers</i> - describes how identifiers behave
-    and how they should be treated
-    <li><i>Chunking in HDF5</i> - describes chunking storage and 
-    how it can be used to improve performance
-    <li><i>HDF5 Glossary and Terms</i></li>
-</ul>
-    
-
-<br />
-<!-- NEW PAGE -->
-<!-- PRINT VERSION CONTINUED --
-<h2>11.1. Using Identifiers</h2>
-<p> The purpose of this section is to describe how identifiers behave 
-    and how they should be treated by application programs.</p>
-
-<p> When an application program uses the HDF5 library to create or 
-    open an item, a unique identifier is returned. The items that return 
-    a unique identifier when they are created or opened include the 
-    following: dataset, group, datatype, dataspace, file, attribute, 
-    property list, referenced object, error stack, and error message.</p>
-
-<p> An application may open one of the items listed above more than 
-    once at the same time. For example, an application might open a group 
-    twice, receiving two identifiers. Information from one dataset in the 
-    group could be handled through one identifier, and the information 
-    from another dataset in the group is handled by a different identifier.</p>
-
-<p> An application program should track every identifier it receives 
-    as a result of creating or opening one of the items listed above. In 
-    order for an application to close properly, it must release every 
-    identifier it has opened. If an application opened a group twice for 
-    example, it would need to issue two <code>H5Gclose</code> commands, 
-    one for each identifier. Not releasing identifiers causes resource 
-    leaks. Until an identifier is released, the item associated with 
-    the identifier is still open.</p>
-
-<p> The library considers a file open until all of the identifiers 
-    associated with the file and with the file�s various items have been 
-    released. The identifiers associated with these open items must be 
-    released separately. This means that an application can close a file 
-    and still work with one or more portions of the file. Suppose an 
-    application opened a file, a group within the file, and two datasets 
-    within the group. If the application closed the file with 
-    <code>H5Fclose</code>, then the file would be considered closed 
-    to the application, but the group and two datasets would still 
-    be open.</p>
-
-<p> There are several exceptions to the above file closing rule. One 
-    is when the <code>H5close</code> function is used instead of 
-    <code>H5Fclose</code>. <code>H5close</code> causes a general 
-    shutdown of the library: all data is written to disk, all 
-    identifiers are closed, and all memory used by the library is 
-    cleaned up. Another exception occurs on parallel processing systems. 
-    Suppose on a parallel system an application has opened a file, a 
-    group in the file, and two datasets in the group. If the application 
-    uses the <code>H5Fclose</code> function to close the file, the call 
-    will fail with an error. The open group and datasets must be closed 
-    before the file can be closed. A third exception is when the file 
-    access property list includes the property 
-    <code>H5F_CLOSE_STRONG</code>. This property causes the closing 
-    of all of the file�s open items when the file is closed with 
-    <code>H5Fclose</code>.</p>
-
-<p> For more information about <code>H5close</code>, 
-    <code>H5Fclose</code>, and <code>H5Pset_fclose_degree</code>, 
-    see the <a href="../RM/RM_H5Front.html">
-    <cite>HDF5 Reference Manual</cite></a></p>
-
-<!--
----------1---------2---------3---------4---------5---------6---------7---------8
--->
-<!-- PRINT VERSION CONTINUED --
-<h3>Functions that Return Identifiers</h3>
-
-<p>Some of the functions that return identifiers are listed below.</p>
-
-<ul>
-<li><code>H5Acreate</code></li>
-<li><code>H5Acreate_by_name</code></li>
-<li><code>H5Aget_type</code></li>
-<li><code>H5Aopen</code></li>
-<li><code>H5Aopen_by_idx</code></li>
-<li><code>H5Aopen_by_name</code></li>
-<li><code>H5Dcreate</code></li>
-<li><code>H5Dcreate_anon</code></li>
-<li><code>H5Dget_access_plist</code></li>
-<li><code>H5Dget_create_plist</code></li>
-<li><code>H5Dget_space</code></li>
-<li><code>H5Dget_type</code></li>
-<li><code>H5Dopen</code></li>
-<li><code>H5Ecreate_msg</code></li>
-<li><code>H5Ecreate_stack</code></li>
-<li><code>H5Fcreate</code></li>
-<li><code>H5Fopen</code></li>
-<li><code>H5Freopen</code></li>
-<li><code>H5Gcreate</code></li>
-<li><code>H5Gcreate_anon</code></li>
-<li><code>H5Gopen</code></li>
-<li><code>H5Oopen</code></li>
-<li><code>H5Oopen_by_addr</code></li>
-<li><code>H5Oopen_by_idx</code></li>
-<li><code>H5Pcreate</code></li>
-<li><code>H5Rdereference</code></li>
-<li><code>H5Rget_region</code></li>
-<li><code>H5Screate</code></li>
-<li><code>H5Screate_simple</code></li>
-<li><code>H5Tcopy</code></li>
-<li><code>H5Tcreate</code></li>
-<li><code>H5Tdecode</code></li>
-<li><code>H5Tget_member_type</code></li>
-<li><code>H5Tget_super</code></li>
-<li><code>H5Topen</code></li>
-</ul>
-
-<br />
-
-
-
-<!-- NEW PAGE -->
-<!-- PRINT VERSION CONTINUED --
-<h2>11.2. Chunking in HDF5</h2>
-
-<p> Datasets in HDF5 not only provide a convenient, structured, and 
-    self-describing way to store data, but are also designed to do so with 
-    good performance. In order to maximize performance, the HDF5 library 
-    provides ways to specify how the data is stored on disk, 
-    how it is accessed, and how it should be held in memory.</p>
-<!--
----------1---------2---------3---------4---------5---------6---------7---------8
--->
-<!-- PRINT VERSION CONTINUED --
-<h3>11.2.1. What are Chunks?</h3>
-
-<p> Datasets in HDF5 can represent arrays with any number of dimensions 
-    (up to 32). However, in the file this dataset must be stored as part 
-    of the 1-dimensional stream of data that is the low-level file. 
-    The way in which the multidimensional dataset is mapped to the 
-    serial file is called the layout. The most obvious way to accomplish 
-    this is to simply flatten the dataset in a way similar to how arrays 
-    are stored in memory, serializing the entire dataset into a 
-    monolithic block on disk, which maps directly to a memory buffer 
-    the size of the dataset. This is called a contiguous layout.</p>
-    
-<p> An alternative to the contiguous layout is the chunked layout. 
-    Whereas contiguous datasets are stored in a single block in the file, 
-    chunked datasets are split into multiple <em>chunks</em> which are 
-    all stored separately in the file. The chunks can be stored in any 
-    order and any position within the HDF5 file. Chunks can then be read 
-    and written individually, improving performance when operating on 
-    a subset of the dataset. </p>
-    
-<p> The API functions used to read and write chunked datasets are 
-    exactly the same functions used to read and write contiguous 
-    datasets. The only difference is a single call to set up the layout 
-    on a property list before the dataset is created. In this way, a 
-    program can switch between using chunked and contiguous datasets 
-    by simply altering that call. Example 1, below, creates a dataset 
-    with a size of 12x12 and a chunk size of 4x4. The example could be 
-    change to create a contiguous dataset instead by simply commenting 
-    out the call to <code>H5Pset_chunk</code>.</p>
-
-<!-- NEW PAGE -->
-<!-- PRINT VERSION CONTINUED --
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-#include <hdf5.h>
-int main(void) {
-    hid_t   file_id, dset_id, space_id, dcpl_id;
-    hsize_t chunk_dims[2] = {4, 4};
-    hsize_t dset_dims[2] = {12, 12};
-    int     buffer[12][12];
-
-    /* Create the file */
-    file_id = H5Fcreate(file.h5, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create a dataset creation property list and set it to use chunking
-    */
-    dcpl_id = H5Pcreate(H5P_DATASET_CREATE);
-    H5Pset_chunk(dcpl_id, 2, chunk_dims);
-
-    /* Create the dataspace and the chunked dataset */
-    space_id = H5Screate_simple(2, dset_dims, NULL);
-    dset_id = H5Dcreate(file, dataset, H5T_NATIVE_INT, space_id, dcpl_id, H5P_DEFAULT);
-
-    /* Write to the dataset */
-    buffer = <initialize buffer>
-    H5Dwrite(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buffer);
-
-    /* Close */
-    H5Dclose(dset_id);
-    H5Sclose(space_id);
-    H5Pclose(dcpl_id);
-    H5Fclose(file_id);
-    return 0;
-}
-    </pre></td>
-  </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 1. Creating a chunked dataset</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-
-<p> The chunks of a chunked dataset are split along logical boundaries 
-    in the dataset's representation as an array, not along boundaries 
-    in the serialized form. Suppose a dataset has a chunk size of 2x2. 
-    In this case, the first chunk would go from (0,0) to (2,2), the 
-    second from (0,2) to (2,4), and so on. By selecting the chunk size 
-    carefully, it is possible to fine tune I/O to maximize performance 
-    for any access pattern. Chunking is also required to use advanced 
-    features such as compression and dataset resizing.</p>
-
-
-<!-- NEW Page -->
-<!-- PRINT VERSION CONTINUED --
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <br />
-        <img src="Images/ChunkingFig001.png">
-        <br /><br />
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 1. Contiguous dataset</b>
-        <hr color="green" size="3"/></td></tr>
-    </table>
-<br />
-
-
-
-<!-- NEW Page -->
-<!-- PRINT VERSION CONTINUED --
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <br />
-        <img src="Images/ChunkingFig002.png">
-        <br /><br />
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 2. Chunked dataset</b>
-        <hr color="green" size="3"/></td></tr>
-    </table>
-<br />
-
-
-
-
-<!-- NEW PAGE -->
-<!-- PRINT VERSION CONTINUED --
-<h3>11.2.2. Data Storage Order</h3>
-
-<p> To understand the effects of chunking on I/O performance it is 
-    necessary to understand the order in which data is actually stored 
-    on disk.  When using the C interface, data elements are stored in 
-    "row-major" order, meaning that, for a 2-dimensional dataset, rows 
-    of data are stored in-order on the disk. This is equivalent to the 
-    storage order of C arrays in memory.</p>
-    
-<p> Suppose we have a 10x10 contiguous dataset B. The first element 
-    stored on disk is B[0][0], the second B[0][1], the eleventh B[1][0], 
-    and so on. If we want to read the elements from B[2][3] to B[2][7], 
-    we have to read the elements in the 24th, 25th, 26th, 27th, and 28th 
-    positions. Since all of these positions are contiguous, or next to 
-    each other, this can be done in a single read operation: read 5 
-    elements starting at the 24th position. This operation is illustrated 
-    in figure 3: the pink cells represent elements to be read and the 
-    solid line represents a read operation. Now suppose we want to 
-    read the elements in the column from B[3][2] to B[7][2]. In this case 
-    we must read the elements in the 33rd, 43rd, 53rd, 63rd, and 73rd 
-    positions. Since these positions are not contiguous, this must be 
-    done in 5 separate read operations. This operation is illustrated 
-    in figure 4: the solid lines again represent read operations, and 
-    the dotted lines represent seek operations. An alternative would 
-    be to perform a single large read operation , in this case 41 
-    elements starting at the 33rd position. This is called a 
-    <em>sieve buffer</em> and is supported by HDF5 for contiguous 
-    datasets, but not for chunked datasets. By setting the chunk sizes 
-    correctly, it is possible to greatly exceed the performance of the 
-    sieve buffer scheme.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <br />
-        <img src="Images/ChunkingFig003.png">
-        <br /><br />
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 3. Reading part of a row from a contiguous dataset</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-  </table>
-<br />
-<br />
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <br />
-        <img src="Images/ChunkingFig004.png" alt="Illustration of a 
-        partial column of a contiguous dataset">
-        <br /><br />
-        </td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 4. Reading part of a column from a contiguous dataset</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-
-
-
-<p> Likewise, in higher dimensions, the last dimension specified is the 
-    fastest changing on disk. So if we have a four dimensional dataset A, 
-    then the first element on disk would be A[0][0][0][0], the 
-    second A[0][0][0][1], the third A[0][0][0][2], and so on.</p>
-
-<h3>11.2.3. Chunking and Partial I/O</h3>
-
-<p> The issues outlined above regarding data storage order help to 
-    illustrate one of the major benefits of dataset chunking, its 
-    ability to improve the performance of partial I/O. Partial I/O 
-    is an I/O operation (read or write) which operates on only one 
-    part of the dataset. To maximize the performance of partial I/O, 
-    the data elements selected for I/O must be contiguous on disk. 
-    As we saw above, with a contiguous dataset, this means that the 
-    selection must always equal the extent in all but the slowest 
-    changing dimension, unless the selection in the slowest changing 
-    dimension is a single element. With a 2-d dataset in C, this 
-    means that the selection must be as wide as the entire dataset 
-    unless only a single row is selected. With a 3-d dataset, this 
-    means that the selection must be as wide and as deep as the 
-    entire dataset, unless only a single row is selected, in which 
-    case it must still be as deep as the entire dataset, unless 
-    only a single column is also selected.</p>
-  
-<p> Chunking allows the user to modify the conditions for maximum 
-    performance by changing the regions in the dataset which are 
-    contiguous. For example, reading a 20x20 selection in a contiguous 
-    dataset with a width greater than 20 would require 20 separate 
-    and non-contiguous read operations. If the same operation were 
-    performed on a dataset that was created with a chunk size of 
-    20x20, the operation would require only a single read operation. 
-    In general, if your selections are always the same size (or 
-    multiples of the same size), and start at multiples of that 
-    size, then the chunk size should be set to the selection size, 
-    or an integer divisor of it. This recommendation is subject to 
-    the guidelines in the <em>pitfalls</em> section; specifically, 
-    it should not be too small or too large.</p>
-  
-<p> Using this strategy, we can greatly improve the performance of the 
-    operation shown in figure 4. If we create the dataset with a chunk 
-    size of 10x1, each column of the dataset will be stored separately 
-    and contiguously. The read of a partial column can then be done is 
-    a single operation. This is illustrated in figure 5, and the code 
-    to implement a similar operation is shown in example 2. For 
-    simplicity, example 2 implements writing to this dataset instead 
-    of reading from it.</p>
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <br />
-        <img src="Images/ChunkingFig005.png">
-        <br /><br />
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 5. Reading part of a column from a chunked dataset</b>
-        <hr color="green" size="3"/></td></tr>
-</table>
-<br />
-<br />
-
-
-
-    
-<!-- NEW PAGE -->
-<!-- PRINT VERSION CONTINUED --
-    
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="left">
-        <hr color="green" size="3"/>
-        <pre>
-#include <hdf5.h>
-int main(void) {
-    hid_t   file_id, dset_id, fspace_id, mspace_id, dcpl_id;
-    hsize_t chunk_dims[2] = {10, 1};
-    hsize_t dset_dims[2] = {10, 10};
-    hsize_t mem_dims[1] = {5};
-    hsize_t start[2] = {3, 2};
-    hsize_t count[2] = {5, 1};
-    int     buffer[5];
-
-    /* Create the file */
-    file_id = H5Fcreate(<em>file.h5</em>, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-
-    /* Create a dataset creation property list and set it to use chunking
-    * with a chunk size of 10x1 */
-    dcpl_id = H5Pcreate(H5P_DATASET_CREATE);
-    H5Pset_chunk(dcpl_id, 2, chunk_dims);
-
-    /* Create the dataspace and the chunked dataset */
-    space_id = H5Screate_simple(2, dset_dims, NULL);
-    dset_id = H5Dcreate(file, <em>dataset</em>, H5T_NATIVE_INT, space_id, dcpl_id, 
-H5P_DEFAULT);
-
-    /* Select the elements from 3, 2 to 7, 2 */
-    H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, start, NULL, count, NULL);
-
-    /* Create the memory dataspace */
-    mspace_id = H5Screate_simple(1, mem_dims, NULL);
-
-    /* Write to the dataset */
-    buffer = <initialize buffer>
-    H5Dwrite(dset_id, H5T_NATIVE_INT, mspace_id, fpsace_id, H5P_DEFAULT, buffer);
-
-    /* Close */
-    H5Dclose(dset_id);
-    H5Sclose(fspace_id);
-    H5Sclose(mspace_id);
-    H5Pclose(dcpl_id);
-    H5Fclose(file_id);
-    return 0;
-}</pre></td>
-        </tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left">
-        <b>Example 2. Writing part of a column to a chunked dataset</b>
-        <hr color="green" size="3"/></td>
-        </tr>
-</table>
-<br />
-    
-
-
-
-<h3>11.2.4. Chunk Caching</h3>
-
-<p> Another major feature of the dataset chunking scheme is the chunk 
-    cache.  As it sounds, this is a cache of the chunks in the dataset. 
-    This cache can greatly improve performance whenever the same chunks 
-    are read from or written to multiple times, by preventing the 
-    library from having to read from and write to disk multiple times. 
-    However, the current implementation of the chunk cache does not adjust 
-    its parameters automatically, and therefore the parameters must be 
-    adjusted manually to achieve optimal performance. In some rare 
-    cases it may be best to completely disable the chunk caching scheme. 
-    Each open dataset has its own chunk cache, which is separate from 
-    the caches for all other open datasets.</p>
-  
-<p> When a selection is read from a chunked dataset, the chunks containing 
-    the selection are first read into the cache, and then the selected 
-    parts of those chunks are copied into the user's buffer. The cached 
-    chunks stay in the cache until they are evicted, which typically 
-    occurs because more space is needed in the cache for new chunks, 
-    but they can also be evicted if hash values collide (more on this 
-    later). Once the chunk is evicted it is written to disk if necessary 
-    and freed from memory.</p>
-  
-<p> This process is illustrated in figures 6 and 7. In figure 6, the 
-    application requests a row of values, and the library responds by 
-    bringing the chunks containing that row into cache, and retrieving 
-    the values from cache. In figure 7, the application requests a 
-    different row that is covered by the same chunks, and the library 
-    retrieves the values directly from cache without touching the disk.</p>
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <br />
-        <img src="Images/ChunkingFig006.png">
-        <br /><br />
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 6. Reading a row from a chunked dataset with the 
-        chunk cache enabled</b>
-        <hr color="green" size="3"/></td></tr>
-    </table>
-<br />
-<br />
-
-
-<table width="600" cellspacing="0" align="center">
-    <tr valign="top"> 
-        <td align="center">
-        <hr color="green" size="3"/>
-        <br />
-        <img src="Images/ChunkingFig007.png" alt="Illustration of chunk 
-        caching and a row of a chunked dataset with the chunks already 
-        in the cache">
-        <br /><br />
-        </td></tr>
-    <tr><td><hr color="green" size="1" /></td></tr>
-    <tr valign="top">
-        <td align="left" >
-        <b>Figure 7. Reading a row from a chunked dataset with the 
-        chunks already cached</b>
-        <hr color="green" size="3"/></td></tr>
-</table>
-<br />
-<br />
-
-
-
-
-  
-<p> In order to allow the chunks to be looked up quickly in cache, each 
-    chunk is assigned a unique hash value that is used to look up the 
-    chunk. The cache contains a simple array of pointers to chunks, 
-    which is called a hash table. A chunk's hash value is simply the 
-    index into the hash table of the pointer to that chunk. While the 
-    pointer at this location might instead point to a different chunk 
-    or to nothing at all, no other locations in the hash table can 
-    contain a pointer to the chunk in question. Therefore, the library 
-    only has to check this one location in the hash table to tell if a 
-    chunk is in cache or not. This also means that if two or more 
-    chunks share the same hash value, then only one of those chunks can 
-    be in the cache at the same time. When a chunk is brought into 
-    cache and another chunk with the same hash value is already in 
-    cache, the second chunk must be evicted first. Therefore it is 
-    very important to make sure that the size of the hash table, also 
-    called the nslots parameter in <code>H5Pset_cache</code> and 
-    <code>H5Pset_chunk_cache</code>, is large enough to minimize the 
-    number of hash value collisions.</p>
-  
-<p> To determine the hash value for a chunk, the chunk is first assigned 
-    a unique index that is the linear index into a hypothetical array of 
-    the chunks. That is, the upper-left chunk has an index of 0, the one 
-    to the right of that has an index of 1, and so on. This index is 
-    then divided by the size of the hash table, nslots, and the 
-    remainder, or modulus, is the hash value. Because this scheme can 
-    result in regularly spaced indices being used frequently, it is 
-    important that nslots be a prime number to minimize the chance 
-    of collisions. In general, nslots should probably be set to a 
-    number approximately 100 times the number of chunks that can fit 
-    in nbytes bytes, unless memory is extremely limited. There is of 
-    course no advantage in setting nslots to a number larger than 
-    the total number of chunks in the dataset.</p>
-  
-<p> The w0 parameter affects how the library decides which chunk to 
-    evict when it needs room in the cache. If w0 is set to 0, then 
-    the library will always evict the least recently used chunk in 
-    cache. If w0 is set to 1, the library will always evict the least 
-    recently used chunk which has been fully read or written, and if 
-    none have been fully read or written, it will evict the least 
-    recently used chunk. If w0 is between 0 and 1, the behaviour will 
-    be a blend of the two. Therefore, if the application will access 
-    the same data more than once, w0 should be set closer to 0, and 
-    if the application does not, w0 should be set closer to 1.</p>
-  
-<p> It is important to remember that chunk caching will only give a 
-    benefit when reading or writing the same chunk more than once. 
-    If, for example, an application is reading an entire dataset, 
-    with only whole chunks selected for each operation, then chunk 
-    caching will not help performance, and it may be preferable to 
-    completely disable the chunk cache in order to save memory. It 
-    may also be advantageous to disable the chunk cache when writing 
-    small amounts to many different chunks, if memory is not large 
-    enough to hold all those chunks in cache at once.</p>
-
-<h3>11.2.5. I/O Filters and Compression</h3>
-
-<p> Dataset chunking also enables the use of I/O filters, including 
-    compression. The filters are applied to each chunk individually, 
-    and the entire chunk is processed at once. The filter must be 
-    applied every time the chunk is loaded into cache, and every 
-    time the chunk is flushed to disk. These facts all make choosing 
-    the proper settings for the chunk cache and chunk size even 
-    more critical for the performance of filtered datasets.</p>
-  
-<p> Because the entire chunk must be filtered every time disk I/O 
-    occurs, it is no longer a viable option to disable the chunk 
-    cache when writing small amounts of data to many different chunks. 
-    To achieve acceptable performance, it is critical to minimize the 
-    chance that a chunk will be flushed from cache before it is 
-    completely read or written. This can be done by increasing the 
-    size of the chunk cache, adjusting the size of the chunks, or 
-    adjusting I/O patterns.</p>
-
-<h3>11.2.6. Pitfalls</h3>
-
-<p> Inappropriate chunk size and cache settings can dramatically reduce 
-    performance. There are a number of ways this can happen. Some of 
-    the more common issues include:
-
-<ul>
-    <li>Chunks are too small</li>
-      <p> There is a certain amount of overhead associated with finding 
-          chunks. When chunks are made smaller, there are more of them 
-          in the dataset. When performing I/O on a dataset, if there 
-          are many chunks in the selection, it will take extra time 
-          to look up each chunk. In addition, since the chunks are 
-          stored independently, more chunks results in more I/O 
-          operations, further compounding the issue. The extra metadata 
-          needed to locate the chunks also causes the file size to 
-          increase as chunks are made smaller. Making chunks larger 
-          results in fewer chunk lookups, smaller file size, and 
-          fewer I/O operations in most cases.</p>
-    <li>Chunks are too large</li>
-      <p> It may be tempting to simply set the chunk size to be the 
-          same as the dataset size in order to enable compression on 
-          a <em>contiguous</em> dataset. However, this can have 
-          unintended consequences. Because the entire chunk must be 
-          read from disk and decompressed before performing any 
-          operations, this will impose a great performance penalty 
-          when operating on a small subset of the dataset if the cache 
-          is not large enough to hold the one-chunk dataset. In 
-          addition, if the dataset is large enough, since the entire 
-          chunk must be held in memory while compressing and decompressing, 
-          the operation could cause the operating system to page memory 
-          to disk, slowing down the entire system.</p>
-    <li>Cache is not big enough</li>
-      <p> Similarly, if the chunk cache is not set to a large enough 
-          size for the chunk size and access pattern, poor performance 
-          will result. In general, the chunk cache should be large 
-          enough to fit all of the chunks that contain part of a 
-          hyperslab selection used to read or write. When the chunk 
-          cache is not large enough, all of the chunks in the selection 
-          will be read into cache and then written to disk (if writing) 
-          and evicted. If the application then revisits the same 
-          chunks, they will have to be read and possibly written 
-          again, whereas if the cache were large enough they would 
-          only have to be read (and possibly written) once. However, 
-          if selections for I/O always coincide with chunk boundaries, 
-          this does not matter as much, as there is no wasted I/O and 
-          the application is unlikely to revisit the same chunks soon 
-          after.</p>
-      <p> If the total size of the chunks involved in a selection is too 
-          big to practically fit into memory, and neither the chunk nor 
-          the selection can be resized or reshaped, it may be better to 
-          disable the chunk cache. Whether this is better depends on the 
-          storage order of the selected elements. It will also make 
-          little difference if the dataset is filtered, as entire chunks 
-          must be brought into memory anyways in that case. When the 
-          chunk cache is disabled and there are no filters, all I/O is 
-          done directly to and from the disk. If the selection is mostly 
-          along the fastest changing dimension (i.e. rows), then the 
-          data will be more contiguous on disk, and direct I/O will be 
-          more efficient than reading entire chunks, and hence the 
-          cache should be disabled. If however the selection is mostly 
-          along the slowest changing dimension (columns), then the 
-          data will not be contiguous on disk, and direct I/O will 
-          involve a large number of small operations, and it will 
-          probably be more efficient to just operate on the entire 
-          chunk, therefore the cache should be set large enough to 
-          hold at least 1 chunk. To disable the chunk cache, either 
-          nbytes or nslots should be set to 0.</p>
-    <li>Improper hash table size</li>
-      <p> Because only one chunk can be present in each slot of the hash 
-          table, it is possible for an improperly set hash table size 
-          (nslots) to severely impact performance. For example, if 
-          there are 100 columns of chunks in a dataset, and the hash 
-          table size is set to 100, then all the chunks in each row 
-          will have the same hash value. Attempting to access a row 
-          of elements will result in each chunk being brought into 
-          cache and then evicted to allow the next one to occupy its 
-          slot in the hash table, even if the chunk cache is large 
-          enough, in terms of nbytes, to hold all of them. Similar 
-          situations can arise when nslots is a factor or multiple of 
-          the number of rows of chunks, or equivalent situations in 
-          higher dimensions.</p>
-      <p> Luckily, because each slot in the hash table only occupies 
-          the size of the pointer for the system, usually 4 or 8 
-          bytes, there is little reason to keep nslots small. Again, 
-          a general rule is that nslots should be set to a prime 
-          number at least 100 times the number of chunks that can 
-          fit in nbytes, or simply set to the number of chunks in 
-          the dataset.</p>
-    </ul>
-
-<h3>11.2.7. For More Information</h3>
-
-<!--
----------1---------2---------3---------4---------5---------6---------7---------8
--->
-<!-- the pdf mentioned in the paragraph below is not available to print 
-readers (ie, it's not on the web site)
-<p> The slide set “
-<a href="../_topic/Chunking/Chunking_Tutorial_EOS13_2009.pdf">HDF5 
-    Advanced Topics: Chunking in HDF5</a>” (PDF), a tutorial from 
-    HDF and HDF-EOS Workshop XIII (2009) provides additional HDF5 chunking 
-    use cases and examples.</p>
--->
-
-<!-- FOR USE WITH ELECTRONIC VERSION ---------------------------------
-<!-- 11.18.10, the paragraph below is labeled for the electronic version,
-but it doesn't seem to work with the electronic page. I'm keeping this 
-paragraph commented out. --
-<p> The page “<a href=
-    "http://www.hdfgroup.org/HDF5/examples/api18-c.html">
-    HDF5 Examples by API</a>” lists many code examples that are 
-    regularly tested with the HDF5 Library.  Several illustrate the 
-    use of chunking in HDF5, particularly “Read/Write Chunked 
-    Dataset” and any examples demonstrating filters. </p>
-<!-- FOR USE WITH ELECTRONIC VERSION --------------------------------->
-
-<!-- FOR USE WITH PRINT VERSION -------------------------------------->
-<!-- PRINT VERSION CONTINUED --
-<p> The “HDF5 Examples by API” page, 
-    <code>
-    http:/www.hdfgroup.org/ftp/HDF5/examples/examples-by-api/api18-c.html,
-    </code> 
-    lists many code examples that are regularly tested with the HDF5 
-    Library. Several illustrate the use of chunking in HDF5, particularly 
-    “Read/Write Chunked Dataset” and any examples 
-    demonstrating filters. </p>
-
-
-
-<!-- FOR USE WITH PRINT VERSION --------------------------------------
-
-
-
-<!-- FOR USE WITH ELECTRONIC VERSION --------------------------------->
-<!-- 11.19.10, section 11.2.8. is labeled for the electronic version, 
-but doesn't seem to be appropriate for the page. I'm leaving it commented 
-out. --
-<!-- 
-<h3>11.2.8. Directions for Future Development</h3>
-
-  As seen above, the HDF5 chunk cache currently requires careful control of the 
-  parameters in order to achieve optimal performance. In the future, we plan to 
-  improve the chunk cache to be more foolproof in many ways, and deliver acceptable 
-  performance in most cases even when no thought is given to the chunking parameters.
-  <p>
-  One way to make the chunk cache more user-friendly is to automatically resize the 
-  chunk cache as needed for each operation. The cache should be able to detect when 
-  the cache should be skipped or when it needs to be enlarged based on the pattern of 
-  I/O operations. At a minimum, it should be able to detect when the cache would 
-  severely hurt performance for a single operation and disable the cache for that 
-  operation. This would of course be optional.
-  <p>
-  Another way is to allow chaining of entries in the hash table. This would make the 
-  hash table size much less of an issue, as chunks could shared the same hash value 
-  by making a linked list.
-  <p>
-  Finally, it may even be desirable to set some reasonable default chunk size based 
-  on the dataset size and possibly some other information on the intended access 
-  pattern. This would probably be a high-level routine.
-  <p>
-  Other features planned for chunking include new index methods (besides b-trees), 
-  disabling filters for chunks that are partially over the edge of a dataset, only 
-  storing the used portions of these edge chunks, and allowing multiple reader 
-  processes to read the same dataset as a single writer process writes to it.
-
-<div align="right">
-<table>
-    <tr><td align="top" valign="left">
-        <font size="6" color="AAAAAA">DRAFT    </font>
-    </td><td align="top" valign="left">
-        <i>Chunking in HDF5</i> is under active development. Please 
-        send comments, suggestions, and bug reports to 
-        fbaker-at-hdfgroup.org.
-    </td></tr>
-</table>
-</div>
--->
-
-<!-- FOR USE WITH ELECTRONIC VERSION --------------------------------->
-<!-- PRINT VERSION CONTINUED --
-<br />
-<!-- NEW PAGE -->
-<!-- PRINT VERSION CONTINUED --
-<h2>11.3. HDF5 Glossary and Terms</h2>
-
-
-<dl>
-
-<dt><strong><a name="Glossary-AtomicDType">atomic datatype</a></strong></dt>
-    <dd>A datatype which cannot be decomposed into smaller units at the 
-       API level. </dd>
-<br />
-
-<dt><a name="Glossary-Attribute"><b>attribute</b></a></dt>
-<dd>A small dataset that can be used to describe the nature and/or 
-    the intended usage of the object it is attached to.</dd>
-<br />
-
-<!--
-<dt><strong><a name="Glossary-Basic">basic datatypes</a></strong></dt>
-    <ul>
-        <li>char     - 8-bit character (only for ASCII information)</li>
-        <li>int8     - 8-bit signed integer</li>
-        <li>uint8    - 8-bit unsigned integer</li>
-        <li>int16    - 16-bit signed integer</li>
-        <li>uint16   - 16-bit unsigned integer</li>
-        <li>int32    - 32-bit signed integer</li>
-        <li>uint32   - 32-bit unsigned integer</li>
-        <li>intn     - "native" signed integer</li>
-        <li>uintn    - "native" unsigned integer</li>
-        <li>int64    - 64-bit signed integer (new)</li>
-        <li>uint64   - 64-bit unsigned integer (new)</li>
-        <li>float32  - 32-bit IEEE float</li>
-        <li>float64  - 64-bit IEEE float</li>
-    </ul>
-<br />
--->
-<!-- PRINT VERSION CONTINUED --
-<dt><strong><a name="Glossary-LayoutChunked">chunked layout</a></strong></dt>
-<dd>The storage layout of a chunked dataset.</dd>
-<br />
-
-<dt><strong><a name="Glossary-Chunking">chunking</a></strong></dt>
-<dd>A storage layout where a dataset is partitioned into fixed-size 
-    multi-dimensional chunks.  Chunking tends to improve performance
-    and facilitates dataset extensibility.</dd>
-<br />
-
-<dt><strong><a name="Glossary-DTypeCommitted">committed datatype</a></strong></dt>
-<dd>A datatype that is named and stored in a file so that it can be shared. 
-    Committed datatypes can be shared. Committing is permanent; a datatype 
-    cannot be changed after being committed. Committed datatypes used to be 
-    called <a name="Glossary-DTypeNamed">named</a> datatypes.</dd>
-<br />
-
-<dt><strong><a name="Glossary-CompoundDType">compound datatype</a></strong></dt>
-<dd>A collection of one or more atomic types or small arrays of such types.
-    Similar to a struct in C or a common block in Fortran.</dd>
-<br />
-
-<!--
-<dt><strong><a name="Glossary-ComplexDType">complex datatype</a></strong></dt>
-<dd>A collection of one or more atomic types or small arrays of such types.
-    <ul>
-        <li>hid_t   - 32-bit unsigned integer used as ID for memory objects</li>
-        <li>hoid_t  - 32-bit unsigned integer (currently) used as ID for 
-            disk-based objects</li>
-        <li>hbool_t - boolean to indicate true/false/error codes from functions</li>
-        <li>herr_t  - 32-bit integer to indicate succeed/fail codes from 
-            functions</li>
-    </ul></dd>
-<br />
--->
-<!-- PRINT VERSION CONTINUED --
-<dt><strong><a name="Glossary-LayoutContig">contiguous layout</a></strong></dt>
-<dd>The storage layout of a dataset that is not chunked, so that the entire
-    data portion of the dataset is stored in a single contiguous block.</dd>
-<br />
-
-<dt><b><a name="Glossary-PListDataTransfer">data transfer property list</a></b></dt>
-<dd>The data transfer property list is used to control various aspects 
-    of the I/O, such as caching hints or collective I/O information.</dd>
-<br />
-
-<dt><b><a name="Glossary-Dataset">dataset</a></b></dt>
-<dd>A multi-dimensional array of data elements, together with 
-    supporting metadata. </dd>
-<br />
-
-
-<dt><b><a name="Glossary-PListDSetAccess">dataset access property list</a></b></dt>
-<dd>A property list containing information on how a dataset is to be accessed.</dd>
-<br />
-
-<dt><b><a name="Glossary-PListDSetCreate">dataset creation property list</a></b></dt>
-<dd>A property list containing information on how 
-    raw data is organized on disk and how the raw data is compressed.</dd>
-<!--
-    The dataset API partitions these terms by layout, compression,
-    and external storage:
-    <ul>
-    <b> Layout:</b>
-    <ul>
-    <li>H5D_COMPACT: Data is small and can be stored in object header (not
-        implemented yet).  This eliminates disk seek/read requests.</li>
-    <li>H5D_CONTIGUOUS: (<b>default</b>) The data is large, non-extendible, 
-        non-compressible, non-sparse, and can be stored externally.</li>
-    <li>H5D_CHUNKED:  The data is large and can be extended in any dimension.
-        It is partitioned into chunks so each chunk is the same logical size. </li>
-    </ul>
-    <b>Compression:</b>  (gzip compression)<br />
-    <b>External Storage Properties:</b>  The data must be contiguous to be 
-       stored externally. It allows you to store 
-       the data in one or more non-HDF5 files.
-    </ul>
--->
-<!-- PRINT VERSION CONTINUED --
-<br />
-
-<dt><b><a name="Glossary-Dataspace">dataspace</a></b></dt>
-<dd>An object that describes the dimensionality of the data array. 
-    A dataspace is either a regular N-dimensional array of data points, 
-    called a simple dataspace, or a more general collection of data points 
-    organized in another manner, called a complex dataspace.</dd>
-<br />
-<!-- NEW PAGE -->
-<!-- PRINT VERSION CONTINUED --
-<dt><b><a name="Glossary-Datatype">datatype</a></b></dt>
-<dd>An object that describes the storage format of the individual data 
-    points of a data set.
-    There are two categories of datatypes: atomic and compound datatypes.
-    An atomic type is a type which cannot be decomposed into smaller 
-    units at the API level. A compound datatype is a collection of one or 
-    more atomic types or small arrays of such types.</dd>
-<br />
-
-<!--
-<dt><b>DDL</b></dt>
-<dd>A detailed description of the HDF5 format and objects, written in a 
-    Data Description Language using Backus-Naur Form.
-<br />
--->
-
-<!--
-<dt><strong><a name="Glossary-DiskIO">disk I/O datatypes</a></strong></dt>
-<ul>
-    <li>hoff_t  - (64-bit?) offset on disk in bytes</li>
-    <li>hlen_t  - (64-bit?) length on disk in bytes</li>
-</ul>
-<br />
--->
-<!-- PRINT VERSION CONTINUED --
-<dt><strong><a name="Glossary-DTypeEnum">enumeration datatype</a></strong></dt>
-<dd>A one-to-one mapping between a set of symbols and a set of 
-    integer values, and an order is imposed on the symbols by their 
-    integer values. The symbols are passed between the application 
-    and library as character strings and all the values for a 
-    particular enumeration datatype are of the same integer type, 
-    which is not necessarily a native type.</dd>
-<br />
-
-<dt><b><a name="Glossary-File">file</a></b></dt>
-<dd>A container for storing grouped collections of 
-    multi-dimensional arrays containing scientific data. </dd>
-<br />
-
-<dt><b><a name="Glossary-FileAccessMode">file access mode</a></b></dt>
-<dd>Determines whether an existing file will be overwritten,
-    opened for read-only access, or opened for read/write access.  
-    All newly created files are opened for both reading and
-    writing.  </dd>
-<!--
-    Possible values are:
-    <PRE>
-      H5F_ACC_RDWR:   Allow read and write access to file. 
-      H5F_ACC_RDONLY: Allow read-only access to file. 
-      H5F_ACC_TRUNC:  Truncate file, if it already exists, erasing all data 
-                      previously stored in the file. 
-      H5F_ACC_EXCL:   Fail if file already exists. 
-      H5F_ACC_DEBUG:  Print debug information. 
-      H5P_DEFAULT:    Apply default file access and creation properties. 
-    </PRE>
--->
-<!-- PRINT VERSION CONTINUED --
-<br />
-
-<dt><b><a name="Glossary-PListFileAccess">file access property list</a></b></dt>
-<dd>File access property lists are used to control different methods 
-    of performing I/O on files.</dd>
-<!--
-    <ul>
-    <b>Unbuffered I/O:</b> Local permanent files can be accessed with the 
-       functions described in Section 2 of the Posix manual, namely open(), 
-       lseek(), read(), write(), and close(). <br />
-    <b>Buffered I/O:</b> Local permanent files can be accessed with the 
-       functions declared in the stdio.h header file, namely fopen(), 
-       fseek(), fread(), fwrite(), and fclose().<br />
-    <b>Memory I/O:</b> Local temporary files can be created and accessed 
-       directly from memory without ever creating permanent storage. 
-       The library uses malloc() and free() to create storage space for the 
-       file<br />
-    <b>Parallel Files using MPI I/O:</b> This driver allows parallel access 
-       to a file through the MPI I/O library. The parameters which can be 
-       modified are the MPI communicator, the info object, and the access mode.
-       The communicator and info object are saved and then passed to 
-       MPI_File_open() during file creation or open. The access_mode 
-       controls the kind of parallel access the application intends.<br /> 
-    <b>Data Alignment:</b> Sometimes file access is faster if certain things 
-       are aligned on file blocks. This can be controlled by setting alignment
-       properties of a file access property list with the H5Pset_alignment() 
-       function. 
-    </ul>
--->
-<!-- PRINT VERSION CONTINUED --
-<br />
-
-<dt><b><a name="Glossary-PListFileCreate">file creation property list</a></b></dt>
-<dd>The property list used to control file metadata. </dd>
-<!--
-    The parameters that can be modified are:
-    <ul>
-    <b>User-Block Size:</b> The "user-block" is a fixed length block 
-       of data located at the beginning of the file which is ignored 
-       by the HDF5 library and may be used to store any data information 
-       found to be useful to applications. 
-    <br />
-    <b>Offset and Length Sizes:</b> The number of bytes used to store the
-       offset and length of objects in the HDF5 file can be controlled 
-       with this parameter. 
-    <br />
-    <b>Symbol Table Parameters:</b> The size of symbol table B-trees can 
-       be controlled by setting the 1/2 rank and 1/2 node size 
-       parameters of the B-tree. 
-    <br />
-    <b>Indexed Storage Parameters:</b> The size of indexed storage 
-       B-trees can be controlled by setting the 1/2 rank and 1/2 node 
-       size parameters of the B-tree.
-    </ul>
--->
-<!-- PRINT VERSION CONTINUED --
-<br />
-
-<dt><b><a name="Glossary-Group">group</a></b></dt>
-<dd>A structure containing zero or more HDF5 objects, 
-    together with supporting metadata. 
-    The two primary HDF5 objects are datasets and groups.</dd>
-<br />
-
-<dt><strong><a name="Glossary-LinkHard">hard link</a></strong></dt>
-<dd>A direct association between a name and the object where both exist 
-    in a single HDF5 address space.</dd>
-<br />
-
-<!--
-<dt><b>HDF5</b> </dt>
-<dd>HDF5 is an abbreviation for Hierarchical Data Format Version 5. 
-    This file format is intended to make it easy to write and read 
-    scientific data
-    <br />
-    <ul>
-    <li>by including the information needed to understand the data 
-        within the file</li>
-    <br />
-    <li>by providing a library of C, FORTRAN, and other language 
-        programs that reduce the work required to provide efficient 
-        writing and reading - even with parallel IO</li>
-    </ul></dd>
-<br />
--->
-<!-- PRINT VERSION CONTINUED --
-
-<dt><b><a name="Glossary-Hyperslab">hyperslab</a></b></dt>
-<dd>A portion of a dataset. A hyperslab selection can be a 
-    logically contiguous collection of points in a dataspace or
-    a regular pattern of points or blocks in a dataspace. </dd>
-<br />
-
-<dt><strong><a name="Glossary-Identifier">identifier</a></strong></dt>
-<dd>A unique entity provided by the HDF5 library and used to access
-    an HDF5 object such as a file, group, or dataset. In the past, 
-    an identifier might have been called a handle.</dd>
-<br />
-
-<dt><strong><a name="Glossary-Link">link</a></strong></dt>
-<dd>An association between a name and the object in an HDF5 file group.</dd>
-<br />
-
-<dt><strong><a name="Glossary-GroupMember">member</a></strong></dt>
-<dd>A group or dataset that is in another dataset, <i>dataset A</i>,
-    is a member of <i>dataset A</i>.</dd>
-<br />
-
-<dt><b><a name="Glossary-Name">name</a></b></dt>
-<dd>A slash-separated list of components that uniquely identifies an 
-    element of an HDF5 file.  A name begins that begins with a slash 
-    is an absolute name which is accessed beginning with the root group 
-    of the file; all other names are relative names and the associated
-    objects are accessed beginning with the current or specified group.</dd>
-<br />
-
-<dt><strong><a name="Glossary-DTypeOpaque">opaque datatype</a></strong></dt>
-<dd>A mechanism for describing data which cannot be otherwise described 
-    by HDF5. The only properties associated with opaque types are a 
-    size in bytes and an ASCII tag.</dd>
-<br />
-
-<!--
-<dt><b>parallel I/O HDF5</b></dt>
-<dd>The parallel I/O version of HDF5 supports parallel file access using 
-    MPI (Message Passing Interface).  </dd>
-<br /> 
--->
-<!-- PRINT VERSION CONTINUED --
-<dt><strong><a name="Glossary-Path">path</a></strong></dt>
-<dd>The slash-separated list of components that forms the name 
-    uniquely identifying an element of an HDF5 file.</dd>
-<br />
-
-<dt><strong><a name="Glossary-PList">property list</a></strong></dt>
-<dd>A collection of name/value pairs that can be passed to other 
-    HDF5 functions to control features that are typically unimportant 
-    or whose default values are usually used. </dd>
-<br />
-
-<dt><strong><a name="Glossary-RootGroup">root group</a></strong></dt>
-<dd>The group that is the entry point to the group graph in an HDF5 file.
-    Every HDF5 file has exactly one root group.</dd>
-<br />
-
-<dt><strong><a name="Glossary-Selection">selection</a></strong></dt>
-<dd>(1) A subset of a dataset or a dataspace, up to the entire dataset or 
-    dataspace.
-    (2) The elements of an array or dataset that are marked for I/O.</dd>
-<br />
-
-<dt><strong><a name="Glossary-Serialization">serialization</a></strong></dt>
-<dd>The flattening of an <em>N</em>-dimensional data object into a 
-    1-dimensional object so that, for example, the data object can be 
-    transmitted over the network as a 1-dimensional bitstream.</dd>
-<br />
-
-<dt><strong><a name="Glossary-LinkSoft">soft link</a></strong></dt>
-<dd>An indirect association between a name and an object in an 
-    HDF5 file group.</dd>
-<br />
-
-<dt><strong><a name="Glossary-StorageLayout">storage layout</a></strong></dt>
-<dd>The manner in which a dataset is stored, either contiguous or
-    chunked, in the HDF5 file.</dd>
-<br />
-
-<dt><b><a name="Glossary-SuperBlock">super block</a></b></dt>
-<dd>A block of data containing the information required to portably access 
-    HDF5 files on multiple platforms, followed by information about the groups 
-    and datasets in the file. 
-    The super block contains information about the size of offsets, 
-    lengths of objects, the number of entries in group tables,
-    and additional version information for the file. </dd>
-<br />
-
-<!--
-<dt><b>threadsafe</b></dt>
-<dd>A "thread-safe" version of HDF-5 (TSHDF5) is one that can be called 
-    from any thread of a multi-threaded program. Any calls to HDF
-    can be made in any order, and each individual HDF call will perform 
-    correctly. A calling program does not have to explicitly lock the HDF
-    library in order to do I/O. Applications programmers may assume that 
-    the TSHDF5 guarantees the following: 
-    <ul>
-        <li>the HDF-5 library does not create or destroy threads. </li>
-        <li>the HDF-5 library uses modest amounts of per-thread 
-          private memory. </li>
-        <li>the HDF-5 library only locks/unlocks it's own locks (no locks 
-          are passed in or returned from HDF), and the internal locking 
-          is guaranteed to be deadlock free. </li>
-    </ul>
-    <br />
-    These properties mean that the TSHDF5 library will not interfere 
-    with an application's use of threads. A TSHDF5 library is the same
-    library as regular HDF-5 library, with additional code to synchronize 
-    access to the HDF-5 library's internal data structures. </dd>
-<br />
--->
-<!-- PRINT VERSION CONTINUED --
-<dt><strong><a name="Glossary-DTypeVLen">variable-length datatype</a></strong></dt>
-<dd>A sequence of an existing datatype (atomic, variable-length (VL), 
-    or compound) which are not fixed in length from one dataset location 
-    to another.</dd>
-<br />
-
-</dl>
-
-<!-- FOR USE WITH PRINT VERSION -------------------------------------->
-
-</body>
-</html>
-
diff --git a/html/UG/OldHtmlSource/99_SelectedPassages.html b/html/UG/OldHtmlSource/99_SelectedPassages.html
deleted file mode 100644
index 77ffc3a..0000000
--- a/html/UG/OldHtmlSource/99_SelectedPassages.html
+++ /dev/null
@@ -1,114 +0,0 @@
-<!doctype HTML public "-//W3C//DTD HTML 4.0 Frameset//EN">
-<html>
-<head>
-
-<title>HDF5 User's Guide: Selected/Archived Passages</title>
-
-<!--(Meta)==========================================================-->
-
-
-<!--(Links)=========================================================-->
-
-<link href="styles_NewUG.css" rel="stylesheet" type="text/css">
-
-<!--( Begin styles definition )=====================================-->
-<!--     Replaced with external stylesheet 'styles_NewUG.css'.      -->
-<!--( End styles definition )=======================================-->
-
-</head>
-
-
-<body>
-
-<!-- HEADER LEFT "HDF5 User's Guide" -->
-<!-- HEADER RIGHT "HDF5 Attributes" -->
-
-
-<!-- editingComment
-  <span class="editingComment">[ [ [
-  ] ] ]</span>
--->
-
-<!-- editingComment
--->
-
-<div align="center">
-<a name="TOP">
-<h2>Not a Chapter<br><font size="7">Selected/Archived Passages</font></h2>
-</a>
-</div>
-
-These passages are saved in case they prove useful in contexts other than 
-from whence they came.
-
-
-<hr>
-<a name="Intro">
-<h3>For the "Mapping Memory <--> Storage" discussion</h3>
-</a>
-
-
-  Several sample cases of 
-  selection reading/writing are shown in Figure 18.
-<!-- editingComment
-  <span class="editingComment">
-  See Chapter ?? for more information about selections.</p>
-  </span>
--->
-  
-<table x-use-null-cells
-		width=300
-		cellspacing=0
-                class="fullImgTable"
-		align="center">
-  <tr valign=top> 
-    <td class="fullImgTableImgCell" align="center">
-      <h4><font style="bold">File dataspace <br> and selection</font></h4>
-	</td>
-	<td class="fullImgTableImgCell" align="center">
-	  <h4><font style="bold">Memory dataspace <br> and selection</font></h4>
-	</td>
-  </tr>
-  <tr valign="top">
-    <td colspan="2"><hr></td>
-  </tr>
-  <tr valign=top>
-	<td class="fullImgTableImgCell" align="center" colspan="2">   
-    <img src="Images/Dmodel_fig18_a.JPG"><br>
-    <img src="Images/Dmodel_fig18_b.JPG"><br>
-    <img src="Images/Dmodel_fig18_c.JPG"><br>
-    <img src="Images/Dmodel_fig18_d.JPG"><br>
-    <img src="Images/Dmodel_fig18_e.JPG"><br>
-    </td>
-  </tr>
-  <tr> 
-    <td align=center class="fullImgTableCapCell" colspan="2"> 
-      <span class=figurenumber>Figure 18: 
-      Mappings between file dataspaces and selections and 
-      memory dataspaces and selections</span>
-	</td>
-  </tr>
-</table>
-
-
-<hr>
-<a name="Intro">
-<h3>For the "_______________________________" discussion</h3>
-</a>
-
-
-
-<hr>
-<a name="Intro">
-<h3>For the "_______________________________" discussion</h3>
-</a>
-
-
-
-<hr>
-
-
- 
-
-</body>
-</html>
diff --git a/html/UG/OldHtmlSource/H5_newUG.book b/html/UG/OldHtmlSource/H5_newUG.book
deleted file mode 100644
index cb5a41b..0000000
--- a/html/UG/OldHtmlSource/H5_newUG.book
+++ /dev/null
@@ -1,15 +0,0 @@
-#HTMLDOC 1.8.27
--t pdf13 -f "HDF5_UG_body.pdf" --webpage --no-title --linkstyle plain --size Letter --left 1.00in --right 0.50in --top 0.50in --bottom 0.50in --header ... --header1 ... --footer ..1 --nup 1 --tocheader .t. --tocfooter ..i --duplex --portrait --color --no-pscommands --no-xrxcomments --compression=1 --jpeg=60 --fontsize 11.0 --fontspacing 1.2 --headingfont Helvetica --bodyfont Times --headfootsize 10.0 --headfootfont Helvetica --charset iso-8859-1 --no-links --no-embedfonts --pagemode docu [...]
-Part1SplitterPg.html
-03_DataModel.html
-04_ProgModel.html
-Part2SplitterPg.html
-08_TheFile.html
-09_Groups.html
-10_Datasets.html
-11_Datatypes.html
-12_Dataspaces.html
-13_Attributes.html
-13_ErrorHandling.html
-Part3SplitterPg.html
-17_Additional.html
diff --git a/html/UG/OldHtmlSource/H5_newUG_Front.book b/html/UG/OldHtmlSource/H5_newUG_Front.book
deleted file mode 100644
index aa79393..0000000
--- a/html/UG/OldHtmlSource/H5_newUG_Front.book
+++ /dev/null
@@ -1,5 +0,0 @@
-#HTMLDOC 1.8.27
--t pdf13 -f "HDF5_UG_front.pdf" --webpage --no-title --linkstyle plain --size Letter --left 1.00in --right 0.50in --top 0.50in --bottom 0.50in --header ... --header1 ... --footer ... --nup 1 --tocheader .t. --tocfooter ..i --duplex --portrait --color --no-pscommands --no-xrxcomments --compression=1 --jpeg=60 --fontsize 11.0 --fontspacing 1.2 --headingfont Helvetica --bodyfont Times --headfootsize 10.0 --headfootfont Helvetica --charset iso-8859-1 --no-links --no-embedfonts --pagemode doc [...]
-H5_newUG_Title.html
-H5_newUG_TOC.html
-UG_UpdateStatus.html
diff --git a/html/UG/OldHtmlSource/H5_newUG_TOC.html b/html/UG/OldHtmlSource/H5_newUG_TOC.html
deleted file mode 100755
index ef61a6f..0000000
--- a/html/UG/OldHtmlSource/H5_newUG_TOC.html
+++ /dev/null
@@ -1,170 +0,0 @@
-<html>
-<head>
-<title>Table of Contents</title>
-</head>
-
-<body><br><br>
-<h2 align="center"> <font size="7">Table of Contents</font></h2>
-
-<br><br><br>
-
-<font size="+1">
-<table border="0" align="center">
-  <tr>
-    <td align="left" collspan=3>
-	 <br>
-	HDF5 User's Guide Update Status
-	</td>
-	<td>         </td>
-	<td align="right" valign="top">
-	 <br>
-	
-	</td>
-
-        </tr>
-  <tr>
-    <td align="left">
-	 <br>
-	Part I: The Broad View
-	</td>
-	<td>         </td>
-	<td align="right" valign="top">
-	 <br>
-	1
-	</td>
-  </tr>
-  <tr>
-    <td align="left">
-	  Chapter 1: The HDF5 Data Model and File Structure
-	</td>
-	<td> </td>
-	<td align="right" valign="top">
-	3
-	</td>
-  </tr>
-  <tr>
-    <td align="left">
-	  Chapter 2: The HDF5 Library and Programming Model
-	</td>
-	<td> </td>
-	<td align="right" valign="top">
-	23
-	</td>
-  </tr>
-  <tr>
-    <td align="left">
-	 <br>
-	Part II: The Specifics<br>
-	</td>
-	<td> </td>
-	<td align="right">
-	 <br>
-	41
-	</td>
-  </tr>
-  <tr>
-    <td align="left">
-	  Chapter 3: The HDF5 File
-	</td>
-	<td> </td>
-	<td align="right">
-	43
-	</td>
-  </tr>
-  <tr>
-    <td align="left">
-	  Chapter 4: HDF5 Groups
-	</td>
-	<td> </td>
-	<td align="right">
-	69
-	</td>
-  </tr>
-  <tr>
-    <td align="left">
-	  Chapter 5: HDF5 Datasets
-	</td>
-	<td> </td>
-	<td align="right">
-	91
-	</td>
-  </tr>
-  <tr>
-    <td align="left">
-	  Chapter 6: HDF5 Datatypes
-	</td>
-	<td> </td>
-	<td align="right">
-	149
-	</td>
-  </tr>
-  <tr>
-    <td align="left">
-	  Chapter 7: HDF5 Dataspaces and Partial I/O
-	</td>
-	<td> </td>
-	<td align="right">
-	229
-	</td>
-  </tr>
-  <tr>
-    <td align="left">
-	  Chapter 8: HDF5 Attributes
-	</td>
-	<td> </td>
-	<td align="right" valign="top">
-	269
-	</td>
-  </tr>
-  <tr>
-    <td align="left">
-	  Chapter 9: HDF5 Error Handling<br> 
-	</td>
-	<td> </td>
-	<td align="right" valign="top">
-	283
-	</td>
-  </tr>
-  <tr>
-    <td align="left" valign="top">
-	 <br>
-	Part III: Additional Resources<br>
-	</td>
-	<td> </td>
-	<td align="right" valign="top">
-	 <br>
-	297
-	</td>
-  </tr>
-  <tr>
-    <td align="left" valign="top">
-	  Chapter 10: Additional Resources
-	</td>
-	<td> </td>
-	<td align="right" valign="top">
-	299
-	</td>
-  </tr>
-<!--  <tr>
-    <td align="left" valign="top">
-	    Metadata Caching in HDF5
-	</td>
-	<td> </td>
-	<td align="right" valign="top">
-	293
-	</td>
-  </tr>
-  <tr>
-    <td align="left">
-	    Glossary
-	</td>
-	<td> </td>
-	<td align="right">
-	 
-	311
-	</td>
-  </tr> -->
-</table>
-</body>
-</html>
-
diff --git a/html/UG/OldHtmlSource/H5_newUG_Title.html b/html/UG/OldHtmlSource/H5_newUG_Title.html
deleted file mode 100644
index 6f3f20d..0000000
--- a/html/UG/OldHtmlSource/H5_newUG_Title.html
+++ /dev/null
@@ -1,47 +0,0 @@
-
-<html>
-<head>
-<title>HDF5 User’s Guide</title>
-</head>
-
-<body>
-<br><br><br><br>
-<hr>
-<br><br>
-<h1 align="center"><font size="+6">HDF5 User’s Guide</font></h1>
-<br>
-<hr><hr>
-<br><br><br>
-<p align="center"><font size="+3">HDF5 Release 1.8.9</font>
-<br>
-<font size="+2">May 2012</font></p>
-<br><br>
-<br><br><br><br><br><br>
-<p align="center">
-<!--
-The HDF Group 
-<br>
-http://wwww.hdfgroup.org/
--->
-</p>
-
-
-<br><br><br><br><br><br>
-<br><br><br><br><br><br>
-
-<p align="right">
-<table border=0 align=right>
-    <tr><td align=center width=250>
-        <img src="../Graphics/THGwTextMed.jpg" width="220" alt="The HDF Group">
-        <br>
-        <font face="Arial, Helvetica, sans-serif">
-        <a href="http://www.hdfgroup.org">http://www.HDFGroup.org</a>
-        </font>
-        <br> 
-        <br> 
-    </td></tr>
-</table>
-<p>
-
-</body>
-</html>
diff --git a/html/UG/OldHtmlSource/ObjectsIdentifiers.html b/html/UG/OldHtmlSource/ObjectsIdentifiers.html
deleted file mode 100644
index 60b886d..0000000
--- a/html/UG/OldHtmlSource/ObjectsIdentifiers.html
+++ /dev/null
@@ -1,2016 +0,0 @@
-<!doctype HTML public "-//W3C//DTD HTML 4.0 Frameset//EN">
-<html>
-<head>
-<title>Chapter 6: HDF5 Objects and Identifiers</title>
-
-<!--(Meta)==========================================================-->
-
-<!--(Links)=========================================================-->
-
-<!--( Begin styles definition )=====================================-->
-<link href="ed_styles/NewUGelect.css" rel="stylesheet" type="text/css">
-<!--( End styles definition )=======================================-->
-
-</head> 
-
-<body>
-
-<!-- #BeginLibraryItem "/ed_libs/styles_UG.lbi" -->
-<!--
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-  * Copyright by The HDF Group.                                               *
-  * Copyright by the Board of Trustees of the University of Illinois.         *
-  * All rights reserved.                                                      *
-  *                                                                           *
-  * This file is part of HDF5.  The full HDF5 copyright notice, including     *
-  * terms governing use, modification, and redistribution, is contained in    *
-  * the files COPYING and Copyright.html.  COPYING can be found at the root   *
-  * of the source code distribution tree; Copyright.html can be found at the  *
-  * root level of an installed copy of the electronic HDF5 document set and   *
-  * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
-  * access to either file, you may request a copy from help at hdfgroup.org.     *
-  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- -->
-<!-- #EndLibraryItem --><!-- HEADER LEFT "HDF5 User's Guide" -->
-<!-- HEADER RIGHT "HDF5 Groups" -->
-
-
-<div align="center">
-<a name="TOP">
-<h2>Chapter 6<br><font size="7">HDF5 Objects and Identifiers</font></h2>
-</a>
-</div>
-
-<a name="Intro">
-<h3>6.1. Introduction</h3>
-</a>
-  
-  <p>The core strengths of HDF5 are the capacity to handle large amounts
-  of complex data and the flexibility to manage that data efficiently. The 
-  building blocks that give an HDF5 file its capacity and flexibility are 
-  groups and datasets. Datasets will be described in the next chapter. In 
-  this chapter, groups will be described, and since links are 
-  closely intertwined with groups, links will also be discussed.</p>
-  
-  <p>Groups and links can be used to arrange data in a meaningful way. 
-  For example, objects (groups or datasets) that are used together can 
-  be grouped together. Data that comes from similar sources might also be 
-  grouped together. </p>
-  
-  <p>When groups are nested, they create a hierarchy. This 
-  hierarchy is similar to the tree structure employed on UNIX file 
-  systems using directories and files and on Apple Macintosh and 
-  Microsoft Windows systems using folders and files. HDF5 groups are 
-  analogous to the directories and folders; HDF5 datasets are analogous 
-  to the files.</p>
-
-  <p>The structure of an HDF5 file can also be compared to a geographic 
-  map. Cities and towns are like datasets. They come in a wide variety of 
-  configurations. Roads are like links that help us get to datasets. 
-  Countries, states, and counties are like groups: they help us place 
-  the cities and towns where we live and work. </p>
-
-
-
-  
-<!-- NEW PAGE -->
-  <p>In the rest of this chapter, the following topics will be 
-  discussed:</p>
-  <ul>
-    <li>Groups and group structure</li>
-    <li>Links</li>
-    <li>Programming with groups and links</li>
-    <li>Retrieving information about objects in a group</li>
-    <li>Discovery of the structure of an HDF5 file and the contained objects</li>
-    <li>Examples of file structures</li>
-    <li>Function calls provided for working with groups and links</li>
-  </ul>
-<br />
-
-
-<!-- NEW PAGE -->
-<a name="DGroupObj"><a name="DefiningGroupsAndLinks">
-<h3 class=pagebefore>6.2. Defining Groups and Links</h3>
-</a></a>
-
-  <p>Groups and links provide the way for application programs to navigate 
-  to datasets. A <em><b>group</b></em> is a collection of links. 
-  A <em><b>link</b></em> is a connection between a group and an object. When we 
-  use the term link, we mean a connection between a group and an object 
-  that is unidirectional, has a single source, and has a single target. 
-  </p>
-  
-  <p>The purpose of this section is to describe the basic characteristics 
-  of groups and links. </p>
-  
-  
-  
-  
-
-<a name="Groups">
-<h4>6.2.1. Groups</h4>
-</a>
-
-  <p>A group is a collection of links. If we could peer inside a group, 
-  we would see a list of the links that are the members of the group. </p>
-  
-  <p>Groups do not have names. When we speak of a group, we use the name 
-  of the link that is connected to the group. </p>
-  
-  <p>Groups are used to organize objects. If we were organizing our data 
-  by year, we might set up groups for 2010, 2009, and 2008 data. To do this, 
-  our file might have three links named 2010, 2009, and 2008 in the root 
-  group. The groups that are the targets of these three links might have 
-  links to datasets that hold our data.</p>
-  
-  <p>To work with groups, application programs use the Groups interface. 
-  The names of the function calls in this interface start with H5G.</p>
-  
-
-
-
-  
-<a name="TheRootGroup">
-<h4>6.2.2. The Root Group</h4>
-</a>
-
-  <p>When a file is created, a group that we call the root group is 
-  created. The root group is the designated starting point for access 
-  to objects in the file.</p>
-  
-  <p>There is no name for this group just as there is no name 
-  applied to any object. When we write about the root group, when we 
-  need to specify the root group in a parameter, we use a 
-  slash, <code>/</code>. </p>
-  
-  <p>Every group is created with a hard link. The link that is created 
-  with the root group is slightly different from other links in that it 
-  does not have a name and cannot be changed. This means the root group
-  cannot be moved or deleted. See the <a href="#HardAndSymbolicLinks"> 
-  “Hard and Symbolic Links”</a> section for more information.</p>
-  
-
-  
-  
-  
-  
-<a name="LinkPaths">
-<h4>6.2.3. Link Paths</h4>
-</a>
-
-  <p>A link is a connection or association between a group and an object. 
-  A group is the source of the link, and the object is the target of the 
-  link. </p>
-
-  <p>Every link has a name, and no object has a name. When 
-  we talk about an object, we might call the object by the link's name. 
-  Suppose a group has a link named Y1, and the target of Y1 is a 
-  dataset. If we refer to the dataset as Y1, what we really mean is 
-  the dataset that is the target of the link called Y1. See the figure 
-  below. </p>
-  
-  <p>As more data is added to our file, we can nest datasets within 
-  groups and groups within groups. As we add links to groups, we need 
-  to remember that link names need to be unique within each group. </p>
-  
-  <p>To navigate to a group or dataset, we combine the links to the group 
-  or dataset into a <em><b>link path</b></em>. Link names can be used in 
-  more than one place as long as the link paths are unique.</p>
-  
-  <p>A link path can be absolute or relative. An absolute 
-  link path starts at the root group. A relative link path starts 
-  from some other known position such as the current working group. </p>
-  
-  <p>A link path looks like a path name in a file system tree structure. 
-  Each link name is separated from another link name by a slash, 
-  <code>/</code>. The link name following a slash is always a member of 
-  the object that is the target of the link name preceding that slash. 
-  For example, in the link path <code>/GroupA/GroupB/Dataset1</code>, 
-  the link <code>GroupB</code> is a member of the group that is the target 
-  of the link <code>GroupA</code>.</p>
-
-  <p>The first component in a link path may be any of the 
-  following:</p>
-
-  <ul>
-    <li>The special character dot (., a period), the current group</li>
-    <li>The special character slash (/), the root group</li>
-    <li>The name of a link that is a member of the current group</li>
-  </ul>
-
-  <p>Link names may be any string of ASCII or UTF-8 characters that do 
-  not contain a slash or a dot. These are reserved as noted above. 
-  However, users are advised to avoid the use of punctuation and 
-  non-printing characters in link names: these may create problems for 
-  other software. </p>
-
-  <p>In an <em><b>absolute link path</b></em> for an object, we start with 
-  a slash as the root group, and then we add other link names 
-  separated by slashes to get to the object. An example might be 
-  <code>/GroupA/GroupB/Dataset1</code>. What we are really saying 
-  when we write <code>/GroupA/GroupB/Dataset1</code> is the following: 
-  to get to the dataset that is the target of the <code>Dataset1</code> link, 
-  start at the root group, look for the link called <code>GroupA</code>, and 
-  follow it. The <code>GroupA</code> link is a member of the root group. 
-  Next, look for the link called <code>GroupB</code>, and follow it. 
-  <code>GroupB</code> is a member of the group that is the target of 
-  the link called <code>GroupA</code>. Finally, find the link called 
-  <code>Dataset1</code> in the group that is the target of the link called 
-  <code>GroupB</code>, and follow it. </p>
-  
-  <p>A <em><b>relative link path</b></em> starts from some group other 
-  than the root group. If the current working location in the file shown 
-  in the figure below is the group that is the target of the link 
-  <code>YB</code>, then the dataset that is the target of the 
-  <code>Y3</code> link can be identified by the relative link path 
-  <code>YC/Y3</code>.</p>
-
-  <p>There may be multiple link paths to an object. In the figure below, 
-  the dataset that is the target of the absolute link path 
-  <code>/YA/Y1</code> is the same dataset that is the target of the 
-  absolute link path <code>/YA/YB/YC/Y3</code>. </p>
-  
-  <p>The dataset that is the target of the <code>Y1</code> and 
-  <code>Y3</code> links might be accessed using different relative link 
-  paths from the <code>YB</code> group (the group that is the target of 
-  the <code>YB</code> link). Possible relative link paths are 
-  <code>YC/Y3</code> and <code>YC/YD/Y1</code>.</p>
-  
-
-<table align="center" width="500" border="0">
-  <tr valign="center" align="center">
-    <td class="fullImgTableImgCell" width="500">
-      <img height="250" src="Images/groups_fig2a.jpg" 
-        alt="An HDF5 file with a directed graph group structure including a 
-          circular reference"></td>
-    </tr>
-  <tr valign="center" align="left">
-    <td class="fullImgTableCapCell"><span class="figureNumber">
-      Figure 1. An HDF5 file with a directed graph group structure including a 
-          circular reference </span><br />
-          Groups are represented by circles, links by arrows, and datasets 
-          by rectangles. 
-       </td>
-    </tr>
-  </table>
-
-  <p>Note that relative link paths in HDF5 do not employ the 
-  <code>../ </code> notation. The <code>../ </code> notation is used
-  in UNIX to indicate a parent directory and is not used in HDF5 to indicate
-  a parent group.</p>
-
-  <p>Another feature to note in the figure above is what the link 
-  <code>YD</code> represents. Since the underlying structure of an HDF5 
-  file is a directed graph, circular references such as <code>YD</code> 
-  are possible. If the structure of an HDF5 file kept to a strict tree 
-  structure like that used in file systems, then circular references 
-  would not be possible. In the figure above, the dataset specified 
-  by the <code>/YA/Y1</code> link path could also be specified with 
-  the following link path: <code>/YA/YB/YC/YD/Y1</code>. Another 
-  example is the ZBB link in the <a href="#ExamplesOfGroupsAndLinks">
-  “Examples of Groups and Links”</a> section below. </p>
-
-  
-<a name="HardAndSymbolicLinks">
-<h4>6.2.4. Hard and Symbolic Links</h4>
-</a>
-  <p>There are two types of links: hard and symbolic. Hard links are 
-  constructed with a physical address, and symbolic links are constructed 
-  with names. Characteristics of hard and symbolic links are listed below.</p>
-
-  <p>Characteristics of a hard link:</p>
-  <ul>
-    <li>A hard link is made with a physical address in the file</li>
-    <li>A hard link occurs within a single file</li>
-    <li>When a group or dataset is created, a hard link is also
-        created </li>
-    <li>At least one hard link exists for every group or dataset </li>
-    <li>A hard link and the group or dataset that is the target of the link 
-        exist together (hard links cannot dangle) </li>
-    <li>A hard link is created using <code>H5Lcreate_hard</code></li>
-    <li>A group or dataset may be the target of more than one hard link </li>
-    <li>If a group or dataset is not the target of at least one hard link, 
-        then the group or dataset cannot be accessed, and the space occupied 
-        by the group or dataset will be reclaimed the next time the 
-        <code>h5repack</code> tool is run</li>
-    <li>The target of a hard link will increase its reference count by one 
-        when the hard link is created, and the reference count will decline 
-        by one when the hard link is deleted</li>
-</ul>
-
-  <p>Characteristics of a symbolic link:</p>
-  <ul>
-    <li>A symbolic link uses a name rather than a physical address</li>
-    <li>The target of a symbolic link can be changed</li>
-    <li>There are two types of symbolic links: soft and external</li>
-    <li>The target of a soft symbolic link (a soft link) will be a group 
-        or dataset within a file</li>
-    <li>The target of an external symbolic link (an external link) will be 
-        a group or dataset in another file</li>
-    <li>A symbolic link can exist with or without its target object
-        (symbolic links can dangle) </li>
-        <ul>
-        <li>Suppose a symbolic link is created. The target object may or 
-        may not exist when the symbolic link is created. When an application 
-        opens the target object via the symbolic link, then either the 
-        target will be opened, or an error message will be generated.</li>
-        </li>
-        </ul>
-    <li>A symbolic link can be created with <code>H5Lcreate_soft</code> or 
-        <code>H5Lcreate_external</code>
-    <li>A group or dataset may be the target of more than one symbolic 
-        link</li>
-    <li>The target of a symbolic link will not change its reference count 
-        when the symbolic link is created or deleted</li>
-  </ul>
-
-  <p>For more information, see the 
-  <a href="#ReferenceCount">“Reference Count”</a> and 
-  <a href="#ProgModelCreatingHardLinks">“Creating Hard Links”</a> 
-  sections below.</p>
-  
-  <p>User-defined links might be hard or symbolic, or they might be some 
-  kind of combination. See the <code>H5Lcreate_ud</code> function call in 
-  the <a href="../RM/RM_H5Front.html" target="RMwindow"><cite>HDF5 Reference 
-  Manual</cite></a>.</p>
-  
-  
-  
-<a name="ExamplesOfGroupsAndLinks">
-<h4>6.2.5. Examples of Groups and Links</h4>
-</a>
-  <p>The figures below illustrate the range of possibilities for groups 
-  and links. In the figures, circles are used to represent groups, 
-  rectangles are used for datasets, and arrows are used for links.</p>
-
-  <p>In the figure below, the group structure is hierarchical in the same 
-  way a file system operates.</p>
-  
-<table align="center" width="500" border="0">
-  <tr valign="center" align="center">
-    <td class="fullImgTableImgCell">
-      <img height="250" src="Images/groups_fig1a.jpg" 
-        alt="Strictly hierarchical HDF5 group structure"></td>
-    </tr>
-  <tr valign="center" align="left">
-    <td class="fullImgTableCapCell"><span class="figureNumber">Figure 2.
-      An HDF5 file with a strictly hierarchical group structure</span></td>
-    </tr>
-  </table>
-<br />
-
-  <p>In the figure below, the structure takes advantage of the directed 
-  graph’s allowance of circular references and illustrates 
-  an extreme case in which a group via link ZBB is a member of itself. 
-  A possible reference to a member dataset such as 
-  <code>/ZA/ZB/ZBB/Z2</code> could be set up. Directed graph structures 
-  can become quite complex.</p>
-  
-
-<table align="center" width="500" border="0">
-  <tr valign="center" align="center">
-    <td class="fullImgTableImgCell" width="500">
-      <img height="250" src="Images/groups_fig3a.jpg" 
-        alt="Directed graph HDF5 group structure with self-reference"></td>
-    </tr>
-  <tr>
-    <td class="fullImgTableCapCell"><span class="figureNumber">
-      Figure 3. An HDF5 file with a directed graph group structure and 
-      one group as a member of itself</span></td>
-    </tr>
-  </table>
-<br />
-  <p>The figure below shows an external link. The target of the link path 
-  <code>/MA/MB/MC/NA/N2</code> is a dataset in FileN.h5.</p>
-
-<table align="center" width="500" border="0">
-  <tr valign="center" align="center">
-    <td class="fullImgTableImgCell" width="500">
-      <img height="250" src="Images/groups_fig3b.jpg" 
-        alt="An HDF5 file with a link to another HDF5 file"></td>
-    </tr>
-  <tr valign="center" align="left">
-    <td class="fullImgTableCapCell"><span class="figureNumber">
-      Figure 4. An HDF5 file with a symbolic link to another HDF5 file
-      </span></td>
-    </tr>
-  </table>
-
-  <a name="SummaryOfGroupAndLinkCharacteristics">
-<h4>6.2.6. Summary of Group and Link Characteristics</h4>
-  </a>
-  <p>Here is a summary of group and link characteristics:</p>
-
-  <p>Groups</p>
-  <ul>
-    <li>Groups do not have names</li>
-    <li>Groups hold links</li>
-    <li>Groups can be empty</li>
-    <li>Groups do not hold objects</li>
-    <li>The root group is automatically created when the HDF5 
-      file is created</li>
-    <li>The root group cannot be deleted</li>
-    <li>H5G function calls are part of the Groups interface</li>
-  </ul>
-  
-  <p>Links</p>
-  <ul>
-    <li>Each link has a name</li>
-    <li>Link names are unique within a group</li>
-    <li>The target of each link is only one group or dataset</li>
-    <li>Each group or dataset is the target of at least one hard link </li>
-    <li>A group or dataset may be the target of many links</li>
-    <li>Links may create circular references</li>
-    <li> A link path is made of the links that it takes to get to a group 
-    or a dataset</li>
-    <li> The links in a link path are separated by slashes</li>
-    <li>A link path may be absolute or relative</li>
-    <li>A link may be hard or symbolic</li>
-    <li>H5L function calls are part of the Links interface</li>
-  </ul>
-
-  <p>See <a href="#NotesForAdvancedLinkUsers">“Notes for Advanced 
-  Link Users”</a> for more information.</p>
-
-<br />
-
-
-<!-- NEW PAGE -->
-<a name="ProgModel">
-<h3 class=pagebefore>6.3. Programming Model: Working with Groups 
-and Links</h3>
-</a>
-
-  <p>The purpose of this section is to describe more specifically how 
-  common operations can be done.</p>
- 
-  <p>The table below shows some common group and link operations and 
-  the function calls used. These operations are implemented in the 
-  H5G, the H5L, and the H5O APIs. See 
-  “<a href="#GroupFuncSums">Group and Link Function Summaries</a>”
-  below for more information.</p>
-  
-
-<table x-use-null-cells
-		class="ColumnTable"
-		width="600"
-		cellspacing="0"
-		align="center">
-  <tr valign="bottom">
-    <td colspan="2" align="left" class="figureNumber">Table 1. 
-    Common group, link, and object function calls</td>
-  </tr>
-  <tr valign="top"> 
-    <td class="ColumnLeftHdr" width="60%"> 
-        <p><span class="TableHead">To do this operation:</span></td>
-    <td class="ColumnRightHdr" width="40%"> 
-        <p><span class="TableHead">Use this function call:</span></td>
-  <tr valign="top"> 
-    <td class="ColumnLeftCell"> <p>Create a group</td>
-    <td class="ColumnRightCell"> <p><code>H5Gcreate</code></td>
-  </tr>
-  <tr valign="top"> 
-    <td class="ColumnLeftCell"> <p>Open a group</td>
-    <td class="ColumnRightCell"> <p><code>H5Gopen</code></td>
-  </tr>
-  <tr valign="top"> 
-    <td class="ColumnLeftCell"> <p>Close a group</td>
-    <td class="ColumnRightCell"> <p><code>H5Gclose</code></td>
-  </tr>
-  <tr valign="top"> 
-    <td class="ColumnLeftCell"> <p>Add an object to a group 
-      (create a link from a group to an object)</td>
-    <td class="ColumnRightCell"> <p><code>H5Lcreate_hard, H5Lcreate_soft, 
-      H5Lcreate_external</code></td>
-  </tr>
-  <tr valign="top"> 
-    <td class="ColumnLeftCell"> <p>Remove an object from a group
-      (remove from a group the link to an object)</td>
-    <td class="ColumnRightCell"> <p><code>H5Ldelete</code></td>
-  </tr>
-  <tr valign="top"> 
-    <td class="ColumnLeftCell"> <p>Get the identifier for an object</td>
-    <td class="ColumnRightCell"> <p><code>H5Ovisit, H5Oget_info</code></td>
-  </tr>
-  <tr valign="top"> 
-    <td class="ColumnLeftCell"> <p>Get the identifiers for all of the 
-      objects in a group</td>
-    <td class="ColumnRightCell"> <p><code>H5Ovisit</code></td>
-  </tr>
-  <tr valign="top"> 
-    <td class="ColumnLeftCell"> <p>Get the name of a link</td>
-    <td class="ColumnRightCell"> <p><code>H5Lget_info</code></td>
-  </tr>
-  <tr valign="top"> 
-    <td class="ColumnLeftCell"> <p>Get the names of all the links 
-      in a group</td>
-    <td class="ColumnRightCell"> <p><code>H5Literate, H5Lvisit</code></td>
-  </tr>
-</table>
-  
-  <p>When a new object is created, the HDF5 Library executes the 
-  link operation in the background immediately after creating the object. 
-  In other words, the creation operation creates the object and creates
-  the hard link that connects the object to a group.</p>
-    
-  <a name="ProgModelCreateGroup"> 
-<h4>6.3.1. Creating a Group</h4>
-  </a>
-  
-  <p>To create a group, use the <code>H5Gcreate</code> macro. 
-  When used, <code>H5Gcreate</code> creates a group, opens the group 
-  (returns an identifier that can be used in other operations), and 
-  creates a hard link. </p>
-  
-  <p>To create a simple group, specify values for the <code>loc_id</code> 
-  and <code>name</code> parameters and use the default property list 
-  parameter value (<code>H5P_DEFAULT</code>) for the property list 
-  parameters. The <code>loc_id</code> parameter is used to specify the 
-  location identifier. The location identifier is the object 
-  identifier for the file or group where the new group will be connected. 
-  The value of the <code>name</code> parameter will be a link or link path. 
-  If the value of <code>loc_id</code> is a file identifier, then the 
-  value of the <code>name</code> parameter will be an absolute link path. 
-  If the value of <code>loc_id</code> is a group identifier, then the 
-  value of the <code>name</code> parameter should be a relative link path 
-  from the group specified with the <code>loc_id</code> parameter. 
-  See <a href="#LinkPaths">“Link Paths”</a> and 
-  <a href="#IdentifiersAndLinkPaths">“Identifiers and Link 
-  Paths”</a> for more information.  </p>
-  
-  <p>The code in the example below creates three groups. </p>
-  
-  <p>The first group that is created is the target of the 
-  <code>Data</code> link. The <code>Data</code> link 
-  is a member of the root group, and the location identifier 
-  <code>file_id</code> is the object identifier for the file. The 
-  identifier for the file was returned to the application as a result of 
-  the file being opened in the second line of the example.</p>
-  
-  <p>Two other groups are then created and linked to the group that is 
-  the target of the <code>Data</code> link. The first group uses the 
-  file identifier <code>file_id</code> and an absolute link path 
-  for the name of the link. The second group uses the group 
-  identifier <code>group_id</code> and a relative link path for the name 
-  of the link. The identifier <code>group_id</code> was returned when 
-  the group that is the target of the <code>Data</code> link was 
-  created.</p>
-  
-  
-<table x-use-null-cells
-		width="600"
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-		<tr valign="top">
-<td class="fullImgTableImgCell">
-<pre>
-
-  hid_t file;
-  file = H5Fopen(....);
-
-  group = H5Gcreate(file_id, "/Data", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-  group_new1 = H5Gcreate(file_id, "/Data/Data_new1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-  group_new2 = H5Gcreate(group_id, "Data_new2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-</pre>
-</td></tr>
-<tr>
-<td align="left" class="fullImgTableCapCell">
-    <span class="figureNumber">Example 1. 
-    Creating three new groups</span><br />
-    The default property list parameter is <code>H5P_DEFAULT</code>. 
-</td></tr>
-</table>
-
-  <p>The three groups created in the example above are shown in the figure
-  below.</p>
-
-<table align="center" width="500" border="0">
-  <tr valign="center" align="center">
-    <td class="fullImgTableImgCell" width="500">
-      <img height="250" src="Images/groups_fig5a.jpg" 
-        alt="An HDF5 file with a link to another HDF5 file"></td>
-    </tr>
-  <tr valign="center" align="left">
-    <td class="fullImgTableCapCell"><span class="figureNumber">
-      Figure 5. Creating groups
-      </span></td>
-    </tr>
-  </table>
-
-<br />
-
-<table align="center" width="500" class="greenframe2">
-  <tr ><td>
-      <p><b>Programming reminder</b></p>
-      
-      <p>Applications should keep track of every 
-      identifier that is returned to the application. After the application 
-      is finished using an object or file, the appropriate close function 
-      call should be executed with the identifier of the object or file that 
-      will be closed. See <a href="#ClosingAGroup">“Closing a 
-      Group”</a> for more information. </p>
-    </td>
-    </tr>
-  </table>
-
-<!-- NEW PAGE -->
-  <a name="OpeningAGroup">
-<h4>6.3.2. Opening a Group</h4>
-  </a>
-  
-  <p>It is often useful to explicitly open a group when working with 
-  objects that are the targets of links that are members of that group. 
-  To open a group, use the <code>H5Gopen</code> macro. </p>
-  
-  <p>The example below refers to the groups in Figure 5 above and 
-  illustrates different ways to open groups. Opening a dataset is a similar 
-  process. </p>
-  
-  <p>To open an object using a relative link path, an application 
-  must first open the group or file on which the relative link path is 
-  based. In the first line of the example below, a previously-acquired 
-  file identifier, <code>file_id</code>, is used to open the group 
-  that is the target of the <code>/Data</code> link path, and then 
-  the returned group identifier, <code>group_id</code>, and a relative 
-  link path, <code>Data_new1</code>, are used to open the group that is the 
-  target of the <code>Data_new1</code> link.</p>
-  
-  <p>To open an object using an absolute link path, the application 
-  can use the file identifier, <code>file_id</code>, and an absolute link 
-  path. In the third line of the example below, <code>file_id</code> is used 
-  with <code>/Data/Data_new2</code> to open the group that is the target of 
-  the <code>Data_new2</code> link.</p>
-  
-<table x-use-null-cells
-		width="600"
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-		<tr valign="top">
-<td class="fullImgTableImgCell">
-<pre>
-
-  group = H5Gopen(file_id, "/Data", H5P_DEFAULT);
-  group1 = H5Gopen(group_id, "Data_new1", H5P_DEFAULT);
-  group2 = H5Gopen(file_id, "/Data/Data_new2", H5P_DEFAULT);
-</pre>
-</td></tr>
-<tr>
-<td align="left" class="fullImgTableCapCell">
-    <span class="figureNumber">Example 2. 
-    Open groups with relative and absolute link paths</span>
-</td></tr>
-</table>
-
-  <a name="CreatingADataset">
-<h4>6.3.3. Creating a Dataset</h4>
-  </a>
-  
-  <p>The process of creating a dataset is like the process of creating 
-  a group that was discussed above. When a dataset is created, a hard 
-  link to it is automatically created. The link will be a member of a 
-  group, and when we talk about the dataset, we will use the name of 
-  the link to refer to the dataset. As with groups, a dataset may be 
-  created in a group by specifying an absolute link path or a relative 
-  link path. The example below illustrates both approaches to creating 
-  a dataset in the group that is the target of the <code>/Data</code> 
-  link. The absolute link path to the first dataset is 
-  <code>/Data/CData</code>. The <code>H5Dcreate</code> macro uses a 
-  previously-acquired <code>file_id</code> and the default property list 
-  parameter <code>H5P_DEFAULT</code>. For the second dataset, the example 
-  first opens the group which will be the source of the link to the 
-  dataset, and then uses the <code>group_id</code> and the relative link 
-  <code>Cdata2</code> to create and locate the dataset.</p>
-  
-<table x-use-null-cells
-                width="600"
-                cellspacing="0"
-                class="fullImgTable"
-                align="center">
-                <tr valign="top">
-<td class="fullImgTableImgCell">
-<pre>
-
-   dataspace = H5Screate_simple(RANK, dims, NULL);
-   dataset1 = H5Dcreate(file_id, "/Data/CData", H5T_NATIVE_INT,
-                     dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-
-   group = H5Gopen(file_id, "/Data", H5P_DEFAULT);
-   dataset2 = H5Dcreate(group_id, "Cdata2", H5T_NATIVE_INT,
-                     dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-</pre>
-</td></tr>
-<tr>
-<td align="left" class="fullImgTableCapCell">
-    <span class="figureNumber">Example 3.
-    Create datasets using absolute and relative link paths</span>
-</td></tr>
-</table>
-
-<!-- NEW PAGE -->
-  <a name="ClosingAGroup">
-<h4>6.3.4. Closing a Group</h4>
-  </a>
-  
-  <p>To ensure the integrity of HDF5 objects and to release system 
-  resources, an application should always call the appropriate 
-  close function when it is through working with an HDF5 object. 
-  In the case of groups, <code>H5Gclose</code> ends access to the group 
-  and releases any resources the HDF5 Library has maintained 
-  in support of that access including the group identifier.  </p>
-  
-  <p>As illustrated in the example below, all that is required for an 
-  <code>H5Gclose</code> call is the group identifier acquired when 
-  the group was opened. There are no relative versus absolute link path 
-  considerations.</p>
-  
-  
-<table x-use-null-cells
-		width="600"
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-		<tr valign="top">
-<td class="fullImgTableImgCell">
-<pre>
-
-  herr_t status;
-  status = H5Gclose(group_id);
-</pre>
-</td></tr>
-<tr>
-<td align="left" class="fullImgTableCapCell">
-    <span class="figureNumber">Example 4. 
-    Close a group</span>
-</td></tr>
-</table>
-
-  <p>A non-negative return value indicates that the group was successuflly 
-  closed and the resources released; a negative return value indicates that
-  the attempt to close the group or release resources failed.</p>
-
-
-  <a name="ProgModelCreatingHardLinks">
-<h4>6.3.5. Creating Hard Links </h4>
-  </a>
-
-  <p>When a group or a dataset is created, a hard link is also created. 
-  This hard link gives the group or dataset a location in the file. 
-  After a group or dataset is created, additional hard links can be 
-  explicitly added by means of the <code>H5Lcreate_hard</code> function 
-  call to improve access and resource efficiency. See the 
-  <a href="#DefiningGroupsAndLinks"> “Defining Groups and 
-  Links”</a> section for more information.</p>
-
-  <p>The code in the example below illustrates the creation of a hard link 
-  named <code>Y3</code>. 
-  Once that link is created, the dataset that is the target of the 
-  absolute link path <code>/YA/Y1</code> can also be accessed by means 
-  of the absolute link path <code>/YA/YB/YC/Y3</code>. </p>
-  
-  <p>Here are some comments for each line in the example below.</p>
-  <ol>
-    <li>The file is opened. The identifier <code>file_id</code> is 
-      returned.</li>
-    <li>The group that is the target of the <code>/YA/YB/YC</code> link
-      is opened and returns the <code>group_id</code> identifier.</li>
-    <li>The <code>Y3</code> link is created. The <code>file_id</code> 
-      identifier and the absolute link path <code>/YA/Y1</code> are 
-      used to specify the dataset that will be the target of the new 
-      link. The <code>group_id</code> identifier specifies the group 
-      that is the target of the <code>/YA/YB/YC</code> link is the 
-      source of the new link. The new link is named <code>Y3</code>. 
-      The default property list value (<code>H5P_DEFAULT</code>) is 
-      used for the property list parameters.</li>
-    <li>This line shows an alternate way to create <code>Y3</code>. The 
-      difference between this line and the one above it is the 
-      <code>file_id</code> is used with an absolute link path to 
-      define the new link. </li>
-  </ol>
-  </p>
-  
-<table x-use-null-cells
-		width="600"
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-		<tr valign="top">
-<td class="fullImgTableImgCell">
-<pre>
-
-    file = H5Fopen(....);
-    group = H5Gopen(file_id, "/YA/YB/YC", H5P_DEFAULT);
-    
-    status = H5Lcreate_hard(file_id, "/YA/Y1", group_id, "Y3", 
-               H5P_DEFAULT, H5P_DEFAULT)
-
-    status = H5Lcreate_hard(file_id, "/YA/Y1", file_id, "/YA/YB/YC/Y3", 
-               H5P_DEFAULT, H5P_DEFAULT)
-
-</pre>
-</td></tr>
-<tr>
-<td align="left" class="fullImgTableCapCell">
-    <span class="figureNumber">Example 5. Create a hard link</span> 
-</td></tr>
-</table>
-<br />
-<table align="center" width="500" border="0">
-  <tr valign="center" align="center">
-    <td class="fullImgTableImgCell" width="500">
-      <img height="250" src="Images/groups_fig2a_Ex5.jpg" 
-        alt="Create a hard link"></td>
-    </tr>
-  <tr valign="center" align="left">
-    <td class="fullImgTableCapCell"><span class="figureNumber">
-      Figure 6. Creating hard links
-      </span></td>
-    </tr>
-  </table>
-
-
-
-<!-- NEW PAGE -->
-  <a name="DeletingALink">
-<h4>6.3.6. Deleting a Link</h4>
-  </a>
-  <p>The <code>H5Ldelete</code> function call can be used to remove 
-  hard, soft, external, and user-defined links. </p>
-  
-  <p>The example below refers to the link named <code>Y3</code> that was 
-  created in the section above and shows how to remove a link using a 
-  relative link path and an absolute link path. The first line uses the 
-  <code>group_id</code> identifier for the group that is the source 
-  of the link, the name of the link, <code>Y3</code>, and the default 
-  property list parameter, <code>H5P_DEFAULT</code>. The second line 
-  uses the <code>file_id</code> identifier for the file, an absolute 
-  link path, and the default property list parameter. Only the final 
-  link in the absolute link path will be deleted.</p>
-  
-<table x-use-null-cells
-		width="600"
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-		<tr valign="top">
-<td class="fullImgTableImgCell">
-<pre>
-
-    status = H5Ldelete(group_id, "Y3", H5P_DEFAULT);
-    
-    status = H5Ldelete(file_id, "/YA/YB/YC/Y3", H5P_DEFAULT);
-
-</pre>
-</td></tr>
-<tr>
-<td align="left" class="fullImgTableCapCell">
-    <span class="figureNumber">Example 6. Delete a link</span> 
-</td></tr>
-</table>
-
-<br />
-
-<table align="center" width="500" class="greenframe2">
-  <tr ><td>
-    <p><b>How to avoid deleting the last hard link</b></p>
-
-    <p>When the last hard link to an object is deleted, the object is no 
-    longer accessible. Note that <code>H5Ldelete</code> will not prevent 
-    you from deleting the last link to an object. To see if an object has 
-    only one link, use the <code>H5Oget_info</code> function. If the value 
-    of the rc (reference count) field in <code>object_info</code> is greater 
-    than 1, then a link to the object can be deleted without making the 
-    object inaccessible.</p>
-  
-    <p>It is possible to delete the last hard link to an object and not make 
-    the object inaccessible. Suppose your application opens a dataset and 
-    then deletes the last hard link to the dataset. While
-    the dataset is open, your application still has a connection to the 
-    dataset through the identifier returned when the dataset was opened. 
-    If your application creates a hard link to the dataset before 
-    it closes the dataset, then the dataset will still be accessible 
-    after the dataset is closed.</p>
-    </td>
-    </tr>
-  </table>
-
-
-
-
-
-
-  <a name="CreatingSymbolicLinks">
-<h4>6.3.7. Creating Symbolic Links</h4>
-  </a>
-  
-  <p>Symbolic links are based on names and not on physical file addresses. 
-  Symbolic links are similar to the soft links, aliases, and shortcuts 
-  that are used with various operating systems. Programmers can use 
-  symbolic links to more easily work with any long link paths they may 
-  be using and to work with objects in other HDF5 files. There are two
-  kinds of symbolic links: soft and external. Soft links are 
-  used within a single file. External links are used to connect files.</p>
-  
-  <p>A big difference between symbolic links and hard links is the status 
-  of the target when the link is created. The target of a hard link must 
-  exist when the hard link is created. The target of a symbolic link may 
-  or may not exist when the link is created. If a symbolic link is created 
-  and the target does not exist, the link is said to dangle or to be a 
-  dangling link. So, symbolic links are more flexible than hard links.</p>
-
-  <p><b>To create a soft link</b>, use the <code>H5Lcreate_soft</code> 
-  function call. The function call has five parameters. The last two are 
-  property lists. In the example below, the default property list value 
-  <code>H5P_DEFAULT</code> is used. The first three parameters are 
-  called in the <cite>HDF5 Reference Manual</cite> <code>target_path</code>, 
-  <code>link_loc_id</code>, and <code>link_name</code>. </p>
-  
-  <p>The value of <code>target_path</code> is a link path to the target of 
-  the soft link. This is not the soft link. This is what the soft link 
-  resolves to when the soft link is used. The links in this link path 
-  may or may not exist when the soft link is created, but the links and 
-  any intermediate groups in this link path must exist when the soft link 
-  is first used in order for the soft link to work. </p>
-  
-  <p>The value of <code>link_loc_id</code> is a file identifier or a 
-  group identifier. If the value of this parameter is a file identifier, 
-  then the values of the <code>target_path</code> and 
-  <code>link_name</code> parameters should be absolute link paths. If 
-  the value of this parameter is a group identifier, then the values of 
-  the <code>target_path</code> and <code>link_name</code> parameters 
-  could be either relative or absolute link paths. A relative link 
-  path would start from the group identifier's group. </p>
-  
-  <p>The value of <code>link_name</code> is the name of the new soft 
-  link. In the example below, the new soft link is called 
-  <code>2010</code>.</p>
-  
-  <p>The example below creates a soft link called <code>2010</code> 
-  with a <code>link_loc_id</code> of <code>file_id</code> and a 
-  <code>target_path</code> of <code>/YA/YB/YC/Y3</code>. The example 
-  then opens the dataset that is the target of the soft link.</p>
-  
-  
-<table x-use-null-cells
-		width="600"
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-		<tr valign="top">
-<td class="fullImgTableImgCell">
-<pre>
-
-  status = H5Lcreate_soft("/YA/YB/YC/Y3", file_id, "/2010", H5P_DEFAULT, H5P_DEFAULT);
-
-  dataset = H5Dopen(file_id, "/2010", H5P_DEFAULT);
-  
-</pre>
-</td></tr>
-<tr>
-<td align="left" class="fullImgTableCapCell">
-    <span class="figureNumber">Example 7. Create a soft link</span> 
-</td></tr>
-</table>
-
-  <p>The figure below illustrates the new soft link created in the 
-  example above. </p>
-  
-<table align="center" width="500" border="0">
-  <tr valign="center" align="center">
-    <td class="fullImgTableImgCell" width="500">
-      <img height="250" src="Images/groups_fig2a_Ex8.jpg" 
-        alt="Creating a soft link"></td>
-    </tr>
-  <tr valign="center" align="left">
-    <td class="fullImgTableCapCell"><span class="figureNumber">
-      Figure 7. Creating a soft link</span><br />
-          Groups are represented by circles, links by arrows, and datasets 
-          by rectangles. 
-       </td>
-    </tr>
-  </table>
-  
-  <p><b>To create an external link</b>, use the 
-  <code>H5Lcreate_external</code> function call. The parameters used with 
-  <code>H5Lcreate_external</code> are the same as those used with 
-  <code>H5Lcreate_soft</code> except that an HDF5 file is also specified.
-  See the <cite>HDF5 Reference Manual</cite> for more information.</p>
-    
-  <p>See the <a href="#NotesForAdvancedLinkUsers">“Notes for 
-  Advanced Link Users”</a> section for more information. </p>
-
-    
-
-  <a name="DiscoverInfo">
-<h4 class=pagebefore>6.3.8. Discovering Information about Objects</h4>
-  </a>
-
-  <p>There is often a need to retrieve information about a particular object.
-  The <code>H5Lget_info</code> and <code>H5Oget_info</code> functions fill 
-  this niche by returning a description of the object or link in an 
-  <code>H5L_info_t</code> or <code>H5O_info_t</code> structure.</p>
-  
-  
-
-
-  <a name="DiscoverGrObjs">
-<h4 class=pagebefore>6.3.9. Discovering Objects in a Group</h4>
-  </a>
-
-  <p>To examine all the objects or links in a group, 
-  use the <code>H5Literate</code> or <code>H5Ovisit</code> functions to 
-  examine the objects, and use 
-  the <code>H5Lvisit</code> function to examine the links.
-  The <code>H5Literate</code> function is useful both with a single group and 
-  in an iterative process that examines an entire file 
-  or section of a file (such as the contents of a group or the contents 
-  of all the groups that are members of that group)
-  and acts on objects as they are encountered. The <code>H5Ovisit</code> 
-  function recursively visits all objects accessible from a specified object. 
-  The <code>H5Lvisit</code> function recursively visits all the links 
-  starting from a specified group. </p>
-   
-  
-
-
-<!-- NEW PAGE -->
-  <a name="DiscoverAll">
-<h4 class=pagebefore>6.3.10. Discovering all of the Objects in the File</h4>
-  </a>
-
-  <p>The structure of an HDF5 file is 
-  <span class="termDefinition">self-describing</span>, 
-  meaning that an application can navigate an HDF5 file 
-  to discover and understand all the objects it contains. 
-  This is an iterative process wherein the structure is traversed as a graph, 
-  starting at one node and recursively visiting linked nodes. 
-  To explore the entire file, the traversal should start at the root group.</p>
-  
-
-
-
-
-<!-- NEW PAGE --> 
-  <a name="UsingH5Dump">
-<h3 class=pagebefore>6.3.11. Using <code>h5dump</code></h3>
-  </a>
-
-  <p>The <code>h5dump</code> application program is a command-line 
-  utility that is distributed with HDF5. It can be used to inspect 
-  the contents of an HDF5 file. It can show the structure of a file 
-  so that you can determine where to create an object or so that you 
-  can verify that your application program actually created an object.</p>
-  
-  <p>In the case of the new group created in the 
-  “<a href="#ProgModelCreateGroup">Creating a group</a>” section, 
-  the following <code>h5dump</code> command will display the 
-  contents of <code>FileA.h5</code>:</p>
-
-<dir><pre>
-h5dump FileA.h5 
-</pre></dir>
-
-  <p>
-  Assuming that the discussed objects, <code>GroupA</code> and 
-  <code>GroupB</code> are the only objects that exist in 
-  <code>FileA.h5</code>, the output will look something like the 
-  following:</p>
-
-<dir><pre>
-HDF5 "FileA.h5" {
-GROUP "/" {
-GROUP GroupA {
-GROUP GroupB {
-}
-}
-}
-}
-</pre></dir>
-
-  <p>
-  The <code>h5dump</code> program is described on the 
-  <a href="../RM/Tools.html" target="RMwindow">Tools</a> page of the 
-  <a href="../RM/RM_H5Front.html" 
-  target="RMwindow"><cite>HDF5 Reference Manual</cite></a>.</p>
-  
-  <p>The HDF5 DDL grammar is described in the document
-  <a href="../ddl.html" target="RMwindow">DDL in BNF for HDF5</a>, 
-  an element of this <cite>HDF5 User’s Guide</cite>.</p>
-<br />
-
-
-
-<br />
-<!-- NEW PAGE -->
-<a name="Examples">
-<h3 class=pagebefore>6.4. Examples of Group Structures</h3></a>
-
-
-  <p>This section presents several samples of possible HDF5 group 
-  structures.</p>
-  
-  
-<table x-use-null-cells
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-  <tr valign="top"> 
-    <td align="center" class="fullImgTableImgTopCell"> 
-      <img src="Images/groups_fig27_a.JPG">
-    </td><td align="center" valign="top" class="fullImgTableImgTopCell">  </td>
-    <td align="center" class="fullImgTableImgTopCell">
-      <img src="Images/groups_fig27_b.JPG"> 
-    </td>
-  </tr>
-  <tr>
-    <td align="center" width="50%">
-    a) The file contains three groups: 
-    the root group, <code>/group1</code>, and <code>/group2</code>.
-    </td><td align="center" valign="top">  </td>
-    <td align="center" width="50%">
-    b) The dataset <code>dset1</code> (or <code>/group1/dset1</code>) 
-    is created in <code>/group1</code>.
-    </td> 
-  </tr>
-  <tr valign="top"> 
-    <td align="center"> 
-      <img src="Images/groups_fig27_aa.JPG">
-    </td><td align="center" valign="top">  </td>
-    <td align="center">
-      <img src="Images/groups_fig27_bb.JPG"> 
-    </td>
-  </tr>
-  <tr> 
-    <td align="center" valign="top" class="fullImgTableImgBottomCell">
-    c) A link named <code>dset2</code> is created in <code>/group2</code>. 
-    </td><td align="center" valign="top" class="fullImgTableImgBottomCell">  </td>
-    <td align="center" class="fullImgTableImgBottomCell">
-    d) The <code>dset1</code> link is removed. The dataset is still in the 
-    file, but can be accessed only as <code>/group2/dset2</code>.
-    </td>
-  </tr>
-  <tr> 
-    <td height="24" colspan="3" align="left" class="fullImgTableCapCell"> 
-    <span class="figureNumber">Figure 8. Some group structures</span> 
-    </td>
-  </tr>
-</table>
-
-  <p>The figure above shows examples of the structure of a file with three 
-  groups and one dataset. The file in Figure 8a contains three groups: 
-  the root group and two member groups. In Figure 8b, a dataset has been 
-  created and linked to <code>/group1</code> with the link named 
-  <code>dset1</code>. In Figure 8c, a link named <code>dset2</code> from 
-  <code>/group2</code> to the dataset has been added. Note that there is 
-  only one copy of the dataset; there are two links to it, and it can be 
-  accessed either as <code>/group1/dset1</code> or as 
-  <code>/group2/dset2</code>. Figure 8d above illustrates that one of the 
-  two links to the dataset can be deleted. In this case, the link from 
-  <code>/group1</code> has been removed.  The dataset itself has not 
-  been deleted; it is still in the file, but it can only be accessed as 
-  <code>/group1/dset2</code>.</p>
-<!-- NEW PAGE -->
-  
-  
-<table x-use-null-cells
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-  <tr valign="top"> 
-    <td align="center" class="fullImgTableImgTopCell"> 
-      <img src="Images/groups_fig28_a.JPG">
-    </td><td align="center" valign="top" class="fullImgTableImgTopCell">  </td>
-    <td align="center" class="fullImgTableImgTopCell">
-      <img src="Images/groups_fig28_b.JPG"> 
-    </td>
-  </tr>
-  <tr>
-    <td align="center" width="50%">
-    a) <code>dset1</code> has two names: 
-    <code>/group2/dset1</code> and <code>/group1/GXX/dset1</code>.
-    </td><td>  </td>
-    <td align="center" width="50%">
-    b) <code>dset1</code> again has two names: 
-    <code>/group1/dset1</code> and <code>/group1/dset2</code>.
-    </td> 
-  </tr>
-  <tr valign="top"> 
-    <td align="center"> 
-      <img src="Images/groups_fig28_c.JPG">
-    </td><td>  </td>
-    <td align="center">
-      <img src="Images/groups_fig28_d.JPG"> 
-    </td>
-  </tr>
-  <tr> 
-    <td align="center" valign="top" class="fullImgTableImgBottomCell">
-    c) <code>dset1</code> has three names: 
-    <code>/group1/dset1</code>, <code>/group2/dset2</code>, 
-    and <code>/group1/GXX/dset2</code>.
-    </td><td align="center" valign="top" class="fullImgTableImgBottomCell">  </td>
-    <td align="center" class="fullImgTableImgBottomCell">
-    d) <code>dset1</code> has many available path names.
-    </td>
-  </tr>
-  <tr> 
-    <td height="24" colspan="3" align="left" class="fullImgTableCapCell"> 
-    <span class="figureNumber">Figure 9. More sample group structures</span> 
-    </td>
-  </tr>
-</table>
-
-  <p>The figure above illustrates loops in an HDF5 group structure. 
-  The file in Figure 9a contains three groups and a dataset. 
-  The group that is the target of the <code>group2</code> link is a 
-  member of the root group and is also a member of the group that is the 
-  target of the <code>group1</code> link. The group that is the target 
-  of the <code>group2</code> link can be accessed by either of two link 
-  paths: <code>/group2</code> or <code>/group1/GXX</code>. 
-  Similarly, the dataset can be accessed by these link paths: 
-  <code>/group2/dset1</code> or <code>/group1/GXX/dset1</code>.</p>
-
-  <p>Figure 9b illustrates a different case: the dataset is the target 
-  of two links that are both members of the same group. In this case, 
-  the dataset again has two names: <code>/group1/dset1</code> and 
-  <code>/group1/dset2</code>.</p>
-  
-  
-<!-- NEW PAGE -->
-  <p>In Figure 9c, the dataset that is the target of the <code>dset1</code> 
-  link is a member of two groups. The dataset has three absolute link 
-  paths: <code>/group1/dset1</code>, <code>/group2/dset2</code>, and 
-  <code>/group1/GXX/dset2</code>. </p>
-  
-  <p>In Figure 9d, two of the groups are members of each other, and the 
-  dataset is a member of both groups. In this case, there are an infinite 
-  number of paths to the dataset because <code>GXX</code> and 
-  <code>GYY</code> can be traversed any number of times on the way from 
-  the root group, <code>/</code>, to the dataset. This can yield a link path 
-  such as <code>/group1/GXX/GYY/GXX/GYY/GXX/dset2</code>.</p>
-
-  
-<table x-use-null-cells
-		cellspacing="0"
-                class="fullImgTable"
-		align="center">
-  <tr valign="top"> 
-    <td align="center" class="fullImgTableImgTopCell"> 
-      <img src="Images/groups_fig29_a.JPG">
-    </td><td align="center" valign="top" class="fullImgTableImgTopCell">  </td>
-    <td align="center" class="fullImgTableImgTopCell">
-      <img src="Images/groups_fig29_b.JPG"> 
-    </td>
-  </tr>
-  <tr>
-    <td align="center" valign="top" width="48%">
-    a) The file contains only hard links.
-    </td><td>  </td>
-    <td align="center" valign="top" width="48%">
-    b) The <code>dset2</code> soft link is added.
-    </td> 
-  </tr>
-  <tr valign="top"> 
-    <td align="center"> 
-      <img src="Images/groups_fig29_c.JPG">
-    </td><td>  </td>
-    <td align="center">
-      <img src="Images/groups_fig29_d.JPG"> 
-    </td>
-  </tr>
-  <tr> 
-    <td align="center" valign="top" class="fullImgTableImgBottomCell">
-    c) A soft link named <code>dset3</code> is added with a target 
-    that does not yet exist.
-    </td><td align="center" valign="top" class="fullImgTableImgBottomCell">  </td>
-    <td align="center" valign="top" class="fullImgTableImgBottomCell">
-    d) The target of the soft link is created or linked.
-    </td>
-  </tr>
-  <tr> 
-    <td height="24" colspan="3" align="left" class="fullImgTableCapCell"> 
-    <span class="figureNumber">Figure 10. Hard and soft links</span> 
-    </td>
-  </tr>
-</table>
-
-<!-- NEW PAGE -->
-  <p>
-  The figure above takes us into the realm of soft links.
-  The original file, in Figure 10a, contains only three hard links.
-  In Figure 10b, a soft link named <code>dset2</code> has been created.
-  The source of the new link is the group that is the target of the 
-  <code>group2</code> link. The target of the new link is also the target 
-  of the <code>/group1/dset1</code> link path.</p>
-  
-  <p>In Figure 10c, another soft link, <code>dset3</code>, has been created 
-  in the group that is the target of the <code>group2</code> link. The 
-  target <code>dset3</code> does not yet exist. That target object has 
-  been added in Figure 10d along with the hard link <code>dset</code>. The 
-  target dataset is now accessible as either <code>/group2/dset</code> or
-  <code>/group2/dset3</code>.</p>
-   
-<br />
-
-   
-
-   <!-- NEW PAGE -->
-<a name="GroupFuncSums">
-<h3 class=pagebefore>6.5. Group and Link Function Summaries</h3>
-</a>
-  <p>Function calls that can be used with groups (H5G functions) and 
-  property list functions that can used with groups (H5P functions) are 
-  listed below. A number of group functions have been deprecated. Most 
-  of these have been replaced by link (H5L) or object (H5O) functions. 
-  These replacement functions are also listed below. For more information 
-  on any of these interfaces or functions, see the 
-  <a href="../RM/RM_H5Front.html" target="RMwindow"><cite>HDF5 Reference 
-  Manual</cite></a>.</p>
-<br />
-
-<table x-use-null-cells
-                class="functTable"
-                width="600"
-                cellspacing="0"
-                align="center">
-  <tr valign="bottom">
-    <td colspan="2" align="left" valign="bottom" class="figureNumber">
-    Function Listing 1. Group functions (H5G)</td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableLeftHdr">
-        <span class="TableHead">C Function<br>F90 Function</span>
-    </td>
-    <td class="functTableRightHdr">
-        <span class="TableHead">Purpose</span>
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td colspan=1
-        rowspan=1
-        class="functTableCell">
-        <code>H5Gcreate<br>h5gcreate_f</code> 
-    </td>
-    <td colspan=1
-        rowspan=1
-        class="functTableCell">
-        Creates and opens a new group. The C function is a 
-        macro: see <a href="../RM/APICompatMacros.html">“API 
-        Compatibility Macros in HDF5.”</a>
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td colspan=1
-        rowspan=1
-        class="functTableCell">
-        <code>H5Gcreate_anon<br>h5gcreate_anon_f</code> 
-    </td>
-    <td colspan=1
-        rowspan=1
-        class="functTableCell">
-        Creates and opens a new group without linking it into the file 
-        structure. 
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Gopen<br>h5gopen_f</code> 
-    </td>
-    <td class="functTableCell">
-        Opens an existing group. The C function is a 
-        macro: see <a href="../RM/APICompatMacros.html">“API 
-        Compatibility Macros in HDF5.”</a>
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Gclose<br>h5gclose_f</code> 
-    </td>
-    <td class="functTableCell">
-        Closes the specified group.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Gget_create_plist<br>h5gget_create_plist_f</code> 
-    </td>
-    <td class="functTableCell">
-        Gets a group creation property list identifier. 
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Gget_info<br>h5gget_info_f</code> 
-    </td>
-    <td class="functTableCell">
-        Retrieves information about a group. 
-        Use instead of <code>H5Gget_num_objs</code>.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Gget_info_by_idx<br>h5gget_info_by_idx_f</code> 
-    </td>
-    <td class="functTableCell">
-        Retrieves information about a group according to the group�s 
-        position within an index. 
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Gget_info_by_name<br>h5gget_info_by_name_f</code> 
-    </td>
-    <td class="functTableCell">
-        Retrieves information about a group. 
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>(none)<br>h5gget_obj_info_idx_f</code> 
-    </td>
-    <td class="functTableCell">
-        Returns name and type of the group member identified by its index.
-        Use with the <code>h5gn_members_f</code> function. 
-        <code>h5gget_obj_info_idx_f</code> and <code>h5gn_members_f</code> 
-        are the Fortran equivalent of 
-        the C function <code>H5Literate</code>.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableBottom">
-        <code>(none)<br>h5gn_members_f</code> 
-    </td>
-    <td class="functTableBottom">
-        Returns the number of group members.
-        Use with the <code>h5gget_obj_info_idx_f</code> function. 
-    </td>
-  </tr>
-</table>
-<br />
-
-<table x-use-null-cells
-                class="functTable"
-                width="600"
-                cellspacing="0"
-                align="center">
-  <tr valign="bottom">
-    <td colspan="2" align="left" valign="bottom" class="figureNumber">
-    Function Listing 2. Link (H5L) and object (H5O) functions</td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableLeftHdr">
-        <span class="TableHead">C Function<br>F90 Function</span>
-    </td>
-    <td class="functTableRightHdr">
-        <span class="TableHead">Purpose</span>
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td colspan=1
-        rowspan=1
-        class="functTableCell">
-        <code>H5Lcreate_hard<br>h5lcreate_hard_f</code> 
-    </td>
-    <td colspan=1
-        rowspan=1
-        class="functTableCell">
-        Creates a hard link to an object. 
-        Replaces <code>H5Glink</code> and <code>H5Glink2</code>.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td colspan=1
-        rowspan=1
-        class="functTableCell">
-        <code>H5Lcreate_soft<br>h5lcreate_soft_f</code> 
-    </td>
-    <td colspan=1
-        rowspan=1
-        class="functTableCell">
-        Creates a symbolic link to an object in the same file. 
-        Replaces <code>H5Glink</code> and <code>H5Glink2</code>.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td colspan=1
-        rowspan=1
-        class="functTableCell">
-        <code>H5Lcreate_external<br>h5lcreate_external_f</code> 
-    </td>
-    <td colspan=1
-        rowspan=1
-        class="functTableCell">
-        Creates a symbolic link to an object in a different file. 
-        Replaces <code>H5Glink</code> and <code>H5Glink2</code>.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td colspan=1
-        rowspan=1
-        class="functTableCell">
-        <code>H5Lcreate_ud<br>(none)</code> 
-    </td>
-    <td colspan=1
-        rowspan=1
-        class="functTableCell">
-        Creates a user-defined link. 
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Lget_val<br>(none)</code> 
-    </td>
-    <td class="functTableCell">
-        Returns the value of a symbolic link. 
-        Replaces <code>H5Gget_linkval</code>.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Literate<br>(none)</code> 
-    </td>
-    <td class="functTableCell">
-        Iterates through links in a group. 
-        Replaces <code>H5Giterate</code>.
-        See also <code>H5Ovisit</code> and <code>H5Lvisit</code>.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Lget_info<br>h5lget_info_f</code> 
-    </td>
-    <td class="functTableCell">
-        Returns information about a link. 
-        Replaces <code>H5Gget_objinfo</code>. 
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Oget_info<br>(none)</code> 
-    </td>
-    <td class="functTableCell">
-        Retrieves the metadata for an object. 
-        Replaces <code>H5Gget_objinfo</code>. 
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Lget_name_by_idx<br>h5lget_name_by_idx_f</code> 
-    </td>
-    <td class="functTableCell">
-        Retrieves name of the nth link in a group according to the order 
-        within a specified field or index.
-        Replaces <code>H5Gget_objname_by_idx</code>.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Oget_info_by_idx<br>(none)</code> 
-    </td>
-    <td class="functTableCell">
-        Retrieves the metadata for an object which is identified 
-        by an index position. 
-        Replaces <code>H5Gget_objtype_by_idx</code>.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Oset_comment<br>(none)</code> 
-    </td>
-    <td class="functTableCell">
-        Sets the comment for specified object. 
-        Replaces <code>H5Gset_comment</code>.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Oget_comment<br>(none)</code> 
-    </td>
-    <td class="functTableCell">
-        Gets the comment for specified object. 
-        Replaces <code>H5Gget_comment</code>.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Ldelete<br>h5ldelete_f</code> 
-    </td>
-    <td class="functTableCell">
-        Removes a link from a group. 
-        Replaces <code>H5Gunlink</code>.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td colspan=1
-        rowspan=1
-        class="functTableBottom">
-        <code>H5Lmove<br>h5lmove_f</code> 
-    </td>
-    <td colspan=1
-        rowspan=1
-        class="functTableBottom">
-        Renames a link within an HDF5 file. 
-        Replaces <code>H5Gmove</code> and <code>H5Gmove2</code>.
-    </td>
-  </tr>
-</table>
-<br />
-
-
-<table x-use-null-cells 
-                class="functTable"
-                width=100%
-                cellspacing="0"
-                align="center">
-  <tr valign="bottom">
-    <td colspan="2" align="left" valign="bottom" class="figureNumber">
-    Function Listing 3. Group creation property list functions (H5P)</td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableLeftHdr">
-        <span class="TableHead">C Function<br>F90 Function</span>
-    </td>
-    <td class="functTableRightHdr">
-        <span class="TableHead">Purpose</span>
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Pall_filters_avail<br>(none)</code> 
-    </td>
-    <td class="functTableCell">
-        Verifies that all required filters are available.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Pget_filter<br>h5pget_filter_f</code> 
-    </td>
-    <td class="functTableCell">
-        Returns information about a filter in a pipeline. The C function is a 
-        macro: see <a href="../RM/APICompatMacros.html">“API 
-        Compatibility Macros in HDF5.”</a>
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Pget_filter_by_id<br>h5pget_filter_by_id_f</code> 
-    </td>
-    <td class="functTableCell">
-        Returns information about the specified filter. The C function is a 
-        macro: see <a href="../RM/APICompatMacros.html">“API 
-        Compatibility Macros in HDF5.”</a>
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Pget_nfilters<br>h5pget_nfilters_f</code> 
-    </td>
-    <td class="functTableCell">
-        Returns the number of filters in the pipeline.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Pmodify_filter<br>h5pmodify_filter_f</code> 
-    </td>
-    <td class="functTableCell">
-        Modifies a filter in the filter pipeline.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Premove_filter<br>h5premove_filter_f</code> 
-    </td>
-    <td class="functTableCell">
-        Deletes one or more filters in the filter pipeline.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Pset_deflate<br>h5pset_deflate_f</code> 
-    </td>
-    <td class="functTableCell">
-        Sets the deflate (GNU gzip) compression method and compression level.
-    </td>
-  </tr>
-
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Pset_filter<br>h5pset_filter_f</code> 
-    </td>
-    <td class="functTableCell">
-        Adds a filter to the filter pipeline.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Pset_fletcher32<br>h5pset_fletcher32_f</code> 
-    </td>
-    <td class="functTableCell">
-        Sets up use of the Fletcher32 checksum filter.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Pset_fletcher32<br>h5pset_fletcher32_f</code> 
-    </td>
-    <td class="functTableCell">
-        Sets up use of the Fletcher32 checksum filter.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Pset_link_phase_change<br>h5pset_link_phase_change_f</code> 
-    </td>
-    <td class="functTableCell">
-        Sets the parameters for conversion between compact and dense groups.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Pget_link_phase_change<br>h5pget_link_phase_change_f</code> 
-    </td>
-    <td class="functTableCell">
-        Queries the settings for conversion between compact and dense groups. 
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Pset_est_link_info<br>h5pset_est_link_info_f</code> 
-    </td>
-    <td class="functTableCell">
-        Sets estimated number of links and length of link names in a group. 
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Pget_est_link_info<br>h5pget_est_link_info_f</code> 
-    </td>
-    <td class="functTableCell">
-        Queries data required to estimate required local heap or object header size. 
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Pset_nlinks<br>h5pset_nlinks_f</code> 
-    </td>
-    <td class="functTableCell">
-        Sets maximum number of soft or user-defined link traversals. 
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Pget_nlinks<br>h5pget_nlinks_f</code> 
-    </td>
-    <td class="functTableCell">
-        Retrieves the maximum number of link traversals. 
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Pset_link_creation_order<br>h5pset_link_creation_order_f</code> 
-    </td>
-    <td class="functTableCell">
-        Sets creation order tracking and indexing for links in a group. 
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Pget_link_creation_order<br>h5pget_link_creation_order_f</code> 
-    </td>
-    <td class="functTableCell">
-        Queries whether link creation order is tracked and/or indexed in a group. 
-    </td>
-  </tr>
-    <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Pset_create_intermediate_group<br>h5pset_create_inter_group_f</code> 
-    </td>
-    <td class="functTableCell">
-        Specifies in the property list whether to create missing intermediate 
-        groups. 
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableCell">
-        <code>H5Pget_create_intermediate_group<br>(none)</code> 
-    </td>
-    <td class="functTableCell">
-        Determines whether the property is set to enable creating missing 
-        intermediate groups. 
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td colspan=1
-        rowspan=1
-        class="functTableCell">
-        <code>H5Pset_char_encoding<br>h5pset_char_encoding_f</code> 
-    </td>
-    <td colspan=1
-        rowspan=1
-        class="functTableCell">
-        Sets the character encoding used to encode a string. 
-        Use to set ASCII or UTF-8 character encoding for object names.
-    </td>
-  </tr>
-  <tr valign="top"> 
-    <td class="functTableBottom">
-	<code>H5Pget_char_encoding<br>h5pget_char_encoding_f</code> 
-    </td>
-    <td class="functTableBottom">
-        Retrieves the character encoding used to create a string. 
-    </td>
-  </tr>
-</table>
-<br />
-
-
-
-
-   <!-- NEW PAGE -->
-  <a name="NotesForAdvancedLinkUsers">
-<h3 class=pagebefore>6.6. Notes for Advanced Link Users</h3>
-  </a>
-  <p>The purpose of this section is to provide extra information about 
-  links.</p>
-  
-  <a name="LinkIndexingAndCompactGroupStorage">
-<h4>6.6.1. Link Indexing and Compact Group Storage </h4>
-  </a>
-  
-  <p>In HDF5 Release 1.8.0, a second link indexing and group storage 
-  format was added. The new format enables more efficient compact storage 
-  for very small groups, improved link indexing for large groups, 
-  and other advanced features. The original link indexing format - links 
-  are stored in a B-tree in the group’s local heap - remains the 
-  default. The new implementation is required for external and user-defined 
-  links and also enables the use of link names consisting of non-ASCII 
-  character sets. For more information, see the “Group Implementations 
-  in HDF5” section in the “H5G: Group Interface” section 
-  in the <a href="../RM/RM_H5Front.html" target="RMwindow"><cite>HDF5 
-  Reference Manual</cite></a>.</p>
-
-
-  
-  
-  <a name="ReferenceCount">
-<h4>6.6.2. Reference Count</h4>
-  </a>
-  
-  <p>The library maintains for each object a count of the number of 
-  hard links that have the object as their target. This is the 
-  reference count. When the object is created, a hard link is also 
-  created, and the reference count for the object is set to one. The 
-  reference count for an object is incremented or decremented each time 
-  a hard link with the object as the target is created or deleted. If an 
-  object becomes the target of a symbolic link, the reference count will 
-  not be changed. Objects that have a reference count of zero are eligible 
-  for deletion. If the reference count goes to zero, the library does not 
-  immediately remove the object. The object will be removed during the 
-  next running of the <code>h5repack</code> tool. For more information on 
-  the reference count, see the <code>H5Oincr_refcount</code> function call 
-  in the <a href="../RM/RM_H5Front.html" target="RMwindow">
-  <cite>HDF5 Reference Manual</cite></a>. </p>
-
-  <a name="IdentifiersAndLinkPaths">
-<h4>6.6.3. Identifiers and Link Paths</h4>
-  </a>
-  
-  <p>Identifiers are generated and returned to an application when a 
-  group or file is created or opened. Identifiers are then used in the 
-  <code>loc_id</code> parameter along with link paths in the 
-  <code>name</code> parameter of function calls to create or open other 
-  groups and links. Link paths can be either absolute or relative. The 
-  purpose of this section is to describe the possible kinds of identifiers 
-  and the appropriate link path type for each kind of identifier.  </p>
-  
-  <p><b>File identifier and absolute link path.</b> When a file is created 
-  or opened by an application, a file identifier is returned. When the 
-  file identifier is used in a function call, the name parameter should 
-  specify an absolute link path. With the file identifier and an absolute 
-  link path, the function call will be able to identify the file to work 
-  on and the location of the object from the root group. To operate on 
-  the root group, use a file identifier and a slash, <code>/</code>. </p>
-  
-  <p><b>Group identifer and relative link path.</b> When a group is created 
-  or opened, a group identifier is returned. When the group identifier is 
-  used in a function call, the <code>name</code> parameter can specify 
-  either a relative link path or an absolute link path. With the group 
-  identifier and a relative link path, the function call will be able 
-  to identify the group and the location of the object from the group. 
-  With the group identifier and an absolute link path, the function 
-  call will be able to identify the file to work on and the location 
-  of the object from the root group.</p>
-
-  <p><b>Any identifier and absolute link path.</b> With any identifier 
-  and an absolute link path, a function call can create or open a group 
-  or link that is not connected to the identifier. The function call 
-  uses the identifier to specify the file to work in and uses the 
-  absolute link path to specify the link to the created or opened 
-  group or dataset from the root group.</p>
-  
-  
-<table align="center" width="500" class="greenframe2">
-  <tr ><td>
-      <p><b>Programming reminder</b></p>
-      
-      <p>An application should track every identifier that has been 
-      returned to it. When the application is finished using the resource 
-      that is associated with the identifier, the identifier should be 
-      released by closing the resource. For example, use 
-      <code>H5Gclose</code> to close a group, or use <code>H5Oclose</code> 
-      to close an object. See <a href="#ClosingAGroup">“Closing a 
-      Group”</a> for more information. </p>
-    </td>
-    </tr>
-  </table>
- 
-  
-  
-  
-  <a name="MovingOrRenamingAnObject">
-<h4>6.6.4. Moving or Renaming an Object</h4>
-  </a>
-  
-  <p>When we talk about renaming or moving an object, we do not actually 
-  rename or move the object. An object does not have a name: the name 
-  comes from a link. An object cannot be moved. When the object is created, 
-  it is put in a permanent location in the file. What changes is the 
-  link path to the object. </p>
-  
-  <p>One way to rename or move an object is to use the 
-  <code>H5Lmove</code> function call. This function call will delete the 
-  existing link and create a new link in one operation. </p>
-  
-  <p>Another way to rename or move an object is to use the 
-  <code>H5Ldelete</code> function call and one of the 
-  <code>H5Lcreate_*</code> function calls. These function calls will delete 
-  the existing link and create a new link. </p>
-
-  <p>Exercise caution in the use of <code>H5Lmove</code> and 
-  <code>H5Ldelete</code> as these functions each include a step that 
-  deletes a link to an object. If the link that is removed is the only 
-  hard link to the object, that object will become permanently inaccessible 
-  in the file. </p>
-
-  <p>Scenario 1: Removing the last link</p>
-  <p>To avoid removing the last link to an object or otherwise making an 
-  object inaccessible, use the <code>H5Oget_info</code> 
-  function. Confirm that the value of the reference count field (rc) is 
-  greater than 1. </p>
-
-  <p>Scenario 2: Moving a link that isolates an object</p>
-  <p>Consider the following example. Assume that the group that is the 
-  target of the <code>group2</code> link can only be accessed via the 
-  following absolute link path: <code>/top_group/group1/group2/</code>.</p>
-
-  <p>Suppose <code>H5Lmove</code> is used to move <code>top_group</code> 
-  to the group that is the target of the <code>group2</code> link. 
-  Since <code>top_group</code> was the only route from the root group to 
-  <code>group1</code> (the group that is the target of the 
-  <code>group1</code> link), there is no longer a path by which we can access 
-  <code>group1</code>, <code>group2</code>, or any member datasets. 
-  And since <code>top_group</code> is now a member of <code>group2</code>,
-  <code>top_group</code> itself and any member datasets have thereby also 
-  become inaccessible.</p>
-  
-  <p>For more information on any of these functions, see the 
-  <a href="../RM/RM_H5Front.html" target="RMwindow"><cite>HDF5 
-  Reference Manual</cite></a>.</p>
-
-
-  
-
-  
-  
-  <a name="StrongAndWeakLinks">
-<h4>6.6.5. Strong and Weak Links</h4>
-  </a>
-  <p>Hard links have a physical address in a file and are kept track of 
-  through the reference count. Symbolic links are known by name and 
-  do not effect the reference count for an object. User-defined links 
-  blur this neat division of links into hard and symbolic types. A 
-  user-defined link might be built so that it changes the reference 
-  count like a hard link and so that it can dangle like a symbolic link.</p>
-  
-  <p>In addition to hard and symbolic links, it might be also be useful 
-  to think about links as being strong or weak. A strong link effects 
-  the reference count of an object. Deleting the last strong link would 
-  make the object inaccessible. A hard link would be a strong link as 
-  would any user-defined link that effected the reference count. A weak 
-  link does not effect the reference count of an object. A weak link 
-  would be more flexible and ambiguous like symbolic links. </p>
-  
-  
-
-  
-
-
-
-<!-- HEADER RIGHT " " -->
-  
-</body>
-</html>
-
diff --git a/html/UG/OldHtmlSource/OldHtmlSource/UG_nav11Datatypes.html b/html/UG/OldHtmlSource/OldHtmlSource/UG_nav11Datatypes.html
deleted file mode 100755
index 8c8492e..0000000
--- a/html/UG/OldHtmlSource/OldHtmlSource/UG_nav11Datatypes.html
+++ /dev/null
@@ -1,298 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-<body bgcolor="d2e6ef">
-
-
-<!--
-<A HREF="READ1ST.HTML" Target="RdFirstWin" 
-    onClick="window.open("READ1ST.HTML","RdFirstWin","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=yes,resizable=1,width=500,height=250,titlebar=yes")">
-    <IMG SRC="GRAPHICS/READ1ST.GIF" BORDER=0 ALT="Read this first!"></A>
--->
-
-<font size="-1">
-<br />
-<!-- editingComment
-<div align=right>
-  ( <a href="UG_nav01.html">Expand TOC</a> )
-</div>
--->
-
-<a href="UG_front.html" TARGET="CONTENT">Title Page</a>
-<br />
-<a href="../Copyright.html" TARGET="CONTENT">Copyright</a>
-
-<!-- editingComment
-<br />
-(<a href="../H5_UG_Outline.pdf" TARGET="CONTENT">Complete outline</a>)
-
-<br />
-<br />
-(<a href="UG_feedback.html" TARGET="CONTENT">Feedback</a>)
-
-<br />
-(<a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/index.html#H5_NewUG" TARGET="CONTENT">doc_dev_snapshot</a>)
--->
-</font>
-<hr />
-<hr />
-
-<!--
-<a href="UG_front.html" TARGET="CONTENT"><IMG SRC="GRAPHICS/COVER.GIF" BORDER=0 ALT="HDF5 UG title page"></a><br />
--->
-
-<div align="center">
-<b>HDF5 User's Guide<br />Table of Contents</b>
-    <br />
-    <a href="UG_UpdateStatus.html" TARGET="CONTENT"><font size="-1"><i>Update Status</i></font></a>
-</div>
-<p>
-
-<!-- editingComment
-    <font color="#555555">
-    <a href="01_Intro.html" TARGET="CONTENT">Introduction</a>
-    </font>
-    <br />
-    -->
-
-<b>I. The Broad View</b>
-    <font color="#555555">
-<!-- editingComment
-      <br />  
-    <a href="02_WhatIs.html" TARGET="CONTENT">What is HDF5?</a>
--->
-      <br />  
-    <a href="UG_frame03DataModel.html" TARGET="_TOP">Data Model &</a>
-          <br />     
-          <a href="UG_frame03DataModel.html" TARGET="_TOP">File Structure</a>
-      <br />  
-    <a href="UG_frame04ProgModel.html" TARGET="_TOP">HDF5 Library &</a>
-          <br />     
-          <a href="UG_frame04ProgModel.html" TARGET="_TOP">Programming Model</a>
-    </font>
-
-<br />
-<b>II. Using HDF5 —<br />
-             The Specifics</b>
-    <font color="#555555">
-      <br />  
-<!-- editingComment
-    <a href="05_Quick.html" TARGET="CONTENT">Quick Start</a>
-      <br />  
-    <a href="06_Naming.html" TARGET="CONTENT">API Struture &</a>
-          <br />     
-          <a href="06_Naming.html" TARGET="CONTENT">Naming Conventions</a>
-      <br />  
-    <a href="07_DocSet.html" TARGET="CONTENT">Document Set</a>
-      <br />  
--->
-    <a href="UG_frame08TheFile.html" TARGET="_TOP">The File</a>
-      <br />  
-    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups</a> 
-<!--    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups and Links</a> 
--->
-      <br />  
-    <a href="UG_frame10Datasets.html" TARGET="_TOP">Datasets</a> 
-      <br />  
-<!--
-    <a href="UG_frameObjectsIdentifiers.html" TARGET="_TOP">Objects and 
-      Identifiers</a> 
-      <br />  
--->
-    <a href="UG_frame11Datatypes.html" TARGET="_TOP">Datatypes</a> 
-      
-      <font size="-1">
-      <br />      
-        <a href="11_Datatypes.html#Intro" TARGET="CONTENT">
-          Introduction</a>
-      <br />      
-        <a href="11_Datatypes.html#DtypesUsed" TARGET="CONTENT">
-          Datatype Usage</a>
-      <br />      
-        <a href="11_Datatypes.html#FileFunctSums" TARGET="CONTENT">
-          Function Summaries</a>
-      <br />      
-        <a href="11_Datatypes.html#Pmodel" TARGET="CONTENT">
-          Programming Model</a>
-      <br />      
-        <a href="11_Datatypes.html#NonNumDtypes" TARGET="CONTENT">
-          Non-numeric</a>
-      <br />        
-        <a href="11_Datatypes.html#NonNumDtypes" TARGET="CONTENT">
-          Datatypes</a>
-      <br />      
-        <a href="11_Datatypes.html#Fvalues" TARGET="CONTENT">
-          Fill Values</a>
-      <br />      
-        <a href="11_Datatypes.html#CCDtypes" TARGET="CONTENT">
-          Compound Datatypes</a>
-      <br />      
-        <a href="11_Datatypes.html#LCDtypeObj" TARGET="CONTENT">
-          Datatype Life Cycle</a>
-      <br />      
-        <a href="11_Datatypes.html#Dtransfer" TARGET="CONTENT">
-          Data Transfer</a>
-      <br />      
-        <a href="11_Datatypes.html#TextDescriptions" TARGET="CONTENT">
-          Text <–> Datatype</a>
-      <br />        
-        <a href="11_Datatypes.html#TextDescriptions" TARGET="CONTENT">
-          Conversions</a>
-      </font>
-      <br />  
-  
-    <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Dataspaces &</a>
-          <br />     
-          <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Partial I/O</a> 
-
-      <br />  
-    <a href="UG_frame13Attributes.html" TARGET="_TOP">Attributes</a>
-    
-      <br />  
-    <a href="UG_frame13ErrorHandling.html" TARGET="_TOP">Error Handling</a>
-  
-      <br />  
-    <a href="UG_frame14PropertyLists.html" TARGET="_TOP">Property Lists</a> 
-     
-<!--
-      <br />  
-    Images & Palettes
-      <br />  
-    Discarding Objects
-      <br />  
-    <a href="17_Filters.html" TARGET="CONTENT">Filters</a>
-      <br />  
-    Miscellaneous
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/VFL-clip-020924DRAFT.pdf" TARGET="CONTENT">VFL</a> (early clip) 
--->
-    </font>
-<br />
-<b>III. <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Additional Resources</a>
-      </b><br />
-<b>IV. <a href="http://www.hdfgroup.org/HDF5/examples/" 
-    TARGET="CONTENT">Code Examples</a></b><br />
-
-    <font color="#555555">
-<!-- NEED TO WRITE PER CH, CREATE UG_frame18Performance.html, AND LINK IT IN
-      <br />  
-      <a href="UG_frame18Performance.html" TARGET="_TOP">Performance</a>
-      <br />  
-      <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Special Topics</a>
-      <br />  
-      <a href="../ddl.html" TARGET="H5DocWin">DDL in BNF</a><br />
-            
-        <a href="../ddl.html" TARGET="H5DocWin">for HDF5</a><br />
-        
-      <a href="99_SelectedPassages.html" TARGET="CONTENT">Selected Passages</a><br />
-      <br />  
-    Higher Levels
-      <br />  
-    <a href="20_Parallel.html" TARGET="CONTENT">Parallel Environments</a>
--->
-<!-- editingComment
-      <br />  
-    Parallel Environments
-          <br />     
-          (in progress) 
--->
-<!--
-      <br />  
-    <a href="21_Perform.html" TARGET="CONTENT">Performance</a>
-      <br />  
-    Non-C Languages
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/H5UG-Cpplus-001221.pdf" TARGET="CONTENT">C++ User Notes</a>
--->
-<!--
-      <br />  
-    <a href="23_DDL.html" TARGET="CONTENT">DDL in BNF</a>
-      <br />  
-    <a href="24_XML-DTD.html" TARGET="CONTENT">XML DTD</a>
--->
-    </font>
-
-<!--
-<br />
-<b>IV. Tools</b>
-    <font color="#555555">
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5ls</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5dump</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5repart</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5toh4</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h4toh5</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">Java Tools</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">XML Tools</a>
-    </font>
--->
-
-<!--
-<br />
-<b>Appendices</b>
-    <font color="#555555">
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_PredefDTypes.html" TARGET="CONTENT">Predefined Datatypes</a>
-      <br />  
-    H4-to-H5 Mapping
-      <br />  
-    H5-to-H4 Mapping
-      <br />  
-    <a href="99_TechSupport.html" TARGET="CONTENT">Technical Support</a>
-      <br />
-    </font>
- -->
-
-
-<hr />
-
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-<!-- <small><i>Printable 
-    <a href="http://www.hdfgroup.org/HDF5/doc/PSandPDF/HDF5_UsersGuide.PDF" TARGET="CONTENT">PDF</a> 
-    of this User’s Guide</i></small>
-<hr />
--->
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-
-<div align="center">
-<b>Other HDF5 documents</b>
-</div>
-<br />
-
-
-<a href="../index.html" TARGET="H5DocWin">Full HDF5 doc set</a> for<br />
-       
-  the current release<br />
-
-<a href="../H5.intro.html" TARGET="H5DocWin"><cite>Introduction to HDF5</cite></a><br />
-
-<a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>HDF5 Reference</cite></a><br />
-      
-  <a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>Manual</cite></a><br />
-
-<a href="../H5.user.html" TARGET="H5DocWin"><cite>HDF5 Release 1.4.5</cite></a><br />
-      
-  <a href="../H5.user.html" TARGET="H5DocWin"><cite>User's Guide</cite></a>
-
-
-<hr />
-
-</body>
-</html>
-
diff --git a/html/UG/OldHtmlSource/Part1SplitterPg.html b/html/UG/OldHtmlSource/Part1SplitterPg.html
deleted file mode 100755
index dcc94b0..0000000
--- a/html/UG/OldHtmlSource/Part1SplitterPg.html
+++ /dev/null
@@ -1,20 +0,0 @@
-
-<html>
-<head>
-<title>Part I: The Broad View</title>
-</head>
-
-<body>
-<!-- HEADER RIGHT " " -->
-<br><br><br><br>
-<hr>
-<br><br>
-<h1 align="center"><font size="+6">Part I</font></h1>
-<br>
-<hr><hr>
-<br><br><br>
-<p align="center"><font size="+2">The Broad View</font></p>
-
-
-</body>
-</html>
\ No newline at end of file
diff --git a/html/UG/OldHtmlSource/Part2SplitterPg.html b/html/UG/OldHtmlSource/Part2SplitterPg.html
deleted file mode 100755
index 949e74d..0000000
--- a/html/UG/OldHtmlSource/Part2SplitterPg.html
+++ /dev/null
@@ -1,20 +0,0 @@
-
-<html>
-<head>
-<title>Part II: The Specifics</title>
-</head>
-
-<body>
-<!-- HEADER RIGHT " " -->
-<br><br><br><br>
-<hr>
-<br><br>
-<h1 align="center"><font size="+6">Part II</font></h1>
-<br>
-<hr><hr>
-<br><br><br>
-<p align="center"><font size="+2">The Specifics</font></p>
-
-
-</body>
-</html>
\ No newline at end of file
diff --git a/html/UG/OldHtmlSource/Part3SplitterPg.html b/html/UG/OldHtmlSource/Part3SplitterPg.html
deleted file mode 100755
index c42267a..0000000
--- a/html/UG/OldHtmlSource/Part3SplitterPg.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-<html>
-<head>
-<title>Part III: Additional Resources</title>
-</head>
-
-<body>
-
-<!-- HEADER RIGHT " " -->
-<br><br><br><br>
-<hr>
-<br><br>
-<h1 align="center"><font size="+6">Part III</font></h1>
-<br>
-<hr><hr>
-<br><br><br>
-<p align="center"><font size="+2">Additional Resources</font></p>
-
-
-</body>
-</html>
\ No newline at end of file
diff --git a/html/UG/OldHtmlSource/UG_UpdateStatus.html b/html/UG/OldHtmlSource/UG_UpdateStatus.html
deleted file mode 100644
index 2929357..0000000
--- a/html/UG/OldHtmlSource/UG_UpdateStatus.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<html>
-<head>
-<title>Update Status</title>
-</head>
-
-<body>
-
-<h1 align="center">HDF5 User’s Guide Update Status</h1>
-
-<br />
-<p>The <cite>HDF5 User’s Guide</cite> has been updated 
-for HDF5 Release 1.8.13. These updates have been made since the 1.8.12 
-version of this document was published in November 2013.</p>
-
-<p>The main updates are the following:</p>
-    <ul>
-        <li>The “Properties and Property Lists in HDF5” 
-        chapter was added. This chapter gives a general overview of 
-        how property lists are used by the HDF5 Library.</li>
-        <li>The 
-        <a href="../Advanced/FreeingMemory/FreeingMemoryAllocatedByTheHdf5Library.pdf">
-        <em>Freeing Memory Allocated by the HDF5 Library</em></a> 
-        topic was added to the “Additional Resources” chapter. 
-        This topic describes how inconsistent memory management can 
-        cause heap corruption or resource leaks and possible solutions.</li>
-        <li>The 
-        <a href="../Advanced/ModifiedRegionWrites/ModifiedRegionWrites.pdf">
-        <em>Modified Region Writes</em></a> topic was added to the 
-        “Additional Resources” chapter. This topic describes 
-        how to set write operations for in-memory files so that only 
-        modified regions are written to storage. This feature is 
-        available when the Core (Memory) VFD is used.</li>
-        
-    </ul>
-
-<p>We welcome feedback on the documentation. Please send your comments to 
-<a href="mailto:docs at hdfgroup.org"><code>docs at hdfgroup.org</code></a>.
-</p>
-<br />
-<div align="left"><font color="999999" size="-1"><i>
-    Last modified: 9 May 2014
-    </i></font></div>
-    
-
-</body>
-</html>
diff --git a/html/UG/OldHtmlSource/UG_UseWith18.html b/html/UG/OldHtmlSource/UG_UseWith18.html
deleted file mode 100644
index 3a8b61a..0000000
--- a/html/UG/OldHtmlSource/UG_UseWith18.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<html>
-<head>
-<title>Using This Guide with HDF5 Release 1.8.x</title>
-</head>
-
-<body>
-
-<h1>Using This Guide with HDF5 Release 1.8.x</h1>
-
-
-Several sections describing new features introduced with HDF5 Release 1.8.x
-have been added to this <cite>HDF5 User's Guide</cite>:
-<ul>
-    <li>N-bit and scale/offset filters, in the chapter
-        “<a href="10_Datasets.html">HDF5 Datasets</a>”
-    <li>New Error API functions, H5E, in the chapter
-        “<a href="13_ErrorHandling.html">HDF5 Error Handling</a>”
-    <li>Metadata caching, in the chapter
-        “<a href="17_SpecialTopics.html">Special Topics</a>”
-</ul>
-
-<p>
-Other work to bring the <cite>Guide</cite> up to date with 
-the HDF5 Release 1.8.x series remains to be done.
-Readers should keep the following things in mind:
-<ul>
-    <li>Principles and models described in the <cite>Guide</cite> 
-        remain applicable to the 1.8.x series.
-    <li>The function summaries in several chapters are incomplete for
-        the 1.8.x series.  Refer to the 
-        <a href="../RM/RM_H5Front.html"><cite>HDF5 Reference Manual</cite></a>
-        for complete lists.
-    <li>Code examples use function syntax from the 1.6.x release series.
-        See the note below regarding the use of 1.6.x syntax with a
-        1.8.x version of the HDF5 Library.
-</ul>
-   
-<p> 
-<hr>
-<h3>Using 1.6.x syntax with the 1.8.x library</h3>
-
-HDF5 Release 1.8.x includes an API compatibility feature that enables 
-codes written with 1.6.x function syntax to be compiled against and 
-linked with an HDF5 Release 1.8.x Library.
-
-<p>
-When working with an installed version of the HDF5 Library that has 
-been built with default settings, use the
-<a href="../RM/Tools.html#Tools-H5CC"><code>h5cc</code></a> 
-script and the <code>-DH5_USE_16_API</code> flag
-to compile and link your C program as follows:
-<pre>
-    h5cc <<i>other_instructions</i>> -DH5_USE_16_API . . .
-</pre>
-A comparable script,
-<a href="../RM/Tools.html#Tools-H5FC"><code>h5fc</code></a>, 
-is provided for Fortran programs.
-<!-- FOR USE WITH PRINT VERSION ----------------------------------------
-<code>h5cc</code> and <code>h5fc</code> are described 
-in the “Tools” section 
-of the <cite>HDF5 Reference Manual</cite>.
-<!-- FOR USE WITH PRINT VERSION ---------------------------------------->
-
-<p>
-For further details or alternate approaches, see 
-“<a href="../RM/APICompatMacros.html">API Compatibility Macros 
-in HDF5</a>.”
-
-</body>
-</html>
diff --git a/html/UG/OldHtmlSource/UG_feedback.html b/html/UG/OldHtmlSource/UG_feedback.html
deleted file mode 100644
index 0b82f80..0000000
--- a/html/UG/OldHtmlSource/UG_feedback.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<HTML>
-<head>
-
-<!--( Begin styles definition )=====================================-->
-<link href="ed_styles/NewUGelect.css" rel="stylesheet" type="text/css">
-<!--( End styles definition )=======================================-->
-
-</head>
-<BODY>
-
-<div align=center>
-<br>
-<br>
-<h1>HDF5 User's Guide</h1>
-<br>
-<font color=#CC4444>
-<i>
-<h2>Working Draft
-    <br><Date>
-    <br>
-
-<hr>
-<br><br>
-    <br> The HDF Group
-    <br> Contact: Frank Baker
-    </i>
-    <br><code>fbaker at hdfgroup.org</code>
-    <br>
-    <br>
-
-    
-    <table width=400 border="0">
-    <tr align=left><td>
-        
-    <p class="editingComment">
-    <font color=#CC4444>
-    This is a working draft of the new <cite>HDF5 User's Guide</cite> 
-    and your input will be very important to the improvement of this
-    and future versions.  
-    <p class="editingComment">
-    <font color=#CC4444>
-    Please send comments, suggestions, etc. to Frank Baker at
-    <a href="mailto:fbaker at hdfgroup.org"><code>fbaker at hdfgroup.org</code></a>.
-    <p class="editingComment">
-    <font color=#CC4444>
-    Thanks!
-    </font>
-    </td></tr></table>
-    
-    
-</font>
-</div>
-
-</BODY>
-</HTML>
diff --git a/html/UG/OldHtmlSource/UG_frame.html b/html/UG/OldHtmlSource/UG_frame.html
deleted file mode 100644
index ac0498f..0000000
--- a/html/UG/OldHtmlSource/UG_frame.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-
-<frameset cols="200,*" border=0>
-  <frame src="UG_nav00.html" scrolling="auto" name="BUTTONS">
-  <frame src="UG_front.html" scrolling="auto" name="CONTENT">
-</frameset>
-
-<noframes>
-  <b>HDF5 User's Guide</b>
-  <p>
-  This document is designed to be viewed via a frames-capable browser 
-  with frames enabled.
-  If you are reading this message, either your browser is not capable of
-  displaying framed data or its frames capability has been disabled.
-  <p>
-  Some readers may bypass frames deliberately.  If that is your case,
-  see the <cite>HDF5 User's Guide</cite> navigation bar; this file 
-  normally appears in a separate frame and provides links to 
-  current chapters and drafts:
-  <ul>
-    <li><a href="UG_nav00.html"><cite>HDF5 User's Guide</cite> 
-        navigation bar</a>
-  </ul>
-
-<!--
-  Release 4.0 or higher of either Netscape Communicator 
-  or Microsoft Internet Explorer or an equivalent browser.
--->
-
-</noframes>
-
-
-</html>
diff --git a/html/UG/OldHtmlSource/UG_frame03DataModel.html b/html/UG/OldHtmlSource/UG_frame03DataModel.html
deleted file mode 100755
index dcc5853..0000000
--- a/html/UG/OldHtmlSource/UG_frame03DataModel.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-
-<frameset cols="200,*" border=0>
-  <frame src="UG_nav03DataModel.html" scrolling="auto" name="BUTTONS">
-  <frame src="03_DataModel.html" scrolling="auto" name="CONTENT">
-</frameset>
-
-<noframes>
-  <b>HDF5 User's Guide</b>
-  <p>
-  This document is designed to be viewed via a frames-capable browser 
-  with frames enabled.
-  If you are reading this message, either your browser is not capable of
-  displaying framed data or its frames capability has been disabled.
-  <p>
-  Some readers may bypass frames deliberately.  If that is your case,
-  see the <cite>HDF5 User's Guide</cite> navigation bar; this file 
-  normally appears in a separate frame and provides links to 
-  current chapters and drafts:
-  <ul>
-    <li><a href="UG_nav00.html"><cite>HDF5 User's Guide</cite> 
-        navigation bar</a>
-  </ul>
-
-<!--
-  Release 4.0 or higher of either Netscape Communicator 
-  or Microsoft Internet Explorer or an equivalent browser.
--->
-
-</noframes>
-
-
-</html>
diff --git a/html/UG/OldHtmlSource/UG_frame04ProgModel.html b/html/UG/OldHtmlSource/UG_frame04ProgModel.html
deleted file mode 100755
index bcf7cdf..0000000
--- a/html/UG/OldHtmlSource/UG_frame04ProgModel.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-
-<frameset cols="200,*" border=0>
-  <frame src="UG_nav04ProgModel.html" scrolling="auto" name="BUTTONS">
-  <frame src="04_ProgModel.html" scrolling="auto" name="CONTENT">
-</frameset>
-
-<noframes>
-  <b>HDF5 User's Guide</b>
-  <p>
-  This document is designed to be viewed via a frames-capable browser 
-  with frames enabled.
-  If you are reading this message, either your browser is not capable of
-  displaying framed data or its frames capability has been disabled.
-  <p>
-  Some readers may bypass frames deliberately.  If that is your case,
-  see the <cite>HDF5 User's Guide</cite> navigation bar; this file 
-  normally appears in a separate frame and provides links to 
-  current chapters and drafts:
-  <ul>
-    <li><a href="UG_nav00.html"><cite>HDF5 User's Guide</cite> 
-        navigation bar</a>
-  </ul>
-
-<!--
-  Release 4.0 or higher of either Netscape Communicator 
-  or Microsoft Internet Explorer or an equivalent browser.
--->
-
-</noframes>
-
-
-</html>
diff --git a/html/UG/OldHtmlSource/UG_frame08TheFile.html b/html/UG/OldHtmlSource/UG_frame08TheFile.html
deleted file mode 100755
index 304b115..0000000
--- a/html/UG/OldHtmlSource/UG_frame08TheFile.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-
-<frameset cols="200,*" border=0>
-  <frame src="UG_nav08TheFile.html" scrolling="auto" name="BUTTONS">
-  <frame src="08_TheFile.html" scrolling="auto" name="CONTENT">
-</frameset>
-
-<noframes>
-  <b>HDF5 User's Guide</b>
-  <p>
-  This document is designed to be viewed via a frames-capable browser 
-  with frames enabled.
-  If you are reading this message, either your browser is not capable of
-  displaying framed data or its frames capability has been disabled.
-  <p>
-  Some readers may bypass frames deliberately.  If that is your case,
-  see the <cite>HDF5 User's Guide</cite> navigation bar; this file 
-  normally appears in a separate frame and provides links to 
-  current chapters and drafts:
-  <ul>
-    <li><a href="UG_nav00.html"><cite>HDF5 User's Guide</cite> 
-        navigation bar</a>
-  </ul>
-
-<!--
-  Release 4.0 or higher of either Netscape Communicator 
-  or Microsoft Internet Explorer or an equivalent browser.
--->
-
-</noframes>
-
-
-</html>
diff --git a/html/UG/OldHtmlSource/UG_frame09Groups.html b/html/UG/OldHtmlSource/UG_frame09Groups.html
deleted file mode 100644
index bccf32f..0000000
--- a/html/UG/OldHtmlSource/UG_frame09Groups.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-
-<frameset cols="200,*" border=0>
-  <frame src="UG_nav09Groups.html" scrolling="auto" name="BUTTONS">
-  <frame src="09_Groups.html" scrolling="auto" name="CONTENT">
-</frameset>
-
-<noframes>
-  <b>HDF5 User's Guide</b>
-  <p>
-  This document is designed to be viewed via a frames-capable browser 
-  with frames enabled.
-  If you are reading this message, either your browser is not capable of
-  displaying framed data or its frames capability has been disabled.
-  <p>
-  Some readers may bypass frames deliberately.  If that is your case,
-  see the <cite>HDF5 User's Guide</cite> navigation bar; this file 
-  normally appears in a separate frame and provides links to 
-  current chapters and drafts:
-  <ul>
-    <li><a href="UG_nav00.html"><cite>HDF5 User's Guide</cite> 
-        navigation bar</a>
-  </ul>
-
-<!--
-  Release 4.0 or higher of either Netscape Communicator 
-  or Microsoft Internet Explorer or an equivalent browser.
--->
-
-</noframes>
-
-
-</html>
diff --git a/html/UG/OldHtmlSource/UG_frame10Datasets.html b/html/UG/OldHtmlSource/UG_frame10Datasets.html
deleted file mode 100755
index dba2b31..0000000
--- a/html/UG/OldHtmlSource/UG_frame10Datasets.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-
-<frameset cols="200,*" border=0>
-  <frame src="UG_nav10Datasets.html" scrolling="auto" name="BUTTONS">
-  <frame src="10_Datasets.html" scrolling="auto" name="CONTENT">
-</frameset>
-
-<noframes>
-  <b>HDF5 User's Guide</b>
-  <p>
-  This document is designed to be viewed via a frames-capable browser 
-  with frames enabled.
-  If you are reading this message, either your browser is not capable of
-  displaying framed data or its frames capability has been disabled.
-  <p>
-  Some readers may bypass frames deliberately.  If that is your case,
-  see the <cite>HDF5 User's Guide</cite> navigation bar; this file 
-  normally appears in a separate frame and provides links to 
-  current chapters and drafts:
-  <ul>
-    <li><a href="UG_nav00.html"><cite>HDF5 User's Guide</cite> 
-        navigation bar</a>
-  </ul>
-
-<!--
-  Release 4.0 or higher of either Netscape Communicator 
-  or Microsoft Internet Explorer or an equivalent browser.
--->
-
-</noframes>
-
-
-</html>
diff --git a/html/UG/OldHtmlSource/UG_frame11Datatypes.html b/html/UG/OldHtmlSource/UG_frame11Datatypes.html
deleted file mode 100755
index 7c0febe..0000000
--- a/html/UG/OldHtmlSource/UG_frame11Datatypes.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-
-<frameset cols="200,*" border=0>
-  <frame src="UG_nav11Datatypes.html" scrolling="auto" name="BUTTONS">
-  <frame src="11_Datatypes.html" scrolling="auto" name="CONTENT">
-</frameset>
-
-<noframes>
-  <b>HDF5 User's Guide</b>
-  <p>
-  This document is designed to be viewed via a frames-capable browser 
-  with frames enabled.
-  If you are reading this message, either your browser is not capable of
-  displaying framed data or its frames capability has been disabled.
-  <p>
-  Some readers may bypass frames deliberately.  If that is your case,
-  see the <cite>HDF5 User's Guide</cite> navigation bar; this file 
-  normally appears in a separate frame and provides links to 
-  current chapters and drafts:
-  <ul>
-    <li><a href="UG_nav00.html"><cite>HDF5 User's Guide</cite> 
-        navigation bar</a>
-  </ul>
-
-<!--
-  Release 4.0 or higher of either Netscape Communicator 
-  or Microsoft Internet Explorer or an equivalent browser.
--->
-
-</noframes>
-
-
-</html>
diff --git a/html/UG/OldHtmlSource/UG_frame12Dataspaces.html b/html/UG/OldHtmlSource/UG_frame12Dataspaces.html
deleted file mode 100755
index 61ae6b3..0000000
--- a/html/UG/OldHtmlSource/UG_frame12Dataspaces.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-
-<frameset cols="200,*" border=0>
-  <frame src="UG_nav12Dataspaces.html" scrolling="auto" name="BUTTONS">
-  <frame src="12_Dataspaces.html" scrolling="auto" name="CONTENT">
-</frameset>
-
-<noframes>
-  <b>HDF5 User's Guide</b>
-  <p>
-  This document is designed to be viewed via a frames-capable browser 
-  with frames enabled.
-  If you are reading this message, either your browser is not capable of
-  displaying framed data or its frames capability has been disabled.
-  <p>
-  Some readers may bypass frames deliberately.  If that is your case,
-  see the <cite>HDF5 User's Guide</cite> navigation bar; this file 
-  normally appears in a separate frame and provides links to 
-  current chapters and drafts:
-  <ul>
-    <li><a href="UG_nav00.html"><cite>HDF5 User's Guide</cite> 
-        navigation bar</a>
-  </ul>
-
-<!--
-  Release 4.0 or higher of either Netscape Communicator 
-  or Microsoft Internet Explorer or an equivalent browser.
--->
-
-</noframes>
-
-
-</html>
diff --git a/html/UG/OldHtmlSource/UG_frame13Attributes.html b/html/UG/OldHtmlSource/UG_frame13Attributes.html
deleted file mode 100755
index 72e71d4..0000000
--- a/html/UG/OldHtmlSource/UG_frame13Attributes.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-
-<frameset cols="200,*" border=0>
-  <frame src="UG_nav13Attributes.html" scrolling="auto" name="BUTTONS">
-  <frame src="13_Attributes.html" scrolling="auto" name="CONTENT">
-</frameset>
-
-<noframes>
-  <b>HDF5 User's Guide</b>
-  <p>
-  This document is designed to be viewed via a frames-capable browser 
-  with frames enabled.
-  If you are reading this message, either your browser is not capable of
-  displaying framed data or its frames capability has been disabled.
-  <p>
-  Some readers may bypass frames deliberately.  If that is your case,
-  see the <cite>HDF5 User's Guide</cite> navigation bar; this file 
-  normally appears in a separate frame and provides links to 
-  current chapters and drafts:
-  <ul>
-    <li><a href="UG_nav00.html"><cite>HDF5 User's Guide</cite> 
-        navigation bar</a>
-  </ul>
-
-<!--
-  Release 4.0 or higher of either Netscape Communicator 
-  or Microsoft Internet Explorer or an equivalent browser.
--->
-
-</noframes>
-
-
-</html>
diff --git a/html/UG/OldHtmlSource/UG_frame13ErrorHandling.html b/html/UG/OldHtmlSource/UG_frame13ErrorHandling.html
deleted file mode 100755
index 3ff42b7..0000000
--- a/html/UG/OldHtmlSource/UG_frame13ErrorHandling.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-
-<frameset cols="200,*" border=0>
-  <frame src="UG_nav13ErrorHandling.html" scrolling="auto" name="BUTTONS">
-  <frame src="13_ErrorHandling.html" scrolling="auto" name="CONTENT">
-</frameset>
-
-<noframes>
-  <b>HDF5 User's Guide</b>
-  <p>
-  This document is designed to be viewed via a frames-capable browser 
-  with frames enabled.
-  If you are reading this message, either your browser is not capable of
-  displaying framed data or its frames capability has been disabled.
-  <p>
-  Some readers may bypass frames deliberately.  If that is your case,
-  see the <cite>HDF5 User's Guide</cite> navigation bar; this file 
-  normally appears in a separate frame and provides links to 
-  current chapters and drafts:
-  <ul>
-    <li><a href="UG_nav00.html"><cite>HDF5 User's Guide</cite> 
-        navigation bar</a>
-  </ul>
-
-<!--
-  Release 4.0 or higher of either Netscape Communicator 
-  or Microsoft Internet Explorer or an equivalent browser.
--->
-
-</noframes>
-
-
-</html>
diff --git a/html/UG/OldHtmlSource/UG_frame14PropertyLists.html b/html/UG/OldHtmlSource/UG_frame14PropertyLists.html
deleted file mode 100755
index b66ba8a..0000000
--- a/html/UG/OldHtmlSource/UG_frame14PropertyLists.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-
-<frameset cols="200,*" border=0>
-  <frame src="UG_nav14PropertyLists.html" scrolling="auto" name="BUTTONS">
-  <frame src="14_PropertyLists.html" scrolling="auto" name="CONTENT">
-</frameset>
-
-<noframes>
-  <b>HDF5 User's Guide</b>
-  <p>
-  This document is designed to be viewed via a frames-capable browser 
-  with frames enabled.
-  If you are reading this message, either your browser is not capable of
-  displaying framed data or its frames capability has been disabled.
-  <p>
-  Some readers may bypass frames deliberately.  If that is your case,
-  see the <cite>HDF5 User's Guide</cite> navigation bar; this file 
-  normally appears in a separate frame and provides links to 
-  current chapters and drafts:
-  <ul>
-    <li><a href="UG_nav00.html"><cite>HDF5 User's Guide</cite> 
-        navigation bar</a>
-  </ul>
-
-<!--
-  Release 4.0 or higher of either Netscape Communicator 
-  or Microsoft Internet Explorer or an equivalent browser.
--->
-
-</noframes>
-
-
-</html>
diff --git a/html/UG/OldHtmlSource/UG_frame17SpecialTopics.html b/html/UG/OldHtmlSource/UG_frame17SpecialTopics.html
deleted file mode 100755
index 4b3f168..0000000
--- a/html/UG/OldHtmlSource/UG_frame17SpecialTopics.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-
-<frameset cols="200,*" border=0>
-  <frame src="UG_nav17SpecialTopics.html" scrolling="auto" name="BUTTONS">
-  <frame src="17_Additional.html" scrolling="auto" name="CONTENT">
-</frameset>
-
-<noframes>
-  <b>HDF5 User's Guide</b>
-  <p>
-  This document is designed to be viewed via a frames-capable browser 
-  with frames enabled.
-  If you are reading this message, either your browser is not capable of
-  displaying framed data or its frames capability has been disabled.
-  <p>
-  Some readers may bypass frames deliberately.  If that is your case,
-  see the <cite>HDF5 User's Guide</cite> navigation bar; this file 
-  normally appears in a separate frame and provides links to 
-  current chapters and drafts:
-  <ul>
-    <li><a href="UG_nav00.html"><cite>HDF5 User's Guide</cite> 
-        navigation bar</a>
-  </ul>
-
-<!--
-  Release 4.0 or higher of either Netscape Communicator 
-  or Microsoft Internet Explorer or an equivalent browser.
--->
-
-</noframes>
-
-
-</html>
diff --git a/html/UG/OldHtmlSource/UG_frameObjectsIdentifiers.html b/html/UG/OldHtmlSource/UG_frameObjectsIdentifiers.html
deleted file mode 100644
index af224e3..0000000
--- a/html/UG/OldHtmlSource/UG_frameObjectsIdentifiers.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-
-<frameset cols="200,*" border=0>
-  <frame src="UG_navObjectsIdentifiers.html" scrolling="auto" name="BUTTONS">
-  <frame src="ObjectsIdentifiers.html" scrolling="auto" name="CONTENT">
-</frameset>
-
-<noframes>
-  <b>HDF5 User's Guide</b>
-  <p>
-  This document is designed to be viewed via a frames-capable browser 
-  with frames enabled.
-  If you are reading this message, either your browser is not capable of
-  displaying framed data or its frames capability has been disabled.
-  <p>
-  Some readers may bypass frames deliberately.  If that is your case,
-  see the <cite>HDF5 User's Guide</cite> navigation bar; this file 
-  normally appears in a separate frame and provides links to 
-  current chapters and drafts:
-  <ul>
-    <li><a href="UG_nav00.html"><cite>HDF5 User's Guide</cite> 
-        navigation bar</a>
-  </ul>
-
-<!--
-  Release 4.0 or higher of either Netscape Communicator 
-  or Microsoft Internet Explorer or an equivalent browser.
--->
-
-</noframes>
-
-
-</html>
diff --git a/html/UG/OldHtmlSource/UG_front.html b/html/UG/OldHtmlSource/UG_front.html
deleted file mode 100644
index 626b91f..0000000
--- a/html/UG/OldHtmlSource/UG_front.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<HTML>
-<head>
-
-<!--( Begin styles definition )=====================================-->
-<link href="ed_styles/NewUGelect.css" rel="stylesheet" type="text/css">
-<!--( End styles definition )=======================================-->
-
-</head>
-<BODY>
-
-<div align="center">
-<br>
-<br>
-<br>
-<br>
-<br>
-<h1>HDF5 User's Guide</h1>
-<br>
-<br>
-<h3>HDF5 Release 1.8.13
-    <br>
-    <br>May 2014</h3>
-
- 
-<hr>
-<br><br>
-    <br> The HDF Group
-    <br> 
-    <br><img src="../Graphics/help.png" align="top" height="16">
-    <br>
-    <br>
-    <br>
-
-    <table align="right" border="0">
-    <tr align="left"><td>
-        
-    <!-- p class="editingComment" -->
-    <p> 
-    <p> 
-    <p>
-    <font size="-2" face="Tahoma, Arial, Verdana, Helvetica, sans-serif">
-    The <cite>HDF5 User's Guide</cite> has been updated 
-    to describe the HDF5 Release 1.8.x series; 
-    <br>
-<!-- FOR USE WITH ELECTRONIC VERSION ---------------------------------------->
-    see <a href="UG_UpdateStatus.html">HDF5 User’s Guide Update Status</a>
-    for highlights.
-<!-- FOR USE WITH ELECTRONIC VERSION ---------------------------------------->
-<!-- FOR USE WITH PRINT VERSION ----------------------------------------
-    for highlights,
-    see “HDF5 User’s Guide Update Status&rdquo
-    immediately following the table of contents.
-<!-- FOR USE WITH PRINT VERSION ---------------------------------------->
-
-<!--
-    <p>
-    The original <cite>HDF5 User's Guide</cite> was last updated for 
-    Release 1.4.5 and is no longer maintained.
-    It remains available, however, via the navigation bar.
--->
-    </font>
-    </td><td>   </td>
-    </tr>
-    </table>
-    
-    
-</div>
-
-</BODY>
-</HTML>
diff --git a/html/UG/OldHtmlSource/UG_nav00.html b/html/UG/OldHtmlSource/UG_nav00.html
deleted file mode 100644
index 87a9921..0000000
--- a/html/UG/OldHtmlSource/UG_nav00.html
+++ /dev/null
@@ -1,270 +0,0 @@
-<html>
-
-<body bgcolor="d2e6ef">
-
-
-
-<!--
-<A HREF="READ1ST.HTML" Target="RdFirstWin" 
-    onClick="window.open("READ1ST.HTML","RdFirstWin","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=yes,resizable=1,width=500,height=250,titlebar=yes")">
-    <IMG SRC="GRAPHICS/READ1ST.GIF" BORDER=0 ALT="Read this first!"></A>
--->
-
-<font size="-1">
-<br />
-<!-- editingComment
-<div align=right>
-  ( <a href="UG_nav01.html">Expand TOC</a> )
-</div>
--->
-
-<a href="UG_front.html" TARGET="CONTENT">Title Page</a>
-<br />
-<a href="../Copyright.html" TARGET="CONTENT">Copyright</a>
-
-<!-- editingComment
-<br />
-(<a href="../H5_UG_Outline.pdf" TARGET="CONTENT">Complete outline</a>)
-
-<br />
-<br />
-(<a href="UG_feedback.html" TARGET="CONTENT">Feedback</a>)
-
-<br />
-(<a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/index.html#H5_NewUG" TARGET="CONTENT">doc_dev_snapshot</a>)
--->
-</font>
-<hr />
-<hr />
-
-<!--
-<a href="UG_front.html" TARGET="CONTENT"><IMG SRC="GRAPHICS/COVER.GIF" BORDER=0 ALT="HDF5 UG title page"></a><br />
--->
-
-<div align="center">
-<b>HDF5 User's Guide<br />Table of Contents</b>
-<br />
-<!--
-    <a href="UG_UseWith18.html" TARGET="CONTENT"><font size="-1"><i>Using this Guide with 1.8.x</i></font></a>
-<br />
--->
-    <a href="UG_UpdateStatus.html" TARGET="CONTENT"><font size="-1">
-    <i>Update Status</i></font></a>
-</div>
-<p>
-
-<!-- editingComment
-    <font color="#555555">
-    <a href="01_Intro.html" TARGET="CONTENT">Introduction</a>
-    </font>
-    <br />
-    -->
-
-<b>I. The Broad View</b>
-    <font color="#555555">
-<!-- editingComment
-      <br />  
-    <a href="02_WhatIs.html" TARGET="CONTENT">What is HDF5?</a>
--->
-      <br />  
-    <a href="UG_frame03DataModel.html" TARGET="_TOP">Data Model &</a>
-          <br />     
-          <a href="UG_frame03DataModel.html" TARGET="_TOP">File Structure</a>
-      <br />  
-    <a href="UG_frame04ProgModel.html" TARGET="_TOP">HDF5 Library &</a>
-          <br />     
-          <a href="UG_frame04ProgModel.html" TARGET="_TOP">Programming Model</a>
-    </font>
-
-<br />
-<b>II. Using HDF5 —<br />
-             The Specifics</b>
-    <font color="#555555">
-<!-- editingComment
-      <br />  
-    <a href="05_Quick.html" TARGET="CONTENT">Quick Start</a>
-      <br />  
-    <a href="06_Naming.html" TARGET="CONTENT">API Struture &</a>
-          <br />     
-          <a href="06_Naming.html" TARGET="CONTENT">Naming Conventions</a>
-      <br />  
-    <a href="07_DocSet.html" TARGET="CONTENT">Document Set</a>
--->
-
-      <br />  
-    <a href="UG_frame08TheFile.html" TARGET="_TOP">The File</a>
-
-      <br />  
-    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups</a> 
-
-      <br />  
-    <a href="UG_frame10Datasets.html" TARGET="_TOP">Datasets</a> 
-
-      <br />  
-
-    <a href="UG_frame11Datatypes.html" TARGET="_TOP">Datatypes</a> 
-
-      <br />  
-    <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Dataspaces &</a>
-          <br />     
-          <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Partial I/O</a> 
-
-      <br />  
-    <a href="UG_frame13Attributes.html" TARGET="_TOP">Attributes</a>
-    
-      <br />  
-    <a href="UG_frame13ErrorHandling.html" TARGET="_TOP">Error Handling</a> 
-     
-      <br />  
-    <a href="UG_frame14PropertyLists.html" TARGET="_TOP">Property Lists</a> 
-
-<!--
-      <br />  
-    Images & Palettes
-      <br />  
-    Discarding Objects
-      <br />  
-    <a href="17_Filters.html" TARGET="CONTENT">Filters</a>
-      <br />  
-    Miscellaneous
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/VFL-clip-020924DRAFT.pdf" TARGET="CONTENT">VFL</a> (early clip) 
--->
-    </font>
-<br />
-<b>III. <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Additional Resources</a>
-</b><br />
-<b>IV. <a href="http://www.hdfgroup.org/HDF5/examples/" 
-    TARGET="CONTENT">Code Examples</a></b><br />
-<!--
-    <font color="#555555">
-      <br />  
-      <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Special Topics</a>
--->
-<!-- NEED TO WRITE PER CH, CREATE UG_frame18Performance.html, AND LINK IT IN
-      <br />  
-      <a href="18_Performance.html" TARGET="CONTENT">Performance</a>
-      <br />  
-      <a href="UG_frame18Performance.html" TARGET="_TOP">Performance</a>
-      <br />  
-      <a href="../ddl.html" TARGET="H5DocWin">DDL in BNF</a><br />
-            
-        <a href="../ddl.html" TARGET="H5DocWin">for HDF5</a><br />
-        
-      <a href="99_SelectedPassages.html" TARGET="CONTENT">Selected Passages</a><br />
-      <br />  
-    Higher Levels
-      <br />  
-    <a href="20_Parallel.html" TARGET="CONTENT">Parallel Environments</a>
-      <br />  
-    Parallel Environments
-          <br />     
-          (in progress) 
--->
-<!--
-      <br />  
-      <br />  
-    Non-C Languages
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/H5UG-Cpplus-001221.pdf" TARGET="CONTENT">C++ User Notes</a>
-      <br />  
-    <a href="23_DDL.html" TARGET="CONTENT">DDL in BNF</a>
-      <br />  
-    <a href="24_XML-DTD.html" TARGET="CONTENT">XML DTD</a>
-    </font>
--->
-
-<!--
-<br />
-<b>IV. Tools</b>
-    <font color="#555555">
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5ls</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5dump</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5repart</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5toh4</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h4toh5</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">Java Tools</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">XML Tools</a>
-    </font>
--->
-
-<!--
-<br />
-<b>Appendices</b>
-    <font color="#555555">
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_PredefDTypes.html" TARGET="CONTENT">Predefined Datatypes</a>
-      <br />  
-    H4-to-H5 Mapping
-      <br />  
-    H5-to-H4 Mapping
-      <br />  
-    <a href="99_TechSupport.html" TARGET="CONTENT">Technical Support</a>
-      <br />
-    </font>
- -->
-
-
-<hr />
-
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-<!-- <small><i>Printable 
-    <a href="http://www.hdfgroup.org/HDF5/doc/PSandPDF/HDF5_UsersGuide.PDF" TARGET="CONTENT">PDF</a> 
-    of this User’s Guide</i></small>
-<hr />
--->
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-
-<div align="center">
-<b>Other HDF5 documents</b>
-</div>
-<br />
-
-
-<a href="../index.html" TARGET="H5DocWin">Full HDF5 doc set</a> for<br />
-       
-  the current release<br />
-
-<a href="../H5.intro.html" TARGET="H5DocWin"><cite>Introduction to HDF5</cite></a><br />
-
-<a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>HDF5 Reference</cite></a><br />
-      
-  <a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>Manual</cite></a><br />
-
-<a href="../H5.user.html" TARGET="H5DocWin"><cite>HDF5 Release 1.4.5</cite></a><br />
-      
-  <a href="../H5.user.html" TARGET="H5DocWin"><cite>User's Guide</cite></a>
-
-
-<hr />
-<hr />
-
-<font size="-2" face="tahoma,arial,sans-serif">
-</font>
-<font size="-2" face="tahoma,arial,sans-serif"><SCRIPT LANGUAGE="JAVASCRIPT">
-<!--
-document.writeln("Last modified: 14 May 2014");
--->
-</SCRIPT>
-</font>
-
-
-
-
-
-</body>
-</html>
-
diff --git a/html/UG/OldHtmlSource/UG_nav03DataModel.html b/html/UG/OldHtmlSource/UG_nav03DataModel.html
deleted file mode 100755
index 4fcf614..0000000
--- a/html/UG/OldHtmlSource/UG_nav03DataModel.html
+++ /dev/null
@@ -1,275 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-<body bgcolor="d2e6ef">
-
-
-<!--
-<A HREF="READ1ST.HTML" Target="RdFirstWin" 
-    onClick="window.open("READ1ST.HTML","RdFirstWin","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=yes,resizable=1,width=500,height=250,titlebar=yes")">
-    <IMG SRC="GRAPHICS/READ1ST.GIF" BORDER=0 ALT="Read this first!"></A>
--->
-
-<font size="-1">
-<br />
-<!-- editingComment
-<div align=right>
-  ( <a href="UG_nav01.html">Expand TOC</a> )
-</div>
--->
-
-<a href="UG_front.html" TARGET="CONTENT">Title Page</a>
-<br />
-<a href="../Copyright.html" TARGET="CONTENT">Copyright</a>
-
-<!-- editingComment
-<br />
-(<a href="../H5_UG_Outline.pdf" TARGET="CONTENT">Complete outline</a>)
-
-<br />
-<br />
-(<a href="UG_feedback.html" TARGET="CONTENT">Feedback</a>)
-
-<br />
-(<a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/index.html#H5_NewUG" TARGET="CONTENT">doc_dev_snapshot</a>)
--->
-</font>
-<hr />
-<hr />
-
-<!--
-<a href="UG_front.html" TARGET="CONTENT"><IMG SRC="GRAPHICS/COVER.GIF" BORDER=0 ALT="HDF5 UG title page"></a><br />
--->
-
-<div align="center">
-<b>HDF5 User's Guide<br />Table of Contents</b>
-    <br />
-    <a href="UG_UpdateStatus.html" TARGET="CONTENT"><font size="-1"><i>Update Status</i></font></a>
-</div>
-<p>
-
-<!-- editingComment
-    <font color="#555555">
-    <a href="01_Intro.html" TARGET="CONTENT">Introduction</a>
-    </font>
-    <br />
-    -->
-
-<b>I. The Broad View</b>
-    <font color="#555555">
-<!-- editingComment
-      <br />  
-    <a href="02_WhatIs.html" TARGET="CONTENT">What is HDF5?</a>
--->
-      <br />  
-    <a href="UG_frame03DataModel.html" TARGET="_TOP">Data Model &</a>
-          <br />    
-          <a href="UG_frame03DataModel.html" TARGET="_TOP">File Structure</a>
-      
-      <font size="-1">
-      <br />          
-          <a href="03_DataModel.html#Intro" TARGET="CONTENT">
-          Introduction</a>
-      <br />        
-          <a href="03_DataModel.html#AbstractDMod" TARGET="CONTENT">
-          Abstract Model</a>
-      <br />        
-          <a href="03_DataModel.html#SModel" TARGET="CONTENT">
-          Storage Model</a>
-      <br />        
-          <a href="03_DataModel.html#Structure" TARGET="CONTENT">
-          File Structure</a>
-      </font>
-  
-      <br />     
-    <a href="UG_frame04ProgModel.html" TARGET="_TOP">HDF5 Library &</a>
-          <br />     
-          <a href="UG_frame04ProgModel.html" TARGET="_TOP">Programming Model</a>
-    </font>
-
-<br />
-<b>II. Using HDF5 —<br />
-             The Specifics</b>
-    <font color="#555555">
-      <br />  
-<!-- editingComment
-    <a href="05_Quick.html" TARGET="CONTENT">Quick Start</a>
-      <br />  
-    <a href="06_Naming.html" TARGET="CONTENT">API Struture &</a>
-          <br />     
-          <a href="06_Naming.html" TARGET="CONTENT">Naming Conventions</a>
-      <br />  
-    <a href="07_DocSet.html" TARGET="CONTENT">Document Set</a>
-      <br />  
--->
-    <a href="UG_frame08TheFile.html" TARGET="_TOP">The File</a>
-      <br />  
-    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups</a> 
-<!--    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups and Links</a> 
--->
-      <br />  
-    <a href="UG_frame10Datasets.html" TARGET="_TOP">Datasets</a> 
-      <br />  
-<!--
-    <a href="UG_frameObjectsIdentifiers.html" TARGET="_TOP">Objects and 
-      Identifiers</a> 
-      <br />  
--->
-    <a href="UG_frame11Datatypes.html" TARGET="_TOP">Datatypes</a> 
-
-      <br />  
-    <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Dataspaces &</a>
-          <br />     
-          <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Partial I/O</a> 
-
-      <br />  
-    <a href="UG_frame13Attributes.html" TARGET="_TOP">Attributes</a>
-    
-      <br />  
-    <a href="UG_frame13ErrorHandling.html" TARGET="_TOP">Error Handling</a>
-  
-      <br />  
-    <a href="UG_frame14PropertyLists.html" TARGET="_TOP">Property Lists</a> 
-     
-<!--
-      <br />  
-    Images & Palettes
-      <br />  
-    Discarding Objects
-      <br />  
-    <a href="17_Filters.html" TARGET="CONTENT">Filters</a>
-      <br />  
-    Miscellaneous
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/VFL-clip-020924DRAFT.pdf" TARGET="CONTENT">VFL</a> (early clip) 
--->
-    </font>
-<br />
-<b>III. <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Additional Resources</a>
-      </b><br />
-<b>IV. <a href="http://www.hdfgroup.org/HDF5/examples/" 
-    TARGET="CONTENT">Code Examples</a></b><br />
-
-    <font color="#555555">
-<!-- NEED TO WRITE PER CH, CREATE UG_frame18Performance.html, AND LINK IT IN
-      <br />  
-      <a href="UG_frame18Performance.html" TARGET="_TOP">Performance</a>
-      <br />  
-      <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Special Topics</a>
-      <br />  
-      <a href="../ddl.html" TARGET="H5DocWin">DDL in BNF</a><br />
-            
-        <a href="../ddl.html" TARGET="H5DocWin">for HDF5</a><br />
-        
-      <a href="99_SelectedPassages.html" TARGET="CONTENT">Selected Passages</a><br />
-      <br />  
-    Higher Levels
-      <br />  
-    <a href="20_Parallel.html" TARGET="CONTENT">Parallel Environments</a>
--->
-<!-- editingComment
-      <br />  
-    Parallel Environments
-          <br />     
-          (in progress) 
--->
-<!--
-      <br />  
-    <a href="21_Perform.html" TARGET="CONTENT">Performance</a>
-      <br />  
-    Non-C Languages
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/H5UG-Cpplus-001221.pdf" TARGET="CONTENT">C++ User Notes</a>
--->
-<!--
-      <br />  
-    <a href="23_DDL.html" TARGET="CONTENT">DDL in BNF</a>
-      <br />  
-    <a href="24_XML-DTD.html" TARGET="CONTENT">XML DTD</a>
--->
-    </font>
-
-<!--
-<br />
-<b>IV. Tools</b>
-    <font color="#555555">
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5ls</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5dump</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5repart</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5toh4</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h4toh5</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">Java Tools</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">XML Tools</a>
-    </font>
--->
-
-<!--
-<br />
-<b>Appendices</b>
-    <font color="#555555">
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_PredefDTypes.html" TARGET="CONTENT">Predefined Datatypes</a>
-      <br />  
-    H4-to-H5 Mapping
-      <br />  
-    H5-to-H4 Mapping
-      <br />  
-    <a href="99_TechSupport.html" TARGET="CONTENT">Technical Support</a>
-      <br />
-    </font>
- -->
-
-
-<hr />
-
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-<!-- <small><i>Printable 
-    <a href="http://www.hdfgroup.org/HDF5/doc/PSandPDF/HDF5_UsersGuide.PDF" TARGET="CONTENT">PDF</a> 
-    of this User’s Guide</i></small>
-<hr />
--->
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-
-<div align="center">
-<b>Other HDF5 documents</b>
-</div>
-<br />
-
-
-<a href="../index.html" TARGET="H5DocWin">Full HDF5 doc set</a> for<br />
-       
-  the current release<br />
-
-<a href="../H5.intro.html" TARGET="H5DocWin"><cite>Introduction to HDF5</cite></a><br />
-
-<a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>HDF5 Reference</cite></a><br />
-      
-  <a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>Manual</cite></a><br />
-
-<a href="../H5.user.html" TARGET="H5DocWin"><cite>HDF5 Release 1.4.5</cite></a><br />
-      
-  <a href="../H5.user.html" TARGET="H5DocWin"><cite>User's Guide</cite></a>
-
-
-<hr />
-
-</body>
-</html>
-
diff --git a/html/UG/OldHtmlSource/UG_nav04ProgModel.html b/html/UG/OldHtmlSource/UG_nav04ProgModel.html
deleted file mode 100755
index 5e71758..0000000
--- a/html/UG/OldHtmlSource/UG_nav04ProgModel.html
+++ /dev/null
@@ -1,306 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-<body bgcolor="d2e6ef">
-
-
-<!--
-<A HREF="READ1ST.HTML" Target="RdFirstWin" 
-    onClick="window.open("READ1ST.HTML","RdFirstWin","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=yes,resizable=1,width=500,height=250,titlebar=yes")">
-    <IMG SRC="GRAPHICS/READ1ST.GIF" BORDER=0 ALT="Read this first!"></A>
--->
-
-<font size="-1">
-<br />
-<!-- editingComment
-<div align=right>
-  ( <a href="UG_nav01.html">Expand TOC</a> )
-</div>
--->
-
-<a href="UG_front.html" TARGET="CONTENT">Title Page</a>
-<br />
-<a href="../Copyright.html" TARGET="CONTENT">Copyright</a>
-
-<!-- editingComment
-<br />
-(<a href="../H5_UG_Outline.pdf" TARGET="CONTENT">Complete outline</a>)
-
-<br />
-<br />
-(<a href="UG_feedback.html" TARGET="CONTENT">Feedback</a>)
-
-<br />
-(<a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/index.html#H5_NewUG" TARGET="CONTENT">doc_dev_snapshot</a>)
--->
-</font>
-<hr />
-<hr />
-
-<!--
-<a href="UG_front.html" TARGET="CONTENT"><IMG SRC="GRAPHICS/COVER.GIF" BORDER=0 ALT="HDF5 UG title page"></a><br />
--->
-
-<div align="center">
-<b>HDF5 User's Guide<br />Table of Contents</b>
-    <br />
-    <a href="UG_UpdateStatus.html" TARGET="CONTENT"><font size="-1"><i>Update Status</i></font></a>
-</div>
-<p>
-
-<!-- editingComment
-    <font color="#555555">
-    <a href="01_Intro.html" TARGET="CONTENT">Introduction</a>
-    </font>
-    <br />
-    -->
-
-<b>I. The Broad View</b>
-    <font color="#555555">
-<!-- editingComment
-      <br />  
-    <a href="02_WhatIs.html" TARGET="CONTENT">What is HDF5?</a>
--->
-      <br />  
-    <a href="UG_frame03DataModel.html" TARGET="_TOP">Data Model &</a>
-          <br />     
-          <a href="UG_frame03DataModel.html" TARGET="_TOP">File Structure</a>
-      <br />  
-    <a href="UG_frame04ProgModel.html" TARGET="_TOP">HDF5 Library &</a>
-          <br />    
-          <a href="UG_frame04ProgModel.html" TARGET="_TOP">Programming Model</a>
-          
-          <font size="-1">
-          <br />        
-            <a href="04_ProgModel.html#Intro" TARGET="CONTENT">
-              Introduction</a>
-          <br />        
-            <a href="04_ProgModel.html#ProgModel" TARGET="CONTENT">
-              Programming Model</a>
-          <br />          
-            <a href="04_ProgModel.html#CreateFile" TARGET="CONTENT">
-              Create File</a>
-          <br />          
-            <a href="04_ProgModel.html#CreateDataset" TARGET="CONTENT">
-              Create Dataset</a>
-          <br />          
-            <a href="04_ProgModel.html#CloseObject" TARGET="CONTENT">
-              Close Objects</a>
-          <br />          
-            <a href="04_ProgModel.html#WriteRead" TARGET="CONTENT">
-              Write/Read</a>
-          <br />          
-            <a href="04_ProgModel.html#PartialWR" TARGET="CONTENT">
-              Partial Write/Read</a>
-          <br />          
-            <a href="04_ProgModel.html#GetInfo" TARGET="CONTENT">
-              Get Info</a>
-          <br />          
-            <a href="04_ProgModel.html#CreateCDType" TARGET="CONTENT">
-              Create Compound</a>
-          <br />            
-            <a href="04_ProgModel.html#CreateCDType" TARGET="CONTENT">
-              Datatype</a>
-          <br />          
-            <a href="04_ProgModel.html#ExtendChunked" TARGET="CONTENT">
-              Create Extendable or</a>
-          <br />            
-            <a href="04_ProgModel.html#ExtendChunked" TARGET="CONTENT">
-              Chunked Dataset</a>
-          <br />          
-            <a href="04_ProgModel.html#Groups" TARGET="CONTENT">
-              Work with Groups</a>
-          <br />          
-            <a href="04_ProgModel.html#Attrs" TARGET="CONTENT">
-              Work with Attributes</a>
-          <br />        
-            <a href="04_ProgModel.html#IOPipeline" TARGET="CONTENT">
-              Data Transfer Pipeline</a>
-    </font></font>
-
-<br />
-<b>II. Using HDF5 —<br />
-             The Specifics</b>
-    <font color="#555555">
-      <br />  
-<!-- editingComment
-    <a href="05_Quick.html" TARGET="CONTENT">Quick Start</a>
-      <br />  
-    <a href="06_Naming.html" TARGET="CONTENT">API Struture &</a>
-          <br />     
-          <a href="06_Naming.html" TARGET="CONTENT">Naming Conventions</a>
-      <br />  
-    <a href="07_DocSet.html" TARGET="CONTENT">Document Set</a>
-      <br />  
--->
-    <a href="UG_frame08TheFile.html" TARGET="_TOP">The File</a>
-      <br />  
-    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups</a> 
-<!--    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups and Links</a> 
--->
-      <br />  
-    <a href="UG_frame10Datasets.html" TARGET="_TOP">Datasets</a> 
-      <br />  
-<!--
-    <a href="UG_frameObjectsIdentifiers.html" TARGET="_TOP">Objects and 
-      Identifiers</a> 
-      <br />  
--->
-    <a href="UG_frame11Datatypes.html" TARGET="_TOP">Datatypes</a> 
-
-      <br />  
-    <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Dataspaces &</a>
-          <br />     
-          <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Partial I/O</a> 
-
-      <br />  
-    <a href="UG_frame13Attributes.html" TARGET="_TOP">Attributes</a>
-    
-      <br />  
-    <a href="UG_frame13ErrorHandling.html" TARGET="_TOP">Error Handling</a>
-  
-      <br />  
-    <a href="UG_frame14PropertyLists.html" TARGET="_TOP">Property Lists</a> 
-    
-<!--
-      <br />  
-    Images & Palettes
-      <br />  
-    Discarding Objects
-      <br />  
-    <a href="17_Filters.html" TARGET="CONTENT">Filters</a>
-      <br />  
-    Miscellaneous
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/VFL-clip-020924DRAFT.pdf" TARGET="CONTENT">VFL</a> (early clip) 
--->
-    </font>
-<br />
-<b>III. <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Additional Resources</a>
-      </b><br />
-<b>IV. <a href="http://www.hdfgroup.org/HDF5/examples/" 
-    TARGET="CONTENT">Code Examples</a></b><br />
-
-    <font color="#555555">
-<!-- NEED TO WRITE PER CH, CREATE UG_frame18Performance.html, AND LINK IT IN
-      <br />  
-      <a href="UG_frame18Performance.html" TARGET="_TOP">Performance</a>
-      <br />  
-      <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Special Topics</a>
-      <br />  
-      <a href="../ddl.html" TARGET="H5DocWin">DDL in BNF</a><br />
-            
-        <a href="../ddl.html" TARGET="H5DocWin">for HDF5</a><br />
-        
-      <a href="99_SelectedPassages.html" TARGET="CONTENT">Selected Passages</a><br />
-      <br />  
-    Higher Levels
-      <br />  
-    <a href="20_Parallel.html" TARGET="CONTENT">Parallel Environments</a>
--->
-<!-- editingComment
-      <br />  
-    Parallel Environments
-          <br />     
-          (in progress) 
--->
-<!--
-      <br />  
-    <a href="21_Perform.html" TARGET="CONTENT">Performance</a>
-      <br />  
-    Non-C Languages
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/H5UG-Cpplus-001221.pdf" TARGET="CONTENT">C++ User Notes</a>
--->
-<!--
-      <br />  
-    <a href="23_DDL.html" TARGET="CONTENT">DDL in BNF</a>
-      <br />  
-    <a href="24_XML-DTD.html" TARGET="CONTENT">XML DTD</a>
--->
-    </font>
-
-<!--
-<br />
-<b>IV. Tools</b>
-    <font color="#555555">
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5ls</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5dump</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5repart</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5toh4</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h4toh5</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">Java Tools</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">XML Tools</a>
-    </font>
--->
-
-<!--
-<br />
-<b>Appendices</b>
-    <font color="#555555">
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_PredefDTypes.html" TARGET="CONTENT">Predefined Datatypes</a>
-      <br />  
-    H4-to-H5 Mapping
-      <br />  
-    H5-to-H4 Mapping
-      <br />  
-    <a href="99_TechSupport.html" TARGET="CONTENT">Technical Support</a>
-      <br />
-    </font>
- -->
-
-
-<hr />
-
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-<!-- <small><i>Printable 
-    <a href="http://www.hdfgroup.org/HDF5/doc/PSandPDF/HDF5_UsersGuide.PDF" TARGET="CONTENT">PDF</a> 
-    of this User’s Guide</i></small>
-<hr />
--->
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-
-<div align="center">
-<b>Other HDF5 documents</b>
-</div>
-<br />
-
-
-<a href="../index.html" TARGET="H5DocWin">Full HDF5 doc set</a> for<br />
-       
-  the current release<br />
-
-<a href="../H5.intro.html" TARGET="H5DocWin"><cite>Introduction to HDF5</cite></a><br />
-
-<a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>HDF5 Reference</cite></a><br />
-      
-  <a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>Manual</cite></a><br />
-
-<a href="../H5.user.html" TARGET="H5DocWin"><cite>HDF5 Release 1.4.5</cite></a><br />
-      
-  <a href="../H5.user.html" TARGET="H5DocWin"><cite>User's Guide</cite></a>
-
-
-<hr />
-
-</body>
-</html>
-
diff --git a/html/UG/OldHtmlSource/UG_nav08TheFile.html b/html/UG/OldHtmlSource/UG_nav08TheFile.html
deleted file mode 100755
index 42155b5..0000000
--- a/html/UG/OldHtmlSource/UG_nav08TheFile.html
+++ /dev/null
@@ -1,296 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-<body bgcolor="d2e6ef">
-
-
-<!--
-<A HREF="READ1ST.HTML" Target="RdFirstWin" 
-    onClick="window.open("READ1ST.HTML","RdFirstWin","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=yes,resizable=1,width=500,height=250,titlebar=yes")">
-    <IMG SRC="GRAPHICS/READ1ST.GIF" BORDER=0 ALT="Read this first!"></A>
--->
-
-<font size="-1">
-<br />
-<!-- editingComment
-<div align=right>
-  ( <a href="UG_nav01.html">Expand TOC</a> )
-</div>
--->
-
-<a href="UG_front.html" TARGET="CONTENT">Title Page</a>
-<br />
-<a href="../Copyright.html" TARGET="CONTENT">Copyright</a>
-
-<!-- editingComment
-<br />
-(<a href="../H5_UG_Outline.pdf" TARGET="CONTENT">Complete outline</a>)
-
-<br />
-<br />
-(<a href="UG_feedback.html" TARGET="CONTENT">Feedback</a>)
-
-<br />
-(<a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/index.html#H5_NewUG" TARGET="CONTENT">doc_dev_snapshot</a>)
--->
-</font>
-<hr />
-<hr />
-
-<!--
-<a href="UG_front.html" TARGET="CONTENT"><IMG SRC="GRAPHICS/COVER.GIF" BORDER=0 ALT="HDF5 UG title page"></a><br />
--->
-
-<div align="center">
-<b>HDF5 User's Guide<br />Table of Contents</b>
-    <br />
-    <a href="UG_UpdateStatus.html" TARGET="CONTENT"><font size="-1"><i>Update Status</i></font></a>
-</div>
-<p>
-
-<!-- editingComment
-    <font color="#555555">
-    <a href="01_Intro.html" TARGET="CONTENT">Introduction</a>
-    </font>
-    <br />
-    -->
-
-<b>I. The Broad View</b>
-    <font color="#555555">
-<!-- editingComment
-      <br />  
-    <a href="02_WhatIs.html" TARGET="CONTENT">What is HDF5?</a>
--->
-      <br />  
-    <a href="UG_frame03DataModel.html" TARGET="_TOP">Data Model &</a>
-          <br />     
-          <a href="UG_frame03DataModel.html" TARGET="_TOP">File Structure</a>
-      <br />  
-    <a href="UG_frame04ProgModel.html" TARGET="_TOP">HDF5 Library &</a>
-          <br />     
-          <a href="UG_frame04ProgModel.html" TARGET="_TOP">Programming Model</a>
-    </font>
-
-<br />
-<b>II. Using HDF5 —<br />
-             The Specifics</b>
-    <font color="#555555">
-      <br />  
-<!-- editingComment
-    <a href="05_Quick.html" TARGET="CONTENT">Quick Start</a>
-      <br />  
-    <a href="06_Naming.html" TARGET="CONTENT">API Struture &</a>
-          <br />     
-          <a href="06_Naming.html" TARGET="CONTENT">Naming Conventions</a>
-      <br />  
-    <a href="07_DocSet.html" TARGET="CONTENT">Document Set</a>
-      <br />  
--->
-    <a href="UG_frame08TheFile.html" TARGET="_TOP">The File</a>
-          
-          <font size="-1">
-          <br />      
-              <a href="08_TheFile.html#Intro" TARGET="CONTENT">
-              Introduction</a>
-          <br />      
-              <a href="08_TheFile.html#PModel" TARGET="CONTENT">
-              Programming Model</a>
-          <br />      
-              <a href="08_TheFile.html#H5Dump" TARGET="CONTENT">
-              <code>h5dump</code></a>
-          <br />      
-              <a href="08_TheFile.html#FuncSumms" TARGET="CONTENT">
-              Function Summaries</a>
-          <br />      
-              <a href="08_TheFile.html#CrOpen" TARGET="CONTENT">
-              Create/Open File</a>
-          <br />      
-              <a href="08_TheFile.html#Close" TARGET="CONTENT">
-              Close File</a>
-          <br />      
-              <a href="08_TheFile.html#PLists" TARGET="CONTENT">
-              File Property Lists</a>
-          <br />      
-              <a href="08_TheFile.html#Drivers" TARGET="CONTENT">
-              Storage Layouts</a>
-          <br />        
-              <a href="08_TheFile.html#Drivers" TARGET="CONTENT">
-              and Drivers</a>
-          <br />      
-              <a href="08_TheFile.html#Examples" TARGET="CONTENT">
-              Code Examples</a>
-          <br />      
-              <a href="08_TheFile.html#MountingFiles" TARGET="CONTENT">
-              Mounting Files</a>
-          </font>
-  
-      <br />  
-    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups</a> 
-<!--    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups and Links</a> 
--->
-      <br />  
-    <a href="UG_frame10Datasets.html" TARGET="_TOP">Datasets</a> 
-      <br />  
-<!--
-    <a href="UG_frameObjectsIdentifiers.html" TARGET="_TOP">Objects and 
-      Identifiers</a> 
-      <br />  
--->
-    <a href="UG_frame11Datatypes.html" TARGET="_TOP">Datatypes</a> 
-
-      <br />  
-    <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Dataspaces &</a>
-          <br />     
-          <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Partial I/O</a> 
-
-      <br />  
-    <a href="UG_frame13Attributes.html" TARGET="_TOP">Attributes</a>
-    
-      <br />  
-    <a href="UG_frame13ErrorHandling.html" TARGET="_TOP">Error Handling</a>
-  
-      <br />  
-    <a href="UG_frame14PropertyLists.html" TARGET="_TOP">Property Lists</a> 
-     
-<!--
-      <br />  
-    Images & Palettes
-      <br />  
-    Discarding Objects
-      <br />  
-    <a href="17_Filters.html" TARGET="CONTENT">Filters</a>
-      <br />  
-    Miscellaneous
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/VFL-clip-020924DRAFT.pdf" TARGET="CONTENT">VFL</a> (early clip) 
--->
-    </font>
-<br />
-<b>III. <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Additional Resources</a>
-      </b><br />
-<b>IV. <a href="http://www.hdfgroup.org/HDF5/examples/" 
-    TARGET="CONTENT">Code Examples</a></b><br />
-
-    <font color="#555555">
-<!-- NEED TO WRITE PER CH, CREATE UG_frame18Performance.html, AND LINK IT IN
-      <br />  
-      <a href="UG_frame18Performance.html" TARGET="_TOP">Performance</a>
-      <br />  
-      <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Special Topics</a>
-      <br />  
-      <a href="../ddl.html" TARGET="H5DocWin">DDL in BNF</a><br />
-            
-        <a href="../ddl.html" TARGET="H5DocWin">for HDF5</a><br />
-        
-      <a href="99_SelectedPassages.html" TARGET="CONTENT">Selected Passages</a><br />
-      <br />  
-    Higher Levels
-      <br />  
-    <a href="20_Parallel.html" TARGET="CONTENT">Parallel Environments</a>
--->
-<!-- editingComment
-      <br />  
-    Parallel Environments
-          <br />     
-          (in progress) 
--->
-<!--
-      <br />  
-    <a href="21_Perform.html" TARGET="CONTENT">Performance</a>
-      <br />  
-    Non-C Languages
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/H5UG-Cpplus-001221.pdf" TARGET="CONTENT">C++ User Notes</a>
--->
-<!--
-      <br />  
-    <a href="23_DDL.html" TARGET="CONTENT">DDL in BNF</a>
-      <br />  
-    <a href="24_XML-DTD.html" TARGET="CONTENT">XML DTD</a>
--->
-    </font>
-
-<!--
-<br />
-<b>IV. Tools</b>
-    <font color="#555555">
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5ls</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5dump</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5repart</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5toh4</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h4toh5</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">Java Tools</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">XML Tools</a>
-    </font>
--->
-
-<!--
-<br />
-<b>Appendices</b>
-    <font color="#555555">
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_PredefDTypes.html" TARGET="CONTENT">Predefined Datatypes</a>
-      <br />  
-    H4-to-H5 Mapping
-      <br />  
-    H5-to-H4 Mapping
-      <br />  
-    <a href="99_TechSupport.html" TARGET="CONTENT">Technical Support</a>
-      <br />
-    </font>
- -->
-
-
-<hr />
-
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-<!-- <small><i>Printable 
-    <a href="http://www.hdfgroup.org/HDF5/doc/PSandPDF/HDF5_UsersGuide.PDF" TARGET="CONTENT">PDF</a> 
-    of this User’s Guide</i></small>
-<hr />
--->
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-
-<div align="center">
-<b>Other HDF5 documents</b>
-</div>
-<br />
-
-
-<a href="../index.html" TARGET="H5DocWin">Full HDF5 doc set</a> for<br />
-       
-  the current release<br />
-
-<a href="../H5.intro.html" TARGET="H5DocWin"><cite>Introduction to HDF5</cite></a><br />
-
-<a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>HDF5 Reference</cite></a><br />
-      
-  <a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>Manual</cite></a><br />
-
-<a href="../H5.user.html" TARGET="H5DocWin"><cite>HDF5 Release 1.4.5</cite></a><br />
-      
-  <a href="../H5.user.html" TARGET="H5DocWin"><cite>User's Guide</cite></a>
-
-
-<hr />
-
-</body>
-</html>
-
diff --git a/html/UG/OldHtmlSource/UG_nav09Groups.html b/html/UG/OldHtmlSource/UG_nav09Groups.html
deleted file mode 100755
index 9347c70..0000000
--- a/html/UG/OldHtmlSource/UG_nav09Groups.html
+++ /dev/null
@@ -1,275 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-<body bgcolor="d2e6ef">
-
-
-<!--
-<A HREF="READ1ST.HTML" Target="RdFirstWin" 
-    onClick="window.open("READ1ST.HTML","RdFirstWin","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=yes,resizable=1,width=500,height=250,titlebar=yes")">
-    <IMG SRC="GRAPHICS/READ1ST.GIF" BORDER=0 ALT="Read this first!"></A>
--->
-
-<font size="-1">
-<br />
-<!-- editingComment
-<div align=right>
-  ( <a href="UG_nav01.html">Expand TOC</a> )
-</div>
--->
-
-<a href="UG_front.html" TARGET="CONTENT">Title Page</a>
-<br />
-<a href="../Copyright.html" TARGET="CONTENT">Copyright</a>
-
-<!-- editingComment
-<br />
-(<a href="../H5_UG_Outline.pdf" TARGET="CONTENT">Complete outline</a>)
-
-<br />
-<br />
-(<a href="UG_feedback.html" TARGET="CONTENT">Feedback</a>)
-
-<br />
-(<a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/index.html#H5_NewUG" TARGET="CONTENT">doc_dev_snapshot</a>)
--->
-</font>
-<hr />
-<hr />
-
-<!--
-<a href="UG_front.html" TARGET="CONTENT"><IMG SRC="GRAPHICS/COVER.GIF" BORDER=0 ALT="HDF5 UG title page"></a><br />
--->
-
-<div align="center">
-<b>HDF5 User's Guide<br />Table of Contents</b>
-    <br />
-    <a href="UG_UpdateStatus.html" TARGET="CONTENT"><font size="-1"><i>Update Status</i></font></a>
-</div>
-<p>
-
-<!-- editingComment
-    <font color="#555555">
-    <a href="01_Intro.html" TARGET="CONTENT">Introduction</a>
-    </font>
-    <br />
-    -->
-
-<b>I. The Broad View</b>
-    <font color="#555555">
-<!-- editingComment
-      <br />  
-    <a href="02_WhatIs.html" TARGET="CONTENT">What is HDF5?</a>
--->
-      <br />  
-    <a href="UG_frame03DataModel.html" TARGET="_TOP">Data Model &</a>
-          <br />     
-          <a href="UG_frame03DataModel.html" TARGET="_TOP">File Structure</a>
-      <br />  
-    <a href="UG_frame04ProgModel.html" TARGET="_TOP">HDF5 Library &</a>
-          <br />     
-          <a href="UG_frame04ProgModel.html" TARGET="_TOP">Programming Model</a>
-    </font>
-
-<br />
-<b>II. Using HDF5 —<br />
-             The Specifics</b>
-    <font color="#555555">
-      <br />  
-<!-- editingComment
-    <a href="05_Quick.html" TARGET="CONTENT">Quick Start</a>
-      <br />  
-    <a href="06_Naming.html" TARGET="CONTENT">API Struture &</a>
-          <br />     
-          <a href="06_Naming.html" TARGET="CONTENT">Naming Conventions</a>
-      <br />  
-    <a href="07_DocSet.html" TARGET="CONTENT">Document Set</a>
-      <br />  
--->
-    <a href="UG_frame08TheFile.html" TARGET="_TOP">The File</a>
-      <br />  
-    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups</a> 
-      
-        <font size="-1">
-        <br />      
-        <a href="09_Groups.html#Intro" TARGET="CONTENT">
-            Introduction</a>
-        <br />      
-        <a href="09_Groups.html#DGroupObj" TARGET="CONTENT">
-            Description</a>
-      <br />      
-        <a href="09_Groups.html#H5Dump" TARGET="CONTENT">
-            <code>h5dump</code></a>
-      <br />      
-        <a href="09_Groups.html#GroupFuncSums" TARGET="CONTENT">
-            Function Summaries</a>
-<!-- 
-            <br />            
-            <a href="09_Groups.html#GroupFuncSums" TARGET="CONTENT">H5G</a> 
-             & 
-            <a href="09_Groups.html#LinkFuncSums" TARGET="CONTENT">H5L</a> 
--->
-            <br />      
-        <a href="09_Groups.html#ProgModel" TARGET="CONTENT">
-            Programming Model</a>
-      <br />      
-        <a href="09_Groups.html#DiscoverInfo" TARGET="CONTENT">
-            Object Info</a>
-      <br />      
-        <a href="09_Groups.html#DiscoverGrObjs" TARGET="CONTENT">
-            Objects in Group</a>
-      <br />      
-        <a href="09_Groups.html#DiscoverAll" TARGET="CONTENT">
-            All Objects in File</a>
-      <br />      
-        <a href="09_Groups.html#Examples" TARGET="CONTENT">
-            Examples</a>
-      </font>
-  
-    <br />  
-    <a href="UG_frame10Datasets.html" TARGET="_TOP">Datasets</a> 
-      <br />  
-    <a href="UG_frame11Datatypes.html" TARGET="_TOP">Datatypes</a> 
-
-      <br />  
-    <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Dataspaces &</a>
-          <br />     
-          <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Partial I/O</a> 
-
-      <br />  
-    <a href="UG_frame13Attributes.html" TARGET="_TOP">Attributes</a>
-    
-      <br />  
-    <a href="UG_frame13ErrorHandling.html" TARGET="_TOP">Error Handling</a>
-  
-      <br />  
-    <a href="UG_frame14PropertyLists.html" TARGET="_TOP">Property Lists</a> 
-     
-    </font>
-<br />
-<b>III. <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Additional Resources</a>
-      </b><br />
-<b>IV. <a href="http://www.hdfgroup.org/HDF5/examples/" 
-    TARGET="CONTENT">Code Examples</a></b><br />
-
-    <font color="#555555">
-<!-- NEED TO WRITE PER CH, CREATE UG_frame18Performance.html, AND LINK IT IN
-      <br />  
-      <a href="UG_frame18Performance.html" TARGET="_TOP">Performance</a>
-      <br />  
-      <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Special Topics</a>
-      <br />  
-      <a href="../ddl.html" TARGET="H5DocWin">DDL in BNF</a><br />
-            
-        <a href="../ddl.html" TARGET="H5DocWin">for HDF5</a><br />
-        
-      <a href="99_SelectedPassages.html" TARGET="CONTENT">Selected Passages</a><br />
-      <br />  
-    Higher Levels
-      <br />  
-    <a href="20_Parallel.html" TARGET="CONTENT">Parallel Environments</a>
--->
-<!-- editingComment
-      <br />  
-    Parallel Environments
-          <br />     
-          (in progress) 
--->
-<!--
-      <br />  
-    <a href="21_Perform.html" TARGET="CONTENT">Performance</a>
-      <br />  
-    Non-C Languages
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/H5UG-Cpplus-001221.pdf" TARGET="CONTENT">C++ User Notes</a>
--->
-<!--
-      <br />  
-    <a href="23_DDL.html" TARGET="CONTENT">DDL in BNF</a>
-      <br />  
-    <a href="24_XML-DTD.html" TARGET="CONTENT">XML DTD</a>
--->
-    </font>
-
-<!--
-<br />
-<b>IV. Tools</b>
-    <font color="#555555">
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5ls</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5dump</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5repart</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5toh4</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h4toh5</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">Java Tools</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">XML Tools</a>
-    </font>
--->
-
-<!--
-<br />
-<b>Appendices</b>
-    <font color="#555555">
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_PredefDTypes.html" TARGET="CONTENT">Predefined Datatypes</a>
-      <br />  
-    H4-to-H5 Mapping
-      <br />  
-    H5-to-H4 Mapping
-      <br />  
-    <a href="99_TechSupport.html" TARGET="CONTENT">Technical Support</a>
-      <br />
-    </font>
- -->
-
-
-<hr />
-
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-<!-- <small><i>Printable 
-    <a href="http://www.hdfgroup.org/HDF5/doc/PSandPDF/HDF5_UsersGuide.PDF" TARGET="CONTENT">PDF</a> 
-    of this User’s Guide</i></small>
-<hr />
--->
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-
-<div align="center">
-<b>Other HDF5 documents</b>
-</div>
-<br />
-
-
-<a href="../index.html" TARGET="H5DocWin">Full HDF5 doc set</a> for<br />
-       
-  the current release<br />
-
-<a href="../H5.intro.html" TARGET="H5DocWin"><cite>Introduction to HDF5</cite></a><br />
-
-<a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>HDF5 Reference</cite></a><br />
-      
-  <a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>Manual</cite></a><br />
-
-<a href="../H5.user.html" TARGET="H5DocWin"><cite>HDF5 Release 1.4.5</cite></a><br />
-      
-  <a href="../H5.user.html" TARGET="H5DocWin"><cite>User's Guide</cite></a>
-
-
-<hr />
-
-</body>
-</html>
-
diff --git a/html/UG/OldHtmlSource/UG_nav10Datasets.html b/html/UG/OldHtmlSource/UG_nav10Datasets.html
deleted file mode 100755
index 7b00ec3..0000000
--- a/html/UG/OldHtmlSource/UG_nav10Datasets.html
+++ /dev/null
@@ -1,290 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-<body bgcolor="d2e6ef">
-
-
-<!--
-<A HREF="READ1ST.HTML" Target="RdFirstWin" 
-    onClick="window.open("READ1ST.HTML","RdFirstWin","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=yes,resizable=1,width=500,height=250,titlebar=yes")">
-    <IMG SRC="GRAPHICS/READ1ST.GIF" BORDER=0 ALT="Read this first!"></A>
--->
-
-<font size="-1">
-<br />
-<!-- editingComment
-<div align=right>
-  ( <a href="UG_nav01.html">Expand TOC</a> )
-</div>
--->
-
-<a href="UG_front.html" TARGET="CONTENT">Title Page</a>
-<br />
-<a href="../Copyright.html" TARGET="CONTENT">Copyright</a>
-
-<!-- editingComment
-<br />
-(<a href="../H5_UG_Outline.pdf" TARGET="CONTENT">Complete outline</a>)
-
-<br />
-<br />
-(<a href="UG_feedback.html" TARGET="CONTENT">Feedback</a>)
-
-<br />
-(<a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/index.html#H5_NewUG" TARGET="CONTENT">doc_dev_snapshot</a>)
--->
-</font>
-<hr />
-<hr />
-
-<!--
-<a href="UG_front.html" TARGET="CONTENT"><IMG SRC="GRAPHICS/COVER.GIF" BORDER=0 ALT="HDF5 UG title page"></a><br />
--->
-
-<div align="center">
-<b>HDF5 User's Guide<br />Table of Contents</b>
-    <br />
-    <a href="UG_UpdateStatus.html" TARGET="CONTENT"><font size="-1"><i>Update Status</i></font></a>
-</div>
-<p>
-
-<!-- editingComment
-    <font color="#555555">
-    <a href="01_Intro.html" TARGET="CONTENT">Introduction</a>
-    </font>
-    <br />
-    -->
-
-<b>I. The Broad View</b>
-    <font color="#555555">
-<!-- editingComment
-      <br />  
-    <a href="02_WhatIs.html" TARGET="CONTENT">What is HDF5?</a>
--->
-      <br />  
-    <a href="UG_frame03DataModel.html" TARGET="_TOP">Data Model &</a>
-          <br />     
-          <a href="UG_frame03DataModel.html" TARGET="_TOP">File Structure</a>
-      <br />  
-    <a href="UG_frame04ProgModel.html" TARGET="_TOP">HDF5 Library &</a>
-          <br />     
-          <a href="UG_frame04ProgModel.html" TARGET="_TOP">Programming Model</a>
-    </font>
-
-<br />
-<b>II. Using HDF5 —<br />
-             The Specifics</b>
-    <font color="#555555">
-      <br />  
-<!-- editingComment
-    <a href="05_Quick.html" TARGET="CONTENT">Quick Start</a>
-      <br />  
-    <a href="06_Naming.html" TARGET="CONTENT">API Struture &</a>
-          <br />     
-          <a href="06_Naming.html" TARGET="CONTENT">Naming Conventions</a>
-      <br />  
-    <a href="07_DocSet.html" TARGET="CONTENT">Document Set</a>
-      <br />  
--->
-    <a href="UG_frame08TheFile.html" TARGET="_TOP">The File</a>
-      <br />  
-    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups</a> 
-<!--    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups and Links</a> 
--->
-      <br />  
-    <a href="UG_frame10Datasets.html" TARGET="_TOP">Datasets</a>
-
-          <font size="-1">
-          <br />      
-              <a href="10_Datasets.html#Intro" TARGET="CONTENT">
-              Introduction</a>
-          <br />      
-              <a href="10_Datasets.html#FileFunctSums" TARGET="CONTENT">
-              Function Summaries</a>
-          <br />      
-              <a href="10_Datasets.html#PModel" TARGET="CONTENT">
-              Programming Model</a>
-          <br />      
-              <a href="10_Datasets.html#DTransfer" TARGET="CONTENT">
-              Data Transfer</a>
-          <br />      
-              <a href="10_Datasets.html#Allocation" TARGET="CONTENT">
-              Space Allocation</a>
-          <br />      
-              <a href="10_Datasets.html#UseFilters" TARGET="CONTENT">
-              Using Filters</a>
-          <br />          
-              <a href="10_Datasets.html#N-Bit" TARGET="CONTENT">
-                 N-bit</a>
-          <br />          
-              <a href="10_Datasets.html#ScaleOffset" TARGET="CONTENT">
-                 Scale-Offset</a>
-          <br />          
-              <a href="10_Datasets.html#Szip" TARGET="CONTENT">
-                 Szip</a>
-          </font>
-  
-      <br />  
-<!--
-    <a href="UG_frameObjectsIdentifiers.html" TARGET="_TOP">Objects and 
-      Identifiers</a> 
-      <br />  
--->
-    <a href="UG_frame11Datatypes.html" TARGET="_TOP">Datatypes</a> 
-
-      <br />  
-    <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Dataspaces &</a>
-          <br />     
-          <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Partial I/O</a> 
-
-      <br />  
-    <a href="UG_frame13Attributes.html" TARGET="_TOP">Attributes</a> 
-
-      <br />  
-    <a href="UG_frame13ErrorHandling.html" TARGET="_TOP">Error Handling</a>
-  
-      <br />  
-    <a href="UG_frame14PropertyLists.html" TARGET="_TOP">Property Lists</a> 
-    
-<!--
-      <br />  
-    Images & Palettes
-      <br />  
-    Discarding Objects
-      <br />  
-    <a href="17_Filters.html" TARGET="CONTENT">Filters</a>
-      <br />  
-    Miscellaneous
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/VFL-clip-020924DRAFT.pdf" TARGET="CONTENT">VFL</a> (early clip) 
--->
-    </font>
-<br />
-<b>III. <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Additional Resources</a>
-      </b><br />
-<b>IV. <a href="http://www.hdfgroup.org/HDF5/examples/" 
-    TARGET="CONTENT">Code Examples</a></b><br />
-
-    <font color="#555555">
-<!-- NEED TO WRITE PER CH, CREATE UG_frame18Performance.html, AND LINK IT IN
-      <br />  
-      <a href="UG_frame18Performance.html" TARGET="_TOP">Performance</a>
-      <br />  
-      <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Special Topics</a>
-      <br />  
-      <a href="../ddl.html" TARGET="H5DocWin">DDL in BNF</a><br />
-            
-        <a href="../ddl.html" TARGET="H5DocWin">for HDF5</a><br />
-        
-      <a href="99_SelectedPassages.html" TARGET="CONTENT">Selected Passages</a><br />
-      <br />  
-    Higher Levels
-      <br />  
-    <a href="20_Parallel.html" TARGET="CONTENT">Parallel Environments</a>
--->
-<!-- editingComment
-      <br />  
-    Parallel Environments
-          <br />     
-          (in progress) 
--->
-<!--
-      <br />  
-    <a href="21_Perform.html" TARGET="CONTENT">Performance</a>
-      <br />  
-    Non-C Languages
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/H5UG-Cpplus-001221.pdf" TARGET="CONTENT">C++ User Notes</a>
--->
-<!--
-      <br />  
-    <a href="23_DDL.html" TARGET="CONTENT">DDL in BNF</a>
-      <br />  
-    <a href="24_XML-DTD.html" TARGET="CONTENT">XML DTD</a>
--->
-    </font>
-
-<!--
-<br />
-<b>IV. Tools</b>
-    <font color="#555555">
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5ls</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5dump</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5repart</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5toh4</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h4toh5</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">Java Tools</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">XML Tools</a>
-    </font>
--->
-
-<!--
-<br />
-<b>Appendices</b>
-    <font color="#555555">
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_PredefDTypes.html" TARGET="CONTENT">Predefined Datatypes</a>
-      <br />  
-    H4-to-H5 Mapping
-      <br />  
-    H5-to-H4 Mapping
-      <br />  
-    <a href="99_TechSupport.html" TARGET="CONTENT">Technical Support</a>
-      <br />
-    </font>
- -->
-
-
-<hr />
-
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-<!-- <small><i>Printable 
-    <a href="http://www.hdfgroup.org/HDF5/doc/PSandPDF/HDF5_UsersGuide.PDF" TARGET="CONTENT">PDF</a> 
-    of this User’s Guide</i></small>
-<hr />
--->
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-
-<div align="center">
-<b>Other HDF5 documents</b>
-</div>
-<br />
-
-
-<a href="../index.html" TARGET="H5DocWin">Full HDF5 doc set</a> for<br />
-       
-  the current release<br />
-
-<a href="../H5.intro.html" TARGET="H5DocWin"><cite>Introduction to HDF5</cite></a><br />
-
-<a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>HDF5 Reference</cite></a><br />
-      
-  <a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>Manual</cite></a><br />
-
-<a href="../H5.user.html" TARGET="H5DocWin"><cite>HDF5 Release 1.4.5</cite></a><br />
-      
-  <a href="../H5.user.html" TARGET="H5DocWin"><cite>User's Guide</cite></a>
-
-
-<hr />
-
-</body>
-</html>
-
diff --git a/html/UG/OldHtmlSource/UG_nav11Datatypes.html b/html/UG/OldHtmlSource/UG_nav11Datatypes.html
deleted file mode 100755
index 8c8492e..0000000
--- a/html/UG/OldHtmlSource/UG_nav11Datatypes.html
+++ /dev/null
@@ -1,298 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-<body bgcolor="d2e6ef">
-
-
-<!--
-<A HREF="READ1ST.HTML" Target="RdFirstWin" 
-    onClick="window.open("READ1ST.HTML","RdFirstWin","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=yes,resizable=1,width=500,height=250,titlebar=yes")">
-    <IMG SRC="GRAPHICS/READ1ST.GIF" BORDER=0 ALT="Read this first!"></A>
--->
-
-<font size="-1">
-<br />
-<!-- editingComment
-<div align=right>
-  ( <a href="UG_nav01.html">Expand TOC</a> )
-</div>
--->
-
-<a href="UG_front.html" TARGET="CONTENT">Title Page</a>
-<br />
-<a href="../Copyright.html" TARGET="CONTENT">Copyright</a>
-
-<!-- editingComment
-<br />
-(<a href="../H5_UG_Outline.pdf" TARGET="CONTENT">Complete outline</a>)
-
-<br />
-<br />
-(<a href="UG_feedback.html" TARGET="CONTENT">Feedback</a>)
-
-<br />
-(<a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/index.html#H5_NewUG" TARGET="CONTENT">doc_dev_snapshot</a>)
--->
-</font>
-<hr />
-<hr />
-
-<!--
-<a href="UG_front.html" TARGET="CONTENT"><IMG SRC="GRAPHICS/COVER.GIF" BORDER=0 ALT="HDF5 UG title page"></a><br />
--->
-
-<div align="center">
-<b>HDF5 User's Guide<br />Table of Contents</b>
-    <br />
-    <a href="UG_UpdateStatus.html" TARGET="CONTENT"><font size="-1"><i>Update Status</i></font></a>
-</div>
-<p>
-
-<!-- editingComment
-    <font color="#555555">
-    <a href="01_Intro.html" TARGET="CONTENT">Introduction</a>
-    </font>
-    <br />
-    -->
-
-<b>I. The Broad View</b>
-    <font color="#555555">
-<!-- editingComment
-      <br />  
-    <a href="02_WhatIs.html" TARGET="CONTENT">What is HDF5?</a>
--->
-      <br />  
-    <a href="UG_frame03DataModel.html" TARGET="_TOP">Data Model &</a>
-          <br />     
-          <a href="UG_frame03DataModel.html" TARGET="_TOP">File Structure</a>
-      <br />  
-    <a href="UG_frame04ProgModel.html" TARGET="_TOP">HDF5 Library &</a>
-          <br />     
-          <a href="UG_frame04ProgModel.html" TARGET="_TOP">Programming Model</a>
-    </font>
-
-<br />
-<b>II. Using HDF5 —<br />
-             The Specifics</b>
-    <font color="#555555">
-      <br />  
-<!-- editingComment
-    <a href="05_Quick.html" TARGET="CONTENT">Quick Start</a>
-      <br />  
-    <a href="06_Naming.html" TARGET="CONTENT">API Struture &</a>
-          <br />     
-          <a href="06_Naming.html" TARGET="CONTENT">Naming Conventions</a>
-      <br />  
-    <a href="07_DocSet.html" TARGET="CONTENT">Document Set</a>
-      <br />  
--->
-    <a href="UG_frame08TheFile.html" TARGET="_TOP">The File</a>
-      <br />  
-    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups</a> 
-<!--    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups and Links</a> 
--->
-      <br />  
-    <a href="UG_frame10Datasets.html" TARGET="_TOP">Datasets</a> 
-      <br />  
-<!--
-    <a href="UG_frameObjectsIdentifiers.html" TARGET="_TOP">Objects and 
-      Identifiers</a> 
-      <br />  
--->
-    <a href="UG_frame11Datatypes.html" TARGET="_TOP">Datatypes</a> 
-      
-      <font size="-1">
-      <br />      
-        <a href="11_Datatypes.html#Intro" TARGET="CONTENT">
-          Introduction</a>
-      <br />      
-        <a href="11_Datatypes.html#DtypesUsed" TARGET="CONTENT">
-          Datatype Usage</a>
-      <br />      
-        <a href="11_Datatypes.html#FileFunctSums" TARGET="CONTENT">
-          Function Summaries</a>
-      <br />      
-        <a href="11_Datatypes.html#Pmodel" TARGET="CONTENT">
-          Programming Model</a>
-      <br />      
-        <a href="11_Datatypes.html#NonNumDtypes" TARGET="CONTENT">
-          Non-numeric</a>
-      <br />        
-        <a href="11_Datatypes.html#NonNumDtypes" TARGET="CONTENT">
-          Datatypes</a>
-      <br />      
-        <a href="11_Datatypes.html#Fvalues" TARGET="CONTENT">
-          Fill Values</a>
-      <br />      
-        <a href="11_Datatypes.html#CCDtypes" TARGET="CONTENT">
-          Compound Datatypes</a>
-      <br />      
-        <a href="11_Datatypes.html#LCDtypeObj" TARGET="CONTENT">
-          Datatype Life Cycle</a>
-      <br />      
-        <a href="11_Datatypes.html#Dtransfer" TARGET="CONTENT">
-          Data Transfer</a>
-      <br />      
-        <a href="11_Datatypes.html#TextDescriptions" TARGET="CONTENT">
-          Text <–> Datatype</a>
-      <br />        
-        <a href="11_Datatypes.html#TextDescriptions" TARGET="CONTENT">
-          Conversions</a>
-      </font>
-      <br />  
-  
-    <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Dataspaces &</a>
-          <br />     
-          <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Partial I/O</a> 
-
-      <br />  
-    <a href="UG_frame13Attributes.html" TARGET="_TOP">Attributes</a>
-    
-      <br />  
-    <a href="UG_frame13ErrorHandling.html" TARGET="_TOP">Error Handling</a>
-  
-      <br />  
-    <a href="UG_frame14PropertyLists.html" TARGET="_TOP">Property Lists</a> 
-     
-<!--
-      <br />  
-    Images & Palettes
-      <br />  
-    Discarding Objects
-      <br />  
-    <a href="17_Filters.html" TARGET="CONTENT">Filters</a>
-      <br />  
-    Miscellaneous
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/VFL-clip-020924DRAFT.pdf" TARGET="CONTENT">VFL</a> (early clip) 
--->
-    </font>
-<br />
-<b>III. <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Additional Resources</a>
-      </b><br />
-<b>IV. <a href="http://www.hdfgroup.org/HDF5/examples/" 
-    TARGET="CONTENT">Code Examples</a></b><br />
-
-    <font color="#555555">
-<!-- NEED TO WRITE PER CH, CREATE UG_frame18Performance.html, AND LINK IT IN
-      <br />  
-      <a href="UG_frame18Performance.html" TARGET="_TOP">Performance</a>
-      <br />  
-      <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Special Topics</a>
-      <br />  
-      <a href="../ddl.html" TARGET="H5DocWin">DDL in BNF</a><br />
-            
-        <a href="../ddl.html" TARGET="H5DocWin">for HDF5</a><br />
-        
-      <a href="99_SelectedPassages.html" TARGET="CONTENT">Selected Passages</a><br />
-      <br />  
-    Higher Levels
-      <br />  
-    <a href="20_Parallel.html" TARGET="CONTENT">Parallel Environments</a>
--->
-<!-- editingComment
-      <br />  
-    Parallel Environments
-          <br />     
-          (in progress) 
--->
-<!--
-      <br />  
-    <a href="21_Perform.html" TARGET="CONTENT">Performance</a>
-      <br />  
-    Non-C Languages
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/H5UG-Cpplus-001221.pdf" TARGET="CONTENT">C++ User Notes</a>
--->
-<!--
-      <br />  
-    <a href="23_DDL.html" TARGET="CONTENT">DDL in BNF</a>
-      <br />  
-    <a href="24_XML-DTD.html" TARGET="CONTENT">XML DTD</a>
--->
-    </font>
-
-<!--
-<br />
-<b>IV. Tools</b>
-    <font color="#555555">
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5ls</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5dump</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5repart</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5toh4</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h4toh5</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">Java Tools</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">XML Tools</a>
-    </font>
--->
-
-<!--
-<br />
-<b>Appendices</b>
-    <font color="#555555">
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_PredefDTypes.html" TARGET="CONTENT">Predefined Datatypes</a>
-      <br />  
-    H4-to-H5 Mapping
-      <br />  
-    H5-to-H4 Mapping
-      <br />  
-    <a href="99_TechSupport.html" TARGET="CONTENT">Technical Support</a>
-      <br />
-    </font>
- -->
-
-
-<hr />
-
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-<!-- <small><i>Printable 
-    <a href="http://www.hdfgroup.org/HDF5/doc/PSandPDF/HDF5_UsersGuide.PDF" TARGET="CONTENT">PDF</a> 
-    of this User’s Guide</i></small>
-<hr />
--->
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-
-<div align="center">
-<b>Other HDF5 documents</b>
-</div>
-<br />
-
-
-<a href="../index.html" TARGET="H5DocWin">Full HDF5 doc set</a> for<br />
-       
-  the current release<br />
-
-<a href="../H5.intro.html" TARGET="H5DocWin"><cite>Introduction to HDF5</cite></a><br />
-
-<a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>HDF5 Reference</cite></a><br />
-      
-  <a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>Manual</cite></a><br />
-
-<a href="../H5.user.html" TARGET="H5DocWin"><cite>HDF5 Release 1.4.5</cite></a><br />
-      
-  <a href="../H5.user.html" TARGET="H5DocWin"><cite>User's Guide</cite></a>
-
-
-<hr />
-
-</body>
-</html>
-
diff --git a/html/UG/OldHtmlSource/UG_nav12Dataspaces.html b/html/UG/OldHtmlSource/UG_nav12Dataspaces.html
deleted file mode 100755
index 8d907c2..0000000
--- a/html/UG/OldHtmlSource/UG_nav12Dataspaces.html
+++ /dev/null
@@ -1,286 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-<body bgcolor="d2e6ef">
-
-
-<!--
-<A HREF="READ1ST.HTML" Target="RdFirstWin" 
-    onClick="window.open("READ1ST.HTML","RdFirstWin","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=yes,resizable=1,width=500,height=250,titlebar=yes")">
-    <IMG SRC="GRAPHICS/READ1ST.GIF" BORDER=0 ALT="Read this first!"></A>
--->
-
-<font size="-1">
-<br />
-<!-- editingComment
-<div align=right>
-  ( <a href="UG_nav01.html">Expand TOC</a> )
-</div>
--->
-
-<a href="UG_front.html" TARGET="CONTENT">Title Page</a>
-<br />
-<a href="../Copyright.html" TARGET="CONTENT">Copyright</a>
-
-<!-- editingComment
-<br />
-(<a href="../H5_UG_Outline.pdf" TARGET="CONTENT">Complete outline</a>)
-
-<br />
-<br />
-(<a href="UG_feedback.html" TARGET="CONTENT">Feedback</a>)
-
-<br />
-(<a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/index.html#H5_NewUG" TARGET="CONTENT">doc_dev_snapshot</a>)
--->
-</font>
-<hr />
-<hr />
-
-<!--
-<a href="UG_front.html" TARGET="CONTENT"><IMG SRC="GRAPHICS/COVER.GIF" BORDER=0 ALT="HDF5 UG title page"></a><br />
--->
-
-<div align="center">
-<b>HDF5 User's Guide<br />Table of Contents</b>
-    <br />
-    <a href="UG_UpdateStatus.html" TARGET="CONTENT"><font size="-1"><i>Update Status</i></font></a>
-</div>
-<p>
-
-<!-- editingComment
-    <font color="#555555">
-    <a href="01_Intro.html" TARGET="CONTENT">Introduction</a>
-    </font>
-    <br />
-    -->
-
-<b>I. The Broad View</b>
-    <font color="#555555">
-<!-- editingComment
-      <br />  
-    <a href="02_WhatIs.html" TARGET="CONTENT">What is HDF5?</a>
--->
-      <br />  
-    <a href="UG_frame03DataModel.html" TARGET="_TOP">Data Model &</a>
-          <br />     
-          <a href="UG_frame03DataModel.html" TARGET="_TOP">File Structure</a>
-      <br />  
-    <a href="UG_frame04ProgModel.html" TARGET="_TOP">HDF5 Library &</a>
-          <br />     
-          <a href="UG_frame04ProgModel.html" TARGET="_TOP">Programming Model</a>
-    </font>
-
-<br />
-<b>II. Using HDF5 —<br />
-             The Specifics</b>
-    <font color="#555555">
-      <br />  
-<!-- editingComment
-    <a href="05_Quick.html" TARGET="CONTENT">Quick Start</a>
-      <br />  
-    <a href="06_Naming.html" TARGET="CONTENT">API Struture &</a>
-          <br />     
-          <a href="06_Naming.html" TARGET="CONTENT">Naming Conventions</a>
-      <br />  
-    <a href="07_DocSet.html" TARGET="CONTENT">Document Set</a>
-      <br />  
--->
-    <a href="UG_frame08TheFile.html" TARGET="_TOP">The File</a>
-      <br />  
-    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups</a> 
-<!--    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups and Links</a> 
--->
-      <br />  
-    <a href="UG_frame10Datasets.html" TARGET="_TOP">Datasets</a> 
-      <br />  
-<!--
-    <a href="UG_frameObjectsIdentifiers.html" TARGET="_TOP">Objects and 
-      Identifiers</a> 
-      <br />  
--->
-    <a href="UG_frame11Datatypes.html" TARGET="_TOP">Datatypes</a> 
-
-      <br />  
-    <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Dataspaces &</a>
-          <br />     
-          <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Partial I/O</a>
-      
-      <font size="-1">
-      <br />         
-        <a href="12_Dataspaces.html#Intro" TARGET="CONTENT">
-          Introduction</a>
-      <br />         
-        <a href="12_Dataspaces.html#DSpaceFunctSums" TARGET="CONTENT">
-          Function Summaries</a>
-      <br />         
-        <a href="12_Dataspaces.html#DefDataObjs" TARGET="CONTENT">
-          Dataspace Objects</a>
-      <br />         
-        <a href="12_Dataspaces.html#ProgModel" TARGET="CONTENT">
-          Programming Model</a>
-      <br />         
-        <a href="12_Dataspaces.html#DTransfer" TARGET="CONTENT">
-          Data Transfer</a>
-      <br />         
-        <a href="12_Dataspaces.html#DSelectTransfer" TARGET="CONTENT">
-          Selection Operations</a>
-      <br />         
-        <a href="12_Dataspaces.html#DRegions" TARGET="CONTENT">
-          Region References </a>
-      <br />         
-        <a href="12_Dataspaces.html#Programs" TARGET="CONTENT">
-          Sample programs</a>
-      </font>
-  
-      <br />  
-    <a href="UG_frame13Attributes.html" TARGET="_TOP">Attributes</a>
-
-      <br />  
-    <a href="UG_frame13ErrorHandling.html" TARGET="_TOP">Error Handling</a>
-  
-      <br />  
-    <a href="UG_frame14PropertyLists.html" TARGET="_TOP">Property Lists</a> 
-    
-<!--
-      <br />  
-    Images & Palettes
-      <br />  
-    Discarding Objects
-      <br />  
-    <a href="17_Filters.html" TARGET="CONTENT">Filters</a>
-      <br />  
-    Miscellaneous
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/VFL-clip-020924DRAFT.pdf" TARGET="CONTENT">VFL</a> (early clip) 
--->
-    </font>
-<br />
-<b>III. <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Additional Resources</a>
-      </b><br />
-<b>IV. <a href="http://www.hdfgroup.org/HDF5/examples/" 
-    TARGET="CONTENT">Code Examples</a></b><br />
-
-    <font color="#555555">
-<!-- NEED TO WRITE PER CH, CREATE UG_frame18Performance.html, AND LINK IT IN
-      <br />  
-      <a href="UG_frame18Performance.html" TARGET="_TOP">Performance</a>
-      <br />  
-      <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Special Topics</a>
-      <br />  
-      <a href="../ddl.html" TARGET="H5DocWin">DDL in BNF</a><br />
-            
-        <a href="../ddl.html" TARGET="H5DocWin">for HDF5</a><br />
-        
-      <a href="99_SelectedPassages.html" TARGET="CONTENT">Selected Passages</a><br />
-      <br />  
-    Higher Levels
-      <br />  
-    <a href="20_Parallel.html" TARGET="CONTENT">Parallel Environments</a>
--->
-<!-- editingComment
-      <br />  
-    Parallel Environments
-          <br />     
-          (in progress) 
--->
-<!--
-      <br />  
-    <a href="21_Perform.html" TARGET="CONTENT">Performance</a>
-      <br />  
-    Non-C Languages
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/H5UG-Cpplus-001221.pdf" TARGET="CONTENT">C++ User Notes</a>
--->
-<!--
-      <br />  
-    <a href="23_DDL.html" TARGET="CONTENT">DDL in BNF</a>
-      <br />  
-    <a href="24_XML-DTD.html" TARGET="CONTENT">XML DTD</a>
--->
-    </font>
-
-<!--
-<br />
-<b>IV. Tools</b>
-    <font color="#555555">
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5ls</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5dump</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5repart</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5toh4</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h4toh5</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">Java Tools</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">XML Tools</a>
-    </font>
--->
-
-<!--
-<br />
-<b>Appendices</b>
-    <font color="#555555">
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_PredefDTypes.html" TARGET="CONTENT">Predefined Datatypes</a>
-      <br />  
-    H4-to-H5 Mapping
-      <br />  
-    H5-to-H4 Mapping
-      <br />  
-    <a href="99_TechSupport.html" TARGET="CONTENT">Technical Support</a>
-      <br />
-    </font>
- -->
-
-
-<hr />
-
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-<!-- <small><i>Printable 
-    <a href="http://www.hdfgroup.org/HDF5/doc/PSandPDF/HDF5_UsersGuide.PDF" TARGET="CONTENT">PDF</a> 
-    of this User’s Guide</i></small>
-<hr />
--->
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-
-<div align="center">
-<b>Other HDF5 documents</b>
-</div>
-<br />
-
-
-<a href="../index.html" TARGET="H5DocWin">Full HDF5 doc set</a> for<br />
-       
-  the current release<br />
-
-<a href="../H5.intro.html" TARGET="H5DocWin"><cite>Introduction to HDF5</cite></a><br />
-
-<a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>HDF5 Reference</cite></a><br />
-      
-  <a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>Manual</cite></a><br />
-
-<a href="../H5.user.html" TARGET="H5DocWin"><cite>HDF5 Release 1.4.5</cite></a><br />
-      
-  <a href="../H5.user.html" TARGET="H5DocWin"><cite>User's Guide</cite></a>
-
-
-<hr />
-
-</body>
-</html>
-
diff --git a/html/UG/OldHtmlSource/UG_nav13Attributes.html b/html/UG/OldHtmlSource/UG_nav13Attributes.html
deleted file mode 100755
index 59cbf5d..0000000
--- a/html/UG/OldHtmlSource/UG_nav13Attributes.html
+++ /dev/null
@@ -1,277 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-<body bgcolor="d2e6ef">
-
-
-<!--
-<A HREF="READ1ST.HTML" Target="RdFirstWin" 
-    onClick="window.open("READ1ST.HTML","RdFirstWin","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=yes,resizable=1,width=500,height=250,titlebar=yes")">
-    <IMG SRC="GRAPHICS/READ1ST.GIF" BORDER=0 ALT="Read this first!"></A>
--->
-
-<font size="-1">
-<br />
-<!-- editingComment
-<div align=right>
-  ( <a href="UG_nav01.html">Expand TOC</a> )
-</div>
--->
-
-<a href="UG_front.html" TARGET="CONTENT">Title Page</a>
-<br />
-<a href="../Copyright.html" TARGET="CONTENT">Copyright</a>
-
-<!-- editingComment
-<br />
-(<a href="../H5_UG_Outline.pdf" TARGET="CONTENT">Complete outline</a>)
-
-<br />
-<br />
-(<a href="UG_feedback.html" TARGET="CONTENT">Feedback</a>)
-
-<br />
-(<a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/index.html#H5_NewUG" TARGET="CONTENT">doc_dev_snapshot</a>)
--->
-</font>
-<hr />
-<hr />
-
-<!--
-<a href="UG_front.html" TARGET="CONTENT"><IMG SRC="GRAPHICS/COVER.GIF" BORDER=0 ALT="HDF5 UG title page"></a><br />
--->
-
-<div align="center">
-<b>HDF5 User's Guide<br />Table of Contents</b>
-    <br />
-    <a href="UG_UpdateStatus.html" TARGET="CONTENT"><font size="-1"><i>Update Status</i></font></a>
-</div>
-<p>
-
-<!-- editingComment
-    <font color="#555555">
-    <a href="01_Intro.html" TARGET="CONTENT">Introduction</a>
-    </font>
-    <br />
-    -->
-
-<b>I. The Broad View</b>
-    <font color="#555555">
-<!-- editingComment
-      <br />  
-    <a href="02_WhatIs.html" TARGET="CONTENT">What is HDF5?</a>
--->
-      <br />  
-    <a href="UG_frame03DataModel.html" TARGET="_TOP">Data Model &</a>
-          <br />     
-          <a href="UG_frame03DataModel.html" TARGET="_TOP">File Structure</a>
-      <br />  
-    <a href="UG_frame04ProgModel.html" TARGET="_TOP">HDF5 Library &</a>
-          <br />     
-          <a href="UG_frame04ProgModel.html" TARGET="_TOP">Programming Model</a>
-    </font>
-
-<br />
-<b>II. Using HDF5 —<br />
-             The Specifics</b>
-    <font color="#555555">
-      <br />  
-<!-- editingComment
-    <a href="05_Quick.html" TARGET="CONTENT">Quick Start</a>
-      <br />  
-    <a href="06_Naming.html" TARGET="CONTENT">API Struture &</a>
-          <br />     
-          <a href="06_Naming.html" TARGET="CONTENT">Naming Conventions</a>
-      <br />  
-    <a href="07_DocSet.html" TARGET="CONTENT">Document Set</a>
-      <br />  
--->
-    <a href="UG_frame08TheFile.html" TARGET="_TOP">The File</a>
-      <br />  
-    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups</a> 
-<!--    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups and Links</a> 
--->
-      <br />  
-    <a href="UG_frame10Datasets.html" TARGET="_TOP">Datasets</a> 
-      <br />  
-<!--
-    <a href="UG_frameObjectsIdentifiers.html" TARGET="_TOP">Objects and 
-      Identifiers</a> 
-      <br />  
--->
-    <a href="UG_frame11Datatypes.html" TARGET="_TOP">Datatypes</a> 
-
-      <br />  
-    <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Dataspaces &</a>
-          <br />     
-          <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Partial I/O</a> 
-
-      <br />  
-    <a href="UG_frame13Attributes.html" TARGET="_TOP">Attributes</a>
-  
-      <font size="-1">
-      <br />        
-        <a href="13_Attributes.html#Intro" TARGET="CONTENT">
-          Introduction</a>
-      <br />      
-        <a href="13_Attributes.html#Model" TARGET="CONTENT">
-          Programming Model</a>
-      <br />      
-        <a href="13_Attributes.html#Functions" TARGET="CONTENT">
-          Function Summaries</a>
-      <br />      
-        <a href="13_Attributes.html#Working1" TARGET="CONTENT">
-          Attribute Usage</a>
-      <br />      
-        <a href="13_Attributes.html#SpecIssues" TARGET="CONTENT">
-          Special Issues</a>
-      </font>
-      
-      <br />  
-    <a href="UG_frame13ErrorHandling.html" TARGET="_TOP">Error Handling</a>
-  
-      <br />  
-    <a href="UG_frame14PropertyLists.html" TARGET="_TOP">Property Lists</a> 
-  
-<!--
-      <br />  
-    Images & Palettes
-      <br />  
-    Discarding Objects
-      <br />  
-    <a href="17_Filters.html" TARGET="CONTENT">Filters</a>
-      <br />  
-    Miscellaneous
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/VFL-clip-020924DRAFT.pdf" TARGET="CONTENT">VFL</a> (early clip) 
--->
-    </font>
-<br />
-<b>III. <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Additional Resources</a>
-      </b><br />
-<b>IV. <a href="http://www.hdfgroup.org/HDF5/examples/" 
-    TARGET="CONTENT">Code Examples</a></b><br />
-
-    <font color="#555555">
-<!-- NEED TO WRITE PER CH, CREATE UG_frame18Performance.html, AND LINK IT IN
-      <br />  
-      <a href="UG_frame18Performance.html" TARGET="_TOP">Performance</a>
-      <br />  
-      <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Special Topics</a>
-      <br />  
-      <a href="../ddl.html" TARGET="H5DocWin">DDL in BNF</a><br />
-            
-        <a href="../ddl.html" TARGET="H5DocWin">for HDF5</a><br />
-        
-      <a href="99_SelectedPassages.html" TARGET="CONTENT">Selected Passages</a><br />
-      <br />  
-    Higher Levels
-      <br />  
-    <a href="20_Parallel.html" TARGET="CONTENT">Parallel Environments</a>
--->
-<!-- editingComment
-      <br />  
-    Parallel Environments
-          <br />     
-          (in progress) 
--->
-<!--
-      <br />  
-    <a href="21_Perform.html" TARGET="CONTENT">Performance</a>
-      <br />  
-    Non-C Languages
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/H5UG-Cpplus-001221.pdf" TARGET="CONTENT">C++ User Notes</a>
--->
-<!--
-      <br />  
-    <a href="23_DDL.html" TARGET="CONTENT">DDL in BNF</a>
-      <br />  
-    <a href="24_XML-DTD.html" TARGET="CONTENT">XML DTD</a>
--->
-    </font>
-
-<!--
-<br />
-<b>IV. Tools</b>
-    <font color="#555555">
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5ls</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5dump</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5repart</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5toh4</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h4toh5</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">Java Tools</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">XML Tools</a>
-    </font>
--->
-
-<!--
-<br />
-<b>Appendices</b>
-    <font color="#555555">
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_PredefDTypes.html" TARGET="CONTENT">Predefined Datatypes</a>
-      <br />  
-    H4-to-H5 Mapping
-      <br />  
-    H5-to-H4 Mapping
-      <br />  
-    <a href="99_TechSupport.html" TARGET="CONTENT">Technical Support</a>
-      <br />
-    </font>
- -->
-
-
-<hr />
-
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-<!-- <small><i>Printable 
-    <a href="http://www.hdfgroup.org/HDF5/doc/PSandPDF/HDF5_UsersGuide.PDF" TARGET="CONTENT">PDF</a> 
-    of this User’s Guide</i></small>
-<hr />
--->
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-
-<div align="center">
-<b>Other HDF5 documents</b>
-</div>
-<br />
-
-
-<a href="../index.html" TARGET="H5DocWin">Full HDF5 doc set</a> for<br />
-       
-  the current release<br />
-
-<a href="../H5.intro.html" TARGET="H5DocWin"><cite>Introduction to HDF5</cite></a><br />
-
-<a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>HDF5 Reference</cite></a><br />
-      
-  <a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>Manual</cite></a><br />
-
-<a href="../H5.user.html" TARGET="H5DocWin"><cite>HDF5 Release 1.4.5</cite></a><br />
-      
-  <a href="../H5.user.html" TARGET="H5DocWin"><cite>User's Guide</cite></a>
-
-
-<hr />
-
-</body>
-</html>
-
diff --git a/html/UG/OldHtmlSource/UG_nav13ErrorHandling.html b/html/UG/OldHtmlSource/UG_nav13ErrorHandling.html
deleted file mode 100755
index 948cba8..0000000
--- a/html/UG/OldHtmlSource/UG_nav13ErrorHandling.html
+++ /dev/null
@@ -1,286 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-<body bgcolor="d2e6ef">
-
-
-<!--
-<A HREF="READ1ST.HTML" Target="RdFirstWin" 
-    onClick="window.open("READ1ST.HTML","RdFirstWin","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=yes,resizable=1,width=500,height=250,titlebar=yes")">
-    <IMG SRC="GRAPHICS/READ1ST.GIF" BORDER=0 ALT="Read this first!"></A>
--->
-
-<font size="-1">
-<br />
-<!-- editingComment
-<div align=right>
-  ( <a href="UG_nav01.html">Expand TOC</a> )
-</div>
--->
-
-<a href="UG_front.html" TARGET="CONTENT">Title Page</a>
-<br />
-<a href="../Copyright.html" TARGET="CONTENT">Copyright</a>
-
-<!-- editingComment
-<br />
-(<a href="../H5_UG_Outline.pdf" TARGET="CONTENT">Complete outline</a>)
-
-<br />
-<br />
-(<a href="UG_feedback.html" TARGET="CONTENT">Feedback</a>)
-
-<br />
-(<a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/index.html#H5_NewUG" TARGET="CONTENT">doc_dev_snapshot</a>)
--->
-</font>
-<hr />
-<hr />
-
-<!--
-<a href="UG_front.html" TARGET="CONTENT"><IMG SRC="GRAPHICS/COVER.GIF" BORDER=0 ALT="HDF5 UG title page"></a><br />
--->
-
-<div align="center">
-<b>HDF5 User's Guide<br />Table of Contents</b>
-    <br />
-    <a href="UG_UpdateStatus.html" TARGET="CONTENT"><font size="-1"><i>Update Status</i></font></a>
-</div>
-<p>
-
-<!-- editingComment
-    <font color="#555555">
-    <a href="01_Intro.html" TARGET="CONTENT">Introduction</a>
-    </font>
-    <br />
-    -->
-
-<b>I. The Broad View</b>
-    <font color="#555555">
-<!-- editingComment
-      <br />  
-    <a href="02_WhatIs.html" TARGET="CONTENT">What is HDF5?</a>
--->
-      <br />  
-    <a href="UG_frame03DataModel.html" TARGET="_TOP">Data Model &</a>
-          <br />     
-          <a href="UG_frame03DataModel.html" TARGET="_TOP">File Structure</a>
-      <br />  
-    <a href="UG_frame04ProgModel.html" TARGET="_TOP">HDF5 Library &</a>
-          <br />     
-          <a href="UG_frame04ProgModel.html" TARGET="_TOP">Programming Model</a>
-    </font>
-
-<br />
-<b>II. Using HDF5 —<br />
-             The Specifics</b>
-    <font color="#555555">
-      <br />  
-<!-- editingComment
-    <a href="05_Quick.html" TARGET="CONTENT">Quick Start</a>
-      <br />  
-    <a href="06_Naming.html" TARGET="CONTENT">API Struture &</a>
-          <br />     
-          <a href="06_Naming.html" TARGET="CONTENT">Naming Conventions</a>
-      <br />  
-    <a href="07_DocSet.html" TARGET="CONTENT">Document Set</a>
-      <br />  
--->
-    <a href="UG_frame08TheFile.html" TARGET="_TOP">The File</a>
-      <br />  
-    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups</a> 
-<!--    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups and Links</a> 
--->
-      <br />  
-    <a href="UG_frame10Datasets.html" TARGET="_TOP">Datasets</a> 
-      <br />  
-<!--
-    <a href="UG_frameObjectsIdentifiers.html" TARGET="_TOP">Objects and 
-      Identifiers</a> 
-      <br />  
--->
-    <a href="UG_frame11Datatypes.html" TARGET="_TOP">Datatypes</a> 
-
-      <br />  
-    <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Dataspaces &</a>
-          <br />     
-          <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Partial I/O</a> 
-
-      <br />  
-    <a href="UG_frame13Attributes.html" TARGET="_TOP">Attributes</a>
-      
-      <br />  
-    <a href="UG_frame13ErrorHandling.html" TARGET="_TOP">Error Handling</a>
-    
-      <font size="-1">
-      <br />        
-        <a href="13_ErrorHandling.html#Intro" TARGET="CONTENT">
-          Introduction</a>
-      <br />        
-        <a href="13_ErrorHandling.html#ProgModel" TARGET="CONTENT">
-          Programming Model</a>
-      <br />        
-        <a href="13_ErrorHandling.html#ErrorHandling" TARGET="CONTENT">
-          Error Handling (H5E)</a> 
-      <br />          
-        <a href="13_ErrorHandling.html#ErrorHandling" TARGET="CONTENT">
-          Function Summaries</a>
-      <br />        
-        <a href="13_ErrorHandling.html#BasicErrorHandling" TARGET="CONTENT">
-          Basic Error Handling</a> 
-      <br />          
-        <a href="13_ErrorHandling.html#BasicErrorHandling" TARGET="CONTENT">
-          Operations</a>
-      <br />        
-        <a href="13_ErrorHandling.html#AdvancedErrorHandling" TARGET="CONTENT">
-          Advanced Error Handling</a> 
-      <br />          
-        <a href="13_ErrorHandling.html#AdvancedErrorHandling" TARGET="CONTENT">
-          Operations</a>
-      </font>
-  
-      <br />  
-    <a href="UG_frame14PropertyLists.html" TARGET="_TOP">Property Lists</a> 
-  
-<!--
-      <br />  
-    Images & Palettes
-      <br />  
-    Discarding Objects
-      <br />  
-    <a href="17_Filters.html" TARGET="CONTENT">Filters</a>
-      <br />  
-    Miscellaneous
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/VFL-clip-020924DRAFT.pdf" TARGET="CONTENT">VFL</a> (early clip) 
--->
-    </font>
-<br />
-<b>III. <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Additional Resources</a>
-      </b><br />
-<b>IV. <a href="http://www.hdfgroup.org/HDF5/examples/" 
-    TARGET="CONTENT">Code Examples</a></b><br />
-
-    <font color="#555555">
-<!-- NEED TO WRITE PER CH, CREATE UG_frame18Performance.html, AND LINK IT IN
-      <br />  
-      <a href="UG_frame18Performance.html" TARGET="_TOP">Performance</a>
-      <br />  
-      <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Special Topics</a>
-      <br />  
-      <a href="../ddl.html" TARGET="H5DocWin">DDL in BNF</a><br />
-            
-        <a href="../ddl.html" TARGET="H5DocWin">for HDF5</a><br />
-        
-      <a href="99_SelectedPassages.html" TARGET="CONTENT">Selected Passages</a><br />
-      <br />  
-    Higher Levels
-      <br />  
-    <a href="20_Parallel.html" TARGET="CONTENT">Parallel Environments</a>
--->
-<!-- editingComment
-      <br />  
-    Parallel Environments
-          <br />     
-          (in progress) 
--->
-<!--
-      <br />  
-    <a href="21_Perform.html" TARGET="CONTENT">Performance</a>
-      <br />  
-    Non-C Languages
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/H5UG-Cpplus-001221.pdf" TARGET="CONTENT">C++ User Notes</a>
--->
-<!--
-      <br />  
-    <a href="23_DDL.html" TARGET="CONTENT">DDL in BNF</a>
-      <br />  
-    <a href="24_XML-DTD.html" TARGET="CONTENT">XML DTD</a>
--->
-    </font>
-
-<!--
-<br />
-<b>IV. Tools</b>
-    <font color="#555555">
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5ls</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5dump</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5repart</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5toh4</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h4toh5</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">Java Tools</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">XML Tools</a>
-    </font>
--->
-
-<!--
-<br />
-<b>Appendices</b>
-    <font color="#555555">
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_PredefDTypes.html" TARGET="CONTENT">Predefined Datatypes</a>
-      <br />  
-    H4-to-H5 Mapping
-      <br />  
-    H5-to-H4 Mapping
-      <br />  
-    <a href="99_TechSupport.html" TARGET="CONTENT">Technical Support</a>
-      <br />
-    </font>
- -->
-
-
-<hr />
-
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-<!-- <small><i>Printable 
-    <a href="http://www.hdfgroup.org/HDF5/doc/PSandPDF/HDF5_UsersGuide.PDF" TARGET="CONTENT">PDF</a> 
-    of this User’s Guide</i></small>
-<hr />
--->
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-
-<div align="center">
-<b>Other HDF5 documents</b>
-</div>
-<br />
-
-
-<a href="../index.html" TARGET="H5DocWin">Full HDF5 doc set</a> for<br />
-       
-  the current release<br />
-
-<a href="../H5.intro.html" TARGET="H5DocWin"><cite>Introduction to HDF5</cite></a><br />
-
-<a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>HDF5 Reference</cite></a><br />
-      
-  <a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>Manual</cite></a><br />
-
-<a href="../H5.user.html" TARGET="H5DocWin"><cite>HDF5 Release 1.4.5</cite></a><br />
-      
-  <a href="../H5.user.html" TARGET="H5DocWin"><cite>User's Guide</cite></a>
-
-
-<hr />
-
-</body>
-</html>
-
diff --git a/html/UG/OldHtmlSource/UG_nav14PropertyLists.html b/html/UG/OldHtmlSource/UG_nav14PropertyLists.html
deleted file mode 100755
index 5c4668b..0000000
--- a/html/UG/OldHtmlSource/UG_nav14PropertyLists.html
+++ /dev/null
@@ -1,284 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-<body bgcolor="d2e6ef">
-
-
-<!--
-<A HREF="READ1ST.HTML" Target="RdFirstWin" 
-    onClick="window.open("READ1ST.HTML","RdFirstWin","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=yes,resizable=1,width=500,height=250,titlebar=yes")">
-    <IMG SRC="GRAPHICS/READ1ST.GIF" BORDER=0 ALT="Read this first!"></A>
--->
-
-<font size="-1">
-<br />
-<!-- editingComment
-<div align=right>
-  ( <a href="UG_nav01.html">Expand TOC</a> )
-</div>
--->
-
-<a href="UG_front.html" TARGET="CONTENT">Title Page</a>
-<br />
-<a href="../Copyright.html" TARGET="CONTENT">Copyright</a>
-
-<!-- editingComment
-<br />
-(<a href="../H5_UG_Outline.pdf" TARGET="CONTENT">Complete outline</a>)
-
-<br />
-<br />
-(<a href="UG_feedback.html" TARGET="CONTENT">Feedback</a>)
-
-<br />
-(<a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/index.html#H5_NewUG" TARGET="CONTENT">doc_dev_snapshot</a>)
--->
-</font>
-<hr />
-<hr />
-
-<!--
-<a href="UG_front.html" TARGET="CONTENT"><IMG SRC="GRAPHICS/COVER.GIF" BORDER=0 ALT="HDF5 UG title page"></a><br />
--->
-
-<div align="center">
-<b>HDF5 User's Guide<br />Table of Contents</b>
-    <br />
-    <a href="UG_UpdateStatus.html" TARGET="CONTENT"><font size="-1"><i>Update Status</i></font></a>
-</div>
-<p>
-
-<!-- editingComment
-    <font color="#555555">
-    <a href="01_Intro.html" TARGET="CONTENT">Introduction</a>
-    </font>
-    <br />
-    -->
-
-<b>I. The Broad View</b>
-    <font color="#555555">
-<!-- editingComment
-      <br />  
-    <a href="02_WhatIs.html" TARGET="CONTENT">What is HDF5?</a>
--->
-      <br />  
-    <a href="UG_frame03DataModel.html" TARGET="_TOP">Data Model &</a>
-          <br />     
-          <a href="UG_frame03DataModel.html" TARGET="_TOP">File Structure</a>
-      <br />  
-    <a href="UG_frame04ProgModel.html" TARGET="_TOP">HDF5 Library &</a>
-          <br />     
-          <a href="UG_frame04ProgModel.html" TARGET="_TOP">Programming Model</a>
-    </font>
-
-<br />
-<b>II. Using HDF5 —<br />
-             The Specifics</b>
-    <font color="#555555">
-      <br />  
-<!-- editingComment
-    <a href="05_Quick.html" TARGET="CONTENT">Quick Start</a>
-      <br />  
-    <a href="06_Naming.html" TARGET="CONTENT">API Struture &</a>
-          <br />     
-          <a href="06_Naming.html" TARGET="CONTENT">Naming Conventions</a>
-      <br />  
-    <a href="07_DocSet.html" TARGET="CONTENT">Document Set</a>
-      <br />  
--->
-    <a href="UG_frame08TheFile.html" TARGET="_TOP">The File</a>
-      <br />  
-    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups</a> 
-<!--    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups and Links</a> 
--->
-      <br />  
-    <a href="UG_frame10Datasets.html" TARGET="_TOP">Datasets</a> 
-      <br />  
-<!--
-    <a href="UG_frameObjectsIdentifiers.html" TARGET="_TOP">Objects and 
-      Identifiers</a> 
-      <br />  
--->
-    <a href="UG_frame11Datatypes.html" TARGET="_TOP">Datatypes</a> 
-
-      <br />  
-    <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Dataspaces &</a>
-          <br />     
-          <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Partial I/O</a> 
-
-      <br />  
-    <a href="UG_frame13Attributes.html" TARGET="_TOP">Attributes</a>
-
-      <br />  
-    <a href="UG_frame13ErrorHandling.html" TARGET="_TOP">Error Handling</a>
-  
-      <br />  
-    <a href="UG_frame14PropertyLists.html" TARGET="_TOP">Property Lists</a> 
-      
-      <font size="-1">
-      <br />        
-        <a href="14_PropertyLists.html#Intro" TARGET="CONTENT">
-          Introduction</a>
-      <br />      
-        <a href="14_PropertyLists.html#PListHierarchy" TARGET="CONTENT">
-          Properties, Lists, & Classes</a>
-      <br />      
-        <a href="14_PropertyLists.html#ProgModel" TARGET="CONTENT">
-          Programming Model</a>
-      <br />      
-        <a href="14_PropertyLists.html#GenericPLists" TARGET="CONTENT">
-          Generic Operations &</a>
-      <br />        
-        <a href="14_PropertyLists.html#GenericPLists" TARGET="CONTENT">
-          User-defined Properties</a>
-      <br />      
-        <a href="14_PropertyLists.html#FunctionSumms" TARGET="CONTENT">
-          Function Summaries</a>
-      <br />      
-        <a href="14_PropertyLists.html#AddlPListResources" TARGET="CONTENT">
-          Additional Resources</a>
-      </font>
-    
-  
-<!--
-      <br />  
-    Images & Palettes
-      <br />  
-    Discarding Objects
-      <br />  
-    <a href="17_Filters.html" TARGET="CONTENT">Filters</a>
-      <br />  
-    Miscellaneous
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/VFL-clip-020924DRAFT.pdf" TARGET="CONTENT">VFL</a> (early clip) 
--->
-    </font>
-<br />
-<b>III. <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Additional Resources</a>
-      </b><br />
-<b>IV. <a href="http://www.hdfgroup.org/HDF5/examples/" 
-    TARGET="CONTENT">Code Examples</a></b><br />
-
-    <font color="#555555">
-<!-- NEED TO WRITE PER CH, CREATE UG_frame18Performance.html, AND LINK IT IN
-      <br />  
-      <a href="UG_frame18Performance.html" TARGET="_TOP">Performance</a>
-      <br />  
-      <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Special Topics</a>
-      <br />  
-      <a href="../ddl.html" TARGET="H5DocWin">DDL in BNF</a><br />
-            
-        <a href="../ddl.html" TARGET="H5DocWin">for HDF5</a><br />
-        
-      <a href="99_SelectedPassages.html" TARGET="CONTENT">Selected Passages</a><br />
-      <br />  
-    Higher Levels
-      <br />  
-    <a href="20_Parallel.html" TARGET="CONTENT">Parallel Environments</a>
--->
-<!-- editingComment
-      <br />  
-    Parallel Environments
-          <br />     
-          (in progress) 
--->
-<!--
-      <br />  
-    <a href="21_Perform.html" TARGET="CONTENT">Performance</a>
-      <br />  
-    Non-C Languages
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/H5UG-Cpplus-001221.pdf" TARGET="CONTENT">C++ User Notes</a>
--->
-<!--
-      <br />  
-    <a href="23_DDL.html" TARGET="CONTENT">DDL in BNF</a>
-      <br />  
-    <a href="24_XML-DTD.html" TARGET="CONTENT">XML DTD</a>
--->
-    </font>
-
-<!--
-<br />
-<b>IV. Tools</b>
-    <font color="#555555">
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5ls</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5dump</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5repart</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5toh4</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h4toh5</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">Java Tools</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">XML Tools</a>
-    </font>
--->
-
-<!--
-<br />
-<b>Appendices</b>
-    <font color="#555555">
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_PredefDTypes.html" TARGET="CONTENT">Predefined Datatypes</a>
-      <br />  
-    H4-to-H5 Mapping
-      <br />  
-    H5-to-H4 Mapping
-      <br />  
-    <a href="99_TechSupport.html" TARGET="CONTENT">Technical Support</a>
-      <br />
-    </font>
- -->
-
-
-<hr />
-
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-<!-- <small><i>Printable 
-    <a href="http://www.hdfgroup.org/HDF5/doc/PSandPDF/HDF5_UsersGuide.PDF" TARGET="CONTENT">PDF</a> 
-    of this User’s Guide</i></small>
-<hr />
--->
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-
-<div align="center">
-<b>Other HDF5 documents</b>
-</div>
-<br />
-
-
-<a href="../index.html" TARGET="H5DocWin">Full HDF5 doc set</a> for<br />
-       
-  the current release<br />
-
-<a href="../H5.intro.html" TARGET="H5DocWin"><cite>Introduction to HDF5</cite></a><br />
-
-<a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>HDF5 Reference</cite></a><br />
-      
-  <a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>Manual</cite></a><br />
-
-<a href="../H5.user.html" TARGET="H5DocWin"><cite>HDF5 Release 1.4.5</cite></a><br />
-      
-  <a href="../H5.user.html" TARGET="H5DocWin"><cite>User's Guide</cite></a>
-
-
-<hr />
-
-</body>
-</html>
-
diff --git a/html/UG/OldHtmlSource/UG_nav17SpecialTopics.html b/html/UG/OldHtmlSource/UG_nav17SpecialTopics.html
deleted file mode 100755
index 2b1d16b..0000000
--- a/html/UG/OldHtmlSource/UG_nav17SpecialTopics.html
+++ /dev/null
@@ -1,268 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-<body bgcolor="d2e6ef">
-
-
-<!--
-<A HREF="READ1ST.HTML" Target="RdFirstWin" 
-    onClick="window.open("READ1ST.HTML","RdFirstWin","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=yes,resizable=1,width=500,height=250,titlebar=yes")">
-    <IMG SRC="GRAPHICS/READ1ST.GIF" BORDER=0 ALT="Read this first!"></A>
--->
-
-<font size="-1">
-<br />
-<!-- editingComment
-<div align=right>
-  ( <a href="UG_nav01.html">Expand TOC</a> )
-</div>
--->
-
-<a href="UG_front.html" TARGET="CONTENT">Title Page</a>
-<br />
-<a href="../Copyright.html" TARGET="CONTENT">Copyright</a>
-
-<!-- editingComment
-<br />
-(<a href="../H5_UG_Outline.pdf" TARGET="CONTENT">Complete outline</a>)
-
-<br />
-<br />
-(<a href="UG_feedback.html" TARGET="CONTENT">Feedback</a>)
-
-<br />
-(<a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/index.html#H5_NewUG" TARGET="CONTENT">doc_dev_snapshot</a>)
--->
-</font>
-<hr />
-<hr />
-
-<!--
-<a href="UG_front.html" TARGET="CONTENT"><IMG SRC="GRAPHICS/COVER.GIF" BORDER=0 ALT="HDF5 UG title page"></a><br />
--->
-
-<div align="center">
-<b>HDF5 User's Guide<br />Table of Contents</b>
-    <br />
-    <a href="UG_UpdateStatus.html" TARGET="CONTENT"><font size="-1"><i>Update Status</i></font></a>
-</div>
-<p>
-
-<!-- editingComment
-    <font color="#555555">
-    <a href="01_Intro.html" TARGET="CONTENT">Introduction</a>
-    </font>
-    <br />
-    -->
-
-<b>I. The Broad View</b>
-    <font color="#555555">
-<!-- editingComment
-      <br />  
-    <a href="02_WhatIs.html" TARGET="CONTENT">What is HDF5?</a>
--->
-      <br />  
-    <a href="UG_frame03DataModel.html" TARGET="_TOP">Data Model &</a>
-          <br />     
-          <a href="UG_frame03DataModel.html" TARGET="_TOP">File Structure</a>
-      <br />  
-    <a href="UG_frame04ProgModel.html" TARGET="_TOP">HDF5 Library &</a>
-          <br />     
-          <a href="UG_frame04ProgModel.html" TARGET="_TOP">Programming Model</a>
-    </font>
-
-<br />
-<b>II. Using HDF5 —<br />
-             The Specifics</b>
-    <font color="#555555">
-      <br />  
-<!-- editingComment
-    <a href="05_Quick.html" TARGET="CONTENT">Quick Start</a>
-      <br />  
-    <a href="06_Naming.html" TARGET="CONTENT">API Struture &</a>
-          <br />     
-          <a href="06_Naming.html" TARGET="CONTENT">Naming Conventions</a>
-      <br />  
-    <a href="07_DocSet.html" TARGET="CONTENT">Document Set</a>
-      <br />  
--->
-    <a href="UG_frame08TheFile.html" TARGET="_TOP">The File</a>
-      <br />  
-    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups</a> 
-<!--    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups and Links</a> 
--->
-      <br />  
-    <a href="UG_frame10Datasets.html" TARGET="_TOP">Datasets</a> 
-      <br />  
-<!--
-    <a href="UG_frameObjectsIdentifiers.html" TARGET="_TOP">Objects and 
-      Identifiers</a> 
-      <br />  
--->
-    <a href="UG_frame11Datatypes.html" TARGET="_TOP">Datatypes</a> 
-
-      <br />  
-    <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Dataspaces &</a>
-          <br />     
-          <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Partial I/O</a> 
-
-      <br />  
-    <a href="UG_frame13Attributes.html" TARGET="_TOP">Attributes</a>
-    
-      <br />  
-    <a href="UG_frame13ErrorHandling.html" TARGET="_TOP">Error Handling</a>
-
-      <br />  
-    <a href="UG_frame14PropertyLists.html" TARGET="_TOP">Property Lists</a> 
-     
-<!--
-      <br />  
-    Images & Palettes
-      <br />  
-    Discarding Objects
-      <br />  
-    <a href="17_Filters.html" TARGET="CONTENT">Filters</a>
-      <br />  
-    Miscellaneous
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/VFL-clip-020924DRAFT.pdf" TARGET="CONTENT">VFL</a> (early clip) 
--->
-    </font>
-<br />
-<b>III. <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Additional Resources</a>
-      </b><br />
-<b>IV. <a href="http://www.hdfgroup.org/HDF5/examples/" 
-    TARGET="CONTENT">Code Examples</a></b><br />
-
-    <font color="#555555">
-<!-- NEED TO WRITE PER CH, CREATE UG_frame18Performance.html, AND LINK IT IN
-      <br />  
-      <a href="UG_frame18Performance.html" TARGET="_TOP">Performance</a>
-      <br />  
-      <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Special Topics</a>
-  
-      <font size="-1">
-      <br />        
-        <a href="17_SpecialTopics.html#Intro" TARGET="CONTENT">
-          Introduction</a>
-      <br />      
-        <a href="17_SpecialTopics.html#NBitDatatype" TARGET="CONTENT">
-          N-Bit Datatype</a>
-      <br />      
-        <a href="17_SpecialTopics.html#ScaleOffsetFilter" TARGET="CONTENT">
-          Scale-Offset Filter</a>
--->
-<!--
-        
-      <a href="99_SelectedPassages.html" TARGET="CONTENT">Selected Passages</a><br />
-      <br />  
-    Higher Levels
-      <br />  
-    <a href="20_Parallel.html" TARGET="CONTENT">Parallel Environments</a>
--->
-<!-- editingComment
-      <br />  
-    Parallel Environments
-          <br />     
-          (in progress) 
--->
-<!--
-      <br />  
-    <a href="21_Perform.html" TARGET="CONTENT">Performance</a>
-      <br />  
-    Non-C Languages
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/H5UG-Cpplus-001221.pdf" TARGET="CONTENT">C++ User Notes</a>
--->
-<!--
-      <br />  
-    <a href="23_DDL.html" TARGET="CONTENT">DDL in BNF</a>
-      <br />  
-    <a href="24_XML-DTD.html" TARGET="CONTENT">XML DTD</a>
--->
-    </font>
-
-<!--
-<br />
-<b>IV. Tools</b>
-    <font color="#555555">
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5ls</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5dump</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5repart</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5toh4</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h4toh5</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">Java Tools</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">XML Tools</a>
-    </font>
--->
-
-<!--
-<br />
-<b>Appendices</b>
-    <font color="#555555">
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_PredefDTypes.html" TARGET="CONTENT">Predefined Datatypes</a>
-      <br />  
-    H4-to-H5 Mapping
-      <br />  
-    H5-to-H4 Mapping
-      <br />  
-    <a href="99_TechSupport.html" TARGET="CONTENT">Technical Support</a>
-      <br />
-    </font>
- -->
-
-
-<hr />
-
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-<!-- <small><i>Printable 
-    <a href="http://www.hdfgroup.org/HDF5/doc/PSandPDF/HDF5_UsersGuide.PDF" TARGET="CONTENT">PDF</a> 
-    of this User’s Guide</i></small>
-<hr />
--->
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-
-<div align="center">
-<b>Other HDF5 documents</b>
-</div>
-<br />
-
-
-<a href="../index.html" TARGET="H5DocWin">Full HDF5 doc set</a> for<br />
-       
-  the current release<br />
-
-<a href="../H5.intro.html" TARGET="H5DocWin"><cite>Introduction to HDF5</cite></a><br />
-
-<a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>HDF5 Reference</cite></a><br />
-      
-  <a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>Manual</cite></a><br />
-
-<a href="../H5.user.html" TARGET="H5DocWin"><cite>HDF5 Release 1.4.5</cite></a><br />
-      
-  <a href="../H5.user.html" TARGET="H5DocWin"><cite>User's Guide</cite></a>
-
-
-<hr />
-
-</body>
-</html>
-
diff --git a/html/UG/OldHtmlSource/UG_navObjectsIdentifiers.html b/html/UG/OldHtmlSource/UG_navObjectsIdentifiers.html
deleted file mode 100644
index 785320b..0000000
--- a/html/UG/OldHtmlSource/UG_navObjectsIdentifiers.html
+++ /dev/null
@@ -1,282 +0,0 @@
-<html>
-<head>
-<title>HDF5 User's Guide</title>
-</head>
-
-<body bgcolor="d2e6ef">
-
-
-<!--
-<A HREF="READ1ST.HTML" Target="RdFirstWin" 
-    onClick="window.open("READ1ST.HTML","RdFirstWin","toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=yes,resizable=1,width=500,height=250,titlebar=yes")">
-    <IMG SRC="GRAPHICS/READ1ST.GIF" BORDER=0 ALT="Read this first!"></A>
--->
-
-<font size="-1">
-<br />
-<!-- editingComment
-<div align=right>
-  ( <a href="UG_nav01.html">Expand TOC</a> )
-</div>
--->
-
-<a href="UG_front.html" TARGET="CONTENT">Title Page</a>
-<br />
-<a href="../Copyright.html" TARGET="CONTENT">Copyright</a>
-
-<!-- editingComment
-<br />
-(<a href="../H5_UG_Outline.pdf" TARGET="CONTENT">Complete outline</a>)
-
-<br />
-<br />
-(<a href="UG_feedback.html" TARGET="CONTENT">Feedback</a>)
-
-<br />
-(<a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/index.html#H5_NewUG" TARGET="CONTENT">doc_dev_snapshot</a>)
--->
-</font>
-<hr />
-<hr />
-
-<!--
-<a href="UG_front.html" TARGET="CONTENT"><IMG SRC="GRAPHICS/COVER.GIF" BORDER=0 ALT="HDF5 UG title page"></a><br />
--->
-
-<div align="center">
-<b>HDF5 User's Guide<br />Table of Contents</b>
-    <br />
-    <a href="UG_UpdateStatus.html" TARGET="CONTENT"><font size="-1"><i>Update Status</i></font></a>
-</div>
-<p>
-
-<!-- editingComment
-    <font color="#555555">
-    <a href="01_Intro.html" TARGET="CONTENT">Introduction</a>
-    </font>
-    <br />
-    -->
-
-<b>I. The Broad View</b>
-    <font color="#555555">
-<!-- editingComment
-      <br />  
-    <a href="02_WhatIs.html" TARGET="CONTENT">What is HDF5?</a>
--->
-      <br />  
-    <a href="UG_frame03DataModel.html" TARGET="_TOP">Data Model &</a>
-          <br />     
-          <a href="UG_frame03DataModel.html" TARGET="_TOP">File Structure</a>
-      <br />  
-    <a href="UG_frame04ProgModel.html" TARGET="_TOP">HDF5 Library &</a>
-          <br />     
-          <a href="UG_frame04ProgModel.html" TARGET="_TOP">Programming Model</a>
-    </font>
-
-<br />
-<b>II. Using HDF5 —<br />
-             The Specifics</b>
-    <font color="#555555">
-      <br />  
-<!-- editingComment
-    <a href="05_Quick.html" TARGET="CONTENT">Quick Start</a>
-      <br />  
-    <a href="06_Naming.html" TARGET="CONTENT">API Struture &</a>
-          <br />     
-          <a href="06_Naming.html" TARGET="CONTENT">Naming Conventions</a>
-      <br />  
-    <a href="07_DocSet.html" TARGET="CONTENT">Document Set</a>
-      <br />  
--->
-    <a href="UG_frame08TheFile.html" TARGET="_TOP">The File</a>
-    <br />  
-    <a href="UG_frame09Groups.html" TARGET="_TOP">Groups and Links</a> 
-    <br />  
-    <a href="UG_frame10Datasets.html" TARGET="_TOP">Datasets</a> 
-    <br />  
-    <a href="UG_frameObjectsIdentifiers.html" TARGET="_TOP">Objects and Identifiers</a> 
-
-
-
-      <font size="-1">
-      <br />      
-      <a href="09_Groups.html#DefiningGroupsAndLinks" TARGET="CONTENT">
-      Defining</a>
-      </font>
-        <font size="-2">
-        <br />          
-        <a href="09_Groups.html#Groups" TARGET="CONTENT">
-        Groups</a>
-        </font>
-        
-      <font size="-1">
-      <br />      
-      <a href="09_Groups.html#ProgModel" TARGET="CONTENT">
-      Programming</a>
-      </font>
-        <font size="-2">
-        <br />          
-        <a href="09_Groups.html#ProgModelCreateGroup" TARGET="CONTENT">
-        Creating a Group</a>
-        </font>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-    <br />  
-    <a href="UG_frame11Datatypes.html" TARGET="_TOP">Datatypes</a> 
-
-      <br />  
-    <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Dataspaces &</a>
-          <br />     
-          <a href="UG_frame12Dataspaces.html" TARGET="_TOP">Partial I/O</a> 
-
-      <br />  
-    <a href="UG_frame13Attributes.html" TARGET="_TOP">Attributes</a>
-    
-      <br />  
-    <a href="UG_frame13ErrorHandling.html" TARGET="_TOP">Error Handling</a>
-  
-      <br />  
-    <a href="UG_frame14PropertyLists.html" TARGET="_TOP">Property Lists</a> 
-     
-    </font>
-<br />
-<b>III. <a href="17_Additional.html" TARGET="CONTENT">Additional Resources</a>
-      </b><br />
-<b>IV. <a href="http://www.hdfgroup.org/HDF5/examples/">
-      Code Examples</a></b><br />
-
-    <font color="#555555">
-<!-- NEED TO WRITE PER CH, CREATE UG_frame18Performance.html, AND LINK IT IN
-      <br />  
-      <a href="UG_frame18Performance.html" TARGET="_TOP">Performance</a>
-      <br />  
-      <a href="UG_frame17SpecialTopics.html" TARGET="_TOP">Special Topics</a>
-      <br />  
-      <a href="../ddl.html" TARGET="H5DocWin">DDL in BNF</a><br />
-            
-        <a href="../ddl.html" TARGET="H5DocWin">for HDF5</a><br />
-        
-      <a href="99_SelectedPassages.html" TARGET="CONTENT">Selected Passages</a><br />
-      <br />  
-    Higher Levels
-      <br />  
-    <a href="20_Parallel.html" TARGET="CONTENT">Parallel Environments</a>
--->
-<!-- editingComment
-      <br />  
-    Parallel Environments
-          <br />     
-          (in progress) 
--->
-<!--
-      <br />  
-    <a href="21_Perform.html" TARGET="CONTENT">Performance</a>
-      <br />  
-    Non-C Languages
--->
-<!-- editingComment
-      <br />  
-    <a href="http://www.hdfgroup.uiuc.edu/HDF5/doc_dev_snapshot/H5_NewUG/DRAFTS/H5UG-Cpplus-001221.pdf" TARGET="CONTENT">C++ User Notes</a>
--->
-<!--
-      <br />  
-    <a href="23_DDL.html" TARGET="CONTENT">DDL in BNF</a>
-      <br />  
-    <a href="24_XML-DTD.html" TARGET="CONTENT">XML DTD</a>
--->
-    </font>
-
-<!--
-<br />
-<b>IV. Tools</b>
-    <font color="#555555">
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5ls</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5dump</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5repart</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h5toh4</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">h4toh5</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">Java Tools</a>
-      <br />  
-    <a href="xx_xxx.html" TARGET="CONTENT">XML Tools</a>
-    </font>
--->
-
-<!--
-<br />
-<b>Appendices</b>
-    <font color="#555555">
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_Glossary.html"  TARGET="CONTENT">Glossary</a>
-      <br />  
-    <a href="99_PredefDTypes.html" TARGET="CONTENT">Predefined Datatypes</a>
-      <br />  
-    H4-to-H5 Mapping
-      <br />  
-    H5-to-H4 Mapping
-      <br />  
-    <a href="99_TechSupport.html" TARGET="CONTENT">Technical Support</a>
-      <br />
-    </font>
- -->
-
-
-<hr />
-
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-<small><i>Printable 
-    <a href="http://www.hdfgroup.org/HDF5/doc/PSandPDF/HDF5_UsersGuide.PDF" TARGET="CONTENT">PDF</a> 
-    of this User’s Guide</i></small>
-<hr />
-<!-- FOR USE WITH ELECTRONIC VERSION ----------------------------------->
-
-<div align="center">
-<b>Other HDF5 documents</b>
-</div>
-<br />
-
-
-<a href="../index.html" TARGET="H5DocWin">Full HDF5 doc set</a> for<br />
-       
-  the current release<br />
-
-<a href="../H5.intro.html" TARGET="H5DocWin"><cite>Introduction to HDF5</cite></a><br />
-
-<a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>HDF5 Reference</cite></a><br />
-      
-  <a href="../RM/RM_H5Front.html" TARGET="H5DocWin"><cite>Manual</cite></a><br />
-
-<a href="../H5.user.html" TARGET="H5DocWin"><cite>HDF5 Release 1.4.5</cite></a><br />
-      
-  <a href="../H5.user.html" TARGET="H5DocWin"><cite>User's Guide</cite></a>
-
-
-<hr />
-
-</body>
-</html>
-
diff --git a/html/UG/OldHtmlSource/index.html b/html/UG/OldHtmlSource/index.html
deleted file mode 120000
index 1c4a7a2..0000000
--- a/html/UG/OldHtmlSource/index.html
+++ /dev/null
@@ -1 +0,0 @@
-UG_frame.html
\ No newline at end of file
diff --git a/html/UG/OldHtmlSource/process.txt b/html/UG/OldHtmlSource/process.txt
deleted file mode 100644
index 9124eaa..0000000
--- a/html/UG/OldHtmlSource/process.txt
+++ /dev/null
@@ -1,530 +0,0 @@
-
-================================================================================
-Process for Creating PDF Version of the HDF5 User's Guide (UG) from Source Files
-================================================================================
-
-                                               Last modified: 19 November 2010
-
-A PDF version of the HDF5 User's Guide (UG) is created from the HTML source at 
-each release of the HDF5 Library. The process uses HTMLdoc (a PDF conversion 
-tool) and Adobe Acrobat Pro.  This document describes the process in detail 
-for the UG. The process for the HDF5 Reference Manual (RM) is very similar 
-and is described in a separate document.
-
-
-
-The HDF5 User's Guide
--------------------------
-1.  Check out a fresh working copy of the minor release branch specifically
-    for this task. For example:
-      svn checkout https://svn.hdfgroup.uiuc.edu/hdf5doc/branches/hdf5_1_8_4  \
-          hdf5_1_8_4-PDFs
-
-    11.15.2010, MEE: my original was hdf5_1_8, and my working copy was 
-    hdf5_1_8_6_PDF_MEE. The 1.8.6 release branch is made from the 1.8 branch
-    and not from the the 1.8.5 branch.
-
-    Skip this step if you have already done it for the RM; you can use the 
-    same working copy for both documents.
-
-    The idea behind checking out a fresh copy is to work in files that can 
-    be deleted when completed. The changes that are made in this copy are
-    not changes that we want to keep. We may want to keep some. Keep track
-    of those changes and merge them into the trunk and 1.8 branch. 
-
-
-
-2.  Convert the '!-- FOR USE WITH...' flags from the electronic form to the 
-    print form. The two flags are listed below:
-
-         <!-- FOR USE WITH ELECTRONIC VERSION ---> 
-         <!-- FOR USE WITH PRINT VERSION ---> 
-
-    These flags operate in pairs: one is at the beginning of the section, and 
-    the other is at the end. 
-
-    Up to this point in the general process of updating the User�s Guide, 
-    you have been working in the electronic version. The print version has 
-    been commented out. To switch from electronic to print versions, go 
-    through these steps:
-
-    a. Change the electronic version flag by removing the trailing angle 
-       bracket from the first flag. The trailing angle bracket is the 
-       > characters. Before the change, the electronic flag will look like 
-       this: 
-
-       <!-- FOR USE WITH ELECTRONIC VERSION --->
-
-       After you remove the trailing angle bracket, the flag will look like 
-       this:
-
-       <!-- FOR USE WITH ELECTRONIC VERSION ---
-
-    b. Change the print version flag by adding a trailing angle bracket.
-
-    Check all the chapter files (03_DataModel.html and the others) for 
-    electronic and print sections. Change every section.
-
-    Note: there are lines in the files that have been commented out 
-    for various reasons. Check to make sure that the entire section
-    between the flags is commented out. In Notepad++, the commented
-    out section will turn green.
-
-
-
-3.  Use HTMLdoc to generate the content PDF file. 
-
-    To produce the entire UG PDF, two HTMLdoc book files are used. These 
-    book files are currently called H5_newUG.book and H5_newUG_Front.book 
-    and are located in the same directory as the chapter files. Each 
-    book file is a list of .html source files and some settings. 
-    H5_newUG.book holds the content files for the UG PDF. An example 
-    of one of those files is 04_ProgModel.html. H5_newUG.book is used 
-    by HTMLdoc to produce HDF5_UG_body.pdf. H5_newUG_Front.book has the 
-    "front matter" for the PDF. The front matter currently includes the 
-    title page, the table of contents, and the update status page.
-    
-    To generate HDF5_UG_body.pdf from H5_newUG.book, go through the 
-    following steps. 
-
-    a. Open HTMLdoc.
-    b. Click on the Open button. In the dialog box that opens, select 
-       H5_newUG.book from the PDF working directory.
-    c. Click the Generate button to produce a new PDF.
-    d. Open the PDF with Adobe Acrobat or Acrobat Reader. 
-
-    These steps assume that no changes need to be made to the book file.
-    If changes do need to be made, go through the various tabs, make the 
-    changes, click the Save button, and then generate and view the new 
-    PDF. The current settings in the various tabs are listed below.
-
-    Clicking the Generate button will produce a new copy of the PDF 
-    file. If the existing PDF file is open in Acrobat or Acrobat 
-    Reader, then a new file cannot be written to disk. An error message 
-    will be produced.
-    
-    If HTMLdoc finds errors, it will produce an error list. Example errors
-    are dangling html tags and unresolved links. Fix the errors, and then 
-    generate another file.
-
-    The current settings in the HTMLdoc tabs for H5_newUG.book are shown below.
-
-    The Input tab:
-      Document Type: Web Page
-      Input Files:
-        Part1SplitterPg.html
-        03_DataModel.html
-        04_ProgModel.html
-        Part2SplitterPg.html
-        08_TheFile.html
-        09_Groups.html
-        10_Datasets.hmtl
-        11_Datatypes.html
-        12_Dataspaces.hmtl
-        13_Attributes.html
-        13_ErrorHandling.html
-        Part3SplitterPg.html
-        17_Additional.html (change in 1.8.6. This file used to be 
-                            17_SpecialTopics.html, and Glossary 
-                            is now part of 17_Additional.html)
-      Logo Image: none
-      Title File/Image: none
-
-    The Output tab:
-      Output To: File
-      Output Path: HDF5_UG_body.pdf
-      Output Format: PDF
-      Output Options: JPEG Big Images
-      Compression (not critical, change at will): Slider right above 'Fast'
-      JPEG Quality (not critical, change at will): 60
-  
-    The Page tab:
-      Page Size: Letter, 2-Sided
-        Top: 0.50in, Left: 1.00in, Right: 0.50in, Bottom: 0.50in
-      Header: Blank, Blank, Blank
-      Header (1st Page): Blank, Blank, Blank
-      Footer: Blank, Blank, 1,2,3,...
-      Number Up: 1
-
-    The TOC tab: (currently grayed out)
-    
-    The Colors tab:
-      Body Color: Blank
-      Body Image: Blank
-      Text Color: Blank
-      Link Color: Blank
-      Link Style: Plain
-    
-    The Fonts tab:
-      Base Font Size: 11.0
-      Line Spacing: 1.2
-      Body Typeface: Times
-      Heading Typeface: Helvetica
-      Header/Footer Size: 10.0
-      Header/Footer Font: Helvetica
-      Character Set: iso-8859-1
-      Options: Do Not Check 'Embed Fonts'
-    
-    The PS tab: (currently grayed out)
-
-    The PDF tab:
-      PDF Version: 1.3
-      Page Mode: Document
-      Page Layout: Single
-      Page Effect: None
-      Options: Deselect 'Include Links'
-      
-    11.17.10, Deselect the Include Links checkbox to disable links in 
-    the UG. Currently, not all the links work. We make the PDF version
-    in case someone wants to print the UG on paper.
-
-    The Security tab:
-      Encryption: No
-
-    The Options tab:
-      HTML Editor: notepad.exe "%s" (default)
-      Browser Width: 680
-      GUI Options: Check all
-
-    11.16.10, The Options tab has four GUI Options: Tooltips, Modern Look, 
-    Strict HTML, and Error on Overflow. With Strict HTML selected, 
-    generating a PDF might produce errors. Fix the errors, and then 
-    generate another PDF. 
-
-
-
-4.  Scan for changes that should be made. 
-
-    At the end of the previous step, you opened with Acrobat Reader the 
-    HDF5_UG_body.pdf file. 
-    
-    a. Scan through the document page by page to verify that there are no 
-       elements that should have been eliminated via javascripts, swapped 
-       comment markup, or swapped DW library content.
-
-    b. Scan through again looking only for places where page breaks need to 
-       be added, removed, or relocated. After each <!-- NEW PAGE --> tag 
-       that you add or change, regenerate the PDF. 
-
-    c. When you are sure all the pagination is correct (don't forget to 
-       start each of the sections included in the Table of Contents on a 
-       recto), note page numbers for the beginning of each TOC entry.
-
-    Note the file and line number of each change you make. Make these 
-    changes in a file that can be committed to the trunk and main 
-    branch such as 1.8. Having the print version sections active
-    makes committing this set of files awkward.
-
-
-
-5.  Update the Table of Contents page numbers.
-
-    To update the Table of Contents page numbers, open H5_newUG_TOC.html, 
-    change the page number according to the numbers you collected 
-    in the previous step, and then save the file.
-
-
-
-6.  Prepare the front matter of the UG.
-
-    The front matter includes the title page, the table of contents, 
-    and any other preface-type pages. The current preface-type page 
-    is called UG_UpdateStatus.html. 
-    
-    To generate HDF5_UG_front.pdf from H5_newUG_Front.book, go through the 
-    following steps. 
-
-    a. Open HTMLdoc.
-    b. Click on the Open button. In the dialog box that opens, select 
-       H5_newUG_Front.book from the PDF working directory.
-    c. Click the Generate button to produce a new PDF.
-    d. Open the PDF with Adobe Acrobat or Acrobat Reader. 
-
-    These steps assume that no changes need to be made to the book file.
-    If changes do need to be made, go through the various tabs, make the 
-    changes, click the Save button, and then generate and view the new 
-    PDF. The current settings in the various tabs are listed below.
-
-    Clicking the Generate button will produce a new copy of the PDF 
-    file. If the existing PDF file is open in Acrobat or Acrobat 
-    Reader, then a new file cannot be written to disk. An error message 
-    will be produced.
-    
-    If HTMLdoc finds errors, it will produce an error list. Example errors
-    are dangling html tags and unresolved links. Fix the errors, and then 
-    generate another file.
-
-    The current settings in the HTMLdoc tabs for H5_newUG_Front.book 
-    are shown below.
-
-    The Input tab:
-      Document Type: Web Page
-      Input Files:
-        H5_newUG_Title.html
-        H5_newUG_TOC.html
-        UG_UpdateStatus.html
-      Logo Image: none
-      Title File/Image: none
-
-    The Output tab:
-      Output To: File
-      Output Path: H5_newUG_Front.pdf
-      Output Format: PDF
-      Output Options: JPEG Big Images
-      Compression (not critical, change at will): Slider right above 'Fast'
-      JPEG Quality (not critical, change at will): 60
-  
-    The Page tab:
-      Page Size: Letter, 2-Sided
-        Top: 0.50in, Left: 1.00in, Right: 0.50in, Bottom: 0.50in
-      Header: Blank, Blank, Blank
-      Header (1st Page): Blank, Blank, Blank
-      Footer: Blank, Blank, Blank
-      Number Up: 1
-
-    11.17.10, If at some point there is a Footer (1st Page), then we
-    should change the Footer right side value from Blank to i, ii, iii....
-      
-    The TOC tab: (currently grayed out)
-    
-    The Colors tab:
-      Everything Blank
-      Link Style: Plain
-    
-    The Fonts tab:
-      Base Font Size: 11.0
-      Line Spacing: 1.2
-      Body Typeface: Times
-      Heading Typeface: Helvetica
-      Header/Footer Size: 10.0
-      Header/Footer Font: Helvetica
-      Character Set: iso-8859-1
-      Options: Do Not Check 'Embed Fonts'
-
-    The PS tab: (currently grayed out)
-
-    The PDF tab:
-      PDF Version: 1.3
-      Page Mode: Document
-      Page Layout: Single
-      Page Effect: None
-      Options: Deselect 'Include Links'
-      
-    11.17.10, Deselect the Include Links checkbox to disable links in 
-    the UG. Currently, not all the links work. We make the PDF version
-    in case someone wants to print the UG on paper.
-
-    The Security tab:
-      Encryption: No
-
-    The Options tab:
-      HTML Editor: notepad.exe "%s" (default)
-      Browser Width: 680
-      GUI Options: Check all
-
-    11.16.10, The Options tab has four GUI Options: Tooltips, Modern Look, 
-    Strict HTML, and Error on Overflow. With Strict HTML selected, 
-    generating a PDF might produce errors. Fix the errors, and then 
-    generate another PDF. 
-           
-           
-           
-7.  Scan for changes that should be made. 
-
-    At the end of the previous step, you opened with Acrobat Reader the 
-    HDF5_UG_front.pdf file. 
-    
-    a. Scan through the document page by page to verify that there are no 
-       elements that should have been eliminated via javascripts, swapped 
-       comment markup, or swapped DW library content. Make sure each 
-       of the sections starts on a recto.
-
-    b. Scan through again looking only for places where page breaks need to 
-       be added, removed, or relocated. After each <!-- NEW PAGE --> tag 
-       that you add or change, regenerate the PDF. 
-
-
-
-8. Update the copyright and license page.
-
-    Currently, there are two ways to get an updated copyright and 
-    license page: ask Frank for the copy he made while updating the RM, 
-    or make the changes yourself.
-    
-    To make the changes yourself, go through the following steps:
-    
-    a. Edit html\Copyright.html. 
-      i. If needed, change the copyright year currently on line 24.
-      ii. Delete lines 127 - 141. These lines have unneeded footer
-          material. 
-    
-    b. Open PDF_CandL.book in HTMLdoc, and generate an updated page.
-    
-        PDF_C_and_L.book is located in the html/PSandPDF directory in 
-        the branch. 
-        
-        Copyright.html is located in the html directory in the branch.
-        
-        Adjust the font size if the copyright and license statement 
-        does not initially fit on one page.  To do this, adjust the settings 
-        in the Fonts tab until the information fits on one page.
-        
-        The output file is called HDF5_C&L.pdf and is located in the 
-        html/PSandPDF directory.
-
-
-
-9.  Combine the PDF files into a single file.
-
-    The combination file should be stored in the branch's html/PSandPDF 
-    directory.
-    
-    The file name should take the form of HDF5_UG_r###.pdf where ### 
-    is the software version number of this release.
-
-    Use Adobe Acrobat Pro to combine the previously generated PDFs. 
-    
-    Adobe Acrobat Pro is located on bangan. Use a remote access program
-    such as the Windows program called Remote Desktop Connection. Use 
-    the following steps to start up Acrobat on bangan:
-    
-        a. Start Remote Desktop Connection on your computer.
-        b. Use your Active Directory user name and password. 
-        c. Before connecting, mount your local drive. To do this, open
-           the Local Resources tab, click on the More button, select your 
-           local disk, and then click OK. This will allow you to work
-           on your files with Acrobat on bangan.
-        d. Click the Connect button.
-        e. On bangan, click Start > All Programs > Adobe Master 
-           Collection CS4 > Adobe Acrobat Pro 9 to open Acrobat.
-          
-        To close the remote connection to bangan, click on the x on the 
-        bar at the top of the bangan desktop.
-        
-    The goal of the next few steps is to combine the title page, the 
-    copyright and license page, the table of contents, and any 
-    preface-type material into a single, frontmatter file in a 
-    particular order. The process of combining PDF files brings some 
-    extra blank pages. The steps below will describe how to insert 
-    files and delete blank pages. The page order we are aiming toward 
-    is the following:
-    
-        Title page            (recto*)
-        Copyright page        (on the back of the title page)
-        TOC                   (starts on a recto; may be several pages)
-        Additional material   (starts on a recto; may be several pages)
-        
-        *Recto is a publishing term. Recto pages appear in a book on 
-        the right-hand side and are odd-numbered pages. Verso is the 
-        term for the back side of a recto page. Verso pages are 
-        left-handed, even-numbered pages.
-
-    Go through the following steps in Acrobat to combine the files:
-    
-        a. Open HDF5_UG_front.pdf.
-        b. In the menu, click on Document > Insert Pages > From File. 
-           This opens a dialog box where you can select the file you 
-           want to insert. Select HDF5_C&L.pdf.
-        c. The Insert Pages dialog box opens. Set Location to After, 
-           set Page to 2, and click OK. This will insert the copyright
-           page.
-        d. Since we want the copyright page on the back side of the 
-           title page, we need to delete blank pages. To delete a page,
-           click on Document > Delete Pages in the menu. This opens 
-           a dialog box where you can specify the page to be deleted. 
-           Enter a page, and then click OK. If you click on the blank
-           page that you want to delete before you open the dialog box, 
-           then that page number will appear in the dialog box.
-        e. Save the file as HDF5_UG_r###.pdf.
-        f. Delete any blank pages to get the pages in the order we 
-           want.
-        g. Save the file.
-        h. Insert HDF5_UG_body.pdf at the end of HDF5_UG_r###.pdf.
-        i. Delete any unwanted pages blank pages. Chapters should 
-           already be positioned to start on a recto.
-        j. Save the file.
-        k. Update the PDF bookmarks. The bookmarks come from the 
-           title-tagged text in each file. To open the Bookmarks pane, 
-           click on View > Navigation Panels > Booksmarks in the Acrobat 
-           menu.
-           
-           If the bookmark does not match the table of contents text, 
-           right click on it, and in the menu that opens, click on 
-           Rename, and then type in the new text. 
-           
-           If the file name is included in the bookmarks list, it can 
-           be removed by dragging and dropping the contents of the file 
-           above file name, and then using the right click menu to 
-           delete the bookmark.
-
-        11.18.10, Frank said he was able to move booksmarks around so 
-        that the file name the chapters come from can be removed from the 
-        list of bookmarks. He also added blanks to names he wanted indented
-        to give the illusion of a tree structure.
-        
-    Acrobat notes: 11.18.10, Frank had trouble a couple of years ago 
-    with Acrobat performing more than one operation at a time. I have 
-    not had that trouble. We suspect it could be a Mac issue. The 
-    following are some suggestions of his if Acrobat performs 
-    unevenly:
-    
-    -- Save the file and quit Acrobat after each "Insert pages" or 
-       "Delete pages" operation.  
-    -- If you get an error, try doing things in a different order; 
-       e.g., if you get an error inserting the body at the end of the
-       frontmatter, try inserting the frontmatter to the beginning of 
-       the body.
-
-
-
-10. Update this file.
-
-
-
-11. Commit the updated files.
-
-    11.17.10. Since August, I have been working in the 1.8.5 branch. I 
-    committed my changes to the 1.8.5 repository, and then merged the 
-    1.8.5 files into the trunk and the 1.8 branch. For this PDF version,
-    I checked out from the 1.8 branch another copy and labeled it 1.8.6
-    PDF. My actual copy is in C:\1 MEE\Working\hdf5_1_8_6_PDF_MEE\html\UG.
-    
-    The purpose of this PDF branch was to give me a copy to work in 
-    where I could make changes that I would not have to keep. These
-    changes are primarily to enable the print version sections and 
-    disable the electronic version sections. However, I found many 
-    things I wanted to change and keep. One example involves changing 
-    certain characters so they would be treated properly by HTML. I 
-    made the following changes: < to <, > to >, and & to &.
-    To keep these non-print version changes, I need to go through the 
-    following commit/merge SVN process:
-    
-    a. Commit my PDF branch changes to the 1.8 branch. 
-       11.18.10, the UG/Images directory has some new pictures: 
-       ChunkingFig001.png to ChunkingFig007.png. Add these
-       pictures to the 1.8 branch and make sure to merge them
-       to the 1.8.6 branch and the trunk. Commit also the PDF output 
-       files in the html/PSandPDF directory.
-    b. Update my working copy of the 1.8 branch.
-    c. Edit my 1.8 files so that the electronic version sections are 
-       active and the print version sections are disabled.
-    d. Commit my 1.8 branch to the repository.
-    e. Merge and commit the changes from 1.8 to 1.8.6. Add the new
-       files from step a above.
-    f. Merge and commit the changes from 1.8 to the trunk. Add the new
-       files from step a above.
-
-    After I have committed my PDF branch changes to the 1.8 branch, 
-    I will not be able update my PDF branch from the repository. 
-    In other words, when I commit my PDF branch to the 1.8 branch, I 
-    am making my PDF branch read-only. I will make any future changes 
-    in the 1.8.6 branch. 
-    
-    In the future, I may not have to go through this process if I do not
-    have any changes to my future PDF branch outside of enabling the 
-    print version sections.
-
-
-
-
-
diff --git a/html/UG/ed_libs/NavBar_UG.lbi b/html/UG/ed_libs/NavBar_UG.lbi
deleted file mode 100644
index 032affe..0000000
--- a/html/UG/ed_libs/NavBar_UG.lbi
+++ /dev/null
@@ -1,39 +0,0 @@
-<hr>
-<center>
-<table border=0 width=98%>
-<tr><td valign=top align=left>
-    <a href="../index.html">HDF5 documents and links</a> <br>
-    <a href="../H5.intro.html">Introduction to HDF5</a> <br>
-    <a href="../RM_H5Front.html">HDF5 Reference Manual</a> <br>   
-    <!--
-    <a href="Glossary.html">Glossary</a><br>
-    -->
-</td>
-<td valign=top align=right>
-    And in this document, the 
-    <a href="../H5.user.html"><strong>HDF5 User's Guide:</strong></a>    
-        <br>
-        <a href="../Files.html">Files</a>  
-        <a href="../Datasets.html">Datasets</a>  
-        <a href="../Datatypes.html">Datatypes</a>  
-        <a href="../Dataspaces.html">Dataspaces</a>  
-        <a href="../Groups.html">Groups</a>  
-        <br>
-        <a href="../References.html">References</a>  
-        <a href="../Attributes.html">Attributes</a>  
-        <a href="../Properties.html">Property Lists</a>  
-        <a href="../Errors.html">Error Handling</a>  
-        <br>
-        <a href="../Filters.html">Filters</a>  
-        <a href="../Caching.html">Caching</a>  
-        <a href="../Chunking.html">Chunking</a>  
-        <a href="../MountingFiles.html">Mounting Files</a>  
-        <br>
-        <a href="../Performance.html">Performance</a>  
-        <a href="../Debugging.html">Debugging</a>  
-        <a href="../Environment.html">Environment</a>  
-        <a href="../ddl.html">DDL</a>  
-</td></tr>
-</table>
-</center>
-<hr>
diff --git a/html/UG/ed_libs/styles_NewUG.lbi b/html/UG/ed_libs/styles_NewUG.lbi
deleted file mode 100644
index 7062cd5..0000000
--- a/html/UG/ed_libs/styles_NewUG.lbi
+++ /dev/null
@@ -1 +0,0 @@
-<link href="..ed_styles/NewUGelect.css" rel="stylesheet" type="text/css"> 
\ No newline at end of file
diff --git a/html/UG/ed_libs/styles_UG.lbi b/html/UG/ed_libs/styles_UG.lbi
deleted file mode 100644
index b94706d..0000000
--- a/html/UG/ed_libs/styles_UG.lbi
+++ /dev/null
@@ -1 +0,0 @@
-<link href="../ed_styles/UGelect.css" rel="stylesheet" type="text/css">
diff --git a/html/UG/ed_styles/NewUGelect.css b/html/UG/ed_styles/NewUGelect.css
deleted file mode 100644
index d969035..0000000
--- a/html/UG/ed_styles/NewUGelect.css
+++ /dev/null
@@ -1,318 +0,0 @@
-<style type="text/css">
-
-.pageBefore          {page-break-before: always}
-.pageNever           { }
-.pageNever1          {display: block}
-.pageNever3          {position: fixed}
-
-.runningHead         {font-weight: bold}
-.smallCaps           {font-variant: small-caps}
-.editingCommentLt    {color: #FF0000;
-                      font-style: italic}
-.editingComment      {font-weight: bold; 
-                      color: #FF0000;
-                      font-style: italic}
-.figureCaption       {text-align: center}
-.figureCaptionPara   {text-align: left}
-.figureNumber        {font-weight: bold}
-.tableHead           {font-weight: bold}
-.codeSwatch          { }
-.termEmphasis        {font-style: italic}
-.termDefinition      {font-style: italic;
-                      font-weight: bold}
-.termDefList         {font-style: normal;
-                      font-weight: bold}
-.codeText            {font-family: Courier New, Courier;
-                      font-size: smaller}
-.codeVar             {font-family: Courier New, Courier;
-                      font-size: smaller;
-                      font-style: italic}
-
-.greenFrame1         {margin-left: 10px;
-                      margin-top: 10px;
-                      margin-bottom: 10px;
-                      border-top-style: Solid;
-                      border-top-color: #008000;
-                      border-top-width: 3px;
-                      border-left-width: 1px;
-                      border-left-color: #008000;
-                      border-left-style: Solid;
-                      border-bottom-width: 3px;
-                      border-bottom-color: #008000;
-                      border-bottom-style: Solid;}
-
-.greenFrame2         {margin-left: 10px;
-                      margin-top: 10px;
-                      margin-bottom: 10px;
-                      margin-right: 10px;
-                      border-top-style: Solid;
-                      border-top-color: #008000;
-                      border-top-width: 3px;
-                      border-bottom-width: 3px;
-                      border-bottom-color: #008000;
-                      border-bottom-style: Solid;
-                      background-color: #E6F2E6;
-                      margin-left: auto;
-                      margin-right: auto;}
-
-                      
-.greenLine1          {border-bottom-width: 1px;
-                      border-bottom-color: #008000;
-                      border-bottom-style: Solid;}
-		      
-.genTable            {x-cell-content-align: top;
-		      border-spacing: 0px;
-		      left: 0px;
-		      top: 330px;
-		      height: 145px;
-		      float: aligncenter;
-		      width: 600px;}
-.genTableLeftHdr     {border-left-width: 1px;
-		      border-top-style: Solid;
-		      border-top-color: #008000;
-		      border-top-width: 3px;
-		      border-right-width: 1px;
-		      border-bottom-style: Solid;
-		      border-bottom-width: 1px;
-		      border-bottom-color: #008000;
-		      padding-right: 10px;
-		      padding-left: 10px;}
-.genTableRightHdr    {border-top-style: Solid;
-		      border-top-color: #008000;
-		      border-top-width: 3px;
-		      border-right-width: 1px;
-		      border-bottom-style: Solid;
-		      border-bottom-width: 1px;
-		      border-bottom-color: #008000;
-		      padding-right: 10px;
-		      padding-left: 10px;} 
-.genTableCell        {padding-right: 10px; 
-                      padding-left: 10px;}
-.genTableBottom      {border-bottom-width: 3px;
-		      border-bottom-color: #008000;
-		      border-bottom-style: Solid;
-		      padding-right: 10px;
-		      padding-left: 10px;}
-
-.functTable          {x-cell-content-align: top;
-		      border-spacing: 0px;
-		      float: aligncenter;
-		      left: 56px;
-		      top: 615px;
-		      width: 600px;}
-.functTableLeftHdr   {border-left-width: 1px;
-		      border-top-style: Solid;
-		      border-top-color: #008000;
-		      border-top-width: 3px;
-		      border-right-width: 1px;
-		      border-bottom-style: Double;
-		      border-bottom-width: 3px;
-		      border-bottom-color: #008000;
-		      padding-right: 10px;
-		      padding-left: 10px;}
-.functTableRightHdr  {border-top-style: Solid;
-		      border-top-color: #008000;
-		      border-top-width: 3px;
-		      border-right-width: 1px;
-		      border-bottom-style: Double;
-		      border-bottom-width: 3px;
-		      border-bottom-color: #008000;
-		      padding-right: 10px;
-		      padding-left: 10px;}
-.functTableCell      {padding-right: 10px; padding-left: 10px;
-                      border-bottom-width: 1px;
-                      border-bottom-color: #008000;
-                      border-bottom-style: Solid;}
-.functTableBottom    {border-bottom-width: 3px;
-		      border-bottom-color: #008000;
-		      border-bottom-style: Solid;
-		      padding-right: 10px;
-		      padding-left: 10px;}
-
-.fullImgTable        {x-cell-content-align: top;
-		      border-spacing: 0px;
-		      left: 56px;
-		      top: 615px;
-		      width: 600px;}
-.fullImgTableImgCell {border-left-width: 1px;
-		      border-top-style: Solid;
-		      border-top-color: #008000;
-		      border-top-width: 3px;
-		      border-right-width: 1px;
-		      border-bottom-style: Solid;
-		      border-bottom-width: 1px;
-		      border-bottom-color: #008000;}
-.fullImgTableImgTopCell 
-		     {border-left-width: 1px;
-		      border-top-style: Solid;
-		      border-top-color: #008000;
-		      border-top-width: 3px;
-		      border-right-width: 1px;}
-.fullImgTableImgBottomCell 
-                     {border-left-width: 1px;
-		      border-right-width: 1px;
-		      border-bottom-style: Solid;
-		      border-bottom-width: 1px;
-		      border-bottom-color: #008000;}
-.fullImgTableCapCell {border-bottom-width: 3px;
-		      border-bottom-color: #008000;
-		      border-bottom-style: Solid;}
-
-.tocTable            {x-cell-content-align: top;
-		      border-spacing: 0px;
-		      border-left-width: 20px;
-		      border-left-style: Solid;
-		      border-left-color: #FFFFFF;
-		      border-bottom-width: 20px;
-		      border-bottom-style: Solid;
-		      border-bottom-color: #FFFFFF;
-		      float: aligncenter;
-		      left: 56px;
-		      top: 615px;
-		      width: 220;}
-.tocTableHeaderCell  {border-top-style: Solid;
-		      border-top-color: #008000;
-		      border-top-width: 3px;
-		      border-right-width: 1px;
-		      border-left-width: 6px;
-		      border-left-style: Solid;
-		      border-left-color: #008000;
-		      border-bottom-style: Solid;
-		      border-bottom-width: 1px;
-		      border-bottom-color: #008000;
-		      padding-right: 10px;
-		      padding-left: 10px;}
-.tocTableContentCell {border-bottom-width: 3px;
-		      border-bottom-color: #008000;
-		      border-bottom-style: Solid;
-		      border-left-width: 1px;
-		      border-left-color: #008000;
-		      border-left-style: Solid;
-		      padding-right: 10px;
-		      padding-left: 10px;}
-.tocTableContentCell2 
-                     {border-left-width: 1px;
-		      border-left-color: #008000;
-		      border-left-style: Solid;
-		      padding-right: 10px;
-		      padding-left: 10px;}
-.tocTableContentCell3 
-                     {border-bottom-width: 3px;
-		      border-bottom-color: #FFFFFF;
-		      border-bottom-style: Solid;
-		      border-left-width: 1px;
-		      border-left-color: #FFFFFF;
-		      border-left-style: Solid;
-		      padding-right: 10px;
-		      padding-left: 0px;}
-.tocTableContentCell4 
-                     {border-bottom-width: 3px;
-		      border-bottom-color: #008000;
-		      border-bottom-style: Solid;
-		      border-left-width: 1px;
-		      border-left-color: #FFFFFF;
-		      border-left-style: Solid;
-		      padding-right: 10px;
-		      padding-left: 0px;}
-		      
-.ColumnTable         {x-cell-content-align: top;
-		      border-spacing: 0px;
-		      float: aligncenter;
-		      left: ;
-		      top: ;}		      
-.ColumnLeftHdr       {border-left-width: 1px;
-		      border-top-style: Solid;
-		      border-top-color: #008000;
-		      border-top-width: 3px;
-		      border-left-width: 1px;
-		      border-left-color: #008000;
-		      border-left-style: Solid;
-		      border-bottom-style: Double;
-		      border-bottom-width: 3px;
-		      border-bottom-color: #008000;
-		      padding-right: 10px;
-		      padding-left: 10px;}
-.ColumnRightHdr      {border-top-style: Solid;
-		      border-top-color: #008000;
-		      border-top-width: 3px;
-		      border-left-width: 1px;
-		      border-left-color: #008000;
-		      border-left-style: Solid;
-		      border-right-width: 1px;
-		      border-right-color: #008000;
-		      border-right-style: Solid;
-		      border-bottom-style: Double;
-		      border-bottom-width: 3px;
-		      border-bottom-color: #008000;
-		      padding-right: 10px;
-		      padding-left: 10px;}
-.ColumnHdr           {border-top-style: Solid;
-		      border-top-color: #008000;
-		      border-top-width: 3px;
-		      border-left-width: 1px;
-		      border-left-color: #008000;
-		      border-left-style: Solid;
-		      border-right-width: 1px;
-		      border-right-color: #008000;
-		      border-right-style: Solid;
-		      border-bottom-style: Double;
-		      border-bottom-width: 3px;
-		      border-bottom-color: #008000;
-		      padding-right: 10px;
-		      padding-left: 10px;}
-.ColumnLeftCell      {padding-right: 10px; 
-                      padding-left: 10px;
-                      border-bottom-width: 1px;
-                      border-bottom-color: #008000;
-                      border-bottom-style: Solid;
-		      border-left-width: 1px;
-		      border-left-color: #008000;
-		      border-left-style: Solid;}
-.ColumnRightCell     {padding-right: 10px; 
-                      padding-left: 10px;
-                      border-bottom-width: 1px;
-                      border-bottom-color: #008000;
-                      border-bottom-style: Solid;
-		      border-left-width: 1px;
-		      border-left-color: #008000;
-		      border-left-style: Solid;
-		      border-right-width: 1px;
-		      border-right-color: #008000;
-		      border-right-style: Solid;}
-.ColumnCell          {padding-right: 10px; 
-                      padding-left: 10px;
-                      border-bottom-width: 1px;
-                      border-bottom-color: #008000;
-                      border-bottom-style: Solid;
-		      border-left-width: 1px;
-		      border-left-color: #008000;
-		      border-left-style: Solid;}
-.ColumnLeftBottom    {border-bottom-width: 3px;
-		      border-bottom-color: #008000;
-		      border-bottom-style: Solid;
-		      padding-right: 10px;
-		      padding-left: 10px;
-		      border-left-width: 1px;
-		      border-left-color: #008000;
-		      border-left-style: Solid;}
-.ColumnRightBottom   {border-bottom-width: 3px;
-		      border-bottom-color: #008000;
-		      border-bottom-style: Solid;
-		      padding-right: 10px;
-		      padding-left: 10px;
-		      border-left-width: 1px;
-		      border-left-color: #008000;
-		      border-left-style: Solid;
-		      border-right-width: 1px;
-		      border-right-color: #008000;
-		      border-right-style: Solid;}
-.ColumnBottom        {border-bottom-width: 3px;
-		      border-bottom-color: #008000;
-		      border-bottom-style: Solid;
-		      padding-right: 10px;
-		      padding-left: 10px;
-		      border-left-width: 1px;
-		      border-left-color: #008000;
-		      border-left-style: Solid;}
-
-</style>
diff --git a/html/UG/ed_styles/UGelect.css b/html/UG/ed_styles/UGelect.css
deleted file mode 100644
index cd181cd..0000000
--- a/html/UG/ed_styles/UGelect.css
+++ /dev/null
@@ -1,35 +0,0 @@
-<STYLE TYPE="text/css">
-
-P, p, UL, ul, OL, ol, LI, li, DL, dl, DT, dt, DD, dd    {
-        }
-	
-A, a    {
-        }
-
-H1, h1  {
-        text-align: center	
-        }
-
-H2, h2  {	
-        }
-
-H3, h3  {
-        }
-
-H4, h4  {	
-        }
-
-H5, h5  {	
-        }
-
-code, CODE  {
-        }
-
-pre, PRE    {
-        }
-	
-.smallType  {
-        font-size: smaller;
-        }
-
-</STYLE>
\ No newline at end of file
diff --git a/html/UG/ed_styles/UGprint.css b/html/UG/ed_styles/UGprint.css
deleted file mode 100644
index 6b25a73..0000000
--- a/html/UG/ed_styles/UGprint.css
+++ /dev/null
@@ -1,58 +0,0 @@
-<STYLE TYPE="text/css">
-
-P, p, UL, ul, OL, ol, LI, li, DL, dl, DT, dt, DD, dd    {
-        font-family: garamond, "times new roman", times, serif; 
-        font-size: 11pt;
-        }
-	
-A, a    {
-        color: black; 
-        text-decoration: none;
-        }
-
-H1, h1  {
-        font-family: garamond, "times new roman", times, serif;
-        font-size: 18pt;
-        font-weight: bold;
-        text-align: center	
-        }
-
-H2, h2  {
-        font-family: garamond, "times new roman", times, serif;
-        font-size: 16pt;
-        font-weight: bold;	
-        }
-
-H3, h3  {
-        font-family: garamond, "times new roman", times, serif;
-        font-size: 14pt;
-        font-weight: bold;	
-        }
-
-H4, h4  {
-        font-family: garamond, "times new roman", times, serif;
-        font-size: 12pt;
-        font-weight: bold;	
-        }
-
-H5, h5  {
-        font-family: garamond, "times new roman", times, serif;
-        font-size: 10pt;
-        font-weight: bold;	
-        }
-
-code, CODE        {
-        font-family: "Courier New", Courier, Monospace;
-        font-size: 9pt;
-        }
-
-pre, PRE          {
-        font-family: "Courier New", Courier, Monospace;
-        font-size: 8pt;
-        }
-
-.smallType        {
-        font-size: 9pt;
-        }
-
-</STYLE>
\ No newline at end of file
diff --git a/html/_topic/UG_string_datatypes.htm b/html/_topic/UG_string_datatypes.htm
new file mode 100644
index 0000000..9fcd6c5
--- /dev/null
+++ b/html/_topic/UG_string_datatypes.htm
@@ -0,0 +1,335 @@
+
+These notes form the basis for an as-yet-unwritten "String Datatypes" UG section.
+
+    <hr>
+<font color=red><i>
+This outline is more detailed and attempts to be more comprehensive
+than the subsequent text.
+</i></font>
+<br>
+    </font>
+    <hr>
+
+    Outline:
+    <ol>
+      <li>Overview
+      <li>Strings
+      <li>String versus char base datatypes
+      <li>Creating string datatypes
+      <li>Creating fixed-length string datatypes
+      <li>Creating variable-length string datatypes
+      <ol type="a">
+          <li>Value and strengths 
+          <li>Limitations
+          <li>An alternative approach
+      </ol>
+      <li>Constrained variable-length strings
+      <ol type="a">
+          <li>Constrained, or <i>faux</i> or <i>spoofed</i>, variable-length strings
+      </ol>
+      <li>Character encodings
+      <ol type="a type="a"">
+          <li>ASCII, UTF-8, <code>H5Pset_char_encoding</code> (objects), 
+              <code>H5Tset_cset</code> (datatypes)
+          <li>Fixed-length ASCII strings easy
+          <li>Fixed-length UTF-8 strings not so easy
+          <ol type="i">
+              <li>Inherently variable-length, with 1 to 4 bytes per character
+              <li>In general case or when the nature, range, or constraints 
+                  of the strings in a dataset are not well characterized, 
+                  they can be most safely stored in a variable-length 
+                  string datatype.
+              <li>But circumstances may enable use of constrained 
+                  variable-length strings stored in a dataset of 
+                  fixed-length datatype.
+              <li>For example, if it is known that the strings in a dataset 
+                  will always be Hebrew text, one can be confident 
+                  that a few characters will be 1 byte, 
+                  most will be 2 bytes, and none will be more than 2 bytes.  
+                  In this case, a dataset of 10-character strings 
+                  could be safely stored with NULL terminators 
+                  in a 21-byte fixed-length string datatype.
+                  A dataset of 10- to 30-character strings 
+                  could be safely stored with NULL terminators 
+                  in a 61-byte (or 64-byte) fixed-length string datatype.
+                  Both would be examples of constrained variable-length 
+                  datatypes.
+              <li>This has the potential to substantially boost 
+                  I/O and/or storage efficiency over the use 
+                  of a variable-length string datatype.
+              <li>http://www.utf8-chartable.de/unicode-utf8-table.pl
+              <br>http://en.wikipedia.org/wiki/UTF-8
+              <br>http://en.wikipedia.org/wiki/Unicode
+          </ol>
+      </ol>
+      <li><code>H5Tvlen_create</code> creates something quite different
+    </ol>
+
+    <hr>
+<font color=red><i>
+Raw and uncorrected text follows.
+<br>
+_topic/create_vlen_strings.htm contains more carefully developed text,
+but only for one aspect of this. 
+</i></font>
+<br>
+    </font>
+    <hr>
+
+<br> 
+<br>
+
+<p>
+<strong>
+<a name="CreateVLString">
+Creating variable-length string datatypes</a>
+</strong>
+    <br>
+
+<font color=red><i>
+A heavily revised version of this section 
+(see <code>_topic/create_vlen_strings.htm</code>) 
+is included via PHP on the H5T RM page.
+</i></font>
+<br>
+
+    As the term implies, 
+    variable-length strings are strings of varying lengths.
+    <i>Real</i> variable-length strings can be arbitrarily long,
+    anywhere from 1 character to thousands of characters long.
+    These are what HDF5 calls <i>variable-length strings</i>
+    and, for the sake of discussion, we'll call them
+    <i>unconstrained variable-length strings</i> in this article.
+    <p>
+    But there is also a subclass of variable-length strings
+    that vary within a well-defined range. 
+    For example, a set of strings might be known to always be 
+    between 5 and 20 characters long.
+    In this article, we will call this subclass
+    <i>constrained variable-length strings</i>. 
+    From HDF5’s point of view, 
+    these are actually just fixed-length strings
+    that may happen to be shorter in length than the assigned datatype.
+    Think of them as <i>faux</i> variable-length strings;
+    we'll discuss them in more detail shortly.
+    <p>
+<!--
+    <strong>
+    A quick look at string and character datatypes:</strong>
+-->
+    Before we start creating strings, let’s look at
+    string and character datatypes for a minute.
+    HDF5 provides the following predefined datatypes that are relevant
+    to this discussion, one string datatype and three character datatypes:
+    <pre>
+    H5T_C_S1
+    H5T_NATIVE_CHAR
+    H5T_NATIVE_SCHAR
+    H5T_NATIVE_UCHAR
+    </pre>
+    The character datatypes, 
+        <code>H5T_NATIVE_CHAR</code>,
+        <code>H5T_NATIVE_SCHAR</code>, and 
+        <code>H5T_NATIVE_UCHAR</code>, 
+    are single-character datatypes; 
+    a data element of one of these datatypes always contains one character. 
+    They are unsuitable for creating a string datatype.
+
+    <p>
+    The string datatype, 
+        <code>H5T_C_S1</code> for C and 
+        <code>H5T_FORTRAN_S1</code> for Fortran,
+    defaults to one character in size but can be resized to any length. 
+    These types are therefore the base type for any fixed-length 
+    or variable-length string datatype.
+
+
+    <p>
+    <strong>
+    Creating unconstrained 
+    (or <i>real</i>) variable-length string datatypes:</strong>
+    <br>
+    The following HDF5 call creates a variable-length string datatype, 
+    <code>vls_type_id</code>:
+    <pre>
+    vls_type_id = H5Tcreate(H5T_C_S1, H5T_VARIABLE)                 (call 1)
+    </pre>
+    Strings of type <code>vls_type_id</code> can be of arbitrary length.
+    <p>
+    In a C environment, these strings will always be 
+    <small>NULL</small>-terminated, so the buffer to hold such a string 
+    in memory must be one byte larger than the string itself 
+    to accomadate the <small>NULL</small> terminator.
+    <p>
+    Under the covers, variable-length strings are stored in a heap, 
+    which can present challenges for efficient storage and read/write access.
+    <p>
+    The next section discusses a different approach which may be 
+    useful in situations where it is known that the string length 
+    in a dataset will vary within known bounds.
+
+    <p>
+    <strong>
+    Creating datatypes for constrained 
+    (or <i>faux</i>) variable-length strings:</strong>
+    <br>
+    To avoid the storage and I/O overhead associated with heaps,
+    it will sometimes be useful to take a different approach when 
+    it is known that the string length in a dataset 
+    will always fall within known bounds.
+    <p>
+    Consider the example of a dataset containing one million strings
+    that you know will range from 5 to 20 bytes in length.
+    The following HDF5 call creates a string datatype for strings 
+    up to 20 bytes.
+    <pre>
+    to20B_type_id = H5Tcreate(H5T_C_S1, 20)                         (call 2)
+    </pre>
+    If a particular data element is just a 5-byte string, 
+    simply write it to the dataset as a 5-byte string plus a 
+    <small>NULL</small> terminator (6 bytes total).
+    When HDF5 reads the data back in a C environment 
+    and as it works with the data, HDF5 will interpret the 
+    <small>NULL</small>-terminated string transparently and correctly.
+    <p>
+    Note that variable-length strings stored in this manner must 
+    always be <small>NULL</small>-terminated unless they exactly 
+    fill the full datatype space (exactly 20 bytes in this case).
+    Failure to include the <small>NULL</small>-terminator will 
+    result in either misinterpreted data or undefined values. 
+    <p>
+    Strings in this dataset can be of any length up to 20 bytes,
+    giving you essentially a constrained variable-length string.
+    But since everything is handled within a fixed-length datatype,
+    you receive all the benefits of HDF5’s highly efficient
+    sequential I/O without the overhead of extracting data from a heap.
+
+    <p>
+    If this datatype were defined as in call 1 and the million-element 
+    dataset were fully populated,
+    reading the entire dataset would require HDF5, under the covers, 
+    to issue up to 2 million seeks and reads to pluck the 
+    data elements 1-by-1 from the heap.
+    Using this <i>faux</i> variable-length datatype, HDF5 can read the 
+    entire dataset with a couple of seeks and reads.
+    <p>
+    Note that this dataset can also be chunked, an option that is 
+    not available in a heap and is thus unavailable for a dataset of 
+    unconstrained variable-length strings.
+
+    <p>
+    <strong>
+    Creating fixed-length string datatypes:</strong>
+    <br>
+    Relative to any form of variable-length string datatype,
+    fixed-length string datatypes are straight-forward.
+    The following HDF5 call creates a a fixed-length, 30-byte 
+    string datatype: 
+    <pre>
+    20B_type_id = H5Tcreate(H5T_C_S1, 30)
+    </pre>
+    This datatype can be used for 30-character ASCII strings 
+    without any need for <small>NULL</small> terminators
+    or any other special handling. 
+    <p>
+    <i>
+    [ Consider a note regarding the accommodations necessary
+    to handle fixed-length UTF-8 strings. ]
+    </i>
+
+
+    <p> 
+    <hr>
+
+    <strong>
+    The function <code>H5Tvlen_create</code> 
+    does not create variable-length strings</strong>
+    <br>
+    While it is tempting to try to create a variable-length string datatype with
+    <a href="../RM/RM_H5T.html#Datatype-VlenCreate"><code>H5Tvlen_create</code></a>,
+    that function actually creates a fundamentally different datatype object.
+    <p>
+    <code>H5Tvlen_create</code> creates a datatype that is a 
+    one-dimensional array datatype with array elements of the base datatype.
+    Consider the following examples: 
+    <pre>
+    vl_char_type_id       = H5Tvlen_create(H5T_NATIVE_CHAR) </pre>
+    This call creates a datatype that holds a variable-size, 
+    one-dimensional array of data elements; 
+    each element is of the <code>H5T_NATIVE_CHAR</code> base datatype.
+    <p>
+    <pre>
+    12B_string_type_id    = H5Tset_size(H5T_C_S1, 12)
+    vl_12B_string_type_id = H5Tvlen_create(12B_string) </pre>
+    This pair of calls creates a datatype that holds a variable-size, 
+    one-dimensional array of 12-byte strings.
+    <p>
+    <pre>
+    vl_int8_type_id       = H5Tvlen_create(H5T_IEEE_F32BE) </pre>
+    The above call creates a datatype that holds a variable-size, 
+    one-dimensional array of IEEE big-endian 32-bit floats.
+
+<!--
+
+<br> 
+<br> 
+<br> 
+<br>
+
+    <hr>
+    <font size="2">
+    Cut here -- the rest is scrap.
+    </font>
+    <hr>
+
+    <table border=1 align=right width=210><tr>
+        <td align=center>
+            <img src="../UG/Images/Dmodel_fig40_d+g3.jpg" width=250>
+            <img src="./Dmodel_fig40_d.jpg" width=250> 
+        </td></tr><tr><td align=center>
+            Sample file structure:<br><code>DATA_FILE1</code>
+    </tr></table>
+
+    <p>
+ 
+    <p>
+    <pre>
+    type_id = H5Tcreate(H5T_NATIVE_CHAR, H5T_VARIABLE)
+
+    type_id = H5Tvlen_create(H5T_C_S1)
+    H5Tset_size(type_id, H5T_VARIABLE)
+`
+    type_id = H5Tvlen_create(H5T_NATIVE_CHAR)
+
+
+    type_id = H5Tcreate(H5T_NATIVE_CHAR, H5T_VARIABLE)
+
+    type_id = H5Tcreate(H5T_C_S1, H5T_VARIABLE)
+    </pre>
+
+    <hr>
+    <hr>
+
+    <ul>
+        <li><code>loc_id</code> specifies <code>group3</code>.
+            <br>
+            <code>name = 'dset3'</code> 
+            <br>
+            <code>attr_name = 'A3'</code>
+            <p>
+    </ul>
+
+    <p>
+
+    <p>
+    <ul>
+        <li><code>whatever</code> specifies <code>whatever</code>.
+    </ul>
+
+ -->
+
+    <div align=right><font color=999999 size=-1><i>
+    Last modified: 29 August 2012
+      </i></font></div>
+
+
diff --git a/html/_topic/loc_id+name_attr.htm b/html/_topic/loc_id+name_attr.htm
index e89eb87..a4813f2 100644
--- a/html/_topic/loc_id+name_attr.htm
+++ b/html/_topic/loc_id+name_attr.htm
@@ -2,7 +2,8 @@
 
 <p>
 <strong>
-Location and name with attribute functions:
+<a name="LocIDandName-Attributes">
+Location and name with attribute functions:</a>
 </strong>
 <br>
 
diff --git a/html/cpplus/CppInterfaces.html b/html/cpplus/CppInterfaces.html
index 00ade8c..8523935 100644
--- a/html/cpplus/CppInterfaces.html
+++ b/html/cpplus/CppInterfaces.html
@@ -1423,7 +1423,6 @@ void resetIdComponent(
 
 <hr>
 
-
 <?php include("../ed_libs/Footer2.htm"); ?>
 
 Last modified: 17 December 2000 
diff --git a/html/ddl.html b/html/ddl.html
index 212e010..bf1d39f 100644
--- a/html/ddl.html
+++ b/html/ddl.html
@@ -22,11 +22,12 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
 <!-- #EndLibraryItem --><!-- #BeginLibraryItem "/ed_libs/NavBar_Common.lbi" -->
+
 <hr>
 <center>
 <table border=0 width=98%>
@@ -44,7 +45,9 @@
 </table>
 </center>
 <hr>
-<!-- #EndLibraryItem --><h1>DDL in BNF for HDF5</h1>
+<!-- #EndLibraryItem -->
+
+<h1>DDL in BNF for HDF5</h1>
 
 
 <h2>1. Introduction</h2>
@@ -616,6 +619,7 @@ GROUP "/" {
 
 
 <!-- #BeginLibraryItem "/ed_libs/NavBar_Common.lbi" -->
+
 <hr>
 <center>
 <table border=0 width=98%>
diff --git a/html/ed_libs/Footer-THGonly.htm b/html/ed_libs/Footer-THGonly.htm
index 43d1fad..ce9c3aa 100644
--- a/html/ed_libs/Footer-THGonly.htm
+++ b/html/ed_libs/Footer-THGonly.htm
@@ -8,7 +8,7 @@
           <address>
           The HDF Group Help Desk: <img src="./Graphics/help.png" align=top height=16>
           <br>
-          Describes HDF5 Release 1.8.16, November 2015.
+          Describes HDF5 Release 1.10.0-alpha
           </address>
       </td><td width="5%"> </td>
       <td align="right">
diff --git a/html/ed_libs/Footer-THGonly.lbi b/html/ed_libs/Footer-THGonly.lbi
index c34d171..7256673 100644
--- a/html/ed_libs/Footer-THGonly.lbi
+++ b/html/ed_libs/Footer-THGonly.lbi
@@ -6,7 +6,7 @@
           <address>
           The HDF Group Help Desk: <img src="../Graphics/help.png" align=top height=16>
           <br>
-          Describes HDF5 Release 1.8.15, May 2015.
+          Describes HDF5 Release 1.8.12, November 2013.
           </address>
       </td><td width="5%"> </td>
       <td align="right">
diff --git a/html/ed_libs/Footer-THGonly2.htm b/html/ed_libs/Footer-THGonly2.htm
index 36f6285..13f9acf 100644
--- a/html/ed_libs/Footer-THGonly2.htm
+++ b/html/ed_libs/Footer-THGonly2.htm
@@ -8,7 +8,7 @@
           <address>
           The HDF Group Help Desk: <img src="../Graphics/help.png" align=top height=16>
           <br>
-          Describes HDF5 Release 1.8.16, November 2015.
+          Describes HDF5 Release 1.10.0-alpha
           </address>
       </td><td width="5%"> </td>
       <td align="right">
diff --git a/html/ed_libs/Footer-THGonly3.htm b/html/ed_libs/Footer-THGonly3.htm
index 63aed02..94a69e9 100644
--- a/html/ed_libs/Footer-THGonly3.htm
+++ b/html/ed_libs/Footer-THGonly3.htm
@@ -8,7 +8,7 @@
           <address>
           The HDF Group Help Desk: <img src="../../Graphics/help.png" align=top height=16>
           <br>
-          Describes HDF5 Release 1.8.16, November 2015.
+          Describes HDF5 Release 1.10.0-alpha
           </address>
       </td><td width="5%"> </td>
       <td align="right">
diff --git a/html/ed_libs/Footer.htm b/html/ed_libs/Footer.htm
index 1bacaf7..ed46bf5 100644
--- a/html/ed_libs/Footer.htm
+++ b/html/ed_libs/Footer.htm
@@ -8,7 +8,7 @@
           <address>
           The HDF Group Help Desk: <img src="./Graphics/help.png" align=top height=16>
           <br>
-          Describes HDF5 Release 1.8.16, November 2015.
+          Describes HDF5 Release 1.10.0-alpha
           </address>
       </td><td width="5%"> </td>
       <td align="right">
diff --git a/html/ed_libs/Footer.lbi b/html/ed_libs/Footer.lbi
index 98a20dc..5970c07 100644
--- a/html/ed_libs/Footer.lbi
+++ b/html/ed_libs/Footer.lbi
@@ -6,7 +6,9 @@
           <address>
           The HDF Group Help Desk: <img src="../Graphics/help.png" align=top height=16>
           <br>
-          Describes HDF5 Release 1.8.15, May 2015.
+          Describes HDF5 Development Trunk, Release 1.9.x.
+          <br>
+          Highest current public release is HDF5 Release 1.8.x.
           </address>
       </td><td width="5%"> </td>
       <td align="right">
diff --git a/html/ed_libs/Footer2.htm b/html/ed_libs/Footer2.htm
index 5cb8626..0b85a1d 100644
--- a/html/ed_libs/Footer2.htm
+++ b/html/ed_libs/Footer2.htm
@@ -8,7 +8,7 @@
           <address>
           The HDF Group Help Desk: <img src="../Graphics/help.png" align=top height=16>
           <br>
-          Describes HDF5 Release 1.8.16, November 2015.
+          Describes HDF5 Release 1.10.0-alpha
           </address>
       </td><td width="5%"> </td>
       <td align="right">
diff --git a/html/ed_libs/Footer3.htm b/html/ed_libs/Footer3.htm
index 21ec7d5..34f40c1 100644
--- a/html/ed_libs/Footer3.htm
+++ b/html/ed_libs/Footer3.htm
@@ -8,7 +8,7 @@
           <address>
           The HDF Group Help Desk: <img src="../../Graphics/help.png" align=top height=16>
           <br>
-          Describes HDF5 Release 1.8.16, November 2015.
+          Describes HDF5 Release 1.10.0-alpha
           </address>
       </td><td width="5%"> </td>
       <td align="right">
diff --git a/html/ed_libs/Footer_Null.htm b/html/ed_libs/Footer_Null.htm
index a46de04..857ba2f 100755
--- a/html/ed_libs/Footer_Null.htm
+++ b/html/ed_libs/Footer_Null.htm
@@ -1,5 +1,5 @@
 
-<!-- INCLUDE VIA PHP FROM <doc_root>/ed_libs/Footer_Null.htm --> 
+<!-- INCLUDE VIA PHP FROM <doc_root>/ed_libs/Footer_Null.htm -->
 
 <!-- 
      The contents of this file (excluding this note) are to be swapped 
@@ -11,5 +11,5 @@
 
  
 
-<!-- END PHP INCLUDE FROM <doc_root>/ed_libs/Footer_Null.htm --> 
+<!-- END PHP INCLUDE FROM <doc_root>/ed_libs/Footer_Null.htm -->
 
diff --git a/html/ed_libs/Footer_Null.lbi b/html/ed_libs/Footer_Null.lbi
index 5a93513..f2509e6 100755
--- a/html/ed_libs/Footer_Null.lbi
+++ b/html/ed_libs/Footer_Null.lbi
@@ -1,7 +1,7 @@
 <!-- 
      The contents of this file (excluding this note) are to be swapped 
      in for the contents of Footer.lbi and Footer-THGonly.htm 
-     when switching from Electronic to  Print output.  
+     when switching from Electronic to  Print output.
      This file may be empty (aside from this note) or may have code 
      within it (print vs. electronic). 
 -->
diff --git a/html/ed_libs/NavBar_RM.lbi b/html/ed_libs/NavBar_RM.lbi
index db207dc..be00607 100644
--- a/html/ed_libs/NavBar_RM.lbi
+++ b/html/ed_libs/NavBar_RM.lbi
@@ -13,7 +13,8 @@
 <td valign=top align=right>
 In the 
 <a href="../RM/RM_H5Front.html">HDF5 Reference Manual</a> 
-<font size="-1"><br>
+<font size=-1>
+<br>
 <a href="../HL/RM_H5DS.html">H5DS</a>  
 <a href="../HL/RM_H5IM.html">H5IM</a>  
 <a href="../HL/RM_H5LT.html">H5LT</a>  
@@ -44,7 +45,6 @@ In the
 <a href="../RM/APICompatMacros.html">Compatibility Macros</a> 
 <br>
 <a href="../RM/CollectiveCalls.html">Collective Calls in Parallel</a> 
-</font>
 <!--
 <br>
 <i><font size=-1>(Printable <a href="http://hdfgroup.org/HDF5/doc/PSandPDF/HDF5_RefManual.PDF">PDF</a> of this Reference Manual)</font></i> 
diff --git a/html/ed_libs/styles_UG.lbi b/html/ed_libs/styles_UG.lbi
index 5166689..ac27d82 100644
--- a/html/ed_libs/styles_UG.lbi
+++ b/html/ed_libs/styles_UG.lbi
@@ -11,7 +11,7 @@
   * of the source code distribution tree; Copyright.html can be found at the  *
   * root level of an installed copy of the electronic HDF5 document set and   *
   * is linked from the top-level documents page.  It can also be found at     *
-  * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+  * http://www.hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have      *
   * access to either file, you may request a copy from help at hdfgroup.org.     *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  -->
diff --git a/html/index.html b/html/index.html
index 4afc6c5..7f0247a 100644
--- a/html/index.html
+++ b/html/index.html
@@ -256,7 +256,7 @@
 <td bgcolor="#FFFFFF" valign="top" align="center" colspan="3">
     <br />
     <font size="5" color="#004488">HDF5 Library</font>
-    <br /><font size="4" color="#004488">Release 1.8.16, November 2015
+    <br /><font size="4" color="#004488">HDF5 Release 1.10.0-alpha
     </font>
 </td>
 </tr>
@@ -419,7 +419,7 @@
 -->
         <br />
         <!-- hhmts start -->
-        Last modified: 13 November 2015
+        Last modified: 23 September 2015
         <!-- hhmts end -->
 
         <p>
diff --git a/m4/aclocal_fc.m4 b/m4/aclocal_fc.m4
index 6ad75e2..6d32f10 100644
--- a/m4/aclocal_fc.m4
+++ b/m4/aclocal_fc.m4
@@ -63,6 +63,20 @@ dnl was required" problem when libtool is also used
 dnl [1] MPICH.org
 dnl
 
+dnl See if the fortran compiler supports the intrinsic module "ISO_FORTRAN_ENV"
+
+AC_DEFUN([PAC_PROG_FC_ISO_FORTRAN_ENV],[
+  HAVE_ISO_FORTRAN_ENV="no"
+  AC_MSG_CHECKING([if Fortran compiler supports intrinsic module ISO_FORTRAN_ENV])
+  AC_LINK_IFELSE([AC_LANG_SOURCE([ 
+   PROGRAM main
+     USE, INTRINSIC :: ISO_FORTRAN_ENV
+   END PROGRAM
+  ])],[AC_MSG_RESULT([yes])
+     	HAVE_ISO_FORTRAN_ENV="yes"],
+      [AC_MSG_RESULT([no])])
+])
+
 dnl See if the fortran compiler supports the intrinsic function "SIZEOF"
 
 AC_DEFUN([PAC_PROG_FC_SIZEOF],[
@@ -111,38 +125,56 @@ AC_DEFUN([PAC_PROG_FC_STORAGE_SIZE],[
 
 ])
 
-dnl Check to see if -r8 was specified to determine if we need to
-dnl compile the DOUBLE PRECISION interfaces.
+dnl Check to see C_LONG_DOUBLE is available
+
+AC_DEFUN([PAC_PROG_FC_HAVE_C_LONG_DOUBLE],[
+  HAVE_C_LONG_DOUBLE_FORTRAN="no"
+  AC_MSG_CHECKING([if Fortran compiler supports intrinsic C_LONG_DOUBLE])
+  AC_LINK_IFELSE([AC_LANG_SOURCE([
+   PROGRAM main
+     USE ISO_C_BINDING
+     REAL(KIND=C_LONG_DOUBLE) :: d
+   END PROGRAM
+  ])], [AC_MSG_RESULT([yes])
+     	HAVE_C_LONG_DOUBLE_FORTRAN="yes"],
+     [AC_MSG_RESULT([no])])
+])
+
+dnl Check if C_LONG_DOUBLE is different from C_DOUBLE
 
-AC_DEFUN([PAC_PROG_FC_DEFAULT_REALisDBLE],[
-  FORTRAN_DEFAULT_REALisDBLE="no"	
-  AC_MSG_CHECKING([if Fortran default REAL is DOUBLE PRECISION])
+if  test "X$FORTRAN_HAVE_C_LONG_DOUBLE" = "Xyes"; then
+AC_DEFUN([PAC_PROG_FC_C_LONG_DOUBLE_EQ_C_DOUBLE],[
+  C_LONG_DOUBLE_IS_UNIQUE_FORTRAN="no"	
+  AC_MSG_CHECKING([if Fortran C_LONG_DOUBLE is different from C_DOUBLE])
   
   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
      MODULE type_mod
+       USE ISO_C_BINDING
        INTERFACE h5t	
-         MODULE PROCEDURE h5t_real
-         MODULE PROCEDURE h5t_dble
+         MODULE PROCEDURE h5t_c_double
+         MODULE PROCEDURE h5t_c_long_double
        END INTERFACE
      CONTAINS
-       SUBROUTINE h5t_real(r)
-         REAL :: r
-       END SUBROUTINE h5t_real
-       SUBROUTINE h5t_dble(d)
-         DOUBLE PRECISION :: d
-       END SUBROUTINE h5t_dble
+       SUBROUTINE h5t_c_double(r)
+         REAL(KIND=C_DOUBLE) :: r
+       END SUBROUTINE h5t_c_double
+       SUBROUTINE h5t_c_long_double(d)
+         REAL(KIND=C_LONG_DOUBLE) :: d
+       END SUBROUTINE h5t_c_long_double
      END MODULE type_mod
      PROGRAM main
+       USE ISO_C_BINDING
        USE type_mod
-       REAL :: r
-       DOUBLE PRECISION :: d
+       REAL(KIND=C_DOUBLE)      :: r
+       REAL(KIND=C_LONG_DOUBLE) :: d
        CALL h5t(r)
        CALL h5t(d)
      END PROGRAM main
-    ])], [AC_MSG_RESULT([no])], 
-         [AC_MSG_RESULT([yes])
-            FORTRAN_DEFAULT_REALisDBLE="yes"])
+    ])], [AC_MSG_RESULT([yes]) 
+            C_LONG_DOUBLE_IS_UNIQUE_FORTRAN="yes"], 
+         [AC_MSG_RESULT([no])])
 ])
+fi
 
 dnl Checking if the compiler supports the required Fortran 2003 features and
 dnl disable Fortran 2003 if it does not.
@@ -152,7 +184,6 @@ AC_DEFUN([PAC_PROG_FC_HAVE_F2003_REQUIREMENTS],[
 dnl --------------------------------------------------------------------
 dnl Default for FORTRAN 2003 compliant compilers
 dnl
-    HAVE_FORTRAN_2003="no"
     HAVE_F2003_REQUIREMENTS="no"
     AC_LINK_IFELSE([AC_LANG_PROGRAM([],[
 
@@ -268,7 +299,7 @@ dnl   Try link a simple MPI program.
       AC_MSG_CHECKING([whether a simple MPI-IO Fortran program can be linked])
       AC_LINK_IFELSE([ 
           PROGRAM main
-          USE mpi
+          INCLUDE 'mpif.h'
           INTEGER :: comm, amode, info, fh, ierror
           CHARACTER(LEN=1) :: filename 
           CALL MPI_File_open( comm, filename, amode, info, fh, ierror)
@@ -280,4 +311,280 @@ dnl   Try link a simple MPI program.
 dnl   Change to the C language
       AC_LANG_POP(Fortran)
 ])
+
+dnl ------------------------------------------------------
+dnl Determine the available KINDs for REALs and INTEGERs
+dnl ------------------------------------------------------
+dnl
+dnl This is a runtime test.
+dnl
+AC_DEFUN([PAC_FC_AVAIL_KINDS],[
+AC_LANG_PUSH([Fortran])
+rm -f pac_fconftest.out
+
+AC_RUN_IFELSE([
+    AC_LANG_SOURCE([
+    PROGRAM main
+        IMPLICIT NONE
+        INTEGER :: ik, k, lastkind, max_decimal_prec
+	INTEGER :: num_rkinds, num_ikinds
+        num_ikinds = 0
+        lastkind=SELECTED_INT_KIND(1)
+        OPEN(8, FILE='pac_fconftest.out', form='formatted')
+        ! Find integer KINDs
+        DO ik=2,36
+             k = SELECTED_INT_KIND(ik)
+             IF (k .NE. lastkind) THEN
+	          num_ikinds = num_ikinds + 1	
+                  WRITE(8,'(I0)',ADVANCE='NO') lastkind
+                  lastkind = k
+             	  IF(k.GT.0) WRITE(8,'(A)',ADVANCE='NO') ','	
+             ENDIF
+             IF (k .LE. 0) EXIT
+        ENDDO
+	IF (lastkind.NE.-1) THEN
+	   num_ikinds = num_ikinds + 1	
+           WRITE(8,'(I0)') lastkind
+	ELSE
+           WRITE(8,'()')
+        ENDIF
+        ! Find real KINDs
+        num_rkinds = 0
+        lastkind=SELECTED_REAL_KIND(1)
+	max_decimal_prec = 1
+        DO ik=2,36
+             k = SELECTED_REAL_KIND(ik)
+             IF (k .NE. lastkind) THEN
+                  num_rkinds = num_rkinds + 1
+                  WRITE(8,'(I0)',ADVANCE='NO') lastkind
+                  lastkind = k
+             	  IF(k.GT.0) WRITE(8,'(A)',ADVANCE='NO') ','
+	          max_decimal_prec = ik
+             ENDIF
+             IF (k .LE. 0) EXIT
+        ENDDO
+        IF (lastkind.NE.-1)THEN
+	    num_rkinds = num_rkinds + 1
+            WRITE(8,'(I0)') lastkind
+	ELSE
+           WRITE(8,'()')
+        ENDIF
+	WRITE(8,'(I0)') max_decimal_prec
+	WRITE(8,'(I0)') num_ikinds
+	WRITE(8,'(I0)') num_rkinds
+    END
+    ])
+],[
+    if test -s pac_fconftest.out ; then
 	
+     dnl The output from the above program will be:
+     dnl    -- LINE 1 --  valid integer kinds (comma seperated list)
+     dnl    -- LINE 2 --  valid real kinds (comma seperated list)
+     dnl    -- LINE 3 --  max decimal precision for reals
+     dnl    -- LINE 4 --  number of valid integer kinds
+     dnl    -- LINE 5 --  number of valid real kinds
+
+        pac_validIntKinds="`sed -n '1p' pac_fconftest.out`"
+	pac_validRealKinds="`sed -n '2p' pac_fconftest.out`"
+        PAC_FC_MAX_REAL_PRECISION="`sed -n '3p' pac_fconftest.out`"
+        AC_DEFINE_UNQUOTED([PAC_FC_MAX_REAL_PRECISION], $PAC_FC_MAX_REAL_PRECISION, [Define Fortran Maximum Real Decimal Precision])
+
+        PAC_FC_ALL_INTEGER_KINDS="{`echo $pac_validIntKinds`}"
+        PAC_FC_ALL_REAL_KINDS="{`echo $pac_validRealKinds`}"
+
+	H5CONFIG_F_NUM_IKIND="INTEGER, PARAMETER :: num_ikinds = `sed -n '4p' pac_fconftest.out`"
+	H5CONFIG_F_IKIND="INTEGER, DIMENSION(1:num_ikinds) :: ikind = (/`echo $pac_validIntKinds`/)"
+	H5CONFIG_F_NUM_RKIND="INTEGER, PARAMETER :: num_rkinds = `sed -n '5p' pac_fconftest.out`"
+	H5CONFIG_F_RKIND="INTEGER, DIMENSION(1:num_rkinds) :: rkind = (/`echo $pac_validRealKinds`/)"
+
+	AC_DEFINE_UNQUOTED([H5CONFIG_F_NUM_RKIND], $H5CONFIG_F_NUM_RKIND, [Define number of valid Fortran REAL KINDs])
+	AC_DEFINE_UNQUOTED([H5CONFIG_F_NUM_IKIND], $H5CONFIG_F_NUM_IKIND, [Define number of valid Fortran INTEGER KINDs])
+	AC_DEFINE_UNQUOTED([H5CONFIG_F_RKIND], $H5CONFIG_F_RKIND, [Define valid Fortran REAL KINDs])
+	AC_DEFINE_UNQUOTED([H5CONFIG_F_IKIND], $H5CONFIG_F_IKIND, [Define valid Fortran INTEGER KINDs])
+
+        AC_MSG_CHECKING([for Fortran INTEGER KINDs])
+        AC_MSG_RESULT([$PAC_FC_ALL_INTEGER_KINDS])
+	AC_MSG_CHECKING([for Fortran REAL KINDs])
+	AC_MSG_RESULT([$PAC_FC_ALL_REAL_KINDS])
+	AC_MSG_CHECKING([for Fortran REALs maximum decimal precision])
+	AC_MSG_RESULT([$PAC_FC_MAX_REAL_PRECISION])
+    else
+        AC_MSG_RESULT([Error])
+        AC_MSG_WARN([No output from test program!])
+    fi
+    rm -f pac_fconftest.out
+],[
+    AC_MSG_RESULT([Error])
+    AC_MSG_WARN([Failed to run program to determine available KINDs])
+],[])
+
+AC_LANG_POP([Fortran])
+])
+AC_DEFUN([PAC_FC_SIZEOF_INT_KINDS],[
+AC_REQUIRE([PAC_FC_AVAIL_KINDS])
+AC_MSG_CHECKING([sizeof of available INTEGER KINDs])
+AC_LANG_PUSH([Fortran])
+pack_int_sizeof=""
+rm -f pac_fconftest.out
+
+for kind in `echo $pac_validIntKinds | sed -e 's/,/ /g'`; do
+  AC_LANG_CONFTEST([
+      AC_LANG_SOURCE([
+                PROGRAM main
+                USE ISO_C_BINDING
+                IMPLICIT NONE
+                INTEGER (KIND=$kind) a
+                OPEN(8, FILE='pac_fconftest.out', FORM='formatted')
+                WRITE(8,'(I0)') $FC_SIZEOF_A
+                CLOSE(8)
+                END
+            ])
+        ])
+        AC_RUN_IFELSE([],[
+            if test -s pac_fconftest.out ; then
+                sizes="`cat pac_fconftest.out`"
+                pack_int_sizeof="$pack_int_sizeof $sizes,"
+            else
+                AC_MSG_WARN([No output from test program!])
+            fi
+            rm -f pac_fconftest.out
+        ],[
+            AC_MSG_WARN([Fortran program fails to build or run!])
+        ],[
+            pack_int_sizeof="$2"
+        ])
+done
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF="{`echo $pack_int_sizeof | sed -e 's/,$//' | sed -e 's/ //g'`}"
+AC_MSG_RESULT([$PAC_FC_ALL_INTEGER_KINDS_SIZEOF])
+AC_LANG_POP([Fortran])
+])
+
+AC_DEFUN([PAC_FC_SIZEOF_REAL_KINDS],[
+AC_REQUIRE([PAC_FC_AVAIL_KINDS])
+AC_MSG_CHECKING([sizeof of available REAL KINDs])
+AC_LANG_PUSH([Fortran])
+pack_real_sizeof=""
+rm -f pac_fconftest.out
+for kind in `echo  $pac_validRealKinds | sed -e 's/,/ /g'`; do
+  AC_LANG_CONFTEST([
+      AC_LANG_SOURCE([
+                PROGRAM main
+                USE ISO_C_BINDING
+                IMPLICIT NONE
+                REAL (KIND=$kind) :: a
+                OPEN(8, FILE='pac_fconftest.out', FORM='formatted')
+                WRITE(8,'(I0)') $FC_SIZEOF_A
+                CLOSE(8)
+                END
+            ])
+        ])
+        AC_RUN_IFELSE([],[
+            if test -s pac_fconftest.out ; then
+                sizes="`cat pac_fconftest.out`"
+                pack_real_sizeof="$pack_real_sizeof $sizes,"
+            else
+                AC_MSG_WARN([No output from test program!])
+            fi
+            rm -f pac_fconftest.out
+        ],[
+            AC_MSG_WARN([Fortran program fails to build or run!])
+        ],[
+            pack_real_sizeof="$2"
+        ])
+done
+PAC_FC_ALL_REAL_KINDS_SIZEOF="{`echo $pack_real_sizeof | sed -e 's/,$//' | sed -e 's/ //g'`}"
+AC_MSG_RESULT([$PAC_FC_ALL_REAL_KINDS_SIZEOF])
+AC_LANG_POP([Fortran])
+])
+
+AC_DEFUN([PAC_FC_NATIVE_INTEGER],[
+AC_REQUIRE([PAC_FC_AVAIL_KINDS])
+AC_MSG_CHECKING([sizeof of native KINDS])
+AC_LANG_PUSH([Fortran])
+pack_int_sizeof=""
+rm -f pac_fconftest.out
+  AC_LANG_CONFTEST([
+      AC_LANG_SOURCE([
+                PROGRAM main
+                USE ISO_C_BINDING
+                IMPLICIT NONE
+                INTEGER a
+                REAL b
+                DOUBLE PRECISION c
+                OPEN(8, FILE='pac_fconftest.out', FORM='formatted')
+                WRITE(8,*) $FC_SIZEOF_A
+	        WRITE(8,*) kind(a)
+	        WRITE(8,*) $FC_SIZEOF_B
+	        WRITE(8,*) kind(b)
+                WRITE(8,*) $FC_SIZEOF_C
+                WRITE(8,*) kind(c)
+                CLOSE(8)
+                END
+            ])
+        ])
+        AC_RUN_IFELSE([],[
+            if test -s pac_fconftest.out ; then
+                PAC_FORTRAN_NATIVE_INTEGER_KIND="`sed -n '1p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_INTEGER_SIZEOF="`sed -n '2p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_REAL_KIND="`sed -n '3p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_REAL_SIZEOF="`sed -n '4p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_DOUBLE_KIND="`sed -n '5p' pac_fconftest.out`"
+                PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF="`sed -n '6p' pac_fconftest.out`"
+            else
+                AC_MSG_WARN([No output from test program!])
+            fi
+            rm -f pac_fconftest.out
+        ],[
+            AC_MSG_WARN([Fortran program fails to build or run!])
+        ],[
+            pack_int_sizeof="$2"
+        ])
+AC_MSG_RESULT([$pack_int_sizeof])
+AC_LANG_POP([Fortran])
+])
+
+AC_DEFUN([PAC_FC_LDBL_DIG],[
+AC_MSG_CHECKING([maximum decimal precision for C])
+rm -f pac_Cconftest.out
+  AC_LANG_CONFTEST([
+      AC_LANG_PROGRAM([
+                #include <float.h>
+                #include <stdio.h>
+                #define CHECK_FLOAT128 $ac_cv_sizeof___float128
+                #if CHECK_FLOAT128!=0
+                # if $HAVE_QUADMATH!=0
+                #include <quadmath.h>
+                # endif
+                # ifdef FLT128_DIG
+                #define C_FLT128_DIG FLT128_DIG
+                # else
+                #define C_FLT128_DIG 0
+                # endif
+                #else
+                #define C_FLT128_DIG 0
+                #endif
+                #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+                #define C_LDBL_DIG DECIMAL_DIG 
+                #else
+                #define C_LDBL_DIG LDBL_DIG
+                #endif
+                ],[[
+                  FILE * pFile;
+                  pFile = fopen("pac_Cconftest.out","w");
+                  fprintf(pFile, "%d\n%d\n", C_LDBL_DIG, C_FLT128_DIG);
+                ]])
+        ])
+        AC_RUN_IFELSE([],[
+            if test -s pac_Cconftest.out ; then
+	        LDBL_DIG="`sed -n '1p' pac_Cconftest.out`" 
+	        FLT128_DIG="`sed -n '2p' pac_Cconftest.out`"
+            else
+                AC_MSG_WARN([No output from test program!])
+            fi
+            rm -f pac_Cconftest.out
+        ],[
+            AC_MSG_ERROR([C program fails to build or run!])
+        ],[])
+])
+
+
diff --git a/m4/libtool.m4 b/m4/libtool.m4
new file mode 100644
index 0000000..d7c043f
--- /dev/null
+++ b/m4/libtool.m4
@@ -0,0 +1,7997 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+m4_define([_LT_COPYING], [dnl
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+])
+
+# serial 57 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+		   [m4_fatal([Libtool version $1 or higher is required],
+		             63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\	*)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+m4_defun([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+  case $cc_temp in
+    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_WITH_SYSROOT])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PREPARE_SED_QUOTE_VARS
+# --------------------------
+# Define a few sed substitution that help us do robust quoting.
+m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
+[# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+])
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from `configure', and `config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain="$ac_aux_dir/ltmain.sh"
+])# _LT_PROG_LTMAIN
+
+
+## ------------------------------------- ##
+## Accumulate code for creating libtool. ##
+## ------------------------------------- ##
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the `libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+## ------------------------ ##
+## FIXME: Eliminate VARNAME ##
+## ------------------------ ##
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+	[m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+	[tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+	   m4_quote(lt_decl_varnames),
+	m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to `config.status' so that its
+# declaration there will have the same value as in `configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags="_LT_TAGS"dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+					   [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into `config.status', and then the shell code to quote escape them in
+# for loops in `config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+	dnl If the libtool generation code has been placed in $CONFIG_LT,
+	dnl instead of duplicating it all over again into config.status,
+	dnl then we will have config.status run $CONFIG_LT later, so it
+	dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$[]1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
+# ------------------------------------
+# Generate a child script FILE with all initialization necessary to
+# reuse the environment learned by the parent script, and make the
+# file executable.  If COMMENT is supplied, it is inserted after the
+# `#!' sequence but before initialization text begins.  After this
+# macro, additional text can be appended to FILE to form the body of
+# the child script.  The macro ends with non-zero status if the
+# file could not be fully written (such as if the disk is full).
+m4_ifdef([AS_INIT_GENERATED],
+[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
+[m4_defun([_LT_GENERATED_FILE_INIT],
+[m4_require([AS_PREPARE])]dnl
+[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
+[lt_write_fail=0
+cat >$1 <<_ASEOF || lt_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+$2
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$1 <<\_ASEOF || lt_write_fail=1
+AS_SHELL_SANITIZE
+_AS_PREPARE
+exec AS_MESSAGE_FD>&1
+_ASEOF
+test $lt_write_fail = 0 && chmod +x $1[]dnl
+m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+\`$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool at gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test $[#] != 0
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try \`$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try \`$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test "$silent" = yes &&
+  lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  _LT_PROG_REPLACE_SHELLFNS
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],			[_LT_LANG(C)],
+  [C++],		[_LT_LANG(CXX)],
+  [Go],			[_LT_LANG(GO)],
+  [Java],		[_LT_LANG(GCJ)],
+  [Fortran 77],		[_LT_LANG(F77)],
+  [Fortran],		[_LT_LANG(FC)],
+  [Windows Resource],	[_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+m4_ifndef([AC_PROG_GO], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC],     [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+  fi
+fi
+if test -z "$GOC"; then
+  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+  [LT_LANG(GO)],
+  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+dnl AC_DEFUN([AC_LIBTOOL_RC], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi])
+
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+	[lt_cv_ld_exported_symbols_list=yes],
+	[lt_cv_ld_exported_symbols_list=no])
+	LDFLAGS="$save_LDFLAGS"
+    ])
+
+    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
+      [lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
+      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
+      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
+  else
+    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  fi
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    m4_if([$1], [CXX],
+[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
+# ----------------------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+# Store the results from the different compilers for each TAGNAME.
+# Allow to override them for all tags through lt_cv_aix_libpath.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
+  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
+  lt_aix_libpath_sed='[
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }]'
+  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi],[])
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+  fi
+  ])
+  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
+fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[m4_divert_text([M4SH-INIT], [$1
+])])# _LT_SHELL_INIT
+
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Find how we can fake an echo command that does not interpret backslash.
+# In particular, with Autoconf 2.60 or later we add some code to the start
+# of the generated configure script which will find a shell with a builtin
+# printf (which we can use as an echo command).
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+AC_MSG_CHECKING([how to print strings])
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$[]1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*" 
+}
+
+case "$ECHO" in
+  printf*) AC_MSG_RESULT([printf]) ;;
+  print*) AC_MSG_RESULT([print -r]) ;;
+  *) AC_MSG_RESULT([cat]) ;;
+esac
+
+m4_ifdef([_AS_DETECT_SUGGESTED],
+[_AS_DETECT_SUGGESTED([
+  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test "X`printf %s $ECHO`" = "X$ECHO" \
+      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
+
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_WITH_SYSROOT
+# ----------------
+AC_DEFUN([_LT_WITH_SYSROOT],
+[AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[  --with-sysroot[=DIR] Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted.  We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   AC_MSG_RESULT([${with_sysroot}])
+   AC_MSG_ERROR([The sysroot must be an absolute path.])
+   ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and in which our libraries should be installed.])])
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    case `/usr/bin/file conftest.o` in
+	      *x86-64*)
+		LD="${LD-ld} -m elf32_x86_64"
+		;;
+	      *)
+		LD="${LD-ld} -m elf_i386"
+		;;
+	    esac
+	    ;;
+	  powerpc64le-*)
+	    LD="${LD-ld} -m elf32lppclinux"
+	    ;;
+	  powerpc64-*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  powerpcle-*)
+	    LD="${LD-ld} -m elf64lppc"
+	    ;;
+	  powerpc-*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+])# _LT_ENABLE_LOCK
+
+
+# _LT_PROG_AR
+# -----------
+m4_defun([_LT_PROG_AR],
+[AC_CHECK_TOOLS(AR, [ar], false)
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
+  [lt_cv_ar_at_file=no
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+     [echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([lt_ar_try])
+      if test "$ac_status" -eq 0; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	AC_TRY_EVAL([lt_ar_try])
+	if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+     ])
+  ])
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+_LT_DECL([], [archiver_list_spec], [1],
+  [How to feed a file listing to the archiver])
+])# _LT_PROG_AR
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[_LT_PROG_AR
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+_LT_DECL([], [lock_old_archive_extraction], [0],
+    [Whether to use a lock for old archive extraction])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len" && \
+	test undefined != "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen="dlopen"],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+	  lt_cv_dlopen_self_static, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+	 [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+	 [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+	 [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+	[Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links="nottested"
+if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
+  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
+   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+	[], [
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+m4_if([$1], [],[
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[23]].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
+    [lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+	 LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+	 [lt_cv_shlibpath_overrides_runpath=yes])])
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+    ])
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[[89]] | openbsd2.[[89]].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [install_override_mode], [1],
+    [Permission mode override for installation of shared libraries])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
+    [Run-time system search path for libraries])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program which can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program which can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_TAGDECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method = "file_magic"])
+_LT_DECL([], [file_magic_glob], [1],
+    [How to find potential files when deplibs_check_method = "file_magic"])
+_LT_DECL([], [want_nocaseglob], [1],
+    [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+  AC_SUBST([DUMPBIN])
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+# --------------------------------
+# how to determine the name of the shared library
+# associated with a specific link library.
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+m4_require([_LT_DECL_DLLTOOL])
+AC_CACHE_CHECK([how to associate runtime and link libraries],
+lt_cv_sharedlib_from_linklib_cmd,
+[lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+])
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
+    [Command to associate shared and link libraries])
+])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+
+
+# _LT_PATH_MANIFEST_TOOL
+# ----------------------
+# locate the manifest tool
+m4_defun([_LT_PATH_MANIFEST_TOOL],
+[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
+  [lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*])
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
+  esac
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+	[Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT@&t at _DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT@&t at _DLSYM_CONST
+#else
+# define LT@&t at _DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT@&t at _DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([], [nm_file_list_spec], [1],
+    [Specify filename containing input files for $NM])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# This hack is so that the source file can tell whether it is being
+	# built for inclusion in a dll (and should export symbols for example).
+	m4_if([$1], [GCJ], [],
+	  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd* | netbsdelf*-gnu)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
+      if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  ;;
+        *Intel*\ [[CF]]*Compiler*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	  ;;
+	*Portland\ Group*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+
+AC_CACHE_CHECK([for $compiler option to produce PIC],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+	[Additional compiler flags for building library objects])
+
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+	[How to pass a linker flag through the compiler])
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+	[Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    # Also, AIX nm treats weak defined symbols like other global defined
+    # symbols, whereas GNU nm marks them as "W".
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+      ;;
+    esac
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
+	  *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    haiku*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+	  tmp_sharedflag='--shared' ;;
+	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+	_LT_TAGVAR(link_all_deplibs, $1)=no
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX([$1])
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 _LT_SYS_MODULE_PATH_AIX([$1])
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  fi
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	_LT_TAGVAR(always_export_symbols, $1)=yes
+	_LT_TAGVAR(file_list_spec, $1)='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	# FIXME: Should let the user specify the lib program.
+	_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	m4_if($1, [], [
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  _LT_LINKER_OPTION([if $CC understands -b],
+	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
+	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
+	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
+	  [lt_cv_irix_exported_symbol],
+	  [save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   AC_LINK_IFELSE(
+	     [AC_LANG_SOURCE(
+	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
+			      [C++], [[int foo (void) { return 0; }]],
+			      [Fortran 77], [[
+      subroutine foo
+      end]],
+			      [Fortran], [[
+      subroutine foo
+      end]])])],
+	      [lt_cv_irix_exported_symbol=yes],
+	      [lt_cv_irix_exported_symbol=no])
+           LDFLAGS="$save_LDFLAGS"])
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	     ;;
+	   *)
+	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
+	[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
+	[$RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+	  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+	  _LT_TAGVAR(allow_undefined_flag, $1)=
+	  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+	  then
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	  else
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  fi
+	  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+	])
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [postlink_cmds], [2],
+    [Commands necessary for finishing linking programs])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report which library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC="$lt_save_CC"
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX([$1])
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    _LT_SYS_MODULE_PATH_AIX([$1])
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	    if test "$with_gnu_ld" = yes; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	    fi
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=yes
+	  _LT_TAGVAR(file_list_spec, $1)='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=".dll"
+	  # FIXME: Setting linknames here is a bad hack.
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	    else
+	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	    fi~
+	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	    linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	  # Don't use ranlib
+	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+	    lt_tool_outputfile="@TOOL_OUTPUT@"~
+	    case $lt_outputfile in
+	      *.exe|*.EXE) ;;
+	      *)
+		lt_outputfile="$lt_outputfile.exe"
+		lt_tool_outputfile="$lt_tool_outputfile.exe"
+		;;
+	    esac~
+	    func_to_tool_file "$lt_outputfile"~
+	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	      $RM "$lt_outputfile.manifest";
+	    fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=no
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file (1st line
+	    # is EXPORTS), use it as is; otherwise, prepend...
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      cp $export_symbols $output_objdir/$soname.def;
+	    else
+	      echo EXPORTS > $output_objdir/$soname.def;
+	      cat $export_symbols >> $output_objdir/$soname.def;
+	    fi~
+	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      haiku*)
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	      fi
+	    fi
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+	    ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
+	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+		$RANLIB $oldlib'
+	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+		;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	    case $host_os in
+	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      fi
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+		*)
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+	_LT_TAGVAR(link_all_deplibs, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
+	      '"$_LT_TAGVAR(old_archive_cmds, $1)"
+	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
+	      '"$_LT_TAGVAR(reload_cmds, $1)"
+	    ;;
+	  *)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)="$GXX"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_FUNC_STRIPNAME_CNF
+# ----------------------
+# func_stripname_cnf prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+#
+# This function is identical to the (non-XSI) version of func_stripname,
+# except this one can be used by m4 code that may be executed by configure,
+# rather than the libtool script.
+m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
+AC_REQUIRE([_LT_DECL_SED])
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
+func_stripname_cnf ()
+{
+  case ${2} in
+  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+} # func_stripname_cnf
+])# _LT_FUNC_STRIPNAME_CNF
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
+])
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case ${prev}${p} in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test "$pre_test_object_deps_done" = no; then
+	 case ${prev} in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	   else
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+	 else
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+	   _LT_TAGVAR(predep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+	   _LT_TAGVAR(postdep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC* | sunCC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_LANG_PUSH(Fortran 77)
+if test -z "$F77" || test "X$F77" = "Xno"; then
+  _lt_disable_F77=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_F77" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${F77-"f77"}
+  CFLAGS=$FFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$G77"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+  CFLAGS="$lt_save_CFLAGS"
+fi # test "$_lt_disable_F77" != yes
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_LANG_PUSH(Fortran)
+
+if test -z "$FC" || test "X$FC" = "Xno"; then
+  _lt_disable_FC=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_FC" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${FC-"f95"}
+  CFLAGS=$FCFLAGS
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test "$_lt_disable_FC" != yes
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+CFLAGS=$GCJFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+CFLAGS=
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+# _LT_DECL_DLLTOOL
+# ----------------
+# Ensure DLLTOOL variable is set.
+m4_defun([_LT_DECL_DLLTOOL],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
+AC_SUBST([DLLTOOL])
+])
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+AC_MSG_RESULT([$xsi_shell])
+_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
+
+AC_MSG_CHECKING([whether the shell understands "+="])
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+AC_MSG_RESULT([$lt_shell_append])
+_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
+# ------------------------------------------------------
+# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
+# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
+m4_defun([_LT_PROG_FUNCTION_REPLACE],
+[dnl {
+sed -e '/^$1 ()$/,/^} # $1 /c\
+$1 ()\
+{\
+m4_bpatsubsts([$2], [$], [\\], [^\([	 ]\)], [\\\1])
+} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+])
+
+
+# _LT_PROG_REPLACE_SHELLFNS
+# -------------------------
+# Replace existing portable implementations of several shell functions with
+# equivalent extended shell implementations where those features are available..
+m4_defun([_LT_PROG_REPLACE_SHELLFNS],
+[if test x"$xsi_shell" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary parameter first.
+    func_stripname_result=${3}
+    func_stripname_result=${func_stripname_result#"${1}"}
+    func_stripname_result=${func_stripname_result%"${2}"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
+    func_split_long_opt_name=${1%%=*}
+    func_split_long_opt_arg=${1#*=}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
+    func_split_short_opt_arg=${1#??}
+    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
+    case ${1} in
+      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+      *)    func_lo2o_result=${1} ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
+
+  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
+
+  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
+    func_quote_for_eval "${2}"
+dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
+    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
+fi
+])
+
+# _LT_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine which file name conversion functions should be used by
+# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
+# for certain cross-compile configurations and native mingw.
+m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_MSG_CHECKING([how to convert $build file names to $host format])
+AC_CACHE_VAL(lt_cv_to_host_file_cmd,
+[case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+])
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
+_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
+         [0], [convert $build file names to $host format])dnl
+
+AC_MSG_CHECKING([how to convert $build file names to toolchain format])
+AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
+[#assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+])
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
+_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
+         [0], [convert $build files to toolchain format])dnl
+])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4
new file mode 100644
index 0000000..5d9acd8
--- /dev/null
+++ b/m4/ltoptions.m4
@@ -0,0 +1,384 @@
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
+#   Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 7 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option `$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+		      [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+  		   [_LT_ENABLE_FAST_INSTALL])
+  ])
+])# _LT_SET_OPTIONS
+
+
+## --------------------------------- ##
+## Macros to handle LT_INIT options. ##
+## --------------------------------- ##
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [1], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the `shared' and
+# `disable-shared' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+	[Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the `static' and
+# `disable-static' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+	[Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the `fast-install'
+# and `disable-fast-install' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+	 [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# LT_INIT options.
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+	IFS="$lt_save_ifs"
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [pic_mode=default])
+
+test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+## ----------------- ##
+## LTDL_INIT Options ##
+## ----------------- ##
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+		 [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+		 [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+		 [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+		 [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4
new file mode 100644
index 0000000..9000a05
--- /dev/null
+++ b/m4/ltsugar.m4
@@ -0,0 +1,123 @@
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59 which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+	     [m4_foreach([_Lt_suffix],
+		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+		 [lt_append([$1], [$2], [$3])$4],
+		 [$5])],
+	  [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+	[$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
diff --git a/m4/ltversion.m4 b/m4/ltversion.m4
new file mode 100644
index 0000000..07a8602
--- /dev/null
+++ b/m4/ltversion.m4
@@ -0,0 +1,23 @@
+# ltversion.m4 -- version numbers			-*- Autoconf -*-
+#
+#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# @configure_input@
+
+# serial 3337 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.4.2])
+m4_define([LT_PACKAGE_REVISION], [1.3337])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.4.2'
+macro_revision='1.3337'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4
new file mode 100644
index 0000000..c573da9
--- /dev/null
+++ b/m4/lt~obsolete.m4
@@ -0,0 +1,98 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 5 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
diff --git a/release_docs/HISTORY-1_0-1_8_0_rc3.txt b/release_docs/HISTORY-1_0-1_8_0_rc3.txt
index f42bb00..964d374 100644
--- a/release_docs/HISTORY-1_0-1_8_0_rc3.txt
+++ b/release_docs/HISTORY-1_0-1_8_0_rc3.txt
@@ -1,6 +1,8 @@
 HDF5 HISTORY
 ============
-This file contains history of the HDF5 libraries releases
+This file contains history of the HDF5 libraries releases starting with
+HDF5-1.0.0 and ending with HDF5-1.8.0-rc3 (the state of the code before i
+the HDF5 1.8.0 release).
 
 CONTENTS
 
@@ -538,8 +540,8 @@ New Features
     ------
         - h5repack and h5diff changed command line parameter syntax to be
            similar to h5dump, adding also long switch names. PVN - 2008/1/16
-     	- h5repack now supports adding multiple filters to all objects. 
-	   PVN - 2008/1/16
+        - h5repack now supports adding multiple filters to all objects. 
+	     PVN - 2008/1/16
         - h5dump lists groups and attributes in requested orders (by name and 
            creation order, both ascending and descending). PVN - 2007/10/5
         - h5import imports string (text) data. PVN - 2007/10/5
diff --git a/release_docs/HISTORY-1_8.txt b/release_docs/HISTORY-1_8.txt
deleted file mode 100644
index 4737fce..0000000
--- a/release_docs/HISTORY-1_8.txt
+++ /dev/null
@@ -1,10947 +0,0 @@
-HDF5 History
-============
-
-This file contains development history of HDF5 1.8 branch
-
-17.      Release Information for hdf5-1.8.15
-16.      Release Information for hdf5-1.8.14
-15.      Release Information for hdf5-1.8.13
-14.      Release Information for hdf5-1.8.12
-13.      Release Information for hdf5-1.8.11
-12.      Release Information for hdf5-1.8.10-patch1
-11.      Release Information for hdf5-1.8.10
-10.      Release Information for hdf5-1.8.9
-09.      Release Information for hdf5-1.8.8
-08.      Release Information for hdf5-1.8.7
-07.      Release Information for hdf5-1.8.6
-06.      Release Information for hdf5-1.8.5
-05.      Release Information for hdf5-1.8.4
-04.      Release Information for hdf5-1.8.3
-03.      Release Information for hdf5-1.8.2
-02.      Release Information for hdf5-1.8.1
-01.      Release Information for hdf5-1.8.0
-
-[Search on the string '%%%%' for section breaks of each release.]
-
-
-%%%%1.8.15%%%%   
-
-
-HDF5 version 1.8.15 released on 2015-05-04
-================================================================================
-
-INTRODUCTION
-============
-
-This document describes the differences between HDF5-1.8.14 and 
-HDF5-1.8.15, and contains information on the platforms tested and 
-known problems in HDF5-1.8.15. 
-
-Links to the HDF5 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
-
-     http://www.hdfgroup.org/products/hdf5/
-
-The HDF5 release can be obtained from:
-
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
-
-User documentation for HDF5 can be accessed directly at this location: 
-
-     http://www.hdfgroup.org/HDF5/doc/
-
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document at this location:
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-
-If you have any questions or comments, please send them to the HDF Help Desk:
-
-     help at hdfgroup.org
-
-
-CONTENTS
-========
-
-- New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.14
-- Supported Platforms
-- Supported Configuration Features Summary
-- More Tested Platforms
-- Known Problems
-
-
-New Features
-============
-
-    Configuration
-    -------------
-    - CMake
-    
-      Improvements made to the CMake build system.
-        
-      The default options were changed to align with the Autotools configure
-      defaults. CMake configure files now support components when packaged
-      with CPack. Windows CPack supports WiX packaging, and will look for
-      WiX and NSIS in the standard locations. 
-      
-      The CMake minimum has been changed to 3.1.
-      
-      (ADB - 2015/04/01 HDFFV-8074, 8968, 9006)
-      
-    - cmakehdf5 for Cmake building.
-      Added configure options to support the building of Fortran or CXX API,
-      to enable/disable testings. Use "cmakehdf5 --help" for details.
-      (AKC - 2014/12/09 HDFFV-8932)
-
-    - Building Shared and Parallel Made Explicit
-
-      When --enable-parallel is specified, configure used to disable
-      shared by default.
-
-      Removed the restriction for building shared when parallel is
-      enabled. --disable-shared has to be used explicitly if user
-      wishes to disable shared libraries.
-
-      (MSC - 2015/02/19 HDFFV-9069)
-
-    - Inferring Parallel Compilers
-
-      configure was trying to infer if a compiler is a parallel
-      compiler with MPI support and enable parallel even if the user
-      did not explicitly enable parallel. This should not happen.
-
-      Disabled inferring parallel compilers to enable parallel HDF5
-      build. --enable-parallel has to be used explicitly to build
-      parallel HDF5 regardless of the compiler type being used.
-
-      (MSC - 2015/02/19 HDFFV-9068)
-
-    - Large File Support Configuration Option
-      
-      Removed the option to enable or disable large file support. It will
-      always be enabled.
-      
-      (MSC - 2015/02/19 HDFFV-9097)
-
-    - Removed Configuration Feature
-
-      When configure detected that the CodeWarrior compiler was being used it
-      would define a symbol that caused a test in test/tfile.c to be skipped
-      due to a broken CodeWarrior open() command.
-
-      Since this only masks the problem instead of fixing it and we don't
-      support CodeWarrior anyway, this functionality was removed.
-
-      (DER - 2015/02/21, HDFFV-9080)
-
-    - VMS Build/Test Files Have Been Removed
-
-      HDF5 no longer supports VMS, and the files were getting out of date.
-      Since we have no access to a VMS machine, there is no way for us to
-      maintain them.
-
-      A Subversion tag was created at:
-
-        https://svn.hdfgroup.uiuc.edu/tags/vms_last_support_1_8
-
-      immediately before removing the files.
-
-      (DER - 2015-02-26, HDFFV-9147)
-
-    - Removal of --with-default-vfd configure Option
-
-      In theory, this option was intended to allow setting a default
-      VFD that would be used by the library. In practice, the feature
-      only accepted the POSIX (SEC2) VFD (already the default) and
-      the stdio VFD (a demo VFD not intended for production use). The
-      inability to pass key VFD parameters at configure time limits the
-      full implementation of this feature, so it was retired.
-
-      (DER - 2015-02-26, HDFFV-9081)
-
-    - Direct VFD configure Behavior
-
-      The configure options for Linux now allow the Direct VFD to build
-      without passing additional compiler options/defines like _GNU_SOURCE.
-      Passing --enable-direct-vfd is now all that is needed to enable
-      the feature.
-
-      The Direct VFD is now disabled by default since it is intended for
-      specialized audiences. It was previously enabled by default, but the
-      configure script did not set correct POSIX levels, etc. making this
-      a moot point.
-
-      Note that the Direct VFD can only be configured on Linux when
-      the O_DIRECT flag to open()/create() and posix_memalign() function
-      are available. This is unchanged from previous behavior.
-
-      (DER - 2015-02-26, HDFFV-9057, 7567, 9088, 7566)
-
-    - _POSIX_C_SOURCE, _GNU_SOURCE, and _BSD_SOURCE No Longer Exported 
-      to h5cc and Other Compiler Wrappers
-
-      The _POSIX_C_SOURCE, _GNU_SOURCE, and _BSD_SOURCE definitions are 
-      not required for using API functions and may conflict with user 
-      code requirements.
-
-      (DER - 2015-03-08, HDFFV-9152)
-
-    - Removed the --enable-filters Option from configure
-
-      This option allowed the user to disable selected internal filters,
-      presumably to make the library smaller. It has been removed since
-      it saved little space (the internal filters are small with respect
-      to the overall library size) and was not generally extendible to
-      the library at large due to the large number of #ifdefs that would
-      be required.
-
-      Note that this features applied to internal filters such as shuffle
-      and n-bit and not external filters like gzip or Szip. Those are still
-      enabled or disabled via their own configure options.
-
-      (DER - 2015-03-08, HDFFV-9086)
-
-    - Removed Obsolete Time Functionality from configure and the C Library
-
-      The library contained some residual functionality from obsolete
-      time zone handling code. This has been removed, and the configure
-      checks for the time functions have been cleaned up.
-
-      * Lumped all the time functionality together in configure.ac.
-        This was previously more spread out due to Solaris issues
-        with the ordering of certain checks.
-
-      * Removed processing that handles __tm_gmtoff members of struct
-        tm. (libc-4)
-
-      * Removed BSDgettimeofday(). (IRIX 5.3)
-
-      * Removed timezone struct handling in gettimeofday() (considered
-        harmful).
-
-      Note that the HDF5 Library stores timestamps in a platform-independent
-      manner, so old files can still be read. This only affects converting
-      system time to HDF5 timestamps.
-
-      The library currently uses the tm_gmtoff member of the tm struct
-      (preferred, if available) or the timezone global variable to
-      construct HDF5 timestamps.
-
-      (DER - 2015-03-09, HDFFV-9083 and 9085)
-
-    - Added -D_DEFAULT_SOURCE to CPPFLAGS on Linux Systems
-
-      This is the replacement for -D_BSD_SOURCE in versions of glibc since 2.19.
-      Since both are defined, it should work for all versions of glibc. Defining
-      both suppresses the warning about defining _BSD_SOURCE.
-
-      (NAF - 2015-04-02, HDFFV-9079)
-
-    Library
-    -------
-    - Added Memory Allocation Functions that Use the Library's Allocator
-
-      HDF5 filters may need to allocate or resize the buffer that is passed
-      to them from the library. If the filter has been compiled separately
-      from the library, it and the library may use different memory
-      allocation libraries for the (re)allocation and free calls. This can
-      cause heap corruption and crashes. This is particularly a problem on
-      Windows since each C run-time library is implemented as a separate
-      shared library, but can also show up on POSIX systems when debug or
-      high-performance allocation libraries are in use.
-
-      Two new functions (H5allocate_memory() and H5resize_memory()) were
-      added to the HDF5 C library. These functions have the same semantics as
-      malloc/calloc and realloc, respectively. Their primary purpose is to
-      allow filter authors to allocate or resize memory using the same
-      memory allocation library as the HDF5 library. Filter authors are
-      highly encouraged to use these new functions in place of malloc,
-      calloc, and realloc. They should also use the H5free_memory() call when
-      freeing memory.
-
-      Note that the filters provided with the library (zlib, szip, etc.) do
-      not experience the problems that these new functions are intended to
-      fix. This work only applies to third-party filters that are compiled
-      separately from the library.
-
-      (DER - 2015-04-01, HDFFV-9100)
- 
-    - H5Pset_istore_k and H5Pset_sym_k
-
-      These two functions didn't check the value of the input parameter "ik". 
-      When 2*ik exceeded 2 bytes of storage, data was lost in the file; 
-      for example, some chunks would be overwritten.  
-
-      Added validation of "ik" to not exceed the max v1 btree entries (2 bytes)
-      to these two routines.
-
-      (VC - 2015-03-24, HDFFV-9173)
-
-    - Added Functions to Control the Value of H5PL_no_plugin_g without 
-      Using an Environment Variable
-      
-      Sometimes it is necessary for an application to disable the use of 
-      dynamically loaded plugin libraries without requiring the library to 
-      be built with plugin support disabled or to set an environment 
-      variable to disable plugin support globally.
-      
-      Two new functions (H5PLset_loading_state() and H5PLget_loading_state())
-      were added to the HDF5 C Library. These functions require a parameter 
-      that indicates which type of dynamically loaded plugin is enabled or 
-      disabled.
-      
-      (ADB - 2015-03-17, HDFFV-8520)
-      
-    Parallel Library
-    ----------------
-    - MPI_Finalize and HDF5 Library Shutdown
-
-      Calling HDF5 routines after MPI_Finalize has been closed should
-      not be done, since those routines might call MPI functions that
-      would not be possible to do after finalizing the MPI library.
-
-      Attached an attribute destroy callback to MPI_COMM_SELF that
-      shuts down the HDF5 library when MPI_COMM_SELF is destroyed,
-      in other words, on MPI_Finalize. This should fix several issues 
-      that users see when they forget to close HDF5 objects before 
-      calling MPI_Finalize().  
-
-      (MSC - 2015/02/25, HDFFV-883)
- 
-    Tools
-    -----
-    - None
-
-    High-Level APIs
-    ---------------
-    - None
-
-    Fortran API
-    -----------
-    - Added Global Variables 
-    
-      These new global variables are equivalent to the C definitions 
-      without the '_F':
-      
-      H5G_UDLINK_F  
-      H5G_SAME_LOC_F
-      H5O_TYPE_UNKNOWN_F
-      H5O_TYPE_GROUP_F
-      H5O_TYPE_DATASET_F
-      H5O_NAMED_DATATYPE_F
-      H5O_TYPE_NTYPES_F
-      
-      (MSB - 2015/02/03, HDFFV-9040)
-
-
-    C++ API
-    -------
-    - New Wrappers for C Functions H5P[s/g]et_libver_bounds
-
-      Wrappers were added to class H5::FileAccPropList for the 
-      C Functions H5Pget_libver_bounds and H5Pset_libver_bounds.
-
-      (BMR, 2015/04/06, Part of HDFFV-9167)
-
-    - New Wrappers to Get the Object Header's Version
-
-      The following wrappers are added to class H5::CommonFG
-      Returns the object header version of an object in a file or group,
-      given the object's name.
-      
-      unsigned childObjVersion(const char* objname) const;
-      unsigned childObjVersion(const H5std_string& objname) const;
-
-      (BMR, 2015/04/06)
-
-    - New DataType Constructor
-
-      Added a DataType constructor that takes a PredType object, and this
-      constructor will invoke H5Tcopy to generate another datatype id 
-      from a predefined datatype.
-
-      (BMR, 2015/04/06)
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-    - Support for Linux 3.10.0-123.20.1.el7 added (LK - 2015/04/01) 
-    - Support for Mac OS X Yosemite 10.10 added (AKC - 2015/03/04, HDFFV-9007)
-    - Support for AIX 6.1 added and AIX 5.3 is retired. (AKC - 2015/01/09)
-
-Bug Fixes since HDF5-1.8.14
-===========================
-
-    Configuration
-    -------------
-    - Make uninstall generated "test: argument expected".
-      The error is due to $EXAMPLETOPDIR is used without setting a value first.
-
-      Fixed by assign it with the proper value.
-
-      (AKC - 2015/04/29, HDFFV-9298) 
-
-    - Windows Installer Incorrect Display of PATH Environment Variable
-    
-      In the Windows installer, the dialog box where the user can elect to
-      add the product's bin path to the %PATH% environment variable displayed
-      an incorrect path. This path was missing the C:\Program Files part
-      and used the POSIX file separator '/' before the bin (<path>/bin,
-      instead of <path>\bin).
-      
-      The dialog box text was changed to simply say that the product's bin
-      path would be added instead of explicitly displaying the path.
-      This is in line with most installers. The reason for not fixing the 
-      displayed path instead is that it is difficult to pass the correct
-      path from CPack to the NSIS installer for display.
-
-      Note that this was never a code issue - it was just a display
-      problem. The installer always did the right thing when updating the
-      environment variable.
-
-      (DER - 2014/11/14, HDFFV-9016)
-
-    Library
-    -------
-    - Incorrect Usage of List in CMake COMPILE_DEFINITIONS set_property
-    
-      The CMake command set_property with COMPILE_DEFINITIONS property
-      needs a quoted semi-colon separated list of values. CMake will
-      transform the list to a series of -D{value} for the compile.
-      
-      (ADB - 2014/12/09, HDFV-9041)
-      
-    - Fixed Compile Errors on Windows w/ Visual Studio and CMake When
-      UNICODE is Defined
-    
-      The HDF5 Library could not be built on Windows with Visual Studio when
-      UNICODE was defined. This was due to the incorrect use of the TEXT() 
-      macro and some Win32 API functions that take TCHAR parameters. The faulty
-      code was a part of the filter plugin functionality. This was a
-      compile-time error that only affected users who build HDF5 from source
-      and define UNICODE, usually when HDF5 is being built as a part of a
-      larger product. There were no run-time effects.
-      
-      These errors caused no problems when UNICODE was not defined. HDF5 is
-      normally not built with UNICODE defined and the binaries were
-      unaffected.
-      
-      The fix was to remove the TEXT() macro and explicitly use the
-      'A' form of the Win32 API calls, which expect char strings instead of
-      wchar_t strings.
-      
-      Note that HDF5 currently does not support Unicode file paths on Windows.
-      
-      (DER - 2015/02/22, HDFFV-8927)
-
-    - Addition of Error Tracing Functionality to Several C API Calls
-
-      A bug in a text processing script caused API calls that return a
-      pointer to not receive error tracing macros/functionality.
-
-      The bug has been corrected and error tracing functionality has been
-      added to the affected API calls. These functions will now correctly
-      print trace information when library errors are encountered.
-
-      (DER - 2015/02/26, HDFFV-9141)
-
-    - H5Rdereference Now Checks for HADDR_UNDEF or Uninitialized References
-
-      When passed HADDR_UNDEF or uninitialized references, the previous 
-      behavior of H5Rdereference was to continue to process the reference 
-      as a valid address. 
-      
-      H5Rdereference was changed to return immediately (with an error 
-      message) if the references are HADDR_UNDEF or uninitialized.
-
-      (MSB - 2015/3/10, HDFFV-7959)
-
-    - Fixed Bugs in H5Sextent_copy
-
-      H5Sextent_copy would not free the previous extent, resulting in a memory
-      leak.  Also, H5Sextent_copy would not update the number of elements
-      selected if the selection was "all", causing various problems.  These
-      issues have been fixed.
-
-      (NAF - 2015/04/02)
-
-
-    Parallel Library
-    ----------------
-    - Fixed a Potential Memory Error
-      
-      Fixed a potential memory error when performing parallel I/O on a 
-      dataset with a single chunk, and at least one process has nothing 
-      to do.
-      
-      (NAF - 2015/02/16)
-
-    - Parallel Test Problem Fixed
-      
-      Fixed problem with parallel tests where they failed beyond a
-      certain number of ranks. All tests should work for any arbitrary
-      number of ranks. 
-      
-      (MSC - 2014/11/06, HDFFV-1027,8962,8963)
-
-    - MPE Support
-
-      Enabling MPE was causing HDF5 build to fail. Support for it was
-      dropped at some point in time.
-
-      Fixed problem with enabling MPE. Users should use the community
-      maintained MPE on github (http://git.mpich.org/mpe.git/). 
-
-      (MSC - 2015/02/20, HDFFV-9135)
-
-    Performance
-    -------------
-    - None
-
-    Tools
-    -----
-    - h5repack crashed on enumerated 8-bit type.
-
-      Previous version 1.8.14 introduced an error that caused the reading
-      of enumerated 8-bit type nested in compound type to fail.
-
-      Fixed library code responsible for reading the particular type.
-      (AKC - 2015.03/31, HDFFV-8667)
-
-    - h52gif crashed non-8bit images.
-
-      h52gif crashed if instructed to convert images other than 8bit images.
-
-      h52gif could handle only 8bit images. Added code to detect non-8bit
-      images and flag them as failure.  Update tool document page to reflect
-      the limit.
-      (AKC - 2015/03/31, HDFFV-8957)
-
-    - perform/benchpar.c retired.
-
-      benchpar.c has not been built for a long time and its original purpose
-      is not needed any more.
-      (AKC - 2014/12/19, HDFFV-8156)
-
-    - Source perform/ directory moved to tools/perform.
-      The perform directory is moved to tools/perform for easier maintenance.
-      (AKC - 2014/12/17, HDFFV-9046)
-      
-    Fortran API
-    ------------
-    - Fortran Fails with --enable-fortran2003 and Intel 15.x Compilers
-      
-      Added BIND(C) to the offending APIs. 
-
-      The Fortran Library (--enable-fortran2003) now works using Intel 15.x 
-      without the need for any additional compilers flags. 
-      
-      (MSB - 2015/1/26, HDFFV-9049)
-
-    - h5tenum_insert_f Does Not Work with Default 8 Byte Integers 
-      (xlf compiler)
-      
-      In the Fortran 90 API, 'value' is no longer cast into the C int type. 
-      Therefore, if h5tenum_insert_f is passed an 8 byte integer (via -i8) 
-      then 'value' is written as the same type as the default Fortran 
-      integer type (which can be 8 bytes).
-      
-      A new Fortran 2003 API was added which is more in line with the C 
-      API and users are strongly encouraged to use the Fortran 2003 API 
-      instead of the Fortran 90 API.
-
-      SUBROUTINE h5tenum_insert_f(type_id, name, value, hdferr)
-      INTEGER(HID_T)  , INTENT(IN) :: type_id
-      CHARACTER(LEN=*), INTENT(IN) :: name
-      TYPE(C_PTR)     , INTENT(IN) :: value
-      INTEGER, INTENT(OUT) :: hdferr
-
-      (MSB - 2015/2/19, HDFFV-8908)
-
-    - Some Fortran APIs Never Returned the Error State
-      
-      Some Fortran APIs never returned the error state: they 
-      would always return a positive number. The APIs include 
-      the following:
-      
-      h5fget_file_image_f
-      h5lget_name_by_idx_f
-      h5oget_comment_by_name_f
-
-      They were corrected to return a negative number as described in 
-      the Reference Manual if an error occurred. 
-
-      (MSB - 2015/3/19, HDF5-239)
-
-    - Fixed h5pget_class_f 
-
-      h5pget_class_f never correlated the class identifier to the property 
-      list class name as indicated in the HDF5 Reference Manual; it instead 
-      returned a property list class identifier as an INTEGER. The INTEGER 
-      needed to be of type INTEGER(HID_T) to be correct.
-
-      The h5pget_class_f API was changed to return an INTEGER(HID_T) 
-      property list class identifier instead of an INTEGER. This mimics the 
-      intended behavior of the C API.
-
-      (MSB - 2015/3/16, HDFFV5-9162)
-
-    C++ API
-    ------
-    - Combined Two H5File::getObjCount Overloaded Methods
-
-      The following two methods
-      
-      ssize_t getObjCount(unsigned types) const;
-      ssize_t getObjCount() const;
-      
-      were combined into one:
-      
-      ssize_t getObjCount(unsigned types = H5F_OBJ_ALL) const;
-
-      (BMR - 2015/04/06)
-
-    - Many Warnings Were Removed
-
-      Many warnings such as conversion, unused variables, missing base
-      class initialization, and initializing base classes in wrong order 
-      were removed.
-
-      (BMR, 2015/04/06)
-
-    - Functionality Deprecation
-
-      The following two constructors of classes AbstractDs, IdComponent,
-      H5Location, and H5Object are no longer appropriate after the data member
-      "id" had been moved from IdComponent to the sub-classes in previous
-      releases.
-      
-      <Classname>(const hid_t h5_id);
-      <Classname>(const <Classname>& original);
-      
-      The copy constructors were no-op and removed in 1.8.15.  The other
-      constructors will be removed from 1.10 release, and then from 1.8.17
-      if their removal does not cause any problems.
-
-      (BMR, 2015-04-06)
-
-
-    High-Level APIs:
-    ------
-    - Suppress Warnings from Flex/Bison-generated Code
-
-      Warning suppression #pragmas, etc. have been added to H5LTparse.c and
-      H5LTanalyze.c. We have no control over this code since it's created by
-      a generator.
-
-      (DER - 2015/03/08 - HDFFV-9149)
-
-    - Changed hdf5_hl.h to Include the HDF5 Main Library "hdf5.h"
-
-      User's no longer need to include both hdf5_hl.h and hdf5.h
-
-      (MSB - 2015/2/14, HDFFV-8685)
-
-   
-    - H5PTcreate_fl Does Not Convert to Memory Datatype
-
-      H5PTcreate_fl now converts to the table's native memory datatype 
-      to fix the problem of handling BE and LE packet tables.
-
-      (MSB - 2015/2/26 - HDFFV-9042)
-
-    - Fix for H5LT Attribute Functions
-      
-      H5LT attribute functions fail to create attributes whose name 
-      is a substring of an existing attribute.
-
-      H5LT attribute functions can now create attributes whose name 
-      is a substring of an existing attribute.
-
-      (MSB - 2015/2/24, HDFFV-9132)
-    
-
-    Fortran High-Level APIs:
-    ------------------------
-
-    - Internal Library Fix for Missing Argument Declaration
-    
-      In Interface block for h5tbmake_table_c, "max_char_size_field_names" 
-      is listed as an input, but in the argument definitions it is 
-      "INTEGER :: max_char_size". This caused no known problems with the 
-      Fortran HL API.
-
-      Fixed missing argument definition.
-       
-      (MSB - 2015/2/18, HDFFV-8559)
-      
-
-    Testing
-    -------
-    - None
-
-
-Supported Platforms
-===================
-The following platforms are supported and have been tested for this release.
-They are built with the configure process unless specified otherwise.
-
-    AIX 6.1                       xlc/xlc_r 10.1.0.5
-    (NASA G-ADA)                  xlC/xlC_r 10.1.0.5
-                                  xlf90/xlf90_r 12.1.0.6
-
-    Linux 2.6.18-308.13.1.el5PAE  GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP i686 i686 i386         compilers for 32-bit applications;
-    (jam)                             Version 4.1.2 20080704 (Red Hat 4.1.2-55)
-                                      Version 4.8.4, 4.9.2
-                                  PGI C, Fortran, C++ Compilers for 32-bit
-                                  applications;
-                                      Version 14.10-0
-                                  Intel(R) C, C++, Fortran Compiler for 32-bit
-                                  applications;
-                                      Version 15.0.1.133 (Build 20141023)
-
-    Linux 2.6.18-371.6.1.el5      GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP x86_64 GNU/Linux       compilers for 64-bit applications;
-    (koala)                           Version 4.1.2 20080704 (Red Hat 4.1.2-55)
-                                      Version 4.8.4, 4.9.2
-                                  Intel(R) C, C++, Fortran Compilers for 
-                                  applications running on Intel(R) 64; 
-                                      Version 15.0.1.133 Build 20141023
-
-    Linux 2.6.32-431.11.2.el6     GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP x86_64 GNU/Linux       compilers:
-    (platypus)                       Version 4.4.7 20120313
-                                     Version 4.8.2, Version 4.9.2
-                                  PGI C, Fortran, C++ for 64-bit target on 
-                                  x86-64;
-                                      Version 14.10-0 
-                                  Intel(R) C (icc), C++ (icpc), Fortran (icc)
-                                  compilers:
-                                     Version 15.0.1.133 Build 20141023
-
-    Linux 3.10.0-123.20.1.el7     GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP x86_64 GNU/Linux       compilers:
-    (moohan)                         Version 4.8.2 20140120 (Red Hat 4.8.2-16)
-                                  Intel(R) C Intel(R) 64 Compiler XE for
-                                  applications running on Intel(R) 64, 
-                                     Version 15.0.1.133 Build 20141023
-
-    Linux 2.6.32-431.29.2.el6.ppc64 gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)
-    #1 SMP ppc64 GNU/Linux        g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)
-    (ostrich)                     GNU Fortran (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)
-                                  IBM XL C/C++ V13.1
-                                  IBM XL Fortran V15.1
-
-    SunOS 5.11 32- and 64-bit     Sun C 5.12 SunOS_sparc
-    (emu)                         Sun Fortran 95 8.6 SunOS_sparc
-                                  Sun C++ 5.12 SunOS_sparc
-
-    Windows 7                     Visual Studio 2008  (cmake)
-                                  Visual Studio 2010 w/ Intel Fortran 14 (cmake)
-                                  Visual Studio 2012 w/ Intel Fortran 15 (cmake)
-                                  Visual Studio 2013 w/ Intel Fortran 15 (cmake)
-                                  Cygwin(CYGWIN_NT-6.1 1.7.34(0.285/5/3) gcc(4.9.2) compiler and gfortran)
-                                  (cmake and autotools)
-
-    Windows 7 x64                 Visual Studio 2008  (cmake)
-                                  Visual Studio 2010 w/ Intel Fortran 14 (cmake)
-                                  Visual Studio 2012 w/ Intel Fortran 15 (cmake)
-                                  Visual Studio 2013 w/ Intel Fortran 15 (cmake)
-                                  
-    Windows 8.1                   Visual Studio 2012 w/ Intel Fortran 15 (cmake)
-                                  Visual Studio 2013 w/ Intel Fortran 15 (cmake)
-
-    Windows 8.1 x64               Visual Studio 2012 w/ Intel Fortran 15 (cmake)
-                                  Visual Studio 2013 w/ Intel Fortran 15 (cmake)
-
-    Mac OS X Mt. Lion 10.8.5      Apple clang/clang++ version 5.1 from Xcode 5.1
-    64-bit    			  gfortran GNU Fortran (GCC) 4.8.2
-    (swallow/kite)                Intel icc/icpc/ifort version 14.0.2
-
-    Mac OS X Mavericks 10.9.5     Apple clang/clang++ version 6.0 from Xcode 6.1.1
-    64-bit    			  gfortran GNU Fortran (GCC) 4.8.2
-    (wren/quail)                  Intel icc/icpc/ifort version 14.0.2
-
-    Mac OS X Yosemite 10.10.2     Apple clang/clang++ version 6.0 from Xcode 6.1.1
-    64-bit    			  gfortran GNU Fortran (GCC) 4.9.2
-    (osx1010dev/osx1010test)      Intel icc/icpc/ifort version 15.0.1
-
-
-Tested Configuration Features Summary
-=====================================
-
-    In the tables below
-          y   = tested 
-          n   = not tested in this release
-          C   = Cluster
-          W   = Workstation
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                              C         F90/   F90      C++  zlib  SZIP
-                                      parallel  F2003  parallel
-SunOS 5.11 32-bit                       n        y/y    n        y    y     y
-SunOS 5.11 64-bit                       n        y/y    n        y    y     y
-Windows 7                               y        y/y    n        y    y     y
-Windows 7 x64                           y        y/y    n        y    y     y
-Windows 7 Cygwin                        n        y/y    n        y    y     n 
-Windows 8.1                             n        y/y    n        y    y     y
-Windows 8.1 x64                         n        y/y    n        y    y     y
-Mac OS X Mountain Lion 10.8.5 64-bit    n        y/y    n        y    y     y
-Mac OS X Mavericks 10.9.5 64-bit        n        y/y    n        y    y     y
-Mac OS X Yosemeti 10.10.2 64-bit        n        y/y    n        y    y     y
-AIX 6.1 32- and 64-bit                  n        y/n    n        y    y     y
-CentOS 5.9 Linux 2.6.18-308 i686 GNU    y        y/y    y        y    y     y
-CentOS 5.9 Linux 2.6.18-308 i686 Intel  n        y/y    n        y    y     y
-CentOS 5.9 Linux 2.6.18-308 i686 PGI    n        y/y    n        y    y     y
-CentOS 5.9 Linux 2.6.18 x86_64 GNU      n        y/y    n        y    y     y
-CentOS 5.9 Linux 2.6.18 x86_64 Intel    n        y/y    n        y    y     y
-CentOS 6.4 Linux 2.6.32 x86_64 GNU      y        y/y    y        y    y     y
-CentOS 6.4 Linux 2.6.32 x86_64 Intel    n        y/y    n        y    y     y
-CentOS 6.4 Linux 2.6.32 x86_64 PGI      n        y/y    n        y    y     y
-CentOS 7.0 Linux 3.10.0 x86_64 GNU      y        y/y    y        y    y     y
-CentOS 7.0 Linux 3.10.0 x86_64 Intel    n        y/y    n        y    y     y
-Linux 2.6.32-431.11.2.el6.ppc64         n        y/n    n        y    y     y
-
-Platform                                 Shared  Shared    Shared    Thread-  
-                                         C libs  F90 libs  C++ libs  safe     
-SunOS 5.11 32-bit                          y       y         y         y        
-SunOS 5.11 64-bit                          y       y         y         y        
-Windows 7                                  y       y         y         y
-Windows 7 x64                              y       y         y         y
-Windows 7 Cygwin                           n       n         n         y
-Windows 8.1                                y       y         y         y
-Windows 8.1 x64                            y       y         y         y
-Mac OS X Mountain Lion 10.8.5 64-bit       y       n         y         y        
-Mac OS X Mavericks 10.9.5 64-bit           y       n         y         y
-Mac OS X Yosemeti 10.10.2 64-bit           y       n         y         y
-AIX 6.1 32- and 64-bit                     y       n         n         y        
-CentOS 5.9 Linux 2.6.18-308 i686 GNU       y       y         y         y        
-CentOS 5.9 Linux 2.6.18-308 i686 Intel     y       y         y         n        
-CentOS 5.9 Linux 2.6.18-308 i686 PGI       y       y         y         n        
-CentOS 5.9 Linux 2.6.18 x86_64 GNU         y       y         y         y        
-CentOS 5.9 Linux 2.6.18 x86_64 Intel       y       y         y         n        
-CentOS 6.4 Linux 2.6.32 x86_64 GNU         y       y         y         n
-CentOS 6.4 Linux 2.6.32 x86_64 Intel       y       y         y         n
-CentOS 6.4 Linux 2.6.32 x86_64 PGI         y       y         y         n     
-CentOS 7.0 Linux 3.10.0 x86_64 GNU         y       y         y         n
-CentOS 7.0 Linux 3.10.0 x86_64 Intel       y       y         y         n
-Linux 2.6.32-431.11.2.el6.ppc64            y       y         y         n 
-
-Compiler versions for each platform are listed in the preceding
-"Supported Platforms" table.
-
-
-More Tested Platforms
-=====================
-The following platforms are not supported but have been tested for this release.
-
-    Linux 2.6.18-308.13.1.el5PAE  MPICH mpich 3.1.3 compiled with
-    #1 SMP i686 i686 i386             gcc 4.9.2 and gfortran 4.9.2
-    (jam)                         g95 (GCC 4.0.3 (g95 0.94!)
-
-    Linux 2.6.18-431.11.2.el6     MPICH mpich 3.1.3 compiled with
-    #1 SMP x86_64 GNU/Linux           gcc 4.9.2 and gfortran 4.9.2
-    (platypus)                    g95 (GCC 4.0.3 (g95 0.94!)   
-
-    FreeBSD 8.2-STABLE i386       gcc 4.5.4 [FreeBSD] 20110526
-    (loyalty)                     gcc 4.6.1 20110527
-                                  g++ 4.6.1 20110527
-                                  gfortran 4.6.1 20110527
-
-    FreeBSD 8.2-STABLE amd64      gcc 4.5.4 [FreeBSD] 20110526
-    (freedom)                     gcc 4.6.1 20110527
-                                  g++ 4.6.1 20110527
-                                  gfortran 4.6.1 20110527
-
-    Debian7.5.0 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64 GNU/Linux
-                                  gcc (Debian 4.7.2-5) 4.7.2
-                                  GNU Fortran (Debian 4.7.2-5) 4.7.2
-                                  (cmake and autotools)
-
-    Fedora20 3.15.3-200.fc20.x86_64 #1 SMP x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (GCC) 4.8.3 20140624 (Red Hat 4.8.3-1)
-                                  GNU Fortran (GCC) 4.8.3 20140624 (Red Hat 4.8.3-1)
-                                  (cmake and autotools)
-
-    SUSE 13.1 3.11.10-17-desktop #1 SMP PREEMPT x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (SUSE Linux) 4.8.1
-                                  GNU Fortran (SUSE Linux) 4.8.1
-                                  (cmake and autotools)
-
-    Ubuntu 14.04 3.13.0-35-generic #62-Ubuntu SMP x86_64 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.9.1-0ubuntu1) 4.9.1
-                                  GNU Fortran (Ubuntu/Linaro 4.9.1-0ubuntu1) 4.9.1
-                                  (cmake and autotools)
-    
-    hopper.nersc.gov              PrgEnv-gnu/5.2.40
-                                  gcc (GCC) 4.9.2 20141030 (Cray Inc.)
-                                  GNU Fortran (GCC) 4.9.2 20141030 (Cray Inc.)
-                                  g++ (GCC) 4.9.2 20141030 (Cray Inc.)
-
-
-Known Problems
-==============
-* On Windows platforms in debug configurations, the VFD flush1 tests will fail
-  with the split and multi VFD drivers. These tests will display a modal debug 
-  dialog which must be answered or wait for the test timeout to expire.
-  (ADB - 2014/06/23 - HDFFV-8851)
-
-* CLANG compiler with the options -fcatch-undefined-behavior and -ftrapv
-  catches some undefined behavior in the alignment algorithm of the macro DETECT_I
-  in H5detect.c (Issue 8147).  Since the algorithm is trying to detect the alignment
-  of integers, ideally the flag -fcatch-undefined-behavior shouldn't to be used for
-  H5detect.c. In the future, we can separate flags for H5detect.c from the rest of
-  the library. (SLU - 2013/10/16)
-
-* Make provided by Solaris fails in "make check". Solaris users should use
-  gmake to build and install the HDF5 software. (AKC - 2013/10/08 - HDFFV-8534)
-
-* The C++ and FORTRAN bindings are not currently working on FreeBSD with the
-  native release 8.2 compilers (4.2.1), but are working with gcc 4.6 from the
-  ports (and probably gcc releases after that).
-  (QAK - 2012/10/19)
-
-* The following h5dump test case fails in BG/P machines (and potentially other
-  machines that use a command script to launch executables):
-
-   h5dump --no-compact-subset -d "AHFINDERDIRECT::ah_centroid_t[0] it=0 tl=0"
-     tno-subset.h5
-  
-  This is due to the embedded spaces in the dataset name being interpreted
-  by the command script launcher as meta-characters, thus passing three
-  arguments to h5dump's -d flag. The command passes if run by hand, just
-  not via the test script.
-  (AKC - 2012/05/03)
-
-* The STDIO VFD does not work on some architectures, possibly due to 32/64
-  bit or large file issues.  The basic STDIO VFD test is known to fail on
-  64-bit SunOS 5.10 on SPARC when built with -m64 and 32-bit OS X/Darwin
-  10.7.0.  The STDIO VFD test has been disabled while we investigate and
-  a fix should appear in a future release.
-  (DER - 2011/10/14 - HDFFV-8235)
-
-* h5diff can report inconsistent results when comparing datasets of enum type
-  that contain invalid values.  This is due to how enum types are handled in
-  the library and will be addressed in a future release.
-  (DER - 2011/10/14 - HDFFV-7527)
-
-* The links test can fail under the stdio VFD due to some issues with external
-  links.  This will be investigated and fixed in a future release.
-  (DER - 2011/10/14 - HDFFV-7768)
-
-* After the shared library support was fixed for some bugs, it was discovered
-  that "make prefix=XXX install" no longer works for shared libraries. It
-  still works correctly for static libraries. Therefore, if you want to
-  install the HDF5 shared libraries in a location such as /usr/local/hdf5,
-  you need to specify the location via the --prefix option during configure 
-  time. E.g, ./configure --prefix=/usr/local/hdf5 ...
-  (AKC - 2011/05/07 - HDFFV-7583)
-
-* The parallel test, t_shapesame, in testpar/, may run for a long time and may
-  be terminated by the alarm signal.  If that happens, one can increase the
-  alarm seconds (default is 1200 seconds = 20 minutes) by setting the
-  environment variable, $HDF5_ALARM_SECONDS, to a larger value such as 3600
-  (60 minutes).  Note that the t_shapesame test may fail in some systems 
-  (see the "While working on the 1.8.6 release..." problem below).  If 
-  it does, it will waste more time if $HDF5_ALARM_SECONDS is set
-  to a larger value.
-  (AKC - 2011/05/07)
-
-* Shared Fortran libraries are not quite working on AIX. While they are
-  generated when --enable-shared is specified, the fortran and hl/fortran
-  tests fail. the issue. HL and C++ shared libraries should now be 
-  working as intended, however.
-  (MAM - 2011/04/20)
-
-* While working on the 1.8.6 release of HDF5, a bug was discovered that can
-  occur when reading from a dataset in parallel shortly after it has been
-  written to collectively. The issue was exposed by a new test in the parallel
-  HDF5 test suite, but had existed before that. We believe the problem lies with
-  certain MPI implementations and/or file systems.
-
-  We have provided a pure MPI test program, as well as a standalone HDF5
-  program, that can be used to determine if this is an issue on your system.
-  They should be run across multiple nodes with a varying number of processes.
-  These programs can be found at:
-  http://www.hdfgroup.org/ftp/HDF5/examples/known_problems/
-  (NAF - 2011/01/19)
-
-* All the VFL drivers aren't backward compatible.  In H5FDpublic.h, the
-  structure H5FD_class_t changed in 1.8.  There is new parameter added to
-  get_eoa and set_eoa callback functions.  A new callback function
-  get_type_map was added in.  The public function H5FDrealloc was taken
-  out in 1.8.  The problem only happens when users define their own driver
-  for 1.6 and try to plug in 1.8 library.  Because there's only one user 
-  complaining about it, we (Elena, Quincey, and I) decided to leave it as 
-  it is (see bug report #1279).  Quincey will make a plan for 1.10.
-  (SLU - 2010/02/02)
-
-* The --enable-static-exec configure flag will only statically link libraries
-  if the static version of that library is present. If only the shared version
-  of a library exists (i.e., most system libraries on Solaris, AIX, and Mac,
-  for example, only have shared versions), the flag should still result in a 
-  successful compilation, but note that the installed executables will not be 
-  fully static. Thus, the only guarantee on these systems is that the 
-  executable is statically linked with just the HDF5 library.
-  (MAM - 2009/11/04)
-  
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  (SLU - 2005/06/30)
-
-
-%%%%1.8.14%%%%   
-
-
-HDF5 version 1.8.14 released on 2014-11-12
-================================================================================
-
-INTRODUCTION
-============
-
-This document describes the differences between HDF5-1.8.13 and 
-HDF5-1.8.14, and contains information on the platforms tested and 
-known problems in HDF5-1.8.14. 
-
-All new and modified APIs are listed in the "HDF5 Software Changes 
-from Release to Release" document along with details about previous
-releases at:
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-
-Links to the HDF5 1.8.14 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
-
-     http://www.hdfgroup.org/products/hdf5/
-
-The HDF5 1.8.14 release can be obtained from:
-
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
-
-User documentation for 1.8.14 can be accessed directly at this location: 
-
-     http://www.hdfgroup.org/HDF5/doc/
-
-If you have any questions or comments, please send them to the HDF Help Desk:
-
-     help at hdfgroup.org
-
-
-CONTENTS
-========
-
-- New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.13
-- Supported Platforms
-- Supported Configuration Features Summary
-- More Tested Platforms
-- Known Problems
-
-
-New Features
-============
-
-    Configuration
-    -------------
-    - bin/cmakehdf5 configures, builds and installs C, C++, Fortran and High
-      level API's. (It used to build the C API only).
-      (AKC 2014/10/17 HDFFV-8932).
-    
-    Library
-    -------
-    - None
-
-    Parallel Library
-    ----------------
-     - Chunk Fill Writes Changed to Collective
-    
-      Slow performance in chunk fill writes. Chunk fills 
-      in the past were written independently by rank 0 one block 
-      at a time. 
-      
-      Optimized the chunk fill write algorithm so that all 
-      chunk fill values will be written collectively in a single MPI-IO 
-      call. This should show a great performance improvement when 
-      creating chunked datasets in parallel when the chunk dimensions 
-      are fairly small.
-      
-      (MSC - 2014/08/22, HDFFV-8878)
-
-    Tools
-    -----
-    - None
-
-    High-level APIs
-    ---------------
-    - None
-
-    Fortran API
-    -----------
-    - None
-
-    C++ API
-    -------
-    - Initialization of Object IDs
-
-      The data member "id" in classes that represent HDF5 objects were
-      initialized to 0, which caused problem for some users.
-
-      Replaced 0 with H5I_INVALID_HID to initialize these "id"s.  For the 
-      PropList class, H5P_DEFAULT is used instead of H5I_INVALID_HID.
-
-      (BMR - 2014/09/30, HDFFV-4259)
-
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-    - None                                  
-
-Bug Fixes since HDF5-1.8.13
-===========================
-
-    Configuration
-    -------------
-    - CMake and SVN URLs
-    
-      The SVN URLs will be different when the HDF Group domain name changes.
-    
-      Removed the SVN URL references in the cacheinit.cmake and release_docs files.
-      
-      (ADB - 2014/10/27, HDFFV-8953)
-
-    - CMake Packaging
-    
-      A Fortran module was not generated if the compiler was not F2003
-      compliant.
-    
-      Removed the module name from the package list of Fortran modules because
-      that module was never generated. This was only an issue for Fortran
-      compliers that are not F2003 compatible.
-      
-      (ADB - 2014/10/16, HDFFV-8932)
-
-    - Shared Library Interface Version Number (soname)
-      
-      In order to increase the maintainability of HDF5, an architectural
-      change was made which required the renaming of several public symbols in
-      H5Ppublic.h.
-
-      The shared libary interface version number ("soname") has been increased
-      on account of these changes. For a full list of the changed symbols, see
-      the interface compatibility report, which is available as a link off of
-      the 'HDF5 Software Changes from Release to Release' document:
-
-          http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-      
-      (AKC - 2014/10/03, HDFFV-8937)
-
-    - Configure Settings for Mac OSX Need Defaults for PROD_XXX, DEBUG_XXX, 
-      and PROFILE_XXX
-      
-      The configure setting files for Mac OSX (config/apple) did not 
-      have the default settings of PROD_XXX, DEBUG_XXX, PROFILE_XXX. 
-      
-      Added the default settings. Mac platforms now builds library with 
-      "-O3" optimization when the default clang compiler is used. 
-      
-      (AKC - 2014/10/01, HDFFV-8933)
-
-    - CMake ConfigureChecks
-    
-      Two include files were missing from two C tests.
-    
-      Propagated the configure test changes to H5_LDOUBLE_TO_INTEGER_WORKS_TEST
-      and H5_ULLONG_TO_LDOUBLE_PRECISION_TEST to ConfigureChecks.cmake (added
-      stdlib.h and string.h in the HDFTests.c file).
-      
-      (ADB - 2014/09/02 HDFFV-8845)
-      
-    - CMake Parallel Test Missing
-    
-      The source file was removed in the previous release but the parallel 
-      test t_posix_compliant was not.
-    
-      Removed the t_posix_compliant parallel test from the library. 
-      
-      (ADB - 2014/8/14 HDFFV-8880)
-
-    - Autotools Reconfigure. Bison. Flex.
-    
-      The Bison and Flex files were out of date. 
-    
-      Bison was upgraded to 2.7, and Flex was upgraded to 2.5.37. The 
-      bin/reconfigure script now will execute Bison and Flex and update 
-      the hl/src files. 
-      
-      (ADB - 2014/06/16 HDFFV-8709)
-
-    - Autotools Reconfigure. m4.
-
-      The m4 macro processor was out of date.
-      
-      Reconfigured Autotools with m4 upgraded to 1.4.17. 
-    
-      (ADB - 2014/06/12 HDFFV-8743)
-    
-    - Autotools: Modified configure to add an entry at the beginning of AM_LDFLAGS 
-      for the hdf5 install directory.  Without this entry the relink commands 
-      invoked by "make install" to create libraries dependent on libhdf5.so added 
-      a dependency on the first libhdf5.so found in any directory in AM_LDFLAGS 
-      regardless of its version.  (LRK - 2014/10/17 HDFFV-8944)
-
-    - Changed Autotools Build Behavior. Fortran High-level Library.
-
-      The Fortran high-level (HL) library did not compile if the default 
-      size of a REAL is DOUBLE PRECISION; the build would fail during 
-      compilation.
-
-      Configure now checks to see if REAL is DOUBLE PRECISION, Fortran is 
-      enabled, and HL library is enabled. If this is true, then configure 
-      will stop with an error message.
-
-      (MSB - 2014/8/11, HDFFV-8883/HDFFV-889)
-
-
-
-    Library
-    -------
-    - Fixed Identifier Management Code
-      
-      Opening an object returns an identifier; closing the object should 
-      free up the identifier. A problem was found where the identifiers 
-      were not being freed up correctly.
-      
-      Fixed the problem so that identifiers that have been used can be 
-      used again after their object has been closed.
-      
-      (QAK - 2014/10/16, HDFFV-8930)
-
-    - Removal of DllMain() from Static Windows Builds 
-
-      A DllMain() function was added in HDF5 1.8.13 in order to handle 
-      win32 thread cleanup. The preprocessor #ifdefs around the DllMain 
-      function allowed it to be compiled when the static library is built, 
-      which is incorrect behavior that can cause linkage problems in 
-      clients.
-
-      The fix was to change the preprocessor #ifdefs to exclude compiling 
-      DllMain() in static builds. Our DllMain function is now only 
-      compiled when the shared, thread-safe library is built on Windows.
-
-      (DER - 2014/06/13, HDFFV-8837)
-
-    - Enforce Constraint on page_size Parameter in H5Pset_core_write_tracking()
-
-      The reference manual states that the page_size parameter cannot be 
-      zero.
-
-      This change checks the page_size parameter to see it is zero and 
-      returns an error code if it is.
-
-      (DER - 2014/08/11, HDFFV-8891)
-
-    - H5Ldelete_by_idx() fails on non-existent group name.
-      (MSC - 2014/07/31, HDFFV-8888)
-
-    - H5Ldelete_by_idx() Seg Fault on Non-existent Group Name
-      
-      If a non-existent group name was used by H5Ldelete_by_idx(), a 
-      segmentation fault would result. 
-      
-      Bug was fixed.
-      
-      (MSC - 2014/07/31, HDFFV-8888)
-
-    - Bug in Test When Building Parallel HDF5 on PVFS2
-      
-      There was a bug in a test when building Parallel HDF5 on PVFS2.
-      
-      The build now uses MPI_File_get_size() instead of stat().
-      
-      (MSC - 2014/07/14, HDFFV-8856)
-
-    - MPI-IO Driver Tried to Allocate Space for Zero-length Dataset
-      
-      MPI-IO driver tried to allocate space for zero-length dataset
-      and asserts. 
-      
-      Fixed driver and added a regression test.
-      
-      (MSC - 2014/07/03, HDFFV-8761)
-      
-
-    Parallel Library
-    ----------------
-    - None
-
-    Performance
-    -------------
-    - None
-
-    Tools
-    -----
-    - None
-
-    Fortran API
-    -------
-    - SIZEOF Replaced by C_SIZEOF and STORAGE_SIZE. 
-  
-      The intrinsic function SIZEOF is non-standard and should be replaced with a 
-      standard intrinsic function.
-
-      If the F2008 intrinsic C_SIZEOF and STORAGE_SIZE are available, then they will 
-      be used instead of the non-standard SIZEOF intrinsic, even when the SIZEOF 
-      function is available.
-
-      (MSB - 2014/6/16, HDFFV-8653)
-
-    - Non-functional API: h5pget_fill_value_f
- 
-      The Fortran wrapper h5pget_fill_value_f was calling the wrong C API.
-
-      The correct C API, H5Pget_fill_value, is now called by the Fortran 
-      wrapper.
-
-      (MSB - 2014/9/25, HDFFV-8879)
-
-    - Interoperability with C HDF5: H5Literate and h5literate_f
-
-      h5literate_f assumes the return value for the callback function to 
-      be of type int (or int_f in C). However, in the C wrapper the return 
-      value of H5Literate is type herr_t, and this could cause 
-      interoperability issues.
-
-      The callback function should be declared INTEGER(C_INT) for 
-      portability. The tests were updated accordingly.
-
-      (MSB - 2014/9/26, HDFFV-8909)
-
-    - Interoperability with C HDF5: Constant INTEGER Parameters with the 
-      H5FD Interface
-
-      Wrong type cast of constant Fortran INTEGER parameters was used.
-
-      The following parameter constant types were changed from INTEGER to 
-      INTEGER(HID_T) to match the C types: H5FD_CORE, H5FD_FAMILY, H5FD_LOG, 
-      H5FD_MPIO, H5FD_MULTI, H5FD_SEC2, and H5FD_STDIO.
-
-      Other internal 'int' types where changed to 'hid_t'; these are 
-      transparent to the user.
-
-      (MSB - 2014/7/18, HDFFV-8748)
-
-    C++ API
-    ------
-    - Memory Leaks
-
-      There were several potential memory leaks in the library due to
-      dynamically allocated strings not being freed when failure occurs.
-
-      Applied user's patches to remove these potential memory leaks.
-
-      (BMR - 2014/09/30, HDFFV-8928)
-
-    - Disallow H5F_ACC_CREAT
-      
-      H5F_ACC_CREAT was included in the C++ API but the C library does not
-      allow it at this time.
-
-      Removed this flag from the functions in H5File class.
-
-      (BMR - 2014/09/29, HDFFV-8852)
-
-    - Missing Flags in Documentation: H5F_ACC_RDONLY and H5F_ACC_RDWR
-
-      The H5F_ACC_RDONLY and H5F_ACC_RDWR flags were missing from the 
-      documentation of the H5File constructors.
-
-      These two flags are now included in the documentation for opening 
-      files.
-
-      (BMR - 2014/09/29, HDFFV-8852)
-
-    High-level APIs:
-    ------
-    - Seg Faults in H5TBread_field_name and H5TBread_field_name_f
-
-      When H5TBread_field_name or H5TBread_field_name_f were used to read a 
-      field and if the name of the field was wrong, a segmentation fault 
-      would result.
-
-      Both C and Fortran APIs were fixed so they no longer seg fault if 
-      the name of the field is wrong, and both APIs return a negative 
-      value if the name of the field is wrong.
-
-      (MSB - 2014/09/29, HDFFV-8912)
-
-    - Possible Buffer Overflow in High-level (HL) APIs
-
-      Multiple HL APIs (H5DSis_scale is one example) had issues:
-        (1) The datatype from the file was re-used as the memory datatype, 
-            and
-        (2) No effort was made to ensure that strings were actually 
-            null-terminated.
-     
-      All of the HL routines now check for NULL pointers, for null-terminated 
-      strings, and to see if string buffers are short enough not to overflow 
-      the buffer. The minimum length of the buffers is now used in strncmp 
-      to avoid overflow.
-
-      (MSB - 2014/9/29, HDFFV-8670)
-
-    - Behavior Change of H5LTdtype_to_text
-
-      If a user buffer was passed in to H5LTdtype_to_text along with the 
-      length, then the function would not truncate at the end of the 
-      buffer, but would exceed the end of the user buffer.
-
-      H5LTdtype_to_text was changed to truncate the string if the user 
-      buffer is too small.
-
-      (MSB - 2014/9/29, HDFFV-8855)
-
-    Fortran High-level APIs:
-    ------
-     - See entry for HDFFV-8912 above.
-
-    Testing
-    -------
-    - A subtest in parallel h5diff (ph5diff) testing was bypassed for the
-      local Linux 32 machine due to unknown issue in the previous version of
-      Mpich. The failure no long exists in the current Mpich. Therefore the
-      bypass is removed. (AKC - 2014/11/03 HDFFV-8954)
-
-    - Fixed incorrect exit code values (was -1) in testframe which is commonly
-      used by several test programs. (AKC - 2014/07/22 HDFFV-8881)
-
-    - Fixed Incorrect Exit Code Values in Testframe
-      The testframe which is commonly used by several test programs 
-      had some incorrect exit code values.  Fixed the incorrect exit code
-      values.  (AKC - 2014/07/22, HDFFV-8881)
-
-Supported Platforms
-===================
-The following platforms are supported and have been tested for this release.
-They are built with the configure process unless specified otherwise.
-
-    AIX 5.3                       xlc 10.1.0.5
-    (NASA G-ADA)                  xlC 10.1.0.5
-                                  xlf90 12.1.0.6
-
-    Linux 2.6.18-308.13.1.el5PAE  GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP i686 i686 i386         compilers for 32-bit applications;
-    (jam)                             Version 4.1.2 20080704 (Red Hat 4.1.2-54)
-                                      Version 4.8.2
-                                  PGI C, Fortran, C++ Compilers for 32-bit
-                                  applications;
-                                      Version 13.7-0
-                                  Intel(R) C, C++, Fortran Compiler for 32-bit
-                                  applications;
-                                      Version 14.0.2 (Build 20140120)
-
-    Linux 2.6.18-371.6.1.el5      GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP x86_64 GNU/Linux       compilers for 64-bit applications;
-    (koala)                           Version 4.1.2 20080704 (Red Hat 4.1.2-54)
-                                      Version 4.8.2
-                                  Intel(R) C, C++, Fortran Compilers for 
-                                  applications running on Intel(R) 64; 
-                                      Version 14.0.2 (Build 20140120)
-
-    Linux 2.6.32-431.11.2.el6    GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP x86_64 GNU/Linux       compilers:
-    (platypus)                       Version 4.4.7 20120313
-                                     Version 4.8.2
-                                  PGI C, Fortran, C++ for 64-bit target on 
-                                  x86-64;
-                                      Version 13.7-0 
-                                  Intel(R) C (icc), C++ (icpc), Fortran (icc)
-                                  compilers:
-                                     Version 14.0.2 (Build 20140120)
-
-    Linux 2.6.32-431.29.2.el6.ppc64 gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)
-    #1 SMP ppc64 GNU/Linux        g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)
-    (ostrich)                     GNU Fortran (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)
-                                  IBM XL C/C++ V13.1
-                                  IBM XL Fortran V15.1
-
-    SunOS 5.11 32- and 64-bit     Sun C 5.12 SunOS_sparc
-    (emu)                         Sun Fortran 95 8.6 SunOS_sparc
-                                  Sun C++ 5.12 SunOS_sparc
-
-    Windows 7                     Visual Studio 2008  (cmake)
-                                  Visual Studio 2010 w/ Intel Fortran 14 (cmake)
-                                  Visual Studio 2012 w/ Intel Fortran 14 (cmake)
-                                  Visual Studio 2013 w/ Intel Fortran 14 (cmake)
-                                  Cygwin(CYGWIN_NT-6.1 1.7.32(0.274/5/3) gcc(4.8.3) compiler and gfortran)
-                                  (cmake and autotools)
-
-    Windows 7 x64                 Visual Studio 2008  (cmake)
-                                  Visual Studio 2010 w/ Intel Fortran 14 (cmake)
-                                  Visual Studio 2012 w/ Intel Fortran 14 (cmake)
-                                  Visual Studio 2013 w/ Intel Fortran 14 (cmake)
-                                  
-    Windows 8.1                   Visual Studio 2012 w/ Intel Fortran 14 (cmake)
-                                  Visual Studio 2013 w/ Intel Fortran 14 (cmake)
-
-    Windows 8.1 x64               Visual Studio 2012 w/ Intel Fortran 14 (cmake)
-                                  Visual Studio 2013 w/ Intel Fortran 14 (cmake)
-
-    Mac OS X Lion 10.7.5          Apple clang/clang++ version 3.0 from Xcode 4.6.1
-    64-bit                        gfortran GNU Fortran (GCC) 4.8.2
-    (duck)                        Intel icc/icpc/ifort version 13.0.3
-
-    Mac OS X Mt. Lion 10.8.5      Apple clang/clang++ version 5.1 from Xcode 5.1
-    64-bit    			  gfortran GNU Fortran (GCC) 4.8.2
-    (swallow/kite)                Intel icc/icpc/ifort version 14.0.2
-
-    Mac OS X Mavericks 10.9.5     Apple clang/clang++ version 6.0 from Xcode 6.0.1
-    64-bit    			  gfortran GNU Fortran (GCC) 4.8.2
-    (wren)                        Intel icc/icpc/ifort version 14.0.2
-
-
-Tested Configuration Features Summary
-=====================================
-
-    In the tables below
-          y   = tested 
-          n   = not tested in this release
-          C   = Cluster
-          W   = Workstation
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                              C         F90/   F90      C++  zlib  SZIP
-                                      parallel  F2003  parallel
-Solaris2.11 32-bit                      n        y/y    n        y    y     y
-Solaris2.11 64-bit                      n        y/y    n        y    y     y
-Windows 7                               y        y/y    n        y    y     y
-Windows 7 x64                           y        y/y    n        y    y     y
-Windows 7 Cygwin                        n        y/y    n        y    y     n 
-Windows 8.1                             n        y/y    n        y    y     y
-Windows 8.1 x64                         n        y/y    n        y    y     y
-Mac OS X Lion 10.7.5 64-bit             n        y/y    n        y    y     y
-Mac OS X Mountain Lion 10.8.5 64-bit    n        y/y    n        y    y     y
-Mac OS X Mavericks 10.9.5 64-bit        n        y/y    n        y    y     ?
-AIX 5.3 32- and 64-bit                  n        y/n    n        y    y     y
-CentOS 5.9 Linux 2.6.18-308 i686 GNU    y        y/y    y        y    y     y
-CentOS 5.9 Linux 2.6.18-308 i686 Intel  n        y/y    n        y    y     y
-CentOS 5.9 Linux 2.6.18-308 i686 PGI    n        y/y    n        y    y     y
-CentOS 5.9 Linux 2.6.18 x86_64 GNU      n        y/y    n        y    y     y
-CentOS 5.9 Linux 2.6.18 x86_64 Intel    n        y/y    n        y    y     y
-CentOS 6.4 Linux 2.6.32 x86_64 GNU      y        y/y    y        y    y     y
-CentOS 6.4 Linux 2.6.32 x86_64 Intel    n        y/y    n        y    y     y
-CentOS 6.4 Linux 2.6.32 x86_64 PGI      n        y/y    n        y    y     y
-Linux 2.6.32-431.11.2.el6.ppc64         n        y/n    n        y    y     y
-
-Platform                                 Shared  Shared    Shared    Thread-  
-                                         C libs  F90 libs  C++ libs  safe     
-Solaris2.11 32-bit                         y       y         y         y        
-Solaris2.11 64-bit                         y       y         y         y        
-Windows 7                                  y       y         y         y
-Windows 7 x64                              y       y         y         y
-Windows 7 Cygwin                           n       n         n         y
-Windows 8.1                                y       y         y         y
-Windows 8.1 x64                            y       y         y         y
-Mac OS X Lion 10.7.5 64-bit                y       n         y         y        
-Mac OS X Mountain Lion 10.8.5 64-bit       y       n         y         y        
-Mac OS X Mavericks 10.9.5 64-bit           y       n         y         y
-AIX 5.3 32- and 64-bit                     y       n         n         y        
-CentOS 5.9 Linux 2.6.18-308 i686 GNU       y       y         y         y        
-CentOS 5.9 Linux 2.6.18-308 i686 Intel     y       y         y         n        
-CentOS 5.9 Linux 2.6.18-308 i686 PGI       y       y         y         n        
-CentOS 5.9 Linux 2.6.18 x86_64 GNU         y       y         y         y        
-CentOS 5.9 Linux 2.6.18 x86_64 Intel       y       y         y         n        
-CentOS 6.4 Linux 2.6.32 x86_64 GNU         y       y         y         n
-CentOS 6.4 Linux 2.6.32 x86_64 Intel       y       y         y         n
-CentOS 6.4 Linux 2.6.32 x86_64 PGI         y       y         y         n     
-Linux 2.6.32-431.11.2.el6.ppc64            y       y         y         n 
-
-Compiler versions for each platform are listed in the preceding
-"Supported Platforms" table.
-
-
-More Tested Platforms
-=====================
-The following platforms are not supported but have been tested for this release.
-
-    Linux 2.6.18-308.13.1.el5PAE  MPICH mpich 3.1.2 compiled with
-    #1 SMP i686 i686 i386             gcc 4.9.1 and gfortran 4.9.1
-    (jam)                         g95 (GCC 4.0.3 (g95 0.94!)
-
-    Linux 2.6.18-431.11.2.el6     MPICH mpich 3.1.2 compiled with
-    #1 SMP x86_64 GNU/Linux           gcc 4.9.1 and gfortran 4.9.1
-    (platypus)                    g95 (GCC 4.0.3 (g95 0.94!)   
-
-    FreeBSD 8.2-STABLE i386       gcc 4.5.4 [FreeBSD] 20110526
-    (loyalty)                     gcc 4.6.1 20110527
-                                  g++ 4.6.1 20110527
-                                  gfortran 4.6.1 20110527
-
-    FreeBSD 8.2-STABLE amd64      gcc 4.5.4 [FreeBSD] 20110526
-    (freedom)                     gcc 4.6.1 20110527
-                                  g++ 4.6.1 20110527
-                                  gfortran 4.6.1 20110527
-
-    Debian7.5.0 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64 GNU/Linux
-                                  gcc (Debian 4.7.2-5) 4.7.2
-                                  GNU Fortran (Debian 4.7.2-5) 4.7.2
-                                  (cmake and autotools)
-
-    Fedora20 3.15.3-200.fc20.x86_64 #1 SMP x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (GCC) 4.8.3 20140624 (Red Hat 4.8.3-1)
-                                  GNU Fortran (GCC) 4.8.3 20140624 (Red Hat 4.8.3-1)
-                                  (cmake and autotools)
-
-    SUSE 13.1 3.11.10-17-desktop #1 SMP PREEMPT x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (SUSE Linux) 4.8.1
-                                  GNU Fortran (SUSE Linux) 4.8.1
-                                  (cmake and autotools)
-
-    Ubuntu 14.04 3.13.0-35-generic #62-Ubuntu SMP x86_64 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.9.1-0ubuntu1) 4.9.1
-                                  GNU Fortran (Ubuntu/Linaro 4.9.1-0ubuntu1) 4.9.1
-                                  (cmake and autotools)
-    
-    Cray Linux Environment (CLE)  PrgEnv-pgi/4.2.34
-    hopper.nersc.gov              pgcc 13.6-0 64-bit target on x86-64 Linux -tp istanbul
-                                  pgf90 13.6-0 64-bit target on x86-64 Linux -tp istanbul
-                                  pgCC 13.6-0 64-bit target on x86-64 Linux -tp istanbul
-
-
-Known Problems
-==============
-* On cygwin platforms the feature to load dynamic filter libraries only looks
-  for libraries with the a so extension. Support for cygwin cygxxx.dll libraries
-  is planned for the next release.
-  (ADB - 2014/11/04 - HDFFV-8736)
-
-* On windows platforms in debug configurations, the VFD flush1 tests will fail
-  with the split and multi VFD drivers. These tests will display a modal debug 
-  dialog which must be answered or wait for the test timeout to expire.
-  The flush1 and flush2 tests will be skipped under debug for this release.
-  (ADB - 2014/06/23 - HDFFV-8851)
-
-* CLANG compiler with the options -fcatch-undefined-behavior and -ftrapv
-  catches some undefined behavior in the alignment algorithm of the macro DETECT_I
-  in H5detect.c (Issue 8147).  Since the algorithm is trying to detect the alignment
-  of integers, ideally the flag -fcatch-undefined-behavior shouldn't to be used for
-  H5detect.c. In the future, we can separate flags for H5detect.c from the rest of
-  the library. (SLU - 2013/10/16)
-
-* Make provided by Solaris fails in "make check". Solaris users should use
-  gmake to build and install the HDF5 software. (AKC - 2013/10/08 - HDFFV-8534)
-
-* The h5dump and h5diff utilities occasionally produce different output
-  between Linux and Windows systems. This is caused by lower-level library
-  routines that fail to write fill values to the user's buffer when reading
-  unallocated chunks from datasets that have a fill value set to
-  H5D_FILL_VALUE_DEFAULT. Due to platform differences the return of
-  spurious data values has only been encountered on Windows 32-bit systems.
-  (Issue HDFFV-8247; JP - 2013/03/27)
-
-* The C++ and FORTRAN bindings are not currently working on FreeBSD with the
-  native release 8.2 compilers (4.2.1), but are working with gcc 4.6 from the
-  ports (and probably gcc releases after that).
-  (QAK - 2012/10/19)
-
-* The STDIO VFD does not work on some architectures, possibly due to 32/64
-  bit or large file issues.  The basic STDIO VFD test is known to fail on
-  64-bit SunOS 5.10 on SPARC when built with -m64 and 32-bit OS X/Darwin
-  10.7.0.  The STDIO VFD test has been disabled while we investigate and
-  a fix should appear in a future release.
-  (DER - 2011/10/14 - HDFFV-8235)
-
-* h5diff can report inconsistent results when comparing datasets of enum type
-  that contain invalid values.  This is due to how enum types are handled in
-  the library and will be addressed in a future release.
-  (DER - 2011/10/14 - HDFFV-7527)
-
-* The links test can fail under the stdio VFD due to some issues with external
-  links.  This will be investigated and fixed in a future release.
-  (DER - 2011/10/14 - HDFFV-7768)
-
-* After the shared library support was fixed for some bugs, it was discovered
-  that "make prefix=XXX install" no longer works for shared libraries. It
-  still works correctly for static libraries. Therefore, if you want to
-  install the HDF5 shared libraries in a location such as /usr/local/hdf5,
-  you need to specify the location via the --prefix option during configure 
-  time. E.g, ./configure --prefix=/usr/local/hdf5 ...
-  (AKC - 2011/05/07 - HDFFV-7583)
-
-* The parallel test, t_shapesame, in testpar/, may run for a long time and may
-  be terminated by the alarm signal.  If that happens, one can increase the
-  alarm seconds (default is 1200 seconds = 20 minutes) by setting the
-  environment variable, $HDF5_ALARM_SECONDS, to a larger value such as 3600
-  (60 minutes).  Note that the t_shapesame test may fail in some systems 
-  (see the "While working on the 1.8.6 release..." problem below).  If 
-  it does, it will waste more time if $HDF5_ALARM_SECONDS is set
-  to a larger value.
-  (AKC - 2011/05/07)
-
-* Shared Fortran libraries are not quite working on AIX. While they are
-  generated when --enable-shared is specified, the fortran and hl/fortran
-  tests fail. We are looking into the issue. HL and C++ shared libraries
-  should now be working as intended, however.
-  (MAM - 2011/04/20)
-
-* The --with-mpe configure option does not work with Mpich2.
-  (AKC - 2011/03/10)
-
-* While working on the 1.8.6 release of HDF5, a bug was discovered that can
-  occur when reading from a dataset in parallel shortly after it has been
-  written to collectively. The issue was exposed by a new test in the parallel
-  HDF5 test suite, but had existed before that. We believe the problem lies with
-  certain MPI implementations and/or file systems.
-
-  We have provided a pure MPI test program, as well as a standalone HDF5
-  program, that can be used to determine if this is an issue on your system.
-  They should be run across multiple nodes with a varying number of processes.
-  These programs can be found at:
-  http://www.hdfgroup.org/ftp/HDF5/examples/known_problems/
-  (NAF - 2011/01/19)
-
-* All the VFL drivers aren't backward compatible.  In H5FDpublic.h, the
-  structure H5FD_class_t changed in 1.8.  There is new parameter added to
-  get_eoa and set_eoa callback functions.  A new callback function
-  get_type_map was added in.  The public function H5FDrealloc was taken
-  out in 1.8.  The problem only happens when users define their own driver
-  for 1.6 and try to plug in 1.8 library.  Because there's only one user 
-  complaining about it, we (Elena, Quincey, and I) decided to leave it as 
-  it is (see bug report #1279).  Quincey will make a plan for 1.10.
-  (SLU - 2010/02/02)
-
-* The --enable-static-exec configure flag will only statically link libraries
-  if the static version of that library is present. If only the shared version
-  of a library exists (i.e., most system libraries on Solaris, AIX, and Mac,
-  for example, only have shared versions), the flag should still result in a 
-  successful compilation, but note that the installed executables will not be 
-  fully static. Thus, the only guarantee on these systems is that the 
-  executable is statically linked with just the HDF5 library.
-  (MAM - 2009/11/04)
-  
-* Parallel tests failed with 16 processes with data inconsistency at testphdf5
-  / dataset_readAll. Parallel tests also failed with 32 and 64 processes with
-  collective abort of all ranks at t_posix_compliant / allwrite_allread_blocks
-  with MPI IO.
-  (CMC - 2009/04/28)
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  (SLU - 2005/06/30)
-
-
-%%%%1.8.13%%%%   
-
-
-HDF5 version 1.8.13 released on 2014-05-05
-================================================================================
-
-INTRODUCTION
-============
-
-This document describes the differences between HDF5-1.8.12 and 
-HDF5-1.8.13, and contains information on the platforms tested and 
-known problems in HDF5-1.8.13. 
-For more details, see the files HISTORY-1_0-1_8_0_rc3.txt 
-and HISTORY-1_8.txt in the release_docs/ directory of the HDF5 source.
-
-Links to the HDF5 1.8.13 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
-
-     http://www.hdfgroup.org/products/hdf5/
-
-The HDF5 1.8.13 release can be obtained from:
-
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
-
-User documentation for 1.8.13 can be accessed directly at this location: 
-
-     http://www.hdfgroup.org/HDF5/doc/
-
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
-
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.13 (current 
-release) versus Release 1.8.12":
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-
-If you have any questions or comments, please send them to the HDF Help Desk:
-
-     help at hdfgroup.org
-
-
-CONTENTS
-========
-
-- New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.12
-- Supported Platforms
-- Supported Configuration Features Summary
-- More Tested Platforms
-- Known Problems
-
-
-New Features
-============
-
-    Configuration
-    -------------
-    - Autotools: Automake updated to 1.14.1 (ADB - 2014/04/08)
-
-    - CMake: Moved minimum CMake version to 2.8.11 which enables better library
-      include processing. (ADB - 2014/03/26)
-    
-    - When configuring a thread-safe HDF5 Library it is no longer necessary 
-      to specify --enable-threadsafe with --with-pthreads if the Pthreads 
-      library is in a standard location.  (DER - 2014/04/11 HDFFV-8693)
-
-    Library
-    -------
-    - Added an H5free_memory API call. This should be used to free memory 
-      that has been allocated by HDF5 API calls. H5Tget_member_name and 
-      H5Pget_class_name are two examples. The main motivation for this call 
-      is Windows, where it is common for application code and the HDF5 Library 
-      to be using different C run-time libraries (CRT). Using the new call 
-      ensures that the same CRT handles both the allocation and free. This 
-      new function can also be useful in any case where the library uses a 
-      different memory manager than the application, such as when a debug 
-      memory manager is in use or when the HDF5 Library is wrapped for use 
-      in a managed language like Python or Java. Fixes HDFFV-7710, 8519, 
-      and 8851. (DER - 2014/04/11)
-
-    - The Core VFD (aka Memory VFD) can now be configured to track dirty 
-      regions in the file and only write out the changed regions on 
-      flush/close. Additionally, a "page aggregation" size can be set that 
-      will aggregate small writes into larger writes. For example, setting 
-      a 1 MiB page aggregation size will logically partition the the 
-      in-memory file into 1 MiB pages that will be written out in their 
-      entirety if even a single byte is dirtied. The feature is controlled 
-      via the new H5Pset/get_core_write_tracking() API call. A new 
-      "core_paged" target has been added to the check-vfd target in 
-      test/Makefile.am that exercises the feature over all HDF5 VFD-aware
-      tests. (DER - 2014/04/12)
- 
-    Parallel Library
-    ----------------
-    - Removed MPI-POSIX VFD, as it wasn't helping anyone and was just
-      generating support questions. Application developers performing
-      parallel I/O should always use the MPI-IO VFD.
-     (QAK - 2014/03/28 HDFFV-8659)
-
-    - Improved parallel I/O support to allow collective I/O on point
-      selections. (QAK - 2014/03/15)
- 
-    Tools
-    -----
-    - None
-
-    High-Level APIs
-    ---------------
-    - None
-
-    Fortran API
-    -----------
-    - Wrappers h5pset_file_image_f and h5pget_file_image_f were added to the 
-      library. (MSB - 2014/1/2014)
-
-    C++ API
-    -------
-    - The following new features are added:
-      + Wrappers to class H5Object to get an object's name (HDFFV-8548).
-            ssize_t getObjName(char *obj_name, size_t buf_size = 0)
-            ssize_t getObjName(H5std_string& obj_name, size_t len = 0)
-            H5std_string getObjName()
-      + Wrappers to class H5CommonFG to get a child object's type from a
-        group or file (HDFFV-8367).
-            H5O_type_t childObjType(const H5std_string& objname)
-            H5O_type_t childObjType(const char* objname)
-            H5O_type_t childObjType(hsize_t index,
-                H5_index_t index_type=H5_INDEX_NAME,
-                H5_iter_order_t order=H5_ITER_INC, const char* objname=".")
-      + Wrappers to class DSetMemXferPropList for setting/getting a transform 
-        property list (HDFFV-7907).
-            DSetMemXferPropList(const char* expression);
-            void setDataTransform(const char* expression)
-            void setDataTransform(const H5std_string& expression)
-            ssize_t getDataTransform(char* exp, size_t buf_size=0)
-            H5std_string getDataTransform()
-      + Wrapper to CompType for setting size to compound datatype (HDFFV-8642).
-            void setSize(size_t size)
-      + Overloaded functions to provide prototypes that declare constant 
-        arguments const (HDFFV-3384).  These include:
-            DataSet::fillMemBuf
-            DataSet::getVlenBufSize
-            DataSpace::extentCopy
-            DataType::commit
-            FileAccPropList::setSplit
-            H5File::getVFDHandle
-      + Additional overload to class H5Location to get a comment as a char*
-            ssize_t getComment(const char* name, size_t buf_size, char* comment)
-      + Additional overloads to class Attribute to get an attribute's name for
-        convenience:
-            ssize_t getName(char* attr_name, size_t buf_size=0)
-            ssize_t getName(H5std_string& attr_name, size_t buf_size=0)
-            (BMR, 2014/04/15)
-      + A static wrapper to Exception for printing the error stack without an 
-	instance of Exception
-	    static void printErrorStack(FILE* stream = stderr,
-						hid_t err_stack = H5E_DEFAULT);
-	    (BMR, 2014/04/25)
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-    Mac OS X 10.6 Snow Leopard is not supported by Apple any more. In view of
-    the added support of Mac OS X 10.9, Mac OS X 10.6 is retired from HDF5
-    supported platforms. (AKC - 2014/03/14 HDFFV-8704)
-
-    Mac OS X 10.9 Mavericks is supported. (AKC - 2014/03/04 HDFFV-8694)
-                                  
-
-Bug Fixes since HDF5-1.8.12
-===========================
-
-    Configuration
-    -------------
-    - CMake: When CMake commands are executed individually on the command line
-      and the external filters are being built, the CMAKE_BUILD_TYPE define
-      must be set to the same value as the configuration
-      (-DCMAKE_BUILD_TYPE:STRING=Release if using -C Release). This is needed 
-      by the the szip and zlib filter build commands. (ADB - HDFFV-8695)
-
-    - CMake: Removed use of the XLATE_UTILITY program. 
-      (ADB - 2014/03/28 HDFFV-8640)
-
-    - CMake: Added missing quotes in setting the CMAKE_EXE_LINKER_FLAGS for the
-      MPI option. (ADB - 2014/02/27 HDFFV-8674)
-
-    - CMake: Configuration of the HDF5 C++ or Fortran libraries with the 
-      thread-safety feature.
-
-      C++ and/or Fortran + thread-safe is enforced as a non-supported
-      configuration. This matches the autotools. (DER - 2014/04/11)
-
-    - CMake: Configuration of static HDF5 C library with the thread-safety
-      feature. 
-
-      Static + thread-safe + Win32 threads is not a supported configuration
-      due to the inability to automatically clean up thread-local storage. 
-      This is expected to be fixed in a future release. In the meantime, a 
-      work-around that uses internal functionality may allow the combination 
-      to be used without resource leaks. Contact the help desk for more 
-      information. (DER - 2014/04/11)
-
-    - Autotools: Several changes were done to configure and installcheck. 
-
-      An export of LD_LIBRARY_PATH=<szip library location> was
-      removed from configure; make installcheck was revised to run
-      scripts installed in share/hdf5_examples to use the installed h5cc, etc. 
-      to compile and run example source files also installed there. 
-
-      Make installcheck will now fail when a shared szip or other external lib 
-      file cannot be found in the same manner that executables compiled and 
-      linked with h5cc will fail to run when those lib files cannot be found 
-      after install. Make installcheck should pass after setting 
-      LD_LIBRARY_PATH to the szip location. (LRK - 2014/04/16)
-
-    Library
-    -------
-    - A Gnu Make directive (.NOTPARALLEL) is added to fortran/test/Makefile.
-
-      AIX native make does not support this directive and would fail if
-      parallel make (e.g. make -j4) is used to build the library. AIX users
-      either do not use parallel make or install Gnu Make to build the library.
-      (AKC 2014/04/08 HDFFV-8738)
-
-    - H5R.c: H5Rget_name gave an assertion failure if the "name" parameter 
-      was NULL.
-
-      Fixed H5Rget_name to return the size of the buffer needed to read a
-      name of the referenced object in this case. The size doesn't include 
-      the NULL terminator. H5Rget_name returns negative on failure. 
-      (MSB - 2014/01/22 HDFFV-8620)
-
-    - H5Z.c: H5Zfilter_avail didn't check if a filter was available as a
-      dynamically loaded filter. The error manifested itself in the h5repack
-      tool when removing user-defined dynamically loaded filter.
-
-      Added a code to find the filter among the dynamically loaded filters 
-      after the function fails to find it among the registered filters. 
-      (ADB - 2014/03/03 HDFFV-8629)
-
-    - Memory leak: a memory leak was observed in conjunction to the 
-      H5TS_errstk_key_g thread-local variable allocated in the H5E_get_stack 
-      function in H5E.c. 
-
-      The shared HDF5 thread-safe library now no longer leaks thread-local 
-      storage resources on Windows with Win32 threads. Currently, there is 
-      no solution for this problem when HDF5 is statically built. We 
-      disabled the build of the static HDF5 thread-safe library with 
-      Win32 threads. (DER - 2014/04/11 HDFFV-8518)
-
-    - H5Dio.c: Improved handling of NULL pointers to H5Dread/H5Dwrite 
-      calls. Credit to Jason Newton (nevion at gmail.com) for the original patch.
-
-      H5Dwrite/read failed when a NULL pointer was passed for a data buffer 
-      and 0 elements were selected. Fixed. (QAK - 2014/04/16 HDFFV-8705)
-
-    - Deprecated API (1_6 API): Improved handling of closing the library and
-      re-accessing it with a deprecated routine.
-
-      When a program used a deprecated API (for example, H5Gcreate1), 
-      closed the library, and reopened it again to access a group, dataset, 
-      datatype, dataspace, attribute, or property list, HDF5 failed to 
-      provide an identifier for the object. Fixed.
-      (NAF, QAK - 2014/04/16 HDFFV-8232)
-
-    Parallel Library
-    ----------------
-    - Fixed a missing H5F_Provisional module in HDF5mpio.f90 
-      (MSB - 2014/2/7 HDFFV-8651)
-
-    Performance
-    -------------
-    - None
-
-    Tools
-    -----
-    - The h5diff tool would report that a datafile compared with an exact
-      copy of the same datafile had differences. This was due to the issue
-      below of reading un-written chunks. This problem is also fixed.
-      (AKC - 2014/05/01 HDFFV-8637)
-
-    - The h5dump and h5diff utilities occasionally produced different output
-      between Linux and Windows systems. This has been fixed.
- 
-      This happened to datasets that used chunked storage, with default fill 
-      values, and some of the chunks had not been written. 
-      When the dataset was read, the library failed to write the default fill 
-      values to parts of the use buffer that were associated with the unwritten 
-      chunks.  (JP - 2014/05/01 HDFFV-8247)
-
-    - The compress option is retired from bin/release.
-      (AKC - 2014/04/25 HDFFV-8755)
-
-    - bin/release has a new option "zip" that produces a release zip file for
-      the Windows platform. (AKC - 2014/04/24 HDFFV-8433)
-
-    - h5diff: Several failures relating to handling of strings attributes 
-      are fixed. 
-
-      The tool crashed or gave an error message when one of the strings had
-      fixed size type and another variable-length size type. h5diff now flags such
-      strings as "not comparable". We plan to enhance the tool to handle
-      strings of the different types in the future releases.
-      (AKC - 2014/04/18 HDFFV-8625, 8639, 8745)
-
-    - h5repack: h5repack would not remove user-defined filters.
-      Fixed by modifying h5repack to check if the filter is registered or 
-      can be dynamically loaded. (ADB - 2014/03/03 HDFFV-8629)
-
-    F90 API
-    -------
-    - H5D_CHUNK_CACHE_NSLOTS_DFLT_F and H5D_CHUNK_CACHE_NBYTES_DFLT_F were 
-      changed from the default KIND for INTEGER to INTEGER of KIND size_t. 
-      (MSB - 2014/3/31 HDFFV-8689)
-
-    C++ API
-    ------
-    - Added throw() to all exception destructors.  Credit to Jason Newton
-      (nevion at gmail.com) for the patch.  (BMR - 2014/4/15 HDFFV-8623)
-    - Changed the default value for H5Location::getComment from 256 to 0
-      to conform to C function and because it makes more sense.
-      (BMR - 2014/4/15)
-
-    High-Level APIs:
-    ------
-    - None
-
-    Fortran High-Level APIs:
-    ------
-    - None
-
-    Testing
-    -------
-    - testhdf5 now exits with EXIT_SUCCESS(0) if no errors, else 
-      EXIT_FAILURE(1). (AKC - 2014/01/27 HDFFV-8572)
-
-    - The big test now pays attention to the HDF5_DRIVER environment variable.
-      Previously, it would run all tests with the family, stdio, and sec2
-      virtual file drivers (VFDs) for each VFD in the check-vfd make target, 
-      regardless of the variable setting. It now checks the variable and 
-      either runs the appropriate VFD-specific tests or skips as needed. 
-      This saves much testing time. Fixes HDFFV-8554. (DER - 2014/04/11)
-
-Supported Platforms
-===================
-The following platforms are supported and have been tested for this release.
-They are built with the configure process unless specified otherwise.
-
-    AIX 5.3                       xlc 10.1.0.5
-    (NASA G-ADA)                  xlC 10.1.0.5
-                                  xlf90 12.1.0.6
-				  gmake v3.82
-
-    Linux 2.6.18-308.13.1.el5PAE  GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP i686 i686 i386         compilers for 32-bit applications;
-    (jam)                             Version 4.1.2 20080704 (Red Hat 4.1.2-54)
-                                      Version 4.8.2
-                                  PGI C, Fortran, C++ Compilers for 32-bit
-                                  applications;
-                                      Version 13.7-0
-                                  Intel(R) C, C++, Fortran Compiler for 32-bit
-                                  applications;
-                                      Version 14.0.2 (Build 20140120)
-
-    Linux 2.6.18-371.6.1.el5      GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP x86_64 GNU/Linux       compilers for 64-bit applications;
-    (koala)                           Version 4.1.2 20080704 (Red Hat 4.1.2-54)
-                                      Version 4.8.2
-                                  PGI C, Fortran, C++ for 64-bit target on 
-                                  x86-64;
-                                      Version 13.7-0 
-                                  Intel(R) C, C++, Fortran Compilers for 
-                                  applications running on Intel(R) 64; 
-                                      Version 14.0.2 (Build 20140120)
-
-    Linux 2.6.32-431.11.2.el6    GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP x86_64 GNU/Linux       compilers:
-    (platypus)                       Version 4.4.7 20120313
-                                     Version 4.8.2
-                                  PGI C, Fortran, C++ for 64-bit target on 
-                                  x86-64;
-                                      Version 13.7-0 
-                                  Intel(R) C (icc), C++ (icpc), Fortran (icc)
-                                  compilers:
-                                     Version 14.0.2 (Build 20140120)
-
-    Linux 2.6.32-431.11.2.el6.ppc64 gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
-    #1 SMP ppc64 GNU/Linux        g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
-    (ostrich)                     GNU Fortran (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
-                                  IBM XL C/C++ V11.1
-                                  IBM XL Fortran V13.1
-
-    SunOS 5.11 32- and 64-bit     Sun C 5.12 SunOS_sparc
-    (emu)                         Sun Fortran 95 8.6 SunOS_sparc
-                                  Sun C++ 5.12 SunOS_sparc
-
-    Windows 7                     Visual Studio 2008 w/ Intel Fortran 14 (cmake)
-                                  Visual Studio 2010 w/ Intel Fortran 14 (cmake)
-                                  Visual Studio 2012 w/ Intel Fortran 14 (cmake)
-                                  Cygwin(CYGWIN_NT-6.1 1.7.28(0.271/5/3) gcc(4.8.2) compiler and gfortran)
-                                  (cmake and autotools)
-
-    Windows 7 x64                 Visual Studio 2008 w/ Intel Fortran 14 (cmake)
-                                  Visual Studio 2010 w/ Intel Fortran 14 (cmake)
-                                  Visual Studio 2012 w/ Intel Fortran 14 (cmake)
-                                  
-    Windows 8.1                   Visual Studio 2012 w/ Intel Fortran 14 (cmake)
-
-    Windows 8.1 x64               Visual Studio 2012 w/ Intel Fortran 14 (cmake)
-
-    Mac OS X Lion 10.7.3          Apple clang/clang++ version 3.0 from Xcode 4.6.1
-    64-bit                        gfortran GNU Fortran (GCC) 4.6.2
-    (duck)                        Intel icc/icpc/ifort version 13.0.3
-
-    Mac OS X Mt. Lion 10.8.5      Apple clang/clang++ version 5.0 from Xcode 5.0.2
-    64-bit    			  gfortran GNU Fortran (GCC) 4.8.2
-    (swallow/kite)                Intel icc/icpc/ifort version 14.0.2
-
-    Mac OS X Mavericks 10.9.2     Apple clang/clang++ version 5.1 from Xcode 5.1
-    64-bit    			  gfortran GNU Fortran (GCC) 4.8.2
-    (wren/quail)                  Intel icc/icpc/ifort version 14.0.2
-
-
-Tested Configuration Features Summary
-=====================================
-
-    In the tables below
-          y   = tested 
-          n   = not tested in this release
-          C   = Cluster
-          W   = Workstation
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                              C         F90/   F90      C++  zlib  SZIP
-                                      parallel  F2003  parallel
-Solaris2.11 32-bit                      n        y/y    n        y    y     y
-Solaris2.11 64-bit                      n        y/y    n        y    y     y
-Windows 7                               y        y/y    n        y    y     y
-Windows 7 x64                           y        y/y    n        y    y     y
-Windows 7 Cygwin                        n        y/y    n        y    y     y
-Windows 8.1                             n        y/y    n        y    y     y
-Windows 8.1   x64                       n        y/y    n        y    y     y
-Mac OS X Lion 10.7.3 64-bit             n        y/y    n        y    y     y
-Mac OS X Mountain Lion 10.8.1 64-bit    n        y/y    n        y    y     y
-Mac OS X Mavericks 10.9.1 64-bit        n        y/y    n        y    y     y
-AIX 5.3 32- and 64-bit                  n        y/n    n        y    y     y
-CentOS 5.9 Linux 2.6.18-308 i686 GNU    y        y/y    y        y    y     y
-CentOS 5.9 Linux 2.6.18-308 i686 Intel  n        y/y    n        y    y     y
-CentOS 5.9 Linux 2.6.18-308 i686 PGI    n        y/y    n        y    y     y
-CentOS 5.9 Linux 2.6.18 x86_64 GNU      n        y/y    n        y    y     y
-CentOS 5.9 Linux 2.6.18 x86_64 Intel    n        y/y    n        y    y     y
-CentOS 6.4 Linux 2.6.32 x86_64 GNU      y        y/y    y        y    y     y
-CentOS 6.4 Linux 2.6.32 x86_64 Intel    n        y/y    n        y    y     y
-CentOS 6.4 Linux 2.6.32 x86_64 PGI      n        y/y    n        y    y     y
-Linux 2.6.32-431.11.2.el6.ppc64         n        y/n    n        y    y     y
-OpenVMS IA64 V8.4                       n        y/n    n        y    y     n
-
-Platform                                 Shared  Shared    Shared    Thread-  
-                                         C libs  F90 libs  C++ libs  safe     
-Solaris2.11 32-bit                         y       y         y         y        
-Solaris2.11 64-bit                         y       y         y         y        
-Windows 7                                  y       y         y         y
-Windows 7 x64                              y       y         y         y
-Windows 7 Cygwin                           n       n         n         y
-Windows 8.1                                y       y         y         y
-Windows 8.1 x64                            y       y         y         y
-Mac OS X Lion 10.7.3 64-bit                y       n         y         y        
-Mac OS X Mountain Lion 10.8.1 64-bit       y       n         y         y        
-Mac OS X Mavericks 10.9.1 64-bit           y       n         y         y
-AIX 5.3 32- and 64-bit                     y       n         n         y        
-CentOS 5.9 Linux 2.6.18-308 i686 GNU       y       y         y         y        
-CentOS 5.9 Linux 2.6.18-308 i686 Intel     y       y         y         n        
-CentOS 5.9 Linux 2.6.18-308 i686 PGI       y       y         y         n        
-CentOS 5.9 Linux 2.6.18 x86_64 GNU         y       y         y         y        
-CentOS 5.9 Linux 2.6.18 x86_64 Intel       y       y         y         n        
-CentOS 6.4 Linux 2.6.32 x86_64 GNU         y       y         y         n
-CentOS 6.4 Linux 2.6.32 x86_64 Intel       y       y         y         n
-CentOS 6.4 Linux 2.6.32 x86_64 PGI         y       y         y         n     
-Linux 2.6.32-431.11.2.el6.ppc64            y       y         y         n 
-OpenVMS IA64 V8.4                          n       n         n         n
-
-Compiler versions for each platform are listed in the preceding
-"Supported Platforms" table.
-
-
-More Tested Platforms
-=====================
-The following platforms are not supported but have been tested for this release.
-
-    Linux 2.6.18-308.13.1.el5PAE  MPICH mpich 3.1 compiled with
-    #1 SMP i686 i686 i386             gcc 4.8.2 and gfortran 4.8.2
-    (jam)                         g95 (GCC 4.0.3 (g95 0.94!)
-
-    Linux 2.6.18-431.11.2.el6     MPICH mpich 3.1 compiled with
-    #1 SMP x86_64 GNU/Linux           gcc 4.8.2 and gfortran 4.8.2
-    (platypus)                    g95 (GCC 4.0.3 (g95 0.94!)   
-
-    FreeBSD 8.2-STABLE i386       gcc 4.5.4 [FreeBSD] 20110526
-    (loyalty)                     gcc 4.6.1 20110527
-                                  g++ 4.6.1 20110527
-                                  gfortran 4.6.1 20110527
-
-    FreeBSD 8.2-STABLE amd64      gcc 4.5.4 [FreeBSD] 20110526
-    (freedom)                     gcc 4.6.1 20110527
-                                  g++ 4.6.1 20110527
-                                  gfortran 4.6.1 20110527
-
-    Debian7.1.0 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64 GNU/Linux
-                                  gcc (Debian 4.7.2-5) 4.7.2
-                                  GNU Fortran (Debian 4.7.2-5) 4.7.2
-                                  (cmake and autotools)
-
-    Fedora20 3.11.10-301.fc20.x86_64 #1 SMP x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (GCC) 4.8.2 20131212 (Red Hat 4.8.2-7)
-                                  GNU Fortran (GCC) 4.8.2 20130603 (Red Hat 4.8.2-7)
-                                  (cmake and autotools)
-
-    SUSE 13.1 3.11.6-4-desktop #1 SMP PREEMPT x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (SUSE Linux) 4.8.1
-                                  GNU Fortran (SUSE Linux) 4.8.1
-                                  (cmake and autotools)
-
-    Ubuntu 13.10 3.11.0-13-generic #20-Ubuntu SMP x86_64 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.8.1-10ubuntu8) 4.8.1
-                                  GNU Fortran (Ubuntu/Linaro 4.8.1-10ubuntu8) 4.8.1
-                                  (cmake and autotools)
-    
-    Cray Linux Environment (CLE)  PrgEnv-pgi/4.0.46
-    hopper.nersc.gov              pgcc 12.5-0 64-bit target on x86-64 Linux -tp shanghai
-                                  pgf90 12.5-0 64-bit target on x86-64 Linux -tp shanghai
-                                  pgCC 12.5-0 64-bit target on x86-64 Linux -tp shanghai
-
-
-Known Problems
-==============
-* When reading or writing a dataset (H5Dread/H5Dwrite) with a large selection
-  size (e.g., 2GB ~= 500 million of 4 bytes integers or floating point
-  numbers), some I/O systems may not be able to process it correctly.
-  We advise users to find out system limits before using large selections. If
-  I/O size limits exist, application should use HDF5 partial I/O capabilities
-  (e.g., H5Sselect_hyperslab(...)) to divide large requests into smaller sizes.
-  In this case we also advise users not to use chunk storage sizes larger that
-  2GB since the HDF5 library performs I/O on the entire chunk.  We will work
-  on the HDF5 library to divide large data requests to smaller I/O requests.
-  (AKC 2014/05/02 HDFFV-8479)
-
-* Due to an Intel compiler bug introduced in version 14.0.1, the HDF5 FORTRAN
-  wrappers do not work with configure option --enable-fortran2003. 
-  However, the option --enable-fortran works with Intel 14.0.1. The compiler 
-  bug was fixed in Intel version 14.0.2 and resolved the issue. 
-  (MSB - 2014/4/15)
-
-* Due to a PGI compiler bug introduced in versions before 13.3 and versions 
-  after 14.2, the FORTRAN test 'Testing get file image' will fail. 
-  (MSB - 2014/4/15)
-
-* On CYGWIN, when building the library dynamically, testing will fail on 
-  dynamically loaded filters. The test process will build dynamic filter 
-  libraries with the *.dll.a extension, and the HDF5 Library will be looking 
-  for *.so libraries. Entered as issue HDFFV-8736. (ADB - 2014/04/14)
-  
-* A Gnu Make directive (.NOTPARALLEL) is added to fortran/test/Makefile.
-  AIX native make does not support this directive and would fail if
-  parallel make (e.g. make -j4) is used to build the library. AIX users
-  either do not use parallel make or install Gnu Make to build the library.
-  (AKC 2014/04/08 HDFFV-8738)
-
-* CLANG compiler with the options -fcatch-undefined-behavior and -ftrapv
-  catches some undefined behavior in the alignment algorithm of the macro
-  DETECT_I in H5detect.c. Since the algorithm is trying to detect the alignment
-  of integers, ideally the flag -fcatch-undefined-behavior should not to be
-  used for H5detect.c. In the future, we can separate flags for H5detect.c
-  from the rest of the library.  (SLU - 2013/10/16 HDFFV-8147)
-
-* Make provided by Solaris fails in "make check". Solaris users should use
-  gmake to build and install the HDF5 software. (AKC - 2013/10/08 - HDFFV-8534)
-
-* On OpenVMS, two soft conversion functions (H5T__conv_i_f and H5T__conv_f_i)
-  have bugs.  They convert data between floating-point numbers and integers.
-  But the library's default is hard conversion.  The user should avoid
-  explicitly enabling soft conversion between floating-point numbers and
-  integers. (Issue VMS-8; SLU - 2013/09/19)
-
-* On OpenVMS, ZLIB 1.2.8 library doesn't work properly.  ZLIB 1.2.5 works
-  fine.  So please use ZLIB 1.2.5 to build HDF5 library. (Issue VMS-5;
-  SLU 2013/09/19)  
-
-* When building using the Cray compilers on Cray machines, HDF5
-  configure mistakenly thinks the compiler is an intel compiler and
-  sets the -std=c99 flag which breaks configure on Cray. To build HDF5
-  properly on a Cray machine, please consult with the instructions in
-  INSTALL_parallel for building on Hopper.
-  (MSC - 2013/04/26 - HDFFV-8429)
-
-* The 5.9 C++ compiler on Sun failed to compile a C++ test ttypes.cpp.  It 
-  complains with this message:
-      "/home/hdf5/src/H5Vprivate.h", line 130: Error: __func__ is not defined.
-  
-  The reason is that __func__ is a predefined identifier in C99 standard.  The
-  HDF5 C library uses it in H5private.h.  The test ttypes.cpp includes 
-  H5private.h (H5Tpkg.h<-H5Fprivate.h<-H5Vprivate.h<-H5private.h).  Sun's 5.9
-  C++ compiler doesn't support __func__, thus fails to compile the C++ test.
-  But Sun's 5.11 C++ compiler does.  To check whether your Sun C++ compiler 
-  knows this identifier, try to compile the following simple C++ program:
-      #include<stdio.h>
-
-      int main(void)
-      {
-          printf("%s\n", __func__);
-          return 0;
-      }
-  (SLU - 2012/11/5)
-
-* The C++ and FORTRAN bindings are not currently working on FreeBSD with the
-  native release 8.2 compilers (4.2.1), but are working with gcc 4.6 from the
-  ports (and probably gcc releases after that).
-  (QAK - 2012/10/19)
-
-* The following h5dump test case fails in BG/P machines (and potentially other
-  machines that use a command script to launch executables):
-
-   h5dump --no-compact-subset -d "AHFINDERDIRECT::ah_centroid_t[0] it=0 tl=0"
-     tno-subset.h5
-  
-  This is due to the embedded spaces in the dataset name being interpreted
-  by the command script launcher as meta-characters, thus passing three
-  arguments to h5dump's -d flag. The command passes if run by hand, just
-  not via the test script.
-  (AKC - 2012/05/03)
-
-* On hopper, the build failed when RUNSERIAL and RUNPARALLEL are set
-  to aprun -np X, because the H5lib_settings.c file was not generated
-  properly. Not setting those environment variables works, because
-  configure was able to automatically detect that it's a Cray system
-  and used the proper launch commands when necessary. 
-  (MSC - 2012/04/18)
-
-* The data conversion test dt_arith.c fails in "long double" to integer
-  conversion on Ubuntu 11.10 (3.0.0.13 kernel) with GCC 4.6.1 if the library
-  is built with optimization -O3 or -O2.  The older GCC (4.5) or newer kernal
-  (3.2.2 on Fedora) doesn't have the problem.  Users should lower the 
-  optimization level (-O1 or -O0) by defining CFLAGS in the command line of 
-  "configure" like:
-
-      CFLAGS=-O1 ./configure
-
-  This will overwrite the library's default optimization level.
-  (SLU - 2012/02/07 - HDFFV-7829)
-  This issue is no longer present on Ubuntu 12.10 (3.5.0 kernel) with 
-  gcc 4.7.2.
-
-* The STDIO VFD does not work on some architectures, possibly due to 32/64
-  bit or large file issues.  The basic STDIO VFD test is known to fail on
-  64-bit SunOS 5.10 on SPARC when built with -m64 and 32-bit OS X/Darwin
-  10.7.0.  The STDIO VFD test has been disabled while we investigate and
-  a fix should appear in a future release.
-  (DER - 2011/10/14 - HDFFV-8235)
-
-* h5diff can report inconsistent results when comparing datasets of enum type
-  that contain invalid values.  This is due to how enum types are handled in
-  the library and will be addressed in a future release.
-  (DER - 2011/10/14 - HDFFV-7527)
-
-* The links test can fail under the stdio VFD due to some issues with external
-  links.  This will be investigated and fixed in a future release.
-  (DER - 2011/10/14 - HDFFV-7768)
-
-* After the shared library support was fixed for some bugs, it was discovered
-  that "make prefix=XXX install" no longer works for shared libraries. It
-  still works correctly for static libraries. Therefore, if you want to
-  install the HDF5 shared libraries in a location such as /usr/local/hdf5,
-  you need to specify the location via the --prefix option during configure 
-  time. E.g, ./configure --prefix=/usr/local/hdf5 ...
-  (AKC - 2011/05/07 - HDFFV-7583)
-
-* The parallel test, t_shapesame, in testpar/, may run for a long time and may
-  be terminated by the alarm signal.  If that happens, one can increase the
-  alarm seconds (default is 1200 seconds = 20 minutes) by setting the
-  environment variable, $HDF5_ALARM_SECONDS, to a larger value such as 3600
-  (60 minutes).  Note that the t_shapesame test may fail in some systems 
-  (see the "While working on the 1.8.6 release..." problem below).  If 
-  it does, it will waste more time if $HDF5_ALARM_SECONDS is set
-  to a larger value.
-  (AKC - 2011/05/07)
-
-* The C++ and FORTRAN bindings are not currently working on FreeBSD.
-  (QAK - 2011/04/26)
-
-* Shared Fortran libraries are not quite working on AIX. While they are
-  generated when --enable-shared is specified, the fortran and hl/fortran
-  tests fail. We are looking into the issue. HL and C++ shared libraries
-  should now be working as intended, however.
-  (MAM - 2011/04/20)
-
-* The --with-mpe configure option does not work with Mpich2.
-  (AKC - 2011/03/10)
-
-* While working on the 1.8.6 release of HDF5, a bug was discovered that can
-  occur when reading from a dataset in parallel shortly after it has been
-  written to collectively. The issue was exposed by a new test in the parallel
-  HDF5 test suite, but had existed before that. We believe the problem lies with
-  certain MPI implementations and/or file systems.
-
-  We have provided a pure MPI test program, as well as a standalone HDF5
-  program, that can be used to determine if this is an issue on your system.
-  They should be run across multiple nodes with a varying number of processes.
-  These programs can be found at:
-  http://www.hdfgroup.org/ftp/HDF5/examples/known_problems/
-  (NAF - 2011/01/19)
-
-* All the VFL drivers aren't backward compatible.  In H5FDpublic.h, the
-  structure H5FD_class_t changed in 1.8.  There is new parameter added to
-  get_eoa and set_eoa callback functions.  A new callback function
-  get_type_map was added in.  The public function H5FDrealloc was taken
-  out in 1.8.  The problem only happens when users define their own driver
-  for 1.6 and try to plug in 1.8 library.  Because there's only one user 
-  complaining about it, we (Elena, Quincey, and I) decided to leave it as 
-  it is (see bug report #1279).  Quincey will make a plan for 1.10.
-  (SLU - 2010/02/02)
-
-* The --enable-static-exec configure flag will only statically link libraries
-  if the static version of that library is present. If only the shared version
-  of a library exists (i.e., most system libraries on Solaris, AIX, and Mac,
-  for example, only have shared versions), the flag should still result in a 
-  successful compilation, but note that the installed executables will not be 
-  fully static. Thus, the only guarantee on these systems is that the 
-  executable is statically linked with just the HDF5 library.
-  (MAM - 2009/11/04)
-  
-* Parallel tests failed with 16 processes with data inconsistency at testphdf5
-  / dataset_readAll. Parallel tests also failed with 32 and 64 processes with
-  collective abort of all ranks at t_posix_compliant / allwrite_allread_blocks
-  with MPI IO.
-  (CMC - 2009/04/28)
-
-* On an Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  (SLU - 2005/06/30)
-
-
-%%%%1.8.12%%%%   
-
-
-HDF5 version 1.8.12 released on 2013-11-04
-================================================================================
-
-INTRODUCTION
-============
-
-This document describes the differences between HDF5-1.8.11 and 
-HDF5-1.8.12, and contains information on the platforms tested and 
-known problems in HDF5-1.8.12. 
-For more details, see the files HISTORY-1_0-1_8_0_rc3.txt 
-and HISTORY-1_8.txt in the release_docs/ directory of the HDF5 source.
-
-Links to the HDF5 1.8.12 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
-
-     http://www.hdfgroup.org/products/hdf5/
-
-The HDF5 1.8.12 release can be obtained from:
-
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
-
-User documentation for 1.8.12 can be accessed directly at this location: 
-
-     http://www.hdfgroup.org/HDF5/doc/
-
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
-
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.12 (current 
-release) versus Release 1.8.11":
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-
-If you have any questions or comments, please send them to the HDF Help Desk:
-
-     help at hdfgroup.org
-
-
-CONTENTS
-========
-
-- New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.11
-- Supported Platforms
-- Supported Configuration Features Summary
-- More Tested Platforms
-- Known Problems
-
-
-New Features
-============
-
-    Configuration
-    -------------
-    - Added a configuration option to change the default plugin path.
-      The configure option is --with-default-plugindir=location.
-      The cmake option is -DH5_DEFAULT_PLUGINDIR:PATH=location.
-      HDFFV-8513.  (ADB 2013/09/04)
-    - Renamed FFLAGS to FCFLAGS in configure. (ADB 2013/08/13)
-    - CMake can now package a compressed examples file, the default for 
-      Windows binaries from HDF Group.  (ADB  - 2013/07/22)
-    
-    Library
-    -------
-    - None
- 
-    Parallel Library
-    ----------------
-    - None
- 
-    Tools
-    -----
-    - h5repack: Added the ability to use plugin filters to read and write 
-              files. The option uses the filter number. HDFFV-8345 
-              (ADB - 2013/09/04).
-    - h5dump: Added the option -N --any_path, which searches the file for 
-              paths that match the search path. HDFFV-7989 (ADB - 2013/08/12).
-    - h5dump: Added the optional arg 0 to -A, which excludes attributes 
-              from display. HDFFV-8134 (ADB - 2013/08/01).
-
-    High-Level APIs
-    ---------------
-    - None
-
-    Fortran API
-    -----------
-    - None
-
-    C++ API
-    -------
-    - Added tutorial examples to C++/examples.  They can be installed by
-      "make install-examples" and, in the installed directory, they can be
-      executed by running the script file run-c++-ex.sh. (BMR - 2013/09/28)
-    - A new class, H5::H5Location, is added to represent the location concept
-      in the C library.  It is a base class to H5::H5File and H5::H5Ojbect,
-      whose member functions are moved into H5::H5Location.  H5::H5File can
-      now inherent those functions.  As a result, an H5::H5File object can have
-      an attribute. (BMR - 2013/09/27)
-    - Added wrappers for H5Rget_obj_type2 to retrieve the type of the object
-      that an object reference points to. (BMR - 2013/09/27)
-	H5O_type_t H5Location::getRefObjType(void *ref, H5R_type_t ref_type)
-    - Added wrappers for H5Aexist to check whether an attribute exists given
-      a name. (BMR - 2013/09/27)
-	bool H5::H5Location::attrExists(const char* name)
-	bool H5::H5Location::attrExists(const H5std_string& name)
-    - Added a number of overloaded functions for convenience. (BMR - 2013/09/27)
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-    - None
-
-Bug Fixes since HDF5-1.8.11
-===========================
-
-    Configuration
-    -------------
-    - Modified H5detect.c to scan floating point types for padding bits before
-      analyzing the type further.  This should fix problems with gcc 4.8. 
-      (NAF - 2013/09/19 - HDFFV-8523/HDFFV-8500)
-    - HDF5 rpaths are no longer encoded in the library files when configured
-      with --disable-sharedlib-rpath. (LRK-2013-09-23 - HDFFV-8276)
-
-    Library
-    -------
-    - Added const qualifier to source buffer parameters in H5Dgather and
-      H5D_scatter_func_t (H5Dscatter callback).  (NAF - 2013/7/09)
-
-    - CMake now creates *.so.{lt_version} files with the same version as 
-      configure.  (ADB  - 2013/06/05 HDFFV-8437)
-
-    Parallel Library
-    ----------------
-    - None
-
-    Performance
-    -------------
-    - None
-
-    Tools
-    -----
-    - h5dump: Added the option -N --any_path, which searches the file for 
-              paths that match the search path. HDFFV-7989 (ADB - 2013/08/12).
-    - h5dump: Added the optional arg 0 to -A, which excludes attributes 
-              from display. HDFFV-8134 (ADB - 2013/08/01).
-    - h5dump correctly exports subsetted data to a file, using the --output
-      option.  (ADB  - 2013/06/07 HDFFV-8447)
-    - h5cc and other compile scripts now default to linking shared libraries
-      when HDF5 is configured with the --disable-static option.  
-      (LRK - 2013-09-23 - HDFFV-8141)
-
-    F90 API
-    -------
-    - None
-
-    C++ API
-    ------
-    - None
-
-    High-Level APIs:
-    ------
-    - None
-
-    Fortran High-Level APIs:
-    ------
-    - None
-
-    Testing
-    -------
-    - test/big sometimes failed with the message of "file selection+offset not
-      within extent". This has been fixed. (AKC - 2013/09/28 HDFFV-8271).
-    - tools/h5diff/testh5diff.sh is run in every "make check", even after it
-      has passed in the previous run. It should not run again if there are no
-      code changes. Fixed. (AKC - 2013/07/19 HDFFV-8392)
-
-Supported Platforms
-===================
-The following platforms are supported and have been tested for this release.
-They are built with the configure process unless specified otherwise.
-
-    AIX 5.3                       xlc 10.1.0.5
-    (NASA G-ADA)                  xlC 10.1.0.5
-                                  xlf90 12.1.0.6
-
-    Linux 2.6.18-308.13.1.el5PAE  GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP i686 i686 i386         compilers for 32-bit applications;
-    (jam)                             Version 4.1.2 20080704 (Red Hat 4.1.2-54)
-                                      Version 4.8.1
-                                  PGI C, Fortran, C++ Compilers for 32-bit
-                                  applications;
-                                      Version 13.7-0
-                                  Intel(R) C, C++, Fortran Compiler for 32-bit
-                                  applications;
-                                      Version 13.1.3 (Build 20130607)
-
-    Linux 2.6.18-308.16.1.el5     GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP x86_64 GNU/Linux       compilers for 64-bit applications;
-    (koala)                           Version 4.1.2 20080704 (Red Hat 4.1.2-54)
-                                      Version 4.8.1
-                                  PGI C, Fortran, C++ for 64-bit target on 
-                                  x86-64;
-                                      Version 13.7-0 
-                                  Intel(R) C, C++, Fortran Compilers for 
-                                  applications running on Intel(R) 64; 
-                                      Version 13.1.3 (Build 20130607)
-
-    Linux 2.6.32-358.18.1.el6      GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP x86_64 GNU/Linux       compilers:
-    (platypus)                       Version 4.4.7 20120313
-                                     Version 4.8.1
-                                  PGI C, Fortran, C++ for 64-bit target on 
-                                  x86-64;
-                                      Version 13.7-0 
-                                  Intel(R) C (icc), C++ (icpc), Fortran (icc)
-                                  compilers:
-                                     Version 13.1.3 (Build 20130607)
-
-    Linux 2.6.32-358.18.1.el6.ppc64 gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
-    #1 SMP ppc64 GNU/Linux        g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
-    (ostrich)                     GNU Fortran (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
-                                  IBM XL C/C++ V11.1
-                                  IBM XL Fortran V13.1
-
-    SunOS 5.11 32- and 64-bit     Sun C 5.12 SunOS_sparc
-    (emu)                         Sun Fortran 95 8.6 SunOS_sparc
-                                  Sun C++ 5.12 SunOS_sparc
-
-    Windows 7                     Visual Studio 2008 w/ Intel Fortran 11 (cmake)
-                                  Visual Studio 2010 w/ Intel Fortran 12 (cmake)
-                                  Visual Studio 2012 w/ Intel Fortran 13 (cmake)
-                                  Cygwin(CYGWIN_NT-6.1 1.7.15(0.260/5/3) gcc(4.5.3) compiler and gfortran)
-                                  (cmake and autotools)
-
-    Windows 7 x64                 Visual Studio 2008 w/ Intel Fortran 11 (cmake)
-                                  Visual Studio 2010 w/ Intel Fortran 12 (cmake)
-                                  Visual Studio 2012 w/ Intel Fortran 13 (cmake)
-
-    Windows 8.1                   Visual Studio 2012 w/ Intel Fortran 13 (cmake)
-
-    Windows 8.1 x64               Visual Studio 2012 w/ Intel Fortran 13 (cmake)
-
-    Mac OS X Snow Leopard 10.6.8  gcc i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 from Xcode 3.2.6
-    Darwin Kernel Version 10.8.0  g++ i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 from Xcode 3.2.6
-    64-bit                        gfortran GNU Fortran (GCC) 4.6.2
-    (fred)                        Intel C (icc), Fortran (ifort), C++ (icpc)
-                                      12.1 Build 20120928
-
-    Mac OS X Lion 10.7.3          Apple clang/clang++ version 3.0 from Xcode 4.6.1
-    64-bit                        gfortran GNU Fortran (GCC) 4.6.2
-    (duck)                        Intel icc/icpc/ifort version 13.0.3
-
-    Mac OS X Mountain Lion 10.8.1 Apple clang/clang++ version 4.2 from Xcode 4.6.1
-    64-bit                        gfortran GNU Fortran (GCC) 4.6.2
-    (wren)                        Intel icc/icpc/ifort version 13.0.3
-
-    OpenVMS  IA64 V8.4            HP C V7.3-018         
-                                  HP Fortran V8.2-104939-50H96
-                                  HP C++ V7.4-004 
-
-Tested Configuration Features Summary
-=====================================
-
-    In the tables below
-          y   = tested 
-          n   = not tested in this release
-          C   = Cluster
-          W   = Workstation
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                              C         F90/   F90      C++  zlib  SZIP
-                                      parallel  F2003  parallel
-Solaris2.11 32-bit                      n        y/y    n        y    y     y
-Solaris2.11 64-bit                      n        y/y    n        y    y     y
-Windows 7                               y        y/y    n        y    y     y
-Windows 7 x64                           y        y/y    n        y    y     y
-Windows 7 Cygwin                        n        y/n    n        y    y     y
-Windows 8.1                             n        y/y    n        y    y     y
-Windows 8.1   x64                       n        y/y    n        y    y     y
-Mac OS X Snow Leopard 10.6.8 64-bit     n        y/y    n        y    y     y
-Mac OS X Lion 10.7.3 64-bit             n        y/y    n        y    y     y
-Mac OS X Mountain Lion 10.8.1 64-bit    n        y/y    n        y    y     y
-AIX 5.3 32- and 64-bit                  n        y/n    n        y    y     y
-CentOS 5.9 Linux 2.6.18-308 i686 GNU    y        y/y    y        y    y     y
-CentOS 5.9 Linux 2.6.18-308 i686 Intel  n        y/y    n        y    y     y
-CentOS 5.9 Linux 2.6.18-308 i686 PGI    n        y/y    n        y    y     y
-CentOS 5.9 Linux 2.6.18 x86_64 GNU      y        y/y    y        y    y     y
-CentOS 5.9 Linux 2.6.18 x86_64 Intel    n        y/y    n        y    y     y
-CentOS 5.9 Linux 2.6.18 x86_64 PGI      n        y/y    n        y    y     y
-CentOS 6.4 Linux 2.6.32 x86_64 GNU      n        y/y    n        y    y     y
-CentOS 6.4 Linux 2.6.32 x86_64 Intel    n        y/y    n        y    y     y
-Linux 2.6.32-358.2.1.el6.ppc64          n        y/n    n        y    y     y
-OpenVMS IA64 V8.4                       n        y/n    n        y    y     n
-
-Platform                                 Shared  Shared    Shared    Thread-  
-                                         C libs  F90 libs  C++ libs  safe     
-Solaris2.11 32-bit                         y       y         y         y        
-Solaris2.11 64-bit                         y       y         y         y        
-Windows 7                                  y       y         y         y
-Windows 7 x64                              y       y         y         y
-Windows 7 Cygwin                           n       n         n         y
-Windows 8.1                                y       y         y         y
-Windows 8.1 x64                            y       y         y         y
-Mac OS X Snow Leopard 10.6.8 64-bit        y       n         y         n        
-Mac OS X Lion 10.7.3 64-bit                y       n         y         y        
-Mac OS X Mountain Lion 10.8.1 64-bit       y       n         y         y        
-AIX 5.3 32- and 64-bit                     y       n         n         y        
-CentOS 5.9 Linux 2.6.18-308 i686 GNU       y       y         y         y        
-CentOS 5.9 Linux 2.6.18-308 i686 Intel     y       y         y         n        
-CentOS 5.9 Linux 2.6.18-308 i686 PGI       y       y         y         n        
-CentOS 5.9 Linux 2.6.18 x86_64 GNU         y       y         y         y        
-CentOS 5.9 Linux 2.6.18 x86_64 Intel       y       y         y         n        
-CentOS 5.9 Linux 2.6.18 x86_64 PGI         y       y         y         n     
-CentOS 6.4 Linux 2.6.32 x86_64 GNU         y       y         y         n
-CentOS 6.4 Linux 2.6.32 x86_64 Intel       y       y         y         n
-Linux 2.6.32-358.2.1.el6.ppc64             y       y         y         n 
-OpenVMS IA64 V8.4                          n       n         n         n
-
-Compiler versions for each platform are listed in the preceding
-"Supported Platforms" table.
-
-
-More Tested Platforms
-=====================
-The following platforms are not supported but have been tested for this release.
-
-    Linux 2.6.18-308.13.1.el5PAE  MPICH mpich2-1.4.1p1 compiled with
-    #1 SMP i686 i686 i386             gcc 4.1.2 and gfortran 4.1.2
-    (jam)                         g95 (GCC 4.0.3 (g95 0.94!)
-
-    Linux 2.6.18-308.16.1.el5     MPICH mpich2-1.4.1p1 compiled with
-    #1 SMP x86_64 GNU/Linux           gcc 4.1.2 and gfortran 4.1.2
-    (koala)                       g95 (GCC 4.0.3 (g95 0.94!)
-                                  
-    FreeBSD 8.2-STABLE i386       gcc 4.5.4 [FreeBSD] 20110526
-    (loyalty)                     gcc 4.6.1 20110527
-                                  g++ 4.6.1 20110527
-                                  gfortran 4.6.1 20110527
-
-    FreeBSD 8.2-STABLE amd64      gcc 4.5.4 [FreeBSD] 20110526
-    (freedom)                     gcc 4.6.1 20110527
-                                  g++ 4.6.1 20110527
-                                  gfortran 4.6.1 20110527
-
-    Debian7.1.0 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 GNU/Linux
-                                  gcc (Debian 4.7.2-5) 4.7.2
-                                  GNU Fortran (Debian 4.7.2-5) 4.7.2
-                                  (cmake and autotools)
-
-    Fedora19 3.11.1-200.fc19.x86_64 #1 SMP x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (GCC) 4.8.1 20130603 (Red Hat 4.8.1-1)
-                                  GNU Fortran (GCC) 4.8.1 20130603 (Red Hat 4.8.1-1)
-                                  (cmake and autotools)
-
-    SUSE 12.3 3.7.10-1.16-desktop #1 SMP PREEMPT x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (SUSE Linux) 4.7.2
-                                  GNU Fortran (SUSE Linux) 4.7.2 
-                                  (cmake and autotools)
-
-    Ubuntu 13.04 3.8.0-30-generic #44-Ubuntu SMP x86_64 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
-                                  GNU Fortran (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
-                                  (cmake and autotools)
-    
-    Cray Linux Environment (CLE)  PrgEnv-pgi/4.0.46
-    hopper.nersc.gov              pgcc 12.5-0 64-bit target on x86-64 Linux -tp shanghai
-                                  pgf90 12.5-0 64-bit target on x86-64 Linux -tp shanghai
-                                  pgCC 12.5-0 64-bit target on x86-64 Linux -tp shanghai
-
-
-Known Problems
-==============
-* Several HDF5 command-line tools and tests leave behind generated files
-  that are not cleaned up with "make clean" or "make distclean" when software
-  is built in place. The issue will be addressed in the 1.8.13 release. We
-  recommend to use build directory to compile and test HDF5 as described
-  in the INSTALL file, section 4.2.
- 
-* Source directory names with spaces in them will cause failures in configure
-  or make on Mac (HDFFV-8152), Linux, and probably all other platforms.  If a 
-  configure command with a space is run from a build directory, it will exit 
-  with an error message:  "checking whether build environment is sane... 
-  configure: error: unsafe srcdir value: '/scr/lrknox/hdf5 v1.8.12'".  If 
-  configure is run inside or below the directory with the space in the name, 
-  libtool will get the directory path from the system, put the part of the 
-  path before the space in the libdir variable in .../src/libhdf5.la, and 
-  then fail to find the nonexistent directory.  This is a known libtool issue 
-  and the suggested workaround is to rename the directory without spaces. 
-  (LRK - 2013/10/22)
-
-* CLANG compiler with the options -fcatch-undefined-behavior and -ftrapv
-  catches some undefined behavior in the alignment algorithm of the macro 
-  DETECT_I in H5detect.c (HDFFV-8147). This issue will be addressed in the 
-  next release.  (SLU - 2013/10/16)
-
-* Running make check for the tools can fail in the tools tests if make was not
-  run prior. The tests for the tools use other tools in the tests, therefore
-  all the tools should be built before testing the tools. (ADB - 2013/10/09)
-
-* Make provided by Solaris fails in "make check". Solaris users should use
-  gmake to build and install HDF5 software. (AKC - 2013/10/08 - HDFFV-8534)
-
-* On OpenVMS, two soft conversion functions (H5T__conv_i_f and H5T__conv_f_i)
-  have bugs.  They convert data between floating-point numbers and integers.
-  But the library's default is hard conversion.  The user should avoid
-  explicitly enabling soft conversion between floating-point numbers and
-  integers. (Issue VMS-8; SLU - 2013/09/19)
-
-* On OpenVMS, ZLIB 1.2.8 library doesn't work properly.  ZLIB 1.2.5 works
-  fine.  So please use ZLIB 1.2.5 to build HDF5 library. (Issue VMS-5;
-  SLU 2013/09/19)  
-
-* When building using the Cray compilers on Cray machines, HDF5
-  configure mistakenly thinks the compiler is an intel compiler and
-  sets the -std=c99 flag which breaks configure on Cray. To build HDF5
-  properly on a Cray machine, please consult with the instructions in
-  INSTALL_parallel for building on Hopper.
-  (MSC - 2013/04/26 - HDFFV-8429)
-
-* The h5dump and h5diff utilities occasionally produce different output
-  between Linux and Windows systems. This is caused by lower-level library
-  routines that fail to write fill values to the user's buffer when reading
-  unallocated chunks from datasets that have a fill value set to
-  H5D_FILL_VALUE_DEFAULT. Due to platform differences the return of
-  spurious data values has only been encountered on Windows 32-bit systems.
-  (Issue HDFFV-8247; JP - 2013/03/27)
-
-* The 5.9 C++ compiler on Sun failed to compile a C++ test ttypes.cpp.  It 
-  complains with this message:
-      "/home/hdf5/src/H5Vprivate.h", line 130: Error: __func__ is not defined.
-  
-  The reason is that __func__ is a predefined identifier in C99 standard.  The
-  HDF5 C library uses it in H5private.h.  The test ttypes.cpp includes 
-  H5private.h (H5Tpkg.h<-H5Fprivate.h<-H5Vprivate.h<-H5private.h).  Sun's 5.9
-  C++ compiler doesn't support __func__, thus fails to compile the C++ test.
-  But Sun's 5.11 C++ compiler does.  To check whether your Sun C++ compiler 
-  knows this identifier, try to compile the following simple C++ program:
-      #include<stdio.h>
-
-      int main(void)
-      {
-          printf("%s\n", __func__);
-          return 0;
-      }
-  (SLU - 2012/11/5)
-
-* The C++ and FORTRAN bindings are not currently working on FreeBSD with the
-  native release 8.2 compilers (4.2.1), but are working with gcc 4.6 from the
-  ports (and probably gcc releases after that).
-  (QAK - 2012/10/19)
-
-* The following h5dump test case fails in BG/P machines (and potentially other
-  machines that use a command script to launch executables):
-
-   h5dump --no-compact-subset -d "AHFINDERDIRECT::ah_centroid_t[0] it=0 tl=0"
-     tno-subset.h5
-  
-  This is due to the embedded spaces in the dataset name being interpreted
-  by the command script launcher as meta-characters, thus passing three
-  arguments to h5dump's -d flag. The command passes if run by hand, just
-  not via the test script.
-  (AKC - 2012/05/03)
-
-* On hopper, the build failed when RUNSERIAL and RUNPARALLEL are set
-  to aprun -np X, because the H5lib_settings.c file was not generated
-  properly. Not setting those environment variables works, because
-  configure was able to automatically detect that it is a Cray system
-  and used the proper launch commands when necessary. 
-  (MSC - 2012/04/18)
-
-* The data conversion test dt_arith.c fails in "long double" to integer
-  conversion on Ubuntu 11.10 (3.0.0.13 kernel) with GCC 4.6.1 if the library
-  is built with optimization -O3 or -O2.  The older GCC (4.5) or newer kernel
-  (3.2.2 on Fedora) do not have the problem.  Users should lower the 
-  optimization level (-O1 or -O0) by defining CFLAGS in the command line of 
-  "configure" like:
-
-      CFLAGS=-O1 ./configure
-
-  This will overwrite the library's default optimization level.
-  (SLU - 2012/02/07 - HDFFV-7829)
-  This issue is no longer present on Ubuntu 12.10 (3.5.0 kernel) with 
-  gcc 4.7.2.
-
-* The STDIO VFD does not work on some architectures, possibly due to 32/64
-  bit or large file issues.  The basic STDIO VFD test is known to fail on
-  64-bit SunOS 5.10 on SPARC when built with -m64 and 32-bit OS X/Darwin
-  10.7.0.  The STDIO VFD test has been disabled while we investigate and
-  a fix should appear in a future release.
-  (DER - 2011/10/14 - HDFFV-8235)
-
-* h5diff can report inconsistent results when comparing datasets of enum type
-  that contain invalid values.  This is due to how enum types are handled in
-  the library and will be addressed in a future release.
-  (DER - 2011/10/14 - HDFFV-7527)
-
-* The links test can fail under the stdio VFD due to some issues with external
-  links.  This will be investigated and fixed in a future release.
-  (DER - 2011/10/14 - HDFFV-7768)
-
-* After the shared library support was fixed for some bugs, it was discovered
-  that "make prefix=XXX install" no longer works for shared libraries. It
-  still works correctly for static libraries. Therefore, if you want to
-  install the HDF5 shared libraries in a location such as /usr/local/hdf5,
-  you need to specify the location via the --prefix option during configure 
-  time. E.g, ./configure --prefix=/usr/local/hdf5 ...
-  (AKC - 2011/05/07 - HDFFV-7583)
-
-* The parallel test, t_shapesame, in testpar/, may run for a long time and may
-  be terminated by the alarm signal.  If that happens, one can increase the
-  alarm seconds (default is 1200 seconds = 20 minutes) by setting the
-  environment variable, $HDF5_ALARM_SECONDS, to a larger value such as 3600
-  (60 minutes).  Note that the t_shapesame test may fail in some systems 
-  (see the "While working on the 1.8.6 release..." problem below).  If 
-  it does, it will waste more time if $HDF5_ALARM_SECONDS is set
-  to a larger value.
-  (AKC - 2011/05/07)
-
-* The C++ and FORTRAN bindings are not currently working on FreeBSD.
-  (QAK - 2011/04/26)
-
-* Shared Fortran libraries are not quite working on AIX. While they are
-  generated when --enable-shared is specified, the fortran and hl/fortran
-  tests fail. We are looking into the issue. HL and C++ shared libraries
-  should now be working as intended, however.
-  (MAM - 2011/04/20)
-
-* The --with-mpe configure option does not work with Mpich2.
-  (AKC - 2011/03/10)
-
-* While working on the 1.8.6 release of HDF5, a bug was discovered that can
-  occur when reading from a dataset in parallel shortly after it has been
-  written to collectively. The issue was exposed by a new test in the parallel
-  HDF5 test suite, but had existed before that. We believe the problem lies with
-  certain MPI implementations and/or file systems.
-
-  We have provided a pure MPI test program, as well as a standalone HDF5
-  program, that can be used to determine if this is an issue on your system.
-  They should be run across multiple nodes with a varying number of processes.
-  These programs can be found at:
-  http://www.hdfgroup.org/ftp/HDF5/examples/known_problems/
-  (NAF - 2011/01/19)
-
-* All the VFL drivers aren't backward compatible.  In H5FDpublic.h, the
-  structure H5FD_class_t changed in 1.8.  There is new parameter added to
-  get_eoa and set_eoa callback functions.  A new callback function
-  get_type_map was added in.  The public function H5FDrealloc was taken
-  out in 1.8.  The problem only happens when users define their own driver
-  for 1.6 and try to plug in 1.8 library.  Because there's only one user 
-  complaining about it, we (Elena, Quincey, and I) decided to leave it as 
-  it is (see bug report #1279).  Quincey will make a plan for 1.10.
-  (SLU - 2010/02/02)
-
-* The --enable-static-exec configure flag will only statically link libraries
-  if the static version of that library is present. If only the shared version
-  of a library exists (i.e., most system libraries on Solaris, AIX, and Mac,
-  for example, only have shared versions), the flag should still result in a 
-  successful compilation, but note that the installed executables will not be 
-  fully static. Thus, the only guarantee on these systems is that the 
-  executable is statically linked with just the HDF5 library.
-  (MAM - 2009/11/04)
-  
-* Parallel tests failed with 16 processes with data inconsistency at testphdf5
-  / dataset_readAll. Parallel tests also failed with 32 and 64 processes with
-  collective abort of all ranks at t_posix_compliant / allwrite_allread_blocks
-  with MPI IO.
-  (CMC - 2009/04/28)
-
-* On an Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  (SLU - 2005/06/30)
-
-
-%%%%1.8.11%%%%   
-
-
-HDF5 version 1.8.11 released on 2013-05-08
-================================================================================
-
-INTRODUCTION
-============
-
-This document describes the differences between HDF5-1.8.10 and 
-HDF5-1.8.11-*, and contains information on the platforms tested and 
-known problems in HDF5-1.8.11-*. 
-For more details, see the files HISTORY-1_0-1_8_0_rc3.txt 
-and HISTORY-1_8.txt in the release_docs/ directory of the HDF5 source.
-
-Links to the HDF5 1.8.11 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
-
-     http://www.hdfgroup.org/products/hdf5/
-
-The HDF5 1.8.11 release can be obtained from:
-
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
-
-User documentation for 1.8.11 can be accessed directly at this location: 
-
-     http://www.hdfgroup.org/HDF5/doc/
-
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
-
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.11 (current 
-release) versus Release 1.8.10":
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-
-If you have any questions or comments, please send them to the HDF Help Desk:
-
-     help at hdfgroup.org
-
-
-CONTENTS
-========
-
-- New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.10
-- Supported Platforms
-- Supported Configuration Features Summary
-- More Tested Platforms
-- Known Problems
-
-
-New Features
-============
-
-    Configuration
-    -------------
-    - Libtool version number is changed to 8.0.0 because there are API
-      changes. See below for details. (AKC - 2013/05/07 HDFFV-8435)
-    - Mac OS X 10.7 (Lion) and 10.8 (Mountain Lion) uses clang/clang++ as the
-      default C and C++ compilers. (AKC - 2013/04/19 HDFFV-8245)
-    - CMake minimum is now 2.8.10. (ADB 2013/1/14)
-    - A new tool, cmakehdf5, which is a build command script similar to
-      buildhdf5 is added and is available in the bin directory.
-      (AKC - 2013/01/16 HDFFV-8336)
-    
-    Library
-    -------
-    - The library can load filter libraries dynamically during runtime.  Users
-      can set the search path through environment variable HDF5_PLUGIN_PATH 
-      and call H5Pset_filter to enable a dynamic filter. (SLU - 2013/04/08)
-    - Added new API functions H5Dscatter and H5Dgather to scatter data to and
-      and gather data from a selection within a memory buffer.
-      (NAF - 2013/02/05)
-    - The library now supports the data conversion from enumeration to numeric
-      (integer and floating-point number) datatypes. See Issue HDFFV-8221.
-      (SLU - 2012/10/23)
- 
-    Parallel Library
-    ----------------
-    - None
- 
-    Tools
-    -----
-    - h5dump: added new option -O or -ddl to output the ddl text to a file. This
-      is a complement to the -o or --output option, which redirects the data to
-      a file. HDFFV-8229 (ADB - 2013/2/25)
-
-    High-Level APIs
-    ---------------
-    - A new API function, H5DOwrite_chunk.  This function writes a data chunk 
-      directly into a file, bypassing hyperslab selection, data conversion, 
-      and the filter pipeline.  The user must be careful with the function and
-      clearly understand the I/O process of the library. (SLU - 2013/2/11)
-
-    Fortran API
-    -----------
-    - New API functions added (MSB - 2013/3/23):
-
-      h5odecr_refcount_f, h5oexists_by_name_f, h5oget_comment_f,
-      h5oget_comment_by_name_f, h5oincr_refcount_f, h5oopen_by_idx_f, 
-      h5oset_comment_f, h5oset_comment_by_name_f, h5oset_comment_by_name_f
-
-      F2003: h5oget_info_f, h5oget_info_by_idx_f, h5ovisit_by_name_f
-    
-
-    C++ API
-    -------
-    - None
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-    - SunOS 5.11 (emu) 32-bit and 64-bit with Sun C/C++ 5.12 compiler and
-      Sun Fortran 95 8.6 compiler.
-    - Visual Studio 2012 w/ Intel Fortran 13 on Windows 7
-    - g95 released new version recently and is tested in this release.
-
-Bug Fixes since HDF5-1.8.10
-==========================
-
-    Configuration
-    -------------
-    - Fixed Thread-safe configure failure for the AIX platform.
-      (AKC - 2013/04/19 HDFFV-8390)
-    - Configure will check the result of header searches before searching for
-      the library. 
-      Fixes HDFFV-8257 (ADB 2013/03/04)
-    - HDF does not support building SHARED Fortran libraries on OSX. Added 
-      CMake code to check for this condition. 
-      Fixes HDFFV-8227 (ADB 2013/03/04)
-    - CMake builds on Windows will no longer use legacy naming for libraries. 
-      The "dll" tag will no longer be added to the name of *.lib and *.dll.
-      The option HDF_LEGACY_NAMING is now OFF by default.
-      Fixes HDFFV-8292 (ADB 2013/01/30)
-
-    Library
-    -------
-    - The library now behaves correctly when performing large I/O operations 
-      on Mac OS-X.  Previously, single I/O operations > 2 GB would fail 
-      since the Darwin read/write calls cannot handle the number of bytes 
-      that their parameter types imply.
-      Fixes HDFFV-7975 and HDFFV-8240 (DER 2013/01/07)
-    - Fixed a bug in the core VFD that causes failures when opening files 
-      > 2 GB.
-      Fixes HDFFV-8124 and HDFFV-8158 (DER 2013/01/07)
-    - Fixed a bug where unintialized memory was read during variable-length
-      type conversion.  This caused segfaults in netCDF.  Fixes HDFFV-8159.
-      (DER 2013/03/30)
-    - Removed the H5Pset/get_dxpl_multi functions from the library.  The
-      intended functionality for them was never fully implemented, and they
-      have always been fundamentally broken.  NOTE: This does not affect 
-      setting the multi VFD or any expected VFD functionality.  Multi VFD 
-      usage remains unchanged.  
-      Fixes HDFFV-8296.  (DER 2013/03/30)
-
-    Parallel Library
-    ----------------
-    - None
-
-    Performance
-    -------------
-    - None
-
-    Tools
-    -----
-    - h5redeploy is changed to do this by default:
-	Installation directories:
-	prefix       architecture-independent files.
-	exec_prefix  architecture-dependent files, default is <prefix>.
-	libdir       libraries, default is <exec_prefix>/lib.
-	includedir   header files, default is <prefix/include>.
-      This allows users to just change the first line of prefix=<...> and the
-      effect will change libdir and includedir too.  (AKC 2013/04/05 HDFFV-8358)
-    - h5repack: Fixed failure to convert the layout of a small chunked 
-      dataset (size < 1K) to contiguous layout.  HDFFV-8214 (JKM 2013/03/26)
-    - h5dump: Fixed displaying compression ratio for unknown or user-defined 
-      filters. HDFFV-8344 (XCAO 2013/03/19)
-    - h5dump: Changed UNKNOWN_FILTER to USER_DEFINED_FILTER for user defined 
-      filter. HDFFV-8346 (XCAO 2013/03/19)
-    - h5diff: Fixed to return the correct exit code 1 when the program 
-      detects a unique extra attribute. Prior to this fix, h5diff returned 
-      exit code 0 indicating the two files are identical.   
-      HDFFV-7643 (JKM 2013/02/15)
-    - h5dump: Fixed writing nulls to a binary file when exporting a dataset
-      with compound string datatype. HDFFV-8169 (ADB 2013/1/31)
-    - The following h5stat test case failed in BG/P machines (and potentially
-      other machines that display extra output if an MPI task returns with a
-      non-zero code.)
-        Testing h5stat notexist.h5
-      The test script was fixed to ignore the extra output.  HDFFV-8233 
-      (AKC - 2012/11/30)
-    - h5diff: Improved speed when comparing HDF5 files with lots of
-      attributes. Much slower performance was identified with release versions 
-      from 1.8.7 to 1.8.10 compared to 1.8.6. (JKM 2012/10/19)
-
-    F90 API
-    -------
-    - The integer type of the 'offset' argument in h5pset_external_f and
-      h5pget_external_f was changed to INTEGER(KIND=OFF_T) to support 8-byte
-      integers, matching the C type definition of off_t. (MSB - 2013/3/23)
-    - h5fc updated to recognize .f95, .f03 and .f08 file extensions. 
-
-    C++ API
-    ------
-    - The C++ wrappers DSetMemXferPropList::setMulti/getMulti were removed 
-      because the C functions H5Pset/get_dxpl_multi functions are removed 
-      from the library. Fixes HDFFV-8296 by DER.  (BMR 2013/03/30)
-    - An exception thrown by an internal function was not propagating to the
-      test program during stack unwinding, so it couldn't be caught by the
-      test, and the program terminated "without an active exception."  It 
-      seemed that the problem happened when c_str() was used to generate 
-      an equivalent const char* from a std::string and the resulting string 
-      was passed to the internal function.  As a work-around, we added a 
-      try/catch around the the call to the internal function and when the 
-      exception is caught there, it is re-thrown.  Fixes HDFFV-8067.  
-      (BMR 2013/03/30)
-
-    High-Level APIs:
-    ------
-    - Fixed a problem with H5DSget_scale_name including the NULL terminator 
-      in the size calculation returned by the function. The API was changed 
-      to NOT include the NULL terminator in the size of name returned 
-      (MSB- 2013/2/10)
-
-    Fortran High-Level APIs:
-    ------
-    - None
-
-    Testing
-    -------
-    - In some Mac systems, testlibinfo.sh failed with this error:
-         Check file ../src/.libs/libhdf5.7.dylib
-         strings: object: ../src/.libs/libhdf5.7.dylib malformed object \
-         (unknown load command 15)
-      The strings command of Mac systems inspects library files, and older
-      versions of strings may not know newer library formats, resulting
-      in errors.  Fixed by sending the library file as stdin to the strings
-      command to avoid this problem. (AKC - 2013/03/08 HDFFV-8305)
-    - Fixed a typo in the ERROR macro in test/testhdf5.h. It segmentation
-      faulted when used before. (AKC - 2013/02/12 HDFFV-8267)
-
-Supported Platforms
-===================
-The following platforms are supported and have been tested for this release.
-They are built with the configure process unless specified otherwise.
-
-    AIX 5.3                       xlc 10.1.0.5
-    (NASA G-ADA)                  xlC 10.1.0.5
-                                  xlf90 12.1.0.6
-
-    Linux 2.6.18-308.13.1.el5PAE  GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP i686 i686 i386         compilers for 32-bit applications;
-    (jam)                             Version 4.1.2 20080704 (Red Hat 4.1.2-54)
-                                      Version 4.6.3
-                                  PGI C, Fortran, C++ Compilers for 32-bit
-                                  applications;
-                                      Version 11.9-0
-                                      Version 12.5-0
-                                  Intel(R) C, C++, Fortran Compiler for 32-bit
-                                  applications;
-                                      Version 12.1 (Build 20110811)
-                                      Version 12.1 (Build 20120212)
-
-    Linux 2.6.18-308.16.1.el5     GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP x86_64 GNU/Linux       compilers for 64-bit applications;
-    (koala)                           Version 4.1.2 20080704 (Red Hat 4.1.2-52)
-                                      Version 4.6.3
-                                  PGI C, Fortran, C++ for 64-bit target on 
-                                  x86-64;
-                                      Version 11.9-0 
-                                      Version 12.5-0
-                                  Intel(R) C, C++, Fortran Compilers for 
-                                  applications running on Intel(R) 64; 
-                                      Version 12.1 (Build 20110811)
-                                      Version 12.1 (Build 20120212)
-
-    Linux 2.6.32-358.2.1.el6      GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP x86_64 GNU/Linux       compilers:
-    (platypus)                       Version 4.4.7 20120313
-                                  Intel(R) C (icc), C++ (icpc), Fortran (icc)
-                                  compilers:
-                                     Version 12.1 20120212
-
-    Linux 2.6.32-358.2.1.el6.ppc64 gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
-    #1 SMP ppc64 GNU/Linux        g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
-    (ostrich)                     GNU Fortran (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
-                                  IBM XL C/C++ V11.1
-                                  IBM XL Fortran V13.1
-
-    SunOS 5.11 32- and 64-bit     Sun C 5.12 SunOS_sparc
-    (emu)                         Sun Fortran 95 8.6 SunOS_sparc
-                                  Sun C++ 5.12 SunOS_sparc
-
-    Windows 7                     Visual Studio 2008 w/ Intel Fortran 11 (cmake)
-                                  Visual Studio 2010 w/ Intel Fortran 12 (cmake)
-                                  Visual Studio 2012 w/ Intel Fortran 13 (cmake)
-                                  Cygwin(CYGWIN_NT-6.1 1.7.15(0.260/5/3) gcc(4.5.3) compiler and gfortran)
-                                  (cmake and autotools)
-
-    Windows 7 x64                 Visual Studio 2008 w/ Intel Fortran 11 (cmake)
-                                  Visual Studio 2010 w/ Intel Fortran 12 (cmake)
-                                  Visual Studio 2012 w/ Intel Fortran 13 (cmake)
-                                  Cygwin(CYGWIN_NT-6.1 1.7.15(0.260/5/3) gcc(4.5.3) compiler and gfortran)
-                                  (cmake and autotools)
-
-    Mac OS X Snow Leopard 10.6.8  gcc i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 from Xcode 3.2.6
-    Darwin Kernel Version 10.8.0  g++ i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 from Xcode 3.2.6
-    64-bit                        gfortran GNU Fortran (GCC) 4.6.2
-    (fred)                        Intel C (icc), Fortran (ifort), C++ (icpc)
-                                      12.1 Build 20120928
-
-    Mac OS X Lion 10.7.3          Apple clang/clang++ version 3.0 from Xcode 4.6.1
-    64-bit                        gfortran GNU Fortran (GCC) 4.6.2
-    (duck)                        Intel icc/icpc/ifort version 13.0
-
-    Mac OS X Mountain Lion 10.8.1 Apple clang/clang++ version 4.2 from Xcode 4.6.1
-    64-bit    			  gfortran GNU Fortran (GCC) 4.6.2
-    (wren)                        Intel icc/icpc/ifort version 13.0.1.119
-
-
-Tested Configuration Features Summary
-=====================================
-
-    In the tables below
-          y   = tested 
-          n   = not tested in this release
-          C   = Cluster
-          W   = Workstation
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                              C         F90/   F90      C++  zlib  SZIP
-                                      parallel  F2003  parallel
-Solaris2.11 32-bit                      n        y/y    n        y    y     y
-Solaris2.11 64-bit                      n        y/n    n        y    y     y
-Windows 7                               y        y/y    n        y    y     y
-Windows 7 x64                           y        y/y    n        y    y     y
-Windows 7 Cygwin                        n        y/n    n        y    y     y
-Windows 7 x64 Cygwin                    n        y/n    n        y    y     y
-Mac OS X Snow Leopard 10.6.8 64-bit     n        y/y    n        y    y     y
-Mac OS X Lion 10.7.3 64-bit             n        y/y    n        y    y     y
-Mac OS X Mountain Lion 10.8.1 64-bit    n        y/y    n        y    y     y
-AIX 5.3 32- and 64-bit                  n        y/n    n        y    y     y
-CentOS 5.9 Linux 2.6.18-308 i686 GNU    y        y/y    y        y    y     y
-CentOS 5.9 Linux 2.6.18-308 i686 Intel  n        y/y    n        y    y     y
-CentOS 5.9 Linux 2.6.18-308 i686 PGI    n        y/y    n        y    y     y
-CentOS 5.9 Linux 2.6.18 x86_64 GNU      y        y/y    y        y    y     y
-CentOS 5.9 Linux 2.6.18 x86_64 Intel    n        y/y    n        y    y     y
-CentOS 5.9 Linux 2.6.18 x86_64 PGI      n        y/y    n        y    y     y
-CentOS 6.4 Linux 2.6.32 x86_64 GNU      n        y/n    n        y    y     y
-CentOS 6.4 Linux 2.6.32 x86_64 Intel    n        y/y    n        y    y     y
-Linux 2.6.32-358.2.1.el6.ppc64          n        y/n    n        y    y     y
-
-
-Platform                                 Shared  Shared    Shared    Thread-  
-                                         C libs  F90 libs  C++ libs  safe     
-Solaris2.11 32-bit                         y       y         y         y        
-Solaris2.11 64-bit                         y       y         y         y        
-Windows 7                                  y       y         y         y
-Windows 7 x64                              y       y         y         y
-Windows 7 Cygwin                           n       n         n         y
-Windows 7 x64 Cygwin                       n       n         n         y
-Mac OS X Snow Leopard 10.6.8 64-bit        y       n         y         n        
-Mac OS X Lion 10.7.3 64-bit                y       n         y         y        
-Mac OS X Mountain Lion 10.8.1 64-bit       y       n         y         y        
-AIX 5.3 32- and 64-bit                     y       n         n         y        
-CentOS 5.9 Linux 2.6.18-308 i686 GNU       y       y         y         y        
-CentOS 5.9 Linux 2.6.18-308 i686 Intel     y       y         y         n        
-CentOS 5.9 Linux 2.6.18-308 i686 PGI       y       y         y         n        
-CentOS 5.9 Linux 2.6.18 x86_64 GNU         y       y         y         y        
-CentOS 5.9 Linux 2.6.18 x86_64 Intel       y       y         y         n        
-CentOS 5.9 Linux 2.6.18 x86_64 PGI         y       y         y         n     
-CentOS 6.4 Linux 2.6.32 x86_64 GNU         y       y         y         n
-CentOS 6.4 Linux 2.6.32 x86_64 Intel       y       y         y         n
-Linux 2.6.32-358.2.1.el6.ppc64             y       y         y         n 
-
-Compiler versions for each platform are listed in the preceding
-"Supported Platforms" table.
-
-
-More Tested Platforms
-=====================
-The following platforms are not supported but have been tested for this release.
-
-    Linux 2.6.18-308.13.1.el5PAE  MPICH mpich2-1.4.1p1 compiled with
-    #1 SMP i686 i686 i386             gcc 4.1.2 and gfortran 4.1.2
-    (jam)                         g95 (GCC 4.0.3 (g95 0.94!)
-
-    Linux 2.6.18-308.16.1.el5     MPICH mpich2-1.4.1p1 compiled with
-    #1 SMP x86_64 GNU/Linux           gcc 4.1.2 and gfortran 4.1.2
-    (koala)                       g95 (GCC 4.0.3 (g95 0.94!)
-                                  
-    FreeBSD 8.2-STABLE i386       gcc 4.2.1 [FreeBSD] 20070719
-    (loyalty)                     gcc 4.6.1 20110422
-                                  g++ 4.6.1 20110422
-                                  gfortran 4.6.1 20110422
-
-    FreeBSD 8.2-STABLE amd64      gcc 4.2.1 [FreeBSD] 20070719
-    (freedom)                     gcc 4.6.1 20110422
-                                  g++ 4.6.1 20110422
-                                  gfortran 4.6.1 20110422
-
-    Debian6.0.7 2.6.32-5-amd64 #1 SMP x86_64 GNU/Linux
-                                  gcc (Debian 4.4.5-8) 4.4.5
-                                  GNU Fortran (Debian 4.4.5-8) 4.4.5
-                                  (cmake and autotools)
-
-    Fedora18 3.7.9-205.fc18.x86_64 #1 SMP x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8)
-                                  GNU Fortran (GCC) 4.7.2 20120507 (Red Hat 4.7.2-8)
-                                  (cmake and autotools)
-
-    SUSE 12.3 3.7.10-1.1-desktop #1 SMP PREEMPT x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (SUSE Linux) 4.7.2
-                                  GNU Fortran (SUSE Linux) 4.7.2 
-                                  (cmake and autotools)
-
-    Ubuntu 12.10 3.5.0-25-generic #39-Ubuntu SMP x86_64 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
-                                  GNU Fortran (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
-                                  (cmake and autotools)
-    
-    Cray Linux Environment (CLE)  PrgEnv-pgi/4.0.46
-    hopper.nersc.gov              pgcc 12.5-0 64-bit target on x86-64 Linux -tp shanghai
-                                  pgf90 12.5-0 64-bit target on x86-64 Linux -tp shanghai
-                                  pgCC 12.5-0 64-bit target on x86-64 Linux -tp shanghai
-
-
-Known Problems
-==============
-
-* When building using the Cray compilers on Cray machines, HDF5
-  configure mistakenly thinks the compiler is an intel compiler and
-  sets the -std=c99 flag which breaks configure on Cray. To build HDF5
-  properly on a Cray machine, please consult with the instructions in
-  INSTALL_parallel for building on Hopper.
-  (MSC - 2013/04/26 - HDFFV-8429)
-
-* The h5dump and h5diff utilities occasionally produce different output
-  between Linux and Windows systems. This is caused by lower-level library
-  routines that fail to write fill values to the user's buffer when reading
-  unallocated chunks from datasets that have a fill value set to
-  H5D_FILL_VALUE_DEFAULT. Due to platform differences the return of
-  spurious data values has only been encountered on Windows 32-bit systems.
-  (Issue HDFFV-8247; JP - 2013/03/27)
-
-* The 5.9 C++ compiler on Sun failed to compile a C++ test ttypes.cpp.  It 
-  complains with this message:
-      "/home/hdf5/src/H5Vprivate.h", line 130: Error: __func__ is not defined.
-  
-  The reason is that __func__ is a predefined identifier in C99 standard.  The
-  HDF5 C library uses it in H5private.h.  The test ttypes.cpp includes 
-  H5private.h (H5Tpkg.h<-H5Fprivate.h<-H5Vprivate.h<-H5private.h).  Sun's 5.9
-  C++ compiler doesn't support __func__, thus fails to compile the C++ test.
-  But Sun's 5.11 C++ compiler does.  To check whether your Sun C++ compiler 
-  knows this identifier, try to compile the following simple C++ program:
-      #include<stdio.h>
-
-      int main(void)
-      {
-          printf("%s\n", __func__);
-          return 0;
-      }
-  (SLU - 2012/11/5)
-
-* The C++ and FORTRAN bindings are not currently working on FreeBSD with the
-  native release 8.2 compilers (4.2.1), but are working with gcc 4.6 from the
-  ports (and probably gcc releases after that).
-  (QAK - 2012/10/19)
-
-* The following h5dump test case fails in BG/P machines (and potentially other
-  machines that use a command script to launch executables):
-
-   h5dump --no-compact-subset -d "AHFINDERDIRECT::ah_centroid_t[0] it=0 tl=0"
-     tno-subset.h5
-  
-  This is due to the embedded spaces in the dataset name being interpreted
-  by the command script launcher as meta-characters, thus passing three
-  arguments to h5dump's -d flag. The command passes if run by hand, just
-  not via the test script.
-  (AKC - 2012/05/03)
-
-* On hopper, the build failed when RUNSERIAL and RUNPARALLEL are set
-  to aprun -np X, because the H5lib_settings.c file was not generated
-  properly. Not setting those environment variables works, because
-  configure was able to automatically detect that it's a Cray system
-  and used the proper launch commands when necessary. 
-  (MSC - 2012/04/18)
-
-* The data conversion test dt_arith.c fails in "long double" to integer
-  conversion on Ubuntu 11.10 (3.0.0.13 kernel) with GCC 4.6.1 if the library
-  is built with optimization -O3 or -O2.  The older GCC (4.5) or newer kernal
-  (3.2.2 on Fedora) doesn't have the problem.  Users should lower the 
-  optimization level (-O1 or -O0) by defining CFLAGS in the command line of 
-  "configure" like:
-
-      CFLAGS=-O1 ./configure
-
-  This will overwrite the library's default optimization level.
-  (SLU - 2012/02/07 - HDFFV-7829)
-  This issue is no longer present on Ubuntu 12.10 (3.5.0 kernel) with 
-  gcc 4.7.2.
-
-* The STDIO VFD does not work on some architectures, possibly due to 32/64
-  bit or large file issues.  The basic STDIO VFD test is known to fail on
-  64-bit SunOS 5.10 on SPARC when built with -m64 and 32-bit OS X/Darwin
-  10.7.0.  The STDIO VFD test has been disabled while we investigate and
-  a fix should appear in a future release.
-  (DER - 2011/10/14 - HDFFV-8235)
-
-* h5diff can report inconsistent results when comparing datasets of enum type
-  that contain invalid values.  This is due to how enum types are handled in
-  the library and will be addressed in a future release.
-  (DER - 2011/10/14 - HDFFV-7527)
-
-* The links test can fail under the stdio VFD due to some issues with external
-  links.  This will be investigated and fixed in a future release.
-  (DER - 2011/10/14 - HDFFV-7768)
-
-* After the shared library support was fixed for some bugs, it was discovered
-  that "make prefix=XXX install" no longer works for shared libraries. It
-  still works correctly for static libraries. Therefore, if you want to
-  install the HDF5 shared libraries in a location such as /usr/local/hdf5,
-  you need to specify the location via the --prefix option during configure 
-  time. E.g, ./configure --prefix=/usr/local/hdf5 ...
-  (AKC - 2011/05/07 - HDFFV-7583)
-
-* The parallel test, t_shapesame, in testpar/, may run for a long time and may
-  be terminated by the alarm signal.  If that happens, one can increase the
-  alarm seconds (default is 1200 seconds = 20 minutes) by setting the
-  environment variable, $HDF5_ALARM_SECONDS, to a larger value such as 3600
-  (60 minutes).  Note that the t_shapesame test may fail in some systems 
-  (see the "While working on the 1.8.6 release..." problem below).  If 
-  it does, it will waste more time if $HDF5_ALARM_SECONDS is set
-  to a larger value.
-  (AKC - 2011/05/07)
-
-* The C++ and FORTRAN bindings are not currently working on FreeBSD.
-  (QAK - 2011/04/26)
-
-* Shared Fortran libraries are not quite working on AIX. While they are
-  generated when --enable-shared is specified, the fortran and hl/fortran
-  tests fail. We are looking into the issue. HL and C++ shared libraries
-  should now be working as intended, however.
-  (MAM - 2011/04/20)
-
-* The --with-mpe configure option does not work with Mpich2.
-  (AKC - 2011/03/10)
-
-* While working on the 1.8.6 release of HDF5, a bug was discovered that can
-  occur when reading from a dataset in parallel shortly after it has been
-  written to collectively. The issue was exposed by a new test in the parallel
-  HDF5 test suite, but had existed before that. We believe the problem lies with
-  certain MPI implementations and/or file systems.
-
-  We have provided a pure MPI test program, as well as a standalone HDF5
-  program, that can be used to determine if this is an issue on your system.
-  They should be run across multiple nodes with a varying number of processes.
-  These programs can be found at:
-  http://www.hdfgroup.org/ftp/HDF5/examples/known_problems/
-  (NAF - 2011/01/19)
-
-* The library's test dt_arith.c showed a compiler's rounding problem on
-  Cygwin when converting from unsigned long long to long double.  The 
-  library's own conversion works fine.  We defined a macro for Cygwin to
-  skip this test until we can solve the problem.
-  (SLU - 2010/05/05 - HDFFV-1264)
-
-* All the VFL drivers aren't backward compatible.  In H5FDpublic.h, the
-  structure H5FD_class_t changed in 1.8.  There is new parameter added to
-  get_eoa and set_eoa callback functions.  A new callback function
-  get_type_map was added in.  The public function H5FDrealloc was taken
-  out in 1.8.  The problem only happens when users define their own driver
-  for 1.6 and try to plug in 1.8 library.  Because there's only one user 
-  complaining about it, we (Elena, Quincey, and I) decided to leave it as 
-  it is (see bug report #1279).  Quincey will make a plan for 1.10.
-  (SLU - 2010/02/02)
-
-* The --enable-static-exec configure flag will only statically link libraries
-  if the static version of that library is present. If only the shared version
-  of a library exists (i.e., most system libraries on Solaris, AIX, and Mac,
-  for example, only have shared versions), the flag should still result in a 
-  successful compilation, but note that the installed executables will not be 
-  fully static. Thus, the only guarantee on these systems is that the 
-  executable is statically linked with just the HDF5 library.
-  (MAM - 2009/11/04)
-  
-* Parallel tests failed with 16 processes with data inconsistency at testphdf5
-  / dataset_readAll. Parallel tests also failed with 32 and 64 processes with
-  collective abort of all ranks at t_posix_compliant / allwrite_allread_blocks
-  with MPI IO.
-  (CMC - 2009/04/28)
-
-* On an Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  (SLU - 2005/06/30)
-
-
-%%%%1.8.10-patch1%%%%   
-
-
-HDF5 version 1.8.10-patch1 released on 2013-01-22
-================================================================================
-
-INTRODUCTION
-============
-
-This document describes the differences between HDF5-1.8.9 and 
-HDF5 1.8.10, and contains information on the platforms tested and 
-known problems in HDF5-1.8.10. 
-For more details, see the files HISTORY-1_0-1_8_0_rc3.txt 
-and HISTORY-1_8.txt in the release_docs/ directory of the HDF5 source.
-
-Links to the HDF5 1.8.10 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
-
-     http://www.hdfgroup.org/products/hdf5/
-
-The HDF5 1.8.10 release can be obtained from:
-
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
-
-User documentation for 1.8.10 can be accessed directly at this location: 
-
-     http://www.hdfgroup.org/HDF5/doc/
-
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
-
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.10 (current 
-release) versus Release 1.8.9":
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-
-If you have any questions or comments, please send them to the HDF Help Desk:
-
-     help at hdfgroup.org
-
-
-CONTENTS
-========
-
-- New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.10
-- Bug Fixes since HDF5-1.8.9
-- Supported Platforms
-- Supported Configuration Features Summary
-- More Tested Platforms
-- Known Problems
-
-
-New Features
-============
-
-    Configuration
-    -------------
-    - A new tool, cmakehdf5, which is a build command script similar to
-      buildhdf5 is added and is available in the bin directory.
-      (AKC - 2013/01/21)
-
-    Library
-    -------
-    - Updated to latest autotools and changed all hard *.sh scripts to
-      configure managed *.sh.in files. Removed overloading of autotools
-      TESTS variable by examples and tests. Renamed configure.in to
-      configure.ac. (ADB - 2012/08/23 - HDFFV-8129)
-    - The data sieve buffer size was set for all the datasets in the file.  It
-      could waste memory if any dataset size is smaller than the sieve buffer
-      size.  Now the library picks the smaller one between the dataset size
-      and the sieve buffer size from the file access property. See Issue 7934.
-      (SLU - 2012/4/11)
- 
-    Parallel Library
-    ----------------
-    - Added the H5Pget_mpio_no_collective_cause() function that retrieves 
-      reasons why the collective I/O was broken during read/write IO access. 
-      (JKM - 2012/08/30 HDFFV-8143)
-
-    - Added H5Pget_mpio_actual_io_mode_f (MSB - 2012/09/27)
- 
-    Tools
-    -----
-    - h5import: Changed to allow the use of h5dump output as input files to 
-      h5import. h5dump must include the "-p" option to print the properties; 
-      configuration file is captured output of h5dump. The restrictions are 
-      that only one dataset with a simple datatype (integer, floating-point, 
-      or string) can be processed. Integers and floating-point imports from 
-      h5dump must use the "binary" option for the data file. The string version 
-      uses the h5dump "-y --width=1" options to disable the indexing printouts, 
-      print single columns, and obviously NOT use the "binary" option. 
-      (ADB - 2012/07/19 HDFFV-721)
-
-    High-Level APIs
-    ---------------
-    - None
-
-    Fortran API
-    -----------
-    - Fixed a typo in return value of the nh5dread_f_c function (was 1 
-      instead of 0 on success); fixed the return value to make it consistent
-      with other Fortran functions; cleaned debug statements from the code.
-      (EIP - 2012/06/23)
-
-    C++ API
-    -------
-    - None
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-    - None
-
-Bug Fixes since HDF5-1.8.10
-===========================
-    Library
-    -------
-    - The library now behaves correctly when performing large I/O operations on
-      Mac OS-X.  Previously, single I/O operations > 2 GB would fail since the
-      Darwin read/write calls cannot handle the number of bytes that their
-      parameter types imply.
-      Fixes HDFFV-7975 and HDFFV-8240 (DER - 07 JAN 2013)
-    - Fixed a bug in the core VFD that cause failures when opening files > 2 GB.
-      Fixes HDFFV-8124 and HDFFV-8158 (DER - 07 JAN 2013)
-
-    Tools
-    -----
-    - The following h5stat test case failed in BG/P machines (and potentially
-      other machines that display extra output if an MPI task returns with a
-      non-zero code.)
-        Testing h5stat notexist.h5
-      The test script was fixed to ignore the extra output.
-      HDFFV-8233 (AKC - 2012/12/17)
-    - h5diff: Fixed slowness when comparing HDF5 files with many attributes. 
-      Much slower performance was identified with later release version 
-      (from 1.8.7 to 1.8.10) compared to 1.8.6. The issue was introduced 
-      from fixing an attribute related bug for 1.8.7 release in the past.
-      HDFFV-8145 (JKM 2012/12/13)
-
-    Testing
-    -------
-    - None
-
-Bug Fixes since HDF5-1.8.9
-==========================
-
-    Configuration
-    -------------
-    - Fixed configure --enable-production to not use -O optimization for Lion
-      and Mountain Lion systems when gcc (i686-apple-darwin11-llvm-gcc-4.2
-      (GCC) 4.2.1) is used.  Somehow the -O optimization will cause some of
-      the hard conversion code in test/dt_arith.c to fail. HDFFV-8017.
-      (AKC - 2012/10/10)
-    - Fixed AIX Fortran compiler flags to use appropriate settings for
-      debugging, profiling, and optimization situations. HDFFV-8069. 
-      (AKC 2012/09/27)
-
-    Library
-    -------
-    - Fixed a memory leak exposed when inserting/removing a property
-      from a property list several times. HDFFV-8022. (MSC 2012/05/18)
-    - The file_image test will fail in the "initial file image and callbacks in
-      the core VFD" sub-test if the source directory is read-only as the test
-      fails to create its test files in the build directory. This has been
-      fixed. HDFFV-8009 (AKC - 2012/07/06)
-  
-
-    Parallel Library
-    ----------------
-    - The MPI-POSIX VFD was updated to include the POSIX and Windows
-      correctness features added that had already been added to the other VFDs.
-      HDFFV-8058/7845.  (DER 2012/09/17)
-
-    Performance
-    -------------
-    - Removed program perform/benchpar from the enable-build-all list.  The
-      program will be retired or moved to another location.  HDFFV-8156
-      (AKC 2012/10/01)
-    - Retired program perform/mpi-perf. Its purpose has been incorporated
-      into h5perf. (AKC 2012/09/21)
-
-    Tools
-    -----
-    - h5repack: "h5repack -f NONE file1.h5 out.h5" command failed if
-      source file contains chunked dataset and a chunk dim is bigger than 
-      the dataset dim. Another issue is that the command changed max dims
-      if chunk dim is smaller than the dataset dim. These issue occurred 
-      when dataset size is smaller than 64k (compact size limit)  Fixed both.
-      HDFFV-8012 (JKM 2012/09/24)
-    - h5diff: Fixed the counter in verbose mode (-v, -r) so that it will no 
-      longer add together the differences between datasets and the differences 
-      between attributes of those datasets. This change makes the output of 
-      verbose mode consistent for datasets, groups, and committed datatypes. 
-      HDFFV-5919 (JKM 2012/09/10)
-    - h5diff: Fixed the incorrect result when comparing attribute data 
-      values and the data type has the same class but different sizes.
-      HDFFV-7942  (JKM 2012/08/15)
-    - h5dump: Replaced single element fwrite with block writes.
-      HDFFV-1208 (ADB 2012/08/13)
-    - h5diff: Fixed test failure for "make check" due to failure of 
-      copying test files when performed in HDF5 source tree. Also applied
-      to other tools.  HDFFV-8107 (JKM 2012/08/01)
-    - ph5diff: Fixed intermittent hang issue on a certain operation in 
-      parallel mode. It was detected by daily test for comparing 
-      non-comparable objects, but it could have occurred in other 
-      operations depending on machine condition.  HDFFV-8003 (JKM 2012/08/01)
-    - h5diff: Fixed the function COPY_TESTFILES_TO_TESTDIR() of testh5diff.sh
-      to better report when there is an error in the file copying.
-      HDFFV-8105 (AKC 2012/07/22)
-    - h5dump: Fixed the sort by name display to maintain correct parent/child
-      relationships between ascending/descending order.
-      HDFFV-8095 (ADB 2012/07/12)
-    - h5dump: Fixed the display by creation order when using option -n 
-      (print contents).
-      HDFFV-5942 (ADB 2012/07/09)
-    - h5dump: Changed to allow H5T_CSET_UTF8 to be displayed in h5dump output. 
-      Used technique similar to what was done in h5ls (matches library 
-      options).
-      HDFFV-7999 (ADB 2012/05/23)
-    - h5diff: Fixed the tool so that it will not check and display the status 
-      of dangling links without setting the --follow-symlinks option. This 
-      also improved performance when comparing lots of external links without 
-      the --follow-symlinks option.  
-      HDFFV-7998 (JKM 2012/04/26)
-
-    F90 API
-    -------
-    
-    - Fixed a typo in return value of the nh5dread_f_c function (was 1
-      instead of 0 on success); fixed the return value to make it consistent
-      with other Fortran functions; cleaned debug statements from the code.
-      (EIP - 2012/06/23)
-
-    - Fixed a problem writing/reading control characters to a dataset; writing
-      a string containing alerts, backspace, carriage_return, form_feed,
-      horizontal_tab, vertical_tab, or new_line is now tested and working.
-      (MSB - 2012/09/01)
-
-    - Corrected the integer type of H5S_UNLIMITED_F to HSIZE_T (MSB - 2012/09/01)
-
-    - Corrected the number of continuation lines in the src files
-      to be less than 32 lines for F95 compliance. (MSB - 2012/10/01)
-
-    C++ API
-    ------
-    - None
-
-    High-Level APIs:
-    ------
-
-    - Fixed problem with H5TBdelete_record destroying all data following the 
-      deletion of a row. (MSB- 2012/7/26)
-
-    - Fixed H5LTget_attribute_string not closing an object identifier when an 
-      error occurs. (MSB- 2012/7/21)
-
-    - Corrected the return type of H5TBAget_fill from herr_t to htri_t to 
-      reflect that a return value of 1 indicates that a fill value is 
-      present, 0 indicates a fill value is not present, and <0 indicates an 
-      error.
-
-    Fortran High-Level APIs:
-    ------
-    - None
-
-Supported Platforms
-===================
-    AIX 5.3                       xlc 10.1.0.5
-    (NASA G-ADA)                  xlC 10.1.0.5
-                                  xlf90 12.1.0.6
-
-    Linux 2.6.18-308.13.1.el5PAE  GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP i686 i686 i386         compilers for 32-bit applications;
-    (jam)                             Version 4.1.2 20080704 (Red Hat 4.1.2-52)
-                                      Version 4.6.3
-                                  PGI C, Fortran, C++ Compilers for 32-bit
-                                  applications;
-                                      Version 11.9-0
-                                  Intel(R) C, C++, Fortran Compiler for 32-bit
-                                  applications;
-                                      Version 12.1
-                                  MPICH mpich2-1.4.1p1 compiled with
-                                      gcc 4.1.2 and gfortran 4.1.2
-
-    Linux 2.6.18-308.16.1.el5     GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP x86_64 GNU/Linux       compilers for 32-bit applications;
-    (koala)                           Version 4.1.2 20080704 (Red Hat 4.1.2-52)
-                                      Version 4.6.3
-                                  PGI C, Fortran, C++ for 64-bit target on 
-                                  x86-64;
-                                      Version 11.9-0 
-                                      Version 12.5-0
-                                  Intel(R) C, C++, Fortran Compilers for 
-                                  applications running on Intel(R) 64; 
-                                      Version 12.1 (Build 20110811)
-                                      Version 12.1 (Build 20120212)
-                                  MPICH mpich2-1.4.1p1 compiled with
-                                      gcc 4.1.2 and gfortran 4.1.2
-
-    Linux 2.6.32-220.7.1.el6.ppc64 gcc (GCC) 4.4.6 20110731 (Red Hat 4.4.6-3) 
-    #1 SMP ppc64 GNU/Linux        g++ (GCC) 4.4.6 20110731 
-    (ostrich)                     GNU Fortran (GCC) 4.4.6 20110731 (Red Hat 4.4.6-3)
-
-    Linux 2.6.32-220.23.1.1chaos  Intel C, C++, Fortran Compilers
-    ch5.x86_64 GNU/Linux              Version 12.1.5.339
-    (LLNL Aztec)
-
-    IBM Blue Gene/P               XL C for Blue Gene/P, bgxlc V9.0
-    (LLNL uDawn)                  XL C++ for Blue Gene/P, bgxlC V9.0
-                                  XL Fortran for Blue Gene/P, bgxlf90 V11.1
-
-    SunOS 5.10 32- and 64-bit     Sun C 5.9 Sun OS_sparc Patch 124867-16
-    (linew)                       Sun Fortran 95 8.3 Sun OS_sparc Patch 127000-13
-                                  Sun C++ 5.9 Sun OS_sparc Patch 124863-26
-                                  Sun C 5.11 SunOS_sparc
-                                  Sun Fortran 95 8.5 SunOS_sparc
-                                  Sun C++ 5.11 SunOS_sparc
-
-    Windows XP                    Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-
-    Windows XP x64                Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-
-    Windows 7                     Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-                                  Visual Studio 2010 w/ Intel Fortran 12 (cmake)
-                                  Cygwin(CYGWIN_NT-6.1 1.7.15(0.260/5/3) gcc(4.5.3) compiler and gfortran)
-                                  (cmake and autotools)
-
-    Windows 7 x64                 Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-                                  Visual Studio 2010 w/ Intel Fortran 12 (cmake)
-                                  Cygwin(CYGWIN_NT-6.1 1.7.15(0.260/5/3) gcc(4.5.3) compiler and gfortran)
-                                  (cmake and autotools)
-
-    Mac OS X Snow Leopard 10.6.8  gcc i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 from Xcode 3.2.6
-    Darwin Kernel Version 10.8.0  g++ i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 from Xcode 3.2.6
-    (fred)                        gfortran GNU Fortran (GCC) 4.6.2
-                                  Intel C (icc), Fortran (ifort), C++ (icpc)
-                                      12.1.0.038 Build 20110811
-
-    Mac OS X Snow Leopard 10.6.8  gcc i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 from Xcode 3.2.6
-    Darwin Kernel Version 10.8.0  g++ i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 from Xcode 3.2.6
-    Intel 32-bit                  gfortran GNU Fortran (GCC) 4.6.1
-    (tejeda)                      Intel C (icc), Fortran (ifort), C++ (icpc)
-                                      12.1.0.038 Build 20110811
-
-    Mac OS X Lion 10.7.3          gcc i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 from Xcode 4.2.1
-    32- and 64-bit                g++ i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 from Xcode 4.2.1
-    (duck)                        gfortran GNU Fortran (GCC) 4.6.2
-
-    Mac OS X Mountain Lion 10.8.1 cc Apple clang version 4.0 from Xcode 4.5.1
-    (owl)                         c++ Apple clang version 4.0 from Xcode 4.5.1
-				  gcc i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 from Xcode 4.5.1
-				  g++ i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 from Xcode 4.5.1
-    			          gfortran GNU Fortran (GCC) 4.6.2
-
-
-Tested Configuration Features Summary
-=====================================
-
-    In the tables below
-          y   = tested 
-          n   = not tested in this release
-          C   = Cluster
-          W   = Workstation
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                              C         F90/   F90      C++  zlib  SZIP
-                                      parallel  F2003  parallel
-Solaris2.10 32-bit                      n        y/y    n        y    y     y
-Solaris2.10 64-bit                      n        y/n    n        y    y     y
-Windows 7                               y        y/n    n        y    y     y
-Windows 7     x64                       y        y/n    n        y    y     y
-Mac OS X Snow Leopard 10.6.8 32-bit     n        y/y    n        y    y     n 
-Mac OS X Snow Leopard 10.6.8 64-bit     n        y/y    n        y    y     y
-Mac OS X Lion 10.7.3 32-bit             n        y/y    n        y    y     n
-Mac OS X Lion 10.7.3 64-bit             n        y/y    n        y    y     y
-Mac OS X Mountain Lion 10.8.1 64-bit    n        y/n    n        y    y     n
-AIX 5.3 32- and 64-bit                  y        y/n    y        y    y     y
-CentOS 5.5 Linux 2.6.18-308 i686 GNU    y        y/y    y        y    y     y
-CentOS 5.5 Linux 2.6.18-308 i686 Intel  n        y/y    n        y    y     y
-CentOS 5.5 Linux 2.6.18-308 i686 PGI    n        y/y    n        y    y     y
-CentOS 5.5 Linux 2.6.18 x86_64 GNU      y        y/y    y        y    y     y
-CentOS 5.5 Linux 2.6.18 x86_64 Intel    n        y/y    n        y    y     y
-CentOS 5.5 Linux 2.6.18 x86_64 PGI      n        y/y    n        y    y     y
-Linux 2.6.32-220.7.1.el6.ppc64          n        y/n    n        y    y     y
-
-
-Platform                                 Shared  Shared    Shared    Thread-  
-                                         C libs  F90 libs  C++ libs  safe     
-Solaris2.10 32-bit                         y       y         y         y        
-Solaris2.10 64-bit                         n       n         n         n        
-Windows 7                                  y       y         y         y
-Windows 7 x64                              y       y         y         y
-Mac OS X Snow Leopard 10.6.8 32-bit        y       n         y         n        
-Mac OS X Snow Leopard 10.6.8 64-bit        y       n         y         n        
-Mac OS X Lion 10.7.3 32-bit                y       n         y         y        
-Mac OS X Lion 10.7.3 64-bit                y       n         y         y        
-Mac OS X Mountain Lion 10.8.1 64-bit       y       n         y         y        
-AIX 5.3 32- and 64-bit                     n       n         n         y        
-CentOS 5.5 Linux 2.6.18-308 i686 GNU       y       y         y         y        
-CentOS 5.5 Linux 2.6.18-308 i686 Intel     y       y         y         n        
-CentOS 5.5 Linux 2.6.18-308 i686 PGI       y       y         y         n        
-CentOS 5.5 Linux 2.6.18 x86_64 GNU         y       y         y         y        
-CentOS 5.5 Linux 2.6.18 x86_64 Intel       y       y         y         n        
-CentOS 5.5 Linux 2.6.18 x86_64 PGI         y       y         y         n        
-Linux 2.6.32-220.7.1.el6.ppc64             y       y         y         n 
-
-Compiler versions for each platform are listed in the preceding
-"Supported Platforms" table.
-
-
-More Tested Platforms
-=====================
-The following platforms are not supported but have been tested for this release.
-
-    FreeBSD 8.2-STABLE i386       gcc 4.2.1 [FreeBSD] 20070719
-    (loyalty)                     gcc 4.6.1 20110422
-                                  g++ 4.6.1 20110422
-                                  gfortran 4.6.1 20110422
-
-    FreeBSD 8.2-STABLE amd64      gcc 4.2.1 [FreeBSD] 20070719
-    (freedom)                     gcc 4.6.1 20110422
-                                  g++ 4.6.1 20110422
-                                  gfortran 4.6.1 20110422
-
-    Debian6.0.3 2.6.32-5-686 #1 SMP i686 GNU/Linux
-                                  gcc (Debian 4.4.5-8) 4.4.5
-                                  GNU Fortran (Debian 4.4.5-8) 4.4.5
-                                  (cmake and autotools)
-
-    Debian6.0.3 2.6.32-5-amd64 #1 SMP x86_64 GNU/Linux
-                                  gcc (Debian 4.4.5-8) 4.4.5
-                                  GNU Fortran (Debian 4.4.5-8) 4.4.5
-                                  (cmake and autotools)
-
-    Fedora17 3.5.2-1.fc17.i6866 #1 SMP i686 i686 i386 GNU/Linux
-                                  gcc (GCC) 4.7.0 20120507 (Red Hat 4.7.0-5)
-                                  GNU Fortran (GCC) 4.7.0 20120507 (Red Hat 4.7.0-5)
-                                  (cmake and autotools)
-
-    Fedora17 3.5.2-1.fc17.x86_64 #1 SMP x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (GCC) 4.7.0 20120507 (Red Hat 4.7.0-5)
-                                  GNU Fortran (GCC) 4.7.0 20120507 (Red Hat 4.7.0-5)
-                                  (cmake and autotools)
-
-    SUSE 12.2 3.4.6-2.10-desktop #1 SMP PREEMPT i686 i686 i386 GNU/Linux
-                                  gcc (SUSE Linux) 4.7.1
-                                  GNU Fortran (SUSE Linux) 4.7.1
-                                  (cmake and autotools)
-
-    SUSE 12.2 3.4.6-2.10-desktop #1 SMP PREEMPT x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (SUSE Linux) 4.7.1
-                                  GNU Fortran (SUSE Linux) 4.7.1 
-                                  (cmake and autotools)
-
-    Ubuntu 12.04 3.2.0-29-generic #46-Ubuntu SMP i686 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
-                                  GNU Fortran (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
-                                  (cmake and autotools)
-
-    Ubuntu 12.04 3.2.0-29-generic #46-Ubuntu SMP x86_64 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
-                                  GNU Fortran (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
-                                  (cmake and autotools)
-                                  (Use optimization level -O1)
-    
-    Cray Linux Environment (CLE)  PrgEnv-pgi/4.0.46
-    hopper.nersc.gov              pgcc 12.5-0 64-bit target on x86-64 Linux -tp shanghai
-                                  pgf90 12.5-0 64-bit target on x86-64 Linux -tp shanghai
-                                  pgCC 12.5-0 64-bit target on x86-64 Linux -tp shanghai
-    
-
-Known Problems
-==============
-* The C++ and FORTRAN bindings are not currently working on FreeBSD with the
-  native release 8.2 compilers (4.2.1), but are working with gcc 4.6 from the
-  ports (and probably gcc releases after that).
-  (QAK - 2012/10/19)
-
-* The following h5dump test case fails in BG/P machines (and potentially other
-  machines that use a command script to launch executables):
-
-   h5dump --no-compact-subset -d "AHFINDERDIRECT::ah_centroid_t[0] it=0 tl=0"
-     tno-subset.h5
-  
-  This is due to the embedded spaces in the dataset name being interpreted
-  by the command script launcher as meta-characters, thus passing three
-  arguments to h5dump's -d flag. The command passes if run by hand, just
-  not via the test script.
-  (AKC - 2012/05/03)
-
-* On hopper, the build failed when RUNSERIAL and RUNPARALLEL are set
-  to aprun -np X, because the H5lib_settings.c file was not generated
-  properly. Not setting those environment variables works, because
-  configure was able to automatically detect that it's a Cray system
-  and used the proper launch commands when necessary. 
-  (MSC - 2012/04/18)
-
-* The data conversion test dt_arith.c fails in "long double" to integer
-  conversion on Ubuntu 11.10 (3.0.0.13 kernal) with GCC 4.6.1 if the library
-  is built with optimization -O3 or -O2.  The older GCC (4.5) or newer kernal
-  (3.2.2 on Fedora) doesn't have the problem.  Users should lower the 
-  optimization level (-O1 or -O0) by defining CFLAGS in the command line of 
-  "configure" like:
-
-      CFLAGS=-O1 ./configure
-
-  This will overwrite the library's default optimization level.
-  (SLU - 2012/02/07 - HDFFV-7829)
-
-* The STDIO VFD does not work on some architectures, possibly due to 32/64
-  bit or large file issues.  The basic STDIO VFD test is known to fail on
-  64-bit SunOS 5.10 on SPARC when built with -m64 and 32-bit OS X/Darwin
-  10.7.0.  The STDIO VFD test has been disabled while we investigate and
-  a fix should appear in a future release.
-  (DER - 2011/10/14 - HDFFV-8235)
-
-* h5diff can report inconsistent results when comparing datasets of enum type
-  that contain invalid values.  This is due to how enum types are handled in
-  the library and will be addressed in a future release.
-  (DER - 2011/10/14 - HDFFV-7527)
-
-* The links test can fail under the stdio VFD due to some issues with external
-  links.  This will be investigated and fixed in a future release.
-  (DER - 2011/10/14 - HDFFV-7768)
-
-* After the shared library support was fixed for some bugs, it was discovered
-  that "make prefix=XXX install" no longer works for shared libraries. It
-  still works correctly for static libraries. Therefore, if you want to
-  install the HDF5 shared libraries in a location such as /usr/local/hdf5,
-  you need to specify the location via the --prefix option during configure 
-  time. E.g, ./configure --prefix=/usr/local/hdf5 ...
-  (AKC - 2011/05/07 - HDFFV-7583)
-
-* The parallel test, t_shapesame, in testpar/, may run for a long time and may
-  be terminated by the alarm signal.  If that happens, one can increase the
-  alarm seconds (default is 1200 seconds = 20 minutes) by setting the
-  environment variable, $HDF5_ALARM_SECONDS, to a larger value such as 3600
-  (60 minutes).  Note that the t_shapesame test may fail in some systems 
-  (see the "While working on the 1.8.6 release..." problem below).  If 
-  it does, it will waste more time if $HDF5_ALARM_SECONDS is set
-  to a larger value.
-  (AKC - 2011/05/07)
-
-* The C++ and FORTRAN bindings are not currently working on FreeBSD.
-  (QAK - 2011/04/26)
-
-* Shared Fortran libraries are not quite working on AIX. While they are
-  generated when --enable-shared is specified, the fortran and hl/fortran
-  tests fail. We are looking into the issue. HL and C++ shared libraries
-  should now be working as intended, however.
-  (MAM - 2011/04/20)
-
-* The --with-mpe configure option does not work with Mpich2.
-  (AKC - 2011/03/10)
-
-* While working on the 1.8.6 release of HDF5, a bug was discovered that can
-  occur when reading from a dataset in parallel shortly after it has been
-  written to collectively. The issue was exposed by a new test in the parallel
-  HDF5 test suite, but had existed before that. We believe the problem lies with
-  certain MPI implementations and/or file systems.
-
-  We have provided a pure MPI test program, as well as a standalone HDF5
-  program, that can be used to determine if this is an issue on your system.
-  They should be run across multiple nodes with a varying number of processes.
-  These programs can be found at:
-  http://www.hdfgroup.org/ftp/HDF5/examples/known_problems/
-  (NAF - 2011/01/19)
-
-* The library's test dt_arith.c showed a compiler's rounding problem on
-  Cygwin when converting from unsigned long long to long double.  The 
-  library's own conversion works fine.  We defined a macro for Cygwin to
-  skip this test until we can solve the problem.
-  (SLU - 2010/05/05 - HDFFV-1264)
-
-* All the VFL drivers aren't backward compatible.  In H5FDpublic.h, the
-  structure H5FD_class_t changed in 1.8.  There is new parameter added to
-  get_eoa and set_eoa callback functions.  A new callback function
-  get_type_map was added in.  The public function H5FDrealloc was taken
-  out in 1.8.  The problem only happens when users define their own driver
-  for 1.6 and try to plug in 1.8 library.  Because there's only one user 
-  complaining about it, we (Elena, Quincey, and I) decided to leave it as 
-  it is (see bug report #1279).  Quincey will make a plan for 1.10.
-  (SLU - 2010/02/02)
-
-* The --enable-static-exec configure flag will only statically link libraries
-  if the static version of that library is present. If only the shared version
-  of a library exists (i.e., most system libraries on Solaris, AIX, and Mac,
-  for example, only have shared versions), the flag should still result in a 
-  successful compilation, but note that the installed executables will not be 
-  fully static. Thus, the only guarantee on these systems is that the 
-  executable is statically linked with just the HDF5 library.
-  (MAM - 2009/11/04)
-  
-* Parallel tests failed with 16 processes with data inconsistency at testphdf5
-  / dataset_readAll. Parallel tests also failed with 32 and 64 processes with
-  collective abort of all ranks at t_posix_compliant / allwrite_allread_blocks
-  with MPI IO.
-  (CMC - 2009/04/28)
-
-* On an Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  (SLU - 2005/06/30)
-
-
-%%%%1.8.10%%%%   
-
-
-HDF5 version 1.8.10 released on 2012-10-26
-================================================================================
-
-INTRODUCTION
-============
-
-This document describes the differences between HDF5-1.8.9 and 
-HDF5 1.8.10, and contains information on the platforms tested and 
-known problems in HDF5-1.8.10. 
-For more details, see the files HISTORY-1_0-1_8_0_rc3.txt 
-and HISTORY-1_8.txt in the release_docs/ directory of the HDF5 source.
-
-Links to the HDF5 1.8.10 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
-
-     http://www.hdfgroup.org/products/hdf5/
-
-The HDF5 1.8.10 release can be obtained from:
-
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
-
-User documentation for 1.8.10 can be accessed directly at this location: 
-
-     http://www.hdfgroup.org/HDF5/doc/
-
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
-
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.10 (current 
-release) versus Release 1.8.9":
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-
-If you have any questions or comments, please send them to the HDF Help Desk:
-
-     help at hdfgroup.org
-
-
-CONTENTS
-========
-
-- New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.9
-- Supported Platforms
-- Supported Configuration Features Summary
-- More Tested Platforms
-- Known Problems
-
-
-New Features
-============
-
-    Configuration
-    -------------
-    - None
-    
-    Library
-    -------
-    - Updated to latest autotools and changed all hard *.sh scripts to
-      configure managed *.sh.in files. Removed overloading of autotools
-      TESTS variable by examples and tests. Renamed configure.in to
-      configure.ac. (ADB - 2012/08/23 - HDFFV-8129)
-    - The data sieve buffer size was set for all the datasets in the file.  It
-      could waste memory if any dataset size is smaller than the sieve buffer
-      size.  Now the library picks the smaller one between the dataset size
-      and the sieve buffer size from the file access property. See Issue 7934.
-      (SLU - 2012/4/11)
- 
-    Parallel Library
-    ----------------
-    - Added the H5Pget_mpio_no_collective_cause() function that retrieves 
-      reasons why the collective I/O was broken during read/write IO access. 
-      (JKM - 2012/08/30 HDFFV-8143)
-
-    - Added H5Pget_mpio_actual_io_mode_f (MSB - 2012/09/27)
- 
-    Tools
-    -----
-    - h5import: Changed to allow the use of h5dump output as input files to 
-      h5import. h5dump must include the "-p" option to print the properties; 
-      configuration file is captured output of h5dump. The restrictions are 
-      that only one dataset with a simple datatype (integer, floating-point, 
-      or string) can be processed. Integers and floating-point imports from 
-      h5dump must use the "binary" option for the data file. The string version 
-      uses the h5dump "-y --width=1" options to disable the indexing printouts, 
-      print single columns, and obviously NOT use the "binary" option. 
-      (ADB - 2012/07/19 HDFFV-721)
-
-    High-Level APIs
-    ---------------
-    - None
-
-    Fortran API
-    -----------
-    - Fixed a typo in return value of the nh5dread_f_c function (was 1 
-      instead of 0 on success); fixed the return value to make it consistent
-      with other Fortran functions; cleaned debug statements from the code.
-      (EIP - 2012/06/23)
-
-    C++ API
-    -------
-    - None
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-    - None
-
-Bug Fixes since HDF5-1.8.9
-==========================
-
-    Configuration
-    -------------
-    - Fixed configure --enable-production to not use -O optimization for Lion
-      and Mountain Lion systems when gcc (i686-apple-darwin11-llvm-gcc-4.2
-      (GCC) 4.2.1) is used.  Somehow the -O optimization will cause some of
-      the hard conversion code in test/dt_arith.c to fail. HDFFV-8017.
-      (AKC - 2012/10/10)
-    - Fixed AIX Fortran compiler flags to use appropriate settings for
-      debugging, profiling, and optimization situations. HDFFV-8069. 
-      (AKC 2012/09/27)
-
-    Library
-    -------
-    - Fixed a memory leak exposed when inserting/removing a property
-      from a property list several times. HDFFV-8022. (MSC 2012/05/18)
-    - The file_image test will fail in the "initial file image and callbacks in
-      the core VFD" sub-test if the source directory is read-only as the test
-      fails to create its test files in the build directory. This has been
-      fixed. HDFFV-8009 (AKC - 2012/07/06)
-  
-
-    Parallel Library
-    ----------------
-    - The MPI-POSIX VFD was updated to include the POSIX and Windows
-      correctness features added that had already been added to the other VFDs.
-      HDFFV-8058/7845.  (DER 2012/09/17)
-
-    Performance
-    -------------
-    - Removed program perform/benchpar from the enable-build-all list.  The
-      program will be retired or moved to another location.  HDFFV-8156
-      (AKC 2012/10/01)
-    - Retired program perform/mpi-perf. Its purpose has been incorporated
-      into h5perf. (AKC 2012/09/21)
-
-    Tools
-    -----
-    - h5repack: "h5repack -f NONE file1.h5 out.h5" command failed if
-      source file contains chunked dataset and a chunk dim is bigger than 
-      the dataset dim. Another issue is that the command changed max dims
-      if chunk dim is smaller than the dataset dim. These issue occurred 
-      when dataset size is smaller than 64k (compact size limit)  Fixed both.
-      HDFFV-8012 (JKM 2012/09/24)
-    - h5diff: Fixed the counter in verbose mode (-v, -r) so that it will no 
-      longer add together the differences between datasets and the differences 
-      between attributes of those datasets. This change makes the output of 
-      verbose mode consistent for datasets, groups, and committed datatypes. 
-      HDFFV-5919 (JKM 2012/09/10)
-    - h5diff: Fixed the incorrect result when comparing attribute data 
-      values and the data type has the same class but different sizes.
-      HDFFV-7942  (JKM 2012/08/15)
-    - h5dump: Replaced single element fwrite with block writes.
-      HDFFV-1208 (ADB 2012/08/13)
-    - h5diff: Fixed test failure for "make check" due to failure of 
-      copying test files when performed in HDF5 source tree. Also applied
-      to other tools.  HDFFV-8107 (JKM 2012/08/01)
-    - ph5diff: Fixed intermittent hang issue on a certain operation in 
-      parallel mode. It was detected by daily test for comparing 
-      non-comparable objects, but it could have occurred in other 
-      operations depending on machine condition.  HDFFV-8003 (JKM 2012/08/01)
-    - h5diff: Fixed the function COPY_TESTFILES_TO_TESTDIR() of testh5diff.sh
-      to better report when there is an error in the file copying.
-      HDFFV-8105 (AKC 2012/07/22)
-    - h5dump: Fixed the sort by name display to maintain correct parent/child
-      relationships between ascending/descending order.
-      HDFFV-8095 (ADB 2012/07/12)
-    - h5dump: Fixed the display by creation order when using option -n 
-      (print contents).
-      HDFFV-5942 (ADB 2012/07/09)
-    - h5dump: Changed to allow H5T_CSET_UTF8 to be displayed in h5dump output. 
-      Used technique similar to what was done in h5ls (matches library 
-      options).
-      HDFFV-7999 (ADB 2012/05/23)
-    - h5diff: Fixed the tool so that it will not check and display the status 
-      of dangling links without setting the --follow-symlinks option. This 
-      also improved performance when comparing lots of external links without 
-      the --follow-symlinks option.  
-      HDFFV-7998 (JKM 2012/04/26)
-
-    F90 API
-    -------
-    
-    - Fixed a typo in return value of the nh5dread_f_c function (was 1
-      instead of 0 on success); fixed the return value to make it consistent
-      with other Fortran functions; cleaned debug statements from the code.
-      (EIP - 2012/06/23)
-
-    - Fixed a problem writing/reading control characters to a dataset; writing
-      a string containing alerts, backspace, carriage_return, form_feed,
-      horizontal_tab, vertical_tab, or new_line is now tested and working.
-      (MSB - 2012/09/01)
-
-    - Corrected the integer type of H5S_UNLIMITED_F to HSIZE_T (MSB - 2012/09/01)
-
-    - Corrected the number of continuation lines in the src files
-      to be less than 32 lines for F95 compliance. (MSB - 2012/10/01)
-
-    C++ API
-    ------
-    - None
-
-    High-Level APIs:
-    ------
-
-    - Fixed problem with H5TBdelete_record destroying all data following the 
-      deletion of a row. (MSB- 2012/7/26)
-
-    - Fixed H5LTget_attribute_string not closing an object identifier when an 
-      error occurs. (MSB- 2012/7/21)
-
-    - Corrected the return type of H5TBAget_fill from herr_t to htri_t to 
-      reflect that a return value of 1 indicates that a fill value is 
-      present, 0 indicates a fill value is not present, and <0 indicates an 
-      error.
-
-    Fortran High-Level APIs:
-    ------
-    - None
-
-Supported Platforms
-===================
-    AIX 5.3                       xlc 10.1.0.5
-    (NASA G-ADA)                  xlC 10.1.0.5
-                                  xlf90 12.1.0.6
-
-    Linux 2.6.18-308.13.1.el5PAE  GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP i686 i686 i386         compilers for 32-bit applications;
-    (jam)                             Version 4.1.2 20080704 (Red Hat 4.1.2-52)
-                                      Version 4.6.3
-                                  PGI C, Fortran, C++ Compilers for 32-bit
-                                  applications;
-                                      Version 11.9-0
-                                  Intel(R) C, C++, Fortran Compiler for 32-bit
-                                  applications;
-                                      Version 12.1
-                                  MPICH mpich2-1.4.1p1 compiled with
-                                      gcc 4.1.2 and gfortran 4.1.2
-
-    Linux 2.6.18-308.16.1.el5     GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP x86_64 GNU/Linux       compilers for 32-bit applications;
-    (koala)                           Version 4.1.2 20080704 (Red Hat 4.1.2-52)
-                                      Version 4.6.3
-                                  PGI C, Fortran, C++ for 64-bit target on 
-                                  x86-64;
-                                      Version 11.9-0 
-                                      Version 12.5-0
-                                  Intel(R) C, C++, Fortran Compilers for 
-                                  applications running on Intel(R) 64; 
-                                      Version 12.1 (Build 20110811)
-                                      Version 12.1 (Build 20120212)
-                                  MPICH mpich2-1.4.1p1 compiled with
-                                      gcc 4.1.2 and gfortran 4.1.2
-
-    Linux 2.6.32-220.7.1.el6.ppc64 gcc (GCC) 4.4.6 20110731 (Red Hat 4.4.6-3) 
-    #1 SMP ppc64 GNU/Linux        g++ (GCC) 4.4.6 20110731 
-    (ostrich)                     GNU Fortran (GCC) 4.4.6 20110731 (Red Hat 4.4.6-3)
-
-    Linux 2.6.32-220.23.1.1chaos  Intel C, C++, Fortran Compilers
-    ch5.x86_64 GNU/Linux              Version 12.1.5.339
-    (LLNL Aztec)
-
-    IBM Blue Gene/P               XL C for Blue Gene/P, bgxlc V9.0
-    (LLNL uDawn)                  XL C++ for Blue Gene/P, bgxlC V9.0
-                                  XL Fortran for Blue Gene/P, bgxlf90 V11.1
-
-    SunOS 5.10 32- and 64-bit     Sun C 5.9 Sun OS_sparc Patch 124867-16
-    (linew)                       Sun Fortran 95 8.3 Sun OS_sparc Patch 127000-13
-                                  Sun C++ 5.9 Sun OS_sparc Patch 124863-26
-                                  Sun C 5.11 SunOS_sparc
-                                  Sun Fortran 95 8.5 SunOS_sparc
-                                  Sun C++ 5.11 SunOS_sparc
-
-    Windows XP                    Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-
-    Windows XP x64                Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-
-    Windows 7                     Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-                                  Visual Studio 2010 w/ Intel Fortran 12 (cmake)
-                                  Cygwin(CYGWIN_NT-6.1 1.7.15(0.260/5/3) gcc(4.5.3) compiler and gfortran)
-                                  (cmake and autotools)
-
-    Windows 7 x64                 Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-                                  Visual Studio 2010 w/ Intel Fortran 12 (cmake)
-                                  Cygwin(CYGWIN_NT-6.1 1.7.15(0.260/5/3) gcc(4.5.3) compiler and gfortran)
-                                  (cmake and autotools)
-
-    Mac OS X Snow Leopard 10.6.8  gcc i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 from Xcode 3.2.6
-    Darwin Kernel Version 10.8.0  g++ i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 from Xcode 3.2.6
-    (fred)                        gfortran GNU Fortran (GCC) 4.6.2
-                                  Intel C (icc), Fortran (ifort), C++ (icpc)
-                                      12.1.0.038 Build 20110811
-
-    Mac OS X Snow Leopard 10.6.8  gcc i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 from Xcode 3.2.6
-    Darwin Kernel Version 10.8.0  g++ i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 from Xcode 3.2.6
-    Intel 32-bit                  gfortran GNU Fortran (GCC) 4.6.1
-    (tejeda)                      Intel C (icc), Fortran (ifort), C++ (icpc)
-                                      12.1.0.038 Build 20110811
-
-    Mac OS X Lion 10.7.3          gcc i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 from Xcode 4.2.1
-    32- and 64-bit                g++ i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 from Xcode 4.2.1
-    (duck)                        gfortran GNU Fortran (GCC) 4.6.2
-
-    Mac OS X Mountain Lion 10.8.1 cc Apple clang version 4.0 from Xcode 4.5.1
-    (owl)                         c++ Apple clang version 4.0 from Xcode 4.5.1
-				  gcc i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 from Xcode 4.5.1
-				  g++ i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 from Xcode 4.5.1
-    			          gfortran GNU Fortran (GCC) 4.6.2
-
-
-Tested Configuration Features Summary
-=====================================
-
-    In the tables below
-          y   = tested 
-          n   = not tested in this release
-          C   = Cluster
-          W   = Workstation
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                              C         F90/   F90      C++  zlib  SZIP
-                                      parallel  F2003  parallel
-Solaris2.10 32-bit                      n        y/y    n        y    y     y
-Solaris2.10 64-bit                      n        y/n    n        y    y     y
-Windows 7                               y        y/n    n        y    y     y
-Windows 7     x64                       y        y/n    n        y    y     y
-Mac OS X Snow Leopard 10.6.8 32-bit     n        y/y    n        y    y     n 
-Mac OS X Snow Leopard 10.6.8 64-bit     n        y/y    n        y    y     y
-Mac OS X Lion 10.7.3 32-bit             n        y/y    n        y    y     n
-Mac OS X Lion 10.7.3 64-bit             n        y/y    n        y    y     y
-Mac OS X Mountain Lion 10.8.1 64-bit    n        y/n    n        y    y     n
-AIX 5.3 32- and 64-bit                  y        y/n    y        y    y     y
-CentOS 5.5 Linux 2.6.18-308 i686 GNU    y        y/y    y        y    y     y
-CentOS 5.5 Linux 2.6.18-308 i686 Intel  n        y/y    n        y    y     y
-CentOS 5.5 Linux 2.6.18-308 i686 PGI    n        y/y    n        y    y     y
-CentOS 5.5 Linux 2.6.18 x86_64 GNU      y        y/y    y        y    y     y
-CentOS 5.5 Linux 2.6.18 x86_64 Intel    n        y/y    n        y    y     y
-CentOS 5.5 Linux 2.6.18 x86_64 PGI      n        y/y    n        y    y     y
-Linux 2.6.32-220.7.1.el6.ppc64          n        y/n    n        y    y     y
-
-
-Platform                                 Shared  Shared    Shared    Thread-  
-                                         C libs  F90 libs  C++ libs  safe     
-Solaris2.10 32-bit                         y       y         y         y        
-Solaris2.10 64-bit                         n       n         n         n        
-Windows 7                                  y       y         y         y
-Windows 7 x64                              y       y         y         y
-Mac OS X Snow Leopard 10.6.8 32-bit        y       n         y         n        
-Mac OS X Snow Leopard 10.6.8 64-bit        y       n         y         n        
-Mac OS X Lion 10.7.3 32-bit                y       n         y         y        
-Mac OS X Lion 10.7.3 64-bit                y       n         y         y        
-Mac OS X Mountain Lion 10.8.1 64-bit       y       n         y         y        
-AIX 5.3 32- and 64-bit                     n       n         n         y        
-CentOS 5.5 Linux 2.6.18-308 i686 GNU       y       y         y         y        
-CentOS 5.5 Linux 2.6.18-308 i686 Intel     y       y         y         n        
-CentOS 5.5 Linux 2.6.18-308 i686 PGI       y       y         y         n        
-CentOS 5.5 Linux 2.6.18 x86_64 GNU         y       y         y         y        
-CentOS 5.5 Linux 2.6.18 x86_64 Intel       y       y         y         n        
-CentOS 5.5 Linux 2.6.18 x86_64 PGI         y       y         y         n        
-Linux 2.6.32-220.7.1.el6.ppc64             y       y         y         n 
-
-Compiler versions for each platform are listed in the preceding
-"Supported Platforms" table.
-
-
-More Tested Platforms
-=====================
-The following platforms are not supported but have been tested for this release.
-
-    FreeBSD 8.2-STABLE i386       gcc 4.2.1 [FreeBSD] 20070719
-    (loyalty)                     gcc 4.6.1 20110422
-                                  g++ 4.6.1 20110422
-                                  gfortran 4.6.1 20110422
-
-    FreeBSD 8.2-STABLE amd64      gcc 4.2.1 [FreeBSD] 20070719
-    (freedom)                     gcc 4.6.1 20110422
-                                  g++ 4.6.1 20110422
-                                  gfortran 4.6.1 20110422
-
-    Debian6.0.3 2.6.32-5-686 #1 SMP i686 GNU/Linux
-                                  gcc (Debian 4.4.5-8) 4.4.5
-                                  GNU Fortran (Debian 4.4.5-8) 4.4.5
-                                  (cmake and autotools)
-
-    Debian6.0.3 2.6.32-5-amd64 #1 SMP x86_64 GNU/Linux
-                                  gcc (Debian 4.4.5-8) 4.4.5
-                                  GNU Fortran (Debian 4.4.5-8) 4.4.5
-                                  (cmake and autotools)
-
-    Fedora17 3.5.2-1.fc17.i6866 #1 SMP i686 i686 i386 GNU/Linux
-                                  gcc (GCC) 4.7.0 20120507 (Red Hat 4.7.0-5)
-                                  GNU Fortran (GCC) 4.7.0 20120507 (Red Hat 4.7.0-5)
-                                  (cmake and autotools)
-
-    Fedora17 3.5.2-1.fc17.x86_64 #1 SMP x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (GCC) 4.7.0 20120507 (Red Hat 4.7.0-5)
-                                  GNU Fortran (GCC) 4.7.0 20120507 (Red Hat 4.7.0-5)
-                                  (cmake and autotools)
-
-    SUSE 12.2 3.4.6-2.10-desktop #1 SMP PREEMPT i686 i686 i386 GNU/Linux
-                                  gcc (SUSE Linux) 4.7.1
-                                  GNU Fortran (SUSE Linux) 4.7.1
-                                  (cmake and autotools)
-
-    SUSE 12.2 3.4.6-2.10-desktop #1 SMP PREEMPT x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (SUSE Linux) 4.7.1
-                                  GNU Fortran (SUSE Linux) 4.7.1 
-                                  (cmake and autotools)
-
-    Ubuntu 12.04 3.2.0-29-generic #46-Ubuntu SMP i686 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
-                                  GNU Fortran (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
-                                  (cmake and autotools)
-
-    Ubuntu 12.04 3.2.0-29-generic #46-Ubuntu SMP x86_64 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
-                                  GNU Fortran (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
-                                  (cmake and autotools)
-                                  (Use optimization level -O1)
-    
-    Cray Linux Environment (CLE)  PrgEnv-pgi/4.0.46
-    hopper.nersc.gov              pgcc 12.5-0 64-bit target on x86-64 Linux -tp shanghai
-                                  pgf90 12.5-0 64-bit target on x86-64 Linux -tp shanghai
-                                  pgCC 12.5-0 64-bit target on x86-64 Linux -tp shanghai
-    
-
-Known Problems
-==============
-* The following h5stat test case fails in BG/P machines (and potentially other
-  machines that display extra output if an MPI task returns with a non-zero
-  code.)
-    Testing h5stat notexist.h5
-  
-  The test actually runs and passes as expected. It is the extra output from
-  the MPI process that causes the test script to fail. This will be fixed
-  in the next release.  (AKC - 2012/10/25 - HDFFV-8233)
-
-* The C++ and FORTRAN bindings are not currently working on FreeBSD with the
-  native release 8.2 compilers (4.2.1), but are working with gcc 4.6 from the
-  ports (and probably gcc releases after that).
-  (QAK - 2012/10/19)
-
-* The following h5dump test case fails in BG/P machines (and potentially other
-  machines that use a command script to launch executables):
-
-   h5dump --no-compact-subset -d "AHFINDERDIRECT::ah_centroid_t[0] it=0 tl=0"
-     tno-subset.h5
-  
-  This is due to the embedded spaces in the dataset name being interpreted
-  by the command script launcher as meta-characters, thus passing three
-  arguments to h5dump's -d flag. The command passes if run by hand, just
-  not via the test script.
-  (AKC - 2012/05/03)
-
-* On hopper, the build failed when RUNSERIAL and RUNPARALLEL are set
-  to aprun -np X, because the H5lib_settings.c file was not generated
-  properly. Not setting those environment variables works, because
-  configure was able to automatically detect that it's a Cray system
-  and used the proper launch commands when necessary. 
-  (MSC - 2012/04/18)
-
-* The data conversion test dt_arith.c fails in "long double" to integer
-  conversion on Ubuntu 11.10 (3.0.0.13 kernal) with GCC 4.6.1 if the library
-  is built with optimization -O3 or -O2.  The older GCC (4.5) or newer kernal
-  (3.2.2 on Fedora) doesn't have the problem.  Users should lower the 
-  optimization level (-O1 or -O0) by defining CFLAGS in the command line of 
-  "configure" like:
-
-      CFLAGS=-O1 ./configure
-
-  This will overwrite the library's default optimization level.
-  (SLU - 2012/02/07 - HDFFV-7829)
-
-* The STDIO VFD does not work on some architectures, possibly due to 32/64
-  bit or large file issues.  The basic STDIO VFD test is known to fail on
-  64-bit SunOS 5.10 on SPARC when built with -m64 and 32-bit OS X/Darwin
-  10.7.0.  The STDIO VFD test has been disabled while we investigate and
-  a fix should appear in a future release.
-  (DER - 2011/10/14 - HDFFV-8235)
-
-* h5diff can report inconsistent results when comparing datasets of enum type
-  that contain invalid values.  This is due to how enum types are handled in
-  the library and will be addressed in a future release.
-  (DER - 2011/10/14 - HDFFV-7527)
-
-* The links test can fail under the stdio VFD due to some issues with external
-  links.  This will be investigated and fixed in a future release.
-  (DER - 2011/10/14 - HDFFV-7768)
-
-* After the shared library support was fixed for some bugs, it was discovered
-  that "make prefix=XXX install" no longer works for shared libraries. It
-  still works correctly for static libraries. Therefore, if you want to
-  install the HDF5 shared libraries in a location such as /usr/local/hdf5,
-  you need to specify the location via the --prefix option during configure 
-  time. E.g, ./configure --prefix=/usr/local/hdf5 ...
-  (AKC - 2011/05/07 - HDFFV-7583)
-
-* The parallel test, t_shapesame, in testpar/, may run for a long time and may
-  be terminated by the alarm signal.  If that happens, one can increase the
-  alarm seconds (default is 1200 seconds = 20 minutes) by setting the
-  environment variable, $HDF5_ALARM_SECONDS, to a larger value such as 3600
-  (60 minutes).  Note that the t_shapesame test may fail in some systems 
-  (see the "While working on the 1.8.6 release..." problem below).  If 
-  it does, it will waste more time if $HDF5_ALARM_SECONDS is set
-  to a larger value.
-  (AKC - 2011/05/07)
-
-* The C++ and FORTRAN bindings are not currently working on FreeBSD.
-  (QAK - 2011/04/26)
-
-* Shared Fortran libraries are not quite working on AIX. While they are
-  generated when --enable-shared is specified, the fortran and hl/fortran
-  tests fail. We are looking into the issue. HL and C++ shared libraries
-  should now be working as intended, however.
-  (MAM - 2011/04/20)
-
-* The --with-mpe configure option does not work with Mpich2.
-  (AKC - 2011/03/10)
-
-* While working on the 1.8.6 release of HDF5, a bug was discovered that can
-  occur when reading from a dataset in parallel shortly after it has been
-  written to collectively. The issue was exposed by a new test in the parallel
-  HDF5 test suite, but had existed before that. We believe the problem lies with
-  certain MPI implementations and/or file systems.
-
-  We have provided a pure MPI test program, as well as a standalone HDF5
-  program, that can be used to determine if this is an issue on your system.
-  They should be run across multiple nodes with a varying number of processes.
-  These programs can be found at:
-  http://www.hdfgroup.org/ftp/HDF5/examples/known_problems/
-  (NAF - 2011/01/19)
-
-* The library's test dt_arith.c showed a compiler's rounding problem on
-  Cygwin when converting from unsigned long long to long double.  The 
-  library's own conversion works fine.  We defined a macro for Cygwin to
-  skip this test until we can solve the problem.
-  (SLU - 2010/05/05 - HDFFV-1264)
-
-* All the VFL drivers aren't backward compatible.  In H5FDpublic.h, the
-  structure H5FD_class_t changed in 1.8.  There is new parameter added to
-  get_eoa and set_eoa callback functions.  A new callback function
-  get_type_map was added in.  The public function H5FDrealloc was taken
-  out in 1.8.  The problem only happens when users define their own driver
-  for 1.6 and try to plug in 1.8 library.  Because there's only one user 
-  complaining about it, we (Elena, Quincey, and I) decided to leave it as 
-  it is (see bug report #1279).  Quincey will make a plan for 1.10.
-  (SLU - 2010/02/02)
-
-* The --enable-static-exec configure flag will only statically link libraries
-  if the static version of that library is present. If only the shared version
-  of a library exists (i.e., most system libraries on Solaris, AIX, and Mac,
-  for example, only have shared versions), the flag should still result in a 
-  successful compilation, but note that the installed executables will not be 
-  fully static. Thus, the only guarantee on these systems is that the 
-  executable is statically linked with just the HDF5 library.
-  (MAM - 2009/11/04)
-  
-* Parallel tests failed with 16 processes with data inconsistency at testphdf5
-  / dataset_readAll. Parallel tests also failed with 32 and 64 processes with
-  collective abort of all ranks at t_posix_compliant / allwrite_allread_blocks
-  with MPI IO.
-  (CMC - 2009/04/28)
-
-* On an Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  (SLU - 2005/06/30)
-
-
-%%%%1.8.9%%%%   
-
-
-HDF5 version 1.8.9 released on 2012-05-09
-================================================================================
-
-INTRODUCTION
-============
-
-This document describes the differences between HDF5-1.8.8 and 
-HDF5 1.8.9. It also contains information on the platforms tested and 
-known problems in HDF5-1.8.9. 
-
-For more details, see the files HISTORY-1_0-1_8_0_rc3.txt 
-and HISTORY-1_8.txt in the release_docs/ directory of the HDF5 source.
-
-Links to the HDF5 1.8.9 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
-
-     http://www.hdfgroup.org/products/hdf5/
-
-The HDF5 1.8.9 release can be obtained from:
-
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
-
-User documentation for 1.8.9 can be accessed directly at this location: 
-
-     http://www.hdfgroup.org/HDF5/doc/
-
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
-
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.9 (current 
-release) versus Release 1.8.8":
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-
-If you have any questions or comments, please send them to the HDF Help Desk:
-
-     help at hdfgroup.org
-
-
-CONTENTS
-========
-
-- New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.8
-- Platforms Tested
-- Supported Configuration Features Summary
-- Known Problems
-
-
-New Features
-============
-
-    Configuration
-    -------------
-    - None
-    
-    Library
-    -------
-    - Added new feature to merge committed datatypes when copying objects,
-      using new H5O_COPY_MERGE_COMMITTED_DTYPE_FLAG, modified by new API
-      routines: H5Padd_merge_committed_dtype_path(),
-      H5Pfree_merge_committed_dtype_paths(), H5Pset_mcdt_search_cb() and
-      H5Pget_mcdt_search_cb().  (QAK - 2012/03/30)
-    - Added new feature which allows working with files in memory in the 
-      same ways files are worked with on disk. New API routines include 
-      H5Pset_file_image, H5Pget_file_image, H5Pset_file_image_callbacks, 
-      H5Pget_file_image_callbacks, H5Fget_file_image, and 
-      H5LTopen_file_image. (QAK - 2012/04/17)
- 
-    Parallel Library
-    ----------------
-    - Corrected memory allocation error in MPI datatype construction code.
-      (QAK - 2012/04/23)
-    - Add two new routines to set/get the atomicity parameter in the
-      MPI library to perform atomic operations. Some file systems (for
-      example PVFS2) do not support atomic updates, so those routines
-      would not be supported. (MSC - 2012/03/27 - HDFFV-7961)
- 
-    Tools
-    -----
-    - h5repack: Added ability to set the metadata block size of the output
-      file, with the '-M'/'--metadata_block_size' command line parameter.
-      (QAK - 2012/03/30)
-    - h5stat: Added ability to display a summary of the file space usage for a
-      file, with the '-S'/'--summary' command line parameter.  (QAK - 2012/03/28)
-    - h5dump: Added capability for "-a" option to show attributes containing "/" 
-      by using an escape character. For example, for a dataset "/dset" 
-      containing attribute "speed(m/h)", use "h5dump -a "/dset/speed(\/h)" 
-      to show the content of the attribute. (PC - 2012/03/12 - HDFFV-7523)
-    - h5dump: Added ability to apply command options across multiple files using a
-      wildcard in the filename. Unix example; "h5dump -H -d Dataset1 tarr*.h5".
-      Cross platform example; "h5dump -H -d Dataset1 tarray1.h5 tarray2.h5 tarray3.h5".
-      (ADB - 2012/03/12 - HDFFV-7876).
-    - h5dump: Added new option --no-compact-subset. This option will not
-      interpret the '[' character as starting the compact form of 
-      subsetting. This is useful when the "h5dump error: unable to 
-      open dataset "datset_name"" message is output because a dataset
-      name contains a '[' character. (ADB - 2012/03/05 - HDFFV-7689).
-    - h5repack: Improved performance for big chunked datasets (size > 128MB)
-      when used with the layout (-l) or compression (-f) options. 
-      Before this change, repacking datasets with chunks with a large first 
-      dimension would take extremely long. For example, repacking a dataset 
-      with chunk dimensions of 1024x5x1 might take many hours to process 
-      while changing a dataset with chunk dimensions set to 1x5x1024 
-      might take under an hour. After this change, processing the dataset 
-      with chunk dimensions of 1024x5x1 takes about 15 minutes, and processing 
-      a dataset with chunk dimensions of 1x5x1024 takes about 14 minutes.
-      (JKM - 2012/03/01 - HDFFV-7862) 
-
-    High-Level APIs
-    ---------------
-    - New API: H5LTpath_valid (Fortran: h5ltpath_valid_f) checks
-      if a path is correct, determines if a link resolves to a valid
-      object, and checks that the link does not dangle. (MSB - 2012/03/15)
-
-    Fortran API
-    -----------
-
-    - Added for the C API the Fortran wrapper:
-       h5ocopy_f (MSB - 2012/03/22)
-
-    C++ API
-    -------
-    - None
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-    - None
-
-Bug Fixes since HDF5-1.8.8
-==========================
-
-    Configuration
-    -------------
-    - Fixed Makefile issue in which "-Wl," was not properly specified
-      prior to -rpath when building parallel Fortran libraries with
-      an Intel compiler. (MAM - 2012/03/26) 
-    - Makefiles generated by other packages using h5cc as the compiler
-      no longer error when 'make' is invoked more than once in order
-      to 'rebuild' after changes to source. (MAM - 2012/03/26)
-    - Added code to display the version information of XL Fortran and C++
-      in the summary of configure. (AKC - 2012/02/28 - HDFFV-7793)
-    - Updated all CMakeLists.txt files to indicate the minimum CMake version is
-      the current standard of 2.8.6 (ADB - 2011/12/05 - HDFFV-7854)
-
-    Library
-    -------
-    - Windows and STDIO correctness changes have been propagated from the SEC2
-      and old Windows drivers to the STDIO VFD.  (DER - 2012/03/30 - HDFFV-7917)
-    - Fixed an error that would occur when copying an object with attribute
-      creation order tracked and indexed. (NAF - 2012/03/28 - HDFFV-7762)
-    - Fixed a bug in H5Ocopy(): When copying an opened object, call the
-      object's flush class action to ensure that cached data is flushed so
-      that H5Ocopy will get the correct data.  (VC - 2012/03/27 - HDFFV-7853)
-    - The istore test will now skip the sparse 50x50x50 test when the VFD does
-      not support sparse files on that platform.  The most important platforms
-      on which this will be skipped are Windows (NTFS sparse files are not
-      supported) and Mac OS-X (HFS sparse files are not supported).  This
-      fixes CTest timeout issues on Windows.  (DER - 2012/03/27 - HDFFV-7769)
-    - Windows and POSIX correctness changes have been propagated from the SEC2
-      VFD to the Core VFD.  This mainly affects file operations on the
-      driver's backing store and fixes a problem on Windows where large files
-      could not be read. (DER - 2012/03/27 - HDFFV-7916 - HDFFV-7603)
-    - When an application tries to write or read many small data chunks and
-      runs out of memory, the library had a segmentation fault.  The fix is to
-      return the error stack with proper information.
-      (SLU - 2012/03/23 - HDFFV-7785)
-    - H5Pset_data_transform had a segmentation fault in some cases like x*-100.  
-      It works correctly now and handles other cases like 100-x or 2/x.
-      (SLU - 2012/03/15 - HDFFV-7922)
-    - Fixed rare corruption bugs that could occur when using the new object
-      header format. (NAF - 2012/03/15 - HDFFV-7879)
-    - Fixed an error that occurred when creating a contiguous dataset with a 
-      zero-sized dataspace and space allocation time set to 'early'. 
-      (QAK - 2012/03/12)
-    - Changed Windows thread creation to use _beginthread() instead of
-      CreateThread().  Threads created by the latter can be killed in
-      low-memory situations. (DER - 2012/02/10 - HDFFV-7780)
-    - Creating a dataset in a read-only file caused a segmentation fault when 
-      the file is closed.  It's fixed. The attempt to create a dataset will 
-      fail with an error indicating the file is read-only.
-      (SLU - 2012/01/25 - HDFFV-7756) 
-    - Fixed a segmentation fault that could occur when shrinking a dataset 
-      with chunks larger than 1 MB. (NAF - 2011/11/30 - HDFFV-7833)
-    - Fixed a bug that could cause H5Oget_info to return the wrong address
-      after copying a committed (named) datatype. (NAF - 2011/11/14)
-    - The library allowed the conversion of strings between ASCII and UTF8
-      We have corrected it to report an error under this situation.
-      (SLU - 2011/11/8 - HDFFV-7582)
-    - Fixed a segmentation fault when the library tried to shrink the size 
-      of a compound datatype through H5Tset_size immediately after the 
-      datatype was created. (SLU - 2011/11/4 - HDFFV-7618)
-
-    Parallel Library
-    ----------------
-    - None
-
-    Tools
-    -----
-    - h5unjam: Fixed a segmentation fault that occurred when h5unjam was used 
-      with the -V (show version) option. (JKM - 2012/04/19 - HDFFV-8001)
-    - h5repack: Fixed a failure that occurred when repacking the chunk size 
-      of a specified chunked dataset with unlimited max dims. 
-      (JKM - 2012/04/11 - HDFFV-7993) 
-    - h5diff: Fixed a failure when comparing groups. Before the fix, if an 
-      object in a group was compared with an object in another group where 
-      both had the same name but the object type was different, then h5diff
-      would fail. After the fix, h5diff detects such cases as non-comparable
-      and displays appropriate error messages. 
-      (JKM - 2012/03/28 - HDFFV-7644)
-    - h5diff: If unique objects exist only in one file and if h5diff is set to 
-      exclude the unique objects with the --exclude-path option, then h5diff 
-      might miss excluding some objects. This was fixed to correctly exclude 
-      objects. (JKM - 2012/03/20 - HDFFV-7837)
-    - h5diff: When two symbolic dangling links are compared with the 
-      --follow-symlinks option, the result should be the same. This worked when 
-      comparing two files, but didn't work when comparing two objects.
-      h5diff now works when comparing two objects.
-      (JKM - 2012/03/09 - HDFFV-7835)
-    - h5dump: Added the tools library error stack to properly catch error
-      information generated within the library. (ADB - 2012/03/12 - HDFFV-7958)
-    - h5dump: Changed the process where an open link used to fail. Now dangling 
-      links no longer throw error messages. (ADB - 2012/03/12 - HDFFV-7839)
-    - h5dump: Refactored code to remove duplicated functions. Split XML 
-      functions from DDL functions. Corrected indentation and formatting
-      errors. Also fixed subsetting counting overflow (HDFFV-5874). Verified
-      all tools call tools_init() in main. The USER_BLOCK data now correctly
-      displays within the SUPER_BLOCK info. NOTE: WHITESPACE IN THE OUTPUT
-      HAS CHANGED. (ADB - 2012/02/17 - HDFFV-7560)
-    - h5diff: Fixed to prevent from displaying error stack message when 
-      comparing two dangling symbolic links with the follow-symlinks option.
-      (JKM - 2012/01/13 - HDFFV-7836)
-    - h5repack: Fixed a memory leak that occurred with the handling of 
-      variable length strings in attributes.
-      (JKM - 2012/01/10 - HDFFV-7840)
-    - h5ls: Fixed a segmentation fault that occurred when accessing region 
-      reference data in an attribute. (JKM - 2012/01/06 - HDFFV-7838)
-
-    F90 API
-    -------
-    - None
-
-    C++ API
-    ------
-    - None
-
-    High-Level APIs:
-    ------
-    - None
-
-    Fortran High-Level APIs:
-    ------
-    - h5ltget_attribute_string_f: The h5ltget_attribute_string_f used to return 
-      the C NULL character in the returned character buffer. The returned 
-      charactor buffer now does not return the C NULL character; the buffer 
-      is blank-padded if needed. (MSB - 2012/03/23)
-
-
-Platforms Tested
-================
-The following platforms and compilers have been tested for this release.
-
-    AIX 5.3                       xlc 10.1.0.5
-    (NASA G-ADA)                  xlC 10.1.0.5
-                                  xlf90 12.1.0.6
-
-    FreeBSD 8.2-STABLE i386       gcc 4.2.1 [FreeBSD] 20070719
-    (loyalty)                     g++ 4.2.1 [FreeBSD] 20070719
-                                  gcc 4.6.1 20110422
-                                  g++ 4.6.1 20110422
-                                  gfortran 4.6.1 20110422
-
-    FreeBSD 8.2-STABLE amd64      gcc 4.2.1 [FreeBSD] 20070719
-    (freedom)                     g++ 4.2.1 [FreeBSD] 20070719
-                                  gcc 4.6.1 20110422
-                                  g++ 4.6.1 20110422
-                                  gfortran 4.6.1 20110422
-
-    Linux 2.6.18-194.3.1.el5PAE   GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP i686 i686 i386         compilers for 32-bit applications;
-    (jam)                             Version 4.1.2 20080704 (Red Hat 4.1.2-52)
-                                      Version 4.5.2
-                                  PGI C, Fortran, C++ Compilers for 32-bit
-                                  applications;
-                                      Version 11.8-0
-                                      Version 11.9-0
-                                  Intel(R) C, C++, Fortran Compiler for 32-bit
-                                  applications;
-                                      Version 12.0
-                                      Version 12.1
-                                  MPICH mpich2-1.3.1 compiled with
-                                      gcc 4.1.2 and gfortran 4.1.2
-
-    Linux 2.6.18-308.1.1.el5      GNU C (gcc), Fortran (gfortran), C++ (g++)
-    #1 SMP x86_64 GNU/Linux       compilers for 32-bit applications;
-    (koala)                           Version 4.1.2 20080704 (Red Hat 4.1.2-52)
-                                      Version 4.5.2
-                                  PGI C, Fortran, C++ for 64-bit target on 
-                                  x86-64;
-                                      Version 11.9-0 (64-bit)
-                                      Version 11.8-0 (32-bit)
-                                  Intel(R) C, C++, Fortran Compilers for 
-                                  applications running on Intel(R) 64; 
-                                      Version 12.0
-                                      Version 12.1
-                                  MPICH mpich2-1.3.1 compiled with
-                                      gcc 4.1.2 and gfortran 4.1.2
-
-    Linux 2.6.32-220.7.1.el6.ppc64 gcc (GCC) 4.4.6 20110731 (Red Hat 4.4.6-3) 
-    #1 SMP ppc64 GNU/Linux        g++ (GCC) 4.4.6 20110731 
-    (ostrich)                     GNU Fortran (GCC) 4.4.6 20110731 (Red Hat 4.4.6-3)
-
-    Linux 2.6.18-108chaos         Intel C, C++, Fortran Compilers Version 11.1
-    #1 SMP x86_64 GNU/Linux
-    (LLNL Aztec)
-
-    IBM Blue Gene/P               XL C for Blue Gene/P, bgxlc V9.0
-    (LLNL uDawn)                  XL C++ for Blue Gene/P, bgxlC V9.0
-                                  XL Fortran for Blue Gene/P, bgxlf0 V11.1
-
-    SunOS 5.10 32- and 64-bit     Sun C 5.9 Sun OS_sparc Patch 124867-16
-    (linew)                       Sun Fortran 95 8.3 Sun OS_sparc Patch 127000-13
-                                  Sun C++ 5.9 Sun OS_sparc Patch 124863-26
-                                  Sun C 5.11 SunOS_sparc
-                                  Sun Fortran 95 8.5 SunOS_sparc
-                                  Sun C++ 5.11 SunOS_sparc
-
-    SGI Altix UV                  Intel(R) C, Fortran Compilers
-    SGI ProPack 7 Linux               Version 11.1 20100806
-    2.6.32.24-0.2.1.2230.2.PTF-   SGI MPT 2.02
-    default #1 SMP                
-    (NCSA ember)
-
-    Dell NVIDIA Cluster           Intel(R) C, Fortran Compilers
-    Red Hat Enterprise Linux 6        Version 12.0.4 20110427
-    2.6.32-131.4.1.el6.x86_64     mvapich2 1.7rc1-intel-12.0.4
-    (NCSA forge)
-
-    Windows XP                    Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-                                  Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-                                  Visual Studio 2010 w/ Intel Fortran 12 (cmake)
-
-    Windows XP x64                Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-                                  Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-                                  Visual Studio 2010 w/ Intel Fortran 12 (cmake)
-
-    Windows 7                     Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-                                  Visual Studio 2010 w/ Intel Fortran 12 (cmake)
-                                  Cygwin(1.7.9 native gcc(4.5.3) compiler and gfortran)
-
-    Windows 7 x64                 Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-                                  Visual Studio 2010 w/ Intel Fortran 12 (cmake)
-                                  Cygwin(1.7.9 native gcc(4.5.3) compiler and gfortran)
-
-    Mac OS X Snow Leopard 10.6.8  i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (gcc)
-    Darwin Kernel Version 10.8.0  i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (g++)
-    Intel 64-bit                      (Apple Inc. build 5666) (dot 3)
-    (fred)                        GNU Fortan (GCC) 4.6.1 (gfortran)
-                                  Intel C (icc), Fortran (ifort), C++ (icpc)
-                                      12.1.0.038 Build 20110811
-
-    Mac OS X Snow Leopard 10.6.8  i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (gcc)
-    Darwin Kernel Version 10.8.0  i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (g++)
-    Intel 32-bit                      (Apple Inc. build 5666) (dot 3)
-    (tejeda)                      GNU Fortran (GCC) 4.6.1 (gfortran)
-                                  Intel C (icc), Fortran (ifort), C++ (icpc)
-                                      12.1.0.038 Build 20110811
-
-    Mac OS X Lion 10.7.3          GCC 4.2.1 gcc
-    32- and 64-bit                GNU Fortran (GCC) 4.6.1 gfortran
-    (duck)                        GCC 4.2.1. g++
-
-    Debian6.0.3 2.6.32-5-686 #1 SMP i686 GNU/Linux
-                                  gcc (Debian 4.4.5-8) 4.4.5
-                                  GNU Fortran (Debian 4.4.5-8) 4.4.5
-
-    Debian6.0.3 2.6.32-5-amd64 #1 SMP x86_64 GNU/Linux
-                                  gcc (Debian 4.4.5-8) 4.4.5
-                                  GNU Fortran (Debian 4.4.5-8) 4.4.5
-
-    Fedora16 3.2.9-2.fc16.i6866 #1 SMP i686 i686 i386 GNU/Linux
-                                  gcc (GCC) 4.6.2 20111027 (Red Hat 4.6.2-1)
-                                  GNU Fortran (GCC) 4.6.2 20111027 (Red Hat 4.6.2-1)
-
-    Fedora16 3.2.9-2.fc16.x86_64 #1 SMP x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (GCC) 4.6.2 20111027 (Red Hat 4.6.2-1)
-                                  GNU Fortran (GCC) 4.6.2 20111027 (Red Hat 4.6.2-1)
-
-    SUSE 12.1 3.1.9-1.4-desktop #1 SMP PREEMPT i686 i686 i386 GNU/Linux
-                                  gcc (SUSE Linux) 4.6.2
-                                  GNU Fortran (SUSE Linux) 4.6.2
-
-    SUSE 12.1 3.1.9-1.4-desktop #1 SMP PREEMPT x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (SUSE Linux) 4.6.2
-                                  GNU Fortran (SUSE Linux) 4.6.2 
-
-    Ubuntu 11.10 3.0.0-16-generic #29-Ubuntu SMP i686 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
-                                  GNU Fortran (Ubuntu/Linaro 4.6.4-9ubuntu3) 4.6.1
-
-    Ubuntu 11.10 3.0.0-16-generic #29-Ubuntu SMP x86_64 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
-                                  GNU Fortran (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
-
-    Cray Linux Environment (CLE)  PrgEnv-pgi 2.2.74
-    hopper.nersc.gov              pgcc 11.9-0 64-bit target on x86-64 Linux -tp k8e
-                                  pgf90 11.9-0 64-bit target on x86-64 Linux -tp k8e
-                                  pgCC 11.9-0 64-bit target on x86-64 Linux -tp k8e
-    
-
-Tested Configuration Features Summary
-=====================================
-
-    In the tables below
-          y   = tested 
-          n   = not tested in this release
-          C   = Cluster
-          W   = Workstation
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                                 C        F90    F90      C++   zlib  SZIP
-                                         parallel        parallel
-Solaris2.10 32-bit                         n        y      n        y     y     y
-Solaris2.10 64-bit                         n        y      n        y     y     y
-Windows XP                                 n        y(4)   n        y     y     y
-Windows XP x64                             n        y(4)   n        y     y     y
-Windows Vista                              n        y(4)   n        y     y     y
-Windows Vista x64                          n        y(4)   n        y     y     y
-Mac OS X Snow Leopard 10.6.8 32-bit        n        y      n        y     y     n 
-Mac OS X Snow Leopard 10.6.8 64-bit        n        y      n        y     y     y
-Mac OS X Lion 10.7.3 32-bit                n        y      n        y     y     n
-Mac OS X Lion 10.7.3 64-bit                n        y      n        y     y     y
-AIX 5.3 32- and 64-bit                     y        y      y        y     y     y
-FreeBSD 8.2-STABLE 32&64 bit               n        x      n        x     y     y
-CentOS 5.5 Linux 2.6.18-194 i686 GNU (1)W  y        y(2)   y        y     y     y
-CentOS 5.5 Linux 2.6.18-194 i686 Intel  W  n        y      n        y     y     y
-CentOS 5.5 Linux 2.6.18-194 i686 PGI    W  n        y      n        y     y     y
-CentOS 5.5 Linux 2.6.18 x86_64 GNU (1)  W  y        y(3)   y        y     y     y
-CentOS 5.5 Linux 2.6.18 x86_64 Intel    W  n        y      n        y     y     y
-CentOS 5.5 Linux 2.6.18 x86_64 PGI      W  n        y      n        y     y     y
-Linux 2.6.32-220.7.1.el6.ppc64             n        y      n        y     y     y
-SGI ProPack 7 Linux 2.6.32.24              y        y      y        y     y     y
-Red Hat Enterprise Linux 6                 y        y      y        y     y     y
-CLE hopper.nersc.gov                       y        y(3)   y        y     y     n
-
-
-Platform                                 Shared  Shared    Shared    Thread-  
-                                         C libs  F90 libs  C++ libs  safe     
-Solaris2.10 32-bit                         y       y         y         y        
-Solaris2.10 64-bit                         n       n         n         n        
-Windows XP                                 y       y(4)      y         n        
-Windows XP x64                             y       y(4)      y         n        
-Windows Vista                              y       y(4)      y         y
-Windows Vista x64                          y       y(4)      y         y
-Mac OS X Snow Leopard 10.6.8 32-bit        y       n         y         n        
-Mac OS X Snow Leopard 10.6.8 64-bit        y       n         y         n        
-Mac OS X Lion 10.7.3 32-bit                y       n         y         y        
-Mac OS X Lion 10.7.3 64-bit                y       n         y         y        
-AIX 5.3 32- and 64-bit                     n       n         n         y        
-FreeBSD 8.2-STABLE 32&64 bit               y       x         x         y        
-CentOS 5.5 Linux 2.6.18-194 i686 GNU (1)W  y       y(2)      y         y        
-CentOS 5.5 Linux 2.6.18-194 i686 Intel  W  y       y         y         n        
-CentOS 5.5 Linux 2.6.18-194 i686 PGI    W  y       y         y         n        
-CentOS 5.5 Linux 2.6.18 x86_64 GNU (1)  W  y       y         y         y        
-CentOS 5.5 Linux 2.6.18 x86_64 Intel    W  y       y         y         n        
-CentOS 5.5 Linux 2.6.18 x86_64 PGI      W  y       y         y         n        
-Linux 2.6.32-220.7.1.el6.ppc64             y       y         y         n 
-SGI ProPack 7 Linux 2.6.32.24              y       y         y         n 
-Red Hat Enterprise Linux 6                 y       y         y         n
-CLE hopper.nersc.gov                       n       n         n         n
-
-           (1) Fortran compiled with gfortran.
-           (2) With PGI and Absoft compilers.
-           (3) With PGI compiler for Fortran.
-           (4) Using Visual Studio 2008 w/ Intel Fortran 10.1 (Cygwin shared libraries are not supported)
-           (5) C and C++ shared libraries will not be built when Fortran is enabled.
-    Compiler versions for each platform are listed in the preceding
-    "Platforms Tested" table.
-
-
-Known Problems
-==============
-* The h5repacktst test fails on AIX 32-bit because the test uses more
-  memory than the default amount. The failure message typically looks like:
-
-    "time: 0551-010 The process was stopped abnormally. Try again."
-
-  This is an issue with the test only and does not represent a problem with
-  the library. To allow the test to pass, request more memory when testing
-  via appropriate command such as:
-
-    $ env LDR_CNRTL=MAXDATA=0x20000000 at DSA make check
-
-  (AKC - 2012/05/09 - HDFFV-8016)
-
-* The file_image test will fail in the "initial file image and callbacks in
-  the core VFD" sub-test if the source directory is read-only as the test
-  fails to create its test files in the build directory. This will be
-  resolved in a future release.
-  (AKC - 2012/05/05 - HDFFV-8009)
-  
-* The dt_arith test reports several errors involving "long double" on
-  Mac OS X 10.7 Lion when any level of optimization is enabled. The test does
-  not fail in debug mode. This will be addressed in a future release.
-  (SLU - 2012/05/08)
-
-* The following h5dump test case fails in BG/P machines (and potentially other
-  machines that use a command script to launch executables):
-
-   h5dump --no-compact-subset -d "AHFINDERDIRECT::ah_centroid_t[0] it=0 tl=0"
-     tno-subset.h5
-  
-  This is due to the embedded spaces in the dataset name being interpreted
-  by the command script launcher as meta-characters, thus passing three
-  arguments to h5dump's -d flag. The command passes if run by hand, just
-  not via the test script.
-  (AKC - 2012/05/03)
-
-* The ph5diff (parallel h5diff) tool can intermittently hang in parallel mode
-  when comparing two HDF5 files that contain objects with the same names but
-  with different object types.
-  (JKM - 2012/04/27)
-
-* On hopper, the build failed when RUNSERIAL and RUNPARALLEL are set
-  to aprun -np X, because the H5lib_settings.c file was not generated
-  properly. Not setting those environment variables works, because
-  configure was able to automatically detect that it's a Cray system
-  and used the proper launch commands when necessary. 
-  (MSC - 2012/04/18)
-
-* The data conversion test dt_arith.c fails in "long double" to integer
-  conversion on Ubuntu 11.10 (3.0.0.13 kernal) with GCC 4.6.1 if the library
-  is built with optimization -O3 or -O2.  The older GCC (4.5) or newer kernal
-  (3.2.2 on Fedora) doesn't have the problem.  Users should lower the 
-  optimization level (-O1 or -O0) by defining CFLAGS in the command line of 
-  "configure" like:
-
-      CFLAGS=-O1 ./configure
-
-  This will overwrite the library's default optimization level.
-  (SLU - 2012/02/07 - HDFFV-7829)
-
-* The STDIO VFD does not work on some architectures, possibly due to 32/64
-  bit or large file issues.  The basic STDIO VFD test is known to fail on
-  64-bit SunOS 5.10 on SPARC when built with -m64 and 32-bit OS X/Darwin
-  10.7.0.  The STDIO VFD test has been disabled while we investigate and
-  a fix should appear in a future release.
-  (DER - 2011/10/14)
-
-* h5diff can report inconsistent results when comparing datasets of enum type
-  that contain invalid values.  This is due to how enum types are handled in
-  the library and will be addressed in a future release.
-  (DER - 2011/10/14 - HDFFV-7527)
-
-* The links test can fail under the stdio VFD due to some issues with external
-  links.  This will be investigated and fixed in a future release.
-  (DER - 2011/10/14 - HDFFV-7768)
-
-* After the shared library support was fixed for some bugs, it was discovered
-  that "make prefix=XXX install" no longer works for shared libraries. It
-  still works correctly for static libraries. Therefore, if you want to
-  install the HDF5 shared libraries in a location such as /usr/local/hdf5,
-  you need to specify the location via the --prefix option during configure 
-  time. E.g, ./configure --prefix=/usr/local/hdf5 ...
-  (AKC - 2011/05/07 - HDFFV-7583)
-
-* The parallel test, t_shapesame, in testpar/, may run for a long time and may
-  be terminated by the alarm signal.  If that happens, one can increase the
-  alarm seconds (default is 1200 seconds = 20 minutes) by setting the
-  environment variable, $HDF5_ALARM_SECONDS, to a larger value such as 3600
-  (60 minutes).  Note that the t_shapesame test may fail in some systems 
-  (see the "While working on the 1.8.6 release..." problem below).  If 
-  it does, it will waste more time if $HDF5_ALARM_SECONDS is set
-  to a larger value.
-  (AKC - 2011/05/07)
-
-* The C++ and FORTRAN bindings are not currently working on FreeBSD.
-  (QAK - 2011/04/26)
-
-* Shared Fortran libraries are not quite working on AIX. While they are
-  generated when --enable-shared is specified, the fortran and hl/fortran
-  tests fail. We are looking into the issue. HL and C++ shared libraries
-  should now be working as intended, however.
-  (MAM - 2011/04/20)
-
-* The --with-mpe configure option does not work with Mpich2.
-  (AKC - 2011/03/10)
-
-* While working on the 1.8.6 release of HDF5, a bug was discovered that can
-  occur when reading from a dataset in parallel shortly after it has been
-  written to collectively. The issue was exposed by a new test in the parallel
-  HDF5 test suite, but had existed before that. We believe the problem lies with
-  certain MPI implementations and/or file systems.
-
-  We have provided a pure MPI test program, as well as a standalone HDF5
-  program, that can be used to determine if this is an issue on your system.
-  They should be run across multiple nodes with a varying number of processes.
-  These programs can be found at:
-  http://www.hdfgroup.org/ftp/HDF5/examples/known_problems/
-  (NAF - 2011/01/19)
-
-* The library's test dt_arith.c showed a compiler's rounding problem on
-  Cygwin when converting from unsigned long long to long double.  The 
-  library's own conversion works fine.  We defined a macro for Cygwin to
-  skip this test until we can solve the problem.
-  (SLU - 2010/05/05 - HDFFV-1264)
-
-* All the VFL drivers aren't backward compatible.  In H5FDpublic.h, the
-  structure H5FD_class_t changed in 1.8.  There is new parameter added to
-  get_eoa and set_eoa callback functions.  A new callback function
-  get_type_map was added in.  The public function H5FDrealloc was taken
-  out in 1.8.  The problem only happens when users define their own driver
-  for 1.6 and try to plug in 1.8 library.  Because there's only one user 
-  complaining about it, we (Elena, Quincey, and I) decided to leave it as 
-  it is (see bug report #1279).  Quincey will make a plan for 1.10.
-  (SLU - 2010/02/02)
-
-* MinGW has a missing libstdc++.dll.a library file and will not successfully link
-  C++ applications/tests. Do not use the enable-cxx configure option. Read all of
-  the INSTALL_MINGW.txt file for all restrictions.
-  (ADB - 2009/11/11)
-
-* The --enable-static-exec configure flag will only statically link libraries
-  if the static version of that library is present. If only the shared version
-  of a library exists (i.e., most system libraries on Solaris, AIX, and Mac,
-  for example, only have shared versions), the flag should still result in a 
-  successful compilation, but note that the installed executables will not be 
-  fully static. Thus, the only guarantee on these systems is that the 
-  executable is statically linked with just the HDF5 library.
-  (MAM - 2009/11/04)
-  
-* The PathScale MPI implementation, accessing a Panasas file system, would
-  cause H5Fcreate() with H5F_ACC_EXCL to fail even when the file does not
-  exist. This is due to the MPI_File_open() call failing if the mode has
-  the MPI_MODE_EXCL bit set.
-  (AKC - 2009/08/11 - HDFFV-988)
- 
-* Parallel tests failed with 16 processes with data inconsistency at testphdf5
-  / dataset_readAll. Parallel tests also failed with 32 and 64 processes with
-  collective abort of all ranks at t_posix_compliant / allwrite_allread_blocks
-  with MPI IO.
-  (CMC - 2009/04/28)
-
-* For Red Storm, a Cray XT3 system, the tools/h5ls/testh5ls.sh and
-  tools/h5copy/testh5copy.sh will fail some of its sub-tests. These sub-tests
-  are expected to fail and should exit with a non-zero code but the yod
-  command does not propagate the exit code of the executables. Yod always
-  returns 0 if it can launch the executable.  The test suite shell expects
-  a non-zero for this particular test, therefore it concludes the test has
-  failed when it receives 0 from yod.  Skip all the "failing" test for now
-  by changing them as following.
-
-  ======== Original tools/h5ls/testh5ls.sh =========
-  TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ======== Change to ===============================
-  echo SKIP TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ==================================================
-
-  ======== Original tools/h5copy/testh5copy.sh =========
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  H5LSTEST $FILEOUT
-  ======== Change to ===============================
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  echo SKIP H5LSTEST $FILEOUT
-  ==================================================
-  (AKC - 2008/11/10)
-  
-* For Red Storm, a Cray XT3 system, the yod command sometimes gives the
-  message,  "yod allocation delayed for node recovery".  This interferes with
-  test suites that do not expect to see this message.  See the section of "Red
-  Storm" in file INSTALL_parallel for a way to deal with this problem.
-  (AKC - 2008/05/28)
-
-* On an Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* On mpich 1.2.5 and 1.2.6, if more than two processes contribute no IO and 
-  the application asks to do collective IO, we have found that when using 4 
-  processors, a simple collective write will sometimes be hung. This can be 
-  verified with t_mpi test under testpar.
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  (SLU - 2005/06/30)
-
-* On IBM AIX systems, parallel HDF5 mode will fail some tests with error
-  messages like "INFO: 0031-XXX ...".  This is from the command `poe'.
-  Set the environment variable MP_INFOLEVEL to 0 to minimize the messages
-  and run the tests again.
-
-  The tests may fail with messages like "The socket name is already in use",  
-  but HDF5 does not use sockets.  This failure is due to problems with the 
-  poe command trying to set up the debug socket.  To resolve this problem, 
-  check to see whether there are many old /tmp/s.pedb.* files staying around.  
-  These are sockets used by the poe command and left behind due to failed 
-  commands.  First, ask your system administrator to clean them out.  
-  Lastly, request IBM to provide a means to run poe without the debug socket.
-  (AKC - 2004/12/08)
-
-
-%%%%1.8.8%%%%   
-
-
-HDF5 version 1.8.8 released on 2011-11-15
-================================================================================
-
-INTRODUCTION
-============
-
-This document describes the differences between HDF5-1.8.7 and 
-HDF5 1.8.8, and contains information on the platforms tested and 
-known problems in HDF5-1.8.8. 
-For more details, see the files HISTORY-1_0-1_8_0_rc3.txt 
-and HISTORY-1_8.txt in the release_docs/ directory of the HDF5 source.
-
-Links to the HDF5 1.8.8 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
-
-     http://www.hdfgroup.org/products/hdf5/
-
-The HDF5 1.8.8 release can be obtained from:
-
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
-
-User documentation for 1.8.8 can be accessed directly at this location: 
-
-     http://www.hdfgroup.org/HDF5/doc/
-
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
-
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.8 (current 
-release) versus Release 1.8.7":
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-
-If you have any questions or comments, please send them to the HDF Help Desk:
-
-     help at hdfgroup.org
-
-
-CONTENTS
-========
-
-- New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.7
-- Platforms Tested
-- Supported Configuration Features Summary
-- Known Problems
-
-
-New Features
-============
-
-    Configuration
-    -------------
-    - Added the --enable-fortran2003 flag to enable Fortran2003 support 
-      in the HDF5 Fortran library. The flag should be used along with the
-      --enable-fortran flag and takes affect only when the Fortran compiler 
-      is Fortran2003 compliant. (EIP - 2011/11/14)
-    - Added checks for clock_gettime and mach/mach_time.h to both configure and
-      CMake.  This will support the move from gettimeofday to clock_gettime's
-      monotonic timer in the profiling code in a future release.
-      (DER - 2011/10/12)
-    
-    Library
-    -------
-    - The Windows VFD code has been removed with the exception of the functions
-      which set it (H5Pset_fapl_windows, for example).  Setting the Windows
-      VFD now really sets the SEC2 VFD.  The WINDOWS_MAX_BUF and
-      WINDOWS_USE_STDIO configuration options and #defines have also been
-      removed. NOTE: Since the Windows VFD was a clone of the SEC2 VFD, this
-      change should be transparent to users.
-      (DER - 2011/10/12 - HDFFV-7740, HDFFV-7744)
-    - H5Tcreate now supports the string type (fixed-length and variable-
-      length). (SLU - 2011/05/20)
- 
-    Parallel Library
-    ----------------
-    - Added new H5Pget_mpio_actual_chunk_opt_mode and
-      H5Pget_mpio_actual_io_mode API routines for querying whether/how
-      a collective I/O operation completed.  (QAK - 2011/10/12)
- 
-    Tools
-    -----
-    - None
-
-    High-Level APIs
-    ---------------
-    - Added the following Fortran wrappers for the Dimension Scale APIs:
-        h5dsset_scale_f
-        h5dsattach_scale_f
-        h5dsdetach_scale_f
-        h5dsis_attached_f
-        h5dsis_scale_f
-        h5dsset_label_f
-        h5dsget_label_f
-        h5dsget_scale_name_f
-        h5dsget_num_scales_f
-      (EIP for SB - 2011/10/13 - HDFFV-3797)
-
-    Fortran API
-    -----------
-    - The HDF5 Fortran library was enhanced to support the Fortran 2003 standard.
-      The following features are available when the HDF5 library is configured
-      using the --enable-fortran and --enable-fortran2003 configure flags AND
-      if the Fortran compiler is Fortran 2003 compliant:
-
-      - Subroutines overloaded with the C_PTR derived type:
-          h5pget_f
-          h5pget_fill_value_f
-          h5pinsert_f
-          h5pregister_f
-          h5pset_f
-          h5pset_fill_value_f
-          h5rcreate_f
-          h5rderefrence_f
-          h5rget_name_f
-          h5rget_obj_type_f
-      - Subroutines overloaded with the C_PTR derived type 
-        and simplified signatures: 
-          h5aread_f
-          h5awrite_f
-          h5dread_f
-          h5dwrite_f
-      - New subroutines
-          h5dvlen_reclaim_f
-          h5literate_by_name_f
-          h5literate_f
-          h5ovisit_f
-          h5tconvert_f
-          h5pset_nbit_f
-          h5pset_scaleoffset_f
-      - Subroutines with additional optional parameters:
-          h5pcreate_class_f
-      (EIP - 2011/10/14)
-
-    C++ API
-    -------
-    - None
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-    - None
-
-Bug Fixes since HDF5-1.8.7
-==========================
-
-    Configuration
-    -------------
-    - Changed the size of H5_SIZEOF_OFF_T to 4 bytes (was 8) in the VMS
-      h5pubconf.h based on the output of a test program.  (DER - 2011/10/12)
-    - The Windows and VMS versions of H5pubconf.h were brought into sync with
-      the linux/posix version. (DER - 2011/10/12)
-    - Fixed a bug in the bin/trace Perl script where API functions
-      that take a variable number of arguments were not processed for
-      trace statement fixup. (DER - 2011/08/25)
-    - The --enable-h5dump-packed-bits configure option has been removed.
-      The h5dump code that this option conditionally enabled is now always
-      compiled into h5dump. Please refer to the h5dump reference manual for 
-      usage of the packed bits feature. (MAM - 2011/06/23 - HDFFV-7592)
-    - Configure now uses the same flags and symbols in its tests that are
-      used to build the library. (DER - 2011/05/24)
-
-    Library
-    -------
-    - Corrected the error when copying attributes between files which are using
-      different versions of the file format. (QAK - 2011/10/20 - HDFFV-7718)
-    - Corrected the error when loading local heaps from the file, which could
-      cause the size of the local heap's data block to increase dramatically.
-      (QAK - 2011/10/14 - HDFFV-7767)
-    - An application does not need to do H5O_move_msgs_forward() when writing
-      attributes. Tests were checked into the performance suite.
-      (VC - 2011/10/13 - HDFFV-7640)
-    - Fixed a bug that occurred when using H5Ocopy on a committed datatype
-      containing an attribute using that committed datatype.
-      (NAF - 2011/10/13 - HDFFV-5854)
-    - Added generic VFD I/O types to the SEC2 and log VFDs to ensure correct
-      I/O sizes (and remove compiler warnings) between Windows and true POSIX
-      systems.  (DER - 2011/10/12)
-    - Corrected some Windows behavior in the SEC2 and log VFDs.  This mainly
-      involved datatype correctness fixes, Windows API call error checks, 
-      and adding the volume serial number to the VFD cmp functions.
-      (DER - 2011/10/12)
-    - Converted post-checks for the appropriate POSIX I/O sizes to pre-checks 
-      in order to avoid platform-specific or undefined behavior.  
-      (DER - 2011/10/12)
-    - #ifdef _WIN32 instances have been changed to #ifdef H5_HAVE_WIN32_API. 
-      H5_HAVE_VISUAL_STUDIO checks have been added where necessary. This is in 
-      CMake only as configure never sets _WIN32. (ADB - 2011/09/12)
-    - CLANG compiler with the options -fcatch-undefined-behavior and -ftrapv
-      discovered 3 problems in tests and tools' library:
-        1. In dsets.c, left shifting an unsigned int for 32 bits or more
-           caused undefined behavior.
-        2. In dt_arith.c, the INIT_INTEGER macro definition has an overflow
-           when the value is a negative minimal and is being subtracted from one.
-        3. In tools/lib/h5tools_str.c, right shifting an int value for 32 bits 
-           or more caused undefined behavior.
-      All the problems have been corrected. (SLU - 2011/09/02 - HDFFV-7674)
-    - H5Epush2() now has the correct trace functionality (this is related to the
-      bin/trace Perl script bug noted in the configure section).
-      (DER - 2011/08/25)
-    - Corrected mismatched function name typo of h5pget_dxpl_mpio_c and
-      h5pfill_value_defined_c. (AKC - 2011/08/22 - HDFFV-7641)
-    - Corrected an internal error in the library where objects that use committed 
-      (named) datatypes and were accessed from two different file IDs could confuse
-      the two and cause erroneous failures. (QAK - 2011/07/18 - HDFFV-7638)
-    - In v1.6 of the library, there was an EOA for the whole MULTI file saved in the 
-      super block.  We took it out in v1.8 of the library because it's meaningless 
-      for the MULTI file. v1.8 of the library saves the EOA for the metadata file 
-      instead, but this caused a backward compatibility problem.
-      A v1.8 library couldn't open the file created with the v1.6 library. We
-      fixed the problem by checking the EOA value to detect the file
-      created with v1.6 library. (SLU - 2011/06/22) 
-    - When a dataset had filters and reading data failed, the error message 
-      didn't say which filter wasn't registered. It's fixed now. (SLU - 2011/06/03)
-
-    Parallel Library
-    ----------------
-    - The Special Collective IO (IO when some processes do not contribute to the
-      IO) and the Complex Derived Datatype MPI functionalities are no longer
-      conditionally enabled in the library by configure. They are always
-      enabled in order to take advantage of performance boosts from these
-      behaviors. Older MPI implementations that do not allow for these
-      functionalities can no longer by used by HDF5.
-      (MAM - 2011/07/08 - HDFFV-7639).
-
-    Tools
-    -----
-    - h5diff: fixed segfault over non-comparable attribute with different 
-      dimention or rank, along with '-c' option to display details.
-      (JKM - 2011/10/24 - HDFFV-7770)
-    - Fixed h5diff to display all the comparable objects and attributes 
-      regardless of detecting non-comparables. (JKM - 2011/09/16 - HDFFV-7693)
-    - Fixed h5repack to update the values of references(object and region) of 
-      attributes in h5repack for 1) references, 2) arrays of references, 
-      3) variable-length references, and 4) compound references. 
-      (PC - 2011/09/14 - HDFFV-5932)
-    - h5diff: fixed a segfault over a dataset with container types 
-      array and variable-length (vlen) along with multiple nested compound types. 
-      Example: compound->array->compound, compound->vlen->compound.
-      (JKM - 2011/09/01 - HDFFV-7712)
-    - h5repack: added macro to handle a failure in H5Dread/write when memory
-      allocation failed inside the library. (PC - 2011/08/19)
-    - Fixed h5jam to not to allow the specifying of an HDF5 formatted file as 
-      an input file for the -u (user block file) option. The original HDF5 file 
-      would not be accessible if this behavior was allowed. 
-      (JKM - 2011/08/19 - HDFFV-5941)
-    - Revised the command help pages of h5jam and h5unjam. The descriptions
-      were not up to date and some were missing. 
-      (JKM - 2011/08/15 - HDFFV-7515)
-    - Fixed h5dump to correct the schema location: 
-      <hdf5:HDF5-File 
-      xmlns:hdf5="http://hdfgroup.org/HDF5/XML/schema/HDF5-File" 
-      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
-      xsi:schemaLocation="http://hdfgroup.org/HDF5/XML/schema/HDF5-File 
-      http://www.hdfgroup.org/HDF5/XML/schema/HDF5-File.xsd">
-      (ADB - 2011/08/10)
-    - h5repack: h5repack failed to copy a dataset if the layout is changed 
-      from chunked with unlimited dimensions to contiguous.
-      (PC - 2011/07/15 - HDFFV-7649)
-    - Fixed h5diff: the "--delta" option considers two NaN of the same type 
-      are different. This is wrong based on the h5diff description in the 
-      Reference Manual. (PC - 2011/07/15 - HDFFV-7656)
-    - Fixed h5diff to display an instructive error message and exit with
-      an instructive error message when mutually exclusive options 
-      (-d, -p and --use-system-epsilon) are used together. 
-      (JKM - 2011/07/07 - HDFFV-7600)
-    - Fixed h5dump so that it displays the first line of each element in correct
-      position for multiple dimention array types. Before this fix, 
-      the first line of each element in an array was
-      displayed after the last line of previous element without
-      moving to the next line (+indentation).
-      (JKM - 2011/06/15 - HDFFV-5878)
-    - Fixed h5dump so that it will display the correct value for 
-      H5T_STD_I8LE datasets on the Blue-gene system (ppc64, linux, Big-Endian, 
-      clustering). (AKC & JKM - 2011/05/12 - HDFFV-7594)
-    - Fixed h5diff to compare a file to itself correctly. Previously h5diff
-      reported either the files were different or not compatible in certain 
-      cases even when comparing a file to itself. This fix also improves 
-      performance when comparing the same target objects through verifying 
-      the object and file addresses before comparing the details 
-      in the objects. Examples of details are datasets and attributes. 
-      (XCAO & JKM - 2011/05/06 - HDFFV-5928)
-
-    F90 API
-    -------
-    - Modified the h5open_f and h5close_f subroutines to not to call H5open 
-      and H5close correspondingly. While the H5open call just adds overhead, 
-      the H5close call called by a Fortran application shuts down the HDF5 
-      library. This makes the library inaccessible to the application. 
-      (EIP & SB - 2011/10/13 - HDFFV-915)
-    - Fixed h5tget_tag_f where the length of the C string was used to 
-      repack the C string into the Fortran string. This lead to memory 
-      corruption in the calling program. (SB - 2011/07/26)
-    - Added defined constants:
-        H5T_ORDER_MIXED_F (HDFFV-2767)
-        H5Z_SO_FLOAT_DSCALE_F
-        H5Z_SO_FLOAT_ESCALE_F
-        H5Z_SO_INT_F
-        H5Z_SO_INT_MINBITS_DEFAULT_F
-        H5O_TYPE_UNKNOWN_F
-        H5O_TYPE_GROUP_F
-        H5O_TYPE_DATASET_F
-        H5O_TYPE_NAMED_DATATYPE_F
-        H5O_TYPE_NTYPES_F
-
-    C++ API
-    ------
-    - None
-
-    High-Level APIs:
-    ------
-    - Fixed the H5LTdtype_to_text function.  It had some memory problems when 
-      dealing with some complicated data types. (SLU - 2011/10/19 - HDFFV-7701)
-    - Fixed H5DSset_label seg faulting when retrieving the length of a 
-      dimension label that was not set. (SB - 2011/08/07 - HDFFV-7673)
-    - Fixed a dimension scale bug where if you create a dimscale, attach two 
-      datasets to it, and then unattach them, you get an error if they are 
-      unattached in order, but no error if you unattach them in reverse order. 
-      (SB - 2011/06/07 - HDFFV-7605)
-
-    Fortran High-Level APIs:
-    ------
-    - None
-
-
-Platforms Tested
-================
-The following platforms and compilers have been tested for this release.
-
-    AIX 5.3                       xlc 10.1.0.5
-    (NASA G-ADA)                  xlC 10.1.0.5
-                                  xlf90 12.1.0.6
-
-    FreeBSD 8.2-STABLE i386       gcc 4.2.1 [FreeBSD] 20070719
-    (loyalty)                     g++ 4.2.1 [FreeBSD] 20070719
-                                  gcc 4.6.1 20110422
-                                  g++ 4.6.1 20110422
-                                  gfortran 4.6.1 20110422
-
-    FreeBSD 8.2-STABLE amd64      gcc 4.2.1 [FreeBSD] 20070719
-    (freedom)                     g++ 4.2.1 [FreeBSD] 20070719
-                                  gcc 4.6.1 20110422
-                                  g++ 4.6.1 20110422
-                                  gfortran 4.6.1 20110422
-
-    IBM Blue Gene/P               bgxlc 9.0.0.9
-    (LLNL uDawn)                  bgxlf90 11.1.0.7
-                                  bgxlC 9.0.0.9
-
-    Linux 2.6.16.60-0.54.5-smp    Intel(R) C, C++, Fortran Compilers
-    x86_64                            Version 11.1 20090630
-    (INL Icestorm)                   
-
-    Linux 2.6.18-194.el5 x86_64   Intel(R) C, C++, Fortran Compilers
-    (INL Fission)                     Version 12.0.2 20110112
-
-    Linux 2.6.18-108chaos x86_64  Intel(R) C, C++, Fortran Compilers
-    (LLNL Aztec)                      Version 11.1 20090630
-
-    Linux 2.6.18-194.3.1.el5PAE   gcc (GCC) 4.1.2 and 4.4.2
-    #1 SMP i686 i686 i386         GNU Fortran (GCC) 4.1.2 20080704
-    (jam)                             (Red Hat 4.1.2-48) and 4.4.2 
-                                  PGI C, Fortran, C++ 10.4-0 32-bit
-                                  PGI C, Fortran, C++ 10.6-0 32-bit
-                                  Intel(R) C Compiler for 32-bit
-                                      applications, Version 11.1 
-                                  Intel(R) C++ Compiler for 32-bit
-                                      applications, Version 11.1
-                                  Intel(R) Fortran Compiler for 32-bit
-                                      applications, Version 11.1
-                                  MPICH mpich2-1.3.1 compiled with
-                                      gcc 4.1.2 and gfortran 4.1.2
-
-    Linux 2.6.18-238.12.1.el5     gcc 4.1.2 and 4.4.2
-    #1 SMP x86_64 GNU/Linux       GNU Fortran (GCC) 4.1.2 20080704
-    (koala)                           (Red Hat 4.1.2-46) and 4.4.2
-                                      tested for both 32- and 64-bit binaries
-                                  Intel(R) C, C++, Fortran Compilers for 
-                                      applications running on Intel(R) 64, 
-                                      Version 11.1.
-                                  PGI C, Fortran, C++ Version 9.0-4
-                                      for 64-bit target on x86-64
-                                  MPICH mpich2-1.3.1 compiled with
-                                      gcc 4.1.2 and gfortran 4.1.2
-
-    SGI Altix UV                  Intel(R) C, Fortran Compilers
-    SGI ProPack 7 Linux               Version 11.1 20100806
-    2.6.32.24-0.2.1.2230.2.PTF-   SGI MPT 2.02
-    default #1 SMP                
-    (NCSA ember)
-
-    Dell NVIDIA Cluster           Intel(R) C, Fortran Compilers
-    Red Hat Enterprise Linux 6        Version 12.0.4 20110427
-    2.6.32-131.4.1.el6.x86_64     mvapich2 1.7rc1-intel-12.0.4
-    (NCSA forge)
-
-    SunOS 5.10 32- and 64-bit     Sun C 5.11 SunOS_sparc 2010/08/13
-                                  Sun Fortran 95 8.5 SunOS_sparc 2010/08/13
-                                  Sun C++ 5.11 SunOS_sparc 2010/08/13
-
-    Windows XP                    Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-                                  Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-                                  Visual Studio 2010 (cmake)
-                                  Cygwin(1.7.9 native gcc(4.5.3) compiler and gfortran)
-
-    Windows XP x64                Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-                                  Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-                                  Visual Studio 2010 (cmake)
-                                  Cygwin(1.7.9 native gcc(4.5.3) compiler and gfortran)
-
-    Windows Vista                 Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Windows Vista x64             Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Windows 7                     Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Windows 7 x64                 Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Mac OS X 10.8.0 (Intel 64-bit) i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
-    Darwin Kernel Version 10.8.0  GNU Fortran (GCC) 4.6.1
-                                  Intel C, C++ and Fortran compilers 12.1.0
-
-    Mac OS X 10.8.0 (Intel 32-bit) i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
-    Darwin Kernel Version 10.8.0  GNU Fortran (GCC) version 4.6.1
-          Intel C, C++ and Fortran compilers 12.1.0
-
-    Fedora 12 2.6.32.16-150.fc12.ppc64 #1 SMP ppc64 GNU/Linux
-                                  gcc (GCC) 4.4.4 20100630 (Red Hat 4.4.4-10)
-                                  GNU Fortran (GCC) 4.4.4 20100630 (Red Hat 4.4.4-10)
-
-    Debian6.0.3 2.6.32-5-686 #1 SMP i686 GNU/Linux
-                                  gcc (Debian 4.4.5-8) 4.4.5
-                                  GNU Fortran (Debian 4.4.5-8) 4.4.5
-
-    Debian6.0.3 2.6.32-5-amd64 #1 SMP x86_64 GNU/Linux
-                                  gcc (Debian 4.4.5-8) 4.4.5
-                                  GNU Fortran (Debian 4.4.5-8) 4.4.5
-
-    Fedora15 2.6.40.6-0.fc15.i686.PAE #1 SMP i686 i686 i386 GNU/Linux
-                                  gcc (GCC) 4.6.1 20110908 (Red Hat 4.6.1-9)
-                                  GNU Fortran (GCC) 4.6.1 20110908 (Red Hat 4.6.1-9)
-
-    Fedora15 2.6.40.6-0.fc15.x86_64 #1 SMP x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (GCC) 4.6.1 20110908 (Red Hat 4.6.1-9)
-                                  GNU Fortran (GCC) 4.6.1 20110908 (Red Hat 4.6.1-9)
-
-    SUSE 11.4 2.6.37.6-0.7-desktop #1 SMP PREEMPT i686 i686 i386 GNU/Linux
-                                  gcc (SUSE Linux) 4.5.1 20101208
-                                  GNU Fortran (SUSE Linux) 4.5.1 20101208
-
-    SUSE 11.4 2.6.37.6-0.7-desktop #1 SMP PREEMPT x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (SUSE Linux) 4.5.1 20101208
-                                  GNU Fortran (SUSE Linux) 4.5.1 20101208
-
-    Ubuntu 11.10 3.0.0-12-generic #20-Ubuntu SMP i686 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
-                                  GNU Fortran (Ubuntu/Linaro 4.6.4-9ubuntu3) 4.6.1
-
-    Ubuntu 11.10 3.0.0-12-generic #20-Ubuntu SMP x86_64 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
-                                  GNU Fortran (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
-    
-    OpenVMS Alpha 8.3             HP C V7.3-009
-                                  HP Fortran V8.2-104679-48H9K
-                                  HP C++ V7.3-009
-
-    Cray Linux Environment (CLE)  PrgEnv-pgi 2.2.74
-    hopper.nersc.gov              pgcc 11.7-0 64-bit target on x86-64 Linux -tp k8e
-    franklin.nersc.gov            pgf90 11.7-0 64-bit target on x86-64 Linux -tp k8e
-                                  pgCC 11.7-0 64-bit target on x86-64 Linux -tp k8e
-
-Tested Configuration Features Summary
-=====================================
-
-    In the tables below
-          y   = tested 
-          n   = not tested in this release
-          C   = Cluster
-          W   = Workstation
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                                 C        F90    F90      C++   zlib  SZIP
-                                         parallel        parallel
-Solaris2.10 32-bit                         n        y      n        y     y    y
-Solaris2.10 64-bit                         n        y      n        y     y    y
-Windows XP                                 n        y(4)   n        y     y    y
-Windows XP x64                             n        y(4)   n        y     y    y
-Windows Vista                              n        y(4)   n        y     y    y
-Windows Vista x64                          n        y(4)   n        y     y    y
-OpenVMS Alpha                              n        y      n        y     y    n
-Mac OS X 10.8 Intel 32-bit                 n        y      n        y     y    y
-Mac OS X 10.8 Intel 64-bit                 n        y      n        y     y    y
-AIX 5.3 32- and 64-bit                     n        y      n        y     y    y
-FreeBSD 8.2-STABLE 32&64 bit               n        x      n        x     y    y
-CentOS 5.5 Linux 2.6.18-194 i686 GNU (1)W  y        y(2)   y        y     y    y
-CentOS 5.5 Linux 2.6.18-194 i686 Intel  W  n        y      n        y     y    n
-CentOS 5.5 Linux 2.6.18-194 i686 PGI    W  n        y      n        y     y    n
-CentOS 5.5 Linux 2.6.16 x86_64 GNU (1)  W  y        y(3)   y        y     y    y
-CentOS 5.5 Linux 2.6.16 x86_64 Intel    W  n        y      n        y     y    n
-CentOS 5.5 Linux 2.6.16 x86_64 PGI      W  n        y      n        y     y    y
-Fedora 12 Linux 2.6.32.16-150.fc12.ppc64   n        y      n        y     y    y
-SGI ProPack 7 Linux 2.6.32.24              y        y      y        y     y    y
-Red Hat Enterprise Linux 6                 y        y      y        y     y    y
-CLE hopper.nersc.gov                       y        y(3)   y        y     y    n  
-CLE franklin.nersc.gov                     y        y(3)   y        y     y    n  
-
-
-Platform                                 Shared  Shared    Shared    Thread-  
-                                         C libs  F90 libs  C++ libs  safe     
-Solaris2.10 32-bit                         y       y         y         y        
-Solaris2.10 64-bit                         y       y         y         y        
-Windows XP                                 y       y(4)      y         n        
-Windows XP x64                             y       y(4)      y         n        
-Windows Vista                              y       y(4)      y         y
-Windows Vista x64                          y       y(4)      y         y
-OpenVMS Alpha                              n       n         n         n
-Mac OS X 10.8 Intel 32-bit                 y(5)    n         y         n        
-Mac OS X 10.8 Intel 64-bit                 y(5)    n         y         n        
-AIX 5.3 32- and 64-bit                     n       n         n         y        
-FreeBSD 8.2-STABLE 32&64 bit               y       x         x         y        
-CentOS 5.5 Linux 2.6.18-128 i686 GNU (1)W  y       y(2)      y         y        
-CentOS 5.5 Linux 2.6.18-128 i686 Intel  W  y       y         y         n        
-CentOS 5.5 Linux 2.6.18-128 i686 PGI    W  y       y         y         n        
-CentOS 5.5 Linux 2.6.16 x86_64 GNU (1)  W  y       y         y         y        
-CentOS 5.5 Linux 2.6.16 x86_64 Intel    W  y       y         y         n        
-CentOS 5.5 Linux 2.6.16 x86_64 PGI      W  y       y         y         n        
-Fedora 12 Linux 2.6.32.16-150.fc12.ppc64   y       y         y         y 
-SGI ProPack 7 Linux 2.6.32.24              y       y         y         n 
-Red Hat Enterprise Linux 6                 y       y         y         n
-CLE hopper.nersc.gov                       n       n         n         n
-CLE franklin.nersc.gov                     n       n         n         n
-
-           (1) Fortran compiled with gfortran.
-           (2) With PGI and Absoft compilers.
-           (3) With PGI compiler for Fortran.
-           (4) Using Visual Studio 2008 w/ Intel Fortran 10.1 (Cygwin shared libraries are not supported)
-           (5) C and C++ shared libraries will not be built when Fortran is enabled.
-    Compiler versions for each platform are listed in the preceding
-    "Platforms Tested" table.
-
-
-Known Problems
-==============
-
-* The STDIO VFD does not work on some architectures, possibly due to 32/64
-  bit or large file issues.  The basic STDIO VFD test is known to fail on
-  64-bit SunOS 5.10 on SPARC when built with -m64 and 32-bit OS X/Darwin
-  10.7.0.  The STDIO VFD test has been disabled while we investigate and
-  a fix should appear in a future release, possibly 1.8.9.
-  (DER - 2011/10/14)
-
-* h5diff can report inconsistent results when comparing datasets of enum type
-  that contain invalid values.  This is due to how enum types are handled in
-  the library and will be addressed in the next release.
-  (DER - 2011/10/14 - HDFFV-7527)
-
-* The links test can fail under the stdio VFD due to some issues with external
-  links.  This will be investigated and fixed in a future release.
-  (DER - 2011/10/14 - HDFFV-7768)
-
-* After the shared library support was fixed for some bugs, it was discovered
-  that "make prefix=XXX install" no longer works for shared libraries. It
-  still works correctly for static libraries. Therefore, if you want to
-  install the HDF5 shared libraries in a location such as /usr/local/hdf5,
-  you need to specify the location via the --prefix option during configure 
-  time. E.g, ./configure --prefix=/usr/local/hdf5 ...
-  (AKC - 2011/05/07 - HDFFV-7583)
-
-* The parallel test, t_shapesame, in testpar/, may run for a long time and may
-  be terminated by the alarm signal.  If that happens, one can increase the
-  alarm seconds (default is 1200 seconds = 20 minutes) by setting the
-  environment variable, $HDF5_ALARM_SECONDS, to a larger value such as 3600
-  (60 minutes).  Note that the t_shapesame test may fail in some systems 
-  (see the "While working on the 1.8.6 release..." problem below).  If 
-  it does, it will waste more time if $HDF5_ALARM_SECONDS is set
-  to a larger value. (AKC - 2011/05/07)
-
-* The C++ and FORTRAN bindings are not currently working on FreeBSD.
-  (QAK - 2011/04/26)
-
-* Shared Fortran libraries are not quite working on AIX. While they are
-  generated when --enable-shared is specified, the fortran and hl/fortran
-  tests fail. We are looking into the issue. HL and C++ shared libraries
-  should now be working as intended, however. (MAM - 2011/04/20)
-
-* The --with-mpe configure option does not work with Mpich2. (AKC - 2011/03/10)
-
-* While working on the 1.8.6 release of HDF5, a bug was discovered that can
-  occur when reading from a dataset in parallel shortly after it has been
-  written to collectively. The issue was exposed by a new test in the parallel
-  HDF5 test suite, but had existed before that. We believe the problem lies with
-  certain MPI implementations and/or file systems.
-
-  We have provided a pure MPI test program, as well as a standalone HDF5
-  program, that can be used to determine if this is an issue on your system.
-  They should be run across multiple nodes with a varying number of processes.
-  These programs can be found at:
-  http://www.hdfgroup.org/ftp/HDF5/examples/known_problems/
-  (NAF - 2011/01/19)
-
-* The library's test dt_arith.c showed a compiler's rounding problem on
-  Cygwin when converting from unsigned long long to long double.  The 
-  library's own conversion works fine.  We defined a macro for Cygwin to
-  skip this test until we can solve the problem.
-  (SLU - 2010/05/05 - HDFFV-1264)
-
-* All the VFL drivers aren't backward compatible.  In H5FDpublic.h, the
-  structure H5FD_class_t changed in 1.8.  There is new parameter added to
-  get_eoa and set_eoa callback functions.  A new callback function
-  get_type_map was added in.  The public function H5FDrealloc was taken
-  out in 1.8.  The problem only happens when users define their own driver
-  for 1.6 and try to plug in 1.8 library.  Because there's only one user 
-  complaining about it, we (Elena, Quincey, and I) decided to leave it as 
-  it is (see bug report #1279).  Quincey will make a plan for 1.10.
-  (SLU - 2010/02/02)
-
-* MinGW has a missing libstdc++.dll.a library file and will not successfully link
-  C++ applications/tests. Do not use the enable-cxx configure option. Read all of
-  the INSTALL_MINGW.txt file for all restrictions. (ADB - 2009/11/11)
-
-* The --enable-static-exec configure flag will only statically link libraries
-  if the static version of that library is present. If only the shared version
-  of a library exists (i.e., most system libraries on Solaris, AIX, and Mac,
-  for example, only have shared versions), the flag should still result in a 
-  successful compilation, but note that the installed executables will not be 
-  fully static. Thus, the only guarantee on these systems is that the 
-  executable is statically linked with just the HDF5 library.
-  (MAM - 2009/11/04)
-  
-* The PathScale MPI implementation, accessing a Panasas file system, would
-  cause H5Fcreate() with H5F_ACC_EXCL to fail even when the file does not
-  exist. This is due to the MPI_File_open() call failing if the mode has
-  the MPI_MODE_EXCL bit set. (AKC - 2009/08/11 - HDFFV-988)
- 
-* Parallel tests failed with 16 processes with data inconsistency at testphdf5
-  / dataset_readAll. Parallel tests also failed with 32 and 64 processes with
-  collective abort of all ranks at t_posix_compliant / allwrite_allread_blocks
-  with MPI IO. (CMC - 2009/04/28)
-
-* For Red Storm, a Cray XT3 system, the tools/h5ls/testh5ls.sh and
-  tools/h5copy/testh5copy.sh will fail some of its sub-tests. These sub-tests
-  are expected to fail and should exit with a non-zero code but the yod
-  command does not propagate the exit code of the executables. Yod always
-  returns 0 if it can launch the executable.  The test suite shell expects
-  a non-zero for this particular test, therefore it concludes the test has
-  failed when it receives 0 from yod.  Skip all the "failing" test for now
-  by changing them as following.
-
-  ======== Original tools/h5ls/testh5ls.sh =========
-  TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ======== Change to ===============================
-  echo SKIP TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ==================================================
-
-  ======== Original tools/h5copy/testh5copy.sh =========
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  H5LSTEST $FILEOUT
-  ======== Change to ===============================
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  echo SKIP H5LSTEST $FILEOUT
-  ==================================================
-  (AKC - 2008/11/10)
-  
-* For Red Storm, a Cray XT3 system, the yod command sometimes gives the
-  message,  "yod allocation delayed for node recovery".  This interferes with
-  test suites that do not expect to see this message.  See the section of "Red
-  Storm" in file INSTALL_parallel for a way to deal with this problem.
-  (AKC - 2008/05/28)
-
-* On an Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* On mpich 1.2.5 and 1.2.6, if more than two processes contribute no IO and 
-  the application asks to do collective IO, we have found that when using 4 
-  processors, a simple collective write will sometimes be hung. This can be 
-  verified with t_mpi test under testpar.
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  (SLU - 2005/06/30)
-
-* On IBM AIX systems, parallel HDF5 mode will fail some tests with error
-  messages like "INFO: 0031-XXX ...".  This is from the command `poe'.
-  Set the environment variable MP_INFOLEVEL to 0 to minimize the messages
-  and run the tests again.
-
-  The tests may fail with messages like "The socket name is already in use",  
-  but HDF5 does not use sockets.  This failure is due to problems with the 
-  poe command trying to set up the debug socket.  To resolve this problem, 
-  check to see whether there are many old /tmp/s.pedb.* files staying around.  
-  These are sockets used by the poe command and left behind due to failed 
-  commands.  First, ask your system administrator to clean them out.  
-  Lastly, request IBM to provide a means to run poe without the debug socket.
-  (AKC - 2004/12/08)
-
-
-%%%%1.8.7%%%%   
-
-
-HDF5 version 1.8.7 released on Tue May 10 09:24:44 CDT 2011
-================================================================================
-
-INTRODUCTION
-============
-
-This document describes the differences between HDF5-1.8.6 and 
-HDF5 1.8.7, and contains information on the platforms tested and 
-known problems in HDF5-1.8.7. 
-For more details, see the files HISTORY-1_0-1_8_0_rc3.txt 
-and HISTORY-1_8.txt in the release_docs/ directory of the HDF5 source.
-
-Links to the HDF5 1.8.7 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
-
-     http://www.hdfgroup.org/products/hdf5/
-
-The HDF5 1.8.7 release can be obtained from:
-
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
-
-User documentation for 1.8.7 can be accessed directly at this location: 
-
-     http://www.hdfgroup.org/HDF5/doc/
-
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
-
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.7 (current 
-release) versus Release 1.8.6":
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-
-If you have any questions or comments, please send them to the HDF Help Desk:
-
-     help at hdfgroup.org
-
-
-CONTENTS
-========
-
-- New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.6
-- Platforms Tested
-- Supported Configuration Features Summary
-- Known Problems
-
-
-New Features
-============
-
-    Configuration
-    -------------
-    - Configure now generates Makefiles that build in "silent make mode"
-      by default in which compile and link lines are significantly
-      simplified for clarity. To override this and view actual compile and
-      link lines during building, the --disable-silent-rules flag can be used
-      at configure time, or the 'make' command can be followed by V=1, to
-      indicate a "verbose" make. (MAM - 2011/4/14).
-    - Added mpicc and mpif90 as the default C and Fortran compilers for Linux
-      systems when --enable-parallel is specified but no $CC or $FC is defined.
-      (AKC - 2011/2/7)
-    - Added a new configure option, "--enable-unsupported", which can
-      be used to stop configure from preventing the use of unsupported
-      configure option combinations, such as c++ in parallel or Fortran
-      with threadsafe. Use at your own risk, as it may result in a 
-      library that won't compile or run as expected!
-      (MAM - 2010/11/17 - Bug 2061)
-
-    Library
-    -------
-    - The library allows the dimension size of a dataspace to be zero.  In 
-      the past, the library would allow this only if the maximal dimension 
-      size was unlimited. Now there is no such restriction, but no data 
-      can be written to this kind of dataset. (SLU - 2011/4/20)
-    - We added two new macros, H5_VERSION_GE and H5_VERSION_LE, to let users
-      compare certain version numbers with the library being used. (SLU -
-      2011/4/20) 
-    - Added ability to cache files opened through external links.  Added new
-      public functions H5Pset_elink_file_cache_size(),
-      H5Pget_elink_file_cache_size(), and H5Fclear_elink_file_cache().
-      (NAF - 2011/02/17)
-    - Finished implementing all options for 'log' VFD.  (QAK - 2011/1/25)
-    - Removed all old code for Metrowerks compilers, bracketed by
-      __MWERKS__). Metrowerks compiler is long gone. (AKC - 2010/11/17) 
-
-    Parallel Library
-    ----------------
-    - None
- 
-    Tools
-    -----
-     - h5diff: Added new "verbose with levels" option, '-vN, --verbose=N'.
-       The old '-v, --verbose' option is deprecated but remains available;
-       it is exactly equivalent to '-v0, --verbose=0'.
-       The new levels 1 ('-v1' or '--verbose=1') and 2 ('-v2' or 
-       '--verbose=2') can be specified to view more information regarding 
-       attributes differences.  Bug #2121 (JKM 2011/3/23)
-     - h5dump: Added new option --enable-error-stack. This option will 
-       display error stack information in the output stream. This is 
-       useful when the "h5dump: Unable to print data" message is output.
-       (ADB - 2011/03/03)
-
-    High-Level APIs
-    ---------------
-    - Fortran LT make datasets routines (H5LTmake_dataset_f, 
-      h5ltmake_dataset_int_f, h5ltmake_dataset_float_f, h5ltmake_dataset_double_f) 
-      and LT read datasets routines (h5ltread_dataset_f,h5ltread_dataset_int_f,
-      h5ltread_dataset_float_f, 5ltread_dataset_double_f) can now handle 
-      4-dimensional to 7-dimensional rank datasets. HDFFV-1217 (MSB-2011/4/24/2011)
-
-    F90 API
-    -------
-     - None
-
-    C++ API
-    -------
-    - None
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-    - Intel V11.1 uses now -O3 optimization in production mode (EIP - 2010/10/08)
-             
-
-
-Bug Fixes since HDF5-1.8.6
-==========================
-
-    Configuration
-    -------------
-    - Shared C++ and HL libraries on AIX should now be working correctly.
-      Note that Fortran shared libraries are still not working on AIX. 
-      (See the Known Problems section, below). (MAM - 2011/4/20)
-    - Removed config/ibm-aix6.x. All IBM-AIX settings are in one file,
-      ibm-aix. (AKC - 2011/4/14)
-    - Shared C libraries are no longer disabled on Mac when Fortran
-      is enabled. Shared Fortran libraries are still not supported on Mac,
-      so configure will disable them by default, but this is overrideable
-      with the new --enable-unsupported configure option. The configure
-      summary has been updated to reflect the fact that the shared-ness of 
-      the C++/Fortran wrapper libraries may not align with the C library.
-      (MAM - 2011/04/11 - HDFFV-4353).
-
-    Library
-    -------
-    - Changed assertion failure when decoding a compound datatype with no
-      fields into a normal error failure.  Also prohibit using this sort
-      of datatype for creating an attribute (as is already the case for
-      datasets and committed (named) datatypes).  (QAK - 2011/04/15, Jira 
-      issue #HDFFV-2766)
-    - Tell the VFL flush call that the file will be closing, allowing
-      the VFDs to avoid sync'ing the file (particularly valuable in parallel).
-      (QAK - 2011/03/09)
-    - The datatype handler created with H5Tencode/decode used to have the 
-      reference count 0 (zero); it now has the reference count 1 (one).
-      (SLU - 2011/2/18)
-    - Fixed the definition of H5_HAVE_GETTIMEOFDAY on Windows so that
-      HDgettimeofday() is defined and works properly.  Bug HDFFV-5931
-      (DER - 2011/04/14)
-    - Added basic VFD tests for the Windows, STDIO and log VFD tests.
-      (DER - 2011/04/11)
-
-    Parallel Library
-    ----------------
-    - None
-
-    Tools
-    -----
-    - Updated h5dump test case script to prevent entire test failure when 
-      source directory is read-only. Bug #HDFFV-4342 (JKM 2011/4/12)
-    - Fixed h5dump displaying incorrect values for H5T_STD_I8BE type data in
-      attribute on Big-Endian machine. H5T_STD_I8BE is unsigned 8bit type,
-      so h5dump is supposed to display -2 instead of 254. It worked correctly
-      on Little-Endian system , but not on Big-Endian system.  Bug #HDFFV-4358
-      (JKM 04/08/2011)
-    - Updated some HDF5 tools to standardize the option name as 
-      '--enable-error-stack' for printing HDF5 error stack messages. h5ls and 
-      h5dump have been updated. For h5ls, this replaces "-e/--errors" option, 
-      which is deprecated. For h5dump, this is a new option. Bug #2182 
-      (JKM 2011/3/30)
-    - Fixed the h5diff --use-system-epsilon option. The formula used in the 
-      calculation was changed from ( |a - b| / b ) to ( |a - b| ). 
-      This was done to improve performance. Bug #2184 (JKM 2011/3/24)
-    - Fixed output for H5T_REFERENCE in h5dump. According to the BNF document
-      the output of a H5T_REFERENCE should be followed by the type;
-      <reference> ::= H5T_REFERENCE { <ref_type> }
-      <ref_type> ::= H5T_STD_REF_OBJECT | H5T_STD_REF_DSETREG
-      Previously this was only displayed if the -R option was used.
-      Bug #1725 (ADB 2011/3/28)
-    - Fixed two h5diff issues. 1) h5diff compared attributes correctly only 
-      when two objects had the same number of attributes and the attribute 
-      names were identical. 2) h5diff did not display useful information about 
-      attribute differences. Bug #2121 (JKM 2011/3/17)
-    - Fixed a memory leak in h5diff that occurred when accessing symbolic links 
-      with the --follow-symlink option. Bug #2214  (JKM 2011/3/18)
-    - Fixed a memory leak in h5diff that occurred when accessing variable length 
-      string data. Bug #2216 (JKM 2011/3/18)
-    - Fixed and improved the help page for h5ls -a, --address option. 
-      Bug #1904 (JKM 2011/3/11)
-    - Fixed h5copy to enable copying an object into the same HDF5 file.
-      Previously h5copy displayed an error message when the target file 
-      was the same as the source file. (XCAO 2011/3/8)
-    - Fixed an h5dump problem that caused the tool to skip some data elements 
-      in large datasets with a large array datatype on Windows. This issue 
-      arose only on Windows due to the different return behavior of the 
-      _vsnprintf() function.  Bug #2161 (JKM 2011/3/3)
-    - Fixed h5dump which was skipping some array indices in large datasets 
-      with a relatively large array datatype. The interval of skipped indices
-      varied according to the size of the array. Bug #2092 (JKM 2011/2/15)
-    - Fixed h5diff which was segfaulting when comparing compound datasets
-      with a combination of fixed-length string datatypes and variable-length
-      string datatypes in certain orders. Bug #2089 (JKM 2010/12/28)
-    - Improved h5diff performance. 1) Now use HDmemcmp() before comparing two 
-      elements. 2) Replace expensive H5Tequals() calls. 3) Retrieve datatype
-      information at dataset level, not at each element level for compound 
-      datasets. HDFFV-7516 (JKM 2011/4/18) 
-    - Fixed h5ls to display nested compound types with curly brackets 
-      when -S (--simple) option is used with -l (--label), so it shows  
-      which members (in curly brackets) belong to which nested compound type, 
-      making the output clearer.  Bug #1979 (JKM 2010/11/09)
-    - Fixed h5diff to handle variable-length strings in a compound dataset 
-      and variable-length string arrays in a compound dataset correctly.
-      Garbage values were previously displayed when h5diff compared multiple 
-      variable-length strings in a compound type dataset. 
-      Bug #1989 (JKM 2010/10/28)
-    - Fixed h5copy to fail gracefully when copying an object to a non-
-      existing group without the -p option. Bug #2040 (JKM 2010/10/18)
-
-    F90 API
-    ------
-    - None
-
-    C++ API
-    ------
-    - None
-
-    High-Level APIs:
-    ------
-    - None
-
-    Fortran High-Level APIs:
-    ------
-    -  h5tbmake_table_f: Fixed error in passing an array of characters with different 
-       length field names.
-    -  h5tget_field_info_f: Fixed error with packing the C strings into a Fortran 
-       array of strings. Added optional argument called 'maxlen_out' which returns 
-       the maximum string character length in a field name element.
-       Bug HDFFV-1255 (MSB- 4/17/2011)
-
-
-
-
-Platforms Tested
-================
-The following platforms and compilers have been tested for this release.
-
-    AIX 6.1                       xlc 11.1.0.3
-    (NCSA BP)                     xlC 11.1.0.3
-                                  xlf90 13.1.0.3
-                                  mpcc_r 11.1.0.3
-                                  mpxlf90_r 13.1.0.3
-
-    FreeBSD 8.2-STABLE i386       gcc 4.2.1 [FreeBSD] 20070719
-    (loyalty)                     g++ 4.2.1 [FreeBSD] 20070719
-                                  gcc 4.6.1 20110422
-                                  g++ 4.6.1 20110422
-                                  gfortran 4.6.1 20110422
-
-    FreeBSD 8.2-STABLE amd64      gcc 4.2.1 [FreeBSD] 20070719
-    (freedom)                     g++ 4.2.1 [FreeBSD] 20070719
-                                  gcc 4.6.1 20110422
-                                  g++ 4.6.1 20110422
-                                  gfortran 4.6.1 20110422
-
-    Linux 2.6.18-194.3.1.el5PAE   gcc (GCC) 4.1.2 and 4.4.2
-    #1 SMP i686 i686 i386         G95 (GCC 4.0.3 (g95 0.93!) Apr 21 2010)
-    (jam)                         GNU Fortran (GCC) 4.1.2 20080704 
-                                      (Red Hat 4.1.2-48) and 4.4.2
-                                  PGI C, Fortran, C++ 10.4-0 32-bit
-                                  PGI C, Fortran, C++ 10.6-0 32-bit
-                                  Intel(R) C Compiler for 32-bit
-                                      applications, Version 11.1 
-                                  Intel(R) C++ Compiler for 32-bit
-                                      applications, Version 11.1
-                                  Intel(R) Fortran Compiler for 32-bit
-                                      applications, Version 11.1
-                                  Absoft 32-bit Fortran 95 10.0.7
-                                  MPICH mpich2-1.3.1 compiled with
-                                      gcc 4.1.2 and gfortran 4.1.2
-
-    Linux 2.6.18-194.17.1.el5     gcc 4.1.2 and 4.4.2
-    #1 SMP x86_64 GNU/Linux       G95 (GCC 4.0.3 (g95 0.93!) Apr 21 2010)
-    (amani)                           tested for both 32- and 64-bit binaries
-                                  GNU Fortran (GCC) 4.1.2 20080704
-                                      (Red Hat 4.1.2-46) and 4.4.2
-                                  Intel(R) C, C++, Fortran Compilers for 
-                                      applications running on Intel(R) 64, 
-                                      Version 11.1.
-                                  PGI C, Fortran, C++ Version 9.0-4
-                                      for 64-bit target on x86-64
-                                  MPICH mpich2-1.3.1 compiled with
-                                      gcc 4.1.2 and gfortran 4.1.2
-
-    SGI ProPack 7 Linux           Intel(R) C++ Version 11.1 20100806
-    2.6.32.24-0.2.1.2230.2.PTF-   Intel(R) Fortran Version 11.1 20100806
-    default #1 SMP                SGI MPT 2.01
-    SGI Altix UV
-    (NCSA ember)
-
-    SunOS 5.10 32- and 64-bit     Sun C 5.9 Sun OS_sparc Patch 124867-16
-    (linew)                       Sun Fortran 95 8.3 Sun OS_sparc Patch 127000-13
-                                  Sun C++ 5.9 Sun OS_sparc Patch 124863-26
-                                  Sun C 5.10 SunOS_sparc Patch 141861-07
-                                  Sun Fortran 95 8.4 SunOS_sparc Patch 128231-06
-                                  Sun C++ 5.10 SunOS_sparc 128228-11
-
-    Intel Xeon Linux 2.6.18-      gcc 4.2.4
-    92.1.10.el5_lustre.1.6.6smp-  Intel(R) C++ Version 10.1.017
-    perfctr #8 SMP                Intel(R) Fortran Compiler Version 10.1.017
-    (NCSA abe)                    Open MPI 1.3.2
-                                  MVAPICH2-1.5.1_pgi-10.8
-
-    Windows XP                    Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-                                  Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-                                  Visual Studio 2010 (cmake)
-                                  Cygwin(1.7.7 native gcc(4.3.4) compiler and gfortran)
-
-    Windows XP x64                Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-                                  Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-                                  Visual Studio 2010 (cmake)
-                                  Cygwin(1.7.7 native gcc(4.3.4) compiler and gfortran)
-
-    Windows Vista                 Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Windows Vista x64             Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Windows 7                     Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Windows 7 x64                 Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Mac OS X 10.7.0 (Intel 64-bit) i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1
-    Darwin Kernel Version 10.7.0  GNU Fortran (GCC) 4.6.0 20101106 (experimental)
-                                  Intel C, C++ and Fortran compilers 12.0.1.122 20101110
-
-    Mac OS X 10.7.0 (Intel 32-bit) i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
-    Darwin Kernel Version 10.7.0  GNU Fortran (GCC) version 4.4.0 20090123 (experimental) 
-							[trunk revision 143587]
-
-    Fedora 12 2.6.32.16-150.fc12.ppc64 #1 SMP ppc64 GNU/Linux
-                                  gcc (GCC) 4.4.4 20100630 (Red Hat 4.4.4-10)
-                                  GNU Fortran (GCC) 4.4.4 20100630 (Red Hat 4.4.4-10)
-
-    Debian6.01 2.6.32-5-686 #1 SMP i686 GNU/Linux
-                                  gcc (Debian 4.4.5-8) 4.4.5
-                                  GNU Fortran (Debian 4.4.5-8) 4.4.5
-
-    Debian6.01 2.6.32-5-amd64 #1 SMP x86_64 GNU/Linux
-                                  gcc (Debian 4.4.5-8) 4.4.5
-                                  GNU Fortran (Debian 4.4.5-8) 4.4.5
-
-    Fedora14 2.6.35.12-88.fc14.i686.PAE #1 SMP i686 i686 i386 GNU/Linux
-                                  gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
-                                  GNU Fortran (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
-
-    Fedora14 2.6.35.12-88.fc14.x86_64 #1 SMP x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
-                                  GNU Fortran (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
-
-    SUSE 11.4 2.6.37.1-1.2-desktop #1 SMP PREEMPT i686 i686 i386 GNU/Linux
-                                  gcc (SUSE Linux) 4.5.1 20101208
-                                  GNU Fortran (SUSE Linux) 4.5.1 20101208
-
-    SUSE 11.4 2.6.37.1-1.2-desktop #1 SMP PREEMPT x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (SUSE Linux) 4.5.1 20101208
-                                  GNU Fortran (SUSE Linux) 4.5.1 20101208
-
-    Ubuntu 10.10 2.6.35-28-generic #50-Ubuntu SMP i686 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
-                                  GNU Fortran (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
-
-    Ubuntu 10.10 2.6.35-28-generic #50-Ubuntu SMP x86_64 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
-                                  GNU Fortran (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
-    
-    OpenVMS Alpha 8.3             HP C V7.3-009
-                                  HP Fortran V8.2-104679-48H9K
-                                  HP C++ V7.3-009
-
-Tested Configuration Features Summary
-========================================
-
-    In the tables below
-          y   = tested 
-          n   = not tested in this release
-          C   = Cluster
-          W   = Workstation
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                                 C        F90    F90      C++   zlib  SZIP
-                                         parallel        parallel
-Solaris2.10 32-bit                         n        y      n        y     y     y
-Solaris2.10 64-bit                         n        y      n        y     y     y
-Windows XP                                 n        y(4)   n        y     y     y
-Windows XP x64                             n        y(4)   n        y     y     y
-Windows Vista                              n        y(4)   n        y     y     y
-Windows Vista x64                          n        y(4)   n        y     y     y
-OpenVMS Alpha                              n        y      n        y     y     n
-Mac OS X 10.7 Intel 32-bit                 n        y      n        y     y     y
-Mac OS X 10.7 Intel 64-bit                 n        y      n        y     y     y
-AIX 6.1 32- and 64-bit                     y        y      y        y     y     y
-FreeBSD 8.2-STABLE 32&64 bit               n        x      n        x     y     y
-CentOS 5.5 Linux 2.6.18-194 i686 GNU (1)W  y        y(2)   y        y     y     y
-CentOS 5.5 Linux 2.6.18-194 i686 Intel  W  n        y      n        y     y     n
-CentOS 5.5 Linux 2.6.18-194 i686 PGI    W  n        y      n        y     y     n
-CentOS 5.5 Linux 2.6.16 x86_64 GNU (1)  W  y        y(3)   y        y     y     y
-CentOS 5.5 Linux 2.6.16 x86_64 Intel    W  n        y      n        y     y     n
-CentOS 5.5 Linux 2.6.16 x86_64 PGI      W  n        y      n        y     y     y
-RedHat EL4 2.6.18 Xeon Lustre           C  y        y      y        y     y     n
-Fedora 12 Linux 2.6.32.16-150.fc12.ppc64   n        y      n        y     y     y
-SGI Linux 2.6.32.19                        y        y      y        y     y     y
-
-
-Platform                                 Shared  Shared    Shared    Thread-  
-                                         C libs  F90 libs  C++ libs  safe     
-Solaris2.10 32-bit                         y       y         y         y        
-Solaris2.10 64-bit                         y       y         y         y        
-Windows XP                                 y       y(4)      y         n        
-Windows XP x64                             y       y(4)      y         n        
-Windows Vista                              y       y(4)      y         y
-Windows Vista x64                          y       y(4)      y         y
-OpenVMS Alpha                              n       n         n         n
-Mac OS X 10.7 Intel 32-bit                 y(5)    n         y         n        
-Mac OS X 10.7 Intel 64-bit                 y(5)    n         y         n        
-AIX 6.1 32- and 64-bit                     n       n         n         y        
-FreeBSD 8.2-STABLE 32&64 bit               y       x         x         y        
-CentOS 5.5 Linux 2.6.18-128 i686 GNU (1)W  y       y(2)      y         y        
-CentOS 5.5 Linux 2.6.18-128 i686 Intel  W  y       y         y         n        
-CentOS 5.5 Linux 2.6.18-128 i686 PGI    W  y       y         y         n        
-CentOS 5.5 Linux 2.6.16 x86_64 GNU (1)  W  y       y         y         y        
-CentOS 5.5 Linux 2.6.16 x86_64 Intel    W  y       y         y         n        
-CentOS 5.5 Linux 2.6.16 x86_64 PGI      W  y       y         y         n        
-RedHat EL4 2.6.18 Xeon Lustre           C  y       y         y         n
-Fedora 12 Linux 2.6.32.16-150.fc12.ppc64   y       y         y         y 
-SGI Linux 2.6.32.19                        y       y         y         y 
-
-           (1) Fortran compiled with gfortran.
-           (2) With PGI and Absoft compilers.
-           (3) With PGI compiler for Fortran.
-           (4) Using Visual Studio 2008 w/ Intel Fortran 10.1 (Cygwin shared libraries are not supported)
-           (5) C and C++ shared libraries will not be built when Fortran is enabled.
-    Compiler versions for each platform are listed in the preceding
-    "Platforms Tested" table.
-
-
-Known Problems
-==============
-* After the shared library support was fixed for some bugs, it was discovered
-  that "make prefix=XXX install" no longer works for shared libraries. It
-  still works correctly for static libraries. Therefore, if you want to
-  install the HDF5 shared libraries in a location such as /usr/local/hdf5,
-  you need to specify the location via the --prefix option during configure 
-  time. E.g, ./configure --prefix=/usr/local/hdf5 ...
-  (AKC - 2011/05/07 HDFFV-7583)
-
-* The parallel test, t_shapesame, in testpar/, may run for a long time and may
-  be terminated by the alarm signal.  If that happens, one can increase the
-  alarm seconds (default is 1200 seconds = 20 minutes) by setting the
-  environment variable, $HDF5_ALARM_SECONDS, to a larger value such as 3600
-  (60 minutes).  Note that the t_shapesame test may fail in some systems 
-  (see the "While working on the 1.8.6 release..." problem below).  If 
-  it does, it will waste more time if $HDF5_ALARM_SECONDS is set
-  to a larger value. (AKC - 2011/05/07)
-
-* The C++ and FORTRAN bindings are not currently working on FreeBSD.
-  (QAK - 2011/04/26)
-
-* Shared Fortran libraries are not quite working on AIX. While they are
-  generated when --enable-shared is specified, the fortran and hl/fortran
-  tests fail. We are looking into the issue. HL and C++ shared libraries
-  should now be working as intended, however. (MAM - 2011/04/20)
-
-* The --with-mpe configure option does not work with Mpich2. AKC - 2011/03/10
-
-* If parallel gmake (e.g., gmake -j 4) is used, the "gmake clean" command
-  sometimes fails in the perform directory due to the attempt to remove the
-  executable of h5perf or h5perf_serial by two "parallel" commands. This error
-  has no consequence on the functionality of the HDF5 library or install. It
-  is fixed in the next release. AKC - 2011/01/25
-
-* While working on the 1.8.6 release of HDF5, a bug was discovered that can
-  occur when reading from a dataset in parallel shortly after it has been
-  written to collectively. The issue was exposed by a new test in the parallel
-  HDF5 test suite, but had existed before that. We believe the problem lies with
-  certain MPI implementations and/or file systems.
-
-  We have provided a pure MPI test program, as well as a standalone HDF5
-  program, that can be used to determine if this is an issue on your system.
-  They should be run across multiple nodes with a varying number of processes.
-  These programs can be found at:
-  http://www.hdfgroup.org/ftp/HDF5/examples/known_problems/
-
-* The library's test dt_arith.c showed a compiler's rounding problem on
-  Cygwin when converting from unsigned long long to long double.  The 
-  library's own conversion works fine.  We defined a macro for Cygwin to
-  skip this test until we can solve the problem.  Please see bug #1813.
-  SLU - 2010/5/5 
-
-* All the VFL drivers aren't backward compatible.  In H5FDpublic.h, the
-  structure H5FD_class_t changed in 1.8.  There is new parameter added to
-  get_eoa and set_eoa callback functions.  A new callback function
-  get_type_map was added in.  The public function H5FDrealloc was taken
-  out in 1.8.  The problem only happens when users define their own driver
-  for 1.6 and try to plug in 1.8 library.  Because there's only one user 
-  complaining about it, we (Elena, Quincey, and I) decided to leave it as 
-  it is (see bug report #1279).  Quincey will make a plan for 1.10.
-  SLU - 2010/2/2
-
-* MinGW has a missing libstdc++.dll.a library file and will not successfully link
-  C++ applications/tests. Do not use the enable-cxx configure option. Read all of
-  the INSTALL_MINGW.txt file for all restrictions. ADB - 2009/11/11
-  
-* The PathScale MPI implementation, accessing a Panasas file system, would
-  cause H5Fcreate() with H5F_ACC_EXCL to fail even when the file does not
-  exist. This is due to the MPI_File_open() call failing if the mode has
-  the MPI_MODE_EXCL bit set. (See bug 1468 for details.) AKC - 2009/8/11
- 
-* Parallel tests failed with 16 processes with data inconsistency at testphdf5
-  / dataset_readAll. Parallel tests also failed with 32 and 64 processes with
-  collective abort of all ranks at t_posix_compliant / allwrite_allread_blocks
-  with MPI IO. CMC - 2009/04/28
-
-* For Red Storm, a Cray XT3 system, the tools/h5ls/testh5ls.sh and
-  tools/h5copy/testh5copy.sh will fail some of its sub-tests. These sub-tests
-  are expected to fail and should exit with a non-zero code but the yod
-  command does not propagate the exit code of the executables. Yod always
-  returns 0 if it can launch the executable.  The test suite shell expects
-  a non-zero for this particular test, therefore it concludes the test has
-  failed when it receives 0 from yod.  Skip all the "failing" test for now
-  by changing them as following.
-
-  ======== Original tools/h5ls/testh5ls.sh =========
-  TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ======== Change to ===============================
-  echo SKIP TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ==================================================
-
-  ======== Original tools/h5copy/testh5copy.sh =========
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  H5LSTEST $FILEOUT
-  ======== Change to ===============================
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  echo SKIP H5LSTEST $FILEOUT
-  ==================================================
-  AKC - 2008/11/10
-
-* For Red Storm, a Cray XT3 system, the yod command sometimes gives the
-  message,  "yod allocation delayed for node recovery".  This interferes with
-  test suites that do not expect to see this message.  See the section of "Red
-  Storm" in file INSTALL_parallel for a way to deal with this problem.
-  AKC - 2008/05/28
-
-* On an Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* On mpich 1.2.5 and 1.2.6, if more than two processes contribute no IO and 
-  the application asks to do collective IO, we have found that when using 4 
-  processors, a simple collective write will sometimes be hung. This can be 
-  verified with t_mpi test under testpar.
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  SLU - 2005/6/30
-
-* On IBM AIX systems, parallel HDF5 mode will fail some tests with error
-  messages like "INFO: 0031-XXX ...".  This is from the command `poe'.
-  Set the environment variable MP_INFOLEVEL to 0 to minimize the messages
-  and run the tests again.
-
-  The tests may fail with messages like "The socket name is already in use",  
-  but HDF5 does not use sockets.  This failure is due to problems with the 
-  poe command trying to set up the debug socket.  To resolve this problem, 
-  check to see whether there are many old /tmp/s.pedb.* files staying around.  
-  These are sockets used by the poe command and left behind due to failed 
-  commands.  First, ask your system administrator to clean them out.  
-  Lastly, request IBM to provide a means to run poe without the debug socket.
-
-* The --enable-static-exec configure flag will only statically link libraries
-  if the static version of that library is present. If only the shared version
-  of a library exists (i.e., most system libraries on Solaris, AIX, and Mac,
-  for example, only have shared versions), the flag should still result in a 
-  successful compilation, but note that the installed executables will not be 
-  fully static. Thus, the only guarantee on these systems is that the 
-  executable is statically linked with just the HDF5 library.
-
-* There is also a configure error on Altix machines that incorrectly reports 
-  when a version of Szip without an encoder is being used.
-
-* On cobalt, an SGI Altix SMP ia64 system, Intel compiler version 10.1 (which
-  is the default on that system) does not work properly and results in
-  failures during make check (in a static build) and make installcheck (during
-  a shared build). This appears to be a compiler optimization problem.
-  Reducing optimization by setting CFLAGS to -O1 or below resolves the issue.
-  Alternatively, using a newer version of the compiler (11.0) also works as
-  intended. MAM - 2010/06/01
-
-* h5diff will not report enum value differences when one or both of the values
-  is not a valid enumeration value.  The source of this bug has been identified
-  and it will be fixed in 1.8.8. DER - 2011/04/27
-
-
-%%%%1.8.6%%%%   
-
-
-HDF5 version 1.8.6 released on Mon Feb 14 10:26:30 CST 2011
-================================================================================
-
-INTRODUCTION
-============
-
-This document describes the differences between HDF5-1.8.5 and 
-HDF5 1.8.6, and contains information on the platforms tested and 
-known problems in HDF5-1.8.6. 
-For more details, see the files HISTORY-1_0-1_8_0_rc3.txt 
-and HISTORY-1_8.txt in the release_docs/ directory of the HDF5 source.
-
-Links to the HDF5 1.8.6 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
-
-     http://www.hdfgroup.org/products/hdf5/
-
-The HDF5 1.8.6 release can be obtained from:
-
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
-
-User documentation for 1.8.6 can be accessed directly at this location: 
-
-     http://www.hdfgroup.org/HDF5/doc/
-
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
-
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.6 (current 
-release) versus Release 1.8.5":
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-
-If you have any questions or comments, please send them to the HDF Help Desk:
-
-     help at hdfgroup.org
-
-
-CONTENTS
-========
-
-- New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.5
-- Platforms Tested
-- Supported Configuration Features Summary
-- Known Problems
-
-
-New Features
-============
-
-    Configuration
-    -------------
-    - CMake: Improved CPack packaging, added parallel commands, improved
-      configuration options (better similarity to configure), added more
-      tests, better support for use in external cmake projects. 
-      (ADB - 2010/10/07)
-    - The default configuration setting for official releases is 
-      --enable-production. For unofficial releases, the default configuration 
-      setting has been --disable-production. (AKC  - 2010/05/28)
-    Library
-    -------
-    - Added support for thread safety on Windows using the Windows threads 
-      library. Use the HDF5_ENABLE_THREADSAFE option in CMake on a Windows 
-      platform to enable this functionality. This is supported on Windows 
-      Vista and newer Windows operating systems. (MAM - 2010/09/10)
-    - H5Tset_order and H5Tget_order now support all datatypes.  A new byte 
-      order, H5T_ORDER_MIXED, has been added specifically for a compound 
-      datatype and its derived type.  (SLU - 2010/8/23) 
-    - Improved performance of metadata I/O by changing the default algorithm 
-      to perform I/O from all processes (instead of just process 0) when using 
-      parallel I/O drivers. (QAK - 2010/07/19)
-    - Improved performance of I/O on datasets with the same shape, but 
-      different rank. (QAK - 2010/07/19)
-    - Improved performance of the chunk cache by avoiding unnecessary b-tree 
-      lookups of chunks already in cache. (NAF - 2010/06/15) 
-      
-    Parallel Library
-    ----------------
-    - None
- 
-    Tools
-    -----
-    - h5diff: Added a new flag: --exclude-path.  The specified path to an 
-      object will be excluded when comparing two files or two groups. If a 
-      group is specified to be excluded, all member objects of that group 
-      will be excluded.  (JKM - 2010/09/16).
-    - h5ls: Added a new flag: --no-dangling-links.  See --help output for 
-      details. (JKM - 2010/06/15)
-    - h5ls: Added a new flag --follow-symlinks.  See --help output for 
-      details. (JKM - 2010/05/25)
-      
-    High-Level APIs
-    ---------------
-    - None
-
-    F90 API
-    -------
-     - None
-
-    C++ API
-    -------
-    - None
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-    - Sun C and C++ 5.10 and Sun Fortran 95 8.4.
-    - Mac OS X 10.6.4 with gcc 4.2.1 and gfortran 4.6
-
-
-Bug Fixes since HDF5-1.8.5
-==========================
-
-    Configuration
-    -------------
-    - The default number of MPI processes for testing purposes has been 
-      changed from 3 to 6.  (AKC - 2010/11/11)
-    - Some tests in tools/h5repack may fail in AIX systems when -q32 mode is 
-      used. The error is caused by not requesting enough memory in default.
-      Added "env LDR_CNTRL=MAXDATA=0x20000000 at DSA" into the $RUNSERIAL and
-      $RUNPARALLE in the AIX config file so that executables are tested with
-      more memory.  (AKC - 2010/11/11)
-    - Removed recognition of the parallel compilers of LAM(hcc) and
-      ChMPIon(cmpicc) since we have no access to these two MPI implementations
-      and cannot verify their correctness. (AKC - 2010/07/14 - Bug 1921)
-    - PHDF5 was changed to use "mpiexec" instead of mpirun as the default 
-      MPI applications startup command as defined in the MPI-2 definition, 
-      section 4.1. (AKC - 2010/06/11 - Bug 1921)
-      
-    Library
-    -------
-    - Fixed a bug that caused big endian machines to generate corrupt files
-      when using the scale-offset filter with floating point data or fill
-      values.  Note that such datasets will no longer be readable by any
-      by any machine after this patch.  (NAF - 2010/02/02 - Bug 2131)
-    - Retrieving a link's name by index in the case where the link is external
-      and the file that the link refers to doesn't exist will now fail 
-      gracefully rather than cause a segmentation fault. (MAM - 2010/11/17)
-    - Modified metadata accumulator to better track accumulated dirty metadata 
-      in an effort to reduce unnecessary I/O in certain situations and to 
-      fix some other corner cases which were prone to error. (MAM - 2010/10/15)
-    - Added a new set of unit tests that are run during 'make check' to verify 
-      the behavior of the metadata accumulator. (MAM - 2010/10/15)
-    - Modified library to always cache symbol table information.  Libraries
-      from version 1.6.3 and earler have a bug which causes them to require 
-      this information for some operations. (NAF - 2010/09/21 - Bug 1864)
-    - Fixed a bug where the library could generate an assertion/core dump when
-      a file that had been created with H5Pset_libver_bounds(fapl,
-      H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) but didn't have a superblock
-      extension was later reopened.  (QAK - 2010/09/16 - Bug 1968)
-    - Fixed a bug that could occur when getting information for a new-style
-      group that was previously opened through a file handle that was later
-      closed. (NAF - 2010/09/15)
-    - Added define check in H5public.h if stdint.h is supported by the C++
-      compiler. This define is only available on Windows with VS2010 and using
-      CMake to build the library. (ADB - 2010/09/13 - Bug 1938)
-    - When a mandatory filter failed to write data chunks, the dataset
-      couldn't close (bug 1260).  The fix releases all resources and closes
-      the dataset but returns a failure. (SLU - 2010/09/08) 
-    - H5Eset_current_stack now also closes the error stack set as the 
-      default. This is to avoid a potential problem. 
-      (SLU - 2010/09/07 - Bug 1799)
-    - Corrected situation where 1-D chunked dataset could get created by an
-      application without calling H5Pset_chunk().  H5Pset_chunk is now
-      required for creating all chunked datasets.  (QAK - 2010/09/02)
-    - Fixed many memory issues that valgrind exposed.  (QAK - 2010/08/24)
-    - Fixed the bug in the filter's public CAN_APPLY function.  The return
-      value should be htri_t not herr_t. (SLU - 2010/08/05 - Bug 1239)
-    - Fixed the STDIO VFD to use fseeko64 instead of fseek64 for 64-bit I/O 
-      support. (AKC - 2010/7/30)
-    - Fixed a bug in the direct I/O driver that could render files with certain
-      kinds of unaligned data unreadable or corrupt them. (NAF - 2010/07/28)
-    - valgrind reported an error of copying data to itself when a new attribute 
-      is written.  Fixed by taking out the memcpy step in the attribute code. 
-      (SLU - 2010/07/28 - Bug 1956)
-    - Corrected various issues in the MPI datatype creation code which could
-      cause resource leaks or incorrect behavior (and may improve the
-      performance as well).  (QAK - 2010/07/19)
-    - Fixed a bug that could cause file corruption when using non-default sizes
-      of addresses and/or lengths.  This bug could also cause uncorrupted files
-      with this property to be unreadable.  This bug was introduced in 1.8.5.
-      (NAF - 2010/07/16 - Bug 1951)
-
-    Parallel Library
-    ----------------
-    - None
-
-    Tools
-    -----
-    - Fixed h5diff to compare member objects and groups recursively when 
-      two files or groups are compared. (JKM - 2010/9/16 - Bug 1975)
-    - Fixed h5repack to be able to convert a dataset to COMPACT layout.
-      (JKM - 2010/09/15 - Bug 1896)
-    - Changed h5ls to not interpret special characters in object or attribute
-      names for output. (JKM - 2010/06/28 - Bug 1784)
-    - Revised the order of arguments for h5cc, h5fc, h5c++, h5pcc and h5pfc. 
-      CPPFLAGS, CFLAGS, LDFLAGS, and LIBS have been duplicated with an H5BLD_ 
-      prefix to put the flags and paths from the hdf5 build in the correct 
-      places and allow the script user to add entries in CPPFLAGS, CFLAGS, 
-      LDFLAGS, and LIBS that will take precedence over those from the hdf5 
-      build. The user can make these entries persistent by editing 
-      CFLAGSBASE, CPPFLAGSBASE, LDFLAGSBASE, and LIBSBASE near the top of 
-      the script or temporary by setting HDF5_CFLAGS, HDF5_CPPFLAGS, 
-      HDF5_LDFLAGS, or HDF5_LIBS in the environment. The new order of 
-      arguments in these scripts is $CLINKER $H5BLD_CPPFLAGS $CPPFLAGS 
-      $H5BLD_CFLAGS $CFLAGS $LDFLAGS $clibpath $link_objs $LIBS $link_args 
-      $shared_link. (LRK - 2010/10/25 - Bug 1973)
-
-    F90 API
-    ------
-    - None
-
-    C++ API
-    ------
-    - None
-
-    High-Level APIs:
-    ------
-    - None
-
-    Fortran High-Level APIs:
-    ------
-    - None
-
-
-Platforms Tested
-================
-The following platforms and compilers have been tested for this release.
-
-    AIX 6.1                       xlc 11.1.0.3
-    (NCSA BP)                     xlC 11.1.0.3
-                                  xlf 13.1.0.3
-                                  mpcc_r 11.1.0.3
-                                  mpxlf_r 13.1.0.3
-
-    FreeBSD 6.3-STABLE i386       gcc 3.4.6 [FreeBSD] 20060305
-    (duty)                        g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.4.5 20100803
-                                  g++ 4.4.5 20100803
-                                  gfortran 4.4.5 20100803
-
-    FreeBSD 6.3-STABLE amd64      gcc 3.4.6 [FreeBSD] 20060305
-    (liberty)                     g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.4.5 20100803
-                                  g++ 4.4.5 20100803
-                                  gfortran 4.4.5 20100803
-
-    Linux 2.6.18-194.3.1.el5PAE   gcc (GCC) 4.1.2 and 4.4.2
-    #1 SMP i686 i686 i386         G95 (GCC 4.0.3 (g95 0.93!) Apr 21 2010)
-    (jam)                         GNU Fortran (GCC) 4.1.2 20080704 
-                                      (Red Hat 4.1.2-48) and 4.4.2
-                                  PGI C, Fortran, C++ 10.4-0 32-bit
-                                  PGI C, Fortran, C++ 10.6-0 32-bit
-                                  Intel(R) C Compiler for 32-bit
-                                      applications, Version 11.1 
-                                  Intel(R) C++ Compiler for 32-bit
-                                      applications, Version 11.1
-                                  Intel(R) Fortran Compiler for 32-bit
-                                      applications, Version 11.1
-                                  Absoft 32-bit Fortran 95 10.0.7
-                                  MPICH mpich2-1.3.1 compiled with
-                                      gcc 4.1.2 and gfortran 4.1.2
-
-    Linux 2.6.18-194.17.1.el5     gcc 4.1.2 and 4.4.2
-    #1 SMP x86_64 GNU/Linux       G95 (GCC 4.0.3 (g95 0.93!) Apr 21 2010)
-    (amani)                           tested for both 32- and 64-bit binaries
-                                  GNU Fortran (GCC) 4.1.2 20080704
-                                      (Red Hat 4.1.2-46) and 4.4.2
-                                  Intel(R) C, C++, Fortran Compilers for 
-                                      applications running on Intel(R) 64, 
-                                      Version 11.1.
-                                  PGI C, Fortran, C++ Version 9.0-4
-                                      for 64-bit target on x86-64
-                                  MPICH mpich2-1.3.1 compiled with
-                                      gcc 4.1.2 and gfortran 4.1.2
-
-    SGI ProPack 7 Linux           Intel(R) C++ Version 11.1 20100806
-    2.6.32.19-0.3.1.1982.0.PTF-   Intel(R) Fortran Version 11.1 20100806
-    default #1 SMP                SGI MPT 2.01
-    SGI Altix UV
-    (NCSA ember)
-
-    SunOS 5.10 32- and 64-bit     Sun C 5.9 Sun OS_sparc Patch 124867-16
-    (linew)                       Sun Fortran 95 8.3 Sun OS_sparc Patch 127000-13
-                                  Sun C++ 5.9 Sun OS_sparc Patch 124863-62
-                                  Sun C 5.10 SunOS_sparc Patch 141861-07
-                                  Sun Fortran 95 8.4 SunOS_sparc Patch 128231-06
-                                  Sun C++ 5.10 SunOS_sparc 128228-11
-
-    Intel Xeon Linux 2.6.18-      gcc 4.2.4
-    92.1.10.el5_lustre.1.6.6smp-  Intel(R) C++ Version 10.1.017
-    perfctr #8 SMP                Intel(R) Fortran Compiler Version 10.1.017
-    (NCSA abe)                    Open MPI 1.3.2
-                                  MVAPICH2-1.5.1_pgi-10.8
-
-    Windows XP                    Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-                                  Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-                                  Visual Studio 2010 (cmake)
-                                  Cygwin(1.7.7 native gcc(4.3.4) compiler and gfortran)
-
-    Windows XP x64                Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-                                  Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-                                  Visual Studio 2010 (cmake)
-                                  Cygwin(1.7.7 native gcc(4.3.4) compiler and gfortran)
-
-    Windows Vista                 Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-                                  Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Windows Vista x64             Visual Studio 2008 w/ Intel Fortran 10.1 (project files)
-                                  Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Windows 7                     Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Windows 7 x64                 Visual Studio 2008 w/ Intel Fortran 11.1 (cmake)
-
-    Mac OS X 10.6.3 (Intel 64-bit) i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1
-    Darwin Kernel Version 10.3.1  GNU Fortran (GCC) 4.5.0 20090910  
-                                  Intel C, C++ and Fortran compilers 11.1 20100806
-
-    Mac OS X 10.6.4 (Intel 32-bit) i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1
-    Darwin Kernel Version 10.4.0  GNU Fortran (GCC) 4.6.0 20101106
-                                  Intel C, C++ and Fortran compilers 12.0.0 20101110
-
-    Mac OS X 10.6.4 (Intel 64-bit) i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5659)
-    Darwin Kernel Version 10.6.0   GNU Fortran (GCC) 4.5.0 20090910 
-                                   Intel C, C++ and Fortran compilers 11.1 20100806
-
-    Fedora 12 2.6.32.16-150.fc12.ppc64 #1 SMP ppc64 GNU/Linux
-                                  gcc (GCC) 4.4.4 20100630 (Red Hat 4.4.4-10)
-                                  GNU Fortran (GCC) 4.4.4 20100630 (Red Hat 4.4.4-10)
-
-    Debian5.06 2.6.26-2-686 #1 SMP i686 GNU/Linux
-                                  gcc (Debian 4.3.2-1.1) 4.3.2
-                                  GNU Fortran (Debian 4.3.2-1.1) 4.3.2
-
-    Debian5.06 2.6.26-2-amd64 #1 SMP x86_64 GNU/Linux
-                                  gcc (Debian 4.3.2-1.1) 4.3.2
-                                  GNU Fortran (Debian 4.3.2-1.1) 4.3.2
-
-    Fedora14 2.6.35.6-48.fc14.i686.PAE #1 SMP i686 i686 i386 GNU/Linux
-                                  gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
-                                  GNU Fortran (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
-
-    Fedora14 2.6.35.6-48.fc14.x86_64 #1 SMP x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
-                                  GNU Fortran (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
-
-    SUSE 11.3 2.6.34.7-0.7-desktop #1 SMP PREEMPT i686 i686 i386 GNU/Linux
-                                  gcc (SUSE Linux) 4.5.0 20100604 [gcc-4_5-branch revision 160292]
-                                  GNU Fortran (SUSE Linux) 4.5.0 20100604 [gcc-4_5-branch revision 160292]
-
-    SUSE 11.3 2.6.34.7-0.7-desktop #1 SMP PREEMPT x86_64 x86_64 x86_64 GNU/Linux
-                                  gcc (SUSE Linux) 4.5.0 20100604 [gcc-4_5-branch revision 160292]
-                                  GNU Fortran (SUSE Linux) 4.5.0 20100604 [gcc-4_5-branch revision 160292]
-
-    Ubuntu 10.10 2.6.35-25-generic #44-Ubuntu SMP i686 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
-                                  GNU Fortran (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
-
-    Ubuntu 10.10 2.6.35-25-generic #44-Ubuntu SMP x86_64 GNU/Linux
-                                  gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
-                                  GNU Fortran (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
-    
-    OpenVMS Alpha 8.3             HP C V7.3-009
-                                  HP Fortran V8.2-104679-48H9K
-                                  HP C++ V7.3-009
-
-Tested Configuration Features Summary
-========================================
-
-    In the tables below
-          y   = tested 
-          n   = not tested in this release
-          C   = Cluster
-          W   = Workstation
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                                 C        F90    F90      C++   zlib  SZIP
-                                         parallel        parallel
-Solaris2.10 32-bit                         n        y      n        y     y     y
-Solaris2.10 64-bit                         n        y      n        y     y     y
-Windows XP                                 n        y(4)   n        y     y     y
-Windows XP x64                             n        y(4)   n        y     y     y
-Windows Vista                              n        y(4)   n        y     y     y
-Windows Vista x64                          n        y(4)   n        y     y     y
-OpenVMS Alpha                              n        y      n        y     y     n
-Mac OS X 10.6 Intel                        n        y      n        y     y     y
-AIX 6.1 32- and 64-bit                     y        y      y        y     y     y
-FreeBSD 6.3-STABLE 32&64 bit               n        y      n        y     y     y
-CentOS 5.5 Linux 2.6.18-194 i686 GNU (1)W  y        y(2)   y        y     y     y
-CentOS 5.5 Linux 2.6.18-194 i686 Intel  W  n        y      n        y     y     n
-CentOS 5.5 Linux 2.6.18-194 i686 PGI    W  n        y      n        y     y     n
-CentOS 5.5 Linux 2.6.16 x86_64 GNU (1)  W  y        y(3)   y        y     y     y
-CentOS 5.5 Linux 2.6.16 x86_64 Intel    W  n        y      n        y     y     n
-CentOS 5.5 Linux 2.6.16 x86_64 PGI      W  n        y      n        y     y     y
-RedHat EL4 2.6.18 Xeon Lustre           C  y        y      y        y     y     n
-Fedora 12 Linux 2.6.32.16-150.fc12.ppc64   n        y      n        y     y     y
-SGI Linux 2.6.32.19                        y        y      y        y     y     y
-
-
-Platform                                 Shared  Shared    Shared    Thread-  
-                                         C libs  F90 libs  C++ libs  safe     
-Solaris2.10 32-bit                         y       y         y         y        
-Solaris2.10 64-bit                         y       y         y         y        
-Windows XP                                 y       y(4)      y         n        
-Windows XP x64                             y       y(4)      y         n        
-Windows Vista                              y       y(4)      y         y
-Windows Vista x64                          y       y(4)      y         y
-OpenVMS Alpha                              n       n         n         n
-Mac OS X 10.6                              y(5)    n         y         n        
-AIX 6.1 32- and 64-bit                     n       n         n         y        
-FreeBSD 6.3-STABLE 32&64 bit               y       n         y         y        
-CentOS 5.5 Linux 2.6.18-128 i686 GNU (1)W  y       y(2)      y         y        
-CentOS 5.5 Linux 2.6.18-128 i686 Intel  W  y       y         y         n        
-CentOS 5.5 Linux 2.6.18-128 i686 PGI    W  y       y         y         n        
-CentOS 5.5 Linux 2.6.16 x86_64 GNU (1)  W  y       y         y         y        
-CentOS 5.5 Linux 2.6.16 x86_64 Intel    W  y       y         y         n        
-CentOS 5.5 Linux 2.6.16 x86_64 PGI      W  y       y         y         n        
-RedHat EL4 2.6.18 Xeon Lustre           C  y       y         y         n
-Fedora 12 Linux 2.6.32.16-150.fc12.ppc64   y       y         y         y 
-SGI Linux 2.6.32.19                        y       y         y         y 
-
-           (1) Fortran compiled with gfortran.
-           (2) With PGI and Absoft compilers.
-           (3) With PGI compiler for Fortran.
-           (4) Using Visual Studio 2008 w/ Intel Fortran 10.1 (Cygwin shared libraries are not supported)
-           (5) C and C++ shared libraries will not be built when Fortran is enabled.
-    Compiler versions for each platform are listed in the preceding
-    "Platforms Tested" table.
-
-
-Known Problems
-==============
-* examples/run-all-ex.sh does not work on Cygwin. (NAF - 2011/02/11)
-
-* Parallel test, t_shapesame in testpar, is rather unstable as it continues to
-  have occasional errors in AIX and quite often in NCSA Abe. It is being built
-  but it is not run automatically in the "make check" command. One would have to
-  run it by hand to see if it works in a particular machine. AKC - 2011/01/28
-
-* Although OpenVMS Alpha is supported, there are several problems with the C
-  test suite - getname.c, lheap.c, lheap.c, mtime.c, and stab.c.  The test
-  suite for h5diff also fails.  These failures are from the tests, not the
-  library.  We have fixed these failures.  But it's too late to put the fixes
-  into this release.  If you install the 1.8.6 library, it should still work
-  despite of these test failures.  If you want the working copy without any
-  test failure, you can request it from us.  SLU - 2011/01/26 
-
-* If parallel gmake (e.g., gmake -j 4) is used, the "gmake clean" command
-  sometimes fails in the perform directory due to the attempt to remove the
-  executable of h5perf or h5perf_serial by two "parallel" commands. This error
-  has no consequence on the functionality of the HDF5 library or install. It
-  is fixed in the next release. AKC - 2011/01/25
-
-* While working on the 1.8.6 release of HDF5, a bug was discovered that can
-  occur when reading from a dataset in parallel shortly after it has been
-  written to collectively. The issue was exposed by a new test in the parallel
-  HDF5 test suite, but had existed before that. We believe the problem lies with
-  certain MPI implementations and/or filesystems.
-
-  We have provided a pure MPI test program, as well as a standalone HDF5
-  program, that can be used to determine if this is an issue on your system.
-  They should be run across multiple nodes with a varying number of processes.
-  These programs can be found at:
-  http://www.hdfgroup.org/ftp/HDF5/examples/known_problems/
-
-* The h5diff tool can display garbage values when variable-length strings in 
-  a compound type dataset are compared. This also occurs with variable-length 
-  string arrays in a compound type dataset. See bug #1989. This will be fixed 
-  in the next release. JKM - 2010/11/05
-
-* The AIX --enable-shared setting does not quite work. It can produce a shared 
-  library, but there cannot be more than one shared library that is 
-  interlinked. This means that the high level APIs will not work which is not 
-  very useful. We hope to have a solution in the next release. 
-  (AKC - 2010/10/15)
-  
-* H5Eset_auto can cause a seg fault for a library API call if the application
-  compiles with -DH5_USE_16_API (see bug 1707).  It will be fixed in the 
-  next release. SLU - 2010/10/5
-  
-* The library's test dt_arith.c showed a compiler's rounding problem on 
-  Cygwin when converting an unsigned long long to a long double.  The 
-  library's own conversion works fine.  We defined a macro for Cygwin to 
-  skip this test until we can solve the problem.  Please see bug #1813. 
-  SLU - 2010/5/5
-  
-* All the VFL drivers aren't backwardly compatible.  In H5FDpublic.h, the 
-  structure H5FD_class_t changed in 1.8.  A new parameter was added to the 
-  get_eoa and set_eoa callback functions, and a new callback function 
-  get_type_map was added. The public function H5FDrealloc was taken out in 
-  1.8.  The problem only happens when users define their own driver for 1.6 
-  and try to plug in a 1.8 library. This will be fixed in 1.10. SLU - 2010/2/2
-
-* MinGW has a missing libstdc++.dll.a library file and will not successfully link
-  C++ applications/tests. Do not use the enable-cxx configure option. Read all of
-  the INSTALL_MINGW.txt file for all restrictions. ADB - 2009/11/11
-  
-* The PathScale MPI implementation, accessing a Panasas file system, would 
-  cause H5Fcreate() with H5F_ACC_EXCL to fail even when the file does not 
-  exist. This is due to the MPI_File_open() call failing if the amode has 
-  the MPI_MODE_EXCL bit set. (See bug 1468 for details.) AKC - 2009/8/11
-
-* Parallel tests failed with 16 processes with data inconsistency at testphdf5
-  / dataset_readAll. Parallel tests also failed with 32 and 64 processes with
-  collective abort of all ranks at t_posix_compliant / allwrite_allread_blocks
-  with MPI IO. CMC - 2009/04/28
-
-* For Red Storm, a Cray XT3 system, the tools/h5ls/testh5ls.sh and 
-  tools/h5copy/testh5copy.sh will fail some of their sub-tests. These 
-  sub-tests are expected to fail and should exit with a non-zero code but 
-  the yod command does not propagate the exit code of the executables. Yod 
-  always returns 0 if it can launch the executable.  The test suite shell 
-  expects a non-zero for this particular test. Therefore, it concludes the 
-  test has failed when it receives 0 from yod.  To skip all the "failing" 
-  tests for now, change them as shown below.
-  
-  ======== Original tools/h5ls/testh5ls.sh =========
-  TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ======== Change to ===============================
-  echo SKIP TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ==================================================
-
-  ======== Original tools/h5copy/testh5copy.sh =========
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  H5LSTEST $FILEOUT
-  ======== Change to ===============================
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  echo SKIP H5LSTEST $FILEOUT
-  ==================================================
-  AKC - 2008/11/10
-
-* For Red Storm, a Cray XT3 system, the yod command sometimes gives the 
-  message  "yod allocation delayed for node recovery."  This interferes 
-  with test suites that do not expect to see this message.  See the "Red Storm" 
-  section in file INSTALL_parallel for a way to deal with this problem. 
-  AKC - 2008/05/28
-  
-* On an Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use the -mp -O1 compilation flags to build the libraries. A higher level 
-  of optimization causes failures in several HDF5 library tests.
-  
-* On mpich 1.2.5 and 1.2.6 on a system using four processors, if more than 
-  two processes contribute no I/O and the application asks to do collective 
-  I/O, we have found that a simple collective write will sometimes hang. This 
-  can be verified with the t_mpi test under testpar.
-  
-* A dataset created or rewritten with a v1.6.3 or later library cannot be 
-  read with the v1.6.2 or earlier library when the Fletcher32 EDC filter 
-  is enabled. There was a bug in the calculation of the Fletcher32 checksum 
-  in the library before v1.6.3; the checksum value was not consistent 
-  between big-endian and little-endian systems.  This bug was fixed in 
-  Release 1.6.3. However, after fixing the bug, the checksum value was no 
-  longer the same as before on little-endian system.  Library releases after 
-  1.6.4 can still read datasets created or rewritten with an HDF5 library of 
-  v1.6.2 or earlier. SLU - 2005/6/30
-  
-* On IBM AIX systems, parallel HDF5 mode will fail some tests with error 
-  messages like "INFO: 0031-XXX ...".  This is from the command `poe'. To 
-  work around this, set the environment variable MP_INFOLEVEL to 0 to 
-  minimize the messages and run the tests again. The tests may fail with 
-  messages like "The socket name is already in use", but HDF5 does not use 
-  sockets. This failure is due to problems with the poe command trying to 
-  set up the debug socket.  To resolve this problem, check to see whether 
-  there are any old /tmp/s.pedb.* files around. These are sockets used by 
-  the poe command and left behind if the command failed at some point. To 
-  resolve this, ask your system administrator to remove the 
-  old/tmp/s.pedb.* files, and then ask IBM to provide a means to run poe 
-  without the debug socket.
-
-* The --enable-static-exec configure flag will only statically link 
-  libraries if the static version of that library is present. If only the 
-  shared version of a library exists (i.e., most system libraries on 
-  Solaris, AIX, and Mac, for example, only have shared versions), the flag 
-  should still result in a successful compilation, but note that the 
-  installed executables will not be fully static. Thus, the only guarantee 
-  on these systems is that the executable is statically linked with just 
-  the HDF5 library.
-  
-* On an SGI Altix SMP ia64 system, the Intel compiler version 10.1 (which 
-  is the default on that system) does not work properly and results in 
-  failures during the make check (in a static build) and the make 
-  installcheck (in a shared build). This appears to be a compiler 
-  optimization problem. Reducing the optimization by setting CFLAGS to 
-  -O1 or below resolves the issue. Using a newer version of the compiler 
-  (11.0) avoids the issue. MAM - 2010/06/01
-  
-* On solaris systems, when running the examples with the scripts installed in
-  .../share/hdf5_examples, two of the c tests, h5_extlink and h5_elink_unix2win 
-  may fail or generate HDF5 errors because the script commands in c/run-c-ex.sh 
-  fail to create test directories red, blue, and u2w.  Moving the '!' in lines 
-  67, 70, 73 of run-c-ex.sh will fix the problem.  For example the script command 
-  "if ! test -d red; then" will work on solaris if changed to 
-  "if test ! -d red; then".
-
-
-%%%%1.8.5%%%%   
-
-
-HDF5 version 1.8.5 released on Fri Jun  4 13:27:31 CDT 2010
-================================================================================
-
-INTRODUCTION
-============
-
-This document describes the differences between HDF5-1.8.4 and HDF5 1.8.5, and
-contains information on the platforms tested and known problems in HDF5-1.8.5. 
-For more details, see the files HISTORY-1_0-1_8_0_rc3.txt and HISTORY-1_8.txt 
-in the release_docs/ directory of the HDF5 source.
-
-Links to the HDF5 1.8.5 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
-
-     http://www.hdfgroup.org/products/hdf5/
-
-The HDF5 1.8.5 release can be obtained from:
-
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
-
-User documentation for 1.8.5 can be accessed directly at this location: 
-
-     http://www.hdfgroup.org/HDF5/doc/
-
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
-
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.5 (current 
-release) versus Release 1.8.4":
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-
-If you have any questions or comments, please send them to the HDF Help Desk:
-
-     help at hdfgroup.org
-
-
-CONTENTS
-========
-
-- New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.4
-- Platforms Tested
-- Supported Configuration Features Summary
-- Known Problems
-
-
-New Features
-============
-
-    Configuration
-    -------------
-    - CMake Early Access: This release adds support for building HDF5 using
-      the CMake system. Initial work has targeted Windows, but other platforms
-      can be used. See the CMake.TXT file for more information. Version
-      2.8.1 of CMake is required.
-    - Configure now adds appropriate defines for supporting large (64-bit)
-      files on all systems, where supported, by default, instead of only Linux.
-      This large file support is controllable with the --enable-largefile 
-      configure option. The Linux-specific --enable-linux-lfs option has been 
-      deprecated in favor of this new option. Please note that specifying
-      --disable-large does NOT attempt to "turn off" largefile support if it
-      is natively supported by the compiler, but rather just disables 
-      configure from actively trying to add any additional compiler flags.
-      (MAM - 2010/05/05 - Bug # 1772/1434)
-    - Fixed an signal handling mask error in H5detect that might result in
-      SIGBUS or SIGSEGV failures in some platforms such as Linux on Sparc.
-      (AKC - 2010/4/28 - Bug # 1764)
-    - Fixed various "strict aliasing" problems, allowing higher levels
-      of compiler optimization (in particular, allowing '-O3' to work
-      with recent versions of GCC).  (QAK - 2010/04/26)
-    - Upgraded versions of autotools used to generate configuration suite.
-      We now use Automake 1.11.1, Autoconf 2.65, and Libtool 2.2.6b. 
-      (MAM - 2010/04/15)
-    - Added the xlc-* and mpcc_r-* BASENAME patterns to be recognized as IBM
-      compilers so that the IBM compiler options can be added properly.  This
-      allows non-system-default compiler command names (e.g. xlc-m.n.k.l) be
-      recognized. (AKC - 2009/11/26)
-
-    Library
-    -------
-    - Performance is substantially improved when extending a dataset with early 
-      allocation. (NAF - 2010/03/24 - Bug # 1637)
-    - Added support for filtering densely stored groups.  Many of the API
-      functions related to filters have been extended to support dense groups
-      as well as datasets.  Pipeline messages can now be stored in a group's
-      object header. (NAF/QAK - 2009/11/3)
-
-    Parallel Library
-    ----------------
-    - None
- 
-    Tools
-    -----
-    - h5dump: Added the new packed bits feature which prints packed bits stored
-      in an integer dataset. (AKC/ADB - 2010/5/7) 
-    - h5diff: Fixed incorrect behavior (hang) in parallel mode when specifying 
-      invalid options (ex: -v and -q). (JKM - 2010/02/17)
-    - h5diff: Added new flag --no-dangling-links (see --help for details).
-      (JKM - 2010/02/10) 
-    - h5diff: Added new flag --follow-symlinks (see --help for details).
-      (JKM - 2010/01/25)
-    - h5diff: Added a fix to correct the display of garbage values when 
-      displaying big-endian data on a little-endian machine. (JKM - 2009/11/20)
-
-    High-Level APIs
-    ---------------
-    - None
-
-    F90 API
-    -------
-    - None
-
-    C++ API
-    -------
-    - New member functions
-        + Overloaded CommonFG::getObjnameByIdx to take char* for name.
-        + Overloaded CommonFG::getObjTypeByIdx to return type name as a char*.
-          (BMR - 2010/05/10)
-        + Added DataSet::getInMemDataSize() to simplify getting the dataset's
-          data size in memory.  (BMR - 2009/07/26)
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-    - AIX 6.1 has been added. (AKC - 2010/1/4)
-
-
-Bug Fixes since HDF5-1.8.4
-==========================
-
-    Configuration
-    -------------
-    - Fixed various "strict aliasing" problems, allowing higher levels
-      of compiler optimization (in particular, allowing '-O3' to work
-      with recent versions of GCC).  (QAK - 2010/04/26)
-
-    Library
-    -------
-    - Fixed a file corruption bug that could happen when shrinking a compressed
-      dataset. (NAF - 2010/05/20)
-    - Fixed some memory leaks in VL datatype conversion when strings are
-      used as fill values. (MAM - 2010/05/12 - Bug # 1826)
-    - Fixed an H5Rcreate failure when passing in a -1 for the dataspace 
-      identifier. (ADB - 2010/4/28)
-    - Fixed a bug when copying objects with NULL references with the
-      H5O_COPY_EXPAND_REFERENCE_FLAG flag set. (NAF - 2010/04/08 - Bug # 1815)
-    - Added a mechanism to the H5I interface to save returned object identifier 
-      structures for immediate re-use if needed. This addresses a potential 
-      performance issue by delaying the case when the next identifier to be
-      registered has grown so large that it wraps around and needs to be
-      checked to see whether it is available for distribution.
-      (MAM - 2010/03/15 - Bug # 1730)
-    - Files can now be concurrently opened more than once using the core file
-      driver, as long as the backing store is used. (NAF - 2010/03/09)
-    - Added support for H5O_COPY_EXPAND_EXT_LINK_FLAG to H5Ocopy.  External
-      links will now be expanded if this flag is set.
-      (NAF - 2010/03/05 - Bug # 1733)
-    - Fixed a bug where the library, when traversing an external link, would
-      reopen the source file if nothing else worked. (NAF - 2010/03/05)
-    - Fixed a bug where fractal heap identifiers for attributes and shared 
-      object header messages could be incorrectly encoded in the file for 
-      files created on big-endian platforms.  
-      Please see http://www.hdfgroup.org/HDF5/release/known_problems if you 
-      suspect you have a file with this problem.  
-      (QAK - 2010/02/23 - Bug # 1755)
-    - Fixed an intermittent bug in the b-tree code which could be triggered
-      by expanding and shrinking chunked datasets in certain ways.
-      (NAF - 2010/02/16)
-    - H5Tdetect_class said a VL string is a string type.  But when it's in
-      a compound type, it said it's a VL type.  THis has been fixed to be 
-      consistent; it now always returns a string type. 
-      (SLU - 2009/12/10 - Bug # 1584)
-    - Allow "child" files from external links to be correctly located when
-      relative to a "parent" file that is opened through a symbolic link.
-      (QAK - 2009/12/01)
-
-    Parallel Library
-    ----------------
-    - Parallel mode in AIX will fail some of the testcheck_version.sh tests
-      where it treats "exit(134) the same as if process 0 had received an abort
-      signal.  Fixed.  (AKC - 2009/11/3)
-
-    Tools
-    -----
-    - Fixed h5ls to return exit code 1 (error) when a non-existent file is
-      specified. (JKM - 2010/04/27 - Bug # 1793)
-    - Fixed h5copy failure when copying a dangling link that is specified 
-      directly. (JKM - 2010/04/22 - Bug # 1817)
-    - Fixed an h5repack failure that lost attributes from a dataset of 
-      reference type. (JKM - 2010/3/25 - Bug # 1726)
-    - Fixed h5repack error that set NULL for object reference values for
-      datasets, groups, or named datatypes. (JKM - 2010/03/19 - Bug # 1814)
-
-    F90 API
-    ------
-    - None 
-
-    C++ API
-    ------
-    - The constructor PropList::PropList(id) was fixed to act properly
-      according to the nature of 'id'.  When 'id' is a property class 
-      identifier, a new property list will be created.  When 'id' is a 
-      property list identifier, a copy of the property list will be made. 
-      (BMR - 2010/5/9)
-    - The parameters 'size' and 'bufsize' in CommonFG::getLinkval and
-      CommonFG::getComment, respectively, now have default values for the
-      user's convenience.  (BMR - 2009/10/23)
-    - NULL pointer accessing was fixed.  (BMR - 2009/10/05 - Bug # 1061)
-    - Read/write methods of DataSet and Attribute classes were fixed
-      to handle string correctly.  (BMR - 2009/07/26)
-
-    High-Level APIs:
-    ------
-    - Fixed a bug in H5DSattach_scale, H5DSis_attached, and H5DSdetach_scale
-      caused by using the H5Tget_native_type function to determine the native
-      type for reading the REFERENCE_LIST attribute. This bug was exposed
-      on Mac PPC.  (EIP - 2010/05/22 - Bug # 1851) 
-    - Fixed a bug in the H5DSdetach_scale function when 0 bytes were   
-      allocated after the last reference to a dimension scale was removed         
-      from the list of references in a VL element of the DIMENSION_LIST 
-      attribute.  Modified the function to comply with the specification: 
-      the DIMENSION_LIST attribute is now deleted when no dimension scales 
-      are left attached.  (EIP - 2010/05/14 - Bug # 1822)
-
-    Fortran High-Level APIs:
-    ------
-    - None 
-
-
-Platforms Tested
-================
-The following platforms and compilers have been tested for this release.
-
-    AIX 5.3                       xlc 7.0.0.9, 8.0.0.20, 9.0.0.4
-    (LLNL Up)                     xlC 7.0.0.9, 8.0.0.20, 9.0.0.4
-                                  xlf 9.1.0.9, 10.1.0.9, 11.1.0.7
-                                  mpcc_r 7.0.0.9
-                                  mpxlf_r 09.01.0000.0008
-
-    AIX 6.1                       xlc 10.1.0.6
-    (NCSA BP)                     xlC 10.1.0.6
-                                  xlf 12.1.0.7
-
-    Cray XT3 (2.1.56)             cc (pgcc) 10.0-0
-    (SNL red storm)               ftn (pgf90) 10.0-0
-                                  CC (pgCC) 10.0-0
-
-    FreeBSD 6.3-STABLE i386       gcc 3.4.6 [FreeBSD] 20060305
-    (duty)                        g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.3.4 20090419
-                                  g++ 4.3.4 20090419
-                                  gfortran 4.3.4 20090419
-
-    FreeBSD 6.3-STABLE amd64      gcc 3.4.6 [FreeBSD] 20060305
-    (liberty)                     g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.4.1 20090421
-                                  g++ 4.4.1 20090421
-                                  gfortran 4.4.1 20090421
-
-    Linux 2.6.18-128.1.6.el5xen   gcc (GCC) 4.1.2 20080704 and 4.4.2
-    #1 SMP i686 i686 i386         GNU Fortran (GCC) 4.1.2 20080704 and 4.4.2
-    (jam)                         g++ (GCC) 4.1.2 20080704 and 4.4.2
-                                  G95 (GCC 4.0.3 (g95 0.93!) Apr 21 2010)
-                                  Absoft 32-bit Fortran 95 10.0.7
-                                  PGI C, Fortran, C++ 10.4-0 32-bit
-                                  Intel(R) C, C++, Fortran Compilers for 32-bit
-                                     applications, Version 11.1 Build 20090827
-                                  MPICH mpich2-1.0.8 compiled with
-                                     gcc 4.1.2 and GNU Fortran (GCC) 4.1.2
-
-    Linux 2.6.18-164.el5 #1 SMP   gcc 4.1.2 20080704 and gcc 4.4.2 
-    x86_64 GNU/Linux              GNU Fortran (GCC) 4.1.2 20080704 and 4.4.2
-    (amani)                       g++ (GCC) 4.1.2 20080704 and 4.4.2 
-                                  G95 (GCC 4.0.3 (g95 0.93!) Apr 21 2010)
-                                  Intel(R) C, C++, Fortran Compilers for 
-                                     applications running on Intel(R) 64, 
-                                     Version 11.1 Build 20090827.
-                                  PGI C, Fortran, C++ Version 10.4-0
-                                         for 32 & 64-bit target on x86-64
-                                  MPICH mpich2-1.0.8 compiled with
-                                     gcc 4.1.2 and GNU Fortran (GCC) 4.1.2
-
-    Linux 2.6.16.54-0.2.5 #1      Intel(R) C++ Version 11.0.074
-    SGI Altix SMP ia64            Intel(R) Fortran Itanium(R) Version 11.0.074
-    (cobalt)                      SGI MPI 1.38
-
-    SunOS 5.10 32- and 64-bit     Sun C 5.9 SunOS_sparc Patch 124867-14
-    (linew)                       Sun Fortran 95 8.3 SunOS_sparc 
-                                     Patch 127000-13 
-                                  Sun C++ 5.9 SunOS_sparc Patch 124863-23
-                                  
-    Intel Xeon Linux 2.6.18-      Intel(R) C++ Version 10.0.026
-    92.1.10.el5_lustre.1.6.6smp-  Intel(R) Fortran Compiler Version 10.0.026
-    perfctr #7 SMP                Open MPI 1.2.2
-    (abe)                         MVAPICH2-0.9.8p28p2patched-intel-ofed-1.2
-                                  compiled with icc v10.0.026 and ifort 10.0.026
-                                  
-    Linux 2.6.18-76chaos #1 SMP   Intel(R) C, C++, Fortran Compilers for 
-    SMP x86_64 GNU/Linux          applications running on Intel(R) 64, 
-    (SNL Glory)                   Versions 11.1.
-    
-    Windows XP                    Visual Studio 2008 w/ Intel Fortran 10.1
-                                  Cygwin(1.7.5 native gcc(4.3.4) compiler and 
-                                  gfortran)
-
-    Windows XP x64                Visual Studio 2008 w/ Intel Fortran 10.1
-
-    Windows Vista                 Visual Studio 2008 w/ Intel Fortran 10.1
-
-    Windows Vista x64             Visual Studio 2008 w/ Intel Fortran 10.1
-
-    MAC OS  10.6.3 (Intel)        i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 
-    (pahra)                       GNU Fortran (GCC) 4.5.0 20090910
-                                  i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 
-                                  Intel C, C++ and Fortran compilers 11.1
-    
-    MAC OS  10.5.8 (Intel)        i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1
-    (tejeda)
-
-    MAC OS  10.5 (PPC)            powerpc-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1
-    (juniper-w)
-
-    OpenVMS Alpha V8.3            HP C V7.3-009
-                                  HP C++ V7.3-009
-                                  HP Fortran V8.0-1-104669-48GBT      
-
-Supported Configuration Features Summary
-========================================
-
-    In the tables below
-          y   = tested and supported
-          n   = not supported or not tested in this release
-          C   = Cluster
-          W   = Workstation
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                           C        F90    F90      C++   zlib  SZIP
-                                   parallel        parallel
-Solaris2.10 32-bit                   n        y      n        y     y     y
-Solaris2.10 64-bit                   n        y      n        y     y     y
-Windows XP                           n        y(4)   n(4)     y     y     y
-Windows XP x64                       n        y(4)   n(4)     y     y     y
-Windows Vista                        n        y(4)   n(4)     y     y     y
-Windows Vista x64                    n        y(4)   n(4)     y     y     y
-Mac OS X 10.5 PPC                    n        n      n        n     y     n 
-Mac OS X 10.5 Intel                  n        y      n        y     y     y
-Mac OS X 10.6 Intel                  n        y      n        y     y     y
-AIX 5.3 32- and 64-bit               n        y      n        y     y     n
-AIX 6.1 32- and 64-bit               n        y      n        y     y     n
-FreeBSD 6.3-STABLE 32&64 bit         n        y      n        y     y     y
-RedHat EL4 2.6.9-42 i686 GNU (1)  W  y        y      y        y     y     y
-RedHat EL5 2.6.18-128 i686 GNU (1)W  y        y(2)   y        y     y     y
-RedHat EL5 2.6.18-128 i686 Intel  W  n        y      n        y     y     n
-RedHat EL5 2.6.18-128 i686 PGI    W  n        y      n        y     y     n
-SuSe Linux 2.6.16 x86_64 GNU (1)  W  y        y(3)   y        y     y     y
-SuSe Linux 2.6.16 x86_64 Intel    W  n        y      n        y     y     n
-SuSe Linux 2.6.16 x86_64 PGI      W  n        y      n        y     y     y
-SuSe Linux 2.6.16 SGI Altix ia64  C  y        y      y        y     y     y
-RedHat EL4 2.6.18 Xeon Lustre     C  y        y      y        y     y     n
-Cray XT3 2.1.56                      y        y      y        y     y     n
-OpenVMS Alpha V8.3                   n        y      n        y     y     n
-
-Platform                           Shared  Shared    Shared    Thread-  
-                                   C libs  F90 libs  C++ libs  safe     
-Solaris2.10 32-bit                   y       y         y         y        
-Solaris2.10 64-bit                   y       y         y         y        
-Windows XP                           y       y(4)      y         n        
-Windows XP x64                       y       y(4)      y         n        
-Windows Vista                        y       y(4)      y         n        
-Windows Vista x64                    y       y(4)      y         n        
-Mac OS X 10.5 PPC                    y       n         n         n        
-Mac OS X 10.5 (Intel)                y(5)    n         y         n        
-Mac OS X 10.6 (Intel)                y(5)    n         y         n        
-AIX 5.3 32- and 64-bit               n       n         n         n        
-AIX 6.1 32- and 64-bit               n       n         n         n        
-FreeBSD 6.3-STABLE 32&64 bit         y       n         y         y        
-RedHat EL4 2.6.9-42 i686 GNU (1)  W  y       y         y         y        
-RedHat EL5 2.6.18-128 i686 GNU (1)W  y       y(2)      y         y        
-RedHat EL5  2.6.18-128 i686 Intel W  y       y         y         n        
-RedHat EL5 2.6.18-128 i686 PGI    W  y       y         y         n        
-SuSe Linux 2.6.16 x86_64 GNU (1)  W  y       y         y         y        
-SuSe Linux 2.6.16 x86_64 Intel    W  y       y         y         n        
-SuSe Linux 2.6.16 x86_64 PGI      W  y       y         y         n        
-SuSe Linux 2.6.16 SGI Altix ia64  C  y                           n 
-RedHat EL4 2.6.18 Xeon Lustre     C  y       y         y         n
-Cray XT3 2.1.56                      n       n         n         n
-OpenVMS Alpha V8.3                   n       n         n         n
-
-           (1) Fortran compiled with g95.
-           (2) With PGI and Absoft compilers.
-           (3) With PGI compiler for Fortran.
-           (4) Using Visual Studio 2008. (Cygwin shared libraries are not 
-               supported.)
-           (5) Shared C and C++ are disabled when Fortran is configured in.
-    Compiler versions for each platform are listed in the preceding
-    "Platforms Tested" table.
-
-
-Known Problems
-==============
-* The library's test dt_arith.c exposed a compiler's rounding problem on
-  Cygwin when converting from unsigned long long to long double.  The 
-  library's own conversion works correctly.  A macro is defined for Cygwin 
-  to skip this test until we can solve the problem.  (Please see bug #1813.)
-  SLU - 2010/5/5 
-
-* All the VFL drivers aren't backward compatible.  In H5FDpublic.h, the
-  structure H5FD_class_t changed in 1.8.  There is a new parameter added to
-  get_eoa and set_eoa callback functions.  A new callback function
-  get_type_map was added.  The public function H5FDrealloc was taken
-  out in 1.8.  The problem only happens when users define their own driver
-  for 1.6 and try to plug it into a 1.8 library.  This affects a very small
-  number of users.  (See bug report #1279.)  SLU - 2010/2/2
-
-* MinGW has a missing libstdc++.dll.a library file and will not successfully 
-  link C++ applications/tests. Do not use the enable-cxx configure option. 
-  Read all of the INSTALL_MINGW.txt file for all restrictions. 
-  ADB - 2009/11/11
-  
-* Some tests in tools/h5repack may fail in AIX systems when -q32 mode is used.
-  The error is due to insufficient memory requested. Request a large amount
-  of runtime memory by setting the following environment variable for more
-  memory.
-     LDR_CNTRL=MAXDATA=0x20000000 at DSA
-  AKC - 2009/10/31
-
-* The PathScale MPI implementation, accessing a Panasas file system, would
-  cause H5Fcreate() with H5F_ACC_EXCL to fail even when the file is not
-  existing. This is due to the MPI_File_open() call failing if the amode has
-  the MPI_MODE_EXCL bit set. (See bug 1468 for details.) AKC - 2009/8/11
- 
-* Parallel tests failed with 16 processes with data inconsistency at testphdf5
-  / dataset_readAll. Parallel tests also failed with 32 and 64 processes with
-  collective abort of all ranks at t_posix_compliant / allwrite_allread_blocks
-  with MPI IO. CMC - 2009/04/28
-
-* For gcc v4.3 and v4.4, with production mode, if -O3 is used, H5Tinit.c
-  would fail to compile. Actually bad H5Tinit.c is produced.  If -O (same
-  as -O1) is used, H5Tinit.c compiled okay but test/dt_arith would fail.
-  When -O0 (no optimizatio) is used, H5Tinit.c compilete okay and all
-  tests passed. Therefore, -O0 is imposed for v4.3 and v4.4 of gcc.
-  AKC - 2009/04/20
-
-* For Red Storm, a Cray XT3 system, the tools/h5ls/testh5ls.sh and
-  tools/h5copy/testh5copy.sh will fail some of its sub-tests. These sub-tests
-  are expected to fail and should exit with a non-zero code but the yod
-  command does not propagate the exit code of the executables. Yod always
-  returns 0 if it can launch the executable.  The test suite shell expects
-  a non-zero for this particular test, therefore it concludes the test has
-  failed when it receives 0 from yod.  Skip all the "failing" test for now
-  by changing them as following.
-
-  ======== Original tools/h5ls/testh5ls.sh =========
-  TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ======== Change to ===============================
-  echo SKIP TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ==================================================
-
-  ======== Original tools/h5copy/testh5copy.sh =========
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  H5LSTEST $FILEOUT
-  ======== Change to ===============================
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  echo SKIP H5LSTEST $FILEOUT
-  ==================================================
-  AKC - 2008/11/10
-
-* For Red Storm, a Cray XT3 system, the yod command sometimes gives the
-  message,  "yod allocation delayed for node recovery".  This interferes with
-  test suites that do not expect seeing this message.  See the section of "Red
-  Storm" in file INSTALL_parallel for a way to deal with this problem.
-  AKC - 2008/05/28
-
-* On Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* On mpich 1.2.5 and 1.2.6, if more than two processes contribute no IO and 
-  the application asks to do collective IO, we have found that when using 4 
-  processors, a simple collective write will sometimes be hung. This can be 
-  verified with t_mpi test under testpar.
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  SLU - 2005/6/30
-
-* On IBM AIX systems, parallel HDF5 mode will fail some tests with error
-  messages like "INFO: 0031-XXX ...".  This is from the command `poe'.
-  Set the environment variable MP_INFOLEVEL to 0 to minimize the messages
-  and run the tests again.
-
-  The tests may fail with messages like "The socket name is already in use,"  
-  but HDF5 does not use sockets.  This failure is due to problems with the 
-  poe command trying to set up the debug socket.  To resolve this problem, 
-  check to see whether there are many old /tmp/s.pedb.* files staying around.  
-  These are sockets used by the poe command and left behind due to failed 
-  commands.  First, ask your system administrator to clean them out.  
-  Lastly, request IBM to provide a means to run poe without the debug socket.
-
-* The --enable-static-exec configure flag will only statically link libraries
-  if the static version of that library is present. If only the shared version
-  of a library exists (i.e., most system libraries on Solaris, AIX, and Mac,
-  for example, only have shared versions), the flag should still result in a 
-  successful compilation, but note that the installed executables will not be 
-  fully static. Thus, the only guarantee on these systems is that the 
-  executable is statically linked with just the HDF5 library.
-
-* There is also a configure error on Altix machines that incorrectly reports 
-  when a version of Szip without an encoder is being used.
-
-* On FREE-BSD systems when shared libraries are disabled, make install fails
-  in install-examples with the error '"Makefile", line 635: Need an operator'.
-  When this error occurs removing or commenting out the line "export
-  LD_LIBRARY_PATH=$(LL_PATH)" (line 635 in examples/Makefile) will allow make
-  install to finish installing examples.  The problem will be fixed in the
-  next release. LRK - 2010/05/26
-
-* On cobalt, an SGI Altix SMP ia64 system, Intel compiler version 10.1 (which
-  is the default on that system) does not work properly and results in
-  failures during make check (in a static build) and make installcheck (during
-  a shared build). This appears to be a compiler optimization problem.
-  Reducing optimization by setting CFLAGS to -O1 or below resolves the issue.
-  Alternatively, using a newer version of the compiler (11.0) also works as
-  intended. MAM - 2010/06/01
-
-
-%%%%1.8.4%%%%   
-
-
-HDF5 version 1.8.4 released on Tue Nov 10 15:33:14 CST 2009
-================================================================================
-
-INTRODUCTION
-============
-
-This document describes the differences between HDF5-1.8.3 and 
-HDF5 1.8.4, and contains information on the platforms tested and 
-known problems in HDF5-1.8.4
-For more details, see the files HISTORY-1_0-1_8_0_rc3.txt 
-and HISTORY-1_8.txt in the release_docs/ directory of the HDF5 source.
-
-Links to the HDF5 1.8.4 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
-
-     http://www.hdfgroup.org/products/hdf5/
-
-The HDF5 1.8.4 release can be obtained from:
-
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
-
-User documentation for 1.8.4 can be accessed directly at this location: 
-
-     http://www.hdfgroup.org/HDF5/doc/
-
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
-
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.4 (current 
-release) versus Release 1.8.3":
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-
-If you have any questions or comments, please send them to the HDF Help Desk:
-
-     help at hdfgroup.org
-
-
-CONTENTS
-========
-
-- New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.3
-- Platforms Tested
-- Supported Configuration Features Summary
-- Known Problems
-
-
-New Features
-============
-
-    Configuration
-    -------------
-    - Configuration suite now uses Automake 1.11 and Autoconf 2.64.
-      MAM 2009/08/31.
-    - Changed default Gnu fortran compiler from g95 to gfortran since
-      gfortran is more likely installed with gcc now. -AKC 2009/07/19- 
-
-    Library
-    -------
-    - The embedded library information is displayed by H5check_version() if a
-      version mismatch is detected.  Also changed H5check_version() to
-      suppress the warning message totally if $HDF5_DISABLE_VERSION_CHECK is 2
-      or higher. (Old behavior treated 3 or higher the same as 1, that is
-      print a warning and allows the program to continue. (AKC - 2009/9/28)
-    - If a user does not care for the extra library information insert
-      in the executables, he may turn it off by --disable-embedded-libinfo
-      during configure. (AKC - 2009/9/15)
-
-    Parallel Library
-    ----------------
-    - None
- 
-    Tools
-    -----
-    - h5diff: h5diff treats two INFINITY values different. Fixed by checking
-      (value==expect) before call ABS(...) at h5diff_array.c. This will make 
-      that (INF==INF) is true (INF is treated as an number instead of NaN) 
-      (PC -- 2009/07/28)
-    - h5diff: add option "--use-system-epsilon" to print difference if 
-      (|a-b| > EPSILON).
-      Change default to use strict equality (PC -- 2009/09/12)
-
-    High-Level APIs
-    ---------------
-    - None
-
-    F90 API
-    -------
-     - Added H5Oopen_by_addr_f MSB - 9/14/09
-
-    C++ API
-    -------
-    - None
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-    - PathScale compilers are recognized and can build the HDF5 library
-      properly. AKC - 2009/7/28 -
-
-
-Bug Fixes since HDF5-1.8.3
-==========================
-
-    Configuration
-    -------------
-    - Removed the following config files, as we no longer support them:
-        config/dec-osf*, config/hpux11.00, config/irix5.x, 
-        config/powerpc-ibm-aix4.x config/rs6000-ibm-aix5.x config/unicos*
-      MAM - 2009/10/08
-    - Modified configure and make process to properly preserve user's CFLAGS
-      (and company) environment variables. Build will now properly use
-      automake's AM_CFLAGS for any compiler flags set by the configure
-      process. Configure will no longer modify CFLAGS directly, nor will 
-      setting CFLAGS during make completely replace what configure has set up.
-      MAM - 2009/10/08
-    - Support for TFLOPS, config/intel-osf1, is removed since the TFLOPS
-      machine has long retired. AKC - 2009/10/06.
-    - Added $(EXEEXT) extension to H5detect when it's executed in the
-      src/Makefile to generate H5Tinit.c so it works correctly on platforms 
-      that require the full extension when running executables.
-      MAM - 2009/10/01 - BZ #1613
-    - Configure will now set FC and CXX to "no" when fortran and c++
-      are not being compiled, respectively, so configure will not run
-      some of the compiler tests for these languages when they are not 
-      being used. MAM - 2009/10/01
-    - The --enable-static-exec flag will now properly place the -static flag
-      on the link line of all installed executables. This will force the 
-      executable to link with static libraries over shared libraries, provided
-      the static libraries are available. MAM - 2009/08/31 - BZ #1583
-    - The PathScale compiler (v3.2) was mistaken as gcc v4.2.0 but it fails to
-      recognize some gcc options. Fixed. (see bug 1301). AKC - 2009/7/28 -
-
-    Library
-    -------
-    - Fixed a bug where writing and deleting many global heap objects (i.e.
-      variable length data) would render the file unreadable.  Previously
-      created files exhibiting this problem should now be readable.
-      NAF - 2009/10/27 - 1483
-    - Fixed error in library's internal caching mechanisms which could cause
-      an assertion failure (and attendent core dump) when encountering an
-      unusually formatted file.  (QAK - 2009/10/13)
-    - Fixed incorrect return value for H5Pget_preserve. AKC - 2009/10/08 - 1628
-    - Fixed an assertion failure that occurred when H5Ocopy was called on a
-      dataset using a vlen inside a compound. NAF - 2009/10/02 - 1597
-    - Fixed incorrect return value for H5Pget_filter_by_id1/2 in H5Ppublic.h.
-      NAF - 2009/09/25 - 1620
-    - Fixed a bug where properties weren't being compared with the registered
-      compare callback. NAF - 2009/09/25 - 1555
-    - Corrected problem where library would re-write the superblock in a file
-      opened for R/W access, even when no changes were made to the file.
-      (QAK - 2009/08/20, Bz#1473)
-    - Fixed a bug where H5Pget_filter_by_id would succeed when called for a
-      filter that wasn't present. NAF - 2009/06/25 - 1250
-    - Fixed an issue with committed compound datatypes containing a vlen. Also
-      fixed memory leaks involving committed datatypes. NAF - 2009/06/10 - 1593
-
-    Parallel Library
-    ----------------
-    - None
-
-    Tools
-    -----
-    - h5dump/h5ls display buffer resize fixed in tools library.
-      ADB - 2009/7/21 - 1520
-    - perf_serial test added to Windows projects and check batch file. 
-      ADB - 2009/06/11 -1504
-
-
-    F90 API
-    ------
-    - Fixed bug in h5lget_info_by_idx_f by adding missing arguments, 
-      consequently changing the API. New API is:
-
-      SUBROUTINE h5lget_info_by_idx_f(loc_id, group_name, index_field, order, n, &
-        link_type, f_corder_valid, corder, cset, address, val_size, hdferr, lapl_id)
-
-        MSB - 2009/9/17 - 1652
-
-    - Corrected the values for the H5L_flags FORTRAN constants: 
-        H5L_LINK_ERROR_F, H5L_LINK_HARD_F, H5L_LINK_SOFT_F, H5L_LINK_EXTERNAL_F
-        MSB - 2009-09-17 - 1653
-
-    - Added FORTRAN equivalent of C constant H5T_ORDER_NONE: H5T_ORDER_NONE_F
-        MSB - 2009-9-24 - 1471
-
-    C++ API
-    ------
-    - None
-
-    High-Level APIs:
-    ------
-    - Fixed a bug where the H5TB API would forget the order of fields when added
-      out of offset order. NAF - 2009/10/27 - 1582
-    - H5DSis_attached failed to account for different platform types. Added a
-      get native type call. ADB - 2009/9/29 - 1562
-
-    Fortran High-Level APIs:
-    ------
-    - Lite: the h5ltread_dataset_string_f and h5ltget_attribute_string_f functions 
-           had memory problems with the g95 fortran compiler. (PVN � 5/13/2009) 1522
-
-
-
-Platforms Tested
-================
-The following platforms and compilers have been tested for this release.
-
-    AIX 5.3                       xlc 7.0.0.8
-    (LLNL Up)                     xlf 09.01.0000.0008
-                                  xlC 7.0.0.8
-                                  mpcc_r 7.0.0.8
-                                  mpxlf_r 09.01.0000.0008
-
-    Cray XT3 (2.0.41)             cc (pgcc) 7.1-4
-    (SNL red storm)               ftn (pgf90) 7.1-4
-                                  CC (pgCC) 7.1-4
-
-    FreeBSD 6.3-STABLE i386       gcc 3.4.6 [FreeBSD] 20060305
-    (duty)                        g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.3.5 20091004
-                                  g++ 4.3.5 20091004
-                                  gfortran 4.3.5 20091004
-
-    FreeBSD 6.3-STABLE amd64      gcc 3.4.6 [FreeBSD] 20060305
-    (liberty)                     g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.4.2 20091006
-                                  g++ 4.4.2 20091006
-                                  gfortran 4.4.2 20091006
-
-    Linux 2.6.18-164.el5          gcc (GCC) 4.1.2 20080704
-    #1 SMP i686 i686 i386         G95 (GCC 4.0.3 (g95 0.92!) Jun 24 2009)
-    (jam)                         GNU Fortran (GCC) 4.1.2 20080704 
-                                  (Red Hat 4.1.2-46)
-                                  PGI C, Fortran, C++ 8.0-5 32-bit
-                                  PGI C, Fortran, C++ 8.0-1 32-bit
-                                  Intel(R) C Compiler for 32-bit
-                                      applications, Versions 11.0, 11.1
-                                  Intel(R) C++ Compiler for 32-bit
-                                      applications, Version 11.0, 11.1
-                                  Intel(R) Fortran Compiler for 32-bit
-                                      applications, Version 11.0, 11.1
-                                  Absoft 32-bit Fortran 95 10.0.7
-                                  MPICH mpich2-1.0.8 compiled with
-                                  gcc (GCC) 4.1.2 and G95 
-                                  (GCC 4.0.3 (g95 0.92!)
-
-    Linux 2.6.18-164.el5 #1 SMP   gcc 4.1.2 20080704
-    x86_64 GNU/Linux              G95 (GCC 4.0.3 (g95 0.92!) Jun 24 2009)
-    (amani)                       tested for both 32- and 64-bit binaries
-                                  Intel(R) C, C++, Fortran Compilers for 
-                                  applications running on Intel(R) 64, 
-                                  Versions 11.1.
-                                  PGI C, Fortran, C++ Version 9.0-4
-                                         for 64-bit target on x86-64
-                                  gcc 4.1.2 and G95  (GCC 4.0.3 (g95 0.92!)
-                                  MPICH mpich2-1.0.8 compiled with
-                                  gcc 4.1.2 and G95 (GCC 4.0.3 (g95 0.92!)
-                                  GNU Fortran (GCC) 4.1.2 20080704
-                                  (Red Hat 4.1.2-46)
-
-
-    Linux 2.6.16.60-0.42.5 #1     Intel(R) C++ Version 10.1.017
-    SGI Altix SMP ia64            Intel(R) Fortran Itanium(R) Version 10.1.017
-    (cobalt)                      SGI MPI 1.38
-
-    SunOS 5.10 32- and 64-bit     Sun C 5.9 SunOS_sparc Patch 124867-11 2009/04/30
-    (linew)                       Sun Fortran 95 8.3 SunOS_sparc 
-                                  Patch 127000-11 2009/10/06
-                                  Sun C++ 5.9 SunOS_sparc 
-                                  Patch 124863-16 2009/09/15 
-
-    Intel Xeon Linux 2.6.18-      Intel(R) C++ Version 10.0.026
-    92.1.10.el5_lustre.1.6.6smp-  Intel(R) Fortran Compiler Version 10.0.026
-    perfctr #6 SMP                Open MPI 1.2.2
-    (abe)                         MVAPICH2-0.9.8p28p2patched-intel-ofed-1.2
-                                  compiled with icc v10.0.026 and ifort 10.0.026
-
-    IA-64 Linux 2.4.21-309.tg1    gcc (GCC) 3.2.2
-    #1 SMP ia64                   Intel(R) C++ Version 8.1.037
-    (NCSA tg-login)               Intel(R) Fortran Compiler Version 8.1.033
-                                  mpich-gm-1.2.7p1..16-intel-8.1.037-r1
-
-    Linux 2.6.9-55.0.9.EL_lustre  Intel(R) C, C++, Fortran Compilers for 
-    .1.4.11.1smp #1 SMP           applications running on Intel(R) 64, 
-    SMP x86_64 GNU/Linux          Versions 10.1.
-    (SNL Thunderbird)             
-                                  
-    Linux 2.6.18-76chaos #1 SMP   Intel(R) C, C++, Fortran Compilers for 
-    SMP x86_64 GNU/Linux          applications running on Intel(R) 64, 
-    (SNL Glory)                   Versions 10.1.
-    
-    Windows XP                    Visual Studio 2005 w/ Intel Fortran 9.1
-                                  Cygwin(native gcc compiler and g95)
-
-    Windows XP x64                Visual Studio 2005 w/ Intel Fortran 9.1
-
-    Windows Vista                 Visual Studio 2005 w/ Intel Fortran 9.1
-
-    Windows Vista x64             Visual Studio 2005 w/ Intel Fortran 9.1
-
-    MAC OS  10.5.6 (Intel)        i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1
-                                  GNU Fortran (GCC) 4.3.0 20070810
-                                  G95 (GCC 4.0.3 (g95 0.91!) Apr 24 2008)
-                                  Intel C, C++ and Fortran compilers 10.1
-
-
-Supported Configuration Features Summary
-========================================
-
-    In the tables below
-          y   = tested and supported
-          n   = not supported or not tested in this release
-          C   = Cluster
-          W   = Workstation
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                           C        F90    F90      C++   zlib  SZIP
-                                   parallel        parallel
-Solaris2.10 32-bit                   n        y      n        y     y     y
-Solaris2.10 64-bit                   n        y      n        y     y     y
-Windows XP                           n        y(4)   n(4)     y     y     y
-Windows XP x64                       n        y(4)   n(4)     y     y     y
-Windows Vista                        n        n      n        y     y     y
-Mac OS X 10.5 Intel                  n        y      n        y     y     y
-AIX 5.3 32- and 64-bit               n        y      n        y     y     n
-FreeBSD 6.3-STABLE 32&64 bit         n        y      n        y     y     y
-RedHat EL5 2.6.18-164 i686 GNU (1)W  y        y(2)   y        y     y     y
-RedHat EL5 2.6.18-164 i686 Intel  W  n        y      n        y     y     n
-RedHat EL5 2.6.18-164 i686 PGI    W  n        y      n        y     y     n
-RedHat EL5 2.6.18-164 x86_64 GNU(1)W y        y(3)   y        y     y     y
-RedHat EL5 2.6.18-164 x86_64 IntelW  n        y      n        y     y     n
-RedHat EL5 2.6.18-164 x86_64 PGI  W  n        y      n        y     y     y
-SuSe Linux 2.6.16 SGI Altix ia64  C  y        y      y        y     y     y
-RedHat EL4 2.6.18 Xeon Lustre     C  y        y      y        y     y     n
-SuSe Linux 2.4.21 ia64 Intel      C  y        y      y        y     y     n
-Cray XT3 2.0.62                      y        y      y        y     y     n
-
-
-Platform                           Shared  Shared    Shared    Thread-  
-                                   C libs  F90 libs  C++ libs  safe     
-Solaris2.10 32-bit                   y       y         y         y        
-Solaris2.10 64-bit                   y       y         y         y        
-Windows XP                           y       y(4)      y         y        
-Windows XP x64                       y       y(4)      y         y        
-Windows Vista                        y       n         n         y        
-Mac OS X 10.5                        y       n         y         n        
-AIX 5.3 32- and 64-bit               n       n         n         n        
-FreeBSD 6.3-STABLE 32&64 bit         y       y         y         y        
-RedHat EL5 2.6.18-164 i686 GNU (1)W  y       y(2)      y         y        
-RedHat EL5 2.6.18-164 i686 Intel  W  y       y         y         n        
-RedHat EL5 2.6.18-164 i686 PGI    W  y       y         y         n        
-RedHat EL5 2.6.18-164 x86_64 GNU(1)W y       y         y         y        
-RedHat EL5 2.6.18-164 x86_64 IntelW  y       y         y         n        
-RedHat EL5 2.6.18-164 x86_64 PGI  W  y       y         y         n        
-SuSe Linux 2.6.16 SGI Altix ia64  C  y                           n        
-RedHat EL4 2.6.18 Xeon Lustre     C  y       y         y         n
-SuSe Linux 2.4.21 ia64 Intel      C  y       y         y         n        
-Cray XT3 2.0.62                      n       n         n         n
-
-           (1) Fortran compiled with g95.
-           (2) With PGI and Absoft compilers.
-           (3) With PGI compiler for Fortran.
-           (4) Using Visual Studio 2005 or Cygwin
-    Compiler versions for each platform are listed in the preceding
-    "Platforms Tested" table.
-
-
-Known Problems
-==============
-* Parallel mode in AIX will fail some of the testcheck_version.sh tests where
-  it treats "exit(134) the same as if process 0 had received an abort signal.
-  This is fixed and will be available in the next release. AKC - 2009/11/3
-
-* Some tests in tools/h5repack may fail in AIX systems when -q32 mode is used.
-  The error is due to insufficient memory requested. Request a large amount
-  of runtime memory by setting the following environment variable for more
-  memory.
-     LDR_CNTRL=MAXDATA=0x20000000 at DSA
-  AKC - 2009/10/31
-
-* The PathScale MPI implementation, accessing a Panasas file system, would
-  cause H5Fcreate() with H5F_ACC_EXCL to fail even when the file is not
-  existing. This is due to the MPI_File_open() call failing if the amode has
-  the MPI_MODE_EXCL bit set. (See bug 1468 for details.) AKC - 2009/8/11
- 
-* Parallel tests failed with 16 processes with data inconsistency at testphdf5
-  / dataset_readAll. Parallel tests also failed with 32 and 64 processes with
-  collective abort of all ranks at t_posix_compliant / allwrite_allread_blocks
-  with MPI IO. CMC - 2009/04/28
-
-* There is a known issue in which HDF5 will change the timestamp on a file 
-  simply by opening it with read/write permissions, even if the file is not
-  modified in any way. This is due to the way in which HDF5 manages the file 
-  superblock. A fix is currently underway and should be included in the 1.8.4
-  release of HDF5. MAM - 2009/04/28
-
-* For gcc v4.3 and v4.4, with production mode, if -O3 is used, H5Tinit.c
-  would fail to compile. Actually bad H5Tinit.c is produced.  If -O (same
-  as -O1) is used, H5Tinit.c compiled okay but test/dt_arith would fail.
-  When -O0 (no optimizatio) is used, H5Tinit.c compilete okay and all
-  tests passed. Therefore, -O0 is imposed for v4.3 and v4.4 of gcc.
-  AKC - 2009/04/20
-
-* For Red Storm, a Cray XT3 system, the tools/h5ls/testh5ls.sh and
-  tools/h5copy/testh5copy.sh will fail some of its sub-tests. These sub-tests
-  are expected to fail and should exit with a non-zero code but the yod
-  command does not propagate the exit code of the executables. Yod always
-  returns 0 if it can launch the executable.  The test suite shell expects
-  a non-zero for this particular test, therefore it concludes the test has
-  failed when it receives 0 from yod.  Skip all the "failing" test for now
-  by changing them as following.
-
-  ======== Original tools/h5ls/testh5ls.sh =========
-  TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ======== Change to ===============================
-  echo SKIP TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ==================================================
-
-  ======== Original tools/h5copy/testh5copy.sh =========
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  H5LSTEST $FILEOUT
-  ======== Change to ===============================
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  echo SKIP H5LSTEST $FILEOUT
-  ==================================================
-  AKC - 2008/11/10
-
-* For Red Storm, a Cray XT3 system, the yod command sometimes gives the
-  message,  "yod allocation delayed for node recovery".  This interferes with
-  test suites that do not expect seeing this message.  See the section of "Red
-  Storm" in file INSTALL_parallel for a way to deal with this problem.
-  AKC - 2008/05/28
-
-* On Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* On mpich 1.2.5 and 1.2.6, if more than two processes contribute no IO and 
-  the application asks to do collective IO, we have found that when using 4 
-  processors, a simple collective write will sometimes be hung. This can be 
-  verified with t_mpi test under testpar.
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  SLU - 2005/6/30
-
-* On IBM AIX systems, parallel HDF5 mode will fail some tests with error
-  messages like "INFO: 0031-XXX ...".  This is from the command `poe'.
-  Set the environment variable MP_INFOLEVEL to 0 to minimize the messages
-  and run the tests again.
-
-  The tests may fail with messages like "The socket name is already in use",  
-  but HDF5 does not use sockets.  This failure is due to problems with the 
-  poe command trying to set up the debug socket.  To resolve this problem, 
-  check to see whether there are many old /tmp/s.pedb.* files staying around.  
-  These are sockets used by the poe command and left behind due to failed 
-  commands.  First, ask your system administrator to clean them out.  
-  Lastly, request IBM to provide a means to run poe without the debug socket.
-
-* The --enable-static-exec configure flag will only statically link libraries
-  if the static version of that library is present. If only the shared version
-  of a library exists (i.e., most system libraries on Solaris, AIX, and Mac, 
-  for example, only have shared versions), the flag should still result in a 
-  successful compilation, but note that the installed executables will not be 
-  fully static. Thus, the only guarantee on these systems is that the 
-  executable is statically linked with just the HDF5 library.
-
-* There is also a configure error on Altix machines that incorrectly reports 
-  when a version of Szip without an encoder is being used.
-
-%%%%1.8.3%%%%   
-
-
-HDF5 version 1.8.3 released on Mon May  4 09:21:00 CDT 2009
-================================================================================
-
-INTRODUCTION
-============
-
-This document describes the differences between HDF5-1.8.2 and 
-HDF5 1.8.3, and contains information on the platforms tested and 
-known problems in HDF5-1.8.3. 
-For more details, see the files HISTORY-1_0-1_8_0_rc3.txt 
-and HISTORY-1_8.txt in the release_docs/ directory of the HDF5 source.
-
-Links to the HDF5 1.8.3 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
-
-     http://www.hdfgroup.org/products/hdf5/
-
-The HDF5 1.8.3 release can be obtained from:
-
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
-
-User documentation for 1.8.3 can be accessed directly at this location: 
-
-     http://www.hdfgroup.org/HDF5/doc/
-
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
-
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.3 (current 
-release) versus Release 1.8.2":
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-
-If you have any questions or comments, please send them to the HDF Help Desk:
-
-     help at hdfgroup.org
-
-
-CONTENTS
-========
-
-- New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.2
-- Platforms Tested
-- Supported Configuration Features Summary
-- Known Problems
-
-
-New Features
-============
-
-    Configuration
-    -------------
-    - Added libtool version numbers to generated c++, fortran, and 
-      hl libraries. MAM 2009/04/19.
-    - Regenerated Makefile.ins using Automake 1.10.2. MAM 2009/04/19.
-    - Added a Make target of check-all-install to test the correctness of
-      installing via the prefix= or $DESTDIR options. AKC - 2009/04/14
-
-    Library
-    -------
-    - Embed the content of libhdf5.settings into the hdf5 executables
-      so that an "orphaned" executables can display (via the Unix
-      strings command, for example) the library settings used to build
-      the executables.  This is a prototype implementation. Improvement will
-      be added in next release.  AKC - 2009/04/20
-    - Separated "factory" free list class from block free lists. These free
-      lists are dynamically created and manage blocks of a fixed size.
-      H5set_free_list_limits() will use the same settings specified for block
-      free lists for factory free lists. NAF - 2009/04/08
-    - Added support for dense attributes to H5Ocopy. XCao/NAF - 2009/01/29
-    - Added H5Pset_elink_cb and H5Pget_elink_cb functions to support a
-      user-defined callback function for external link traversal.
-      NAF - 2009/01/08
-    - Added H5Pset_elink_acc_flags and H5Pget_elink_acc_flags functions to
-      allow the user to specify the file access flags used to open the target
-      file of an external link. NAF - 2009/01/08
-    - Added H5Pset_chunk_cache() and H5Pget_chunk_cache() functions to allow
-      individual rdcc configuration for each dataset.  Added
-      H5Dget_access_plist() function to retrieve a dataset access property
-      list from a dataset. NAF - 2008/11/12
-    - Added H5Iis_valid() function to check if an id is valid without
-      producing an error message. NAF - 2008/11/5
-    - Added code to maintain a min_clean_fraction in the metadata cache when
-      in serial mode. MAM - 2009/01/9
-
-    Parallel Library
-    ----------------
-    - Modified parallel tests to run with arbitrary number of processes. The
-      modified tests are testphdf5 (parallel dataset access), t_chunk_alloc
-      (chunk allocation), and t_posix_compliant (posix compliance). The rest of
-      the parallel tests already use in the code the number of processes
-      available in the communicator. (CMC - 2009/04/28)
- 
-    Tools
-    -----
-    - h5diff new flag, -c, --compare, list objects that are not comparable.
-      PVN - 2009/4/2 - 1368
-    - h5diff new flag, -N, --nan, avoids NaNs detection. PVN - 2009/4/2
-    - h5dump correctly specifies XML dtd / schema urls ADB - 2009/4/3 - 1519
-    - h5repack now handles group creation order. PVN - 2009/4/2 - 1402
-    - h5repack: When user doesn't specify a chunk size, h5repack now 
-      defines a default chunk size as the same size of the size of the 
-      hyperslab used to read the chunks. The size of the hyperslabs are 
-      defined as the size of each dimension or a predefined constant, 
-      whatever is smaller. This assures that the chunk read fits in the 
-      chunk cache. PVN - 2008/11/21
-
-    High-Level APIs
-    ---------------
-    - Table: In version 3.0 of Table, the writing of the "NROWS" attribute 
-      (used to store number of records) was deprecated. PVN - 2008/11/24
-
-    F90 API
-    -------
-    - Added for the C APIs the Fortran wrappers:
-          h5dget_access_plist_f
-          h5iis_valid_f
-          h5pset_chunk_cache_f
-          h5pget_chunk_cache_f
-      MSB - 2009/04/17
-
-    C++ API
-    -------
-    - None
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-
-
-Bug Fixes since HDF5-1.8.2
-==========================
-
-    Configuration
-    -------------
-    - The --includedir=DIR configuration option now works as intended, and 
-      can be used to specify the location to install C header files. The
-      default location remains unchanged, residing at ${prefix}/include.
-      MAM - 2009/03/10 - BZ #1381
-    - Configure no longer removes the '-g' flag from CFLAGS when in production
-      mode if it has been explicitly set in the CFLAGS environment variable 
-      prior to configuration. MAM - 2009/03/09 - BZ #1401
-
-    Library
-    -------
-    - Added versioning to H5Z_class_t struct to allow compatibility with 1.6
-      API. NAF - 2009/04/20 - 1533
-    - Fixed a problem with using data transforms with non-native types in the
-      file. NAF - 2009/04/20 - 1548
-    - Added direct.h include file to windows section of H5private.h 
-      to fix _getcwd() warning. ADB - 2009/04/14 - 1536
-    - Fixed a bug that prevented external links from working after calling
-      H5close(). NAF - 2009/04/10 - 1539
-    - Modified library to write cached symbol table information to the
-      superblock, to allow library versions 1.3.0 to 1.6.3 to read files created
-      by this version. NAF - 2009/04/08 - 1423
-    - Changed skip lists to use a deterministic algorithm.  The library should
-      now never call rand() or srand(). NAF - 2009/04/08 - 503
-    - Fixed a bug where H5Lcopy and H5Lmove wouldn't create intermediate groups
-      when that property was set. NAF - 2009/04/07 - 1526
-    - Fixed a bug that caused files with a user block to grow by the size of the
-      user block every time they were opened. NAF - 2009/03/26 - 1499
-    - Fixed a rare problem that could occur with files using the old (pre 1.4)
-      array datatype. NAF - 2009/03/23
-    - Modified library to be able to open files with corrupt root group symbol
-      table messages, and correct these errors if they are found.  Such files
-      can only be successfully opened with write access. NAF - 2009/03/23 - 1189
-    - Removed the long_long #define and replaced all instances with 
-      "long long". This caused problems with third party products. All 
-      currently supported compliers support the type. ADB - 2009/03/05
-    - Fixed various bugs that could prevent the fill value from being written
-      in certain rare cases. NAF - 2009/02/26 - 1469
-    - Fixed a bug that prevented more than one dataset chunk from being cached
-      at a time. NAF - 2009/02/12 - 1015
-    - Fixed an assertion failure caused by opening an attribute multiple times
-      through multiple file handles. NAF - 2009/02/12 - 1420
-    - Fixed a problem that could prevent the user from adding attributes (or any
-      object header message) in some circumstances. NAF - 2009/02/12 - 1427
-    - Fixed a bug that could cause problems when an attribute was added to a
-      committed datatype using the committed datatype's datatype.
-      NAF - 2009/02/12
-    - Fixed a bug that could cause problems when copying an object with a shared
-      message in its own object header. NAF - 2009/01/29
-    - Changed H5Tset_order to properly reject H5T_ORDER_NONE for most datatypes.
-      NAF - 2009/01/27 - 1443
-    - Fixed a bug where H5Tpack wouldn't remove trailing space from an otherwise
-      packed compound type. NAF - 2009/01/14
-    - Fixed up some old v2 btree assertions that get run in debug mode that
-      were previously failing on compilation, and removed some of the 
-      more heavily outdated and non-rewritable ones. MAM - 2008/12/15
-    - Fixed a bug that could cause problems when "automatically" unmounting
-      multiple files. NAF - 2008/11/17
-    - H5Dset_extent: when shrinking dimensions, some chunks were not deleted.  
-      PVN - 2009/01/8 
-
-    Parallel Library
-    ----------------
-    - None
-
-    Tools
-    -----
-    - Fixed many problems that could occur when using h5repack with named
-      datatypes. NAF - 2009/4/20 - 1516/1466
-    - h5dump, h5diff, h5repack were not reading (by hyperslabs) datasets 
-      that have a datatype datum size greater than H5TOOLS_BUFSIZE, a constant
-      defined as 1024Kb, such as array types with large dimensions. 
-      PVN - 2009/4/1 - 1501
-    - h5import: By selecting a compression type, a big endian byte order 
-      was being selected. PVN - 2009/3/11 - 1462
-    - zip_perf.c had missing argument on one of the open() calls. Fixed.
-      AKC - 2008/12/9
-
-    F90 API
-    ------
-    - None
-
-    C++ API
-    ------
-    - None
-
-    High-Level APIs:
-    ------
-    - Dimension scales: The scale index return value in H5DSiterate_scales 
-      was not always incremented. PVN - 2009/4/8 - 1538
-
-    Fortran High-Level APIs:
-    ------
-    - Lite: The h5ltget_dataset_info_f function (gets information about 
-      a dataset) was not correctly returning the dimension array 
-                                   PVN - 2009/3/23
-
-
-Platforms Tested
-================
-The following platforms and compilers have been tested for this release.
-
-    AIX 5.3                       xlc 7.0.0.8
-    (LLNL Up)                     xlf 09.01.0000.0008
-                                  xlC 7.0.0.8
-                                  mpcc_r 7.0.0.8
-                                  mpxlf_r 09.01.0000.0008
-
-    Cray XT3 (2.0.41)             cc (pgcc) 7.1-4
-    (SNL red storm)               ftn (pgf90) 7.1-4
-                                  CC (pgCC) 7.1-4
-
-    FreeBSD 6.3-STABLE i386       gcc 3.4.6 [FreeBSD] 20060305
-    (duty)                        g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.3.4 20090419
-                                  g++ 4.3.4 20090419
-                                  gfortran 4.3.4 20090419
-
-    FreeBSD 6.3-STABLE amd64      gcc 3.4.6 [FreeBSD] 20060305
-    (liberty)                     g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.4.1 20090421
-                                  g++ 4.4.1 20090421
-                                  gfortran 4.4.1 20090421
-
-    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.4.4m
-                                  F90 MIPSpro 7.4.4m 
-                                  C++ MIPSpro cc 7.4.4m
-
-    Linux 2.6.18-128.1.6.el5xen   gcc (GCC) 4.1.2
-    #1 SMP i686 i686 i386         G95 (GCC 4.0.3 (g95 0.92!) Feb 4 2009)
-    (jam)                         PGI C, Fortran, C++ 7.2-1 32-bit
-                                  PGI C, Fortran, C++ 8.0-1 32-bit
-                                  Intel(R) C Compiler for 32-bit
-                                      applications, Versions 10.1, 11.0
-                                  Intel(R) C++ Compiler for 32-bit
-                                      applications, Version 10.1, 11.0
-                                  Intel(R) Fortran Compiler for 32-bit
-                                      applications, Version 10.1, 11.0
-                                  Absoft 32-bit Fortran 95 10.0.7
-                                  MPICH mpich2-1.0.8 compiled with
-                                  gcc 4.1.2 and G95  (GCC 4.0.3 (g95 0.92!)
-
-    Linux 2.6.9-42.0.10.ELsmp #1  gcc (GCC) 3.4.6
-    SMP i686 i686 i386            G95 (GCC 4.0.3 (g95 0.92!) Feb 4 2009)
-    (kagiso)                      MPICH mpich2-1.0.8 compiled with
-                                  gcc 3.4.6 and G95  (GCC 4.0.3 (g95 0.92!)
-
-    Linux 2.6.16.60-0.37-smp #1   gcc 4.1.2
-    SMP x86_64 GNU/Linux          G95 (GCC 4.0.3 (g95 0.92!) Feb 4 2009)
-    (smirom)                      Intel(R) C, C++, Fortran Compilers for 
-                                  applications running on Intel(R) 64, 
-                                  Versions 10.1, 11.0.
-                                  PGI C, Fortran, C++ Version 7.2-1, 8.0-1
-                                         for 64-bit target on x86-64
-                                  gcc 4.1.2 and G95  (GCC 4.0.3 (g95 0.92!)
-                                  MPICH mpich2-1.0.8 compiled with
-                                  gcc 4.1.2 and G95 (GCC 4.0.3 (g95 0.92!)
-                                  tested for both 32- and 64-bit binaries
-
-    Linux 2.6.16.54-0.2.5 #1      Intel(R) C++ Version 10.1.017
-    SGI Altix SMP ia64            Intel(R) Fortran Itanium(R) Version 10.1.017
-    (cobalt)                      SGI MPI 1.38
-
-    SunOS 5.10 32- and 64-bit     Sun WorkShop 6 update 2 C 5.9 Patch 124867-09
-    (linew)                       Sun WorkShop 6 update 2 Fortran 95 8.3 
-                                  Patch 127000-07
-                                  Sun WorkShop 6 update 2 C++ 5.8 
-                                  Patch 124863-11
-
-    Intel Xeon Linux 2.6.18-      gcc 3.4.6 20060404
-    92.1.10.el5_lustre.1.6.6smp-  Intel(R) C++ Version 10.0.026
-    perfctr #2 SMP                Intel(R) Fortran Compiler Version 10.0.026
-    (abe)                         Open MPI 1.2.2
-                                  MVAPICH2-0.9.8p28p2patched-intel-ofed-1.2
-                                  compiled with icc v10.0.026 and ifort 10.0.026
-
-    IA-64 Linux 2.4.21-309.tg1    gcc (GCC) 3.2.2
-    #1 SMP ia64                   Intel(R) C++ Version 8.1.037
-    (NCSA tg-login)               Intel(R) Fortran Compiler Version 8.1.033
-                                  mpich-gm-1.2.7p1..16-intel-8.1.037-r1
-
-    Linux 2.6.9-55.0.9.EL_lustre  Intel(R) C, C++, Fortran Compilers for 
-    .1.4.11.1smp #1 SMP           applications running on Intel(R) 64, 
-    SMP x86_64 GNU/Linux          Versions 9.1.
-    (SNL Spirit)             
-                                  
-    Linux 2.6.9-55.0.9.EL_lustre  Intel(R) C, C++, Fortran Compilers for 
-    .1.4.11.1smp #1 SMP           applications running on Intel(R) 64, 
-    SMP x86_64 GNU/Linux          Versions 10.1.
-    (SNL Thunderbird)             
-                                  
-    Linux 2.6.18-63chaos #1 SMP   Intel(R) C, C++, Fortran Compilers for 
-    SMP x86_64 GNU/Linux          applications running on Intel(R) 64, 
-    (SNL Glory)                   Versions 10.1.
-    
-    Linux 2.6.18-63chaos #1 SMP   Intel(R) C, C++, Fortran Compilers for 
-    SMP x86_64 GNU/Linux          applications running on Intel(R) 64, 
-    (LLNL Zeus)                   Versions 9.1.
-				  gcc/gfortran/g++ (GCC) 4.1.2.
-
-    Windows XP                    Visual Studio .NET
-                                  Visual Studio 2005 w/ Intel Fortran 9.1
-                                  Cygwin(native gcc compiler and g95)
-
-    Windows XP x64                Visual Studio 2005 w/ Intel Fortran 9.1
-
-    Windows Vista                 Visual Studio 2005
-
-    MAC OS  10.5.6 (Intel)        i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1
-                                  GNU Fortran (GCC) 4.3.0 20070810
-                                  G95 (GCC 4.0.3 (g95 0.91!) Apr 24 2008)
-                                  Intel C, C++ and Fortran compilers 10.1
-
-
-Supported Configuration Features Summary
-========================================
-
-    In the tables below
-          y   = tested and supported
-          n   = not supported or not tested in this release
-          C   = Cluster
-          W   = Workstation
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                           C        F90    F90      C++   zlib  SZIP
-                                   parallel        parallel
-Solaris2.10 32-bit                   n        y      n        y     y     y
-Solaris2.10 64-bit                   n        y      n        y     y     y
-IRIX64_6.5 32-bit                    n        n      n        n     y     y
-IRIX64_6.5 64-bit                    n        y      y        y     y     y
-Windows XP                           n        y(4)   n(4)     y     y     y
-Windows XP x64                       n        y(4)   n(4)     y     y     y
-Windows Vista                        n        n      n        y     y     y
-Mac OS X 10.5 Intel                  n        y      n        y     y     y
-AIX 5.3 32- and 64-bit               n        y      n        y     y     n
-FreeBSD 6.3-STABLE 32&64 bit         n        y      n        y     y     y
-RedHat EL4 2.6.9-42 i686 GNU (1)  W  y        y      y        y     y     y
-RedHat EL5 2.6.18-128 i686 GNU (1)W  y        y(2)   y        y     y     y
-RedHat EL5 2.6.18-128 i686 Intel  W  n        y      n        y     y     n
-RedHat EL5 2.6.18-128 i686 PGI    W  n        y      n        y     y     n
-SuSe Linux 2.6.16 x86_64 GNU (1)  W  y        y(3)   y        y     y     y
-SuSe Linux 2.6.16 x86_64 Intel    W  n        y      n        y     y     n
-SuSe Linux 2.6.16 x86_64 PGI      W  n        y      n        y     y     y
-SuSe Linux 2.6.16 SGI Altix ia64  C  y        y      y        y     y     y
-RedHat EL4 2.6.18 Xeon Lustre     C  y        y      y        y     y     n
-SuSe Linux 2.4.21 ia64 Intel      C  y        y      y        y     y     n
-Cray XT3 2.0.41                      y        y      y        y     y     n
-
-
-Platform                           Shared  Shared    Shared    Thread-  
-                                   C libs  F90 libs  C++ libs  safe     
-Solaris2.10 32-bit                   y       y         y         y        
-Solaris2.10 64-bit                   y       y         y         y        
-IRIX64_6.5 32-bit                    y       dna       y         y        
-IRIX64_6.5 64-bit                    y       y         n         y        
-Windows XP                           y       y(4)      y         y        
-Windows XP x64                       y       y(4)      y         y        
-Windows Vista                        y       n         n         y        
-Mac OS X 10.5                        y       n         y         n        
-AIX 5.3 32- and 64-bit               n       n         n         n        
-FreeBSD 6.3-STABLE 32&64 bit         y       n         y         y        
-RedHat EL4 2.6.9-42 i686 GNU (1)  W  y       y         y         y        
-RedHat EL5 2.6.18-128 i686 GNU (1)W  y       y(2)      y         y        
-RedHat EL5  2.6.18-128 i686 Intel W  y       y         y         n        
-RedHat EL5 2.6.18-128 i686 PGI    W  y       y         y         n        
-SuSe Linux 2.6.16 x86_64 GNU (1)  W  y       y         y         y        
-SuSe Linux 2.6.16 x86_64 Intel    W  y       y         y         n        
-SuSe Linux 2.6.16 x86_64 PGI      W  y       y         y         n        
-SuSe Linux 2.6.16 SGI Altix ia64  C  y                           n        
-RedHat EL4 2.6.18 Xeon Lustre     C  y       y         y         n
-SuSe Linux 2.4.21 ia64 Intel      C  y       y         y         n        
-Cray XT3 2.0.41                      n       n         n         n
-
-           (1) Fortran compiled with g95.
-           (2) With PGI and Absoft compilers.
-           (3) With PGI compiler for Fortran.
-           (4) Using Visual Studio 2005 or Cygwin
-    Compiler versions for each platform are listed in the preceding
-    "Platforms Tested" table.
-
-
-Known Problems
-==============
-* Parallel tests failed with 16 processes with data inconsistency at testphdf5
-  / dataset_readAll. Parallel tests also failed with 32 and 64 processes with
-  collective abort of all ranks at t_posix_compliant / allwrite_allread_blocks
-  with MPI IO. CMC - 2009/04/28
-
-* There is a known issue in which HDF5 will change the timestamp on a file 
-  simply by opening it with read/write permissions, even if the file is not
-  modified in any way. This is due to the way in which HDF5 manages the file 
-  superblock. A fix is currently underway and should be included in the 1.8.4
-  release of HDF5. MAM - 2009/04/28
-
-* For gcc v4.3 and v4.4, with production mode, if -O3 is used, H5Tinit.c
-  would fail to compile. Actually bad H5Tinit.c is produced.  If -O (same
-  as -O1) is used, H5Tinit.c compiled okay but test/dt_arith would fail.
-  When -O0 (no optimizatio) is used, H5Tinit.c compilete okay and all
-  tests passed. Therefore, -O0 is imposed for v4.3 and v4.4 of gcc.
-  AKC - 2009/04/20
-
-* For Red Storm, a Cray XT3 system, the tools/h5ls/testh5ls.sh and
-  tools/h5copy/testh5copy.sh will fail some of its sub-tests. These sub-tests
-  are expected to fail and should exit with a non-zero code but the yod
-  command does not propagate the exit code of the executables. Yod always
-  returns 0 if it can launch the executable.  The test suite shell expects
-  a non-zero for this particular test, therefore it concludes the test has
-  failed when it receives 0 from yod.  Skip all the "failing" test for now
-  by changing them as following.
-
-  ======== Original tools/h5ls/testh5ls.sh =========
-  TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ======== Change to ===============================
-  echo SKIP TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ==================================================
-
-  ======== Original tools/h5copy/testh5copy.sh =========
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  H5LSTEST $FILEOUT
-  ======== Change to ===============================
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  echo SKIP H5LSTEST $FILEOUT
-  ==================================================
-  AKC - 2008/11/10
-
-* For Red Storm, a Cray XT3 system, the yod command sometimes gives the
-  message,  "yod allocation delayed for node recovery".  This interferes with
-  test suites that do not expect seeing this message.  See the section of "Red
-  Storm" in file INSTALL_parallel for a way to deal with this problem.
-  AKC - 2008/05/28
-
-* We have discovered two problems when running collective IO parallel HDF5 
-  tests with chunking storage on the ChaMPIon MPI compiler on tungsten, a 
-  Linux cluster at NCSA.
-
-  Under some complex selection cases: 
-  1) MPI_Get_element returns the wrong value.
-  2) MPI_Type_struct also generates the wrong derived datatype and corrupt 
-     data may be generated.
-  These issues arise only when turning on collective IO with chunking storage 
-  with some complex selections. We have not found these problems on other 
-  MPI-IO compilers. If you encounter these problems, you may use independent 
-  IO instead.
-
-  To avoid this behavior, change the following line in your code
-      H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
-  to
-      H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_INDEPENDENT);
-  KY - 2007/08/24
-
-* On Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* For LLNL, uP: both serial and parallel tests pass.  
-  Zeus: Serial tests pass but parallel tests fail with a known problem in MPI.
-  ubgl: Serial tests pass but parallel tests fail. 
-
-* On mpich 1.2.5 and 1.2.6, if more than two processes contribute no IO and 
-  the application asks to do collective IO, we have found that when using 4 
-  processors, a simple collective write will sometimes be hung. This can be 
-  verified with t_mpi test under testpar.
-
-* On IRIX6.5, when the C compiler version is greater than 7.4, complicated
-  MPI derived datatype code will work. However, the user should increase
-  the value of the MPI_TYPE_MAX environment variable to some appropriate value 
-  to use collective irregular selection code.  For example, the current 
-  parallel HDF5 test needs to raise MPI_TYPE_MAX to 200,000 to pass the test. 
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  SLU - 2005/6/30
-
-* On IBM AIX systems, parallel HDF5 mode will fail some tests with error
-  messages like "INFO: 0031-XXX ...".  This is from the command `poe'.
-  Set the environment variable MP_INFOLEVEL to 0 to minimize the messages
-  and run the tests again.
-
-  The tests may fail with messages like "The socket name is already in use",  
-  but HDF5 does not use sockets.  This failure is due to problems with the 
-  poe command trying to set up the debug socket.  To resolve this problem, 
-  check to see whether there are many old /tmp/s.pedb.* files staying around.  
-  These are sockets used by the poe command and left behind due to failed 
-  commands.  First, ask your system administrator to clean them out.  
-  Lastly, request IBM to provide a means to run poe without the debug socket.
-
-* The --enable-static-exec configure flag fails to compile for Solaris
-  platforms. This is due to the fact that not all of the system libraries on 
-  Solaris are available in a static format.
-
-  The --enable-static-exec configure flag also fails to correctly compile
-  on IBM SP2 platforms for serial mode. The parallel mode works fine with 
-  this option.
-  
-  It is suggested that you do not use this option on these platforms
-  during configuration.
-
-* There is also a configure error on Altix machines that incorrectly reports 
-  when a version of Szip without an encoder is being used.
-
-* Information about building with PGI and Intel compilers is available in
-  the INSTALL file sections 4.7 and 4.8.
-
-
-%%%%1.8.2%%%%   
- 
-
-HDF5 version 1.8.2 released on Mon Nov 10 15:43:09 CST 2008
-================================================================================
-
-INTRODUCTION
-============
-
-This document describes the differences between HDF5-1.8.1 and HDF5 1.8.2, 
-and contains information on the platforms tested and known problems in 
-HDF5-1.8.2. For more details, see the files HISTORY-1_0-1_8_0_rc3.txt 
-and HISTORY-1_8.txt in the release_docs/ directory of the HDF5 source.
-
-Links to the HDF5 1.8.2 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
-
-     http://www.hdfgroup.org/products/hdf5/
-
-The HDF5 1.8.2 release can be obtained from:
-
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
-
-User documentation for 1.8.2 can be accessed directly at this location: 
-
-     http://www.hdfgroup.org/HDF5/doc/
-
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
-
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.2 (current 
-release) versus Release 1.8.1":
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-
-If you have any questions or comments, please send them to the HDF Help Desk:
-
-     help at hdfgroup.org
-
-
-CONTENTS
-========
-
-- New Features
-- Support for new platforms and languages
-- Bug Fixes since HDF5-1.8.1
-- Platforms Tested
-- Supported Configuration Features Summary
-- Known Problems
-
-
-New Features
-============
-
-        Configuration
-        -------------
-        - Upgraded libtool to version 2.2.6a. (MAM - 2008/10/15).
-
-        Library
-        -------
-	- Added two new public routines: H5Pget_elink_fapl() and
-      	  H5Pset_elink_fapl(). (see bug #1247) (VC - 2008/10/13)
-        - Improved free space tracking in file to be faster. (QAK - 2008/10/06)
-        - Added 'mounted' field to H5G_info_t struct. (QAK - 2008/07/15)
-
-        Parallel Library
-        ----------------
-        - None
-
-        Tools
-        -----
-        - h5repack: added new options -u and -b to add a userblock to an HDF5 
-          file during the repack.  (PVN - 2008/08/26)
-        - h5repack: added options -t and -a to call H5Pset_alignment while 
-          creating a repacked file. (PVN - 2008/08/29)
-        - h5ls: added capability to traverse through external links when the -r
-          (recursive) flag is given. (NAF - 2008/09/16)
-        - h5ls: added -E option to enable traversal of external links.  
-          h5ls will not traverse external links without this flag being set.
-            (NAF - 2008/10/06)
-        - h5dump: when -b flag is used without a keyword after it, binary 
-          output defaults to NATIVE. MEMORY keyword was deprecated 
-          and replaced by NATIVE keyword. (PVN - 2008/10/30)
-        - h5diff: returns 1 when file graphs differ by any object.  
-          Error return code was changed to 2 from -1.  (PVN - 2008/10/30)
-        - h5import: TEXTFPE (scientific format) was deprecated. Use TEXTFP 
-          instead (PVN - 2008/10/30)
-
-
-
-        F90 API
-        ------
-         - Added optional parameter 'mounted' to H5Gget_info_f, 
-           H5Gget_info_by_idx_f, H5Gget_info_by_name_f (MSB - 2008/09/24)
-	 - Added H5Tget_native_type_f (MSB - 2008/09/30)
-	 
-	 
-        C++ API
-        ------
-        - These member functions were added as wrapper for H5Rdereference to
-          replace the incorrect IdComponent::dereference().
-             void H5Object::dereference(H5Object& obj, void* ref, 
-                                        H5R_type_t ref_type=H5R_OBJECT)
-             void H5Object::dereference(H5File& h5file, void* ref, 
-                                        H5R_type_t ref_type=H5R_OBJECT)
-             void H5Object::dereference(Attribute& obj, void* ref, 
-                                        H5R_type_t ref_type=H5R_OBJECT)
-
-          In addition, these constructors were added to create the associated
-          objects by way of dereference:
-             DataSet(H5Object& obj, void* ref, H5R_type_t ref_type=H5R_OBJECT)
-             DataSet(H5File& file, void* ref, H5R_type_t ref_type=H5R_OBJECT)
-             DataSet(Attribute& attr, void* ref, H5R_type_t ref_type=H5R_OBJECT)
-             Group(H5Object& obj, void* ref, H5R_type_t ref_type=H5R_OBJECT)
-             Group(H5File& obj, void* ref, H5R_type_t ref_type=H5R_OBJECT)
-             Group(Attribute& attr, void* ref, H5R_type_t ref_type=H5R_OBJECT)
-             DataType(H5Object& obj, void* ref, H5R_type_t ref_type=H5R_OBJECT)
-             DataType(H5File& file, void* ref, H5R_type_t ref_type=H5R_OBJECT)
-             DataType(Attribute& attr, void* ref, H5R_type_t ref_type=H5R_OBJECT)
-          (BMR - 2008/10/29)
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-        - Intel 10.1 is supported on Mac OS X 10.5.4.
-          Note:
-          When Fortran is enabled, configure automatically
-          disables the build of shared libraries (i.e., only
-          static C and C++ HDF5 libraries will be built
-          along with the static HDF5 Fortran library).
-          Intel 10.1 C and C++ compilers require 
-          "-no-multibyte-chars" compilation flag due to the known
-          bug in the compilers.
-            (EIP - 2008/10/30)
-
-
-Bug Fixes since HDF5-1.8.1 
-==========================
-
-        Configuration
-        -------------
-        - Fixed error with 'make check install' failing due to h5dump
-          needing other tools built first. (MAM - 2008/10/15).
-        - When using shared szip, it is no longer necessary to specify
-          the path to the shared szip libraries in LD_LIBRARY_PATH.
-           (MAM - 2008/10/15).
-	- The file libhdf5_fortran.settings is not installed since its content
-	  is included in libhdf5.settings now. (AKC - 2008/10/21)
-        - "make DESTDIR=xxx install" failed to install some tools and files
-          (e.g., h5cc and fortran modules). Fixed. (AKC - 2008/10/8).
-
-        Library
-        -------
-        - H5Ovisit and H5Ovisit_by_name will now properly terminate when the
-            callback function returns a positive value on the starting object.
-            (NAF - 2008/11/03)
-        - Fixed an error where a null message could be created that was larger
-            than could be written to the file.  (NAF - 2008/10/23)
-        - Corrected error with family/split/multi VFD not updating driver info
-            when "latest" version of the file format used. (QAK - 2008/10/14)
-        - Corrected alignment+threshold errors to work correctly when metadata
-            aggregation is enabled. (QAK - 2008/10/06)
-        - Changed H5Fget_obj_count and H5Fget_obj_ids to ignore objects
-            registered by the library for internal library use.
-            (NAF - 2008/10/06)
-        - Fixed potential memory leak during compound conversion.
-            (NAF - 2008/10/06)
-        - Changed the return value of H5Fget_obj_count from INT to SSIZE_T. 
-            Also changed the return value of H5Fget_obj_ids from HERR_T to 
-            SSIZE_T and the type of the parameter MAX_OBJS from INT to SIZE_T. 
-            (SLU - 2008/09/26)
-        - Fixed an issue that could cause data to be improperly overwritten
-            during compound type conversion.  (NAF - 2008/09/19)
-        - Fixed pointer alignment violations that could occur during vlen
-            conversion.  (NAF - 2008/09/16)
-        - Fixed problem where library could cause a segmentation fault when
-            an invalid location ID was given to H5Giterate(). (QAK - 2008/08/19)
-        - Fixed improper shutdown when objects have reference count > 1.  The
-            library now tracks reference count due to the application separately
-            from that due to internal library routines.  (NAF - 2008/08/19)
-        - Fixed assertion failure caused by incorrect array datatype version.
-            (NAF - 2008/08/08)
-        - Fixed an issue where mount point traversal would fail when using
-            multiple handles for the child.  (NAF - 2008/08/07)
-        - Fixed an issue where mount points were inaccessible when using 
-            multiple file handles for the parent. The mount table is now in 
-            the shared file structure (the parent pointer is still in the 
-            top structure).  (NAF - 2008/08/07)
-        - Fixed assertion failure caused by incorrect array datatype version.
-            (NAF - 2008/08/04)
-        - Fixed issue where a group could have a file mounted on it twice.
-            (QAK - 2008/07/15)
-        - When an attribute was opened twice and data was written with 
-            one of the handles, the file didn't have the data. It happened 
-            because each handle had its own object structure, and the empty 
-            one overwrote the data with fill value.  This is fixed by making 
-            some attribute information like the data be shared in the 
-            attribute structure.  (SLU - 2008/07/07)
-        - Fixed a Windows-specific issue in the ohdr test which was causing 
-            users in some timezones to get false errors. This a deficiency in 
-            the Windows mktime() function, and has been handled properly.  
-            (SJW  - 2008/06/19)
-
-        Parallel Library
-        ----------------
-        - None
-
-        Tools
-        -----
-        - h5dump now checks for uniqueness of committed datatypes.
-            (NAF - 2008/10/15)
-        - Fixed unnecessary indentation of committed datatypes in h5dump.
-            (NAF - 2008/10/15)
-	- Fixed bugs in h5stat: segmemtation fault when printing groups and
-          print warning message when traversal of objects is unsuccessful.
-          (see bug #1253) (VC- 2008/10/13)
-        - Fixed bug in h5ls that prevented relative group listings (like
-            "h5ls foo.h5/bar") from working correctly (QAK - 2008/06/03)
-        - h5dump: when doing binary output (-b), the stdout printing of 
-             attributes was done incorrectly. Removed printing of attributes 
-             when doing binary output. (PVN - 2008/06/05)
-
-
-        F90 API
-        ------
-        - h5sselect_elements_f: Added additional operators H5S_SELECT_APPEND 
-            and H5S_SELECT_PREPEND (MSB - 2008/09/30)
-	- h5sget_select_elem_pointlist: Fixed list of returned points by 
-            rearranging the point list correctly by accounting for C 
-            conventions. (MSB - 2008/09/30)
-        - h5sget_select_hyper_blocklist_f: Fixed error in transposed dimension 
-            of arrays.(MSB - 2008/9/30)
-        - h5sget_select_bounds_f: Swapped array bounds to account for C and 
-            Fortran reversed array notation (MSB - 2008/9/30)
-	- Changed to initializing string to a blank character instead of a 
-            null type in tH5P.f90 to fix compiling error using AIX 5.3.0 
-            (MSB - 2008/7/29)
-        - Fixed missing commas in H5test_kind.f90 detected by NAG compiler 
-            (MSB - 2008/7/29)
-        - Fixed passing and array to a scalar in tH5A_1_8.f90 detected by 
-            NAG compiler (MSB - 2008/7/29)
-	- Added the ability of the test programs to use the status of 
-            HDF5_NOCLEANUP to determine if the *.h5 files should be removed 
-            or not after the tests are completed (MSB - 2008/10/1)
-	- In nh5tget_offset_c: (MSB 9/12/2008)
-           If offset was equal to 0 it returned the error code of -1, 
-           this was changed to return an error code of -1 when the offset 
-           value is < 0.
-        - Uses intrinsic Fortran function SIZEOF if available when detecting 
-           type of INTEGERs and REALs in H5test_kind.f90 (MSB - 2008/9/3)
-        - Put the DOUBLE PRECISION interfaces in a separate module and 
-           added a USE statement for the module. The interfaces are 
-           included/excluded depending on the state of FORTRAN_DEFAULT_REAL
-           is DBLE_F which detects if the default REAL is DOUBLE PRECISION.
-           This allows the library to be compiled with -r8 Fortran flag 
-           without the user needing to edit the source code. 
-           (MSB - 200/8/27)
-        - Enable building shared library for fortran by adding the flag -fPIC 
-          to the compile flags for versions of Intel Fortran compiler >=9
-           (MSB  - 2008/8/26)
-
-        C++ API
-        ------
-        - Fixed a design bug which allowed an Attribute object to create/modify
-          attributes (bugzilla #1068).  The API class hierarchy was revised
-          to address the problem.  Classes AbstractDS and Attribute are moved
-          out of H5Object.  Class Attribute now multiply inherits from
-          IdComponent and AbstractDs and class DataSet from H5Object and
-          AbstractDs.  In addition, the data member IdComponent::id was
-          moved into subclasses: Attribute, DataSet, DataSpace, DataType,
-          H5File, Group, and PropList. (BMR - 2008/05/20)
-        - IdComponent::dereference was incorrect and replaced as described
-          in "New Features" section.
-          (BMR - 2008/10/29)
-
-
-Platforms Tested
-================
-The following platforms and compilers have been tested for this release.
-
-    AIX 5.3			  xlc 7.0.0.8
-				  xlf 09.01.0000.0008
-				  xlC 7.0.0.8
-				  mpcc_r 7.0.0.8
-				  mpxlf_r 09.01.0000.0008
-
-    Cray XT3 (2.0.41)             cc (pgcc) 7.1-4
-    (red storm)                   ftn (pgf90) 7.1-4
-				  CC (pgCC) 7.1-4
-
-    FreeBSD 6.3-STABLE i386       gcc 3.4.6 [FreeBSD] 20060305
-    (duty)                        g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.2.5 20080702
-                                  g++ 4.2.5 20080702
-                                  gfortran 4.2.5 20080702
-
-    FreeBSD 6.3-STABLE amd64      gcc 3.4.6 [FreeBSD] 20060305
-    (liberty)                     g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.2.5 20080702
-                                  g++ 4.2.5 20080702
-                                  gfortran 4.2.5 20080702
-
-    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.4.4m
-                                  F90 MIPSpro 7.4.4m 
-                                  C++ MIPSpro cc 7.4.4m
-
-    Linux 2.6.9-42.0.10.ELsmp #1  gcc (GCC) 3.4.6
-    SMP i686 i386                 G95 (GCC 4.0.3 (g95 0.92!) April 18 2007)
-    (kagiso)                      PGI C, Fortran, C++ 7.2-1 32-bit
-                                  Intel(R) C Compiler for 32-bit
-                                      applications, Version 10.1
-                                  Intel(R) C++ Compiler for 32-bit
-                                      applications, Version 10.1
-                                  Intel(R) Fortran Compiler for 32-bit
-                                      applications, Version 10.1
-                                  Absoft 32-bit Fortran 95 10.0.4
-                                  MPICH mpich-1.2.7 compiled with
-                                  gcc 3.4.6 and G95  (GCC 4.0.3 (g95 0.92!)
-                                  MPICH mpich2-1.0.6p1 compiled with
-                                  gcc 3.4.6 and G95 (GCC 4.0.3 (g95 0.92!)
-
-    Linux 2.6.16.46-0.14-smp #1   Intel(R) C++ for Intel(R) EM64T 
-    SMP x86_64 GNU/Linux          Ver.  10.1.013
-    (smirom)                      Intel(R) Fortran Intel(R) EM64T 
-                                  Ver.  10.1.013
-                                  PGI C, Fortran, C++ Version 7.2-1
-                                         for 64-bit target on x86-64
-                                  MPICH mpich-1.2.7 compiled with
-                                  gcc 4.1.2 and G95  (GCC 4.0.3 (g95 0.92!)
-                                  MPICH mpich2-1.0.7 compiled with
-                                  gcc 4.1.2 and G95 (GCC 4.0.3 (g95 0.92!)
-                                  tested for both 32- and 64-bit binaries
-
-    Linux 2.6.16.54-0.2.5 #1      Intel(R) C++ Version 10.1.017
-    Altix SMP ia64                Intel(R) Fortran Itanium(R) Version 10.1.017
-    (cobalt)                      SGI MPI 1.16
-
-    SunOS 5.10 32- and 64-bit     Sun WorkShop 6 update 2 C 5.8
-    (linew)                       Sun WorkShop 6 update 2 Fortran 95 8.2
-                                  Sun WorkShop 6 update 2 C++ 5.8
-                                  Patch 121019-06
-
-    Xeon Linux 2.6.9-42.0.10.EL_lustre-1.4.10.1smp
-    (abe)                         Intel(R) C++ Version 10.0.026
-                                  Intel(R) Fortran Compiler Version 10.0.026
-                                  Open MPI 1.2.2
-                                  MVAPICH2-0.9.8p28p2patched-intel-ofed-1.2
-                                  compiled with icc v10.0.026 and 
-                                  ifort 10.0.026
-
-    IA-64 Linux 2.4.21-309.tg1 #1 SMP
-        ia64                      gcc (GCC) 3.2.2
-    (NCSA tg-login)               Intel(R) C++ Version 8.1.037
-                                  Intel(R) Fortran Compiler Version 8.1.033
-                                  mpich-gm-1.2.7p1..16-intel-8.1.037-r1
-
-    Intel 64 Linux 2.6.9-42.0.10.EL_lustre-1.4.10.1smp
-    (abe)                         gcc 3.4.6 20060404
-                                  Intel(R) C++ Version 10.0
-                                  Intel (R) Fortran Compiler Version 10.0
-                                  mvapich2-0.9.8p2patched-intel-ofed-1.2
-
-    Windows XP                    Visual Studio .NET
-                                  Visual Studio 2005 w/ Intel Fortran 9.1
-                                  Cygwin(native gcc compiler and g95)
-
-    Windows XP x64                Visual Studio 2005 w/ Intel Fortran 9.1
-
-    Windows Vista                 Visual Studio 2005
-
-    MAC OS  10.5.4 (Intel)        i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1
-                                  GNU Fortran (GCC) 4.3.0 20070810
-                                  G95 (GCC 4.0.3 (g95 0.91!) Apr 24 2008)
-                                  Intel C, C++ and Fortran compilers 10.1
-                                  
-
-Supported Configuration Features Summary
-========================================
-
-    In the tables below
-          y   = tested and supported
-          n   = not supported or not tested in this release
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                 C        F90    F90      C++   zlib  SZIP
-                         parallel        parallel
-Solaris2.10 32-bit       n        y      n        y     y     y
-Solaris2.10 64-bit       n        y      n        y     y     y
-IRIX64_6.5 32-bit        n        n      n        n     y     y
-IRIX64_6.5 64-bit        n        y      y        y     y     y
-Windows XP               n        y(15)  n(15)    y     y     y
-Windows XP x64           n        y(15)  n(15)    y     y     y
-Windows Vista            n        n      n        y     y     y
-Mac OS X 10.5 Intel      n        y      n        y     y     y
-AIX 5.3 32- and 64-bit   n        y      n        y     y     n
-FreeBSD 6.3-STABLE 
-32&64 bit                n        y      n        y     y     y
-RedHat EL4       (3)  W  y(1)     y(10)  y(1)     y     y     y
-RedHat EL4 Intel (3)  W  n        y      n        y     y     n
-RedHat EL4 PGI   (3)  W  n        y      n        y     y     n
-SuSe x86_64 gcc(3,12) W  y(2)     y(11)  y(2)     y     y     y
-SuSe x86_64 Int(3,12) W  n        y(13)  n        y     y     n
-SuSe x86_64 PGI(3,12) W  n        y(8)   n        y     y     y
-Linux 2.6 SuSE ia64   C 
-    Intel       (3,7)    y        y      y        y     y     n
-Linux 2.6 SGI Altix 
-    ia64 Intel    (3)    y        y      y        y     y     y
-Linux 2.6 RHEL        C
-    Lustre Intel  (5)    y(4)     y      y(4)     y     y     n
-Cray XT3 2.0.41          y        y      y        y     y     n
-
-
-Platform                 Shared  Shared    Shared    Thread-  
-                         C libs  F90 libs  C++ libs  safe     
-Solaris2.10 32-bit       y       y         y         y        
-Solaris2.10 64-bit       y       y         y         y        
-IRIX64_6.5 32-bit        y       dna       y         y        
-IRIX64_6.5 64-bit        y       y         n         y        
-Windows XP               y       y(15)     y         y        
-Windows XP x64           y       y(15)     y         y        
-Windows Vista            y       n         n         y        
-Mac OS X 10.5            y       n         y         n        
-AIX 5.3 32- and 64-bit   n       n         n         n        
-FreeBSD 6.2 32&64 bit    y       n         y         y        
-RedHat EL4       (3)  W  y       y(10)     y         y        
-RedHat EL4 Intel (3)  W  y       y         y         n        
-RedHat EL4 PGI   (3)  W  y       y         y         n        
-SuSe x86_64 GNU(3,12) W  y       y         y         y        
-SuSe x86_64 Int(3,12) W  y       y         y         n        
-SuSe x86_64 PGI(3,12) W  y       y         y         n        
-Linux 2.4 SuSE        C
-    ia64 C Intel (7)     y       y         y         n        
-Linux 2.4 SGI Altix   C
-    ia64 Intel           y                           n        
-Linux 2.6 RHEL        C
-    Lustre Intel (5)     y       y         y         n
-Cray XT3 2.0.41          n       n         n         n
-
-    Notes: (1)  Using mpich2 1.0.6.
-           (2)  Using mpich2 1.0.7.
-           (3)  Linux 2.6 with GNU, Intel, and PGI compilers, as indicated.  
-                  W or C indicates workstation or cluster, respectively.
-           (4)  Using mvapich2 0.9.8.
-           (5)  Linux 2.6.9-42.0.10.  Xeon cluster with ELsmp_perfctr_lustre 
-                  and Intel compilers
-           (6)  Linux 2.4.21-32.0.1.  Xeon cluster with ELsmp_perfctr_lustre 
-                  and Intel compilers
-           (7)  Linux 2.4.21, SuSE_292.till.  Ia64 cluster with Intel compilers
-           (8)  pgf90
-           (9)  With Compaq Visual Fortran 6.6c compiler.
-           (10) With PGI and Absoft compilers.
-           (11) PGI and Intel compilers for both C and Fortran
-           (12) AMD Opteron x86_64
-           (13) ifort
-           (14) Yes with C and Fortran, but not with C++
-           (15) Using Visual Studio 2005 or Cygwin
-           (16) Not tested for this release.
-    Compiler versions for each platform are listed in the preceding
-    "Platforms Tested" table.
-
-
-Known Problems
-==============
-* For Red Storm, a Cray XT3 system, the tools/h5ls/testh5ls.sh and
-  tools/h5copy/testh5copy.sh will fail some of its sub-tests. These sub-tests
-  are expected to fail and should exit with a non-zero code but the yod
-  command does not propagate the exit code of the executables. Yod always
-  returns 0 if it can launch the executable.  The test suite shell expects
-  a non-zero for this particular test, therefore it concludes the test has
-  failed when it receives 0 from yod.  Skip all the "failing" test for now
-  by changing them as following.
-
-  ======== Original tools/h5ls/testh5ls.sh =========
-  TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ======== Change to ===============================
-  echo SKIP TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ==================================================
-
-  ======== Original tools/h5copy/testh5copy.sh =========
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  H5LSTEST $FILEOUT
-  ======== Change to ===============================
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d grp_rename
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -v -s grp_dsets  -d /grp_rename/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_dsets -d /E/F/grp_dsets
-  echo SKIP TOOLTEST_FAIL -i $TESTFILE -o $FILEOUT -vp -s /grp_nested -d /G/H/grp_nested
-  echo SKIP H5LSTEST $FILEOUT
-  ==================================================
-  AKC - 2008/11/10
-
-* For Red Storm, a Cray XT3 system, the yod command sometimes gives the
-  message,  "yod allocation delayed for node recovery".  This interferes with
-  test suites that do not expect seeing this message.  See the section of "Red
-  Storm" in file INSTALL_parallel for a way to deal with this problem.
-  AKC - 2008/05/28
-
-* We have discovered two problems when running collective IO parallel HDF5 
-  tests with chunking storage on the ChaMPIon MPI compiler on tungsten, a 
-  Linux cluster at NCSA.
-
-  Under some complex selection cases: 
-  1) MPI_Get_element returns the wrong value.
-  2) MPI_Type_struct also generates the wrong derived datatype and corrupt 
-     data may be generated.
-  These issues arise only when turning on collective IO with chunking storage 
-  with some complex selections. We have not found these problems on other 
-  MPI-IO compilers. If you encounter these problems, you may use independent 
-  IO instead.
-
-  To avoid this behavior, change the following line in your code
-      H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
-  to
-      H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_INDEPENDENT);
-
-  KY - 2007/08/24
-
-* On Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* For LLNL, uP: both serial and parallel tests pass.  
-  Zeus: Serial tests pass but parallel tests fail with a known problem in MPI.
-  ubgl: Serial tests pass but parallel tests fail. 
-
-* On mpich 1.2.5 and 1.2.6, if more than two processes contribute no IO and 
-  the application asks to do collective IO, we have found that when using 4 
-  processors, a simple collective write will sometimes be hung. This can be 
-  verified with t_mpi test under testpar.
-
-* On IRIX6.5, when the C compiler version is greater than 7.4, complicated
-  MPI derived datatype code will work. However, the user should increase
-  the value of the MPI_TYPE_MAX environment variable to some appropriate value 
-  to use collective irregular selection code.  For example, the current 
-  parallel HDF5 test needs to raise MPI_TYPE_MAX to 200,000 to pass the test. 
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  SLU - 2005/6/30
-
-* On IBM AIX systems, parallel HDF5 mode will fail some tests with error
-  messages like "INFO: 0031-XXX ...".  This is from the command `poe'.
-  Set the environment variable MP_INFOLEVEL to 0 to minimize the messages
-  and run the tests again.
-
-  The tests may fail with messages like "The socket name is already in use",  
-  but HDF5 does not use sockets.  This failure is due to problems with the 
-  poe command trying to set up the debug socket.  To resolve this problem, 
-  check to see whether there are many old /tmp/s.pedb.* files staying around.  
-  These are sockets used by the poe command and left behind due to failed 
-  commands.  First, ask your system administrator to clean them out.  
-  Lastly, request IBM to provide a means to run poe without the debug socket.
-
-* The --enable-static-exec configure flag fails to compile for Solaris
-  platforms. This is due to the fact that not all of the system libraries on 
-  Solaris are available in a static format.
-
-  The --enable-static-exec configure flag also fails to correctly compile
-  on IBM SP2 platforms for serial mode. The parallel mode works fine with 
-  this option.
-  
-  It is suggested that you do not use this option on these platforms
-  during configuration.
-
-* There is also a configure error on Altix machines that incorrectly reports 
-  when a version of Szip without an encoder is being used.
-
-* Information about building with PGI and Intel compilers is available in
-  the INSTALL file sections 4.7 and 4.8.
-
-
-
-
-%%%%1.8.1%%%%   
-
-
-HDF5 version 1.8.1 released on Thu May 29 15:28:55 CDT 2008
-================================================================================
-
-INTRODUCTION
-============
-
-This document describes the differences between the HDF5-1.8.1 release 
-and HDF5 1.8.0, and contains information on the platforms tested and known 
-problems in HDF5-1.8.1.  For more details, see the files
-HISTORY-1_0-1_8_0_rc3.txt and HISTORY-1_8.txt in the release_docs/ directory 
-of the HDF5 source.
-
-Links to the HDF5 1.8.1 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
-
-     http://www.hdfgroup.org/products/hdf5/
-
-The HDF5 1.8.1 release can be obtained from:
-
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
-
-User documentation for 1.8.1 can be accessed directly at this location: 
-
-     http://www.hdfgroup.org/HDF5/doc/
-
-New features in the HDF5-1.8.x release series, including brief general 
-descriptions of some new and modified APIs, are described in the "What's New 
-in 1.8.0?" document:
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
-
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.1 (current 
-release) versus Release 1.8.0":
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-
-If you have any questions or comments, please send them to the HDF Help Desk:
-
-     help at hdfgroup.org
-
-
-CONTENTS
-========
-
-- New Features
-- Support for new platforms and languages
-- Bug Fixes since HDF5-1.8.0
-- Platforms Tested
-- Supported Configuration Features Summary
-- Known Problems
-
-
-New Features
-============
-
-        Configuration
-        -------------
-        - The lib/libhdf5.settings file contains much more configure
-          information. (AKC - 2008/05/18)
-
-        - The new configure option "--disable-sharedlib-rpath" disables 
-          embedding the '-Wl,-rpath' information into executables when 
-          shared libraries are produced, and instead solely relies on the 
-          information in LD_LIBRARY_PATH. (MAM - 2008/05/15)
-
-        - Configuration suite now uses Autoconf 2.61, Automake 1.10.1, and 
-          Libtool 2.2.2 (MAM - 2008/05/01)
-
-        Source code distribution
-        ========================
-
-        Library
-        -------
-        - None
-
-        Parallel Library
-        ----------------
-        - None
-
-        Tools
-        -----
-        - h5repack: Reinstated the -i and -o command line flags to specify 
-          input and output files.  h5repack now understands both the old
-          syntax (with -i and -o) and the new syntax introduced in Release
-          1.8.0.  (PVN - 2008/05/23)
-        - h5dump: Added support for external links, displaying the object that 
-          an external link points to. (PVN - 2008/05/12)
-        - h5dump: Added an option, -m, to allow user-defined formatting in the 
-          output of floating point numbers. (PVN - 2008/05/06)
-        - h5dump, in output of the -p option: Added effective data compression 
-          ratio to the dataset storage layout output when a compression filter 
-          has been applied to a dataset.  (PVN - 2008/05/01)
-
-        F90 API
-        ------
-        New H5A, H5G, H5L, H5O, and H5P APIs to enable 1.8 features were
-        added. See "Release 1.8.1 (current release) versus Release 1.8.0" in 
-        the document "HDF5 Software Changes from Release to Release"
-        (http://hdfgroup.org/HDF5/doc/ADGuide/Changes.html) for the 
-        complete list of the new APIs.
-
-        C++ API
-        ------
-        - None
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-        - Both serial and parallel HDF5 are supported for the Red Storm machine 
-          which is a Cray XT3 system.
-
-        - The Fortran library will work correctly if compiled with the -i8 
-          flag.  This has been tested with the g95, PGI and Intel Fortran 
-          compilers.
-
-
-Bug Fixes since HDF5-1.8.0 
-==========================
-
-        Configuration
-        -------------
-        - None
-
-        Source code distribution
-        ========================
-
-        Library
-        -------
-        - Chunking:  Chunks greater than 4GB are disallowed. 
-          (QAK - 2008/05/16)
-        - Fixed the problem with searching for a target file when following 
-          an external link.  The search pattern will depend on whether the 
-          target file's pathname is an absolute or a relative path. 
-          Please see the H5Lcreate_external description in the "HDF5 
-          Reference Manual" (http://hdfgroup.org/HDF5/doc/RM/RM_H5L.html).
-          (VC - 2008/04/08)
-        - Fixed possible file corruption bug when encoding datatype
-          descriptions for compound datatypes whose size was between
-          256 and 511 bytes and the file was opened with the "use the
-          latest format" property enabled (with H5Pset_libver_bounds).
-          (QAK - 2008/03/13)
-        - Fixed bug in H5Aget_num_attrs() routine to correctly handle an 
-          invalid location identifier.  (QAK - 2008/03/11)
-
-        Parallel Library
-        ----------------
-        - None
-
-        Tools
-        -----
-        - Fixed bug in h5diff that prevented datasets and attributes with
-          variable-length string elements from comparing correctly.
-          (QAK - 2008/02/28)
-        - Fixed bug in h5dump that caused binary output to be made only for 
-          the first dataset, when several datasets were requested.
-          (PVN - 2008/04/07)
-
-        F90 API
-        ------
-        - The h5tset(get)_fields subroutines were missing the parameter to 
-          specify a sign position; fixed.  (EIP - 2008/05/23)
-        - Many APIs were fixed to work with the 8-byte integers in Fortran vs.
-          4-byte integers in C. This change is trasparent to user applications.
-
-        C++ API
-        ------
-        - The class hierarchy was revised to address the problem reported
-          in bugzilla #1068, Attribute should not be derived from base
-          class H5Object.  Classes AbstractDS was moved out of H5Object.
-          Class Attribute now multiply inherits from IdComponent and
-          AbstractDs and class DataSet from H5Object and AbstractDs.
-          In addition, data member IdComponent::id was moved into subclasses:
-          Attribute, DataSet, DataSpace, DataType, H5File, Group, and PropList.
-          (BMR - 2008/05/20)
-	- IdComponent::dereference was incorrect; it was changed from:
-		void IdComponent::dereference(IdComponent& obj, void* ref)
-	  to:
-		void H5Object::dereference(H5File& h5file, void* ref)
-		void H5Object::dereference(H5Object& obj, void* ref)
-	  (BMR - 2008/05/20)
-        - Revised Attribute::write and Attribute::read wrappers to handle
-          memory allocation/deallocation properly. (bugzilla 1045)
-          (BMR - 2008/05/20)
-
-
-Platforms Tested
-================
-The following platforms and compilers have been tested for this release.
-
-    Cray XT3 (2.0.41)             cc (pgcc) 7.1-4
-    (red storm)                   ftn (pgf90) 7.1-4
-				  CC (pgCC) 7.1-4
-                                  mpicc 1.0.2
-                                  mpif90 1.0.2
-
-    FreeBSD 6.2-STABLE i386       gcc 3.4.6 [FreeBSD] 20060305
-    (duty)                        g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.2.1 20080123
-                                  g++ 4.2.1 20080123
-                                  gfortran 4.2.1 20070620
-
-    FreeBSD 6.2-STABLE amd64      gcc 3.4.6 [FreeBSD] 20060305
-    (liberty)                     g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.2.1 20080123
-                                  g++ 4.2.1 20080123
-                                  gfortran 4.2.1 20080123
-
-    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.4.4m
-                                  F90 MIPSpro 7.4.4m 
-                                  C++ MIPSpro cc 7.4.4m
-
-    Linux 2.6.9 (RHEL4)           Intel 10.0 compilers
-    (abe.ncsa.uiuc.edu)
-
-    Linux 2.4.21-47               gcc 3.2.3 20030502
-    (osage)
-
-    Linux 2.6.9-42.0.10           gcc,g++ 3.4.6 20060404, G95 (GCC 4.0.3) 
-    (kagiso)                      PGI 7.1-6 (pgcc, pgf90, pgCC)
-                                  Intel 9.1 (icc, ifort, icpc)
-
-    Linux 2.6.16.27 x86_64 AMD    gcc 4.1.0 (SuSE Linux), g++ 4.1.0, 
-    (smirom)                          g95 (GCC 4.0.3)
-                                  PGI 7.1-6 (pgcc, pgf90, pgCC)
-                                  Intel 9.1 (icc, ifort, icpc)
-
-    Linux 2.6.5-7.252.1-rtgfx #1  Intel(R) C++ Version 9.0
-          SMP ia64                Intel(R) Fortran Itanium(R) Version 9.0 
-    (cobalt)                      SGI MPI
-
-    SunOS 5.8 32,46               Sun WorkShop 6 update 2 C 5.3
-     (Solaris 2.8)                Sun WorkShop 6 update 2 Fortran 95 6.2
-                                  Sun WorkShop 6 update 2 C++ 5.3
-
-    SunOS 5.10                    cc: Sun C 5.8 
-    (linew)                       f90: Sun Fortran 95 8.2 
-                                  CC: Sun C++ 5.8 
-
-    Xeon Linux 2.4.21-32.0.1.ELsmp-perfctr-lustre
-    (tungsten)                    gcc 3.2.2 20030222
-                                  Intel(R) C++ Version 9.0
-                                  Intel(R) Fortran Compiler Version 9.0
-
-    IA-64 Linux 2.4.21.SuSE_309.tg1 ia64
-    (NCSA tg-login)               gcc 3.2.2
-                                  Intel(R) C++ Version 8.1
-                                  Intel(R) Fortran Compiler Version 8.1
-                                  mpich-gm-1.2.6..14b-intel-r2
-
-    Intel 64 Linux 2.6.9-42.0.10.EL_lustre-1.4.10.1smp
-    (abe)                         gcc 3.4.6 20060404
-                                  Intel(R) C++ Version 10.0
-                                  Intel (R) Fortran Compiler Version 10.0
-                                  mvapich2-0.9.8p2patched-intel-ofed-1.2
-
-    Windows XP                    Visual Studio .NET
-                                  Visual Studio 2005 w/ Intel Fortran 9.1
-                                  Cygwin(native gcc compiler and g95)
-                                  MinGW(native gcc compiler and g95)
-
-    Windows XP x64                Visual Studio 2005 w/ Intel Fortran 9.1
-
-    Windows Vista                 Visual Studio 2005
-
-    MAC OS  10.5.2 (Intel)        i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1
-                                  GNU Fortran (GCC) 4.3.0 20070810
-                                  G95 (GCC 4.0.3 (g95 0.91!) Apr 24 2008)
-
-
-Supported Configuration Features Summary
-========================================
-
-    In the tables below
-          y   = tested and supported
-          n   = not supported or not tested in this release
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                 C        F90    F90      C++   zlib  SZIP
-                         parallel        parallel
-SunOS5.10 64-bit         n        y      n        y     y     y
-SunOS5.10 32-bit         n        y      n        y     y     y
-IRIX64_6.5 64-bit        n        y      y        y     y     y
-IRIX64_6.5 32-bit        n        n      n        n     y     y
-Windows XP               n        y(15)  n(15)    y     y     y
-Windows XP x64           n        y(15)  n(15)    y     y     y
-Windows Vista            n        n      n        y     y     y
-Mac OS X 10.5 Intel      n        y      n        y     y     y
-FreeBSD 4.11             n        n      n        y     y     y
-RedHat EL3  W       (3)  y(1)     y(10)  y(1)     y     y     y
-RedHat EL3  W Intel (3)  n        y      n        y     y     n
-RedHat EL3  W PGI   (3)  n        y      n        y     y     n
-SuSe x86_64 gcc  (3,12)  y(2)     y(11)  y(2)     y     y     y
-SuSe x86_64 Int  (3,12)  n        y(13)  n        y     y     n
-SuSe x86_64 PGI  (3,12)  n        y(8)   n        y     y     y
-Linux 2.4 Xeon C 
-    Lustre Intel  (3,6)  n        y      n        y     y     n
-Linux 2.6 SuSE ia64 C 
-    Intel         (3,7)  y        y      y        y     y     n
-Linux 2.6 SGI Altix 
-    ia64 Intel      (3)  y        y      y        y     y     y
-Linux 2.6 RHEL C
-    Lustre Intel    (5)  y(4)     y      y(4)     y     y     n
-Cray XT3 2.0.41          y        y      y        y     y     n
-
-
-Platform                 Shared  Shared    Shared    Thread-  
-                         C libs  F90 libs  C++ libs  safe     
-Solaris2.10 64-bit       y       y         y         y        
-Solaris2.10 32-bit       y       y         y         y        
-IRIX64_6.5 64-bit        y       y         n         y        
-IRIX64_6.5 32-bit        y       dna       y         y        
-Windows XP               y       y(15)     y         y        
-Windows XP x64           y       y(15)     y         y        
-Windows Vista            y       n         n         y        
-Mac OS X 10.3            y                           n        
-FreeBSD 4.11             y       n         y         y        
-RedHat EL3  W       (3)  y       y(10)     y         y        
-RedHat EL3  W Intel (3)  y       y         y         n        
-RedHat EL3  W PGI   (3)  y       y         y         n        
-SuSe x86_64 W GNU (3,12) y       y         y         y        
-SuSe x86_64 W Int (3,12) y       y         y         n        
-SuSe x86_64 W PGI (3,12) y       y         y         n        
-Linux 2.4 Xeon C 
-    Lustre Intel    (6)  y       y         y         n        
-Linux 2.4 SuSE 
-    ia64 C Intel    (7)  y       y         y         n        
-Linux 2.4 SGI Altix 
-    ia64 Intel           y                           n        
-Linux 2.6 RHEL C
-    Lustre Intel    (5)  y        y        y         n
-Cray XT3 2.0.41          n       n         n         n        n
-
-    Notes: (1)  Using mpich2 1.0.6.
-           (2)  Using mpich2 1.0.7.
-           (3)  Linux 2.6 with GNU, Intel, and PGI compilers, as indicated.  
-                  W or C indicates workstation or cluster, respectively.
-           (4)  Using mvapich2 0.9.8.
-           (5)  Linux 2.6.9-42.0.10.  Xeon cluster with ELsmp_perfctr_lustre 
-                  and Intel compilers
-           (6)  Linux 2.4.21-32.0.1.  Xeon cluster with ELsmp_perfctr_lustre 
-                  and Intel compilers
-           (7)  Linux 2.4.21, SuSE_292.till.  Ia64 cluster with Intel compilers
-           (8)  pgf90
-           (9)  With Compaq Visual Fortran 6.6c compiler.
-           (10) With PGI and Absoft compilers.
-           (11) PGI and Intel compilers for both C and Fortran
-           (12) AMD Opteron x86_64
-           (13) ifort
-           (14) Yes with C and Fortran, but not with C++
-           (15) Using Visual Studio 2005 or Cygwin
-           (16) Not tested for this release.
-    Compiler versions for each platform are listed in the preceding
-    "Platforms Tested" table.
-
-
-Known Problems
-==============
-* For Red Storm, a Cray XT3 system, the yod command sometimes gives the
-  message,  "yod allocation delayed for node recovery".  This interferes with
-  test suites that do not expect seeing this message.  See the section of "Red
-  Storm" in file INSTALL_parallel for a way to deal with this problem.
-  AKC - 2008/05/28
-
-* For Red Storm, a Cray XT3 system, the tools/h5ls/testh5ls.sh will fail on
-  the test "Testing h5ls -w80 -r -g tgroup.h5" fails.  This test is
-  expected to fail and exit with a non-zero code but the yod command does
-  not propagate the exit code of the executables. Yod always returns 0 if it
-  can launch the executable.  The test suite shell expects a non-zero for
-  this particular test, therefore it concludes the test has failed when it
-  receives 0 from yod.  To bypass this problem for now, change the following
-  lines in the tools/h5ls/testh5ls.sh.
-  ======== Original =========
-  # The following combination of arguments is expected to return an error message
-  # and return value 1
-  TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ======== Skip the test =========
-  echo SKIP TOOLTEST tgroup-1.ls 1 -w80 -r -g tgroup.h5
-  ======== end of bypass ========
-  AKC - 2008/05/28
-
-* We have discovered two problems when running collective IO parallel HDF5 
-  tests with chunking storage on the ChaMPIon MPI compiler on tungsten, a 
-  Linux cluster at NCSA.
-
-  Under some complex selection cases: 
-  1) MPI_Get_element returns the wrong value.
-  2) MPI_Type_struct also generates the wrong derived datatype and corrupt 
-     data may be generated.
-  These issues arise only when turning on collective IO with chunking storage 
-  with some complex selections. We have not found these problems on other 
-  MPI-IO compilers. If you encounter these problems, you may use independent 
-  IO instead.
-
-  To avoid this behavior, change the following line in your code
-      H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
-  to
-      H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_INDEPENDENT);
-
-  KY - 2007/08/24
-
-* For SNL, spirit/liberty/thunderbird: The serial tests pass but parallel
-  tests failed with MPI-IO file locking message. AKC - 2007/6/25
-
-* On Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* For LLNL, uP: both serial and parallel tests pass.  
-  Zeus: Serial tests pass but parallel tests fail with a known problem in MPI.
-  ubgl: Serial tests pass but parallel tests fail. 
-
-* Configuring with --enable-debug=all produces compiler errors on most
-  platforms:  Users who want to run HDF5 in debug mode should use
-  --enable-debug rather than --enable-debug=all to enable debugging
-  information on most modules.
-
-* On Mac OS 10.4, test/dt_arith.c has some errors in conversion from long
-  double to (unsigned) long long and from (unsigned) long long to long double. 
-
-* On Altix SGI with Intel 9.0, testmeta.c would not compile with -O3
-  optimization flag.
-
-* On VAX, the Scaleoffset filter is not supported.  The Scaleoffset filter 
-  supports only the IEEE standard for floating-point data; it cannot be applied 
-  to HDF5 data generated on VAX. 
-
-* On Cray X1, a lone colon on the command line of h5dump --xml (as in
-  the testh5dumpxml.sh script) is misinterpereted by the operating system
-  and causes an error.
-
-* On mpich 1.2.5 and 1.2.6, if more than two processes contribute no IO and 
-  the application asks to do collective IO, we have found that when using 4 
-  processors, a simple collective write will sometimes be hung. This can be 
-  verified with t_mpi test under testpar.
-
-* On IRIX6.5, when the C compiler version is greater than 7.4, complicated
-  MPI derived datatype code will work. However, the user should increase
-  the value of the MPI_TYPE_MAX environment variable to some appropriate value 
-  to use collective irregular selection code.  For example, the current 
-  parallel HDF5 test needs to raise MPI_TYPE_MAX to 200,000 to pass the test. 
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  SLU - 2005/6/30
-
-* For version 6 (6.02 and 6.04) of the Portland Group compiler on the AMD 
-  Opteron processor, there is a bug in the compiler for optimization(-O2).  
-  The library failed in several tests, all related to the MULTI driver.  
-  The problem has been reported to the vendor.  
-
-* On IBM AIX systems, parallel HDF5 mode will fail some tests with error
-  messages like "INFO: 0031-XXX ...".  This is from the command `poe'.
-  Set the environment variable MP_INFOLEVEL to 0 to minimize the messages
-  and run the tests again.
-
-  The tests may fail with messages like "The socket name is already in use",  
-  but HDF5 does not use sockets.  This failure is due to problems with the 
-  poe command trying to set up the debug socket.  To resolve this problem, 
-  check to see whether there are many old /tmp/s.pedb.* files staying around.  
-  These are sockets used by the poe command and left behind due to failed 
-  commands.  First, ask your system administrator to clean them out.  
-  Lastly, request IBM to provide a means to run poe without the debug socket.
-
-* The --enable-static-exec configure flag fails to compile for Solaris
-  platforms. This is due to the fact that not all of the system libraries on 
-  Solaris are available in a static format.
-
-  The --enable-static-exec configure flag also fails to correctly compile
-  on IBM SP2 platforms for serial mode. The parallel mode works fine with 
-  this option.
-  
-  It is suggested that you do not use this option on these platforms
-  during configuration.
-
-* With the gcc 2.95.2 compiler, HDF5 uses the `-ansi' flag during
-  compilation. The ANSI version of the compiler complains about not being
-  able to handle the `long long' datatype with the warning:
-
-        warning: ANSI C does not support `long long'
-  
-  This warning is innocuous and can be safely ignored.
-
-* The ./dsets tests fail on the TFLOPS machine if the test program,
-  dsets.c, is compiled with the -O option.  The HDF5 library still works
-  correctly with the -O option.  The test program works fine if it is
-  compiled with -O1 or -O0.  Only -O (same as -O2) causes the test
-  program to fail.
-
-* Not all platforms behave correctly with Szip's shared libraries. Szip is
-  disabled in these cases, and a message is relayed at configure time. Static
-  libraries should be working on all systems that support Szip and should be
-  used when shared libraries are unavailable. 
-
-  There is also a configure error on Altix machines that incorrectly reports 
-  when a version of Szip without an encoder is being used.
-
-* On some platforms that use Intel and Absoft compilers to build the HDF5 
-  Fortran library, compilation may fail for fortranlib_test.f90, fflush1.f90 
-  and fflush2.f90 complaining about the exit subroutine. Comment out the line 
-  IF (total_error .ne. 0) CALL exit (total_error).
-
-* Information about building with PGI and Intel compilers is available in
-  the INSTALL file sections 4.7 and 4.8.
-
-* On at least one system, SDSC DataStar, the scheduler (in this case
-  LoadLeveler) sends job status updates to standard error when you run 
-  any executable that was compiled with the parallel compilers.
-
-  This causes problems when running "make check" on parallel builds, as 
-  many of the tool tests function by saving the output from test runs,
-  and comparing it to an exemplar.  
-
-  The best solution is to reconfigure the target system so it no longer
-  inserts the extra text.  However, this may not be practical.
-
-  In such cases, one solution is to "setenv HDF5_Make_Ignore yes" prior to 
-  the configure and build.  This will cause "make check" to continue after 
-  detecting errors in the tool tests.  However, in the case of SDSC DataStar,
-  it also leaves you with some 150 "failed" tests to examine by hand.
-
-  A second solution is to write a script to run serial tests and filter
-  out the text added by the scheduler.  A sample script used on SDSC
-  DataStar is given below, but you will probably have to customize it 
-  for your installation.  
-
-  Observe that the basic idea is to insert the script as the first item 
-  on the command line which executes the the test.  The script then 
-  executes the test and filters out the offending text before passing
-  it on.
-
-        #!/bin/csh
-
-        set STDOUT_FILE=~/bin/serial_filter.stdout
-        set STDERR_FILE=~/bin/serial_filter.stderr
-
-        rm -f $STDOUT_FILE $STDERR_FILE
-
-        ($* > $STDOUT_FILE) >& $STDERR_FILE
-
-        set RETURN_VALUE=$status
-
-        cat $STDOUT_FILE
-
-        tail +3 $STDERR_FILE
-
-        exit $RETURN_VALUE
-
-  You get the HDF5 make files and test scipts to execute your filter script
-  by setting the environment variable "RUNSERIAL" to the full path of the 
-  script prior to running configure for parallel builds.  Remember to 
-  "unsetenv RUNSERIAL" before running configure for a serial build.
-
-  Note that the RUNSERIAL environment variable exists so that we can 
-  prefix serial runs as necessary on the target system.  On DataStar,
-  no prefix is necessary.  However on an MPICH system, the prefix might
-  have to be set to something like "/usr/local/mpi/bin/mpirun -np 1" to
-  get the serial tests to run at all.
-
-  In such cases, you will have to include the regular prefix in your
-  filter script.
-
-* H5Ocopy() does not copy reg_ref attributes correctly when shared-message
-  is turn on. The value of the reference in the destination attriubte is
-  wrong. This H5Ocopy problem will affect the h5copy tool.
-
-* In the C++ API, it appears that there are bugs in Attribute::write/read
-  and DataSet::write/read for fixed- and variable-len strings.  The problems
-  are being worked on and a patch will be provided when the fixes are
-  available.
-
-
-%%%%1.8.0%%%%   
-
-
-HDF5 version 1.8.0 released on Tue Feb 12 20:41:19 CST 2008
-================================================================================
-
-INTRODUCTION
-============
-
-This document describes the differences between the HDF5-1.6.x release series
-and HDF5 1.8.0, and contains information on the platforms tested and known 
-problems in HDF5-1.8.0.  For more details, see the HISTORY-1_0-1_8_0_rc3.txt
-file in the 
-release_docs/ directory of the HDF5 source.
-
-Links to the HDF5 1.8.0 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
-
-     http://www.hdfgroup.org/products/hdf5/
-
-The HDF5 1.8.0 release can be obtained from:
-
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
-
-User documentation for 1.8.0 can be accessed directly at this location: 
-
-     http://www.hdfgroup.org/HDF5/doc/
-
-New features in 1.8.0, including brief general descriptions of some new 
-and modified APIs, are described in the "What's New in 1.8.0?" document:
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
-
-All new and modified APIs are listed in detail in the "HDF5 Software Changes 
-from Release to Release" document, in the section "Release 1.8.0 (current 
-release) versus Release 1.6.x":
-
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-
-If you have any questions or comments, please send them to the HDF Help Desk:
-
-     help at hdfgroup.org
-
-
-CONTENTS
-========
-
-- New Features
-- Removed Feature
-- Support for new platforms and languages
-- Bug Fixes since HDF5-1.6.0
-- Platforms Tested
-- Supported Configuration Features Summary
-- Known Problems
-
-
-New Features
-============
-
-   HDF5 Release 1.8.0 is a major release with many changes and new features.
-
-   New format and interface features discussed in the "What's New in 
-   HDF5 1.8.0" document include the following:
-
-       Enhanced group object management
-       Enhanced attribute management and more efficient meta data handling
-       Expanded datatype features
-       Creation order tracking and indexing
-       Improved meta data caching and cache control
-       UTF-8 encoding
-       New I/O filters: n-bit and scale+offset compression
-       New link (H5L) and object (H5O) interfaces and features
-       External and user-defined links
-       New high-level APIs: 
-           HDF5 Packet Table (H5PT) and HDF5 Dimension Scale (H5DS)
-       C++ and Fortran interfaces for older high-level APIs:
-           H5Lite (H5LT), H5Image (H5IM), and H5Table (H5TB)
-       New and improved tools
-       And more...
-
-       http://hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
-
-
-    New APIs associated with these features, other interface changes 
-    (e.g., ENUM and struct definitions), and new library configuration flags
-    are listed in the "Release 1.8.0 (current release) versus Release 1.6.x" 
-    section of "HDF5 Software Changes from Release to Release."
-
-        http://hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-
-Compatibility
--------------
-    Many HDF5 users and user communities have existing applications that 
-    they may wish to port to Release 1.8.0.  Alternatively, some users may 
-    wish to take advantage of Release 1.8.0's improved performance without
-    having to port such applications.  To facilitate managing application
-    compatibility and porting applications from release to release, the HDF 
-    Team has implemented the following features:
-        Individually-configurable macros that selectively map common 
-            interface names to the old and new interfaces
-        Library configuration options to configure the macro mappings
-
-    Two related documents accompany this release:
-        "API Compatibility Macros in HDF5" discusses the specifics of the 
-        new individually-configurable macros and library configuration 
-        options.
-        http://hdfgroup.org/HDF5/doc/RM/APICompatMacros.html
- 
-        "New Features in HDF5 Release 1.8.0 and Backward/Forward Format
-        Compatibility Issues" discusses each new feature with regard to 
-        its impact on format compatibility.
-        http://hdfgroup.org/HDF5/doc/ADGuide/CompatFormat180.html
-
-Referenced documents
---------------------
-    http://hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
-        "What's New in HDF5 1.8.0"
-
-    http://hdfgroup.org/HDF5/doc/ADGuide/Changes.html
-        The "Release 1.8.0 (current release) versus Release 1.6.x "
-        section in "HDF5 Software Changes from Release to Release"
-
-    http://hdfgroup.org/HDF5/doc/RM/APICompatMacros.html
-        "API Compatibility Macros in HDF5"
-
-    http://hdfgroup.org/HDF5/doc/ADGuide/CompatFormat180.html
-        "New Features in HDF5 Release 1.8.0 and Backward/Forward Format
-        Compatibility Issues"
-
-
-Removed Feature
-===============
-The stream virtual file driver (H5FD_STREAM) have been removed in this 
-release. This affects the functions H5Pset_fapl_stream and H5Pget_fapl_stream 
-and the constant H5FD_STREAM.
-
-This virtual file driver will be available at 
-http://hdf5-addons.origo.ethz.ch/. Note that at the time of this release, 
-the transition is still in progress; the necessary integration tools may 
-not be available when HDF5 Release 1.8.0 first comes out.
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-    - Support for Open VMS 7.3 was added.
-
-
-Bug Fixes since HDF5-1.6.0 
-==========================
-    This release contains numerous bug fixes. For details, see the 
-    "Changes from 1.6.0 to 1.8.0-rc3" section of the HISTORY.txt file for
-    this release.
-
-
-Platforms Tested
-================
-The following platforms and compilers have been tested for for this release.
-
-    AIX 5.2 (32/64 bit)           xlc 8.0.0.11
-                                  xlC 8.0
-                                  xlf 10.01.0000.0 
-                                  mpcc_r 6.0.0.8
-                                  mpxlf_r 8.1.1.7
-
-    FreeBSD 6.2-STABLE i386       gcc 3.4.6 [FreeBSD] 20060305
-    (duty)                        g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.2.1 20080123
-                                  g++ 4.2.1 20080123
-                                  gfortran 4.2.1 20070620
-
-    FreeBSD 6.2-STABLE amd64      gcc 3.4.6 [FreeBSD] 20060305
-    (liberty)                     g++ 3.4.6 [FreeBSD] 20060305
-                                  gcc 4.2.1 20080123
-                                  g++ 4.2.1 20080123
-                                  gfortran 4.2.1 20080123
-
-    IRIX64 6.5 (64 & n32)         MIPSpro cc 7.4.4m
-                                  F90 MIPSpro 7.4.4m 
-                                  C++ MIPSpro cc 7.4.4m
-
-    Linux 2.6.9 (RHEL4)           Intel 10.0 compilers
-    (abe.ncsa.uiuc.edu)
-
-    Linux 2.4.21-47               gcc 3.2.3 20030502
-    (osage)
-
-    Linux 2.6.9-42.0.10           gcc 3.4.6 20060404
-    (kagiso)                      PGI 7.0-7 (pgcc, pgf90, pgCC)
-                                  Intel 9.1 (icc, ifort, icpc)
-
-    Linux 2.6.16.27 x86_64 AMD    gcc 4.1.0 (SuSE Linux), g++ 4.1.0, 
-    (smirom)                          g95 (GCC 4.0.3)
-                                  PGI 6.2-5 (pgcc, pgf90, pgCC)
-                                  Intel 9.1 (icc, iort, icpc)
-
-    Linux 2.6.5-7.252.1-rtgfx #1  Intel(R) C++ Version 9.0
-          SMP ia64                Intel(R) Fortran Itanium(R) Version 9.0 
-    (cobalt)                      SGI MPI
-
-    SunOS 5.8 32,46               Sun WorkShop 6 update 2 C 5.3
-     (Solaris 2.8)                Sun WorkShop 6 update 2 Fortran 95 6.2
-                                  Sun WorkShop 6 update 2 C++ 5.3
-
-    SunOS 5.10                    cc: Sun C 5.8 
-    (linew)                       f90: Sun Fortran 95 8.2 
-                                  CC: Sun C++ 5.8 
-
-    Xeon Linux 2.4.21-32.0.1.ELsmp-perfctr-lustre
-    (tungsten)                    gcc 3.2.2 20030222
-                                  Intel(R) C++ Version 9.0
-                                  Intel(R) Fortran Compiler Version 9.0
-
-    IA-64 Linux 2.4.21.SuSE_292.til1 ia64
-    (NCSA tg-login)               gcc 3.2.2
-                                  Intel(R) C++ Version 8.1
-                                  Intel(R) Fortran Compiler Version 8.1
-                                  mpich-gm-1.2.5..10-intel-r2
-
-    Windows XP                    Visual Studio .NET
-                                  Visual Studio 2005 w/ Intel Fortran 9.1
-                                  Cygwin(native gcc compiler and g95)
-                                  MinGW(native gcc compiler and g95)
-
-    Windows XP x64                Visual Studio 2005 w/ Intel Fortran 9.1
-
-    Windows Vista                 Visual Studio 2005
-
-    MAC OS  10.4 (Intel)          gcc i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 
-                                  G95 (GCC 4.0.3 (g95 0.91!) Nov 21 2006)
-
-    Alpha Open VMS 7.3            Compaq C V6.5-001-48BCD
-                                  HP Fortran V7.6-3276
-                                  Compaq C++ V6.5-004
-
-
-Supported Configuration Features Summary
-========================================
-
-    In the tables below
-          y   = tested and supported
-          n   = not supported or not tested in this release
-          x   = not working in this release
-          dna = does not apply
-          ( ) = footnote appears below second table
-          <blank> = testing incomplete on this feature or platform 
-
-Platform                 C        F90    F90      C++   zlib  SZIP
-                         parallel        parallel
-SunOS5.8 64-bit          n        y      n        y     y     y
-SunOS5.8 32-bit          n        y      n        y     y     y
-SunOS5.10 64-bit         y(1)     y      n        y     y     y
-SunOS5.10 32-bit         y(1)     y      n        y     y     y
-IRIX64_6.5 64-bit        n        y      y        y     y     y
-IRIX64_6.5 32-bit        n        n      n        n     y     y
-AIX-5.2  32-bit          y        y      y        y     y     y
-AIX-5.2  64-bit          y        y      y        y     y     y
-Windows XP               n        y(15)  n(15)    y     y     y
-Windows XP x64           n        y(15)  n(15)    y     y     y
-Windows Vista            n        n      n        y     y     y
-Mac OS X 10.4 PowerPC    n               n
-Mac OS X 10.4 Intel      n        y      n        y     y     y
-FreeBSD 4.11             n        n      n        y     y     y
-RedHat EL3  W       (3)  y(1a)    y(10)  y(1a)    y     y     y
-RedHat EL3  W Intel (3)  n        y      n        y     y     n
-RedHat EL3  W PGI   (3)  n        y      n        y     y     n
-SuSe x86_64 gcc  (3,12)  y(1a)    y(11)  n        y     y     y
-SuSe x86_64 Int  (3,12)  n        y(13)  n        y     y     n
-SuSe x86_64 PGI  (3,12)  n        y(8)   n        y     y     y
-Linux 2.4 Xeon C 
-    Lustre Intel  (3,6)  n        y      n        y     y     n
-Linux 2.6 SuSE ia64 C 
-    Intel         (3,7)  y        y      y        y     y     n
-Linux 2.6 SGI Altix 
-    ia64 Intel      (3)  y        y      y        y     y     y
-Alpha OpenVMS 7.3.2      n        y      n        y     n     n
-
-
-
-Platform                 Shared  Shared    Shared    static-  Thread-  
-                         C libs  F90 libs  C++ libs  exec     safe     
-Solaris2.8 64-bit        y       y         y         x        y        
-Solaris2.8 32-bit        y       y         y         x        y        
-Solaris2.10 64-bit       y                           x        y        
-Solaris2.10 32-bit       y                           x        y        
-IRIX64_6.5 64-bit        y       y         n         y        y        
-IRIX64_6.5 32-bit        y       dna       y         y        y        
-AIX-5.2 & 5.3 32-bit     n       n         n         y        n        
-AIX-5.2 & 5.3 64-bit     n       n         n         y        n        
-Windows XP               y       y(15)     y         y        y        
-Windows XP x64           y       y(15)     y         y        y        
-Windows Vista            y       n         n         y        y        
-Mac OS X 10.3            y                           y        n        
-FreeBSD 4.11             y       n         y         y        y        
-RedHat EL3  W       (3)  y       y(10)     y         y        y        
-RedHat EL3  W Intel (3)  y       y         y         y        n        
-RedHat EL3  W PGI   (3)  y       y         y         y        n        
-SuSe x86_64 W GNU (3,12) y       y         y         y        y        
-SuSe x86_64 W Int (3,12) y       y         y         y(14)    n        
-SuSe x86_64 W PGI (3,12) y       y         y         y(14)    n        
-Linux 2.4 Xeon C 
-    Lustre Intel    (6)  y       y         y         y        n        
-Linux 2.4 SuSE 
-    ia64 C Intel    (7)  y       y         y         y        n        
-Linux 2.4 SGI Altix 
-    ia64 Intel           y                           y        n        
-Alpha OpenVMS 7.3.2      n       n         n         y        n        
-
-    Notes: (1)  Using mpich 1.2.6.
-           (1a) Using mpich2 1.0.6.
-           (2)  Using mpt and mpich 1.2.6.
-           (3)  Linux 2.6 with GNU, Intel, and PGI compilers, as indicated.  
-                  W or C indicates workstation or cluster, respectively.
-
-           (6)  Linux 2.4.21-32.0.1.  Xeon cluster with ELsmp_perfctr_lustre 
-                  and Intel compilers
-           (7)  Linux 2.4.21, SuSE_292.till.  Ia64 cluster with Intel
-compilers
-           (8)  pgf90
-           (9)  With Compaq Visual Fortran 6.6c compiler.
-           (10) With PGI and Absoft compilers.
-           (11) PGI and Intel compilers for both C and Fortran
-           (12) AMD Opteron x86_64
-           (13) ifort
-           (14) Yes with C and Fortran, but not with C++
-	   (15) Using Visual Studio 2005 or Cygwin
-           (16) Not tested for this release.
-    Compiler versions for each platform are listed in the preceding
-    "Platforms Tested" table.
-
-
-Known Problems
-==============
-* We have discovered two problems when running collective IO parallel HDF5 
-  tests with chunking storage on the ChaMPIon MPI compiler on tungsten, a 
-  Linux cluster at NCSA.
-
-  Under some complex selection cases: 
-  1) MPI_Get_element returns the wrong value.
-  2) MPI_Type_struct also generates the wrong derived datatype and corrupt 
-     data may be generated.
-  These issues arise only when turning on collective IO with chunking storage 
-  with some complex selections. We have not found these problems on other 
-  MPI-IO compilers. If you encounter these problems, you may use independent 
-  IO instead.
-
-  To avoid this behavior, change the following line in your code
-      H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
-
-  to
-      H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_INDEPENDENT);
-
-  KY - 2007/08/24
-
-* For SNL, spirit/liberty/thunderbird: The serial tests pass but parallel
-  tests failed with MPI-IO file locking message. AKC - 2007/6/25
-
-* On Intel 64 Linux cluster (RH 4, Linux 2.6.9) with Intel 10.0 compilers, 
-  use -mp -O1 compilation flags to build the libraries. A higher level of 
-  optimization causes failures in several HDF5 library tests. 
-
-* For SNL, Red Storm: Only parallel HDF5 is supported.  The serial tests pass
-  when run against the parallel library; the parallel tests also pass, but
-  with lots of non-fatal error messages.
-
-* For LLNL, uP: both serial and parallel tests pass.  
-  Zeus: Serial tests pass but parallel tests fail with a known problem in MPI.
-  ubgl: Serial tests pass but parallel tests fail. 
-
-* On SUN 5.10 C++, testing fails in the "Testing Shared Datatypes with 
-  Attributes" test. 
-
-* Configuring with --enable-debug=all produces compiler errors on most
-  platforms:  Users who want to run HDF5 in debug mode should use
-  --enable-debug rather than --enable-debug=all to enable debugging
-  information on most modules.
-
-* On Mac OS 10.4, test/dt_arith.c has some errors in conversion from long
-  double to (unsigned) long long and from (unsigned) long long to long double. 
-
-* On Altix SGI with Intel 9.0, testmeta.c would not compile with -O3
-  optimization flag.
-
-* On VAX, the Scaleoffset filter is not supported. The filter cannot be 
-  applied to HDF5 data generated on VAX. The Scaleoffset filter only supports 
-  the IEEE standard for floating-point data.
-
-* On Cray X1, a lone colon on the command line of h5dump --xml (as in
-  the testh5dumpxml.sh script) is misinterpereted by the operating system
-  and causes an error.
-
-* On mpich 1.2.5 and 1.2.6, if more than two processes contribute no IO and 
-  the application asks to do collective IO, we have found that when using 4 
-  processors, a simple collective write will sometimes be hung. This can be 
-  verified with t_mpi test under testpar.
-
-* On IRIX6.5, when the C compiler version is greater than 7.4, complicated
-  MPI derived datatype code will work. However, the user should increase
-  the value of the MPI_TYPE_MAX environment variable to some appropriate value 
-  to use collective irregular selection code.  For example, the current 
-  parallel HDF5 test needs to raise MPI_TYPE_MAX to 200,000 to pass the test. 
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read 
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculating code of the Fletcher32 checksum in the 
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.  
-  However, after fixing the bug, the checksum value was no longer the same as 
-  before on little-endian system.  Library releases after 1.6.4 can still read 
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.  
-  SLU - 2005/6/30
-
-* For version 6 (6.02 and 6.04) of the Portland Group compiler on the AMD 
-  Opteron processor, there is a bug in the compiler for optimization(-O2).  
-  The library failed in several tests, all related to the MULTI driver.  
-  The problem has been reported to the vendor.  
-
-* On IBM AIX systems, parallel HDF5 mode will fail some tests with error
-  messages like "INFO: 0031-XXX ...".  This is from the command `poe'.
-  Set the environment variable MP_INFOLEVEL to 0 to minimize the messages
-  and run the tests again.
-
-  The tests may fail with messages like "The socket name is already in use",  
-  but HDF5 does not use sockets.  This failure is due to problems with the 
-  poe command trying to set up the debug socket.  To resolve this problem, 
-  check to see whether there are many old /tmp/s.pedb.* files staying around.  
-  These are sockets used by the poe command and left behind due to failed 
-  commands.  First, ask your system administrator to clean them out.  
-  Lastly, request IBM to provide a means to run poe without the debug socket.
-
-* The --enable-static-exec configure flag fails to compile for Solaris
-  platforms. This is due to the fact that not all of the system libraries on 
-  Solaris are available in a static format.
-
-  The --enable-static-exec configure flag also fails to correctly compile
-  on IBM SP2 platform for the serial mode. The parallel mode works fine with 
-  this option.
-  
-  It is suggested that you do not use this option on these platforms
-  during configuration.
-
-* With the gcc 2.95.2 compiler, HDF5 uses the `-ansi' flag during
-  compilation. The ANSI version of the compiler complains about not being
-  able to handle the `long long' datatype with the warning:
-
-        warning: ANSI C does not support `long long'
-  
-  This warning is innocuous and can be safely ignored.
-
-* The ./dsets tests fail on the TFLOPS machine if the test program,
-  dsets.c, is compiled with the -O option.  The HDF5 library still works
-  correctly with the -O option.  The test program works fine if it is
-  compiled with -O1 or -O0.  Only -O (same as -O2) causes the test
-  program to fail.
-
-* Not all platforms behave correctly with Szip's shared libraries. Szip is
-  disabled in these cases, and a message is relayed at configure time. Static
-  libraries should be working on all systems that support Szip and should be
-  used when shared libraries are unavailable. 
-
-  There is also a configure error on Altix machines that incorrectly reports 
-  when a version of Szip without an encoder is being used.
-
-* On some platforms that use Intel and Absoft compilers to build the HDF5 
-  Fortran library, compilation may fail for fortranlib_test.f90, fflush1.f90 
-  and fflush2.f90 complaining about the exit subroutine. Comment out the line 
-  IF (total_error .ne. 0) CALL exit (total_error).
-
-* Information about building with PGI and Intel compilers is available in
-  the INSTALL file sections 4.7 and 4.8.
-
-* On at least one system, SDSC DataStar, the scheduler (in this case
-  LoadLeveler) sends job status updates to standard error when you run 
-  any executable that was compiled with the parallel compilers.
-
-  This causes problems when running "make check" on parallel builds, as 
-  many of the tool tests function by saving the output from test runs,
-  and comparing it to an exemplar.  
-
-  The best solution is to reconfigure the target system so it no longer
-  inserts the extra text.  However, this may not be practical.
-
-  In such cases, one solution is to "setenv HDF5_Make_Ignore yes" prior to 
-  the configure and build.  This will cause "make check" to continue after 
-  detecting errors in the tool tests.  However, in the case of SDSC DataStar,
-  it also leaves you with some 150 "failed" tests to examine by hand.
-
-  A second solution is to write a script to run serial tests and filter
-  out the text added by the scheduler.  A sample script used on SDSC
-  DataStar is given below, but you will probably have to customize it 
-  for your installation.  
-
-  Observe that the basic idea is to insert the script as the first item 
-  on the command line which executes the the test.  The script then 
-  executes the test and filters out the offending text before passing
-  it on.
-
-        #!/bin/csh
-
-        set STDOUT_FILE=~/bin/serial_filter.stdout
-        set STDERR_FILE=~/bin/serial_filter.stderr
-
-        rm -f $STDOUT_FILE $STDERR_FILE
-
-        ($* > $STDOUT_FILE) >& $STDERR_FILE
-
-        set RETURN_VALUE=$status
-
-        cat $STDOUT_FILE
-
-        tail +3 $STDERR_FILE
-
-        exit $RETURN_VALUE
-
-  You get the HDF5 make files and test scipts to execute your filter script
-  by setting the environment variable "RUNSERIAL" to the full path of the 
-  script prior to running configure for parallel builds.  Remember to 
-  "unsetenv RUNSERIAL" before running configure for a serial build.
-
-  Note that the RUNSERIAL environment variable exists so that we can 
-  can prefix serial runs as necessary on the target system.  On DataStar,
-  no prefix is necessary.  However on an MPICH system, the prefix might
-  have to be set to something like "/usr/local/mpi/bin/mpirun -np 1" to
-  get the serial tests to run at all.
-
-  In such cases, you will have to include the regular prefix in your
-  filter script.
-
-* H5Ocopy() does not copy reg_ref attributes correctly when shared-message
-  is turn on. The value of the reference in the destination attriubte is
-  wrong. This H5Ocopy problem will affect the h5copy tool.
-
diff --git a/release_docs/HISTORY-1_9.txt b/release_docs/HISTORY-1_9.txt
new file mode 100644
index 0000000..8e7648a
--- /dev/null
+++ b/release_docs/HISTORY-1_9.txt
@@ -0,0 +1,6 @@
+ HDF5 HISTORY
+ ============
+ This file contains history of the HDF5 1.9 branch
+ 
+ CONTENTS
+
diff --git a/release_docs/INSTALL b/release_docs/INSTALL
index 0fb2787..2dcb9be 100644
--- a/release_docs/INSTALL
+++ b/release_docs/INSTALL
@@ -1,3 +1,4 @@
+
 Instructions for the Installation of HDF5 Software
 ==================================================
 
@@ -12,25 +13,25 @@ CONTENTS
         1. Obtaining HDF5
 
         2. Quick installation
-        2.1. UNIX platforms
-        2.2. Windows and Cygwin
+        2.1. Windows
+        2.2. RedStorm (Cray XT3)
 
         3. HDF5 dependencies
-        3.1. Make
-        3.2. Zlib
-        3.3  Szip (optional)
-        3.4. MPI and MPI-IO
+        3.1. Zlib
+        3.2  Szip (optional)
+        3.3. MPI and MPI-IO
 
         4. Full installation instructions for source distributions
         4.1. Unpacking the distribution
         4.1.1. Non-compressed tar archive (*.tar)
-        4.1.2. Gzip'd tar archive (*.tar.gz)
-        4.1.3. Bzip'd tar archive (*.tar.bz2)
+        4.1.2. Compressed tar archive (*.tar.Z)
+        4.1.3. Gzip'd tar archive (*.tar.gz)
+        4.1.4. Bzip'd tar archive (*.tar.bz2)
         4.2. Source versus build directories
         4.3. Configuring
         4.3.1. Specifying the installation directories
         4.3.2. Using an alternate C compiler
-        4.3.3. Configuring for 32 or 64-bit support
+        4.3.3. Configuring for 64-bit support
         4.3.4. Additional compilation flags
         4.3.5. Compiling HDF5 wrapper libraries
         4.3.6. Specifying other programs
@@ -48,9 +49,17 @@ CONTENTS
 
         6. Support
 
-        A. Building and testing with other compilers
-        A.1.  Building and testing with Intel compilers
-        A.2.  Building and testing with PGI compilers
+        A. Warnings about compilers
+        A.1. GNU (Intel platforms)
+        A.2. DEC
+        A.3. SGI (Irix64 6.2)
+        A.4. Windows/NT
+
+        B. Large (>2GB) versus small (<2GB) file capability
+
+        C. Building and testing with other compilers
+        C.1.  Building and testing with Intel compilers
+        C.2.  Building and testing with PGI compilers
 
 *****************************************************************************
 
@@ -66,14 +75,13 @@ CONTENTS
         rather any bug fixes will be rolled into the next snapshot).
         Furthermore, the snapshots have only been tested on a few
         machines and may not test correctly for parallel applications.
-        Snapshots, in a limited number of formats, can be found on The
-        HDF Group's development FTP server:
+        Snapshots, in a limited number of formats, can be found on THG's 
+        development FTP server:
 
             ftp://ftp.hdfgroup.uiuc.edu/pub/outgoing/hdf5/snapshots 
 
 
 2. Quick installation
-2.1. UNIX platforms
         For those who don't like to read ;-) the following steps can be used
         to configure, build, test, and install the HDF5 Library, header files,
         and support programs. For example, to install HDF5 version X.Y.Z at
@@ -92,12 +100,6 @@ CONTENTS
 
             $ tar zxf hdf5-X.Y.Z.tar.gz
 
-        Some versions even auto-recognize the file is in compressed format
-        and will do uncompression automatically. The step above can be
-        further simplified to the following:
-
-            $ tar xf hdf5-X.Y.Z.tar.gz
-
         <configure_flags> above refers to the configure flags appropriate
         to your installation.  For example, to install HDF5 with the 
         Fortran and C++ interfaces and with SZIP compression, the 
@@ -109,25 +111,27 @@ CONTENTS
         In this case, PATH_TO_SZIP would be replaced with the path to the 
         installed location of the SZIP library.
 
-2.2. Windows and Cygwin
+2.1. Windows
         Users of Microsoft Windows should see the INSTALL_Windows files for
-        detailed instructions.  INSTALL_Cygwin also exists for those platforms.
+        detailed instructions.
 
+2.2. RedStorm (Cray XT3)
+        Users of the Red Storm machine, after reading this file, should read
+        the Red Storm section in the INSTALL_parallel file for specific
+        instructions for the Red Storm machine.  The same instructions would
+        probably work for other Cray XT3 systems, but they have not been
+        verified.
 
-3. HDF5 dependencies
-3.1. Make
-        The building of HDF5 Library employs some Gnu Make (gmake)
-        features. Either gmake or compatible make is needed for the building
-        and installation of the Library.
 
-3.2. Zlib
+3. HDF5 dependencies
+3.1. Zlib
         The HDF5 Library includes a predefined compression filter that 
         uses the "deflate" method for chunked datasets. If zlib-1.1.2 or
         later is found, HDF5 will use it.  Otherwise, HDF5's predefined
         compression method will degenerate to a no-op; the compression
         filter will succeed but the data will not be compressed.
 
-3.3. Szip (optional)
+3.2. Szip (optional)
         The HDF5 Library includes a predefined compression filter that
         uses the extended-Rice lossless compression algorithm for chunked
         datasets. For more information about Szip compression and license
@@ -154,7 +158,7 @@ CONTENTS
         check the "I/O filters (external):" line in the configure output,
         summary section, printed to the standard output.
 
-3.4. MPI and MPI-IO
+3.3. MPI and MPI-IO
         The parallel version of the library is built upon the foundation
         provided by MPI and MPI-IO. If these libraries are not available
         when HDF5 is configured, only a serial version of HDF5 can be built.
@@ -171,22 +175,23 @@ CONTENTS
 
             $ tar xf hdf5-X.Y.Z.tar
 
-4.1.2. Gzip'd tar archive (*.tar.gz)
+4.1.2. Compressed tar archive (*.tar.Z)
+
+            $ uncompress -c < hdf5-X.Y.Z.tar.Z | tar xf -
+            Or
+            $ tar Zxf hdf5-X.Y.Z.tar.Z
+
+4.1.3. Gzip'd tar archive (*.tar.gz)
 
             $ gunzip < hdf5-X.Y.Z.tar.gz | tar xf -
             Or
             $ tar zxf hdf5-X.Y.Z.tar.gz
-            Or
-            $ tar xf hdf5-X.Y.Z.tar.gz
 
-4.1.3. Bzip'd tar archive (*.tar.bz2)
+4.1.4. Bzip'd tar archive (*.tar.bz2)
 
             $ bunzip2 < hdf5-X.Y.Z.tar.bz2 | tar xf -
             Or
             $ tar jxf hdf5-X.Y.Z.tar.bz2
-            Or
-            $ tar xf hdf5-X.Y.Z.tar.bz2
-
 
 4.2. Source versus build directories
         On most systems the build can occur in a directory other than the
@@ -199,6 +204,20 @@ CONTENTS
             $ cd build-fortran
             $ ../hdf5-X.Y.Z/configure --enable-fortran ...
 
+        Unfortunately, this does not work on recent Irix platforms (6.5?
+        and later) because that `make' does not understand the VPATH variable. 
+        However, HDF5 also supports Irix `pmake' which has a .PATH target 
+        which serves a similar purpose. Here's what the Irix man pages say 
+        about VPATH, the facility used by HDF5 makefiles for this feature:
+
+                The VPATH facility is a derivation of the undocumented
+                VPATH feature in the System V Release 3 version of make.
+                System V Release 4 has a new VPATH implementation, much
+                like the pmake(1) .PATH feature. This new feature is also
+                undocumented in the standard System V Release 4 manual
+                pages.  For this reason it is not available in the IRIX
+                version of make. The VPATH facility should not be used
+                with the new parallel make option.
 
 4.3. Configuring
         HDF5 uses the GNU autoconf system for configuration, which
@@ -248,26 +267,26 @@ CONTENTS
 
             $ CC=cc ./configure
 
-        A parallel version of HDF5 can be built by specifying `mpicc' as
-        the C compiler.   Using the `mpicc' compiler will insure that the
-        correct MPI and MPI-IO header files and libraries are used.
+        A parallel version of HDF5 can be built by specifying `mpicc'
+        as the C compiler.  (The `--enable-parallel' flag documented
+        below is optional in this case.)  Using the `mpicc' compiler
+        will insure that the correct MPI and MPI-IO header files and
+        libraries are used.
 
-            $ CC=/usr/local/mpi/bin/mpicc ./configure --enable-parallel
+            $ CC=/usr/local/mpi/bin/mpicc ./configure
 
-4.3.3. Configuring for 64 or 32 bit support
-        Some machine architectures support 32-bit or 64-bit binaries.
+4.3.3. Configuring for 64-bit support
+        Several machine architectures support 32-bit or 64-bit binaries.
         The options below describe how to enable support for different options.
 
-        Users compiling on 64-bit Linux systems may generate 32-bit binary
-        with the following flags:
+        On Irix64, the default compiler is `cc'. To use an alternate compiler,
+        specify it with the CC variable:
 
-            $ CC='gcc -m32' ./configure
-            OR
-            $ CFLAGS='-m32' ./configure
+            $ CC='cc -n32' ./configure
 
-        Users compiling on older Solaris machines using the Sun compiler and
-        desiring to build the distribution with 64-bit support may need to
-        specify the compiler 'cc' with the appropriate flag:
+        Similarly, users compiling on a Solaris machine and desiring to
+        build the distribution with 64-bit support should specify the
+        correct flags with the CC variable:
 
             $ CC='cc -m64' ./configure
 
@@ -278,7 +297,7 @@ CONTENTS
               ./configure --enable-fortran
         Parallel: (C++ not supported with parallel)
             $ CFLAGS=-q64 FCFLAGS=-q64 AR='ar -X 64'\
-              ./configure --enable-parallel --enable-fortran
+              ./configure --enable-fortran
 
 4.3.4. Additional compilation flags
         If addtional flags must be passed to the compilation commands,
@@ -295,31 +314,30 @@ CONTENTS
 
             $ ./configure --enable-fortran
             $ ./configure --enable-cxx
+        
+        Configuration will halt if a working Fortran 90 or 95 compiler or
+        C++ compiler is not found. Currently, the Fortran configure tests
+        for these compilers in order: f90, pgf90, f95. To use an
+        alternate compiler specify it with the FC variable:
 
-        Additionally, --enable-fortran --enable-fortran2003 enables Fortran
-        2003 APIs. Configuration will halt if a working Fortran 90/95 compiler 
-        (or a working Fortran 2003 compiler in the case of 
-        --enable-fortran2003) was specified or C++ compiler is not found. 
-        Currently, the Fortran configure tests for these compilers in order: 
-        gfortran ifort pgf90 pathf90 pathf95 xlf90 xlf95 xlf2003 f90 epcf90 f95 
-        fort lf95 g95 ifc efc gfc. To use an alternate compiler specify it with 
-        the FC variable:
-
-            $ FC=/usr/local/bin/gfortran ./configure --enable-fortran --enable-fortran2003
+            $ FC=/usr/local/bin/g95 ./configure --enable-fortran
 
         Note: The Fortran and C++ interfaces are not supported on all the
               platforms the main HDF5 Library supports. Also, the Fortran
               interface supports parallel HDF5 while the C++ interface does
               not.
 
+        Note: See sections 4.7 and 4.8 for building the Fortran library with
+              Intel or PGI compilers. 
+
 4.3.6. Specifying other programs
-        The build system has been tuned for use with GNU make which is
-        the preferred version. Other versions of make may or may not work
-        completely.  If the `make' command runs a non-GNU version but a GNU
-        version is available under a different name (perhaps `gmake'), then
-        HDF5 can be configured to use it by setting the MAKE variable. Note
-        that whatever value is used for MAKE must also be used as the make
-        command when building the library:
+        The build system has been tuned for use with GNU make but also 
+        works with other versions of make.  If the `make' command runs a
+        non-GNU version but a GNU version is available under a different
+        name (perhaps `gmake'), then HDF5 can be configured to use it by
+        setting the MAKE variable. Note that whatever value is used for
+        MAKE must also be used as the make command when building the
+        library:
 
             $ MAKE=gmake ./configure
             $ gmake
@@ -333,7 +351,8 @@ CONTENTS
         install program detected automatically by configure. If none is
         found, the shell script bin/install-sh is used. Configure does not
         check that the install script actually works; if a bad install is 
-        detected on your system you have two choices:
+        detected on your system (e.g., on the ASCI blue machine as of 
+        March 2, 1999) you have two choices:
 
             1. Copy the bin/install-sh program to your $HOME/bin
                directory, name it `install', and make sure that $HOME/bin
@@ -369,7 +388,7 @@ CONTENTS
               LDFLAGS=-L/usr/unsup/lib \
               ./configure
 
-        HDF5 includes Szip as a predefined compression method (see 3.3).  
+        HDF5 includes Szip as a predefined compression method (see 3.2).  
         To enable Szip compression, the HDF5 Library must be configured 
         and built using the Szip Library:
 
@@ -428,7 +447,7 @@ CONTENTS
         HDF5 can also print a trace of all API function calls, their 
         arguments, and the return values. To enable or disable the
         ability to trace the API say `--enable-trace' (the default for
-        snapshots) or `--disable-trace' (the default for public releases). 
+        snapthots) or `--disable-trace' (the default for public releases). 
         The tracing must also be enabled at runtime to see any output 
         (see "Debugging HDF5 Applications," reference above).
 
@@ -507,10 +526,11 @@ CONTENTS
 4.6. Installing HDF5
         The HDF5 Library, include files, and support programs can be
         installed in a (semi-)public place by saying `make install'. The
-        files are installed under the directory specified with `--prefix=DIR'
-        (default is 'hdf5' in the build directory) in directories named `lib',
-        `include', and `bin'. The directories, if not existing, will be created
-        automatically, provided the mkdir command supports the -p option.
+        files are installed under the directory specified with
+        `--prefix=DIR' (default is 'hdf5') in directories named `lib',
+        `include', and `bin'. The directories, if not existing, will be
+        created automatically, provided the mkdir command supports the -p
+        option.
 
         If `make install' fails because the install command at your site
         somehow fails, you may use the install-sh that comes with the
@@ -585,11 +605,51 @@ CONTENTS
 
 
 *****************************************************************************
-                                APPENDICES
+			    APPENDIX
 *****************************************************************************
 
-A. Building and testing with other compilers
-A.1.  Building and testing with Intel compilers
+A. Warnings about compilers
+        Output from the following compilers should be extremely suspected
+        when used to compile the HDF5 Library, especially if optimizations are
+        enabled. In all cases, HDF5 attempts to work around the compiler bugs.
+
+A.1. GNU (Intel platforms)
+        Versions before 2.8.1 have serious problems allocating registers
+        when functions contain operations on `long long' datatypes.
+
+A.2. COMPAQ/DEC
+        The V5.2-038 compiler (and possibly others) occasionally
+        generates incorrect code for memcpy() calls when optimizations
+        are enabled, resulting in unaligned access faults. HDF5 works
+        around the problem by casting the second argument to `char *'.
+        The Fortran module (5.4.1a) fails in compiling some Fortran
+        programs.  Use 5.5.0 or higher.
+
+A.3. SGI (Irix64 6.2)
+        The Mongoose 7.00 compiler has serious optimization bugs and
+        should be upgraded to MIPSpro 7.2.1.2m. Patches are available
+        from SGI.
+
+A.4. Windows/NT
+        The Microsoft Win32 5.0 compiler is unable to cast unsigned long
+        long values to doubles. HDF5 works around this bug by first
+        casting to signed long long and then to double.
+
+        A link warning: defaultlib "LIBC" conflicts with use of other libs
+        appears for debug version of VC++ 6.0. This warning will not affect
+        building and testing HDF5 Libraries. 
+
+
+B. Large (>2GB) versus small (<2GB) file capability
+        In order to read or write files that could potentially be larger
+        than 2GB, it is necessary to use the non-ANSI `long long' data
+        type on some platforms. However, some compilers (e.g., GNU gcc
+        versions before 2.8.1 on Intel platforms) are unable to produce
+        correct machine code for this datatype. 
+
+
+C. Building and testing with other compilers
+C.1.  Building and testing with Intel compilers
         When Intel compilers are used (icc or ecc), you will need to modify
         the generated "libtool" program after configuration is finished.
         On or around line 104 of the libtool file, there are lines which 
@@ -607,7 +667,35 @@ A.1.  Building and testing with Intel compilers
         However, if you still experience a problem, you may want to check this 
         line in the libtool file and make sure that it has the correct value.
 
-A.2.  Building and testing with PGI compilers
+      * To build the Fortran library using Intel compiler on Linux 2.4, 
+        one has to perform the following steps:
+          x Use the -fpp -DDEC$=DEC_ -DMS$=MS_ compiler flags to disable
+            DEC and MS compiler directives in source files in the fortran/src, 
+            fortran/test, and fortran/examples directories.
+            E.g.,  setenv F9X 'ifc -fpp -DDEC$=DEC_ -DMS$=MS_'
+            Do not use double quotes since $ is interpreted in them.
+
+          x If Version 6.0 of Fortran compiler is used, the build fails in 
+            the fortran/test directory and then in the fortran/examples 
+            directory.  To proceed, edit the work.pcl files in those 
+            directories to contain two lines:
+
+                    work.pc
+                    ../src/work.pc 
+
+          x Do the same in the fortran/examples directory.
+
+          x A problem with work.pc files was resolved for the newest version 
+            of the compiler (7.0).
+
+       * To build the Fortran library on IA32, follow the steps described 
+         above, except that the DEC and MS compiler directives should be 
+         removed manually or use a patch from HDF FTP server:
+
+             ftp://ftp.hdfgroup.org/HDF5/current/
+
+
+C.2.  Building and testing with PGI compilers
         When PGI C and C++ compilers are used (pgcc or pgCC), you will need to 
         modify the generated "libtool" program after configuration is finished.
         On or around line 104 of the libtool file, there are lines which 
diff --git a/release_docs/INSTALL_CMake.txt b/release_docs/INSTALL_CMake.txt
index d088432..e745084 100644
--- a/release_docs/INSTALL_CMake.txt
+++ b/release_docs/INSTALL_CMake.txt
@@ -637,9 +637,9 @@ build and test process.
 VIII. Options for Platform Configuration Files
 ========================================================================
 
-Below is the HDF518config.cmake ctest script with extra comments.
+Below is the HDF5config.cmake ctest script with extra comments.
 Execute:
-       ctest -S HDF518config.cmake,BUILD_GENERATOR=xxx -C Release -V -O hdf518.log
+       ctest -S HDF5config.cmake,BUILD_GENERATOR=xxx -C Release -V -O hdf5.log
 The same scripts can be used on Linux, Mac OSX or a Windows machine by
 adding an option (${CTEST_SCRIPT_ARG}) to the platform configuration script.
 
@@ -647,7 +647,7 @@ adding an option (${CTEST_SCRIPT_ARG}) to the platform configuration script.
 #############################################################################################
 ### ${CTEST_SCRIPT_ARG} is of the form OPTION=VALUE                                       ###
 ### BUILD_GENERATOR required [Unix, VS2015, VS201564, VS2013, VS201364, VS2012, VS201264] ###
-### ctest -S HDF518config.cmake,BUILD_GENERATOR=VS201264 -C Release -V -O hdf518.log      ###
+### ctest -S HDF5config.cmake,BUILD_GENERATOR=VS201264 -C Release -V -O hdf519.log        ###
 #############################################################################################
 
 cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
@@ -672,15 +672,15 @@ cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
 #     NO_MAC_FORTRAN  - Yes to be SHARED on a Mac
 ##############################################################################
 
-set(CTEST_SOURCE_VERSION 1.8.16)
+set(CTEST_SOURCE_VERSION 1.9)
 set(CTEST_SOURCE_VERSEXT "")
 
 ##############################################################################
 # handle input parameters to script.
 #BUILD_GENERATOR - which CMake generator to use, required
-#INSTALLDIR - HDF5-1.8 root folder
+#INSTALLDIR - HDF5-1.9 root folder
 #CTEST_BUILD_CONFIGURATION - Release, Debug, RelWithDebInfo
-#CTEST_SOURCE_NAME - name of source folder; HDF5-1.8
+#CTEST_SOURCE_NAME - name of source folder; HDF5-1.9
 #STATIC_LIBRARIES - Default is YES
 #FORTRAN_LIBRARIES - Default is NO
 #NO_MAC_FORTRAN - set to TRUE to allow shared libs on a Mac
@@ -698,7 +698,7 @@ endif()
 
 # build generator must be defined
 if(NOT DEFINED BUILD_GENERATOR)
-  message(FATAL_ERROR "BUILD_GENERATOR must be defined - Unix, VS2013, VS201364, VS2012, or VS201264")
+  message(FATAL_ERROR "BUILD_GENERATOR must be defined - Unix, VS2015, VS201564, VS2013, VS201364, VS2012, or VS201264")
 else()
   if(${BUILD_GENERATOR} STREQUAL "Unix")
     set(CTEST_CMAKE_GENERATOR "Unix Makefiles")
@@ -715,15 +715,15 @@ else()
   elseif(${BUILD_GENERATOR} STREQUAL "VS201264")
     set(CTEST_CMAKE_GENERATOR "Visual Studio 11 2012 Win64")
   else()
-    message(FATAL_ERROR "Invalid BUILD_GENERATOR must be - Unix, VS2013, VS201364, VS2012, or VS201264")
+    message(FATAL_ERROR "Invalid BUILD_GENERATOR must be - Unix, VS2015, VS201564, VS2013, VS201364, VS2012, or VS201264")
   endif()
 endif()
 
 if(NOT DEFINED INSTALLDIR)
-  if(WIN32)
-    set(INSTALLDIR "C:\\Program\ Files\\myhdf5")
-  else()
+  if(NOT WIN32)
     set(INSTALLDIR "/usr/local/myhdf5")
+  else()
+    set(INSTALLDIR "C:\\Program\ Files\\myhdf5")
   endif()
 endif()
 if(NOT DEFINED CTEST_BUILD_CONFIGURATION)
@@ -800,7 +800,7 @@ set(MODEL "Experimental")
 #set(LOCAL_NO_PACKAGE "TRUE")
 #####       Following controls source update                  #####
 #set(LOCAL_UPDATE "TRUE")
-set(REPOSITORY_URL "http://svn.hdfgroup.uiuc.edu/hdf5/branches/hdf5_1_8_16")
+set(REPOSITORY_URL "http://svn.hdfgroup.uiuc.edu/hdf5/trunk")
 #uncomment to use a compressed source file: *.tar on linux or mac *.zip on windows
 #set(CTEST_USE_TAR_SOURCE "${CTEST_SOURCE_VERSION}${CTEST_SOURCE_VERSEXT}")
 ###################################################################
@@ -835,12 +835,8 @@ set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ALLOW_EXTERNAL_SUPPORT:STRING
 ####      fortran       ####
 if(${FORTRANLIBRARIES})
   set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=ON")
-  ### enable Fortran 2003 depends on HDF5_BUILD_FORTRAN
-  set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_F2003:BOOL=ON")
 else()
   set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF")
-  ### enable Fortran 2003 depends on HDF5_BUILD_FORTRAN
-  set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_F2003:BOOL=OFF")
 endif()
 
 ### disable test program builds
diff --git a/release_docs/INSTALL_Cygwin.txt b/release_docs/INSTALL_Cygwin.txt
index 4c92e41..26d3cb9 100644
--- a/release_docs/INSTALL_Cygwin.txt
+++ b/release_docs/INSTALL_Cygwin.txt
@@ -259,6 +259,11 @@ Build, Test and Install HDF5 on Cygwin
    dt_arith tests may fail due to the use of fork. This is a known issue
    with cygwin on Windows.
 
+   "make check" fails when building shared lib files is enabled.  The default
+   on Cygwin has been changed to disable shared.  It can be enabled with
+   the --enable-shared configure option but is likely to fail "make check" 
+   with GCC compilers.
+
 -----------------------------------------------------------------------
 
 Need Further assistance, email help at hdfgroup.org
diff --git a/release_docs/INSTALL_Windows.txt b/release_docs/INSTALL_Windows.txt
index 7873709..7af2571 100644
--- a/release_docs/INSTALL_Windows.txt
+++ b/release_docs/INSTALL_Windows.txt
@@ -9,8 +9,10 @@ We now recommend that users build, test and install HDF5 using CMake.
 Instructions for building and testing HDF5 using CMake can be found in the
 INSTALL_CMake.txt file found in this folder.
 
-For instructions of building and testing an application with HDF5, see 
+For instructions of building and testing an application with HDF5, see
 USING_HDF5_CMake.txt file found in this folder.
 
 Users who want to build and run an application with HDF5 in Visual Studio
-without using CMake should consult the USING_HDF5_VS.txt file.
+without using CMake should consult the USING_HDF5_VS.txt file. Building
+applications with the dynamic/shared hdf5 libraries requires that the
+"H5_BUILT_AS_DYNAMIC_LIB" compile definition be used.
diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt
index 9b70b8b..d441d48 100644
--- a/release_docs/RELEASE.txt
+++ b/release_docs/RELEASE.txt
@@ -1,405 +1,101 @@
-HDF5 version 1.8.16 released on 2015-11-10
+HDF5 version 1.10.0-alpha0 released on 2015-12-29
 ================================================================================
 
-INTRODUCTION
-============
-
-This document describes the differences between HDF5-1.8.15 and
-HDF5-1.8.16, and contains information on the platforms tested and
-known problems in HDF5-1.8.16.
-For more details, see the files HISTORY-1_0-1_8_0_rc3.txt
-and HISTORY-1_8.txt in the release_docs/ directory of the HDF5 source.
-
-Links to the HDF5 1.8.16 source code, documentation, and additional materials
-can be found on the HDF5 web page at:
-
-     http://www.hdfgroup.org/products/hdf5/
-
-The HDF5 1.8.16 release can be obtained from:
-
-     http://www.hdfgroup.org/HDF5/release/obtain5.html
 
-User documentation for 1.8.16 can be accessed directly at this location:
-
-     http://www.hdfgroup.org/HDF5/doc/
+INTRODUCTION
 
-New features in the HDF5-1.8.x release series, including brief general
-descriptions of some new and modified APIs, are described in the "What's New
-in 1.8.0?" document:
+This document describes the differences between HDF5-1.8.* and
+HDF5 1.10.0-alpha0 release, and contains information on the platforms
+tested and known problems in HDF5-1.10.0-alpha0.
 
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/WhatsNew180.html
 
-All new and modified APIs are listed in detail in the "HDF5 Software Changes
-from Release to Release" document, in the section "Release 1.8.16 (current
-release) versus Release 1.8.15":
+Links to HDF5 1.10.0-alpha* source code can be found on The HDF Group's
+development FTP server at the following location:
+     http://www.hdfgroup.org/HDF5/release/obtain5110.html
+User documentation be accessed directly at this location:
+     http://www.hdfgroup.org/HDF5/docNewFeatures/
+For more information, see the HDF5 home page:
 
-     http://www.hdfgroup.org/HDF5/doc/ADGuide/Changes.html
+    http://www.hdfgroup.org/HDF5/
 
 If you have any questions or comments, please send them to the HDF Help Desk:
 
-     help at hdfgroup.org
+    help at hdfgroup.org
 
 
 CONTENTS
-========
 
 - New Features
-- Support for New Platforms, Languages, and Compilers
-- Bug Fixes since HDF5-1.8.15
-- Supported Platforms
-- Supported Configuration Features Summary
+- Tested Configuration Features Summary
 - More Tested Platforms
 - Known Problems
 
 
 New Features
 ============
+This alpha0 release supports the following new features:
 
-    Configuration and Build
-    -------------
-    - The thread-safety + high-level library combination has been marked
-      as "unsupported" in the Autotools
-
-      The global lock used by the thread-safety feature has never been
-      raised to the high-level library level, making it possible that
-      the library state could change if a context switch were to occur in
-      a high-level library call. Because of this, the combination of
-      thread-safety and high-level library is officially unsupported by
-      The HDF Group.
-
-      In the past, although this combination has never been supported, this
-      was not enforced by the build systems. These changes will cause an
-      Autotools configure step to fail if --enable-threadsafe and
-      --enable-hl are combined unless additional options are specified.
-      Since the high-level library is built by default, this means that
-      these extra configuration options will need to be used any time
-      --enable-threadsafe is selected.
-
-      To build with --enable-threadsafe, either:
-
-      1) Use --disable-hl to disable the high-level library (recommended)
-
-      2) Use --enable-unsupported to build the high-level library with
-         the thread-safety feature.
-
-      (DER - 2015/09/10 HDFFV-8719)
-
-    - Using CMake now builds both static and shared libraries.
-
-      The CMake files have been updated to build both static and shared
-      libraries, with tools only built statically. The packaging of the
-      libraries and tools will include cmake-config files that allows
-      projects to choose either shared or static (default) libraries
-      to be found with the find_package command using the COMPONENTS
-      keyword and a list of components. The imported libraries will
-      include any interface specific settings and dependent libraries.
-
-      The default setting for BUILD_SHARED_LIBS has changed from OFF
-      to ON, which builds both static and shared libraries. The static
-      libraries are always built because of tools requirements.
-
-      (ADB - 2015/08/24 HDFFV-5881)
-
-    - Inline functions now correctly annotated with Autotools builds.
-
-      The method used to detect the appropriate inline markup scheme was
-      nonfunctional in Autotools builds. The Autotools have been modified
-      to correctly detect the compiler's inline markup symbol and apply it
-      to the source. Note that only a very small number of internal
-      functions are marked inline so this was not a very big change or
-      likely to significantly affect performance.
-
-      As a part of this change, the H5_inline symbol no longer appears in
-      H5pubconf.h.
-
-      (DER - 2015/08/13 HDFFV-9119, HDFFV-9421)
-
-    - Removed obsolete/unmaintained files from config/
-
-      Several files were removed from the config directory. These files
-      represent old operating systems, were no longer necessary, and/or
-      were no longer maintained. configure.ac was updated to reflect the
-      removed files.
-
-      Removed:
-
-        craynv
-        dec-flags
-        hpux11.23
-        ia64-linux-gnu
-        nec-superux14.1
-        sv1-cray
-        x86_64-redstorm-linux-gnu
-        powerpc-ibm-aix5.x
-
-      As a part of this work, a few lines that deal with locating the
-      sys/fpu.h header on SGI machines and some OSF/1 configure lines
-      were also removed. The Solaris config was also renamed to not have
-      a version number since the version number was ignored by configure
-      as it applies to all Solaris versions.
-
-      (DER - 2015/09/04 HDFFV-9116)
-
-    - Removed the FP_TO_INTEGER_OVERFLOW_WORKS macro/defines from the library
-
-      This was for working around bugs in the Cray X1 compiler, which is no
-      longer supported.
-
-    (DER - 2015/09/09 HDFFV-9191)
-
-    - Removed the H5_SW_ULONG_TO_FP_BOTTOM_BIT_WORKS and
-      H5_FP_TO_ULLONG_BOTTOM_BIT_WORKS symbols and associated code.
-
-      H5_SW_ULONG_TO_FP_BOTTOM_BIT_WORKS was a work-around on old 64-bit
-      SGI and Solaris systems.
-
-      H5_FP_TO_ULLONG_BOTTOM_BIT_WORKS was a work-around for old PGI
-      compilers on Linux.
-
-      Neither of these were used in any current library code and only appeared
-      in the dt_arith test.
-
-      (DER - 2015/09/09 HDFFV-9187)
-
-    - Removed CONVERT_DENORMAL_FLOAT symbol and associated code from the
-      library.
-
-      This was only set in configure files for Cray and NEC computers. These
-      config files no longer exist so there is no effect on currently
-      supported platforms.
-
-      (DER - 2015/09/09 HDFFV-9188)
-
-    - Removed _BSD_SOURCE and _DEFAULT_SOURCE from configure.ac
-
-      These are old BSD-compatibility symbols that are no longer needed by
-      the library.
-
-      (DER - 2015/09/10 HDFFV-9079)
-
-    - Removed HW_FP_TO_LLONG_NOT_WORKS symbol and associated code from the
-      library.
-
-      This was part of a work-around for the VS.NET 2003 compiler, which is
-      no longer supported.
-
-      (DER - 2015/09/10 HDFFV-9189)
-
-    - Removed the BAD_LOG2_CODE_GENERATED symbol and associated code from the
-      library.
-
-      This was an IRIX work-around.
-
-      (DER - 2015/09/11 HDFFV-9195)
-
-    - Decoupled shared object version numbers for wrapper libraries from the
-      shared object version number for the HDF5 library.  These will be
-      maintained on an individual basis according to the interface changes
-      specific to these wrapper libraries.
-
-      For HDF5 1.8.16 the shared object version numbers were changed from
-      10.0.1 to 10.1.0 for the HDF5 library due to added APIs. For the C++
-      wrapper library they were changed from 10.0.1 to 11.0.0 due to changes 
-      in existing APIs. For all other wrapper libraries the versions were 
-      changed from 10.0.1 to 10.0.2 because while the APIs had no changes
-      there have been changes in code that did not result in changes to their
-      interfaces.
-
-      (LRK - 2015/10/28)
-
-    Library
-    -------
+    Library:
+    --------
+    - Concurrent access to HDF5 file - Single Writer/ Multple Reader (SWMR)
 
-    - H5F_ACC_DEBUG flag for H5Fopen/create: functionality removed
+    The Single Writer/ Multiple Reader or SWMR feature enables users to read  
+    data concurrently while writing it. Communications between the processes 
+    and file locking are not required. The processes can run on the same or on different platforms, 
+    as long as they share a common file system that is POSIX compliant. 
+    For more information, see the Single-Writer/Multiple-Reader (SWMR) Documentation at  
+    https://www.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesSwmrDocs.html
 
-      The symbol was used to emit some extra debugging information
-      for HDF Group developers in the multi VFD. The underlying
-      functionality has been removed due to disuse. The symbol
-      remains defined since it was visible in H5Fpublic.h but it
-      has been set to zero and has no effect anywhere in the library.
+    - Virtual Dataset (VDS)
 
-      (DER - 2015-05-02, HDFFV-1074)
+    The VDS feature enables data to be accessed across HDF5 files using standard HDF5 objects 
+    such as groups and datasets without rewriting or rearranging the data. An HDF5 virtual 
+    dataset (VDS) is an HDF5 dataset that is composed of source HDF5 datasets in a predefined 
+    mapping. VDS can be used with the SWMR feature. For documentation check 
+    https://www.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesSwmrDocs.html
 
-    - New public API call: H5is_library_threadsafe()
+    - Persistent Free File Space Tracking
 
-      This API call indicates if the library was built with thread-
-      safety enabled.
+    Usage patterns when working with an HDF5 file sometimes result in wasted space within 
+    the file. This can also impair access times when working with the resulting files. 
+    The new file space management feature provides strategies for managing space in a file 
+    to improve performance in both of these areas. For more information see
+    http://www.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesFileSpaceMgmtDocs.html 
 
-      (DER - 2015-09-01, HDFFV-9496)
 
-    Parallel Library
-    ----------------
-    - None
-
-    Tools
-    -----
-    - None
-
-    High-Level APIs
-    ---------------
-    - None
-
-    Fortran API
-    -----------
-    - None
-
-
-    C++ API
-    -------
-    - Class H5::ObjCreatPropList is added for the object creation property
-      list class.
-
-      Class H5::ObjCreatPropList is derived from H5::PropList and is a
-      baseclass of H5::DSetCreatPropList.  Additional property list classes
-      will be derived from H5::ObjCreatPropList when they are added to the
-      library in future releases.
-
-      (BMR, 2015/10/13, Part of HDFFV-9169)
-
-    - New Wrappers for C Functions H5P[s/g]et_attr_phase_change and
-      H5P[s/g]et_attr_creation_order.
-
-      Wrappers were added to class H5::ObjCreatPropList for the C Functions
-      H5Pset_attr_phase_change:         H5::ObjCreatPropList::setAttrPhaseChange
-      H5Pget_attr_phase_change:         H5::ObjCreatPropList::getAttrPhaseChange
-      H5Pset_attr_creation_order:       H5::ObjCreatPropList::setAttrCrtOrder
-      H5Pget_attr_creation_order:       H5::ObjCreatPropList::getAttrCrtOrder
-
-      (BMR, 2015/10/13, Part of HDFFV-9167 and HDFFV-9169)
-
-
-Support for New Platforms, Languages, and Compilers
-===================================================
-    - Added VS2015 with Intel Fortran 16 to supported Windows 7 platforms
-
-
-Bug Fixes since HDF5-1.8.15
-===========================
-
-    Configuration
-    -------------
-
-    - CMake test for long long printf format improved
-
-      The CMake configuration test for determining the printf format string
-      for printing a long long integer was fixed. The test would crash
-      when executed with VS2015.
-
-      (ADB - 2015-10-21 HDFFV-9488)
-
-    Library
-    -------
-    - VS2015 removed global variable timezone
-
-      The usage of the global variable timezone was modified for VS2015 by
-      adding an alias to Windows builds.
-
-      (ADB - 2015-10-23 HDFFV-9550)
-
-    - Fix potential error in H5Iclear_type
-
-      If the ID type's close callback could close another ID of the same type,
-      H5Iclear_type could occasionally run into problems due to the inner
-      workings of the skip list package.  This could potentially cause an
-      error on library shutdown without calling H5Iclear_type directly.  This
-      issue has been fixed.
-
-      (NAF - 2015-08-12)
-
-    - Fix uninitialized memory in dataspace selection code
-
-      When creating a dataspace with H5Screate and setting the extent with
-      H5Sextent_copy, the selection offset was not initialized, potentially
-      causing invalid I/O.  There may be other cases where this happened.
-      Modified the library to always initialize the offset.
-
-      (NAF - 2015-09-08)
-
-    - Truncate file in H5Fflush() if EOA != EOF to avoid file
-      corruption in certain scenarios
-
-      In the following scenario, the resulting HDF5 file would be
-      incorrectly corrupted because the truncate operation
-      was at some point wrongly moved out of the flush operation:
-          - Create a new file with a single dataset.
-          - Write parts of the dataset (make sure that some values at
-            the end of the dataset are not initialized).
-          - Flush the file.
-          - Crash the program.
-          - Try to open the file with h5dump or h5debug, but the
-            resulting file is corrupted.
-
-      (MSC - 2015-06-15 HDFFV-9418)
-
-
-    Parallel Library
-    ----------------
-    -
-      (XYZ - YYYY/MM/DD HDFFV-####)
-
-    Performance
-    -------------
-    - None
-
-    Tools
-    -----
-    - VS2015 changed the default format for printing of exponents
-
-      VS2015 default format for exponents changed with the elimination
-      of the leading '0'. CMake now tests for the VS2015 compiler and
-      adjusts which reference files are used by tests.
-
-      (ADB - 2015-10-23 HDFFV-9550)
-
-    - Fixed h5repack with user-defined filters
-
-      h5repack would throw a buffer overrun exception on Windows when
-      parsing a user-defined filter ID of 5 digits. A local variable in
-      the parse routine was not of sufficient size.
-
-      (ADB - 2015/09/01 HDFFV-9515)
-
-    Fortran API
-    ------------
-    - None
-
-
-    C++ API
+    Tools:
     ------
-    - Removed memory leaks
-
-      The static global constant objects were changed to constant references
-      referencing dynamically allocated objects.  This ensures that the clean-up
-      process in the C++ library occurs before the termination of the C library
-      and prevents memory leaks because the previous global constants were not
-      properly deleted before the C library termination.
-
-      (BMR, 2015/10/13, HDFFV-9529)
-
-    - Fixed the problem about identifiers being closed prematurely.
-
-      The C++ library needs to increment the ID's reference counter when it is
-      duplicated in the form of C++ objects, but not when the ID is obtained
-      from a C function.  With this approach, both problems, prematurely
-      closing ID's and memory leaks due to ID's not being closed, should be
-      eliminated.
-
-      (BMR, 2015/10/15, HDFFV-7947)
-
+    - h5watch 
+    
+    Allows users to output new records appended to a dataset iunder SWMR access as it grows. 
+    The functionality is similar to the Unix user command "tail" with the follow option, which 
+    outputs appended data as the file grows. 
+    For more information see
+    http://www.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesSwmrDocs.html#Tools    
+
+    - h5format_convert
+    
+    The tool allows users to convert the indexing type of a chunked dataset made with 
+    a 1.10.x version of the HDF5 library when the latest file format is used to the 1.8.x 
+    version 1 B-tree indexing type. For example, datasets created using SWMR access, can be converted
+    to be accessed by the HDF5 1.18 library and tools. The tools doesn't rewrite raw data, but
+    HDF5 metadata only. 
 
     High-Level APIs:
     ------
-    - None
+    - H5DOappend
 
+    The function appends data to a dataset along a specified dimension.
 
-    Fortran High-Level APIs:
-    ------------------------
-    - None
+    Other important changes:
+    -----------------------
 
+    hid_t type was changed from 32-bit to a 64-bit value.
+    
+    Documentation
+    -------------
+    See http://www.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesSwmrDocs.html#Tools
 
-    Testing
-    -------
-    - None
 
 
 Supported Platforms
@@ -576,116 +272,7 @@ The following platforms are not supported but have been tested for this release.
 
 Known Problems
 ==============
-* On Windows platforms in debug configurations, the VFD flush1 tests will fail
-  with the split and multi VFD drivers. These tests will display a modal debug
-  dialog which must be answered or wait for the test timeout to expire.
-  (ADB - 2014/06/23 - HDFFV-8851)
-
-* CLANG compiler with the options -fcatch-undefined-behavior and -ftrapv
-  catches some undefined behavior in the alignment algorithm of the macro DETECT_I
-  in H5detect.c (Issue 8147).  Since the algorithm is trying to detect the alignment
-  of integers, ideally the flag -fcatch-undefined-behavior shouldn't to be used for
-  H5detect.c. In the future, we can separate flags for H5detect.c from the rest of
-  the library. (SLU - 2013/10/16)
-
-* Make provided by Solaris fails in "make check". Solaris users should use
-  gmake to build and install the HDF5 software. (AKC - 2013/10/08 - HDFFV-8534)
-
-* The C++ and FORTRAN bindings are not currently working on FreeBSD with the
-  native release 8.2 compilers (4.2.1), but are working with gcc 4.6 from the
-  ports (and probably gcc releases after that).
-  (QAK - 2012/10/19)
-
-* The following h5dump test case fails in BG/P machines (and potentially other
-  machines that use a command script to launch executables):
-
-   h5dump --no-compact-subset -d "AHFINDERDIRECT::ah_centroid_t[0] it=0 tl=0"
-     tno-subset.h5
-
-  This is due to the embedded spaces in the dataset name being interpreted
-  by the command script launcher as meta-characters, thus passing three
-  arguments to h5dump's -d flag. The command passes if run by hand, just
-  not via the test script.
-  (AKC - 2012/05/03)
-
-* The STDIO VFD does not work on some architectures, possibly due to 32/64
-  bit or large file issues.  The basic STDIO VFD test is known to fail on
-  64-bit SunOS 5.10 on SPARC when built with -m64 and 32-bit OS X/Darwin
-  10.7.0.  The STDIO VFD test has been disabled while we investigate and
-  a fix should appear in a future release.
-  (DER - 2011/10/14 - HDFFV-8235)
-
-* h5diff can report inconsistent results when comparing datasets of enum type
-  that contain invalid values.  This is due to how enum types are handled in
-  the library and will be addressed in a future release.
-  (DER - 2011/10/14 - HDFFV-7527)
-
-* The links test can fail under the stdio VFD due to some issues with external
-  links.  This will be investigated and fixed in a future release.
-  (DER - 2011/10/14 - HDFFV-7768)
-
-* After the shared library support was fixed for some bugs, it was discovered
-  that "make prefix=XXX install" no longer works for shared libraries. It
-  still works correctly for static libraries. Therefore, if you want to
-  install the HDF5 shared libraries in a location such as /usr/local/hdf5,
-  you need to specify the location via the --prefix option during configure
-  time. E.g, ./configure --prefix=/usr/local/hdf5 ...
-  (AKC - 2011/05/07 - HDFFV-7583)
-
-* The parallel test, t_shapesame, in testpar/, may run for a long time and may
-  be terminated by the alarm signal.  If that happens, one can increase the
-  alarm seconds (default is 1200 seconds = 20 minutes) by setting the
-  environment variable, $HDF5_ALARM_SECONDS, to a larger value such as 3600
-  (60 minutes).  Note that the t_shapesame test may fail in some systems
-  (see the "While working on the 1.8.6 release..." problem below).  If
-  it does, it will waste more time if $HDF5_ALARM_SECONDS is set
-  to a larger value.
-  (AKC - 2011/05/07)
-
-* Shared Fortran libraries are not quite working on AIX. While they are
-  generated when --enable-shared is specified, the Fortran and HL/Fortran
-  tests fail. HL and C++ shared libraries should now be working as intended,
-  however.
-  (MAM - 2011/04/20)
-
-* While working on the 1.8.6 release of HDF5, a bug was discovered that can
-  occur when reading from a dataset in parallel shortly after it has been
-  written to collectively. The issue was exposed by a new test in the parallel
-  HDF5 test suite, but had existed before that. We believe the problem lies with
-  certain MPI implementations and/or file systems.
-
-  We have provided a pure MPI test program, as well as a standalone HDF5
-  program, that can be used to determine if this is an issue on your system.
-  They should be run across multiple nodes with a varying number of processes.
-  These programs can be found at:
-  http://www.hdfgroup.org/ftp/HDF5/examples/known_problems/
-  (NAF - 2011/01/19)
-
-* All of the VFL drivers aren't backward compatible.  In H5FDpublic.h, the
-  structure H5FD_class_t changed in 1.8.  There is new parameter added to
-  get_eoa and set_eoa callback functions.  A new callback function
-  get_type_map was added in.  The public function H5FDrealloc was taken
-  out in 1.8.  The problem only happens when users define their own driver
-  for 1.6 and try to plug in 1.8 library.  Because there's only one user
-  complaining about it, we (Elena, Quincey, and I) decided to leave it as
-  it is (see bug report #1279).  Quincey will make a plan for 1.10.
-  (SLU - 2010/02/02)
-
-* The --enable-static-exec configure flag will only statically link libraries
-  if the static version of that library is present. If only the shared version
-  of a library exists (i.e., most system libraries on Solaris, AIX, and Mac,
-  for example, only have shared versions), the flag should still result in a
-  successful compilation, but note that the installed executables will not be
-  fully static. Thus, the only guarantee on these systems is that the
-  executable is statically linked with just the HDF5 library.
-  (MAM - 2009/11/04)
-
-* A dataset created or rewritten with a v1.6.3 library or after cannot be read
-  with the v1.6.2 library or before when the Fletcher32 EDC filter is enabled.
-  There was a bug in the calculation of the Fletcher32 checksum in the
-  library before v1.6.3; the checksum value was not consistent between big-
-  endian and little-endian systems.  This bug was fixed in Release 1.6.3.
-  However, after fixing the bug, the checksum value was no longer the same as
-  before on little-endian systems. Library releases after 1.6.4 can still read
-  datasets created or rewritten with an HDF5 library of v1.6.2 or before.
-  (SLU - 2005/06/30)
+WARNINGS: This section is under contsruction. It will be updated for the first HDF5 1.10.0-beta
+release. 
+
+
diff --git a/release_docs/USING_CMake_Examples.txt b/release_docs/USING_CMake_Examples.txt
index ae46877..12c499e 100644
--- a/release_docs/USING_CMake_Examples.txt
+++ b/release_docs/USING_CMake_Examples.txt
@@ -38,7 +38,7 @@ II. Building HDF5 Examples with CMake
 
 Files in the HDF5 install directory:
        HDF5Examples folder
-       HDF518_Examples.cmake
+       HDF5_Examples.cmake
 
 Default installation process:
        Create a directory to run the examples, i.e. \test_hdf5.
@@ -53,12 +53,12 @@ Default installation process:
            be the same as the value used with the -C command line option.
        The default build configuration is defined to build and use static libraries.
            Shared libraries can be used with the STATIC_LIBRARIES script option set to "NO".
-       Other options can be changed by editing the HDF518_Examples.cmake file.
+       Other options can be changed by editing the HDF5_Examples.cmake file.
 
        If the defaults are okay, execute from this directory:
-           ctest -S HDF518_Examples.cmake -C Release -V -O test.log
+           ctest -S HDF5_Examples.cmake -C Release -V -O test.log
        If the defaults need change, execute from this directory:
-           ctest -S HDF518_Examples.cmake,CTEST_SOURCE_NAME=MyExamples,INSTALLDIR=MyLocation -C Release -V -O test.log
+           ctest -S HDF5_Examples.cmake,CTEST_SOURCE_NAME=MyExamples,INSTALLDIR=MyLocation -C Release -V -O test.log
 
     When executed, the ctest script will save the results to the log file, test.log, as
     indicated by the ctest command. If you wish the to see more build and test information,
@@ -67,7 +67,7 @@ Default installation process:
 
 
 ========================================================================
-III. Other changes to the HDF518_Examples.cmake file
+III. Other changes to the HDF5_Examples.cmake file
 ========================================================================
 
 Line 45-48: uncomment to use a source tarball or zipfile;
diff --git a/release_docs/USING_HDF5_CMake.txt b/release_docs/USING_HDF5_CMake.txt
index 7c4a36f..2cdf798 100644
--- a/release_docs/USING_HDF5_CMake.txt
+++ b/release_docs/USING_HDF5_CMake.txt
@@ -215,18 +215,19 @@ environment variable.
 NOTE: this file is available at the HDF web site:
     http://www.hdfgroup.org/HDF5/release/cmakebuild.html
 
-    HDF518_Examples.cmake
+    HDF5_Examples.cmake
 
 
 
 ========================================================================
 ctest
 ========================================================================
-cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
 
-############################################################################
-# Usage:
-#     ctest -S HDF518_Examples.cmake,OPTION=VALUE -C Release -VV -O test.log
+cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
+###############################################################################################################
+# This script will build and run the examples from a folder
+# Execute from a command line:
+#     ctest -S HDF5_Examples.cmake,OPTION=VALUE -C Release -V -O test.log
 # where valid options for OPTION are:
 #     BUILD_GENERATOR - The cmake build generator:
 #            Unix    * Unix Makefiles
@@ -246,7 +247,7 @@ cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
 ##############################################################################
 # handle input parameters to script.
 #BUILD_GENERATOR - which CMake generator to use, required
-#INSTALLDIR - HDF5-1.8 root folder
+#INSTALLDIR - HDF5 root folder
 #CTEST_BUILD_CONFIGURATION - Release, Debug, RelWithDebInfo
 #CTEST_SOURCE_NAME - name of source folder; HDF4Examples
 #STATIC_LIBRARIES - Default is YES
@@ -311,7 +312,7 @@ endif()
 
 #TAR_SOURCE - name of tarfile
 #if(NOT DEFINED TAR_SOURCE)
-#  set(CTEST_USE_TAR_SOURCE "HDF5Examples-1.2.1-Source")
+#  set(CTEST_USE_TAR_SOURCE "HDF5Examples-1.10.1-Source")
 #endif()
 
 ###############################################################################################################
diff --git a/release_docs/USING_HDF5_VS.txt b/release_docs/USING_HDF5_VS.txt
index e07e933..146782a 100644
--- a/release_docs/USING_HDF5_VS.txt
+++ b/release_docs/USING_HDF5_VS.txt
@@ -9,41 +9,71 @@ These suggestions are for Visual Studio users.
 Instructions for building and testing HDF5 applications using CMake can
 be found in the USING_HDF5_CMake.txt file found in this folder.
 
-The following two sections are helpful if you choose to not use CMake to build
-your applications. Consult the Microsoft documentation for your product
-for more information.
+NOTE: Building applications with the dynamic/shared hdf5 libraries requires
+      that the "H5_BUILT_AS_DYNAMIC_LIB" compile definition be used.
+
+The following two sections are helpful if you do not use CMake to build
+your applications.
 
 ========================================================================
-Using Visual Studio with HDF5 Libraries
+Using Visual Studio 2010 with HDF5 Libraries built with Visual Studio 2010
 ========================================================================
 
-   1. The HDF5 binary must match with your Visual Studio version
+   1. Set up path for external libraries and headers
+
+      The path settings will need to be in the project property sheets per project.
+      Go to "Project" and select "Properties", find "Configuration Properties",
+      and then "VC++ Directories".
+
+      1.1 If you are building on 64-bit Windows, find the "Platform" dropdown
+          and select "x64".
+
+      1.2 Add the header path to the "Include Directories" setting.
+
+      1.3 Add the library path to the "Library Directories" setting.
+
+      1.4 Select Linker->Input and beginning with the
+          "Additional Dependencies" line, enter the library names. The
+          external libraries should be listed first, followed by the HDF5
+          library, and then optionally the HDF5 High Level, Fortran or C++
+          libraries. For example, to compile a C++ application, enter:
+
+          szip.lib zlib.lib hdf5.lib hdf5_cpp.lib
+
+
+==========================================================================
+Using Visual Studio 2008 with HDF5 Libraries built with Visual Studio 2008
+==========================================================================
 
    2. Set up the path for external libraries and headers
 
-      Follow the Microsoft guidelines for adding third-party libraries.
+      Invoke Microsoft Visual Studio and go to "Tools" and select "Options",
+      find "Projects", and then "VC++ Directories".
 
-      2.1 If you are building on 64-bit Windows, be sure the binary is
-          built for the your intended "Platform"; 64-bit or 32-bit.
+      2.1 If you are building on 64-bit Windows, find the "Platform" dropdown
+          and select "x64".
 
-      2.2 Add the header path (i.e. c:\Program Files\HDF_Group\HDF5\1.8.x\include)
-          to the included directories settings.
+      2.2 Find the box "Show directories for", choose "Include files", add the
+          header path (i.e. c:\Program Files\HDF_Group\HDF5\1.8.x\include)
+          to the included directories.
 
-      2.3 Add the library path (i.e. c:\Program Files\HDF_Group\HDF5\1.8.x\lib)
+      2.3 Find the box "Show directories for", choose "Library files", add the
+          library path (i.e. c:\Program Files\HDF_Group\HDF5\1.8.x\lib)
           to the library directories.
 
       2.4 If using Fortran libraries, you will also need to setup the path
           for the Intel Fortran compiler.
 
-      2.5 Enter the library names into the linker "Additional Dependencies" line.
-          The external libraries should be listed first, followed by the HDF5
+      2.5 Select Project->Properties->Linker->Input and beginning with the
+          "Additional Dependencies" line, enter the library names. The
+          external libraries should be listed first, followed by the HDF5
           library, and then optionally the HDF5 High Level, Fortran or C++
           libraries. For example, to compile a C++ application, enter:
 
           szip.lib zlib.lib hdf5.lib hdf5_cpp.lib
 
 ========================================================================
-Helpful Pointers
+3. Helpful Pointers
 ========================================================================
 
     3.1 FAQ
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 9fcb28d..0fbd32b 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -22,8 +22,8 @@ set (H5_HDRS
     ${HDF5_SRC_DIR}/hdf5.h
     ${HDF5_SRC_DIR}/H5api_adpt.h
     ${HDF5_SRC_DIR}/H5public.h
-    ${HDF5_SRC_DIR}/H5version.h
-    ${HDF5_SRC_DIR}/H5overflow.h
+    #${HDF5_SRC_DIR}/H5version.h
+    #${HDF5_SRC_DIR}/H5overflow.h
 )
 IDE_GENERATED_PROPERTIES ("H5" "${H5_HDRS}" "${H5_SRCS}" )
 
@@ -44,6 +44,8 @@ IDE_GENERATED_PROPERTIES ("H5A" "${H5A_HDRS}" "${H5A_SRCS}" )
 
 set (H5AC_SRCS
     ${HDF5_SRC_DIR}/H5AC.c
+    ${HDF5_SRC_DIR}/H5AClog.c
+    ${HDF5_SRC_DIR}/H5ACmpio.c
 )
 
 set (H5AC_HDRS
@@ -54,6 +56,17 @@ IDE_GENERATED_PROPERTIES ("H5AC" "${H5AC_HDRS}" "${H5AC_SRCS}" )
 
 set (H5B_SRCS
     ${HDF5_SRC_DIR}/H5B.c
+    ${HDF5_SRC_DIR}/H5Bcache.c
+    ${HDF5_SRC_DIR}/H5Bdbg.c
+)
+set (H5B_HDRS
+    ${HDF5_SRC_DIR}/H5Bpkg.h
+    ${HDF5_SRC_DIR}/H5Bpublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5B" "${H5B_HDRS}" "${H5B_SRCS}" )
+
+
+set (H5B2_SRCS
     ${HDF5_SRC_DIR}/H5B2.c
     ${HDF5_SRC_DIR}/H5B2cache.c
     ${HDF5_SRC_DIR}/H5B2dbg.c
@@ -61,36 +74,57 @@ set (H5B_SRCS
     ${HDF5_SRC_DIR}/H5B2int.c
     ${HDF5_SRC_DIR}/H5B2stat.c
     ${HDF5_SRC_DIR}/H5B2test.c
-    ${HDF5_SRC_DIR}/H5Bcache.c
-    ${HDF5_SRC_DIR}/H5Bdbg.c
 )
-
-set (H5B_HDRS
+set (H5B2_HDRS
     ${HDF5_SRC_DIR}/H5B2pkg.h
     ${HDF5_SRC_DIR}/H5B2public.h
-    ${HDF5_SRC_DIR}/H5Bpkg.h
-    ${HDF5_SRC_DIR}/H5Bpublic.h
 )
-IDE_GENERATED_PROPERTIES ("H5B" "${H5B_HDRS}" "${H5B_SRCS}" )
+IDE_GENERATED_PROPERTIES ("H5B2" "${H5B2_HDRS}" "${H5B2_SRCS}" )
+
+
+set (H5C_SRCS
+    ${HDF5_SRC_DIR}/H5C.c
+    ${HDF5_SRC_DIR}/H5Cmpio.c
+)
+set (H5C_HDRS
+    ${HDF5_SRC_DIR}/H5Cpkg.h
+    ${HDF5_SRC_DIR}/H5Cpublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5C" "${H5C_HDRS}" "${H5C_SRCS}" )
+
+
+set (H5CS_SRCS
+    ${HDF5_SRC_DIR}/H5CS.c
+)
+set (H5CS_HDRS
+)
+IDE_GENERATED_PROPERTIES ("H5CS" "${H5CS_HDRS}" "${H5CS_SRCS}" )
+
 
 set (H5D_SRCS
     ${HDF5_SRC_DIR}/H5D.c
-    ${HDF5_SRC_DIR}/H5Dcompact.c
     ${HDF5_SRC_DIR}/H5Dbtree.c
+    ${HDF5_SRC_DIR}/H5Dbtree2.c
     ${HDF5_SRC_DIR}/H5Dchunk.c
+    ${HDF5_SRC_DIR}/H5Dcompact.c
     ${HDF5_SRC_DIR}/H5Dcontig.c
     ${HDF5_SRC_DIR}/H5Ddbg.c
     ${HDF5_SRC_DIR}/H5Ddeprec.c
+    ${HDF5_SRC_DIR}/H5Dearray.c
     ${HDF5_SRC_DIR}/H5Defl.c
+    ${HDF5_SRC_DIR}/H5Dfarray.c
     ${HDF5_SRC_DIR}/H5Dfill.c
     ${HDF5_SRC_DIR}/H5Dint.c
     ${HDF5_SRC_DIR}/H5Dio.c
     ${HDF5_SRC_DIR}/H5Dlayout.c
     ${HDF5_SRC_DIR}/H5Dmpio.c
+    ${HDF5_SRC_DIR}/H5Dnone.c
     ${HDF5_SRC_DIR}/H5Doh.c
     ${HDF5_SRC_DIR}/H5Dscatgath.c
     ${HDF5_SRC_DIR}/H5Dselect.c
+    ${HDF5_SRC_DIR}/H5Dsingle.c
     ${HDF5_SRC_DIR}/H5Dtest.c
+    ${HDF5_SRC_DIR}/H5Dvirtual.c
 )
 
 set (H5D_HDRS
@@ -106,23 +140,44 @@ set (H5E_SRCS
 )
 
 set (H5E_HDRS
-    ${HDF5_SRC_DIR}/H5Edefin.h
-    ${HDF5_SRC_DIR}/H5Einit.h
+    #${HDF5_SRC_DIR}/H5Edefin.h
+    #${HDF5_SRC_DIR}/H5Einit.h
     ${HDF5_SRC_DIR}/H5Epkg.h
-    ${HDF5_SRC_DIR}/H5Epubgen.h
+    #${HDF5_SRC_DIR}/H5Epubgen.h
     ${HDF5_SRC_DIR}/H5Epublic.h
-    ${HDF5_SRC_DIR}/H5Eterm.h
+    #${HDF5_SRC_DIR}/H5Eterm.h
 )
 IDE_GENERATED_PROPERTIES ("H5E" "${H5E_HDRS}" "${H5E_SRCS}" )
 
+
+set (H5EA_SRCS
+    ${HDF5_SRC_DIR}/H5EA.c
+    ${HDF5_SRC_DIR}/H5EAcache.c
+    ${HDF5_SRC_DIR}/H5EAdbg.c
+    ${HDF5_SRC_DIR}/H5EAdblkpage.c
+    ${HDF5_SRC_DIR}/H5EAdblock.c
+    ${HDF5_SRC_DIR}/H5EAhdr.c
+    ${HDF5_SRC_DIR}/H5EAiblock.c
+    ${HDF5_SRC_DIR}/H5EAint.c
+    ${HDF5_SRC_DIR}/H5EAsblock.c
+    ${HDF5_SRC_DIR}/H5EAstat.c
+    ${HDF5_SRC_DIR}/H5EAtest.c
+)
+set (H5EA_HDRS
+    ${HDF5_SRC_DIR}/H5EApkg.h
+)
+IDE_GENERATED_PROPERTIES ("H5EA" "${H5EA_HDRS}" "${H5EA_SRCS}" )
+
+
 set (H5F_SRCS
     ${HDF5_SRC_DIR}/H5F.c
-    ${HDF5_SRC_DIR}/H5Fint.c
     ${HDF5_SRC_DIR}/H5Faccum.c
     ${HDF5_SRC_DIR}/H5Fcwfs.c
     ${HDF5_SRC_DIR}/H5Fdbg.c
+    ${HDF5_SRC_DIR}/H5Fdeprec.c
     ${HDF5_SRC_DIR}/H5Fefc.c
     ${HDF5_SRC_DIR}/H5Ffake.c
+    ${HDF5_SRC_DIR}/H5Fint.c
     ${HDF5_SRC_DIR}/H5Fio.c
     ${HDF5_SRC_DIR}/H5Fmount.c
     ${HDF5_SRC_DIR}/H5Fmpi.c
@@ -139,6 +194,24 @@ set (H5F_HDRS
 )
 IDE_GENERATED_PROPERTIES ("H5F" "${H5F_HDRS}" "${H5F_SRCS}" )
 
+
+set (H5FA_SRCS
+    ${HDF5_SRC_DIR}/H5FA.c
+    ${HDF5_SRC_DIR}/H5FAcache.c
+    ${HDF5_SRC_DIR}/H5FAdbg.c
+    ${HDF5_SRC_DIR}/H5FAdblkpage.c
+    ${HDF5_SRC_DIR}/H5FAdblock.c
+    ${HDF5_SRC_DIR}/H5FAhdr.c
+    ${HDF5_SRC_DIR}/H5FAint.c
+    ${HDF5_SRC_DIR}/H5FAstat.c
+    ${HDF5_SRC_DIR}/H5FAtest.c
+)
+set (H5FA_HDRS
+    ${HDF5_SRC_DIR}/H5FApkg.h
+)
+IDE_GENERATED_PROPERTIES ("H5FA" "${H5FA_HDRS}" "${H5FA_SRCS}" )
+
+
 set (H5FD_SRCS
     ${HDF5_SRC_DIR}/H5FD.c
     ${HDF5_SRC_DIR}/H5FDcore.c
@@ -152,6 +225,8 @@ set (H5FD_SRCS
     ${HDF5_SRC_DIR}/H5FDsec2.c
     ${HDF5_SRC_DIR}/H5FDspace.c
     ${HDF5_SRC_DIR}/H5FDstdio.c
+    ${HDF5_SRC_DIR}/H5FDtest.c
+    ${HDF5_SRC_DIR}/H5FDwindows.c
 )
 
 set (H5FD_HDRS
@@ -166,13 +241,32 @@ set (H5FD_HDRS
     ${HDF5_SRC_DIR}/H5FDpublic.h
     ${HDF5_SRC_DIR}/H5FDsec2.h
     ${HDF5_SRC_DIR}/H5FDstdio.h
+    ${HDF5_SRC_DIR}/H5FDwindows.h
 )
 IDE_GENERATED_PROPERTIES ("H5FD" "${H5FD_HDRS}" "${H5FD_SRCS}" )
 
+
+set (H5FL_SRCS
+    ${HDF5_SRC_DIR}/H5FL.c
+)
+set (H5FL_HDRS
+)
+IDE_GENERATED_PROPERTIES ("H5FL" "${H5FL_HDRS}" "${H5FL_SRCS}" )
+
+
+set (H5FO_SRCS
+    ${HDF5_SRC_DIR}/H5FO.c
+)
+set (H5FO_HDRS
+)
+IDE_GENERATED_PROPERTIES ("H5FO" "${H5FO_HDRS}" "${H5FO_SRCS}" )
+
+
 set (H5FS_SRCS
     ${HDF5_SRC_DIR}/H5FS.c
     ${HDF5_SRC_DIR}/H5FScache.c
     ${HDF5_SRC_DIR}/H5FSdbg.c
+    ${HDF5_SRC_DIR}/H5FSint.c
     ${HDF5_SRC_DIR}/H5FSsection.c
     ${HDF5_SRC_DIR}/H5FSstat.c
     ${HDF5_SRC_DIR}/H5FStest.c
@@ -221,6 +315,7 @@ set (H5HF_SRCS
     ${HDF5_SRC_DIR}/H5HFhdr.c
     ${HDF5_SRC_DIR}/H5HFhuge.c
     ${HDF5_SRC_DIR}/H5HFiblock.c
+    ${HDF5_SRC_DIR}/H5HFint.c
     ${HDF5_SRC_DIR}/H5HFiter.c
     ${HDF5_SRC_DIR}/H5HFman.c
     ${HDF5_SRC_DIR}/H5HFsection.c
@@ -253,7 +348,9 @@ set (H5HL_SRCS
     ${HDF5_SRC_DIR}/H5HL.c
     ${HDF5_SRC_DIR}/H5HLcache.c
     ${HDF5_SRC_DIR}/H5HLdbg.c
+    ${HDF5_SRC_DIR}/H5HLdblk.c
     ${HDF5_SRC_DIR}/H5HLint.c
+    ${HDF5_SRC_DIR}/H5HLprfx.c
 )
 
 set (H5HL_HDRS
@@ -262,6 +359,37 @@ set (H5HL_HDRS
 )
 IDE_GENERATED_PROPERTIES ("H5HL" "${H5HL_HDRS}" "${H5HL_SRCS}" )
 
+
+set (H5HP_SRCS
+    ${HDF5_SRC_DIR}/H5HP.c
+)
+set (H5HP_HDRS
+)
+IDE_GENERATED_PROPERTIES ("H5HP" "${H5HP_HDRS}" "${H5HP_SRCS}" )
+
+
+set (H5I_SRCS
+    ${HDF5_SRC_DIR}/H5I.c
+    ${HDF5_SRC_DIR}/H5Itest.c
+)
+set (H5I_HDRS
+    ${HDF5_SRC_DIR}/H5Ipkg.h
+    ${HDF5_SRC_DIR}/H5Ipublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5I" "${H5I_HDRS}" "${H5I_SRCS}" )
+
+
+set (H5L_SRCS
+    ${HDF5_SRC_DIR}/H5L.c
+    ${HDF5_SRC_DIR}/H5Lexternal.c
+)
+set (H5L_HDRS
+    ${HDF5_SRC_DIR}/H5Lpkg.h
+    ${HDF5_SRC_DIR}/H5Lpublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5L" "${H5L_HDRS}" "${H5L_SRCS}" )
+
+
 set (H5MF_SRCS
     ${HDF5_SRC_DIR}/H5MF.c
     ${HDF5_SRC_DIR}/H5MFaggr.c
@@ -273,6 +401,16 @@ set (H5MF_HDRS
 )
 IDE_GENERATED_PROPERTIES ("H5MF" "${H5MF_HDRS}" "${H5MF_SRCS}" )
 
+
+set (H5MM_SRCS
+    ${HDF5_SRC_DIR}/H5MM.c
+)
+set (H5MM_HDRS
+    ${HDF5_SRC_DIR}/H5MMpublic.h
+)
+IDE_GENERATED_PROPERTIES ("H5MM" "${H5MM_HDRS}" "${H5MM_SRCS}" )
+
+
 set (H5MP_SRCS
     ${HDF5_SRC_DIR}/H5MP.c
     ${HDF5_SRC_DIR}/H5MPtest.c
@@ -300,6 +438,8 @@ set (H5O_SRCS
     ${HDF5_SRC_DIR}/H5Odtype.c
     ${HDF5_SRC_DIR}/H5Oefl.c
     ${HDF5_SRC_DIR}/H5Ofill.c
+    ${HDF5_SRC_DIR}/H5Oflush.c
+    ${HDF5_SRC_DIR}/H5Ofsinfo.c
     ${HDF5_SRC_DIR}/H5Oginfo.c
     ${HDF5_SRC_DIR}/H5Olayout.c
     ${HDF5_SRC_DIR}/H5Olinfo.c
@@ -309,6 +449,7 @@ set (H5O_SRCS
     ${HDF5_SRC_DIR}/H5Oname.c
     ${HDF5_SRC_DIR}/H5Onull.c
     ${HDF5_SRC_DIR}/H5Opline.c
+    ${HDF5_SRC_DIR}/H5Oproxy.c
     ${HDF5_SRC_DIR}/H5Orefcount.c
     ${HDF5_SRC_DIR}/H5Osdspace.c
     ${HDF5_SRC_DIR}/H5Oshared.c
@@ -332,6 +473,7 @@ set (H5P_SRCS
     ${HDF5_SRC_DIR}/H5Pdcpl.c
     ${HDF5_SRC_DIR}/H5Pdeprec.c
     ${HDF5_SRC_DIR}/H5Pdxpl.c
+    ${HDF5_SRC_DIR}/H5Pencdec.c
     ${HDF5_SRC_DIR}/H5Pfapl.c
     ${HDF5_SRC_DIR}/H5Pfcpl.c
     ${HDF5_SRC_DIR}/H5Pfmpl.c
@@ -373,14 +515,6 @@ set (H5R_HDRS
 IDE_GENERATED_PROPERTIES ("H5R" "${H5R_HDRS}" "${H5R_SRCS}" )
 
 
-set (H5RC_SRCS
-    ${HDF5_SRC_DIR}/H5RC.c
-)
-set (H5RC_HDRS
-)
-IDE_GENERATED_PROPERTIES ("H5RC" "${H5RC_HDRS}" "${H5RC_SRCS}" )
-
-
 set (H5RS_SRCS
     ${HDF5_SRC_DIR}/H5RS.c
 )
@@ -388,6 +522,7 @@ set (H5RS_HDRS
 )
 IDE_GENERATED_PROPERTIES ("H5RS" "${H5RS_HDRS}" "${H5RS_SRCS}" )
 
+
 set (H5S_SRCS
     ${HDF5_SRC_DIR}/H5S.c
     ${HDF5_SRC_DIR}/H5Sall.c
@@ -406,6 +541,15 @@ set (H5S_HDRS
 )
 IDE_GENERATED_PROPERTIES ("H5S" "${H5S_HDRS}" "${H5S_SRCS}" )
 
+
+set (H5SL_SRCS
+    ${HDF5_SRC_DIR}/H5SL.c
+)
+set (H5SL_HDRS
+)
+IDE_GENERATED_PROPERTIES ("H5SL" "${H5SL_HDRS}" "${H5SL_SRCS}" )
+
+
 set (H5SM_SRCS
     ${HDF5_SRC_DIR}/H5SM.c
     ${HDF5_SRC_DIR}/H5SMbtree2.c
@@ -419,6 +563,15 @@ set (H5SM_HDRS
 )
 IDE_GENERATED_PROPERTIES ("H5SM" "${H5SM_HDRS}" "${H5SM_SRCS}" )
 
+
+set (H5ST_SRCS
+    ${HDF5_SRC_DIR}/H5ST.c
+)
+set (H5ST_HDRS
+)
+IDE_GENERATED_PROPERTIES ("H5ST" "${H5ST_HDRS}" "${H5ST_SRCS}" )
+
+
 set (H5T_SRCS
     ${HDF5_SRC_DIR}/H5T.c
     ${HDF5_SRC_DIR}/H5Tarray.c
@@ -451,6 +604,39 @@ set (H5T_HDRS
 )
 IDE_GENERATED_PROPERTIES ("H5T" "${H5T_HDRS}" "${H5T_SRCS}" )
 
+
+set (H5TS_SRCS
+    ${HDF5_SRC_DIR}/H5TS.c
+)
+set (H5TS_HDRS
+)
+IDE_GENERATED_PROPERTIES ("H5TS" "${H5TS_HDRS}" "${H5TS_SRCS}" )
+
+
+set (H5UC_SRCS
+    ${HDF5_SRC_DIR}/H5UC.c
+)
+set (H5UC_HDRS
+)
+IDE_GENERATED_PROPERTIES ("H5UC" "${H5UC_HDRS}" "${H5UC_SRCS}" )
+
+
+set (H5VM_SRCS
+    ${HDF5_SRC_DIR}/H5VM.c
+)
+set (H5VM_HDRS
+)
+IDE_GENERATED_PROPERTIES ("H5VM" "${H5VM_HDRS}" "${H5VM_SRCS}" )
+
+
+set (H5WB_SRCS
+    ${HDF5_SRC_DIR}/H5WB.c
+)
+set (H5WB_HDRS
+)
+IDE_GENERATED_PROPERTIES ("H5WB" "${H5WB_HDRS}" "${H5WB_SRCS}" )
+
+
 set (H5Z_SRCS
     ${HDF5_SRC_DIR}/H5Z.c
     ${HDF5_SRC_DIR}/H5Zdeflate.c
@@ -478,46 +664,43 @@ set (common_SRCS
     ${H5A_SRCS}
     ${H5AC_SRCS}
     ${H5B_SRCS}
+    ${H5B2_SRCS}
+    ${H5C_SRCS}
+    ${H5CS_SRCS}
     ${H5D_SRCS}
     ${H5E_SRCS}
+    ${H5EA_SRCS}
     ${H5F_SRCS}
+    ${H5FA_SRCS}
     ${H5FD_SRCS}
+    ${H5FL_SRCS}
+    ${H5FO_SRCS}
     ${H5FS_SRCS}
     ${H5G_SRCS}
     ${H5HF_SRCS}
     ${H5HG_SRCS}
     ${H5HL_SRCS}
+    ${H5HP_SRCS}
+    ${H5I_SRCS}
+    ${H5L_SRCS}
     ${H5MF_SRCS}
+    ${H5MM_SRCS}
     ${H5MP_SRCS}
     ${H5O_SRCS}
     ${H5P_SRCS}
     ${H5PL_SRCS}
     ${H5R_SRCS}
-    ${H5RC_SRCS}
+    ${H5UC_SRCS}
     ${H5RS_SRCS}
     ${H5S_SRCS}
+    ${H5SL_SRCS}
     ${H5SM_SRCS}
+    ${H5ST_SRCS}
     ${H5T_SRCS}
+    ${H5TS_SRCS}
+    ${H5VM_SRCS}
+    ${H5WB_SRCS}
     ${H5Z_SRCS}
-    ${HDF5_SRC_DIR}/H5C.c
-    ${HDF5_SRC_DIR}/H5CS.c
-    ${HDF5_SRC_DIR}/H5FL.c
-    ${HDF5_SRC_DIR}/H5FO.c
-    ${HDF5_SRC_DIR}/H5HP.c
-    ${HDF5_SRC_DIR}/H5I.c
-    ${HDF5_SRC_DIR}/H5Itest.c
-    ${HDF5_SRC_DIR}/H5L.c
-    ${HDF5_SRC_DIR}/H5Lexternal.c
-    ${HDF5_SRC_DIR}/H5MM.c
-    ${HDF5_SRC_DIR}/H5R.c
-    ${HDF5_SRC_DIR}/H5RC.c
-    ${HDF5_SRC_DIR}/H5Rdeprec.c
-    ${HDF5_SRC_DIR}/H5RS.c
-    ${HDF5_SRC_DIR}/H5SL.c
-    ${HDF5_SRC_DIR}/H5ST.c
-    ${HDF5_SRC_DIR}/H5TS.c
-    ${HDF5_SRC_DIR}/H5VM.c
-    ${HDF5_SRC_DIR}/H5WB.c
 )
 
 set (H5_PUBLIC_HEADERS
@@ -525,16 +708,23 @@ set (H5_PUBLIC_HEADERS
     ${H5A_HDRS}
     ${H5AC_HDRS}
     ${H5B_HDRS}
+    ${H5B2_HDRS}
+    ${H5C_HDRS}
     ${H5D_HDRS}
     ${H5E_HDRS}
+    ${H5EA_HDRS}
     ${H5F_HDRS}
+    ${H5FA_HDRS}
     ${H5FD_HDRS}
     ${H5FS_HDRS}
     ${H5G_HDRS}
     ${H5HF_HDRS}
     ${H5HG_HDRS}
     ${H5HL_HDRS}
+    ${H5I_HDRS}
+    ${H5L_HDRS}
     ${H5MF_HDRS}
+    ${H5MM_HDRS}
     ${H5MP_HDRS}
     ${H5O_HDRS}
     ${H5P_HDRS}
@@ -544,34 +734,20 @@ set (H5_PUBLIC_HEADERS
     ${H5SM_HDRS}
     ${H5T_HDRS}
     ${H5Z_HDRS}
-    ${HDF5_SRC_DIR}/H5Cpkg.h
-    ${HDF5_SRC_DIR}/H5Cpublic.h
-    ${HDF5_SRC_DIR}/H5Ipkg.h
-    ${HDF5_SRC_DIR}/H5Ipublic.h
-    ${HDF5_SRC_DIR}/H5Lpkg.h
-    ${HDF5_SRC_DIR}/H5Lpublic.h
-    ${HDF5_SRC_DIR}/H5MMpublic.h
-    ${HDF5_SRC_DIR}/H5Rpkg.h
-    ${HDF5_SRC_DIR}/H5Rpublic.h
 )
 
-# --------------------------------------------------------------------
-# If we are compiling on Windows then add the windows specific files
-# --------------------------------------------------------------------
-if (WIN32)
-  set (common_SRCS  ${common_SRCS}  ${HDF5_SRC_DIR}/H5FDwindows.c)
-  set (H5_PUBLIC_HEADERS ${H5_PUBLIC_HEADERS}  ${HDF5_SRC_DIR}/H5FDwindows.h)
-endif (WIN32)
-
 set (H5_PRIVATE_HEADERS
     ${HDF5_SRC_DIR}/H5private.h
     ${HDF5_SRC_DIR}/H5Aprivate.h
     ${HDF5_SRC_DIR}/H5ACprivate.h
     ${HDF5_SRC_DIR}/H5B2private.h
     ${HDF5_SRC_DIR}/H5Bprivate.h
+    ${HDF5_SRC_DIR}/H5Cprivate.h
     ${HDF5_SRC_DIR}/H5CSprivate.h
     ${HDF5_SRC_DIR}/H5Dprivate.h
     ${HDF5_SRC_DIR}/H5Eprivate.h
+    ${HDF5_SRC_DIR}/H5EAprivate.h
+    ${HDF5_SRC_DIR}/H5FAprivate.h
     ${HDF5_SRC_DIR}/H5FDprivate.h
     ${HDF5_SRC_DIR}/H5Fprivate.h
     ${HDF5_SRC_DIR}/H5FLprivate.h
@@ -591,7 +767,7 @@ set (H5_PRIVATE_HEADERS
     ${HDF5_SRC_DIR}/H5Oprivate.h
     ${HDF5_SRC_DIR}/H5Pprivate.h
     ${HDF5_SRC_DIR}/H5PLprivate.h
-    ${HDF5_SRC_DIR}/H5RCprivate.h
+    ${HDF5_SRC_DIR}/H5UCprivate.h
     ${HDF5_SRC_DIR}/H5Rprivate.h
     ${HDF5_SRC_DIR}/H5RSprivate.h
     ${HDF5_SRC_DIR}/H5SLprivate.h
@@ -606,6 +782,38 @@ set (H5_PRIVATE_HEADERS
     ${HDF5_SRC_DIR}/H5win32defs.h
 )
 
+set (H5_GENERATED_HEADERS
+    ${HDF5_SRC_DIR}/H5Edefin.h
+    ${HDF5_SRC_DIR}/H5Einit.h
+    ${HDF5_SRC_DIR}/H5Epubgen.h
+    ${HDF5_SRC_DIR}/H5Eterm.h
+    ${HDF5_SRC_DIR}/H5version.h
+    ${HDF5_SRC_DIR}/H5overflow.h
+)
+
+option (HDF5_GENERATE_HEADERS "Rebuild Generated Files" ON)
+mark_as_advanced (HDF5_GENERATE_HEADERS)
+if (HDF5_GENERATE_HEADERS)
+  set_source_files_properties(${H5_GENERATED_HEADERS} PROPERTIES GENERATED TRUE)
+  find_package (Perl)
+  if (PERL_FOUND)
+    execute_process (
+        COMMAND ${PERL_EXECUTABLE} ${HDF5_SOURCE_DIR}/bin/make_err ${HDF5_SRC_DIR}/H5err.txt OUTPUT_VARIABLE SCRIPT_OUTPUT
+    )
+    message(STATUS ${SCRIPT_OUTPUT})
+    execute_process (
+        COMMAND ${PERL_EXECUTABLE} ${HDF5_SOURCE_DIR}/bin/make_vers ${HDF5_SRC_DIR}/H5vers.txt OUTPUT_VARIABLE SCRIPT_OUTPUT
+    )
+    message(STATUS ${SCRIPT_OUTPUT})
+    execute_process (
+        COMMAND ${PERL_EXECUTABLE} ${HDF5_SOURCE_DIR}/bin/make_overflow ${HDF5_SRC_DIR}/H5overflow.txt OUTPUT_VARIABLE SCRIPT_OUTPUT
+    )
+    message(STATUS ${SCRIPT_OUTPUT})
+  else (PERL_FOUND)
+    message (STATUS "Cannot generate headers - perl not found")
+  endif (PERL_FOUND)
+endif (HDF5_GENERATE_HEADERS)
+
 #-----------------------------------------------------------------------------
 # Setup the H5Detect utility which generates H5Tinit with platform
 # specific type checks inside
@@ -639,59 +847,12 @@ add_custom_command (
     WORKING_DIRECTORY ${HDF5_BINARY_DIR}
 )
 
-if (GENERATE_ERROR_HEADERS)
-  find_package (Perl)
-  if (PERL_FOUND)
-    add_custom_command (
-        OUTPUT ${HDF5_BINARY_DIR}/H5Edefin.h
-        PRE_BUILD
-        COMMAND ${PERL_EXECUTABLE}
-        ARGS ${HDF5_SOURCE_DIR}/bin/make_err ${HDF5_SOURCE_DIR}/src/H5err.txt
-        DEPENDS ${HDF5_SOURCE_DIR}/src/H5err.txt
-        COMMENT " Creating err header"
-    )
-
-    add_custom_command (
-        OUTPUT ${HDF5_BINARY_DIR}/H5version.h
-        PRE_BUILD
-        COMMAND ${PERL_EXECUTABLE}
-        ARGS ${HDF5_SOURCE_DIR}/bin/make_vers ${HDF5_SOURCE_DIR}/src/H5vers.txt
-        DEPENDS ${HDF5_SOURCE_DIR}/src/H5vers.txt
-       COMMENT " Creating API version macro"
-    )
-
-    add_custom_command (
-        OUTPUT ${HDF5_BINARY_DIR}/H5overflow.h
-        PRE_BUILD
-        COMMAND ${PERL_EXECUTABLE}
-        ARGS ${HDF5_SOURCE_DIR}/bin/make_overflow ${HDF5_SOURCE_DIR}/src/H5overflow.txt
-        DEPENDS ${HDF5_SOURCE_DIR}/src/H5overflow.txt
-        COMMENT " Creating Assignment overflow macro"
-    )
-
-    add_custom_target(run_perl_scripts ALL
-        DEPENDS ${HDF5_BINARY_DIR}/H5Edefin.h ${HDF5_BINARY_DIR}/H5version.h ${HDF5_BINARY_DIR}/H5overflow.h
-    )
-  else (PERL_FOUND)
-    message (STATUS "Cannot generate headers - perl not found")
-  endif (PERL_FOUND)
-endif (GENERATE_ERROR_HEADERS)
-
 #-----------------------------------------------------------------------------
 # Add H5Tinit source to build - generated by H5Detect/CMake at configure time
 #-----------------------------------------------------------------------------
-set (common_SRCS ${common_SRCS} ${HDF5_BINARY_DIR}/H5Tinit.c)
-set_source_files_properties (${HDF5_BINARY_DIR}/H5Tinit.c GENERATED)
-set (common_SRCS ${common_SRCS} ${HDF5_BINARY_DIR}/H5lib_settings.c)
-set_source_files_properties (${HDF5_BINARY_DIR}/H5lib_settings.c GENERATED)
-set (common_SRCS ${common_SRCS} ${HDF5_BINARY_DIR}/H5Edefin.h)
-set_source_files_properties (${HDF5_BINARY_DIR}/H5Edefin.h GENERATED)
-set (common_SRCS ${common_SRCS} ${HDF5_BINARY_DIR}/H5version.h)
-set_source_files_properties (${HDF5_BINARY_DIR}/H5version.h GENERATED)
-set (common_SRCS ${common_SRCS} ${HDF5_BINARY_DIR}/H5overflow.h)
-set_source_files_properties (${HDF5_BINARY_DIR}/H5overflow.h GENERATED)
-
-add_library (${HDF5_LIB_TARGET} STATIC ${common_SRCS} ${H5_PUBLIC_HEADERS} ${H5_PRIVATE_HEADERS})
+set (gen_SRCS ${HDF5_BINARY_DIR}/H5Tinit.c ${HDF5_BINARY_DIR}/H5lib_settings.c)
+
+add_library (${HDF5_LIB_TARGET} STATIC ${common_SRCS} ${gen_SRCS} ${H5_PUBLIC_HEADERS} ${H5_PRIVATE_HEADERS} ${H5_GENERATED_HEADERS})
 TARGET_C_PROPERTIES (${HDF5_LIB_TARGET} STATIC " " " ")
 target_link_libraries (${HDF5_LIB_TARGET} ${LINK_LIBS})
 if (NOT WIN32)
@@ -717,7 +878,25 @@ endif (HDF5_ENABLE_DEBUG_APIS)
 set (install_targets ${HDF5_LIB_TARGET})
 
 if (BUILD_SHARED_LIBS)
-  add_library (${HDF5_LIBSH_TARGET} SHARED ${common_SRCS} ${H5_PUBLIC_HEADERS} ${H5_PRIVATE_HEADERS})
+  file (MAKE_DIRECTORY "${HDF5_BINARY_DIR}/shared")
+  set (CMD $<TARGET_FILE:H5detect>)
+  add_custom_command (
+      OUTPUT ${HDF5_BINARY_DIR}/shared/H5Tinit.c
+      COMMAND ${CMD}
+      ARGS > ${HDF5_BINARY_DIR}/shared/H5Tinit.c
+      DEPENDS H5detect
+      WORKING_DIRECTORY ${HDF5_BINARY_DIR}/shared
+  )
+  set (CMD $<TARGET_FILE:H5make_libsettings>)
+  add_custom_command (
+      OUTPUT ${HDF5_BINARY_DIR}/shared/H5lib_settings.c
+      COMMAND ${CMD}
+      ARGS > ${HDF5_BINARY_DIR}/shared/H5lib_settings.c
+      DEPENDS H5make_libsettings
+      WORKING_DIRECTORY ${HDF5_BINARY_DIR}
+  )
+  set (shared_gen_SRCS ${HDF5_BINARY_DIR}/shared/H5Tinit.c ${HDF5_BINARY_DIR}/shared/H5lib_settings.c)
+  add_library (${HDF5_LIBSH_TARGET} SHARED ${common_SRCS} ${shared_gen_SRCS} ${H5_PUBLIC_HEADERS} ${H5_PRIVATE_HEADERS} ${H5_GENERATED_HEADERS})
   TARGET_C_PROPERTIES (${HDF5_LIBSH_TARGET} SHARED " " " ")
   target_link_libraries (${HDF5_LIBSH_TARGET} ${LINK_SHARED_LIBS})
   if (NOT WIN32)
@@ -727,7 +906,7 @@ if (BUILD_SHARED_LIBS)
     target_link_libraries (${HDF5_LIBSH_TARGET} ${MPI_C_LIBRARIES})
   endif (H5_HAVE_PARALLEL AND MPI_C_FOUND)
   set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_LIBSH_TARGET}")
-  H5_SET_LIB_OPTIONS (${HDF5_LIBSH_TARGET} ${HDF5_LIB_NAME} SHARED ${HDF5_PACKAGE_SOVERSION})
+  H5_SET_LIB_OPTIONS (${HDF5_LIBSH_TARGET} ${HDF5_LIB_NAME} SHARED)
   set_target_properties (${HDF5_LIBSH_TARGET} PROPERTIES
       FOLDER libraries
       COMPILE_DEFINITIONS "H5_BUILT_AS_DYNAMIC_LIB"
@@ -739,6 +918,7 @@ if (BUILD_SHARED_LIBS)
         APPEND PROPERTY COMPILE_DEFINITIONS
             "H5_HAVE_THREADSAFE"
     )
+    target_link_libraries (${HDF5_LIBSH_TARGET} Threads::Threads)
   endif (HDF5_ENABLE_THREADSAFE)
 
   if (HDF5_ENABLE_DEBUG_APIS)
@@ -757,6 +937,7 @@ if (NOT HDF5_INSTALL_NO_DEVELOPMENT)
   install (
       FILES
           ${H5_PUBLIC_HEADERS}
+          ${H5_GENERATED_HEADERS}
       DESTINATION
           ${HDF5_INSTALL_INCLUDE_DIR}
       COMPONENT
diff --git a/src/H5.c b/src/H5.c
index 8826879..33ac340 100644
--- a/src/H5.c
+++ b/src/H5.c
@@ -64,12 +64,17 @@ static int H5_mpi_delete_cb(MPI_Comm comm, int keyval, void *attr_val, int *flag
 /* Library Private Variables */
 /*****************************/
 
+/* HDF5 API Entered variable */
+/* (move to H5.c when new FUNC_ENTER macros in actual use -QAK) */
+hbool_t H5_api_entered_g = FALSE;
+
 /* statically initialize block for pthread_once call used in initializing */
 /* the first global mutex                                                 */
 #ifdef H5_HAVE_THREADSAFE
 H5_api_t H5_g;
 #else
 hbool_t H5_libinit_g = FALSE;   /* Library hasn't been initialized */
+hbool_t H5_libterm_g = FALSE;   /* Library isn't being shutdown */
 #endif
 
 #ifdef H5_HAVE_MPE
@@ -219,7 +224,7 @@ H5_init_library(void)
     H5_debug_mask(HDgetenv("HDF5_DEBUG"));
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value);
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5_init_library() */
 
 

@@ -257,6 +262,9 @@ H5_term_library(void)
     if(!(H5_INIT_GLOBAL))
 	goto done;
 
+    /* Indicate that the library is being shut down */
+    H5_TERM_GLOBAL = TRUE;
+
     /* Check if we should display error output */
     (void)H5Eget_auto2(H5E_DEFAULT, &func, NULL);
 
@@ -266,7 +274,7 @@ H5_term_library(void)
      * way that would necessitate some cleanup work in the other interface.
      */
 #define DOWN(F)								      \
-    (((n = H5##F##_term_interface()) && (at + 8) < sizeof loop)?	      \
+    (((n = H5##F##_term_package()) && (at + 8) < sizeof loop)?	      \
      (sprintf(loop + at, "%s%s", (at ? "," : ""), #F),			      \
       at += HDstrlen(loop + at),					      \
       n):                                                                     \
@@ -276,21 +284,52 @@ H5_term_library(void)
      n) : n))
 
     do {
-	pending = 0;
+        pending = 0;
+
         /* Try to organize these so the "higher" level components get shut
          * down before "lower" level components that they might rely on. -QAK
          */
-	pending += DOWN(R);
-	pending += DOWN(D);
-	pending += DOWN(L);
-	pending += DOWN(G);
-	pending += DOWN(A);
-	pending += DOWN(S);
-	pending += DOWN(T);
+        pending += DOWN(L);
+
+        /* Close the "top" of various interfaces (IDs, etc) but don't shut
+         *  down the whole interface yet, so that the object header messages
+         *  get serialized correctly for entries in the metadata cache and the
+         *  symbol table entry in the superblock gets serialized correctly, etc.
+         *  all of which is performed in the 'F' shutdown.
+         */
+        pending += DOWN(A_top);
+        pending += DOWN(D_top);
+        pending += DOWN(G_top);
+        pending += DOWN(R_top);
+        pending += DOWN(S_top);
+        pending += DOWN(T_top);
+
         /* Don't shut down the file code until objects in files are shut down */
         if(pending == 0)
             pending += DOWN(F);
 
+        /* Don't shut down the property list code until all objects that might
+         * use property lists are shut down */
+        if(pending == 0)
+            pending += DOWN(P);
+
+        /* Wait to shut down the "bottom" of various interfaces until the
+         *      files are closed, so pieces of the file can be serialized
+         *      correctly.
+         */
+        if(pending == 0) {
+            /* Shut down the "bottom" of the attribute, dataset, group,
+             *  reference, dataspace, and datatype interfaces, fully closing
+             *  out the interfaces now.
+             */
+            pending += DOWN(A);
+            pending += DOWN(D);
+            pending += DOWN(G);
+            pending += DOWN(R);
+            pending += DOWN(S);
+            pending += DOWN(T);
+        } /* end if */
+
         /* Don't shut down "low-level" components until "high-level" components
          * have successfully shut down.  This prevents property lists and IDs
          * from being closed "out from underneath" of the high-level objects
@@ -300,9 +339,7 @@ H5_term_library(void)
             pending += DOWN(AC);
             pending += DOWN(Z);
             pending += DOWN(FD);
-            pending += DOWN(P);
             pending += DOWN(PL);
-
             /* Don't shut down the error code until other APIs which use it are shut down */
             if(pending == 0)
                 pending += DOWN(E);
@@ -315,7 +352,7 @@ H5_term_library(void)
             /* Don't shut down the free list code until _everything_ else is down */
             if(pending == 0)
                 pending += DOWN(FL);
-        }
+        } /* end if */
     } while(pending && ntries++ < 100);
 
     if(pending) {
@@ -359,12 +396,17 @@ H5_term_library(void)
         (void)H5MM_free(tmp_open_stream);
     } /* end while */
 
+    /* Reset flag indicating that the library is being shut down */
+    H5_TERM_GLOBAL = FALSE;
+
     /* Mark library as closed */
     H5_INIT_GLOBAL = FALSE;
+
 done:
 #ifdef H5_HAVE_THREADSAFE
     H5_API_UNLOCK
 #endif /* H5_HAVE_THREADSAFE */
+
     return;
 } /* end H5_term_library() */
 
@@ -777,7 +819,7 @@ H5check_version(unsigned majnum, unsigned minnum, unsigned relnum)
 	HDsnprintf(lib_str, sizeof(lib_str), "HDF5 library version: %d.%d.%d",
 	    H5_VERS_MAJOR, H5_VERS_MINOR, H5_VERS_RELEASE);
 	if(*substr) {
-	    HDstrncat(lib_str, "-", 1);
+	    HDstrncat(lib_str, "-", (size_t)1);
 	    HDstrncat(lib_str, substr, (sizeof(lib_str) - HDstrlen(lib_str)) - 1);
 	} /* end if */
 	if (HDstrcmp(lib_str, H5_lib_vers_info_g)){
@@ -1009,6 +1051,9 @@ H5is_library_threadsafe(hbool_t *is_ts)
  *    NOTE:     The main purpose of this is for handling Win32 thread cleanup
  *              on thread/process detach.
  *
+ *              Only enabled when the shared Windows library is built with
+ *              thread safety enabled.
+ *
  * Return:      TRUE on success, FALSE on failure
  *
  *-------------------------------------------------------------------------
diff --git a/src/H5A.c b/src/H5A.c
index f1a6408..7d87505 100644
--- a/src/H5A.c
+++ b/src/H5A.c
@@ -17,11 +17,8 @@
 /* Module Setup */
 /****************/
 
-#define H5A_PACKAGE		/*suppress error about including H5Apkg	*/
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	*/
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5A_init_interface
+#include "H5Amodule.h"          /* This source code file is part of the H5A module */
+#define H5O_FRIEND		/*suppress error about including H5Opkg	*/
 
 
 /***********/
@@ -37,6 +34,7 @@
 #include "H5Sprivate.h"		/* Dataspace functions			*/
 #include "H5SMprivate.h"	/* Shared Object Header Messages	*/
 
+
 /****************/
 /* Local Macros */
 /****************/
@@ -68,6 +66,9 @@ typedef struct H5A_iter_cb1 {
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 
 /*****************************/
 /* Library Private Variables */
@@ -90,44 +91,21 @@ H5FL_BLK_DEFINE(attr_buf);
 /* Attribute ID class */
 static const H5I_class_t H5I_ATTR_CLS[1] = {{
     H5I_ATTR,                   /* ID class value */
-    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,                          /* Class flags */
     0,                          /* # of reserved IDs for class */
     (H5I_free_t)H5A_close       /* Callback routine for closing objects of this class */
 }};
 
+/* Flag indicating "top" of interface has been initialized */
+static hbool_t H5A_top_package_initialize_s = FALSE;
 
-

-/*-------------------------------------------------------------------------
- * Function:	H5A_init
- *
- * Purpose:	Initialize the interface from some other package.
- *
- * Return:	Success:	non-negative
- *		Failure:	negative
- *
- * Programmer:	Quincey Koziol
- *              Monday, November 27, 2006
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5A_init(void)
-{
-    herr_t ret_value = SUCCEED;   /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-    /* FUNC_ENTER() does all the work */
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5A_init() */
 
 

 /*--------------------------------------------------------------------------
 NAME
-   H5A_init_interface -- Initialize interface-specific information
+   H5A__init_package -- Initialize interface-specific information
 USAGE
-    herr_t H5A_init_interface()
+    herr_t H5A__init_package()
 
 RETURNS
     Non-negative on success/Negative on failure
@@ -135,12 +113,12 @@ DESCRIPTION
     Initializes any interface-specific data or routines.
 
 --------------------------------------------------------------------------*/
-static herr_t
-H5A_init_interface(void)
+herr_t
+H5A__init_package(void)
 {
     herr_t ret_value = SUCCEED;   /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /*
      * Create attribute ID type.
@@ -148,21 +126,25 @@ H5A_init_interface(void)
     if(H5I_register_type(H5I_ATTR_CLS) < 0)
         HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "unable to initialize interface")
 
+    /* Mark "top" of interface as initialized, too */
+    H5A_top_package_initialize_s = TRUE;
+
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5A_init_interface() */
+} /* end H5A__init_package() */
 
 

 /*--------------------------------------------------------------------------
  NAME
-    H5A_term_interface
+    H5A_top_term_package
  PURPOSE
     Terminate various H5A objects
  USAGE
-    void H5A_term_interface()
+    void H5A_top_term_package()
  RETURNS
  DESCRIPTION
-    Release any other resources allocated.
+    Release IDs for the atom group, deferring full interface shutdown
+    until later (in H5A_term_package).
  GLOBAL VARIABLES
  COMMENTS, BUGS, ASSUMPTIONS
      Can't report errors...
@@ -170,32 +152,68 @@ done:
  REVISION LOG
 --------------------------------------------------------------------------*/
 int
-H5A_term_interface(void)
+H5A_top_term_package(void)
 {
     int	n = 0;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    if(H5_interface_initialize_g) {
+    if(H5A_top_package_initialize_s) {
 	if(H5I_nmembers(H5I_ATTR) > 0) {
 	    (void)H5I_clear_type(H5I_ATTR, FALSE, FALSE);
             n++; /*H5I*/
 	} /* end if */
-        else {
-            /* Close deprecated interface */
-            n += H5A__term_deprec_interface();
 
-	    /* Destroy the attribute object id group */
-	    (void)H5I_dec_type_ref(H5I_ATTR);
-            n++; /*H5I*/
+        /* Mark closed */
+        if(0 == n)
+            H5A_top_package_initialize_s = FALSE;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* H5A_top_term_package() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5A_term_package
+ PURPOSE
+    Terminate various H5A objects
+ USAGE
+    void H5A_term_package()
+ RETURNS
+ DESCRIPTION
+    Release any other resources allocated.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+     Can't report errors...
+
+     Finishes shutting down the interface, after H5A_top_term_package()
+     is called
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+int
+H5A_term_package(void)
+{
+    int	n = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_PKG_INIT_VAR) {
+        /* Sanity checks */
+        HDassert(0 == H5I_nmembers(H5I_ATTR));
+        HDassert(FALSE == H5A_top_package_initialize_s);
+
+        /* Destroy the attribute object id group */
+        n += (H5I_dec_type_ref(H5I_ATTR) > 0);
 
-	    /* Mark closed */
-	    H5_interface_initialize_g = 0;
-	} /* end else */
+        /* Mark closed */
+        if(0 == n)
+            H5_PKG_INIT_VAR = FALSE;
     } /* end if */
 
     FUNC_LEAVE_NOAPI(n)
-} /* H5A_term_interface() */
+} /* H5A_term_package() */
 
 

 /*--------------------------------------------------------------------------
@@ -226,7 +244,6 @@ H5A_term_interface(void)
     develop.
 
 --------------------------------------------------------------------------*/
-/* ARGSUSED */
 hid_t
 H5Acreate2(hid_t loc_id, const char *attr_name, hid_t type_id, hid_t space_id,
     hid_t acpl_id, hid_t H5_ATTR_UNUSED aapl_id)
@@ -252,7 +269,7 @@ H5Acreate2(hid_t loc_id, const char *attr_name, hid_t type_id, hid_t space_id,
     if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
 	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a type")
     if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
 
     /* Go do the real work for attaching the attribute to the dataset */
     if(NULL == (attr = H5A_create(&loc, attr_name, type, space, acpl_id, H5AC_dxpl_id)))
@@ -301,7 +318,6 @@ done:
     develop.
 
 --------------------------------------------------------------------------*/
-/* ARGSUSED */
 hid_t
 H5Acreate_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
     hid_t type_id, hid_t space_id, hid_t acpl_id, hid_t H5_ATTR_UNUSED aapl_id,
@@ -335,7 +351,7 @@ H5Acreate_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
     if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
 	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a type")
     if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
 
     /* Set up opened group location to fill in */
     obj_loc.oloc = &obj_oloc;
@@ -407,7 +423,7 @@ H5Aopen(hid_t loc_id, const char *attr_name, hid_t H5_ATTR_UNUSED aapl_id)
         HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to load attribute info from object header for attribute: '%s'", attr_name)
 
     /* Finish initializing attribute */
-    if(H5A_open_common(&loc, attr) < 0)
+    if(H5A__open_common(&loc, attr) < 0)
         HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to initialize attribute")
 
     /* Register the attribute and get an ID for it */
@@ -595,7 +611,7 @@ H5Awrite(hid_t attr_id, hid_t dtype_id, const void *buf)
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "null attribute buffer")
 
     /* Go write the actual data to the attribute */
-    if((ret_value = H5A_write(attr, mem_type, buf, H5AC_dxpl_id)) < 0)
+    if((ret_value = H5A__write(attr, mem_type, buf, H5AC_dxpl_id)) < 0)
         HGOTO_ERROR(H5E_ATTR, H5E_WRITEERROR, FAIL, "unable to write attribute")
 
 done:
@@ -638,7 +654,7 @@ H5Aread(hid_t attr_id, hid_t dtype_id, void *buf)
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "null attribute buffer")
 
     /* Go write the actual data to the attribute */
-    if((ret_value = H5A_read(attr, mem_type, buf, H5AC_ind_dxpl_id)) < 0)
+    if((ret_value = H5A__read(attr, mem_type, buf, H5AC_ind_dxpl_id)) < 0)
         HGOTO_ERROR(H5E_ATTR, H5E_READERROR, FAIL, "unable to read attribute")
 
 done:
@@ -819,7 +835,7 @@ H5Aget_name(hid_t attr_id, size_t buf_size, char *buf)
 	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid buffer")
 
     /* Call private function in turn */
-    if(0 > (ret_value = H5A_get_name(my_attr, buf_size, buf)))
+    if(0 > (ret_value = H5A__get_name(my_attr, buf_size, buf)))
 	HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't get attribute name")
 
 done:
@@ -962,7 +978,7 @@ H5Aget_info(hid_t attr_id, H5A_info_t *ainfo)
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute")
 
     /* Get the attribute information */
-    if(H5A_get_info(attr, ainfo) < 0)
+    if(H5A__get_info(attr, ainfo) < 0)
 	HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to get attribute info")
 
 done:
@@ -1016,7 +1032,7 @@ H5Aget_info_by_name(hid_t loc_id, const char *obj_name, const char *attr_name,
         HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute")
 
     /* Get the attribute information */
-    if(H5A_get_info(attr, ainfo) < 0)
+    if(H5A__get_info(attr, ainfo) < 0)
 	HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to get attribute info")
 
 done:
@@ -1078,7 +1094,7 @@ H5Aget_info_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
         HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute")
 
     /* Get the attribute information */
-    if(H5A_get_info(attr, ainfo) < 0)
+    if(H5A__get_info(attr, ainfo) < 0)
 	HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to get attribute info")
 
 done:
diff --git a/src/H5AC.c b/src/H5AC.c
index 481d7a1..16b3880 100644
--- a/src/H5AC.c
+++ b/src/H5AC.c
@@ -27,185 +27,113 @@
  *-------------------------------------------------------------------------
  */
 
-#define H5AC_PACKAGE            /*suppress error about including H5ACpkg  */
-#define H5C_PACKAGE             /*suppress error about including H5Cpkg   */
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+/****************/
+/* Module Setup */
+/****************/
 
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5AC_init_interface
+#include "H5ACmodule.h"         /* This source code file is part of the H5AC module */
+#define H5C_FRIEND		        /* Suppress error about including H5Cpkg	        */
+#define H5F_FRIEND		        /* Suppress error about including H5Fpkg	        */
 
-#ifdef H5_HAVE_PARALLEL
-#include <mpi.h>
-#endif /* H5_HAVE_PARALLEL */
 
+/***********/
+/* Headers */
+/***********/
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5ACpkg.h"		/* Metadata cache			*/
-#include "H5Cpkg.h"             /* Cache                                */
-#include "H5Dprivate.h"		/* Dataset functions			*/
+#include "H5Cpkg.h"		        /* Cache                                */
 #include "H5Eprivate.h"		/* Error handling		  	*/
 #include "H5Fpkg.h"		/* Files				*/
 #include "H5FDprivate.h"	/* File drivers				*/
-#include "H5FLprivate.h"        /* Free Lists                           */
 #include "H5Iprivate.h"		/* IDs			  		*/
-#include "H5MMprivate.h"        /* Memory management                    */
 #include "H5Pprivate.h"         /* Property lists                       */
+#include "H5SLprivate.h"        /* Skip Lists                           */
 
 
-#ifdef H5_HAVE_PARALLEL
-
-/* Declare a free list to manage the H5AC_aux_t struct */
-H5FL_DEFINE_STATIC(H5AC_aux_t);
+/****************/
+/* Local Macros */
+/****************/
 
-#endif /* H5_HAVE_PARALLEL */
 
-/****************************************************************************
- *
- * structure H5AC_slist_entry_t
- *
- * The dirty entry list maintained via the d_slist_ptr field of H5AC_aux_t
- * and the cleaned entry list maintained via the c_slist_ptr field of
- * H5AC_aux_t are just lists of the file offsets of the dirty/cleaned
- * entries.  Unfortunately, the slist code makes us define a dynamically
- * allocated structure to store these offsets in.  This structure serves
- * that purpose.  Its fields are as follows:
- *
- * magic:       Unsigned 32 bit integer always set to
- *		H5AC__H5AC_SLIST_ENTRY_T_MAGIC.  This field is used to
- *		validate pointers to instances of H5AC_slist_entry_t.
- *
- * addr:	file offset of a metadata entry.  Entries are added to this
- *		list (if they aren't there already) when they are marked
- *		dirty in an unprotect, inserted, or moved.  They are
- *		removed when they appear in a clean entries broadcast.
- *
- ****************************************************************************/
+/******************/
+/* Local Typedefs */
+/******************/
 
-#ifdef H5_HAVE_PARALLEL
 
-#define H5AC__H5AC_SLIST_ENTRY_T_MAGIC        0x00D0A02
+/********************/
+/* Local Prototypes */
+/********************/
 
-typedef struct H5AC_slist_entry_t
-{
-    uint32_t    magic;
+static herr_t H5AC__check_if_write_permitted(const H5F_t *f,
+    hbool_t *write_permitted_ptr);
+static herr_t H5AC__ext_config_2_int_config(H5AC_cache_config_t *ext_conf_ptr,
+    H5C_auto_size_ctl_t *int_conf_ptr);
+#if H5AC_DO_TAGGING_SANITY_CHECKS
+static herr_t H5AC__verify_tag(hid_t dxpl_id, const H5AC_class_t * type);
+#endif /* H5AC_DO_TAGGING_SANITY_CHECKS */
 
-    haddr_t     addr;
-} H5AC_slist_entry_t;
 
-/* Declare a free list to manage the H5AC_slist_entry_t struct */
-H5FL_DEFINE_STATIC(H5AC_slist_entry_t);
+/*********************/
+/* Package Variables */
+/*********************/
 
-#endif /* H5_HAVE_PARALLEL */
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
 
 
-/*
- * Private file-scope variables.
- */
+/*****************************/
+/* Library Private Variables */
+/*****************************/
 
 /* Default dataset transfer property list for metadata I/O calls */
 /* (Collective set, "block before metadata write" set and "library internal" set) */
 /* (Global variable definition, declaration is in H5ACprivate.h also) */
-hid_t H5AC_dxpl_id=(-1);
+hid_t H5AC_dxpl_id = (-1);
 
 /* Dataset transfer property list for independent metadata I/O calls */
 /* (just "library internal" set - i.e. independent transfer mode) */
 /* (Global variable definition, declaration is in H5ACprivate.h also) */
 H5P_genplist_t *H5AC_ind_dxpl_g = NULL;
-hid_t H5AC_ind_dxpl_id=(-1);
-
-
-/*
- * Private file-scope function declarations:
- */
-
-static herr_t H5AC_check_if_write_permitted(const H5F_t *f,
-                                            hid_t dxpl_id,
-                                            hbool_t * write_permitted_ptr);
-
-static herr_t H5AC_ext_config_2_int_config(H5AC_cache_config_t * ext_conf_ptr,
-                                           H5C_auto_size_ctl_t * int_conf_ptr);
-
-#ifdef H5_HAVE_PARALLEL
-static herr_t H5AC_broadcast_candidate_list(H5AC_t * cache_ptr,
-                                            int * num_entries_ptr,
-                                            haddr_t ** haddr_buf_ptr_ptr);
-
-static herr_t H5AC_broadcast_clean_list(H5AC_t * cache_ptr);
-
-static herr_t H5AC_construct_candidate_list(H5AC_t * cache_ptr,
-                                            H5AC_aux_t * aux_ptr,
-                                            int sync_point_op);
-
-static herr_t H5AC_copy_candidate_list_to_buffer(H5AC_t * cache_ptr,
-                                        int * num_entries_ptr,
-                                        haddr_t ** haddr_buf_ptr_ptr,
-					size_t * MPI_Offset_buf_size_ptr,
-                                        MPI_Offset ** MPI_Offset_buf_ptr_ptr);
-
-static herr_t H5AC_flush_entries(H5F_t *f);
-
-static herr_t H5AC_log_deleted_entry(H5AC_t * cache_ptr,
-                                     H5AC_info_t * entry_ptr,
-                                     haddr_t addr,
-                                     unsigned int flags);
-
-static herr_t H5AC_log_dirtied_entry(const H5AC_info_t * entry_ptr,
-                                     haddr_t addr);
-
-static herr_t H5AC_log_flushed_entry(H5C_t * cache_ptr,
-                                     haddr_t addr,
-                                     hbool_t was_dirty,
-                                     unsigned flags,
-                                     int type_id);
-
-static herr_t H5AC_log_moved_entry(const H5F_t * f,
-                                     haddr_t old_addr,
-                                     haddr_t new_addr);
-
-static herr_t H5AC_log_inserted_entry(H5AC_t * cache_ptr,
-                                      H5AC_info_t * entry_ptr);
-
-static herr_t H5AC_propagate_and_apply_candidate_list(H5F_t  * f,
-                                                      hid_t    dxpl_id,
-                                                      H5AC_t * cache_ptr);
-
-static herr_t H5AC_propagate_flushed_and_still_clean_entries_list(H5F_t  * f,
-                                                           hid_t dxpl_id,
-                                                           H5AC_t * cache_ptr);
+hid_t H5AC_ind_dxpl_id = (-1);
 
-static herr_t H5AC_receive_candidate_list(H5AC_t * cache_ptr,
-                                          int * num_entries_ptr,
-                                          haddr_t ** haddr_buf_ptr_ptr);
 
-static herr_t H5AC_receive_and_apply_clean_list(H5F_t  * f,
-                                                hid_t    primary_dxpl_id,
-                                                hid_t    secondary_dxpl_id,
-                                                H5AC_t * cache_ptr);
+/*******************/
+/* Local Variables */
+/*******************/
 
-static herr_t H5AC_tidy_cache_0_lists(H5AC_t * cache_ptr,
-                                      int num_candidates,
-                                      haddr_t * candidates_list_ptr);
-
-herr_t H5AC_rsp__dist_md_write__flush(H5F_t *f, 
-                                      hid_t dxpl_id, 
-                                      H5AC_t * cache_ptr);
-
-herr_t H5AC_rsp__dist_md_write__flush_to_min_clean(H5F_t *f, 
-                                                   hid_t dxpl_id, 
-                                                   H5AC_t * cache_ptr);
-
-herr_t H5AC_rsp__p0_only__flush(H5F_t *f, 
-                                hid_t dxpl_id, 
-                                H5AC_t * cache_ptr);
-
-herr_t H5AC_rsp__p0_only__flush_to_min_clean(H5F_t *f, 
-                                             hid_t dxpl_id, 
-                                             H5AC_t * cache_ptr);
-
-static herr_t H5AC_run_sync_point(H5F_t *f, 
-                                  hid_t dxpl_id, 
-		                  int sync_point_op);
+static const char *H5AC_entry_type_names[H5AC_NTYPES] =
+{
+    "B-tree nodes",
+    "symbol table nodes",
+    "local heap prefixes",
+    "local heap data blocks",
+    "global heaps",
+    "object headers",
+    "object header chunks",
+    "object header proxies",
+    "v2 B-tree headers",
+    "v2 B-tree internal nodes",
+    "v2 B-tree leaf nodes",
+    "fractal heap headers",
+    "fractal heap direct blocks",
+    "fractal heap indirect blocks",
+    "free space headers",
+    "free space sections",
+    "shared OH message master table",
+    "shared OH message index",
+    "extensible array headers",
+    "extensible array index blocks",
+    "extensible array super blocks",
+    "extensible array data blocks",
+    "extensible array data block pages",
+    "fixed array headers",
+    "fixed array data block",
+    "fixed array data block pages",
+    "superblock",
+    "driver info",
+    "test entry"	/* for testing only -- not used for actual files */
+};
 
-#endif /* H5_HAVE_PARALLEL */
 
 

 /*-------------------------------------------------------------------------
@@ -214,7 +142,6 @@ static herr_t H5AC_run_sync_point(H5F_t *f,
  * Purpose:	Initialize the interface from some other layer.
  *
  * Return:	Success:	non-negative
- *
  *		Failure:	negative
  *
  * Programmer:	Quincey Koziol
@@ -225,18 +152,18 @@ static herr_t H5AC_run_sync_point(H5F_t *f,
 herr_t
 H5AC_init(void)
 {
-    herr_t ret_value=SUCCEED;   /* Return value */
+    herr_t ret_value = SUCCEED;   /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
     /* FUNC_ENTER() does all the work */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5AC_init() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5AC_init_interface
+ * Function:	H5AC__init_package
  *
  * Purpose:	Initialize interface-specific information
  *
@@ -247,8 +174,8 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5AC_init_interface(void)
+herr_t
+H5AC__init_package(void)
 {
 #ifdef H5_HAVE_PARALLEL
     H5P_genplist_t  *xfer_plist;    /* Dataset transfer property list object */
@@ -256,7 +183,7 @@ H5AC_init_interface(void)
 #endif /* H5_HAVE_PARALLEL */
     herr_t ret_value = SUCCEED;     /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
 #ifdef H5_HAVE_PARALLEL
     /* Sanity check */
@@ -273,8 +200,8 @@ H5AC_init_interface(void)
     /* Insert 'collective metadata write' property */
     coll_meta_write = 1;
     if(H5P_insert(xfer_plist, H5AC_COLLECTIVE_META_WRITE_NAME, H5AC_COLLECTIVE_META_WRITE_SIZE, &coll_meta_write,
-                  NULL, NULL, NULL, NULL, NULL, NULL) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't insert metadata cache dxpl property")
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTSET, FAIL, "can't insert metadata cache dxpl property")
 
     /* Get an ID for the independent H5AC dxpl */
     if((H5AC_ind_dxpl_id = H5P_create_id(H5P_CLS_DATASET_XFER_g, FALSE)) < 0)
@@ -287,8 +214,8 @@ H5AC_init_interface(void)
     /* Insert 'collective metadata write' property */
     coll_meta_write = 0;
     if(H5P_insert(H5AC_ind_dxpl_g, H5AC_COLLECTIVE_META_WRITE_NAME, H5AC_COLLECTIVE_META_WRITE_SIZE, &coll_meta_write,
-            NULL, NULL, NULL, NULL, NULL, NULL) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't insert metadata cache dxpl property")
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTSET, FAIL, "can't insert metadata cache dxpl property")
 #else /* H5_HAVE_PARALLEL */
     /* Sanity check */
     HDassert(H5P_LST_DATASET_XFER_ID_g!=(-1));
@@ -297,23 +224,22 @@ H5AC_init_interface(void)
     H5AC_ind_dxpl_id = H5P_DATASET_XFER_DEFAULT;
 
     /* Get the property list objects for the IDs */
-    if (NULL == (H5AC_ind_dxpl_g = (H5P_genplist_t *)H5I_object(H5AC_ind_dxpl_id)))
+    if(NULL == (H5AC_ind_dxpl_g = (H5P_genplist_t *)H5I_object(H5AC_ind_dxpl_id)))
         HGOTO_ERROR(H5E_CACHE, H5E_BADATOM, FAIL, "can't get property list object")
 #endif /* H5_HAVE_PARALLEL */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5AC_init_interface() */
+} /* end H5AC__init_package() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5AC_term_interface
+ * Function:	H5AC_term_package
  *
  * Purpose:	Terminate this interface.
  *
  * Return:	Success:	Positive if anything was done that might
  *				affect other interfaces; zero otherwise.
- *
  * 		Failure:	Negative.
  *
  * Programmer:	Quincey Koziol
@@ -322,66 +248,35 @@ done:
  *-------------------------------------------------------------------------
  */
 int
-H5AC_term_interface(void)
+H5AC_term_package(void)
 {
     int	n = 0;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    if (H5_interface_initialize_g) {
+    if(H5_PKG_INIT_VAR) {
 #ifdef H5_HAVE_PARALLEL
         if(H5AC_dxpl_id > 0 || H5AC_ind_dxpl_id > 0) {
             /* Indicate more work to do */
             n = 1; /* H5I */
 
             /* Close H5AC dxpl */
-            if(H5I_dec_ref(H5AC_dxpl_id) < 0 ||
-                    H5I_dec_ref(H5AC_ind_dxpl_id) < 0)
+            if(H5I_dec_ref(H5AC_dxpl_id) < 0 || H5I_dec_ref(H5AC_ind_dxpl_id) < 0)
                 H5E_clear_stack(NULL); /*ignore error*/
-            else {
-                /* Reset static IDs */
-                H5AC_dxpl_id = (-1);
-                H5AC_ind_dxpl_id = (-1);
-
-                /* Reset interface initialization flag */
-                H5_interface_initialize_g = 0;
-            } /* end else */
         } /* end if */
-        else
-#else /* H5_HAVE_PARALLEL */
-            /* Reset static IDs */
-            H5AC_dxpl_id=(-1);
-            H5AC_ind_dxpl_id=(-1);
 #endif /* H5_HAVE_PARALLEL */
-            /* Reset interface initialization flag */
-            H5_interface_initialize_g = 0;
+            
+        /* Reset static IDs */
+        H5AC_dxpl_id = (-1);
+        H5AC_ind_dxpl_id = (-1);
+
+        /* Reset interface initialization flag */
+        if(0 == n)
+            H5_PKG_INIT_VAR = FALSE;
     } /* end if */
 
     FUNC_LEAVE_NOAPI(n)
-} /* end H5AC_term_interface() */
-
-static const char * H5AC_entry_type_names[H5AC_NTYPES] =
-{
-    "B-tree nodes",
-    "symbol table nodes",
-    "local heap prefixes",
-    "local heap data blocks",
-    "global heaps",
-    "object headers",
-    "object header chunks",
-    "v2 B-tree headers",
-    "v2 B-tree internal nodes",
-    "v2 B-tree leaf nodes",
-    "fractal heap headers",
-    "fractal heap direct blocks",
-    "fractal heap indirect blocks",
-    "free space headers",
-    "free space sections",
-    "shared OH message master table",
-    "shared OH message index",
-    "superblock",
-    "test entry"	/* for testing only -- not used for actual files */
-};
+} /* end H5AC_term_package() */
 
 

 /*-------------------------------------------------------------------------
@@ -403,8 +298,7 @@ static const char * H5AC_entry_type_names[H5AC_NTYPES] =
  *-------------------------------------------------------------------------
  */
 herr_t
-H5AC_create(const H5F_t *f,
-            H5AC_cache_config_t *config_ptr)
+H5AC_create(const H5F_t *f, H5AC_cache_config_t *config_ptr)
 {
 #ifdef H5_HAVE_PARALLEL
     char 	 prefix[H5C__PREFIX_LEN] = "";
@@ -414,6 +308,7 @@ H5AC_create(const H5F_t *f,
 
     FUNC_ENTER_NOAPI(FAIL)
 
+    /* Check arguments */
     HDassert(f);
     HDassert(NULL == f->shared->cache);
     HDassert(config_ptr != NULL) ;
@@ -421,7 +316,7 @@ H5AC_create(const H5F_t *f,
     HDcompile_assert(H5C__MAX_NUM_TYPE_IDS == H5AC_NTYPES);
 
     if(H5AC_validate_config(config_ptr) < 0)
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Bad cache configuration")
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Bad cache configuration")
 
 #ifdef H5_HAVE_PARALLEL
     if(H5F_HAS_FEATURE(f, H5FD_FEAT_HAS_MPI)) {
@@ -459,11 +354,8 @@ H5AC_create(const H5F_t *f,
         aux_ptr->move_dirty_bytes_updates = 0;
 #endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
         aux_ptr->d_slist_ptr = NULL;
-        aux_ptr->d_slist_len = 0;
         aux_ptr->c_slist_ptr = NULL;
-        aux_ptr->c_slist_len = 0;
         aux_ptr->candidate_slist_ptr = NULL;
-        aux_ptr->candidate_slist_len = 0;
         aux_ptr->write_done = NULL;
         aux_ptr->sync_point_done = NULL;
 
@@ -484,66 +376,61 @@ H5AC_create(const H5F_t *f,
         if(NULL == (aux_ptr->candidate_slist_ptr = H5SL_create(H5SL_TYPE_HADDR, NULL)))
             HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "can't create candidate entry list.")
 
-        if(aux_ptr != NULL) {
-            if(aux_ptr->mpi_rank == 0) {
+        if(aux_ptr != NULL)
+            if(aux_ptr->mpi_rank == 0)
                 f->shared->cache = H5C_create(H5AC__DEFAULT_MAX_CACHE_SIZE,
-                                        H5AC__DEFAULT_MIN_CLEAN_SIZE,
-                                        (H5AC_NTYPES - 1),
-                                        (const char **)H5AC_entry_type_names,
-                                        H5AC_check_if_write_permitted,
-                                        TRUE,
-                                        H5AC_log_flushed_entry,
-                                        (void *)aux_ptr);
-            } else {
+                        H5AC__DEFAULT_MIN_CLEAN_SIZE, (H5AC_NTYPES - 1),
+                        (const char **)H5AC_entry_type_names,
+                        H5AC__check_if_write_permitted, TRUE, H5AC__log_flushed_entry,
+                        (void *)aux_ptr);
+            else
                 f->shared->cache = H5C_create(H5AC__DEFAULT_MAX_CACHE_SIZE,
-                                        H5AC__DEFAULT_MIN_CLEAN_SIZE,
-                                        (H5AC_NTYPES - 1),
-                                        (const char **)H5AC_entry_type_names,
-                                        H5AC_check_if_write_permitted,
-                                        TRUE,
-                                        NULL,
-                                        (void *)aux_ptr);
-            }
-        } else {
+                        H5AC__DEFAULT_MIN_CLEAN_SIZE, (H5AC_NTYPES - 1),
+                        (const char **)H5AC_entry_type_names,
+                        H5AC__check_if_write_permitted, TRUE, NULL,
+                        (void *)aux_ptr);
+        else
             f->shared->cache = H5C_create(H5AC__DEFAULT_MAX_CACHE_SIZE,
-                                        H5AC__DEFAULT_MIN_CLEAN_SIZE,
-                                        (H5AC_NTYPES - 1),
-                                        (const char **)H5AC_entry_type_names,
-                                        H5AC_check_if_write_permitted,
-                                        TRUE,
-                                        NULL,
-                                        NULL);
-        }
-    } else {
+                    H5AC__DEFAULT_MIN_CLEAN_SIZE, (H5AC_NTYPES - 1),
+                    (const char **)H5AC_entry_type_names,
+                    H5AC__check_if_write_permitted, TRUE, NULL, NULL);
+    } /* end if */
+    else {
 #endif /* H5_HAVE_PARALLEL */
         /* The default max cache size and min clean size will frequently be
          * overwritten shortly by the subsequent set resize config call.
          *                                             -- JRM
          */
         f->shared->cache = H5C_create(H5AC__DEFAULT_MAX_CACHE_SIZE,
-                                        H5AC__DEFAULT_MIN_CLEAN_SIZE,
-                                        (H5AC_NTYPES - 1),
-                                        (const char **)H5AC_entry_type_names,
-                                        H5AC_check_if_write_permitted,
-                                        TRUE,
-                                        NULL,
-                                        NULL);
+                H5AC__DEFAULT_MIN_CLEAN_SIZE, (H5AC_NTYPES - 1),
+                (const char **)H5AC_entry_type_names,
+                H5AC__check_if_write_permitted, TRUE, NULL, NULL);
 #ifdef H5_HAVE_PARALLEL
-    }
+    } /* end else */
 #endif /* H5_HAVE_PARALLEL */
 
     if(NULL == f->shared->cache)
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+	HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "memory allocation failed")
 
 #ifdef H5_HAVE_PARALLEL
-    if(aux_ptr != NULL) {
+    if(aux_ptr != NULL)
         if(H5C_set_prefix(f->shared->cache, prefix) < 0)
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "H5C_set_prefix() failed")
-    } /* end if */
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "H5C_set_prefix() failed")
 #endif /* H5_HAVE_PARALLEL */
 
+    /* Turn on metadata cache logging, if being used */
+    if(f->shared->use_mdc_logging) {
+        if(H5C_set_up_logging(f->shared->cache, f->shared->mdc_log_location, f->shared->start_mdc_log_on_access) < 0)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "mdc logging setup failed")
+
+        /* Write the log header regardless of current logging status */
+        if(H5AC__write_create_cache_log_msg(f->shared->cache) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+    } /* end if */
+
+    /* Set the cache parameters */
     if(H5AC_set_cache_auto_resize_config(f->shared->cache, config_ptr) < 0)
-        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "auto resize configuration failed")
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "auto resize configuration failed")
 
 done:
 #ifdef H5_HAVE_PARALLEL
@@ -552,13 +439,10 @@ done:
         if(aux_ptr != NULL) {
             if(aux_ptr->d_slist_ptr != NULL)
                 H5SL_close(aux_ptr->d_slist_ptr);
-
             if(aux_ptr->c_slist_ptr != NULL)
                 H5SL_close(aux_ptr->c_slist_ptr);
-
             if(aux_ptr->candidate_slist_ptr != NULL)
                 H5SL_close(aux_ptr->candidate_slist_ptr);
-
             aux_ptr->magic = 0;
             aux_ptr = H5FL_FREE(H5AC_aux_t, aux_ptr);
         } /* end if */
@@ -590,7 +474,7 @@ H5AC_dest(H5F_t *f, hid_t dxpl_id)
 #ifdef H5_HAVE_PARALLEL
     H5AC_aux_t * aux_ptr = NULL;
 #endif /* H5_HAVE_PARALLEL */
-    herr_t ret_value = SUCCEED;      /* Return value */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -603,24 +487,27 @@ H5AC_dest(H5F_t *f, hid_t dxpl_id)
     H5AC_stats(f);
 #endif /* H5AC_DUMP_STATS_ON_CLOSE */
 
-#if H5AC__TRACE_FILE_ENABLED
-    if(H5AC_close_trace_file(f->shared->cache) < 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_close_trace_file() failed.")
-#endif /* H5AC__TRACE_FILE_ENABLED */
+    if(f->shared->use_mdc_logging) {
+        /* Write the log footer regardless of current logging status */
+        if(H5AC__write_destroy_cache_log_msg(f->shared->cache) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+        if(H5C_tear_down_logging(f->shared->cache) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "mdc logging tear-down failed")
+    } /* end if */
 
 #ifdef H5_HAVE_PARALLEL
-    aux_ptr = (struct H5AC_aux_t *)(f->shared->cache->aux_ptr);
+    aux_ptr = H5C_get_aux_ptr(f->shared->cache);
     if(aux_ptr)
         /* Sanity check */
         HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
 
     /* Attempt to flush all entries from rank 0 & Bcast clean list to other ranks */
-    if(H5AC_flush_entries(f) < 0)
+    if(H5AC__flush_entries(f, dxpl_id) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush.")
 #endif /* H5_HAVE_PARALLEL */
 
     /* Destroy the cache */
-    if(H5C_dest(f, dxpl_id, H5AC_dxpl_id) < 0)
+    if(H5C_dest(f, dxpl_id) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_CANTFREE, FAIL, "can't destroy cache")
     f->shared->cache = NULL;
 
@@ -643,6 +530,51 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5AC_evict
+ *
+ * Purpose:     Evict all entries except the pinned entries
+ *		in the cache.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi; Dec 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_evict(H5F_t *f, hid_t dxpl_id)
+{
+    hbool_t log_enabled;             /* TRUE if logging was set up */
+    hbool_t curr_logging;            /* TRUE if currently logging */
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
+
+    /* Check if log messages are being emitted */
+    if(H5C_get_logging_status(f->shared->cache, &log_enabled, &curr_logging) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to get logging status")
+
+    /* Evict all entries in the cache except the pinned superblock entry */
+    if(H5C_evict(f, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFREE, FAIL, "can't evict cache")
+
+done:
+
+    /* If currently logging, generate a message */
+    if(curr_logging)
+        if(H5AC__write_evict_cache_log_msg(f->shared->cache, ret_value) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_evict() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    H5AC_expunge_entry
  *
  * Purpose:	Expunge the target entry from the cache without writing it
@@ -657,29 +589,31 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5AC_expunge_entry(H5F_t *f,
-		   hid_t dxpl_id,
-		   const H5AC_class_t *type,
-		   haddr_t addr,
-                   unsigned flags)
+H5AC_expunge_entry(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type,
+    haddr_t addr, unsigned flags)
 {
-    herr_t  result;
 #if H5AC__TRACE_FILE_ENABLED
     char                trace[128] = "";
     FILE *              trace_file_ptr = NULL;
 #endif /* H5AC__TRACE_FILE_ENABLED */
+    hbool_t log_enabled;              /* TRUE if logging was set up */
+    hbool_t curr_logging;             /* TRUE if currently logging */
     herr_t  ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
+    /* Sanity checks */
     HDassert(f);
     HDassert(f->shared);
     HDassert(f->shared->cache);
     HDassert(type);
-    HDassert(type->clear);
-    HDassert(type->dest);
+    HDassert(type->serialize);
     HDassert(H5F_addr_defined(addr));
 
+    /* Check if log messages are being emitted */
+    if(H5C_get_logging_status(f->shared->cache, &log_enabled, &curr_logging) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to get logging status")
+
 #if H5AC__TRACE_FILE_ENABLED
 {
     H5AC_t * cache_ptr = f->shared->cache;
@@ -688,41 +622,26 @@ H5AC_expunge_entry(H5F_t *f,
      * necessary in the trace file.  Write the return value to catch occult
      * errors.
      */
-    if ( ( cache_ptr != NULL ) &&
-         ( H5C_get_trace_file_ptr(cache_ptr, &trace_file_ptr) >= 0 ) &&
-         ( trace_file_ptr != NULL ) ) {
-
-        sprintf(trace, "H5AC_expunge_entry 0x%lx %d",
-	        (unsigned long)addr,
-		(int)(type->id));
-    }
+    if(NULL != (trace_file_ptr = H5C_get_trace_file_ptr(cache_ptr)))
+        sprintf(trace, "%s 0x%lx %d", FUNC, (unsigned long)addr, (int)(type->id));
 }
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
-    result = H5C_expunge_entry(f,
-		               dxpl_id,
-                               H5AC_dxpl_id,
-                               type,
-                               addr,
-                               flags);
-
-    if ( result < 0 ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, \
-                    "H5C_expunge_entry() failed.")
-    }
+    if(H5C_expunge_entry(f, dxpl_id, type, addr, flags) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, "H5C_expunge_entry() failed.")
 
 done:
-
 #if H5AC__TRACE_FILE_ENABLED
-    if ( trace_file_ptr != NULL ) {
-
+    if(trace_file_ptr != NULL)
 	HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value);
-    }
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    /* If currently logging, generate a message */
+    if(curr_logging)
+        if(H5AC__write_expunge_entry_log_msg(f->shared->cache, addr, type->id, ret_value) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
 
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_expunge_entry() */
 
 

@@ -753,34 +672,38 @@ H5AC_flush(H5F_t *f, hid_t dxpl_id)
     char 	  trace[128] = "";
     FILE *	  trace_file_ptr = NULL;
 #endif /* H5AC__TRACE_FILE_ENABLED */
-    herr_t	  ret_value = SUCCEED;      /* Return value */
+    hbool_t log_enabled;              /* TRUE if logging was set up */
+    hbool_t curr_logging;             /* TRUE if currently logging */
+    herr_t ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
+    /* Sanity checks */
     HDassert(f);
     HDassert(f->shared);
     HDassert(f->shared->cache);
 
+    /* Check if log messages are being emitted */
+    if(H5C_get_logging_status(f->shared->cache, &log_enabled, &curr_logging) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to get logging status")
+
 #if H5AC__TRACE_FILE_ENABLED
     /* For the flush, only the flags are really necessary in the trace file.
      * Write the result to catch occult errors.
      */
-    if((f != NULL) &&
-            (f->shared != NULL) &&
-            (f->shared->cache != NULL) &&
-            (H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0) &&
-            (trace_file_ptr != NULL))
-	sprintf(trace, "H5AC_flush");
+    if(NULL != (trace_file_ptr = H5C_get_trace_file_ptr(cache_ptr)))
+	sprintf(trace, "%s", FUNC);
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
 #ifdef H5_HAVE_PARALLEL
     /* Attempt to flush all entries from rank 0 & Bcast clean list to other ranks */
-    if(H5AC_flush_entries(f) < 0)
+    if(H5AC__flush_entries(f, dxpl_id) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush.")
 #endif /* H5_HAVE_PARALLEL */
 
     /* Flush the cache */
-    if(H5C_flush_cache(f, dxpl_id, H5AC_dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+    /* (Again, in parallel - writes out the superblock) */
+    if(H5C_flush_cache(f, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush cache.")
 
 done:
@@ -789,6 +712,11 @@ done:
         HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value);
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
+    /* If currently logging, generate a message */
+    if(curr_logging)
+        if(H5AC__write_flush_cache_log_msg(f->shared->cache, ret_value) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_flush() */
 
@@ -800,12 +728,12 @@ done:
  * 		cache contains an entry at that location.  If it does,
  * 		also determine whether the entry is dirty, protected,
  * 		pinned, etc. and return that information to the caller
- * 		in *status_ptr.
+ * 		in *status.
  *
  * 		If the specified entry doesn't exist, set *status_ptr
  * 		to zero.
  *
- * 		On error, the value of *status_ptr is undefined.
+ * 		On error, the value of *status is undefined.
  *
  * Return:      Non-negative on success/Negative on failure
  *
@@ -815,38 +743,43 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5AC_get_entry_status(const H5F_t *f,
-                      haddr_t    addr,
-		      unsigned * status_ptr)
+H5AC_get_entry_status(const H5F_t *f, haddr_t addr, unsigned *status)
 {
-    hbool_t	in_cache;
-    hbool_t	is_dirty;
-    hbool_t	is_protected;
-    hbool_t	is_pinned;
-    size_t	entry_size;
-    unsigned	status = 0;
+    hbool_t	in_cache;               /* Entry @ addr is in the cache */
+    hbool_t	is_dirty;               /* Entry @ addr is in the cache and dirty */
+    hbool_t	is_protected;           /* Entry @ addr is in the cache and protected */
+    hbool_t	is_pinned;              /* Entry @ addr is in the cache and pinned */
+    hbool_t	is_corked;
+    hbool_t	is_flush_dep_child;     /* Entry @ addr is in the cache and is a flush dependency child */
+    hbool_t	is_flush_dep_parent;    /* Entry @ addr is in the cache and is a flush dependency parent */
     herr_t      ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    if((f == NULL) || (!H5F_addr_defined(addr)) || (status_ptr == NULL))
+    if((f == NULL) || (!H5F_addr_defined(addr)) || (status == NULL))
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad param(s) on entry.")
 
-    if(H5C_get_entry_status(f, addr, &entry_size, &in_cache, &is_dirty,
-            &is_protected, &is_pinned) < 0)
+    if(H5C_get_entry_status(f, addr, NULL, &in_cache, &is_dirty,
+            &is_protected, &is_pinned, &is_corked, &is_flush_dep_parent, &is_flush_dep_child) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_get_entry_status() failed.")
 
     if(in_cache) {
-	status |= H5AC_ES__IN_CACHE;
+	*status |= H5AC_ES__IN_CACHE;
 	if(is_dirty)
-	    status |= H5AC_ES__IS_DIRTY;
+	    *status |= H5AC_ES__IS_DIRTY;
 	if(is_protected)
-	    status |= H5AC_ES__IS_PROTECTED;
+	    *status |= H5AC_ES__IS_PROTECTED;
 	if(is_pinned)
-	    status |= H5AC_ES__IS_PINNED;
+	    *status |= H5AC_ES__IS_PINNED;
+	if(is_corked)
+	    *status |= H5AC_ES__IS_CORKED;
+	if(is_flush_dep_parent)
+	    *status |= H5AC_ES__IS_FLUSH_DEP_PARENT;
+	if(is_flush_dep_child)
+	    *status |= H5AC_ES__IS_FLUSH_DEP_CHILD;
     } /* end if */
-
-    *status_ptr = status;
+    else
+        *status = 0;
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -869,26 +802,33 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5AC_insert_entry(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t addr, void *thing, unsigned int flags)
+H5AC_insert_entry(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t addr,
+    void *thing, unsigned int flags)
 {
 #if H5AC__TRACE_FILE_ENABLED
     char          	trace[128] = "";
     size_t              trace_entry_size = 0;
     FILE *        	trace_file_ptr = NULL;
 #endif /* H5AC__TRACE_FILE_ENABLED */
+    hbool_t log_enabled;             /* TRUE if logging was set up */
+    hbool_t curr_logging;            /* TRUE if currently logging */
     herr_t ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
+    /* Sanity checks */
     HDassert(f);
     HDassert(f->shared);
     HDassert(f->shared->cache);
     HDassert(type);
-    HDassert(type->flush);
-    HDassert(type->size);
+    HDassert(type->serialize);
     HDassert(H5F_addr_defined(addr));
     HDassert(thing);
 
+    /* Check if log messages are being emitted */
+    if(H5C_get_logging_status(f->shared->cache, &log_enabled, &curr_logging) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to get logging status")
+
     /* Check for invalid access request */
     if(0 == (H5F_INTENT(f) & H5F_ACC_RDWR))
 	HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "no write intent on file")
@@ -901,42 +841,38 @@ H5AC_insert_entry(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t add
      * Note that some data is not available right now -- put what we can
      * in the trace buffer now, and fill in the rest at the end.
      */
-    if ( ( f != NULL ) &&
-         ( f->shared != NULL ) &&
-         ( f->shared->cache != NULL ) &&
-         ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0) &&
-         ( trace_file_ptr != NULL ) ) {
-
-        sprintf(trace, "H5AC_insert_entry 0x%lx %d 0x%x",
-	        (unsigned long)addr,
-		type->id,
-		flags);
-    }
+    if(NULL != (trace_file_ptr = H5C_get_trace_file_ptr(cache_ptr)))
+        sprintf(trace, "%s 0x%lx %d 0x%x", FUNC, (unsigned long)addr, type->id,
+            flags);
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
+#if H5AC_DO_TAGGING_SANITY_CHECKS
+    if (!f->shared->cache->ignore_tags && (H5AC__verify_tag(dxpl_id, type) < 0))
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "Bad tag value")
+#endif /* H5AC_DO_TAGGING_SANITY_CHECKS */
+
     /* Insert entry into metadata cache */
-    if(H5C_insert_entry(f, dxpl_id, H5AC_dxpl_id, type, addr, thing, flags) < 0)
+    if(H5C_insert_entry(f, dxpl_id, type, addr, thing, flags) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, "H5C_insert_entry() failed")
 
 #if H5AC__TRACE_FILE_ENABLED
-    if(trace_file_ptr != NULL) {
+    if(trace_file_ptr != NULL)
         /* make note of the entry size */
         trace_entry_size = ((H5C_cache_entry_t *)thing)->size;
-    }
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
 #ifdef H5_HAVE_PARALLEL
 {
     H5AC_aux_t *aux_ptr;
 
-    if(NULL != (aux_ptr = (H5AC_aux_t *)f->shared->cache->aux_ptr)) {
+    if(NULL != (aux_ptr = H5C_get_aux_ptr(f->shared->cache))) {
         /* Log the new entry */
-        if(H5AC_log_inserted_entry(f->shared->cache, (H5AC_info_t *)thing) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, "H5AC_log_inserted_entry() failed")
+        if(H5AC__log_inserted_entry((H5AC_info_t *)thing) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, "H5AC__log_inserted_entry() failed")
 
         /* Check if we should try to flush */
         if(aux_ptr->dirty_bytes >= aux_ptr->dirty_bytes_threshold)
-            if(H5AC_run_sync_point(f, H5AC_dxpl_id, H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN) < 0)
+            if(H5AC__run_sync_point(f, H5AC_dxpl_id, H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN) < 0)
                 HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't run sync point.")
     } /* end if */
 }
@@ -944,12 +880,13 @@ H5AC_insert_entry(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t add
 
 done:
 #if H5AC__TRACE_FILE_ENABLED
-    if(trace_file_ptr != NULL) {
-	HDfprintf(trace_file_ptr, "%s %d %d\n", trace,
-                  (int)trace_entry_size,
-		  (int)ret_value);
-    }
+    if(trace_file_ptr != NULL)
+	HDfprintf(trace_file_ptr, "%s %d %d\n", trace, (int)trace_entry_size, (int)ret_value);
 #endif /* H5AC__TRACE_FILE_ENABLED */
+    /* If currently logging, generate a message */
+    if(curr_logging)
+        if(H5AC__write_insert_entry_log_msg(f->shared->cache, addr, type->id, flags, ((H5C_cache_entry_t *)thing)->size, ret_value) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_insert_entry() */
@@ -975,7 +912,11 @@ H5AC_mark_entry_dirty(void *thing)
     char          	trace[128] = "";
     FILE *        	trace_file_ptr = NULL;
 #endif /* H5AC__TRACE_FILE_ENABLED */
-    herr_t              ret_value = SUCCEED;    /* Return value */
+    hbool_t log_enabled;              /* TRUE if logging was set up */
+    hbool_t curr_logging;             /* TRUE if currently logging */
+    H5AC_info_t *entry_ptr = NULL;    /* Pointer to the cache entry */
+    H5C_t *cache_ptr = NULL;          /* Pointer to the entry's associated metadata cache */
+    herr_t ret_value = SUCCEED;       /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -987,25 +928,27 @@ H5AC_mark_entry_dirty(void *thing)
      * is really necessary in the trace file.  Write the result to catch
      * occult errors.
      */
-    if((H5C_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) &&
-            (NULL != trace_file_ptr))
+    if(NULL != (trace_file_ptr = H5C_get_trace_file_ptr_from_entry(thing)))
         sprintf(trace, "%s 0x%lx", FUNC,
 	        (unsigned long)(((H5C_cache_entry_t *)thing)->addr));
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
+    entry_ptr = (H5AC_info_t *)thing;
+    cache_ptr = entry_ptr->cache_ptr;
+
+    /* Check if log messages are being emitted */
+    if(H5C_get_logging_status(cache_ptr, &log_enabled, &curr_logging) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to get logging status")
+
 #ifdef H5_HAVE_PARALLEL
 {
-    H5AC_info_t *entry_ptr = (H5AC_info_t *)thing;
-    H5C_t *cache_ptr = entry_ptr->cache_ptr;
-
-    HDassert(cache_ptr);
-    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    H5AC_aux_t *aux_ptr;
 
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
     if((!entry_ptr->is_dirty) && (!entry_ptr->is_protected) &&
-             (entry_ptr->is_pinned) && (NULL != cache_ptr->aux_ptr)) {
-        if(H5AC_log_dirtied_entry(entry_ptr, entry_ptr->addr) < 0)
+             (entry_ptr->is_pinned) && (NULL != aux_ptr))
+        if(H5AC__log_dirtied_entry(entry_ptr) < 0)
             HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't log dirtied entry")
-    } /* end if */
 }
 #endif /* H5_HAVE_PARALLEL */
 
@@ -1018,6 +961,11 @@ done:
 	HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value);
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
+    /* If currently logging, generate a message */
+    if(curr_logging)
+        if(H5AC__write_mark_dirty_entry_log_msg(cache_ptr, entry_ptr, ret_value) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_mark_entry_dirty() */
 
@@ -1044,12 +992,15 @@ H5AC_move_entry(H5F_t *f, const H5AC_class_t *type, haddr_t old_addr, haddr_t ne
     FILE *        	trace_file_ptr = NULL;
 #endif /* H5AC__TRACE_FILE_ENABLED */
 #ifdef H5_HAVE_PARALLEL
-    H5AC_aux_t        * aux_ptr;
+    H5AC_aux_t        *aux_ptr;
 #endif /* H5_HAVE_PARALLEL */
-    herr_t ret_value=SUCCEED;      /* Return value */
+    hbool_t log_enabled;           /* TRUE if logging was set up */
+    hbool_t curr_logging;          /* TRUE if currently logging */
+    herr_t ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
+    /* Sanity checks */
     HDassert(f);
     HDassert(f->shared->cache);
     HDassert(type);
@@ -1057,30 +1008,25 @@ H5AC_move_entry(H5F_t *f, const H5AC_class_t *type, haddr_t old_addr, haddr_t ne
     HDassert(H5F_addr_defined(new_addr));
     HDassert(H5F_addr_ne(old_addr, new_addr));
 
+    /* Check if log messages are being emitted */
+    if(H5C_get_logging_status(f->shared->cache, &log_enabled, &curr_logging) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to get logging status")
+
 #if H5AC__TRACE_FILE_ENABLED
     /* For the move call, only the old addr and new addr are really
      * necessary in the trace file.  Include the type id so we don't have to
      * look it up.  Also write the result to catch occult errors.
      */
-    if ( ( f != NULL ) &&
-         ( f->shared != NULL ) &&
-         ( f->shared->cache != NULL ) &&
-         ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0) &&
-         ( trace_file_ptr != NULL ) ) {
-
-        sprintf(trace, "H5AC_move_entry 0x%lx 0x%lx %d",
-	        (unsigned long)old_addr,
-		(unsigned long)new_addr,
-		(int)(type->id));
-    }
+    if(NULL != (trace_file_ptr = H5C_get_trace_file_ptr(cache_ptr)))
+        sprintf(trace, "%s 0x%lx 0x%lx %d", FUNC, (unsigned long)old_addr,
+		(unsigned long)new_addr, (int)(type->id));
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
 #ifdef H5_HAVE_PARALLEL
     /* Log moving the entry */
-    if(NULL != (aux_ptr = (H5AC_aux_t *)f->shared->cache->aux_ptr)) {
-        if(H5AC_log_moved_entry(f, old_addr, new_addr) < 0)
+    if(NULL != (aux_ptr = H5C_get_aux_ptr(f->shared->cache)))
+        if(H5AC__log_moved_entry(f, old_addr, new_addr) < 0)
             HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "can't log moved entry")
-    } /* end if */
 #endif /* H5_HAVE_PARALLEL */
 
     if(H5C_move_entry(f->shared->cache, type, old_addr, new_addr) < 0)
@@ -1088,10 +1034,9 @@ H5AC_move_entry(H5F_t *f, const H5AC_class_t *type, haddr_t old_addr, haddr_t ne
 
 #ifdef H5_HAVE_PARALLEL
     /* Check if we should try to flush */
-    if(NULL != aux_ptr && aux_ptr->dirty_bytes >= aux_ptr->dirty_bytes_threshold) {
-        if(H5AC_run_sync_point(f, H5AC_dxpl_id, H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN) < 0)
+    if(NULL != aux_ptr && aux_ptr->dirty_bytes >= aux_ptr->dirty_bytes_threshold)
+        if(H5AC__run_sync_point(f, H5AC_dxpl_id, H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN) < 0)
             HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't run sync point.")
-    } /* end if */
 #endif /* H5_HAVE_PARALLEL */
 
 done:
@@ -1100,6 +1045,11 @@ done:
 	HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value);
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
+    /* If currently logging, generate a message */
+    if(curr_logging)
+        if(H5AC__write_move_entry_log_msg(f->shared->cache, old_addr, new_addr, type->id, ret_value) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_move_entry() */
 
@@ -1124,6 +1074,10 @@ H5AC_pin_protected_entry(void *thing)
     char        trace[128] = "";
     FILE *      trace_file_ptr = NULL;
 #endif /* H5AC__TRACE_FILE_ENABLED */
+    hbool_t log_enabled;                /* TRUE if logging was set up */
+    hbool_t curr_logging;               /* TRUE if currently logging */
+    H5AC_info_t *entry_ptr = NULL;      /* Pointer to the cache entry */
+    H5C_t *cache_ptr = NULL;            /* Pointer to the entry's associated metadata cache */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
@@ -1135,12 +1089,22 @@ H5AC_pin_protected_entry(void *thing)
     /* For the pin protected entry call, only the addr is really necessary
      * in the trace file.  Also write the result to catch occult errors.
      */
-    if((H5C_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) &&
-            (NULL != trace_file_ptr))
+    if(NULL != (trace_file_ptr = H5C_get_trace_file_ptr_from_entry(thing)))
         sprintf(trace, "%s 0x%lx", FUNC,
 	        (unsigned long)(((H5C_cache_entry_t *)thing)->addr));
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
+    entry_ptr = (H5AC_info_t *)thing;
+    cache_ptr = entry_ptr->cache_ptr;
+
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* Check if log messages are being emitted */
+    if(H5C_get_logging_status(cache_ptr, &log_enabled, &curr_logging) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to get logging status")
+
+    /* Pin entry */
     if(H5C_pin_protected_entry(thing) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, "can't pin entry")
 
@@ -1150,11 +1114,84 @@ done:
 	HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value);
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
+    /* If currently logging, generate a message */
+    if(curr_logging)
+        if(H5AC__write_pin_entry_log_msg(cache_ptr, entry_ptr, ret_value) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_pin_protected_entry() */
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5AC_create_flush_dependency()
+ *
+ * Purpose:	Create a flush dependency between two entries in the metadata
+ *              cache.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              3/24/09
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_create_flush_dependency(void * parent_thing, void * child_thing)
+{
+#if H5AC__TRACE_FILE_ENABLED
+    char        trace[128] = "";
+    FILE *      trace_file_ptr = NULL;
+#endif /* H5AC__TRACE_FILE_ENABLED */
+    hbool_t log_enabled;                /* TRUE if logging was set up */
+    hbool_t curr_logging;               /* TRUE if currently logging */
+    H5AC_info_t *entry_ptr = NULL;      /* Pointer to the cache entry */
+    H5C_t *cache_ptr = NULL;            /* Pointer to the entry's associated metadata cache */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(parent_thing);
+    HDassert(child_thing);
+
+#if H5AC__TRACE_FILE_ENABLED
+    if(NULL != (trace_file_ptr = H5C_get_trace_file_ptr_from_entry(parent_thing)))
+        sprintf(trace, "%s %lx %lx", FUNC,
+	        (unsigned long)(((H5C_cache_entry_t *)parent_thing)->addr),
+	        (unsigned long)(((H5C_cache_entry_t *)child_thing)->addr));
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    entry_ptr = (H5AC_info_t *)parent_thing;
+    cache_ptr = entry_ptr->cache_ptr;
+
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* Check if log messages are being emitted */
+    if(H5C_get_logging_status(cache_ptr, &log_enabled, &curr_logging) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to get logging status")
+
+    /* Create the flush dependency */
+    if(H5C_create_flush_dependency(parent_thing, child_thing) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTDEPEND, FAIL, "H5C_create_flush_dependency() failed.")
+
+done:
+#if H5AC__TRACE_FILE_ENABLED
+    if(trace_file_ptr != NULL)
+	HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value);
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    /* If currently logging, generate a message */
+    if(curr_logging)
+        if(H5AC__write_create_fd_log_msg(cache_ptr, (H5AC_info_t *)parent_thing, (H5AC_info_t *)child_thing, ret_value) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_create_flush_dependency() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    H5AC_protect
  *
  * Purpose:     If the target entry is not in the cache, load it.  If
@@ -1179,113 +1216,91 @@ done:
  *-------------------------------------------------------------------------
  */
 void *
-H5AC_protect(H5F_t *f,
-             hid_t dxpl_id,
-             const H5AC_class_t *type,
-             haddr_t addr,
-	     void *udata,
-             H5AC_protect_t rw)
+H5AC_protect(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t addr,
+    void *udata, unsigned flags)
 {
-    unsigned		protect_flags = H5C__NO_FLAGS_SET;
-    void *		thing = (void *)NULL;
 #if H5AC__TRACE_FILE_ENABLED
     char                trace[128] = "";
     size_t		trace_entry_size = 0;
     FILE *              trace_file_ptr = NULL;
 #endif /* H5AC__TRACE_FILE_ENABLED */
-    void *		ret_value;      /* Return value */
+    void *thing = NULL;                 /* Pointer to native data structure for entry */
+    hbool_t log_enabled;                /* TRUE if logging was set up */
+    hbool_t curr_logging;               /* TRUE if currently logging */
+    void *ret_value = NULL;             /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
-    /* check args */
+    /* Sanity check */
     HDassert(f);
     HDassert(f->shared);
     HDassert(f->shared->cache);
     HDassert(type);
-    HDassert(type->flush);
-    HDassert(type->load);
+    HDassert(type->serialize);
     HDassert(H5F_addr_defined(addr));
 
+    /* Check if log messages are being emitted */
+    if(H5C_get_logging_status(f->shared->cache, &log_enabled, &curr_logging) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, "unable to get logging status")
+
+    /* Check for unexpected flags -- H5C__FLUSH_COLLECTIVELY_FLAG
+     * only permitted in the parallel case.
+     */
+#ifdef H5_HAVE_PARALLEL
+    HDassert(0 == (flags & (unsigned)(~(H5C__READ_ONLY_FLAG | \
+                                        H5C__FLUSH_LAST_FLAG | \
+                                        H5C__FLUSH_COLLECTIVELY_FLAG))));
+#else /* H5_HAVE_PARALLEL */
+    HDassert(0 == (flags & (unsigned)(~(H5C__READ_ONLY_FLAG | \
+                                        H5C__FLUSH_LAST_FLAG))));
+#endif /* H5_HAVE_PARALLEL */
+
     /* Check for invalid access request */
-    if(0 == (H5F_INTENT(f) & H5F_ACC_RDWR) && rw == H5AC_WRITE)
+    if((0 == (H5F_INTENT(f) & H5F_ACC_RDWR)) &&  (0 == (flags & H5C__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, NULL, "no write intent on file")
 
 #if H5AC__TRACE_FILE_ENABLED
-    /* For the protect call, only the addr and type id is really necessary
-     * in the trace file.  Include the size of the entry protected as a
-     * sanity check.  Also indicate whether the call was successful to
-     * catch occult errors.
+    /* For the protect call, only the addr, size, type id, and flags are 
+     * necessary in the trace file.  Also indicate whether the call was 
+     * successful to catch occult errors.
      */
-    if ( ( f != NULL ) &&
-         ( f->shared != NULL ) &&
-         ( f->shared->cache != NULL ) &&
-         ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0) &&
-         ( trace_file_ptr != NULL ) ) {
-
-	const char * rw_string;
-
-        if ( rw == H5AC_WRITE ) {
-
-	    rw_string = "H5AC_WRITE";
-
-	} else if ( rw == H5AC_READ ) {
-
-	    rw_string = "H5AC_READ";
-
-	} else {
-
-	    rw_string = "???";
-	}
-
-        sprintf(trace, "H5AC_protect 0x%lx %d %s",
-	        (unsigned long)addr,
-		(int)(type->id),
-		rw_string);
-    }
+    if(NULL != (trace_file_ptr = H5C_get_trace_file_ptr(cache_ptr)))
+        sprintf(trace, "%s 0x%lx %d 0x%x", FUNC, (unsigned long)addr,
+		(int)(type->id), flags);
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
-    if ( rw == H5AC_READ ) {
-
-	protect_flags |= H5C__READ_ONLY_FLAG;
-    }
-
-    thing = H5C_protect(f,
-		        dxpl_id,
-                        H5AC_dxpl_id,
-			type,
-			addr,
-			udata,
-			protect_flags);
-
-    if ( thing == NULL ) {
+#if H5AC_DO_TAGGING_SANITY_CHECKS
+    if (!f->shared->cache->ignore_tags && (H5AC__verify_tag(dxpl_id, type) < 0))
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, NULL, "Bad tag value")
+#endif /* H5AC_DO_TAGGING_SANITY_CHECKS */
 
+    if(NULL == (thing = H5C_protect(f, dxpl_id, type, addr, udata, flags)))
         HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, "H5C_protect() failed.")
-    }
 
 #if H5AC__TRACE_FILE_ENABLED
-    if ( trace_file_ptr != NULL ) {
-
-        /* make note of the entry size */
+    if(trace_file_ptr != NULL)
+        /* Make note of the entry size */
         trace_entry_size = ((H5C_cache_entry_t *)thing)->size;
-    }
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
     /* Set return value */
     ret_value = thing;
 
 done:
-
 #if H5AC__TRACE_FILE_ENABLED
-    if ( trace_file_ptr != NULL ) {
-
-	HDfprintf(trace_file_ptr, "%s %d %d\n", trace,
-                  (int)trace_entry_size,
-                  (int)(ret_value != NULL));
-    }
+    if(trace_file_ptr != NULL)
+	HDfprintf(trace_file_ptr, "%s %d %d\n", trace, (int)trace_entry_size, (int)(ret_value != NULL));
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    /* If currently logging, generate a message */
+    if(curr_logging) {
+        herr_t fake_ret_value = (NULL == ret_value) ? FAIL : SUCCEED;
+
+        if(H5AC__write_protect_entry_log_msg(f->shared->cache, (H5AC_info_t *)thing, flags, fake_ret_value) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, "unable to emit log message")
+    } /* end if */
 
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_protect() */
 
 

@@ -1308,7 +1323,11 @@ H5AC_resize_entry(void *thing, size_t new_size)
     char          	trace[128] = "";
     FILE *        	trace_file_ptr = NULL;
 #endif /* H5AC__TRACE_FILE_ENABLED */
-    herr_t              ret_value = SUCCEED;    /* Return value */
+    hbool_t log_enabled;              /* TRUE if logging was set up */
+    hbool_t curr_logging;             /* TRUE if currently logging */
+    H5AC_info_t *entry_ptr = NULL;    /* Pointer to the cache entry */
+    H5C_t *cache_ptr = NULL;          /* Pointer to the entry's associated metadata cache */
+    herr_t ret_value = SUCCEED;       /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1320,28 +1339,34 @@ H5AC_resize_entry(void *thing, size_t new_size)
      * really necessary in the trace file. Write the result to catch
      * occult errors.
      */
-    if((H5C_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) &&
-            (NULL != trace_file_ptr))
+    if(NULL != (trace_file_ptr = H5C_get_trace_file_ptr_from_entry(thing)))
         sprintf(trace, "%s 0x%lx %d", FUNC,
 	        (unsigned long)(((H5C_cache_entry_t *)thing)->addr),
 		(int)new_size);
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
+    entry_ptr = (H5AC_info_t *)thing;
+    cache_ptr = entry_ptr->cache_ptr;
+
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* Check if log messages are being emitted */
+    if(H5C_get_logging_status(cache_ptr, &log_enabled, &curr_logging) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to get logging status")
+
+    /* Resize the entry */
     if(H5C_resize_entry(thing, new_size) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_CANTRESIZE, FAIL, "can't resize entry")
 
 #ifdef H5_HAVE_PARALLEL
 {
-    H5AC_info_t * entry_ptr = (H5AC_info_t *)thing;
-    H5C_t *cache_ptr = entry_ptr->cache_ptr;
-
-    HDassert(cache_ptr);
-    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    H5AC_aux_t *aux_ptr;
 
-    if((!entry_ptr->is_dirty) && (NULL != cache_ptr->aux_ptr)) {
-        if(H5AC_log_dirtied_entry(entry_ptr, entry_ptr->addr) < 0)
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    if((!entry_ptr->is_dirty) && (NULL != aux_ptr))
+        if(H5AC__log_dirtied_entry(entry_ptr) < 0)
             HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't log dirtied entry")
-    } /* end if */
 }
 #endif /* H5_HAVE_PARALLEL */
 
@@ -1351,6 +1376,11 @@ done:
 	HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value);
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
+    /* If currently logging, generate a message */
+    if(curr_logging)
+        if(H5AC__write_resize_entry_log_msg(cache_ptr, entry_ptr, new_size, ret_value) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_resize_entry() */
 
@@ -1375,6 +1405,10 @@ H5AC_unpin_entry(void *thing)
     char                trace[128] = "";
     FILE *              trace_file_ptr = NULL;
 #endif /* H5AC__TRACE_FILE_ENABLED */
+    hbool_t log_enabled;              /* TRUE if logging was set up */
+    hbool_t curr_logging;             /* TRUE if currently logging */
+    H5AC_info_t *entry_ptr = NULL;    /* Pointer to the cache entry */
+    H5C_t *cache_ptr = NULL;          /* Pointer to the entry's associated metadata cache */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
@@ -1386,12 +1420,22 @@ H5AC_unpin_entry(void *thing)
     /* For the unpin entry call, only the addr is really necessary
      * in the trace file.  Also write the result to catch occult errors.
      */
-    if((H5C_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) &&
-            (NULL != trace_file_ptr))
+    if(NULL != (trace_file_ptr = H5C_get_trace_file_ptr_from_entry(thing)))
         sprintf(trace, "%s 0x%lx", FUNC,
 	        (unsigned long)(((H5C_cache_entry_t *)thing)->addr));
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
+    entry_ptr = (H5AC_info_t *)thing;
+    cache_ptr = entry_ptr->cache_ptr;
+
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* Check if log messages are being emitted */
+    if(H5C_get_logging_status(cache_ptr, &log_enabled, &curr_logging) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to get logging status")
+
+    /* Unpin the entry */
     if(H5C_unpin_entry(thing) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, "can't unpin entry")
 
@@ -1401,11 +1445,83 @@ done:
 	HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value);
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
+    /* If currently logging, generate a message */
+    if(curr_logging)
+        if(H5AC__write_unpin_entry_log_msg(cache_ptr, entry_ptr, ret_value) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_unpin_entry() */
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5AC_destroy_flush_dependency()
+ *
+ * Purpose:	Destroy a flush dependency between two entries.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              3/24/09
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_destroy_flush_dependency(void * parent_thing, void * child_thing)
+{
+#if H5AC__TRACE_FILE_ENABLED
+    char                trace[128] = "";
+    FILE *              trace_file_ptr = NULL;
+#endif /* H5AC__TRACE_FILE_ENABLED */
+    hbool_t log_enabled;                /* TRUE if logging was set up */
+    hbool_t curr_logging;               /* TRUE if currently logging */
+    H5AC_info_t *entry_ptr = NULL;      /* Pointer to the cache entry */
+    H5C_t *cache_ptr = NULL;            /* Pointer to the entry's associated metadata cache */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(parent_thing);
+    HDassert(child_thing);
+
+#if H5AC__TRACE_FILE_ENABLED
+    if(NULL != (trace_file_ptr = H5C_get_trace_file_ptr_from_entry(parent_thing)))
+        sprintf(trace, "%s %llx %llx", FUNC,
+	        (unsigned long long)(((H5C_cache_entry_t *)parent_thing)->addr),
+	        (unsigned long long)(((H5C_cache_entry_t *)child_thing)->addr));
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    entry_ptr = (H5AC_info_t *)parent_thing;
+    cache_ptr = entry_ptr->cache_ptr;
+
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* Check if log messages are being emitted */
+    if(H5C_get_logging_status(cache_ptr, &log_enabled, &curr_logging) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to get logging status")
+
+    /* Destroy the flush dependency */
+    if(H5C_destroy_flush_dependency(parent_thing, child_thing) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTUNDEPEND, FAIL, "H5C_destroy_flush_dependency() failed.")
+
+done:
+#if H5AC__TRACE_FILE_ENABLED
+    if(trace_file_ptr != NULL)
+	HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value);
+#endif /* H5AC__TRACE_FILE_ENABLED */
+
+    /* If currently logging, generate a message */
+    if(curr_logging)
+        if(H5AC__write_destroy_fd_log_msg(cache_ptr, (H5AC_info_t *)parent_thing, (H5AC_info_t *)child_thing, ret_value) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_destroy_flush_dependency() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    H5AC_unprotect
  *
  * Purpose:	Undo an H5AC_protect() call -- specifically, mark the
@@ -1447,175 +1563,102 @@ herr_t
 H5AC_unprotect(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t addr,
     void *thing, unsigned flags)
 {
+#if H5AC__TRACE_FILE_ENABLED
+    char                trace[128] = "";
+    FILE *              trace_file_ptr = NULL;
+#endif /* H5AC__TRACE_FILE_ENABLED */
     hbool_t		dirtied;
     hbool_t		deleted;
 #ifdef H5_HAVE_PARALLEL
     H5AC_aux_t        * aux_ptr = NULL;
 #endif /* H5_HAVE_PARALLEL */
-#if H5AC__TRACE_FILE_ENABLED
-    char                trace[128] = "";
-    FILE *              trace_file_ptr = NULL;
-#endif /* H5AC__TRACE_FILE_ENABLED */
+    hbool_t log_enabled;              /* TRUE if logging was set up */
+    hbool_t curr_logging;             /* TRUE if currently logging */
     herr_t              ret_value=SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
+    /* Sanity checks */
     HDassert(f);
     HDassert(f->shared);
     HDassert(f->shared->cache);
     HDassert(type);
-    HDassert(type->clear);
-    HDassert(type->flush);
+    HDassert(type->deserialize);
+    HDassert(type->image_len);
     HDassert(H5F_addr_defined(addr));
     HDassert(thing);
     HDassert( ((H5AC_info_t *)thing)->addr == addr );
     HDassert( ((H5AC_info_t *)thing)->type == type );
 
+    /* Check if log messages are being emitted */
+    if(H5C_get_logging_status(f->shared->cache, &log_enabled, &curr_logging) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to get logging status")
+
 #if H5AC__TRACE_FILE_ENABLED
     /* For the unprotect call, only the addr, type id, flags, and possible
      * new size are really necessary in the trace file.  Write the return
      * value to catch occult errors.
      */
-    if ( ( f != NULL ) &&
-         ( f->shared != NULL ) &&
-         ( f->shared->cache != NULL ) &&
-         ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0) &&
-         ( trace_file_ptr != NULL ) ) {
-
-        sprintf(trace, "H5AC_unprotect 0x%lx %d",
-	        (unsigned long)addr,
-		(int)(type->id));
-    }
+    if(NULL != (trace_file_ptr = H5C_get_trace_file_ptr(cache_ptr)))
+        sprintf(trace, "%s 0x%lx %d", FUNC, (unsigned long)addr, (int)(type->id));
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
-    dirtied = (hbool_t)( ( (flags & H5AC__DIRTIED_FLAG) == H5AC__DIRTIED_FLAG ) ||
-		( ((H5AC_info_t *)thing)->dirtied ) );
-    deleted = (hbool_t)( (flags & H5C__DELETED_FLAG) == H5C__DELETED_FLAG );
+    dirtied = (hbool_t)(((flags & H5AC__DIRTIED_FLAG) == H5AC__DIRTIED_FLAG) ||
+		(((H5AC_info_t *)thing)->dirtied));
+    deleted = (hbool_t)((flags & H5C__DELETED_FLAG) == H5C__DELETED_FLAG);
 
     /* Check if the size changed out from underneath us, if we're not deleting
      *  the entry.
      */
     if(dirtied && !deleted) {
+        hbool_t		curr_compressed = FALSE; /* dummy for call */
         size_t		curr_size = 0;
+        size_t		curr_compressed_size = 0; /* dummy for call */
 
-        if((type->size)(f, thing, &curr_size) < 0)
-            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGETSIZE, FAIL, "Can't get size of thing")
+        if((type->image_len)(thing, &curr_size, &curr_compressed, &curr_compressed_size) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTGETSIZE, FAIL, "Can't get size of thing")
 
         if(((H5AC_info_t *)thing)->size != curr_size)
             HGOTO_ERROR(H5E_CACHE, H5E_BADSIZE, FAIL, "size of entry changed")
     } /* end if */
 
 #ifdef H5_HAVE_PARALLEL
-    if((dirtied) && (((H5AC_info_t *)thing)->is_dirty == FALSE) &&
-            (NULL != (aux_ptr = (H5AC_aux_t *)f->shared->cache->aux_ptr))) {
-        if(H5AC_log_dirtied_entry((H5AC_info_t *)thing, addr) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "can't log dirtied entry")
-    } /* end if */
-
-    if((deleted) &&
-            (NULL != (aux_ptr = (H5AC_aux_t *)(f->shared->cache->aux_ptr))) &&
-            (aux_ptr->mpi_rank == 0)) {
-        if(H5AC_log_deleted_entry(f->shared->cache, (H5AC_info_t *)thing, addr, flags) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "H5AC_log_deleted_entry() failed.")
+    if(NULL != (aux_ptr = H5C_get_aux_ptr(f->shared->cache))) {
+        if(dirtied && ((H5AC_info_t *)thing)->is_dirty == FALSE)
+            if(H5AC__log_dirtied_entry((H5AC_info_t *)thing) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "can't log dirtied entry")
+
+        if(deleted && aux_ptr->mpi_rank == 0)
+            if(H5AC__log_deleted_entry((H5AC_info_t *)thing) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "H5AC__log_deleted_entry() failed.")
     } /* end if */
 #endif /* H5_HAVE_PARALLEL */
 
-    if(H5C_unprotect(f, dxpl_id, H5AC_dxpl_id, type, addr, thing, flags) < 0)
+    if(H5C_unprotect(f, dxpl_id, addr, thing, flags) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "H5C_unprotect() failed.")
 
 #ifdef H5_HAVE_PARALLEL
     /* Check if we should try to flush */
-    if((aux_ptr != NULL) && (aux_ptr->dirty_bytes >= aux_ptr->dirty_bytes_threshold)) {
-        if(H5AC_run_sync_point(f, H5AC_dxpl_id, H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN) < 0)
+    if((aux_ptr != NULL) && (aux_ptr->dirty_bytes >= aux_ptr->dirty_bytes_threshold))
+        if(H5AC__run_sync_point(f, H5AC_dxpl_id, H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN) < 0)
             HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't run sync point.")
-    } /* end if */
 #endif /* H5_HAVE_PARALLEL */
 
 done:
 #if H5AC__TRACE_FILE_ENABLED
     if(trace_file_ptr != NULL)
-	HDfprintf(trace_file_ptr, "%s %x %d\n",
-		  trace, (unsigned)flags, (int)ret_value);
+	HDfprintf(trace_file_ptr, "%s 0x%x %d\n", trace, (unsigned)flags, (int)ret_value);
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
+    /* If currently logging, generate a message */
+    if(curr_logging)
+        if(H5AC__write_unprotect_entry_log_msg(f->shared->cache, (H5AC_info_t *)thing, type->id, flags, ret_value) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_unprotect() */
 
-

-/*-------------------------------------------------------------------------
- * Function:    HA5C_set_sync_point_done_callback
- *
- * Purpose:     Set the value of the sync_point_done callback.  This 
- *		callback is used by the parallel test code to verify
- *		that the expected writes and only the expected writes
- *		take place during a sync point.
- *
- * Return:      Non-negative on success/Negative on failure
- *
- * Programmer:  John Mainzer
- *              5/9/10
- *
- *-------------------------------------------------------------------------
- */
-#ifdef H5_HAVE_PARALLEL
-herr_t
-H5AC_set_sync_point_done_callback(H5C_t * cache_ptr,
-    void (* sync_point_done)(int num_writes, haddr_t * written_entries_tbl))
-{
-    H5AC_aux_t * aux_ptr;
-
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    HDassert(cache_ptr && (cache_ptr->magic == H5C__H5C_T_MAGIC));
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-
-    aux_ptr->sync_point_done = sync_point_done;
-
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5AC_set_sync_point_done_callback() */
-#endif /* H5_HAVE_PARALLEL */
-
-

-/*-------------------------------------------------------------------------
- * Function:    HA5C_set_write_done_callback
- *
- * Purpose:     Set the value of the write_done callback.  This callback
- *              is used to improve performance of the parallel test bed
- *              for the cache.
- *
- * Return:      Non-negative on success/Negative on failure
- *
- * Programmer:  John Mainzer
- *              5/11/06
- *
- *-------------------------------------------------------------------------
- */
-#ifdef H5_HAVE_PARALLEL
-herr_t
-H5AC_set_write_done_callback(H5C_t * cache_ptr,
-                             void (* write_done)(void))
-{
-    H5AC_aux_t * aux_ptr;
-
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    HDassert(cache_ptr && (cache_ptr->magic == H5C__H5C_T_MAGIC));
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-
-    aux_ptr->write_done = write_done;
-
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5AC_set_write_done_callback() */
-#endif /* H5_HAVE_PARALLEL */
-
+#ifndef NDEBUG  /* debugging functions */
 

 /*-------------------------------------------------------------------------
  * Function:    H5AC_stats
@@ -1632,10 +1675,9 @@ H5AC_set_write_done_callback(H5C_t * cache_ptr,
 herr_t
 H5AC_stats(const H5F_t *f)
 {
-    herr_t		ret_value = SUCCEED;   /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
 
+    /* Sanity checks */
     HDassert(f);
     HDassert(f->shared);
     HDassert(f->shared->cache);
@@ -1643,8 +1685,7 @@ H5AC_stats(const H5F_t *f)
     /* at present, this can't fail */
     (void)H5C_stats(f->shared->cache, H5F_OPEN_NAME(f), FALSE);
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI(SUCCEED)
 } /* H5AC_stats() */
 
 

@@ -1668,18 +1709,18 @@ H5AC_dump_cache(const H5F_t *f)
 
     FUNC_ENTER_NOAPI(FAIL)
 
+    /* Sanity checks */
     HDassert(f);
     HDassert(f->shared);
     HDassert(f->shared->cache);
 
-    if ( H5C_dump_cache(f->shared->cache, H5F_OPEN_NAME(f)) < 0 ) {
-
+    if(H5C_dump_cache(f->shared->cache, H5F_OPEN_NAME(f)) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_dump_cache() failed.")
-    }
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_dump_cache() */
+#endif /* NDEBUG */
 
 

 /*-------------------------------------------------------------------------
@@ -1695,59 +1736,40 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5AC_get_cache_auto_resize_config(const H5AC_t * cache_ptr,
-                                  H5AC_cache_config_t *config_ptr)
+H5AC_get_cache_auto_resize_config(const H5AC_t *cache_ptr,
+    H5AC_cache_config_t *config_ptr)
 {
-    herr_t result;
-    herr_t ret_value = SUCCEED;      /* Return value */
-    hbool_t evictions_enabled;
     H5C_auto_size_ctl_t internal_config;
+    hbool_t evictions_enabled;
+    herr_t ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    if ( ( cache_ptr == NULL )
-         ||
+    /* Check args */
+    if((cache_ptr == NULL) || (config_ptr == NULL) ||
+            (config_ptr->version != H5AC__CURR_CACHE_CONFIG_VERSION))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr or config_ptr on entry.")
 #ifdef H5_HAVE_PARALLEL
-         ( ( cache_ptr->aux_ptr != NULL )
-           &&
-           ( ((H5AC_aux_t *)(cache_ptr->aux_ptr))->magic
-             !=
-             H5AC__H5AC_AUX_T_MAGIC
-           )
-         )
-         ||
-#endif /* H5_HAVE_PARALLEL */
-         ( config_ptr == NULL )
-         ||
-         ( config_ptr->version != H5AC__CURR_CACHE_CONFIG_VERSION )
-       )
-    {
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                    "Bad cache_ptr or config_ptr on entry.")
-
-    }
-
-    result = H5C_get_cache_auto_resize_config((const H5C_t *)cache_ptr,
-					      &internal_config);
-
-    if ( result < 0 ) {
+{
+    H5AC_aux_t *aux_ptr;
 
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                    "H5C_get_cache_auto_resize_config() failed.")
-    }
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    if((aux_ptr != NULL) && (aux_ptr->magic != H5AC__H5AC_AUX_T_MAGIC))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad aux_ptr on entry.")
+}
+#endif /* H5_HAVE_PARALLEL */
 
+    /* Retrieve the configuration */
+    if(H5C_get_cache_auto_resize_config((const H5C_t *)cache_ptr, &internal_config) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_get_cache_auto_resize_config() failed.")
     if(H5C_get_evictions_enabled((const H5C_t *)cache_ptr, &evictions_enabled) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_get_resize_enabled() failed.")
 
-    if ( internal_config.rpt_fcn == NULL ) {
-
+    /* Set the information to return */
+    if(internal_config.rpt_fcn == NULL)
         config_ptr->rpt_fcn_enabled = FALSE;
-
-    } else {
-
+    else
 	config_ptr->rpt_fcn_enabled = TRUE;
-    }
-
     config_ptr->open_trace_file        = FALSE;
     config_ptr->close_trace_file       = FALSE;
     config_ptr->trace_file_name[0]     = '\0';
@@ -1771,35 +1793,28 @@ H5AC_get_cache_auto_resize_config(const H5AC_t * cache_ptr,
     config_ptr->decrement              = internal_config.decrement;
     config_ptr->apply_max_decrement    = internal_config.apply_max_decrement;
     config_ptr->max_decrement          = internal_config.max_decrement;
-    config_ptr->epochs_before_eviction =
-                                  (int)(internal_config.epochs_before_eviction);
+    config_ptr->epochs_before_eviction = (int)(internal_config.epochs_before_eviction);
     config_ptr->apply_empty_reserve    = internal_config.apply_empty_reserve;
     config_ptr->empty_reserve          = internal_config.empty_reserve;
-
 #ifdef H5_HAVE_PARALLEL
-    if ( cache_ptr->aux_ptr != NULL ) {
-
-        config_ptr->dirty_bytes_threshold =
-	    ((H5AC_aux_t *)(cache_ptr->aux_ptr))->dirty_bytes_threshold;
-	config_ptr->metadata_write_strategy = 
-	    ((H5AC_aux_t *)(cache_ptr->aux_ptr))->metadata_write_strategy;
+{
+    H5AC_aux_t *aux_ptr;
 
-    } else {
+    if(NULL != (aux_ptr = H5C_get_aux_ptr(cache_ptr))) {
+        config_ptr->dirty_bytes_threshold = aux_ptr->dirty_bytes_threshold;
+	config_ptr->metadata_write_strategy = aux_ptr->metadata_write_strategy;
+    } /* end if */
+    else {
 #endif /* H5_HAVE_PARALLEL */
-
-        config_ptr->dirty_bytes_threshold = 
-		H5AC__DEFAULT_DIRTY_BYTES_THRESHOLD;
-	config_ptr->metadata_write_strategy = 
-		H5AC__DEFAULT_METADATA_WRITE_STRATEGY;
-
+        config_ptr->dirty_bytes_threshold = H5AC__DEFAULT_DIRTY_BYTES_THRESHOLD;
+	config_ptr->metadata_write_strategy = H5AC__DEFAULT_METADATA_WRITE_STRATEGY;
 #ifdef H5_HAVE_PARALLEL
-    }
+    } /* end else */
+}
 #endif /* H5_HAVE_PARALLEL */
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
-
 } /* H5AC_get_cache_auto_resize_config() */
 
 

@@ -1816,33 +1831,19 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5AC_get_cache_size(H5AC_t * cache_ptr,
-                    size_t * max_size_ptr,
-                    size_t * min_clean_size_ptr,
-                    size_t * cur_size_ptr,
-                    int32_t * cur_num_entries_ptr)
+H5AC_get_cache_size(H5AC_t *cache_ptr, size_t *max_size_ptr, size_t *min_clean_size_ptr,
+    size_t *cur_size_ptr, int32_t *cur_num_entries_ptr)
 {
-    herr_t result;
     herr_t ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    result = H5C_get_cache_size((H5C_t *)cache_ptr,
-				max_size_ptr,
-				min_clean_size_ptr,
-				cur_size_ptr,
-				cur_num_entries_ptr);
-
-    if ( result < 0 ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                    "H5C_get_cache_size() failed.")
-    }
+    if(H5C_get_cache_size((H5C_t *)cache_ptr, max_size_ptr, min_clean_size_ptr,
+            cur_size_ptr, cur_num_entries_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_get_cache_size() failed.")
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
-
 } /* H5AC_get_cache_size() */
 
 

@@ -1859,7 +1860,7 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5AC_get_cache_hit_rate(H5AC_t * cache_ptr, double * hit_rate_ptr)
+H5AC_get_cache_hit_rate(H5AC_t *cache_ptr, double *hit_rate_ptr)
 {
     herr_t ret_value = SUCCEED;      /* Return value */
 
@@ -1888,23 +1889,15 @@ done:
 herr_t
 H5AC_reset_cache_hit_rate_stats(H5AC_t * cache_ptr)
 {
-    herr_t result;
     herr_t      ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    result = H5C_reset_cache_hit_rate_stats((H5C_t *)cache_ptr);
-
-    if ( result < 0 ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                    "H5C_reset_cache_hit_rate_stats() failed.")
-    }
+    if(H5C_reset_cache_hit_rate_stats((H5C_t *)cache_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_reset_cache_hit_rate_stats() failed.")
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
-
 } /* H5AC_reset_cache_hit_rate_stats() */
 
 

@@ -1921,126 +1914,100 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5AC_set_cache_auto_resize_config(H5AC_t *cache_ptr,
-                                  H5AC_cache_config_t *config_ptr)
+H5AC_set_cache_auto_resize_config(H5AC_t *cache_ptr, H5AC_cache_config_t *config_ptr)
 {
-    herr_t              result;
-    herr_t              ret_value = SUCCEED;      /* Return value */
-    H5C_auto_size_ctl_t internal_config;
 #if H5AC__TRACE_FILE_ENABLED
     H5AC_cache_config_t trace_config = H5AC__DEFAULT_CACHE_CONFIG;
     FILE *              trace_file_ptr = NULL;
 #endif /* H5AC__TRACE_FILE_ENABLED */
+    hbool_t log_enabled;                /* TRUE if logging was set up */
+    hbool_t curr_logging;               /* TRUE if currently logging */
+    H5C_auto_size_ctl_t internal_config;
+    herr_t  ret_value = SUCCEED;      	/* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    HDassert( cache_ptr );
+    /* Sanity checks */
+    HDassert(cache_ptr);
+
+    /* Check if log messages are being emitted */
+    if(H5C_get_logging_status(cache_ptr, &log_enabled, &curr_logging) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to get logging status")
 
 #if H5AC__TRACE_FILE_ENABLED
     /* Make note of the new configuration.  Don't look up the trace file
      * pointer, as that may change before we use it.
      */
-    if ( config_ptr != NULL ) {
-
+    if(config_ptr != NULL)
         trace_config = *config_ptr;
-
-    }
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
-    if ( ( cache_ptr == NULL )
-#ifdef H5_HAVE_PARALLEL
-         ||
-         ( ( cache_ptr->aux_ptr != NULL )
-           &&
-           (
-             ((H5AC_aux_t *)(cache_ptr->aux_ptr))->magic
-             !=
-             H5AC__H5AC_AUX_T_MAGIC
-           )
-         )
-#endif /* H5_HAVE_PARALLEL */
-       ) {
-
+    if(cache_ptr == NULL)
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "bad cache_ptr on entry.")
-    }
-
-    result = H5AC_validate_config(config_ptr);
-
-    if ( result != SUCCEED ) {
-
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Bad cache configuration");
-    }
-
-    if ( config_ptr->open_trace_file ) {
-
-	FILE * file_ptr = NULL;
-
-	if ( H5C_get_trace_file_ptr(cache_ptr, &file_ptr) < 0 ) {
-
-	    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-			"H5C_get_trace_file_ptr() failed.")
-	}
-
-	if ( ( ! ( config_ptr->close_trace_file ) ) &&
-	     ( file_ptr != NULL ) ) {
-
-            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
-                        "Trace file already open.")
-        }
-    }
+#ifdef H5_HAVE_PARALLEL
+{
+    H5AC_aux_t *aux_ptr;
 
-    if ( config_ptr->close_trace_file ) {
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    if((aux_ptr != NULL) && (aux_ptr->magic != H5AC__H5AC_AUX_T_MAGIC))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "bad aux_ptr on entry.")
+}
+#endif /* H5_HAVE_PARALLEL */
 
-	if ( H5AC_close_trace_file(cache_ptr) < 0 ) {
+    /* Validate external configuration */
+    if(H5AC_validate_config(config_ptr) != SUCCEED)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Bad cache configuration");
 
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                        "H5AC_close_trace_file() failed.")
-	}
-    }
+    if(config_ptr->open_trace_file) {
+	FILE * file_ptr;
 
-    if ( config_ptr->open_trace_file ) {
+	if(NULL == (file_ptr = H5C_get_trace_file_ptr(cache_ptr)))
+	    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_get_trace_file_ptr() failed.")
 
-        if ( H5AC_open_trace_file(cache_ptr, config_ptr->trace_file_name) < 0 )
-	{
+	if((!(config_ptr->close_trace_file)) && (file_ptr != NULL))
+            HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Trace file already open.")
+    } /* end if */
 
-	    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
-                        "H5AC_open_trace_file() failed.")
-	}
-    }
+    /* Close & reopen trace file, if requested */
+    if(config_ptr->close_trace_file)
+	if(H5AC_close_trace_file(cache_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_close_trace_file() failed.")
+    if(config_ptr->open_trace_file)
+        if(H5AC_open_trace_file(cache_ptr, config_ptr->trace_file_name) < 0)
+	    HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "H5AC_open_trace_file() failed.")
 
-    if(H5AC_ext_config_2_int_config(config_ptr, &internal_config) < 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_ext_config_2_int_config() failed.")
+    /* Convert external configuration to internal representation */
+    if(H5AC__ext_config_2_int_config(config_ptr, &internal_config) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC__ext_config_2_int_config() failed.")
 
+    /* Set configuration */
     if(H5C_set_cache_auto_resize_config(cache_ptr, &internal_config) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_set_cache_auto_resize_config() failed.")
-
     if(H5C_set_evictions_enabled(cache_ptr, config_ptr->evictions_enabled) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_set_evictions_enabled() failed.")
 
 #ifdef H5_HAVE_PARALLEL
-    if ( cache_ptr->aux_ptr != NULL ) {
-
-        ((H5AC_aux_t *)(cache_ptr->aux_ptr))->dirty_bytes_threshold =
-            config_ptr->dirty_bytes_threshold;
+{
+    H5AC_aux_t *aux_ptr;
 
-        ((H5AC_aux_t *)(cache_ptr->aux_ptr))->metadata_write_strategy =
-            config_ptr->metadata_write_strategy;
-    }
+    /* Set parallel configuration values */
+    /* (Which are only held in the H5AC layer -QAK) */
+    if(NULL != (aux_ptr = H5C_get_aux_ptr(cache_ptr))) {
+        aux_ptr->dirty_bytes_threshold = config_ptr->dirty_bytes_threshold;
+        aux_ptr->metadata_write_strategy = config_ptr->metadata_write_strategy;
+    } /* end if */
+}
 #endif /* H5_HAVE_PARALLEL */
 
 done:
-
 #if H5AC__TRACE_FILE_ENABLED
     /* For the set cache auto resize config call, only the contents
      * of the config is necessary in the trace file. Write the return
      * value to catch occult errors.
      */
-    if ( ( cache_ptr != NULL ) &&
-         ( H5C_get_trace_file_ptr(cache_ptr, &trace_file_ptr) >= 0 ) &&
-         ( trace_file_ptr != NULL ) ) {
-
+    if(NULL != (trace_file_ptr = H5C_get_trace_file_ptr(cache_ptr)))
 	HDfprintf(trace_file_ptr,
-                  "%s %d %d %d %d \"%s\" %d %d %d %f %d %d %ld %d %f %f %d %f %f %d %d %d %f %f %d %d %d %d %f %d %d %d\n",
+                  "%s %d %d %d %d \"%s\" %d %d %d %f %d %d %ld %d %f %f %d %f %f %d %d %d %f %f %d %d %d %d %f %zu %d %d\n",
 		  "H5AC_set_cache_auto_resize_config",
 		  trace_config.version,
 		  (int)(trace_config.rpt_fcn_enabled),
@@ -2073,11 +2040,14 @@ done:
 		  trace_config.dirty_bytes_threshold,
 		  trace_config.metadata_write_strategy,
 		  (int)ret_value);
-    }
 #endif /* H5AC__TRACE_FILE_ENABLED */
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    /* If currently logging, generate a message */
+    if(curr_logging)
+        if(H5AC__write_set_cache_config_log_msg(cache_ptr, config_ptr, ret_value) < 0)
+            HDONE_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
 
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* H5AC_set_cache_auto_resize_config() */
 
 

@@ -2104,27 +2074,18 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5AC_validate_config(H5AC_cache_config_t * config_ptr)
+H5AC_validate_config(H5AC_cache_config_t *config_ptr)
 {
     H5C_auto_size_ctl_t internal_config;
     herr_t              ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
+    /* Check args */
     if(config_ptr == NULL)
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL config_ptr on entry.")
-
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "NULL config_ptr on entry.")
     if(config_ptr->version != H5AC__CURR_CACHE_CONFIG_VERSION)
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Unknown config version.")
-
-    if((config_ptr->rpt_fcn_enabled != TRUE) && (config_ptr->rpt_fcn_enabled != FALSE))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "config_ptr->rpt_fcn_enabled must be either TRUE or FALSE.")
-
-    if((config_ptr->open_trace_file != TRUE) && (config_ptr->open_trace_file != FALSE))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "config_ptr->open_trace_file must be either TRUE or FALSE.")
-
-    if((config_ptr->close_trace_file != TRUE) && (config_ptr->close_trace_file != FALSE))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "config_ptr->close_trace_file must be either TRUE or FALSE.")
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Unknown config version.")
 
     /* don't bother to test trace_file_name unless open_trace_file is TRUE */
     if(config_ptr->open_trace_file) {
@@ -2135,45 +2096,32 @@ H5AC_validate_config(H5AC_cache_config_t * config_ptr)
 	 * sanity checks on the length of the file name.
 	 */
 	name_len = HDstrlen(config_ptr->trace_file_name);
+	if(name_len == 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "config_ptr->trace_file_name is empty.")
+        else if(name_len > H5AC__MAX_TRACE_FILE_NAME_LEN)
+            HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "config_ptr->trace_file_name too long.")
+    } /* end if */
 
-	if(name_len == 0) {
-            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "config_ptr->trace_file_name is empty.")
-        } else if(name_len > H5AC__MAX_TRACE_FILE_NAME_LEN) {
-            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "config_ptr->trace_file_name too long.")
-	}
-    }
-
-    if ( ( config_ptr->evictions_enabled != TRUE ) &&
-         ( config_ptr->evictions_enabled != FALSE ) ) {
-
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
-            "config_ptr->evictions_enabled must be either TRUE or FALSE.")
-    }
-
-    if ( ( config_ptr->evictions_enabled == FALSE ) &&
-	 ( ( config_ptr->incr_mode != H5C_incr__off ) ||
-	   ( config_ptr->flash_incr_mode != H5C_flash_incr__off ) ||
-	   ( config_ptr->decr_mode != H5C_decr__off ) ) ) {
-
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
-                    "Can't disable evictions while auto-resize is enabled.")
-    }
+    if((config_ptr->evictions_enabled == FALSE) &&
+            ((config_ptr->incr_mode != H5C_incr__off) ||
+                (config_ptr->flash_incr_mode != H5C_flash_incr__off) ||
+                (config_ptr->decr_mode != H5C_decr__off)))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "Can't disable evictions while auto-resize is enabled.")
 
-    if(config_ptr->dirty_bytes_threshold < H5AC__MIN_DIRTY_BYTES_THRESHOLD) {
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dirty_bytes_threshold too small.")
-    } else if(config_ptr->dirty_bytes_threshold > H5AC__MAX_DIRTY_BYTES_THRESHOLD) {
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dirty_bytes_threshold too big.")
-    }
+    if(config_ptr->dirty_bytes_threshold < H5AC__MIN_DIRTY_BYTES_THRESHOLD)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "dirty_bytes_threshold too small.")
+    else if(config_ptr->dirty_bytes_threshold > H5AC__MAX_DIRTY_BYTES_THRESHOLD)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "dirty_bytes_threshold too big.")
 
     if((config_ptr->metadata_write_strategy != H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY) &&
          (config_ptr->metadata_write_strategy != H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "config_ptr->metadata_write_strategy out of range.")
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "config_ptr->metadata_write_strategy out of range.")
 
-    if(H5AC_ext_config_2_int_config(config_ptr, &internal_config) < 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_ext_config_2_int_config() failed.")
+    if(H5AC__ext_config_2_int_config(config_ptr, &internal_config) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC__ext_config_2_int_config() failed.")
 
     if(H5C_validate_resize_config(&internal_config, H5C_RESIZE_CFG__VALIDATE_ALL) < 0)
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "error(s) in new config.")
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "error(s) in new config.")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -2197,44 +2145,29 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5AC_close_trace_file(H5AC_t * cache_ptr)
-
+H5AC_close_trace_file(H5AC_t *cache_ptr)
 {
-    herr_t   ret_value = SUCCEED;    /* Return value */
     FILE *   trace_file_ptr = NULL;
+    herr_t   ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    if ( cache_ptr == NULL ) {
-
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL cache_ptr on entry.")
-    }
-
-    if ( H5C_get_trace_file_ptr(cache_ptr, &trace_file_ptr) < 0 ) {
+    if(cache_ptr == NULL)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "NULL cache_ptr on entry.")
 
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-		    "H5C_get_trace_file_ptr() failed.")
-    }
+    if(NULL == (trace_file_ptr = H5C_get_trace_file_ptr(cache_ptr)))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_get_trace_file_ptr() failed.")
 
-    if ( trace_file_ptr != NULL ) {
-
-        if ( H5C_set_trace_file_ptr(cache_ptr, NULL) < 0 ) {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                        "H5C_set_trace_file_ptr() failed.")
-         }
-
-        if ( HDfclose(trace_file_ptr) != 0 ) {
+    if(trace_file_ptr != NULL) {
+        if(H5C_set_trace_file_ptr(cache_ptr, NULL) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_set_trace_file_ptr() failed.")
 
-            HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, \
-                        "can't close metadata cache trace file")
-        }
-    }
+        if(HDfclose(trace_file_ptr) != 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close metadata cache trace file")
+    } /* end if */
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
-
 } /* H5AC_close_trace_file() */
 
 

@@ -2255,475 +2188,176 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5AC_open_trace_file(H5AC_t * cache_ptr,
-		     const char * trace_file_name)
+H5AC_open_trace_file(H5AC_t *cache_ptr, const char *trace_file_name)
 {
-    herr_t   ret_value = SUCCEED;    /* Return value */
     char     file_name[H5AC__MAX_TRACE_FILE_NAME_LEN + H5C__PREFIX_LEN + 2];
     FILE *   file_ptr = NULL;
-#ifdef H5_HAVE_PARALLEL
-    H5AC_aux_t * aux_ptr = NULL;
-#endif /* H5_HAVE_PARALLEL */
+    herr_t   ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
     HDassert(cache_ptr);
 
-    if ( cache_ptr == NULL ) {
-
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache_ptr NULL on entry.")
-    }
-
-    if ( trace_file_name == NULL ) {
-
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \
-		    "NULL trace_file_name on entry.")
-    }
-
-    if ( HDstrlen(trace_file_name) > H5AC__MAX_TRACE_FILE_NAME_LEN ) {
-
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "trace file name too long.")
-    }
-
-    if ( H5C_get_trace_file_ptr(cache_ptr, &file_ptr) < 0 ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-		    "H5C_get_trace_file_ptr() failed.")
-    }
-
-    if ( file_ptr != NULL ) {
-
-        HGOTO_ERROR(H5E_FILE, H5E_FILEOPEN, FAIL, "trace file already open.")
-    }
+    /* Check args */
+    if(cache_ptr == NULL)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "cache_ptr NULL on entry.")
+    if(trace_file_name == NULL)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "NULL trace_file_name on entry.")
+    if(HDstrlen(trace_file_name) > H5AC__MAX_TRACE_FILE_NAME_LEN)
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "trace file name too long.")
+    if(NULL != (file_ptr = H5C_get_trace_file_ptr(cache_ptr)))
+        HGOTO_ERROR(H5E_CACHE, H5E_FILEOPEN, FAIL, "trace file already open.")
 
 #ifdef H5_HAVE_PARALLEL
+{
+    H5AC_aux_t * aux_ptr;
 
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    if ( cache_ptr->aux_ptr == NULL ) {
-
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    if(aux_ptr == NULL)
         sprintf(file_name, "%s", trace_file_name);
-
-    } else {
-
-	if ( aux_ptr->magic != H5AC__H5AC_AUX_T_MAGIC ) {
-
+    else {
+	if(aux_ptr->magic != H5AC__H5AC_AUX_T_MAGIC)
             HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad aux_ptr->magic.")
-	}
 
         sprintf(file_name, "%s.%d", trace_file_name, aux_ptr->mpi_rank);
+    } /* end else */
 
-    }
-
-    if ( HDstrlen(file_name) >
-         H5AC__MAX_TRACE_FILE_NAME_LEN + H5C__PREFIX_LEN + 1 ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-		    "cooked trace file name too long.")
-    }
-
+    if(HDstrlen(file_name) > H5AC__MAX_TRACE_FILE_NAME_LEN + H5C__PREFIX_LEN + 1)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "cooked trace file name too long.")
+}
 #else /* H5_HAVE_PARALLEL */
-
-    HDsnprintf(file_name, 
-               (size_t)(H5AC__MAX_TRACE_FILE_NAME_LEN + H5C__PREFIX_LEN + 1), 
+    HDsnprintf(file_name, (size_t)(H5AC__MAX_TRACE_FILE_NAME_LEN + H5C__PREFIX_LEN + 1), 
                "%s", trace_file_name);
-
 #endif /* H5_HAVE_PARALLEL */
 
-    if ( (file_ptr = HDfopen(file_name, "w")) == NULL ) {
-
-	/* trace file open failed */
+    if((file_ptr = HDfopen(file_name, "w")) == NULL)
         HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "trace file open failed.")
-    }
 
-    HDfprintf(file_ptr, "### HDF5 metadata cache trace file ###\n");
+    HDfprintf(file_ptr, "### HDF5 metadata cache trace file version 1 ###\n");
 
-    if ( H5C_set_trace_file_ptr(cache_ptr, file_ptr) < 0 ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-		    "H5C_set_trace_file_ptr() failed.")
-    }
+    if(H5C_set_trace_file_ptr(cache_ptr, file_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_set_trace_file_ptr() failed.")
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
-
 } /* H5AC_open_trace_file() */
 
 

+/*************************************************************************/
+/*************************** Debugging Functions: ************************/
+/*************************************************************************/
+
 /*-------------------------------------------------------------------------
- * Function:    H5AC_add_candidate()
  *
- * Purpose:     Add the supplied metadata entry address to the candidate
- *		list.  Verify that each entry added does not appear in 
- *		the list prior to its insertion.
+ * Function:    H5AC_get_entry_ptr_from_addr()
  *
- *		This function is intended for used in constructing list
- *		of entried to be flushed during sync points.  It shouldn't
- *		be called anywhere else.
+ * Purpose:     Debugging function that attempts to look up an entry in the
+ *              cache by its file address, and if found, returns a pointer
+ *              to the entry in *entry_ptr_ptr.  If the entry is not in the
+ *              cache, *entry_ptr_ptr is set to NULL.
  *
- * Return:      Non-negative on success/Negative on failure
+ *              WARNING: This call should be used only in debugging
+ *                       routines, and it should be avoided when
+ *                       possible.
  *
- * Programmer:  John Mainzer
- *              3/17/10
+ *                       Further, if we ever multi-thread the cache,
+ *                       this routine will have to be either discarded
+ *                       or heavily re-worked.
+ *
+ *                       Finally, keep in mind that the entry whose
+ *                       pointer is obtained in this fashion may not
+ *                       be in a stable state.
+ *
+ *              Note that this function is only defined if NDEBUG
+ *              is not defined.
+ *
+ *              As heavy use of this function is almost certainly a
+ *              bad idea, the metadata cache tracks the number of
+ *              successful calls to this function, and (if 
+ *              H5C_DO_SANITY_CHECKS is defined) displays any
+ *              non-zero count on cache shutdown.
+ *
+ *		This function is just a wrapper that calls the H5C 
+ *		version of the function.
+ *
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *
+ * Programmer:  John Mainzer, 5/30/14
  *
  *-------------------------------------------------------------------------
  */
-#ifdef H5_HAVE_PARALLEL
+#ifndef NDEBUG
 herr_t
-H5AC_add_candidate(H5AC_t * cache_ptr,
-                   haddr_t addr)
+H5AC_get_entry_ptr_from_addr(const H5F_t *f, haddr_t addr, void **entry_ptr_ptr)
 {
-    H5AC_aux_t         * aux_ptr;
-    H5AC_slist_entry_t * slist_entry_ptr = NULL;
-    herr_t               ret_value = SUCCEED;    /* Return value */
+    herr_t              ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-    HDassert( aux_ptr->metadata_write_strategy ==
-              H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED );
-    HDassert( aux_ptr->candidate_slist_ptr != NULL );
-
-    /* If the supplied address appears in the candidate list, scream and die. */
-    if(NULL != H5SL_search(aux_ptr->candidate_slist_ptr, (void *)(&addr)))
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "entry already in candidate slist.")
-
-    /* otherwise, construct an entry for the supplied address, and insert
-     * it into the candidate slist.
-     */
-    if(NULL == (slist_entry_ptr = H5FL_CALLOC(H5AC_slist_entry_t)))
-        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "Can't allocate candidate slist entry .")
-
-    slist_entry_ptr->magic = H5AC__H5AC_SLIST_ENTRY_T_MAGIC;
-    slist_entry_ptr->addr  = addr;
-
-    if(H5SL_insert(aux_ptr->candidate_slist_ptr, slist_entry_ptr, &(slist_entry_ptr->addr)) < 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, "can't insert entry into dirty entry slist.")
-
-    aux_ptr->candidate_slist_len += 1;
+    if(H5C_get_entry_ptr_from_addr(f, addr, entry_ptr_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_get_entry_ptr_from_addr() failed")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_add_candidate() */
-#endif /* H5_HAVE_PARALLEL */
+} /* H5AC_get_entry_ptr_from_addr() */
+#endif /* NDEBUG */
 
 

-/*************************************************************************/
-/**************************** Private Functions: *************************/
-/*************************************************************************/
-
 /*-------------------------------------------------------------------------
  *
- * Function:    H5AC_broadcast_candidate_list()
+ * Function:    H5AC_verify_entry_type()
  *
- * Purpose:     Broadcast the contents of the process 0 candidate entry
- *		slist.  In passing, also remove all entries from said
- *		list.  As the application of this will be handled by 
- *		the same functions on all processes, construct and 
- *		return a copy of the list in the same format as that
- *		received by the other processes.  Note that if this
- *		copy is returned in *haddr_buf_ptr_ptr, the caller 
- *		must free it.
- *
- *		This function must only be called by the process with
- *		MPI_rank 0.
- *
- *		Return SUCCEED on success, and FAIL on failure.
- *
- * Return:      Non-negative on success/Negative on failure.
- *
- * Programmer:  John Mainzer, 7/1/05
- *
- *-------------------------------------------------------------------------
- */
-#ifdef H5_HAVE_PARALLEL
-static herr_t
-H5AC_broadcast_candidate_list(H5AC_t * cache_ptr,
-                              int * num_entries_ptr,
-                              haddr_t ** haddr_buf_ptr_ptr)
-{
-    hbool_t		 success = FALSE;
-    H5AC_aux_t         * aux_ptr = NULL;
-    haddr_t            * haddr_buf_ptr = NULL;
-    MPI_Offset         * MPI_Offset_buf_ptr = NULL;
-    size_t		 buf_size = 0;
-    int                  mpi_result;
-    int			 chk_num_entries = 0;
-    int			 num_entries = 0;
-    herr_t               ret_value = SUCCEED;    /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-    HDassert( aux_ptr->mpi_rank == 0 );
-    HDassert( aux_ptr->metadata_write_strategy ==
-              H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED );
-    HDassert( aux_ptr->candidate_slist_ptr != NULL );
-    HDassert( H5SL_count(aux_ptr->candidate_slist_ptr) ==
-		    (size_t)(aux_ptr->candidate_slist_len) );
-    HDassert( num_entries_ptr != NULL );
-    HDassert( *num_entries_ptr == 0 );
-    HDassert( haddr_buf_ptr_ptr != NULL );
-    HDassert( *haddr_buf_ptr_ptr == NULL );
-
-    /* First broadcast the number of entries in the list so that the
-     * receivers can set up buffers to receive them.  If there aren't
-     * any, we are done.
-     */
-    num_entries = aux_ptr->candidate_slist_len;
-    if(MPI_SUCCESS != (mpi_result = MPI_Bcast(&num_entries, 1, MPI_INT, 0, aux_ptr->mpi_comm)))
-        HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 1", mpi_result)
-
-    if(num_entries > 0) {
-        /* convert the candidate list into the format we
-         * are used to receiving from process 0, and also load it 
-         * into a buffer for transmission.
-         */
-        if(H5AC_copy_candidate_list_to_buffer(cache_ptr, &chk_num_entries,
-                &haddr_buf_ptr, &buf_size, &MPI_Offset_buf_ptr) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't construct candidate buffer.")
-
-        HDassert( chk_num_entries == num_entries );
-        HDassert( haddr_buf_ptr != NULL );
-        HDassert( MPI_Offset_buf_ptr != NULL );
-        HDassert( aux_ptr->candidate_slist_len == 0 );
-
-        /* Now broadcast the list of candidate entries -- if there is one.
-         *
-         * The peculiar structure of the following call to MPI_Bcast is
-         * due to MPI's (?) failure to believe in the MPI_Offset type.
-         * Thus the element type is MPI_BYTE, with size equal to the
-         * buf_size computed above.
-         */
-        if(MPI_SUCCESS != (mpi_result = MPI_Bcast((void *)MPI_Offset_buf_ptr, (int)buf_size, MPI_BYTE, 0, aux_ptr->mpi_comm)))
-            HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 2", mpi_result)
-    } /* end if */
-
-    success = TRUE;
-
-done:
-    if(MPI_Offset_buf_ptr != NULL)
-        MPI_Offset_buf_ptr = (MPI_Offset *)H5MM_xfree((void *)MPI_Offset_buf_ptr);
-
-    if(success) {
-        /* Pass the number of entries and the buffer pointer 
-         * back to the caller.  Do this so that we can use the same code
-         * to apply the candidate list to all the processes.
-         */
-        *num_entries_ptr = num_entries;
-        *haddr_buf_ptr_ptr = haddr_buf_ptr;
-    } else if(haddr_buf_ptr != NULL) {
-        haddr_buf_ptr = (haddr_t *)H5MM_xfree((void *)haddr_buf_ptr);
-    }
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_broadcast_candidate_list() */
-#endif /* H5_HAVE_PARALLEL */
-
-

-/*-------------------------------------------------------------------------
+ * Purpose:     Debugging function that attempts to look up an entry in the
+ *              cache by its file address, and if found, test to see if its
+ *              type field contains the expected value.
  *
- * Function:    H5AC_broadcast_clean_list()
+ *              If the specified entry is in cache, *in_cache_ptr is set
+ *              to TRUE, and *type_ok_ptr is set to TRUE or FALSE
+ *              depending on whether the entries type field matches the
+ *              expected_type parameter
  *
- * Purpose:     Broadcast the contents of the process 0 cleaned entry
- *		slist.  In passing, also remove all entries from said
- *		list, and also remove any matching entries from the dirtied
- *		slist.
+ *              If the target entry is not in cache, *in_cache_ptr is
+ *              set to FALSE, and *type_ok_ptr is undefined.
  *
- *		This function must only be called by the process with
- *		MPI_rank 0.
+ *              Note that this function is only defined if NDEBUG
+ *              is not defined.
  *
- *		Return SUCCEED on success, and FAIL on failure.
+ *		This function is just a wrapper that calls the H5C 
+ *		version of the function.
  *
- * Return:      Non-negative on success/Negative on failure.
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
  *
- * Programmer:  John Mainzer, 7/1/05
+ * Programmer:  John Mainzer, 5/30/14
  *
  *-------------------------------------------------------------------------
  */
-#ifdef H5_HAVE_PARALLEL
-static herr_t
-H5AC_broadcast_clean_list(H5AC_t * cache_ptr)
+#ifndef NDEBUG
+herr_t
+H5AC_verify_entry_type(const H5F_t *f, haddr_t addr, const H5AC_class_t *expected_type,
+    hbool_t *in_cache_ptr, hbool_t *type_ok_ptr)
 {
-    herr_t               ret_value = SUCCEED;    /* Return value */
-    haddr_t		 addr;
-    haddr_t	       * addr_buf_ptr = NULL;
-    H5AC_aux_t         * aux_ptr = NULL;
-    H5SL_node_t        * slist_node_ptr = NULL;
-    H5AC_slist_entry_t * slist_entry_ptr = NULL;
-    MPI_Offset         * buf_ptr = NULL;
-    size_t		 buf_size;
-    int                  i = 0;
-    int                  mpi_result;
-    int			 num_entries = 0;
+    herr_t              ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    aux_ptr = (H5AC_aux_t *)cache_ptr->aux_ptr;
-
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-    HDassert( aux_ptr->mpi_rank == 0 );
-    HDassert( aux_ptr->c_slist_ptr != NULL );
-    HDassert( H5SL_count(aux_ptr->c_slist_ptr) ==
-		    (size_t)(aux_ptr->c_slist_len) );
-
-
-    /* First broadcast the number of entries in the list so that the
-     * receives can set up a buffer to receive them.  If there aren't
-     * any, we are done.
-     */
-    num_entries = aux_ptr->c_slist_len;
-
-    mpi_result = MPI_Bcast(&num_entries, 1, MPI_INT, 0, aux_ptr->mpi_comm);
-
-    if ( mpi_result != MPI_SUCCESS ) {
-
-        HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 1", mpi_result)
-
-    }
-
-    if ( num_entries > 0 )
-    {
-        /* allocate a buffer to store the list of entry base addresses in */
-
-        buf_size = sizeof(MPI_Offset) * (size_t)num_entries;
-
-        buf_ptr = (MPI_Offset *)H5MM_malloc(buf_size);
-
-        if ( buf_ptr == NULL ) {
-
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
-                        "memory allocation failed for clean entry buffer")
-        }
-
-        /* if the sync_point_done callback is defined, allocate the
-         * addr buffer as well.
-         */
-        if ( aux_ptr->sync_point_done != NULL ) {
-
-            addr_buf_ptr = (haddr_t *)H5MM_malloc((size_t)num_entries * sizeof(haddr_t));
-
-            if ( addr_buf_ptr == NULL ) {
-
-                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
-                            "memory allocation failed for addr buffer")
-            }
-        }
-
-
-        /* now load the entry base addresses into the buffer, emptying the
-         * cleaned entry list in passing
-         */
-
-        while ( NULL != (slist_node_ptr = H5SL_first(aux_ptr->c_slist_ptr) ) )
-        {
-            slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_item(slist_node_ptr);
-
-            HDassert(slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC);
-
-            HDassert( i < num_entries );
-
-            addr = slist_entry_ptr->addr;
-
-            if ( addr_buf_ptr != NULL ) {
-
-                addr_buf_ptr[i] = addr;
-            }
-
-            if ( H5FD_mpi_haddr_to_MPIOff(addr, &(buf_ptr[i])) < 0 ) {
-
-                HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, \
-                            "can't convert from haddr to MPI off")
-            }
-
-            i++;
-
-            /* now remove the entry from the cleaned entry list */
-            if ( H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr))
-                 != slist_entry_ptr ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \
-                            "Can't delete entry from cleaned entry slist.")
-            }
-
-            slist_entry_ptr->magic = 0;
-            slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
-
-            aux_ptr->c_slist_len -= 1;
-
-            HDassert( aux_ptr->c_slist_len >= 0 );
-
-            /* and also remove the matching entry from the dirtied list
-             * if it exists.
-             */
-            if((slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_search(aux_ptr->d_slist_ptr, (void *)(&addr))) != NULL) {
-                HDassert( slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC );
-                HDassert( slist_entry_ptr->addr == addr );
-
-                if(H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&addr)) != slist_entry_ptr)
-                    HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, "Can't delete entry from dirty entry slist.")
-
-                slist_entry_ptr->magic = 0;
-                slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
-
-                aux_ptr->d_slist_len -= 1;
-
-                HDassert( aux_ptr->d_slist_len >= 0 );
-            } /* end if */
-        } /* while */
-
-
-        /* Now broadcast the list of cleaned entries -- if there is one.
-         *
-         * The peculiar structure of the following call to MPI_Bcast is
-         * due to MPI's (?) failure to believe in the MPI_Offset type.
-         * Thus the element type is MPI_BYTE, with size equal to the
-         * buf_size computed above.
-         */
-
-        mpi_result = MPI_Bcast((void *)buf_ptr, (int)buf_size, MPI_BYTE, 0,
-                               aux_ptr->mpi_comm);
-
-        if ( mpi_result != MPI_SUCCESS ) {
-
-            HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 2", mpi_result)
-        }
-    }
-
-    if(aux_ptr->sync_point_done != NULL)
-        (aux_ptr->sync_point_done)(num_entries, addr_buf_ptr);
+    if(H5C_verify_entry_type(f, addr, expected_type, in_cache_ptr, type_ok_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_verify_entry_type() failed")
 
 done:
-    if(buf_ptr != NULL)
-        buf_ptr = (MPI_Offset *)H5MM_xfree((void *)buf_ptr);
-    if(addr_buf_ptr != NULL)
-        addr_buf_ptr = (haddr_t *)H5MM_xfree((void *)addr_buf_ptr);
-
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_broadcast_clean_list() */
-#endif /* H5_HAVE_PARALLEL */
+} /* H5AC_verify_entry_type() */
+#endif /* NDEBUG */
+
+
+

+/*************************************************************************/
+/**************************** Private Functions: *************************/
+/*************************************************************************/
 
 

 /*-------------------------------------------------------------------------
  *
- * Function:    H5AC_check_if_write_permitted
+ * Function:    H5AC__check_if_write_permitted
  *
  * Purpose:     Determine if a write is permitted under the current
  *		circumstances, and set *write_permitted_ptr accordingly.
@@ -2740,277 +2374,44 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-#ifdef H5_HAVE_PARALLEL
 static herr_t
-H5AC_check_if_write_permitted(const H5F_t *f,
-                              hid_t H5_ATTR_UNUSED dxpl_id,
-                              hbool_t * write_permitted_ptr)
-#else /* H5_HAVE_PARALLEL */
-static herr_t
-H5AC_check_if_write_permitted(const H5F_t H5_ATTR_UNUSED * f,
-                              hid_t H5_ATTR_UNUSED dxpl_id,
-                              hbool_t * write_permitted_ptr)
+H5AC__check_if_write_permitted(const H5F_t
+#ifndef H5_HAVE_PARALLEL
+H5_ATTR_UNUSED
 #endif /* H5_HAVE_PARALLEL */
+    *f, hbool_t *write_permitted_ptr)
 {
-    hbool_t		write_permitted = TRUE;
-    herr_t		ret_value = SUCCEED;      /* Return value */
 #ifdef H5_HAVE_PARALLEL
     H5AC_aux_t *	aux_ptr = NULL;
 #endif /* H5_HAVE_PARALLEL */
+    hbool_t		write_permitted = TRUE;
 
-
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_STATIC_NOERR
 
 #ifdef H5_HAVE_PARALLEL
-    HDassert( f != NULL );
-    HDassert( f->shared != NULL );
-    HDassert( f->shared->cache != NULL );
-
-    aux_ptr = (H5AC_aux_t *)(f->shared->cache->aux_ptr);
-
-    if ( aux_ptr != NULL ) {
-
-        HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-
-        if ( ( aux_ptr->mpi_rank == 0 ) ||
-             ( aux_ptr->metadata_write_strategy ==
-               H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED ) ) {
+    /* Sanity checks */
+    HDassert(f != NULL);
+    HDassert(f->shared != NULL);
+    HDassert(f->shared->cache != NULL);
+    aux_ptr = H5C_get_aux_ptr(f->shared->cache);
+    if(aux_ptr != NULL) {
+        HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
 
+        if((aux_ptr->mpi_rank == 0) || (aux_ptr->metadata_write_strategy == H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED))
 	    write_permitted = aux_ptr->write_permitted;
-
-        } else {
-
+        else
 	    write_permitted = FALSE;
-	}
-    }
+    } /* end if */
 #endif /* H5_HAVE_PARALLEL */
 
     *write_permitted_ptr = write_permitted;
 
-done:
-
-    FUNC_LEAVE_NOAPI(ret_value)
-
-} /* H5AC_check_if_write_permitted() */
-
-

-/*-------------------------------------------------------------------------
- * Function:    H5AC_construct_candidate_list()
- *
- * Purpose:     In the parallel case when the metadata_write_strategy is 
- *		H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED, process 0 uses
- *		this function to construct the list of cache entries to 
- *		be flushed.  This list is then propagated to the other 
- *		caches, and then flushed in a distributed fashion.
- *
- *		The sync_point_op parameter is used to determine the extent
- *		of the flush.
- *
- * Return:      Non-negative on success/Negative on failure
- *
- * Programmer:  John Mainzer
- *              3/17/10
- *
- *-------------------------------------------------------------------------
- */
-#ifdef H5_HAVE_PARALLEL
-herr_t
-H5AC_construct_candidate_list(H5AC_t * cache_ptr,
-                              H5AC_aux_t * aux_ptr,
-                              int sync_point_op)
-{
-    herr_t ret_value = SUCCEED;    /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-    HDassert( aux_ptr->metadata_write_strategy ==
-              H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED );
-    HDassert( ( sync_point_op == H5AC_SYNC_POINT_OP__FLUSH_CACHE ) ||
-              ( aux_ptr->mpi_rank == 0 ) );
-    HDassert( aux_ptr->d_slist_ptr != NULL );
-    HDassert( aux_ptr->c_slist_ptr != NULL );
-    HDassert( aux_ptr->c_slist_len == 0 );
-    HDassert( aux_ptr->candidate_slist_ptr != NULL );
-    HDassert( aux_ptr->candidate_slist_len == 0 );
-    HDassert( ( sync_point_op == H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN ) ||
-              ( sync_point_op == H5AC_SYNC_POINT_OP__FLUSH_CACHE ) );
-
-    switch(sync_point_op) {
-	case H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN:
-            if(H5C_construct_candidate_list__min_clean((H5C_t *)cache_ptr) < 0)
-		HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_construct_candidate_list__min_clean() failed.")
-	    break;
-
-	case H5AC_SYNC_POINT_OP__FLUSH_CACHE:
-            if(H5C_construct_candidate_list__clean_cache((H5C_t *)cache_ptr) < 0)
-		HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_construct_candidate_list__clean_cache() failed.")
-	    break;
-
-        default:
-	    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unknown sync point operation.")
-	    break;
-    } /* end switch */
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_construct_candidate_list() */
-#endif /* H5_HAVE_PARALLEL */
-
-

-/*-------------------------------------------------------------------------
- *
- * Function:    H5AC_copy_candidate_list_to_buffer
- *
- * Purpose:     Allocate buffer(s) and copy the contents of the candidate
- *		entry slist into it (them).  In passing, remove all 
- *		entries from the candidate slist.  Note that the 
- *		candidate slist must not be empty.
- *
- *		If MPI_Offset_buf_ptr_ptr is not NULL, allocate a buffer
- *		of MPI_Offset, copy the contents of the candidate
- *		entry list into it with the appropriate conversions, 
- *		and return the base address of the buffer in 
- *		*MPI_Offset_buf_ptr.  Note that this is the buffer
- *		used by process 0 to transmit the list of entries to 
- *		be flushed to all other processes (in this file group).
- *
- *		Similarly, allocate a buffer of haddr_t, load the contents
- *		of the candidate list into this buffer, and return its 
- *		base address in *haddr_buf_ptr_ptr.  Note that this 
- *		latter buffer is constructed unconditionally.  
- *
- *		In passing, also remove all entries from the candidate
- *		entry slist.
- *
- * Return:	Return SUCCEED on success, and FAIL on failure.
- *
- * Programmer:  John Mainzer, 4/19/10
- *
- *-------------------------------------------------------------------------
- */
-#ifdef H5_HAVE_PARALLEL
-static herr_t
-H5AC_copy_candidate_list_to_buffer(H5AC_t * cache_ptr,
-                                   int * num_entries_ptr,
-                                   haddr_t ** haddr_buf_ptr_ptr,
-                                   size_t * MPI_Offset_buf_size_ptr,
-                                   MPI_Offset ** MPI_Offset_buf_ptr_ptr)
-{
-    herr_t               ret_value = SUCCEED;    /* Return value */
-    hbool_t		 success = FALSE;
-    haddr_t		 addr;
-    H5AC_aux_t         * aux_ptr = NULL;
-    H5SL_node_t        * slist_node_ptr = NULL;
-    H5AC_slist_entry_t * slist_entry_ptr = NULL;
-    MPI_Offset         * MPI_Offset_buf_ptr = NULL;
-    haddr_t            * haddr_buf_ptr = NULL;
-    size_t		 buf_size;
-    int                  i = 0;
-    int			 num_entries = 0;
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-    HDassert( aux_ptr->metadata_write_strategy ==
-              H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED );
-    HDassert( aux_ptr->candidate_slist_ptr != NULL );
-    HDassert( H5SL_count(aux_ptr->candidate_slist_ptr) ==
-		    (size_t)(aux_ptr->candidate_slist_len) );
-    HDassert( aux_ptr->candidate_slist_len > 0 );
-    HDassert( num_entries_ptr != NULL );
-    HDassert( *num_entries_ptr == 0 );
-    HDassert( haddr_buf_ptr_ptr != NULL );
-    HDassert( *haddr_buf_ptr_ptr == NULL );
-
-    num_entries = aux_ptr->candidate_slist_len;
-
-    /* allocate a buffer(s) to store the list of candidate entry 
-     * base addresses in 
-     */
-    if(MPI_Offset_buf_ptr_ptr != NULL) {
-        HDassert( MPI_Offset_buf_size_ptr != NULL );
-
-        /* allocate a buffer of MPI_Offset */
-        buf_size = sizeof(MPI_Offset) * (size_t)num_entries;
-        if(NULL == (MPI_Offset_buf_ptr = (MPI_Offset *)H5MM_malloc(buf_size)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for MPI_Offset buffer")
-    } /* end if */
-
-    /* allocate a buffer of haddr_t */
-    if(NULL == (haddr_buf_ptr = (haddr_t *)H5MM_malloc(sizeof(haddr_t) * (size_t)num_entries)))
-        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for haddr buffer")
-
-    /* now load the entry base addresses into the buffer, emptying the
-     * candidate entry list in passing
-     */
-    while(NULL != (slist_node_ptr = H5SL_first(aux_ptr->candidate_slist_ptr))) {
-        slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_item(slist_node_ptr);
-
-        HDassert(slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC);
-        HDassert( i < num_entries );
-
-        addr = slist_entry_ptr->addr;
-        haddr_buf_ptr[i] = addr;
-        if(MPI_Offset_buf_ptr != NULL) {
-            if(H5FD_mpi_haddr_to_MPIOff(addr, &(MPI_Offset_buf_ptr[i])) < 0)
-                HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "can't convert from haddr to MPI off")
-        } /* end if */
-
-        i++;
-
-        /* now remove the entry from the cleaned entry list */
-        if(H5SL_remove(aux_ptr->candidate_slist_ptr, (void *)(&addr)) != slist_entry_ptr)
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, "Can't delete entry from candidate entry slist.")
-
-        slist_entry_ptr->magic = 0;
-        slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
-
-        aux_ptr->candidate_slist_len -= 1;
-
-        HDassert( aux_ptr->candidate_slist_len >= 0 );
-    } /* while */
-    HDassert( aux_ptr->candidate_slist_len == 0 );
-
-    success = TRUE;
-
-done:
-    if(success) {
-        /* Pass the number of entries and the buffer pointer 
-         * back to the caller.
-         */
-        *num_entries_ptr = num_entries;
-        *haddr_buf_ptr_ptr = haddr_buf_ptr;
-
-        if(MPI_Offset_buf_ptr_ptr != NULL) {
-            HDassert( MPI_Offset_buf_ptr != NULL);
-	    *MPI_Offset_buf_size_ptr = buf_size;
-	    *MPI_Offset_buf_ptr_ptr = MPI_Offset_buf_ptr;
-        } /* end if */
-    } /* end if */
-    else {
-        if(MPI_Offset_buf_ptr != NULL)
-            MPI_Offset_buf_ptr = (MPI_Offset *)H5MM_xfree((void *)MPI_Offset_buf_ptr);
-        if(haddr_buf_ptr != NULL)
-            haddr_buf_ptr = (haddr_t *)H5MM_xfree((void *)haddr_buf_ptr);
-    } /* end else */
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_copy_candidate_list_to_buffer() */
-#endif /* H5_HAVE_PARALLEL */
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5AC__check_if_write_permitted() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5AC_ext_config_2_int_config()
+ * Function:    H5AC__ext_config_2_int_config()
  *
  * Purpose:     Utility function to translate an instance of
  *		H5AC_cache_config_t to an instance of H5C_auto_size_ctl_t.
@@ -3027,31 +2428,23 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5AC_ext_config_2_int_config(H5AC_cache_config_t * ext_conf_ptr,
-                             H5C_auto_size_ctl_t * int_conf_ptr)
+static herr_t
+H5AC__ext_config_2_int_config(H5AC_cache_config_t *ext_conf_ptr,
+    H5C_auto_size_ctl_t *int_conf_ptr)
 {
     herr_t               ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_STATIC
 
-    if ( ( ext_conf_ptr == NULL ) ||
-         ( ext_conf_ptr->version != H5AC__CURR_CACHE_CONFIG_VERSION ) ||
-         ( int_conf_ptr == NULL ) ) {
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                    "Bad ext_conf_ptr or inf_conf_ptr on entry.")
-    }
+    if((ext_conf_ptr == NULL) || (ext_conf_ptr->version != H5AC__CURR_CACHE_CONFIG_VERSION) ||
+            (int_conf_ptr == NULL))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad ext_conf_ptr or inf_conf_ptr on entry.")
 
     int_conf_ptr->version                = H5C__CURR_AUTO_SIZE_CTL_VER;
-
-    if ( ext_conf_ptr->rpt_fcn_enabled ) {
-
+    if(ext_conf_ptr->rpt_fcn_enabled)
         int_conf_ptr->rpt_fcn            = H5C_def_auto_resize_rpt_fcn;
-
-    } else {
-
+    else
         int_conf_ptr->rpt_fcn            = NULL;
-    }
 
     int_conf_ptr->set_initial_size       = ext_conf_ptr->set_initial_size;
     int_conf_ptr->initial_size           = ext_conf_ptr->initial_size;
@@ -3080,1907 +2473,443 @@ H5AC_ext_config_2_int_config(H5AC_cache_config_t * ext_conf_ptr,
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_ext_config_2_int_config() */
+} /* H5AC__ext_config_2_int_config() */
 
 

-/*-------------------------------------------------------------------------
- *
- * Function:    H5AC_log_deleted_entry()
- *
- * Purpose:     Log an entry for which H5C__DELETED_FLAG has been set.
- *
- *		If mpi_rank is 0, we must make sure that the entry doesn't
- *		appear in the cleaned or dirty entry lists.  Otherwise,
- *		we have nothing to do.
+/*------------------------------------------------------------------------------
+ * Function:    H5AC_ignore_tags()
  *
- *		Return SUCCEED on success, and FAIL on failure.
+ * Purpose:     Override all assertion frameworks and force application of 
+ *              global tag everywhere. This should really only be used in the
+ *              tests that need to access functions without going through 
+ *              API paths.
+ * 
+ * Return:      SUCCEED on success, FAIL otherwise.
  *
- * Return:      Non-negative on success/Negative on failure.
- *
- * Programmer:  John Mainzer, 6/29/05
+ * Programmer:  Mike McGreevy
+ *              December 1, 2009
  *
- *-------------------------------------------------------------------------
+ *------------------------------------------------------------------------------
  */
-#ifdef H5_HAVE_PARALLEL
-static herr_t
-H5AC_log_deleted_entry(H5AC_t * cache_ptr,
-                       H5AC_info_t * entry_ptr,
-                       haddr_t addr,
-                       unsigned int flags)
+herr_t
+H5AC_ignore_tags(const H5F_t *f)
 {
-    H5AC_aux_t         * aux_ptr;
-    H5AC_slist_entry_t * slist_entry_ptr = NULL;
-    herr_t               ret_value = SUCCEED;    /* Return value */
+    herr_t      ret_value = SUCCEED;
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-
-    HDassert( entry_ptr != NULL );
-    HDassert( entry_ptr->addr == addr );
-
-    HDassert( (flags & H5C__DELETED_FLAG) != 0 );
-
-    if(aux_ptr->mpi_rank == 0) {
-        HDassert( aux_ptr->d_slist_ptr != NULL );
-        HDassert( aux_ptr->c_slist_ptr != NULL );
-
-        /* if the entry appears in the dirtied entry slist, remove it. */
-        if((slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_search(aux_ptr->d_slist_ptr, (void *)(&addr))) != NULL) {
-            HDassert(slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC);
-            HDassert(slist_entry_ptr->addr == addr);
-
-            if(H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&addr)) != slist_entry_ptr)
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, "Can't delete entry from dirty entry slist.")
-
-            slist_entry_ptr->magic = 0;
-            slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
 
-            aux_ptr->d_slist_len -= 1;
+    /* Set up a new metadata tag */
+    if(H5C_ignore_tags(f->shared->cache) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTSET, FAIL, "H5C_ignore_tags() failed.")
+            
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_ignore_tags() */
 
-            HDassert( aux_ptr->d_slist_len >= 0 );
-        } /* end if */
+

+/*------------------------------------------------------------------------------
+ * Function:    H5AC_tag()
+ *
+ * Purpose:     Sets the metadata tag property in the provided property list.
+ * 
+ * Return:      SUCCEED on success, FAIL otherwise.
+ *
+ * Programmer:  Mike McGreevy
+ *              December 1, 2009
+ *
+ *------------------------------------------------------------------------------
+ */
+herr_t
+H5AC_tag(hid_t dxpl_id, haddr_t metadata_tag, haddr_t *prev_tag)
+{
+    H5C_tag_t tag;                  /* Tag structure */
+    H5P_genplist_t *dxpl;           /* Dataset transfer property list */
+    herr_t ret_value = SUCCEED;     /* Return value */
 
-        /* if the entry appears in the cleaned entry slist, remove it. */
-        if((slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_search(aux_ptr->c_slist_ptr, (void *)(&addr))) != NULL) {
-            HDassert(slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC);
-            HDassert(slist_entry_ptr->addr == addr);
+    FUNC_ENTER_NOAPI(FAIL)
 
-            if(H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr)) != slist_entry_ptr)
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, "Can't delete entry from cleaned entry slist.")
+    /* Check Arguments */
+    if(NULL == (dxpl = (H5P_genplist_t *)H5I_object_verify(dxpl_id, H5I_GENPROP_LST)))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADTYPE, FAIL, "not a property list")
 
-            slist_entry_ptr->magic = 0;
-            slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+    /* Get the current tag value and return that (if prev_tag is NOT null) */
+    if(prev_tag) {
+        if((H5P_get(dxpl, "H5C_tag", &tag)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to query dxpl")
+        *prev_tag = tag.value;
+    } /* end if */
 
-            aux_ptr->c_slist_len -= 1;
+    /* Add metadata_tag to tag structure */
+    tag.value = metadata_tag;
+
+    /* Determine globality of tag */
+    switch(metadata_tag) {
+        case H5AC__SUPERBLOCK_TAG:
+        case H5AC__SOHM_TAG:
+        case H5AC__GLOBALHEAP_TAG:
+            tag.globality = H5C_GLOBALITY_MAJOR;
+            break;
+        case H5AC__FREESPACE_TAG:
+            tag.globality = H5C_GLOBALITY_MINOR;
+            break;
+        default:
+            tag.globality = H5C_GLOBALITY_NONE;
+            break;
+    } /* end switch */
 
-            HDassert( aux_ptr->c_slist_len >= 0 );
-        } /* end if */
-    } /* if */
+    /* Set the provided tag in the dxpl_id. */
+    if(H5P_set(dxpl, "H5C_tag", &tag) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTSET, FAIL, "can't set property in dxpl")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_log_deleted_entry() */
-#endif /* H5_HAVE_PARALLEL */
+} /* H5AC_tag */
 
 

-/*-------------------------------------------------------------------------
+/*------------------------------------------------------------------------------
+ * Function:    H5AC_retag_copied_metadata()
  *
- * Function:    H5AC_log_dirtied_entry()
+ * Purpose:     Searches through cache index for all entries with the
+ *              H5AC__COPIED_TAG, indicating that it was created as a 
+ *              result of an object copy, and applies the provided tag.
+ * 
+ * Return:      SUCCEED on success, FAIL otherwise.
  *
- * Purpose:     Update the dirty_bytes count for a newly dirtied entry.
+ * Programmer:  Mike McGreevy
+ *              March 17, 2010
  *
- *		If mpi_rank isnt 0, this simply means adding the size
- *		of the entries to the dirty_bytes count.
- *
- *		If mpi_rank is 0, we must first check to see if the entry
- *		appears in the dirty entries slist.  If it is, do nothing.
- *		If it isn't, add the size to th dirty_bytes count, add the
- *		entry to the dirty entries slist, and remove it from the
- *		cleaned list (if it is present there).
- *
- *		Return SUCCEED on success, and FAIL on failure.
- *
- * Return:      Non-negative on success/Negative on failure.
- *
- * Programmer:  John Mainzer, 6/29/05
- *
- *-------------------------------------------------------------------------
- */
-#ifdef H5_HAVE_PARALLEL
-static herr_t
-H5AC_log_dirtied_entry(const H5AC_info_t * entry_ptr,
-                       haddr_t addr)
-{
-    H5AC_t             * cache_ptr;
-    H5AC_aux_t         * aux_ptr;
-    herr_t               ret_value = SUCCEED;    /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    HDassert( entry_ptr );
-    HDassert( entry_ptr->addr == addr );
-    HDassert( entry_ptr->is_dirty == FALSE );
-
-    cache_ptr = entry_ptr->cache_ptr;
-
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-
-    if ( aux_ptr->mpi_rank == 0 ) {
-        H5AC_slist_entry_t * slist_entry_ptr;
-
-        HDassert( aux_ptr->d_slist_ptr != NULL );
-        HDassert( aux_ptr->c_slist_ptr != NULL );
-
-        if ( H5SL_search(aux_ptr->d_slist_ptr, (void *)(&addr)) == NULL ) {
-
-            /* insert the address of the entry in the dirty entry list, and
-             * add its size to the dirty_bytes count.
-             */
-            if ( NULL == (slist_entry_ptr = H5FL_CALLOC(H5AC_slist_entry_t)) ) {
-
-                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
-                            "Can't allocate dirty slist entry .")
-            }
-
-            slist_entry_ptr->magic = H5AC__H5AC_SLIST_ENTRY_T_MAGIC;
-            slist_entry_ptr->addr  = addr;
-
-            if ( H5SL_insert(aux_ptr->d_slist_ptr, slist_entry_ptr,
-                             &(slist_entry_ptr->addr)) < 0 ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, \
-                            "can't insert entry into dirty entry slist.")
-            }
-
-            aux_ptr->d_slist_len += 1;
-            aux_ptr->dirty_bytes += entry_ptr->size;
-#if H5AC_DEBUG_DIRTY_BYTES_CREATION
-	    aux_ptr->unprotect_dirty_bytes += entry_ptr->size;
-	    aux_ptr->unprotect_dirty_bytes_updates += 1;
-#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
-        }
-
-        if(H5SL_search(aux_ptr->c_slist_ptr, (void *)(&addr)) != NULL) {
-            /* the entry is dirty.  If it exists on the cleaned entries list,
-             * remove it.
-             */
-            if((slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_search(aux_ptr->c_slist_ptr, (void *)(&addr))) != NULL) {
-                HDassert(slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC);
-                HDassert(slist_entry_ptr->addr == addr);
-
-                if(H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr)) != slist_entry_ptr)
-                    HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, "Can't delete entry from clean entry slist.")
-
-                slist_entry_ptr->magic = 0;
-                slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
-
-                aux_ptr->c_slist_len -= 1;
-
-                HDassert( aux_ptr->c_slist_len >= 0 );
-            } /* end if */
-        } /* end if */
-    } else {
-
-        aux_ptr->dirty_bytes += entry_ptr->size;
-#if H5AC_DEBUG_DIRTY_BYTES_CREATION
-        aux_ptr->unprotect_dirty_bytes += entry_size;
-        aux_ptr->unprotect_dirty_bytes_updates += 1;
-#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
-    }
-
-done:
-
-    FUNC_LEAVE_NOAPI(ret_value)
-
-} /* H5AC_log_dirtied_entry() */
-#endif /* H5_HAVE_PARALLEL */
-
-

-/*-------------------------------------------------------------------------
- *
- * Function:    H5AC_log_flushed_entry()
- *
- * Purpose:     Update the clean entry slist for the flush of an entry --
- *		specifically, if the entry has been cleared, remove it
- * 		from both the cleaned and dirtied lists if it is present.
- *		Otherwise, if the entry was dirty, insert the indicated
- *		entry address in the clean slist if it isn't there already.
- *
- *		This function is only used in PHDF5, and should only
- *		be called for the process with mpi rank 0.
- *
- *		Return SUCCEED on success, and FAIL on failure.
- *
- * Return:      Non-negative on success/Negative on failure.
- *
- * Programmer:  John Mainzer, 6/29/05
- *
- *-------------------------------------------------------------------------
- */
-#ifdef H5_HAVE_PARALLEL
-static herr_t
-H5AC_log_flushed_entry(H5C_t * cache_ptr,
-                       haddr_t addr,
-                       hbool_t was_dirty,
-                       unsigned flags,
-                       int H5_ATTR_UNUSED type_id)
-{
-    herr_t               ret_value = SUCCEED;    /* Return value */
-    hbool_t		 cleared;
-    H5AC_aux_t         * aux_ptr;
-    H5AC_slist_entry_t * slist_entry_ptr = NULL;
-
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-    HDassert( aux_ptr->mpi_rank == 0 );
-    HDassert( aux_ptr->c_slist_ptr != NULL );
-
-    cleared = ( (flags & H5C__FLUSH_CLEAR_ONLY_FLAG) != 0 );
-
-    if ( cleared ) {
-
-        /* If the entry has been cleared, must remove it from both the
-         * cleaned list and the dirtied list.
-         */
-
-        if ( (slist_entry_ptr = (H5AC_slist_entry_t *)
-				H5SL_search(aux_ptr->c_slist_ptr,
-                                            (void *)(&addr))) != NULL ) {
-
-            HDassert( slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC);
-            HDassert( slist_entry_ptr->addr == addr );
-
-            if ( H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr))
-                 != slist_entry_ptr ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \
-                            "Can't delete entry from clean entry slist.")
-            }
-
-            slist_entry_ptr->magic = 0;
-            slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
-
-            aux_ptr->c_slist_len -= 1;
-
-            HDassert( aux_ptr->c_slist_len >= 0 );
-        }
-
-        if ( (slist_entry_ptr = (H5AC_slist_entry_t *)
-                 H5SL_search(aux_ptr->d_slist_ptr, (void *)(&addr))) != NULL ) {
-
-            HDassert( slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC);
-            HDassert( slist_entry_ptr->addr == addr );
-
-            if ( H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&addr))
-                 != slist_entry_ptr ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \
-                            "Can't delete entry from dirty entry slist.")
-            }
-
-            slist_entry_ptr->magic = 0;
-            slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
-
-            aux_ptr->d_slist_len -= 1;
-
-            HDassert( aux_ptr->d_slist_len >= 0 );
-        }
-    } else if ( was_dirty ) {
-
-        if ( H5SL_search(aux_ptr->c_slist_ptr, (void *)(&addr)) == NULL ) {
-
-            /* insert the address of the entry in the clean entry list. */
-
-            if ( NULL == (slist_entry_ptr = H5FL_CALLOC(H5AC_slist_entry_t)) ) {
-
-                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
-                            "Can't allocate clean slist entry .")
-            }
-
-            slist_entry_ptr->magic = H5AC__H5AC_SLIST_ENTRY_T_MAGIC;
-            slist_entry_ptr->addr  = addr;
-
-            if ( H5SL_insert(aux_ptr->c_slist_ptr, slist_entry_ptr,
-                             &(slist_entry_ptr->addr)) < 0 ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, \
-                            "can't insert entry into clean entry slist.")
-            }
-
-            aux_ptr->c_slist_len += 1;
-        }
-    }
-
-done:
-
-    FUNC_LEAVE_NOAPI(ret_value)
-
-} /* H5AC_log_flushed_entry() */
-#endif /* H5_HAVE_PARALLEL */
-
-

-/*-------------------------------------------------------------------------
- *
- * Function:    H5AC_log_inserted_entry()
- *
- * Purpose:     Update the dirty_bytes count for a newly inserted entry.
- *
- *		If mpi_rank isnt 0, this simply means adding the size
- *		of the entry to the dirty_bytes count.
- *
- *		If mpi_rank is 0, we must also add the entry to the
- *		dirty entries slist.
- *
- *		Return SUCCEED on success, and FAIL on failure.
- *
- * Return:      Non-negative on success/Negative on failure.
- *
- * Programmer:  John Mainzer, 6/30/05
- *
- *-------------------------------------------------------------------------
- */
-#ifdef H5_HAVE_PARALLEL
-static herr_t
-H5AC_log_inserted_entry(H5AC_t * cache_ptr,
-                        H5AC_info_t * entry_ptr)
-{
-    H5AC_aux_t         * aux_ptr;
-    herr_t               ret_value = SUCCEED;    /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    HDassert(cache_ptr != NULL);
-    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert(aux_ptr != NULL);
-    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
-
-    HDassert( entry_ptr != NULL );
-
-    if(aux_ptr->mpi_rank == 0) {
-        H5AC_slist_entry_t * slist_entry_ptr;
-
-        HDassert(aux_ptr->d_slist_ptr != NULL);
-        HDassert(aux_ptr->c_slist_ptr != NULL);
-
-        if(NULL != H5SL_search(aux_ptr->d_slist_ptr, (void *)(&entry_ptr->addr)))
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Inserted entry already in dirty slist.")
-
-        /* insert the address of the entry in the dirty entry list, and
-         * add its size to the dirty_bytes count.
-         */
-        if(NULL == (slist_entry_ptr = H5FL_CALLOC(H5AC_slist_entry_t)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "Can't allocate dirty slist entry .")
-
-        slist_entry_ptr->magic = H5AC__H5AC_SLIST_ENTRY_T_MAGIC;
-        slist_entry_ptr->addr  = entry_ptr->addr;
-
-        if(H5SL_insert(aux_ptr->d_slist_ptr, slist_entry_ptr, &(slist_entry_ptr->addr)) < 0 )
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, "can't insert entry into dirty entry slist.")
-
-        aux_ptr->d_slist_len += 1;
-
-        if(NULL != H5SL_search(aux_ptr->c_slist_ptr, (void *)(&entry_ptr->addr)))
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Inserted entry in clean slist.")
-    } /* end if */
-
-    aux_ptr->dirty_bytes += entry_ptr->size;
-
-#if H5AC_DEBUG_DIRTY_BYTES_CREATION
-    aux_ptr->insert_dirty_bytes += size;
-    aux_ptr->insert_dirty_bytes_updates += 1;
-#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_log_inserted_entry() */
-#endif /* H5_HAVE_PARALLEL */
-
-

-/*-------------------------------------------------------------------------
- *
- * Function:    H5AC_log_moved_entry()
- *
- * Purpose:     Update the dirty_bytes count for a moved entry.
- *
- *		WARNING
- *
- *		At present, the way that the move call is used ensures
- *		that the moved entry is present in all caches by
- *		moving in a collective operation and immediately after
- *		unprotecting the target entry.
- *
- *		This function uses this invarient, and will cause arcane
- *		failures if it is not met.  If maintaining this invarient
- *		becomes impossible, we will have to rework this function
- *		extensively, and likely include a bit of IPC for
- *		synchronization.  A better option might be to subsume
- *		move in the unprotect operation.
- *
- *		Given that the target entry is in all caches, the function
- *		proceeds as follows:
- *
- *		For processes with mpi rank other 0, it simply checks to
- *		see if the entry was dirty prior to the move, and adds
- *		the entries size to the dirty bytes count.
- *
- *		In the process with mpi rank 0, the function first checks
- *		to see if the entry was dirty prior to the move.  If it
- *		was, and if the entry doesn't appear in the dirtied list
- *		under its old address, it adds the entry's size to the
- *		dirty bytes count.
- *
- *		The rank 0 process then removes any references to the
- *		entry under its old address from the cleands and dirtied
- *		lists, and inserts an entry in the dirtied list under the
- *		new address.
- *
- *		Return SUCCEED on success, and FAIL on failure.
- *
- * Return:      Non-negative on success/Negative on failure.
- *
- * Programmer:  John Mainzer, 6/30/05
- *
- *-------------------------------------------------------------------------
- */
-#ifdef H5_HAVE_PARALLEL
-static herr_t
-H5AC_log_moved_entry(const H5F_t *f,
-                       haddr_t old_addr,
-                       haddr_t new_addr)
-{
-    H5AC_t *             cache_ptr;
-    hbool_t		 entry_in_cache;
-    hbool_t		 entry_dirty;
-    size_t               entry_size;
-    H5AC_aux_t         * aux_ptr = NULL;
-    H5AC_slist_entry_t * slist_entry_ptr = NULL;
-    herr_t               ret_value = SUCCEED;    /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    HDassert( f );
-    HDassert( f->shared );
-
-    cache_ptr = (H5AC_t *)f->shared->cache;
-
-    HDassert( cache_ptr );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-
-    /* get entry status, size, etc here */
-    if ( H5C_get_entry_status(f, old_addr, &entry_size, &entry_in_cache,
-                              &entry_dirty, NULL, NULL) < 0 ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't get entry status.")
-
-    } else if ( ! entry_in_cache ) {
-
-        HDassert( entry_in_cache );
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "entry not in cache.")
-    }
-
-    if ( aux_ptr->mpi_rank == 0 ) {
-
-        HDassert( aux_ptr->d_slist_ptr != NULL );
-        HDassert( aux_ptr->c_slist_ptr != NULL );
-
-        /* if the entry appears in the cleaned entry slist, under its old
-         * address, remove it.
-         */
-        if ( (slist_entry_ptr = (H5AC_slist_entry_t *)
-	      H5SL_search(aux_ptr->c_slist_ptr, (void *)(&old_addr))) != NULL ) {
-
-            HDassert( slist_entry_ptr->magic ==
-                          H5AC__H5AC_SLIST_ENTRY_T_MAGIC );
-            HDassert( slist_entry_ptr->addr == old_addr );
-
-            if ( H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&old_addr))
-                               != slist_entry_ptr ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \
-                            "Can't delete entry from cleaned entry slist.")
-            }
-
-            slist_entry_ptr->magic = 0;
-            slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
-
-            aux_ptr->c_slist_len -= 1;
-
-            HDassert( aux_ptr->c_slist_len >= 0 );
-        }
-
-        /* if the entry appears in the dirtied entry slist under its old
-         * address, remove it, but don't free it. Set addr to new_addr.
-         */
-        if ( (slist_entry_ptr = (H5AC_slist_entry_t *)
-	      H5SL_search(aux_ptr->d_slist_ptr, (void *)(&old_addr))) != NULL ) {
-
-            HDassert( slist_entry_ptr->magic ==
-                      H5AC__H5AC_SLIST_ENTRY_T_MAGIC );
-            HDassert( slist_entry_ptr->addr == old_addr );
-
-            if ( H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&old_addr))
-                != slist_entry_ptr ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \
-                            "Can't delete entry from dirty entry slist.")
-            }
-
-            slist_entry_ptr->addr = new_addr;
-
-            aux_ptr->d_slist_len -= 1;
-
-            HDassert( aux_ptr->d_slist_len >= 0 );
-
-        } else {
-
-             /* otherwise, allocate a new entry that is ready
-              * for insertion, and increment dirty_bytes.
-              *
-              * Note that the fact that the entry wasn't in the dirtied
-              * list under its old address implies that it must have
-              * been clean to start with.
-              */
-
-            HDassert( !entry_dirty );
-
-            if ( NULL == (slist_entry_ptr = H5FL_CALLOC(H5AC_slist_entry_t)) ) {
-
-                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \
-                            "Can't allocate dirty slist entry .")
-            }
-
-            slist_entry_ptr->magic = H5AC__H5AC_SLIST_ENTRY_T_MAGIC;
-            slist_entry_ptr->addr  = new_addr;
-
-            aux_ptr->dirty_bytes += entry_size;
-
-#if H5AC_DEBUG_DIRTY_BYTES_CREATION
-            aux_ptr->move_dirty_bytes += entry_size;
-            aux_ptr->move_dirty_bytes_updates += 1;
-#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
-        }
-
-        /* verify that there is no entry at new_addr in the dirty slist */
-        if ( H5SL_search(aux_ptr->d_slist_ptr, (void *)(&new_addr)) != NULL ) {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                        "dirty slist already contains entry at new_addr.")
-        }
-
-        /* insert / reinsert the entry in the dirty slist */
-        if ( H5SL_insert(aux_ptr->d_slist_ptr, slist_entry_ptr,
-                         &(slist_entry_ptr->addr)) < 0 ) {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, \
-                        "can't insert entry into dirty entry slist.")
-        }
-
-        aux_ptr->d_slist_len += 1;
-
-    } else if ( ! entry_dirty ) {
-
-        aux_ptr->dirty_bytes += entry_size;
-
-#if H5AC_DEBUG_DIRTY_BYTES_CREATION
-        aux_ptr->move_dirty_bytes += entry_size;
-        aux_ptr->move_dirty_bytes_updates += 1;
-#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
-    }
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_log_moved_entry() */
-#endif /* H5_HAVE_PARALLEL */
-
-

-/*-------------------------------------------------------------------------
- * Function:    H5AC_propagate_and_apply_candidate_list
- *
- * Purpose:     Prior to the addition of support for multiple metadata 
- *		write strategies, in PHDF5, only the metadata cache with 
- *		mpi rank 0 was allowed to write to file.  All other 
- *		metadata caches on processes with rank greater than 0 
- *		were required to retain dirty entries until they were 
- *		notified that the entry was clean.
- *
- *		This constraint is relaxed with the distributed 
- *		metadata write strategy, in which a list of candidate
- *		metadata cache entries is constructed by the process 0
- *		cache and then distributed to the caches of all the other
- *		processes.  Once the listed is distributed, many (if not 
- *		all) processes writing writing a unique subset of the 
- *		entries, and marking the remainder clean.  The subsets 
- *		are chosen so that each entry in the list of candidates 
- *		is written by exactly one cache, and all entries are 
- *		marked as being clean in all caches.
- *
- *		While the list of candidate cache entries is prepared 
- *		elsewhere, this function is the main routine for distributing
- *		and applying the list.  It must be run simultaniously on 
- *		all processes that have the relevant file open.  To ensure
- *		proper synchronization, there is a barrier at the beginning 
- *		of this function.
- *
- *		At present, this function is called under one of two 
- *		circumstances:
- *
- *		1) Dirty byte creation exceeds some user specified value.
- *
- *		   While metadata reads may occur independently, all
- *		   operations writing metadata must be collective.  Thus
- *		   all metadata caches see the same sequence of operations,
- *                 and therefore the same dirty data creation.
- *
- *		   This fact is used to synchronize the caches for purposes
- *                 of propagating the list of candidate entries, by simply 
- *		   calling this function from all caches whenever some user 
- *		   specified threshold on dirty data is exceeded.  (the 
- *		   process 0 cache creates the candidate list just before 
- *		   calling this function).
- *
- *		2) Under direct user control -- this operation must be
- *		   collective.
- *
- *              The operations to be managed by this function are as
- * 		follows:
- *
- *		All processes:
- *
- *		1) Participate in an opening barrier.
- *
- *		For the process with mpi rank 0:
- *
- *		1) Load the contents of the candidate list 
- *		   (candidate_slist_ptr) into a buffer, and broadcast that
- *		   buffer to all the other caches.  Clear the candidate
- *		   list in passing.
- *
- *		If there is a positive number of candidates, proceed with 
- *		the following:
- *
- *		2) Apply the candidate entry list.
- *
- *		3) Particpate in a closing barrier.
- *
- *		4) Remove from the dirty list (d_slist_ptr) and from the 
- *		   flushed and still clean entries list (c_slist_ptr),  
- *                 all addresses that appeared in the candidate list, as
- *		   these entries are now clean.
- *
- *
- *		For all processes with mpi rank greater than 0:
- *
- *		1) Receive the candidate entry list broadcast
- *
- *		If there is a positive number of candidates, proceed with 
- *		the following:
- *
- *		2) Apply the candidate entry list.
- *
- *		3) Particpate in a closing barrier.
- *
- * Return:      Success:        non-negative
- *
- *              Failure:        negative
- *
- * Programmer:  John Mainzer
- *              3/17/10
- *
- *-------------------------------------------------------------------------
- */
-#ifdef H5_HAVE_PARALLEL
-static herr_t
-H5AC_propagate_and_apply_candidate_list(H5F_t  * f,
-                                        hid_t    dxpl_id,
-                                        H5AC_t * cache_ptr)
-{
-    int		         mpi_code;
-    int	                 num_candidates = 0;
-    haddr_t            * candidates_list_ptr = NULL;
-    H5AC_aux_t         * aux_ptr;
-    herr_t               ret_value = SUCCEED;   /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-    HDassert( aux_ptr->metadata_write_strategy == 
-              H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED );
-
-    /* to prevent "messages from the future" we must synchronize all
-     * processes before we write any entries.
-     */
-    if(MPI_SUCCESS != (mpi_code = MPI_Barrier(aux_ptr->mpi_comm)))
-        HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed 1", mpi_code)
-
-    if(aux_ptr->mpi_rank == 0) {
-        if(H5AC_broadcast_candidate_list(cache_ptr, &num_candidates, &candidates_list_ptr) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't broadcast candidate slist.")
-
-        HDassert( aux_ptr->candidate_slist_len == 0 );
-    } /* end if */
-    else {
-        if(H5AC_receive_candidate_list(cache_ptr, &num_candidates, &candidates_list_ptr) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't receive candidate broadcast.")
-    } /* end else */
-
-    if(num_candidates > 0) {
-        herr_t	         result;
-
-        /* all processes apply the candidate list.  
-         * H5C_apply_candidate_list() handles the details of 
-         * distributing the writes across the processes.
-         */
-
-        aux_ptr->write_permitted = TRUE;
-
-        result = H5C_apply_candidate_list(f,
-                                          dxpl_id,
-                                          dxpl_id,
-                                          cache_ptr,
-                                          num_candidates,
-                                          candidates_list_ptr,
-                                          aux_ptr->mpi_rank,
-                                          aux_ptr->mpi_size);
-
-        aux_ptr->write_permitted = FALSE;
-
-        if(result < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't apply candidate list.")
-
-	if(aux_ptr->write_done != NULL)
-	    (aux_ptr->write_done)();
-
-        /* to prevent "messages from the past" we must synchronize all
-         * processes again before we go on.
-         */
-        if(MPI_SUCCESS != (mpi_code = MPI_Barrier(aux_ptr->mpi_comm)))
-            HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed 2", mpi_code)
-
-        if(aux_ptr->mpi_rank == 0) {
-            if(H5AC_tidy_cache_0_lists(cache_ptr, num_candidates, candidates_list_ptr) < 0)
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't tidy up process 0 lists.")
-        } /* end if */
-    } /* end if */
-
-    /* if it is defined, call the sync point done callback.  Note
-     * that this callback is defined purely for testing purposes,
-     * and should be undefined under normal operating circumstances.
-     */
-    if(aux_ptr->sync_point_done != NULL)
-        (aux_ptr->sync_point_done)(num_candidates, candidates_list_ptr);
-
-done:
-    if(candidates_list_ptr != NULL)
-        candidates_list_ptr = (haddr_t *)H5MM_xfree((void *)candidates_list_ptr);
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_propagate_and_apply_candidate_list() */
-#endif /* H5_HAVE_PARALLEL */
-
-

-/*-------------------------------------------------------------------------
- * Function:    H5AC_propagate_flushed_and_still_clean_entries_list
- *
- * Purpose:     In PHDF5, if the process 0 only metadata write strategy
- *		is selected, only the metadata cache with mpi rank 0 is 
- *		allowed to write to file.  All other metadata caches on 
- *		processes with rank greater than 0 must retain dirty 
- *		entries until they are notified that the entry is now 
- *		clean.
- *
- *		This function is the main routine for handling this 
- *		notification proceedure.  It must be called 
- *		simultaniously on all processes that have the relevant 
- *		file open.  To this end, it is called only during a 
- *		sync point, with a barrier prior to the call.
- *
- *		Note that any metadata entry writes by process 0 will
- *		occur after the barrier and just before this call.
- *
- *		Typicaly, calls to this function will be triggered in
- *		one of two ways:
- *
- *		1) Dirty byte creation exceeds some user specified value.
- *
- *		   While metadata reads may occur independently, all
- *		   operations writing metadata must be collective.  Thus
- *		   all metadata caches see the same sequence of operations,
- *                 and therefore the same dirty data creation.
- *
- *		   This fact is used to synchronize the caches for purposes
- *                 of propagating the list of flushed and still clean
- *		   entries, by simply calling this function from all
- *		   caches whenever some user specified threshold on dirty
- *		   data is exceeded.
- *
- *		2) Under direct user control -- this operation must be
- *		   collective.
- *
- *              The operations to be managed by this function are as
- * 		follows:
- *
- *		For the process with mpi rank 0:
- *
- *		1) Load the contents of the flushed and still clean entries
- *		   list (c_slist_ptr) into a buffer, and broadcast that
- *		   buffer to all the other caches.
- *
- *		2) Clear the flushed and still clean entries list
- *                 (c_slist_ptr).
- *
- *
- *		For all processes with mpi rank greater than 0:
- *
- *		1) Receive the flushed and still clean entries list broadcast
- *
- *		2) Mark the specified entries as clean.
- *
- *
- *		For all processes:
- *
- *		1) Reset the dirtied bytes count to 0.
- *
- * Return:      Success:        non-negative
- *
- *              Failure:        negative
- *
- * Programmer:  John Mainzer
- *              July 5, 2005
- *
- *-------------------------------------------------------------------------
- */
-#ifdef H5_HAVE_PARALLEL
-herr_t
-H5AC_propagate_flushed_and_still_clean_entries_list(H5F_t  * f,
-                                                    hid_t    dxpl_id,
-                                                    H5AC_t * cache_ptr)
-{
-    H5AC_aux_t * aux_ptr;
-    herr_t	 ret_value = SUCCEED;   /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    HDassert(cache_ptr != NULL);
-    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert(aux_ptr != NULL);
-    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
-    HDassert(aux_ptr->metadata_write_strategy == 
-              H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY);
-
-    if(aux_ptr->mpi_rank == 0) {
-        if(H5AC_broadcast_clean_list(cache_ptr) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't broadcast clean slist.")
-        HDassert( aux_ptr->c_slist_len == 0 );
-    } /* end if */
-    else {
-        if(H5AC_receive_and_apply_clean_list(f, dxpl_id, H5AC_dxpl_id, cache_ptr) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't receive and/or process clean slist broadcast.")
-    } /* end else */
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_propagate_flushed_and_still_clean_entries_list() */
-#endif /* H5_HAVE_PARALLEL */
-
-

-/*-------------------------------------------------------------------------
- *
- * Function:    H5AC_receive_and_apply_clean_list()
- *
- * Purpose:     Receive the list of cleaned entries from process 0,
- *		and mark the specified entries as clean.
- *
- *		This function must only be called by the process with
- *		MPI_rank greater than 0.
- *
- *		Return SUCCEED on success, and FAIL on failure.
- *
- * Return:      Non-negative on success/Negative on failure.
- *
- * Programmer:  John Mainzer, 7/4/05
- *
- *-------------------------------------------------------------------------
- */
-#ifdef H5_HAVE_PARALLEL
-static herr_t
-H5AC_receive_and_apply_clean_list(H5F_t  * f,
-                                  hid_t    primary_dxpl_id,
-                                  hid_t    secondary_dxpl_id,
-                                  H5AC_t * cache_ptr)
-{
-    H5AC_aux_t         * aux_ptr;
-    haddr_t	       * haddr_buf_ptr = NULL;
-    MPI_Offset         * MPI_Offset_buf_ptr = NULL;
-    int                  mpi_result;
-    int			 num_entries = 0;
-    herr_t               ret_value = SUCCEED;    /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    HDassert( f != NULL );
-    HDassert( f->shared->cache == cache_ptr );
-
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-    HDassert( aux_ptr->mpi_rank != 0 );
-
-    /* First receive the number of entries in the list so that we
-     * can set up a buffer to receive them.  If there aren't
-     * any, we are done.
-     */
-    if(MPI_SUCCESS != (mpi_result = MPI_Bcast(&num_entries, 1, MPI_INT, 0, aux_ptr->mpi_comm)))
-        HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 1", mpi_result)
-
-    if(num_entries > 0) {
-        size_t buf_size;
-        int i;
-
-        /* allocate buffers to store the list of entry base addresses in */
-        buf_size = sizeof(MPI_Offset) * (size_t)num_entries;
-        if(NULL == (MPI_Offset_buf_ptr = (MPI_Offset *)H5MM_malloc(buf_size)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for receive buffer")
-        if(NULL == (haddr_buf_ptr = (haddr_t *)H5MM_malloc(sizeof(haddr_t) * (size_t)num_entries)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for haddr buffer")
-
-        /* Now receive the list of cleaned entries
-         *
-         * The peculiar structure of the following call to MPI_Bcast is
-         * due to MPI's (?) failure to believe in the MPI_Offset type.
-         * Thus the element type is MPI_BYTE, with size equal to the
-         * buf_size computed above.
-         */
-        if(MPI_SUCCESS != (mpi_result = MPI_Bcast((void *)MPI_Offset_buf_ptr, (int)buf_size, MPI_BYTE, 0, aux_ptr->mpi_comm)))
-            HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 2", mpi_result)
-
-        /* translate the MPI_Offsets to haddr_t */
-        i = 0;
-        while(i < num_entries) {
-            haddr_buf_ptr[i] = H5FD_mpi_MPIOff_to_haddr(MPI_Offset_buf_ptr[i]);
-
-            if(haddr_buf_ptr[i] == HADDR_UNDEF)
-                HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "can't convert MPI off to haddr")
-
-            i++;
-        } /* end while */
-
-        /* mark the indicated entries as clean */
-        if(H5C_mark_entries_as_clean(f, primary_dxpl_id, secondary_dxpl_id,
-                (int32_t)num_entries, &(haddr_buf_ptr[0])) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't mark entries clean.")
-    } /* end if */
-
-    /* if it is defined, call the sync point done callback.  Note
-     * that this callback is defined purely for testing purposes,
-     * and should be undefined under normal operating circumstances.
-     */
-    if(aux_ptr->sync_point_done != NULL)
-        (aux_ptr->sync_point_done)(num_entries, haddr_buf_ptr);
-
-done:
-    if(MPI_Offset_buf_ptr != NULL)
-        MPI_Offset_buf_ptr = (MPI_Offset *)H5MM_xfree((void *)MPI_Offset_buf_ptr);
-    if(haddr_buf_ptr != NULL)
-        haddr_buf_ptr = (haddr_t *)H5MM_xfree((void *)haddr_buf_ptr);
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_receive_and_apply_clean_list() */
-#endif /* H5_HAVE_PARALLEL */
-
-

-/*-------------------------------------------------------------------------
- *
- * Function:    H5AC_receive_candidate_list()
- *
- * Purpose:     Receive the list of candidate entries from process 0,
- *		and return it in a buffer pointed to by *haddr_buf_ptr_ptr.
- *		Note that the caller must free this buffer if it is 
- *		returned.
- *
- *		This function must only be called by the process with
- *		MPI_rank greater than 0.
- *
- *		Return SUCCEED on success, and FAIL on failure.
- *
- * Return:      Non-negative on success/Negative on failure.
- *
- * Programmer:  John Mainzer, 3/17/10
- *
- *-------------------------------------------------------------------------
+ *------------------------------------------------------------------------------
  */
-#ifdef H5_HAVE_PARALLEL
-static herr_t
-H5AC_receive_candidate_list(H5AC_t * cache_ptr,
-                            int * num_entries_ptr,
-                            haddr_t ** haddr_buf_ptr_ptr)
+herr_t
+H5AC_retag_copied_metadata(const H5F_t *f, haddr_t metadata_tag) 
 {
-    hbool_t		 success = FALSE;
-    H5AC_aux_t         * aux_ptr;
-    haddr_t	       * haddr_buf_ptr = NULL;
-    MPI_Offset         * MPI_Offset_buf_ptr = NULL;
-    int                  mpi_result;
-    int			 num_entries;
-    herr_t               ret_value = SUCCEED;    /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-    HDassert( aux_ptr->mpi_rank != 0 );
-    HDassert( aux_ptr-> metadata_write_strategy == 
-              H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED );
-
-    HDassert( num_entries_ptr != NULL );
-    HDassert( *num_entries_ptr == 0 );
-
-    HDassert( haddr_buf_ptr_ptr != NULL );
-    HDassert( *haddr_buf_ptr_ptr == NULL );
-
-
-    /* First receive the number of entries in the list so that we
-     * can set up a buffer to receive them.  If there aren't
-     * any, we are done.
-     */
-    if(MPI_SUCCESS != (mpi_result = MPI_Bcast(&num_entries, 1, MPI_INT, 0, aux_ptr->mpi_comm)))
-        HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 1", mpi_result)
-
-    if(num_entries > 0) {
-        size_t buf_size;
-        int i;
-
-        /* allocate buffers to store the list of entry base addresses in */
-        buf_size = sizeof(MPI_Offset) * (size_t)num_entries;
-
-        if(NULL == (MPI_Offset_buf_ptr = (MPI_Offset *)H5MM_malloc(buf_size)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for receive buffer")
-        if(NULL == (haddr_buf_ptr = (haddr_t *)H5MM_malloc(sizeof(haddr_t) * (size_t)num_entries)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for haddr buffer")
-
-        /* Now receive the list of candidate entries
-         *
-         * The peculiar structure of the following call to MPI_Bcast is
-         * due to MPI's (?) failure to believe in the MPI_Offset type.
-         * Thus the element type is MPI_BYTE, with size equal to the
-         * buf_size computed above.
-         */
-        if(MPI_SUCCESS != (mpi_result = MPI_Bcast((void *)MPI_Offset_buf_ptr, (int)buf_size, MPI_BYTE, 0, aux_ptr->mpi_comm)))
-            HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 2", mpi_result)
-
-        /* translate the MPI_Offsets to haddr_t */
-        i = 0;
-        while(i < num_entries) {
-            haddr_buf_ptr[i] = H5FD_mpi_MPIOff_to_haddr(MPI_Offset_buf_ptr[i]);
-
-            if(haddr_buf_ptr[i] == HADDR_UNDEF)
-                HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "can't convert MPI off to haddr")
-
-            i++;
-        } /* end while */
-    } /* end if */
-
-    success = TRUE;
-
-done:
-    if(MPI_Offset_buf_ptr != NULL)
-        MPI_Offset_buf_ptr = (MPI_Offset *)H5MM_xfree((void *)MPI_Offset_buf_ptr);
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    if(success) {
-        /* finally, pass the number of entries and the buffer pointer 
-         * back to the caller.  Do this so that we can use the same code
-         * to apply the candidate list to all the processes.
-         */
-        *num_entries_ptr = num_entries;
-        *haddr_buf_ptr_ptr = haddr_buf_ptr;
-    } /* end if */
-    else {
-        if(haddr_buf_ptr != NULL)
-            haddr_buf_ptr = (haddr_t *)H5MM_xfree((void *)haddr_buf_ptr);
-    } /* end else */
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+     
+    /* Call cache-level function to re-tag entries with the COPIED tag */
+    H5C_retag_entries(f->shared->cache, H5AC__COPIED_TAG, metadata_tag);
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_receive_candidate_list() */
-#endif /* H5_HAVE_PARALLEL */
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5AC_retag_copied_metadata */
 
 

-/*-------------------------------------------------------------------------
- * Function:    H5AC_rsp__dist_md_write__flush
- *
- * Purpose:     Routine for handling the details of running a sync point
- *		that is triggered by a flush -- which in turn must have been
- *		triggered by either a flush API call or a file close --
- *		when the distributed metadata write strategy is selected.  
- *
- *		Upon entry, each process generates it own candidate list, 
- *              being a sorted list of all dirty metadata entries currently 
- *		in the metadata cache.  Note that this list must be idendical 
- *		across all processes, as all processes see the same stream 
- *		of dirty metadata coming in, and use the same lists of 
- *		candidate entries at each sync point.  (At first glance, this 
- *		argument sounds circular, but think of it in the sense of
- *		a recursive proof).
- *
- *		If this this list is empty, we are done, and the function 
- *		returns
- *
- *		Otherwise, after the sorted list dirty metadata entries is 
- *		constructed, each process uses the same algorithm to assign 
- *		each entry on the candidate list to exactly one process for 
- *		flushing.
- *
- *		At this point, all processes participate in a barrier to
- *		avoid messages from the past/future bugs.
- *
- *		Each process then flushes the entries assigned to it, and 
- *		marks all other entries on the candidate list as clean.
+/*------------------------------------------------------------------------------
+ * Function:    H5AC_flush_tagged_metadata()
  *
- *		Finally, all processes participate in a second barrier to 
- *		avoid messages from the past/future bugs.
+ * Purpose:     Wrapper for cache level function which flushes all metadata
+ *              that contains the specific tag. 
+ * 
+ * Return:      SUCCEED on success, FAIL otherwise.
  *
- *		At the end of this process, process 0 and only process 0
- *		must tidy up its lists of dirtied and cleaned entries.   
- *		These lists are not used in the distributed metadata write
- *		strategy, but they must be maintained should we shift 
- *		to a strategy that uses them.
+ * Programmer:  Mike McGreevy
+ *              May 19, 2010
  *
- * Return:      Success:        non-negative
- *
- *              Failure:        negative
- *
- * Programmer:  John Mainzer
- *              April 28, 2010
- *
- *-------------------------------------------------------------------------
+ *------------------------------------------------------------------------------
  */
-#ifdef H5_HAVE_PARALLEL
 herr_t
-H5AC_rsp__dist_md_write__flush(H5F_t *f, 
-                               hid_t dxpl_id, 
-                               H5AC_t * cache_ptr)
+H5AC_flush_tagged_metadata(H5F_t * f, haddr_t metadata_tag, hid_t dxpl_id)
 {
-    int		 mpi_code;
-    int          num_entries = 0;
-    haddr_t    * haddr_buf_ptr = NULL;
-    H5AC_aux_t * aux_ptr;
-    herr_t	 ret_value = SUCCEED;   /* Return value */
-
+    /* Variable Declarations */
+    herr_t ret_value = SUCCEED;
+ 
+    /* Function Enter Macro */   
     FUNC_ENTER_NOAPI(FAIL)
 
-    HDassert( f != NULL );
-    HDassert( f->shared->cache == cache_ptr );
-
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-    HDassert( aux_ptr->metadata_write_strategy == 
-              H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED );
-
-    /* first construct the candidate list -- initially, this will be in the 
-     * form of a skip list.  We will convert it later.
-     */
-    if(H5C_construct_candidate_list__clean_cache(cache_ptr) < 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't construct candidate list.")
-
-    if(aux_ptr->candidate_slist_len > 0) {
-        herr_t	 result;
-
-        /* convert the candidate list into the format we
-         * are used to receiving from process 0.
-         */
-        if(H5AC_copy_candidate_list_to_buffer(cache_ptr, &num_entries, &haddr_buf_ptr, NULL, NULL) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't construct candidate buffer.")
-
-        /* initial sync point barrier */
-        if(MPI_SUCCESS != (mpi_code = MPI_Barrier(aux_ptr->mpi_comm)))
-            HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed 1", mpi_code)
-
-        /* apply the candidate list */
-        aux_ptr->write_permitted = TRUE;
-
-        result = H5C_apply_candidate_list(f,
-                                          dxpl_id,
-                                          dxpl_id,
-                                          cache_ptr,
-                                          num_entries,
-                                          haddr_buf_ptr,
-                                          aux_ptr->mpi_rank,
-                                          aux_ptr->mpi_size);
-
-        aux_ptr->write_permitted = FALSE;
-
-        if(result < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't apply candidate list.")
-
-        /* this code exists primarily for the test bed -- it allows us to
-         * enforce posix semantics on the server that pretends to be a 
-         * file system in our parallel tests.
-         */
-        if(aux_ptr->write_done != NULL)
-            (aux_ptr->write_done)();
-
-        /* final sync point barrier */
-        if(MPI_SUCCESS != (mpi_code = MPI_Barrier(aux_ptr->mpi_comm)))
-            HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed 1", mpi_code)
-
-	/* if this is process zero, tidy up the dirtied,
-         * and flushed and still clean lists.
-         */
-        if(aux_ptr->mpi_rank == 0) {
-            if(H5AC_tidy_cache_0_lists(cache_ptr, num_entries, haddr_buf_ptr) < 0)
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't tidy up process 0 lists.")
-        } /* end if */
-    } /* end if */
+    /* Assertions */
+    HDassert(f);
+    HDassert(f->shared);
 
-    /* if it is defined, call the sync point done callback.  Note
-     * that this callback is defined purely for testing purposes,
-     * and should be undefined under normal operating circumstances.
-     */
-    if(aux_ptr->sync_point_done != NULL)
-        (aux_ptr->sync_point_done)(num_entries, haddr_buf_ptr);
+    /* Call cache level function to flush metadata entries with specified tag */
+    if(H5C_flush_tagged_entries(f, dxpl_id, metadata_tag) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Cannot flush metadata")
 
 done:
-    if(haddr_buf_ptr != NULL)
-        haddr_buf_ptr = (haddr_t *)H5MM_xfree((void *)haddr_buf_ptr);
-
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_rsp__dist_md_write__flush() */
-#endif /* H5_HAVE_PARALLEL */
+} /* H5AC_flush_tagged_metadata */
 
 

-/*-------------------------------------------------------------------------
- * Function:    H5AC_rsp__dist_md_write__flush_to_min_clean
- *
- * Purpose:     Routine for handling the details of running a sync point
- *		triggered by the accumulation of dirty metadata (as 
- *		opposed to a flush call to the API) when the distributed
- *		metadata write strategy is selected.
- *
- *		After invocation and initial sanity checking this function
- *		first checks to see if evictions are enabled -- if they 
- *		are not, the function does nothing and returns.
- *
- *		Otherwise, process zero constructs a list of entries to 
- *		be flushed in order to bring the process zero cache back
- *		within its min clean requirement.  Note that this list 
- *		(the candidate list) may be empty.
- *
- *              Then, all processes participate in a barrier.
- *
- *		After the barrier, process 0 broadcasts the number of 
- *		entries in the candidate list prepared above, and all 
- *		other processes receive this number.
+/*------------------------------------------------------------------------------
+ * Function:    H5AC_evict_tagged_metadata()
  *
- *		If this number is zero, we are done, and the function
- *		returns without further action.
+ * Purpose:     Wrapper for cache level function which flushes all metadata
+ *              that contains the specific tag. 
+ * 
+ * Return:      SUCCEED on success, FAIL otherwise.
  *
- *		Otherwise, process 0 broadcasts the sorted list of 
- *		candidate entries, and all other processes receive it.
- *
- *		Then, each process uses the same algorithm to assign 
- *		each entry on the candidate list to exactly one process 
- *		for flushing.
- *
- *		Each process then flushes the entries assigned to it, and 
- *		marks all other entries on the candidate list as clean.
- *
- *		Finally, all processes participate in a second barrier to 
- *		avoid messages from the past/future bugs.
- *
- *		At the end of this process, process 0 and only process 0
- *		must tidy up its lists of dirtied and cleaned entries.   
- *		These lists are not used in the distributed metadata write
- *		strategy, but they must be maintained should we shift 
- *		to a strategy that uses them.
- *
- * Return:      Success:        non-negative
- *
- *              Failure:        negative
- *
- * Programmer:  John Mainzer
- *              April 28, 2010
+ * Programmer:  Mike McGreevy
+ *              May 19, 2010
  *
- *-------------------------------------------------------------------------
+ *------------------------------------------------------------------------------
  */
-#ifdef H5_HAVE_PARALLEL
 herr_t
-H5AC_rsp__dist_md_write__flush_to_min_clean(H5F_t *f, 
-                                            hid_t dxpl_id, 
-                                            H5AC_t * cache_ptr)
+H5AC_evict_tagged_metadata(H5F_t * f, haddr_t metadata_tag, hid_t dxpl_id)
 {
-    hbool_t 	 evictions_enabled;
-    H5AC_aux_t * aux_ptr;
-    herr_t	 ret_value = SUCCEED;   /* Return value */
-
+    /* Variable Declarations */
+    herr_t ret_value = SUCCEED;
+ 
+    /* Function Enter Macro */   
     FUNC_ENTER_NOAPI(FAIL)
 
-    HDassert( f != NULL );
-    HDassert( f->shared->cache == cache_ptr );
-
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-    HDassert( aux_ptr->metadata_write_strategy == 
-              H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED );
-
-    /* Query if evictions are allowed */
-    if(H5C_get_evictions_enabled((const H5C_t *)cache_ptr, &evictions_enabled) < 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5C_get_evictions_enabled() failed.")
-
-    if(evictions_enabled) {
-        /* construct candidate list -- process 0 only */
-        if(aux_ptr->mpi_rank == 0) {
-            if(H5AC_construct_candidate_list(cache_ptr, aux_ptr, H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN) < 0)
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't construct candidate list.")
-        } /* mpi rank == 0 */
+    /* Assertions */
+    HDassert(f);
+    HDassert(f->shared);
 
-        /* propagate and apply candidate list -- all processes */
-        if(H5AC_propagate_and_apply_candidate_list(f, dxpl_id, cache_ptr) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't propagate and apply candidate list.")
-    } /* evictions enabled */
+    /* Call cache level function to evict metadata entries with specified tag */
+    if(H5C_evict_tagged_entries(f, dxpl_id, metadata_tag)<0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Cannot evict metadata")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_rsp__dist_md_write__flush_to_min_clean() */
-#endif /* H5_HAVE_PARALLEL */
+
+} /* H5AC_evict_tagged_metadata */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5AC_rsp__p0_only__flush
- *
- * Purpose:     Routine for handling the details of running a sync point
- *		that is triggered a flush -- which in turn must have been
- *		triggered by either a flush API call or a file close -- 
- *		when the process 0 only metadata write strategy is selected.  
- *
- *              First, all processes participate in a barrier.
+ * Function:    H5AC_cork
  *
- *		Then process zero flushes all dirty entries, and broadcasts
- *		they number of clean entries (if any) to all the other 
- *		caches.
+ * Purpose:     To cork/uncork/get cork status for an object
  *
- *		If this number is zero, we are done.
- *
- *		Otherwise, process 0 broadcasts the list of cleaned 
- *		entries, and all other processes which are part of this
- *		file group receive it, and mark the listed entries as
- *		clean in their caches.
- *
- *		Since all processes have the same set of dirty 
- *		entries at the beginning of the sync point, and all
- *		entries that will be written are written before 
- *		process zero broadcasts the number of cleaned entries,
- *		there is no need for a closing barrier.
- *
- * Return:      Success:        non-negative
- *
- *              Failure:        negative
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  John Mainzer
- *              April 28, 2010
+ * Programmer:  Vailin Choi; Jan 2014
  *
  *-------------------------------------------------------------------------
  */
-#ifdef H5_HAVE_PARALLEL
 herr_t
-H5AC_rsp__p0_only__flush(H5F_t *f, 
-                         hid_t dxpl_id, 
-                         H5AC_t * cache_ptr)
+H5AC_cork(H5F_t *f, haddr_t obj_addr, unsigned action, hbool_t *corked)
 {
-    int		 mpi_code;
-    H5AC_aux_t * aux_ptr;
-    herr_t	 ret_value = SUCCEED;   /* Return value */
+    herr_t ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    HDassert( f != NULL );
-    HDassert( f->shared->cache == cache_ptr );
-
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-    HDassert( aux_ptr->metadata_write_strategy == 
-              H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY );
-
-
-    /* to prevent "messages from the future" we must 
-     * synchronize all processes before we start the flush.  
-     * Hence the following barrier.
-     */
-    if(MPI_SUCCESS != (mpi_code = MPI_Barrier(aux_ptr->mpi_comm)))
-        HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed 1", mpi_code)
-
-    /* Flush data to disk, from rank 0 process */
-    if(aux_ptr->mpi_rank == 0) {
-        herr_t        result;
-
-        aux_ptr->write_permitted = TRUE;
-
-        result = H5C_flush_cache(f, dxpl_id, dxpl_id, H5AC__NO_FLAGS_SET);
-
-        aux_ptr->write_permitted = FALSE;
-
-        if(result < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush.")
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->cache);
+    HDassert(H5F_addr_defined(obj_addr));
+    HDassert(action == H5AC__SET_CORK || action == H5AC__UNCORK || action == H5AC__GET_CORKED);
 
-        if(aux_ptr->write_done != NULL)
-            (aux_ptr->write_done)();
-    } /* end if */
+    if(action == H5AC__GET_CORKED)
+	HDassert(corked);
 
-    /* Propagate cleaned entries to other ranks. */
-    if(H5AC_propagate_flushed_and_still_clean_entries_list(f, H5AC_dxpl_id, cache_ptr) < 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't propagate clean entries list.")
+    if(H5C_cork(f->shared->cache, obj_addr, action, corked) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Cannot perform the cork action")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_rsp__p0_only__flush() */
-#endif /* H5_HAVE_PARALLEL */
+} /* H5AC_cork() */
 
+#if H5AC_DO_TAGGING_SANITY_CHECKS
 

 /*-------------------------------------------------------------------------
- * Function:    H5AC_rsp__p0_only__flush_to_min_clean
- *
- * Purpose:     Routine for handling the details of running a sync point
- *		triggered by the accumulation of dirty metadata (as 
- *		opposed to a flush call to the API) when the process 0
- *		only metadata write strategy is selected.
- *
- *		After invocation and initial sanity checking this function
- *		first checks to see if evictions are enabled -- if they 
- *		are not, the function does nothing and returns.
- *
- *              Otherwise, all processes participate in a barrier.
- *
- *		After the barrier, if this is process 0, the function 
- *		causes the cache to flush sufficient entries to get the 
- *		cache back within its minimum clean fraction, and broadcast 
- *		the number of entries which have been flushed since 
- *		the last sync point, and are still clean.
- *
- *		If this number is zero, we are done.
  *
- *		Otherwise, process 0 broadcasts the list of cleaned 
- *		entries, and all other processes which are part of this
- *		file group receive it, and mark the listed entries as
- *		clean in their caches.
+ * Function:    H5AC__verify_tag
  *
- *		Since all processes have the same set of dirty 
- *		entries at the beginning of the sync point, and all
- *		entries that will be written are written before 
- *		process zero broadcasts the number of cleaned entries,
- *		there is no need for a closing barrier.
+ * Purpose:     Performs sanity checking on an entry type and tag value
+ *              stored in a supplied dxpl_id.
  *
- * Return:      Success:        non-negative
+ * Return:      SUCCEED or FAIL.
  *
- *              Failure:        negative
- *
- * Programmer:  John Mainzer
- *              April 28, 2010
+ * Programmer:  Mike McGreevy
+ *              October 20, 2010
  *
  *-------------------------------------------------------------------------
  */
-#ifdef H5_HAVE_PARALLEL
-herr_t
-H5AC_rsp__p0_only__flush_to_min_clean(H5F_t *f, 
-                                      hid_t dxpl_id, 
-                                      H5AC_t * cache_ptr)
+static herr_t
+H5AC__verify_tag(hid_t dxpl_id, const H5AC_class_t * type)
 {
-    hbool_t 	 evictions_enabled;
-    H5AC_aux_t * aux_ptr;
-    herr_t	 ret_value = SUCCEED;   /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    HDassert( f != NULL );
-    HDassert( f->shared->cache == cache_ptr );
-
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-    HDassert( aux_ptr->metadata_write_strategy == 
-              H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY );
-
-    /* Query if evictions are allowed */
-    if(H5C_get_evictions_enabled((const H5C_t *)cache_ptr, &evictions_enabled) < 0)
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5C_get_evictions_enabled() failed.")
-
-    /* Flush if evictions are allowed -- following call
-     * will cause process 0 to flush to min clean size,
-     * and then propagate the newly clean entries to the
-     * other processes.
-     *
-     * Otherwise, do nothing.
-     */
-    if(evictions_enabled) {
-        int          mpi_code;
-
-        /* to prevent "messages from the future" we must synchronize all
-         * processes before we start the flush.  This synchronization may
-         * already be done -- hence the do_barrier parameter.
-         */
-        if(MPI_SUCCESS != (mpi_code = MPI_Barrier(aux_ptr->mpi_comm)))
-            HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_code)
-
-        if(0 == aux_ptr->mpi_rank) {
-            herr_t	 result;
-
-            /* here, process 0 flushes as many entries as necessary to 
-             * comply with the currently specified min clean size.
-             * Note that it is quite possible that no entries will be 
-             * flushed.
-             */
-            aux_ptr->write_permitted = TRUE;
-
-            result = H5C_flush_to_min_clean(f, dxpl_id, H5AC_dxpl_id);
-
-            aux_ptr->write_permitted = FALSE;
-
-            if(result < 0)
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_flush_to_min_clean() failed.")
+    H5C_tag_t tag;
+    H5P_genplist_t * dxpl;
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /* Get the dataset transfer property list */
+    if(NULL == (dxpl = (H5P_genplist_t *)H5I_object_verify(dxpl_id, H5I_GENPROP_LST)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+
+    /* Get the tag from the DXPL */
+    if( (H5P_get(dxpl, "H5C_tag", &tag)) < 0 )
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to query property value");
+
+    /* Perform some sanity checks on tag value. Certain entry
+     * types require certain tag values, so check that these
+     * constraints are met. */
+    if(tag.value == H5AC__IGNORE_TAG)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "cannot ignore a tag while doing verification.")
+    else if(tag.value == H5AC__INVALID_TAG)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "no metadata tag provided")
+    else {
 
-            /* this call exists primarily for the test code -- it is used
- 	     * to enforce POSIX semantics on the process used to simulate
- 	     * reads and writes in t_cache.c.
-             */
-            if(aux_ptr->write_done != NULL)
-                (aux_ptr->write_done)();
-        } /* end if */
+        /* Perform some sanity checks on tag value. Certain entry
+         * types require certain tag values, so check that these
+         * constraints are met. */
 
-        if(H5AC_propagate_flushed_and_still_clean_entries_list(f, dxpl_id, cache_ptr) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't propagate clean entries list.")
-    } /* end if */
+        /* Superblock */
+        if(type->id == H5AC_SUPERBLOCK_ID || type->id == H5AC_DRVRINFO_ID) {
+            if(tag.value != H5AC__SUPERBLOCK_TAG)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "superblock/driver-info not tagged with H5AC__SUPERBLOCK_TAG")
+            if(tag.globality != H5C_GLOBALITY_MAJOR)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "superblock/driver-info globality not marked with H5C_GLOBALITY_MAJOR")
+        }
+        else {
+            if(tag.value == H5AC__SUPERBLOCK_TAG)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "H5AC__SUPERBLOCK_TAG applied to non-superblock entry")
+        }
+    
+        /* Free Space Manager */
+        if((type->id == H5AC_FSPACE_HDR_ID) || (type->id == H5AC_FSPACE_SINFO_ID)) {
+            if(tag.value != H5AC__FREESPACE_TAG)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "freespace entry not tagged with H5AC__FREESPACE_TAG")
+            if(tag.globality != H5C_GLOBALITY_MINOR)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "freespace entry globality not marked with H5C_GLOBALITY_MINOR")
+        }
+        else {
+            if(tag.value == H5AC__FREESPACE_TAG)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "H5AC__FREESPACE_TAG applied to non-freespace entry")
+        }
+    
+        /* SOHM */
+        if((type->id == H5AC_SOHM_TABLE_ID) || (type->id == H5AC_SOHM_LIST_ID)) { 
+            if(tag.value != H5AC__SOHM_TAG)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "sohm entry not tagged with H5AC__SOHM_TAG")
+            if(tag.globality != H5C_GLOBALITY_MAJOR)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "sohm entry globality not marked with H5C_GLOBALITY_MAJOR")
+        }
+    
+        /* Global Heap */
+        if(type->id == H5AC_GHEAP_ID) {
+            if(tag.value != H5AC__GLOBALHEAP_TAG)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "global heap not tagged with H5AC__GLOBALHEAP_TAG")
+            if(tag.globality != H5C_GLOBALITY_MAJOR)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "global heap entry globality not marked with H5C_GLOBALITY_MAJOR")
+        }
+        else {
+            if(tag.value == H5AC__GLOBALHEAP_TAG)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "H5AC__GLOBALHEAP_TAG applied to non-globalheap entry")
+        }
+    } /* end else */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_rsp__p0_only__flush_to_min_clean() */
-#endif /* H5_HAVE_PARALLEL */
+} /* H5AC__verify_tag */
+#endif /* H5AC_DO_TAGGING_SANITY_CHECKS */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5AC_run_sync_point
+ * Function:    H5AC_get_entry_ring
  *
- * Purpose:     Top level routine for managing a sync point between all
- *		meta data caches in the parallel case.  Since all caches 
- *		see the same sequence of dirty metadata, we simply count
- *		bytes of dirty metadata, and run a sync point whenever the
- *		number of dirty bytes of metadata seen since the last
- *		sync point exceeds a threshold that is common across all
- *		processes.  We also run sync points in response to 
- *		HDF5 API calls triggering either a flush or a file close.
+ * Purpose:     Given a file address, retrieve the ring for an entry at that
+ *              address.
  *
- *		In earlier versions of PHDF5, only the metadata cache with 
- *		mpi rank 0 was allowed to write to file.  All other 
- *		metadata caches on processes with rank greater than 0 were
- *		required to retain dirty entries until they were notified 
- *		that the entry is was clean.
+ * 		On error, the value of *ring is not modified.
  *
- *		This function was created to make it easier for us to 
- *		experiment with other options, as it is a single point 
- *		for the execution of sync points.  
- *
- * Return:      Success:        non-negative
- *
- *              Failure:        negative
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  John Mainzer
- *              March 11, 2010
+ * Programmer:  Quincey Koziol
+ *              9/8/15
  *
  *-------------------------------------------------------------------------
  */
-#ifdef H5_HAVE_PARALLEL
 herr_t
-H5AC_run_sync_point(H5F_t *f, 
-                    hid_t dxpl_id, 
-		    int sync_point_op)
+H5AC_get_entry_ring(const H5F_t *f, haddr_t addr, H5AC_ring_t *ring)
 {
-    H5AC_t * cache_ptr;
-    H5AC_aux_t * aux_ptr;
-    herr_t	 ret_value = SUCCEED;   /* Return value */
+    herr_t      ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    HDassert( f != NULL );
-
-    cache_ptr = f->shared->cache;
-
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-
-    HDassert( ( sync_point_op == H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN ) ||
-              ( sync_point_op == H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED ) );
-
-#if H5AC_DEBUG_DIRTY_BYTES_CREATION
-    HDfprintf(stdout,
-              "%d:H5AC_propagate...:%d: (u/uu/i/iu/r/ru) = %d/%d/%d/%d/%d/%d\n",
-              (int)(aux_ptr->mpi_rank),
-              (int)(aux_ptr->dirty_bytes_propagations),
-              (int)(aux_ptr->unprotect_dirty_bytes),
-              (int)(aux_ptr->unprotect_dirty_bytes_updates),
-              (int)(aux_ptr->insert_dirty_bytes),
-              (int)(aux_ptr->insert_dirty_bytes_updates),
-              (int)(aux_ptr->rename_dirty_bytes),
-              (int)(aux_ptr->rename_dirty_bytes_updates));
-#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
-
-    switch(aux_ptr->metadata_write_strategy) {
-        case H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY:
-	    switch(sync_point_op) {
-                case H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN:
-	            if(H5AC_rsp__p0_only__flush_to_min_clean(f, dxpl_id, cache_ptr) < 0)
-                        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5AC_rsp__p0_only__flush_to_min_clean() failed.")
-		    break;
-
-		case H5AC_SYNC_POINT_OP__FLUSH_CACHE:
-	            if(H5AC_rsp__p0_only__flush(f, dxpl_id, cache_ptr) < 0)
-                        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5AC_rsp__p0_only__flush() failed.")
-		    break;
-
-		default:
-                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unknown flush op");
-		    break;
-	    } /* end switch */
-	    break;
-
-	case H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED:
-	    switch(sync_point_op) {
-                case H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN:
-	            if(H5AC_rsp__dist_md_write__flush_to_min_clean(f, dxpl_id, cache_ptr) < 0)
-                        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5AC_rsp__dist_md_write__flush() failed.")
-		    break;
-
-		case H5AC_SYNC_POINT_OP__FLUSH_CACHE:
-	            if(H5AC_rsp__dist_md_write__flush(f, dxpl_id, cache_ptr) < 0)
-                        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5AC_rsp__dist_md_write__flush() failed.")
-		    break;
-
-		default:
-                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unknown flush op");
-		    break;
-	    } /* end switch */
-	    break;
-
-	default:
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown metadata write strategy.")
-	    break;
-    } /* end switch */
-
-    /* reset the dirty bytes count */
-    aux_ptr->dirty_bytes = 0;
+    /* Sanity check */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(ring);
 
-#if H5AC_DEBUG_DIRTY_BYTES_CREATION
-    aux_ptr->dirty_bytes_propagations     += 1;
-    aux_ptr->unprotect_dirty_bytes         = 0;
-    aux_ptr->unprotect_dirty_bytes_updates = 0;
-    aux_ptr->insert_dirty_bytes            = 0;
-    aux_ptr->insert_dirty_bytes_updates    = 0;
-    aux_ptr->rename_dirty_bytes            = 0;
-    aux_ptr->rename_dirty_bytes_updates    = 0;
-#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
+    /* Retrieve the ring value for the entry at address */
+    if(H5C_get_entry_ring(f, addr, ring) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "Can't retrieve ring for entry")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_run_sync_point() */
-#endif /* H5_HAVE_PARALLEL */
+} /* H5AC_get_entry_ring() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5AC_tidy_cache_0_lists()
- *
- * Purpose:     In the distributed metadata write strategy, not all dirty
- *		entries are written by process 0 -- thus we must tidy
- *		up the dirtied, and flushed and still clean lists 
- *		maintained by process zero after each sync point.
- *
- *		This procedure exists to tend to this issue.
- *
- *		At this point, all entries that process 0 cleared should
- *		have been removed from both the dirty and flushed and 
- *		still clean lists, and entries that process 0 has flushed
- *		should have been removed from the dirtied list and added
- *		to the flushed and still clean list.
+ * Function:       H5AC_set_ring
  *
- *		However, since the distributed metadata write strategy
- *		doesn't make use of these lists, the objective is simply
- *		to maintain these lists in consistent state that allows
- *		them to be used should the metadata write strategy change
- *		to one that uses these lists.
+ * Purpose:        Routine to set the ring on a DXPL (for passing through
+ *                 to the metadata cache).
  *
- *		Thus for our purposes, all we need to do is remove from 
- *		the dirtied and flushed and still clean lists all
- *		references to entries that appear in the candidate list.
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
  *
- * Return:      Success:        non-negative
- *
- *              Failure:        negative
- *
- * Programmer:  John Mainzer
- *              4/20/10
+ * Programmer:     Quincey Koziol
+ *                 Tuesday, September 8, 2015
  *
  *-------------------------------------------------------------------------
  */
-#ifdef H5_HAVE_PARALLEL
-static herr_t
-H5AC_tidy_cache_0_lists(H5AC_t * cache_ptr,
-                        int num_candidates,
-                        haddr_t * candidates_list_ptr)
-
+herr_t
+H5AC_set_ring(hid_t dxpl_id, H5AC_ring_t ring, H5P_genplist_t **dxpl,
+    H5AC_ring_t *orig_ring)
 {
-    int                  i;
-    H5AC_aux_t         * aux_ptr;
-    herr_t               ret_value = SUCCEED;   /* Return value */
+    herr_t ret_value = SUCCEED;   /* return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
-
-    HDassert( aux_ptr != NULL );
-    HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
-    HDassert( aux_ptr->metadata_write_strategy == 
-              H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED );
-    HDassert( aux_ptr->mpi_rank == 0 );
-    HDassert( num_candidates > 0 );
-    HDassert( candidates_list_ptr != NULL );
-
-    /* clean up dirtied and flushed and still clean lists by removing 
-     * all entries on the candidate list.  Cleared entries should 
-     * have been removed from both the dirty and cleaned lists at 
-     * this point, flushed entries should have been added to the 
-     * cleaned list.  However, for this metadata write strategy, 
-     * we just want to remove all references to the candidate entries.
-     */
-    for(i = 0; i < num_candidates; i++) {
-        H5AC_slist_entry_t * d_slist_entry_ptr;
-        H5AC_slist_entry_t * c_slist_entry_ptr;
-        haddr_t              addr;
-
-        addr = candidates_list_ptr[i];
-
-        /* addr must be either on the dirtied list, or on the flushed 
-         * and still clean list.  Remove it.
-         */
-        d_slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_search(aux_ptr->d_slist_ptr, (void *)&addr);
-        if(d_slist_entry_ptr != NULL) {
-            HDassert(d_slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC);
-            HDassert(d_slist_entry_ptr->addr == addr);
-
-            if(H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&addr)) != d_slist_entry_ptr)
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, "Can't delete entry from dirty entry slist.")
-
-            d_slist_entry_ptr->magic = 0;
-            d_slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, d_slist_entry_ptr);
-
-            aux_ptr->d_slist_len -= 1;
-
-            HDassert(aux_ptr->d_slist_len >= 0);
-        } /* end if */
-
-        c_slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_search(aux_ptr->c_slist_ptr, (void *)&addr);
-        if(c_slist_entry_ptr != NULL) {
-            HDassert(c_slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC);
-            HDassert(c_slist_entry_ptr->addr == addr);
-
-            if(H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr)) != c_slist_entry_ptr)
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, "Can't delete entry from clean entry slist.")
-
-            c_slist_entry_ptr->magic = 0;
-            c_slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, c_slist_entry_ptr);
-
-            aux_ptr->c_slist_len -= 1;
+    /* Sanity checks */
+    HDassert(dxpl);
+    HDassert(orig_ring);
 
-            HDassert( aux_ptr->c_slist_len >= 0 );
-        } /* end if */
-    } /* end for */
+    /* Set the ring type in the DXPL */
+    if(NULL == ((*dxpl) = (H5P_genplist_t *)H5I_object_verify(dxpl_id, H5I_GENPROP_LST)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+    if((H5P_get((*dxpl), H5AC_RING_NAME, orig_ring)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get original ring value")
+    if((H5P_set((*dxpl), H5AC_RING_NAME, &ring)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set ring value")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_tidy_cache_0_lists() */
-#endif /* H5_HAVE_PARALLEL */
+} /* end H5AC_set_ring() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5AC_flush_entries
+ * Function:       H5AC_reset_ring
  *
- * Purpose:     Flush the metadata cache associated with the specified file,
- *              only writing from rank 0, but propagating the cleaned entries
- *              to all ranks.
+ * Purpose:        Routine to reset the original ring on a DXPL (after passing
+ *                 through to the metadata cache).
  *
- * Return:      Non-negative on success/Negative on failure if there was a
- *              request to flush all items and something was protected.
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
  *
- * Programmer:  Quincey Koziol
- *              koziol at hdfgroup.org
- *              Aug 22 2009
+ * Programmer:     Quincey Koziol
+ *                 Tuesday, September 8, 2015
  *
  *-------------------------------------------------------------------------
  */
-#ifdef H5_HAVE_PARALLEL
 herr_t
-H5AC_flush_entries(H5F_t *f)
+H5AC_reset_ring(H5P_genplist_t *dxpl, H5AC_ring_t orig_ring)
 {
-    herr_t        ret_value = SUCCEED;      /* Return value */
+    herr_t ret_value = SUCCEED;   /* return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI(FAIL)
 
-    HDassert(f);
-    HDassert(f->shared->cache);
+    /* Reset the ring in the DXPL, if it's been changed */
+    if(orig_ring) {
+        /* Sanity check */
+        HDassert(dxpl);
 
-    /* Check if we have >1 ranks */
-    if(f->shared->cache->aux_ptr) {
-        if(H5AC_run_sync_point(f, H5AC_dxpl_id, H5AC_SYNC_POINT_OP__FLUSH_CACHE) < 0)
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't run sync point.")
+        if((H5P_set(dxpl, H5AC_RING_NAME, &orig_ring)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set property value")
     } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5AC_flush_entries() */
-#endif /* H5_HAVE_PARALLEL */
+} /* end H5AC_reset_ring() */
 
diff --git a/src/H5AClog.c b/src/H5AClog.c
new file mode 100644
index 0000000..11579d8
--- /dev/null
+++ b/src/H5AClog.c
@@ -0,0 +1,892 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5AClog_json.c
+ *
+ * Purpose:             Functions for metadata cache logging in JSON format
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+#include "H5ACmodule.h"         /* This source code file is part of the H5AC module */
+#define H5C_FRIEND		        /* Suppress error about including H5Cpkg	        */
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"          /* Generic Functions                    */
+#include "H5ACpkg.h"            /* Metadata cache                       */
+#include "H5Cpkg.h"             /* Cache                                */
+#include "H5Eprivate.h"         /* Error handling                       */
+
+/****************/
+/* Local Macros */
+/****************/
+
+#define MSG_SIZE 128
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_create_cache_log_msg
+ *
+ * Purpose:     Write a log message for cache creation.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_create_cache_log_msg
+ *
+ * Purpose:     Write a log message for cache creation.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_create_cache_log_msg(H5AC_t *cache) 
+{
+    char msg[MSG_SIZE];
+    hbool_t orig_state;            /* saved "current logging" flag state */
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+{\n\
+\"create_time\":%lld,\n\
+\"messages\":\n\
+[\n\
+"
+    , (long long)time(NULL));
+
+    /* Since we're about to override the current logging flag,
+     * check the "log enabled" flag to see if we didn't get here
+     * by mistake.
+     */
+    if(!(cache->logging_enabled))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "attempt to write opening log message when logging is disabled")
+
+    /* Write the log message to the file
+     * Have to temporarily enable logging for this.
+     */
+    orig_state = cache->currently_logging;
+    cache->currently_logging = TRUE;
+    if(H5C_write_log_message(cache, msg) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+    cache->currently_logging = orig_state;
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__write_create_cache_log_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_destroy_cache_log_msg
+ *
+ * Purpose:     Write a log message for cache destruction.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_destroy_cache_log_msg(H5AC_t *cache)
+{
+    char msg[MSG_SIZE];
+    hbool_t orig_state;            /* saved "current logging" flag state */
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+],\n\
+\"close_time\":%lld,\n\
+}\n\
+"
+    , (long long)time(NULL));
+
+    /* Since we're about to override the current logging flag,
+     * check the "log enabled" flag to see if we didn't get here
+     * by mistake.
+     */
+    if(!(cache->logging_enabled))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "attempt to write closing log message when logging is disabled")
+
+    /* Write the log message to the file
+     * Have to temporarily enable logging for this.
+     */
+    orig_state = cache->currently_logging;
+    cache->currently_logging = TRUE;
+    if(H5C_write_log_message(cache, msg) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+    cache->currently_logging = orig_state;
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__write_destroy_cache_log_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_evict_cache_log_msg
+ *
+ * Purpose:     Write a log message for eviction of cache entries.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_evict_cache_log_msg(const H5AC_t *cache,
+                                herr_t fxn_ret_value)
+{
+    char msg[MSG_SIZE];
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+{\
+\"timestamp\":%lld,\
+\"action\":\"evict\",\
+\"returned\":%d\
+},\n\
+"
+    , (long long)time(NULL), (int)fxn_ret_value);
+
+    /* Write the log message to the file */
+    if(H5C_write_log_message(cache, msg) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__write_evict_cache_log_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_expunge_entry_log_msg
+ *
+ * Purpose:     Write a log message for expunge of cache entries.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_expunge_entry_log_msg(const H5AC_t *cache,
+                                  haddr_t address,
+                                  int type_id,
+                                  herr_t fxn_ret_value)
+{
+    char msg[MSG_SIZE];
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+{\
+\"timestamp\":%lld,\
+\"action\":\"expunge\",\
+\"address\":0x%lx,\
+\"type_id\":%d,\
+\"returned\":%d\
+},\n\
+"
+    , (long long)time(NULL), (unsigned long)address, (int)type_id, (int)fxn_ret_value);
+
+
+    /* Write the log message to the file */
+    if(H5C_write_log_message(cache, msg) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__write_expunge_entry_log_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_flush_cache_log_msg
+ *
+ * Purpose:     Write a log message for cache flushes.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_flush_cache_log_msg(const H5AC_t *cache,
+                                herr_t fxn_ret_value)
+{
+    char msg[MSG_SIZE];
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+{\
+\"timestamp\":%lld,\
+\"action\":\"flush\",\
+\"returned\":%d\
+},\n\
+"
+    , (long long)time(NULL), (int)fxn_ret_value);
+
+    /* Write the log message to the file */
+    if(H5C_write_log_message(cache, msg) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__write_flush_cache_log_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_insert_entry_log_msg
+ *
+ * Purpose:     Write a log message for insertion of cache entries.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_insert_entry_log_msg(const H5AC_t *cache,
+                                 haddr_t address,
+                                 int type_id,
+                                 unsigned flags,
+                                 size_t size,
+                                 herr_t fxn_ret_value)
+{
+    char msg[MSG_SIZE];
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+{\
+\"timestamp\":%lld,\
+\"action\":\"insert\",\
+\"address\":0x%lx,\
+\"flags\":0x%x,\
+\"type_id\":%d,\
+\"size\":%d,\
+\"returned\":%d\
+},\n\
+"
+    , (long long)time(NULL), (unsigned long)address, flags, type_id, 
+      (int)size, (int)fxn_ret_value);
+
+    /* Write the log message to the file */
+    if(H5C_write_log_message(cache, msg) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__write_insert_entry_log_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_mark_dirty_entry_log_msg
+ *
+ * Purpose:     Write a log message for marking cache entries as dirty.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_mark_dirty_entry_log_msg(const H5AC_t *cache,
+                                     const H5AC_info_t *entry,
+                                     herr_t fxn_ret_value)
+{
+    char msg[MSG_SIZE];
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+    HDassert(entry);
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+{\
+\"timestamp\":%lld,\
+\"action\":\"dirty\",\
+\"address\":0x%lx,\
+\"returned\":%d\
+},\n\
+"
+    , (long long)time(NULL), (unsigned long)entry->addr, (int)fxn_ret_value);
+
+    /* Write the log message to the file */
+    if(H5C_write_log_message(cache, msg) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__write_mark_dirty_entry_log_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_move_entry_log_msg
+ *
+ * Purpose:     Write a log message for moving a cache entry.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_move_entry_log_msg(const H5AC_t *cache,
+                               haddr_t old_addr,
+                               haddr_t new_addr,
+                               int type_id,
+                               herr_t fxn_ret_value)
+{
+    char msg[MSG_SIZE];
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+{\
+\"timestamp\":%lld,\
+\"action\":\"move\",\
+\"old_address\":0x%lx,\
+\"new_address\":0x%lx,\
+\"type_id\":%d,\
+\"returned\":%d\
+},\n\
+"
+    , (long long)time(NULL), (unsigned long)old_addr, 
+      (unsigned long)new_addr, type_id, (int)fxn_ret_value);
+
+    /* Write the log message to the file */
+    if(H5C_write_log_message(cache, msg) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__write_move_entry_log_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_pin_entry_log_msg
+ *
+ * Purpose:     Write a log message for pinning a cache entry.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_pin_entry_log_msg(const H5AC_t *cache,
+                              const H5AC_info_t *entry,
+                              herr_t fxn_ret_value)
+{
+    char msg[MSG_SIZE];
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+    HDassert(entry);
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+{\
+\"timestamp\":%lld,\
+\"action\":\"pin\",\
+\"address\":0x%lx,\
+\"returned\":%d\
+},\n\
+"
+    , (long long)time(NULL), (unsigned long)entry->addr, 
+      (int)fxn_ret_value);
+
+    /* Write the log message to the file */
+    if(H5C_write_log_message(cache, msg) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__write_pin_entry_log_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_create_fd_log_msg
+ *
+ * Purpose:     Write a log message for creating a flush dependency between
+ *              two cache entries.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_create_fd_log_msg(const H5AC_t *cache,
+                              const H5AC_info_t *parent,
+                              const H5AC_info_t *child,
+                              herr_t fxn_ret_value)
+{
+    char msg[MSG_SIZE];
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+    HDassert(parent);
+    HDassert(child);
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+{\
+\"timestamp\":%lld,\
+\"action\":\"create_fd\",\
+\"parent_addr\":0x%lx,\
+\"child_addr\":0x%lx,\
+\"returned\":%d\
+},\n\
+"
+    , (long long)time(NULL), (unsigned long)parent->addr, 
+      (unsigned long)child->addr, (int)fxn_ret_value);
+
+    /* Write the log message to the file */
+    if(H5C_write_log_message(cache, msg) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__write_create_fd_log_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_protect_entry_log_msg
+ *
+ * Purpose:     Write a log message for protecting a cache entry.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_protect_entry_log_msg(const H5AC_t *cache,
+                                  const H5AC_info_t *entry,
+                                  unsigned flags,
+                                  herr_t fxn_ret_value)
+{
+    char msg[MSG_SIZE];
+    char rw_s[16];
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+    HDassert(entry);
+
+    if(H5AC__READ_ONLY_FLAG == flags)
+        HDstrcpy(rw_s, "READ");
+    else 
+        HDstrcpy(rw_s, "WRITE");
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+{\
+\"timestamp\":%lld,\
+\"action\":\"protect\",\
+\"address\":0x%lx,\
+\"readwrite\":\"%s\",\
+\"size\":%d,\
+\"returned\":%d\
+},\n\
+"
+    , (long long)time(NULL), (unsigned long)entry->addr, 
+      rw_s, (int)entry->size, (int)fxn_ret_value);
+
+    /* Write the log message to the file */
+    if(H5C_write_log_message(cache, msg) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__write_protect_entry_log_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_resize_entry_log_msg
+ *
+ * Purpose:     Write a log message for resizing a cache entry.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_resize_entry_log_msg(const H5AC_t *cache,
+                                 const H5AC_info_t *entry,
+                                 size_t new_size,
+                                 herr_t fxn_ret_value)
+{
+    char msg[MSG_SIZE];
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+    HDassert(entry);
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+{\
+\"timestamp\":%lld,\
+\"action\":\"resize\",\
+\"address\":0x%lx,\
+\"new_size\":%d,\
+\"returned\":%d\
+},\n\
+"
+    , (long long)time(NULL), (unsigned long)entry->addr, 
+      (int)new_size, (int)fxn_ret_value);
+
+    /* Write the log message to the file */
+    if(H5C_write_log_message(cache, msg) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__write_resize_entry_log_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_unpin_entry_log_msg
+ *
+ * Purpose:     Write a log message for unpinning a cache entry.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_unpin_entry_log_msg(const H5AC_t *cache,
+                                const H5AC_info_t *entry,
+                                herr_t fxn_ret_value)
+{
+    char msg[MSG_SIZE];
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+    HDassert(entry);
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+{\
+\"timestamp\":%lld,\
+\"action\":\"unpin\",\
+\"address\":0x%lx,\
+\"returned\":%d\
+},\n\
+"
+    , (long long)time(NULL), (unsigned long)entry->addr, 
+      (int)fxn_ret_value);
+
+    /* Write the log message to the file */
+    if(H5C_write_log_message(cache, msg) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__write_unpin_entry_log_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_destroy_fd_log_msg
+ *
+ * Purpose:     Write a log message for destroying a flush dependency
+ *              between two cache entries.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_destroy_fd_log_msg(const H5AC_t *cache,
+                               const H5AC_info_t *parent,
+                               const H5AC_info_t *child,
+                               herr_t fxn_ret_value)
+{
+    char msg[MSG_SIZE];
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+    HDassert(parent);
+    HDassert(child);
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+{\
+\"timestamp\":%lld,\
+\"action\":\"destroy_fd\",\
+\"parent_addr\":0x%lx,\
+\"child_addr\":0x%lx,\
+\"returned\":%d\
+},\n\
+"
+    , (long long)time(NULL), (unsigned long)parent->addr, 
+      (unsigned long)child->addr, (int)fxn_ret_value);
+
+    /* Write the log message to the file */
+    if(H5C_write_log_message(cache, msg) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__write_destroy_fd_log_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_unprotect_entry_log_msg
+ *
+ * Purpose:     Write a log message for unprotecting a cache entry.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_unprotect_entry_log_msg(const H5AC_t *cache,
+                                    const H5AC_info_t *entry,
+                                    int type_id,
+                                    unsigned flags,
+                                    herr_t fxn_ret_value)
+{
+    char msg[MSG_SIZE];
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+    HDassert(entry);
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+{\
+\"timestamp\":%lld,\
+\"action\":\"unprotect\",\
+\"address\":0x%lx,\
+\"id\":%d,\
+\"flags\":%x,\
+\"returned\":%d\
+},\n\
+"
+    , (long long)time(NULL), (unsigned long)entry->addr, 
+      type_id, flags, (int)fxn_ret_value);
+
+    HDsnprintf(msg, MSG_SIZE, " ");
+
+    /* Write the log message to the file */
+    if(H5C_write_log_message(cache, msg) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__write_unprotect_entry_log_msg() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__write_set_cache_config_log_msg
+ *
+ * Purpose:     Write a log message for setting the cache configuration.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__write_set_cache_config_log_msg(const H5AC_t *cache,
+                                     const H5AC_cache_config_t *config,
+                                     herr_t fxn_ret_value)
+{
+    char msg[MSG_SIZE];
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache);
+    HDassert(cache->magic == H5C__H5C_T_MAGIC);
+    HDassert(config);
+
+    /* Create the log message string */
+    HDsnprintf(msg, MSG_SIZE, 
+"\
+{\
+\"timestamp\":%lld,\
+\"action\":\"set_config\",\
+\"returned\":%d\
+},\n\
+"
+    , (long long)time(NULL), (int)fxn_ret_value);
+
+
+    /* Write the log message to the file */
+    if(H5C_write_log_message(cache, msg) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unable to emit log message")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__write_set_cache_config_log_msg() */
+
diff --git a/src/H5ACmodule.h b/src/H5ACmodule.h
new file mode 100644
index 0000000..a8dba59
--- /dev/null
+++ b/src/H5ACmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5AC package.  Including this header means that the source file
+ *		is part of the H5AC package.
+ */
+#ifndef _H5ACmodule_H
+#define _H5ACmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5AC_MODULE
+#define H5_MY_PKG       H5AC
+#define H5_MY_PKG_ERR   H5E_CACHE
+#define H5_MY_PKG_INIT  YES
+
+#endif /* _H5ACmodule_H */
+
diff --git a/src/H5ACmpio.c b/src/H5ACmpio.c
new file mode 100644
index 0000000..8655a6f
--- /dev/null
+++ b/src/H5ACmpio.c
@@ -0,0 +1,2245 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5ACmpio.c
+ *                      Jun 20 2015
+ *                      Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:             Functions in this file implement support for parallel
+ *                      I/O cache functionality
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#include "H5ACmodule.h"         /* This source code file is part of the H5AC module */
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACpkg.h"		/* Metadata cache			*/
+#include "H5Cprivate.h"		/* Cache                                */
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"		/* Files				*/
+#include "H5MMprivate.h"        /* Memory management                    */
+
+#ifdef H5_HAVE_PARALLEL
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/****************************************************************************
+ *
+ * structure H5AC_slist_entry_t
+ *
+ * The dirty entry list maintained via the d_slist_ptr field of H5AC_aux_t
+ * and the cleaned entry list maintained via the c_slist_ptr field of
+ * H5AC_aux_t are just lists of the file offsets of the dirty/cleaned
+ * entries.  Unfortunately, the slist code makes us define a dynamically
+ * allocated structure to store these offsets in.  This structure serves
+ * that purpose.  Its fields are as follows:
+ *
+ * addr:	file offset of a metadata entry.  Entries are added to this
+ *		list (if they aren't there already) when they are marked
+ *		dirty in an unprotect, inserted, or moved.  They are
+ *		removed when they appear in a clean entries broadcast.
+ *
+ ****************************************************************************/
+typedef struct H5AC_slist_entry_t
+{
+    haddr_t     addr;
+} H5AC_slist_entry_t;
+
+/* User data for address list building callbacks */
+typedef struct H5AC_addr_list_ud_t
+{
+    H5AC_aux_t    * aux_ptr;        /* 'Auxiliary' parallel cache info */
+    haddr_t       * addr_buf_ptr;   /* Array to store addresses */
+    int             i;              /* Counter for position in array */
+} H5AC_addr_list_ud_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static herr_t H5AC__broadcast_candidate_list(H5AC_t *cache_ptr,
+    int *num_entries_ptr, haddr_t **haddr_buf_ptr_ptr);
+static herr_t H5AC__broadcast_clean_list(H5AC_t *cache_ptr);
+static herr_t H5AC__construct_candidate_list(H5AC_t *cache_ptr,
+    H5AC_aux_t *aux_ptr, int sync_point_op);
+static herr_t H5AC__copy_candidate_list_to_buffer(const H5AC_t *cache_ptr,
+    int *num_entries_ptr, haddr_t **haddr_buf_ptr_ptr);
+static herr_t H5AC__propagate_and_apply_candidate_list(H5F_t  *f, hid_t dxpl_id);
+static herr_t H5AC__propagate_flushed_and_still_clean_entries_list(H5F_t  *f,
+    hid_t dxpl_id);
+static herr_t H5AC__receive_haddr_list(MPI_Comm mpi_comm, int *num_entries_ptr,
+    haddr_t **haddr_buf_ptr_ptr);
+static herr_t H5AC__receive_candidate_list(const H5AC_t *cache_ptr,
+    int *num_entries_ptr, haddr_t **haddr_buf_ptr_ptr);
+static herr_t H5AC__receive_and_apply_clean_list(H5F_t *f, hid_t dxpl_id);
+static herr_t H5AC__tidy_cache_0_lists(H5AC_t *cache_ptr, int num_candidates,
+    haddr_t *candidates_list_ptr);
+static herr_t H5AC__rsp__dist_md_write__flush(H5F_t *f, hid_t dxpl_id);
+static herr_t H5AC__rsp__dist_md_write__flush_to_min_clean(H5F_t *f, hid_t dxpl_id);
+static herr_t H5AC__rsp__p0_only__flush(H5F_t *f, hid_t dxpl_id);
+static herr_t H5AC__rsp__p0_only__flush_to_min_clean(H5F_t *f, hid_t dxpl_id);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Declare a free list to manage the H5AC_aux_t struct */
+H5FL_DEFINE(H5AC_aux_t);
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5AC_slist_entry_t struct */
+H5FL_DEFINE_STATIC(H5AC_slist_entry_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__set_sync_point_done_callback
+ *
+ * Purpose:     Set the value of the sync_point_done callback.  This 
+ *		callback is used by the parallel test code to verify
+ *		that the expected writes and only the expected writes
+ *		take place during a sync point.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              5/9/10
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__set_sync_point_done_callback(H5C_t * cache_ptr,
+    void (* sync_point_done)(int num_writes, haddr_t * written_entries_tbl))
+{
+    H5AC_aux_t * aux_ptr;
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity checks */
+    HDassert(cache_ptr);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+
+    aux_ptr->sync_point_done = sync_point_done;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5AC__set_sync_point_done_callback() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__set_write_done_callback
+ *
+ * Purpose:     Set the value of the write_done callback.  This callback
+ *              is used to improve performance of the parallel test bed
+ *              for the cache.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              5/11/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__set_write_done_callback(H5C_t * cache_ptr, void (* write_done)(void))
+{
+    H5AC_aux_t * aux_ptr;
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity checks */
+    HDassert(cache_ptr);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+
+    aux_ptr->write_done = write_done;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5AC__set_write_done_callback() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC_add_candidate()
+ *
+ * Purpose:     Add the supplied metadata entry address to the candidate
+ *		list.  Verify that each entry added does not appear in 
+ *		the list prior to its insertion.
+ *
+ *		This function is intended for used in constructing list
+ *		of entried to be flushed during sync points.  It shouldn't
+ *		be called anywhere else.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              3/17/10
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC_add_candidate(H5AC_t * cache_ptr, haddr_t addr)
+{
+    H5AC_aux_t         * aux_ptr;
+    H5AC_slist_entry_t * slist_entry_ptr = NULL;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(cache_ptr != NULL);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+    HDassert(aux_ptr->metadata_write_strategy == H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED);
+    HDassert(aux_ptr->candidate_slist_ptr != NULL);
+
+    /* Construct an entry for the supplied address, and insert
+     * it into the candidate slist.
+     */
+    if(NULL == (slist_entry_ptr = H5FL_MALLOC(H5AC_slist_entry_t)))
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "Can't allocate candidate slist entry")
+    slist_entry_ptr->addr  = addr;
+
+    if(H5SL_insert(aux_ptr->candidate_slist_ptr, slist_entry_ptr, &(slist_entry_ptr->addr)) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, "can't insert entry into dirty entry slist")
+
+done:
+    /* Clean up on error */
+    if(ret_value < 0)
+        if(slist_entry_ptr)
+            slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_add_candidate() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC__broadcast_candidate_list()
+ *
+ * Purpose:     Broadcast the contents of the process 0 candidate entry
+ *		slist.  In passing, also remove all entries from said
+ *		list.  As the application of this will be handled by 
+ *		the same functions on all processes, construct and 
+ *		return a copy of the list in the same format as that
+ *		received by the other processes.  Note that if this
+ *		copy is returned in *haddr_buf_ptr_ptr, the caller 
+ *		must free it.
+ *
+ *		This function must only be called by the process with
+ *		MPI_rank 0.
+ *
+ *		Return SUCCEED on success, and FAIL on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 7/1/05
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__broadcast_candidate_list(H5AC_t *cache_ptr, int *num_entries_ptr,
+    haddr_t **haddr_buf_ptr_ptr)
+{
+    H5AC_aux_t         * aux_ptr = NULL;
+    haddr_t            * haddr_buf_ptr = NULL;
+    int                  mpi_result;
+    int			 num_entries;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(cache_ptr != NULL);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+    HDassert(aux_ptr->mpi_rank == 0);
+    HDassert(aux_ptr->metadata_write_strategy == H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED);
+    HDassert(aux_ptr->candidate_slist_ptr != NULL);
+    HDassert(num_entries_ptr != NULL);
+    HDassert(*num_entries_ptr == 0);
+    HDassert(haddr_buf_ptr_ptr != NULL);
+    HDassert(*haddr_buf_ptr_ptr == NULL);
+
+    /* First broadcast the number of entries in the list so that the
+     * receivers can set up buffers to receive them.  If there aren't
+     * any, we are done.
+     */
+    num_entries = (int)H5SL_count(aux_ptr->candidate_slist_ptr);
+    if(MPI_SUCCESS != (mpi_result = MPI_Bcast(&num_entries, 1, MPI_INT, 0, aux_ptr->mpi_comm)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed", mpi_result)
+
+    if(num_entries > 0) {
+        size_t		 buf_size = 0;
+        int		 chk_num_entries = 0;
+
+        /* convert the candidate list into the format we
+         * are used to receiving from process 0, and also load it 
+         * into a buffer for transmission.
+         */
+        if(H5AC__copy_candidate_list_to_buffer(cache_ptr, &chk_num_entries, &haddr_buf_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't construct candidate buffer.")
+        HDassert(chk_num_entries == num_entries);
+        HDassert(haddr_buf_ptr != NULL);
+
+        /* Now broadcast the list of candidate entries */
+        buf_size = sizeof(haddr_t) * (size_t)num_entries;
+        if(MPI_SUCCESS != (mpi_result = MPI_Bcast((void *)haddr_buf_ptr, (int)buf_size, MPI_BYTE, 0, aux_ptr->mpi_comm)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed", mpi_result)
+    } /* end if */
+
+    /* Pass the number of entries and the buffer pointer 
+     * back to the caller.  Do this so that we can use the same code
+     * to apply the candidate list to all the processes.
+     */
+    *num_entries_ptr = num_entries;
+    *haddr_buf_ptr_ptr = haddr_buf_ptr;
+
+done:
+    if(ret_value < 0)
+        if(haddr_buf_ptr)
+            haddr_buf_ptr = (haddr_t *)H5MM_xfree((void *)haddr_buf_ptr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__broadcast_candidate_list() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC__broadcast_clean_list_cb()
+ *
+ * Purpose:     Skip list callback for building array of addresses for
+ *              broadcasting the clean list.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  Quincey Koziol, 6/12/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__broadcast_clean_list_cb(void *_item, void H5_ATTR_UNUSED *_key,
+    void *_udata)
+{
+    H5AC_slist_entry_t    * slist_entry_ptr = (H5AC_slist_entry_t *)_item;  /* Address of item */
+    H5AC_addr_list_ud_t   * udata = (H5AC_addr_list_ud_t *)_udata;      /* Context for callback */
+    haddr_t		    addr;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(slist_entry_ptr);
+    HDassert(udata);
+
+    /* Store the entry's address in the buffer */
+    addr = slist_entry_ptr->addr;
+    udata->addr_buf_ptr[udata->i] = addr;
+    udata->i++;
+
+    /* now release the entry */
+    slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+
+    /* and also remove the matching entry from the dirtied list
+     * if it exists.
+     */
+    if(NULL != (slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_remove(udata->aux_ptr->d_slist_ptr, (void *)(&addr))))
+        slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5AC__broadcast_clean_list_cb() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC__broadcast_clean_list()
+ *
+ * Purpose:     Broadcast the contents of the process 0 cleaned entry
+ *		slist.  In passing, also remove all entries from said
+ *		list, and also remove any matching entries from the dirtied
+ *		slist.
+ *
+ *		This function must only be called by the process with
+ *		MPI_rank 0.
+ *
+ *		Return SUCCEED on success, and FAIL on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 7/1/05
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__broadcast_clean_list(H5AC_t * cache_ptr)
+{
+    haddr_t	       * addr_buf_ptr = NULL;
+    H5AC_aux_t         * aux_ptr;
+    int                  mpi_result;
+    int			 num_entries = 0;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(cache_ptr != NULL);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+    HDassert(aux_ptr->mpi_rank == 0);
+    HDassert(aux_ptr->c_slist_ptr != NULL);
+
+    /* First broadcast the number of entries in the list so that the
+     * receives can set up a buffer to receive them.  If there aren't
+     * any, we are done.
+     */
+    num_entries = (int)H5SL_count(aux_ptr->c_slist_ptr);
+    if(MPI_SUCCESS != (mpi_result = MPI_Bcast(&num_entries, 1, MPI_INT, 0, aux_ptr->mpi_comm)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed", mpi_result)
+
+    if(num_entries > 0) {
+        H5AC_addr_list_ud_t udata;
+        size_t		 buf_size;
+
+        /* allocate a buffer to store the list of entry base addresses in */
+        buf_size = sizeof(haddr_t) * (size_t)num_entries;
+        if(NULL == (addr_buf_ptr = (haddr_t *)H5MM_malloc(buf_size)))
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "memory allocation failed for addr buffer")
+
+        /* Set up user data for callback */
+        udata.aux_ptr = aux_ptr;
+        udata.addr_buf_ptr = addr_buf_ptr;
+        udata.i = 0;
+
+        /* Free all the clean list entries, building the address list in the callback */
+        /* (Callback also removes the matching entries from the dirtied list) */
+        if(H5SL_free(aux_ptr->c_slist_ptr, H5AC__broadcast_clean_list_cb, &udata) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFREE, FAIL, "Can't build address list for clean entries")
+
+        /* Now broadcast the list of cleaned entries */
+        if(MPI_SUCCESS != (mpi_result = MPI_Bcast((void *)addr_buf_ptr, (int)buf_size, MPI_BYTE, 0, aux_ptr->mpi_comm)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed", mpi_result)
+    } /* end if */
+
+    /* if it is defined, call the sync point done callback.  Note
+     * that this callback is defined purely for testing purposes,
+     * and should be undefined under normal operating circumstances.
+     */
+    if(aux_ptr->sync_point_done)
+        (aux_ptr->sync_point_done)(num_entries, addr_buf_ptr);
+
+done:
+    if(addr_buf_ptr)
+        addr_buf_ptr = (haddr_t *)H5MM_xfree((void *)addr_buf_ptr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__broadcast_clean_list() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__construct_candidate_list()
+ *
+ * Purpose:     In the parallel case when the metadata_write_strategy is 
+ *		H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED, process 0 uses
+ *		this function to construct the list of cache entries to 
+ *		be flushed.  This list is then propagated to the other 
+ *		caches, and then flushed in a distributed fashion.
+ *
+ *		The sync_point_op parameter is used to determine the extent
+ *		of the flush.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              3/17/10
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__construct_candidate_list(H5AC_t *cache_ptr, H5AC_aux_t *aux_ptr,
+    int sync_point_op)
+{
+    herr_t ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(cache_ptr != NULL);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+    HDassert(aux_ptr->metadata_write_strategy == H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED);
+    HDassert((sync_point_op == H5AC_SYNC_POINT_OP__FLUSH_CACHE) || (aux_ptr->mpi_rank == 0));
+    HDassert(aux_ptr->d_slist_ptr != NULL);
+    HDassert(aux_ptr->c_slist_ptr != NULL);
+    HDassert(H5SL_count(aux_ptr->c_slist_ptr) == 0);
+    HDassert(aux_ptr->candidate_slist_ptr != NULL);
+    HDassert(H5SL_count(aux_ptr->candidate_slist_ptr) == 0);
+    HDassert((sync_point_op == H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN) || (sync_point_op == H5AC_SYNC_POINT_OP__FLUSH_CACHE));
+
+    switch(sync_point_op) {
+	case H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN:
+            if(H5C_construct_candidate_list__min_clean((H5C_t *)cache_ptr) < 0)
+		HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_construct_candidate_list__min_clean() failed.")
+	    break;
+
+	case H5AC_SYNC_POINT_OP__FLUSH_CACHE:
+            if(H5C_construct_candidate_list__clean_cache((H5C_t *)cache_ptr) < 0)
+		HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_construct_candidate_list__clean_cache() failed.")
+	    break;
+
+        default:
+	    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unknown sync point operation.")
+	    break;
+    } /* end switch */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__construct_candidate_list() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC__copy_candidate_list_to_buffer_cb
+ *
+ * Purpose:     Skip list callback for building array of addresses for
+ *              broadcasting the candidate list.
+ *
+ * Return:	Return SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  Quincey Koziol, 6/12/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__copy_candidate_list_to_buffer_cb(void *_item, void H5_ATTR_UNUSED *_key,
+    void *_udata)
+{
+    H5AC_slist_entry_t    * slist_entry_ptr = (H5AC_slist_entry_t *)_item;  /* Address of item */
+    H5AC_addr_list_ud_t   * udata = (H5AC_addr_list_ud_t *)_udata;      /* Context for callback */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(slist_entry_ptr);
+    HDassert(udata);
+
+    /* Store the entry's address in the buffer */
+    udata->addr_buf_ptr[udata->i] = slist_entry_ptr->addr;
+    udata->i++;
+
+    /* now release the entry */
+    slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5AC__copy_candidate_list_to_buffer_cb() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC__copy_candidate_list_to_buffer
+ *
+ * Purpose:     Allocate buffer(s) and copy the contents of the candidate
+ *		entry slist into it (them).  In passing, remove all 
+ *		entries from the candidate slist.  Note that the 
+ *		candidate slist must not be empty.
+ *
+ *		If MPI_Offset_buf_ptr_ptr is not NULL, allocate a buffer
+ *		of MPI_Offset, copy the contents of the candidate
+ *		entry list into it with the appropriate conversions, 
+ *		and return the base address of the buffer in 
+ *		*MPI_Offset_buf_ptr.  Note that this is the buffer
+ *		used by process 0 to transmit the list of entries to 
+ *		be flushed to all other processes (in this file group).
+ *
+ *		Similarly, allocate a buffer of haddr_t, load the contents
+ *		of the candidate list into this buffer, and return its 
+ *		base address in *haddr_buf_ptr_ptr.  Note that this 
+ *		latter buffer is constructed unconditionally.  
+ *
+ *		In passing, also remove all entries from the candidate
+ *		entry slist.
+ *
+ * Return:	Return SUCCEED on success, and FAIL on failure.
+ *
+ * Programmer:  John Mainzer, 4/19/10
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__copy_candidate_list_to_buffer(const H5AC_t *cache_ptr, int *num_entries_ptr,
+    haddr_t **haddr_buf_ptr_ptr)
+{
+    H5AC_aux_t         * aux_ptr = NULL;
+    H5AC_addr_list_ud_t  udata;
+    haddr_t            * haddr_buf_ptr = NULL;
+    size_t		 buf_size;
+    int			 num_entries = 0;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(cache_ptr != NULL);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+    HDassert(aux_ptr->metadata_write_strategy == H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED);
+    HDassert(aux_ptr->candidate_slist_ptr != NULL);
+    HDassert(H5SL_count(aux_ptr->candidate_slist_ptr) > 0);
+    HDassert(num_entries_ptr != NULL);
+    HDassert(*num_entries_ptr == 0);
+    HDassert(haddr_buf_ptr_ptr != NULL);
+    HDassert(*haddr_buf_ptr_ptr == NULL);
+
+    num_entries = (int)H5SL_count(aux_ptr->candidate_slist_ptr);
+
+    /* allocate a buffer(s) to store the list of candidate entry 
+     * base addresses in 
+     */
+    buf_size = sizeof(haddr_t) * (size_t)num_entries;
+    if(NULL == (haddr_buf_ptr = (haddr_t *)H5MM_malloc(buf_size)))
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "memory allocation failed for haddr buffer")
+
+    /* Set up user data for callback */
+    udata.aux_ptr = aux_ptr;
+    udata.addr_buf_ptr = haddr_buf_ptr;
+    udata.i = 0;
+
+    /* Free all the candidate list entries, building the address list in the callback */
+    if(H5SL_free(aux_ptr->candidate_slist_ptr, H5AC__copy_candidate_list_to_buffer_cb, &udata) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFREE, FAIL, "Can't build address list for candidate entries")
+
+    /* Pass the number of entries and the buffer pointer 
+     * back to the caller.
+     */
+    *num_entries_ptr = num_entries;
+    *haddr_buf_ptr_ptr = haddr_buf_ptr;
+
+done:
+    if(ret_value < 0)
+        if(haddr_buf_ptr)
+            haddr_buf_ptr = (haddr_t *)H5MM_xfree((void *)haddr_buf_ptr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__copy_candidate_list_to_buffer() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC__log_deleted_entry()
+ *
+ * Purpose:     Log an entry which has been deleted.
+ *
+ *		Only called for mpi_rank 0. We must make sure that the entry
+ *              doesn't appear in the cleaned or dirty entry lists.
+ *
+ *		Return SUCCEED on success, and FAIL on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 6/29/05
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__log_deleted_entry(const H5AC_info_t *entry_ptr)
+{
+    H5AC_t             * cache_ptr;
+    H5AC_aux_t         * aux_ptr;
+    H5AC_slist_entry_t * slist_entry_ptr = NULL;
+    haddr_t              addr;
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity checks */
+    HDassert(entry_ptr);
+    addr = entry_ptr->addr;
+    cache_ptr = entry_ptr->cache_ptr;
+    HDassert(cache_ptr != NULL);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+    HDassert(aux_ptr->mpi_rank == 0);
+    HDassert(aux_ptr->d_slist_ptr != NULL);
+    HDassert(aux_ptr->c_slist_ptr != NULL);
+
+    /* if the entry appears in the dirtied entry slist, remove it. */
+    if(NULL != (slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&addr))))
+        slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+
+    /* if the entry appears in the cleaned entry slist, remove it. */
+    if(NULL != (slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr))))
+        slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5AC__log_deleted_entry() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC__log_dirtied_entry()
+ *
+ * Purpose:     Update the dirty_bytes count for a newly dirtied entry.
+ *
+ *		If mpi_rank isn't 0, this simply means adding the size
+ *		of the entries to the dirty_bytes count.
+ *
+ *		If mpi_rank is 0, we must first check to see if the entry
+ *		appears in the dirty entries slist.  If it is, do nothing.
+ *		If it isn't, add the size to th dirty_bytes count, add the
+ *		entry to the dirty entries slist, and remove it from the
+ *		cleaned list (if it is present there).
+ *
+ *		Return SUCCEED on success, and FAIL on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 6/29/05
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__log_dirtied_entry(const H5AC_info_t *entry_ptr)
+{
+    H5AC_t             * cache_ptr;
+    H5AC_aux_t         * aux_ptr;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity checks */
+    HDassert(entry_ptr);
+    HDassert(entry_ptr->is_dirty == FALSE);
+    cache_ptr = entry_ptr->cache_ptr;
+    HDassert(cache_ptr != NULL);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+
+    if(aux_ptr->mpi_rank == 0) {
+        H5AC_slist_entry_t *slist_entry_ptr;
+        haddr_t addr = entry_ptr->addr;
+
+        /* Sanity checks */
+        HDassert(aux_ptr->d_slist_ptr != NULL);
+        HDassert(aux_ptr->c_slist_ptr != NULL);
+
+        if(NULL == H5SL_search(aux_ptr->d_slist_ptr, (void *)(&addr))) {
+            /* insert the address of the entry in the dirty entry list, and
+             * add its size to the dirty_bytes count.
+             */
+            if(NULL == (slist_entry_ptr = H5FL_MALLOC(H5AC_slist_entry_t)))
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "Can't allocate dirty slist entry .")
+            slist_entry_ptr->addr  = addr;
+
+            if(H5SL_insert(aux_ptr->d_slist_ptr, slist_entry_ptr, &(slist_entry_ptr->addr)) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, "can't insert entry into dirty entry slist.")
+
+            aux_ptr->dirty_bytes += entry_ptr->size;
+#if H5AC_DEBUG_DIRTY_BYTES_CREATION
+	    aux_ptr->unprotect_dirty_bytes += entry_ptr->size;
+	    aux_ptr->unprotect_dirty_bytes_updates += 1;
+#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
+        } /* end if */
+
+        /* the entry is dirty.  If it exists on the cleaned entries list,
+         * remove it.
+         */
+        if(NULL != (slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr))))
+            slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+    } /* end if */
+    else {
+        aux_ptr->dirty_bytes += entry_ptr->size;
+#if H5AC_DEBUG_DIRTY_BYTES_CREATION
+        aux_ptr->unprotect_dirty_bytes += entry_size;
+        aux_ptr->unprotect_dirty_bytes_updates += 1;
+#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__log_dirtied_entry() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC__log_flushed_entry()
+ *
+ * Purpose:     Update the clean entry slist for the flush of an entry --
+ *		specifically, if the entry has been cleared, remove it
+ * 		from both the cleaned and dirtied lists if it is present.
+ *		Otherwise, if the entry was dirty, insert the indicated
+ *		entry address in the clean slist if it isn't there already.
+ *
+ *		This function is only used in PHDF5, and should only
+ *		be called for the process with mpi rank 0.
+ *
+ *		Return SUCCEED on success, and FAIL on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 6/29/05
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__log_flushed_entry(H5C_t *cache_ptr, haddr_t addr, hbool_t was_dirty,
+    unsigned flags)
+{
+    hbool_t		 cleared;
+    H5AC_aux_t         * aux_ptr;
+    H5AC_slist_entry_t * slist_entry_ptr = NULL;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(cache_ptr != NULL);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+    HDassert(aux_ptr->mpi_rank == 0);
+    HDassert(aux_ptr->c_slist_ptr != NULL);
+
+    /* Set local flags */
+    cleared = ((flags & H5C__FLUSH_CLEAR_ONLY_FLAG) != 0);
+
+    if(cleared) {
+        /* If the entry has been cleared, must remove it from both the
+         * cleaned list and the dirtied list.
+         */
+        if(NULL != (slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr))))
+            slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+        if(NULL != (slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&addr))))
+            slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+    } /* end if */
+    else if(was_dirty) {
+        if(NULL == H5SL_search(aux_ptr->c_slist_ptr, (void *)(&addr))) {
+            /* insert the address of the entry in the clean entry list. */
+            if(NULL == (slist_entry_ptr = H5FL_MALLOC(H5AC_slist_entry_t)))
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "Can't allocate clean slist entry .")
+            slist_entry_ptr->addr = addr;
+
+            if(H5SL_insert(aux_ptr->c_slist_ptr, slist_entry_ptr, &(slist_entry_ptr->addr)) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, "can't insert entry into clean entry slist.")
+        } /* end if */
+    } /* end else-if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__log_flushed_entry() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC__log_inserted_entry()
+ *
+ * Purpose:     Update the dirty_bytes count for a newly inserted entry.
+ *
+ *		If mpi_rank isnt 0, this simply means adding the size
+ *		of the entry to the dirty_bytes count.
+ *
+ *		If mpi_rank is 0, we must also add the entry to the
+ *		dirty entries slist.
+ *
+ *		Return SUCCEED on success, and FAIL on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 6/30/05
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__log_inserted_entry(const H5AC_info_t *entry_ptr)
+{
+    H5AC_t             * cache_ptr;
+    H5AC_aux_t         * aux_ptr;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity checks */
+    HDassert(entry_ptr);
+    cache_ptr = entry_ptr->cache_ptr;
+    HDassert(cache_ptr != NULL);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+
+    if(aux_ptr->mpi_rank == 0) {
+        H5AC_slist_entry_t *slist_entry_ptr;
+
+        HDassert(aux_ptr->d_slist_ptr != NULL);
+        HDassert(aux_ptr->c_slist_ptr != NULL);
+
+        /* Entry to insert should not be in dirty list currently */
+        if(NULL != H5SL_search(aux_ptr->d_slist_ptr, (const void *)(&entry_ptr->addr)))
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Inserted entry already in dirty slist.")
+
+        /* insert the address of the entry in the dirty entry list, and
+         * add its size to the dirty_bytes count.
+         */
+        if(NULL == (slist_entry_ptr = H5FL_MALLOC(H5AC_slist_entry_t)))
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "Can't allocate dirty slist entry .")
+        slist_entry_ptr->addr  = entry_ptr->addr;
+        if(H5SL_insert(aux_ptr->d_slist_ptr, slist_entry_ptr, &(slist_entry_ptr->addr)) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, "can't insert entry into dirty entry slist.")
+
+        /* Entry to insert should not be in clean list either */
+        if(NULL != H5SL_search(aux_ptr->c_slist_ptr, (const void *)(&entry_ptr->addr)))
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Inserted entry in clean slist.")
+    } /* end if */
+
+    aux_ptr->dirty_bytes += entry_ptr->size;
+
+#if H5AC_DEBUG_DIRTY_BYTES_CREATION
+    aux_ptr->insert_dirty_bytes += size;
+    aux_ptr->insert_dirty_bytes_updates += 1;
+#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__log_inserted_entry() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC__log_moved_entry()
+ *
+ * Purpose:     Update the dirty_bytes count for a moved entry.
+ *
+ *		WARNING
+ *
+ *		At present, the way that the move call is used ensures
+ *		that the moved entry is present in all caches by
+ *		moving in a collective operation and immediately after
+ *		unprotecting the target entry.
+ *
+ *		This function uses this invariant, and will cause arcane
+ *		failures if it is not met.  If maintaining this invariant
+ *		becomes impossible, we will have to rework this function
+ *		extensively, and likely include a bit of IPC for
+ *		synchronization.  A better option might be to subsume
+ *		move in the unprotect operation.
+ *
+ *		Given that the target entry is in all caches, the function
+ *		proceeds as follows:
+ *
+ *		For processes with mpi rank other 0, it simply checks to
+ *		see if the entry was dirty prior to the move, and adds
+ *		the entries size to the dirty bytes count.
+ *
+ *		In the process with mpi rank 0, the function first checks
+ *		to see if the entry was dirty prior to the move.  If it
+ *		was, and if the entry doesn't appear in the dirtied list
+ *		under its old address, it adds the entry's size to the
+ *		dirty bytes count.
+ *
+ *		The rank 0 process then removes any references to the
+ *		entry under its old address from the cleands and dirtied
+ *		lists, and inserts an entry in the dirtied list under the
+ *		new address.
+ *
+ *		Return SUCCEED on success, and FAIL on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 6/30/05
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__log_moved_entry(const H5F_t *f, haddr_t old_addr, haddr_t new_addr)
+{
+    H5AC_t             * cache_ptr;
+    H5AC_aux_t         * aux_ptr;
+    hbool_t		 entry_in_cache;
+    hbool_t		 entry_dirty;
+    size_t               entry_size;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    cache_ptr = (H5AC_t *)f->shared->cache;
+    HDassert(cache_ptr);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+
+    /* get entry status, size, etc here */
+    if(H5C_get_entry_status(f, old_addr, &entry_size, &entry_in_cache,
+            &entry_dirty, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't get entry status.")
+    if(!entry_in_cache)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "entry not in cache.")
+
+    if(aux_ptr->mpi_rank == 0) {
+        H5AC_slist_entry_t * slist_entry_ptr;
+
+        HDassert(aux_ptr->d_slist_ptr != NULL);
+        HDassert(aux_ptr->c_slist_ptr != NULL);
+
+        /* if the entry appears in the cleaned entry slist, under its old
+         * address, remove it.
+         */
+        if(NULL != (slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&old_addr))))
+            slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr);
+
+        /* if the entry appears in the dirtied entry slist under its old
+         * address, remove it, but don't free it. Set addr to new_addr.
+         */
+        if(NULL != (slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&old_addr))))
+            slist_entry_ptr->addr = new_addr;
+        else {
+             /* otherwise, allocate a new entry that is ready
+              * for insertion, and increment dirty_bytes.
+              *
+              * Note that the fact that the entry wasn't in the dirtied
+              * list under its old address implies that it must have
+              * been clean to start with.
+              */
+            HDassert(!entry_dirty);
+            if(NULL == (slist_entry_ptr = H5FL_MALLOC(H5AC_slist_entry_t)))
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "Can't allocate dirty slist entry .")
+            slist_entry_ptr->addr = new_addr;
+
+            aux_ptr->dirty_bytes += entry_size;
+
+#if H5AC_DEBUG_DIRTY_BYTES_CREATION
+            aux_ptr->move_dirty_bytes += entry_size;
+            aux_ptr->move_dirty_bytes_updates += 1;
+#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
+        } /* end else */
+
+        /* insert / reinsert the entry in the dirty slist */
+        if(H5SL_insert(aux_ptr->d_slist_ptr, slist_entry_ptr, &(slist_entry_ptr->addr)) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, "can't insert entry into dirty entry slist.")
+    } /* end if */
+    else if(!entry_dirty) {
+        aux_ptr->dirty_bytes += entry_size;
+
+#if H5AC_DEBUG_DIRTY_BYTES_CREATION
+        aux_ptr->move_dirty_bytes += entry_size;
+        aux_ptr->move_dirty_bytes_updates += 1;
+#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
+    } /* end else-if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__log_moved_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__propagate_and_apply_candidate_list
+ *
+ * Purpose:     Prior to the addition of support for multiple metadata 
+ *		write strategies, in PHDF5, only the metadata cache with 
+ *		mpi rank 0 was allowed to write to file.  All other 
+ *		metadata caches on processes with rank greater than 0 
+ *		were required to retain dirty entries until they were 
+ *		notified that the entry was clean.
+ *
+ *		This constraint is relaxed with the distributed 
+ *		metadata write strategy, in which a list of candidate
+ *		metadata cache entries is constructed by the process 0
+ *		cache and then distributed to the caches of all the other
+ *		processes.  Once the listed is distributed, many (if not 
+ *		all) processes writing writing a unique subset of the 
+ *		entries, and marking the remainder clean.  The subsets 
+ *		are chosen so that each entry in the list of candidates 
+ *		is written by exactly one cache, and all entries are 
+ *		marked as being clean in all caches.
+ *
+ *		While the list of candidate cache entries is prepared 
+ *		elsewhere, this function is the main routine for distributing
+ *		and applying the list.  It must be run simultaniously on 
+ *		all processes that have the relevant file open.  To ensure
+ *		proper synchronization, there is a barrier at the beginning 
+ *		of this function.
+ *
+ *		At present, this function is called under one of two 
+ *		circumstances:
+ *
+ *		1) Dirty byte creation exceeds some user specified value.
+ *
+ *		   While metadata reads may occur independently, all
+ *		   operations writing metadata must be collective.  Thus
+ *		   all metadata caches see the same sequence of operations,
+ *                 and therefore the same dirty data creation.
+ *
+ *		   This fact is used to synchronize the caches for purposes
+ *                 of propagating the list of candidate entries, by simply 
+ *		   calling this function from all caches whenever some user 
+ *		   specified threshold on dirty data is exceeded.  (the 
+ *		   process 0 cache creates the candidate list just before 
+ *		   calling this function).
+ *
+ *		2) Under direct user control -- this operation must be
+ *		   collective.
+ *
+ *              The operations to be managed by this function are as
+ * 		follows:
+ *
+ *		All processes:
+ *
+ *		1) Participate in an opening barrier.
+ *
+ *		For the process with mpi rank 0:
+ *
+ *		1) Load the contents of the candidate list 
+ *		   (candidate_slist_ptr) into a buffer, and broadcast that
+ *		   buffer to all the other caches.  Clear the candidate
+ *		   list in passing.
+ *
+ *		If there is a positive number of candidates, proceed with 
+ *		the following:
+ *
+ *		2) Apply the candidate entry list.
+ *
+ *		3) Particpate in a closing barrier.
+ *
+ *		4) Remove from the dirty list (d_slist_ptr) and from the 
+ *		   flushed and still clean entries list (c_slist_ptr),  
+ *                 all addresses that appeared in the candidate list, as
+ *		   these entries are now clean.
+ *
+ *
+ *		For all processes with mpi rank greater than 0:
+ *
+ *		1) Receive the candidate entry list broadcast
+ *
+ *		If there is a positive number of candidates, proceed with 
+ *		the following:
+ *
+ *		2) Apply the candidate entry list.
+ *
+ *		3) Particpate in a closing barrier.
+ *
+ * Return:      Success:        non-negative
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  John Mainzer
+ *              3/17/10
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__propagate_and_apply_candidate_list(H5F_t  *f, hid_t dxpl_id)
+{
+    H5AC_t             * cache_ptr;
+    H5AC_aux_t         * aux_ptr;
+    haddr_t            * candidates_list_ptr = NULL;
+    int		         mpi_result;
+    int	                 num_candidates = 0;
+    herr_t               ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f != NULL);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr != NULL);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+    HDassert(aux_ptr->metadata_write_strategy == H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED);
+
+    /* to prevent "messages from the future" we must synchronize all
+     * processes before we write any entries.
+     */
+    if(MPI_SUCCESS != (mpi_result = MPI_Barrier(aux_ptr->mpi_comm)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_result)
+
+    if(aux_ptr->mpi_rank == 0) {
+        if(H5AC__broadcast_candidate_list(cache_ptr, &num_candidates, &candidates_list_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't broadcast candidate slist.")
+
+        HDassert(H5SL_count(aux_ptr->candidate_slist_ptr) == 0);
+    } /* end if */
+    else {
+        if(H5AC__receive_candidate_list(cache_ptr, &num_candidates, &candidates_list_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't receive candidate broadcast.")
+    } /* end else */
+
+    if(num_candidates > 0) {
+        herr_t	         result;
+
+        /* all processes apply the candidate list.  
+         * H5C_apply_candidate_list() handles the details of 
+         * distributing the writes across the processes.
+         */
+
+        /* Enable writes during this operation */
+        aux_ptr->write_permitted = TRUE;
+
+        /* Apply the candidate list */
+        result = H5C_apply_candidate_list(f, dxpl_id, cache_ptr, num_candidates,
+            candidates_list_ptr, aux_ptr->mpi_rank, aux_ptr->mpi_size);
+
+        /* Disable writes again */
+        aux_ptr->write_permitted = FALSE;
+
+        /* Check for error on the write operation */
+        if(result < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't apply candidate list.")
+
+        /* this code exists primarily for the test bed -- it allows us to
+         * enforce posix semantics on the server that pretends to be a 
+         * file system in our parallel tests.
+         */
+	if(aux_ptr->write_done)
+	    (aux_ptr->write_done)();
+
+        /* to prevent "messages from the past" we must synchronize all
+         * processes again before we go on.
+         */
+        if(MPI_SUCCESS != (mpi_result = MPI_Barrier(aux_ptr->mpi_comm)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_result)
+
+	/* if this is process zero, tidy up the dirtied,
+         * and flushed and still clean lists.
+         */
+        if(aux_ptr->mpi_rank == 0)
+            if(H5AC__tidy_cache_0_lists(cache_ptr, num_candidates, candidates_list_ptr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't tidy up process 0 lists.")
+    } /* end if */
+
+    /* if it is defined, call the sync point done callback.  Note
+     * that this callback is defined purely for testing purposes,
+     * and should be undefined under normal operating circumstances.
+     */
+    if(aux_ptr->sync_point_done)
+        (aux_ptr->sync_point_done)(num_candidates, candidates_list_ptr);
+
+done:
+    if(candidates_list_ptr)
+        candidates_list_ptr = (haddr_t *)H5MM_xfree((void *)candidates_list_ptr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__propagate_and_apply_candidate_list() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__propagate_flushed_and_still_clean_entries_list
+ *
+ * Purpose:     In PHDF5, if the process 0 only metadata write strategy
+ *		is selected, only the metadata cache with mpi rank 0 is 
+ *		allowed to write to file.  All other metadata caches on 
+ *		processes with rank greater than 0 must retain dirty 
+ *		entries until they are notified that the entry is now 
+ *		clean.
+ *
+ *		This function is the main routine for handling this 
+ *		notification proceedure.  It must be called 
+ *		simultaniously on all processes that have the relevant 
+ *		file open.  To this end, it is called only during a 
+ *		sync point, with a barrier prior to the call.
+ *
+ *		Note that any metadata entry writes by process 0 will
+ *		occur after the barrier and just before this call.
+ *
+ *		Typicaly, calls to this function will be triggered in
+ *		one of two ways:
+ *
+ *		1) Dirty byte creation exceeds some user specified value.
+ *
+ *		   While metadata reads may occur independently, all
+ *		   operations writing metadata must be collective.  Thus
+ *		   all metadata caches see the same sequence of operations,
+ *                 and therefore the same dirty data creation.
+ *
+ *		   This fact is used to synchronize the caches for purposes
+ *                 of propagating the list of flushed and still clean
+ *		   entries, by simply calling this function from all
+ *		   caches whenever some user specified threshold on dirty
+ *		   data is exceeded.
+ *
+ *		2) Under direct user control -- this operation must be
+ *		   collective.
+ *
+ *              The operations to be managed by this function are as
+ * 		follows:
+ *
+ *		For the process with mpi rank 0:
+ *
+ *		1) Load the contents of the flushed and still clean entries
+ *		   list (c_slist_ptr) into a buffer, and broadcast that
+ *		   buffer to all the other caches.
+ *
+ *		2) Clear the flushed and still clean entries list
+ *                 (c_slist_ptr).
+ *
+ *
+ *		For all processes with mpi rank greater than 0:
+ *
+ *		1) Receive the flushed and still clean entries list broadcast
+ *
+ *		2) Mark the specified entries as clean.
+ *
+ *
+ *		For all processes:
+ *
+ *		1) Reset the dirtied bytes count to 0.
+ *
+ * Return:      Success:        non-negative
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  John Mainzer
+ *              July 5, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__propagate_flushed_and_still_clean_entries_list(H5F_t  *f, hid_t dxpl_id)
+{
+    H5AC_t     * cache_ptr;
+    H5AC_aux_t * aux_ptr;
+    herr_t	 ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f != NULL);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr != NULL);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+    HDassert(aux_ptr->metadata_write_strategy == H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY);
+
+    if(aux_ptr->mpi_rank == 0) {
+        if(H5AC__broadcast_clean_list(cache_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't broadcast clean slist.")
+        HDassert(H5SL_count(aux_ptr->c_slist_ptr) == 0);
+    } /* end if */
+    else {
+        if(H5AC__receive_and_apply_clean_list(f, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't receive and/or process clean slist broadcast.")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__propagate_flushed_and_still_clean_entries_list() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC_receive_haddr_list()
+ *
+ * Purpose:     Receive the list of entry addresses from process 0,
+ *		and return it in a buffer pointed to by *haddr_buf_ptr_ptr.
+ *		Note that the caller must free this buffer if it is 
+ *		returned.
+ *
+ *		This function must only be called by the process with
+ *		MPI_rank greater than 0.
+ *
+ *		Return SUCCEED on success, and FAIL on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  Quincey Koziol, 6/11/2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__receive_haddr_list(MPI_Comm mpi_comm, int *num_entries_ptr,
+    haddr_t **haddr_buf_ptr_ptr)
+{
+    haddr_t	       * haddr_buf_ptr = NULL;
+    int                  mpi_result;
+    int			 num_entries;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(num_entries_ptr != NULL);
+    HDassert(*num_entries_ptr == 0);
+    HDassert(haddr_buf_ptr_ptr != NULL);
+    HDassert(*haddr_buf_ptr_ptr == NULL);
+
+    /* First receive the number of entries in the list so that we
+     * can set up a buffer to receive them.  If there aren't
+     * any, we are done.
+     */
+    if(MPI_SUCCESS != (mpi_result = MPI_Bcast(&num_entries, 1, MPI_INT, 0, mpi_comm)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed", mpi_result)
+
+    if(num_entries > 0) {
+        size_t buf_size;
+
+        /* allocate buffers to store the list of entry base addresses in */
+        buf_size = sizeof(haddr_t) * (size_t)num_entries;
+        if(NULL == (haddr_buf_ptr = (haddr_t *)H5MM_malloc(buf_size)))
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "memory allocation failed for haddr buffer")
+
+        /* Now receive the list of candidate entries */
+        if(MPI_SUCCESS != (mpi_result = MPI_Bcast((void *)haddr_buf_ptr, (int)buf_size, MPI_BYTE, 0, mpi_comm)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed", mpi_result)
+    } /* end if */
+
+    /* finally, pass the number of entries and the buffer pointer 
+     * back to the caller.
+     */
+    *num_entries_ptr = num_entries;
+    *haddr_buf_ptr_ptr = haddr_buf_ptr;
+
+done:
+    if(ret_value < 0)
+        if(haddr_buf_ptr)
+            haddr_buf_ptr = (haddr_t *)H5MM_xfree((void *)haddr_buf_ptr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC_receive_haddr_list() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC__receive_and_apply_clean_list()
+ *
+ * Purpose:     Receive the list of cleaned entries from process 0,
+ *		and mark the specified entries as clean.
+ *
+ *		This function must only be called by the process with
+ *		MPI_rank greater than 0.
+ *
+ *		Return SUCCEED on success, and FAIL on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 7/4/05
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__receive_and_apply_clean_list(H5F_t *f, hid_t dxpl_id)
+{
+    H5AC_t             * cache_ptr;
+    H5AC_aux_t         * aux_ptr;
+    haddr_t	       * haddr_buf_ptr = NULL;
+    int			 num_entries = 0;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(f != NULL);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr != NULL);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+    HDassert(aux_ptr->mpi_rank != 0);
+
+    /* Retrieve the clean list from process 0 */
+    if(H5AC__receive_haddr_list(aux_ptr->mpi_comm, &num_entries, &haddr_buf_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "can't receive clean list")
+
+    if(num_entries > 0)
+        /* mark the indicated entries as clean */
+        if(H5C_mark_entries_as_clean(f, dxpl_id, (int32_t)num_entries, haddr_buf_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't mark entries clean.")
+
+    /* if it is defined, call the sync point done callback.  Note
+     * that this callback is defined purely for testing purposes,
+     * and should be undefined under normal operating circumstances.
+     */
+    if(aux_ptr->sync_point_done)
+        (aux_ptr->sync_point_done)(num_entries, haddr_buf_ptr);
+
+done:
+    if(haddr_buf_ptr)
+        haddr_buf_ptr = (haddr_t *)H5MM_xfree((void *)haddr_buf_ptr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__receive_and_apply_clean_list() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5AC__receive_candidate_list()
+ *
+ * Purpose:     Receive the list of candidate entries from process 0,
+ *		and return it in a buffer pointed to by *haddr_buf_ptr_ptr.
+ *		Note that the caller must free this buffer if it is 
+ *		returned.
+ *
+ *		This function must only be called by the process with
+ *		MPI_rank greater than 0.
+ *
+ *		Return SUCCEED on success, and FAIL on failure.
+ *
+ * Return:      Non-negative on success/Negative on failure.
+ *
+ * Programmer:  John Mainzer, 3/17/10
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__receive_candidate_list(const H5AC_t *cache_ptr, int *num_entries_ptr,
+    haddr_t **haddr_buf_ptr_ptr)
+{
+    H5AC_aux_t         * aux_ptr;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(cache_ptr != NULL);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+    HDassert(aux_ptr->mpi_rank != 0);
+    HDassert(aux_ptr-> metadata_write_strategy == H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED);
+    HDassert(num_entries_ptr != NULL);
+    HDassert(*num_entries_ptr == 0);
+    HDassert(haddr_buf_ptr_ptr != NULL);
+    HDassert(*haddr_buf_ptr_ptr == NULL);
+
+    /* Retrieve the candidate list from process 0 */
+    if(H5AC__receive_haddr_list(aux_ptr->mpi_comm, num_entries_ptr, haddr_buf_ptr_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "can't receive clean list")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__receive_candidate_list() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__rsp__dist_md_write__flush
+ *
+ * Purpose:     Routine for handling the details of running a sync point
+ *		that is triggered by a flush -- which in turn must have been
+ *		triggered by either a flush API call or a file close --
+ *		when the distributed metadata write strategy is selected.  
+ *
+ *		Upon entry, each process generates it own candidate list, 
+ *              being a sorted list of all dirty metadata entries currently 
+ *		in the metadata cache.  Note that this list must be idendical 
+ *		across all processes, as all processes see the same stream 
+ *		of dirty metadata coming in, and use the same lists of 
+ *		candidate entries at each sync point.  (At first glance, this 
+ *		argument sounds circular, but think of it in the sense of
+ *		a recursive proof).
+ *
+ *		If this this list is empty, we are done, and the function 
+ *		returns
+ *
+ *		Otherwise, after the sorted list dirty metadata entries is 
+ *		constructed, each process uses the same algorithm to assign 
+ *		each entry on the candidate list to exactly one process for 
+ *		flushing.
+ *
+ *		At this point, all processes participate in a barrier to
+ *		avoid messages from the past/future bugs.
+ *
+ *		Each process then flushes the entries assigned to it, and 
+ *		marks all other entries on the candidate list as clean.
+ *
+ *		Finally, all processes participate in a second barrier to 
+ *		avoid messages from the past/future bugs.
+ *
+ *		At the end of this process, process 0 and only process 0
+ *		must tidy up its lists of dirtied and cleaned entries.   
+ *		These lists are not used in the distributed metadata write
+ *		strategy, but they must be maintained should we shift 
+ *		to a strategy that uses them.
+ *
+ * Return:      Success:        non-negative
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  John Mainzer
+ *              April 28, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__rsp__dist_md_write__flush(H5F_t *f, hid_t dxpl_id)
+{
+    H5AC_t     * cache_ptr;
+    H5AC_aux_t * aux_ptr;
+    haddr_t    * haddr_buf_ptr = NULL;
+    int		 mpi_result;
+    int          num_entries = 0;
+    herr_t	 ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f != NULL);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr != NULL);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+    HDassert(aux_ptr->metadata_write_strategy == H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED);
+
+    /* first construct the candidate list -- initially, this will be in the 
+     * form of a skip list.  We will convert it later.
+     */
+    if(H5C_construct_candidate_list__clean_cache(cache_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't construct candidate list.")
+
+    if(H5SL_count(aux_ptr->candidate_slist_ptr) > 0) {
+        herr_t	 result;
+
+        /* convert the candidate list into the format we
+         * are used to receiving from process 0.
+         */
+        if(H5AC__copy_candidate_list_to_buffer(cache_ptr, &num_entries, &haddr_buf_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't construct candidate buffer.")
+
+        /* initial sync point barrier */
+        if(MPI_SUCCESS != (mpi_result = MPI_Barrier(aux_ptr->mpi_comm)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_result)
+
+        /* Enable writes during this operation */
+        aux_ptr->write_permitted = TRUE;
+
+        /* Apply the candidate list */
+        result = H5C_apply_candidate_list(f, dxpl_id, cache_ptr, num_entries,
+            haddr_buf_ptr, aux_ptr->mpi_rank, aux_ptr->mpi_size);
+
+        /* Disable writes again */
+        aux_ptr->write_permitted = FALSE;
+
+        /* Check for error on the write operation */
+        if(result < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't apply candidate list.")
+
+        /* this code exists primarily for the test bed -- it allows us to
+         * enforce posix semantics on the server that pretends to be a 
+         * file system in our parallel tests.
+         */
+        if(aux_ptr->write_done)
+            (aux_ptr->write_done)();
+
+        /* final sync point barrier */
+        if(MPI_SUCCESS != (mpi_result = MPI_Barrier(aux_ptr->mpi_comm)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_result)
+
+	/* if this is process zero, tidy up the dirtied,
+         * and flushed and still clean lists.
+         */
+        if(aux_ptr->mpi_rank == 0)
+            if(H5AC__tidy_cache_0_lists(cache_ptr, num_entries, haddr_buf_ptr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't tidy up process 0 lists.")
+    } /* end if */
+
+    /* if it is defined, call the sync point done callback.  Note
+     * that this callback is defined purely for testing purposes,
+     * and should be undefined under normal operating circumstances.
+     */
+    if(aux_ptr->sync_point_done)
+        (aux_ptr->sync_point_done)(num_entries, haddr_buf_ptr);
+
+done:
+    if(haddr_buf_ptr)
+        haddr_buf_ptr = (haddr_t *)H5MM_xfree((void *)haddr_buf_ptr);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__rsp__dist_md_write__flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__rsp__dist_md_write__flush_to_min_clean
+ *
+ * Purpose:     Routine for handling the details of running a sync point
+ *		triggered by the accumulation of dirty metadata (as 
+ *		opposed to a flush call to the API) when the distributed
+ *		metadata write strategy is selected.
+ *
+ *		After invocation and initial sanity checking this function
+ *		first checks to see if evictions are enabled -- if they 
+ *		are not, the function does nothing and returns.
+ *
+ *		Otherwise, process zero constructs a list of entries to 
+ *		be flushed in order to bring the process zero cache back
+ *		within its min clean requirement.  Note that this list 
+ *		(the candidate list) may be empty.
+ *
+ *              Then, all processes participate in a barrier.
+ *
+ *		After the barrier, process 0 broadcasts the number of 
+ *		entries in the candidate list prepared above, and all 
+ *		other processes receive this number.
+ *
+ *		If this number is zero, we are done, and the function
+ *		returns without further action.
+ *
+ *		Otherwise, process 0 broadcasts the sorted list of 
+ *		candidate entries, and all other processes receive it.
+ *
+ *		Then, each process uses the same algorithm to assign 
+ *		each entry on the candidate list to exactly one process 
+ *		for flushing.
+ *
+ *		Each process then flushes the entries assigned to it, and 
+ *		marks all other entries on the candidate list as clean.
+ *
+ *		Finally, all processes participate in a second barrier to 
+ *		avoid messages from the past/future bugs.
+ *
+ *		At the end of this process, process 0 and only process 0
+ *		must tidy up its lists of dirtied and cleaned entries.   
+ *		These lists are not used in the distributed metadata write
+ *		strategy, but they must be maintained should we shift 
+ *		to a strategy that uses them.
+ *
+ * Return:      Success:        non-negative
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  John Mainzer
+ *              April 28, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__rsp__dist_md_write__flush_to_min_clean(H5F_t *f, hid_t dxpl_id)
+{
+    H5AC_t     * cache_ptr;
+    H5AC_aux_t * aux_ptr;
+    hbool_t 	 evictions_enabled;
+    herr_t	 ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f != NULL);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr != NULL);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+    HDassert(aux_ptr->metadata_write_strategy == H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED);
+
+    /* Query if evictions are allowed */
+    if(H5C_get_evictions_enabled((const H5C_t *)cache_ptr, &evictions_enabled) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5C_get_evictions_enabled() failed.")
+
+    if(evictions_enabled) {
+        /* construct candidate list -- process 0 only */
+        if(aux_ptr->mpi_rank == 0)
+            if(H5AC__construct_candidate_list(cache_ptr, aux_ptr, H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't construct candidate list.")
+
+        /* propagate and apply candidate list -- all processes */
+        if(H5AC__propagate_and_apply_candidate_list(f, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't propagate and apply candidate list.")
+    } /* evictions enabled */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__rsp__dist_md_write__flush_to_min_clean() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__rsp__p0_only__flush
+ *
+ * Purpose:     Routine for handling the details of running a sync point
+ *		that is triggered a flush -- which in turn must have been
+ *		triggered by either a flush API call or a file close -- 
+ *		when the process 0 only metadata write strategy is selected.  
+ *
+ *              First, all processes participate in a barrier.
+ *
+ *		Then process zero flushes all dirty entries, and broadcasts
+ *		they number of clean entries (if any) to all the other 
+ *		caches.
+ *
+ *		If this number is zero, we are done.
+ *
+ *		Otherwise, process 0 broadcasts the list of cleaned 
+ *		entries, and all other processes which are part of this
+ *		file group receive it, and mark the listed entries as
+ *		clean in their caches.
+ *
+ *		Since all processes have the same set of dirty 
+ *		entries at the beginning of the sync point, and all
+ *		entries that will be written are written before 
+ *		process zero broadcasts the number of cleaned entries,
+ *		there is no need for a closing barrier.
+ *
+ * Return:      Success:        non-negative
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  John Mainzer
+ *              April 28, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__rsp__p0_only__flush(H5F_t *f, hid_t dxpl_id)
+{
+    H5AC_t     * cache_ptr;
+    H5AC_aux_t * aux_ptr;
+    int		 mpi_result;
+    herr_t	 ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f != NULL);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr != NULL);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+    HDassert(aux_ptr->metadata_write_strategy == H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY);
+
+    /* to prevent "messages from the future" we must 
+     * synchronize all processes before we start the flush.  
+     * Hence the following barrier.
+     */
+    if(MPI_SUCCESS != (mpi_result = MPI_Barrier(aux_ptr->mpi_comm)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_result)
+
+    /* Flush data to disk, from rank 0 process */
+    if(aux_ptr->mpi_rank == 0) {
+        herr_t        result;
+
+        /* Enable writes during this operation */
+        aux_ptr->write_permitted = TRUE;
+
+        /* Flush the cache */
+        result = H5C_flush_cache(f, dxpl_id, H5AC__NO_FLAGS_SET);
+
+        /* Disable writes again */
+        aux_ptr->write_permitted = FALSE;
+
+        /* Check for error on the write operation */
+        if(result < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush.")
+
+        /* this code exists primarily for the test bed -- it allows us to
+         * enforce posix semantics on the server that pretends to be a 
+         * file system in our parallel tests.
+         */
+        if(aux_ptr->write_done)
+            (aux_ptr->write_done)();
+    } /* end if */
+
+    /* Propagate cleaned entries to other ranks. */
+    if(H5AC__propagate_flushed_and_still_clean_entries_list(f, H5AC_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't propagate clean entries list.")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__rsp__p0_only__flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__rsp__p0_only__flush_to_min_clean
+ *
+ * Purpose:     Routine for handling the details of running a sync point
+ *		triggered by the accumulation of dirty metadata (as 
+ *		opposed to a flush call to the API) when the process 0
+ *		only metadata write strategy is selected.
+ *
+ *		After invocation and initial sanity checking this function
+ *		first checks to see if evictions are enabled -- if they 
+ *		are not, the function does nothing and returns.
+ *
+ *              Otherwise, all processes participate in a barrier.
+ *
+ *		After the barrier, if this is process 0, the function 
+ *		causes the cache to flush sufficient entries to get the 
+ *		cache back within its minimum clean fraction, and broadcast 
+ *		the number of entries which have been flushed since 
+ *		the last sync point, and are still clean.
+ *
+ *		If this number is zero, we are done.
+ *
+ *		Otherwise, process 0 broadcasts the list of cleaned 
+ *		entries, and all other processes which are part of this
+ *		file group receive it, and mark the listed entries as
+ *		clean in their caches.
+ *
+ *		Since all processes have the same set of dirty 
+ *		entries at the beginning of the sync point, and all
+ *		entries that will be written are written before 
+ *		process zero broadcasts the number of cleaned entries,
+ *		there is no need for a closing barrier.
+ *
+ * Return:      Success:        non-negative
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  John Mainzer
+ *              April 28, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__rsp__p0_only__flush_to_min_clean(H5F_t *f, hid_t dxpl_id)
+{
+    H5AC_t     * cache_ptr;
+    H5AC_aux_t * aux_ptr;
+    hbool_t 	 evictions_enabled;
+    herr_t	 ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f != NULL);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr != NULL);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+    HDassert(aux_ptr->metadata_write_strategy == H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY);
+
+    /* Query if evictions are allowed */
+    if(H5C_get_evictions_enabled((const H5C_t *)cache_ptr, &evictions_enabled) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5C_get_evictions_enabled() failed.")
+
+    /* Flush if evictions are allowed -- following call
+     * will cause process 0 to flush to min clean size,
+     * and then propagate the newly clean entries to the
+     * other processes.
+     *
+     * Otherwise, do nothing.
+     */
+    if(evictions_enabled) {
+        int          mpi_result;
+
+        /* to prevent "messages from the future" we must synchronize all
+         * processes before we start the flush.  This synchronization may
+         * already be done -- hence the do_barrier parameter.
+         */
+        if(MPI_SUCCESS != (mpi_result = MPI_Barrier(aux_ptr->mpi_comm)))
+            HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_result)
+
+        if(0 == aux_ptr->mpi_rank) {
+            herr_t	 result;
+
+            /* here, process 0 flushes as many entries as necessary to 
+             * comply with the currently specified min clean size.
+             * Note that it is quite possible that no entries will be 
+             * flushed.
+             */
+
+            /* Enable writes during this operation */
+            aux_ptr->write_permitted = TRUE;
+
+            /* Flush the cache */
+            result = H5C_flush_to_min_clean(f, dxpl_id);
+
+            /* Disable writes again */
+            aux_ptr->write_permitted = FALSE;
+
+            /* Check for error on the write operation */
+            if(result < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_flush_to_min_clean() failed.")
+
+            /* this call exists primarily for the test code -- it is used
+ 	     * to enforce POSIX semantics on the process used to simulate
+ 	     * reads and writes in t_cache.c.
+             */
+            if(aux_ptr->write_done)
+                (aux_ptr->write_done)();
+        } /* end if */
+
+        if(H5AC__propagate_flushed_and_still_clean_entries_list(f, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't propagate clean entries list.")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__rsp__p0_only__flush_to_min_clean() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__run_sync_point
+ *
+ * Purpose:     Top level routine for managing a sync point between all
+ *		meta data caches in the parallel case.  Since all caches 
+ *		see the same sequence of dirty metadata, we simply count
+ *		bytes of dirty metadata, and run a sync point whenever the
+ *		number of dirty bytes of metadata seen since the last
+ *		sync point exceeds a threshold that is common across all
+ *		processes.  We also run sync points in response to 
+ *		HDF5 API calls triggering either a flush or a file close.
+ *
+ *		In earlier versions of PHDF5, only the metadata cache with 
+ *		mpi rank 0 was allowed to write to file.  All other 
+ *		metadata caches on processes with rank greater than 0 were
+ *		required to retain dirty entries until they were notified 
+ *		that the entry is was clean.
+ *
+ *		This function was created to make it easier for us to 
+ *		experiment with other options, as it is a single point 
+ *		for the execution of sync points.  
+ *
+ * Return:      Success:        non-negative
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  John Mainzer
+ *              March 11, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__run_sync_point(H5F_t *f, hid_t dxpl_id, int sync_point_op)
+{
+    H5AC_t     * cache_ptr;
+    H5AC_aux_t * aux_ptr;
+    herr_t	 ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity checks */
+    HDassert(f != NULL);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr != NULL);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+    HDassert((sync_point_op == H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN) ||
+        (sync_point_op == H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED));
+
+#if H5AC_DEBUG_DIRTY_BYTES_CREATION
+HDfprintf(stdout, "%d:H5AC_propagate...:%u: (u/uu/i/iu/r/ru) = %zu/%u/%zu/%u/%zu/%u\n",
+    aux_ptr->mpi_rank,
+    aux_ptr->dirty_bytes_propagations,
+    aux_ptr->unprotect_dirty_bytes,
+    aux_ptr->unprotect_dirty_bytes_updates,
+    aux_ptr->insert_dirty_bytes,
+    aux_ptr->insert_dirty_bytes_updates,
+    aux_ptr->rename_dirty_bytes,
+    aux_ptr->rename_dirty_bytes_updates);
+#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
+
+    switch(aux_ptr->metadata_write_strategy) {
+        case H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY:
+	    switch(sync_point_op) {
+                case H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN:
+	            if(H5AC__rsp__p0_only__flush_to_min_clean(f, dxpl_id) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5AC__rsp__p0_only__flush_to_min_clean() failed.")
+		    break;
+
+		case H5AC_SYNC_POINT_OP__FLUSH_CACHE:
+	            if(H5AC__rsp__p0_only__flush(f, dxpl_id) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5AC__rsp__p0_only__flush() failed.")
+		    break;
+
+		default:
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unknown flush op");
+		    break;
+	    } /* end switch */
+	    break;
+
+	case H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED:
+	    switch(sync_point_op) {
+                case H5AC_SYNC_POINT_OP__FLUSH_TO_MIN_CLEAN:
+	            if(H5AC__rsp__dist_md_write__flush_to_min_clean(f, dxpl_id) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5AC__rsp__dist_md_write__flush_to_min_clean() failed.")
+		    break;
+
+		case H5AC_SYNC_POINT_OP__FLUSH_CACHE:
+	            if(H5AC__rsp__dist_md_write__flush(f, dxpl_id) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "H5AC__rsp__dist_md_write__flush() failed.")
+		    break;
+
+		default:
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unknown flush op");
+		    break;
+	    } /* end switch */
+	    break;
+
+	default:
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown metadata write strategy.")
+	    break;
+    } /* end switch */
+
+    /* reset the dirty bytes count */
+    aux_ptr->dirty_bytes = 0;
+
+#if H5AC_DEBUG_DIRTY_BYTES_CREATION
+    aux_ptr->dirty_bytes_propagations     += 1;
+    aux_ptr->unprotect_dirty_bytes         = 0;
+    aux_ptr->unprotect_dirty_bytes_updates = 0;
+    aux_ptr->insert_dirty_bytes            = 0;
+    aux_ptr->insert_dirty_bytes_updates    = 0;
+    aux_ptr->rename_dirty_bytes            = 0;
+    aux_ptr->rename_dirty_bytes_updates    = 0;
+#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__run_sync_point() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__tidy_cache_0_lists()
+ *
+ * Purpose:     In the distributed metadata write strategy, not all dirty
+ *		entries are written by process 0 -- thus we must tidy
+ *		up the dirtied, and flushed and still clean lists 
+ *		maintained by process zero after each sync point.
+ *
+ *		This procedure exists to tend to this issue.
+ *
+ *		At this point, all entries that process 0 cleared should
+ *		have been removed from both the dirty and flushed and 
+ *		still clean lists, and entries that process 0 has flushed
+ *		should have been removed from the dirtied list and added
+ *		to the flushed and still clean list.
+ *
+ *		However, since the distributed metadata write strategy
+ *		doesn't make use of these lists, the objective is simply
+ *		to maintain these lists in consistent state that allows
+ *		them to be used should the metadata write strategy change
+ *		to one that uses these lists.
+ *
+ *		Thus for our purposes, all we need to do is remove from 
+ *		the dirtied and flushed and still clean lists all
+ *		references to entries that appear in the candidate list.
+ *
+ * Return:      Success:        non-negative
+ *
+ *              Failure:        negative
+ *
+ * Programmer:  John Mainzer
+ *              4/20/10
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5AC__tidy_cache_0_lists(H5AC_t *cache_ptr, int num_candidates,
+    haddr_t *candidates_list_ptr)
+{
+    H5AC_aux_t         * aux_ptr;
+    int                  i;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(cache_ptr != NULL);
+    aux_ptr = H5C_get_aux_ptr(cache_ptr);
+    HDassert(aux_ptr != NULL);
+    HDassert(aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC);
+    HDassert(aux_ptr->metadata_write_strategy == H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED);
+    HDassert(aux_ptr->mpi_rank == 0);
+    HDassert(num_candidates > 0);
+    HDassert(candidates_list_ptr != NULL);
+
+    /* clean up dirtied and flushed and still clean lists by removing 
+     * all entries on the candidate list.  Cleared entries should 
+     * have been removed from both the dirty and cleaned lists at 
+     * this point, flushed entries should have been added to the 
+     * cleaned list.  However, for this metadata write strategy, 
+     * we just want to remove all references to the candidate entries.
+     */
+    for(i = 0; i < num_candidates; i++) {
+        H5AC_slist_entry_t * d_slist_entry_ptr;
+        H5AC_slist_entry_t * c_slist_entry_ptr;
+        haddr_t              addr;
+
+        addr = candidates_list_ptr[i];
+
+        /* addr may be either on the dirtied list, or on the flushed 
+         * and still clean list.  Remove it.
+         */
+        if(NULL != (d_slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_remove(aux_ptr->d_slist_ptr, (void *)&addr)))
+            d_slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, d_slist_entry_ptr);
+        if(NULL != (c_slist_entry_ptr = (H5AC_slist_entry_t *)H5SL_remove(aux_ptr->c_slist_ptr, (void *)&addr)))
+            c_slist_entry_ptr = H5FL_FREE(H5AC_slist_entry_t, c_slist_entry_ptr);
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5AC__tidy_cache_0_lists() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5AC__flush_entries
+ *
+ * Purpose:     Flush the metadata cache associated with the specified file,
+ *              only writing from rank 0, but propagating the cleaned entries
+ *              to all ranks.
+ *
+ * Return:      Non-negative on success/Negative on failure if there was a
+ *              request to flush all items and something was protected.
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Aug 22 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5AC__flush_entries(H5F_t *f, hid_t dxpl_id)
+{
+    herr_t        ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared->cache);
+
+    /* Check if we have >1 ranks */
+    if(H5C_get_aux_ptr(f->shared->cache))
+        if(H5AC__run_sync_point(f, dxpl_id, H5AC_SYNC_POINT_OP__FLUSH_CACHE) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't run sync point.")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5AC__flush_entries() */
+#endif /* H5_HAVE_PARALLEL */
+
diff --git a/src/H5ACpkg.h b/src/H5ACpkg.h
index ad768ef..82e500e 100644
--- a/src/H5ACpkg.h
+++ b/src/H5ACpkg.h
@@ -28,7 +28,7 @@
  *
  */
 
-#ifndef H5AC_PACKAGE
+#if !(defined H5AC_FRIEND || defined H5AC_MODULE)
 #error "Do not include this file outside the H5AC package!"
 #endif
 
@@ -41,8 +41,20 @@
 
 /* Get needed headers */
 #include "H5Cprivate.h"         /* Cache                                */
+#include "H5FLprivate.h"        /* Free Lists                           */
 #include "H5SLprivate.h"        /* Skip lists */
 
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+/* Declare extern the free list to manage the H5AC_aux_t struct */
+H5FL_EXTERN(H5AC_aux_t);
+
+
+/**************************/
+/* Package Private Macros */
+/**************************/
 
 #define H5AC_DEBUG_DIRTY_BYTES_CREATION	0
 
@@ -64,10 +76,10 @@
  *-------------------------------------------------------------------------
  */
 
-#define H5AC__MIN_DIRTY_BYTES_THRESHOLD		(int32_t) \
+#define H5AC__MIN_DIRTY_BYTES_THRESHOLD		(size_t) \
 						(H5C__MIN_MAX_CACHE_SIZE / 2)
 #define H5AC__DEFAULT_DIRTY_BYTES_THRESHOLD	(256 * 1024)
-#define H5AC__MAX_DIRTY_BYTES_THRESHOLD   	(int32_t) \
+#define H5AC__MAX_DIRTY_BYTES_THRESHOLD   	(size_t) \
 						(H5C__MAX_MAX_CACHE_SIZE / 4)
 
 
@@ -142,6 +154,29 @@
  *
  *                                              JRM - 6/27/05
  *
+ * Update: When the above was written, I planned to allow the process
+ *	0 metadata cache to write dirty metadata between sync points.
+ *	However, testing indicated that this allowed occasional 
+ *	messages from the future to reach the caches on other processes.
+ *
+ *	To resolve this, the code was altered to require that all metadata
+ *	writes take place during sync points -- which solved the problem.
+ *	Initially all writes were performed by the process 0 cache.  This 
+ *	approach was later replaced with a distributed write approach
+ *	in which each process writes a subset of the metadata to be 
+ *	written.  
+ *
+ *	After thinking on the matter for a while, I arrived at the 
+ *	conclusion that the process 0 cache could be allowed to write 
+ *	dirty metadata between sync points if it restricted itself to 
+ *	entries that had been dirty at the time of the previous sync point.  
+ *	
+ *	To date, there has been no attempt to implement this optimization.
+ *	However, should it be attempted, much of the supporting code 
+ *	should still be around.
+ *
+ *						JRM -- 1/6/15
+ *
  * magic:       Unsigned 32 bit integer always set to
  *		H5AC__H5AC_AUX_T_MAGIC.  This field is used to validate
  *		pointers to instances of H5AC_aux_t.
@@ -180,6 +215,10 @@
  *		field exists to facilitate experiments with other 
  *		strategies.
  *
+ *		At present, this field must be set to either
+ *		H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY or 
+ *		H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED.
+ *
  * dirty_bytes_propagations: This field only exists when the
  *		H5AC_DEBUG_DIRTY_BYTES_CREATION #define is TRUE.
  *
@@ -270,11 +309,6 @@
  *		To reitterate, this field is only used on process 0 -- it
  *		should be NULL on all other processes.
  *
- * d_slist_len: Integer field containing the number of entries in the
- *		dirty entry list.  This field should always contain the
- *		value 0 on all processes other than process 0.  It exists
- *		primarily for sanity checking.
- *
  * c_slist_ptr: Pointer to an instance of H5SL_t used to maintain a list
  *		of entries that were dirty, have been flushed
  *		to disk since the last clean entries broadcast, and are
@@ -285,11 +319,6 @@
  *		the next clean entries broadcast.  The list emptied after
  *		each broadcast.
  *
- * c_slist_len: Integer field containing the number of entries in the clean
- *		entries list (*c_slist_ptr).  This field should always
- *		contain the value 0 on all processes other than process 0.
- *		It exists primarily for sanity checking.
- *
  * The following two fields are used only when metadata_write_strategy
  * is H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED.
  *
@@ -298,9 +327,6 @@
  *		point.  This list is then broadcast to the other processes,
  *		which then either flush or mark clean all entries on it.
  *
- * candidate_slist_len: Integer field containing the number of entries on the
- *		candidate list.  It exists primarily for sanity checking.
- *
  * write_done:  In the parallel test bed, it is necessary to ensure that
  *              all writes to the server process from cache 0 complete
  *              before it enters the barrier call with the other caches.
@@ -344,47 +370,115 @@ typedef struct H5AC_aux_t
 
     hbool_t	write_permitted;
 
-    int32_t	dirty_bytes_threshold;
+    size_t	dirty_bytes_threshold;
 
-    int32_t	dirty_bytes;
+    size_t	dirty_bytes;
 
     int32_t	metadata_write_strategy;
 
 #if H5AC_DEBUG_DIRTY_BYTES_CREATION
 
-    int32_t	dirty_bytes_propagations;
+    unsigned	dirty_bytes_propagations;
 
-    int32_t     unprotect_dirty_bytes;
-    int32_t     unprotect_dirty_bytes_updates;
+    size_t      unprotect_dirty_bytes;
+    unsigned    unprotect_dirty_bytes_updates;
 
-    int32_t     insert_dirty_bytes;
-    int32_t     insert_dirty_bytes_updates;
+    size_t      insert_dirty_bytes;
+    unsigned    insert_dirty_bytes_updates;
 
-    int32_t     move_dirty_bytes;
-    int32_t     move_dirty_bytes_updates;
+    size_t      move_dirty_bytes;
+    unsigned    move_dirty_bytes_updates;
 
 #endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */
 
     H5SL_t *	d_slist_ptr;
 
-    int32_t	d_slist_len;
-
     H5SL_t *	c_slist_ptr;
 
-    int32_t	c_slist_len;
-
     H5SL_t *	candidate_slist_ptr;
 
-    int32_t	candidate_slist_len;
-
     void	(* write_done)(void);
 
     void	(* sync_point_done)(int num_writes, 
                                     haddr_t * written_entries_tbl);
-
 } H5AC_aux_t; /* struct H5AC_aux_t */
 
+/* Package scoped functions */
+H5_DLL herr_t H5AC__log_deleted_entry(const H5AC_info_t *entry_ptr);
+H5_DLL herr_t H5AC__log_dirtied_entry(const H5AC_info_t *entry_ptr);
+H5_DLL herr_t H5AC__log_flushed_entry(H5C_t *cache_ptr, haddr_t addr,
+    hbool_t was_dirty, unsigned flags);
+H5_DLL herr_t H5AC__log_inserted_entry(const H5AC_info_t *entry_ptr);
+H5_DLL herr_t H5AC__log_moved_entry(const H5F_t *f, haddr_t old_addr,
+    haddr_t new_addr);
+H5_DLL herr_t H5AC__flush_entries(H5F_t *f, hid_t dxpl_id);
+H5_DLL herr_t H5AC__run_sync_point(H5F_t *f, hid_t dxpl_id, int sync_point_op);
+H5_DLL herr_t H5AC__set_sync_point_done_callback(H5C_t *cache_ptr,
+    void (*sync_point_done)(int num_writes, haddr_t *written_entries_tbl));
+H5_DLL herr_t H5AC__set_write_done_callback(H5C_t * cache_ptr,
+    void (* write_done)(void));
+
 #endif /* H5_HAVE_PARALLEL */
 
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+
+/* Cache logging routines */
+H5_DLL herr_t H5AC__write_create_cache_log_msg(H5AC_t *cache);
+H5_DLL herr_t H5AC__write_destroy_cache_log_msg(H5AC_t *cache);
+H5_DLL herr_t H5AC__write_evict_cache_log_msg(const H5AC_t *cache,
+                                        herr_t fxn_ret_value);
+H5_DLL herr_t H5AC__write_expunge_entry_log_msg(const H5AC_t *cache,
+                                                haddr_t address,
+                                                int type_id,
+                                                herr_t fxn_ret_value);
+H5_DLL herr_t H5AC__write_flush_cache_log_msg(const H5AC_t *cache,
+                                              herr_t fxn_ret_value);
+H5_DLL herr_t H5AC__write_insert_entry_log_msg(const H5AC_t *cache,
+                                               haddr_t address,
+                                               int type_id,
+                                               unsigned flags,
+                                               size_t size,
+                                               herr_t fxn_ret_value);
+H5_DLL herr_t H5AC__write_mark_dirty_entry_log_msg(const H5AC_t *cache,
+                                                   const H5AC_info_t *entry,
+                                                   herr_t fxn_ret_value);
+H5_DLL herr_t H5AC__write_move_entry_log_msg(const H5AC_t *cache,
+                                             haddr_t old_addr,
+                                             haddr_t new_addr,
+                                             int type_id,
+                                             herr_t fxn_ret_value);
+H5_DLL herr_t H5AC__write_pin_entry_log_msg(const H5AC_t *cache,
+                                            const H5AC_info_t *entry,
+                                            herr_t fxn_ret_value);
+H5_DLL herr_t H5AC__write_create_fd_log_msg(const H5AC_t *cache,
+                                            const H5AC_info_t *parent,
+                                            const H5AC_info_t *child,
+                                            herr_t fxn_ret_value);
+H5_DLL herr_t H5AC__write_protect_entry_log_msg(const H5AC_t *cache,
+                                                const H5AC_info_t *entry,
+                                                unsigned flags,
+                                                herr_t fxn_ret_value);
+H5_DLL herr_t H5AC__write_resize_entry_log_msg(const H5AC_t *cache,
+                                               const H5AC_info_t *entry,
+                                               size_t new_size,
+                                               herr_t fxn_ret_value);
+H5_DLL herr_t H5AC__write_unpin_entry_log_msg(const H5AC_t *cache,
+                                              const H5AC_info_t *entry,
+                                              herr_t fxn_ret_value);
+H5_DLL herr_t H5AC__write_destroy_fd_log_msg(const H5AC_t *cache,
+                                             const H5AC_info_t *parent,
+                                             const H5AC_info_t *child,
+                                             herr_t fxn_ret_value);
+H5_DLL herr_t H5AC__write_unprotect_entry_log_msg(const H5AC_t *cache,
+                                                  const H5AC_info_t *entry,
+                                                  int type_id,
+                                                  unsigned flags,
+                                                  herr_t fxn_ret_value);
+H5_DLL herr_t H5AC__write_set_cache_config_log_msg(const H5AC_t *cache,
+                                                   const H5AC_cache_config_t *config,
+                                                   herr_t fxn_ret_value);
+
 #endif /* _H5ACpkg_H */
 
diff --git a/src/H5ACprivate.h b/src/H5ACprivate.h
index 724d44a..1c81976 100644
--- a/src/H5ACprivate.h
+++ b/src/H5ACprivate.h
@@ -42,28 +42,47 @@
 #define H5AC__TRACE_FILE_ENABLED	0
 #endif /* H5_METADATA_TRACE_FILE */
 
+/* Global metadata tag values */
+#define H5AC__INVALID_TAG      (haddr_t)0
+#define H5AC__IGNORE_TAG       (haddr_t)1
+#define H5AC__SUPERBLOCK_TAG   (haddr_t)2
+#define H5AC__FREESPACE_TAG    (haddr_t)3
+#define H5AC__SOHM_TAG         (haddr_t)4
+#define H5AC__GLOBALHEAP_TAG   (haddr_t)5
+#define H5AC__COPIED_TAG       (haddr_t)6
+
 /* Types of metadata objects cached */
 typedef enum {
-    H5AC_BT_ID = 0, 	/*B-tree nodes				     */
-    H5AC_SNODE_ID,	/*symbol table nodes			     */
-    H5AC_LHEAP_PRFX_ID, /*local heap prefix			     */
-    H5AC_LHEAP_DBLK_ID, /*local heap data block			     */
-    H5AC_GHEAP_ID,	/*global heap				     */
-    H5AC_OHDR_ID,	/*object header				     */
-    H5AC_OHDR_CHK_ID,	/*object header chunk			     */
-    H5AC_BT2_HDR_ID,	/*v2 B-tree header			     */
-    H5AC_BT2_INT_ID,	/*v2 B-tree internal node		     */
-    H5AC_BT2_LEAF_ID,	/*v2 B-tree leaf node			     */
-    H5AC_FHEAP_HDR_ID,	/*fractal heap header			     */
-    H5AC_FHEAP_DBLOCK_ID, /*fractal heap direct block		     */
-    H5AC_FHEAP_IBLOCK_ID, /*fractal heap indirect block		     */
-    H5AC_FSPACE_HDR_ID,	/*free space header			     */
-    H5AC_FSPACE_SINFO_ID,/*free space sections			     */
-    H5AC_SOHM_TABLE_ID, /*shared object header message master table  */
-    H5AC_SOHM_LIST_ID,  /*shared message index stored as a list      */
-    H5AC_SUPERBLOCK_ID, /* file superblock                           */
-    H5AC_TEST_ID,	/*test entry -- not used for actual files    */
-    H5AC_NTYPES		/* Number of types, must be last             */
+    H5AC_BT_ID = 0, 			/* ( 0) B-tree nodes				     */
+    H5AC_SNODE_ID,			/* ( 1) symbol table nodes			     */
+    H5AC_LHEAP_PRFX_ID, 		/* ( 2) local heap prefix			     */
+    H5AC_LHEAP_DBLK_ID, 		/* ( 3) local heap data block			     */
+    H5AC_GHEAP_ID,			/* ( 4) global heap				     */
+    H5AC_OHDR_ID,			/* ( 5) object header				     */
+    H5AC_OHDR_CHK_ID,			/* ( 6) object header chunk			     */
+    H5AC_OHDR_PROXY_ID, 		/* ( 7) object header proxy                        */
+    H5AC_BT2_HDR_ID,			/* ( 8) v2 B-tree header			     */
+    H5AC_BT2_INT_ID,			/* ( 9) v2 B-tree internal node		     */
+    H5AC_BT2_LEAF_ID,			/* (10) v2 B-tree leaf node			     */
+    H5AC_FHEAP_HDR_ID,			/* (11) fractal heap header			     */
+    H5AC_FHEAP_DBLOCK_ID, 		/* (12) fractal heap direct block		     */
+    H5AC_FHEAP_IBLOCK_ID, 		/* (13) fractal heap indirect block		     */
+    H5AC_FSPACE_HDR_ID,			/* (14) free space header			     */
+    H5AC_FSPACE_SINFO_ID,		/* (15) free space sections			     */
+    H5AC_SOHM_TABLE_ID, 		/* (16) shared object header message master table  */
+    H5AC_SOHM_LIST_ID,  		/* (17) shared message index stored as a list      */
+    H5AC_EARRAY_HDR_ID,			/* (18) extensible array header		     */
+    H5AC_EARRAY_IBLOCK_ID, 		/* (19) extensible array index block	             */
+    H5AC_EARRAY_SBLOCK_ID, 		/* (20) extensible array super block	             */
+    H5AC_EARRAY_DBLOCK_ID, 		/* (21) extensible array data block	             */
+    H5AC_EARRAY_DBLK_PAGE_ID, 		/* (22) extensible array data block page           */
+    H5AC_FARRAY_HDR_ID,			/* (23) fixed array header		     	     */
+    H5AC_FARRAY_DBLOCK_ID, 		/* (24) fixed array data block	     	     */
+    H5AC_FARRAY_DBLK_PAGE_ID,		/* (25) fixed array data block page          	     */
+    H5AC_SUPERBLOCK_ID, 		/* (26) file superblock                            */
+    H5AC_DRVRINFO_ID,   		/* (27) driver info block (supplements superblock)*/
+    H5AC_TEST_ID,			/* (28) test entry -- not used for actual files    */
+    H5AC_NTYPES				/* Number of types, must be last              */
 } H5AC_type_t;
 
 /* H5AC_DUMP_STATS_ON_CLOSE should always be FALSE when
@@ -74,6 +93,17 @@ typedef enum {
  * times for debugging purposes.
  *
  * Hence the following, somewhat odd set of #defines.
+ *
+ * NOTE: test/cache plays games with the f->shared->cache, and thus 
+ *       setting H5AC_DUMP_STATS_ON_CLOSE will generate constant, 
+ *	 irrelevant data when run with that test program.  See 
+ * 	 comments on setup_cache() / takedown_cache() in test/cache_common.c.
+ *       for details.
+ *
+ *	 If you need to dump stats at file close in test/cache.c,
+ *	 use the dump_stats parameter to takedown_cache(), or call 
+ *	 H5C_stats() directly.
+ *					JRM -- 4/12/15
  */
 #if H5C_COLLECT_CACHE_STATS
 
@@ -92,78 +122,76 @@ typedef enum {
 #define H5AC__DEFAULT_MAX_CACHE_SIZE	H5C__DEFAULT_MAX_CACHE_SIZE
 #define H5AC__DEFAULT_MIN_CLEAN_SIZE	H5C__DEFAULT_MIN_CLEAN_SIZE
 
+/* Check if we are sanity checking tagging */
+#if H5C_DO_TAGGING_SANITY_CHECKS
+#define H5AC_DO_TAGGING_SANITY_CHECKS 1
+#else
+#define H5AC_DO_TAGGING_SANITY_CHECKS 0
+#endif
 
 /*
  * Class methods pertaining to caching.	 Each type of cached object will
  * have a constant variable with permanent life-span that describes how
- * to cache the object.	 That variable will be of type H5AC_class_t and
- * have the following required fields...
- *
- * LOAD:	Loads an object from disk to memory.  The function
- *		should allocate some data structure and return it.
- *
- * FLUSH:	Writes some data structure back to disk.  It would be
- *		wise for the data structure to include dirty flags to
- *		indicate whether it really needs to be written.	 This
- *		function is also responsible for freeing memory allocated
- *		by the LOAD method if the DEST argument is non-zero (by
- *              calling the DEST method).
- *
- * DEST:	Just frees memory allocated by the LOAD method.
- *
- * CLEAR:	Just marks object as non-dirty.
- *
- * SIZE:	Report the size (on disk) of the specified cache object.
- *		Note that the space allocated on disk may not be contiguous.
+ * to cache the object.
  */
 
-#define H5AC_CALLBACK__NO_FLAGS_SET             H5C_CALLBACK__NO_FLAGS_SET
-#define H5AC_CALLBACK__SIZE_CHANGED_FLAG	H5C_CALLBACK__SIZE_CHANGED_FLAG
-#define H5AC_CALLBACK__MOVED_FLAG             H5C_CALLBACK__MOVED_FLAG
-
-typedef H5C_load_func_t		H5AC_load_func_t;
-typedef H5C_flush_func_t	H5AC_flush_func_t;
-typedef H5C_dest_func_t		H5AC_dest_func_t;
-typedef H5C_clear_func_t	H5AC_clear_func_t;
-typedef H5C_size_func_t		H5AC_size_func_t;
+#define H5AC__SERIALIZE_RESIZED_FLAG	H5C__SERIALIZE_RESIZED_FLAG
+#define H5AC__SERIALIZE_MOVED_FLAG	H5C__SERIALIZE_MOVED_FLAG
+#define H5AC__SERIALIZE_COMPRESSED_FLAG	H5C__SERIALIZE_COMPRESSED_FLAG
+
+/* Cork actions: cork/uncork/get cork status of an object */
+#define H5AC__SET_CORK             	H5C__SET_CORK
+#define H5AC__UNCORK             	H5C__UNCORK
+#define H5AC__GET_CORKED             	H5C__GET_CORKED
+
+/* Aliases for the "ring" type and values */
+typedef H5C_ring_t       H5AC_ring_t;
+#define H5AC_RING_INV    H5C_RING_UNDEFINED
+#define H5AC_RING_US     H5C_RING_USER
+#define H5AC_RING_FSM    H5C_RING_FSM
+#define H5AC_RING_SBE    H5C_RING_SBE
+#define H5AC_RING_SB     H5C_RING_SB
+#define H5AC_RING_NTYPES H5C_RING_NTYPES
+
+/* Aliases for 'notify action' type & values */
+typedef H5C_notify_action_t     H5AC_notify_action_t;
+#define H5AC_NOTIFY_ACTION_AFTER_INSERT H5C_NOTIFY_ACTION_AFTER_INSERT
+#define H5AC_NOTIFY_ACTION_AFTER_LOAD   H5C_NOTIFY_ACTION_AFTER_LOAD
+#define H5AC_NOTIFY_ACTION_AFTER_FLUSH	H5C_NOTIFY_ACTION_AFTER_FLUSH
+#define H5AC_NOTIFY_ACTION_BEFORE_EVICT H5C_NOTIFY_ACTION_BEFORE_EVICT
+
+#define H5AC__CLASS_NO_FLAGS_SET 	H5C__CLASS_NO_FLAGS_SET
+#define H5AC__CLASS_SPECULATIVE_LOAD_FLAG H5C__CLASS_SPECULATIVE_LOAD_FLAG
+#define H5AC__CLASS_COMPRESSED_FLAG	H5C__CLASS_COMPRESSED_FLAG
+
+/* The following flags should only appear in test code */
+/* The H5AC__CLASS_SKIP_READS & H5AC__CLASS_SKIP_WRITES flags are used in H5Oproxy.c */
+#define H5AC__CLASS_NO_IO_FLAG		H5C__CLASS_NO_IO_FLAG
+#define H5AC__CLASS_SKIP_READS		H5C__CLASS_SKIP_READS
+#define H5AC__CLASS_SKIP_WRITES		H5C__CLASS_SKIP_WRITES
+
+typedef H5C_get_load_size_func_t	H5AC_get_load_size_func_t;
+typedef H5C_verify_chksum_func_t	H5AC_verify_chksum_func_t;
+typedef H5C_deserialize_func_t		H5AC_deserialize_func_t;
+typedef H5C_image_len_func_t		H5AC_image_len_func_t;
+
+#define H5AC__SERIALIZE_NO_FLAGS_SET    H5C__SERIALIZE_NO_FLAGS_SET
+#define H5AC__SERIALIZE_RESIZED_FLAG    H5C__SERIALIZE_RESIZED_FLAG
+#define H5AC__SERIALIZE_MOVED_FLAG      H5C__SERIALIZE_MOVED_FLAG
+
+typedef H5C_pre_serialize_func_t	H5AC_pre_serialize_func_t;
+typedef H5C_serialize_func_t		H5AC_serialize_func_t;
+typedef H5C_notify_func_t		H5AC_notify_func_t;
+typedef H5C_free_icr_func_t		H5AC_free_icr_func_t;
+typedef H5C_clear_func_t		H5AC_clear_func_t;
+typedef H5C_get_fsf_size_t		H5AC_get_fsf_size_t;
 
 typedef H5C_class_t			H5AC_class_t;
 
-
-/* The H5AC_NSLOTS #define is now obsolete, as the metadata cache no longer
- * uses slots.  However I am leaving it in for now to avoid modifying the
- * interface between the metadata cache and the rest of HDF.  It should
- * be removed when we get to dealing with the size_hint parameter in
- * H5AC_create().
- *						JRM - 5/20/04
- *
- * Old comment on H5AC_NSLOTS follows:
- *
- * A cache has a certain number of entries.  Objects are mapped into a
- * cache entry by hashing the object's file address.  Each file has its
- * own cache, an array of slots.
- */
-#define H5AC_NSLOTS     10330           /* The library "likes" this number... */
-
-
+/* Cache entry info */
 typedef H5C_cache_entry_t		H5AC_info_t;
 
 
-/*===----------------------------------------------------------------------===
- *                             Protect Types
- *===----------------------------------------------------------------------===
- *
- * These are for the wrapper functions to H5AC_protect. They specify what
- * type of operation you're planning on doing to the metadata. The
- * Flexible Parallel HDF5 locking can then act accordingly.
- */
-
-typedef enum H5AC_protect_t {
-    H5AC_WRITE,                 /* Protect object for writing                */
-    H5AC_READ                   /* Protect object for reading                */
-} H5AC_protect_t;
-
-
 /* Typedef for metadata cache (defined in H5Cpkg.h) */
 typedef H5C_t	H5AC_t;
 
@@ -176,6 +204,8 @@ typedef H5C_t	H5AC_t;
 #define H5AC_COLLECTIVE_META_WRITE_DEF          0
 #endif /* H5_HAVE_PARALLEL */
 
+#define H5AC_RING_NAME  "H5AC_ring_type"
+
 /* Dataset transfer property list for flush calls */
 /* (Collective set, "block before metadata write" set and "library internal" set) */
 /* (Global variable declaration, definition is in H5AC.c) */
@@ -184,8 +214,8 @@ extern hid_t H5AC_dxpl_id;
 /* Dataset transfer property list for independent metadata I/O calls */
 /* (just "library internal" set - i.e. independent transfer mode) */
 /* (Global variable declaration, definition is in H5AC.c) */
-extern H5P_genplist_t *H5AC_ind_dxpl_g;
-extern hid_t H5AC_ind_dxpl_id;
+H5_DLLVAR H5P_genplist_t *H5AC_ind_dxpl_g;
+H5_DLLVAR hid_t H5AC_ind_dxpl_id;
 
 
 /* Default cache configuration. */
@@ -204,28 +234,28 @@ extern hid_t H5AC_ind_dxpl_id;
   /* hbool_t     evictions_enabled      = */ TRUE,                            \
   /* hbool_t     set_initial_size       = */ TRUE,                            \
   /* size_t      initial_size           = */ ( 2 * 1024 * 1024),              \
-  /* double      min_clean_fraction     = */ 0.3,                             \
+  /* double      min_clean_fraction     = */ 0.3f,                            \
   /* size_t      max_size               = */ (32 * 1024 * 1024),              \
   /* size_t      min_size               = */ (1 * 1024 * 1024),               \
   /* long int    epoch_length           = */ 50000,                           \
   /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,             \
-  /* double      lower_hr_threshold     = */ 0.9F,                            \
-  /* double      increment              = */ 2.0F,                            \
+  /* double      lower_hr_threshold     = */ 0.9f,                            \
+  /* double      increment              = */ 2.0f,                            \
   /* hbool_t     apply_max_increment    = */ TRUE,                            \
   /* size_t      max_increment          = */ (4 * 1024 * 1024),               \
   /* enum H5C_cache_flash_incr_mode       */                                  \
   /*                    flash_incr_mode = */ H5C_flash_incr__add_space,       \
-  /* double      flash_multiple         = */ 1.0F,                            \
-  /* double      flash_threshold        = */ 0.25F,                            \
+  /* double      flash_multiple         = */ 1.0f,                            \
+  /* double      flash_threshold        = */ 0.25f,                           \
   /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, \
-  /* double      upper_hr_threshold     = */ H5_DOUBLE(0.999),                 \
-  /* double      decrement              = */ 0.9F,                            \
+  /* double      upper_hr_threshold     = */ 0.999f,                          \
+  /* double      decrement              = */ 0.9f,                            \
   /* hbool_t     apply_max_decrement    = */ TRUE,                            \
   /* size_t      max_decrement          = */ (1 * 1024 * 1024),               \
   /* int         epochs_before_eviction = */ 3,                               \
   /* hbool_t     apply_empty_reserve    = */ TRUE,                            \
-  /* double      empty_reserve          = */ 0.1F,                            \
-  /* int	 dirty_bytes_threshold  = */ (256 * 1024),                    \
+  /* double      empty_reserve          = */ 0.1f,                            \
+  /* size_t	 dirty_bytes_threshold  = */ (256 * 1024),                    \
   /* int	metadata_write_strategy = */                                  \
 				       H5AC__DEFAULT_METADATA_WRITE_STRATEGY  \
 }
@@ -240,28 +270,28 @@ extern hid_t H5AC_ind_dxpl_id;
   /* hbool_t     evictions_enabled      = */ TRUE,                            \
   /* hbool_t     set_initial_size       = */ TRUE,                            \
   /* size_t      initial_size           = */ ( 2 * 1024 * 1024),              \
-  /* double      min_clean_fraction     = */ 0.01F,                           \
+  /* double      min_clean_fraction     = */ 0.01f,                           \
   /* size_t      max_size               = */ (32 * 1024 * 1024),              \
   /* size_t      min_size               = */ ( 1 * 1024 * 1024),              \
   /* long int    epoch_length           = */ 50000,                           \
   /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,             \
-  /* double      lower_hr_threshold     = */ 0.9F,                            \
-  /* double      increment              = */ 2.0F,                            \
+  /* double      lower_hr_threshold     = */ 0.9f,                            \
+  /* double      increment              = */ 2.0f,                            \
   /* hbool_t     apply_max_increment    = */ TRUE,                            \
   /* size_t      max_increment          = */ (4 * 1024 * 1024),               \
   /* enum H5C_cache_flash_incr_mode       */                                  \
   /*                    flash_incr_mode = */ H5C_flash_incr__add_space,       \
-  /* double      flash_multiple         = */ 1.4F,                            \
-  /* double      flash_threshold        = */ 0.25F,                           \
+  /* double      flash_multiple         = */ 1.4f,                            \
+  /* double      flash_threshold        = */ 0.25f,                           \
   /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,\
-  /* double      upper_hr_threshold     = */ H5_DOUBLE(0.999),                \
-  /* double      decrement              = */ 0.9F,                            \
+  /* double      upper_hr_threshold     = */ 0.999f,                          \
+  /* double      decrement              = */ 0.9f,                            \
   /* hbool_t     apply_max_decrement    = */ TRUE,                            \
   /* size_t      max_decrement          = */ (1 * 1024 * 1024),               \
   /* int         epochs_before_eviction = */ 3,                               \
   /* hbool_t     apply_empty_reserve    = */ TRUE,                            \
-  /* double      empty_reserve          = */ 0.1F,                            \
-  /* int	 dirty_bytes_threshold  = */ (256 * 1024),                    \
+  /* double      empty_reserve          = */ 0.1f,                            \
+  /* size_t	 dirty_bytes_threshold  = */ (256 * 1024),                    \
   /* int	metadata_write_strategy = */                                  \
 				       H5AC__DEFAULT_METADATA_WRITE_STRATEGY  \
 }
@@ -287,8 +317,12 @@ extern hid_t H5AC_ind_dxpl_id;
 #define H5AC__FLUSH_CLEAR_ONLY_FLAG	  H5C__FLUSH_CLEAR_ONLY_FLAG
 #define H5AC__FLUSH_MARKED_ENTRIES_FLAG   H5C__FLUSH_MARKED_ENTRIES_FLAG
 #define H5AC__FLUSH_IGNORE_PROTECTED_FLAG H5C__FLUSH_IGNORE_PROTECTED_FLAG
+#define H5AC__READ_ONLY_FLAG		  H5C__READ_ONLY_FLAG
 #define H5AC__FREE_FILE_SPACE_FLAG	  H5C__FREE_FILE_SPACE_FLAG
 #define H5AC__TAKE_OWNERSHIP_FLAG         H5C__TAKE_OWNERSHIP_FLAG
+#define H5AC__FLUSH_LAST_FLAG		  H5C__FLUSH_LAST_FLAG
+#define H5AC__FLUSH_COLLECTIVELY_FLAG	  H5C__FLUSH_COLLECTIVELY_FLAG
+#define H5AC__EVICT_ALLOW_LAST_PINS_FLAG  H5C__EVICT_ALLOW_LAST_PINS_FLAG
 
 
 /* #defines of flags used to report entry status in the
@@ -299,6 +333,9 @@ extern hid_t H5AC_ind_dxpl_id;
 #define H5AC_ES__IS_DIRTY	0x0002
 #define H5AC_ES__IS_PROTECTED	0x0004
 #define H5AC_ES__IS_PINNED	0x0008
+#define H5AC_ES__IS_FLUSH_DEP_PARENT	0x0010
+#define H5AC_ES__IS_FLUSH_DEP_CHILD	0x0020
+#define H5AC_ES__IS_CORKED	0x0040
 
 
 /* external function declarations: */
@@ -306,64 +343,63 @@ extern hid_t H5AC_ind_dxpl_id;
 H5_DLL herr_t H5AC_init(void);
 H5_DLL herr_t H5AC_create(const H5F_t *f, H5AC_cache_config_t *config_ptr);
 H5_DLL herr_t H5AC_get_entry_status(const H5F_t *f, haddr_t addr,
-				    unsigned * status_ptr);
+    unsigned *status_ptr);
 H5_DLL herr_t H5AC_insert_entry(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type,
-                       haddr_t addr, void *thing, unsigned int flags);
+    haddr_t addr, void *thing, unsigned int flags);
 H5_DLL herr_t H5AC_pin_protected_entry(void *thing);
+H5_DLL herr_t H5AC_create_flush_dependency(void *parent_thing, void *child_thing);
 H5_DLL void * H5AC_protect(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type,
-    haddr_t addr, void *udata, H5AC_protect_t rw);
+    haddr_t addr, void *udata, unsigned flags);
 H5_DLL herr_t H5AC_resize_entry(void *thing, size_t new_size);
 H5_DLL herr_t H5AC_unpin_entry(void *thing);
-H5_DLL herr_t H5AC_unprotect(H5F_t *f, hid_t dxpl_id,
-                             const H5AC_class_t *type, haddr_t addr,
-			     void *thing, unsigned flags);
+H5_DLL herr_t H5AC_destroy_flush_dependency(void *parent_thing, void *child_thing);
+H5_DLL herr_t H5AC_unprotect(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type,
+    haddr_t addr, void *thing, unsigned flags);
 H5_DLL herr_t H5AC_flush(H5F_t *f, hid_t dxpl_id);
 H5_DLL herr_t H5AC_mark_entry_dirty(void *thing);
 H5_DLL herr_t H5AC_move_entry(H5F_t *f, const H5AC_class_t *type,
-			   haddr_t old_addr, haddr_t new_addr);
-
+    haddr_t old_addr, haddr_t new_addr);
 H5_DLL herr_t H5AC_dest(H5F_t *f, hid_t dxpl_id);
-
+H5_DLL herr_t H5AC_evict(H5F_t *f, hid_t dxpl_id);
 H5_DLL herr_t H5AC_expunge_entry(H5F_t *f, hid_t dxpl_id,
-                                 const H5AC_class_t *type, haddr_t addr,
-                                 unsigned flags);
-
-H5_DLL herr_t H5AC_set_sync_point_done_callback(H5C_t *cache_ptr,
-    void (*sync_point_done)(int num_writes, haddr_t *written_entries_tbl));
-
-H5_DLL herr_t H5AC_set_write_done_callback(H5C_t * cache_ptr,
-                                           void (* write_done)(void));
-H5_DLL herr_t H5AC_stats(const H5F_t *f);
-
-H5_DLL herr_t H5AC_dump_cache(const H5F_t *f);
-
+    const H5AC_class_t *type, haddr_t addr, unsigned flags);
 H5_DLL herr_t H5AC_get_cache_auto_resize_config(const H5AC_t * cache_ptr,
-                                               H5AC_cache_config_t *config_ptr);
-
-H5_DLL herr_t H5AC_get_cache_size(H5AC_t * cache_ptr,
-                                  size_t * max_size_ptr,
-                                  size_t * min_clean_size_ptr,
-                                  size_t * cur_size_ptr,
-                                  int32_t * cur_num_entries_ptr);
-
-H5_DLL herr_t H5AC_get_cache_hit_rate(H5AC_t * cache_ptr,
-                                      double * hit_rate_ptr);
-
-H5_DLL herr_t H5AC_reset_cache_hit_rate_stats(H5AC_t * cache_ptr);
-
+    H5AC_cache_config_t *config_ptr);
+H5_DLL herr_t H5AC_get_cache_size(H5AC_t *cache_ptr, size_t *max_size_ptr,
+    size_t *min_clean_size_ptr, size_t *cur_size_ptr, int32_t *cur_num_entries_ptr);
+H5_DLL herr_t H5AC_get_cache_hit_rate(H5AC_t *cache_ptr, double *hit_rate_ptr);
+H5_DLL herr_t H5AC_reset_cache_hit_rate_stats(H5AC_t *cache_ptr);
 H5_DLL herr_t H5AC_set_cache_auto_resize_config(H5AC_t *cache_ptr,
-                                               H5AC_cache_config_t *config_ptr);
-
-H5_DLL herr_t H5AC_validate_config(H5AC_cache_config_t * config_ptr);
-
-H5_DLL herr_t H5AC_close_trace_file( H5AC_t * cache_ptr);
-
-H5_DLL herr_t H5AC_open_trace_file(H5AC_t * cache_ptr,
-		                   const char * trace_file_name);
+    H5AC_cache_config_t *config_ptr);
+H5_DLL herr_t H5AC_validate_config(H5AC_cache_config_t *config_ptr);
+H5_DLL herr_t H5AC_close_trace_file(H5AC_t *cache_ptr);
+H5_DLL herr_t H5AC_open_trace_file(H5AC_t *cache_ptr, const char *trace_file_name);
+
+/* Tag & Ring routines */
+H5_DLL herr_t H5AC_tag(hid_t dxpl_id, haddr_t metadata_tag, haddr_t *prev_tag);
+H5_DLL herr_t H5AC_flush_tagged_metadata(H5F_t * f, haddr_t metadata_tag, hid_t dxpl_id);
+H5_DLL herr_t H5AC_evict_tagged_metadata(H5F_t * f, haddr_t metadata_tag, hid_t dxpl_id);
+H5_DLL herr_t H5AC_retag_copied_metadata(const H5F_t *f, haddr_t metadata_tag);
+H5_DLL herr_t H5AC_ignore_tags(const H5F_t *f);
+H5_DLL herr_t H5AC_cork(H5F_t *f, haddr_t obj_addr, unsigned action, hbool_t *corked);
+H5_DLL herr_t H5AC_get_entry_ring(const H5F_t *f, haddr_t addr, H5AC_ring_t *ring);
+H5_DLL herr_t H5AC_set_ring(hid_t dxpl_id, H5AC_ring_t ring, H5P_genplist_t **dxpl,
+    H5AC_ring_t *orig_ring);
+H5_DLL herr_t H5AC_reset_ring(H5P_genplist_t *dxpl, H5AC_ring_t orig_ring);
 
 #ifdef H5_HAVE_PARALLEL
 H5_DLL herr_t H5AC_add_candidate(H5AC_t * cache_ptr, haddr_t addr);
 #endif /* H5_HAVE_PARALLEL */
 
+#ifndef NDEBUG  /* debugging functions */
+H5_DLL herr_t H5AC_stats(const H5F_t *f);
+H5_DLL herr_t H5AC_dump_cache(const H5F_t *f);
+H5_DLL herr_t H5AC_get_entry_ptr_from_addr(const H5F_t *f, haddr_t addr,
+    void ** entry_ptr_ptr);
+H5_DLL herr_t H5AC_verify_entry_type(const H5F_t * f, haddr_t addr,
+    const H5AC_class_t * expected_type, hbool_t * in_cache_ptr,
+    hbool_t * type_ok_ptr);
+#endif /* NDEBUG */ /* end debugging functions */
+
 #endif /* !_H5ACprivate_H */
 
diff --git a/src/H5ACpublic.h b/src/H5ACpublic.h
index 639179c..dd16764 100644
--- a/src/H5ACpublic.h
+++ b/src/H5ACpublic.h
@@ -78,6 +78,8 @@ extern "C" {
  * open_trace_file: Boolean field indicating whether the trace_file_name
  * 	field should be used to open a trace file for the cache.
  *
+ *      *** DEPRECATED *** Use H5Fstart/stop logging functions instead
+ *
  * 	The trace file is a debuging feature that allow the capture of
  * 	top level metadata cache requests for purposes of debugging and/or
  * 	optimization.  This field should normally be set to FALSE, as
@@ -91,6 +93,8 @@ extern "C" {
  * close_trace_file: Boolean field indicating whether the current trace
  * 	file (if any) should be closed.
  *
+ *      *** DEPRECATED *** Use H5Fstart/stop logging functions instead
+ *
  * 	See the above comments on the open_trace_file field.  This field
  * 	should be set to FALSE unless there is an open trace file on the
  * 	cache that you wish to close.
@@ -98,6 +102,8 @@ extern "C" {
  * trace_file_name: Full path of the trace file to be opened if the
  * 	open_trace_file field is TRUE.
  *
+ *      *** DEPRECATED *** Use H5Fstart/stop logging functions instead
+ *
  * 	In the parallel case, an ascii representation of the mpi rank of
  * 	the process will be appended to the file name to yield a unique
  * 	trace file name for each process.
@@ -496,7 +502,7 @@ typedef struct H5AC_cache_config_t
 
 
     /* parallel configuration fields: */
-    int                      dirty_bytes_threshold;
+    size_t                   dirty_bytes_threshold;
     int                      metadata_write_strategy;
 
 } H5AC_cache_config_t;
@@ -506,3 +512,4 @@ typedef struct H5AC_cache_config_t
 }
 #endif
 #endif
+
diff --git a/src/H5Abtree2.c b/src/H5Abtree2.c
index 8958e25..972fb0b 100644
--- a/src/H5Abtree2.c
+++ b/src/H5Abtree2.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5A_PACKAGE		/*suppress error about including H5Apkg  */
+#include "H5Amodule.h"          /* This source code file is part of the H5A module */
 
 
 /***********/
@@ -79,27 +79,27 @@ typedef struct H5A_fh_ud_cmp_t {
 /* v2 B-tree function callbacks */
 
 /* v2 B-tree driver callbacks for 'creation order' index */
-static herr_t H5A_dense_btree2_corder_store(void *native, const void *udata);
-static herr_t H5A_dense_btree2_corder_compare(const void *rec1, const void *rec2);
-static herr_t H5A_dense_btree2_corder_encode(uint8_t *raw, const void *native,
+static herr_t H5A__dense_btree2_corder_store(void *native, const void *udata);
+static herr_t H5A__dense_btree2_corder_compare(const void *rec1, const void *rec2);
+static herr_t H5A__dense_btree2_corder_encode(uint8_t *raw, const void *native,
     void *ctx);
-static herr_t H5A_dense_btree2_corder_decode(const uint8_t *raw, void *native,
+static herr_t H5A__dense_btree2_corder_decode(const uint8_t *raw, void *native,
     void *ctx);
-static herr_t H5A_dense_btree2_corder_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
-    int indent, int fwidth, const void *record, const void *_udata);
+static herr_t H5A__dense_btree2_corder_debug(FILE *stream, int indent, int fwidth,
+    const void *record, const void *_udata);
 
 /* v2 B-tree driver callbacks for 'name' index */
-static herr_t H5A_dense_btree2_name_store(void *native, const void *udata);
-static herr_t H5A_dense_btree2_name_compare(const void *rec1, const void *rec2);
-static herr_t H5A_dense_btree2_name_encode(uint8_t *raw, const void *native,
+static herr_t H5A__dense_btree2_name_store(void *native, const void *udata);
+static herr_t H5A__dense_btree2_name_compare(const void *rec1, const void *rec2);
+static herr_t H5A__dense_btree2_name_encode(uint8_t *raw, const void *native,
     void *ctx);
-static herr_t H5A_dense_btree2_name_decode(const uint8_t *raw, void *native,
+static herr_t H5A__dense_btree2_name_decode(const uint8_t *raw, void *native,
     void *ctx);
-static herr_t H5A_dense_btree2_name_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
-    int indent, int fwidth, const void *record, const void *_udata);
+static herr_t H5A__dense_btree2_name_debug(FILE *stream, int indent, int fwidth,
+    const void *record, const void *_udata);
 
 /* Fractal heap function callbacks */
-static herr_t H5A_dense_fh_name_cmp(const void *obj, size_t obj_len, void *op_data);
+static herr_t H5A__dense_fh_name_cmp(const void *obj, size_t obj_len, void *op_data);
 
 
 /*********************/
@@ -112,11 +112,11 @@ const H5B2_class_t H5A_BT2_NAME[1]={{  /* B-tree class information */
     sizeof(H5A_dense_bt2_name_rec_t),  /* Size of native record */
     NULL,                              /* Create client callback context */
     NULL,                              /* Destroy client callback context */
-    H5A_dense_btree2_name_store,       /* Record storage callback */
-    H5A_dense_btree2_name_compare,     /* Record comparison callback */
-    H5A_dense_btree2_name_encode,      /* Record encoding callback */
-    H5A_dense_btree2_name_decode,      /* Record decoding callback */
-    H5A_dense_btree2_name_debug,       /* Record debugging callback */
+    H5A__dense_btree2_name_store,       /* Record storage callback */
+    H5A__dense_btree2_name_compare,     /* Record comparison callback */
+    H5A__dense_btree2_name_encode,      /* Record encoding callback */
+    H5A__dense_btree2_name_decode,      /* Record decoding callback */
+    H5A__dense_btree2_name_debug,       /* Record debugging callback */
     NULL,                              /* Create debugging context */
     NULL                               /* Destroy debugging context */
 }};
@@ -128,11 +128,11 @@ const H5B2_class_t H5A_BT2_CORDER[1]={{ /* B-tree class information */
     sizeof(H5A_dense_bt2_corder_rec_t),/* Size of native record */
     NULL,                              /* Create client callback context */
     NULL,                              /* Destroy client callback context */
-    H5A_dense_btree2_corder_store,     /* Record storage callback */
-    H5A_dense_btree2_corder_compare,   /* Record comparison callback */
-    H5A_dense_btree2_corder_encode,    /* Record encoding callback */
-    H5A_dense_btree2_corder_decode,    /* Record decoding callback */
-    H5A_dense_btree2_corder_debug,     /* Record debugging callback */
+    H5A__dense_btree2_corder_store,     /* Record storage callback */
+    H5A__dense_btree2_corder_compare,   /* Record comparison callback */
+    H5A__dense_btree2_corder_encode,    /* Record encoding callback */
+    H5A__dense_btree2_corder_decode,    /* Record decoding callback */
+    H5A__dense_btree2_corder_debug,     /* Record debugging callback */
     NULL,                              /* Create debugging context */
     NULL                               /* Destroy debugging context */
 }};
@@ -150,7 +150,7 @@ const H5B2_class_t H5A_BT2_CORDER[1]={{ /* B-tree class information */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5A_dense_fh_name_cmp
+ * Function:	H5A__dense_fh_name_cmp
  *
  * Purpose:	Compares the name of a attribute in a fractal heap to another
  *              name
@@ -164,14 +164,14 @@ const H5B2_class_t H5A_BT2_CORDER[1]={{ /* B-tree class information */
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5A_dense_fh_name_cmp(const void *obj, size_t H5_ATTR_UNUSED obj_len, void *_udata)
+H5A__dense_fh_name_cmp(const void *obj, size_t H5_ATTR_UNUSED obj_len, void *_udata)
 {
     H5A_fh_ud_cmp_t *udata = (H5A_fh_ud_cmp_t *)_udata;         /* User data for 'op' callback */
     H5A_t *attr = NULL;                 /* Pointer to attribute created from heap object */
     hbool_t took_ownership = FALSE;     /* Whether the "found" operator took ownership of the attribute */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Decode attribute information */
     if(NULL == (attr = (H5A_t *)H5O_msg_decode(udata->f, udata->dxpl_id, NULL, H5O_ATTR_ID, (const unsigned char *)obj)))
@@ -200,11 +200,11 @@ done:
         H5O_msg_free(H5O_ATTR_ID, attr);
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5A_dense_fh_name_cmp() */
+} /* end H5A__dense_fh_name_cmp() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5A_dense_btree2_name_store
+ * Function:	H5A__dense_btree2_name_store
  *
  * Purpose:	Store user information into native record for v2 B-tree
  *
@@ -217,12 +217,12 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5A_dense_btree2_name_store(void *_nrecord, const void *_udata)
+H5A__dense_btree2_name_store(void *_nrecord, const void *_udata)
 {
     const H5A_bt2_ud_ins_t *udata = (const H5A_bt2_ud_ins_t *)_udata;
     H5A_dense_bt2_name_rec_t *nrecord = (H5A_dense_bt2_name_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Copy user information info native record */
     nrecord->id = udata->id;
@@ -231,11 +231,11 @@ H5A_dense_btree2_name_store(void *_nrecord, const void *_udata)
     nrecord->hash = udata->common.name_hash;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5A_dense_btree2_name_store() */
+} /* H5A__dense_btree2_name_store() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5A_dense_btree2_name_compare
+ * Function:	H5A__dense_btree2_name_compare
  *
  * Purpose:	Compare two native information records, according to some key
  *
@@ -249,13 +249,13 @@ H5A_dense_btree2_name_store(void *_nrecord, const void *_udata)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5A_dense_btree2_name_compare(const void *_bt2_udata, const void *_bt2_rec)
+H5A__dense_btree2_name_compare(const void *_bt2_udata, const void *_bt2_rec)
 {
     const H5A_bt2_ud_common_t *bt2_udata = (const H5A_bt2_ud_common_t *)_bt2_udata;
     const H5A_dense_bt2_name_rec_t *bt2_rec = (const H5A_dense_bt2_name_rec_t *)_bt2_rec;
-    herr_t ret_value;           /* Return value */
+    herr_t ret_value = FAIL;            /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Sanity check */
     HDassert(bt2_udata);
@@ -294,7 +294,7 @@ H5A_dense_btree2_name_compare(const void *_bt2_udata, const void *_bt2_rec)
         HDassert(fheap);
 
         /* Check if the user's attribute and the B-tree's attribute have the same name */
-        status = H5HF_op(fheap, bt2_udata->dxpl_id, &bt2_rec->id, H5A_dense_fh_name_cmp, &fh_udata);
+        status = H5HF_op(fheap, bt2_udata->dxpl_id, &bt2_rec->id, H5A__dense_fh_name_cmp, &fh_udata);
         HDassert(status >= 0);
 
         /* Callback will set comparison value */
@@ -302,11 +302,11 @@ H5A_dense_btree2_name_compare(const void *_bt2_udata, const void *_bt2_rec)
     } /* end else */
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5A_dense_btree2_name_compare() */
+} /* H5A__dense_btree2_name_compare() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5A_dense_btree2_name_encode
+ * Function:	H5A__dense_btree2_name_encode
  *
  * Purpose:	Encode native information into raw form for storing on disk
  *
@@ -319,11 +319,11 @@ H5A_dense_btree2_name_compare(const void *_bt2_udata, const void *_bt2_rec)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5A_dense_btree2_name_encode(uint8_t *raw, const void *_nrecord, void H5_ATTR_UNUSED *ctx)
+H5A__dense_btree2_name_encode(uint8_t *raw, const void *_nrecord, void H5_ATTR_UNUSED *ctx)
 {
     const H5A_dense_bt2_name_rec_t *nrecord = (const H5A_dense_bt2_name_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Encode the record's fields */
     HDmemcpy(raw, nrecord->id.id, (size_t)H5O_FHEAP_ID_LEN);
@@ -333,11 +333,11 @@ H5A_dense_btree2_name_encode(uint8_t *raw, const void *_nrecord, void H5_ATTR_UN
     UINT32ENCODE(raw, nrecord->hash)
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5A_dense_btree2_name_encode() */
+} /* H5A__dense_btree2_name_encode() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5A_dense_btree2_name_decode
+ * Function:	H5A__dense_btree2_name_decode
  *
  * Purpose:	Decode raw disk form of record into native form
  *
@@ -350,11 +350,11 @@ H5A_dense_btree2_name_encode(uint8_t *raw, const void *_nrecord, void H5_ATTR_UN
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5A_dense_btree2_name_decode(const uint8_t *raw, void *_nrecord, void H5_ATTR_UNUSED *ctx)
+H5A__dense_btree2_name_decode(const uint8_t *raw, void *_nrecord, void H5_ATTR_UNUSED *ctx)
 {
     H5A_dense_bt2_name_rec_t *nrecord = (H5A_dense_bt2_name_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Decode the record's fields */
     HDmemcpy(nrecord->id.id, raw, (size_t)H5O_FHEAP_ID_LEN);
@@ -364,11 +364,11 @@ H5A_dense_btree2_name_decode(const uint8_t *raw, void *_nrecord, void H5_ATTR_UN
     UINT32DECODE(raw, nrecord->hash)
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5A_dense_btree2_name_decode() */
+} /* H5A__dense_btree2_name_decode() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5A_dense_btree2_name_debug
+ * Function:	H5A__dense_btree2_name_debug
  *
  * Purpose:	Debug native form of record
  *
@@ -381,23 +381,23 @@ H5A_dense_btree2_name_decode(const uint8_t *raw, void *_nrecord, void H5_ATTR_UN
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5A_dense_btree2_name_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
-    int indent, int fwidth, const void *_nrecord, const void H5_ATTR_UNUSED *_udata)
+H5A__dense_btree2_name_debug(FILE *stream, int indent, int fwidth,
+    const void *_nrecord, const void H5_ATTR_UNUSED *_udata)
 {
     const H5A_dense_bt2_name_rec_t *nrecord = (const H5A_dense_bt2_name_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     HDfprintf(stream, "%*s%-*s {%016Hx, %02x, %u, %08lx}\n", indent, "", fwidth,
         "Record:",
         (hsize_t)nrecord->id.val, (unsigned)nrecord->flags, (unsigned)nrecord->corder, (unsigned long)nrecord->hash);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5A_dense_btree2_name_debug() */
+} /* H5A__dense_btree2_name_debug() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5A_dense_btree2_corder_store
+ * Function:	H5A__dense_btree2_corder_store
  *
  * Purpose:	Store user information into native record for v2 B-tree
  *
@@ -410,12 +410,12 @@ H5A_dense_btree2_name_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5A_dense_btree2_corder_store(void *_nrecord, const void *_udata)
+H5A__dense_btree2_corder_store(void *_nrecord, const void *_udata)
 {
     const H5A_bt2_ud_ins_t *udata = (const H5A_bt2_ud_ins_t *)_udata;
     H5A_dense_bt2_corder_rec_t *nrecord = (H5A_dense_bt2_corder_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Copy user information info native record */
     nrecord->id = udata->id;
@@ -423,11 +423,11 @@ H5A_dense_btree2_corder_store(void *_nrecord, const void *_udata)
     nrecord->corder = udata->common.corder;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5A_dense_btree2_corder_store() */
+} /* H5A__dense_btree2_corder_store() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5A_dense_btree2_corder_compare
+ * Function:	H5A__dense_btree2_corder_compare
  *
  * Purpose:	Compare two native information records, according to some key
  *
@@ -441,13 +441,13 @@ H5A_dense_btree2_corder_store(void *_nrecord, const void *_udata)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5A_dense_btree2_corder_compare(const void *_bt2_udata, const void *_bt2_rec)
+H5A__dense_btree2_corder_compare(const void *_bt2_udata, const void *_bt2_rec)
 {
     const H5A_bt2_ud_common_t *bt2_udata = (const H5A_bt2_ud_common_t *)_bt2_udata;
     const H5A_dense_bt2_corder_rec_t *bt2_rec = (const H5A_dense_bt2_corder_rec_t *)_bt2_rec;
-    herr_t ret_value;           /* Return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Sanity check */
     HDassert(bt2_udata);
@@ -462,11 +462,11 @@ H5A_dense_btree2_corder_compare(const void *_bt2_udata, const void *_bt2_rec)
         ret_value = 0;
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5A_dense_btree2_corder_compare() */
+} /* H5A__dense_btree2_corder_compare() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5A_dense_btree2_corder_encode
+ * Function:	H5A__dense_btree2_corder_encode
  *
  * Purpose:	Encode native information into raw form for storing on disk
  *
@@ -479,11 +479,11 @@ H5A_dense_btree2_corder_compare(const void *_bt2_udata, const void *_bt2_rec)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5A_dense_btree2_corder_encode(uint8_t *raw, const void *_nrecord, void H5_ATTR_UNUSED *ctx)
+H5A__dense_btree2_corder_encode(uint8_t *raw, const void *_nrecord, void H5_ATTR_UNUSED *ctx)
 {
     const H5A_dense_bt2_corder_rec_t *nrecord = (const H5A_dense_bt2_corder_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Encode the record's fields */
     HDmemcpy(raw, nrecord->id.id, (size_t)H5O_FHEAP_ID_LEN);
@@ -492,11 +492,11 @@ H5A_dense_btree2_corder_encode(uint8_t *raw, const void *_nrecord, void H5_ATTR_
     UINT32ENCODE(raw, nrecord->corder)
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5A_dense_btree2_corder_encode() */
+} /* H5A__dense_btree2_corder_encode() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5A_dense_btree2_corder_decode
+ * Function:	H5A__dense_btree2_corder_decode
  *
  * Purpose:	Decode raw disk form of record into native form
  *
@@ -509,11 +509,11 @@ H5A_dense_btree2_corder_encode(uint8_t *raw, const void *_nrecord, void H5_ATTR_
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5A_dense_btree2_corder_decode(const uint8_t *raw, void *_nrecord, void H5_ATTR_UNUSED *ctx)
+H5A__dense_btree2_corder_decode(const uint8_t *raw, void *_nrecord, void H5_ATTR_UNUSED *ctx)
 {
     H5A_dense_bt2_corder_rec_t *nrecord = (H5A_dense_bt2_corder_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Decode the record's fields */
     HDmemcpy(nrecord->id.id, raw, (size_t)H5O_FHEAP_ID_LEN);
@@ -522,11 +522,11 @@ H5A_dense_btree2_corder_decode(const uint8_t *raw, void *_nrecord, void H5_ATTR_
     UINT32DECODE(raw, nrecord->corder)
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5A_dense_btree2_corder_decode() */
+} /* H5A__dense_btree2_corder_decode() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5A_dense_btree2_corder_debug
+ * Function:	H5A__dense_btree2_corder_debug
  *
  * Purpose:	Debug native form of record
  *
@@ -539,17 +539,17 @@ H5A_dense_btree2_corder_decode(const uint8_t *raw, void *_nrecord, void H5_ATTR_
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5A_dense_btree2_corder_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
-    int indent, int fwidth, const void *_nrecord, const void H5_ATTR_UNUSED *_udata)
+H5A__dense_btree2_corder_debug(FILE *stream, int indent, int fwidth,
+    const void *_nrecord, const void H5_ATTR_UNUSED *_udata)
 {
     const H5A_dense_bt2_corder_rec_t *nrecord = (const H5A_dense_bt2_corder_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     HDfprintf(stream, "%*s%-*s {%016Hx, %02x, %u}\n", indent, "", fwidth,
         "Record:",
         (hsize_t)nrecord->id.val, (unsigned)nrecord->flags, (unsigned)nrecord->corder);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5A_dense_btree2_corder_debug() */
+} /* H5A__dense_btree2_corder_debug() */
 
diff --git a/src/H5Adense.c b/src/H5Adense.c
index a5d35fc..148977d 100644
--- a/src/H5Adense.c
+++ b/src/H5Adense.c
@@ -29,8 +29,8 @@
 /* Module Setup */
 /****************/
 
-#define H5A_PACKAGE		/*suppress error about including H5Apkg  */
-#define H5O_PACKAGE		/*suppress error about including H5Opkg  */
+#include "H5Amodule.h"          /* This source code file is part of the H5A module */
+#define H5O_FRIEND		/*suppress error about including H5Opkg  */
 
 
 /***********/
@@ -339,7 +339,8 @@ H5A__dense_fnd_cb(const H5A_t *attr, hbool_t *took_ownership, void *_user_attr)
  *-------------------------------------------------------------------------
  */
 H5A_t *
-H5A_dense_open(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo, const char *name)
+H5A_dense_open(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo,
+    const char *name)
 {
     H5A_bt2_ud_common_t udata;          /* User data for v2 B-tree modify */
     H5HF_t *fheap = NULL;               /* Fractal heap handle */
@@ -888,8 +889,8 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5A_dense_rename(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo, const char *old_name,
-    const char *new_name)
+H5A_dense_rename(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo,
+    const char *old_name, const char *new_name)
 {
     H5A_bt2_ud_common_t udata;          /* User data for v2 B-tree modify */
     H5HF_t *fheap = NULL;               /* Fractal heap handle */
@@ -1082,7 +1083,7 @@ H5A__dense_iterate_bt2_cb(const void *_record, void *_bt2_udata)
                 H5A_info_t ainfo;               /* Info for attribute */
 
                 /* Get the attribute information */
-                if(H5A_get_info(fh_udata.attr, &ainfo) < 0)
+                if(H5A__get_info(fh_udata.attr, &ainfo) < 0)
                     HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, H5_ITER_ERROR, "unable to get attribute info")
 
                 /* Make the application callback */
@@ -1140,8 +1141,9 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5A_dense_iterate(H5F_t *f, hid_t dxpl_id, hid_t loc_id, const H5O_ainfo_t *ainfo,
-    H5_index_t idx_type, H5_iter_order_t order, hsize_t skip, hsize_t *last_attr,
+H5A_dense_iterate(H5F_t *f, hid_t dxpl_id, hid_t loc_id,
+    const H5O_ainfo_t *ainfo, H5_index_t idx_type, H5_iter_order_t order,
+    hsize_t skip, hsize_t *last_attr,
     const H5A_attr_iter_op_t *attr_op, void *op_data)
 {
     H5HF_t *fheap = NULL;               /* Fractal heap handle */
@@ -1149,7 +1151,7 @@ H5A_dense_iterate(H5F_t *f, hid_t dxpl_id, hid_t loc_id, const H5O_ainfo_t *ainf
     H5A_attr_table_t atable = {0, NULL};        /* Table of attributes */
     H5B2_t *bt2 = NULL;                 /* v2 B-tree handle for index */
     haddr_t bt2_addr;                   /* Address of v2 B-tree to use for lookup */
-    herr_t ret_value;                   /* Return value */
+    herr_t ret_value = FAIL;            /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1342,7 +1344,8 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5A_dense_remove(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo, const char *name)
+H5A_dense_remove(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo,
+    const char *name)
 {
     H5A_bt2_ud_rm_t udata;              /* User data for v2 B-tree record removal */
     H5HF_t *fheap = NULL;               /* Fractal heap handle */
@@ -1692,7 +1695,8 @@ done:
  *-------------------------------------------------------------------------
  */
 htri_t
-H5A_dense_exists(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo, const char *name)
+H5A_dense_exists(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo,
+    const char *name)
 {
     H5A_bt2_ud_common_t udata;          /* User data for v2 B-tree modify */
     H5HF_t *fheap = NULL;               /* Fractal heap handle */
@@ -1701,7 +1705,7 @@ H5A_dense_exists(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo, const char *
     htri_t attr_sharable;               /* Flag indicating attributes are sharable */
     htri_t ret_value = TRUE;            /* Return value */
 
-    FUNC_ENTER_NOAPI(NULL)
+    FUNC_ENTER_NOAPI(FAIL)
 
     /*
      * Check arguments.
diff --git a/src/H5Adeprec.c b/src/H5Adeprec.c
index 247b4b5..ae0f041 100644
--- a/src/H5Adeprec.c
+++ b/src/H5Adeprec.c
@@ -31,11 +31,8 @@
 /* Module Setup */
 /****************/
 
-#define H5A_PACKAGE		/*suppress error about including H5Apkg   */
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	*/
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5A__init_deprec_interface
+#include "H5Amodule.h"          /* This source code file is part of the H5A module */
+#define H5O_FRIEND		/*suppress error about including H5Opkg	*/
 
 
 /***********/
@@ -84,51 +81,6 @@
 /*******************/
 
 
-

-/*--------------------------------------------------------------------------
-NAME
-   H5A__init_deprec_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5A__init_deprec_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5A_init() currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5A__init_deprec_interface(void)
-{
-    FUNC_ENTER_STATIC_NOERR
-
-    FUNC_LEAVE_NOAPI(H5A_init())
-} /* H5A__init_deprec_interface() */
-
-

-/*--------------------------------------------------------------------------
-NAME
-   H5A__term_deprec_interface -- Terminate interface
-USAGE
-    herr_t H5A__term_deprec_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Terminates interface.  (Just resets H5_interface_initialize_g
-    currently).
-
---------------------------------------------------------------------------*/
-herr_t
-H5A__term_deprec_interface(void)
-{
-    FUNC_ENTER_PACKAGE_NOERR
-
-    /* Mark closed */
-    H5_interface_initialize_g = 0;
-
-    FUNC_LEAVE_NOAPI(0)
-} /* H5A__term_deprec_interface() */
-
 #ifndef H5_NO_DEPRECATED_SYMBOLS
 

 /*--------------------------------------------------------------------------
@@ -183,7 +135,7 @@ H5Acreate1(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id,
     if(NULL == (type = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
 	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a type")
     if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
 
     /* Go do the real work for attaching the attribute to the dataset */
     if(NULL==(attr = H5A_create(&loc, name, type, space, plist_id, H5AC_dxpl_id)))
diff --git a/src/H5Aint.c b/src/H5Aint.c
index 81fa8b0..80761b6 100644
--- a/src/H5Aint.c
+++ b/src/H5Aint.c
@@ -28,8 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5A_PACKAGE		/*suppress error about including H5Apkg  */
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Amodule.h"          /* This source code file is part of the H5A module */
+#define H5O_FRIEND		/*suppress error about including H5Opkg	  */
 
 
 /***********/
@@ -92,7 +92,7 @@ typedef struct {
 
 static herr_t H5A__compact_build_table_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
     unsigned sequence, unsigned *oh_flags_ptr, void *_udata/*in,out*/);
-static herr_t H5A_dense_build_table_cb(const H5A_t *attr, void *_udata);
+static herr_t H5A__dense_build_table_cb(const H5A_t *attr, void *_udata);
 static int H5A__attr_cmp_name_inc(const void *attr1, const void *attr2);
 static int H5A__attr_cmp_name_dec(const void *attr1, const void *attr2);
 static int H5A__attr_cmp_corder_inc(const void *attr1, const void *attr2);
@@ -142,13 +142,13 @@ H5A_t *
 H5A_create(const H5G_loc_t *loc, const char *name, const H5T_t *type,
     const H5S_t *space, hid_t acpl_id, hid_t dxpl_id)
 {
-    H5A_t	*attr = NULL;   /* Attribute created */
-    hssize_t	snelmts;	/* elements in attribute */
-    size_t	nelmts;		/* elements in attribute */
-    htri_t      tri_ret;        /* htri_t return value */
-    H5A_t	*ret_value = NULL; /* Return value */
+    H5A_t	*attr = NULL;           /* Attribute created */
+    hssize_t	snelmts;	        /* elements in attribute */
+    size_t	nelmts;		        /* elements in attribute */
+    htri_t      exists;                 /* Whether attribute exists */
+    H5A_t	*ret_value = NULL;      /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, loc->oloc->addr, NULL)
 
     /* check args */
     HDassert(loc);
@@ -161,9 +161,9 @@ H5A_create(const H5G_loc_t *loc, const char *name, const H5T_t *type,
      *  name, but it's going to be hard to unwind all the special cases on
      *  failure, so just check first, for now - QAK)
      */
-    if((tri_ret = H5O_attr_exists(loc->oloc, name, H5AC_ind_dxpl_id)) < 0)
+    if((exists = H5O_attr_exists(loc->oloc, name, H5AC_ind_dxpl_id)) < 0)
         HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, NULL, "error checking attributes")
-    else if(tri_ret > 0)
+    else if(exists > 0)
         HGOTO_ERROR(H5E_ATTR, H5E_ALREADYEXISTS, NULL, "attribute already exists")
 
     /* Check if the dataspace has an extent set (or is NULL) */
@@ -207,7 +207,7 @@ H5A_create(const H5G_loc_t *loc, const char *name, const H5T_t *type,
         HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "invalid datatype location")
 
     /* Set the latest format for datatype, if requested */
-    if(H5F_USE_LATEST_FORMAT(loc->oloc->file))
+    if(H5F_USE_LATEST_FLAGS(loc->oloc->file, H5F_LATEST_DATATYPE))
         if(H5T_set_latest_version(attr->shared->dt) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, NULL, "can't set latest version of datatype")
 
@@ -215,7 +215,7 @@ H5A_create(const H5G_loc_t *loc, const char *name, const H5T_t *type,
     attr->shared->ds = H5S_copy(space, FALSE, TRUE);
 
     /* Set the latest format for dataspace, if requested */
-    if(H5F_USE_LATEST_FORMAT(loc->oloc->file))
+    if(H5F_USE_LATEST_FLAGS(loc->oloc->file, H5F_LATEST_DATASPACE))
         if(H5S_set_latest_version(attr->shared->ds) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, NULL, "can't set latest version of dataspace")
 
@@ -275,24 +275,21 @@ H5A_create(const H5G_loc_t *loc, const char *name, const H5T_t *type,
         HGOTO_ERROR(H5E_ATTR, H5E_CANTINSERT, NULL, "unable to create attribute in object header")
 
     ret_value = attr;
-
 done:
     if(NULL == ret_value && attr && H5A_close(attr))
         HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, NULL, "can't close attribute")
-
-    FUNC_LEAVE_NOAPI(ret_value)
-
+    FUNC_LEAVE_NOAPI_TAG(ret_value, NULL)
 } /* H5A_create() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5A_open_common
+ * Function:	H5A__open_common
  *
  * Purpose:
  *      Finishes initializing an attributes the open
  *
  * Usage:
- *  herr_t H5A_open_common(loc, name, dxpl_id)
+ *  herr_t H5A__open_common(loc, name, dxpl_id)
  *      const H5G_loc_t *loc;   IN: Pointer to group location for object
  *      H5A_t *attr;            IN/OUT: Pointer to attribute to initialize
  *
@@ -304,11 +301,11 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5A_open_common(const H5G_loc_t *loc, H5A_t *attr)
+H5A__open_common(const H5G_loc_t *loc, H5A_t *attr)
 {
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* check args */
     HDassert(loc);
@@ -339,7 +336,7 @@ H5A_open_common(const H5G_loc_t *loc, H5A_t *attr)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5A_open_common() */
+} /* H5A__open_common() */
 
 

 /*-------------------------------------------------------------------------
@@ -363,7 +360,7 @@ H5A_open_by_idx(const H5G_loc_t *loc, const char *obj_name, H5_index_t idx_type,
     H5O_loc_t   obj_oloc;            	/* Opened object object location */
     hbool_t     loc_found = FALSE;      /* Entry at 'obj_name' found */
     H5A_t       *attr = NULL;           /* Attribute from object header */
-    H5A_t       *ret_value;             /* Return value */
+    H5A_t       *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -386,7 +383,7 @@ H5A_open_by_idx(const H5G_loc_t *loc, const char *obj_name, H5_index_t idx_type,
         HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, NULL, "unable to load attribute info from object header")
 
     /* Finish initializing attribute */
-    if(H5A_open_common(&obj_loc, attr) < 0)
+    if(H5A__open_common(&obj_loc, attr) < 0)
         HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, NULL, "unable to initialize attribute")
 
     /* Set return value */
@@ -427,7 +424,7 @@ H5A_open_by_name(const H5G_loc_t *loc, const char *obj_name, const char *attr_na
     H5O_loc_t   obj_oloc;            	/* Opened object object location */
     hbool_t     loc_found = FALSE;      /* Entry at 'obj_name' found */
     H5A_t       *attr = NULL;           /* Attribute from object header */
-    H5A_t       *ret_value;             /* Return value */
+    H5A_t       *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -451,7 +448,7 @@ H5A_open_by_name(const H5G_loc_t *loc, const char *obj_name, const char *attr_na
         HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, NULL, "unable to load attribute info from object header")
 
     /* Finish initializing attribute */
-    if(H5A_open_common(loc, attr) < 0)
+    if(H5A__open_common(loc, attr) < 0)
         HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, NULL, "unable to initialize attribute")
 
     /* Set return value */
@@ -473,11 +470,114 @@ done:
 

 /*--------------------------------------------------------------------------
  NAME
-    H5A_write
+    H5A__read
+ PURPOSE
+    Actually read in data from an attribute
+ USAGE
+    herr_t H5A__read (attr, mem_type, buf)
+        H5A_t *attr;         IN: Attribute to read
+        const H5T_t *mem_type;     IN: Memory datatype of buffer
+        void *buf;           IN: Buffer for data to read
+ RETURNS
+    Non-negative on success/Negative on failure
+
+ DESCRIPTION
+    This function reads a complete attribute from disk.
+--------------------------------------------------------------------------*/
+herr_t
+H5A__read(const H5A_t *attr, const H5T_t *mem_type, void *buf, hid_t dxpl_id)
+{
+    uint8_t		*tconv_buf = NULL;	/* datatype conv buffer*/
+    uint8_t		*bkg_buf = NULL;	/* background buffer */
+    hssize_t		snelmts;		/* elements in attribute */
+    size_t		nelmts;			/* elements in attribute*/
+    H5T_path_t		*tpath = NULL;		/* type conversion info	*/
+    hid_t		src_id = -1, dst_id = -1;/* temporary type atoms*/
+    size_t		src_type_size;		/* size of source type 	*/
+    size_t		dst_type_size;		/* size of destination type */
+    size_t		buf_size;		/* desired buffer size	*/
+    herr_t		ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(attr);
+    HDassert(mem_type);
+    HDassert(buf);
+
+    /* Create buffer for data to store on disk */
+    if((snelmts = H5S_GET_EXTENT_NPOINTS(attr->shared->ds)) < 0)
+        HGOTO_ERROR(H5E_ATTR, H5E_CANTCOUNT, FAIL, "dataspace is invalid")
+    H5_CHECKED_ASSIGN(nelmts, size_t, snelmts, hssize_t);
+
+    if(nelmts > 0) {
+        /* Get the memory and file datatype sizes */
+        src_type_size = H5T_GET_SIZE(attr->shared->dt);
+        dst_type_size = H5T_GET_SIZE(mem_type);
+
+        /* Check if the attribute has any data yet, if not, fill with zeroes */
+        if(attr->obj_opened && !attr->shared->data)
+            HDmemset(buf, 0, (dst_type_size * nelmts));
+        else {  /* Attribute exists and has a value */
+            /* Convert memory buffer into disk buffer */
+            /* Set up type conversion function */
+            if(NULL == (tpath = H5T_path_find(attr->shared->dt, mem_type, NULL, NULL, dxpl_id, FALSE)))
+                HGOTO_ERROR(H5E_ATTR, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dst datatypes")
+
+            /* Check for type conversion required */
+            if(!H5T_path_noop(tpath)) {
+                if((src_id = H5I_register(H5I_DATATYPE, H5T_copy(attr->shared->dt, H5T_COPY_ALL), FALSE)) < 0 ||
+                        (dst_id = H5I_register(H5I_DATATYPE, H5T_copy(mem_type, H5T_COPY_ALL), FALSE)) < 0)
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTREGISTER, FAIL, "unable to register types for conversion")
+
+                /* Get the maximum buffer size needed and allocate it */
+                buf_size = nelmts * MAX(src_type_size, dst_type_size);
+                if(NULL == (tconv_buf = H5FL_BLK_MALLOC(attr_buf, buf_size)))
+                    HGOTO_ERROR(H5E_ATTR, H5E_NOSPACE, FAIL, "memory allocation failed")
+                if(NULL == (bkg_buf = H5FL_BLK_CALLOC(attr_buf, buf_size)))
+                    HGOTO_ERROR(H5E_ATTR, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+                /* Copy the attribute data into the buffer for conversion */
+                HDmemcpy(tconv_buf, attr->shared->data, (src_type_size * nelmts));
+
+                /* Perform datatype conversion.  */
+                if(H5T_convert(tpath, src_id, dst_id, nelmts, (size_t)0, (size_t)0, tconv_buf, bkg_buf, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "datatype conversion failed")
+
+                /* Copy the converted data into the user's buffer */
+                HDmemcpy(buf, tconv_buf, (dst_type_size * nelmts));
+            } /* end if */
+            /* No type conversion necessary */
+            else {
+                HDassert(dst_type_size == src_type_size);
+
+                /* Copy the attribute data into the user's buffer */
+                HDmemcpy(buf, attr->shared->data, (dst_type_size * nelmts));
+            } /* end else */
+        } /* end else */
+    } /* end if */
+
+done:
+    /* Release resources */
+    if(src_id >= 0 && H5I_dec_ref(src_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTDEC, FAIL, "unable to close temporary object")
+    if(dst_id >= 0 && H5I_dec_ref(dst_id) < 0)
+        HDONE_ERROR(H5E_ATTR, H5E_CANTDEC, FAIL, "unable to close temporary object")
+    if(tconv_buf)
+        tconv_buf = H5FL_BLK_FREE(attr_buf, tconv_buf);
+    if(bkg_buf)
+	bkg_buf = H5FL_BLK_FREE(attr_buf, bkg_buf);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5A__read() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5A__write
  PURPOSE
     Actually write out data to an attribute
  USAGE
-    herr_t H5A_write (attr, mem_type, buf)
+    herr_t H5A__write (attr, mem_type, buf)
         H5A_t *attr;         IN: Attribute to write
         const H5T_t *mem_type;     IN: Memory datatype of buffer
         const void *buf;           IN: Buffer of data to write
@@ -488,7 +588,7 @@ done:
     This function writes a complete attribute to disk.
 --------------------------------------------------------------------------*/
 herr_t
-H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id)
+H5A__write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id)
 {
     uint8_t		*tconv_buf = NULL;	/* datatype conv buffer */
     hbool_t             tconv_owned = FALSE;    /* Whether the datatype conv buffer is owned by attribute */
@@ -502,7 +602,7 @@ H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id)
     size_t		buf_size;		/* desired buffer size	*/
     herr_t		ret_value = SUCCEED;
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, attr->oloc.addr, FAIL)
 
     HDassert(attr);
     HDassert(mem_type);
@@ -581,111 +681,54 @@ done:
     if(bkg_buf)
         bkg_buf = H5FL_BLK_FREE(attr_buf, bkg_buf);
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5A_write() */
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* H5A__write() */
 
 

 /*--------------------------------------------------------------------------
  NAME
-    H5A_read
+    H5A__get_name
  PURPOSE
-    Actually read in data from an attribute
- USAGE
-    herr_t H5A_read (attr, mem_type, buf)
-        H5A_t *attr;         IN: Attribute to read
-        const H5T_t *mem_type;     IN: Memory datatype of buffer
-        void *buf;           IN: Buffer for data to read
+    Private function for H5Aget_name.  Gets a copy of the name for an
+    attribute
  RETURNS
-    Non-negative on success/Negative on failure
-
+    This function returns the length of the attribute's name (which may be
+    longer than 'buf_size') on success or negative for failure.
  DESCRIPTION
-    This function reads a complete attribute from disk.
+        This function retrieves the name of an attribute for an attribute ID.
+    Up to 'buf_size' characters are stored in 'buf' followed by a '\0' string
+    terminator.  If the name of the attribute is longer than 'buf_size'-1,
+    the string terminator is stored in the last position of the buffer to
+    properly terminate the string.
 --------------------------------------------------------------------------*/
-herr_t
-H5A_read(const H5A_t *attr, const H5T_t *mem_type, void *buf, hid_t dxpl_id)
+ssize_t
+H5A__get_name(H5A_t *attr, size_t buf_size, char *buf)
 {
-    uint8_t		*tconv_buf = NULL;	/* datatype conv buffer*/
-    uint8_t		*bkg_buf = NULL;	/* background buffer */
-    hssize_t		snelmts;		/* elements in attribute */
-    size_t		nelmts;			/* elements in attribute*/
-    H5T_path_t		*tpath = NULL;		/* type conversion info	*/
-    hid_t		src_id = -1, dst_id = -1;/* temporary type atoms*/
-    size_t		src_type_size;		/* size of source type 	*/
-    size_t		dst_type_size;		/* size of destination type */
-    size_t		buf_size;		/* desired buffer size	*/
-    herr_t		ret_value = SUCCEED;
-
-    FUNC_ENTER_NOAPI_NOINIT
-
-    HDassert(attr);
-    HDassert(mem_type);
-    HDassert(buf);
-
-    /* Create buffer for data to store on disk */
-    if((snelmts = H5S_GET_EXTENT_NPOINTS(attr->shared->ds)) < 0)
-        HGOTO_ERROR(H5E_ATTR, H5E_CANTCOUNT, FAIL, "dataspace is invalid")
-    H5_CHECKED_ASSIGN(nelmts, size_t, snelmts, hssize_t);
-
-    if(nelmts > 0) {
-        /* Get the memory and file datatype sizes */
-        src_type_size = H5T_GET_SIZE(attr->shared->dt);
-        dst_type_size = H5T_GET_SIZE(mem_type);
-
-        /* Check if the attribute has any data yet, if not, fill with zeroes */
-        if(attr->obj_opened && !attr->shared->data)
-            HDmemset(buf, 0, (dst_type_size * nelmts));
-        else {  /* Attribute exists and has a value */
-            /* Convert memory buffer into disk buffer */
-            /* Set up type conversion function */
-            if(NULL == (tpath = H5T_path_find(attr->shared->dt, mem_type, NULL, NULL, dxpl_id, FALSE)))
-                HGOTO_ERROR(H5E_ATTR, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dst datatypes")
+    size_t              copy_len, nbytes;
+    ssize_t		ret_value = -1;         /* Return value */
 
-            /* Check for type conversion required */
-            if(!H5T_path_noop(tpath)) {
-                if((src_id = H5I_register(H5I_DATATYPE, H5T_copy(attr->shared->dt, H5T_COPY_ALL), FALSE)) < 0 ||
-                        (dst_id = H5I_register(H5I_DATATYPE, H5T_copy(mem_type, H5T_COPY_ALL), FALSE)) < 0)
-                    HGOTO_ERROR(H5E_ATTR, H5E_CANTREGISTER, FAIL, "unable to register types for conversion")
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-                /* Get the maximum buffer size needed and allocate it */
-                buf_size = nelmts * MAX(src_type_size, dst_type_size);
-                if(NULL == (tconv_buf = H5FL_BLK_MALLOC(attr_buf, buf_size)))
-                    HGOTO_ERROR(H5E_ATTR, H5E_NOSPACE, FAIL, "memory allocation failed")
-                if(NULL == (bkg_buf = H5FL_BLK_CALLOC(attr_buf, buf_size)))
-                    HGOTO_ERROR(H5E_ATTR, H5E_NOSPACE, FAIL, "memory allocation failed")
-
-                /* Copy the attribute data into the buffer for conversion */
-                HDmemcpy(tconv_buf, attr->shared->data, (src_type_size * nelmts));
+    /* get the real attribute length */
+    nbytes = HDstrlen(attr->shared->name);
+    HDassert((ssize_t)nbytes >= 0); /*overflow, pretty unlikely --rpm*/
 
-                /* Perform datatype conversion.  */
-                if(H5T_convert(tpath, src_id, dst_id, nelmts, (size_t)0, (size_t)0, tconv_buf, bkg_buf, dxpl_id) < 0)
-                    HGOTO_ERROR(H5E_ATTR, H5E_CANTENCODE, FAIL, "datatype conversion failed")
+    /* compute the string length which will fit into the user's buffer */
+    copy_len = MIN(buf_size - 1, nbytes);
 
-                /* Copy the converted data into the user's buffer */
-                HDmemcpy(buf, tconv_buf, (dst_type_size * nelmts));
-            } /* end if */
-            /* No type conversion necessary */
-            else {
-                HDassert(dst_type_size == src_type_size);
+    /* Copy all/some of the name */
+    if(buf && copy_len > 0) {
+        HDmemcpy(buf, attr->shared->name, copy_len);
 
-                /* Copy the attribute data into the user's buffer */
-                HDmemcpy(buf, attr->shared->data, (dst_type_size * nelmts));
-            } /* end else */
-        } /* end else */
+        /* Terminate the string */
+        buf[copy_len]='\0';
     } /* end if */
 
-done:
-    /* Release resources */
-    if(src_id >= 0 && H5I_dec_ref(src_id) < 0)
-        HDONE_ERROR(H5E_ATTR, H5E_CANTDEC, FAIL, "unable to close temporary object")
-    if(dst_id >= 0 && H5I_dec_ref(dst_id) < 0)
-        HDONE_ERROR(H5E_ATTR, H5E_CANTDEC, FAIL, "unable to close temporary object")
-    if(tconv_buf)
-        tconv_buf = H5FL_BLK_FREE(attr_buf, tconv_buf);
-    if(bkg_buf)
-	bkg_buf = H5FL_BLK_FREE(attr_buf, bkg_buf);
+    /* Set return value */
+    ret_value = (ssize_t)nbytes;
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5A_read() */
+} /* H5A__get_name() */
 
 

 /*-------------------------------------------------------------------------
@@ -796,7 +839,8 @@ H5A_get_create_plist(H5A_t* attr)
     H5P_genplist_t      *plist;              /* Default property list */
     hid_t               new_plist_id;        /* ID of ACPL to return */
     H5P_genplist_t      *new_plist;          /* ACPL to return */
-    hid_t               ret_value;
+    hid_t               ret_value = H5I_INVALID_HID;    /* Return value */
+
     FUNC_ENTER_NOAPI_NOINIT
 
     if(NULL == (plist = (H5P_genplist_t *)H5I_object(H5P_LST_ATTRIBUTE_CREATE_ID_g)))
@@ -819,54 +863,8 @@ done:
 } /* end H5Aget_create_plist() */
 
 

-/*--------------------------------------------------------------------------
- NAME
-    H5A_get_name
- PURPOSE
-    Private function for H5Aget_name.  Gets a copy of the name for an
-    attribute
- RETURNS
-    This function returns the length of the attribute's name (which may be
-    longer than 'buf_size') on success or negative for failure.
- DESCRIPTION
-        This function retrieves the name of an attribute for an attribute ID.
-    Up to 'buf_size' characters are stored in 'buf' followed by a '\0' string
-    terminator.  If the name of the attribute is longer than 'buf_size'-1,
-    the string terminator is stored in the last position of the buffer to
-    properly terminate the string.
---------------------------------------------------------------------------*/
-ssize_t
-H5A_get_name(H5A_t *attr, size_t buf_size, char *buf)
-{
-    size_t              copy_len, nbytes;
-    ssize_t		ret_value;
-
-    FUNC_ENTER_NOAPI_NOERR
-
-    /* get the real attribute length */
-    nbytes = HDstrlen(attr->shared->name);
-    HDassert((ssize_t)nbytes >= 0); /*overflow, pretty unlikely --rpm*/
-
-    /* compute the string length which will fit into the user's buffer */
-    copy_len = MIN(buf_size - 1, nbytes);
-
-    /* Copy all/some of the name */
-    if(buf && copy_len > 0) {
-        HDmemcpy(buf, attr->shared->name, copy_len);
-
-        /* Terminate the string */
-        buf[copy_len]='\0';
-    } /* end if */
-
-    /* Set return value */
-    ret_value = (ssize_t)nbytes;
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5A_get_name() */
-
-

 /*-------------------------------------------------------------------------
- * Function:	H5A_get_info
+ * Function:	H5A__get_info
  *
  * Purpose:	Retrieve information about an attribute.
  *
@@ -879,9 +877,11 @@ H5A_get_name(H5A_t *attr, size_t buf_size, char *buf)
  *-------------------------------------------------------------------------
  */
 herr_t
-H5A_get_info(const H5A_t *attr, H5A_info_t *ainfo)
+H5A__get_info(const H5A_t *attr, H5A_info_t *ainfo)
 {
-    FUNC_ENTER_NOAPI_NOERR
+    herr_t ret_value = SUCCEED;           /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
 
     /* Check args */
     HDassert(attr);
@@ -899,8 +899,9 @@ H5A_get_info(const H5A_t *attr, H5A_info_t *ainfo)
         ainfo->corder = attr->shared->crt_idx;
     } /* end else */
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5A_get_info() */
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5A__get_info() */
 
 

 /*-------------------------------------------------------------------------
@@ -1092,15 +1093,16 @@ done:
 H5O_loc_t *
 H5A_oloc(H5A_t *attr)
 {
-    H5O_loc_t *ret_value;   /* Return value */
+    H5O_loc_t *ret_value = NULL;   /* Return value */
 
-    FUNC_ENTER_NOAPI_NOERR
+    FUNC_ENTER_NOAPI(NULL)
 
     HDassert(attr);
 
     /* Set return value */
     ret_value = &(attr->oloc);
 
+done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5A_oloc() */
 
@@ -1123,15 +1125,16 @@ H5A_oloc(H5A_t *attr)
 H5G_name_t *
 H5A_nameof(H5A_t *attr)
 {
-    H5G_name_t *ret_value;   /* Return value */
+    H5G_name_t *ret_value = NULL;   /* Return value */
 
-    FUNC_ENTER_NOAPI_NOERR
+    FUNC_ENTER_NOAPI(NULL)
 
     HDassert(attr);
 
     /* Set return value */
-    ret_value=&(attr->path);
+    ret_value = &(attr->path);
 
+done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5A_nameof() */
 
@@ -1152,15 +1155,16 @@ H5A_nameof(H5A_t *attr)
 H5T_t *
 H5A_type(const H5A_t *attr)
 {
-    H5T_t *ret_value;   /* Return value */
+    H5T_t *ret_value = NULL;   /* Return value */
 
-    FUNC_ENTER_NOAPI_NOERR
+    FUNC_ENTER_NOAPI(NULL)
 
     HDassert(attr);
 
     /* Set return value */
     ret_value = attr->shared->dt;
 
+done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5A_type() */
 
@@ -1186,7 +1190,7 @@ H5A_exists_by_name(H5G_loc_t loc, const char *obj_name, const char *attr_name,
     H5G_name_t  obj_path;            	/* Opened object group hier. path */
     H5O_loc_t   obj_oloc;            	/* Opened object object location */
     hbool_t     loc_found = FALSE;      /* Entry at 'obj_name' found */
-    htri_t	ret_value;              /* Return value */
+    htri_t	ret_value = FAIL;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1229,10 +1233,6 @@ done:
  *              24 June 2008
  *              Changed the table of attribute objects to be the table of
  *              pointers to attribute objects for the ease of operation.
- *
- *	Vailin Choi; September 2011
- *	Change "oh_modified" from boolean to unsigned
- *	(See H5Oprivate.h for possible flags)
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -1344,7 +1344,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5A_dense_build_table_cb
+ * Function:	H5A__dense_build_table_cb
  *
  * Purpose:	Callback routine for building table of attributes from dense
  *              attribute storage.
@@ -1359,12 +1359,12 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5A_dense_build_table_cb(const H5A_t *attr, void *_udata)
+H5A__dense_build_table_cb(const H5A_t *attr, void *_udata)
 {
     H5A_dense_bt_ud_t *udata = (H5A_dense_bt_ud_t *)_udata;     /* 'User data' passed in */
     herr_t ret_value = H5_ITER_CONT;   /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* check arguments */
     HDassert(attr);
@@ -1384,7 +1384,7 @@ H5A_dense_build_table_cb(const H5A_t *attr, void *_udata)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5A_dense_build_table_cb() */
+} /* end H5A__dense_build_table_cb() */
 
 

 /*-------------------------------------------------------------------------
@@ -1450,7 +1450,7 @@ H5A_dense_build_table(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo,
 
         /* Build iterator operator */
         attr_op.op_type = H5A_ATTR_OP_LIB;
-        attr_op.u.lib_op = H5A_dense_build_table_cb;
+        attr_op.u.lib_op = H5A__dense_build_table_cb;
 
         /* Iterate over the links in the group, building a table of the link messages */
         if(H5A_dense_iterate(f, dxpl_id, (hid_t)0, ainfo, H5_INDEX_NAME,
@@ -1549,7 +1549,7 @@ H5A__attr_cmp_name_dec(const void *attr1, const void *attr2)
 static int
 H5A__attr_cmp_corder_inc(const void *attr1, const void *attr2)
 {
-    int ret_value;              /* Return value */
+    int ret_value = 0;          /* Return value */
 
     FUNC_ENTER_STATIC_NOERR
 
@@ -1584,7 +1584,7 @@ H5A__attr_cmp_corder_inc(const void *attr1, const void *attr2)
 static int
 H5A__attr_cmp_corder_dec(const void *attr1, const void *attr2)
 {
-    int ret_value;              /* Return value */
+    int ret_value = 0;              /* Return value */
 
     FUNC_ENTER_STATIC_NOERR
 
@@ -1686,7 +1686,7 @@ H5A_attr_iterate_table(const H5A_attr_table_t *atable, hsize_t skip,
                 H5A_info_t ainfo;               /* Info for attribute */
 
                 /* Get the attribute information */
-                if(H5A_get_info(atable->attrs[u], &ainfo) < 0)
+                if(H5A__get_info(atable->attrs[u], &ainfo) < 0)
                     HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, H5_ITER_ERROR, "unable to get attribute info")
 
                 /* Make the application callback */
@@ -1788,9 +1788,9 @@ htri_t
 H5A_get_ainfo(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5O_ainfo_t *ainfo)
 {
     H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for name index */
-    htri_t ret_value;   /* Return value */
+    htri_t ret_value = FAIL;            /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, oh->cache_info.addr, FAIL)
 
     /* check arguments */
     HDassert(f);
@@ -1829,7 +1829,7 @@ done:
     if(bt2_name && H5B2_close(bt2_name, dxpl_id) < 0)
         HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for name index")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5A_get_ainfo() */
 
 

@@ -1853,16 +1853,17 @@ herr_t
 H5A_set_version(const H5F_t *f, H5A_t *attr)
 {
     hbool_t type_shared, space_shared;  /* Flags to indicate that shared messages are used for this attribute */
-    hbool_t use_latest_format;          /* Flag indicating the newest file format should be used */
+    hbool_t use_latest_format;          /* Flag indicating the latest attribute version support is enabled */
+    herr_t ret_value = SUCCEED;   /* Return value */
 
-    FUNC_ENTER_NOAPI_NOERR
+    FUNC_ENTER_NOAPI(FAIL)
 
     /* check arguments */
     HDassert(f);
     HDassert(attr);
 
-    /* Get the file's 'use the latest version of the format' flag */
-    use_latest_format = H5F_USE_LATEST_FORMAT(f);
+    /* Get the file's 'use the latest attribute version support' flag */
+    use_latest_format = H5F_USE_LATEST_FLAGS(f, H5F_LATEST_ATTRIBUTE);
 
     /* Check whether datatype and dataspace are shared */
     if(H5O_msg_is_shared(H5O_DTYPE_ID, attr->shared->dt) > 0)
@@ -1877,7 +1878,7 @@ H5A_set_version(const H5F_t *f, H5A_t *attr)
 
     /* Check which version to encode attribute with */
     if(use_latest_format)
-        attr->shared->version = H5O_ATTR_VERSION_LATEST;      /* Write out latest version of format */
+        attr->shared->version = H5O_ATTR_VERSION_LATEST;      /* Write out latest attribute version */
     else if(attr->shared->encoding != H5T_CSET_ASCII)
         attr->shared->version = H5O_ATTR_VERSION_3;   /* Write version which includes the character encoding */
     else if(type_shared || space_shared)
@@ -1885,7 +1886,8 @@ H5A_set_version(const H5F_t *f, H5A_t *attr)
     else
         attr->shared->version = H5O_ATTR_VERSION_1;   /* Write out basic version */
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5A_set_version() */
 
 

@@ -1922,8 +1924,7 @@ H5A_attr_copy_file(const H5A_t *attr_src, H5F_t *file_dst, hbool_t *recompute_si
     void       *buf = NULL;             /* Buffer for copying data */
     void       *reclaim_buf = NULL;     /* Buffer for reclaiming data */
     hid_t       buf_sid = -1;           /* ID for buffer dataspace */
-
-    H5A_t       *ret_value;             /* Return value */
+    H5A_t      *ret_value = NULL;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -2254,7 +2255,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5A_dense_post_copy_file_cb
+ * Function:    H5A__dense_post_copy_file_cb
  *
  * Purpose:     Callback routine for copying a dense attribute from SRC to DST.
  *
@@ -2268,13 +2269,13 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5A_dense_post_copy_file_cb(const H5A_t *attr_src, void *_udata)
+H5A__dense_post_copy_file_cb(const H5A_t *attr_src, void *_udata)
 {
     H5A_dense_file_cp_ud_t *udata = (H5A_dense_file_cp_ud_t *)_udata;
     H5A_t *attr_dst = NULL;
     herr_t ret_value = H5_ITER_CONT;   /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* check arguments */
     HDassert(attr_src);
@@ -2295,16 +2296,22 @@ H5A_dense_post_copy_file_cb(const H5A_t *attr_src, void *_udata)
     if(H5O_msg_reset_share(H5O_ATTR_ID, attr_dst) < 0)
         HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to reset attribute sharing")
 
+    /* Set COPIED tag for destination object's metadata */
+    H5_BEGIN_TAG(udata->dxpl_id, H5AC__COPIED_TAG, H5_ITER_ERROR);
+
     /* Insert attribute into dense storage */
     if(H5A_dense_insert(udata->file, udata->dxpl_id, udata->ainfo, attr_dst) < 0)
-        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, H5_ITER_ERROR, "unable to add to dense storage")
+        HGOTO_ERROR_TAG(H5E_OHDR, H5E_CANTINSERT, H5_ITER_ERROR, "unable to add to dense storage")
+
+    /* Reset metadata tag */
+    H5_END_TAG(H5_ITER_ERROR);
 
 done:
     if(attr_dst && H5A_close(attr_dst) < 0)
         HDONE_ERROR(H5E_ATTR, H5E_CLOSEERROR, FAIL, "can't close destination attribute")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5A_dense_post_copy_file_cb() */
+} /* end H5A__dense_post_copy_file_cb() */
 
 

 /*-------------------------------------------------------------------------
@@ -2345,10 +2352,9 @@ H5A_dense_post_copy_file_all(const H5O_loc_t *src_oloc, const H5O_ainfo_t *ainfo
     udata.oloc_dst = dst_oloc;
 
     attr_op.op_type = H5A_ATTR_OP_LIB;
-    attr_op.u.lib_op = H5A_dense_post_copy_file_cb;
-
+    attr_op.u.lib_op = H5A__dense_post_copy_file_cb;
 
-     if(H5A_dense_iterate(src_oloc->file, dxpl_id, (hid_t)0, ainfo_src, H5_INDEX_NAME,
+    if(H5A_dense_iterate(src_oloc->file, dxpl_id, (hid_t)0, ainfo_src, H5_INDEX_NAME,
             H5_ITER_NATIVE, (hsize_t)0, NULL, &attr_op, &udata) < 0)
         HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "error building attribute table")
 
diff --git a/src/H5Amodule.h b/src/H5Amodule.h
new file mode 100644
index 0000000..e347fe1
--- /dev/null
+++ b/src/H5Amodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5A package.  Including this header means that the source file
+ *		is part of the H5A package.
+ */
+#ifndef _H5Amodule_H
+#define _H5Amodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5A_MODULE
+#define H5_MY_PKG       H5A
+#define H5_MY_PKG_ERR   H5E_ATTR
+#define H5_MY_PKG_INIT  YES
+
+#endif /* _H5Amodule_H */
+
diff --git a/src/H5Apkg.h b/src/H5Apkg.h
index f5e588c..5858147 100644
--- a/src/H5Apkg.h
+++ b/src/H5Apkg.h
@@ -21,7 +21,7 @@
  *              the H5A package.  Source files outside the H5A package should
  *              include H5Aprivate.h instead.
  */
-#ifndef H5A_PACKAGE
+#if !(defined H5A_FRIEND || defined H5A_MODULE)
 #error "Do not include this file outside the H5A package!"
 #endif
 
@@ -184,20 +184,15 @@ H5_DLLVAR const H5B2_class_t H5A_BT2_CORDER[1];
 /******************************/
 
 /* Function prototypes for H5A package scope */
-H5_DLL herr_t H5A_init(void);
-H5_DLL herr_t H5A__term_deprec_interface(void);
 H5_DLL H5A_t *H5A_create(const H5G_loc_t *loc, const char *name,
     const H5T_t *type, const H5S_t *space, hid_t acpl_id, hid_t dxpl_id);
 H5_DLL H5A_t *H5A_open_by_name(const H5G_loc_t *loc, const char *obj_name,
     const char *attr_name, hid_t lapl_id, hid_t dxpl_id);
 H5_DLL H5A_t *H5A_open_by_idx(const H5G_loc_t *loc, const char *obj_name,
     H5_index_t idx_type, H5_iter_order_t order, hsize_t n, hid_t lapl_id, hid_t dxpl_id);
-H5_DLL herr_t H5A_open_common(const H5G_loc_t *loc, H5A_t *attr);
-H5_DLL herr_t H5A_write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id);
-H5_DLL herr_t H5A_read(const H5A_t *attr, const H5T_t *mem_type, void *buf, hid_t dxpl_id);
-H5_DLL ssize_t H5A_get_name(H5A_t *attr, size_t buf_size, char *buf);
+H5_DLL herr_t H5A__open_common(const H5G_loc_t *loc, H5A_t *attr);
 H5_DLL H5A_t *H5A_copy(H5A_t *new_attr, const H5A_t *old_attr);
-H5_DLL herr_t H5A_get_info(const H5A_t *attr, H5A_info_t *ainfo);
+H5_DLL herr_t H5A__get_info(const H5A_t *attr, H5A_info_t *ainfo);
 H5_DLL hid_t H5A_get_create_plist(H5A_t* attr);
 H5_DLL herr_t H5A_free(H5A_t *attr);
 H5_DLL herr_t H5A_close(H5A_t *attr);
@@ -207,6 +202,9 @@ H5_DLL herr_t H5A_rename_by_name(H5G_loc_t loc, const char *obj_name, const char
     const char *new_attr_name, hid_t lapl_id, hid_t dxpl_id);
 H5_DLL htri_t H5A_exists_by_name(H5G_loc_t loc, const char *obj_name, const char *attr_name,
     hid_t lapl_id, hid_t dxpl_id);
+H5_DLL herr_t H5A__write(H5A_t *attr, const H5T_t *mem_type, const void *buf, hid_t dxpl_id);
+H5_DLL herr_t H5A__read(const H5A_t *attr, const H5T_t *mem_type, void *buf, hid_t dxpl_id);
+H5_DLL ssize_t H5A__get_name(H5A_t *attr, size_t buf_size, char *buf);
 
 /* Attribute "dense" storage routines */
 H5_DLL herr_t H5A_dense_create(H5F_t *f, hid_t dxpl_id, H5O_ainfo_t *ainfo);
@@ -222,15 +220,15 @@ H5_DLL herr_t H5A_dense_iterate(H5F_t *f, hid_t dxpl_id, hid_t loc_id,
     const H5O_ainfo_t *ainfo, H5_index_t idx_type, H5_iter_order_t order,
     hsize_t skip, hsize_t *last_attr, const H5A_attr_iter_op_t *attr_op,
     void *op_data);
-H5_DLL herr_t H5A_dense_remove(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo,
-    const char *name);
-H5_DLL herr_t H5A_dense_remove_by_idx(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo,
-    H5_index_t idx_type, H5_iter_order_t order, hsize_t n);
+H5_DLL herr_t H5A_dense_remove(H5F_t *f, hid_t dxpl_id,
+    const H5O_ainfo_t *ainfo, const char *name);
+H5_DLL herr_t H5A_dense_remove_by_idx(H5F_t *f, hid_t dxpl_id,
+    const H5O_ainfo_t *ainfo, H5_index_t idx_type, H5_iter_order_t order,
+    hsize_t n);
 H5_DLL htri_t H5A_dense_exists(H5F_t *f, hid_t dxpl_id, const H5O_ainfo_t *ainfo,
     const char *name);
 H5_DLL herr_t H5A_dense_delete(H5F_t *f, hid_t dxpl_id, H5O_ainfo_t *ainfo);
 
-
 /* Attribute table operations */
 H5_DLL herr_t H5A_compact_build_table(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
     H5_index_t idx_type, H5_iter_order_t order, H5A_attr_table_t *atable);
@@ -269,7 +267,6 @@ H5_DLL herr_t H5A_attr_post_copy_file(const H5O_loc_t *src_oloc, const H5A_t *me
 H5_DLL herr_t H5A_dense_post_copy_file_all(const H5O_loc_t *src_oloc, const H5O_ainfo_t * ainfo_src,
     H5O_loc_t *dst_oloc, H5O_ainfo_t *ainfo_dst, hid_t dxpl_id, H5O_copy_t *cpy_info);
 
-
 /* Testing functions */
 #ifdef H5A_TESTING
 H5_DLL htri_t H5A_is_shared_test(hid_t aid);
diff --git a/src/H5Atest.c b/src/H5Atest.c
index 19b5547..d57bbe1 100644
--- a/src/H5Atest.c
+++ b/src/H5Atest.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5A_PACKAGE		/*suppress error about including H5Apkg  */
+#include "H5Amodule.h"          /* This source code file is part of the H5A module */
 #define H5A_TESTING		/*suppress warning about H5A testing funcs*/
 
 
@@ -95,7 +95,7 @@ htri_t
 H5A_is_shared_test(hid_t attr_id)
 {
     H5A_t	*attr;                  /* Attribute object for ID */
-    htri_t	ret_value;              /* Return value */
+    htri_t	ret_value = FAIL;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
diff --git a/src/H5B.c b/src/H5B.c
index 534118e..3b34c4d 100644
--- a/src/H5B.c
+++ b/src/H5B.c
@@ -97,7 +97,7 @@
 /* Module Setup */
 /****************/
 
-#define H5B_PACKAGE		/*suppress error about including H5Bpkg	  */
+#include "H5Bmodule.h"          /* This source code file is part of the H5B module */
 
 
 /***********/
@@ -134,7 +134,7 @@ typedef struct H5B_iter_ud_t {
 } H5B_info_ud_t;
 
 /* Convenience struct for the arguments needed to unprotect a b-tree after a
- * call to H5B_iterate_helper() or H5B_split() */
+ * call to H5B__iterate_helper() or H5B__split() */
 typedef struct H5B_ins_ud_t {
     H5B_t       *bt;            /* B-tree */
     haddr_t     addr;           /* B-tree address */
@@ -145,7 +145,7 @@ typedef struct H5B_ins_ud_t {
 /********************/
 /* Local Prototypes */
 /********************/
-static H5B_ins_t H5B_insert_helper(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
+static H5B_ins_t H5B__insert_helper(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
 				   const H5B_class_t *type,
 				   uint8_t *lt_key,
 				   hbool_t *lt_key_changed,
@@ -153,19 +153,22 @@ static H5B_ins_t H5B_insert_helper(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
 				   uint8_t *rt_key,
 				   hbool_t *rt_key_changed,
 				   H5B_ins_ud_t *split_bt_ud/*out*/);
-static herr_t H5B_insert_child(H5B_t *bt, unsigned *bt_flags,
+static herr_t H5B__insert_child(H5B_t *bt, unsigned *bt_flags,
                                unsigned idx, haddr_t child,
 			       H5B_ins_t anchor, const void *md_key);
-static herr_t H5B_split(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
+static herr_t H5B__split(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
                         unsigned idx, void *udata,
                         H5B_ins_ud_t *split_bt_ud/*out*/);
-static H5B_t * H5B_copy(const H5B_t *old_bt);
+static H5B_t * H5B__copy(const H5B_t *old_bt);
 
 
 /*********************/
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 /* Declare a free list to manage the haddr_t sequence information */
 H5FL_SEQ_DEFINE(haddr_t);
 
@@ -243,8 +246,8 @@ H5B_create(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, void *udata,
     bt->nchildren = 0;
     if(NULL == (bt->rc_shared = (type->get_shared)(f, udata)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "can't retrieve B-tree node buffer")
-    H5RC_INC(bt->rc_shared);
-    shared=(H5B_shared_t *)H5RC_GET_OBJ(bt->rc_shared);
+    H5UC_INC(bt->rc_shared);
+    shared=(H5B_shared_t *)H5UC_GET_OBJ(bt->rc_shared);
     HDassert(shared);
     if(NULL == (bt->native = H5FL_BLK_MALLOC(native_block, shared->sizeof_keys)) ||
             NULL == (bt->child = H5FL_SEQ_MALLOC(haddr_t, (size_t)shared->two_k)))
@@ -258,7 +261,7 @@ H5B_create(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, void *udata,
     if(H5AC_insert_entry(f, dxpl_id, H5AC_BT, *addr_p, bt, H5AC__NO_FLAGS_SET) < 0)
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "can't add B-tree root node to cache")
 #ifdef H5B_DEBUG
-    H5B_assert(f, dxpl_id, *addr_p, shared->type, udata);
+    H5B__assert(f, dxpl_id, *addr_p, shared->type, udata);
 #endif
 
 done:
@@ -269,7 +272,7 @@ done:
         } /* end if */
 	if(bt)
             /* Destroy B-tree node */
-            if(H5B_node_dest(bt) < 0)
+            if(H5B__node_dest(bt) < 0)
                 HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree node")
     } /* end if */
 
@@ -304,12 +307,12 @@ htri_t
 H5B_find(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void *udata)
 {
     H5B_t	*bt = NULL;
-    H5RC_t	*rc_shared;             /* Ref-counted shared info */
+    H5UC_t	*rc_shared;             /* Ref-counted shared info */
     H5B_shared_t *shared;               /* Pointer to shared B-tree info */
     H5B_cache_ud_t cache_udata;         /* User-data for metadata cache callback */
     unsigned    idx = 0, lt = 0, rt;    /* Final, left & right key indices */
     int	        cmp = 1;                /* Key comparison value */
-    htri_t	ret_value;              /* Return value */
+    htri_t	ret_value = FAIL;       /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -326,7 +329,7 @@ H5B_find(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void *u
     /* Get shared info for B-tree */
     if(NULL == (rc_shared = (type->get_shared)(f, udata)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "can't retrieve B-tree's shared ref. count object")
-    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    shared = (H5B_shared_t *)H5UC_GET_OBJ(rc_shared);
     HDassert(shared);
 
     /*
@@ -336,7 +339,7 @@ H5B_find(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void *u
     cache_udata.f = f;
     cache_udata.type = type;
     cache_udata.rc_shared = rc_shared;
-    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_READ)))
+    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree node")
 
     rt = bt->nchildren;
@@ -375,7 +378,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B_split
+ * Function:	H5B__split
  *
  * Purpose:	Split a single node into two nodes.  The old node will
  *		contain the left children and the new node will contain the
@@ -397,7 +400,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B_split(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud, unsigned idx,
+H5B__split(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud, unsigned idx,
     void *udata, H5B_ins_ud_t *split_bt_ud/*out*/)
 {
     H5P_genplist_t *dx_plist;           /* Data transfer property list */
@@ -407,7 +410,7 @@ H5B_split(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud, unsigned idx,
     double      split_ratios[3];        /* B-tree split ratios */
     herr_t	ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /*
      * Check arguments.
@@ -422,7 +425,7 @@ H5B_split(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud, unsigned idx,
     /*
      * Initialize variables.
      */
-    shared = (H5B_shared_t *)H5RC_GET_OBJ(bt_ud->bt->rc_shared);
+    shared = (H5B_shared_t *)H5UC_GET_OBJ(bt_ud->bt->rc_shared);
     HDassert(shared);
     HDassert(bt_ud->bt->nchildren == shared->two_k);
 
@@ -446,7 +449,7 @@ H5B_split(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud, unsigned idx,
 	    side = "LEFT";
 	else
 	    side = "MIDDLE";
-	fprintf(H5DEBUG(B), "H5B_split: %3u {%5.3f,%5.3f,%5.3f} %6s",
+	fprintf(H5DEBUG(B), "H5B__split: %3u {%5.3f,%5.3f,%5.3f} %6s",
 		shared->two_k, split_ratios[0], split_ratios[1], split_ratios[2], side);
     }
 #endif
@@ -485,7 +488,7 @@ H5B_split(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud, unsigned idx,
     cache_udata.f = f;
     cache_udata.type = shared->type;
     cache_udata.rc_shared = bt_ud->bt->rc_shared;
-    if(NULL == (split_bt_ud->bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, split_bt_ud->addr, &cache_udata, H5AC_WRITE)))
+    if(NULL == (split_bt_ud->bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, split_bt_ud->addr, &cache_udata, H5AC__NO_FLAGS_SET)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree")
     split_bt_ud->bt->level = bt_ud->bt->level;
 
@@ -518,7 +521,7 @@ H5B_split(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud, unsigned idx,
     if(H5F_addr_defined(bt_ud->bt->right)) {
         H5B_t   *tmp_bt;
 
-        if(NULL == (tmp_bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, bt_ud->bt->right, &cache_udata, H5AC_WRITE)))
+        if(NULL == (tmp_bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, bt_ud->bt->right, &cache_udata, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load right sibling")
 
         tmp_bt->left = split_bt_ud->addr;
@@ -528,6 +531,7 @@ H5B_split(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud, unsigned idx,
     } /* end if */
 
     bt_ud->bt->right = split_bt_ud->addr;
+    HDassert(bt_ud->cache_flags & H5AC__DIRTIED_FLAG);
 
 done:
     if(ret_value < 0) {
@@ -539,7 +543,7 @@ done:
     } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B_split() */
+} /* end H5B__split() */
 
 

 /*-------------------------------------------------------------------------
@@ -572,7 +576,7 @@ H5B_insert(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void
     H5B_ins_ud_t bt_ud = H5B_INS_UD_T_NULL; /* (Old) root node */
     H5B_ins_ud_t split_bt_ud = H5B_INS_UD_T_NULL; /* Split B-tree node */
     H5B_t       *new_root_bt = NULL;    /* New root node */
-    H5RC_t	*rc_shared;             /* Ref-counted shared info */
+    H5UC_t	*rc_shared;             /* Ref-counted shared info */
     H5B_shared_t        *shared;        /* Pointer to shared B-tree info */
     H5B_cache_ud_t cache_udata;         /* User-data for metadata cache callback */
     H5B_ins_t	my_ins = H5B_INS_ERROR;
@@ -589,7 +593,7 @@ H5B_insert(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void
     /* Get shared info for B-tree */
     if(NULL == (rc_shared = (type->get_shared)(f, udata)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "can't retrieve B-tree's shared ref. count object")
-    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    shared = (H5B_shared_t *)H5UC_GET_OBJ(rc_shared);
     HDassert(shared);
 
     /* Protect the root node */
@@ -597,17 +601,18 @@ H5B_insert(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void
     cache_udata.type = type;
     cache_udata.rc_shared = rc_shared;
     bt_ud.addr = addr;
-    if(NULL == (bt_ud.bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_WRITE)))
+    if(NULL == (bt_ud.bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to locate root of B-tree")
 
     /* Insert the object */
-    if((int)(my_ins = H5B_insert_helper(f, dxpl_id, &bt_ud, type, lt_key,
+    if((int)(my_ins = H5B__insert_helper(f, dxpl_id, &bt_ud, type, lt_key,
             &lt_key_changed, md_key, udata, rt_key, &rt_key_changed,
             &split_bt_ud/*out*/)) < 0)
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "unable to insert key")
 
     /* Check if the root node split */
     if(H5B_INS_NOOP == my_ins) {
+        /* The root node did not split - just return */
         HDassert(!split_bt_ud.bt);
         HGOTO_DONE(SUCCEED)
     } /* end if */
@@ -638,13 +643,13 @@ H5B_insert(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void
      */
 
     /* Make a copy of the old root information */
-    if(NULL == (new_root_bt = H5B_copy(bt_ud.bt)))
+    if(NULL == (new_root_bt = H5B__copy(bt_ud.bt)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to copy old root")
 
     /* Unprotect the old root so we can move it.  Also force it to be marked
      * dirty so it is written to the new location. */
     if(H5AC_unprotect(f, dxpl_id, H5AC_BT, bt_ud.addr, bt_ud.bt, H5AC__DIRTIED_FLAG) < 0)
-        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release old root")
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release old root")
     bt_ud.bt = NULL;  /* Make certain future references will be caught */
 
     /* Move the location of the old root on the disk */
@@ -677,7 +682,7 @@ H5B_insert(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void
 
 done:
     if(ret_value < 0)
-        if(new_root_bt && H5B_node_dest(new_root_bt) < 0)
+        if(new_root_bt && H5B__node_dest(new_root_bt) < 0)
             HDONE_ERROR(H5E_BTREE, H5E_CANTRELEASE, FAIL, "unable to free B-tree root node");
 
     if(bt_ud.bt)
@@ -690,7 +695,7 @@ done:
 
 #ifdef H5B_DEBUG
     if(ret_value >= 0)
-        H5B_assert(f, dxpl_id, addr, type, udata);
+        H5B__assert(f, dxpl_id, addr, type, udata);
 #endif
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -698,7 +703,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B_insert_child
+ * Function:	H5B__insert_child
  *
  * Purpose:	Insert a child to the left or right of child[IDX] depending
  *		on whether ANCHOR is H5B_INS_LEFT or H5B_INS_RIGHT. The BT
@@ -713,18 +718,18 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B_insert_child(H5B_t *bt, unsigned *bt_flags, unsigned idx,
+H5B__insert_child(H5B_t *bt, unsigned *bt_flags, unsigned idx,
     haddr_t child, H5B_ins_t anchor, const void *md_key)
 {
     H5B_shared_t        *shared;        /* Pointer to shared B-tree info */
     uint8_t             *base;          /* Base offset for move */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     HDassert(bt);
     HDassert(bt_flags);
     HDassert(H5F_addr_defined(child));
-    shared = (H5B_shared_t *)H5RC_GET_OBJ(bt->rc_shared);
+    shared = (H5B_shared_t *)H5UC_GET_OBJ(bt->rc_shared);
     HDassert(shared);
     HDassert(bt->nchildren < shared->two_k);
 
@@ -771,7 +776,7 @@ H5B_insert_child(H5B_t *bt, unsigned *bt_flags, unsigned idx,
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B_insert_helper
+ * Function:	H5B__insert_helper
  *
  * Purpose:	Inserts the item UDATA into the tree rooted at ADDR and having
  *		the specified type.
@@ -802,7 +807,7 @@ H5B_insert_child(H5B_t *bt, unsigned *bt_flags, unsigned idx,
  *-------------------------------------------------------------------------
  */
 static H5B_ins_t
-H5B_insert_helper(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
+H5B__insert_helper(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
                   const H5B_class_t *type,
                   uint8_t *lt_key, hbool_t *lt_key_changed,
                   uint8_t *md_key, void *udata,
@@ -810,7 +815,7 @@ H5B_insert_helper(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
 		  H5B_ins_ud_t *split_bt_ud/*out*/)
 {
     H5B_t       *bt;                    /* Convenience pointer to B-tree */
-    H5RC_t	*rc_shared;             /* Ref-counted shared info */
+    H5UC_t	*rc_shared;             /* Ref-counted shared info */
     H5B_shared_t *shared;               /* Pointer to shared B-tree info */
     H5B_cache_ud_t cache_udata;         /* User-data for metadata cache callback */
     unsigned	lt = 0, idx = 0, rt;    /* Left, final & right index values */
@@ -820,7 +825,7 @@ H5B_insert_helper(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
     H5B_ins_t	my_ins = H5B_INS_ERROR;
     H5B_ins_t	ret_value = H5B_INS_ERROR;      /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /*
      * Check arguments
@@ -850,7 +855,7 @@ H5B_insert_helper(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
     /* Get shared info for B-tree */
     if(NULL == (rc_shared = (type->get_shared)(f, udata)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, H5B_INS_ERROR, "can't retrieve B-tree's shared ref. count object")
-    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    shared = (H5B_shared_t *)H5UC_GET_OBJ(rc_shared);
     HDassert(shared);
 
     /*
@@ -901,10 +906,10 @@ H5B_insert_helper(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
              * Follow the minimum branch out of this node to a subtree.
              */
             child_bt_ud.addr = bt->child[idx];
-            if(NULL == (child_bt_ud.bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, child_bt_ud.addr, &cache_udata, H5AC_WRITE)))
+            if(NULL == (child_bt_ud.bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, child_bt_ud.addr, &cache_udata, H5AC__NO_FLAGS_SET)))
                 HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to load node")
 
-            if((int)(my_ins = H5B_insert_helper(f, dxpl_id, &child_bt_ud, type,
+            if((int)(my_ins = H5B__insert_helper(f, dxpl_id, &child_bt_ud, type,
                     H5B_NKEY(bt,shared,idx), lt_key_changed, md_key,
                     udata, H5B_NKEY(bt, shared, idx + 1), rt_key_changed,
                     &new_child_bt_ud/*out*/)) < 0)
@@ -947,10 +952,10 @@ H5B_insert_helper(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
             */
             idx = bt->nchildren - 1;
             child_bt_ud.addr = bt->child[idx];
-            if(NULL == (child_bt_ud.bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, child_bt_ud.addr, &cache_udata, H5AC_WRITE)))
+            if(NULL == (child_bt_ud.bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, child_bt_ud.addr, &cache_udata, H5AC__NO_FLAGS_SET)))
                 HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to load node")
 
-            if((int)(my_ins = H5B_insert_helper(f, dxpl_id, &child_bt_ud, type,
+            if((int)(my_ins = H5B__insert_helper(f, dxpl_id, &child_bt_ud, type,
                     H5B_NKEY(bt, shared, idx), lt_key_changed, md_key, udata,
                     H5B_NKEY(bt, shared, idx + 1), rt_key_changed,
                     &new_child_bt_ud/*out*/)) < 0)
@@ -1002,10 +1007,10 @@ H5B_insert_helper(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
 	 */
 	HDassert(idx < bt->nchildren);
 	child_bt_ud.addr = bt->child[idx];
-        if(NULL == (child_bt_ud.bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, child_bt_ud.addr, &cache_udata, H5AC_WRITE)))
+        if(NULL == (child_bt_ud.bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, child_bt_ud.addr, &cache_udata, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to load node")
 
-	if((int)(my_ins = H5B_insert_helper(f, dxpl_id, &child_bt_ud, type,
+	if((int)(my_ins = H5B__insert_helper(f, dxpl_id, &child_bt_ud, type,
                 H5B_NKEY(bt, shared, idx), lt_key_changed, md_key, udata,
                 H5B_NKEY(bt, shared, idx + 1), rt_key_changed, &new_child_bt_ud/*out*/)) < 0)
 	    HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, H5B_INS_ERROR, "can't insert subtree")
@@ -1048,23 +1053,16 @@ H5B_insert_helper(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
     /*
      * Handle changes/additions to children
      */
-    if(H5B_INS_CHANGE == my_ins) {
-	/*
-	 * The insertion simply changed the address for the child.
-	 */
-	HDassert(!child_bt_ud.bt);
-	HDassert(bt->level == 0);
-	bt->child[idx] = new_child_bt_ud.addr;
-        bt_ud->cache_flags |= H5AC__DIRTIED_FLAG;
-    } else if(H5B_INS_LEFT == my_ins || H5B_INS_RIGHT == my_ins) {
-        hbool_t *tmp_bt_flags_ptr = NULL;
+    HDassert(!(bt->level == 0) != !(child_bt_ud.bt));
+    if(H5B_INS_LEFT == my_ins || H5B_INS_RIGHT == my_ins) {
+        unsigned *tmp_bt_flags_ptr = NULL;
         H5B_t	*tmp_bt;
 
 	/*
 	 * If this node is full then split it before inserting the new child.
 	 */
 	if(bt->nchildren == shared->two_k) {
-	    if(H5B_split(f, dxpl_id, bt_ud, idx, udata, split_bt_ud/*out*/) < 0)
+	    if(H5B__split(f, dxpl_id, bt_ud, idx, udata, split_bt_ud/*out*/) < 0)
 		HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, H5B_INS_ERROR, "unable to split node")
 	    if(idx < bt->nchildren) {
 		tmp_bt = bt;
@@ -1081,9 +1079,19 @@ H5B_insert_helper(H5F_t *f, hid_t dxpl_id, H5B_ins_ud_t *bt_ud,
 	} /* end else */
 
 	/* Insert the child */
-	if(H5B_insert_child(tmp_bt, tmp_bt_flags_ptr, idx, new_child_bt_ud.addr, my_ins, md_key) < 0)
+	if(H5B__insert_child(tmp_bt, tmp_bt_flags_ptr, idx, new_child_bt_ud.addr, my_ins, md_key) < 0)
 	    HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, H5B_INS_ERROR, "can't insert child")
-    } /* end else-if */
+    } else {
+        if(H5B_INS_CHANGE == my_ins) {
+            /*
+            * The insertion simply changed the address for the child.
+            */
+            HDassert(!child_bt_ud.bt);
+            HDassert(bt->level == 0);
+            bt->child[idx] = new_child_bt_ud.addr;
+            bt_ud->cache_flags |= H5AC__DIRTIED_FLAG;
+        } /* end if */
+    } /* end if */
 
     /*
      * If this node split, return the mid key (the one that is shared
@@ -1119,7 +1127,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B_iterate_helper
+ * Function:	H5B__iterate_helper
  *
  * Purpose:	Calls the list callback for each leaf node of the
  *		B-tree, passing it the caller's UDATA structure.
@@ -1133,17 +1141,17 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B_iterate_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr,
+H5B__iterate_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr,
     H5B_operator_t op, void *udata)
 {
     H5B_t               *bt = NULL;     /* Pointer to current B-tree node */
-    H5RC_t	        *rc_shared;     /* Ref-counted shared info */
+    H5UC_t	        *rc_shared;     /* Ref-counted shared info */
     H5B_shared_t        *shared;        /* Pointer to shared B-tree info */
     H5B_cache_ud_t      cache_udata;    /* User-data for metadata cache callback */
     unsigned            u;              /* Local index variable */
     herr_t              ret_value = H5_ITER_CONT; /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /*
      * Check arguments.
@@ -1157,20 +1165,20 @@ H5B_iterate_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t add
     /* Get shared info for B-tree */
     if(NULL == (rc_shared = (type->get_shared)(f, udata)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "can't retrieve B-tree's shared ref. count object")
-    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    shared = (H5B_shared_t *)H5UC_GET_OBJ(rc_shared);
     HDassert(shared);
 
     /* Protect the initial/current node */
     cache_udata.f = f;
     cache_udata.type = type;
     cache_udata.rc_shared = rc_shared;
-    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_READ)))
+    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC__READ_ONLY_FLAG)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5_ITER_ERROR, "unable to load B-tree node")
 
     /* Iterate over node's children */
     for(u = 0; u < bt->nchildren && ret_value == H5_ITER_CONT; u++) {
         if(bt->level > 0)
-            ret_value = H5B_iterate_helper(f, dxpl_id, type, bt->child[u], op, udata);
+            ret_value = H5B__iterate_helper(f, dxpl_id, type, bt->child[u], op, udata);
         else
             ret_value = (*op)(f, dxpl_id, H5B_NKEY(bt, shared, u), bt->child[u], H5B_NKEY(bt, shared, u + 1), udata);
         if(ret_value < 0)
@@ -1182,7 +1190,7 @@ done:
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5_ITER_ERROR, "unable to release B-tree node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B_iterate_helper() */
+} /* end H5B__iterate_helper() */
 
 

 /*-------------------------------------------------------------------------
@@ -1203,7 +1211,7 @@ herr_t
 H5B_iterate(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr,
     H5B_operator_t op, void *udata)
 {
-    herr_t		ret_value;      /* Return value */
+    herr_t ret_value = FAIL;            /* Return value */
 
     FUNC_ENTER_NOAPI_NOERR
 
@@ -1217,7 +1225,7 @@ H5B_iterate(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr,
     HDassert(udata);
 
     /* Iterate over the B-tree records */
-    if((ret_value = H5B_iterate_helper(f, dxpl_id, type, addr, op, udata)) < 0)
+    if((ret_value = H5B__iterate_helper(f, dxpl_id, type, addr, op, udata)) < 0)
         HERROR(H5E_BTREE, H5E_BADITER, "B-tree iteration failed");
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -1225,7 +1233,7 @@ H5B_iterate(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr,
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B_remove_helper
+ * Function:	H5B__remove_helper
  *
  * Purpose:	The recursive part of removing an item from a B-tree.  The
  *		sub B-tree that is being considered is located at ADDR and
@@ -1249,21 +1257,21 @@ H5B_iterate(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr,
  *-------------------------------------------------------------------------
  */
 static H5B_ins_t
-H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type,
+H5B__remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type,
 		  int level, uint8_t *lt_key/*out*/,
 		  hbool_t *lt_key_changed/*out*/, void *udata,
 		  uint8_t *rt_key/*out*/, hbool_t *rt_key_changed/*out*/)
 {
     H5B_t	*bt = NULL, *sibling = NULL;
     unsigned	bt_flags = H5AC__NO_FLAGS_SET;
-    H5RC_t	*rc_shared;             /* Ref-counted shared info */
+    H5UC_t	*rc_shared;             /* Ref-counted shared info */
     H5B_shared_t *shared;               /* Pointer to shared B-tree info */
     H5B_cache_ud_t cache_udata;         /* User-data for metadata cache callback */
     unsigned    idx = 0, lt = 0, rt;    /* Final, left & right indices */
     int         cmp = 1;                /* Key comparison value */
     H5B_ins_t	ret_value = H5B_INS_ERROR;
 
-    FUNC_ENTER_NOAPI(H5B_INS_ERROR)
+    FUNC_ENTER_STATIC
 
     HDassert(f);
     HDassert(H5F_addr_defined(addr));
@@ -1277,7 +1285,7 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type
     /* Get shared info for B-tree */
     if(NULL == (rc_shared = (type->get_shared)(f, udata)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, H5B_INS_ERROR, "can't retrieve B-tree's shared ref. count object")
-    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    shared = (H5B_shared_t *)H5UC_GET_OBJ(rc_shared);
     HDassert(shared);
 
     /*
@@ -1287,7 +1295,7 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type
     cache_udata.f = f;
     cache_udata.type = type;
     cache_udata.rc_shared = rc_shared;
-    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_WRITE)))
+    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC__NO_FLAGS_SET)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to load B-tree node")
 
     rt = bt->nchildren;
@@ -1308,7 +1316,7 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type
     HDassert(idx < bt->nchildren);
     if(bt->level > 0) {
 	/* We're at an internal node -- call recursively */
-	if((int)(ret_value = H5B_remove_helper(f, dxpl_id,
+	if((int)(ret_value = H5B__remove_helper(f, dxpl_id,
                  bt->child[idx], type, level + 1, H5B_NKEY(bt, shared, idx)/*out*/,
                  lt_key_changed/*out*/, udata, H5B_NKEY(bt, shared, idx + 1)/*out*/,
                  rt_key_changed/*out*/)) < 0)
@@ -1387,7 +1395,7 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type
                  * "critical" for any child in its node to maintain this
                  * consistency (and avoid breaking key/child consistency) */
                 if(H5F_addr_defined(bt->left)) {
-                    if(NULL == (sibling = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, bt->left, &cache_udata, H5AC_WRITE)))
+                    if(NULL == (sibling = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, bt->left, &cache_udata, H5AC__NO_FLAGS_SET)))
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to load node from tree")
 
                     /* Copy right-most key from deleted node to right-most key
@@ -1404,7 +1412,7 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type
                     sibling = NULL;   /* Make certain future references will be caught */
                 } /* end if */
                 if(H5F_addr_defined(bt->right)) {
-                    if(NULL == (sibling = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, bt->right, &cache_udata, H5AC_WRITE)))
+                    if(NULL == (sibling = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, bt->right, &cache_udata, H5AC__NO_FLAGS_SET)))
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to unlink node from tree")
 
                     /* Copy left-most key from deleted node to left-most key in
@@ -1427,9 +1435,9 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type
                 bt->nchildren = 0;
 
                 /* Delete the node from disk (via the metadata cache) */
-                bt_flags |= H5AC__DIRTIED_FLAG;
+		bt_flags |= H5AC__DIRTIED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
                 H5_CHECK_OVERFLOW(shared->sizeof_rnode, size_t, hsize_t);
-                if(H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, bt, bt_flags | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG) < 0) {
+                if(H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, bt, bt_flags | H5AC__DELETED_FLAG) < 0) {
                     bt = NULL;
                     bt_flags = H5AC__NO_FLAGS_SET;
                     HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5B_INS_ERROR, "unable to free B-tree node")
@@ -1524,7 +1532,7 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type
         HDassert(level > 0);
 
         /* Update the rightmost key in the left sibling */
-        if(NULL == (sibling = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, bt->left, &cache_udata, H5AC_WRITE)))
+        if(NULL == (sibling = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, bt->left, &cache_udata, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to protect node")
 
         HDmemcpy(H5B_NKEY(sibling, shared, sibling->nchildren),
@@ -1539,7 +1547,7 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type
         HDassert(level > 0);
 
         /* Update the lefttmost key in the right sibling */
-        if(NULL == (sibling = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, bt->right, &cache_udata, H5AC_WRITE)))
+        if(NULL == (sibling = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, bt->right, &cache_udata, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to protect node")
 
         HDmemcpy(H5B_NKEY(sibling, shared, 0),
@@ -1555,7 +1563,7 @@ done:
 	HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5B_INS_ERROR, "unable to release node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B_remove_helper() */
+} /* end H5B__remove_helper() */
 
 

 /*-------------------------------------------------------------------------
@@ -1594,12 +1602,12 @@ H5B_remove(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void
     HDassert(H5F_addr_defined(addr));
 
     /* The actual removal */
-    if(H5B_remove_helper(f, dxpl_id, addr, type, 0, lt_key, &lt_key_changed,
+    if(H5B__remove_helper(f, dxpl_id, addr, type, 0, lt_key, &lt_key_changed,
 			  udata, rt_key, &rt_key_changed) == H5B_INS_ERROR)
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "unable to remove entry from B-tree")
 
 #ifdef H5B_DEBUG
-    H5B_assert(f, dxpl_id, addr, type, udata);
+    H5B__assert(f, dxpl_id, addr, type, udata);
 #endif
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -1623,7 +1631,7 @@ herr_t
 H5B_delete(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void *udata)
 {
     H5B_t	*bt = NULL;             /* B-tree node being operated on */
-    H5RC_t	*rc_shared;             /* Ref-counted shared info */
+    H5UC_t	*rc_shared;             /* Ref-counted shared info */
     H5B_shared_t *shared;               /* Pointer to shared B-tree info */
     H5B_cache_ud_t cache_udata;         /* User-data for metadata cache callback */
     unsigned    u;                      /* Local index variable */
@@ -1639,14 +1647,14 @@ H5B_delete(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void
     /* Get shared info for B-tree */
     if(NULL == (rc_shared = (type->get_shared)(f, udata)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "can't retrieve B-tree's shared ref. count object")
-    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    shared = (H5B_shared_t *)H5UC_GET_OBJ(rc_shared);
     HDassert(shared);
 
     /* Lock this B-tree node into memory for now */
     cache_udata.f = f;
     cache_udata.type = type;
     cache_udata.rc_shared = rc_shared;
-    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_WRITE)))
+    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree node")
 
     /* Iterate over all children in tree, deleting them */
@@ -1700,7 +1708,7 @@ H5B_shared_new(const H5F_t *f, const H5B_class_t *type, size_t sizeof_rkey)
 {
     H5B_shared_t *shared = NULL;        /* New shared B-tree struct */
     size_t	u;                      /* Local index variable */
-    H5B_shared_t *ret_value;            /* Return value */
+    H5B_shared_t *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -1732,11 +1740,11 @@ H5B_shared_new(const H5F_t *f, const H5B_class_t *type, size_t sizeof_rkey)
 #ifdef H5_CLEAR_MEMORY
 HDmemset(shared->page, 0, shared->sizeof_rnode);
 #endif /* H5_CLEAR_MEMORY */
-    if(NULL == (shared->nkey = H5FL_SEQ_MALLOC(size_t, (size_t)(2 * H5F_KVALUE(f, type) + 1))))
+    if(NULL == (shared->nkey = H5FL_SEQ_MALLOC(size_t, (size_t)(shared->two_k + 1))))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "memory allocation failed for B-tree native keys")
 
     /* Initialize the offsets into the native key buffer */
-    for(u = 0; u < (2 * H5F_KVALUE(f, type) + 1); u++)
+    for(u = 0; u < (shared->two_k + 1); u++)
         shared->nkey[u] = u * type->sizeof_nkey;
 
     /* Set return value */
@@ -1789,7 +1797,7 @@ H5B_shared_free(void *_shared)
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B_copy
+ * Function:	H5B__copy
  *
  * Purpose:	Deep copies an existing H5B_t node.
  *
@@ -1804,19 +1812,19 @@ H5B_shared_free(void *_shared)
  *-------------------------------------------------------------------------
  */
 static H5B_t *
-H5B_copy(const H5B_t *old_bt)
+H5B__copy(const H5B_t *old_bt)
 {
     H5B_t		*new_node = NULL;
     H5B_shared_t        *shared;        /* Pointer to shared B-tree info */
-    H5B_t		*ret_value;
+    H5B_t		*ret_value = NULL;      /* Return value */
 
-    FUNC_ENTER_NOAPI(NULL)
+    FUNC_ENTER_STATIC
 
     /*
      * Check arguments.
      */
     HDassert(old_bt);
-    shared = (H5B_shared_t *)H5RC_GET_OBJ(old_bt->rc_shared);
+    shared = (H5B_shared_t *)H5UC_GET_OBJ(old_bt->rc_shared);
     HDassert(shared);
 
     /* Allocate memory for the new H5B_t object */
@@ -1838,7 +1846,7 @@ H5B_copy(const H5B_t *old_bt)
     HDmemcpy(new_node->child, old_bt->child, (sizeof(haddr_t) * shared->two_k));
 
     /* Increment the ref-count on the raw page */
-    H5RC_INC(new_node->rc_shared);
+    H5UC_INC(new_node->rc_shared);
 
     /* Set return value */
     ret_value = new_node;
@@ -1853,11 +1861,11 @@ done:
     } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B_copy() */
+} /* end H5B__copy() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B_get_info_helper
+ * Function:	H5B__get_info_helper
  *
  * Purpose:	Walks the B-tree nodes, getting information for all of them.
  *
@@ -1870,11 +1878,11 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B_get_info_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr,
+H5B__get_info_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr,
     const H5B_info_ud_t *info_udata)
 {
     H5B_t *bt = NULL;           /* Pointer to current B-tree node */
-    H5RC_t *rc_shared;          /* Ref-counted shared info */
+    H5UC_t *rc_shared;          /* Ref-counted shared info */
     H5B_shared_t *shared;       /* Pointer to shared B-tree info */
     H5B_cache_ud_t cache_udata; /* User-data for metadata cache callback */
     unsigned level;		/* Node level			     */
@@ -1883,7 +1891,7 @@ H5B_get_info_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t ad
     haddr_t left_child;         /* Address of left-most child in node */
     herr_t ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /*
      * Check arguments.
@@ -1898,7 +1906,7 @@ H5B_get_info_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t ad
     /* Get shared info for B-tree */
     if(NULL == (rc_shared = (type->get_shared)(f, info_udata->udata)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "can't retrieve B-tree's shared ref. count object")
-    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    shared = (H5B_shared_t *)H5UC_GET_OBJ(rc_shared);
     HDassert(shared);
 
     /* Get the raw node size for iteration */
@@ -1908,7 +1916,7 @@ H5B_get_info_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t ad
     cache_udata.f = f;
     cache_udata.type = type;
     cache_udata.rc_shared = rc_shared;
-    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_READ)))
+    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree node")
 
     /* Cache information from this node */
@@ -1932,7 +1940,7 @@ H5B_get_info_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t ad
     while(H5F_addr_defined(next_addr)) {
         /* Protect the next node to the right */
         addr = next_addr;
-        if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_READ)))
+        if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "B-tree node")
 
         /* Cache information from this node */
@@ -1951,7 +1959,7 @@ H5B_get_info_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t ad
     /* Check for another "row" of B-tree nodes to iterate over */
     if(level > 0) {
 	/* Keep following the left-most child until we reach a leaf node. */
-	if(H5B_get_info_helper(f, dxpl_id, type, left_child, info_udata) < 0)
+	if(H5B__get_info_helper(f, dxpl_id, type, left_child, info_udata) < 0)
 	    HGOTO_ERROR(H5E_BTREE, H5E_CANTLIST, FAIL, "unable to list B-tree node")
     } /* end if */
 
@@ -1960,7 +1968,7 @@ done:
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B_get_info_helper() */
+} /* end H5B__get_info_helper() */
 
 

 /*-------------------------------------------------------------------------
@@ -2001,13 +2009,13 @@ H5B_get_info(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr,
     info_udata.udata = udata;
 
     /* Iterate over the B-tree nodes */
-    if(H5B_get_info_helper(f, dxpl_id, type, addr, &info_udata) < 0)
+    if(H5B__get_info_helper(f, dxpl_id, type, addr, &info_udata) < 0)
         HGOTO_ERROR(H5E_BTREE, H5E_BADITER, FAIL, "B-tree iteration failed")
 
     /* Iterate over the B-tree records, making any "leaf" callbacks */
     /* (Only if operator defined) */
     if(op)
-        if((ret_value = H5B_iterate_helper(f, dxpl_id, type, addr, op, udata)) < 0)
+        if((ret_value = H5B__iterate_helper(f, dxpl_id, type, addr, op, udata)) < 0)
             HERROR(H5E_BTREE, H5E_BADITER, "B-tree iteration failed");
 
 done:
@@ -2031,7 +2039,7 @@ htri_t
 H5B_valid(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr)
 {
     H5B_t               *bt = NULL;             /* The B-tree */
-    H5RC_t	        *rc_shared;             /* Ref-counted shared info */
+    H5UC_t              *rc_shared;             /* Ref-counted shared info */
     H5B_shared_t        *shared;                /* Pointer to shared B-tree info */
     H5B_cache_ud_t      cache_udata;            /* User-data for metadata cache callback */
     htri_t		ret_value = SUCCEED;    /* Return value */
@@ -2050,7 +2058,7 @@ H5B_valid(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr)
     /* Get shared info for B-tree */
     if(NULL == (rc_shared = (type->get_shared)(f, NULL)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "can't retrieve B-tree's shared ref. count object")
-    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    shared = (H5B_shared_t *)H5UC_GET_OBJ(rc_shared);
     HDassert(shared);
 
     /*
@@ -2059,7 +2067,7 @@ H5B_valid(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr)
     cache_udata.f = f;
     cache_udata.type = type;
     cache_udata.rc_shared = rc_shared;
-    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_READ)))
+    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree node")
 
 done:
@@ -2072,7 +2080,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5B_node_dest
+ * Function:    H5B__node_dest
  *
  * Purpose:     Destroy/release a B-tree node
  *
@@ -2086,9 +2094,9 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B_node_dest(H5B_t *bt)
+H5B__node_dest(H5B_t *bt)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_PACKAGE_NOERR
 
     /* check arguments */
     HDassert(bt);
@@ -2096,9 +2104,9 @@ H5B_node_dest(H5B_t *bt)
 
     bt->child = H5FL_SEQ_FREE(haddr_t, bt->child);
     bt->native = H5FL_BLK_FREE(native_block, bt->native);
-    H5RC_DEC(bt->rc_shared);
+    H5UC_DEC(bt->rc_shared);
     bt = H5FL_FREE(H5B_t, bt);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5B_node_dest() */
+} /* end H5B__node_dest() */
 
diff --git a/src/H5B2.c b/src/H5B2.c
index 7539a24..f421bdb 100644
--- a/src/H5B2.c
+++ b/src/H5B2.c
@@ -33,7 +33,8 @@
 /* Module Setup */
 /****************/
 
-#define H5B2_PACKAGE		/*suppress error about including H5B2pkg  */
+#include "H5B2module.h"         /* This source code file is part of the H5B2 module */
+
 
 /***********/
 /* Headers */
@@ -67,6 +68,9 @@
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 /* v2 B-tree client ID to class mapping */
 
 /* Remember to add client ID to H5B2_subid_t in H5B2private.h when adding a new
@@ -82,6 +86,8 @@ extern const H5B2_class_t H5G_BT2_CORDER[1];
 extern const H5B2_class_t H5SM_INDEX[1];
 extern const H5B2_class_t H5A_BT2_NAME[1];
 extern const H5B2_class_t H5A_BT2_CORDER[1];
+extern const H5B2_class_t H5D_BT2[1];
+extern const H5B2_class_t H5D_BT2_FILT[1];
 
 const H5B2_class_t *const H5B2_client_class_g[] = {
     H5B2_TEST,			/* 0 - H5B2_TEST_ID 			*/
@@ -94,6 +100,8 @@ const H5B2_class_t *const H5B2_client_class_g[] = {
     H5SM_INDEX,			/* 7 - H5B2_SOHM_INDEX_ID 		*/
     H5A_BT2_NAME,		/* 8 - H5B2_ATTR_DENSE_NAME_ID 		*/
     H5A_BT2_CORDER,		/* 9 - H5B2_ATTR_DENSE_CORDER_ID 	*/
+    H5D_BT2,			/* 10 - H5B2_CDSET_ID                   */
+    H5D_BT2_FILT,		/* 11 - H5B2_CDSET_FILT_ID              */
 };
 
 
@@ -130,9 +138,8 @@ H5B2_create(H5F_t *f, hid_t dxpl_id, const H5B2_create_t *cparam, void *ctx_udat
 {
     H5B2_t      *bt2 = NULL;            /* Pointer to the B-tree */
     H5B2_hdr_t  *hdr = NULL;            /* Pointer to the B-tree header */
-    H5B2_hdr_cache_ud_t cache_udata;    /* User-data for callback */
     haddr_t     hdr_addr;               /* B-tree header address */
-    H5B2_t      *ret_value;             /* Return value */
+    H5B2_t      *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -146,7 +153,7 @@ H5B2_create(H5F_t *f, hid_t dxpl_id, const H5B2_create_t *cparam, void *ctx_udat
     HDcompile_assert(H5B2_NUM_BTREE_ID == NELMTS(H5B2_client_class_g));
 
     /* Create shared v2 B-tree header */
-    if(HADDR_UNDEF == (hdr_addr = H5B2_hdr_create(f, dxpl_id, cparam, ctx_udata)))
+    if(HADDR_UNDEF == (hdr_addr = H5B2__hdr_create(f, dxpl_id, cparam, ctx_udata)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, NULL, "can't create v2 B-tree header")
 
     /* Create v2 B-tree wrapper */
@@ -154,18 +161,16 @@ H5B2_create(H5F_t *f, hid_t dxpl_id, const H5B2_create_t *cparam, void *ctx_udat
         HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "memory allocation failed for v2 B-tree info")
 
     /* Look up the B-tree header */
-    cache_udata.f = f;
-    cache_udata.ctx_udata = ctx_udata;
-    if(NULL == (hdr = (H5B2_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, hdr_addr, &cache_udata, H5AC_WRITE)))
-        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, NULL, "unable to load B-tree header")
+    if(NULL == (hdr = H5B2__hdr_protect(f, dxpl_id, hdr_addr, ctx_udata, H5AC__NO_FLAGS_SET)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, NULL, "unable to protect v2 B-tree header")
 
     /* Point v2 B-tree wrapper at header and bump it's ref count */
     bt2->hdr = hdr;
-    if(H5B2_hdr_incr(bt2->hdr) < 0)
+    if(H5B2__hdr_incr(bt2->hdr) < 0)
         HGOTO_ERROR(H5E_BTREE, H5E_CANTINC, NULL, "can't increment reference count on shared v2 B-tree header")
 
     /* Increment # of files using this v2 B-tree header */
-    if(H5B2_hdr_fuse_incr(bt2->hdr) < 0)
+    if(H5B2__hdr_fuse_incr(bt2->hdr) < 0)
         HGOTO_ERROR(H5E_BTREE, H5E_CANTINC, NULL, "can't increment file reference count on shared v2 B-tree header")
 
     /* Set file pointer for this v2 B-tree open context */
@@ -175,7 +180,7 @@ H5B2_create(H5F_t *f, hid_t dxpl_id, const H5B2_create_t *cparam, void *ctx_udat
     ret_value = bt2;
 
 done:
-    if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, hdr_addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+    if(hdr && H5B2__hdr_unprotect(hdr, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, NULL, "unable to release v2 B-tree header")
     if(!ret_value && bt2)
         if(H5B2_close(bt2, dxpl_id) < 0)
@@ -204,8 +209,7 @@ H5B2_open(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *ctx_udata)
 {
     H5B2_t	*bt2 = NULL;            /* Pointer to the B-tree */
     H5B2_hdr_t	*hdr = NULL;            /* Pointer to the B-tree header */
-    H5B2_hdr_cache_ud_t cache_udata;    /* User-data for callback */
-    H5B2_t	*ret_value;             /* Return value */
+    H5B2_t	*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -214,10 +218,8 @@ H5B2_open(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *ctx_udata)
     HDassert(H5F_addr_defined(addr));
 
     /* Look up the B-tree header */
-    cache_udata.f = f;
-    cache_udata.ctx_udata = ctx_udata;
-    if(NULL == (hdr = (H5B2_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, &cache_udata, H5AC_READ)))
-	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, NULL, "unable to load B-tree header")
+    if(NULL == (hdr = H5B2__hdr_protect(f, dxpl_id, addr, ctx_udata, H5AC__READ_ONLY_FLAG)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, NULL, "unable to protect v2 B-tree header")
 
     /* Check for pending heap deletion */
     if(hdr->pending_delete)
@@ -229,11 +231,11 @@ H5B2_open(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *ctx_udata)
 
     /* Point v2 B-tree wrapper at header */
     bt2->hdr = hdr;
-    if(H5B2_hdr_incr(bt2->hdr) < 0)
+    if(H5B2__hdr_incr(bt2->hdr) < 0)
         HGOTO_ERROR(H5E_BTREE, H5E_CANTINC, NULL, "can't increment reference count on shared v2 B-tree header")
 
     /* Increment # of files using this v2 B-tree header */
-    if(H5B2_hdr_fuse_incr(bt2->hdr) < 0)
+    if(H5B2__hdr_fuse_incr(bt2->hdr) < 0)
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTINC, NULL, "can't increment file reference count on shared v2 B-tree header")
 
     /* Set file pointer for this v2 B-tree open context */
@@ -243,7 +245,7 @@ H5B2_open(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *ctx_udata)
     ret_value = bt2;
 
 done:
-    if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+    if(hdr && H5B2__hdr_unprotect(hdr, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, NULL, "unable to release v2 B-tree header")
     if(!ret_value && bt2)
         if(H5B2_close(bt2, dxpl_id) < 0)
@@ -287,28 +289,28 @@ H5B2_insert(H5B2_t *bt2, hid_t dxpl_id, void *udata)
     /* Check if the root node is allocated yet */
     if(!H5F_addr_defined(hdr->root.addr)) {
         /* Create root node as leaf node in B-tree */
-        if(H5B2_create_leaf(hdr, dxpl_id, &(hdr->root)) < 0)
+        if(H5B2__create_leaf(hdr, dxpl_id, hdr, &(hdr->root)) < 0)
 	    HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "unable to create root node")
     } /* end if */
     /* Check if we need to split the root node (equiv. to a 1->2 node split) */
     else if(hdr->root.node_nrec == hdr->node_info[hdr->depth].split_nrec) {
         /* Split root node */
-        if(H5B2_split_root(hdr, dxpl_id) < 0)
+        if(H5B2__split_root(hdr, dxpl_id) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to split root node")
     } /* end if */
 
     /* Attempt to insert record into B-tree */
     if(hdr->depth > 0) {
-        if(H5B2_insert_internal(hdr, dxpl_id, hdr->depth, NULL, &hdr->root, H5B2_POS_ROOT, udata) < 0)
+        if(H5B2__insert_internal(hdr, dxpl_id, hdr->depth, NULL, &hdr->root, H5B2_POS_ROOT, hdr, udata) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, FAIL, "unable to insert record into B-tree internal node")
     } /* end if */
     else {
-        if(H5B2_insert_leaf(hdr, dxpl_id, &hdr->root, H5B2_POS_ROOT, udata) < 0)
+        if(H5B2__insert_leaf(hdr, dxpl_id, &hdr->root, H5B2_POS_ROOT, hdr, udata) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, FAIL, "unable to insert record into B-tree leaf node")
     } /* end else */
 
     /* Mark B-tree header as dirty */
-    if(H5B2_hdr_dirty(hdr) < 0)
+    if(H5B2__hdr_dirty(hdr) < 0)
         HGOTO_ERROR(H5E_BTREE, H5E_CANTMARKDIRTY, FAIL, "unable to mark B-tree header dirty")
 
 done:
@@ -385,7 +387,7 @@ H5B2_iterate(H5B2_t *bt2, hid_t dxpl_id, H5B2_operator_t op, void *op_data)
     /* Iterate through records */
     if(hdr->root.node_nrec > 0) {
         /* Iterate through nodes */
-        if((ret_value = H5B2_iterate_node(hdr, dxpl_id, hdr->depth, &hdr->root, op, op_data)) < 0)
+        if((ret_value = H5B2__iterate_node(hdr, dxpl_id, hdr->depth, &hdr->root, hdr, op, op_data)) < 0)
             HERROR(H5E_BTREE, H5E_CANTLIST, "node iteration failed");
     } /* end if */
 
@@ -422,7 +424,8 @@ H5B2_find(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_found_t op,
 {
     H5B2_hdr_t  *hdr;                   /* Pointer to the B-tree header */
     H5B2_node_ptr_t curr_node_ptr;      /* Node pointer info for current node */
-    unsigned    depth;                  /* Current depth of the tree */
+    void        *parent = NULL;         /* Parent of current node */
+    uint16_t    depth;                  /* Current depth of the tree */
     int         cmp;                    /* Comparison value of records */
     unsigned    idx;                    /* Location of record which matches key */
     H5B2_nodepos_t curr_pos;            /* Position of the current node */
@@ -471,6 +474,10 @@ H5B2_find(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_found_t op,
     /* Current depth of the tree */
     depth = hdr->depth;
 
+    /* Set initial parent, if doing swmr writes */
+    if(hdr->swmr_write)
+        parent = hdr;
+
     /* Walk down B-tree to find record or leaf node where record is located */
     cmp = -1;
     curr_pos = H5B2_POS_ROOT;
@@ -479,11 +486,18 @@ H5B2_find(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_found_t op,
         H5B2_node_ptr_t next_node_ptr;      /* Node pointer info for next node */
 
         /* Lock B-tree current node */
-        if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, curr_node_ptr.addr, curr_node_ptr.node_nrec, depth, H5AC_READ)))
+        if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, curr_node_ptr.addr, parent, curr_node_ptr.node_nrec, depth, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node")
 
+        /* Unpin parent if necessary */
+        if(parent) {
+            if(parent != hdr && H5AC_unpin_entry(parent) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPIN, FAIL, "unable to unpin parent entry")
+            parent = NULL;
+        } /* end if */
+
         /* Locate node pointer for child */
-        cmp = H5B2_locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx);
+        cmp = H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx);
         if(cmp > 0)
             idx++;
 
@@ -510,9 +524,13 @@ H5B2_find(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_found_t op,
             } /* end if */
 
             /* Unlock current node */
-            if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET) < 0)
+            if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, (unsigned)(hdr->swmr_write ? H5AC__PIN_ENTRY_FLAG : H5AC__NO_FLAGS_SET)) < 0)
                 HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
 
+            /* Keep track of parent if necessary */
+            if(hdr->swmr_write)
+                parent = internal;
+
             /* Set pointer to next node to load */
             curr_node_ptr = next_node_ptr;
         } /* end if */
@@ -542,11 +560,18 @@ H5B2_find(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_found_t op,
         H5B2_leaf_t *leaf;          /* Pointer to leaf node in B-tree */
 
         /* Lock B-tree leaf node */
-        if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, curr_node_ptr.addr, curr_node_ptr.node_nrec, H5AC_READ)))
+        if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, curr_node_ptr.addr, parent, curr_node_ptr.node_nrec, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
+        /* Unpin parent if necessary */
+        if(parent) {
+            if(parent != hdr && H5AC_unpin_entry(parent) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPIN, FAIL, "unable to unpin parent entry")
+            parent = NULL;
+        } /* end if */
+
         /* Locate record */
-        cmp = H5B2_locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx);
+        cmp = H5B2__locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx);
 
         if(cmp != 0) {
             /* Unlock leaf node */
@@ -594,6 +619,12 @@ H5B2_find(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_found_t op,
     } /* end block */
 
 done:
+    if(parent) {
+        HDassert(ret_value < 0);
+        if(parent != hdr && H5AC_unpin_entry(parent) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPIN, FAIL, "unable to unpin parent entry")
+    } /* end if */
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5B2_find() */
 
@@ -622,7 +653,8 @@ H5B2_index(H5B2_t *bt2, hid_t dxpl_id, H5_iter_order_t order, hsize_t idx,
 {
     H5B2_hdr_t	*hdr;                   /* Pointer to the B-tree header */
     H5B2_node_ptr_t curr_node_ptr;      /* Node pointer info for current node */
-    unsigned    depth;                  /* Current depth of the tree */
+    void        *parent = NULL;         /* Parent of current node */
+    uint16_t    depth;                  /* Current depth of the tree */
     herr_t	ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
@@ -651,6 +683,10 @@ H5B2_index(H5B2_t *bt2, hid_t dxpl_id, H5_iter_order_t order, hsize_t idx,
     /* Current depth of the tree */
     depth = hdr->depth;
 
+    /* Set initial parent, if doing swmr writes */
+    if(hdr->swmr_write)
+        parent = hdr;
+
     /* Check for reverse indexing and map requested index to appropriate forward index */
     if(order == H5_ITER_DEC)
         idx = curr_node_ptr.all_nrec - (idx + 1);
@@ -662,9 +698,16 @@ H5B2_index(H5B2_t *bt2, hid_t dxpl_id, H5_iter_order_t order, hsize_t idx,
         unsigned u;                         /* Local index variable */
 
         /* Lock B-tree current node */
-        if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, curr_node_ptr.addr, curr_node_ptr.node_nrec, depth, H5AC_READ)))
+        if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, curr_node_ptr.addr, parent, curr_node_ptr.node_nrec, depth, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node")
 
+        /* Unpin parent if necessary */
+        if(parent) {
+            if(parent != hdr && H5AC_unpin_entry(parent) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPIN, FAIL, "unable to unpin parent entry")
+            parent = NULL;
+        } /* end if */
+
         /* Search for record with correct index */
         for(u = 0; u < internal->nrec; u++) {
             /* Check if record is in child node */
@@ -673,9 +716,13 @@ H5B2_index(H5B2_t *bt2, hid_t dxpl_id, H5_iter_order_t order, hsize_t idx,
                 next_node_ptr = internal->node_ptrs[u];
 
                 /* Unlock current node */
-                if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET) < 0)
+                if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, (unsigned)(hdr->swmr_write ? H5AC__PIN_ENTRY_FLAG : H5AC__NO_FLAGS_SET)) < 0)
                     HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
 
+                /* Keep track of parent if necessary */
+                if(hdr->swmr_write)
+                    parent = internal;
+
                 /* Set pointer to next node to load */
                 curr_node_ptr = next_node_ptr;
 
@@ -715,15 +762,19 @@ H5B2_index(H5B2_t *bt2, hid_t dxpl_id, H5_iter_order_t order, hsize_t idx,
                 next_node_ptr = internal->node_ptrs[u];
 
                 /* Unlock current node */
-                if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET) < 0)
+                if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, (unsigned)(hdr->swmr_write ? H5AC__PIN_ENTRY_FLAG : H5AC__NO_FLAGS_SET)) < 0)
                     HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
 
+                /* Keep track of parent if necessary */
+                if(hdr->swmr_write)
+                    parent = internal;
+
                 /* Set pointer to next node to load */
                 curr_node_ptr = next_node_ptr;
             } /* end if */
             else
                 /* Index that is greater than the number of records in the tree? */
-                HDassert("Index off end of tree??" && 0);
+                HDassert(0 && "Index off end of tree??");
         } /* end if */
 
         /* Decrement depth we're at in B-tree */
@@ -734,9 +785,16 @@ H5B2_index(H5B2_t *bt2, hid_t dxpl_id, H5_iter_order_t order, hsize_t idx,
         H5B2_leaf_t *leaf;          /* Pointer to leaf node in B-tree */
 
         /* Lock B-tree leaf node */
-        if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, curr_node_ptr.addr, curr_node_ptr.node_nrec, H5AC_READ)))
+        if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, curr_node_ptr.addr, parent, curr_node_ptr.node_nrec, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
+        /* Unpin parent if necessary */
+        if(parent) {
+            if(parent != hdr && H5AC_unpin_entry(parent) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPIN, FAIL, "unable to unpin parent entry")
+            parent = NULL;
+        } /* end if */
+
         /* Sanity check index */
         HDassert(idx < leaf->nrec);
 
@@ -755,6 +813,12 @@ H5B2_index(H5B2_t *bt2, hid_t dxpl_id, H5_iter_order_t order, hsize_t idx,
     } /* end block */
 
 done:
+    if(parent) {
+        HDassert(ret_value < 0);
+        if(parent != hdr && H5AC_unpin_entry(parent) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPIN, FAIL, "unable to unpin parent entry")
+    } /* end if */
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5B2_index() */
 
@@ -798,8 +862,9 @@ H5B2_remove(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_remove_t op,
     if(hdr->depth > 0) {
         hbool_t depth_decreased = FALSE;  /* Flag to indicate whether the depth of the B-tree decreased */
 
-        if(H5B2_remove_internal(hdr, dxpl_id, &depth_decreased, NULL, hdr->depth,
-                &(hdr->cache_info), NULL, H5B2_POS_ROOT, &hdr->root, udata, op, op_data) < 0)
+        if(H5B2__remove_internal(hdr, dxpl_id, &depth_decreased, NULL, NULL,
+                hdr->depth, &(hdr->cache_info), NULL, H5B2_POS_ROOT, &hdr->root,
+                udata, op, op_data) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record from B-tree internal node")
 
         /* Check for decreasing the depth of the B-tree */
@@ -817,7 +882,7 @@ H5B2_remove(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_remove_t op,
         } /* end for */
     } /* end if */
     else {
-        if(H5B2_remove_leaf(hdr, dxpl_id, &hdr->root, H5B2_POS_ROOT, udata, op, op_data) < 0)
+        if(H5B2__remove_leaf(hdr, dxpl_id, &hdr->root, H5B2_POS_ROOT, hdr, udata, op, op_data) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record from B-tree leaf node")
     } /* end else */
 
@@ -825,7 +890,7 @@ H5B2_remove(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_remove_t op,
     hdr->root.all_nrec--;
 
     /* Mark B-tree header as dirty */
-    if(H5B2_hdr_dirty(hdr) < 0)
+    if(H5B2__hdr_dirty(hdr) < 0)
         HGOTO_ERROR(H5E_BTREE, H5E_CANTMARKDIRTY, FAIL, "unable to mark B-tree header dirty")
 
 done:
@@ -880,8 +945,9 @@ H5B2_remove_by_idx(H5B2_t *bt2, hid_t dxpl_id, H5_iter_order_t order,
     if(hdr->depth > 0) {
         hbool_t depth_decreased = FALSE;  /* Flag to indicate whether the depth of the B-tree decreased */
 
-        if(H5B2_remove_internal_by_idx(hdr, dxpl_id, &depth_decreased, NULL, hdr->depth,
-                &(hdr->cache_info), NULL, &hdr->root, H5B2_POS_ROOT, idx, op, op_data) < 0)
+        if(H5B2__remove_internal_by_idx(hdr, dxpl_id, &depth_decreased, NULL,
+                NULL, hdr->depth, &(hdr->cache_info), NULL, &hdr->root,
+                H5B2_POS_ROOT, idx, op, op_data) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record from B-tree internal node")
 
         /* Check for decreasing the depth of the B-tree */
@@ -899,7 +965,7 @@ H5B2_remove_by_idx(H5B2_t *bt2, hid_t dxpl_id, H5_iter_order_t order,
         } /* end for */
     } /* end if */
     else {
-        if(H5B2_remove_leaf_by_idx(hdr, dxpl_id, &hdr->root, H5B2_POS_ROOT, (unsigned)idx, op, op_data) < 0)
+        if(H5B2__remove_leaf_by_idx(hdr, dxpl_id, &hdr->root, H5B2_POS_ROOT, hdr, (unsigned)idx, op, op_data) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record from B-tree leaf node")
     } /* end else */
 
@@ -907,7 +973,7 @@ H5B2_remove_by_idx(H5B2_t *bt2, hid_t dxpl_id, H5_iter_order_t order,
     hdr->root.all_nrec--;
 
     /* Mark B-tree header as dirty */
-    if(H5B2_hdr_dirty(hdr) < 0)
+    if(H5B2__hdr_dirty(hdr) < 0)
         HGOTO_ERROR(H5E_BTREE, H5E_CANTMARKDIRTY, FAIL, "unable to mark B-tree header dirty")
 
 done:
@@ -994,11 +1060,11 @@ H5B2_neighbor(H5B2_t *bt2, hid_t dxpl_id, H5B2_compare_t range, void *udata,
 
     /* Attempt to find neighbor record in B-tree */
     if(hdr->depth > 0) {
-        if(H5B2_neighbor_internal(hdr, dxpl_id, hdr->depth, &hdr->root, NULL, range, udata, op, op_data) < 0)
+        if(H5B2__neighbor_internal(hdr, dxpl_id, hdr->depth, &hdr->root, NULL, range, hdr, udata, op, op_data) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "unable to find neighbor record in B-tree internal node")
     } /* end if */
     else {
-        if(H5B2_neighbor_leaf(hdr, dxpl_id, &hdr->root, NULL, range, udata, op, op_data) < 0)
+        if(H5B2__neighbor_leaf(hdr, dxpl_id, &hdr->root, NULL, range, hdr, udata, op, op_data) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "unable to find neighbor record in B-tree leaf node")
     } /* end else */
 
@@ -1033,8 +1099,9 @@ H5B2_modify(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_modify_t op,
 {
     H5B2_hdr_t	*hdr;                   /* Pointer to the B-tree header */
     H5B2_node_ptr_t curr_node_ptr;      /* Node pointer info for current node */
+    void        *parent = NULL;         /* Parent of current node */
     H5B2_nodepos_t curr_pos;            /* Position of current node */
-    unsigned    depth;                  /* Current depth of the tree */
+    uint16_t    depth;                  /* Current depth of the tree */
     int         cmp;                    /* Comparison value of records */
     unsigned    idx;                    /* Location of record which matches key */
     herr_t	ret_value = SUCCEED;    /* Return value */
@@ -1061,6 +1128,10 @@ H5B2_modify(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_modify_t op,
     /* Current depth of the tree */
     depth = hdr->depth;
 
+    /* Set initial parent, if doing swmr writes */
+    if(hdr->swmr_write)
+        parent = hdr;
+
     /* Walk down B-tree to find record or leaf node where record is located */
     cmp = -1;
     curr_pos = H5B2_POS_ROOT;
@@ -1070,11 +1141,18 @@ H5B2_modify(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_modify_t op,
         H5B2_node_ptr_t next_node_ptr;      /* Node pointer info for next node */
 
         /* Lock B-tree current node */
-        if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, curr_node_ptr.addr, curr_node_ptr.node_nrec, depth, H5AC_WRITE)))
+        if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, curr_node_ptr.addr, parent, curr_node_ptr.node_nrec, depth, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node")
 
+        /* Unpin parent if necessary */
+        if(parent) {
+            if(parent != hdr && H5AC_unpin_entry(parent) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPIN, FAIL, "unable to unpin parent entry")
+            parent = NULL;
+        } /* end if */
+
         /* Locate node pointer for child */
-        cmp = H5B2_locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx);
+        cmp = H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx);
         if(cmp > 0)
             idx++;
 
@@ -1101,9 +1179,13 @@ H5B2_modify(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_modify_t op,
             } /* end if */
 
             /* Unlock current node */
-            if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET) < 0)
+            if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, (unsigned)(hdr->swmr_write ? H5AC__PIN_ENTRY_FLAG : H5AC__NO_FLAGS_SET)) < 0)
                 HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
 
+            /* Keep track of parent if necessary */
+            if(hdr->swmr_write)
+                parent = internal;
+
             /* Set pointer to next node to load */
             curr_node_ptr = next_node_ptr;
         } /* end if */
@@ -1142,11 +1224,18 @@ H5B2_modify(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_modify_t op,
         hbool_t changed = FALSE;/* Whether the 'modify' callback changed the record */
 
         /* Lock B-tree leaf node */
-        if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, curr_node_ptr.addr, curr_node_ptr.node_nrec, H5AC_WRITE)))
+        if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, curr_node_ptr.addr, parent, curr_node_ptr.node_nrec, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
+        /* Unpin parent if necessary */
+        if(parent) {
+            if(parent != hdr && H5AC_unpin_entry(parent) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPIN, FAIL, "unable to unpin parent entry")
+            parent = NULL;
+        } /* end if */
+
         /* Locate record */
-        cmp = H5B2_locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx);
+        cmp = H5B2__locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx);
 
         if(cmp != 0) {
             /* Unlock leaf node */
@@ -1204,9 +1293,15 @@ H5B2_modify(H5B2_t *bt2, hid_t dxpl_id, void *udata, H5B2_modify_t op,
         /* Unlock current node */
         if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, leaf, leaf_flags) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
-    }
+    } /* end block */
 
 done:
+    if(parent) {
+        HDassert(ret_value < 0);
+        if(parent != hdr && H5AC_unpin_entry(parent) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPIN, FAIL, "unable to unpin parent entry")
+    } /* end if */
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5B2_modify() */
 
@@ -1238,7 +1333,7 @@ H5B2_close(H5B2_t *bt2, hid_t dxpl_id)
     HDassert(bt2->f);
 
     /* Decrement file reference & check if this is the last open v2 B-tree using the shared B-tree header */
-    if(0 == H5B2_hdr_fuse_decr(bt2->hdr)) {
+    if(0 == H5B2__hdr_fuse_decr(bt2->hdr)) {
         /* Set the shared v2 B-tree header's file context for this operation */
         bt2->hdr->f = bt2->f;
 
@@ -1276,29 +1371,29 @@ H5B2_close(H5B2_t *bt2, hid_t dxpl_id)
 
         /* Lock the v2 B-tree header into memory */
         /* (OK to pass in NULL for callback context, since we know the header must be in the cache) */
-        if(NULL == (hdr = (H5B2_hdr_t *)H5AC_protect(bt2->f, dxpl_id, H5AC_BT2_HDR, bt2_addr, NULL, H5AC_WRITE)))
+        if(NULL == (hdr = H5B2__hdr_protect(bt2->f, dxpl_id, bt2_addr, NULL, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect v2 B-tree header")
 
         /* Set the shared v2 B-tree header's file context for this operation */
         hdr->f = bt2->f;
 
         /* Decrement the reference count on the B-tree header */
-        /* (don't put in H5B2_hdr_fuse_decr() as the B-tree header may be evicted
+        /* (don't put in H5B2__hdr_fuse_decr() as the B-tree header may be evicted
          *  immediately -QAK)
          */
-        if(H5B2_hdr_decr(bt2->hdr) < 0)
+        if(H5B2__hdr_decr(bt2->hdr) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTDEC, FAIL, "can't decrement reference count on shared v2 B-tree header")
 
         /* Delete v2 B-tree, starting with header (unprotects header) */
-        if(H5B2_hdr_delete(hdr, dxpl_id) < 0)
+        if(H5B2__hdr_delete(hdr, dxpl_id) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to delete v2 B-tree")
     } /* end if */
     else {
         /* Decrement the reference count on the B-tree header */
-        /* (don't put in H5B2_hdr_fuse_decr() as the B-tree header may be evicted
+        /* (don't put in H5B2__hdr_fuse_decr() as the B-tree header may be evicted
          *  immediately -QAK)
          */
-        if(H5B2_hdr_decr(bt2->hdr) < 0)
+        if(H5B2__hdr_decr(bt2->hdr) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTDEC, FAIL, "can't decrement reference count on shared v2 B-tree header")
 
     } /* end else */
@@ -1338,7 +1433,6 @@ H5B2_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *ctx_udata,
     H5B2_remove_t op, void *op_data)
 {
     H5B2_hdr_t	*hdr = NULL;            /* Pointer to the B-tree header */
-    H5B2_hdr_cache_ud_t cache_udata;    /* User-data for callback */
     herr_t	ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
@@ -1351,9 +1445,7 @@ H5B2_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *ctx_udata,
 #ifdef QAK
 HDfprintf(stderr, "%s: addr = %a\n", FUNC, addr);
 #endif /* QAK */
-    cache_udata.f = f;
-    cache_udata.ctx_udata = ctx_udata;
-    if(NULL == (hdr = (H5B2_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, &cache_udata, H5AC_WRITE)))
+    if(NULL == (hdr = H5B2__hdr_protect(f, dxpl_id, addr, ctx_udata, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect v2 B-tree header")
 
     /* Remember the callback & context for later */
@@ -1368,16 +1460,80 @@ HDfprintf(stderr, "%s: addr = %a\n", FUNC, addr);
         hdr->f = f;
 
         /* Delete v2 B-tree now, starting with header (unprotects header) */
-        if(H5B2_hdr_delete(hdr, dxpl_id) < 0)
+        if(H5B2__hdr_delete(hdr, dxpl_id) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to delete v2 B-tree")
         hdr = NULL;
     } /* end if */
 
 done:
     /* Unprotect the header, if an error occurred */
-    if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+    if(hdr && H5B2__hdr_unprotect(hdr, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release v2 B-tree header")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5B2_delete() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5B2_depend
+ *
+ * Purpose:     Make a child flush dependency between the v2 B-tree's
+ *              header and another piece of metadata in the file.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2_depend(H5AC_info_t *parent_entry, H5B2_t *bt2)
+{
+    /* Local variables */
+    H5B2_hdr_t  *hdr = bt2->hdr;        /* Header for B-tree */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(SUCCEED)
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     *
+     * At present, this function is only used to setup a flush dependency
+     * between an object header proxy and the v2 B-tree header when
+     * the B-tree is being used to index a chunked data set.
+     *
+     * Make sure that the parameters are congruent with this.
+     */
+    HDassert(bt2);
+    HDassert(hdr);
+    HDassert(parent_entry);
+    HDassert(parent_entry->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(parent_entry->type);
+    HDassert(parent_entry->type->id == H5AC_OHDR_PROXY_ID);
+    HDassert(hdr->parent == NULL || hdr->parent == parent_entry);
+
+    /*
+     * Check to see if the flush dependency between the object header proxy
+     * and the v2 B-tree header has already been setup.  If it hasn't, then
+     * set it up.
+     */
+    if(NULL == hdr->parent) {
+        /* Set the shared v2 B-tree header's file context for this operation */
+        bt2->hdr->f = bt2->f;
+
+        /* Set up flush dependency between parent entry and B-tree header */
+        if(H5B2__create_flush_depend(parent_entry, (H5AC_info_t *)hdr) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency on file metadata")
+
+	hdr->parent = parent_entry;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2_depend() */
+
diff --git a/src/H5B2cache.c b/src/H5B2cache.c
index d649f74..2c40761 100644
--- a/src/H5B2cache.c
+++ b/src/H5B2cache.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5B2_PACKAGE		/*suppress error about including H5B2pkg  */
+#include "H5B2module.h"         /* This source code file is part of the H5B2 module */
 
 
 /***********/
@@ -37,7 +37,6 @@
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5B2pkg.h"		/* v2 B-trees				*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
-#include "H5MFprivate.h"	/* File memory management		*/
 #include "H5WBprivate.h"        /* Wrapped Buffers                      */
 
 
@@ -50,9 +49,6 @@
 #define H5B2_INT_VERSION 0              /* Internal node */
 #define H5B2_LEAF_VERSION 0             /* Leaf node */
 
-/* Size of stack buffer for serialized headers */
-#define H5B2_HDR_BUF_SIZE               128
-
 
 /******************/
 /* Local Typedefs */
@@ -69,22 +65,44 @@
 /********************/
 
 /* Metadata cache callbacks */
-static H5B2_hdr_t *H5B2__cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static herr_t H5B2__cache_hdr_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B2_hdr_t *hdr, unsigned H5_ATTR_UNUSED * flags_ptr);
-static herr_t H5B2__cache_hdr_dest(H5F_t *f, H5B2_hdr_t *hdr);
-static herr_t H5B2__cache_hdr_clear(H5F_t *f, H5B2_hdr_t *hdr, hbool_t destroy);
-static herr_t H5B2__cache_hdr_size(const H5F_t *f, const H5B2_hdr_t *hdr, size_t *size_ptr);
-static H5B2_internal_t *H5B2__cache_internal_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static herr_t H5B2__cache_internal_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B2_internal_t *i, unsigned H5_ATTR_UNUSED * flags_ptr);
-static herr_t H5B2__cache_internal_dest(H5F_t *f, H5B2_internal_t *internal);
-static herr_t H5B2__cache_internal_clear(H5F_t *f, H5B2_internal_t *i, hbool_t destroy);
-static herr_t H5B2__cache_internal_size(const H5F_t *f, const H5B2_internal_t *i, size_t *size_ptr);
-static H5B2_leaf_t *H5B2__cache_leaf_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static herr_t H5B2__cache_leaf_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B2_leaf_t *l, unsigned H5_ATTR_UNUSED * flags_ptr);
-static herr_t H5B2__cache_leaf_dest(H5F_t *f, H5B2_leaf_t *leaf);
-static herr_t H5B2__cache_leaf_clear(H5F_t *f, H5B2_leaf_t *l, hbool_t destroy);
-static herr_t H5B2__cache_leaf_size(const H5F_t *f, const H5B2_leaf_t *l, size_t *size_ptr);
-
+static herr_t H5B2__cache_hdr_get_load_size(const void *image_ptr, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5B2__cache_hdr_verify_chksum(const void *image_ptr, size_t len, void *udata);
+static void *H5B2__cache_hdr_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty);
+static herr_t H5B2__cache_hdr_image_len(const void *thing, size_t *image_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static herr_t H5B2__cache_hdr_serialize(const H5F_t *f, void *image, size_t len,
+    void *thing);
+static herr_t H5B2__cache_hdr_notify(H5AC_notify_action_t action, void *thing);
+static herr_t H5B2__cache_hdr_free_icr(void *thing);
+
+static herr_t H5B2__cache_int_get_load_size(const void *image_ptr, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5B2__cache_int_verify_chksum(const void *image_ptr, size_t len, void *udata);
+static void *H5B2__cache_int_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty);
+static herr_t H5B2__cache_int_image_len(const void *thing, size_t *image_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static herr_t H5B2__cache_int_serialize(const H5F_t *f, void *image, size_t len,
+    void *thing);
+static herr_t H5B2__cache_int_notify(H5AC_notify_action_t action, void *thing);
+static herr_t H5B2__cache_int_free_icr(void *thing);
+
+static herr_t H5B2__cache_leaf_get_load_size(const void * mage_ptr, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5B2__cache_leaf_verify_chksum(const void *image_ptr, size_t len, void *udata);
+static void *H5B2__cache_leaf_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty);
+static herr_t H5B2__cache_leaf_image_len(const void *thing, size_t *image_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static herr_t H5B2__cache_leaf_serialize(const H5F_t *f, void *image, size_t len,
+    void *thing);
+static herr_t H5B2__cache_leaf_notify(H5AC_notify_action_t action, void *thing);
+static herr_t H5B2__cache_leaf_free_icr(void *thing);
 
 /*********************/
 /* Package Variables */
@@ -92,32 +110,56 @@ static herr_t H5B2__cache_leaf_size(const H5F_t *f, const H5B2_leaf_t *l, size_t
 
 /* H5B2 inherits cache-like properties from H5AC */
 const H5AC_class_t H5AC_BT2_HDR[1] = {{
-    H5AC_BT2_HDR_ID,
-    (H5AC_load_func_t)H5B2__cache_hdr_load,
-    (H5AC_flush_func_t)H5B2__cache_hdr_flush,
-    (H5AC_dest_func_t)H5B2__cache_hdr_dest,
-    (H5AC_clear_func_t)H5B2__cache_hdr_clear,
-    (H5AC_size_func_t)H5B2__cache_hdr_size,
+    H5AC_BT2_HDR_ID,                    /* Metadata client ID */
+    "v2 B-tree header",                 /* Metadata client name (for debugging) */
+    H5FD_MEM_BTREE,                     /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5B2__cache_hdr_get_load_size,      /* 'get_load_size' callback */
+    H5B2__cache_hdr_verify_chksum,
+    H5B2__cache_hdr_deserialize,        /* 'deserialize' callback */
+    H5B2__cache_hdr_image_len,          /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5B2__cache_hdr_serialize,          /* 'serialize' callback */
+    H5B2__cache_hdr_notify, 		/* 'notify' callback */
+    H5B2__cache_hdr_free_icr,           /* 'free_icr' callback */
+    NULL,				/* 'clear' callback */
+    NULL,				/* 'fsf_size' callback */
 }};
 
 /* H5B2 inherits cache-like properties from H5AC */
 const H5AC_class_t H5AC_BT2_INT[1] = {{
-    H5AC_BT2_INT_ID,
-    (H5AC_load_func_t)H5B2__cache_internal_load,
-    (H5AC_flush_func_t)H5B2__cache_internal_flush,
-    (H5AC_dest_func_t)H5B2__cache_internal_dest,
-    (H5AC_clear_func_t)H5B2__cache_internal_clear,
-    (H5AC_size_func_t)H5B2__cache_internal_size,
+    H5AC_BT2_INT_ID,                    /* Metadata client ID */
+    "v2 B-tree internal node",          /* Metadata client name (for debugging) */
+    H5FD_MEM_BTREE,                     /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5B2__cache_int_get_load_size,      /* 'get_load_size' callback */
+    H5B2__cache_int_verify_chksum,	/* 'verify_chksum' callback */
+    H5B2__cache_int_deserialize,        /* 'deserialize' callback */
+    H5B2__cache_int_image_len,          /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5B2__cache_int_serialize,          /* 'serialize' callback */
+    H5B2__cache_int_notify,		/* 'notify' callback */
+    H5B2__cache_int_free_icr,           /* 'free_icr' callback */
+    NULL,				/* 'clear' callback */
+    NULL,				/* 'fsf_size' callback */
 }};
 
 /* H5B2 inherits cache-like properties from H5AC */
 const H5AC_class_t H5AC_BT2_LEAF[1] = {{
-    H5AC_BT2_LEAF_ID,
-    (H5AC_load_func_t)H5B2__cache_leaf_load,
-    (H5AC_flush_func_t)H5B2__cache_leaf_flush,
-    (H5AC_dest_func_t)H5B2__cache_leaf_dest,
-    (H5AC_clear_func_t)H5B2__cache_leaf_clear,
-    (H5AC_size_func_t)H5B2__cache_leaf_size,
+    H5AC_BT2_LEAF_ID,                   /* Metadata client ID */
+    "v2 B-tree leaf node",              /* Metadata client name (for debugging) */
+    H5FD_MEM_BTREE,                     /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5B2__cache_leaf_get_load_size,     /* 'get_load_size' callback */
+    H5B2__cache_leaf_verify_chksum,	/* 'verify_chksum' callback */
+    H5B2__cache_leaf_deserialize,       /* 'deserialize' callback */
+    H5B2__cache_leaf_image_len,         /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5B2__cache_leaf_serialize,         /* 'serialize' callback */
+    H5B2__cache_leaf_notify,		/* 'notify' callback */
+    H5B2__cache_leaf_free_icr,          /* 'free_icr' callback */
+    NULL,				/* 'clear' callback */
+    NULL,				/* 'fsf_size' callback */
 }};
 
 
@@ -133,7 +175,82 @@ const H5AC_class_t H5AC_BT2_LEAF[1] = {{
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2__cache_hdr_load
+ * Function:    H5B2__cache_hdr_get_load_size
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              May 18, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2__cache_hdr_get_load_size(const void *_image, void *_udata, size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
+{
+    const uint8_t *image = (const uint8_t *)_image;       		    /* Pointer into raw data buffer */
+    H5B2_hdr_cache_ud_t *udata = (H5B2_hdr_cache_ud_t *)_udata; /* User data for callback */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(udata);
+    HDassert(udata->f);
+    HDassert(image_len);
+
+    if(image == NULL) {
+	/* Set the image length size */
+	*image_len = H5B2_HEADER_SIZE_FILE(udata->f);
+    } else {
+	HDassert(actual_len);
+	HDassert(*actual_len == *actual_len);
+    }
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5B2__cache_hdr_get_load_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_hdr_verify_chksum
+ *
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
+ *
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
+ *
+ * Programmer:	Vailin Choi; Aug 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5B2__cache_hdr_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSED *_udata)
+{
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+    htri_t ret_value = TRUE;	/* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(image);
+
+    /* Get stored and computed checksums */
+    H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
+
+    if(stored_chksum != computed_chksum)
+	ret_value = FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__cache_hdr_verify_chksum() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_hdr_deserialize
  *
  * Purpose:	Loads a B-tree header from the disk.
  *
@@ -146,8 +263,9 @@ const H5AC_class_t H5AC_BT2_LEAF[1] = {{
  *
  *-------------------------------------------------------------------------
  */
-static H5B2_hdr_t *
-H5B2__cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+static void *
+H5B2__cache_hdr_deserialize(const void *_image, size_t H5_ATTR_UNUSED len,
+    void *_udata, hbool_t H5_ATTR_UNUSED *dirty)
 {
     H5B2_hdr_t		*hdr = NULL;    /* B-tree header */
     H5B2_hdr_cache_ud_t *udata = (H5B2_hdr_cache_ud_t *)_udata;
@@ -155,109 +273,116 @@ H5B2__cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
     H5B2_subid_t        id;		/* ID of B-tree class, as found in file */
     uint16_t            depth;          /* Depth of B-tree */
     uint32_t            stored_chksum;  /* Stored metadata checksum value */
-    uint32_t            computed_chksum; /* Computed metadata checksum value */
-    H5WB_t              *wb = NULL;     /* Wrapped buffer for header data */
-    uint8_t             hdr_buf[H5B2_HDR_BUF_SIZE]; /* Buffer for header */
-    uint8_t		*buf;           /* Pointer to header buffer */
-    const uint8_t	*p;             /* Pointer into raw data buffer */
-    H5B2_hdr_t		*ret_value;     /* Return value */
+    const uint8_t	*image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    H5B2_hdr_t		*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_STATIC
 
     /* Check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    HDassert(image);
     HDassert(udata);
 
     /* Allocate new B-tree header and reset cache info */
-    if(NULL == (hdr = H5B2_hdr_alloc(udata->f)))
+    if(NULL == (hdr = H5B2__hdr_alloc(udata->f)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "allocation failed for B-tree header")
 
-    /* Wrap the local buffer for serialized header info */
-    if(NULL == (wb = H5WB_wrap(hdr_buf, sizeof(hdr_buf))))
-        HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, NULL, "can't wrap buffer")
-
-    /* Get a pointer to a buffer that's large enough for header */
-    if(NULL == (buf = (uint8_t *)H5WB_actual(wb, hdr->hdr_size)))
-        HGOTO_ERROR(H5E_BTREE, H5E_NOSPACE, NULL, "can't get actual buffer")
-
-    /* Read header from disk */
-    if(H5F_block_read(f, H5FD_MEM_BTREE, addr, hdr->hdr_size, dxpl_id, buf) < 0)
-        HGOTO_ERROR(H5E_BTREE, H5E_READERROR, NULL, "can't read B-tree header")
-
-    /* Get temporary pointer to serialized header */
-    p = buf;
-
     /* Magic number */
-    if(HDmemcmp(p, H5B2_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+    if(HDmemcmp(image, H5B2_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC))
 	HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, NULL, "wrong B-tree header signature")
-    p += H5_SIZEOF_MAGIC;
+    image += H5_SIZEOF_MAGIC;
 
     /* Version */
-    if(*p++ != H5B2_HDR_VERSION)
+    if(*image++ != H5B2_HDR_VERSION)
 	HGOTO_ERROR(H5E_BTREE, H5E_BADRANGE, NULL, "wrong B-tree header version")
 
     /* B-tree class */
-    id = (H5B2_subid_t)*p++;
+    id = (H5B2_subid_t)*image++;
     if(id >= H5B2_NUM_BTREE_ID)
         HGOTO_ERROR(H5E_BTREE, H5E_BADTYPE, NULL, "incorrect B-tree type")
 
     /* Node size (in bytes) */
-    UINT32DECODE(p, cparam.node_size);
+    UINT32DECODE(image, cparam.node_size);
 
     /* Raw key size (in bytes) */
-    UINT16DECODE(p, cparam.rrec_size);
+    UINT16DECODE(image, cparam.rrec_size);
 
     /* Depth of tree */
-    UINT16DECODE(p, depth);
+    UINT16DECODE(image, depth);
 
     /* Split & merge %s */
-    cparam.split_percent = *p++;
-    cparam.merge_percent = *p++;
+    cparam.split_percent = *image++;
+    cparam.merge_percent = *image++;
 
     /* Root node pointer */
-    H5F_addr_decode(udata->f, (const uint8_t **)&p, &(hdr->root.addr));
-    UINT16DECODE(p, hdr->root.node_nrec);
-    H5F_DECODE_LENGTH(udata->f, p, hdr->root.all_nrec);
+    H5F_addr_decode(udata->f, (const uint8_t **)&image, &(hdr->root.addr));
+    UINT16DECODE(image, hdr->root.node_nrec);
+    H5F_DECODE_LENGTH(udata->f, image, hdr->root.all_nrec);
+
+    /* checksum verification already done in verify_chksum cb */
 
     /* Metadata checksum */
-    UINT32DECODE(p, stored_chksum);
+    UINT32DECODE(image, stored_chksum);
 
     /* Sanity check */
-    HDassert((size_t)(p - (const uint8_t *)buf) == hdr->hdr_size);
-
-    /* Compute checksum on entire header */
-    computed_chksum = H5_checksum_metadata(buf, (hdr->hdr_size - H5B2_SIZEOF_CHKSUM), 0);
-
-    /* Verify checksum */
-    if(stored_chksum != computed_chksum)
-        HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, NULL, "incorrect metadata checksum for v2 B-tree header")
+    HDassert((size_t)(image - (const uint8_t *)_image) == hdr->hdr_size);
 
     /* Initialize B-tree header info */
     cparam.cls = H5B2_client_class_g[id];
-    if(H5B2_hdr_init(hdr, &cparam, udata->ctx_udata, depth) < 0)
+    if(H5B2__hdr_init(hdr, &cparam, udata->ctx_udata, depth) < 0)
         HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, NULL, "can't initialize B-tree header info")
 
     /* Set the B-tree header's address */
-    hdr->addr = addr;
+    hdr->addr = udata->addr;
+
+    /* Sanity check */
+    HDassert((size_t)(image - (const uint8_t *)_image) <= len);
 
     /* Set return value */
     ret_value = hdr;
 
 done:
-    /* Release resources */
-    if(wb && H5WB_unwrap(wb) < 0)
-        HDONE_ERROR(H5E_BTREE, H5E_CLOSEERROR, NULL, "can't close wrapped buffer")
     if(!ret_value && hdr)
-        if(H5B2_hdr_free(hdr) < 0)
+        if(H5B2__hdr_free(hdr) < 0)
             HDONE_ERROR(H5E_BTREE, H5E_CANTRELEASE, NULL, "can't release v2 B-tree header")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2__cache_hdr_load() */ /*lint !e818 Can't make udata a pointer to const */
+} /* end H5B2__cache_hdr_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2__cache_hdr_flush
+ * Function:    H5B2__cache_hdr_image_len
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              May 20, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2__cache_hdr_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
+{
+    const H5B2_hdr_t *hdr = (const H5B2_hdr_t *)_thing;      /* Pointer to the B-tree header */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(hdr);
+    HDassert(image_len);
+
+    /* Set the image length size */
+    *image_len = hdr->hdr_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5B2__cache_hdr_image_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_hdr_serialize
  *
  * Purpose:	Flushes a dirty B-tree header to disk.
  *
@@ -270,213 +395,274 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2__cache_hdr_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr,
-    H5B2_hdr_t *hdr, unsigned H5_ATTR_UNUSED * flags_ptr)
+H5B2__cache_hdr_serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
+    void *_thing)
 {
-    H5WB_t      *wb = NULL;             /* Wrapped buffer for header data */
-    uint8_t     hdr_buf[H5B2_HDR_BUF_SIZE]; /* Buffer for header */
-    herr_t      ret_value = SUCCEED;    /* Return value */
+    H5B2_hdr_t *hdr = (H5B2_hdr_t *)_thing;     /* Pointer to the B-tree header */
+    uint8_t *image = (uint8_t *)_image;         /* Pointer into raw data buffer */
+    uint32_t metadata_chksum;                   /* Computed metadata checksum value */
 
-    FUNC_ENTER_STATIC
+    FUNC_ENTER_STATIC_NOERR
 
     /* check arguments */
     HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    HDassert(image);
     HDassert(hdr);
 
-    if(hdr->cache_info.is_dirty) {
-        uint8_t	*buf;           /* Pointer to header buffer */
-        uint8_t *p;             /* Pointer into raw data buffer */
-        uint32_t metadata_chksum; /* Computed metadata checksum value */
-
-        /* Set the B-tree header's file context for this operation */
-        hdr->f = f;
-
-        /* Wrap the local buffer for serialized header info */
-        if(NULL == (wb = H5WB_wrap(hdr_buf, sizeof(hdr_buf))))
-            HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "can't wrap buffer")
-
-        /* Get a pointer to a buffer that's large enough for header */
-        if(NULL == (buf = (uint8_t *)H5WB_actual(wb, hdr->hdr_size)))
-            HGOTO_ERROR(H5E_BTREE, H5E_NOSPACE, FAIL, "can't get actual buffer")
-
-        /* Get temporary pointer to serialized header */
-        p = buf;
-
-        /* Magic number */
-        HDmemcpy(p, H5B2_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC);
-        p += H5_SIZEOF_MAGIC;
-
-        /* Version # */
-        *p++ = H5B2_HDR_VERSION;
-
-        /* B-tree type */
-        *p++ = hdr->cls->id;
-
-        /* Node size (in bytes) */
-        UINT32ENCODE(p, hdr->node_size);
+    /* Magic number */
+    HDmemcpy(image, H5B2_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    image += H5_SIZEOF_MAGIC;
 
-        /* Raw key size (in bytes) */
-        UINT16ENCODE(p, hdr->rrec_size);
+    /* Version # */
+    *image++ = H5B2_HDR_VERSION;
 
-        /* Depth of tree */
-        UINT16ENCODE(p, hdr->depth);
+    /* B-tree type */
+    *image++ = hdr->cls->id;
 
-        /* Split & merge %s */
-        H5_CHECK_OVERFLOW(hdr->split_percent, /* From: */ unsigned, /* To: */ uint8_t);
-        *p++ = (uint8_t)hdr->split_percent;
-        H5_CHECK_OVERFLOW(hdr->merge_percent, /* From: */ unsigned, /* To: */ uint8_t);
-        *p++ = (uint8_t)hdr->merge_percent;
+    /* Node size (in bytes) */
+    UINT32ENCODE(image, hdr->node_size);
 
-        /* Root node pointer */
-        H5F_addr_encode(f, &p, hdr->root.addr);
-        UINT16ENCODE(p, hdr->root.node_nrec);
-        H5F_ENCODE_LENGTH(f, p, hdr->root.all_nrec);
+    /* Raw key size (in bytes) */
+    UINT16ENCODE(image, hdr->rrec_size);
 
-        /* Compute metadata checksum */
-        metadata_chksum = H5_checksum_metadata(buf, (hdr->hdr_size - H5B2_SIZEOF_CHKSUM), 0);
+    /* Depth of tree */
+    UINT16ENCODE(image, hdr->depth);
 
-        /* Metadata checksum */
-        UINT32ENCODE(p, metadata_chksum);
+    /* Split & merge %s */
+    H5_CHECK_OVERFLOW(hdr->split_percent, /* From: */ unsigned, /* To: */ uint8_t);
+    *image++ = (uint8_t)hdr->split_percent;
+    H5_CHECK_OVERFLOW(hdr->merge_percent, /* From: */ unsigned, /* To: */ uint8_t);
+    *image++ = (uint8_t)hdr->merge_percent;
 
-        /* Write the B-tree header. */
-        HDassert((size_t)(p - buf) == hdr->hdr_size);
-        if(H5F_block_write(f, H5FD_MEM_BTREE, addr, hdr->hdr_size, dxpl_id, buf) < 0)
-            HGOTO_ERROR(H5E_BTREE, H5E_CANTFLUSH, FAIL, "unable to save B-tree header to disk")
+    /* Root node pointer */
+    H5F_addr_encode(f, &image, hdr->root.addr);
+    UINT16ENCODE(image, hdr->root.node_nrec);
+    H5F_ENCODE_LENGTH(f, image, hdr->root.all_nrec);
 
-        hdr->cache_info.is_dirty = FALSE;
-    } /* end if */
+    /* Compute metadata checksum */
+    metadata_chksum = H5_checksum_metadata(_image, (hdr->hdr_size - H5B2_SIZEOF_CHKSUM), 0);
 
-    if(destroy)
-        if(H5B2__cache_hdr_dest(f, hdr) < 0)
-            HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree header")
+    /* Metadata checksum */
+    UINT32ENCODE(image, metadata_chksum);
 
-done:
-    /* Release resources */
-    if(wb && H5WB_unwrap(wb) < 0)
-        HDONE_ERROR(H5E_BTREE, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+    /* Sanity check */
+    HDassert((size_t)(image - (uint8_t *)_image) == len);
+
+    /* Clear shadowed node lists, as the header has been flushed and all
+     * nodes must be shadowed again (if doing SWMR writes).  Note that this
+     * algorithm does one extra iteration at the end, as the last node's
+     * shadowed_next pointer points to itself. */
+    while(hdr->shadowed_internal) {
+	H5B2_internal_t *next = hdr->shadowed_internal->shadowed_next;
+
+	HDassert(!hdr->shadowed_internal->cache_info.is_dirty);
+	hdr->shadowed_internal->shadowed_next = NULL;
+	hdr->shadowed_internal->shadowed_prev = NULL;
+	hdr->shadowed_internal = next;
+    } /* end while */
+    while(hdr->shadowed_leaf) {
+	H5B2_leaf_t *next = hdr->shadowed_leaf->shadowed_next;
+
+	HDassert(!hdr->shadowed_leaf->cache_info.is_dirty);
+	hdr->shadowed_leaf->shadowed_next = NULL;
+	hdr->shadowed_leaf->shadowed_prev = NULL;
+	hdr->shadowed_leaf = next;
+    } /* end while */
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2__cache_hdr_flush() */
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5B2__cache_hdr_serialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2__cache_hdr_dest
+ * Function:    H5B2__cache_hdr_notify
  *
- * Purpose:	Destroys a B-tree header in memory.
+ * Purpose:     Handle cache action notifications
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 1 2005
+ * Programmer:  Neil Fortner
+ *              nfortne2 at hdfgroup.org
+ *              Apr 24 2012
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2__cache_hdr_dest(H5F_t *f, H5B2_hdr_t *hdr)
+H5B2__cache_hdr_notify(H5AC_notify_action_t action, void *_thing)
 {
-    herr_t ret_value = SUCCEED;     /* Return value */
+    H5B2_hdr_t 	*hdr = (H5B2_hdr_t *)_thing;
+    herr_t 	ret_value = SUCCEED;
 
     FUNC_ENTER_STATIC
 
-    /* Check arguments */
+    /*
+     * Check arguments.
+     */
     HDassert(hdr);
-    HDassert(hdr->rc == 0);
-
-    /* If we're going to free the space on disk, the address must be valid */
-    HDassert(!hdr->cache_info.free_file_space_on_destroy || H5F_addr_defined(hdr->cache_info.addr));
 
-    /* Check for freeing file space for B-tree header */
-    if(hdr->cache_info.free_file_space_on_destroy) {
-        /* Release the space on disk */
-        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
-        if(H5MF_xfree(f, H5FD_MEM_BTREE, H5AC_dxpl_id, hdr->cache_info.addr, (hsize_t)hdr->hdr_size) < 0)
-            HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free v2 B-tree header")
+    /* Check if the file was opened with SWMR-write access */
+    if(hdr->swmr_write) {
+        switch(action) {
+            case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+	    case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+	    case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+		/* do nothing */
+                break;
+
+	    case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+                /* If hdr->parent != NULL, the v2 B-tree header
+                 * must be employed as the index for a chunked
+                 * data set which has been modified by the SWMR writer.
+                 * 
+                 * In this case, hdr->parent must contain a
+                 * pointer to the object header proxy which is the flush 
+                 * dependency parent of the v2 B-tree header.
+                 *
+                 * hdr->parent is used to destroy the flush dependency
+                 * before the v2 B-tree header is evicted.
+                 */
+                if(hdr->parent) {
+                    /* Sanity checks */
+                    HDassert(((H5AC_info_t *)hdr->parent)->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+                    HDassert(((H5AC_info_t *)hdr->parent)->type);
+                    HDassert(((H5AC_info_t *)hdr->parent)->type->id == H5AC_OHDR_PROXY_ID);
+
+		    /* Destroy flush dependency on object header proxy */
+		    if(H5B2__destroy_flush_depend((H5AC_info_t *)hdr->parent, (H5AC_info_t *)hdr) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+		} /* end if */
+		break;
+
+            default:
+#ifdef NDEBUG
+                HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, FAIL, "unknown action from metadata cache")
+#else /* NDEBUG */
+                HDassert(0 && "Unknown action?!?");
+#endif /* NDEBUG */
+        } /* end switch */
     } /* end if */
 
-    /* Release B-tree header info */
-    if(H5B2_hdr_free(hdr) < 0)
-        HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free v2 B-tree header info")
-
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2__cache_hdr_dest() */
+} /* end H5B2__cache_hdr_notify() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2__cache_hdr_clear
+ * Function:	H5B2__cache_hdr_free_icr
  *
- * Purpose:	Mark a B-tree header in memory as non-dirty.
+ * Purpose:	Destroy/release an "in core representation" of a data
+ *              structure
  *
  * Return:	Non-negative on success/Negative on failure
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb  1 2005
+ * Programmer:	Mike McGreevy
+ *              mcgreevy at hdfgroup.org
+ *              June 18, 2008
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2__cache_hdr_clear(H5F_t *f, H5B2_hdr_t *hdr, hbool_t destroy)
+H5B2__cache_hdr_free_icr(void *thing)
 {
-    herr_t ret_value = SUCCEED;         /* Return value */
+    herr_t ret_value = SUCCEED;     /* Return value */
 
     FUNC_ENTER_STATIC
 
-    /*
-     * Check arguments.
-     */
-    HDassert(hdr);
-
-    /* Reset the dirty flag.  */
-    hdr->cache_info.is_dirty = FALSE;
+    /* Check arguments */
+    HDassert(thing);
 
-    if(destroy)
-        if(H5B2__cache_hdr_dest(f, hdr) < 0)
-	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree header")
+    /* Destroy v2 B-tree header */
+    if(H5B2__hdr_free((H5B2_hdr_t *)thing) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free v2 B-tree header")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2__cache_hdr_clear() */
+} /* H5B2__cache_hdr_free_icr() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5B2__cache_hdr_size
+ * Function:    H5B2__cache_int_get_load_size
  *
- * Purpose:     Compute the size in bytes of a B-tree header
- *              on disk, and return it in *size_ptr.  On failure,
- *              the value of *size_ptr is undefined.
+ * Purpose:     Compute the size of the data structure on disk.
  *
- * Return:      SUCCEED (Can't fail)
+ * Return:      Non-negative on success/Negative on failure
  *
  * Programmer:  Quincey Koziol
  *              koziol at hdfgroup.org
- *              Feb 1 2005
+ *              May 18, 2010
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2__cache_hdr_size(const H5F_t H5_ATTR_UNUSED *f, const H5B2_hdr_t *hdr, size_t *size_ptr)
+H5B2__cache_int_get_load_size(const void *_image, void *_udata, size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    H5B2_internal_cache_ud_t *udata = (H5B2_internal_cache_ud_t *)_udata; /* User data for callback */
+
     FUNC_ENTER_STATIC_NOERR
 
-    /* check arguments */
-    HDassert(f);
-    HDassert(hdr);
-    HDassert(size_ptr);
+    /* Check arguments */
+    HDassert(udata);
+    HDassert(udata->hdr);
+    HDassert(image_len);
 
-    /* Set size value */
-    *size_ptr = hdr->hdr_size;
+    if(image == NULL) {
+	/* Set the image length size */
+	*image_len = udata->hdr->node_size;
+    } else {
+	HDassert(actual_len);
+	HDassert(*actual_len == *image_len);
+    }
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5B2__cache_hdr_size() */
+} /* end H5B2__cache_int_get_load_size() */
+
+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_int_verify_chksum
+ *
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
+ *
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
+ *
+ * Programmer:	Vailin Choi; Aug 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5B2__cache_int_verify_chksum(const void *_image, size_t H5_ATTR_UNUSED len, void *_udata)
+{
+    const uint8_t *image = (const uint8_t *)_image;       			/* Pointer into raw data buffer */
+    H5B2_internal_cache_ud_t *udata = (H5B2_internal_cache_ud_t *)_udata;     	/* Pointer to user data */
+    size_t chk_size;       	/* Exact size of the node with checksum at the end */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+    htri_t ret_value = TRUE;	/* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(image);
+    HDassert(udata);
+
+    /* Internal node prefix header + records + child pointer triplets: size with checksum at the end */
+    chk_size = H5B2_INT_PREFIX_SIZE + (udata->nrec * udata->hdr->rrec_size) + ((size_t)(udata->nrec + 1) * H5B2_INT_POINTER_SIZE(udata->hdr, udata->depth));
+
+    /* Get stored and computed checksums */
+    H5F_get_checksums(image, chk_size, &stored_chksum, &computed_chksum);
+
+    if(stored_chksum != computed_chksum)
+	ret_value = FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__cache_int_verify_chksum() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2__cache_internal_load
+ * Function:	H5B2__cache_int_deserialize
  *
- * Purpose:	Loads a B-tree internal node from the disk.
+ * Purpose:	Deserialize a B-tree internal node from the disk.
  *
  * Return:	Success:	Pointer to a new B-tree internal node.
  *              Failure:        NULL
@@ -487,24 +673,23 @@ H5B2__cache_hdr_size(const H5F_t H5_ATTR_UNUSED *f, const H5B2_hdr_t *hdr, size_
  *
  *-------------------------------------------------------------------------
  */
-static H5B2_internal_t *
-H5B2__cache_internal_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+static void *
+H5B2__cache_int_deserialize(const void *_image, size_t H5_ATTR_UNUSED len,
+    void *_udata, hbool_t H5_ATTR_UNUSED *dirty)
 {
     H5B2_internal_cache_ud_t *udata = (H5B2_internal_cache_ud_t *)_udata;     /* Pointer to user data */
     H5B2_internal_t	*internal = NULL;       /* Internal node read */
-    const uint8_t	*p;             /* Pointer into raw data buffer */
+    const uint8_t	*image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
     uint8_t		*native;        /* Pointer to native record info */
     H5B2_node_ptr_t	*int_node_ptr;  /* Pointer to node pointer info */
     uint32_t            stored_chksum;  /* Stored metadata checksum value */
-    uint32_t            computed_chksum; /* Computed metadata checksum value */
     unsigned		u;              /* Local index variable */
-    H5B2_internal_t	*ret_value;     /* Return value */
+    H5B2_internal_t	*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_STATIC
 
     /* Check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    HDassert(image);
     HDassert(udata);
 
     /* Allocate new internal node and reset cache info */
@@ -512,33 +697,27 @@ H5B2__cache_internal_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
 	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
     HDmemset(&internal->cache_info, 0, sizeof(H5AC_info_t));
 
-    /* Set the B-tree header's file context for this operation */
-    udata->hdr->f = f;
-
     /* Increment ref. count on B-tree header */
-    if(H5B2_hdr_incr(udata->hdr) < 0)
+    if(H5B2__hdr_incr(udata->hdr) < 0)
         HGOTO_ERROR(H5E_BTREE, H5E_CANTINC, NULL, "can't increment ref. count on B-tree header")
 
     /* Share B-tree information */
     internal->hdr = udata->hdr;
-
-    /* Read header from disk */
-    if(H5F_block_read(f, H5FD_MEM_BTREE, addr, udata->hdr->node_size, dxpl_id, udata->hdr->page) < 0)
-        HGOTO_ERROR(H5E_BTREE, H5E_READERROR, NULL, "can't read B-tree internal node")
-
-    p = udata->hdr->page;
+    internal->parent = udata->parent;
+    internal->shadowed_next = NULL;
+    internal->shadowed_prev = NULL;
 
     /* Magic number */
-    if(HDmemcmp(p, H5B2_INT_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+    if(HDmemcmp(image, H5B2_INT_MAGIC, (size_t)H5_SIZEOF_MAGIC))
         HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, NULL, "wrong B-tree internal node signature")
-    p += H5_SIZEOF_MAGIC;
+    image += H5_SIZEOF_MAGIC;
 
     /* Version */
-    if(*p++ != H5B2_INT_VERSION)
-	HGOTO_ERROR(H5E_BTREE, H5E_BADRANGE, NULL, "wrong B-tree internal node version")
+    if(*image++ != H5B2_INT_VERSION)
+        HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, NULL, "wrong B-tree internal node version")
 
     /* B-tree type */
-    if(*p++ != (uint8_t)udata->hdr->cls->id)
+    if(*image++ != (uint8_t)udata->hdr->cls->id)
         HGOTO_ERROR(H5E_BTREE, H5E_BADTYPE, NULL, "incorrect B-tree type")
 
     /* Allocate space for the native keys in memory */
@@ -557,11 +736,11 @@ H5B2__cache_internal_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
     native = internal->int_native;
     for(u = 0; u < internal->nrec; u++) {
         /* Decode record */
-        if((udata->hdr->cls->decode)(p, native, udata->hdr->cb_ctx) < 0)
+        if((udata->hdr->cls->decode)(image, native, udata->hdr->cb_ctx) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTDECODE, NULL, "unable to decode B-tree record")
 
         /* Move to next record */
-        p += udata->hdr->rrec_size;
+        image += udata->hdr->rrec_size;
         native += udata->hdr->cls->nrec_size;
     } /* end for */
 
@@ -569,10 +748,10 @@ H5B2__cache_internal_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
     int_node_ptr = internal->node_ptrs;
     for(u = 0; u < (unsigned)(internal->nrec + 1); u++) {
         /* Decode node pointer */
-        H5F_addr_decode(udata->f, (const uint8_t **)&p, &(int_node_ptr->addr));
-        UINT64DECODE_VAR(p, int_node_ptr->node_nrec, udata->hdr->max_nrec_size);
+        H5F_addr_decode(udata->f, (const uint8_t **)&image, &(int_node_ptr->addr));
+        UINT64DECODE_VAR(image, int_node_ptr->node_nrec, udata->hdr->max_nrec_size);
         if(udata->depth > 1)
-            UINT64DECODE_VAR(p, int_node_ptr->all_nrec, udata->hdr->node_info[udata->depth - 1].cum_max_nrec_size)
+            UINT64DECODE_VAR(image, int_node_ptr->all_nrec, udata->hdr->node_info[udata->depth - 1].cum_max_nrec_size)
         else
             int_node_ptr->all_nrec = int_node_ptr->node_nrec;
 
@@ -580,35 +759,63 @@ H5B2__cache_internal_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
         int_node_ptr++;
     } /* end for */
 
-    /* Compute checksum on internal node */
-    computed_chksum = H5_checksum_metadata(udata->hdr->page, (size_t)(p - (const uint8_t *)udata->hdr->page), 0);
+    /* checksum verification already done in verify_chksum cb */
 
     /* Metadata checksum */
-    UINT32DECODE(p, stored_chksum);
+    UINT32DECODE(image, stored_chksum);
 
     /* Sanity check parsing */
-    HDassert((size_t)(p - (const uint8_t *)udata->hdr->page) <= udata->hdr->node_size);
-
-    /* Verify checksum */
-    if(stored_chksum != computed_chksum)
-        HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, NULL, "incorrect metadata checksum for v2 internal node")
+    HDassert((size_t)(image - (const uint8_t *)_image) <= len);
 
     /* Set return value */
     ret_value = internal;
 
 done:
     if(!ret_value && internal)
-        if(H5B2_internal_free(internal) < 0)
+        if(H5B2__internal_free(internal) < 0)
             HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, NULL, "unable to destroy B-tree internal node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2__cache_internal_load() */ /*lint !e818 Can't make udata a pointer to const */
+} /* H5B2__cache_int_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2__cache_internal_flush
+ * Function:    H5B2__cache_int_image_len
+ *
+ * Purpose:     Compute the size of the data structure on disk.
  *
- * Purpose:	Flushes a dirty B-tree internal node to disk.
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              May 20, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2__cache_int_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
+{
+    const H5B2_internal_t *internal = (const H5B2_internal_t *)_thing;      /* Pointer to the B-tree internal node */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(internal);
+    HDassert(internal->hdr);
+    HDassert(image_len);
+
+    /* Set the image length size */
+    *image_len = internal->hdr->node_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5B2__cache_int_image_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_int_serialize
+ *
+ * Purpose:	Serializes a B-tree internal node for writing to disk.
  *
  * Return:	Non-negative on success/Negative on failure
  *
@@ -619,207 +826,285 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2__cache_internal_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B2_internal_t *internal, unsigned H5_ATTR_UNUSED * flags_ptr)
+H5B2__cache_int_serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
+    void *_thing)
 {
+    H5B2_internal_t *internal = (H5B2_internal_t *)_thing;      /* Pointer to the B-tree internal node */
+    uint8_t *image = (uint8_t *)_image; /* Pointer into raw data buffer */
+    uint8_t *native;        /* Pointer to native record info */
+    H5B2_node_ptr_t *int_node_ptr;      /* Pointer to node pointer info */
+    uint32_t metadata_chksum; /* Computed metadata checksum value */
+    unsigned u;             /* Local index variable */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_STATIC
 
     /* check arguments */
     HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    HDassert(image);
     HDassert(internal);
     HDassert(internal->hdr);
 
-    if(internal->cache_info.is_dirty) {
-        uint8_t *p;             /* Pointer into raw data buffer */
-        uint8_t *native;        /* Pointer to native record info */
-        H5B2_node_ptr_t *int_node_ptr;      /* Pointer to node pointer info */
-        uint32_t metadata_chksum; /* Computed metadata checksum value */
-        unsigned u;             /* Local index variable */
-
-        /* Set the B-tree header's file context for this operation */
-        internal->hdr->f = f;
-
-        p = internal->hdr->page;
-
-        /* Magic number */
-        HDmemcpy(p, H5B2_INT_MAGIC, (size_t)H5_SIZEOF_MAGIC);
-        p += H5_SIZEOF_MAGIC;
-
-        /* Version # */
-        *p++ = H5B2_INT_VERSION;
-
-        /* B-tree type */
-        *p++ = internal->hdr->cls->id;
-        HDassert((size_t)(p - internal->hdr->page) == (H5B2_INT_PREFIX_SIZE - H5B2_SIZEOF_CHKSUM));
-
-        /* Serialize records for internal node */
-        native = internal->int_native;
-        for(u = 0; u < internal->nrec; u++) {
-            /* Encode record */
-            if((internal->hdr->cls->encode)(p, native, internal->hdr->cb_ctx) < 0)
-                HGOTO_ERROR(H5E_BTREE, H5E_CANTENCODE, FAIL, "unable to encode B-tree record")
-
-            /* Move to next record */
-            p += internal->hdr->rrec_size;
-            native += internal->hdr->cls->nrec_size;
-        } /* end for */
-
-        /* Serialize node pointers for internal node */
-        int_node_ptr = internal->node_ptrs;
-        for(u = 0; u < (unsigned)(internal->nrec + 1); u++) {
-            /* Encode node pointer */
-            H5F_addr_encode(f, &p, int_node_ptr->addr);
-            UINT64ENCODE_VAR(p, int_node_ptr->node_nrec, internal->hdr->max_nrec_size);
-            if(internal->depth > 1)
-                UINT64ENCODE_VAR(p, int_node_ptr->all_nrec, internal->hdr->node_info[internal->depth - 1].cum_max_nrec_size);
-
-            /* Move to next node pointer */
-            int_node_ptr++;
-        } /* end for */
-
-        /* Compute metadata checksum */
-        metadata_chksum = H5_checksum_metadata(internal->hdr->page, (size_t)(p - internal->hdr->page), 0);
-
-        /* Metadata checksum */
-        UINT32ENCODE(p, metadata_chksum);
-
-	/* Write the B-tree internal node */
-        HDassert((size_t)(p - internal->hdr->page) <= internal->hdr->node_size);
-	if(H5F_block_write(f, H5FD_MEM_BTREE, addr, internal->hdr->node_size, dxpl_id, internal->hdr->page) < 0)
-	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFLUSH, FAIL, "unable to save B-tree internal node to disk")
-
-	internal->cache_info.is_dirty = FALSE;
-    } /* end if */
+    /* Magic number */
+    HDmemcpy(image, H5B2_INT_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    image += H5_SIZEOF_MAGIC;
 
-    if(destroy)
-        if(H5B2__cache_internal_dest(f, internal) < 0)
-	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree internal node")
+    /* Version # */
+    *image++ = H5B2_INT_VERSION;
+
+    /* B-tree type */
+    *image++ = internal->hdr->cls->id;
+    HDassert((size_t)(image - (uint8_t *)_image) == (H5B2_INT_PREFIX_SIZE - H5B2_SIZEOF_CHKSUM));
+
+    /* Serialize records for internal node */
+    native = internal->int_native;
+    for(u = 0; u < internal->nrec; u++) {
+        /* Encode record */
+        if((internal->hdr->cls->encode)(image, native, internal->hdr->cb_ctx) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTENCODE, FAIL, "unable to encode B-tree record")
+
+        /* Move to next record */
+        image += internal->hdr->rrec_size;
+        native += internal->hdr->cls->nrec_size;
+    } /* end for */
+
+    /* Serialize node pointers for internal node */
+    int_node_ptr = internal->node_ptrs;
+    for(u = 0; u < (unsigned)(internal->nrec + 1); u++) {
+        /* Encode node pointer */
+        H5F_addr_encode(f, &image, int_node_ptr->addr);
+        UINT64ENCODE_VAR(image, int_node_ptr->node_nrec, internal->hdr->max_nrec_size);
+        if(internal->depth > 1)
+            UINT64ENCODE_VAR(image, int_node_ptr->all_nrec, internal->hdr->node_info[internal->depth - 1].cum_max_nrec_size);
+
+        /* Move to next node pointer */
+        int_node_ptr++;
+    } /* end for */
+
+    /* Compute metadata checksum */
+    metadata_chksum = H5_checksum_metadata(_image, (size_t)(image - (uint8_t *)_image), 0);
+
+    /* Metadata checksum */
+    UINT32ENCODE(image, metadata_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(image - (uint8_t *)_image) <= len);
+
+#ifdef H5_CLEAR_MEMORY
+    /* Clear rest of internal node */
+    HDmemset(image, 0, len - (size_t)(image - (uint8_t *)_image));
+#endif /* H5_CLEAR_MEMORY */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2__cache_internal_flush() */
+} /* H5B2__cache_int_serialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2__cache_internal_dest
+ * Function:    H5B2__cache_int_notify
  *
- * Purpose:	Destroys a B-tree internal node in memory.
+ * Purpose:     Handle cache action notifications
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 2 2005
+ * Programmer:  Neil Fortner
+ *              nfortne2 at hdfgroup.org
+ *              Apr 25 2012
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2__cache_internal_dest(H5F_t *f, H5B2_internal_t *internal)
+H5B2__cache_int_notify(H5AC_notify_action_t action, void *_thing)
 {
-    herr_t ret_value = SUCCEED;     /* Return value */
+    H5B2_internal_t 	*internal = (H5B2_internal_t *)_thing;
+    herr_t   		ret_value = SUCCEED;
 
-    FUNC_ENTER_STATIC
+    FUNC_ENTER_NOAPI_NOINIT
 
-    /* Check arguments */
-    HDassert(f);
+    /*
+     * Check arguments.
+     */
     HDassert(internal);
-    HDassert(internal->hdr);
 
-    /* If we're going to free the space on disk, the address must be valid */
-    HDassert(!internal->cache_info.free_file_space_on_destroy || H5F_addr_defined(internal->cache_info.addr));
-
-    /* Check for freeing file space for B-tree internal node */
-    if(internal->cache_info.free_file_space_on_destroy) {
-        /* Release the space on disk */
-        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
-        if(H5MF_xfree(f, H5FD_MEM_BTREE, H5AC_dxpl_id, internal->cache_info.addr, (hsize_t)internal->hdr->node_size) < 0)
-            HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free v2 B-tree internal node")
+    /* Check if the file was opened with SWMR-write access */
+    if(internal->hdr->swmr_write) {
+        HDassert(internal->parent);
+        switch(action) {
+            case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+	    case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+                /* Create flush dependency on parent */
+                if(H5B2__create_flush_depend((H5AC_info_t *)internal->parent, (H5AC_info_t *)internal) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+                break;
+
+	    case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+		/* do nothing */
+		break;
+
+            case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+		/* Destroy flush dependency on parent */
+		if(H5B2__destroy_flush_depend((H5AC_info_t *)internal->parent, (H5AC_info_t *)internal) < 0)
+		    HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+
+                break;
+
+            default:
+#ifdef NDEBUG
+                HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, FAIL, "unknown action from metadata cache")
+#else /* NDEBUG */
+                HDassert(0 && "Unknown action?!?");
+#endif /* NDEBUG */
+        } /* end switch */
     } /* end if */
 
-    /* Release v2 b-tree internal node */
-    if(H5B2_internal_free(internal) < 0)
-        HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to release v2 B-tree internal node")
-
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2__cache_internal_dest() */
+} /* end H5B2__cache_int_notify() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2__cache_internal_clear
+ * Function:	H5B2__cache_int_free_icr
  *
- * Purpose:	Mark a B-tree internal node in memory as non-dirty.
+ * Purpose:	Destroy/release an "in core representation" of a data
+ *              structure
  *
  * Return:	Non-negative on success/Negative on failure
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb  2 2005
+ * Programmer:	Mike McGreevy
+ *              mcgreevy at hdfgroup.org
+ *              June 18, 2008
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2__cache_internal_clear(H5F_t *f, H5B2_internal_t *internal, hbool_t destroy)
+H5B2__cache_int_free_icr(void *_thing)
 {
-    herr_t ret_value = SUCCEED;
+    H5B2_internal_t *internal = (H5B2_internal_t *)_thing;
+    herr_t ret_value = SUCCEED;     /* Return value */
 
     FUNC_ENTER_STATIC
 
-    /*
-     * Check arguments.
-     */
+    /* Check arguments */
     HDassert(internal);
+    HDassert(internal->hdr);
 
-    /* Reset the dirty flag.  */
-    internal->cache_info.is_dirty = FALSE;
+    /* Unlink from shadowed list */
+    if(internal->shadowed_next) {
+        if(internal->shadowed_next != internal) {
+            internal->shadowed_next->shadowed_prev = internal->shadowed_prev;
+
+            if(internal->shadowed_prev)
+                internal->shadowed_prev->shadowed_next = internal->shadowed_next;
+            else {
+                HDassert(internal->hdr->shadowed_internal = internal);
+
+                internal->hdr->shadowed_internal = internal->shadowed_next;
+            } /* end else */
+        } /* end if */
+        else {
+            if(internal->shadowed_prev)
+                internal->shadowed_prev->shadowed_next = internal->shadowed_prev;
+            else {
+                HDassert(internal->hdr->shadowed_internal = internal);
+
+                internal->hdr->shadowed_internal = NULL;
+            } /* end else */
+        } /* end else */
+    } /* end if */
 
-    if(destroy)
-        if(H5B2__cache_internal_dest(f, internal) < 0)
-	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree internal node")
+    /* Release v2 B-tree internal node */
+    if(H5B2__internal_free(internal) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to release v2 B-tree internal node")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2__cache_internal_clear() */
+} /* H5B2__cache_int_free_icr() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2__cache_internal_size
+ * Function:    H5B2__cache_leaf_get_load_size
  *
- * Purpose:	Compute the size in bytes of a B-tree internal node
- *		on disk, and return it in *size_ptr.  On failure,
- *		the value of *size_ptr is undefined.
+ * Purpose:     Compute the size of the data structure on disk.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 2 2005
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              May 18, 2010
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2__cache_internal_size(const H5F_t H5_ATTR_UNUSED *f, const H5B2_internal_t *internal, size_t *size_ptr)
+H5B2__cache_leaf_get_load_size(const void *_image, void *_udata, size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
+    const uint8_t *image = (const uint8_t *)_image;       		      /* Pointer into raw data buffer */
+    H5B2_leaf_cache_ud_t *udata = (H5B2_leaf_cache_ud_t *)_udata; /* User data for callback */
+
     FUNC_ENTER_STATIC_NOERR
 
-    /* check arguments */
-    HDassert(internal);
-    HDassert(internal->hdr);
-    HDassert(size_ptr);
+    /* Check arguments */
+    HDassert(udata);
+    HDassert(udata->hdr);
+    HDassert(image_len);
 
-    /* Set size value */
-    *size_ptr = internal->hdr->node_size;
+    if(image == NULL) {
+	/* Set the image length size */
+	*image_len = udata->hdr->node_size;
+    } else {
+	HDassert(actual_len);
+	HDassert(*actual_len == *image_len);
+    }
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5B2__cache_internal_size() */
+} /* end H5B2__cache_leaf_get_load_size() */
+
+/*-------------------------------------------------------------------------
+ * Function:	H5B2__cache_leaf_verify_chksum
+ *
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
+ *
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
+ *
+ * Programmer:	Vailin Choi; Aug 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5B2__cache_leaf_verify_chksum(const void *_image, size_t H5_ATTR_UNUSED len, void *_udata)
+{
+    const uint8_t *image = (const uint8_t *)_image;       			/* Pointer into raw data buffer */
+    H5B2_internal_cache_ud_t *udata = (H5B2_internal_cache_ud_t *)_udata;     	/* Pointer to user data */
+    size_t chk_size;       	/* Exact size of the node with checksum at the end */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+    htri_t ret_value = TRUE;	/* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(image);
+    HDassert(udata);
+
+    /* Leaf node prefix header + records: size with checksum at the end */
+    chk_size = H5B2_LEAF_PREFIX_SIZE + (udata->nrec * udata->hdr->rrec_size);
+
+    /* Get stored and computed checksums */
+    H5F_get_checksums(image, chk_size, &stored_chksum, &computed_chksum);
+
+    if(stored_chksum != computed_chksum)
+	ret_value = FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__cache_leaf_verify_chksum() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2__cache_leaf_load
+ * Function:	H5B2__cache_leaf_deserialize
  *
- * Purpose:	Loads a B-tree leaf from the disk.
+ * Purpose:	Deserialize a B-tree leaf from the disk.
  *
  * Return:	Success:	Pointer to a new B-tree leaf node.
  *		Failure:	NULL
@@ -830,62 +1115,55 @@ H5B2__cache_internal_size(const H5F_t H5_ATTR_UNUSED *f, const H5B2_internal_t *
  *
  *-------------------------------------------------------------------------
  */
-static H5B2_leaf_t *
-H5B2__cache_leaf_load(H5F_t H5_ATTR_UNUSED *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+static void *
+H5B2__cache_leaf_deserialize(const void *_image, size_t H5_ATTR_UNUSED len,
+    void *_udata, hbool_t H5_ATTR_UNUSED *dirty)
 {
     H5B2_leaf_cache_ud_t *udata = (H5B2_leaf_cache_ud_t *)_udata;
     H5B2_leaf_t		*leaf = NULL;   /* Pointer to lead node loaded */
-    const uint8_t	*p;             /* Pointer into raw data buffer */
+    const uint8_t	*image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
     uint8_t		*native;        /* Pointer to native keys */
     uint32_t            stored_chksum;  /* Stored metadata checksum value */
-    uint32_t            computed_chksum; /* Computed metadata checksum value */
     unsigned		u;              /* Local index variable */
-    H5B2_leaf_t		*ret_value;     /* Return value */
+    H5B2_leaf_t		*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_STATIC
 
     /* Check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    HDassert(image);
     HDassert(udata);
 
     /* Allocate new leaf node and reset cache info */
     if(NULL == (leaf = H5FL_MALLOC(H5B2_leaf_t)))
-        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "memory allocation failed")
     HDmemset(&leaf->cache_info, 0, sizeof(H5AC_info_t));
 
-    /* Set the B-tree header's file context for this operation */
-    udata->hdr->f = udata->f;
-
     /* Increment ref. count on B-tree header */
-    if(H5B2_hdr_incr(udata->hdr) < 0)
+    if(H5B2__hdr_incr(udata->hdr) < 0)
         HGOTO_ERROR(H5E_BTREE, H5E_CANTINC, NULL, "can't increment ref. count on B-tree header")
 
     /* Share B-tree header information */
     leaf->hdr = udata->hdr;
-
-    /* Read header from disk */
-    if(H5F_block_read(udata->f, H5FD_MEM_BTREE, addr, udata->hdr->node_size, dxpl_id, udata->hdr->page) < 0)
-        HGOTO_ERROR(H5E_BTREE, H5E_READERROR, NULL, "can't read B-tree leaf node")
-
-    p = udata->hdr->page;
+    leaf->parent = udata->parent;
+    leaf->shadowed_next = NULL;
+    leaf->shadowed_prev = NULL;
 
     /* Magic number */
-    if(HDmemcmp(p, H5B2_LEAF_MAGIC, (size_t)H5_SIZEOF_MAGIC))
-        HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "wrong B-tree leaf node signature")
-    p += H5_SIZEOF_MAGIC;
+    if(HDmemcmp(image, H5B2_LEAF_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+	HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, NULL, "wrong B-tree leaf node signature")
+    image += H5_SIZEOF_MAGIC;
 
     /* Version */
-    if(*p++ != H5B2_LEAF_VERSION)
-        HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "wrong B-tree leaf node version")
+    if(*image++ != H5B2_LEAF_VERSION)
+	HGOTO_ERROR(H5E_BTREE, H5E_BADRANGE, NULL, "wrong B-tree leaf node version")
 
     /* B-tree type */
-    if(*p++ != (uint8_t)udata->hdr->cls->id)
+    if(*image++ != (uint8_t)udata->hdr->cls->id)
         HGOTO_ERROR(H5E_BTREE, H5E_BADTYPE, NULL, "incorrect B-tree type")
 
     /* Allocate space for the native keys in memory */
     if(NULL == (leaf->leaf_native = (uint8_t *)H5FL_FAC_MALLOC(udata->hdr->node_info[0].nat_rec_fac)))
-        HGOTO_ERROR(H5E_BTREE, H5E_NOSPACE, NULL, "memory allocation failed for B-tree leaf native keys")
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "memory allocation failed for B-tree leaf native keys")
 
     /* Set the number of records in the leaf */
     leaf->nrec = udata->nrec;
@@ -894,126 +1172,74 @@ H5B2__cache_leaf_load(H5F_t H5_ATTR_UNUSED *f, hid_t dxpl_id, haddr_t addr, void
     native = leaf->leaf_native;
     for(u = 0; u < leaf->nrec; u++) {
         /* Decode record */
-        if((udata->hdr->cls->decode)(p, native, udata->hdr->cb_ctx) < 0)
+        if((udata->hdr->cls->decode)(image, native, udata->hdr->cb_ctx) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTENCODE, NULL, "unable to decode B-tree record")
 
         /* Move to next record */
-        p += udata->hdr->rrec_size;
+        image += udata->hdr->rrec_size;
         native += udata->hdr->cls->nrec_size;
     } /* end for */
 
-    /* Compute checksum on internal node */
-    computed_chksum = H5_checksum_metadata(udata->hdr->page, (size_t)(p - (const uint8_t *)udata->hdr->page), 0);
+    /* checksum verification already done in verify_chksum cb */
 
     /* Metadata checksum */
-    UINT32DECODE(p, stored_chksum);
+    UINT32DECODE(image, stored_chksum);
 
     /* Sanity check parsing */
-    HDassert((size_t)(p - (const uint8_t *)udata->hdr->page) <= udata->hdr->node_size);
+    HDassert((size_t)(image - (const uint8_t *)_image) <= udata->hdr->node_size);
 
-    /* Verify checksum */
-    if(stored_chksum != computed_chksum)
-	HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, NULL, "incorrect metadata checksum for v2 leaf node")
+    /* Sanity check */
+    HDassert((size_t)(image - (const uint8_t *)_image) <= len);
 
     /* Set return value */
     ret_value = leaf;
 
 done:
     if(!ret_value && leaf)
-        if(H5B2_leaf_free(leaf) < 0)
+        if(H5B2__leaf_free(leaf) < 0)
             HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, NULL, "unable to destroy B-tree leaf node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2__cache_leaf_load() */ /*lint !e818 Can't make udata a pointer to const */
+} /* H5B2__cache_leaf_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2__cache_leaf_flush
+ * Function:    H5B2__cache_leaf_image_len
  *
- * Purpose:	Flushes a dirty B-tree leaf node to disk.
+ * Purpose:     Compute the size of the data structure on disk.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 2 2005
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              May 20, 2010
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2__cache_leaf_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B2_leaf_t *leaf, unsigned H5_ATTR_UNUSED * flags_ptr)
+H5B2__cache_leaf_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    herr_t      ret_value = SUCCEED;    /* Return value */
+    const H5B2_leaf_t *leaf = (const H5B2_leaf_t *)_thing;      /* Pointer to the B-tree leaf node  */
 
-    FUNC_ENTER_STATIC
+    FUNC_ENTER_STATIC_NOERR
 
-    /* check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    /* Check arguments */
     HDassert(leaf);
     HDassert(leaf->hdr);
+    HDassert(image_len);
 
-    if(leaf->cache_info.is_dirty) {
-        uint8_t *p;             /* Pointer into raw data buffer */
-        uint8_t *native;        /* Pointer to native keys */
-        uint32_t metadata_chksum; /* Computed metadata checksum value */
-        unsigned u;             /* Local index variable */
-
-        /* Set the B-tree header's file context for this operation */
-        leaf->hdr->f = f;
-
-        p = leaf->hdr->page;
-
-        /* magic number */
-        HDmemcpy(p, H5B2_LEAF_MAGIC, (size_t)H5_SIZEOF_MAGIC);
-        p += H5_SIZEOF_MAGIC;
-
-        /* version # */
-        *p++ = H5B2_LEAF_VERSION;
-
-        /* b-tree type */
-        *p++ = leaf->hdr->cls->id;
-        HDassert((size_t)(p - leaf->hdr->page) == (H5B2_LEAF_PREFIX_SIZE - H5B2_SIZEOF_CHKSUM));
+    /* Set the image length size */
+    *image_len = leaf->hdr->node_size;
 
-        /* Serialize records for leaf node */
-        native = leaf->leaf_native;
-        for(u = 0; u < leaf->nrec; u++) {
-            /* Encode record */
-            if((leaf->hdr->cls->encode)(p, native, leaf->hdr->cb_ctx) < 0)
-                HGOTO_ERROR(H5E_BTREE, H5E_CANTENCODE, FAIL, "unable to encode B-tree record")
-
-            /* Move to next record */
-            p += leaf->hdr->rrec_size;
-            native += leaf->hdr->cls->nrec_size;
-        } /* end for */
-
-        /* Compute metadata checksum */
-        metadata_chksum = H5_checksum_metadata(leaf->hdr->page, (size_t)(p - leaf->hdr->page), 0);
-
-        /* Metadata checksum */
-        UINT32ENCODE(p, metadata_chksum);
-
-	/* Write the B-tree leaf node */
-        HDassert((size_t)(p - leaf->hdr->page) <= leaf->hdr->node_size);
-	if(H5F_block_write(f, H5FD_MEM_BTREE, addr, leaf->hdr->node_size, dxpl_id, leaf->hdr->page) < 0)
-	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFLUSH, FAIL, "unable to save B-tree leaf node to disk")
-
-	leaf->cache_info.is_dirty = FALSE;
-    } /* end if */
-
-    if(destroy)
-        if(H5B2__cache_leaf_dest(f, leaf) < 0)
-	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree leaf node")
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2__cache_leaf_flush() */
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5B2__cache_leaf_image_len() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2__cache_leaf_dest
+ * Function:	H5B2__cache_leaf_serialize
  *
- * Purpose:	Destroys a B-tree leaf node in memory.
+ * Purpose:	Serializes a B-tree leaf node for writing to disk.
  *
  * Return:	Non-negative on success/Negative on failure
  *
@@ -1024,102 +1250,182 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2__cache_leaf_dest(H5F_t *f, H5B2_leaf_t *leaf)
+H5B2__cache_leaf_serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
+    void *_thing)
 {
-    herr_t ret_value = SUCCEED;     /* Return value */
+    H5B2_leaf_t *leaf = (H5B2_leaf_t *)_thing;      /* Pointer to the B-tree leaf node  */
+    uint8_t *image = (uint8_t *)_image;         /* Pointer into raw data buffer */
+    uint8_t *native;            /* Pointer to native keys */
+    uint32_t metadata_chksum;   /* Computed metadata checksum value */
+    unsigned u;                 /* Local index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
 
     FUNC_ENTER_STATIC
 
-    /* Check arguments */
+    /* check arguments */
     HDassert(f);
+    HDassert(image);
     HDassert(leaf);
     HDassert(leaf->hdr);
 
-    /* If we're going to free the space on disk, the address must be valid */
-    HDassert(!leaf->cache_info.free_file_space_on_destroy || H5F_addr_defined(leaf->cache_info.addr));
+    /* magic number */
+    HDmemcpy(image, H5B2_LEAF_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    image += H5_SIZEOF_MAGIC;
 
-    /* Check for freeing file space for B-tree leaf node */
-    if(leaf->cache_info.free_file_space_on_destroy) {
-        /* Release the space on disk */
-        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
-        if(H5MF_xfree(f, H5FD_MEM_BTREE, H5AC_dxpl_id, leaf->cache_info.addr, (hsize_t)leaf->hdr->node_size) < 0)
-            HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free v2 B-tree leaf node")
-    } /* end if */
+    /* version # */
+    *image++ = H5B2_LEAF_VERSION;
 
-    /* Destroy v2 b-tree leaf node */
-    if(H5B2_leaf_free(leaf) < 0)
-        HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree leaf node")
+    /* B-tree type */
+    *image++ = leaf->hdr->cls->id;
+    HDassert((size_t)(image - (uint8_t *)_image) == (H5B2_LEAF_PREFIX_SIZE - H5B2_SIZEOF_CHKSUM));
+
+    /* Serialize records for leaf node */
+    native = leaf->leaf_native;
+    for(u = 0; u < leaf->nrec; u++) {
+        /* Encode record */
+        if((leaf->hdr->cls->encode)(image, native, leaf->hdr->cb_ctx) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTENCODE, FAIL, "unable to encode B-tree record")
+
+        /* Move to next record */
+        image += leaf->hdr->rrec_size;
+        native += leaf->hdr->cls->nrec_size;
+    } /* end for */
+
+    /* Compute metadata checksum */
+    metadata_chksum = H5_checksum_metadata(_image, (size_t)((const uint8_t *)image - (const uint8_t *)_image), 0);
+
+    /* Metadata checksum */
+    UINT32ENCODE(image, metadata_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(image - (uint8_t *)_image) <= len);
+
+#ifdef H5_CLEAR_MEMORY
+    /* Clear rest of leaf node */
+    HDmemset(image, 0, len - (size_t)(image - (uint8_t *)_image));
+#endif /* H5_CLEAR_MEMORY */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2__cache_leaf_dest() */
+} /* H5B2__cache_leaf_serialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2__cache_leaf_clear
+ * Function:    H5B2__cache_leaf_notify
  *
- * Purpose:	Mark a B-tree leaf node in memory as non-dirty.
+ * Purpose:     Handle cache action notifications
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb  2 2005
+ * Programmer:  Neil Fortner
+ *              nfortne2 at hdfgroup.org
+ *              Apr 25 2012
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2__cache_leaf_clear(H5F_t *f, H5B2_leaf_t *leaf, hbool_t destroy)
+H5B2__cache_leaf_notify(H5AC_notify_action_t action, void *_thing)
 {
-    herr_t ret_value = SUCCEED;
+    H5B2_leaf_t 	*leaf = (H5B2_leaf_t *)_thing;
+    herr_t              ret_value = SUCCEED;
 
-    FUNC_ENTER_STATIC
+    FUNC_ENTER_NOAPI_NOINIT
 
     /*
      * Check arguments.
      */
     HDassert(leaf);
 
-    /* Reset the dirty flag.  */
-    leaf->cache_info.is_dirty = FALSE;
-
-    if(destroy)
-        if(H5B2__cache_leaf_dest(f, leaf) < 0)
-	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree leaf node")
+    /* Check if the file was opened with SWMR-write access */
+    if(leaf->hdr->swmr_write) {
+        HDassert(leaf->parent);
+        switch(action) {
+            case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+	    case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+                /* Create flush dependency on parent */
+                if(H5B2__create_flush_depend((H5AC_info_t *)leaf->parent, (H5AC_info_t *)leaf) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+                break;
+
+	    case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+                /* do nothing */
+                break;
+
+            case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+		/* Destroy flush dependency on parent */
+                if(H5B2__destroy_flush_depend((H5AC_info_t *)leaf->parent, (H5AC_info_t *)leaf) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+                break;
+
+            default:
+#ifdef NDEBUG
+                HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, FAIL, "unknown action from metadata cache")
+#else /* NDEBUG */
+                HDassert(0 && "Unknown action?!?");
+#endif /* NDEBUG */
+        } /* end switch */
+    } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2__cache_leaf_clear() */
+} /* end H5B2__cache_leaf_notify() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2__cache_leaf_size
+ * Function:	H5B2__cache_leaf_free_icr
  *
- * Purpose:	Compute the size in bytes of a B-tree leaf node
- *		on disk, and return it in *size_ptr.  On failure,
- *		the value of *size_ptr is undefined.
+ * Purpose:	Destroy/release an "in core representation" of a data
+ *              structure
  *
  * Return:	Non-negative on success/Negative on failure
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 2 2005
+ * Programmer:	Mike McGreevy
+ *              mcgreevy at hdfgroup.org
+ *              June 18, 2008
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2__cache_leaf_size(const H5F_t H5_ATTR_UNUSED *f, const H5B2_leaf_t *leaf, size_t *size_ptr)
+H5B2__cache_leaf_free_icr(void *_thing)
 {
-    FUNC_ENTER_STATIC_NOERR
+    H5B2_leaf_t *leaf = (H5B2_leaf_t *)_thing;
+    herr_t ret_value = SUCCEED;     /* Return value */
 
-    /* check arguments */
+    FUNC_ENTER_STATIC
+
+    /* Check arguments */
     HDassert(leaf);
     HDassert(leaf->hdr);
-    HDassert(size_ptr);
 
-    /* Set size value */
-    *size_ptr = leaf->hdr->node_size;
+    /* Unlink from shadowed list */
+    if(leaf->shadowed_next) {
+        if(leaf->shadowed_next != leaf) {
+            leaf->shadowed_next->shadowed_prev = leaf->shadowed_prev;
+
+            if(leaf->shadowed_prev)
+                leaf->shadowed_prev->shadowed_next = leaf->shadowed_next;
+            else {
+                HDassert(leaf->hdr->shadowed_leaf = leaf);
+
+                leaf->hdr->shadowed_leaf = leaf->shadowed_next;
+            } /* end else */
+        } /* end if */
+        else {
+            if(leaf->shadowed_prev)
+                leaf->shadowed_prev->shadowed_next = leaf->shadowed_prev;
+            else {
+                HDassert(leaf->hdr->shadowed_leaf = leaf);
+
+                leaf->hdr->shadowed_leaf = NULL;
+            } /* end else */
+        } /* end else */
+    } /* end if */
+
+    /* Destroy v2 B-tree leaf node */
+    if(H5B2__leaf_free(leaf) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree leaf node")
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5B2__cache_leaf_size() */
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5B2__cache_leaf_free_icr() */
 
diff --git a/src/H5B2dbg.c b/src/H5B2dbg.c
index 3e5d55a..b0e9ba2 100644
--- a/src/H5B2dbg.c
+++ b/src/H5B2dbg.c
@@ -28,7 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5B2_PACKAGE		/*suppress error about including H5B2pkg  */
+#include "H5B2module.h"         /* This source code file is part of the H5B2 module */
+
 
 /***********/
 /* Headers */
@@ -74,7 +75,7 @@
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_hdr_debug
+ * Function:	H5B2__hdr_debug
  *
  * Purpose:	Prints debugging info about a B-tree header.
  *
@@ -87,17 +88,16 @@
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int fwidth,
+H5B2__hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int fwidth,
     const H5B2_class_t *type, haddr_t obj_addr)
 {
     H5B2_hdr_t	*hdr = NULL;            /* B-tree header info */
     void        *dbg_ctx = NULL;	/* v2 B-tree debugging context */
     unsigned    u;                      /* Local index variable */
     char        temp_str[128];          /* Temporary string, for formatting */
-    H5B2_hdr_cache_ud_t cache_udata;    /* User-data for callback */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_PACKAGE
 
     /*
      * Check arguments.
@@ -113,18 +113,13 @@ H5B2_hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
         (NULL == type->crt_dbg_ctx && NULL == type->dst_dbg_ctx));
 
     /* Check for debugging context callback available */
-    if(type->crt_dbg_ctx) {
+    if(type->crt_dbg_ctx)
         /* Create debugging context */
         if(NULL == (dbg_ctx = (type->crt_dbg_ctx)(f, dxpl_id, obj_addr)))
 	    HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "unable to create v2 B-tree debugging context")
-    } /* end if */
 
-    /*
-     * Load the B-tree header.
-     */
-    cache_udata.f = f;
-    cache_udata.ctx_udata = dbg_ctx;
-    if(NULL == (hdr = (H5B2_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, &cache_udata, H5AC_READ)))
+    /* Load the B-tree header  */
+    if(NULL == (hdr = H5B2__hdr_protect(f, dxpl_id, addr, dbg_ctx, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, FAIL, "unable to load B-tree header")
 
     /* Set file pointer for this B-tree operation */
@@ -138,12 +133,12 @@ H5B2_hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
      */
     HDfprintf(stream, "%*s%-*s %s (%u)\n", indent, "", fwidth,
 	      "Tree type ID:", hdr->cls->name, (unsigned)hdr->cls->id);
-    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
 	      "Size of node:",
-	      hdr->node_size);
-    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      (unsigned)hdr->node_size);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
 	      "Size of raw (disk) record:",
-	      hdr->rrec_size);
+	      (unsigned)hdr->rrec_size);
     HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
 	      "Dirty flag:",
 	      hdr->cache_info.is_dirty ? "True" : "False");
@@ -178,18 +173,15 @@ H5B2_hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
 done:
     if(dbg_ctx && (type->dst_dbg_ctx)(dbg_ctx) < 0)
         HDONE_ERROR(H5E_BTREE, H5E_CANTRELEASE, FAIL, "unable to release v2 B-tree debugging context")
-    if(hdr) {
-        hdr->f = NULL;
-        if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, hdr, H5AC__NO_FLAGS_SET) < 0)
-            HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release B-tree header")
-    } /* end if */
+    if(hdr && H5B2__hdr_unprotect(hdr, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release v2 B-tree header")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_hdr_debug() */
+} /* end H5B2__hdr_debug() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_int_debug
+ * Function:	H5B2__int_debug
  *
  * Purpose:	Prints debugging info about a B-tree internal node
  *
@@ -202,7 +194,7 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_int_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int fwidth,
+H5B2__int_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int fwidth,
     const H5B2_class_t *type, haddr_t hdr_addr, unsigned nrec, unsigned depth, haddr_t obj_addr)
 {
     H5B2_hdr_t	*hdr = NULL;            /* B-tree header */
@@ -210,10 +202,9 @@ H5B2_int_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
     void        *dbg_ctx = NULL;	/* v2 B-tree debugging context */
     unsigned	u;                      /* Local index variable */
     char        temp_str[128];          /* Temporary string, for formatting */
-    H5B2_hdr_cache_ud_t cache_udata;    /* User-data for callback */
     herr_t      ret_value=SUCCEED;      /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_PACKAGE
 
     /*
      * Check arguments.
@@ -237,13 +228,9 @@ H5B2_int_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
 	    HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "unable to create v2 B-tree debugging context")
     } /* end if */
 
-    /*
-     * Load the B-tree header.
-     */
-    cache_udata.f = f;
-    cache_udata.ctx_udata = dbg_ctx;
-    if(NULL == (hdr = (H5B2_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, hdr_addr, &cache_udata, H5AC_READ)))
-	HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, FAIL, "unable to load B-tree header")
+    /* Load the B-tree header */
+    if(NULL == (hdr = H5B2__hdr_protect(f, dxpl_id, hdr_addr, dbg_ctx, H5AC__READ_ONLY_FLAG)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, FAIL, "unable to load v2 B-tree header")
 
     /* Set file pointer for this B-tree operation */
     hdr->f = f;
@@ -251,26 +238,25 @@ H5B2_int_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
     /*
      * Load the B-tree internal node
      */
-    if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, addr, nrec, depth, H5AC_READ)))
+    H5_CHECK_OVERFLOW(nrec, unsigned, uint16_t);
+    H5_CHECK_OVERFLOW(depth, unsigned, uint16_t);
+    if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, addr, NULL, (uint16_t)nrec, (uint16_t)depth, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, FAIL, "unable to load B-tree internal node")
 
     /* Print opening message */
-    if(internal->depth == 1)
-        HDfprintf(stream, "%*sv2 B-tree Internal 'Leaf' Node...\n", indent, "");
-    else
-        HDfprintf(stream, "%*sv2 B-tree Internal 'Branch' Node...\n", indent, "");
+    HDfprintf(stream, "%*sv2 B-tree Internal Node...\n", indent, "");
 
     /*
      * Print the values.
      */
     HDfprintf(stream, "%*s%-*s %s (%u)\n", indent, "", fwidth,
 	      "Tree type ID:", hdr->cls->name, (unsigned)hdr->cls->id);
-    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
 	      "Size of node:",
-	      hdr->node_size);
-    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      (unsigned)hdr->node_size);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
 	      "Size of raw (disk) record:",
-	      hdr->rrec_size);
+	      (unsigned)hdr->rrec_size);
     HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
 	      "Dirty flag:",
 	      internal->cache_info.is_dirty ? "True" : "False");
@@ -293,8 +279,7 @@ H5B2_int_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
         HDfprintf(stream, "%*s%-*s\n", indent + 3, "", MAX(0, fwidth - 3),
                   temp_str);
         HDassert(H5B2_INT_NREC(internal, hdr, u));
-        (void)(type->debug)(stream, f, dxpl_id, indent + 6, MAX (0, fwidth-6),
-            H5B2_INT_NREC(internal, hdr, u), dbg_ctx);
+        (void)(type->debug)(stream, indent + 6, MAX (0, fwidth-6), H5B2_INT_NREC(internal, hdr, u), dbg_ctx);
     } /* end for */
 
     /* Print final node pointer */
@@ -308,20 +293,17 @@ H5B2_int_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
 done:
     if(dbg_ctx && (type->dst_dbg_ctx)(dbg_ctx) < 0)
         HDONE_ERROR(H5E_BTREE, H5E_CANTRELEASE, FAIL, "unable to release v2 B-tree debugging context")
-    if(hdr) {
-        hdr->f = NULL;
-        if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, hdr_addr, hdr, H5AC__NO_FLAGS_SET) < 0)
-            HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release B-tree header")
-    } /* end if */
+    if(hdr && H5B2__hdr_unprotect(hdr, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release v2 B-tree header")
     if(internal && H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, addr, internal, H5AC__NO_FLAGS_SET) < 0)
         HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release B-tree internal node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_int_debug() */
+} /* end H5B2__int_debug() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_leaf_debug
+ * Function:	H5B2__leaf_debug
  *
  * Purpose:	Prints debugging info about a B-tree leaf node
  *
@@ -334,18 +316,17 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_leaf_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int fwidth,
+H5B2__leaf_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int fwidth,
     const H5B2_class_t *type, haddr_t hdr_addr, unsigned nrec, haddr_t obj_addr)
 {
     H5B2_hdr_t	*hdr = NULL;            /* B-tree header */
     H5B2_leaf_t	*leaf = NULL;           /* B-tree leaf node */
-    H5B2_hdr_cache_ud_t cache_udata;    /* User-data for callback */
     void        *dbg_ctx = NULL;	/* v2 B-tree debugging context */
     unsigned	u;                      /* Local index variable */
     char        temp_str[128];          /* Temporary string, for formatting */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_PACKAGE
 
     /*
      * Check arguments.
@@ -363,19 +344,14 @@ H5B2_leaf_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
     HDassert(nrec > 0);
 
     /* Check for debugging context callback available */
-    if(type->crt_dbg_ctx) {
+    if(type->crt_dbg_ctx)
         /* Create debugging context */
         if(NULL == (dbg_ctx = (type->crt_dbg_ctx)(f, dxpl_id, obj_addr)))
 	    HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "unable to create v2 B-tree debugging context")
-    } /* end if */
 
-    /*
-     * Load the B-tree header.
-     */
-    cache_udata.f = f;
-    cache_udata.ctx_udata = dbg_ctx;
-    if(NULL == (hdr = (H5B2_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, hdr_addr, &cache_udata, H5AC_READ)))
-	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree header")
+    /* Load the B-tree header */
+    if(NULL == (hdr = H5B2__hdr_protect(f, dxpl_id, hdr_addr, dbg_ctx, H5AC__READ_ONLY_FLAG)))
+	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect v2 B-tree header")
 
     /* Set file pointer for this B-tree operation */
     hdr->f = f;
@@ -383,7 +359,8 @@ H5B2_leaf_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
     /*
      * Load the B-tree leaf node
      */
-    if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, addr, nrec, H5AC_READ)))
+    H5_CHECK_OVERFLOW(nrec, unsigned, uint16_t);
+    if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, addr, NULL, (uint16_t)nrec, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
     /* Print opening message */
@@ -394,12 +371,12 @@ H5B2_leaf_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
      */
     HDfprintf(stream, "%*s%-*s %s (%u)\n", indent, "", fwidth,
 	      "Tree type ID:", hdr->cls->name, (unsigned)hdr->cls->id);
-    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
 	      "Size of node:",
-	      hdr->node_size);
-    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      (unsigned)hdr->node_size);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
 	      "Size of raw (disk) record:",
-	      hdr->rrec_size);
+	      (unsigned)hdr->rrec_size);
     HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
 	      "Dirty flag:",
 	      leaf->cache_info.is_dirty ? "True" : "False");
@@ -414,21 +391,17 @@ H5B2_leaf_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
         HDfprintf(stream, "%*s%-*s\n", indent + 3, "", MAX(0, fwidth - 3),
                   temp_str);
         HDassert(H5B2_LEAF_NREC(leaf, hdr, u));
-        (void)(type->debug)(stream, f, dxpl_id, indent + 6, MAX (0, fwidth-6),
-            H5B2_LEAF_NREC(leaf, hdr, u), dbg_ctx);
+        (void)(type->debug)(stream, indent + 6, MAX (0, fwidth-6), H5B2_LEAF_NREC(leaf, hdr, u), dbg_ctx);
     } /* end for */
 
 done:
     if(dbg_ctx && (type->dst_dbg_ctx)(dbg_ctx) < 0)
         HDONE_ERROR(H5E_BTREE, H5E_CANTRELEASE, FAIL, "unable to release v2 B-tree debugging context")
-    if(hdr) {
-        hdr->f = NULL;
-        if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, hdr_addr, hdr, H5AC__NO_FLAGS_SET) < 0)
-            HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release B-tree header")
-    } /* end if */
+    if(hdr && H5B2__hdr_unprotect(hdr, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release B-tree header")
     if(leaf && H5AC_unprotect(f, dxpl_id, H5AC_BT2_LEAF, addr, leaf, H5AC__NO_FLAGS_SET) < 0)
         HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release B-tree leaf node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_leaf_debug() */
+} /* end H5B2__leaf_debug() */
 
diff --git a/src/H5B2hdr.c b/src/H5B2hdr.c
index d28c263..414d3c3 100644
--- a/src/H5B2hdr.c
+++ b/src/H5B2hdr.c
@@ -28,7 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5B2_PACKAGE		/*suppress error about including H5B2pkg  */
+#include "H5B2module.h"         /* This source code file is part of the H5B2 module */
+
 
 /***********/
 /* Headers */
@@ -94,7 +95,7 @@ H5FL_SEQ_DEFINE(H5B2_node_info_t);
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_hdr_init
+ * Function:	H5B2__hdr_init
  *
  * Purpose:	Allocate & initialize B-tree header info
  *
@@ -107,7 +108,7 @@ H5FL_SEQ_DEFINE(H5B2_node_info_t);
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_hdr_init(H5B2_hdr_t *hdr, const H5B2_create_t *cparam, void *ctx_udata,
+H5B2__hdr_init(H5B2_hdr_t *hdr, const H5B2_create_t *cparam, void *ctx_udata,
     uint16_t depth)
 {
     size_t sz_max_nrec;                 /* Temporary variable for range checking */
@@ -115,7 +116,7 @@ H5B2_hdr_init(H5B2_hdr_t *hdr, const H5B2_create_t *cparam, void *ctx_udata,
     unsigned u;                         /* Local index variable */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /*
      * Check arguments.
@@ -132,6 +133,7 @@ H5B2_hdr_init(H5B2_hdr_t *hdr, const H5B2_create_t *cparam, void *ctx_udata,
     HDassert(cparam->merge_percent < (cparam->split_percent / 2));
 
     /* Initialize basic information */
+    hdr->parent = NULL;
     hdr->rc = 0;
     hdr->pending_delete = FALSE;
 
@@ -207,23 +209,32 @@ HDmemset(hdr->page, 0, hdr->node_size);
         } /* end for */
     } /* end if */
 
+    /* Determine if we are doing SWMR writes.  Only enable for data chunks for
+     * now. */
+    hdr->swmr_write = (H5F_INTENT(hdr->f) & H5F_ACC_SWMR_WRITE) > 0
+            && (hdr->cls->id == H5B2_CDSET_ID
+            || hdr->cls->id == H5B2_CDSET_FILT_ID);
+
+    /* Clear the shadowed list pointers */
+    hdr->shadowed_leaf = NULL;
+    hdr->shadowed_internal = NULL;
+
     /* Create the callback context, if the callback exists */
-    if(hdr->cls->crt_context) {
+    if(hdr->cls->crt_context)
         if(NULL == (hdr->cb_ctx = (*hdr->cls->crt_context)(ctx_udata)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTCREATE, FAIL, "unable to create v2 B-tree client callback context")
-    } /* end if */
 
 done:
     if(ret_value < 0)
-        if(H5B2_hdr_free(hdr) < 0)
+        if(H5B2__hdr_free(hdr) < 0)
             HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free shared v2 B-tree info")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_hdr_init() */
+} /* end H5B2__hdr_init() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_hdr_alloc
+ * Function:	H5B2__hdr_alloc
  *
  * Purpose:	Allocate B-tree header
  *
@@ -236,12 +247,12 @@ done:
  *-------------------------------------------------------------------------
  */
 H5B2_hdr_t *
-H5B2_hdr_alloc(H5F_t *f)
+H5B2__hdr_alloc(H5F_t *f)
 {
     H5B2_hdr_t *hdr = NULL;             /* v2 B-tree header */
-    H5B2_hdr_t *ret_value;              /* Return value */
+    H5B2_hdr_t *ret_value = NULL;       /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /*
      * Check arguments.
@@ -256,7 +267,7 @@ H5B2_hdr_alloc(H5F_t *f)
     hdr->f = f;
     hdr->sizeof_addr = H5F_SIZEOF_ADDR(f);
     hdr->sizeof_size = H5F_SIZEOF_SIZE(f);
-    hdr->hdr_size = H5B2_HEADER_SIZE(hdr);
+    hdr->hdr_size = H5B2_HEADER_SIZE_HDR(hdr);
     hdr->root.addr = HADDR_UNDEF;
 
     /* Set return value */
@@ -265,11 +276,11 @@ H5B2_hdr_alloc(H5F_t *f)
 done:
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_hdr_alloc() */
+} /* end H5B2__hdr_alloc() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_hdr_create
+ * Function:	H5B2__hdr_create
  *
  * Purpose:	Create new fractal heap header
  *
@@ -282,13 +293,13 @@ done:
  *-------------------------------------------------------------------------
  */
 haddr_t
-H5B2_hdr_create(H5F_t *f, hid_t dxpl_id, const H5B2_create_t *cparam,
+H5B2__hdr_create(H5F_t *f, hid_t dxpl_id, const H5B2_create_t *cparam,
     void *ctx_udata)
 {
-    H5B2_hdr_t *hdr = NULL;     /* The new v2 B-tree header information */
-    haddr_t ret_value;          /* Return value */
+    H5B2_hdr_t *hdr = NULL;             /* The new v2 B-tree header information */
+    haddr_t ret_value = HADDR_UNDEF;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /*
      * Check arguments.
@@ -297,11 +308,11 @@ H5B2_hdr_create(H5F_t *f, hid_t dxpl_id, const H5B2_create_t *cparam,
     HDassert(cparam);
 
     /* Allocate v2 B-tree header */
-    if(NULL == (hdr = H5B2_hdr_alloc(f)))
+    if(NULL == (hdr = H5B2__hdr_alloc(f)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, HADDR_UNDEF, "allocation failed for B-tree header")
 
     /* Initialize shared B-tree info */
-    if(H5B2_hdr_init(hdr, cparam, ctx_udata, (uint16_t)0) < 0)
+    if(H5B2__hdr_init(hdr, cparam, ctx_udata, (uint16_t)0) < 0)
         HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, HADDR_UNDEF, "can't create shared B-tree info")
 
     /* Allocate space for the header on disk */
@@ -317,15 +328,15 @@ H5B2_hdr_create(H5F_t *f, hid_t dxpl_id, const H5B2_create_t *cparam,
 
 done:
     if(!H5F_addr_defined(ret_value) && hdr)
-        if(H5B2_hdr_free(hdr) < 0)
+        if(H5B2__hdr_free(hdr) < 0)
             HDONE_ERROR(H5E_BTREE, H5E_CANTRELEASE, HADDR_UNDEF, "unable to release v2 B-tree header")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_hdr_create() */
+} /* end H5B2__hdr_create() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_hdr_incr
+ * Function:	H5B2__hdr_incr
  *
  * Purpose:	Increment reference count on B-tree header
  *
@@ -338,11 +349,11 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_hdr_incr(H5B2_hdr_t *hdr)
+H5B2__hdr_incr(H5B2_hdr_t *hdr)
 {
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Sanity checks */
     HDassert(hdr);
@@ -357,11 +368,11 @@ H5B2_hdr_incr(H5B2_hdr_t *hdr)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_incr_hdr() */
+} /* end H5B2__hdr_incr() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_hdr_decr
+ * Function:	H5B2__hdr_decr
  *
  * Purpose:	Decrement reference count on B-tree header
  *
@@ -374,11 +385,11 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_hdr_decr(H5B2_hdr_t *hdr)
+H5B2__hdr_decr(H5B2_hdr_t *hdr)
 {
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Sanity check */
     HDassert(hdr);
@@ -394,11 +405,11 @@ H5B2_hdr_decr(H5B2_hdr_t *hdr)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_hdr_decr() */
+} /* end H5B2__hdr_decr() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5B2_hdr_fuse_incr
+ * Function:	H5B2__hdr_fuse_incr
  *
  * Purpose:     Increment file reference count on shared v2 B-tree header
  *
@@ -411,7 +422,7 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_hdr_fuse_incr(H5B2_hdr_t *hdr)
+H5B2__hdr_fuse_incr(H5B2_hdr_t *hdr)
 {
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -422,11 +433,11 @@ H5B2_hdr_fuse_incr(H5B2_hdr_t *hdr)
     hdr->file_rc++;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5B2_hdr_fuse_incr() */
+} /* end H5B2__hdr_fuse_incr() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5B2_hdr_fuse_decr
+ * Function:	H5B2__hdr_fuse_decr
  *
  * Purpose:     Decrement file reference count on shared v2 B-tree header
  *
@@ -439,7 +450,7 @@ H5B2_hdr_fuse_incr(H5B2_hdr_t *hdr)
  *-------------------------------------------------------------------------
  */
 size_t
-H5B2_hdr_fuse_decr(H5B2_hdr_t *hdr)
+H5B2__hdr_fuse_decr(H5B2_hdr_t *hdr)
 {
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -451,11 +462,11 @@ H5B2_hdr_fuse_decr(H5B2_hdr_t *hdr)
     hdr->file_rc--;
 
     FUNC_LEAVE_NOAPI(hdr->file_rc)
-} /* end H5B2_hdr_fuse_decr() */
+} /* end H5B2__hdr_fuse_decr() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_hdr_dirty
+ * Function:	H5B2__hdr_dirty
  *
  * Purpose:	Mark B-tree header as dirty
  *
@@ -468,11 +479,11 @@ H5B2_hdr_fuse_decr(H5B2_hdr_t *hdr)
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_hdr_dirty(H5B2_hdr_t *hdr)
+H5B2__hdr_dirty(H5B2_hdr_t *hdr)
 {
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Sanity check */
     HDassert(hdr);
@@ -483,11 +494,87 @@ H5B2_hdr_dirty(H5B2_hdr_t *hdr)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_hdr_dirty() */
+} /* end H5B2__hdr_dirty() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__hdr_protect
+ *
+ * Purpose:	Convenience wrapper around protecting v2 B-tree header
+ *
+ * Return:	Non-NULL pointer to header on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec 18 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+H5B2_hdr_t *
+H5B2__hdr_protect(H5F_t *f, hid_t dxpl_id, haddr_t hdr_addr, void *ctx_udata,
+    unsigned flags)
+{
+    H5B2_hdr_cache_ud_t udata;          /* User data for cache callbacks */
+    H5B2_hdr_t *ret_value = NULL;       /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(H5F_addr_defined(hdr_addr));
+
+    /* only the H5AC__READ_ONLY_FLAG may appear in flags */
+    HDassert((flags & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
+    /* Set up user data for cache callbacks */
+    udata.f = f;
+    udata.addr = hdr_addr;
+    udata.ctx_udata = ctx_udata;
+
+    /* Protect the header */
+    if(NULL == (ret_value = (H5B2_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, hdr_addr, &udata, flags)))
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, NULL, "unable to load v2 B-tree header, address = %llu", (unsigned long long)hdr_addr)
+    ret_value->f = f;   /* (Must be set again here, in case the header was already in the cache -QAK) */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__hdr_protect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5B2__hdr_unprotect
+ *
+ * Purpose:	Convenience wrapper around unprotecting v2 B-tree header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Dec 18 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2__hdr_unprotect(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned cache_flags)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* Unprotect the header */
+    if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_HDR, hdr->addr, hdr, cache_flags) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to unprotect v2 B-tree header, address = %llu", (unsigned long long)hdr->addr)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__hdr_unprotect() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_hdr_free
+ * Function:	H5B2__hdr_free
  *
  * Purpose:	Free B-tree header info
  *
@@ -500,11 +587,11 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_hdr_free(H5B2_hdr_t *hdr)
+H5B2__hdr_free(H5B2_hdr_t *hdr)
 {
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Sanity check */
     HDassert(hdr);
@@ -557,11 +644,11 @@ H5B2_hdr_free(H5B2_hdr_t *hdr)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_hdr_free() */
+} /* end H5B2__hdr_free() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_hdr_delete
+ * Function:	H5B2__hdr_delete
  *
  * Purpose:	Delete a v2 B-tree, starting with the header
  *
@@ -574,12 +661,12 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_hdr_delete(H5B2_hdr_t *hdr, hid_t dxpl_id)
+H5B2__hdr_delete(H5B2_hdr_t *hdr, hid_t dxpl_id)
 {
     unsigned cache_flags = H5AC__NO_FLAGS_SET;  /* Flags for unprotecting v2 B-tree header */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_PACKAGE
 
     /* Sanity check */
     HDassert(hdr);
@@ -600,7 +687,7 @@ H5B2_hdr_delete(H5B2_hdr_t *hdr, hid_t dxpl_id)
 
     /* Delete all nodes in B-tree */
     if(H5F_addr_defined(hdr->root.addr))
-        if(H5B2_delete_node(hdr, dxpl_id, hdr->depth, &hdr->root, hdr->remove_op, hdr->remove_op_data) < 0)
+        if(H5B2__delete_node(hdr, dxpl_id, hdr->depth, &hdr->root, hdr, hdr->remove_op, hdr->remove_op_data) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to delete B-tree nodes")
 
     /* Indicate that the heap header should be deleted & file space freed */
@@ -608,9 +695,9 @@ H5B2_hdr_delete(H5B2_hdr_t *hdr, hid_t dxpl_id)
 
 done:
     /* Unprotect the header with appropriate flags */
-    if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_HDR, hdr->addr, hdr, cache_flags) < 0)
-        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree header")
+    if(H5B2__hdr_unprotect(hdr, dxpl_id, cache_flags) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release v2 B-tree header")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_hdr_delete() */
+} /* end H5B2__hdr_delete() */
 
diff --git a/src/H5B2int.c b/src/H5B2int.c
index 01403eb..a33b8c3 100644
--- a/src/H5B2int.c
+++ b/src/H5B2int.c
@@ -28,7 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5B2_PACKAGE		/*suppress error about including H5B2pkg  */
+#include "H5B2module.h"         /* This source code file is part of the H5B2 module */
+
 
 /***********/
 /* Headers */
@@ -61,29 +62,33 @@
 /********************/
 
 /* Helper functions */
-static herr_t H5B2_create_internal(H5B2_hdr_t *hdr, hid_t dxpl_id,
-    H5B2_node_ptr_t *node_ptr, unsigned depth);
-static herr_t H5B2_split1(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+static herr_t H5B2__split1(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
     H5B2_node_ptr_t *curr_node_ptr, unsigned *parent_cache_info_flags_ptr,
     H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx);
-static herr_t H5B2_redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+static herr_t H5B2__redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
     H5B2_internal_t *internal, unsigned idx);
-static herr_t H5B2_redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+static herr_t H5B2__redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
     H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx);
-static herr_t H5B2_merge2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+static herr_t H5B2__merge2(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
     H5B2_node_ptr_t *curr_node_ptr, unsigned *parent_cache_info_flags_ptr,
     H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx);
-static herr_t H5B2_merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+static herr_t H5B2__merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
     H5B2_node_ptr_t *curr_node_ptr, unsigned *parent_cache_info_flags_ptr,
     H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx);
-static herr_t H5B2_swap_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
-    H5B2_internal_t *internal, unsigned *internal_flags_ptr,
-    unsigned idx, void *swap_loc);
+static herr_t H5B2__swap_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
+    H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx,
+    void *swap_loc);
+static herr_t H5B2__shadow_internal(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    uint16_t depth, H5B2_node_ptr_t *curr_node_ptr, H5B2_internal_t **internal);
+static herr_t H5B2__shadow_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    H5B2_node_ptr_t *curr_node_ptr, H5B2_leaf_t **leaf);
+static herr_t H5B2__create_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, void *parent,
+    H5B2_node_ptr_t *node_ptr, uint16_t depth);
 #ifdef H5B2_DEBUG
-static herr_t H5B2_assert_leaf(const H5B2_hdr_t *hdr, const H5B2_leaf_t *leaf);
-static herr_t H5B2_assert_leaf2(const H5B2_hdr_t *hdr, const H5B2_leaf_t *leaf, const H5B2_leaf_t *leaf2);
-static herr_t H5B2_assert_internal(hsize_t parent_all_nrec, const H5B2_hdr_t *hdr, const H5B2_internal_t *internal);
-static herr_t H5B2_assert_internal2(hsize_t parent_all_nrec, const H5B2_hdr_t *hdr, const H5B2_internal_t *internal, const H5B2_internal_t *internal2);
+static herr_t H5B2__assert_leaf(const H5B2_hdr_t *hdr, const H5B2_leaf_t *leaf);
+static herr_t H5B2__assert_leaf2(const H5B2_hdr_t *hdr, const H5B2_leaf_t *leaf, const H5B2_leaf_t *leaf2);
+static herr_t H5B2__assert_internal(hsize_t parent_all_nrec, const H5B2_hdr_t *hdr, const H5B2_internal_t *internal);
+static herr_t H5B2__assert_internal2(hsize_t parent_all_nrec, const H5B2_hdr_t *hdr, const H5B2_internal_t *internal, const H5B2_internal_t *internal2);
 #endif /* H5B2_DEBUG */
 
 /*********************/
@@ -112,7 +117,7 @@ H5FL_SEQ_EXTERN(H5B2_node_info_t);
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_locate_record
+ * Function:	H5B2__locate_record
  *
  * Purpose:	Performs a binary search to locate a record in a sorted
  *              array of records.
@@ -133,14 +138,14 @@ H5FL_SEQ_EXTERN(H5B2_node_info_t);
  *-------------------------------------------------------------------------
  */
 int
-H5B2_locate_record(const H5B2_class_t *type, unsigned nrec, size_t *rec_off,
+H5B2__locate_record(const H5B2_class_t *type, unsigned nrec, size_t *rec_off,
     const uint8_t *native, const void *udata, unsigned *idx)
 {
     unsigned	lo = 0, hi;     /* Low & high index values */
     unsigned    my_idx = 0;     /* Final index value */
     int         cmp = -1;       /* Key comparison value */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_PACKAGE_NOERR
 
     hi = nrec;
     while(lo < hi && cmp) {
@@ -154,11 +159,11 @@ H5B2_locate_record(const H5B2_class_t *type, unsigned nrec, size_t *rec_off,
     *idx = my_idx;
 
     FUNC_LEAVE_NOAPI(cmp)
-} /* end H5B2_locate_record */
+} /* end H5B2__locate_record */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_split1
+ * Function:	H5B2__split1
  *
  * Purpose:	Perform a 1->2 node split
  *
@@ -172,22 +177,26 @@ H5B2_locate_record(const H5B2_class_t *type, unsigned nrec, size_t *rec_off,
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2_split1(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+H5B2__split1(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
     H5B2_node_ptr_t *curr_node_ptr, unsigned *parent_cache_info_flags_ptr,
     H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx)
 {
     const H5AC_class_t *child_class;    /* Pointer to child node's class info */
     haddr_t left_addr, right_addr;      /* Addresses of left & right child nodes */
     void *left_child = NULL, *right_child = NULL;     /* Pointers to child nodes */
+    const H5AC_class_t *grandchild_class; /* Pointer to grandchild node's class info */
+    haddr_t grandchild_addr;            /* Grandchild address */
+    void *grandchild = NULL;            /* Pointer to grandchild node */
     uint16_t *left_nrec, *right_nrec;   /* Pointers to child # of records */
     uint8_t *left_native, *right_native;/* Pointers to childs' native records */
     H5B2_node_ptr_t *left_node_ptrs = NULL, *right_node_ptrs = NULL;/* Pointers to childs' node pointer info */
     uint16_t mid_record;                /* Index of "middle" record in current node */
     uint16_t old_node_nrec;             /* Number of records in internal node split */
     unsigned left_child_flags = H5AC__NO_FLAGS_SET, right_child_flags = H5AC__NO_FLAGS_SET;     /* Flags for unprotecting child nodes */
+    unsigned u;                         /* Local index variable */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Check arguments. */
     HDassert(hdr);
@@ -206,7 +215,7 @@ H5B2_split1(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
 
         /* Create new internal node */
         internal->node_ptrs[idx + 1].all_nrec = internal->node_ptrs[idx + 1].node_nrec = 0;
-        if(H5B2_create_internal(hdr, dxpl_id, &(internal->node_ptrs[idx + 1]), (depth - 1)) < 0)
+        if(H5B2__create_internal(hdr, dxpl_id, internal, &(internal->node_ptrs[idx + 1]), (uint16_t)(depth - 1)) < 0)
 	    HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "unable to create new internal node")
 
         /* Setup information for unlocking child nodes */
@@ -215,11 +224,18 @@ H5B2_split1(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* Protect both leaves */
-        if(NULL == (left_int = H5B2_protect_internal(hdr, dxpl_id, left_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC_WRITE)))
+        if(NULL == (left_int = H5B2__protect_internal(hdr, dxpl_id, left_addr, internal, internal->node_ptrs[idx].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
-        if(NULL == (right_int = H5B2_protect_internal(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, (depth - 1), H5AC_WRITE)))
+        if(NULL == (right_int = H5B2__protect_internal(hdr, dxpl_id, right_addr, internal, internal->node_ptrs[idx + 1].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
 
+        /* Shadow the left node if doing SWMR writes */
+        if(hdr->swmr_write) {
+            if(H5B2__shadow_internal(hdr, dxpl_id, (uint16_t)(depth - 1), &(internal->node_ptrs[idx]), &left_int) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal node")
+            left_addr = internal->node_ptrs[idx].addr;
+        } /* end if */
+
         /* More setup for child nodes */
         left_child = left_int;
         right_child = right_int;
@@ -235,7 +251,7 @@ H5B2_split1(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
 
         /* Create new leaf node */
         internal->node_ptrs[idx + 1].all_nrec = internal->node_ptrs[idx + 1].node_nrec = 0;
-        if(H5B2_create_leaf(hdr, dxpl_id, &(internal->node_ptrs[idx + 1])) < 0)
+        if(H5B2__create_leaf(hdr, dxpl_id, internal, &(internal->node_ptrs[idx + 1])) < 0)
 	    HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "unable to create new leaf node")
 
         /* Setup information for unlocking child nodes */
@@ -244,11 +260,18 @@ H5B2_split1(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* Protect both leaves */
-        if(NULL == (left_leaf = H5B2_protect_leaf(hdr, dxpl_id, left_addr, internal->node_ptrs[idx].node_nrec, H5AC_WRITE)))
+        if(NULL == (left_leaf = H5B2__protect_leaf(hdr, dxpl_id, left_addr, internal, internal->node_ptrs[idx].node_nrec, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
-        if(NULL == (right_leaf = H5B2_protect_leaf(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, H5AC_WRITE)))
+        if(NULL == (right_leaf = H5B2__protect_leaf(hdr, dxpl_id, right_addr, internal, internal->node_ptrs[idx + 1].node_nrec, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
+        /* Shadow the left node if doing SWMR writes */
+        if(hdr->swmr_write) {
+            if(H5B2__shadow_leaf(hdr, dxpl_id, &(internal->node_ptrs[idx]), &left_leaf) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal node")
+            left_addr = internal->node_ptrs[idx].addr;
+        } /* end if */
+
         /* More setup for child nodes */
         left_child = left_leaf;
         right_child = right_leaf;
@@ -287,7 +310,6 @@ H5B2_split1(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
 
     /* Determine total number of records in new child nodes */
     if(depth > 1) {
-        unsigned u;             /* Local index variable */
         hsize_t new_left_all_nrec;     /* New total number of records in left child */
         hsize_t new_right_all_nrec;    /* New total number of records in right child */
 
@@ -321,15 +343,74 @@ H5B2_split1(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
     if(parent_cache_info_flags_ptr)
         *parent_cache_info_flags_ptr |= H5AC__DIRTIED_FLAG;
 
+    /* Update flush dependencies */
+    if(hdr->swmr_write) {
+
+        /* Update node pointers */
+        if(depth > 1) {
+            /* Loop over grandchildren */
+            for(u = 0; u < (*right_nrec + (unsigned)1); u++) {
+                hbool_t update_deps = FALSE;    /* Whether to update flush dependencies */
+
+                grandchild_addr = right_node_ptrs[u].addr;
+                if(depth > 2) {
+                    H5B2_internal_t *grandchild_int = NULL;
+
+                    /* Protect grandchild */
+                    if(NULL == (grandchild_int = H5B2__protect_internal(hdr, dxpl_id, grandchild_addr, right_child, right_node_ptrs[u].node_nrec, (uint16_t)(depth - 2), H5AC__NO_FLAGS_SET)))
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+                    grandchild_class = H5AC_BT2_INT;
+                    grandchild = grandchild_int;
+
+                    if(grandchild_int->parent == left_child) {
+                        grandchild_int->parent = right_child;
+                        update_deps = TRUE;
+                    } /* end if */
+                    else
+                        HDassert(grandchild_int->parent == right_child);
+                } /* end if */
+                else {
+                    H5B2_leaf_t *grandchild_leaf = NULL;
+
+                    /* Protect grandchild */
+                    if(NULL == (grandchild_leaf = H5B2__protect_leaf(hdr, dxpl_id, grandchild_addr, right_child, right_node_ptrs[u].node_nrec, H5AC__NO_FLAGS_SET)))
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+                    grandchild_class = H5AC_BT2_LEAF;
+                    grandchild = grandchild_leaf;
+
+                    if(grandchild_leaf->parent == left_child) {
+                        grandchild_leaf->parent = right_child;
+                        update_deps = TRUE;
+                    } /* end if */
+                    else
+                        HDassert(grandchild_leaf->parent == right_child);
+                } /* end else */
+
+                /* Update flush dependencies if necessary */
+                if(update_deps) {
+                    if(H5B2__destroy_flush_depend((H5AC_info_t *)left_child, (H5AC_info_t *)grandchild) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+                    if(H5B2__create_flush_depend((H5AC_info_t *)right_child, (H5AC_info_t *)grandchild) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+                } /* end if */
+
+                /* Unprotect the grandchild */
+                if(H5AC_unprotect(hdr->f, dxpl_id, grandchild_class, right_node_ptrs[u].addr, grandchild, H5AC__NO_FLAGS_SET) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+                grandchild = NULL;
+            } /* end for */
+        } /* end if */
+    } /* end if */
+
 #ifdef H5B2_DEBUG
-    H5B2_assert_internal((hsize_t)0, hdr, internal);
+    H5B2__assert_internal((hsize_t)0, hdr, internal);
     if(depth > 1) {
-        H5B2_assert_internal2(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)left_child, (H5B2_internal_t *)right_child);
-        H5B2_assert_internal2(internal->node_ptrs[idx + 1].all_nrec, hdr, (H5B2_internal_t *)right_child, (H5B2_internal_t *)left_child);
+        H5B2__assert_internal2(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)left_child, (H5B2_internal_t *)right_child);
+        H5B2__assert_internal2(internal->node_ptrs[idx + 1].all_nrec, hdr, (H5B2_internal_t *)right_child, (H5B2_internal_t *)left_child);
     } /* end if */
     else {
-        H5B2_assert_leaf2(hdr, (H5B2_leaf_t *)left_child, (H5B2_leaf_t *)right_child);
-        H5B2_assert_leaf(hdr, (H5B2_leaf_t *)right_child);
+        H5B2__assert_leaf2(hdr, (H5B2_leaf_t *)left_child, (H5B2_leaf_t *)right_child);
+        H5B2__assert_leaf(hdr, (H5B2_leaf_t *)right_child);
     } /* end else */
 #endif /* H5B2_DEBUG */
 
@@ -340,12 +421,23 @@ done:
     if(right_child && H5AC_unprotect(hdr->f, dxpl_id, child_class, right_addr, right_child, right_child_flags) < 0)
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree leaf node")
 
+    /* Release grandchild node if protected (only on error) */
+    if(grandchild && H5AC_unprotect(hdr->f, dxpl_id, grandchild_class, left_node_ptrs[u].addr, grandchild, H5AC__NO_FLAGS_SET) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+    /* Unprotect the grandchild on error */
+    if(grandchild) {
+        HDassert(ret_value < 0);
+        if(H5AC_unprotect(hdr->f, dxpl_id, grandchild_class, grandchild_addr, grandchild, H5AC__NO_FLAGS_SET) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+    } /* end if */
+
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_split1() */
+} /* end H5B2__split1() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_split_root
+ * Function:	H5B2__split_root
  *
  * Purpose:	Split the root node
  *
@@ -359,7 +451,7 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_split_root(H5B2_hdr_t *hdr, hid_t dxpl_id)
+H5B2__split_root(H5B2_hdr_t *hdr, hid_t dxpl_id)
 {
     H5B2_internal_t *new_root = NULL;   /* Pointer to new root node */
     unsigned new_root_flags = H5AC__NO_FLAGS_SET;   /* Cache flags for new root node */
@@ -368,7 +460,7 @@ H5B2_split_root(H5B2_hdr_t *hdr, hid_t dxpl_id)
     unsigned u_max_nrec_size;           /* Temporary variable for range checking */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
@@ -399,18 +491,18 @@ H5B2_split_root(H5B2_hdr_t *hdr, hid_t dxpl_id)
 
     /* Create new internal node to use as root */
     hdr->root.node_nrec = 0;
-    if(H5B2_create_internal(hdr, dxpl_id, &(hdr->root), hdr->depth) < 0)
+    if(H5B2__create_internal(hdr, dxpl_id, hdr, &(hdr->root), hdr->depth) < 0)
         HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "unable to create new internal node")
 
     /* Protect new root node */
-    if(NULL == (new_root = H5B2_protect_internal(hdr, dxpl_id, hdr->root.addr, hdr->root.node_nrec, hdr->depth, H5AC_WRITE)))
+    if(NULL == (new_root = H5B2__protect_internal(hdr, dxpl_id, hdr->root.addr, hdr, hdr->root.node_nrec, hdr->depth, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
 
     /* Set first node pointer in root node to old root node pointer info */
     new_root->node_ptrs[0] = old_root_ptr;
 
     /* Split original root node */
-    if(H5B2_split1(hdr, dxpl_id, hdr->depth, &(hdr->root), NULL, new_root, &new_root_flags, 0) < 0)
+    if(H5B2__split1(hdr, dxpl_id, hdr->depth, &(hdr->root), NULL, new_root, &new_root_flags, 0) < 0)
         HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to split old root node")
 
 done:
@@ -419,11 +511,11 @@ done:
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree internal node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_split_root() */
+} /* end H5B2__split_root() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_redistribute2
+ * Function:	H5B2__redistribute2
  *
  * Purpose:	Redistribute records between two nodes
  *
@@ -437,20 +529,24 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2_redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+H5B2__redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
     H5B2_internal_t *internal, unsigned idx)
 {
     const H5AC_class_t *child_class;    /* Pointer to child node's class info */
     haddr_t left_addr, right_addr;      /* Addresses of left & right child nodes */
     void *left_child = NULL, *right_child = NULL;     /* Pointers to child nodes */
+    const H5AC_class_t *grandchild_class; /* Pointer to grandchild node's class info */
+    haddr_t grandchild_addr;            /* Grandchild address */
+    void *grandchild = NULL;            /* Pointer to grandchild node */
     uint16_t *left_nrec, *right_nrec;   /* Pointers to child # of records */
     uint8_t *left_native, *right_native;    /* Pointers to childs' native records */
     H5B2_node_ptr_t *left_node_ptrs = NULL, *right_node_ptrs = NULL;/* Pointers to childs' node pointer info */
     hssize_t left_moved_nrec = 0, right_moved_nrec = 0; /* Number of records moved, for internal redistrib */
     unsigned left_child_flags = H5AC__NO_FLAGS_SET, right_child_flags = H5AC__NO_FLAGS_SET;     /* Flags for unprotecting child nodes */
+    unsigned u;                         /* Local index variable */
     herr_t ret_value = SUCCEED;           /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Check arguments. */
     HDassert(hdr);
@@ -467,11 +563,21 @@ H5B2_redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* Lock left & right B-tree child nodes */
-        if(NULL == (left_internal = H5B2_protect_internal(hdr, dxpl_id, left_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC_WRITE)))
+        if(NULL == (left_internal = H5B2__protect_internal(hdr, dxpl_id, left_addr, internal, internal->node_ptrs[idx].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
-        if(NULL == (right_internal = H5B2_protect_internal(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, (depth - 1), H5AC_WRITE)))
+        if(NULL == (right_internal = H5B2__protect_internal(hdr, dxpl_id, right_addr, internal, internal->node_ptrs[idx + 1].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
+        /* Shadow both nodes if doing SWMR writes */
+        if(hdr->swmr_write) {
+            if(H5B2__shadow_internal(hdr, dxpl_id, (uint16_t)(depth - 1), &(internal->node_ptrs[idx]), &left_internal) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal node")
+            if(H5B2__shadow_internal(hdr, dxpl_id, (uint16_t)(depth - 1), &(internal->node_ptrs[idx + 1]), &right_internal) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal node")
+            left_addr = internal->node_ptrs[idx].addr;
+            right_addr = internal->node_ptrs[idx + 1].addr;
+        } /* end if */
+
         /* More setup for child nodes */
         left_child = left_internal;
         right_child = right_internal;
@@ -492,11 +598,21 @@ H5B2_redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* Lock left & right B-tree child nodes */
-        if(NULL == (left_leaf = H5B2_protect_leaf(hdr, dxpl_id, left_addr, internal->node_ptrs[idx].node_nrec, H5AC_WRITE)))
+        if(NULL == (left_leaf = H5B2__protect_leaf(hdr, dxpl_id, left_addr, internal, internal->node_ptrs[idx].node_nrec, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
-        if(NULL == (right_leaf = H5B2_protect_leaf(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, H5AC_WRITE)))
+        if(NULL == (right_leaf = H5B2__protect_leaf(hdr, dxpl_id, right_addr, internal, internal->node_ptrs[idx + 1].node_nrec, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
+        /* Shadow both nodes if doing SWMR writes */
+        if(hdr->swmr_write) {
+            if(H5B2__shadow_leaf(hdr, dxpl_id, &(internal->node_ptrs[idx]), &left_leaf) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow leaf node")
+            if(H5B2__shadow_leaf(hdr, dxpl_id, &(internal->node_ptrs[idx + 1]), &right_leaf) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow leaf node")
+            left_addr = internal->node_ptrs[idx].addr;
+            right_addr = internal->node_ptrs[idx + 1].addr;
+        } /* end if */
+
         /* More setup for child nodes */
         left_child = left_leaf;
         right_child = right_leaf;
@@ -507,14 +623,14 @@ H5B2_redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
     } /* end else */
 
 #ifdef H5B2_DEBUG
-    H5B2_assert_internal((hsize_t)0, hdr, internal);
+    H5B2__assert_internal((hsize_t)0, hdr, internal);
     if(depth > 1) {
-        H5B2_assert_internal2(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)left_child, (H5B2_internal_t *)right_child);
-        H5B2_assert_internal2(internal->node_ptrs[idx + 1].all_nrec, hdr, (H5B2_internal_t *)right_child, (H5B2_internal_t *)left_child);
+        H5B2__assert_internal2(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)left_child, (H5B2_internal_t *)right_child);
+        H5B2__assert_internal2(internal->node_ptrs[idx + 1].all_nrec, hdr, (H5B2_internal_t *)right_child, (H5B2_internal_t *)left_child);
     } /* end if */
     else {
-        H5B2_assert_leaf2(hdr, (H5B2_leaf_t *)left_child, (H5B2_leaf_t *)right_child);
-        H5B2_assert_leaf(hdr, (H5B2_leaf_t *)right_child);
+        H5B2__assert_leaf2(hdr, (H5B2_leaf_t *)left_child, (H5B2_leaf_t *)right_child);
+        H5B2__assert_leaf(hdr, (H5B2_leaf_t *)right_child);
     } /* end else */
 #endif /* H5B2_DEBUG */
 
@@ -540,23 +656,80 @@ H5B2_redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
 
         /* Handle node pointers, if we have an internal node */
         if(depth > 1) {
-            hsize_t moved_nrec=move_nrec;   /* Total number of records moved, for internal redistrib */
-            unsigned u;             /* Local index variable */
+            hsize_t moved_nrec = move_nrec;   /* Total number of records moved, for internal redistrib */
 
             /* Count the number of records being moved */
-            for(u=0; u<move_nrec; u++)
+            for(u = 0; u < move_nrec; u++)
                 moved_nrec += right_node_ptrs[u].all_nrec;
-
             H5_CHECKED_ASSIGN(left_moved_nrec, hssize_t, moved_nrec, hsize_t)
             right_moved_nrec -= (hssize_t)moved_nrec;
 
             /* Copy node pointers from right node to left */
-            HDmemcpy(&(left_node_ptrs[*left_nrec+1]),&(right_node_ptrs[0]),sizeof(H5B2_node_ptr_t)*move_nrec);
+            HDmemcpy(&(left_node_ptrs[*left_nrec + 1]), &(right_node_ptrs[0]), sizeof(H5B2_node_ptr_t) * move_nrec);
 
             /* Slide node pointers in right node down */
             HDmemmove(&(right_node_ptrs[0]), &(right_node_ptrs[move_nrec]), sizeof(H5B2_node_ptr_t) * (new_right_nrec + (unsigned)1));
         } /* end if */
 
+        /* Update flush dependencies */
+        if(hdr->swmr_write) {
+
+            /* Update node pointers */
+            if(depth > 1) {
+                /* Loop over grandchildren */
+                for(u = (*left_nrec + (unsigned)1); u < (*left_nrec + (unsigned)move_nrec + (unsigned)1); u++) {
+                    hbool_t update_deps = FALSE;    /* Whether to update flush dependencies */
+
+                    grandchild_addr = left_node_ptrs[u].addr;
+                    if(depth > 2) {
+                        H5B2_internal_t *grandchild_int = NULL;
+
+                        /* Protect grandchild */
+                        if(NULL == (grandchild_int = H5B2__protect_internal(hdr, dxpl_id, grandchild_addr, left_child, left_node_ptrs[u].node_nrec, (uint16_t)(depth - 2), H5AC__NO_FLAGS_SET)))
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+                        grandchild_class = H5AC_BT2_INT;
+                        grandchild = grandchild_int;
+
+                        if(grandchild_int->parent == right_child) {
+                            grandchild_int->parent = left_child;
+                            update_deps = TRUE;
+                        } /* end if */
+                        else
+                            HDassert(grandchild_int->parent == left_child);
+                    } /* end if */
+                    else {
+                        H5B2_leaf_t *grandchild_leaf = NULL;
+
+                        /* Protect grandchild */
+                        if(NULL == (grandchild_leaf = H5B2__protect_leaf(hdr, dxpl_id, grandchild_addr, left_child, left_node_ptrs[u].node_nrec, H5AC__NO_FLAGS_SET)))
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+                        grandchild_class = H5AC_BT2_LEAF;
+                        grandchild = grandchild_leaf;
+
+                        if(grandchild_leaf->parent == right_child) {
+                            grandchild_leaf->parent = left_child;
+                            update_deps = TRUE;
+                        } /* end if */
+                        else
+                            HDassert(grandchild_leaf->parent == left_child);
+                    } /* end else */
+
+                    /* Update flush dependencies if necessary */
+                    if(update_deps) {
+                        if(H5B2__destroy_flush_depend((H5AC_info_t *)right_child, (H5AC_info_t *)grandchild) < 0)
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+                        if(H5B2__create_flush_depend((H5AC_info_t *)left_child, (H5AC_info_t *)grandchild) < 0)
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+                    } /* end if */
+
+                    /* Unprotect the grandchild */
+                    if(H5AC_unprotect(hdr->f, dxpl_id, grandchild_class, left_node_ptrs[u].addr, grandchild, H5AC__NO_FLAGS_SET) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+                    grandchild = NULL;
+                } /* end for */
+            } /* end if */
+        } /* end if */
+
         /* Update number of records in child nodes */
         *left_nrec = (uint16_t)(*left_nrec + move_nrec);
         *right_nrec = new_right_nrec;
@@ -571,6 +744,9 @@ H5B2_redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         uint16_t new_left_nrec = (uint16_t)(*left_nrec + *right_nrec) / 2;    /* New number of records for left child */
         uint16_t move_nrec = (uint16_t)(*left_nrec - new_left_nrec);        /* Number of records to move from left node to right */
 
+        /* Sanity check */
+        HDassert(*left_nrec > *right_nrec);
+
         /* Slide records in right node up */
         HDmemmove(H5B2_NAT_NREC(right_native, hdr, move_nrec),
                 H5B2_NAT_NREC(right_native, hdr, 0),
@@ -589,7 +765,6 @@ H5B2_redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         /* Handle node pointers, if we have an internal node */
         if(depth > 1) {
             hsize_t moved_nrec = move_nrec;   /* Total number of records moved, for internal redistrib */
-            unsigned u;             /* Local index variable */
 
             /* Slide node pointers in right node up */
             HDmemmove(&(right_node_ptrs[move_nrec]), &(right_node_ptrs[0]), sizeof(H5B2_node_ptr_t) * (size_t)(*right_nrec + 1));
@@ -600,11 +775,69 @@ H5B2_redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
             /* Count the number of records being moved */
             for(u = 0; u < move_nrec; u++)
                 moved_nrec += right_node_ptrs[u].all_nrec;
-
             left_moved_nrec -= (hssize_t)moved_nrec;
             H5_CHECKED_ASSIGN(right_moved_nrec, hssize_t, moved_nrec, hsize_t)
         } /* end if */
 
+        /* Update flush dependencies */
+        if(hdr->swmr_write) {
+
+            /* Update node pointers */
+            if(depth > 1) {
+                /* Loop over grandchildren */
+                for(u = 0; u < move_nrec; u++) {
+                    hbool_t update_deps = FALSE;    /* Whether to update flush dependencies */
+
+                    grandchild_addr = right_node_ptrs[u].addr;
+                    if(depth > 2) {
+                        H5B2_internal_t *grandchild_int = NULL;
+
+                        /* Protect grandchild */
+                        if(NULL == (grandchild_int = H5B2__protect_internal(hdr, dxpl_id, grandchild_addr, right_child, right_node_ptrs[u].node_nrec, (uint16_t)(depth - 2), H5AC__NO_FLAGS_SET)))
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+                        grandchild_class = H5AC_BT2_INT;
+                        grandchild = grandchild_int;
+
+                        if(grandchild_int->parent == left_child) {
+                            grandchild_int->parent = right_child;
+                            update_deps = TRUE;
+                        } /* end if */
+                        else
+                            HDassert(grandchild_int->parent == right_child);
+                    } /* end if */
+                    else {
+                        H5B2_leaf_t *grandchild_leaf = NULL;
+
+                        /* Protect grandchild */
+                        if(NULL == (grandchild_leaf = H5B2__protect_leaf(hdr, dxpl_id, grandchild_addr, right_child, right_node_ptrs[u].node_nrec, H5AC__NO_FLAGS_SET)))
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+                        grandchild_class = H5AC_BT2_LEAF;
+                        grandchild = grandchild_leaf;
+
+                        if(grandchild_leaf->parent == left_child) {
+                            grandchild_leaf->parent = right_child;
+                            update_deps = TRUE;
+                        } /* end if */
+                        else
+                            HDassert(grandchild_leaf->parent == right_child);
+                    } /* end else */
+
+                    /* Update flush dependencies if necessary */
+                    if(update_deps) {
+                        if(H5B2__destroy_flush_depend((H5AC_info_t *)left_child, (H5AC_info_t *)grandchild) < 0)
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+                        if(H5B2__create_flush_depend((H5AC_info_t *)right_child, (H5AC_info_t *)grandchild) < 0)
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+                    } /* end if */
+
+                    /* Unprotect the grandchild */
+                    if(H5AC_unprotect(hdr->f, dxpl_id, grandchild_class, right_node_ptrs[u].addr, grandchild, H5AC__NO_FLAGS_SET) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+                    grandchild = NULL;
+                } /* end for */
+            } /* end if */
+        } /* end if */
+
         /* Update number of records in child nodes */
         *left_nrec = new_left_nrec;
         *right_nrec = (uint16_t)(*right_nrec + move_nrec);
@@ -629,14 +862,14 @@ H5B2_redistribute2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
     } /* end else */
 
 #ifdef H5B2_DEBUG
-    H5B2_assert_internal((hsize_t)0, hdr, internal);
+    H5B2__assert_internal((hsize_t)0, hdr, internal);
     if(depth > 1) {
-        H5B2_assert_internal2(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)left_child, (H5B2_internal_t *)right_child);
-        H5B2_assert_internal2(internal->node_ptrs[idx + 1].all_nrec, hdr, (H5B2_internal_t *)right_child, (H5B2_internal_t *)left_child);
+        H5B2__assert_internal2(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)left_child, (H5B2_internal_t *)right_child);
+        H5B2__assert_internal2(internal->node_ptrs[idx + 1].all_nrec, hdr, (H5B2_internal_t *)right_child, (H5B2_internal_t *)left_child);
     } /* end if */
     else {
-        H5B2_assert_leaf2(hdr, (H5B2_leaf_t *)left_child, (H5B2_leaf_t *)right_child);
-        H5B2_assert_leaf(hdr, (H5B2_leaf_t *)right_child);
+        H5B2__assert_leaf2(hdr, (H5B2_leaf_t *)left_child, (H5B2_leaf_t *)right_child);
+        H5B2__assert_leaf(hdr, (H5B2_leaf_t *)right_child);
     } /* end else */
 #endif /* H5B2_DEBUG */
 
@@ -647,12 +880,23 @@ done:
     if(right_child && H5AC_unprotect(hdr->f, dxpl_id, child_class, right_addr, right_child, right_child_flags) < 0)
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node")
 
+    /* Release grandchild node if protected (only on error) */
+    if(grandchild && H5AC_unprotect(hdr->f, dxpl_id, grandchild_class, left_node_ptrs[u].addr, grandchild, H5AC__NO_FLAGS_SET) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+
+    /* Unprotect the grandchild on error */
+    if(grandchild) {
+        HDassert(ret_value < 0);
+        if(H5AC_unprotect(hdr->f, dxpl_id, grandchild_class, grandchild_addr, grandchild, H5AC__NO_FLAGS_SET) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+    } /* end if */
+
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_redistribute2() */
+} /* end H5B2__redistribute2() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_redistribute3
+ * Function:	H5B2__redistribute3
  *
  * Purpose:	Redistribute records between three nodes
  *
@@ -666,7 +910,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2_redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+H5B2__redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
     H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx)
 {
     H5B2_node_ptr_t *left_node_ptrs = NULL, *right_node_ptrs = NULL; /* Pointers to childs' node pointer info */
@@ -676,6 +920,9 @@ H5B2_redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
     haddr_t middle_addr;                /* Address of middle child node */
     void *left_child = NULL, *right_child = NULL;     /* Pointers to child nodes */
     void *middle_child = NULL;          /* Pointers to middle child node */
+    const H5AC_class_t *grandchild_class; /* Pointer to grandchild node's class info */
+    haddr_t grandchild_addr;            /* Grandchild address */
+    void *grandchild = NULL;            /* Pointer to grandchild node */
     uint16_t *left_nrec, *right_nrec;   /* Pointers to child # of records */
     uint16_t *middle_nrec;              /* Pointers to middle child # of records */
     uint8_t *left_native, *right_native;    /* Pointers to childs' native records */
@@ -684,9 +931,10 @@ H5B2_redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
     hssize_t middle_moved_nrec = 0;     /* Number of records moved, for internal split */
     unsigned left_child_flags = H5AC__NO_FLAGS_SET, right_child_flags = H5AC__NO_FLAGS_SET;     /* Flags for unprotecting child nodes */
     unsigned middle_child_flags = H5AC__NO_FLAGS_SET;     /* Flags for unprotecting child nodes */
+    unsigned u;                         /* Local index variable */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Check arguments. */
     HDassert(hdr);
@@ -706,13 +954,26 @@ H5B2_redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* Lock B-tree child nodes */
-        if(NULL == (left_internal = H5B2_protect_internal(hdr, dxpl_id, left_addr, internal->node_ptrs[idx - 1].node_nrec, (depth - 1), H5AC_WRITE)))
+        if(NULL == (left_internal = H5B2__protect_internal(hdr, dxpl_id, left_addr, internal, internal->node_ptrs[idx - 1].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
-        if(NULL == (middle_internal = H5B2_protect_internal(hdr, dxpl_id, middle_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC_WRITE)))
+        if(NULL == (middle_internal = H5B2__protect_internal(hdr, dxpl_id, middle_addr, internal, internal->node_ptrs[idx].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
-        if(NULL == (right_internal = H5B2_protect_internal(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, (depth - 1), H5AC_WRITE)))
+        if(NULL == (right_internal = H5B2__protect_internal(hdr, dxpl_id, right_addr, internal, internal->node_ptrs[idx + 1].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
 
+        /* Shadow all nodes if doing SWMR writes */
+        if(hdr->swmr_write) {
+            if(H5B2__shadow_internal(hdr, dxpl_id, (uint16_t)(depth - 1), &(internal->node_ptrs[idx - 1]), &left_internal) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal node")
+            if(H5B2__shadow_internal(hdr, dxpl_id, (uint16_t)(depth - 1), &(internal->node_ptrs[idx]), &middle_internal) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal node")
+            if(H5B2__shadow_internal(hdr, dxpl_id, (uint16_t)(depth - 1), &(internal->node_ptrs[idx + 1]), &right_internal) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal node")
+            left_addr = internal->node_ptrs[idx - 1].addr;
+            middle_addr = internal->node_ptrs[idx].addr;
+            right_addr = internal->node_ptrs[idx + 1].addr;
+        } /* end if */
+
         /* More setup for child nodes */
         left_child = left_internal;
         middle_child = middle_internal;
@@ -739,13 +1000,26 @@ H5B2_redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* Lock B-tree child nodes */
-        if(NULL == (left_leaf = H5B2_protect_leaf(hdr, dxpl_id, left_addr, internal->node_ptrs[idx - 1].node_nrec, H5AC_WRITE)))
+        if(NULL == (left_leaf = H5B2__protect_leaf(hdr, dxpl_id, left_addr, internal, internal->node_ptrs[idx - 1].node_nrec, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
-        if(NULL == (middle_leaf = H5B2_protect_leaf(hdr, dxpl_id, middle_addr, internal->node_ptrs[idx].node_nrec, H5AC_WRITE)))
+        if(NULL == (middle_leaf = H5B2__protect_leaf(hdr, dxpl_id, middle_addr, internal, internal->node_ptrs[idx].node_nrec, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
-        if(NULL == (right_leaf = H5B2_protect_leaf(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, H5AC_WRITE)))
+        if(NULL == (right_leaf = H5B2__protect_leaf(hdr, dxpl_id, right_addr, internal, internal->node_ptrs[idx + 1].node_nrec, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
+        /* Shadow all nodes if doing SWMR writes */
+        if(hdr->swmr_write) {
+            if(H5B2__shadow_leaf(hdr, dxpl_id, &(internal->node_ptrs[idx - 1]), &left_leaf) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow leaf node")
+            if(H5B2__shadow_leaf(hdr, dxpl_id, &(internal->node_ptrs[idx]), &middle_leaf) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow leaf node")
+            if(H5B2__shadow_leaf(hdr, dxpl_id, &(internal->node_ptrs[idx + 1]), &right_leaf) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow leaf node")
+            left_addr = internal->node_ptrs[idx - 1].addr;
+            middle_addr = internal->node_ptrs[idx].addr;
+            right_addr = internal->node_ptrs[idx + 1].addr;
+        } /* end if */
+
         /* More setup for child nodes */
         left_child = left_leaf;
         middle_child = middle_leaf;
@@ -795,7 +1069,6 @@ H5B2_redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
             if(depth > 1) {
                 hsize_t moved_nrec;         /* Total number of records moved, for internal redistrib */
                 unsigned move_nptrs;    /* Number of node pointers to move */
-                unsigned u;             /* Local index variable */
 
                 /* Move middle node pointers into left node */
                 move_nptrs = (unsigned)(new_left_nrec - *left_nrec);
@@ -811,6 +1084,65 @@ H5B2_redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
                 HDmemmove(&(middle_node_ptrs[0]), &(middle_node_ptrs[move_nptrs]), sizeof(H5B2_node_ptr_t) * ((*middle_nrec - move_nptrs) + 1));
             } /* end if */
 
+            /* Update flush dependencies */
+            if(hdr->swmr_write) {
+
+                /* Update node pointers */
+                if(depth > 1) {
+                    /* Loop over grandchildren */
+                    for(u = (*left_nrec + (unsigned)1); u < (*left_nrec + (unsigned)moved_middle_nrec + 1); u++) {
+                        hbool_t update_deps = FALSE;    /* Whether to update flush dependencies */
+
+                        grandchild_addr = left_node_ptrs[u].addr;
+                        if(depth > 2) {
+                            H5B2_internal_t *grandchild_int = NULL;
+
+                            /* Protect grandchild */
+                            if(NULL == (grandchild_int = H5B2__protect_internal(hdr, dxpl_id, grandchild_addr, left_child, left_node_ptrs[u].node_nrec, (uint16_t)(depth - 2), H5AC__NO_FLAGS_SET)))
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+                            grandchild_class = H5AC_BT2_INT;
+                            grandchild = grandchild_int;
+
+                            if(grandchild_int->parent == middle_child) {
+                                grandchild_int->parent = left_child;
+                                update_deps = TRUE;
+                            } /* end if */
+                            else
+                                HDassert(grandchild_int->parent == left_child);
+                        } /* end if */
+                        else {
+                            H5B2_leaf_t *grandchild_leaf = NULL;
+
+                            /* Protect grandchild */
+                            if(NULL == (grandchild_leaf = H5B2__protect_leaf(hdr, dxpl_id, grandchild_addr, left_child, left_node_ptrs[u].node_nrec, H5AC__NO_FLAGS_SET)))
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+                            grandchild_class = H5AC_BT2_LEAF;
+                            grandchild = grandchild_leaf;
+
+                            if(grandchild_leaf->parent == middle_child) {
+                                grandchild_leaf->parent = left_child;
+                                update_deps = TRUE;
+                            } /* end if */
+                            else
+                                HDassert(grandchild_leaf->parent == left_child);
+                        } /* end else */
+
+                        /* Update flush dependencies if necessary */
+                        if(update_deps) {
+                            if(H5B2__destroy_flush_depend((H5AC_info_t *)middle_child, (H5AC_info_t *)grandchild) < 0)
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+                            if(H5B2__create_flush_depend((H5AC_info_t *)left_child, (H5AC_info_t *)grandchild) < 0)
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+                        } /* end if */
+
+                        /* Unprotect the grandchild */
+                        if(H5AC_unprotect(hdr->f, dxpl_id, grandchild_class, left_node_ptrs[u].addr, grandchild, H5AC__NO_FLAGS_SET) < 0)
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+                        grandchild = NULL;
+                    } /* end for */
+                } /* end if */
+            } /* end if */
+
             /* Update the current number of records in middle node */
             curr_middle_nrec = (uint16_t)(curr_middle_nrec - moved_middle_nrec);
 
@@ -839,7 +1171,6 @@ H5B2_redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
             /* Move node pointers also if this is an internal node */
             if(depth > 1) {
                 hsize_t moved_nrec;         /* Total number of records moved, for internal redistrib */
-                unsigned u;             /* Local index variable */
 
                 /* Slide the node pointers in right node up */
                 HDmemmove(&(right_node_ptrs[right_nrec_move]), &(right_node_ptrs[0]), sizeof(H5B2_node_ptr_t) * (size_t)(*right_nrec + 1));
@@ -854,6 +1185,65 @@ H5B2_redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
                 middle_moved_nrec -= (hssize_t)(moved_nrec + right_nrec_move);
             } /* end if */
 
+            /* Update flush dependencies */
+            if(hdr->swmr_write) {
+
+                /* Update node pointers */
+                if(depth > 1) {
+                    /* Loop over grandchildren */
+                    for(u = 0; u < right_nrec_move; u++) {
+                        hbool_t update_deps = FALSE;    /* Whether to update flush dependencies */
+
+                        grandchild_addr = right_node_ptrs[u].addr;
+                        if(depth > 2) {
+                            H5B2_internal_t *grandchild_int = NULL;
+
+                            /* Protect grandchild */
+                            if(NULL == (grandchild_int = H5B2__protect_internal(hdr, dxpl_id, grandchild_addr, right_child, right_node_ptrs[u].node_nrec, (uint16_t)(depth - 2), H5AC__NO_FLAGS_SET)))
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+                            grandchild_class = H5AC_BT2_INT;
+                            grandchild = grandchild_int;
+
+                            if(grandchild_int->parent == middle_child) {
+                                grandchild_int->parent = right_child;
+                                update_deps = TRUE;
+                            } /* end if */
+                            else
+                                HDassert(grandchild_int->parent == right_child);
+                        } /* end if */
+                        else {
+                            H5B2_leaf_t *grandchild_leaf = NULL;
+
+                            /* Protect grandchild */
+                            if(NULL == (grandchild_leaf = H5B2__protect_leaf(hdr, dxpl_id, grandchild_addr, right_child, right_node_ptrs[u].node_nrec, H5AC__NO_FLAGS_SET)))
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+                            grandchild_class = H5AC_BT2_LEAF;
+                            grandchild = grandchild_leaf;
+
+                            if(grandchild_leaf->parent == middle_child) {
+                                grandchild_leaf->parent = right_child;
+                                update_deps = TRUE;
+                            } /* end if */
+                            else
+                                HDassert(grandchild_leaf->parent == right_child);
+                        } /* end else */
+
+                        /* Update flush dependencies if necessary */
+                        if(update_deps) {
+                            if(H5B2__destroy_flush_depend((H5AC_info_t *)middle_child, (H5AC_info_t *)grandchild) < 0)
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+                            if(H5B2__create_flush_depend((H5AC_info_t *)right_child, (H5AC_info_t *)grandchild) < 0)
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+                        } /* end if */
+
+                        /* Unprotect the grandchild */
+                        if(H5AC_unprotect(hdr->f, dxpl_id, grandchild_class, right_node_ptrs[u].addr, grandchild, H5AC__NO_FLAGS_SET) < 0)
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+                        grandchild = NULL;
+                    } /* end for */
+                } /* end if */
+            } /* end if */
+
             /* Update the current number of records in middle node */
             curr_middle_nrec = (uint16_t)(curr_middle_nrec - right_nrec_move);
 
@@ -882,7 +1272,6 @@ H5B2_redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
             /* Move node pointers also if this is an internal node */
             if(depth > 1) {
                 hsize_t moved_nrec;         /* Total number of records moved, for internal redistrib */
-                unsigned u;             /* Local index variable */
 
                 /* Slide the node pointers in middle node up */
                 HDmemmove(&(middle_node_ptrs[left_nrec_move]), &(middle_node_ptrs[0]), sizeof(H5B2_node_ptr_t) * (size_t)(curr_middle_nrec + 1));
@@ -897,6 +1286,65 @@ H5B2_redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
                 middle_moved_nrec += (hssize_t)(moved_nrec + left_nrec_move);
             } /* end if */
 
+            /* Update flush dependencies */
+            if(hdr->swmr_write) {
+
+                /* Update node pointers */
+                if(depth > 1) {
+                    /* Loop over grandchildren */
+                    for(u = 0; u < left_nrec_move; u++) {
+                        hbool_t update_deps = FALSE;    /* Whether to update flush dependencies */
+
+                        grandchild_addr = middle_node_ptrs[u].addr;
+                        if(depth > 2) {
+                            H5B2_internal_t *grandchild_int = NULL;
+
+                            /* Protect grandchild */
+                            if(NULL == (grandchild_int = H5B2__protect_internal(hdr, dxpl_id, grandchild_addr, middle_child, middle_node_ptrs[u].node_nrec, (uint16_t)(depth - 2), H5AC__NO_FLAGS_SET)))
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+                            grandchild_class = H5AC_BT2_INT;
+                            grandchild = grandchild_int;
+
+                            if(grandchild_int->parent == left_child) {
+                                grandchild_int->parent = middle_child;
+                                update_deps = TRUE;
+                            } /* end if */
+                            else
+                                HDassert(grandchild_int->parent == middle_child);
+                        } /* end if */
+                        else {
+                            H5B2_leaf_t *grandchild_leaf = NULL;
+
+                            /* Protect grandchild */
+                            if(NULL == (grandchild_leaf = H5B2__protect_leaf(hdr, dxpl_id, grandchild_addr, middle_child, middle_node_ptrs[u].node_nrec, H5AC__NO_FLAGS_SET)))
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+                            grandchild_class = H5AC_BT2_LEAF;
+                            grandchild = grandchild_leaf;
+
+                            if(grandchild_leaf->parent == left_child) {
+                                grandchild_leaf->parent = middle_child;
+                                update_deps = TRUE;
+                            } /* end if */
+                            else
+                                HDassert(grandchild_leaf->parent == middle_child);
+                        } /* end for */
+
+                        /* Update flush dependencies if necessary */
+                        if(update_deps) {
+                            if(H5B2__destroy_flush_depend((H5AC_info_t *)left_child, (H5AC_info_t *)grandchild) < 0)
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+                            if(H5B2__create_flush_depend((H5AC_info_t *)middle_child, (H5AC_info_t *)grandchild) < 0)
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+                        } /* end else */
+
+                        /* Unprotect the grandchild */
+                        if(H5AC_unprotect(hdr->f, dxpl_id, grandchild_class, middle_node_ptrs[u].addr, grandchild, H5AC__NO_FLAGS_SET) < 0)
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+                        grandchild = NULL;
+                    } /* end for */
+                } /* end if */
+            } /* end if */
+
             /* Update the current number of records in middle node */
             curr_middle_nrec = (uint16_t)(curr_middle_nrec + left_nrec_move);
 
@@ -924,7 +1372,6 @@ H5B2_redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
             /* Move node pointers also if this is an internal node */
             if(depth > 1) {
                 hsize_t moved_nrec;         /* Total number of records moved, for internal redistrib */
-                unsigned u;             /* Local index variable */
 
                 /* Move right node pointers into middle node */
                 HDmemcpy(&(middle_node_ptrs[curr_middle_nrec + 1]), &(right_node_ptrs[0]), sizeof(H5B2_node_ptr_t) * right_nrec_move);
@@ -939,6 +1386,65 @@ H5B2_redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
                 HDmemmove(&(right_node_ptrs[0]), &(right_node_ptrs[right_nrec_move]), sizeof(H5B2_node_ptr_t) * (size_t)(new_right_nrec + 1));
             } /* end if */
 
+            /* Update flush dependencies */
+            if(hdr->swmr_write) {
+
+                /* Update node pointers */
+                if(depth > 1) {
+                    /* Loop over grandchildren */
+                    for(u = (curr_middle_nrec + (unsigned)1); u < (curr_middle_nrec + right_nrec_move + 1); u++) {
+                        hbool_t update_deps = FALSE;    /* Whether to update flush dependencies */
+
+                        grandchild_addr = middle_node_ptrs[u].addr;
+                        if(depth > 2) {
+                            H5B2_internal_t *grandchild_int = NULL;
+
+                            /* Protect grandchild */
+                            if(NULL == (grandchild_int = H5B2__protect_internal(hdr, dxpl_id, grandchild_addr, middle_child, middle_node_ptrs[u].node_nrec, (uint16_t)(depth - 2), H5AC__NO_FLAGS_SET)))
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+                            grandchild_class = H5AC_BT2_INT;
+                            grandchild = grandchild_int;
+
+                            if(grandchild_int->parent == right_child) {
+                                grandchild_int->parent = middle_child;
+                                update_deps = TRUE;
+                            } /* end if */
+                            else
+                                HDassert(grandchild_int->parent == middle_child);
+                        } /* end if */
+                        else {
+                            H5B2_leaf_t *grandchild_leaf = NULL;
+
+                            /* Protect grandchild */
+                            if(NULL == (grandchild_leaf = H5B2__protect_leaf(hdr, dxpl_id, grandchild_addr, middle_child, middle_node_ptrs[u].node_nrec, H5AC__NO_FLAGS_SET)))
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+                            grandchild_class = H5AC_BT2_LEAF;
+                            grandchild = grandchild_leaf;
+
+                            if(grandchild_leaf->parent == right_child) {
+                                grandchild_leaf->parent = middle_child;
+                                update_deps = TRUE;
+                            } /* end if */
+                            else
+                                HDassert(grandchild_leaf->parent == middle_child);
+                        } /* end else */
+
+                        /* Update flush dependencies if necessary */
+                        if(update_deps) {
+                            if(H5B2__destroy_flush_depend((H5AC_info_t *)right_child, (H5AC_info_t *)grandchild) < 0)
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+                            if(H5B2__create_flush_depend((H5AC_info_t *)middle_child, (H5AC_info_t *)grandchild) < 0)
+                                HGOTO_ERROR(H5E_BTREE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+                        } /* end if */
+
+                        /* Unprotect the grandchild */
+                        if(H5AC_unprotect(hdr->f, dxpl_id, grandchild_class, middle_node_ptrs[u].addr, grandchild, H5AC__NO_FLAGS_SET) < 0)
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+                        grandchild = NULL;
+                    } /* end for */
+                } /* end if */
+            } /* end if */
+
             /* Mark nodes as dirty */
             middle_child_flags |= H5AC__DIRTIED_FLAG;
             right_child_flags |= H5AC__DIRTIED_FLAG;
@@ -1011,17 +1517,17 @@ H5B2_redistribute3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
 }
 #endif /* QAK */
 #ifdef H5B2_DEBUG
-    H5B2_assert_internal((hsize_t)0, hdr, internal);
+    H5B2__assert_internal((hsize_t)0, hdr, internal);
     if(depth > 1) {
-        H5B2_assert_internal2(internal->node_ptrs[idx - 1].all_nrec, hdr, (H5B2_internal_t *)left_child, (H5B2_internal_t *)middle_child);
-        H5B2_assert_internal2(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)middle_child, (H5B2_internal_t *)left_child);
-        H5B2_assert_internal2(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)middle_child, (H5B2_internal_t *)right_child);
-        H5B2_assert_internal2(internal->node_ptrs[idx + 1].all_nrec, hdr, (H5B2_internal_t *)right_child, (H5B2_internal_t *)middle_child);
+        H5B2__assert_internal2(internal->node_ptrs[idx - 1].all_nrec, hdr, (H5B2_internal_t *)left_child, (H5B2_internal_t *)middle_child);
+        H5B2__assert_internal2(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)middle_child, (H5B2_internal_t *)left_child);
+        H5B2__assert_internal2(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)middle_child, (H5B2_internal_t *)right_child);
+        H5B2__assert_internal2(internal->node_ptrs[idx + 1].all_nrec, hdr, (H5B2_internal_t *)right_child, (H5B2_internal_t *)middle_child);
     } /* end if */
     else {
-        H5B2_assert_leaf2(hdr, (H5B2_leaf_t *)left_child, (H5B2_leaf_t *)middle_child);
-        H5B2_assert_leaf2(hdr, (H5B2_leaf_t *)middle_child, (H5B2_leaf_t *)right_child);
-        H5B2_assert_leaf(hdr, (H5B2_leaf_t *)right_child);
+        H5B2__assert_leaf2(hdr, (H5B2_leaf_t *)left_child, (H5B2_leaf_t *)middle_child);
+        H5B2__assert_leaf2(hdr, (H5B2_leaf_t *)middle_child, (H5B2_leaf_t *)right_child);
+        H5B2__assert_leaf(hdr, (H5B2_leaf_t *)right_child);
     } /* end else */
 #endif /* H5B2_DEBUG */
 
@@ -1034,12 +1540,19 @@ done:
     if(right_child && H5AC_unprotect(hdr->f, dxpl_id, child_class, right_addr, right_child, right_child_flags) < 0)
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node")
 
+    /* Unprotect the grandchild on error */
+    if(grandchild) {
+        HDassert(ret_value < 0);
+        if(H5AC_unprotect(hdr->f, dxpl_id, grandchild_class, grandchild_addr, grandchild, H5AC__NO_FLAGS_SET) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+    } /* end if */
+
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_redistribute3() */
+} /* end H5B2__redistribute3() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_merge2
+ * Function:	H5B2__merge2
  *
  * Purpose:	Perform a 2->1 node merge
  *
@@ -1054,20 +1567,24 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2_merge2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+H5B2__merge2(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
     H5B2_node_ptr_t *curr_node_ptr, unsigned *parent_cache_info_flags_ptr,
     H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx)
 {
     const H5AC_class_t *child_class;    /* Pointer to child node's class info */
     haddr_t left_addr, right_addr;      /* Addresses of left & right child nodes */
     void *left_child = NULL, *right_child = NULL;     /* Pointers to left & right child nodes */
+    const H5AC_class_t *grandchild_class; /* Pointer to grandchild node's class info */
+    haddr_t grandchild_addr;            /* Grandchild address */
+    void *grandchild = NULL;            /* Pointer to grandchild node */
     uint16_t *left_nrec, *right_nrec;   /* Pointers to left & right child # of records */
     uint8_t *left_native, *right_native;    /* Pointers to left & right children's native records */
     H5B2_node_ptr_t *left_node_ptrs = NULL, *right_node_ptrs = NULL;/* Pointers to childs' node pointer info */
     unsigned left_child_flags = H5AC__NO_FLAGS_SET, right_child_flags = H5AC__NO_FLAGS_SET;     /* Flags for unprotecting child nodes */
+    unsigned u;                         /* Local index variable */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Check arguments. */
     HDassert(hdr);
@@ -1086,11 +1603,18 @@ H5B2_merge2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* Lock left & right B-tree child nodes */
-        if(NULL == (left_internal = H5B2_protect_internal(hdr, dxpl_id, left_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC_WRITE)))
+        if(NULL == (left_internal = H5B2__protect_internal(hdr, dxpl_id, left_addr, internal, internal->node_ptrs[idx].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
-        if(NULL == (right_internal = H5B2_protect_internal(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, (depth - 1), H5AC_WRITE)))
+        if(NULL == (right_internal = H5B2__protect_internal(hdr, dxpl_id, right_addr, internal, internal->node_ptrs[idx + 1].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
 
+        /* Shadow the left node if doing SWMR writes */
+        if(hdr->swmr_write) {
+            if(H5B2__shadow_internal(hdr, dxpl_id, (uint16_t)(depth - 1), &(internal->node_ptrs[idx]), &left_internal) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal node")
+            left_addr = internal->node_ptrs[idx].addr;
+        } /* end if */
+
         /* More setup for accessing child node information */
         left_child = left_internal;
         right_child = right_internal;
@@ -1111,11 +1635,18 @@ H5B2_merge2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* Lock left & right B-tree child nodes */
-        if(NULL == (left_leaf = H5B2_protect_leaf(hdr, dxpl_id, left_addr, internal->node_ptrs[idx].node_nrec, H5AC_WRITE)))
+        if(NULL == (left_leaf = H5B2__protect_leaf(hdr, dxpl_id, left_addr, internal, internal->node_ptrs[idx].node_nrec, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
-        if(NULL == (right_leaf = H5B2_protect_leaf(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, H5AC_WRITE)))
+        if(NULL == (right_leaf = H5B2__protect_leaf(hdr, dxpl_id, right_addr, internal, internal->node_ptrs[idx + 1].node_nrec, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
+        /* Shadow the left node if doing SWMR writes */
+        if(hdr->swmr_write) {
+            if(H5B2__shadow_leaf(hdr, dxpl_id, &(internal->node_ptrs[idx]), &left_leaf) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow leaf node")
+            left_addr = internal->node_ptrs[idx].addr;
+        } /* end if */
+
         /* More setup for accessing child node information */
         left_child = left_leaf;
         right_child = right_leaf;
@@ -1137,12 +1668,73 @@ H5B2_merge2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         if(depth > 1)
             HDmemcpy(&(left_node_ptrs[*left_nrec + 1]), &(right_node_ptrs[0]), sizeof(H5B2_node_ptr_t) * (size_t)(*right_nrec + 1));
 
+        /* Update flush dependencies */
+        if(hdr->swmr_write) {
+
+            /* Update node pointers */
+            if(depth > 1) {
+                /* Loop over grandchildren */
+                for(u = (*left_nrec + (unsigned)1); u < (*left_nrec + (unsigned)*right_nrec + (unsigned)2); u++) {
+                    hbool_t update_deps = FALSE;    /* Whether to update flush dependencies */
+
+                    grandchild_addr = left_node_ptrs[u].addr;
+                    if(depth > 2) {
+                        H5B2_internal_t *grandchild_int = NULL;
+
+                        /* Protect grandchild */
+                        if(NULL == (grandchild_int = H5B2__protect_internal(hdr, dxpl_id, grandchild_addr, left_child, left_node_ptrs[u].node_nrec, (uint16_t)(depth - 2), H5AC__NO_FLAGS_SET)))
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+                        grandchild_class = H5AC_BT2_INT;
+                        grandchild = grandchild_int;
+
+                        if(grandchild_int->parent == right_child) {
+                            grandchild_int->parent = left_child;
+                            update_deps = TRUE;
+                        } /* end if */
+                        else
+                            HDassert(grandchild_int->parent == left_child);
+                    } /* end if */
+                    else {
+                        H5B2_leaf_t *grandchild_leaf = NULL;
+
+                        /* Protect grandchild */
+                        if(NULL == (grandchild_leaf = H5B2__protect_leaf(hdr, dxpl_id, grandchild_addr, left_child, left_node_ptrs[u].node_nrec, H5AC__NO_FLAGS_SET)))
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+                        grandchild_class = H5AC_BT2_LEAF;
+                        grandchild = grandchild_leaf;
+
+                        if(grandchild_leaf->parent == right_child) {
+                            grandchild_leaf->parent = left_child;
+                            update_deps = TRUE;
+                        } /* end if */
+                        else
+                            HDassert(grandchild_leaf->parent == left_child);
+                    } /* end else */
+
+                    /* Update flush dependencies if necessary */
+                    if(update_deps) {
+                        if(H5B2__destroy_flush_depend((H5AC_info_t *)right_child, (H5AC_info_t *)grandchild) < 0)
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+                        if(H5B2__create_flush_depend((H5AC_info_t *)left_child, (H5AC_info_t *)grandchild) < 0)
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+                    } /* end if */
+
+                    /* Unprotect the grandchild */
+                    if(H5AC_unprotect(hdr->f, dxpl_id, grandchild_class, left_node_ptrs[u].addr, grandchild, H5AC__NO_FLAGS_SET) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+                    grandchild = NULL;
+                } /* end for */
+            } /* end if */
+        } /* end if */
+
         /* Update # of records in left node */
         *left_nrec = (uint16_t)(*left_nrec + *right_nrec + 1);
 
         /* Mark nodes as dirty */
         left_child_flags |= H5AC__DIRTIED_FLAG;
-        right_child_flags |= H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+        right_child_flags |= H5AC__DELETED_FLAG;
+        if(!(hdr->swmr_write))
+            right_child_flags |= H5AC__DIRTIED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
     } /* end block */
 
     /* Update # of records in child nodes */
@@ -1171,11 +1763,11 @@ H5B2_merge2(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         *parent_cache_info_flags_ptr |= H5AC__DIRTIED_FLAG;
 
 #ifdef H5B2_DEBUG
-    H5B2_assert_internal((hsize_t)0, hdr, internal);
+    H5B2__assert_internal((hsize_t)0, hdr, internal);
     if(depth > 1)
-        H5B2_assert_internal(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)left_child);
+        H5B2__assert_internal(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)left_child);
     else
-        H5B2_assert_leaf(hdr, (H5B2_leaf_t *)left_child);
+        H5B2__assert_leaf(hdr, (H5B2_leaf_t *)left_child);
 #endif /* H5B2_DEBUG */
 
 done:
@@ -1187,12 +1779,19 @@ done:
     if(right_child && H5AC_unprotect(hdr->f, dxpl_id, child_class, right_addr, right_child, right_child_flags) < 0)
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node")
 
+    /* Unprotect the grandchild on error */
+    if(grandchild) {
+        HDassert(ret_value < 0);
+        if(H5AC_unprotect(hdr->f, dxpl_id, grandchild_class, grandchild_addr, grandchild, H5AC__NO_FLAGS_SET) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+    } /* end if */
+
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_merge2() */
+} /* end H5B2__merge2() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_merge3
+ * Function:	H5B2__merge3
  *
  * Purpose:	Perform a 3->2 node merge
  *
@@ -1207,7 +1806,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2_merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+H5B2__merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
     H5B2_node_ptr_t *curr_node_ptr, unsigned *parent_cache_info_flags_ptr,
     H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx)
 {
@@ -1216,6 +1815,9 @@ H5B2_merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
     haddr_t middle_addr;                /* Address of middle child node */
     void *left_child = NULL, *right_child = NULL;     /* Pointers to left & right child nodes */
     void *middle_child = NULL;          /* Pointer to middle child node */
+    const H5AC_class_t *grandchild_class; /* Pointer to grandchild node's class info */
+    haddr_t grandchild_addr;            /* Grandchild address */
+    void *grandchild = NULL;            /* Pointer to grandchild node */
     uint16_t *left_nrec, *right_nrec;   /* Pointers to left & right child # of records */
     uint16_t *middle_nrec;              /* Pointer to middle child # of records */
     uint8_t *left_native, *right_native;    /* Pointers to left & right children's native records */
@@ -1225,9 +1827,10 @@ H5B2_merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
     hsize_t middle_moved_nrec;          /* Number of records moved, for internal split */
     unsigned left_child_flags = H5AC__NO_FLAGS_SET, right_child_flags = H5AC__NO_FLAGS_SET;     /* Flags for unprotecting child nodes */
     unsigned middle_child_flags = H5AC__NO_FLAGS_SET;     /* Flags for unprotecting child nodes */
+    unsigned u;                         /* Local index variable */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Check arguments. */
     HDassert(hdr);
@@ -1248,13 +1851,23 @@ H5B2_merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* Lock B-tree child nodes */
-        if(NULL == (left_internal = H5B2_protect_internal(hdr, dxpl_id, left_addr, internal->node_ptrs[idx - 1].node_nrec, (depth - 1), H5AC_WRITE)))
+        if(NULL == (left_internal = H5B2__protect_internal(hdr, dxpl_id, left_addr, internal, internal->node_ptrs[idx - 1].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
-        if(NULL == (middle_internal = H5B2_protect_internal(hdr, dxpl_id, middle_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC_WRITE)))
+        if(NULL == (middle_internal = H5B2__protect_internal(hdr, dxpl_id, middle_addr, internal, internal->node_ptrs[idx].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
-        if(NULL == (right_internal = H5B2_protect_internal(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, (depth - 1), H5AC_WRITE)))
+        if(NULL == (right_internal = H5B2__protect_internal(hdr, dxpl_id, right_addr, internal, internal->node_ptrs[idx + 1].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
 
+        /* Shadow left and middle nodes if doing SWMR writes */
+        if(hdr->swmr_write) {
+            if(H5B2__shadow_internal(hdr, dxpl_id, (uint16_t)(depth - 1), &(internal->node_ptrs[idx - 1]), &left_internal) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal node")
+            if(H5B2__shadow_internal(hdr, dxpl_id, (uint16_t)(depth - 1), &(internal->node_ptrs[idx]), &middle_internal) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal node")
+            left_addr = internal->node_ptrs[idx - 1].addr;
+            middle_addr = internal->node_ptrs[idx].addr;
+        } /* end if */
+
         /* More setup for accessing child node information */
         left_child = left_internal;
         middle_child = middle_internal;
@@ -1281,13 +1894,23 @@ H5B2_merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         right_addr = internal->node_ptrs[idx + 1].addr;
 
         /* Lock B-tree child nodes */
-        if(NULL == (left_leaf = H5B2_protect_leaf(hdr, dxpl_id, left_addr, internal->node_ptrs[idx - 1].node_nrec, H5AC_WRITE)))
+        if(NULL == (left_leaf = H5B2__protect_leaf(hdr, dxpl_id, left_addr, internal, internal->node_ptrs[idx - 1].node_nrec, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
-        if(NULL == (middle_leaf = H5B2_protect_leaf(hdr, dxpl_id, middle_addr, internal->node_ptrs[idx].node_nrec, H5AC_WRITE)))
+        if(NULL == (middle_leaf = H5B2__protect_leaf(hdr, dxpl_id, middle_addr, internal, internal->node_ptrs[idx].node_nrec, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
-        if(NULL == (right_leaf = H5B2_protect_leaf(hdr, dxpl_id, right_addr, internal->node_ptrs[idx + 1].node_nrec, H5AC_WRITE)))
+        if(NULL == (right_leaf = H5B2__protect_leaf(hdr, dxpl_id, right_addr, internal, internal->node_ptrs[idx + 1].node_nrec, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
+        /* Shadow left and middle nodes if doing SWMR writes */
+        if(hdr->swmr_write) {
+            if(H5B2__shadow_leaf(hdr, dxpl_id, &(internal->node_ptrs[idx - 1]), &left_leaf) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow leaf node")
+            if(H5B2__shadow_leaf(hdr, dxpl_id, &(internal->node_ptrs[idx]), &middle_leaf) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow leaf node")
+            left_addr = internal->node_ptrs[idx - 1].addr;
+            middle_addr = internal->node_ptrs[idx].addr;
+        } /* end if */
+
         /* More setup for accessing child node information */
         left_child = left_leaf;
         middle_child = middle_leaf;
@@ -1322,7 +1945,6 @@ H5B2_merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
 
         /* Move node pointers also if this is an internal node */
         if(depth > 1) {
-            unsigned u;         /* Local index variable */
 
             /* Copy node pointers from middle node into left node */
             HDmemcpy(&(left_node_ptrs[*left_nrec + 1]), &(middle_node_ptrs[0]), sizeof(H5B2_node_ptr_t) * middle_nrec_move);
@@ -1335,6 +1957,65 @@ H5B2_merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
             HDmemmove(&(middle_node_ptrs[0]), &(middle_node_ptrs[middle_nrec_move]), sizeof(H5B2_node_ptr_t) * (size_t)((unsigned)(*middle_nrec + 1) - middle_nrec_move));
         } /* end if */
 
+        /* Update flush dependencies */
+        if(hdr->swmr_write) {
+
+            /* Update node pointers */
+            if(depth > 1) {
+                /* Loop over grandchildren */
+                for(u = (*left_nrec + (unsigned)1); u < (*left_nrec + (unsigned)middle_nrec_move + (unsigned)1); u++) {
+                    hbool_t update_deps = FALSE;    /* Whether to update flush dependencies */
+
+                    grandchild_addr = left_node_ptrs[u].addr;
+                    if(depth > 2) {
+                        H5B2_internal_t *grandchild_int = NULL;
+
+                        /* Protect grandchild */
+                        if(NULL == (grandchild_int = H5B2__protect_internal(hdr, dxpl_id, grandchild_addr, left_child, left_node_ptrs[u].node_nrec, (uint16_t)(depth - 2), H5AC__NO_FLAGS_SET)))
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+                        grandchild_class = H5AC_BT2_INT;
+                        grandchild = grandchild_int;
+
+                        if(grandchild_int->parent == middle_child) {
+                            grandchild_int->parent = left_child;
+                            update_deps = TRUE;
+                        } /* end if */
+                        else
+                            HDassert(grandchild_int->parent == left_child);
+                    } /* end if */
+                    else {
+                        H5B2_leaf_t *grandchild_leaf = NULL;
+
+                        /* Protect grandchild */
+                        if(NULL == (grandchild_leaf = H5B2__protect_leaf(hdr, dxpl_id, grandchild_addr, left_child, left_node_ptrs[u].node_nrec, H5AC__NO_FLAGS_SET)))
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+                        grandchild_class = H5AC_BT2_LEAF;
+                        grandchild = grandchild_leaf;
+
+                        if(grandchild_leaf->parent == middle_child) {
+                            grandchild_leaf->parent = left_child;
+                            update_deps = TRUE;
+                        } /* end if */
+                        else
+                            HDassert(grandchild_leaf->parent == left_child);
+                    } /* end else */
+
+                    /* Update flush dependencies if necessary */
+                    if(update_deps) {
+                        if(H5B2__destroy_flush_depend((H5AC_info_t *)middle_child, (H5AC_info_t *)grandchild) < 0)
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+                        if(H5B2__create_flush_depend((H5AC_info_t *)left_child, (H5AC_info_t *)grandchild) < 0)
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+                    } /* end if */
+
+                    /* Unprotect the grandchild */
+                    if(H5AC_unprotect(hdr->f, dxpl_id, grandchild_class, left_node_ptrs[u].addr, grandchild, H5AC__NO_FLAGS_SET) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+                    grandchild = NULL;
+                } /* end for */
+            } /* end if */
+        } /* end if */
+
         /* Update # of records in left & middle nodes */
         *left_nrec = (uint16_t)(*left_nrec + middle_nrec_move);
         *middle_nrec = (uint16_t)(*middle_nrec - middle_nrec_move);
@@ -1357,12 +2038,73 @@ H5B2_merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
             /* Copy node pointers from right node into middle node */
             HDmemcpy(&(middle_node_ptrs[*middle_nrec + 1]), &(right_node_ptrs[0]), sizeof(H5B2_node_ptr_t) * (size_t)(*right_nrec + 1));
 
+        /* Update flush dependencies */
+        if(hdr->swmr_write) {
+
+            /* Update node pointers */
+            if(depth > 1) {
+                /* Loop over grandchildren */
+                for(u = (*middle_nrec + (unsigned)1); u < (*middle_nrec + (unsigned)*right_nrec + (unsigned)2); u++) {
+                    hbool_t update_deps = FALSE;    /* Whether to update flush dependencies */
+
+                    grandchild_addr = middle_node_ptrs[u].addr;
+                    if(depth > 2) {
+                        H5B2_internal_t *grandchild_int = NULL;
+
+                        /* Protect grandchild */
+                        if(NULL == (grandchild_int = H5B2__protect_internal(hdr, dxpl_id, grandchild_addr, middle_child, middle_node_ptrs[u].node_nrec, (uint16_t)(depth - 2), H5AC__NO_FLAGS_SET)))
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+                        grandchild_class = H5AC_BT2_INT;
+                        grandchild = grandchild_int;
+
+                        if(grandchild_int->parent == right_child) {
+                            grandchild_int->parent = middle_child;
+                            update_deps = TRUE;
+                        } /* end if */
+                        else
+                            HDassert(grandchild_int->parent == middle_child);
+                    } /* end if */
+                    else {
+                        H5B2_leaf_t *grandchild_leaf = NULL;
+
+                        /* Protect grandchild */
+                        if(NULL == (grandchild_leaf = H5B2__protect_leaf(hdr, dxpl_id, grandchild_addr, middle_child, middle_node_ptrs[u].node_nrec, H5AC__NO_FLAGS_SET)))
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+                        grandchild_class = H5AC_BT2_LEAF;
+                        grandchild = grandchild_leaf;
+
+                        if(grandchild_leaf->parent == right_child) {
+                            grandchild_leaf->parent = middle_child;
+                            update_deps = TRUE;
+                        } /* end if */
+                        else
+                            HDassert(grandchild_leaf->parent == middle_child);
+                    } /* end else */
+
+                    /* Update flush dependencies if necessary */
+                    if(update_deps) {
+                        if(H5B2__destroy_flush_depend((H5AC_info_t *)right_child, (H5AC_info_t *)grandchild) < 0)
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+                        if(H5B2__create_flush_depend((H5AC_info_t *)middle_child, (H5AC_info_t *)grandchild) < 0)
+                            HGOTO_ERROR(H5E_BTREE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+                    } /* end if */
+
+                    /* Unprotect the grandchild */
+                    if(H5AC_unprotect(hdr->f, dxpl_id, grandchild_class, middle_node_ptrs[u].addr, grandchild, H5AC__NO_FLAGS_SET) < 0)
+                        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+                    grandchild = NULL;
+                } /* end for */
+            } /* end if */
+        } /* end if */
+
         /* Update # of records in middle node */
         *middle_nrec = (uint16_t)(*middle_nrec + (*right_nrec + 1));
 
         /* Mark nodes as dirty */
         middle_child_flags |= H5AC__DIRTIED_FLAG;
-        right_child_flags |= H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+        right_child_flags |= H5AC__DELETED_FLAG;
+        if(!(hdr->swmr_write))
+            right_child_flags |= H5AC__DIRTIED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
     } /* end block */
 
     /* Update # of records in child nodes */
@@ -1393,14 +2135,14 @@ H5B2_merge3(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         *parent_cache_info_flags_ptr |= H5AC__DIRTIED_FLAG;
 
 #ifdef H5B2_DEBUG
-    H5B2_assert_internal((hsize_t)0, hdr, internal);
+    H5B2__assert_internal((hsize_t)0, hdr, internal);
     if(depth > 1) {
-        H5B2_assert_internal2(internal->node_ptrs[idx - 1].all_nrec, hdr, (H5B2_internal_t *)left_child, (H5B2_internal_t *)middle_child);
-        H5B2_assert_internal(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)middle_child);
+        H5B2__assert_internal2(internal->node_ptrs[idx - 1].all_nrec, hdr, (H5B2_internal_t *)left_child, (H5B2_internal_t *)middle_child);
+        H5B2__assert_internal(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)middle_child);
     } /* end if */
     else {
-        H5B2_assert_leaf2(hdr, (H5B2_leaf_t *)left_child, (H5B2_leaf_t *)middle_child);
-        H5B2_assert_leaf(hdr, (H5B2_leaf_t *)middle_child);
+        H5B2__assert_leaf2(hdr, (H5B2_leaf_t *)left_child, (H5B2_leaf_t *)middle_child);
+        H5B2__assert_leaf(hdr, (H5B2_leaf_t *)middle_child);
     } /* end else */
 #endif /* H5B2_DEBUG */
 
@@ -1415,12 +2157,19 @@ done:
     if(right_child && H5AC_unprotect(hdr->f, dxpl_id, child_class, right_addr, right_child, right_child_flags) < 0)
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node")
 
+    /* Unprotect the grandchild on error */
+    if(grandchild) {
+        HDassert(ret_value < 0);
+        if(H5AC_unprotect(hdr->f, dxpl_id, grandchild_class, grandchild_addr, grandchild, H5AC__NO_FLAGS_SET) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+    } /* end if */
+
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_merge3() */
+} /* end H5B2__merge3() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_swap_leaf
+ * Function:	H5B2__swap_leaf
  *
  * Purpose:	Swap a record in a node with a record in a leaf node
  *
@@ -1435,7 +2184,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2_swap_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+H5B2__swap_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
     H5B2_internal_t *internal, unsigned *internal_flags_ptr,
     unsigned idx, void *swap_loc)
 {
@@ -1445,7 +2194,7 @@ H5B2_swap_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
     uint8_t *child_native;              /* Pointer to child's native records */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Check arguments. */
     HDassert(hdr);
@@ -1462,7 +2211,7 @@ H5B2_swap_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         child_addr = internal->node_ptrs[idx].addr;
 
         /* Lock B-tree child nodes */
-        if(NULL == (child_internal = H5B2_protect_internal(hdr, dxpl_id, child_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC_WRITE)))
+        if(NULL == (child_internal = H5B2__protect_internal(hdr, dxpl_id, child_addr, internal, internal->node_ptrs[idx].node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
 
         /* More setup for accessing child node information */
@@ -1477,7 +2226,7 @@ H5B2_swap_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         child_addr = internal->node_ptrs[idx].addr;
 
         /* Lock B-tree child node */
-        if(NULL == (child_leaf = H5B2_protect_leaf(hdr, dxpl_id, child_addr, internal->node_ptrs[idx].node_nrec, H5AC_WRITE)))
+        if(NULL == (child_leaf = H5B2__protect_leaf(hdr, dxpl_id, child_addr, internal, internal->node_ptrs[idx].node_nrec, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
         /* More setup for accessing child node information */
@@ -1494,11 +2243,11 @@ H5B2_swap_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
     *internal_flags_ptr |= H5AC__DIRTIED_FLAG;
 
 #ifdef H5B2_DEBUG
-    H5B2_assert_internal((hsize_t)0, hdr, internal);
+    H5B2__assert_internal((hsize_t)0, hdr, internal);
     if(depth > 1)
-        H5B2_assert_internal(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)child);
+        H5B2__assert_internal(internal->node_ptrs[idx].all_nrec, hdr, (H5B2_internal_t *)child);
     else
-        H5B2_assert_leaf(hdr, (H5B2_leaf_t *)child);
+        H5B2__assert_leaf(hdr, (H5B2_leaf_t *)child);
 #endif /* H5B2_DEBUG */
 
 done:
@@ -1507,11 +2256,11 @@ done:
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_swap_leaf() */
+} /* end H5B2__swap_leaf() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_insert_leaf
+ * Function:	H5B2__insert_leaf
  *
  * Purpose:	Adds a new record to a B-tree leaf node.
  *
@@ -1524,15 +2273,15 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_insert_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_ptr,
-    H5B2_nodepos_t curr_pos, void *udata)
+H5B2__insert_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_ptr,
+    H5B2_nodepos_t curr_pos, void *parent, void *udata)
 {
     H5B2_leaf_t *leaf;                  /* Pointer to leaf node */
     int         cmp;                    /* Comparison value of records */
     unsigned    idx;                    /* Location of record which matches key */
     herr_t	ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
@@ -1540,9 +2289,14 @@ H5B2_insert_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_ptr,
     HDassert(H5F_addr_defined(curr_node_ptr->addr));
 
     /* Lock current B-tree node */
-    if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, curr_node_ptr->addr, curr_node_ptr->node_nrec, H5AC_WRITE)))
+    if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, curr_node_ptr->addr, parent, curr_node_ptr->node_nrec, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
+    /* Shadow the node if doing SWMR writes */
+    if(hdr->swmr_write)
+        if(H5B2__shadow_leaf(hdr, dxpl_id, curr_node_ptr, &leaf) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow leaf node")
+
     /* Must have a leaf node with enough space to insert a record now */
     HDassert(curr_node_ptr->node_nrec < hdr->node_info[0].max_nrec);
 
@@ -1555,7 +2309,7 @@ H5B2_insert_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_ptr,
         idx = 0;
     else {
         /* Find correct location to insert this record */
-        if((cmp = H5B2_locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx)) == 0)
+        if((cmp = H5B2__locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx)) == 0)
             HGOTO_ERROR(H5E_BTREE, H5E_EXISTS, FAIL, "record is already in B-tree")
         if(cmp > 0)
             idx++;
@@ -1603,11 +2357,11 @@ done:
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release leaf B-tree node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2_insert_leaf() */
+} /* H5B2__insert_leaf() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_insert_internal
+ * Function:	H5B2__insert_internal
  *
  * Purpose:	Adds a new record to a B-tree node.
  *
@@ -1620,9 +2374,9 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_insert_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+H5B2__insert_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
     unsigned *parent_cache_info_flags_ptr, H5B2_node_ptr_t *curr_node_ptr,
-    H5B2_nodepos_t curr_pos, void *udata)
+    H5B2_nodepos_t curr_pos, void *parent, void *udata)
 {
     H5B2_internal_t *internal = NULL;   /* Pointer to internal node */
     unsigned internal_flags = H5AC__NO_FLAGS_SET;
@@ -1630,7 +2384,7 @@ H5B2_insert_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
     H5B2_nodepos_t next_pos = H5B2_POS_MIDDLE;    /* Position of node */
     herr_t	ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
@@ -1639,9 +2393,14 @@ H5B2_insert_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
     HDassert(H5F_addr_defined(curr_node_ptr->addr));
 
     /* Lock current B-tree node */
-    if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, curr_node_ptr->addr, curr_node_ptr->node_nrec, depth, H5AC_WRITE)))
+    if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, curr_node_ptr->addr, parent, curr_node_ptr->node_nrec, depth, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
 
+    /* Shadow the node if doing SWMR writes */
+    if(hdr->swmr_write)
+        if(H5B2__shadow_internal(hdr, dxpl_id, depth, curr_node_ptr, &internal) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal node")
+
     /* Split or redistribute child node pointers, if necessary */
     {
         int         cmp;        /* Comparison value of records */
@@ -1649,7 +2408,7 @@ H5B2_insert_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         size_t      split_nrec; /* Number of records to split node at */
 
         /* Locate node pointer for child */
-        if((cmp = H5B2_locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx)) == 0)
+        if((cmp = H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx)) == 0)
             HGOTO_ERROR(H5E_BTREE, H5E_EXISTS, FAIL, "record is already in B-tree")
         if(cmp > 0)
             idx++;
@@ -1670,22 +2429,22 @@ H5B2_insert_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
             /* Attempt to redistribute records among children */
             if(idx == 0) {    /* Left-most child */
                 if(retries > 0 && (internal->node_ptrs[idx + 1].node_nrec < split_nrec)) {
-                    if(H5B2_redistribute2(hdr, dxpl_id, depth, internal, idx) < 0)
+                    if(H5B2__redistribute2(hdr, dxpl_id, depth, internal, idx) < 0)
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTREDISTRIBUTE, FAIL, "unable to redistribute child node records")
                 } /* end if */
                 else {
-                    if(H5B2_split1(hdr, dxpl_id, depth, curr_node_ptr,
+                    if(H5B2__split1(hdr, dxpl_id, depth, curr_node_ptr,
                            parent_cache_info_flags_ptr, internal, &internal_flags, idx) < 0)
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to split child node")
                 } /* end else */
             } /* end if */
             else if(idx == internal->nrec) { /* Right-most child */
                 if(retries > 0 && (internal->node_ptrs[idx - 1].node_nrec < split_nrec)) {
-                    if(H5B2_redistribute2(hdr, dxpl_id, depth, internal, (idx - 1)) < 0)
+                    if(H5B2__redistribute2(hdr, dxpl_id, depth, internal, (idx - 1)) < 0)
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTREDISTRIBUTE, FAIL, "unable to redistribute child node records")
                 } /* end if */
                 else {
-                    if(H5B2_split1(hdr, dxpl_id, depth, curr_node_ptr,
+                    if(H5B2__split1(hdr, dxpl_id, depth, curr_node_ptr,
                            parent_cache_info_flags_ptr, internal, &internal_flags, idx) < 0)
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to split child node")
                 } /* end else */
@@ -1693,11 +2452,11 @@ H5B2_insert_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
             else { /* Middle child */
                 if(retries > 0 && ((internal->node_ptrs[idx + 1].node_nrec < split_nrec) ||
                             (internal->node_ptrs[idx - 1].node_nrec < split_nrec))) {
-                    if(H5B2_redistribute3(hdr, dxpl_id, depth, internal, &internal_flags, idx) < 0)
+                    if(H5B2__redistribute3(hdr, dxpl_id, depth, internal, &internal_flags, idx) < 0)
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTREDISTRIBUTE, FAIL, "unable to redistribute child node records")
                 } /* end if */
                 else {
-                    if(H5B2_split1(hdr, dxpl_id, depth, curr_node_ptr,
+                    if(H5B2__split1(hdr, dxpl_id, depth, curr_node_ptr,
                            parent_cache_info_flags_ptr, internal, &internal_flags, idx) < 0)
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to split child node")
                 } /* end else */
@@ -1705,7 +2464,7 @@ H5B2_insert_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
 
             /* Locate node pointer for child (after split/redistribute) */
 /* Actually, this can be easily updated (for 2-node redistrib.) and shouldn't require re-searching */
-            if((cmp = H5B2_locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx)) == 0)
+            if((cmp = H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx)) == 0)
                 HGOTO_ERROR(H5E_BTREE, H5E_EXISTS, FAIL, "record is already in B-tree")
             if(cmp > 0)
                 idx++;
@@ -1729,11 +2488,11 @@ H5B2_insert_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
 
     /* Attempt to insert node */
     if(depth > 1) {
-        if(H5B2_insert_internal(hdr, dxpl_id, (depth - 1), &internal_flags, &internal->node_ptrs[idx], next_pos, udata) < 0)
+        if(H5B2__insert_internal(hdr, dxpl_id, (uint16_t)(depth - 1), &internal_flags, &internal->node_ptrs[idx], next_pos, internal, udata) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, FAIL, "unable to insert record into B-tree internal node")
     } /* end if */
     else {
-        if(H5B2_insert_leaf(hdr, dxpl_id, &internal->node_ptrs[idx], next_pos, udata) < 0)
+        if(H5B2__insert_leaf(hdr, dxpl_id, &internal->node_ptrs[idx], next_pos, internal, udata) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTINSERT, FAIL, "unable to insert record into B-tree leaf node")
     } /* end else */
 
@@ -1749,11 +2508,11 @@ done:
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2_insert_internal() */
+} /* H5B2__insert_internal() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_create_leaf
+ * Function:	H5B2__create_leaf
  *
  * Purpose:	Creates empty leaf node of a B-tree and update node pointer
  *              to point to it.
@@ -1767,12 +2526,12 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_create_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *node_ptr)
+H5B2__create_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, void *parent, H5B2_node_ptr_t *node_ptr)
 {
     H5B2_leaf_t *leaf = NULL;           /* Pointer to new leaf node created */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
@@ -1786,7 +2545,7 @@ H5B2_create_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *node_ptr)
     HDmemset(&leaf->cache_info, 0, sizeof(H5AC_info_t));
 
     /* Increment ref. count on B-tree header */
-    if(H5B2_hdr_incr(hdr) < 0)
+    if(H5B2__hdr_incr(hdr) < 0)
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTINC, FAIL, "can't increment ref. count on B-tree header")
 
     /* Share B-tree header information */
@@ -1802,6 +2561,13 @@ HDmemset(leaf->leaf_native, 0, hdr->cls->nrec_size * hdr->node_info[0].max_nrec)
     /* Set number of records */
     leaf->nrec = 0;
 
+    /* Set parent */
+    leaf->parent = parent;
+
+    /* Set shadowed list next and prev pointers */
+    leaf->shadowed_next = NULL;
+    leaf->shadowed_prev = NULL;
+
     /* Allocate space on disk for the leaf */
     if(HADDR_UNDEF == (node_ptr->addr = H5MF_alloc(hdr->f, H5FD_MEM_BTREE, dxpl_id, (hsize_t)hdr->node_size)))
 	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "file allocation failed for B-tree leaf node")
@@ -1813,16 +2579,16 @@ HDmemset(leaf->leaf_native, 0, hdr->cls->nrec_size * hdr->node_info[0].max_nrec)
 done:
     if(ret_value < 0) {
 	if(leaf)
-            if(H5B2_leaf_free(leaf) < 0)
+            if(H5B2__leaf_free(leaf) < 0)
                 HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to release v2 B-tree leaf node")
     } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2_create_leaf() */
+} /* H5B2__create_leaf() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_protect_leaf
+ * Function:	H5B2__protect_leaf
  *
  * Purpose:	"Protect" an leaf node in the metadata cache
  *
@@ -1835,34 +2601,38 @@ done:
  *-------------------------------------------------------------------------
  */
 H5B2_leaf_t *
-H5B2_protect_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, haddr_t addr, unsigned nrec,
-    H5AC_protect_t rw)
+H5B2__protect_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, haddr_t addr, void *parent, 
+    uint16_t nrec, unsigned flags)
 {
     H5B2_leaf_cache_ud_t udata;         /* User-data for callback */
-    H5B2_leaf_t *ret_value;             /* Return value */
+    H5B2_leaf_t *ret_value = NULL;      /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
     HDassert(H5F_addr_defined(addr));
 
+    /* only H5AC__READ_ONLY_FLAG may appear in flags */
+    HDassert((flags & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
     /* Set up user data for callback */
     udata.f = hdr->f;
     udata.hdr = hdr;
+    udata.parent = parent;
     H5_CHECKED_ASSIGN(udata.nrec, uint16_t, nrec, unsigned)
 
     /* Protect the leaf node */
-    if(NULL == (ret_value = (H5B2_leaf_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_BT2_LEAF, addr, &udata, rw)))
+    if(NULL == (ret_value = (H5B2_leaf_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_BT2_LEAF, addr, &udata, flags)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, NULL, "unable to protect B-tree leaf node")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2_protect_leaf() */
+} /* H5B2__protect_leaf() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_create_internal
+ * Function:	H5B2__create_internal
  *
  * Purpose:	Creates empty internal node of a B-tree and update node pointer
  *              to point to it.
@@ -1876,13 +2646,13 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2_create_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *node_ptr,
-    unsigned depth)
+H5B2__create_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, void *parent,
+    H5B2_node_ptr_t *node_ptr, uint16_t depth)
 {
     H5B2_internal_t *internal = NULL;   /* Pointer to new internal node created */
     herr_t	ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Check arguments. */
     HDassert(hdr);
@@ -1897,7 +2667,7 @@ H5B2_create_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *node_ptr,
     HDmemset(&internal->cache_info, 0, sizeof(H5AC_info_t));
 
     /* Increment ref. count on B-tree header */
-    if(H5B2_hdr_incr(hdr) < 0)
+    if(H5B2__hdr_incr(hdr) < 0)
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTINC, FAIL, "can't increment ref. count on B-tree header")
 
     /* Share B-tree header information */
@@ -1919,7 +2689,14 @@ HDmemset(internal->node_ptrs, 0, sizeof(H5B2_node_ptr_t) * (hdr->node_info[depth
 
     /* Set number of records & depth of the node */
     internal->nrec = 0;
-    internal->depth = (uint16_t)depth;
+    internal->depth = depth;
+
+    /* Set parent */
+    internal->parent = parent;
+
+    /* Set shadowed list next and prev pointers */
+    internal->shadowed_next = NULL;
+    internal->shadowed_prev = NULL;
 
     /* Allocate space on disk for the internal node */
     if(HADDR_UNDEF == (node_ptr->addr = H5MF_alloc(hdr->f, H5FD_MEM_BTREE, dxpl_id, (hsize_t)hdr->node_size)))
@@ -1932,16 +2709,16 @@ HDmemset(internal->node_ptrs, 0, sizeof(H5B2_node_ptr_t) * (hdr->node_info[depth
 done:
     if(ret_value < 0) {
 	if(internal)
-            if(H5B2_internal_free(internal) < 0)
+            if(H5B2__internal_free(internal) < 0)
                 HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to release v2 B-tree internal node")
     } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2_create_internal() */
+} /* H5B2__create_internal() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_protect_internal
+ * Function:	H5B2__protect_internal
  *
  * Purpose:	"Protect" an internal node in the metadata cache
  *
@@ -1954,36 +2731,40 @@ done:
  *-------------------------------------------------------------------------
  */
 H5B2_internal_t *
-H5B2_protect_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, haddr_t addr,
-    unsigned nrec, unsigned depth, H5AC_protect_t rw)
+H5B2__protect_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, haddr_t addr,
+    void *parent, uint16_t nrec, uint16_t depth, unsigned flags)
 {
     H5B2_internal_cache_ud_t udata;     /* User data to pass through to cache 'deserialize' callback */
-    H5B2_internal_t *ret_value;         /* Return value */
+    H5B2_internal_t *ret_value = NULL;  /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
     HDassert(H5F_addr_defined(addr));
     HDassert(depth > 0);
 
+    /* only H5AC__READ_ONLY_FLAG may appear in flags */
+    HDassert((flags & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
     /* Set up user data for callback */
     udata.f = hdr->f;
     udata.hdr = hdr;
-    H5_CHECKED_ASSIGN(udata.nrec, uint16_t, nrec, unsigned)
-    H5_CHECKED_ASSIGN(udata.depth, uint16_t, depth, unsigned)
+    udata.parent = parent;
+    udata.nrec = nrec;
+    udata.depth = depth;
 
     /* Protect the internal node */
-    if(NULL == (ret_value = (H5B2_internal_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_BT2_INT, addr, &udata, rw)))
+    if(NULL == (ret_value = (H5B2_internal_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_BT2_INT, addr, &udata, flags)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, NULL, "unable to protect B-tree internal node")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2_protect_internal() */
+} /* H5B2__protect_internal() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_iterate_node
+ * Function:	H5B2__iterate_node
  *
  * Purpose:	Iterate over all the records from a B-tree node, in "in-order"
  *		order, making a callback for each record.
@@ -2000,18 +2781,20 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_iterate_node(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
-    const H5B2_node_ptr_t *curr_node, H5B2_operator_t op, void *op_data)
+H5B2__iterate_node(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
+    const H5B2_node_ptr_t *curr_node, void *parent, H5B2_operator_t op,
+    void *op_data)
 {
     const H5AC_class_t *curr_node_class = NULL; /* Pointer to current node's class info */
     void *node = NULL;                  /* Pointers to current node */
     uint8_t *node_native;               /* Pointers to node's native records */
     uint8_t *native = NULL;             /* Pointers to copy of node's native records */
     H5B2_node_ptr_t *node_ptrs = NULL;  /* Pointers to node's node pointers */
+    hbool_t node_pinned = FALSE;        /* Whether node is pinned */
     unsigned u;                         /* Local index */
     herr_t ret_value = H5_ITER_CONT;    /* Iterator return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
@@ -2023,7 +2806,7 @@ H5B2_iterate_node(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         H5B2_internal_t *internal;     /* Pointer to internal node */
 
         /* Lock the current B-tree node */
-        if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, curr_node->addr, curr_node->node_nrec, depth, H5AC_READ)))
+        if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, curr_node->addr, parent, curr_node->node_nrec, depth, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
 
         /* Set up information about current node */
@@ -2042,7 +2825,7 @@ H5B2_iterate_node(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         H5B2_leaf_t *leaf;             /* Pointer to leaf node */
 
         /* Lock the current B-tree node */
-        if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, curr_node->addr, curr_node->node_nrec, H5AC_READ)))
+        if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, curr_node->addr, parent, curr_node->node_nrec, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
         /* Set up information about current node */
@@ -2059,15 +2842,18 @@ H5B2_iterate_node(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
     HDmemcpy(native, node_native, (hdr->cls->nrec_size * curr_node->node_nrec));
 
     /* Unlock the node */
-    if(H5AC_unprotect(hdr->f, dxpl_id, curr_node_class, curr_node->addr, node, H5AC__NO_FLAGS_SET) < 0)
+    if(H5AC_unprotect(hdr->f, dxpl_id, curr_node_class, curr_node->addr, node, (unsigned)(hdr->swmr_write ? H5AC__PIN_ENTRY_FLAG : H5AC__NO_FLAGS_SET)) < 0)
         HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
-    node = NULL;
+    if(hdr->swmr_write)
+        node_pinned = TRUE;
+    else
+        node = NULL;
 
     /* Iterate through records, in order */
     for(u = 0; u < curr_node->node_nrec && !ret_value; u++) {
         /* Descend into child node, if current node is an internal node */
         if(depth > 0) {
-            if((ret_value = H5B2_iterate_node(hdr, dxpl_id, (depth - 1), &(node_ptrs[u]), op, op_data)) < 0)
+            if((ret_value = H5B2__iterate_node(hdr, dxpl_id, (uint16_t)(depth - 1), &(node_ptrs[u]), node, op, op_data)) < 0)
                 HERROR(H5E_BTREE, H5E_CANTLIST, "node iteration failed");
         } /* end if */
 
@@ -2080,11 +2866,15 @@ H5B2_iterate_node(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
 
     /* Descend into last child node, if current node is an internal node */
     if(!ret_value && depth > 0) {
-        if((ret_value = H5B2_iterate_node(hdr, dxpl_id, (depth - 1), &(node_ptrs[u]), op, op_data)) < 0)
+        if((ret_value = H5B2__iterate_node(hdr, dxpl_id, (uint16_t)(depth - 1), &(node_ptrs[u]), node, op, op_data)) < 0)
             HERROR(H5E_BTREE, H5E_CANTLIST, "node iteration failed");
     } /* end if */
 
 done:
+    /* Unpin the node if it was pinned */
+    if(node_pinned && H5AC_unpin_entry(node) < 0)
+        HDONE_ERROR(H5E_BTREE, H5E_CANTUNPIN, FAIL, "can't unpin node")
+
     /* Release the node pointers & native records, if they were copied */
     if(node_ptrs)
         node_ptrs = (H5B2_node_ptr_t *)H5FL_FAC_FREE(hdr->node_info[depth].node_ptr_fac, node_ptrs);
@@ -2092,11 +2882,11 @@ done:
         native = (uint8_t *)H5FL_FAC_FREE(hdr->node_info[depth].nat_rec_fac, native);
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2_iterate_node() */
+} /* H5B2__iterate_node() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_remove_leaf
+ * Function:	H5B2__remove_leaf
  *
  * Purpose:	Removes a record from a B-tree leaf node.
  *
@@ -2109,8 +2899,8 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_remove_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_ptr,
-    H5B2_nodepos_t curr_pos, void *udata, H5B2_remove_t op, void *op_data)
+H5B2__remove_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_ptr,
+    H5B2_nodepos_t curr_pos, void *parent, void *udata, H5B2_remove_t op, void *op_data)
 {
     H5B2_leaf_t *leaf;                  /* Pointer to leaf node */
     haddr_t     leaf_addr = HADDR_UNDEF;  /* Leaf address on disk */
@@ -2118,7 +2908,7 @@ H5B2_remove_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_ptr,
     unsigned    idx;                    /* Location of record which matches key */
     herr_t	ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
@@ -2127,7 +2917,7 @@ H5B2_remove_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_ptr,
 
     /* Lock current B-tree node */
     leaf_addr = curr_node_ptr->addr;
-    if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, leaf_addr, curr_node_ptr->node_nrec, H5AC_WRITE)))
+    if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, leaf_addr, parent, curr_node_ptr->node_nrec, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
     /* Sanity check number of records */
@@ -2135,7 +2925,7 @@ H5B2_remove_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_ptr,
     HDassert(leaf->nrec == curr_node_ptr->node_nrec);
 
     /* Find correct location to remove this record */
-    if(H5B2_locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx) != 0)
+    if(H5B2__locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx) != 0)
         HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "record is not in B-tree")
 
     /* Check for invalidating the min/max record for the tree */
@@ -2167,17 +2957,26 @@ H5B2_remove_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_ptr,
     /* Update number of records in node */
     leaf->nrec--;
 
-    /* Mark leaf node as dirty also */
-    leaf_flags |= H5AC__DIRTIED_FLAG;
-
     if(leaf->nrec > 0) {
+        /* Shadow the node if doing SWMR writes */
+        if(hdr->swmr_write) {
+            if(H5B2__shadow_leaf(hdr, dxpl_id, curr_node_ptr, &leaf) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow leaf node")
+            leaf_addr = curr_node_ptr->addr;
+        } /* end if */
+
         /* Pack record out of leaf */
         if(idx < leaf->nrec)
             HDmemmove(H5B2_LEAF_NREC(leaf, hdr, idx), H5B2_LEAF_NREC(leaf, hdr, (idx + 1)), hdr->cls->nrec_size * (leaf->nrec - idx));
+
+        /* Mark leaf node as dirty also */
+        leaf_flags |= H5AC__DIRTIED_FLAG;
     } /* end if */
     else {
         /* Let the cache know that the object is deleted */
-        leaf_flags |= H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+        leaf_flags |= H5AC__DELETED_FLAG;
+        if(!hdr->swmr_write)
+            leaf_flags |= H5AC__DIRTIED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
 
         /* Reset address of parent node pointer */
         curr_node_ptr->addr = HADDR_UNDEF;
@@ -2192,11 +2991,11 @@ done:
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release leaf B-tree node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2_remove_leaf() */
+} /* H5B2__remove_leaf() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_remove_internal
+ * Function:	H5B2__remove_internal
  *
  * Purpose:	Removes a record from a B-tree node.
  *
@@ -2209,8 +3008,8 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_remove_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, hbool_t *depth_decreased,
-    void *swap_loc, unsigned depth, H5AC_info_t *parent_cache_info,
+H5B2__remove_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, hbool_t *depth_decreased,
+    void *swap_loc, void *swap_parent, uint16_t depth, H5AC_info_t *parent_cache_info,
     unsigned *parent_cache_info_flags_ptr, H5B2_nodepos_t curr_pos,
     H5B2_node_ptr_t *curr_node_ptr, void *udata, H5B2_remove_t op, void *op_data)
 {
@@ -2218,6 +3017,8 @@ H5B2_remove_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, hbool_t *depth_decreased,
     unsigned *new_cache_info_flags_ptr = NULL;
     H5B2_node_ptr_t *new_node_ptr;      /* Pointer to new node pointer */
     H5B2_internal_t *internal;          /* Pointer to internal node */
+    const H5AC_class_t *new_root_class; /* Pointer to new root node's class info */
+    void *new_root = NULL;              /* Pointer to new root node (if old root collapsed) */
     H5B2_nodepos_t next_pos = H5B2_POS_MIDDLE;  /* Position of next node */
     unsigned internal_flags = H5AC__NO_FLAGS_SET;
     haddr_t internal_addr;              /* Address of internal node */
@@ -2225,7 +3026,7 @@ H5B2_remove_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, hbool_t *depth_decreased,
     hbool_t     collapsed_root = FALSE; /* Whether the root was collapsed */
     herr_t	ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
@@ -2236,7 +3037,7 @@ H5B2_remove_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, hbool_t *depth_decreased,
 
     /* Lock current B-tree node */
     internal_addr = curr_node_ptr->addr;
-    if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, internal_addr, curr_node_ptr->node_nrec, depth, H5AC_WRITE)))
+    if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, internal_addr, parent_cache_info, curr_node_ptr->node_nrec, depth, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
 
     /* Determine the correct number of records to merge at */
@@ -2248,17 +3049,71 @@ H5B2_remove_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, hbool_t *depth_decreased,
             ((internal->node_ptrs[0].node_nrec + internal->node_ptrs[1].node_nrec) <= ((merge_nrec * 2) + 1))) {
 
         /* Merge children of root node */
-        if(H5B2_merge2(hdr, dxpl_id, depth, curr_node_ptr,
+        if(H5B2__merge2(hdr, dxpl_id, depth, curr_node_ptr,
                 parent_cache_info_flags_ptr, internal, &internal_flags, 0) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to merge child node")
 
         /* Let the cache know that the object is deleted */
-        internal_flags |= H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+        internal_flags |= H5AC__DELETED_FLAG;
+        if(!hdr->swmr_write)
+            internal_flags |= H5AC__FREE_FILE_SPACE_FLAG;
 
         /* Reset information in header's root node pointer */
         curr_node_ptr->addr = internal->node_ptrs[0].addr;
         curr_node_ptr->node_nrec = internal->node_ptrs[0].node_nrec;
 
+        /* Update flush dependencies */
+        if(hdr->swmr_write) {
+            hbool_t update_dep = FALSE; /* Whether to update root flush dependency */
+
+            /* Update hdr to root dependency */
+            if(depth > 1) {
+                H5B2_internal_t *new_root_int = NULL;
+
+                /* Protect new root */
+                if(NULL == (new_root_int = H5B2__protect_internal(hdr, dxpl_id, curr_node_ptr->addr, hdr, curr_node_ptr->node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+                new_root_class = H5AC_BT2_INT;
+                new_root = new_root_int;
+
+                if(new_root_int->parent == internal) {
+                    new_root_int->parent = hdr;
+                    update_dep = TRUE;
+                } /* end if */
+                else
+                    HDassert(new_root_int->parent == hdr);
+            } /* end if */
+            else {
+                H5B2_leaf_t *new_root_leaf = NULL;
+
+                /* Protect new root */
+                if(NULL == (new_root_leaf = H5B2__protect_leaf(hdr, dxpl_id, curr_node_ptr->addr, hdr, curr_node_ptr->node_nrec, H5AC__NO_FLAGS_SET)))
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+                new_root_class = H5AC_BT2_LEAF;
+                new_root = new_root_leaf;
+
+                if(new_root_leaf->parent == internal) {
+                    new_root_leaf->parent = hdr;
+                    update_dep = TRUE;
+                } /* end if */
+                else
+                    HDassert(new_root_leaf->parent == hdr);
+            } /* end else */
+
+            /* Update flush dependency if necessary */
+            if(update_dep) {
+                if(H5B2__destroy_flush_depend((H5AC_info_t *)internal, (H5AC_info_t *)new_root) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+                if(H5B2__create_flush_depend((H5AC_info_t *)hdr, (H5AC_info_t *)new_root) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+            } /* end if */
+
+            /* Unprotect the new root */
+            if(H5AC_unprotect(hdr->f, dxpl_id, new_root_class, curr_node_ptr->addr, new_root, H5AC__NO_FLAGS_SET) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+            new_root = NULL;
+        } /* end if */
+
         /* Indicate that the level of the B-tree decreased */
         *depth_decreased = TRUE;
 
@@ -2279,11 +3134,18 @@ H5B2_remove_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, hbool_t *depth_decreased,
         int cmp = 0;            /* Comparison value of records */
         unsigned retries;       /* Number of times to attempt redistribution */
 
+        /* Shadow the node if doing SWMR writes */
+        if(hdr->swmr_write) {
+            if(H5B2__shadow_internal(hdr, dxpl_id, depth, curr_node_ptr, &internal) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal node")
+            internal_addr = curr_node_ptr->addr;
+        } /* end if */
+
         /* Locate node pointer for child */
         if(swap_loc)
             idx = 0;
         else {
-            cmp = H5B2_locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx);
+            cmp = H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx);
             if(cmp >= 0)
                 idx++;
         } /* end else */
@@ -2302,27 +3164,27 @@ H5B2_remove_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, hbool_t *depth_decreased,
             /* (NOTE: These 2-node redistributions should actually get the
              *  record to promote from the node with more records. - QAK)
              */
-            /* (NOTE: This code is the same in both H5B2_remove_internal() and
-             *  H5B2_remove_internal_by_idx(), fix bugs in both places! - QAK)
+            /* (NOTE: This code is the same in both H5B2__remove_internal() and
+             *  H5B2__remove_internal_by_idx(), fix bugs in both places! - QAK)
              */
             if(idx == 0) {    /* Left-most child */
                 if(retries > 0 && (internal->node_ptrs[idx + 1].node_nrec > merge_nrec)) {
-                    if(H5B2_redistribute2(hdr, dxpl_id, depth, internal, idx) < 0)
+                    if(H5B2__redistribute2(hdr, dxpl_id, depth, internal, idx) < 0)
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTREDISTRIBUTE, FAIL, "unable to redistribute child node records")
                 } /* end if */
                 else {
-                    if(H5B2_merge2(hdr, dxpl_id, depth, curr_node_ptr,
+                    if(H5B2__merge2(hdr, dxpl_id, depth, curr_node_ptr,
                            parent_cache_info_flags_ptr, internal, &internal_flags, idx) < 0)
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to merge child node")
                 } /* end else */
             } /* end if */
             else if(idx == internal->nrec) { /* Right-most child */
                 if(retries > 0 && (internal->node_ptrs[idx - 1].node_nrec > merge_nrec)) {
-                    if(H5B2_redistribute2(hdr, dxpl_id, depth, internal, (idx - 1)) < 0)
+                    if(H5B2__redistribute2(hdr, dxpl_id, depth, internal, (idx - 1)) < 0)
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTREDISTRIBUTE, FAIL, "unable to redistribute child node records")
                 } /* end if */
                 else {
-                    if(H5B2_merge2(hdr, dxpl_id, depth, curr_node_ptr,
+                    if(H5B2__merge2(hdr, dxpl_id, depth, curr_node_ptr,
                            parent_cache_info_flags_ptr, internal, &internal_flags, (idx - 1)) < 0)
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to merge child node")
                 } /* end else */
@@ -2330,11 +3192,11 @@ H5B2_remove_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, hbool_t *depth_decreased,
             else { /* Middle child */
                 if(retries > 0 && ((internal->node_ptrs[idx + 1].node_nrec > merge_nrec) ||
                             (internal->node_ptrs[idx - 1].node_nrec > merge_nrec))) {
-                    if(H5B2_redistribute3(hdr, dxpl_id, depth, internal, &internal_flags, idx) < 0)
+                    if(H5B2__redistribute3(hdr, dxpl_id, depth, internal, &internal_flags, idx) < 0)
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTREDISTRIBUTE, FAIL, "unable to redistribute child node records")
                 } /* end if */
                 else {
-                    if(H5B2_merge3(hdr, dxpl_id, depth, curr_node_ptr,
+                    if(H5B2__merge3(hdr, dxpl_id, depth, curr_node_ptr,
                            parent_cache_info_flags_ptr, internal, &internal_flags, idx) < 0)
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to merge child node")
                 } /* end else */
@@ -2345,7 +3207,7 @@ H5B2_remove_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, hbool_t *depth_decreased,
                 idx = 0;
             else {
 /* Actually, this can be easily updated (for 2-node redistrib.) and shouldn't require re-searching */
-                cmp = H5B2_locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx);
+                cmp = H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx);
                 if(cmp >= 0)
                     idx++;
             } /* end else */
@@ -2355,12 +3217,14 @@ H5B2_remove_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, hbool_t *depth_decreased,
         } /* end while */
 
         /* Handle deleting a record from an internal node */
-        if(!swap_loc && cmp == 0)
+        if(!swap_loc && cmp == 0) {
             swap_loc = H5B2_INT_NREC(internal, hdr, idx - 1);
+            swap_parent = internal;
+        } /* end if */
 
         /* Swap record to delete with record from leaf, if we are the last internal node */
         if(swap_loc && depth == 1)
-            if(H5B2_swap_leaf(hdr, dxpl_id, depth, internal, &internal_flags, idx, swap_loc) < 0)
+            if(H5B2__swap_leaf(hdr, dxpl_id, depth, internal, &internal_flags, idx, swap_loc) < 0)
                 HGOTO_ERROR(H5E_BTREE, H5E_CANTSWAP, FAIL, "Can't swap records in B-tree")
 
         /* Set pointers for advancing to child node */
@@ -2383,12 +3247,12 @@ H5B2_remove_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, hbool_t *depth_decreased,
 
     /* Attempt to remove record from child node */
     if(depth > 1) {
-        if(H5B2_remove_internal(hdr, dxpl_id, depth_decreased, swap_loc, depth - 1,
+        if(H5B2__remove_internal(hdr, dxpl_id, depth_decreased, swap_loc, swap_parent, (uint16_t)(depth - 1),
                 new_cache_info, new_cache_info_flags_ptr, next_pos, new_node_ptr, udata, op, op_data) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record from B-tree internal node")
     } /* end if */
     else {
-        if(H5B2_remove_leaf(hdr, dxpl_id, new_node_ptr, next_pos, udata, op, op_data) < 0)
+        if(H5B2__remove_leaf(hdr, dxpl_id, new_node_ptr, next_pos, new_cache_info, udata, op, op_data) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record from B-tree leaf node")
     } /* end else */
 
@@ -2397,10 +3261,11 @@ H5B2_remove_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, hbool_t *depth_decreased,
         new_node_ptr->all_nrec--;
 
     /* Mark node as dirty */
-    internal_flags |= H5AC__DIRTIED_FLAG;
+    if(!(hdr->swmr_write && collapsed_root))
+        internal_flags |= H5AC__DIRTIED_FLAG;
 
 #ifdef H5B2_DEBUG
-    H5B2_assert_internal((!collapsed_root ? (curr_node_ptr->all_nrec - 1) : new_node_ptr->all_nrec), hdr, internal);
+    H5B2__assert_internal((!collapsed_root ? (curr_node_ptr->all_nrec - 1) : new_node_ptr->all_nrec), hdr, internal);
 #endif /* H5B2_DEBUG */
 
 done:
@@ -2408,12 +3273,19 @@ done:
     if(internal && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, internal_addr, internal, internal_flags) < 0)
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node")
 
+    /* Release the new root's child on error */
+    if(new_root) {
+        HDassert(ret_value < 0);
+        if(H5AC_unprotect(hdr->f, dxpl_id, new_root_class, curr_node_ptr->addr, new_root, H5AC__NO_FLAGS_SET) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+    } /* end if */
+
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2_remove_internal() */
+} /* H5B2__remove_internal() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_remove_leaf_by_idx
+ * Function:	H5B2__remove_leaf_by_idx
  *
  * Purpose:	Removes a record from a B-tree leaf node, according to the
  *              offset in the B-tree records.
@@ -2427,8 +3299,8 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_remove_leaf_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
-    H5B2_node_ptr_t *curr_node_ptr, H5B2_nodepos_t curr_pos,
+H5B2__remove_leaf_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    H5B2_node_ptr_t *curr_node_ptr, H5B2_nodepos_t curr_pos, void *parent,
     unsigned idx, H5B2_remove_t op, void *op_data)
 {
     H5B2_leaf_t *leaf;                  /* Pointer to leaf node */
@@ -2436,7 +3308,7 @@ H5B2_remove_leaf_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
     unsigned    leaf_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting leaf node */
     herr_t	ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
@@ -2445,7 +3317,7 @@ H5B2_remove_leaf_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
 
     /* Lock B-tree leaf node */
     leaf_addr = curr_node_ptr->addr;
-    if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, leaf_addr, curr_node_ptr->node_nrec, H5AC_WRITE)))
+    if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, leaf_addr, parent, curr_node_ptr->node_nrec, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
     /* Sanity check number of records */
@@ -2482,17 +3354,26 @@ H5B2_remove_leaf_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
     /* Update number of records in node */
     leaf->nrec--;
 
-    /* Mark leaf node as dirty also */
-    leaf_flags |= H5AC__DIRTIED_FLAG;
-
     if(leaf->nrec > 0) {
+        /* Shadow the node if doing SWMR writes */
+        if(hdr->swmr_write) {
+            if(H5B2__shadow_leaf(hdr, dxpl_id, curr_node_ptr, &leaf) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow leaf node")
+            leaf_addr = curr_node_ptr->addr;
+        } /* end if */
+
         /* Pack record out of leaf */
         if(idx < leaf->nrec)
             HDmemmove(H5B2_LEAF_NREC(leaf, hdr, idx), H5B2_LEAF_NREC(leaf, hdr, (idx + 1)), hdr->cls->nrec_size * (leaf->nrec - idx));
+
+        /* Mark leaf node as dirty also */
+        leaf_flags |= H5AC__DIRTIED_FLAG;
     } /* end if */
     else {
         /* Let the cache know that the object is deleted */
-        leaf_flags |= H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+        leaf_flags |= H5AC__DELETED_FLAG;
+        if(!hdr->swmr_write)
+            leaf_flags |= H5AC__DIRTIED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
 
         /* Reset address of parent node pointer */
         curr_node_ptr->addr = HADDR_UNDEF;
@@ -2507,11 +3388,11 @@ done:
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release leaf B-tree node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2_remove_leaf_by_idx() */
+} /* H5B2__remove_leaf_by_idx() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_remove_internal_by_idx
+ * Function:	H5B2__remove_internal_by_idx
  *
  * Purpose:	Removes a record from a B-tree node, according to the offset
  *              in the B-tree records
@@ -2525,8 +3406,8 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_remove_internal_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
-    hbool_t *depth_decreased, void *swap_loc, unsigned depth,
+H5B2__remove_internal_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    hbool_t *depth_decreased, void *swap_loc, void *swap_parent, uint16_t depth,
     H5AC_info_t *parent_cache_info, unsigned *parent_cache_info_flags_ptr,
     H5B2_node_ptr_t *curr_node_ptr, H5B2_nodepos_t curr_pos, hsize_t n,
     H5B2_remove_t op, void *op_data)
@@ -2534,6 +3415,8 @@ H5B2_remove_internal_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
     H5AC_info_t *new_cache_info;        /* Pointer to new cache info */
     unsigned *new_cache_info_flags_ptr = NULL;
     H5B2_node_ptr_t *new_node_ptr;      /* Pointer to new node pointer */
+    const H5AC_class_t *new_root_class; /* Pointer to new root node's class info */
+    void *new_root = NULL;              /* Pointer to new root node (if old root collapsed) */
     H5B2_internal_t *internal;          /* Pointer to internal node */
     H5B2_nodepos_t next_pos = H5B2_POS_MIDDLE;  /* Position of next node */
     unsigned internal_flags = H5AC__NO_FLAGS_SET;
@@ -2542,7 +3425,7 @@ H5B2_remove_internal_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
     hbool_t     collapsed_root = FALSE; /* Whether the root was collapsed */
     herr_t	ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
@@ -2553,7 +3436,7 @@ H5B2_remove_internal_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
 
     /* Lock current B-tree node */
     internal_addr = curr_node_ptr->addr;
-    if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, internal_addr, curr_node_ptr->node_nrec, depth, H5AC_WRITE)))
+    if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, internal_addr, parent_cache_info, curr_node_ptr->node_nrec, depth, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
     HDassert(internal->nrec == curr_node_ptr->node_nrec);
     HDassert(depth == hdr->depth || internal->nrec > 1);
@@ -2568,17 +3451,71 @@ H5B2_remove_internal_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
         HDassert(depth == hdr->depth);
 
         /* Merge children of root node */
-        if(H5B2_merge2(hdr, dxpl_id, depth, curr_node_ptr,
+        if(H5B2__merge2(hdr, dxpl_id, depth, curr_node_ptr,
                 parent_cache_info_flags_ptr, internal, &internal_flags, 0) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to merge child node")
 
         /* Let the cache know that the object is deleted */
-        internal_flags |= H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+        internal_flags |= H5AC__DELETED_FLAG;
+        if(!hdr->swmr_write)
+            internal_flags |= H5AC__FREE_FILE_SPACE_FLAG;
 
         /* Reset information in header's root node pointer */
         curr_node_ptr->addr = internal->node_ptrs[0].addr;
         curr_node_ptr->node_nrec = internal->node_ptrs[0].node_nrec;
 
+        /* Update flush dependencies */
+        if(hdr->swmr_write) {
+            hbool_t update_dep = FALSE; /* Whether to update root flush dependency */
+
+            /* Update hdr to root dependency */
+            if(depth > 1) {
+                H5B2_internal_t *new_root_int = NULL;
+
+                /* Protect new root */
+                if(NULL == (new_root_int = H5B2__protect_internal(hdr, dxpl_id, curr_node_ptr->addr, hdr, curr_node_ptr->node_nrec, (uint16_t)(depth - 1), H5AC__NO_FLAGS_SET)))
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+                new_root_class = H5AC_BT2_INT;
+                new_root = new_root_int;
+
+                if(new_root_int->parent == internal) {
+                    new_root_int->parent = hdr;
+                    update_dep = TRUE;
+                } /* end if */
+                else
+                    HDassert(new_root_int->parent == hdr);
+            } /* end if */
+            else {
+                H5B2_leaf_t *new_root_leaf = NULL;
+
+                /* Protect new root */
+                if(NULL == (new_root_leaf = H5B2__protect_leaf(hdr, dxpl_id, curr_node_ptr->addr, hdr, curr_node_ptr->node_nrec, H5AC__NO_FLAGS_SET)))
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+                new_root_class = H5AC_BT2_LEAF;
+                new_root = new_root_leaf;
+
+                if(new_root_leaf->parent == internal) {
+                    new_root_leaf->parent = hdr;
+                    update_dep = TRUE;
+                } /* end if */
+                else
+                    HDassert(new_root_leaf->parent == hdr);
+            } /* end else */
+
+            /* Update flush dependency if necessary */
+            if(update_dep) {
+                if(H5B2__destroy_flush_depend((H5AC_info_t *)internal, (H5AC_info_t *)new_root) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+                if(H5B2__create_flush_depend((H5AC_info_t *)hdr, (H5AC_info_t *)new_root) < 0)
+                    HGOTO_ERROR(H5E_BTREE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+            } /* end if */
+
+            /* Unprotect the new root */
+            if(H5AC_unprotect(hdr->f, dxpl_id, new_root_class, curr_node_ptr->addr, new_root, H5AC__NO_FLAGS_SET) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+            new_root = NULL;
+        } /* end if */
+
         /* Indicate that the level of the B-tree decreased */
         *depth_decreased = TRUE;
 
@@ -2600,6 +3537,13 @@ H5B2_remove_internal_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
         hbool_t found = FALSE;  /* Comparison value of records */
         unsigned retries;       /* Number of times to attempt redistribution */
 
+        /* Shadow the node if doing SWMR writes */
+        if(hdr->swmr_write && !collapsed_root) {
+            if(H5B2__shadow_internal(hdr, dxpl_id, depth, curr_node_ptr, &internal) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTCOPY, FAIL, "unable to shadow internal node")
+            internal_addr = curr_node_ptr->addr;
+        } /* end if */
+
         /* Locate node pointer for child */
         if(swap_loc)
             idx = 0;
@@ -2645,27 +3589,27 @@ H5B2_remove_internal_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
             /* (NOTE: These 2-node redistributions should actually get the
              *  record to promote from the node with more records. - QAK)
              */
-            /* (NOTE: This code is the same in both H5B2_remove_internal() and
-             *  H5B2_remove_internal_by_idx(), fix bugs in both places! - QAK)
+            /* (NOTE: This code is the same in both H5B2__remove_internal() and
+             *  H5B2__remove_internal_by_idx(), fix bugs in both places! - QAK)
              */
             if(idx == 0) {    /* Left-most child */
                 if(retries > 0 && (internal->node_ptrs[idx + 1].node_nrec > merge_nrec)) {
-                    if(H5B2_redistribute2(hdr, dxpl_id, depth, internal, idx) < 0)
+                    if(H5B2__redistribute2(hdr, dxpl_id, depth, internal, idx) < 0)
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTREDISTRIBUTE, FAIL, "unable to redistribute child node records")
                 } /* end if */
                 else {
-                    if(H5B2_merge2(hdr, dxpl_id, depth, curr_node_ptr,
+                    if(H5B2__merge2(hdr, dxpl_id, depth, curr_node_ptr,
                            parent_cache_info_flags_ptr, internal, &internal_flags, idx) < 0)
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to merge child node")
                 } /* end else */
             } /* end if */
             else if(idx == internal->nrec) { /* Right-most child */
                 if(retries > 0 && (internal->node_ptrs[idx - 1].node_nrec > merge_nrec)) {
-                    if(H5B2_redistribute2(hdr, dxpl_id, depth, internal, (idx - 1)) < 0)
+                    if(H5B2__redistribute2(hdr, dxpl_id, depth, internal, (idx - 1)) < 0)
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTREDISTRIBUTE, FAIL, "unable to redistribute child node records")
                 } /* end if */
                 else {
-                    if(H5B2_merge2(hdr, dxpl_id, depth, curr_node_ptr,
+                    if(H5B2__merge2(hdr, dxpl_id, depth, curr_node_ptr,
                            parent_cache_info_flags_ptr, internal, &internal_flags, (idx - 1)) < 0)
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to merge child node")
                 } /* end else */
@@ -2673,11 +3617,11 @@ H5B2_remove_internal_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
             else { /* Middle child */
                 if(retries > 0 && ((internal->node_ptrs[idx + 1].node_nrec > merge_nrec) ||
                             (internal->node_ptrs[idx - 1].node_nrec > merge_nrec))) {
-                    if(H5B2_redistribute3(hdr, dxpl_id, depth, internal, &internal_flags, idx) < 0)
+                    if(H5B2__redistribute3(hdr, dxpl_id, depth, internal, &internal_flags, idx) < 0)
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTREDISTRIBUTE, FAIL, "unable to redistribute child node records")
                 } /* end if */
                 else {
-                    if(H5B2_merge3(hdr, dxpl_id, depth, curr_node_ptr,
+                    if(H5B2__merge3(hdr, dxpl_id, depth, curr_node_ptr,
                            parent_cache_info_flags_ptr, internal, &internal_flags, idx) < 0)
                         HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to merge child node")
                 } /* end else */
@@ -2727,12 +3671,14 @@ H5B2_remove_internal_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
         } /* end while */
 
         /* Handle deleting a record from an internal node */
-        if(!swap_loc && found)
+        if(!swap_loc && found) {
             swap_loc = H5B2_INT_NREC(internal, hdr, idx - 1);
+            swap_parent = internal;
+        } /* end if */
 
         /* Swap record to delete with record from leaf, if we are the last internal node */
         if(swap_loc && depth == 1)
-            if(H5B2_swap_leaf(hdr, dxpl_id, depth, internal, &internal_flags, idx, swap_loc) < 0)
+            if(H5B2__swap_leaf(hdr, dxpl_id, depth, internal, &internal_flags, idx, swap_loc) < 0)
                 HGOTO_ERROR(H5E_BTREE, H5E_CANTSWAP, FAIL, "can't swap records in B-tree")
 
         /* Set pointers for advancing to child node */
@@ -2755,12 +3701,12 @@ H5B2_remove_internal_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
 
     /* Attempt to remove record from child node */
     if(depth > 1) {
-        if(H5B2_remove_internal_by_idx(hdr, dxpl_id, depth_decreased, swap_loc, depth - 1,
+        if(H5B2__remove_internal_by_idx(hdr, dxpl_id, depth_decreased, swap_loc, swap_parent, (uint16_t)(depth - 1),
                 new_cache_info, new_cache_info_flags_ptr, new_node_ptr, next_pos, n, op, op_data) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record from B-tree internal node")
     } /* end if */
     else {
-        if(H5B2_remove_leaf_by_idx(hdr, dxpl_id, new_node_ptr, next_pos, (unsigned)n, op, op_data) < 0)
+        if(H5B2__remove_leaf_by_idx(hdr, dxpl_id, new_node_ptr, next_pos, new_cache_info, (unsigned)n, op, op_data) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTDELETE, FAIL, "unable to remove record from B-tree leaf node")
     } /* end else */
 
@@ -2769,10 +3715,11 @@ H5B2_remove_internal_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
         new_node_ptr->all_nrec--;
 
     /* Mark node as dirty */
-    internal_flags |= H5AC__DIRTIED_FLAG;
+    if(!(hdr->swmr_write && collapsed_root))
+        internal_flags |= H5AC__DIRTIED_FLAG;
 
 #ifdef H5B2_DEBUG
-    H5B2_assert_internal((!collapsed_root ? (curr_node_ptr->all_nrec - 1) : new_node_ptr->all_nrec), hdr, internal);
+    H5B2__assert_internal((!collapsed_root ? (curr_node_ptr->all_nrec - 1) : new_node_ptr->all_nrec), hdr, internal);
 #endif /* H5B2_DEBUG */
 
 done:
@@ -2780,12 +3727,19 @@ done:
     if(internal && H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, internal_addr, internal, internal_flags) < 0)
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node")
 
+    /* Release the new root's child on error */
+    if(new_root) {
+        HDassert(ret_value < 0);
+        if(H5AC_unprotect(hdr->f, dxpl_id, new_root_class, curr_node_ptr->addr, new_root, H5AC__NO_FLAGS_SET) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
+    } /* end if */
+
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2_remove_internal_by_idx() */
+} /* H5B2__remove_internal_by_idx() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_neighbor_leaf
+ * Function:	H5B2__neighbor_leaf
  *
  * Purpose:	Locate a record relative to the specified information in a
  *              B-tree leaf node and return that information by filling in
@@ -2811,8 +3765,8 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_neighbor_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_ptr,
-    void *neighbor_loc, H5B2_compare_t comp, void *udata, H5B2_found_t op,
+H5B2__neighbor_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_ptr,
+    void *neighbor_loc, H5B2_compare_t comp, void *parent, void *udata, H5B2_found_t op,
     void *op_data)
 {
     H5B2_leaf_t *leaf;                  /* Pointer to leaf node */
@@ -2820,7 +3774,7 @@ H5B2_neighbor_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_pt
     int         cmp = 0;                /* Comparison value of records */
     herr_t	ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
@@ -2829,11 +3783,11 @@ H5B2_neighbor_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, H5B2_node_ptr_t *curr_node_pt
     HDassert(op);
 
     /* Lock current B-tree node */
-    if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, curr_node_ptr->addr, curr_node_ptr->node_nrec, H5AC_READ)))
+    if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, curr_node_ptr->addr, parent, curr_node_ptr->node_nrec, H5AC__READ_ONLY_FLAG)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
     /* Locate node pointer for child */
-    cmp = H5B2_locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx);
+    cmp = H5B2__locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx);
     if(cmp > 0)
         idx++;
     else
@@ -2867,11 +3821,11 @@ done:
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree leaf node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2_neighbor_leaf() */
+} /* H5B2__neighbor_leaf() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_neighbor_internal
+ * Function:	H5B2__neighbor_internal
  *
  * Purpose:	Locate a record relative to the specified information in a
  *              B-tree internal node and return that information by filling in
@@ -2897,16 +3851,16 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_neighbor_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
+H5B2__neighbor_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
     H5B2_node_ptr_t *curr_node_ptr, void *neighbor_loc, H5B2_compare_t comp,
-    void *udata, H5B2_found_t op, void *op_data)
+    void *parent, void *udata, H5B2_found_t op, void *op_data)
 {
     H5B2_internal_t *internal;          /* Pointer to internal node */
     unsigned    idx;                    /* Location of record which matches key */
     int         cmp = 0;                /* Comparison value of records */
     herr_t	ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
@@ -2916,11 +3870,11 @@ H5B2_neighbor_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
     HDassert(op);
 
     /* Lock current B-tree node */
-    if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, curr_node_ptr->addr, curr_node_ptr->node_nrec, depth, H5AC_READ)))
+    if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, curr_node_ptr->addr, parent, curr_node_ptr->node_nrec, depth, H5AC__READ_ONLY_FLAG)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
 
     /* Locate node pointer for child */
-    cmp = H5B2_locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx);
+    cmp = H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx);
     if(cmp > 0)
         idx++;
 
@@ -2938,11 +3892,11 @@ H5B2_neighbor_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
 
     /* Attempt to find neighboring record */
     if(depth > 1) {
-        if(H5B2_neighbor_internal(hdr, dxpl_id, depth - 1, &internal->node_ptrs[idx], neighbor_loc, comp, udata, op, op_data) < 0)
+        if(H5B2__neighbor_internal(hdr, dxpl_id, (uint16_t)(depth - 1), &internal->node_ptrs[idx], neighbor_loc, comp, internal, udata, op, op_data) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "unable to find neighbor record in B-tree internal node")
     } /* end if */
     else {
-        if(H5B2_neighbor_leaf(hdr, dxpl_id, &internal->node_ptrs[idx], neighbor_loc, comp, udata, op, op_data) < 0)
+        if(H5B2__neighbor_leaf(hdr, dxpl_id, &internal->node_ptrs[idx], neighbor_loc, comp, internal, udata, op, op_data) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "unable to find neighbor record in B-tree leaf node")
     } /* end else */
 
@@ -2952,11 +3906,11 @@ done:
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2_neighbor_internal() */
+} /* H5B2__neighbor_internal() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_delete_node
+ * Function:	H5B2__delete_node
  *
  * Purpose:	Iterate over all the nodes in a B-tree node deleting them
  *		after they no longer have any children
@@ -2970,15 +3924,16 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_delete_node(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
-    const H5B2_node_ptr_t *curr_node, H5B2_remove_t op, void *op_data)
+H5B2__delete_node(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
+    const H5B2_node_ptr_t *curr_node, void *parent, H5B2_remove_t op,
+    void *op_data)
 {
     const H5AC_class_t *curr_node_class = NULL; /* Pointer to current node's class info */
     void *node = NULL;                  /* Pointers to current node */
     uint8_t *native;                    /* Pointers to node's native records */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
@@ -2989,7 +3944,7 @@ H5B2_delete_node(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
         unsigned u;                    /* Local index */
 
         /* Lock the current B-tree node */
-        if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, curr_node->addr, curr_node->node_nrec, depth, H5AC_WRITE)))
+        if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, curr_node->addr, parent, curr_node->node_nrec, depth, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
 
         /* Set up information about current node */
@@ -2999,14 +3954,14 @@ H5B2_delete_node(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
 
         /* Descend into children */
         for(u = 0; u < internal->nrec + (unsigned)1; u++)
-            if(H5B2_delete_node(hdr, dxpl_id, (depth - 1), &(internal->node_ptrs[u]), op, op_data) < 0)
+            if(H5B2__delete_node(hdr, dxpl_id, (uint16_t)(depth - 1), &(internal->node_ptrs[u]), internal, op, op_data) < 0)
                 HGOTO_ERROR(H5E_BTREE, H5E_CANTLIST, FAIL, "node descent failed")
     } /* end if */
     else {
         H5B2_leaf_t *leaf;             /* Pointer to leaf node */
 
         /* Lock the current B-tree node */
-        if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, curr_node->addr, curr_node->node_nrec, H5AC_WRITE)))
+        if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, curr_node->addr, parent, curr_node->node_nrec, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
         /* Set up information about current node */
@@ -3029,15 +3984,15 @@ H5B2_delete_node(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
 
 done:
     /* Unlock & delete current node */
-    if(node && H5AC_unprotect(hdr->f, dxpl_id, curr_node_class, curr_node->addr, node, H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG) < 0)
+    if(node && H5AC_unprotect(hdr->f, dxpl_id, curr_node_class, curr_node->addr, node, (unsigned)(H5AC__DELETED_FLAG | (hdr->swmr_write ? 0 : H5AC__FREE_FILE_SPACE_FLAG))) < 0)
         HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2_delete_node() */
+} /* H5B2__delete_node() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5B2_node_size
+ * Function:    H5B2__node_size
  *
  * Purpose:     Iterate over all the records from a B-tree node, collecting
  *		btree storage info.
@@ -3050,13 +4005,13 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_node_size(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
-    const H5B2_node_ptr_t *curr_node, hsize_t *btree_size)
+H5B2__node_size(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
+    const H5B2_node_ptr_t *curr_node, void *parent, hsize_t *btree_size)
 {
     H5B2_internal_t 	*internal = NULL;     	/* Pointer to internal node */
     herr_t 		ret_value = SUCCEED;  	/* Iterator return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(hdr);
@@ -3065,7 +4020,7 @@ H5B2_node_size(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
     HDassert(depth > 0);
 
     /* Lock the current B-tree node */
-    if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, curr_node->addr, curr_node->node_nrec, depth, H5AC_READ)))
+    if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, curr_node->addr, parent, curr_node->node_nrec, depth, H5AC__READ_ONLY_FLAG)))
         HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
 
     /* Recursively descend into child nodes, if we are above the "twig" level in the B-tree */
@@ -3074,7 +4029,7 @@ H5B2_node_size(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
 
         /* Descend into children */
         for(u = 0; u < internal->nrec + (unsigned)1; u++)
-            if(H5B2_node_size(hdr, dxpl_id, (depth - 1), &(internal->node_ptrs[u]), btree_size) < 0)
+            if(H5B2__node_size(hdr, dxpl_id, (uint16_t)(depth - 1), &(internal->node_ptrs[u]), internal, btree_size) < 0)
                 HGOTO_ERROR(H5E_BTREE, H5E_CANTLIST, FAIL, "node iteration failed")
     } /* end if */
     else /* depth is 1: count all the leaf nodes from this node */
@@ -3088,11 +4043,11 @@ done:
 	HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2_node_size() */
+} /* H5B2__node_size() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_internal_free
+ * Function:	H5B2__internal_free
  *
  * Purpose:	Destroys a B-tree internal node in memory.
  *
@@ -3105,11 +4060,11 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_internal_free(H5B2_internal_t *internal)
+H5B2__internal_free(H5B2_internal_t *internal)
 {
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /*
      * Check arguments.
@@ -3125,7 +4080,7 @@ H5B2_internal_free(H5B2_internal_t *internal)
         internal->node_ptrs = (H5B2_node_ptr_t *)H5FL_FAC_FREE(internal->hdr->node_info[internal->depth].node_ptr_fac, internal->node_ptrs);
 
     /* Decrement ref. count on B-tree header */
-    if(H5B2_hdr_decr(internal->hdr) < 0)
+    if(H5B2__hdr_decr(internal->hdr) < 0)
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTDEC, FAIL, "can't decrement ref. count on B-tree header")
 
     /* Free B-tree internal node info */
@@ -3133,11 +4088,11 @@ H5B2_internal_free(H5B2_internal_t *internal)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_internal_free() */
+} /* end H5B2__internal_free() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_leaf_free
+ * Function:	H5B2__leaf_free
  *
  * Purpose:	Destroys a B-tree leaf node in memory.
  *
@@ -3150,11 +4105,11 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5B2_leaf_free(H5B2_leaf_t *leaf)
+H5B2__leaf_free(H5B2_leaf_t *leaf)
 {
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /*
      * Check arguments.
@@ -3166,7 +4121,7 @@ H5B2_leaf_free(H5B2_leaf_t *leaf)
         leaf->leaf_native = (uint8_t *)H5FL_FAC_FREE(leaf->hdr->node_info[0].nat_rec_fac, leaf->leaf_native);
 
     /* Decrement ref. count on B-tree header */
-    if(H5B2_hdr_decr(leaf->hdr) < 0)
+    if(H5B2__hdr_decr(leaf->hdr) < 0)
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTDEC, FAIL, "can't decrement ref. count on B-tree header")
 
     /* Free B-tree leaf node info */
@@ -3174,12 +4129,213 @@ H5B2_leaf_free(H5B2_leaf_t *leaf)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B2_leaf_free() */
+} /* end H5B2__leaf_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5B2__shadow_internal
+ *
+ * Purpose:     "Shadow: an internal node - copy it to a new location,
+ *              leaving the data in the old location intact (for now).
+ *              This is done when writing in SWMR mode to ensure that
+ *              readers do not see nodes that are out of date with
+ *              respect to each other and thereby inconsistent.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Apr 27 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2__shadow_internal(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
+    H5B2_node_ptr_t *curr_node_ptr, H5B2_internal_t **internal)
+{
+    hbool_t node_pinned = FALSE;
+    hbool_t node_protected = TRUE;
+    haddr_t new_node_addr;              /* Address to move node to */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(depth > 0);
+    HDassert(curr_node_ptr);
+    HDassert(H5F_addr_defined(curr_node_ptr->addr));
+    HDassert(internal);
+    HDassert(*internal);
+    HDassert(hdr->swmr_write);
+    HDassert((*internal)->hdr == hdr);
+
+    /* We only need to shadow the node if it has not been shadowed since the
+     * last time the header was flushed, as otherwise it will be unreachable by
+     * the readers so there will be no need to shadow.  To check if it has been
+     * shadowed, check if it is on the shadowed node list.  shadowed_next will
+     * be equal to internal if this node is at the head, so it can be used to
+     * determine if this node is in the list. */
+    if(!(*internal)->shadowed_next) {
+        /*
+         * We must clone the old node so readers with an out-of-date version of
+         * the parent can still see the correct number of children, via the
+         * shadowed node.  Remove it from cache but do not mark it free on disk.
+         */
+        /* Allocate space for the cloned node */
+        if(HADDR_UNDEF == (new_node_addr = H5MF_alloc(hdr->f, H5FD_MEM_BTREE, dxpl_id, (hsize_t)hdr->node_size)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "unable to allocate file space to move B-tree node")
+
+        /* Pin old entry so it is not flushed when we unprotect */
+        if(H5AC_pin_protected_entry(*internal) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPIN, FAIL, "unable to pin old B-tree node")
+        node_pinned = TRUE;
+
+        /* Unprotect node so we can move it.  Do not mark it dirty yet so it is
+         * not flushed to the old location (however unlikely). */
+        if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr->addr, *internal, H5AC__NO_FLAGS_SET) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release old B-tree node")
+        node_protected = FALSE;
+
+        /* Move the location of the old child on the disk */
+        if(H5AC_move_entry(hdr->f, H5AC_BT2_INT, curr_node_ptr->addr, new_node_addr) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTMOVE, FAIL, "unable to move B-tree node")
+        curr_node_ptr->addr = new_node_addr;
+
+        /* Re-protect node at new address.  Should have the same location in
+         * memory. */
+        if(*internal != H5B2__protect_internal(hdr, dxpl_id, curr_node_ptr->addr, (*internal)->parent, curr_node_ptr->node_nrec, depth, H5AC__NO_FLAGS_SET))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree internal node")
+        node_protected = TRUE;
+
+        /* Add node to shadowed node list */
+        if(hdr->shadowed_internal) {
+            (*internal)->shadowed_next = hdr->shadowed_internal;
+            hdr->shadowed_internal->shadowed_prev = *internal;
+        } /* end if */
+        else
+            (*internal)->shadowed_next = *internal;
+        hdr->shadowed_internal = *internal;
+    } /* end if */
+
+done:
+    if(node_pinned)
+        if(H5AC_unpin_entry(*internal) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPIN, FAIL, "unable to unpin internal B-tree node")
+
+    if(!node_protected) {
+        HDassert(ret_value < 0);
+        *internal = NULL;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__shadow_internal() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5B2__shadow_leaf
+ *
+ * Purpose:     "Shadow: a leaf node - copy it to a new location, leaving
+ *              the data in the old location intact (for now).  This is
+ *              done when writing in SWMR mode to ensure that readers do
+ *              not see nodes that are out of date with respect to each
+ *              other and thereby inconsistent.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Apr 27 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B2__shadow_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    H5B2_node_ptr_t *curr_node_ptr, H5B2_leaf_t **leaf)
+{
+    hbool_t node_pinned = FALSE;
+    hbool_t node_protected = TRUE;
+    haddr_t new_node_addr;              /* Address to move node to */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(curr_node_ptr);
+    HDassert(H5F_addr_defined(curr_node_ptr->addr));
+    HDassert(leaf);
+    HDassert(*leaf);
+    HDassert(hdr->swmr_write);
+    HDassert((*leaf)->hdr == hdr);
+
+    /* We only need to shadow the node if it has not been shadowed since the
+     * last time the header was flushed, as otherwise it will be unreachable by
+     * the readers so there will be no need to shadow.  To check if it has been
+     * shadowed, check if it is on the shadowed node list.  shadowed_next will
+     * be equal to leaf if this node is at the head, so it can be used to
+     * determine if this node is in the list. */
+    if(!(*leaf)->shadowed_next) {
+        /*
+        * We must clone the old node so readers with an out-of-date version of
+        * the parent can still see the correct number of children, via the
+        * shadowed node.  Remove it from cache but do not mark it free on disk.
+        */
+        /* Allocate space for the cloned node */
+        if(HADDR_UNDEF == (new_node_addr = H5MF_alloc(hdr->f, H5FD_MEM_BTREE, dxpl_id, (hsize_t)hdr->node_size)))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "unable to allocate file space to move B-tree node")
+
+        /* Pin old entry so it is not flushed when we unprotect */
+        if(H5AC_pin_protected_entry(*leaf) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPIN, FAIL, "unable to pin old B-tree node")
+        node_pinned = TRUE;
+
+        /* Unprotect node so we can move it.  Do not mark it dirty yet so it is
+        * not flushed to the old location (however unlikely). */
+        if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr->addr, *leaf, H5AC__NO_FLAGS_SET) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release old B-tree node")
+        node_protected = FALSE;
+
+        /* Move the location of the old child on the disk */
+        if(H5AC_move_entry(hdr->f, H5AC_BT2_LEAF, curr_node_ptr->addr, new_node_addr) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTMOVE, FAIL, "unable to move B-tree node")
+        curr_node_ptr->addr = new_node_addr;
+
+        /* Re-protect node at new address.  Should have the same location in
+         * memory. */
+        if(*leaf != H5B2__protect_leaf(hdr, dxpl_id, curr_node_ptr->addr, (*leaf)->parent, curr_node_ptr->node_nrec, H5AC__NO_FLAGS_SET))
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
+        node_protected = TRUE;
+
+        /* Add node to shadowed node list */
+        if(hdr->shadowed_leaf) {
+            (*leaf)->shadowed_next = hdr->shadowed_leaf;
+            hdr->shadowed_leaf->shadowed_prev = *leaf;
+        } /* end if */
+        else
+            (*leaf)->shadowed_next = *leaf;
+        hdr->shadowed_leaf = *leaf;
+    } /* end if */
+
+done:
+    if(node_pinned)
+        if(H5AC_unpin_entry(*leaf) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPIN, FAIL, "unable to unpin leaf B-tree node")
+
+    if(!node_protected) {
+        HDassert(ret_value < 0);
+        *leaf = NULL;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__shadow_leaf() */
 
 #ifdef H5B2_DEBUG
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_assert_leaf
+ * Function:	H5B2__assert_leaf
  *
  * Purpose:	Verify than a leaf node is mostly sane
  *
@@ -3192,17 +4348,17 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2_assert_leaf(const H5B2_hdr_t *hdr, const H5B2_leaf_t *leaf)
+H5B2__assert_leaf(const H5B2_hdr_t *hdr, const H5B2_leaf_t *leaf)
 {
     /* General sanity checking on node */
     HDassert(leaf->nrec <= hdr->node_info->split_nrec);
 
     return(0);
-} /* end H5B2_assert_leaf() */
+} /* end H5B2__assert_leaf() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_assert_leaf2
+ * Function:	H5B2__assert_leaf2
  *
  * Purpose:	Verify than a leaf node is mostly sane
  *
@@ -3215,17 +4371,17 @@ H5B2_assert_leaf(const H5B2_hdr_t *hdr, const H5B2_leaf_t *leaf)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2_assert_leaf2(const H5B2_hdr_t *hdr, const H5B2_leaf_t *leaf, const H5B2_leaf_t H5_ATTR_UNUSED *leaf2)
+H5B2__assert_leaf2(const H5B2_hdr_t *hdr, const H5B2_leaf_t *leaf, const H5B2_leaf_t H5_ATTR_UNUSED *leaf2)
 {
     /* General sanity checking on node */
     HDassert(leaf->nrec <= hdr->node_info->split_nrec);
 
     return(0);
-} /* end H5B2_assert_leaf2() */
+} /* end H5B2__assert_leaf2() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_assert_internal
+ * Function:	H5B2__assert_internal
  *
  * Purpose:	Verify than an internal node is mostly sane
  *
@@ -3238,7 +4394,7 @@ H5B2_assert_leaf2(const H5B2_hdr_t *hdr, const H5B2_leaf_t *leaf, const H5B2_lea
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2_assert_internal(hsize_t parent_all_nrec, const H5B2_hdr_t *hdr, const H5B2_internal_t *internal)
+H5B2__assert_internal(hsize_t parent_all_nrec, const H5B2_hdr_t *hdr, const H5B2_internal_t *internal)
 {
     hsize_t tot_all_nrec;       /* Total number of records at or below this node */
     uint16_t u, v;               /* Local index variables */
@@ -3262,11 +4418,11 @@ H5B2_assert_internal(hsize_t parent_all_nrec, const H5B2_hdr_t *hdr, const H5B2_
         HDassert(tot_all_nrec == parent_all_nrec);
 
     return(0);
-} /* end H5B2_assert_internal() */
+} /* end H5B2__assert_internal() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_assert_internal2
+ * Function:	H5B2__assert_internal2
  *
  * Purpose:	Verify than internal nodes are mostly sane
  *
@@ -3279,7 +4435,7 @@ H5B2_assert_internal(hsize_t parent_all_nrec, const H5B2_hdr_t *hdr, const H5B2_
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2_assert_internal2(hsize_t parent_all_nrec, const H5B2_hdr_t *hdr, const H5B2_internal_t *internal, const H5B2_internal_t *internal2)
+H5B2__assert_internal2(hsize_t parent_all_nrec, const H5B2_hdr_t *hdr, const H5B2_internal_t *internal, const H5B2_internal_t *internal2)
 {
     hsize_t tot_all_nrec;       /* Total number of records at or below this node */
     uint16_t u, v;       /* Local index variables */
@@ -3305,6 +4461,70 @@ H5B2_assert_internal2(hsize_t parent_all_nrec, const H5B2_hdr_t *hdr, const H5B2
         HDassert(tot_all_nrec == parent_all_nrec);
 
     return(0);
-} /* end H5B2_assert_internal2() */
+} /* end H5B2__assert_internal2() */
 #endif /* H5B2_DEBUG */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5B2__create_flush_depend
+ *
+ * Purpose:     Create a flush dependency between two data structure components
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2__create_flush_depend(H5AC_info_t *parent_entry, H5AC_info_t *child_entry)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+    
+    /* Sanity check */
+    HDassert(parent_entry);
+    HDassert(child_entry);
+
+    /* Create a flush dependency between parent and child entry */
+    if(H5AC_create_flush_dependency(parent_entry, child_entry) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__create_flush_depend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5B2__destroy_flush_depend
+ *
+ * Purpose:     Destroy a flush dependency between two data structure components
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5B2__destroy_flush_depend(H5AC_info_t *parent_entry, H5AC_info_t *child_entry)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+    
+    /* Sanity check */
+    HDassert(parent_entry);
+    HDassert(child_entry);
+
+    /* Destroy a flush dependency between parent and child entry */
+    if(H5AC_destroy_flush_dependency(parent_entry, child_entry) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5B2__destroy_flush_depend() */
+
diff --git a/src/H5B2module.h b/src/H5B2module.h
new file mode 100644
index 0000000..0fc30a5
--- /dev/null
+++ b/src/H5B2module.h
@@ -0,0 +1,36 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5B2 package.  Including this header means that the source file
+ *		is part of the H5B2 package.
+ */
+#ifndef _H5B2module_H
+#define _H5B2module_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5B2_MODULE
+#define H5_MY_PKG       H5B2
+#define H5_MY_PKG_ERR   H5E_BTREE
+#define H5_MY_PKG_INIT  NO
+
+#endif /* _H5B2module_H */
+
+
diff --git a/src/H5B2pkg.h b/src/H5B2pkg.h
index 3ea9534..5691d5f 100644
--- a/src/H5B2pkg.h
+++ b/src/H5B2pkg.h
@@ -21,7 +21,7 @@
  *		the H5B2 package.  Source files outside the H5B2 package should
  *		include H5B2private.h instead.
  */
-#ifndef H5B2_PACKAGE
+#if !(defined H5B2_FRIEND || defined H5B2_MODULE)
 #error "Do not include this file outside the H5B2 package!"
 #endif
 
@@ -45,10 +45,10 @@
 
 /* Size of a "tree pointer" (on disk) */
 /* (essentially, the largest internal pointer allowed) */
-#define H5B2_TREE_POINTER_SIZE(h)       (                                     \
-    (h)->sizeof_addr +                                                        \
+#define H5B2_TREE_POINTER_SIZE(sizeof_addr, sizeof_size)       (              \
+    (sizeof_addr) +                                                           \
     H5B2_SIZEOF_RECORDS_PER_NODE +                                            \
-    (h)->sizeof_size                                                          \
+    (sizeof_size)                                                             \
     )
 
 /* Size of a internal node pointer (on disk) */
@@ -70,7 +70,7 @@
     )
 
 /* Size of the v2 B-tree header on disk */
-#define H5B2_HEADER_SIZE(h)   (                                             \
+#define H5B2_HEADER_SIZE(sizeof_addr, sizeof_size)   (                        \
     /* General metadata fields */                                             \
     H5B2_METADATA_PREFIX_SIZE                                                 \
                                                                               \
@@ -80,7 +80,17 @@
     + (unsigned)2 /* Depth of tree */                                         \
     + (unsigned)1 /* Split % of full (as integer, ie. "98" means 98%) */      \
     + (unsigned)1 /* Merge % of full (as integer, ie. "98" means 98%) */      \
-    + H5B2_TREE_POINTER_SIZE(h)  /* Node pointer to root node in tree */      \
+    + H5B2_TREE_POINTER_SIZE(sizeof_addr, sizeof_size)  /* Node pointer to root node in tree */ \
+    )
+
+/* Size of the v2 B-tree header on disk (via file pointer) */
+#define H5B2_HEADER_SIZE_FILE(f)   (                                          \
+    H5B2_HEADER_SIZE(H5F_SIZEOF_ADDR(f), H5F_SIZEOF_SIZE(f))                  \
+    )
+
+/* Size of the v2 B-tree header on disk (via v2 B-tree header) */
+#define H5B2_HEADER_SIZE_HDR(h)   (                                           \
+    H5B2_HEADER_SIZE((h)->sizeof_addr, (h)->sizeof_size)                      \
     )
 
 /* Size of the v2 B-tree internal node prefix */
@@ -160,6 +170,7 @@ typedef struct H5B2_hdr_t {
 
     /* Shared internal data structures (not stored) */
     H5F_t       *f;             /* Pointer to the file that the B-tree is in */
+    void        *parent;        /* Flush dependency parent */
     haddr_t     addr;           /* Address of B-tree header in the file */
     size_t      hdr_size;       /* Size of the B-tree header on disk */
     size_t      rc;             /* Reference count of nodes using this header */
@@ -172,6 +183,9 @@ typedef struct H5B2_hdr_t {
     uint8_t	*page;	        /* Common disk page for I/O */
     size_t      *nat_off;       /* Array of offsets of native records */
     H5B2_node_info_t *node_info; /* Table of node info structs for current depth of B-tree */
+    hbool_t     swmr_write;     /* Whether we are doing SWMR writes */
+    struct H5B2_leaf_t *shadowed_leaf; /* Linked list of shadowed leaf nodes */
+    struct H5B2_internal_t *shadowed_internal; /* Linked list of shadowed internal nodes */
     uint8_t     *min_native_rec;   /* Pointer to minimum native record                  */
     uint8_t     *max_native_rec;   /* Pointer to maximum native record                  */
 
@@ -187,8 +201,11 @@ typedef struct H5B2_leaf_t {
 
     /* Internal B-tree information */
     H5B2_hdr_t	*hdr;		/* Pointer to the [pinned] v2 B-tree header   */
+    void        *parent;        /* Flush dependency parent                    */
     uint8_t     *leaf_native;   /* Pointer to native records                  */
     uint16_t    nrec;           /* Number of records in node                  */
+    struct H5B2_leaf_t *shadowed_next; /* Next node in shadowed list          */
+    struct H5B2_leaf_t *shadowed_prev; /* Previous node in shadowed list      */
 } H5B2_leaf_t;
 
 /* B-tree internal node information */
@@ -198,10 +215,13 @@ typedef struct H5B2_internal_t {
 
     /* Internal B-tree information */
     H5B2_hdr_t	*hdr;		/* Pointer to the [pinned] v2 B-tree header   */
+    void        *parent;        /* Flush dependency parent                    */
     uint8_t     *int_native;    /* Pointer to native records                  */
     H5B2_node_ptr_t *node_ptrs; /* Pointer to node pointers                   */
     uint16_t    nrec;           /* Number of records in node                  */
     uint16_t    depth;          /* Depth of this node in the B-tree           */
+    struct H5B2_internal_t *shadowed_next; /* Next node in shadowed list      */
+    struct H5B2_internal_t *shadowed_prev; /* Previous node in shadowed list  */
 } H5B2_internal_t;
 
 /* v2 B-tree */
@@ -221,6 +241,7 @@ typedef enum H5B2_nodepos_t {
 /* Callback info for loading a free space header into the cache */
 typedef struct H5B2_hdr_cache_ud_t {
     H5F_t *f;                   /* File that v2 b-tree header is within */
+    haddr_t addr;               /* Address of B-tree header in the file */
     void *ctx_udata;            /* User-data for protecting */
 } H5B2_hdr_cache_ud_t;
 
@@ -228,22 +249,24 @@ typedef struct H5B2_hdr_cache_ud_t {
 typedef struct H5B2_internal_cache_ud_t {
     H5F_t *f;                   /* File that v2 b-tree header is within */
     H5B2_hdr_t *hdr;            /* v2 B-tree header */
-    unsigned nrec;              /* Number of records in node to load */
-    unsigned depth;             /* Depth of node to load */
+    void *parent;               /* Flush dependency parent */
+    uint16_t nrec;              /* Number of records in node to load */
+    uint16_t depth;             /* Depth of node to load */
 } H5B2_internal_cache_ud_t;
 
 /* Callback info for loading a free space leaf node into the cache */
 typedef struct H5B2_leaf_cache_ud_t {
     H5F_t *f;                   /* File that v2 b-tree header is within */
     H5B2_hdr_t *hdr;            /* v2 B-tree header */
-    unsigned nrec;              /* Number of records in node to load */
+    void *parent;               /* Flush dependency parent */
+    uint16_t nrec;              /* Number of records in node to load */
 } H5B2_leaf_cache_ud_t;
 
 #ifdef H5B2_TESTING
 /* Node information for testing */
 typedef struct {
-    unsigned depth;             /* Depth of node */
-    unsigned nrec;              /* Number of records in node */
+    uint16_t depth;             /* Depth of node */
+    uint16_t nrec;              /* Number of records in node */
 } H5B2_node_info_test_t;
 #endif /* H5B2_TESTING */
 
@@ -280,89 +303,102 @@ extern const H5B2_class_t *const H5B2_client_class_g[H5B2_NUM_BTREE_ID];
 /* Package Private Prototypes */
 /******************************/
 
+/* Generic routines */
+H5_DLL herr_t H5B2__create_flush_depend(H5AC_info_t *parent_entry,
+    H5AC_info_t *child_entry);
+H5_DLL herr_t H5B2__destroy_flush_depend(H5AC_info_t *parent_entry,
+    H5AC_info_t *child_entry);
+
 /* Routines for managing B-tree header info */
-H5_DLL H5B2_hdr_t *H5B2_hdr_alloc(H5F_t *f);
-H5_DLL haddr_t H5B2_hdr_create(H5F_t *f, hid_t dxpl_id,
+H5_DLL H5B2_hdr_t *H5B2__hdr_alloc(H5F_t *f);
+H5_DLL haddr_t H5B2__hdr_create(H5F_t *f, hid_t dxpl_id,
     const H5B2_create_t *cparam, void *ctx_udata);
-H5_DLL herr_t H5B2_hdr_init(H5B2_hdr_t *hdr, const H5B2_create_t *cparam,
+H5_DLL herr_t H5B2__hdr_init(H5B2_hdr_t *hdr, const H5B2_create_t *cparam,
     void *ctx_udata, uint16_t depth);
-H5_DLL herr_t H5B2_hdr_incr(H5B2_hdr_t *hdr);
-H5_DLL herr_t H5B2_hdr_decr(H5B2_hdr_t *hdr);
-H5_DLL herr_t H5B2_hdr_fuse_incr(H5B2_hdr_t *hdr);
-H5_DLL size_t H5B2_hdr_fuse_decr(H5B2_hdr_t *hdr);
-H5_DLL herr_t H5B2_hdr_dirty(H5B2_hdr_t *hdr);
-H5_DLL herr_t H5B2_hdr_delete(H5B2_hdr_t *hdr, hid_t dxpl_id);
+H5_DLL herr_t H5B2__hdr_incr(H5B2_hdr_t *hdr);
+H5_DLL herr_t H5B2__hdr_decr(H5B2_hdr_t *hdr);
+H5_DLL herr_t H5B2__hdr_fuse_incr(H5B2_hdr_t *hdr);
+H5_DLL size_t H5B2__hdr_fuse_decr(H5B2_hdr_t *hdr);
+H5_DLL herr_t H5B2__hdr_dirty(H5B2_hdr_t *hdr);
+H5_DLL H5B2_hdr_t *H5B2__hdr_protect(H5F_t *f, hid_t dxpl_id, haddr_t hdr_addr,
+    void *ctx_udata, unsigned flags);
+H5_DLL herr_t H5B2__hdr_unprotect(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    unsigned cache_flags);
+H5_DLL herr_t H5B2__hdr_delete(H5B2_hdr_t *hdr, hid_t dxpl_id);
 
 /* Routines for operating on leaf nodes */
-H5B2_leaf_t *H5B2_protect_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, haddr_t addr,
-    unsigned nrec, H5AC_protect_t rw);
+H5B2_leaf_t *H5B2__protect_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, haddr_t addr,
+    void *parent, uint16_t nrec, unsigned flags);
 
 /* Routines for operating on internal nodes */
-H5_DLL H5B2_internal_t *H5B2_protect_internal(H5B2_hdr_t *hdr, hid_t dxpl_id,
-    haddr_t addr, unsigned nrec, unsigned depth, H5AC_protect_t rw);
+H5_DLL H5B2_internal_t *H5B2__protect_internal(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    haddr_t addr, void *parent, uint16_t nrec, uint16_t depth, unsigned flags);
 
 /* Routines for allocating nodes */
-H5_DLL herr_t H5B2_split_root(H5B2_hdr_t *hdr, hid_t dxpl_id);
-H5_DLL herr_t H5B2_create_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id,
+H5_DLL herr_t H5B2__split_root(H5B2_hdr_t *hdr, hid_t dxpl_id);
+H5_DLL herr_t H5B2__create_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id, void *parent,
     H5B2_node_ptr_t *node_ptr);
 
 /* Routines for releasing structures */
-H5_DLL herr_t H5B2_hdr_free(H5B2_hdr_t *hdr);
-H5_DLL herr_t H5B2_leaf_free(H5B2_leaf_t *l);
-H5_DLL herr_t H5B2_internal_free(H5B2_internal_t *i);
+H5_DLL herr_t H5B2__hdr_free(H5B2_hdr_t *hdr);
+H5_DLL herr_t H5B2__leaf_free(H5B2_leaf_t *l);
+H5_DLL herr_t H5B2__internal_free(H5B2_internal_t *i);
 
 /* Routines for inserting records */
-H5_DLL herr_t H5B2_insert_internal(H5B2_hdr_t *hdr, hid_t dxpl_id,
-    unsigned depth, unsigned *parent_cache_info_flags_ptr,
-    H5B2_node_ptr_t *curr_node_ptr, H5B2_nodepos_t curr_pos, void *udata);
-H5_DLL herr_t H5B2_insert_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id,
-    H5B2_node_ptr_t *curr_node_ptr, H5B2_nodepos_t curr_pos, void *udata);
+H5_DLL herr_t H5B2__insert_internal(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    uint16_t depth, unsigned *parent_cache_info_flags_ptr,
+    H5B2_node_ptr_t *curr_node_ptr, H5B2_nodepos_t curr_pos, void *parent, void *udata);
+H5_DLL herr_t H5B2__insert_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    H5B2_node_ptr_t *curr_node_ptr, H5B2_nodepos_t curr_pos, void *parent, void *udata);
 
 /* Routines for iterating over nodes/records */
-H5_DLL herr_t H5B2_iterate_node(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
-    const H5B2_node_ptr_t *curr_node, H5B2_operator_t op, void *op_data);
-H5_DLL herr_t H5B2_node_size(H5B2_hdr_t *hdr, hid_t dxpl_id,
-    unsigned depth, const H5B2_node_ptr_t *curr_node, hsize_t *op_data);
+H5_DLL herr_t H5B2__iterate_node(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
+    const H5B2_node_ptr_t *curr_node, void *parent, H5B2_operator_t op, void *op_data);
+H5_DLL herr_t H5B2__node_size(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    uint16_t depth, const H5B2_node_ptr_t *curr_node, void *parent,
+    hsize_t *op_data);
 
 /* Routines for locating records */
-H5_DLL int H5B2_locate_record(const H5B2_class_t *type, unsigned nrec,
+H5_DLL int H5B2__locate_record(const H5B2_class_t *type, unsigned nrec,
     size_t *rec_off, const uint8_t *native, const void *udata, unsigned *idx);
-H5_DLL herr_t H5B2_neighbor_internal(H5B2_hdr_t *hdr, hid_t dxpl_id,
-    unsigned depth, H5B2_node_ptr_t *curr_node_ptr, void *neighbor_loc,
-    H5B2_compare_t comp, void *udata, H5B2_found_t op, void *op_data);
-H5_DLL herr_t H5B2_neighbor_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id,
-    H5B2_node_ptr_t *curr_node_ptr, void *neighbor_loc,
-    H5B2_compare_t comp, void *udata, H5B2_found_t op, void *op_data);
+H5_DLL herr_t H5B2__neighbor_internal(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    uint16_t depth, H5B2_node_ptr_t *curr_node_ptr, void *neighbor_loc,
+    H5B2_compare_t comp, void *parent, void *udata, H5B2_found_t op,
+    void *op_data);
+H5_DLL herr_t H5B2__neighbor_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    H5B2_node_ptr_t *curr_node_ptr, void *neighbor_loc, H5B2_compare_t comp,
+    void *parent, void *udata, H5B2_found_t op, void *op_data);
 
 /* Routines for removing records */
-H5_DLL herr_t H5B2_remove_internal(H5B2_hdr_t *hdr, hid_t dxpl_id,
-    hbool_t *depth_decreased, void *swap_loc, unsigned depth,
+H5_DLL herr_t H5B2__remove_internal(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    hbool_t *depth_decreased, void *swap_loc, void *swap_parent, uint16_t depth,
     H5AC_info_t *parent_cache_info, unsigned *parent_cache_info_flags_ptr,
     H5B2_nodepos_t curr_pos, H5B2_node_ptr_t *curr_node_ptr, void *udata,
     H5B2_remove_t op, void *op_data);
-H5_DLL herr_t H5B2_remove_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id,
-    H5B2_node_ptr_t *curr_node_ptr, H5B2_nodepos_t curr_pos,
+H5_DLL herr_t H5B2__remove_leaf(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    H5B2_node_ptr_t *curr_node_ptr, H5B2_nodepos_t curr_pos, void *parent,
     void *udata, H5B2_remove_t op, void *op_data);
-H5_DLL herr_t H5B2_remove_internal_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
-    hbool_t *depth_decreased, void *swap_loc, unsigned depth,
+H5_DLL herr_t H5B2__remove_internal_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    hbool_t *depth_decreased, void *swap_loc, void *swap_parent, uint16_t depth,
     H5AC_info_t *parent_cache_info, unsigned *parent_cache_info_flags_ptr,
     H5B2_node_ptr_t *curr_node_ptr, H5B2_nodepos_t curr_pos, hsize_t n,
     H5B2_remove_t op, void *op_data);
-H5_DLL herr_t H5B2_remove_leaf_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
-    H5B2_node_ptr_t *curr_node_ptr, H5B2_nodepos_t curr_pos,
+H5_DLL herr_t H5B2__remove_leaf_by_idx(H5B2_hdr_t *hdr, hid_t dxpl_id,
+    H5B2_node_ptr_t *curr_node_ptr, H5B2_nodepos_t curr_pos, void *parent,
     unsigned idx, H5B2_remove_t op, void *op_data);
 
 /* Routines for deleting nodes */
-H5_DLL herr_t H5B2_delete_node(H5B2_hdr_t *hdr, hid_t dxpl_id, unsigned depth,
-    const H5B2_node_ptr_t *curr_node, H5B2_remove_t op, void *op_data);
+H5_DLL herr_t H5B2__delete_node(H5B2_hdr_t *hdr, hid_t dxpl_id, uint16_t depth,
+    const H5B2_node_ptr_t *curr_node, void *parent, H5B2_remove_t op,
+    void *op_data);
 
 /* Debugging routines for dumping file structures */
-H5_DLL herr_t H5B2_hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+H5_DLL herr_t H5B2__hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
     FILE *stream, int indent, int fwidth, const H5B2_class_t *type, haddr_t obj_addr);
-H5_DLL herr_t H5B2_int_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+H5_DLL herr_t H5B2__int_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
     FILE *stream, int indent, int fwidth, const H5B2_class_t *type,
     haddr_t hdr_addr, unsigned nrec, unsigned depth, haddr_t obj_addr);
-H5_DLL herr_t H5B2_leaf_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+H5_DLL herr_t H5B2__leaf_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
     FILE *stream, int indent, int fwidth, const H5B2_class_t *type,
     haddr_t hdr_addr, unsigned nrec, haddr_t obj_addr);
 
diff --git a/src/H5B2private.h b/src/H5B2private.h
index 08d3ce1..cc60c9b 100644
--- a/src/H5B2private.h
+++ b/src/H5B2private.h
@@ -31,7 +31,8 @@
 #include "H5B2public.h"
 
 /* Private headers needed by this file */
-#include "H5Fprivate.h"		/* File access				*/
+#include "H5ACprivate.h"        /* Metadata cache                   */
+#include "H5Fprivate.h"         /* File access                      */
 
 /**************************/
 /* Library Private Macros */
@@ -54,6 +55,8 @@ typedef enum H5B2_subid_t {
     H5B2_SOHM_INDEX_ID,         /* B-tree is an index for shared object header messages */
     H5B2_ATTR_DENSE_NAME_ID,    /* B-tree is for indexing 'name' field for "dense" attribute storage on objects */
     H5B2_ATTR_DENSE_CORDER_ID,  /* B-tree is for indexing 'creation order' field for "dense" attribute storage on objects */
+    H5B2_CDSET_ID,              /* B-tree is for non-filtered chunked dataset storage w/ >1 unlim dims */
+    H5B2_CDSET_FILT_ID,         /* B-tree is for filtered chunked dataset storage w/ >1 unlim dims */
     H5B2_NUM_BTREE_ID           /* Number of B-tree IDs (must be last)  */
 } H5B2_subid_t;
 
@@ -92,8 +95,8 @@ struct H5B2_class_t {
     herr_t (*compare)(const void *rec1, const void *rec2); 		/* Compare two native records */
     herr_t (*encode)(uint8_t *raw, const void *record, void *ctx);  	/* Encode record from native form to disk storage form */
     herr_t (*decode)(const uint8_t *raw, void *record, void *ctx);  	/* Decode record from disk storage form to native form */
-    herr_t (*debug)(FILE *stream, const H5F_t *f, hid_t dxpl_id,    	/* Print a record for debugging */
-        int indent, int fwidth, const void *record, const void *ctx);
+    herr_t (*debug)(FILE *stream, int indent, int fwidth,    	/* Print a record for debugging */
+        const void *record,  const void *ctx);
     void *(*crt_dbg_ctx)(H5F_t *f, hid_t dxpl_id, haddr_t obj_addr); 	/* Create debugging context */
     herr_t (*dst_dbg_ctx)(void *dbg_ctx);       /* Destroy debugging context */
 };
@@ -143,13 +146,19 @@ H5_DLL herr_t H5B2_modify(H5B2_t *bt2, hid_t dxpl_id, void *udata,
 H5_DLL herr_t H5B2_remove(H5B2_t *b2, hid_t dxpl_id, void *udata,
     H5B2_remove_t op, void *op_data);
 H5_DLL herr_t H5B2_remove_by_idx(H5B2_t *bt2, hid_t dxpl_id,
-    H5_iter_order_t order, hsize_t idx, H5B2_remove_t op, void *op_data);
+    H5_iter_order_t order, hsize_t idx, H5B2_remove_t op,
+    void *op_data);
 H5_DLL herr_t H5B2_get_nrec(const H5B2_t *bt2, hsize_t *nrec);
 H5_DLL herr_t H5B2_size(H5B2_t *bt2, hid_t dxpl_id,
     hsize_t *btree_size);
 H5_DLL herr_t H5B2_close(H5B2_t *bt2, hid_t dxpl_id);
 H5_DLL herr_t H5B2_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr,
     void *ctx_udata, H5B2_remove_t op, void *op_data);
+H5_DLL htri_t H5B2_support(H5B2_t *bt2, hid_t dxpl_id, void *udata,
+    H5AC_info_t *child);
+H5_DLL herr_t H5B2_unsupport(H5B2_t *bt2, hid_t dxpl_id, void *udata,
+    H5AC_info_t *child);
+H5_DLL herr_t H5B2_depend(H5AC_info_t *parent_entry, H5B2_t *bt2);
 
 /* Statistics routines */
 H5_DLL herr_t H5B2_stat_info(H5B2_t *bt2, H5B2_stat_t *info);
diff --git a/src/H5B2stat.c b/src/H5B2stat.c
index 5d159ed..da721c6 100644
--- a/src/H5B2stat.c
+++ b/src/H5B2stat.c
@@ -24,7 +24,7 @@
 /* Module Setup */
 /****************/
 
-#define H5B2_PACKAGE        /* Suppress error about including H5B2pkg   */
+#include "H5B2module.h"         /* This source code file is part of the H5B2 module */
 
 
 /***********/
@@ -139,7 +139,7 @@ H5B2_size(H5B2_t *bt2, hid_t dxpl_id, hsize_t *btree_size)
             *btree_size += hdr->node_size;
         else
             /* Iterate through nodes */
-            if(H5B2_node_size(hdr, dxpl_id, hdr->depth, &hdr->root, btree_size) < 0)
+            if(H5B2__node_size(hdr, dxpl_id, hdr->depth, &hdr->root, hdr, btree_size) < 0)
                 HGOTO_ERROR(H5E_BTREE, H5E_CANTLIST, FAIL, "node iteration failed")
     } /* end if */
 
diff --git a/src/H5B2test.c b/src/H5B2test.c
index 2537cbc..a72dc30 100644
--- a/src/H5B2test.c
+++ b/src/H5B2test.c
@@ -25,7 +25,7 @@
 /* Module Setup */
 /****************/
 
-#define H5B2_PACKAGE		/*suppress error about including H5B2pkg  */
+#include "H5B2module.h"         /* This source code file is part of the H5B2 module */
 #define H5B2_TESTING		/*suppress warning about H5B2 testing funcs*/
 
 
@@ -61,15 +61,15 @@ typedef struct H5B2_test_ctx_t {
 /* Local Prototypes */
 /********************/
 
-static void *H5B2_test_crt_context(void *udata);
-static herr_t H5B2_test_dst_context(void *ctx);
-static herr_t H5B2_test_store(void *nrecord, const void *udata);
-static herr_t H5B2_test_compare(const void *rec1, const void *rec2);
-static herr_t H5B2_test_encode(uint8_t *raw, const void *nrecord, void *ctx);
-static herr_t H5B2_test_decode(const uint8_t *raw, void *nrecord, void *ctx);
-static herr_t H5B2_test_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
-    int indent, int fwidth, const void *record, const void *_udata);
-static void *H5B2_test_crt_dbg_context(H5F_t *f, hid_t dxpl_id, haddr_t addr);
+static void *H5B2__test_crt_context(void *udata);
+static herr_t H5B2__test_dst_context(void *ctx);
+static herr_t H5B2__test_store(void *nrecord, const void *udata);
+static herr_t H5B2__test_compare(const void *rec1, const void *rec2);
+static herr_t H5B2__test_encode(uint8_t *raw, const void *nrecord, void *ctx);
+static herr_t H5B2__test_decode(const uint8_t *raw, void *nrecord, void *ctx);
+static herr_t H5B2__test_debug(FILE *stream, int indent, int fwidth,
+    const void *record, const void *_udata);
+static void *H5B2__test_crt_dbg_context(H5F_t *f, hid_t dxpl_id, haddr_t addr);
 
 
 /*********************/
@@ -80,15 +80,15 @@ const H5B2_class_t H5B2_TEST[1]={{   /* B-tree class information */
     H5B2_TEST_ID,               /* Type of B-tree */
     "H5B2_TEST_ID",             /* Name of B-tree class */
     sizeof(hsize_t),            /* Size of native record */
-    H5B2_test_crt_context,      /* Create client callback context */
-    H5B2_test_dst_context,      /* Destroy client callback context */
-    H5B2_test_store,            /* Record storage callback */
-    H5B2_test_compare,          /* Record comparison callback */
-    H5B2_test_encode,           /* Record encoding callback */
-    H5B2_test_decode,           /* Record decoding callback */
-    H5B2_test_debug,            /* Record debugging callback */
-    H5B2_test_crt_dbg_context,  /* Create debugging context */
-    H5B2_test_dst_context       /* Destroy debugging context */
+    H5B2__test_crt_context,      /* Create client callback context */
+    H5B2__test_dst_context,      /* Destroy client callback context */
+    H5B2__test_store,            /* Record storage callback */
+    H5B2__test_compare,          /* Record comparison callback */
+    H5B2__test_encode,           /* Record encoding callback */
+    H5B2__test_decode,           /* Record decoding callback */
+    H5B2__test_debug,            /* Record debugging callback */
+    H5B2__test_crt_dbg_context,  /* Create debugging context */
+    H5B2__test_dst_context       /* Destroy debugging context */
 }};
 
 
@@ -107,7 +107,7 @@ H5FL_DEFINE_STATIC(H5B2_test_ctx_t);
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_test_crt_context
+ * Function:	H5B2__test_crt_context
  *
  * Purpose:	Create client callback context
  *
@@ -120,13 +120,13 @@ H5FL_DEFINE_STATIC(H5B2_test_ctx_t);
  *-------------------------------------------------------------------------
  */
 static void *
-H5B2_test_crt_context(void *_f)
+H5B2__test_crt_context(void *_f)
 {
     H5F_t *f = (H5F_t *)_f;     /* User data for building callback context */
     H5B2_test_ctx_t *ctx;       /* Callback context structure */
-    void *ret_value;            /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Sanity check */
     HDassert(f);
@@ -143,11 +143,11 @@ H5B2_test_crt_context(void *_f)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2_test_crt_context() */
+} /* H5B2__test_crt_context() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_test_dst_context
+ * Function:	H5B2__test_dst_context
  *
  * Purpose:	Destroy client callback context
  *
@@ -160,11 +160,11 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2_test_dst_context(void *_ctx)
+H5B2__test_dst_context(void *_ctx)
 {
     H5B2_test_ctx_t *ctx = (H5B2_test_ctx_t *)_ctx;       /* Callback context structure */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Sanity check */
     HDassert(ctx);
@@ -173,11 +173,11 @@ H5B2_test_dst_context(void *_ctx)
     ctx = H5FL_FREE(H5B2_test_ctx_t, ctx);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5B2_test_dst_context() */
+} /* H5B2__test_dst_context() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_test_store
+ * Function:	H5B2__test_store
  *
  * Purpose:	Store native information into record for B-tree
  *
@@ -190,18 +190,18 @@ H5B2_test_dst_context(void *_ctx)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2_test_store(void *nrecord, const void *udata)
+H5B2__test_store(void *nrecord, const void *udata)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     *(hsize_t *)nrecord = *(const hsize_t *)udata;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5B2_test_store() */
+} /* H5B2__test_store() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_test_compare
+ * Function:	H5B2__test_compare
  *
  * Purpose:	Compare two native information records, according to some key
  *
@@ -215,16 +215,16 @@ H5B2_test_store(void *nrecord, const void *udata)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2_test_compare(const void *rec1, const void *rec2)
+H5B2__test_compare(const void *rec1, const void *rec2)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     FUNC_LEAVE_NOAPI((herr_t)(*(const hssize_t *)rec1 - *(const hssize_t *)rec2))
-} /* H5B2_test_compare() */
+} /* H5B2__test_compare() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_test_encode
+ * Function:	H5B2__test_encode
  *
  * Purpose:	Encode native information into raw form for storing on disk
  *
@@ -237,11 +237,11 @@ H5B2_test_compare(const void *rec1, const void *rec2)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2_test_encode(uint8_t *raw, const void *nrecord, void *_ctx)
+H5B2__test_encode(uint8_t *raw, const void *nrecord, void *_ctx)
 {
     H5B2_test_ctx_t *ctx = (H5B2_test_ctx_t *)_ctx;       /* Callback context structure */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Sanity check */
     HDassert(ctx);
@@ -249,11 +249,11 @@ H5B2_test_encode(uint8_t *raw, const void *nrecord, void *_ctx)
     H5F_ENCODE_LENGTH_LEN(raw, *(const hsize_t *)nrecord, ctx->sizeof_size);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5B2_test_encode() */
+} /* H5B2__test_encode() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_test_decode
+ * Function:	H5B2__test_decode
  *
  * Purpose:	Decode raw disk form of record into native form
  *
@@ -266,11 +266,11 @@ H5B2_test_encode(uint8_t *raw, const void *nrecord, void *_ctx)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2_test_decode(const uint8_t *raw, void *nrecord, void *_ctx)
+H5B2__test_decode(const uint8_t *raw, void *nrecord, void *_ctx)
 {
     H5B2_test_ctx_t *ctx = (H5B2_test_ctx_t *)_ctx;       /* Callback context structure */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Sanity check */
     HDassert(ctx);
@@ -278,11 +278,11 @@ H5B2_test_decode(const uint8_t *raw, void *nrecord, void *_ctx)
     H5F_DECODE_LENGTH_LEN(raw, *(hsize_t *)nrecord, ctx->sizeof_size);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5B2_test_decode() */
+} /* H5B2__test_decode() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_test_debug
+ * Function:	H5B2__test_debug
  *
  * Purpose:	Debug native form of record
  *
@@ -295,23 +295,22 @@ H5B2_test_decode(const uint8_t *raw, void *nrecord, void *_ctx)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B2_test_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
-    int indent, int fwidth, const void *record,
+H5B2__test_debug(FILE *stream, int indent, int fwidth, const void *record,
     const void H5_ATTR_UNUSED *_udata)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
-    HDassert (record);
+    HDassert(record);
 
     HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth, "Record:",
         *(const hsize_t *)record);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5B2_test_debug() */
+} /* H5B2__test_debug() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B2_test_crt_dbg_context
+ * Function:	H5B2__test_crt_dbg_context
  *
  * Purpose:	Create context for debugging callback
  *
@@ -324,12 +323,12 @@ H5B2_test_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSE
  *-------------------------------------------------------------------------
  */
 static void *
-H5B2_test_crt_dbg_context(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t H5_ATTR_UNUSED addr)
+H5B2__test_crt_dbg_context(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t H5_ATTR_UNUSED addr)
 {
     H5B2_test_ctx_t *ctx;       /* Callback context structure */
-    void *ret_value;            /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Sanity check */
     HDassert(f);
@@ -346,7 +345,7 @@ H5B2_test_crt_dbg_context(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t H5_ATT
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5B2_test_crt_dbg_context() */
+} /* H5B2__test_crt_dbg_context() */
 
 

 /*-------------------------------------------------------------------------
@@ -397,7 +396,8 @@ H5B2_get_node_info_test(H5B2_t *bt2, hid_t dxpl_id, void *udata,
 {
     H5B2_hdr_t	*hdr;                   /* Pointer to the B-tree header */
     H5B2_node_ptr_t curr_node_ptr;      /* Node pointer info for current node */
-    unsigned    depth;                  /* Current depth of the tree */
+    void        *parent = NULL;         /* Parent of current node */
+    uint16_t    depth;                  /* Current depth of the tree */
     int         cmp;                    /* Comparison value of records */
     unsigned    idx;                    /* Location of record which matches key */
     herr_t	ret_value = SUCCEED;    /* Return value */
@@ -416,6 +416,10 @@ H5B2_get_node_info_test(H5B2_t *bt2, hid_t dxpl_id, void *udata,
     /* Make copy of the root node pointer to start search with */
     curr_node_ptr = hdr->root;
 
+        /* Set initial parent, if doing swmr writes */
+    if(hdr->swmr_write)
+        parent = hdr;
+
     /* Current depth of the tree */
     depth = hdr->depth;
 
@@ -430,11 +434,18 @@ H5B2_get_node_info_test(H5B2_t *bt2, hid_t dxpl_id, void *udata,
         H5B2_node_ptr_t next_node_ptr;      /* Node pointer info for next node */
 
         /* Lock B-tree current node */
-        if(NULL == (internal = H5B2_protect_internal(hdr, dxpl_id, curr_node_ptr.addr, curr_node_ptr.node_nrec, depth, H5AC_READ)))
+        if(NULL == (internal = H5B2__protect_internal(hdr, dxpl_id, curr_node_ptr.addr, parent, curr_node_ptr.node_nrec, depth, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node")
 
+        /* Unpin parent if necessary */
+        if(parent) {
+            if(parent != hdr && H5AC_unpin_entry(parent) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPIN, FAIL, "unable to unpin parent entry")
+            parent = NULL;
+        } /* end if */
+
         /* Locate node pointer for child */
-        cmp = H5B2_locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx);
+        cmp = H5B2__locate_record(hdr->cls, internal->nrec, hdr->nat_off, internal->int_native, udata, &idx);
         if(cmp > 0)
             idx++;
 
@@ -443,9 +454,13 @@ H5B2_get_node_info_test(H5B2_t *bt2, hid_t dxpl_id, void *udata,
             next_node_ptr = internal->node_ptrs[idx];
 
             /* Unlock current node */
-            if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, H5AC__NO_FLAGS_SET) < 0)
+            if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, internal, (unsigned)(hdr->swmr_write ? H5AC__PIN_ENTRY_FLAG : H5AC__NO_FLAGS_SET)) < 0)
                 HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node")
 
+            /* Keep track of parent if necessary */
+            if(hdr->swmr_write)
+                parent = internal;
+
             /* Set pointer to next node to load */
             curr_node_ptr = next_node_ptr;
         } /* end if */
@@ -470,11 +485,18 @@ H5B2_get_node_info_test(H5B2_t *bt2, hid_t dxpl_id, void *udata,
         H5B2_leaf_t *leaf;          /* Pointer to leaf node in B-tree */
 
         /* Lock B-tree leaf node */
-        if(NULL == (leaf = H5B2_protect_leaf(hdr, dxpl_id, curr_node_ptr.addr, curr_node_ptr.node_nrec, H5AC_READ)))
+        if(NULL == (leaf = H5B2__protect_leaf(hdr, dxpl_id, curr_node_ptr.addr, parent, curr_node_ptr.node_nrec, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree leaf node")
 
+        /* Unpin parent if necessary */
+        if(parent) {
+            if(parent != hdr && H5AC_unpin_entry(parent) < 0)
+                HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPIN, FAIL, "unable to unpin parent entry")
+            parent = NULL;
+        } /* end if */
+
         /* Locate record */
-        cmp = H5B2_locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx);
+        cmp = H5B2__locate_record(hdr->cls, leaf->nrec, hdr->nat_off, leaf->leaf_native, udata, &idx);
 
         /* Unlock current node */
         if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, leaf, H5AC__NO_FLAGS_SET) < 0)
@@ -490,6 +512,12 @@ H5B2_get_node_info_test(H5B2_t *bt2, hid_t dxpl_id, void *udata,
     ninfo->nrec = curr_node_ptr.node_nrec;
 
 done:
+    if(parent) {
+        HDassert(ret_value < 0);
+        if(parent != hdr && H5AC_unpin_entry(parent) < 0)
+            HDONE_ERROR(H5E_BTREE, H5E_CANTUNPIN, FAIL, "unable to unpin parent entry")
+    } /* end if */
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5B2_get_node_info_test() */
 
@@ -499,7 +527,7 @@ done:
  *
  * Purpose:	Determine the depth of a node holding a record in the B-tree
  *
- * Note:	Just a simple wrapper around the H5B2_get_node_info_test() routine
+ * Note:	Just a simple wrapper around the H5B2__get_node_info_test() routine
  *
  * Return:	Success:	non-negative depth of the node where the record
  *                              was found
@@ -514,7 +542,7 @@ int
 H5B2_get_node_depth_test(H5B2_t *bt2, hid_t dxpl_id, void *udata)
 {
     H5B2_node_info_test_t ninfo;        /* Node information */
-    int		ret_value;              /* Return information */
+    int		ret_value = -1;         /* Return information */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -526,7 +554,7 @@ H5B2_get_node_depth_test(H5B2_t *bt2, hid_t dxpl_id, void *udata)
         HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "error looking up node info")
 
     /* Set return value */
-    ret_value = ninfo.depth;
+    ret_value = (int)ninfo.depth;
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
diff --git a/src/H5Bcache.c b/src/H5Bcache.c
index b66204c..73136b4 100644
--- a/src/H5Bcache.c
+++ b/src/H5Bcache.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5B_PACKAGE		/*suppress error about including H5Bpkg  */
+#include "H5Bmodule.h"          /* This source code file is part of the H5B module */
 
 
 /***********/
@@ -37,7 +37,6 @@
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Bpkg.h"		/* B-link trees				*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
-#include "H5MFprivate.h"	/* File memory management		*/
 
 
 /****************/
@@ -55,11 +54,15 @@
 /********************/
 
 /* Metadata cache callbacks */
-static H5B_t *H5B__load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static herr_t H5B__flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B_t *b, unsigned H5_ATTR_UNUSED * flags_ptr);
-static herr_t H5B__dest(H5F_t *f, H5B_t *bt);
-static herr_t H5B__clear(H5F_t *f, H5B_t *b, hbool_t destroy);
-static herr_t H5B__compute_size(const H5F_t *f, const H5B_t *bt, size_t *size_ptr);
+static herr_t H5B__get_load_size(const void *image, void *udata, size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static void *H5B__deserialize(const void *image, size_t len, void *udata,
+    hbool_t *dirty);
+static herr_t H5B__image_len(const void *thing, size_t *image_len, 
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static herr_t H5B__serialize(const H5F_t *f, void *image, size_t len,
+    void *thing);
+static herr_t H5B__free_icr(void *thing);
 
 
 /*********************/
@@ -68,12 +71,20 @@ static herr_t H5B__compute_size(const H5F_t *f, const H5B_t *bt, size_t *size_pt
 
 /* H5B inherits cache-like properties from H5AC */
 const H5AC_class_t H5AC_BT[1] = {{
-    H5AC_BT_ID,
-    (H5AC_load_func_t)H5B__load,
-    (H5AC_flush_func_t)H5B__flush,
-    (H5AC_dest_func_t)H5B__dest,
-    (H5AC_clear_func_t)H5B__clear,
-    (H5AC_size_func_t)H5B__compute_size,
+    H5AC_BT_ID,                         /* Metadata client ID */
+    "v1 B-tree",                        /* Metadata client name (for debugging) */
+    H5FD_MEM_BTREE,                     /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5B__get_load_size,                 /* 'get_load_size' callback */
+    NULL,				/* 'verify_chksum' callback */
+    H5B__deserialize,                   /* 'deserialize' callback */
+    H5B__image_len,                     /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5B__serialize,                     /* 'serialize' callback */
+    NULL,                               /* 'notify' callback */
+    H5B__free_icr,                      /* 'free_icr' callback */
+    NULL,				/* 'clear" callback */
+    NULL,                               /* 'fsf_size' callback */
 }};
 
 /*******************/
@@ -83,47 +94,91 @@ const H5AC_class_t H5AC_BT[1] = {{
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B__load
+ * Function:    H5B__get_load_size
  *
- * Purpose:	Loads a B-tree node from the disk.
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              May 18, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5B__get_load_size(const void *_image, void *_udata, size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
+{
+    const uint8_t *image = (const uint8_t *)_image;     		/* Pointer into image buffer */
+    H5B_cache_ud_t *udata = (H5B_cache_ud_t *)_udata;       /* User data for callback */
+    H5B_shared_t *shared;       /* Pointer to shared B-tree info */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(udata);
+    HDassert(image_len);
+
+    if(image == NULL) {
+	/* Get shared info for B-tree */
+	shared = (H5B_shared_t *)H5UC_GET_OBJ(udata->rc_shared);
+	HDassert(shared);
+
+	/* Set the image length size */
+	*image_len = shared->sizeof_rnode;
+    } else {
+	HDassert(actual_len);
+        HDassert(*actual_len == *image_len);
+    }
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5B__get_load_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5B__deserialize
+ *
+ * Purpose:     Deserialize the data structure from disk.
  *
  * Return:	Success:	Pointer to a new B-tree node.
  *		Failure:	NULL
  *
- * Programmer:	Robb Matzke
- *		matzke at llnl.gov
- *		Jun 23 1997
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Mar 24, 2008
  *
  *-------------------------------------------------------------------------
  */
-static H5B_t *
-H5B__load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+static void *
+H5B__deserialize(const void *_image, size_t H5_ATTR_UNUSED len, void *_udata,
+    hbool_t H5_ATTR_UNUSED *dirty)
 {
     H5B_t *bt = NULL;           /* Pointer to the deserialized B-tree node */
     H5B_cache_ud_t *udata = (H5B_cache_ud_t *)_udata;       /* User data for callback */
     H5B_shared_t *shared;       /* Pointer to shared B-tree info */
-    const uint8_t *p;           /* Pointer into raw data buffer */
+    const uint8_t *image = (const uint8_t *)_image;     /* Pointer into image buffer */
     uint8_t *native;            /* Pointer to native keys */
     unsigned u;                 /* Local index variable */
-    H5B_t *ret_value;           /* Return value */
+    H5B_t *ret_value = NULL;    /* Return value */
 
     FUNC_ENTER_STATIC
 
-    /* Check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    /* check arguments */
+    HDassert(image);
     HDassert(udata);
 
+    /* Allocate the B-tree node in memory */
     if(NULL == (bt = H5FL_MALLOC(H5B_t)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "can't allocate B-tree struct")
     HDmemset(&bt->cache_info, 0, sizeof(H5AC_info_t));
 
     /* Set & increment the ref-counted "shared" B-tree information for the node */
     bt->rc_shared = udata->rc_shared;
-    H5RC_INC(bt->rc_shared);
+    H5UC_INC(bt->rc_shared);
 
     /* Get a pointer to the shared info, for convenience */
-    shared = (H5B_shared_t *)H5RC_GET_OBJ(bt->rc_shared);
+    shared = (H5B_shared_t *)H5UC_GET_OBJ(bt->rc_shared);
     HDassert(shared);
 
     /* Allocate space for the native keys and child addresses */
@@ -132,279 +187,209 @@ H5B__load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
     if(NULL == (bt->child = H5FL_SEQ_MALLOC(haddr_t, (size_t)shared->two_k)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, NULL, "can't allocate buffer for child addresses")
 
-    if(H5F_block_read(f, H5FD_MEM_BTREE, addr, shared->sizeof_rnode, dxpl_id, shared->page) < 0)
-	HGOTO_ERROR(H5E_BTREE, H5E_READERROR, NULL, "can't read B-tree node")
-
-    /* Set the pointer into the raw data buffer */
-    p = shared->page;
-
     /* magic number */
-    if(HDmemcmp(p, H5B_MAGIC, (size_t)H5_SIZEOF_MAGIC))
-	HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "wrong B-tree signature")
-    p += 4;
+    if(HDmemcmp(image, H5B_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+	HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, NULL, "wrong B-tree signature")
+    image += H5_SIZEOF_MAGIC;
 
     /* node type and level */
-    if(*p++ != (uint8_t)udata->type->id)
+    if(*image++ != (uint8_t)udata->type->id)
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "incorrect B-tree node type")
-    bt->level = *p++;
+    bt->level = *image++;
 
     /* entries used */
-    UINT16DECODE(p, bt->nchildren);
+    UINT16DECODE(image, bt->nchildren);
 
     /* Check if bt->nchildren is greater than two_k */
     if(bt->nchildren > shared->two_k)
         HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, NULL, "number of children is greater than maximum")
 
     /* sibling pointers */
-    H5F_addr_decode(udata->f, (const uint8_t **)&p, &(bt->left));
-    H5F_addr_decode(udata->f, (const uint8_t **)&p, &(bt->right));
+    H5F_addr_decode(udata->f, (const uint8_t **)&image, &(bt->left));
+    H5F_addr_decode(udata->f, (const uint8_t **)&image, &(bt->right));
 
     /* the child/key pairs */
     native = bt->native;
     for(u = 0; u < bt->nchildren; u++) {
         /* Decode native key value */
-        if((udata->type->decode)(shared, p, native) < 0)
+        if((udata->type->decode)(shared, image, native) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTDECODE, NULL, "unable to decode key")
-        p += shared->sizeof_rkey;
+        image += shared->sizeof_rkey;
         native += udata->type->sizeof_nkey;
 
         /* Decode address value */
-        H5F_addr_decode(udata->f, (const uint8_t **)&p, bt->child + u);
+        H5F_addr_decode(udata->f, (const uint8_t **)&image, bt->child + u);
     } /* end for */
 
     /* Decode final key */
     if(bt->nchildren > 0) {
         /* Decode native key value */
-        if((udata->type->decode)(shared, p, native) < 0)
+        if((udata->type->decode)(shared, image, native) < 0)
             HGOTO_ERROR(H5E_BTREE, H5E_CANTDECODE, NULL, "unable to decode key")
     } /* end if */
 
+    /* Sanity check */
+    HDassert((size_t)((const uint8_t *)image - (const uint8_t *)_image) <= len);
+
     /* Set return value */
     ret_value = bt;
 
 done:
     if(!ret_value && bt)
-        if(H5B_node_dest(bt) < 0)
+        if(H5B__node_dest(bt) < 0)
             HDONE_ERROR(H5E_BTREE, H5E_CANTFREE, NULL, "unable to destroy B-tree node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B__load() */  /*lint !e818 Can't make udata a pointer to const */
+} /* end H5B__deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B__flush
+ * Function:    H5B__image_len
  *
- * Purpose:	Flushes a dirty B-tree node to disk.
+ * Purpose:     Compute the size of the data structure on disk.
  *
  * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:	Robb Matzke
- *		matzke at llnl.gov
- *		Jun 23 1997
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              May 20, 2010
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B__flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5B_t *bt, unsigned H5_ATTR_UNUSED * flags_ptr)
+H5B__image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
+    const H5B_t *bt = (const H5B_t *)_thing;        /* Pointer to the B-tree node */
     H5B_shared_t *shared;       /* Pointer to shared B-tree info */
-    herr_t      ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_STATIC
+    FUNC_ENTER_STATIC_NOERR
 
-    /* check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    /* Check arguments */
     HDassert(bt);
-    shared = (H5B_shared_t *)H5RC_GET_OBJ(bt->rc_shared);
-    HDassert(shared);
-    HDassert(shared->type);
-    HDassert(shared->type->encode);
+    HDassert(image_len);
 
-    if(bt->cache_info.is_dirty) {
-        uint8_t    *p;              /* Pointer into raw data buffer */
-        uint8_t    *native;         /* Pointer to native keys */
-        unsigned    u;              /* Local index variable */
-
-        p = shared->page;
-
-        /* magic number */
-        HDmemcpy(p, H5B_MAGIC, (size_t)H5_SIZEOF_MAGIC);
-        p += 4;
-
-        /* node type and level */
-        *p++ = (uint8_t)shared->type->id;
-        H5_CHECK_OVERFLOW(bt->level, unsigned, uint8_t);
-        *p++ = (uint8_t)bt->level;
-
-        /* entries used */
-        UINT16ENCODE(p, bt->nchildren);
-
-        /* sibling pointers */
-        H5F_addr_encode(f, &p, bt->left);
-        H5F_addr_encode(f, &p, bt->right);
-
-        /* child keys and pointers */
-        native = bt->native;
-        for(u = 0; u < bt->nchildren; ++u) {
-            /* encode the key */
-            if(shared->type->encode(shared, p, native) < 0)
-                HGOTO_ERROR(H5E_BTREE, H5E_CANTENCODE, FAIL, "unable to encode B-tree key")
-            p += shared->sizeof_rkey;
-            native += shared->type->sizeof_nkey;
-
-            /* encode the child address */
-            H5F_addr_encode(f, &p, bt->child[u]);
-        } /* end for */
-        if(bt->nchildren > 0) {
-            /* Encode the final key */
-            if(shared->type->encode(shared, p, native) < 0)
-                HGOTO_ERROR(H5E_BTREE, H5E_CANTENCODE, FAIL, "unable to encode B-tree key")
-        } /* end if */
-
-	/*
-         * Write the disk page.	We always write the header, but we don't
-         * bother writing data for the child entries that don't exist or
-         * for the final unchanged children.
-	 */
-	if(H5F_block_write(f, H5FD_MEM_BTREE, addr, shared->sizeof_rnode, dxpl_id, shared->page) < 0)
-	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFLUSH, FAIL, "unable to save B-tree node to disk")
-
-	bt->cache_info.is_dirty = FALSE;
-    } /* end if */
+    /* Get shared info for B-tree */
+    shared = (H5B_shared_t *)H5UC_GET_OBJ(bt->rc_shared);
+    HDassert(shared);
 
-    if(destroy)
-        if(H5B__dest(f, bt) < 0)
-	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree node")
+    /* Set the image length size */
+    *image_len = shared->sizeof_rnode;
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B__flush() */
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5B__image_len() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B__dest
+ * Function:    H5B__serialize
  *
- * Purpose:	Destroys a B-tree node in memory.
+ * Purpose:     Serialize the data structure for writing to disk.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Jan 15 2003
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Mar 24, 2008
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B__dest(H5F_t *f, H5B_t *bt)
+H5B__serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
+    void *_thing)
 {
-    herr_t ret_value = SUCCEED;         /* Return value */
+    H5B_t *bt = (H5B_t *)_thing;        /* Pointer to the B-tree node */
+    H5B_shared_t *shared;               /* Pointer to shared B-tree info */
+    uint8_t    *image = (uint8_t *)_image;      /* Pointer into image buffer */
+    uint8_t    *native;                 /* Pointer to native keys */
+    unsigned    u;                      /* Local index counter */
+    herr_t      ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_STATIC
 
-    /*
-     * Check arguments.
-     */
-    HDassert(f);
+    /* check arguments */
+    HDassert(image);
     HDassert(bt);
     HDassert(bt->rc_shared);
+    shared = (H5B_shared_t *)H5UC_GET_OBJ(bt->rc_shared);
+    HDassert(shared);
+    HDassert(shared->type);
+    HDassert(shared->type->encode);
 
-    /* If we're going to free the space on disk, the address must be valid */
-    HDassert(!bt->cache_info.free_file_space_on_destroy || H5F_addr_defined(bt->cache_info.addr));
+    /* magic number */
+    HDmemcpy(image, H5B_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    image += 4;
 
-    /* Check for freeing file space for B-tree node */
-    if(bt->cache_info.free_file_space_on_destroy) {
-        H5B_shared_t *shared;               /* Pointer to shared B-tree info */
+    /* node type and level */
+    *image++ = (uint8_t)shared->type->id;
+    H5_CHECK_OVERFLOW(bt->level, unsigned, uint8_t);
+    *image++ = (uint8_t)bt->level;
 
-        /* Get the pointer to the shared B-tree info */
-        shared = (H5B_shared_t *)H5RC_GET_OBJ(bt->rc_shared);
-        HDassert(shared);
+    /* entries used */
+    UINT16ENCODE(image, bt->nchildren);
 
-        /* Release the space on disk */
-        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
-        if(H5MF_xfree(f, H5FD_MEM_BTREE, H5AC_dxpl_id, bt->cache_info.addr, (hsize_t)shared->sizeof_rnode) < 0)
-            HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free B-tree node")
+    /* sibling pointers */
+    H5F_addr_encode(f, &image, bt->left);
+    H5F_addr_encode(f, &image, bt->right);
+
+    /* child keys and pointers */
+    native = bt->native;
+    for(u = 0; u < bt->nchildren; ++u) {
+        /* encode the key */
+        if(shared->type->encode(shared, image, native) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTENCODE, FAIL, "unable to encode B-tree key")
+        image += shared->sizeof_rkey;
+        native += shared->type->sizeof_nkey;
+
+        /* encode the child address */
+        H5F_addr_encode(f, &image, bt->child[u]);
+    } /* end for */
+    if(bt->nchildren > 0) {
+        /* Encode the final key */
+        if(shared->type->encode(shared, image, native) < 0)
+            HGOTO_ERROR(H5E_BTREE, H5E_CANTENCODE, FAIL, "unable to encode B-tree key")
+        image += shared->sizeof_rkey;
     } /* end if */
 
-    /* Destroy B-tree node */
-    if(H5B_node_dest(bt) < 0)
-        HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree node")
+    /* Sanity check */
+    HDassert((size_t)(image - (uint8_t *)_image) <= len);
+
+#ifdef H5_CLEAR_MEMORY
+    /* Clear rest of node */
+    HDmemset(image, 0, len - (size_t)(image - (uint8_t *)_image));
+#endif /* H5_CLEAR_MEMORY */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B__dest() */
+} /* end H5B__serialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B__clear
+ * Function:    H5B__free_icr
  *
- * Purpose:	Mark a B-tree node in memory as non-dirty.
+ * Purpose:     Destroy/release an "in core representation" of a data structure
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Mar 20 2003
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Mar 26, 2008
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5B__clear(H5F_t *f, H5B_t *bt, hbool_t destroy)
+H5B__free_icr(void *thing)
 {
-    herr_t ret_value = SUCCEED;
+    herr_t      ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_STATIC
 
-    /*
-     * Check arguments.
-     */
-    HDassert(bt);
-
-    /* Reset the dirty flag.  */
-    bt->cache_info.is_dirty = FALSE;
+    /* Check arguments */
+    HDassert(thing);
 
-    if(destroy)
-        if(H5B__dest(f, bt) < 0)
-	    HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree node")
+    /* Destroy B-tree node */
+    if(H5B__node_dest((H5B_t *)thing) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to destroy B-tree node")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B__clear() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5B__compute_size
- *
- * Purpose:	Compute the size in bytes of the specified instance of
- *		H5B_t on disk, and return it in *len_ptr.  On failure,
- *		the value of *len_ptr is undefined.
- *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	John Mainzer
- *		5/13/04
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5B__compute_size(const H5F_t H5_ATTR_UNUSED *f, const H5B_t *bt, size_t *size_ptr)
-{
-    H5B_shared_t        *shared;        /* Pointer to shared B-tree info */
-
-    FUNC_ENTER_STATIC_NOERR
-
-    /* check arguments */
-    HDassert(f);
-    HDassert(bt);
-    HDassert(bt->rc_shared);
-    shared = (H5B_shared_t *)H5RC_GET_OBJ(bt->rc_shared);
-    HDassert(shared);
-    HDassert(shared->type);
-    HDassert(size_ptr);
-
-    /* Set size value */
-    *size_ptr = shared->sizeof_rnode;
-
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5B__compute_size() */
-
+} /* end H5B__free_icr() */
diff --git a/src/H5Bdbg.c b/src/H5Bdbg.c
index 3fb7dd8..b22264d 100644
--- a/src/H5Bdbg.c
+++ b/src/H5Bdbg.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5B_PACKAGE		/*suppress error about including H5Bpkg	  */
+#include "H5Bmodule.h"          /* This source code file is part of the H5B module */
 
 
 /***********/
@@ -59,7 +59,7 @@ H5B_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int f
 	  const H5B_class_t *type, void *udata)
 {
     H5B_t	*bt = NULL;
-    H5RC_t	*rc_shared;             /* Ref-counted shared info */
+    H5UC_t	*rc_shared;             /* Ref-counted shared info */
     H5B_shared_t *shared;               /* Pointer to shared B-tree info */
     H5B_cache_ud_t cache_udata;         /* User-data for metadata cache callback */
     unsigned	u;                      /* Local index variable */
@@ -77,10 +77,13 @@ H5B_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int f
     HDassert(fwidth >= 0);
     HDassert(type);
 
+    /* Currently does not support SWMR access */
+    HDassert(!(H5F_INTENT(f) & H5F_ACC_SWMR_WRITE));
+
     /* Get shared info for B-tree */
     if(NULL == (rc_shared = (type->get_shared)(f, udata)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "can't retrieve B-tree's shared ref. count object")
-    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    shared = (H5B_shared_t *)H5UC_GET_OBJ(rc_shared);
     HDassert(shared);
 
     /*
@@ -89,7 +92,7 @@ H5B_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int f
     cache_udata.f = f;
     cache_udata.type = type;
     cache_udata.rc_shared = rc_shared;
-    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_READ)))
+    if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree node")
 
     /*
@@ -156,7 +159,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5B_assert
+ * Function:	H5B__assert
  *
  * Purpose:	Verifies that the tree is structured correctly.
  *
@@ -171,10 +174,10 @@ done:
  */
 #ifdef H5B_DEBUG
 herr_t
-H5B_assert(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type, void *udata)
+H5B__assert(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type, void *udata)
 {
     H5B_t	*bt = NULL;
-    H5RC_t	*rc_shared;             /* Ref-counted shared info */
+    H5UC_t	*rc_shared;             /* Ref-counted shared info */
     H5B_shared_t *shared;               /* Pointer to shared B-tree info */
     H5B_cache_ud_t cache_udata;         /* User-data for metadata cache callback */
     int	        ncell, cmp;
@@ -189,7 +192,7 @@ H5B_assert(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type, void
 	struct child_t	       *next;
     } *head = NULL, *tail = NULL, *prev = NULL, *cur = NULL, *tmp = NULL;
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     if(0 == ncalls++) {
 	if(H5DEBUG(B))
@@ -199,16 +202,16 @@ H5B_assert(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type, void
     /* Get shared info for B-tree */
     if(NULL == (rc_shared = (type->get_shared)(f, udata)))
 	HGOTO_ERROR(H5E_BTREE, H5E_CANTGET, FAIL, "can't retrieve B-tree's shared ref. count object")
-    shared = (H5B_shared_t *)H5RC_GET_OBJ(rc_shared);
+    shared = (H5B_shared_t *)H5UC_GET_OBJ(rc_shared);
     HDassert(shared);
 
     /* Initialize the queue */
     cache_udata.f = f;
     cache_udata.type = type;
     cache_udata.rc_shared = rc_shared;
-    bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC_READ);
+    bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, &cache_udata, H5AC__READ_ONLY_FLAG);
     HDassert(bt);
-    shared = (H5B_shared_t *)H5RC_GET_OBJ(bt->rc_shared);
+    shared = (H5B_shared_t *)H5UC_GET_OBJ(bt->rc_shared);
     HDassert(shared);
     cur = (struct child_t *)H5MM_calloc(sizeof(struct child_t));
     HDassert(cur);
@@ -227,7 +230,7 @@ H5B_assert(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type, void
      * test.
      */
     for(ncell = 0; cur; ncell++) {
-	bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, cur->addr, &cache_udata, H5AC_READ);
+	bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, cur->addr, &cache_udata, H5AC__READ_ONLY_FLAG);
 	HDassert(bt);
 
 	/* Check node header */
@@ -285,6 +288,6 @@ H5B_assert(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type, void
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5B_assert() */
+} /* end H5B__assert() */
 #endif /* H5B_DEBUG */
 
diff --git a/src/H5Bmodule.h b/src/H5Bmodule.h
new file mode 100644
index 0000000..6800b26
--- /dev/null
+++ b/src/H5Bmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5B package.  Including this header means that the source file
+ *		is part of the H5B package.
+ */
+#ifndef _H5Bmodule_H
+#define _H5Bmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5B_MODULE
+#define H5_MY_PKG       H5B
+#define H5_MY_PKG_ERR   H5E_BTREE
+#define H5_MY_PKG_INIT  NO
+
+#endif /* _H5Bmodule_H */
+
diff --git a/src/H5Bpkg.h b/src/H5Bpkg.h
index 46e2b28..e645626 100644
--- a/src/H5Bpkg.h
+++ b/src/H5Bpkg.h
@@ -21,7 +21,7 @@
  *		the H5B package.  Source files outside the H5B package should
  *		include H5Bprivate.h instead.
  */
-#ifndef H5B_PACKAGE
+#if !(defined H5B_FRIEND || defined H5B_MODULE)
 #error "Do not include this file outside the H5B package!"
 #endif
 
@@ -52,7 +52,7 @@
 typedef struct H5B_t {
     H5AC_info_t        cache_info;     /* Information for H5AC cache functions */
                                         /* _must_ be first field in structure */
-    H5RC_t		*rc_shared;	/*ref-counted shared info	     */
+    H5UC_t		*rc_shared;	/*ref-counted shared info	     */
     unsigned		level;		/*node level			     */
     unsigned		nchildren;	/*number of child pointers	     */
     haddr_t		left;		/*address of left sibling	     */
@@ -65,7 +65,7 @@ typedef struct H5B_t {
 typedef struct H5B_cache_ud_t {
     H5F_t *f;                           /* File that B-tree node is within   */
     const struct H5B_class_t *type;     /* Type of tree			     */
-    H5RC_t *rc_shared;                  /* Ref-counted shared info	     */
+    H5UC_t *rc_shared;                  /* Ref-counted shared info	     */
 } H5B_cache_ud_t;
 
 /*****************************/
@@ -88,9 +88,9 @@ H5FL_EXTERN(H5B_t);
 /******************************/
 /* Package Private Prototypes */
 /******************************/
-H5_DLL herr_t H5B_node_dest(H5B_t *bt);
+H5_DLL herr_t H5B__node_dest(H5B_t *bt);
 #ifdef H5B_DEBUG
-herr_t H5B_assert(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type,
+herr_t H5B__assert(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type,
 			 void *udata);
 #endif
 
diff --git a/src/H5Bprivate.h b/src/H5Bprivate.h
index 83a357b..02fb82c 100644
--- a/src/H5Bprivate.h
+++ b/src/H5Bprivate.h
@@ -34,7 +34,7 @@
 /* Private headers needed by this file */
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Fprivate.h"		/* File access				*/
-#include "H5RCprivate.h"	/* Reference counted object functions	*/
+#include "H5UCprivate.h"	/* Reference counted object functions	*/
 
 /**************************/
 /* Library Private Macros */
@@ -100,6 +100,7 @@ typedef struct H5B_shared_t {
     size_t              sizeof_len;     /* Size of file lengths (in bytes)   */
     uint8_t	        *page;	        /* Disk page */
     size_t              *nkey;          /* Offsets of each native key in native key buffer */
+    void                *udata;         /* 'Local' info for a B-tree         */
 } H5B_shared_t;
 
 /*
@@ -113,7 +114,7 @@ typedef struct H5B_shared_t {
 typedef struct H5B_class_t {
     H5B_subid_t id;					/*id as found in file*/
     size_t	sizeof_nkey;			/*size of native (memory) key*/
-    H5RC_t *    (*get_shared)(const H5F_t*, const void*);    /*shared info for node */
+    H5UC_t *    (*get_shared)(const H5F_t*, const void*);    /*shared info for node */
     herr_t	(*new_node)(H5F_t*, hid_t, H5B_ins_t, void*, void*, void*, haddr_t*);
     int         (*cmp2)(void*, void*, void*);	    /*compare 2 keys */
     int         (*cmp3)(void*, void*, void*);	    /*compare 3 keys */
diff --git a/src/H5C.c b/src/H5C.c
index 03fe3d4..5c3d9ef 100644
--- a/src/H5C.c
+++ b/src/H5C.c
@@ -41,7 +41,7 @@
  *
  *	Code Changes:
  *
- *	 - Remove extra functionality in H5C_flush_single_entry()?
+ *	 - Remove extra functionality in H5C__flush_single_entry()?
  *
  *	 - Change protect/unprotect to lock/unlock.
  *
@@ -70,60 +70,70 @@
  *
  **************************************************************************/
 
-#define H5C_PACKAGE		/*suppress error about including H5Cpkg   */
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+/****************/
+/* Module Setup */
+/****************/
 
+#include "H5Cmodule.h"          /* This source code file is part of the H5C module */
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
 
+
+/***********/
+/* Headers */
+/***********/
 #include "H5private.h"		/* Generic Functions			*/
 #ifdef H5_HAVE_PARALLEL
-#include "H5ACprivate.h"        /* Metadata cache                       */
+#define H5AC_FRIEND		/*suppress error about including H5ACpkg	  */
+#include "H5ACpkg.h"        /* Metadata cache                       */
 #endif /* H5_HAVE_PARALLEL */
 #include "H5Cpkg.h"		/* Cache				*/
-#include "H5Dprivate.h"		/* Dataset functions			*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
 #include "H5Fpkg.h"		/* Files				*/
 #include "H5FDprivate.h"	/* File drivers				*/
 #include "H5FLprivate.h"	/* Free Lists                           */
 #include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MFprivate.h"	/* File memory management		*/
 #include "H5MMprivate.h"	/* Memory management			*/
 #include "H5Pprivate.h"         /* Property lists                       */
 #include "H5SLprivate.h"	/* Skip lists				*/
 
 
-/*
- * Private file-scope variables.
- */
+/****************/
+/* Local Macros */
+/****************/
+#if H5C_DO_MEMORY_SANITY_CHECKS
+#define H5C_IMAGE_EXTRA_SPACE 8
+#define H5C_IMAGE_SANITY_VALUE "DeadBeef"
+#else /* H5C_DO_MEMORY_SANITY_CHECKS */
+#define H5C_IMAGE_EXTRA_SPACE 0
+#endif /* H5C_DO_MEMORY_SANITY_CHECKS */
 
-/* Declare a free list to manage the H5C_t struct */
-H5FL_DEFINE_STATIC(H5C_t);
 
+/******************/
+/* Local Typedefs */
+/******************/
 
-/*
- * Private file-scope function declarations:
- */
+
+/********************/
+/* Local Prototypes */
+/********************/
 
 static herr_t H5C__auto_adjust_cache_size(H5F_t * f,
-                                          hid_t primary_dxpl_id,
-                                          hid_t secondary_dxpl_id,
-                                          hbool_t write_permitted,
-                                          hbool_t * first_flush_ptr);
+                                          hid_t dxpl_id,
+                                          hbool_t write_permitted);
 
 static herr_t H5C__autoadjust__ageout(H5F_t * f,
+                                      hid_t dxpl_id,
                                       double hit_rate,
                                       enum H5C_resize_status * status_ptr,
                                       size_t * new_max_cache_size_ptr,
-                                      hid_t primary_dxpl_id,
-                                      hid_t secondary_dxpl_id,
-                                      hbool_t write_permitted,
-                                      hbool_t * first_flush_ptr);
+                                      hbool_t write_permitted);
 
 static herr_t H5C__autoadjust__ageout__cycle_epoch_marker(H5C_t * cache_ptr);
 
 static herr_t H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * f,
-                                                    hid_t primary_dxpl_id,
-                                                    hid_t secondary_dxpl_id,
-                                                    hbool_t write_permitted,
-                                                    hbool_t * first_flush_ptr);
+                                                       hid_t dxpl_id,
+                                                       hbool_t write_permitted);
 
 static herr_t H5C__autoadjust__ageout__insert_new_marker(H5C_t * cache_ptr);
 
@@ -135,19 +145,15 @@ static herr_t H5C__flash_increase_cache_size(H5C_t * cache_ptr,
                                              size_t old_entry_size,
                                              size_t new_entry_size);
 
-static herr_t H5C_flush_single_entry(H5F_t *       	 f,
-                                     hid_t               primary_dxpl_id,
-                                     hid_t               secondary_dxpl_id,
-                                     const H5C_class_t * type_ptr,
-                                     haddr_t             addr,
-                                     unsigned            flags,
-                                     hbool_t *           first_flush_ptr,
-                                     hbool_t    del_entry_from_slist_on_destroy);
+static herr_t H5C_flush_invalidate_cache(const H5F_t *  f,
+                                          hid_t    dxpl_id,
+			                  unsigned flags);
 
-static herr_t H5C_flush_invalidate_cache(H5F_t *  f,
-	                                 hid_t    primary_dxpl_id,
-				         hid_t    secondary_dxpl_id,
-					 unsigned flags);
+static herr_t H5C_flush_invalidate_ring(const H5F_t * f, hid_t dxpl_id,
+    H5C_ring_t ring, unsigned flags);
+
+static herr_t H5C_flush_ring(H5F_t *f, hid_t dxpl_id, H5C_ring_t ring,
+    unsigned flags);
 
 static void * H5C_load_entry(H5F_t *             f,
                              hid_t               dxpl_id,
@@ -156,17 +162,86 @@ static void * H5C_load_entry(H5F_t *             f,
                              void *              udata);
 
 static herr_t H5C_make_space_in_cache(H5F_t * f,
-                                      hid_t   primary_dxpl_id,
-                                      hid_t   secondary_dxpl_id,
-                                      size_t  space_needed,
-                                      hbool_t write_permitted,
-                                      hbool_t * first_flush_ptr);
+                                      hid_t   dxpl_id,
+       	                              size_t  space_needed,
+                                      hbool_t write_permitted);
+
+static herr_t H5C_tag_entry(H5C_t * cache_ptr, 
+                            H5C_cache_entry_t * entry_ptr,
+                            hid_t dxpl_id);
+
+static herr_t H5C_mark_tagged_entries(H5C_t * cache_ptr,
+                                      haddr_t tag,
+                                      hbool_t mark_clean);
+
+static herr_t H5C_mark_tagged_entries_cork(H5C_t *cache_ptr,
+                                           haddr_t obj_addr,
+                                           hbool_t val);
+
+static herr_t H5C_flush_marked_entries(H5F_t * f, 
+                                       hid_t dxpl_id);
+
+static herr_t H5C__mark_flush_dep_dirty(H5C_cache_entry_t * entry);
+
+static herr_t H5C__mark_flush_dep_clean(H5C_cache_entry_t * entry);
+
+static herr_t H5C_verify_len_eoa (H5F_t *f, 
+				  const H5C_class_t * type, 
+				  haddr_t addr, 
+				  size_t *len, 
+				  htri_t actual);
+
+#if H5C_DO_TAGGING_SANITY_CHECKS
+static herr_t H5C_verify_tag(int id, haddr_t tag);
+#endif
+
+#if H5C_DO_SLIST_SANITY_CHECKS
+static hbool_t H5C_entry_in_skip_list(H5C_t * cache_ptr, 
+                                      H5C_cache_entry_t *target_ptr);
+#endif /* H5C_DO_SLIST_SANITY_CHECKS */
+
 #if H5C_DO_EXTREME_SANITY_CHECKS
 static herr_t H5C_validate_lru_list(H5C_t * cache_ptr);
-static herr_t H5C_verify_not_in_index(H5C_t * cache_ptr,
-                                      H5C_cache_entry_t * entry_ptr);
+static herr_t H5C_validate_pinned_entry_list(H5C_t * cache_ptr);
+static herr_t H5C_validate_protected_entry_list(H5C_t * cache_ptr);
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
+#ifndef NDEBUG
+static void H5C__assert_flush_dep_nocycle(H5C_cache_entry_t * entry,
+                                          H5C_cache_entry_t * base_entry);
+#endif /* NDEBUG */
+
+#if 0 /* debugging routines */
+herr_t H5C_dump_cache(H5C_t * cache_ptr, const char *  cache_name);
+herr_t H5C_dump_cache_skip_list(H5C_t * cache_ptr, char * calling_fcn);
+#endif /* debugging routines */
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5C_t struct */
+H5FL_DEFINE_STATIC(H5C_t);
+
+/* Declare a free list to manage flush dependency arrays */
+H5FL_BLK_DEFINE_STATIC(parent);
+
+/* Declare a free list to manage corked object addresses */
+H5FL_DEFINE_STATIC(haddr_t);
+
 

 /****************************************************************************
  *
@@ -185,26 +260,65 @@ static herr_t H5C_verify_not_in_index(H5C_t * cache_ptr,
 
 #define H5C__EPOCH_MARKER_TYPE	H5C__MAX_NUM_TYPE_IDS
 
-static void *H5C_epoch_marker_load(H5F_t *f, hid_t dxpl_id, haddr_t addr,
-                                   void *udata);
-static herr_t H5C_epoch_marker_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest,
-                                     haddr_t addr, void *thing,
-				     unsigned *flags_ptr);
-static herr_t H5C_epoch_marker_dest(H5F_t *f, void *thing);
-static herr_t H5C_epoch_marker_clear(H5F_t *f, void *thing, hbool_t dest);
-static herr_t H5C_epoch_marker_notify(H5C_notify_action_t action, void *thing);
-static herr_t H5C_epoch_marker_size(const H5F_t *f, const void *thing, size_t *size_ptr);
+static herr_t H5C__epoch_marker_get_load_size(const void *image_ptr,
+					      void *udata_ptr,
+		                              size_t *image_len_ptr,
+					      size_t *actual_len,
+					      hbool_t *compressed_ptr,
+					      size_t *compressed_len_ptr);
+static htri_t H5C__epoch_marker_verify_chksum(const void *image_ptr, 
+					      size_t len, 
+					      void *udata_ptr);
+static void * H5C__epoch_marker_deserialize(const void * image_ptr,
+		                            size_t len,
+			                    void * udata,
+			                    hbool_t * dirty_ptr);
+static herr_t H5C__epoch_marker_image_len(const void * thing,
+		                          size_t *image_len_ptr,
+                                          hbool_t *compressed_ptr,
+                                          size_t *compressed_len_ptr);
+static herr_t H5C__epoch_marker_pre_serialize(const H5F_t *f,
+		                             hid_t dxpl_id,
+                                             void * thing,
+                                             haddr_t addr,
+		                             size_t len,
+					     size_t compressed_len,
+		                             haddr_t * new_addr_ptr,
+		                             size_t * new_len_ptr,
+					     size_t * new_compressed_len_ptr,
+		                             unsigned * flags_ptr);
+static herr_t H5C__epoch_marker_serialize(const H5F_t *f,
+		                          void * image_ptr,
+		                          size_t len,
+                                          void * thing);
+static herr_t H5C__epoch_marker_notify(H5C_notify_action_t action, void *thing);
+static herr_t H5C__epoch_marker_free_icr(void * thing);
+
+static herr_t H5C__epoch_marker_clear(const H5F_t *f, void * thing, 
+                                      hbool_t about_to_destroy);
+static herr_t H5C__epoch_marker_fsf_size(const void H5_ATTR_UNUSED * thing, 
+                                         size_t H5_ATTR_UNUSED * fsf_size_ptr);
 
 const H5C_class_t epoch_marker_class =
 {
-    /* id    = */ H5C__EPOCH_MARKER_TYPE,
-    /* load  = */ &H5C_epoch_marker_load,
-    /* flush = */ &H5C_epoch_marker_flush,
-    /* dest  = */ &H5C_epoch_marker_dest,
-    /* clear = */ &H5C_epoch_marker_clear,
-    /* size  = */ &H5C_epoch_marker_size
+    /* id               = */ H5C__EPOCH_MARKER_TYPE,
+    /* name             = */ "epoch marker",
+    /* mem_type         = */ H5FD_MEM_DEFAULT, /* value doesn't matter */
+    /* flags		= */ H5AC__CLASS_NO_FLAGS_SET,
+    /* get_load_size    = */ H5C__epoch_marker_get_load_size,
+    /* verify_chksum    = */ H5C__epoch_marker_verify_chksum,
+    /* deserialize      = */ H5C__epoch_marker_deserialize,
+    /* image_len        = */ H5C__epoch_marker_image_len,
+    /* pre_serialize    = */ H5C__epoch_marker_pre_serialize,
+    /* serialize        = */ H5C__epoch_marker_serialize,
+    /* notify           = */ H5C__epoch_marker_notify,
+    /* free_icr         = */ H5C__epoch_marker_free_icr,
+    /* clear            = */ H5C__epoch_marker_clear,
+    /* fsf_size         = */ H5C__epoch_marker_fsf_size,
 };
 
+
+

 /***************************************************************************
  * Class functions for H5C__EPOCH_MAKER_TYPE:
  *
@@ -213,843 +327,277 @@ const H5C_class_t epoch_marker_class =
  *                                                     JRM - 11/16/04
  *
  ***************************************************************************/
-
-static void *
-H5C_epoch_marker_load(H5F_t H5_ATTR_UNUSED * f,
-                      hid_t H5_ATTR_UNUSED dxpl_id,
-                      haddr_t H5_ATTR_UNUSED addr,
-                      void H5_ATTR_UNUSED * udata)
+static herr_t
+H5C__epoch_marker_get_load_size(const void H5_ATTR_UNUSED *image_ptr, void H5_ATTR_UNUSED *udata_ptr,
+    size_t H5_ATTR_UNUSED *image_len_ptr, size_t H5_ATTR_UNUSED *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
 {
-    void * ret_value = NULL;      /* Return value */
-
-    FUNC_ENTER_NOAPI_NOINIT
-
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, "called unreachable fcn.")
+    FUNC_ENTER_STATIC_NOERR /* Yes, even though this pushes an error on the stack */
 
-done:
+    HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn.");
 
-    FUNC_LEAVE_NOAPI(ret_value)
-}
+    FUNC_LEAVE_NOAPI(FAIL)
+} /* end H5C__epoch_marker_get_load_size() */
 
-static herr_t
-H5C_epoch_marker_flush(H5F_t H5_ATTR_UNUSED *f,
-                       hid_t H5_ATTR_UNUSED dxpl_id,
-                       hbool_t H5_ATTR_UNUSED dest,
-                       haddr_t H5_ATTR_UNUSED addr,
-                       void H5_ATTR_UNUSED *thing,
-		       unsigned H5_ATTR_UNUSED * flags_ptr)
+

+static htri_t 
+H5C__epoch_marker_verify_chksum(const void H5_ATTR_UNUSED *image_ptr, size_t H5_ATTR_UNUSED len, 
+    void H5_ATTR_UNUSED *udata_ptr)
 {
-    herr_t ret_value = FAIL;      /* Return value */
+    FUNC_ENTER_STATIC_NOERR /* Yes, even though this pushes an error on the stack */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn.");
 
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "called unreachable fcn.")
+    FUNC_LEAVE_NOAPI(FALSE)
+} /* end H5C__epoch_marker_verify_chksum() */
 
-done:
+

+static void *
+H5C__epoch_marker_deserialize(const void H5_ATTR_UNUSED * image_ptr, size_t H5_ATTR_UNUSED len,
+    void H5_ATTR_UNUSED * udata, hbool_t H5_ATTR_UNUSED * dirty_ptr)
+{
+    FUNC_ENTER_STATIC_NOERR /* Yes, even though this pushes an error on the stack */
 
-    FUNC_LEAVE_NOAPI(ret_value)
-}
+    HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn.");
 
+    FUNC_LEAVE_NOAPI(NULL)
+} /* end H5C__epoch_marker_deserialize() */
+
+

 static herr_t
-H5C_epoch_marker_dest(H5F_t H5_ATTR_UNUSED * f,
-                      void H5_ATTR_UNUSED * thing)
+H5C__epoch_marker_image_len(const void H5_ATTR_UNUSED *thing,
+    size_t H5_ATTR_UNUSED *image_len_ptr, hbool_t H5_ATTR_UNUSED *compressed_ptr,
+    size_t H5_ATTR_UNUSED *compressed_len_ptr)
 {
-    herr_t ret_value = FAIL;      /* Return value */
-
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR /* Yes, even though this pushes an error on the stack */
 
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "called unreachable fcn.")
+    HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn.");
 
-done:
-
-    FUNC_LEAVE_NOAPI(ret_value)
-}
+    FUNC_LEAVE_NOAPI(FAIL)
+} /* end H5C__epoch_marker_image_len() */
 
+

 static herr_t
-H5C_epoch_marker_clear(H5F_t H5_ATTR_UNUSED * f,
-                       void H5_ATTR_UNUSED * thing,
-                       hbool_t H5_ATTR_UNUSED dest)
+H5C__epoch_marker_pre_serialize(const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
+    void H5_ATTR_UNUSED *thing, haddr_t H5_ATTR_UNUSED addr, size_t H5_ATTR_UNUSED len,
+    size_t H5_ATTR_UNUSED compressed_len, haddr_t H5_ATTR_UNUSED *new_addr_ptr, 
+    size_t H5_ATTR_UNUSED *new_len_ptr, size_t H5_ATTR_UNUSED *new_compressed_len_ptr,
+    unsigned H5_ATTR_UNUSED *flags_ptr)
 {
-    herr_t ret_value = FAIL;      /* Return value */
+    FUNC_ENTER_STATIC_NOERR /* Yes, even though this pushes an error on the stack */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn.");
 
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "called unreachable fcn.")
+    FUNC_LEAVE_NOAPI(FAIL)
+} /* end H5C__epoch_marker_pre_serialize() */
 
-done:
+

+static herr_t
+H5C__epoch_marker_serialize(const H5F_t H5_ATTR_UNUSED *f, void H5_ATTR_UNUSED *image_ptr,
+    size_t H5_ATTR_UNUSED len, void H5_ATTR_UNUSED *thing)
+{
+    FUNC_ENTER_STATIC_NOERR /* Yes, even though this pushes an error on the stack */
 
-    FUNC_LEAVE_NOAPI(ret_value)
-}
+    HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn.");
 
+    FUNC_LEAVE_NOAPI(FAIL)
+} /* end H5C__epoch_marker_serialize() */
+
+

 static herr_t
-H5C_epoch_marker_notify(H5C_notify_action_t H5_ATTR_UNUSED action,
+H5C__epoch_marker_notify(H5C_notify_action_t H5_ATTR_UNUSED action,
                        void H5_ATTR_UNUSED * thing)
 {
-    herr_t ret_value = FAIL;      /* Return value */
-
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR /* Yes, even though this pushes an error on the stack */
 
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "called unreachable fcn.")
+    HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn.");
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-}
+    FUNC_LEAVE_NOAPI(FAIL)
+} /* end H5C__epoch_marker_notify() */
 
+

 static herr_t
-H5C_epoch_marker_size(const H5F_t H5_ATTR_UNUSED * f,
-                      const void H5_ATTR_UNUSED * thing,
-                      size_t H5_ATTR_UNUSED * size_ptr)
+H5C__epoch_marker_free_icr(void H5_ATTR_UNUSED * thing)
 {
-    herr_t ret_value = FAIL;      /* Return value */
+    FUNC_ENTER_STATIC_NOERR /* Yes, even though this pushes an error on the stack */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn.");
 
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "called unreachable fcn.")
+    FUNC_LEAVE_NOAPI(FAIL)
+} /* end H5C__epoch_marker_free_icr() */
 
-done:
+

+static herr_t 
+H5C__epoch_marker_clear(const H5F_t H5_ATTR_UNUSED *f, void H5_ATTR_UNUSED * thing, hbool_t H5_ATTR_UNUSED about_to_destroy)
+{
+    FUNC_ENTER_STATIC_NOERR /* Yes, even though this pushes an error on the stack */
+
+    HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn.");
+
+    FUNC_LEAVE_NOAPI(FAIL)
+} /* end H5C__epoch_marker_clear() */
+
+

+static herr_t 
+H5C__epoch_marker_fsf_size(const void H5_ATTR_UNUSED * thing, size_t H5_ATTR_UNUSED *fsf_size_ptr)
+{
+    FUNC_ENTER_STATIC_NOERR /* Yes, even though this pushes an error on the stack */
+
+    HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn.");
+
+    FUNC_LEAVE_NOAPI(FAIL)
+} /* end H5C__epoch_marker_fsf_size() */
 
-    FUNC_LEAVE_NOAPI(ret_value)
-}
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5C_apply_candidate_list
- *
- * Purpose:     Apply the supplied candidate list.
- *
- *		We used to do this by simply having each process write 
- *		every mpi_size-th entry in the candidate list, starting 
- *		at index mpi_rank, and mark all the others clean.  
- *
- *		However, this can cause unnecessary contention in a file 
- *		system by increasing the number of processes writing to 
- *		adjacent locations in the HDF5 file.
- *
- *		To attempt to minimize this, we now arange matters such 
- *		that each process writes n adjacent entries in the 
- *		candidate list, and marks all others clean.  We must do
- *		this in such a fashion as to guarantee that each entry 
- *		on the candidate list is written by exactly one process, 
- *		and marked clean by all others.  
- *
- *		To do this, first construct a table mapping mpi_rank
- *		to the index of the first entry in the candidate list to
- *		be written by the process of that mpi_rank, and then use
- *		the table to control which entries are written and which
- *		are marked as clean as a function of the mpi_rank.
- *
- *		Note that the table must be identical on all processes, as
- *		all see the same candidate list, mpi_size, and mpi_rank --
- *		the inputs used to construct the table.  
- *
- *		We construct the table as follows.  Let:
- *
- *			n = num_candidates / mpi_size;
- *
- *			m = num_candidates % mpi_size;
- *
- *		Now allocate an array of integers of length mpi_size + 1, 
- *		and call this array candidate_assignment_table. 
- *
- *		Conceptually, if the number of candidates is a multiple
- *		of the mpi_size, we simply pass through the candidate list
- *		and assign n entries to each process to flush, with the 
- *		index of the first entry to flush in the location in 
- *		the candidate_assignment_table indicated by the mpi_rank
- *		of the process.  
- *
- *		In the more common case in which the candidate list isn't 
- *		isn't a multiple of the mpi_size, we pretend it is, and 
- *		give num_candidates % mpi_size processes one extra entry
- *		each to make things work out.
- *
- *		Once the table is constructed, we determine the first and
- *		last entry this process is to flush as follows:
- *
- *	 	first_entry_to_flush = candidate_assignment_table[mpi_rank]
- *
- *		last_entry_to_flush = 
- *			candidate_assignment_table[mpi_rank + 1] - 1;
- *		
- *		With these values determined, we simply scan through the 
- *		candidate list, marking all entries in the range 
- *		[first_entry_to_flush, last_entry_to_flush] for flush,
- *		and all others to be cleaned.
+ * Function:    H5C_create
  *
- *		Finally, we scan the LRU from tail to head, flushing 
- *		or marking clean the candidate entries as indicated.
- *		If necessary, we scan the pinned list as well.
+ * Purpose:     Allocate, initialize, and return the address of a new
+ *		instance of H5C_t.
  *
- *		Note that this function will fail if any protected or 
- *		clean entries appear on the candidate list.
+ *		In general, the max_cache_size parameter must be positive,
+ *		and the min_clean_size parameter must lie in the closed
+ *		interval [0, max_cache_size].
  *
- *		This function is used in managing sync points, and 
- *		shouldn't be used elsewhere.
+ *		The check_write_permitted parameter must either be NULL,
+ *		or point to a function of type H5C_write_permitted_func_t.
+ *		If it is NULL, the cache will use the write_permitted
+ *		flag to determine whether writes are permitted.
  *
- * Return:      Success:        SUCCEED
+ * Return:      Success:        Pointer to the new instance.
  *
- *              Failure:        FAIL
+ *              Failure:        NULL
  *
  * Programmer:  John Mainzer
- *              3/17/10
- *
- * Modifications:
- *
- *		Heavily reworked to have each process flush a group of 
- *		adjacent entries.
- *						JRM -- 4/15/10
+ *              6/2/04
  *
  *-------------------------------------------------------------------------
  */
-#ifdef H5_HAVE_PARALLEL
-#define H5C_APPLY_CANDIDATE_LIST__DEBUG 0
-herr_t
-H5C_apply_candidate_list(H5F_t * f,
-                         hid_t primary_dxpl_id,
-                         hid_t secondary_dxpl_id,
-                         H5C_t * cache_ptr,
-                         int num_candidates,
-                         haddr_t * candidates_list_ptr,
-                         int mpi_rank,
-                         int mpi_size)
+H5C_t *
+H5C_create(size_t		      max_cache_size,
+           size_t		      min_clean_size,
+           int			      max_type_id,
+           const char *		      (* type_name_table_ptr),
+           H5C_write_permitted_func_t check_write_permitted,
+           hbool_t		      write_permitted,
+           H5C_log_flush_func_t       log_flush,
+           void *                     aux_ptr)
 {
-    hbool_t             first_flush = FALSE;
-    int                 i;
-    int			m;
-    int			n;
-    int			first_entry_to_flush;
-    int			last_entry_to_flush;
-    int			entries_to_clear = 0;
-    int			entries_to_flush = 0;
-    int			entries_cleared = 0;
-    int			entries_flushed = 0;
-    int			entries_examined = 0;
-    int			initial_list_len;
-    int               * candidate_assignment_table = NULL;
-    haddr_t		addr;
-    H5C_cache_entry_t *	clear_ptr = NULL;
-    H5C_cache_entry_t *	entry_ptr = NULL;
-    H5C_cache_entry_t *	flush_ptr = NULL;
-#if H5C_DO_SANITY_CHECKS
-    haddr_t		last_addr;
-#endif /* H5C_DO_SANITY_CHECKS */
-#if H5C_APPLY_CANDIDATE_LIST__DEBUG
-    char		tbl_buf[1024];
-#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
-    herr_t              ret_value = SUCCEED;      /* Return value */
+    int i;
+    H5C_t * cache_ptr = NULL;
+    H5C_t * ret_value = NULL;      /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI(NULL)
 
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-    HDassert( num_candidates > 0 );
-    HDassert( num_candidates <= cache_ptr->slist_len );
-    HDassert( candidates_list_ptr != NULL );
-    HDassert( 0 <= mpi_rank );
-    HDassert( mpi_rank < mpi_size );
-
-#if H5C_APPLY_CANDIDATE_LIST__DEBUG
-    HDfprintf(stdout, "%s:%d: setting up candidate assignment table.\n", 
-              FUNC, mpi_rank);
-    for ( i = 0; i < 1024; i++ ) tbl_buf[i] = '\0';
-    sprintf(&(tbl_buf[0]), "candidate list = ");
-    for ( i = 0; i < num_candidates; i++ )
-    {
-        sprintf(&(tbl_buf[HDstrlen(tbl_buf)]), " 0x%llx", 
-                (long long)(*(candidates_list_ptr + i)));
-    }
-    sprintf(&(tbl_buf[HDstrlen(tbl_buf)]), "\n");
-    HDfprintf(stdout, "%s", tbl_buf);
-#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+    HDassert( max_cache_size >= H5C__MIN_MAX_CACHE_SIZE );
+    HDassert( max_cache_size <= H5C__MAX_MAX_CACHE_SIZE );
+    HDassert( min_clean_size <= max_cache_size );
 
-    n = num_candidates / mpi_size;
-    m = num_candidates % mpi_size;
-    HDassert(n >= 0);
+    HDassert( max_type_id >= 0 );
+    HDassert( max_type_id < H5C__MAX_NUM_TYPE_IDS );
+    HDassert( type_name_table_ptr );
 
-    if(NULL == (candidate_assignment_table = (int *)H5MM_malloc(sizeof(int) * (size_t)(mpi_size + 1))))
-        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for candidate assignment table")
+    HDassert( ( write_permitted == TRUE ) || ( write_permitted == FALSE ) );
 
-    candidate_assignment_table[0] = 0;
-    candidate_assignment_table[mpi_size] = num_candidates;
+    for ( i = 0; i <= max_type_id; i++ ) {
 
-    if(m == 0) { /* mpi_size is an even divisor of num_candidates */
-        HDassert(n > 0);
-        for(i = 1; i < mpi_size; i++)
-            candidate_assignment_table[i] = candidate_assignment_table[i - 1] + n;
-    } /* end if */
-    else { 
-        for(i = 1; i <= m; i++)
-            candidate_assignment_table[i] = candidate_assignment_table[i - 1] + n + 1;
+        HDassert( (type_name_table_ptr)[i] );
+        HDassert( HDstrlen(( type_name_table_ptr)[i]) > 0 );
+    }
 
-        if(num_candidates < mpi_size) {
-            for(i = m + 1; i < mpi_size; i++)
-                candidate_assignment_table[i] = num_candidates;
-        } /* end if */
-        else {
-            for(i = m + 1; i < mpi_size; i++)
-                candidate_assignment_table[i] = candidate_assignment_table[i - 1] + n;
-        } /* end else */
-    } /* end else */
-    HDassert((candidate_assignment_table[mpi_size - 1] + n) == num_candidates);
+    if ( NULL == (cache_ptr = H5FL_CALLOC(H5C_t)) ) {
 
-#if H5C_DO_SANITY_CHECKS
-    /* verify that the candidate assignment table has the expected form */
-    for ( i = 1; i < mpi_size - 1; i++ ) 
-    {
-        int a, b;
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, \
+                    "memory allocation failed")
+    }
 
-        a = candidate_assignment_table[i] - candidate_assignment_table[i - 1];
-        b = candidate_assignment_table[i + 1] - candidate_assignment_table[i];
+    if ( (cache_ptr->slist_ptr = H5SL_create(H5SL_TYPE_HADDR, NULL)) == NULL ) {
 
-        HDassert( n + 1 >= a );
-        HDassert( a >= b );
-        HDassert( b >= n );
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, NULL, "can't create skip list.")
     }
-#endif /* H5C_DO_SANITY_CHECKS */
 
-    first_entry_to_flush = candidate_assignment_table[mpi_rank];
-    last_entry_to_flush = candidate_assignment_table[mpi_rank + 1] - 1;
+    if ( (cache_ptr->cork_list_ptr = H5SL_create(H5SL_TYPE_HADDR, NULL)) == NULL ) {
 
-#if H5C_APPLY_CANDIDATE_LIST__DEBUG
-    for ( i = 0; i < 1024; i++ )
-        tbl_buf[i] = '\0';
-    sprintf(&(tbl_buf[0]), "candidate assignment table = ");
-    for(i = 0; i <= mpi_size; i++)
-        sprintf(&(tbl_buf[HDstrlen(tbl_buf)]), " %d", candidate_assignment_table[i]);
-    sprintf(&(tbl_buf[HDstrlen(tbl_buf)]), "\n");
-    HDfprintf(stdout, "%s", tbl_buf);
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, NULL, "can't create skip list for corked object addresses.")
+    }
 
-    HDfprintf(stdout, "%s:%d: flush entries [%d, %d].\n", 
-              FUNC, mpi_rank, first_entry_to_flush, last_entry_to_flush);
+    /* If we get this far, we should succeed.  Go ahead and initialize all
+     * the fields.
+     */
 
-    HDfprintf(stdout, "%s:%d: marking entries.\n", FUNC, mpi_rank);
-#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+    cache_ptr->magic 				= H5C__H5C_T_MAGIC;
 
-    for(i = 0; i < num_candidates; i++) {
-        addr = candidates_list_ptr[i];
-        HDassert( H5F_addr_defined(addr) );
+    cache_ptr->flush_in_progress		= FALSE;
 
-#if H5C_DO_SANITY_CHECKS
-        if ( i > 0 ) {
-            if ( last_addr == addr ) {
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Duplicate entry in cleaned list.\n")
-            } else if ( last_addr > addr ) {
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "candidate list not sorted.\n")
-            }
-        }
+    cache_ptr->logging_enabled                  = FALSE;
 
-        last_addr = addr;
-#endif /* H5C_DO_SANITY_CHECKS */
+    cache_ptr->currently_logging                = FALSE;
 
-        H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
-        if(entry_ptr == NULL) {
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Listed candidate entry not in cache?!?!?.")
-        } else if(!entry_ptr->is_dirty) {
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Listed entry not dirty?!?!?.")
-        } else if ( entry_ptr->is_protected ) {
-            /* For now at least, we can't deal with protected entries.
-             * If we encounter one, scream and die.  If it becomes an
-             * issue, we should be able to work around this. 
-             */
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Listed entry is protected?!?!?.")
-        } else {
-            /* determine whether the entry is to be cleared or flushed,
-             * and mark it accordingly.  We will scan the protected and 
-             * pinned list shortly, and clear or flush according to these
-             * markings.  
-             */
-            if((i >= first_entry_to_flush) && (i <= last_entry_to_flush)) {
-                entries_to_flush++;
-                entry_ptr->flush_immediately = TRUE;
-            } /* end if */
-            else {
-                entries_to_clear++;
-                entry_ptr->clear_on_unprotect = TRUE;
-            } /* end else */
-        } /* end else */
-    } /* end for */
+    cache_ptr->log_file_ptr			= NULL;
 
-#if H5C_APPLY_CANDIDATE_LIST__DEBUG
-    HDfprintf(stdout, "%s:%d: num candidates/to clear/to flush = %d/%d/%d.\n", 
-              FUNC, mpi_rank, (int)num_candidates, (int)entries_to_clear,
-              (int)entries_to_flush);
-#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+    cache_ptr->trace_file_ptr			= NULL;
 
+    cache_ptr->aux_ptr				= aux_ptr;
 
-    /* We have now marked all the entries on the candidate list for 
-     * either flush or clear -- now scan the LRU and the pinned list
-     * for these entries and do the deed.
-     *
-     * Note that we are doing things in this round about manner so as
-     * to preserve the order of the LRU list to the best of our ability.
-     * If we don't do this, my experiments indicate that we will have a
-     * noticably poorer hit ratio as a result.
-     */
+    cache_ptr->max_type_id			= max_type_id;
 
-#if H5C_APPLY_CANDIDATE_LIST__DEBUG
-    HDfprintf(stdout, "%s:%d: scanning LRU list. len = %d.\n", FUNC, mpi_rank,
-              (int)(cache_ptr->LRU_list_len));
-#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+    cache_ptr->type_name_table_ptr		= type_name_table_ptr;
 
-    entries_examined = 0;
-    initial_list_len = cache_ptr->LRU_list_len;
-    entry_ptr = cache_ptr->LRU_tail_ptr;
+    cache_ptr->max_cache_size			= max_cache_size;
+    cache_ptr->min_clean_size			= min_clean_size;
 
-    while((entry_ptr != NULL) && (entries_examined <= initial_list_len) &&
-            ((entries_cleared + entries_flushed) < num_candidates)) {
-        if(entry_ptr->clear_on_unprotect) {
-            entry_ptr->clear_on_unprotect = FALSE;
-            clear_ptr = entry_ptr;
-            entry_ptr = entry_ptr->prev;
-            entries_cleared++;
-
-#if ( H5C_APPLY_CANDIDATE_LIST__DEBUG > 1 )
-    HDfprintf(stdout, "%s:%d: clearing 0x%llx.\n", FUNC, mpi_rank, 
-              (long long)clear_ptr->addr);
-#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
-
-            if(H5C_flush_single_entry(f,
-                                      primary_dxpl_id,
-                                      secondary_dxpl_id,
-                                      clear_ptr->type,
-                                      clear_ptr->addr,
-                                      H5C__FLUSH_CLEAR_ONLY_FLAG,
-                                      &first_flush,
-                                      TRUE) < 0)
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.")
-        } else if(entry_ptr->flush_immediately) {
-            entry_ptr->flush_immediately = FALSE;
-            flush_ptr = entry_ptr;
-            entry_ptr = entry_ptr->prev;
-            entries_flushed++;
-
-#if ( H5C_APPLY_CANDIDATE_LIST__DEBUG > 1 )
-    HDfprintf(stdout, "%s:%d: flushing 0x%llx.\n", FUNC, mpi_rank, 
-              (long long)flush_ptr->addr);
-#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
-
-            if(H5C_flush_single_entry(f,
-                                      primary_dxpl_id,
-                                      secondary_dxpl_id,
-                                      flush_ptr->type,
-                                      flush_ptr->addr,
-                                      H5C__NO_FLAGS_SET,
-                                      &first_flush,
-                                      TRUE) < 0)
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.")
-        } else {
-            entry_ptr = entry_ptr->prev;
-        }
+    cache_ptr->check_write_permitted		= check_write_permitted;
+    cache_ptr->write_permitted			= write_permitted;
 
-        entries_examined++;
-    } /* end while */
+    cache_ptr->log_flush			= log_flush;
 
-#if H5C_APPLY_CANDIDATE_LIST__DEBUG
-    HDfprintf(stdout, "%s:%d: entries examined/cleared/flushed = %d/%d/%d.\n", 
-              FUNC, mpi_rank, entries_examined, 
-              entries_cleared, entries_flushed);
-#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+    cache_ptr->evictions_enabled		= TRUE;
 
-    /* It is also possible that some of the cleared entries are on the
-     * pinned list.  Must scan that also.
-     */
+    cache_ptr->index_len			= 0;
+    cache_ptr->index_size			= (size_t)0;
+    cache_ptr->clean_index_size			= (size_t)0;
+    cache_ptr->dirty_index_size			= (size_t)0;
 
-#if H5C_APPLY_CANDIDATE_LIST__DEBUG
-    HDfprintf(stdout, "%s:%d: scanning pinned entry list. len = %d\n", 
-             FUNC, mpi_rank, (int)(cache_ptr->pel_len));
-#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+    for(i = 0; i < H5C_RING_NTYPES; i++) {
+	cache_ptr->index_ring_len[i]		= 0;
+	cache_ptr->index_ring_size[i]		= (size_t)0;
+	cache_ptr->clean_index_ring_size[i]	= (size_t)0;
+	cache_ptr->dirty_index_ring_size[i]	= (size_t)0;
 
-    entry_ptr = cache_ptr->pel_head_ptr;
-    while((entry_ptr != NULL) &&
-            ((entries_cleared + entries_flushed) < num_candidates)) {
-        if(entry_ptr->clear_on_unprotect) {
-            entry_ptr->clear_on_unprotect = FALSE;
-            clear_ptr = entry_ptr;
-            entry_ptr = entry_ptr->next;
-            entries_cleared++;
-
-#if ( H5C_APPLY_CANDIDATE_LIST__DEBUG > 1 )
-            HDfprintf(stdout, "%s:%d: clearing 0x%llx.\n", FUNC, mpi_rank, 
-                      (long long)clear_ptr->addr);
-#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
-
-            if(H5C_flush_single_entry(f,
-                                      primary_dxpl_id,
-                                      secondary_dxpl_id,
-                                      clear_ptr->type,
-                                      clear_ptr->addr,
-                                      H5C__FLUSH_CLEAR_ONLY_FLAG,
-                                      &first_flush,
-                                      TRUE) < 0)
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.")
-        } else if(entry_ptr->flush_immediately) {
-            entry_ptr->flush_immediately = FALSE;
-            flush_ptr = entry_ptr;
-            entry_ptr = entry_ptr->next;
-            entries_flushed++;
-
-#if ( H5C_APPLY_CANDIDATE_LIST__DEBUG > 1 )
-            HDfprintf(stdout, "%s:%d: flushing 0x%llx.\n", FUNC, mpi_rank, 
-                      (long long)flush_ptr->addr);
-#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
-
-            if(H5C_flush_single_entry(f,
-                                      primary_dxpl_id,
-                                      secondary_dxpl_id,
-                                      flush_ptr->type,
-                                      flush_ptr->addr,
-                                      H5C__NO_FLAGS_SET,
-                                      &first_flush,
-                                      TRUE) < 0)
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.")
-        } else {
-            entry_ptr = entry_ptr->next;
-        }
-    } /* end while */
+	cache_ptr->slist_ring_len[i]		= 0;
+	cache_ptr->slist_ring_size[i]		= (size_t)0;
+    } /* end for */
 
-#if H5C_APPLY_CANDIDATE_LIST__DEBUG
-    HDfprintf(stdout, 
-              "%s:%d: pel entries examined/cleared/flushed = %d/%d/%d.\n", 
-              FUNC, mpi_rank, entries_examined, 
-              entries_cleared, entries_flushed);
-    HDfprintf(stdout, "%s:%d: done.\n", FUNC, mpi_rank);
+    /* Tagging Field Initializations */
+    cache_ptr->ignore_tags                      = FALSE;
 
-    HDfsync(stdout);
-#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+    cache_ptr->slist_changed			= FALSE;
+    cache_ptr->slist_change_in_pre_serialize	= FALSE;
+    cache_ptr->slist_change_in_serialize	= FALSE;
+    cache_ptr->slist_len			= 0;
+    cache_ptr->slist_size			= (size_t)0;
 
-    if((entries_flushed != entries_to_flush) || (entries_cleared != entries_to_clear))
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "entry count mismatch.")
+#if H5C_DO_SANITY_CHECKS
+    cache_ptr->slist_len_increase		= 0;
+    cache_ptr->slist_size_increase		= 0;
+#endif /* H5C_DO_SANITY_CHECKS */
 
-done:
-    if(candidate_assignment_table != NULL)
-        candidate_assignment_table = (int *)H5MM_xfree((void *)candidate_assignment_table);
+    for(i = 0; i < H5C__HASH_TABLE_LEN; i++)
+        (cache_ptr->index)[i] = NULL;
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C_apply_candidate_list() */
-#endif /* H5_HAVE_PARALLEL */
+    cache_ptr->entries_removed_counter		= 0;
+    cache_ptr->last_entry_removed_ptr		= NULL;
 
-

-/*-------------------------------------------------------------------------
- * Function:    H5C_construct_candidate_list__clean_cache
- *
- * Purpose:     Construct the list of entries that should be flushed to 
- *		clean all entries in the cache.
- *
- *		This function is used in managing sync points, and 
- *		shouldn't be used elsewhere.
- *
- * Return:      Success:        SUCCEED
- *
- *              Failure:        FAIL
- *
- * Programmer:  John Mainzer
- *              3/17/10
- *
- *-------------------------------------------------------------------------
- */
-#ifdef H5_HAVE_PARALLEL
-herr_t
-H5C_construct_candidate_list__clean_cache(H5C_t * cache_ptr)
-{
-    size_t              space_needed;
-    herr_t              ret_value = SUCCEED;      /* Return value */
+    cache_ptr->pl_len				= 0;
+    cache_ptr->pl_size				= (size_t)0;
+    cache_ptr->pl_head_ptr			= NULL;
+    cache_ptr->pl_tail_ptr			= NULL;
 
-    FUNC_ENTER_NOAPI(FAIL)
-
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    /* As a sanity check, set space needed to the size of the skip list.
-     * This should be the sum total of the sizes of all the dirty entries
-     * in the metadata cache.
-     */
-    space_needed = cache_ptr->slist_size;
-
-    /* Recall that while we shouldn't have any protected entries at this
-     * point, it is possible that some dirty entries may reside on the
-     * pinned list at this point.
-     */
-    HDassert( cache_ptr->slist_size <= 
-              (cache_ptr->dLRU_list_size + cache_ptr->pel_size) );
-    HDassert( cache_ptr->slist_len  <= 
-              (cache_ptr->dLRU_list_len + cache_ptr->pel_len) );
-
-    if(space_needed > 0) { /* we have work to do */
-        H5C_cache_entry_t *entry_ptr;
-        int     nominated_entries_count = 0;
-        size_t  nominated_entries_size = 0;
-        haddr_t	nominated_addr;
-
-        HDassert( cache_ptr->slist_len > 0 );
-
-        /* Scan the dirty LRU list from tail forward and nominate sufficient
-         * entries to free up the necessary space. 
-         */
-        entry_ptr = cache_ptr->dLRU_tail_ptr;
-        while((nominated_entries_size < space_needed) &&
-                (nominated_entries_count < cache_ptr->slist_len) &&
-                (entry_ptr != NULL)) {
-            HDassert( ! (entry_ptr->is_protected) );
-            HDassert( ! (entry_ptr->is_read_only) );
-            HDassert( entry_ptr->ro_ref_count == 0 );
-            HDassert( entry_ptr->is_dirty );
-            HDassert( entry_ptr->in_slist );
-
-            nominated_addr = entry_ptr->addr;
-            if(H5AC_add_candidate((H5AC_t *)cache_ptr, nominated_addr) < 0)
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_add_candidate() failed(1).")
-
-            nominated_entries_size += entry_ptr->size;
-            nominated_entries_count++;
-            entry_ptr = entry_ptr->aux_prev;
-        } /* end while */
-        HDassert( entry_ptr == NULL );
-
-        /* it is possible that there are some dirty entries on the 
-         * protected entry list as well -- scan it too if necessary
-         */
-        entry_ptr = cache_ptr->pel_head_ptr;
-        while((nominated_entries_size < space_needed) &&
-                (nominated_entries_count < cache_ptr->slist_len) &&
-                (entry_ptr != NULL)) {
-            if(entry_ptr->is_dirty) {
-                HDassert( ! (entry_ptr->is_protected) );
-                HDassert( ! (entry_ptr->is_read_only) );
-                HDassert( entry_ptr->ro_ref_count == 0 );
-                HDassert( entry_ptr->is_dirty );
-                HDassert( entry_ptr->in_slist );
-
-                nominated_addr = entry_ptr->addr;
-                if(H5AC_add_candidate((H5AC_t *)cache_ptr, nominated_addr) < 0)
-                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_add_candidate() failed(2).")
-
-                nominated_entries_size += entry_ptr->size;
-                nominated_entries_count++;
-            } /* end if */
-
-            entry_ptr = entry_ptr->next;
-        } /* end while */
-
-        HDassert( nominated_entries_count == cache_ptr->slist_len );
-        HDassert( nominated_entries_size == space_needed );
-    } /* end if */
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C_construct_candidate_list__clean_cache() */
-#endif /* H5_HAVE_PARALLEL */
-
-

-/*-------------------------------------------------------------------------
- * Function:    H5C_construct_candidate_list__min_clean
- *
- * Purpose:     Construct the list of entries that should be flushed to 
- *		get the cache back within its min clean constraints.
- *
- *		This function is used in managing sync points, and 
- *		shouldn't be used elsewhere.
- *
- * Return:      Success:        SUCCEED
- *
- *              Failure:        FAIL
- *
- * Programmer:  John Mainzer
- *              3/17/10
- *
- *-------------------------------------------------------------------------
- */
-#ifdef H5_HAVE_PARALLEL
-herr_t
-H5C_construct_candidate_list__min_clean(H5C_t * cache_ptr)
-{
-    size_t              space_needed = 0;
-    herr_t              ret_value = SUCCEED;      /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    HDassert( cache_ptr != NULL );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    /* compute the number of bytes (if any) that must be flushed to get the 
-     * cache back within its min clean constraints.
-     */
-    if(cache_ptr->max_cache_size > cache_ptr->index_size) {
-        if(((cache_ptr->max_cache_size - cache_ptr->index_size) +
-               cache_ptr->cLRU_list_size) >= cache_ptr->min_clean_size)
-            space_needed = 0;
-        else
-            space_needed = cache_ptr->min_clean_size -
-                ((cache_ptr->max_cache_size - cache_ptr->index_size) +
-                 cache_ptr->cLRU_list_size);
-    } /* end if */
-    else {
-        if(cache_ptr->min_clean_size <= cache_ptr->cLRU_list_size)
-           space_needed = 0;
-        else
-            space_needed = cache_ptr->min_clean_size -
-                           cache_ptr->cLRU_list_size;
-    } /* end else */
-
-    if(space_needed > 0) { /* we have work to do */
-        H5C_cache_entry_t *entry_ptr;
-        int    nominated_entries_count = 0;
-        size_t nominated_entries_size = 0;
-
-        HDassert( cache_ptr->slist_len > 0 );
-
-        /* Scan the dirty LRU list from tail forward and nominate sufficient
-         * entries to free up the necessary space. 
-         */
-        entry_ptr = cache_ptr->dLRU_tail_ptr;
-        while((nominated_entries_size < space_needed) &&
-                (nominated_entries_count < cache_ptr->slist_len) &&
-                (entry_ptr != NULL)) {
-            haddr_t		nominated_addr;
-
-            HDassert( ! (entry_ptr->is_protected) );
-            HDassert( ! (entry_ptr->is_read_only) );
-            HDassert( entry_ptr->ro_ref_count == 0 );
-            HDassert( entry_ptr->is_dirty );
-            HDassert( entry_ptr->in_slist );
-
-            nominated_addr = entry_ptr->addr;
-            if(H5AC_add_candidate((H5AC_t *)cache_ptr, nominated_addr) < 0)
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_add_candidate() failed.")
-
-            nominated_entries_size += entry_ptr->size;
-            nominated_entries_count++;
-            entry_ptr = entry_ptr->aux_prev;
-        } /* end while */
-        HDassert( nominated_entries_count <= cache_ptr->slist_len );
-        HDassert( nominated_entries_size >= space_needed );
-    } /* end if */
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C_construct_candidate_list__min_clean() */
-#endif /* H5_HAVE_PARALLEL */
-
-

-/*-------------------------------------------------------------------------
- * Function:    H5C_create
- *
- * Purpose:     Allocate, initialize, and return the address of a new
- *		instance of H5C_t.
- *
- *		In general, the max_cache_size parameter must be positive,
- *		and the min_clean_size parameter must lie in the closed
- *		interval [0, max_cache_size].
- *
- *		The check_write_permitted parameter must either be NULL,
- *		or point to a function of type H5C_write_permitted_func_t.
- *		If it is NULL, the cache will use the write_permitted
- *		flag to determine whether writes are permitted.
- *
- * Return:      Success:        Pointer to the new instance.
- *
- *              Failure:        NULL
- *
- * Programmer:  John Mainzer
- *              6/2/04
- *
- *-------------------------------------------------------------------------
- */
-H5C_t *
-H5C_create(size_t		      max_cache_size,
-           size_t		      min_clean_size,
-           int			      max_type_id,
-           const char *		      (* type_name_table_ptr),
-           H5C_write_permitted_func_t check_write_permitted,
-           hbool_t		      write_permitted,
-           H5C_log_flush_func_t       log_flush,
-           void *                     aux_ptr)
-{
-    int i;
-    H5C_t * cache_ptr = NULL;
-    H5C_t * ret_value = NULL;      /* Return value */
-
-    FUNC_ENTER_NOAPI(NULL)
-
-    HDassert( max_cache_size >= H5C__MIN_MAX_CACHE_SIZE );
-    HDassert( max_cache_size <= H5C__MAX_MAX_CACHE_SIZE );
-    HDassert( min_clean_size <= max_cache_size );
-
-    HDassert( max_type_id >= 0 );
-    HDassert( max_type_id < H5C__MAX_NUM_TYPE_IDS );
-    HDassert( type_name_table_ptr );
-
-    HDassert( ( write_permitted == TRUE ) || ( write_permitted == FALSE ) );
-
-    for ( i = 0; i <= max_type_id; i++ ) {
-
-        HDassert( (type_name_table_ptr)[i] );
-        HDassert( HDstrlen(( type_name_table_ptr)[i]) > 0 );
-    }
-
-    if ( NULL == (cache_ptr = H5FL_CALLOC(H5C_t)) ) {
-
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, \
-                    "memory allocation failed")
-    }
-
-    if ( (cache_ptr->slist_ptr = H5SL_create(H5SL_TYPE_HADDR, NULL)) == NULL ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, NULL, "can't create skip list.")
-    }
-
-    /* If we get this far, we should succeed.  Go ahead and initialize all
-     * the fields.
-     */
-
-    cache_ptr->magic 				= H5C__H5C_T_MAGIC;
-
-    cache_ptr->flush_in_progress		= FALSE;
-
-    cache_ptr->trace_file_ptr			= NULL;
-
-    cache_ptr->aux_ptr				= aux_ptr;
-
-    cache_ptr->max_type_id			= max_type_id;
-
-    cache_ptr->type_name_table_ptr		= type_name_table_ptr;
-
-    cache_ptr->max_cache_size			= max_cache_size;
-    cache_ptr->min_clean_size			= min_clean_size;
-
-    cache_ptr->check_write_permitted		= check_write_permitted;
-    cache_ptr->write_permitted			= write_permitted;
-
-    cache_ptr->log_flush			= log_flush;
-
-    cache_ptr->evictions_enabled		= TRUE;
-
-    cache_ptr->index_len			= 0;
-    cache_ptr->index_size			= (size_t)0;
-    cache_ptr->clean_index_size			= (size_t)0;
-    cache_ptr->dirty_index_size			= (size_t)0;
-
-    cache_ptr->slist_len			= 0;
-    cache_ptr->slist_size			= (size_t)0;
-
-#if H5C_DO_SANITY_CHECKS
-    cache_ptr->slist_len_increase		= 0;
-    cache_ptr->slist_size_increase		= 0;
-#endif /* H5C_DO_SANITY_CHECKS */
-
-    for ( i = 0; i < H5C__HASH_TABLE_LEN; i++ )
-    {
-        (cache_ptr->index)[i] = NULL;
-    }
-
-    cache_ptr->pl_len				= 0;
-    cache_ptr->pl_size				= (size_t)0;
-    cache_ptr->pl_head_ptr			= NULL;
-    cache_ptr->pl_tail_ptr			= NULL;
-
-    cache_ptr->pel_len				= 0;
-    cache_ptr->pel_size				= (size_t)0;
-    cache_ptr->pel_head_ptr			= NULL;
-    cache_ptr->pel_tail_ptr			= NULL;
+    cache_ptr->pel_len				= 0;
+    cache_ptr->pel_size				= (size_t)0;
+    cache_ptr->pel_head_ptr			= NULL;
+    cache_ptr->pel_tail_ptr			= NULL;
 
     cache_ptr->LRU_list_len			= 0;
     cache_ptr->LRU_list_size			= (size_t)0;
@@ -1109,35 +657,16 @@ H5C_create(size_t		      max_cache_size,
     cache_ptr->epoch_marker_ringbuf_last	= 0;
     cache_ptr->epoch_marker_ringbuf_size	= 0;
 
+    /* Initialize all epoch marker entries' fields to zero/FALSE/NULL */
+    HDmemset(cache_ptr->epoch_markers, 0, sizeof(cache_ptr->epoch_markers));
+
+    /* Set non-zero/FALSE/NULL fields for epoch markers */
     for ( i = 0; i < H5C__MAX_EPOCH_MARKERS; i++ )
     {
-        (cache_ptr->epoch_marker_active)[i]		 = FALSE;
-#ifndef NDEBUG
         ((cache_ptr->epoch_markers)[i]).magic		 =
 					       H5C__H5C_CACHE_ENTRY_T_MAGIC;
-#endif /* NDEBUG */
         ((cache_ptr->epoch_markers)[i]).addr		 = (haddr_t)i;
-        ((cache_ptr->epoch_markers)[i]).size		 = (size_t)0;
         ((cache_ptr->epoch_markers)[i]).type		 = &epoch_marker_class;
-        ((cache_ptr->epoch_markers)[i]).is_dirty	 = FALSE;
-        ((cache_ptr->epoch_markers)[i]).dirtied		 = FALSE;
-        ((cache_ptr->epoch_markers)[i]).is_protected	 = FALSE;
-	((cache_ptr->epoch_markers)[i]).is_read_only	 = FALSE;
-	((cache_ptr->epoch_markers)[i]).ro_ref_count	 = 0;
-        ((cache_ptr->epoch_markers)[i]).is_pinned	 = FALSE;
-        ((cache_ptr->epoch_markers)[i]).in_slist	 = FALSE;
-        ((cache_ptr->epoch_markers)[i]).ht_next		 = NULL;
-        ((cache_ptr->epoch_markers)[i]).ht_prev		 = NULL;
-        ((cache_ptr->epoch_markers)[i]).next		 = NULL;
-        ((cache_ptr->epoch_markers)[i]).prev		 = NULL;
-        ((cache_ptr->epoch_markers)[i]).aux_next	 = NULL;
-        ((cache_ptr->epoch_markers)[i]).aux_prev	 = NULL;
-#if H5C_COLLECT_CACHE_ENTRY_STATS
-        ((cache_ptr->epoch_markers)[i]).accesses	 = 0;
-        ((cache_ptr->epoch_markers)[i]).clears		 = 0;
-        ((cache_ptr->epoch_markers)[i]).flushes		 = 0;
-        ((cache_ptr->epoch_markers)[i]).pins		 = 0;
-#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
     }
 
     if ( H5C_reset_cache_hit_rate_stats(cache_ptr) != SUCCEED ) {
@@ -1151,6 +680,10 @@ H5C_create(size_t		      max_cache_size,
 
     cache_ptr->prefix[0]			= '\0';  /* empty string */
 
+#ifndef NDEBUG
+    cache_ptr->get_entry_ptr_from_addr_counter	= 0;  
+#endif /* NDEBUG */
+
     /* Set return value */
     ret_value = cache_ptr;
 
@@ -1163,6 +696,9 @@ done:
             if ( cache_ptr->slist_ptr != NULL )
                 H5SL_close(cache_ptr->slist_ptr);
 
+            if ( cache_ptr->cork_list_ptr != NULL )
+                H5SL_close(cache_ptr->cork_list_ptr);
+
             cache_ptr->magic = 0;
             cache_ptr = H5FL_FREE(H5C_t, cache_ptr);
 
@@ -1362,6 +898,35 @@ H5C_def_auto_resize_rpt_fcn(H5C_t * cache_ptr,
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5C_free_cork_list_cb
+ *
+ * Purpose:     Callback function to free the list of object addresses 
+ *		on the skip list.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi; January 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C_free_cork_list_cb(void *_item, void H5_ATTR_UNUSED *key, void H5_ATTR_UNUSED *op_data)
+{
+    haddr_t *addr = (haddr_t *)_item;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(addr);
+
+    /* Release the item */
+    addr = H5FL_FREE(haddr_t, addr);
+
+    FUNC_LEAVE_NOAPI(0)
+}  /* H5C_free_cork_list_cb() */
+
+
+

+/*-------------------------------------------------------------------------
  * Function:    H5C_dest
  *
  * Purpose:     Flush all data to disk and destroy the cache.
@@ -1386,9 +951,7 @@ H5C_def_auto_resize_rpt_fcn(H5C_t * cache_ptr,
  *-------------------------------------------------------------------------
  */
 herr_t
-H5C_dest(H5F_t * f,
-         hid_t	 primary_dxpl_id,
-         hid_t	 secondary_dxpl_id)
+H5C_dest(H5F_t * f, hid_t dxpl_id)
 {
     H5C_t * cache_ptr = f->shared->cache;
     herr_t ret_value = SUCCEED;      /* Return value */
@@ -1400,8 +963,7 @@ H5C_dest(H5F_t * f,
     HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
 
     /* Flush and invalidate all cache entries */
-    if(H5C_flush_invalidate_cache(f, primary_dxpl_id, secondary_dxpl_id,
-                H5C__NO_FLAGS_SET) < 0 )
+    if(H5C_flush_invalidate_cache(f, dxpl_id, H5C__NO_FLAGS_SET) < 0 )
         HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush cache")
 
     if(cache_ptr->slist_ptr != NULL) {
@@ -1409,7 +971,31 @@ H5C_dest(H5F_t * f,
         cache_ptr->slist_ptr = NULL;
     } /* end if */
 
+    if(cache_ptr->cork_list_ptr != NULL) {
+        H5SL_destroy(cache_ptr->cork_list_ptr, H5C_free_cork_list_cb, NULL);
+        cache_ptr->cork_list_ptr = NULL;
+    } /* end if */
+
+    /* Only display count of number of calls to H5C_get_entry_ptr_from_add()
+     * if NDEBUG is undefined, and H5C_DO_SANITY_CHECKS is defined.  Need 
+     * this as the print statement will upset windows, and we frequently
+     * run debug builds there.
+     *
+     * Note that the count is still kept whenever NDEBUG is undefined, and
+     * is reasonably accessible via debugger.
+     */
+#ifndef NDEBUG 
+#if H5C_DO_SANITY_CHECKS
+    if ( cache_ptr->get_entry_ptr_from_addr_counter > 0 )
+        HDfprintf(stdout, 
+		  "*** %ld calls to H5C_get_entry_ptr_from_add(). ***\n",
+		  cache_ptr->get_entry_ptr_from_addr_counter);
+#endif /* H5C_DO_SANITY_CHECKS */
+#endif /* NDEBUG */
+
+#ifndef NDEBUG
     cache_ptr->magic = 0;
+#endif /* NDEBUG */
 
     cache_ptr = H5FL_FREE(H5C_t, cache_ptr);
 
@@ -1419,113 +1005,135 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5C_evict
  *
- * Function:    H5C_expunge_entry
- *
- * Purpose:     Use this function to tell the cache to expunge an entry
- * 		from the cache without writing it to disk even if it is
- * 		dirty.  The entry may not be either pinned or protected.
+ * Purpose:     Evict all except pinned entries in the cache
  *
  * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  John Mainzer
- *              6/29/06
+ * Programmer:  Vailin Choi; Dec 2013
  *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5C_expunge_entry(H5F_t *             f,
-                  hid_t               primary_dxpl_id,
-                  hid_t               secondary_dxpl_id,
-                  const H5C_class_t * type,
-                  haddr_t 	      addr,
-                  unsigned 	      flags)
+H5C_evict(H5F_t * f, hid_t dxpl_id)
 {
-    H5C_t *		cache_ptr;
-    herr_t		result;
-    hbool_t		first_flush = TRUE;
-    H5C_cache_entry_t *	entry_ptr = NULL;
-    herr_t		ret_value = SUCCEED;      /* Return value */
+    H5C_t *cache_ptr = f->shared->cache;
+    herr_t ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    HDassert( f );
-    HDassert( f->shared );
+    /* Sanity check */
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
 
-    cache_ptr = f->shared->cache;
+    /* Flush and invalidate all cache entries except the pinned entries */
+    if(H5C_flush_invalidate_cache(f, dxpl_id, H5C__EVICT_ALLOW_LAST_PINS_FLAG) < 0 )
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to evict entries in the cache")
 
-    HDassert( cache_ptr );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-    HDassert( type );
-    HDassert( type->clear );
-    HDassert( type->dest );
-    HDassert( H5F_addr_defined(addr) );
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_evict() */
 
-#if H5C_DO_EXTREME_SANITY_CHECKS
-        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_expunge_entry
+ *
+ * Purpose:     Use this function to tell the cache to expunge an entry
+ * 		from the cache without writing it to disk even if it is
+ * 		dirty.  The entry may not be either pinned or protected.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              6/29/06
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_expunge_entry(H5F_t *f, hid_t dxpl_id, const H5C_class_t *type,
+    haddr_t addr, unsigned flags)
+{
+    H5C_t *		cache_ptr;
+    H5C_cache_entry_t *	entry_ptr = NULL;
+    unsigned            flush_flags = (H5C__FLUSH_INVALIDATE_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG);
+#if H5C_DO_SANITY_CHECKS
+    hbool_t entry_was_dirty;
+    hsize_t entry_size;
+#endif /* H5C_DO_SANITY_CHECKS */
+    herr_t		ret_value = SUCCEED;      /* Return value */
 
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "LRU sanity check failed.\n");
-        }
-#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+    FUNC_ENTER_NOAPI(FAIL)
 
-    H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
+    HDassert(f);
+    HDassert(f->shared);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(type);
+    HDassert(H5F_addr_defined(addr));
 
-    if ( ( entry_ptr == NULL ) || ( entry_ptr->type != type ) ) {
+#if H5C_DO_EXTREME_SANITY_CHECKS
+    if(H5C_validate_lru_list(cache_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "LRU extreme sanity check failed on entry.\n");
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
+    /* Look for entry in cache */
+    H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
+    if((entry_ptr == NULL) || (entry_ptr->type != type))
         /* the target doesn't exist in the cache, so we are done. */
         HGOTO_DONE(SUCCEED)
-    }
-
-    HDassert( entry_ptr->addr == addr );
-    HDassert( entry_ptr->type == type );
-
-    if ( entry_ptr->is_protected ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, \
-		    "Target entry is protected.")
-    }
-
-    if ( entry_ptr->is_pinned ) {
 
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, \
-		    "Target entry is pinned.")
-    }
+    HDassert(entry_ptr->addr == addr);
+    HDassert(entry_ptr->type == type);
 
-    /* Pass along 'free file space' flag to cache client */
-    entry_ptr->free_file_space_on_destroy = ( (flags & H5C__FREE_FILE_SPACE_FLAG) != 0 );
+    /* Check for entry being pinned or protected */
+    if(entry_ptr->is_protected)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, "Target entry is protected.")
+    if(entry_ptr->is_pinned)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, "Target entry is pinned.")
 
-    /* If we get this far, call H5C_flush_single_entry() with the
+    /* If we get this far, call H5C__flush_single_entry() with the
      * H5C__FLUSH_INVALIDATE_FLAG and the H5C__FLUSH_CLEAR_ONLY_FLAG.
      * This will clear the entry, and then delete it from the cache.
      */
-    result = H5C_flush_single_entry(f,
-                                    primary_dxpl_id,
-                                    secondary_dxpl_id,
-                                    entry_ptr->type,
-                                    entry_ptr->addr,
-                                    H5C__FLUSH_INVALIDATE_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,
-                                    &first_flush,
-                                    TRUE);
 
-    if ( result < 0 ) {
+    /* Pass along 'free file space' flag to  cache client.  */
+    flush_flags |= (flags & H5C__FREE_FILE_SPACE_FLAG);
+
+#if H5C_DO_SANITY_CHECKS
+    entry_was_dirty = entry_ptr->is_dirty;
+    entry_size      = entry_ptr->size;
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+    
+    /* Delete the entry from the skip list on destroy */
+    flush_flags |= H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG;
+
+    if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, flush_flags, NULL) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, "can't flush entry")
 
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, \
-                    "H5C_flush_single_entry() failed.")
+#if H5C_DO_SANITY_CHECKS
+    if ( entry_was_dirty )
+    {
+        /* we have just removed an entry from the skip list.  Thus 
+         * we must touch up cache_ptr->slist_len_increase and
+         * cache_ptr->slist_size_increase to keep from skewing
+         * the sanity checks on flushes.
+         */
+        cache_ptr->slist_len_increase -= 1;
+        cache_ptr->slist_size_increase -= (int64_t)(entry_size);
     }
+#endif /* H5C_DO_SANITY_CHECKS */
 
 done:
-
 #if H5C_DO_EXTREME_SANITY_CHECKS
-        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "LRU sanity check failed.\n");
-        }
+    if(H5C_validate_lru_list(cache_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "LRU extreme sanity check failed on exit.\n");
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
     FUNC_LEAVE_NOAPI(ret_value)
-
 } /* H5C_expunge_entry() */
 
 

@@ -1540,357 +1148,125 @@ done:
  *		all unprotected entries should be flushed before the
  *		function returns failure.
  *
- *		The primary_dxpl_id and secondary_dxpl_id parameters
- *		specify the dxpl_ids used on the first write occasioned
- *		by the flush (primary_dxpl_id), and on all subsequent
- *		writes (secondary_dxpl_id).  This is useful in the metadata
- *		cache, but may not be needed elsewhere.  If so, just use the
- *		same dxpl_id for both parameters.
- *
  * Return:      Non-negative on success/Negative on failure or if there was
  *		a request to flush all items and something was protected.
  *
  * Programmer:  John Mainzer
  *		6/2/04
  *
+ * Changes:	Modified function to test for slist chamges in 
+ *		pre_serialize and serialize callbacks, and re-start
+ *		scans through the slist when such changes occur.
+ *
+ *		This has been a potential problem for some time,
+ *		and there has been code in this function to deal 
+ *		with elements of this issue.  However the shift 
+ *		to the V3 cache in combination with the activities
+ *		of some of the cache clients (in particular the 
+ *		free space manager and the fractal heap) have
+ *		made this re-work necessary.
+ *
+ *						JRM -- 12/13/14
+ *
+ *		Modified function to support rings.  Basic idea is that 
+ *		every entry in the cache is assigned to a ring.  Entries
+ *		in the outermost ring are flushed first, followed by 
+ *		those in the next outermost ring, and so on until the 
+ *		innermost ring is flushed.  See header comment on 
+ *		H5C_ring_t in H5Cprivate.h for a more detailed 
+ *		discussion.
+ *
+ *						JRM -- 8/30/15
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5C_flush_cache(H5F_t *f, hid_t primary_dxpl_id, hid_t secondary_dxpl_id, unsigned flags)
+H5C_flush_cache(H5F_t *f, hid_t dxpl_id, unsigned flags)
 {
-    H5C_t * cache_ptr = f->shared->cache;
-    herr_t              status;
-    herr_t		ret_value = SUCCEED;
-    hbool_t             destroy;
-    hbool_t		flushed_entries_last_pass;
-    hbool_t		flush_marked_entries;
-    hbool_t		first_flush = TRUE;
-    hbool_t		ignore_protected;
-    hbool_t		tried_to_flush_protected_entry = FALSE;
-    int32_t		passes = 0;
-    int32_t		protected_entries = 0;
-    H5SL_node_t * 	node_ptr = NULL;
-    H5C_cache_entry_t *	entry_ptr = NULL;
-    H5C_cache_entry_t *	next_entry_ptr = NULL;
 #if H5C_DO_SANITY_CHECKS
-    int64_t		flushed_entries_count;
-    size_t		flushed_entries_size;
-    int64_t		initial_slist_len;
-    size_t              initial_slist_size;
+    int			i;
+    int32_t		index_len = 0;
+    size_t		index_size = (size_t)0;
+    size_t		clean_index_size = (size_t)0;
+    size_t		dirty_index_size = (size_t)0;
+    size_t		slist_size = (size_t)0;
+    int32_t		slist_len = 0;
 #endif /* H5C_DO_SANITY_CHECKS */
+    H5C_ring_t		ring;
+    H5C_t             * cache_ptr;
+    hbool_t             destroy;
+    hbool_t		ignore_protected;
+    herr_t		ret_value = SUCCEED;
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    HDassert( cache_ptr );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-    HDassert( cache_ptr->slist_ptr );
+    HDassert(f);
+    HDassert(f->shared);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_ptr->slist_ptr);
 
-    ignore_protected = ( (flags & H5C__FLUSH_IGNORE_PROTECTED_FLAG) != 0 );
+#if H5C_DO_SANITY_CHECKS
+    HDassert(cache_ptr->index_ring_len[H5C_RING_UNDEFINED] == 0);
+    HDassert(cache_ptr->index_ring_size[H5C_RING_UNDEFINED] == (size_t)0);
+    HDassert(cache_ptr->clean_index_ring_size[H5C_RING_UNDEFINED] == (size_t)0);
+    HDassert(cache_ptr->dirty_index_ring_size[H5C_RING_UNDEFINED] == (size_t)0);
+    HDassert(cache_ptr->slist_ring_len[H5C_RING_UNDEFINED] == 0);
+    HDassert(cache_ptr->slist_ring_size[H5C_RING_UNDEFINED] == (size_t)0);
+
+    for(i = H5C_RING_USER; i < H5C_RING_NTYPES; i++) {
+        index_len += cache_ptr->index_ring_len[i];
+        index_size += cache_ptr->index_ring_size[i];
+        clean_index_size += cache_ptr->clean_index_ring_size[i];
+        dirty_index_size += cache_ptr->dirty_index_ring_size[i];
+
+	slist_len += cache_ptr->slist_ring_len[i];
+        slist_size += cache_ptr->slist_ring_size[i];
+    } /* end for */
 
-    destroy = ( (flags & H5C__FLUSH_INVALIDATE_FLAG) != 0 );
+    HDassert(cache_ptr->index_len == index_len);
+    HDassert(cache_ptr->index_size == index_size);
+    HDassert(cache_ptr->clean_index_size == clean_index_size);
+    HDassert(cache_ptr->dirty_index_size == dirty_index_size);
+    HDassert(cache_ptr->slist_len == slist_len);
+    HDassert(cache_ptr->slist_size == slist_size);
+#endif /* H5C_DO_SANITY_CHECKS */
 
-    /* note that flush_marked_entries is set to FALSE if destroy is TRUE */
-    flush_marked_entries = ( ( (flags & H5C__FLUSH_MARKED_ENTRIES_FLAG) != 0 )
-                             &&
-                             ( ! destroy )
-                           );
+#if H5C_DO_EXTREME_SANITY_CHECKS
+    if((H5C_validate_protected_entry_list(cache_ptr) < 0) ||
+            (H5C_validate_pinned_entry_list(cache_ptr) < 0) ||
+            (H5C_validate_lru_list(cache_ptr) < 0))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "an extreme sanity check failed on entry.\n");
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
+    ignore_protected = ( (flags & H5C__FLUSH_IGNORE_PROTECTED_FLAG) != 0 );
+    destroy = ( (flags & H5C__FLUSH_INVALIDATE_FLAG) != 0 );
     HDassert( ! ( destroy && ignore_protected ) );
-
     HDassert( ! ( cache_ptr->flush_in_progress ) );
 
     cache_ptr->flush_in_progress = TRUE;
 
-    if ( destroy ) {
-
-        status = H5C_flush_invalidate_cache(f,
-			                    primary_dxpl_id,
-					    secondary_dxpl_id,
-					    flags);
-
-        if ( status < 0 ) {
-
-            /* This shouldn't happen -- if it does, we are toast so
-             * just scream and die.
-             */
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
-			"flush invalidate failed.")
-        }
-    } else {
-	/* When we are only flushing marked entries, the slist will usually
-	 * still contain entries when we have flushed everything we should.
-	 * Thus we track whether we have flushed any entries in the last
-	 * pass, and terminate if we haven't.
-	 */
-
-	flushed_entries_last_pass = TRUE;
-
-        while ( ( passes < H5C__MAX_PASSES_ON_FLUSH ) &&
-		( cache_ptr->slist_len != 0 ) &&
-		( protected_entries == 0 ) &&
-		( flushed_entries_last_pass ) )
-	{
-	    flushed_entries_last_pass = FALSE;
-            node_ptr = H5SL_first(cache_ptr->slist_ptr);
-
-            if ( node_ptr != NULL ) {
-
-                next_entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
-
-                if ( next_entry_ptr == NULL ) {
-
-                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-		                "next_entry_ptr == NULL 1 ?!?!");
-                }
-#ifndef NDEBUG
-		HDassert( next_entry_ptr->magic ==
-                          H5C__H5C_CACHE_ENTRY_T_MAGIC );
-#endif /* NDEBUG */
-	        HDassert( next_entry_ptr->is_dirty );
-                HDassert( next_entry_ptr->in_slist );
-
-            } else {
-
-                next_entry_ptr = NULL;
-
-            }
-
-	    HDassert( node_ptr != NULL );
-
-#if H5C_DO_SANITY_CHECKS
-	    /* For sanity checking, try to verify that the skip list has
-	     * the expected size and number of entries at the end of each
-	     * internal while loop (see below).
-	     *
-	     * Doing this get a bit tricky, as depending on flags, we may
-	     * or may not flush all the entries in the slist.
-	     *
-	     * To make things more entertaining, with the advent of the
-	     * fractal heap, the entry flush callback can cause entries
-	     * to be dirtied, resized, and/or moved.
-	     *
-	     * To deal with this, we first make note of the initial
-	     * skip list length and size:
-	     */
-            initial_slist_len = cache_ptr->slist_len;
-            initial_slist_size = cache_ptr->slist_size;
-
-	    /* We then zero counters that we use to track the number
-	     * and total size of entries flushed:
-	     */
-            flushed_entries_count = 0;
-            flushed_entries_size = 0;
-
-	    /* As mentioned above, there is the possibility that
-	     * entries will be dirtied, resized, and/or flushed during
-	     * our pass through the skip list.  To capture the number
-	     * of entries added, and the skip list size delta,
-	     * zero the slist_len_increase and slist_size_increase of
-	     * the cache's instance of H5C_t.  These fields will be
-	     * updated elsewhere to account for slist insertions and/or
-	     * dirty entry size changes.
-	     */
-	    cache_ptr->slist_len_increase = 0;
-	    cache_ptr->slist_size_increase = 0;
-
-	    /* at the end of the loop, use these values to compute the
-	     * expected slist length and size and compare this with the
-	     * value recorded in the cache's instance of H5C_t.
-	     */
-#endif /* H5C_DO_SANITY_CHECKS */
-
-	    while ( node_ptr != NULL )
-	    {
-                entry_ptr = next_entry_ptr;
-
-                /* With the advent of the fractal heap, it is possible
-		 * that the flush callback will dirty and/or resize
-		 * other entries in the cache.  In particular, while
-		 * Quincey has promised me that this will never happen,
-		 * it is possible that the flush callback for an
-		 * entry may protect an entry that is not in the cache,
-		 * perhaps causing the cache to flush and possibly
-		 * evict the entry associated with node_ptr to make
-		 * space for the new entry.
-		 *
-		 * Thus we do a bit of extra sanity checking on entry_ptr,
-		 * and break out of this scan of the skip list if we
-		 * detect minor problems.  We have a bit of leaway on the
-		 * number of passes though the skip list, so this shouldn't
-		 * be an issue in the flush in and of itself, as it should
-		 * be all but impossible for this to happen more than once
-		 * in any flush.
-		 *
-		 * Observe that that breaking out of the scan early
-		 * shouldn't break the sanity checks just after the end
-		 * of this while loop.
-		 *
-		 * If an entry has merely been marked clean and removed from
-		 * the s-list, we simply break out of the scan.
-		 *
-		 * If the entry has been evicted, we flag an error and
-		 * exit.
-		 */
-#ifndef NDEBUG
-		if ( entry_ptr->magic != H5C__H5C_CACHE_ENTRY_T_MAGIC ) {
-
-                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                                "entry_ptr->magic invalid ?!?!");
-
-	        } else
-#endif /* NDEBUG */
-		if ( ( ! entry_ptr->is_dirty ) ||
-                     ( ! entry_ptr->in_slist ) ) {
-
-                    /* the s-list has been modified out from under us.
-                     * set node_ptr to NULL and break out of the loop.
-                     */
-                    node_ptr = NULL;
-                    break;
-                }
-
-                /* increment node pointer now, before we delete its target
-                 * from the slist.
-                 */
-                node_ptr = H5SL_next(node_ptr);
-
-                if ( node_ptr != NULL ) {
-                    next_entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
-
-                    if ( next_entry_ptr == NULL ) {
-                        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                                    "next_entry_ptr == NULL 2 ?!?!");
-		    }
-#ifndef NDEBUG
-		    HDassert( next_entry_ptr->magic ==
-                              H5C__H5C_CACHE_ENTRY_T_MAGIC );
-#endif /* NDEBUG */
-                    HDassert( next_entry_ptr->is_dirty );
-                    HDassert( next_entry_ptr->in_slist );
-                } else {
-                    next_entry_ptr = NULL;
-                }
-
-                HDassert( entry_ptr != NULL );
-                HDassert( entry_ptr->in_slist );
-
-                if ( ( ! flush_marked_entries ) ||
-                     ( entry_ptr->flush_marker ) ) {
-
-                    if ( entry_ptr->is_protected ) {
-
-                        /* we probably have major problems -- but lets flush
-                         * everything we can before we decide whether to flag
-                         * an error.
-                         */
-                        tried_to_flush_protected_entry = TRUE;
-	                protected_entries++;
-
-                    } else if ( entry_ptr->is_pinned ) {
-			/* Test to see if we are can flush the entry now.
-			 * If we can, go ahead and flush.  Note that we
-			 * aren't trying to do a destroy here, so that
-			 * is not an issue.
-			 */
-                        if ( TRUE ) { /* When we get to multithreaded cache,
-                                       * we will need either locking code,
-                                       * and/or a test to see if the entry
-                                       * is in flushable condition here.
-                                       */
-#if H5C_DO_SANITY_CHECKS
-                            flushed_entries_count++;
-                            flushed_entries_size += entry_ptr->size;
-#endif /* H5C_DO_SANITY_CHECKS */
-                            status = H5C_flush_single_entry(f,
-                                                            primary_dxpl_id,
-                                                            secondary_dxpl_id,
-                                                            NULL,
-                                                            entry_ptr->addr,
-                                                            flags,
-                                                            &first_flush,
-                                                            FALSE);
-                            if ( status < 0 ) {
-
-                                /* This shouldn't happen -- if it does, we are
-			         * toast so just scream and die.
-                                 */
-                                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
-                                            "dirty pinned entry flush failed.")
-                            }
-			    flushed_entries_last_pass = TRUE;
-			}
-                    } else {
-#if H5C_DO_SANITY_CHECKS
-                        flushed_entries_count++;
-			flushed_entries_size += entry_ptr->size;
-#endif /* H5C_DO_SANITY_CHECKS */
-                        status = H5C_flush_single_entry(f,
-                                                        primary_dxpl_id,
-                                                        secondary_dxpl_id,
-                                                        NULL,
-                                                        entry_ptr->addr,
-                                                        flags,
-                                                        &first_flush,
-                                                        FALSE);
-                        if ( status < 0 ) {
-
-                            /* This shouldn't happen -- if it does, we are
-			     * toast so just scream and die.
-                             */
-                            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
-                                        "Can't flush entry.")
-                        }
-			flushed_entries_last_pass = TRUE;
-                    }
-                }
-            } /* while ( node_ptr != NULL ) */
-
-#if H5C_DO_SANITY_CHECKS
-            /* Verify that the slist size and length are as expected. */
-
-	    HDassert( (initial_slist_len + cache_ptr->slist_len_increase -
-                       flushed_entries_count) == cache_ptr->slist_len );
-	    HDassert( (initial_slist_size + cache_ptr->slist_size_increase -
-		       flushed_entries_size) == cache_ptr->slist_size );
-#endif /* H5C_DO_SANITY_CHECKS */
-
-	    passes++;
-
-	} /* while */
-
-        HDassert( protected_entries <= cache_ptr->pl_len );
-
-        if ( ( ( cache_ptr->pl_len > 0 ) && ( !ignore_protected ) )
-             ||
-             ( tried_to_flush_protected_entry ) ) {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
-		        "cache has protected items")
-        }
-
-	if ( ( cache_ptr->slist_len != 0 ) &&
-	     ( passes >= H5C__MAX_PASSES_ON_FLUSH ) ) {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
-		        "flush pass limit exceeded.")
-	}
-
-#if H5C_DO_SANITY_CHECKS
-        if ( ! flush_marked_entries ) {
-
-            HDassert( cache_ptr->slist_len == 0 );
-            HDassert( cache_ptr->slist_size == 0 );
-        }
-#endif /* H5C_DO_SANITY_CHECKS */
-
-    }
+    if(destroy) {
+        if(H5C_flush_invalidate_cache(f, dxpl_id, flags) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "flush invalidate failed.")
+    } /* end if */
+    else {
+	/* flush each ring, starting from the outermost ring and 
+         * working inward.
+         */
+        ring = H5C_RING_USER;
+	while(ring < H5C_RING_NTYPES) {
+	    if(H5C_flush_ring(f, dxpl_id, ring, flags) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "flush ring failed.")
+            ring++;
+        } /* end while */
+    } /* end else */
 
 done:
-
     cache_ptr->flush_in_progress = FALSE;
 
     FUNC_LEAVE_NOAPI(ret_value)
-
 } /* H5C_flush_cache() */
 
 

@@ -1920,12 +1296,10 @@ done:
  */
 herr_t
 H5C_flush_to_min_clean(H5F_t * f,
-                       hid_t   primary_dxpl_id,
-                       hid_t   secondary_dxpl_id)
+		       hid_t    dxpl_id)
 {
-    H5C_t *            cache_ptr;
+    H5C_t *             cache_ptr;
     herr_t      	result;
-    hbool_t		first_flush = TRUE;
     hbool_t		write_permitted;
 #if 0 /* modified code -- commented out for now */
     int			i;
@@ -1949,9 +1323,7 @@ H5C_flush_to_min_clean(H5F_t * f,
 
     if ( cache_ptr->check_write_permitted != NULL ) {
 
-        result = (cache_ptr->check_write_permitted)(f,
-                                                    primary_dxpl_id,
-                                                    &write_permitted);
+        result = (cache_ptr->check_write_permitted)(f, &write_permitted);
 
         if ( result < 0 ) {
 
@@ -1970,11 +1342,9 @@ H5C_flush_to_min_clean(H5F_t * f,
     }
 #if 1 /* original code */
     result = H5C_make_space_in_cache(f,
-                                     primary_dxpl_id,
-                                     secondary_dxpl_id,
+                                     dxpl_id,
                                      (size_t)0,
-                                     write_permitted,
-                                     &first_flush);
+                                     write_permitted);
 
     if ( result < 0 ) {
 
@@ -2208,41 +1578,28 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5C_get_cache_hit_rate(H5C_t * cache_ptr,
-                       double * hit_rate_ptr)
-
+H5C_get_cache_hit_rate(H5C_t * cache_ptr, double * hit_rate_ptr)
 {
     herr_t ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) {
-
+    if((cache_ptr == NULL) || (cache_ptr->magic != H5C__H5C_T_MAGIC))
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
-    }
-
-    if ( hit_rate_ptr == NULL ) {
-
+    if(hit_rate_ptr == NULL)
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad hit_rate_ptr on entry.")
-    }
-
-    HDassert( cache_ptr->cache_hits >= 0 );
-    HDassert( cache_ptr->cache_accesses >= cache_ptr->cache_hits );
 
-    if ( cache_ptr->cache_accesses > 0 ) {
+    HDassert(cache_ptr->cache_hits >= 0);
+    HDassert(cache_ptr->cache_accesses >= cache_ptr->cache_hits);
 
+    if(cache_ptr->cache_accesses > 0)
         *hit_rate_ptr = ((double)(cache_ptr->cache_hits)) /
                          ((double)(cache_ptr->cache_accesses));
-
-    } else {
-
+    else
         *hit_rate_ptr = 0.0f;
-    }
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
-
 } /* H5C_get_cache_hit_rate() */
 
 

@@ -2275,7 +1632,10 @@ H5C_get_entry_status(const H5F_t *f,
                      hbool_t * in_cache_ptr,
                      hbool_t * is_dirty_ptr,
                      hbool_t * is_protected_ptr,
-		     hbool_t * is_pinned_ptr)
+		     hbool_t * is_pinned_ptr,
+		     hbool_t * is_corked_ptr,
+		     hbool_t * is_flush_dep_parent_ptr,
+                     hbool_t * is_flush_dep_child_ptr)
 {
     H5C_t             * cache_ptr;
     H5C_cache_entry_t *	entry_ptr = NULL;
@@ -2333,6 +1693,21 @@ H5C_get_entry_status(const H5F_t *f,
 
             *is_pinned_ptr = entry_ptr->is_pinned;
         }
+
+        if ( is_corked_ptr != NULL ) {
+
+            *is_corked_ptr = entry_ptr->is_corked;
+        }
+
+        if ( is_flush_dep_parent_ptr != NULL ) {
+
+            *is_flush_dep_parent_ptr = (entry_ptr->flush_dep_nchildren > 0);
+        }
+
+        if ( is_flush_dep_child_ptr != NULL ) {
+
+            *is_flush_dep_child_ptr = (entry_ptr->flush_dep_nparents > 0);
+        }
     }
 
 done:
@@ -2384,33 +1759,59 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5C_get_trace_file_ptr
+ * Function:    H5C_get_aux_ptr
  *
- * Purpose:     Get the trace_file_ptr field from the cache.
+ * Purpose:     Get the aux_ptr field from the cache.
  *
- *              This field will either be NULL (which indicates that trace
- *              file logging is turned off), or contain a pointer to the
+ *              This field will either be NULL (when accessing a file serially)
+ *              or contains a pointer to the auxiliary info for parallel I/O.
+ *
+ * Return:      NULL/non-NULL (can't fail)
+ *
+ * Programmer:  Quincey Koziol
+ *              6/29/15
+ *
+ *-------------------------------------------------------------------------
+ */
+void *
+H5C_get_aux_ptr(const H5C_t *cache_ptr)
+{
+    FUNC_ENTER_NOAPI_NOERR
+
+    /* Check arguments */
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    FUNC_LEAVE_NOAPI(cache_ptr->aux_ptr)
+} /* H5C_get_aux_ptr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_get_trace_file_ptr
+ *
+ * Purpose:     Get the trace_file_ptr field from the cache.
+ *
+ *              This field will either be NULL (which indicates that trace
+ *              file logging is turned off), or contain a pointer to the
  *              open file to which trace file data is to be written.
  *
- * Return:      Non-negative on success/Negative on failure
+ * Return:      Non-NULL trace file pointer (can't fail)
  *
  * Programmer:  John Mainzer
  *              1/20/06
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5C_get_trace_file_ptr(const H5C_t *cache_ptr, FILE **trace_file_ptr_ptr)
+FILE *
+H5C_get_trace_file_ptr(const H5C_t *cache_ptr)
 {
     FUNC_ENTER_NOAPI_NOERR
 
+    /* Check arguments */
     HDassert(cache_ptr);
     HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
-    HDassert(trace_file_ptr_ptr);
 
-    *trace_file_ptr_ptr = cache_ptr->trace_file_ptr;
-
-    FUNC_LEAVE_NOAPI(SUCCEED)
+    FUNC_LEAVE_NOAPI(cache_ptr->trace_file_ptr)
 } /* H5C_get_trace_file_ptr() */
 
 

@@ -2423,16 +1824,15 @@ H5C_get_trace_file_ptr(const H5C_t *cache_ptr, FILE **trace_file_ptr_ptr)
  *              file logging is turned off), or contain a pointer to the
  *              open file to which trace file data is to be written.
  *
- * Return:      Non-negative on success/Negative on failure
+ * Return:      Non-NULL trace file pointer (can't fail)
  *
  * Programmer:  Quincey Koziol
  *              6/9/08
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5C_get_trace_file_ptr_from_entry(const H5C_cache_entry_t *entry_ptr,
-    FILE **trace_file_ptr_ptr)
+FILE *
+H5C_get_trace_file_ptr_from_entry(const H5C_cache_entry_t *entry_ptr)
 {
     FUNC_ENTER_NOAPI_NOERR
 
@@ -2440,13 +1840,327 @@ H5C_get_trace_file_ptr_from_entry(const H5C_cache_entry_t *entry_ptr,
     HDassert(entry_ptr);
     HDassert(entry_ptr->cache_ptr);
 
-    H5C_get_trace_file_ptr(entry_ptr->cache_ptr, trace_file_ptr_ptr);
-
-    FUNC_LEAVE_NOAPI(SUCCEED)
+    FUNC_LEAVE_NOAPI(H5C_get_trace_file_ptr(entry_ptr->cache_ptr))
 } /* H5C_get_trace_file_ptr_from_entry() */
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5C_set_up_logging
+ *
+ * Purpose:     Setup for metadata cache logging.
+ *
+ *              Metadata logging is enabled and disabled at two levels. This
+ *              function and the associated tear_down function open and close
+ *              the log file. the start_ and stop_logging functions are then
+ *              used to switch logging on/off. Optionally, logging can begin
+ *              as soon as the log file is opened (set via the start_immediately
+ *              parameter to this function).
+ *
+ *              The log functionality is split between the H5C and H5AC
+ *              packages. Log state and direct log manipulation resides in
+ *              H5C. Log messages are generated in H5AC and sent to
+ *              the H5C_write_log_message function.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_set_up_logging(H5C_t *cache_ptr, const char log_location[],
+    hbool_t start_immediately)
+{
+#ifdef H5_HAVE_PARALLEL
+    H5AC_aux_t *aux_ptr = NULL;
+#endif /*H5_HAVE_PARALLEL*/
+    char *file_name = NULL;
+    size_t n_chars;
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(log_location);
+
+    /* Sanity checks */
+    if(NULL == cache_ptr)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache_ptr == NULL")
+
+    if(H5C__H5C_T_MAGIC != cache_ptr->magic)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache magic value incorrect")
+
+    if(cache_ptr->logging_enabled)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "logging already set up")
+
+    if(NULL == log_location)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL log location not allowed")
+
+    /* Possibly fix up the log file name.
+     * The extra 39 characters are for adding the rank to the file name
+     * under parallel HDF5. 39 characters allows > 2^127 processes which
+     * should be enough for anybody.
+     *
+     * allocation size = <path length> + dot + <rank # length> + \0
+     */
+    n_chars = HDstrlen(log_location) + 1 + 39 + 1;
+    if(NULL == (file_name = (char *)HDcalloc(n_chars, sizeof(char))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, \
+            "can't allocate memory for mdc log file name manipulation")
+
+#ifdef H5_HAVE_PARALLEL
+
+    /* Add the rank to the log file name when MPI is in use */
+    aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr);
+
+    if(NULL == aux_ptr) {
+        HDsnprintf(file_name, n_chars, "%s", log_location);
+    }
+    else {
+        if(aux_ptr->magic != H5AC__H5AC_AUX_T_MAGIC) {
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "bad aux_ptr->magic")
+        }
+        HDsnprintf(file_name, n_chars, "%s.%d", log_location, aux_ptr->mpi_rank);
+    }
+
+#else /* H5_HAVE_PARALLEL */
+
+    HDsnprintf(file_name, n_chars, "%s", log_location);
+
+#endif /* H5_HAVE_PARALLEL */
+
+    /* Open log file */
+    if(NULL == (cache_ptr->log_file_ptr = HDfopen(file_name, "w")))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "can't create mdc log file")
+
+    /* Set logging flags */
+    cache_ptr->logging_enabled = TRUE;
+    cache_ptr->currently_logging = start_immediately;
+
+ done:
+    if(file_name)
+        HDfree(file_name);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_set_up_logging() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_tear_down_logging
+ *
+ * Purpose:     Tear-down for metadata cache logging.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_tear_down_logging(H5C_t *cache_ptr)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* Sanity checks */
+    if(NULL == cache_ptr)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache_ptr == NULL")
+
+    if(H5C__H5C_T_MAGIC != cache_ptr->magic)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache magic value incorrect")
+
+    if(FALSE == cache_ptr->logging_enabled)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "logging not enabled")
+
+    /* Unset logging flags */
+    cache_ptr->logging_enabled = FALSE;
+    cache_ptr->currently_logging = FALSE;
+
+    /* Close log file */
+    if(EOF == HDfclose(cache_ptr->log_file_ptr))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "problem closing mdc log file")
+    cache_ptr->log_file_ptr = NULL;
+
+ done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_tear_down_logging() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_start_logging
+ *
+ * Purpose:     Start logging metadata cache operations.
+ *
+ *              TODO: Add a function that dumps the current state of the
+ *                    metadata cache.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_start_logging(H5C_t *cache_ptr)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* Sanity checks */
+    if(NULL == cache_ptr)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache_ptr == NULL")
+
+    if(H5C__H5C_T_MAGIC != cache_ptr->magic)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache magic value incorrect")
+
+    if(FALSE == cache_ptr->logging_enabled)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "logging not enabled")
+
+    if(cache_ptr->currently_logging)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "logging already in progress")
+
+    /* Set logging flags */
+    cache_ptr->currently_logging = TRUE;
+
+    /* TODO - Dump cache state */
+
+ done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_start_logging() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_stop_logging
+ *
+ * Purpose:     Stop logging metadata cache operations.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_stop_logging(H5C_t *cache_ptr)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* Sanity checks */
+    if(NULL == cache_ptr)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache_ptr == NULL")
+
+    if(H5C__H5C_T_MAGIC != cache_ptr->magic)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache magic value incorrect")
+
+    if(FALSE == cache_ptr->logging_enabled)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "logging not enabled")
+
+    if(FALSE == cache_ptr->currently_logging)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "logging not in progress")
+
+    /* Set logging flags */
+    cache_ptr->currently_logging = FALSE;
+
+ done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_stop_logging() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_get_logging_status
+ *
+ * Purpose:     Determines if the cache is actively logging (via the OUT
+ *              parameter).
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_get_logging_status(const H5C_t *cache_ptr, /*OUT*/ hbool_t *is_enabled,
+                       /*OUT*/ hbool_t *is_currently_logging)
+{
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(is_enabled);
+    HDassert(is_currently_logging);
+
+    /* Sanity checks */
+    if(NULL == cache_ptr)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache_ptr == NULL")
+
+    if(H5C__H5C_T_MAGIC != cache_ptr->magic)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache magic value incorrect")
+
+    *is_enabled = cache_ptr->logging_enabled;
+    *is_currently_logging = cache_ptr->currently_logging;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_get_logging_status() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_write_log_message
+ *
+ * Purpose:     Write a message to the log file and flush the file. 
+ *              The message string is neither modified nor freed.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_write_log_message(const H5C_t *cache_ptr, const char message[])
+{
+    size_t n_chars;
+    herr_t ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(message);
+
+    /* Sanity checks */
+    if(NULL == cache_ptr)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache_ptr == NULL")
+
+    if(H5C__H5C_T_MAGIC != cache_ptr->magic)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache magic value incorrect")
+
+    if(FALSE == cache_ptr->currently_logging)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "not currently logging")
+
+    if(NULL == message)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL log message not allowed")
+
+    /* Write the log message and flush */
+    n_chars = HDstrlen(message);
+    if((int)n_chars != HDfprintf(cache_ptr->log_file_ptr, message))
+        HGOTO_ERROR(H5E_FILE, H5E_WRITEERROR, FAIL, "error writing log message")
+    if(EOF == HDfflush(cache_ptr->log_file_ptr))
+        HGOTO_ERROR(H5E_FILE, H5E_WRITEERROR, FAIL, "error flushing log message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_write_log_message() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    H5C_insert_entry
  *
  * Purpose:     Adds the specified thing to the cache.  The thing need not
@@ -2475,23 +2189,26 @@ H5C_get_trace_file_ptr_from_entry(const H5C_cache_entry_t *entry_ptr,
  */
 herr_t
 H5C_insert_entry(H5F_t *             f,
-                 hid_t		     primary_dxpl_id,
-                 hid_t		     secondary_dxpl_id,
+                 hid_t		     dxpl_id,
                  const H5C_class_t * type,
                  haddr_t 	     addr,
                  void *		     thing,
                  unsigned int        flags)
 {
     H5C_t *             cache_ptr;
-    herr_t		result;
-    herr_t		ret_value = SUCCEED;    /* Return value */
-    hbool_t		first_flush = TRUE;
+    H5P_genplist_t      *dxpl;
+    H5AC_ring_t         ring = H5C_RING_UNDEFINED;
     hbool_t		insert_pinned;
+    hbool_t             flush_last;
+#ifdef H5_HAVE_PARALLEL
+    hbool_t             flush_collectively;
+#endif /* H5_HAVE_PARALLEL */
     hbool_t             set_flush_marker;
     hbool_t		write_permitted = TRUE;
     size_t		empty_space;
     H5C_cache_entry_t *	entry_ptr;
     H5C_cache_entry_t *	test_entry_ptr;
+    herr_t		ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -2503,28 +2220,36 @@ H5C_insert_entry(H5F_t *             f,
     HDassert( cache_ptr );
     HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
     HDassert( type );
-    HDassert( type->flush );
-    HDassert( type->size );
     HDassert( H5F_addr_defined(addr) );
     HDassert( thing );
 
 #if H5C_DO_EXTREME_SANITY_CHECKS
-    if ( H5C_verify_not_in_index(cache_ptr, (H5C_cache_entry_t *)thing) < 0 ) {
-
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "thing already in index.\n");
-    }
-#endif /* H5C_DO_SANITY_CHECKS */
+    /* no need to verify that entry is not already in the index as */
+    /* we already make that check below.                           */
 
-#if H5C_DO_EXTREME_SANITY_CHECKS
-    if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+    if ( ( H5C_validate_protected_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_pinned_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_lru_list(cache_ptr) < 0 ) ) {
 
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                        "LRU sanity check failed.\n");
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "an extreme sanity check failed on entry.\n");
     }
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
-    set_flush_marker = ( (flags & H5C__SET_FLUSH_MARKER_FLAG) != 0 );
-    insert_pinned    = ( (flags & H5C__PIN_ENTRY_FLAG) != 0 );
+    set_flush_marker   = ( (flags & H5C__SET_FLUSH_MARKER_FLAG) != 0 );
+    insert_pinned      = ( (flags & H5C__PIN_ENTRY_FLAG) != 0 );
+    flush_last         = ( (flags & H5C__FLUSH_LAST_FLAG) != 0 );
+#ifdef H5_HAVE_PARALLEL
+    flush_collectively = ( (flags & H5C__FLUSH_COLLECTIVELY_FLAG) != 0 );
+#endif /* H5_HAVE_PARALLEL */
+
+    /* Get the dataset transfer property list */
+    if(NULL == (dxpl = (H5P_genplist_t *)H5I_object_verify(dxpl_id, H5I_GENPROP_LST)))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADTYPE, FAIL, "not a property list")
+
+    /* Get the ring type from the DXPL */
+    if((H5P_get(dxpl, H5AC_RING_NAME, &ring)) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "unable to query ring value")
 
     entry_ptr = (H5C_cache_entry_t *)thing;
 
@@ -2534,32 +2259,40 @@ H5C_insert_entry(H5F_t *             f,
 
     H5C__SEARCH_INDEX(cache_ptr, addr, test_entry_ptr, FAIL)
 
-    if ( test_entry_ptr != NULL ) {
-
-        if ( test_entry_ptr == entry_ptr ) {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \
-                        "entry already in cache.")
-
-        } else {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \
-                        "duplicate entry in cache.")
-        }
-    }
+    if(test_entry_ptr != NULL) {
+        if(test_entry_ptr == entry_ptr)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, "entry already in cache.")
+        else
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, "duplicate entry in cache.")
+    } /* end if */
 
-#ifndef NDEBUG
     entry_ptr->magic = H5C__H5C_CACHE_ENTRY_T_MAGIC;
-#endif /* NDEBUG */
     entry_ptr->cache_ptr = cache_ptr;
     entry_ptr->addr  = addr;
     entry_ptr->type  = type;
 
+    entry_ptr->image_ptr = NULL;
+    entry_ptr->image_up_to_date = FALSE;
+
+    /* Apply tag to newly inserted entry */
+    if(H5C_tag_entry(cache_ptr, entry_ptr, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "Cannot tag metadata entry")
+
+    /* Set the entry's cork status */
+    if(H5C_cork(cache_ptr, entry_ptr->tag, H5C__GET_CORKED, &entry_ptr->is_corked) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Cannot retrieve entry's cork status")
+
     entry_ptr->is_protected = FALSE;
     entry_ptr->is_read_only = FALSE;
     entry_ptr->ro_ref_count = 0;
 
     entry_ptr->is_pinned = insert_pinned;
+    entry_ptr->pinned_from_client = insert_pinned;
+    entry_ptr->pinned_from_cache = FALSE;
+    entry_ptr->flush_me_last = flush_last;
+#ifdef H5_HAVE_PARALLEL
+    entry_ptr->flush_me_collectively = flush_collectively;
+#endif
 
     /* newly inserted entries are assumed to be dirty */
     entry_ptr->is_dirty = TRUE;
@@ -2567,10 +2300,27 @@ H5C_insert_entry(H5F_t *             f,
     /* not protected, so can't be dirtied */
     entry_ptr->dirtied  = FALSE;
 
-    /* Retrieve the size of the thing */
-    if((type->size)(f, thing, &(entry_ptr->size)) < 0)
+    /* Retrieve the size of the thing.  Set the compressed field to FALSE
+     * and the compressed_size field to zero first, as they may not be 
+     * initialized by the image_len call.
+     */
+    entry_ptr->compressed = FALSE;
+    entry_ptr->compressed_size = 0;
+    if((type->image_len)(thing, &(entry_ptr->size), &(entry_ptr->compressed), 
+                         &(entry_ptr->compressed_size)) < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGETSIZE, FAIL, "Can't get size of thing")
     HDassert(entry_ptr->size > 0 &&  entry_ptr->size < H5C_MAX_ENTRY_SIZE);
+    HDassert(((type->flags & H5C__CLASS_COMPRESSED_FLAG) != 0) ||
+             (entry_ptr->compressed == FALSE));
+
+    /* entry has just been inserted -- thus compressed size cannot have 
+     * been computed yet.  Thus if entry_ptr->compressed is TRUE, 
+     * entry_ptr->size must equal entry_ptr->compressed_size.
+     */
+    HDassert((entry_ptr->compressed == FALSE) ||
+             (entry_ptr->size == entry_ptr->compressed_size));
+    HDassert((entry_ptr->compressed == TRUE) || 
+             (entry_ptr->compressed_size == 0));
 
     entry_ptr->in_slist = FALSE;
 
@@ -2581,7 +2331,15 @@ H5C_insert_entry(H5F_t *             f,
 
     entry_ptr->flush_in_progress = FALSE;
     entry_ptr->destroy_in_progress = FALSE;
-    entry_ptr->free_file_space_on_destroy = FALSE;
+
+    entry_ptr->ring = ring;
+
+    /* Initialize flush dependency height fields */
+    entry_ptr->flush_dep_parent = NULL;
+    entry_ptr->flush_dep_nparents = 0;
+    entry_ptr->flush_dep_parent_nalloc = 0;
+    entry_ptr->flush_dep_nchildren = 0;
+    entry_ptr->flush_dep_ndirty_children = 0;
 
     entry_ptr->ht_next = NULL;
     entry_ptr->ht_prev = NULL;
@@ -2597,69 +2355,38 @@ H5C_insert_entry(H5F_t *             f,
     if ( ( cache_ptr->flash_size_increase_possible ) &&
          ( entry_ptr->size > cache_ptr->flash_size_increase_threshold ) ) {
 
-        result = H5C__flash_increase_cache_size(cache_ptr, 0, entry_ptr->size);
-
-        if ( result < 0 ) {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \
-                        "H5C__flash_increase_cache_size failed.")
-        }
+        if(H5C__flash_increase_cache_size(cache_ptr, 0, entry_ptr->size) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, "H5C__flash_increase_cache_size failed.")
     }
 
-    if ( cache_ptr->index_size >= cache_ptr->max_cache_size ) {
-
+    if(cache_ptr->index_size >= cache_ptr->max_cache_size)
        empty_space = 0;
-
-    } else {
-
+    else
        empty_space = cache_ptr->max_cache_size - cache_ptr->index_size;
 
-    }
-
-    if ( ( cache_ptr->evictions_enabled )
-	 &&
+    if ( ( cache_ptr->evictions_enabled ) &&
          ( ( (cache_ptr->index_size + entry_ptr->size) >
-	     cache_ptr->max_cache_size
-	   )
+	     cache_ptr->max_cache_size)
 	   ||
-	   (
-	     ( ( empty_space + cache_ptr->clean_index_size ) <
-	       cache_ptr->min_clean_size )
-	   )
-	 )
-       ) {
+	   ( ( ( empty_space + cache_ptr->clean_index_size ) <
+	       cache_ptr->min_clean_size ) ) ) ) {
 
         size_t space_needed;
 
-	if ( empty_space <= entry_ptr->size ) {
-
+	if(empty_space <= entry_ptr->size)
             cache_ptr->cache_full = TRUE;
-	}
-
-        if ( cache_ptr->check_write_permitted != NULL ) {
-
-            result = (cache_ptr->check_write_permitted)(f,
-                                                        primary_dxpl_id,
-                                                        &write_permitted);
-
-            if ( result < 0 ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \
-                            "Can't get write_permitted")
-            }
-        } else {
 
+        if(cache_ptr->check_write_permitted != NULL) {
+            if((cache_ptr->check_write_permitted)(f, &write_permitted) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, "Can't get write_permitted")
+        } /* end if */
+        else
             write_permitted = cache_ptr->write_permitted;
-        }
-
-        HDassert( entry_ptr->size <= H5C_MAX_ENTRY_SIZE );
 
+        HDassert(entry_ptr->size <= H5C_MAX_ENTRY_SIZE);
         space_needed = entry_ptr->size;
-
-        if ( space_needed > cache_ptr->max_cache_size ) {
-
+        if(space_needed > cache_ptr->max_cache_size)
             space_needed = cache_ptr->max_cache_size;
-        }
 
         /* Note that space_needed is just the amount of space that
          * needed to insert the new entry without exceeding the cache
@@ -2686,18 +2413,8 @@ H5C_insert_entry(H5F_t *             f,
          * no point in worrying about the third.
          */
 
-        result = H5C_make_space_in_cache(f,
-                                         primary_dxpl_id,
-                                         secondary_dxpl_id,
-                                         space_needed,
-                                         write_permitted,
-                                         &first_flush);
-
-        if ( result < 0 ) {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \
-                        "H5C_make_space_in_cache failed.")
-        }
+        if(H5C_make_space_in_cache(f, dxpl_id, space_needed, write_permitted) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, "H5C_make_space_in_cache failed.")
     }
 
     H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, FAIL)
@@ -2719,22 +2436,33 @@ H5C_insert_entry(H5F_t *             f,
     H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, FAIL)
 
 #if H5C_DO_EXTREME_SANITY_CHECKS
-    if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+    if ( ( H5C_validate_protected_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_pinned_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_lru_list(cache_ptr) < 0 ) ) {
 
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                        "LRU sanity check failed.\n");
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "an extreme sanity check failed just before done.\n");
     }
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
+    /* If the entry's type has a 'notify' callback send a 'after insertion'
+     * notice now that the entry is fully integrated into the cache.
+     */
+    if(entry_ptr->type->notify &&
+            (entry_ptr->type->notify)(H5C_NOTIFY_ACTION_AFTER_INSERT, entry_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify client about entry inserted into cache")
+
     H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr)
 
 done:
 
 #if H5C_DO_EXTREME_SANITY_CHECKS
-    if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+    if ( ( H5C_validate_protected_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_pinned_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_lru_list(cache_ptr) < 0 ) ) {
 
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                        "LRU sanity check failed.\n");
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "an extreme sanity check failed on exit.\n");
     }
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
@@ -2744,298 +2472,6 @@ done:
 
 

 /*-------------------------------------------------------------------------
- *
- * Function:    H5C_mark_entries_as_clean
- *
- * Purpose:     When the H5C code is used to implement the metadata caches
- *		in PHDF5, only the cache with MPI_rank 0 is allowed to
- *		actually write entries to disk -- all other caches must
- *		retain dirty entries until they are advised that the
- *		entries are clean.
- *
- *		This function exists to allow the H5C code to receive these
- *		notifications.
- *
- *		The function receives a list of entry base addresses
- *		which must refer to dirty entries in the cache.  If any
- *		of the entries are either clean or don't exist, the
- *		function flags an error.
- *
- *		The function scans the list of entries and flushes all
- *		those that are currently unprotected with the
- *		H5C__FLUSH_CLEAR_ONLY_FLAG.  Those that are currently
- *		protected are flagged for clearing when they are
- *		unprotected.
- *
- * Return:      Non-negative on success/Negative on failure
- *
- * Programmer:  John Mainzer
- *              7/5/05
- *
- *-------------------------------------------------------------------------
- */
-#ifdef H5_HAVE_PARALLEL
-herr_t
-H5C_mark_entries_as_clean(H5F_t *  f,
-                          hid_t     primary_dxpl_id,
-                          hid_t     secondary_dxpl_id,
-                          int32_t   ce_array_len,
-                          haddr_t * ce_array_ptr)
-{
-    H5C_t *             cache_ptr;
-    hbool_t		first_flush = TRUE;
-    int			entries_cleared;
-    int			entries_examined;
-    int                 i;
-    int			initial_list_len;
-    haddr_t		addr;
-#if H5C_DO_SANITY_CHECKS
-    int			pinned_entries_marked = 0;
-    int			protected_entries_marked = 0;
-    int			other_entries_marked = 0;
-    haddr_t		last_addr;
-#endif /* H5C_DO_SANITY_CHECKS */
-    H5C_cache_entry_t *	clear_ptr = NULL;
-    H5C_cache_entry_t *	entry_ptr = NULL;
-    herr_t		ret_value = SUCCEED;      /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    HDassert( f );
-    HDassert( f->shared );
-    cache_ptr = f->shared->cache;
-    HDassert( cache_ptr );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-
-    HDassert( ce_array_len > 0 );
-    HDassert( ce_array_ptr != NULL );
-
-#if H5C_DO_EXTREME_SANITY_CHECKS
-        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
-
-                HDassert(0);
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "LRU sanity check failed.\n");
-        }
-#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
-
-    for ( i = 0; i < ce_array_len; i++ )
-    {
-        addr = ce_array_ptr[i];
-
-#if H5C_DO_SANITY_CHECKS
-        if ( i == 0 ) {
-
-            last_addr = addr;
-
-        } else {
-
-            if ( last_addr == addr ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "Duplicate entry in cleaned list.\n");
-
-            } else if ( last_addr > addr ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "cleaned list not sorted.\n");
-            }
-        }
-
-#if H5C_DO_EXTREME_SANITY_CHECKS
-        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
-
-                HDassert(0);
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "LRU sanity check failed.\n");
-        }
-#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
-#endif /* H5C_DO_SANITY_CHECKS */
-
-        HDassert( H5F_addr_defined(addr) );
-
-        H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
-
-        if ( entry_ptr == NULL ) {
-#if H5C_DO_SANITY_CHECKS
-	    HDfprintf(stdout,
-                  "H5C_mark_entries_as_clean: entry[%d] = %ld not in cache.\n",
-                      (int)i,
-                      (long)addr);
-#endif /* H5C_DO_SANITY_CHECKS */
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                        "Listed entry not in cache?!?!?.")
-
-        } else if ( ! entry_ptr->is_dirty ) {
-
-#if H5C_DO_SANITY_CHECKS
-	    HDfprintf(stdout,
-                      "H5C_mark_entries_as_clean: entry %ld is not dirty!?!\n",
-                      (long)addr);
-#endif /* H5C_DO_SANITY_CHECKS */
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                        "Listed entry not dirty?!?!?.")
-#if 0 /* original code */
-        } else if ( entry_ptr->is_protected ) {
-
-            entry_ptr->clear_on_unprotect = TRUE;
-
-        } else {
-
-            if ( H5C_flush_single_entry(f,
-                                        primary_dxpl_id,
-                                        secondary_dxpl_id,
-                                        entry_ptr->type,
-                                        addr,
-                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
-                                        &first_flush,
-                                        TRUE) < 0 ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.")
-            }
-        }
-#else /* modified code */
-        } else {
-            /* Mark the entry to be cleared on unprotect.  We will
-             * scan the LRU list shortly, and clear all those entries
-             * not currently protected.
-             */
-            entry_ptr->clear_on_unprotect = TRUE;
-#if H5C_DO_SANITY_CHECKS
-	    if ( entry_ptr->is_protected ) {
-
-		protected_entries_marked++;
-
-	    } else if ( entry_ptr->is_pinned ) {
-
-		pinned_entries_marked++;
-
-	    } else {
-
-		other_entries_marked++;
-	    }
-#endif /* H5C_DO_SANITY_CHECKS */
-        }
-#endif /* end modified code */
-    }
-#if 1 /* modified code */
-    /* Scan through the LRU list from back to front, and flush the
-     * entries whose clear_on_unprotect flags are set.  Observe that
-     * any protected entries will not be on the LRU, and therefore
-     * will not be flushed at this time.
-     */
-
-    entries_cleared = 0;
-    entries_examined = 0;
-    initial_list_len = cache_ptr->LRU_list_len;
-    entry_ptr = cache_ptr->LRU_tail_ptr;
-
-    while ( ( entry_ptr != NULL ) &&
-            ( entries_examined <= initial_list_len ) &&
-            ( entries_cleared < ce_array_len ) )
-    {
-        if ( entry_ptr->clear_on_unprotect ) {
-
-            entry_ptr->clear_on_unprotect = FALSE;
-            clear_ptr = entry_ptr;
-            entry_ptr = entry_ptr->prev;
-            entries_cleared++;
-
-            if ( H5C_flush_single_entry(f,
-                                        primary_dxpl_id,
-                                        secondary_dxpl_id,
-                                        clear_ptr->type,
-                                        clear_ptr->addr,
-                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
-                                        &first_flush,
-                                        TRUE) < 0 ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.")
-            }
-        } else {
-
-            entry_ptr = entry_ptr->prev;
-        }
-        entries_examined++;
-    }
-
-#if H5C_DO_SANITY_CHECKS
-    HDassert( entries_cleared == other_entries_marked );
-#endif /* H5C_DO_SANITY_CHECKS */
-
-    /* It is also possible that some of the cleared entries are on the
-     * pinned list.  Must scan that also.
-     */
-
-    entry_ptr = cache_ptr->pel_head_ptr;
-
-    while ( entry_ptr != NULL )
-    {
-        if ( entry_ptr->clear_on_unprotect ) {
-
-            entry_ptr->clear_on_unprotect = FALSE;
-            clear_ptr = entry_ptr;
-            entry_ptr = entry_ptr->next;
-            entries_cleared++;
-
-            if ( H5C_flush_single_entry(f,
-                                        primary_dxpl_id,
-                                        secondary_dxpl_id,
-                                        clear_ptr->type,
-                                        clear_ptr->addr,
-                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
-                                        &first_flush,
-                                        TRUE) < 0 ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.")
-            }
-        } else {
-
-            entry_ptr = entry_ptr->next;
-        }
-    }
-
-#if H5C_DO_SANITY_CHECKS
-    HDassert( entries_cleared == pinned_entries_marked + other_entries_marked );
-    HDassert( entries_cleared + protected_entries_marked == ce_array_len );
-#endif /* H5C_DO_SANITY_CHECKS */
-
-    HDassert( ( entries_cleared == ce_array_len ) ||
-              ( (ce_array_len - entries_cleared) <= cache_ptr->pl_len ) );
-
-#if H5C_DO_SANITY_CHECKS
-    i = 0;
-    entry_ptr = cache_ptr->pl_head_ptr;
-    while ( entry_ptr != NULL )
-    {
-        if ( entry_ptr->clear_on_unprotect ) {
-
-            i++;
-        }
-        entry_ptr = entry_ptr->next;
-    }
-    HDassert( (entries_cleared + i) == ce_array_len );
-#endif /* H5C_DO_SANITY_CHECKS */
-#endif /* modified code */
-
-done:
-
-#if H5C_DO_EXTREME_SANITY_CHECKS
-        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
-
-                HDassert(0);
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "LRU sanity check failed.\n");
-        }
-#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
-
-    FUNC_LEAVE_NOAPI(ret_value)
-
-} /* H5C_mark_entries_as_clean() */
-#endif /* H5_HAVE_PARALLEL */
-
-

-/*-------------------------------------------------------------------------
  * Function:    H5C_mark_entry_dirty
  *
  * Purpose:	Mark a pinned or protected entry as dirty.  The target entry
@@ -3091,11 +2527,17 @@ H5C_mark_entry_dirty(void *thing)
 
         /* mark the entry as dirty if it isn't already */
         entry_ptr->is_dirty = TRUE;
+	entry_ptr->image_up_to_date = FALSE;
 
-	if ( was_pinned_unprotected_and_clean ) {
+        /* Propagate the dirty flag up the flush dependency chain if appropriate
+         */
+        if(was_pinned_unprotected_and_clean) {
+            H5C__UPDATE_INDEX_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr);
 
-	    H5C__UPDATE_INDEX_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr);
-	}
+            if((entry_ptr->flush_dep_ndirty_children == 0) && (entry_ptr->flush_dep_nparents > 0))
+                if(H5C__mark_flush_dep_dirty(entry_ptr) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "Can't propagate flush dep dirty flag")
+        } /* end if */
 
         if ( ! (entry_ptr->in_slist) ) {
 
@@ -3127,11 +2569,6 @@ done:
  * Programmer:  John Mainzer
  *              6/2/04
  *
- *              JRM -- 11/5/08
- *              On review this function looks like no change is needed to
- *              support the new clean_index_size and dirty_index_size
- *              fields of H5C_t.
- *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -3140,11 +2577,9 @@ H5C_move_entry(H5C_t *	     cache_ptr,
                  haddr_t 	     old_addr,
 	         haddr_t 	     new_addr)
 {
-#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
-    hbool_t			was_dirty;
-#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
     H5C_cache_entry_t *	entry_ptr = NULL;
     H5C_cache_entry_t *	test_entry_ptr = NULL;
+    hbool_t		was_dirty;
 #if H5C_DO_SANITY_CHECKS
     hbool_t			removed_entry_from_slist = FALSE;
 #endif /* H5C_DO_SANITY_CHECKS */
@@ -3160,11 +2595,13 @@ H5C_move_entry(H5C_t *	     cache_ptr,
     HDassert( H5F_addr_ne(old_addr, new_addr) );
 
 #if H5C_DO_EXTREME_SANITY_CHECKS
-        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+    if ( ( H5C_validate_protected_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_pinned_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_lru_list(cache_ptr) < 0 ) ) {
 
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "LRU sanity check failed.\n");
-        }
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "an extreme sanity check failed on entry.\n");
+    }
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
     H5C__SEARCH_INDEX(cache_ptr, old_addr, entry_ptr, FAIL)
@@ -3239,41 +2676,51 @@ H5C_move_entry(H5C_t *	     cache_ptr,
 
     if ( ! ( entry_ptr->destroy_in_progress ) ) {
 
-#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
         was_dirty = entry_ptr->is_dirty;
-#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+	entry_ptr->is_dirty = TRUE;
 
-	if ( ! ( entry_ptr->flush_in_progress ) ) {
+	/* This shouldn't be needed, but it keeps the test code happy */
+        entry_ptr->image_up_to_date = FALSE;
 
-            entry_ptr->is_dirty = TRUE;
-	}
+        if ( ! ( entry_ptr->flush_in_progress ) ) {
 
-        H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, FAIL)
+            /* Propagate the dirty flag up the flush dependency chain if
+             * appropriate */
+            if ( ! ( was_dirty ) ) {
 
-	if ( ! ( entry_ptr->flush_in_progress ) ) {
+                if ( ( entry_ptr->flush_dep_ndirty_children == 0) &&
+                     ( entry_ptr->flush_dep_nparents > 0 ) ) {
 
-            H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL)
+                    if ( H5C__mark_flush_dep_dirty(entry_ptr) < 0 )
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "Can't propagate flush dep dirty flag")
+                }
+            }
+        }
 
-#if H5C_DO_SANITY_CHECKS
+        H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, FAIL)
 
-            if ( removed_entry_from_slist ) {
+        H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL)
 
-		/* we just removed the entry from the slist.  Thus we
-		 * must touch up cache_ptr->slist_len_increase and
-		 * cache_ptr->slist_size_increase to keep from skewing
-		 * the sanity checks.
-		 */
-		HDassert( cache_ptr->slist_len_increase > 1 );
-		HDassert( cache_ptr->slist_size_increase > entry_ptr->size );
+#if H5C_DO_SANITY_CHECKS
 
-		cache_ptr->slist_len_increase -= 1;
-		cache_ptr->slist_size_increase -= entry_ptr->size;
-	    }
+        if ( removed_entry_from_slist ) {
+
+	    /* we just removed the entry from the slist.  Thus we
+	     * must touch up cache_ptr->slist_len_increase and
+	     * cache_ptr->slist_size_increase to keep from skewing
+	     * the sanity checks.
+	     */
+	    cache_ptr->slist_len_increase -= 1;
+	    cache_ptr->slist_size_increase -= (int64_t)(entry_ptr->size);
+        }
 
 #endif /* H5C_DO_SANITY_CHECKS */
 
+	if ( ! ( entry_ptr->flush_in_progress ) ) {
+
+            /* skip the update if a flush is in progress */
             H5C__UPDATE_RP_FOR_MOVE(cache_ptr, entry_ptr, was_dirty, FAIL)
-	}
+        }
     }
 
     H5C__UPDATE_STATS_FOR_MOVE(cache_ptr, entry_ptr)
@@ -3281,11 +2728,13 @@ H5C_move_entry(H5C_t *	     cache_ptr,
 done:
 
 #if H5C_DO_EXTREME_SANITY_CHECKS
-        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+    if ( ( H5C_validate_protected_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_pinned_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_lru_list(cache_ptr) < 0 ) ) {
 
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "LRU sanity check failed.\n");
-        }
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "an extreme sanity check failed on exit.\n");
+    }
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -3331,6 +2780,15 @@ H5C_resize_entry(void *thing, size_t new_size)
     if(!(entry_ptr->is_pinned || entry_ptr->is_protected))
         HGOTO_ERROR(H5E_CACHE, H5E_BADTYPE, FAIL, "Entry isn't pinned or protected??")
 
+#if H5C_DO_EXTREME_SANITY_CHECKS
+    if ( ( H5C_validate_protected_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_pinned_entry_list(cache_ptr) < 0 ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "an extreme sanity check failed on entry.\n");
+    }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
     /* update for change in entry size if necessary */
     if ( entry_ptr->size != new_size ) {
         hbool_t		was_clean;
@@ -3340,6 +2798,23 @@ H5C_resize_entry(void *thing, size_t new_size)
 
         /* mark the entry as dirty if it isn't already */
         entry_ptr->is_dirty = TRUE;
+        entry_ptr->image_up_to_date = FALSE;
+
+        /* Release the current image */
+        if( entry_ptr->image_ptr )
+            entry_ptr->image_ptr = H5MM_xfree(entry_ptr->image_ptr);
+
+        /* Propagate the dirty flag up the flush dependency chain if
+         * appropriate */
+        if ( was_clean ) {
+
+            if ( ( entry_ptr->flush_dep_ndirty_children == 0) &&
+                 ( entry_ptr->flush_dep_nparents > 0 ) ) {
+
+                if ( H5C__mark_flush_dep_dirty(entry_ptr) < 0 )
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "Can't propagate flush dep dirty flag")
+            }
+        }
 
         /* do a flash cache size increase if appropriate */
         if ( cache_ptr->flash_size_increase_possible ) {
@@ -3395,57 +2870,140 @@ H5C_resize_entry(void *thing, size_t new_size)
     } /* end if */
 
 done:
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+    if ( ( H5C_validate_protected_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_pinned_entry_list(cache_ptr) < 0 ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "an extreme sanity check failed on exit.\n");
+    }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5C_resize_entry() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5C_pin_protected_entry()
+ * Function:    H5C_pin_entry_from_client()
  *
- * Purpose:	Pin a protected cache entry.  The entry must be protected
- * 		at the time of call, and must be unpinned.
+ * Purpose:	Internal routine to pin a cache entry from a client action.
  *
  * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  John Mainzer
- *              4/26/06
+ * Programmer:  Quincey Koziol
+ *              3/26/09
+ *
+ * Changes:	Added sanity checks to clarify the circumstances under
+ *		which an entry can be pinned.   JRM -- 4/27/14 
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5C_pin_protected_entry(void *thing)
+#ifndef NDEBUG
+static herr_t
+H5C_pin_entry_from_client(H5C_t *	          cache_ptr,
+                        H5C_cache_entry_t * entry_ptr)
+#else
+static herr_t
+H5C_pin_entry_from_client(H5C_t H5_ATTR_UNUSED *	cache_ptr,
+                        H5C_cache_entry_t * entry_ptr)
+#endif
 {
-    H5C_t             * cache_ptr;
-    H5C_cache_entry_t * entry_ptr = (H5C_cache_entry_t *)thing; /* Pointer to entry to pin */
     herr_t              ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_NOINIT
 
     /* Sanity checks */
-    HDassert(entry_ptr);
-    HDassert(H5F_addr_defined(entry_ptr->addr));
-    cache_ptr = entry_ptr->cache_ptr;
-    HDassert(cache_ptr);
-    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert( cache_ptr );
+    HDassert( entry_ptr );
+    HDassert( entry_ptr->is_protected );
+
+    /* Check if the entry is already pinned */
+    if(entry_ptr->is_pinned) {
+        /* Check if the entry was pinned through an explicit pin from a client */
+        if(entry_ptr->pinned_from_client)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, "Entry is already pinned")
+    } /* end if */
+    else {
+        entry_ptr->is_pinned = TRUE;
 
-    if ( ! ( entry_ptr->is_protected ) ) {
+        H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr)
+    } /* end else */
 
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, "Entry isn't protected")
-    }
+    /* Mark that the entry was pinned through an explicit pin from a client */
+    entry_ptr->pinned_from_client = TRUE;
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_pin_entry_from_client() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_pin_protected_entry()
+ *
+ * Purpose:	Pin a protected cache entry.  The entry must be protected
+ * 		at the time of call, and must be unpinned.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              4/26/06
+ *
+ * Changes:	Added extreme sanity checks on entry and exit.
+ *                                          JRM -- 4/26/14
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_pin_protected_entry(void *thing)
+{
+    H5C_t             * cache_ptr;
+    H5C_cache_entry_t * entry_ptr = (H5C_cache_entry_t *)thing; /* Pointer to entry to pin */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(entry_ptr);
+    HDassert(H5F_addr_defined(entry_ptr->addr));
+    cache_ptr = entry_ptr->cache_ptr;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
 
-    if ( entry_ptr->is_pinned ) {
+#if H5C_DO_EXTREME_SANITY_CHECKS
+    if ( ( H5C_validate_protected_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_pinned_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_lru_list(cache_ptr) < 0 ) ) {
 
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, "Entry is already pinned")
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "an extreme sanity check failed on entry.\n");
     }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
-    entry_ptr->is_pinned = TRUE;
 
-    H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr)
+    /* Only protected entries can be pinned */
+    if(!entry_ptr->is_protected)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, "Entry isn't protected")
+
+    /* Pin the entry from a client */
+    if(H5C_pin_entry_from_client(cache_ptr, entry_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, "Can't pin entry by client")
 
 done:
 
-    FUNC_LEAVE_NOAPI(ret_value)
+#if H5C_DO_EXTREME_SANITY_CHECKS
+    if ( ( H5C_validate_protected_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_pinned_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_lru_list(cache_ptr) < 0 ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "an extreme sanity check failed on exit.\n");
+    }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* H5C_pin_protected_entry() */
 
 

@@ -3464,18 +3022,6 @@ done:
  *		or flushed -- nor may it be accessed by another call to
  *		H5C_protect.  Any attempt to do so will result in a failure.
  *
- *		The primary_dxpl_id and secondary_dxpl_id parameters
- *		specify the dxpl_ids used on the first write occasioned
- *		by the insertion (primary_dxpl_id), and on all subsequent
- *		writes (secondary_dxpl_id).  This is useful in the
- *		metadata cache, but may not be needed elsewhere.  If so,
- *		just use the same dxpl_id for both parameters.
- *
- *		All reads are performed with the primary_dxpl_id.
- *
- *		Similarly, the primary_dxpl_id is passed to the
- *		check_write_permitted function if it is called.
- *
  * Return:      Success:        Ptr to the desired entry
  *              Failure:        NULL
  *
@@ -3497,28 +3043,41 @@ done:
  *              entries long before we actually have to evict something
  *              to make space.
  *
+ *		JRM -- 9/1/14
+ *		Replace the old rw parameter with the flags parameter.
+ *		This allows H5C_protect to accept flags other than 
+ *		H5C__READ_ONLY_FLAG.  
+ *
+ *		Added support for the H5C__FLUSH_LAST_FLAG and 
+ *		H5C__FLUSH_COLLECTIVELY_FLAG flags.  At present, these 
+ *		flags are only applied if the entry is not in cache, and 
+ *		is loaded into the cache as a result of this call.
+ *
  *-------------------------------------------------------------------------
  */
 void *
 H5C_protect(H5F_t *		f,
-            hid_t	        primary_dxpl_id,
-            hid_t	        secondary_dxpl_id,
+            hid_t	        dxpl_id,
             const H5C_class_t * type,
             haddr_t 	        addr,
             void *              udata,
 	    unsigned		flags)
 {
     H5C_t *		cache_ptr;
+    H5P_genplist_t      *dxpl;
+    H5AC_ring_t         ring = H5C_RING_UNDEFINED;
     hbool_t		hit;
-    hbool_t		first_flush;
     hbool_t		have_write_permitted = FALSE;
     hbool_t		read_only = FALSE;
+    hbool_t             flush_last;
+#ifdef H5_HAVE_PARALLEL
+    hbool_t             flush_collectively;
+#endif /* H5_HAVE_PARALLEL */
     hbool_t		write_permitted;
-    herr_t		result;
     size_t		empty_space;
     void *		thing;
     H5C_cache_entry_t *	entry_ptr;
-    void *		ret_value;      /* Return value */
+    void *		ret_value = NULL;       /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -3531,35 +3090,68 @@ H5C_protect(H5F_t *		f,
     HDassert( cache_ptr );
     HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
     HDassert( type );
-    HDassert( type->flush );
-    HDassert( type->load );
     HDassert( H5F_addr_defined(addr) );
 
 #if H5C_DO_EXTREME_SANITY_CHECKS
-    if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+    if ( ( H5C_validate_protected_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_pinned_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_lru_list(cache_ptr) < 0 ) ) {
 
-	HDassert(0);
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, \
-                    "LRU sanity check failed.\n");
+                    "an extreme sanity check failed on entry.\n");
     }
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
-    if ( (flags & H5C__READ_ONLY_FLAG) != 0 )
-    {
-	read_only = TRUE;
-    }
+    read_only          = ( (flags & H5C__READ_ONLY_FLAG) != 0 );
+    flush_last         = ( (flags & H5C__FLUSH_LAST_FLAG) != 0 );
+#ifdef H5_HAVE_PARALLEL
+    flush_collectively = ( (flags & H5C__FLUSH_COLLECTIVELY_FLAG) != 0 );
+#endif /* H5_HAVE_PARALLEL */
+
+    /* Get the dataset transfer property list */
+    if(NULL == (dxpl = (H5P_genplist_t *)H5I_object_verify(dxpl_id, H5I_GENPROP_LST)))
+        HGOTO_ERROR(H5E_CACHE, H5E_BADTYPE, NULL, "not a property list")
+
+    /* Get the ring type from the DXPL */
+    if((H5P_get(dxpl, H5AC_RING_NAME, &ring)) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, NULL, "unable to query ring value")
 
     /* first check to see if the target is in cache */
     H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, NULL)
 
     if ( entry_ptr != NULL ) {
+        if(entry_ptr->ring != ring)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, "ring type mismatch occured for cache entry\n");
 
         /* Check for trying to load the wrong type of entry from an address */
         if(entry_ptr->type != type)
             HGOTO_ERROR(H5E_CACHE, H5E_BADTYPE, NULL, "incorrect cache entry type")
 
+#if H5C_DO_TAGGING_SANITY_CHECKS
+{
+        H5C_tag_t tag;              /* Tag structure */
+
+        /* The entry is already in the cache, but make sure that the tag value 
+           being passed in via dxpl is still legal. This will ensure that had
+           the entry NOT been in the cache, tagging was still set up correctly
+           and it would have received a legal tag value after getting loaded
+           from disk. */
+
+        /* Get the tag from the DXPL */
+        if((H5P_get(dxpl, "H5C_tag", &tag)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "unable to query property value");
+    
+        /* Verify tag value */
+        if(cache_ptr->ignore_tags != TRUE) {
+            /* Verify legal tag value */
+            if((H5C_verify_tag(entry_ptr->type->id, tag.value)) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, NULL, "tag verification failed");
+        } /* end if */
+}
+#endif
+
         hit = TRUE;
-	thing = (void *)entry_ptr;
+        thing = (void *)entry_ptr;
 
     } else {
 
@@ -3567,7 +3159,7 @@ H5C_protect(H5F_t *		f,
 
         hit = FALSE;
 
-        thing = H5C_load_entry(f, primary_dxpl_id, type, addr, udata);
+        thing = H5C_load_entry(f, dxpl_id, type, addr, udata);
 
         if ( thing == NULL ) {
 
@@ -3576,37 +3168,35 @@ H5C_protect(H5F_t *		f,
 
         entry_ptr = (H5C_cache_entry_t *)thing;
 
+        entry_ptr->ring  = ring;
+
+        /* Apply tag to newly protected entry */
+        if(H5C_tag_entry(cache_ptr, entry_ptr, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, NULL, "Cannot tag metadata entry")
+
+	/* Set the entry's cork status */
+	if(H5C_cork(cache_ptr, entry_ptr->tag, H5C__GET_CORKED, &entry_ptr->is_corked) < 0)
+	    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, "Cannot retrieve entry's cork status")
+
         /* If the entry is very large, and we are configured to allow it,
          * we may wish to perform a flash cache size increase.
          */
         if ( ( cache_ptr->flash_size_increase_possible ) &&
              ( entry_ptr->size > cache_ptr->flash_size_increase_threshold ) ) {
 
-            result = H5C__flash_increase_cache_size(cache_ptr, 0,
-                                                     entry_ptr->size);
-
-            if ( result < 0 ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \
-                            "H5C__flash_increase_cache_size failed.")
-             }
+            if(H5C__flash_increase_cache_size(cache_ptr, 0, entry_ptr->size) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, "H5C__flash_increase_cache_size failed.")
         }
 
-        if ( cache_ptr->index_size >= cache_ptr->max_cache_size ) {
-
+        if(cache_ptr->index_size >= cache_ptr->max_cache_size)
            empty_space = 0;
-
-        } else {
-
+        else
            empty_space = cache_ptr->max_cache_size - cache_ptr->index_size;
 
-        }
-
 	/* try to free up if necceary and if evictions are permitted.  Note
 	 * that if evictions are enabled, we will call H5C_make_space_in_cache()
 	 * regardless if the min_free_space requirement is not met.
 	 */
-
         if ( ( cache_ptr->evictions_enabled ) &&
              ( ( (cache_ptr->index_size + entry_ptr->size) >
 	         cache_ptr->max_cache_size)
@@ -3618,36 +3208,20 @@ H5C_protect(H5F_t *		f,
 
             size_t space_needed;
 
-	    if ( empty_space <= entry_ptr->size ) {
-
+	    if(empty_space <= entry_ptr->size)
                 cache_ptr->cache_full = TRUE;
 
-	    }
-
-            if ( cache_ptr->check_write_permitted != NULL ) {
-
-                result = (cache_ptr->check_write_permitted)(f,
-                                                            primary_dxpl_id,
-                                                            &write_permitted);
-
-                if ( result < 0 ) {
-
-                    HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \
-                               "Can't get write_permitted 1")
-
-                } else {
-
+            if(cache_ptr->check_write_permitted != NULL) {
+                if((cache_ptr->check_write_permitted)(f, &write_permitted) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, "Can't get write_permitted 1")
+                else
                     have_write_permitted = TRUE;
-
-                    first_flush = TRUE;
-                }
             } else {
 
                 write_permitted = cache_ptr->write_permitted;
 
                 have_write_permitted = TRUE;
 
-                first_flush = TRUE;
             }
 
             HDassert( entry_ptr->size <= H5C_MAX_ENTRY_SIZE );
@@ -3688,16 +3262,8 @@ H5C_protect(H5F_t *		f,
              * see no point in worrying about the fourth.
              */
 
-            result = H5C_make_space_in_cache(f, primary_dxpl_id,
-                                             secondary_dxpl_id,
-                                             space_needed, write_permitted,
-                                             &first_flush);
-
-            if ( result < 0 ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \
-                            "H5C_make_space_in_cache failed 1.")
-            }
+            if(H5C_make_space_in_cache(f, dxpl_id, space_needed, write_permitted) < 0 )
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, "H5C_make_space_in_cache failed 1.")
         }
 
         /* Insert the entry in the hash table.  It can't be dirty yet, so
@@ -3705,7 +3271,24 @@ H5C_protect(H5F_t *		f,
          *
          * This is no longer true -- due to a bug fix, we may modify
          * data on load to repair a file.
+         *
+         *   *******************************************
+         *
+         * Set the flush_last (and possibly flush_collectively) fields 
+ 	 * of the newly loaded entry before inserting it into the 
+         * index.  Must do this, as the index tracked the number of 
+         * entries with the flush_last field set, but assumes that 
+         * the field will not change after insertion into the index.
+         *
+         * Note that this means that the H5C__FLUSH_LAST_FLAG and 
+         * H5C__FLUSH_COLLECTIVELY_FLAG flags are ignored if the 
+         * entry is already in cache.
          */
+        entry_ptr->flush_me_last = flush_last;
+#ifdef H5_HAVE_PARALLEL
+        entry_ptr->flush_me_collectively = flush_collectively;
+#endif
+
         H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, NULL)
 
         if ( ( entry_ptr->is_dirty ) && ( ! (entry_ptr->in_slist) ) ) {
@@ -3719,6 +3302,13 @@ H5C_protect(H5F_t *		f,
          * code.  If we do this often enough, we may want to optimize this.
          */
         H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, NULL)
+
+        /* If the entry's type has a 'notify' callback send a 'after load'
+         * notice now that the entry is fully integrated into the cache.
+         */
+        if(entry_ptr->type->notify &&
+                (entry_ptr->type->notify)(H5C_NOTIFY_ACTION_AFTER_LOAD, entry_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, NULL, "can't notify client about entry inserted into cache")
     }
 
     HDassert( entry_ptr->addr == addr );
@@ -3767,29 +3357,16 @@ H5C_protect(H5F_t *		f,
         if ( ! have_write_permitted ) {
 
             if ( cache_ptr->check_write_permitted != NULL ) {
-
-                result = (cache_ptr->check_write_permitted)(f,
-                                                            primary_dxpl_id,
-                                                            &write_permitted);
-
-                if ( result < 0 ) {
-
-                    HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \
-                               "Can't get write_permitted 2")
-
-                } else {
-
+                if((cache_ptr->check_write_permitted)(f, &write_permitted) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, "Can't get write_permitted 2")
+                else
                     have_write_permitted = TRUE;
-
-                    first_flush = TRUE;
-                }
             } else {
 
                 write_permitted = cache_ptr->write_permitted;
 
                 have_write_permitted = TRUE;
 
-                first_flush = TRUE;
             }
         }
 
@@ -3797,16 +3374,8 @@ H5C_protect(H5F_t *		f,
              ( cache_ptr->cache_accesses >=
                (cache_ptr->resize_ctl).epoch_length ) ) {
 
-            result = H5C__auto_adjust_cache_size(f,
-                                                 primary_dxpl_id,
-                                                 secondary_dxpl_id,
-                                                 write_permitted,
-                                                 &first_flush);
-            if ( result != SUCCEED ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \
-                            "Cache auto-resize failed.")
-            }
+            if(H5C__auto_adjust_cache_size(f, dxpl_id, write_permitted) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, "Cache auto-resize failed.")
         }
 
         if ( cache_ptr->size_decreased  ) {
@@ -3822,48 +3391,46 @@ H5C_protect(H5F_t *		f,
 	     * into complience.
              */
 
-            if ( cache_ptr->index_size >= cache_ptr->max_cache_size ) {
-
+            if(cache_ptr->index_size >= cache_ptr->max_cache_size)
                empty_space = 0;
-
-            } else {
-
+            else
                empty_space = cache_ptr->max_cache_size - cache_ptr->index_size;
 
-            }
-
             if ( ( cache_ptr->index_size > cache_ptr->max_cache_size )
 	         ||
 	         ( ( empty_space + cache_ptr->clean_index_size ) <
 	           cache_ptr->min_clean_size) ) {
 
-		if ( cache_ptr->index_size > cache_ptr->max_cache_size ) {
-
+		if(cache_ptr->index_size > cache_ptr->max_cache_size)
                     cache_ptr->cache_full = TRUE;
-		}
-
-                result = H5C_make_space_in_cache(f, primary_dxpl_id,
-                                                 secondary_dxpl_id,
-                                                 (size_t)0, write_permitted,
-                                                 &first_flush);
-
-                if ( result < 0 ) {
 
-                    HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \
-                                "H5C_make_space_in_cache failed 2.")
-                }
+                if(H5C_make_space_in_cache(f, dxpl_id, (size_t)0, write_permitted) < 0 )
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, "H5C_make_space_in_cache failed 2.")
             }
         }
     }
 
+#ifdef ASK
+    /* If we loaded the entry and the entry's type has a 'notify' callback, send
+     * a 'after insertion' notice now that the entry is fully integrated into
+     * the cache and protected.  We must wait until it is protected so it is not
+     * evicted during the notify callback.
+     */
+    if(!hit && entry_ptr->type->notify &&
+            (entry_ptr->type->notify)(H5C_NOTIFY_ACTION_AFTER_LOAD, entry_ptr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, NULL, "can't notify client about entry inserted into cache")
+#endif
+
 done:
 
 #if H5C_DO_EXTREME_SANITY_CHECKS
-        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+    if ( ( H5C_validate_protected_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_pinned_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_lru_list(cache_ptr) < 0 ) ) {
 
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, \
-                            "LRU sanity check failed.\n");
-        }
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, \
+                    "an extreme sanity check failed on exit.\n");
+    }
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -4276,9 +3843,7 @@ H5C_set_prefix(H5C_t * cache_ptr, char * prefix)
     cache_ptr->prefix[H5C__PREFIX_LEN - 1] = '\0';
 
 done:
-
     FUNC_LEAVE_NOAPI(ret_value)
-
 } /* H5C_set_prefix() */
 
 

@@ -4341,6 +3906,10 @@ done:
  *              total_entries_skipped_in_msic, total_entries_scanned_in_msic,
  *              and max_entries_skipped_in_msic fields.
  *
+ *		JRM -- 4/11/15
+ *		Added code displaying the new slist_scan_restarts,
+ *		LRU_scan_restarts, and hash_bucket_scan_restarts fields;
+ *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -4352,8 +3921,6 @@ H5C_stats(H5C_t * cache_ptr,
 #endif /* H5C_COLLECT_CACHE_STATS */
           display_detailed_stats)
 {
-    herr_t	ret_value = SUCCEED;   /* Return value */
-
 #if H5C_COLLECT_CACHE_STATS
     int		i;
     int64_t     total_hits = 0;
@@ -4366,6 +3933,7 @@ H5C_stats(H5C_t * cache_ptr,
     int64_t     total_clears = 0;
     int64_t     total_flushes = 0;
     int64_t     total_evictions = 0;
+    int64_t     total_take_ownerships = 0;
     int64_t     total_moves = 0;
     int64_t     total_entry_flush_moves = 0;
     int64_t     total_cache_flush_moves = 0;
@@ -4385,14 +3953,17 @@ H5C_stats(H5C_t * cache_ptr,
     size_t      aggregate_max_size = 0;
     int32_t	aggregate_max_pins = 0;
     double      hit_rate;
-    double	average_successful_search_depth = 0.0;
-    double	average_failed_search_depth = 0.0;
-    double      average_entries_skipped_per_calls_to_msic = 0.0;
-    double      average_entries_scanned_per_calls_to_msic = 0.0;
+    double	average_successful_search_depth = 0.0f;
+    double	average_failed_search_depth = 0.0f;
+    double      average_entries_skipped_per_calls_to_msic = 0.0f;
+    double      average_entries_scanned_per_calls_to_msic = 0.0f;
 #endif /* H5C_COLLECT_CACHE_STATS */
+    herr_t	ret_value = SUCCEED;   /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
     /* This would normally be an assert, but we need to use an HGOTO_ERROR
      * call to shut up the compiler.
      */
@@ -4419,11 +3990,10 @@ H5C_stats(H5C_t * cache_ptr,
         total_clears            += cache_ptr->clears[i];
         total_flushes           += cache_ptr->flushes[i];
         total_evictions         += cache_ptr->evictions[i];
-        total_moves           += cache_ptr->moves[i];
-	total_entry_flush_moves
-				+= cache_ptr->entry_flush_moves[i];
-	total_cache_flush_moves
-				+= cache_ptr->cache_flush_moves[i];
+        total_take_ownerships   += cache_ptr->take_ownerships[i];
+        total_moves             += cache_ptr->moves[i];
+	total_entry_flush_moves += cache_ptr->entry_flush_moves[i];
+	total_cache_flush_moves += cache_ptr->cache_flush_moves[i];
         total_size_increases    += cache_ptr->size_increases[i];
         total_size_decreases    += cache_ptr->size_decreases[i];
     	total_entry_flush_size_changes
@@ -4455,10 +4025,10 @@ H5C_stats(H5C_t * cache_ptr,
 
     if ( ( total_hits > 0 ) || ( total_misses > 0 ) ) {
 
-        hit_rate = 100.0 * ((double)(total_hits)) /
+        hit_rate = (double)100.0f * ((double)(total_hits)) /
                    ((double)(total_hits + total_misses));
     } else {
-        hit_rate = 0.0;
+        hit_rate = 0.0f;
     }
 
     if ( cache_ptr->successful_ht_searches > 0 ) {
@@ -4572,21 +4142,26 @@ H5C_stats(H5C_t * cache_ptr,
               (long)max_read_protects);
 
     HDfprintf(stdout,
-              "%s  Total clears / flushes / evictions = %ld / %ld / %ld\n",
+              "%s  Total clears / flushes             = %ld / %ld\n",
               cache_ptr->prefix,
               (long)total_clears,
-              (long)total_flushes,
-              (long)total_evictions);
+              (long)total_flushes);
+
+    HDfprintf(stdout,
+              "%s  Total evictions / take ownerships  = %ld / %ld\n",
+              cache_ptr->prefix,
+              (long)total_evictions,
+              (long)total_take_ownerships);
 
     HDfprintf(stdout,
-	      "%s  Total insertions(pinned) / moves = %ld(%ld) / %ld\n",
+	      "%s  Total insertions(pinned) / moves   = %ld(%ld) / %ld\n",
               cache_ptr->prefix,
               (long)total_insertions,
               (long)total_pinned_insertions,
               (long)total_moves);
 
     HDfprintf(stdout,
-	      "%s  Total entry / cache flush moves  = %ld / %ld\n",
+	      "%s  Total entry / cache flush moves    = %ld / %ld\n",
               cache_ptr->prefix,
               (long)total_entry_flush_moves,
               (long)total_cache_flush_moves);
@@ -4625,7 +4200,7 @@ H5C_stats(H5C_t * cache_ptr,
 
     HDfprintf(stdout, "%s  MSIC: Average/max entries skipped  = %lf / %ld\n",
               cache_ptr->prefix,
-              (float)average_entries_skipped_per_calls_to_msic,
+              (double)average_entries_skipped_per_calls_to_msic,
               (long)(cache_ptr->max_entries_skipped_in_msic));
 
     if (cache_ptr->calls_to_msic > 0) {
@@ -4636,7 +4211,7 @@ H5C_stats(H5C_t * cache_ptr,
 
     HDfprintf(stdout, "%s  MSIC: Average/max entries scanned  = %lf / %ld\n",
               cache_ptr->prefix,
-              (float)average_entries_scanned_per_calls_to_msic,
+              (double)average_entries_scanned_per_calls_to_msic,
               (long)(cache_ptr->max_entries_scanned_in_msic));
 
     HDfprintf(stdout, "%s  MSIC: Scanned to make space(evict) = %lld\n",
@@ -4648,6 +4223,13 @@ H5C_stats(H5C_t * cache_ptr,
               (long long)(cache_ptr->total_entries_scanned_in_msic -
                             cache_ptr->entries_scanned_to_make_space));
 
+    HDfprintf(stdout, 
+              "%s  slist/LRU/hash bkt scan restarts   = %lld / %lld / %lld.\n",
+              cache_ptr->prefix, 
+              (long long)(cache_ptr->slist_scan_restarts),
+              (long long)(cache_ptr->LRU_scan_restarts),
+              (long long)(cache_ptr->hash_bucket_scan_restarts));
+
 #if H5C_COLLECT_CACHE_ENTRY_STATS
 
     HDfprintf(stdout, "%s  aggregate max / min accesses       = %d / %d\n",
@@ -4680,10 +4262,10 @@ H5C_stats(H5C_t * cache_ptr,
 
             if ( ( cache_ptr->hits[i] > 0 ) || ( cache_ptr->misses[i] > 0 ) ) {
 
-                hit_rate = 100.0 * ((double)(cache_ptr->hits[i])) /
+                hit_rate = (double)100.0f * ((double)(cache_ptr->hits[i])) /
                           ((double)(cache_ptr->hits[i] + cache_ptr->misses[i]));
             } else {
-                hit_rate = 0.0;
+                hit_rate = 0.0f;
             }
 
             HDfprintf(stdout,
@@ -4701,21 +4283,26 @@ H5C_stats(H5C_t * cache_ptr,
                       (int)(cache_ptr->max_read_protects[i]));
 
             HDfprintf(stdout,
-                     "%s    clears / flushes / evictions   = %ld / %ld / %ld\n",
+                      "%s    clears / flushes               = %ld / %ld\n", 
                       cache_ptr->prefix,
                       (long)(cache_ptr->clears[i]),
-                      (long)(cache_ptr->flushes[i]),
-                      (long)(cache_ptr->evictions[i]));
+                      (long)(cache_ptr->flushes[i]));
+
+            HDfprintf(stdout,
+                      "%s    evictions / take ownerships    = %ld / %ld\n",
+                      cache_ptr->prefix,
+                      (long)(cache_ptr->evictions[i]),
+                      (long)(cache_ptr->take_ownerships[i]));
 
             HDfprintf(stdout,
-                      "%s    insertions(pinned) / moves   = %ld(%ld) / %ld\n",
+                      "%s    insertions(pinned) / moves     = %ld(%ld) / %ld\n",
                       cache_ptr->prefix,
                       (long)(cache_ptr->insertions[i]),
                       (long)(cache_ptr->pinned_insertions[i]),
                       (long)(cache_ptr->moves[i]));
 
             HDfprintf(stdout,
-                      "%s    entry / cache flush moves    = %ld / %ld\n",
+                      "%s    entry / cache flush moves      = %ld / %ld\n",
                       cache_ptr->prefix,
                       (long)(cache_ptr->entry_flush_moves[i]),
                       (long)(cache_ptr->cache_flush_moves[i]));
@@ -4740,7 +4327,7 @@ H5C_stats(H5C_t * cache_ptr,
                       (long)(cache_ptr->unpins[i]));
 
             HDfprintf(stdout,
-                      "%s    entry dirty pins/pin'd flushes  = %ld / %ld\n",
+                      "%s    entry dirty pins/pin'd flushes = %ld / %ld\n",
                       cache_ptr->prefix,
                       (long)(cache_ptr->dirty_pins[i]),
                       (long)(cache_ptr->pinned_flushes[i]));
@@ -4800,6 +4387,11 @@ done:
  *              total_entries_skipped_in_msic, total_entries_scanned_in_msic,
  *              and max_entries_skipped_in_msic fields.
  *
+ *		JRM 4/11/15
+ *		Added code to initialize the new slist_scan_restarts,
+ *		LRU_scan_restarts, hash_bucket_scan_restarts, and 
+ *		take_ownerships fields.
+ *
  *-------------------------------------------------------------------------
  */
 void
@@ -4833,9 +4425,10 @@ H5C_stats__reset(H5C_t H5_ATTR_UNUSED * cache_ptr)
         cache_ptr->clears[i]			= 0;
         cache_ptr->flushes[i]			= 0;
         cache_ptr->evictions[i]	 		= 0;
+        cache_ptr->take_ownerships[i] 		= 0;
         cache_ptr->moves[i]	 		= 0;
-        cache_ptr->entry_flush_moves[i]	= 0;
-        cache_ptr->cache_flush_moves[i]	= 0;
+        cache_ptr->entry_flush_moves[i]		= 0;
+        cache_ptr->cache_flush_moves[i]		= 0;
         cache_ptr->pins[i]	 		= 0;
         cache_ptr->unpins[i]	 		= 0;
         cache_ptr->dirty_pins[i]	 	= 0;
@@ -4875,6 +4468,10 @@ H5C_stats__reset(H5C_t H5_ATTR_UNUSED * cache_ptr)
     cache_ptr->max_entries_scanned_in_msic      = 0;
     cache_ptr->entries_scanned_to_make_space    = 0;
 
+    cache_ptr->slist_scan_restarts		= 0;
+    cache_ptr->LRU_scan_restarts		= 0;
+    cache_ptr->hash_bucket_scan_restarts	= 0;
+
 #if H5C_COLLECT_CACHE_ENTRY_STATS
 
     for ( i = 0; i <= cache_ptr->max_type_id; i++ )
@@ -4960,7 +4557,7 @@ H5C_dump_cache(H5C_t * cache_ptr,
 
     HDfprintf(stdout, "\n\nDump of metadata cache \"%s\".\n", cache_name);
     HDfprintf(stdout,
-        "Num:   Addr:           Len:    Type:   Prot:   Pinned: Dirty:\n");
+        "Num:    Addr:                             Tag:         Len:    Type:   Prot:   Pinned: Dirty: Corked:\n");
 
     i = 0;
 
@@ -4980,14 +4577,16 @@ H5C_dump_cache(H5C_t * cache_ptr,
         HDassert( entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC );
 
         HDfprintf(stdout,
-            "%s%d       0x%08llx        0x%3llx %2d     %d      %d      %d\n",
+            "%s%d       0x%16llx                0x%3llx        0x%3llx      %2d     %d      %d      %d       %d\n",
              cache_ptr->prefix, i,
              (long long)(entry_ptr->addr),
+             (long long)(entry_ptr->tag),
              (long long)(entry_ptr->size),
              (int)(entry_ptr->type->id),
              (int)(entry_ptr->is_protected),
              (int)(entry_ptr->is_pinned),
-             (int)(entry_ptr->is_dirty));
+             (int)(entry_ptr->is_dirty),
+	     (int)(entry_ptr->is_corked));
 
         /* increment node_ptr before we delete its target */
         node_ptr = H5SL_next(node_ptr);
@@ -5027,142 +4626,288 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5C_unpin_entry()
+ * Function:    H5C_dump_cache_skip_list
  *
- * Purpose:	Unpin a cache entry.  The entry must be unprotected at
- * 		the time of call, and must be pinned.
+ * Purpose:     Debugging routine that prints a summary of the contents of 
+ *		the skip list used by the metadata cache metadata cache to 
+ *		maintain an address sorted list of dirty entries.
  *
  * Return:      Non-negative on success/Negative on failure
  *
  * Programmer:  John Mainzer
- *              3/22/06
- *
- * Modifications:
- *
- * 		JRM -- 4/26/06
- *		Modified routine to allow it to operate on protected
- *		entries.
+ *              11/15/14
  *
  *-------------------------------------------------------------------------
  */
+#if 0 /* debugging routine */
 herr_t
-H5C_unpin_entry(void *_entry_ptr)
+H5C_dump_cache_skip_list(H5C_t * cache_ptr, char * calling_fcn)
 {
-    H5C_t             * cache_ptr;
-    H5C_cache_entry_t * entry_ptr = (H5C_cache_entry_t *)_entry_ptr; /* Pointer to entry to unpin */
-    herr_t              ret_value = SUCCEED;    /* Return value */
+    herr_t              ret_value = SUCCEED;   /* Return value */
+    int                 i;
+    H5C_cache_entry_t * entry_ptr = NULL;
+    H5SL_node_t *       node_ptr = NULL;
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    /* Sanity check */
-    HDassert(entry_ptr);
-    cache_ptr = entry_ptr->cache_ptr;
-    HDassert(cache_ptr);
+    HDassert(cache_ptr != NULL);
     HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(calling_fcn != NULL);
 
-    if ( ! ( entry_ptr->is_pinned ) ) {
+    HDfprintf(stdout, "\n\nDumping metadata cache skip list from %s.\n",
+              calling_fcn);
+    HDfprintf(stdout, "	slist len = %d.\n", cache_ptr->slist_len);
+    HDfprintf(stdout, "	slist size = %lld.\n", 
+              (long long)(cache_ptr->slist_size));
 
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, "Entry isn't pinned")
-    }
+    if ( cache_ptr->slist_len > 0 )
+    {
+        /* If we get this far, all entries in the cache are listed in the
+         * skip list -- scan the skip list generating the desired output.
+         */
 
-    if ( ! ( entry_ptr->is_protected ) ) {
+        HDfprintf(stdout,
+                  "Num:    Addr:               Len: Prot/Pind: Dirty: Type:\n");
 
-        H5C__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, FAIL)
-    }
+        i = 0;
+
+        node_ptr = H5SL_first(cache_ptr->slist_ptr);
+
+        if ( node_ptr != NULL ) {
+
+            entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+
+        } else {
+
+            entry_ptr = NULL;
+        }
+
+        while ( entry_ptr != NULL ) {
+
+            HDassert( entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC );
+
+            HDfprintf(stdout,
+               "%s%d       0x%016llx  %4lld    %d/%d       %d    %s\n",
+               cache_ptr->prefix, i,
+               (long long)(entry_ptr->addr),
+               (long long)(entry_ptr->size),
+               (int)(entry_ptr->is_protected),
+               (int)(entry_ptr->is_pinned),
+               (int)(entry_ptr->is_dirty),
+               entry_ptr->type->name);
+
+            HDfprintf(stdout, "		node_ptr = 0x%llx, item = 0x%llx\n",
+                      (unsigned long long)node_ptr,
+                      (unsigned long long)H5SL_item(node_ptr));
+
+            /* increment node_ptr before we delete its target */
+            node_ptr = H5SL_next(node_ptr);
+
+            if ( node_ptr != NULL ) {
+
+                entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+
+            } else {
+
+                entry_ptr = NULL;
+            }
 
-    entry_ptr->is_pinned = FALSE;
+            i++;
+        }
+    }
 
-    H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr)
+    HDfprintf(stdout, "\n\n");
 
 done:
 
     FUNC_LEAVE_NOAPI(ret_value)
 
-} /* H5C_unpin_entry() */
+} /* H5C_dump_cache_skip_list() */
+#endif /* debugging routine */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5C_unprotect
- *
- * Purpose:	Undo an H5C_protect() call -- specifically, mark the
- *		entry as unprotected, remove it from the protected list,
- *		and give it back to the replacement policy.
- *
- *		The TYPE and ADDR arguments must be the same as those in
- *		the corresponding call to H5C_protect() and the THING
- *		argument must be the value returned by that call to
- *		H5C_protect().
+ * Function:    H5C_unpin_entry_from_client()
  *
- *		The primary_dxpl_id and secondary_dxpl_id parameters
- *		specify the dxpl_ids used on the first write occasioned
- *		by the unprotect (primary_dxpl_id), and on all subsequent
- *		writes (secondary_dxpl_id).  Since an uprotect cannot
- *		occasion a write at present, all this is moot for now.
- *		However, things change, and in any case,
- *		H5C_flush_single_entry() needs primary_dxpl_id and
- *		secondary_dxpl_id in its parameter list.
- *
- *		The function can't cause a read either, so the dxpl_id
- *		parameters are moot in this case as well.
- *
- * Return:      Non-negative on success/Negative on failure
- *
- *		If the deleted flag is TRUE, simply remove the target entry
- *		from the cache, clear it, and free it without writing it to
- *		disk.
+ * Purpose:	Internal routine to unpin a cache entry from a client action.
  *
  * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  John Mainzer
- *              6/2/04
+ * Programmer:  Quincey Koziol
+ *              3/24/09
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5C_unprotect(H5F_t *		  f,
-              hid_t		  primary_dxpl_id,
-              hid_t		  secondary_dxpl_id,
-              const H5C_class_t * type,
-              haddr_t		  addr,
-              void *		  thing,
-              unsigned int        flags)
+static herr_t
+H5C_unpin_entry_from_client(H5C_t *		  cache_ptr,
+                H5C_cache_entry_t *	  entry_ptr,
+                hbool_t update_rp)
 {
-    H5C_t *		cache_ptr;
-    hbool_t		deleted;
-    hbool_t		dirtied;
-    hbool_t             set_flush_marker;
-    hbool_t		pin_entry;
-    hbool_t		unpin_entry;
-    hbool_t		free_file_space;
-    hbool_t		take_ownership;
-    hbool_t 		was_clean;
-#ifdef H5_HAVE_PARALLEL
-    hbool_t		clear_entry = FALSE;
-#endif /* H5_HAVE_PARALLEL */
-    H5C_cache_entry_t *	entry_ptr;
-    H5C_cache_entry_t *	test_entry_ptr;
     herr_t              ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_NOINIT
 
-    deleted          = ( (flags & H5C__DELETED_FLAG) != 0 );
-    dirtied          = ( (flags & H5C__DIRTIED_FLAG) != 0 );
-    set_flush_marker = ( (flags & H5C__SET_FLUSH_MARKER_FLAG) != 0 );
-    pin_entry        = ( (flags & H5C__PIN_ENTRY_FLAG) != 0 );
-    unpin_entry      = ( (flags & H5C__UNPIN_ENTRY_FLAG) != 0 );
-    free_file_space  = ( (flags & H5C__FREE_FILE_SPACE_FLAG) != 0 );
-    take_ownership   = ( (flags & H5C__TAKE_OWNERSHIP_FLAG) != 0 );
+    /* Sanity checking */
+    HDassert( cache_ptr );
+    HDassert( entry_ptr );
 
-    HDassert( f );
-    HDassert( f->shared );
+    /* Error checking (should be sanity checks?) */
+    if(!entry_ptr->is_pinned)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, "Entry isn't pinned")
+    if(!entry_ptr->pinned_from_client)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, "Entry wasn't pinned by cache client")
 
-    cache_ptr = f->shared->cache;
+    /* Check if the entry is not pinned from a flush dependency */
+    if(!entry_ptr->pinned_from_cache) {
+        /* If requested, update the replacement policy if the entry is not protected */
+        if(update_rp && !entry_ptr->is_protected)
+            H5C__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, FAIL)
 
-    HDassert( cache_ptr );
+        /* Unpin the entry now */
+        entry_ptr->is_pinned = FALSE;
+
+        /* Update the stats for an unpin operation */
+        H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr)
+    } /* end if */
+
+    /* Mark the entry as explicitly unpinned by the client */
+    entry_ptr->pinned_from_client = FALSE;
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_unpin_entry_from_client() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_unpin_entry()
+ *
+ * Purpose:	Unpin a cache entry.  The entry can be either protected or
+ * 		unprotected at the time of call, but must be pinned.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              3/22/06
+ *
+ * Changes:	Added extreme sanity checks on entry and exit.
+                				JRM -- 4/26/14 
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_unpin_entry(void *_entry_ptr)
+{
+    H5C_t             * cache_ptr;
+    H5C_cache_entry_t * entry_ptr = (H5C_cache_entry_t *)_entry_ptr; /* Pointer to entry to unpin */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(entry_ptr);
+    cache_ptr = entry_ptr->cache_ptr;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+    if ( ( H5C_validate_protected_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_pinned_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_lru_list(cache_ptr) < 0 ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "an extreme sanity check failed on entry.\n");
+    }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+
+    /* Unpin the entry */
+    if(H5C_unpin_entry_from_client(cache_ptr, entry_ptr, TRUE) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, "Can't unpin entry from client")
+
+done:
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+    if ( ( H5C_validate_protected_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_pinned_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_lru_list(cache_ptr) < 0 ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "an extreme sanity check failed on exit.\n");
+    }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_unpin_entry() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_unprotect
+ *
+ * Purpose:	Undo an H5C_protect() call -- specifically, mark the
+ *		entry as unprotected, remove it from the protected list,
+ *		and give it back to the replacement policy.
+ *
+ *		The TYPE and ADDR arguments must be the same as those in
+ *		the corresponding call to H5C_protect() and the THING
+ *		argument must be the value returned by that call to
+ *		H5C_protect().
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ *		If the deleted flag is TRUE, simply remove the target entry
+ *		from the cache, clear it, and free it without writing it to
+ *		disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              6/2/04
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_unprotect(H5F_t *		  f,
+              hid_t		  dxpl_id,
+              haddr_t		  addr,
+              void *		  thing,
+              unsigned int        flags)
+{
+    H5C_t *             cache_ptr;
+    hbool_t		deleted;
+    hbool_t		dirtied;
+    hbool_t             set_flush_marker;
+    hbool_t		pin_entry;
+    hbool_t		unpin_entry;
+    hbool_t		free_file_space;
+    hbool_t		take_ownership;
+    hbool_t 		was_clean;
+#ifdef H5_HAVE_PARALLEL
+    hbool_t		clear_entry = FALSE;
+#endif /* H5_HAVE_PARALLEL */
+    H5C_cache_entry_t *	entry_ptr;
+    H5C_cache_entry_t *	test_entry_ptr;
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    deleted                = ((flags & H5C__DELETED_FLAG) != 0);
+    dirtied                = ((flags & H5C__DIRTIED_FLAG) != 0);
+    set_flush_marker       = ((flags & H5C__SET_FLUSH_MARKER_FLAG) != 0);
+    pin_entry              = ((flags & H5C__PIN_ENTRY_FLAG) != 0);
+    unpin_entry            = ((flags & H5C__UNPIN_ENTRY_FLAG) != 0);
+    free_file_space        = ((flags & H5C__FREE_FILE_SPACE_FLAG) != 0);
+    take_ownership         = ((flags & H5C__TAKE_OWNERSHIP_FLAG) != 0);
+
+    HDassert( f );
+    HDassert( f->shared );
+
+    cache_ptr = f->shared->cache;
+
+    HDassert( cache_ptr );
     HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-    HDassert( type );
-    HDassert( type->clear );
-    HDassert( type->flush );
     HDassert( H5F_addr_defined(addr) );
     HDassert( thing );
     HDassert( ! ( pin_entry && unpin_entry ) );
@@ -5173,7 +4918,6 @@ H5C_unprotect(H5F_t *		  f,
     entry_ptr = (H5C_cache_entry_t *)thing;
 
     HDassert( entry_ptr->addr == addr );
-    HDassert( entry_ptr->type == type );
 
     /* also set the dirtied variable if the dirtied field is set in
      * the entry.
@@ -5182,69 +4926,52 @@ H5C_unprotect(H5F_t *		  f,
     was_clean = ! ( entry_ptr->is_dirty );
 
 #if H5C_DO_EXTREME_SANITY_CHECKS
-        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+    if ( ( H5C_validate_protected_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_pinned_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_lru_list(cache_ptr) < 0 ) ) {
 
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "LRU sanity check failed.\n");
-        }
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "an extreme sanity check failed on entry.\n");
+    }
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
-
     /* if the entry has multiple read only protects, just decrement
      * the ro_ref_counter.  Don't actually unprotect until the ref count
      * drops to zero.
      */
-    if ( entry_ptr->ro_ref_count > 1 ) {
-
-	HDassert( entry_ptr->is_protected );
-        HDassert( entry_ptr->is_read_only );
+    if(entry_ptr->ro_ref_count > 1) {
+        /* Sanity check */
+	HDassert(entry_ptr->is_protected);
+        HDassert(entry_ptr->is_read_only);
 
-	if ( dirtied ) {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
-                        "Read only entry modified(1)??")
-	}
+	if(dirtied)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "Read only entry modified??")
 
+        /* Reduce the RO ref count */
 	(entry_ptr->ro_ref_count)--;
 
         /* Pin or unpin the entry as requested. */
-        if ( pin_entry ) {
-
-            if ( entry_ptr->is_pinned ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, \
-                            "Entry already pinned???")
-            }
-	    entry_ptr->is_pinned = TRUE;
-	    H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr)
-
-        } else if ( unpin_entry ) {
-
-            if ( ! ( entry_ptr->is_pinned ) ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, \
-			    "Entry already unpinned???")
-            }
-	    entry_ptr->is_pinned = FALSE;
-	    H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr)
-
-        }
+        if(pin_entry) {
+            /* Pin the entry from a client */
+            if(H5C_pin_entry_from_client(cache_ptr, entry_ptr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, "Can't pin entry by client")
+        } else if(unpin_entry) {
+            /* Unpin the entry from a client */
+            if(H5C_unpin_entry_from_client(cache_ptr, entry_ptr, FALSE) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, "Can't unpin entry by client")
+        } /* end if */
 
     } else {
+	if(entry_ptr->is_read_only) {
+            /* Sanity check */
+	    HDassert(entry_ptr->ro_ref_count == 1);
 
-	if ( entry_ptr->is_read_only ) {
-
-	    HDassert( entry_ptr->ro_ref_count == 1 );
-
-	    if ( dirtied ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
-                            "Read only entry modified(2)??")
-	    }
+	    if(dirtied)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "Read only entry modified??")
 
 	    entry_ptr->is_read_only = FALSE;
 	    entry_ptr->ro_ref_count = 0;
-	}
+	} /* end if */
 
 #ifdef H5_HAVE_PARALLEL
         /* When the H5C code is used to implement the metadata cache in the
@@ -5262,56 +4989,71 @@ H5C_unprotect(H5F_t *		  f,
          * are contiguous, with only one dirty flag, we have to let the supplied
          * functions deal with the reseting the is_dirty flag.
          */
-        if ( entry_ptr->clear_on_unprotect ) {
-
-            HDassert( entry_ptr->is_dirty );
+        if(entry_ptr->clear_on_unprotect) {
+            /* Sanity check */
+            HDassert(entry_ptr->is_dirty);
 
             entry_ptr->clear_on_unprotect = FALSE;
-
-            if ( ! dirtied ) {
-
+            if(!dirtied)
                 clear_entry = TRUE;
-            }
-        }
+        } /* end if */
 #endif /* H5_HAVE_PARALLEL */
 
-        if ( ! (entry_ptr->is_protected) ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
-                            "Entry already unprotected??")
-        }
-
-        /* mark the entry as dirty if appropriate */
-        entry_ptr->is_dirty = ( (entry_ptr->is_dirty) || dirtied );
+        if(!entry_ptr->is_protected)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "Entry already unprotected??")
 
-        if ( ( was_clean ) && ( entry_ptr->is_dirty ) ) {
+        /* Mark the entry as dirty if appropriate */
+        entry_ptr->is_dirty = (entry_ptr->is_dirty || dirtied);
 
-	    H5C__UPDATE_INDEX_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr)
-	}
+        /* the image_up_to_date field was introduced to support 
+         * journaling.  Until we re-introduce journaling, this 
+         * field should be equal to !entry_ptr->is_dirty.  
+         *
+         * When journaling is re-enabled it should be set 
+         * to FALSE if dirtied is TRUE.
+         */
+#if 1 /* JRM */
+	entry_ptr->image_up_to_date = FALSE;
+#else /* JRM */
+	entry_ptr->image_up_to_date = !entry_ptr->is_dirty;
+#endif /* JRM */
 
-        /* Pin or unpin the entry as requested. */
-        if ( pin_entry ) {
+        /* Update index for newly dirtied entry */
+        if(was_clean && entry_ptr->is_dirty) {
 
-            if ( entry_ptr->is_pinned ) {
+            /* Propagate the flush dep dirty flag up the flush dependency chain
+             * if appropriate */
+            if ( ( entry_ptr->flush_dep_ndirty_children == 0) &&
+                 ( entry_ptr->flush_dep_nparents > 0 ) ) {
 
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, \
-                            "Entry already pinned???")
+                if ( H5C__mark_flush_dep_dirty(entry_ptr) < 0 )
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "Can't propagate flush dep dirty flag")
             }
-	    entry_ptr->is_pinned = TRUE;
-	    H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr)
 
-        } else if ( unpin_entry ) {
+            H5C__UPDATE_INDEX_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr)
+        } else if ( ! ( was_clean ) && ! ( entry_ptr->is_dirty ) ) {
 
-            if ( ! ( entry_ptr->is_pinned ) ) {
+            /* Propagate the flush dep clean flag up the flush dependency chain
+             * if appropriate */
+            if ( ( entry_ptr->flush_dep_ndirty_children == 0) &&
+                 ( entry_ptr->flush_dep_nparents > 0 ) ) {
 
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, \
-			    "Entry already unpinned???")
+                if ( H5C__mark_flush_dep_clean(entry_ptr) < 0 )
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL,  "Can't propagate flush dep dirty flag")
             }
-	    entry_ptr->is_pinned = FALSE;
-	    H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr)
-
         }
 
+        /* Pin or unpin the entry as requested. */
+        if(pin_entry) {
+            /* Pin the entry from a client */
+            if(H5C_pin_entry_from_client(cache_ptr, entry_ptr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, "Can't pin entry by client")
+        } else if(unpin_entry) {
+            /* Unpin the entry from a client */
+            if(H5C_unpin_entry_from_client(cache_ptr, entry_ptr, FALSE) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, "Can't unpin entry by client")
+        } /* end if */
+
         /* H5C__UPDATE_RP_FOR_UNPROTECT will place the unprotected entry on
          * the pinned entry list if entry_ptr->is_pinned is TRUE.
          */
@@ -5322,16 +5064,11 @@ H5C_unprotect(H5F_t *		  f,
         /* if the entry is dirty, 'or' its flush_marker with the set flush flag,
          * and then add it to the skip list if it isn't there already.
          */
-
-        if ( entry_ptr->is_dirty ) {
-
+        if(entry_ptr->is_dirty) {
             entry_ptr->flush_marker |= set_flush_marker;
-
-            if ( ! (entry_ptr->in_slist) ) {
-
+            if(!entry_ptr->in_slist)
                 H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL)
-            }
-        }
+        } /* end if */
 
         /* this implementation of the "deleted" option is a bit inefficient, as
          * we re-insert the entry to be deleted into the replacement policy
@@ -5343,13 +5080,6 @@ H5C_unprotect(H5F_t *		  f,
          *                                             JRM - 5/19/04
          */
         if ( deleted ) {
-
-            /* the following first flush flag will never be used as we are
-             * calling H5C_flush_single_entry with both the
-             * H5C__FLUSH_CLEAR_ONLY_FLAG and H5C__FLUSH_INVALIDATE_FLAG flags.
-	     * However, it is needed for the function call.
-             */
-            hbool_t	dummy_first_flush = TRUE;
             unsigned    flush_flags = (H5C__FLUSH_CLEAR_ONLY_FLAG |
                                          H5C__FLUSH_INVALIDATE_FLAG);
 
@@ -5357,78 +5087,51 @@ H5C_unprotect(H5F_t *		  f,
 	    HDassert ( ! (entry_ptr->is_pinned ) );
 
             /* verify that the target entry is in the cache. */
-
             H5C__SEARCH_INDEX(cache_ptr, addr, test_entry_ptr, FAIL)
+            if(test_entry_ptr == NULL)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "entry not in hash table?!?.")
+            else if(test_entry_ptr != entry_ptr)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "hash table contains multiple entries for addr?!?.")
 
-            if ( test_entry_ptr == NULL ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
-                            "entry not in hash table?!?.")
-            }
-            else if ( test_entry_ptr != entry_ptr ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
-                            "hash table contains multiple entries for addr?!?.")
-            }
-
-            /* Pass along 'free file space' flag to cache client */
-
-            entry_ptr->free_file_space_on_destroy = free_file_space;
+            /* Set the 'free file space' flag for the flush, if needed */
+            if(free_file_space)
+                flush_flags |= H5C__FREE_FILE_SPACE_FLAG;
 
             /* Set the "take ownership" flag for the flush, if needed */
-            if ( take_ownership) {
-
+            if(take_ownership)
                 flush_flags |= H5C__TAKE_OWNERSHIP_FLAG;
-            }
 
-            if ( H5C_flush_single_entry(f,
-                                        primary_dxpl_id,
-                                        secondary_dxpl_id,
-                                        type,
-                                        addr,
-                                        flush_flags,
-                                        &dummy_first_flush,
-                                        TRUE) < 0 ) {
+            /* Delete the entry from the skip list on destroy */
+            flush_flags |= H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG;
+
+            if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, flush_flags, NULL) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "Can't flush entry")
 
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "Can't flush.")
+#if H5C_DO_SANITY_CHECKS
+	    if ( ( take_ownership ) && ( ! was_clean ) )
+            {
+                /* we have just removed an entry from the skip list.  Thus 
+                 * we must touch up cache_ptr->slist_len_increase and
+                 * cache_ptr->slist_size_increase to keep from skewing
+                 * the sanity checks on flushes.
+                 */
+                cache_ptr->slist_len_increase -= 1;
+                cache_ptr->slist_size_increase -= (int64_t)(entry_ptr->size);
             }
+#endif /* H5C_DO_SANITY_CHECKS */
         }
 #ifdef H5_HAVE_PARALLEL
         else if ( clear_entry ) {
 
-            /* the following first flush flag will never be used as we are
-             * calling H5C_flush_single_entry with the
-	     * H5C__FLUSH_CLEAR_ONLY_FLAG flag.  However, it is needed for
-	     * the function call.
-             */
-            hbool_t		dummy_first_flush = TRUE;
-
             /* verify that the target entry is in the cache. */
-
             H5C__SEARCH_INDEX(cache_ptr, addr, test_entry_ptr, FAIL)
+            if(test_entry_ptr == NULL)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "entry not in hash table?!?.")
+            else if(test_entry_ptr != entry_ptr)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "hash table contains multiple entries for addr?!?.")
 
-            if ( test_entry_ptr == NULL ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
-                            "entry not in hash table?!?.")
-            }
-            else if ( test_entry_ptr != entry_ptr ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \
-                            "hash table contains multiple entries for addr?!?.")
-            }
-
-            if ( H5C_flush_single_entry(f,
-                                        primary_dxpl_id,
-                                        secondary_dxpl_id,
-                                        type,
-                                        addr,
-                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
-                                        &dummy_first_flush,
-                                        TRUE) < 0 ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "Can't clear.")
-            }
+            if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__FLUSH_CLEAR_ONLY_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "Can't clear entry")
         }
 #endif /* H5_HAVE_PARALLEL */
     }
@@ -5438,11 +5141,13 @@ H5C_unprotect(H5F_t *		  f,
 done:
 
 #if H5C_DO_EXTREME_SANITY_CHECKS
-        if ( H5C_validate_lru_list(cache_ptr) < 0 ) {
+    if ( ( H5C_validate_protected_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_pinned_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_lru_list(cache_ptr) < 0 ) ) {
 
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "LRU sanity check failed.\n");
-        }
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "an extreme sanity check failed on exit.\n");
+    }
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -5708,72 +5413,316 @@ done:
 } /* H5C_validate_resize_config() */
 
 

-/*************************************************************************/
-/**************************** Private Functions: *************************/
-/*************************************************************************/
-
 /*-------------------------------------------------------------------------
+ * Function:    H5C_create_flush_dependency()
  *
- * Function:	H5C__auto_adjust_cache_size
- *
- * Purpose:    	Obtain the current full cache hit rate, and compare it
- *		with the hit rate thresholds for modifying cache size.
- *		If one of the thresholds has been crossed, adjusts the
- *		size of the cache accordingly.
+ * Purpose:	Initiates a parent<->child entry flush dependency.  The parent
+ *              entry must be pinned or protected at the time of call, and must
+ *              have all dependencies removed before the cache can shut down.
  *
- *		The function then resets the full cache hit rate
- *		statistics, and exits.
+ * Note:	Flush dependencies in the cache indicate that a child entry
+ *              must be flushed to the file before its parent.  (This is
+ *              currently used to implement Single-Writer/Multiple-Reader (SWMR)
+ *              I/O access for data structures in the file).
  *
- * Return:      Non-negative on success/Negative on failure or if there was
- *		an attempt to flush a protected item.
+ *              Creating a flush dependency between two entries will also pin
+ *              the parent entry.
  *
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  John Mainzer, 10/7/04
+ * Programmer:  Quincey Koziol
+ *              3/05/09
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5C__auto_adjust_cache_size(H5F_t * f,
-                            hid_t primary_dxpl_id,
-                            hid_t secondary_dxpl_id,
-                            hbool_t write_permitted,
-                            hbool_t * first_flush_ptr)
+herr_t
+H5C_create_flush_dependency(void * parent_thing, void * child_thing)
 {
-    H5C_t *			cache_ptr = f->shared->cache;
-    herr_t			result;
-    hbool_t			inserted_epoch_marker = FALSE;
-    size_t			new_max_cache_size = 0;
-    size_t			old_max_cache_size = 0;
-    size_t			new_min_clean_size = 0;
-    size_t			old_min_clean_size = 0;
-    double			hit_rate;
-    enum H5C_resize_status	status = in_spec; /* will change if needed */
-    herr_t			ret_value = SUCCEED;      /* Return value */
+    H5C_t             * cache_ptr;
+    H5C_cache_entry_t *	parent_entry = (H5C_cache_entry_t *)parent_thing;   /* Ptr to parent thing's entry */
+    H5C_cache_entry_t * child_entry = (H5C_cache_entry_t *)child_thing;    /* Ptr to child thing's entry */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI(FAIL)
 
-    HDassert( f );
-    HDassert( cache_ptr );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-    HDassert( cache_ptr->cache_accesses >=
-              (cache_ptr->resize_ctl).epoch_length );
-    HDassert( (double)0.0f <= (cache_ptr->resize_ctl).min_clean_fraction );
-    HDassert( (cache_ptr->resize_ctl).min_clean_fraction <= (double)100.0f );
+    /* Sanity checks */
+    HDassert(parent_entry);
+    HDassert(parent_entry->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(H5F_addr_defined(parent_entry->addr));
+    HDassert(child_entry);
+    HDassert(child_entry->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(H5F_addr_defined(child_entry->addr));
+    cache_ptr = parent_entry->cache_ptr;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_ptr == child_entry->cache_ptr);
+#ifndef NDEBUG
+    /* Make sure the parent is not already a parent */
+    {
+        unsigned i;
 
-    if ( !cache_ptr->resize_enabled ) {
+        for(i=0; i<child_entry->flush_dep_nparents; i++)
+            HDassert(child_entry->flush_dep_parent[i] != parent_entry);
+    } /* end block */
+#endif /* NDEBUG */
 
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Auto cache resize disabled.")
-    }
+    /* More sanity checks */
+    if(child_entry == parent_entry)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTDEPEND, FAIL, "Child entry flush dependency parent can't be itself")
+    if(!(parent_entry->is_protected || parent_entry->is_pinned))
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTDEPEND, FAIL, "Parent entry isn't pinned or protected")
+
+    /* Check for parent not pinned */
+    if(!parent_entry->is_pinned) {
+        /* Sanity check */
+        HDassert(parent_entry->flush_dep_nchildren == 0);
+        HDassert(!parent_entry->pinned_from_client);
+        HDassert(!parent_entry->pinned_from_cache);
+
+        /* Pin the parent entry */
+        parent_entry->is_pinned = TRUE;
+        H5C__UPDATE_STATS_FOR_PIN(cache_ptr, parent_entry)
+    } /* end else */
 
-    HDassert( ( (cache_ptr->resize_ctl).incr_mode != H5C_incr__off ) || \
-              ( (cache_ptr->resize_ctl).decr_mode != H5C_decr__off ) );
+    /* Mark the entry as pinned from the cache's action (possibly redundantly) */
+    parent_entry->pinned_from_cache = TRUE;
 
-    if ( H5C_get_cache_hit_rate(cache_ptr, &hit_rate) != SUCCEED ) {
+    /* Check if we need to resize the child's parent array */
+    if(child_entry->flush_dep_nparents >= child_entry->flush_dep_parent_nalloc) {
+        if(child_entry->flush_dep_parent_nalloc == 0) {
+            /* Array does not exist yet, allocate it */
+            HDassert(!child_entry->flush_dep_parent);
 
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't get hit rate.")
-    }
+            if(NULL == (child_entry->flush_dep_parent = (H5C_cache_entry_t **)H5FL_BLK_MALLOC(parent, H5C_FLUSH_DEP_PARENT_INIT * sizeof(H5C_cache_entry_t *))))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for flush dependency parent list")
+            child_entry->flush_dep_parent_nalloc = H5C_FLUSH_DEP_PARENT_INIT;
+        } /* end if */
+        else {
+            /* Resize existing array */
+            HDassert(child_entry->flush_dep_parent);
 
-    HDassert( ( (double)0.0f <= hit_rate ) && ( hit_rate <= (double)1.0f ) );
+            if(NULL == (child_entry->flush_dep_parent = (H5C_cache_entry_t **)H5FL_BLK_REALLOC(parent, child_entry->flush_dep_parent, 2 * child_entry->flush_dep_parent_nalloc * sizeof(H5C_cache_entry_t *))))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for flush dependency parent list")
+            child_entry->flush_dep_parent_nalloc *= 2;
+        } /* end else */
+    } /* end if */
+
+    /* Add the dependency to the child's parent array */
+    child_entry->flush_dep_parent[child_entry->flush_dep_nparents] = parent_entry;
+    child_entry->flush_dep_nparents++;
+
+    /* Increment parent's number of children */
+    parent_entry->flush_dep_nchildren++;
+
+    /* Adjust the number of dirty children */
+    if(child_entry->is_dirty || child_entry->flush_dep_ndirty_children > 0) {
+        /* Sanity check */
+        HDassert(parent_entry->flush_dep_ndirty_children < parent_entry->flush_dep_nchildren);
+
+        parent_entry->flush_dep_ndirty_children++;
+
+        /* Propagate the flush dep dirty flag up the chain if necessary */
+        if(!parent_entry->is_dirty
+                && parent_entry->flush_dep_ndirty_children == 1)
+            if(H5C__mark_flush_dep_dirty(parent_entry) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't propagate flush dep dirty flag")
+    } /* end if */
+
+    /* Post-conditions, for successful operation */
+    HDassert(parent_entry->is_pinned);
+    HDassert(parent_entry->flush_dep_nchildren > 0);
+    HDassert(child_entry->flush_dep_parent);
+    HDassert(child_entry->flush_dep_nparents > 0);
+    HDassert(child_entry->flush_dep_parent_nalloc > 0);
+#ifndef NDEBUG
+    H5C__assert_flush_dep_nocycle(parent_entry, child_entry);
+#endif /* NDEBUG */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_create_flush_dependency() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_destroy_flush_dependency()
+ *
+ * Purpose:	Terminates a parent<-> child entry flush dependency.  The
+ *              parent entry must be pinned.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              3/05/09
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_destroy_flush_dependency(void *parent_thing, void * child_thing)
+{
+    H5C_t             * cache_ptr;
+    H5C_cache_entry_t *	parent_entry = (H5C_cache_entry_t *)parent_thing; /* Ptr to parent entry */
+    H5C_cache_entry_t *	child_entry = (H5C_cache_entry_t *)child_thing; /* Ptr to child entry */
+    unsigned            i;                      /* Local index variable */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(parent_entry);
+    HDassert(parent_entry->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(H5F_addr_defined(parent_entry->addr));
+    HDassert(child_entry);
+    HDassert(child_entry->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(H5F_addr_defined(child_entry->addr));
+    cache_ptr = parent_entry->cache_ptr;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_ptr == child_entry->cache_ptr);
+
+    /* Usage checks */
+    if(!parent_entry->is_pinned)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTUNDEPEND, FAIL, "Parent entry isn't pinned")
+    if(NULL == child_entry->flush_dep_parent)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTUNDEPEND, FAIL, "Child entry doesn't have a flush dependency parent array")
+    if(0 == parent_entry->flush_dep_nchildren)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTUNDEPEND, FAIL, "Parent entry flush dependency ref. count has no child dependencies")
+
+    /* Search for parent in child's parent array.  This is a linear search
+     * because we do not expect large numbers of parents.  If this changes, we
+     * may wish to change the parent array to a skip list */
+    for(i=0; i<child_entry->flush_dep_nparents; i++)
+        if(child_entry->flush_dep_parent[i] == parent_entry)
+            break;
+    if(i == child_entry->flush_dep_nparents)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTUNDEPEND, FAIL, "Parent entry isn't a flush dependency parent for child entry")
+
+    /* Remove parent entry from child's parent array */
+    if(i < child_entry->flush_dep_nparents - 1)
+        HDmemmove(&child_entry->flush_dep_parent[i],
+                &child_entry->flush_dep_parent[i+1],
+                (child_entry->flush_dep_nparents - i - 1)
+                * sizeof(child_entry->flush_dep_parent[0]));
+    child_entry->flush_dep_nparents--;
+
+    /* Adjust parent entry's nchildren and unpin parent if it goes to zero */
+    parent_entry->flush_dep_nchildren--;
+    if(0 == parent_entry->flush_dep_nchildren) {
+        /* Sanity check */
+        HDassert(parent_entry->pinned_from_cache);
+
+        /* Check if we should unpin parent entry now */
+        if(!parent_entry->pinned_from_client) {
+            /* Update the replacement policy if the entry is not protected */
+            if(!parent_entry->is_protected)
+                H5C__UPDATE_RP_FOR_UNPIN(cache_ptr, parent_entry, FAIL)
+
+            /* Unpin the entry now */
+            parent_entry->is_pinned = FALSE;
+
+            /* Update the stats for an unpin operation */
+            H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, parent_entry)
+        } /* end if */
+
+        /* Mark the entry as unpinned from the cache's action */
+        parent_entry->pinned_from_cache = FALSE;
+    } /* end if */
+
+    /* Adjust parent entry's ndirty_children */
+    if(child_entry->is_dirty || child_entry->flush_dep_ndirty_children > 0) {
+        /* Sanity check */
+        HDassert(parent_entry->flush_dep_ndirty_children > 0);
+
+        parent_entry->flush_dep_ndirty_children--;
+
+        /* Propagate the flush dep clean flag up the chain if necessary */
+        if(!parent_entry->is_dirty
+                && parent_entry->flush_dep_ndirty_children == 0)
+            if(H5C__mark_flush_dep_clean(parent_entry) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't propagate flush dep clean flag")
+    } /* end if */
+
+    /* Shrink or free the parent array if apporpriate */
+    if(child_entry->flush_dep_nparents == 0) {
+        child_entry->flush_dep_parent = (H5C_cache_entry_t **)H5FL_BLK_FREE(parent, child_entry->flush_dep_parent);
+        child_entry->flush_dep_parent_nalloc = 0;
+    } /* end if */
+    else if(child_entry->flush_dep_parent_nalloc > H5C_FLUSH_DEP_PARENT_INIT
+            && child_entry->flush_dep_nparents
+            <= (child_entry->flush_dep_parent_nalloc / 4)) {
+        if(NULL == (child_entry->flush_dep_parent = (H5C_cache_entry_t **)H5FL_BLK_REALLOC(parent, child_entry->flush_dep_parent, (child_entry->flush_dep_parent_nalloc / 4) * sizeof(H5C_cache_entry_t *))))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for flush dependency parent list")
+        child_entry->flush_dep_parent_nalloc /= 4;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_destroy_flush_dependency() */
+
+

+/*************************************************************************/
+/**************************** Private Functions: *************************/
+/*************************************************************************/
+
+/*-------------------------------------------------------------------------
+ *
+ * Function:	H5C__auto_adjust_cache_size
+ *
+ * Purpose:    	Obtain the current full cache hit rate, and compare it
+ *		with the hit rate thresholds for modifying cache size.
+ *		If one of the thresholds has been crossed, adjusts the
+ *		size of the cache accordingly.
+ *
+ *		The function then resets the full cache hit rate
+ *		statistics, and exits.
+ *
+ * Return:      Non-negative on success/Negative on failure or if there was
+ *		an attempt to flush a protected item.
+ *
+ *
+ * Programmer:  John Mainzer, 10/7/04
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__auto_adjust_cache_size(H5F_t * f,
+                            hid_t dxpl_id,
+                            hbool_t write_permitted)
+{
+    H5C_t *			cache_ptr = f->shared->cache;
+    herr_t			result;
+    hbool_t			inserted_epoch_marker = FALSE;
+    size_t			new_max_cache_size = 0;
+    size_t			old_max_cache_size = 0;
+    size_t			new_min_clean_size = 0;
+    size_t			old_min_clean_size = 0;
+    double			hit_rate;
+    enum H5C_resize_status	status = in_spec; /* will change if needed */
+    herr_t			ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert( f );
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( cache_ptr->cache_accesses >=
+              (cache_ptr->resize_ctl).epoch_length );
+    HDassert( (double)0.0f <= (cache_ptr->resize_ctl).min_clean_fraction );
+    HDassert( (cache_ptr->resize_ctl).min_clean_fraction <= (double)100.0f );
+
+    if ( !cache_ptr->resize_enabled ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Auto cache resize disabled.")
+    }
+
+    HDassert( ( (cache_ptr->resize_ctl).incr_mode != H5C_incr__off ) || \
+              ( (cache_ptr->resize_ctl).decr_mode != H5C_decr__off ) );
+
+    if ( H5C_get_cache_hit_rate(cache_ptr, &hit_rate) != SUCCEED ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't get hit rate.")
+    }
+
+    HDassert( ( (double)0.0f <= hit_rate ) && ( hit_rate <= (double)1.0f ) );
 
     switch ( (cache_ptr->resize_ctl).incr_mode )
     {
@@ -5938,13 +5887,11 @@ H5C__auto_adjust_cache_size(H5F_t * f,
                     } else {
 
                         result = H5C__autoadjust__ageout(f,
+                                                         dxpl_id,
                                                          hit_rate,
                                                          &status,
                                                          &new_max_cache_size,
-                                                         primary_dxpl_id,
-                                                         secondary_dxpl_id,
-                                                         write_permitted,
-                                                         first_flush_ptr);
+                                                         write_permitted);
 
                         if ( result != SUCCEED ) {
 
@@ -6087,13 +6034,11 @@ done:
  */
 static herr_t
 H5C__autoadjust__ageout(H5F_t * f,
+                        hid_t dxpl_id,
                         double hit_rate,
                         enum H5C_resize_status * status_ptr,
                         size_t * new_max_cache_size_ptr,
-                        hid_t primary_dxpl_id,
-                        hid_t secondary_dxpl_id,
-                        hbool_t write_permitted,
-                        hbool_t * first_flush_ptr)
+                        hbool_t write_permitted)
 {
     H5C_t *     cache_ptr = f->shared->cache;
     herr_t	result;
@@ -6134,8 +6079,7 @@ H5C__autoadjust__ageout(H5F_t * f,
         if ( cache_ptr->max_cache_size > (cache_ptr->resize_ctl).min_size ){
 
             /* evict aged out cache entries if appropriate... */
-            if(H5C__autoadjust__ageout__evict_aged_out_entries(f, primary_dxpl_id,
-                    secondary_dxpl_id, write_permitted, first_flush_ptr) < 0)
+            if(H5C__autoadjust__ageout__evict_aged_out_entries(f, dxpl_id, write_permitted) < 0)
                 HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "error flushing aged out entries.")
 
             /* ... and then reduce cache size if appropriate */
@@ -6332,20 +6276,31 @@ done:
  *
  * Programmer:  John Mainzer, 11/22/04
  *
+ * Changes:	Modified function to detect deletions of entries
+ *              during a scan of the LRU, and where appropriate,
+ *              restart the scan to avoid proceeding with a next
+ *              entry that is no longer in the cache.
+ *
+ *              Note the absence of checks after flushes of clean
+ *              entries.  As a second entry can only be removed by
+ *              by a call to the pre_serialize or serialize callback
+ *              of the first, and as these callbacks will not be called
+ *              on clean entries, no checks are needed.
+ *
+ *                                              JRM -- 4/6/15
+ *
  *-------------------------------------------------------------------------
  */
 static herr_t
 H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * f,
-                                                hid_t   primary_dxpl_id,
-                                                hid_t   secondary_dxpl_id,
-                                                hbool_t write_permitted,
-                                                hbool_t * first_flush_ptr)
+                                                hid_t   dxpl_id,
+                                                hbool_t write_permitted)
 {
     H5C_t *		cache_ptr = f->shared->cache;
-    herr_t              result;
     size_t		eviction_size_limit;
     size_t		bytes_evicted = 0;
     hbool_t		prev_is_dirty = FALSE;
+    hbool_t             restart_scan;
     H5C_cache_entry_t * entry_ptr;
     H5C_cache_entry_t * next_ptr;
     H5C_cache_entry_t * prev_ptr;
@@ -6374,13 +6329,19 @@ H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * f,
 
     if ( write_permitted ) {
 
+        restart_scan = FALSE;
         entry_ptr = cache_ptr->LRU_tail_ptr;
 
         while ( ( entry_ptr != NULL ) &&
                 ( (entry_ptr->type)->id != H5C__EPOCH_MARKER_TYPE ) &&
                 ( bytes_evicted < eviction_size_limit ) )
         {
+	    hbool_t		corked = FALSE;
+
+            HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
             HDassert( ! (entry_ptr->is_protected) );
+            HDassert( ! (entry_ptr->is_read_only) );
+            HDassert( (entry_ptr->ro_ref_count) == 0 );
 
 	    next_ptr = entry_ptr->next;
             prev_ptr = entry_ptr->prev;
@@ -6390,61 +6351,61 @@ H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * f,
                 prev_is_dirty = prev_ptr->is_dirty;
             }
 
-            if ( entry_ptr->is_dirty ) {
+	    /* dirty corked entry is skipped */
+	    if(entry_ptr->is_corked && entry_ptr->is_dirty)
+		corked = TRUE;
+            else if ( entry_ptr->is_dirty ) {
+
+                /* reset entries_removed_counter and
+                 * last_entry_removed_ptr prior to the call to
+                 * H5C__flush_single_entry() so that we can spot
+                 * unexpected removals of entries from the cache,
+                 * and set the restart_scan flag if proceeding
+                 * would be likely to cause us to scan an entry
+                 * that is no longer in the cache.
+                 */
+                cache_ptr->entries_removed_counter = 0;
+                cache_ptr->last_entry_removed_ptr  = NULL;
 
-                result = H5C_flush_single_entry(f,
-                                                primary_dxpl_id,
-                                                secondary_dxpl_id,
-                                                entry_ptr->type,
-                                                entry_ptr->addr,
-                                                H5C__NO_FLAGS_SET,
-                                                first_flush_ptr,
-                                                FALSE);
-            } else {
+                if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__NO_FLAGS_SET, NULL) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush entry")
 
-                bytes_evicted += entry_ptr->size;
+                if ( ( cache_ptr->entries_removed_counter > 1 ) ||
+                     ( cache_ptr->last_entry_removed_ptr == prev_ptr ) )
 
-                result = H5C_flush_single_entry(f,
-                                                primary_dxpl_id,
-                                                secondary_dxpl_id,
-                                                entry_ptr->type,
-                                                entry_ptr->addr,
-                                                H5C__FLUSH_INVALIDATE_FLAG,
-                                                first_flush_ptr,
-                                                TRUE);
-            }
+                    restart_scan = TRUE;
+
+            } else {
 
-            if ( result < 0 ) {
+                bytes_evicted += entry_ptr->size;
 
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
-                            "unable to flush entry")
+                if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__FLUSH_INVALIDATE_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL) < 0 )
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush entry")
             }
 
             if ( prev_ptr != NULL ) {
-#ifndef NDEBUG
-                if ( prev_ptr->magic != H5C__H5C_CACHE_ENTRY_T_MAGIC ) {
 
-                    /* something horrible has happened to *prev_ptr --
-                     * scream and die.
-                     */
-                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                                "*prev_ptr corrupt")
+		if(corked)   /* dirty corked entry is skipped */
+                    entry_ptr = prev_ptr;
 
-                } else
-#endif /* NDEBUG */
-		if ( ( prev_ptr->is_dirty != prev_is_dirty )
-                         ||
-                         ( prev_ptr->next != next_ptr )
-                         ||
-                         ( prev_ptr->is_protected )
-                         ||
-                         ( prev_ptr->is_pinned ) ) {
+		else if ( ( restart_scan )
+                     ||
+                     ( prev_ptr->is_dirty != prev_is_dirty )
+                     ||
+                     ( prev_ptr->next != next_ptr )
+                     ||
+                     ( prev_ptr->is_protected )
+                     ||
+                     ( prev_ptr->is_pinned ) ) {
 
                     /* something has happened to the LRU -- start over
 		     * from the tail.
                      */
+                    restart_scan = FALSE;
                     entry_ptr = cache_ptr->LRU_tail_ptr;
 
+		    H5C__UPDATE_STATS_FOR_LRU_SCAN_RESTART(cache_ptr)
+
                 } else {
 
                     entry_ptr = prev_ptr;
@@ -6502,23 +6463,15 @@ H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * f,
 
             if ( ! (entry_ptr->is_dirty) ) {
 
-                result = H5C_flush_single_entry(f,
-                                                primary_dxpl_id,
-                                                secondary_dxpl_id,
-                                                entry_ptr->type,
-                                                entry_ptr->addr,
-                                                H5C__FLUSH_INVALIDATE_FLAG,
-                                                first_flush_ptr,
-                                                TRUE);
-
-                if ( result < 0 ) {
-
-                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
-                                "unable to flush clean entry")
-                }
+                if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__FLUSH_INVALIDATE_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush clean entry")
             }
             /* just skip the entry if it is dirty, as we can't do
              * anything with it now since we can't write.
+	     *
+	     * Since all entries are clean, serialize() will not be called,
+	     * and thus we needn't test to see if the LRU has been changed
+	     * out from under us.
              */
 
             entry_ptr = prev_ptr;
@@ -6985,68 +6938,184 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5C_flush_invalidate_cache(H5F_t * f,
-                           hid_t    primary_dxpl_id,
-                           hid_t    secondary_dxpl_id,
-			   unsigned flags)
+H5C_flush_invalidate_cache(const H5F_t * f, hid_t dxpl_id, unsigned flags)
 {
-    H5C_t *		cache_ptr = f->shared->cache;
-    herr_t              status;
-    hbool_t		first_flush = TRUE;
+    H5C_t *		cache_ptr;
+    H5C_ring_t		ring;
+    herr_t		ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(f->shared);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_ptr->slist_ptr);
+
+#if H5C_DO_SANITY_CHECKS
+{
+    int32_t		i;
+    int32_t		index_len = 0;
+    int32_t		slist_len = 0;
+    size_t		index_size = (size_t)0;
+    size_t		clean_index_size = (size_t)0;
+    size_t		dirty_index_size = (size_t)0;
+    size_t		slist_size = (size_t)0;
+
+    HDassert(cache_ptr->index_ring_len[H5C_RING_UNDEFINED] == 0);
+    HDassert(cache_ptr->index_ring_size[H5C_RING_UNDEFINED] == (size_t)0);
+    HDassert(cache_ptr->clean_index_ring_size[H5C_RING_UNDEFINED] == (size_t)0);
+    HDassert(cache_ptr->dirty_index_ring_size[H5C_RING_UNDEFINED] == (size_t)0);
+    HDassert(cache_ptr->slist_ring_len[H5C_RING_UNDEFINED] == 0);
+    HDassert(cache_ptr->slist_ring_size[H5C_RING_UNDEFINED] == (size_t)0);
+
+    for(i = H5C_RING_USER; i < H5C_RING_NTYPES; i++) {
+        index_len += cache_ptr->index_ring_len[i];
+        index_size += cache_ptr->index_ring_size[i];
+        clean_index_size += cache_ptr->clean_index_ring_size[i];
+        dirty_index_size += cache_ptr->dirty_index_ring_size[i];
+
+        slist_len += cache_ptr->slist_ring_len[i];
+        slist_size += cache_ptr->slist_ring_size[i];
+    } /* end for */
+
+    HDassert(cache_ptr->index_len == index_len);
+    HDassert(cache_ptr->index_size == index_size);
+    HDassert(cache_ptr->clean_index_size == clean_index_size);
+    HDassert(cache_ptr->dirty_index_size == dirty_index_size);
+    HDassert(cache_ptr->slist_len == slist_len);
+    HDassert(cache_ptr->slist_size == slist_size);
+}
+#endif /* H5C_DO_SANITY_CHECKS */
+
+    /* remove ageout markers if present */
+    if(cache_ptr->epoch_markers_active > 0)
+        if(H5C__autoadjust__ageout__remove_all_markers(cache_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "error removing all epoch markers.")
+
+    /* flush invalidate each ring, starting from the outermost ring and
+     * working inward.
+     */
+    ring = H5C_RING_USER;
+    while(ring < H5C_RING_NTYPES) {
+        if(H5C_flush_invalidate_ring(f, dxpl_id, ring, flags) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "flush invalidate ring failed.")
+        ring++;
+    } /* end while */
+
+    /* Invariants, after destroying all entries in the hash table */
+    if(!(flags & H5C__EVICT_ALLOW_LAST_PINS_FLAG)) {
+        HDassert(cache_ptr->index_size == 0);
+        HDassert(cache_ptr->clean_index_size == 0);
+        HDassert(cache_ptr->dirty_index_size == 0);
+        HDassert(cache_ptr->slist_len == 0);
+        HDassert(cache_ptr->slist_size == 0);
+        HDassert(cache_ptr->pel_len == 0);
+        HDassert(cache_ptr->pel_size == 0);
+        HDassert(cache_ptr->pl_len == 0);
+        HDassert(cache_ptr->pl_size == 0);
+        HDassert(cache_ptr->LRU_list_len == 0);
+        HDassert(cache_ptr->LRU_list_size == 0);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_flush_invalidate_cache() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_flush_invalidate_ring
+ *
+ * Purpose:	Flush and destroy the entries contained in the target
+ *		cache and ring.
+ *
+ *		If the ring contains protected entries, the function will
+ *		fail, as protected entries cannot be either flushed or
+ *		destroyed.  However all unprotected entries should be
+ *		flushed and destroyed before the function returns failure.
+ *
+ *		While pinned entries can usually be flushed, they cannot
+ *		be destroyed.  However, they should be unpinned when all
+ *		the entries that reference them have been destroyed (thus
+ *		reduding the pinned entry's reference count to 0, allowing
+ *		it to be unpinned).
+ *
+ *		If pinned entries are present, the function makes repeated
+ *		passes through the cache, flushing all dirty entries
+ *		(including the pinned dirty entries where permitted) and
+ *		destroying all unpinned entries.  This process is repeated
+ *		until either the cache is empty, or the number of pinned
+ *		entries stops decreasing on each pass.
+ *
+ *		If flush dependencies appear in the target ring, the 
+ *		function makes repeated passes through the cache flushing
+ *		entries in flush dependency order.
+ *
+ * Return:      Non-negative on success/Negative on failure or if there was
+ *		a request to flush all items and something was protected.
+ *
+ * Programmer:  John Mainzer
+ *		9/1/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C_flush_invalidate_ring(const H5F_t * f, hid_t dxpl_id, H5C_ring_t ring,
+    unsigned flags)
+{
+    H5C_t *		cache_ptr;
+    hbool_t             restart_slist_scan;
     int32_t		protected_entries = 0;
     int32_t		i;
-    int32_t		cur_pel_len;
-    int32_t		old_pel_len;
-    int32_t		passes = 0;
+    int32_t		cur_ring_pel_len;
+    int32_t		old_ring_pel_len;
     unsigned		cooked_flags;
+    unsigned		evict_flags;
     H5SL_node_t * 	node_ptr = NULL;
     H5C_cache_entry_t *	entry_ptr = NULL;
     H5C_cache_entry_t *	next_entry_ptr = NULL;
 #if H5C_DO_SANITY_CHECKS
-    int64_t		actual_slist_len = 0;
+    int64_t		flushed_slist_len = 0;
     int64_t		initial_slist_len = 0;
-    size_t              actual_slist_size = 0;
+    int64_t             flushed_slist_size = 0;
     size_t              initial_slist_size = 0;
+    int64_t		entry_size_change;
+    int64_t	      * entry_size_change_ptr = &entry_size_change;
+#else /* H5C_DO_SANITY_CHECKS */
+    int64_t           * entry_size_change_ptr = NULL;
 #endif /* H5C_DO_SANITY_CHECKS */
     herr_t		ret_value = SUCCEED;
 
     FUNC_ENTER_NOAPI(FAIL)
 
-    HDassert( f );
-    HDassert( cache_ptr );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-    HDassert( cache_ptr->slist_ptr );
+    HDassert(f);
+    HDassert(f->shared);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_ptr->slist_ptr);
+    HDassert(ring > H5C_RING_UNDEFINED);
+    HDassert(ring < H5C_RING_NTYPES);
+
+    HDassert(cache_ptr->epoch_markers_active == 0);
 
     /* Filter out the flags that are not relevant to the flush/invalidate.
-     * At present, only the H5C__FLUSH_CLEAR_ONLY_FLAG is kept.
      */
     cooked_flags = flags & H5C__FLUSH_CLEAR_ONLY_FLAG;
-
-    /* remove ageout markers if present */
-    if ( cache_ptr->epoch_markers_active > 0 ) {
-
-        status = H5C__autoadjust__ageout__remove_all_markers(cache_ptr);
-
-        if ( status != SUCCEED ) {
-
-            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                        "error removing all epoch markers.")
-        }
-    }
+    evict_flags = flags & H5C__EVICT_ALLOW_LAST_PINS_FLAG;
 
     /* The flush proceedure here is a bit strange.
      *
      * In the outer while loop we make at least one pass through the
-     * cache, and then repeat until either all the pinned entries
-     * unpin themselves, or until the number of pinned entries stops
-     * declining.  In this later case, we scream and die.
+     * cache, and then repeat until either all the pinned entries in 
+     * the ring unpin themselves, or until the number of pinned entries 
+     * in the ring stops declining.  In this later case, we scream and die.
      *
      * Since the fractal heap can dirty, resize, and/or move entries
      * in is flush callback, it is possible that the cache will still
-     * contain dirty entries at this point.  If so, we must make up to
-     * H5C__MAX_PASSES_ON_FLUSH more passes through the skip list
-     * to allow it to empty.  If is is not empty at this point, we again
-     * scream and die.
+     * contain dirty entries at this point.  If so, we must make more
+     * passes through the skip list to allow it to empty.
      *
      * Further, since clean entries can be dirtied, resized, and/or moved
      * as the result of a flush call back (either the entries own, or that
@@ -7065,47 +7134,28 @@ H5C_flush_invalidate_cache(H5F_t * f,
      * to increasing address order, but there are no guarantees.
      */
 
-    cur_pel_len = cache_ptr->pel_len;
-    old_pel_len = cache_ptr->pel_len;
-
-    while ( cache_ptr->index_len > 0 )
-    {
-	/* first, try to flush-destroy any dirty entries.   Do this by
-	 * making a scan through the slist.  Note that new dirty entries
-	 * may be created by the flush call backs.  Thus it is possible
-	 * that the slist will not be empty after we finish the scan.
-	 */
-
-        if ( cache_ptr->slist_len == 0 ) {
-
-            node_ptr = NULL;
-            HDassert( cache_ptr->slist_size == 0 );
-
-        } else {
-
-            node_ptr = H5SL_first(cache_ptr->slist_ptr);
-
-            if ( node_ptr == NULL ) {
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "slist_len != 0 && node_ptr == NULL");
-            }
-
-            next_entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+    /* compute the number of pinned entries in this ring */
+    entry_ptr = cache_ptr->pel_head_ptr;
+    cur_ring_pel_len = 0;
+    while(entry_ptr != NULL) {
+        HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+        HDassert(entry_ptr->ring >= ring);
+        if(entry_ptr->ring == ring)
+            cur_ring_pel_len++;
 
-            if ( next_entry_ptr == NULL ) {
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "next_entry_ptr == NULL 1 ?!?!");
-            }
-#ifndef NDEBUG
-	    HDassert( next_entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC );
-#endif /* NDEBUG */
-            HDassert( next_entry_ptr->is_dirty );
-            HDassert( next_entry_ptr->in_slist );
+        entry_ptr = entry_ptr->next;
+    } /* end while */
 
-        }
+    old_ring_pel_len = cur_ring_pel_len;
+    while(cache_ptr->index_ring_len[ring] > 0) {
+        /* first, try to flush-destroy any dirty entries.   Do this by
+         * making a scan through the slist.  Note that new dirty entries
+         * may be created by the flush call backs.  Thus it is possible
+         * that the slist will not be empty after we finish the scan.
+         */
 
 #if H5C_DO_SANITY_CHECKS
-        /* Depending on circumstances, H5C_flush_single_entry() will
+        /* Depending on circumstances, H5C__flush_single_entry() will
          * remove dirty entries from the slist as it flushes them.
          * Thus for sanity checks we must make note of the initial
          * slist length and size before we do any flushes.
@@ -7114,100 +7164,102 @@ H5C_flush_invalidate_cache(H5F_t * f,
         initial_slist_size = cache_ptr->slist_size;
 
         /* There is also the possibility that entries will be
-         * dirtied, resized, and/or moved as the result of
-         * calls to the flush callbacks.  We use the slist_len_increase
-         * and slist_size_increase increase fields in struct H5C_t
-         * to track these changes for purpose of sanity checking.
+         * dirtied, resized, moved, and/or removed from the cache
+         * as the result of calls to the flush callbacks.  We use 
+         * the slist_len_increase and slist_size_increase increase 
+         * fields in struct H5C_t to track these changes for purpose 
+         * of sanity checking.
+         *
          * To this end, we must zero these fields before we start
          * the pass through the slist.
          */
         cache_ptr->slist_len_increase = 0;
         cache_ptr->slist_size_increase = 0;
 
-	/* Finally, reset the actual_slist_len and actual_slist_size
-	 * fields to zero, as these fields are used to accumulate
-	 * the slist lenght and size that we see as we scan through
-	 * the slist.
-	 */
-	actual_slist_len = 0;
-	actual_slist_size = 0;
+        /* Finally, reset the flushed_slist_len and flushed_slist_size
+         * fields to zero, as these fields are used to accumulate
+         * the slist lenght and size that we see as we scan through
+         * the slist.
+         */
+        flushed_slist_len = 0;
+        flushed_slist_size = 0;
 #endif /* H5C_DO_SANITY_CHECKS */
 
-        while ( node_ptr != NULL )
-        {
+        /* set the cache_ptr->slist_change_in_pre_serialize and
+         * cache_ptr->slist_change_in_serialize to false.
+         *
+         * These flags are set to TRUE by H5C__flush_single_entry if the
+         * slist is modified by a pre_serialize or serialize call 
+         * respectively.
+         *
+         * H5C_flush_invalidate_cache() uses these flags to detect any 
+         * modifications to the slist that might corrupt the scan of 
+         * the slist -- and restart the scan in this event.
+         */
+        cache_ptr->slist_change_in_pre_serialize = FALSE;
+        cache_ptr->slist_change_in_serialize = FALSE;
+
+        /* this done, start the scan of the slist */
+        restart_slist_scan = TRUE;
+        while(restart_slist_scan || (node_ptr != NULL)) {
+            if(restart_slist_scan) {
+                restart_slist_scan = FALSE;
+
+                /* Start at beginning of skip list */
+                node_ptr = H5SL_first(cache_ptr->slist_ptr);
+                if(node_ptr == NULL)
+                    /* the slist is empty -- break out of inner loop */
+                    break;
+
+                /* Get cache entry for this node */
+                next_entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+                if(NULL == next_entry_ptr)
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "next_entry_ptr == NULL ?!?!")
+
+                HDassert(next_entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+                HDassert(next_entry_ptr->is_dirty);
+                HDassert(next_entry_ptr->in_slist);
+                HDassert(next_entry_ptr->ring >= ring);
+            } /* end if */
+
             entry_ptr = next_entry_ptr;
 
-            /* With the advent of the fractal heap, it is possible
-             * that the flush callback will dirty and/or resize
-             * other entries in the cache.  In particular, while
-             * Quincey has promised me that this will never happen,
-             * it is possible that the flush callback for an
-             * entry may protect an entry that is not in the cache,
-             * perhaps causing the cache to flush and possibly
-             * evict the entry associated with node_ptr to make
-             * space for the new entry.
+            /* It is possible that entries will be dirtied, resized, 
+             * flushed, or removed from the cache via the take ownership
+             * flag as the result of pre_serialize or serialized callbacks. 
+             * 
+             * This in turn can corrupt the scan through the slist.
              *
-             * Thus we do a bit of extra sanity checking on entry_ptr,
-             * and break out of this scan of the skip list if we
-             * detect major problems.  We have a bit of leaway on the
-             * number of passes though the skip list, so this shouldn't
-             * be an issue in the flush in and of itself, as it should
-             * be all but impossible for this to happen more than once
-             * in any flush.
-             *
-             * Observe that that breaking out of the scan early
-             * shouldn't break the sanity checks just after the end
-	     * of this while loop.
-	     *
-	     * If an entry has merely been marked clean and removed from
-	     * the s-list, we simply break out of the scan.
-	     *
-	     * If the entry has been evicted, we flag an error and
-	     * exit.
+             * We test for slist modifications in the pre_serialize 
+             * and serialize callbacks, and restart the scan of the 
+             * slist if we find them.  However, best we do some extra
+             * sanity checking just in case.
              */
-#ifndef NDEBUG
-	    if ( entry_ptr->magic != H5C__H5C_CACHE_ENTRY_T_MAGIC ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "entry_ptr->magic is invalid ?!?!");
-
-	    } else
-#endif /* NDEBUG */
-	    if ( ( ! entry_ptr->is_dirty ) ||
-                 ( ! entry_ptr->in_slist ) ) {
-
-                /* the s-list has been modified out from under us.
-	         * break out of the loop.
-                 */
-                break;
-            }
+            HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+            HDassert(entry_ptr->in_slist);
+            HDassert(entry_ptr->is_dirty);
+            HDassert(entry_ptr->ring >= ring);
 
             /* increment node pointer now, before we delete its target
              * from the slist.
              */
             node_ptr = H5SL_next(node_ptr);
-            if ( node_ptr != NULL ) {
-
+            if(node_ptr != NULL) {
                 next_entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
-                if ( next_entry_ptr == NULL ) {
-                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                                "next_entry_ptr == NULL 2 ?!?!");
-	        }
-#ifndef NDEBUG
-		HDassert( next_entry_ptr->magic ==
-                          H5C__H5C_CACHE_ENTRY_T_MAGIC );
-#endif /* NDEBUG */
-                HDassert( next_entry_ptr->is_dirty );
-                HDassert( next_entry_ptr->in_slist );
-
-            } else {
-
+                if(NULL == next_entry_ptr)
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "next_entry_ptr == NULL ?!?!")
+                HDassert(next_entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+                HDassert(next_entry_ptr->is_dirty);
+                HDassert(next_entry_ptr->in_slist);
+                HDassert(next_entry_ptr->ring >= ring);
+                HDassert(entry_ptr != next_entry_ptr);
+            } /* end if */
+            else
                 next_entry_ptr = NULL;
-	    }
 
             /* Note that we now remove nodes from the slist as we flush
-	     * the associated entries, instead of leaving them there
-	     * until we are done, and then destroying all nodes in
+             * the associated entries, instead of leaving them there
+             * until we are done, and then destroying all nodes in
              * the slist.
              *
              * While this optimization used to be easy, with the possibility
@@ -7215,263 +7267,627 @@ H5C_flush_invalidate_cache(H5F_t * f,
              * flush, we must keep the slist in cannonical form at all
              * times.
              */
-
-            HDassert( entry_ptr != NULL );
-            HDassert( entry_ptr->in_slist );
+            HDassert(entry_ptr != NULL);
+            HDassert(entry_ptr->in_slist);
+
+            if(((!entry_ptr->flush_me_last) ||
+                    ((entry_ptr->flush_me_last) &&
+                        (cache_ptr->num_last_entries >= cache_ptr->slist_len))) &&
+                    (entry_ptr->flush_dep_nchildren == 0) &&
+                    (entry_ptr->ring == ring)) {
+                if(entry_ptr->is_protected) {
+                    /* we have major problems -- but lets flush
+                     * everything we can before we flag an error.
+                     */
+                    protected_entries++;
+                } else if(entry_ptr->is_pinned) {
 
 #if H5C_DO_SANITY_CHECKS
-            /* update actual_slist_len & actual_slist_size before
-	     * the flush.  Note that the entry will be removed
-	     * from the slist after the flush, and thus may be
-	     * resized by the flush callback.  This is OK, as
-	     * we will catch the size delta in
-	     * cache_ptr->slist_size_increase.
-	     *
-	     * Note that we include pinned entries in this count, even
-	     * though we will not actually flush them.
-	     */
-            actual_slist_len++;
-            actual_slist_size += entry_ptr->size;
+                    /* update flushed_slist_len & flushed_slist_size 
+                     * before the flush.  Note that the entry will 
+                     * be removed from the slist after the flush, 
+                     * and thus may be resized by the flush callback.
+                     * This is OK, as we will catch the size delta in
+                     * cache_ptr->slist_size_increase.
+                     *
+                     */
+                    flushed_slist_len++;
+                    flushed_slist_size += (int64_t)entry_ptr->size;
+                    entry_size_change = 0;
 #endif /* H5C_DO_SANITY_CHECKS */
 
-            if ( entry_ptr->is_protected ) {
-
-                /* we have major problems -- but lets flush
-                 * everything we can before we flag an error.
-                 */
-	        protected_entries++;
-
-            } else if ( entry_ptr->is_pinned ) {
+                    if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__NO_FLAGS_SET, entry_size_change_ptr) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "dirty pinned entry flush failed.")
+#if H5C_DO_SANITY_CHECKS
+                    /* entry size may have changed during the flush.
+                     * Update flushed_slist_size to account for this.
+                     */
+                    flushed_slist_size += entry_size_change;
+#endif /* H5C_DO_SANITY_CHECKS */
 
-		/* Test to see if we are can flush the entry now.
-                 * If we can, go ahead and flush, but don't tell
-                 * H5C_flush_single_entry() to destroy the entry
-                 * as pinned entries can't be evicted.
-                 */
-		if ( TRUE ) { /* When we get to multithreaded cache,
-			       * we will need either locking code, and/or
-			       * a test to see if the entry is in flushable
-			       * condition here.
-			       */
-
-                    status = H5C_flush_single_entry(f,
-                                                    primary_dxpl_id,
-                                                    secondary_dxpl_id,
-                                                    NULL,
-                                                    entry_ptr->addr,
-                                                    H5C__NO_FLAGS_SET,
-                                                    &first_flush,
-                                                    FALSE);
-                    if ( status < 0 ) {
-
-                        /* This shouldn't happen -- if it does, we are toast
-                         * so just scream and die.
+                    if((cache_ptr->slist_change_in_serialize) ||
+                            (cache_ptr->slist_change_in_pre_serialize)) {
+                        /* The slist has been modified by something
+                         * other than the simple removal of the
+                         * of the flushed entry after the flush.
+                         *
+                         * This has the potential to corrupt the
+                         * scan through the slist, so restart it.
                          */
+                        restart_slist_scan = TRUE;
+                        cache_ptr->slist_change_in_pre_serialize = FALSE;
+                        cache_ptr->slist_change_in_serialize = FALSE;
+                        H5C__UPDATE_STATS_FOR_SLIST_SCAN_RESTART(cache_ptr);
+                    } /* end if */
+                } /* end if */
+                else {
+#if H5C_DO_SANITY_CHECKS
+                    /* update flushed_slist_len & flushed_slist_size 
+                     * before the flush.  Note that the entry will 
+                     * be removed from the slist after the flush, 
+                     * and thus may be resized by the flush callback.
+                     * This is OK, as we will catch the size delta in
+                     * cache_ptr->slist_size_increase.
+                     *
+                     */
+                    flushed_slist_len++;
+                    flushed_slist_size += (int64_t)entry_ptr->size;
+                    entry_size_change = 0;
+#endif /* H5C_DO_SANITY_CHECKS */
 
-                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
-                                    "dirty pinned entry flush failed.")
-                    }
-                }
-            } else {
-
-                status = H5C_flush_single_entry(f,
-                                                primary_dxpl_id,
-                                                secondary_dxpl_id,
-                                                NULL,
-                                                entry_ptr->addr,
-                                                (cooked_flags | H5C__FLUSH_INVALIDATE_FLAG),
-                                                &first_flush,
-                                                TRUE);
-                if ( status < 0 ) {
-
-                    /* This shouldn't happen -- if it does, we are toast so
-                     * just scream and die.
+                    if(H5C__flush_single_entry(f, dxpl_id, entry_ptr,
+                                (cooked_flags | H5C__FLUSH_INVALIDATE_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG), 
+                                entry_size_change_ptr) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "dirty entry flush destroy failed.")
+#if H5C_DO_SANITY_CHECKS
+                    /* entry size may have changed during the flush.
+                     * Update flushed_slist_size to account for this.
                      */
+                    flushed_slist_size += entry_size_change;
+#endif /* H5C_DO_SANITY_CHECKS */
 
-                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
-                                "dirty entry flush destroy failed.")
-                }
-            }
+                    if((cache_ptr->slist_change_in_serialize) ||
+                            (cache_ptr->slist_change_in_pre_serialize)) {
+                        /* The slist has been modified by something
+                         * other than the simple removal of the
+                         * of the flushed entry after the flush.
+                         *
+                         * This has the potential to corrupt the
+                         * scan through the slist, so restart it.
+                         */
+                        restart_slist_scan = TRUE;
+                        cache_ptr->slist_change_in_pre_serialize = FALSE;
+                        cache_ptr->slist_change_in_serialize = FALSE;
+                        H5C__UPDATE_STATS_FOR_SLIST_SCAN_RESTART(cache_ptr)
+                    } /* end if */
+                } /* end else */
+            } /* end if */
         } /* end while loop scanning skip list */
 
 #if H5C_DO_SANITY_CHECKS
-	/* It is possible that entries were added to the slist during
-	 * the scan, either before or after scan pointer.  The following
-	 * asserts take this into account.
+        /* It is possible that entries were added to the slist during
+         * the scan, either before or after scan pointer.  The following
+         * asserts take this into account.
          *
          * Don't bother with the sanity checks if node_ptr != NULL, as
          * in this case we broke out of the loop because it got changed
          * out from under us.
          */
 
-	if ( node_ptr == NULL ) {
-
-            HDassert( (actual_slist_len + cache_ptr->slist_len) ==
-		      (initial_slist_len + cache_ptr->slist_len_increase) );
-            HDassert( (actual_slist_size + cache_ptr->slist_size) ==
-		      (initial_slist_size + cache_ptr->slist_size_increase) );
-	}
+        if(node_ptr == NULL) {
+            HDassert((flushed_slist_len + cache_ptr->slist_len) ==
+                    (initial_slist_len + cache_ptr->slist_len_increase));
+            HDassert((flushed_slist_size + (int64_t)cache_ptr->slist_size) ==
+                    ((int64_t)initial_slist_size + cache_ptr->slist_size_increase));
+        } /* end if */
 #endif /* H5C_DO_SANITY_CHECKS */
 
         /* Since we are doing a destroy, we must make a pass through
          * the hash table and try to flush - destroy all entries that
          * remain.
-	 *
-	 * It used to be that all entries remaining in the cache at
-	 * this point had to be clean, but with the fractal heap mods
-	 * this may not be the case.  If so, we will flush entries out
-	 * of increasing address order.
-	 *
-	 * Writes to disk are possible here.
+         *
+         * It used to be that all entries remaining in the cache at
+         * this point had to be clean, but with the fractal heap mods
+         * this may not be the case.  If so, we will flush entries out
+         * of increasing address order.
+         *
+         * Writes to disk are possible here.
          */
-        for ( i = 0; i < H5C__HASH_TABLE_LEN; i++ )
-        {
-	    next_entry_ptr = cache_ptr->index[i];
+        for(i = 0; i < H5C__HASH_TABLE_LEN; i++) {
+            next_entry_ptr = cache_ptr->index[i];
 
-            while ( next_entry_ptr != NULL )
-            {
+            while(next_entry_ptr != NULL) {
                 entry_ptr = next_entry_ptr;
+                HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+                HDassert(entry_ptr->ring >= ring);
 
                 next_entry_ptr = entry_ptr->ht_next;
-#ifndef NDEBUG
-		HDassert ( ( next_entry_ptr == NULL ) ||
-                           ( next_entry_ptr->magic ==
-                             H5C__H5C_CACHE_ENTRY_T_MAGIC ) );
-#endif /* NDEBUG */
-                if ( entry_ptr->is_protected ) {
-#ifndef NDEBUG
-                    HDassert( entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC );
-#endif /* NDEBUG */
-
-                    /* we have major problems -- but lets flush and destroy
-                     * everything we can before we flag an error.
-                     */
-	            protected_entries++;
+                HDassert((next_entry_ptr == NULL) ||
+                        (next_entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC));
+
+                if(((!entry_ptr->flush_me_last) ||
+                       ((entry_ptr->flush_me_last) &&
+                            (cache_ptr->num_last_entries >= cache_ptr->slist_len))) &&
+                       (entry_ptr->flush_dep_nchildren == 0) &&
+                       (entry_ptr->ring == ring)) {
+
+                    if(entry_ptr->is_protected) {
+                        /* we have major problems -- but lets flush and 
+                         * destroy everything we can before we flag an 
+                         * error.
+                         */
+                        protected_entries++;
+                        if(!entry_ptr->in_slist)
+                            HDassert(!(entry_ptr->is_dirty));
+                    } else if(!(entry_ptr->is_pinned)) {
+
+                        /* if *entry_ptr is dirty, it is possible 
+                         * that one or more other entries may be 
+                         * either removed from the cache, loaded 
+                         * into the cache, or moved to a new location
+                         * in the file as a side effect of the flush.
+                         *
+                         * If this happens, and one of the target 
+                         * entries happens to be the next entry in 
+                         * the hash bucket, we could find ourselves 
+                         * either find ourselves either scanning a 
+                         * non-existant entry, scanning through a 
+                         * different bucket, or skipping an entry.
+                         *
+                         * Neither of these are good, so restart the 
+                         * the scan at the head of the hash bucket 
+                         * after the flush if *entry_ptr was dirty,
+                         * on the off chance that the next entry was
+                         * a target.
+                         *
+                         * This is not as inefficient at it might seem,
+                         * as hash buckets typically have at most two
+                         * or three entries.
+                         */
+                        hbool_t entry_was_dirty;
 
-                    if ( ! entry_ptr->in_slist ) {
+                        entry_was_dirty = entry_ptr->is_dirty;
 
-                        HDassert( !(entry_ptr->is_dirty) );
-                    }
-                } else if ( ! ( entry_ptr->is_pinned ) ) {
-
-                    status = H5C_flush_single_entry(f,
-                                                    primary_dxpl_id,
-                                                    secondary_dxpl_id,
-                                                    NULL,
-                                                    entry_ptr->addr,
-                                                    (cooked_flags | H5C__FLUSH_INVALIDATE_FLAG),
-                                                    &first_flush,
-                                                    TRUE);
-                    if ( status < 0 ) {
-
-                        /* This shouldn't happen -- if it does, we are toast so
-                         * just scream and die.
-                         */
+                        if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, 
+                                (cooked_flags | H5C__FLUSH_INVALIDATE_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG),
+                                NULL) < 0)
+                            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Entry flush destroy failed.")
 
-                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
-                                    "Entry flush destroy failed.")
-                    }
-                }
-	        /* We can't do anything if the entry is pinned.  The
-		 * hope is that the entry will be unpinned as the
-		 * result of destroys of entries that reference it.
-		 *
-		 * We detect this by noting the change in the number
-		 * of pinned entries from pass to pass.  If it stops
-		 * shrinking before it hits zero, we scream and die.
-		 */
-                /* if the flush function on the entry we last evicted
+                        if(entry_was_dirty) {
+                            /* update stats for hash bucket scan
+                             * restart here.
+                             *                   -- JRM 
+                             */
+                            next_entry_ptr = cache_ptr->index[i];
+                            H5C__UPDATE_STATS_FOR_HASH_BUCKET_SCAN_RESTART(cache_ptr)
+                        } /* end if */
+                    } /* end if */
+                } /* end if */
+
+                /* We can't do anything if the entry is pinned.  The
+                 * hope is that the entry will be unpinned as the
+                 * result of destroys of entries that reference it.
+                 *
+                 * We detect this by noting the change in the number
+                 * of pinned entries from pass to pass.  If it stops
+                 * shrinking before it hits zero, we scream and die.
+                 */
+                /* if the serialize function on the entry we last evicted
                  * loaded an entry into cache (as Quincey has promised me
                  * it never will), and if the cache was full, it is
                  * possible that *next_entry_ptr was flushed or evicted.
                  *
                  * Test to see if this happened here.  Note that if this
-		 * test is triggred, we are accessing a deallocated piece
-		 * of dynamically allocated memory, so we just scream and
-		 * die.
+                 * test is triggred, we are accessing a deallocated piece
+                 * of dynamically allocated memory, so we just scream and
+                 * die.
+                 *
+                 * Update: The code to restart the scan after flushes
+                 *         of dirty entries should make it impossible 
+                 *         to satisfy the following test.  Leave it in
+                 *         in case I am wrong.
+                 *                                    -- JRM
                  */
-#ifndef NDEBUG
-                if ( ( next_entry_ptr != NULL ) &&
-                     ( next_entry_ptr->magic !=
-                       H5C__H5C_CACHE_ENTRY_T_MAGIC ) ) {
-
+                if((next_entry_ptr != NULL) && (next_entry_ptr->magic != H5C__H5C_CACHE_ENTRY_T_MAGIC))
                     /* Something horrible has happened to
                      * *next_entry_ptr -- scream and die.
                      */
-                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                                "next_entry_ptr->magic is invalid?!?!?.")
-                }
-#endif /* NDEBUG */
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "next_entry_ptr->magic is invalid?!?!?.")
             } /* end while loop scanning hash table bin */
         } /* end for loop scanning hash table */
 
-	old_pel_len = cur_pel_len;
-	cur_pel_len = cache_ptr->pel_len;
+	old_ring_pel_len = cur_ring_pel_len;
+        entry_ptr = cache_ptr->pel_head_ptr;
+        cur_ring_pel_len = 0;
+        while(entry_ptr != NULL) {
+            HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+            HDassert(entry_ptr->ring >= ring);
+
+	    if(entry_ptr->ring == ring)
+                cur_ring_pel_len++;
+
+            entry_ptr = entry_ptr->next;
+        } /* end while */
 
-	if ( ( cur_pel_len > 0 ) && ( cur_pel_len >= old_pel_len ) ) {
+	if((cur_ring_pel_len > 0) && (cur_ring_pel_len >= old_ring_pel_len)) {
+            /* Don't error if allowed to have pinned entries remaining */
+	    if(evict_flags)
+                HGOTO_DONE(TRUE)
 
-	   /* The number of pinned entries is positive, and it is not
-	    * declining.  Scream and die.
+	   /* The number of pinned entries in the ring is positive, and 
+            * it is not declining.  Scream and die.
 	    */
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Pinned entry count not decreasing, cur_ring_pel_len = %d, old_ring_pel_len = %d, ring = %d", (int)cur_ring_pel_len, (int)old_ring_pel_len, (int)ring)
+        } /* end if */
 
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
-                        "Pinned entry count not decreasing, cur_pel_len = %d, old_pel_len = %d", (int)cur_pel_len, (int)old_pel_len)
+        HDassert(protected_entries == cache_ptr->pl_len);
+        if((protected_entries > 0) && (protected_entries == cache_ptr->index_len))
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Only protected entries left in cache, protected_entries = %d", (int)protected_entries)
+    } /* main while loop */
 
-        } else if ( ( cur_pel_len == 0 ) && ( old_pel_len == 0 ) ) {
+    /* Invariants, after destroying all entries in the ring */
+    for(i = (int)H5C_RING_UNDEFINED; i <= (int)ring; i++) {
+        HDassert(cache_ptr->index_ring_len[i] == 0);
+        HDassert(cache_ptr->index_ring_size[i] == (size_t)0);
+        HDassert(cache_ptr->clean_index_ring_size[i] == (size_t)0);
+        HDassert(cache_ptr->dirty_index_ring_size[i] == (size_t)0);
 
-	    /* increment the pass count */
-	    passes++;
-	}
+        HDassert(cache_ptr->slist_ring_len[i] == 0);
+        HDassert(cache_ptr->slist_ring_size[i] == (size_t)0);
+    } /* end for */
 
-	if ( passes >= H5C__MAX_PASSES_ON_FLUSH ) {
+    HDassert(protected_entries <= cache_ptr->pl_len);
 
-	    /* we have exceeded the maximum number of passes through the
-	     * cache to flush and destroy all entries.  Scream and die.
-	     */
+    if(protected_entries > 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Cache has protected entries.")
+    else if(cur_ring_pel_len > 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't unpin all pinned entries in ring.")
 
-            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
-	                "Maximum passes on flush exceeded.")
-	}
-    } /* main while loop */
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_flush_invalidate_ring() */
 
-    /* Invariants, after destroying all entries in the hash table */
-    HDassert( cache_ptr->index_size == 0 );
-    HDassert( cache_ptr->clean_index_size == 0 );
-    HDassert( cache_ptr->dirty_index_size == 0 );
-    HDassert( cache_ptr->slist_len == 0 );
-    HDassert( cache_ptr->slist_size == 0 );
-    HDassert( cache_ptr->pel_len == 0 );
-    HDassert( cache_ptr->pel_size == 0 );
-    HDassert( cache_ptr->pl_len == 0 );
-    HDassert( cache_ptr->pl_size == 0 );
-    HDassert( cache_ptr->LRU_list_len == 0 );
-    HDassert( cache_ptr->LRU_list_size == 0 );
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_flush_ring
+ *
+ * Purpose:	Flush the entries contained in the specified cache and 
+ *		ring.  All entries in rings outside the specified ring
+ *		must have been flushed on entry.
+ *
+ *		If the cache contains protected entries in the specified
+ *		ring, the function will fail, as protected entries cannot 
+ *		be flushed.  However all unprotected entries in the target
+ *		ring should be flushed before the function returns failure.
+ *
+ *		If flush dependencies appear in the target ring, the 
+ *		function makes repeated passes through the slist flushing
+ *		entries in flush dependency order.
+ *
+ * Return:      Non-negative on success/Negative on failure or if there was
+ *		a request to flush all items and something was protected.
+ *
+ * Programmer:  John Mainzer
+ *		9/1/15
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_flush_ring(H5F_t *f, hid_t dxpl_id, H5C_ring_t ring,  unsigned flags)
+{
+    H5C_t * cache_ptr = f->shared->cache;
+    hbool_t		destroy;
+    hbool_t		flushed_entries_last_pass;
+    hbool_t		flush_marked_entries;
+    hbool_t		ignore_protected;
+    hbool_t		tried_to_flush_protected_entry = FALSE;
+    hbool_t		restart_slist_scan;
+    int32_t		protected_entries = 0;
+    H5SL_node_t * 	node_ptr = NULL;
+    H5C_cache_entry_t *	entry_ptr = NULL;
+    H5C_cache_entry_t *	next_entry_ptr = NULL;
+#if H5C_DO_SANITY_CHECKS
+    int64_t		flushed_entries_count = 0;
+    int64_t		flushed_entries_size = 0;
+    int64_t		initial_slist_len = 0;
+    size_t              initial_slist_size = 0;
+    int64_t		entry_size_change;
+    int64_t	      * entry_size_change_ptr = &entry_size_change;
+#else /* H5C_DO_SANITY_CHECKS */
+    int64_t           * entry_size_change_ptr = NULL;
+#endif /* H5C_DO_SANITY_CHECKS */
+    int                 i;
+    herr_t		ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(cache_ptr->slist_ptr);
+    HDassert((flags & H5C__FLUSH_INVALIDATE_FLAG) == 0);
+    HDassert(ring > H5C_RING_UNDEFINED);
+    HDassert(ring < H5C_RING_NTYPES);
 
+#if H5C_DO_EXTREME_SANITY_CHECKS
+    if((H5C_validate_protected_entry_list(cache_ptr) < 0) ||
+            (H5C_validate_pinned_entry_list(cache_ptr) < 0) ||
+            (H5C_validate_lru_list(cache_ptr) < 0))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "an extreme sanity check failed on entry.\n");
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
-    HDassert( protected_entries <= cache_ptr->pl_len );
+    ignore_protected = ( (flags & H5C__FLUSH_IGNORE_PROTECTED_FLAG) != 0 );
+    destroy = ( (flags & H5C__FLUSH_INVALIDATE_FLAG) != 0 );
+    flush_marked_entries = ( (flags & H5C__FLUSH_MARKED_ENTRIES_FLAG) != 0 );
 
-    if ( protected_entries > 0 ) {
+    if(!flush_marked_entries)
+        for(i = (int)H5C_RING_UNDEFINED; i < (int)ring; i++)
+	    HDassert(cache_ptr->slist_ring_len[i] == 0);
 
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
-	            "Cache has protected entries.")
+    HDassert(cache_ptr->flush_in_progress);
 
-    } else if ( cur_pel_len > 0 ) {
+    /* When we are only flushing marked entries, the slist will usually
+     * still contain entries when we have flushed everything we should.
+     * Thus we track whether we have flushed any entries in the last
+     * pass, and terminate if we haven't.
+     */
+    flushed_entries_last_pass = TRUE;
 
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
-	            "Can't unpin all pinned entries.")
+    /* set the cache_ptr->slist_change_in_pre_serialize and
+     * cache_ptr->slist_change_in_serialize to false.
+     *
+     * These flags are set to TRUE by H5C__flush_single_entry if the 
+     * slist is modified by a pre_serialize or serialize call respectively.
+     * H5C_flush_cache uses these flags to detect any modifications
+     * to the slist that might corrupt the scan of the slist -- and 
+     * restart the scan in this event.
+     */
+    cache_ptr->slist_change_in_pre_serialize = FALSE;
+    cache_ptr->slist_change_in_serialize = FALSE;
 
-    }
+    while((cache_ptr->slist_ring_len[ring] > 0) &&
+	    (protected_entries == 0)  &&
+	    (flushed_entries_last_pass)) {
+        flushed_entries_last_pass = FALSE;
 
-done:
+#if H5C_DO_SANITY_CHECKS
+        /* For sanity checking, try to verify that the skip list has
+         * the expected size and number of entries at the end of each
+         * internal while loop (see below).
+         *
+         * Doing this get a bit tricky, as depending on flags, we may
+         * or may not flush all the entries in the slist.
+         *
+         * To make things more entertaining, with the advent of the
+         * fractal heap, the entry serialize callback can cause entries
+         * to be dirtied, resized, and/or moved.  Also, the 
+         * pre_serialize callback can result in an entry being 
+         * removed from the cache via the take ownership flag.
+         *
+         * To deal with this, we first make note of the initial
+         * skip list length and size:
+         */
+        initial_slist_len = cache_ptr->slist_len;
+        initial_slist_size = cache_ptr->slist_size;
 
-    FUNC_LEAVE_NOAPI(ret_value)
+        /* We then zero counters that we use to track the number
+         * and total size of entries flushed:
+         */
+        flushed_entries_count = 0;
+        flushed_entries_size = 0;
+
+        /* As mentioned above, there is the possibility that
+         * entries will be dirtied, resized, flushed, or removed
+         * from the cache via the take ownership flag  during
+         * our pass through the skip list.  To capture the number
+         * of entries added, and the skip list size delta,
+         * zero the slist_len_increase and slist_size_increase of
+         * the cache's instance of H5C_t.  These fields will be
+         * updated elsewhere to account for slist insertions and/or
+         * dirty entry size changes.
+         */
+        cache_ptr->slist_len_increase = 0;
+        cache_ptr->slist_size_increase = 0;
 
-} /* H5C_flush_invalidate_cache() */
+        /* at the end of the loop, use these values to compute the
+         * expected slist length and size and compare this with the
+         * value recorded in the cache's instance of H5C_t.
+         */
+#endif /* H5C_DO_SANITY_CHECKS */
+
+        restart_slist_scan = TRUE;
+
+        while((restart_slist_scan ) || (node_ptr != NULL)) {
+            if(restart_slist_scan) {
+                restart_slist_scan = FALSE;
+
+                /* Start at beginning of skip list */
+                node_ptr = H5SL_first(cache_ptr->slist_ptr);
+
+                if(node_ptr == NULL)
+                    /* the slist is empty -- break out of inner loop */
+                    break;
+
+                /* Get cache entry for this node */
+                next_entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+
+                if(NULL == next_entry_ptr)
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "next_entry_ptr == NULL ?!?!")
+
+                HDassert(next_entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+                HDassert(next_entry_ptr->is_dirty);
+                HDassert(next_entry_ptr->in_slist);
+            } /* end if */
+                
+            entry_ptr = next_entry_ptr;
+
+            /* With the advent of the fractal heap, the free space
+             * manager, and the version 3 cache, it is possible
+             * that the pre-serialize or serialize callback will 
+             * dirty, resize, or take ownership of other entries 
+             * in the cache.  
+             *
+             * To deal with this, I have inserted code to detect any
+             * change in the skip list not directly under the control
+             * of this function.  If such modifications are detected,
+             * we must re-start the scan of the skip list to avoid 
+             * the possibility that the target of the next_entry_ptr
+             * may have been flushed or deleted from the cache.
+             *
+             * To verify that all such possibilities have been dealt
+             * with, we do a bit of extra sanity checking on 
+             * entry_ptr.
+             */
+            HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+            HDassert(entry_ptr->in_slist);
+            HDassert(entry_ptr->is_dirty);
+            if(!flush_marked_entries || entry_ptr->flush_marker)
+                HDassert(entry_ptr->ring >= ring);
+
+            /* increment node pointer now, before we delete its target
+             * from the slist.
+             */
+            node_ptr = H5SL_next(node_ptr);
+            if(node_ptr != NULL) {
+                next_entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+                if(NULL == next_entry_ptr)
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "next_entry_ptr == NULL ?!?!")
+
+                HDassert(next_entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+                HDassert(next_entry_ptr->is_dirty);
+                HDassert(next_entry_ptr->in_slist);
+                if(!flush_marked_entries || next_entry_ptr->flush_marker)
+                    HDassert(next_entry_ptr->ring >= ring);
+
+                HDassert(entry_ptr != next_entry_ptr);
+            } /* end if */
+            else
+                next_entry_ptr = NULL;
+
+            HDassert(entry_ptr != NULL);
+            HDassert(entry_ptr->in_slist);
+
+            if(((!flush_marked_entries) || (entry_ptr->flush_marker)) &&
+                    ((!entry_ptr->flush_me_last) ||
+                       (entry_ptr->flush_me_last &&
+                         ((cache_ptr->num_last_entries >= cache_ptr->slist_len) ||
+                           (flush_marked_entries && entry_ptr->flush_marker)))) &&
+                       ( ( entry_ptr->flush_dep_nchildren == 0 ) ||
+                         ( ( ! destroy ) &&
+                           ( entry_ptr->flush_dep_ndirty_children == 0 ) ) ) &&
+                     (entry_ptr->ring == ring)) {
+                if(entry_ptr->is_protected) {
+                    /* we probably have major problems -- but lets 
+                     * flush everything we can before we decide 
+                     * whether to flag an error.
+                     */
+                    tried_to_flush_protected_entry = TRUE;
+                    protected_entries++;
+                } /* end if */
+                else if(entry_ptr->is_pinned) {
+
+#if H5C_DO_SANITY_CHECKS
+                    flushed_entries_count++;
+                    flushed_entries_size += (int64_t)entry_ptr->size;
+                    entry_size_change = 0;
+#endif /* H5C_DO_SANITY_CHECKS */
+
+                    if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, flags, entry_size_change_ptr) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "dirty pinned entry flush failed.")
+
+#if H5C_DO_SANITY_CHECKS
+                    /* it is possible that the entry size changed
+                     * during flush -- update flushed_entries_size
+                     * to account for this.
+                     */
+                    flushed_entries_size += entry_size_change;
+#endif /* H5C_DO_SANITY_CHECKS */
+
+                    if((cache_ptr->slist_change_in_serialize) ||
+                            (cache_ptr->slist_change_in_pre_serialize)) {
+                        /* The slist has been modified by something
+                         * other than the simple removal of the 
+                         * of the flushed entry after the flush.
+                         * 
+                         * This has the potential to corrupt the
+                         * scan through the slist, so restart it.
+                         */
+                        restart_slist_scan = TRUE;
+                        cache_ptr->slist_change_in_pre_serialize = FALSE;
+                        cache_ptr->slist_change_in_serialize = FALSE;
+
+                        H5C__UPDATE_STATS_FOR_SLIST_SCAN_RESTART(cache_ptr)
+                    } /* end if */
+
+                    flushed_entries_last_pass = TRUE;
+                } /* end else-if */
+                else {
+#if H5C_DO_SANITY_CHECKS
+                    flushed_entries_count++;
+                    flushed_entries_size += (int64_t)entry_ptr->size;
+                    entry_size_change = 0;
+#endif /* H5C_DO_SANITY_CHECKS */
+                    if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, flags, entry_size_change_ptr) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush entry.")
+
+#if H5C_DO_SANITY_CHECKS
+                    /* it is possible that the entry size changed
+                     * during flush -- update flushed_entries_size
+                     * to account for this.
+                     */
+                    flushed_entries_size += entry_size_change;
+#endif /* H5C_DO_SANITY_CHECKS */
+
+                    if((cache_ptr->slist_change_in_serialize) ||
+                            (cache_ptr->slist_change_in_pre_serialize)) {
+                        /* The slist has been modified by something
+                         * other than the simple removal of the 
+                         * of the flushed entry after the flush.
+                         * 
+                         * This has the potential to corrupt the
+                         * scan through the slist, so restart it.
+                         */
+                        restart_slist_scan = TRUE;
+                        cache_ptr->slist_change_in_pre_serialize = FALSE;
+                        cache_ptr->slist_change_in_serialize = FALSE;
+
+                        H5C__UPDATE_STATS_FOR_SLIST_SCAN_RESTART(cache_ptr)
+                    } /* end if */
+
+                    flushed_entries_last_pass = TRUE;
+                } /* end else */
+            } /* end if */
+        } /* while ( ( restart_slist_scan ) || ( node_ptr != NULL ) ) */
+
+#if H5C_DO_SANITY_CHECKS
+        /* Verify that the slist size and length are as expected. */
+        HDassert((initial_slist_len + cache_ptr->slist_len_increase -
+                   flushed_entries_count) == cache_ptr->slist_len);
+        HDassert((size_t)((int64_t)initial_slist_size + 
+                   cache_ptr->slist_size_increase -
+                   flushed_entries_size) == cache_ptr->slist_size);
+#endif /* H5C_DO_SANITY_CHECKS */
+    } /* while */
+
+    HDassert(protected_entries <= cache_ptr->pl_len);
+
+    if(((cache_ptr->pl_len > 0) && (!ignore_protected)) || (tried_to_flush_protected_entry))
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "cache has protected items")
+
+#if H5C_DO_SANITY_CHECKS
+    if(!flush_marked_entries) {
+        HDassert(cache_ptr->slist_ring_len[ring] == 0);
+        HDassert(cache_ptr->slist_ring_size[ring] == 0);
+    } /* end if */
+#endif /* H5C_DO_SANITY_CHECKS */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_flush_ring() */
 
 

 /*-------------------------------------------------------------------------
  *
- * Function:    H5C_flush_single_entry
+ * Function:    H5C__flush_single_entry
  *
  * Purpose:     Flush or clear (and evict if requested) the cache entry
  *		with the specified address and type.  If the type is NULL,
@@ -7481,27 +7897,14 @@ done:
  *		Attempts to flush a protected entry will result in an
  *		error.
  *
- *		*first_flush_ptr should be true if only one
- *		flush is contemplated before the next load, or if this
- *		is the first of a sequence of flushes that will be
- *		completed before the next load.  *first_flush_ptr is set
- *		to false if a flush actually takes place, and should be
- *		left false until the end of the sequence.
- *
- *		The primary_dxpl_id is used if *first_flush_ptr is TRUE
- *		on entry, and a flush actually takes place.  The
- *		secondary_dxpl_id is used in any subsequent flush where
- *		*first_flush_ptr is FALSE on entry.
- *
  *		If the H5C__FLUSH_INVALIDATE_FLAG flag is set, the entry will
- *		be cleared and not flushed -- in the case *first_flush_ptr,
- *		primary_dxpl_id, and secondary_dxpl_id are all irrelevent,
- *		and the call can't be part of a sequence of flushes.
+ *		be cleared and not flushed, and the call can't be part of a
+ *              sequence of flushes.
  *
- *		If the caller knows the address of the TBBT node at
+ *		If the caller knows the address of the skip list node at
  *		which the target entry resides, it can avoid a lookup
  *		by supplying that address in the tgt_node_ptr parameter.
- *		If this parameter is NULL, the function will do a TBBT
+ *		If this parameter is NULL, the function will do a skip list
  *		search for the entry instead.
  *
  *		The function does nothing silently if there is no entry
@@ -7513,397 +7916,782 @@ done:
  *
  * Programmer:  John Mainzer, 5/5/04
  *
+ * Changes:	Refactored function to remove the type_ptr parameter.
+ *
+ *						JRM -- 8/7/14
+ *
+ *              Added code to check for slist changes in pre_serialize and
+ *              serialize calls, and set 
+ *              cache_ptr->slist_change_in_pre_serialize and 
+ *		cache_ptr->slist_change_in_serialize as appropriate.
+ *
+ *                                              JRM -- 12/13/14
+ *
+ *		Refactored function to delay all modifications of the 
+ *		metadata cache data structures until after any calls 
+ *		to the pre-serialize or serialize callbacks.
+ *
+ *		Need to do this, as some pre-serialize or serialize 
+ *		calls result in calls to the metadata cache and 
+ *		modifications to its data structures.  Thus, at the
+ *		time of any such call, the target entry flags and 
+ *		the metadata cache must all be consistant.
+ *
+ *		Also added the entry_size_change_ptr parameter, which 
+ *              allows the function to report back any change in the size 
+ *		of the entry during the flush.  Such size changes may 
+ *		occur during the pre-serialize callback.
+ *
+ *						JRM -- 12/24/14
+ *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5C_flush_single_entry(H5F_t *	   	   f,
-                       hid_t 		   primary_dxpl_id,
-                       hid_t 		   secondary_dxpl_id,
-                       const H5C_class_t * type_ptr,
-                       haddr_t		   addr,
-                       unsigned	     	   flags,
-                       hbool_t *	   first_flush_ptr,
-                       hbool_t		   del_entry_from_slist_on_destroy)
+herr_t
+H5C__flush_single_entry(const H5F_t *f, hid_t dxpl_id, H5C_cache_entry_t *entry_ptr,
+    unsigned flags, int64_t *entry_size_change_ptr)
 {
-    H5C_t *	     	cache_ptr = f->shared->cache;
-    hbool_t		destroy;
-    hbool_t		clear_only;
-    hbool_t		take_ownership;
+    H5C_t *	     	cache_ptr;              /* Cache for file */
+    hbool_t		destroy;		/* external flag */
+    hbool_t		clear_only;		/* external flag */
+    hbool_t		free_file_space;	/* external flag */
+    hbool_t		take_ownership;		/* external flag */
+    hbool_t             del_from_slist_on_destroy;    /* external flag */
+    hbool_t		write_entry;		/* internal flag */
+    hbool_t		destroy_entry;		/* internal flag */
     hbool_t		was_dirty;
-    hbool_t		destroy_entry;
-    herr_t		status;
-    int			type_id;
-    unsigned		flush_flags = H5C_CALLBACK__NO_FLAGS_SET;
-    H5C_cache_entry_t * entry_ptr = NULL;
+    haddr_t		new_addr = HADDR_UNDEF;
+    haddr_t		old_addr = HADDR_UNDEF;
+    size_t		new_len = 0;
+    size_t		new_compressed_len = 0;
     herr_t		ret_value = SUCCEED;      /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
-    HDassert( f );
-    HDassert( cache_ptr );
-    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-    HDassert( H5F_addr_defined(addr) );
-    HDassert( first_flush_ptr );
+    HDassert(f);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(entry_ptr);
+    HDassert(entry_ptr->ring != H5C_RING_UNDEFINED);
 
-    destroy = ( (flags & H5C__FLUSH_INVALIDATE_FLAG) != 0 );
-    clear_only = ( (flags & H5C__FLUSH_CLEAR_ONLY_FLAG) != 0);
-    take_ownership = ( (flags & H5C__TAKE_OWNERSHIP_FLAG) != 0);
+    /* If defined, initialize *entry_size_change_ptr to 0 */
+    if(entry_size_change_ptr != NULL)
+        *entry_size_change_ptr = 0;
+
+    /* setup external flags from the flags parameter */
+    destroy                = ((flags & H5C__FLUSH_INVALIDATE_FLAG) != 0);
+    clear_only             = ((flags & H5C__FLUSH_CLEAR_ONLY_FLAG) != 0);
+    free_file_space        = ((flags & H5C__FREE_FILE_SPACE_FLAG) != 0);
+    take_ownership         = ((flags & H5C__TAKE_OWNERSHIP_FLAG) != 0);
+    del_from_slist_on_destroy = ((flags & H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG) != 0);
 
     /* Set the flag for destroying the entry, based on the 'take ownership'
-     *  and 'destroy' flags
+     * and 'destroy' flags
      */
     if(take_ownership)
         destroy_entry = FALSE;
     else
         destroy_entry = destroy;
 
-    /* attempt to find the target entry in the hash table */
-    H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
+    /* we will write the entry to disk if it exists, is dirty, and if the
+     * clear only flag is not set.
+     */
+    if(entry_ptr->is_dirty && !clear_only)
+        write_entry = TRUE;
+    else
+        write_entry = FALSE;
 
+    /* run initial sanity checks */
 #if H5C_DO_SANITY_CHECKS
-    if ( entry_ptr != NULL ) {
+    HDassert( ! ( destroy && entry_ptr->is_pinned ) );
 
-        HDassert( ! ( ( destroy ) && ( entry_ptr->is_pinned ) ) );
+    if(entry_ptr->in_slist) {
+        HDassert(entry_ptr->is_dirty);
 
-        if ( entry_ptr->in_slist ) {
+        if((entry_ptr->flush_marker) && (!entry_ptr->is_dirty))
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "entry in slist failed sanity checks.")
+    } else {
+        HDassert(!entry_ptr->is_dirty);
+        HDassert(!entry_ptr->flush_marker);
 
-            if ( ( ( entry_ptr->flush_marker ) && ( ! entry_ptr->is_dirty ) ) ||
-                 ( entry_ptr->addr != addr ) ) {
+        if((entry_ptr->is_dirty) || (entry_ptr->flush_marker))
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "entry failed sanity checks.")
+    }
+#endif /* H5C_DO_SANITY_CHECKS */
 
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "entry in slist failed sanity checks.")
-            }
-        } else {
+    if(entry_ptr->is_protected) {
+	HDassert(!entry_ptr->is_protected);
 
-            if ( ( entry_ptr->is_dirty ) ||
-                 ( entry_ptr->flush_marker ) ||
-                 ( entry_ptr->addr != addr ) ) {
+        /* Attempt to flush a protected entry -- scream and die. */
+        HGOTO_ERROR(H5E_CACHE, H5E_PROTECT, FAIL, "Attempt to flush a protected entry.")
+    } /* end if */
 
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "entry failed sanity checks.")
-            }
-        }
-    }
-#endif /* H5C_DO_SANITY_CHECKS */
-
-    if ( ( entry_ptr != NULL ) && ( entry_ptr->is_protected ) )
-    {
-
-        /* Attempt to flush a protected entry -- scream and die. */
-        HGOTO_ERROR(H5E_CACHE, H5E_PROTECT, FAIL, \
-                    "Attempt to flush a protected entry.")
-    }
+    /* set entry_ptr->flush_in_progress = TRUE and set
+     * entry_ptr->flush_marker = FALSE
+     *
+     * in the parallel case, do some sanity checking in passing.
+     */
+    HDassert(entry_ptr->type);
 
-    if ( ( entry_ptr != NULL ) &&
-         ( ( type_ptr == NULL ) || ( type_ptr->id == entry_ptr->type->id ) ) )
-    {
-        /* we have work to do */
+    was_dirty = entry_ptr->is_dirty;  /* needed later for logging */
 
-	/* We will set flush_in_progress back to FALSE at the end if the
-	 * entry still exists at that point.
-	 */
-	entry_ptr->flush_in_progress = TRUE;
+    /* We will set flush_in_progress back to FALSE at the end if the
+     * entry still exists at that point.
+     */
+    entry_ptr->flush_in_progress = TRUE;
+    entry_ptr->flush_marker = FALSE;
 
 #ifdef H5_HAVE_PARALLEL
 #ifndef NDEBUG
-        /* If MPI based VFD is used, do special parallel I/O sanity checks.
-         * Note that we only do these sanity checks when the clear_only flag
-         * is not set, and the entry to be flushed is dirty.  Don't bother
-         * otherwise as no file I/O can result.
-         */
-        if(!clear_only && entry_ptr->is_dirty &&
-                H5F_HAS_FEATURE(f, H5FD_FEAT_HAS_MPI)) {
-            H5P_genplist_t *dxpl;       /* Dataset transfer property list */
-            unsigned coll_meta;         /* Collective metadata write flag */
+    /* If MPI based VFD is used, do special parallel I/O sanity checks.
+     * Note that we only do these sanity checks when the clear_only flag
+     * is not set, and the entry to be flushed is dirty.  Don't bother
+     * otherwise as no file I/O can result.
+     */
+    if(!clear_only && entry_ptr->is_dirty && H5F_HAS_FEATURE(f, H5FD_FEAT_HAS_MPI)) {
+        H5P_genplist_t *dxpl;       /* Dataset transfer property list */
+        unsigned coll_meta;         /* Collective metadata write flag */
 
-            /* Get the dataset transfer property list */
-            if(NULL == (dxpl = H5I_object(primary_dxpl_id)))
-                HGOTO_ERROR(H5E_CACHE, H5E_BADTYPE, FAIL, "not a dataset transfer property list")
+        /* Get the dataset transfer property list */
+        if(NULL == (dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+            HGOTO_ERROR(H5E_CACHE, H5E_BADTYPE, FAIL, "not a dataset transfer property list")
 
-            /* Get the collective metadata write property */
-            if(H5P_get(dxpl, H5AC_COLLECTIVE_META_WRITE_NAME, &coll_meta) < 0)
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "can't retrieve xfer mode")
+        /* Get the collective metadata write property */
+        if(H5P_get(dxpl, H5AC_COLLECTIVE_META_WRITE_NAME, &coll_meta) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, FAIL, "can't retrieve xfer mode")
 
-            /* Sanity check collective metadata write flag */
-            HDassert(coll_meta);
-        } /* end if */
+        /* Sanity check collective metadata write flag */
+        HDassert(coll_meta);
+    } /* end if */
 #endif /* NDEBUG */
 #endif /* H5_HAVE_PARALLEL */
 
-        was_dirty = entry_ptr->is_dirty;
-        type_id = entry_ptr->type->id;
-
-        entry_ptr->flush_marker = FALSE;
-
-        if ( clear_only ) {
-            H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr)
-        } else {
-            H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr)
-        }
-
-        if ( destroy ) {
-            H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr)
-        }
+    /* serialize the entry if necessary, and then write it to disk. */
+    if(write_entry) {
+        unsigned serialize_flags = H5C__SERIALIZE_NO_FLAGS_SET;
 
-        /* Always remove the entry from the hash table on a destroy.  On a
-         * flush with destroy, it is cheaper to discard the skip list all at
-         * once rather than remove the entries one by one, so we only delete
-         * from the slist only if requested.
+	/* The entry is dirty, and we are doing either a flush,
+	 * or a flush destroy.  In either case, serialize the
+	 * entry and write it to disk.
          *
-         * We must do deletions now as the callback routines will free the
-         * entry if destroy is true.
+         * Note that this may cause the entry to be re-sized and/or
+         * moved in the cache.  
 	 *
-	 * Note that it is possible that the entry will be moved during
-	 * its call to flush.  This will upset H5C_move_entry() if we
-	 * don't tell it that it doesn't have to worry about updating the
-	 * index and SLIST.  Use the destroy_in_progress field for this
-	 * purpose.
+         * As we will not update the metadata cache's data structures 
+         * until we we finish the write, we must touch up these 
+         * data structures for size and location changes even if we 
+         * are about to delete the entry from the cache (i.e. on a 
+         * flush destroy).
          */
-        if ( destroy ) {
+        HDassert(entry_ptr->is_dirty);
 
-            entry_ptr->destroy_in_progress = TRUE;
+#if H5C_DO_SANITY_CHECKS
+        if(cache_ptr->check_write_permitted && !(cache_ptr->write_permitted))
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Write when writes are always forbidden!?!?!")
+#endif /* H5C_DO_SANITY_CHECKS */
 
-            H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr)
+        if(NULL == entry_ptr->image_ptr) {
+            size_t image_size;
 
-            if ( ( entry_ptr->in_slist ) &&
-                 ( del_entry_from_slist_on_destroy ) ) {
+            if(entry_ptr->compressed)
+                image_size = entry_ptr->compressed_size;
+            else
+                image_size = entry_ptr->size;
+            HDassert(image_size > 0);
 
-                H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr)
-            }
-        }
 
-        /* Update the replacement policy for the flush or eviction.
-         * Again, do this now so we don't have to reference freed
-         * memory in the destroy case.
-         */
-        if ( destroy ) { /* AKA eviction */
+            if(NULL == (entry_ptr->image_ptr = H5MM_malloc(image_size + H5C_IMAGE_EXTRA_SPACE)))
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "memory allocation failed for on disk image buffer")
+#if H5C_DO_MEMORY_SANITY_CHECKS
+            HDmemcpy(((uint8_t *)entry_ptr->image_ptr) + image_size, H5C_IMAGE_SANITY_VALUE, H5C_IMAGE_EXTRA_SPACE);
+#endif /* H5C_DO_MEMORY_SANITY_CHECKS */
+        } /* end if */
 
-            H5C__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, FAIL)
+        if(!(entry_ptr->image_up_to_date)) {
+            /* reset cache_ptr->slist_changed so we can detect slist
+             * modifications in the pre_serialize call.
+             */
+            cache_ptr->slist_changed = FALSE;
+
+            /* make note of the entry's current address */
+            old_addr = entry_ptr->addr;
+
+            /* Call client's pre-serialize callback, if there's one */
+            if ( ( entry_ptr->type->pre_serialize != NULL ) && 
+                 ( (entry_ptr->type->pre_serialize)(f, dxpl_id, 
+                                                    (void *)entry_ptr,
+                                                    entry_ptr->addr, 
+                                                    entry_ptr->size,
+						    entry_ptr->compressed_size,
+                                                    &new_addr, &new_len, 
+                                                    &new_compressed_len,
+                                                    &serialize_flags) < 0 ) )
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to pre-serialize entry")
+
+            /* set cache_ptr->slist_change_in_pre_serialize if the 
+             * slist was modified.
+             */
+            if(cache_ptr->slist_changed)
+                cache_ptr->slist_change_in_pre_serialize = TRUE;
+
+            /* Check for any flags set in the pre-serialize callback */
+            if(serialize_flags != H5C__SERIALIZE_NO_FLAGS_SET) {
+                /* Check for unexpected flags from serialize callback */
+                if(serialize_flags & ~(H5C__SERIALIZE_RESIZED_FLAG | 
+                                       H5C__SERIALIZE_MOVED_FLAG |
+                                       H5C__SERIALIZE_COMPRESSED_FLAG))
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unknown serialize flag(s)")
+#ifdef H5_HAVE_PARALLEL
+                /* In the parallel case, resizes and moves in
+                 * the serialize operation can cause problems.
+                 * If they occur, scream and die.
+                 *
+                 * At present, in the parallel case, the aux_ptr
+                 * will only be set if there is more than one
+                 * process.  Thus we can use this to detect
+                 * the parallel case.
+                 *
+                 * This works for now, but if we start using the
+                 * aux_ptr for other purposes, we will have to
+                 * change this test accordingly.
+                 *
+                 * NB: While this test detects entryies that attempt
+                 *     to resize or move themselves during a flush
+                 *     in the parallel case, it will not detect an
+                 *     entry that dirties, resizes, and/or moves
+                 *     other entries during its flush.
+                 *
+                 *     From what Quincey tells me, this test is
+                 *     sufficient for now, as any flush routine that
+                 *     does the latter will also do the former.
+                 *
+                 *     If that ceases to be the case, further
+                 *     tests will be necessary.
+                 */
+                if(cache_ptr->aux_ptr != NULL)
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "resize/move in serialize occured in parallel case.")
+#endif /* H5_HAVE_PARALLEL */
 
-        } else {
+                /* Resize the buffer if required */
+                if ( ( ( ! entry_ptr->compressed ) &&
+                       ( serialize_flags & H5C__SERIALIZE_RESIZED_FLAG ) ) ||
+                     ( ( entry_ptr->compressed ) &&
+                       ( serialize_flags & H5C__SERIALIZE_COMPRESSED_FLAG ) ) )
+                {
+                    size_t new_image_size;
+
+            	    if(entry_ptr->compressed)
+                        new_image_size = new_compressed_len;
+                    else
+                        new_image_size = new_len;
+                    HDassert(new_image_size > 0);
+
+                    /* Release the current image */
+                    if(entry_ptr->image_ptr)
+                        entry_ptr->image_ptr = H5MM_xfree(entry_ptr->image_ptr);
+
+                    /* Allocate a new image buffer */
+                    if(NULL == (entry_ptr->image_ptr = H5MM_malloc(new_image_size + H5C_IMAGE_EXTRA_SPACE)))
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, FAIL, "memory allocation failed for on disk image buffer")
+#if H5C_DO_MEMORY_SANITY_CHECKS
+                    HDmemcpy(((uint8_t *)entry_ptr->image_ptr) + new_image_size, H5C_IMAGE_SANITY_VALUE, H5C_IMAGE_EXTRA_SPACE);
+#endif /* H5C_DO_MEMORY_SANITY_CHECKS */
+                } /* end if */
+
+		/* If required, update the entry and the cache data structures
+                 * for a resize.
+		 */
+                if(serialize_flags & H5C__SERIALIZE_RESIZED_FLAG) {
+                    H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, \
+                                                            entry_ptr, new_len)
+
+                    /* update the hash table for the size change*/
+                    H5C__UPDATE_INDEX_FOR_SIZE_CHANGE(cache_ptr, \
+                                                      entry_ptr->size, \
+                                                      new_len, entry_ptr, \
+                                                      !(entry_ptr->is_dirty));
+
+                    /* The entry can't be protected since we are
+                     * in the process of flushing it.  Thus we must
+                     * update the replacement policy data
+                     * structures for the size change.  The macro
+                     * deals with the pinned case.
+                     */
+                    H5C__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, entry_ptr, new_len);
 
-            H5C__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, FAIL)
-        }
+                    /* as we haven't updated the cache data structures for 
+                     * for the flush or flush destroy yet, the entry should
+                     * be in the slist.  Thus update it for the size change.
+                     */
+		    HDassert(entry_ptr->in_slist);
+                    H5C__UPDATE_SLIST_FOR_SIZE_CHANGE(cache_ptr, entry_ptr->size, \
+                                                      new_len)
 
-        /* Clear the dirty flag only, if requested */
-        if ( clear_only ) {
+		    /* if defined, update *entry_size_change_ptr for the 
+                     * change in entry size.
+                     */
+                    if(entry_size_change_ptr != NULL)
+                        *entry_size_change_ptr = (int64_t)new_len - (int64_t)(entry_ptr->size);
 
-	    if ( destroy ) {
-#ifndef NDEBUG
-		/* we are about to call the clear callback with the
-		 * destroy flag set -- this will result in *entry_ptr
-		 * being freed.  Set the magic field to bad magic
-		 * so we can detect a freed cache entry if we see
-		 * one.
-		 */
-		entry_ptr->magic = H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC;
-#endif /* NDEBUG */
-                entry_ptr->cache_ptr = NULL;
-	    }
-            /* Call the callback routine to clear all dirty flags for object */
-            if ( (entry_ptr->type->clear)(f, entry_ptr, destroy_entry) < 0 ) {
+                    /* finally, update the entry for its new size */
+                    entry_ptr->size = new_len;
+                } /* end if */
 
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "can't clear entry")
-            }
-        } else {
+                /* If required, udate the entry and the cache data structures 
+                 * for a move 
+                 */
+                if(serialize_flags & H5C__SERIALIZE_MOVED_FLAG) {
+#if H5C_DO_SANITY_CHECKS
+                    int64_t saved_slist_len_increase;
+                    int64_t saved_slist_size_increase;
+#endif /* H5C_DO_SANITY_CHECKS */
+
+                    H5C__UPDATE_STATS_FOR_MOVE(cache_ptr, entry_ptr)
+
+                    if(entry_ptr->addr == old_addr) {
+                        /* we must update cache data structures for the 
+                         * change in address.
+                         */
+
+                        /* delete the entry from the hash table and the slist */
+                        H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr)
+                        H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr)
+
+		        /* update the entry for its new address */
+                        entry_ptr->addr = new_addr;
+
+		        /* and then reinsert in the index and slist */
+                        H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, FAIL)
 
 #if H5C_DO_SANITY_CHECKS
-            if ( ( entry_ptr->is_dirty ) &&
-                 ( cache_ptr->check_write_permitted == NULL ) &&
-                 ( ! (cache_ptr->write_permitted) ) ) {
+		        /* save cache_ptr->slist_len_increase and 
+                         * cache_ptr->slist_size_increase before the 
+                         * reinsertion into the slist, and restore 
+                         * them afterwards to avoid skewing our sanity
+                         * checking.
+                         */
+                        saved_slist_len_increase = cache_ptr->slist_len_increase;
+                        saved_slist_size_increase = cache_ptr->slist_size_increase;
+#endif /* H5C_DO_SANITY_CHECKS */
 
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "Write when writes are always forbidden!?!?!")
-            }
+                        H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL)
+
+#if H5C_DO_SANITY_CHECKS
+                        cache_ptr->slist_len_increase = saved_slist_len_increase;
+                        cache_ptr->slist_size_increase = saved_slist_size_increase;
 #endif /* H5C_DO_SANITY_CHECKS */
+                    }
+                    else /* move is alread done for us -- just do sanity checks */
+                        HDassert(entry_ptr->addr == new_addr);
+                } /* end if */
+
+                if(serialize_flags & H5C__SERIALIZE_COMPRESSED_FLAG) {
+		    /* just save the new compressed entry size in 
+                     * entry_ptr->compressed_size.  We don't need to 
+ 		     * do more, as compressed size is only used for I/O.
+                     */
+                    HDassert(entry_ptr->compressed);
+                    entry_ptr->compressed_size = new_compressed_len;
+                }
+            } /* end if ( serialize_flags != H5C__SERIALIZE_NO_FLAGS_SET ) */
 
-	    if ( destroy ) {
-#ifndef NDEBUG
-	        /* we are about to call the flush callback with the
-	         * destroy flag set -- this will result in *entry_ptr
-	         * being freed.  Set the magic field to bad magic
-	         * so we can detect a freed cache entry if we see
-	         * one.
-	         */
-	        entry_ptr->magic = H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC;
-#endif /* NDEBUG */
-                entry_ptr->cache_ptr = NULL;
-	    }
+            /* Serialize object into buffer */
+            {
+                size_t image_len;
 
-            /* Only block for all the processes on the first piece of metadata
-             */
+                if(entry_ptr->compressed)
+                    image_len = entry_ptr->compressed_size;
+                else
+                    image_len = entry_ptr->size;
 
-            if ( *first_flush_ptr && entry_ptr->is_dirty ) {
+                /* reset cache_ptr->slist_changed so we can detect slist
+                 * modifications in the serialize call.
+                 */
+                cache_ptr->slist_changed = FALSE;
 
-                status = (entry_ptr->type->flush)(f, primary_dxpl_id, destroy_entry,
-                                                 entry_ptr->addr, entry_ptr,
-						 &flush_flags);
-                *first_flush_ptr = FALSE;
+            
+                if(entry_ptr->type->serialize(f, entry_ptr->image_ptr, 
+                                                image_len, (void *)entry_ptr) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to serialize entry")
 
-            } else {
+                /* set cache_ptr->slist_change_in_serialize if the 
+                 * slist was modified.
+                 */
+                if(cache_ptr->slist_changed)
+                    cache_ptr->slist_change_in_pre_serialize = TRUE;
+
+#if H5C_DO_MEMORY_SANITY_CHECKS
+                HDassert(0 == HDmemcmp(((uint8_t *)entry_ptr->image_ptr) + image_len, 
+                                       H5C_IMAGE_SANITY_VALUE, H5C_IMAGE_EXTRA_SPACE));
+#endif /* H5C_DO_MEMORY_SANITY_CHECKS */
 
-                status = (entry_ptr->type->flush)(f, secondary_dxpl_id,
-                                                 destroy_entry, entry_ptr->addr,
-                                                 entry_ptr, &flush_flags);
+                entry_ptr->image_up_to_date = TRUE;
             }
+        } /* end if ( ! (entry_ptr->image_up_to_date) ) */
+
+        /* Finally, write the image to disk.  
+         * 
+         * Note that if either the H5C__CLASS_NO_IO_FLAG or the 
+         * the H5AC__CLASS_SKIP_WRITES flag is set in the 
+         * in the entry's type, we silently skip the write.  This
+         * flag should only be used in test code. 
+         */
+        if ( ( ((entry_ptr->type->flags) & H5C__CLASS_NO_IO_FLAG) == 0 ) &&
+             ( ((entry_ptr->type->flags) & H5C__CLASS_SKIP_WRITES) == 0 ) )
+        {
+	    /* If compression is not enabled, the size of the entry on 
+             * disk is entry_prt->size.  However if entry_ptr->compressed
+             * is TRUE, the on disk size is entry_ptr->compressed_size.
+             */
+            size_t image_size;
 
-            if ( status < 0 ) {
+            if(entry_ptr->compressed)
+                image_size = entry_ptr->compressed_size;
+            else
+                image_size = entry_ptr->size;
 
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
-                            "unable to flush entry")
-            }
+            if(H5F_block_write(f, entry_ptr->type->mem_type, entry_ptr->addr,
+                    image_size, dxpl_id, entry_ptr->image_ptr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't write image to file.")
+        }
 
-#ifdef H5_HAVE_PARALLEL
-            if ( flush_flags != H5C_CALLBACK__NO_FLAGS_SET ) {
-
-                /* In the parallel case, flush operations can
-		 * cause problems.  If they occur, scream and
-		 * die.
-		 *
-		 * At present, in the parallel case, the aux_ptr
-		 * will only be set if there is more than one
-		 * process.  Thus we can use this to detect
-		 * the parallel case.
-		 *
-		 * This works for now, but if we start using the
-		 * aux_ptr for other purposes, we will have to
-		 * change this test accordingly.
-		 *
-		 * NB: While this test detects entryies that attempt
-		 *     to resize or move themselves during a flush
-		 *     in the parallel case, it will not detect an
-		 *     entry that dirties, resizes, and/or moves
-		 *     other entries during its flush.
-		 *
-		 *     From what Quincey tells me, this test is
-		 *     sufficient for now, as any flush routine that
-		 *     does the latter will also do the former.
-		 *
-		 *     If that ceases to be the case, further
-		 *     tests will be necessary.
-		 */
-		if ( cache_ptr->aux_ptr != NULL ) {
+        /* if the entry has a notify callback, notify it that we have 
+         * just flushed the entry.
+         */
+        if(entry_ptr->type->notify &&
+             (entry_ptr->type->notify)(H5C_NOTIFY_ACTION_AFTER_FLUSH, entry_ptr) < 0 )
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify client of entry flush")
+    } /* if ( write_entry ) */
+
+    /* At this point, all pre-serialize and serialize calls have been
+     * made if it was appropriate to make them.  Similarly, the entry
+     * has been written to disk if desired.
+     *
+     * Thus it is now safe to update the cache data structures for the 
+     * flush.
+     */
 
-                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-		        "resize/move in serialize occured in parallel case.")
+    /* start by updating the statistics */
+    if(clear_only) {
+        /* only log a clear if the entry was dirty */
+        if(was_dirty) {
+            H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr)
+        } /* end if */
+    } else if(write_entry) {
+        HDassert(was_dirty);
 
-		}
-	    }
-#endif /* H5_HAVE_PARALLEL */
-        }
+        /* only log a flush if we actually wrote to disk */
+        H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr)
+    } /* end else if */
+
+    if(destroy) {
+        if(take_ownership)
+            HDassert(!destroy_entry);
+        else
+            HDassert(destroy_entry);
+
+        H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr, take_ownership)
+    } /* end if */
+
+    /* If the entry's type has a 'notify' callback and the entry is about
+     * to be removed from the cache, send a 'before eviction' notice while
+     * the entry is still fully integrated in the cache.
+     */
+    if(destroy)
+        if(entry_ptr->type->notify && (entry_ptr->type->notify)(H5C_NOTIFY_ACTION_BEFORE_EVICT, entry_ptr) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTNOTIFY, FAIL, "can't notify client about entry to evict")
+
+    /* Update the cache internal data structures. */
+    if(destroy) {
+        /* Update the cache internal data structures as appropriate
+         * for a destroy.  Specifically:
+         *
+         * 1) Delete it from the index
+         *
+         * 2) Delete it from the skip list if requested.
+         *
+         * 3) Update the replacement policy for eviction
+         *
+         * Finally, if the destroy_entry flag is set, discard the 
+         * entry.
+         */
 
-        if ( ( ! destroy ) && ( entry_ptr->in_slist ) ) {
+        H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr)
 
+        if(entry_ptr->in_slist && del_from_slist_on_destroy)
             H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr)
 
-        }
+        H5C__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, FAIL)
 
-	if ( ( ! destroy ) && ( was_dirty ) ) {
+#if 0 /* this is useful debugging code -- leave it in for now.  -- JRM */
+	if ( ( entry_ptr->flush_dep_nparents > 0 ) ||
+             ( entry_ptr->flush_dep_nchildren > 0 ) ) {
 
-            H5C__UPDATE_INDEX_FOR_ENTRY_CLEAN(cache_ptr, entry_ptr);
-        }
+	    int i;
 
-        if ( ! destroy ) { /* i.e. if the entry still exists */
+	    HDfprintf(stdout, 
+                    "\n\nattempting to evict entry of type \"%s\" at 0X%llx:\n",
+                    entry_ptr->type->name, (long long)(entry_ptr->addr));
 
-            HDassert( !(entry_ptr->is_dirty) );
-            HDassert( !(entry_ptr->flush_marker) );
-            HDassert( !(entry_ptr->in_slist) );
-            HDassert( !(entry_ptr->is_protected) );
-            HDassert( !(entry_ptr->is_read_only) );
-            HDassert( (entry_ptr->ro_ref_count) == 0 );
+	    for ( i = 0; i < entry_ptr->flush_dep_nparents; i++ ) {
 
-	    if ( (flush_flags & H5C_CALLBACK__SIZE_CHANGED_FLAG) != 0 ) {
+		HDfprintf(stdout, 
+                          "	with FD parent of type \"%s\" at 0X%llx.\n",
+			  entry_ptr->flush_dep_parent[i]->type->name,
+			  (long long)(entry_ptr->flush_dep_parent[i]->addr));
+	    }
 
-		/* The entry size changed as a result of the flush.
-		 *
-		 * Most likely, the entry was compressed, and the
-		 * new version is of a different size than the old.
-		 *
-		 * In any case, we must update entry and cache size
-		 * accordingly.
-		 */
-		size_t new_size;
+	    HDfprintf(stdout, "	with %d FD children.\n\n", 
+                      entry_ptr->flush_dep_nchildren);
+        }
+#endif /* this is useful debugging code -- leave it in for now.  -- JRM */
 
-                if ( (entry_ptr->type->size)(f, (void *)entry_ptr, &new_size)
-                     < 0 ) {
+	/* verify that the entry is no longer part of any flush dependencies */
+        HDassert(entry_ptr->flush_dep_nparents == 0);
+	HDassert(entry_ptr->flush_dep_nchildren == 0);
+    }
+    else {
+        HDassert(clear_only || write_entry);
+        HDassert(entry_ptr->is_dirty);
+        HDassert(entry_ptr->in_slist);
 
-                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGETSIZE, FAIL, \
-                                "Can't get entry size after flush")
-                }
+        /* We are either doing a flush or a clear.
+         *
+         * A clear and a flush are the same from the point of
+         * view of the replacement policy and the slist.  
+         * Hence no differentiation between them.
+         *
+         * 					JRM -- 7/7/07
+         */
 
-		if ( new_size != entry_ptr->size ) {
+        H5C__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, FAIL)
 
-                    HDassert( entry_ptr->size < H5C_MAX_ENTRY_SIZE );
+        H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr)
 
-                    /* update the hash table for the size change
-		     * We pass TRUE as the was_clean parameter, as we
-		     * have already updated the clean and dirty index
-		     * size fields for the fact that the entry has
-		     * been flushed. (See above call to
-		     * H5C__UPDATE_INDEX_FOR_ENTRY_CLEAN()).
-		     */
-	            H5C__UPDATE_INDEX_FOR_SIZE_CHANGE((cache_ptr), \
-				                      (entry_ptr->size), \
-                                                      (new_size), \
-						      (entry_ptr), \
-						      (TRUE))
-
-		    /* The entry can't be protected since we just flushed it.
-		     * Thus we must update the replacement policy data
-		     * structures for the size change.  The macro deals
-		     * with the pinned case.
-		     */
-		    H5C__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, entry_ptr, \
-				                   new_size)
+        /* mark the entry as clean and update the index for 
+         * entry clean.  Also, call the clear callback 
+         * if defined.
+         */
+        entry_ptr->is_dirty = FALSE;
 
-		    /* The entry can't be in the slist, so no need to update
-		     * the slist for the size change.
-		     */
+        H5C__UPDATE_INDEX_FOR_ENTRY_CLEAN(cache_ptr, entry_ptr);
 
-		    /* update stats for the size change */
-		    H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, \
-				                            entry_ptr, \
-							    new_size)
+        if(entry_ptr->type->clear && (entry_ptr->type->clear)(f, (void *)entry_ptr, FALSE) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to clear entry")
 
-		    /* finally, update the entry size proper */
-		    entry_ptr->size = new_size;
-		}
-	    }
+	/* Propagate the clean flag up the flush dependency chain if
+         * appropriate */
+        if(was_dirty) {
+	    HDassert(entry_ptr->flush_dep_ndirty_children == 0);
 
-	    if ( (flush_flags & H5C_CALLBACK__MOVED_FLAG) != 0 ) {
-
-		/* The entry was moved as the result of the flush.
-		 *
-		 * Most likely, the entry was compressed, and the
-		 * new version is larger than the old and thus had
-		 * to be relocated.
-		 *
-		 * At preset, all processing for this case is
-		 * handled elsewhere.  But lets keep the if statement
-		 * around just in case.
-		 */
+	    if(entry_ptr->flush_dep_nparents > 0)
+		if(H5C__mark_flush_dep_clean(entry_ptr) < 0)
+		    HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "Can't propagate flush dep clean flag")
+	} /* end if */
 
-	    }
+    }
 
-	    entry_ptr->flush_in_progress = FALSE;
-        }
+    /* reset the flush_in progress flag */
+    entry_ptr->flush_in_progress = FALSE;
+
+    /* Internal cache data structures should now be up to date, and 
+     * consistant with the status of the entry.  
+     *
+     * Now discard the entry if appropriate.
+     */
+    if(destroy) {
+        /* start by freeing the buffer for the on disk image */
+        if(entry_ptr->image_ptr != NULL)
+            entry_ptr->image_ptr = H5MM_xfree(entry_ptr->image_ptr);
 
-        if ( cache_ptr->log_flush ) {
+        /* Check whether we should free the space in the file that 
+         * the entry occupies 
+         */
+        if(free_file_space) {
+            size_t fsf_size;
 
-            status = (cache_ptr->log_flush)(cache_ptr, addr, was_dirty,
-                                            flags, type_id);
+            /* Sanity checks */
+            HDassert(H5F_addr_defined(entry_ptr->addr));
+            HDassert(!H5F_IS_TMP_ADDR(f, entry_ptr->addr));
+#ifndef NDEBUG
+{
+            hbool_t curr_compressed = FALSE;
+            size_t curr_len;
+            size_t curr_compressed_len = 0;
+
+            /* Get the actual image size for the thing again */
+            entry_ptr->type->image_len((void *)entry_ptr, &curr_len, &curr_compressed, &curr_compressed_len);
+            HDassert(curr_len == entry_ptr->size);
+            HDassert(curr_compressed == entry_ptr->compressed);
+            HDassert(curr_compressed_len == entry_ptr->compressed_size);
+}
+#endif /* NDEBUG */
 
-            if ( status < 0 ) {
+            /* if the file space free size callback is defined, use
+             * it to get the size of the block of file space to free.
+             * Otherwise use entry_ptr->compressed_size if 
+             * entry_ptr->compressed == TRUE, and entry_ptr->size
+             * if entry_ptr->compressed == FALSE.
+             */
+            if(entry_ptr->type->fsf_size) {
+                if((entry_ptr->type->fsf_size)((void *)entry_ptr, &fsf_size) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFREE, FAIL, "unable to get file space free size")
+            } /* end if */
+            else if(entry_ptr->compressed) /* use compressed size */
+                fsf_size = entry_ptr->compressed_size;
+            else    /* no file space free size callback -- use entry size */
+                fsf_size = entry_ptr->size;
+
+            /* Release the space on disk */
+            if(H5MF_xfree(f, entry_ptr->type->mem_type, dxpl_id, entry_ptr->addr, (hsize_t)fsf_size) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFREE, FAIL, "unable to free file space for cache entry")
+        } /* end if ( free_file_space ) */
+
+        /* Reset the pointer to the cache the entry is within. -QAK */
+        entry_ptr->cache_ptr = NULL;
+
+        /* increment entries_removed_counter and set 
+         * last_entry_removed_ptr.  As we are likely abuut to 
+         * free the entry, recall that last_entry_removed_ptr 
+         * must NEVER be dereferenced.
+         *
+         * Recall that these fields are maintained to allow functions
+         * that perform scans of lists of entries to detect the 
+         * unexpected removal of entries (via expunge, eviction, 
+         * or take ownership at present), so that they can re-start
+         * their scans if necessary.
+         */
+        cache_ptr->last_entry_removed_ptr++;
+        cache_ptr->last_entry_removed_ptr = entry_ptr;
+
+        /* Check for actually destroying the entry in memory */
+        /* (As opposed to taking ownership of it) */
+        if(destroy_entry) {
+            /* if the entry is dirty and it has a clear callback,
+             * call this callback now.  Since this callback exists,
+             * it follows tht the client maintains its own dirty bits, 
+             * which must be cleared before the entry is freed to avoid 
+             * sanity check failures.  Also clear the dirty flag for 
+             * the same reason.
+             */
+            if(entry_ptr->is_dirty) {
+                entry_ptr->is_dirty = FALSE;
 
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
-                            "log_flush callback failed.")
+                if(entry_ptr->type->clear && (entry_ptr->type->clear)(f, (void *)entry_ptr, TRUE) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to clear entry")
             }
+
+            /* we are about to discard the in core representation --
+             * set the magic field to bad magic so we can detect a
+             * freed entry if we see one.
+             */
+            entry_ptr->magic = H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC;
+
+            /* verify that the image has been freed */
+            HDassert(entry_ptr->image_ptr == NULL);
+
+            if(entry_ptr->type->free_icr((void *)entry_ptr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "free_icr callback failed.")
+        } 
+        else {
+            HDassert(take_ownership);
+
+            /* client is taking ownership of the entry.
+             * set bad magic here too so the cache will choke 
+             * unless the entry is re-inserted properly
+             */
+            entry_ptr->magic = H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC;
         }
+    } /* if (destroy) */
+
+    if(cache_ptr->log_flush)
+        if((cache_ptr->log_flush)(cache_ptr, entry_ptr->addr, was_dirty, flags) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "log_flush callback failed.")
+
+done:
+    HDassert( ( ret_value != SUCCEED ) || ( destroy_entry ) || 
+              ( ! entry_ptr->flush_in_progress ) );
+
+    HDassert( ( ret_value != SUCCEED ) || ( destroy_entry ) || 
+              ( take_ownership ) || ( ! entry_ptr->is_dirty ) );
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__flush_single_entry() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_verify_len_eoa
+ *
+ * Purpose:     Verify that 'len' does not exceed eoa when 'actual' is
+ *		false i.e. 'len" is the initial speculative length from
+ *		get_load_size callback with null image pointer.
+ *		If exceed, adjust 'len' accordingly.
+ *
+ *		Verify that 'len' should not exceed eoa when 'actual' is
+ *		true i.e. 'len' is the actual length from get_load_size 
+ *		callback with non-null image pointer.
+ *		If exceed, return error.
+ *
+ *		The coding is copied and moved from H5C_load_entry().
+ *
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *
+ * Programmer:  Vailin Choi
+ *              9/6/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C_verify_len_eoa (H5F_t *             f,
+               	    const H5C_class_t * type,
+               	    haddr_t             addr,
+		    size_t              *len,
+               	    htri_t		actual)
+{
+    haddr_t eoa;                	/* End-of-allocation in the file */
+    H5FD_mem_t cooked_type;
+    herr_t ret_value = SUCCEED;      	/* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* if type == H5FD_MEM_GHEAP, H5F_block_read() forces 
+     * type to H5FD_MEM_DRAW via its call to H5F__accum_read().
+     * Thus we do the same for purposes of computing the eoa
+     * for sanity checks.
+     */
+    cooked_type = (type->mem_type == H5FD_MEM_GHEAP) ? H5FD_MEM_DRAW : type->mem_type;
+
+    /* Get the file's end-of-allocation value */
+    eoa = H5F_get_eoa(f, cooked_type);
+
+    HDassert(H5F_addr_defined(eoa));
+
+    /* Check for bad address in general */
+    if ( H5F_addr_gt(addr, eoa) )
+	HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "address of object past end of allocation")
+
+    /* Check if the amount of data to read will be past the eoa */
+    if( H5F_addr_gt((addr + *len), eoa) ) {
+
+	if(actual)
+	    HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "actual len exceeds EOA.")
+	else
+	    /* Trim down the length of the metadata */
+	    /* Note that for some cache clients, this will cause an 
+	     * assertion failure.		JRM -- 8/29/14
+	     */
+	    *len = (size_t)(eoa - addr);
     }
 
+    if ( *len <= 0 )
+	HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, "len not positive after adjustment for EOA.")
+
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5C_flush_single_entry() */
+
+} /* H5C_verify_len_eoa() */
+
 
 

 /*-------------------------------------------------------------------------
@@ -7922,10 +8710,6 @@ done:
  *
  * Programmer:  John Mainzer, 5/18/04
  *
- *		QAK -- 1/31/08
- *		Added initialization for the new free_file_space_on_destroy
- *		field.
- *
  *-------------------------------------------------------------------------
  */
 static void *
@@ -7935,9 +8719,20 @@ H5C_load_entry(H5F_t *             f,
                haddr_t             addr,
                void *              udata)
 {
+    hbool_t		dirty = FALSE;  /* Flag indicating whether thing was dirtied during deserialize */
+    hbool_t		compressed = FALSE; /* flag indicating whether thing */
+ 					/* will be run through filters on    */
+                                        /* on read and write.  Usually FALSE */
+					/* set to true if appropriate.       */
+    size_t		compressed_size = 0; /* entry compressed size if     */
+                                        /* known -- otherwise uncompressed.  */
+				        /* Zero indicates compression not    */
+                                        /* enabled.                          */
+    uint8_t *           image = NULL;   /* Buffer for disk image */
     void *		thing = NULL;   /* Pointer to thing loaded */
     H5C_cache_entry_t *	entry;          /* Alias for thing loaded, as cache entry */
-    void *		ret_value;      /* Return value */
+    size_t              len;            /* Size of image in file */
+    void *		ret_value = NULL;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -7945,14 +8740,219 @@ H5C_load_entry(H5F_t *             f,
     HDassert(f->shared);
     HDassert(f->shared->cache);
     HDassert(type);
-    HDassert(type->load);
-    HDassert(type->size);
+
+    /* verify absence of prohibited or unsupported type flag combinations */
+    HDassert(!(type->flags & H5C__CLASS_NO_IO_FLAG));
+
+    /* for now, we do not combine the speculative load and compressed flags */
+    HDassert(!((type->flags & H5C__CLASS_SPECULATIVE_LOAD_FLAG) &&
+               (type->flags & H5C__CLASS_COMPRESSED_FLAG)));
+
+    /* Can't see how skip reads could be usefully combined with
+     * either the speculative read or compressed flags.  Hence disallow.
+     */
+    HDassert(!((type->flags & H5C__CLASS_SKIP_READS) &&
+               (type->flags & H5C__CLASS_SPECULATIVE_LOAD_FLAG)));
+    HDassert(!((type->flags & H5C__CLASS_SKIP_READS) &&
+               (type->flags & H5C__CLASS_COMPRESSED_FLAG)));
+
     HDassert(H5F_addr_defined(addr));
+    HDassert(type->get_load_size);
+    HDassert(type->deserialize);
+
+    /* Call the get_load_size callback, to retrieve the initial 
+     * size of image 
+     */
+    if(type->get_load_size(NULL, udata, &len, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTGET, NULL, "can't retrieve image size")
+
+    HDassert(len > 0);
+
+    /* Check for possible speculative read off the end of the file */
+    if(type->flags & H5C__CLASS_SPECULATIVE_LOAD_FLAG) {
+
+/* Quincey has added patches for eoa calculations -- leave the original
+ * code around until we see the effect of these patches.
+ *                                         JRM -- 1/1/15
+ */
+#if 0 /* original code */ /* JRM */
+	/* the original version of this code has several problems:
+         *
+         * First, the sblock is not available until the sblock 
+         * has been read in, which causes a seg fault.  This is 
+         * dealt with easily enough by testing to see if 
+         * f->shared->sblock is NULL, and calling H5FD_get_base_addr()
+         * to obtain the base addr when it is.
+         *
+         * The second issue is more subtle.  H5F_get_eoa() calls 
+         * H5FD_get_eoa().  However, this function returns the EOA as 
+         * a relative address -- i.e. relative to the base address.
+         * This means that the base addr + addr < eoa sanity check will
+         * fail whenever the super block is not at address 0 when 
+         * reading in the first chunk of the super block.
+         * 
+         * To address these issues, I have rewritten the code to 
+         * simply verify that the address plus length is less than 
+         * the eoa.  I think this is sufficient, but further testing
+         * should tell me if it isn't.
+         *                                      JRM -- 8/29/14
+         */
+        haddr_t eoa;                /* End-of-allocation in the file */
+        haddr_t base_addr;          /* Base address of file data */
+
+        /* Get the file's end-of-allocation value */
+        eoa = H5F_get_eoa(f, type->mem_type);
+        HDassert(H5F_addr_defined(eoa));
 
-    if(NULL == (thing = (type->load)(f, dxpl_id, addr, udata)))
+        /* Get the file's base address */
+	if ( f->shared->sblock ) 
 
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, "unable to load entry")
+            base_addr = H5F_BASE_ADDR(f);
 
+	else { /* sblock not loaded yet -- use file driver info */
+
+	    HDassert(f->shared->lf);
+	    base_addr = H5FD_get_base_addr(f->shared->lf);
+
+	}
+        HDassert(H5F_addr_defined(base_addr));
+
+        /* Check for bad address in general */
+        if((addr + base_addr) > eoa)
+            HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, NULL, \
+	                "address of object past end of allocation")
+
+        /* Check if the amount of data to read will be past the eoa */
+        if((addr + base_addr + len) > eoa)
+            /* Trim down the length of the metadata */
+            len = (size_t)(eoa - (addr + base_addr));
+
+#else /* modified code */ /* JRM */
+
+	if(H5C_verify_len_eoa(f, type, addr, &len, FALSE) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, NULL, "invalid len with respect to EOA.")
+
+#endif /* modified code */ /* JRM */
+    }
+    /* Allocate the buffer for reading the on-disk entry image */
+    if(NULL == (image = (uint8_t *)H5MM_malloc(len + H5C_IMAGE_EXTRA_SPACE)))
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, NULL, "memory allocation failed for on disk image buffer.")
+
+#if H5C_DO_MEMORY_SANITY_CHECKS
+    HDmemcpy(image + len, H5C_IMAGE_SANITY_VALUE, H5C_IMAGE_EXTRA_SPACE);
+#endif /* H5C_DO_MEMORY_SANITY_CHECKS */
+
+    /* Get the on-disk entry image */
+    if ( 0 == (type->flags & H5C__CLASS_SKIP_READS) ) {
+	unsigned tries, max_tries;  	/* The # of read attempts */
+	unsigned retries;           	/* The # of retries */
+	htri_t chk_ret;	 		/* return from verify_chksum callback */
+	size_t actual_len = len;
+	void *new_image;		/* Pointer to image */
+	
+	/* Get the # of read attempts */
+	max_tries = tries = H5F_GET_READ_ATTEMPTS(f);
+
+	/* 
+	 * This do/while loop performs the following till the metadata checksum is correct or the
+	 * file's allowed read attempts are reached.
+	 *	--read the metadata
+	 *	--determine the actual size of the metadata
+         * 	--perform checksum verification
+	 */
+	do {
+	    compressed = FALSE;
+	    compressed_size = 0;
+
+	    if(actual_len != len) {
+                if(NULL == (new_image = H5MM_realloc(image, len + H5C_IMAGE_EXTRA_SPACE)))
+                    HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, NULL, "image null after H5MM_realloc()")
+                image = (uint8_t *)new_image;
+	    }
+
+	    if(H5F_block_read(f, type->mem_type, addr, len, dxpl_id, image) < 0)
+		HGOTO_ERROR(H5E_CACHE, H5E_READERROR, NULL, "Can't read image*")
+    
+	    actual_len = len;
+
+	    if(type->get_load_size(image, udata, &len, &actual_len, &compressed, &compressed_size) < 0)
+		continue;   /* Transfer control to while() and count towards retries */
+
+	    HDassert(((type->flags & H5C__CLASS_COMPRESSED_FLAG) != 0) ||
+		     ((compressed == FALSE) && (compressed_size == 0)));
+	    HDassert((compressed == TRUE) || (compressed_size == 0));
+
+	    if(actual_len != len) {
+
+		if(type->flags & H5C__CLASS_COMPRESSED_FLAG) {
+		    /* if actual_len != len, then compression must be enabled on the entry.  
+		     * In this case, the get_load_size callback should have set compressed to TRUE,
+		     * compressed_size to the compressed size (which must equal to len),
+		     * and actual_len to the uncompressed size of the entry,
+		     * We can't verify the uncompressed size, but we can verify the rest
+		     * with the following assertions.
+		     */
+		    HDassert(compressed);
+		    HDassert(compressed_size == len);
+		} else if(type->flags & H5C__CLASS_SPECULATIVE_LOAD_FLAG) {
+
+		    size_t temp_len = actual_len;
+
+		    /* compressed must be FALSE, and compressed_size
+		     * must be zero.
+		     */
+		    HDassert(!compressed);
+		    HDassert(compressed_size == 0);
+    
+		    if(H5C_verify_len_eoa(f, type, addr, &temp_len, TRUE) < 0)
+			HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, NULL, "actual_len exceeds EOA.")
+		    HDassert(temp_len == actual_len);
+
+		    if(NULL == (new_image = H5MM_realloc(image, actual_len + H5C_IMAGE_EXTRA_SPACE)))
+			HGOTO_ERROR(H5E_CACHE, H5E_CANTALLOC, NULL, "image null after H5MM_realloc()")
+		    image = (uint8_t *)new_image;
+#if H5C_DO_MEMORY_SANITY_CHECKS
+
+		    HDmemcpy(image + actual_len, H5C_IMAGE_SANITY_VALUE, H5C_IMAGE_EXTRA_SPACE);
+
+#endif /* H5C_DO_MEMORY_SANITY_CHECKS */
+		    /* If the thing's image needs to be bigger for a speculatively
+		     * loaded thing, go get the on-disk image again (the extra portion).
+		     */
+		    if(actual_len > len) {
+			if(H5F_block_read(f, type->mem_type, addr+len, actual_len-len, dxpl_id, image+len) < 0)
+			    HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, "Can't read image")
+		    }
+		} else { /* throw an error */
+		    HGOTO_ERROR(H5E_CACHE, H5E_UNSUPPORTED, NULL, "size of non-speculative, non-compressed object changed")
+		}
+	    } /* end if (actual_len != len) */
+
+	    if(type->verify_chksum == NULL)
+		break;
+
+	    if((chk_ret = type->verify_chksum(image, actual_len, udata)) < 0)
+		HGOTO_ERROR(H5E_CACHE, H5E_NOSPACE, NULL, "Failure from verify_chksum callback")
+	    if(chk_ret == TRUE)
+		break;
+	} while(--tries);
+
+	/* Check for too many tries */
+	if(tries == 0)
+	    HGOTO_ERROR(H5E_CACHE, H5E_READERROR, NULL, "incorrect metadatda checksum after all read attempts")
+
+	/* Calculate and track the # of retries */
+	retries = max_tries - tries;
+	if(retries) {        /* Does not track 0 retry */
+	    if(H5F_track_metadata_read_retries(f, (unsigned)type->mem_type, retries) < 0)
+		HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, NULL, "cannot track read tries = %u ", retries)
+	}  /* end if */
+	len = actual_len;
+    } /* end if !H5C__CLASS_SKIP_READS */
+
+    /* Deserialize the on-disk image into the native memory form */
+    if(NULL == (thing = type->deserialize(image, len, udata, &dirty)))
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, "Can't deserialize image")
 
     entry = (H5C_cache_entry_t *)thing;
 
@@ -7960,35 +8960,39 @@ H5C_load_entry(H5F_t *             f,
      *
      * However, when this code is used in the metadata cache, it is
      * possible that object headers will be dirty at this point, as
-     * the load function will alter object headers if necessary to
+     * the deserialize function will alter object headers if necessary to
      * fix an old bug.
      *
-     * To support this bug fix, I have replace the old assert:
-     *
-     * 	HDassert( entry->is_dirty == FALSE );
+     * In the following assert:
      *
-     * with:
+     * 	HDassert( ( dirty == FALSE ) || ( type->id == 5 || type->id == 6 ) );
      *
-     * 	HDassert( ( entry->is_dirty == FALSE ) || ( type->id == 5 ) );
-     *
-     * Note that type id 5 is associated with object headers in the metadata
-     * cache.
+     * note that type ids 5 & 6 are associated with object headers in the
+     * metadata cache.
      *
      * When we get to using H5C for other purposes, we may wish to
      * tighten up the assert so that the loophole only applies to the
      * metadata cache.
      */
 
-    HDassert( ( entry->is_dirty == FALSE ) || ( type->id == 5 ) );
-#ifndef NDEBUG
+    HDassert( ( dirty == FALSE ) || ( type->id == 5 || type->id == 6) );
+
     entry->magic                = H5C__H5C_CACHE_ENTRY_T_MAGIC;
-#endif /* NDEBUG */
     entry->cache_ptr            = f->shared->cache;
     entry->addr                 = addr;
+    entry->size                 = len;
+    HDassert(entry->size < H5C_MAX_ENTRY_SIZE);
+    entry->compressed		= compressed;
+    entry->compressed_size	= compressed_size;
+    entry->image_ptr            = image;
+    entry->image_up_to_date     = TRUE;
     entry->type                 = type;
+    entry->is_dirty	        = dirty;
+    entry->dirtied              = FALSE;
     entry->is_protected         = FALSE;
     entry->is_read_only         = FALSE;
     entry->ro_ref_count         = 0;
+    entry->is_pinned            = FALSE;
     entry->in_slist             = FALSE;
     entry->flush_marker         = FALSE;
 #ifdef H5_HAVE_PARALLEL
@@ -7997,13 +9001,17 @@ H5C_load_entry(H5F_t *             f,
 #endif /* H5_HAVE_PARALLEL */
     entry->flush_in_progress    = FALSE;
     entry->destroy_in_progress  = FALSE;
-    entry->free_file_space_on_destroy = FALSE;
-
-    if((type->size)(f, thing, &(entry->size)) < 0)
 
-        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGETSIZE, NULL, "Can't get size of thing")
+    entry->ring			= H5C_RING_UNDEFINED;
 
-    HDassert( entry->size < H5C_MAX_ENTRY_SIZE );
+    /* Initialize flush dependency height fields */
+    entry->flush_dep_parent = NULL;
+    entry->flush_dep_nparents = 0;
+    entry->flush_dep_parent_nalloc = 0;
+    entry->flush_dep_nchildren = 0;
+    entry->flush_dep_ndirty_children = 0;
+    entry->ht_next              = NULL;
+    entry->ht_prev              = NULL;
 
     entry->next                 = NULL;
     entry->prev                 = NULL;
@@ -8016,6 +9024,18 @@ H5C_load_entry(H5F_t *             f,
     ret_value = thing;
 
 done:
+    /* Cleanup on error */
+    if(NULL == ret_value) {
+
+        /* Release resources */
+        if ( thing && type->free_icr(thing) < 0 )
+
+            HDONE_ERROR(H5E_CACHE, H5E_CANTFLUSH, NULL, \
+                        "free_icr callback failed")
+
+        if(image)
+            image = (uint8_t *)H5MM_xfree(image);
+    } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5C_load_entry() */
@@ -8054,39 +9074,47 @@ done:
  *
  * Programmer:  John Mainzer, 5/14/04
  *
- *              JRM -- 11/13/08
- *              Modified function to always observe the min_clean_size
- *              whether we are maintaining the clean and dirt LRU lists
- *              or not.  To do this, we had to add the new clean_index_size
- *              and dirty_index_size fields to H5C_t, and supporting code
- *              as needed throughout the cache.
+ * Changes:     Modified function to skip over entries with the 
+ *		flush_in_progress flag set.  If this is not done,
+ *		an infinite recursion is possible if the cache is 
+ *		full, and the pre-serialize or serialize routine 
+ *		attempts to load another entry.
  *
- *              The purpose of this modification is to avoid "metadata
- *              blizzards" in the write only case.  In such instances,
- *              the cache was allowed to fill with dirty metadata.  When
- *              we finally needed to evict an entry to make space, we had
- *              to flush out a whole cache full of metadata -- which has
- *              interesting performance effects.  We hope to avoid (or
- *              perhaps more accurately hide) this effect by maintaining
- *              the min_clean_size, which should force us to start flushing
- *              entries long before we actually have to evict something
- *              to make space.
+ *		This error was exposed by a re-factor of the 
+ *		H5C__flush_single_entry() routine.  However, it was 
+ *		a potential bug from the moment that entries were 
+ *		allowed to load other entries on flush.
+ *
+ *		In passing, note that the primary and secondary dxpls 
+ *		mentioned in the comment above have been replaced by 
+ *		a single dxpl at some point, and thus the discussion 
+ *		above is somewhat obsolete.  Date of this change is 
+ *		unkown.
+ *
+ *						JRM -- 12/26/14
+ *
+ *		Modified function to detect deletions of entries 
+ *		during a scan of the LRU, and where appropriate, 
+ *		restart the scan to avoid proceeding with a next 
+ *		entry that is no longer in the cache.
+ *
+ *		Note the absence of checks after flushes of clean 
+ *		entries.  As a second entry can only be removed by 
+ *		by a call to the pre_serialize or serialize callback
+ *		of the first, and as these callbacks will not be called
+ *		on clean entries, no checks are needed.
+ *
+ *						JRM -- 4/6/15
  *
- *              MAM -- 01/06/09
- *              Added code to maintain clean_entries_skipped and total_entries
- *              scanned statistics.
  *-------------------------------------------------------------------------
  */
 static herr_t
 H5C_make_space_in_cache(H5F_t *	f,
-                        hid_t	primary_dxpl_id,
-                        hid_t	secondary_dxpl_id,
+                        hid_t	dxpl_id,
 		        size_t	space_needed,
-                        hbool_t	write_permitted,
-                        hbool_t * first_flush_ptr)
+                        hbool_t	write_permitted)
 {
     H5C_t *		cache_ptr = f->shared->cache;
-    herr_t		result;
 #if H5C_COLLECT_CACHE_STATS
     int32_t             clean_entries_skipped = 0;
     int32_t             total_entries_scanned = 0;
@@ -8096,9 +9124,11 @@ H5C_make_space_in_cache(H5F_t *	f,
     size_t		empty_space;
     hbool_t		prev_is_dirty = FALSE;
     hbool_t             didnt_flush_entry = FALSE;
+    hbool_t		restart_scan;
     H5C_cache_entry_t *	entry_ptr;
     H5C_cache_entry_t *	prev_ptr;
     H5C_cache_entry_t *	next_ptr;
+    int32_t 		num_corked_entries = 0;
     herr_t		ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
@@ -8106,15 +9136,13 @@ H5C_make_space_in_cache(H5F_t *	f,
     HDassert( f );
     HDassert( cache_ptr );
     HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-    HDassert( first_flush_ptr != NULL );
-    HDassert( ( *first_flush_ptr == TRUE ) || ( *first_flush_ptr == FALSE ) );
     HDassert( cache_ptr->index_size ==
 	      (cache_ptr->clean_index_size + cache_ptr->dirty_index_size) );
 
     if ( write_permitted ) {
 
+        restart_scan = FALSE;
         initial_list_len = cache_ptr->LRU_list_len;
-
         entry_ptr = cache_ptr->LRU_tail_ptr;
 
 	if ( cache_ptr->index_size >= cache_ptr->max_cache_size ) {
@@ -8144,7 +9172,8 @@ H5C_make_space_in_cache(H5F_t *	f,
                 ( entry_ptr != NULL )
               )
         {
-            HDassert( ! (entry_ptr->is_protected) );
+	    HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+            HDassert( !(entry_ptr->is_protected) );
             HDassert( ! (entry_ptr->is_read_only) );
             HDassert( (entry_ptr->ro_ref_count) == 0 );
 
@@ -8156,9 +9185,16 @@ H5C_make_space_in_cache(H5F_t *	f,
 		prev_is_dirty = prev_ptr->is_dirty;
 	    }
 
-            if ( (entry_ptr->type)->id != H5C__EPOCH_MARKER_TYPE ) {
+	    if (entry_ptr->is_corked && entry_ptr->is_dirty) {
 
-                didnt_flush_entry = FALSE;
+                /* Skip "dirty" corked entries.  */
+		++num_corked_entries;
+                didnt_flush_entry = TRUE;
+
+	    } else if ( ( (entry_ptr->type)->id != H5C__EPOCH_MARKER_TYPE ) &&
+                 ( ! entry_ptr->flush_in_progress ) ) {
+
+                didnt_flush_entry = FALSE;
 
                 if ( entry_ptr->is_dirty ) {
 
@@ -8170,14 +9206,26 @@ H5C_make_space_in_cache(H5F_t *	f,
                         cache_ptr->entries_scanned_to_make_space++;
                     }
 #endif /* H5C_COLLECT_CACHE_STATS */
-                    result = H5C_flush_single_entry(f,
-                                                    primary_dxpl_id,
-                                                    secondary_dxpl_id,
-                                                    entry_ptr->type,
-                                                    entry_ptr->addr,
-                                                    H5C__NO_FLAGS_SET,
-                                                    first_flush_ptr,
-                                                    FALSE);
+
+		    /* reset entries_removed_counter and 
+                     * last_entry_removed_ptr prior to the call to 
+                     * H5C__flush_single_entry() so that we can spot 
+                     * unexpected removals of entries from the cache,
+                     * and set the restart_scan flag if proceeding
+                     * would be likely to cause us to scan an entry
+                     * that is no longer in the cache.
+                     */
+                    cache_ptr->entries_removed_counter = 0;
+                    cache_ptr->last_entry_removed_ptr  = NULL;
+
+                    if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__NO_FLAGS_SET, NULL) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush entry")
+
+		    if ( ( cache_ptr->entries_removed_counter > 1 ) ||
+                         ( cache_ptr->last_entry_removed_ptr == prev_ptr ) )
+
+                        restart_scan = TRUE;
+
                 } else if ( (cache_ptr->index_size + space_needed)
                               >
                              cache_ptr->max_cache_size ) {
@@ -8185,69 +9233,43 @@ H5C_make_space_in_cache(H5F_t *	f,
                     cache_ptr->entries_scanned_to_make_space++;
 #endif /* H5C_COLLECT_CACHE_STATS */
 
-                    result = H5C_flush_single_entry(f,
-                                                    primary_dxpl_id,
-                                                    secondary_dxpl_id,
-                                                    entry_ptr->type,
-                                                    entry_ptr->addr,
-                                                    H5C__FLUSH_INVALIDATE_FLAG,
-                                                    first_flush_ptr,
-                                                    TRUE);
+                    if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__FLUSH_INVALIDATE_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL) < 0)
+                        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush entry")
                 } else {
-
-                    /* We have enough space so don't flush clean entry.
-                     * Set result to SUCCEED to avoid triggering the error
-                     * code below.
-                     */
+                    /* We have enough space so don't flush clean entry. */
 #if H5C_COLLECT_CACHE_STATS
                     clean_entries_skipped++;
 #endif /* H5C_COLLECT_CACHE_STATS */
                     didnt_flush_entry = TRUE;
-                    result = SUCCEED;
-
                 }
 
 #if H5C_COLLECT_CACHE_STATS
                 total_entries_scanned++;
 #endif /* H5C_COLLECT_CACHE_STATS */
 
-
             } else {
 
-                /* Skip epoch markers.  Set result to SUCCEED to avoid
-                 * triggering the error code below.
+                /* Skip epoch markers and entries that are in the process
+                 * of being flushed.
                  */
                 didnt_flush_entry = TRUE;
-                result = SUCCEED;
-            }
-
-            if ( result < 0 ) {
-
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
-                            "unable to flush entry")
             }
 
 	    if ( prev_ptr != NULL ) {
-#ifndef NDEBUG
-		if ( prev_ptr->magic != H5C__H5C_CACHE_ENTRY_T_MAGIC ) {
-
-		    /* something horrible has happened to *prev_ptr --
-		     * scream and die.
-		     */
-                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-				"*prev_ptr corrupt 1")
 
-                }
-#endif /* NDEBUG */
 		if ( didnt_flush_entry ) {
 
-		    /* epoch markers don't get flushed, so the sanity checks
-		     * on normal entries will fail -- thus just set entry_ptr
-		     * to prev_ptr and go on.
+		    /* epoch markers don't get flushed, and we don't touch
+                     * entries that are in the process of being flushed.
+                     * Hence no need for sanity checks, as we haven't
+                     * flushed anything.  Thus just set entry_ptr to prev_ptr
+                     * and go on.
 		     */
                     entry_ptr = prev_ptr;
 
-		} else if ( ( prev_ptr->is_dirty != prev_is_dirty )
+		} else if ( ( restart_scan )
+                            ||
+                            ( prev_ptr->is_dirty != prev_is_dirty )
 		            ||
 		            ( prev_ptr->next != next_ptr )
 		            ||
@@ -8258,7 +9280,9 @@ H5C_make_space_in_cache(H5F_t *	f,
 		    /* something has happened to the LRU -- start over
 		     * from the tail.
 		     */
+                    restart_scan = FALSE;
 	            entry_ptr = cache_ptr->LRU_tail_ptr;
+		    H5C__UPDATE_STATS_FOR_LRU_SCAN_RESTART(cache_ptr)
 
 		} else {
 
@@ -8306,12 +9330,14 @@ H5C_make_space_in_cache(H5F_t *	f,
         }
 #endif /* H5C_COLLECT_CACHE_STATS */
 
+
+	/* NEED: work on a better assert for corked entries */
 	HDassert( ( entries_examined > (2 * initial_list_len) ) ||
 		  ( (cache_ptr->pl_size + cache_ptr->pel_size + cache_ptr->min_clean_size) >
 		    cache_ptr->max_cache_size ) ||
 		  ( ( cache_ptr->clean_index_size + empty_space )
-		    >= cache_ptr->min_clean_size ) );
-
+		    >= cache_ptr->min_clean_size ) ||
+		  ( ( num_corked_entries )));
 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
 
         HDassert( ( entries_examined > (2 * initial_list_len) ) ||
@@ -8345,20 +9371,14 @@ H5C_make_space_in_cache(H5F_t *	f,
 
             prev_ptr = entry_ptr->aux_prev;
 
-            result = H5C_flush_single_entry(f,
-                                            primary_dxpl_id,
-                                            secondary_dxpl_id,
-                                            entry_ptr->type,
-                                            entry_ptr->addr,
-                                            H5C__FLUSH_INVALIDATE_FLAG,
-                                            first_flush_ptr,
-                                            TRUE);
-
-            if ( result < 0 ) {
+            if(H5C__flush_single_entry(f, dxpl_id, entry_ptr, H5C__FLUSH_INVALIDATE_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush entry")
 
-                HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
-                            "unable to flush entry")
-            }
+	    /* we are scanning the clean LRU, so the serialize function
+	     * will not be called on any entry -- thus there is no
+	     * concern about the list being modified out from under
+	     * this function.
+	     */
 
             entry_ptr = prev_ptr;
 	    entries_examined++;
@@ -8386,6 +9406,11 @@ done:
  *
  * Programmer:  John Mainzer, 7/14/05
  *
+ * Changes:
+ *
+ *		Added code to verify that the LRU contains no pinned 
+ *		entries.                        JRM -- 4/25/14
+ *
  *-------------------------------------------------------------------------
  */
 #if H5C_DO_EXTREME_SANITY_CHECKS
@@ -8414,10 +9439,8 @@ H5C_validate_lru_list(H5C_t * cache_ptr)
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 1 failed")
     }
 
-    if ( ( cache_ptr->LRU_list_len < 0 ) || ( cache_ptr->LRU_list_size < 0 ) ) {
-
+    if(cache_ptr->LRU_list_len < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 2 failed")
-    }
 
     if ( ( cache_ptr->LRU_list_len == 1 )
          &&
@@ -8465,6 +9488,13 @@ H5C_validate_lru_list(H5C_t * cache_ptr)
             HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 6 failed")
         }
 
+        if ( ( entry_ptr->is_pinned ) || 
+             ( entry_ptr->pinned_from_client ) ||
+             ( entry_ptr->pinned_from_cache ) ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 7 failed")
+        }
+
         len++;
         size += entry_ptr->size;
         entry_ptr = entry_ptr->next;
@@ -8473,7 +9503,7 @@ H5C_validate_lru_list(H5C_t * cache_ptr)
     if ( ( cache_ptr->LRU_list_len != len ) ||
          ( cache_ptr->LRU_list_size != size ) ) {
 
-        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 7 failed")
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 8 failed")
     }
 
 done:
@@ -8492,11 +9522,10 @@ done:
 

 /*-------------------------------------------------------------------------
  *
- * Function:    H5C_verify_not_in_index
+ * Function:    H5C_validate_pinned_entry_list
  *
- * Purpose:     Debugging function that scans the hash table to verify
- *		that the specified instance of H5C_cache_entry_t is not
- *		present.
+ * Purpose:     Debugging function that scans the pinned entry list for 
+ *              errors.
  *
  *		If an error is detected, the function generates a
  *		diagnostic and returns FAIL.  If no error is detected,
@@ -8504,42 +9533,234 @@ done:
  *
  * Return:      FAIL if error is detected, SUCCEED otherwise.
  *
- * Programmer:  John Mainzer, 7/14/05
+ * Programmer:  John Mainzer, 4/25/14
+ *
+ * Changes:
+ *
+ *		None.
  *
  *-------------------------------------------------------------------------
  */
 #if H5C_DO_EXTREME_SANITY_CHECKS
 
 static herr_t
-H5C_verify_not_in_index(H5C_t * cache_ptr,
-                        H5C_cache_entry_t * entry_ptr)
+H5C_validate_pinned_entry_list(H5C_t * cache_ptr)
 {
     herr_t		ret_value = SUCCEED;      /* Return value */
-    int32_t             i;
-    int32_t             depth;
-    H5C_cache_entry_t *	scan_ptr = NULL;
+    int32_t             len = 0;
+    size_t              size = 0;
+    H5C_cache_entry_t *	entry_ptr = NULL;
 
     FUNC_ENTER_NOAPI_NOINIT
 
-    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr );
     HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
-    HDassert( entry_ptr != NULL );
 
-    for ( i = 0; i < H5C__HASH_TABLE_LEN; i++ )
+    if ( ( ( cache_ptr->pel_head_ptr == NULL )
+           ||
+           ( cache_ptr->pel_tail_ptr == NULL )
+         )
+         &&
+         ( cache_ptr->pel_head_ptr != cache_ptr->pel_tail_ptr )
+       ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 1 failed")
+    }
+
+    if(cache_ptr->pel_len < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 2 failed")
+
+    if ( ( cache_ptr->pel_len == 1 )
+         &&
+         ( ( cache_ptr->pel_head_ptr != cache_ptr->pel_tail_ptr )
+           ||
+           ( cache_ptr->pel_head_ptr == NULL )
+           ||
+           ( cache_ptr->pel_head_ptr->size != cache_ptr->pel_size )
+         )
+       ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 3 failed")
+    }
+
+    if ( ( cache_ptr->pel_len >= 1 )
+         &&
+         ( ( cache_ptr->pel_head_ptr == NULL )
+           ||
+           ( cache_ptr->pel_head_ptr->prev != NULL )
+           ||
+           ( cache_ptr->pel_tail_ptr == NULL )
+           ||
+           ( cache_ptr->pel_tail_ptr->next != NULL )
+         )
+       ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 4 failed")
+    }
+
+    entry_ptr = cache_ptr->pel_head_ptr;
+    while ( entry_ptr != NULL )
     {
-        depth = 0;
-        scan_ptr = cache_ptr->index[i];
 
-        while ( scan_ptr != NULL )
-        {
-            if ( scan_ptr == entry_ptr ) {
+        if ( ( entry_ptr != cache_ptr->pel_head_ptr ) &&
+             ( ( entry_ptr->prev == NULL ) ||
+               ( entry_ptr->prev->next != entry_ptr ) ) ) {
 
-                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
-                            "Entry already in index.")
-            }
-            depth++;
-            scan_ptr = scan_ptr->ht_next;
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 5 failed")
+        }
+
+        if ( ( entry_ptr != cache_ptr->pel_tail_ptr ) &&
+             ( ( entry_ptr->next == NULL ) ||
+               ( entry_ptr->next->prev != entry_ptr ) ) ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 6 failed")
+        }
+
+        if ( ! entry_ptr->is_pinned ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 7 failed")
+        }
+
+        if ( ! ( ( entry_ptr->pinned_from_client ) ||
+                 ( entry_ptr->pinned_from_cache ) ) ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 8 failed")
+        }
+
+        len++;
+        size += entry_ptr->size;
+        entry_ptr = entry_ptr->next;
+    }
+
+    if ( ( cache_ptr->pel_len != len ) ||
+         ( cache_ptr->pel_size != size ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 9 failed")
+    }
+
+done:
+
+    if ( ret_value != SUCCEED ) {
+
+        HDassert(0);
+    }
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_validate_pinned_entry_list() */
+
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_validate_protected_entry_list
+ *
+ * Purpose:     Debugging function that scans the protected entry list for 
+ *              errors.
+ *
+ *		If an error is detected, the function generates a
+ *		diagnostic and returns FAIL.  If no error is detected,
+ *		the function returns SUCCEED.
+ *
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *
+ * Programmer:  John Mainzer, 4/25/14
+ *
+ * Changes:
+ *
+ *		None.
+ *
+ *-------------------------------------------------------------------------
+ */
+#if H5C_DO_EXTREME_SANITY_CHECKS
+
+static herr_t
+H5C_validate_protected_entry_list(H5C_t * cache_ptr)
+{
+    herr_t		ret_value = SUCCEED;      /* Return value */
+    int32_t             len = 0;
+    size_t              size = 0;
+    H5C_cache_entry_t *	entry_ptr = NULL;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    if(((cache_ptr->pl_head_ptr == NULL) || (cache_ptr->pl_tail_ptr == NULL))
+             && (cache_ptr->pl_head_ptr != cache_ptr->pl_tail_ptr))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 1 failed")
+
+    if(cache_ptr->pl_len < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 2 failed")
+
+    if ( ( cache_ptr->pl_len == 1 )
+         &&
+         ( ( cache_ptr->pl_head_ptr != cache_ptr->pl_tail_ptr )
+           ||
+           ( cache_ptr->pl_head_ptr == NULL )
+           ||
+           ( cache_ptr->pl_head_ptr->size != cache_ptr->pl_size )
+         )
+       ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 3 failed")
+    }
+
+    if ( ( cache_ptr->pl_len >= 1 )
+         &&
+         ( ( cache_ptr->pl_head_ptr == NULL )
+           ||
+           ( cache_ptr->pl_head_ptr->prev != NULL )
+           ||
+           ( cache_ptr->pl_tail_ptr == NULL )
+           ||
+           ( cache_ptr->pl_tail_ptr->next != NULL )
+         )
+       ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 4 failed")
+    }
+
+    entry_ptr = cache_ptr->pl_head_ptr;
+    while ( entry_ptr != NULL )
+    {
+
+        if ( ( entry_ptr != cache_ptr->pl_head_ptr ) &&
+             ( ( entry_ptr->prev == NULL ) ||
+               ( entry_ptr->prev->next != entry_ptr ) ) ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 5 failed")
         }
+
+        if ( ( entry_ptr != cache_ptr->pl_tail_ptr ) &&
+             ( ( entry_ptr->next == NULL ) ||
+               ( entry_ptr->next->prev != entry_ptr ) ) ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 6 failed")
+        }
+
+        if ( ! entry_ptr->is_protected ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 7 failed")
+        }
+
+        if ( ( entry_ptr->is_read_only ) &&
+             ( entry_ptr->ro_ref_count <= 0 ) ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 8 failed")
+        }
+
+        len++;
+        size += entry_ptr->size;
+        entry_ptr = entry_ptr->next;
+    }
+
+    if ( ( cache_ptr->pl_len != len ) ||
+         ( cache_ptr->pl_size != size ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 9 failed")
     }
 
 done:
@@ -8551,7 +9772,1041 @@ done:
 
     FUNC_LEAVE_NOAPI(ret_value)
 
-} /* H5C_verify_not_in_index() */
+} /* H5C_validate_protected_entry_list() */
 
 #endif /* H5C_DO_EXTREME_SANITY_CHECKS */
 
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_entry_in_skip_list
+ *
+ * Purpose:     Debugging function that scans skip list to see if it 
+ *		is in present.  We need this, as it is possible for 
+ *		an entry to be in the skip list twice.
+ *
+ * Return:      FALSE if the entry is not in the skip list, and TRUE 
+ *		if it is.
+ *
+ * Programmer:  John Mainzer, 11/1/14
+ *
+ * Changes:
+ *
+ *		None.
+ *
+ *-------------------------------------------------------------------------
+ */
+#if H5C_DO_SLIST_SANITY_CHECKS
+
+static hbool_t
+H5C_entry_in_skip_list(H5C_t * cache_ptr, H5C_cache_entry_t *target_ptr)
+{
+    hbool_t in_slist              = FALSE;
+    H5SL_node_t *       node_ptr  = NULL;
+    H5C_cache_entry_t *	entry_ptr = NULL;
+
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( cache_ptr->slist_ptr );
+
+    node_ptr = H5SL_first(cache_ptr->slist_ptr);
+
+    while ( ( node_ptr != NULL ) && ( ! in_slist ) )
+    {
+        entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr);
+
+	HDassert( entry_ptr );
+	HDassert( entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC );
+        HDassert( entry_ptr->is_dirty );
+        HDassert( entry_ptr->in_slist );
+
+        if ( entry_ptr == target_ptr ) {
+
+	    in_slist = TRUE;
+
+	} else {
+
+	    node_ptr = H5SL_next(node_ptr);
+	}
+    }
+
+    return(in_slist);
+
+} /* H5C_entry_in_skip_list() */
+
+#endif /* H5C_DO_SLIST_SANITY_CHECKS */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_get_entry_ptr_from_addr()
+ *
+ * Purpose:     Debugging function that attempts to look up an entry in the 
+ *		cache by its file address, and if found, returns a pointer 
+ *		to the entry in *entry_ptr_ptr.  If the entry is not in the 
+ *		cache, *entry_ptr_ptr is set to NULL.
+ *
+ *		WARNING: This call should be used only in debugging  
+ *			 routines, and it should be avoided when 
+ *			 possible.
+ *
+ *			 Further, if we ever multi-thread the cache, 
+ *			 this routine will have to be either discarded 
+ *			 or heavily re-worked.
+ *
+ *			 Finally, keep in mind that the entry whose 
+ *			 pointer is obtained in this fashion may not 
+ *			 be in a stable state.  
+ *
+ *		Note that this function is only defined if NDEBUG
+ *		is not defined.
+ *
+ *		As heavy use of this function is almost certainly a 
+ *		bad idea, the metadata cache tracks the number of 
+ *		successful calls to this function, and (if 
+ *              H5C_DO_SANITY_CHECKS is defined) displays any 
+ *		non-zero count on cache shutdown.
+ *
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *
+ * Programmer:  John Mainzer, 5/30/14
+ *
+ * Changes:
+ *
+ *		None.
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NDEBUG
+herr_t
+H5C_get_entry_ptr_from_addr(const H5F_t *f,
+                            haddr_t   addr,
+			    void ** entry_ptr_ptr)
+{
+    H5C_t             * cache_ptr;
+    H5C_cache_entry_t * entry_ptr = NULL;
+    herr_t              ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( f );
+    HDassert( f->shared );
+
+    cache_ptr = f->shared->cache;
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( H5F_addr_defined(addr) );
+    HDassert( entry_ptr_ptr != NULL );
+
+    /* this test duplicates two of the above asserts, but we need an
+     * invocation of HGOTO_ERROR to keep the compiler happy.
+     */
+    if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
+    }
+
+    H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
+
+    if ( entry_ptr == NULL ) {
+
+        /* the entry doesn't exist in the cache -- report this
+         * and quit.
+         */
+        *entry_ptr_ptr = NULL;
+
+    } else {
+
+        *entry_ptr_ptr = entry_ptr;
+
+	/* increment call counter */
+	(cache_ptr->get_entry_ptr_from_addr_counter)++;
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_get_entry_ptr_from_addr() */
+
+#endif /* NDEBUG */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_verify_entry_type()
+ *
+ * Purpose:     Debugging function that attempts to look up an entry in the 
+ *		cache by its file address, and if found, test to see if its
+ *		type field contains the expted value.
+ *
+ *		If the specified entry is in cache, *in_cache_ptr is set
+ *		to TRUE, and *type_ok_ptr is set to TRUE or FALSE
+ *		depending on whether the entries type field matches the 
+ *		expected_type parameter
+ *
+ *		If the target entry is not in cache, *in_cache_ptr is 
+ *		set to FALSE, and *type_ok_ptr is undefined.
+ *
+ *		Note that this function is only defined if NDEBUG
+ *		is not defined.
+ *
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *
+ * Programmer:  John Mainzer, 5/30/14
+ *
+ * Changes:
+ *
+ *		None.
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NDEBUG
+herr_t
+H5C_verify_entry_type(const H5F_t *f,
+                      haddr_t   addr,
+                      const H5C_class_t * expected_type,
+                      hbool_t * in_cache_ptr,
+                      hbool_t * type_ok_ptr)
+{
+    H5C_t             * cache_ptr;
+    H5C_cache_entry_t * entry_ptr = NULL;
+    herr_t              ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( f );
+    HDassert( f->shared );
+
+    cache_ptr = f->shared->cache;
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( H5F_addr_defined(addr) );
+    HDassert( in_cache_ptr != NULL );
+    HDassert( type_ok_ptr != NULL );
+
+    /* this test duplicates two of the above asserts, but we need an
+     * invocation of HGOTO_ERROR to keep the compiler happy.
+     */
+    if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.")
+    }
+
+    H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
+
+    if ( entry_ptr == NULL ) {
+
+        /* the entry doesn't exist in the cache -- report this
+         * and quit.
+         */
+        *in_cache_ptr = FALSE;
+
+    } else {
+
+        *in_cache_ptr = TRUE;
+	*type_ok_ptr = (expected_type == entry_ptr->type);
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_verify_entry_type() */
+
+#endif /* NDEBUG */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_ignore_tags
+ *
+ * Purpose:     Override all assertion frameworks associated with making
+ *              sure proper tags are applied to cache entries. 
+ *
+ *              NOTE: This should really only be used in tests that need 
+ *              to access internal functions without going through 
+ *              standard API paths. Since tags are set inside dxpl_id's
+ *              before coming into the cache, any external functions that
+ *              use the internal library functions (i.e., tests) should
+ *              use this function if they don't plan on setting up proper
+ *              metadata tags.
+ *
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *
+ * Programmer:  Mike McGreevy
+ *              December 1, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_ignore_tags(H5C_t * cache_ptr)
+{
+    FUNC_ENTER_NOAPI_NOERR
+
+    /* Assertions */
+    HDassert(cache_ptr != NULL);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* Set variable to ignore tag values upon assignment */
+    cache_ptr->ignore_tags = TRUE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5C_ignore_tags */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_tag_entry
+ *
+ * Purpose:     Tags an entry with the provided tag (contained in the dxpl_id).
+ *              If sanity checking is enabled, this function will perform 
+ *              validation that a proper tag is contained within the provided 
+ *              data access property list id before application.
+ *
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *
+ * Programmer:  Mike McGreevy
+ *              January 14, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C_tag_entry(H5C_t * cache_ptr, H5C_cache_entry_t * entry_ptr, hid_t dxpl_id)
+{
+    H5P_genplist_t *dxpl;       /* dataset transfer property list */
+    H5C_tag_t tag;              /* Tag structure */
+    herr_t ret_value = SUCCEED;  /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Assertions */
+    HDassert(cache_ptr != NULL);
+    HDassert(entry_ptr != NULL);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* Get the dataset transfer property list */
+    if(NULL == (dxpl = (H5P_genplist_t *)H5I_object_verify(dxpl_id, H5I_GENPROP_LST)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+
+    /* Get the tag from the DXPL */
+    if((H5P_get(dxpl, "H5C_tag", &tag)) < 0)
+	HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to query property value")
+
+    if(cache_ptr->ignore_tags != TRUE) {
+#if H5C_DO_TAGGING_SANITY_CHECKS
+        /* Perform some sanity checks to ensure that a correct tag is being applied */
+        if(H5C_verify_tag(entry_ptr->type->id, tag.value) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "tag verification failed")
+#endif
+    } else {
+        /* if we're ignoring tags, it's because we're running
+           tests on internal functions and may not have inserted a tag 
+           value into a given dxpl_id before creating some metadata. Thus,
+           in this case only, if a tag value has not been set, we can
+           arbitrarily set it to something for the sake of passing the tests. 
+           If the tag value is set, then we'll just let it get assigned without
+           additional checking for correctness. */
+        if(!tag.value) {
+            tag.value = H5AC__IGNORE_TAG;
+            tag.globality = H5C_GLOBALITY_NONE;
+        } /* end if */
+    } /* end if */
+
+    /* Apply the tag to the entry */
+    entry_ptr->tag = tag.value;
+
+    /* Apply the tag globality to the entry */
+    entry_ptr->globality = tag.globality;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_tag_entry */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_evict_tagged_entries
+ *
+ * Purpose:     Evicts all entries with the specified tag from cache
+ *
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *
+ * Programmer:  Mike McGreevy
+ *              August 19, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_evict_tagged_entries(H5F_t * f, hid_t dxpl_id, haddr_t tag)
+{
+    /* Variable Declarations */
+    H5C_t *cache_ptr = NULL;
+    H5C_cache_entry_t * entry_ptr = NULL;
+    H5C_cache_entry_t * next_entry_ptr = NULL;
+    hbool_t evicted_entries_last_pass;
+    hbool_t pinned_entries_need_evicted;
+    int i;
+    herr_t ret_value = SUCCEED;
+
+    /* Function Enter Macro */
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Assertions */
+    HDassert(f);
+    HDassert(f->shared);
+
+    /* Get cache pointer */
+    cache_ptr = f->shared->cache;
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    /* Start evicting entries */
+    do {
+
+	/* Reset pinned/evicted trackers */
+	pinned_entries_need_evicted = FALSE;
+	evicted_entries_last_pass = FALSE;
+
+	/* Iterate through entries in the index. */
+	for (i = 0; i < H5C__HASH_TABLE_LEN; i++) {
+
+	    next_entry_ptr = cache_ptr->index[i];
+
+	    while ( next_entry_ptr != NULL ) {
+
+		entry_ptr = next_entry_ptr;
+		next_entry_ptr = entry_ptr->ht_next;
+
+		if(( entry_ptr->tag == tag ) ||
+		    ( entry_ptr->globality == H5C_GLOBALITY_MAJOR)) {
+
+		    /* This entry will need to be evicted */
+
+		    if ( entry_ptr->is_protected ) {
+			HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Cannot evict protected entry");
+		    } else if (entry_ptr->is_dirty) {
+			HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Cannot evict dirty entry");
+		    } else if (entry_ptr->is_pinned) {
+			
+			/* Can't evict at this time, but let's note that we hit a pinned
+			    entry and we'll loop back around again (as evicting other
+			    entries will hopefully unpin this entry) */
+    
+			pinned_entries_need_evicted = TRUE;
+
+		    } else {
+
+			/* Evict the Entry */
+
+			if(H5C__flush_single_entry(f, dxpl_id, entry_ptr,
+						  H5C__FLUSH_INVALIDATE_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG,
+						  NULL) < 0)
+
+			    HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \
+					"Entry eviction failed.")
+
+			evicted_entries_last_pass = TRUE;
+
+		    } /* end if */
+
+		} /* end if */
+
+	    } /* end while */
+
+	} /* end for */
+
+    /* Keep doing this until we have stopped evicted entries */
+    } while (evicted_entries_last_pass == TRUE);
+
+    /* If we stop evicting entries and pinned entries still need evicted, 
+       then we have a problem. */
+    if (pinned_entries_need_evicted) {
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Pinned entries still need evicted?!");
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value);
+
+} /* H5C_evict_tagged_entries */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_mark_tagged_entries
+ *
+ * Purpose:     Set the flush marker on dirty entries in the cache that have
+ *              the specified tag, as well as all globally tagged entries.
+ *              If mark_clean is set, this function will also mark all clean
+ *              entries, indicating they are to be evicted.
+ *
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *
+ * Programmer:  Mike McGreevy
+ *              September 9, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5C_mark_tagged_entries(H5C_t * cache_ptr, haddr_t tag, hbool_t mark_clean)
+{
+    /* Variable Declarations */
+    int u;                          /* Iterator */
+    H5C_cache_entry_t *entry_ptr = NULL; /* entry pointer */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Assertions */
+    HDassert(cache_ptr != NULL);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* Iterate through entries, marking those with specified tag, as
+     * well as any major global entries which should always be flushed
+     * when flushing based on tag value */
+    for(u = 0; u < H5C__HASH_TABLE_LEN; u++) {
+
+	entry_ptr = cache_ptr->index[u];
+
+	while ( entry_ptr != NULL ) {
+
+	    if (( entry_ptr->tag == tag ) || 
+		( entry_ptr->globality == H5C_GLOBALITY_MAJOR)) {
+    
+		/* We only want to set the flush marker on entries that
+		 * actually need flushed (i.e., dirty ones), unless 
+		 * we've specified otherwise with the mark_clean flag */
+		if (entry_ptr->is_dirty || mark_clean) {  
+
+		    entry_ptr->flush_marker = TRUE;
+
+		} /* end if */
+
+	    } /* end if */
+
+	    entry_ptr = entry_ptr->ht_next;
+	} /* end while */
+    } /* for */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5C_mark_tagged_entries */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_flush_marked_entries
+ *
+ * Purpose:     Flushes all marked entries in the cache.
+ *
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *
+ * Programmer:  Mike McGreevy
+ *              November 3, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C_flush_marked_entries(H5F_t * f, hid_t dxpl_id)
+{ 
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Assertions */
+    HDassert(f != NULL);
+
+    /* Flush all marked entries */
+    if(H5C_flush_cache(f, dxpl_id, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_IGNORE_PROTECTED_FLAG) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush cache")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_flush_marked_entries */
+
+#if H5C_DO_TAGGING_SANITY_CHECKS
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_verify_tag
+ *
+ * Purpose:     Performs sanity checking on an entrytype/tag pair.
+ *
+ * Return:      SUCCEED or FAIL.
+ *
+ * Programmer:  Mike McGreevy
+ *              January 14, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C_verify_tag(int id, haddr_t tag) 
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Perform some sanity checks on tag value. Certain entry
+     * types require certain tag values, so check that these
+     * constraints are met. */
+    if(tag == H5AC__IGNORE_TAG)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "cannot ignore a tag while doing verification.")
+    else if(tag == H5AC__INVALID_TAG)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "no metadata tag provided")
+    else {
+
+        /* Perform some sanity checks on tag value. Certain entry
+         * types require certain tag values, so check that these
+         * constraints are met. */
+
+        /* Superblock */
+        if((id == H5AC_SUPERBLOCK_ID) || (id == H5AC_DRVRINFO_ID)) {
+            if(tag != H5AC__SUPERBLOCK_TAG)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "superblock not tagged with H5AC__SUPERBLOCK_TAG")
+        }
+        else {
+            if(tag == H5AC__SUPERBLOCK_TAG)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "H5AC__SUPERBLOCK_TAG applied to non-superblock entry")
+        }
+    
+        /* Free Space Manager */
+        if((id == H5AC_FSPACE_HDR_ID) || (id == H5AC_FSPACE_SINFO_ID)) {
+            if(tag != H5AC__FREESPACE_TAG)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "freespace entry not tagged with H5AC__FREESPACE_TAG")
+        }
+        else {
+            if(tag == H5AC__FREESPACE_TAG)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "H5AC__FREESPACE_TAG applied to non-freespace entry")
+        }
+    
+        /* SOHM */
+        if((id == H5AC_SOHM_TABLE_ID) || (id == H5AC_SOHM_LIST_ID)) { 
+            if(tag != H5AC__SOHM_TAG)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "sohm entry not tagged with H5AC__SOHM_TAG")
+        }
+    
+        /* Global Heap */
+        if(id == H5AC_GHEAP_ID) {
+            if(tag != H5AC__GLOBALHEAP_TAG)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "global heap not tagged with H5AC__GLOBALHEAP_TAG")
+        }
+        else {
+            if(tag == H5AC__GLOBALHEAP_TAG)
+                HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "H5AC__GLOBALHEAP_TAG applied to non-globalheap entry")
+        }
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_verify_tag */
+#endif
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_flush_tagged_entries
+ *
+ * Purpose:     Flushes all entries with the specified tag to disk.
+ *
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *
+ * Programmer:  Mike McGreevy
+ *              August 19, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_flush_tagged_entries(H5F_t * f, hid_t dxpl_id, haddr_t tag)
+{
+    /* Variable Declarations */
+    H5C_t      *cache_ptr = NULL;
+    herr_t      ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Assertions */
+    HDassert(f);
+    HDassert(f->shared);
+
+    /* Get cache pointer */
+    cache_ptr = f->shared->cache;
+
+    /* Mark all entries with specified tag */
+    if(H5C_mark_tagged_entries(cache_ptr, tag, FALSE) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't mark tagged entries")
+
+    /* Flush all marked entries */
+    if(H5C_flush_marked_entries(f, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush marked entries")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_flush_tagged_entries */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_retag_entries
+ *
+ * Purpose:     Searches through cache index for all entries with the
+ *              value specified by src_tag and changes it to the value
+ *              specified by dest_tag.
+ *
+ * Return:      SUCCEED or FAIL.
+ *
+ * Programmer:  Mike McGreevy
+ *              March 17, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5C_retag_entries(H5C_t * cache_ptr, haddr_t src_tag, haddr_t dest_tag) 
+{
+    unsigned u;         /* Local index variable */
+    H5C_cache_entry_t *entry_ptr = NULL; /* entry pointer */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Iterate through entries, retagging those with the src_tag tag */
+    for(u = 0; u < H5C__HASH_TABLE_LEN; u++) {
+	entry_ptr = cache_ptr->index[u];
+	while(entry_ptr != NULL) {
+	    if(cache_ptr->index[u] != NULL)
+		if((cache_ptr->index[u])->tag == src_tag) {
+		    (cache_ptr->index[u])->tag = dest_tag;
+		}
+	    entry_ptr = entry_ptr->ht_next;
+	} /* end while */
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* H5C_retag_entries */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_get_entry_ring
+ *
+ * Purpose:     Given a file address, retrieve the ring for an entry at that
+ *              address.
+ *
+ * 		On error, the value of *ring is not modified.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              9/8/15
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_get_entry_ring(const H5F_t *f, haddr_t addr, H5C_ring_t *ring)
+{
+    H5C_t *cache_ptr;                   /* Pointer to cache */
+    H5C_cache_entry_t *entry_ptr;       /* Pointer to cache entry at address */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(f->shared);
+    cache_ptr = f->shared->cache;
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert(H5F_addr_defined(addr));
+
+    /* Locate the entry at the address */
+    H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
+    HDassert(entry_ptr);
+
+    /* Return the ring value */
+    *ring = entry_ptr->ring;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_get_entry_ring() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_cork
+ *
+ * Purpose:     To cork/uncork/get cork status of an object depending on "action":
+ *		H5C__SET_CORK: 
+ *			To cork the object
+ *			Return error if the object is already corked
+ *		H5C__UNCORK:
+ *			To uncork the obejct
+ *			Return error if the object is not corked
+ * 		H5C__GET_CORKED:
+ *			To retrieve the cork status of an object in
+ *			the parameter "corked"
+ *		
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Vailin Choi; January 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_cork(H5C_t * cache_ptr, haddr_t obj_addr, unsigned action, hbool_t *corked) 
+{
+    haddr_t *ptr;		/* Points to an address */
+    herr_t ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Assertions */
+    HDassert(cache_ptr != NULL);
+    HDassert(H5F_addr_defined(obj_addr));
+    HDassert(action == H5C__SET_CORK || action == H5C__UNCORK || action == H5C__GET_CORKED);
+
+    /* Search the list of corked object addresses in the cache */
+    ptr = (haddr_t *)H5SL_search(cache_ptr->cork_list_ptr, &obj_addr);
+
+    if(H5C__GET_CORKED == action) {
+        HDassert(corked);
+        if(ptr != NULL && *ptr == obj_addr)
+            *corked = TRUE;
+        else
+            *corked = FALSE;
+    } /* end if */
+    else {
+        hbool_t is_corked;		/* Cork status for an entry */
+
+        /* Sanity check */
+        HDassert(H5C__SET_CORK == action || H5C__UNCORK == action);
+
+        /* Perform appropriate action */
+        if(H5C__SET_CORK == action) {
+            haddr_t *addr_ptr = NULL;	/* Points to an address */
+
+            if(ptr != NULL && *ptr == obj_addr)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't cork an already corked object")
+
+            /* Allocate address */
+            if(NULL == (addr_ptr = H5FL_MALLOC(haddr_t)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+            /* Insert into the list */
+            *addr_ptr = obj_addr;
+            if(H5SL_insert(cache_ptr->cork_list_ptr, addr_ptr, addr_ptr) < 0) {
+                addr_ptr = H5FL_FREE(haddr_t, addr_ptr);
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't insert address into cork list")
+            } /* end if */
+
+            /* Set the entry's cork status */
+            is_corked = TRUE;
+        } /* end if */
+        else {
+            if(ptr == NULL)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't uncork an object that is not corked ")
+
+            /* Remove the object address from the list */
+            ptr = (haddr_t *)H5SL_remove(cache_ptr->cork_list_ptr, &obj_addr);
+            if(ptr == NULL || *ptr != obj_addr)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't remove address from list")
+
+            /* Free address */
+            ptr = H5FL_FREE(haddr_t, ptr);
+
+            /* Set the entry's cork status */
+            is_corked = FALSE;
+        } /* end else */
+
+        /* Mark existing cache entries with tag (obj_addr) to the cork status */
+        if(H5C_mark_tagged_entries_cork(cache_ptr, obj_addr, is_corked) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "can't mark cork status on entry")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_cork() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_mark_tagged_entries_cork
+ *		
+ *		NEED: work to combine with H5C_mark_tagged_entries()--
+ *		      probably an action (FLUSH or CORK) with hbool_t clean_or_cork
+ *
+ * Purpose:     To set the "is_corked" field to "val" for entries in cache 
+ *		with the entry's tag equals to "obj_addr".
+ *
+ * Return:      FAIL if error is detected, SUCCEED otherwise.
+ *
+ * Programmer:  Vailin Choi; January 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5C_mark_tagged_entries_cork(H5C_t *cache_ptr, haddr_t obj_addr, hbool_t val)
+{
+    /* Variable Declarations */
+    int u;                          /* Iterator */
+    H5C_cache_entry_t *entry_ptr = NULL; /* entry pointer */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Assertions */
+    HDassert(cache_ptr != NULL);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    /* Iterate through entries, find each entry with the specified tag */
+    /* and set the entry's "corked" field to "val" */
+    for(u = 0; u < H5C__HASH_TABLE_LEN; u++) {
+
+	entry_ptr = cache_ptr->index[u];
+
+	while(entry_ptr != NULL) {
+
+	    if(entry_ptr->tag == obj_addr)
+		entry_ptr->is_corked = val;
+
+	    entry_ptr = entry_ptr->ht_next;
+	} /* end while */
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5C_mark_tagged_entries_cork */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__mark_flush_dep_dirty()
+ *
+ * Purpose:     Recursively propagate the flush_dep_ndirty_children flag
+ *              up the dependency chain in response to entry either
+ *              becoming dirty or having its flush_dep_ndirty_children
+ *              increased from 0.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              11/13/12
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__mark_flush_dep_dirty(H5C_cache_entry_t * entry)
+{
+    unsigned i;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(entry);
+    HDassert((entry->is_dirty && entry->flush_dep_ndirty_children == 0)
+	    || (!entry->is_dirty && entry->flush_dep_ndirty_children == 1));
+
+    /* Iterate over the parent entries, if any */
+    for(i=0; i<entry->flush_dep_nparents; i++) {
+	/* Sanity check */
+	HDassert(entry->flush_dep_parent[i]->flush_dep_ndirty_children
+		< entry->flush_dep_parent[i]->flush_dep_nchildren);
+
+	/* Adjust the parent's number of dirty children */
+	entry->flush_dep_parent[i]->flush_dep_ndirty_children++;
+
+	/* Propagate the flush dep dirty flag up the chain if necessary */
+	if(!entry->flush_dep_parent[i]->is_dirty
+		&& entry->flush_dep_parent[i]->flush_dep_ndirty_children == 1)
+	    if(H5C__mark_flush_dep_dirty(entry->flush_dep_parent[i]) < 0)
+		HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't propagate flush dep dirty flag")
+    } /* end for */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__mark_flush_dep_dirty() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__mark_flush_dep_clean()
+ *
+ * Purpose:     Recursively propagate the flush_dep_ndirty_children flag
+ *              up the dependency chain in response to entry either
+ *              becoming clean or having its flush_dep_ndirty_children
+ *              reduced to 0.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              11/13/12
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5C__mark_flush_dep_clean(H5C_cache_entry_t * entry)
+{
+    unsigned i;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity checks */
+    HDassert(entry);
+    HDassert(!entry->is_dirty && entry->flush_dep_ndirty_children == 0);
+
+    /* Iterate over the parent entries, if any */
+    for(i=0; i<entry->flush_dep_nparents; i++) {
+	/* Sanity check */
+	HDassert(entry->flush_dep_parent[i]->flush_dep_ndirty_children > 0);
+
+	/* Adjust the parent's number of dirty children */
+	entry->flush_dep_parent[i]->flush_dep_ndirty_children--;
+
+	/* Propagate the flush dep clean flag up the chain if necessary */
+	if(!entry->flush_dep_parent[i]->is_dirty
+		&& entry->flush_dep_parent[i]->flush_dep_ndirty_children == 0)
+	    if(H5C__mark_flush_dep_clean(entry->flush_dep_parent[i]) < 0)
+		HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't propagate flush dep clean flag")
+    } /* end for */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C__mark_flush_dep_clean() */
+
+#ifndef NDEBUG
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C__assert_flush_dep_nocycle()
+ *
+ * Purpose:     Assert recursively that base_entry is not the same as
+ *              entry, and perform the same assertion on all of entry's
+ *              flush dependency parents.  This is used to detect cycles
+ *              created by flush dependencies.
+ *
+ * Return:      void
+ *
+ * Programmer:  Neil Fortner
+ *              12/10/12
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+H5C__assert_flush_dep_nocycle(H5C_cache_entry_t * entry,
+    H5C_cache_entry_t * base_entry)
+{
+    unsigned i;                         /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity checks */
+    HDassert(entry);
+    HDassert(base_entry);
+
+    /* Make sure the entries are not the same */
+    HDassert(base_entry != entry);
+
+    /* Iterate over entry's parents (if any) */
+    for(i=0; i<entry->flush_dep_nparents; i++)
+	H5C__assert_flush_dep_nocycle(entry->flush_dep_parent[i], base_entry);
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* H5C__assert_flush_dep_nocycle() */
+#endif /* NDEBUG */
+
diff --git a/src/H5CS.c b/src/H5CS.c
index 29182ce..f1d3a8b 100644
--- a/src/H5CS.c
+++ b/src/H5CS.c
@@ -30,10 +30,19 @@
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5CSprivate.h"	/* Function stack			*/
-#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
 
 #ifdef H5_HAVE_CODESTACK
 
+#define H5CS_MIN_NSLOTS	16	/* Minimum number of records in an function stack	*/
+
+/* A function stack */
+typedef struct H5CS_t {
+    unsigned	nused;		/* Number of records currently used in stack */
+    unsigned    nalloc;         /* Number of records current allocated for stack */
+    const char **rec;           /* Array of function records */
+} H5CS_t;
+
 #ifdef H5_HAVE_THREADSAFE
 /*
  * The per-thread function stack. pthread_once() initializes a special
@@ -44,8 +53,8 @@
  * In order for this macro to work, H5CS_get_my_stack() must be preceeded
  * by "H5CS_t *fstack =".
  */
-static H5CS_t *H5CS_get_stack(void);
-#define H5CS_get_my_stack()  H5CS_get_stack()
+static H5CS_t *H5CS__get_stack(void);
+#define H5CS_get_my_stack()  H5CS__get_stack()
 #else /* H5_HAVE_THREADSAFE */
 /*
  * The function stack.  Eventually we'll have some sort of global table so each
@@ -58,7 +67,7 @@ H5CS_t		H5CS_stack_g[1];
 

 #ifdef H5_HAVE_THREADSAFE
 /*-------------------------------------------------------------------------
- * Function:	H5CS_get_stack
+ * Function:	H5CS__get_stack
  *
  * Purpose:	Support function for H5CS_get_my_stack() to initialize and
  *              acquire per-thread function stack.
@@ -70,19 +79,17 @@ H5CS_t		H5CS_stack_g[1];
  * Programmer:	Quincey Koziol
  *              February 6, 2003
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static H5CS_t *
-H5CS_get_stack(void)
+H5CS__get_stack(void)
 {
     H5CS_t *fstack;
 
-    FUNC_ENTER_NOAPI_NOERR_NOFS
+    FUNC_ENTER_STATIC_NOERR_NOFS
 
     fstack = H5TS_get_thread_local_value(H5TS_funcstk_key_g);
-    if (!fstack) {
+    if(!fstack) {
         /* No associated value with current thread - create one */
 #ifdef H5_HAVE_WIN_THREADS
         fstack = (H5CS_t *)LocalAlloc(LPTR, sizeof(H5CS_t)); /* Win32 has to use LocalAlloc to match the LocalFree in DllMain */
@@ -92,17 +99,19 @@ H5CS_get_stack(void)
         HDassert(fstack);
 
         /* Set the thread-specific info */
-        fstack->nused=0;
+        fstack->nused = 0;
+        fstack->nalloc = 0;
+        fstack->rec = NULL;
 
         /* (It's not necessary to release this in this API, it is
          *      released by the "key destructor" set up in the H5TS
          *      routines.  See calls to pthread_key_create() in H5TS.c -QAK)
          */
         H5TS_set_thread_local_value(H5TS_funcstk_key_g, (void *)fstack);
-    }
+    } /* end if */
 
-    FUNC_LEAVE_NOAPI_NOFS(fstack);
-} /* end H5CS_get_stack() */
+    FUNC_LEAVE_NOAPI_NOFS(fstack)
+} /* end H5CS__get_stack() */
 #endif  /* H5_HAVE_THREADSAFE */
 
 

@@ -133,59 +142,28 @@ H5CS_print_stack(const H5CS_t *fstack, FILE *stream)
     HDassert(fstack);
 
     /* Default to outputting information to stderr */
-    if (!stream)
+    if(!stream)
         stream = stderr;
 
-    HDfprintf (stream, "HDF5-DIAG: Function stack from %s ", H5_lib_vers_info_g);
+    HDfprintf(stream, "HDF5-DIAG: Function stack from %s ", H5_lib_vers_info_g);
     /* try show the process or thread id in multiple processes cases*/
 #ifdef H5_HAVE_THREADSAFE
-    HDfprintf (stream, "thread %lu.", HDpthread_self_ulong());
+    HDfprintf(stream, "thread %lu.", HDpthread_self_ulong());
 #else  /* H5_HAVE_THREADSAFE */
-    HDfprintf (stream, "thread 0.");
+    HDfprintf(stream, "thread 0.");
 #endif  /* H5_HAVE_THREADSAFE */
-    if (fstack && fstack->nused>0)
-        HDfprintf (stream, "  Back trace follows.");
-    HDfputc ('\n', stream);
+    if(fstack && fstack->nused>0)
+        HDfprintf(stream, "  Back trace follows.");
+    HDfputc('\n', stream);
 
-    for (i=fstack->nused-1; i>=0; --i)
-        HDfprintf(stream, "%*s#%03d: Routine: %s\n", indent, "", i, fstack->slot[i]);
+    for(i = fstack->nused - 1; i >= 0; --i)
+        HDfprintf(stream, "%*s#%03d: Routine: %s\n", indent, "", i, fstack->rec[i]);
 
-    FUNC_LEAVE_NOAPI_NOFS(SUCCEED);
+    FUNC_LEAVE_NOAPI_NOFS(SUCCEED)
 } /* end H5CS_print_stack() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5CS_print
- *
- * Purpose:	Prints the default function stack in some default way.
- *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	Quincey Koziol
- *              Thursday, February 6, 2003
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5CS_print(FILE *stream)
-{
-    H5CS_t	*fstack = H5CS_get_my_stack (); /* Get the correct function stack */
-
-    /* Don't push this function on the function stack... :-) */
-    FUNC_ENTER_NOAPI_NOERR_NOFS
-
-    /* Sanity check */
-    HDassert(fstack);
-
-    H5CS_print_stack(fstack, stream);
-
-    FUNC_LEAVE_NOAPI_NOFS(SUCCEED);
-} /* end H5CS_print() */
-
-

-/*-------------------------------------------------------------------------
  * Function:	H5CS_push
  *
  * Purpose:	Pushes a new record onto function stack for the current
@@ -196,30 +174,37 @@ H5CS_print(FILE *stream)
  * Programmer:	Quincey Koziol
  *		Thursday, February 6, 2003
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 herr_t
 H5CS_push(const char *func_name)
 {
-    H5CS_t	*fstack = H5CS_get_my_stack ();
+    H5CS_t *fstack = H5CS_get_my_stack();       /* Current function stack for library */
 
     /* Don't push this function on the function stack... :-) */
     FUNC_ENTER_NOAPI_NOERR_NOFS
 
     /* Sanity check */
     HDassert(fstack);
+    HDassert(fstack->nused <= fstack->nalloc);
     HDassert(func_name);
 
-    /*
-     * Push the function if there's room.  Otherwise just increment count
-     */
-    if (fstack->nused<H5CS_NSLOTS)
-	fstack->slot[fstack->nused] = func_name;
+    /* Check if we need to expand the stack of records */
+    if(fstack->nused == fstack->nalloc) {
+        size_t na = MAX((fstack->nalloc * 2), H5CS_MIN_NSLOTS);
+        const char **x = (const char **)HDrealloc(fstack->rec, na * sizeof(const char *));
+
+        /* (Avoid returning an error from this routine, currently -QAK) */
+        HDassert(x);
+        fstack->rec = x;
+        fstack->nalloc = na;
+    } /* end if */
+
+    /* Push the function name */
+    fstack->rec[fstack->nused] = func_name;
     fstack->nused++;
 
-    FUNC_LEAVE_NOAPI_NOFS(SUCCEED);
+    FUNC_LEAVE_NOAPI_NOFS(SUCCEED)
 } /* end H5CS_push() */
 
 

@@ -240,14 +225,14 @@ H5CS_push(const char *func_name)
 herr_t
 H5CS_pop(void)
 {
-    H5CS_t	*fstack = H5CS_get_my_stack ();
+    H5CS_t	*fstack = H5CS_get_my_stack();
 
     /* Don't push this function on the function stack... :-) */
     FUNC_ENTER_NOAPI_NOERR_NOFS
 
     /* Sanity check */
     HDassert(fstack);
-    HDassert(fstack->nused>0);
+    HDassert(fstack->nused > 0);
 
     /* Pop the function. */
     fstack->nused--;
@@ -266,43 +251,52 @@ H5CS_pop(void)
  * Programmer:	Quincey Koziol
  *		Tuesday, August 9, 2005
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5CS_copy_stack(H5CS_t *new_stack)
+H5CS_t *
+H5CS_copy_stack(void)
 {
-    H5CS_t	*old_stack = H5CS_get_my_stack ();
+    H5CS_t	*old_stack = H5CS_get_my_stack();       /* Existing function stack for library */
+    H5CS_t	*new_stack;             /* New function stack, for copy */
     unsigned    u;                      /* Local index variable */
+    H5CS_t	*ret_value = NULL;      /* Return value */
 
     /* Don't push this function on the function stack... :-) */
-    FUNC_ENTER_NOAPI_NOERR_NOFS
+    FUNC_ENTER_NOAPI_NOFS
 
     /* Sanity check */
     HDassert(old_stack);
 
+    /* Allocate a new stack */
+    /* (Don't use library allocate code, since this code stack supports it) */
+    if(NULL == (new_stack = HDcalloc(1, sizeof(H5CS_t))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, NULL, "can't allocate function stack")
+    if(NULL == (new_stack->rec = HDcalloc(old_stack->nused, sizeof(const char *))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, NULL, "can't allocate function stack records")
+
     /* Copy old stack to new one, duplicating the strings */
     for(u = 0; u < old_stack->nused; u++)
-        new_stack->slot[u] = H5MM_strdup(old_stack->slot[u]);
-    new_stack->nused = old_stack->nused;
+        new_stack->rec[u] = HDstrdup(old_stack->rec[u]);
+    new_stack->nused = new_stack->nalloc = old_stack->nused;
 
-    FUNC_LEAVE_NOAPI_NOFS(SUCCEED);
+    /* Set the return value */
+    ret_value = new_stack;
+
+done:
+    FUNC_LEAVE_NOAPI_NOFS(ret_value)
 } /* end H5CS_copy_stack() */
 
 

 /*-------------------------------------------------------------------------
  * Function:	H5CS_close_stack
  *
- * Purpose:	Closes a copy of a stack
+ * Purpose:	Closes and frees a copy of a stack
  *
  * Return:	Non-negative on success/Negative on failure
  *
  * Programmer:	Quincey Koziol
  *		Tuesday, August 9, 2005
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -316,11 +310,20 @@ H5CS_close_stack(H5CS_t *stack)
     /* Sanity check */
     HDassert(stack);
 
-    /* Free strings on stack */
-    for(u = 0; u < stack->nused; u++)
-        stack->slot[u] = H5MM_xfree((void *)stack->slot[u]);
-
-    FUNC_LEAVE_NOAPI_NOFS(SUCCEED);
+    /* Free stack */
+    for(u = 0; u < stack->nused; u++) {
+        if(stack->rec[u])
+            HDfree((void *)stack->rec[u]);
+        stack->rec[u] = NULL;
+    } /* end for */
+    if(stack->rec) {
+        HDfree(stack->rec);
+        stack->rec = NULL;
+    } /* end if */
+    if(stack)
+        HDfree(stack);
+
+    FUNC_LEAVE_NOAPI_NOFS(SUCCEED)
 } /* end H5CS_close_stack() */
 
 #endif /* H5_HAVE_CODESTACK */
diff --git a/src/H5CSprivate.h b/src/H5CSprivate.h
index 13f3b66..ab7f993 100644
--- a/src/H5CSprivate.h
+++ b/src/H5CSprivate.h
@@ -26,19 +26,13 @@
 /* Private headers needed by this file */
 #include "H5private.h"
 
-#define H5CS_NSLOTS	48	/*number of slots in an function stack	     */
-
-/* A function stack */
-typedef struct H5CS_t {
-    unsigned	nused;			        /*num slots currently used in stack  */
-    const char *slot[H5CS_NSLOTS];	/*array of function records	     */
-} H5CS_t;
-
-H5_DLL herr_t H5CS_push (const char *func_name);
-H5_DLL herr_t H5CS_pop (void);
-H5_DLL herr_t H5CS_print (FILE *stream);
-H5_DLL herr_t H5CS_print_stack (const H5CS_t *stack, FILE *stream);
-H5_DLL herr_t H5CS_copy_stack (H5CS_t *stack);
-H5_DLL herr_t H5CS_close_stack (H5CS_t *stack);
+/* Forward declarations for structure fields */
+struct H5CS_t;
+H5_DLL herr_t H5CS_push(const char *func_name);
+H5_DLL herr_t H5CS_pop(void);
+H5_DLL herr_t H5CS_print_stack(const struct H5CS_t *stack, FILE *stream);
+H5_DLL struct H5CS_t *H5CS_copy_stack(void);
+H5_DLL herr_t H5CS_close_stack(struct H5CS_t *stack);
 
 #endif /* _H5CSprivate_H */
+
diff --git a/src/H5Cmodule.h b/src/H5Cmodule.h
new file mode 100644
index 0000000..2c39eab
--- /dev/null
+++ b/src/H5Cmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5C package.  Including this header means that the source file
+ *		is part of the H5C package.
+ */
+#ifndef _H5Cmodule_H
+#define _H5Cmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5C_MODULE
+#define H5_MY_PKG       H5C
+#define H5_MY_PKG_ERR   H5E_CACHE
+#define H5_MY_PKG_INIT  NO
+
+#endif /* _H5Cmodule_H */
+
diff --git a/src/H5Cmpio.c b/src/H5Cmpio.c
new file mode 100644
index 0000000..6b63ad5
--- /dev/null
+++ b/src/H5Cmpio.c
@@ -0,0 +1,1220 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5Cmpio.c
+ *              June 20 2015
+ *              Quincey Koziol
+ *
+ * Purpose:     Functions in this file implement support for parallel I/O for
+ *		generic cache code.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#include "H5Cmodule.h"          /* This source code file is part of the H5C module */
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"        /* Metadata cache                       */
+#include "H5Cpkg.h"		/* Cache				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"		/* Files				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+
+
+#ifdef H5_HAVE_PARALLEL
+
+/****************/
+/* Local Macros */
+/****************/
+#define H5C_APPLY_CANDIDATE_LIST__DEBUG 0
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_apply_candidate_list
+ *
+ * Purpose:     Apply the supplied candidate list.
+ *
+ *		We used to do this by simply having each process write 
+ *		every mpi_size-th entry in the candidate list, starting 
+ *		at index mpi_rank, and mark all the others clean.  
+ *
+ *		However, this can cause unnecessary contention in a file 
+ *		system by increasing the number of processes writing to 
+ *		adjacent locations in the HDF5 file.
+ *
+ *		To attempt to minimize this, we now arange matters such 
+ *		that each process writes n adjacent entries in the 
+ *		candidate list, and marks all others clean.  We must do
+ *		this in such a fashion as to guarantee that each entry 
+ *		on the candidate list is written by exactly one process, 
+ *		and marked clean by all others.  
+ *
+ *		To do this, first construct a table mapping mpi_rank
+ *		to the index of the first entry in the candidate list to
+ *		be written by the process of that mpi_rank, and then use
+ *		the table to control which entries are written and which
+ *		are marked as clean as a function of the mpi_rank.
+ *
+ *		Note that the table must be identical on all processes, as
+ *		all see the same candidate list, mpi_size, and mpi_rank --
+ *		the inputs used to construct the table.  
+ *
+ *		We construct the table as follows.  Let:
+ *
+ *			n = num_candidates / mpi_size;
+ *
+ *			m = num_candidates % mpi_size;
+ *
+ *		Now allocate an array of integers of length mpi_size + 1, 
+ *		and call this array candidate_assignment_table. 
+ *
+ *		Conceptually, if the number of candidates is a multiple
+ *		of the mpi_size, we simply pass through the candidate list
+ *		and assign n entries to each process to flush, with the 
+ *		index of the first entry to flush in the location in 
+ *		the candidate_assignment_table indicated by the mpi_rank
+ *		of the process.  
+ *
+ *		In the more common case in which the candidate list isn't 
+ *		isn't a multiple of the mpi_size, we pretend it is, and 
+ *		give num_candidates % mpi_size processes one extra entry
+ *		each to make things work out.
+ *
+ *		Once the table is constructed, we determine the first and
+ *		last entry this process is to flush as follows:
+ *
+ *	 	first_entry_to_flush = candidate_assignment_table[mpi_rank]
+ *
+ *		last_entry_to_flush = 
+ *			candidate_assignment_table[mpi_rank + 1] - 1;
+ *		
+ *		With these values determined, we simply scan through the 
+ *		candidate list, marking all entries in the range 
+ *		[first_entry_to_flush, last_entry_to_flush] for flush,
+ *		and all others to be cleaned.
+ *
+ *		Finally, we scan the LRU from tail to head, flushing 
+ *		or marking clean the candidate entries as indicated.
+ *		If necessary, we scan the pinned list as well.
+ *
+ *		Note that this function will fail if any protected or 
+ *		clean entries appear on the candidate list.
+ *
+ *		This function is used in managing sync points, and 
+ *		shouldn't be used elsewhere.
+ *
+ * Return:      Success:        SUCCEED
+ *
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              3/17/10
+ *
+ * Changes:     Ported code to detect next entry status changes as the 
+ *              the result of a flush from the serial code in the scan of 
+ *              the LRU.  Also added code to detect and adapt to the 
+ *              removal from the cache of the next entry in the scan of 
+ *		the LRU.
+ *
+ *		Note that at present, all of these changes should not 
+ *		be required as the operations on entries as they are 
+ *		flushed that can cause these condiditions are not premitted
+ *		in the parallel case.  However, Quincey indicates that 
+ *		this may change, and thus has requested the modification.
+ *
+ *		Note the assert(FALSE) in the if statement whose body 
+ *		restarts the scan of the LRU.  As the body of the if 
+ *		statement should be unreachable, it should never be 
+ *		triggered until the constraints on the parallel case 
+ *		are relaxed.  Please remove the assertion at that time.
+ *
+ *		Also added warning on the Pinned Entry List scan, as it
+ *		is potentially subject to the same issue.  As there is 
+ *		no cognate of this scan in the serial code, I don't have
+ *		a fix to port to it.
+ *
+ *						JRM -- 4/10/19
+ *		
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_apply_candidate_list(H5F_t * f,
+                         hid_t dxpl_id,
+                         H5C_t * cache_ptr,
+                         int num_candidates,
+                         haddr_t * candidates_list_ptr,
+                         int mpi_rank,
+                         int mpi_size)
+{
+    hbool_t		restart_scan;
+    hbool_t		prev_is_dirty;
+    int                 i;
+    int			m;
+    int			n;
+    int			first_entry_to_flush;
+    int			last_entry_to_flush;
+    int			entries_to_clear = 0;
+    int			entries_to_flush = 0;
+    int			entries_to_flush_or_clear_last = 0;
+    int			entries_to_flush_collectively = 0;
+    int			entries_cleared = 0;
+    int			entries_flushed = 0;
+    int			entries_delayed = 0;
+    int			entries_flushed_or_cleared_last = 0;
+    int			entries_flushed_collectively = 0;
+    int			entries_examined = 0;
+    int			initial_list_len;
+    int               * candidate_assignment_table = NULL;
+    haddr_t		addr;
+    H5C_cache_entry_t *	clear_ptr = NULL;
+    H5C_cache_entry_t *	next_ptr = NULL;
+    H5C_cache_entry_t *	entry_ptr = NULL;
+    H5C_cache_entry_t *	flush_ptr = NULL;
+    H5C_cache_entry_t * delayed_ptr = NULL;
+#if H5C_DO_SANITY_CHECKS
+    haddr_t		last_addr;
+#endif /* H5C_DO_SANITY_CHECKS */
+#if H5C_APPLY_CANDIDATE_LIST__DEBUG
+    char		tbl_buf[1024];
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+    herr_t              ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+    HDassert( num_candidates > 0 );
+    HDassert( num_candidates <= cache_ptr->slist_len );
+    HDassert( candidates_list_ptr != NULL );
+    HDassert( 0 <= mpi_rank );
+    HDassert( mpi_rank < mpi_size );
+
+#if H5C_APPLY_CANDIDATE_LIST__DEBUG
+    HDfprintf(stdout, "%s:%d: setting up candidate assignment table.\n", 
+              FUNC, mpi_rank);
+    for ( i = 0; i < 1024; i++ ) tbl_buf[i] = '\0';
+    sprintf(&(tbl_buf[0]), "candidate list = ");
+    for ( i = 0; i < num_candidates; i++ )
+    {
+        sprintf(&(tbl_buf[HDstrlen(tbl_buf)]), " 0x%llx", 
+                (long long)(*(candidates_list_ptr + i)));
+    }
+    sprintf(&(tbl_buf[HDstrlen(tbl_buf)]), "\n");
+    HDfprintf(stdout, "%s", tbl_buf);
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+    n = num_candidates / mpi_size;
+    m = num_candidates % mpi_size;
+    HDassert(n >= 0);
+
+    if(NULL == (candidate_assignment_table = (int *)H5MM_malloc(sizeof(int) * (size_t)(mpi_size + 1))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for candidate assignment table")
+
+    candidate_assignment_table[0] = 0;
+    candidate_assignment_table[mpi_size] = num_candidates;
+
+    if(m == 0) { /* mpi_size is an even divisor of num_candidates */
+        HDassert(n > 0);
+        for(i = 1; i < mpi_size; i++)
+            candidate_assignment_table[i] = candidate_assignment_table[i - 1] + n;
+    } /* end if */
+    else { 
+        for(i = 1; i <= m; i++)
+            candidate_assignment_table[i] = candidate_assignment_table[i - 1] + n + 1;
+
+        if(num_candidates < mpi_size) {
+            for(i = m + 1; i < mpi_size; i++)
+                candidate_assignment_table[i] = num_candidates;
+        } /* end if */
+        else {
+            for(i = m + 1; i < mpi_size; i++)
+                candidate_assignment_table[i] = candidate_assignment_table[i - 1] + n;
+        } /* end else */
+    } /* end else */
+    HDassert((candidate_assignment_table[mpi_size - 1] + n) == num_candidates);
+
+#if H5C_DO_SANITY_CHECKS
+    /* verify that the candidate assignment table has the expected form */
+    for ( i = 1; i < mpi_size - 1; i++ ) 
+    {
+        int a, b;
+
+        a = candidate_assignment_table[i] - candidate_assignment_table[i - 1];
+        b = candidate_assignment_table[i + 1] - candidate_assignment_table[i];
+
+        HDassert( n + 1 >= a );
+        HDassert( a >= b );
+        HDassert( b >= n );
+    }
+#endif /* H5C_DO_SANITY_CHECKS */
+
+    first_entry_to_flush = candidate_assignment_table[mpi_rank];
+    last_entry_to_flush = candidate_assignment_table[mpi_rank + 1] - 1;
+
+#if H5C_APPLY_CANDIDATE_LIST__DEBUG
+    for ( i = 0; i < 1024; i++ )
+        tbl_buf[i] = '\0';
+    sprintf(&(tbl_buf[0]), "candidate assignment table = ");
+    for(i = 0; i <= mpi_size; i++)
+        sprintf(&(tbl_buf[HDstrlen(tbl_buf)]), " %d", candidate_assignment_table[i]);
+    sprintf(&(tbl_buf[HDstrlen(tbl_buf)]), "\n");
+    HDfprintf(stdout, "%s", tbl_buf);
+
+    HDfprintf(stdout, "%s:%d: flush entries [%d, %d].\n", 
+              FUNC, mpi_rank, first_entry_to_flush, last_entry_to_flush);
+
+    HDfprintf(stdout, "%s:%d: marking entries.\n", FUNC, mpi_rank);
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+    for(i = 0; i < num_candidates; i++) {
+        addr = candidates_list_ptr[i];
+        HDassert( H5F_addr_defined(addr) );
+
+#if H5C_DO_SANITY_CHECKS
+        if ( i > 0 ) {
+            if ( last_addr == addr ) {
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Duplicate entry in cleaned list.\n")
+            } else if ( last_addr > addr ) {
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "candidate list not sorted.\n")
+            }
+        }
+
+        last_addr = addr;
+#endif /* H5C_DO_SANITY_CHECKS */
+
+        H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
+        if(entry_ptr == NULL) {
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Listed candidate entry not in cache?!?!?.")
+        } else if(!entry_ptr->is_dirty) {
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Listed entry not dirty?!?!?.")
+        } else if ( entry_ptr->is_protected ) {
+            /* For now at least, we can't deal with protected entries.
+             * If we encounter one, scream and die.  If it becomes an
+             * issue, we should be able to work around this. 
+             */
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Listed entry is protected?!?!?.")
+        } else {
+            /* determine whether the entry is to be cleared or flushed,
+             * and mark it accordingly.  We will scan the protected and 
+             * pinned list shortly, and clear or flush according to these
+             * markings.  
+             */
+            if((i >= first_entry_to_flush) && (i <= last_entry_to_flush)) {
+                entries_to_flush++;
+                entry_ptr->flush_immediately = TRUE;
+            } /* end if */
+            else {
+                entries_to_clear++;
+                entry_ptr->clear_on_unprotect = TRUE;
+            } /* end else */
+        } /* end else */
+    } /* end for */
+
+#if H5C_APPLY_CANDIDATE_LIST__DEBUG
+    HDfprintf(stdout, "%s:%d: num candidates/to clear/to flush = %d/%d/%d.\n", 
+              FUNC, mpi_rank, (int)num_candidates, (int)entries_to_clear,
+              (int)entries_to_flush);
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+
+    /* We have now marked all the entries on the candidate list for 
+     * either flush or clear -- now scan the LRU and the pinned list
+     * for these entries and do the deed.
+     *
+     * Note that we are doing things in this round about manner so as
+     * to preserve the order of the LRU list to the best of our ability.
+     * If we don't do this, my experiments indicate that we will have a
+     * noticably poorer hit ratio as a result.
+     */
+
+#if H5C_APPLY_CANDIDATE_LIST__DEBUG
+    HDfprintf(stdout, "%s:%d: scanning LRU list. len = %d.\n", FUNC, mpi_rank,
+              (int)(cache_ptr->LRU_list_len));
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+    /* ===================================================================== *
+     * Now scan the LRU and PEL lists, flushing or clearing entries as
+     * needed.
+     *
+     * The flush_me_last and flush_me_collectively flags may dictate how or
+     * when some entries can be flushed, and should be addressed here.
+     * However, in their initial implementation, these flags only apply to the
+     * superblock, so there's only a relatively small change to this function
+     * to account for this one case where they come into play. If these flags
+     * are ever expanded upon, this function and the following flushing steps
+     * should be reworked to account for additional cases.
+     * ===================================================================== */
+
+    HDassert(entries_to_flush >= 0);
+
+    restart_scan = FALSE;
+    entries_examined = 0;
+    initial_list_len = cache_ptr->LRU_list_len;
+    entry_ptr = cache_ptr->LRU_tail_ptr;
+
+    /* Examine each entry in the LRU list */
+    while ( ( entry_ptr != NULL ) 
+            && 
+            ( entries_examined <= (entries_to_flush + 1) * initial_list_len ) 
+            &&
+            ( (entries_cleared + entries_flushed) < num_candidates ) ) {
+
+        if ( entry_ptr->prev != NULL )
+            prev_is_dirty = entry_ptr->prev->is_dirty;
+
+        /* If this process needs to clear this entry. */
+        if(entry_ptr->clear_on_unprotect) {
+
+            HDassert(entry_ptr->is_dirty);
+
+            next_ptr = entry_ptr->next; 
+            entry_ptr->clear_on_unprotect = FALSE;
+            clear_ptr = entry_ptr;
+            entry_ptr = entry_ptr->prev;
+            entries_cleared++;
+
+#if ( H5C_APPLY_CANDIDATE_LIST__DEBUG > 1 )
+    HDfprintf(stdout, "%s:%d: clearing 0x%llx.\n", FUNC, mpi_rank,
+              (long long)clear_ptr->addr);
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+	    /* No need to check for the next entry in the scan being 
+             * removed from the cache, as this call to H5C__flush_single_entry()
+             * will not call either the pre_serialize or serialize callbacks.
+             */
+
+            if(H5C__flush_single_entry(f, dxpl_id, clear_ptr, H5C__FLUSH_CLEAR_ONLY_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.")
+        } /* end if */
+
+        /* Else, if this process needs to flush this entry. */
+        else if (entry_ptr->flush_immediately) {
+
+	    HDassert(entry_ptr->is_dirty);
+
+            next_ptr = entry_ptr->next; 
+            entry_ptr->flush_immediately = FALSE;
+            flush_ptr = entry_ptr;
+            entry_ptr = entry_ptr->prev;
+            entries_flushed++;
+
+#if ( H5C_APPLY_CANDIDATE_LIST__DEBUG > 1 )
+    HDfprintf(stdout, "%s:%d: flushing 0x%llx.\n", FUNC, mpi_rank,
+              (long long)flush_ptr->addr);
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+            /* reset entries_removed_counter and
+             * last_entry_removed_ptr prior to the call to
+             * H5C__flush_single_entry() so that we can spot
+             * unexpected removals of entries from the cache,
+             * and set the restart_scan flag if proceeding
+             * would be likely to cause us to scan an entry
+             * that is no longer in the cache.
+             *
+             * Note that as of this writing (April 2015) this 
+             * case cannot occur in the parallel case.  However 
+             * Quincey is making noises about changing this, hence 
+             * the insertion of this test.
+             *
+             * Note also that there is no test code to verify 
+             * that this code actually works (although similar code
+             * in the serial version exists and is tested).  
+             * 
+             * Implementing a test will likely require implementing
+             * flush op like facilities in the parallel tests.  At
+             * a guess this will not be terribly painful, but it 
+             * will take a bit of time.
+             */
+            cache_ptr->entries_removed_counter = 0;
+            cache_ptr->last_entry_removed_ptr  = NULL;
+
+            if(H5C__flush_single_entry(f, dxpl_id, flush_ptr, H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't flush entry.")
+
+            if ( ( cache_ptr->entries_removed_counter > 1 ) ||
+                 ( cache_ptr->last_entry_removed_ptr == entry_ptr ) )
+
+                restart_scan = TRUE;
+
+        } /* end else-if */
+
+        /* Otherwise, no action to be taken on this entry. Grab the next. */
+        else {
+            entry_ptr = entry_ptr->prev;
+
+            if ( entry_ptr != NULL )
+                next_ptr = entry_ptr->next; 
+
+        } /* end else */
+
+        if ( ( entry_ptr != NULL ) 
+             &&
+             ( ( restart_scan )
+               ||
+               ( entry_ptr->is_dirty != prev_is_dirty )
+               ||
+               ( entry_ptr->next != next_ptr )
+               ||
+               ( entry_ptr->is_protected )
+               ||
+               ( entry_ptr->is_pinned ) 
+             ) 
+           ) {
+
+            /* something has happened to the LRU -- start over
+             * from the tail.
+             *
+             * Recall that this code should be un-reachable at present,
+             * as all the operations by entries on flush that could cause
+             * it to be reachable are disallowed in the parallel case at
+             * present.  Hence the following assertion which should be 
+             * removed if the above changes.
+             */
+
+	    HDassert( ! restart_scan );
+            HDassert( entry_ptr->is_dirty == prev_is_dirty );
+            HDassert( entry_ptr->next == next_ptr );
+            HDassert( ! entry_ptr->is_protected );
+            HDassert( ! entry_ptr->is_pinned );
+
+            HDassert(FALSE); /* see comment above */
+
+            restart_scan = FALSE;
+            entry_ptr = cache_ptr->LRU_tail_ptr;
+/* 
+	    H5C__UPDATE_STATS_FOR_LRU_SCAN_RESTART(cache_ptr)
+*/
+        }
+
+        entries_examined++;
+    } /* end while */
+
+#if H5C_APPLY_CANDIDATE_LIST__DEBUG
+    HDfprintf(stdout, "%s:%d: entries examined/cleared/flushed = %d/%d/%d.\n",
+              FUNC, mpi_rank, entries_examined,
+              entries_cleared, entries_flushed);
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+    /* It is also possible that some of the cleared entries are on the
+     * pinned list.  Must scan that also.
+     *
+     * WARNING:
+     *
+     *	As we now allow unpinning, and removal of other entries as a side 
+     *  effect of flushing an entry, it is possible that the next entry
+     *  in a PEL scan could either be no longer pinned, or no longer in
+     *  the cache by the time we get to it.
+     *
+     *  At present, this is not possible in this case, as we disallow such
+     *  operations in the parallel version of the library.  However, Quincey
+     *  has been making noises about relaxing this.  If and when he does,
+     *  we have a potential problem here.
+     *
+     *  The same issue exists in the serial cache, and there are tests 
+     *  to detect this problem when it occurs, and adjust to it.  As seen
+     *  above in the LRU scan, I have ported such tests to the parallel 
+     *  code where a close cognate exists in the serial code.  
+     *
+     *  I haven't done so here, as there are no PEL scans where the problem
+     *  can occur in the serial code.  Needless to say, this will have to 
+     *  be repaired if the constraints on pre_serialize and serialize 
+     *  callbacks are relaxed in the parallel version of the metadata cache.
+     *
+     *						JRM -- 4/1/15
+     */
+
+#if H5C_APPLY_CANDIDATE_LIST__DEBUG
+    HDfprintf(stdout, "%s:%d: scanning pinned entry list. len = %d\n",
+             FUNC, mpi_rank, (int)(cache_ptr->pel_len));
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+    entry_ptr = cache_ptr->pel_head_ptr;
+    while((entry_ptr != NULL) &&
+          ((entries_cleared + entries_flushed + entries_delayed)
+            < num_candidates)) {
+
+        /* If entry is marked for flush or for clear */
+        if((entry_ptr->clear_on_unprotect||entry_ptr->flush_immediately)) {
+
+            /* If this entry needs to be flushed last */
+            if (entry_ptr->flush_me_last) {
+
+                /* At this time, only the superblock supports being
+                   flushed last. Conveniently, it also happens to be the only
+                   entry that supports being flushed collectively, as well. Also
+                   conveniently, it's always pinned, so we only need to check
+                   for it while scanning the PEL here. Finally, it's never
+                   included in a candidate list that excludes other dirty
+                   entries in a cache, so we can handle this relatively simple
+                   case here.
+                   
+                   For now, this function asserts this and saves the entry
+                   to flush it after scanning the rest of the PEL list.
+
+                   If there are ever more entries that either need to be
+                   flushed last and/or flushed collectively, this whole routine
+                   will need to be reworked to handle all additional cases. As
+                   it is the simple case of a single pinned entry needing
+                   flushed last and collectively is just a minor addition to
+                   this routine, but signficantly buffing up the usage of
+                   flush_me_last or flush_me_collectively will require a more
+                   intense rework of this function and potentially the function
+                   of candidate lists as a whole. */
+
+                HDassert(entry_ptr->flush_me_collectively);
+                entries_to_flush_or_clear_last++;
+                entries_to_flush_collectively++;
+                HDassert(entries_to_flush_or_clear_last == 1);
+                HDassert(entries_to_flush_collectively == 1);
+
+                /* Delay the entry. It will be flushed later. */
+                delayed_ptr = entry_ptr;
+                entries_delayed++;
+                HDassert(entries_delayed == 1);
+
+            } /* end if */
+
+            /* Else, this process needs to clear this entry. */
+            else if (entry_ptr->clear_on_unprotect) {
+                HDassert(!entry_ptr->flush_immediately);
+                entry_ptr->clear_on_unprotect = FALSE;
+                clear_ptr = entry_ptr;
+                entry_ptr = entry_ptr->next;
+                entries_cleared++;
+
+#if ( H5C_APPLY_CANDIDATE_LIST__DEBUG > 1 )
+            HDfprintf(stdout, "%s:%d: clearing 0x%llx.\n", FUNC, mpi_rank,
+                      (long long)clear_ptr->addr);
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+                if(H5C__flush_single_entry(f, dxpl_id, clear_ptr, H5C__FLUSH_CLEAR_ONLY_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.")
+            } /* end else-if */
+
+            /* Else, if this process needs to independently flush this entry. */
+            else if (entry_ptr->flush_immediately) {
+                entry_ptr->flush_immediately = FALSE;
+                flush_ptr = entry_ptr;
+                entry_ptr = entry_ptr->next;
+                entries_flushed++;
+
+#if ( H5C_APPLY_CANDIDATE_LIST__DEBUG > 1 )
+                HDfprintf(stdout, "%s:%d: flushing 0x%llx.\n", FUNC, mpi_rank,
+                      (long long)flush_ptr->addr);
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+                if(H5C__flush_single_entry(f, dxpl_id, flush_ptr, H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.")
+            } /* end else-if */
+        } /* end if */
+
+        /* Otherwise, this entry is not marked for flush or clear. Grab the next. */
+        else {
+            entry_ptr = entry_ptr->next;
+        } /* end else */
+
+    } /* end while */
+
+#if H5C_APPLY_CANDIDATE_LIST__DEBUG
+    HDfprintf(stdout,
+              "%s:%d: pel entries examined/cleared/flushed = %d/%d/%d.\n",
+              FUNC, mpi_rank, entries_examined,
+              entries_cleared, entries_flushed);
+    HDfprintf(stdout, "%s:%d: done.\n", FUNC, mpi_rank);
+
+    HDfsync(stdout);
+#endif /* H5C_APPLY_CANDIDATE_LIST__DEBUG */
+
+    /* ====================================================================== *
+     * Now, handle all delayed entries.                                       *
+     *                                                                        *
+     * This can *only* be the superblock at this time, so it's relatively     *
+     * easy to deal with. We're collectively flushing the entry saved from    *
+     * above. This will need to be handled differently if there are ever more *
+     * than one entry needing this special treatment.)                        *
+     * ====================================================================== */
+
+    if (delayed_ptr) {
+
+        if (delayed_ptr->clear_on_unprotect) {
+            entry_ptr->clear_on_unprotect = FALSE;
+            entries_cleared++;
+        } else if (delayed_ptr->flush_immediately) {
+            entry_ptr->flush_immediately = FALSE;
+            entries_flushed++;
+        } /* end if */
+
+        if(H5C__flush_single_entry(f, dxpl_id, delayed_ptr, H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL) < 0)
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't flush entry collectively.")
+
+        entries_flushed_collectively++;
+        entries_flushed_or_cleared_last++;
+    } /* end if */
+
+    /* ====================================================================== *
+     * Finished flushing everything.                                          *
+     * ====================================================================== */
+
+    HDassert((entries_flushed == entries_to_flush));
+    HDassert((entries_cleared == entries_to_clear));
+    HDassert((entries_flushed_or_cleared_last == entries_to_flush_or_clear_last));
+    HDassert((entries_flushed_collectively == entries_to_flush_collectively));
+    
+    if((entries_flushed != entries_to_flush) || 
+       (entries_cleared != entries_to_clear) ||
+       (entries_flushed_or_cleared_last != entries_to_flush_or_clear_last) ||
+       (entries_flushed_collectively != entries_to_flush_collectively))
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "entry count mismatch.")
+
+done:
+    if(candidate_assignment_table != NULL)
+        candidate_assignment_table = (int *)H5MM_xfree((void *)candidate_assignment_table);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_apply_candidate_list() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_construct_candidate_list__clean_cache
+ *
+ * Purpose:     Construct the list of entries that should be flushed to 
+ *		clean all entries in the cache.
+ *
+ *		This function is used in managing sync points, and 
+ *		shouldn't be used elsewhere.
+ *
+ * Return:      Success:        SUCCEED
+ *
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              3/17/10
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_construct_candidate_list__clean_cache(H5C_t * cache_ptr)
+{
+    size_t              space_needed;
+    herr_t              ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    /* As a sanity check, set space needed to the size of the skip list.
+     * This should be the sum total of the sizes of all the dirty entries
+     * in the metadata cache.
+     */
+    space_needed = cache_ptr->slist_size;
+
+    /* Recall that while we shouldn't have any protected entries at this
+     * point, it is possible that some dirty entries may reside on the
+     * pinned list at this point.
+     */
+    HDassert( cache_ptr->slist_size <= 
+              (cache_ptr->dLRU_list_size + cache_ptr->pel_size) );
+    HDassert( cache_ptr->slist_len  <= 
+              (cache_ptr->dLRU_list_len + cache_ptr->pel_len) );
+
+    if(space_needed > 0) { /* we have work to do */
+        H5C_cache_entry_t *entry_ptr;
+        int     nominated_entries_count = 0;
+        size_t  nominated_entries_size = 0;
+        haddr_t	nominated_addr;
+
+        HDassert( cache_ptr->slist_len > 0 );
+
+        /* Scan the dirty LRU list from tail forward and nominate sufficient
+         * entries to free up the necessary space. 
+         */
+        entry_ptr = cache_ptr->dLRU_tail_ptr;
+        while((nominated_entries_size < space_needed) &&
+                (nominated_entries_count < cache_ptr->slist_len) &&
+                (entry_ptr != NULL)) {
+            HDassert( ! (entry_ptr->is_protected) );
+            HDassert( ! (entry_ptr->is_read_only) );
+            HDassert( entry_ptr->ro_ref_count == 0 );
+            HDassert( entry_ptr->is_dirty );
+            HDassert( entry_ptr->in_slist );
+
+            nominated_addr = entry_ptr->addr;
+            if(H5AC_add_candidate((H5AC_t *)cache_ptr, nominated_addr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_add_candidate() failed(1).")
+
+            nominated_entries_size += entry_ptr->size;
+            nominated_entries_count++;
+            entry_ptr = entry_ptr->aux_prev;
+        } /* end while */
+        HDassert( entry_ptr == NULL );
+
+        /* it is possible that there are some dirty entries on the 
+         * protected entry list as well -- scan it too if necessary
+         */
+        entry_ptr = cache_ptr->pel_head_ptr;
+        while((nominated_entries_size < space_needed) &&
+                (nominated_entries_count < cache_ptr->slist_len) &&
+                (entry_ptr != NULL)) {
+            if(entry_ptr->is_dirty) {
+                HDassert( ! (entry_ptr->is_protected) );
+                HDassert( ! (entry_ptr->is_read_only) );
+                HDassert( entry_ptr->ro_ref_count == 0 );
+                HDassert( entry_ptr->is_dirty );
+                HDassert( entry_ptr->in_slist );
+
+                nominated_addr = entry_ptr->addr;
+                if(H5AC_add_candidate((H5AC_t *)cache_ptr, nominated_addr) < 0)
+                    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_add_candidate() failed(2).")
+
+                nominated_entries_size += entry_ptr->size;
+                nominated_entries_count++;
+            } /* end if */
+
+            entry_ptr = entry_ptr->next;
+        } /* end while */
+
+        HDassert( nominated_entries_count == cache_ptr->slist_len );
+        HDassert( nominated_entries_size == space_needed );
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_construct_candidate_list__clean_cache() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5C_construct_candidate_list__min_clean
+ *
+ * Purpose:     Construct the list of entries that should be flushed to 
+ *		get the cache back within its min clean constraints.
+ *
+ *		This function is used in managing sync points, and 
+ *		shouldn't be used elsewhere.
+ *
+ * Return:      Success:        SUCCEED
+ *
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              3/17/10
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_construct_candidate_list__min_clean(H5C_t * cache_ptr)
+{
+    size_t              space_needed = 0;
+    herr_t              ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( cache_ptr != NULL );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    /* compute the number of bytes (if any) that must be flushed to get the 
+     * cache back within its min clean constraints.
+     */
+    if(cache_ptr->max_cache_size > cache_ptr->index_size) {
+        if(((cache_ptr->max_cache_size - cache_ptr->index_size) +
+               cache_ptr->cLRU_list_size) >= cache_ptr->min_clean_size)
+            space_needed = 0;
+        else
+            space_needed = cache_ptr->min_clean_size -
+                ((cache_ptr->max_cache_size - cache_ptr->index_size) +
+                 cache_ptr->cLRU_list_size);
+    } /* end if */
+    else {
+        if(cache_ptr->min_clean_size <= cache_ptr->cLRU_list_size)
+           space_needed = 0;
+        else
+            space_needed = cache_ptr->min_clean_size -
+                           cache_ptr->cLRU_list_size;
+    } /* end else */
+
+    if(space_needed > 0) { /* we have work to do */
+        H5C_cache_entry_t *entry_ptr;
+        int    nominated_entries_count = 0;
+        size_t nominated_entries_size = 0;
+
+        HDassert( cache_ptr->slist_len > 0 );
+
+        /* Scan the dirty LRU list from tail forward and nominate sufficient
+         * entries to free up the necessary space. 
+         */
+        entry_ptr = cache_ptr->dLRU_tail_ptr;
+        while((nominated_entries_size < space_needed) &&
+                (nominated_entries_count < cache_ptr->slist_len) &&
+                (entry_ptr != NULL) &&
+                (!entry_ptr->flush_me_last)) {
+            haddr_t		nominated_addr;
+
+            HDassert( ! (entry_ptr->is_protected) );
+            HDassert( ! (entry_ptr->is_read_only) );
+            HDassert( entry_ptr->ro_ref_count == 0 );
+            HDassert( entry_ptr->is_dirty );
+            HDassert( entry_ptr->in_slist );
+
+            nominated_addr = entry_ptr->addr;
+            if(H5AC_add_candidate((H5AC_t *)cache_ptr, nominated_addr) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_add_candidate() failed.")
+
+            nominated_entries_size += entry_ptr->size;
+            nominated_entries_count++;
+            entry_ptr = entry_ptr->aux_prev;
+        } /* end while */
+        HDassert( nominated_entries_count <= cache_ptr->slist_len );
+        HDassert( nominated_entries_size >= space_needed );
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5C_construct_candidate_list__min_clean() */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C_mark_entries_as_clean
+ *
+ * Purpose:     When the H5C code is used to implement the metadata caches
+ *		in PHDF5, only the cache with MPI_rank 0 is allowed to
+ *		actually write entries to disk -- all other caches must
+ *		retain dirty entries until they are advised that the
+ *		entries are clean.
+ *
+ *		This function exists to allow the H5C code to receive these
+ *		notifications.
+ *
+ *		The function receives a list of entry base addresses
+ *		which must refer to dirty entries in the cache.  If any
+ *		of the entries are either clean or don't exist, the
+ *		function flags an error.
+ *
+ *		The function scans the list of entries and flushes all
+ *		those that are currently unprotected with the
+ *		H5C__FLUSH_CLEAR_ONLY_FLAG.  Those that are currently
+ *		protected are flagged for clearing when they are
+ *		unprotected.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              7/5/05
+ *
+ * Changes:     Tidied up code, removeing some old commented out 
+ *		code that had been left in pending success of the 
+ *		new version.
+ *
+ *		Note that unlike H5C_apply_candidate_list(), 
+ *		H5C_mark_entries_as_clean() makes all its calls to 
+ *		H6C_flush_single_entry() with the 
+ *		H5C__FLUSH_CLEAR_ONLY_FLAG set.  As a result, 
+ *		the pre_serialize() and serialize calls are not made.
+ *
+ *		This then implies that (assuming such actions were 
+ *		permitted in the parallel case) no loads, dirties, 
+ *		resizes, or removals of other entries can occur as 
+ *		a side effect of the flush.  Hence, there is no need
+ *		for the checks for entry removal / status change 
+ *		that I ported to H5C_apply_candidate_list().
+ *
+ *		However, if (in addition to allowing such operations
+ *		in the parallel case), we allow such operations outside
+ *		of the pre_serialize / serialize routines, this may 
+ *		cease to be the case -- requiring a review of this 
+ *		function.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5C_mark_entries_as_clean(H5F_t *  f,
+                          hid_t     dxpl_id,
+                          int32_t   ce_array_len,
+                          haddr_t * ce_array_ptr)
+{
+    H5C_t *             cache_ptr;
+    int			entries_cleared;
+    int			entries_examined;
+    int                 i;
+    int			initial_list_len;
+    haddr_t		addr;
+#if H5C_DO_SANITY_CHECKS
+    int			pinned_entries_marked = 0;
+    int			protected_entries_marked = 0;
+    int			other_entries_marked = 0;
+    haddr_t		last_addr;
+#endif /* H5C_DO_SANITY_CHECKS */
+    H5C_cache_entry_t *	clear_ptr = NULL;
+    H5C_cache_entry_t *	entry_ptr = NULL;
+    herr_t		ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert( f );
+    HDassert( f->shared );
+    cache_ptr = f->shared->cache;
+    HDassert( cache_ptr );
+    HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC );
+
+    HDassert( ce_array_len > 0 );
+    HDassert( ce_array_ptr != NULL );
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+    if ( ( H5C_validate_protected_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_pinned_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_lru_list(cache_ptr) < 0 ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "an extreme sanity check failed on entry.\n");
+    }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+    for ( i = 0; i < ce_array_len; i++ )
+    {
+        addr = ce_array_ptr[i];
+
+#if H5C_DO_SANITY_CHECKS
+        if ( i == 0 ) {
+
+            last_addr = addr;
+
+        } else {
+
+            if ( last_addr == addr ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "Duplicate entry in cleaned list.\n");
+
+            } else if ( last_addr > addr ) {
+
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                            "cleaned list not sorted.\n");
+            }
+        }
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+        if ( ( H5C_validate_protected_entry_list(cache_ptr) < 0 ) ||
+             ( H5C_validate_pinned_entry_list(cache_ptr) < 0 ) ||
+             ( H5C_validate_lru_list(cache_ptr) < 0 ) ) {
+
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                        "an extreme sanity check failed in for loop.\n");
+        }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+#endif /* H5C_DO_SANITY_CHECKS */
+
+        HDassert( H5F_addr_defined(addr) );
+
+        H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL)
+
+        if ( entry_ptr == NULL ) {
+#if H5C_DO_SANITY_CHECKS
+	    HDfprintf(stdout,
+                  "H5C_mark_entries_as_clean: entry[%d] = %ld not in cache.\n",
+                      (int)i,
+                      (long)addr);
+#endif /* H5C_DO_SANITY_CHECKS */
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                        "Listed entry not in cache?!?!?.")
+
+        } else if ( ! entry_ptr->is_dirty ) {
+
+#if H5C_DO_SANITY_CHECKS
+	    HDfprintf(stdout,
+                      "H5C_mark_entries_as_clean: entry %ld is not dirty!?!\n",
+                      (long)addr);
+#endif /* H5C_DO_SANITY_CHECKS */
+            HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                        "Listed entry not dirty?!?!?.")
+
+        } else {
+
+            /* Mark the entry to be cleared on unprotect.  We will
+             * scan the LRU list shortly, and clear all those entries
+             * not currently protected.
+             */
+            entry_ptr->clear_on_unprotect = TRUE;
+#if H5C_DO_SANITY_CHECKS
+	    if ( entry_ptr->is_protected ) {
+
+		protected_entries_marked++;
+
+	    } else if ( entry_ptr->is_pinned ) {
+
+		pinned_entries_marked++;
+
+	    } else {
+
+		other_entries_marked++;
+	    }
+#endif /* H5C_DO_SANITY_CHECKS */
+        }
+    }
+
+    /* Scan through the LRU list from back to front, and flush the
+     * entries whose clear_on_unprotect flags are set.  Observe that
+     * any protected entries will not be on the LRU, and therefore
+     * will not be flushed at this time.
+     *
+     * Note that unlike H5C_apply_candidate_list(), 
+     * H5C_mark_entries_as_clean() makes all its calls to 
+     * H6C_flush_single_entry() with the H5C__FLUSH_CLEAR_ONLY_FLAG 
+     * set.  As a result, the pre_serialize() and serialize calls are 
+     * not made.
+     *
+     * This then implies that (assuming such actions were 
+     * permitted in the parallel case) no loads, dirties, 
+     * resizes, or removals of other entries can occur as 
+     * a side effect of the flush.  Hence, there is no need
+     * for the checks for entry removal / status change 
+     * that I ported to H5C_apply_candidate_list().
+     *
+     * However, if (in addition to allowing such operations
+     * in the parallel case), we allow such operations outside
+     * of the pre_serialize / serialize routines, this may 
+     * cease to be the case -- requiring a review of this 
+     * point.
+     *					JRM -- 4/7/15
+     */
+
+    entries_cleared = 0;
+    entries_examined = 0;
+    initial_list_len = cache_ptr->LRU_list_len;
+    entry_ptr = cache_ptr->LRU_tail_ptr;
+
+    while ( ( entry_ptr != NULL ) &&
+            ( entries_examined <= initial_list_len ) &&
+            ( entries_cleared < ce_array_len ) )
+    {
+        if ( entry_ptr->clear_on_unprotect ) {
+
+            entry_ptr->clear_on_unprotect = FALSE;
+            clear_ptr = entry_ptr;
+            entry_ptr = entry_ptr->prev;
+            entries_cleared++;
+
+            if(H5C__flush_single_entry(f, dxpl_id, clear_ptr, H5C__FLUSH_CLEAR_ONLY_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL) < 0)
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.")
+        } else {
+
+            entry_ptr = entry_ptr->prev;
+        }
+        entries_examined++;
+    }
+
+#if H5C_DO_SANITY_CHECKS
+    HDassert( entries_cleared == other_entries_marked );
+#endif /* H5C_DO_SANITY_CHECKS */
+
+    /* It is also possible that some of the cleared entries are on the
+     * pinned list.  Must scan that also.
+     */
+
+    entry_ptr = cache_ptr->pel_head_ptr;
+
+    while ( entry_ptr != NULL )
+    {
+        if ( entry_ptr->clear_on_unprotect ) {
+
+            entry_ptr->clear_on_unprotect = FALSE;
+            clear_ptr = entry_ptr;
+            entry_ptr = entry_ptr->next;
+            entries_cleared++;
+
+            if(H5C__flush_single_entry(f, dxpl_id, clear_ptr, H5C__FLUSH_CLEAR_ONLY_FLAG | H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG, NULL) < 0 )
+                HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.")
+        } else {
+
+            entry_ptr = entry_ptr->next;
+        }
+    }
+
+#if H5C_DO_SANITY_CHECKS
+    HDassert( entries_cleared == pinned_entries_marked + other_entries_marked );
+    HDassert( entries_cleared + protected_entries_marked == ce_array_len );
+#endif /* H5C_DO_SANITY_CHECKS */
+
+    HDassert( ( entries_cleared == ce_array_len ) ||
+              ( (ce_array_len - entries_cleared) <= cache_ptr->pl_len ) );
+
+#if H5C_DO_SANITY_CHECKS
+    i = 0;
+    entry_ptr = cache_ptr->pl_head_ptr;
+    while ( entry_ptr != NULL )
+    {
+        if ( entry_ptr->clear_on_unprotect ) {
+
+            i++;
+        }
+        entry_ptr = entry_ptr->next;
+    }
+    HDassert( (entries_cleared + i) == ce_array_len );
+#endif /* H5C_DO_SANITY_CHECKS */
+
+done:
+
+#if H5C_DO_EXTREME_SANITY_CHECKS
+    if ( ( H5C_validate_protected_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_pinned_entry_list(cache_ptr) < 0 ) ||
+         ( H5C_validate_lru_list(cache_ptr) < 0 ) ) {
+
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \
+                    "an extreme sanity check failed on exit.\n");
+    }
+#endif /* H5C_DO_EXTREME_SANITY_CHECKS */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5C_mark_entries_as_clean() */
+#endif /* H5_HAVE_PARALLEL */
+
diff --git a/src/H5Cpkg.h b/src/H5Cpkg.h
index af39dfb..f5cb4de 100644
--- a/src/H5Cpkg.h
+++ b/src/H5Cpkg.h
@@ -28,2361 +28,2219 @@
  *		reason why this file was created.
  */
 
-#ifndef H5C_PACKAGE
+#if !(defined H5C_FRIEND || defined H5C_MODULE)
 #error "Do not include this file outside the H5C package!"
 #endif
 
 #ifndef _H5Cpkg_H
 #define _H5Cpkg_H
 
-
 /* Get package's private header */
 #include "H5Cprivate.h"
 
-
-/* Get needed headers */
+/* Other private headers needed by this file */
 #include "H5SLprivate.h"        /* Skip lists */
 
-/* With the introduction of the fractal heap, it is now possible for
- * entries to be dirtied, resized, and/or moved in the flush callbacks.
- * As a result, on flushes, it may be necessary to make multiple passes
- * through the slist before it is empty.  The H5C__MAX_PASSES_ON_FLUSH
- * #define is used to set an upper limit on the number of passes.
- * The current value was obtained via personal communication with
- * Quincey.  I have applied a fudge factor of 2.
- *
- *						-- JRM
- */
-
-#define H5C__MAX_PASSES_ON_FLUSH	4
+/**************************/
+/* Package Private Macros */
+/**************************/
 
+/* Cache configuration settings */
+#define H5C__HASH_TABLE_LEN     (64 * 1024) /* must be a power of 2 */
+#define H5C__H5C_T_MAGIC	0x005CAC0E
 
+/* Initial allocated size of the "flush_dep_parent" array */
+#define H5C_FLUSH_DEP_PARENT_INIT 8
 
 /****************************************************************************
  *
- * structure H5C_t
- *
- * Catchall structure for all variables specific to an instance of the cache.
- *
- * While the individual fields of the structure are discussed below, the
- * following overview may be helpful.
- *
- * Entries in the cache are stored in an instance of H5TB_TREE, indexed on
- * the entry's disk address.  While the H5TB_TREE is less efficient than
- * hash table, it keeps the entries in address sorted order.  As flushes
- * in parallel mode are more efficient if they are issued in increasing
- * address order, this is a significant benefit.  Also the H5TB_TREE code
- * was readily available, which reduced development time.
- *
- * While the cache was designed with multiple replacement policies in mind,
- * at present only a modified form of LRU is supported.
- *
- *                                              JRM - 4/26/04
- *
- * Profiling has indicated that searches in the instance of H5TB_TREE are
- * too expensive.  To deal with this issue, I have augmented the cache
- * with a hash table in which all entries will be stored.  Given the
- * advantages of flushing entries in increasing address order, the TBBT
- * is retained, but only dirty entries are stored in it.  At least for
- * now, we will leave entries in the TBBT after they are flushed.
- *
- * Note that index_size and index_len now refer to the total size of
- * and number of entries in the hash table.
- *
- *						JRM - 7/19/04
- *
- * The TBBT has since been replaced with a skip list.  This change
- * greatly predates this note.
- *
- *						JRM - 9/26/05
- *
- * magic:	Unsigned 32 bit integer always set to H5C__H5C_T_MAGIC. 
- * 		This field is used to validate pointers to instances of
- * 		H5C_t.
- *
- * flush_in_progress: Boolean flag indicating whether a flush is in
- * 		progress.
- *
- * trace_file_ptr:  File pointer pointing to the trace file, which is used
- *              to record cache operations for use in simulations and design
- *              studies.  This field will usually be NULL, indicating that
- *              no trace file should be recorded.
- *
- *              Since much of the code supporting the parallel metadata
- *              cache is in H5AC, we don't write the trace file from
- *              H5C.  Instead, H5AC reads the trace_file_ptr as needed.
- *
- *              When we get to using H5C in other places, we may add
- *              code to write trace file data at the H5C level as well.
- *
- * aux_ptr:	Pointer to void used to allow wrapper code to associate
- *		its data with an instance of H5C_t.  The H5C cache code
- *		sets this field to NULL, and otherwise leaves it alone.
- *
- * max_type_id:	Integer field containing the maximum type id number assigned
- *		to a type of entry in the cache.  All type ids from 0 to
- *		max_type_id inclusive must be defined.  The names of the
- *		types are stored in the type_name_table discussed below, and
- *		indexed by the ids.
- *
- * type_name_table_ptr: Pointer to an array of pointer to char of length
- *              max_type_id + 1.  The strings pointed to by the entries
- *              in the array are the names of the entry types associated
- *              with the indexing type IDs.
- *
- * max_cache_size:  Nominal maximum number of bytes that may be stored in the
- *              cache.  This value should be viewed as a soft limit, as the
- *              cache can exceed this value under the following circumstances:
- *
- *              a) All entries in the cache are protected, and the cache is
- *                 asked to insert a new entry.  In this case the new entry
- *                 will be created.  If this causes the cache to exceed
- *                 max_cache_size, it will do so.  The cache will attempt
- *                 to reduce its size as entries are unprotected.
- *
- *              b) When running in parallel mode, the cache may not be
- *		   permitted to flush a dirty entry in response to a read.
- *		   If there are no clean entries available to evict, the
- *		   cache will exceed its maximum size.  Again the cache
- *                 will attempt to reduce its size to the max_cache_size
- *                 limit on the next cache write.
- *
- *		c) When an entry increases in size, the cache may exceed
- *		   the max_cache_size limit until the next time the cache
- *		   attempts to load or insert an entry.
- *
- * min_clean_size: Nominal minimum number of clean bytes in the cache.
- *              The cache attempts to maintain this number of bytes of
- *              clean data so as to avoid case b) above.  Again, this is
- *              a soft limit.
- *
- *
- * In addition to the call back functions required for each entry, the
- * cache requires the following call back functions for this instance of
- * the cache as a whole:
- *
- * check_write_permitted:  In certain applications, the cache may not
- *		be allowed to write to disk at certain time.  If specified,
- *		the check_write_permitted function is used to determine if
- *		a write is permissible at any given point in time.
- *
- *		If no such function is specified (i.e. this field is NULL),
- *		the cache uses the following write_permitted field to
- *		determine whether writes are permitted.
- *
- * write_permitted: If check_write_permitted is NULL, this boolean flag
- *		indicates whether writes are permitted.
- *
- * log_flush:	If provided, this function is called whenever a dirty
- *		entry is flushed to disk.
- *
- *
- * In cases where memory is plentiful, and performance is an issue, it
- * is useful to disable all cache evictions, and thereby postpone metadata
- * writes.  The following field is used to implement this.
+ * We maintain doubly linked lists of instances of H5C_cache_entry_t for a
+ * variety of reasons -- protected list, LRU list, and the clean and dirty
+ * LRU lists at present.  The following macros support linking and unlinking
+ * of instances of H5C_cache_entry_t by both their regular and auxilary next
+ * and previous pointers.
  *
- * evictions_enabled:  Boolean flag that is initialized to TRUE.  When
- * 		this flag is set to FALSE, the metadata cache will not
- * 		attempt to evict entries to make space for newly protected
- * 		entries, and instead the will grow without limit.
- * 		
- * 		Needless to say, this feature must be used with care.
+ * The size and length fields are also maintained.
  *
+ * Note that the relevant pair of prev and next pointers are presumed to be
+ * NULL on entry in the insertion macros.
  *
- * The cache requires an index to facilitate searching for entries.  The
- * following fields support that index.
+ * Finally, observe that the sanity checking macros evaluate to the empty
+ * string when H5C_DO_SANITY_CHECKS is FALSE.  They also contain calls
+ * to the HGOTO_ERROR macro, which may not be appropriate in all cases.
+ * If so, we will need versions of the insertion and deletion macros which
+ * do not reference the sanity checking macros.
+ *							JRM - 5/5/04
  *
- * index_len:   Number of entries currently in the hash table used to index
- *		the cache.
+ * Changes:
  *
- * index_size:  Number of bytes of cache entries currently stored in the
- *              hash table used to index the cache.
+ *  - Removed the line:
  *
- *              This value should not be mistaken for footprint of the
- *              cache in memory.  The average cache entry is small, and
- *              the cache has a considerable overhead.  Multiplying the
- *              index_size by two should yield a conservative estimate
- *              of the cache's memory footprint.
+ *        ( ( (Size) == (entry_ptr)->size ) && ( (len) != 1 ) ) ||
  *
- * clean_index_size: Number of bytes of clean entries currently stored in
- * 		the hash table.  Note that the index_size field (above)
- *		is also the sum of the sizes of all entries in the cache.
- *		Thus we should have the invarient that clean_index_size +
- *		dirty_index_size == index_size.
+ *    from the H5C__DLL_PRE_REMOVE_SC macro.  With the addition of the
+ *    epoch markers used in the age out based cache size reduction algorithm,
+ *    this invariant need not hold, as the epoch markers are of size 0.
  *
- *		WARNING:
+ *    One could argue that I should have given the epoch markers a positive
+ *    size, but this would break the index_size = LRU_list_size + pl_size
+ *    + pel_size invariant.
  *
- *		1) The clean_index_size field is not maintained by the
- *		   index macros, as the hash table doesn't care whether
- *		   the entry is clean or dirty.  Instead the field is
- *		   maintained in the H5C__UPDATE_RP macros.
+ *    Alternatively, I could pass the current decr_mode in to the macro,
+ *    and just skip the check whenever epoch markers may be in use.
  *
- *		2) The value of the clean_index_size must not be mistaken
- *		   for the current clean size of the cache.  Rather, the
- *		   clean size of the cache is the current value of
- *		   clean_index_size plus the amount of empty space (if any)
- *                 in the cache.
+ *    However, any size errors should be caught when the cache is flushed
+ *    and destroyed.  Until we are tracking such an error, this should be
+ *    good enough.
+ *                                                     JRM - 12/9/04
  *
- * dirty_index_size: Number of bytes of dirty entries currently stored in
- * 		the hash table.  Note that the index_size field (above)
- *		is also the sum of the sizes of all entries in the cache.
- *		Thus we should have the invarient that clean_index_size +
- *		dirty_index_size == index_size.
  *
- *		WARNING:
+ *  - In the H5C__DLL_PRE_INSERT_SC macro, replaced the lines:
  *
- *		1) The dirty_index_size field is not maintained by the
- *		   index macros, as the hash table doesn't care whether
- *		   the entry is clean or dirty.  Instead the field is
- *		   maintained in the H5C__UPDATE_RP macros.
+ *    ( ( (len) == 1 ) &&
+ *      ( ( (head_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) ||
+ *        ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )
+ *      )
+ *    ) ||
  *
- * index:	Array of pointer to H5C_cache_entry_t of size
- *		H5C__HASH_TABLE_LEN.  At present, this value is a power
- *		of two, not the usual prime number.
+ *    with:
  *
- *		I hope that the variable size of cache elements, the large
- *		hash table size, and the way in which HDF5 allocates space
- *		will combine to avoid problems with periodicity.  If so, we
- *		can use a trivial hash function (a bit-and and a 3 bit left
- *		shift) with some small savings.
+ *    ( ( (len) == 1 ) &&
+ *      ( ( (head_ptr) != (tail_ptr) ) ||
+ *        ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )
+ *      )
+ *    ) ||
  *
- *		If not, it will become evident in the statistics. Changing
- *		to the usual prime number length hash table will require
- *		changing the H5C__HASH_FCN macro and the deletion of the
- *		H5C__HASH_MASK #define.  No other changes should be required.
+ *    Epoch markers have size 0, so we can now have a non-empty list with
+ *    zero size.  Hence the "( (Size) <= 0 )" clause cause false failures
+ *    in the sanity check.  Since "Size" is typically a size_t, it can't
+ *    take on negative values, and thus the revised clause "( (Size) < 0 )"
+ *    caused compiler warnings.
+ *                                                     JRM - 12/22/04
  *
+ *  - In the H5C__DLL_SC macro, replaced the lines:
  *
- * When we flush the cache, we need to write entries out in increasing
- * address order.  An instance of a skip list is used to store dirty entries in
- * sorted order.  Whether it is cheaper to sort the dirty entries as needed,
- * or to maintain the list is an open question.  At a guess, it depends
- * on how frequently the cache is flushed.  We will see how it goes.
+ *    ( ( (len) == 1 ) &&
+ *      ( ( (head_ptr) != (tail_ptr) ) || ( (cache_ptr)->size <= 0 ) ||
+ *        ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )
+ *      )
+ *    ) ||
  *
- * For now at least, I will not remove dirty entries from the list as they
- * are flushed. (this has been changed -- dirty entries are now removed from
- * the skip list as they are flushed.  JRM - 10/25/05)
+ *    with
  *
- * slist_len:   Number of entries currently in the skip list
- *              used to maintain a sorted list of dirty entries in the
- *              cache.
+ *    ( ( (len) == 1 ) &&
+ *      ( ( (head_ptr) != (tail_ptr) ) ||
+ *        ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )
+ *      )
+ *    ) ||
  *
- * slist_size:  Number of bytes of cache entries currently stored in the
- *              skip list used to maintain a sorted list of
- *              dirty entries in the cache.
+ *    Epoch markers have size 0, so we can now have a non-empty list with
+ *    zero size.  Hence the "( (Size) <= 0 )" clause cause false failures
+ *    in the sanity check.  Since "Size" is typically a size_t, it can't
+ *    take on negative values, and thus the revised clause "( (Size) < 0 )"
+ *    caused compiler warnings.
+ *                                                     JRM - 1/10/05
  *
- * slist_ptr:   pointer to the instance of H5SL_t used maintain a sorted
- *              list of dirty entries in the cache.  This sorted list has
- *              two uses:
+ *  - Added the H5C__DLL_UPDATE_FOR_SIZE_CHANGE macro and the associated
+ *    sanity checking macros.  These macro are used to update the size of
+ *    a DLL when one of its entries changes size.
  *
- *              a) It allows us to flush dirty entries in increasing address
- *                 order, which results in significant savings.
+ *							JRM - 9/8/05
  *
- *              b) It facilitates checking for adjacent dirty entries when
- *                 attempting to evict entries from the cache.  While we
- *                 don't use this at present, I hope that this will allow
- *                 some optimizations when I get to it.
- *
- * With the addition of the fractal heap, the cache must now deal with
- * the case in which entries may be dirtied, moved, or have their sizes
- * changed during a flush.  To allow sanity checks in this situation, the
- * following two fields have been added.  They are only compiled in when
- * H5C_DO_SANITY_CHECKS is TRUE.
- *
- * slist_len_increase: Number of entries that have been added to the
- * 		slist since the last time this field was set to zero.
- *
- * slist_size_increase: Total size of all entries that have been added
- * 		to the slist since the last time this field was set to
- * 		zero.
- *
- *
- * When a cache entry is protected, it must be removed from the LRU
- * list(s) as it cannot be either flushed or evicted until it is unprotected.
- * The following fields are used to implement the protected list (pl).
- *
- * pl_len:      Number of entries currently residing on the protected list.
+ ****************************************************************************/
+
+#if H5C_DO_SANITY_CHECKS
+
+#define H5C__DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
+if ( ( (head_ptr) == NULL ) ||                                               \
+     ( (tail_ptr) == NULL ) ||                                               \
+     ( (entry_ptr) == NULL ) ||                                              \
+     ( (len) <= 0 ) ||                                                       \
+     ( (Size) < (entry_ptr)->size ) ||                                       \
+     ( ( (entry_ptr)->prev == NULL ) && ( (head_ptr) != (entry_ptr) ) ) ||   \
+     ( ( (entry_ptr)->next == NULL ) && ( (tail_ptr) != (entry_ptr) ) ) ||   \
+     ( ( (len) == 1 ) &&                                                     \
+       ( ! ( ( (head_ptr) == (entry_ptr) ) &&                                \
+             ( (tail_ptr) == (entry_ptr) ) &&                                \
+             ( (entry_ptr)->next == NULL ) &&                                \
+             ( (entry_ptr)->prev == NULL ) &&                                \
+             ( (Size) == (entry_ptr)->size )                                 \
+           )                                                                 \
+       )                                                                     \
+     )                                                                       \
+   ) {                                                                       \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "DLL pre remove SC failed")     \
+}
+
+#define H5C__DLL_SC(head_ptr, tail_ptr, len, Size, fv)                   \
+if ( ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) &&           \
+       ( (head_ptr) != (tail_ptr) )                                      \
+     ) ||                                                                \
+     ( (len) < 0 ) ||                                                    \
+     ( (Size) < 0 ) ||                                                   \
+     ( ( (len) == 1 ) &&                                                 \
+       ( ( (head_ptr) != (tail_ptr) ) ||                                 \
+         ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )        \
+       )                                                                 \
+     ) ||                                                                \
+     ( ( (len) >= 1 ) &&                                                 \
+       ( ( (head_ptr) == NULL ) || ( (head_ptr)->prev != NULL ) ||       \
+         ( (tail_ptr) == NULL ) || ( (tail_ptr)->next != NULL )          \
+       )                                                                 \
+     )                                                                   \
+   ) {                                                                   \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "DLL sanity check failed")  \
+}
+
+#define H5C__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
+if ( ( (entry_ptr) == NULL ) ||                                              \
+     ( (entry_ptr)->next != NULL ) ||                                        \
+     ( (entry_ptr)->prev != NULL ) ||                                        \
+     ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) &&               \
+       ( (head_ptr) != (tail_ptr) )                                          \
+     ) ||                                                                    \
+     ( (len) < 0 ) ||                                                        \
+     ( ( (len) == 1 ) &&                                                     \
+       ( ( (head_ptr) != (tail_ptr) ) ||                                     \
+         ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )            \
+       )                                                                     \
+     ) ||                                                                    \
+     ( ( (len) >= 1 ) &&                                                     \
+       ( ( (head_ptr) == NULL ) || ( (head_ptr)->prev != NULL ) ||           \
+         ( (tail_ptr) == NULL ) || ( (tail_ptr)->next != NULL )              \
+       )                                                                     \
+     )                                                                       \
+   ) {                                                                       \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "DLL pre insert SC failed")     \
+}
+
+#define H5C__DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)    \
+if ( ( (dll_len) <= 0 ) ||                                                    \
+     ( (dll_size) <= 0 ) ||                                                   \
+     ( (old_size) <= 0 ) ||                                                   \
+     ( (old_size) > (dll_size) ) ||                                           \
+     ( (new_size) <= 0 ) ||                                                   \
+     ( ( (dll_len) == 1 ) && ( (old_size) != (dll_size) ) ) ) {               \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "DLL pre size update SC failed") \
+}
+
+#define H5C__DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)    \
+if ( ( (new_size) > (dll_size) ) ||                                            \
+     ( ( (dll_len) == 1 ) && ( (new_size) != (dll_size) ) ) ) {                \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "DLL post size update SC failed") \
+}
+
+#else /* H5C_DO_SANITY_CHECKS */
+
+#define H5C__DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv)
+#define H5C__DLL_SC(head_ptr, tail_ptr, len, Size, fv)
+#define H5C__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv)
+#define H5C__DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)
+#define H5C__DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)
+
+#endif /* H5C_DO_SANITY_CHECKS */
+
+
+#define H5C__DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val) \
+{                                                                           \
+    H5C__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size,        \
+                           fail_val)                                        \
+    if ( (head_ptr) == NULL )                                               \
+    {                                                                       \
+       (head_ptr) = (entry_ptr);                                            \
+       (tail_ptr) = (entry_ptr);                                            \
+    }                                                                       \
+    else                                                                    \
+    {                                                                       \
+       (tail_ptr)->next = (entry_ptr);                                      \
+       (entry_ptr)->prev = (tail_ptr);                                      \
+       (tail_ptr) = (entry_ptr);                                            \
+    }                                                                       \
+    (len)++;                                                                \
+    (Size) += (entry_ptr)->size;                                            \
+} /* H5C__DLL_APPEND() */
+
+#define H5C__DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val) \
+{                                                                            \
+    H5C__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size,         \
+                           fail_val)                                         \
+    if ( (head_ptr) == NULL )                                                \
+    {                                                                        \
+       (head_ptr) = (entry_ptr);                                             \
+       (tail_ptr) = (entry_ptr);                                             \
+    }                                                                        \
+    else                                                                     \
+    {                                                                        \
+       (head_ptr)->prev = (entry_ptr);                                       \
+       (entry_ptr)->next = (head_ptr);                                       \
+       (head_ptr) = (entry_ptr);                                             \
+    }                                                                        \
+    (len)++;                                                                 \
+    (Size) += entry_ptr->size;                                               \
+} /* H5C__DLL_PREPEND() */
+
+#define H5C__DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val) \
+{                                                                           \
+    H5C__DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size,        \
+                           fail_val)                                        \
+    {                                                                       \
+       if ( (head_ptr) == (entry_ptr) )                                     \
+       {                                                                    \
+          (head_ptr) = (entry_ptr)->next;                                   \
+          if ( (head_ptr) != NULL )                                         \
+             (head_ptr)->prev = NULL;                                       \
+       }                                                                    \
+       else                                                                 \
+          (entry_ptr)->prev->next = (entry_ptr)->next;                      \
+       if ( (tail_ptr) == (entry_ptr) )                                     \
+       {                                                                    \
+          (tail_ptr) = (entry_ptr)->prev;                                   \
+          if ( (tail_ptr) != NULL )                                         \
+             (tail_ptr)->next = NULL;                                       \
+       }                                                                    \
+       else                                                                 \
+          (entry_ptr)->next->prev = (entry_ptr)->prev;                      \
+       entry_ptr->next = NULL;                                              \
+       entry_ptr->prev = NULL;                                              \
+       (len)--;                                                             \
+       (Size) -= entry_ptr->size;                                           \
+    }                                                                       \
+} /* H5C__DLL_REMOVE() */
+
+#define H5C__DLL_UPDATE_FOR_SIZE_CHANGE(dll_len, dll_size, old_size, new_size) \
+{                                                                              \
+    H5C__DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)         \
+    (dll_size) -= (old_size);                                                  \
+    (dll_size) += (new_size);                                                  \
+    H5C__DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)        \
+} /* H5C__DLL_UPDATE_FOR_SIZE_CHANGE() */
+
+#if H5C_DO_SANITY_CHECKS
+
+#define H5C__AUX_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) \
+if ( ( (hd_ptr) == NULL ) ||                                                   \
+     ( (tail_ptr) == NULL ) ||                                                 \
+     ( (entry_ptr) == NULL ) ||                                                \
+     ( (len) <= 0 ) ||                                                         \
+     ( (Size) < (entry_ptr)->size ) ||                                         \
+     ( ( (Size) == (entry_ptr)->size ) && ( ! ( (len) == 1 ) ) ) ||            \
+     ( ( (entry_ptr)->aux_prev == NULL ) && ( (hd_ptr) != (entry_ptr) ) ) ||   \
+     ( ( (entry_ptr)->aux_next == NULL ) && ( (tail_ptr) != (entry_ptr) ) ) || \
+     ( ( (len) == 1 ) &&                                                       \
+       ( ! ( ( (hd_ptr) == (entry_ptr) ) && ( (tail_ptr) == (entry_ptr) ) &&   \
+             ( (entry_ptr)->aux_next == NULL ) &&                              \
+             ( (entry_ptr)->aux_prev == NULL ) &&                              \
+             ( (Size) == (entry_ptr)->size )                                   \
+           )                                                                   \
+       )                                                                       \
+     )                                                                         \
+   ) {                                                                         \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "aux DLL pre remove SC failed")   \
+}
+
+#define H5C__AUX_DLL_SC(head_ptr, tail_ptr, len, Size, fv)                  \
+if ( ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) &&              \
+       ( (head_ptr) != (tail_ptr) )                                         \
+     ) ||                                                                   \
+     ( (len) < 0 ) ||                                                       \
+     ( (Size) < 0 ) ||                                                      \
+     ( ( (len) == 1 ) &&                                                    \
+       ( ( (head_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) ||                 \
+         ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )           \
+       )                                                                    \
+     ) ||                                                                   \
+     ( ( (len) >= 1 ) &&                                                    \
+       ( ( (head_ptr) == NULL ) || ( (head_ptr)->aux_prev != NULL ) ||      \
+         ( (tail_ptr) == NULL ) || ( (tail_ptr)->aux_next != NULL )         \
+       )                                                                    \
+     )                                                                      \
+   ) {                                                                      \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "AUX DLL sanity check failed") \
+}
+
+#define H5C__AUX_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) \
+if ( ( (entry_ptr) == NULL ) ||                                                \
+     ( (entry_ptr)->aux_next != NULL ) ||                                      \
+     ( (entry_ptr)->aux_prev != NULL ) ||                                      \
+     ( ( ( (hd_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) &&                   \
+       ( (hd_ptr) != (tail_ptr) )                                              \
+     ) ||                                                                      \
+     ( (len) < 0 ) ||                                                          \
+     ( ( (len) == 1 ) &&                                                       \
+       ( ( (hd_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) ||                      \
+         ( (hd_ptr) == NULL ) || ( (hd_ptr)->size != (Size) )                  \
+       )                                                                       \
+     ) ||                                                                      \
+     ( ( (len) >= 1 ) &&                                                       \
+       ( ( (hd_ptr) == NULL ) || ( (hd_ptr)->aux_prev != NULL ) ||             \
+         ( (tail_ptr) == NULL ) || ( (tail_ptr)->aux_next != NULL )            \
+       )                                                                       \
+     )                                                                         \
+   ) {                                                                         \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "AUX DLL pre insert SC failed")   \
+}
+
+#else /* H5C_DO_SANITY_CHECKS */
+
+#define H5C__AUX_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv)
+#define H5C__AUX_DLL_SC(head_ptr, tail_ptr, len, Size, fv)
+#define H5C__AUX_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv)
+
+#endif /* H5C_DO_SANITY_CHECKS */
+
+
+#define H5C__AUX_DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val)\
+{                                                                              \
+    H5C__AUX_DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size,       \
+                               fail_val)                                       \
+    if ( (head_ptr) == NULL )                                                  \
+    {                                                                          \
+       (head_ptr) = (entry_ptr);                                               \
+       (tail_ptr) = (entry_ptr);                                               \
+    }                                                                          \
+    else                                                                       \
+    {                                                                          \
+       (tail_ptr)->aux_next = (entry_ptr);                                     \
+       (entry_ptr)->aux_prev = (tail_ptr);                                     \
+       (tail_ptr) = (entry_ptr);                                               \
+    }                                                                          \
+    (len)++;                                                                   \
+    (Size) += entry_ptr->size;                                                 \
+} /* H5C__AUX_DLL_APPEND() */
+
+#define H5C__AUX_DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fv)   \
+{                                                                            \
+    H5C__AUX_DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
+    if ( (head_ptr) == NULL )                                                \
+    {                                                                        \
+       (head_ptr) = (entry_ptr);                                             \
+       (tail_ptr) = (entry_ptr);                                             \
+    }                                                                        \
+    else                                                                     \
+    {                                                                        \
+       (head_ptr)->aux_prev = (entry_ptr);                                   \
+       (entry_ptr)->aux_next = (head_ptr);                                   \
+       (head_ptr) = (entry_ptr);                                             \
+    }                                                                        \
+    (len)++;                                                                 \
+    (Size) += entry_ptr->size;                                               \
+} /* H5C__AUX_DLL_PREPEND() */
+
+#define H5C__AUX_DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, Size, fv)    \
+{                                                                            \
+    H5C__AUX_DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
+    {                                                                        \
+       if ( (head_ptr) == (entry_ptr) )                                      \
+       {                                                                     \
+          (head_ptr) = (entry_ptr)->aux_next;                                \
+          if ( (head_ptr) != NULL )                                          \
+             (head_ptr)->aux_prev = NULL;                                    \
+       }                                                                     \
+       else                                                                  \
+          (entry_ptr)->aux_prev->aux_next = (entry_ptr)->aux_next;           \
+       if ( (tail_ptr) == (entry_ptr) )                                      \
+       {                                                                     \
+          (tail_ptr) = (entry_ptr)->aux_prev;                                \
+          if ( (tail_ptr) != NULL )                                          \
+             (tail_ptr)->aux_next = NULL;                                    \
+       }                                                                     \
+       else                                                                  \
+          (entry_ptr)->aux_next->aux_prev = (entry_ptr)->aux_prev;           \
+       entry_ptr->aux_next = NULL;                                           \
+       entry_ptr->aux_prev = NULL;                                           \
+       (len)--;                                                              \
+       (Size) -= entry_ptr->size;                                            \
+    }                                                                        \
+} /* H5C__AUX_DLL_REMOVE() */
+
+

+/***********************************************************************
  *
- * pl_size:     Number of bytes of cache entries currently residing on the
- *              protected list.
+ * Stats collection macros
  *
- * pl_head_ptr: Pointer to the head of the doubly linked list of protected
- *              entries.  Note that cache entries on this list are linked
- *              by their next and prev fields.
+ * The following macros must handle stats collection when this collection
+ * is enabled, and evaluate to the empty string when it is not.
  *
- *              This field is NULL if the list is empty.
+ * The sole exception to this rule is
+ * H5C__UPDATE_CACHE_HIT_RATE_STATS(), which is always active as
+ * the cache hit rate stats are always collected and available.
  *
- * pl_tail_ptr: Pointer to the tail of the doubly linked list of protected
- *              entries.  Note that cache entries on this list are linked
- *              by their next and prev fields.
+ * Changes:
  *
- *              This field is NULL if the list is empty.
+ * 	JRM -- 3/21/06
+ * 	Added / updated macros for pinned entry related stats.
  *
+ * 	JRM -- 8/9/06
+ * 	More pinned entry stats related updates.
  *
- * For very frequently used entries, the protect/unprotect overhead can
- * become burdensome.  To avoid this overhead, I have modified the cache
- * to allow entries to be "pinned".  A pinned entry is similar to a
- * protected entry, in the sense that it cannot be evicted, and that
- * the entry can be modified at any time.
+ * 	JRM -- 3/31/07
+ * 	Updated H5C__UPDATE_STATS_FOR_PROTECT() to keep stats on
+ * 	read and write protects.
  *
- * Pinning an entry has the following implications:
+ *      MAM -- 1/15/09
+ *      Created H5C__UPDATE_MAX_INDEX_SIZE_STATS to contain
+ *      common code within macros that update the maximum
+ *      index, clean_index, and dirty_index statistics fields.
  *
- *	1) A pinned entry cannot be evicted.  Thus unprotected
- *         pinned entries reside in the pinned entry list, instead
- *         of the LRU list(s) (or other lists maintained by the current
- *         replacement policy code).
- *
- *      2) A pinned entry can be accessed or modified at any time.
- *         Therefore, the cache must check with the entry owner
- *         before flushing it.  If permission is denied, the
- *         cache just skips the entry in the flush.
- *
- *      3) A pinned entry can be marked as dirty (and possibly
- *         change size) while it is unprotected.
- *
- *      4) The flush-destroy code must allow pinned entries to
- *         be unpinned (and possibly unprotected) during the
- *         flush.
- *
- * Since pinned entries cannot be evicted, they must be kept on a pinned
- * entry list, instead of being entrusted to the replacement policy code.
- *
- * Maintaining the pinned entry list requires the following fields:
- *
- * pel_len:	Number of entries currently residing on the pinned
- * 		entry list.
- *
- * pel_size:	Number of bytes of cache entries currently residing on
- * 		the pinned entry list.
- *
- * pel_head_ptr: Pointer to the head of the doubly linked list of pinned
- * 		but not protected entries.  Note that cache entries on
- * 		this list are linked by their next and prev fields.
- *
- *              This field is NULL if the list is empty.
- *
- * pel_tail_ptr: Pointer to the tail of the doubly linked list of pinned
- * 		but not protected entries.  Note that cache entries on
- * 		this list are linked by their next and prev fields.
- *
- *              This field is NULL if the list is empty.
- *
- *
- * The cache must have a replacement policy, and the fields supporting this
- * policy must be accessible from this structure.
- *
- * While there has been interest in several replacement policies for
- * this cache, the initial development schedule is tight.  Thus I have
- * elected to support only a modified LRU policy for the first cut.
- *
- * To further simplify matters, I have simply included the fields needed
- * by the modified LRU in this structure.  When and if we add support for
- * other policies, it will probably be easiest to just add the necessary
- * fields to this structure as well -- we only create one instance of this
- * structure per file, so the overhead is not excessive.
- *
- *
- * Fields supporting the modified LRU policy:
- *
- * See most any OS text for a discussion of the LRU replacement policy.
- *
- * When operating in parallel mode, we must ensure that a read does not
- * cause a write.  If it does, the process will hang, as the write will
- * be collective and the other processes will not know to participate.
- *
- * To deal with this issue, I have modified the usual LRU policy by adding
- * clean and dirty LRU lists to the usual LRU list.
- *
- * The clean LRU list is simply the regular LRU list with all dirty cache
- * entries removed.
- *
- * Similarly, the dirty LRU list is the regular LRU list with all the clean
- * cache entries removed.
- *
- * When reading in parallel mode, we evict from the clean LRU list only.
- * This implies that we must try to ensure that the clean LRU list is
- * reasonably well stocked at all times.
- *
- * We attempt to do this by trying to flush enough entries on each write
- * to keep the cLRU_list_size >= min_clean_size.
- *
- * Even if we start with a completely clean cache, a sequence of protects
- * without unprotects can empty the clean LRU list.  In this case, the
- * cache must grow temporarily.  At the next write, we will attempt to
- * evict enough entries to reduce index_size to less than max_cache_size.
- * While this will usually be possible, all bets are off if enough entries
- * are protected.
- *
- * Discussions of the individual fields used by the modified LRU replacement
- * policy follow:
- *
- * LRU_list_len:  Number of cache entries currently on the LRU list.
- *
- *              Observe that LRU_list_len + pl_len must always equal
- *              index_len.
+ ***********************************************************************/
+
+#define H5C__UPDATE_CACHE_HIT_RATE_STATS(cache_ptr, hit) \
+        (cache_ptr->cache_accesses)++;                   \
+        if ( hit ) {                                     \
+            (cache_ptr->cache_hits)++;                   \
+        }                                                \
+
+#if H5C_COLLECT_CACHE_STATS
+
+#define H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr)                        \
+        if ( (cache_ptr)->index_size > (cache_ptr)->max_index_size )       \
+            (cache_ptr)->max_index_size = (cache_ptr)->index_size;         \
+        if ( (cache_ptr)->clean_index_size >                               \
+                (cache_ptr)->max_clean_index_size )                        \
+            (cache_ptr)->max_clean_index_size =                            \
+                (cache_ptr)->clean_index_size;                             \
+        if ( (cache_ptr)->dirty_index_size >                               \
+                (cache_ptr)->max_dirty_index_size )                        \
+            (cache_ptr)->max_dirty_index_size =                            \
+                (cache_ptr)->dirty_index_size;
+
+#define H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr) \
+	(((cache_ptr)->dirty_pins)[(entry_ptr)->type->id])++;
+
+#define H5C__UPDATE_STATS_FOR_UNPROTECT(cache_ptr)                   \
+        if ( (cache_ptr)->slist_len > (cache_ptr)->max_slist_len )   \
+	    (cache_ptr)->max_slist_len = (cache_ptr)->slist_len;     \
+        if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size ) \
+	    (cache_ptr)->max_slist_size = (cache_ptr)->slist_size;   \
+	if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len )       \
+	    (cache_ptr)->max_pel_len = (cache_ptr)->pel_len;         \
+	if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size )     \
+	    (cache_ptr)->max_pel_size = (cache_ptr)->pel_size;
+
+#define H5C__UPDATE_STATS_FOR_MOVE(cache_ptr, entry_ptr)               \
+	if ( cache_ptr->flush_in_progress ) {                            \
+            ((cache_ptr)->cache_flush_moves[(entry_ptr)->type->id])++; \
+	}                                                                \
+        if ( entry_ptr->flush_in_progress ) {                            \
+            ((cache_ptr)->entry_flush_moves[(entry_ptr)->type->id])++; \
+	}                                                                \
+	(((cache_ptr)->moves)[(entry_ptr)->type->id])++;
+
+#define H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, entry_ptr, new_size)\
+	if ( cache_ptr->flush_in_progress ) {                                  \
+            ((cache_ptr)->cache_flush_size_changes[(entry_ptr)->type->id])++;  \
+	}                                                                      \
+        if ( entry_ptr->flush_in_progress ) {                                  \
+            ((cache_ptr)->entry_flush_size_changes[(entry_ptr)->type->id])++;  \
+	}                                                                      \
+	if ( (entry_ptr)->size < (new_size) ) {                                \
+	    ((cache_ptr)->size_increases[(entry_ptr)->type->id])++;            \
+            H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr)                        \
+            if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size )       \
+                (cache_ptr)->max_slist_size = (cache_ptr)->slist_size;         \
+            if ( (cache_ptr)->pl_size > (cache_ptr)->max_pl_size )             \
+                (cache_ptr)->max_pl_size = (cache_ptr)->pl_size;               \
+	} else if ( (entry_ptr)->size > (new_size) ) {                         \
+	    ((cache_ptr)->size_decreases[(entry_ptr)->type->id])++;            \
+	}
+
+#define H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr) \
+	(cache_ptr)->total_ht_insertions++;
+
+#define H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr) \
+	(cache_ptr)->total_ht_deletions++;
+
+#define H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, success, depth)  \
+	if ( success ) {                                            \
+	    (cache_ptr)->successful_ht_searches++;                  \
+	    (cache_ptr)->total_successful_ht_search_depth += depth; \
+	} else {                                                    \
+	    (cache_ptr)->failed_ht_searches++;                      \
+	    (cache_ptr)->total_failed_ht_search_depth += depth;     \
+	}
+
+#define H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr) \
+	((cache_ptr)->unpins)[(entry_ptr)->type->id]++;
+
+#define H5C__UPDATE_STATS_FOR_SLIST_SCAN_RESTART(cache_ptr) \
+	((cache_ptr)->slist_scan_restarts)++;
+
+#define H5C__UPDATE_STATS_FOR_LRU_SCAN_RESTART(cache_ptr) \
+	((cache_ptr)->LRU_scan_restarts)++;
+
+#define H5C__UPDATE_STATS_FOR_HASH_BUCKET_SCAN_RESTART(cache_ptr) \
+	((cache_ptr)->hash_bucket_scan_restarts)++;
+
+#if H5C_COLLECT_CACHE_ENTRY_STATS
+
+#define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr) \
+{                                           \
+    (entry_ptr)->accesses = 0;              \
+    (entry_ptr)->clears   = 0;              \
+    (entry_ptr)->flushes  = 0;              \
+    (entry_ptr)->pins     = 0;              \
+}
+
+#define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr)        \
+{                                                                \
+    (((cache_ptr)->clears)[(entry_ptr)->type->id])++;            \
+    if((entry_ptr)->is_pinned)                                   \
+        (((cache_ptr)->pinned_clears)[(entry_ptr)->type->id])++; \
+    ((entry_ptr)->clears)++;                                     \
+}
+
+#define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr)         \
+{                                                                 \
+    (((cache_ptr)->flushes)[(entry_ptr)->type->id])++;            \
+    if((entry_ptr)->is_pinned)                                    \
+        (((cache_ptr)->pinned_flushes)[(entry_ptr)->type->id])++; \
+    ((entry_ptr)->flushes)++;                                     \
+}
+
+#define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr, take_ownership) \
+{                                                                            \
+    if ( take_ownership )                                                    \
+        (((cache_ptr)->take_ownerships)[(entry_ptr)->type->id])++;           \
+    else                                                                     \
+        (((cache_ptr)->evictions)[(entry_ptr)->type->id])++;                 \
+    if ( (entry_ptr)->accesses >                                         \
+            ((cache_ptr)->max_accesses)[(entry_ptr)->type->id] )         \
+        ((cache_ptr)->max_accesses)[(entry_ptr)->type->id] =             \
+            (entry_ptr)->accesses;                                       \
+    if ( (entry_ptr)->accesses <                                         \
+            ((cache_ptr)->min_accesses)[(entry_ptr)->type->id] )         \
+        ((cache_ptr)->min_accesses)[(entry_ptr)->type->id] =             \
+            (entry_ptr)->accesses;                                       \
+    if ( (entry_ptr)->clears >                                           \
+             ((cache_ptr)->max_clears)[(entry_ptr)->type->id] )          \
+            ((cache_ptr)->max_clears)[(entry_ptr)->type->id]             \
+                 = (entry_ptr)->clears;                                  \
+    if ( (entry_ptr)->flushes >                                          \
+            ((cache_ptr)->max_flushes)[(entry_ptr)->type->id] )          \
+        ((cache_ptr)->max_flushes)[(entry_ptr)->type->id]                \
+            = (entry_ptr)->flushes;                                      \
+    if ( (entry_ptr)->size >                                             \
+            ((cache_ptr)->max_size)[(entry_ptr)->type->id] )             \
+        ((cache_ptr)->max_size)[(entry_ptr)->type->id]                   \
+            = (entry_ptr)->size;                                         \
+    if ( (entry_ptr)->pins >                                             \
+            ((cache_ptr)->max_pins)[(entry_ptr)->type->id] )             \
+        ((cache_ptr)->max_pins)[(entry_ptr)->type->id]                   \
+            = (entry_ptr)->pins;                                         \
+}
+
+#define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr)        \
+{                                                                    \
+    (((cache_ptr)->insertions)[(entry_ptr)->type->id])++;            \
+    if ( (entry_ptr)->is_pinned ) {                                  \
+        (((cache_ptr)->pinned_insertions)[(entry_ptr)->type->id])++; \
+        ((cache_ptr)->pins)[(entry_ptr)->type->id]++;                \
+        (entry_ptr)->pins++;                                         \
+        if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len )       \
+            (cache_ptr)->max_pel_len = (cache_ptr)->pel_len;         \
+        if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size )     \
+            (cache_ptr)->max_pel_size = (cache_ptr)->pel_size;       \
+    }                                                                \
+    if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len )       \
+        (cache_ptr)->max_index_len = (cache_ptr)->index_len;         \
+    H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr)                      \
+    if ( (cache_ptr)->slist_len > (cache_ptr)->max_slist_len )       \
+        (cache_ptr)->max_slist_len = (cache_ptr)->slist_len;         \
+    if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size )     \
+        (cache_ptr)->max_slist_size = (cache_ptr)->slist_size;       \
+    if ( (entry_ptr)->size >                                         \
+            ((cache_ptr)->max_size)[(entry_ptr)->type->id] )         \
+        ((cache_ptr)->max_size)[(entry_ptr)->type->id]               \
+             = (entry_ptr)->size;                                    \
+}
+
+#define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit)            \
+{                                                                           \
+    if ( hit )                                                              \
+        ((cache_ptr)->hits)[(entry_ptr)->type->id]++;                       \
+    else                                                                    \
+        ((cache_ptr)->misses)[(entry_ptr)->type->id]++;                     \
+    if ( ! ((entry_ptr)->is_read_only) ) {                                  \
+        ((cache_ptr)->write_protects)[(entry_ptr)->type->id]++;             \
+    } else {                                                                \
+        ((cache_ptr)->read_protects)[(entry_ptr)->type->id]++;              \
+        if ( ((entry_ptr)->ro_ref_count) >                                  \
+                ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] )   \
+            ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] =       \
+                    ((entry_ptr)->ro_ref_count);                            \
+    }                                                                       \
+    if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len )              \
+        (cache_ptr)->max_index_len = (cache_ptr)->index_len;                \
+    H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr)                             \
+    if ( (cache_ptr)->pl_len > (cache_ptr)->max_pl_len )                    \
+        (cache_ptr)->max_pl_len = (cache_ptr)->pl_len;                      \
+    if ( (cache_ptr)->pl_size > (cache_ptr)->max_pl_size )                  \
+        (cache_ptr)->max_pl_size = (cache_ptr)->pl_size;                    \
+    if ( (entry_ptr)->size >                                                \
+            ((cache_ptr)->max_size)[(entry_ptr)->type->id] )                \
+        ((cache_ptr)->max_size)[(entry_ptr)->type->id] = (entry_ptr)->size; \
+    ((entry_ptr)->accesses)++;                                              \
+}
+
+#define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr)      \
+{                                                            \
+    ((cache_ptr)->pins)[(entry_ptr)->type->id]++;            \
+    (entry_ptr)->pins++;                                     \
+    if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len )   \
+        (cache_ptr)->max_pel_len = (cache_ptr)->pel_len;     \
+    if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \
+        (cache_ptr)->max_pel_size = (cache_ptr)->pel_size;   \
+}
+
+#else /* H5C_COLLECT_CACHE_ENTRY_STATS */
+
+#define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr)
+
+#define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr)         \
+{                                                                 \
+    (((cache_ptr)->clears)[(entry_ptr)->type->id])++;             \
+    if((entry_ptr)->is_pinned)                                    \
+        (((cache_ptr)->pinned_clears)[(entry_ptr)->type->id])++;  \
+}
+
+#define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr)         \
+{                                                                 \
+    (((cache_ptr)->flushes)[(entry_ptr)->type->id])++;            \
+    if ( (entry_ptr)->is_pinned )                                 \
+        (((cache_ptr)->pinned_flushes)[(entry_ptr)->type->id])++; \
+}
+
+#define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr, take_ownership) \
+{                                                                            \
+    if ( take_ownership )                                                    \
+        (((cache_ptr)->take_ownerships)[(entry_ptr)->type->id])++;           \
+    else                                                                     \
+        (((cache_ptr)->evictions)[(entry_ptr)->type->id])++;                 \
+}
+
+#define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr)        \
+{                                                                    \
+    (((cache_ptr)->insertions)[(entry_ptr)->type->id])++;            \
+    if ( (entry_ptr)->is_pinned ) {                                  \
+        (((cache_ptr)->pinned_insertions)[(entry_ptr)->type->id])++; \
+        ((cache_ptr)->pins)[(entry_ptr)->type->id]++;                \
+        if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len )       \
+            (cache_ptr)->max_pel_len = (cache_ptr)->pel_len;         \
+        if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size )     \
+            (cache_ptr)->max_pel_size = (cache_ptr)->pel_size;       \
+    }                                                                \
+    if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len )       \
+        (cache_ptr)->max_index_len = (cache_ptr)->index_len;         \
+    H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr)                      \
+    if ( (cache_ptr)->slist_len > (cache_ptr)->max_slist_len )       \
+        (cache_ptr)->max_slist_len = (cache_ptr)->slist_len;         \
+    if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size )     \
+        (cache_ptr)->max_slist_size = (cache_ptr)->slist_size;       \
+}
+
+#define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit)            \
+{                                                                           \
+    if ( hit )                                                              \
+        ((cache_ptr)->hits)[(entry_ptr)->type->id]++;                       \
+    else                                                                    \
+        ((cache_ptr)->misses)[(entry_ptr)->type->id]++;                     \
+    if ( ! ((entry_ptr)->is_read_only) )                                    \
+        ((cache_ptr)->write_protects)[(entry_ptr)->type->id]++;             \
+    else {                                                                  \
+        ((cache_ptr)->read_protects)[(entry_ptr)->type->id]++;              \
+        if ( ((entry_ptr)->ro_ref_count) >                                  \
+                ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] )   \
+            ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] =       \
+                    ((entry_ptr)->ro_ref_count);                            \
+    }                                                                       \
+    if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len )              \
+        (cache_ptr)->max_index_len = (cache_ptr)->index_len;                \
+    H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr)                             \
+    if ( (cache_ptr)->pl_len > (cache_ptr)->max_pl_len )                    \
+        (cache_ptr)->max_pl_len = (cache_ptr)->pl_len;                      \
+    if ( (cache_ptr)->pl_size > (cache_ptr)->max_pl_size )                  \
+        (cache_ptr)->max_pl_size = (cache_ptr)->pl_size;                    \
+}
+
+#define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr)      \
+{                                                            \
+    ((cache_ptr)->pins)[(entry_ptr)->type->id]++;            \
+    if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len )   \
+        (cache_ptr)->max_pel_len = (cache_ptr)->pel_len;     \
+    if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \
+        (cache_ptr)->max_pel_size = (cache_ptr)->pel_size;   \
+}
+
+#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+
+#else /* H5C_COLLECT_CACHE_STATS */
+
+#define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr)
+#define H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr)
+#define H5C__UPDATE_STATS_FOR_UNPROTECT(cache_ptr)
+#define H5C__UPDATE_STATS_FOR_MOVE(cache_ptr, entry_ptr)
+#define H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, entry_ptr, new_size)
+#define H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr)
+#define H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr)
+#define H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, success, depth)
+#define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr)
+#define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr)
+#define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr)
+#define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr, take_ownership)
+#define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit)
+#define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr)
+#define H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr)
+#define H5C__UPDATE_STATS_FOR_SLIST_SCAN_RESTART(cache_ptr)
+#define H5C__UPDATE_STATS_FOR_LRU_SCAN_RESTART(cache_ptr)
+#define H5C__UPDATE_STATS_FOR_HASH_BUCKET_SCAN_RESTART(cache_ptr)
+
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+

+/***********************************************************************
  *
- * LRU_list_size:  Number of bytes of cache entries currently residing on the
- *              LRU list.
+ * Hash table access and manipulation macros:
  *
- *              Observe that LRU_list_size + pl_size must always equal
- *              index_size.
+ * The following macros handle searches, insertions, and deletion in
+ * the hash table.
  *
- * LRU_head_ptr:  Pointer to the head of the doubly linked LRU list.  Cache
- *              entries on this list are linked by their next and prev fields.
+ * When modifying these macros, remember to modify the similar macros
+ * in tst/cache.c
  *
- *              This field is NULL if the list is empty.
+ * Changes:
  *
- * LRU_tail_ptr:  Pointer to the tail of the doubly linked LRU list.  Cache
- *              entries on this list are linked by their next and prev fields.
+ *   - Updated existing index macros and sanity check macros to maintain
+ *     the clean_index_size and dirty_index_size fields of H5C_t.  Also
+ *     added macros to allow us to track entry cleans and dirties.
  *
- *              This field is NULL if the list is empty.
+ *     						JRM -- 11/5/08
  *
- * cLRU_list_len: Number of cache entries currently on the clean LRU list.
+ *   - Updated existing index macros and sanity check macros to maintain 
+ *     the index_ring_len, index_ring_size, clean_index_ring_size, and
+ *     dirty_index_ring_size fields of H5C_t.
  *
- *              Observe that cLRU_list_len + dLRU_list_len must always
- *              equal LRU_list_len.
+ *						JRM -- 9/1/15
  *
- * cLRU_list_size:  Number of bytes of cache entries currently residing on
- *              the clean LRU list.
- *
- *              Observe that cLRU_list_size + dLRU_list_size must always
- *              equal LRU_list_size.
- *
- * cLRU_head_ptr:  Pointer to the head of the doubly linked clean LRU list.
- *              Cache entries on this list are linked by their aux_next and
- *              aux_prev fields.
- *
- *              This field is NULL if the list is empty.
- *
- * cLRU_tail_ptr:  Pointer to the tail of the doubly linked clean LRU list.
- *              Cache entries on this list are linked by their aux_next and
- *              aux_prev fields.
- *
- *              This field is NULL if the list is empty.
- *
- * dLRU_list_len: Number of cache entries currently on the dirty LRU list.
- *
- *              Observe that cLRU_list_len + dLRU_list_len must always
- *              equal LRU_list_len.
- *
- * dLRU_list_size:  Number of cache entries currently on the dirty LRU list.
- *
- *              Observe that cLRU_list_len + dLRU_list_len must always
- *              equal LRU_list_len.
- *
- * dLRU_head_ptr:  Pointer to the head of the doubly linked dirty LRU list.
- *              Cache entries on this list are linked by their aux_next and
- *              aux_prev fields.
- *
- *              This field is NULL if the list is empty.
- *
- * dLRU_tail_ptr:  Pointer to the tail of the doubly linked dirty LRU list.
- *              Cache entries on this list are linked by their aux_next and
- *              aux_prev fields.
- *
- *              This field is NULL if the list is empty.
- *
- *
- * Automatic cache size adjustment:
- *
- * While the default cache size is adequate for most cases, we can run into
- * cases where the default is too small.  Ideally, we will let the user
- * adjust the cache size as required.  However, this is not possible in all
- * cases.  Thus I have added automatic cache size adjustment code.
- *
- * The configuration for the automatic cache size adjustment is stored in
- * the structure described below:
- *
- * size_increase_possible:  Depending on the configuration data given
- *		in the resize_ctl field, it may or may not be possible
- *		to increase the size of the cache.  Rather than test for
- *		all the ways this can happen, we simply set this flag when
- *		we receive a new configuration.
- *
- * flash_size_increase_possible: Depending on the configuration data given
- *              in the resize_ctl field, it may or may not be possible
- *              for a flash size increase to occur.  We set this flag
- *              whenever we receive a new configuration so as to avoid
- *              repeated calculations.
- *
- * flash_size_increase_threshold: If a flash cache size increase is possible,
- *              this field is used to store the minimum size of a new entry
- *              or size increase needed to trigger a flash cache size
- *              increase.  Note that this field must be updated whenever
- *              the size of the cache is changed.
- *
- * size_decrease_possible:  Depending on the configuration data given
- *              in the resize_ctl field, it may or may not be possible
- *              to decrease the size of the cache.  Rather than test for
- *              all the ways this can happen, we simply set this flag when
- *              we receive a new configuration.
- *
- * cache_full:	Boolean flag used to keep track of whether the cache is
- *		full, so we can refrain from increasing the size of a
- *		cache which hasn't used up the space alotted to it.
- *
- *		The field is initialized to FALSE, and then set to TRUE
- *		whenever we attempt to make space in the cache.
- *
- * resize_enabled:  This is another convenience flag which is set whenever
- *		a new set of values for resize_ctl are provided.  Very
- *		simply,
- *
- *		    resize_enabled = size_increase_possible ||
- *                                   size_decrease_possible;
- *
- * size_decreased:  Boolean flag set to TRUE whenever the maximun cache
- *		size is decreased.  The flag triggers a call to
- *		H5C_make_space_in_cache() on the next call to H5C_protect().
- *
- * resize_ctl:	Instance of H5C_auto_size_ctl_t containing configuration
- * 		data for automatic cache resizing.
- *
- * epoch_markers_active:  Integer field containing the number of epoch
- *		markers currently in use in the LRU list.  This value
- *		must be in the range [0, H5C__MAX_EPOCH_MARKERS - 1].
- *
- * epoch_marker_active:  Array of boolean of length H5C__MAX_EPOCH_MARKERS.
- *		This array is used to track which epoch markers are currently
- *		in use.
- *
- * epoch_marker_ringbuf:  Array of int of length H5C__MAX_EPOCH_MARKERS + 1.
- *
- *		To manage the epoch marker cache entries, it is necessary
- *		to track their order in the LRU list.  This is done with
- *		epoch_marker_ringbuf.  When markers are inserted at the
- *		head of the LRU list, the index of the marker in the
- *		epoch_markers array is inserted at the tail of the ring
- *		buffer.  When it becomes the epoch_marker_active'th marker
- *		in the LRU list, it will have worked its way to the head
- *		of the ring buffer as well.  This allows us to remove it
- *		without scanning the LRU list if such is required.
- *
- * epoch_marker_ringbuf_first: Integer field containing the index of the
- *		first entry in the ring buffer.
- *
- * epoch_marker_ringbuf_last: Integer field containing the index of the
- *		last entry in the ring buffer.
- *
- * epoch_marker_ringbuf_size: Integer field containing the number of entries
- *		in the ring buffer.
- *
- * epoch_markers:  Array of instances of H5C_cache_entry_t of length
- *		H5C__MAX_EPOCH_MARKERS.  The entries are used as markers
- *		in the LRU list to identify cache entries that haven't
- *		been accessed for some (small) specified number of
- *		epochs.  These entries (if any) can then be evicted and
- *		the cache size reduced -- ideally without evicting any
- *		of the current working set.  Needless to say, the epoch
- *		length and the number of epochs before an unused entry
- *		must be chosen so that all, or almost all, the working
- *		set will be accessed before the limit.
- *
- *		Epoch markers only appear in the LRU list, never in
- *		the index or slist.  While they are of type
- *		H5C__EPOCH_MARKER_TYPE, and have associated class
- *		functions, these functions should never be called.
- *
- *		The addr fields of these instances of H5C_cache_entry_t
- *		are set to the index of the instance in the epoch_markers
- *		array, the size is set to 0, and the type field points
- *		to the constant structure epoch_marker_class defined
- *		in H5C.c.  The next and prev fields are used as usual
- *		to link the entry into the LRU list.
- *
- *		All other fields are unused.
- *
- *
- * Cache hit rate collection fields:
- *
- * We supply the current cache hit rate on request, so we must keep a
- * simple cache hit rate computation regardless of whether statistics
- * collection is enabled.  The following fields support this capability.
- *
- * cache_hits: Number of cache hits since the last time the cache hit
- *	rate statistics were reset.  Note that when automatic cache
- *	re-sizing is enabled, this field will be reset every automatic
- *	resize epoch.
- *
- * cache_accesses: Number of times the cache has been accessed while
- *	since the last since the last time the cache hit rate statistics
- *	were reset.  Note that when automatic cache re-sizing is enabled,
- *	this field will be reset every automatic resize epoch.
- *
- *
- * Statistics collection fields:
- *
- * When enabled, these fields are used to collect statistics as described
- * below.  The first set are collected only when H5C_COLLECT_CACHE_STATS
- * is true.
- *
- * hits:        Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
- *		are used to record the number of times an entry with type id
- *		equal to the array index has been in cache when requested in
- *		the current epoch.
- *
- * misses:      Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
- *		are used to record the number of times an entry with type id
- *		equal to the array index has not been in cache when
- *		requested in the current epoch.
- *
- * write_protects:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The
- * 		cells are used to record the number of times an entry with
- * 		type id equal to the array index has been write protected
- * 		in the current epoch.
- *
- * 		Observe that (hits + misses) = (write_protects + read_protects).
- *
- * read_protects: Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The
- * 		cells are used to record the number of times an entry with
- * 		type id equal to the array index has been read protected in
- * 		the current epoch.
- *
- *              Observe that (hits + misses) = (write_protects + read_protects).
- *
- * max_read_protects:  Array of int32 of length H5C__MAX_NUM_TYPE_IDS + 1.
- * 		The cells are used to maximum number of simultaneous read
- * 		protects on any entry with type id equal to the array index
- * 		in the current epoch.
- *
- * insertions:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
- *		are used to record the number of times an entry with type
- *		id equal to the array index has been inserted into the
- *		cache in the current epoch.
- *
- * pinned_insertions:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1. 
- * 		The cells are used to record the number of times an entry
- * 		with type id equal to the array index has been inserted
- * 		pinned into the cache in the current epoch.
- *
- * clears:      Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
- *		are used to record the number of times an entry with type
- *		id equal to the array index has been cleared in the current
- *		epoch.
- *
- * flushes:     Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
- *		are used to record the number of times an entry with type id
- *		equal to the array index has been written to disk in the
- *              current epoch.
- *
- * evictions:   Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
- *		are used to record the number of times an entry with type id
- *		equal to the array index has been evicted from the cache in
- *		the current epoch.
- *
- * moves:     Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
- *		are used to record the number of times an entry with type
- *		id equal to the array index has been moved in the current
- *		epoch.
- *
- * entry_flush_moves: Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1. 
- * 		The cells are used to record the number of times an entry
- * 		with type id equal to the array index has been moved
- * 		during its flush callback in the current epoch.
- *
- * cache_flush_moves: Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1. 
- * 		The cells are used to record the number of times an entry
- * 		with type id equal to the array index has been moved
- * 		during a cache flush in the current epoch.
- *
- * pins:        Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
- *		are used to record the number of times an entry with type
- *		id equal to the array index has been pinned in the current
- *		epoch.
- *
- * unpins:      Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
- *		are used to record the number of times an entry with type
- *		id equal to the array index has been unpinned in the current
- *		epoch.
- *
- * dirty_pins:	Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
- *		are used to record the number of times an entry with type
- *		id equal to the array index has been marked dirty while pinned
- *		in the current epoch.
- *
- * pinned_flushes:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The
- * 		cells are used to record the number of times an  entry
- * 		with type id equal to the array index has been flushed while
- * 		pinned in the current epoch.
- *
- * pinned_cleared:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The
- * 		cells are used to record the number of times an  entry
- * 		with type id equal to the array index has been cleared while
- * 		pinned in the current epoch.
- *
- * size_increases:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.
- *		The cells are used to record the number of times an entry
- *		with type id equal to the array index has increased in
- *		size in the current epoch.
- *
- * size_decreases:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.
- *		The cells are used to record the number of times an entry
- *		with type id equal to the array index has decreased in
- *		size in the current epoch.
- *
- * entry_flush_size_changes:  Array of int64 of length
- * 		H5C__MAX_NUM_TYPE_IDS + 1.  The cells are used to record
- * 		the number of times an entry with type id equal to the
- * 		array index has changed size while in its flush callback.
- *
- * cache_flush_size_changes:  Array of int64 of length
- * 		H5C__MAX_NUM_TYPE_IDS + 1.  The cells are used to record
- * 		the number of times an entry with type id equal to the
- * 		array index has changed size during a cache flush
- *
- * total_ht_insertions: Number of times entries have been inserted into the
- *		hash table in the current epoch.
- *
- * total_ht_deletions: Number of times entries have been deleted from the
- *              hash table in the current epoch.
- *
- * successful_ht_searches: int64 containing the total number of successful
- *		searches of the hash table in the current epoch.
- *
- * total_successful_ht_search_depth: int64 containing the total number of
- *		entries other than the targets examined in successful
- *		searches of the hash table in the current epoch.
- *
- * failed_ht_searches: int64 containing the total number of unsuccessful
- *              searches of the hash table in the current epoch.
- *
- * total_failed_ht_search_depth: int64 containing the total number of
- *              entries examined in unsuccessful searches of the hash
- *		table in the current epoch.
- *
- * max_index_len:  Largest value attained by the index_len field in the
- *              current epoch.
- *
- * max_index_size:  Largest value attained by the index_size field in the
- *              current epoch.
- *
- * max_clean_index_size: Largest value attained by the clean_index_size field
- * 		in the current epoch.
- *
- * max_dirty_index_size: Largest value attained by the dirty_index_size field
- * 		in the current epoch.
- *
- * max_slist_len:  Largest value attained by the slist_len field in the
- *              current epoch.
- *
- * max_slist_size:  Largest value attained by the slist_size field in the
- *              current epoch.
- *
- * max_pl_len:  Largest value attained by the pl_len field in the
- *              current epoch.
- *
- * max_pl_size: Largest value attained by the pl_size field in the
- *              current epoch.
- *
- * max_pel_len: Largest value attained by the pel_len field in the
- *              current epoch.
- *
- * max_pel_size: Largest value attained by the pel_size field in the
- *              current epoch.
- *
- * calls_to_msic: Total number of calls to H5C_make_space_in_cache
- *
- * total_entries_skipped_in_msic: Number of clean entries skipped while
- *              enforcing the min_clean_fraction in H5C_make_space_in_cache().
- *
- * total_entries_scanned_in_msic: Number of clean entries skipped while
- *              enforcing the min_clean_fraction in H5C_make_space_in_cache().
- *
- * max_entries_skipped_in_msic: Maximum number of clean entries skipped
- *              in any one call to H5C_make_space_in_cache().
- *
- * max_entries_scanned_in_msic: Maximum number of entries scanned over
- *              in any one call to H5C_make_space_in_cache().
- *
- * entries_scanned_to_make_space: Number of entries scanned only when looking
- *              for entries to evict in order to make space in cache.
-
- * The remaining stats are collected only when both H5C_COLLECT_CACHE_STATS
- * and H5C_COLLECT_CACHE_ENTRY_STATS are true.
- *
- * max_accesses: Array of int32 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
- *		are used to record the maximum number of times any single
- *		entry with type id equal to the array index has been
- *		accessed in the current epoch.
- *
- * min_accesses: Array of int32 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
- *		are used to record the minimum number of times any single
- *		entry with type id equal to the array index has been
- *		accessed in the current epoch.
- *
- * max_clears:  Array of int32 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
- *		are used to record the maximum number of times any single
- *		entry with type id equal to the array index has been cleared
- *		in the current epoch.
- *
- * max_flushes: Array of int32 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
- *		are used to record the maximum number of times any single
- *		entry with type id equal to the array index has been
- *		flushed in the current epoch.
- *
- * max_size:	Array of size_t of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
- *              are used to record the maximum size of any single entry
- *		with type id equal to the array index that has resided in
- *		the cache in the current epoch.
- *
- * max_pins:	Array of size_t of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
- *              are used to record the maximum number of times that any single
- *              entry with type id equal to the array index that has been
- *              marked as pinned in the cache in the current epoch.
- *
- *
- * Fields supporting testing:
- *
- * prefix	Array of char used to prefix debugging output.  The
- *		field is intended to allow marking of output of with
- *		the processes mpi rank.
- *
- ****************************************************************************/
-
-#define H5C__HASH_TABLE_LEN     (64 * 1024) /* must be a power of 2 */
-
-#define H5C__H5C_T_MAGIC	0x005CAC0E
-#define H5C__MAX_NUM_TYPE_IDS	19
-#define H5C__PREFIX_LEN		32
-
-struct H5C_t
-{
-    uint32_t			magic;
-
-    hbool_t			flush_in_progress;
-
-    FILE *			trace_file_ptr;
-
-    void *			aux_ptr;
-
-    int32_t			max_type_id;
-    const char *                (* type_name_table_ptr);
-
-    size_t                      max_cache_size;
-    size_t                      min_clean_size;
-
-    H5C_write_permitted_func_t	check_write_permitted;
-    hbool_t			write_permitted;
-
-    H5C_log_flush_func_t	log_flush;
-
-    hbool_t			evictions_enabled;
-
-    int32_t                     index_len;
-    size_t                      index_size;
-    size_t 			clean_index_size;
-    size_t			dirty_index_size;
-    H5C_cache_entry_t *		(index[H5C__HASH_TABLE_LEN]);
-
-
-    int32_t                     slist_len;
-    size_t                      slist_size;
-    H5SL_t *                    slist_ptr;
-#if H5C_DO_SANITY_CHECKS
-    int64_t			slist_len_increase;
-    int64_t			slist_size_increase;
-#endif /* H5C_DO_SANITY_CHECKS */
-
-    int32_t                     pl_len;
-    size_t                      pl_size;
-    H5C_cache_entry_t *	        pl_head_ptr;
-    H5C_cache_entry_t *  	pl_tail_ptr;
-
-    int32_t                     pel_len;
-    size_t                      pel_size;
-    H5C_cache_entry_t *	        pel_head_ptr;
-    H5C_cache_entry_t *  	pel_tail_ptr;
-
-    int32_t                     LRU_list_len;
-    size_t                      LRU_list_size;
-    H5C_cache_entry_t *		LRU_head_ptr;
-    H5C_cache_entry_t *		LRU_tail_ptr;
-
-    int32_t                     cLRU_list_len;
-    size_t                      cLRU_list_size;
-    H5C_cache_entry_t *		cLRU_head_ptr;
-    H5C_cache_entry_t *		cLRU_tail_ptr;
-
-    int32_t                     dLRU_list_len;
-    size_t                      dLRU_list_size;
-    H5C_cache_entry_t *		dLRU_head_ptr;
-    H5C_cache_entry_t *	        dLRU_tail_ptr;
-
-    hbool_t			size_increase_possible;
-    hbool_t			flash_size_increase_possible;
-    size_t			flash_size_increase_threshold;
-    hbool_t			size_decrease_possible;
-    hbool_t			resize_enabled;
-    hbool_t			cache_full;
-    hbool_t			size_decreased;
-    H5C_auto_size_ctl_t		resize_ctl;
-
-    int32_t			epoch_markers_active;
-    hbool_t			epoch_marker_active[H5C__MAX_EPOCH_MARKERS];
-    int32_t			epoch_marker_ringbuf[H5C__MAX_EPOCH_MARKERS+1];
-    int32_t			epoch_marker_ringbuf_first;
-    int32_t			epoch_marker_ringbuf_last;
-    int32_t			epoch_marker_ringbuf_size;
-    H5C_cache_entry_t		epoch_markers[H5C__MAX_EPOCH_MARKERS];
-
-    int64_t			cache_hits;
-    int64_t			cache_accesses;
-
-#if H5C_COLLECT_CACHE_STATS
-
-    /* stats fields */
-    int64_t                     hits[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     misses[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     write_protects[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     read_protects[H5C__MAX_NUM_TYPE_IDS + 1];
-    int32_t                     max_read_protects[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     insertions[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     pinned_insertions[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     clears[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     flushes[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     evictions[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     moves[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     entry_flush_moves[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     cache_flush_moves[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     pins[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     unpins[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     dirty_pins[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     pinned_flushes[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     pinned_clears[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     size_increases[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     size_decreases[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     entry_flush_size_changes[H5C__MAX_NUM_TYPE_IDS + 1];
-    int64_t                     cache_flush_size_changes[H5C__MAX_NUM_TYPE_IDS + 1];
-
-    int64_t			total_ht_insertions;
-    int64_t			total_ht_deletions;
-    int64_t			successful_ht_searches;
-    int64_t			total_successful_ht_search_depth;
-    int64_t			failed_ht_searches;
-    int64_t			total_failed_ht_search_depth;
-
-    int32_t                     max_index_len;
-    size_t                      max_index_size;
-    size_t                      max_clean_index_size;
-    size_t                      max_dirty_index_size;
-
-    int32_t                     max_slist_len;
-    size_t                      max_slist_size;
-
-    int32_t                     max_pl_len;
-    size_t                      max_pl_size;
-
-    int32_t                     max_pel_len;
-    size_t                      max_pel_size;
-
-    int64_t                     calls_to_msic;
-    int64_t                     total_entries_skipped_in_msic;
-    int64_t                     total_entries_scanned_in_msic;
-    int32_t                     max_entries_skipped_in_msic;
-    int32_t                     max_entries_scanned_in_msic;
-    int64_t                     entries_scanned_to_make_space;
-
-#if H5C_COLLECT_CACHE_ENTRY_STATS
-
-    int32_t                     max_accesses[H5C__MAX_NUM_TYPE_IDS + 1];
-    int32_t                     min_accesses[H5C__MAX_NUM_TYPE_IDS + 1];
-    int32_t                     max_clears[H5C__MAX_NUM_TYPE_IDS + 1];
-    int32_t                     max_flushes[H5C__MAX_NUM_TYPE_IDS + 1];
-    size_t                      max_size[H5C__MAX_NUM_TYPE_IDS + 1];
-    int32_t                     max_pins[H5C__MAX_NUM_TYPE_IDS + 1];
-
-#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
-
-#endif /* H5C_COLLECT_CACHE_STATS */
-
-    char			prefix[H5C__PREFIX_LEN];
-};
-
-

-/****************************************************************************/
-/***************************** Macro Definitions ****************************/
-/****************************************************************************/
-
-/****************************************************************************
- *
- * We maintain doubly linked lists of instances of H5C_cache_entry_t for a
- * variety of reasons -- protected list, LRU list, and the clean and dirty
- * LRU lists at present.  The following macros support linking and unlinking
- * of instances of H5C_cache_entry_t by both their regular and auxilary next
- * and previous pointers.
- *
- * The size and length fields are also maintained.
- *
- * Note that the relevant pair of prev and next pointers are presumed to be
- * NULL on entry in the insertion macros.
- *
- * Finally, observe that the sanity checking macros evaluate to the empty
- * string when H5C_DO_SANITY_CHECKS is FALSE.  They also contain calls
- * to the HGOTO_ERROR macro, which may not be appropriate in all cases.
- * If so, we will need versions of the insertion and deletion macros which
- * do not reference the sanity checking macros.
- *							JRM - 5/5/04
- *
- * Changes:
- *
- *  - Removed the line:
- *
- *        ( ( (Size) == (entry_ptr)->size ) && ( (len) != 1 ) ) ||
- *
- *    from the H5C__DLL_PRE_REMOVE_SC macro.  With the addition of the
- *    epoch markers used in the age out based cache size reduction algorithm,
- *    this invarient need not hold, as the epoch markers are of size 0.
- *
- *    One could argue that I should have given the epoch markers a positive
- *    size, but this would break the index_size = LRU_list_size + pl_size
- *    + pel_size invarient.
- *
- *    Alternatively, I could pass the current decr_mode in to the macro,
- *    and just skip the check whenever epoch markers may be in use.
- *
- *    However, any size errors should be caught when the cache is flushed
- *    and destroyed.  Until we are tracking such an error, this should be
- *    good enough.
- *                                                     JRM - 12/9/04
- *
- *
- *  - In the H5C__DLL_PRE_INSERT_SC macro, replaced the lines:
- *
- *    ( ( (len) == 1 ) &&
- *      ( ( (head_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) ||
- *        ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )
- *      )
- *    ) ||
- *
- *    with:
- *
- *    ( ( (len) == 1 ) &&
- *      ( ( (head_ptr) != (tail_ptr) ) ||
- *        ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )
- *      )
- *    ) ||
- *
- *    Epoch markers have size 0, so we can now have a non-empty list with
- *    zero size.  Hence the "( (Size) <= 0 )" clause cause false failures
- *    in the sanity check.  Since "Size" is typically a size_t, it can't
- *    take on negative values, and thus the revised clause "( (Size) < 0 )"
- *    caused compiler warnings.
- *                                                     JRM - 12/22/04
- *
- *  - In the H5C__DLL_SC macro, replaced the lines:
- *
- *    ( ( (len) == 1 ) &&
- *      ( ( (head_ptr) != (tail_ptr) ) || ( (cache_ptr)->size <= 0 ) ||
- *        ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )
- *      )
- *    ) ||
- *
- *    with
- *
- *    ( ( (len) == 1 ) &&
- *      ( ( (head_ptr) != (tail_ptr) ) ||
- *        ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )
- *      )
- *    ) ||
- *
- *    Epoch markers have size 0, so we can now have a non-empty list with
- *    zero size.  Hence the "( (Size) <= 0 )" clause cause false failures
- *    in the sanity check.  Since "Size" is typically a size_t, it can't
- *    take on negative values, and thus the revised clause "( (Size) < 0 )"
- *    caused compiler warnings.
- *                                                     JRM - 1/10/05
- *
- *  - Added the H5C__DLL_UPDATE_FOR_SIZE_CHANGE macro and the associated
- *    sanity checking macros.  These macro are used to update the size of
- *    a DLL when one of its entries changes size.
- *
- *							JRM - 9/8/05
- *
- ****************************************************************************/
-
-#if H5C_DO_SANITY_CHECKS
-
-#define H5C__DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
-if ( ( (head_ptr) == NULL ) ||                                               \
-     ( (tail_ptr) == NULL ) ||                                               \
-     ( (entry_ptr) == NULL ) ||                                              \
-     ( (len) <= 0 ) ||                                                       \
-     ( (Size) < (entry_ptr)->size ) ||                                       \
-     ( ( (entry_ptr)->prev == NULL ) && ( (head_ptr) != (entry_ptr) ) ) ||   \
-     ( ( (entry_ptr)->next == NULL ) && ( (tail_ptr) != (entry_ptr) ) ) ||   \
-     ( ( (len) == 1 ) &&                                                     \
-       ( ! ( ( (head_ptr) == (entry_ptr) ) &&                                \
-             ( (tail_ptr) == (entry_ptr) ) &&                                \
-             ( (entry_ptr)->next == NULL ) &&                                \
-             ( (entry_ptr)->prev == NULL ) &&                                \
-             ( (Size) == (entry_ptr)->size )                                 \
-           )                                                                 \
-       )                                                                     \
-     )                                                                       \
-   ) {                                                                       \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "DLL pre remove SC failed")     \
-}
-
-#define H5C__DLL_SC(head_ptr, tail_ptr, len, Size, fv)                   \
-if ( ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) &&           \
-       ( (head_ptr) != (tail_ptr) )                                      \
-     ) ||                                                                \
-     ( (len) < 0 ) ||                                                    \
-     ( (Size) < 0 ) ||                                                   \
-     ( ( (len) == 1 ) &&                                                 \
-       ( ( (head_ptr) != (tail_ptr) ) ||                                 \
-         ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )        \
-       )                                                                 \
-     ) ||                                                                \
-     ( ( (len) >= 1 ) &&                                                 \
-       ( ( (head_ptr) == NULL ) || ( (head_ptr)->prev != NULL ) ||       \
-         ( (tail_ptr) == NULL ) || ( (tail_ptr)->next != NULL )          \
-       )                                                                 \
-     )                                                                   \
-   ) {                                                                   \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "DLL sanity check failed")  \
-}
-
-#define H5C__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \
-if ( ( (entry_ptr) == NULL ) ||                                              \
-     ( (entry_ptr)->next != NULL ) ||                                        \
-     ( (entry_ptr)->prev != NULL ) ||                                        \
-     ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) &&               \
-       ( (head_ptr) != (tail_ptr) )                                          \
-     ) ||                                                                    \
-     ( (len) < 0 ) ||                                                        \
-     ( ( (len) == 1 ) &&                                                     \
-       ( ( (head_ptr) != (tail_ptr) ) ||                                     \
-         ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )            \
-       )                                                                     \
-     ) ||                                                                    \
-     ( ( (len) >= 1 ) &&                                                     \
-       ( ( (head_ptr) == NULL ) || ( (head_ptr)->prev != NULL ) ||           \
-         ( (tail_ptr) == NULL ) || ( (tail_ptr)->next != NULL )              \
-       )                                                                     \
-     )                                                                       \
-   ) {                                                                       \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "DLL pre insert SC failed")     \
-}
-
-#define H5C__DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)    \
-if ( ( (dll_len) <= 0 ) ||                                                    \
-     ( (dll_size) <= 0 ) ||                                                   \
-     ( (old_size) <= 0 ) ||                                                   \
-     ( (old_size) > (dll_size) ) ||                                           \
-     ( (new_size) <= 0 ) ||                                                   \
-     ( ( (dll_len) == 1 ) && ( (old_size) != (dll_size) ) ) ) {               \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "DLL pre size update SC failed") \
-}
-
-#define H5C__DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)    \
-if ( ( (new_size) > (dll_size) ) ||                                            \
-     ( ( (dll_len) == 1 ) && ( (new_size) != (dll_size) ) ) ) {                \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "DLL post size update SC failed") \
-}
-
-#else /* H5C_DO_SANITY_CHECKS */
-
-#define H5C__DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv)
-#define H5C__DLL_SC(head_ptr, tail_ptr, len, Size, fv)
-#define H5C__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv)
-#define H5C__DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)
-#define H5C__DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)
-
-#endif /* H5C_DO_SANITY_CHECKS */
-
-
-#define H5C__DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val) \
-        H5C__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size,    \
-                               fail_val)                                    \
-        if ( (head_ptr) == NULL )                                           \
-        {                                                                   \
-           (head_ptr) = (entry_ptr);                                        \
-           (tail_ptr) = (entry_ptr);                                        \
-        }                                                                   \
-        else                                                                \
-        {                                                                   \
-           (tail_ptr)->next = (entry_ptr);                                  \
-           (entry_ptr)->prev = (tail_ptr);                                  \
-           (tail_ptr) = (entry_ptr);                                        \
-        }                                                                   \
-        (len)++;                                                            \
-        (Size) += (entry_ptr)->size;
+ ***********************************************************************/
 
-#define H5C__DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val) \
-        H5C__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size,     \
-                               fail_val)                                     \
-        if ( (head_ptr) == NULL )                                            \
-        {                                                                    \
-           (head_ptr) = (entry_ptr);                                         \
-           (tail_ptr) = (entry_ptr);                                         \
-        }                                                                    \
-        else                                                                 \
-        {                                                                    \
-           (head_ptr)->prev = (entry_ptr);                                   \
-           (entry_ptr)->next = (head_ptr);                                   \
-           (head_ptr) = (entry_ptr);                                         \
-        }                                                                    \
-        (len)++;                                                             \
-        (Size) += entry_ptr->size;
+/* H5C__HASH_TABLE_LEN is defined in H5Cpkg.h.  It mut be a power of two. */
 
-#define H5C__DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val) \
-        H5C__DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size,    \
-                               fail_val)                                    \
-        {                                                                   \
-           if ( (head_ptr) == (entry_ptr) )                                 \
-           {                                                                \
-              (head_ptr) = (entry_ptr)->next;                               \
-              if ( (head_ptr) != NULL )                                     \
-              {                                                             \
-                 (head_ptr)->prev = NULL;                                   \
-              }                                                             \
-           }                                                                \
-           else                                                             \
-           {                                                                \
-              (entry_ptr)->prev->next = (entry_ptr)->next;                  \
-           }                                                                \
-           if ( (tail_ptr) == (entry_ptr) )                                 \
-           {                                                                \
-              (tail_ptr) = (entry_ptr)->prev;                               \
-              if ( (tail_ptr) != NULL )                                     \
-              {                                                             \
-                 (tail_ptr)->next = NULL;                                   \
-              }                                                             \
-           }                                                                \
-           else                                                             \
-           {                                                                \
-              (entry_ptr)->next->prev = (entry_ptr)->prev;                  \
-           }                                                                \
-           entry_ptr->next = NULL;                                          \
-           entry_ptr->prev = NULL;                                          \
-           (len)--;                                                         \
-           (Size) -= entry_ptr->size;                                       \
-        }
+#define H5C__HASH_MASK		((size_t)(H5C__HASH_TABLE_LEN - 1) << 3)
 
-#define H5C__DLL_UPDATE_FOR_SIZE_CHANGE(dll_len, dll_size, old_size, new_size) \
-        H5C__DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)     \
-	(dll_size) -= (old_size);                                              \
-	(dll_size) += (new_size);                                              \
-        H5C__DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size)
+#define H5C__HASH_FCN(x)	(int)((unsigned)((x) & H5C__HASH_MASK) >> 3)
 
 #if H5C_DO_SANITY_CHECKS
 
-#define H5C__AUX_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) \
-if ( ( (hd_ptr) == NULL ) ||                                                   \
-     ( (tail_ptr) == NULL ) ||                                                 \
-     ( (entry_ptr) == NULL ) ||                                                \
-     ( (len) <= 0 ) ||                                                         \
-     ( (Size) < (entry_ptr)->size ) ||                                         \
-     ( ( (Size) == (entry_ptr)->size ) && ( ! ( (len) == 1 ) ) ) ||            \
-     ( ( (entry_ptr)->aux_prev == NULL ) && ( (hd_ptr) != (entry_ptr) ) ) ||   \
-     ( ( (entry_ptr)->aux_next == NULL ) && ( (tail_ptr) != (entry_ptr) ) ) || \
-     ( ( (len) == 1 ) &&                                                       \
-       ( ! ( ( (hd_ptr) == (entry_ptr) ) && ( (tail_ptr) == (entry_ptr) ) &&   \
-             ( (entry_ptr)->aux_next == NULL ) &&                              \
-             ( (entry_ptr)->aux_prev == NULL ) &&                              \
-             ( (Size) == (entry_ptr)->size )                                   \
-           )                                                                   \
-       )                                                                       \
-     )                                                                         \
-   ) {                                                                         \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "aux DLL pre remove SC failed")   \
+#define H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val)           \
+if ( ( (cache_ptr) == NULL ) ||                                         \
+     ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                      \
+     ( (entry_ptr) == NULL ) ||                                         \
+     ( ! H5F_addr_defined((entry_ptr)->addr) ) ||                       \
+     ( (entry_ptr)->ht_next != NULL ) ||                                \
+     ( (entry_ptr)->ht_prev != NULL ) ||                                \
+     ( (entry_ptr)->size <= 0 ) ||                                      \
+     ( H5C__HASH_FCN((entry_ptr)->addr) < 0 ) ||                        \
+     ( H5C__HASH_FCN((entry_ptr)->addr) >= H5C__HASH_TABLE_LEN ) ||     \
+     ( (cache_ptr)->index_size !=                                       \
+       ((cache_ptr)->clean_index_size +                                 \
+	(cache_ptr)->dirty_index_size) ) ||                             \
+     ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) ||   \
+     ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) ||   \
+     ( (entry_ptr)->ring <= H5C_RING_UNDEFINED ) ||                     \
+     ( (entry_ptr)->ring >= H5C_RING_NTYPES ) ||                        \
+     ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] >                 \
+       (cache_ptr)->index_len ) ||                                      \
+     ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] >                \
+       (cache_ptr)->index_size ) ||                                     \
+     ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] !=               \
+       ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] +         \
+        (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ) {    \
+    HDassert(FALSE);                                                    \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val,                        \
+               "Pre HT insert SC failed")                               \
 }
 
-#define H5C__AUX_DLL_SC(head_ptr, tail_ptr, len, Size, fv)                  \
-if ( ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) &&              \
-       ( (head_ptr) != (tail_ptr) )                                         \
-     ) ||                                                                   \
-     ( (len) < 0 ) ||                                                       \
-     ( (Size) < 0 ) ||                                                      \
-     ( ( (len) == 1 ) &&                                                    \
-       ( ( (head_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) ||                 \
-         ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) )           \
-       )                                                                    \
-     ) ||                                                                   \
-     ( ( (len) >= 1 ) &&                                                    \
-       ( ( (head_ptr) == NULL ) || ( (head_ptr)->aux_prev != NULL ) ||      \
-         ( (tail_ptr) == NULL ) || ( (tail_ptr)->aux_next != NULL )         \
-       )                                                                    \
-     )                                                                      \
-   ) {                                                                      \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "AUX DLL sanity check failed") \
+#define H5C__POST_HT_INSERT_SC(cache_ptr, fail_val)                     \
+if ( ( (cache_ptr) == NULL ) ||                                         \
+     ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                      \
+     ( (cache_ptr)->index_size !=                                       \
+       ((cache_ptr)->clean_index_size +                                 \
+	(cache_ptr)->dirty_index_size) ) ||                             \
+     ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) ||   \
+     ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) ||   \
+     ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] == 0 ) ||         \
+     ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] >                 \
+       (cache_ptr)->index_len ) ||                                      \
+     ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] >                \
+       (cache_ptr)->index_size ) ||                                     \
+     ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] !=               \
+       ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] +         \
+        (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ) {    \
+    HDassert(FALSE);                                                    \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val,                        \
+               "Post HT insert SC failed")                              \
 }
 
-#define H5C__AUX_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) \
-if ( ( (entry_ptr) == NULL ) ||                                                \
-     ( (entry_ptr)->aux_next != NULL ) ||                                      \
-     ( (entry_ptr)->aux_prev != NULL ) ||                                      \
-     ( ( ( (hd_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) &&                   \
-       ( (hd_ptr) != (tail_ptr) )                                              \
-     ) ||                                                                      \
-     ( (len) < 0 ) ||                                                          \
-     ( ( (len) == 1 ) &&                                                       \
-       ( ( (hd_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) ||                      \
-         ( (hd_ptr) == NULL ) || ( (hd_ptr)->size != (Size) )                  \
-       )                                                                       \
-     ) ||                                                                      \
-     ( ( (len) >= 1 ) &&                                                       \
-       ( ( (hd_ptr) == NULL ) || ( (hd_ptr)->aux_prev != NULL ) ||             \
-         ( (tail_ptr) == NULL ) || ( (tail_ptr)->aux_next != NULL )            \
-       )                                                                       \
-     )                                                                         \
-   ) {                                                                         \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "AUX DLL pre insert SC failed")   \
+#define H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr)                     \
+if ( ( (cache_ptr) == NULL ) ||                                         \
+     ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                      \
+     ( (cache_ptr)->index_len < 1 ) ||                                  \
+     ( (entry_ptr) == NULL ) ||                                         \
+     ( (cache_ptr)->index_size < (entry_ptr)->size ) ||                 \
+     ( ! H5F_addr_defined((entry_ptr)->addr) ) ||                       \
+     ( (entry_ptr)->size <= 0 ) ||                                      \
+     ( H5C__HASH_FCN((entry_ptr)->addr) < 0 ) ||                        \
+     ( H5C__HASH_FCN((entry_ptr)->addr) >= H5C__HASH_TABLE_LEN ) ||     \
+     ( ((cache_ptr)->index)[(H5C__HASH_FCN((entry_ptr)->addr))]         \
+       == NULL ) ||                                                     \
+     ( ( ((cache_ptr)->index)[(H5C__HASH_FCN((entry_ptr)->addr))]       \
+       != (entry_ptr) ) &&                                              \
+       ( (entry_ptr)->ht_prev == NULL ) ) ||                            \
+     ( ( ((cache_ptr)->index)[(H5C__HASH_FCN((entry_ptr)->addr))] ==    \
+         (entry_ptr) ) &&                                               \
+       ( (entry_ptr)->ht_prev != NULL ) ) ||                            \
+     ( (cache_ptr)->index_size !=                                       \
+       ((cache_ptr)->clean_index_size +                                 \
+	(cache_ptr)->dirty_index_size) ) ||                             \
+     ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) ||   \
+     ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) ||   \
+     ( (entry_ptr)->ring <= H5C_RING_UNDEFINED ) ||                     \
+     ( (entry_ptr)->ring >= H5C_RING_NTYPES ) ||                        \
+     ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] <= 0 ) ||         \
+     ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] >                 \
+       (cache_ptr)->index_len ) ||                                      \
+     ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] <                \
+       (entry_ptr)->size ) ||                                           \
+     ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] >                \
+       (cache_ptr)->index_size ) ||                                     \
+     ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] !=               \
+       ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] +         \
+        (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ) {    \
+    HDassert(FALSE);                                                    \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Pre HT remove SC failed") \
 }
 
-#else /* H5C_DO_SANITY_CHECKS */
-
-#define H5C__AUX_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv)
-#define H5C__AUX_DLL_SC(head_ptr, tail_ptr, len, Size, fv)
-#define H5C__AUX_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv)
-
-#endif /* H5C_DO_SANITY_CHECKS */
-
-
-#define H5C__AUX_DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val)\
-        H5C__AUX_DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size,   \
-                                   fail_val)                                   \
-        if ( (head_ptr) == NULL )                                              \
-        {                                                                      \
-           (head_ptr) = (entry_ptr);                                           \
-           (tail_ptr) = (entry_ptr);                                           \
-        }                                                                      \
-        else                                                                   \
-        {                                                                      \
-           (tail_ptr)->aux_next = (entry_ptr);                                 \
-           (entry_ptr)->aux_prev = (tail_ptr);                                 \
-           (tail_ptr) = (entry_ptr);                                           \
-        }                                                                      \
-        (len)++;                                                               \
-        (Size) += entry_ptr->size;
-
-#define H5C__AUX_DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fv)   \
-        H5C__AUX_DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, \
-                                   fv)                                       \
-        if ( (head_ptr) == NULL )                                            \
-        {                                                                    \
-           (head_ptr) = (entry_ptr);                                         \
-           (tail_ptr) = (entry_ptr);                                         \
-        }                                                                    \
-        else                                                                 \
-        {                                                                    \
-           (head_ptr)->aux_prev = (entry_ptr);                               \
-           (entry_ptr)->aux_next = (head_ptr);                               \
-           (head_ptr) = (entry_ptr);                                         \
-        }                                                                    \
-        (len)++;                                                             \
-        (Size) += entry_ptr->size;
-
-#define H5C__AUX_DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, Size, fv)    \
-        H5C__AUX_DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, \
-                                   fv)                                       \
-        {                                                                    \
-           if ( (head_ptr) == (entry_ptr) )                                  \
-           {                                                                 \
-              (head_ptr) = (entry_ptr)->aux_next;                            \
-              if ( (head_ptr) != NULL )                                      \
-              {                                                              \
-                 (head_ptr)->aux_prev = NULL;                                \
-              }                                                              \
-           }                                                                 \
-           else                                                              \
-           {                                                                 \
-              (entry_ptr)->aux_prev->aux_next = (entry_ptr)->aux_next;       \
-           }                                                                 \
-           if ( (tail_ptr) == (entry_ptr) )                                  \
-           {                                                                 \
-              (tail_ptr) = (entry_ptr)->aux_prev;                            \
-              if ( (tail_ptr) != NULL )                                      \
-              {                                                              \
-                 (tail_ptr)->aux_next = NULL;                                \
-              }                                                              \
-           }                                                                 \
-           else                                                              \
-           {                                                                 \
-              (entry_ptr)->aux_next->aux_prev = (entry_ptr)->aux_prev;       \
-           }                                                                 \
-           entry_ptr->aux_next = NULL;                                       \
-           entry_ptr->aux_prev = NULL;                                       \
-           (len)--;                                                          \
-           (Size) -= entry_ptr->size;                                        \
-        }
-
-

-/***********************************************************************
- *
- * Stats collection macros
- *
- * The following macros must handle stats collection when this collection
- * is enabled, and evaluate to the empty string when it is not.
- *
- * The sole exception to this rule is
- * H5C__UPDATE_CACHE_HIT_RATE_STATS(), which is always active as
- * the cache hit rate stats are always collected and available.
- *
- * Changes:
- *
- * 	JRM -- 3/21/06
- * 	Added / updated macros for pinned entry related stats.
- *
- * 	JRM -- 8/9/06
- * 	More pinned entry stats related updates.
- *
- * 	JRM -- 3/31/07
- * 	Updated H5C__UPDATE_STATS_FOR_PROTECT() to keep stats on
- * 	read and write protects.
- *
- *      MAM -- 1/15/09
- *      Created H5C__UPDATE_MAX_INDEX_SIZE_STATS to contain
- *      common code within macros that update the maximum
- *      index, clean_index, and dirty_index statistics fields.
- *
- ***********************************************************************/
-
-#define H5C__UPDATE_CACHE_HIT_RATE_STATS(cache_ptr, hit) \
-        (cache_ptr->cache_accesses)++;                   \
-        if ( hit ) {                                     \
-            (cache_ptr->cache_hits)++;                   \
-        }                                                \
-
-#if H5C_COLLECT_CACHE_STATS
-
-#define H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr)                        \
-        if ( (cache_ptr)->index_size > (cache_ptr)->max_index_size )       \
-            (cache_ptr)->max_index_size = (cache_ptr)->index_size;         \
-        if ( (cache_ptr)->clean_index_size >                               \
-                (cache_ptr)->max_clean_index_size )                        \
-            (cache_ptr)->max_clean_index_size =                            \
-                (cache_ptr)->clean_index_size;                             \
-        if ( (cache_ptr)->dirty_index_size >                               \
-                (cache_ptr)->max_dirty_index_size )                        \
-            (cache_ptr)->max_dirty_index_size =                            \
-                (cache_ptr)->dirty_index_size;
+#define H5C__POST_HT_REMOVE_SC(cache_ptr, entry_ptr)                     \
+if ( ( (cache_ptr) == NULL ) ||                                          \
+     ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                       \
+     ( (entry_ptr) == NULL ) ||                                          \
+     ( ! H5F_addr_defined((entry_ptr)->addr) ) ||                        \
+     ( (entry_ptr)->size <= 0 ) ||                                       \
+     ( (entry_ptr)->ht_prev != NULL ) ||                                 \
+     ( (entry_ptr)->ht_prev != NULL ) ||                                 \
+     ( (cache_ptr)->index_size !=                                        \
+       ((cache_ptr)->clean_index_size +                                  \
+	(cache_ptr)->dirty_index_size) ) ||                              \
+     ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) ||    \
+     ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) ||    \
+     ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] >                  \
+       (cache_ptr)->index_len ) ||                                       \
+     ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] >                 \
+       (cache_ptr)->index_size ) ||                                      \
+     ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] !=                \
+       ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] +          \
+        (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ) {     \
+    HDassert(FALSE);                                                     \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Post HT remove SC failed") \
+}
 
-#define H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr) \
-	(((cache_ptr)->dirty_pins)[(entry_ptr)->type->id])++;
+/* (Keep in sync w/H5C_TEST__PRE_HT_SEARCH_SC macro in test/cache_common.h -QAK) */
+#define H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val)                    \
+if ( ( (cache_ptr) == NULL ) ||                                             \
+     ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                          \
+     ( (cache_ptr)->index_size !=                                           \
+       ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) || \
+     ( ! H5F_addr_defined(Addr) ) ||                                        \
+     ( H5C__HASH_FCN(Addr) < 0 ) ||                                         \
+     ( H5C__HASH_FCN(Addr) >= H5C__HASH_TABLE_LEN ) ) {                     \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "Pre HT search SC failed") \
+}
 
-#define H5C__UPDATE_STATS_FOR_UNPROTECT(cache_ptr)                   \
-        if ( (cache_ptr)->slist_len > (cache_ptr)->max_slist_len )   \
-	    (cache_ptr)->max_slist_len = (cache_ptr)->slist_len;     \
-        if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size ) \
-	    (cache_ptr)->max_slist_size = (cache_ptr)->slist_size;   \
-	if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len )       \
-	    (cache_ptr)->max_pel_len = (cache_ptr)->pel_len;         \
-	if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size )     \
-	    (cache_ptr)->max_pel_size = (cache_ptr)->pel_size;
+/* (Keep in sync w/H5C_TEST__POST_SUC_HT_SEARCH_SC macro in test/cache_common.h -QAK) */
+#define H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k, fail_val) \
+if ( ( (cache_ptr) == NULL ) ||                                             \
+     ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                          \
+     ( (cache_ptr)->index_len < 1 ) ||                                      \
+     ( (entry_ptr) == NULL ) ||                                             \
+     ( (cache_ptr)->index_size < (entry_ptr)->size ) ||                     \
+     ( (cache_ptr)->index_size !=                                           \
+       ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) || \
+     ( H5F_addr_ne((entry_ptr)->addr, (Addr)) ) ||                          \
+     ( (entry_ptr)->size <= 0 ) ||                                          \
+     ( ((cache_ptr)->index)[k] == NULL ) ||                                 \
+     ( ( ((cache_ptr)->index)[k] != (entry_ptr) ) &&                        \
+       ( (entry_ptr)->ht_prev == NULL ) ) ||                                \
+     ( ( ((cache_ptr)->index)[k] == (entry_ptr) ) &&                        \
+       ( (entry_ptr)->ht_prev != NULL ) ) ||                                \
+     ( ( (entry_ptr)->ht_prev != NULL ) &&                                  \
+       ( (entry_ptr)->ht_prev->ht_next != (entry_ptr) ) ) ||                \
+     ( ( (entry_ptr)->ht_next != NULL ) &&                                  \
+       ( (entry_ptr)->ht_next->ht_prev != (entry_ptr) ) ) ) {               \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val,                            \
+                "Post successful HT search SC failed")                      \
+}
 
-#define H5C__UPDATE_STATS_FOR_MOVE(cache_ptr, entry_ptr)               \
-	if ( cache_ptr->flush_in_progress ) {                            \
-            ((cache_ptr)->cache_flush_moves[(entry_ptr)->type->id])++; \
-	}                                                                \
-        if ( entry_ptr->flush_in_progress ) {                            \
-            ((cache_ptr)->entry_flush_moves[(entry_ptr)->type->id])++; \
-	}                                                                \
-	(((cache_ptr)->moves)[(entry_ptr)->type->id])++;
+/* (Keep in sync w/H5C_TEST__POST_HT_SHIFT_TO_FRONT macro in test/cache_common.h -QAK) */
+#define H5C__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val) \
+if ( ( (cache_ptr) == NULL ) ||                                        \
+     ( ((cache_ptr)->index)[k] != (entry_ptr) ) ||                     \
+     ( (entry_ptr)->ht_prev != NULL ) ) {                              \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val,                       \
+                "Post HT shift to front SC failed")                    \
+}
 
-#define H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, entry_ptr, new_size)\
-	if ( cache_ptr->flush_in_progress ) {                                  \
-            ((cache_ptr)->cache_flush_size_changes[(entry_ptr)->type->id])++;  \
-	}                                                                      \
-        if ( entry_ptr->flush_in_progress ) {                                  \
-            ((cache_ptr)->entry_flush_size_changes[(entry_ptr)->type->id])++;  \
-	}                                                                      \
-	if ( (entry_ptr)->size < (new_size) ) {                                \
-	    ((cache_ptr)->size_increases[(entry_ptr)->type->id])++;            \
-            H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr)                        \
-            if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size )       \
-                (cache_ptr)->max_slist_size = (cache_ptr)->slist_size;         \
-            if ( (cache_ptr)->pl_size > (cache_ptr)->max_pl_size )             \
-                (cache_ptr)->max_pl_size = (cache_ptr)->pl_size;               \
-	} else if ( (entry_ptr)->size > (new_size) ) {                         \
-	    ((cache_ptr)->size_decreases[(entry_ptr)->type->id])++;            \
-	}
+#define H5C__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
+		                         entry_ptr, was_clean)          \
+if ( ( (cache_ptr) == NULL ) ||                                         \
+     ( (cache_ptr)->index_len <= 0 ) ||                                 \
+     ( (cache_ptr)->index_size <= 0 ) ||                                \
+     ( (new_size) <= 0 ) ||                                             \
+     ( (old_size) > (cache_ptr)->index_size ) ||                        \
+     ( (new_size) <= 0 ) ||                                             \
+     ( ( (cache_ptr)->index_len == 1 ) &&                               \
+       ( (cache_ptr)->index_size != (old_size) ) ) ||                   \
+     ( (cache_ptr)->index_size !=                                       \
+       ((cache_ptr)->clean_index_size +                                 \
+        (cache_ptr)->dirty_index_size) ) ||                             \
+     ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) ||   \
+     ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) ||   \
+     ( ( !( was_clean ) ||                                              \
+	    ( (cache_ptr)->clean_index_size < (old_size) ) ) &&         \
+	  ( ( (was_clean) ) ||                                          \
+	    ( (cache_ptr)->dirty_index_size < (old_size) ) ) ) ||       \
+     ( (entry_ptr) == NULL ) ||                                         \
+     ( (entry_ptr)->ring <= H5C_RING_UNDEFINED ) ||                     \
+     ( (entry_ptr)->ring >= H5C_RING_NTYPES ) ||                        \
+     ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] <= 0 ) ||         \
+     ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] >                 \
+       (cache_ptr)->index_len ) ||                                      \
+     ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] >                \
+       (cache_ptr)->index_size ) ||                                     \
+     ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] !=               \
+       ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] +         \
+        (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ) {    \
+    HDassert(FALSE);                                                    \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                            \
+                "Pre HT entry size change SC failed")                   \
+}
 
-#define H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr) \
-	(cache_ptr)->total_ht_insertions++;
+#define H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size,  \
+		                          entry_ptr)                      \
+if ( ( (cache_ptr) == NULL ) ||                                           \
+     ( (cache_ptr)->index_len <= 0 ) ||                                   \
+     ( (cache_ptr)->index_size <= 0 ) ||                                  \
+     ( (new_size) > (cache_ptr)->index_size ) ||                          \
+     ( (cache_ptr)->index_size !=                                         \
+	  ((cache_ptr)->clean_index_size +                                \
+           (cache_ptr)->dirty_index_size) ) ||                            \
+     ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) ||     \
+     ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) ||     \
+     ( ( !((entry_ptr)->is_dirty ) ||                                     \
+	    ( (cache_ptr)->dirty_index_size < (new_size) ) ) &&           \
+	  ( ( ((entry_ptr)->is_dirty)  ) ||                               \
+	    ( (cache_ptr)->clean_index_size < (new_size) ) ) ) ||         \
+     ( ( (cache_ptr)->index_len == 1 ) &&                                 \
+       ( (cache_ptr)->index_size != (new_size) ) ) ||                     \
+     ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] >                   \
+       (cache_ptr)->index_len ) ||                                        \
+     ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] >                  \
+       (cache_ptr)->index_size ) ||                                       \
+     ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] !=                 \
+       ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] +           \
+        (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ) {      \
+    HDassert(FALSE);                                                      \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                              \
+                "Post HT entry size change SC failed")                    \
+}
 
-#define H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr) \
-	(cache_ptr)->total_ht_deletions++;
+#define H5C__PRE_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr)           \
+if (                                                                          \
+    ( (cache_ptr) == NULL ) ||                                                \
+    ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                             \
+    ( (cache_ptr)->index_len <= 0 ) ||                                        \
+    ( (entry_ptr) == NULL ) ||                                                \
+    ( (entry_ptr)->is_dirty != FALSE ) ||                                     \
+    ( (cache_ptr)->index_size < (entry_ptr)->size ) ||                        \
+    ( (cache_ptr)->dirty_index_size < (entry_ptr)->size ) ||                  \
+    ( (cache_ptr)->index_size !=                                              \
+       ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) ||   \
+    ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) ||          \
+    ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) ||          \
+    ( (entry_ptr)->ring <= H5C_RING_UNDEFINED ) ||                            \
+    ( (entry_ptr)->ring >= H5C_RING_NTYPES ) ||                               \
+    ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] <= 0 ) ||                \
+    ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] >                        \
+      (cache_ptr)->index_len ) ||                                             \
+    ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] >                       \
+      (cache_ptr)->index_size ) ||                                            \
+    ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] !=                      \
+      ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] +                \
+       (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ) {           \
+    HDassert(FALSE);                                                          \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                                  \
+                "Pre HT update for entry clean SC failed")                    \
+}
 
-#define H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, success, depth)  \
-	if ( success ) {                                            \
-	    (cache_ptr)->successful_ht_searches++;                  \
-	    (cache_ptr)->total_successful_ht_search_depth += depth; \
-	} else {                                                    \
-	    (cache_ptr)->failed_ht_searches++;                      \
-	    (cache_ptr)->total_failed_ht_search_depth += depth;     \
-	}
+#define H5C__PRE_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr)           \
+if (                                                                          \
+    ( (cache_ptr) == NULL ) ||                                                \
+    ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                             \
+    ( (cache_ptr)->index_len <= 0 ) ||                                        \
+    ( (entry_ptr) == NULL ) ||                                                \
+    ( (entry_ptr)->is_dirty != TRUE ) ||                                      \
+    ( (cache_ptr)->index_size < (entry_ptr)->size ) ||                        \
+    ( (cache_ptr)->clean_index_size < (entry_ptr)->size ) ||                  \
+    ( (cache_ptr)->index_size !=                                              \
+       ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) ||   \
+    ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) ||          \
+    ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) ||          \
+    ( (entry_ptr)->ring <= H5C_RING_UNDEFINED ) ||                            \
+    ( (entry_ptr)->ring >= H5C_RING_NTYPES ) ||                               \
+    ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] <= 0 ) ||                \
+    ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] >                        \
+      (cache_ptr)->index_len ) ||                                             \
+    ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] >                       \
+      (cache_ptr)->index_size ) ||                                            \
+    ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] !=                      \
+      ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] +                \
+       (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ) {           \
+    HDassert(FALSE);                                                          \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                                  \
+                "Pre HT update for entry dirty SC failed")                    \
+}
 
-#define H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr) \
-	((cache_ptr)->unpins)[(entry_ptr)->type->id]++;
+#define H5C__POST_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr)        \
+if ( ( (cache_ptr)->index_size !=                                           \
+       ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) || \
+     ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) ||       \
+     ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) ||       \
+     ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] >                     \
+       (cache_ptr)->index_len ) ||                                          \
+     ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] >                    \
+       (cache_ptr)->index_size ) ||                                         \
+     ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] !=                   \
+       ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] +             \
+        (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ) {        \
+    HDassert(FALSE);                                                        \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                                \
+                "Post HT update for entry clean SC failed")                 \
+}
 
-#if H5C_COLLECT_CACHE_ENTRY_STATS
+#define H5C__POST_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr)        \
+if ( ( (cache_ptr)->index_size !=                                           \
+       ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) || \
+     ( (cache_ptr)->index_size < ((cache_ptr)->clean_index_size) ) ||       \
+     ( (cache_ptr)->index_size < ((cache_ptr)->dirty_index_size) ) ||       \
+     ( (cache_ptr)->index_ring_len[(entry_ptr)->ring] >                     \
+       (cache_ptr)->index_len ) ||                                          \
+     ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] >                    \
+       (cache_ptr)->index_size ) ||                                         \
+     ( (cache_ptr)->index_ring_size[(entry_ptr)->ring] !=                   \
+       ((cache_ptr)->clean_index_ring_size[(entry_ptr)->ring] +             \
+        (cache_ptr)->dirty_index_ring_size[(entry_ptr)->ring]) ) ) {        \
+    HDassert(FALSE);                                                        \
+    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                                \
+                "Post HT update for entry dirty SC failed")                 \
+}
 
-#define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr) \
-        (entry_ptr)->accesses = 0;              \
-        (entry_ptr)->clears   = 0;              \
-        (entry_ptr)->flushes  = 0;              \
-	(entry_ptr)->pins     = 0;
-
-#define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr)            \
-	(((cache_ptr)->clears)[(entry_ptr)->type->id])++;            \
-        if ( (entry_ptr)->is_pinned ) {                              \
-	    (((cache_ptr)->pinned_clears)[(entry_ptr)->type->id])++; \
-	}                                                            \
-        ((entry_ptr)->clears)++;
-
-#define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr)             \
-	(((cache_ptr)->flushes)[(entry_ptr)->type->id])++;            \
-        if ( (entry_ptr)->is_pinned ) {                               \
-	    (((cache_ptr)->pinned_flushes)[(entry_ptr)->type->id])++; \
-	}                                                             \
-        ((entry_ptr)->flushes)++;
-
-#define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr)        \
-	(((cache_ptr)->evictions)[(entry_ptr)->type->id])++;        \
-        if ( (entry_ptr)->accesses >                                \
-             ((cache_ptr)->max_accesses)[(entry_ptr)->type->id] ) { \
-            ((cache_ptr)->max_accesses)[(entry_ptr)->type->id]      \
-                = (entry_ptr)->accesses;                            \
-        }                                                           \
-        if ( (entry_ptr)->accesses <                                \
-             ((cache_ptr)->min_accesses)[(entry_ptr)->type->id] ) { \
-            ((cache_ptr)->min_accesses)[(entry_ptr)->type->id]      \
-                = (entry_ptr)->accesses;                            \
-        }                                                           \
-        if ( (entry_ptr)->clears >                                  \
-             ((cache_ptr)->max_clears)[(entry_ptr)->type->id] ) {   \
-            ((cache_ptr)->max_clears)[(entry_ptr)->type->id]        \
-                 = (entry_ptr)->clears;                             \
-        }                                                           \
-        if ( (entry_ptr)->flushes >                                 \
-             ((cache_ptr)->max_flushes)[(entry_ptr)->type->id] ) {  \
-            ((cache_ptr)->max_flushes)[(entry_ptr)->type->id]       \
-                 = (entry_ptr)->flushes;                            \
-        }                                                           \
-        if ( (entry_ptr)->size >                                    \
-             ((cache_ptr)->max_size)[(entry_ptr)->type->id] ) {     \
-            ((cache_ptr)->max_size)[(entry_ptr)->type->id]          \
-                 = (entry_ptr)->size;                               \
-        }                                                           \
-        if ( (entry_ptr)->pins >                                    \
-             ((cache_ptr)->max_pins)[(entry_ptr)->type->id] ) {     \
-            ((cache_ptr)->max_pins)[(entry_ptr)->type->id]          \
-                 = (entry_ptr)->pins;                               \
-        }
-
-#define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr)            \
-	(((cache_ptr)->insertions)[(entry_ptr)->type->id])++;            \
-	if ( (entry_ptr)->is_pinned ) {                                  \
-	    (((cache_ptr)->pinned_insertions)[(entry_ptr)->type->id])++; \
-	    ((cache_ptr)->pins)[(entry_ptr)->type->id]++;                \
-            (entry_ptr)->pins++;                                         \
-	    if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len )       \
-	        (cache_ptr)->max_pel_len = (cache_ptr)->pel_len;         \
-	    if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size )     \
-	        (cache_ptr)->max_pel_size = (cache_ptr)->pel_size;       \
-	}                                                                \
-        if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len )       \
-	    (cache_ptr)->max_index_len = (cache_ptr)->index_len;         \
-        H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr)                      \
-        if ( (cache_ptr)->slist_len > (cache_ptr)->max_slist_len )       \
-	    (cache_ptr)->max_slist_len = (cache_ptr)->slist_len;         \
-        if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size )     \
-	    (cache_ptr)->max_slist_size = (cache_ptr)->slist_size;       \
-        if ( (entry_ptr)->size >                                         \
-             ((cache_ptr)->max_size)[(entry_ptr)->type->id] ) {          \
-            ((cache_ptr)->max_size)[(entry_ptr)->type->id]               \
-                 = (entry_ptr)->size;                                    \
-        }
-
-#define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit)             \
-	if ( hit )                                                           \
-            ((cache_ptr)->hits)[(entry_ptr)->type->id]++;                    \
-	else                                                                 \
-            ((cache_ptr)->misses)[(entry_ptr)->type->id]++;                  \
-        if ( ! ((entry_ptr)->is_read_only) ) {                               \
-	    ((cache_ptr)->write_protects)[(entry_ptr)->type->id]++;          \
-	} else {                                                             \
-	    ((cache_ptr)->read_protects)[(entry_ptr)->type->id]++;           \
-	    if ( ((entry_ptr)->ro_ref_count) >                               \
-		 ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] ) { \
-	        ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] =    \
-			((entry_ptr)->ro_ref_count);                         \
-	    }                                                                \
-	}                                                                    \
-        if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len )           \
-            (cache_ptr)->max_index_len = (cache_ptr)->index_len;             \
-        H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr)                          \
-        if ( (cache_ptr)->pl_len > (cache_ptr)->max_pl_len )                 \
-            (cache_ptr)->max_pl_len = (cache_ptr)->pl_len;                   \
-        if ( (cache_ptr)->pl_size > (cache_ptr)->max_pl_size )               \
-            (cache_ptr)->max_pl_size = (cache_ptr)->pl_size;                 \
-        if ( (entry_ptr)->size >                                             \
-             ((cache_ptr)->max_size)[(entry_ptr)->type->id] ) {              \
-            ((cache_ptr)->max_size)[(entry_ptr)->type->id]                   \
-                 = (entry_ptr)->size;                                        \
-        }                                                                    \
-        ((entry_ptr)->accesses)++;
-
-#define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr)          \
-	((cache_ptr)->pins)[(entry_ptr)->type->id]++;            \
-        (entry_ptr)->pins++;                                     \
-	if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len )   \
-	    (cache_ptr)->max_pel_len = (cache_ptr)->pel_len;     \
-	if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \
-	    (cache_ptr)->max_pel_size = (cache_ptr)->pel_size;
+#else /* H5C_DO_SANITY_CHECKS */
 
-#else /* H5C_COLLECT_CACHE_ENTRY_STATS */
+#define H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val)
+#define H5C__POST_HT_INSERT_SC(cache_ptr, fail_val)
+#define H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr)
+#define H5C__POST_HT_REMOVE_SC(cache_ptr, entry_ptr)
+#define H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val)
+#define H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k, fail_val)
+#define H5C__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val)
+#define H5C__PRE_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr)
+#define H5C__PRE_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr)
+#define H5C__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
+		                         entry_ptr, was_clean)
+#define H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
+		                          entry_ptr)
+#define H5C__POST_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr)
+#define H5C__POST_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr)
 
-#define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr)
+#endif /* H5C_DO_SANITY_CHECKS */
 
-#define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr)             \
-        if ( (entry_ptr)->is_pinned ) {                               \
-	    (((cache_ptr)->pinned_clears)[(entry_ptr)->type->id])++;  \
-	}                                                             \
-	(((cache_ptr)->clears)[(entry_ptr)->type->id])++;
 
-#define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr)             \
-	(((cache_ptr)->flushes)[(entry_ptr)->type->id])++;            \
-        if ( (entry_ptr)->is_pinned ) {                               \
-	    (((cache_ptr)->pinned_flushes)[(entry_ptr)->type->id])++; \
-	}
+#define H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, fail_val)  \
+{                                                             \
+    int k;                                                    \
+    H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val)     \
+    k = H5C__HASH_FCN((entry_ptr)->addr);                     \
+    if ( ((cache_ptr)->index)[k] == NULL )                    \
+        ((cache_ptr)->index)[k] = (entry_ptr);                \
+    else {                                                    \
+        (entry_ptr)->ht_next = ((cache_ptr)->index)[k];       \
+        (entry_ptr)->ht_next->ht_prev = (entry_ptr);          \
+        ((cache_ptr)->index)[k] = (entry_ptr);                \
+    }                                                         \
+    (cache_ptr)->index_len++;                                 \
+    (cache_ptr)->index_size += (entry_ptr)->size;             \
+    ((cache_ptr)->index_ring_len[entry_ptr->ring])++;         \
+    ((cache_ptr)->index_ring_size[entry_ptr->ring])           \
+	+= (entry_ptr)->size;                                 \
+    if ( (entry_ptr)->is_dirty ) {                            \
+        (cache_ptr)->dirty_index_size += (entry_ptr)->size;   \
+        ((cache_ptr)->dirty_index_ring_size[entry_ptr->ring]) \
+		+= (entry_ptr)->size;                         \
+    } else {                                                  \
+	(cache_ptr)->clean_index_size += (entry_ptr)->size;   \
+        ((cache_ptr)->clean_index_ring_size[entry_ptr->ring]) \
+		+= (entry_ptr)->size;                         \
+    }                                                         \
+    if ((entry_ptr)->flush_me_last) {                         \
+        (cache_ptr)->num_last_entries++;                      \
+        HDassert((cache_ptr)->num_last_entries <= 2);         \
+    }                                                         \
+    H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr)             \
+    H5C__POST_HT_INSERT_SC(cache_ptr, fail_val)               \
+}
 
-#define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr) \
-	(((cache_ptr)->evictions)[(entry_ptr)->type->id])++;
-
-#define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr)            \
-	(((cache_ptr)->insertions)[(entry_ptr)->type->id])++;            \
-	if ( (entry_ptr)->is_pinned ) {                                  \
-	    (((cache_ptr)->pinned_insertions)[(entry_ptr)->type->id])++; \
-	    ((cache_ptr)->pins)[(entry_ptr)->type->id]++;                \
-	    if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len )       \
-	        (cache_ptr)->max_pel_len = (cache_ptr)->pel_len;         \
-	    if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size )     \
-	        (cache_ptr)->max_pel_size = (cache_ptr)->pel_size;       \
-	}                                                                \
-        if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len )       \
-	    (cache_ptr)->max_index_len = (cache_ptr)->index_len;         \
-        H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr)                      \
-        if ( (cache_ptr)->slist_len > (cache_ptr)->max_slist_len )       \
-	    (cache_ptr)->max_slist_len = (cache_ptr)->slist_len;         \
-        if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size )     \
-	    (cache_ptr)->max_slist_size = (cache_ptr)->slist_size;
-
-#define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit)             \
-	if ( hit )                                                           \
-            ((cache_ptr)->hits)[(entry_ptr)->type->id]++;                    \
-	else                                                                 \
-            ((cache_ptr)->misses)[(entry_ptr)->type->id]++;                  \
-        if ( ! ((entry_ptr)->is_read_only) ) {                               \
-	    ((cache_ptr)->write_protects)[(entry_ptr)->type->id]++;          \
-	} else {                                                             \
-	    ((cache_ptr)->read_protects)[(entry_ptr)->type->id]++;           \
-	    if ( ((entry_ptr)->ro_ref_count) >                               \
-		 ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] ) { \
-	        ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] =    \
-			((entry_ptr)->ro_ref_count);                         \
-	    }                                                                \
-	}                                                                    \
-        if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len )           \
-            (cache_ptr)->max_index_len = (cache_ptr)->index_len;             \
-        H5C__UPDATE_MAX_INDEX_SIZE_STATS(cache_ptr)                          \
-        if ( (cache_ptr)->pl_len > (cache_ptr)->max_pl_len )                 \
-            (cache_ptr)->max_pl_len = (cache_ptr)->pl_len;                   \
-        if ( (cache_ptr)->pl_size > (cache_ptr)->max_pl_size )               \
-            (cache_ptr)->max_pl_size = (cache_ptr)->pl_size;
-
-#define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr)          \
-	((cache_ptr)->pins)[(entry_ptr)->type->id]++;            \
-	if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len )   \
-	    (cache_ptr)->max_pel_len = (cache_ptr)->pel_len;     \
-	if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \
-	    (cache_ptr)->max_pel_size = (cache_ptr)->pel_size;
+#define H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr)          \
+{                                                             \
+    int k;                                                    \
+    H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr)               \
+    k = H5C__HASH_FCN((entry_ptr)->addr);                     \
+    if ( (entry_ptr)->ht_next )                               \
+        (entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev; \
+    if ( (entry_ptr)->ht_prev )                               \
+        (entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next; \
+    if ( ((cache_ptr)->index)[k] == (entry_ptr) )             \
+        ((cache_ptr)->index)[k] = (entry_ptr)->ht_next;       \
+    (entry_ptr)->ht_next = NULL;                              \
+    (entry_ptr)->ht_prev = NULL;                              \
+    (cache_ptr)->index_len--;                                 \
+    (cache_ptr)->index_size -= (entry_ptr)->size;             \
+    ((cache_ptr)->index_ring_len[entry_ptr->ring])--;         \
+    ((cache_ptr)->index_ring_size[entry_ptr->ring])           \
+	-= (entry_ptr)->size;                                 \
+    if ( (entry_ptr)->is_dirty ) {                            \
+        (cache_ptr)->dirty_index_size -= (entry_ptr)->size;   \
+        ((cache_ptr)->dirty_index_ring_size[entry_ptr->ring]) \
+		-= (entry_ptr)->size;                         \
+    } else {                                                  \
+	(cache_ptr)->clean_index_size -= (entry_ptr)->size;   \
+        ((cache_ptr)->clean_index_ring_size[entry_ptr->ring]) \
+		-= (entry_ptr)->size;                         \
+    }                                                         \
+    if ((entry_ptr)->flush_me_last) {                         \
+        (cache_ptr)->num_last_entries--;                      \
+        HDassert((cache_ptr)->num_last_entries <= 1);         \
+    }                                                         \
+    H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr)              \
+    H5C__POST_HT_REMOVE_SC(cache_ptr, entry_ptr)              \
+}
 
-#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+#define H5C__SEARCH_INDEX(cache_ptr, Addr, entry_ptr, fail_val)             \
+{                                                                           \
+    int k;                                                                  \
+    int depth = 0;                                                          \
+    H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val)                        \
+    k = H5C__HASH_FCN(Addr);                                                \
+    entry_ptr = ((cache_ptr)->index)[k];                                    \
+    while ( ( entry_ptr ) && ( H5F_addr_ne(Addr, (entry_ptr)->addr) ) ) {   \
+        (entry_ptr) = (entry_ptr)->ht_next;                                 \
+        (depth)++;                                                          \
+    }                                                                       \
+    if ( entry_ptr ) {                                                      \
+        H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k, fail_val) \
+        if ( entry_ptr != ((cache_ptr)->index)[k] ) {                       \
+            if ( (entry_ptr)->ht_next )                                     \
+                (entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev;       \
+            HDassert( (entry_ptr)->ht_prev != NULL );                       \
+            (entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next;           \
+            ((cache_ptr)->index)[k]->ht_prev = (entry_ptr);                 \
+            (entry_ptr)->ht_next = ((cache_ptr)->index)[k];                 \
+            (entry_ptr)->ht_prev = NULL;                                    \
+            ((cache_ptr)->index)[k] = (entry_ptr);                          \
+            H5C__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val)  \
+        }                                                                   \
+    }                                                                       \
+    H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, (entry_ptr != NULL), depth)  \
+}
 
-#else /* H5C_COLLECT_CACHE_STATS */
+#define H5C__SEARCH_INDEX_NO_STATS(cache_ptr, Addr, entry_ptr, fail_val)    \
+{                                                                           \
+    int k;                                                                  \
+    int depth = 0;                                                          \
+    H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val)                        \
+    k = H5C__HASH_FCN(Addr);                                                \
+    entry_ptr = ((cache_ptr)->index)[k];                                    \
+    while ( ( entry_ptr ) && ( H5F_addr_ne(Addr, (entry_ptr)->addr) ) ) {   \
+        (entry_ptr) = (entry_ptr)->ht_next;                                 \
+        (depth)++;                                                          \
+    }                                                                       \
+    if ( entry_ptr ) {                                                      \
+        H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k, fail_val) \
+        if ( entry_ptr != ((cache_ptr)->index)[k] ) {                       \
+            if ( (entry_ptr)->ht_next )                                     \
+                (entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev;       \
+            HDassert( (entry_ptr)->ht_prev != NULL );                       \
+            (entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next;           \
+            ((cache_ptr)->index)[k]->ht_prev = (entry_ptr);                 \
+            (entry_ptr)->ht_next = ((cache_ptr)->index)[k];                 \
+            (entry_ptr)->ht_prev = NULL;                                    \
+            ((cache_ptr)->index)[k] = (entry_ptr);                          \
+            H5C__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val)  \
+        }                                                                   \
+    }                                                                       \
+}
 
-#define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr)
-#define H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr)
-#define H5C__UPDATE_STATS_FOR_UNPROTECT(cache_ptr)
-#define H5C__UPDATE_STATS_FOR_MOVE(cache_ptr, entry_ptr)
-#define H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, entry_ptr, new_size)
-#define H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr)
-#define H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr)
-#define H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, success, depth)
-#define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr)
-#define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr)
-#define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr)
-#define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr)
-#define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit)
-#define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr)
-#define H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr)
+#define H5C__UPDATE_INDEX_FOR_ENTRY_CLEAN(cache_ptr, entry_ptr)   \
+{                                                                 \
+    H5C__PRE_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr);  \
+    (cache_ptr)->dirty_index_size -= (entry_ptr)->size;           \
+    ((cache_ptr)->dirty_index_ring_size[entry_ptr->ring])         \
+		-= (entry_ptr)->size;                             \
+    (cache_ptr)->clean_index_size += (entry_ptr)->size;           \
+    ((cache_ptr)->clean_index_ring_size[entry_ptr->ring])         \
+		+= (entry_ptr)->size;                             \
+    H5C__POST_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr); \
+}
+
+#define H5C__UPDATE_INDEX_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr)   \
+{                                                                 \
+    H5C__PRE_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr);  \
+    (cache_ptr)->clean_index_size -= (entry_ptr)->size;           \
+    ((cache_ptr)->clean_index_ring_size[entry_ptr->ring])         \
+		-= (entry_ptr)->size;                             \
+    (cache_ptr)->dirty_index_size += (entry_ptr)->size;           \
+    ((cache_ptr)->dirty_index_ring_size[entry_ptr->ring])         \
+		+= (entry_ptr)->size;                             \
+    H5C__POST_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr); \
+}
 
-#endif /* H5C_COLLECT_CACHE_STATS */
+#define H5C__UPDATE_INDEX_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size,    \
+		                          entry_ptr, was_clean)             \
+{                                                                           \
+    H5C__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size,         \
+		                     entry_ptr, was_clean)                  \
+    (cache_ptr)->index_size -= (old_size);                                  \
+    (cache_ptr)->index_size += (new_size);                                  \
+    ((cache_ptr)->index_ring_size[entry_ptr->ring]) -= (old_size);          \
+    ((cache_ptr)->index_ring_size[entry_ptr->ring]) += (new_size);          \
+    if ( was_clean ) {                                                      \
+        (cache_ptr)->clean_index_size -= (old_size);                        \
+        ((cache_ptr)->clean_index_ring_size[entry_ptr->ring])-= (old_size); \
+    } else {                                                                \
+	(cache_ptr)->dirty_index_size -= (old_size);                        \
+        ((cache_ptr)->dirty_index_ring_size[entry_ptr->ring])-= (old_size); \
+    }                                                                       \
+    if ( (entry_ptr)->is_dirty ) {                                          \
+        (cache_ptr)->dirty_index_size += (new_size);                        \
+        ((cache_ptr)->dirty_index_ring_size[entry_ptr->ring])+= (new_size); \
+    } else {                                                                \
+	(cache_ptr)->clean_index_size += (new_size);                        \
+        ((cache_ptr)->clean_index_ring_size[entry_ptr->ring])+= (new_size); \
+    }                                                                       \
+    H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size,        \
+                                      entry_ptr)                            \
+}
 
 

-/***********************************************************************
+/**************************************************************************
  *
- * Hash table access and manipulation macros:
+ * Skip list insertion and deletion macros:
  *
- * The following macros handle searches, insertions, and deletion in
- * the hash table.
+ * These used to be functions, but I converted them to macros to avoid some
+ * function call overhead.
  *
- * When modifying these macros, remember to modify the similar macros
- * in tst/cache.c
+ **************************************************************************/
+
+/*-------------------------------------------------------------------------
  *
- * Changes:
+ * Macro:	H5C__INSERT_ENTRY_IN_SLIST
  *
- *   - Updated existing index macros and sanity check macros to maintain
- *     the clean_index_size and dirty_index_size fields of H5C_t.  Also
- *     added macros to allow us to track entry cleans and dirties.
+ * Purpose:     Insert the specified instance of H5C_cache_entry_t into
+ *		the skip list in the specified instance of H5C_t.  Update
+ *		the associated length and size fields.
  *
- *     						JRM -- 11/5/08
+ * Return:      N/A
  *
- ***********************************************************************/
-
-/* H5C__HASH_TABLE_LEN is defined in H5Cpkg.h.  It mut be a power of two. */
-
-#define H5C__HASH_MASK		((size_t)(H5C__HASH_TABLE_LEN - 1) << 3)
+ * Programmer:  John Mainzer, 5/10/04
+ *
+ * Modifications:
+ *
+ *		JRM -- 7/21/04
+ *		Updated function to set the in_tree flag when inserting
+ *		an entry into the tree.  Also modified the function to
+ *		update the tree size and len fields instead of the similar
+ *		index fields.
+ *
+ *		All of this is part of the modifications to support the
+ *		hash table.
+ *
+ *		JRM -- 7/27/04
+ *		Converted the function H5C_insert_entry_in_tree() into
+ *		the macro H5C__INSERT_ENTRY_IN_TREE in the hopes of
+ *		wringing a little more speed out of the cache.
+ *
+ *		Note that we don't bother to check if the entry is already
+ *		in the tree -- if it is, H5SL_insert() will fail.
+ *
+ *		QAK -- 11/27/04
+ *		Switched over to using skip list routines.
+ *
+ *		JRM -- 6/27/06
+ *		Added fail_val parameter.
+ *
+ *		JRM -- 8/25/06
+ *		Added the H5C_DO_SANITY_CHECKS version of the macro.
+ *
+ *		This version maintains the slist_len_increase and
+ *		slist_size_increase fields that are used in sanity
+ *		checks in the flush routines.
+ *
+ *		All this is needed as the fractal heap needs to be
+ *		able to dirty, resize and/or move entries during the
+ *		flush.
+ *
+ *		JRM -- 12/13/14
+ *		Added code to set cache_ptr->slist_changed to TRUE 
+ *		when an entry is inserted in the slist.
+ *
+ *		JRM -- 9/1/15
+ *		Added code to maintain the cache_ptr->slist_ring_len
+ *		and cache_ptr->slist_ring_size arrays.
+ *
+ *-------------------------------------------------------------------------
+ */
 
-#define H5C__HASH_FCN(x)	(int)(((x) & H5C__HASH_MASK) >> 3)
+#if H5C_DO_SLIST_SANITY_CHECKS
+#define ENTRY_IN_SLIST(cache_ptr, entry_ptr) \
+    H5C_entry_in_skip_list((cache_ptr), (entry_ptr))
+#else /* H5C_DO_SLIST_SANITY_CHECKS */
+#define ENTRY_IN_SLIST(cache_ptr, entry_ptr) FALSE
+#endif /* H5C_DO_SLIST_SANITY_CHECKS */
 
 #if H5C_DO_SANITY_CHECKS
 
-#define H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val) \
-if ( ( (cache_ptr) == NULL ) ||                               \
-     ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||            \
-     ( (entry_ptr) == NULL ) ||                               \
-     ( ! H5F_addr_defined((entry_ptr)->addr) ) ||             \
-     ( (entry_ptr)->ht_next != NULL ) ||                      \
-     ( (entry_ptr)->ht_prev != NULL ) ||                      \
-     ( (entry_ptr)->size <= 0 ) ||                            \
-     ( (k = H5C__HASH_FCN((entry_ptr)->addr)) < 0 ) ||        \
-     ( k >= H5C__HASH_TABLE_LEN ) ||                          \
-     ( (cache_ptr)->index_size !=                             \
-       ((cache_ptr)->clean_index_size +                       \
-	(cache_ptr)->dirty_index_size) ) ) {                  \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val,              \
-               "Pre HT insert SC failed")                     \
-}
-
-#define H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr)                     \
-if ( ( (cache_ptr) == NULL ) ||                                         \
-     ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                      \
-     ( (cache_ptr)->index_len < 1 ) ||                                  \
-     ( (entry_ptr) == NULL ) ||                                         \
-     ( (cache_ptr)->index_size < (entry_ptr)->size ) ||                 \
-     ( ! H5F_addr_defined((entry_ptr)->addr) ) ||                       \
-     ( (entry_ptr)->size <= 0 ) ||                                      \
-     ( H5C__HASH_FCN((entry_ptr)->addr) < 0 ) ||                        \
-     ( H5C__HASH_FCN((entry_ptr)->addr) >= H5C__HASH_TABLE_LEN ) ||     \
-     ( ((cache_ptr)->index)[(H5C__HASH_FCN((entry_ptr)->addr))]         \
-       == NULL ) ||                                                     \
-     ( ( ((cache_ptr)->index)[(H5C__HASH_FCN((entry_ptr)->addr))]       \
-       != (entry_ptr) ) &&                                              \
-       ( (entry_ptr)->ht_prev == NULL ) ) ||                            \
-     ( ( ((cache_ptr)->index)[(H5C__HASH_FCN((entry_ptr)->addr))] ==    \
-         (entry_ptr) ) &&                                               \
-       ( (entry_ptr)->ht_prev != NULL ) ) ||                            \
-     ( (cache_ptr)->index_size !=                                       \
-       ((cache_ptr)->clean_index_size +                                 \
-	(cache_ptr)->dirty_index_size) ) ) {                            \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Pre HT remove SC failed") \
-}
-
-/* (Keep in sync w/H5C_TEST__PRE_HT_SEARCH_SC macro in test/cache_common.h -QAK) */
-#define H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val)                    \
-if ( ( (cache_ptr) == NULL ) ||                                             \
-     ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                          \
-     ( (cache_ptr)->index_size !=                                           \
-       ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) || \
-     ( ! H5F_addr_defined(Addr) ) ||                                        \
-     ( H5C__HASH_FCN(Addr) < 0 ) ||                                         \
-     ( H5C__HASH_FCN(Addr) >= H5C__HASH_TABLE_LEN ) ) {                     \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "Pre HT search SC failed") \
-}
+#define H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, fail_val)             \
+{                                                                              \
+    HDassert( (cache_ptr) );                                                   \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                        \
+    HDassert( (entry_ptr) );                                                   \
+    HDassert( (entry_ptr)->size > 0 );                                         \
+    HDassert( H5F_addr_defined((entry_ptr)->addr) );                           \
+    HDassert( !((entry_ptr)->in_slist) );                                      \
+    HDassert( !ENTRY_IN_SLIST((cache_ptr), (entry_ptr)) );                     \
+    HDassert( (entry_ptr)->ring > H5C_RING_UNDEFINED );                        \
+    HDassert( (entry_ptr)->ring < H5C_RING_NTYPES );                           \
+    HDassert( (cache_ptr)->slist_ring_len[(entry_ptr)->ring] <=                \
+              (cache_ptr)->slist_len );                                        \
+    HDassert( (cache_ptr)->slist_ring_size[(entry_ptr)->ring] <=               \
+              (cache_ptr)->slist_size );                                       \
+                                                                               \
+    if(H5SL_insert((cache_ptr)->slist_ptr, entry_ptr, &(entry_ptr)->addr) < 0) \
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, (fail_val),                       \
+                    "Can't insert entry in skip list")                         \
+                                                                               \
+    (entry_ptr)->in_slist = TRUE;                                              \
+    (cache_ptr)->slist_changed = TRUE;                                         \
+    (cache_ptr)->slist_len++;                                                  \
+    (cache_ptr)->slist_size += (entry_ptr)->size;                              \
+    ((cache_ptr)->slist_ring_len[(entry_ptr)->ring])++;                        \
+    ((cache_ptr)->slist_ring_size[(entry_ptr)->ring]) += (entry_ptr)->size;    \
+    (cache_ptr)->slist_len_increase++;                                         \
+    (cache_ptr)->slist_size_increase += (int64_t)((entry_ptr)->size);          \
+                                                                               \
+    HDassert( (cache_ptr)->slist_len > 0 );                                    \
+    HDassert( (cache_ptr)->slist_size > 0 );                                   \
+                                                                               \
+} /* H5C__INSERT_ENTRY_IN_SLIST */
 
-/* (Keep in sync w/H5C_TEST__POST_SUC_HT_SEARCH_SC macro in test/cache_common.h -QAK) */
-#define H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k, fail_val) \
-if ( ( (cache_ptr) == NULL ) ||                                             \
-     ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                          \
-     ( (cache_ptr)->index_len < 1 ) ||                                      \
-     ( (entry_ptr) == NULL ) ||                                             \
-     ( (cache_ptr)->index_size < (entry_ptr)->size ) ||                     \
-     ( (cache_ptr)->index_size !=                                           \
-       ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) || \
-     ( H5F_addr_ne((entry_ptr)->addr, (Addr)) ) ||                          \
-     ( (entry_ptr)->size <= 0 ) ||                                          \
-     ( ((cache_ptr)->index)[k] == NULL ) ||                                 \
-     ( ( ((cache_ptr)->index)[k] != (entry_ptr) ) &&                        \
-       ( (entry_ptr)->ht_prev == NULL ) ) ||                                \
-     ( ( ((cache_ptr)->index)[k] == (entry_ptr) ) &&                        \
-       ( (entry_ptr)->ht_prev != NULL ) ) ||                                \
-     ( ( (entry_ptr)->ht_prev != NULL ) &&                                  \
-       ( (entry_ptr)->ht_prev->ht_next != (entry_ptr) ) ) ||                \
-     ( ( (entry_ptr)->ht_next != NULL ) &&                                  \
-       ( (entry_ptr)->ht_next->ht_prev != (entry_ptr) ) ) ) {               \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val,                            \
-                "Post successful HT search SC failed")                      \
-}
+#else /* H5C_DO_SANITY_CHECKS */
 
-/* (Keep in sync w/H5C_TEST__POST_HT_SHIFT_TO_FRONT macro in test/cache_common.h -QAK) */
-#define H5C__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val) \
-if ( ( (cache_ptr) == NULL ) ||                                        \
-     ( ((cache_ptr)->index)[k] != (entry_ptr) ) ||                     \
-     ( (entry_ptr)->ht_prev != NULL ) ) {                              \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val,                       \
-                "Post HT shift to front SC failed")                    \
-}
+#define H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, fail_val)             \
+{                                                                              \
+    HDassert( (cache_ptr) );                                                   \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                        \
+    HDassert( (entry_ptr) );                                                   \
+    HDassert( (entry_ptr)->size > 0 );                                         \
+    HDassert( H5F_addr_defined((entry_ptr)->addr) );                           \
+    HDassert( !((entry_ptr)->in_slist) );                                      \
+    HDassert( !ENTRY_IN_SLIST((cache_ptr), (entry_ptr)) );                     \
+    HDassert( (entry_ptr)->ring > H5C_RING_UNDEFINED );                        \
+    HDassert( (entry_ptr)->ring < H5C_RING_NTYPES );                           \
+    HDassert( (cache_ptr)->slist_ring_len[(entry_ptr)->ring] <=                \
+              (cache_ptr)->slist_len );                                        \
+    HDassert( (cache_ptr)->slist_ring_size[(entry_ptr)->ring] <=               \
+              (cache_ptr)->slist_size );                                       \
+                                                                               \
+    if(H5SL_insert((cache_ptr)->slist_ptr, entry_ptr, &(entry_ptr)->addr) < 0) \
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, (fail_val),                       \
+                    "Can't insert entry in skip list")                         \
+                                                                               \
+    (entry_ptr)->in_slist = TRUE;                                              \
+    (cache_ptr)->slist_changed = TRUE;                                         \
+    (cache_ptr)->slist_len++;                                                  \
+    (cache_ptr)->slist_size += (entry_ptr)->size;                              \
+    ((cache_ptr)->slist_ring_len[(entry_ptr)->ring])++;                        \
+    ((cache_ptr)->slist_ring_size[(entry_ptr)->ring]) += (entry_ptr)->size;    \
+                                                                               \
+    HDassert( (cache_ptr)->slist_len > 0 );                                    \
+    HDassert( (cache_ptr)->slist_size > 0 );                                   \
+                                                                               \
+} /* H5C__INSERT_ENTRY_IN_SLIST */
 
-#define H5C__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
-		                         entry_ptr, was_clean)          \
-if ( ( (cache_ptr) == NULL ) ||                                         \
-     ( (cache_ptr)->index_len <= 0 ) ||                                 \
-     ( (cache_ptr)->index_size <= 0 ) ||                                \
-     ( (new_size) <= 0 ) ||                                             \
-     ( (old_size) > (cache_ptr)->index_size ) ||                        \
-     ( (new_size) <= 0 ) ||                                             \
-     ( ( (cache_ptr)->index_len == 1 ) &&                               \
-       ( (cache_ptr)->index_size != (old_size) ) ) ||                   \
-     ( (cache_ptr)->index_size !=                                       \
-       ((cache_ptr)->clean_index_size +                                 \
-        (cache_ptr)->dirty_index_size) ) ||                             \
-     ( (entry_ptr == NULL) ) ||                                         \
-     ( ( !( was_clean ) ||                                              \
-	    ( (cache_ptr)->clean_index_size < (old_size) ) ) &&         \
-	  ( ( (was_clean) ) ||                                          \
-	    ( (cache_ptr)->dirty_index_size < (old_size) ) ) ) ||       \
-     ( (entry_ptr) == NULL ) ) {                                        \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                            \
-                "Pre HT entry size change SC failed")                   \
-}
+#endif /* H5C_DO_SANITY_CHECKS */
 
-#define H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size,  \
-		                          entry_ptr)                      \
-if ( ( (cache_ptr) == NULL ) ||                                           \
-     ( (cache_ptr)->index_len <= 0 ) ||                                   \
-     ( (cache_ptr)->index_size <= 0 ) ||                                  \
-     ( (new_size) > (cache_ptr)->index_size ) ||                          \
-     ( (cache_ptr)->index_size !=                                         \
-	  ((cache_ptr)->clean_index_size +                                \
-           (cache_ptr)->dirty_index_size) ) ||                            \
-     ( ( !((entry_ptr)->is_dirty ) ||                                     \
-	    ( (cache_ptr)->dirty_index_size < (new_size) ) ) &&           \
-	  ( ( ((entry_ptr)->is_dirty)  ) ||                               \
-	    ( (cache_ptr)->clean_index_size < (new_size) ) ) ) ||         \
-     ( ( (cache_ptr)->index_len == 1 ) &&                                 \
-       ( (cache_ptr)->index_size != (new_size) ) ) ) {                    \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                              \
-                "Post HT entry size change SC failed")                    \
-}
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C__REMOVE_ENTRY_FROM_SLIST
+ *
+ * Purpose:     Remove the specified instance of H5C_cache_entry_t from the
+ *		index skip list in the specified instance of H5C_t.  Update
+ *		the associated length and size fields.
+ *
+ * Return:      N/A
+ *
+ * Programmer:  John Mainzer, 5/10/04
+ *
+ * Modifications:
+ *
+ *		JRM -- 7/21/04
+ *		Updated function for the addition of the hash table.
+ *
+ *		JRM - 7/27/04
+ *		Converted from the function H5C_remove_entry_from_tree()
+ *		to the macro H5C__REMOVE_ENTRY_FROM_TREE in the hopes of
+ *		wringing a little more performance out of the cache.
+ *
+ *		QAK -- 11/27/04
+ *		Switched over to using skip list routines.
+ *
+ *		JRM -- 3/28/07
+ *		Updated sanity checks for the new is_read_only and
+ *		ro_ref_count fields in H5C_cache_entry_t.
+ *
+ *		JRM -- 12/13/14
+ *		Added code to set cache_ptr->slist_changed to TRUE 
+ *		when an entry is removed from the slist.
+ *
+ *		JRM -- 9/1/15
+ *		Added code to maintain the cache_ptr->slist_ring_len
+ *		and cache_ptr->slist_ring_size arrays.
+ *
+ *-------------------------------------------------------------------------
+ */
 
-#define H5C__PRE_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr)           \
-if (                                                                          \
-    ( (cache_ptr) == NULL ) ||                                                \
-    ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                             \
-    ( (cache_ptr)->index_len <= 0 ) ||                                        \
-    ( (entry_ptr) == NULL ) ||                                                \
-    ( (entry_ptr)->is_dirty != FALSE ) ||                                     \
-    ( (cache_ptr)->index_size < (entry_ptr)->size ) ||                        \
-    ( (cache_ptr)->dirty_index_size < (entry_ptr)->size ) ||                  \
-    ( (cache_ptr)->index_size !=                                              \
-       ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) ) {  \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                                  \
-                "Pre HT update for entry clean SC failed")                    \
-}
+#define H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr)                  \
+{                                                                           \
+    HDassert( (cache_ptr) );                                                \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                     \
+    HDassert( (entry_ptr) );                                                \
+    HDassert( !((entry_ptr)->is_protected) );                               \
+    HDassert( !((entry_ptr)->is_read_only) );                               \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                           \
+    HDassert( (entry_ptr)->size > 0 );                                      \
+    HDassert( (entry_ptr)->in_slist );                                      \
+    HDassert( (cache_ptr)->slist_ptr );                                     \
+    HDassert( (entry_ptr)->ring > H5C_RING_UNDEFINED );                     \
+    HDassert( (entry_ptr)->ring < H5C_RING_NTYPES );                        \
+    HDassert( (cache_ptr)->slist_ring_len[(entry_ptr)->ring] <=             \
+              (cache_ptr)->slist_len );                                     \
+    HDassert( (cache_ptr)->slist_ring_size[(entry_ptr)->ring] <=            \
+              (cache_ptr)->slist_size );                                    \
+                                                                            \
+    if ( H5SL_remove((cache_ptr)->slist_ptr, &(entry_ptr)->addr)            \
+             != (entry_ptr) )                                               \
+        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL,                          \
+                    "Can't delete entry from skip list.")                   \
+                                                                            \
+    HDassert( (cache_ptr)->slist_len > 0 );                                 \
+    (cache_ptr)->slist_changed = TRUE;                                      \
+    (cache_ptr)->slist_len--;                                               \
+    HDassert( (cache_ptr)->slist_size >= (entry_ptr)->size );               \
+    (cache_ptr)->slist_size -= (entry_ptr)->size;                           \
+    ((cache_ptr)->slist_ring_len[(entry_ptr)->ring])--;                     \
+    HDassert( (cache_ptr)->slist_ring_size[(entry_ptr->ring)] >=            \
+              (entry_ptr)->size );                                          \
+    ((cache_ptr)->slist_ring_size[(entry_ptr)->ring]) -= (entry_ptr)->size; \
+    (entry_ptr)->in_slist = FALSE;                                          \
+} /* H5C__REMOVE_ENTRY_FROM_SLIST */
 
-#define H5C__PRE_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr)           \
-if (                                                                          \
-    ( (cache_ptr) == NULL ) ||                                                \
-    ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) ||                             \
-    ( (cache_ptr)->index_len <= 0 ) ||                                        \
-    ( (entry_ptr) == NULL ) ||                                                \
-    ( (entry_ptr)->is_dirty != TRUE ) ||                                      \
-    ( (cache_ptr)->index_size < (entry_ptr)->size ) ||                        \
-    ( (cache_ptr)->clean_index_size < (entry_ptr)->size ) ||                  \
-    ( (cache_ptr)->index_size !=                                              \
-       ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) ) {  \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                                  \
-                "Pre HT update for entry dirty SC failed")                    \
-}
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    H5C__UPDATE_SLIST_FOR_SIZE_CHANGE
+ *
+ * Purpose:     Update cache_ptr->slist_size for a change in the size of
+ *		and entry in the slist.
+ *
+ * Return:      N/A
+ *
+ * Programmer:  John Mainzer, 9/07/05
+ *
+ * Modifications:
+ *
+ *		JRM -- 8/27/06
+ *		Added the H5C_DO_SANITY_CHECKS version of the macro.
+ *
+ *		This version maintains the slist_size_increase field
+ *		that are used in sanity checks in the flush routines.
+ *
+ *		All this is needed as the fractal heap needs to be
+ *		able to dirty, resize and/or move entries during the
+ *		flush.
+ *
+ *		JRM -- 12/13/14
+ *		Note that we do not set cache_ptr->slist_changed to TRUE 
+ *		in this case, as the structure of the slist is not
+ *		modified.
+ *
+ *		JRM -- 9/1/15
+ *		Added code to maintain the cache_ptr->slist_ring_len
+ *		and cache_ptr->slist_ring_size arrays.
+ *
+ *-------------------------------------------------------------------------
+ */
 
-#define H5C__POST_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr)        \
-if ( (cache_ptr)->index_size !=                                             \
-       ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) {  \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                                \
-                "Post HT update for entry clean SC failed")                 \
-}
+#if H5C_DO_SANITY_CHECKS
 
-#define H5C__POST_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr)        \
-if ( (cache_ptr)->index_size !=                                             \
-       ((cache_ptr)->clean_index_size + (cache_ptr)->dirty_index_size) ) {  \
-    HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL,                                \
-                "Post HT update for entry dirty SC failed")                 \
-}
+#define H5C__UPDATE_SLIST_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size)      \
+{                                                                             \
+    HDassert( (cache_ptr) );                                                  \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                       \
+    HDassert( (old_size) > 0 );                                               \
+    HDassert( (new_size) > 0 );                                               \
+    HDassert( (old_size) <= (cache_ptr)->slist_size );                        \
+    HDassert( (cache_ptr)->slist_len > 0 );                                   \
+    HDassert( ((cache_ptr)->slist_len > 1) ||                                 \
+              ( (cache_ptr)->slist_size == (old_size) ) );                    \
+    HDassert( (entry_ptr)->ring > H5C_RING_UNDEFINED );                       \
+    HDassert( (entry_ptr)->ring < H5C_RING_NTYPES );                          \
+    HDassert( (cache_ptr)->slist_ring_len[(entry_ptr)->ring] <=               \
+              (cache_ptr)->slist_len );                                       \
+    HDassert( (cache_ptr)->slist_ring_size[(entry_ptr)->ring] <=              \
+              (cache_ptr)->slist_size );                                      \
+                                                                              \
+    (cache_ptr)->slist_size -= (old_size);                                    \
+    (cache_ptr)->slist_size += (new_size);                                    \
+                                                                              \
+    HDassert( (cache_ptr)->slist_ring_size[(entry_ptr->ring)] >=(old_size) ); \
+    ((cache_ptr)->slist_ring_size[(entry_ptr)->ring]) -= (old_size);          \
+    ((cache_ptr)->slist_ring_size[(entry_ptr)->ring]) += (new_size);          \
+                                                                              \
+    (cache_ptr)->slist_size_increase -= (int64_t)(old_size);                  \
+    (cache_ptr)->slist_size_increase += (int64_t)(new_size);                  \
+                                                                              \
+    HDassert( (new_size) <= (cache_ptr)->slist_size );                        \
+    HDassert( ( (cache_ptr)->slist_len > 1 ) ||                               \
+              ( (cache_ptr)->slist_size == (new_size) ) );                    \
+} /* H5C__UPDATE_SLIST_FOR_SIZE_CHANGE */
 
 #else /* H5C_DO_SANITY_CHECKS */
 
-#define H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val)
-#define H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr)
-#define H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val)
-#define H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k, fail_val)
-#define H5C__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val)
-#define H5C__PRE_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr)
-#define H5C__PRE_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr)
-#define H5C__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
-		                         entry_ptr, was_clean)
-#define H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size, \
-		                          entry_ptr)
-#define H5C__POST_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr)
-#define H5C__POST_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr)
+#define H5C__UPDATE_SLIST_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size)      \
+{                                                                             \
+    HDassert( (cache_ptr) );                                                  \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                       \
+    HDassert( (old_size) > 0 );                                               \
+    HDassert( (new_size) > 0 );                                               \
+    HDassert( (old_size) <= (cache_ptr)->slist_size );                        \
+    HDassert( (cache_ptr)->slist_len > 0 );                                   \
+    HDassert( ((cache_ptr)->slist_len > 1) ||                                 \
+              ( (cache_ptr)->slist_size == (old_size) ) );                    \
+    HDassert( (entry_ptr)->ring > H5C_RING_UNDEFINED );                       \
+    HDassert( (entry_ptr)->ring < H5C_RING_NTYPES );                          \
+    HDassert( (cache_ptr)->slist_ring_len[(entry_ptr)->ring] <=               \
+              (cache_ptr)->slist_len );                                       \
+    HDassert( (cache_ptr)->slist_ring_size[(entry_ptr)->ring] <=              \
+              (cache_ptr)->slist_size );                                      \
+                                                                              \
+    (cache_ptr)->slist_size -= (old_size);                                    \
+    (cache_ptr)->slist_size += (new_size);                                    \
+                                                                              \
+    HDassert( (cache_ptr)->slist_ring_size[(entry_ptr->ring)] >=(old_size) ); \
+    ((cache_ptr)->slist_ring_size[(entry_ptr)->ring]) -= (old_size);          \
+    ((cache_ptr)->slist_ring_size[(entry_ptr)->ring]) += (new_size);          \
+                                                                              \
+    HDassert( (new_size) <= (cache_ptr)->slist_size );                        \
+    HDassert( ( (cache_ptr)->slist_len > 1 ) ||                               \
+              ( (cache_ptr)->slist_size == (new_size) ) );                    \
+} /* H5C__UPDATE_SLIST_FOR_SIZE_CHANGE */
 
 #endif /* H5C_DO_SANITY_CHECKS */
 
+

+/**************************************************************************
+ *
+ * Replacement policy update macros:
+ *
+ * These used to be functions, but I converted them to macros to avoid some
+ * function call overhead.
+ *
+ **************************************************************************/
 
-#define H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, fail_val) \
-{                                                            \
-    int k;                                                   \
-    H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val)    \
-    k = H5C__HASH_FCN((entry_ptr)->addr);                    \
-    if ( ((cache_ptr)->index)[k] == NULL )                   \
-    {                                                        \
-        ((cache_ptr)->index)[k] = (entry_ptr);               \
-    }                                                        \
-    else                                                     \
-    {                                                        \
-        (entry_ptr)->ht_next = ((cache_ptr)->index)[k];      \
-        (entry_ptr)->ht_next->ht_prev = (entry_ptr);         \
-        ((cache_ptr)->index)[k] = (entry_ptr);               \
-    }                                                        \
-    (cache_ptr)->index_len++;                                \
-    (cache_ptr)->index_size += (entry_ptr)->size;            \
-    if ( (entry_ptr)->is_dirty ) {                           \
-        (cache_ptr)->dirty_index_size += (entry_ptr)->size;  \
-    } else {                                                 \
-	(cache_ptr)->clean_index_size += (entry_ptr)->size;  \
-    }                                                        \
-    H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr)            \
-}
-
-#define H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr)          \
-{                                                             \
-    int k;                                                    \
-    H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr)               \
-    k = H5C__HASH_FCN((entry_ptr)->addr);                     \
-    if ( (entry_ptr)->ht_next )                               \
-    {                                                         \
-        (entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev; \
-    }                                                         \
-    if ( (entry_ptr)->ht_prev )                               \
-    {                                                         \
-        (entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next; \
-    }                                                         \
-    if ( ((cache_ptr)->index)[k] == (entry_ptr) )             \
-    {                                                         \
-        ((cache_ptr)->index)[k] = (entry_ptr)->ht_next;       \
-    }                                                         \
-    (entry_ptr)->ht_next = NULL;                              \
-    (entry_ptr)->ht_prev = NULL;                              \
-    (cache_ptr)->index_len--;                                 \
-    (cache_ptr)->index_size -= (entry_ptr)->size;             \
-    if ( (entry_ptr)->is_dirty ) {                            \
-        (cache_ptr)->dirty_index_size -= (entry_ptr)->size;   \
-    } else {                                                  \
-	(cache_ptr)->clean_index_size -= (entry_ptr)->size;   \
-    }                                                         \
-    H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr)              \
-}
+/*-------------------------------------------------------------------------
+ *
+ * Macro:	H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS
+ *
+ * Purpose:     For efficiency, we sometimes change the order of flushes --
+ *		but doing so can confuse the replacement policy.  This
+ *		macro exists to allow us to specify an entry as the
+ *		most recently touched so we can repair any such
+ *		confusion.
+ *
+ *		At present, we only support the modified LRU policy, so
+ *		this function deals with that case unconditionally.  If
+ *		we ever support other replacement policies, the macro
+ *		should switch on the current policy and act accordingly.
+ *
+ * Return:      N/A
+ *
+ * Programmer:  John Mainzer, 10/13/05
+ *
+ * Modifications:
+ *
+ *		JRM -- 3/20/06
+ *		Modified macro to ignore pinned entries.  Pinned entries
+ *		do not appear in the data structures maintained by the
+ *		replacement policy code, and thus this macro has nothing
+ *		to do if called for such an entry.
+ *
+ *		JRM -- 3/28/07
+ *		Added sanity checks using the new is_read_only and
+ *		ro_ref_count fields of struct H5C_cache_entry_t.
+ *
+ *-------------------------------------------------------------------------
+ */
 
-#define H5C__SEARCH_INDEX(cache_ptr, Addr, entry_ptr, fail_val)             \
-{                                                                           \
-    int k;                                                                  \
-    int depth = 0;                                                          \
-    H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val)                        \
-    k = H5C__HASH_FCN(Addr);                                                \
-    entry_ptr = ((cache_ptr)->index)[k];                                    \
-    while ( ( entry_ptr ) && ( H5F_addr_ne(Addr, (entry_ptr)->addr) ) )     \
-    {                                                                       \
-        (entry_ptr) = (entry_ptr)->ht_next;                                 \
-        (depth)++;                                                          \
-    }                                                                       \
-    if ( entry_ptr )                                                        \
-    {                                                                       \
-        H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k, fail_val) \
-        if ( entry_ptr != ((cache_ptr)->index)[k] )                         \
-        {                                                                   \
-            if ( (entry_ptr)->ht_next )                                     \
-            {                                                               \
-                (entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev;       \
-            }                                                               \
-            HDassert( (entry_ptr)->ht_prev != NULL );                       \
-            (entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next;           \
-            ((cache_ptr)->index)[k]->ht_prev = (entry_ptr);                 \
-            (entry_ptr)->ht_next = ((cache_ptr)->index)[k];                 \
-            (entry_ptr)->ht_prev = NULL;                                    \
-            ((cache_ptr)->index)[k] = (entry_ptr);                          \
-            H5C__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val)  \
-        }                                                                   \
-    }                                                                       \
-    H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, (entry_ptr != NULL), depth)  \
-}
+#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
 
-#define H5C__SEARCH_INDEX_NO_STATS(cache_ptr, Addr, entry_ptr, fail_val)    \
+#define H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS(cache_ptr, entry_ptr, fail_val) \
 {                                                                           \
-    int k;                                                                  \
-    int depth = 0;                                                          \
-    H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val)                        \
-    k = H5C__HASH_FCN(Addr);                                                \
-    entry_ptr = ((cache_ptr)->index)[k];                                    \
-    while ( ( entry_ptr ) && ( H5F_addr_ne(Addr, (entry_ptr)->addr) ) )     \
-    {                                                                       \
-        (entry_ptr) = (entry_ptr)->ht_next;                                 \
-        (depth)++;                                                          \
-    }                                                                       \
-    if ( entry_ptr )                                                        \
-    {                                                                       \
-        H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k, fail_val) \
-        if ( entry_ptr != ((cache_ptr)->index)[k] )                         \
-        {                                                                   \
-            if ( (entry_ptr)->ht_next )                                     \
-            {                                                               \
-                (entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev;       \
-            }                                                               \
-            HDassert( (entry_ptr)->ht_prev != NULL );                       \
-            (entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next;           \
-            ((cache_ptr)->index)[k]->ht_prev = (entry_ptr);                 \
-            (entry_ptr)->ht_next = ((cache_ptr)->index)[k];                 \
-            (entry_ptr)->ht_prev = NULL;                                    \
-            ((cache_ptr)->index)[k] = (entry_ptr);                          \
-            H5C__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val)  \
+    HDassert( (cache_ptr) );                                                \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                     \
+    HDassert( (entry_ptr) );                                                \
+    HDassert( !((entry_ptr)->is_protected) );                               \
+    HDassert( !((entry_ptr)->is_read_only) );                               \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                           \
+    HDassert( (entry_ptr)->size > 0 );                                      \
+                                                                            \
+    if ( ! ((entry_ptr)->is_pinned) ) {                                     \
+                                                                            \
+        /* modified LRU specific code */                                    \
+                                                                            \
+        /* remove the entry from the LRU list, and re-insert it at the head.\
+	 */                                                                 \
+                                                                            \
+        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,             \
+                        (cache_ptr)->LRU_tail_ptr,                          \
+			(cache_ptr)->LRU_list_len,                          \
+                        (cache_ptr)->LRU_list_size, (fail_val))             \
+                                                                            \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,            \
+                         (cache_ptr)->LRU_tail_ptr,                         \
+			 (cache_ptr)->LRU_list_len,                         \
+                         (cache_ptr)->LRU_list_size, (fail_val))            \
+                                                                            \
+        /* Use the dirty flag to infer whether the entry is on the clean or \
+         * dirty LRU list, and remove it.  Then insert it at the head of    \
+         * the same LRU list.                                               \
+         *                                                                  \
+         * At least initially, all entries should be clean.  That may       \
+         * change, so we may as well deal with both cases now.              \
+         */                                                                 \
+                                                                            \
+        if ( (entry_ptr)->is_dirty ) {                                      \
+            H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr,    \
+                                (cache_ptr)->dLRU_tail_ptr,                 \
+                                (cache_ptr)->dLRU_list_len,                 \
+                                (cache_ptr)->dLRU_list_size, (fail_val))    \
+                                                                            \
+            H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr,   \
+                                 (cache_ptr)->dLRU_tail_ptr,                \
+                                 (cache_ptr)->dLRU_list_len,                \
+                                 (cache_ptr)->dLRU_list_size, (fail_val))   \
+        } else {                                                            \
+            H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr,    \
+                                (cache_ptr)->cLRU_tail_ptr,                 \
+                                (cache_ptr)->cLRU_list_len,                 \
+                                (cache_ptr)->cLRU_list_size, (fail_val))    \
+                                                                            \
+            H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr,   \
+                                 (cache_ptr)->cLRU_tail_ptr,                \
+                                 (cache_ptr)->cLRU_list_len,                \
+                                 (cache_ptr)->cLRU_list_size, (fail_val))   \
         }                                                                   \
+                                                                            \
+        /* End modified LRU specific code. */                               \
     }                                                                       \
-}
+} /* H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS */
 
-#define H5C__UPDATE_INDEX_FOR_ENTRY_CLEAN(cache_ptr, entry_ptr)   \
-{                                                                 \
-    H5C__PRE_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr);  \
-    (cache_ptr)->dirty_index_size -= (entry_ptr)->size;           \
-    (cache_ptr)->clean_index_size += (entry_ptr)->size;           \
-    H5C__POST_HT_UPDATE_FOR_ENTRY_CLEAN_SC(cache_ptr, entry_ptr); \
-}
+#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
 
-#define H5C__UPDATE_INDEX_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr)   \
-{                                                                 \
-    H5C__PRE_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr);  \
-    (cache_ptr)->clean_index_size -= (entry_ptr)->size;           \
-    (cache_ptr)->dirty_index_size += (entry_ptr)->size;           \
-    H5C__POST_HT_UPDATE_FOR_ENTRY_DIRTY_SC(cache_ptr, entry_ptr); \
-}
+#define H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS(cache_ptr, entry_ptr, fail_val) \
+{                                                                           \
+    HDassert( (cache_ptr) );                                                \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                     \
+    HDassert( (entry_ptr) );                                                \
+    HDassert( !((entry_ptr)->is_protected) );                               \
+    HDassert( !((entry_ptr)->is_read_only) );                               \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                           \
+    HDassert( (entry_ptr)->size > 0 );                                      \
+                                                                            \
+    if ( ! ((entry_ptr)->is_pinned) ) {                                     \
+                                                                            \
+        /* modified LRU specific code */                                    \
+                                                                            \
+        /* remove the entry from the LRU list, and re-insert it at the head \
+	 */                                                                 \
+                                                                            \
+        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,             \
+                        (cache_ptr)->LRU_tail_ptr,                          \
+			(cache_ptr)->LRU_list_len,                          \
+                        (cache_ptr)->LRU_list_size, (fail_val))             \
+                                                                            \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,            \
+                         (cache_ptr)->LRU_tail_ptr,                         \
+			 (cache_ptr)->LRU_list_len,                         \
+                         (cache_ptr)->LRU_list_size, (fail_val))            \
+                                                                            \
+        /* End modified LRU specific code. */                               \
+    }                                                                       \
+} /* H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS */
 
-#define H5C__UPDATE_INDEX_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size, \
-		                          entry_ptr, was_clean)          \
-{                                                                        \
-    H5C__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size,      \
-		                     entry_ptr, was_clean)               \
-    (cache_ptr)->index_size -= (old_size);                               \
-    (cache_ptr)->index_size += (new_size);                               \
-    if ( was_clean ) {                                                   \
-        (cache_ptr)->clean_index_size -= (old_size);                     \
-    } else {                                                             \
-	(cache_ptr)->dirty_index_size -= (old_size);                     \
-    }                                                                    \
-    if ( (entry_ptr)->is_dirty ) {                                       \
-        (cache_ptr)->dirty_index_size += (new_size);                     \
-    } else {                                                             \
-	(cache_ptr)->clean_index_size += (new_size);                     \
-    }                                                                    \
-    H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size,     \
-                                      entry_ptr)                         \
-}
+#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
 
 

-/**************************************************************************
- *
- * Skip list insertion and deletion macros:
- *
- * These used to be functions, but I converted them to macros to avoid some
- * function call overhead.
- *
- **************************************************************************/
-
 /*-------------------------------------------------------------------------
  *
- * Macro:	H5C__INSERT_ENTRY_IN_SLIST
+ * Macro:	H5C__UPDATE_RP_FOR_EVICTION
  *
- * Purpose:     Insert the specified instance of H5C_cache_entry_t into
- *		the skip list in the specified instance of H5C_t.  Update
- *		the associated length and size fields.
+ * Purpose:     Update the replacement policy data structures for an
+ *		eviction of the specified cache entry.
  *
- * Return:      N/A
+ *		At present, we only support the modified LRU policy, so
+ *		this function deals with that case unconditionally.  If
+ *		we ever support other replacement policies, the function
+ *		should switch on the current policy and act accordingly.
+ *
+ * Return:      Non-negative on success/Negative on failure.
  *
  * Programmer:  John Mainzer, 5/10/04
  *
  * Modifications:
  *
- *		JRM -- 7/21/04
- *		Updated function to set the in_tree flag when inserting
- *		an entry into the tree.  Also modified the function to
- *		update the tree size and len fields instead of the similar
- *		index fields.
- *
- *		All of this is part of the modifications to support the
- *		hash table.
- *
- *		JRM -- 7/27/04
- *		Converted the function H5C_insert_entry_in_tree() into
- *		the macro H5C__INSERT_ENTRY_IN_TREE in the hopes of
- *		wringing a little more speed out of the cache.
- *
- *		Note that we don't bother to check if the entry is already
- *		in the tree -- if it is, H5SL_insert() will fail.
- *
- *		QAK -- 11/27/04
- *		Switched over to using skip list routines.
+ *		JRM - 7/27/04
+ *		Converted the function H5C_update_rp_for_eviction() to the
+ *		macro H5C__UPDATE_RP_FOR_EVICTION in an effort to squeeze
+ *		a bit more performance out of the cache.
  *
- *		JRM -- 6/27/06
- *		Added fail_val parameter.
+ *		At least for the first cut, I am leaving the comments and
+ *		white space in the macro.  If they cause dificulties with
+ *		the pre-processor, I'll have to remove them.
  *
- *		JRM -- 8/25/06
- *		Added the H5C_DO_SANITY_CHECKS version of the macro.
+ *		JRM - 7/28/04
+ *		Split macro into two version, one supporting the clean and
+ *		dirty LRU lists, and the other not.  Yet another attempt
+ *		at optimization.
  *
- *		This version maintains the slist_len_increase and
- *		slist_size_increase fields that are used in sanity
- *		checks in the flush routines.
+ *		JRM - 3/20/06
+ *		Pinned entries can't be evicted, so this entry should never
+ *		be called on a pinned entry.  Added assert to verify this.
  *
- *		All this is needed as the fractal heap needs to be
- *		able to dirty, resize and/or move entries during the
- *		flush.
+ *		JRM -- 3/28/07
+ *		Added sanity checks for the new is_read_only and
+ *		ro_ref_count fields of struct H5C_cache_entry_t.
  *
  *-------------------------------------------------------------------------
  */
 
-#if H5C_DO_SANITY_CHECKS
+#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
 
-#define H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, fail_val)             \
-{                                                                              \
-    HDassert( (cache_ptr) );                                                   \
-    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                        \
-    HDassert( (entry_ptr) );                                                   \
-    HDassert( (entry_ptr)->size > 0 );                                         \
-    HDassert( H5F_addr_defined((entry_ptr)->addr) );                           \
-    HDassert( !((entry_ptr)->in_slist) );                                      \
-                                                                               \
-    if ( H5SL_insert((cache_ptr)->slist_ptr, entry_ptr, &(entry_ptr)->addr)    \
-                                                                         < 0 ) \
-        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, (fail_val),                       \
-                    "Can't insert entry in skip list")                         \
-                                                                               \
-    (entry_ptr)->in_slist = TRUE;                                              \
-    (cache_ptr)->slist_len++;                                                  \
-    (cache_ptr)->slist_size += (entry_ptr)->size;                              \
-    (cache_ptr)->slist_len_increase++;                                         \
-    (cache_ptr)->slist_size_increase += (entry_ptr)->size;                     \
-                                                                               \
-    HDassert( (cache_ptr)->slist_len > 0 );                                    \
-    HDassert( (cache_ptr)->slist_size > 0 );                                   \
-                                                                               \
-} /* H5C__INSERT_ENTRY_IN_SLIST */
+#define H5C__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, fail_val)          \
+{                                                                            \
+    HDassert( (cache_ptr) );                                                 \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                      \
+    HDassert( (entry_ptr) );                                                 \
+    HDassert( !((entry_ptr)->is_protected) );                                \
+    HDassert( !((entry_ptr)->is_read_only) );                                \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                            \
+    HDassert( !((entry_ptr)->is_pinned) );                                   \
+    HDassert( (entry_ptr)->size > 0 );                                       \
+                                                                             \
+    /* modified LRU specific code */                                         \
+                                                                             \
+    /* remove the entry from the LRU list. */                                \
+                                                                             \
+    H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,                  \
+                    (cache_ptr)->LRU_tail_ptr, (cache_ptr)->LRU_list_len,    \
+                    (cache_ptr)->LRU_list_size, (fail_val))                  \
+                                                                             \
+    /* If the entry is clean when it is evicted, it should be on the         \
+     * clean LRU list, if it was dirty, it should be on the dirty LRU list.  \
+     * Remove it from the appropriate list according to the value of the     \
+     * dirty flag.                                                           \
+     */                                                                      \
+                                                                             \
+    if ( (entry_ptr)->is_dirty ) {                                           \
+                                                                             \
+        H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr,         \
+                            (cache_ptr)->dLRU_tail_ptr,                      \
+                            (cache_ptr)->dLRU_list_len,                      \
+                            (cache_ptr)->dLRU_list_size, (fail_val))         \
+    } else {                                                                 \
+        H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr,         \
+                            (cache_ptr)->cLRU_tail_ptr,                      \
+                            (cache_ptr)->cLRU_list_len,                      \
+                            (cache_ptr)->cLRU_list_size, (fail_val))         \
+    }                                                                        \
+                                                                             \
+} /* H5C__UPDATE_RP_FOR_EVICTION */
 
-#else /* H5C_DO_SANITY_CHECKS */
+#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
 
-#define H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, fail_val)             \
-{                                                                              \
-    HDassert( (cache_ptr) );                                                   \
-    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                        \
-    HDassert( (entry_ptr) );                                                   \
-    HDassert( (entry_ptr)->size > 0 );                                         \
-    HDassert( H5F_addr_defined((entry_ptr)->addr) );                           \
-    HDassert( !((entry_ptr)->in_slist) );                                      \
-                                                                               \
-    if ( H5SL_insert((cache_ptr)->slist_ptr, entry_ptr, &(entry_ptr)->addr)    \
-                                                                         < 0 ) \
-        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, (fail_val),                       \
-                    "Can't insert entry in skip list")                         \
-                                                                               \
-    (entry_ptr)->in_slist = TRUE;                                              \
-    (cache_ptr)->slist_len++;                                                  \
-    (cache_ptr)->slist_size += (entry_ptr)->size;                              \
-                                                                               \
-    HDassert( (cache_ptr)->slist_len > 0 );                                    \
-    HDassert( (cache_ptr)->slist_size > 0 );                                   \
-                                                                               \
-} /* H5C__INSERT_ENTRY_IN_SLIST */
+#define H5C__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, fail_val)          \
+{                                                                            \
+    HDassert( (cache_ptr) );                                                 \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                      \
+    HDassert( (entry_ptr) );                                                 \
+    HDassert( !((entry_ptr)->is_protected) );                                \
+    HDassert( !((entry_ptr)->is_read_only) );                                \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                            \
+    HDassert( !((entry_ptr)->is_pinned) );                                   \
+    HDassert( (entry_ptr)->size > 0 );                                       \
+                                                                             \
+    /* modified LRU specific code */                                         \
+                                                                             \
+    /* remove the entry from the LRU list. */                                \
+                                                                             \
+    H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,                  \
+                    (cache_ptr)->LRU_tail_ptr, (cache_ptr)->LRU_list_len,    \
+                    (cache_ptr)->LRU_list_size, (fail_val))                  \
+                                                                             \
+} /* H5C__UPDATE_RP_FOR_EVICTION */
 
-#endif /* H5C_DO_SANITY_CHECKS */
+#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
 
 

 /*-------------------------------------------------------------------------
  *
- * Function:    H5C__REMOVE_ENTRY_FROM_SLIST
+ * Macro:	H5C__UPDATE_RP_FOR_FLUSH
  *
- * Purpose:     Remove the specified instance of H5C_cache_entry_t from the
- *		index skip list in the specified instance of H5C_t.  Update
- *		the associated length and size fields.
+ * Purpose:     Update the replacement policy data structures for a flush
+ *		of the specified cache entry.
+ *
+ *		At present, we only support the modified LRU policy, so
+ *		this function deals with that case unconditionally.  If
+ *		we ever support other replacement policies, the function
+ *		should switch on the current policy and act accordingly.
  *
  * Return:      N/A
  *
- * Programmer:  John Mainzer, 5/10/04
+ * Programmer:  John Mainzer, 5/6/04
  *
  * Modifications:
  *
- *		JRM -- 7/21/04
- *		Updated function for the addition of the hash table.
+ *		JRM - 7/27/04
+ *		Converted the function H5C_update_rp_for_flush() to the
+ *		macro H5C__UPDATE_RP_FOR_FLUSH in an effort to squeeze
+ *		a bit more performance out of the cache.
+ *
+ *		At least for the first cut, I am leaving the comments and
+ *		white space in the macro.  If they cause dificulties with
+ *		pre-processor, I'll have to remove them.
  *
- *		JRM - 7/27/04
- *		Converted from the function H5C_remove_entry_from_tree()
- *		to the macro H5C__REMOVE_ENTRY_FROM_TREE in the hopes of
- *		wringing a little more performance out of the cache.
+ *		JRM - 7/28/04
+ *		Split macro into two versions, one supporting the clean and
+ *		dirty LRU lists, and the other not.  Yet another attempt
+ *		at optimization.
  *
- *		QAK -- 11/27/04
- *		Switched over to using skip list routines.
+ *		JRM - 3/20/06
+ *		While pinned entries can be flushed, they don't reside in
+ *		the replacement policy data structures when unprotected.
+ *		Thus I modified this macro to do nothing if the entry is
+ *		pinned.
  *
- *		JRM -- 3/28/07
- *		Updated sanity checks for the new is_read_only and
- *		ro_ref_count fields in H5C_cache_entry_t.
+ *		JRM - 3/28/07
+ *		Added sanity checks based on the new is_read_only and
+ *		ro_ref_count fields of struct H5C_cache_entry_t.
  *
  *-------------------------------------------------------------------------
  */
 
-#define H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr)          \
-{                                                                   \
-    HDassert( (cache_ptr) );                                        \
-    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );             \
-    HDassert( (entry_ptr) );                                        \
-    HDassert( !((entry_ptr)->is_protected) );                       \
-    HDassert( !((entry_ptr)->is_read_only) );                       \
-    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                   \
-    HDassert( (entry_ptr)->size > 0 );                              \
-    HDassert( (entry_ptr)->in_slist );                              \
-    HDassert( (cache_ptr)->slist_ptr );                             \
-                                                                    \
-    if ( H5SL_remove((cache_ptr)->slist_ptr, &(entry_ptr)->addr)    \
-         != (entry_ptr) )                                           \
-                                                                    \
-        HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL,                  \
-                    "Can't delete entry from skip list.")           \
-                                                                    \
-    HDassert( (cache_ptr)->slist_len > 0 );                         \
-    (cache_ptr)->slist_len--;                                       \
-    HDassert( (cache_ptr)->slist_size >= (entry_ptr)->size );       \
-    (cache_ptr)->slist_size -= (entry_ptr)->size;                   \
-    (entry_ptr)->in_slist = FALSE;                                  \
-} /* H5C__REMOVE_ENTRY_FROM_SLIST */
+#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
+
+#define H5C__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, fail_val)            \
+{                                                                           \
+    HDassert( (cache_ptr) );                                                \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                     \
+    HDassert( (entry_ptr) );                                                \
+    HDassert( !((entry_ptr)->is_protected) );                               \
+    HDassert( !((entry_ptr)->is_read_only) );                               \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                           \
+    HDassert( (entry_ptr)->size > 0 );                                      \
+                                                                            \
+    if ( ! ((entry_ptr)->is_pinned) ) {                                     \
+                                                                            \
+        /* modified LRU specific code */                                    \
+                                                                            \
+        /* remove the entry from the LRU list, and re-insert it at the      \
+	 * head.                                                            \
+	 */                                                                 \
+                                                                            \
+        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,             \
+                        (cache_ptr)->LRU_tail_ptr,                          \
+			(cache_ptr)->LRU_list_len,                          \
+                        (cache_ptr)->LRU_list_size, (fail_val))             \
+                                                                            \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,            \
+                         (cache_ptr)->LRU_tail_ptr,                         \
+			 (cache_ptr)->LRU_list_len,                         \
+                         (cache_ptr)->LRU_list_size, (fail_val))            \
+                                                                            \
+        /* since the entry is being flushed or cleared, one would think     \
+	 * that it must be dirty -- but that need not be the case.  Use the \
+	 * dirty flag to infer whether the entry is on the clean or dirty   \
+	 * LRU list, and remove it.  Then insert it at the head of the      \
+	 * clean LRU list.                                                  \
+         *                                                                  \
+         * The function presumes that a dirty entry will be either cleared  \
+	 * or flushed shortly, so it is OK if we put a dirty entry on the   \
+	 * clean LRU list.                                                  \
+         */                                                                 \
+                                                                            \
+        if ( (entry_ptr)->is_dirty ) {                                      \
+            H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr,    \
+                                (cache_ptr)->dLRU_tail_ptr,                 \
+                                (cache_ptr)->dLRU_list_len,                 \
+                                (cache_ptr)->dLRU_list_size, (fail_val))    \
+        } else {                                                            \
+            H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr,    \
+                                (cache_ptr)->cLRU_tail_ptr,                 \
+                                (cache_ptr)->cLRU_list_len,                 \
+                                (cache_ptr)->cLRU_list_size, (fail_val))    \
+        }                                                                   \
+                                                                            \
+        H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr,       \
+                             (cache_ptr)->cLRU_tail_ptr,                    \
+                             (cache_ptr)->cLRU_list_len,                    \
+                             (cache_ptr)->cLRU_list_size, (fail_val))       \
+                                                                            \
+        /* End modified LRU specific code. */                               \
+    }                                                                       \
+} /* H5C__UPDATE_RP_FOR_FLUSH */
+
+#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+#define H5C__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, fail_val)            \
+{                                                                           \
+    HDassert( (cache_ptr) );                                                \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                     \
+    HDassert( (entry_ptr) );                                                \
+    HDassert( !((entry_ptr)->is_protected) );                               \
+    HDassert( !((entry_ptr)->is_read_only) );                               \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                           \
+    HDassert( (entry_ptr)->size > 0 );                                      \
+                                                                            \
+    if ( ! ((entry_ptr)->is_pinned) ) {                                     \
+                                                                            \
+        /* modified LRU specific code */                                    \
+                                                                            \
+        /* remove the entry from the LRU list, and re-insert it at the      \
+	 * head.                                                            \
+	 */                                                                 \
+                                                                            \
+        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,             \
+                        (cache_ptr)->LRU_tail_ptr,                          \
+			(cache_ptr)->LRU_list_len,                          \
+                        (cache_ptr)->LRU_list_size, (fail_val))             \
+                                                                            \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,            \
+                         (cache_ptr)->LRU_tail_ptr,                         \
+			 (cache_ptr)->LRU_list_len,                         \
+                         (cache_ptr)->LRU_list_size, (fail_val))            \
+                                                                            \
+        /* End modified LRU specific code. */                               \
+    }                                                                       \
+} /* H5C__UPDATE_RP_FOR_FLUSH */
+
+#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
 
 

 /*-------------------------------------------------------------------------
  *
- * Function:    H5C__UPDATE_SLIST_FOR_SIZE_CHANGE
+ * Macro:	H5C__UPDATE_RP_FOR_INSERTION
  *
- * Purpose:     Update cache_ptr->slist_size for a change in the size of
- *		and entry in the slist.
+ * Purpose:     Update the replacement policy data structures for an
+ *		insertion of the specified cache entry.
+ *
+ *		At present, we only support the modified LRU policy, so
+ *		this function deals with that case unconditionally.  If
+ *		we ever support other replacement policies, the function
+ *		should switch on the current policy and act accordingly.
  *
  * Return:      N/A
  *
- * Programmer:  John Mainzer, 9/07/05
+ * Programmer:  John Mainzer, 5/17/04
  *
  * Modifications:
  *
- *		JRM -- 8/27/06
- *		Added the H5C_DO_SANITY_CHECKS version of the macro.
+ *		JRM - 7/27/04
+ *		Converted the function H5C_update_rp_for_insertion() to the
+ *		macro H5C__UPDATE_RP_FOR_INSERTION in an effort to squeeze
+ *		a bit more performance out of the cache.
  *
- *		This version maintains the slist_size_increase field
- *		that are used in sanity checks in the flush routines.
+ *		At least for the first cut, I am leaving the comments and
+ *		white space in the macro.  If they cause dificulties with
+ *		pre-processor, I'll have to remove them.
  *
- *		All this is needed as the fractal heap needs to be
- *		able to dirty, resize and/or move entries during the
- *		flush.
+ *		JRM - 7/28/04
+ *		Split macro into two version, one supporting the clean and
+ *		dirty LRU lists, and the other not.  Yet another attempt
+ *		at optimization.
+ *
+ *		JRM - 3/10/06
+ *		This macro should never be called on a pinned entry.
+ *		Inserted an assert to verify this.
+ *
+ *		JRM - 8/9/06
+ *		Not any more.  We must now allow insertion of pinned
+ *		entries.  Updated macro to support this.
+ *
+ *		JRM - 3/28/07
+ *		Added sanity checks using the new is_read_only and
+ *		ro_ref_count fields of struct H5C_cache_entry_t.
  *
  *-------------------------------------------------------------------------
  */
 
-#if H5C_DO_SANITY_CHECKS
-
-#define H5C__UPDATE_SLIST_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size) \
-{                                                                        \
-    HDassert( (cache_ptr) );                                             \
-    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                  \
-    HDassert( (old_size) > 0 );                                          \
-    HDassert( (new_size) > 0 );                                          \
-    HDassert( (old_size) <= (cache_ptr)->slist_size );                   \
-    HDassert( (cache_ptr)->slist_len > 0 );                              \
-    HDassert( ((cache_ptr)->slist_len > 1) ||                            \
-              ( (cache_ptr)->slist_size == (old_size) ) );               \
-                                                                         \
-    (cache_ptr)->slist_size -= (old_size);                               \
-    (cache_ptr)->slist_size += (new_size);                               \
-                                                                         \
-    (cache_ptr)->slist_size_increase -= (int64_t)(old_size);             \
-    (cache_ptr)->slist_size_increase += (int64_t)(new_size);             \
-                                                                         \
-    HDassert( (new_size) <= (cache_ptr)->slist_size );                   \
-    HDassert( ( (cache_ptr)->slist_len > 1 ) ||                          \
-              ( (cache_ptr)->slist_size == (new_size) ) );               \
-} /* H5C__REMOVE_ENTRY_FROM_SLIST */
-
-#else /* H5C_DO_SANITY_CHECKS */
+#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
 
-#define H5C__UPDATE_SLIST_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size) \
-{                                                                        \
-    HDassert( (cache_ptr) );                                             \
-    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                  \
-    HDassert( (old_size) > 0 );                                          \
-    HDassert( (new_size) > 0 );                                          \
-    HDassert( (old_size) <= (cache_ptr)->slist_size );                   \
-    HDassert( (cache_ptr)->slist_len > 0 );                              \
-    HDassert( ((cache_ptr)->slist_len > 1) ||                            \
-              ( (cache_ptr)->slist_size == (old_size) ) );               \
-                                                                         \
-    (cache_ptr)->slist_size -= (old_size);                               \
-    (cache_ptr)->slist_size += (new_size);                               \
-                                                                         \
-    HDassert( (new_size) <= (cache_ptr)->slist_size );                   \
-    HDassert( ( (cache_ptr)->slist_len > 1 ) ||                          \
-              ( (cache_ptr)->slist_size == (new_size) ) );               \
-} /* H5C__REMOVE_ENTRY_FROM_SLIST */
+#define H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, fail_val)       \
+{                                                                          \
+    HDassert( (cache_ptr) );                                               \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                    \
+    HDassert( (entry_ptr) );                                               \
+    HDassert( !((entry_ptr)->is_protected) );                              \
+    HDassert( !((entry_ptr)->is_read_only) );                              \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                          \
+    HDassert( (entry_ptr)->size > 0 );                                     \
+                                                                           \
+    if ( (entry_ptr)->is_pinned ) {                                        \
+                                                                           \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr,           \
+                         (cache_ptr)->pel_tail_ptr,                        \
+                         (cache_ptr)->pel_len,                             \
+                         (cache_ptr)->pel_size, (fail_val))                \
+                                                                           \
+    } else {                                                               \
+                                                                           \
+        /* modified LRU specific code */                                   \
+                                                                           \
+        /* insert the entry at the head of the LRU list. */                \
+                                                                           \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,           \
+                         (cache_ptr)->LRU_tail_ptr,                        \
+			 (cache_ptr)->LRU_list_len,                        \
+                         (cache_ptr)->LRU_list_size, (fail_val))           \
+                                                                           \
+        /* insert the entry at the head of the clean or dirty LRU list as  \
+         * appropriate.                                                    \
+         */                                                                \
+                                                                           \
+        if ( entry_ptr->is_dirty ) {                                       \
+            H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr,  \
+                                 (cache_ptr)->dLRU_tail_ptr,               \
+                                 (cache_ptr)->dLRU_list_len,               \
+                                 (cache_ptr)->dLRU_list_size, (fail_val))  \
+        } else {                                                           \
+            H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr,  \
+                                 (cache_ptr)->cLRU_tail_ptr,               \
+                                 (cache_ptr)->cLRU_list_len,               \
+                                 (cache_ptr)->cLRU_list_size, (fail_val))  \
+        }                                                                  \
+                                                                           \
+        /* End modified LRU specific code. */                              \
+    }                                                                      \
+}
 
-#endif /* H5C_DO_SANITY_CHECKS */
+#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
 
-

-/**************************************************************************
- *
- * Replacement policy update macros:
- *
- * These used to be functions, but I converted them to macros to avoid some
- * function call overhead.
- *
- **************************************************************************/
+#define H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, fail_val)       \
+{                                                                          \
+    HDassert( (cache_ptr) );                                               \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                    \
+    HDassert( (entry_ptr) );                                               \
+    HDassert( !((entry_ptr)->is_protected) );                              \
+    HDassert( !((entry_ptr)->is_read_only) );                              \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                          \
+    HDassert( (entry_ptr)->size > 0 );                                     \
+                                                                           \
+    if ( (entry_ptr)->is_pinned ) {                                        \
+                                                                           \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr,           \
+                         (cache_ptr)->pel_tail_ptr,                        \
+                         (cache_ptr)->pel_len,                             \
+                         (cache_ptr)->pel_size, (fail_val))                \
+	                                                                   \
+    } else {                                                               \
+                                                                           \
+        /* modified LRU specific code */                                   \
+                                                                           \
+        /* insert the entry at the head of the LRU list. */                \
+                                                                           \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,           \
+                         (cache_ptr)->LRU_tail_ptr,                        \
+			 (cache_ptr)->LRU_list_len,                        \
+                         (cache_ptr)->LRU_list_size, (fail_val))           \
+                                                                           \
+        /* End modified LRU specific code. */                              \
+    }                                                                      \
+}
+
+#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
 
+

 /*-------------------------------------------------------------------------
  *
- * Macro:	H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS
+ * Macro:	H5C__UPDATE_RP_FOR_PROTECT
  *
- * Purpose:     For efficiency, we sometimes change the order of flushes --
- *		but doing so can confuse the replacement policy.  This
- *		macro exists to allow us to specify an entry as the
- *		most recently touched so we can repair any such
- *		confusion.
+ * Purpose:     Update the replacement policy data structures for a
+ *		protect of the specified cache entry.
+ *
+ *		To do this, unlink the specified entry from any data
+ *		structures used by the replacement policy, and add the
+ *		entry to the protected list.
  *
  *		At present, we only support the modified LRU policy, so
  *		this function deals with that case unconditionally.  If
- *		we ever support other replacement policies, the macro
+ *		we ever support other replacement policies, the function
  *		should switch on the current policy and act accordingly.
  *
  * Return:      N/A
  *
- * Programmer:  John Mainzer, 10/13/05
+ * Programmer:  John Mainzer, 5/17/04
  *
  * Modifications:
  *
- *		JRM -- 3/20/06
- *		Modified macro to ignore pinned entries.  Pinned entries
- *		do not appear in the data structures maintained by the
- *		replacement policy code, and thus this macro has nothing
- *		to do if called for such an entry.
+ *		JRM - 7/27/04
+ *		Converted the function H5C_update_rp_for_protect() to the
+ *		macro H5C__UPDATE_RP_FOR_PROTECT in an effort to squeeze
+ *		a bit more performance out of the cache.
  *
- *		JRM -- 3/28/07
- *		Added sanity checks using the new is_read_only and
+ *		At least for the first cut, I am leaving the comments and
+ *		white space in the macro.  If they cause dificulties with
+ *		pre-processor, I'll have to remove them.
+ *
+ *		JRM - 7/28/04
+ *		Split macro into two version, one supporting the clean and
+ *		dirty LRU lists, and the other not.  Yet another attempt
+ *		at optimization.
+ *
+ *		JRM - 3/17/06
+ *		Modified macro to attempt to remove pinned entriese from
+ *		the pinned entry list instead of from the data structures
+ *		maintained by the replacement policy.
+ *
+ *		JRM - 3/28/07
+ *		Added sanity checks based on the new is_read_only and
  *		ro_ref_count fields of struct H5C_cache_entry_t.
  *
  *-------------------------------------------------------------------------
@@ -2390,149 +2248,136 @@ if ( (cache_ptr)->index_size !=                                             \
 
 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
 
-#define H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS(cache_ptr, entry_ptr, fail_val) \
-{                                                                           \
-    HDassert( (cache_ptr) );                                                \
-    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                     \
-    HDassert( (entry_ptr) );                                                \
-    HDassert( !((entry_ptr)->is_protected) );                               \
-    HDassert( !((entry_ptr)->is_read_only) );                               \
-    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                           \
-    HDassert( (entry_ptr)->size > 0 );                                      \
-                                                                            \
-    if ( ! ((entry_ptr)->is_pinned) ) {                                     \
-                                                                            \
-        /* modified LRU specific code */                                    \
-                                                                            \
-        /* remove the entry from the LRU list, and re-insert it at the head.\
-	 */                                                                 \
-                                                                            \
-        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,             \
-                        (cache_ptr)->LRU_tail_ptr,                          \
-			(cache_ptr)->LRU_list_len,                          \
-                        (cache_ptr)->LRU_list_size, (fail_val))             \
-                                                                            \
-        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,            \
-                         (cache_ptr)->LRU_tail_ptr,                         \
-			 (cache_ptr)->LRU_list_len,                         \
-                         (cache_ptr)->LRU_list_size, (fail_val))            \
-                                                                            \
-        /* Use the dirty flag to infer whether the entry is on the clean or \
-         * dirty LRU list, and remove it.  Then insert it at the head of    \
-         * the same LRU list.                                               \
-         *                                                                  \
-         * At least initially, all entries should be clean.  That may       \
-         * change, so we may as well deal with both cases now.              \
-         */                                                                 \
-                                                                            \
-        if ( (entry_ptr)->is_dirty ) {                                      \
-            H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr,    \
-                                (cache_ptr)->dLRU_tail_ptr,                 \
-                                (cache_ptr)->dLRU_list_len,                 \
-                                (cache_ptr)->dLRU_list_size, (fail_val))    \
-                                                                            \
-            H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr,   \
-                                 (cache_ptr)->dLRU_tail_ptr,                \
-                                 (cache_ptr)->dLRU_list_len,                \
-                                 (cache_ptr)->dLRU_list_size, (fail_val))   \
-        } else {                                                            \
-            H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr,    \
-                                (cache_ptr)->cLRU_tail_ptr,                 \
-                                (cache_ptr)->cLRU_list_len,                 \
-                                (cache_ptr)->cLRU_list_size, (fail_val))    \
-                                                                            \
-            H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr,   \
-                                 (cache_ptr)->cLRU_tail_ptr,                \
-                                 (cache_ptr)->cLRU_list_len,                \
-                                 (cache_ptr)->cLRU_list_size, (fail_val))   \
-        }                                                                   \
-                                                                            \
-        /* End modified LRU specific code. */                               \
-    }                                                                       \
-} /* H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS */
+#define H5C__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, fail_val)        \
+{                                                                         \
+    HDassert( (cache_ptr) );                                              \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                   \
+    HDassert( (entry_ptr) );                                              \
+    HDassert( !((entry_ptr)->is_protected) );                             \
+    HDassert( !((entry_ptr)->is_read_only) );                             \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                         \
+    HDassert( (entry_ptr)->size > 0 );                                    \
+									  \
+    if ( (entry_ptr)->is_pinned ) {                                       \
+                                                                          \
+        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr,           \
+                        (cache_ptr)->pel_tail_ptr, 			  \
+			(cache_ptr)->pel_len,                             \
+                        (cache_ptr)->pel_size, (fail_val))                \
+        HDassert( (cache_ptr)->pel_len >= 0 );                            \
+                                                                          \
+    } else {                                                              \
+                                                                          \
+        /* modified LRU specific code */                                  \
+                                                                          \
+        /* remove the entry from the LRU list. */                         \
+                                                                          \
+        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,           \
+                        (cache_ptr)->LRU_tail_ptr,                        \
+			(cache_ptr)->LRU_list_len,                        \
+                        (cache_ptr)->LRU_list_size, (fail_val))           \
+                                                                          \
+        /* Similarly, remove the entry from the clean or dirty LRU list   \
+         * as appropriate.                                                \
+         */                                                               \
+                                                                          \
+        if ( (entry_ptr)->is_dirty ) {                                    \
+                                                                          \
+            H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr,  \
+                                (cache_ptr)->dLRU_tail_ptr,               \
+                                (cache_ptr)->dLRU_list_len,               \
+                                (cache_ptr)->dLRU_list_size, (fail_val))  \
+                                                                          \
+        } else {                                                          \
+                                                                          \
+            H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr,  \
+                                (cache_ptr)->cLRU_tail_ptr,               \
+                                (cache_ptr)->cLRU_list_len,               \
+                                (cache_ptr)->cLRU_list_size, (fail_val))  \
+        }                                                                 \
+                                                                          \
+        /* End modified LRU specific code. */                             \
+    }                                                                     \
+                                                                          \
+    /* Regardless of the replacement policy, or whether the entry is      \
+     * pinned, now add the entry to the protected list.                   \
+     */                                                                   \
+                                                                          \
+    H5C__DLL_APPEND((entry_ptr), (cache_ptr)->pl_head_ptr,                \
+                    (cache_ptr)->pl_tail_ptr,                             \
+                    (cache_ptr)->pl_len,                                  \
+                    (cache_ptr)->pl_size, (fail_val))                     \
+} /* H5C__UPDATE_RP_FOR_PROTECT */
 
 #else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
 
-#define H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS(cache_ptr, entry_ptr, fail_val) \
-{                                                                           \
-    HDassert( (cache_ptr) );                                                \
-    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                     \
-    HDassert( (entry_ptr) );                                                \
-    HDassert( !((entry_ptr)->is_protected) );                               \
-    HDassert( !((entry_ptr)->is_read_only) );                               \
-    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                           \
-    HDassert( (entry_ptr)->size > 0 );                                      \
-                                                                            \
-    if ( ! ((entry_ptr)->is_pinned) ) {                                     \
-                                                                            \
-        /* modified LRU specific code */                                    \
-                                                                            \
-        /* remove the entry from the LRU list, and re-insert it at the head \
-	 */                                                                 \
-                                                                            \
-        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,             \
-                        (cache_ptr)->LRU_tail_ptr,                          \
-			(cache_ptr)->LRU_list_len,                          \
-                        (cache_ptr)->LRU_list_size, (fail_val))             \
-                                                                            \
-        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,            \
-                         (cache_ptr)->LRU_tail_ptr,                         \
-			 (cache_ptr)->LRU_list_len,                         \
-                         (cache_ptr)->LRU_list_size, (fail_val))            \
-                                                                            \
-        /* End modified LRU specific code. */                               \
-    }                                                                       \
-} /* H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS */
+#define H5C__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, fail_val)        \
+{                                                                         \
+    HDassert( (cache_ptr) );                                              \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                   \
+    HDassert( (entry_ptr) );                                              \
+    HDassert( !((entry_ptr)->is_protected) );                             \
+    HDassert( !((entry_ptr)->is_read_only) );                             \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                         \
+    HDassert( (entry_ptr)->size > 0 );                                    \
+									  \
+    if ( (entry_ptr)->is_pinned ) {                                       \
+                                                                          \
+        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr,           \
+                        (cache_ptr)->pel_tail_ptr, 			  \
+			(cache_ptr)->pel_len,                             \
+                        (cache_ptr)->pel_size, (fail_val))                \
+        HDassert( (cache_ptr)->pel_len >= 0 );                            \
+                                                                          \
+    } else {                                                              \
+                                                                          \
+        /* modified LRU specific code */                                  \
+                                                                          \
+        /* remove the entry from the LRU list. */                         \
+                                                                          \
+        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,           \
+                        (cache_ptr)->LRU_tail_ptr,                        \
+			(cache_ptr)->LRU_list_len,                        \
+                        (cache_ptr)->LRU_list_size, (fail_val))           \
+                                                                          \
+        /* End modified LRU specific code. */                             \
+    }                                                                     \
+                                                                          \
+    /* Regardless of the replacement policy, or whether the entry is      \
+     * pinned, now add the entry to the protected list.                   \
+     */                                                                   \
+                                                                          \
+    H5C__DLL_APPEND((entry_ptr), (cache_ptr)->pl_head_ptr,                \
+                    (cache_ptr)->pl_tail_ptr,                             \
+                    (cache_ptr)->pl_len,                                  \
+                    (cache_ptr)->pl_size, (fail_val))                     \
+} /* H5C__UPDATE_RP_FOR_PROTECT */
 
 #endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
 
 

 /*-------------------------------------------------------------------------
  *
- * Macro:	H5C__UPDATE_RP_FOR_EVICTION
- *
- * Purpose:     Update the replacement policy data structures for an
- *		eviction of the specified cache entry.
- *
- *		At present, we only support the modified LRU policy, so
- *		this function deals with that case unconditionally.  If
- *		we ever support other replacement policies, the function
- *		should switch on the current policy and act accordingly.
- *
- * Return:      Non-negative on success/Negative on failure.
- *
- * Programmer:  John Mainzer, 5/10/04
- *
- * Modifications:
- *
- *		JRM - 7/27/04
- *		Converted the function H5C_update_rp_for_eviction() to the
- *		macro H5C__UPDATE_RP_FOR_EVICTION in an effort to squeeze
- *		a bit more performance out of the cache.
+ * Macro:	H5C__UPDATE_RP_FOR_MOVE
  *
- *		At least for the first cut, I am leaving the comments and
- *		white space in the macro.  If they cause dificulties with
- *		the pre-processor, I'll have to remove them.
+ * Purpose:     Update the replacement policy data structures for a
+ *		move of the specified cache entry.
  *
- *		JRM - 7/28/04
- *		Split macro into two version, one supporting the clean and
- *		dirty LRU lists, and the other not.  Yet another attempt
- *		at optimization.
+ *		At present, we only support the modified LRU policy, so
+ *		this function deals with that case unconditionally.  If
+ *		we ever support other replacement policies, the function
+ *		should switch on the current policy and act accordingly.
  *
- *		JRM - 3/20/06
- *		Pinned entries can't be evicted, so this entry should never
- *		be called on a pinned entry.  Added assert to verify this.
+ * Return:      N/A
  *
- *		JRM -- 3/28/07
- *		Added sanity checks for the new is_read_only and
- *		ro_ref_count fields of struct H5C_cache_entry_t.
+ * Programmer:  John Mainzer, 5/17/04
  *
  *-------------------------------------------------------------------------
  */
 
 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
 
-#define H5C__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, fail_val)          \
+#define H5C__UPDATE_RP_FOR_MOVE(cache_ptr, entry_ptr, was_dirty, fail_val) \
 {                                                                            \
     HDassert( (cache_ptr) );                                                 \
     HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                      \
@@ -2540,41 +2385,77 @@ if ( (cache_ptr)->index_size !=                                             \
     HDassert( !((entry_ptr)->is_protected) );                                \
     HDassert( !((entry_ptr)->is_read_only) );                                \
     HDassert( ((entry_ptr)->ro_ref_count) == 0 );                            \
-    HDassert( !((entry_ptr)->is_pinned) );                                   \
     HDassert( (entry_ptr)->size > 0 );                                       \
                                                                              \
-    /* modified LRU specific code */                                         \
+    if ( ! ( (entry_ptr)->is_pinned ) ) {                                    \
+	                                                                     \
+        /* modified LRU specific code */                                     \
                                                                              \
-    /* remove the entry from the LRU list. */                                \
+        /* remove the entry from the LRU list, and re-insert it at the head. \
+	 */                                                                  \
                                                                              \
-    H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,                  \
-                    (cache_ptr)->LRU_tail_ptr, (cache_ptr)->LRU_list_len,    \
-                    (cache_ptr)->LRU_list_size, (fail_val))                  \
+            H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,          \
+                             (cache_ptr)->LRU_tail_ptr,                      \
+			     (cache_ptr)->LRU_list_len,                      \
+                             (cache_ptr)->LRU_list_size, (fail_val))         \
                                                                              \
-    /* If the entry is clean when it is evicted, it should be on the         \
-     * clean LRU list, if it was dirty, it should be on the dirty LRU list.  \
-     * Remove it from the appropriate list according to the value of the     \
-     * dirty flag.                                                           \
-     */                                                                      \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,             \
+                         (cache_ptr)->LRU_tail_ptr,                          \
+			 (cache_ptr)->LRU_list_len,                          \
+                         (cache_ptr)->LRU_list_size, (fail_val))             \
                                                                              \
-    if ( (entry_ptr)->is_dirty ) {                                           \
+            /* remove the entry from either the clean or dirty LUR list as   \
+             * indicated by the was_dirty parameter                          \
+             */                                                              \
+            if ( was_dirty ) {                                               \
                                                                              \
-        H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr,         \
-                            (cache_ptr)->dLRU_tail_ptr,                      \
-                            (cache_ptr)->dLRU_list_len,                      \
-                            (cache_ptr)->dLRU_list_size, (fail_val))         \
-    } else {                                                                 \
-        H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr,         \
-                            (cache_ptr)->cLRU_tail_ptr,                      \
-                            (cache_ptr)->cLRU_list_len,                      \
-                            (cache_ptr)->cLRU_list_size, (fail_val))         \
-    }                                                                        \
+                H5C__AUX_DLL_REMOVE((entry_ptr),                             \
+				     (cache_ptr)->dLRU_head_ptr,             \
+                                     (cache_ptr)->dLRU_tail_ptr,             \
+                                     (cache_ptr)->dLRU_list_len,             \
+                                     (cache_ptr)->dLRU_list_size,            \
+				     (fail_val))                             \
                                                                              \
-} /* H5C__UPDATE_RP_FOR_EVICTION */
+            } else {                                                         \
+                                                                             \
+                H5C__AUX_DLL_REMOVE((entry_ptr),                             \
+				     (cache_ptr)->cLRU_head_ptr,             \
+                                     (cache_ptr)->cLRU_tail_ptr,             \
+                                     (cache_ptr)->cLRU_list_len,             \
+                                     (cache_ptr)->cLRU_list_size,            \
+				     (fail_val))                             \
+            }                                                                \
+                                                                             \
+            /* insert the entry at the head of either the clean or dirty     \
+	     * LRU list as appropriate.                                      \
+             */                                                              \
+                                                                             \
+            if ( (entry_ptr)->is_dirty ) {                                   \
+                                                                             \
+                H5C__AUX_DLL_PREPEND((entry_ptr),                            \
+				      (cache_ptr)->dLRU_head_ptr,            \
+                                      (cache_ptr)->dLRU_tail_ptr,            \
+                                      (cache_ptr)->dLRU_list_len,            \
+                                      (cache_ptr)->dLRU_list_size,           \
+				      (fail_val))                            \
+                                                                             \
+            } else {                                                         \
+                                                                             \
+                H5C__AUX_DLL_PREPEND((entry_ptr),                            \
+				      (cache_ptr)->cLRU_head_ptr,            \
+                                      (cache_ptr)->cLRU_tail_ptr,            \
+                                      (cache_ptr)->cLRU_list_len,            \
+                                      (cache_ptr)->cLRU_list_size,           \
+				      (fail_val))                            \
+            }                                                                \
+                                                                             \
+            /* End modified LRU specific code. */                            \
+        }                                                                    \
+} /* H5C__UPDATE_RP_FOR_MOVE */
 
 #else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
 
-#define H5C__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, fail_val)          \
+#define H5C__UPDATE_RP_FOR_MOVE(cache_ptr, entry_ptr, was_dirty, fail_val) \
 {                                                                            \
     HDassert( (cache_ptr) );                                                 \
     HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                      \
@@ -2582,61 +2463,182 @@ if ( (cache_ptr)->index_size !=                                             \
     HDassert( !((entry_ptr)->is_protected) );                                \
     HDassert( !((entry_ptr)->is_read_only) );                                \
     HDassert( ((entry_ptr)->ro_ref_count) == 0 );                            \
-    HDassert( !((entry_ptr)->is_pinned) );                                   \
     HDassert( (entry_ptr)->size > 0 );                                       \
                                                                              \
-    /* modified LRU specific code */                                         \
+    if ( ! ( (entry_ptr)->is_pinned ) ) {                                    \
+	                                                                     \
+        /* modified LRU specific code */                                     \
                                                                              \
-    /* remove the entry from the LRU list. */                                \
+        /* remove the entry from the LRU list, and re-insert it at the head. \
+	 */                                                                  \
                                                                              \
-    H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,                  \
-                    (cache_ptr)->LRU_tail_ptr, (cache_ptr)->LRU_list_len,    \
-                    (cache_ptr)->LRU_list_size, (fail_val))                  \
+            H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,          \
+                             (cache_ptr)->LRU_tail_ptr,                      \
+			     (cache_ptr)->LRU_list_len,                      \
+                             (cache_ptr)->LRU_list_size, (fail_val))         \
                                                                              \
-} /* H5C__UPDATE_RP_FOR_EVICTION */
+            H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,         \
+                              (cache_ptr)->LRU_tail_ptr,                     \
+			      (cache_ptr)->LRU_list_len,                     \
+                              (cache_ptr)->LRU_list_size, (fail_val))        \
+                                                                             \
+            /* End modified LRU specific code. */                            \
+        }                                                                    \
+} /* H5C__UPDATE_RP_FOR_MOVE */
+
+#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Macro:	H5C__UPDATE_RP_FOR_SIZE_CHANGE
+ *
+ * Purpose:     Update the replacement policy data structures for a
+ *		size change of the specified cache entry.
+ *
+ *		To do this, determine if the entry is pinned.  If it is,
+ *		update the size of the pinned entry list.
+ *
+ *		If it isn't pinned, the entry must handled by the
+ *		replacement policy.  Update the appropriate replacement
+ *		policy data structures.
+ *
+ *		At present, we only support the modified LRU policy, so
+ *		this function deals with that case unconditionally.  If
+ *		we ever support other replacement policies, the function
+ *		should switch on the current policy and act accordingly.
+ *
+ * Return:      N/A
+ *
+ * Programmer:  John Mainzer, 8/23/06
+ *
+ * Modifications:
+ *
+ * 		JRM -- 3/28/07
+ *		Added sanity checks based on the new is_read_only and
+ *		ro_ref_count fields of struct H5C_cache_entry_t.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
+
+#define H5C__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, entry_ptr, new_size)    \
+{                                                                         \
+    HDassert( (cache_ptr) );                                              \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                   \
+    HDassert( (entry_ptr) );                                              \
+    HDassert( !((entry_ptr)->is_protected) );                             \
+    HDassert( !((entry_ptr)->is_read_only) );                             \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                         \
+    HDassert( (entry_ptr)->size > 0 );                                    \
+    HDassert( new_size > 0 );                                             \
+				  					  \
+    if ( (entry_ptr)->is_pinned ) {                                       \
+                                                                          \
+	H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->pel_len,             \
+			                (cache_ptr)->pel_size,            \
+			                (entry_ptr)->size,                \
+					(new_size));                      \
+	                                                                  \
+    } else {                                                              \
+                                                                          \
+        /* modified LRU specific code */                                  \
+                                                                          \
+	/* Update the size of the LRU list */                             \
+                                                                          \
+	H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->LRU_list_len,        \
+			                (cache_ptr)->LRU_list_size,       \
+			                (entry_ptr)->size,                \
+					(new_size));                      \
+                                                                          \
+        /* Similarly, update the size of the clean or dirty LRU list as   \
+	 * appropriate.  At present, the entry must be clean, but that    \
+	 * could change.                                                  \
+         */                                                               \
+                                                                          \
+        if ( (entry_ptr)->is_dirty ) {                                    \
+                                                                          \
+	    H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->dLRU_list_len,   \
+			                    (cache_ptr)->dLRU_list_size,  \
+			                    (entry_ptr)->size,            \
+					    (new_size));                  \
+                                                                          \
+        } else {                                                          \
+                                                                          \
+	    H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->cLRU_list_len,   \
+			                    (cache_ptr)->cLRU_list_size,  \
+			                    (entry_ptr)->size,            \
+					    (new_size));                  \
+        }                                                                 \
+                                                                          \
+        /* End modified LRU specific code. */                             \
+    }                                                                     \
+                                                                          \
+} /* H5C__UPDATE_RP_FOR_SIZE_CHANGE */
+
+#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+
+#define H5C__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, entry_ptr, new_size)    \
+{                                                                         \
+    HDassert( (cache_ptr) );                                              \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                   \
+    HDassert( (entry_ptr) );                                              \
+    HDassert( !((entry_ptr)->is_protected) );                             \
+    HDassert( !((entry_ptr)->is_read_only) );                             \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                         \
+    HDassert( (entry_ptr)->size > 0 );                                    \
+    HDassert( new_size > 0 );                                             \
+				  					  \
+    if ( (entry_ptr)->is_pinned ) {                                       \
+                                                                          \
+	H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->pel_len,             \
+			                (cache_ptr)->pel_size,            \
+			                (entry_ptr)->size,                \
+					(new_size));                      \
+                                                                          \
+    } else {                                                              \
+                                                                          \
+        /* modified LRU specific code */                                  \
+                                                                          \
+	/* Update the size of the LRU list */                             \
+                                                                          \
+	H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->LRU_list_len,        \
+			                (cache_ptr)->LRU_list_size,       \
+			                (entry_ptr)->size,                \
+					(new_size));                      \
+                                                                          \
+        /* End modified LRU specific code. */                             \
+    }                                                                     \
+                                                                          \
+} /* H5C__UPDATE_RP_FOR_SIZE_CHANGE */
 
 #endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
 
 

 /*-------------------------------------------------------------------------
  *
- * Macro:	H5C__UPDATE_RP_FOR_FLUSH
+ * Macro:	H5C__UPDATE_RP_FOR_UNPIN
  *
- * Purpose:     Update the replacement policy data structures for a flush
- *		of the specified cache entry.
+ * Purpose:     Update the replacement policy data structures for an
+ *		unpin of the specified cache entry.
+ *
+ *		To do this, unlink the specified entry from the protected
+ *		entry list, and re-insert it in the data structures used
+ *		by the current replacement policy.
  *
  *		At present, we only support the modified LRU policy, so
  *		this function deals with that case unconditionally.  If
- *		we ever support other replacement policies, the function
+ *		we ever support other replacement policies, the macro
  *		should switch on the current policy and act accordingly.
  *
  * Return:      N/A
  *
- * Programmer:  John Mainzer, 5/6/04
+ * Programmer:  John Mainzer, 3/22/06
  *
  * Modifications:
  *
- *		JRM - 7/27/04
- *		Converted the function H5C_update_rp_for_flush() to the
- *		macro H5C__UPDATE_RP_FOR_FLUSH in an effort to squeeze
- *		a bit more performance out of the cache.
- *
- *		At least for the first cut, I am leaving the comments and
- *		white space in the macro.  If they cause dificulties with
- *		pre-processor, I'll have to remove them.
- *
- *		JRM - 7/28/04
- *		Split macro into two versions, one supporting the clean and
- *		dirty LRU lists, and the other not.  Yet another attempt
- *		at optimization.
- *
- *		JRM - 3/20/06
- *		While pinned entries can be flushed, they don't reside in
- *		the replacement policy data structures when unprotected.
- *		Thus I modified this macro to do nothing if the entry is
- *		pinned.
- *
- *		JRM - 3/28/07
+ *		JRM -- 3/28/07
  *		Added sanity checks based on the new is_read_only and
  *		ro_ref_count fields of struct H5C_cache_entry_t.
  *
@@ -2645,109 +2647,108 @@ if ( (cache_ptr)->index_size !=                                             \
 
 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
 
-#define H5C__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, fail_val)            \
-{                                                                           \
-    HDassert( (cache_ptr) );                                                \
-    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                     \
-    HDassert( (entry_ptr) );                                                \
-    HDassert( !((entry_ptr)->is_protected) );                               \
-    HDassert( !((entry_ptr)->is_read_only) );                               \
-    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                           \
-    HDassert( (entry_ptr)->size > 0 );                                      \
-                                                                            \
-    if ( ! ((entry_ptr)->is_pinned) ) {                                     \
-                                                                            \
-        /* modified LRU specific code */                                    \
-                                                                            \
-        /* remove the entry from the LRU list, and re-insert it at the      \
-	 * head.                                                            \
-	 */                                                                 \
-                                                                            \
-        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,             \
-                        (cache_ptr)->LRU_tail_ptr,                          \
-			(cache_ptr)->LRU_list_len,                          \
-                        (cache_ptr)->LRU_list_size, (fail_val))             \
-                                                                            \
-        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,            \
-                         (cache_ptr)->LRU_tail_ptr,                         \
-			 (cache_ptr)->LRU_list_len,                         \
-                         (cache_ptr)->LRU_list_size, (fail_val))            \
-                                                                            \
-        /* since the entry is being flushed or cleared, one would think     \
-	 * that it must be dirty -- but that need not be the case.  Use the \
-	 * dirty flag to infer whether the entry is on the clean or dirty   \
-	 * LRU list, and remove it.  Then insert it at the head of the      \
-	 * clean LRU list.                                                  \
-         *                                                                  \
-         * The function presumes that a dirty entry will be either cleared  \
-	 * or flushed shortly, so it is OK if we put a dirty entry on the   \
-	 * clean LRU list.                                                  \
-         */                                                                 \
-                                                                            \
-        if ( (entry_ptr)->is_dirty ) {                                      \
-            H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr,    \
-                                (cache_ptr)->dLRU_tail_ptr,                 \
-                                (cache_ptr)->dLRU_list_len,                 \
-                                (cache_ptr)->dLRU_list_size, (fail_val))    \
-        } else {                                                            \
-            H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr,    \
-                                (cache_ptr)->cLRU_tail_ptr,                 \
-                                (cache_ptr)->cLRU_list_len,                 \
-                                (cache_ptr)->cLRU_list_size, (fail_val))    \
-        }                                                                   \
-                                                                            \
-        H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr,       \
-                             (cache_ptr)->cLRU_tail_ptr,                    \
-                             (cache_ptr)->cLRU_list_len,                    \
-                             (cache_ptr)->cLRU_list_size, (fail_val))       \
-                                                                            \
-        /* End modified LRU specific code. */                               \
-    }                                                                       \
-} /* H5C__UPDATE_RP_FOR_FLUSH */
+#define H5C__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, fail_val)       \
+{                                                                      \
+    HDassert( (cache_ptr) );                                           \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                \
+    HDassert( (entry_ptr) );                                           \
+    HDassert( !((entry_ptr)->is_protected) );                          \
+    HDassert( !((entry_ptr)->is_read_only) );                          \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                      \
+    HDassert( (entry_ptr)->is_pinned);                                 \
+    HDassert( (entry_ptr)->size > 0 );                                 \
+                                                                       \
+    /* Regardless of the replacement policy, remove the entry from the \
+     * pinned entry list.                                              \
+     */                                                                \
+    H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr,            \
+                    (cache_ptr)->pel_tail_ptr, (cache_ptr)->pel_len,   \
+                    (cache_ptr)->pel_size, (fail_val))                 \
+    HDassert( (cache_ptr)->pel_len >= 0 );                             \
+                                                                       \
+        /* modified LRU specific code */                               \
+                                                                       \
+        /* insert the entry at the head of the LRU list. */            \
+                                                                       \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,       \
+                         (cache_ptr)->LRU_tail_ptr,                    \
+                         (cache_ptr)->LRU_list_len,                    \
+                         (cache_ptr)->LRU_list_size, (fail_val))       \
+                                                                       \
+        /* Similarly, insert the entry at the head of either the clean \
+         * or dirty LRU list as appropriate.                           \
+         */                                                            \
+                                                                       \
+        if ( (entry_ptr)->is_dirty ) {                                 \
+                                                                       \
+            H5C__AUX_DLL_PREPEND((entry_ptr),                          \
+			          (cache_ptr)->dLRU_head_ptr,          \
+                                  (cache_ptr)->dLRU_tail_ptr,          \
+                                  (cache_ptr)->dLRU_list_len,          \
+                                  (cache_ptr)->dLRU_list_size,         \
+			          (fail_val))                          \
+                                                                       \
+        } else {                                                       \
+                                                                       \
+            H5C__AUX_DLL_PREPEND((entry_ptr),                          \
+			          (cache_ptr)->cLRU_head_ptr,          \
+                                  (cache_ptr)->cLRU_tail_ptr,          \
+                                  (cache_ptr)->cLRU_list_len,          \
+                                  (cache_ptr)->cLRU_list_size,         \
+			          (fail_val))                          \
+         }                                                             \
+                                                                       \
+        /* End modified LRU specific code. */                          \
+                                                                       \
+} /* H5C__UPDATE_RP_FOR_UNPIN */
 
 #else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
 
-#define H5C__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, fail_val)            \
-{                                                                           \
-    HDassert( (cache_ptr) );                                                \
-    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                     \
-    HDassert( (entry_ptr) );                                                \
-    HDassert( !((entry_ptr)->is_protected) );                               \
-    HDassert( !((entry_ptr)->is_read_only) );                               \
-    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                           \
-    HDassert( (entry_ptr)->size > 0 );                                      \
-                                                                            \
-    if ( ! ((entry_ptr)->is_pinned) ) {                                     \
-                                                                            \
-        /* modified LRU specific code */                                    \
-                                                                            \
-        /* remove the entry from the LRU list, and re-insert it at the      \
-	 * head.                                                            \
-	 */                                                                 \
-                                                                            \
-        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,             \
-                        (cache_ptr)->LRU_tail_ptr,                          \
-			(cache_ptr)->LRU_list_len,                          \
-                        (cache_ptr)->LRU_list_size, (fail_val))             \
-                                                                            \
-        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,            \
-                         (cache_ptr)->LRU_tail_ptr,                         \
-			 (cache_ptr)->LRU_list_len,                         \
-                         (cache_ptr)->LRU_list_size, (fail_val))            \
-                                                                            \
-        /* End modified LRU specific code. */                               \
-    }                                                                       \
-} /* H5C__UPDATE_RP_FOR_FLUSH */
+#define H5C__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, fail_val)       \
+{                                                                      \
+    HDassert( (cache_ptr) );                                           \
+    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                \
+    HDassert( (entry_ptr) );                                           \
+    HDassert( !((entry_ptr)->is_protected) );                          \
+    HDassert( !((entry_ptr)->is_read_only) );                          \
+    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                      \
+    HDassert( (entry_ptr)->is_pinned);                                 \
+    HDassert( (entry_ptr)->size > 0 );                                 \
+                                                                       \
+    /* Regardless of the replacement policy, remove the entry from the \
+     * pinned entry list.                                              \
+     */                                                                \
+    H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr,            \
+                    (cache_ptr)->pel_tail_ptr, (cache_ptr)->pel_len,   \
+                    (cache_ptr)->pel_size, (fail_val))                 \
+    HDassert( (cache_ptr)->pel_len >= 0 );                             \
+                                                                       \
+        /* modified LRU specific code */                               \
+                                                                       \
+        /* insert the entry at the head of the LRU list. */            \
+                                                                       \
+        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,       \
+                         (cache_ptr)->LRU_tail_ptr,                    \
+                         (cache_ptr)->LRU_list_len,                    \
+                         (cache_ptr)->LRU_list_size, (fail_val))       \
+                                                                       \
+        /* End modified LRU specific code. */                          \
+                                                                       \
+} /* H5C__UPDATE_RP_FOR_UNPIN */
 
 #endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
 
 

 /*-------------------------------------------------------------------------
  *
- * Macro:	H5C__UPDATE_RP_FOR_INSERTION
+ * Macro:	H5C__UPDATE_RP_FOR_UNPROTECT
  *
  * Purpose:     Update the replacement policy data structures for an
- *		insertion of the specified cache entry.
+ *		unprotect of the specified cache entry.
+ *
+ *		To do this, unlink the specified entry from the protected
+ *		list, and re-insert it in the data structures used by the
+ *		current replacement policy.
  *
  *		At present, we only support the modified LRU policy, so
  *		this function deals with that case unconditionally.  If
@@ -2756,14 +2757,14 @@ if ( (cache_ptr)->index_size !=                                             \
  *
  * Return:      N/A
  *
- * Programmer:  John Mainzer, 5/17/04
+ * Programmer:  John Mainzer, 5/19/04
  *
  * Modifications:
  *
  *		JRM - 7/27/04
- *		Converted the function H5C_update_rp_for_insertion() to the
- *		macro H5C__UPDATE_RP_FOR_INSERTION in an effort to squeeze
- *		a bit more performance out of the cache.
+ *		Converted the function H5C_update_rp_for_unprotect() to
+ *		the macro H5C__UPDATE_RP_FOR_UNPROTECT in an effort to
+ *		squeeze a bit more performance out of the cache.
  *
  *		At least for the first cut, I am leaving the comments and
  *		white space in the macro.  If they cause dificulties with
@@ -2774,33 +2775,31 @@ if ( (cache_ptr)->index_size !=                                             \
  *		dirty LRU lists, and the other not.  Yet another attempt
  *		at optimization.
  *
- *		JRM - 3/10/06
- *		This macro should never be called on a pinned entry.
- *		Inserted an assert to verify this.
- *
- *		JRM - 8/9/06
- *		Not any more.  We must now allow insertion of pinned
- *		entries.  Updated macro to support this.
- *
- *		JRM - 3/28/07
- *		Added sanity checks using the new is_read_only and
- *		ro_ref_count fields of struct H5C_cache_entry_t.
+ *		JRM - 3/17/06
+ *		Modified macro to put pinned entries on the pinned entry
+ *		list instead of inserting them in the data structures
+ *		maintained by the replacement policy.
  *
  *-------------------------------------------------------------------------
  */
 
 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
 
-#define H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, fail_val)       \
+#define H5C__UPDATE_RP_FOR_UNPROTECT(cache_ptr, entry_ptr, fail_val)       \
 {                                                                          \
     HDassert( (cache_ptr) );                                               \
     HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                    \
     HDassert( (entry_ptr) );                                               \
-    HDassert( !((entry_ptr)->is_protected) );                              \
-    HDassert( !((entry_ptr)->is_read_only) );                              \
-    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                          \
+    HDassert( (entry_ptr)->is_protected);                                  \
     HDassert( (entry_ptr)->size > 0 );                                     \
                                                                            \
+    /* Regardless of the replacement policy, remove the entry from the     \
+     * protected list.                                                     \
+     */                                                                    \
+    H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pl_head_ptr,                 \
+                    (cache_ptr)->pl_tail_ptr, (cache_ptr)->pl_len,         \
+                    (cache_ptr)->pl_size, (fail_val))                      \
+                                                                           \
     if ( (entry_ptr)->is_pinned ) {                                        \
                                                                            \
         H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr,           \
@@ -2816,19 +2815,22 @@ if ( (cache_ptr)->index_size !=                                             \
                                                                            \
         H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,           \
                          (cache_ptr)->LRU_tail_ptr,                        \
-			 (cache_ptr)->LRU_list_len,                        \
+                         (cache_ptr)->LRU_list_len,                        \
                          (cache_ptr)->LRU_list_size, (fail_val))           \
                                                                            \
-        /* insert the entry at the head of the clean or dirty LRU list as  \
-         * appropriate.                                                    \
+        /* Similarly, insert the entry at the head of either the clean or  \
+         * dirty LRU list as appropriate.                                  \
          */                                                                \
                                                                            \
-        if ( entry_ptr->is_dirty ) {                                       \
+        if ( (entry_ptr)->is_dirty ) {                                     \
+                                                                           \
             H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr,  \
                                  (cache_ptr)->dLRU_tail_ptr,               \
                                  (cache_ptr)->dLRU_list_len,               \
                                  (cache_ptr)->dLRU_list_size, (fail_val))  \
+                                                                           \
         } else {                                                           \
+                                                                           \
             H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr,  \
                                  (cache_ptr)->cLRU_tail_ptr,               \
                                  (cache_ptr)->cLRU_list_len,               \
@@ -2837,27 +2839,33 @@ if ( (cache_ptr)->index_size !=                                             \
                                                                            \
         /* End modified LRU specific code. */                              \
     }                                                                      \
-}
+                                                                           \
+} /* H5C__UPDATE_RP_FOR_UNPROTECT */
 
 #else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
 
-#define H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, fail_val)       \
+#define H5C__UPDATE_RP_FOR_UNPROTECT(cache_ptr, entry_ptr, fail_val)       \
 {                                                                          \
     HDassert( (cache_ptr) );                                               \
     HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                    \
     HDassert( (entry_ptr) );                                               \
-    HDassert( !((entry_ptr)->is_protected) );                              \
-    HDassert( !((entry_ptr)->is_read_only) );                              \
-    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                          \
+    HDassert( (entry_ptr)->is_protected);                                  \
     HDassert( (entry_ptr)->size > 0 );                                     \
                                                                            \
+    /* Regardless of the replacement policy, remove the entry from the     \
+     * protected list.                                                     \
+     */                                                                    \
+    H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pl_head_ptr,                 \
+                    (cache_ptr)->pl_tail_ptr, (cache_ptr)->pl_len,         \
+                    (cache_ptr)->pl_size, (fail_val))                      \
+                                                                           \
     if ( (entry_ptr)->is_pinned ) {                                        \
                                                                            \
         H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr,           \
                          (cache_ptr)->pel_tail_ptr,                        \
                          (cache_ptr)->pel_len,                             \
                          (cache_ptr)->pel_size, (fail_val))                \
-	                                                                   \
+                                                                           \
     } else {                                                               \
                                                                            \
         /* modified LRU specific code */                                   \
@@ -2866,701 +2874,1154 @@ if ( (cache_ptr)->index_size !=                                             \
                                                                            \
         H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,           \
                          (cache_ptr)->LRU_tail_ptr,                        \
-			 (cache_ptr)->LRU_list_len,                        \
+                         (cache_ptr)->LRU_list_len,                        \
                          (cache_ptr)->LRU_list_size, (fail_val))           \
                                                                            \
         /* End modified LRU specific code. */                              \
     }                                                                      \
-}
+} /* H5C__UPDATE_RP_FOR_UNPROTECT */
 
 #endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
 
-

-/*-------------------------------------------------------------------------
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+/****************************************************************************
+ *
+ * structure H5C_t
+ *
+ * Catchall structure for all variables specific to an instance of the cache.
+ *
+ * While the individual fields of the structure are discussed below, the
+ * following overview may be helpful.
+ *
+ * Entries in the cache are stored in an instance of H5TB_TREE, indexed on
+ * the entry's disk address.  While the H5TB_TREE is less efficient than
+ * hash table, it keeps the entries in address sorted order.  As flushes
+ * in parallel mode are more efficient if they are issued in increasing
+ * address order, this is a significant benefit.  Also the H5TB_TREE code
+ * was readily available, which reduced development time.
+ *
+ * While the cache was designed with multiple replacement policies in mind,
+ * at present only a modified form of LRU is supported.
+ *
+ *                                              JRM - 4/26/04
+ *
+ * Profiling has indicated that searches in the instance of H5TB_TREE are
+ * too expensive.  To deal with this issue, I have augmented the cache
+ * with a hash table in which all entries will be stored.  Given the
+ * advantages of flushing entries in increasing address order, the TBBT
+ * is retained, but only dirty entries are stored in it.  At least for
+ * now, we will leave entries in the TBBT after they are flushed.
+ *
+ * Note that index_size and index_len now refer to the total size of
+ * and number of entries in the hash table.
+ *
+ *						JRM - 7/19/04
+ *
+ * The TBBT has since been replaced with a skip list.  This change
+ * greatly predates this note.
+ *
+ *						JRM - 9/26/05
+ *
+ * magic:	Unsigned 32 bit integer always set to H5C__H5C_T_MAGIC. 
+ * 		This field is used to validate pointers to instances of
+ * 		H5C_t.
+ *
+ * flush_in_progress: Boolean flag indicating whether a flush is in
+ * 		progress.
+ *
+ * trace_file_ptr:  File pointer pointing to the trace file, which is used
+ *              to record cache operations for use in simulations and design
+ *              studies.  This field will usually be NULL, indicating that
+ *              no trace file should be recorded.
+ *
+ *              Since much of the code supporting the parallel metadata
+ *              cache is in H5AC, we don't write the trace file from
+ *              H5C.  Instead, H5AC reads the trace_file_ptr as needed.
+ *
+ *              When we get to using H5C in other places, we may add
+ *              code to write trace file data at the H5C level as well.
+ *
+ * logging_enabled: Boolean flag indicating whether cache logging
+ *              which is used to record cache operations for use in
+ *              debugging and performance analysis. When this flag is set
+ *              to TRUE, it means that the log file is open and ready to
+ *              receive log entries. It does NOT mean that cache operations
+ *              are currently being recorded. That is controlled by the
+ *              currently_logging flag (below).
+ *
+ *              Since much of the code supporting the parallel metadata
+ *              cache is in H5AC, we don't write the trace file from
+ *              H5C.  Instead, H5AC reads the trace_file_ptr as needed.
+ *
+ *              When we get to using H5C in other places, we may add
+ *              code to write trace file data at the H5C level as well.
+ *
+ * currently_logging: Boolean flag that indicates if cache operations are
+ *              currently being logged. This flag is flipped by the
+ *              H5Fstart/stop_mdc_logging functions.
+ *
+ * log_file_ptr:  File pointer pointing to the log file. The I/O functions
+ *              in stdio.h are used to write to the log file regardless of
+ *              the VFD selected.
+ *
+ * aux_ptr:	Pointer to void used to allow wrapper code to associate
+ *		its data with an instance of H5C_t.  The H5C cache code
+ *		sets this field to NULL, and otherwise leaves it alone.
+ *
+ * max_type_id:	Integer field containing the maximum type id number assigned
+ *		to a type of entry in the cache.  All type ids from 0 to
+ *		max_type_id inclusive must be defined.  The names of the
+ *		types are stored in the type_name_table discussed below, and
+ *		indexed by the ids.
+ *
+ * type_name_table_ptr: Pointer to an array of pointer to char of length
+ *              max_type_id + 1.  The strings pointed to by the entries
+ *              in the array are the names of the entry types associated
+ *              with the indexing type IDs.
+ *
+ * max_cache_size:  Nominal maximum number of bytes that may be stored in the
+ *              cache.  This value should be viewed as a soft limit, as the
+ *              cache can exceed this value under the following circumstances:
+ *
+ *              a) All entries in the cache are protected, and the cache is
+ *                 asked to insert a new entry.  In this case the new entry
+ *                 will be created.  If this causes the cache to exceed
+ *                 max_cache_size, it will do so.  The cache will attempt
+ *                 to reduce its size as entries are unprotected.
+ *
+ *              b) When running in parallel mode, the cache may not be
+ *		   permitted to flush a dirty entry in response to a read.
+ *		   If there are no clean entries available to evict, the
+ *		   cache will exceed its maximum size.  Again the cache
+ *                 will attempt to reduce its size to the max_cache_size
+ *                 limit on the next cache write.
+ *
+ *		c) When an entry increases in size, the cache may exceed
+ *		   the max_cache_size limit until the next time the cache
+ *		   attempts to load or insert an entry.
+ *
+ *		d) When the evictions_enabled field is false (see below),
+ *		   the cache size will increase without limit until the
+ *		   field is set to true.
+ *
+ * min_clean_size: Nominal minimum number of clean bytes in the cache.
+ *              The cache attempts to maintain this number of bytes of
+ *              clean data so as to avoid case b) above.  Again, this is
+ *              a soft limit.
+ *
+ *
+ * In addition to the call back functions required for each entry, the
+ * cache requires the following call back functions for this instance of
+ * the cache as a whole:
+ *
+ * check_write_permitted:  In certain applications, the cache may not
+ *		be allowed to write to disk at certain time.  If specified,
+ *		the check_write_permitted function is used to determine if
+ *		a write is permissible at any given point in time.
+ *
+ *		If no such function is specified (i.e. this field is NULL),
+ *		the cache uses the following write_permitted field to
+ *		determine whether writes are permitted.
+ *
+ * write_permitted: If check_write_permitted is NULL, this boolean flag
+ *		indicates whether writes are permitted.
+ *
+ * log_flush:	If provided, this function is called whenever a dirty
+ *		entry is flushed to disk.
+ *
+ *
+ * In cases where memory is plentiful, and performance is an issue, it may
+ * be useful to disable all cache evictions, and thereby postpone metadata
+ * writes.  The following field is used to implement this.
+ *
+ * evictions_enabled:  Boolean flag that is initialized to TRUE.  When
+ * 		this flag is set to FALSE, the metadata cache will not
+ * 		attempt to evict entries to make space for newly protected
+ * 		entries, and instead the will grow without limit.
+ * 		
+ * 		Needless to say, this feature must be used with care.
+ *
+ *
+ * The cache requires an index to facilitate searching for entries.  The
+ * following fields support that index.
+ *
+ * index_len:   Number of entries currently in the hash table used to index
+ *		the cache.
+ *
+ * index_size:  Number of bytes of cache entries currently stored in the
+ *              hash table used to index the cache.
+ *
+ *              This value should not be mistaken for footprint of the
+ *              cache in memory.  The average cache entry is small, and
+ *              the cache has a considerable overhead.  Multiplying the
+ *              index_size by three should yield a conservative estimate
+ *              of the cache's memory footprint.
+ *
+ * index_ring_len: Array of integer of length H5C_RING_NTYPES used to 
+ *		maintain a count of entries in the index by ring.  Note 
+ *		that the sum of all the cells in this array must equal 
+ *		the value stored in index_len above.
+ *
+ * index_ring_size: Array of size_t of length H5C_RING_NTYPES used to 
+ *		maintain the sum of the sizes of all entries in the index
+ *		by ring.  Note that the sum of all cells in this array must
+ *		equal the value stored in index_size above.
+ *
+ * clean_index_size: Number of bytes of clean entries currently stored in
+ * 		the hash table.  Note that the index_size field (above)
+ *		is also the sum of the sizes of all entries in the cache.
+ *		Thus we should have the invariant that clean_index_size +
+ *		dirty_index_size == index_size.
+ *
+ *		WARNING:
+ *
+ *		   The value of the clean_index_size must not be mistaken
+ *		   for the current clean size of the cache.  Rather, the
+ *		   clean size of the cache is the current value of
+ *		   clean_index_size plus the amount of empty space (if any)
+ *                 in the cache.
+ *
+ * clean_index_ring_size: Array of size_t of length H5C_RING_NTYPES used to
+ *		maintain the sum of the sizes of all clean entries in the 
+ *		index by ring.  Note that the sum of all cells in this array 
+ *		must equal the value stored in clean_index_size above.
+ *
+ * dirty_index_size: Number of bytes of dirty entries currently stored in
+ * 		the hash table.  Note that the index_size field (above)
+ *		is also the sum of the sizes of all entries in the cache.
+ *		Thus we should have the invariant that clean_index_size +
+ *		dirty_index_size == index_size.
+ *
+ * dirty_index_ring_size: Array of size_t of length H5C_RING_NTYPES used to
+ *		maintain the sum of the sizes of all dirty entries in the 
+ *		index by ring.  Note that the sum of all cells in this array 
+ *		must equal the value stored in dirty_index_size above.
+ *
+ * index:	Array of pointer to H5C_cache_entry_t of size
+ *		H5C__HASH_TABLE_LEN.  At present, this value is a power
+ *		of two, not the usual prime number.
+ *
+ *		I hope that the variable size of cache elements, the large
+ *		hash table size, and the way in which HDF5 allocates space
+ *		will combine to avoid problems with periodicity.  If so, we
+ *		can use a trivial hash function (a bit-and and a 3 bit left
+ *		shift) with some small savings.
+ *
+ *		If not, it will become evident in the statistics. Changing
+ *		to the usual prime number length hash table will require
+ *		changing the H5C__HASH_FCN macro and the deletion of the
+ *		H5C__HASH_MASK #define.  No other changes should be required.
+ *
+ * With the addition of the take ownership flag, it is possible that 
+ * an entry may be removed from the cache as the result of the flush of 
+ * a second entry.  In general, this causes little trouble, but it is 
+ * possible that the entry removed may be the next entry in the scan of 
+ * a list.  In this case, we must be able to detect the fact that the 
+ * entry has been removed, so that the scan doesn't attempt to proceed with
+ * an entry that is no longer in the cache.
+ *
+ * The following fields are maintained to facilitate this.
+ *
+ * entries_removed_counter:	Counter that is incremented each time an
+ *		entry is removed from the cache by any means (eviction, 
+ *		expungement, or take ownership at this point in time).
+ *		Functions that perform scans on lists may set this field
+ *		to zero prior to calling H5C_flush_single_entry().  
+ *		Unexpected changes to the counter indicate that an entry 
+ *		was removed from the cache as a side effect of the flush.
+ *
+ * last_entry_removed_ptr:	Pointer to the instance of H5C_cache_entry_t
+ *		which contained the last entry to be removed from the cache,
+ *		or NULL if there either is no such entry, or if a function
+ *		performing a scan of a list has set this field to NULL prior
+ *		to calling H5C_flush_single_entry().
+ *
+ *		WARNING!!! This field must NEVER be dereferenced.  It is 
+ *		maintained to allow functions that perform scans of lists
+ *		to compare this pointer with their pointers to next, thus
+ *		allowing them to avoid unnecessary restarts of scans if the
+ *		pointers don't match, and if entries_removed_counter is 
+ *		one.
+ *
+ *
+ * With the addition of cache entry tagging, it is possible that 
+ * an entry may be inserted into the cache without a tag during testing
+ * and the tag's validity shouldn't be checked.
+ *
+ * The following field is maintained to facilitate this.
+ *
+ * ignore_tags:	Boolean flag to disable tag validation during entry insertion.
+ *
+ * When we flush the cache, we need to write entries out in increasing
+ * address order.  An instance of a skip list is used to store dirty entries in
+ * sorted order.  Whether it is cheaper to sort the dirty entries as needed,
+ * or to maintain the list is an open question.  At a guess, it depends
+ * on how frequently the cache is flushed.  We will see how it goes.
+ *
+ * For now at least, I will not remove dirty entries from the list as they
+ * are flushed. (this has been changed -- dirty entries are now removed from
+ * the skip list as they are flushed.  JRM - 10/25/05)
+ *
+ * slist_changed: Boolean flag used to indicate whether the contents of 
+ *		the slist has changed since the last time this flag was
+ *		reset.  This is used in the cache flush code to detect 
+ *		conditions in which pre-serialize or serialize callbacks
+ *		have modified the slist -- which obliges us to restart 
+ *		the scan of the slist from the beginning.
+ *
+ * slist_change_in_pre_serialize: Boolean flag used to indicate that 
+ *		a pre_serialize call has modified the slist since the 
+ *		last time this flag was reset.
+ *
+ * slist_change_in_serialize: Boolean flag used to indicate that 
+ *		a serialize call has modified the slist since the 
+ *		last time this flag was reset.
+ *
+ * slist_len:   Number of entries currently in the skip list
+ *              used to maintain a sorted list of dirty entries in the
+ *              cache.
  *
- * Macro:	H5C__UPDATE_RP_FOR_PROTECT
+ * slist_size:  Number of bytes of cache entries currently stored in the
+ *              skip list used to maintain a sorted list of
+ *              dirty entries in the cache.
  *
- * Purpose:     Update the replacement policy data structures for a
- *		protect of the specified cache entry.
+ * slist_ring_len: Array of integer of length H5C_RING_NTYPES used to 
+ *		maintain a count of entries in the slist by ring.  Note 
+ *		that the sum of all the cells in this array must equal 
+ *		the value stored in slist_len above.
  *
- *		To do this, unlink the specified entry from any data
- *		structures used by the replacement policy, and add the
- *		entry to the protected list.
+ * slist_ring_size: Array of size_t of length H5C_RING_NTYPES used to
+ *              maintain the sum of the sizes of all entries in the 
+ *		slist by ring.  Note that the sum of all cells in this 
+ *		array must equal the value stored in slist_size above.
  *
- *		At present, we only support the modified LRU policy, so
- *		this function deals with that case unconditionally.  If
- *		we ever support other replacement policies, the function
- *		should switch on the current policy and act accordingly.
+ * slist_ptr:   pointer to the instance of H5SL_t used maintain a sorted
+ *              list of dirty entries in the cache.  This sorted list has
+ *              two uses:
  *
- * Return:      N/A
+ *              a) It allows us to flush dirty entries in increasing address
+ *                 order, which results in significant savings.
  *
- * Programmer:  John Mainzer, 5/17/04
+ *              b) It facilitates checking for adjacent dirty entries when
+ *                 attempting to evict entries from the cache.  While we
+ *                 don't use this at present, I hope that this will allow
+ *                 some optimizations when I get to it.
  *
- * Modifications:
+ * num_last_entries: The number of entries in the cache that can only be
+ *		flushed after all other entries in the cache have
+ *              been flushed. At this time, this will only ever be
+ *              one entry (the superblock), and the code has been
+ *              protected with HDasserts to enforce this. This restraint
+ *              can certainly be relaxed in the future if the need for
+ *              multiple entries being flushed last arises, though
+ *              explicit tests for that case should be added when said
+ *              HDasserts are removed.
+ *
+ *		Update: There are now two possible last entries
+ *		(superblock and file driver info message).  This
+ *		number will probably increase as we add superblock
+ *		messages.   JRM -- 11/18/14
  *
- *		JRM - 7/27/04
- *		Converted the function H5C_update_rp_for_protect() to the
- *		macro H5C__UPDATE_RP_FOR_PROTECT in an effort to squeeze
- *		a bit more performance out of the cache.
+ * With the addition of the fractal heap, the cache must now deal with
+ * the case in which entries may be dirtied, moved, or have their sizes
+ * changed during a flush.  To allow sanity checks in this situation, the
+ * following two fields have been added.  They are only compiled in when
+ * H5C_DO_SANITY_CHECKS is TRUE.
  *
- *		At least for the first cut, I am leaving the comments and
- *		white space in the macro.  If they cause dificulties with
- *		pre-processor, I'll have to remove them.
+ * slist_len_increase: Number of entries that have been added to the
+ * 		slist since the last time this field was set to zero.
+ *		Note that this value can be negative.
  *
- *		JRM - 7/28/04
- *		Split macro into two version, one supporting the clean and
- *		dirty LRU lists, and the other not.  Yet another attempt
- *		at optimization.
+ * slist_size_increase: Total size of all entries that have been added
+ * 		to the slist since the last time this field was set to
+ * 		zero.  Note that this value can be negative.
  *
- *		JRM - 3/17/06
- *		Modified macro to attempt to remove pinned entriese from
- *		the pinned entry list instead of from the data structures
- *		maintained by the replacement policy.
+ * cork_list_ptr: A skip list to track object addresses that are corked.
+ *                When an entry is inserted or protected in the cache,
+ *                the entry's associated object address (tag field) is
+ *                checked against this skip list.  If found, the entry
+ *                is corked.
  *
- *		JRM - 3/28/07
- *		Added sanity checks based on the new is_read_only and
- *		ro_ref_count fields of struct H5C_cache_entry_t.
+ * When a cache entry is protected, it must be removed from the LRU
+ * list(s) as it cannot be either flushed or evicted until it is unprotected.
+ * The following fields are used to implement the protected list (pl).
  *
- *-------------------------------------------------------------------------
- */
-
-#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
-
-#define H5C__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, fail_val)        \
-{                                                                         \
-    HDassert( (cache_ptr) );                                              \
-    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                   \
-    HDassert( (entry_ptr) );                                              \
-    HDassert( !((entry_ptr)->is_protected) );                             \
-    HDassert( !((entry_ptr)->is_read_only) );                             \
-    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                         \
-    HDassert( (entry_ptr)->size > 0 );                                    \
-									  \
-    if ( (entry_ptr)->is_pinned ) {                                       \
-                                                                          \
-        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr,           \
-                        (cache_ptr)->pel_tail_ptr, 			  \
-			(cache_ptr)->pel_len,                             \
-                        (cache_ptr)->pel_size, (fail_val))                \
-        HDassert( (cache_ptr)->pel_len >= 0 );                            \
-                                                                          \
-    } else {                                                              \
-                                                                          \
-        /* modified LRU specific code */                                  \
-                                                                          \
-        /* remove the entry from the LRU list. */                         \
-                                                                          \
-        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,           \
-                        (cache_ptr)->LRU_tail_ptr,                        \
-			(cache_ptr)->LRU_list_len,                        \
-                        (cache_ptr)->LRU_list_size, (fail_val))           \
-                                                                          \
-        /* Similarly, remove the entry from the clean or dirty LRU list   \
-         * as appropriate.                                                \
-         */                                                               \
-                                                                          \
-        if ( (entry_ptr)->is_dirty ) {                                    \
-                                                                          \
-            H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->dLRU_head_ptr,  \
-                                (cache_ptr)->dLRU_tail_ptr,               \
-                                (cache_ptr)->dLRU_list_len,               \
-                                (cache_ptr)->dLRU_list_size, (fail_val))  \
-                                                                          \
-        } else {                                                          \
-                                                                          \
-            H5C__AUX_DLL_REMOVE((entry_ptr), (cache_ptr)->cLRU_head_ptr,  \
-                                (cache_ptr)->cLRU_tail_ptr,               \
-                                (cache_ptr)->cLRU_list_len,               \
-                                (cache_ptr)->cLRU_list_size, (fail_val))  \
-        }                                                                 \
-                                                                          \
-        /* End modified LRU specific code. */                             \
-    }                                                                     \
-                                                                          \
-    /* Regardless of the replacement policy, or whether the entry is      \
-     * pinned, now add the entry to the protected list.                   \
-     */                                                                   \
-                                                                          \
-    H5C__DLL_APPEND((entry_ptr), (cache_ptr)->pl_head_ptr,                \
-                    (cache_ptr)->pl_tail_ptr,                             \
-                    (cache_ptr)->pl_len,                                  \
-                    (cache_ptr)->pl_size, (fail_val))                     \
-} /* H5C__UPDATE_RP_FOR_PROTECT */
-
-#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
-
-#define H5C__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, fail_val)        \
-{                                                                         \
-    HDassert( (cache_ptr) );                                              \
-    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                   \
-    HDassert( (entry_ptr) );                                              \
-    HDassert( !((entry_ptr)->is_protected) );                             \
-    HDassert( !((entry_ptr)->is_read_only) );                             \
-    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                         \
-    HDassert( (entry_ptr)->size > 0 );                                    \
-									  \
-    if ( (entry_ptr)->is_pinned ) {                                       \
-                                                                          \
-        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr,           \
-                        (cache_ptr)->pel_tail_ptr, 			  \
-			(cache_ptr)->pel_len,                             \
-                        (cache_ptr)->pel_size, (fail_val))                \
-        HDassert( (cache_ptr)->pel_len >= 0 );                            \
-                                                                          \
-    } else {                                                              \
-                                                                          \
-        /* modified LRU specific code */                                  \
-                                                                          \
-        /* remove the entry from the LRU list. */                         \
-                                                                          \
-        H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,           \
-                        (cache_ptr)->LRU_tail_ptr,                        \
-			(cache_ptr)->LRU_list_len,                        \
-                        (cache_ptr)->LRU_list_size, (fail_val))           \
-                                                                          \
-        /* End modified LRU specific code. */                             \
-    }                                                                     \
-                                                                          \
-    /* Regardless of the replacement policy, or whether the entry is      \
-     * pinned, now add the entry to the protected list.                   \
-     */                                                                   \
-                                                                          \
-    H5C__DLL_APPEND((entry_ptr), (cache_ptr)->pl_head_ptr,                \
-                    (cache_ptr)->pl_tail_ptr,                             \
-                    (cache_ptr)->pl_len,                                  \
-                    (cache_ptr)->pl_size, (fail_val))                     \
-} /* H5C__UPDATE_RP_FOR_PROTECT */
-
-#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
-
-

-/*-------------------------------------------------------------------------
+ * pl_len:      Number of entries currently residing on the protected list.
+ *
+ * pl_size:     Number of bytes of cache entries currently residing on the
+ *              protected list.
+ *
+ * pl_head_ptr: Pointer to the head of the doubly linked list of protected
+ *              entries.  Note that cache entries on this list are linked
+ *              by their next and prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ * pl_tail_ptr: Pointer to the tail of the doubly linked list of protected
+ *              entries.  Note that cache entries on this list are linked
+ *              by their next and prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ *
+ * For very frequently used entries, the protect/unprotect overhead can
+ * become burdensome.  To avoid this overhead, I have modified the cache
+ * to allow entries to be "pinned".  A pinned entry is similar to a
+ * protected entry, in the sense that it cannot be evicted, and that
+ * the entry can be modified at any time.
+ *
+ * Pinning an entry has the following implications:
+ *
+ *	1) A pinned entry cannot be evicted.  Thus unprotected
+ *         pinned entries reside in the pinned entry list, instead
+ *         of the LRU list(s) (or other lists maintained by the current
+ *         replacement policy code).
+ *
+ *      2) A pinned entry can be accessed or modified at any time.
+ *         This places an additional burden on the associated pre-serialize
+ *	   and serialize callbacks, which must ensure the the entry is in 
+ *	   a consistant state before creating an image of it.
+ *
+ *      3) A pinned entry can be marked as dirty (and possibly
+ *         change size) while it is unprotected.
+ *
+ *      4) The flush-destroy code must allow pinned entries to
+ *         be unpinned (and possibly unprotected) during the
+ *         flush.
+ *
+ * Since pinned entries cannot be evicted, they must be kept on a pinned
+ * entry list (pel), instead of being entrusted to the replacement policy 
+ * code.
+ *
+ * Maintaining the pinned entry list requires the following fields:
+ *
+ * pel_len:	Number of entries currently residing on the pinned
+ * 		entry list.
+ *
+ * pel_size:	Number of bytes of cache entries currently residing on
+ * 		the pinned entry list.
+ *
+ * pel_head_ptr: Pointer to the head of the doubly linked list of pinned
+ * 		but not protected entries.  Note that cache entries on
+ * 		this list are linked by their next and prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ * pel_tail_ptr: Pointer to the tail of the doubly linked list of pinned
+ * 		but not protected entries.  Note that cache entries on
+ * 		this list are linked by their next and prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ *
+ * The cache must have a replacement policy, and the fields supporting this
+ * policy must be accessible from this structure.
+ *
+ * While there has been interest in several replacement policies for
+ * this cache, the initial development schedule is tight.  Thus I have
+ * elected to support only a modified LRU (least recently used) policy 
+ * for the first cut.
+ *
+ * To further simplify matters, I have simply included the fields needed
+ * by the modified LRU in this structure.  When and if we add support for
+ * other policies, it will probably be easiest to just add the necessary
+ * fields to this structure as well -- we only create one instance of this
+ * structure per file, so the overhead is not excessive.
+ *
+ *
+ * Fields supporting the modified LRU policy:
+ *
+ * See most any OS text for a discussion of the LRU replacement policy.
+ *
+ * When operating in parallel mode, we must ensure that a read does not
+ * cause a write.  If it does, the process will hang, as the write will
+ * be collective and the other processes will not know to participate.
+ *
+ * To deal with this issue, I have modified the usual LRU policy by adding
+ * clean and dirty LRU lists to the usual LRU list.  In general, these 
+ * lists are only exist in parallel builds.
  *
- * Macro:	H5C__UPDATE_RP_FOR_MOVE
+ * The clean LRU list is simply the regular LRU list with all dirty cache
+ * entries removed.
  *
- * Purpose:     Update the replacement policy data structures for a
- *		move of the specified cache entry.
+ * Similarly, the dirty LRU list is the regular LRU list with all the clean
+ * cache entries removed.
  *
- *		At present, we only support the modified LRU policy, so
- *		this function deals with that case unconditionally.  If
- *		we ever support other replacement policies, the function
- *		should switch on the current policy and act accordingly.
+ * When reading in parallel mode, we evict from the clean LRU list only.
+ * This implies that we must try to ensure that the clean LRU list is
+ * reasonably well stocked at all times.
  *
- * Return:      N/A
+ * We attempt to do this by trying to flush enough entries on each write
+ * to keep the cLRU_list_size >= min_clean_size.
  *
- * Programmer:  John Mainzer, 5/17/04
+ * Even if we start with a completely clean cache, a sequence of protects
+ * without unprotects can empty the clean LRU list.  In this case, the
+ * cache must grow temporarily.  At the next sync point, we will attempt to
+ * evict enough entries to reduce index_size to less than max_cache_size.
+ * While this will usually be possible, all bets are off if enough entries
+ * are protected.
  *
- *-------------------------------------------------------------------------
- */
-
-#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
-
-#define H5C__UPDATE_RP_FOR_MOVE(cache_ptr, entry_ptr, was_dirty, fail_val) \
-{                                                                            \
-    HDassert( (cache_ptr) );                                                 \
-    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                      \
-    HDassert( (entry_ptr) );                                                 \
-    HDassert( !((entry_ptr)->is_protected) );                                \
-    HDassert( !((entry_ptr)->is_read_only) );                                \
-    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                            \
-    HDassert( (entry_ptr)->size > 0 );                                       \
-                                                                             \
-    if ( ! ( (entry_ptr)->is_pinned ) ) {                                    \
-	                                                                     \
-        /* modified LRU specific code */                                     \
-                                                                             \
-        /* remove the entry from the LRU list, and re-insert it at the head. \
-	 */                                                                  \
-                                                                             \
-            H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,          \
-                             (cache_ptr)->LRU_tail_ptr,                      \
-			     (cache_ptr)->LRU_list_len,                      \
-                             (cache_ptr)->LRU_list_size, (fail_val))         \
-                                                                             \
-        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,             \
-                         (cache_ptr)->LRU_tail_ptr,                          \
-			 (cache_ptr)->LRU_list_len,                          \
-                         (cache_ptr)->LRU_list_size, (fail_val))             \
-                                                                             \
-            /* remove the entry from either the clean or dirty LUR list as   \
-             * indicated by the was_dirty parameter                          \
-             */                                                              \
-            if ( was_dirty ) {                                               \
-                                                                             \
-                H5C__AUX_DLL_REMOVE((entry_ptr),                             \
-				     (cache_ptr)->dLRU_head_ptr,             \
-                                     (cache_ptr)->dLRU_tail_ptr,             \
-                                     (cache_ptr)->dLRU_list_len,             \
-                                     (cache_ptr)->dLRU_list_size,            \
-				     (fail_val))                             \
-                                                                             \
-            } else {                                                         \
-                                                                             \
-                H5C__AUX_DLL_REMOVE((entry_ptr),                             \
-				     (cache_ptr)->cLRU_head_ptr,             \
-                                     (cache_ptr)->cLRU_tail_ptr,             \
-                                     (cache_ptr)->cLRU_list_len,             \
-                                     (cache_ptr)->cLRU_list_size,            \
-				     (fail_val))                             \
-            }                                                                \
-                                                                             \
-            /* insert the entry at the head of either the clean or dirty     \
-	     * LRU list as appropriate.                                      \
-             */                                                              \
-                                                                             \
-            if ( (entry_ptr)->is_dirty ) {                                   \
-                                                                             \
-                H5C__AUX_DLL_PREPEND((entry_ptr),                            \
-				      (cache_ptr)->dLRU_head_ptr,            \
-                                      (cache_ptr)->dLRU_tail_ptr,            \
-                                      (cache_ptr)->dLRU_list_len,            \
-                                      (cache_ptr)->dLRU_list_size,           \
-				      (fail_val))                            \
-                                                                             \
-            } else {                                                         \
-                                                                             \
-                H5C__AUX_DLL_PREPEND((entry_ptr),                            \
-				      (cache_ptr)->cLRU_head_ptr,            \
-                                      (cache_ptr)->cLRU_tail_ptr,            \
-                                      (cache_ptr)->cLRU_list_len,            \
-                                      (cache_ptr)->cLRU_list_size,           \
-				      (fail_val))                            \
-            }                                                                \
-                                                                             \
-            /* End modified LRU specific code. */                            \
-        }                                                                    \
-} /* H5C__UPDATE_RP_FOR_MOVE */
-
-#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
-
-#define H5C__UPDATE_RP_FOR_MOVE(cache_ptr, entry_ptr, was_dirty, fail_val) \
-{                                                                            \
-    HDassert( (cache_ptr) );                                                 \
-    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                      \
-    HDassert( (entry_ptr) );                                                 \
-    HDassert( !((entry_ptr)->is_protected) );                                \
-    HDassert( !((entry_ptr)->is_read_only) );                                \
-    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                            \
-    HDassert( (entry_ptr)->size > 0 );                                       \
-                                                                             \
-    if ( ! ( (entry_ptr)->is_pinned ) ) {                                    \
-	                                                                     \
-        /* modified LRU specific code */                                     \
-                                                                             \
-        /* remove the entry from the LRU list, and re-insert it at the head. \
-	 */                                                                  \
-                                                                             \
-            H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->LRU_head_ptr,          \
-                             (cache_ptr)->LRU_tail_ptr,                      \
-			     (cache_ptr)->LRU_list_len,                      \
-                             (cache_ptr)->LRU_list_size, (fail_val))         \
-                                                                             \
-            H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,         \
-                              (cache_ptr)->LRU_tail_ptr,                     \
-			      (cache_ptr)->LRU_list_len,                     \
-                              (cache_ptr)->LRU_list_size, (fail_val))        \
-                                                                             \
-            /* End modified LRU specific code. */                            \
-        }                                                                    \
-} /* H5C__UPDATE_RP_FOR_MOVE */
-
-#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
-
-

-/*-------------------------------------------------------------------------
+ * Discussions of the individual fields used by the modified LRU replacement
+ * policy follow:
+ *
+ * LRU_list_len:  Number of cache entries currently on the LRU list.
+ *
+ *              Observe that LRU_list_len + pl_len + pel_len must always 
+ *		equal index_len.
+ *
+ * LRU_list_size:  Number of bytes of cache entries currently residing on the
+ *              LRU list.
+ *
+ *              Observe that LRU_list_size + pl_size + pel_size must always 
+ *		equal index_size.
+ *
+ * LRU_head_ptr:  Pointer to the head of the doubly linked LRU list.  Cache
+ *              entries on this list are linked by their next and prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ * LRU_tail_ptr:  Pointer to the tail of the doubly linked LRU list.  Cache
+ *              entries on this list are linked by their next and prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ * cLRU_list_len: Number of cache entries currently on the clean LRU list.
+ *
+ *              Observe that cLRU_list_len + dLRU_list_len must always
+ *              equal LRU_list_len.
+ *
+ * cLRU_list_size:  Number of bytes of cache entries currently residing on
+ *              the clean LRU list.
+ *
+ *              Observe that cLRU_list_size + dLRU_list_size must always
+ *              equal LRU_list_size.
+ *
+ * cLRU_head_ptr:  Pointer to the head of the doubly linked clean LRU list.
+ *              Cache entries on this list are linked by their aux_next and
+ *              aux_prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ * cLRU_tail_ptr:  Pointer to the tail of the doubly linked clean LRU list.
+ *              Cache entries on this list are linked by their aux_next and
+ *              aux_prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ * dLRU_list_len: Number of cache entries currently on the dirty LRU list.
+ *
+ *              Observe that cLRU_list_len + dLRU_list_len must always
+ *              equal LRU_list_len.
+ *
+ * dLRU_list_size:  Number of cache entries currently on the dirty LRU list.
+ *
+ *              Observe that cLRU_list_len + dLRU_list_len must always
+ *              equal LRU_list_len.
+ *
+ * dLRU_head_ptr:  Pointer to the head of the doubly linked dirty LRU list.
+ *              Cache entries on this list are linked by their aux_next and
+ *              aux_prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ * dLRU_tail_ptr:  Pointer to the tail of the doubly linked dirty LRU list.
+ *              Cache entries on this list are linked by their aux_next and
+ *              aux_prev fields.
+ *
+ *              This field is NULL if the list is empty.
+ *
+ *
+ * Automatic cache size adjustment:
+ *
+ * While the default cache size is adequate for most cases, we can run into
+ * cases where the default is too small.  Ideally, we will let the user
+ * adjust the cache size as required.  However, this is not possible in all
+ * cases.  Thus I have added automatic cache size adjustment code.
+ *
+ * The configuration for the automatic cache size adjustment is stored in
+ * the structure described below:
+ *
+ * size_increase_possible:  Depending on the configuration data given
+ *		in the resize_ctl field, it may or may not be possible
+ *		to increase the size of the cache.  Rather than test for
+ *		all the ways this can happen, we simply set this flag when
+ *		we receive a new configuration.
+ *
+ * flash_size_increase_possible: Depending on the configuration data given
+ *              in the resize_ctl field, it may or may not be possible
+ *              for a flash size increase to occur.  We set this flag
+ *              whenever we receive a new configuration so as to avoid
+ *              repeated calculations.
+ *
+ * flash_size_increase_threshold: If a flash cache size increase is possible,
+ *              this field is used to store the minimum size of a new entry
+ *              or size increase needed to trigger a flash cache size
+ *              increase.  Note that this field must be updated whenever
+ *              the size of the cache is changed.
+ *
+ * size_decrease_possible:  Depending on the configuration data given
+ *              in the resize_ctl field, it may or may not be possible
+ *              to decrease the size of the cache.  Rather than test for
+ *              all the ways this can happen, we simply set this flag when
+ *              we receive a new configuration.
+ *
+ * cache_full:	Boolean flag used to keep track of whether the cache is
+ *		full, so we can refrain from increasing the size of a
+ *		cache which hasn't used up the space allotted to it.
+ *
+ *		The field is initialized to FALSE, and then set to TRUE
+ *		whenever we attempt to make space in the cache.
+ *
+ * resize_enabled:  This is another convenience flag which is set whenever
+ *		a new set of values for resize_ctl are provided.  Very
+ *		simply,
+ *
+ *		    resize_enabled = size_increase_possible ||
+ *                                   size_decrease_possible;
+ *
+ * size_decreased:  Boolean flag set to TRUE whenever the maximum cache
+ *		size is decreased.  The flag triggers a call to
+ *		H5C_make_space_in_cache() on the next call to H5C_protect().
  *
- * Macro:	H5C__UPDATE_RP_FOR_SIZE_CHANGE
+ * resize_ctl:	Instance of H5C_auto_size_ctl_t containing configuration
+ * 		data for automatic cache resizing.
  *
- * Purpose:     Update the replacement policy data structures for a
- *		size change of the specified cache entry.
+ * epoch_markers_active:  Integer field containing the number of epoch
+ *		markers currently in use in the LRU list.  This value
+ *		must be in the range [0, H5C__MAX_EPOCH_MARKERS - 1].
  *
- *		To do this, determine if the entry is pinned.  If it is,
- *		update the size of the pinned entry list.
+ * epoch_marker_active:  Array of boolean of length H5C__MAX_EPOCH_MARKERS.
+ *		This array is used to track which epoch markers are currently
+ *		in use.
  *
- *		If it isn't pinned, the entry must handled by the
- *		replacement policy.  Update the appropriate replacement
- *		policy data structures.
+ * epoch_marker_ringbuf:  Array of int of length H5C__MAX_EPOCH_MARKERS + 1.
  *
- *		At present, we only support the modified LRU policy, so
- *		this function deals with that case unconditionally.  If
- *		we ever support other replacement policies, the function
- *		should switch on the current policy and act accordingly.
+ *		To manage the epoch marker cache entries, it is necessary
+ *		to track their order in the LRU list.  This is done with
+ *		epoch_marker_ringbuf.  When markers are inserted at the
+ *		head of the LRU list, the index of the marker in the
+ *		epoch_markers array is inserted at the tail of the ring
+ *		buffer.  When it becomes the epoch_marker_active'th marker
+ *		in the LRU list, it will have worked its way to the head
+ *		of the ring buffer as well.  This allows us to remove it
+ *		without scanning the LRU list if such is required.
  *
- * Return:      N/A
+ * epoch_marker_ringbuf_first: Integer field containing the index of the
+ *		first entry in the ring buffer.
  *
- * Programmer:  John Mainzer, 8/23/06
+ * epoch_marker_ringbuf_last: Integer field containing the index of the
+ *		last entry in the ring buffer.
  *
- * Modifications:
+ * epoch_marker_ringbuf_size: Integer field containing the number of entries
+ *		in the ring buffer.
  *
- * 		JRM -- 3/28/07
- *		Added sanity checks based on the new is_read_only and
- *		ro_ref_count fields of struct H5C_cache_entry_t.
+ * epoch_markers:  Array of instances of H5C_cache_entry_t of length
+ *		H5C__MAX_EPOCH_MARKERS.  The entries are used as markers
+ *		in the LRU list to identify cache entries that haven't
+ *		been accessed for some (small) specified number of
+ *		epochs.  These entries (if any) can then be evicted and
+ *		the cache size reduced -- ideally without evicting any
+ *		of the current working set.  Needless to say, the epoch
+ *		length and the number of epochs before an unused entry
+ *		must be chosen so that all, or almost all, the working
+ *		set will be accessed before the limit.
  *
- *-------------------------------------------------------------------------
- */
-
-#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
-
-#define H5C__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, entry_ptr, new_size)    \
-{                                                                         \
-    HDassert( (cache_ptr) );                                              \
-    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                   \
-    HDassert( (entry_ptr) );                                              \
-    HDassert( !((entry_ptr)->is_protected) );                             \
-    HDassert( !((entry_ptr)->is_read_only) );                             \
-    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                         \
-    HDassert( (entry_ptr)->size > 0 );                                    \
-    HDassert( new_size > 0 );                                             \
-				  					  \
-    if ( (entry_ptr)->is_pinned ) {                                       \
-                                                                          \
-	H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->pel_len,             \
-			                (cache_ptr)->pel_size,            \
-			                (entry_ptr)->size,                \
-					(new_size));                      \
-	                                                                  \
-    } else {                                                              \
-                                                                          \
-        /* modified LRU specific code */                                  \
-                                                                          \
-	/* Update the size of the LRU list */                             \
-                                                                          \
-	H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->LRU_list_len,        \
-			                (cache_ptr)->LRU_list_size,       \
-			                (entry_ptr)->size,                \
-					(new_size));                      \
-                                                                          \
-        /* Similarly, update the size of the clean or dirty LRU list as   \
-	 * appropriate.  At present, the entry must be clean, but that    \
-	 * could change.                                                  \
-         */                                                               \
-                                                                          \
-        if ( (entry_ptr)->is_dirty ) {                                    \
-                                                                          \
-	    H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->dLRU_list_len,   \
-			                    (cache_ptr)->dLRU_list_size,  \
-			                    (entry_ptr)->size,            \
-					    (new_size));                  \
-                                                                          \
-        } else {                                                          \
-                                                                          \
-	    H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->cLRU_list_len,   \
-			                    (cache_ptr)->cLRU_list_size,  \
-			                    (entry_ptr)->size,            \
-					    (new_size));                  \
-        }                                                                 \
-                                                                          \
-        /* End modified LRU specific code. */                             \
-    }                                                                     \
-                                                                          \
-} /* H5C__UPDATE_RP_FOR_SIZE_CHANGE */
-
-#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
-
-#define H5C__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, entry_ptr, new_size)    \
-{                                                                         \
-    HDassert( (cache_ptr) );                                              \
-    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                   \
-    HDassert( (entry_ptr) );                                              \
-    HDassert( !((entry_ptr)->is_protected) );                             \
-    HDassert( !((entry_ptr)->is_read_only) );                             \
-    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                         \
-    HDassert( (entry_ptr)->size > 0 );                                    \
-    HDassert( new_size > 0 );                                             \
-				  					  \
-    if ( (entry_ptr)->is_pinned ) {                                       \
-                                                                          \
-	H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->pel_len,             \
-			                (cache_ptr)->pel_size,            \
-			                (entry_ptr)->size,                \
-					(new_size));                      \
-                                                                          \
-    } else {                                                              \
-                                                                          \
-        /* modified LRU specific code */                                  \
-                                                                          \
-	/* Update the size of the LRU list */                             \
-                                                                          \
-	H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->LRU_list_len,        \
-			                (cache_ptr)->LRU_list_size,       \
-			                (entry_ptr)->size,                \
-					(new_size));                      \
-                                                                          \
-        /* End modified LRU specific code. */                             \
-    }                                                                     \
-                                                                          \
-} /* H5C__UPDATE_RP_FOR_SIZE_CHANGE */
-
-#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
-
-

-/*-------------------------------------------------------------------------
+ *		Epoch markers only appear in the LRU list, never in
+ *		the index or slist.  While they are of type
+ *		H5C__EPOCH_MARKER_TYPE, and have associated class
+ *		functions, these functions should never be called.
+ *
+ *		The addr fields of these instances of H5C_cache_entry_t
+ *		are set to the index of the instance in the epoch_markers
+ *		array, the size is set to 0, and the type field points
+ *		to the constant structure epoch_marker_class defined
+ *		in H5C.c.  The next and prev fields are used as usual
+ *		to link the entry into the LRU list.
+ *
+ *		All other fields are unused.
+ *
+ *
+ * Cache hit rate collection fields:
+ *
+ * We supply the current cache hit rate on request, so we must keep a
+ * simple cache hit rate computation regardless of whether statistics
+ * collection is enabled.  The following fields support this capability.
+ *
+ * cache_hits: Number of cache hits since the last time the cache hit
+ *	rate statistics were reset.  Note that when automatic cache
+ *	re-sizing is enabled, this field will be reset every automatic
+ *	resize epoch.
+ *
+ * cache_accesses: Number of times the cache has been accessed while
+ *	since the last since the last time the cache hit rate statistics
+ *	were reset.  Note that when automatic cache re-sizing is enabled,
+ *	this field will be reset every automatic resize epoch.
+ *
+ *
+ * Statistics collection fields:
+ *
+ * When enabled, these fields are used to collect statistics as described
+ * below.  The first set are collected only when H5C_COLLECT_CACHE_STATS
+ * is true.
+ *
+ * hits:        Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times an entry with type id
+ *		equal to the array index has been in cache when requested in
+ *		the current epoch.
+ *
+ * misses:      Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times an entry with type id
+ *		equal to the array index has not been in cache when
+ *		requested in the current epoch.
+ *
+ * write_protects:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The
+ * 		cells are used to record the number of times an entry with
+ * 		type id equal to the array index has been write protected
+ * 		in the current epoch.
+ *
+ * 		Observe that (hits + misses) = (write_protects + read_protects).
+ *
+ * read_protects: Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The
+ * 		cells are used to record the number of times an entry with
+ * 		type id equal to the array index has been read protected in
+ * 		the current epoch.
+ *
+ *              Observe that (hits + misses) = (write_protects + read_protects).
+ *
+ * max_read_protects:  Array of int32 of length H5C__MAX_NUM_TYPE_IDS + 1.
+ * 		The cells are used to maximum number of simultaneous read
+ * 		protects on any entry with type id equal to the array index
+ * 		in the current epoch.
+ *
+ * insertions:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times an entry with type
+ *		id equal to the array index has been inserted into the
+ *		cache in the current epoch.
+ *
+ * pinned_insertions:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1. 
+ * 		The cells are used to record the number of times an entry
+ * 		with type id equal to the array index has been inserted
+ * 		pinned into the cache in the current epoch.
+ *
+ * clears:      Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times a dirty entry with type
+ *		id equal to the array index has been cleared in the current
+ *		epoch.
+ *
+ * flushes:     Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times an entry with type id
+ *		equal to the array index has been written to disk in the
+ *              current epoch.
+ *
+ * evictions:   Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times an entry with type id
+ *		equal to the array index has been evicted from the cache in
+ *		the current epoch.
+ *
+ * take_ownerships: Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The 
+ *		cells are used to record the number of times an entry with 
+ *		type id equal to the array index has been removed from the 
+ *		cache via the H5C__TAKE_OWNERSHIP_FLAG in the current epoch.
+ *
+ * moves:       Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times an entry with type
+ *		id equal to the array index has been moved in the current
+ *		epoch.
+ *
+ * entry_flush_moves: Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1. 
+ * 		The cells are used to record the number of times an entry
+ * 		with type id equal to the array index has been moved
+ * 		during its pre-serialize callback in the current epoch.
+ *
+ * cache_flush_moves: Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1. 
+ * 		The cells are used to record the number of times an entry
+ * 		with type id equal to the array index has been moved
+ * 		during a cache flush in the current epoch.
+ *
+ * pins:        Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times an entry with type
+ *		id equal to the array index has been pinned in the current
+ *		epoch.
  *
- * Macro:	H5C__UPDATE_RP_FOR_UNPIN
+ * unpins:      Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times an entry with type
+ *		id equal to the array index has been unpinned in the current
+ *		epoch.
  *
- * Purpose:     Update the replacement policy data structures for an
- *		unpin of the specified cache entry.
+ * dirty_pins:	Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the number of times an entry with type
+ *		id equal to the array index has been marked dirty while pinned
+ *		in the current epoch.
  *
- *		To do this, unlink the specified entry from the protected
- *		entry list, and re-insert it in the data structures used
- *		by the current replacement policy.
+ * pinned_flushes:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The
+ * 		cells are used to record the number of times an  entry
+ * 		with type id equal to the array index has been flushed while
+ * 		pinned in the current epoch.
  *
- *		At present, we only support the modified LRU policy, so
- *		this function deals with that case unconditionally.  If
- *		we ever support other replacement policies, the macro
- *		should switch on the current policy and act accordingly.
+ * pinned_clears:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.  The
+ * 		cells are used to record the number of times an  entry
+ * 		with type id equal to the array index has been cleared while
+ * 		pinned in the current epoch.
  *
- * Return:      N/A
+ * size_increases:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.
+ *		The cells are used to record the number of times an entry
+ *		with type id equal to the array index has increased in
+ *		size in the current epoch.
  *
- * Programmer:  John Mainzer, 3/22/06
+ * size_decreases:  Array of int64 of length H5C__MAX_NUM_TYPE_IDS + 1.
+ *		The cells are used to record the number of times an entry
+ *		with type id equal to the array index has decreased in
+ *		size in the current epoch.
  *
- * Modifications:
+ * entry_flush_size_changes:  Array of int64 of length
+ * 		H5C__MAX_NUM_TYPE_IDS + 1.  The cells are used to record
+ * 		the number of times an entry with type id equal to the
+ * 		array index has changed size while in its pre-serialize 
+ *		callback.
  *
- *		JRM -- 3/28/07
- *		Added sanity checks based on the new is_read_only and
- *		ro_ref_count fields of struct H5C_cache_entry_t.
+ * cache_flush_size_changes:  Array of int64 of length
+ * 		H5C__MAX_NUM_TYPE_IDS + 1.  The cells are used to record
+ * 		the number of times an entry with type id equal to the
+ * 		array index has changed size during a cache flush
  *
- *-------------------------------------------------------------------------
- */
-
-#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
-
-#define H5C__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, fail_val)       \
-{                                                                      \
-    HDassert( (cache_ptr) );                                           \
-    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                \
-    HDassert( (entry_ptr) );                                           \
-    HDassert( !((entry_ptr)->is_protected) );                          \
-    HDassert( !((entry_ptr)->is_read_only) );                          \
-    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                      \
-    HDassert( (entry_ptr)->is_pinned);                                 \
-    HDassert( (entry_ptr)->size > 0 );                                 \
-                                                                       \
-    /* Regardless of the replacement policy, remove the entry from the \
-     * pinned entry list.                                              \
-     */                                                                \
-    H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr,            \
-                    (cache_ptr)->pel_tail_ptr, (cache_ptr)->pel_len,   \
-                    (cache_ptr)->pel_size, (fail_val))                 \
-    HDassert( (cache_ptr)->pel_len >= 0 );                             \
-                                                                       \
-        /* modified LRU specific code */                               \
-                                                                       \
-        /* insert the entry at the head of the LRU list. */            \
-                                                                       \
-        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,       \
-                         (cache_ptr)->LRU_tail_ptr,                    \
-                         (cache_ptr)->LRU_list_len,                    \
-                         (cache_ptr)->LRU_list_size, (fail_val))       \
-                                                                       \
-        /* Similarly, insert the entry at the head of either the clean \
-         * or dirty LRU list as appropriate.                           \
-         */                                                            \
-                                                                       \
-        if ( (entry_ptr)->is_dirty ) {                                 \
-                                                                       \
-            H5C__AUX_DLL_PREPEND((entry_ptr),                          \
-			          (cache_ptr)->dLRU_head_ptr,          \
-                                  (cache_ptr)->dLRU_tail_ptr,          \
-                                  (cache_ptr)->dLRU_list_len,          \
-                                  (cache_ptr)->dLRU_list_size,         \
-			          (fail_val))                          \
-                                                                       \
-        } else {                                                       \
-                                                                       \
-            H5C__AUX_DLL_PREPEND((entry_ptr),                          \
-			          (cache_ptr)->cLRU_head_ptr,          \
-                                  (cache_ptr)->cLRU_tail_ptr,          \
-                                  (cache_ptr)->cLRU_list_len,          \
-                                  (cache_ptr)->cLRU_list_size,         \
-			          (fail_val))                          \
-         }                                                             \
-                                                                       \
-        /* End modified LRU specific code. */                          \
-                                                                       \
-} /* H5C__UPDATE_RP_FOR_UNPIN */
-
-#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
-
-#define H5C__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, fail_val)       \
-{                                                                      \
-    HDassert( (cache_ptr) );                                           \
-    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                \
-    HDassert( (entry_ptr) );                                           \
-    HDassert( !((entry_ptr)->is_protected) );                          \
-    HDassert( !((entry_ptr)->is_read_only) );                          \
-    HDassert( ((entry_ptr)->ro_ref_count) == 0 );                      \
-    HDassert( (entry_ptr)->is_pinned);                                 \
-    HDassert( (entry_ptr)->size > 0 );                                 \
-                                                                       \
-    /* Regardless of the replacement policy, remove the entry from the \
-     * pinned entry list.                                              \
-     */                                                                \
-    H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr,            \
-                    (cache_ptr)->pel_tail_ptr, (cache_ptr)->pel_len,   \
-                    (cache_ptr)->pel_size, (fail_val))                 \
-    HDassert( (cache_ptr)->pel_len >= 0 );                             \
-                                                                       \
-        /* modified LRU specific code */                               \
-                                                                       \
-        /* insert the entry at the head of the LRU list. */            \
-                                                                       \
-        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,       \
-                         (cache_ptr)->LRU_tail_ptr,                    \
-                         (cache_ptr)->LRU_list_len,                    \
-                         (cache_ptr)->LRU_list_size, (fail_val))       \
-                                                                       \
-        /* End modified LRU specific code. */                          \
-                                                                       \
-} /* H5C__UPDATE_RP_FOR_UNPIN */
-
-#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
-
-

-/*-------------------------------------------------------------------------
+ * total_ht_insertions: Number of times entries have been inserted into the
+ *		hash table in the current epoch.
  *
- * Macro:	H5C__UPDATE_RP_FOR_UNPROTECT
+ * total_ht_deletions: Number of times entries have been deleted from the
+ *              hash table in the current epoch.
  *
- * Purpose:     Update the replacement policy data structures for an
- *		unprotect of the specified cache entry.
+ * successful_ht_searches: int64 containing the total number of successful
+ *		searches of the hash table in the current epoch.
  *
- *		To do this, unlink the specified entry from the protected
- *		list, and re-insert it in the data structures used by the
- *		current replacement policy.
+ * total_successful_ht_search_depth: int64 containing the total number of
+ *		entries other than the targets examined in successful
+ *		searches of the hash table in the current epoch.
  *
- *		At present, we only support the modified LRU policy, so
- *		this function deals with that case unconditionally.  If
- *		we ever support other replacement policies, the function
- *		should switch on the current policy and act accordingly.
+ * failed_ht_searches: int64 containing the total number of unsuccessful
+ *              searches of the hash table in the current epoch.
  *
- * Return:      N/A
+ * total_failed_ht_search_depth: int64 containing the total number of
+ *              entries examined in unsuccessful searches of the hash
+ *		table in the current epoch.
  *
- * Programmer:  John Mainzer, 5/19/04
+ * max_index_len:  Largest value attained by the index_len field in the
+ *              current epoch.
  *
- * Modifications:
+ * max_index_size:  Largest value attained by the index_size field in the
+ *              current epoch.
+ *
+ * max_clean_index_size: Largest value attained by the clean_index_size field
+ * 		in the current epoch.
+ *
+ * max_dirty_index_size: Largest value attained by the dirty_index_size field
+ * 		in the current epoch.
+ *
+ * max_slist_len:  Largest value attained by the slist_len field in the
+ *              current epoch.
+ *
+ * max_slist_size:  Largest value attained by the slist_size field in the
+ *              current epoch.
+ *
+ * max_pl_len:  Largest value attained by the pl_len field in the
+ *              current epoch.
+ *
+ * max_pl_size: Largest value attained by the pl_size field in the
+ *              current epoch.
+ *
+ * max_pel_len: Largest value attained by the pel_len field in the
+ *              current epoch.
+ *
+ * max_pel_size: Largest value attained by the pel_size field in the
+ *              current epoch.
+ *
+ * calls_to_msic: Total number of calls to H5C_make_space_in_cache
+ *
+ * total_entries_skipped_in_msic: Number of clean entries skipped while
+ *              enforcing the min_clean_fraction in H5C_make_space_in_cache().
+ *
+ * total_entries_scanned_in_msic: Number of clean entries skipped while
+ *              enforcing the min_clean_fraction in H5C_make_space_in_cache().
+ *
+ * max_entries_skipped_in_msic: Maximum number of clean entries skipped
+ *              in any one call to H5C_make_space_in_cache().
+ *
+ * max_entries_scanned_in_msic: Maximum number of entries scanned over
+ *              in any one call to H5C_make_space_in_cache().
+ *
+ * entries_scanned_to_make_space: Number of entries scanned only when looking
+ *              for entries to evict in order to make space in cache.
+ *
+ * 
+ * As entries are now capable of moving, loading, dirtying, and deleting 
+ * other entries in their pre_serialize and serialize callbacks, it has 
+ * been necessary to insert code to restart scans of lists so as to avoid 
+ * improper behavior if the next entry in the list is the target of one on 
+ * these operations.
+ *
+ * The following fields are use to count such occurances.  They are used 
+ * both in tests (to verify that the scan has been restarted), and to 
+ * obtain estimates of how frequently these restarts occur.
+ *
+ * slist_scan_restarts: Number of times a scan of the slist (that contains
+ *		calls to H5C_flush_single_entry()) has been restarted to 
+ *		avoid potential issues with change of status of the next 
+ *		entry in the scan.
+ *
+ * LRU_scan_restarts: Number of times a scan of the LRU list (that contains
+ *              calls to H5C_flush_single_entry()) has been restarted to 
+ *              avoid potential issues with change of status of the next 
+ *              entry in the scan.
+ *
+ * hash_bucket_scan_restarts: Number of times a scan of a hash bucket list
+ *		(that contains calls to H5C_flush_single_entry()) has been 
+ *		restarted to avoid potential issues with change of status 
+ *		of the next entry in the scan.
+ *
+ * The remaining stats are collected only when both H5C_COLLECT_CACHE_STATS
+ * and H5C_COLLECT_CACHE_ENTRY_STATS are true.
+ *
+ * max_accesses: Array of int32 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the maximum number of times any single
+ *		entry with type id equal to the array index has been
+ *		accessed in the current epoch.
+ *
+ * min_accesses: Array of int32 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the minimum number of times any single
+ *		entry with type id equal to the array index has been
+ *		accessed in the current epoch.
+ *
+ * max_clears:  Array of int32 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the maximum number of times any single
+ *		entry with type id equal to the array index has been cleared
+ *		in the current epoch.
+ *
+ * max_flushes: Array of int32 of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *		are used to record the maximum number of times any single
+ *		entry with type id equal to the array index has been
+ *		flushed in the current epoch.
+ *
+ * max_size:	Array of size_t of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *              are used to record the maximum size of any single entry
+ *		with type id equal to the array index that has resided in
+ *		the cache in the current epoch.
+ *
+ * max_pins:	Array of size_t of length H5C__MAX_NUM_TYPE_IDS + 1.  The cells
+ *              are used to record the maximum number of times that any single
+ *              entry with type id equal to the array index that has been
+ *              marked as pinned in the cache in the current epoch.
  *
- *		JRM - 7/27/04
- *		Converted the function H5C_update_rp_for_unprotect() to
- *		the macro H5C__UPDATE_RP_FOR_UNPROTECT in an effort to
- *		squeeze a bit more performance out of the cache.
  *
- *		At least for the first cut, I am leaving the comments and
- *		white space in the macro.  If they cause dificulties with
- *		pre-processor, I'll have to remove them.
+ * Fields supporting testing:
  *
- *		JRM - 7/28/04
- *		Split macro into two version, one supporting the clean and
- *		dirty LRU lists, and the other not.  Yet another attempt
- *		at optimization.
+ * prefix	Array of char used to prefix debugging output.  The
+ *		field is intended to allow marking of output of with
+ *		the processes mpi rank.
  *
- *		JRM - 3/17/06
- *		Modified macro to put pinned entries on the pinned entry
- *		list instead of inserting them in the data structures
- *		maintained by the replacement policy.
+ * get_entry_ptr_from_addr_counter: Counter used to track the number of 
+ *		times the H5C_get_entry_ptr_from_addr() function has been 
+ *		called successfully.  This field is only defined when 
+ *		NDEBUG is not #defined.
  *
- *-------------------------------------------------------------------------
- */
+ ****************************************************************************/
+struct H5C_t {
+    uint32_t			magic;
+    hbool_t			flush_in_progress;
+    FILE *			trace_file_ptr;
+    hbool_t                     logging_enabled;
+    hbool_t                     currently_logging;
+    FILE *			log_file_ptr;
+    void *			aux_ptr;
+    int32_t			max_type_id;
+    const char *                (* type_name_table_ptr);
+    size_t                      max_cache_size;
+    size_t                      min_clean_size;
+    H5C_write_permitted_func_t	check_write_permitted;
+    hbool_t			write_permitted;
+    H5C_log_flush_func_t	log_flush;
+    hbool_t			evictions_enabled;
 
-#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
+    /* Fields for maintaining [hash table] index of entries */
+    int32_t                     index_len;
+    size_t                      index_size;
+    int32_t			index_ring_len[H5C_RING_NTYPES];
+    size_t			index_ring_size[H5C_RING_NTYPES];
+    size_t 			clean_index_size;
+    size_t			clean_index_ring_size[H5C_RING_NTYPES];
+    size_t			dirty_index_size;
+    size_t			dirty_index_ring_size[H5C_RING_NTYPES];
+    H5C_cache_entry_t *		(index[H5C__HASH_TABLE_LEN]);
 
-#define H5C__UPDATE_RP_FOR_UNPROTECT(cache_ptr, entry_ptr, fail_val)       \
-{                                                                          \
-    HDassert( (cache_ptr) );                                               \
-    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                    \
-    HDassert( (entry_ptr) );                                               \
-    HDassert( (entry_ptr)->is_protected);                                  \
-    HDassert( (entry_ptr)->size > 0 );                                     \
-                                                                           \
-    /* Regardless of the replacement policy, remove the entry from the     \
-     * protected list.                                                     \
-     */                                                                    \
-    H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pl_head_ptr,                 \
-                    (cache_ptr)->pl_tail_ptr, (cache_ptr)->pl_len,         \
-                    (cache_ptr)->pl_size, (fail_val))                      \
-                                                                           \
-    if ( (entry_ptr)->is_pinned ) {                                        \
-                                                                           \
-        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr,           \
-                         (cache_ptr)->pel_tail_ptr,                        \
-                         (cache_ptr)->pel_len,                             \
-                         (cache_ptr)->pel_size, (fail_val))                \
-                                                                           \
-    } else {                                                               \
-                                                                           \
-        /* modified LRU specific code */                                   \
-                                                                           \
-        /* insert the entry at the head of the LRU list. */                \
-                                                                           \
-        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,           \
-                         (cache_ptr)->LRU_tail_ptr,                        \
-                         (cache_ptr)->LRU_list_len,                        \
-                         (cache_ptr)->LRU_list_size, (fail_val))           \
-                                                                           \
-        /* Similarly, insert the entry at the head of either the clean or  \
-         * dirty LRU list as appropriate.                                  \
-         */                                                                \
-                                                                           \
-        if ( (entry_ptr)->is_dirty ) {                                     \
-                                                                           \
-            H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->dLRU_head_ptr,  \
-                                 (cache_ptr)->dLRU_tail_ptr,               \
-                                 (cache_ptr)->dLRU_list_len,               \
-                                 (cache_ptr)->dLRU_list_size, (fail_val))  \
-                                                                           \
-        } else {                                                           \
-                                                                           \
-            H5C__AUX_DLL_PREPEND((entry_ptr), (cache_ptr)->cLRU_head_ptr,  \
-                                 (cache_ptr)->cLRU_tail_ptr,               \
-                                 (cache_ptr)->cLRU_list_len,               \
-                                 (cache_ptr)->cLRU_list_size, (fail_val))  \
-        }                                                                  \
-                                                                           \
-        /* End modified LRU specific code. */                              \
-    }                                                                      \
-                                                                           \
-} /* H5C__UPDATE_RP_FOR_UNPROTECT */
+    /* Fields to detect entries removed during scans */
+    int64_t			entries_removed_counter;
+    H5C_cache_entry_t *		last_entry_removed_ptr;
 
-#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+    /* Field to disable tag validation */
+    hbool_t                     ignore_tags;
 
-#define H5C__UPDATE_RP_FOR_UNPROTECT(cache_ptr, entry_ptr, fail_val)       \
-{                                                                          \
-    HDassert( (cache_ptr) );                                               \
-    HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC );                    \
-    HDassert( (entry_ptr) );                                               \
-    HDassert( (entry_ptr)->is_protected);                                  \
-    HDassert( (entry_ptr)->size > 0 );                                     \
-                                                                           \
-    /* Regardless of the replacement policy, remove the entry from the     \
-     * protected list.                                                     \
-     */                                                                    \
-    H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pl_head_ptr,                 \
-                    (cache_ptr)->pl_tail_ptr, (cache_ptr)->pl_len,         \
-                    (cache_ptr)->pl_size, (fail_val))                      \
-                                                                           \
-    if ( (entry_ptr)->is_pinned ) {                                        \
-                                                                           \
-        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->pel_head_ptr,           \
-                         (cache_ptr)->pel_tail_ptr,                        \
-                         (cache_ptr)->pel_len,                             \
-                         (cache_ptr)->pel_size, (fail_val))                \
-                                                                           \
-    } else {                                                               \
-                                                                           \
-        /* modified LRU specific code */                                   \
-                                                                           \
-        /* insert the entry at the head of the LRU list. */                \
-                                                                           \
-        H5C__DLL_PREPEND((entry_ptr), (cache_ptr)->LRU_head_ptr,           \
-                         (cache_ptr)->LRU_tail_ptr,                        \
-                         (cache_ptr)->LRU_list_len,                        \
-                         (cache_ptr)->LRU_list_size, (fail_val))           \
-                                                                           \
-        /* End modified LRU specific code. */                              \
-    }                                                                      \
-} /* H5C__UPDATE_RP_FOR_UNPROTECT */
+    /* Fields for maintaining list of in-order entries, for flushing */
+    hbool_t			slist_changed;
+    hbool_t			slist_change_in_pre_serialize;
+    hbool_t			slist_change_in_serialize;
+    int32_t                     slist_len;
+    size_t                      slist_size;
+    int32_t			slist_ring_len[H5C_RING_NTYPES];
+    size_t			slist_ring_size[H5C_RING_NTYPES];
+    H5SL_t *                    slist_ptr;
+    int32_t                     num_last_entries;
+#if H5C_DO_SANITY_CHECKS
+    int64_t			slist_len_increase;
+    int64_t			slist_size_increase;
+#endif /* H5C_DO_SANITY_CHECKS */
+
+    H5SL_t *                    cork_list_ptr; /* list of corked object addresses */
+
+    /* Fields for tracking protected entries */
+    int32_t                     pl_len;
+    size_t                      pl_size;
+    H5C_cache_entry_t *	        pl_head_ptr;
+    H5C_cache_entry_t *  	pl_tail_ptr;
+
+    /* Fields for tracking pinned entries */
+    int32_t                     pel_len;
+    size_t                      pel_size;
+    H5C_cache_entry_t *	        pel_head_ptr;
+    H5C_cache_entry_t *  	pel_tail_ptr;
+
+    /* Fields for complete LRU list of entries */
+    int32_t                     LRU_list_len;
+    size_t                      LRU_list_size;
+    H5C_cache_entry_t *		LRU_head_ptr;
+    H5C_cache_entry_t *		LRU_tail_ptr;
+
+    /* Fields for clean LRU list of entries */
+    int32_t                     cLRU_list_len;
+    size_t                      cLRU_list_size;
+    H5C_cache_entry_t *		cLRU_head_ptr;
+    H5C_cache_entry_t *		cLRU_tail_ptr;
+
+    /* Fields for dirty LRU list of entries */
+    int32_t                     dLRU_list_len;
+    size_t                      dLRU_list_size;
+    H5C_cache_entry_t *		dLRU_head_ptr;
+    H5C_cache_entry_t *	        dLRU_tail_ptr;
+
+    /* Fields for automatic cache size adjustment */
+    hbool_t			size_increase_possible;
+    hbool_t			flash_size_increase_possible;
+    size_t			flash_size_increase_threshold;
+    hbool_t			size_decrease_possible;
+    hbool_t			resize_enabled;
+    hbool_t			cache_full;
+    hbool_t			size_decreased;
+    H5C_auto_size_ctl_t		resize_ctl;
+
+    /* Fields for epoch markers used in automatic cache size adjustment */
+    int32_t			epoch_markers_active;
+    hbool_t			epoch_marker_active[H5C__MAX_EPOCH_MARKERS];
+    int32_t			epoch_marker_ringbuf[H5C__MAX_EPOCH_MARKERS+1];
+    int32_t			epoch_marker_ringbuf_first;
+    int32_t			epoch_marker_ringbuf_last;
+    int32_t			epoch_marker_ringbuf_size;
+    H5C_cache_entry_t		epoch_markers[H5C__MAX_EPOCH_MARKERS];
+
+    /* Fields for cache hit rate collection */
+    int64_t			cache_hits;
+    int64_t			cache_accesses;
+
+#if H5C_COLLECT_CACHE_STATS
+    /* stats fields */
+    int64_t                     hits[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     misses[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     write_protects[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     read_protects[H5C__MAX_NUM_TYPE_IDS + 1];
+    int32_t                     max_read_protects[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     insertions[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     pinned_insertions[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     clears[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     flushes[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     evictions[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     take_ownerships[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     moves[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     entry_flush_moves[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     cache_flush_moves[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     pins[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     unpins[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     dirty_pins[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     pinned_flushes[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     pinned_clears[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     size_increases[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     size_decreases[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     entry_flush_size_changes[H5C__MAX_NUM_TYPE_IDS + 1];
+    int64_t                     cache_flush_size_changes[H5C__MAX_NUM_TYPE_IDS + 1];
+
+    /* Fields for hash table operations */
+    int64_t			total_ht_insertions;
+    int64_t			total_ht_deletions;
+    int64_t			successful_ht_searches;
+    int64_t			total_successful_ht_search_depth;
+    int64_t			failed_ht_searches;
+    int64_t			total_failed_ht_search_depth;
+    int32_t                     max_index_len;
+    size_t                      max_index_size;
+    size_t                      max_clean_index_size;
+    size_t                      max_dirty_index_size;
+
+    /* Fields for in-order skip list */
+    int32_t                     max_slist_len;
+    size_t                      max_slist_size;
+
+    /* Fields for protected entry list */
+    int32_t                     max_pl_len;
+    size_t                      max_pl_size;
+
+    /* Fields for pinned entry list */
+    int32_t                     max_pel_len;
+    size_t                      max_pel_size;
+
+    /* Fields for tacking 'make space in cache' (msic) operations */
+    int64_t                     calls_to_msic;
+    int64_t                     total_entries_skipped_in_msic;
+    int64_t                     total_entries_scanned_in_msic;
+    int32_t                     max_entries_skipped_in_msic;
+    int32_t                     max_entries_scanned_in_msic;
+    int64_t                     entries_scanned_to_make_space;
+ 
+    /* Fields for tracking skip list scan restarts */
+    int64_t			slist_scan_restarts;
+    int64_t			LRU_scan_restarts;
+    int64_t			hash_bucket_scan_restarts;
+
+#if H5C_COLLECT_CACHE_ENTRY_STATS
+    int32_t                     max_accesses[H5C__MAX_NUM_TYPE_IDS + 1];
+    int32_t                     min_accesses[H5C__MAX_NUM_TYPE_IDS + 1];
+    int32_t                     max_clears[H5C__MAX_NUM_TYPE_IDS + 1];
+    int32_t                     max_flushes[H5C__MAX_NUM_TYPE_IDS + 1];
+    size_t                      max_size[H5C__MAX_NUM_TYPE_IDS + 1];
+    int32_t                     max_pins[H5C__MAX_NUM_TYPE_IDS + 1];
+#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    char			prefix[H5C__PREFIX_LEN];
+
+#ifndef NDEBUG
+    int64_t			get_entry_ptr_from_addr_counter;
+#endif /* NDEBUG */
+};
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
 
-#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
 
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+H5_DLL herr_t H5C__flush_single_entry(const H5F_t *f, hid_t dxpl_id,
+    H5C_cache_entry_t *entry_ptr, unsigned flags, int64_t *entry_size_change_ptr);
 
 #endif /* _H5Cpkg_H */
 
diff --git a/src/H5Cprivate.h b/src/H5Cprivate.h
index 44e3d4d..467c5d1 100644
--- a/src/H5Cprivate.h
+++ b/src/H5Cprivate.h
@@ -32,13 +32,17 @@
 
 #include "H5Cpublic.h"		/* public prototypes		        */
 
-/* Pivate headers needed by this header */
+/* Private headers needed by this header */
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Fprivate.h"		/* File access				*/
 
+/**************************/
+/* Library Private Macros */
+/**************************/
 
-#define H5C_DO_SANITY_CHECKS		0
-#define H5C_DO_EXTREME_SANITY_CHECKS	0
+/* Cache configuration settings */
+#define H5C__MAX_NUM_TYPE_IDS   29
+#define H5C__PREFIX_LEN         32
 
 /* This sanity checking constant was picked out of the air.  Increase
  * or decrease it if appropriate.  Its purposes is to detect corrupt
@@ -48,151 +52,1220 @@
  */
 #define H5C_MAX_ENTRY_SIZE		((size_t)(32 * 1024 * 1024))
 
-/* H5C_COLLECT_CACHE_STATS controls overall collection of statistics
- * on cache activity.  In general, this #define should be set to 0.
+#ifdef H5_HAVE_PARALLEL
+/* we must maintain the clean and dirty LRU lists when we are compiled
+ * with parallel support.
  */
-#define H5C_COLLECT_CACHE_STATS	0
+#define H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS  1
+#else /* H5_HAVE_PARALLEL */
+/* The clean and dirty LRU lists don't buy us anything here -- we may
+ * want them on for testing on occasion, but in general they should be
+ * off.
+ */
+#define H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS  0
+#endif /* H5_HAVE_PARALLEL */
 
-/* H5C_COLLECT_CACHE_ENTRY_STATS controls collection of statistics
- * in individual cache entries.
+/* Flags for cache client class behavior */
+#define H5C__CLASS_NO_FLAGS_SET			((unsigned)0x0)
+#define H5C__CLASS_SPECULATIVE_LOAD_FLAG	((unsigned)0x1)
+#define H5C__CLASS_COMPRESSED_FLAG		((unsigned)0x2)
+/* The following flags may only appear in test code */
+/* The H5C__CLASS_SKIP_READS & H5C__CLASS_SKIP_WRITES flags are used in H5Oproxy.c */
+#define H5C__CLASS_NO_IO_FLAG			((unsigned)0x4)
+#define H5C__CLASS_SKIP_READS			((unsigned)0x8)
+#define H5C__CLASS_SKIP_WRITES			((unsigned)0x10)
+
+/* Flags for pre-serialize callback */
+#define H5C__SERIALIZE_NO_FLAGS_SET	((unsigned)0)
+#define H5C__SERIALIZE_RESIZED_FLAG	((unsigned)0x1)
+#define H5C__SERIALIZE_MOVED_FLAG	((unsigned)0x2)
+#define H5C__SERIALIZE_COMPRESSED_FLAG  ((unsigned)0x4)
+
+/* Upper and lower limits on cache size.  These limits are picked
+ * out of a hat -- you should be able to change them as necessary.
  *
- * H5C_COLLECT_CACHE_ENTRY_STATS should only be defined to true if
- * H5C_COLLECT_CACHE_STATS is also defined to true.
+ * However, if you need a very big cache, you should also increase the
+ * size of the hash table (H5C__HASH_TABLE_LEN in H5Cpkg.h).  The current
+ * upper bound on cache size is rather large for the current hash table
+ * size.
  */
-#if H5C_COLLECT_CACHE_STATS
+#define H5C__MAX_MAX_CACHE_SIZE		((size_t)(128 * 1024 * 1024))
+#define H5C__MIN_MAX_CACHE_SIZE		((size_t)(1024))
 
-#define H5C_COLLECT_CACHE_ENTRY_STATS	1
+/* Default max cache size and min clean size are give here to make
+ * them generally accessable.
+ */
+#define H5C__DEFAULT_MAX_CACHE_SIZE     ((size_t)(4 * 1024 * 1024))
+#define H5C__DEFAULT_MIN_CLEAN_SIZE     ((size_t)(2 * 1024 * 1024))
 
-#else
+/* Values for cache entry magic field */
+#define H5C__H5C_CACHE_ENTRY_T_MAGIC		0x005CAC0A
+#define H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC	0xDeadBeef
 
-#define H5C_COLLECT_CACHE_ENTRY_STATS	0
+/* Cache configuration validation definitions */
+#define H5C_RESIZE_CFG__VALIDATE_GENERAL        0x1
+#define H5C_RESIZE_CFG__VALIDATE_INCREMENT      0x2
+#define H5C_RESIZE_CFG__VALIDATE_DECREMENT      0x4
+#define H5C_RESIZE_CFG__VALIDATE_INTERACTIONS   0x8
+#define H5C_RESIZE_CFG__VALIDATE_ALL      \
+(                                         \
+    H5C_RESIZE_CFG__VALIDATE_GENERAL |    \
+    H5C_RESIZE_CFG__VALIDATE_INCREMENT |  \
+    H5C_RESIZE_CFG__VALIDATE_DECREMENT |  \
+    H5C_RESIZE_CFG__VALIDATE_INTERACTIONS \
+)
 
-#endif /* H5C_COLLECT_CACHE_STATS */
+/* Cache configuration versions */
+#define H5C__CURR_AUTO_SIZE_CTL_VER		1
+#define H5C__CURR_AUTO_RESIZE_RPT_FCN_VER	1
 
+/* Number of epoch markers active */
+#define H5C__MAX_EPOCH_MARKERS  		10
 
-#ifdef H5_HAVE_PARALLEL
+/* Default configuration settings */
+#define H5C__DEF_AR_UPPER_THRESHHOLD		0.9999f
+#define H5C__DEF_AR_LOWER_THRESHHOLD		0.9f
+#define H5C__DEF_AR_MAX_SIZE			((size_t)(16 * 1024 * 1024))
+#define H5C__DEF_AR_INIT_SIZE			((size_t)( 1 * 1024 * 1024))
+#define H5C__DEF_AR_MIN_SIZE			((size_t)( 1 * 1024 * 1024))
+#define H5C__DEF_AR_MIN_CLEAN_FRAC		0.5f
+#define H5C__DEF_AR_INCREMENT			2.0f
+#define H5C__DEF_AR_MAX_INCREMENT		((size_t)( 2 * 1024 * 1024))
+#define H5C__DEF_AR_FLASH_MULTIPLE              1.0f
+#define H5C__DEV_AR_FLASH_THRESHOLD             0.25f
+#define H5C__DEF_AR_DECREMENT			0.9f
+#define H5C__DEF_AR_MAX_DECREMENT		((size_t)( 1 * 1024 * 1024))
+#define H5C__DEF_AR_EPCHS_B4_EVICT		3
+#define H5C__DEF_AR_EMPTY_RESERVE		0.05f
+#define H5C__MIN_AR_EPOCH_LENGTH		100
+#define H5C__DEF_AR_EPOCH_LENGTH		50000
+#define H5C__MAX_AR_EPOCH_LENGTH		1000000
 
-/* we must maintain the clean and dirty LRU lists when we are compiled
- * with parallel support.
+/* #defines of flags used in the flags parameters in some of the
+ * following function calls.  Note that not all flags are applicable
+ * to all function calls.  Flags that don't apply to a particular
+ * function are ignored in that function.
+ *
+ * These flags apply to all function calls:
+ * 	H5C__NO_FLAGS_SET (generic "no flags set" for all fcn calls)
+ *
+ *
+ * These flags apply to H5C_insert_entry():
+ * 	H5C__SET_FLUSH_MARKER_FLAG
+ * 	H5C__PIN_ENTRY_FLAG
+ *	H5C__FLUSH_LAST_FLAG		; super block only
+ *	H5C__FLUSH_COLLECTIVELY_FLAG	; super block only
+ *
+ * These flags apply to H5C_protect()
+ * 	H5C__READ_ONLY_FLAG
+ *	H5C__FLUSH_LAST_FLAG		; super block only 
+ *	H5C__FLUSH_COLLECTIVELY_FLAG	; super block only
+ *
+ * These flags apply to H5C_unprotect():
+ * 	H5C__SET_FLUSH_MARKER_FLAG
+ * 	H5C__DELETED_FLAG
+ * 	H5C__DIRTIED_FLAG
+ * 	H5C__PIN_ENTRY_FLAG
+ * 	H5C__UNPIN_ENTRY_FLAG
+ * 	H5C__FREE_FILE_SPACE_FLAG
+ *      H5C__TAKE_OWNERSHIP_FLAG
+ *
+ * These flags apply to H5C_expunge_entry():
+ * 	H5C__FREE_FILE_SPACE_FLAG
+ *
+ * These flags apply to H5C_flush_cache():
+ * 	H5C__FLUSH_INVALIDATE_FLAG
+ * 	H5C__FLUSH_CLEAR_ONLY_FLAG
+ * 	H5C__FLUSH_MARKED_ENTRIES_FLAG
+ *	H5C__FLUSH_IGNORE_PROTECTED_FLAG (can't use this flag in combination
+ *					  with H5C__FLUSH_INVALIDATE_FLAG)
+ *
+ * These flags apply to H5C_flush_single_entry():
+ * 	H5C__FLUSH_INVALIDATE_FLAG
+ * 	H5C__FLUSH_CLEAR_ONLY_FLAG
+ * 	H5C__FLUSH_MARKED_ENTRIES_FLAG
+ *      H5C__TAKE_OWNERSHIP_FLAG
+ *      H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG
  */
-#define H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS  1
+#define H5C__NO_FLAGS_SET			0x0000
+#define H5C__SET_FLUSH_MARKER_FLAG		0x0001
+#define H5C__DELETED_FLAG			0x0002
+#define H5C__DIRTIED_FLAG			0x0004
+#define H5C__PIN_ENTRY_FLAG			0x0008
+#define H5C__UNPIN_ENTRY_FLAG			0x0010
+#define H5C__FLUSH_INVALIDATE_FLAG		0x0020
+#define H5C__FLUSH_CLEAR_ONLY_FLAG		0x0040
+#define H5C__FLUSH_MARKED_ENTRIES_FLAG		0x0080
+#define H5C__FLUSH_IGNORE_PROTECTED_FLAG	0x0100
+#define H5C__READ_ONLY_FLAG			0x0200
+#define H5C__FREE_FILE_SPACE_FLAG		0x0400
+#define H5C__TAKE_OWNERSHIP_FLAG		0x0800
+#define H5C__FLUSH_LAST_FLAG			0x1000
+#define H5C__FLUSH_COLLECTIVELY_FLAG		0x2000
+#define H5C__EVICT_ALLOW_LAST_PINS_FLAG         0x4000
+#define H5C__DEL_FROM_SLIST_ON_DESTROY_FLAG     0x8000
+
+/* Definitions for cache "tag" property */
+#define H5C_TAG_NAME           "H5C_tag"
+#define H5C_TAG_SIZE           sizeof(H5C_tag_t)
+#define H5C_TAG_DEF            {(haddr_t)0, H5C_GLOBALITY_NONE}
+
+/* Debugging/sanity checking/statistics settings */
+#ifndef NDEBUG
+#define H5C_DO_SANITY_CHECKS		1
+#define H5C_DO_SLIST_SANITY_CHECKS	0
+#define H5C_DO_TAGGING_SANITY_CHECKS	1
+#define H5C_DO_EXTREME_SANITY_CHECKS	0
+#else /* NDEBUG */
+/* With rare execptions, the following defines should be set 
+ * to 0 if NDEBUG is defined 
+ */
+#define H5C_DO_SANITY_CHECKS		0
+#define H5C_DO_SLIST_SANITY_CHECKS	0
+#define H5C_DO_TAGGING_SANITY_CHECKS	0
+#define H5C_DO_EXTREME_SANITY_CHECKS	0
+#endif /* NDEBUG */
 
-#else /* H5_HAVE_PARALLEL */
+/* Cork actions: cork/uncork/get cork status of an object */
+#define H5C__SET_CORK                  0x1
+#define H5C__UNCORK                    0x2
+#define H5C__GET_CORKED                0x4
+
+/* Note: The memory sanity checks aren't going to work until I/O filters are
+ *      changed to call a particular alloc/free routine for their buffers,
+ *      because the H5AC__SERIALIZE_RESIZED_FLAG set by the fractal heap
+ *      direct block serialize callback calls H5Z_pipeline().  When the I/O
+ *      filters are changed, then we should implement "cache image alloc/free"
+ *      routines that the fractal heap direct block (and global heap) serialize
+ *      calls can use when resizing (and re-allocating) their image in the
+ *      cache. -QAK */
+#define H5C_DO_MEMORY_SANITY_CHECKS	0
 
-/* The clean and dirty LRU lists don't buy us anything here -- we may
- * want them on for testing on occasion, but in general they should be
- * off.
+/* H5C_COLLECT_CACHE_STATS controls overall collection of statistics
+ * on cache activity.  In general, this #define should be set to 1 in
+ * debug mode, and 0 in production mode..
  */
-#define H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS  0
 
-#endif /* H5_HAVE_PARALLEL */
+#ifndef NDEBUG
+#define H5C_COLLECT_CACHE_STATS	1
+#else /* NDEBUG */
+#define H5C_COLLECT_CACHE_STATS	0
+#endif /* NDEBUG */
+
+/* H5C_COLLECT_CACHE_ENTRY_STATS controls collection of statistics
+ * in individual cache entries.
+ *
+ * H5C_COLLECT_CACHE_ENTRY_STATS should only be defined to true if
+ * H5C_COLLECT_CACHE_STATS is also defined to true.
+ */
+#if H5C_COLLECT_CACHE_STATS
+#define H5C_COLLECT_CACHE_ENTRY_STATS	1
+#else
+#define H5C_COLLECT_CACHE_ENTRY_STATS	0
+#endif /* H5C_COLLECT_CACHE_STATS */
 
 
-/* Typedef for the main structure for the cache (defined in H5Cpkg.h) */
+/****************************/
+/* Library Private Typedefs */
+/****************************/
 
+/* Typedef for the main structure for the cache (defined in H5Cpkg.h) */
 typedef struct H5C_t H5C_t;
 
+/* Cache entry tag structure */
+typedef struct H5C_tag_t {
+    haddr_t value;
+    int globality;
+} H5C_tag_t;
+
+/* Define enum for cache entry tag 'globality' value */
+typedef enum {
+    H5C_GLOBALITY_NONE=0, /* Non-global tag */
+    H5C_GLOBALITY_MINOR,  /* global, not flushed during single object flush */
+    H5C_GLOBALITY_MAJOR   /* global, needs flushed during single obect flush */
+} H5C_tag_globality_t;
 
 /*
- * Class methods pertaining to caching.	 Each type of cached object will
- * have a constant variable with permanent life-span that describes how
- * to cache the object.	 That variable will be of type H5C_class_t and
- * have the following required fields...
  *
- * LOAD:	Loads an object from disk to memory.  The function
- *		should allocate some data structure and return it.
+ * Struct H5C_class_t
+ *
+ * Instances of H5C_class_t are used to specify the callback functions
+ * used by the metadata cache for each class of metadata cache entry.
+ * The fields of the structure are discussed below:
+ *
+ * id:	Integer field containing the unique ID of the class of metadata
+ * 	cache entries.
+ *
+ * name: Pointer to a string containing the name of the class of metadata
+ * 	cache entries.
+ *
+ * mem_type:  Instance of H5FD_mem_t, that is used to supply the
+ * 	mem type passed into H5F_block_read().
+ *
+ * flags:  Flags indicating class-specific behavior.
+ *
+ *	Whoever created the flags field neglected to document the meanings 
+ *      of the flags he created.  Hence the following discussion of the 
+ *	H5C__CLASS_SPECULATIVE_LOAD_FLAG and (to a lesser extent) 
+ *	H5C__CLASS_COMPRESSED_FLAG should be viewed with suspicion, 
+ *	as the meanings are divined from the source code, and thus may be 
+ *	inaccurate.  Please correct any errors you find.
+ *
+ *	Possible flags are:
+ *
+ *	H5C__CLASS_NO_FLAGS_SET: No special processing.
+ *
+ *	H5C__CLASS_SPECULATIVE_LOAD_FLAG: This flag appears to be used
+ *		only in H5C_load_entry().  When it is set, entries are 
+ *		permitted to change their sizes on the first attempt 
+ *		to load.  
+ *
+ *		If the new size is larger than the old, the read buffer
+ *		is reallocated to the new size, loaded from file, and the 
+ *		deserialize routine is called a second time on the 
+ *		new buffer.  The entry returned by the first call to 
+ *		the deserialize routine is discarded (via the free_icr
+ *		call) after the new size is retrieved (via the image_len
+ *		call).  Note that the new size is used as the size of the 
+ *		entry in the cache.
+ *
+ *		If the new size is smaller than the old, no new loads 
+ *		or desearializes are performed, but the new size becomes
+ *		the size of the entry in the cache.
+ *
+ *		When this flag is set, an attempt to read past the 
+ *		end of file is pemitted.  In this case, if the size 
+ *		returned get_load_size callback would result in a 
+ *		read past the end of file, the size is trunkated to 
+ *		avoid this, and processing proceeds as normal.
+ *
+ *	H5C__CLASS_COMPRESSED_FLAG: This flags indicates that the entry 
+ *		may be compressed -- i.e. its on disk image is run through 
+ *		filters on the way to and from disk.  Thus the uncompressed 
+ *		(or unfiltered) size of the entry may be different from the 
+ *		size of the entry in file.  
+ *
+ *		This has the following implications:
+ *
+ *		On load, uncompressed size and load size may be different.  
+ *		Presumably, load size will be smaller than uncompressed 
+ *		size, but there is no requirement for this in the code 
+ *		(but note that I have inserted an assertion to this effect, 
+ *		which has not been triggered to date).
+ *
+ *		On insertion, compressed (AKA filtered, AKA on disk) size 
+ *		is unknown, as the entry has yet to be run through filters.
+ *		Compressed size is computed whenever the entry is 
+ *		written (or the image is updated -- not relevant until 
+ *		journaling is brought back).
+ *
+ *		On dirty (of a clean entry), compressed (AKA filtered, 
+ *		AKA on disk) size becomes unknown.  Thus, compressed size
+ *		must be computed by the pre-serialize callback before the 
+ *		entry may be written.  
+ *
+ *		Once the compressed size becomes unknown, it remains so 
+ *		until the on disk image is constructed.  
+ *
+ *		Observe that the cache needs to know the size of the entry
+ *		for space allocation purposes.  Since the compressed size 
+ *		can change or become unknown, it uses the uncompressed
+ *		size which may change, but which should always be known.  
+ *		The compressed size is used only for journaling and disk I/O.
+ *
+ *		While there is no logical reason why they could not be 
+ *		combined, due to absence of need and for simplicity of code, 
+ *		the cache does not permit both the the 
+ *		H5C__CLASS_COMPRESSED_FLAG and the 
+ *		H5C__CLASS_SPECULATIVE_LOAD_FLAG to be set in the same 
+ *		instance of H5C_class_t.
+ *
+ *      The following flags may only appear in test code.
+ *
+ *	H5C__CLASS_NO_IO_FLAG:  This flag is intended only for use in test 
+ *		code.  When it is set, any attempt to load an entry of 
+ *		the type with this flag set will trigger an assertion 
+ *		failure, and any flush of an entry with this flag set 
+ *		will not result in any write to file.
+ *
+ *	H5C__CLASS_SKIP_READS: This flags is intended only for use in test
+ *		code.  When it is set, reads on load will be skipped,
+ *		and an uninitialize buffer will be passed to the 
+ *		deserialize function.
+ *		This flag is used in H5Oproxy.c because this client does not
+ *		exist on disk.  See description in that file.
+ *
+ *	H5C__CLASS_SKIP_WRITES: This flags is intended only for use in test
+ *		code.  When it is set, writes of buffers prepared by the 
+ *		serialize callback will be skipped.
+ *		This flag is used in H5Oproxy.c because this client does not
+ *		exist on disk.  See description in that file.
+ *
+ * GET_LOAD_SIZE: Pointer to the 'get load size' function.
+ *
+ * 	This function determines the size of a metadata cache entry based
+ *      on the parameter "image":
+ *	(a) When the piece of metadata has not been read, "image" is null.  
+ *	    This function determines the size based on the information in the 
+ *	    parameter "udata" or an initial speculative guess.  The size is
+ *	    returned in the parameter "image_len_ptr".
+ *	(b) When the piece of metadata has been read, "image" is non-null.
+ *	    This function might deserialize the needed metadata information
+ *	    to determine the actual size.  The size is returned in the
+ *	    parameter "actual_len_ptr".  The calculation of actual size is
+ *	    needed for checksum verification.
+ *
+ * 	For an entry with H5C__CLASS_NO_FLAGS_SET:
+ *	  This function computes either one of the following:
+ *		(1) When "image" is null, it returns in "image_len_ptr" 
+ *		    the on disk size of the entry.
+ *		(2) When "image" is non-null, it does nothing.
+ *		    The values stored in "image_len_ptr" and "actual_len_ptr" 
+ *		    should be the same.
+ *	
+ * 	For an entry with H5C__CLASS_SPECULATIVE_LOAD_FLAG:
+ *	  This function computes either one of the following:
+ *		(1) When "image" is null, it returns in "image_len_ptr" 
+ *		    the initial guess of the entry's on disk size.
+ *		(2) When "image" is non-null, it returns in "actual_len_ptr" 
+ *		    the actual size of the entry on disk by 
+ *		    deserializing the needed metadata information.
+ *
+ * 	For an entry with H5C__CLASS_COMPRESSED_FLAG:
+ *	  This function computes either one of the following:
+ *		(1) When "image" is null, it returns in "image_len_ptr" 
+ *		    the entry's on disk size:
+ *		    --for a filtered entry: the compressed size
+ *		    --for a non-filtered entry: the uncompressed size
+ *		(2) When "image" is non-null, it returns in "actual_len_ptr:
+ *		    --for a filtered entry: the de-compressed size based on 
+ *		      "udata" information
+ *		    --for a non-filtered entry: the uncompressed size
+ *
+ *	The typedef for the get_load_size callback is as follows:
+ *
+ * 	   typedef herr_t (*H5C_get_load_size_func_t)(const void *image_ptr,
+ *						      void *udata_ptr,
+ * 	                                              size_t *image_len_ptr,
+ *						      size_t *actual_len_ptr,
+ *						      size_t *compressed_ptr,
+ *						      size_t *compressed_image_len_ptr);
+ *
+ *	The parameters of the get_load_size callback are as follows:
+ *
+ *	image_ptr: Pointer to a buffer containing the metadata read in.
+ *
+ *	udata_ptr: Pointer to user data provided in the protect call, which
+ *         	will also be passed through to the deserialize callback.
+ *
+ *	image_len_ptr: Pointer to the location in which the length in bytes 
+ *		of the in file image to be deserialized is to be returned.
+ *
+ *              This value is used by the cache to determine the size of
+ *              the disk image for the metadata, in order to read the disk
+ *              image from the file.
+ *	
+ *	actual_len_ptr: Pointer to the location containing the actual length
+ *			of the metadata entry on disk.
+ *
+ *	compressed_ptr: See description in image_len callback.
+ *	
+ *	compressed_image_len_ptr: See description in image_len callback.
+ *
+ *	Processing in the get_load_size function should proceed as follows:
+ *
+ *	If successful, the function will place the length in either the
+ *	*image_len_ptr or *actual_le_ptr associated with supplied user data
+ *	and then return SUCCEED.
+ *
+ *	On failure, the function must return FAIL and push error information
+ *	onto the error stack with the error API routines, without modifying
+ *      the value pointed to by image_len_ptr or actual_len_ptr.
+ *
+ *
+ * VERIFY_CHKSUM: Pointer to the verify_chksum function.
+ *
+ *	This function verifies the checksum computed for the metadata is
+ *	the same as the checksum stored in the metadata.
+ *
+ *	It computes the checksum based on the metadata stored in the
+ *	parameter "image_ptr" and the actual length of the metadata in the 
+ * 	parameter "len"  which is obtained from the "get_load_size" callback.
+ *
+ *	For a filtered metadata entry with H5C__CLASS_COMPRESSED_FLAG, 
+ *	"len" is the decompressed size.  This function will decompress 
+ *	the metadata and compute the checksum for the metadata with 
+ *	length "len".
+ *
+ *	The typedef for the verify_chksum callback is as follows:
+ *
+ *	   typedef htri_t (*H5C_verify_chksum_func_t)(const void *image_ptr, 
+ *						      size_t len, 
+ *						      void *udata_ptr);
+ *
+ *	The parameters of the verify_chksum callback are as follows:
+ *	
+ *	image_ptr: Pointer to a buffer containing the metadata read in.
+ *
+ *	len: The actual length of the metadata.
+ *
+ *	udata_ptr: Pointer to user data.
+ *
  *
- * FLUSH:	Writes some data structure back to disk.  It would be
- *		wise for the data structure to include dirty flags to
- *		indicate whether it really needs to be written.	 This
- *		function is also responsible for freeing memory allocated
- *		by the LOAD method if the DEST argument is non-zero (by
- *              calling the DEST method).
+ * DESERIALIZE: Pointer to the deserialize function.
  *
- * DEST:	Just frees memory allocated by the LOAD method.
+ * 	This function must be able to read a buffer containing the on disk 
+ *	image of a metadata cache entry, allocate and load the equivalent 
+ *	in core representation, and return a pointer to that representation.
  *
- * CLEAR:	Just marks object as non-dirty.
+ *	The typedef for the deserialize callback is as follows:
  *
- * SIZE:	Report the size (on disk) of the specified cache object.
- *		Note that the space allocated on disk may not be contiguous.
- */
+ * 	   typedef void *(*H5C_deserialize_func_t)(const void * image_ptr,
+ * 	                                           size_t len,
+ *                                                 void * udata_ptr,
+ *                                                 boolean * dirty_ptr);
+ *
+ *	The parameters of the deserialize callback are as follows:
+ *
+ *	image_ptr: Pointer to a buffer of length len containing the
+ *		contents of the file starting at addr and continuing
+ *		for len bytes.
+ *
+ *	len:    Length in bytes of the in file image to be deserialized.
+ *
+ *              This parameter is supplied mainly for sanity checking.
+ *              Sanity checks should be performed when compiled in debug
+ *              mode, but the parameter may be unused when compiled in
+ *              production mode.
+ *
+ *	udata_ptr: Pointer to user data provided in the protect call, which
+ *         	must be passed through to the deserialize callback.
+ *
+ *      dirty_ptr:  Pointer to boolean which the deserialize function
+ *      	must use to mark the entry dirty if it has to modify
+ *      	the entry to clean up file corruption left over from
+ *      	an old bug in the HDF5 library.
+ *
+ *	Processing in the deserialize function should proceed as follows:
+ *
+ *	NOTE: With the modification to get_load_size callback (see above 
+ *	description) to compute the actual length of a metadata entry for 
+ *	checksum verification, the value in the parameter "len" will be the 
+ *	actual length of the metadata and a subsequent call to image_len
+ * 	callback is not needed.
+ *
+ *      If the image contains valid data, and is of the correct length,
+ *      the deserialize function must allocate space for an in core
+ *      representation of that data, load the contents of the image into
+ *      the space allocated for the in core representation, and return
+ *      a pointer to the in core representation.  Observe that an
+ *      instance of H5C_cache_entry_t must be the first item in this
+ *      representation.  The cache will initialize it after the callback
+ *      returns.
+ *
+ *      Note that the structure of the in core representation is otherwise
+ *      up to the cache client.  All that is required is that the pointer
+ *      returned be sufficient for the clients purposes when it is returned
+ *      on a protect call.
+ *
+ *      If the deserialize function has to clean up file corruption
+ *      left over from an old bug in the HDF5 library, it must set
+ *      *dirty_ptr to TRUE.  If it doesn't, no action is needed as
+ *      *dirty_ptr will be set to FALSE before the deserialize call.
+ *
+ *      If the operation fails for any reason (i.e. bad data in buffer, bad
+ *      buffer length, malloc failure, etc.) the function must return NULL and
+ *      push error information on the error stack with the error API routines.
+ *
+ *	Exceptions to the above:
+ *
+ *	If the H5C__CLASS_SPECULATIVE_LOAD_FLAG is set, the buffer supplied
+ *	to the function need not be currect on the first invocation of the 
+ *	callback in any single attempt to load the entry.
+ *
+ *	In this case, if the buffer is larger than necessary, the function
+ *	should load the entry as described above and not flag an error due
+ *	to the oversized buffer.  The cache will correct its mis-apprehension
+ *	of the entry size with a subsequent call to the image_len callback.
+ *
+ *	If the buffer is too small, and this is the first deserialize call
+ *	in the entry load operation, the function should not flag an error.
+ *	Instead, it must compute the correct size of the entry, allocate an
+ *	in core representation and initialize it to the extent that an 
+ *	immediate call to the image len callback will return the correct 
+ *	image size.
+ *
+ *	In this case, when the deserialize callback returns, the cache will
+ *	call the image length callback, realize that the supplied buffer was
+ *	too small, discard the returned in core representation, allocate
+ *	and load a new buffer of the correct size from file, and then call
+ *	the deserialize callback again.
+ *
+ *	If the H5C__CLASS_COMPRESSED_FLAG is set, exceptions are as per the
+ *	H5C__CLASS_SPECULATIVE_LOAD_FLAG, save that only oversized buffers
+ *	are permitted.
+ *
+ *
+ * IMAGE_LEN: Pointer to the image length callback.
 
-#define H5C_CALLBACK__NO_FLAGS_SET		0x0
-#define H5C_CALLBACK__SIZE_CHANGED_FLAG		0x1
-#define H5C_CALLBACK__MOVED_FLAG		0x2
+ *	NOTE: With the modification to the get_load_size callback (see above
+ *	description) due to checksum verification, the image_len callback 
+ *	is mainly used for newly inserted entries and assert verification.
+ *
+ *	This callback exists primarily to support 
+ *	H5C__CLASS_SPECULATIVE_LOAD_FLAG and H5C__CLASS_COMPRESSED_FLAG 
+ *	discussed above, although it is also used to obtain the size of 
+ *	newly inserted entries.
+ *
+ *	In the case of the H5C__CLASS_SPECULATIVE_LOAD_FLAG, it is used to
+ *	allow the client to change the size of an entry in the deserialize
+ *	callback.
+ *
+ *	For the H5C__CLASS_COMPRESSED_FLAG, it is used to allow the client
+ *	to indicate whether the entry is compressed (i.e. whether entries
+ *	are run through filters) and if so, to report both the uncompressed 
+ *	and the compressed entry size (i.e. the actual on disk size after
+ *	the entry has been run through filters) if that value is known.
+ *
+ *	The callback is also used in H5C_insert_entry() to obtain the 
+ *	size of the newly inserted entry.
+ *
+ *      The typedef for the image_len callback is as follows:
+ *
+ *      typedef herr_t (*H5C_image_len_func_t)(void *thing,
+ *                                           size_t *image_len_ptr,
+ *                                           hbool_t *compressed_ptr,
+ *                                           size_t *compressed_image_len_ptr);
+ *
+ * 	The parameters of the image_len callback are as follows:
+ *
+ *	thing:  Pointer to the in core representation of the entry.
+ *
+ *	image_len_ptr: Pointer to size_t in which the callback will return
+ *		the length (in bytes) of the cache entry.
+ *
+ *		If the H5C__CLASS_COMPRESSED_FLAG is not set in the 
+ *		associated instance of H5C_class_t, or if the flag is 
+ *		set, and the callback sets *compressed_ptr to FALSE,
+ *		this size is the actual size of the entry on disk.
+ *
+ *		Otherwise, this size is the uncompressed size of the 
+ *		entry -- which the cache will use for all purposes OTHER
+ *		than journal writes and disk I/O.
+ *
+ *	compressed_ptr: Pointer to a boolean flag indicating whether 
+ *		the cache entry will be compressed / uncompressed on 
+ *		disk writes / reads.
+ *
+ *		If the H5C__CLASS_COMPRESSED_FLAG is not set in the
+ *              associated instance of H5C_class_t, *compressed_ptr 
+ *		must be set to FALSE.
+ *
+ *		If the H5C__CLASS_COMPRESSED_FLAG is set in the
+ *              associated instance of H5C_class_t, and filters are 
+ *		not enabled, *compressed_ptr must be set to FALSE.
+ *
+ *		If the H5C__CLASS_COMPRESSED_FLAG is set in the
+ *              associated instance of H5C_class_t, and filters are
+ *		enabled, the callback must set *compressed_ptr to TRUE.
+ *
+ *		Note that *compressed_ptr will always be set to FALSE 
+ *		by the caller prior to invocation of the callback.  Thus 
+ *		callbacks for clients that don't set the 
+ *		H5C__CLASS_COMPRESSED_FLAG can ignore this parameter.
+ *
+ *	compressed_image_len_ptr: Pointer to size_t in which the callback 
+ *		may return the length (in bytes) of the compressed on 
+ *		disk image of the entry, or the uncompressed size if the
+ *		compressed size has not yet been calculated.
+ *
+ *		Since computing the compressed image len is expensive, 
+ *		the callback should only report the most recently computed
+ *		value -- which will typically be incorrect if the entry
+ *		is dirty.
+ *
+ *		If *compressed_ptr is set to FALSE, *compressed_image_len_ptr
+ *		should be set to zero.  However, as *compressed_image_len_ptr
+ *		will be initialize to zero prior to the call, the callback 
+ *		need not modify it if the H5C__CLASS_COMPRESSED_FLAG is 
+ *		not set.
+ *
+ *	If the H5C__CLASS_COMPRESSED_FLAG is not set in the associated 
+ *	instance of H5C_class_t, processing in the image_len function 
+ *	should proceed as follows:
+ *
+ *	If successful, the function will place the length of the on disk
+ *	image associated with the in core representation provided in the
+ *	thing parameter in *image_len_ptr, and then return SUCCEED.  Since
+ *	*compressed_ptr and *compressed_image_len_ptr will be initialized to 
+ *	FALSE and zero respectively before the call, the callback need not
+ *	modify these values, and may declare the associated parameters as 
+ *	UNUSED.
+ *
+ *	If the H5C__CLASS_COMPRESSED_FLAG is set in the associated 
+ *      instance of H5C_class_t, processing in the image_len function 
+ *      should proceed as follows:
+ *
+ *	If successful, the function will place the uncompressed length of 
+ *	the on disk image associated with the in core representation 
+ *	provided in the thing parameter in *image_len_ptr.  If filters 
+ *	are not enabled for the entry, it will set *compressed_ptr to FALSE,
+ *      and *compressed_image_len_ptr to zero.  If filters are enabled, 
+ *	it will set *compressed_ptr to TRUE.  In this case, it must set 
+ *	*compressed_image_len_ptr equal to the last computed compressed
+ *	if the compressed size, or to the uncompressed size if that value
+ *	is yet to be computed.  In all cases, it will return SUCCEED if 
+ *	successful.
+ *
+ *	In either case, if the function fails, it must return FAIL and 
+ *	push error information onto the error stack with the error API 
+ *	routines, and return without modifying the values pointed to by 
+ *	the image_len_ptr, compressed_ptr, and compressed_image_len_ptr
+ *	parameters.
+ *
+ * PRE_SERIALIZE: Pointer to the pre-serialize callback.
+ *
+ *	The pre-serialize callback is invoked by the metadata cache before
+ *	it needs a current on-disk image of the metadata entry for purposes
+ *	either constructing a journal or flushing the entry to disk.
+ *
+ *      If the client needs to change the address or compressed or 
+ *	uncompressed length of the entry prior to flush, the pre-serialize 
+ *	callback is responsible for these actions, so that the actual 
+ *	serialize callback (described below) is only responsible for 
+ *	serializing the data structure, not moving it on disk or resizing it.
+ *
+ *	In addition, the client may use the pre-serialize callback to 
+ *	ensure that the entry is ready to be flushed -- in particular, 
+ *	if the entry contains references to other entries that are in 
+ *	temporary file space, the pre-serialize callback must move those
+ *	entries into real file space so that the serialzed entry will 
+ *	contain no invalid data.
+ *
+ *	One would think that the base address and length of
+ *	the length of the entry's image on disk would be well known. 
+ *	However, that need not be the case as free space section info
+ *	entries will change size (and possibly location) depending on the 
+ *	number of blocks of free space being manages, and fractal heap 
+ *	direct blocks can change compressed size (and  possibly location) 
+ *	on serialization if compression is enabled.  Similarly, it may
+ *	be necessary to move entries from temporary to real file space.
+ *
+ *	The pre-serialize callback must report any such changes to the 
+ *	cache, which must then update its internal structures as needed.
+ *
+ *	The typedef for the pre-serialize callback is as follows:
+ *
+ *	typedef herr_t (*H5C_pre_serialize_func_t)(const H5F_t *f,
+ *                                             hid_t dxpl_id,
+ *                                             void * thing,
+ *                                             haddr_t addr,
+ *                                             size_t len,
+ *					       size_t compressed_len,
+ *                                             haddr_t * new_addr_ptr,
+ *                                             size_t * new_len_ptr,
+ *					       size_t * new_compressed_len_ptr,
+ *                                             unsigned * flags_ptr);
+ *
+ *	The parameters of the pre-serialize callback are as follows:
+ *
+ *	f:	File pointer -- needed if other metadata cache entries
+ *		must be modified in the process of serializing the
+ *		target entry.
+ *
+ *	dxpl_id: dxpl_id passed with the file pointer to the cache, and
+ *	        passed on to the callback.  Necessary as some callbacks
+ *	        revise the size and location of the target entry, or
+ *	        possibly other entries on pre-serialize.
+ *
+ *	thing:  Pointer to void containing the address of the in core
+ *		representation of the target metadata cache entry. 
+ *		This is the same pointer returned by a protect of the
+ *		addr and len given above.
+ *
+ *	addr:   Base address in file of the entry to be serialized.
+ *
+ *		This parameter is supplied mainly for sanity checking.
+ *		Sanity checks should be performed when compiled in debug
+ *		mode, but the parameter may be unused when compiled in
+ *		production mode.
+ *
+ *	len:    Length in bytes of the in file image of the entry to be
+ *		serialized.  Also the size the image passed to the 
+ *		serialize callback (discussed below) unless either that 
+ *		value is altered by this function, or the entry will be
+ *		compressed.  In the latter case, the compressed size
+ *		of the entry will be reported in *new_compressed_len_ptr.
+ *
+ *		This parameter is supplied mainly for sanity checking.
+ *		Sanity checks should be performed when compiled in debug
+ *		mode, but the parameter may be unused when compiled in
+ *		production mode.
+ *
+ *	compressed_len: If the entry is to be compressed (i.e. run through 
+ *		filters) prior to flush, Length in bytes of the last know 
+ *		compressed size of the entry -- or the uncompressed size 
+ *		if no such value exists (i.e. the entry has been inserted, 
+ *		but never flushed).  This parameter should be set to zero
+ *		in all other cases.
+ *
+ *		This parameter is supplied mainly for sanity checking.
+ *		Sanity checks should be performed when compiled in debug
+ *		mode, but the parameter may be unused when compiled in
+ *		production mode.
+ *
+ *	new_addr_ptr:  Pointer to haddr_t.  If the entry is moved by
+ *		the serialize function, the new on disk base address must
+ *		be stored in *new_addr_ptr, and the appropriate flag set
+ *		in *flags_ptr.  
+ *
+ *		If the entry is not moved by the serialize function, 
+ *		*new_addr_ptr is undefined on pre-serialize callback 
+ *		return.
+ *
+ *	new_len_ptr:  Pointer to size_t.  If the entry is resized by the
+ *		serialize function, the new length of the on disk image
+ *		must be stored in *new_len_ptr, and the appropriate flag set
+ *              in *flags_ptr.
+ *
+ *		If the entry is not resized by the pre-serialize function, 
+ *		*new_len_ptr is undefined on pre-serialize callback 
+ *		return.
+ *
+ *	new_compressed_len_ptr: Pointer to size_t.  If the image will be
+ *		compressed (i.e. run through filters) prior to being 
+ *		written to disk, the compressed size (in bytes) of the
+ *		on disk image must be stored in *new_compressed_len_ptr,
+ *		and the appropriate flag set in *flags_ptr.  
+ *
+ *	flags_ptr:  Pointer to an unsigned integer used to return flags
+ *		indicating whether the preserialize function resized or moved
+ *		the entry, or computed its compressed size.  If the entry was 
+ *		neither resized or moved, nor will be compressed,
+ *		the serialize function must set *flags_ptr to zero. 
+ *		H5C__SERIALIZE_RESIZED_FLAG, H5C__SERIALIZE_MOVED_FLAG
+ *		and H5C__SERIALIZE_COMPRESSED_FLAG must be set to indicate 
+ *		a resize, a move, or compression respectively.
+ *
+ *	        If the H5C__SERIALIZE_RESIZED_FLAG is set, the new length
+ *	        must be stored in *new_len_ptr.
+ *
+ *	        If the H5C__SERIALIZE_MOVED_FLAG flag is set, the
+ *	        new image base address must be stored in *new_addr_ptr. 
+ *
+ *		If the H5C__SERIALIZE_COMPRESSED_FLAG is set, the 
+ *		compressed size of the new image must be stored in 
+ *		*new_compressed_len_ptr. 
+ *
+ *	Processing in the pre-serialize function should proceed as follows:
+ *
+ *	The pre-serialize function must examine the in core representation
+ *	indicated by the thing parameter, if the pre-serialize function does
+ *      not need to change the size or location of the on-disk image, or
+ *	compute its compress size, it must set *flags_ptr to zero. 
+ *
+ *	If the (uncompressed) size of the on-disk image must be changed, 
+ *	the pre-serialize function must load the length of the new image 
+ *	into *new_len_ptr, and set the H5C__SERIALIZE_RESIZED_FLAG in 
+ *	*flags_ptr. 
+ *
+ *	If the base address of the on disk image must be changed, the
+ *      pre-serialize function must set *new_addr_ptr to the new base address,
+ *      and set the H5C__SERIALIZE_MOVED_FLAG in *flags_ptr.
+ *
+ *	If the H5C__CLASS_COMPRESSED_FLAG is set in the assocated instance
+ *	of H5C_class_t, and filters (i.e. compression) are enabled, the 
+ *	pre-serialize function must compute the compressed size of the 
+ *	on disk image, and if it has changed, load this value into 
+ *	*new_compressed_len_ptr, and set H5C__SERIALIZE_COMPRESSED_FLAG in 
+ *	*flags_ptr.
+ *
+ *	Note that to do this, the preserialize function will typically have 
+ *	to serialize the entry, and run it through the filters to obtain 
+ *	the compressed size.  For efficiency, the compressed image may
+ *	be stored to be copied into the supplied buffer by the 
+ *	serialize callback.  Needless to say this is awkward.  We may
+ *	want to re-work the API for cache clients to simplify this.
+ *
+ *	In addition, the pre-serialize callback may perform any other 
+ *	processing required before the entry is written to disk
+ *
+ *	If it is successful, the function must return SUCCEED. 
+ *
+ *	If it fails for any reason, the function must return FAIL and
+ *	push error information on the error stack with the error API
+ *	routines.
+ *
+ *
+ * SERIALIZE: Pointer to the serialize callback.
+ *
+ *	The serialize callback is invoked by the metadata cache whenever
+ *	it needs a current on disk image of the metadata entry for purposes
+ *	either constructing a journal entry or flushing the entry to disk.
+ *
+ *	At this point, the base address and length of the entry's image on
+ *      disk must be well known and not change during the serialization
+ *      process. 
+ *
+ *	While any size and/or location changes must have been handled 
+ *	by a pre-serialize call, the client may elect to handle any other 
+ *	changes to the entry required to place it in correct form for 
+ *	writing to disk in this call.
+ *
+ *	The typedef for the serialize callback is as follows:
+ *
+ *	typedef herr_t (*H5C_serialize_func_t)(const H5F_t *f,
+ *                                             void * image_ptr,
+ *                                             size_t len,
+ *                                             void * thing);
+ *
+ *	The parameters of the serialize callback are as follows:
+ *
+ *	f:	File pointer -- needed if other metadata cache entries
+ *		must be modified in the process of serializing the
+ *		target entry.
+ *
+ *	image_ptr: Pointer to a buffer of length len bytes into which a
+ *		serialized image of the target metadata cache entry is
+ *		to be written.
+ *
+ * 		Note that this buffer will not in general be initialized
+ * 		to any particular value.  Thus the serialize function may
+ * 		not assume any initial value and must set each byte in
+ * 		the buffer.
+ *
+ *	len:    Length in bytes of the in file image of the entry to be
+ *		serialized.  Also the size of *image_ptr (below).  If 
+ *		compression is not enabled, this value is simply the 
+ *		uncompressed size of the entry's image on disk.  If 
+ *		compression is enabled, this value is the size of the 
+ *		compressed image.
+ *
+ *		This parameter is supplied mainly for sanity checking.
+ *		Sanity checks should be performed when compiled in debug
+ *		mode, but the parameter may be unused when compiled in
+ *		production mode.
+ *
+ *	thing:  Pointer to void containing the address of the in core
+ *		representation of the target metadata cache entry. 
+ *		This is the same pointer returned by a protect of the
+ *		addr and len given above.
+ *
+ *	Processing in the serialize function should proceed as follows:
+ *
+ *	If there are any remaining changes to the entry required before 
+ *	write to disk, they must be dealt with first.
+ *
+ *	The serialize function must then examine the in core 
+ *	representation indicated by the thing parameter, and write a 
+ *	serialized (and possibly compressed) image of its contents into 
+ *	the provided buffer. 
+ *
+ *	If it is successful, the function must return SUCCEED. 
+ *
+ *	If it fails for any reason, the function must return FAIL and
+ *	push error information on the error stack with the error API
+ *	routines.
+ *
+ *
+ * NOTIFY: Pointer to the notify callback.
+ *
+ *      The notify callback is invoked by the metadata cache when a cache
+ *      action on an entry has taken/will take place and the client indicates
+ *      it wishes to be notified about the action.
+ *
+ *	The typedef for the notify callback is as follows:
+ *
+ *	typedef herr_t (*H5C_notify_func_t)(H5C_notify_action_t action,
+ *                                          void *thing);
+ *
+ * 	The parameters of the notify callback are as follows:
+ *
+ *	action: An enum indicating the metadata cache action that has taken/
+ *              will take place.
+ *
+ *	thing:  Pointer to void containing the address of the in core
+ *		representation of the target metadata cache entry.  This
+ *		is the same pointer that would be returned by a protect
+ *		of the addr and len of the entry. 
+ *
+ *	Processing in the notify function should proceed as follows:
+ *
+ *	The notify function may perform any action it would like, including
+ *      metadata cache calls.
+ *
+ *	If the function is successful, it must return SUCCEED. 
+ *
+ *	If it fails for any reason, the function must return FAIL and
+ *	push error information on the error stack with the error API
+ *	routines. 
+ *
+ *
+ * FREE_ICR: Pointer to the free ICR callback.
+ *
+ *	The free ICR callback is invoked by the metadata cache when it
+ *	wishes to evict an entry, and needs the client to free the memory
+ *	allocated for the in core representation. 
+ *
+ *	The typedef for the free ICR callback is as follows:
+ *
+ *	typedef herr_t (*H5C_free_icr_func_t)(void * thing));
+ *
+ * 	The parameters of the free ICR callback are as follows:
+ *
+ *	thing:  Pointer to void containing the address of the in core
+ *		representation of the target metadata cache entry.  This
+ *		is the same pointer that would be returned by a protect
+ *		of the addr and len of the entry. 
+ *
+ *	Processing in the free ICR function should proceed as follows:
+ *
+ *	The free ICR function must free all memory allocated to the
+ *	in core representation. 
+ *
+ *	If the function is successful, it must return SUCCEED. 
+ *
+ *	If it fails for any reason, the function must return FAIL and
+ *	push error information on the error stack with the error API
+ *	routines. 
+ *
+ *	At least when compiled with debug, it would be useful if the
+ *	free ICR call would fail if the in core representation has been
+ *	modified since the last serialize of clear callback.
+ *
+ * CLEAR: Pointer to the clear callback.
+ *
+ *	In principle, there should be no need for the clear callback,
+ *	as the dirty flag should be maintained by the metadata cache.
+ *.  
+ *	However, some clients maintain dirty bits on internal data, 
+ *	and we need some way of keeping these dirty bits in sync with 
+ *	those maintained by the metadata cache.  This callback exists
+ *	to serve this purpose.  If defined, it is called whenever the 
+ *	cache marks dirty entry clean, or when the cache is about to 
+ *	discard a dirty entry without writing it to disk (This 
+ *	happens as the result of an unprotect call with the 
+ *	H5AC__DELETED_FLAG set, and the H5C__TAKE_OWNERSHIP_FLAG not
+ *	set.)
+ *
+ *	Arguably, this functionality should be in the NOTIFY callback.
+ *	However, this callback is specific to only a few clients, and 
+ *	it will be called relatively frequently.  Hence it is made its
+ *	own callback to minimize overhead.
+ *
+ *	The typedef for the clear callback is as follows:
+ *
+ *	typedef herr_t (*H5C_clear_func_t)(const H5F_t *f,
+ *                                         void * thing, 
+ *                                         hbool_t about_to_destroy);
+ *
+ *	The parameters of the clear callback are as follows:
+ *
+ *	f:	File pointer.
+ *
+ *	thing:  Pointer to void containing the address of the in core
+ *		representation of the target metadata cache entry.  This
+ *		is the same pointer that would be returned by a protect()
+ *		call of the associated addr and len.
+ *
+ *	about_to_destroy: Boolean flag used to indicate whether the 
+ *		metadata cache is about to destroy the target metadata
+ *		cache entry.  The callback may use this flag to omit
+ *		operations that are irrelevant it the entry is about 
+ *		to be destroyed.
+ *
+ *	Processing in the clear function should proceed as follows:
+ *
+ *	Reset all internal dirty bits in the target metadata cache entry.
+ *
+ *	If the about_to_destroy flag is TRUE, the clear function may 
+ *	ommit any dirty bit that will not trigger a sanity check failure 
+ *	or otherwise cause problems in the subsequent free icr call.
+ *	In particular, the call must ensure that the free icr call will
+ *	not fail due to changes prior to this call, and after the 
+ *	last serialize or clear call.
+ *
+ *	If the function is successful, it must return SUCCEED. 
+ *
+ *	If it fails for any reason, the function must return FAIL and
+ *	push error information on the error stack with the error API
+ *	routines. 
+ *
+ * GET_FSF_SIZE: Pointer to the get file space free size callback.
+ *
+ *	In principle, there is no need for the get file space free size
+ *	callback.  However, as an optimization, it is sometimes convenient
+ *	to allocate and free file space for a number of cache entries 
+ *	simultaneously in a single contiguous block of file space.
+ *
+ *	File space allocation is done by the client, so the metadata cache
+ *	need not be involved.  However, since the metadata cache typically
+ *      handles file space release when an entry is destroyed, some 
+ *	adjustment on the part of the metadata cache is required for this
+ *	operation.
+ *
+ *      The get file space free size callback exists to support this 
+ *	operation.
+ *
+ *	If a group of cache entries that were allocated as a group are to 
+ *	be discarded and their file space released, the type of the first
+ *	(i.e. lowest address) entry in the group must implement the 
+ *	get free file space size callback.  
+ *
+ *	To free the file space of all entries in the group in a single 
+ *	operation, first expunge all entries other than the first without 
+ *	the free file space flag.  
+ *
+ *	Then, to complete the operation, unprotect or expunge the first
+ *	entry in the block with the free file space flag set.  Since 
+ *	the get free file space callback is implemented, the metadata 
+ *	cache will use this callback to get the size of the block to be
+ *	freed, instead of using the size of the entry as is done otherwise.
+ *
+ *	At present this callback is used only by the H5FA and H5EA dblock
+ *	and dblock page client classes.
+ *
+ *      The typedef for the clear callback is as follows:
+ *
+ *      typedef herr_t (*H5C_get_fsf_size_t)(const void * thing,
+ *                                                size_t *fsf_size_ptr);
+ *
+ *      The parameters of the clear callback are as follows:
+ *
+ *      thing:  Pointer to void containing the address of the in core
+ *              representation of the target metadata cache entry.  This
+ *              is the same pointer that would be returned by a protect()
+ *              call of the associated addr and len.
+ *
+ *	fs_size_ptr: Pointer to size_t in which the callback will return
+ *              the size of the piece of file space to be freed.  Note 
+ *		that the space to be freed is presumed to have the same 
+ *		base address as the cache entry.
+ *
+ *      The function simply returns the size of the block of file space
+ *	to be freed in *fsf_size_ptr.  
+ *
+ *	If the function is successful, it must return SUCCEED.
+ *
+ *      If it fails for any reason, the function must return FAIL and
+ *      push error information on the error stack with the error API
+ *      routines.
+ *
+ ***************************************************************************/
 
 /* Actions that can be reported to 'notify' client callback */
 typedef enum H5C_notify_action_t {
-    H5C_NOTIFY_ACTION_AFTER_INSERT,     /* Entry has been added to the cache */
-                                        /* (could be loaded from file with
-                                         *      'protect' call, or inserted
-                                         *      with 'set' call)
+    H5C_NOTIFY_ACTION_AFTER_INSERT,     /* Entry has been added to the cache 
+                                         * via the insert call
+                                         */
+    H5C_NOTIFY_ACTION_AFTER_LOAD,	/* Entry has been loaded into the 
+                                         * from file via the protect call
+                                         */
+    H5C_NOTIFY_ACTION_AFTER_FLUSH,	/* Entry has just been flushed to
+ 					 * file.
+                                         */
+    H5C_NOTIFY_ACTION_BEFORE_EVICT      /* Entry is about to be evicted 
+                                         * from cache.
                                          */
-    H5C_NOTIFY_ACTION_BEFORE_EVICT      /* Entry is about to be evicted from cache */
 } H5C_notify_action_t;
 
-typedef void *(*H5C_load_func_t)(H5F_t *f,
-                                 hid_t dxpl_id,
-                                 haddr_t addr,
-                                 void *udata);
-typedef herr_t (*H5C_flush_func_t)(H5F_t *f,
-                                   hid_t dxpl_id,
-                                   hbool_t dest,
-                                   haddr_t addr,
-                                   void *thing,
-				   unsigned * flags_ptr);
-typedef herr_t (*H5C_dest_func_t)(H5F_t *f,
-                                  void *thing);
-typedef herr_t (*H5C_clear_func_t)(H5F_t *f,
-                                   void *thing,
-                                   hbool_t dest);
-typedef herr_t (*H5C_notify_func_t)(H5C_notify_action_t action,
-                                 void *thing);
-typedef herr_t (*H5C_size_func_t)(const H5F_t *f,
-                                  const void *thing,
-                                  size_t *size_ptr);
-
+/* Cache client callback function pointers */
+typedef herr_t (*H5C_get_load_size_func_t)(const void *image_ptr, void *udata_ptr,
+    size_t *image_len_ptr, size_t *actual_len_ptr, 
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+typedef htri_t (*H5C_verify_chksum_func_t)(const void *image_ptr, size_t len, void *udata_ptr);
+typedef void *(*H5C_deserialize_func_t)(const void *image_ptr,
+    size_t len, void *udata_ptr, hbool_t *dirty_ptr);
+typedef herr_t (*H5C_image_len_func_t)(const void *thing,
+    size_t *image_len_ptr, hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+typedef herr_t (*H5C_pre_serialize_func_t)(const H5F_t *f, hid_t dxpl_id,
+    void *thing, haddr_t addr, size_t len, size_t compressed_len,
+    haddr_t *new_addr_ptr, size_t *new_len_ptr, size_t *new_compressed_len_ptr,
+    unsigned *flags_ptr);
+typedef herr_t (*H5C_serialize_func_t)(const H5F_t *f, void *image_ptr,
+    size_t len, void *thing);
+typedef herr_t (*H5C_notify_func_t)(H5C_notify_action_t action, void *thing);
+typedef herr_t (*H5C_free_icr_func_t)(void *thing);
+typedef herr_t (*H5C_clear_func_t)(const H5F_t *f, void * thing, 
+    hbool_t about_to_destroy);
+typedef herr_t (*H5C_get_fsf_size_t)(const void * thing, size_t *fsf_size_ptr);
+
+/* Metadata cache client class definition */
 typedef struct H5C_class_t {
-    int			id;
-    H5C_load_func_t	load;
-    H5C_flush_func_t	flush;
-    H5C_dest_func_t	dest;
-    H5C_clear_func_t	clear;
-    H5C_size_func_t	size;
+    int				id;
+    const char *		name;
+    H5FD_mem_t			mem_type;
+    unsigned			flags;
+    H5C_get_load_size_func_t 	get_load_size;
+    H5C_verify_chksum_func_t	verify_chksum;
+    H5C_deserialize_func_t 	deserialize;
+    H5C_image_len_func_t	image_len;
+    H5C_pre_serialize_func_t	pre_serialize;
+    H5C_serialize_func_t	serialize;
+    H5C_notify_func_t		notify;
+    H5C_free_icr_func_t	        free_icr;
+    H5C_clear_func_t		clear;
+    H5C_get_fsf_size_t		fsf_size;
 } H5C_class_t;
 
-
-/* Type defintions of call back functions used by the cache as a whole */
-
+/* Type defintions of callback functions used by the cache as a whole */
 typedef herr_t (*H5C_write_permitted_func_t)(const H5F_t *f,
-                                             hid_t dxpl_id,
-                                             hbool_t * write_permitted_ptr);
-
-typedef herr_t (*H5C_log_flush_func_t)(H5C_t * cache_ptr,
-                                       haddr_t addr,
-                                       hbool_t was_dirty,
-                                       unsigned flags,
-                                       int type_id);
+    hbool_t *write_permitted_ptr);
+typedef herr_t (*H5C_log_flush_func_t)(H5C_t *cache_ptr, haddr_t addr,
+    hbool_t was_dirty, unsigned flags);
 
-/* Upper and lower limits on cache size.  These limits are picked
- * out of a hat -- you should be able to change them as necessary.
+/****************************************************************************
  *
- * However, if you need a very big cache, you should also increase the
- * size of the hash table (H5C__HASH_TABLE_LEN in H5Cpkg.h).  The current
- * upper bound on cache size is rather large for the current hash table
- * size.
+ * H5C_ring_t & associated #defines
+ *
+ * The metadata cache uses the concept of rings to order the flushes of 
+ * classes of entries.  In this arrangement, each entry in the cache is 
+ * assigned to a ring, and on flush, the members of the outermost ring 
+ * are flushed first, followed by the next outermost, and so on with the
+ * members of the innermost ring being flushed last.  
+ *
+ * Note that flush dependencies are used to order flushes within rings.  
+ *
+ * Note also that at the conceptual level, rings are argueably superfluous,
+ * as a similar effect could be obtained via the flush dependency mechanism.  
+ * However, this would require all entries in the cache to participate in a 
+ * flush dependency -- with the implied setup and takedown overhead and 
+ * added complexity.  Further, the flush ordering between rings need only 
+ * be enforced on flush operations, and thus the use of flush dependencies 
+ * instead would apply unecessary constraints on flushes under normal 
+ * operating circumstances.
+ *
+ * As of this writing, all metadata entries pretaining to data sets and 
+ * groups must be flushed first, and are thus assigned to the outermost 
+ * ring.  
+ *
+ * Free space managers managing file space must be flushed next,
+ * and are assigned to the second outermost ring.
+ *
+ * The object header and associated chunks used to implement superblock 
+ * extension messages must be flushed next, and are thus assigned to 
+ * the third outermost ring.
+ *
+ * The superblock proper must be flushed last, and is thus assigned to 
+ * the innermost ring.
+ *
+ * The H5C_ring_t and the associated #defines below are used to define
+ * the rings.  Each entry must be assigned to the appropriate ring on 
+ * insertion or protect.
+ *
+ * Note that H5C_ring_t was originally an enumerated type.  It was 
+ * converted to an integer and a set of #defines for convenience in 
+ * debugging.
  */
 
-#define H5C__MAX_MAX_CACHE_SIZE		((size_t)(128 * 1024 * 1024))
-#define H5C__MIN_MAX_CACHE_SIZE		((size_t)(1024))
-
-
-/* Default max cache size and min clean size are give here to make
- * them generally accessable.
- */
+#define H5C_RING_UNDEFINED	0 /* shouldn't appear in the cache */
+#define H5C_RING_USER		1 /* outermost ring */
+#define H5C_RING_FSM		2
+#define H5C_RING_SBE		4 /* temporarily merged with H5C_RING_SB */
+#define H5C_RING_SB		4 /* innermost ring */
+#define H5C_RING_NTYPES		5 
 
-#define H5C__DEFAULT_MAX_CACHE_SIZE     ((size_t)(4 * 1024 * 1024))
-#define H5C__DEFAULT_MIN_CLEAN_SIZE     ((size_t)(2 * 1024 * 1024))
+typedef int H5C_ring_t;
 
 
 /****************************************************************************
@@ -219,7 +1292,7 @@ typedef herr_t (*H5C_log_flush_func_t)(H5C_t * cache_ptr,
  *              just before the entry is freed.
  *
  *              This is necessary, as the LRU list can be changed out
- *              from under H5C_make_space_in_cache() by the flush
+ *              from under H5C_make_space_in_cache() by the serialize
  *              callback which may change the size of an existing entry,
  *              and/or load a new entry while serializing the target entry.
  *
@@ -232,18 +1305,66 @@ typedef herr_t (*H5C_log_flush_func_t)(H5C_t * cache_ptr,
  *              detect this case, and re-start its scan from the bottom
  *              of the LRU when this situation occurs.
  *
- *              This field is only compiled in debug mode.
+ * cache_ptr:	Pointer to the cache that this entry is contained within.
  *
  * addr:	Base address of the cache entry on disk.
  *
- * size:	Length of the cache entry on disk.  Note that unlike normal
- *		caches, the entries in this cache are of variable length.
- *		The entries should never overlap, and when we do writebacks,
- *		we will want to writeback adjacent entries where possible.
- *
- *		NB: At present, entries need not be contiguous on disk.  Until
- *		    we fix this, we can't do much with writing back adjacent
- *		    entries.
+ * size:	Length of the cache entry on disk in bytes(exception: if 
+ *		the entry is compressed on disk, this field contains the 
+ *		uncompressed size of the entry -- see discussion of 
+ *		compressed entries below).  Note that unlike normal 
+ *		caches, the entries in this cache are of arbitrary size.
+ *
+ *		With the exception of compressed entries, the file space
+ *		allocations for cache entries implied by the addr and size
+ *		fields must be disjoint.  For compressed entries,
+ *		the size field contains the uncompressed size -- thus in
+ *		in this case, substitution of compressed size for size 
+ *		must result in disjoint file space allocations.  However, 
+ *		as discussed below, the compressed size may not be know.
+ *
+ *		Any entry whose associated instance of H5C_class_t has the
+ *		H5C__CLASS_COMPRESSED_FLAG set may be compressed.  When
+ *		an entry is compressed (that is, when filters are enabled
+ *		on it), the compressed flag (see below) must be set, and 
+ *		the compressed size (if known), must be stored in 
+ *		the compressed_size field.
+ *
+ *		Since the compressed size will be unknown unless the 
+ *		entry is clean, or has an up to date image (see the 
+ *		image_ptr and image_up_to_date fields below), we use the 
+ *		uncompressed size for all purposes other than disk I/O.  
+ *		
+ * compressed:	Boolean flag that is set iff the instance of H5C_class_t
+ *		associated with the entry has the H5C__CLASS_COMPRESSED_FLAG
+ *		set, and filters are enabled on the entry.
+ *
+ * compressed_size: If compressed is TRUE, this field contains the actual
+ *		compressed size of the entry in bytes, which is also its 
+ *		true size on disk -- or the uncompressed size if the 
+ *		compressed size is unknown (i.e. the entry has been 
+ *		inserted in the cache, but it has not been compressed yet).
+ *              Note that this value will usually be incorrect if the 
+ *		entry is dirty.
+ *
+ *		Since this value is frequently out of date and expensive to 
+ *		compute, it is used only for disk I/O.  The uncompressed 
+ *		size of the entry (stored in the size field above) is used 
+ *		for all other purposes (i.e. computing the sum of the sizes 
+ *		of all entries in the cache, etc.).
+ *
+ *		If compressed is FALSE, this field should contain 0.
+ *
+ * image_ptr:	Pointer to void.  When not NULL, this field points to a
+ * 		dynamically allocated block of size bytes in which the
+ * 		on disk image of the metadata cache entry is stored.
+ *
+ * 		If the entry is dirty, the pre-serialize and serialize 
+ *		callbacks must be used to update this image before it is 
+ *		written to disk
+ *
+ * image_up_to_date:  Boolean flag that is set to TRUE when *image_ptr
+ * 		is up to date, and set to false when the entry is dirtied.
  *
  * type:	Pointer to the instance of H5C_class_t containing pointers
  *		to the methods for cache entries of the current type.  This
@@ -253,6 +1374,9 @@ typedef herr_t (*H5C_log_flush_func_t)(H5C_t * cache_ptr,
  *		The name is not particularly descriptive, but is retained
  *		to avoid changes in existing code.
  *
+ * is_corked:	Boolean flag indicating whether the cache entry associated
+ *		with an object is corked or not corked.
+ *
  * is_dirty:	Boolean flag indicating whether the contents of the cache
  *		entry has been modified since the last time it was written
  *		to disk.
@@ -273,20 +1397,22 @@ typedef herr_t (*H5C_log_flush_func_t)(H5C_t * cache_ptr,
  *		      modules using the cache.  These still clear the
  *		      is_dirty field as before.  -- JRM 7/5/05
  *
+ *		Update: Management of the is_dirty field is now entirely
+ *		      in the cache.		 -- JRM 7/5/07
+ *
  * dirtied:	Boolean flag used to indicate that the entry has been
  * 		dirtied while protected.
  *
  * 		This field is set to FALSE in the protect call, and may
- * 		be set to TRUE by the
- * 		H5C_mark_entry_dirty()
- * 		call at an time prior to the unprotect call.
+ * 		be set to TRUE by the H5C_mark_entry_dirty() call at any 
+ *		time prior to the unprotect call.
  *
- * 		The H5C_mark_entry_dirty() call exists
- * 		as a convenience function for the fractal heap code which
- * 		may not know if an entry is protected or pinned, but knows
- * 		that is either protected or pinned.  The dirtied field was
- * 		added as in the parallel case, it is necessary to know
- * 		whether a protected entry was dirty prior to the protect call.
+ * 		The H5C_mark_entry_dirty() call exists as a convenience 
+ *		function for the fractal heap code which may not know if 
+ *		an entry is protected or pinned, but knows that is either 
+ *		protected or pinned.  The dirtied field was added as in 
+ *		the parallel case, it is necessary to know whether a 
+ *		protected entry is dirty prior to the protect call.
  *
  * is_protected: Boolean flag indicating whether this entry is protected
  *		(or locked, to use more conventional terms).  When it is
@@ -330,9 +1456,10 @@ typedef herr_t (*H5C_log_flush_func_t)(H5C_t * cache_ptr,
  * 		   policy code (LRU at present).
  *
  * 		2) A pinned entry can be accessed or modified at any time.
- * 		   Therefore, the cache must check with the entry owner
- * 		   before flushing it.  If permission is denied, the
- * 		   cache does not flush the entry.
+ * 		   This places an extra burden on the pre-serialize and 
+ *		   serialize callbacks, which must ensure that a pinned 
+ *		   entry is consistant and ready to write to disk before 
+ *		   generating an image.
  *
  * 		3) A pinned entry can be marked as dirty (and possibly
  *		   change size) while it is unprotected.
@@ -356,6 +1483,29 @@ typedef herr_t (*H5C_log_flush_func_t)(H5C_t * cache_ptr,
  *		H5C__FLUSH_MARKED_ENTRIES_FLAG.  The flag is reset when
  *		the entry is flushed for whatever reason.
  *
+ * flush_me_last:  Boolean flag indicating that this entry should not be
+ *		flushed from the cache until all other entries without
+ *              the flush_me_last flag set have been flushed.
+ *
+ * flush_me_collectively:  Boolean flag indicating that this entry needs
+ *              to be flushed collectively when in a parallel situation.
+ * 
+ *		Note: 
+ *		
+ *		At this time, the flush_me_last and flush_me_collectively
+ *              flags will only be applied to one entry, the superblock,
+ *              and the code utilizing these flags is protected with HDasserts
+ *              to enforce this. This restraint can certainly be relaxed in
+ *              the future if the the need for multiple entries getting flushed
+ *              last or collectively arises, though the code allowing for that
+ *              will need to be expanded and tested appropriately if that
+ *              functionality is desired.
+ *
+ *		Update: There are now two possible last entries
+ *                   	(superblock and file driver info message).  This
+ *                   	number will probably increase as we add superblock
+ *                   	messages.   JRM -- 11/18/14
+ *
  * clear_on_unprotect:  Boolean flag used only in PHDF5.  When H5C is used
  *		to implement the metadata cache In the parallel case, only
  *		the cache with mpi rank 0 is allowed to actually write to
@@ -383,10 +1533,51 @@ typedef herr_t (*H5C_log_flush_func_t)(H5C_t * cache_ptr,
  * destroy_in_progress:  Boolean flag that is set to true iff the entry
  * 		is in the process of being flushed and destroyed.
  *
- * free_file_space_on_destroy:  Boolean flag that is set to true iff the entry
- * 		is in the process of being flushed and destroyed and the file
- *              space used by the object should be freed by the cache client's
- *              'dest' callback routine.
+ *
+ * Fields supporting rings for flush ordering:
+ *
+ * All entries in the metadata cache are assigned to a ring.  On cache 
+ * flush, all entries in the outermost ring are flushed first, followed
+ * by all members of the next outermost ring, and so on until the 
+ * innermost ring is flushed.  Note that this ordering is ONLY applied 
+ * in flush and serialize calls.  Rings are ignored during normal operations
+ * in which entries are flushed as directed by the replacement policy.
+ *
+ * See the header comment on H5C_ring_t above for further details.
+ *
+ * Note that flush dependencies (see below) are used to order flushes
+ * within rings.  Unlike rings, flush dependencies are applied to ALL
+ * writes, not just those triggered by flush or serialize calls.
+ *
+ * ring:	Instance of H5C_ring_t indicating the ring to which this
+ *		entry is assigned.
+ *
+ *
+ * Fields supporting the 'flush dependency' feature:
+ *
+ * Entries in the cache may have a 'flush dependencies' on other entries in the
+ * cache.  A flush dependency requires that all dirty child entries be flushed
+ * to the file before a dirty parent entry (of those child entries) can be
+ * flushed to the file.  This can be used by cache clients to create data
+ * structures that allow Single-Writer/Multiple-Reader (SWMR) access for the
+ * data structure.
+ *
+ * flush_dep_parent:    Pointer to the array of flush dependency parent entries
+ *              for this entry.
+ *
+ * flush_dep_nparents:  Number of flush dependency parent entries for this
+ *              entry, i.e. the number of valid elements in flush_dep_parent.
+ *
+ * flush_dep_parent_nalloc: The number of allocated elements in
+ *              flush_dep_parent_nalloc.
+ *
+ * flush_dep_nchildren: Number of flush dependency children for this entry.  If
+ *              this field is nonzero, then this entry must be pinned and
+ *              therefore cannot be evicted.
+ *
+ * flush_dep_ndirty_children: Number of flush dependency children that are
+ *              either dirty or have a nonzero flush_dep_ndirty_children.  If
+ *              this field is nonzero, then this entry cannot be flushed.
  *
  *
  * Fields supporting the hash table:
@@ -440,63 +1631,43 @@ typedef herr_t (*H5C_log_flush_func_t)(H5C_t * cache_ptr,
  * The use of the replacement policy fields under the Modified LRU policy
  * is discussed below:
  *
- * next:	Next pointer in either the LRU or the protected list,
- *		depending on the current value of protected.  If there
- *		is no next entry on the list, this field should be set
- *		to NULL.
+ * next:	Next pointer in either the LRU, the protected list, or 
+ *		the pinned list depending on the current values of 
+ *		is_protected and is_pinned.  If there is no next entry 
+ *		on the list, this field should be set to NULL.
  *
- * prev:	Prev pointer in either the LRU or the protected list,
- *		depending on the current value of protected.  If there
- *		is no previous entry on the list, this field should be
- *		set to NULL.
+ * prev:	Prev pointer in either the LRU, the protected list,
+ *		or the pinned list depending on the current values of 
+ *		is_protected and is_pinned.  If there is no previous 
+ *		entry on the list, this field should be set to NULL.
  *
  * aux_next:	Next pointer on either the clean or dirty LRU lists.
- *		This entry should be NULL when protected is true.  When
- *		protected is false, and dirty is true, it should point
- *		to the next item on the dirty LRU list.  When protected
- *		is false, and dirty is false, it should point to the
- *		next item on the clean LRU list.  In either case, when
- *		there is no next item, it should be NULL.
+ *		This entry should be NULL when either is_protected or 
+ *		is_pinned is true.  
+ *
+ *		When is_protected and is_pinned are false, and is_dirty is 
+ *		true, it should point to the next item on the dirty LRU 
+ *		list.  
+ *
+ *		When is_protected and is_pinned are false, and is_dirty is 
+ *		false, it should point to the next item on the clean LRU 
+ *		list.  In either case, when there is no next item, it 
+ *		should be NULL.
  *
  * aux_prev:	Previous pointer on either the clean or dirty LRU lists.
- *		This entry should be NULL when protected is true.  When
- *		protected is false, and dirty is true, it should point
- *		to the previous item on the dirty LRU list.  When protected
- *		is false, and dirty is false, it should point to the
- *		previous item on the clean LRU list.  In either case, when
- *		there is no previous item, it should be NULL.
- *
- *
- * Fields supporting metadata journaling:
- *
- * last_trans:	unit64_t containing the ID of the last transaction in
- * 		which this entry was dirtied.  If journaling is disabled,
- * 		or if the entry has never been dirtied in a transaction,
- * 		this field should be set to zero.  Once we notice that
- * 		the specified transaction has made it to disk, we will
- * 		reset this field to zero as well.
- *
- * 		We must maintain this field, as to avoid messages from
- * 		the future, we must not flush a dirty entry to disk
- * 		until the last transaction in which it was dirtied
- * 		has made it to disk in the journal file.
- *
- * trans_next:  Next pointer in the entries modified in the current
- * 		transaction list.  This field should always be null
- * 		unless journaling is enabled, the entry is dirty,
- * 		and last_trans field contains the current transaction
- * 		number.  Even if all these conditions are fulfilled,
- * 		the field will still be NULL if this is the last
- * 		entry on the list.
- *
- * trans_prev:  Previous pointer in the entries modified in the current
- * 		transaction list.  This field should always be null
- * 		unless journaling is enabled, the entry is dirty,
- * 		and last_trans field contains the current transaction
- * 		number.  Even if all these conditions are fulfilled,
- * 		the field will still be NULL if this is the first
- * 		entry on the list.
+ *		This entry should be NULL when either is_protected or 
+ *		is_pinned is true.  
+ *
+ *		When is_protected and is_pinned are false, and is_dirty is 
+ *		true, it should point to the previous item on the dirty 
+ *		LRU list.  
+ *	
+ *		When is_protected and is_pinned are false, and is_dirty 
+ *		is false, it should point to the previous item on the 
+ *		clean LRU list.  
  *
+ *		In either case, when there is no previous item, it should 
+ *		be NULL.
  *
  * Cache entry stats collection fields:
  *
@@ -517,21 +1688,19 @@ typedef herr_t (*H5C_log_flush_func_t)(H5C_t * cache_ptr,
  * 		been pinned in cache in its life time.
  *
  ****************************************************************************/
-
-#ifndef NDEBUG
-#define H5C__H5C_CACHE_ENTRY_T_MAGIC		0x005CAC0A
-#define H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC	0xDeadBeef
-#endif /* NDEBUG */
-
-typedef struct H5C_cache_entry_t
-{
-#ifndef NDEBUG
+typedef struct H5C_cache_entry_t {
     uint32_t			magic;
-#endif /* NDEBUG */
-    H5C_t *                     cache_ptr;
+    H5C_t                     * cache_ptr;
     haddr_t			addr;
     size_t			size;
-    const H5C_class_t *		type;
+    hbool_t			compressed;
+    size_t			compressed_size;
+    void  		      *	image_ptr;
+    hbool_t			image_up_to_date;
+    const H5C_class_t	      *	type;
+    haddr_t		        tag;
+    int				globality;
+    hbool_t			is_corked;
     hbool_t			is_dirty;
     hbool_t			dirtied;
     hbool_t			is_protected;
@@ -540,40 +1709,46 @@ typedef struct H5C_cache_entry_t
     hbool_t			is_pinned;
     hbool_t			in_slist;
     hbool_t			flush_marker;
+    hbool_t                     flush_me_last;
 #ifdef H5_HAVE_PARALLEL
+    hbool_t                     flush_me_collectively;
     hbool_t			clear_on_unprotect;
-    hbool_t		flush_immediately;
+    hbool_t			flush_immediately;
 #endif /* H5_HAVE_PARALLEL */
     hbool_t			flush_in_progress;
     hbool_t			destroy_in_progress;
-    hbool_t		free_file_space_on_destroy;
 
-    /* fields supporting the hash table: */
+    /* fields supporting rings for purposes of flush ordering */
+    H5C_ring_t                  ring;
 
-    struct H5C_cache_entry_t *	ht_next;
-    struct H5C_cache_entry_t *	ht_prev;
+    /* fields supporting the 'flush dependency' feature: */
+    struct H5C_cache_entry_t ** flush_dep_parent;
+    unsigned                    flush_dep_nparents;
+    unsigned                    flush_dep_parent_nalloc;
+    unsigned                    flush_dep_nchildren;
+    unsigned                    flush_dep_ndirty_children;
+    hbool_t			pinned_from_client;
+    hbool_t			pinned_from_cache;
 
-    /* fields supporting replacement policies: */
+    /* fields supporting the hash table: */
+    struct H5C_cache_entry_t  *	ht_next;
+    struct H5C_cache_entry_t  *	ht_prev;
 
-    struct H5C_cache_entry_t *	next;
-    struct H5C_cache_entry_t *	prev;
-    struct H5C_cache_entry_t *	aux_next;
-    struct H5C_cache_entry_t *	aux_prev;
+    /* fields supporting replacement policies: */
+    struct H5C_cache_entry_t  *	next;
+    struct H5C_cache_entry_t  *	prev;
+    struct H5C_cache_entry_t  *	aux_next;
+    struct H5C_cache_entry_t  *	aux_prev;
 
 #if H5C_COLLECT_CACHE_ENTRY_STATS
-
     /* cache entry stats fields */
-
     int32_t			accesses;
     int32_t			clears;
     int32_t			flushes;
     int32_t			pins;
-
 #endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
-
 } H5C_cache_entry_t;
 
-
 /****************************************************************************
  *
  * structure H5C_auto_size_ctl_t
@@ -814,41 +1989,6 @@ typedef struct H5C_cache_entry_t
  *
  ****************************************************************************/
 
-#define H5C_RESIZE_CFG__VALIDATE_GENERAL        0x1
-#define H5C_RESIZE_CFG__VALIDATE_INCREMENT      0x2
-#define H5C_RESIZE_CFG__VALIDATE_DECREMENT      0x4
-#define H5C_RESIZE_CFG__VALIDATE_INTERACTIONS   0x8
-#define H5C_RESIZE_CFG__VALIDATE_ALL      \
-(                                         \
-    H5C_RESIZE_CFG__VALIDATE_GENERAL |    \
-    H5C_RESIZE_CFG__VALIDATE_INCREMENT |  \
-    H5C_RESIZE_CFG__VALIDATE_DECREMENT |  \
-    H5C_RESIZE_CFG__VALIDATE_INTERACTIONS \
-)
-
-#define H5C__CURR_AUTO_SIZE_CTL_VER		1
-#define H5C__CURR_AUTO_RESIZE_RPT_FCN_VER	1
-
-#define H5C__MAX_EPOCH_MARKERS  		10
-
-#define H5C__DEF_AR_UPPER_THRESHHOLD		0.9999f
-#define H5C__DEF_AR_LOWER_THRESHHOLD		0.9f
-#define H5C__DEF_AR_MAX_SIZE			((size_t)(16 * 1024 * 1024))
-#define H5C__DEF_AR_INIT_SIZE			((size_t)( 1 * 1024 * 1024))
-#define H5C__DEF_AR_MIN_SIZE			((size_t)( 1 * 1024 * 1024))
-#define H5C__DEF_AR_MIN_CLEAN_FRAC		0.5f
-#define H5C__DEF_AR_INCREMENT			2.0f
-#define H5C__DEF_AR_MAX_INCREMENT		((size_t)( 2 * 1024 * 1024))
-#define H5C__DEF_AR_FLASH_MULTIPLE              1.0f
-#define H5C__DEV_AR_FLASH_THRESHOLD             0.25f
-#define H5C__DEF_AR_DECREMENT			0.9f
-#define H5C__DEF_AR_MAX_DECREMENT		((size_t)( 1 * 1024 * 1024))
-#define H5C__DEF_AR_EPCHS_B4_EVICT		3
-#define H5C__DEF_AR_EMPTY_RESERVE		0.05f
-#define H5C__MIN_AR_EPOCH_LENGTH		100
-#define H5C__DEF_AR_EPOCH_LENGTH		50000
-#define H5C__MAX_AR_EPOCH_LENGTH		1000000
-
 enum H5C_resize_status
 {
     in_spec,
@@ -862,280 +2002,132 @@ enum H5C_resize_status
     not_full
 }; /* enum H5C_resize_conditions */
 
-typedef void (*H5C_auto_resize_rpt_fcn)(H5C_t * cache_ptr,
-                                        int32_t version,
-                                        double hit_rate,
-                                        enum H5C_resize_status status,
-                                        size_t old_max_cache_size,
-                                        size_t new_max_cache_size,
-                                        size_t old_min_clean_size,
-                                        size_t new_min_clean_size);
+typedef void (*H5C_auto_resize_rpt_fcn)(H5C_t * cache_ptr, int32_t version,
+    double hit_rate, enum H5C_resize_status status, size_t old_max_cache_size,
+    size_t new_max_cache_size, size_t old_min_clean_size, size_t new_min_clean_size);
 
-typedef struct H5C_auto_size_ctl_t
-{
+typedef struct H5C_auto_size_ctl_t {
     /* general configuration fields: */
     int32_t				version;
     H5C_auto_resize_rpt_fcn		rpt_fcn;
-
     hbool_t				set_initial_size;
     size_t				initial_size;
-
     double				min_clean_fraction;
-
     size_t				max_size;
     size_t				min_size;
-
     int64_t				epoch_length;
 
-
     /* size increase control fields: */
     enum H5C_cache_incr_mode		incr_mode;
-
     double				lower_hr_threshold;
-
     double				increment;
-
     hbool_t				apply_max_increment;
     size_t				max_increment;
-
     enum H5C_cache_flash_incr_mode      flash_incr_mode;
     double                              flash_multiple;
     double                              flash_threshold;
 
-
     /* size decrease control fields: */
     enum H5C_cache_decr_mode		decr_mode;
-
     double				upper_hr_threshold;
-
     double				decrement;
-
     hbool_t				apply_max_decrement;
     size_t				max_decrement;
-
     int32_t				epochs_before_eviction;
-
     hbool_t				apply_empty_reserve;
     double				empty_reserve;
-
 } H5C_auto_size_ctl_t;
 
-
-/*
- * Library prototypes.
- */
-
-/* #defines of flags used in the flags parameters in some of the
- * following function calls.  Note that not all flags are applicable
- * to all function calls.  Flags that don't apply to a particular
- * function are ignored in that function.
- *
- * These flags apply to all function calls:
- *
- * 	H5C__NO_FLAGS_SET (generic "no flags set" for all fcn calls)
- *
- *
- * These flags apply to H5C_insert_entry():
- *
- * 	H5C__SET_FLUSH_MARKER_FLAG
- * 	H5C__PIN_ENTRY_FLAG
- *
- * These flags apply to H5C_protect()
- *
- * 	H5C__READ_ONLY_FLAG
- *
- * These flags apply to H5C_unprotect():
- *
- * 	H5C__SET_FLUSH_MARKER_FLAG
- * 	H5C__DELETED_FLAG
- * 	H5C__DIRTIED_FLAG
- * 	H5C__PIN_ENTRY_FLAG
- * 	H5C__UNPIN_ENTRY_FLAG
- * 	H5C__FREE_FILE_SPACE_FLAG
- *      H5C__TAKE_OWNERSHIP_FLAG
- *
- * These flags apply to H5C_expunge_entry():
- *
- * 	H5C__FREE_FILE_SPACE_FLAG
- *
- * These flags apply to H5C_flush_cache():
- *
- * 	H5C__FLUSH_INVALIDATE_FLAG
- * 	H5C__FLUSH_CLEAR_ONLY_FLAG
- * 	H5C__FLUSH_MARKED_ENTRIES_FLAG
- *	H5C__FLUSH_IGNORE_PROTECTED_FLAG (can't use this flag in combination
- *					  with H5C__FLUSH_INVALIDATE_FLAG)
- *
- * These flags apply to H5C_flush_single_entry():
- *
- * 	H5C__FLUSH_INVALIDATE_FLAG
- * 	H5C__FLUSH_CLEAR_ONLY_FLAG
- * 	H5C__FLUSH_MARKED_ENTRIES_FLAG
- *      H5C__TAKE_OWNERSHIP_FLAG
- */
-
-#define H5C__NO_FLAGS_SET			0x0000
-#define H5C__SET_FLUSH_MARKER_FLAG		0x0001
-#define H5C__DELETED_FLAG			0x0002
-#define H5C__DIRTIED_FLAG			0x0004
-#define H5C__PIN_ENTRY_FLAG			0x0008
-#define H5C__UNPIN_ENTRY_FLAG			0x0010
-#define H5C__FLUSH_INVALIDATE_FLAG		0x0020
-#define H5C__FLUSH_CLEAR_ONLY_FLAG		0x0040
-#define H5C__FLUSH_MARKED_ENTRIES_FLAG		0x0080
-#define H5C__FLUSH_IGNORE_PROTECTED_FLAG	0x0100
-#define H5C__READ_ONLY_FLAG			0x0200
-#define H5C__FREE_FILE_SPACE_FLAG		0x0800
-#define H5C__TAKE_OWNERSHIP_FLAG		0x1000
-
-#ifdef H5_HAVE_PARALLEL
-H5_DLL herr_t H5C_apply_candidate_list(H5F_t * f,
-                                       hid_t primary_dxpl_id,
-                                       hid_t secondary_dxpl_id,
-                                       H5C_t * cache_ptr,
-                                       int num_candidates,
-                                       haddr_t * candidates_list_ptr,
-                                       int mpi_rank,
-                                       int mpi_size);
-
-H5_DLL herr_t H5C_construct_candidate_list__clean_cache(H5C_t * cache_ptr);
-
-H5_DLL herr_t H5C_construct_candidate_list__min_clean(H5C_t * cache_ptr);
-#endif /* H5_HAVE_PARALLEL */
-
-H5_DLL H5C_t * H5C_create(size_t                     max_cache_size,
-                          size_t                     min_clean_size,
-                          int                        max_type_id,
-			  const char *               (* type_name_table_ptr),
-                          H5C_write_permitted_func_t check_write_permitted,
-                          hbool_t                    write_permitted,
-                          H5C_log_flush_func_t       log_flush,
-                          void *                     aux_ptr);
-
-H5_DLL void H5C_def_auto_resize_rpt_fcn(H5C_t * cache_ptr,
-                                        int32_t version,
-                                        double hit_rate,
-                                        enum H5C_resize_status status,
-                                        size_t old_max_cache_size,
-                                        size_t new_max_cache_size,
-                                        size_t old_min_clean_size,
-                                        size_t new_min_clean_size);
-
-H5_DLL herr_t H5C_dest(H5F_t * f,
-                       hid_t   primary_dxpl_id,
-                       hid_t   secondary_dxpl_id);
-
-H5_DLL herr_t H5C_expunge_entry(H5F_t *             f,
-		                hid_t               primary_dxpl_id,
-                                hid_t               secondary_dxpl_id,
-                                const H5C_class_t * type,
-                                haddr_t             addr,
-                                unsigned            flags);
-
-H5_DLL herr_t H5C_flush_cache(H5F_t *  f,
-                              hid_t    primary_dxpl_id,
-                              hid_t    secondary_dxpl_id,
-                              unsigned flags);
-
-H5_DLL herr_t H5C_flush_to_min_clean(H5F_t * f,
-                                     hid_t   primary_dxpl_id,
-                                     hid_t   secondary_dxpl_id);
-
-H5_DLL herr_t H5C_get_cache_auto_resize_config(const H5C_t * cache_ptr,
-                                               H5C_auto_size_ctl_t *config_ptr);
-
-H5_DLL herr_t H5C_get_cache_size(H5C_t * cache_ptr,
-                                 size_t * max_size_ptr,
-                                 size_t * min_clean_size_ptr,
-                                 size_t * cur_size_ptr,
-                                 int32_t * cur_num_entries_ptr);
-
-H5_DLL herr_t H5C_get_cache_hit_rate(H5C_t * cache_ptr,
-                                     double * hit_rate_ptr);
-
-H5_DLL herr_t H5C_get_entry_status(const H5F_t *f,
-                                   haddr_t   addr,
-                                   size_t *  size_ptr,
-                                   hbool_t * in_cache_ptr,
-                                   hbool_t * is_dirty_ptr,
-                                   hbool_t * is_protected_ptr,
-				   hbool_t * is_pinned_ptr);
-
-H5_DLL herr_t H5C_get_evictions_enabled(const H5C_t * cache_ptr,
-                                        hbool_t * evictions_enabled_ptr);
-
-H5_DLL herr_t H5C_get_trace_file_ptr(const H5C_t *cache_ptr,
-    FILE **trace_file_ptr_ptr);
-H5_DLL herr_t H5C_get_trace_file_ptr_from_entry(const H5C_cache_entry_t *entry_ptr,
-    FILE **trace_file_ptr_ptr);
-
-H5_DLL herr_t H5C_insert_entry(H5F_t *             f,
-                               hid_t               primary_dxpl_id,
-                               hid_t               secondary_dxpl_id,
-                               const H5C_class_t * type,
-                               haddr_t             addr,
-                               void *              thing,
-                               unsigned int        flags);
-
-H5_DLL herr_t H5C_mark_entries_as_clean(H5F_t *  f,
-                                        hid_t    primary_dxpl_id,
-                                        hid_t    secondary_dxpl_id,
-                                        int32_t  ce_array_len,
-                                        haddr_t *ce_array_ptr);
-
+/***************************************/
+/* Library-private Function Prototypes */
+/***************************************/
+
+H5_DLL H5C_t *H5C_create(size_t max_cache_size, size_t min_clean_size,
+    int max_type_id, const char *(*type_name_table_ptr),
+    H5C_write_permitted_func_t check_write_permitted, hbool_t write_permitted,
+    H5C_log_flush_func_t log_flush, void *aux_ptr);
+H5_DLL herr_t H5C_set_up_logging(H5C_t *cache_ptr, const char log_location[], hbool_t start_immediately);
+H5_DLL herr_t H5C_tear_down_logging(H5C_t *cache_ptr);
+H5_DLL herr_t H5C_start_logging(H5C_t *cache_ptr);
+H5_DLL herr_t H5C_stop_logging(H5C_t *cache_ptr);
+H5_DLL herr_t H5C_get_logging_status(const H5C_t *cache_ptr, /*OUT*/ hbool_t *is_enabled,
+    /*OUT*/ hbool_t *is_currently_logging);
+H5_DLL herr_t H5C_write_log_message(const H5C_t *cache_ptr, const char message[]);
+
+H5_DLL void H5C_def_auto_resize_rpt_fcn(H5C_t *cache_ptr, int32_t version,
+    double hit_rate, enum H5C_resize_status status,
+    size_t old_max_cache_size, size_t new_max_cache_size,
+    size_t old_min_clean_size, size_t new_min_clean_size);
+H5_DLL herr_t H5C_dest(H5F_t *f, hid_t dxpl_id);
+H5_DLL herr_t H5C_evict(H5F_t *f, hid_t dxpl_id);
+H5_DLL herr_t H5C_expunge_entry(H5F_t *f, hid_t dxpl_id, const H5C_class_t *type, haddr_t addr, unsigned flags);
+
+
+H5_DLL herr_t H5C_flush_cache(H5F_t *f, hid_t dxpl_id, unsigned flags);
+H5_DLL herr_t H5C_flush_tagged_entries(H5F_t * f, hid_t dxpl_id, haddr_t tag); 
+H5_DLL herr_t H5C_evict_tagged_entries(H5F_t * f, hid_t dxpl_id, haddr_t tag);
+H5_DLL herr_t H5C_flush_to_min_clean(H5F_t *f, hid_t dxpl_id);
+H5_DLL herr_t H5C_get_cache_auto_resize_config(const H5C_t *cache_ptr,
+    H5C_auto_size_ctl_t *config_ptr);
+H5_DLL herr_t H5C_get_cache_size(H5C_t *cache_ptr, size_t *max_size_ptr,
+    size_t *min_clean_size_ptr, size_t *cur_size_ptr,
+    int32_t *cur_num_entries_ptr);
+H5_DLL herr_t H5C_get_cache_hit_rate(H5C_t *cache_ptr, double *hit_rate_ptr);
+H5_DLL herr_t H5C_get_entry_status(const H5F_t *f, haddr_t addr,
+    size_t *size_ptr, hbool_t *in_cache_ptr, hbool_t *is_dirty_ptr,
+    hbool_t *is_protected_ptr, hbool_t *is_pinned_ptr, hbool_t *is_corked_ptr,
+    hbool_t *is_flush_dep_parent_ptr, hbool_t *is_flush_dep_child_ptr);
+H5_DLL herr_t H5C_get_evictions_enabled(const H5C_t *cache_ptr, hbool_t *evictions_enabled_ptr);
+H5_DLL void * H5C_get_aux_ptr(const H5C_t *cache_ptr);
+H5_DLL FILE *H5C_get_trace_file_ptr(const H5C_t *cache_ptr);
+H5_DLL FILE *H5C_get_trace_file_ptr_from_entry(const H5C_cache_entry_t *entry_ptr);
+H5_DLL herr_t H5C_insert_entry(H5F_t *f, hid_t dxpl_id, const H5C_class_t *type,
+    haddr_t addr, void *thing, unsigned int flags);
 H5_DLL herr_t H5C_mark_entry_dirty(void *thing);
-
-H5_DLL herr_t H5C_move_entry(H5C_t *             cache_ptr,
-                               const H5C_class_t * type,
-                               haddr_t             old_addr,
-                               haddr_t             new_addr);
-
+H5_DLL herr_t H5C_move_entry(H5C_t *cache_ptr, const H5C_class_t *type,
+    haddr_t old_addr, haddr_t new_addr);
 H5_DLL herr_t H5C_pin_protected_entry(void *thing);
-
-H5_DLL void * H5C_protect(H5F_t *             f,
-                          hid_t               primary_dxpl_id,
-                          hid_t               secondary_dxpl_id,
-			  const H5C_class_t * type,
-                          haddr_t             addr,
-                          void *              udata,
-                          unsigned            flags);
-
-H5_DLL herr_t H5C_reset_cache_hit_rate_stats(H5C_t * cache_ptr);
-
+H5_DLL herr_t H5C_create_flush_dependency(void *parent_thing, void *child_thing);
+H5_DLL void * H5C_protect(H5F_t *f, hid_t dxpl_id, const H5C_class_t *type,
+    haddr_t addr, void *udata, unsigned flags);
+H5_DLL herr_t H5C_reset_cache_hit_rate_stats(H5C_t *cache_ptr);
 H5_DLL herr_t H5C_resize_entry(void *thing, size_t new_size);
-
-H5_DLL herr_t H5C_set_cache_auto_resize_config(H5C_t *cache_ptr,
-                                               H5C_auto_size_ctl_t *config_ptr);
-
-H5_DLL herr_t H5C_set_evictions_enabled(H5C_t *cache_ptr,
-                                        hbool_t evictions_enabled);
-
-H5_DLL herr_t H5C_set_prefix(H5C_t * cache_ptr, char * prefix);
-
-H5_DLL herr_t H5C_set_trace_file_ptr(H5C_t * cache_ptr,
-		                     FILE * trace_file_ptr);
-
-H5_DLL herr_t H5C_stats(H5C_t * cache_ptr,
-                        const char * cache_name,
-                        hbool_t display_detailed_stats);
-
-H5_DLL void H5C_stats__reset(H5C_t * cache_ptr);
-
-H5_DLL herr_t H5C_dump_cache(H5C_t * cache_ptr,
-                             const char *  cache_name);
-
+H5_DLL herr_t H5C_set_cache_auto_resize_config(H5C_t *cache_ptr, H5C_auto_size_ctl_t *config_ptr);
+H5_DLL herr_t H5C_set_evictions_enabled(H5C_t *cache_ptr, hbool_t evictions_enabled);
+H5_DLL herr_t H5C_set_prefix(H5C_t *cache_ptr, char *prefix);
+H5_DLL herr_t H5C_set_trace_file_ptr(H5C_t *cache_ptr, FILE *trace_file_ptr);
+H5_DLL herr_t H5C_stats(H5C_t *cache_ptr, const char *cache_name,
+    hbool_t display_detailed_stats);
+H5_DLL void H5C_stats__reset(H5C_t *cache_ptr);
+H5_DLL herr_t H5C_dump_cache(H5C_t *cache_ptr, const char *cache_name);
 H5_DLL herr_t H5C_unpin_entry(void *thing);
+H5_DLL herr_t H5C_destroy_flush_dependency(void *parent_thing, void *child_thing);
+H5_DLL herr_t H5C_unprotect(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *thing,
+    unsigned int flags);
+H5_DLL herr_t H5C_validate_resize_config(H5C_auto_size_ctl_t *config_ptr,
+    unsigned int tests);
+H5_DLL herr_t H5C_ignore_tags(H5C_t *cache_ptr);
+H5_DLL void H5C_retag_entries(H5C_t * cache_ptr, haddr_t src_tag, haddr_t dest_tag);
+H5_DLL herr_t H5C_cork(H5C_t *cache_ptr, haddr_t obj_addr, unsigned action, hbool_t *corked);
+H5_DLL herr_t H5C_get_entry_ring(const H5F_t *f, haddr_t addr, H5C_ring_t *ring);
 
-H5_DLL herr_t H5C_unprotect(H5F_t *             f,
-                            hid_t               primary_dxpl_id,
-                            hid_t               secondary_dxpl_id,
-                            const H5C_class_t * type,
-                            haddr_t             addr,
-                            void *              thing,
-                            unsigned int        flags);
+#ifdef H5_HAVE_PARALLEL
+H5_DLL herr_t H5C_apply_candidate_list(H5F_t *f, hid_t dxpl_id,
+    H5C_t *cache_ptr, int num_candidates, haddr_t *candidates_list_ptr,
+    int mpi_rank, int mpi_size);
+H5_DLL herr_t H5C_construct_candidate_list__clean_cache(H5C_t *cache_ptr);
+H5_DLL herr_t H5C_construct_candidate_list__min_clean(H5C_t *cache_ptr);
+H5_DLL herr_t H5C_mark_entries_as_clean(H5F_t *f, hid_t dxpl_id, int32_t ce_array_len,
+    haddr_t *ce_array_ptr);
+#endif /* H5_HAVE_PARALLEL */
 
-H5_DLL herr_t H5C_validate_resize_config(H5C_auto_size_ctl_t * config_ptr,
-                                         unsigned int tests);
+#ifndef NDEBUG	/* debugging functions */
+H5_DLL herr_t H5C_get_entry_ptr_from_addr(const H5F_t *f, haddr_t addr,
+    void **entry_ptr_ptr);
+H5_DLL herr_t H5C_verify_entry_type(const H5F_t *f, haddr_t addr,
+    const H5C_class_t *expected_type, hbool_t *in_cache_ptr,
+    hbool_t *type_ok_ptr);
+#endif /* NDEBUG */
 
 #endif /* !_H5Cprivate_H */
 
diff --git a/src/H5D.c b/src/H5D.c
index cd3d989..b1643d1 100644
--- a/src/H5D.c
+++ b/src/H5D.c
@@ -17,10 +17,7 @@
 /* Module Setup */
 /****************/
 
-#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5D__init_pub_interface
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
 
 
 /***********/
@@ -52,6 +49,9 @@
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 /* Declare extern the free list to manage blocks of VL data */
 H5FL_BLK_EXTERN(vlen_vl_buf);
 
@@ -73,51 +73,6 @@ H5FL_BLK_EXTERN(type_conv);
 
 
 

-/*--------------------------------------------------------------------------
-NAME
-   H5D__init_pub_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5D__init_pub_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5D_init() currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5D__init_pub_interface(void)
-{
-    FUNC_ENTER_STATIC_NOERR
-
-    FUNC_LEAVE_NOAPI(H5D_init())
-} /* H5D__init_pub_interface() */
-
-

-/*--------------------------------------------------------------------------
-NAME
-   H5D__term_pub_interface -- Terminate interface
-USAGE
-    herr_t H5D__term_pub_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Terminates interface.  (Just resets H5_interface_initialize_g
-    currently).
-
---------------------------------------------------------------------------*/
-herr_t
-H5D__term_pub_interface(void)
-{
-    FUNC_ENTER_PACKAGE_NOERR
-
-    /* Mark closed */
-    H5_interface_initialize_g = 0;
-
-    FUNC_LEAVE_NOAPI(0)
-} /* H5D__term_pub_interface() */
-
-

 /*-------------------------------------------------------------------------
  * Function:	H5Dcreate2
  *
@@ -323,14 +278,9 @@ hid_t
 H5Dopen2(hid_t loc_id, const char *name, hid_t dapl_id)
 {
     H5D_t       *dset = NULL;
-    H5G_loc_t	 loc;		        /* Object location of group */
-    H5G_loc_t	 dset_loc;		/* Object location of dataset */
-    H5G_name_t   path;            	/* Dataset group hier. path */
-    H5O_loc_t    oloc;            	/* Dataset object location */
-    H5O_type_t   obj_type;              /* Type of object at location */
-    hbool_t      loc_found = FALSE;     /* Location at 'name' found */
-    hid_t        dxpl_id = H5AC_ind_dxpl_id;    /* dxpl to use to open datset */
-    hid_t        ret_value;
+    H5G_loc_t   loc;                    /* Object location of group */
+    hid_t       dxpl_id = H5AC_ind_dxpl_id; /* dxpl to use to open datset */
+    hid_t       ret_value;
 
     FUNC_ENTER_API(FAIL)
     H5TRACE3("i", "i*si", loc_id, name, dapl_id);
@@ -348,41 +298,18 @@ H5Dopen2(hid_t loc_id, const char *name, hid_t dapl_id)
         if(TRUE != H5P_isa_class(dapl_id, H5P_DATASET_ACCESS))
             HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not dataset access property list")
 
-    /* Set up dataset location to fill in */
-    dset_loc.oloc = &oloc;
-    dset_loc.path = &path;
-    H5G_loc_reset(&dset_loc);
-
-    /* Find the dataset object */
-    if(H5G_loc_find(&loc, name, &dset_loc, dapl_id, dxpl_id) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_NOTFOUND, FAIL, "not found")
-    loc_found = TRUE;
-
-    /* Check that the object found is the correct type */
-    if(H5O_obj_type(&oloc, &obj_type, dxpl_id) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get object type")
-    if(obj_type != H5O_TYPE_DATASET)
-        HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a dataset")
-
     /* Open the dataset */
-    if(NULL == (dset = H5D_open(&dset_loc, dapl_id, dxpl_id)))
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't open dataset")
+    if(NULL == (dset = H5D__open_name(&loc, name, dapl_id, dxpl_id)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "unable to open dataset")
 
     /* Register an atom for the dataset */
     if((ret_value = H5I_register(H5I_DATASET, dset, TRUE)) < 0)
         HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "can't register dataset atom")
 
 done:
-    if(ret_value < 0) {
-        if(dset) {
-            if(H5D_close(dset) < 0)
-                HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataset")
-        } /* end if */
-        else {
-            if(loc_found && H5G_loc_free(&dset_loc) < 0)
-                HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "can't free location")
-        } /* end else */
-    } /* end if */
+    if(ret_value < 0)
+        if(dset && H5D_close(dset) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataset")
 
     FUNC_LEAVE_API(ret_value)
 } /* end H5Dopen2() */
@@ -417,10 +344,6 @@ H5Dclose(hid_t dset_id)
     /*
      * Decrement the counter on the dataset.  It will be freed if the count
      * reaches zero.  
-     *
-     * Pass in TRUE for the 3rd parameter to tell the function to remove
-     * dataset's ID even though the freeing function might fail.  Please
-     * see the comments in H5I_dec_ref for details. (SLU - 2010/9/7)
      */
     if(H5I_dec_app_ref_always_close(dset_id) < 0)
 	HGOTO_ERROR(H5E_DATASET, H5E_CANTDEC, FAIL, "can't decrement count on dataset ID")
@@ -990,15 +913,163 @@ H5Dset_extent(hid_t dset_id, const hsize_t size[])
 
     /* Check args */
     if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
     if(!size)
-	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no size specified")
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no size specified")
 
     /* Private function */
     if(H5D__set_extent(dset, size, H5AC_dxpl_id) < 0)
-	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to set extend dataset")
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to set extend dataset")
 
 done:
-    FUNC_LEAVE_API(ret_value)
+        FUNC_LEAVE_API(ret_value)
 } /* end H5Dset_extent() */
+ 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Dflush
+ *
+ * Purpose:     Flushes all buffers associated with a dataset.
+ *
+ * Return:      Non-negative on success, negative on failure
+ *
+ * Programmer:  Mike McGreevy
+ *              May 19, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Dflush(hid_t dset_id)
+{
+    H5D_t *dset; /* Dataset for this operation */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", dset_id);
+    
+    /* Check args */
+    if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+
+    /* Flush any dataset information still cached in memory */
+    if(H5D__flush_real(dset, H5AC_dxpl_id) < 0)
+	HDONE_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to flush cached dataset info")
+
+    /* Flush object's metadata to file */
+    if(H5O_flush_common(&dset->oloc, dset_id, H5AC_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTFLUSH, FAIL, "unable to flush dataset and object flush callback")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Dflush */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Drefresh
+ *
+ * Purpose:     Refreshes all buffers associated with a dataset.
+ *
+ * Return:      Non-negative on success, negative on failure
+ *
+ * Programmer:  Mike McGreevy
+ *              July 21, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Drefresh(hid_t dset_id)
+{
+    H5D_t       *dset;                  /* Dataset to refresh */
+    herr_t      ret_value = SUCCEED;    /* return value */
+    
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", dset_id);
+
+    /* Check args */
+    if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
 
+    /* Call private function to refresh the dataset object */
+    if((H5D__refresh(dset_id, dset, H5AC_dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTLOAD, FAIL, "unable to refresh dataset")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Drefresh() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Dformat_convert (Internal)
+ *
+ * Purpose:     Convert a dataset's chunk indexing type to version 1 B-tree
+ *
+ * Return:      Non-negative on success, negative on failure
+ *
+ * Programmer:  Vailin Choi; Feb 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Dformat_convert(hid_t dset_id)
+{
+    H5D_t *dset;                /* Dataset to refresh */
+    herr_t ret_value = SUCCEED; /* return value */
+    
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", dset_id);
+
+    /* Check args */
+    if(NULL == (dset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+
+    /* Nothing to do if not a chunked dataset  */
+    if(dset->shared->layout.type != H5D_CHUNKED)
+	HGOTO_DONE(SUCCEED)
+
+    /* Nothing to do if the chunk indexing type is already version 1 B-tree */
+    if(dset->shared->layout.u.chunk.idx_type == H5D_CHUNK_IDX_BTREE)
+	HGOTO_DONE(SUCCEED)
+
+    /* Call private function to do the conversion */
+    if((H5D__format_convert(dset, H5AC_dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTLOAD, FAIL, "unable to convert chunk indexing type for dataset")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Dformat_convert */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Dget_chunk_index_type (Internal)
+ *
+ * Purpose:     Retrieve a dataset's chunk indexing type
+ *
+ * Return:      Non-negative on success, negative on failure
+ *
+ * Programmer:  Vailin Choi; Feb 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Dget_chunk_index_type(hid_t did, H5D_chunk_index_t *idx_type)
+{
+    H5D_t *dset;                /* Dataset to refresh */
+    herr_t ret_value = SUCCEED; /* return value */
+    
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*Dk", did, idx_type);
+
+    /* Check args */
+    if(NULL == (dset = (H5D_t *)H5I_object_verify(did, H5I_DATASET)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+
+    /* Should be a chunked dataset */
+    if(dset->shared->layout.type != H5D_CHUNKED)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not chunked")
+
+    if(idx_type) /* Get the chunk indexing type */
+        *idx_type = dset->shared->layout.u.chunk.idx_type;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Dget_chunk_index_type() */
diff --git a/src/H5Dbtree.c b/src/H5Dbtree.c
index a4cdc2f..8ef14b9 100644
--- a/src/H5Dbtree.c
+++ b/src/H5Dbtree.c
@@ -26,7 +26,7 @@
 /* Module Setup */
 /****************/
 
-#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
 
 
 /***********/
@@ -49,11 +49,6 @@
 /* Local Macros */
 /****************/
 
-/*
- * Given a B-tree node return the dimensionality of the chunks pointed to by
- * that node.
- */
-#define H5D_BTREE_NDIMS(X)	(((X)->sizeof_rkey-8)/8)
 
 /******************/
 /* Local Typedefs */
@@ -74,8 +69,8 @@
  * The chunk's file address is part of the B-tree and not part of the key.
  */
 typedef struct H5D_btree_key_t {
+    hsize_t	scaled[H5O_LAYOUT_NDIMS];	/*logical offset to start*/
     uint32_t	nbytes;				/*size of stored data	*/
-    hsize_t	offset[H5O_LAYOUT_NDIMS];	/*logical offset to start*/
     unsigned	filter_mask;			/*excluded filters	*/
 } H5D_btree_key_t;
 
@@ -97,15 +92,16 @@ typedef struct H5D_btree_dbg_t {
 /* Local Prototypes */
 /********************/
 
+static herr_t H5D__btree_shared_free(void *_shared);
 static herr_t H5D__btree_shared_create(const H5F_t *f, H5O_storage_chunk_t *store,
-    unsigned ndims);
+    const H5O_layout_chunk_t *layout);
 
 /* B-tree iterator callbacks */
 static int H5D__btree_idx_iterate_cb(H5F_t *f, hid_t dxpl_id, const void *left_key,
     haddr_t addr, const void *right_key, void *_udata);
 
 /* B-tree callbacks */
-static H5RC_t *H5D__btree_get_shared(const H5F_t *f, const void *_udata);
+static H5UC_t *H5D__btree_get_shared(const H5F_t *f, const void *_udata);
 static herr_t H5D__btree_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t, void *_lt_key,
     void *_udata, void *_rt_key, haddr_t *addr_p /*out*/);
 static int H5D__btree_cmp2(void *_lt_key, void *_udata, void *_rt_key);
@@ -131,7 +127,7 @@ static herr_t H5D__btree_idx_init(const H5D_chk_idx_info_t *idx_info,
 static herr_t H5D__btree_idx_create(const H5D_chk_idx_info_t *idx_info);
 static hbool_t H5D__btree_idx_is_space_alloc(const H5O_storage_chunk_t *storage);
 static herr_t H5D__btree_idx_insert(const H5D_chk_idx_info_t *idx_info,
-    H5D_chunk_ud_t *udata);
+    H5D_chunk_ud_t *udata, const H5D_t *dset);
 static herr_t H5D__btree_idx_get_addr(const H5D_chk_idx_info_t *idx_info,
     H5D_chunk_ud_t *udata);
 static int H5D__btree_idx_iterate(const H5D_chk_idx_info_t *idx_info,
@@ -157,21 +153,22 @@ static herr_t H5D__btree_idx_dest(const H5D_chk_idx_info_t *idx_info);
 
 /* v1 B-tree indexed chunk I/O ops */
 const H5D_chunk_ops_t H5D_COPS_BTREE[1] = {{
-    H5D__btree_idx_init,
-    H5D__btree_idx_create,
-    H5D__btree_idx_is_space_alloc,
-    H5D__btree_idx_insert,
-    H5D__btree_idx_get_addr,
-    NULL,
-    H5D__btree_idx_iterate,
-    H5D__btree_idx_remove,
-    H5D__btree_idx_delete,
-    H5D__btree_idx_copy_setup,
-    H5D__btree_idx_copy_shutdown,
-    H5D__btree_idx_size,
-    H5D__btree_idx_reset,
-    H5D__btree_idx_dump,
-    H5D__btree_idx_dest
+    FALSE,                              /* v1 B-tree indices does not support SWMR access */
+    H5D__btree_idx_init,                /* insert */
+    H5D__btree_idx_create,              /* create */
+    H5D__btree_idx_is_space_alloc,      /* is_space_alloc */
+    H5D__btree_idx_insert,              /* insert */
+    H5D__btree_idx_get_addr,            /* get_addr */
+    NULL,                               /* resize */
+    H5D__btree_idx_iterate,             /* iterate */
+    H5D__btree_idx_remove,              /* remove */
+    H5D__btree_idx_delete,              /* delete */
+    H5D__btree_idx_copy_setup,          /* copy_setup */
+    H5D__btree_idx_copy_shutdown,       /* copy_shutdown */
+    H5D__btree_idx_size,                /* size */
+    H5D__btree_idx_reset,               /* reset */
+    H5D__btree_idx_dump,                /* dump */
+    H5D__btree_idx_dest                 /* destroy */
 }};
 
 
@@ -203,6 +200,10 @@ H5B_class_t H5B_BTREE[1] = {{
 /* Local Variables */
 /*******************/
 
+/* Declare a free list to manage H5O_layout_chunk_t objects */
+H5FL_DEFINE_STATIC(H5O_layout_chunk_t);
+
+
 

 /*-------------------------------------------------------------------------
  * Function:	H5D__btree_get_shared
@@ -218,8 +219,7 @@ H5B_class_t H5B_BTREE[1] = {{
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
-static H5RC_t *
+static H5UC_t *
 H5D__btree_get_shared(const H5F_t H5_ATTR_UNUSED *f, const void *_udata)
 {
     const H5D_chunk_common_ud_t *udata = (const H5D_chunk_common_ud_t *) _udata;
@@ -228,7 +228,7 @@ H5D__btree_get_shared(const H5F_t H5_ATTR_UNUSED *f, const void *_udata)
 
     HDassert(udata);
     HDassert(udata->storage);
-    HDassert(udata->storage->idx_type == H5D_CHUNK_BTREE);
+    HDassert(udata->storage->idx_type == H5D_CHUNK_IDX_BTREE);
     HDassert(udata->storage->u.btree.shared);
 
     /* Return the pointer to the ref-count object */
@@ -255,7 +255,7 @@ H5D__btree_get_shared(const H5F_t H5_ATTR_UNUSED *f, const void *_udata)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5D__btree_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t op,
+H5D__btree_new_node(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5B_ins_t op,
 		    void *_lt_key, void *_udata, void *_rt_key,
 		    haddr_t *addr_p/*out*/)
 {
@@ -265,7 +265,7 @@ H5D__btree_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t op,
     unsigned		u;
     herr_t      ret_value = SUCCEED;       /* Return value */
 
-    FUNC_ENTER_STATIC
+    FUNC_ENTER_STATIC_NOERR
 
     /* check args */
     HDassert(f);
@@ -275,21 +275,19 @@ H5D__btree_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t op,
     HDassert(udata->common.layout->ndims > 0 && udata->common.layout->ndims < H5O_LAYOUT_NDIMS);
     HDassert(addr_p);
 
-    /* Allocate new storage */
-    HDassert(udata->nbytes > 0);
-    H5_CHECK_OVERFLOW(udata->nbytes, uint32_t, hsize_t);
-    if(HADDR_UNDEF == (*addr_p = H5MF_alloc(f, H5FD_MEM_DRAW, dxpl_id, (hsize_t)udata->nbytes)))
-        HGOTO_ERROR(H5E_IO, H5E_CANTINIT, FAIL, "couldn't allocate new file storage")
-    udata->addr = *addr_p;
+    /* Set address */
+    HDassert(H5F_addr_defined(udata->chunk_block.offset));
+    HDassert(udata->chunk_block.length > 0);
+    *addr_p = udata->chunk_block.offset;
 
     /*
      * The left key describes the storage of the UDATA chunk being
      * inserted into the tree.
      */
-    lt_key->nbytes = udata->nbytes;
+    H5_CHECKED_ASSIGN(lt_key->nbytes, uint32_t, udata->chunk_block.length, hsize_t);
     lt_key->filter_mask = udata->filter_mask;
     for(u = 0; u < udata->common.layout->ndims; u++)
-        lt_key->offset[u] = udata->common.offset[u];
+        lt_key->scaled[u] = udata->common.scaled[u];
 
     /*
      * The right key might already be present.  If not, then add a zero-width
@@ -299,13 +297,11 @@ H5D__btree_new_node(H5F_t *f, hid_t dxpl_id, H5B_ins_t op,
         rt_key->nbytes = 0;
         rt_key->filter_mask = 0;
         for(u = 0; u < udata->common.layout->ndims; u++) {
-            HDassert(udata->common.offset[u] + udata->common.layout->dim[u] >
-                udata->common.offset[u]);
-            rt_key->offset[u] = udata->common.offset[u] + udata->common.layout->dim[u];
+            HDassert(udata->common.scaled[u] + 1 > udata->common.scaled[u]);
+            rt_key->scaled[u] = udata->common.scaled[u] + 1;
         } /* end if */
     } /* end if */
 
-done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D__btree_new_node() */
 
@@ -335,7 +331,7 @@ H5D__btree_cmp2(void *_lt_key, void *_udata, void *_rt_key)
     H5D_btree_key_t	*lt_key = (H5D_btree_key_t *) _lt_key;
     H5D_btree_key_t	*rt_key = (H5D_btree_key_t *) _rt_key;
     H5D_chunk_common_ud_t	*udata = (H5D_chunk_common_ud_t *) _udata;
-    int		ret_value;
+    int ret_value = -1;         /* Return value */
 
     FUNC_ENTER_STATIC_NOERR
 
@@ -345,7 +341,7 @@ H5D__btree_cmp2(void *_lt_key, void *_udata, void *_rt_key)
     HDassert(udata->layout->ndims > 0 && udata->layout->ndims <= H5O_LAYOUT_NDIMS);
 
     /* Compare the offsets but ignore the other fields */
-    ret_value = H5VM_vector_cmp_u(udata->layout->ndims, lt_key->offset, rt_key->offset);
+    ret_value = H5VM_vector_cmp_u(udata->layout->ndims, lt_key->scaled, rt_key->scaled);
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D__btree_cmp2() */
@@ -400,18 +396,18 @@ H5D__btree_cmp3(void *_lt_key, void *_udata, void *_rt_key)
     /* indexed storage B-tree... */
     /* (Dump the B-tree with h5debug to look at it) -QAK */
     if(udata->layout->ndims == 2) {
-        if(udata->offset[0] > rt_key->offset[0])
+        if(udata->scaled[0] > rt_key->scaled[0])
             ret_value = 1;
-        else if(udata->offset[0] == rt_key->offset[0] &&
-                udata->offset[1] >= rt_key->offset[1])
+        else if(udata->scaled[0] == rt_key->scaled[0] &&
+                udata->scaled[1] >= rt_key->scaled[1])
             ret_value = 1;
-        else if(udata->offset[0] < lt_key->offset[0])
+        else if(udata->scaled[0] < lt_key->scaled[0])
             ret_value = (-1);
     } /* end if */
     else {
-        if(H5VM_vector_ge_u(udata->layout->ndims, udata->offset, rt_key->offset))
+        if(H5VM_vector_ge_u(udata->layout->ndims, udata->scaled, rt_key->scaled))
             ret_value = 1;
-        else if(H5VM_vector_lt_u(udata->layout->ndims, udata->offset, lt_key->offset))
+        else if(H5VM_vector_lt_u(udata->layout->ndims, udata->scaled, lt_key->scaled))
             ret_value = (-1);
     } /* end else */
 
@@ -443,7 +439,6 @@ H5D__btree_cmp3(void *_lt_key, void *_udata, void *_rt_key)
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static htri_t
 H5D__btree_found(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t addr, const void *_lt_key,
 		 void *_udata)
@@ -463,13 +458,13 @@ H5D__btree_found(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t
 
     /* Is this *really* the requested chunk? */
     for(u = 0; u < udata->common.layout->ndims; u++)
-        if(udata->common.offset[u] >= lt_key->offset[u] + udata->common.layout->dim[u])
+        if(udata->common.scaled[u] >= (lt_key->scaled[u] + 1))
             HGOTO_DONE(FALSE)
 
     /* Initialize return values */
     HDassert(lt_key->nbytes > 0);
-    udata->addr = addr;
-    udata->nbytes = lt_key->nbytes;
+    udata->chunk_block.offset = addr;
+    udata->chunk_block.length = lt_key->nbytes;
     udata->filter_mask = lt_key->filter_mask;
 
 done:
@@ -478,6 +473,44 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_disjoint
+ *
+ * Purpose:	Determines if two chunks are disjoint.
+ *
+ * Return:	Success:	FALSE if they are not disjoint.
+ *				TRUE if they are disjoint.
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, May 6, 2015
+ *
+ * Note:	Assumes that the chunk offsets are scaled coordinates
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+H5D__chunk_disjoint(unsigned n, const hsize_t *scaled1, const hsize_t *scaled2)
+{
+    unsigned	u;                      /* Local index variable */
+    hbool_t     ret_value = FALSE;      /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(n);
+    HDassert(scaled1);
+    HDassert(scaled2);
+
+    /* Loop over two chunks, detecting disjointness and getting out quickly */
+    for(u = 0; u < n; u++)
+        if((scaled1[u] + 1) <= scaled2[u] || (scaled2[u] + 1) <= scaled1[u])
+            HGOTO_DONE(TRUE)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_disjoint() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5D__btree_insert
  *
  * Purpose:	This function is called when the B-tree insert engine finds
@@ -505,9 +538,8 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static H5B_ins_t
-H5D__btree_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key,
+H5D__btree_insert(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t addr, void *_lt_key,
 		  hbool_t *lt_key_changed,
 		  void *_md_key, void *_udata, void *_rt_key,
 		  hbool_t H5_ATTR_UNUSED *rt_key_changed,
@@ -519,7 +551,7 @@ H5D__btree_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key,
     H5D_chunk_ud_t	*udata = (H5D_chunk_ud_t *) _udata;
     int		cmp;
     unsigned		u;
-    H5B_ins_t		ret_value;
+    H5B_ins_t		ret_value = H5B_INS_ERROR;      /* Return value */
 
     FUNC_ENTER_STATIC
 
@@ -541,68 +573,40 @@ H5D__btree_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key,
         HGOTO_ERROR(H5E_STORAGE, H5E_UNSUPPORTED, H5B_INS_ERROR, "internal error")
 
     } else if(H5VM_vector_eq_u(udata->common.layout->ndims,
-				udata->common.offset, lt_key->offset) &&
-	       lt_key->nbytes > 0) {
+            udata->common.scaled, lt_key->scaled) && lt_key->nbytes > 0) {
         /*
          * Already exists.  If the new size is not the same as the old size
          * then we should reallocate storage.
          */
-        if(lt_key->nbytes != udata->nbytes) {
-/* Currently, the old chunk data is "thrown away" after the space is reallocated,
- * so avoid data copy in H5MF_realloc() call by just free'ing the space and
- * allocating new space.
- *
- * This should keep the file smaller also, by freeing the space and then
- * allocating new space, instead of vice versa (in H5MF_realloc).
- *
- * QAK - 11/19/2002
- */
-#ifdef OLD_WAY
-            if(HADDR_UNDEF == (*new_node_p = H5MF_realloc(f, H5FD_MEM_DRAW, addr,
-                      (hsize_t)lt_key->nbytes, (hsize_t)udata->nbytes)))
-                HGOTO_ERROR(H5E_STORAGE, H5E_NOSPACE, H5B_INS_ERROR, "unable to reallocate chunk storage")
-#else /* OLD_WAY */
-            H5_CHECK_OVERFLOW(lt_key->nbytes, uint32_t, hsize_t);
-            if(H5MF_xfree(f, H5FD_MEM_DRAW, dxpl_id, addr, (hsize_t)lt_key->nbytes) < 0)
-                HGOTO_ERROR(H5E_STORAGE, H5E_CANTFREE, H5B_INS_ERROR, "unable to free chunk")
-            H5_CHECK_OVERFLOW(udata->nbytes, uint32_t, hsize_t);
-            if(HADDR_UNDEF == (*new_node_p = H5MF_alloc(f, H5FD_MEM_DRAW, dxpl_id, (hsize_t)udata->nbytes)))
-                HGOTO_ERROR(H5E_STORAGE, H5E_NOSPACE, H5B_INS_ERROR, "unable to reallocate chunk")
-#endif /* OLD_WAY */
-            lt_key->nbytes = udata->nbytes;
+        if(lt_key->nbytes != udata->chunk_block.length) {
+	    /* Set node's address (already re-allocated by main chunk routines) */
+	    HDassert(H5F_addr_defined(udata->chunk_block.offset));
+            *new_node_p = udata->chunk_block.offset;
+            H5_CHECKED_ASSIGN(lt_key->nbytes, uint32_t, udata->chunk_block.length, hsize_t);
             lt_key->filter_mask = udata->filter_mask;
             *lt_key_changed = TRUE;
-            udata->addr = *new_node_p;
             ret_value = H5B_INS_CHANGE;
         } else {
-            udata->addr = addr;
+	    /* Already have address in udata, from main chunk routines */
+	    HDassert(H5F_addr_defined(udata->chunk_block.offset));
             ret_value = H5B_INS_NOOP;
         }
 
-    } else if (H5VM_hyper_disjointp(udata->common.layout->ndims,
-				   lt_key->offset, udata->common.layout->dim,
-				   udata->common.offset, udata->common.layout->dim)) {
-        HDassert(H5VM_hyper_disjointp(udata->common.layout->ndims,
-				   rt_key->offset, udata->common.layout->dim,
-				   udata->common.offset, udata->common.layout->dim));
+    } else if (H5D__chunk_disjoint(udata->common.layout->ndims,
+				   lt_key->scaled, udata->common.scaled)) {
+        HDassert(H5D__chunk_disjoint(udata->common.layout->ndims,
+				   rt_key->scaled, udata->common.scaled));
         /*
          * Split this node, inserting the new new node to the right of the
          * current node.  The MD_KEY is where the split occurs.
          */
-        md_key->nbytes = udata->nbytes;
+        H5_CHECKED_ASSIGN(md_key->nbytes, uint32_t, udata->chunk_block.length, hsize_t);
         md_key->filter_mask = udata->filter_mask;
-        for(u = 0; u < udata->common.layout->ndims; u++) {
-            HDassert(0 == udata->common.offset[u] % udata->common.layout->dim[u]);
-            md_key->offset[u] = udata->common.offset[u];
-        } /* end for */
+        for(u = 0; u < udata->common.layout->ndims; u++)
+            md_key->scaled[u] = udata->common.scaled[u];
 
-        /*
-         * Allocate storage for the new chunk
-         */
-        H5_CHECK_OVERFLOW(udata->nbytes, uint32_t, hsize_t);
-        if(HADDR_UNDEF == (*new_node_p = H5MF_alloc(f, H5FD_MEM_DRAW, dxpl_id, (hsize_t)udata->nbytes)))
-            HGOTO_ERROR(H5E_STORAGE, H5E_NOSPACE, H5B_INS_ERROR, "file allocation failed")
-        udata->addr = *new_node_p;
+	HDassert(H5F_addr_defined(udata->chunk_block.offset));
+        *new_node_p = udata->chunk_block.offset;
         ret_value = H5B_INS_RIGHT;
 
     } else {
@@ -627,7 +631,6 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static H5B_ins_t
 H5D__btree_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key /*in,out */ ,
 	hbool_t *lt_key_changed /*out */ ,
@@ -643,7 +646,7 @@ H5D__btree_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key /*in,out
     /* Remove raw data chunk from file */
     H5_CHECK_OVERFLOW(lt_key->nbytes, uint32_t, hsize_t);
     if(H5MF_xfree(f, H5FD_MEM_DRAW, dxpl_id, addr, (hsize_t)lt_key->nbytes) < 0)
-        HGOTO_ERROR(H5E_STORAGE, H5E_CANTFREE, H5B_INS_ERROR, "unable to free chunk")
+	HGOTO_ERROR(H5E_STORAGE, H5E_CANTFREE, H5B_INS_ERROR, "unable to free chunk")
 
     /* Mark keys as unchanged */
     *lt_key_changed = FALSE;
@@ -669,9 +672,10 @@ done:
 static herr_t
 H5D__btree_decode_key(const H5B_shared_t *shared, const uint8_t *raw, void *_key)
 {
-    H5D_btree_key_t	*key = (H5D_btree_key_t *) _key;
-    size_t		ndims;
-    unsigned		u;
+    const H5O_layout_chunk_t *layout;           /* Chunk layout description */
+    H5D_btree_key_t	*key = (H5D_btree_key_t *) _key;        /* Pointer to decoded key */
+    hsize_t             tmp_offset;             /* Temporary coordinate offset, from file */
+    unsigned		u;                      /* Local index variable */
 
     FUNC_ENTER_STATIC_NOERR
 
@@ -679,14 +683,21 @@ H5D__btree_decode_key(const H5B_shared_t *shared, const uint8_t *raw, void *_key
     HDassert(shared);
     HDassert(raw);
     HDassert(key);
-    ndims = H5D_BTREE_NDIMS(shared);
-    HDassert(ndims <= H5O_LAYOUT_NDIMS);
+    layout = (const H5O_layout_chunk_t *)shared->udata;
+    HDassert(layout);
+    HDassert(layout->ndims > 0 && layout->ndims <= H5O_LAYOUT_NDIMS);
 
     /* decode */
     UINT32DECODE(raw, key->nbytes);
     UINT32DECODE(raw, key->filter_mask);
-    for(u = 0; u < ndims; u++)
-	UINT64DECODE(raw, key->offset[u]);
+    for(u = 0; u < layout->ndims; u++) {
+        /* Retrieve coordinate offset */
+	UINT64DECODE(raw, tmp_offset);
+        HDassert(0 == (tmp_offset % layout->dim[u]));
+
+        /* Convert to a scaled offset */
+        key->scaled[u] = tmp_offset / layout->dim[u];
+    } /* end for */
 
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5D__btree_decode_key() */
@@ -707,9 +718,10 @@ H5D__btree_decode_key(const H5B_shared_t *shared, const uint8_t *raw, void *_key
 static herr_t
 H5D__btree_encode_key(const H5B_shared_t *shared, uint8_t *raw, const void *_key)
 {
+    const H5O_layout_chunk_t *layout;           /* Chunk layout description */
     const H5D_btree_key_t *key = (const H5D_btree_key_t *)_key;
-    size_t		ndims;
-    unsigned		u;
+    hsize_t             tmp_offset;             /* Temporary coordinate offset, from file */
+    unsigned		u;                      /* Local index variable */
 
     FUNC_ENTER_STATIC_NOERR
 
@@ -717,14 +729,18 @@ H5D__btree_encode_key(const H5B_shared_t *shared, uint8_t *raw, const void *_key
     HDassert(shared);
     HDassert(raw);
     HDassert(key);
-    ndims = H5D_BTREE_NDIMS(shared);
-    HDassert(ndims <= H5O_LAYOUT_NDIMS);
+    layout = (const H5O_layout_chunk_t *)shared->udata;
+    HDassert(layout);
+    HDassert(layout->ndims > 0 && layout->ndims <= H5O_LAYOUT_NDIMS);
 
     /* encode */
     UINT32ENCODE(raw, key->nbytes);
     UINT32ENCODE(raw, key->filter_mask);
-    for(u = 0; u < ndims; u++)
-	UINT64ENCODE(raw, key->offset[u]);
+    for(u = 0; u < layout->ndims; u++) {
+        /* Compute coordinate offset from scaled offset */
+        tmp_offset = key->scaled[u] * layout->dim[u];
+	UINT64ENCODE(raw, tmp_offset);
+    } /* end for */
 
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5D__btree_encode_key() */
@@ -742,7 +758,6 @@ H5D__btree_encode_key(const H5B_shared_t *shared, uint8_t *raw, const void *_key
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
 H5D__btree_debug_key(FILE *stream, int indent, int fwidth, const void *_key,
     const void *_udata)
@@ -759,7 +774,7 @@ H5D__btree_debug_key(FILE *stream, int indent, int fwidth, const void *_key,
     HDfprintf(stream, "%*s%-*s 0x%08x\n", indent, "", fwidth, "Filter mask:", key->filter_mask);
     HDfprintf(stream, "%*s%-*s {", indent, "", fwidth, "Logical offset:");
     for(u = 0; u < udata->ndims; u++)
-        HDfprintf(stream, "%s%Hd", u?", ":"", key->offset[u]);
+        HDfprintf(stream, "%s%Hd", u?", ":"", (key->scaled[u] * udata->common.layout->dim[u]));
     HDfputs("}\n", stream);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
@@ -767,6 +782,38 @@ H5D__btree_debug_key(FILE *stream, int indent, int fwidth, const void *_key,
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5D__btree_shared_free
+ *
+ * Purpose:	Free "local" B-tree shared info
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, May 7, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__btree_shared_free(void *_shared)
+{
+    H5B_shared_t *shared = (H5B_shared_t *)_shared;
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Free the chunk layout information */
+    shared->udata = H5FL_FREE(H5O_layout_chunk_t, shared->udata);
+
+    /* Chain up to the generic B-tree shared info free routine */
+    if(H5B_shared_free(shared) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "can't free shared B-tree info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__btree_shared_free() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5D__btree_shared_create
  *
  * Purpose:	Create & initialize B-tree shared info
@@ -779,9 +826,11 @@ H5D__btree_debug_key(FILE *stream, int indent, int fwidth, const void *_key,
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5D__btree_shared_create(const H5F_t *f, H5O_storage_chunk_t *store, unsigned ndims)
+H5D__btree_shared_create(const H5F_t *f, H5O_storage_chunk_t *store,
+    const H5O_layout_chunk_t *layout)
 {
     H5B_shared_t *shared;               /* Shared B-tree node info */
+    H5O_layout_chunk_t *my_layout = NULL;      /* Pointer to copy of layout info */
     size_t	sizeof_rkey;	        /* Size of raw (disk) key	     */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
@@ -790,20 +839,27 @@ H5D__btree_shared_create(const H5F_t *f, H5O_storage_chunk_t *store, unsigned nd
     /* Set the raw key size */
     sizeof_rkey = 4 +			/*storage size		*/
                 4 +			/*filter mask		*/
-                ndims * 8;		/*dimension indices	*/
+                layout->ndims * 8;	/*dimension indices	*/
 
     /* Allocate & initialize global info for the shared structure */
     if(NULL == (shared = H5B_shared_new(f, H5B_BTREE, sizeof_rkey)))
-	HGOTO_ERROR(H5E_BTREE, H5E_NOSPACE, FAIL, "memory allocation failed for shared B-tree info")
+	HGOTO_ERROR(H5E_DATASET, H5E_NOSPACE, FAIL, "memory allocation failed for shared B-tree info")
 
     /* Set up the "local" information for this dataset's chunks */
-        /* <none> */
+    if(NULL == (my_layout = H5FL_MALLOC(H5O_layout_chunk_t)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate chunk layout")
+    HDmemcpy(my_layout, layout, sizeof(H5O_layout_chunk_t));
+    shared->udata = my_layout;
 
     /* Make shared B-tree info reference counted */
-    if(NULL == (store->u.btree.shared = H5RC_create(shared, H5B_shared_free)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't create ref-count wrapper for shared B-tree info")
+    if(NULL == (store->u.btree.shared = H5UC_create(shared, H5D__btree_shared_free)))
+	HGOTO_ERROR(H5E_DATASET, H5E_NOSPACE, FAIL, "can't create ref-count wrapper for shared B-tree info")
 
 done:
+    if(ret_value < 0)
+        if(my_layout)
+            my_layout = H5FL_FREE(H5O_layout_chunk_t, my_layout);
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D__btree_shared_create() */
 
@@ -839,7 +895,7 @@ H5D__btree_idx_init(const H5D_chk_idx_info_t *idx_info, const H5S_t H5_ATTR_UNUS
     idx_info->storage->u.btree.dset_ohdr_addr = dset_ohdr_addr;
 
     /* Allocate the shared structure */
-    if(H5D__btree_shared_create(idx_info->f, idx_info->storage, idx_info->layout->ndims) < 0)
+    if(H5D__btree_shared_create(idx_info->f, idx_info->storage, idx_info->layout) < 0)
 	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't create wrapper for shared B-tree info")
 
 done:
@@ -909,25 +965,19 @@ done:
 static hbool_t
 H5D__btree_idx_is_space_alloc(const H5O_storage_chunk_t *storage)
 {
-    hbool_t ret_value;          /* Return value */
-
     FUNC_ENTER_STATIC_NOERR
 
     /* Check args */
     HDassert(storage);
 
-    /* Set return value */
-    ret_value = (hbool_t)H5F_addr_defined(storage->idx_addr);
-
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI((hbool_t)H5F_addr_defined(storage->idx_addr))
 } /* end H5D__btree_idx_is_space_alloc() */
 
 

 /*-------------------------------------------------------------------------
  * Function:	H5D__btree_idx_insert
  *
- * Purpose:	Create the chunk it if it doesn't exist, or reallocate the
- *              chunk if its size changed.
+ * Purpose:	Insert chunk entry into the indexing structure.
  *
  * Return:	Non-negative on success/Negative on failure
  *
@@ -937,7 +987,8 @@ H5D__btree_idx_is_space_alloc(const H5O_storage_chunk_t *storage)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5D__btree_idx_insert(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *udata)
+H5D__btree_idx_insert(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *udata,
+    const H5D_t H5_ATTR_UNUSED *dset)
 {
     herr_t	ret_value = SUCCEED;    /* Return value */
 
@@ -1017,7 +1068,6 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static int
 H5D__btree_idx_iterate_cb(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
     const void *_lt_key, haddr_t addr, const void H5_ATTR_UNUSED *_rt_key,
@@ -1026,15 +1076,15 @@ H5D__btree_idx_iterate_cb(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
     H5D_btree_it_ud_t	*udata = (H5D_btree_it_ud_t *)_udata; /* User data */
     const H5D_btree_key_t	*lt_key = (const H5D_btree_key_t *)_lt_key; /* B-tree key for chunk */
     H5D_chunk_rec_t chunk_rec;  /* Generic chunk record for callback */
-    int ret_value;              /* Return value */
+    int ret_value = -1;         /* Return value */
 
     FUNC_ENTER_STATIC_NOERR
 
     /* Sanity check for memcpy() */
     HDcompile_assert(offsetof(H5D_chunk_rec_t, nbytes) == offsetof(H5D_btree_key_t, nbytes));
     HDcompile_assert(sizeof(chunk_rec.nbytes) == sizeof(lt_key->nbytes));
-    HDcompile_assert(offsetof(H5D_chunk_rec_t, offset) == offsetof(H5D_btree_key_t, offset));
-    HDcompile_assert(sizeof(chunk_rec.offset) == sizeof(lt_key->offset));
+    HDcompile_assert(offsetof(H5D_chunk_rec_t, scaled) == offsetof(H5D_btree_key_t, scaled));
+    HDcompile_assert(sizeof(chunk_rec.scaled) == sizeof(lt_key->scaled));
     HDcompile_assert(offsetof(H5D_chunk_rec_t, filter_mask) == offsetof(H5D_btree_key_t, filter_mask));
     HDcompile_assert(sizeof(chunk_rec.filter_mask) == sizeof(lt_key->filter_mask));
 
@@ -1068,7 +1118,7 @@ H5D__btree_idx_iterate(const H5D_chk_idx_info_t *idx_info,
     H5D_chunk_cb_func_t chunk_cb, void *chunk_udata)
 {
     H5D_btree_it_ud_t	udata;  /* User data for B-tree iterator callback */
-    int ret_value;              /* Return value */
+    int ret_value = -1;         /* Return value */
 
     FUNC_ENTER_STATIC_NOERR
 
@@ -1171,7 +1221,7 @@ H5D__btree_idx_delete(const H5D_chk_idx_info_t *idx_info)
         tmp_storage = *idx_info->storage;
 
         /* Set up the shared structure */
-        if(H5D__btree_shared_create(idx_info->f, &tmp_storage, idx_info->layout->ndims) < 0)
+        if(H5D__btree_shared_create(idx_info->f, &tmp_storage, idx_info->layout) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't create wrapper for shared B-tree info")
 
         /* Set up B-tree user data */
@@ -1186,7 +1236,7 @@ H5D__btree_idx_delete(const H5D_chk_idx_info_t *idx_info)
         /* Release the shared B-tree page */
         if(NULL == tmp_storage.u.btree.shared)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "ref-counted page nil")
-        if(H5RC_DEC(tmp_storage.u.btree.shared) < 0)
+        if(H5UC_DEC(tmp_storage.u.btree.shared) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to decrement ref-counted page")
     } /* end if */
 
@@ -1213,7 +1263,7 @@ H5D__btree_idx_copy_setup(const H5D_chk_idx_info_t *idx_info_src,
 {
     herr_t      ret_value = SUCCEED;        /* Return value */
 
-    FUNC_ENTER_STATIC
+    FUNC_ENTER_STATIC_TAG(idx_info_dst->dxpl_id, H5AC__COPIED_TAG, FAIL)
 
     HDassert(idx_info_src);
     HDassert(idx_info_src->f);
@@ -1228,9 +1278,9 @@ H5D__btree_idx_copy_setup(const H5D_chk_idx_info_t *idx_info_src,
     HDassert(!H5F_addr_defined(idx_info_dst->storage->idx_addr));
 
     /* Create shared B-tree info for each file */
-    if(H5D__btree_shared_create(idx_info_src->f, idx_info_src->storage, idx_info_src->layout->ndims) < 0)
+    if(H5D__btree_shared_create(idx_info_src->f, idx_info_src->storage, idx_info_src->layout) < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't create wrapper for source shared B-tree info")
-    if(H5D__btree_shared_create(idx_info_dst->f, idx_info_dst->storage, idx_info_dst->layout->ndims) < 0)
+    if(H5D__btree_shared_create(idx_info_dst->f, idx_info_dst->storage, idx_info_dst->layout) < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't create wrapper for destination shared B-tree info")
 
     /* Create the root of the B-tree that describes chunked storage in the dest. file */
@@ -1239,7 +1289,7 @@ H5D__btree_idx_copy_setup(const H5D_chk_idx_info_t *idx_info_src,
     HDassert(H5F_addr_defined(idx_info_dst->storage->idx_addr));
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5D__btree_idx_copy_setup() */
 
 

@@ -1268,9 +1318,9 @@ H5D__btree_idx_copy_shutdown(H5O_storage_chunk_t *storage_src,
     HDassert(storage_dst);
 
     /* Decrement refcount on shared B-tree info */
-    if(H5RC_DEC(storage_src->u.btree.shared) < 0)
+    if(H5UC_DEC(storage_src->u.btree.shared) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTDEC, FAIL, "unable to decrement ref-counted page")
-    if(H5RC_DEC(storage_dst->u.btree.shared) < 0)
+    if(H5UC_DEC(storage_dst->u.btree.shared) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTDEC, FAIL, "unable to decrement ref-counted page")
 
 done:
@@ -1294,9 +1344,8 @@ done:
 static herr_t
 H5D__btree_idx_size(const H5D_chk_idx_info_t *idx_info, hsize_t *index_size)
 {
-    H5D_chunk_common_ud_t udata;              /* User-data for loading B-tree nodes */
+    H5D_chunk_common_ud_t udata;        /* User-data for loading B-tree nodes */
     H5B_info_t bt_info;                 /* B-tree info */
-    hbool_t shared_init = FALSE;        /* Whether shared B-tree info is initialized */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
@@ -1309,11 +1358,6 @@ H5D__btree_idx_size(const H5D_chk_idx_info_t *idx_info, hsize_t *index_size)
     HDassert(idx_info->storage);
     HDassert(index_size);
 
-    /* Initialize the shared info for the B-tree traversal */
-    if(H5D__btree_shared_create(idx_info->f, idx_info->storage, idx_info->layout->ndims) < 0)
-        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't create wrapper for shared B-tree info")
-    shared_init = TRUE;
-
     /* Initialize B-tree node user-data */
     HDmemset(&udata, 0, sizeof udata);
     udata.layout = idx_info->layout;
@@ -1327,13 +1371,6 @@ H5D__btree_idx_size(const H5D_chk_idx_info_t *idx_info, hsize_t *index_size)
     *index_size = bt_info.size;
 
 done:
-    if(shared_init) {
-        if(NULL == idx_info->storage->u.btree.shared)
-            HDONE_ERROR(H5E_IO, H5E_CANTFREE, FAIL, "ref-counted page nil")
-        if(H5RC_DEC(idx_info->storage->u.btree.shared) < 0)
-            HDONE_ERROR(H5E_IO, H5E_CANTFREE, FAIL, "unable to decrement ref-counted page")
-    } /* end if */
-
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D__btree_idx_size() */
 
@@ -1420,7 +1457,7 @@ H5D__btree_idx_dest(const H5D_chk_idx_info_t *idx_info)
     /* Free the raw B-tree node buffer */
     if(NULL == idx_info->storage->u.btree.shared)
         HGOTO_ERROR(H5E_IO, H5E_CANTFREE, FAIL, "ref-counted page nil")
-    if(H5RC_DEC(idx_info->storage->u.btree.shared) < 0)
+    if(H5UC_DEC(idx_info->storage->u.btree.shared) < 0)
 	HGOTO_ERROR(H5E_IO, H5E_CANTFREE, FAIL, "unable to decrement ref-counted page")
 
 done:
@@ -1442,28 +1479,36 @@ done:
  */
 herr_t
 H5D_btree_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent,
-		 int fwidth, unsigned ndims)
+    int fwidth, unsigned ndims, const uint32_t *dim)
 {
     H5D_btree_dbg_t     udata;          /* User data for B-tree callback */
     H5O_storage_chunk_t storage;        /* Storage information for B-tree callback */
+    H5O_layout_chunk_t layout;          /* Layout information for B-tree callback */
     hbool_t     shared_init = FALSE;    /* Whether B-tree shared info is initialized */
+    unsigned    u;                      /* Local index variable */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
     /* Reset "fake" storage info */
     HDmemset(&storage, 0, sizeof(storage));
-    storage.idx_type = H5D_CHUNK_BTREE;
+    storage.idx_type = H5D_CHUNK_IDX_BTREE;
+
+    /* Reset "fake" layout info */
+    HDmemset(&layout, 0, sizeof(layout));
+    layout.ndims = ndims;
+    for(u = 0; u < ndims; u++)
+        layout.dim[u] = dim[u];
 
     /* Allocate the shared structure */
-    if(H5D__btree_shared_create(f, &storage, ndims) < 0)
+    if(H5D__btree_shared_create(f, &storage, &layout) < 0)
 	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't create wrapper for shared B-tree info")
     shared_init = TRUE;
 
     /* Set up user data for callback */
-    udata.common.layout = NULL;
+    udata.common.layout = &layout;
     udata.common.storage = &storage;
-    udata.common.offset = NULL;
+    udata.common.scaled = NULL;
     udata.ndims = ndims;
 
     /* Dump the records for the B-tree */
@@ -1473,10 +1518,10 @@ done:
     if(shared_init) {
         /* Free the raw B-tree node buffer */
         if(NULL == storage.u.btree.shared)
-            HDONE_ERROR(H5E_IO, H5E_CANTFREE, FAIL, "ref-counted page nil")
+            HDONE_ERROR(H5E_IO, H5E_CANTFREE, FAIL, "ref-counted shared info nil")
         else
-            if(H5RC_DEC(storage.u.btree.shared) < 0)
-                HDONE_ERROR(H5E_IO, H5E_CANTFREE, FAIL, "unable to decrement ref-counted page")
+            if(H5UC_DEC(storage.u.btree.shared) < 0)
+                HDONE_ERROR(H5E_IO, H5E_CANTFREE, FAIL, "unable to decrement ref-counted shared info")
     } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
diff --git a/src/H5Dbtree2.c b/src/H5Dbtree2.c
new file mode 100644
index 0000000..f286db2
--- /dev/null
+++ b/src/H5Dbtree2.c
@@ -0,0 +1,1657 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* 
+ *
+ * Purpose: v2 B-tree indexing for chunked datasets with > 1 unlimited dimensions.
+ *   Each dataset chunk in the b-tree is identified by its dimensional offset.
+ *
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"          /* Generic Functions                    */
+#include "H5Dpkg.h"		/* Datasets				*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5MFprivate.h"     	/* File space management                */
+#include "H5VMprivate.h"	/* Vector and array functions		*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+/* User data for creating callback context */
+typedef struct H5D_bt2_ctx_ud_t {
+    const H5F_t *f;             /* Pointer to file info */
+    uint32_t chunk_size;        /* Size of chunk (bytes; for filtered object) */
+    unsigned ndims;		/* Number of dimensions */
+    uint32_t *dim;		/* Size of chunk in elements */
+} H5D_bt2_ctx_ud_t;
+
+/* The callback context */
+typedef struct H5D_bt2_ctx_t {
+    uint32_t chunk_size;        /* Size of chunk (bytes; constant for unfiltered object) */
+    size_t sizeof_addr;       	/* Size of file addresses in the file (bytes) */
+    size_t chunk_size_len;      /* Size of chunk sizes in the file (bytes) */
+    unsigned ndims;		/* Number of dimensions in chunk */
+    uint32_t *dim;		/* Size of chunk in elements */
+} H5D_bt2_ctx_t;
+
+/* User data for the chunk's removal callback routine */
+typedef struct H5D_bt2_remove_ud_t {
+    H5F_t *f;                   /* File pointer for operation */
+    hid_t dxpl_id;              /* DXPL ID for operation */
+} H5D_bt2_remove_ud_t;
+
+/* Callback info for iteration over chunks in v2 B-tree */
+typedef struct H5D_bt2_it_ud_t {
+    H5D_chunk_cb_func_t cb;     /* Callback routine for the chunk */
+    void *udata;                /* User data for the chunk's callback routine */
+} H5D_bt2_it_ud_t;
+
+/* User data for compare callback */
+typedef struct H5D_bt2_ud_t {
+    H5D_chunk_rec_t rec;    	/* The record to search for */
+    unsigned ndims;	        /* Number of dimensions for the chunked dataset */
+} H5D_bt2_ud_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Shared v2 B-tree methods for indexing filtered and non-filtered chunked datasets */
+static void *H5D__bt2_crt_context(void *udata);
+static herr_t H5D__bt2_dst_context(void *ctx);
+static herr_t H5D__bt2_store(void *native, const void *udata);
+static herr_t H5D__bt2_compare(const void *rec1, const void *rec2);
+static void *H5D__bt2_crt_dbg_context(H5F_t *f, hid_t dxpl_id, haddr_t obj_addr);
+static herr_t H5D__bt2_dst_dbg_context(void *_u_ctx);
+
+/* v2 B-tree class for indexing non-filtered chunked datasets */
+static herr_t H5D__bt2_unfilt_encode(uint8_t *raw, const void *native, void *ctx);
+static herr_t H5D__bt2_unfilt_decode(const uint8_t *raw, void *native, void *ctx);
+static herr_t H5D__bt2_unfilt_debug(FILE *stream, int indent, int fwidth,
+    const void *record, const void *u_ctx);
+
+/* v2 B-tree class for indexing filtered chunked datasets */
+static herr_t H5D__bt2_filt_encode(uint8_t *raw, const void *native, void *ctx);
+static herr_t H5D__bt2_filt_decode(const uint8_t *raw, void *native, void *ctx);
+static herr_t H5D__bt2_filt_debug(FILE *stream, int indent, int fwidth,
+    const void *record, const void *u_ctx);
+
+/* Helper routine */
+static herr_t H5D__bt2_idx_open(const H5D_chk_idx_info_t *idx_info);
+static herr_t H5D__btree2_idx_depend(const H5D_chk_idx_info_t *idx_info);
+
+/* Callback for H5B2_iterate() which is called in H5D__bt2_idx_iterate() */
+static int H5D__bt2_idx_iterate_cb(const void *_record, void *_udata);
+
+/* Callback for H5B2_find() which is called in H5D__bt2_idx_get_addr() */
+static herr_t H5D__bt2_found_cb(const void *nrecord, void *op_data);
+
+/*  
+ * Callback for H5B2_remove() and H5B2_delete() which is called
+ * in H5D__bt2_idx_remove() and H5D__bt2_idx_delete().
+ */
+static herr_t H5D__bt2_remove_cb(const void *nrecord, void *_udata);
+
+/* Callback for H5B2_modify() which is called in H5D__bt2_idx_insert() */
+static herr_t H5D__bt2_mod_cb(void *_record, void *_op_data, hbool_t *changed);
+
+/* Chunked layout indexing callbacks for v2 B-tree indexing */
+static herr_t H5D__bt2_idx_init(const H5D_chk_idx_info_t *idx_info,
+    const H5S_t *space, haddr_t dset_ohdr_addr);
+static herr_t H5D__bt2_idx_create(const H5D_chk_idx_info_t *idx_info);
+static hbool_t H5D__bt2_idx_is_space_alloc(const H5O_storage_chunk_t *storage);
+static herr_t H5D__bt2_idx_insert(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_ud_t *udata, const H5D_t *dset);
+static herr_t H5D__bt2_idx_get_addr(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_ud_t *udata);
+static int H5D__bt2_idx_iterate(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_cb_func_t chunk_cb, void *chunk_udata);
+static herr_t H5D__bt2_idx_remove(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_common_ud_t *udata);
+static herr_t H5D__bt2_idx_delete(const H5D_chk_idx_info_t *idx_info);
+static herr_t H5D__bt2_idx_copy_setup(const H5D_chk_idx_info_t *idx_info_src,
+    const H5D_chk_idx_info_t *idx_info_dst);
+static herr_t H5D__bt2_idx_copy_shutdown(H5O_storage_chunk_t *storage_src,
+    H5O_storage_chunk_t *storage_dst, hid_t dxpl_id);
+static herr_t H5D__bt2_idx_size(const H5D_chk_idx_info_t *idx_info, hsize_t *size);
+static herr_t H5D__bt2_idx_reset(H5O_storage_chunk_t *storage, hbool_t reset_addr);
+static herr_t H5D__bt2_idx_dump(const H5O_storage_chunk_t *storage,
+    FILE *stream);
+static herr_t H5D__bt2_idx_dest(const H5D_chk_idx_info_t *idx_info);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Chunked dataset I/O ops for v2 B-tree indexing */
+const H5D_chunk_ops_t H5D_COPS_BT2[1] = {{
+    TRUE,                               /* Fixed array indices support SWMR access */
+    H5D__bt2_idx_init,                  /* init */
+    H5D__bt2_idx_create,                /* create */
+    H5D__bt2_idx_is_space_alloc,        /* is_space_alloc */
+    H5D__bt2_idx_insert,                /* insert */
+    H5D__bt2_idx_get_addr,              /* get_addr */
+    NULL,                               /* resize */
+    H5D__bt2_idx_iterate,               /* iterate */
+    H5D__bt2_idx_remove,                /* remove */
+    H5D__bt2_idx_delete,                /* delete */
+    H5D__bt2_idx_copy_setup,            /* copy_setup */
+    H5D__bt2_idx_copy_shutdown,         /* copy_shutdown */
+    H5D__bt2_idx_size,                  /* size */
+    H5D__bt2_idx_reset,                 /* reset */
+    H5D__bt2_idx_dump,                  /* dump */
+    H5D__bt2_idx_dest                   /* destroy */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+/* v2 B-tree class for indexing non-filtered chunked datasets */
+const H5B2_class_t H5D_BT2[1] = {{  	/* B-tree class information */
+    H5B2_CDSET_ID,             	/* Type of B-tree */
+    "H5B2_CDSET_ID",           	/* Name of B-tree class */
+    sizeof(H5D_chunk_rec_t),	/* Size of native record */
+    H5D__bt2_crt_context,      	/* Create client callback context */
+    H5D__bt2_dst_context,       /* Destroy client callback context */
+    H5D__bt2_store,    		/* Record storage callback */
+    H5D__bt2_compare,   	/* Record comparison callback */
+    H5D__bt2_unfilt_encode,    	/* Record encoding callback */
+    H5D__bt2_unfilt_decode,    	/* Record decoding callback */
+    H5D__bt2_unfilt_debug,  	/* Record debugging callback */
+    H5D__bt2_crt_dbg_context,  	/* Create debugging context */
+    H5D__bt2_dst_dbg_context    /* Destroy debugging context */
+}};
+
+/* v2 B-tree class for indexing filtered chunked datasets */
+const H5B2_class_t H5D_BT2_FILT[1] = {{	/* B-tree class information */
+    H5B2_CDSET_FILT_ID, 	/* Type of B-tree */
+    "H5B2_CDSET_FILT_ID",      	/* Name of B-tree class */
+    sizeof(H5D_chunk_rec_t), 	/* Size of native record */
+    H5D__bt2_crt_context,      	/* Create client callback context */
+    H5D__bt2_dst_context,      	/* Destroy client callback context */
+    H5D__bt2_store,             /* Record storage callback */
+    H5D__bt2_compare,           /* Record comparison callback */
+    H5D__bt2_filt_encode,       /* Record encoding callback */
+    H5D__bt2_filt_decode,       /* Record decoding callback */
+    H5D__bt2_filt_debug,        /* Record debugging callback */
+    H5D__bt2_crt_dbg_context,  	/* Create debugging context */
+    H5D__bt2_dst_dbg_context   	/* Destroy debugging context */
+}};
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5D_bt2_ctx_t struct */
+H5FL_DEFINE_STATIC(H5D_bt2_ctx_t);
+/* Declare a free list to manage the H5D_bt2_ctx_ud_t struct */
+H5FL_DEFINE_STATIC(H5D_bt2_ctx_ud_t);
+/* Declare a free list to manage the page elements */
+H5FL_BLK_DEFINE(chunk_dim);
+
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__bt2_crt_context
+ *
+ * Purpose:     Create client callback context
+ *
+ * Return:      Success:        non-NULL
+ *              Failure:        NULL
+ *
+ * Programmer:  Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5D__bt2_crt_context(void *_udata)
+{
+    H5D_bt2_ctx_ud_t *udata = (H5D_bt2_ctx_ud_t *)_udata; /* User data for building callback context */
+    H5D_bt2_ctx_t *ctx;   	/* Callback context structure */
+    uint32_t *my_dim = NULL;    /* Pointer to copy of chunk dimension size */
+    void *ret_value = NULL;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(udata);
+    HDassert(udata->f);
+    HDassert(udata->ndims > 0 && udata->ndims < H5O_LAYOUT_NDIMS);
+
+    /* Allocate callback context */
+    if(NULL == (ctx = H5FL_MALLOC(H5D_bt2_ctx_t)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, NULL, "can't allocate callback context")
+
+    /* Determine the size of addresses and set the chunk size and # of dimensions for the dataset */
+    ctx->sizeof_addr = H5F_SIZEOF_ADDR(udata->f);
+    ctx->chunk_size = udata->chunk_size;
+    ctx->ndims = udata->ndims;
+
+    /* Set up the "local" information for this dataset's chunk dimension sizes */
+    if(NULL == (my_dim = (uint32_t *)H5FL_BLK_MALLOC(chunk_dim, H5O_LAYOUT_NDIMS * sizeof(uint32_t))))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, NULL, "can't allocate chunk dims")
+    HDmemcpy(my_dim, udata->dim, H5O_LAYOUT_NDIMS * sizeof(uint32_t));
+    ctx->dim = my_dim;
+
+    /* 
+     * Compute the size required for encoding the size of a chunk,
+     * allowing for an extra byte, in case the filter makes the chunk larger.
+     */
+    ctx->chunk_size_len = 1 + ((H5VM_log2_gen((uint64_t)udata->chunk_size) + 8) / 8);
+    if(ctx->chunk_size_len > 8)
+        ctx->chunk_size_len = 8;
+
+    /* Set return value */
+    ret_value = ctx;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__bt2_crt_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__bt2_dst_context
+ *
+ * Purpose:     Destroy client callback context
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_dst_context(void *_ctx)
+{
+    H5D_bt2_ctx_t *ctx = (H5D_bt2_ctx_t *)_ctx;       /* Callback context structure */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(ctx);
+
+    /* Free array for chunk dimension sizes */
+    if(ctx->dim)
+	(void)H5FL_BLK_FREE(chunk_dim, ctx->dim); 
+    /* Release callback context */
+    ctx = H5FL_FREE(H5D_bt2_ctx_t, ctx);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5D__bt2_dst_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__bt2_store
+ *
+ * Purpose:     Store native information into record for v2 B-tree
+ *		(non-filtered)
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_store(void *record, const void *_udata)
+{
+    const H5D_bt2_ud_t *udata = (const H5D_bt2_ud_t *)_udata;	/* User data */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    *(H5D_chunk_rec_t *)record = udata->rec;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5D__bt2_store() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__bt2_compare
+ *
+ * Purpose:     Compare two native information records, according to some key
+ *		(non-filtered)
+ *
+ * Return:      <0 if rec1 < rec2
+ *              =0 if rec1 == rec2
+ *              >0 if rec1 > rec2
+ *
+ * Programmer:  Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_compare(const void *_udata, const void *_rec2)
+{
+    const H5D_bt2_ud_t *udata = (const H5D_bt2_ud_t *)_udata;	/* User data */
+    const H5D_chunk_rec_t *rec1 = &(udata->rec);	/* The search record */
+    const H5D_chunk_rec_t *rec2 = (const H5D_chunk_rec_t *)_rec2;	/* The native record */
+    herr_t ret_value = FAIL; 	/* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(rec1);
+    HDassert(rec2);
+
+    /* Compare the offsets but ignore the other fields */
+    ret_value = H5VM_vector_cmp_u(udata->ndims, rec1->scaled, rec2->scaled);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__bt2_compare() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__bt2_crt_dbg_context
+ *
+ * Purpose:     Create user data for debugged callback context 
+ *
+ * Return:      Success:        non-NULL
+ *              Failure:        NULL
+ *
+ * Programmer:  Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5D__bt2_crt_dbg_context(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t obj_addr)
+{
+    H5D_bt2_ctx_ud_t *u_ctx = NULL;     /* User data for creating callback context */
+    H5O_loc_t obj_loc;          /* Pointer to an object's location */
+    hbool_t obj_opened = FALSE; /* Flag to indicate that the object header was opened */
+    H5O_layout_t layout;        /* Layout message */
+    void *ret_value = NULL;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(H5F_addr_defined(obj_addr));
+
+    /* Set up the object header location info */
+    H5O_loc_reset(&obj_loc);
+    obj_loc.file = f;
+    obj_loc.addr = obj_addr;
+
+    /* Open the object header where the layout message resides */
+    if(H5O_open(&obj_loc) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, NULL, "can't open object header")
+    obj_opened = TRUE;
+
+    /* Read the layout message */
+    if(NULL == H5O_msg_read(&obj_loc, H5O_LAYOUT_ID, &layout, dxpl_id))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, NULL, "can't get layout info")
+
+    /* close the object header */
+    if(H5O_close(&obj_loc) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, NULL, "can't close object header")
+
+    /* Allocate structure for storing user data to create callback context */
+    if(NULL == (u_ctx = H5FL_MALLOC(H5D_bt2_ctx_ud_t)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "can't allocate user data context structure ")
+
+    /* Set information for context structure */
+    u_ctx->f = f;
+    u_ctx->chunk_size = layout.u.chunk.size;
+    u_ctx->ndims = layout.u.chunk.ndims - 1;
+
+    /* Set return value */
+    ret_value = u_ctx;
+
+done:
+     /* Cleanup on error */
+    if(ret_value == NULL) {
+        /* Release context structure */
+        if(u_ctx)
+            u_ctx = H5FL_FREE(H5D_bt2_ctx_ud_t, u_ctx);
+
+        /* Close object header */
+        if(obj_opened) {
+            if(H5O_close(&obj_loc) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, NULL, "can't close object header")
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__bt2_crt_dbg_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__bt2_dst_dbg_context
+ *
+ * Purpose:     Destroy client callback context
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_dst_dbg_context(void *_u_ctx)
+{
+    H5D_bt2_ctx_ud_t *u_ctx = (H5D_bt2_ctx_ud_t *)_u_ctx; /* User data for creating callback context */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(u_ctx);
+
+    /* Release user data for creating callback context */
+    u_ctx = H5FL_FREE(H5D_bt2_ctx_ud_t, u_ctx);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5D__bt2_dst_dbg_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__bt2_unfilt_encode
+ *
+ * Purpose:     Encode native information into raw form for storing on disk
+ *		(non-filtered)
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_unfilt_encode(uint8_t *raw, const void *_record, void *_ctx)
+{
+    H5D_bt2_ctx_t *ctx = (H5D_bt2_ctx_t *)_ctx;	/* Callback context structure */
+    const H5D_chunk_rec_t *record = (const H5D_chunk_rec_t *)_record; /* The native record */
+    unsigned u;			/* Local index varible */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(ctx);
+
+    /* Encode the record's fields */
+    H5F_addr_encode_len(ctx->sizeof_addr, &raw, record->chunk_addr);
+    /* (Don't encode the chunk size & filter mask for non-filtered B-tree records) */
+    for(u = 0; u < ctx->ndims; u++)
+	UINT64ENCODE(raw, record->scaled[u]);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5D__bt2_unfilt_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__bt2_unfilt_decode
+ *
+ * Purpose:     Decode raw disk form of record into native form
+ *		(non-filtered)
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_unfilt_decode(const uint8_t *raw, void *_record, void *_ctx)
+{
+    H5D_bt2_ctx_t *ctx = (H5D_bt2_ctx_t *)_ctx;       	/* Callback context structure */
+    H5D_chunk_rec_t *record = (H5D_chunk_rec_t *)_record;	/* The native record */
+    unsigned	u;		/* Local index variable */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(ctx);
+
+    /* Decode the record's fields */
+    H5F_addr_decode_len(ctx->sizeof_addr, &raw, &record->chunk_addr);
+    record->nbytes = ctx->chunk_size;
+    record->filter_mask = 0;
+    for(u = 0; u < ctx->ndims; u++)
+	UINT64DECODE(raw, record->scaled[u]);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5D__bt2_unfilt_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_unfilt_debug
+ *
+ * Purpose:	Debug native form of record (non-filtered)
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_unfilt_debug(FILE *stream, int indent, int fwidth,
+    const void *_record, const void *_u_ctx)
+{
+    const H5D_chunk_rec_t *record = (const H5D_chunk_rec_t *)_record; /* The native record */
+    const H5D_bt2_ctx_ud_t *u_ctx = (const H5D_bt2_ctx_ud_t *)_u_ctx; 	  /* User data for creating callback context */
+    unsigned u;		/* Local index variable */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(record);
+    HDassert(u_ctx->chunk_size == record->nbytes);
+    HDassert(0 == record->filter_mask);
+
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth, "Chunk address:", record->chunk_addr);
+    HDfprintf(stream, "%*s%-*s {", indent, "", fwidth, "Logical offset:");
+    for(u = 0; u < u_ctx->ndims; u++)
+        HDfprintf(stream, "%s%Hd", u?", ":"", record->scaled[u] * u_ctx->dim[u]);
+    HDfputs("}\n", stream);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5D__bt2_unfilt_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__bt2_filt_encode
+ *
+ * Purpose:     Encode native information into raw form for storing on disk
+ *		(filtered)
+ *
+ * Return:      Success:        non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_filt_encode(uint8_t *raw, const void *_record, void *_ctx)
+{
+    H5D_bt2_ctx_t *ctx = (H5D_bt2_ctx_t *)_ctx;	/* Callback context structure */
+    const H5D_chunk_rec_t *record = (const H5D_chunk_rec_t *)_record;  /* The native record */
+    unsigned u;         /* Local index variable */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(ctx);
+    HDassert(record);
+    HDassert(H5F_addr_defined(record->chunk_addr));
+    HDassert(0 != record->nbytes);
+
+    /* Encode the record's fields */
+    H5F_addr_encode_len(ctx->sizeof_addr, &raw, record->chunk_addr);
+    UINT64ENCODE_VAR(raw, record->nbytes, ctx->chunk_size_len);
+    UINT32ENCODE(raw, record->filter_mask);
+    for(u = 0; u < ctx->ndims; u++)
+	UINT64ENCODE(raw, record->scaled[u]);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5D__bt2_filt_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_filt_decode
+ *
+ * Purpose:	Decode raw disk form of record into native form
+ *		(filtered)
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_filt_decode(const uint8_t *raw, void *_record, void *_ctx)
+{
+    H5D_bt2_ctx_t *ctx = (H5D_bt2_ctx_t *)_ctx;       		/* Callback context structure */
+    H5D_chunk_rec_t *record = (H5D_chunk_rec_t *)_record;	/* The native record */
+    unsigned u;         /* Local index variable */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(ctx);
+    HDassert(record);
+
+    /* Decode the record's fields */
+    H5F_addr_decode_len(ctx->sizeof_addr, &raw, &record->chunk_addr);
+    UINT64DECODE_VAR(raw, record->nbytes, ctx->chunk_size_len);
+    UINT32DECODE(raw, record->filter_mask);
+    for(u = 0; u < ctx->ndims; u++)
+	UINT64DECODE(raw, record->scaled[u]);
+
+    /* Sanity checks */
+    HDassert(H5F_addr_defined(record->chunk_addr));
+    HDassert(0 != record->nbytes);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5D__bt2_filt_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_filt_debug
+ *
+ * Purpose:	Debug native form of record (filterd)
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_filt_debug(FILE *stream, int indent, int fwidth,
+    const void *_record, const void *_u_ctx)
+{
+    const H5D_chunk_rec_t *record = (const H5D_chunk_rec_t *)_record;   /* The native record */
+    const H5D_bt2_ctx_ud_t *u_ctx = (const H5D_bt2_ctx_ud_t *)_u_ctx; 	/* User data for creating callback context */
+    unsigned u;		/* Local index variable */
+ 
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(record);
+    HDassert(H5F_addr_defined(record->chunk_addr));
+    HDassert(0 != record->nbytes);
+
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth, "Chunk address:", record->chunk_addr);
+    HDfprintf(stream, "%*s%-*s %u bytes\n", indent, "", fwidth, "Chunk size:", (unsigned)record->nbytes);
+    HDfprintf(stream, "%*s%-*s 0x%08x\n", indent, "", fwidth, "Filter mask:", record->filter_mask);
+
+    HDfprintf(stream, "%*s%-*s {", indent, "", fwidth, "Logical offset:");
+    for(u = 0; u < u_ctx->ndims; u++)
+        HDfprintf(stream, "%s%Hd", u?", ":"", record->scaled[u] * u_ctx->dim[u]);
+    HDfputs("}\n", stream);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5D__bt2_filt_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__bt2_idx_init
+ *
+ * Purpose:     Initialize the indexing information for a dataset.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Wednesday, May 23, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_idx_init(const H5D_chk_idx_info_t H5_ATTR_UNUSED *idx_info,
+    const H5S_t H5_ATTR_UNUSED *space, haddr_t dset_ohdr_addr)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(H5F_addr_defined(dset_ohdr_addr));
+
+    idx_info->storage->u.btree2.dset_ohdr_addr = dset_ohdr_addr;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__bt2_idx_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__btree2_idx_depend
+ *
+ * Purpose:	Create flush dependency between v2 B-tree and dataset's
+ *              object header.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		Friday, December 18, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__btree2_idx_depend(const H5D_chk_idx_info_t *idx_info)
+{
+    H5O_loc_t oloc;                     /* Temporary object header location for dataset */
+    H5O_proxy_t *oh_proxy = NULL;       /* Dataset's object header proxy */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(H5F_INTENT(idx_info->f) & H5F_ACC_SWMR_WRITE);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(H5D_CHUNK_IDX_BT2 == idx_info->layout->idx_type);
+    HDassert(idx_info->storage);
+    HDassert(H5D_CHUNK_IDX_BT2 == idx_info->storage->idx_type);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(idx_info->storage->u.btree2.bt2);
+
+    /* Set up object header location for dataset */
+    H5O_loc_reset(&oloc);
+    oloc.file = idx_info->f;
+    oloc.addr = idx_info->storage->u.btree.dset_ohdr_addr;
+
+    /* Pin the dataset's object header proxy */
+    if(NULL == (oh_proxy = H5O_pin_flush_dep_proxy(&oloc, idx_info->dxpl_id)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTPIN, FAIL, "unable to pin dataset object header proxy")
+
+    /* Make the v2 B-tree a child flush dependency of the dataset's object header */
+    if(H5B2_depend((H5AC_info_t *)oh_proxy, idx_info->storage->u.btree2.bt2) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTDEPEND, FAIL, "unable to create flush dependency on object header")
+
+done:
+    /* Unpin the dataset's object header proxy */
+    if(oh_proxy && H5O_unpin_flush_dep_proxy(oh_proxy) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTUNPIN, FAIL, "unable to unpin dataset object header proxy")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__btree2_idx_depend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_idx_open()
+ *
+ * Purpose:	Opens an existing v2 B-tree.
+ *
+ * Note:	This information is passively initialized from each index
+ *              operation callback because those abstract chunk index operations
+ *              are designed to work with the v2 B-tree chunk indices also,
+ *              which don't require an 'open' for the data structure.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_idx_open(const H5D_chk_idx_info_t *idx_info)
+{
+    H5D_bt2_ctx_ud_t u_ctx;	/* user data for creating context */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(H5D_CHUNK_IDX_BT2 == idx_info->layout->idx_type);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(NULL == idx_info->storage->u.btree2.bt2);
+
+    /* Set up the user data */
+    u_ctx.f = idx_info->f;
+    u_ctx.ndims = idx_info->layout->ndims - 1;
+    u_ctx.chunk_size = idx_info->layout->size;
+    u_ctx.dim = idx_info->layout->dim;
+
+    /* Open v2 B-tree for the chunk index */
+    if(NULL == (idx_info->storage->u.btree2.bt2 = H5B2_open(idx_info->f, idx_info->dxpl_id, idx_info->storage->idx_addr, &u_ctx)))
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't open v2 B-tree for tracking chunked dataset")
+
+    /* Check for SWMR writes to the file */
+    if(H5F_INTENT(idx_info->f) & H5F_ACC_SWMR_WRITE)
+        if(H5D__btree2_idx_depend(idx_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTDEPEND, FAIL, "unable to create flush dependency on object header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__bt2_idx_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_idx_create 
+ *
+ * Purpose:	Create the v2 B-tree for tracking dataset chunks 
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_idx_create(const H5D_chk_idx_info_t *idx_info)
+{
+    H5B2_create_t bt2_cparam;           /* v2 B-tree creation parameters */
+    H5D_bt2_ctx_ud_t u_ctx;		/* data for context call */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(!H5F_addr_defined(idx_info->storage->idx_addr));
+
+    bt2_cparam.rrec_size = H5F_SIZEOF_ADDR(idx_info->f)	/* Address of chunk */
+		  + (idx_info->layout->ndims - 1) * 8;	/* # of dimensions x 64-bit chunk offsets */
+
+    /* General parameters */
+    if(idx_info->pline->nused > 0) {
+	unsigned chunk_size_len;        /* Size of encoded chunk size */
+
+        /* 
+	 * Compute the size required for encoding the size of a chunk,
+         * allowing for an extra byte, in case the filter makes the chunk larger.
+         */
+        chunk_size_len = 1 + ((H5VM_log2_gen((uint64_t)idx_info->layout->size) + 8) / 8);
+        if(chunk_size_len > 8)
+            chunk_size_len = 8;
+
+	bt2_cparam.rrec_size  += chunk_size_len	+ 4;	/* Size of encoded chunk size & filter mask */
+	bt2_cparam.cls = H5D_BT2_FILT;
+    } /* end if */
+    else
+	bt2_cparam.cls = H5D_BT2;
+
+    bt2_cparam.node_size = idx_info->layout->u.btree2.cparam.node_size;
+    bt2_cparam.split_percent = idx_info->layout->u.btree2.cparam.split_percent;
+    bt2_cparam.merge_percent = idx_info->layout->u.btree2.cparam.merge_percent;
+
+    u_ctx.f = idx_info->f;
+    u_ctx.ndims = idx_info->layout->ndims - 1;
+    u_ctx.chunk_size = idx_info->layout->size;
+    u_ctx.dim = idx_info->layout->dim;
+
+    /* Create the v2 B-tree for the chunked dataset */
+    if(NULL == (idx_info->storage->u.btree2.bt2 = H5B2_create(idx_info->f, idx_info->dxpl_id, &bt2_cparam, &u_ctx)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCREATE, FAIL, "can't create v2 B-tree for tracking chunked dataset")
+
+    /* Retrieve the v2 B-tree's address in the file */
+    if(H5B2_get_addr(idx_info->storage->u.btree2.bt2, &(idx_info->storage->idx_addr)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get v2 B-tree address for tracking chunked dataset")
+
+    /* Check for SWMR writes to the file */
+    if(H5F_INTENT(idx_info->f) & H5F_ACC_SWMR_WRITE)
+        if(H5D__btree2_idx_depend(idx_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTDEPEND, FAIL, "unable to create flush dependency on object header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__bt2_idx_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_idx_is_space_alloc
+ *
+ * Purpose:	Query if space is allocated for index method
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+H5D__bt2_idx_is_space_alloc(const H5O_storage_chunk_t *storage)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(storage);
+
+    FUNC_LEAVE_NOAPI((hbool_t)H5F_addr_defined(storage->idx_addr))
+} /* end H5D__bt2_idx_is_space_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_mod_cb
+ *
+ * Purpose:	Modify record for dataset chunk when it is found in a v2 B-tree.
+ * 		This is the callback for H5B2_modify() which is called in 
+ *		H5D__bt2_idx_insert().
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_mod_cb(void *_record, void *_op_data, hbool_t *changed)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    *(H5D_chunk_rec_t *)_record = *(H5D_chunk_rec_t *)_op_data;
+
+    /* Note that the record changed */
+    *changed = TRUE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__bt2_mod_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_idx_insert
+ *
+ * Purpose:	Insert chunk address into the indexing structure.
+ *		A non-filtered chunk: 
+ *		  Should not exist
+ *		  Allocate the chunk and pass chunk address back up
+ *		A filtered chunk:
+ *		  If it was not found, create the chunk and pass chunk address back up
+ *		  If it was found but its size changed, reallocate the chunk and pass chunk address back up
+ *		  If it was found but its size was the same, pass chunk address back up
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_idx_insert(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *udata,
+    const H5D_t H5_ATTR_UNUSED *dset)
+{
+    H5B2_t *bt2;                        /* v2 B-tree handle for indexing chunks */
+    H5D_bt2_ud_t bt2_udata;             /* User data for v2 B-tree calls */
+    unsigned u;				/* Local index variable */
+    herr_t ret_value = SUCCEED;		/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(udata);
+    HDassert(H5F_addr_defined(udata->chunk_block.offset));
+
+    /* Check if the v2 B-tree is open yet */
+    if(NULL == idx_info->storage->u.btree2.bt2)
+	/* Open existing v2 B-tree */
+        if(H5D__bt2_idx_open(idx_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't open v2 B-tree")
+
+    /* Set convenience pointer to v2 B-tree structure */
+    bt2 = idx_info->storage->u.btree2.bt2;
+
+    /* Set up callback info */
+    bt2_udata.ndims = idx_info->layout->ndims - 1;
+    bt2_udata.rec.chunk_addr = udata->chunk_block.offset;
+    if(idx_info->pline->nused > 0) { /* filtered chunk */
+        H5_CHECKED_ASSIGN(bt2_udata.rec.nbytes, uint32_t, udata->chunk_block.length, hsize_t);
+        bt2_udata.rec.filter_mask = udata->filter_mask;
+    } /* end if */
+    else { /* non-filtered chunk */
+        bt2_udata.rec.nbytes = idx_info->layout->size;
+        bt2_udata.rec.filter_mask = 0;
+    } /* end else */
+    for(u = 0; u < (idx_info->layout->ndims - 1); u++)
+        bt2_udata.rec.scaled[u] = udata->common.scaled[u];
+
+    if(udata->need_modify) {
+	HDassert(idx_info->pline->nused > 0);
+
+	/* Modify record for v2 B-tree */
+	if(H5B2_modify(bt2, idx_info->dxpl_id, &bt2_udata, H5D__bt2_mod_cb, &bt2_udata.rec) < 0)
+	    HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to modify record in v2 B-tree")
+    } /* end if */
+    else {
+	/* Insert record for object in v2 B-tree */
+	if(H5B2_insert(bt2, idx_info->dxpl_id, &bt2_udata) < 0)                
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "couldn't insert record in v2 B-tree")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__bt2_idx_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_found_cb
+ *
+ * Purpose:	Retrieve record for dataset chunk when it is found in a v2 B-tree.
+ * 		This is the callback for H5B2_find() which is called in 
+ *		H5D__bt2_idx_get_addr() and H5D__bt2_idx_insert().
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_found_cb(const void *nrecord, void *op_data)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    *(H5D_chunk_rec_t *)op_data = *(const H5D_chunk_rec_t *)nrecord;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5D__bt2_found_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_idx_get_addr
+ *
+ * Purpose:	Get the file address of a chunk if file space has been
+ *		assigned.  Save the retrieved information in the udata
+ *		supplied.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_idx_get_addr(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *udata)
+{
+    H5B2_t 	*bt2;                   /* v2 B-tree handle for indexing chunks */
+    H5D_bt2_ud_t bt2_udata;             /* User data for v2 B-tree calls */
+    H5D_chunk_rec_t found_rec;  	/* Record found from searching for object */
+    unsigned	u;			/* Local index variable */
+    herr_t	ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->layout->ndims > 0);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(udata);
+
+    /* Check if the v2 B-tree is open yet */
+    if(NULL == idx_info->storage->u.btree2.bt2)
+	/* Open existing v2 B-tree */
+        if(H5D__bt2_idx_open(idx_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't open v2 B-tree")
+
+    /* Set convenience pointer to v2 B-tree structure */
+    bt2 = idx_info->storage->u.btree2.bt2;
+
+    /* Clear the found record */
+    found_rec.chunk_addr = HADDR_UNDEF;
+    found_rec.nbytes = 0;
+    found_rec.filter_mask = 0;
+
+    /* Prepare user data for compare callback */
+    bt2_udata.rec.chunk_addr = HADDR_UNDEF;
+    bt2_udata.ndims = idx_info->layout->ndims - 1;
+
+    /* Set the chunk offset to be searched for */
+    for(u = 0; u < (idx_info->layout->ndims - 1); u++)
+        bt2_udata.rec.scaled[u] = udata->common.scaled[u];
+
+    /* Go get chunk information from v2 B-tree */
+    if(H5B2_find(bt2, idx_info->dxpl_id, &bt2_udata, H5D__bt2_found_cb, &found_rec) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "can't find object in v2 B-tree")
+
+    /* Set common info for the chunk */
+    udata->chunk_block.offset = found_rec.chunk_addr;
+
+    /* Check for setting other info */
+    if(H5F_addr_defined(udata->chunk_block.offset)) {
+        /* Sanity check */
+        HDassert(0 != found_rec.nbytes);
+
+        /* Set other info for the chunk */
+        if(idx_info->pline->nused > 0) { /* filtered chunk */
+            udata->chunk_block.length = found_rec.nbytes;
+            udata->filter_mask = found_rec.filter_mask;
+        } /* end if */
+        else { /* non-filtered chunk */
+            udata->chunk_block.length = idx_info->layout->size;
+            udata->filter_mask = 0;
+        } /* end else */
+    } /* end if */
+    else {
+        udata->chunk_block.length = 0;
+        udata->filter_mask = 0;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__bt2_idx_get_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_idx_iterate_cb
+ *
+ * Purpose:	Translate the B-tree specific chunk record into a generic
+ *              form and make the callback to the generic chunk callback
+ *              routine.
+ * 		This is the callback for H5B2_iterate() which is called in 
+ *		H5D__bt2_idx_iterate().
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5D__bt2_idx_iterate_cb(const void *_record, void *_udata)
+{
+    H5D_bt2_it_ud_t *udata = (H5D_bt2_it_ud_t *)_udata; /* User data */
+    const H5D_chunk_rec_t *record = (const H5D_chunk_rec_t *)_record;   /* Native record */
+    int ret_value = -1;         /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Make "generic chunk" callback */
+    if((ret_value = (udata->cb)(record, udata->udata)) < 0)
+        HERROR(H5E_DATASET, H5E_CALLBACK, "failure in generic chunk iterator callback");
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__bt2_idx_iterate_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_idx_iterate
+ *
+ * Purpose:	Iterate over the chunks in an index, making a callback
+ *              for each one.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5D__bt2_idx_iterate(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_cb_func_t chunk_cb, void *chunk_udata)
+{
+    H5B2_t *bt2;	        /* v2 B-tree handle for indexing chunks */
+    H5D_bt2_it_ud_t udata; 	/* User data for B-tree iterator callback */
+    int ret_value = FAIL;	/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(chunk_cb);
+    HDassert(chunk_udata);
+
+    /* Check if the v2 B-tree is open yet */
+    if(NULL == idx_info->storage->u.btree2.bt2)
+	/* Open existing v2 B-tree */
+        if(H5D__bt2_idx_open(idx_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't open v2 B-tree")
+
+    /* Set convenience pointer to v2 B-tree structure */
+    bt2 = idx_info->storage->u.btree2.bt2;
+
+    /* Prepare user data for iterate callback */
+    udata.cb = chunk_cb;
+    udata.udata = chunk_udata;
+
+    /* Iterate over the records in the v2 B-tree */
+    if((ret_value = H5B2_iterate(bt2, idx_info->dxpl_id, H5D__bt2_idx_iterate_cb, &udata)) < 0)
+        HERROR(H5E_DATASET, H5E_BADITER, "unable to iterate over chunk v2 B-tree");
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__bt2_idx_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_remove_cb()
+ *
+ * Purpose:	Free space for 'dataset chunk' object as v2 B-tree
+ *             	is being deleted or v2 B-tree node is removed.
+ * 		This is the callback for H5B2_remove() and H5B2_delete() which 
+ *		which are called in H5D__bt2_idx_remove() and H5D__bt2_idx_delete().
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_remove_cb(const void *_record, void *_udata)
+{
+    const H5D_chunk_rec_t *record = (const H5D_chunk_rec_t *)_record;	/* The native record */
+    H5D_bt2_remove_ud_t *udata = (H5D_bt2_remove_ud_t *)_udata;	/* User data for removal callback */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(udata);
+    HDassert(udata->f);
+
+    /* Free the space in the file for the object being removed */
+    H5_CHECK_OVERFLOW(record->nbytes, uint32_t, hsize_t);
+    if(H5MF_xfree(udata->f, H5FD_MEM_DRAW, udata->dxpl_id, record->chunk_addr, (hsize_t)record->nbytes) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to free chunk")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__bt2_remove_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_idx_remove
+ *
+ * Purpose:	Remove chunk from index.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_idx_remove(const H5D_chk_idx_info_t *idx_info, H5D_chunk_common_ud_t *udata)
+{
+    H5B2_t 	*bt2;                   /* v2 B-tree handle for indexing chunks */
+    H5D_bt2_remove_ud_t remove_udata;	/* User data for removal callback */
+    H5D_bt2_ud_t bt2_udata;             /* User data for v2 B-tree find call */
+    unsigned 	u;			/* Local index variable */
+    herr_t	ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(udata);
+
+    /* Check if the v2 B-tree is open yet */
+    if(NULL == idx_info->storage->u.btree2.bt2)
+	/* Open existing v2 B-tree */
+        if(H5D__bt2_idx_open(idx_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't open v2 B-tree")
+
+    /* Set convenience pointer to v2 B-tree structure */
+    bt2 = idx_info->storage->u.btree2.bt2;
+
+    /* Initialize user data for removal callback */
+    remove_udata.f = idx_info->f;
+    remove_udata.dxpl_id = idx_info->dxpl_id;
+
+    /* Prepare user data for compare callback */
+    bt2_udata.ndims = idx_info->layout->ndims - 1;
+
+    /* Initialize the record to search for */
+    for(u = 0; u < (idx_info->layout->ndims - 1); u++)
+        bt2_udata.rec.scaled[u] = udata->scaled[u];
+
+    /* Remove the record for the "dataset chunk" object from the v2 B-tree */
+    /* (space in the file for the object is freed in the 'remove' callback) */
+    if(H5B2_remove(bt2, idx_info->dxpl_id, &bt2_udata, (H5F_INTENT(idx_info->f) & H5F_ACC_SWMR_WRITE) ? NULL : H5D__bt2_remove_cb, &remove_udata) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTREMOVE, FAIL, "can't remove object from B-tree")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__bt2_idx_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_idx_delete
+ *
+ * Purpose:	Delete index and raw data storage for entire dataset
+ *              (i.e. all chunks)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ * Modifications:
+ *	Vailin Choi; March 2011
+ *	Initialize size of an unfiltered chunk.
+ *	This is a fix for for the assertion failure in:
+ *	[src/H5FSsection.c:968: H5FS_sect_link_size: Assertion `bin < sinfo->nbins' failed.]
+ *	which is uncovered by test_unlink_chunked_dataset() in test/unlink.c
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_idx_delete(const H5D_chk_idx_info_t *idx_info)
+{
+    H5D_bt2_remove_ud_t remove_udata;	/* User data for removal callback */
+    H5B2_remove_t remove_op;		/* The removal callback */
+    H5D_bt2_ctx_ud_t u_ctx;		/* data for context call */
+    herr_t ret_value = SUCCEED;     	/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+
+    /* Check if the index data structure has been allocated */
+    if(H5F_addr_defined(idx_info->storage->idx_addr)) {
+	/* Set up user data for creating context */
+	u_ctx.f = idx_info->f;
+	u_ctx.ndims = idx_info->layout->ndims - 1;
+	u_ctx.chunk_size = idx_info->layout->size;
+	u_ctx.dim = idx_info->layout->dim;
+
+	/* Initialize user data for removal callback */
+	remove_udata.f = idx_info->f;
+	remove_udata.dxpl_id = idx_info->dxpl_id;
+
+	/* Set remove operation.  Do not remove chunks in SWMR_WRITE mode */
+        if(H5F_INTENT(idx_info->f) & H5F_ACC_SWMR_WRITE)
+            remove_op = NULL;
+        else
+            remove_op = H5D__bt2_remove_cb;
+
+	/* Delete the v2 B-tree */
+	/*(space in the file for each object is freed in the 'remove' callback) */
+	if(H5B2_delete(idx_info->f, idx_info->dxpl_id, idx_info->storage->idx_addr, &u_ctx, remove_op, &remove_udata) < 0)
+	    HGOTO_ERROR(H5E_DATASET, H5E_CANTDELETE, FAIL, "can't delete v2 B-tree")
+
+	idx_info->storage->idx_addr = HADDR_UNDEF;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__bt2_idx_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_idx_copy_setup
+ *
+ * Purpose:	Set up any necessary information for copying chunks
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_idx_copy_setup(const H5D_chk_idx_info_t *idx_info_src,
+    const H5D_chk_idx_info_t *idx_info_dst)
+{
+    herr_t      ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Source file */
+    HDassert(idx_info_src);
+    HDassert(idx_info_src->f);
+    HDassert(idx_info_src->pline);
+    HDassert(idx_info_src->layout);
+    HDassert(idx_info_src->storage);
+
+    /* Destination file */
+    HDassert(idx_info_dst);
+    HDassert(idx_info_dst->f);
+    HDassert(idx_info_dst->pline);
+    HDassert(idx_info_dst->layout);
+    HDassert(idx_info_dst->storage);
+    HDassert(!H5F_addr_defined(idx_info_dst->storage->idx_addr));
+
+    /* Check if the source v2 B-tree is open yet */
+    if(NULL == idx_info_src->storage->u.btree2.bt2)
+        if(H5D__bt2_idx_open(idx_info_src) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't open v2 B-tree")
+
+    /* Set copied metadata tag */
+    H5_BEGIN_TAG(idx_info_dst->dxpl_id, H5AC__COPIED_TAG, FAIL);
+
+    /* Create v2 B-tree that describes the chunked dataset in the destination file */
+    if(H5D__bt2_idx_create(idx_info_dst) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize chunked storage")
+    HDassert(H5F_addr_defined(idx_info_dst->storage->idx_addr));
+
+    /* Reset metadata tag */
+    H5_END_TAG(FAIL);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__bt2_idx_copy_setup() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_idx_copy_shutdown
+ *
+ * Purpose:	Shutdown any information from copying chunks
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_idx_copy_shutdown(H5O_storage_chunk_t *storage_src,
+    H5O_storage_chunk_t *storage_dst, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(storage_src);
+    HDassert(storage_src->u.btree2.bt2);
+    HDassert(storage_dst);
+    HDassert(storage_dst->u.btree2.bt2);
+
+    /* Close v2 B-tree for source file */
+    if(H5B2_close(storage_src->u.btree2.bt2, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to close v2 B-tree")
+    storage_src->u.btree2.bt2 = NULL;
+
+    /* Close v2 B-tree for destination file */
+    if(H5B2_close(storage_dst->u.btree2.bt2, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to close v2 B-tree")
+    storage_dst->u.btree2.bt2 = NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__bt2_idx_copy_shutdown() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__bt2_idx_size
+ *
+ * Purpose:     Retrieve the amount of index storage for chunked dataset
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_idx_size(const H5D_chk_idx_info_t *idx_info, hsize_t *index_size)
+{
+    H5B2_t *bt2_cdset = NULL;		/* Pointer to v2 B-tree structure */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(index_size);
+
+    /* Open v2 B-tree */
+    if(H5D__bt2_idx_open(idx_info) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't open v2 B-tree")
+
+    /* Set convenience pointer to v2 B-tree structure */
+    bt2_cdset = idx_info->storage->u.btree2.bt2;
+
+    /* Get v2 B-tree size for indexing chunked dataset */
+    if(H5B2_size(bt2_cdset, idx_info->dxpl_id, index_size) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve v2 B-tree storage info for chunked dataset")
+
+done:
+    /* Close v2 B-tree index */
+    if(bt2_cdset && H5B2_close(bt2_cdset, idx_info->dxpl_id) < 0)
+        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for tracking chunked dataset")
+    idx_info->storage->u.btree2.bt2 = NULL;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__bt2_idx_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_idx_reset
+ *
+ * Purpose:	Reset indexing information.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_idx_reset(H5O_storage_chunk_t *storage, hbool_t reset_addr)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(storage);
+
+    /* Reset index info */
+    if(reset_addr)
+	storage->idx_addr = HADDR_UNDEF;
+    storage->u.btree2.bt2 = NULL;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__bt2_idx_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_idx_dump
+ *
+ * Purpose:	Dump indexing information to a stream.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_idx_dump(const H5O_storage_chunk_t *storage, FILE *stream)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(storage);
+    HDassert(stream);
+
+    HDfprintf(stream, "    Address: %a\n", storage->idx_addr);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__bt2_idx_dump() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__bt2_idx_dest
+ *
+ * Purpose:	Release indexing information in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; June 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__bt2_idx_dest(const H5D_chk_idx_info_t *idx_info)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->storage);
+
+    /* Check if the v2-btree is open */
+    if(idx_info->storage->u.btree2.bt2) {
+        /* Close v2 B-tree */
+	if(H5B2_close(idx_info->storage->u.btree2.bt2, idx_info->dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree")
+        idx_info->storage->u.btree2.bt2 = NULL;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__bt2_idx_dest() */
+
diff --git a/src/H5Dchunk.c b/src/H5Dchunk.c
index 3bac996..1a44901 100644
--- a/src/H5Dchunk.c
+++ b/src/H5Dchunk.c
@@ -17,7 +17,7 @@
  *	       	Thursday, April 24, 2008
  *
  * Purpose:	Abstract indexed (chunked) I/O functions.  The logical
- *		multi-dimensional data space is regularly partitioned into
+ *		multi-dimensional dataspace is regularly partitioned into
  *		same-sized "chunks", the first of which is aligned with the
  *		logical origin.  The chunks are indexed by different methods,
  *		that map a chunk index to disk address.  Each chunk can be
@@ -44,7 +44,7 @@
 /* Module Setup */
 /****************/
 
-#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
 
 
 /***********/
@@ -59,7 +59,8 @@
 #include "H5FLprivate.h"	/* Free Lists                           */
 #include "H5Iprivate.h"		/* IDs			  		*/
 #include "H5MMprivate.h"	/* Memory management			*/
-#include "H5VMprivate.h"		/* Vector and array functions		*/
+#include "H5MFprivate.h"        /* File memory management               */
+#include "H5VMprivate.h"	/* Vector and array functions		*/
 
 
 /****************/
@@ -71,6 +72,15 @@
 #define H5D_CHUNK_GET_NODE_INFO(map, node)  (map->use_single ? map->single_chunk_info : (H5D_chunk_info_t *)H5SL_item(node))
 #define H5D_CHUNK_GET_NEXT_NODE(map, node)  (map->use_single ? (H5SL_node_t *)NULL : H5SL_next(node))
 
+/* Sanity check on chunk index types: commonly used by a lot of routines in this file */
+#define H5D_CHUNK_STORAGE_INDEX_CHK(storage)                                                    \
+    HDassert((H5D_CHUNK_IDX_EARRAY == storage->idx_type && H5D_COPS_EARRAY == storage->ops) ||  \
+             (H5D_CHUNK_IDX_FARRAY == storage->idx_type && H5D_COPS_FARRAY == storage->ops) ||  \
+             (H5D_CHUNK_IDX_BT2 == storage->idx_type && H5D_COPS_BT2 == storage->ops) ||        \
+             (H5D_CHUNK_IDX_BTREE == storage->idx_type && H5D_COPS_BTREE == storage->ops) ||    \
+             (H5D_CHUNK_IDX_SINGLE == storage->idx_type && H5D_COPS_SINGLE == storage->ops) ||  \
+             (H5D_CHUNK_IDX_NONE == storage->idx_type && H5D_COPS_NONE == storage->ops));
+
 /*
  * Feature: If this constant is defined then every cache preemption and load
  *	    causes a character to be printed on the standard error stream:
@@ -149,6 +159,8 @@ typedef struct H5D_chunk_it_ud3_t {
 
     /* needed for compressed variable-length data */
     const H5O_pline_t   *pline;                 /* Filter pipeline */
+    unsigned            dset_ndims;             /* Number of dimensions in dataset */
+    const hsize_t       *dset_dims;             /* Dataset dimensions */
 
     /* needed for copy object pointed by refs */
     H5O_copy_t          *cpy_info;              /* Copy options */
@@ -159,8 +171,16 @@ typedef struct H5D_chunk_it_ud4_t {
     FILE		*stream;		/* Output stream	*/
     hbool_t             header_displayed;       /* Node's header is displayed? */
     unsigned            ndims;                  /* Number of dimensions for chunk/dataset */
+    uint32_t            *chunk_dim;             /* Chunk dimensions */
 } H5D_chunk_it_ud4_t;
 
+/* Callback info for iteration to format convert chunks */
+typedef struct H5D_chunk_it_ud5_t {
+    H5D_chk_idx_info_t  *new_idx_info;          /* Dest. chunk index info object */
+    unsigned            dset_ndims;             /* Number of dimensions in dataset */
+    hsize_t       	*dset_dims;             /* Dataset dimensions */
+} H5D_chunk_it_ud5_t;
+
 /* Callback info for nonexistent readvv operation */
 typedef struct H5D_chunk_readvv_ud_t {
     unsigned char *rbuf;        /* Read buffer to initialize */
@@ -190,6 +210,8 @@ typedef struct H5D_chunk_coll_info_t {
 
 /* Chunked layout operation callbacks */
 static herr_t H5D__chunk_construct(H5F_t *f, H5D_t *dset);
+static herr_t H5D__chunk_init(H5F_t *f, hid_t dxpl_id, const H5D_t *dset,
+    hid_t dapl_id);
 static herr_t H5D__chunk_io_init(const H5D_io_info_t *io_info,
     const H5D_type_info_t *type_info, hsize_t nelmts, const H5S_t *file_space,
     const H5S_t *mem_space, H5D_chunk_map_t *fm);
@@ -201,7 +223,7 @@ static herr_t H5D__chunk_write(H5D_io_info_t *io_info, const H5D_type_info_t *ty
     H5D_chunk_map_t *fm);
 static herr_t H5D__chunk_flush(H5D_t *dset, hid_t dxpl_id);
 static herr_t H5D__chunk_io_term(const H5D_chunk_map_t *fm);
-static herr_t H5D__chunk_cinfo_cache_reset(H5D_chunk_cached_t *last);
+static herr_t H5D__chunk_dest(H5D_t *dset, hid_t dxpl_id);
 
 /* "Nonexistent" layout operation callback */
 static ssize_t
@@ -209,13 +231,17 @@ H5D__nonexistent_readvv(const H5D_io_info_t *io_info,
     size_t chunk_max_nseq, size_t *chunk_curr_seq, size_t chunk_len_arr[], hsize_t chunk_offset_arr[],
     size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[]);
 
+/* format convert cb */
+static int H5D__chunk_format_convert_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata);
+
 /* Helper routines */
 static herr_t H5D__chunk_set_info_real(H5O_layout_chunk_t *layout, unsigned ndims,
-    const hsize_t *curr_dims);
-static void *H5D__chunk_alloc(size_t size, const H5O_pline_t *pline);
-static void *H5D__chunk_xfree(void *chk, const H5O_pline_t *pline);
-static void *H5D__chunk_realloc(void *chk, size_t size,
+    const hsize_t *curr_dims, const hsize_t *max_dims);
+static void *H5D__chunk_mem_alloc(size_t size, const H5O_pline_t *pline);
+static void *H5D__chunk_mem_xfree(void *chk, const H5O_pline_t *pline);
+static void *H5D__chunk_mem_realloc(void *chk, size_t size,
     const H5O_pline_t *pline);
+static herr_t H5D__chunk_cinfo_cache_reset(H5D_chunk_cached_t *last);
 static herr_t H5D__chunk_cinfo_cache_update(H5D_chunk_cached_t *last,
     const H5D_chunk_ud_t *udata);
 static hbool_t H5D__chunk_cinfo_cache_found(const H5D_chunk_cached_t *last,
@@ -230,13 +256,19 @@ static herr_t H5D__chunk_file_cb(void *elem, const H5T_t *type, unsigned ndims,
     const hsize_t *coords, void *fm);
 static herr_t H5D__chunk_mem_cb(void *elem, const H5T_t *type, unsigned ndims,
     const hsize_t *coords, void *fm);
+static unsigned H5D__chunk_hash_val(const H5D_shared_t *shared, const hsize_t *scaled);
 static herr_t H5D__chunk_flush_entry(const H5D_t *dset, hid_t dxpl_id,
     const H5D_dxpl_cache_t *dxpl_cache, H5D_rdcc_ent_t *ent, hbool_t reset);
 static herr_t H5D__chunk_cache_evict(const H5D_t *dset, hid_t dxpl_id,
     const H5D_dxpl_cache_t *dxpl_cache, H5D_rdcc_ent_t *ent, hbool_t flush);
+static hbool_t H5D__chunk_is_partial_edge_chunk(const hsize_t *chunk_scaled,
+    unsigned dset_ndims, const hsize_t *dset_dims, const uint32_t *chunk_dims);
 static herr_t H5D__chunk_cache_prune(const H5D_t *dset, hid_t dxpl_id,
     const H5D_dxpl_cache_t *dxpl_cache, size_t size);
-static herr_t H5D__chunk_prune_fill(H5D_chunk_it_ud1_t *udata);
+static herr_t H5D__chunk_prune_fill(H5D_chunk_it_ud1_t *udata, hbool_t new_unfilt_chunk);
+static herr_t H5D__chunk_file_alloc(const H5D_chk_idx_info_t *idx_info,
+    const H5F_block_t *old_chunk, H5F_block_t *new_chunk, hbool_t *need_insert, 
+    hbool_t *need_bt2_modify, hsize_t scaled[]);
 #ifdef H5_HAVE_PARALLEL
 static herr_t H5D__chunk_collective_fill(const H5D_t *dset, hid_t dxpl_id,
     H5D_chunk_coll_info_t *chunk_info, size_t chunk_size, const void *fill_buf);
@@ -261,7 +293,8 @@ const H5D_layout_ops_t H5D_LOPS_CHUNK[1] = {{
     NULL,
     NULL,
     H5D__chunk_flush,
-    H5D__chunk_io_term
+    H5D__chunk_io_term,
+    H5D__chunk_dest
 }};
 
 
@@ -284,6 +317,7 @@ const H5D_layout_ops_t H5D_LOPS_NONEXISTENT[1] = {{
     H5D__nonexistent_readvv,
     NULL,
     NULL,
+    NULL,
     NULL
 }};
 
@@ -314,85 +348,96 @@ H5FL_BLK_DEFINE_STATIC(chunk);
  *-------------------------------------------------------------------------
  */
 herr_t
-H5D__chunk_direct_write(const H5D_t *dset, hid_t dxpl_id, uint32_t filters, hsize_t *offset, 
-     uint32_t data_size, const void *buf)
+H5D__chunk_direct_write(const H5D_t *dset, hid_t dxpl_id, uint32_t filters, 
+    hsize_t *offset, uint32_t data_size, const void *buf)
 {
     const H5O_layout_t *layout = &(dset->shared->layout);       /* Dataset layout */
     H5D_chunk_ud_t udata;               /* User data for querying chunk info */
-    hsize_t chunk_idx;
-    H5D_dxpl_cache_t _dxpl_cache;       /* Data transfer property cache buffer */
-    H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
-    const H5D_rdcc_t       *rdcc = &(dset->shared->cache.chunk);	/*raw data chunk cache */
-    int         space_ndims;    /* Dataset's space rank */
-    hsize_t     space_dim[H5O_LAYOUT_NDIMS];    /* Dataset's dataspace dimensions */
+    H5F_block_t old_chunk;              /* Offset/length of old chunk */
+    H5D_chk_idx_info_t idx_info;        /* Chunked index info */
+    hsize_t scaled[H5S_MAX_RANK];       /* Scaled coordinates for this chunk */
+    hbool_t need_insert = FALSE;        /* Whether the chunk needs to be inserted into the index */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_STATIC
+    FUNC_ENTER_STATIC_TAG(dxpl_id, dset->oloc.addr, FAIL)
 
-    /* Allocate data space and initialize it if it hasn't been. */
-    if(!(*dset->shared->layout.ops->is_space_alloc)(&dset->shared->layout.storage))
+    /* Allocate dataspace and initialize it if it hasn't been. */
+    if(!(*layout->ops->is_space_alloc)(&layout->storage))
  	/* Allocate storage */
         if(H5D__alloc_storage(dset, dxpl_id, H5D_ALLOC_WRITE, FALSE, NULL) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize storage")
 
-    /* Retrieve the dataset dimensions */
-    if((space_ndims = H5S_get_simple_extent_dims(dset->shared->space, space_dim, NULL)) < 0)
-         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to get simple dataspace info")
-
     /* Calculate the index of this chunk */
-    if(H5VM_chunk_index((unsigned)space_ndims, offset,
-	layout->u.chunk.dim, layout->u.chunk.down_chunks, &chunk_idx) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't get chunk index")
+    H5VM_chunk_scaled(dset->shared->ndims, offset, layout->u.chunk.dim, scaled);
+    scaled[dset->shared->ndims] = 0;
 
-    /* Find out the file address of the chunk */
-    if(H5D__chunk_lookup(dset, dxpl_id, offset, chunk_idx, &udata) < 0)
+    /* Find out the file address of the chunk (if any) */
+    if(H5D__chunk_lookup(dset, dxpl_id, scaled, &udata) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error looking up chunk address")
 
-    udata.filter_mask = filters;
+    /* Sanity check */
+    HDassert((H5F_addr_defined(udata.chunk_block.offset) && udata.chunk_block.length > 0) || 
+            (!H5F_addr_defined(udata.chunk_block.offset) && udata.chunk_block.length == 0));
 
-    /* Check if the chunk needs to be 'inserted' (could exist already and
-     *      the 'insert' operation could resize it)
-     */
-    {
-	H5D_chk_idx_info_t idx_info;        /* Chunked index info */
+    /* Set the file block information for the old chunk */
+    /* (Which is only defined when overwriting an existing chunk) */
+    old_chunk.offset = udata.chunk_block.offset;
+    old_chunk.length = udata.chunk_block.length;
 
-	/* Compose chunked index info struct */
-	idx_info.f = dset->oloc.file;
-	idx_info.dxpl_id = dxpl_id;
-	idx_info.pline = &(dset->shared->dcpl_cache.pline);
-	idx_info.layout = &(dset->shared->layout.u.chunk);
-	idx_info.storage = &(dset->shared->layout.storage.u.chunk);
+    /* Check if the chunk needs to be inserted (it also could exist already
+     *      and the chunk allocate operation could resize it)
+     */
 
-	/* Set up the size of chunk for user data */
-	udata.nbytes = data_size;
+    /* Compose chunked index info struct */
+    idx_info.f = dset->oloc.file;
+    idx_info.dxpl_id = dxpl_id;
+    idx_info.pline = &(dset->shared->dcpl_cache.pline);
+    idx_info.layout = &(dset->shared->layout.u.chunk);
+    idx_info.storage = &(dset->shared->layout.storage.u.chunk);
 
-        /* Create the chunk it if it doesn't exist, or reallocate the chunk
-         *  if its size changed.
-         */
-	if((dset->shared->layout.storage.u.chunk.ops->insert)(&idx_info, &udata) < 0)
-	    HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert/resize chunk")
+    /* Set up the size of chunk for user data */
+    udata.chunk_block.length = data_size;
 
-	/* Make sure the address of the chunk is returned. */
-	if(!H5F_addr_defined(udata.addr))
-	    HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "chunk address isn't defined")
-    } /* end if */
+    /* Create the chunk it if it doesn't exist, or reallocate the chunk
+     *  if its size changed.
+     */
+    if(H5D__chunk_file_alloc(&idx_info, &old_chunk, &udata.chunk_block, &need_insert, &udata.need_modify, scaled) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "unable to allocate chunk")
 
-    /* Fill the DXPL cache values for later use */
-    if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
+    /* Make sure the address of the chunk is returned. */
+    if(!H5F_addr_defined(udata.chunk_block.offset))
+        HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "chunk address isn't defined")
 
-    /* Evict the entry from the cache if present, but do not flush
+    /* Evict the (old) entry from the cache if present, but do not flush
      * it to disk */
-    if(UINT_MAX != udata.idx_hint)
+    if(UINT_MAX != udata.idx_hint) {
+        H5D_dxpl_cache_t _dxpl_cache;       /* Data transfer property cache buffer */
+        H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
+        const H5D_rdcc_t *rdcc = &(dset->shared->cache.chunk);	/*raw data chunk cache */
+
+        /* Fill the DXPL cache values for later use */
+        if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
+
         if(H5D__chunk_cache_evict(dset, dxpl_id, dxpl_cache, rdcc->slot[udata.idx_hint], FALSE) < 0)
 	    HGOTO_ERROR(H5E_DATASET, H5E_CANTREMOVE, FAIL, "unable to evict chunk")
+    } /* end if */
 
     /* Write the data to the file */
-    if(H5F_block_write(dset->oloc.file, H5FD_MEM_DRAW, udata.addr, data_size, dxpl_id, buf) < 0)
+    if(H5F_block_write(dset->oloc.file, H5FD_MEM_DRAW, udata.chunk_block.offset, data_size, dxpl_id, buf) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to write raw data to file")
 
+    /* Insert the chunk record into the index */
+    if((need_insert || udata.need_modify) && layout->storage.u.chunk.ops->insert) {
+        /* Set the chunk's filter mask to the new settings */
+        udata.filter_mask = filters;
+
+        if((layout->storage.u.chunk.ops->insert)(&idx_info, &udata, NULL) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert chunk addr into index")
+    } /* end if */
+
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5D__chunk_direct_write() */
 
 

@@ -409,7 +454,8 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5D__chunk_set_info_real(H5O_layout_chunk_t *layout, unsigned ndims, const hsize_t *curr_dims)
+H5D__chunk_set_info_real(H5O_layout_chunk_t *layout, unsigned ndims,
+    const hsize_t *curr_dims, const hsize_t *max_dims)
 {
     unsigned u;                 /* Local index variable */
     herr_t ret_value = SUCCEED; /* Return value */
@@ -422,17 +468,21 @@ H5D__chunk_set_info_real(H5O_layout_chunk_t *layout, unsigned ndims, const hsize
     HDassert(curr_dims);
 
     /* Compute the # of chunks in dataset dimensions */
-    for(u = 0, layout->nchunks = 1; u < ndims; u++) {
+    for(u = 0, layout->nchunks = 1, layout->max_nchunks = 1; u < ndims; u++) {
         /* Round up to the next integer # of chunks, to accomodate partial chunks */
 	layout->chunks[u] = ((curr_dims[u] + layout->dim[u]) - 1) / layout->dim[u];
+	layout->max_chunks[u] = ((max_dims[u] + layout->dim[u]) - 1) / layout->dim[u];
 
         /* Accumulate the # of chunks */
 	layout->nchunks *= layout->chunks[u];
+	layout->max_nchunks *= layout->max_chunks[u];
     } /* end for */
 
     /* Get the "down" sizes for each dimension */
     if(H5VM_array_down(ndims, layout->chunks, layout->down_chunks) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't compute 'down' chunk size value")
+    if(H5VM_array_down(ndims, layout->max_chunks, layout->max_down_chunks) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't compute 'down' chunk size value")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -454,23 +504,15 @@ done:
 herr_t
 H5D__chunk_set_info(const H5D_t *dset)
 {
-    hsize_t curr_dims[H5O_LAYOUT_NDIMS];    /* Curr. size of dataset dimensions */
-    int sndims;                 /* Rank of dataspace */
-    unsigned ndims;             /* Rank of dataspace */
-    herr_t ret_value = SUCCEED; /* Return value */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_PACKAGE
 
     /* Sanity checks */
     HDassert(dset);
 
-    /* Get the dim info for dataset */
-    if((sndims = H5S_get_simple_extent_dims(dset->shared->space, curr_dims, NULL)) < 0)
-	HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataspace dimensions")
-    H5_CHECKED_ASSIGN(ndims, unsigned, sndims, int);
-
     /* Set the base layout information */
-    if(H5D__chunk_set_info_real(&dset->shared->layout.u.chunk, ndims, curr_dims) < 0)
+    if(H5D__chunk_set_info_real(&dset->shared->layout.u.chunk, dset->shared->ndims, dset->shared->curr_dims, dset->shared->max_dims) < 0)
 	HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set layout's chunk info")
 
     /* Call the index's "resize" callback */
@@ -483,6 +525,52 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_set_sizes
+ *
+ * Purpose:     Sets chunk and type sizes.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:	Dana Robinson
+ *              December 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_set_sizes(H5D_t *dset)
+{
+    uint64_t chunk_size;            /* Size of chunk in bytes */
+    unsigned u;                     /* Iterator */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(dset);
+
+    /* Increment # of chunk dimensions, to account for datatype size as last element */
+    dset->shared->layout.u.chunk.ndims++;
+
+    /* Set the last dimension of the chunk size to the size of the datatype */
+    dset->shared->layout.u.chunk.dim[dset->shared->layout.u.chunk.ndims - 1] = (uint32_t)H5T_GET_SIZE(dset->shared->type);
+
+    /* Compute and store the total size of a chunk */
+    /* (Use 64-bit value to ensure that we can detect >4GB chunks) */
+    for(u = 1, chunk_size = (uint64_t)dset->shared->layout.u.chunk.dim[0]; u < dset->shared->layout.u.chunk.ndims; u++)
+        chunk_size *= (uint64_t)dset->shared->layout.u.chunk.dim[u];
+
+    /* Check for chunk larger than can be represented in 32-bits */
+    /* (Chunk size is encoded in 32-bit value in v1 B-tree records) */
+    if(chunk_size > (uint64_t)0xffffffff)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "chunk size must be < 4GB")
+
+    H5_CHECKED_ASSIGN(dset->shared->layout.u.chunk.size, uint32_t, chunk_size, uint64_t);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_set_sizes */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5D__chunk_construct
  *
  * Purpose:	Constructs new chunked layout information for dataset
@@ -497,11 +585,6 @@ done:
 static herr_t
 H5D__chunk_construct(H5F_t H5_ATTR_UNUSED *f, H5D_t *dset)
 {
-    const H5T_t *type = dset->shared->type;      /* Convenience pointer to dataset's datatype */
-    hsize_t max_dims[H5O_LAYOUT_NDIMS];          /* Maximum size of data in elements */
-    hsize_t dims[H5O_LAYOUT_NDIMS];              /* Dimension size of data in elements */
-    uint64_t chunk_size;        /* Size of chunk in bytes */
-    int ndims;                  /* Rank of dataspace */
     unsigned u;                 /* Local index variable */
     herr_t ret_value = SUCCEED; /* Return value */
 
@@ -514,28 +597,18 @@ H5D__chunk_construct(H5F_t H5_ATTR_UNUSED *f, H5D_t *dset)
     /* Check for invalid chunk dimension rank */
     if(0 == dset->shared->layout.u.chunk.ndims)
         HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "no chunk information set?")
-
-    /* Set up layout information */
-    if((ndims = H5S_GET_EXTENT_NDIMS(dset->shared->space)) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get rank")
-    if(dset->shared->layout.u.chunk.ndims != (unsigned)ndims)
+    if(dset->shared->layout.u.chunk.ndims != dset->shared->ndims)
         HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "dimensionality of chunks doesn't match the dataspace")
 
-    /* Increment # of chunk dimensions, to account for datatype size as last element */
-    dset->shared->layout.u.chunk.ndims++;
+    /* Set chunk sizes */
+    if(H5D__chunk_set_sizes(dset) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "unable to set chunk sizes")
     HDassert((unsigned)(dset->shared->layout.u.chunk.ndims) <= NELMTS(dset->shared->layout.u.chunk.dim));
 
     /* Chunked storage is not compatible with external storage (currently) */
     if(dset->shared->dcpl_cache.efl.nused > 0)
         HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "external storage not supported with chunked layout")
 
-    /* Set the last dimension of the chunk size to the size of the datatype */
-    dset->shared->layout.u.chunk.dim[dset->shared->layout.u.chunk.ndims - 1] = (uint32_t)H5T_GET_SIZE(type);
-
-    /* Get local copy of dataset dimensions (for sanity checking) */
-    if(H5S_get_simple_extent_dims(dset->shared->space, dims, max_dims) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to query maximum dimensions")
-
     /* Sanity check dimensions */
     for(u = 0; u < dset->shared->layout.u.chunk.ndims - 1; u++) {
         /* Don't allow zero-sized chunk dimensions */
@@ -547,23 +620,10 @@ H5D__chunk_construct(H5F_t H5_ATTR_UNUSED *f, H5D_t *dset)
          * the maximum dimension size. If any dimension size is zero, there
          * will be no such restriction.
          */
-        if(dims[u] && max_dims[u] != H5S_UNLIMITED && max_dims[u] < dset->shared->layout.u.chunk.dim[u])
+        if(dset->shared->curr_dims[u] && dset->shared->max_dims[u] != H5S_UNLIMITED && dset->shared->max_dims[u] < dset->shared->layout.u.chunk.dim[u])
             HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "chunk size must be <= maximum dimension size for fixed-sized dimensions")
     } /* end for */
 
-    /* Compute the total size of a chunk */
-    /* (Use 64-bit value to ensure that we can detect >4GB chunks) */
-    for(u = 1, chunk_size = (uint64_t)dset->shared->layout.u.chunk.dim[0]; u < dset->shared->layout.u.chunk.ndims; u++)
-        chunk_size *= (uint64_t)dset->shared->layout.u.chunk.dim[u];
-
-    /* Check for chunk larger than can be represented in 32-bits */
-    /* (Chunk size is encoded in 32-bit value in v1 B-tree records) */
-    if(chunk_size > (uint64_t)0xffffffff)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "chunk size must be < 4GB")
-
-    /* Retain computed chunk size */
-    H5_CHECKED_ASSIGN(dset->shared->layout.u.chunk.size, uint32_t, chunk_size, uint64_t);
-
     /* Reset address and pointer of the array struct for the chunked storage index */
     if(H5D_chunk_idx_reset(&dset->shared->layout.storage.u.chunk, TRUE) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to reset chunked storage index")
@@ -586,36 +646,38 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-herr_t
+static herr_t
 H5D__chunk_init(H5F_t *f, hid_t dxpl_id, const H5D_t *dset, hid_t dapl_id)
 {
     H5D_chk_idx_info_t idx_info;        /* Chunked index info */
     H5D_rdcc_t	*rdcc = &(dset->shared->cache.chunk);   /* Convenience pointer to dataset's chunk cache */
     H5P_genplist_t *dapl;               /* Data access property list object pointer */
+    H5O_storage_chunk_t *sc = &(dset->shared->layout.storage.u.chunk);
     herr_t      ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_PACKAGE
+    FUNC_ENTER_STATIC
 
     /* Sanity check */
     HDassert(f);
     HDassert(dset);
+    H5D_CHUNK_STORAGE_INDEX_CHK(sc);
 
     if(NULL == (dapl = (H5P_genplist_t *)H5I_object(dapl_id)))
-        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for fapl ID");
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for fapl ID")
 
     /* Use the properties in dapl_id if they have been set, otherwise use the properties from the file */
     if(H5P_get(dapl, H5D_ACS_DATA_CACHE_NUM_SLOTS_NAME, &rdcc->nslots) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get data cache number of slots");
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get data cache number of slots")
     if(rdcc->nslots == H5D_CHUNK_CACHE_NSLOTS_DEFAULT)
         rdcc->nslots = H5F_RDCC_NSLOTS(f);
 
     if(H5P_get(dapl, H5D_ACS_DATA_CACHE_BYTE_SIZE_NAME, &rdcc->nbytes_max) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get data cache byte size");
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get data cache byte size")
     if(rdcc->nbytes_max == H5D_CHUNK_CACHE_NBYTES_DEFAULT)
         rdcc->nbytes_max = H5F_RDCC_NBYTES(f);
 
     if(H5P_get(dapl, H5D_ACS_PREEMPT_READ_CHUNKS_NAME, &rdcc->w0) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get preempt read chunks");
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL, "can't get preempt read chunks")
     if(rdcc->w0 < 0)
         rdcc->w0 = H5F_RDCC_W0(f);
 
@@ -631,6 +693,22 @@ H5D__chunk_init(H5F_t *f, hid_t dxpl_id, const H5D_t *dset, hid_t dapl_id)
         H5D__chunk_cinfo_cache_reset(&(rdcc->last));
     } /* end else */
 
+    /* Compute scaled dimension info, if dataset dims > 1 */
+    if(dset->shared->ndims > 1) {
+        unsigned u;                         /* Local index value */
+
+        for(u = 0; u < dset->shared->ndims; u++) {
+            /* Initial scaled dimension sizes */
+            rdcc->scaled_dims[u] = dset->shared->curr_dims[u] / dset->shared->layout.u.chunk.dim[u];
+
+            /* Inital 'power2up' values for scaled dimensions */
+            rdcc->scaled_power2up[u] = H5VM_power2up(rdcc->scaled_dims[u]);
+
+            /* Number of bits required to encode scaled dimension size */
+            rdcc->scaled_encode_bits[u] = H5VM_log2_gen(rdcc->scaled_power2up[u]);
+        } /* end for */
+    } /* end if */
+
     /* Compose chunked index info struct */
     idx_info.f = f;
     idx_info.dxpl_id = dxpl_id;
@@ -666,12 +744,14 @@ done:
 hbool_t
 H5D__chunk_is_space_alloc(const H5O_storage_t *storage)
 {
-    hbool_t ret_value;                  /* Return value */
+    const H5O_storage_chunk_t *sc = &(storage->u.chunk);
+    hbool_t ret_value = FALSE;          /* Return value */
 
     FUNC_ENTER_PACKAGE_NOERR
 
     /* Sanity checks */
     HDassert(storage);
+    H5D_CHUNK_STORAGE_INDEX_CHK(sc);
 
     /* Query index layer */
     ret_value = (storage->u.chunk.ops->is_space_alloc)(&storage->u.chunk);
@@ -707,7 +787,6 @@ H5D__chunk_io_init(const H5D_io_info_t *io_info, const H5D_type_info_t *type_inf
     unsigned f_ndims;           /* The number of dimensions of the file's dataspace */
     int sm_ndims;               /* The number of dimensions of the memory buffer's dataspace (signed) */
     H5SL_node_t *curr_node;     /* Current node in skip list */
-    H5S_sel_type fsel_type;     /* Selection type on disk */
     char bogus;                 /* "bogus" buffer to pass to selection iterator */
     unsigned u;                 /* Local index variable */
     herr_t ret_value = SUCCEED;	/* Return value		*/
@@ -724,10 +803,8 @@ H5D__chunk_io_init(const H5D_io_info_t *io_info, const H5D_type_info_t *type_inf
     /* Set the number of dimensions for the memory dataspace */
     H5_CHECKED_ASSIGN(fm->m_ndims, unsigned, sm_ndims, int);
 
-    /* Get dim number and dimensionality for each dataspace */
+    /* Get rank for file dataspace */
     fm->f_ndims = f_ndims = dataset->shared->layout.u.chunk.ndims - 1;
-    if(H5S_get_simple_extent_dims(file_space, fm->f_dims, NULL) < 0)
-        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "unable to get dimensionality")
 
     /* Normalize hyperslab selections by adjusting them by the offset */
     /* (It might be worthwhile to normalize both the file and memory dataspaces
@@ -823,13 +900,13 @@ H5D__chunk_io_init(const H5D_io_info_t *io_info, const H5D_type_info_t *type_inf
         fm->use_single = FALSE;
 
         /* Get type of selection on disk & in memory */
-        if((fsel_type = H5S_GET_SELECT_TYPE(file_space)) < H5S_SEL_NONE)
+        if((fm->fsel_type = H5S_GET_SELECT_TYPE(file_space)) < H5S_SEL_NONE)
             HGOTO_ERROR(H5E_DATASET, H5E_BADSELECT, FAIL, "unable to get type of selection")
         if((fm->msel_type = H5S_GET_SELECT_TYPE(mem_space)) < H5S_SEL_NONE)
             HGOTO_ERROR(H5E_DATASET, H5E_BADSELECT, FAIL, "unable to get type of selection")
 
         /* If the selection is NONE or POINTS, set the flag to FALSE */
-        if(fsel_type == H5S_SEL_POINTS || fsel_type == H5S_SEL_NONE)
+        if(fm->fsel_type == H5S_SEL_POINTS || fm->fsel_type == H5S_SEL_NONE)
             sel_hyper_flag = FALSE;
         else
             sel_hyper_flag = TRUE;
@@ -982,7 +1059,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5D__chunk_alloc
+ * Function:	H5D__chunk_mem_alloc
  *
  * Purpose:	Allocate space for a chunk in memory.  This routine allocates
  *              memory space for non-filtered chunks from a block free list
@@ -996,26 +1073,25 @@ done:
  *-------------------------------------------------------------------------
  */
 static void *
-H5D__chunk_alloc(size_t size, const H5O_pline_t *pline)
+H5D__chunk_mem_alloc(size_t size, const H5O_pline_t *pline)
 {
     void *ret_value = NULL;		/* Return value */
 
     FUNC_ENTER_STATIC_NOERR
 
     HDassert(size);
-    HDassert(pline);
 
-    if(pline->nused > 0)
+    if(pline && pline->nused)
         ret_value = H5MM_malloc(size);
     else
         ret_value = H5FL_BLK_MALLOC(chunk, size);
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5D__chunk_alloc() */
+} /* H5D__chunk_mem_alloc() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5D__chunk_xfree
+ * Function:	H5D__chunk_mem_xfree
  *
  * Purpose:	Free space for a chunk in memory.  This routine allocates
  *              memory space for non-filtered chunks from a block free list
@@ -1029,25 +1105,23 @@ H5D__chunk_alloc(size_t size, const H5O_pline_t *pline)
  *-------------------------------------------------------------------------
  */
 static void *
-H5D__chunk_xfree(void *chk, const H5O_pline_t *pline)
+H5D__chunk_mem_xfree(void *chk, const H5O_pline_t *pline)
 {
     FUNC_ENTER_STATIC_NOERR
 
-    HDassert(pline);
-
     if(chk) {
-        if(pline->nused > 0)
+        if(pline && pline->nused)
             H5MM_xfree(chk);
         else
             chk = H5FL_BLK_FREE(chunk, chk);
     } /* end if */
 
     FUNC_LEAVE_NOAPI(NULL)
-} /* H5D__chunk_xfree() */
+} /* H5D__chunk_mem_xfree() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5D__chunk_realloc
+ * Function:    H5D__chunk_mem_realloc
  *
  * Purpose:     Reallocate space for a chunk in memory.  This routine allocates
  *              memory space for non-filtered chunks from a block free list
@@ -1061,7 +1135,7 @@ H5D__chunk_xfree(void *chk, const H5O_pline_t *pline)
  *-------------------------------------------------------------------------
  */
 static void *
-H5D__chunk_realloc(void *chk, size_t size, const H5O_pline_t *pline)
+H5D__chunk_mem_realloc(void *chk, size_t size, const H5O_pline_t *pline)
 {
     void *ret_value = NULL;             /* Return value */
 
@@ -1076,7 +1150,7 @@ H5D__chunk_realloc(void *chk, size_t size, const H5O_pline_t *pline)
         ret_value = H5FL_BLK_REALLOC(chunk, chk, size);
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5D__chunk_realloc() */
+} /* H5D__chunk_mem_realloc() */
 
 

 /*--------------------------------------------------------------------------
@@ -1142,6 +1216,7 @@ H5D__create_chunk_map_single(H5D_chunk_map_t *fm, const H5D_io_info_t
     *io_info)
 {
     H5D_chunk_info_t *chunk_info;           /* Chunk information to insert into skip list */
+    hsize_t     coords[H5O_LAYOUT_NDIMS];   /* Coordinates of chunk */
     hsize_t     sel_start[H5O_LAYOUT_NDIMS]; /* Offset of low bound of file selection */
     hsize_t     sel_end[H5O_LAYOUT_NDIMS];  /* Offset of high bound of file selection */
     unsigned    u;                          /* Local index variable */
@@ -1163,20 +1238,20 @@ H5D__create_chunk_map_single(H5D_chunk_map_t *fm, const H5D_io_info_t
     /* Set chunk location & hyperslab size */
     for(u = 0; u < fm->f_ndims; u++) {
         HDassert(sel_start[u] == sel_end[u]);
-        chunk_info->coords[u] = (sel_start[u] / fm->layout->u.chunk.dim[u]) * fm->layout->u.chunk.dim[u];
+        chunk_info->scaled[u] = sel_start[u] / fm->layout->u.chunk.dim[u];
+        coords[u] = chunk_info->scaled[u] * fm->layout->u.chunk.dim[u];
     } /* end for */
-    chunk_info->coords[fm->f_ndims] = 0;
+    chunk_info->scaled[fm->f_ndims] = 0;
 
     /* Calculate the index of this chunk */
-    if(H5VM_chunk_index(fm->f_ndims, chunk_info->coords, fm->layout->u.chunk.dim, fm->layout->u.chunk.down_chunks, &chunk_info->index) < 0)
-        HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index")
+    chunk_info->index = H5VM_array_offset_pre(fm->f_ndims, fm->layout->u.chunk.down_chunks, chunk_info->scaled);
 
     /* Copy selection for file's dataspace into chunk dataspace */
     if(H5S_select_copy(fm->single_space, fm->file_space, FALSE) < 0)
         HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "unable to copy file selection")
 
     /* Move selection back to have correct offset in chunk */
-    if(H5S_SELECT_ADJUST_U(fm->single_space, chunk_info->coords) < 0)
+    if(H5S_SELECT_ADJUST_U(fm->single_space, coords) < 0)
         HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSELECT, FAIL, "can't adjust chunk selection")
 
 #ifdef H5_HAVE_PARALLEL
@@ -1227,8 +1302,10 @@ H5D__create_chunk_file_map_hyper(H5D_chunk_map_t *fm, const H5D_io_info_t
     hsize_t     sel_points;                 /* Number of elements in file selection */
     hsize_t     start_coords[H5O_LAYOUT_NDIMS];   /* Starting coordinates of selection */
     hsize_t     coords[H5O_LAYOUT_NDIMS];   /* Current coordinates of chunk */
-    hsize_t     end[H5O_LAYOUT_NDIMS];      /* Current coordinates of chunk */
+    hsize_t     end[H5O_LAYOUT_NDIMS];      /* Final coordinates of chunk */
     hsize_t     chunk_index;                /* Index of chunk */
+    hsize_t     start_scaled[H5S_MAX_RANK]; /* Starting scaled coordinates of selection */
+    hsize_t 	scaled[H5S_MAX_RANK];       /* Scaled coordinates for this chunk */
     int         curr_dim;                   /* Current dimension to increment */
     unsigned    u;                          /* Local index variable */
     herr_t	ret_value = SUCCEED;        /* Return value */
@@ -1247,14 +1324,13 @@ H5D__create_chunk_file_map_hyper(H5D_chunk_map_t *fm, const H5D_io_info_t
 
     /* Set initial chunk location & hyperslab size */
     for(u = 0; u < fm->f_ndims; u++) {
-        start_coords[u] = (sel_start[u] / fm->layout->u.chunk.dim[u]) * fm->layout->u.chunk.dim[u];
-        coords[u] = start_coords[u];
+        scaled[u] = start_scaled[u] = sel_start[u] / fm->layout->u.chunk.dim[u];
+        coords[u] = start_coords[u] = scaled[u] * fm->layout->u.chunk.dim[u];
         end[u] = (coords[u] + fm->chunk_dim[u]) - 1;
     } /* end for */
 
     /* Calculate the index of this chunk */
-    if(H5VM_chunk_index(fm->f_ndims, coords, fm->layout->u.chunk.dim, fm->layout->u.chunk.down_chunks, &chunk_index) < 0)
-        HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index")
+    chunk_index = H5VM_array_offset_pre(fm->f_ndims, fm->layout->u.chunk.down_chunks, scaled);
 
     /* Iterate through each chunk in the dataset */
     while(sel_points) {
@@ -1320,9 +1396,12 @@ H5D__create_chunk_file_map_hyper(H5D_chunk_map_t *fm, const H5D_io_info_t
             new_chunk_info->mspace=NULL;
             new_chunk_info->mspace_shared = FALSE;
 
-            /* Copy the chunk's coordinates */
-            HDmemcpy(new_chunk_info->coords, coords, sizeof(hsize_t) * fm->f_ndims);
-            new_chunk_info->coords[fm->f_ndims] = 0;
+            /* Copy the chunk's scaled coordinates */
+	    HDmemcpy(new_chunk_info->scaled, scaled, sizeof(hsize_t) * fm->f_ndims);
+            new_chunk_info->scaled[fm->f_ndims] = 0;
+
+            /* Copy the chunk's scaled coordinates */
+	    HDmemcpy(new_chunk_info->scaled, scaled, sizeof(hsize_t) * fm->f_ndims);
 
             /* Insert the new chunk into the skip list */
             if(H5SL_insert(fm->sel_chunks, new_chunk_info, &new_chunk_info->index) < 0) {
@@ -1353,11 +1432,13 @@ H5D__create_chunk_file_map_hyper(H5D_chunk_map_t *fm, const H5D_io_info_t
         H5_CHECK_OVERFLOW(fm->chunk_dim[curr_dim],hsize_t,hssize_t);
         coords[curr_dim]+=fm->chunk_dim[curr_dim];
         end[curr_dim]+=fm->chunk_dim[curr_dim];
+        scaled[curr_dim]++;
 
         /* Bring chunk location back into bounds, if necessary */
         if(coords[curr_dim] > sel_end[curr_dim]) {
             do {
                 /* Reset current dimension's location to 0 */
+                scaled[curr_dim] = start_scaled[curr_dim];
                 coords[curr_dim] = start_coords[curr_dim]; /*lint !e771 The start_coords will always be initialized */
                 end[curr_dim] = (coords[curr_dim] + fm->chunk_dim[curr_dim]) - 1;
 
@@ -1365,13 +1446,13 @@ H5D__create_chunk_file_map_hyper(H5D_chunk_map_t *fm, const H5D_io_info_t
                 curr_dim--;
 
                 /* Increment chunk location in current dimension */
+                scaled[curr_dim]++;
                 coords[curr_dim] += fm->chunk_dim[curr_dim];
                 end[curr_dim] = (coords[curr_dim] + fm->chunk_dim[curr_dim]) - 1;
             } while(coords[curr_dim] > sel_end[curr_dim]);
 
             /* Re-calculate the index of this chunk */
-            if(H5VM_chunk_index(fm->f_ndims, coords, fm->layout->u.chunk.dim, fm->layout->u.chunk.down_chunks, &chunk_index) < 0)
-                HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index")
+            chunk_index = H5VM_array_offset_pre(fm->f_ndims, fm->layout->u.chunk.down_chunks, scaled);
         } /* end if */
     } /* end while */
 
@@ -1472,10 +1553,16 @@ H5D__create_chunk_mem_map_hyper(const H5D_chunk_map_t *fm)
             if(H5S_select_copy(chunk_info->mspace,chunk_info->fspace,FALSE) < 0)
                 HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "unable to copy selection")
 
-            /* Compensate for the chunk offset */
-            for(u=0; u<fm->f_ndims; u++) {
-                H5_CHECK_OVERFLOW(chunk_info->coords[u],hsize_t,hssize_t);
-                chunk_adjust[u]=adjust[u]-(hssize_t)chunk_info->coords[u]; /*lint !e771 The adjust array will always be initialized */
+            /* Compute the adjustment for this chunk */
+            for(u = 0; u < fm->f_ndims; u++) {
+                hsize_t coords[H5O_LAYOUT_NDIMS];   /* Current coordinates of chunk */
+
+                /* Compute the chunk coordinates from the scaled coordinates */
+                coords[u] = chunk_info->scaled[u] * fm->layout->u.chunk.dim[u];
+
+                /* Compensate for the chunk offset */
+                H5_CHECK_OVERFLOW(coords[u], hsize_t, hssize_t);
+                chunk_adjust[u] = adjust[u] - (hssize_t)coords[u]; /*lint !e771 The adjust array will always be initialized */
             } /* end for */
 
             /* Adjust the selection */
@@ -1513,14 +1600,14 @@ H5D__chunk_file_cb(void H5_ATTR_UNUSED *elem, const H5T_t H5_ATTR_UNUSED *type,
     H5D_chunk_info_t *chunk_info;               /* Chunk information for current chunk */
     hsize_t     coords_in_chunk[H5O_LAYOUT_NDIMS];        /* Coordinates of element in chunk */
     hsize_t     chunk_index;                    /* Chunk index */
+    hsize_t     scaled[H5S_MAX_RANK];	        /* Scaled coordinates for this chunk */
     unsigned    u;                              /* Local index variable */
     herr_t	ret_value = SUCCEED;            /* Return value		*/
 
     FUNC_ENTER_STATIC
 
     /* Calculate the index of this chunk */
-    if(H5VM_chunk_index(ndims, coords, fm->layout->u.chunk.dim, fm->layout->u.chunk.down_chunks, &chunk_index) < 0)
-        HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index")
+    chunk_index = H5VM_chunk_index_scaled(ndims, coords, fm->layout->u.chunk.dim, fm->layout->u.chunk.down_chunks, scaled);
 
     /* Find correct chunk in file & memory skip list */
     if(chunk_index==fm->last_index) {
@@ -1570,12 +1657,10 @@ H5D__chunk_file_cb(void H5_ATTR_UNUSED *elem, const H5T_t H5_ATTR_UNUSED *type,
             /* Set the number of selected elements in chunk to zero */
             chunk_info->chunk_points = 0;
 
-            /* Compute the chunk's coordinates */
-            for(u = 0; u < fm->f_ndims; u++) {
-                H5_CHECK_OVERFLOW(fm->layout->u.chunk.dim[u], hsize_t, hssize_t);
-                chunk_info->coords[u] = (coords[u] / (hssize_t)fm->layout->u.chunk.dim[u]) * (hssize_t)fm->layout->u.chunk.dim[u];
-            } /* end for */
-            chunk_info->coords[fm->f_ndims] = 0;
+            /* Set the chunk's scaled coordinates */
+            HDmemcpy(chunk_info->scaled, scaled, sizeof(hsize_t) * fm->f_ndims);
+            chunk_info->scaled[fm->f_ndims] = 0;
+            HDmemcpy(chunk_info->scaled, scaled, sizeof(hsize_t) * fm->f_ndims);
 
             /* Insert the new chunk into the skip list */
             if(H5SL_insert(fm->sel_chunks,chunk_info,&chunk_info->index) < 0) {
@@ -1597,7 +1682,7 @@ H5D__chunk_file_cb(void H5_ATTR_UNUSED *elem, const H5T_t H5_ATTR_UNUSED *type,
 
     /* Get the offset of the element within the chunk */
     for(u = 0; u < fm->f_ndims; u++)
-        coords_in_chunk[u] = coords[u] - chunk_info->coords[u];
+        coords_in_chunk[u] = coords[u] - (scaled[u] * fm->layout->u.chunk.dim[u]);
 
     /* Add point to file selection for chunk */
     if(H5S_select_elements(chunk_info->fspace, H5S_SELECT_APPEND, (size_t)1, coords_in_chunk) < 0)
@@ -1624,7 +1709,6 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
 H5D__chunk_mem_cb(void H5_ATTR_UNUSED *elem, const H5T_t H5_ATTR_UNUSED *type, unsigned ndims, const hsize_t *coords, void *_fm)
 {
@@ -1637,8 +1721,7 @@ H5D__chunk_mem_cb(void H5_ATTR_UNUSED *elem, const H5T_t H5_ATTR_UNUSED *type, u
     FUNC_ENTER_STATIC
 
     /* Calculate the index of this chunk */
-    if(H5VM_chunk_index(ndims, coords, fm->layout->u.chunk.dim, fm->layout->u.chunk.down_chunks, &chunk_index) < 0)
-        HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index")
+    chunk_index = H5VM_chunk_index(ndims, coords, fm->layout->u.chunk.dim, fm->layout->u.chunk.down_chunks);
 
     /* Find correct chunk in file & memory skip list */
     if(chunk_index == fm->last_index) {
@@ -1707,6 +1790,7 @@ htri_t
 H5D__chunk_cacheable(const H5D_io_info_t *io_info, haddr_t caddr, hbool_t write_op)
 {
     const H5D_t *dataset = io_info->dset; /* Local pointer to dataset info */
+    hbool_t no_filters = TRUE;
     htri_t ret_value = FAIL;            /* Return value */
 
     FUNC_ENTER_PACKAGE
@@ -1714,10 +1798,22 @@ H5D__chunk_cacheable(const H5D_io_info_t *io_info, haddr_t caddr, hbool_t write_
     HDassert(io_info);
     HDassert(dataset);
 
-    /* Must bring the whole chunk in if there are any filters */
-    if(dataset->shared->dcpl_cache.pline.nused > 0)
-        ret_value = TRUE;
-    else {
+    /* Must bring the whole chunk in if there are any filters on the chunk.
+     * Make sure to check if filters are on the dataset but disabled for the
+     * chunk because it is a partial edge chunk. */
+    if(dataset->shared->dcpl_cache.pline.nused > 0) {
+        if(dataset->shared->layout.u.chunk.flags
+                & H5O_LAYOUT_CHUNK_DONT_FILTER_PARTIAL_BOUND_CHUNKS) {
+            no_filters = H5D__chunk_is_partial_edge_chunk(
+                    io_info->store->chunk.scaled, io_info->dset->shared->ndims,
+                    io_info->dset->shared->curr_dims, 
+                    io_info->dset->shared->layout.u.chunk.dim);
+        } /* end if */
+        else
+            no_filters = FALSE;
+    } /* end if */
+
+    if(no_filters) {
 #ifdef H5_HAVE_PARALLEL
          /* If MPI based VFD is used and the file is opened for write access, must
           *         bypass the chunk-cache scheme because other MPI processes could
@@ -1758,7 +1854,9 @@ H5D__chunk_cacheable(const H5D_io_info_t *io_info, haddr_t caddr, hbool_t write_
 #ifdef H5_HAVE_PARALLEL
         } /* end else */
 #endif /* H5_HAVE_PARALLEL */
-    } /* end else */
+    } /* end if */
+    else
+        ret_value = TRUE;
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -1843,35 +1941,41 @@ H5D__chunk_read(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
     chunk_node = H5D_CHUNK_GET_FIRST_NODE(fm);
     while(chunk_node) {
         H5D_chunk_info_t *chunk_info;   /* Chunk information */
-        H5D_io_info_t *chk_io_info;     /* Pointer to I/O info object for this chunk */
-        void *chunk;                    /* Pointer to locked chunk buffer */
-        H5D_chunk_ud_t udata;		/* B-tree pass-through	*/
-        htri_t cacheable;               /* Whether the chunk is cacheable */
+        H5D_chunk_ud_t udata;		/* Chunk index pass-through	*/
 
         /* Get the actual chunk information from the skip list node */
         chunk_info = H5D_CHUNK_GET_NODE_INFO(fm, chunk_node);
 
         /* Get the info for the chunk in the file */
-        if(H5D__chunk_lookup(io_info->dset, io_info->dxpl_id, chunk_info->coords, chunk_info->index, &udata) < 0)
+        if(H5D__chunk_lookup(io_info->dset, io_info->dxpl_id, chunk_info->scaled, &udata) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error looking up chunk address")
 
+        /* Sanity check */
+        HDassert((H5F_addr_defined(udata.chunk_block.offset) && udata.chunk_block.length > 0) || 
+                (!H5F_addr_defined(udata.chunk_block.offset) && udata.chunk_block.length == 0));
+
         /* Check for non-existant chunk & skip it if appropriate */
-        if(H5F_addr_defined(udata.addr) || UINT_MAX != udata.idx_hint
+        if(H5F_addr_defined(udata.chunk_block.offset) || UINT_MAX != udata.idx_hint
                 || !skip_missing_chunks) {
-            /* Load the chunk into cache and lock it. */
-            if((cacheable = H5D__chunk_cacheable(io_info, udata.addr, FALSE)) < 0)
+            H5D_io_info_t *chk_io_info;     /* Pointer to I/O info object for this chunk */
+            void *chunk = NULL;             /* Pointer to locked chunk buffer */
+            htri_t cacheable;               /* Whether the chunk is cacheable */
+
+	    /* Set chunk's [scaled] coordinates */
+	    io_info->store->chunk.scaled = chunk_info->scaled;
+
+            /* Determine if we should use the chunk cache */
+            if((cacheable = H5D__chunk_cacheable(io_info, udata.chunk_block.offset, FALSE)) < 0)
                 HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't tell if chunk is cacheable")
             if(cacheable) {
-                /* Pass in chunk's coordinates in a union. */
-                io_info->store->chunk.offset = chunk_info->coords;
-                io_info->store->chunk.index = chunk_info->index;
+                /* Load the chunk into cache and lock it. */
 
                 /* Compute # of bytes accessed in chunk */
                 H5_CHECK_OVERFLOW(type_info->src_type_size, /*From:*/ size_t, /*To:*/ uint32_t);
                 src_accessed_bytes = chunk_info->chunk_points * (uint32_t)type_info->src_type_size;
 
                 /* Lock the chunk into the cache */
-                if(NULL == (chunk = H5D__chunk_lock(io_info, &udata, FALSE)))
+                if(NULL == (chunk = H5D__chunk_lock(io_info, &udata, FALSE, FALSE)))
                     HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to read raw data chunk")
 
                 /* Set up the storage buffer information for this chunk */
@@ -1880,20 +1984,14 @@ H5D__chunk_read(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
                 /* Point I/O info at contiguous I/O info for this chunk */
                 chk_io_info = &cpt_io_info;
             } /* end if */
-            else if(H5F_addr_defined(udata.addr)) {
+            else if(H5F_addr_defined(udata.chunk_block.offset)) {
                 /* Set up the storage address information for this chunk */
-                ctg_store.contig.dset_addr = udata.addr;
-
-                /* No chunk cached */
-                chunk = NULL;
+                ctg_store.contig.dset_addr = udata.chunk_block.offset;
 
                 /* Point I/O info at temporary I/O info for this chunk */
                 chk_io_info = &ctg_io_info;
             } /* end else if */
             else {
-                /* No chunk cached */
-                chunk = NULL;
-
                 /* Point I/O info at "nonexistent" I/O info for this chunk */
                 chk_io_info = &nonexistent_io_info;
             } /* end else */
@@ -1971,38 +2069,47 @@ H5D__chunk_write(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
     chunk_node = H5D_CHUNK_GET_FIRST_NODE(fm);
     while(chunk_node) {
         H5D_chunk_info_t *chunk_info;   /* Chunk information */
+	H5D_chk_idx_info_t idx_info;    /* Chunked index info */
         H5D_io_info_t *chk_io_info;     /* Pointer to I/O info object for this chunk */
         void *chunk;                    /* Pointer to locked chunk buffer */
         H5D_chunk_ud_t udata;		/* Index pass-through	*/
         htri_t cacheable;               /* Whether the chunk is cacheable */
+        hbool_t need_insert = FALSE;    /* Whether the chunk needs to be inserted into the index */
 
         /* Get the actual chunk information from the skip list node */
         chunk_info = H5D_CHUNK_GET_NODE_INFO(fm, chunk_node);
 
-        /* Load the chunk into cache.  But if the whole chunk is written,
-         * simply allocate space instead of load the chunk. */
-        if(H5D__chunk_lookup(io_info->dset, io_info->dxpl_id, chunk_info->coords, chunk_info->index, &udata) < 0)
+        /* Look up the chunk */
+        if(H5D__chunk_lookup(io_info->dset, io_info->dxpl_id, chunk_info->scaled, &udata) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error looking up chunk address")
-        if((cacheable = H5D__chunk_cacheable(io_info, udata.addr, TRUE)) < 0)
+
+        /* Sanity check */
+        HDassert((H5F_addr_defined(udata.chunk_block.offset) && udata.chunk_block.length > 0) || 
+                (!H5F_addr_defined(udata.chunk_block.offset) && udata.chunk_block.length == 0));
+
+	/* Set chunk's [scaled] coordinates */
+	io_info->store->chunk.scaled = chunk_info->scaled;
+
+        /* Determine if we should use the chunk cache */
+        if((cacheable = H5D__chunk_cacheable(io_info, udata.chunk_block.offset, TRUE)) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't tell if chunk is cacheable")
         if(cacheable) {
+            /* Load the chunk into cache.  But if the whole chunk is written,
+             * simply allocate space instead of load the chunk. */
             hbool_t entire_chunk = TRUE;       /* Whether whole chunk is selected */
 
-            /* Pass in chunk's coordinates in a union. */
-            io_info->store->chunk.offset = chunk_info->coords;
-            io_info->store->chunk.index = chunk_info->index;
-
             /* Compute # of bytes accessed in chunk */
             H5_CHECK_OVERFLOW(type_info->dst_type_size, /*From:*/ size_t, /*To:*/ uint32_t);
             dst_accessed_bytes = chunk_info->chunk_points * (uint32_t)type_info->dst_type_size;
 
             /* Determine if we will access all the data in the chunk */
             if(dst_accessed_bytes != ctg_store.contig.dset_size ||
-                    (chunk_info->chunk_points * type_info->src_type_size) != ctg_store.contig.dset_size)
+                    (chunk_info->chunk_points * type_info->src_type_size) != ctg_store.contig.dset_size ||
+		    fm->fsel_type == H5S_SEL_POINTS)
                 entire_chunk = FALSE;
 
             /* Lock the chunk into the cache */
-            if(NULL == (chunk = H5D__chunk_lock(io_info, &udata, entire_chunk)))
+            if(NULL == (chunk = H5D__chunk_lock(io_info, &udata, entire_chunk, FALSE)))
                 HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to read raw data chunk")
 
             /* Set up the storage buffer information for this chunk */
@@ -2013,9 +2120,7 @@ H5D__chunk_write(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
         } /* end if */
         else {
             /* If the chunk hasn't been allocated on disk, do so now. */
-            if(!H5F_addr_defined(udata.addr)) {
-                H5D_chk_idx_info_t idx_info;        /* Chunked index info */
-
+            if(!H5F_addr_defined(udata.chunk_block.offset)) {
                 /* Compose chunked index info struct */
                 idx_info.f = io_info->dset->oloc.file;
                 idx_info.dxpl_id = io_info->dxpl_id;
@@ -2024,14 +2129,14 @@ H5D__chunk_write(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
                 idx_info.storage = &(io_info->dset->shared->layout.storage.u.chunk);
 
                 /* Set up the size of chunk for user data */
-                udata.nbytes = io_info->dset->shared->layout.u.chunk.size;
+                udata.chunk_block.length = io_info->dset->shared->layout.u.chunk.size;
 
-                /* Create the chunk */
-                if((io_info->dset->shared->layout.storage.u.chunk.ops->insert)(&idx_info, &udata) < 0)
-                    HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert/resize chunk")
+                /* Allocate the chunk */
+		if(H5D__chunk_file_alloc(&idx_info, NULL, &udata.chunk_block, &need_insert, &udata.need_modify, chunk_info->scaled) < 0)
+		    HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert/resize chunk on chunk level")
 
                 /* Make sure the address of the chunk is returned. */
-                if(!H5F_addr_defined(udata.addr))
+                if(!H5F_addr_defined(udata.chunk_block.offset))
                     HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "chunk address isn't defined")
 
                 /* Cache the new chunk information */
@@ -2039,7 +2144,7 @@ H5D__chunk_write(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
             } /* end if */
 
             /* Set up the storage address information for this chunk */
-            ctg_store.contig.dset_addr = udata.addr;
+            ctg_store.contig.dset_addr = udata.chunk_block.offset;
 
             /* No chunk cached */
             chunk = NULL;
@@ -2053,9 +2158,16 @@ H5D__chunk_write(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
                 (hsize_t)chunk_info->chunk_points, chunk_info->fspace, chunk_info->mspace) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "chunked write failed")
 
-        /* Release the cache lock on the chunk. */
-        if(chunk && H5D__chunk_unlock(io_info, &udata, TRUE, chunk, dst_accessed_bytes) < 0)
-            HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to unlock raw data chunk")
+	/* Release the cache lock on the chunk, or insert chunk into index. */
+	if(chunk) {
+	    if(H5D__chunk_unlock(io_info, &udata, TRUE, chunk, dst_accessed_bytes) < 0)
+		HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to unlock raw data chunk")
+	} /* end if */
+	else {
+            if((need_insert || udata.need_modify) && io_info->dset->shared->layout.storage.u.chunk.ops->insert)
+                if((io_info->dset->shared->layout.storage.u.chunk.ops->insert)(&idx_info, &udata, NULL) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert chunk addr into index")
+	} /* end else */
 
         /* Advance to next chunk in list */
         chunk_node = H5D_CHUNK_GET_NEXT_NODE(fm, chunk_node);
@@ -2094,10 +2206,6 @@ H5D__chunk_flush(H5D_t *dset, hid_t dxpl_id)
     /* Sanity check */
     HDassert(dset);
 
-    /* Flush any data caught in sieve buffer */
-    if(H5D__flush_sieve_buf(dset, dxpl_id) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTFLUSH, FAIL, "unable to flush sieve buffer")
-
     /* Fill the DXPL cache values for later use */
     if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
@@ -2168,6 +2276,74 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_dest
+ *
+ * Purpose:	Destroy the entire chunk cache by flushing dirty entries,
+ *		preempting all entries, and freeing the cache itself.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *              Thursday, May 21, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__chunk_dest(H5D_t *dset, hid_t dxpl_id)
+{
+    H5D_chk_idx_info_t idx_info;        /* Chunked index info */
+    H5D_dxpl_cache_t _dxpl_cache;       /* Data transfer property cache buffer */
+    H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
+    H5D_rdcc_t	*rdcc = &(dset->shared->cache.chunk);   /* Dataset's chunk cache */
+    H5D_rdcc_ent_t	*ent = NULL, *next = NULL;      /* Pointer to current & next cache entries */
+    int		nerrors = 0;            /* Accumulated count of errors */
+    H5O_storage_chunk_t *sc = &(dset->shared->layout.storage.u.chunk);
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_STATIC_TAG(dxpl_id, dset->oloc.addr, FAIL)
+
+    /* Sanity checks */
+    HDassert(dset);
+    H5D_CHUNK_STORAGE_INDEX_CHK(sc);
+
+    /* Fill the DXPL cache values for later use */
+    if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
+        nerrors++;
+
+    /* Flush all the cached chunks */
+    for(ent = rdcc->head; ent; ent = next) {
+	next = ent->next;
+	if(H5D__chunk_cache_evict(dset, dxpl_id, dxpl_cache, ent, TRUE) < 0)
+	    nerrors++;
+    } /* end for */
+    
+    /* Continue even if there are failures. */
+    if(nerrors)
+	HDONE_ERROR(H5E_IO, H5E_CANTFLUSH, FAIL, "unable to flush one or more raw data chunks")
+
+    /* Release cache structures */
+    if(rdcc->slot)
+        rdcc->slot = H5FL_SEQ_FREE(H5D_rdcc_ent_ptr_t, rdcc->slot);
+    HDmemset(rdcc, 0, sizeof(H5D_rdcc_t));
+
+    /* Compose chunked index info struct */
+    idx_info.f = dset->oloc.file;
+    idx_info.dxpl_id = dxpl_id;
+    idx_info.pline = &dset->shared->dcpl_cache.pline;
+    idx_info.layout = &dset->shared->layout.u.chunk;
+    idx_info.storage = &dset->shared->layout.storage.u.chunk;
+
+    /* Free any index structures */
+    if(dset->shared->layout.storage.u.chunk.ops->dest &&
+            (dset->shared->layout.storage.u.chunk.ops->dest)(&idx_info) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to release chunk index info")
+
+done:
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* end H5D__chunk_dest() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5D_chunk_idx_reset
  *
  * Purpose:	Reset index information
@@ -2189,6 +2365,7 @@ H5D_chunk_idx_reset(H5O_storage_chunk_t *storage, hbool_t reset_addr)
     /* Sanity checks */
     HDassert(storage);
     HDassert(storage->ops);
+    H5D_CHUNK_STORAGE_INDEX_CHK(storage);
 
     /* Reset index structures */
     if((storage->ops->reset)(storage, reset_addr) < 0)
@@ -2211,7 +2388,7 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-herr_t
+static herr_t
 H5D__chunk_cinfo_cache_reset(H5D_chunk_cached_t *last)
 {
     FUNC_ENTER_PACKAGE_NOERR
@@ -2247,14 +2424,14 @@ H5D__chunk_cinfo_cache_update(H5D_chunk_cached_t *last, const H5D_chunk_ud_t *ud
     HDassert(last);
     HDassert(udata);
     HDassert(udata->common.layout);
-    HDassert(udata->common.storage);
-    HDassert(udata->common.offset);
+    HDassert(udata->common.scaled);
 
     /* Stored the information to cache */
-    HDmemcpy(last->offset, udata->common.offset, sizeof(hsize_t) * udata->common.layout->ndims);
-    last->nbytes = udata->nbytes;
+    HDmemcpy(last->scaled, udata->common.scaled, sizeof(hsize_t) * udata->common.layout->ndims);
+    last->addr = udata->chunk_block.offset;
+    H5_CHECKED_ASSIGN(last->nbytes, uint32_t, udata->chunk_block.length, hsize_t);
+    last->chunk_idx = udata->chunk_idx;
     last->filter_mask = udata->filter_mask;
-    last->addr = udata->addr;
 
     /* Indicate that the cached info is valid */
     last->valid = TRUE;
@@ -2286,22 +2463,22 @@ H5D__chunk_cinfo_cache_found(const H5D_chunk_cached_t *last, H5D_chunk_ud_t *uda
     HDassert(last);
     HDassert(udata);
     HDassert(udata->common.layout);
-    HDassert(udata->common.storage);
-    HDassert(udata->common.offset);
+    HDassert(udata->common.scaled);
 
     /* Check if the cached information is what is desired */
     if(last->valid) {
         unsigned    u;                      /* Local index variable */
 
-        /* Check that the offset is the same */
+        /* Check that the scaled offset is the same */
         for(u = 0; u < udata->common.layout->ndims; u++)
-            if(last->offset[u] != udata->common.offset[u])
+            if(last->scaled[u] != udata->common.scaled[u])
                 HGOTO_DONE(FALSE)
 
         /* Retrieve the information from the cache */
-        udata->nbytes = last->nbytes;
+        udata->chunk_block.offset = last->addr;
+        udata->chunk_block.length = last->nbytes;
+	udata->chunk_idx = last->chunk_idx;
         udata->filter_mask = last->filter_mask;
-        udata->addr = last->addr;
 
         /* Indicate that the data was found */
         HGOTO_DONE(TRUE)
@@ -2331,6 +2508,7 @@ herr_t
 H5D__chunk_create(const H5D_t *dset /*in,out*/, hid_t dxpl_id)
 {
     H5D_chk_idx_info_t idx_info;        /* Chunked index info */
+    H5O_storage_chunk_t *sc = &(dset->shared->layout.storage.u.chunk);
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_PACKAGE
@@ -2339,6 +2517,8 @@ H5D__chunk_create(const H5D_t *dset /*in,out*/, hid_t dxpl_id)
     HDassert(dset);
     HDassert(H5D_CHUNKED == dset->shared->layout.type);
     HDassert(dset->shared->layout.u.chunk.ndims > 0 && dset->shared->layout.u.chunk.ndims <= H5O_LAYOUT_NDIMS);
+    H5D_CHUNK_STORAGE_INDEX_CHK(sc);
+
 #ifndef NDEBUG
 {
     unsigned u;                         /* Local index variable */
@@ -2365,6 +2545,53 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5D__chunk_hash_val
+ *
+ * Purpose:	To calculate an index based on the dataset's scaled coordinates and
+ *		sizes of the faster dimensions.
+ *
+ * Return:	Hash value index
+ *
+ * Programmer:	Vailin Choi; Nov 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+H5D__chunk_hash_val(const H5D_shared_t *shared, const hsize_t *scaled)
+{
+    hsize_t val;        /* Intermediate value */
+    unsigned ndims = shared->ndims;      /* Rank of dataset */
+    unsigned ret = 0;   /* Value to return */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(shared);
+    HDassert(scaled);
+
+    /* If the fastest changing dimension doesn't have enough entropy, use
+     *  other dimensions too
+     */
+    if(ndims > 1 && shared->cache.chunk.scaled_dims[ndims - 1] <= shared->cache.chunk.nslots) {
+        unsigned u;          /* Local index variable */
+
+        val = scaled[0];
+        for(u = 1; u < ndims; u++) {
+            val <<= shared->cache.chunk.scaled_encode_bits[u];
+            val ^= scaled[u];
+        } /* end for */
+    } /* end if */
+    else
+        val = scaled[ndims - 1];
+
+    /* Modulo value against the number of array slots */
+    ret = (unsigned)(val % shared->cache.chunk.nslots);
+
+    FUNC_LEAVE_NOAPI(ret)
+} /* H5D__chunk_hash_val() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5D__chunk_lookup
  *
  * Purpose:	Loops up a chunk in cache and on disk, and retrieves
@@ -2378,49 +2605,54 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5D__chunk_lookup(const H5D_t *dset, hid_t dxpl_id, const hsize_t *chunk_offset,
-    hsize_t chunk_idx, H5D_chunk_ud_t *udata)
+H5D__chunk_lookup(const H5D_t *dset, hid_t dxpl_id, const hsize_t *scaled,
+    H5D_chunk_ud_t *udata)
 {
     H5D_rdcc_ent_t  *ent = NULL;        /* Cache entry */
     hbool_t         found = FALSE;      /* In cache? */
     unsigned        u;                  /* Counter */
+    H5O_storage_chunk_t *sc = &(dset->shared->layout.storage.u.chunk);
     herr_t	ret_value = SUCCEED;	/* Return value */
 
     FUNC_ENTER_PACKAGE
 
     HDassert(dset);
     HDassert(dset->shared->layout.u.chunk.ndims > 0);
-    HDassert(chunk_offset);
+    H5D_CHUNK_STORAGE_INDEX_CHK(sc);
+    HDassert(scaled);
     HDassert(udata);
 
     /* Initialize the query information about the chunk we are looking for */
     udata->common.layout = &(dset->shared->layout.u.chunk);
     udata->common.storage = &(dset->shared->layout.storage.u.chunk);
-    udata->common.offset = chunk_offset;
-    udata->common.rdcc = &(dset->shared->cache.chunk);
+    udata->common.scaled =  scaled;
 
     /* Reset information about the chunk we are looking for */
-    udata->nbytes = 0;
+    udata->chunk_block.offset = HADDR_UNDEF;
+    udata->chunk_block.length = 0;
     udata->filter_mask = 0;
-    udata->addr = HADDR_UNDEF;
+    udata->new_unfilt_chunk = FALSE;
+    udata->need_modify = FALSE;
 
     /* Check for chunk in cache */
     if(dset->shared->cache.chunk.nslots > 0) {
-        udata->idx_hint = H5D_CHUNK_HASH(dset->shared, chunk_idx);
+	udata->idx_hint = H5D__chunk_hash_val(dset->shared, scaled);
         ent = dset->shared->cache.chunk.slot[udata->idx_hint];
 
         if(ent)
-            for(u = 0, found = TRUE; u < dset->shared->layout.u.chunk.ndims - 1;
-                    u++)
-                if(chunk_offset[u] != ent->offset[u]) {
+            for(u = 0, found = TRUE; u < dset->shared->ndims; u++)
+                if(scaled[u] != ent->scaled[u]) {
                     found = FALSE;
                     break;
                 } /* end if */
     } /* end if */
 
     /* Find chunk addr */
-    if(found)
-        udata->addr = ent->chunk_addr;
+    if(found) {
+        udata->chunk_block.offset = ent->chunk_block.offset;
+        udata->chunk_block.length = ent->chunk_block.length;;
+	udata->chunk_idx = ent->chunk_idx;
+    } /* end if */
     else {
         /* Invalidate idx_hint, to signal that the chunk is not in cache */
         udata->idx_hint = UINT_MAX;
@@ -2471,33 +2703,39 @@ H5D__chunk_flush_entry(const H5D_t *dset, hid_t dxpl_id, const H5D_dxpl_cache_t
 {
     void	*buf = NULL;	        /* Temporary buffer		*/
     hbool_t	point_of_no_return = FALSE;
+    H5O_storage_chunk_t *sc = &(dset->shared->layout.storage.u.chunk);
     herr_t	ret_value = SUCCEED;	/* Return value			*/
 
-    FUNC_ENTER_STATIC
+    FUNC_ENTER_STATIC_TAG(dxpl_id, dset->oloc.addr, FAIL)
 
     HDassert(dset);
     HDassert(dset->shared);
+    H5D_CHUNK_STORAGE_INDEX_CHK(sc);
     HDassert(dxpl_cache);
     HDassert(ent);
     HDassert(!ent->locked);
 
     buf = ent->chunk;
-    if(ent->dirty && !ent->deleted) {
+    if(ent->dirty) {
+	H5D_chk_idx_info_t idx_info;    /* Chunked index info */
         H5D_chunk_ud_t 	udata;		/* pass through B-tree		*/
-        hbool_t must_insert = FALSE;    /* Whether the chunk must go through the "insert" method */
+        hbool_t must_alloc = FALSE;     /* Whether the chunk must be allocated */
+	hbool_t need_insert = FALSE;    /* Whether the chunk needs to be inserted into the index */
 
         /* Set up user data for index callbacks */
         udata.common.layout = &dset->shared->layout.u.chunk;
         udata.common.storage = &dset->shared->layout.storage.u.chunk;
-        udata.common.offset = ent->offset;
-        udata.common.rdcc = &(dset->shared->cache.chunk);
+	udata.common.scaled = ent->scaled;
+        udata.chunk_block.offset = ent->chunk_block.offset;
+        udata.chunk_block.length = dset->shared->layout.u.chunk.size;
         udata.filter_mask = 0;
-        udata.nbytes = dset->shared->layout.u.chunk.size;
-        udata.addr = ent->chunk_addr;
+	udata.chunk_idx = ent->chunk_idx;
+	udata.need_modify = FALSE;
 
         /* Should the chunk be filtered before writing it to disk? */
-        if(dset->shared->dcpl_cache.pline.nused) {
-            size_t alloc = udata.nbytes;        /* Bytes allocated for BUF	*/
+        if(dset->shared->dcpl_cache.pline.nused
+                && !(ent->edge_chunk_state & H5D_RDCC_DISABLE_FILTERS)) {
+            size_t alloc = udata.chunk_block.length;        /* Bytes allocated for BUF	*/
             size_t nbytes;                      /* Chunk size (in bytes) */
 
             if(!reset) {
@@ -2506,10 +2744,9 @@ H5D__chunk_flush_entry(const H5D_t *dset, hid_t dxpl_id, const H5D_dxpl_cache_t
                  * the pipeline because we'll want to save the original buffer
                  * for later.
                  */
-                H5_CHECKED_ASSIGN(alloc, size_t, udata.nbytes, uint32_t);
                 if(NULL == (buf = H5MM_malloc(alloc)))
                     HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for pipeline")
-                HDmemcpy(buf, ent->chunk, udata.nbytes);
+                HDmemcpy(buf, ent->chunk, alloc);
             } /* end if */
             else {
                 /*
@@ -2522,7 +2759,7 @@ H5D__chunk_flush_entry(const H5D_t *dset, hid_t dxpl_id, const H5D_dxpl_cache_t
                 point_of_no_return = TRUE;
                 ent->chunk = NULL;
             } /* end else */
-            H5_CHECKED_ASSIGN(nbytes, size_t, udata.nbytes, uint32_t);
+            H5_CHECKED_ASSIGN(nbytes, size_t, udata.chunk_block.length, hsize_t);
             if(H5Z_pipeline(&(dset->shared->dcpl_cache.pline), 0, &(udata.filter_mask), dxpl_cache->err_detect,
                      dxpl_cache->filter_cb, &nbytes, &alloc, &buf) < 0)
                 HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, FAIL, "output pipeline failed")
@@ -2531,21 +2768,36 @@ H5D__chunk_flush_entry(const H5D_t *dset, hid_t dxpl_id, const H5D_dxpl_cache_t
             if(nbytes > ((size_t)0xffffffff))
                 HGOTO_ERROR(H5E_DATASET, H5E_BADRANGE, FAIL, "chunk too large for 32-bit length")
 #endif /* H5_SIZEOF_SIZE_T > 4 */
-            H5_CHECKED_ASSIGN(udata.nbytes, uint32_t, nbytes, size_t);
+            H5_CHECKED_ASSIGN(udata.chunk_block.length, hsize_t, nbytes, size_t);
 
-            /* Indicate that the chunk must go through 'insert' method */
-            must_insert = TRUE;
+            /* Indicate that the chunk must be allocated */
+            must_alloc = TRUE;
         } /* end if */
-        else if(!H5F_addr_defined(udata.addr))
-            /* Indicate that the chunk must go through 'insert' method */
-            must_insert = TRUE;
+        else if(!H5F_addr_defined(udata.chunk_block.offset)) {
+            /* Indicate that the chunk must be allocated */
+            must_alloc = TRUE;
 
-        /* Check if the chunk needs to be 'inserted' (could exist already and
-         *      the 'insert' operation could resize it)
-         */
-        if(must_insert) {
-            H5D_chk_idx_info_t idx_info;        /* Chunked index info */
+            /* This flag could be set for this chunk, just remove and ignore it
+             */
+            ent->edge_chunk_state &= ~H5D_RDCC_NEWLY_DISABLED_FILTERS;
+        } /* end else */
+        else if(ent->edge_chunk_state & H5D_RDCC_NEWLY_DISABLED_FILTERS) {
+            /* Chunk on disk is still filtered, must insert to allocate correct
+             * size */
+            must_alloc = TRUE;
+
+            /* Set the disable filters field back to the standard disable
+             * filters setting, as it no longer needs to be inserted with every
+             * flush */
+            ent->edge_chunk_state &= ~H5D_RDCC_NEWLY_DISABLED_FILTERS;
+        } /* end else */
+
+        HDassert(!(ent->edge_chunk_state & H5D_RDCC_NEWLY_DISABLED_FILTERS));
 
+        /* Check if the chunk needs to be allocated (it also could exist already
+         *      and the chunk alloc operation could resize it)
+         */
+        if(must_alloc) {
             /* Compose chunked index info struct */
             idx_info.f = dset->oloc.file;
             idx_info.dxpl_id = dxpl_id;
@@ -2556,18 +2808,25 @@ H5D__chunk_flush_entry(const H5D_t *dset, hid_t dxpl_id, const H5D_dxpl_cache_t
             /* Create the chunk it if it doesn't exist, or reallocate the chunk
              *  if its size changed.
              */
-            if((dset->shared->layout.storage.u.chunk.ops->insert)(&idx_info, &udata) < 0)
-                HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert/resize chunk")
+	    if(H5D__chunk_file_alloc(&idx_info, &(ent->chunk_block), &udata.chunk_block, &need_insert, &udata.need_modify, ent->scaled) < 0)
+		HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert/resize chunk on chunk level")
 
-            /* Update the chunk entry's address, in case it was allocated or relocated */
-            ent->chunk_addr = udata.addr;
+            /* Update the chunk entry's info, in case it was allocated or relocated */
+            ent->chunk_block.offset = udata.chunk_block.offset;
+            ent->chunk_block.length = udata.chunk_block.length;
         } /* end if */
 
         /* Write the data to the file */
-        HDassert(H5F_addr_defined(udata.addr));
-        if(H5F_block_write(dset->oloc.file, H5FD_MEM_DRAW, udata.addr, udata.nbytes, dxpl_id, buf) < 0)
+        HDassert(H5F_addr_defined(udata.chunk_block.offset));
+        H5_CHECK_OVERFLOW(udata.chunk_block.length, hsize_t, size_t);
+        if(H5F_block_write(dset->oloc.file, H5FD_MEM_DRAW, udata.chunk_block.offset, (size_t)udata.chunk_block.length, dxpl_id, buf) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to write raw data to file")
 
+        /* Insert the chunk record into the index */
+	if((need_insert || udata.need_modify) && dset->shared->layout.storage.u.chunk.ops->insert)
+            if((dset->shared->layout.storage.u.chunk.ops->insert)(&idx_info, &udata, dset) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert chunk addr into index")
+
         /* Cache the chunk's info, in case it's accessed again shortly */
         H5D__chunk_cinfo_cache_update(&dset->shared->cache.chunk.last, &udata);
 
@@ -2584,7 +2843,9 @@ H5D__chunk_flush_entry(const H5D_t *dset, hid_t dxpl_id, const H5D_dxpl_cache_t
         if(buf == ent->chunk)
             buf = NULL;
         if(ent->chunk != NULL)
-            ent->chunk = (uint8_t *)H5D__chunk_xfree(ent->chunk, &(dset->shared->dcpl_cache.pline));
+            ent->chunk = (uint8_t *)H5D__chunk_mem_xfree(ent->chunk,
+                    ((ent->edge_chunk_state & H5D_RDCC_DISABLE_FILTERS) ? NULL
+                    : &(dset->shared->dcpl_cache.pline)));
     } /* end if */
 
 done:
@@ -2598,12 +2859,13 @@ done:
      * output pipeline failed.  Do not free the entry or remove it from the
      * list.
      */
-    if(ret_value < 0 && point_of_no_return) {
+    if(ret_value < 0 && point_of_no_return)
         if(ent->chunk)
-            ent->chunk = (uint8_t *)H5D__chunk_xfree(ent->chunk, &(dset->shared->dcpl_cache.pline));
-    } /* end if */
+            ent->chunk = (uint8_t *)H5D__chunk_mem_xfree(ent->chunk,
+                    ((ent->edge_chunk_state & H5D_RDCC_DISABLE_FILTERS) ? NULL
+                    : &(dset->shared->dcpl_cache.pline)));
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5D__chunk_flush_entry() */
 
 

@@ -2643,7 +2905,9 @@ H5D__chunk_cache_evict(const H5D_t *dset, hid_t dxpl_id, const H5D_dxpl_cache_t
     else {
         /* Don't flush, just free chunk */
 	if(ent->chunk != NULL)
-	    ent->chunk = (uint8_t *)H5D__chunk_xfree(ent->chunk, &(dset->shared->dcpl_cache.pline));
+	    ent->chunk = (uint8_t *)H5D__chunk_mem_xfree(ent->chunk,
+                    ((ent->edge_chunk_state & H5D_RDCC_DISABLE_FILTERS) ? NULL
+                    : &(dset->shared->dcpl_cache.pline)));
     } /* end else */
 
     /* Unlink from list */
@@ -2657,8 +2921,23 @@ H5D__chunk_cache_evict(const H5D_t *dset, hid_t dxpl_id, const H5D_dxpl_cache_t
 	rdcc->tail = ent->prev;
     ent->prev = ent->next = NULL;
 
+    /* Unlink from temporary list */
+    if(ent->tmp_prev) {
+        HDassert(rdcc->tmp_head->tmp_next);
+        ent->tmp_prev->tmp_next = ent->tmp_next;
+        if(ent->tmp_next) {
+            ent->tmp_next->tmp_prev = ent->tmp_prev;
+            ent->tmp_next = NULL;
+        } /* end if */
+        ent->tmp_prev = NULL;
+    } /* end if */
+    else
+        /* Only clear hash table slot if the chunk was not on the temporary list
+         */
+        rdcc->slot[ent->idx] = NULL;
+
     /* Remove from cache */
-    rdcc->slot[ent->idx] = NULL;
+    HDassert(rdcc->slot[ent->idx] != ent);
     ent->idx = UINT_MAX;
     rdcc->nbytes_used -= dset->shared->layout.u.chunk.size;
     --rdcc->nused;
@@ -2807,20 +3086,21 @@ done:
  */
 void *
 H5D__chunk_lock(const H5D_io_info_t *io_info, H5D_chunk_ud_t *udata,
-    hbool_t relax)
+    hbool_t relax, hbool_t prev_unfilt_chunk)
 {
     const H5D_t         *dset = io_info->dset;  /* Local pointer to the dataset info */
-    const H5O_pline_t   *pline = &(dset->shared->dcpl_cache.pline); /* I/O pipeline info - always equal to the pline passed to H5D__chunk_alloc */
+    const H5O_pline_t   *pline = &(dset->shared->dcpl_cache.pline); /* I/O pipeline info - always equal to the pline passed to H5D__chunk_mem_alloc */
+    const H5O_pline_t   *old_pline = pline;     /* Old pipeline, i.e. pipeline used to read the chunk */
     const H5O_layout_t  *layout = &(dset->shared->layout); /* Dataset layout */
     const H5O_fill_t    *fill = &(dset->shared->dcpl_cache.fill); /* Fill value info */
     H5D_fill_buf_info_t fb_info;                /* Dataset's fill buffer info */
     hbool_t             fb_info_init = FALSE;   /* Whether the fill value buffer has been initialized */
     H5D_rdcc_t		*rdcc = &(dset->shared->cache.chunk); /*raw data chunk cache*/
-    H5D_rdcc_ent_t	*ent = NULL;		/*cache entry		*/
-    haddr_t             chunk_addr = HADDR_UNDEF; /* Address of chunk on disk */
+    H5D_rdcc_ent_t	*ent;		        /*cache entry		*/
     size_t		chunk_size;		/*size of a chunk	*/
+    hbool_t             disable_filters = FALSE; /* Whether to disable filters (when adding to cache) */
     void		*chunk = NULL;		/*the file chunk	*/
-    void		*ret_value;	        /*return value		*/
+    void		*ret_value = NULL;	/* Return value         */
 
     FUNC_ENTER_PACKAGE
 
@@ -2830,6 +3110,8 @@ H5D__chunk_lock(const H5D_io_info_t *io_info, H5D_chunk_ud_t *udata,
     HDassert(udata);
     HDassert(dset);
     HDassert(TRUE == H5P_isa_class(io_info->dxpl_id, H5P_DATASET_XFER));
+    HDassert(!(udata->new_unfilt_chunk && prev_unfilt_chunk));
+    HDassert(!rdcc->tmp_head);
 
     /* Get the chunk's size */
     HDassert(layout->u.chunk.size > 0);
@@ -2849,8 +3131,8 @@ H5D__chunk_lock(const H5D_io_info_t *io_info, H5D_chunk_ud_t *udata,
         unsigned		u;			/*counters		*/
 
         /* Make sure this is the right chunk */
-        for(u = 0; u < layout->u.chunk.ndims; u++)
-            HDassert(io_info->store->chunk.offset[u] == ent->offset[u]);
+        for(u = 0; u < layout->u.chunk.ndims - 1; u++)
+            HDassert(io_info->store->chunk.scaled[u] == ent->scaled[u]);
 }
 #endif /* NDEBUG */
 
@@ -2858,110 +3140,72 @@ H5D__chunk_lock(const H5D_io_info_t *io_info, H5D_chunk_ud_t *udata,
          * Already in the cache.  Count a hit.
          */
         rdcc->stats.nhits++;
-    } /* end if */
-    else if(relax) {
-        /*
-         * Not in the cache, but we're about to overwrite the whole thing
-         * anyway, so just allocate a buffer for it but don't initialize that
-         * buffer with the file contents. Count this as a hit instead of a
-         * miss because we saved ourselves lots of work.
-         */
-        rdcc->stats.nhits++;
 
-        /* Still save the chunk address so the cache stays consistent */
-        chunk_addr = udata->addr;
+        /* Make adjustments if the edge chunk status changed recently */
+        if(pline->nused) {
+            /* If the chunk recently became an unfiltered partial edge chunk
+             * while in cache, we must make some changes to the entry */
+            if(udata->new_unfilt_chunk) {
+                /* If this flag is set then partial chunk filters must be
+                 * disabled, and the chunk must not have previously been a
+                 * partial chunk (with disabled filters) */
+                HDassert(layout->u.chunk.flags
+                    & H5O_LAYOUT_CHUNK_DONT_FILTER_PARTIAL_BOUND_CHUNKS);
+                HDassert(!(ent->edge_chunk_state & H5D_RDCC_DISABLE_FILTERS));
+                HDassert(old_pline->nused);
+
+                /* Disable filters.  Set pline to NULL instead of just the
+                 * default pipeline to make a quick failure more likely if the
+                 * code is changed in an inappropriate/incomplete way. */
+                pline = NULL;
+
+                /* Reallocate the chunk so H5D__chunk_mem_xfree doesn't get confused
+                 */
+                if(NULL == (chunk = H5D__chunk_mem_alloc(chunk_size, pline)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for raw data chunk")
+                HDmemcpy(chunk, ent->chunk, chunk_size);
+                ent->chunk = (uint8_t *)H5D__chunk_mem_xfree(ent->chunk, old_pline);
+                ent->chunk = (uint8_t *)chunk;
+                chunk = NULL;
 
-        if(NULL == (chunk = H5D__chunk_alloc(chunk_size, pline)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for raw data chunk")
+                /* Mark the chunk as having filters disabled as well as "newly
+                 * disabled" so it is inserted on flush */
+                ent->edge_chunk_state |= H5D_RDCC_DISABLE_FILTERS;
+                ent->edge_chunk_state |= H5D_RDCC_NEWLY_DISABLED_FILTERS;
+            } /* end if */
+            else if(prev_unfilt_chunk) {
+                /* If this flag is set then partial chunk filters must be
+                 * disabled, and the chunk must have previously been a partial
+                 * chunk (with disabled filters) */
+                HDassert(layout->u.chunk.flags
+                    & H5O_LAYOUT_CHUNK_DONT_FILTER_PARTIAL_BOUND_CHUNKS);
+                HDassert((ent->edge_chunk_state & H5D_RDCC_DISABLE_FILTERS));
+                HDassert(pline->nused);
+
+                /* Mark the old pipeline as having been disabled */
+                old_pline = NULL;
+
+                /* Reallocate the chunk so H5D__chunk_mem_xfree doesn't get confused
+                 */
+                if(NULL == (chunk = H5D__chunk_mem_alloc(chunk_size, pline)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for raw data chunk")
+                HDmemcpy(chunk, ent->chunk, chunk_size);
 
-        /* In the case that some dataset functions look through this data,
-         * clear it to all 0s. */
-        HDmemset(chunk, 0, chunk_size);
-    } /* end if */
-    else {
-        /*
-         * Not in the cache.  Count this as a miss if it's in the file
-         *      or an init if it isn't.
-         */
+                ent->chunk = (uint8_t *)H5D__chunk_mem_xfree(ent->chunk, old_pline);
+                ent->chunk = (uint8_t *)chunk;
+                chunk = NULL;
 
-        /* Save the chunk address */
-        chunk_addr = udata->addr;
+                /* Mark the chunk as having filters enabled */
+                ent->edge_chunk_state &= ~(H5D_RDCC_DISABLE_FILTERS
+                        | H5D_RDCC_NEWLY_DISABLED_FILTERS);
+            } /* end else */
+        } /* end if */
 
-        /* Check if the chunk exists on disk */
-        if(H5F_addr_defined(chunk_addr)) {
-            size_t		chunk_alloc = 0;		/*allocated chunk size	*/
-
-            /* Chunk size on disk isn't [likely] the same size as the final chunk
-             * size in memory, so allocate memory big enough. */
-            H5_CHECKED_ASSIGN(chunk_alloc, size_t, udata->nbytes, uint32_t);
-            if(NULL == (chunk = H5D__chunk_alloc(chunk_alloc, pline)))
-                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for raw data chunk")
-            if(H5F_block_read(dset->oloc.file, H5FD_MEM_DRAW, chunk_addr, chunk_alloc, io_info->dxpl_id, chunk) < 0)
-                HGOTO_ERROR(H5E_IO, H5E_READERROR, NULL, "unable to read raw data chunk")
-
-            if(pline->nused) {
-                if(H5Z_pipeline(pline, H5Z_FLAG_REVERSE, &(udata->filter_mask), io_info->dxpl_cache->err_detect,
-                        io_info->dxpl_cache->filter_cb, &chunk_alloc, &chunk_alloc, &chunk) < 0)
-                    HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, NULL, "data pipeline read failed")
-                H5_CHECKED_ASSIGN(udata->nbytes, uint32_t, chunk_alloc, size_t);
-            } /* end if */
-
-            /* Increment # of cache misses */
-            rdcc->stats.nmisses++;
-        } /* end if */
-        else {
-            H5D_fill_value_t	fill_status;
-
-            /* Sanity check */
-            HDassert(fill->alloc_time != H5D_ALLOC_TIME_EARLY);
-
-            /* Chunk size on disk isn't [likely] the same size as the final chunk
-             * size in memory, so allocate memory big enough. */
-            if(NULL == (chunk = H5D__chunk_alloc(chunk_size, pline)))
-                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for raw data chunk")
-
-            if(H5P_is_fill_value_defined(fill, &fill_status) < 0)
-                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't tell if fill value defined")
-
-            if(fill->fill_time == H5D_FILL_TIME_ALLOC ||
-                    (fill->fill_time == H5D_FILL_TIME_IFSET &&
-                     (fill_status == H5D_FILL_VALUE_USER_DEFINED ||
-                      fill_status == H5D_FILL_VALUE_DEFAULT))) {
-                /*
-                 * The chunk doesn't exist in the file.  Replicate the fill
-                 * value throughout the chunk, if the fill value is defined.
-                 */
-
-                /* Initialize the fill value buffer */
-                /* (use the compact dataset storage buffer as the fill value buffer) */
-                if(H5D__fill_init(&fb_info, chunk, NULL, NULL, NULL, NULL,
-                        &dset->shared->dcpl_cache.fill, dset->shared->type,
-                        dset->shared->type_id, (size_t)0, chunk_size, io_info->dxpl_id) < 0)
-                    HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "can't initialize fill buffer info")
-                fb_info_init = TRUE;
-
-                /* Check for VL datatype & non-default fill value */
-                if(fb_info.has_vlen_fill_type)
-                    /* Fill the buffer with VL datatype fill values */
-                    if(H5D__fill_refill_vl(&fb_info, fb_info.elmts_per_buf, io_info->dxpl_id) < 0)
-                        HGOTO_ERROR(H5E_DATASET, H5E_CANTCONVERT, NULL, "can't refill fill value buffer")
-            } /* end if */
-            else
-                HDmemset(chunk, 0, chunk_size);
-
-            /* Increment # of creations */
-            rdcc->stats.ninits++;
-        } /* end else */
-    } /* end else */
-    HDassert(chunk_size > 0);
-
-    if(ent) {
         /*
-         * The chunk is not at the beginning of the cache; move it backward
+         * If the chunk is not at the beginning of the cache; move it backward
          * by one slot.  This is how we implement the LRU preemption
          * algorithm.
          */
-        HDassert(ent);
         if(ent->next) {
             if(ent->next->next)
                 ent->next->next->prev = ent;
@@ -2977,67 +3221,225 @@ H5D__chunk_lock(const H5D_io_info_t *io_info, H5D_chunk_ud_t *udata,
             ent->prev->next = ent;
         } /* end if */
     } /* end if */
-    else if(rdcc->nslots > 0 && chunk_size <= rdcc->nbytes_max) {
-        /* Calculate the index */
-        udata->idx_hint = H5D_CHUNK_HASH(dset->shared, io_info->store->chunk.index);
+    else {
+        haddr_t             chunk_addr;         /* Address of chunk on disk */
+        hsize_t             chunk_alloc;        /* Length of chunk on disk */
+
+        /* Save the chunk info so the cache stays consistent */
+        chunk_addr = udata->chunk_block.offset;
+        chunk_alloc = udata->chunk_block.length;
+
+        /* Check if we should disable filters on this chunk */
+        if(pline->nused) {
+            if(udata->new_unfilt_chunk) {
+                HDassert(layout->u.chunk.flags
+                        & H5O_LAYOUT_CHUNK_DONT_FILTER_PARTIAL_BOUND_CHUNKS);
+
+                /* Disable the filters for writing */
+                disable_filters = TRUE;
+                pline = NULL;
+            } /* end if */
+            else if(prev_unfilt_chunk) {
+                HDassert(layout->u.chunk.flags
+                        & H5O_LAYOUT_CHUNK_DONT_FILTER_PARTIAL_BOUND_CHUNKS);
 
-        /* Add the chunk to the cache only if the slot is not already locked */
-        ent = rdcc->slot[udata->idx_hint];
-        if(!ent || !ent->locked) {
-            /* Preempt enough things from the cache to make room */
-            if(ent) {
-                if(H5D__chunk_cache_evict(io_info->dset, io_info->dxpl_id, io_info->dxpl_cache, ent, TRUE) < 0)
-                    HGOTO_ERROR(H5E_IO, H5E_CANTINIT, NULL, "unable to preempt chunk from cache")
+                /* Mark the filters as having been previously disabled (for the
+                 * chunk as currently on disk) - disable the filters for reading
+                 */
+                old_pline = NULL;
             } /* end if */
-            if(H5D__chunk_cache_prune(io_info->dset, io_info->dxpl_id, io_info->dxpl_cache, chunk_size) < 0)
-                HGOTO_ERROR(H5E_IO, H5E_CANTINIT, NULL, "unable to preempt chunk(s) from cache")
-
-            /* Create a new entry */
-            if(NULL == (ent = H5FL_CALLOC(H5D_rdcc_ent_t)))
-                HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, NULL, "can't allocate raw data chunk entry")
-
-            /* Initialize the new entry */
-            ent->chunk_addr = chunk_addr;
-            HDmemcpy(ent->offset, io_info->store->chunk.offset, sizeof(hsize_t) * layout->u.chunk.ndims);
-            H5_CHECKED_ASSIGN(ent->rd_count, uint32_t, chunk_size, size_t);
-            H5_CHECKED_ASSIGN(ent->wr_count, uint32_t, chunk_size, size_t);
-            ent->chunk = (uint8_t *)chunk;
-
-            /* Add it to the cache */
-            HDassert(NULL == rdcc->slot[udata->idx_hint]);
-            rdcc->slot[udata->idx_hint] = ent;
-            ent->idx = udata->idx_hint;
-            rdcc->nbytes_used += chunk_size;
-            rdcc->nused++;
-
-            /* Add it to the linked list */
-            if(rdcc->tail) {
-                rdcc->tail->next = ent;
-                ent->prev = rdcc->tail;
-                rdcc->tail = ent;
+            else if(layout->u.chunk.flags
+                    & H5O_LAYOUT_CHUNK_DONT_FILTER_PARTIAL_BOUND_CHUNKS) {
+                /* Check if this is an edge chunk */
+                if(H5D__chunk_is_partial_edge_chunk(
+                        io_info->store->chunk.scaled, io_info->dset->shared->ndims,
+                        io_info->dset->shared->curr_dims, layout->u.chunk.dim)) {
+                    /* Disable the filters for both writing and reading */
+                    disable_filters = TRUE;
+                    old_pline = NULL;
+                    pline = NULL;
+                } /* end if */
             } /* end if */
-            else
-                rdcc->head = rdcc->tail = ent;
         } /* end if */
         else
-            /* We did not add the chunk to cache */
+            HDassert(!udata->new_unfilt_chunk && !prev_unfilt_chunk);
+
+        if(relax) {
+            /*
+             * Not in the cache, but we're about to overwrite the whole thing
+             * anyway, so just allocate a buffer for it but don't initialize that
+             * buffer with the file contents. Count this as a hit instead of a
+             * miss because we saved ourselves lots of work.
+             */
+            rdcc->stats.nhits++;
+
+            if(NULL == (chunk = H5D__chunk_mem_alloc(chunk_size, pline)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for raw data chunk")
+
+            /* In the case that some dataset functions look through this data,
+             * clear it to all 0s. */
+            HDmemset(chunk, 0, chunk_size);
+        } /* end if */
+        else {
+            /*
+             * Not in the cache.  Count this as a miss if it's in the file
+             *      or an init if it isn't.
+             */
+
+            /* Check if the chunk exists on disk */
+            if(H5F_addr_defined(chunk_addr)) {
+                size_t my_chunk_alloc = chunk_alloc;	/* Allocated buffer size */
+                size_t buf_alloc = chunk_alloc;	        /* [Re-]allocated buffer size */
+
+                /* Chunk size on disk isn't [likely] the same size as the final chunk
+                 * size in memory, so allocate memory big enough. */
+                if(NULL == (chunk = H5D__chunk_mem_alloc(my_chunk_alloc, (udata->new_unfilt_chunk ? old_pline : pline))))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for raw data chunk")
+                if(H5F_block_read(dset->oloc.file, H5FD_MEM_DRAW, chunk_addr, my_chunk_alloc, io_info->dxpl_id, chunk) < 0)
+                    HGOTO_ERROR(H5E_IO, H5E_READERROR, NULL, "unable to read raw data chunk")
+
+		if(old_pline && old_pline->nused) {
+                    if(H5Z_pipeline(old_pline, H5Z_FLAG_REVERSE,
+                            &(udata->filter_mask),
+                            io_info->dxpl_cache->err_detect,
+                            io_info->dxpl_cache->filter_cb,
+                            &my_chunk_alloc, &buf_alloc, &chunk) < 0)
+                        HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, NULL, "data pipeline read failed")
+
+                    /* Reallocate chunk if necessary */
+                    if(udata->new_unfilt_chunk) {
+                        void *tmp_chunk = chunk;
+
+                        if(NULL == (chunk = H5D__chunk_mem_alloc(my_chunk_alloc, pline))) {
+                            (void)H5D__chunk_mem_xfree(tmp_chunk, old_pline);
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for raw data chunk")
+                        } /* end if */
+                        HDmemcpy(chunk, tmp_chunk, chunk_size);
+                        (void)H5D__chunk_mem_xfree(tmp_chunk, old_pline);
+                    } /* end if */
+                } /* end if */
+
+                /* Increment # of cache misses */
+                rdcc->stats.nmisses++;
+            } /* end if */
+            else {
+                H5D_fill_value_t	fill_status;
+
+                /* Sanity check */
+                HDassert(fill->alloc_time != H5D_ALLOC_TIME_EARLY);
+
+                /* Chunk size on disk isn't [likely] the same size as the final chunk
+                 * size in memory, so allocate memory big enough. */
+                if(NULL == (chunk = H5D__chunk_mem_alloc(chunk_size, pline)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for raw data chunk")
+
+                if(H5P_is_fill_value_defined(fill, &fill_status) < 0)
+                    HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't tell if fill value defined")
+
+                if(fill->fill_time == H5D_FILL_TIME_ALLOC ||
+                        (fill->fill_time == H5D_FILL_TIME_IFSET &&
+                         (fill_status == H5D_FILL_VALUE_USER_DEFINED ||
+                          fill_status == H5D_FILL_VALUE_DEFAULT))) {
+                    /*
+                     * The chunk doesn't exist in the file.  Replicate the fill
+                     * value throughout the chunk, if the fill value is defined.
+                     */
+
+                    /* Initialize the fill value buffer */
+                    /* (use the compact dataset storage buffer as the fill value buffer) */
+                    if(H5D__fill_init(&fb_info, chunk, NULL, NULL, NULL, NULL,
+                            &dset->shared->dcpl_cache.fill, dset->shared->type,
+                            dset->shared->type_id, (size_t)0, chunk_size, io_info->dxpl_id) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "can't initialize fill buffer info")
+                    fb_info_init = TRUE;
+
+                    /* Check for VL datatype & non-default fill value */
+                    if(fb_info.has_vlen_fill_type)
+                        /* Fill the buffer with VL datatype fill values */
+                        if(H5D__fill_refill_vl(&fb_info, fb_info.elmts_per_buf, io_info->dxpl_id) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTCONVERT, NULL, "can't refill fill value buffer")
+                } /* end if */
+                else
+                    HDmemset(chunk, 0, chunk_size);
+
+                /* Increment # of creations */
+                rdcc->stats.ninits++;
+            } /* end else */
+        } /* end else */
+
+        /* See if the chunk can be cached */
+        if(rdcc->nslots > 0 && chunk_size <= rdcc->nbytes_max) {
+            /* Calculate the index */
+            udata->idx_hint = H5D__chunk_hash_val(io_info->dset->shared, udata->common.scaled);
+
+            /* Add the chunk to the cache only if the slot is not already locked */
+            ent = rdcc->slot[udata->idx_hint];
+            if(!ent || !ent->locked) {
+                /* Preempt enough things from the cache to make room */
+                if(ent) {
+                    if(H5D__chunk_cache_evict(io_info->dset, io_info->dxpl_id, io_info->dxpl_cache, ent, TRUE) < 0)
+                        HGOTO_ERROR(H5E_IO, H5E_CANTINIT, NULL, "unable to preempt chunk from cache")
+                } /* end if */
+                if(H5D__chunk_cache_prune(io_info->dset, io_info->dxpl_id, io_info->dxpl_cache, chunk_size) < 0)
+                    HGOTO_ERROR(H5E_IO, H5E_CANTINIT, NULL, "unable to preempt chunk(s) from cache")
+
+                /* Create a new entry */
+                if(NULL == (ent = H5FL_CALLOC(H5D_rdcc_ent_t)))
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, NULL, "can't allocate raw data chunk entry")
+
+		ent->edge_chunk_state = disable_filters ? H5D_RDCC_DISABLE_FILTERS : 0;
+		if(udata->new_unfilt_chunk)
+		    ent->edge_chunk_state |= H5D_RDCC_NEWLY_DISABLED_FILTERS;
+
+                /* Initialize the new entry */
+                ent->chunk_block.offset = chunk_addr;
+                ent->chunk_block.length = chunk_alloc;
+		ent->chunk_idx = udata->chunk_idx;
+                HDmemcpy(ent->scaled, udata->common.scaled, sizeof(hsize_t) * layout->u.chunk.ndims);
+                H5_CHECKED_ASSIGN(ent->rd_count, uint32_t, chunk_size, size_t);
+                H5_CHECKED_ASSIGN(ent->wr_count, uint32_t, chunk_size, size_t);
+                ent->chunk = (uint8_t *)chunk;
+
+                /* Add it to the cache */
+                HDassert(NULL == rdcc->slot[udata->idx_hint]);
+                rdcc->slot[udata->idx_hint] = ent;
+                ent->idx = udata->idx_hint;
+                rdcc->nbytes_used += chunk_size;
+                rdcc->nused++;
+
+                /* Add it to the linked list */
+                if(rdcc->tail) {
+                    rdcc->tail->next = ent;
+                    ent->prev = rdcc->tail;
+                    rdcc->tail = ent;
+                } /* end if */
+                else
+                    rdcc->head = rdcc->tail = ent;
+		ent->tmp_next = NULL;
+		ent->tmp_prev = NULL;
+
+            } /* end if */
+            else
+                /* We did not add the chunk to cache */
+                ent = NULL;
+        } /* end else */
+        else /* No cache set up, or chunk is too large: chunk is uncacheable */
             ent = NULL;
     } /* end else */
 
-    if(!ent)
-        /*
-         * The chunk cannot be placed in cache so we don't cache it. This is the
-         * reason all those arguments have to be repeated for the unlock
-         * function.
-         */
-        udata->idx_hint = UINT_MAX;
-
     /* Lock the chunk into the cache */
     if(ent) {
         HDassert(!ent->locked);
         ent->locked = TRUE;
         chunk = ent->chunk;
     } /* end if */
+    else
+        /*
+         * The chunk cannot be placed in cache so we don't cache it. This is the
+         * reason all those arguments have to be repeated for the unlock
+         * function.
+         */
+        udata->idx_hint = UINT_MAX;
 
     /* Set return value */
     ret_value = chunk;
@@ -3050,7 +3452,7 @@ done:
     /* Release the chunk allocated, on error */
     if(!ret_value)
         if(chunk)
-            chunk = H5D__chunk_xfree(chunk, pline);
+            chunk = H5D__chunk_mem_xfree(chunk, pline);
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D__chunk_lock() */
@@ -3098,14 +3500,38 @@ H5D__chunk_unlock(const H5D_io_info_t *io_info, const H5D_chunk_ud_t *udata,
          * Note: we have to copy the layout and filter messages so we
          *	 don't discard the `const' qualifier.
          */
+        hbool_t is_unfiltered_edge_chunk = FALSE; /* Whether the chunk is an unfiltered edge chunk */
+
+        /* Check if we should disable filters on this chunk */
+        if(udata->new_unfilt_chunk) {
+            HDassert(layout->u.chunk.flags
+                & H5O_LAYOUT_CHUNK_DONT_FILTER_PARTIAL_BOUND_CHUNKS);
+
+            is_unfiltered_edge_chunk = TRUE;
+        } /* end if */
+        else if(layout->u.chunk.flags
+                & H5O_LAYOUT_CHUNK_DONT_FILTER_PARTIAL_BOUND_CHUNKS) {
+            /* Check if the chunk is an edge chunk, and disable filters if so */
+            is_unfiltered_edge_chunk = H5D__chunk_is_partial_edge_chunk(
+                    io_info->store->chunk.scaled, io_info->dset->shared->ndims,
+                    io_info->dset->shared->curr_dims, layout->u.chunk.dim);
+        } /* end if */
+
         if(dirty) {
             H5D_rdcc_ent_t fake_ent;         /* "fake" chunk cache entry */
 
             HDmemset(&fake_ent, 0, sizeof(fake_ent));
             fake_ent.dirty = TRUE;
-            HDmemcpy(fake_ent.offset, io_info->store->chunk.offset, layout->u.chunk.ndims * sizeof(fake_ent.offset[0]));
+            if(is_unfiltered_edge_chunk)
+                fake_ent.edge_chunk_state = H5D_RDCC_DISABLE_FILTERS;
+            if(udata->new_unfilt_chunk)
+                fake_ent.edge_chunk_state |= H5D_RDCC_NEWLY_DISABLED_FILTERS;
+	    HDmemcpy(fake_ent.scaled, udata->common.scaled, sizeof(hsize_t) * layout->u.chunk.ndims);
+	    HDmemcpy(fake_ent.scaled, udata->common.scaled, sizeof(hsize_t) * layout->u.chunk.ndims);
             HDassert(layout->u.chunk.size > 0);
-            fake_ent.chunk_addr = udata->addr;
+	    fake_ent.chunk_idx = udata->chunk_idx;
+            fake_ent.chunk_block.offset = udata->chunk_block.offset;
+            fake_ent.chunk_block.length = udata->chunk_block.length;
             fake_ent.chunk = (uint8_t *)chunk;
 
             if(H5D__chunk_flush_entry(io_info->dset, io_info->dxpl_id, io_info->dxpl_cache, &fake_ent, TRUE) < 0)
@@ -3113,7 +3539,8 @@ H5D__chunk_unlock(const H5D_io_info_t *io_info, const H5D_chunk_ud_t *udata,
         } /* end if */
         else {
             if(chunk)
-                chunk = H5D__chunk_xfree(chunk, &(io_info->dset->shared->dcpl_cache.pline));
+                chunk = H5D__chunk_mem_xfree(chunk, (is_unfiltered_edge_chunk ? NULL
+			: &(io_info->dset->shared->dcpl_cache.pline)));
         } /* end else */
     } /* end if */
     else {
@@ -3156,7 +3583,6 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static int
 H5D__chunk_allocated_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
 {
@@ -3193,12 +3619,14 @@ H5D__chunk_allocated(H5D_t *dset, hid_t dxpl_id, hsize_t *nbytes)
     H5D_dxpl_cache_t _dxpl_cache;       /* Data transfer property cache buffer */
     H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
     hsize_t chunk_bytes = 0;            /* Number of bytes allocated for chunks */
+    H5O_storage_chunk_t *sc = &(dset->shared->layout.storage.u.chunk);
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_PACKAGE
 
     HDassert(dset);
     HDassert(dset->shared);
+    H5D_CHUNK_STORAGE_INDEX_CHK(sc);
 
     /* Fill the DXPL cache values for later use */
     if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
@@ -3250,17 +3678,20 @@ H5D__chunk_allocate(const H5D_t *dset, hid_t dxpl_id, hbool_t full_overwrite,
 {
     H5D_chk_idx_info_t idx_info;        /* Chunked index info */
     const H5D_chunk_ops_t *ops = dset->shared->layout.storage.u.chunk.ops;      /* Chunk operations */
-    hsize_t     min_unalloc[H5O_LAYOUT_NDIMS]; /* First chunk in each dimension that is unallocated */
-    hsize_t     max_unalloc[H5O_LAYOUT_NDIMS]; /* Last chunk in each dimension that is unallocated */
-    hsize_t	chunk_offset[H5O_LAYOUT_NDIMS]; /* Offset of current chunk */
+    hsize_t     min_unalloc[H5O_LAYOUT_NDIMS]; /* First chunk in each dimension that is unallocated (in scaled coordinates) */
+    hsize_t     max_unalloc[H5O_LAYOUT_NDIMS]; /* Last chunk in each dimension that is unallocated (in scaled coordinates) */
+    hsize_t	scaled[H5O_LAYOUT_NDIMS]; /* Offset of current chunk (in scaled coordinates) */
     size_t	orig_chunk_size; /* Original size of chunk in bytes */
     size_t      chunk_size;      /* Actual size of chunk in bytes, possibly filtered */
     unsigned    filter_mask = 0; /* Filter mask for chunks that have them */
     const H5O_layout_t *layout = &(dset->shared->layout);       /* Dataset layout */
     const H5O_pline_t *pline = &(dset->shared->dcpl_cache.pline);    /* I/O pipeline info */
+    const H5O_pline_t def_pline = H5O_CRT_PIPELINE_DEF;              /* Default pipeline */
     const H5O_fill_t *fill = &(dset->shared->dcpl_cache.fill);    /* Fill value info */
     H5D_fill_value_t fill_status; /* The fill value status */
     hbool_t     should_fill = FALSE; /* Whether fill values should be written */
+    void        *unfilt_fill_buf = NULL; /* Unfiltered fill value buffer */
+    void        **fill_buf = NULL;      /* Pointer to the fill buffer to use for a chunk */
     H5D_dxpl_cache_t _dxpl_cache;       /* Data transfer property cache buffer */
     H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
 #ifdef H5_HAVE_PARALLEL
@@ -3269,32 +3700,37 @@ H5D__chunk_allocate(const H5D_t *dset, hid_t dxpl_id, hbool_t full_overwrite,
     H5D_chunk_coll_info_t chunk_info; /* chunk address information for doing I/O */
 #endif /* H5_HAVE_PARALLEL */
     hbool_t	carry;          /* Flag to indicate that chunk increment carrys to higher dimension (sorta) */
-    int         space_ndims;    /* Dataset's space rank */
-    hsize_t     space_dim[H5O_LAYOUT_NDIMS];    /* Dataset's dataspace dimensions */
+    unsigned    space_ndims;    /* Dataset's space rank */
+    const hsize_t *space_dim;   /* Dataset's dataspace dimensions */
     const uint32_t *chunk_dim = layout->u.chunk.dim; /* Convenience pointer to chunk dimensions */
-    int         op_dim;                 /* Current operationg dimension */
+    unsigned    op_dim;                 /* Current operating dimension */
     H5D_fill_buf_info_t fb_info;        /* Dataset's fill buffer info */
     hbool_t     fb_info_init = FALSE;   /* Whether the fill value buffer has been initialized */
+    hbool_t     has_unfilt_edge_chunks = FALSE; /* Whether there are partial edge chunks with disabled filters */
+    hbool_t     unfilt_edge_chunk_dim[H5O_LAYOUT_NDIMS]; /* Whether there are unfiltered edge chunks at the edge of each dimension */
+    hsize_t     edge_chunk_scaled[H5O_LAYOUT_NDIMS]; /* Offset of the unfiltered edge chunks at the edge of each dimension */
+    unsigned    nunfilt_edge_chunk_dims = 0; /* Number of dimensions on an edge */
+    const H5O_storage_chunk_t *sc = &(layout->storage.u.chunk);
     herr_t	ret_value = SUCCEED;	/* Return value */
 
-    FUNC_ENTER_PACKAGE
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, dset->oloc.addr, FAIL)
 
     /* Check args */
     HDassert(dset && H5D_CHUNKED == layout->type);
     HDassert(layout->u.chunk.ndims > 0 && layout->u.chunk.ndims <= H5O_LAYOUT_NDIMS);
+    H5D_CHUNK_STORAGE_INDEX_CHK(sc);
     HDassert(TRUE == H5P_isa_class(dxpl_id, H5P_DATASET_XFER));
 
     /* Retrieve the dataset dimensions */
-    if((space_ndims = H5S_get_simple_extent_dims(dset->shared->space, space_dim, NULL)) < 0)
-         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to get simple dataspace info")
-    space_dim[space_ndims] = layout->u.chunk.dim[space_ndims];
+    space_dim = dset->shared->curr_dims;
+    space_ndims = dset->shared->ndims;
 
-    /* The last dimension in chunk_offset is always 0 */
-    chunk_offset[space_ndims] = (hsize_t)0;
+    /* The last dimension in scaled chunk coordinates is always 0 */
+    scaled[space_ndims] = (hsize_t)0;
 
     /* Check if any space dimensions are 0, if so we do not have to do anything
      */
-    for(op_dim=0; op_dim<space_ndims; op_dim++)
+    for(op_dim = 0; op_dim < (unsigned)space_ndims; op_dim++)
         if(space_dim[op_dim] == 0) {
             /* Reset any cached chunk info for this dataset */
             H5D__chunk_cinfo_cache_reset(&dset->shared->cache.chunk.last);
@@ -3317,6 +3753,29 @@ H5D__chunk_allocate(const H5D_t *dset, hid_t dxpl_id, hbool_t full_overwrite,
     if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
 
+    /* Calculate the minimum and maximum chunk offsets in each dimension, and
+     * determine if there are any unfiltered partial edge chunks.  Note that we
+     * assume here that all elements of space_dim are > 0.  This is checked at
+     * the top of this function. */
+    for(op_dim=0; op_dim<space_ndims; op_dim++) {
+        min_unalloc[op_dim] = (old_dim[op_dim] + chunk_dim[op_dim] - 1) / chunk_dim[op_dim];
+        max_unalloc[op_dim] = (space_dim[op_dim] - 1) / chunk_dim[op_dim];
+
+        /* Calculate if there are unfiltered edge chunks at the edge of this
+         * dimension.  Note the edge_chunk_scaled is uninitialized for
+         * dimensions where unfilt_edge_chunk_dim is FALSE.  Also  */
+        if((layout->u.chunk.flags
+                & H5O_LAYOUT_CHUNK_DONT_FILTER_PARTIAL_BOUND_CHUNKS)
+                && pline->nused > 0
+                && space_dim[op_dim] % chunk_dim[op_dim] != 0) {
+            has_unfilt_edge_chunks = TRUE;
+            unfilt_edge_chunk_dim[op_dim] = TRUE;
+            edge_chunk_scaled[op_dim] = max_unalloc[op_dim];
+        } /* end if */
+        else
+            unfilt_edge_chunk_dim[op_dim] = FALSE;
+    } /* end for */
+
     /* Get original chunk size */
     H5_CHECKED_ASSIGN(orig_chunk_size, size_t, layout->u.chunk.size, uint32_t);
 
@@ -3341,13 +3800,18 @@ H5D__chunk_allocate(const H5D_t *dset, hid_t dxpl_id, hbool_t full_overwrite,
         /* Initialize the fill value buffer */
         /* (delay allocating fill buffer for VL datatypes until refilling) */
         /* (casting away const OK - QAK) */
-        if(H5D__fill_init(&fb_info, NULL, (H5MM_allocate_t)H5D__chunk_alloc,
-                (void *)pline, (H5MM_free_t)H5D__chunk_xfree, (void *)pline,
+        if(H5D__fill_init(&fb_info, NULL, (H5MM_allocate_t)H5D__chunk_mem_alloc,
+                (void *)pline, (H5MM_free_t)H5D__chunk_mem_xfree, (void *)pline,
                 &dset->shared->dcpl_cache.fill, dset->shared->type,
                 dset->shared->type_id, (size_t)0, orig_chunk_size, dxpl_id) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize fill buffer info")
         fb_info_init = TRUE;
 
+        /* Initialize the fill_buf pointer to the buffer in fb_info.  If edge
+         * chunk filters are disabled, we will switch the buffer as appropriate
+         * for each chunk. */
+        fill_buf = &fb_info.fill_buf;
+
         /* Check if there are filters which need to be applied to the chunk */
         /* (only do this in advance when the chunk info can be re-used (i.e.
          *      it doesn't contain any non-default VL datatype fill values)
@@ -3355,6 +3819,14 @@ H5D__chunk_allocate(const H5D_t *dset, hid_t dxpl_id, hbool_t full_overwrite,
         if(!fb_info.has_vlen_fill_type && pline->nused > 0) {
             size_t buf_size = orig_chunk_size;
 
+            /* If the dataset has disabled partial chunk filters, create a copy
+             * of the unfiltered fill_buf to use for partial chunks */
+            if(has_unfilt_edge_chunks) {
+                if(NULL == (unfilt_fill_buf = H5D__chunk_mem_alloc(orig_chunk_size, &def_pline)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for raw data chunk")
+                HDmemcpy(unfilt_fill_buf, fb_info.fill_buf, orig_chunk_size);
+            } /* end if */
+
             /* Push the chunk through the filters */
             if(H5Z_pipeline(pline, 0, &filter_mask, dxpl_cache->err_detect, dxpl_cache->filter_cb, &orig_chunk_size, &buf_size, &fb_info.fill_buf) < 0)
                 HGOTO_ERROR(H5E_PLINE, H5E_WRITEERROR, FAIL, "output pipeline failed")
@@ -3373,16 +3845,6 @@ H5D__chunk_allocate(const H5D_t *dset, hid_t dxpl_id, hbool_t full_overwrite,
     idx_info.layout = &dset->shared->layout.u.chunk;
     idx_info.storage = &dset->shared->layout.storage.u.chunk;
 
-    /* Calculate the minimum and maximum chunk offsets in each dimension.  Note
-     * that we assume here that all elements of space_dim are > 0.  This is
-     * checked at the top of this function */
-    for(op_dim=0; op_dim<space_ndims; op_dim++) {
-        min_unalloc[op_dim] = ((old_dim[op_dim] + chunk_dim[op_dim] - 1)
-                / chunk_dim[op_dim]) * chunk_dim[op_dim];
-        max_unalloc[op_dim] = ((space_dim[op_dim] - 1) / chunk_dim[op_dim])
-                * chunk_dim[op_dim];
-    } /* end for */
-
     /* Loop over all chunks */
     /* The algorithm is:
      *  For each dimension:
@@ -3400,9 +3862,14 @@ H5D__chunk_allocate(const H5D_t *dset, hid_t dxpl_id, hbool_t full_overwrite,
      * Every time the algorithm finishes allocating chunks allocated beyond a
      * certain dimension, max_unalloc is updated in order to avoid allocating
      * those chunks again.
+     *
+     * Note that min_unalloc & max_unalloc are in scaled coordinates.
+     *
      */
-    for(op_dim=0; op_dim<space_ndims; op_dim++) {
+    chunk_size = orig_chunk_size;
+    for(op_dim = 0; op_dim < space_ndims; op_dim++) {
         H5D_chunk_ud_t udata;   /* User data for querying chunk info */
+        unsigned u;             /* Local index variable */
         int i;                  /* Local index variable */
 
         /* Check if allocation along this dimension is really necessary */
@@ -3410,42 +3877,55 @@ H5D__chunk_allocate(const H5D_t *dset, hid_t dxpl_id, hbool_t full_overwrite,
             continue;
         else {
             /* Reset the chunk offset indices */
-            HDmemset(chunk_offset, 0, ((unsigned)space_ndims * sizeof(chunk_offset[0])));
-            chunk_offset[op_dim] = min_unalloc[op_dim];
+            HDmemset(scaled, 0, (space_ndims * sizeof(scaled[0])));
+            scaled[op_dim] = min_unalloc[op_dim];
+
+            if(has_unfilt_edge_chunks) {
+                /* Initialize nunfilt_edge_chunk_dims */
+                nunfilt_edge_chunk_dims = 0;
+                for(u = 0; u < space_ndims; u++)
+                    if(unfilt_edge_chunk_dim[u] && scaled[u]
+                            == edge_chunk_scaled[u])
+                        nunfilt_edge_chunk_dims++;
+
+                /* Initialize chunk_size and fill_buf */
+                if(should_fill && !fb_info.has_vlen_fill_type) {
+                    HDassert(fb_info_init);
+                    HDassert(unfilt_fill_buf);
+                    if(nunfilt_edge_chunk_dims) {
+                        fill_buf = &unfilt_fill_buf;
+                        chunk_size = layout->u.chunk.size;
+                    } /* end if */
+                    else {
+                        fill_buf = &fb_info.fill_buf;
+                        chunk_size = orig_chunk_size;
+                    } /* end else */
+                } /* end if */
+            } /* end if */
 
             carry = FALSE;
         } /* end else */
 
         while(!carry) {
-            /* Reset size of chunk in bytes, in case filtered size changes */
-            chunk_size = orig_chunk_size;
+            hbool_t need_insert = FALSE;    /* Whether the chunk needs to be inserted into the index */
 
+	    /* Look up this chunk */
+	    if(H5D__chunk_lookup(dset, dxpl_id, scaled, &udata) < 0)
+		HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error looking up chunk address")
 #ifndef NDEBUG
             /* None of the chunks should be allocated */
-            {
-                hsize_t chunk_idx;
-
-                /* Calculate the index of this chunk */
-                if(H5VM_chunk_index((unsigned)space_ndims, chunk_offset,
-                        layout->u.chunk.dim, layout->u.chunk.down_chunks,
-                        &chunk_idx) < 0)
-                    HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't get chunk index")
-
-                if(H5D__chunk_lookup(dset, dxpl_id, chunk_offset, chunk_idx, &udata) < 0)
-                    HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error looking up chunk address")
-
-                HDassert(!H5F_addr_defined(udata.addr));
-            } /* end block */
+	    if(H5D_CHUNK_IDX_NONE != layout->storage.u.chunk.idx_type)
+		HDassert(!H5F_addr_defined(udata.chunk_block.offset));
 
             /* Make sure the chunk is really in the dataset and outside the
              * original dimensions */
             {
-                unsigned u;             /* Local index variable */
+                unsigned v;             /* Local index variable */
                 hbool_t outside_orig = FALSE;
 
-                for(u = 0; u < (unsigned)space_ndims; u++) {
-                    HDassert(chunk_offset[u] < space_dim[u]);
-                    if(chunk_offset[u] >= old_dim[u])
+                for(v = 0; v < space_ndims; v++) {
+                    HDassert((scaled[v] * chunk_dim[v]) < space_dim[v]);
+                    if((scaled[v] * chunk_dim[v]) >= old_dim[v])
                         outside_orig = TRUE;
                 } /* end for */
                 HDassert(outside_orig);
@@ -3456,6 +3936,7 @@ H5D__chunk_allocate(const H5D_t *dset, hid_t dxpl_id, hbool_t full_overwrite,
             if(fb_info_init && fb_info.has_vlen_fill_type) {
                 /* Sanity check */
                 HDassert(should_fill);
+                HDassert(!unfilt_fill_buf);
 #ifdef H5_HAVE_PARALLEL
                 HDassert(!using_mpi);   /* Can't write VL datatypes in parallel currently */
 #endif
@@ -3464,8 +3945,7 @@ H5D__chunk_allocate(const H5D_t *dset, hid_t dxpl_id, hbool_t full_overwrite,
                  * possible (though ill-advised) for the filter to shrink the
                  * buffer. */
                 if(fb_info.fill_buf_size < orig_chunk_size) {
-                    if(NULL == (fb_info.fill_buf = H5D__chunk_realloc(
-                            fb_info.fill_buf, orig_chunk_size, pline)))
+                    if(NULL == (fb_info.fill_buf = H5D__chunk_mem_realloc(fb_info.fill_buf, orig_chunk_size, pline)))
                         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory reallocation failed for raw data chunk")
                     fb_info.fill_buf_size = orig_chunk_size;
                 } /* end if */
@@ -3475,7 +3955,7 @@ H5D__chunk_allocate(const H5D_t *dset, hid_t dxpl_id, hbool_t full_overwrite,
                     HGOTO_ERROR(H5E_DATASET, H5E_CANTCONVERT, FAIL, "can't refill fill value buffer")
 
                 /* Check if there are filters which need to be applied to the chunk */
-                if(pline->nused > 0) {
+                if(!nunfilt_edge_chunk_dims) {
                     size_t nbytes = orig_chunk_size;
 
                     /* Push the chunk through the filters */
@@ -3491,27 +3971,31 @@ H5D__chunk_allocate(const H5D_t *dset, hid_t dxpl_id, hbool_t full_overwrite,
                     /* Keep the number of bytes the chunk turned in to */
                     chunk_size = nbytes;
                 } /* end if */
+                else
+                    chunk_size = layout->u.chunk.size;
+
+                HDassert(*fill_buf == fb_info.fill_buf);
             } /* end if */
 
             /* Initialize the chunk information */
             udata.common.layout = &layout->u.chunk;
             udata.common.storage = &layout->storage.u.chunk;
-            udata.common.offset = chunk_offset;
-            udata.common.rdcc = NULL;
-            H5_CHECKED_ASSIGN(udata.nbytes, uint32_t, chunk_size, size_t);
+            udata.common.scaled = scaled;
+            udata.chunk_block.offset = HADDR_UNDEF;
+            H5_CHECKED_ASSIGN(udata.chunk_block.length, uint32_t, chunk_size, size_t);
             udata.filter_mask = filter_mask;
-            udata.addr = HADDR_UNDEF;
+	    udata.need_modify = FALSE;
 
-            /* Allocate the chunk with all processes */
-            if((ops->insert)(&idx_info, &udata) < 0)
-                HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert record into chunk index")
-            HDassert(H5F_addr_defined(udata.addr));
+            /* Allocate the chunk (with all processes) */
+	    if(H5D__chunk_file_alloc(&idx_info, NULL, &udata.chunk_block, &need_insert, &udata.need_modify, scaled) < 0)
+		HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert/resize chunk on chunk level")
+            HDassert(H5F_addr_defined(udata.chunk_block.offset));
 
             /* Check if fill values should be written to chunks */
             if(should_fill) {
                 /* Sanity check */
                 HDassert(fb_info_init);
-                HDassert(udata.nbytes == chunk_size);
+                HDassert(udata.chunk_block.length == chunk_size);
 
 #ifdef H5_HAVE_PARALLEL
                 /* Check if this file is accessed with an MPI-capable file driver */
@@ -3519,14 +4003,12 @@ H5D__chunk_allocate(const H5D_t *dset, hid_t dxpl_id, hbool_t full_overwrite,
                     /* collect all chunk addresses to be written to
                        write collectively at the end */
                     /* allocate/resize address array if no more space left */
-                    if(0 == chunk_info.num_io % 1024) {
-                        if(NULL == (chunk_info.addr = (haddr_t *)HDrealloc
-                                    (chunk_info.addr, (chunk_info.num_io + 1024) * sizeof(haddr_t))))
-                            HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "memory allocation failed for chunk addresses");
-                    } /* end if */
+                    if(0 == chunk_info.num_io % 1024)
+                        if(NULL == (chunk_info.addr = (haddr_t *)HDrealloc(chunk_info.addr, (chunk_info.num_io + 1024) * sizeof(haddr_t))))
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "memory allocation failed for chunk addresses")
 
                     /* Store the chunk's address for later */
-                    chunk_info.addr[chunk_info.num_io] = udata.addr;
+                    chunk_info.addr[chunk_info.num_io] = udata.chunk_block.offset;
                     chunk_info.num_io++;
 
                     /* Indicate that blocks will be written */
@@ -3534,25 +4016,52 @@ H5D__chunk_allocate(const H5D_t *dset, hid_t dxpl_id, hbool_t full_overwrite,
                 } /* end if */
                 else {
 #endif /* H5_HAVE_PARALLEL */
-                    if(H5F_block_write(dset->oloc.file, H5FD_MEM_DRAW, udata.addr, chunk_size, 
-                                       dxpl_id, fb_info.fill_buf) < 0)
+                    if(H5F_block_write(dset->oloc.file, H5FD_MEM_DRAW, udata.chunk_block.offset, chunk_size, dxpl_id, *fill_buf) < 0)
                         HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to write raw data to file")
 #ifdef H5_HAVE_PARALLEL
                 } /* end else */
 #endif /* H5_HAVE_PARALLEL */
             } /* end if */
 
-            /* Increment indices */
+            /* Insert the chunk record into the index */
+	    if((need_insert || udata.need_modify) && ops->insert)
+                if((ops->insert)(&idx_info, &udata, dset) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert chunk addr into index")
+
+            /* Increment indices and adjust the edge chunk state */
             carry = TRUE;
             for(i = ((int)space_ndims - 1); i >= 0; --i) {
-                chunk_offset[i] += chunk_dim[i];
-                if(chunk_offset[i] > max_unalloc[i]) {
-                    if(i == op_dim)
-                        chunk_offset[i] = min_unalloc[i];
+                scaled[i]++;
+                if(scaled[i] > max_unalloc[i]) {
+                    if((unsigned)i == op_dim)
+                        scaled[i] = min_unalloc[i];
                     else
-                        chunk_offset[i] = 0;
-		} /* end if */
+                        scaled[i] = 0;
+
+                    /* Check if we just left the edge in this dimension */
+                    if(unfilt_edge_chunk_dim[i]
+                            && edge_chunk_scaled[i] == max_unalloc[i]
+                            && scaled[i] < edge_chunk_scaled[i]) {
+                        nunfilt_edge_chunk_dims--;
+                        if(should_fill && nunfilt_edge_chunk_dims == 0 && !fb_info.has_vlen_fill_type) {
+                            HDassert(!H5D__chunk_is_partial_edge_chunk(scaled, space_ndims, space_dim, chunk_dim));
+                            fill_buf = &fb_info.fill_buf;
+                            chunk_size = orig_chunk_size;
+                        } /* end if */
+                    } /* end if */
+                } /* end if */
                 else {
+                    /* Check if we just entered the edge in this dimension */
+                    if(unfilt_edge_chunk_dim[i] && scaled[i] == edge_chunk_scaled[i]) {
+                        HDassert(edge_chunk_scaled[i] == max_unalloc[i]);
+                        nunfilt_edge_chunk_dims++;
+                        if(should_fill && nunfilt_edge_chunk_dims == 1 && !fb_info.has_vlen_fill_type) {
+                            HDassert(H5D__chunk_is_partial_edge_chunk(scaled, space_ndims, space_dim, chunk_dim));
+                            fill_buf = &unfilt_fill_buf;
+                            chunk_size = layout->u.chunk.size;
+                        } /* end if */
+                    } /* end if */
+
                     carry = FALSE;
                     break;
                 } /* end else */
@@ -3565,15 +4074,14 @@ H5D__chunk_allocate(const H5D_t *dset, hid_t dxpl_id, hbool_t full_overwrite,
         if(min_unalloc[op_dim] == 0)
             break;
         else
-            max_unalloc[op_dim] = min_unalloc[op_dim] - chunk_dim[op_dim];
+            max_unalloc[op_dim] = min_unalloc[op_dim] - 1;
     } /* end for(op_dim=0...) */
 
 #ifdef H5_HAVE_PARALLEL
     /* do final collective I/O */
-    if(using_mpi && blocks_written) {
+    if(using_mpi && blocks_written)
         if(H5D__chunk_collective_fill(dset, dxpl_id, &chunk_info, chunk_size, fb_info.fill_buf) < 0)
             HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to write raw data to file")
-    } /* end if */
 #endif /* H5_HAVE_PARALLEL */
 
     /* Reset any cached chunk info for this dataset */
@@ -3584,16 +4092,196 @@ done:
     if(fb_info_init && H5D__fill_term(&fb_info) < 0)
         HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "Can't release fill buffer info")
 
+    /* Free the unfiltered fill value buffer */
+    unfilt_fill_buf = H5D__chunk_mem_xfree(unfilt_fill_buf, &def_pline);
+
 #ifdef H5_HAVE_PARALLEL
-    if(using_mpi) {
-        if(chunk_info.addr)
-            HDfree(chunk_info.addr);
-    } /* end if */
+    if(using_mpi && chunk_info.addr)
+        HDfree(chunk_info.addr);
 #endif
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5D__chunk_allocate() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__chunk_update_old_edge_chunks
+ *
+ * Purpose:     Update all chunks which were previously partial edge
+ *              chunks and are now complete.  Determines exactly which
+ *              chunks need to be updated and locks each into cache using
+ *              the 'prev_unfilt_chunk' flag, then unlocks it, causing
+ *              filters to be applied as necessary.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              April 14, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_update_old_edge_chunks(H5D_t *dset, hid_t dxpl_id, hsize_t old_dim[])
+{
+    hsize_t     old_edge_chunk_sc[H5O_LAYOUT_NDIMS]; /* Offset of first previously incomplete chunk in each dimension */
+    hsize_t     max_edge_chunk_sc[H5O_LAYOUT_NDIMS]; /* largest offset of chunks that might need to be modified in each dimension */
+    hbool_t     new_full_dim[H5O_LAYOUT_NDIMS]; /* Whether the plane of chunks in this dimension needs to be modified */
+    const H5O_layout_t *layout = &(dset->shared->layout); /* Dataset layout */
+    const H5O_pline_t *pline = &(dset->shared->dcpl_cache.pline); /* I/O pipeline info */
+    hsize_t     chunk_sc[H5O_LAYOUT_NDIMS]; /* Offset of current chunk */
+    const uint32_t *chunk_dim = layout->u.chunk.dim; /* Convenience pointer to chunk dimensions */
+    unsigned    space_ndims;            /* Dataset's space rank */
+    const hsize_t *space_dim;           /* Dataset's dataspace dimensions */
+    unsigned    op_dim;                 /* Current operationg dimension */
+    H5D_io_info_t chk_io_info;          /* Chunked I/O info object */
+    H5D_chunk_ud_t chk_udata;           /* User data for locking chunk */
+    H5D_storage_t chk_store;            /* Chunk storage information */
+    H5D_dxpl_cache_t _dxpl_cache;       /* Data transfer property cache buffer */
+    H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
+    void        *chunk;                 /* The file chunk  */
+    hbool_t     carry;                  /* Flag to indicate that chunk increment carrys to higher dimension (sorta) */
+    const H5O_storage_chunk_t *sc = &(layout->storage.u.chunk);
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(dset && H5D_CHUNKED == layout->type);
+    HDassert(layout->u.chunk.ndims > 0 && layout->u.chunk.ndims <= H5O_LAYOUT_NDIMS);
+    H5D_CHUNK_STORAGE_INDEX_CHK(sc);
+    HDassert(TRUE == H5P_isa_class(dxpl_id, H5P_DATASET_XFER));
+    HDassert(pline->nused > 0);
+    HDassert(layout->u.chunk.flags
+            & H5O_LAYOUT_CHUNK_DONT_FILTER_PARTIAL_BOUND_CHUNKS);
+
+    /* Retrieve the dataset dimensions */
+    space_dim = dset->shared->curr_dims;
+    space_ndims = dset->shared->ndims;
+
+    /* The last dimension in chunk_offset is always 0 */
+    chunk_sc[space_ndims] = (hsize_t)0;
+
+    /* Check if any current dimensions are smaller than the chunk size, or if
+     * any old dimensions are 0.  If so we do not have to do anything. */
+    for(op_dim=0; op_dim<space_ndims; op_dim++)
+        if((space_dim[op_dim] < chunk_dim[op_dim])  || old_dim[op_dim] == 0) {
+            /* Reset any cached chunk info for this dataset */
+            H5D__chunk_cinfo_cache_reset(&dset->shared->cache.chunk.last);
+            HGOTO_DONE(SUCCEED)
+        } /* end if */
+
+    /*
+     * Initialize structures needed to lock chunks into cache
+     */
+    /* Fill the DXPL cache values for later use */
+    if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
+
+    /* Set up chunked I/O info object, for operations on chunks (in callback).
+     * Note that we only need to set chunk_offset once, as the array's address
+     * will never change. */
+    chk_store.chunk.scaled = chunk_sc; 
+    H5D_BUILD_IO_INFO_RD(&chk_io_info, dset, dxpl_cache, dxpl_id, &chk_store, NULL);
+
+    /*
+     * Determine the edges of the dataset which need to be modified
+     */
+    for(op_dim=0; op_dim<space_ndims; op_dim++) {
+        /* Start off with this dimension marked as not needing to be modified */
+        new_full_dim[op_dim] = FALSE;
+
+        /* Calulate offset of first previously incomplete chunk in this
+         * dimension */
+	old_edge_chunk_sc[op_dim] = (old_dim[op_dim] / chunk_dim[op_dim]);
+
+        /* Calculate the largest offset of chunks that might need to be
+         * modified in this dimension */
+	max_edge_chunk_sc[op_dim] = MIN((old_dim[op_dim] - 1) / chunk_dim[op_dim],
+					  MAX((space_dim[op_dim] / chunk_dim[op_dim]), 1) - 1);
+
+        /* Check for old_dim aligned with chunk boundary in this dimension, if
+         * so we do not need to modify chunks along the edge in this dimension
+         */
+        if(old_dim[op_dim] % chunk_dim[op_dim] == 0)
+            continue;
+
+        /* Check if the dataspace expanded enough to cause the old edge chunks
+         * in this dimension to become full */
+	if((space_dim[op_dim]/chunk_dim[op_dim]) >= (old_edge_chunk_sc[op_dim] + 1))
+            new_full_dim[op_dim] = TRUE;
+    } /* end for */
+
+    /* Main loop: fix old edge chunks */
+    for(op_dim=0; op_dim<space_ndims; op_dim++) {
+        /* Check if allocation along this dimension is really necessary */
+        if(!new_full_dim[op_dim])
+            continue;
+        else {
+            HDassert(max_edge_chunk_sc[op_dim] == old_edge_chunk_sc[op_dim]);
+
+            /* Reset the chunk offset indices */
+            HDmemset(chunk_sc, 0, (space_ndims * sizeof(chunk_sc[0])));
+            chunk_sc[op_dim] = old_edge_chunk_sc[op_dim];
+
+            carry = FALSE;
+        } /* end if */
+
+        while(!carry) {
+            int i;                  /* Local index variable */
+
+            /* Make sure the chunk is really a former edge chunk */
+            HDassert(H5D__chunk_is_partial_edge_chunk(chunk_sc, space_ndims, old_dim, chunk_dim)
+                    && !H5D__chunk_is_partial_edge_chunk(chunk_sc, space_ndims, space_dim, chunk_dim));
+
+            /* Lookup the chunk */
+            if(H5D__chunk_lookup(dset, dxpl_id, chunk_sc, &chk_udata) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error looking up chunk address")
+
+            /* If this chunk does not exist in cache or on disk, no need to do
+             * anything */
+            if(H5F_addr_defined(chk_udata.chunk_block.offset)
+                    || (UINT_MAX != chk_udata.idx_hint)) {
+                /* Lock the chunk into cache.  H5D__chunk_lock will take care of
+                * updating the chunk to no longer be an edge chunk. */
+                if(NULL == (chunk = (void *)H5D__chunk_lock(&chk_io_info, &chk_udata, FALSE, TRUE)))
+                    HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "unable to lock raw data chunk")
+
+                /* Unlock the chunk */
+                if(H5D__chunk_unlock(&chk_io_info, &chk_udata, TRUE, chunk, (uint32_t)0) < 0)
+                    HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to unlock raw data chunk")
+            } /* end if */
+
+            /* Increment indices */
+            carry = TRUE;
+            for(i = ((int)space_ndims - 1); i >= 0; --i) {
+                if((unsigned)i != op_dim) {
+		    ++chunk_sc[i];
+                    if(chunk_sc[i] > (hsize_t) max_edge_chunk_sc[i])
+                        chunk_sc[i] = 0;
+                    else {
+                        carry = FALSE;
+                        break;
+                    } /* end else */
+                } /* end if */
+            } /* end for */
+        } /* end while(!carry) */
+
+        /* Adjust max_edge_chunk_sc so we don't modify the same chunk twice.
+         * Also check if this dimension started from 0 (and hence modified all
+         * of the old edge chunks. */
+        if(old_edge_chunk_sc[op_dim] == 0)
+            break;
+        else
+            --max_edge_chunk_sc[op_dim];
+    } /* end for(op_dim=0...) */
+
+    /* Reset any cached chunk info for this dataset */
+    H5D__chunk_cinfo_cache_reset(&dset->shared->cache.chunk.last);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_update_old_edge_chunks() */
+
 #ifdef H5_HAVE_PARALLEL
 

 /*-------------------------------------------------------------------------
@@ -3688,33 +4376,19 @@ H5D__chunk_collective_fill(const H5D_t *dset, hid_t dxpl_id,
         blocks++;
     }
 
-    /* MSC
-     * should not have a special case for blocks == 0, but ompi (as of 1.8.1) has a bug 
-     * in file_set_view when a zero size datatype is create with hindexed or hvector.
+    /* MSC 
+     * should use this if MPI_type_create_hindexed block is working 
+     * mpi_code = MPI_Type_create_hindexed_block(blocks, block_len, chunk_disp_array, MPI_BYTE, &file_type);
      */
-    if(0 == blocks) {
-        mpi_code = MPI_Type_contiguous(0, MPI_BYTE, &file_type);
-        if(mpi_code != MPI_SUCCESS)
-            HMPI_GOTO_ERROR(FAIL, "MPI_Type_contiguous failed", mpi_code)
-        mpi_code = MPI_Type_contiguous(0, MPI_BYTE, &mem_type);
-        if(mpi_code != MPI_SUCCESS)
-            HMPI_GOTO_ERROR(FAIL, "MPI_Type_contiguous failed", mpi_code)
-    }
-    else {
-        /* MSC 
-         * should use this if MPI_type_create_hindexed block is working 
-         * mpi_code = MPI_Type_create_hindexed_block(blocks, block_len, chunk_disp_array, MPI_BYTE, &file_type);
-         */
-        mpi_code = MPI_Type_create_hindexed(blocks, block_lens, chunk_disp_array, 
-                                            MPI_BYTE, &file_type);
-        if(mpi_code != MPI_SUCCESS)
-            HMPI_GOTO_ERROR(FAIL, "MPI_Type_create_hindexed failed", mpi_code)
-        mpi_code = MPI_Type_create_hvector(blocks, block_len, 0, MPI_BYTE, &mem_type);
-        if(mpi_code != MPI_SUCCESS)
-            HMPI_GOTO_ERROR(FAIL, "MPI_Type_create_hvector failed", mpi_code)
-    }
+    mpi_code = MPI_Type_create_hindexed(blocks, block_lens, chunk_disp_array, MPI_BYTE, &file_type);
+    if(mpi_code != MPI_SUCCESS)
+        HMPI_GOTO_ERROR(FAIL, "MPI_Type_create_hindexed failed", mpi_code)
     if(MPI_SUCCESS != (mpi_code = MPI_Type_commit(&file_type)))
         HMPI_GOTO_ERROR(FAIL, "MPI_Type_commit failed", mpi_code)
+
+    mpi_code = MPI_Type_create_hvector(blocks, block_len, 0, MPI_BYTE, &mem_type);
+    if(mpi_code != MPI_SUCCESS)
+        HMPI_GOTO_ERROR(FAIL, "MPI_Type_create_hvector failed", mpi_code)
     if(MPI_SUCCESS != (mpi_code = MPI_Type_commit(&mem_type)))
         HMPI_GOTO_ERROR(FAIL, "MPI_Type_commit failed", mpi_code)
 
@@ -3739,9 +4413,8 @@ H5D__chunk_collective_fill(const H5D_t *dset, hid_t dxpl_id,
             HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set transfer mode")
     }
 
-    /* low level write */
-    if(H5F_block_write(dset->oloc.file, H5FD_MEM_DRAW, (haddr_t)0, (blocks) ? (size_t)1 : (size_t)0, 
-                       data_dxpl_id, fill_buf) < 0)
+    /* low level write (collective) */
+    if(H5F_block_write(dset->oloc.file, H5FD_MEM_DRAW, (haddr_t)0, (blocks) ? (size_t)1 : (size_t)0, data_dxpl_id, fill_buf) < 0)
         HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to write raw data to file")
 
     /* Barrier so processes don't race ahead */
@@ -3779,13 +4452,13 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5D__chunk_prune_fill(H5D_chunk_it_ud1_t *udata)
+H5D__chunk_prune_fill(H5D_chunk_it_ud1_t *udata, hbool_t new_unfilt_chunk)
 {
     const H5D_io_info_t *io_info = udata->io_info; /* Local pointer to I/O info */
     const H5D_t *dset = io_info->dset;  /* Local pointer to the dataset info */
     const H5O_layout_t *layout = &(dset->shared->layout); /* Dataset's layout */
     unsigned    rank = udata->common.layout->ndims - 1; /* Dataset rank */
-    const hsize_t *chunk_offset = io_info->store->chunk.offset; /* Chunk offset */
+    const hsize_t *scaled = udata->common.scaled; /* Scaled chunk offset */
     H5S_sel_iter_t chunk_iter;          /* Memory selection iteration info */
     hssize_t    sel_nelmts;             /* Number of elements in selection */
     hsize_t     count[H5O_LAYOUT_NDIMS]; /* Element count of hyperslab */
@@ -3804,12 +4477,12 @@ H5D__chunk_prune_fill(H5D_chunk_it_ud1_t *udata)
     H5_CHECKED_ASSIGN(chunk_size, size_t, layout->u.chunk.size, uint32_t);
 
     /* Get the info for the chunk in the file */
-    if(H5D__chunk_lookup(dset, io_info->dxpl_id, chunk_offset, io_info->store->chunk.index, &chk_udata) < 0)
+    if(H5D__chunk_lookup(dset, io_info->dxpl_id, scaled, &chk_udata) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error looking up chunk address")
+    chk_udata.new_unfilt_chunk = new_unfilt_chunk;
 
-    /* If this chunk does not exist in cache or on disk, no need to do anything
-     */
-    if(!H5F_addr_defined(chk_udata.addr) && UINT_MAX == chk_udata.idx_hint)
+    /* If this chunk does not exist in cache or on disk, no need to do anything */
+    if(!H5F_addr_defined(chk_udata.chunk_block.offset) && UINT_MAX == chk_udata.idx_hint)
         HGOTO_DONE(SUCCEED)
 
     /* Initialize the fill value buffer, if necessary */
@@ -3825,8 +4498,7 @@ H5D__chunk_prune_fill(H5D_chunk_it_ud1_t *udata)
 
     /* Compute the # of elements to leave with existing value, in each dimension */
     for(u = 0; u < rank; u++) {
-        count[u] = MIN(layout->u.chunk.dim[u], (udata->space_dim[u]
-                - chunk_offset[u]));
+        count[u] = MIN(layout->u.chunk.dim[u], (udata->space_dim[u] - (scaled[u] * layout->u.chunk.dim[u])));
         HDassert(count[u] > 0);
     } /* end for */
 
@@ -3839,7 +4511,7 @@ H5D__chunk_prune_fill(H5D_chunk_it_ud1_t *udata)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTSELECT, FAIL, "unable to select hyperslab")
 
     /* Lock the chunk into the cache, to get a pointer to the chunk buffer */
-    if(NULL == (chunk = (void *)H5D__chunk_lock(io_info, &chk_udata, FALSE)))
+    if(NULL == (chunk = (void *)H5D__chunk_lock(io_info, &chk_udata, FALSE, FALSE)))
         HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "unable to lock raw data chunk")
 
 
@@ -3989,13 +4661,12 @@ done:
 herr_t
 H5D__chunk_prune_by_extent(H5D_t *dset, hid_t dxpl_id, const hsize_t *old_dim)
 {
-    hsize_t                 min_mod_chunk_off[H5O_LAYOUT_NDIMS]; /* Offset of first chunk to modify in each dimension */
-    hsize_t                 max_mod_chunk_off[H5O_LAYOUT_NDIMS]; /* Offset of last chunk to modify in each dimension */
-    hssize_t                max_fill_chunk_off[H5O_LAYOUT_NDIMS]; /* Offset of last chunk that might be filled in each dimension */
+    hsize_t                 min_mod_chunk_sc[H5O_LAYOUT_NDIMS]; /* Scaled offset of first chunk to modify in each dimension */
+    hsize_t                 max_mod_chunk_sc[H5O_LAYOUT_NDIMS]; /* Scaled offset of last chunk to modify in each dimension */
+    hssize_t                max_fill_chunk_sc[H5O_LAYOUT_NDIMS]; /* Scaled offset of last chunk that might be filled in each dimension */
     hbool_t                 fill_dim[H5O_LAYOUT_NDIMS]; /* Whether the plane of edge chunks in this dimension needs to be filled */
-    hbool_t                 dims_outside_fill[H5O_LAYOUT_NDIMS]; /* Dimensions in chunk offset outside fill dimensions */
-    int                     ndims_outside_fill = 0; /* Number of dimensions in chunk offset outside fill dimensions */
-    hbool_t                 has_fill = FALSE;   /* Whether there are chunks that must be filled */
+    hsize_t                 min_partial_chunk_sc[H5O_LAYOUT_NDIMS]; /* Offset of first partial (or empty) chunk in each dimension */
+    hbool_t                 new_unfilt_dim[H5O_LAYOUT_NDIMS]; /* Whether the plane of edge chunks in this dimension are newly unfiltered */
     H5D_chk_idx_info_t      idx_info;           /* Chunked index info */
     H5D_io_info_t           chk_io_info;        /* Chunked I/O info object */
     H5D_storage_t           chk_store;          /* Chunk storage information */
@@ -4003,22 +4674,22 @@ H5D__chunk_prune_by_extent(H5D_t *dset, hid_t dxpl_id, const hsize_t *old_dim)
     H5D_dxpl_cache_t       *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
     const H5O_layout_t     *layout = &(dset->shared->layout);   /* Dataset's layout */
     const H5D_rdcc_t       *rdcc = &(dset->shared->cache.chunk);	/*raw data chunk cache */
-    H5D_rdcc_ent_t         *ent = NULL;	        /* Cache entry  */
-    int                     space_ndims;        /* Dataset's space rank */
-    hsize_t                 space_dim[H5O_LAYOUT_NDIMS]; /* Current dataspace dimensions */
-    int                     op_dim;             /* Current operationg dimension */
+    unsigned                space_ndims;        /* Dataset's space rank */
+    const hsize_t          *space_dim;          /* Current dataspace dimensions */
+    unsigned                op_dim;             /* Current operating dimension */
     hbool_t                 shrunk_dim[H5O_LAYOUT_NDIMS]; /* Dimensions which have shrunk */
     H5D_chunk_it_ud1_t      udata;      /* Chunk index iterator user data */
     hbool_t                 udata_init = FALSE; /* Whether the chunk index iterator user data has been initialized */
     H5D_chunk_common_ud_t   idx_udata;          /* User data for index removal routine */
-    H5D_chunk_ud_t          chk_udata;          /* User data for getting chunk info */
     H5S_t                  *chunk_space = NULL;         /* Dataspace for a chunk */
     hsize_t                 chunk_dim[H5O_LAYOUT_NDIMS];   /* Chunk dimensions */
-    hsize_t                 chunk_offset[H5O_LAYOUT_NDIMS]; /* Offset of current chunk */
+    hsize_t                 scaled[H5O_LAYOUT_NDIMS];   /* Scaled offset of current chunk */
     hsize_t                 hyper_start[H5O_LAYOUT_NDIMS];  /* Starting location of hyperslab */
     uint32_t                elmts_per_chunk;    /* Elements in chunk */
-    hbool_t                 carry;              /* Flag to indicate that chunk increment carrys to higher dimension (sorta) */
+    hbool_t                 disable_edge_filters = FALSE; /* Whether to disable filters on partial edge chunks */
+    hbool_t                 new_unfilt_chunk = FALSE; /* Whether the chunk is newly unfiltered */
     unsigned                u;	                /* Local index variable */
+    const H5O_storage_chunk_t *sc = &(layout->storage.u.chunk);
     herr_t                  ret_value = SUCCEED;       /* Return value */
 
     FUNC_ENTER_PACKAGE
@@ -4026,6 +4697,7 @@ H5D__chunk_prune_by_extent(H5D_t *dset, hid_t dxpl_id, const hsize_t *old_dim)
     /* Check args */
     HDassert(dset && H5D_CHUNKED == layout->type);
     HDassert(layout->u.chunk.ndims > 0 && layout->u.chunk.ndims <= H5O_LAYOUT_NDIMS);
+    H5D_CHUNK_STORAGE_INDEX_CHK(sc);
     HDassert(dxpl_cache);
 
     /* Fill the DXPL cache values for later use */
@@ -4033,16 +4705,14 @@ H5D__chunk_prune_by_extent(H5D_t *dset, hid_t dxpl_id, const hsize_t *old_dim)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
 
     /* Go get the rank & dimensions (including the element size) */
-    if((space_ndims = H5S_get_simple_extent_dims(dset->shared->space, space_dim,
-            NULL)) < 0)
-	HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset dimensions")
-    space_dim[space_ndims] = layout->u.chunk.dim[space_ndims];
+    space_dim = dset->shared->curr_dims;
+    space_ndims = dset->shared->ndims;
 
-    /* The last dimension in chunk_offset is always 0 */
-    chunk_offset[space_ndims] = (hsize_t)0;
+    /* The last dimension in scaled is always 0 */
+    scaled[space_ndims] = (hsize_t)0;
 
     /* Check if any old dimensions are 0, if so we do not have to do anything */
-    for(op_dim=0; op_dim<space_ndims; op_dim++)
+    for(op_dim = 0; op_dim < (unsigned)space_ndims; op_dim++)
         if(old_dim[op_dim] == 0) {
             /* Reset any cached chunk info for this dataset */
             H5D__chunk_cinfo_cache_reset(&dset->shared->cache.chunk.last);
@@ -4055,14 +4725,14 @@ H5D__chunk_prune_by_extent(H5D_t *dset, hid_t dxpl_id, const hsize_t *old_dim)
     /* (also copy the chunk dimensions into 'hsize_t' array for creating dataspace) */
     /* (also compute the dimensions which have been shrunk) */
     elmts_per_chunk = 1;
-    for(u = 0; u < (unsigned)space_ndims; u++) {
+    for(u = 0; u < space_ndims; u++) {
         elmts_per_chunk *= layout->u.chunk.dim[u];
 	chunk_dim[u] = layout->u.chunk.dim[u];
-	shrunk_dim[u] = space_dim[u] < old_dim[u];
+	shrunk_dim[u] = (space_dim[u] < old_dim[u]);
     } /* end for */
 
     /* Create a dataspace for a chunk & set the extent */
-    if(NULL == (chunk_space = H5S_create_simple((unsigned)space_ndims, chunk_dim, NULL)))
+    if(NULL == (chunk_space = H5S_create_simple(space_ndims, chunk_dim, NULL)))
 	HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "can't create simple dataspace")
 
     /* Reset hyperslab start array */
@@ -4070,9 +4740,9 @@ H5D__chunk_prune_by_extent(H5D_t *dset, hid_t dxpl_id, const hsize_t *old_dim)
     HDmemset(hyper_start, 0, sizeof(hyper_start));
 
     /* Set up chunked I/O info object, for operations on chunks (in callback)
-     * Note that we only need to set chunk_offset once, as the array's address
+     * Note that we only need to set scaled once, as the array's address
      * will never change. */
-    chk_store.chunk.offset = chunk_offset;
+    chk_store.chunk.scaled = scaled;
     H5D_BUILD_IO_INFO_RD(&chk_io_info, dset, dxpl_cache, dxpl_id, &chk_store, NULL);
 
     /* Compose chunked index info struct */
@@ -4086,7 +4756,7 @@ H5D__chunk_prune_by_extent(H5D_t *dset, hid_t dxpl_id, const hsize_t *old_dim)
     HDmemset(&udata, 0, sizeof udata);
     udata.common.layout = &layout->u.chunk;
     udata.common.storage = &layout->storage.u.chunk;
-    udata.common.rdcc = rdcc;
+    udata.common.scaled = scaled;
     udata.io_info = &chk_io_info;
     udata.idx_info = &idx_info;
     udata.space_dim = space_dim;
@@ -4100,24 +4770,27 @@ H5D__chunk_prune_by_extent(H5D_t *dset, hid_t dxpl_id, const hsize_t *old_dim)
     idx_udata.layout = &layout->u.chunk;
     idx_udata.storage = &layout->storage.u.chunk;
 
+    /* Determine if partial edge chunk filters are disabled */
+    disable_edge_filters = (layout->u.chunk.flags
+            & H5O_LAYOUT_CHUNK_DONT_FILTER_PARTIAL_BOUND_CHUNKS)
+            && (idx_info.pline->nused > 0);
+
     /*
      * Determine the chunks which need to be filled or removed
      */
-    HDmemset(min_mod_chunk_off, 0, sizeof(min_mod_chunk_off));
-    HDmemset(max_mod_chunk_off, 0, sizeof(max_mod_chunk_off));
-    for(op_dim = 0; op_dim < space_ndims; op_dim++) {
+    HDmemset(min_mod_chunk_sc, 0, sizeof(min_mod_chunk_sc));
+    HDmemset(max_mod_chunk_sc, 0, sizeof(max_mod_chunk_sc));
+    for(op_dim = 0; op_dim < (unsigned)space_ndims; op_dim++) {
         /* Calculate the largest offset of chunks that might need to be
          * modified in this dimension */
-        max_mod_chunk_off[op_dim] = chunk_dim[op_dim] * ((old_dim[op_dim] - 1)
-                / chunk_dim[op_dim]);
+        max_mod_chunk_sc[op_dim] = (old_dim[op_dim] - 1) / chunk_dim[op_dim];
 
         /* Calculate the largest offset of chunks that might need to be
          * filled in this dimension */
         if(0 == space_dim[op_dim])
-            max_fill_chunk_off[op_dim] = -1;
+            max_fill_chunk_sc[op_dim] = -1;
         else
-            max_fill_chunk_off[op_dim] = (hssize_t)(chunk_dim[op_dim]
-                    * ((MIN(space_dim[op_dim], old_dim[op_dim]) - 1)
+            max_fill_chunk_sc[op_dim] = (hssize_t)(((MIN(space_dim[op_dim], old_dim[op_dim]) - 1)
                     / chunk_dim[op_dim]));
 
         if(shrunk_dim[op_dim]) {
@@ -4125,84 +4798,109 @@ H5D__chunk_prune_by_extent(H5D_t *dset, hid_t dxpl_id, const hsize_t *old_dim)
              * modified in this dimension.  Note that this array contains
              * garbage for all dimensions which are not shrunk.  These locations
              * must not be read from! */
-            min_mod_chunk_off[op_dim] = chunk_dim[op_dim] * (space_dim[op_dim]
-                    / chunk_dim[op_dim]);
+            min_mod_chunk_sc[op_dim] = space_dim[op_dim] / chunk_dim[op_dim];
 
             /* Determine if we need to fill chunks in this dimension */
-            if((hssize_t)min_mod_chunk_off[op_dim] == max_fill_chunk_off[op_dim]) {
+            if((hssize_t)min_mod_chunk_sc[op_dim] == max_fill_chunk_sc[op_dim]) {
                 fill_dim[op_dim] = TRUE;
-                has_fill = TRUE;
+
+                /* If necessary, check if chunks in this dimension that need to
+                 * be filled are new partial edge chunks */
+                if(disable_edge_filters && old_dim[op_dim]
+                        >= (min_mod_chunk_sc[op_dim] + 1))
+                    new_unfilt_dim[op_dim] = TRUE;
+                else
+                    new_unfilt_dim[op_dim] = FALSE;
             } /* end if */
-            else
+            else {
                 fill_dim[op_dim] = FALSE;
+                new_unfilt_dim[op_dim] = FALSE;
+            } /* end else */
         } /* end if */
-        else
+        else {
             fill_dim[op_dim] = FALSE;
-    } /* end for */
+            new_unfilt_dim[op_dim] = FALSE;
+        } /* end else */
 
-    /* Check the cache for any entries that are outside the bounds.  Mark these
-     * entries as deleted so they are not flushed to disk accidentally.  This is
-     * only necessary if there are chunks that need to be filled. */
-    if(has_fill)
-        for(ent = rdcc->head; ent; ent = ent->next)
-            /* Check for chunk offset outside of new dimensions */
-            for(u = 0; u < (unsigned)space_ndims; u++)
-                if((hsize_t)ent->offset[u] >= space_dim[u]) {
-                    /* Mark the entry as "deleted" */
-                    ent->deleted = TRUE;
-                    break;
-                } /* end if */
+        /* If necessary, calculate the smallest offset of non-previously full
+         * chunks in this dimension, so we know these chunks were previously
+         * unfiltered */
+        if(disable_edge_filters)
+            min_partial_chunk_sc[op_dim] = old_dim[op_dim] / chunk_dim[op_dim];
+    } /* end for */
 
     /* Main loop: fill or remove chunks */
-    for(op_dim=0; op_dim<space_ndims; op_dim++) {
+    for(op_dim = 0; op_dim < (unsigned)space_ndims; op_dim++) {
+        hbool_t dims_outside_fill[H5O_LAYOUT_NDIMS]; /* Dimensions in chunk offset outside fill dimensions */
+        int ndims_outside_fill;         /* Number of dimensions in chunk offset outside fill dimensions */
+        hbool_t carry;                  /* Flag to indicate that chunk increment carrys to higher dimension (sorta) */
+
         /* Check if modification along this dimension is really necessary */
         if(!shrunk_dim[op_dim])
             continue;
         else {
-            HDassert((hsize_t) max_mod_chunk_off[op_dim] >= min_mod_chunk_off[op_dim]);
+            HDassert(max_mod_chunk_sc[op_dim] >= min_mod_chunk_sc[op_dim]);
 
             /* Reset the chunk offset indices */
-            HDmemset(chunk_offset, 0, ((unsigned)space_ndims * sizeof(chunk_offset[0])));
-            chunk_offset[op_dim] = min_mod_chunk_off[op_dim];
+            HDmemset(scaled, 0, (space_ndims * sizeof(scaled[0])));
+            scaled[op_dim] = min_mod_chunk_sc[op_dim];
 
             /* Initialize "dims_outside_fill" array */
             ndims_outside_fill = 0;
-            for(u = 0; u < (unsigned)space_ndims; u++)
-                if((hssize_t)chunk_offset[u] > max_fill_chunk_off[u]) {
+            for(u = 0; u < space_ndims; u++)
+                if((hssize_t)scaled[u] > max_fill_chunk_sc[u]) {
                     dims_outside_fill[u] = TRUE;
                     ndims_outside_fill++;
                 } /* end if */
                 else
                     dims_outside_fill[u] = FALSE;
+	    } /* end if */
 
-            carry = FALSE;
-        } /* end if */
-
+        carry = FALSE;
         while(!carry) {
             int i;	                        /* Local index variable */
 
-            /* Calculate the index of this chunk */
-            if(H5VM_chunk_index((unsigned)space_ndims, chunk_offset,
-                    layout->u.chunk.dim, layout->u.chunk.down_chunks,
-                    &(chk_io_info.store->chunk.index)) < 0)
-                HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't get chunk index")
+            udata.common.scaled = scaled;
 
             if(0 == ndims_outside_fill) {
                 HDassert(fill_dim[op_dim]);
-                HDassert(chunk_offset[op_dim] == min_mod_chunk_off[op_dim]);
+                HDassert(scaled[op_dim] == min_mod_chunk_sc[op_dim]);
+
+                /* Make sure this is an edge chunk */
+                HDassert(H5D__chunk_is_partial_edge_chunk(scaled, 
+                        space_ndims, space_dim, layout->u.chunk.dim));
+
+                /* Determine if the chunk just became an unfiltered chunk */
+                if(new_unfilt_dim[op_dim]) {
+                    new_unfilt_chunk = TRUE;
+                    for(u = 0; u < space_ndims; u++)
+                        if(scaled[u] == min_partial_chunk_sc[u]) {
+                            new_unfilt_chunk = FALSE;
+                            break;
+                        } /* end if */
+                } /* end if */
+
+                /* Make sure that, if we think this is a new unfiltered chunk,
+                 * it was previously not an edge chunk */
+                HDassert(!new_unfilt_dim[op_dim] || (!new_unfilt_chunk !=
+                        !H5D__chunk_is_partial_edge_chunk(scaled, 
+                            space_ndims, old_dim, layout->u.chunk.dim)));
+                HDassert(!new_unfilt_chunk || new_unfilt_dim[op_dim]);
 
                 /* Fill the unused parts of the chunk */
-                if(H5D__chunk_prune_fill(&udata) < 0)
+                if(H5D__chunk_prune_fill(&udata, new_unfilt_chunk) < 0)
                     HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to write fill value")
             } /* end if */
             else {
+                H5D_chunk_ud_t          chk_udata;          /* User data for getting chunk info */
+
 #ifndef NDEBUG
                 /* Make sure this chunk is really outside the new dimensions */
                 {
                     hbool_t outside_dim = FALSE;
 
-                    for(u = 0; u < (unsigned)space_ndims; u++)
-                        if(chunk_offset[u] >= space_dim[u]) {
+                    for(u = 0; u < space_ndims; u++)
+                        if((scaled[u] * chunk_dim[u]) >= space_dim[u]) {
                             outside_dim = TRUE;
                             break;
                         } /* end if */
@@ -4211,7 +4909,7 @@ H5D__chunk_prune_by_extent(H5D_t *dset, hid_t dxpl_id, const hsize_t *old_dim)
 #endif /* NDEBUG */
 
                 /* Check if the chunk exists in cache or on disk */
-                if(H5D__chunk_lookup(dset, dxpl_id, chunk_offset, chk_io_info.store->chunk.index, &chk_udata) < 0)
+                if(H5D__chunk_lookup(dset, dxpl_id, scaled, &chk_udata) < 0)
                     HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "error looking up chunk")
 
                 /* Evict the entry from the cache if present, but do not flush
@@ -4221,9 +4919,9 @@ H5D__chunk_prune_by_extent(H5D_t *dset, hid_t dxpl_id, const hsize_t *old_dim)
                         HGOTO_ERROR(H5E_DATASET, H5E_CANTREMOVE, FAIL, "unable to evict chunk")
 
                 /* Remove the chunk from disk, if present */
-                if(H5F_addr_defined(chk_udata.addr)) {
+                if(H5F_addr_defined(chk_udata.chunk_block.offset)) {
                     /* Update the offset in idx_udata */
-                    idx_udata.offset = chunk_offset;
+		    idx_udata.scaled = udata.common.scaled;
 
                     /* Remove the chunk from disk */
                     if((layout->storage.u.chunk.ops->remove)(&idx_info, &idx_udata) < 0)
@@ -4234,20 +4932,20 @@ H5D__chunk_prune_by_extent(H5D_t *dset, hid_t dxpl_id, const hsize_t *old_dim)
             /* Increment indices */
             carry = TRUE;
             for(i = (int)(space_ndims - 1); i >= 0; --i) {
-                chunk_offset[i] += chunk_dim[i];
-                if(chunk_offset[i] > (hsize_t) max_mod_chunk_off[i]) {
+                scaled[i]++;
+                if(scaled[i] > max_mod_chunk_sc[i]) {
                     /* Left maximum dimensions, "wrap around" and check if this
                      * dimension is no longer outside the fill dimension */
-                    if(i == op_dim) {
-                        chunk_offset[i] = min_mod_chunk_off[i];
+                    if((unsigned)i == op_dim) {
+                        scaled[i] = min_mod_chunk_sc[i];
                         if(dims_outside_fill[i] && fill_dim[i]) {
                             dims_outside_fill[i] = FALSE;
                             ndims_outside_fill--;
                         } /* end if */
                     } /* end if */
                     else {
-                        chunk_offset[i] = 0;
-                        if(dims_outside_fill[i] && max_fill_chunk_off[i] >= 0) {
+                        scaled[i] = 0;
+                        if(dims_outside_fill[i] && max_fill_chunk_sc[i] >= 0) {
                             dims_outside_fill[i] = FALSE;
                             ndims_outside_fill--;
                         } /* end if */
@@ -4255,7 +4953,7 @@ H5D__chunk_prune_by_extent(H5D_t *dset, hid_t dxpl_id, const hsize_t *old_dim)
                 } /* end if */
                 else {
                     /* Check if we just went outside the fill dimension */
-                    if(!dims_outside_fill[i] && (hssize_t)chunk_offset[i] > max_fill_chunk_off[i]) {
+                    if(!dims_outside_fill[i] && (hssize_t)scaled[i] > max_fill_chunk_sc[i]) {
                         dims_outside_fill[i] = TRUE;
                         ndims_outside_fill++;
                     } /* end if */
@@ -4267,13 +4965,13 @@ H5D__chunk_prune_by_extent(H5D_t *dset, hid_t dxpl_id, const hsize_t *old_dim)
             } /* end for */
         } /* end while(!carry) */
 
-        /* Adjust max_mod_chunk_off so we don't modify the same chunk twice.
+        /* Adjust max_mod_chunk_sc so we don't modify the same chunk twice.
          * Also check if this dimension started from 0 (and hence removed all
          * of the chunks). */
-        if(min_mod_chunk_off[op_dim] == 0)
+        if(min_mod_chunk_sc[op_dim] == 0)
             break;
         else
-            max_mod_chunk_off[op_dim] = min_mod_chunk_off[op_dim] - chunk_dim[op_dim];
+            max_mod_chunk_sc[op_dim] = min_mod_chunk_sc[op_dim] - 1;
     } /* end for(op_dim=0...) */
 
     /* Reset any cached chunk info for this dataset */
@@ -4316,8 +5014,7 @@ H5D__chunk_addrmap_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
     FUNC_ENTER_STATIC
 
     /* Compute the index for this chunk */
-    if(H5VM_chunk_index(rank, chunk_rec->offset, udata->common.layout->dim, udata->common.layout->down_chunks, &chunk_index) < 0)
-       HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, H5_ITER_ERROR, "can't get chunk index")
+    chunk_index = H5VM_array_offset_pre(rank, udata->common.layout->down_chunks, chunk_rec->scaled);
 
     /* Set it in the userdata to return */
     udata->chunk_addr[chunk_index] = chunk_rec->chunk_addr;
@@ -4346,19 +5043,20 @@ H5D__chunk_addrmap(const H5D_io_info_t *io_info, haddr_t chunk_addr[])
     H5D_chk_idx_info_t idx_info;        /* Chunked index info */
     const H5D_t *dset = io_info->dset;  /* Local pointer to dataset info */
     H5D_chunk_it_ud2_t udata;          	/* User data for iteration callback */
+    H5O_storage_chunk_t *sc = &(dset->shared->layout.storage.u.chunk);
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_PACKAGE
 
     HDassert(dset);
     HDassert(dset->shared);
+    H5D_CHUNK_STORAGE_INDEX_CHK(sc);
     HDassert(chunk_addr);
 
     /* Set up user data for B-tree callback */
     HDmemset(&udata, 0, sizeof(udata));
     udata.common.layout = &dset->shared->layout.u.chunk;
     udata.common.storage = &dset->shared->layout.storage.u.chunk;
-    udata.common.rdcc = &(dset->shared->cache.chunk);
     udata.chunk_addr = chunk_addr;
 
     /* Compose chunked index info struct */
@@ -4400,6 +5098,7 @@ H5D__chunk_delete(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5O_storage_t *storage)
     H5O_pline_t pline;                  /* I/O pipeline message */
     hbool_t pline_read = FALSE;         /* Whether the I/O pipeline message was read from the file */
     htri_t	exists;                 /* Flag if header message of interest exists */
+    H5O_storage_chunk_t *sc = &(storage->u.chunk);
     herr_t      ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_PACKAGE
@@ -4408,6 +5107,7 @@ H5D__chunk_delete(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5O_storage_t *storage)
     HDassert(f);
     HDassert(oh);
     HDassert(storage);
+    H5D_CHUNK_STORAGE_INDEX_CHK(sc);
 
     /* Check for I/O pipeline message */
     if((exists = H5O_msg_exists_oh(oh, H5O_PLINE_ID)) < 0)
@@ -4474,10 +5174,10 @@ H5D__chunk_update_cache(H5D_t *dset, hid_t dxpl_id)
 {
     H5D_rdcc_t         *rdcc = &(dset->shared->cache.chunk);	/*raw data chunk cache */
     H5D_rdcc_ent_t     *ent, *next;	/*cache entry  */
-    H5D_rdcc_ent_t     *old_ent;	/* Old cache entry  */
+    H5D_rdcc_ent_t     tmp_head;        /* Sentinel entry for temporary entry list */
+    H5D_rdcc_ent_t     *tmp_tail;       /* Tail pointer for temporary entry list */
     H5D_dxpl_cache_t _dxpl_cache;       /* Data transfer property cache buffer */
     H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
-    unsigned            rank;	        /* Current # of dimensions */
     herr_t              ret_value = SUCCEED;      /* Return value */
 
     FUNC_ENTER_PACKAGE
@@ -4486,58 +5186,90 @@ H5D__chunk_update_cache(H5D_t *dset, hid_t dxpl_id)
     HDassert(dset && H5D_CHUNKED == dset->shared->layout.type);
     HDassert(dset->shared->layout.u.chunk.ndims > 0 && dset->shared->layout.u.chunk.ndims <= H5O_LAYOUT_NDIMS);
 
-    /* Get the rank */
-    rank = dset->shared->layout.u.chunk.ndims-1;
-    HDassert(rank > 0);
-
-    /* 1-D dataset's chunks can't have their index change */
-    if(rank == 1)
-        HGOTO_DONE(SUCCEED)
+    /* Check the rank */
+    HDassert((dset->shared->layout.u.chunk.ndims - 1) > 1);
 
     /* Fill the DXPL cache values for later use */
     if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
 
+    /* Add temporary entry list to rdcc */
+    (void)HDmemset(&tmp_head, 0, sizeof(tmp_head));
+    rdcc->tmp_head = &tmp_head;
+    tmp_tail = &tmp_head;
+
     /* Recompute the index for each cached chunk that is in a dataset */
     for(ent = rdcc->head; ent; ent = next) {
-        hsize_t             idx;        /* Chunk index */
         unsigned	    old_idx;	/* Previous index number	*/
 
         /* Get the pointer to the next cache entry */
         next = ent->next;
 
-        /* Calculate the index of this chunk */
-        if(H5VM_chunk_index(rank, ent->offset, dset->shared->layout.u.chunk.dim, dset->shared->layout.u.chunk.down_chunks, &idx) < 0)
-            HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "can't get chunk index")
-
         /* Compute the index for the chunk entry */
         old_idx = ent->idx;   /* Save for later */
-        ent->idx = H5D_CHUNK_HASH(dset->shared, idx);
+        ent->idx = H5D__chunk_hash_val(dset->shared, ent->scaled);
 
         if(old_idx != ent->idx) {
+            H5D_rdcc_ent_t     *old_ent;	/* Old cache entry  */
+
             /* Check if there is already a chunk at this chunk's new location */
             old_ent = rdcc->slot[ent->idx];
             if(old_ent != NULL) {
-                HDassert(old_ent->locked == 0);
-
-                /* Check if we are removing the entry we would walk to next */
-                if(old_ent == next)
-                    next = old_ent->next;
-
-                /* Remove the old entry from the cache */
-                if(H5D__chunk_cache_evict(dset, dxpl_id, dxpl_cache, old_ent, TRUE) < 0)
-                    HGOTO_ERROR(H5E_IO, H5E_CANTFLUSH, FAIL, "unable to flush one or more raw data chunks")
+                HDassert(old_ent->locked == FALSE);
+                HDassert(old_ent->deleted == FALSE);
+
+                /* Insert the old entry into the temporary list, but do not
+                 * evict (yet).  Make sure we do not make any calls to the index
+                 * until all chunks have updated indices! */
+                HDassert(!old_ent->tmp_next);
+                HDassert(!old_ent->tmp_prev);
+                tmp_tail->tmp_next = old_ent;
+                old_ent->tmp_prev = tmp_tail;
+                tmp_tail = old_ent;
             } /* end if */
 
             /* Insert this chunk into correct location in hash table */
             rdcc->slot[ent->idx] = ent;
 
-            /* Null out previous location */
-            rdcc->slot[old_idx] = NULL;
+            /* If this chunk was previously on the temporary list and therefore
+             * not in the hash table, remove it from the temporary list.
+             * Otherwise clear the old hash table slot. */
+            if(ent->tmp_prev) {
+                HDassert(tmp_head.tmp_next);
+                HDassert(tmp_tail != &tmp_head);
+                ent->tmp_prev->tmp_next = ent->tmp_next;
+                if(ent->tmp_next) {
+                    ent->tmp_next->tmp_prev = ent->tmp_prev;
+                    ent->tmp_next = NULL;
+                } /* end if */
+                else {
+                    HDassert(tmp_tail == ent);
+                    tmp_tail = ent->tmp_prev;
+                } /* end else */
+                ent->tmp_prev = NULL;
+            } /* end if */
+            else
+                rdcc->slot[old_idx] = NULL;
         } /* end if */
     } /* end for */
 
+    /* tmp_tail is no longer needed, and will be invalidated by
+     * H5D_chunk_cache_evict anyways. */
+    tmp_tail = NULL;
+
+    /* Evict chunks that are still on the temporary list */
+    while(tmp_head.tmp_next) {
+        ent = tmp_head.tmp_next;
+
+        /* Remove the old entry from the cache */
+        if(H5D__chunk_cache_evict(dset, dxpl_id, dxpl_cache, ent, TRUE) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_CANTFLUSH, FAIL, "unable to flush one or more raw data chunks")
+    } /* end while */
+
 done:
+    /* Remove temporary list from rdcc */
+    rdcc->tmp_head = NULL;
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D__chunk_update_cache() */
 
@@ -4562,6 +5294,7 @@ H5D__chunk_copy_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
     H5D_chunk_ud_t          udata_dst;                  /* User data about new destination chunk */
     hbool_t                 is_vlen = FALSE;            /* Whether datatype is variable-length */
     hbool_t                 fix_ref = FALSE;            /* Whether to fix up references in the dest. file */
+    hbool_t                 need_insert = FALSE;    /* Whether the chunk needs to be inserted into the index */
 
     /* General information about chunk copy */
     void                    *bkg = udata->bkg;          /* Background buffer for datatype conversion */
@@ -4570,7 +5303,7 @@ H5D__chunk_copy_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
     const H5O_pline_t       *pline = udata->pline;      /* I/O pipeline for applying filters */
 
     /* needed for commpressed variable length data */
-    hbool_t                 has_filters = FALSE;        /* Whether chunk has filters */
+    hbool_t                 must_filter = FALSE;        /* Whether chunk must be filtered during copy */
     size_t                  nbytes;                     /* Size of chunk in file (in bytes) */
     H5Z_cb_t                cb_struct;                  /* Filter failure callback struct */
 
@@ -4592,9 +5325,17 @@ H5D__chunk_copy_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
     } /* end if */
 
     /* Check for filtered chunks */
-    if(pline && pline->nused) {
-        has_filters = TRUE;
-        cb_struct.func = NULL; /* no callback function when failed */
+    if((is_vlen || fix_ref) && pline && pline->nused) {
+        /* Check if we should disable filters on this chunk */
+        if(udata->common.layout->flags
+                & H5O_LAYOUT_CHUNK_DONT_FILTER_PARTIAL_BOUND_CHUNKS) {
+            /* Check if the chunk is an edge chunk, and disable filters if so */
+            if(!H5D__chunk_is_partial_edge_chunk(chunk_rec->scaled, udata->dset_ndims,
+                    udata->dset_dims, udata->common.layout->dim))
+                must_filter = TRUE;
+        } /* end if */
+        else
+            must_filter = TRUE;
     } /* end if */
 
     /* Resize the buf if it is too small to hold the data */
@@ -4624,9 +5365,10 @@ H5D__chunk_copy_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
         HGOTO_ERROR(H5E_IO, H5E_READERROR, H5_ITER_ERROR, "unable to read raw data chunk")
 
     /* Need to uncompress variable-length & reference data elements */
-    if(has_filters && (is_vlen || fix_ref)) {
+    if(must_filter) {
         unsigned filter_mask = chunk_rec->filter_mask;
 
+        cb_struct.func = NULL; /* no callback function when failed */
         if(H5Z_pipeline(pline, H5Z_FLAG_REVERSE, &filter_mask, H5Z_NO_EDC, cb_struct, &nbytes, &buf_size, &buf) < 0)
             HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, H5_ITER_ERROR, "data pipeline read failed")
     } /* end if */
@@ -4682,14 +5424,13 @@ H5D__chunk_copy_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
     /* Set up destination chunk callback information for insertion */
     udata_dst.common.layout = udata->idx_info_dst->layout;
     udata_dst.common.storage = udata->idx_info_dst->storage;
-    udata_dst.common.offset = chunk_rec->offset;
-    udata_dst.common.rdcc = NULL;
-    udata_dst.nbytes = chunk_rec->nbytes;
+    udata_dst.common.scaled = chunk_rec->scaled;
+    udata_dst.chunk_block.offset = HADDR_UNDEF;
+    udata_dst.chunk_block.length = chunk_rec->nbytes;
     udata_dst.filter_mask = chunk_rec->filter_mask;
-    udata_dst.addr = HADDR_UNDEF;
 
     /* Need to compress variable-length & reference data elements before writing to file */
-    if(has_filters && (is_vlen || fix_ref) ) {
+    if(must_filter) {
         if(H5Z_pipeline(pline, 0, &(udata_dst.filter_mask), H5Z_NO_EDC, cb_struct, &nbytes, &buf_size, &buf) < 0)
             HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, H5_ITER_ERROR, "output pipeline failed")
 #if H5_SIZEOF_SIZE_T > 4
@@ -4697,20 +5438,34 @@ H5D__chunk_copy_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
         if(nbytes > ((size_t)0xffffffff))
             HGOTO_ERROR(H5E_DATASET, H5E_BADRANGE, H5_ITER_ERROR, "chunk too large for 32-bit length")
 #endif /* H5_SIZEOF_SIZE_T > 4 */
-        H5_CHECKED_ASSIGN(udata_dst.nbytes, uint32_t, nbytes, size_t);
+        H5_CHECKED_ASSIGN(udata_dst.chunk_block.length, uint32_t, nbytes, size_t);
 	udata->buf = buf;
 	udata->buf_size = buf_size;
     } /* end if */
 
-    /* Insert chunk into the destination index */
-    if((udata->idx_info_dst->storage->ops->insert)(udata->idx_info_dst, &udata_dst) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, H5_ITER_ERROR, "unable to insert chunk into index")
+    udata_dst.chunk_idx = H5VM_array_offset_pre(udata_dst.common.layout->ndims - 1, 
+			    udata_dst.common.layout->down_chunks, udata_dst.common.scaled);
+
+    /* Allocate chunk in the file */
+    if(H5D__chunk_file_alloc(udata->idx_info_dst, NULL, &udata_dst.chunk_block, &need_insert, &udata_dst.need_modify, udata_dst.common.scaled) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert/resize chunk on chunk level")
 
     /* Write chunk data to destination file */
-    HDassert(H5F_addr_defined(udata_dst.addr));
-    if(H5F_block_write(udata->idx_info_dst->f, H5FD_MEM_DRAW, udata_dst.addr, nbytes, udata->idx_info_dst->dxpl_id, buf) < 0)
+    HDassert(H5F_addr_defined(udata_dst.chunk_block.offset));
+    if(H5F_block_write(udata->idx_info_dst->f, H5FD_MEM_DRAW, udata_dst.chunk_block.offset, nbytes, udata->idx_info_dst->dxpl_id, buf) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, H5_ITER_ERROR, "unable to write raw data to file")
 
+    /* Set metadata tag in dxpl_id */
+    H5_BEGIN_TAG(udata->idx_info_dst->dxpl_id, H5AC__COPIED_TAG, H5_ITER_ERROR);
+
+    /* Insert chunk record into index */
+    if((need_insert || udata_dst.need_modify) && udata->idx_info_dst->storage->ops->insert)
+        if((udata->idx_info_dst->storage->ops->insert)(udata->idx_info_dst, &udata_dst, NULL) < 0)
+            HGOTO_ERROR_TAG(H5E_DATASET, H5E_CANTINSERT, H5_ITER_ERROR, "unable to insert chunk addr into index")
+
+    /* Reset metadata tag in dxpl_id */
+    H5_END_TAG(H5_ITER_ERROR);
+
 done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D__chunk_copy_cb() */
@@ -4738,6 +5493,9 @@ H5D__chunk_copy(H5F_t *f_src, H5O_storage_chunk_t *storage_src,
     H5D_chunk_it_ud3_t udata;           /* User data for iteration callback */
     H5D_chk_idx_info_t idx_info_dst;    /* Dest. chunked index info */
     H5D_chk_idx_info_t idx_info_src;    /* Source chunked index info */
+    int         sndims;                 /* Rank of dataspace */
+    hsize_t     curr_dims[H5O_LAYOUT_NDIMS]; /* Curr. size of dataset dimensions */
+    hsize_t     max_dims[H5O_LAYOUT_NDIMS]; /* Curr. size of dataset dimensions */
     H5O_pline_t _pline;                 /* Temporary pipeline info */
     const H5O_pline_t *pline;           /* Pointer to pipeline info to use */
     H5T_path_t  *tpath_src_mem = NULL, *tpath_mem_dst = NULL;   /* Datatype conversion paths */
@@ -4761,9 +5519,11 @@ H5D__chunk_copy(H5F_t *f_src, H5O_storage_chunk_t *storage_src,
     /* Check args */
     HDassert(f_src);
     HDassert(storage_src);
+    H5D_CHUNK_STORAGE_INDEX_CHK(storage_src);
     HDassert(layout_src);
     HDassert(f_dst);
     HDassert(storage_dst);
+    H5D_CHUNK_STORAGE_INDEX_CHK(storage_dst);
     HDassert(ds_extent_src);
     HDassert(dt_src);
 
@@ -4781,17 +5541,15 @@ H5D__chunk_copy(H5F_t *f_src, H5O_storage_chunk_t *storage_src,
 
     /* Initialize layout information */
     {
-        hsize_t     curr_dims[H5O_LAYOUT_NDIMS];    /* Curr. size of dataset dimensions */
-        int         sndims;                 /* Rank of dataspace */
         unsigned    ndims;                  /* Rank of dataspace */
 
         /* Get the dim info for dataset */
-        if((sndims = H5S_extent_get_dims(ds_extent_src, curr_dims, NULL)) < 0)
+        if((sndims = H5S_extent_get_dims(ds_extent_src, curr_dims, max_dims)) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataspace dimensions")
         H5_CHECKED_ASSIGN(ndims, unsigned, sndims, int);
 
         /* Set the source layout chunk information */
-        if(H5D__chunk_set_info_real(layout_src, ndims, curr_dims) < 0)
+        if(H5D__chunk_set_info_real(layout_src, ndims, curr_dims, max_dims) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set layout's chunk info")
     } /* end block */
 
@@ -4921,7 +5679,6 @@ H5D__chunk_copy(H5F_t *f_src, H5O_storage_chunk_t *storage_src,
     HDmemset(&udata, 0, sizeof udata);
     udata.common.layout = layout_src;
     udata.common.storage = storage_src;
-    udata.common.rdcc = NULL;
     udata.file_src = f_src;
     udata.idx_info_dst = &idx_info_dst;
     udata.buf = buf;
@@ -4939,6 +5696,8 @@ H5D__chunk_copy(H5F_t *f_src, H5O_storage_chunk_t *storage_src,
     udata.buf_space = buf_space;
     udata.nelmts = nelmts;
     udata.pline = pline;
+    udata.dset_ndims = (unsigned)sndims;
+    udata.dset_dims = curr_dims;
     udata.cpy_info = cpy_info;
 
     /* Iterate over chunks to copy data */
@@ -4967,7 +5726,7 @@ done:
 
     /* Clean up any index information */
     if(copy_setup_done)
-        if((storage_src->ops->copy_shutdown)(storage_src, storage_dst, dxpl_id) < 0)
+        if(storage_src->ops->copy_shutdown && (storage_src->ops->copy_shutdown)(storage_src, storage_dst, dxpl_id) < 0)
             HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to shut down index copying info")
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -4988,32 +5747,69 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5D__chunk_bh_info(H5F_t *f, hid_t dxpl_id, H5O_layout_t *layout,
-    const H5O_pline_t *pline, hsize_t *index_size)
+H5D__chunk_bh_info(const H5O_loc_t *loc, hid_t dxpl_id, H5O_t *oh, H5O_layout_t *layout,
+    hsize_t *index_size)
 {
     H5D_chk_idx_info_t idx_info;        /* Chunked index info */
+    H5S_t *space = NULL;                /* Dataset's dataspace */
+    H5O_pline_t pline;                  /* I/O pipeline message */
+    H5O_storage_chunk_t *sc = &(layout->storage.u.chunk);
+    htri_t exists;                      /* Flag if header message of interest exists */
+    hbool_t idx_info_init = FALSE;      /* Whether the chunk index info has been initialized */
+    hbool_t pline_read = FALSE;         /* Whether the I/O pipeline message was read */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_PACKAGE
 
     /* Check args */
-    HDassert(f);
+    HDassert(loc);
+    HDassert(loc->file);
+    HDassert(H5F_addr_defined(loc->addr));
     HDassert(layout);
-    HDassert(pline);
+    H5D_CHUNK_STORAGE_INDEX_CHK(sc);
     HDassert(index_size);
 
+    /* Check for I/O pipeline message */
+    if((exists = H5O_msg_exists_oh(oh, H5O_PLINE_ID)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to read object header")
+    else if(exists) {
+        if(NULL == H5O_msg_read_oh(loc->file, dxpl_id, oh, H5O_PLINE_ID, &pline))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't find I/O pipeline message")
+        pline_read = TRUE;
+    } /* end else if */
+    else
+        HDmemset(&pline, 0, sizeof(pline));
+
     /* Compose chunked index info struct */
-    idx_info.f = f;
+    idx_info.f = loc->file;
     idx_info.dxpl_id = dxpl_id;
-    idx_info.pline = pline;
+    idx_info.pline = &pline;
     idx_info.layout = &layout->u.chunk;
     idx_info.storage = &layout->storage.u.chunk;
 
+    /* Get the dataspace for the dataset */
+    if(NULL == (space = H5S_read(loc, dxpl_id)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to load dataspace info from dataset header")
+
+    /* Allocate any indexing structures */
+    if(layout->storage.u.chunk.ops->init && (layout->storage.u.chunk.ops->init)(&idx_info, space, loc->addr) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize indexing information")
+    idx_info_init = TRUE;
+
     /* Get size of index structure */
-    if((layout->storage.u.chunk.ops->size)(&idx_info, index_size) < 0)
+    if(layout->storage.u.chunk.ops->size && (layout->storage.u.chunk.ops->size)(&idx_info, index_size) < 0)
 	HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve chunk index info")
 
 done:
+    /* Free resources, if they've been initialized */
+    if(idx_info_init && layout->storage.u.chunk.ops->dest &&
+            (layout->storage.u.chunk.ops->dest)(&idx_info) < 0)
+	HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to release chunk index info")
+    if(pline_read && H5O_msg_reset(H5O_PLINE_ID, &pline) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTRESET, FAIL, "unable to reset I/O pipeline message")
+    if(space && H5S_close(space) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataspace")
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D__chunk_bh_info() */
 
@@ -5033,7 +5829,6 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static int
 H5D__chunk_dump_index_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
 {
@@ -5056,7 +5851,7 @@ H5D__chunk_dump_index_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
         /* Print information about this chunk */
         HDfprintf(udata->stream,     "        0x%08x %8Zu %10a [", chunk_rec->filter_mask, chunk_rec->nbytes, chunk_rec->chunk_addr);
         for(u = 0; u < udata->ndims; u++)
-            HDfprintf(udata->stream, "%s%Hd", (u ? ", " : ""), chunk_rec->offset[u]);
+            HDfprintf(udata->stream, "%s%Hu", (u ? ", " : ""), (chunk_rec->scaled[u] * udata->chunk_dim[u]));
         HDfputs("]\n", udata->stream);
     } /* end if */
 
@@ -5081,12 +5876,14 @@ H5D__chunk_dump_index_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
 herr_t
 H5D__chunk_dump_index(H5D_t *dset, hid_t dxpl_id, FILE *stream)
 {
+    H5O_storage_chunk_t *sc = &(dset->shared->layout.storage.u.chunk);
     herr_t ret_value = SUCCEED;       /* Return value */
 
     FUNC_ENTER_PACKAGE
 
     /* Sanity check */
     HDassert(dset);
+    H5D_CHUNK_STORAGE_INDEX_CHK(sc);
 
     /* Only display info if stream is defined */
     if(stream) {
@@ -5108,6 +5905,7 @@ H5D__chunk_dump_index(H5D_t *dset, hid_t dxpl_id, FILE *stream)
         udata.stream = stream;
         udata.header_displayed = FALSE;
         udata.ndims = dset->shared->layout.u.chunk.ndims;
+        udata.chunk_dim = dset->shared->layout.u.chunk.dim;
 
         /* Iterate over index and dump chunk info */
         if((dset->shared->layout.storage.u.chunk.ops->iterate)(&idx_info, H5D__chunk_dump_index_cb, &udata) < 0)
@@ -5118,72 +5916,6 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D__chunk_dump_index() */
 
-

-/*-------------------------------------------------------------------------
- * Function:	H5D__chunk_dest
- *
- * Purpose:	Destroy the entire chunk cache by flushing dirty entries,
- *		preempting all entries, and freeing the cache itself.
- *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	Robb Matzke
- *              Thursday, May 21, 1998
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5D__chunk_dest(H5F_t *f, hid_t dxpl_id, H5D_t *dset)
-{
-    H5D_chk_idx_info_t idx_info;        /* Chunked index info */
-    H5D_dxpl_cache_t _dxpl_cache;       /* Data transfer property cache buffer */
-    H5D_dxpl_cache_t *dxpl_cache = &_dxpl_cache;   /* Data transfer property cache */
-    H5D_rdcc_t	*rdcc = &(dset->shared->cache.chunk);   /* Dataset's chunk cache */
-    H5D_rdcc_ent_t	*ent = NULL, *next = NULL;      /* Pointer to current & next cache entries */
-    int		nerrors = 0;            /* Accumulated count of errors */
-    herr_t      ret_value = SUCCEED;       /* Return value */
-
-    FUNC_ENTER_PACKAGE
-
-    HDassert(f);
-    HDassert(dset);
-
-    /* Fill the DXPL cache values for later use */
-    if(H5D__get_dxpl_cache(dxpl_id, &dxpl_cache) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't fill dxpl cache")
-
-    /* Flush all the cached chunks */
-    for(ent = rdcc->head; ent; ent = next) {
-	next = ent->next;
-	if(H5D__chunk_cache_evict(dset, dxpl_id, dxpl_cache, ent, TRUE) < 0)
-	    nerrors++;
-    } /* end for */
-    
-    /* Continue even if there are failures. */
-    if(nerrors)
-	HDONE_ERROR(H5E_IO, H5E_CANTFLUSH, FAIL, "unable to flush one or more raw data chunks")
-
-    /* Release cache structures */
-    if(rdcc->slot)
-        rdcc->slot = H5FL_SEQ_FREE(H5D_rdcc_ent_ptr_t, rdcc->slot);
-    HDmemset(rdcc, 0, sizeof(H5D_rdcc_t));
-
-    /* Compose chunked index info struct */
-    idx_info.f = f;
-    idx_info.dxpl_id = dxpl_id;
-    idx_info.pline = &dset->shared->dcpl_cache.pline;
-    idx_info.layout = &dset->shared->layout.u.chunk;
-    idx_info.storage = &dset->shared->layout.storage.u.chunk;
-
-    /* Free any index structures */
-    if(dset->shared->layout.storage.u.chunk.ops->dest &&
-            (dset->shared->layout.storage.u.chunk.ops->dest)(&idx_info) < 0)
-	HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to release chunk index info")
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5D__chunk_dest() */
-
 #ifdef H5D_CHUNK_DEBUG
 

 /*-------------------------------------------------------------------------
@@ -5324,7 +6056,7 @@ H5D__nonexistent_readvv(const H5D_io_info_t *io_info,
     size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_off_arr[])
 {
     H5D_chunk_readvv_ud_t udata;        /* User data for H5VM_opvv() operator */
-    ssize_t ret_value;                  /* Return value */
+    ssize_t ret_value = -1;             /* Return value */
 
     FUNC_ENTER_STATIC
 
@@ -5352,3 +6084,317 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5D__nonexistent_readvv() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__chunk_is_partial_edge_chunk
+ *
+ * Purpose:     Checks to see if the chunk is a partial edge chunk.
+ *              Either dset or (dset_dims and dset_ndims) must be
+ *              provided.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              19 Nov 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+H5D__chunk_is_partial_edge_chunk(const hsize_t scaled[], unsigned dset_ndims,
+    const hsize_t *dset_dims, const uint32_t *chunk_dims)
+{
+    unsigned    u;                      /* Local index variable */
+    hbool_t      ret_value = FALSE;     /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(scaled);
+    HDassert(dset_ndims > 0);
+    HDassert(dset_dims);
+    HDassert(chunk_dims);
+
+    /* check if this is a partial edge chunk */
+    for(u = 0; u < dset_ndims; u++)
+        if(((scaled[u] + 1) * chunk_dims[u]) > dset_dims[u])
+            HGOTO_DONE(TRUE);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__chunk_is_partial_edge_chunk() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__chunk_file_alloc()
+ *
+ * Purpose:     Chunk allocation:  
+ *		  Create the chunk if it doesn't exist, or reallocate the
+ *                chunk if its size changed.
+ *		  The coding is moved and modified from each index structure.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi; June 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__chunk_file_alloc(const H5D_chk_idx_info_t *idx_info, const H5F_block_t *old_chunk,
+    H5F_block_t *new_chunk, hbool_t *need_insert, hbool_t *need_modify, hsize_t scaled[])
+{
+    hbool_t alloc_chunk = FALSE;	/* Whether to allocate chunk */
+    herr_t ret_value = SUCCEED;   	/* Return value         */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(new_chunk);
+    HDassert(need_insert);
+    HDassert(need_modify);
+
+    *need_modify = FALSE; /* this is mainly for V2-btree */
+    *need_insert = FALSE;
+
+    /* Check for filters on chunks */
+    if(idx_info->pline->nused > 0) {
+
+	HDassert(idx_info->storage->idx_type != H5D_CHUNK_IDX_NONE);
+        /* Sanity/error checking block */
+        {
+            unsigned allow_chunk_size_len;          /* Allowed size of encoded chunk size */
+            unsigned new_chunk_size_len;            /* Size of encoded chunk size */
+
+            /* Compute the size required for encoding the size of a chunk, allowing
+             * for an extra byte, in case the filter makes the chunk larger.
+             */
+            allow_chunk_size_len = 1 + ((H5VM_log2_gen((uint64_t)(idx_info->layout->size)) + 8) / 8);
+            if(allow_chunk_size_len > 8)
+                allow_chunk_size_len = 8;
+
+            /* Compute encoded size of chunk */
+            new_chunk_size_len = (H5VM_log2_gen((uint64_t)(new_chunk->length)) + 8) / 8;
+            if(new_chunk_size_len > 8)
+                HGOTO_ERROR(H5E_DATASET, H5E_BADRANGE, FAIL, "encoded chunk size is more than 8 bytes?!?")
+
+            /* Check if the chunk became too large to be encoded */
+            if(new_chunk_size_len > allow_chunk_size_len)
+                HGOTO_ERROR(H5E_DATASET, H5E_BADRANGE, FAIL, "chunk size can't be encoded")
+        } /* end block */
+
+	if(old_chunk && H5F_addr_defined(old_chunk->offset)) {
+	    /* Sanity check */
+            HDassert(!H5F_addr_defined(new_chunk->offset) || H5F_addr_eq(new_chunk->offset, old_chunk->offset));
+
+            /* Check for chunk being same size */
+	    if(new_chunk->length != old_chunk->length) {
+		/* Release previous chunk */
+		/* Only free the old location if not doing SWMR writes - otherwise
+                 * we must keep the old chunk around in case a reader has an
+                 * outdated version of the B-tree node
+                 */
+		if(!(H5F_INTENT(idx_info->f) & H5F_ACC_SWMR_WRITE))
+		    if(H5MF_xfree(idx_info->f, H5FD_MEM_DRAW, idx_info->dxpl_id, old_chunk->offset, old_chunk->length) < 0)
+			HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to free chunk")
+		alloc_chunk = TRUE;
+		*need_modify = TRUE;
+	    } /* end if */
+            else {
+		/* Don't need to reallocate chunk, but send its address back up */
+                if(!H5F_addr_defined(new_chunk->offset))
+                    new_chunk->offset = old_chunk->offset;
+	    } /* end else */
+	} /* end if */
+        else {
+            HDassert(!H5F_addr_defined(new_chunk->offset));
+	    alloc_chunk = TRUE;
+        } /* end else */
+    } /* end if */
+    else {
+	HDassert(!H5F_addr_defined(new_chunk->offset));
+	HDassert(new_chunk->length == idx_info->layout->size);
+	alloc_chunk = TRUE;
+    }  /* end else */
+
+    /* Actually allocate space for the chunk in the file */
+    if(alloc_chunk) {
+	switch(idx_info->storage->idx_type) {
+	    case H5D_CHUNK_IDX_NONE:
+	    {
+		H5D_chunk_ud_t udata;
+
+		udata.common.scaled = scaled;
+                if((idx_info->storage->ops->get_addr)(idx_info, &udata) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't query chunk address")
+		new_chunk->offset = udata.chunk_block.offset;
+		HDassert(new_chunk->length == udata.chunk_block.length);
+                break;
+	    }
+
+	    case H5D_CHUNK_IDX_EARRAY:
+            case H5D_CHUNK_IDX_FARRAY:
+            case H5D_CHUNK_IDX_BT2:
+	    case H5D_CHUNK_IDX_BTREE:
+	    case H5D_CHUNK_IDX_SINGLE:
+                HDassert(new_chunk->length > 0);
+		H5_CHECK_OVERFLOW(new_chunk->length, /*From: */uint32_t, /*To: */hsize_t);
+		new_chunk->offset = H5MF_alloc(idx_info->f, H5FD_MEM_DRAW, idx_info->dxpl_id, (hsize_t)new_chunk->length);
+		if(!H5F_addr_defined(new_chunk->offset))
+		    HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "file allocation failed")
+		if(idx_info->storage->idx_type == H5D_CHUNK_IDX_BT2) {
+                    /* This can be done together with other index types when Quincy checks into H5B2_modify() */
+                    if(!(*need_modify))
+			*need_insert = TRUE;
+                } else
+		    *need_insert = TRUE;
+
+		break;
+
+	    case H5D_CHUNK_IDX_NTYPES:
+	    default:
+		HDassert(0 && "This should never be executed!");
+		break;
+	} /* end switch */
+    } /* end if */
+
+    HDassert(H5F_addr_defined(new_chunk->offset));
+
+done: 
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__chunk_file_alloc() */
+
+/*-------------------------------------------------------------------------
+ * Function:    H5D__chunk_format_convert_cb
+ *
+ * Purpose:     Callback routine to insert chunk address into v1 B-tree
+ *              chunk index.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Vailin Choi; Feb 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5D__chunk_format_convert_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
+{
+    H5D_chunk_it_ud5_t *udata = (H5D_chunk_it_ud5_t *)_udata;	/* User data */
+    H5D_chk_idx_info_t *new_idx_info;  	/* The new chunk index information */
+    H5D_chunk_ud_t  insert_udata;	/* Chunk information to be inserted */
+    haddr_t chunk_addr;			/* Chunk address */
+    size_t nbytes;			/* Chunk size */
+    void *buf = NULL;			/* Pointer to buffer of chunk data */
+    int  ret_value = H5_ITER_CONT;   	/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    new_idx_info = udata->new_idx_info;
+    H5_CHECKED_ASSIGN(nbytes, size_t, chunk_rec->nbytes, uint32_t);
+    chunk_addr = chunk_rec->chunk_addr;
+
+    if(new_idx_info->pline->nused &&
+      (new_idx_info->layout->flags & H5O_LAYOUT_CHUNK_DONT_FILTER_PARTIAL_BOUND_CHUNKS) &&
+      (H5D__chunk_is_partial_edge_chunk(chunk_rec->scaled, udata->dset_ndims, udata->dset_dims, 
+					 new_idx_info->layout->dim)) ) {
+	/* This is a partial non-filtered edge chunk */
+	/* Convert the chunk to a filtered edge chunk for v1 B-tree chunk index */
+
+	unsigned filter_mask = chunk_rec->filter_mask;
+	H5Z_cb_t  cb_struct;        	/* Filter failure callback struct */
+	size_t read_size = nbytes;	/* Bytes to read */
+
+	HDassert(read_size == new_idx_info->layout->size);
+
+	cb_struct.func = NULL; /* no callback function when failed */
+
+	/* Allocate buffer for chunk data */
+	if(NULL == (buf = H5MM_malloc(read_size)))
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, H5_ITER_ERROR, "memory allocation failed for raw data chunk")
+
+	/* Read the non-filtered edge chunk */
+	if(H5F_block_read(new_idx_info->f, H5FD_MEM_DRAW, chunk_addr, read_size, new_idx_info->dxpl_id, buf) < 0)
+	    HGOTO_ERROR(H5E_IO, H5E_READERROR, H5_ITER_ERROR, "unable to read raw data chunk")
+
+	/* Pass the chunk through the pipeline */
+	if(H5Z_pipeline(new_idx_info->pline, 0, &filter_mask, H5Z_NO_EDC, cb_struct, &nbytes, 
+			&read_size, &buf) < 0)
+	    HGOTO_ERROR(H5E_PLINE, H5E_CANTFILTER, H5_ITER_ERROR, "output pipeline failed")
+
+#if H5_SIZEOF_SIZE_T > 4
+	    /* Check for the chunk expanding too much to encode in a 32-bit value */
+	if(nbytes > ((size_t)0xffffffff))
+	    HGOTO_ERROR(H5E_DATASET, H5E_BADRANGE, H5_ITER_ERROR, "chunk too large for 32-bit length")
+#endif /* H5_SIZEOF_SIZE_T > 4 */
+
+	/* Allocate space for the filtered chunk */
+	if((chunk_addr = H5MF_alloc(new_idx_info->f, H5FD_MEM_DRAW, new_idx_info->dxpl_id, (hsize_t)nbytes)) == HADDR_UNDEF)
+	    HGOTO_ERROR(H5E_DATASET, H5E_NOSPACE, H5_ITER_ERROR, "file allocation failed for filtered chunk")
+	HDassert(H5F_addr_defined(chunk_addr));
+
+	/* Write the filtered chunk to disk */
+	if(H5F_block_write(new_idx_info->f, H5FD_MEM_DRAW, chunk_addr, nbytes, 
+		           new_idx_info->dxpl_id, buf) < 0)
+	    HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, H5_ITER_ERROR, "unable to write raw data to file")
+    }
+
+    /* Set up chunk information for insertion to chunk index */
+    insert_udata.chunk_block.offset = chunk_addr;
+    insert_udata.chunk_block.length = nbytes;
+    insert_udata.filter_mask = chunk_rec->filter_mask;
+    insert_udata.common.scaled = chunk_rec->scaled;
+    insert_udata.common.layout = new_idx_info->layout;
+    insert_udata.common.storage = new_idx_info->storage;
+
+    /* Insert chunk into the v1 B-tree chunk index */
+    if((new_idx_info->storage->ops->insert)(new_idx_info, &insert_udata, NULL) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, H5_ITER_ERROR, "unable to insert chunk addr into index")
+
+done:
+    if(buf)
+        H5MM_xfree(buf);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__chunk_format_convert_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__chunk_format_convert
+ *
+ * Purpose:     Iterate over the chunks for the current chunk index and insert the
+ *		the chunk addresses into v1 B-tree chunk index via callback.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi; Feb 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__chunk_format_convert(H5D_t *dset, H5D_chk_idx_info_t *idx_info, H5D_chk_idx_info_t *new_idx_info)
+{
+    H5D_chunk_it_ud5_t udata;		/* User data */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(dset);
+
+    /* Set up user data */
+    udata.new_idx_info = new_idx_info;
+    udata.dset_ndims = dset->shared->ndims;
+    udata.dset_dims = dset->shared->curr_dims;
+
+    /*  terate over the chunks in the current index and insert the chunk addresses into version 1 B-tree index */
+    if((dset->shared->layout.storage.u.chunk.ops->iterate)(idx_info, H5D__chunk_format_convert_cb, &udata) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_BADITER, FAIL, "unable to iterate over chunk index to chunk info")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__chunk_format_convert() */
diff --git a/src/H5Dcompact.c b/src/H5Dcompact.c
index 826daad..e2dc36f 100644
--- a/src/H5Dcompact.c
+++ b/src/H5Dcompact.c
@@ -25,7 +25,7 @@
 /* Module Setup */
 /****************/
 
-#define H5D_PACKAGE             /*suppress error about including H5Dpkg   */
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
 
 
 /***********/
@@ -70,6 +70,7 @@ static ssize_t H5D__compact_writevv(const H5D_io_info_t *io_info,
     size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_size_arr[], hsize_t dset_offset_arr[],
     size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_size_arr[], hsize_t mem_offset_arr[]);
 static herr_t H5D__compact_flush(H5D_t *dset, hid_t dxpl_id);
+static herr_t H5D__compact_dest(H5D_t *dset, hid_t dxpl_id);
 
 
 /*********************/
@@ -91,7 +92,8 @@ const H5D_layout_ops_t H5D_LOPS_COMPACT[1] = {{
     H5D__compact_readvv,
     H5D__compact_writevv,
     H5D__compact_flush,
-    NULL
+    NULL,
+    H5D__compact_dest
 }};
 
 
@@ -174,11 +176,8 @@ H5D__compact_construct(H5F_t *f, H5D_t *dset)
     hssize_t stmp_size;         /* Temporary holder for raw data size */
     hsize_t tmp_size;           /* Temporary holder for raw data size */
     hsize_t max_comp_data_size; /* Max. allowed size of compact data */
-    hsize_t dim[H5O_LAYOUT_NDIMS];      /* Current size of data in elements */
-    hsize_t max_dim[H5O_LAYOUT_NDIMS];  /* Maximum size of data in elements */
-    int ndims;                          /* Rank of dataspace */
-    int i;                              /* Local index variable */
-    herr_t ret_value = SUCCEED;         /* Return value */
+    unsigned u;                 /* Local index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
 
     FUNC_ENTER_STATIC
 
@@ -187,11 +186,9 @@ H5D__compact_construct(H5F_t *f, H5D_t *dset)
     HDassert(dset);
 
     /* Check for invalid dataset dimensions */
-    if((ndims = H5S_get_simple_extent_dims(dset->shared->space, dim, max_dim)) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataspace dimensions")
-    for(i = 0; i < ndims; i++)
-        if(max_dim[i] > dim[i])
-            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "extendible compact dataset")
+    for(u = 0; u < dset->shared->ndims; u++)
+        if(dset->shared->max_dims[u] > dset->shared->curr_dims[u])
+            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "extendible compact dataset not allowed")
 
     /*
      * Compact dataset is stored in dataset object header message of
@@ -290,7 +287,7 @@ H5D__compact_readvv(const H5D_io_info_t *io_info,
     size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_size_arr[], hsize_t dset_offset_arr[],
     size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_size_arr[], hsize_t mem_offset_arr[])
 {
-    ssize_t ret_value;                  /* Return value */
+    ssize_t ret_value = -1;     /* Return value */
 
     FUNC_ENTER_STATIC
 
@@ -331,7 +328,7 @@ H5D__compact_writevv(const H5D_io_info_t *io_info,
     size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_size_arr[], hsize_t dset_offset_arr[],
     size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_size_arr[], hsize_t mem_offset_arr[])
 {
-    ssize_t ret_value;                  /* Return value */
+    ssize_t ret_value = -1;             /* Return value */
 
     FUNC_ENTER_STATIC
 
@@ -384,6 +381,33 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5D__compact_dest
+ *
+ * Purpose:	Free the compact buffer
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, Sept 3, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__compact_dest(H5D_t *dset, hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(dset);
+
+    /* Free the buffer for the raw data for compact datasets */
+    dset->shared->layout.storage.u.compact.buf = H5MM_xfree(dset->shared->layout.storage.u.compact.buf);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__compact_dest() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    H5D__compact_copy
  *
  * Purpose:     Copy compact storage raw data from SRC file to DST file.
@@ -418,10 +442,6 @@ H5D__compact_copy(H5F_t *f_src, H5O_storage_compact_t *storage_src, H5F_t *f_dst
     HDassert(storage_dst);
     HDassert(dt_src);
 
-    /* Allocate space for destination data */
-    if(NULL == (storage_dst->buf = H5MM_malloc(storage_src->size)))
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "unable to allocate memory for compact dataset")
-
     /* Create datatype ID for src datatype, so it gets freed */
     if((tid_src = H5I_register(H5I_DATATYPE, dt_src, FALSE)) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register source file datatype")
diff --git a/src/H5Dcontig.c b/src/H5Dcontig.c
index 844632c..6276af1 100644
--- a/src/H5Dcontig.c
+++ b/src/H5Dcontig.c
@@ -27,7 +27,7 @@
 /* Module Setup */
 /****************/
 
-#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
 
 
 /***********/
@@ -96,6 +96,8 @@ typedef struct H5D_contig_writevv_ud_t {
 
 /* Layout operation callbacks */
 static herr_t H5D__contig_construct(H5F_t *f, H5D_t *dset);
+static herr_t H5D__contig_init(H5F_t *f, hid_t dxpl_id, const H5D_t *dset,
+    hid_t dapl_id);
 static herr_t H5D__contig_io_init(const H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
     hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space,
     H5D_chunk_map_t *cm);
@@ -119,7 +121,7 @@ static herr_t H5D__contig_write_one(H5D_io_info_t *io_info, hsize_t offset,
 /* Contiguous storage layout I/O ops */
 const H5D_layout_ops_t H5D_LOPS_CONTIG[1] = {{
     H5D__contig_construct,
-    NULL,
+    H5D__contig_init,
     H5D__contig_is_space_alloc,
     H5D__contig_io_init,
     H5D__contig_read,
@@ -131,6 +133,7 @@ const H5D_layout_ops_t H5D_LOPS_CONTIG[1] = {{
     H5D__contig_readvv,
     H5D__contig_writevv,
     H5D__contig_flush,
+    NULL,
     NULL
 }};
 
@@ -367,8 +370,9 @@ H5D__contig_delete(H5F_t *f, hid_t dxpl_id, const H5O_storage_t *storage)
     HDassert(storage);
 
     /* Free the file space for the chunk */
-    if(H5MF_xfree(f, H5FD_MEM_DRAW, dxpl_id, storage->u.contig.addr, storage->u.contig.size) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to free contiguous storage space")
+    if(H5F_addr_defined(storage->u.contig.addr))
+        if(H5MF_xfree(f, H5FD_MEM_DRAW, dxpl_id, storage->u.contig.addr, storage->u.contig.size) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to free contiguous storage space")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -387,7 +391,6 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
 H5D__contig_construct(H5F_t *f, H5D_t *dset)
 {
@@ -396,10 +399,7 @@ H5D__contig_construct(H5F_t *f, H5D_t *dset)
     size_t dt_size;                     /* Size of datatype */
     hsize_t tmp_size;                   /* Temporary holder for raw data size */
     size_t tmp_sieve_buf_size;          /* Temporary holder for sieve buffer size */
-    hsize_t dim[H5O_LAYOUT_NDIMS];	/* Current size of data in elements */
-    hsize_t max_dim[H5O_LAYOUT_NDIMS];  /* Maximum size of data in elements */
-    int ndims;                          /* Rank of dataspace */
-    int i;                              /* Local index variable */
+    unsigned u;                         /* Local index variable */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
@@ -415,11 +415,9 @@ H5D__contig_construct(H5F_t *f, H5D_t *dset)
      */
 
     /* Check for invalid dataset dimensions */
-    if((ndims = H5S_get_simple_extent_dims(dset->shared->space, dim, max_dim)) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize contiguous storage")
-    for(i = 0; i < ndims; i++)
-        if(max_dim[i] > dim[i])
-            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "extendible contiguous non-external dataset")
+    for(u = 0; u < dset->shared->ndims; u++)
+        if(dset->shared->max_dims[u] > dset->shared->curr_dims[u])
+            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "extendible contiguous non-external dataset not allowed")
 
     /* Retrieve the number of elements in the dataspace */
     if((snelmts = H5S_GET_EXTENT_NPOINTS(dset->shared->space)) < 0)
@@ -456,6 +454,79 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5D__contig_init
+ *
+ * Purpose:	Initialize the contiguous info for a dataset.  This is
+ *		called when the dataset is initialized.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, August 28, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__contig_init(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
+    const H5D_t *dset, hid_t H5_ATTR_UNUSED dapl_id)
+{
+    hsize_t tmp_size;                   /* Temporary holder for raw data size */
+    size_t tmp_sieve_buf_size;          /* Temporary holder for sieve buffer size */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(dset);
+
+    /* Compute the size of the contiguous storage for versions of the
+     * layout message less than version 3 because versions 1 & 2 would
+     * truncate the dimension sizes to 32-bits of information. - QAK 5/26/04
+     */
+    if(dset->shared->layout.version < 3) {
+        hssize_t snelmts;                   /* Temporary holder for number of elements in dataspace */
+        hsize_t nelmts;                     /* Number of elements in dataspace */
+        size_t dt_size;                     /* Size of datatype */
+
+        /* Retrieve the number of elements in the dataspace */
+        if((snelmts = H5S_GET_EXTENT_NPOINTS(dset->shared->space)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve number of elements in dataspace")
+        nelmts = (hsize_t)snelmts;
+
+        /* Get the datatype's size */
+        if(0 == (dt_size = H5T_GET_SIZE(dset->shared->type)))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve size of datatype")
+
+        /* Compute the size of the dataset's contiguous storage */
+        tmp_size = nelmts * dt_size;
+
+        /* Check for overflow during multiplication */
+        if(nelmts != (tmp_size / dt_size))
+            HGOTO_ERROR(H5E_DATASET, H5E_OVERFLOW, FAIL, "size of dataset's storage overflowed")
+
+        /* Assign the dataset's contiguous storage size */
+        dset->shared->layout.storage.u.contig.size = tmp_size;
+    } /* end if */
+    else
+        tmp_size = dset->shared->layout.storage.u.contig.size;
+
+    /* Get the sieve buffer size for the file */
+    tmp_sieve_buf_size = H5F_SIEVE_BUF_SIZE(dset->oloc.file);
+
+    /* Adjust the sieve buffer size to the smaller one between the dataset size and the buffer size
+     * from the file access property.  (SLU - 2012/3/30) */
+    if(tmp_size < tmp_sieve_buf_size)
+        dset->shared->cache.contig.sieve_buf_size = tmp_size;
+    else
+        dset->shared->cache.contig.sieve_buf_size = tmp_sieve_buf_size;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__contig_init() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5D__contig_is_space_alloc
  *
  * Purpose:	Query if space is allocated for layout
@@ -470,7 +541,7 @@ done:
 hbool_t
 H5D__contig_is_space_alloc(const H5O_storage_t *storage)
 {
-    hbool_t ret_value;                  /* Return value */
+    hbool_t ret_value = FALSE;          /* Return value */
 
     FUNC_ENTER_PACKAGE_NOERR
 
@@ -848,7 +919,7 @@ H5D__contig_readvv(const H5D_io_info_t *io_info,
     size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_off_arr[],
     size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_off_arr[])
 {
-    ssize_t ret_value;          /* Return value */
+    ssize_t ret_value = -1;     /* Return value */
 
     FUNC_ENTER_STATIC
 
@@ -1175,7 +1246,7 @@ H5D__contig_writevv(const H5D_io_info_t *io_info,
     size_t dset_max_nseq, size_t *dset_curr_seq, size_t dset_len_arr[], hsize_t dset_off_arr[],
     size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_off_arr[])
 {
-    ssize_t ret_value;          /* Return value (Size of sequence in bytes) */
+    ssize_t ret_value = -1;             /* Return value (Size of sequence in bytes) */
 
     FUNC_ENTER_STATIC
 
diff --git a/src/H5Ddbg.c b/src/H5Ddbg.c
index 4e934f2..34e0ae9 100644
--- a/src/H5Ddbg.c
+++ b/src/H5Ddbg.c
@@ -17,10 +17,7 @@
 /* Module Setup */
 /****************/
 
-#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5D__init_dbg_interface
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
 
 
 /***********/
@@ -61,26 +58,6 @@
 /* Local Variables */
 /*******************/
 
-

-/*--------------------------------------------------------------------------
-NAME
-   H5D__init_dbg_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5D__init_dbg_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5D_init() currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5D__init_dbg_interface(void)
-{
-    FUNC_ENTER_STATIC_NOERR
-
-    FUNC_LEAVE_NOAPI(H5D_init())
-} /* H5D__init_dbg_interface() */
 
 

 /*-------------------------------------------------------------------------
diff --git a/src/H5Ddeprec.c b/src/H5Ddeprec.c
index 0b2fee6..5a2b355 100644
--- a/src/H5Ddeprec.c
+++ b/src/H5Ddeprec.c
@@ -31,10 +31,7 @@
 /* Module Setup */
 /****************/
 
-#define H5D_PACKAGE		/*suppress error about including H5Dpkg   */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5D__init_deprec_interface
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
 
 
 /***********/
@@ -85,51 +82,6 @@ static herr_t H5D__extend(H5D_t *dataset, const hsize_t *size, hid_t dxpl_id);
 /*******************/
 
 
-

-/*--------------------------------------------------------------------------
-NAME
-   H5D__init_deprec_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5D__init_deprec_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5D_init() currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5D__init_deprec_interface(void)
-{
-    FUNC_ENTER_STATIC_NOERR
-
-    FUNC_LEAVE_NOAPI(H5D_init())
-} /* H5D__init_deprec_interface() */
-
-

-/*--------------------------------------------------------------------------
-NAME
-   H5D__term_deprec_interface -- Terminate interface
-USAGE
-    herr_t H5D__term_deprec_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Terminates interface.  (Just resets H5_interface_initialize_g
-    currently).
-
---------------------------------------------------------------------------*/
-herr_t
-H5D__term_deprec_interface(void)
-{
-    FUNC_ENTER_PACKAGE_NOERR
-
-    /* Mark closed */
-    H5_interface_initialize_g = 0;
-
-    FUNC_LEAVE_NOAPI(0)
-} /* H5D__term_deprec_interface() */
-
 #ifndef H5_NO_DEPRECATED_SYMBOLS
 

 /*-------------------------------------------------------------------------
@@ -226,15 +178,10 @@ hid_t
 H5Dopen1(hid_t loc_id, const char *name)
 {
     H5D_t       *dset = NULL;
-    H5G_loc_t	 loc;		        /* Object location of group */
-    H5G_loc_t	 dset_loc;		/* Object location of dataset */
-    H5G_name_t   path;            	/* Dataset group hier. path */
-    H5O_loc_t    oloc;            	/* Dataset object location */
-    H5O_type_t   obj_type;              /* Type of object at location */
-    hbool_t      loc_found = FALSE;     /* Location at 'name' found */
-    hid_t        dapl_id = H5P_DATASET_ACCESS_DEFAULT; /* dapl to use to open dataset */
-    hid_t        dxpl_id = H5AC_ind_dxpl_id;    /* dxpl to use to open datset */
-    hid_t        ret_value;
+    H5G_loc_t   loc;                    /* Object location of group */
+    hid_t       dapl_id = H5P_DATASET_ACCESS_DEFAULT; /* dapl to use to open dataset */
+    hid_t       dxpl_id = H5AC_ind_dxpl_id; /* dxpl to use to open datset */
+    hid_t       ret_value;
 
     FUNC_ENTER_API(FAIL)
     H5TRACE2("i", "i*s", loc_id, name);
@@ -245,41 +192,18 @@ H5Dopen1(hid_t loc_id, const char *name)
     if(!name || !*name)
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name")
 
-    /* Set up dataset location to fill in */
-    dset_loc.oloc = &oloc;
-    dset_loc.path = &path;
-    H5G_loc_reset(&dset_loc);
-
-    /* Find the dataset object */
-    if(H5G_loc_find(&loc, name, &dset_loc, H5P_DEFAULT, dxpl_id) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_NOTFOUND, FAIL, "not found")
-    loc_found = TRUE;
-
-    /* Check that the object found is the correct type */
-    if(H5O_obj_type(&oloc, &obj_type, dxpl_id) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get object type")
-    if(obj_type != H5O_TYPE_DATASET)
-        HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a dataset")
-
     /* Open the dataset */
-    if(NULL == (dset = H5D_open(&dset_loc, dapl_id, dxpl_id)))
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't open dataset")
+    if(NULL == (dset = H5D__open_name(&loc, name, dapl_id, dxpl_id)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "unable to open dataset")
 
     /* Register an atom for the dataset */
     if((ret_value = H5I_register(H5I_DATASET, dset, TRUE)) < 0)
         HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "can't register dataset atom")
 
 done:
-    if(ret_value < 0) {
-        if(dset != NULL) {
-            if(H5D_close(dset) < 0)
-                HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataset")
-        } /* end if */
-        else {
-            if(loc_found && H5G_loc_free(&dset_loc) < 0)
-                HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't free location")
-        } /* end else */
-    } /* end if */
+    if(ret_value < 0)
+        if(dset && H5D_close(dset) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataset")
 
     FUNC_LEAVE_API(ret_value)
 } /* end H5Dopen1() */
@@ -341,9 +265,7 @@ static herr_t
 H5D__extend(H5D_t *dataset, const hsize_t *size, hid_t dxpl_id)
 {
     htri_t changed;                     /* Flag to indicate that the dataspace was successfully extended */
-    H5S_t *space;                       /* Dataset's dataspace */
-    int     rank;                       /* Dataspace # of dimensions */
-    hsize_t curr_dims[H5O_LAYOUT_NDIMS];/* Current dimension sizes */
+    hsize_t old_dims[H5S_MAX_RANK];     /* Current (i.e. old, if changed) dimension sizes */
     H5O_fill_t *fill;                   /* Dataset's fill value */
     herr_t ret_value = SUCCEED;         /* Return value */
 
@@ -364,29 +286,82 @@ H5D__extend(H5D_t *dataset, const hsize_t *size, hid_t dxpl_id)
      */
 
     /* Retrieve the current dimensions */
-    space = dataset->shared->space;
-    if((rank = H5S_get_simple_extent_dims(space, curr_dims, NULL)) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset dimensions")
+    HDcompile_assert(sizeof(old_dims) == sizeof(dataset->shared->curr_dims));
+    HDmemcpy(old_dims, dataset->shared->curr_dims, H5S_MAX_RANK * sizeof(old_dims[0]));
 
     /* Increase the size of the data space */
-    if((changed = H5S_extend(space, size)) < 0)
-	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to increase size of data space")
+    if((changed = H5S_extend(dataset->shared->space, size)) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to increase size of dataspace")
 
     /* Updated the dataset's info if the dataspace was successfully extended */
     if(changed) {
+        /* Get the extended dimension sizes */
+        /* (Need to retrieve this here, since the 'size' dimensions could
+         *  extend one dimension but be smaller in a different dimension,
+         *  and the dataspace's extent is the larger of the current and
+         *  'size' dimension values. - QAK)
+         */
+        if(H5S_get_simple_extent_dims(dataset->shared->space, dataset->shared->curr_dims, NULL) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset dimensions")
+
         /* Update the index values for the cached chunks for this dataset */
         if(H5D_CHUNKED == dataset->shared->layout.type) {
+            hbool_t update_chunks = FALSE;  /* Flag to indicate chunk cache update is needed */
+
+            /* Check if we need to track & update scaled dimension information */
+            if(dataset->shared->ndims > 1) {
+                unsigned u;         /* Local indicate variable */
+
+                /* Update scaled chunk information */
+                for(u = 0; u < dataset->shared->ndims; u++) {
+                    hsize_t scaled;             /* Scaled value */
+
+                    /* Compute the scaled dimension size value */
+                    scaled = size[u] / dataset->shared->layout.u.chunk.dim[u];
+
+                    /* Check if scaled dimension size changed */
+                    if(scaled != dataset->shared->cache.chunk.scaled_dims[u]) {
+                        hsize_t scaled_power2up;      /* New size value, rounded to next power of 2 */
+
+                        /* Update the scaled dimension size value for the current dimension */
+                        dataset->shared->cache.chunk.scaled_dims[u] = scaled;
+
+                        /* Check if algorithm for computing hash values will change */
+                        if((scaled > dataset->shared->cache.chunk.nslots &&
+                                    dataset->shared->cache.chunk.scaled_dims[u] <= dataset->shared->cache.chunk.nslots)
+                                || (scaled <= dataset->shared->cache.chunk.nslots &&
+                                    dataset->shared->cache.chunk.scaled_dims[u] > dataset->shared->cache.chunk.nslots))
+                            update_chunks = TRUE;
+
+                        /* Check if the number of bits required to encode the scaled size value changed */
+                        if(dataset->shared->cache.chunk.scaled_power2up[u] != (scaled_power2up = H5VM_power2up(scaled))) {
+                            /* Update the 'power2up' & 'encode_bits' values for the current dimension */
+                            dataset->shared->cache.chunk.scaled_power2up[u] = scaled_power2up;
+                            dataset->shared->cache.chunk.scaled_encode_bits[u] = H5VM_log2_gen(scaled_power2up);
+
+                            /* Indicate that the chunk cache indices should be updated */
+                            update_chunks = TRUE;
+                        } /* end if */
+                    } /* end if */
+                } /* end for */
+            } /* end if */
+
+            /* Update general information for chunks */
             if(H5D__chunk_set_info(dataset) < 0)
                 HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to update # of chunks")
-            if(H5D__chunk_update_cache(dataset, dxpl_id) < 0)
-                HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to update cached chunk indices")
+
+            /* Check for updating chunk cache indices */
+            if(update_chunks) {
+                /* Update the chunk cache indices */
+                if(H5D__chunk_update_cache(dataset, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to update cached chunk indices")
+            } /* end if */
         } /* end if */
 
 	/* Allocate space for the new parts of the dataset, if appropriate */
         fill = &dataset->shared->dcpl_cache.fill;
         if(fill->alloc_time == H5D_ALLOC_TIME_EARLY)
-            if(H5D__alloc_storage(dataset, dxpl_id, H5D_ALLOC_EXTEND, FALSE,
-                    curr_dims) < 0)
+            if(H5D__alloc_storage(dataset, dxpl_id, H5D_ALLOC_EXTEND, FALSE, old_dims) < 0)
                 HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize dataset with fill value")
 
         /* Mark the dataspace as dirty, for later writing to the file */
diff --git a/src/H5Dearray.c b/src/H5Dearray.c
new file mode 100644
index 0000000..84c26bf
--- /dev/null
+++ b/src/H5Dearray.c
@@ -0,0 +1,1807 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer: 	Quincey Koziol <koziol at hdfgroup.org>
+ *	       	Tuesday, January 27, 2009
+ *
+ * Purpose:	Extensible array indexed (chunked) I/O functions.  The chunks
+ *              are given a single-dimensional index which is used as the
+ *              offset in an extensible array that maps a chunk coordinate to
+ *              a disk address.
+ *
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dpkg.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5EAprivate.h"	/* Extensible arrays		  	*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5MFprivate.h"	/* File space management		*/
+#include "H5VMprivate.h"        /* Vector functions			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Value to fill unset array elements with */
+#define H5D_EARRAY_FILL         HADDR_UNDEF
+#define H5D_EARRAY_FILT_FILL    {HADDR_UNDEF, 0, 0}
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Extensible array create/open user data */
+typedef struct H5D_earray_ctx_ud_t {
+    const H5F_t *f;             /* Pointer to file info */
+    uint32_t chunk_size;        /* Size of chunk (bytes) */
+} H5D_earray_ctx_ud_t;
+
+/* Extensible array callback context */
+typedef struct H5D_earray_ctx_t {
+    size_t file_addr_len;       /* Size of addresses in the file (bytes) */
+    size_t chunk_size_len;      /* Size of chunk sizes in the file (bytes) */
+} H5D_earray_ctx_t;
+
+/* User data for chunk callbacks */
+typedef struct H5D_earray_ud_t {
+    H5F_t *f;                   /* File pointer for operation */
+    hid_t dxpl_id;              /* DXPL ID for operation */
+} H5D_earray_ud_t;
+
+/* Extensible Array callback info for iteration over chunks */
+typedef struct H5D_earray_it_ud_t {
+    H5D_chunk_common_ud_t common;       /* Common info for Fixed Array user data (must be first) */
+    H5D_chunk_rec_t     chunk_rec;      /* Generic chunk record for callback */
+    hbool_t             filtered;       /* Whether the chunks are filtered */
+    H5D_chunk_cb_func_t cb;             /* Chunk callback routine */
+    void                *udata;         /* User data for chunk callback routine */
+} H5D_earray_it_ud_t;
+
+/* Native extensible array element for chunks w/filters */
+typedef struct H5D_earray_filt_elmt_t {
+    haddr_t addr;               /* Address of chunk */
+    uint32_t nbytes;            /* Size of chunk (in file) */
+    uint32_t filter_mask;       /* Excluded filters for chunk */
+} H5D_earray_filt_elmt_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+/* Extensible array iterator callbacks */
+static int H5D__earray_idx_iterate_cb(hsize_t idx, const void *_elmt, void *_udata);
+static int H5D__earray_idx_delete_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata);
+
+/* Extensible array class callbacks for chunks w/o filters */
+static void *H5D__earray_crt_context(void *udata);
+static herr_t H5D__earray_dst_context(void *ctx);
+static herr_t H5D__earray_fill(void *nat_blk, size_t nelmts);
+static herr_t H5D__earray_encode(void *raw, const void *elmt, size_t nelmts,
+    void *ctx);
+static herr_t H5D__earray_decode(const void *raw, void *elmt, size_t nelmts,
+    void *ctx);
+static herr_t H5D__earray_debug(FILE *stream, int indent, int fwidth,
+    hsize_t idx, const void *elmt);
+static void *H5D__earray_crt_dbg_context(H5F_t *f, hid_t dxpl_id, haddr_t obj_addr);
+static herr_t H5D__earray_dst_dbg_context(void *dbg_ctx);
+
+/* Extensible array class callbacks for chunks w/filters */
+/* (some shared with callbacks for chunks w/o filters) */
+static herr_t H5D__earray_filt_fill(void *nat_blk, size_t nelmts);
+static herr_t H5D__earray_filt_encode(void *raw, const void *elmt, size_t nelmts,
+    void *ctx);
+static herr_t H5D__earray_filt_decode(const void *raw, void *elmt, size_t nelmts,
+    void *ctx);
+static herr_t H5D__earray_filt_debug(FILE *stream, int indent, int fwidth,
+    hsize_t idx, const void *elmt);
+
+/* Chunked layout indexing callbacks */
+static herr_t H5D__earray_idx_init(const H5D_chk_idx_info_t *idx_info,
+    const H5S_t *space, haddr_t dset_ohdr_addr);
+static herr_t H5D__earray_idx_create(const H5D_chk_idx_info_t *idx_info);
+static hbool_t H5D__earray_idx_is_space_alloc(const H5O_storage_chunk_t *storage);
+static herr_t H5D__earray_idx_insert(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_ud_t *udata, const H5D_t *dset);
+static herr_t H5D__earray_idx_get_addr(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_ud_t *udata);
+static herr_t H5D__earray_idx_resize(H5O_layout_chunk_t *layout);
+static int H5D__earray_idx_iterate(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_cb_func_t chunk_cb, void *chunk_udata);
+static herr_t H5D__earray_idx_remove(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_common_ud_t *udata);
+static herr_t H5D__earray_idx_delete(const H5D_chk_idx_info_t *idx_info);
+static herr_t H5D__earray_idx_copy_setup(const H5D_chk_idx_info_t *idx_info_src,
+    const H5D_chk_idx_info_t *idx_info_dst);
+static herr_t H5D__earray_idx_copy_shutdown(H5O_storage_chunk_t *storage_src,
+    H5O_storage_chunk_t *storage_dst, hid_t dxpl_id);
+static herr_t H5D__earray_idx_size(const H5D_chk_idx_info_t *idx_info,
+    hsize_t *size);
+static herr_t H5D__earray_idx_reset(H5O_storage_chunk_t *storage, hbool_t reset_addr);
+static herr_t H5D__earray_idx_dump(const H5O_storage_chunk_t *storage,
+    FILE *stream);
+static herr_t H5D__earray_idx_dest(const H5D_chk_idx_info_t *idx_info);
+
+/* Generic extensible array routines */
+static herr_t H5D__earray_idx_open(const H5D_chk_idx_info_t *idx_info);
+static herr_t H5D__earray_idx_depend(const H5D_chk_idx_info_t *idx_info);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Extensible array indexed chunk I/O ops */
+const H5D_chunk_ops_t H5D_COPS_EARRAY[1] = {{
+    TRUE,                               /* Extensible array indices support SWMR access */
+    H5D__earray_idx_init,               /* init */
+    H5D__earray_idx_create,             /* create */
+    H5D__earray_idx_is_space_alloc,     /* is_space_alloc */
+    H5D__earray_idx_insert,             /* insert */
+    H5D__earray_idx_get_addr,           /* get_addr */
+    H5D__earray_idx_resize,             /* resize */
+    H5D__earray_idx_iterate,            /* iterate */
+    H5D__earray_idx_remove,             /* remove */
+    H5D__earray_idx_delete,             /* delete */
+    H5D__earray_idx_copy_setup,         /* copy_setup */
+    H5D__earray_idx_copy_shutdown,      /* copy_shutdown */
+    H5D__earray_idx_size,               /* size */
+    H5D__earray_idx_reset,              /* reset */
+    H5D__earray_idx_dump,               /* dump */
+    H5D__earray_idx_dest                /* destroy */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+/* Extensible array class callbacks for dataset chunks w/o filters */
+const H5EA_class_t H5EA_CLS_CHUNK[1]={{
+    H5EA_CLS_CHUNK_ID,          /* Type of extensible array */
+    "Chunk w/o filters",        /* Name of extensible array class */
+    sizeof(haddr_t),            /* Size of native element */
+    H5D__earray_crt_context,    /* Create context */
+    H5D__earray_dst_context,    /* Destroy context */
+    H5D__earray_fill,           /* Fill block of missing elements callback */
+    H5D__earray_encode,         /* Element encoding callback */
+    H5D__earray_decode,         /* Element decoding callback */
+    H5D__earray_debug,		/* Element debugging callback */
+    H5D__earray_crt_dbg_context, /* Create debugging context */
+    H5D__earray_dst_dbg_context  /* Destroy debugging context */
+}};
+
+/* Extensible array class callbacks for dataset chunks w/filters */
+const H5EA_class_t H5EA_CLS_FILT_CHUNK[1]={{
+    H5EA_CLS_FILT_CHUNK_ID,     /* Type of extensible array */
+    "Chunk w/filters",          /* Name of extensible array class */
+    sizeof(H5D_earray_filt_elmt_t), /* Size of native element */
+    H5D__earray_crt_context,    /* Create context */
+    H5D__earray_dst_context,    /* Destroy context */
+    H5D__earray_filt_fill,      /* Fill block of missing elements callback */
+    H5D__earray_filt_encode,    /* Element encoding callback */
+    H5D__earray_filt_decode,    /* Element decoding callback */
+    H5D__earray_filt_debug,     /* Element debugging callback */
+    H5D__earray_crt_dbg_context, /* Create debugging context */
+    H5D__earray_dst_dbg_context  /* Destroy debugging context */
+}};
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5D_earray_ctx_t struct */
+/* Declare a free list to manage the H5D_earray_ctx_ud_t struct */
+H5FL_DEFINE_STATIC(H5D_earray_ctx_t);
+H5FL_DEFINE_STATIC(H5D_earray_ctx_ud_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_crt_context
+ *
+ * Purpose:	Create context for callbacks
+ *
+ * Return:	Success:	non-NULL
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 29, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5D__earray_crt_context(void *_udata)
+{
+    H5D_earray_ctx_t *ctx;      /* Extensible array callback context */
+    H5D_earray_ctx_ud_t *udata = (H5D_earray_ctx_ud_t *)_udata; /* User data for extensible array context */
+    void *ret_value = NULL;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(udata);
+    HDassert(udata->f);
+    HDassert(udata->chunk_size > 0);
+
+    /* Allocate new context structure */
+    if(NULL == (ctx = H5FL_MALLOC(H5D_earray_ctx_t)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, NULL, "can't allocate extensible array client callback context")
+
+    /* Initialize the context */
+    ctx->file_addr_len = H5F_SIZEOF_ADDR(udata->f);
+
+    /* Compute the size required for encoding the size of a chunk, allowing
+     *      for an extra byte, in case the filter makes the chunk larger.
+     */
+    ctx->chunk_size_len = 1 + ((H5VM_log2_gen((uint64_t)udata->chunk_size) + 8) / 8);
+    if(ctx->chunk_size_len > 8)
+        ctx->chunk_size_len = 8;
+
+    /* Set return value */
+    ret_value = ctx;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__earray_crt_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_dst_context
+ *
+ * Purpose:	Destroy context for callbacks
+ *
+ * Return:	Success:	non-NULL
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 29, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_dst_context(void *_ctx)
+{
+    H5D_earray_ctx_t *ctx = (H5D_earray_ctx_t *)_ctx;   /* Extensible array callback context */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(ctx);
+
+    /* Release context structure */
+    ctx = H5FL_FREE(H5D_earray_ctx_t, ctx);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__earray_dst_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_fill
+ *
+ * Purpose:	Fill "missing elements" in block of elements
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, January 27, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_fill(void *nat_blk, size_t nelmts)
+{
+    haddr_t fill_val = H5D_EARRAY_FILL;          /* Value to fill elements with */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(nat_blk);
+    HDassert(nelmts);
+
+    H5VM_array_fill(nat_blk, &fill_val, H5EA_CLS_CHUNK->nat_elmt_size, nelmts);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__earray_fill() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_encode
+ *
+ * Purpose:	Encode an element from "native" to "raw" form
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, January 27, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_encode(void *raw, const void *_elmt, size_t nelmts, void *_ctx)
+{
+    H5D_earray_ctx_t *ctx = (H5D_earray_ctx_t *)_ctx;   /* Extensible array callback context */
+    const haddr_t *elmt = (const haddr_t *)_elmt;     /* Convenience pointer to native elements */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(raw);
+    HDassert(elmt);
+    HDassert(nelmts);
+    HDassert(ctx);
+
+    /* Encode native elements into raw elements */
+    while(nelmts) {
+        /* Encode element */
+        /* (advances 'raw' pointer) */
+        H5F_addr_encode_len(ctx->file_addr_len, (uint8_t **)&raw, *elmt);
+
+        /* Advance native element pointer */
+        elmt++;
+
+        /* Decrement # of elements to encode */
+        nelmts--;
+    } /* end while */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__earray_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_decode
+ *
+ * Purpose:	Decode an element from "raw" to "native" form
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 29, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_decode(const void *_raw, void *_elmt, size_t nelmts, void *_ctx)
+{
+    H5D_earray_ctx_t *ctx = (H5D_earray_ctx_t *)_ctx;   /* Extensible array callback context */
+    haddr_t *elmt = (haddr_t *)_elmt;           /* Convenience pointer to native elements */
+    const uint8_t *raw = (const uint8_t *)_raw; /* Convenience pointer to raw elements */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(raw);
+    HDassert(elmt);
+    HDassert(nelmts);
+
+    /* Decode raw elements into native elements */
+    while(nelmts) {
+        /* Decode element */
+        /* (advances 'raw' pointer) */
+        H5F_addr_decode_len(ctx->file_addr_len, &raw, elmt);
+
+        /* Advance native element pointer */
+        elmt++;
+
+        /* Decrement # of elements to decode */
+        nelmts--;
+    } /* end while */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__earray_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_debug
+ *
+ * Purpose:	Display an element for debugging
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 29, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_debug(FILE *stream, int indent, int fwidth, hsize_t idx,
+    const void *elmt)
+{
+    char temp_str[128];     /* Temporary string, for formatting */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(stream);
+    HDassert(elmt);
+
+    /* Print element */
+    sprintf(temp_str, "Element #%llu:", (unsigned long long)idx);
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth, temp_str,
+        *(const haddr_t *)elmt);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__earray_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_filt_fill
+ *
+ * Purpose:	Fill "missing elements" in block of elements
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, January 31, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_filt_fill(void *nat_blk, size_t nelmts)
+{
+    H5D_earray_filt_elmt_t fill_val = H5D_EARRAY_FILT_FILL;     /* Value to fill elements with */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(nat_blk);
+    HDassert(nelmts);
+    HDassert(sizeof(fill_val) == H5EA_CLS_FILT_CHUNK->nat_elmt_size);
+
+    H5VM_array_fill(nat_blk, &fill_val, H5EA_CLS_FILT_CHUNK->nat_elmt_size, nelmts);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__earray_filt_fill() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_filt_encode
+ *
+ * Purpose:	Encode an element from "native" to "raw" form
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, January 31, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_filt_encode(void *_raw, const void *_elmt, size_t nelmts, void *_ctx)
+{
+    H5D_earray_ctx_t *ctx = (H5D_earray_ctx_t *)_ctx;   /* Extensible array callback context */
+    uint8_t *raw = (uint8_t *)_raw;             /* Convenience pointer to raw elements */
+    const H5D_earray_filt_elmt_t *elmt = (const H5D_earray_filt_elmt_t *)_elmt;     /* Convenience pointer to native elements */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(raw);
+    HDassert(elmt);
+    HDassert(nelmts);
+    HDassert(ctx);
+
+    /* Encode native elements into raw elements */
+    while(nelmts) {
+        /* Encode element */
+        /* (advances 'raw' pointer) */
+        H5F_addr_encode_len(ctx->file_addr_len, &raw, elmt->addr);
+        UINT64ENCODE_VAR(raw, elmt->nbytes, ctx->chunk_size_len);
+        UINT32ENCODE(raw, elmt->filter_mask);
+
+        /* Advance native element pointer */
+        elmt++;
+
+        /* Decrement # of elements to encode */
+        nelmts--;
+    } /* end while */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__earray_filt_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_filt_decode
+ *
+ * Purpose:	Decode an element from "raw" to "native" form
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, January 31, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_filt_decode(const void *_raw, void *_elmt, size_t nelmts, void *_ctx)
+{
+    H5D_earray_ctx_t *ctx = (H5D_earray_ctx_t *)_ctx;   /* Extensible array callback context */
+    H5D_earray_filt_elmt_t *elmt = (H5D_earray_filt_elmt_t *)_elmt;           /* Convenience pointer to native elements */
+    const uint8_t *raw = (const uint8_t *)_raw; /* Convenience pointer to raw elements */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(raw);
+    HDassert(elmt);
+    HDassert(nelmts);
+
+    /* Decode raw elements into native elements */
+    while(nelmts) {
+        /* Decode element */
+        /* (advances 'raw' pointer) */
+        H5F_addr_decode_len(ctx->file_addr_len, &raw, &elmt->addr);
+        UINT64DECODE_VAR(raw, elmt->nbytes, ctx->chunk_size_len);
+        UINT32DECODE(raw, elmt->filter_mask);
+
+        /* Advance native element pointer */
+        elmt++;
+
+        /* Decrement # of elements to decode */
+        nelmts--;
+    } /* end while */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__earray_filt_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_filt_debug
+ *
+ * Purpose:	Display an element for debugging
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, January 31, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_filt_debug(FILE *stream, int indent, int fwidth, hsize_t idx,
+    const void *_elmt)
+{
+    const H5D_earray_filt_elmt_t *elmt = (const H5D_earray_filt_elmt_t *)_elmt;           /* Convenience pointer to native elements */
+    char temp_str[128];     /* Temporary string, for formatting */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(stream);
+    HDassert(elmt);
+
+    /* Print element */
+    sprintf(temp_str, "Element #%llu:", (unsigned long long)idx);
+    HDfprintf(stream, "%*s%-*s {%a, %u, %0x}\n", indent, "", fwidth, temp_str,
+        elmt->addr, elmt->nbytes, elmt->filter_mask);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__earray_filt_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_crt_dbg_context
+ *
+ * Purpose:	Create context for debugging callback
+ *		(get the layout message in the specified object header)
+ *
+ * Return:	Success:	non-NULL
+ *		Failure:	NULL
+ *
+ * Programmer:	Vailin Choi; July 2010
+ *		
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5D__earray_crt_dbg_context(H5F_t *f, hid_t dxpl_id, haddr_t obj_addr)
+{
+    H5D_earray_ctx_ud_t	*dbg_ctx = NULL;   /* Context for fixed array callback */
+    H5O_loc_t obj_loc;          /* Pointer to an object's location */
+    hbool_t obj_opened = FALSE; /* Flag to indicate that the object header was opened */
+    H5O_layout_t layout;        /* Layout message */
+    void *ret_value = NULL;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(H5F_addr_defined(obj_addr));
+
+    /* Allocate context for debugging callback */
+    if(NULL == (dbg_ctx = H5FL_MALLOC(H5D_earray_ctx_ud_t)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, NULL, "can't allocate extensible array client callback context")
+
+    /* Set up the object header location info */
+    H5O_loc_reset(&obj_loc);
+    obj_loc.file = f;
+    obj_loc.addr = obj_addr;
+
+    /* Open the object header where the layout message resides */
+    if(H5O_open(&obj_loc) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, NULL, "can't open object header")
+    obj_opened = TRUE;
+
+    /* Read the layout message */
+    if(NULL == H5O_msg_read(&obj_loc, H5O_LAYOUT_ID, &layout, dxpl_id))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, NULL, "can't get layout info")
+
+    /* close the object header */
+    if(H5O_close(&obj_loc) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, NULL, "can't close object header")
+
+    /* Create user data */
+    dbg_ctx->f = f;
+    dbg_ctx->chunk_size = layout.u.chunk.size;
+
+    /* Set return value */
+    ret_value = dbg_ctx;
+
+done:
+    /* Cleanup on error */
+    if(ret_value == NULL) {
+        /* Release context structure */
+        if(dbg_ctx)
+            dbg_ctx = H5FL_FREE(H5D_earray_ctx_ud_t, dbg_ctx);
+
+        /* Close object header */
+        if(obj_opened) {
+            if(H5O_close(&obj_loc) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, NULL, "can't close object header")
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__earray_crt_dbg_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_dst_dbg_context
+ *
+ * Purpose:	Destroy context for debugging callback
+ *		(free the layout message from the specified object header)
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi; July 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_dst_dbg_context(void *_dbg_ctx)
+{
+    H5D_earray_ctx_ud_t	*dbg_ctx = (H5D_earray_ctx_ud_t	*)_dbg_ctx; /* Context for extensible array callback */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(dbg_ctx);
+
+    /* Release context structure */
+    dbg_ctx = H5FL_FREE(H5D_earray_ctx_ud_t, dbg_ctx);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__earray_dst_dbg_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_idx_depend
+ *
+ * Purpose:	Create flush dependency between extensible array and dataset's
+ *              object header.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, June  2, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_idx_depend(const H5D_chk_idx_info_t *idx_info)
+{
+    H5O_loc_t oloc;                     /* Temporary object header location for dataset */
+    H5O_proxy_t *oh_proxy = NULL;       /* Dataset's object header proxy */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(H5F_INTENT(idx_info->f) & H5F_ACC_SWMR_WRITE);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(H5D_CHUNK_IDX_EARRAY == idx_info->layout->idx_type);
+    HDassert(idx_info->storage);
+    HDassert(H5D_CHUNK_IDX_EARRAY == idx_info->storage->idx_type);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(idx_info->storage->u.earray.ea);
+
+    /* Set up object header location for dataset */
+    H5O_loc_reset(&oloc);
+    oloc.file = idx_info->f;
+    oloc.addr = idx_info->storage->u.earray.dset_ohdr_addr;
+
+    /* Pin the dataset's object header proxy */
+    if(NULL == (oh_proxy = H5O_pin_flush_dep_proxy(&oloc, idx_info->dxpl_id)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTPIN, FAIL, "unable to pin dataset object header proxy")
+
+    /* Make the extensible array a child flush dependency of the dataset's object header */
+    if(H5EA_depend((H5AC_info_t *)oh_proxy, idx_info->storage->u.earray.ea) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTDEPEND, FAIL, "unable to create flush dependency on object header")
+
+done:
+    /* Unpin the dataset's object header proxy */
+    if(oh_proxy && H5O_unpin_flush_dep_proxy(oh_proxy) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTUNPIN, FAIL, "unable to unpin dataset object header proxy")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__earray_idx_depend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_idx_open
+ *
+ * Purpose:	Opens an existing extensible array.
+ *
+ * Note:	This information is passively initialized from each index
+ *              operation callback because those abstract chunk index operations
+ *              are designed to work with the v1 B-tree chunk indices also,
+ *              which don't require an 'open' for the data structure.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, January 29, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_idx_open(const H5D_chk_idx_info_t *idx_info)
+{
+    H5D_earray_ctx_ud_t udata;          /* User data for extensible array open call */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(H5D_CHUNK_IDX_EARRAY == idx_info->layout->idx_type);
+    HDassert(idx_info->storage);
+    HDassert(H5D_CHUNK_IDX_EARRAY == idx_info->storage->idx_type);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(NULL == idx_info->storage->u.earray.ea);
+
+    /* Set up the user data */
+    udata.f = idx_info->f;
+    udata.chunk_size = idx_info->layout->size;
+
+    /* Open the extensible array for the chunk index */
+    if(NULL == (idx_info->storage->u.earray.ea = H5EA_open(idx_info->f, idx_info->dxpl_id, idx_info->storage->idx_addr, &udata)))
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't open extensible array")
+
+    /* Check for SWMR writes to the file */
+    if(H5F_INTENT(idx_info->f) & H5F_ACC_SWMR_WRITE)
+        if(H5D__earray_idx_depend(idx_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTDEPEND, FAIL, "unable to create flush dependency on object header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__earray_idx_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_idx_init
+ *
+ * Purpose:	Initialize the indexing information for a dataset.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Wednesday, May 27, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_idx_init(const H5D_chk_idx_info_t *idx_info, const H5S_t *space,
+    haddr_t dset_ohdr_addr)
+{
+    hsize_t max_dims[H5O_LAYOUT_NDIMS];    /* Max. size of dataset dimensions */
+    int unlim_dim;              /* Rank of the dataset's unlimited dimension */
+    int sndims;                 /* Rank of dataspace */
+    unsigned ndims;             /* Rank of dataspace */
+    unsigned u;                 /* Local index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(space);
+    HDassert(H5F_addr_defined(dset_ohdr_addr));
+
+    /* Get the dim info for dataset */
+    if((sndims = H5S_get_simple_extent_dims(space, NULL, max_dims)) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataspace dimensions")
+    H5_CHECKED_ASSIGN(ndims, unsigned, sndims, int);
+
+    /* Find the rank of the unlimited dimension */
+    unlim_dim = (-1);
+    for(u = 0; u < ndims; u++) {
+        /* Check for unlimited dimension */
+        if(H5S_UNLIMITED == max_dims[u]) {
+            /* Check if we've already found an unlimited dimension */
+            if(unlim_dim >= 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_ALREADYINIT, FAIL, "already found unlimited dimension")
+
+            /* Set the unlimited dimension */
+            unlim_dim = (int)u;
+        } /* end if */
+    } /* end for */
+
+    /* Check if we didn't find an unlimited dimension */
+    if(unlim_dim < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_UNINITIALIZED, FAIL, "didn't find unlimited dimension")
+
+    /* Set the unlimited dimension for the layout's future use */
+    idx_info->layout->u.earray.unlim_dim = (unsigned)unlim_dim;
+
+    /* Store the dataset's object header address for later */
+    idx_info->storage->u.earray.dset_ohdr_addr = dset_ohdr_addr;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__earray_idx_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_idx_create
+ *
+ * Purpose:	Creates a new indexed-storage extensible array and initializes
+ *              the layout struct with information about the storage.  The
+ *		struct should be immediately written to the object header.
+ *
+ *		This function must be called before passing LAYOUT to any of
+ *		the other indexed storage functions!
+ *
+ * Return:	Non-negative on success (with the LAYOUT argument initialized
+ *		and ready to write to an object header). Negative on failure.
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, January 27, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_idx_create(const H5D_chk_idx_info_t *idx_info)
+{
+    H5EA_create_t cparam;               /* Extensible array creation parameters */
+    H5D_earray_ctx_ud_t udata;          /* User data for extensible array create call */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(!H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(NULL == idx_info->storage->u.earray.ea);
+
+    /* General parameters */
+    if(idx_info->pline->nused > 0) {
+        unsigned chunk_size_len;        /* Size of encoded chunk size */
+        
+        /* Compute the size required for encoding the size of a chunk, allowing
+         *      for an extra byte, in case the filter makes the chunk larger.
+         */
+        chunk_size_len = 1 + ((H5VM_log2_gen((uint64_t)idx_info->layout->size) + 8) / 8);
+        if(chunk_size_len > 8)
+            chunk_size_len = 8;
+
+        cparam.cls = H5EA_CLS_FILT_CHUNK;
+        cparam.raw_elmt_size = (uint8_t)(H5F_SIZEOF_ADDR(idx_info->f) + chunk_size_len + 4);
+    } /* end if */
+    else {
+        cparam.cls = H5EA_CLS_CHUNK;
+        cparam.raw_elmt_size = (uint8_t)H5F_SIZEOF_ADDR(idx_info->f);
+    } /* end else */
+    cparam.max_nelmts_bits = idx_info->layout->u.earray.cparam.max_nelmts_bits;
+    HDassert(cparam.max_nelmts_bits > 0);
+    cparam.idx_blk_elmts = idx_info->layout->u.earray.cparam.idx_blk_elmts;
+    HDassert(cparam.idx_blk_elmts > 0);
+    cparam.sup_blk_min_data_ptrs = idx_info->layout->u.earray.cparam.sup_blk_min_data_ptrs;
+    HDassert(cparam.sup_blk_min_data_ptrs > 0);
+    cparam.data_blk_min_elmts = idx_info->layout->u.earray.cparam.data_blk_min_elmts;
+    HDassert(cparam.data_blk_min_elmts > 0);
+    cparam.max_dblk_page_nelmts_bits = idx_info->layout->u.earray.cparam.max_dblk_page_nelmts_bits;
+    HDassert(cparam.max_dblk_page_nelmts_bits > 0);
+
+    /* Set up the user data */
+    udata.f = idx_info->f;
+    udata.chunk_size = idx_info->layout->size;
+
+    /* Create the extensible array for the chunk index */
+    if(NULL == (idx_info->storage->u.earray.ea = H5EA_create(idx_info->f, idx_info->dxpl_id, &cparam, &udata)))
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't create extensible array")
+
+    /* Get the address of the extensible array in file */
+    if(H5EA_get_addr(idx_info->storage->u.earray.ea, &(idx_info->storage->idx_addr)) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't query extensible array address")
+
+    /* Check for SWMR writes to the file */
+    if(H5F_INTENT(idx_info->f) & H5F_ACC_SWMR_WRITE)
+        if(H5D__earray_idx_depend(idx_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTDEPEND, FAIL, "unable to create flush dependency on object header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__earray_idx_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_idx_is_space_alloc
+ *
+ * Purpose:	Query if space is allocated for index method
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Thursday, January 29, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+H5D__earray_idx_is_space_alloc(const H5O_storage_chunk_t *storage)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(storage);
+
+    FUNC_LEAVE_NOAPI((hbool_t)H5F_addr_defined(storage->idx_addr))
+} /* end H5D__earray_idx_is_space_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_idx_insert
+ *
+ * Purpose:	Insert chunk address into the indexing structure.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; May 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_idx_insert(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *udata,
+    const H5D_t H5_ATTR_UNUSED *dset)
+{
+    H5EA_t      *ea;                    /* Pointer to extensible array structure */
+    herr_t	ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(udata);
+
+    /* Check if the extensible array is open yet */
+    if(NULL == idx_info->storage->u.earray.ea)
+        /* Open the extensible array in file */
+        if(H5D__earray_idx_open(idx_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't open extensible array")
+
+    /* Set convenience pointer to extensible array structure */
+    ea = idx_info->storage->u.earray.ea;
+
+    if(!H5F_addr_defined(udata->chunk_block.offset))
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "The chunk should have allocated already")
+    if(udata->chunk_idx != (udata->chunk_idx & 0xffffffff)) /* negative value */
+	HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "chunk index must be less than 2^32")
+
+    /* Check for filters on chunks */
+    if(idx_info->pline->nused > 0) {
+	H5D_earray_filt_elmt_t elmt;            /* Extensible array element */
+
+	elmt.addr = udata->chunk_block.offset;
+        H5_CHECKED_ASSIGN(elmt.nbytes, uint32_t, udata->chunk_block.length, hsize_t);
+	elmt.filter_mask = udata->filter_mask;
+
+	/* Set the info for the chunk */
+	if(H5EA_set(ea, idx_info->dxpl_id, udata->chunk_idx, &elmt) < 0)
+	    HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set chunk info")
+    } /* end if */
+    else {
+	/* Set the address for the chunk */
+	if(H5EA_set(ea, idx_info->dxpl_id, udata->chunk_idx, &udata->chunk_block.offset) < 0)
+	    HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set chunk address")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__earray_idx_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_idx_get_addr
+ *
+ * Purpose:	Get the file address of a chunk if file space has been
+ *		assigned.  Save the retrieved information in the udata
+ *		supplied.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 29, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_idx_get_addr(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *udata)
+{
+    H5EA_t      *ea;                    /* Pointer to extensible array structure */
+    hsize_t     idx;                    /* Array index of chunk */
+    herr_t	ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(udata);
+
+    /* Check if the extensible array is open yet */
+    if(NULL == idx_info->storage->u.earray.ea)
+        /* Open the extensible array in file */
+        if(H5D__earray_idx_open(idx_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't open extensible array")
+
+    /* Set convenience pointer to extensible array structure */
+    ea = idx_info->storage->u.earray.ea;
+
+    /* Check for unlimited dim. not being the slowest-changing dim. */
+    if(idx_info->layout->u.earray.unlim_dim > 0) {
+        hsize_t swizzled_coords[H5O_LAYOUT_NDIMS];	/* swizzled chunk coordinates */
+        unsigned ndims = (idx_info->layout->ndims - 1); /* Number of dimensions */
+	unsigned u;
+
+	/* Compute coordinate offset from scaled offset */
+	for(u = 0; u < ndims; u++)
+	    swizzled_coords[u] = udata->common.scaled[u] * idx_info->layout->dim[u];
+
+        H5VM_swizzle_coords(hsize_t, swizzled_coords, idx_info->layout->u.earray.unlim_dim);
+
+        /* Calculate the index of this chunk */
+        idx = H5VM_chunk_index(ndims, swizzled_coords, idx_info->layout->u.earray.swizzled_dim, idx_info->layout->u.earray.swizzled_down_chunks);
+    } /* end if */
+    else {
+        /* Calculate the index of this chunk */
+        idx = H5VM_array_offset_pre((idx_info->layout->ndims - 1), idx_info->layout->down_chunks, udata->common.scaled);
+    } /* end else */
+
+    udata->chunk_idx = idx;
+
+    /* Check for filters on chunks */
+    if(idx_info->pline->nused > 0) {
+        H5D_earray_filt_elmt_t elmt;            /* Extensible array element */
+
+        /* Get the information for the chunk */
+        if(H5EA_get(ea, idx_info->dxpl_id, idx, &elmt) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get chunk info")
+
+        /* Set the info for the chunk */
+        udata->chunk_block.offset = elmt.addr;
+        udata->chunk_block.length = elmt.nbytes;
+        udata->filter_mask = elmt.filter_mask;
+    } /* end if */
+    else {
+        /* Get the address for the chunk */
+        if(H5EA_get(ea, idx_info->dxpl_id, idx, &udata->chunk_block.offset) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get chunk address")
+
+        /* Update the other (constant) information for the chunk */
+	udata->chunk_block.length = idx_info->layout->size;
+        udata->filter_mask = 0;
+    } /* end else */
+
+    if(!H5F_addr_defined(udata->chunk_block.offset))
+	udata->chunk_block.length = 0;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__earray_idx_get_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_idx_resize
+ *
+ * Purpose:	Calculate/setup the swizzled down chunk array, used for chunk
+ *              index calculations.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, July 23, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_idx_resize(H5O_layout_chunk_t *layout)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(layout);
+
+    /* "Swizzle" constant dimensions for this dataset */
+    if(layout->u.earray.unlim_dim > 0) {
+        hsize_t swizzled_chunks[H5O_LAYOUT_NDIMS];    /* Swizzled form of # of chunks in each dimension */
+
+        /* Get the swizzled chunk dimensions */
+        HDmemcpy(layout->u.earray.swizzled_dim, layout->dim, (layout->ndims - 1) * sizeof(layout->dim[0]));
+        H5VM_swizzle_coords(uint32_t, layout->u.earray.swizzled_dim, layout->u.earray.unlim_dim);
+
+        /* Get the swizzled number of chunks in each dimension */
+        HDmemcpy(swizzled_chunks, layout->chunks, (layout->ndims - 1) * sizeof(swizzled_chunks[0]));
+        H5VM_swizzle_coords(hsize_t, swizzled_chunks, layout->u.earray.unlim_dim);
+
+        /* Get the swizzled "down" sizes for each dimension */
+        if(H5VM_array_down((layout->ndims - 1), swizzled_chunks, layout->u.earray.swizzled_down_chunks) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't compute swizzled 'down' chunk size value")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__earray_idx_resize() */
+
+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_idx_iterate_cb
+ *
+ * Purpose:	Callback routine for extensible array element iteration.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; Feb 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5D__earray_idx_iterate_cb(hsize_t H5_ATTR_UNUSED idx, const void *_elmt, void *_udata)
+{
+    H5D_earray_it_ud_t   *udata = (H5D_earray_it_ud_t *)_udata; /* User data */
+    unsigned ndims;                 /* Rank of chunk */
+    int curr_dim;                   /* Current dimension */
+    int ret_value = H5_ITER_CONT;   /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Compose generic chunk record for callback */
+    if(udata->filtered) {
+        const H5D_earray_filt_elmt_t *filt_elmt = (const H5D_earray_filt_elmt_t *)_elmt;
+
+        udata->chunk_rec.chunk_addr = filt_elmt->addr;
+        udata->chunk_rec.nbytes = filt_elmt->nbytes;
+        udata->chunk_rec.filter_mask = filt_elmt->filter_mask;
+    } /* end if */
+    else
+        udata->chunk_rec.chunk_addr = *(const haddr_t *)_elmt;
+
+    /* Make "generic chunk" callback */
+    if(H5F_addr_defined(udata->chunk_rec.chunk_addr))
+	if((ret_value = (udata->cb)(&udata->chunk_rec, udata->udata)) < 0)
+	    HERROR(H5E_DATASET, H5E_CALLBACK, "failure in generic chunk iterator callback");
+
+    /* Update coordinates of chunk in dataset */
+    ndims = udata->common.layout->ndims - 1;
+    HDassert(ndims > 0);
+    curr_dim = (int)(ndims - 1);
+    while(curr_dim >= 0) {
+        /* Increment coordinate in current dimension */
+        udata->chunk_rec.scaled[curr_dim]++;
+
+        /* Check if we went off the end of the current dimension */
+        if(udata->chunk_rec.scaled[curr_dim] >= udata->common.layout->chunks[curr_dim]) {
+            /* Reset coordinate & move to next faster dimension */
+            udata->chunk_rec.scaled[curr_dim] = 0;
+            curr_dim--;
+        } /* end if */
+        else
+            break;
+    } /* end while */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__earray_idx_iterate_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_idx_iterate
+ *
+ * Purpose:	Iterate over the chunks in an index, making a callback
+ *              for each one.
+ *
+ * Note:	This implementation is slow, particularly for sparse
+ *              extensible arrays, replace it with call to H5EA_iterate()
+ *              when that's available.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 29, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5D__earray_idx_iterate(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_cb_func_t chunk_cb, void *chunk_udata)
+{
+    H5EA_t      *ea;            /* Pointer to extensible array structure */
+    H5EA_stat_t ea_stat;        /* Extensible array statistics */
+    int ret_value = H5_ITER_CONT;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(chunk_cb);
+    HDassert(chunk_udata);
+
+    /* Check if the extensible array is open yet */
+    if(NULL == idx_info->storage->u.earray.ea)
+        /* Open the extensible array in file */
+        if(H5D__earray_idx_open(idx_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't open extensible array")
+
+    /* Set convenience pointer to extensible array structure */
+    ea = idx_info->storage->u.earray.ea;
+
+    /* Get the extensible array statistics */
+    if(H5EA_get_stats(ea, &ea_stat) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't query extensible array statistics")
+
+    if(ea_stat.stored.max_idx_set > 0) {
+        H5D_earray_it_ud_t udata;   /* User data for iteration callback */
+
+	/* Initialize userdata */
+	HDmemset(&udata, 0, sizeof udata);
+	udata.common.layout = idx_info->layout;
+	udata.common.storage = idx_info->storage;
+        HDmemset(&udata.chunk_rec, 0, sizeof(udata.chunk_rec));
+        udata.filtered = (idx_info->pline->nused > 0);
+        if(!udata.filtered) {
+            udata.chunk_rec.nbytes = idx_info->layout->size;
+            udata.chunk_rec.filter_mask = 0;
+        } /* end if */
+	udata.cb = chunk_cb;
+	udata.udata = chunk_udata;
+	
+        /* Iterate over the extensible array elements */
+	if((ret_value = H5EA_iterate(ea, idx_info->dxpl_id, H5D__earray_idx_iterate_cb, &udata)) < 0)
+	    HERROR(H5E_DATASET, H5E_BADITER, "unable to iterate over fixed array chunk index");
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__earray_idx_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_idx_remove
+ *
+ * Purpose:	Remove chunk from index.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 29, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_idx_remove(const H5D_chk_idx_info_t *idx_info, H5D_chunk_common_ud_t *udata)
+{
+    H5EA_t      *ea;                    /* Pointer to extensible array structure */
+    hsize_t     idx;                    /* Array index of chunk */
+    herr_t	ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(udata);
+
+    /* Check if the extensible array is open yet */
+    if(NULL == idx_info->storage->u.earray.ea)
+        /* Open the extensible array in file */
+        if(H5D__earray_idx_open(idx_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't open extensible array")
+
+    /* Set convenience pointer to extensible array structure */
+    ea = idx_info->storage->u.earray.ea;
+
+    /* Check for unlimited dim. not being the slowest-changing dim. */
+    if(idx_info->layout->u.earray.unlim_dim > 0) {
+        hsize_t swizzled_coords[H5O_LAYOUT_NDIMS];	/* swizzled chunk coordinates */
+        unsigned ndims = (idx_info->layout->ndims - 1); /* Number of dimensions */
+	unsigned u;
+
+	/* Compute coordinate offset from scaled offset */
+	for(u = 0; u < ndims; u++)
+	    swizzled_coords[u] = udata->scaled[u] * idx_info->layout->dim[u];
+
+        H5VM_swizzle_coords(hsize_t, swizzled_coords, idx_info->layout->u.earray.unlim_dim);
+
+        /* Calculate the index of this chunk */
+        idx = H5VM_chunk_index(ndims, swizzled_coords, idx_info->layout->u.earray.swizzled_dim, idx_info->layout->u.earray.swizzled_down_chunks);
+    } /* end if */
+    else {
+        /* Calculate the index of this chunk */
+        idx = H5VM_array_offset_pre((idx_info->layout->ndims - 1), idx_info->layout->down_chunks, udata->scaled);
+    } /* end else */
+
+    /* Check for filters on chunks */
+    if(idx_info->pline->nused > 0) {
+        H5D_earray_filt_elmt_t elmt;            /* Extensible array element */
+
+        /* Get the info about the chunk for the index */
+        if(H5EA_get(ea, idx_info->dxpl_id, idx, &elmt) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get chunk info")
+
+        /* Remove raw data chunk from file if not doing SWMR writes */
+        HDassert(H5F_addr_defined(elmt.addr));
+        if(!(H5F_INTENT(idx_info->f) & H5F_ACC_SWMR_WRITE)) {
+            H5_CHECK_OVERFLOW(elmt.nbytes, /*From: */uint32_t, /*To: */hsize_t);
+            if(H5MF_xfree(idx_info->f, H5FD_MEM_DRAW, idx_info->dxpl_id, elmt.addr, (hsize_t)elmt.nbytes) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to free chunk")
+        } /* end if */
+
+        /* Reset the info about the chunk for the index */
+        elmt.addr = HADDR_UNDEF;
+        elmt.nbytes = 0;
+        elmt.filter_mask = 0;
+        if(H5EA_set(ea, idx_info->dxpl_id, idx, &elmt) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to reset chunk info")
+    } /* end if */
+    else {
+        haddr_t     addr = HADDR_UNDEF;     /* Chunk address */
+
+        /* Get the address of the chunk for the index */
+        if(H5EA_get(ea, idx_info->dxpl_id, idx, &addr) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get chunk address")
+
+        /* Remove raw data chunk from file if not doing SWMR writes */
+        HDassert(H5F_addr_defined(addr));
+        if(!(H5F_INTENT(idx_info->f) & H5F_ACC_SWMR_WRITE)) {
+            H5_CHECK_OVERFLOW(idx_info->layout->size, /*From: */uint32_t, /*To: */hsize_t);
+            if(H5MF_xfree(idx_info->f, H5FD_MEM_DRAW, idx_info->dxpl_id, addr, (hsize_t)idx_info->layout->size) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to free chunk")
+        } /* end if */
+
+        /* Reset the address of the chunk for the index */
+        addr = HADDR_UNDEF;
+        if(H5EA_set(ea, idx_info->dxpl_id, idx, &addr) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to reset chunk address")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__earray_idx_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_idx_delete_cb
+ *
+ * Purpose:	Delete space for chunk in file
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, January 31, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5D__earray_idx_delete_cb(const H5D_chunk_rec_t *chunk_rec, void *_udata)
+{
+    H5D_earray_ud_t *udata = (H5D_earray_ud_t *)_udata;         /* User data for callback */
+    int ret_value = H5_ITER_CONT;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(chunk_rec);
+    HDassert(H5F_addr_defined(chunk_rec->chunk_addr));
+    HDassert(chunk_rec->nbytes > 0);
+    HDassert(udata);
+    HDassert(udata->f);
+
+    /* Remove raw data chunk from file */
+    H5_CHECK_OVERFLOW(chunk_rec->nbytes, /*From: */uint32_t, /*To: */hsize_t);
+    if(H5MF_xfree(udata->f, H5FD_MEM_DRAW, udata->dxpl_id, chunk_rec->chunk_addr, (hsize_t)chunk_rec->nbytes) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, H5_ITER_ERROR, "unable to free chunk")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__earray_idx_delete_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_idx_delete
+ *
+ * Purpose:	Delete index and raw data storage for entire dataset
+ *              (i.e. all chunks)
+ *
+ * Note:	This implementation is slow, particularly for sparse
+ *              extensible arrays, replace it with call to H5EA_iterate()
+ *              when that's available.
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, January 29, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_idx_delete(const H5D_chk_idx_info_t *idx_info)
+{
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+
+    /* Check if the index data structure has been allocated */
+    if(H5F_addr_defined(idx_info->storage->idx_addr)) {
+        H5D_earray_ud_t udata;         /* User data for callback */
+        H5D_earray_ctx_ud_t ctx_udata; /* User data for extensible array open call */
+
+        /* Initialize user data for callback */
+        udata.f = idx_info->f;
+        udata.dxpl_id = idx_info->dxpl_id;
+
+        /* Iterate over the chunk addresses in the extensible array, deleting each chunk */
+        if(H5D__earray_idx_iterate(idx_info, H5D__earray_idx_delete_cb, &udata) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_BADITER, FAIL, "unable to iterate over chunk addresses")
+
+        /* Close extensible array */
+        if(H5EA_close(idx_info->storage->u.earray.ea, idx_info->dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to close extensible array")
+        idx_info->storage->u.earray.ea = NULL;
+
+        /* Set up the context user data */
+        ctx_udata.f = idx_info->f;
+        ctx_udata.chunk_size = idx_info->layout->size;
+
+        /* Delete extensible array */
+        if(H5EA_delete(idx_info->f, idx_info->dxpl_id, idx_info->storage->idx_addr, &ctx_udata) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTDELETE, FAIL, "unable to delete chunk extensible array")
+        idx_info->storage->idx_addr = HADDR_UNDEF;
+    } /* end if */
+    else
+        HDassert(NULL == idx_info->storage->u.earray.ea);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__earray_idx_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_idx_copy_setup
+ *
+ * Purpose:	Set up any necessary information for copying chunks
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, January 31, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_idx_copy_setup(const H5D_chk_idx_info_t *idx_info_src,
+    const H5D_chk_idx_info_t *idx_info_dst)
+{
+    herr_t      ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info_src);
+    HDassert(idx_info_src->f);
+    HDassert(idx_info_src->pline);
+    HDassert(idx_info_src->layout);
+    HDassert(idx_info_src->storage);
+    HDassert(idx_info_dst);
+    HDassert(idx_info_dst->f);
+    HDassert(idx_info_dst->pline);
+    HDassert(idx_info_dst->layout);
+    HDassert(idx_info_dst->storage);
+    HDassert(!H5F_addr_defined(idx_info_dst->storage->idx_addr));
+
+    /* Check if the source extensible array is open yet */
+    if(NULL == idx_info_src->storage->u.earray.ea)
+        /* Open the extensible array in file */
+        if(H5D__earray_idx_open(idx_info_src) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't open extensible array")
+
+    /* Set copied metadata tag */
+    H5_BEGIN_TAG(idx_info_dst->dxpl_id, H5AC__COPIED_TAG, FAIL);
+
+    /* Create the extensible array that describes chunked storage in the dest. file */
+    if(H5D__earray_idx_create(idx_info_dst) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize chunked storage")
+    HDassert(H5F_addr_defined(idx_info_dst->storage->idx_addr));
+
+    /* Reset metadata tag */
+    H5_END_TAG(FAIL);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__earray_idx_copy_setup() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_idx_copy_shutdown
+ *
+ * Purpose:	Shutdown any information from copying chunks
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, January 31, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_idx_copy_shutdown(H5O_storage_chunk_t *storage_src,
+    H5O_storage_chunk_t *storage_dst, hid_t dxpl_id)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(storage_src);
+    HDassert(storage_src->u.earray.ea);
+    HDassert(storage_dst);
+    HDassert(storage_dst->u.earray.ea);
+
+    /* Close extensible arrays */
+    if(H5EA_close(storage_src->u.earray.ea, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to close extensible array")
+    storage_src->u.earray.ea = NULL;
+    if(H5EA_close(storage_dst->u.earray.ea, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to close extensible array")
+    storage_dst->u.earray.ea = NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__earray_idx_copy_shutdown() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__earray_idx_size
+ *
+ * Purpose:     Retrieve the amount of index storage for chunked dataset
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Saturday, January 31, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_idx_size(const H5D_chk_idx_info_t *idx_info, hsize_t *index_size)
+{
+    H5EA_t      *ea;                    /* Pointer to extensible array structure */
+    H5EA_stat_t ea_stat;                /* Extensible array statistics */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(index_size);
+
+    /* Open the extensible array in file */
+    if(H5D__earray_idx_open(idx_info) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't open extensible array")
+
+    /* Set convenience pointer to extensible array structure */
+    ea = idx_info->storage->u.earray.ea;
+
+    /* Get the extensible array statistics */
+    if(H5EA_get_stats(ea, &ea_stat) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't query extensible array statistics")
+
+    /* Set the size of the extensible array */
+    *index_size = ea_stat.computed.hdr_size + ea_stat.computed.index_blk_size
+            + ea_stat.stored.super_blk_size + ea_stat.stored.data_blk_size;
+
+done:
+    if(idx_info->storage->u.earray.ea) {
+        if(H5EA_close(idx_info->storage->u.earray.ea, idx_info->dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to close extensible array")
+        idx_info->storage->u.earray.ea = NULL;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__earray_idx_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_idx_reset
+ *
+ * Purpose:	Reset indexing information.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, January 31, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_idx_reset(H5O_storage_chunk_t *storage, hbool_t reset_addr)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(storage);
+
+    /* Reset index info */
+    if(reset_addr) {
+	storage->idx_addr = HADDR_UNDEF;
+        storage->u.earray.dset_ohdr_addr = HADDR_UNDEF;
+    } /* end if */
+    storage->u.earray.ea = NULL;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__earray_idx_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_idx_dump
+ *
+ * Purpose:	Dump indexing information to a stream.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, January 31, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_idx_dump(const H5O_storage_chunk_t *storage, FILE *stream)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(storage);
+    HDassert(stream);
+
+    HDfprintf(stream, "    Address: %a\n", storage->idx_addr);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__earray_idx_dump() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__earray_idx_dest
+ *
+ * Purpose:	Release indexing information in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Saturday, January 31, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__earray_idx_dest(const H5D_chk_idx_info_t *idx_info)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->storage);
+
+    /* Check if the extensible array is open */
+    if(idx_info->storage->u.earray.ea) {
+        /* Close extensible array */
+        if(H5EA_close(idx_info->storage->u.earray.ea, idx_info->dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to close extensible array")
+        idx_info->storage->u.earray.ea = NULL;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__earray_idx_dest() */
+
diff --git a/src/H5Defl.c b/src/H5Defl.c
index 85ceaf2..ec96ae7 100644
--- a/src/H5Defl.c
+++ b/src/H5Defl.c
@@ -22,7 +22,7 @@
 /* Module Setup */
 /****************/
 
-#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
 
 
 /***********/
@@ -100,6 +100,7 @@ const H5D_layout_ops_t H5D_LOPS_EFL[1] = {{
     H5D__efl_readvv,
     H5D__efl_writevv,
     NULL,
+    NULL,
     NULL
 }};
 
@@ -126,14 +127,11 @@ static herr_t
 H5D__efl_construct(H5F_t *f, H5D_t *dset)
 {
     size_t dt_size;                     /* Size of datatype */
-    hsize_t dim[H5O_LAYOUT_NDIMS];	/* Current size of data in elements */
-    hsize_t max_dim[H5O_LAYOUT_NDIMS];  /* Maximum size of data in elements */
     hssize_t stmp_size;                 /* Temporary holder for raw data size */
     hsize_t tmp_size;                   /* Temporary holder for raw data size */
     hsize_t max_points;                 /* Maximum elements */
     hsize_t max_storage;                /* Maximum storage size */
-    int ndims;                          /* Rank of dataspace */
-    int i;                              /* Local index variable */
+    unsigned u;                         /* Local index variable */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
@@ -149,11 +147,9 @@ H5D__efl_construct(H5F_t *f, H5D_t *dset)
      */
 
     /* Check for invalid dataset dimensions */
-    if((ndims = H5S_get_simple_extent_dims(dset->shared->space, dim, max_dim)) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize contiguous storage")
-    for(i = 1; i < ndims; i++)
-        if(max_dim[i] > dim[i])
-            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "only the first dimension can be extendible")
+    for(u = 1; u < dset->shared->ndims; u++)
+        if(dset->shared->max_dims[u] > dset->shared->curr_dims[u])
+            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "only the first dimension can be extendible")
 
     /* Retrieve the size of the dataset's datatype */
     if(0 == (dt_size = H5T_get_size(dset->shared->type)))
@@ -293,7 +289,7 @@ H5D__efl_read(const H5O_efl_t *efl, haddr_t addr, size_t size, uint8_t *buf)
 	    HGOTO_ERROR(H5E_EFL, H5E_OVERFLOW, FAIL, "external file address overflowed")
 	if((fd = HDopen(efl->slot[u].name, O_RDONLY, 0)) < 0)
 	    HGOTO_ERROR(H5E_EFL, H5E_CANTOPENFILE, FAIL, "unable to open external raw data file")
-	if(HDlseek(fd, (off_t)(efl->slot[u].offset + skip), SEEK_SET) < 0)
+	if(HDlseek(fd, (HDoff_t)(efl->slot[u].offset + skip), SEEK_SET) < 0)
 	    HGOTO_ERROR(H5E_EFL, H5E_SEEKERROR, FAIL, "unable to seek in external raw data file")
 #ifndef NDEBUG
 	tempto_read = MIN(efl->slot[u].size-skip, (hsize_t)size);
@@ -383,7 +379,7 @@ H5D__efl_write(const H5O_efl_t *efl, haddr_t addr, size_t size, const uint8_t *b
 	    else
 		HGOTO_ERROR(H5E_EFL, H5E_CANTOPENFILE, FAIL, "unable to open external raw data file")
 	} /* end if */
-	if(HDlseek(fd, (off_t)(efl->slot[u].offset + skip), SEEK_SET) < 0)
+	if(HDlseek(fd, (HDoff_t)(efl->slot[u].offset + skip), SEEK_SET) < 0)
 	    HGOTO_ERROR(H5E_EFL, H5E_SEEKERROR, FAIL, "unable to seek in external raw data file")
 #ifndef NDEBUG
 	tempto_write = MIN(efl->slot[u].size - skip, (hsize_t)size);
@@ -460,7 +456,7 @@ H5D__efl_readvv(const H5D_io_info_t *io_info,
     size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_off_arr[])
 {
     H5D_efl_readvv_ud_t udata;  /* User data for H5VM_opvv() operator */
-    ssize_t ret_value;          /* Return value (Total size of sequence in bytes) */
+    ssize_t ret_value = -1;     /* Return value (Total size of sequence in bytes) */
 
     FUNC_ENTER_STATIC
 
@@ -540,7 +536,7 @@ H5D__efl_writevv(const H5D_io_info_t *io_info,
     size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_off_arr[])
 {
     H5D_efl_writevv_ud_t udata;  /* User data for H5VM_opvv() operator */
-    ssize_t ret_value;          /* Return value (Total size of sequence in bytes) */
+    ssize_t ret_value = -1;      /* Return value (Total size of sequence in bytes) */
 
     FUNC_ENTER_STATIC
 
diff --git a/src/H5Dfarray.c b/src/H5Dfarray.c
new file mode 100644
index 0000000..2958a66
--- /dev/null
+++ b/src/H5Dfarray.c
@@ -0,0 +1,1700 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer: 	Vailin Choi <vchoi at hdfgroup.org>
+ *	       	Thursday, April 30, 2009
+ *
+ * Purpose:	Fixed array indexed (chunked) I/O functions.  
+ *		The chunk coordinate is mapped as an index into an array of 
+ *		disk addresses for the chunks.
+ *
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dpkg.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FAprivate.h"	/* Fixed arrays		  		*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5MFprivate.h"	/* File space management		*/
+#include "H5VMprivate.h"         /* Vector functions			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Value to fill unset array elements with */
+#define H5D_FARRAY_FILL         HADDR_UNDEF
+#define H5D_FARRAY_FILT_FILL    {HADDR_UNDEF, 0, 0}
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Fixed array create/open user data */
+typedef struct H5D_farray_ctx_ud_t {
+    const H5F_t *f;             /* Pointer to file info */
+    uint32_t chunk_size;        /* Size of chunk (bytes) */
+} H5D_farray_ctx_ud_t;
+
+/* Fixed array callback context */
+typedef struct H5D_farray_ctx_t {
+    size_t file_addr_len;       /* Size of addresses in the file (bytes) */
+    size_t chunk_size_len;      /* Size of chunk sizes in the file (bytes) */
+} H5D_farray_ctx_t;
+
+/* User data for chunk deletion callback */
+typedef struct H5D_farray_del_ud_t {
+    H5F_t *f;                   /* File pointer for operation */
+    hid_t dxpl_id;              /* DXPL ID for operation */
+    hbool_t filtered;           /* Whether the chunks are filtered */
+    uint32_t unfilt_size;       /* Size of unfiltered chunk in bytes */
+} H5D_farray_del_ud_t;
+
+/* Fixed Array callback info for iteration over chunks */
+typedef struct H5D_farray_it_ud_t {
+    H5D_chunk_common_ud_t common;       /* Common info for Fixed Array user data (must be first) */
+    H5D_chunk_rec_t     chunk_rec;      /* Generic chunk record for callback */
+    hbool_t             filtered;       /* Whether the chunks are filtered */
+    H5D_chunk_cb_func_t cb;             /* Chunk callback routine */
+    void                *udata;         /* User data for chunk callback routine */
+} H5D_farray_it_ud_t;
+
+/* Native fixed array element for chunks w/filters */
+typedef struct H5D_farray_filt_elmt_t {
+    haddr_t addr;               /* Address of chunk */
+    uint32_t nbytes;            /* Size of chunk (in file) */
+    uint32_t filter_mask;       /* Excluded filters for chunk */
+} H5D_farray_filt_elmt_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Fixed Array iterator callbacks */
+static int H5D__farray_idx_iterate_cb(hsize_t idx, const void *_elmt, void *_udata);
+static int H5D__farray_idx_delete_cb(hsize_t idx, const void *_elmt, void *_udata);
+
+/* Fixed array class callbacks for chunks w/o filters */
+static void *H5D__farray_crt_context(void *udata);
+static herr_t H5D__farray_dst_context(void *ctx);
+static herr_t H5D__farray_fill(void *nat_blk, size_t nelmts);
+static herr_t H5D__farray_encode(void *raw, const void *elmt, size_t nelmts,
+    void *ctx);
+static herr_t H5D__farray_decode(const void *raw, void *elmt, size_t nelmts,
+    void *ctx);
+static herr_t H5D__farray_debug(FILE *stream, int indent, int fwidth,
+    hsize_t idx, const void *elmt);
+static void *H5D__farray_crt_dbg_context(H5F_t *f, hid_t dxpl_id,
+    haddr_t obj_addr);
+static herr_t H5D__farray_dst_dbg_context(void *dbg_ctx);
+
+/* Fixed array class callbacks for chunks w/filters */
+/* (some shared with callbacks for chunks w/o filters) */
+static herr_t H5D__farray_filt_fill(void *nat_blk, size_t nelmts);
+static herr_t H5D__farray_filt_encode(void *raw, const void *elmt, size_t nelmts,
+    void *ctx);
+static herr_t H5D__farray_filt_decode(const void *raw, void *elmt, size_t nelmts,
+    void *ctx);
+static herr_t H5D__farray_filt_debug(FILE *stream, int indent, int fwidth,
+    hsize_t idx, const void *elmt);
+
+/* Chunked layout indexing callbacks */
+static herr_t H5D__farray_idx_init(const H5D_chk_idx_info_t *idx_info,
+    const H5S_t *space, haddr_t dset_ohdr_addr);
+static herr_t H5D__farray_idx_create(const H5D_chk_idx_info_t *idx_info);
+static hbool_t H5D__farray_idx_is_space_alloc(const H5O_storage_chunk_t *storage);
+static herr_t H5D__farray_idx_insert(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_ud_t *udata, const H5D_t *dset);
+static herr_t H5D__farray_idx_get_addr(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_ud_t *udata);
+static int H5D__farray_idx_iterate(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_cb_func_t chunk_cb, void *chunk_udata);
+static herr_t H5D__farray_idx_remove(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_common_ud_t *udata);
+static herr_t H5D__farray_idx_delete(const H5D_chk_idx_info_t *idx_info);
+static herr_t H5D__farray_idx_copy_setup(const H5D_chk_idx_info_t *idx_info_src,
+    const H5D_chk_idx_info_t *idx_info_dst);
+static herr_t H5D__farray_idx_copy_shutdown(H5O_storage_chunk_t *storage_src,
+    H5O_storage_chunk_t *storage_dst, hid_t dxpl_id);
+static herr_t H5D__farray_idx_size(const H5D_chk_idx_info_t *idx_info,
+    hsize_t *size);
+static herr_t H5D__farray_idx_reset(H5O_storage_chunk_t *storage, hbool_t reset_addr);
+static herr_t H5D__farray_idx_dump(const H5O_storage_chunk_t *storage, FILE *stream);
+static herr_t H5D__farray_idx_dest(const H5D_chk_idx_info_t *idx_info);
+
+/* Generic extensible array routines */
+static herr_t H5D__farray_idx_open(const H5D_chk_idx_info_t *idx_info);
+static herr_t H5D__farray_idx_depend(const H5D_chk_idx_info_t *idx_info);
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Fixed array indexed chunk I/O ops */
+const H5D_chunk_ops_t H5D_COPS_FARRAY[1] = {{
+    TRUE,                               /* Fixed array indices support SWMR access */
+    H5D__farray_idx_init,               /* init */
+    H5D__farray_idx_create,             /* create */
+    H5D__farray_idx_is_space_alloc,     /* is_space_alloc */
+    H5D__farray_idx_insert,             /* insert */
+    H5D__farray_idx_get_addr,           /* get_addr */
+    NULL,                               /* resize */
+    H5D__farray_idx_iterate,            /* iterate */
+    H5D__farray_idx_remove,             /* remove */
+    H5D__farray_idx_delete,             /* delete */
+    H5D__farray_idx_copy_setup,         /* copy_setup */
+    H5D__farray_idx_copy_shutdown,      /* copy_shutdown */
+    H5D__farray_idx_size,               /* size */
+    H5D__farray_idx_reset,              /* reset */
+    H5D__farray_idx_dump,               /* dump */
+    H5D__farray_idx_dest                /* destroy */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Fixed array class callbacks for dataset chunks w/o filters */
+const H5FA_class_t H5FA_CLS_CHUNK[1]={{
+    H5FA_CLS_CHUNK_ID,          /* Type of fixed array */
+    "Chunk w/o filters",        /* Name of fixed array class */
+    sizeof(haddr_t),            /* Size of native element */
+    H5D__farray_crt_context,    /* Create context */
+    H5D__farray_dst_context,    /* Destroy context */
+    H5D__farray_fill,           /* Fill block of missing elements callback */
+    H5D__farray_encode,         /* Element encoding callback */
+    H5D__farray_decode,         /* Element decoding callback */
+    H5D__farray_debug,          /* Element debugging callback */
+    H5D__farray_crt_dbg_context, /* Create debugging context */
+    H5D__farray_dst_dbg_context /* Destroy debugging context */
+}};
+
+/* Fixed array class callbacks for dataset chunks w/filters */
+const H5FA_class_t H5FA_CLS_FILT_CHUNK[1]={{
+    H5FA_CLS_FILT_CHUNK_ID,     /* Type of fixed array */
+    "Chunk w/filters",          /* Name of fixed array class */
+    sizeof(H5D_farray_filt_elmt_t), /* Size of native element */
+    H5D__farray_crt_context,    /* Create context */
+    H5D__farray_dst_context,    /* Destroy context */
+    H5D__farray_filt_fill,      /* Fill block of missing elements callback */
+    H5D__farray_filt_encode,    /* Element encoding callback */
+    H5D__farray_filt_decode,    /* Element decoding callback */
+    H5D__farray_filt_debug,     /* Element debugging callback */
+    H5D__farray_crt_dbg_context, /* Create debugging context */
+    H5D__farray_dst_dbg_context /* Destroy debugging context */
+}};
+
+/* Declare a free list to manage the H5D_farray_ctx_t struct */
+H5FL_DEFINE_STATIC(H5D_farray_ctx_t);
+
+/* Declare a free list to manage the H5D_farray_ctx_ud_t struct */
+H5FL_DEFINE_STATIC(H5D_farray_ctx_ud_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_crt_context
+ *
+ * Purpose:	Create context for callbacks
+ *
+ * Return:	Success:	non-NULL
+ *		Failure:	NULL
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5D__farray_crt_context(void *_udata)
+{
+    H5D_farray_ctx_t *ctx;      /* Fixed array callback context */
+    H5D_farray_ctx_ud_t *udata = (H5D_farray_ctx_ud_t *)_udata; /* User data for fixed array context */
+    void *ret_value = NULL;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(udata);
+    HDassert(udata->f);
+    HDassert(udata->chunk_size > 0);
+
+    /* Allocate new context structure */
+    if(NULL == (ctx = H5FL_MALLOC(H5D_farray_ctx_t)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, NULL, "can't allocate fixed array client callback context")
+
+     /* Initialize the context */
+    ctx->file_addr_len = H5F_SIZEOF_ADDR(udata->f);
+
+    /* Compute the size required for encoding the size of a chunk, allowing
+     *      for an extra byte, in case the filter makes the chunk larger.
+     */
+    ctx->chunk_size_len = 1 + ((H5VM_log2_gen((uint64_t)udata->chunk_size) + 8) / 8);
+    if(ctx->chunk_size_len > 8)
+        ctx->chunk_size_len = 8;
+
+    /* Set return value */
+    ret_value = ctx;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__farray_crt_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_dst_context
+ *
+ * Purpose:	Destroy context for callbacks
+ *
+ * Return:	Success:	non-NULL
+ *		Failure:	NULL
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_dst_context(void *_ctx)
+{
+    H5D_farray_ctx_t *ctx = (H5D_farray_ctx_t *)_ctx;   /* Fixed array callback context */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(ctx);
+
+    /* Release context structure */
+    ctx = H5FL_FREE(H5D_farray_ctx_t, ctx);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__farray_dst_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_fill
+ *
+ * Purpose:	Fill "missing elements" in block of elements
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_fill(void *nat_blk, size_t nelmts)
+{
+    haddr_t fill_val = H5D_FARRAY_FILL;          /* Value to fill elements with */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(nat_blk);
+    HDassert(nelmts);
+
+    H5VM_array_fill(nat_blk, &fill_val, H5FA_CLS_CHUNK->nat_elmt_size, nelmts);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__farray_fill() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_encode
+ *
+ * Purpose:	Encode an element from "native" to "raw" form
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_encode(void *raw, const void *_elmt, size_t nelmts, void *_ctx)
+{
+    H5D_farray_ctx_t *ctx = (H5D_farray_ctx_t *)_ctx;   /* Fixed array callback context */
+    const haddr_t *elmt = (const haddr_t *)_elmt;     /* Convenience pointer to native elements */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(raw);
+    HDassert(elmt);
+    HDassert(nelmts);
+    HDassert(ctx);
+
+    /* Encode native elements into raw elements */
+    while(nelmts) {
+        /* Encode element */
+        /* (advances 'raw' pointer) */
+        H5F_addr_encode_len(ctx->file_addr_len, (uint8_t **)&raw, *elmt);
+
+        /* Advance native element pointer */
+        elmt++;
+
+        /* Decrement # of elements to encode */
+        nelmts--;
+    } /* end while */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__farray_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_decode
+ *
+ * Purpose:	Decode an element from "raw" to "native" form
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_decode(const void *_raw, void *_elmt, size_t nelmts, void *_ctx)
+{
+    H5D_farray_ctx_t *ctx = (H5D_farray_ctx_t *)_ctx;   /* Fixed array callback context */
+    haddr_t *elmt = (haddr_t *)_elmt;           /* Convenience pointer to native elements */
+    const uint8_t *raw = (const uint8_t *)_raw; /* Convenience pointer to raw elements */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(raw);
+    HDassert(elmt);
+    HDassert(nelmts);
+
+    /* Decode raw elements into native elements */
+    while(nelmts) {
+        /* Decode element */
+        /* (advances 'raw' pointer) */
+        H5F_addr_decode_len(ctx->file_addr_len, &raw, elmt);
+
+        /* Advance native element pointer */
+        elmt++;
+
+        /* Decrement # of elements to decode */
+        nelmts--;
+    } /* end while */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__farray_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_debug
+ *
+ * Purpose:	Display an element for debugging
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_debug(FILE *stream, int indent, int fwidth, hsize_t idx,
+    const void *elmt)
+{
+    char temp_str[128];     /* Temporary string, for formatting */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(stream);
+    HDassert(elmt);
+
+    /* Print element */
+    sprintf(temp_str, "Element #%llu:", (unsigned long long)idx);
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth, temp_str,
+        *(const haddr_t *)elmt);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__farray_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_crt_dbg_context
+ *
+ * Purpose:	Create context for debugging callback
+ *		(get the layout message in the specified object header)
+ *
+ * Return:	Success:	non-NULL
+ *		Failure:	NULL
+ *
+ * Programmer:	Vailin Choi
+ *		5th August, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5D__farray_crt_dbg_context(H5F_t *f, hid_t dxpl_id, haddr_t obj_addr)
+{
+    H5D_farray_ctx_ud_t	*dbg_ctx = NULL;   /* Context for fixed array callback */
+    H5O_loc_t obj_loc;          /* Pointer to an object's location */
+    hbool_t obj_opened = FALSE; /* Flag to indicate that the object header was opened */
+    H5O_layout_t layout;        /* Layout message */
+    void *ret_value = NULL;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(H5F_addr_defined(obj_addr));
+
+    /* Allocate context for debugging callback */
+    if(NULL == (dbg_ctx = H5FL_MALLOC(H5D_farray_ctx_ud_t)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, NULL, "can't allocate fixed array client callback context")
+
+    /* Set up the object header location info */
+    H5O_loc_reset(&obj_loc);
+    obj_loc.file = f;
+    obj_loc.addr = obj_addr;
+
+    /* Open the object header where the layout message resides */
+    if(H5O_open(&obj_loc) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, NULL, "can't open object header")
+    obj_opened = TRUE;
+
+    /* Read the layout message */
+    if(NULL == H5O_msg_read(&obj_loc, H5O_LAYOUT_ID, &layout, dxpl_id))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, NULL, "can't get layout info")
+
+    /* close the object header */
+    if(H5O_close(&obj_loc) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, NULL, "can't close object header")
+
+    /* Create user data */
+    dbg_ctx->f = f;
+    dbg_ctx->chunk_size = layout.u.chunk.size;
+
+    /* Set return value */
+    ret_value = dbg_ctx;
+
+done:
+    /* Cleanup on error */
+    if(ret_value == NULL) {
+        /* Release context structure */
+        if(dbg_ctx)
+            dbg_ctx = H5FL_FREE(H5D_farray_ctx_ud_t, dbg_ctx);
+
+        /* Close object header */
+        if(obj_opened) {
+            if(H5O_close(&obj_loc) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, NULL, "can't close object header")
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__farray_crt_dbg_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_dst_dbg_context
+ *
+ * Purpose:	Destroy context for debugging callback
+ *		(free the layout message from the specified object header)
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *		24th September, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_dst_dbg_context(void *_dbg_ctx)
+{
+    H5D_farray_ctx_ud_t	*dbg_ctx = (H5D_farray_ctx_ud_t	*)_dbg_ctx; /* Context for fixed array callback */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(dbg_ctx);
+
+    /* Release context structure */
+    dbg_ctx = H5FL_FREE(H5D_farray_ctx_ud_t, dbg_ctx);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__farray_dst_dbg_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_filt_fill
+ *
+ * Purpose:	Fill "missing elements" in block of elements
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_filt_fill(void *nat_blk, size_t nelmts)
+{
+    H5D_farray_filt_elmt_t fill_val = H5D_FARRAY_FILT_FILL;     /* Value to fill elements with */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(nat_blk);
+    HDassert(nelmts);
+    HDassert(sizeof(fill_val) == H5FA_CLS_FILT_CHUNK->nat_elmt_size);
+
+    H5VM_array_fill(nat_blk, &fill_val, H5FA_CLS_FILT_CHUNK->nat_elmt_size, nelmts);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__farray_filt_fill() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_filt_encode
+ *
+ * Purpose:	Encode an element from "native" to "raw" form
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_filt_encode(void *_raw, const void *_elmt, size_t nelmts, void *_ctx)
+{
+    H5D_farray_ctx_t *ctx = (H5D_farray_ctx_t *)_ctx;   /* Fixed array callback context */
+    uint8_t *raw = (uint8_t *)_raw;             /* Convenience pointer to raw elements */
+    const H5D_farray_filt_elmt_t *elmt = (const H5D_farray_filt_elmt_t *)_elmt;     /* Convenience pointer to native elements */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(raw);
+    HDassert(elmt);
+    HDassert(nelmts);
+    HDassert(ctx);
+
+    /* Encode native elements into raw elements */
+    while(nelmts) {
+        /* Encode element */
+        /* (advances 'raw' pointer) */
+        H5F_addr_encode_len(ctx->file_addr_len, &raw, elmt->addr);
+	UINT64ENCODE_VAR(raw, elmt->nbytes, ctx->chunk_size_len);
+        UINT32ENCODE(raw, elmt->filter_mask);
+
+        /* Advance native element pointer */
+        elmt++;
+
+        /* Decrement # of elements to encode */
+        nelmts--;
+    } /* end while */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__farray_filt_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_filt_decode
+ *
+ * Purpose:	Decode an element from "raw" to "native" form
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_filt_decode(const void *_raw, void *_elmt, size_t nelmts, void *_ctx)
+{
+    H5D_farray_ctx_t *ctx = (H5D_farray_ctx_t *)_ctx;   /* Fixed array callback context */
+    H5D_farray_filt_elmt_t *elmt = (H5D_farray_filt_elmt_t *)_elmt;           /* Convenience pointer to native elements */
+    const uint8_t *raw = (const uint8_t *)_raw; /* Convenience pointer to raw elements */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(raw);
+    HDassert(elmt);
+    HDassert(nelmts);
+
+    /* Decode raw elements into native elements */
+    while(nelmts) {
+        /* Decode element */
+        /* (advances 'raw' pointer) */
+        H5F_addr_decode_len(ctx->file_addr_len, &raw, &elmt->addr);
+	UINT64DECODE_VAR(raw, elmt->nbytes, ctx->chunk_size_len);
+        UINT32DECODE(raw, elmt->filter_mask);
+
+        /* Advance native element pointer */
+        elmt++;
+
+        /* Decrement # of elements to decode */
+        nelmts--;
+    } /* end while */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__farray_filt_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_filt_debug
+ *
+ * Purpose:	Display an element for debugging
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_filt_debug(FILE *stream, int indent, int fwidth, hsize_t idx,
+    const void *_elmt)
+{
+    const H5D_farray_filt_elmt_t *elmt = (const H5D_farray_filt_elmt_t *)_elmt;           /* Convenience pointer to native elements */
+    char temp_str[128];     /* Temporary string, for formatting */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(stream);
+    HDassert(elmt);
+
+    /* Print element */
+    sprintf(temp_str, "Element #%llu:", (unsigned long long)idx);
+    HDfprintf(stream, "%*s%-*s {%a, %u, %0x}\n", indent, "", fwidth, temp_str,
+        elmt->addr, elmt->nbytes, elmt->filter_mask);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__farray_filt_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_idx_depend
+ *
+ * Purpose:	Create flush dependency between fixed array and dataset's
+ *              object header.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Copied and modified from H5Dearrary.c
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_idx_depend(const H5D_chk_idx_info_t *idx_info)
+{
+    H5O_loc_t oloc;                     /* Temporary object header location for dataset */
+    H5O_proxy_t *oh_proxy = NULL;       /* Dataset's object header proxy */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(H5F_INTENT(idx_info->f) & H5F_ACC_SWMR_WRITE);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(H5D_CHUNK_IDX_FARRAY == idx_info->layout->idx_type);
+    HDassert(idx_info->storage);
+    HDassert(H5D_CHUNK_IDX_FARRAY == idx_info->storage->idx_type);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(idx_info->storage->u.farray.fa);
+
+    /* Set up object header location for dataset */
+    H5O_loc_reset(&oloc);
+    oloc.file = idx_info->f;
+    oloc.addr = idx_info->storage->u.farray.dset_ohdr_addr;
+
+    /* Pin the dataset's object header proxy */
+    if(NULL == (oh_proxy = H5O_pin_flush_dep_proxy(&oloc, idx_info->dxpl_id)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTPIN, FAIL, "unable to pin dataset object header proxy")
+
+    /* Make the extensible array a child flush dependency of the dataset's object header */
+    if(H5FA_depend((H5AC_info_t *)oh_proxy, idx_info->storage->u.farray.fa) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTDEPEND, FAIL, "unable to create flush dependency on object header")
+
+done:
+    /* Unpin the dataset's object header proxy */
+    if(oh_proxy && H5O_unpin_flush_dep_proxy(oh_proxy) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CANTUNPIN, FAIL, "unable to unpin dataset object header proxy")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__farray_idx_depend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__farray_idx_init
+ *
+ * Purpose:     Initialize the indexing information for a dataset.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Wednensday, May 23, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_idx_init(const H5D_chk_idx_info_t *idx_info, const H5S_t H5_ATTR_UNUSED *space, haddr_t dset_ohdr_addr)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(dset_ohdr_addr));
+
+    idx_info->storage->u.farray.dset_ohdr_addr = dset_ohdr_addr;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__farray_idx_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_idx_open
+ *
+ * Purpose:	Opens an existing fixed array and initializes
+ *              the layout struct with information about the storage.
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_idx_open(const H5D_chk_idx_info_t *idx_info)
+{
+    H5D_farray_ctx_ud_t udata;          /* User data for fixed array open call */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(H5D_CHUNK_IDX_FARRAY == idx_info->layout->idx_type);
+    HDassert(idx_info->storage);
+    HDassert(H5D_CHUNK_IDX_FARRAY == idx_info->storage->idx_type);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(NULL == idx_info->storage->u.farray.fa);
+
+    /* Set up the user data */
+    udata.f = idx_info->f;
+    udata.chunk_size = idx_info->layout->size;
+
+    /* Open the fixed array for the chunk index */
+    if(NULL == (idx_info->storage->u.farray.fa = H5FA_open(idx_info->f, idx_info->dxpl_id, idx_info->storage->idx_addr, &udata)))
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't open fixed array")
+
+     /* Check for SWMR writes to the file */
+    if(H5F_INTENT(idx_info->f) & H5F_ACC_SWMR_WRITE)
+        if(H5D__farray_idx_depend(idx_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTDEPEND, FAIL, "unable to create flush dependency on object header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__farray_idx_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_idx_create
+ *
+ * Purpose:	Creates a new indexed-storage fixed array and initializes
+ *              the layout struct with information about the storage.  The
+ *		struct should be immediately written to the object header.
+ *
+ *		This function must be called before passing LAYOUT to any of
+ *		the other indexed storage functions!
+ *
+ * Return:	Non-negative on success (with the LAYOUT argument initialized
+ *		and ready to write to an object header). Negative on failure.
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_idx_create(const H5D_chk_idx_info_t *idx_info)
+{
+    H5FA_create_t 	cparam; /* Fixed array creation parameters */
+    H5D_farray_ctx_ud_t udata;  /* User data for fixed array create call */
+    herr_t 	ret_value = SUCCEED; 	/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(!H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(NULL == idx_info->storage->u.farray.fa);
+    HDassert(idx_info->layout->nchunks);
+
+    /* General parameters */
+    if(idx_info->pline->nused > 0) {
+	unsigned chunk_size_len;        /* Size of encoded chunk size */
+
+        /* Compute the size required for encoding the size of a chunk, allowing
+         *      for an extra byte, in case the filter makes the chunk larger.
+         */
+        chunk_size_len = 1 + ((H5VM_log2_gen((uint64_t)idx_info->layout->size) + 8) / 8);
+        if(chunk_size_len > 8)
+            chunk_size_len = 8;
+
+        cparam.cls = H5FA_CLS_FILT_CHUNK;
+        cparam.raw_elmt_size = (uint8_t)(H5F_SIZEOF_ADDR(idx_info->f) + chunk_size_len + 4);
+    } /* end if */
+    else {
+        cparam.cls = H5FA_CLS_CHUNK;
+        cparam.raw_elmt_size = (uint8_t)H5F_SIZEOF_ADDR(idx_info->f);
+    } /* end else */
+    cparam.max_dblk_page_nelmts_bits = idx_info->layout->u.farray.cparam.max_dblk_page_nelmts_bits;
+    HDassert(cparam.max_dblk_page_nelmts_bits > 0);
+    cparam.nelmts = idx_info->layout->max_nchunks;
+
+    /* Set up the user data */
+    udata.f = idx_info->f;
+    udata.chunk_size = idx_info->layout->size;
+    
+    /* Create the fixed array for the chunk index */
+    if(NULL == (idx_info->storage->u.farray.fa = H5FA_create(idx_info->f, idx_info->dxpl_id, &cparam, &udata)))
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't create fixed array")
+
+    /* Get the address of the fixed array in file */
+    if(H5FA_get_addr(idx_info->storage->u.farray.fa, &(idx_info->storage->idx_addr)) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't query fixed array address")
+
+    /* Check for SWMR writes to the file */
+    if(H5F_INTENT(idx_info->f) & H5F_ACC_SWMR_WRITE)
+        if(H5D__farray_idx_depend(idx_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTDEPEND, FAIL, "unable to create flush dependency on object header")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__farray_idx_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_idx_is_space_alloc
+ *
+ * Purpose:	Query if space is allocated for index method
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+H5D__farray_idx_is_space_alloc(const H5O_storage_chunk_t *storage)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(storage);
+
+    FUNC_LEAVE_NOAPI((hbool_t)H5F_addr_defined(storage->idx_addr))
+} /* end H5D__farray_idx_is_space_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_idx_insert
+ *
+ * Purpose:	Insert chunk address into the indexing structure.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; 5 May 2014
+ *              
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_idx_insert(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *udata,
+    const H5D_t H5_ATTR_UNUSED *dset)
+{
+    H5FA_t      *fa;  	/* Pointer to fixed array structure */
+    herr_t	ret_value = SUCCEED;		/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(udata);
+
+    /* Check if the fixed array is open yet */
+    if(NULL == idx_info->storage->u.farray.fa)
+        /* Open the fixed array in file */
+        if(H5D__farray_idx_open(idx_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't open fixed array")
+
+    /* Set convenience pointer to fixed array structure */
+    fa = idx_info->storage->u.farray.fa;
+
+    if(!H5F_addr_defined(udata->chunk_block.offset))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "The chunk should have allocated already")
+    if(udata->chunk_idx != (udata->chunk_idx & 0xffffffff)) /* negative value */
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "chunk index must be less than 2^32")
+
+    /* Check for filters on chunks */
+    if(idx_info->pline->nused > 0) {
+        H5D_farray_filt_elmt_t elmt;            /* Fixed array element */
+
+	elmt.addr = udata->chunk_block.offset;
+        H5_CHECKED_ASSIGN(elmt.nbytes, uint32_t, udata->chunk_block.length, hsize_t);
+        elmt.filter_mask = udata->filter_mask;
+
+        /* Set the info for the chunk */
+        if(H5FA_set(fa, idx_info->dxpl_id, udata->chunk_idx, &elmt) < 0)
+	    HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set chunk info")
+    } /* end if */
+    else {
+        /* Set the address for the chunk */
+        if(H5FA_set(fa, idx_info->dxpl_id, udata->chunk_idx, &udata->chunk_block.offset) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set chunk address")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__farray_idx_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_idx_get_addr
+ *
+ * Purpose:	Get the file address of a chunk if file space has been
+ *		assigned.  Save the retrieved information in the udata
+ *		supplied.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_idx_get_addr(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *udata)
+{
+    H5FA_t      *fa;  	/* Pointer to fixed array structure */
+    hsize_t     idx;   	/* Array index of chunk */
+    herr_t	ret_value = SUCCEED;		/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(udata);
+
+    /* Check if the fixed array is open yet */
+    if(NULL == idx_info->storage->u.farray.fa)
+        /* Open the fixed array in file */
+        if(H5D__farray_idx_open(idx_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't open fixed array")
+
+    /* Set convenience pointer to fixed array structure */
+    fa = idx_info->storage->u.farray.fa;
+
+    /* Calculate the index of this chunk */
+    idx = H5VM_array_offset_pre((idx_info->layout->ndims - 1), idx_info->layout->max_down_chunks, udata->common.scaled);
+
+    udata->chunk_idx = idx;
+
+    /* Check for filters on chunks */
+    if(idx_info->pline->nused > 0) {
+        H5D_farray_filt_elmt_t elmt;            /* Fixed array element */
+
+        /* Get the information for the chunk */
+        if(H5FA_get(fa, idx_info->dxpl_id, idx, &elmt) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get chunk info")
+
+        /* Set the info for the chunk */
+        udata->chunk_block.offset = elmt.addr;
+        udata->chunk_block.length = elmt.nbytes;
+        udata->filter_mask = elmt.filter_mask;
+    } /* end if */
+    else {
+        /* Get the address for the chunk */
+        if(H5FA_get(fa, idx_info->dxpl_id, idx, &udata->chunk_block.offset) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get chunk address")
+
+        /* Update the other (constant) information for the chunk */
+	udata->chunk_block.length = idx_info->layout->size;
+        udata->filter_mask = 0;
+    } /* end else */
+
+    if(!H5F_addr_defined(udata->chunk_block.offset))
+	udata->chunk_block.length = 0;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__farray_idx_get_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_idx_iterate_cb
+ *
+ * Purpose:	Callback routine for fixed array element iteration.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5D__farray_idx_iterate_cb(hsize_t H5_ATTR_UNUSED idx, const void *_elmt, void *_udata)
+{
+    H5D_farray_it_ud_t   *udata = (H5D_farray_it_ud_t *)_udata; /* User data */
+    unsigned ndims;                 /* Rank of chunk */
+    int curr_dim;                   /* Current dimension */
+    int ret_value = H5_ITER_CONT;   /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Compose generic chunk record for callback */
+    if(udata->filtered) {
+        const H5D_farray_filt_elmt_t *filt_elmt = (const H5D_farray_filt_elmt_t *)_elmt;
+
+        udata->chunk_rec.chunk_addr = filt_elmt->addr;
+        udata->chunk_rec.nbytes = filt_elmt->nbytes;
+        udata->chunk_rec.filter_mask = filt_elmt->filter_mask;
+    } /* end if */
+    else
+        udata->chunk_rec.chunk_addr = *(const haddr_t *)_elmt;
+
+    /* Make "generic chunk" callback */
+    if(H5F_addr_defined(udata->chunk_rec.chunk_addr))
+	if((ret_value = (udata->cb)(&udata->chunk_rec, udata->udata)) < 0)
+	    HERROR(H5E_DATASET, H5E_CALLBACK, "failure in generic chunk iterator callback");
+
+    /* Update coordinates of chunk in dataset */
+    ndims = udata->common.layout->ndims - 1;
+    HDassert(ndims > 0);
+    curr_dim = (int)(ndims - 1);
+    while(curr_dim >= 0) {
+        /* Increment coordinate in current dimension */
+        udata->chunk_rec.scaled[curr_dim]++;
+
+        /* Check if we went off the end of the current dimension */
+        if(udata->chunk_rec.scaled[curr_dim] >= udata->common.layout->chunks[curr_dim]) {
+            /* Reset coordinate & move to next faster dimension */
+            udata->chunk_rec.scaled[curr_dim] = 0;
+            curr_dim--;
+        } /* end if */
+        else
+            break;
+    } /* end while */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__farray_idx_iterate_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_idx_iterate
+ *
+ * Purpose:	Iterate over the chunks in an index, making a callback
+ *              for each one.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5D__farray_idx_iterate(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_cb_func_t chunk_cb, void *chunk_udata)
+{
+    H5FA_t      *fa;            /* Pointer to fixed array structure */
+    H5FA_stat_t fa_stat;        /* Fixed array statistics */
+    int ret_value = FAIL;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(chunk_cb);
+    HDassert(chunk_udata);
+
+    /* Check if the fixed array is open yet */
+    if(NULL == idx_info->storage->u.farray.fa)
+        /* Open the fixed array in file */
+        if(H5D__farray_idx_open(idx_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't open fixed array")
+
+    /* Set convenience pointer to fixed array structure */
+    fa = idx_info->storage->u.farray.fa;
+
+    /* Get the fixed array statistics */
+    if(H5FA_get_stats(fa, &fa_stat) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't query fixed array statistics")
+
+    /* Check if there are any array elements */
+    if(fa_stat.nelmts > 0) {
+        H5D_farray_it_ud_t udata;   /* User data for iteration callback */
+
+	/* Initialize userdata */
+	HDmemset(&udata, 0, sizeof udata);
+	udata.common.layout = idx_info->layout;
+	udata.common.storage = idx_info->storage;
+        HDmemset(&udata.chunk_rec, 0, sizeof(udata.chunk_rec));
+        udata.filtered = (idx_info->pline->nused > 0);
+        if(!udata.filtered) {
+            udata.chunk_rec.nbytes = idx_info->layout->size;
+            udata.chunk_rec.filter_mask = 0;
+        } /* end if */
+	udata.cb = chunk_cb;
+	udata.udata = chunk_udata;
+	
+        /* Iterate over the fixed array elements */
+	if((ret_value = H5FA_iterate(fa, idx_info->dxpl_id, H5D__farray_idx_iterate_cb, &udata)) < 0)
+	    HERROR(H5E_DATASET, H5E_BADITER, "unable to iterate over fixed array chunk index");
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__farray_idx_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_idx_remove
+ *
+ * Purpose:	Remove chunk from index.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_idx_remove(const H5D_chk_idx_info_t *idx_info, H5D_chunk_common_ud_t *udata)
+{
+    H5FA_t      *fa;  	/* Pointer to fixed array structure */
+    hsize_t     idx;   	/* Array index of chunk */
+    herr_t	ret_value = SUCCEED;		/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(udata);
+
+    /* Check if the fixed array is open yet */
+    if(NULL == idx_info->storage->u.farray.fa)
+        /* Open the fixed array in file */
+        if(H5D__farray_idx_open(idx_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't open fixed array")
+
+    /* Set convenience pointer to fixed array structure */
+    fa = idx_info->storage->u.farray.fa;
+
+    /* Calculate the index of this chunk */
+    idx = H5VM_array_offset_pre((idx_info->layout->ndims - 1), idx_info->layout->max_down_chunks, udata->scaled);
+
+    /* Check for filters on chunks */
+    if(idx_info->pline->nused > 0) {
+        H5D_farray_filt_elmt_t elmt;            /* Fixed array element */
+
+        /* Get the info about the chunk for the index */
+        if(H5FA_get(fa, idx_info->dxpl_id, idx, &elmt) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get chunk info")
+
+        /* Remove raw data chunk from file */
+        HDassert(H5F_addr_defined(elmt.addr));
+        H5_CHECK_OVERFLOW(elmt.nbytes, /*From: */uint32_t, /*To: */hsize_t);
+        if(H5MF_xfree(idx_info->f, H5FD_MEM_DRAW, idx_info->dxpl_id, elmt.addr, (hsize_t)elmt.nbytes) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to free chunk")
+
+        /* Reset the info about the chunk for the index */
+        elmt.addr = HADDR_UNDEF;
+        elmt.nbytes = 0;
+        elmt.filter_mask = 0;
+        if(H5FA_set(fa, idx_info->dxpl_id, idx, &elmt) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to reset chunk info")
+    } /* end if */
+    else {
+        haddr_t     addr = HADDR_UNDEF;     /* Chunk address */
+
+        /* Get the address of the chunk for the index */
+        if(H5FA_get(fa, idx_info->dxpl_id, idx, &addr) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get chunk address")
+
+        /* Remove raw data chunk from file */
+        HDassert(H5F_addr_defined(addr));
+        H5_CHECK_OVERFLOW(idx_info->layout->size, /*From: */uint32_t, /*To: */hsize_t);
+        if(H5MF_xfree(idx_info->f, H5FD_MEM_DRAW, idx_info->dxpl_id, addr, (hsize_t)idx_info->layout->size) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to free chunk")
+
+        /* Reset the address of the chunk for the index */
+        addr = HADDR_UNDEF;
+        if(H5FA_set(fa, idx_info->dxpl_id, idx, &addr) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to reset chunk address")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__farray_idx_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_idx_delete_cb
+ *
+ * Purpose:	Delete space for chunk in file
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5D__farray_idx_delete_cb(hsize_t H5_ATTR_UNUSED idx, const void *_elmt, void *_udata)
+{
+    H5D_farray_del_ud_t *udata = (H5D_farray_del_ud_t *)_udata;         /* User data for callback */
+    haddr_t chunk_addr;                 /* Address of chunk */
+    uint32_t nbytes;                    /* Size of chunk */
+    int ret_value = H5_ITER_CONT;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(_elmt);
+    HDassert(udata);
+    HDassert(udata->f);
+
+    /* Check for filtered elements */
+    if(udata->filtered) {
+        const H5D_farray_filt_elmt_t *filt_elmt = (const H5D_farray_filt_elmt_t *)_elmt;
+
+        chunk_addr = filt_elmt->addr;
+        nbytes = filt_elmt->nbytes;
+    } /* end if */
+    else {
+        chunk_addr = *(const haddr_t *)_elmt;
+        nbytes = udata->unfilt_size;
+    } /* end else */
+
+    /* Remove raw data chunk from file */
+    H5_CHECK_OVERFLOW(nbytes, /*From: */uint32_t, /*To: */hsize_t);
+    if(H5MF_xfree(udata->f, H5FD_MEM_DRAW, udata->dxpl_id, chunk_addr, (hsize_t)nbytes) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, H5_ITER_ERROR, "unable to free chunk")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__farray_idx_delete_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_idx_delete
+ *
+ * Purpose:	Delete index and raw data storage for entire dataset
+ *              (i.e. all chunks)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_idx_delete(const H5D_chk_idx_info_t *idx_info)
+{
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+
+    /* Check if the index data structure has been allocated */
+    if(H5F_addr_defined(idx_info->storage->idx_addr)) {
+        H5FA_t      *fa;            /* Pointer to fixed array structure */
+        H5FA_stat_t fa_stat;        /* Fixed array statistics */
+        H5D_farray_ctx_ud_t ctx_udata;  /* User data for fixed array open call */
+
+        /* Check if the fixed array is open yet */
+        if(NULL == idx_info->storage->u.farray.fa)
+            /* Open the fixed array in file */
+            if(H5D__farray_idx_open(idx_info) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't open fixed array")
+
+        /* Set convenience pointer to fixed array structure */
+        fa = idx_info->storage->u.farray.fa;
+
+        /* Get the fixed array statistics */
+        if(H5FA_get_stats(fa, &fa_stat) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't query fixed array statistics")
+
+        /* Check if there are any array elements */
+        if(fa_stat.nelmts > 0) {
+            H5D_farray_del_ud_t udata;         /* User data for callback */
+
+            /* Initialize user data for callback */
+            udata.f = idx_info->f;
+            udata.dxpl_id = idx_info->dxpl_id;
+            udata.filtered = (idx_info->pline->nused > 0);
+            udata.unfilt_size = idx_info->layout->size;
+
+            /* Iterate over the chunk addresses in the fixed array, deleting each chunk */
+            if(H5FA_iterate(fa, idx_info->dxpl_id, H5D__farray_idx_delete_cb, &udata) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_BADITER, FAIL, "unable to iterate over chunk addresses")
+        } /* end if */
+
+        /* Close fixed array */
+        if(H5FA_close(idx_info->storage->u.farray.fa, idx_info->dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to close fixed array")
+        idx_info->storage->u.farray.fa = NULL;
+
+        /* Set up the user data */
+        ctx_udata.f = idx_info->f;
+        ctx_udata.chunk_size = idx_info->layout->size;
+
+        /* Delete fixed array */
+        if(H5FA_delete(idx_info->f, idx_info->dxpl_id, idx_info->storage->idx_addr, &ctx_udata) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTDELETE, FAIL, "unable to delete chunk fixed array")
+        idx_info->storage->idx_addr = HADDR_UNDEF;
+    } /* end if */
+    else
+        HDassert(NULL == idx_info->storage->u.farray.fa);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__farray_idx_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_idx_copy_setup
+ *
+ * Purpose:	Set up any necessary information for copying chunks
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_idx_copy_setup(const H5D_chk_idx_info_t *idx_info_src,
+    const H5D_chk_idx_info_t *idx_info_dst)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info_src);
+    HDassert(idx_info_src->f);
+    HDassert(idx_info_src->pline);
+    HDassert(idx_info_src->layout);
+    HDassert(idx_info_src->storage);
+    HDassert(idx_info_dst);
+    HDassert(idx_info_dst->f);
+    HDassert(idx_info_dst->pline);
+    HDassert(idx_info_dst->layout);
+    HDassert(idx_info_dst->storage);
+    HDassert(!H5F_addr_defined(idx_info_dst->storage->idx_addr));
+
+    /* Check if the source fixed array is open yet */
+    if(NULL == idx_info_src->storage->u.farray.fa)
+        /* Open the fixed array in file */
+        if(H5D__farray_idx_open(idx_info_src) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't open fixed array")
+
+    /* Set copied metadata tag */
+    H5_BEGIN_TAG(idx_info_dst->dxpl_id, H5AC__COPIED_TAG, FAIL);
+
+    /* Create the fixed array that describes chunked storage in the dest. file */
+    if(H5D__farray_idx_create(idx_info_dst) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize chunked storage")
+    HDassert(H5F_addr_defined(idx_info_dst->storage->idx_addr));
+
+    /* Reset metadata tag */
+    H5_END_TAG(FAIL);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__farray_idx_copy_setup() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_idx_copy_shutdown
+ *
+ * Purpose:	Shutdown any information from copying chunks
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_idx_copy_shutdown(H5O_storage_chunk_t *storage_src,
+    H5O_storage_chunk_t *storage_dst, hid_t dxpl_id)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(storage_src);
+    HDassert(storage_src->u.farray.fa);
+    HDassert(storage_dst);
+    HDassert(storage_dst->u.farray.fa);
+
+    /* Close fixed arrays */
+    if(H5FA_close(storage_src->u.farray.fa, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to close fixed array")
+    storage_src->u.farray.fa = NULL;
+    if(H5FA_close(storage_dst->u.farray.fa, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to close fixed array")
+    storage_dst->u.farray.fa = NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__farray_idx_copy_shutdown() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__farray_idx_size
+ *
+ * Purpose:     Retrieve the amount of index storage for chunked dataset
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        negative
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_idx_size(const H5D_chk_idx_info_t *idx_info, hsize_t *index_size)
+{
+    H5FA_t      *fa;                    /* Pointer to fixed array structure */
+    H5FA_stat_t fa_stat;                /* Fixed array statistics */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+    HDassert(index_size);
+
+    /* Open the fixed array in file */
+    if(H5D__farray_idx_open(idx_info) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "can't open fixed array")
+
+    /* Set convenience pointer to fixed array structure */
+    fa = idx_info->storage->u.farray.fa;
+
+    /* Get the fixed array statistics */
+    if(H5FA_get_stats(fa, &fa_stat) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't query fixed array statistics")
+
+    *index_size = fa_stat.hdr_size;
+    *index_size += fa_stat.dblk_size;
+
+done:
+    if(idx_info->storage->u.farray.fa) {
+        if(H5FA_close(idx_info->storage->u.farray.fa, idx_info->dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to close fixed array")
+        idx_info->storage->u.farray.fa = NULL;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__farray_idx_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_idx_reset
+ *
+ * Purpose:	Reset indexing information.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_idx_reset(H5O_storage_chunk_t *storage, hbool_t reset_addr)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(storage);
+
+    /* Reset index info */
+    if(reset_addr)
+	storage->idx_addr = HADDR_UNDEF;
+    storage->u.farray.fa = NULL;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__farray_idx_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_idx_dump
+ *
+ * Purpose:	Dump indexing information to a stream.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_idx_dump(const H5O_storage_chunk_t *storage, FILE *stream)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(storage);
+    HDassert(stream);
+
+    HDfprintf(stream, "    Address: %a\n", storage->idx_addr);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__farray_idx_dump() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__farray_idx_dest
+ *
+ * Purpose:	Release indexing information in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__farray_idx_dest(const H5D_chk_idx_info_t *idx_info)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->storage);
+
+    /* Check if the fixed array is open */
+    if(idx_info->storage->u.farray.fa) {
+        /* Close fixed array */
+        if(H5FA_close(idx_info->storage->u.farray.fa, idx_info->dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to close fixed array")
+        idx_info->storage->u.farray.fa = NULL;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__farray_idx_dest() */
+
diff --git a/src/H5Dfill.c b/src/H5Dfill.c
index 484c362..947a177 100644
--- a/src/H5Dfill.c
+++ b/src/H5Dfill.c
@@ -28,7 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
+
 
 /***********/
 /* Headers */
diff --git a/src/H5Dint.c b/src/H5Dint.c
index e48aabc..ed0e63e 100644
--- a/src/H5Dint.c
+++ b/src/H5Dint.c
@@ -17,10 +17,7 @@
 /* Module Setup */
 /****************/
 
-#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5D__init_interface
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
 
 
 /***********/
@@ -62,13 +59,16 @@ static H5D_shared_t *H5D__new(hid_t dcpl_id, hbool_t creating,
     hbool_t vl_type);
 static herr_t H5D__init_type(H5F_t *file, const H5D_t *dset, hid_t type_id,
     const H5T_t *type);
+static herr_t H5D__cache_dataspace_info(const H5D_t *dset);
 static herr_t H5D__init_space(H5F_t *file, const H5D_t *dset, const H5S_t *space);
+static herr_t H5D__swmr_setup(const H5D_t *dset, hid_t dxpl_id);
+static herr_t H5D__swmr_teardown(const H5D_t *dataset, hid_t dxpl_id);
 static herr_t H5D__update_oh_info(H5F_t *file, hid_t dxpl_id, H5D_t *dset,
     hid_t dapl_id);
 static herr_t H5D__open_oid(H5D_t *dataset, hid_t dapl_id, hid_t dxpl_id);
 static herr_t H5D__init_storage(const H5D_t *dataset, hbool_t full_overwrite,
     hsize_t old_dim[], hid_t dxpl_id);
-
+static herr_t H5D__append_flush_setup(H5D_t *dset, hid_t dapl_id);
 
 /*********************/
 /* Package Variables */
@@ -112,11 +112,14 @@ static H5D_shared_t H5D_def_dset;
 /* Dataset ID class */
 static const H5I_class_t H5I_DATASET_CLS[1] = {{
     H5I_DATASET,		/* ID class value */
-    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* Class flags */
     0,				/* # of reserved IDs for class */
     (H5I_free_t)H5D_close       /* Callback routine for closing objects of this class */
 }};
 
+/* Flag indicating "top" of interface has been initialized */
+static hbool_t H5D_top_package_initialize_s = FALSE;
+
 
 

 /*-------------------------------------------------------------------------
@@ -148,9 +151,9 @@ done:
 

 /*--------------------------------------------------------------------------
 NAME
-   H5D__init_interface -- Initialize interface-specific information
+   H5D__init_package -- Initialize interface-specific information
 USAGE
-    herr_t H5D__init_interface()
+    herr_t H5D__init_package()
 
 RETURNS
     Non-negative on success/Negative on failure
@@ -161,13 +164,13 @@ NOTES
     a deadlock in the library when the library is attempting to terminate -QAK
 
 --------------------------------------------------------------------------*/
-static herr_t
-H5D__init_interface(void)
+herr_t
+H5D__init_package(void)
 {
-    H5P_genplist_t *def_dcpl;               /* Default Dataset Creation Property list */
-    herr_t          ret_value                = SUCCEED;   /* Return value */
+    H5P_genplist_t *def_dcpl;           /* Default Dataset Creation Property list */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_STATIC
+    FUNC_ENTER_PACKAGE
 
     /* Initialize the atom group for the dataset IDs */
     if(H5I_register_type(H5I_DATASET_CLS) < 0)
@@ -201,34 +204,36 @@ H5D__init_interface(void)
     if(H5D__get_dxpl_cache_real(H5P_DATASET_XFER_DEFAULT, &H5D_def_dxpl_cache) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't retrieve default DXPL info")
 
+    /* Mark "top" of interface as initialized, too */
+    H5D_top_package_initialize_s = TRUE;
+
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5D__init_interface() */
+} /* end H5D__init_package() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5D_term_interface
+ * Function:	H5D_top_term_package
  *
- * Purpose:	Terminate this interface.
+ * Purpose:	Close the "top" of the interface, releasing IDs, etc.
  *
  * Return:	Success:	Positive if anything was done that might
  *				affect other interfaces; zero otherwise.
- *
  * 		Failure:	Negative.
  *
- * Programmer:	Robb Matzke
- *              Friday, November 20, 1998
+ * Programmer:	Quincey Koziol
+ *              Sunday, September 13, 2015
  *
  *-------------------------------------------------------------------------
  */
 int
-H5D_term_interface(void)
+H5D_top_term_package(void)
 {
     int	n = 0;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    if(H5_interface_initialize_g) {
+    if(H5D_top_package_initialize_s) {
 	if(H5I_nmembers(H5I_DATASET) > 0) {
             /* The dataset API uses the "force" flag set to true because it
              * is using the "file objects" (H5FO) API functions to track open
@@ -255,24 +260,55 @@ H5D_term_interface(void)
 	    (void)H5I_clear_type(H5I_DATASET, TRUE, FALSE);
             n++; /*H5I*/
 	} /* end if */
-        else {
-            /* Close public interface */
-            n += H5D__term_pub_interface();
 
-            /* Close deprecated interface */
-            n += H5D__term_deprec_interface();
+        /* Mark closed */
+        if(0 == n)
+            H5D_top_package_initialize_s = FALSE;
+    } /* end if */
 
-	    /* Destroy the dataset object id group */
-	    (void)H5I_dec_type_ref(H5I_DATASET);
-            n++; /*H5I*/
+    FUNC_LEAVE_NOAPI(n)
+} /* end H5D_top_term_package() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D_term_package
+ *
+ * Purpose:	Terminate this interface.
+ *
+ * Note:	Finishes shutting down the interface, after
+ *		H5D_top_term_package() is called
+ *
+ * Return:	Success:	Positive if anything was done that might
+ *				affect other interfaces; zero otherwise.
+ * 		Failure:	Negative.
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, November 20, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5D_term_package(void)
+{
+    int	n = 0;
 
-	    /* Mark closed */
-	    H5_interface_initialize_g = 0;
-	} /* end else */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_PKG_INIT_VAR) {
+        /* Sanity checks */
+        HDassert(0 == H5I_nmembers(H5I_DATASET));
+        HDassert(FALSE == H5D_top_package_initialize_s);
+
+        /* Destroy the dataset object id group */
+        n += (H5I_dec_type_ref(H5I_DATASET) > 0);
+
+        /* Mark closed */
+        if(0 == n)
+            H5_PKG_INIT_VAR = FALSE;
     } /* end if */
 
     FUNC_LEAVE_NOAPI(n)
-} /* end H5D_term_interface() */
+} /* end H5D_term_package() */
 
 

 /*--------------------------------------------------------------------------
@@ -349,8 +385,11 @@ H5D__get_dxpl_cache_real(hid_t dxpl_id, H5D_dxpl_cache_t *cache)
     if(H5P_get(dx_plist, H5D_XFER_FILTER_CB_NAME, &cache->filter_cb) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve filter callback function")
 
-    /* Get the data transform property */
-    if(H5P_get(dx_plist, H5D_XFER_XFORM_NAME, &cache->data_xform_prop) < 0)
+    /* Look at the data transform property */
+    /* (Note: 'peek', not 'get' - if this turns out to be a problem, we should
+     *          add a H5D__free_dxpl_cache() routine. -QAK)
+     */
+    if(H5P_peek(dx_plist, H5D_XFER_XFORM_NAME, &cache->data_xform_prop) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "Can't retrieve data transform info")
 
 done:
@@ -423,7 +462,7 @@ H5D__create_named(const H5G_loc_t *loc, const char *name, hid_t type_id,
 {
     H5O_obj_create_t ocrt_info;         /* Information for object creation */
     H5D_obj_create_t dcrt_info;         /* Information for dataset creation */
-    H5D_t	   *ret_value;          /* Return value */
+    H5D_t	   *ret_value = NULL;   /* Return value */
 
     FUNC_ENTER_PACKAGE
 
@@ -464,7 +503,7 @@ done:
 /*-------------------------------------------------------------------------
  * Function:    H5D__get_space_status
  *
- * Purpose:     Returns the status of dataspace allocation.
+ * Purpose:     Returns the status of data space allocation.
  *
  * Return:
  *              Success:        Non-negative
@@ -548,7 +587,7 @@ H5D__new(hid_t dcpl_id, hbool_t creating, hbool_t vl_type)
 {
     H5D_shared_t    *new_dset = NULL;   /* New dataset object */
     H5P_genplist_t  *plist;             /* Property list created */
-    H5D_shared_t    *ret_value;         /* Return value */
+    H5D_shared_t    *ret_value = NULL;  /* Return value */
 
     FUNC_ENTER_STATIC
 
@@ -609,7 +648,7 @@ H5D__init_type(H5F_t *file, const H5D_t *dset, hid_t type_id, const H5T_t *type)
 {
     htri_t relocatable;                 /* Flag whether the type is relocatable */
     htri_t immutable;                   /* Flag whether the type is immutable */
-    hbool_t use_latest_format;          /* Flag indicating the newest file format should be used */
+    hbool_t use_latest_format;          /* Flag indicating the 'latest datatype version support' is enabled */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
@@ -627,8 +666,8 @@ H5D__init_type(H5F_t *file, const H5D_t *dset, hid_t type_id, const H5T_t *type)
     if((immutable = H5T_is_immutable(type)) < 0)
         HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "can't check datatype?")
 
-    /* Get the file's 'use the latest version of the format' flag */
-    use_latest_format = H5F_USE_LATEST_FORMAT(file);
+    /* Get the file's 'use the latest datatype version support' flag */
+    use_latest_format = H5F_USE_LATEST_FLAGS(file, H5F_LATEST_DATATYPE);
 
     /* Copy the datatype if it's a custom datatype or if it'll change when it's location is changed */
     if(!immutable || relocatable || use_latest_format) {
@@ -665,6 +704,45 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5D__cache_dataspace_info
+ *
+ * Purpose:	Cache dataspace info for a dataset
+ *
+ * Return:	Success:    SUCCEED
+ *		Failure:    FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, November 19, 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__cache_dataspace_info(const H5D_t *dset)
+{
+    int sndims;                         /* Signed number of dimensions of dataspace rank */
+    unsigned u;                         /* Local index value */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checking */
+    HDassert(dset);
+
+    /* Cache info for dataset's dataspace */
+    if((sndims = H5S_get_simple_extent_dims(dset->shared->space, dset->shared->curr_dims, dset->shared->max_dims)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't cache dataspace dimensions")
+    dset->shared->ndims = (unsigned)sndims;
+
+    /* Compute the inital 'power2up' values */
+    for(u = 0; u < dset->shared->ndims; u++)
+        dset->shared->curr_power2up[u] = H5VM_power2up(dset->shared->curr_dims[u]);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__cache_dataspace_info() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5D__init_space
  *
  * Purpose:	Copy a dataspace for a dataset's use, performing all the
@@ -681,7 +759,7 @@ done:
 static herr_t
 H5D__init_space(H5F_t *file, const H5D_t *dset, const H5S_t *space)
 {
-    hbool_t use_latest_format;          /* Flag indicating the newest file format should be used */
+    hbool_t use_latest_format;          /* Flag indicating the 'latest dataspace version support' is enabled */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
@@ -691,13 +769,17 @@ H5D__init_space(H5F_t *file, const H5D_t *dset, const H5S_t *space)
     HDassert(dset);
     HDassert(space);
 
-    /* Get the file's 'use the latest version of the format' flag */
-    use_latest_format = H5F_USE_LATEST_FORMAT(file);
+    /* Get the file's 'use the latest dataspace version support' flag */
+    use_latest_format = H5F_USE_LATEST_FLAGS(file, H5F_LATEST_DATASPACE);
 
     /* Copy dataspace for dataset */
     if(NULL == (dset->shared->space = H5S_copy(space, FALSE, TRUE)))
         HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "can't copy dataspace")
 
+    /* Cache the dataset's dataspace info */
+    if(H5D__cache_dataspace_info(dset) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "can't cache dataspace info")
+
     /* Set the latest format, if requested */
     if(use_latest_format)
         if(H5S_set_latest_version(dset->shared->space) < 0)
@@ -713,6 +795,105 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5D__swmr_setup
+ *
+ * Purpose:	Set up SWMR access for a chunked dataset, if possible
+ *
+ * Return:	Success:    SUCCEED
+ *		Failure:    FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, April 27, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__swmr_setup(const H5D_t *dataset, hid_t dxpl_id)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checking */
+    HDassert(dataset);
+
+    /* Check if it's possible to enable swmr access to this dataset */
+    if(dataset->shared->layout.type == H5D_CHUNKED &&
+            dataset->shared->layout.storage.u.chunk.ops->can_swim &&
+            (H5F_INTENT(dataset->oloc.file) & H5F_ACC_SWMR_WRITE)) {
+        int chunkno;    /* Object header chunk index for message */
+
+        /* Get object header chunk index for dataspace message */
+        if((chunkno = H5O_msg_get_chunkno(&dataset->oloc, H5O_SDSPACE_ID, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to query dataspace chunk index")
+
+        /* Fail currently, if the dataspace message is not in chunk #0 */
+        /* (Note that this could be addressed by moving the dataspace message
+         *      into chunk #0, but that can be hard and we're deferring that
+         *      work for now. -QAK)
+         */
+        if(chunkno > 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "dataspace chunk index must be 0 for SWMR access, chunkno = %d", chunkno)
+
+        /* Pin the object header */
+        if(NULL == (dataset->shared->oh = H5O_pin(&dataset->oloc, dxpl_id)))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTPIN, FAIL, "unable to pin dataset object header")
+
+        /* Lock dataspace message into chunk #0 */
+        if(H5O_msg_lock(&dataset->oloc, H5O_SDSPACE_ID, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTLOCK, FAIL, "can't lock dataspace message into object header chunk #0")
+
+        /* Indicate that dataset is set up for SWMR access */
+        dataset->shared->is_swimming = TRUE;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__swmr_setup() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__swmr_teardown
+ *
+ * Purpose:	Tear down SWMR access for a chunked dataset.
+ *
+ * Return:	Success:    SUCCEED
+ *		Failure:    FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, April 27, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__swmr_teardown(const H5D_t *dataset, hid_t dxpl_id)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checking */
+    HDassert(dataset);
+    HDassert(dataset->shared->is_swimming);
+    HDassert(dataset->shared->oh);
+
+    /* Unlock dataspace message from chunk #0 */
+    if(H5O_msg_unlock(&dataset->oloc, H5O_SDSPACE_ID, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTUNLOCK, FAIL, "can't unlock dataspace message from object header chunk #0")
+
+    /* Release pointer to object header */
+    if(H5O_unpin(dataset->shared->oh) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTUNPIN, FAIL, "unable to unpin dataset object header")
+
+    /* Indicate that dataset is NOT set up for SWMR access now */
+    dataset->shared->is_swimming = FALSE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__swmr_teardown() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5D__update_oh_info
  *
  * Purpose:	Create and fill object header for dataset
@@ -733,7 +914,6 @@ H5D__update_oh_info(H5F_t *file, hid_t dxpl_id, H5D_t *dset, hid_t dapl_id)
     H5O_loc_t          *oloc = NULL;    /* Dataset's object location */
     H5O_layout_t       *layout;         /* Dataset's layout information */
     H5T_t              *type;           /* Dataset's datatype */
-    hbool_t             use_latest_format;      /* Flag indicating the newest file format should be used */
     H5O_fill_t		*fill_prop;     /* Pointer to dataset's fill value information */
     H5D_fill_value_t	fill_status;    /* Fill value status */
     hbool_t             fill_changed = FALSE;      /* Flag indicating the fill value was changed */
@@ -752,9 +932,6 @@ H5D__update_oh_info(H5F_t *file, hid_t dxpl_id, H5D_t *dset, hid_t dapl_id)
     type = dset->shared->type;
     fill_prop = &dset->shared->dcpl_cache.fill;
 
-    /* Get the file's 'use the latest version of the format' flag */
-    use_latest_format = H5F_USE_LATEST_FORMAT(file);
-
     /* Retrieve "defined" status of fill value */
     if(H5P_is_fill_value_defined(fill_prop, &fill_status) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't tell if fill value defined")
@@ -831,8 +1008,8 @@ H5D__update_oh_info(H5F_t *file, hid_t dxpl_id, H5D_t *dset, hid_t dapl_id)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update new fill value header message")
 
     /* If there is valid information for the old fill value struct, add it */
-    /* (only if we aren't trying to write the latest version of the file format) */
-    if(fill_prop->buf && !use_latest_format) {
+    /* (only if we aren't trying to write the 'latest fill message version support') */
+    if(fill_prop->buf && !(H5F_USE_LATEST_FLAGS(file, H5F_LATEST_FILL_MSG))) {
         H5O_fill_t old_fill_prop;       /* Copy of fill value property, for writing as "old" fill value */
 
         /* Shallow copy the fill value property */
@@ -878,13 +1055,17 @@ H5D__update_oh_info(H5F_t *file, hid_t dxpl_id, H5D_t *dset, hid_t dapl_id)
 #endif /* H5O_ENABLE_BOGUS */
 
     /* Add a modification time message, if using older format. */
-    /* (If using the latest format, the modification time is part of the object
+    /* (If using the latest 'no modification time message' version support, the modification time is part of the object
      *  header and doesn't use a separate message -QAK)
      */
-    if(!use_latest_format)
+    if(!(H5F_USE_LATEST_FLAGS(file, H5F_LATEST_NO_MOD_TIME_MSG)))
         if(H5O_touch_oh(file, dxpl_id, oh, TRUE) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update modification time message")
 
+    /* Set up SWMR writes to the dataset, if possible */
+    if(H5D__swmr_setup(dset, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to set up SWMR access for dataset")
+
 done:
     /* Release pointer to object header itself */
     if(oh != NULL)
@@ -892,12 +1073,11 @@ done:
             HDONE_ERROR(H5E_DATASET, H5E_CANTUNPIN, FAIL, "unable to unpin dataset object header")
 
     /* Error cleanup */
-    if(ret_value < 0) {
-        if(dset->shared->layout.type == H5D_CHUNKED && layout_init) {
-            if(H5D__chunk_dest(file, dxpl_id, dset) < 0)
-                HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to destroy chunk cache")
-        } /* end if */
-    } /* end if */
+    if(ret_value < 0)
+        if(layout_init)
+            /* Destroy the layout information for the dataset */
+            if(dset->shared->layout.ops->dest && (dset->shared->layout.ops->dest)(dset, dxpl_id) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to destroy layout info")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D__update_oh_info() */
@@ -932,8 +1112,12 @@ H5D__create(H5F_t *file, hid_t type_id, const H5S_t *space, hid_t dcpl_id,
     H5P_genplist_t 	*dc_plist = NULL;       /* New Property list */
     hbool_t             has_vl_type = FALSE;    /* Flag to indicate a VL-type for dataset */
     hbool_t             layout_init = FALSE;    /* Flag to indicate that chunk information was initialized */
+    hbool_t             layout_copied = FALSE;  /* Flag to indicate that layout message was copied */
+    hbool_t             fill_copied = FALSE;    /* Flag to indicate that fill-value message was copied */
+    hbool_t             pline_copied = FALSE;   /* Flag to indicate that pipeline message was copied */
+    hbool_t             efl_copied = FALSE;     /* Flag to indicate that external file list message was copied */
     H5G_loc_t           dset_loc;               /* Dataset location */
-    H5D_t		*ret_value;             /* Return value */
+    H5D_t		*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_PACKAGE
 
@@ -989,6 +1173,7 @@ H5D__create(H5F_t *file, hid_t type_id, const H5S_t *space, hid_t dcpl_id,
         H5O_layout_t    *layout;        /* Dataset's layout information */
         H5O_pline_t     *pline;         /* Dataset's I/O pipeline information */
         H5O_fill_t      *fill;          /* Dataset's fill value info */
+        H5O_efl_t       *efl;           /* Dataset's external file list info */
 
         /* Check if the filters in the DCPL can be applied to this dataset */
         if(H5Z_can_apply(new_dset->shared->dcpl_id, new_dset->shared->type_id) < 0)
@@ -1005,15 +1190,24 @@ H5D__create(H5F_t *file, hid_t type_id, const H5S_t *space, hid_t dcpl_id,
         /* Retrieve the properties we need */
         pline = &new_dset->shared->dcpl_cache.pline;
         if(H5P_get(dc_plist, H5O_CRT_PIPELINE_NAME, pline) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't retrieve pipeline filter")
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, NULL, "can't retrieve pipeline filter")
+        pline_copied = TRUE;
         layout = &new_dset->shared->layout;
         if(H5P_get(dc_plist, H5D_CRT_LAYOUT_NAME, layout) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't retrieve layout")
-        if(pline->nused > 0 && H5D_CHUNKED != layout->type)
-            HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, NULL, "filters can only be used with chunked layout")
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, NULL, "can't retrieve layout")
+        layout_copied = TRUE;
         fill = &new_dset->shared->dcpl_cache.fill;
         if(H5P_get(dc_plist, H5D_CRT_FILL_VALUE_NAME, fill) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't retrieve fill value info")
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, NULL, "can't retrieve fill value info")
+        fill_copied = TRUE;
+        efl = &new_dset->shared->dcpl_cache.efl;
+        if(H5P_get(dc_plist, H5D_CRT_EXT_FILE_LIST_NAME, efl) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, NULL, "can't retrieve external file list")
+        efl_copied = TRUE;
+
+        /* Check that chunked layout is used if filters are enabled */
+        if(pline->nused > 0 && H5D_CHUNKED != layout->type)
+            HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, NULL, "filters can only be used with chunked layout")
 
         /* Check if the alloc_time is the default and error out */
         if(fill->alloc_time == H5D_ALLOC_TIME_DEFAULT)
@@ -1026,21 +1220,31 @@ H5D__create(H5F_t *file, hid_t type_id, const H5S_t *space, hid_t dcpl_id,
         /* If MPI VFD is used, no filter support yet. */
         if(H5F_HAS_FEATURE(file, H5FD_FEAT_HAS_MPI) && pline->nused > 0)
             HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, NULL, "Parallel I/O does not support filters yet")
-
-        /* Get the dataset's external file list information */
-        if(H5P_get(dc_plist, H5D_CRT_EXT_FILE_LIST_NAME, &new_dset->shared->dcpl_cache.efl) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't retrieve external file list")
     } /* end if */
 
     /* Set the latest version of the layout, pline & fill messages, if requested */
-    if(H5F_USE_LATEST_FORMAT(file)) {
+    if(H5F_USE_LATEST_FLAGS(file, H5F_LATEST_DSET_MSG_FLAGS)) {
         /* Set the latest version for the I/O pipeline message */
-        if(H5O_pline_set_latest_version(&new_dset->shared->dcpl_cache.pline) < 0)
-            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, NULL, "can't set latest version of I/O filter pipeline")
-
-        /* Set the latest version for the fill value message */
-        if(H5O_fill_set_latest_version(&new_dset->shared->dcpl_cache.fill) < 0)
-            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, NULL, "can't set latest version of fill value")
+	if(H5F_USE_LATEST_FLAGS(file, H5F_LATEST_PLINE_MSG))
+	    if(H5O_pline_set_latest_version(&new_dset->shared->dcpl_cache.pline) < 0)
+		HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, NULL, "can't set latest version of I/O filter pipeline")
+
+        /* Set the latest version for the fill message */
+	if(H5F_USE_LATEST_FLAGS(file, H5F_LATEST_FILL_MSG))
+	    /* Set the latest version for the fill value message */
+	    if(H5O_fill_set_latest_version(&new_dset->shared->dcpl_cache.fill) < 0)
+		HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, NULL, "can't set latest version of fill value")
+
+        /* Set the latest version for the layout message */
+	if(H5F_USE_LATEST_FLAGS(file, H5F_LATEST_LAYOUT_MSG))
+	    /* Set the latest version for the layout message */
+	    if(H5D__layout_set_latest_version(&new_dset->shared->layout, new_dset->shared->space, &new_dset->shared->dcpl_cache) < 0)
+		HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, NULL, "can't set latest version of layout")
+    } /* end if */
+    else if(new_dset->shared->layout.version >= H5O_LAYOUT_VERSION_4) {
+	/* Use latest indexing type for layout message version >= 4 */
+        if(H5D__layout_set_latest_indexing(&new_dset->shared->layout, new_dset->shared->space, &new_dset->shared->dcpl_cache) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, NULL, "can't set latest indexing")
     } /* end if */
 
     /* Check if this dataset is going into a parallel file and set space allocation time */
@@ -1052,7 +1256,7 @@ H5D__create(H5F_t *file, hid_t type_id, const H5S_t *space, hid_t dcpl_id,
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to initialize I/O operations")
 
     /* Create the layout information for the new dataset */
-    if((new_dset->shared->layout.ops->construct)(file, new_dset) < 0)
+    if(new_dset->shared->layout.ops->construct && (new_dset->shared->layout.ops->construct)(file, new_dset) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "unable to construct layout information")
 
     /* Update the dataset's object header info. */
@@ -1062,6 +1266,9 @@ H5D__create(H5F_t *file, hid_t type_id, const H5S_t *space, hid_t dcpl_id,
     /* Indicate that the layout information was initialized */
     layout_init = TRUE;
 
+    if(H5D__append_flush_setup(new_dset, dapl_id) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINC, NULL, "unable to set up flush append property")
+
     /* Add the dataset to the list of opened objects in the file */
     if(H5FO_top_incr(new_dset->oloc.file, new_dset->oloc.addr) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINC, NULL, "can't incr object ref. count")
@@ -1075,10 +1282,21 @@ H5D__create(H5F_t *file, hid_t type_id, const H5S_t *space, hid_t dcpl_id,
 done:
     if(!ret_value && new_dset && new_dset->shared) {
         if(new_dset->shared) {
-            if(new_dset->shared->layout.type == H5D_CHUNKED && layout_init) {
-                if(H5D__chunk_dest(file, dxpl_id, new_dset) < 0)
-                    HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, NULL, "unable to destroy chunk cache")
-            } /* end if */
+            if(layout_init)
+                if(new_dset->shared->layout.ops->dest && (new_dset->shared->layout.ops->dest)(new_dset, dxpl_id) < 0)
+                    HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, NULL, "unable to destroy layout info")
+            if(pline_copied)
+                if(H5O_msg_reset(H5O_PLINE_ID, &new_dset->shared->dcpl_cache.pline) < 0)
+                    HDONE_ERROR(H5E_DATASET, H5E_CANTRESET, NULL, "unable to reset I/O pipeline info")
+            if(layout_copied)
+                if(H5O_msg_reset(H5O_LAYOUT_ID, &new_dset->shared->layout) < 0)
+                    HDONE_ERROR(H5E_DATASET, H5E_CANTRESET, NULL, "unable to reset layout info")
+            if(fill_copied)
+                if(H5O_msg_reset(H5O_FILL_ID, &new_dset->shared->dcpl_cache.fill) < 0)
+                    HDONE_ERROR(H5E_DATASET, H5E_CANTRESET, NULL, "unable to reset fill-value info")
+            if(efl_copied)
+                if(H5O_msg_reset(H5O_EFL_ID, &new_dset->shared->dcpl_cache.efl) < 0)
+                    HDONE_ERROR(H5E_DATASET, H5E_CANTRESET, NULL, "unable to reset external file list info")
             if(new_dset->shared->space && H5S_close(new_dset->shared->space) < 0)
                 HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, NULL, "unable to release dataspace")
             if(new_dset->shared->type && H5I_dec_ref(new_dset->shared->type_id) < 0)
@@ -1105,6 +1323,69 @@ done:
 } /* end H5D__create() */
 
 

+/*-------------------------------------------------------------------------
+ * Function:    H5D__open_name
+ *
+ * Purpose:     Opens an existing dataset by name.
+ *
+ * Return:      Success:        Ptr to a new dataset.
+ *              Failure:        NULL
+ *
+ * Programmer:  Neil Fortner
+ *              Friday, March 6, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+H5D_t *
+H5D__open_name(const H5G_loc_t *loc, const char *name, hid_t dapl_id,
+    hid_t dxpl_id)
+{
+    H5D_t       *dset = NULL;
+    H5G_loc_t   dset_loc;               /* Object location of dataset */
+    H5G_name_t  path;                   /* Dataset group hier. path */
+    H5O_loc_t   oloc;                   /* Dataset object location */
+    H5O_type_t  obj_type;               /* Type of object at location */
+    hbool_t     loc_found = FALSE;      /* Location at 'name' found */
+    H5D_t       *ret_value = NULL;      /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    HDassert(loc);
+    HDassert(name);
+
+    /* Set up dataset location to fill in */
+    dset_loc.oloc = &oloc;
+    dset_loc.path = &path;
+    H5G_loc_reset(&dset_loc);
+
+    /* Find the dataset object */
+    if(H5G_loc_find(loc, name, &dset_loc, dapl_id, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_NOTFOUND, NULL, "not found")
+    loc_found = TRUE;
+
+    /* Check that the object found is the correct type */
+    if(H5O_obj_type(&oloc, &obj_type, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, NULL, "can't get object type")
+    if(obj_type != H5O_TYPE_DATASET)
+        HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, NULL, "not a dataset")
+
+    /* Open the dataset */
+    if(NULL == (dset = H5D_open(&dset_loc, dapl_id, dxpl_id)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "can't open dataset")
+
+    /* Set return value */
+    ret_value = dset;
+
+done:
+    if(!ret_value)
+        if(loc_found && H5G_loc_free(&dset_loc) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, NULL, "can't free location")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__open_name() */
+
+

 /*
  *-------------------------------------------------------------------------
  * Function:	H5D_open
@@ -1125,7 +1406,7 @@ H5D_open(const H5G_loc_t *loc, hid_t dapl_id, hid_t dxpl_id)
 {
     H5D_shared_t    *shared_fo = NULL;
     H5D_t           *dataset = NULL;
-    H5D_t           *ret_value;              /* Return value */
+    H5D_t           *ret_value = NULL;          /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -1206,6 +1487,86 @@ done:
 } /* end H5D_open() */
 
 

+/*
+ *-------------------------------------------------------------------------
+ * Function:	H5D__flush_append_setup
+ *
+ * Purpose:	
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__append_flush_setup(H5D_t *dset, hid_t dapl_id) 
+{
+    herr_t ret_value = SUCCEED;         /* return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(dset);
+    HDassert(dset->shared);
+
+    /* Set default append flush values */
+    dset->shared->append_flush.ndims = 0;
+    dset->shared->append_flush.func = NULL;
+    dset->shared->append_flush.udata = NULL;
+    HDmemset(dset->shared->append_flush.boundary,  0, sizeof(dset->shared->append_flush.boundary));
+
+    if(dapl_id != H5P_DATASET_ACCESS_DEFAULT && dset->shared->layout.type == H5D_CHUNKED) {
+        H5P_genplist_t *dapl;               /* data access property list object pointer */
+
+	/* Get dataset access property list */
+	if(NULL == (dapl = (H5P_genplist_t *)H5I_object(dapl_id)))
+	    HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for dapl ID");
+
+	/* Check if append flush property exists */
+	if(H5P_exist_plist(dapl, H5D_ACS_APPEND_FLUSH_NAME) > 0) {
+            H5D_append_flush_t info;
+
+	    /* Get append flush property */
+	    if(H5P_get(dapl, H5D_ACS_APPEND_FLUSH_NAME, &info) < 0)
+		HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get append flush info")
+	    else if(info.ndims > 0) {
+                hsize_t curr_dims[H5S_MAX_RANK];	/* current dimension sizes */
+                hsize_t max_dims[H5S_MAX_RANK];		/* current dimension sizes */
+                int rank;                       	/* dataspace # of dimensions */
+                unsigned u;     			/* local index variable */
+
+		/* Get dataset rank */
+		if((rank = H5S_get_simple_extent_dims(dset->shared->space, curr_dims, max_dims)) < 0)
+		    HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset dimensions")
+
+		if(info.ndims != (unsigned)rank)
+		    HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "boundary dimension rank does not match dataset rank")
+
+		/* Validate boundary sizes */
+		for(u = 0; u < info.ndims; u++) {
+		    if(info.boundary[u] != 0) /* when a non-zero boundary is set */
+			/* the dimension is extendible? */
+			if(max_dims[u] != H5S_UNLIMITED && max_dims[u] == curr_dims[u])
+			    break;
+		} /* end for */
+
+		if(u != info.ndims) /* at least one boundary dimension is not extendible */
+		    HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "boundary dimension is not valid")
+
+		dset->shared->append_flush.ndims = info.ndims;
+		dset->shared->append_flush.func = info.func;
+		dset->shared->append_flush.udata = info.udata;
+		HDmemcpy(dset->shared->append_flush.boundary, info.boundary, sizeof(info.boundary));
+	    } /* end else-if */
+	} /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__append_flush_setup() */
+
+

 /*-------------------------------------------------------------------------
  * Function:	H5D__open_oid
  *
@@ -1228,7 +1589,7 @@ H5D__open_oid(H5D_t *dataset, hid_t dapl_id, hid_t dxpl_id)
     hbool_t layout_init = FALSE;    	/* Flag to indicate that chunk information was initialized */
     herr_t ret_value = SUCCEED;		/* Return value */
 
-    FUNC_ENTER_STATIC
+    FUNC_ENTER_STATIC_TAG(dxpl_id, dataset->oloc.addr, FAIL)
 
     /* check args */
     HDassert(dataset);
@@ -1251,6 +1612,10 @@ H5D__open_oid(H5D_t *dataset, hid_t dapl_id, hid_t dxpl_id)
     if(NULL == (dataset->shared->space = H5S_read(&(dataset->oloc), dxpl_id)))
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to load dataspace info from dataset header")
 
+    /* Cache the dataset's dataspace info */
+    if(H5D__cache_dataspace_info(dataset) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "can't cache dataspace info")
+
     /* Get a datatype ID for the dataset's datatype */
     if((dataset->shared->type_id = H5I_register(H5I_DATATYPE, dataset->shared->type, FALSE)) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register type")
@@ -1266,6 +1631,10 @@ H5D__open_oid(H5D_t *dataset, hid_t dapl_id, hid_t dxpl_id)
     /* Indicate that the layout information was initialized */
     layout_init = TRUE;
 
+    /* Set up flush append property */
+    if(H5D__append_flush_setup(dataset, dapl_id))
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINC, FAIL, "unable to set up flush append property")
+
     /* Point at dataset's copy, to cache it for later */
     fill_prop = &dataset->shared->dcpl_cache.fill;
 
@@ -1299,6 +1668,10 @@ H5D__open_oid(H5D_t *dataset, hid_t dapl_id, hid_t dxpl_id)
                     fill_prop->alloc_time = H5D_ALLOC_TIME_INCR;
                     break;
 
+                case H5D_VIRTUAL:
+                    fill_prop->alloc_time = H5D_ALLOC_TIME_INCR;
+                    break;
+
                 case H5D_LAYOUT_ERROR:
                 case H5D_NLAYOUTS:
                 default:
@@ -1313,7 +1686,8 @@ H5D__open_oid(H5D_t *dataset, hid_t dapl_id, hid_t dxpl_id)
     alloc_time_state = 0;
     if((dataset->shared->layout.type == H5D_COMPACT && fill_prop->alloc_time == H5D_ALLOC_TIME_EARLY)
             || (dataset->shared->layout.type == H5D_CONTIGUOUS && fill_prop->alloc_time == H5D_ALLOC_TIME_LATE)
-            || (dataset->shared->layout.type == H5D_CHUNKED && fill_prop->alloc_time == H5D_ALLOC_TIME_INCR))
+            || (dataset->shared->layout.type == H5D_CHUNKED && fill_prop->alloc_time == H5D_ALLOC_TIME_INCR)
+            || (dataset->shared->layout.type == H5D_VIRTUAL && fill_prop->alloc_time == H5D_ALLOC_TIME_INCR))
         alloc_time_state = 1;
 
     /* Set revised fill value properties, if they are different from the defaults */
@@ -1336,14 +1710,18 @@ H5D__open_oid(H5D_t *dataset, hid_t dapl_id, hid_t dxpl_id)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize file storage")
     } /* end if */
 
+    /* Set up SWMR writes to the dataset, if possible */
+    if(H5D__swmr_setup(dataset, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to set up SWMR access for dataset")
+
 done:
     if(ret_value < 0) {
         if(H5F_addr_defined(dataset->oloc.addr) && H5O_close(&(dataset->oloc)) < 0)
             HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release object header")
         if(dataset->shared) {
-	    if(dataset->shared->layout.type == H5D_CHUNKED && layout_init)
-                if(H5D__chunk_dest(dataset->oloc.file, dxpl_id, dataset) < 0)
-                    HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to destroy chunk cache")
+	    if(layout_init)
+                if(dataset->shared->layout.ops->dest && (dataset->shared->layout.ops->dest)(dataset, dxpl_id) < 0)
+                    HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to destroy layout info")
             if(dataset->shared->space && H5S_close(dataset->shared->space) < 0)
                 HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataspace")
             if(dataset->shared->type) {
@@ -1359,7 +1737,7 @@ done:
         } /* end if */
     } /* end if */
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5D__open_oid() */
 
 

@@ -1380,8 +1758,9 @@ done:
 herr_t
 H5D_close(H5D_t *dataset)
 {
-    unsigned free_failed = FALSE;
-    herr_t ret_value = SUCCEED;      /* Return value */
+    hbool_t free_failed = FALSE;
+    hbool_t corked;			/* Whether the dataset is corked or not */
+    herr_t ret_value = SUCCEED;      	/* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1400,16 +1779,18 @@ H5D_close(H5D_t *dataset)
         if(H5D__flush_real(dataset, H5AC_dxpl_id) < 0)
             HDONE_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to flush cached dataset info")
 
-        /* Free the data sieve buffer, if it's been allocated */
-        if(dataset->shared->cache.contig.sieve_buf) {
-            HDassert(dataset->shared->layout.type != H5D_COMPACT);      /* We should never have a sieve buffer for compact storage */
-
-            dataset->shared->cache.contig.sieve_buf = (unsigned char *)H5FL_BLK_FREE(sieve_buf,dataset->shared->cache.contig.sieve_buf);
-        } /* end if */
+        /* Set a flag to indicate the dataset is closing, before we start freeing things */
+        /* (Avoids problems with flushing datasets twice, when one is holding
+         *      the file open and it iterates through dataset to flush them -QAK)
+         */
+        dataset->shared->closing = TRUE;
 
         /* Free cached information for each kind of dataset */
         switch(dataset->shared->layout.type) {
             case H5D_CONTIGUOUS:
+                /* Free the data sieve buffer, if it's been allocated */
+                if(dataset->shared->cache.contig.sieve_buf)
+                    dataset->shared->cache.contig.sieve_buf = (unsigned char *)H5FL_BLK_FREE(sieve_buf,dataset->shared->cache.contig.sieve_buf);
                 break;
 
             case H5D_CHUNKED:
@@ -1431,18 +1812,40 @@ H5D_close(H5D_t *dataset)
                     dataset->shared->cache.chunk.single_chunk_info = H5FL_FREE(H5D_chunk_info_t, dataset->shared->cache.chunk.single_chunk_info);
                     dataset->shared->cache.chunk.single_chunk_info = NULL;
                 } /* end if */
-
-                /* Flush and destroy chunks in the cache. Continue to close even if 
-                 * it fails. */
-                if(H5D__chunk_dest(dataset->oloc.file, H5AC_dxpl_id, dataset) < 0)
-                    HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to destroy chunk cache")
                 break;
 
             case H5D_COMPACT:
-                /* Free the buffer for the raw data for compact datasets */
-                dataset->shared->layout.storage.u.compact.buf = H5MM_xfree(dataset->shared->layout.storage.u.compact.buf);
+                /* Nothing special to do (info freed in the layout destroy) */
                 break;
 
+            case H5D_VIRTUAL:
+            {
+                size_t i, j;
+
+                HDassert(dataset->shared->layout.storage.u.virt.list || (dataset->shared->layout.storage.u.virt.list_nused == 0));
+
+                /* Close source datasets */
+                for(i = 0; i < dataset->shared->layout.storage.u.virt.list_nused; i++) {
+                    /* Close source dataset */
+                    if(dataset->shared->layout.storage.u.virt.list[i].source_dset.dset) {
+                        HDassert(dataset->shared->layout.storage.u.virt.list[i].source_dset.dset != dataset);
+                        if(H5D_close(dataset->shared->layout.storage.u.virt.list[i].source_dset.dset) < 0)
+                            HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to close source dataset")
+                        dataset->shared->layout.storage.u.virt.list[i].source_dset.dset = NULL;
+                    } /* end if */
+
+                    /* Close sub datasets */
+                    for(j = 0; j < dataset->shared->layout.storage.u.virt.list[i].sub_dset_nused; j++)
+                        if(dataset->shared->layout.storage.u.virt.list[i].sub_dset[j].dset) {
+                            HDassert(dataset->shared->layout.storage.u.virt.list[i].sub_dset[j].dset != dataset);
+                            if(H5D_close(dataset->shared->layout.storage.u.virt.list[i].sub_dset[j].dset) < 0)
+                                HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to close source dataset")
+                            dataset->shared->layout.storage.u.virt.list[i].sub_dset[j].dset = NULL;
+                        } /* end if */
+                } /* end for */
+            } /* end block */
+            break;
+
             case H5D_LAYOUT_ERROR:
             case H5D_NLAYOUTS:
             default:
@@ -1452,12 +1855,36 @@ H5D_close(H5D_t *dataset)
 #endif /* NDEBUG */
         } /* end switch */ /*lint !e788 All appropriate cases are covered */
 
+        /* Destroy any cached layout information for the dataset */
+        if(dataset->shared->layout.ops->dest && (dataset->shared->layout.ops->dest)(dataset, H5AC_dxpl_id) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to destroy layout info")
+
+        /* Release layout, fill-value, efl & pipeline messages */
+        if(dataset->shared->dcpl_id != H5P_DATASET_CREATE_DEFAULT)
+            free_failed |= (H5O_msg_reset(H5O_PLINE_ID, &dataset->shared->dcpl_cache.pline) < 0) ||
+                    (H5O_msg_reset(H5O_LAYOUT_ID, &dataset->shared->layout) < 0) ||
+                    (H5O_msg_reset(H5O_FILL_ID, &dataset->shared->dcpl_cache.fill) < 0) ||
+                    (H5O_msg_reset(H5O_EFL_ID, &dataset->shared->dcpl_cache.efl) < 0);
+
+	/* Uncork cache entries with object address tag */
+	if(H5AC_cork(dataset->oloc.file, dataset->oloc.addr, H5AC__GET_CORKED, &corked) < 0)
+	    HDONE_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve an object's cork status")
+	else if(corked)
+	    if(H5AC_cork(dataset->oloc.file, dataset->oloc.addr, H5AC__UNCORK, NULL) < 0)
+		HDONE_ERROR(H5E_DATASET, H5E_CANTUNCORK, FAIL, "unable to uncork an object")
+
+        /* If the dataset is opened for SWMR access, shut that down */
+        if(dataset->shared->is_swimming)
+            if(H5D__swmr_teardown(dataset, H5AC_dxpl_id) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to shut down SWMR access")
+        
         /*
-        * Release datatype, dataspace and creation property list -- there isn't
-        * much we can do if one of these fails, so we just continue.
-        */
-        free_failed = (unsigned)(H5I_dec_ref(dataset->shared->type_id) < 0 || H5S_close(dataset->shared->space) < 0 ||
-                          H5I_dec_ref(dataset->shared->dcpl_id) < 0);
+         * Release datatype, dataspace and creation property list -- there isn't
+         * much we can do if one of these fails, so we just continue.
+         */
+        free_failed |= (H5I_dec_ref(dataset->shared->type_id) < 0) ||
+                          (H5S_close(dataset->shared->space) < 0) ||
+                          (H5I_dec_ref(dataset->shared->dcpl_id) < 0);
 
         /* Remove the dataset from the list of opened objects in the file */
         if(H5FO_top_decr(dataset->oloc.file, dataset->oloc.addr) < 0)
@@ -1513,6 +1940,141 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5D_mult_refresh_close
+ *
+ * Purpose:	Closing down the needed information when the dataset has
+ *		multiple opens.  (From H5O_refresh_metadata_close())
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; 12/24/15
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D_mult_refresh_close(hid_t dset_id, hid_t dxpl_id)
+{
+    H5D_t       *dataset;             	/* Dataset to refresh */
+    herr_t      ret_value = SUCCEED;    /* return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    if(NULL == (dataset = (H5D_t *)H5I_object_verify(dset_id, H5I_DATASET)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+
+    /* check args */
+    HDassert(dataset && dataset->oloc.file && dataset->shared);
+    HDassert(dataset->shared->fo_count > 0);
+
+    if(dataset->shared->fo_count > 1) {
+        /* Free cached information for each kind of dataset */
+        switch(dataset->shared->layout.type) {
+            case H5D_CONTIGUOUS:
+                /* Free the data sieve buffer, if it's been allocated */
+                if(dataset->shared->cache.contig.sieve_buf)
+                    dataset->shared->cache.contig.sieve_buf = (unsigned char *)H5FL_BLK_FREE(sieve_buf,dataset->shared->cache.contig.sieve_buf);
+                break;
+
+            case H5D_CHUNKED:
+                /* Check for skip list for iterating over chunks during I/O to close */
+                if(dataset->shared->cache.chunk.sel_chunks) {
+                    HDassert(H5SL_count(dataset->shared->cache.chunk.sel_chunks) == 0);
+                    H5SL_close(dataset->shared->cache.chunk.sel_chunks);
+                    dataset->shared->cache.chunk.sel_chunks = NULL;
+                } /* end if */
+
+                /* Check for cached single chunk dataspace */
+                if(dataset->shared->cache.chunk.single_space) {
+                    (void)H5S_close(dataset->shared->cache.chunk.single_space);
+                    dataset->shared->cache.chunk.single_space = NULL;
+                } /* end if */
+
+                /* Check for cached single element chunk info */
+                if(dataset->shared->cache.chunk.single_chunk_info) {
+                    dataset->shared->cache.chunk.single_chunk_info = H5FL_FREE(H5D_chunk_info_t, dataset->shared->cache.chunk.single_chunk_info);
+                    dataset->shared->cache.chunk.single_chunk_info = NULL;
+                } /* end if */
+                break;
+
+            case H5D_COMPACT:
+                /* Nothing special to do (info freed in the layout destroy) */
+                break;
+
+            case H5D_VIRTUAL:
+		break;
+
+            case H5D_LAYOUT_ERROR:
+            case H5D_NLAYOUTS:
+            default:
+                HDassert("not implemented yet" && 0);
+#ifdef NDEBUG
+                HGOTO_ERROR(H5E_IO, H5E_UNSUPPORTED, FAIL, "unsupported storage layout")
+#endif /* NDEBUG */
+        } /* end switch */ /*lint !e788 All appropriate cases are covered */
+
+        /* Destroy any cached layout information for the dataset */
+        if(dataset->shared->layout.ops->dest && (dataset->shared->layout.ops->dest)(dataset, dxpl_id) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to destroy layout info")
+
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D_mult_refresh_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D_mult_refresh_reopen
+ *
+ * Purpose:	Re-initialize the needed info when the dataset has multiple
+ *		opens. (From H5O_refresh_metadata_reopen())
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; 12/24/15
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D_mult_refresh_reopen(H5D_t *dataset, hid_t dxpl_id)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(dataset && dataset->oloc.file && dataset->shared);
+    HDassert(dataset->shared->fo_count > 0);
+
+    if(dataset->shared->fo_count > 1) {
+
+	/* Release dataspace info */
+	if(H5S_close(dataset->shared->space) < 0)
+	    HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to release dataspace")
+
+	/* Re-load dataspace info */
+	if(NULL == (dataset->shared->space = H5S_read(&(dataset->oloc), dxpl_id)))
+	    HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to load dataspace info from dataset header")
+
+	/* Cache the dataset's dataspace info */
+	if(H5D__cache_dataspace_info(dataset) < 0)
+	    HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "can't cache dataspace info")
+    
+	if(H5O_msg_reset(H5O_LAYOUT_ID, &dataset->shared->layout) < 0)
+	    HGOTO_ERROR(H5E_DATASET, H5E_CANTRESET, NULL, "unable to reset layout info")
+
+	/* Re-load layout message info */
+	if(NULL == H5O_msg_read(&(dataset->oloc), H5O_LAYOUT_ID, &(dataset->shared->layout), dxpl_id))
+	    HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to read data layout message")	
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* H5D_mult_refresh_reopen() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5D_oloc
  *
  * Purpose:	Returns a pointer to the object location for a dataset.
@@ -1644,7 +2206,7 @@ H5D__alloc_storage(const H5D_t *dset, hid_t dxpl_id, H5D_time_alloc_t time_alloc
 
             case H5D_CHUNKED:
                 if(!(*dset->shared->layout.ops->is_space_alloc)(&dset->shared->layout.storage)) {
-                    /* Create the root of the B-tree that describes chunked storage */
+                    /* Create the root of the index that manages chunked storage */
                     if(H5D__chunk_create(dset /*in,out*/, dxpl_id) < 0)
                         HGOTO_ERROR(H5E_IO, H5E_CANTINIT, FAIL, "unable to initialize chunked storage")
 
@@ -1657,7 +2219,7 @@ H5D__alloc_storage(const H5D_t *dset, hid_t dxpl_id, H5D_time_alloc_t time_alloc
 
                 /* If space allocation is set to 'early' and we are extending
 		 * the dataset, indicate that space should be allocated, so the
-                 * B-tree gets expanded. -QAK
+                 * index gets expanded. -QAK
                  */
 		if(dset->shared->dcpl_cache.fill.alloc_time == H5D_ALLOC_TIME_EARLY
                         && time_alloc == H5D_ALLOC_EXTEND)
@@ -1687,6 +2249,15 @@ H5D__alloc_storage(const H5D_t *dset, hid_t dxpl_id, H5D_time_alloc_t time_alloc
                 } /* end if */
                 break;
 
+            case H5D_VIRTUAL:
+                /* No-op, as the raw data is stored elsewhere and the global
+                 * heap object containing the mapping information is created
+                 * when the layout message is encoded.  We may wish to move the
+                 * creation of the global heap object here at some point, but we
+                 * will have to make sure is it always created before the
+                 * dataset is closed. */
+                break;
+
             case H5D_LAYOUT_ERROR:
             case H5D_NLAYOUTS:
             default:
@@ -1699,7 +2270,7 @@ H5D__alloc_storage(const H5D_t *dset, hid_t dxpl_id, H5D_time_alloc_t time_alloc
         /* Check if we need to initialize the space */
         if(must_init_space) {
             if(layout->type == H5D_CHUNKED) {
-                /* If we are doing incremental allocation and the B-tree got
+                /* If we are doing incremental allocation and the index got
                  * created during a H5Dwrite call, don't initialize the storage
                  * now, wait for the actual writes to each block and let the
                  * low-level chunking routines handle initialize the fill-values.
@@ -1722,10 +2293,9 @@ H5D__alloc_storage(const H5D_t *dset, hid_t dxpl_id, H5D_time_alloc_t time_alloc
                 /* If we are filling the dataset on allocation or "if set" and
                  * the fill value _is_ set, do that now */
                 if(dset->shared->dcpl_cache.fill.fill_time == H5D_FILL_TIME_ALLOC ||
-                        (dset->shared->dcpl_cache.fill.fill_time == H5D_FILL_TIME_IFSET && fill_status == H5D_FILL_VALUE_USER_DEFINED)) {
+                        (dset->shared->dcpl_cache.fill.fill_time == H5D_FILL_TIME_IFSET && fill_status == H5D_FILL_VALUE_USER_DEFINED))
                     if(H5D__init_storage(dset, full_overwrite, old_dim, dxpl_id) < 0)
                         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize dataset with fill value")
-                } /* end if */
             } /* end else */
         } /* end if */
 
@@ -1806,6 +2376,9 @@ H5D__init_storage(const H5D_t *dset, hbool_t full_overwrite, hsize_t old_dim[],
                 break;
             } /* end block */
 
+        case H5D_VIRTUAL:
+            /* No-op, as the raw data is stored elsewhere */
+
         case H5D_LAYOUT_ERROR:
         case H5D_NLAYOUTS:
         default:
@@ -1838,7 +2411,7 @@ H5D__get_storage_size(H5D_t *dset, hid_t dxpl_id, hsize_t *storage_size)
 {
     herr_t	ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_PACKAGE
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, dset->oloc.addr, FAIL)
 
     switch(dset->shared->layout.type) {
         case H5D_CHUNKED:
@@ -1862,6 +2435,12 @@ H5D__get_storage_size(H5D_t *dset, hid_t dxpl_id, hsize_t *storage_size)
             *storage_size = dset->shared->layout.storage.u.compact.size;
             break;
 
+        case H5D_VIRTUAL:
+            /* Just set to 0, as virtual datasets do not actually store raw data
+             */
+            *storage_size = 0;
+            break;
+
         case H5D_LAYOUT_ERROR:
         case H5D_NLAYOUTS:
         default:
@@ -1869,7 +2448,7 @@ H5D__get_storage_size(H5D_t *dset, hid_t dxpl_id, hsize_t *storage_size)
     } /*lint !e788 All appropriate cases are covered */
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, 0)
 } /* end H5D__get_storage_size() */
 
 

@@ -1898,6 +2477,7 @@ H5D__get_offset(const H5D_t *dset)
     HDassert(dset);
 
     switch(dset->shared->layout.type) {
+        case H5D_VIRTUAL:
         case H5D_CHUNKED:
         case H5D_COMPACT:
             break;
@@ -1943,7 +2523,7 @@ H5D_vlen_reclaim(hid_t type_id, H5S_t *space, hid_t plist_id, void *buf)
     H5S_sel_iter_op_t dset_op;  /* Operator for iteration */
     H5T_vlen_alloc_info_t _vl_alloc_info;       /* VL allocation info buffer */
     H5T_vlen_alloc_info_t *vl_alloc_info = &_vl_alloc_info;   /* VL allocation info */
-    herr_t ret_value;
+    herr_t ret_value = FAIL;            /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1991,7 +2571,7 @@ void *
 H5D__vlen_get_buf_size_alloc(size_t size, void *info)
 {
     H5D_vlen_bufsize_t *vlen_bufsize = (H5D_vlen_bufsize_t *)info;
-    void *ret_value;    /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_PACKAGE_NOERR
 
@@ -2031,7 +2611,6 @@ H5D__vlen_get_buf_size_alloc(size_t size, void *info)
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 herr_t
 H5D__vlen_get_buf_size(void H5_ATTR_UNUSED *elem, hid_t type_id, unsigned H5_ATTR_UNUSED ndim, const hsize_t *point, void *op_data)
 {
@@ -2135,13 +2714,12 @@ done:
 herr_t
 H5D__set_extent(H5D_t *dset, const hsize_t *size, hid_t dxpl_id)
 {
-    H5S_t   *space;                     /* Dataset's dataspace */
-    int     rank;                       /* Dataspace # of dimensions */
-    hsize_t curr_dims[H5O_LAYOUT_NDIMS];/* Current dimension sizes */
+    hsize_t curr_dims[H5S_MAX_RANK];    /* Current dimension sizes */
     htri_t  changed;                    /* Whether the dataspace changed size */
+    size_t  u, v;                       /* Local index variable */
     herr_t  ret_value = SUCCEED;        /* Return value */
 
-    FUNC_ENTER_PACKAGE
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, dset->oloc.addr, FAIL)
 
     /* Check args */
     HDassert(dset);
@@ -2161,29 +2739,63 @@ H5D__set_extent(H5D_t *dset, const hsize_t *size, hid_t dxpl_id)
     if(H5D__check_filters(dset) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't apply filters")
 
-    /* Get the dataspace */
-    space = dset->shared->space;
-
-    /* Check if we are shrinking or expanding any of the dimensions */
-    if((rank = H5S_get_simple_extent_dims(space, curr_dims, NULL)) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataset dimensions")
+    /* Keep the current dataspace dimensions for later */
+    HDcompile_assert(sizeof(curr_dims) == sizeof(dset->shared->curr_dims));
+    HDmemcpy(curr_dims, dset->shared->curr_dims, H5S_MAX_RANK * sizeof(curr_dims[0]));
 
     /* Modify the size of the dataspace */
-    if((changed = H5S_set_extent(space, size)) < 0)
+    if((changed = H5S_set_extent(dset->shared->space, size)) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to modify size of dataspace")
 
     /* Don't bother updating things, unless they've changed */
     if(changed) {
-        hbool_t shrink = FALSE;             /* Flag to indicate a dimension has shrank */
-        hbool_t expand = FALSE;             /* Flag to indicate a dimension has grown */
-        unsigned u;                         /* Local index variable */
+        hbool_t shrink = FALSE;         /* Flag to indicate a dimension has shrank */
+        hbool_t expand = FALSE;         /* Flag to indicate a dimension has grown */
+        hbool_t update_chunks = FALSE;  /* Flag to indicate chunk cache update is needed */
 
         /* Determine if we are shrinking and/or expanding any dimensions */
-        for(u = 0; u < (unsigned)rank; u++) {
+        for(u = 0; u < (size_t)dset->shared->ndims; u++) {
+            /* Check for various status changes */
             if(size[u] < curr_dims[u])
                 shrink = TRUE;
             if(size[u] > curr_dims[u])
                 expand = TRUE;
+
+            /* Chunked storage specific checks */
+            if(H5D_CHUNKED == dset->shared->layout.type && dset->shared->ndims > 1) {
+                hsize_t scaled;             /* Scaled value */
+
+                /* Compute the scaled dimension size value */
+                scaled = size[u] / dset->shared->layout.u.chunk.dim[u];
+
+                /* Check if scaled dimension size changed */
+                if(scaled != dset->shared->cache.chunk.scaled_dims[u]) {
+                    hsize_t scaled_power2up;    /* Scaled value, rounded to next power of 2 */
+
+                    /* Update the scaled dimension size value for the current dimension */
+                    dset->shared->cache.chunk.scaled_dims[u] = scaled;
+
+                    /* Check if algorithm for computing hash values will change */
+                    if((scaled > dset->shared->cache.chunk.nslots &&
+                                dset->shared->cache.chunk.scaled_dims[u] <= dset->shared->cache.chunk.nslots)
+                            || (scaled <= dset->shared->cache.chunk.nslots &&
+                                dset->shared->cache.chunk.scaled_dims[u] > dset->shared->cache.chunk.nslots))
+                        update_chunks = TRUE;
+
+                    /* Check if the number of bits required to encode the scaled size value changed */
+                    if(dset->shared->cache.chunk.scaled_power2up[u] != (scaled_power2up = H5VM_power2up(scaled))) {
+                        /* Update the 'power2up' & 'encode_bits' values for the current dimension */
+                        dset->shared->cache.chunk.scaled_power2up[u] = scaled_power2up;
+                        dset->shared->cache.chunk.scaled_encode_bits[u] = H5VM_log2_gen(scaled_power2up);
+
+                        /* Indicate that the cached chunk indices need to be updated */
+                        update_chunks = TRUE;
+                    } /* end if */
+                } /* end if */
+            } /* end if */
+
+            /* Update the cached copy of the dataset's dimensions */
+            dset->shared->curr_dims[u] = size[u];
         } /* end for */
 
         /*-------------------------------------------------------------------------
@@ -2192,11 +2804,39 @@ H5D__set_extent(H5D_t *dset, const hsize_t *size, hid_t dxpl_id)
          */
         /* Update the index values for the cached chunks for this dataset */
         if(H5D_CHUNKED == dset->shared->layout.type) {
-            /* Update the cached chunk info */
+            /* Set the cached chunk info */
             if(H5D__chunk_set_info(dset) < 0)
                 HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to update # of chunks")
-            if(H5D__chunk_update_cache(dset, dxpl_id) < 0)
-                HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to update cached chunk indices")
+
+            /* Check if updating the chunk cache indices is necessary */
+            if(update_chunks)
+                /* Update the chunk cache indices */
+                if(H5D__chunk_update_cache(dset, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to update cached chunk indices")
+        } /* end if */
+
+        /* Operations for virtual datasets */
+        if(H5D_VIRTUAL == dset->shared->layout.type) {
+            /* Check that the dimensions of the VDS are large enough */
+            if(H5D_virtual_check_min_dims(dset) < 0)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "virtual dataset dimensions not large enough to contain all limited dimensions in all selections")
+
+            /* Patch the virtual selection dataspaces */
+            for(u = 0; u < dset->shared->layout.storage.u.virt.list_nused; u++) {
+                /* Patch extent */
+                if(H5S_set_extent(dset->shared->layout.storage.u.virt.list[u].source_dset.virtual_select, size) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to modify size of data space")
+                dset->shared->layout.storage.u.virt.list[u].virtual_space_status = H5O_VIRTUAL_STATUS_CORRECT;
+
+                /* Patch sub-source datasets */
+                for(v = 0; v < dset->shared->layout.storage.u.virt.list[u].sub_dset_nalloc; v++)
+                    if(H5S_set_extent(dset->shared->layout.storage.u.virt.list[u].sub_dset[v].virtual_select, size) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to modify size of data space")
+            } /* end for */
+
+            /* Mark virtual datasets as not fully initialized so internal
+             * selections are recalculated (at next I/O operation) */
+            dset->shared->layout.storage.u.virt.init = FALSE;
         } /* end if */
 
         /* Allocate space for the new parts of the dataset, if appropriate */
@@ -2210,11 +2850,19 @@ H5D__set_extent(H5D_t *dset, const hsize_t *size, hid_t dxpl_id)
          * and if the chunks are written
          *-------------------------------------------------------------------------
          */
-        if(shrink && H5D_CHUNKED == dset->shared->layout.type &&
-                (*dset->shared->layout.ops->is_space_alloc)(&dset->shared->layout.storage))
-            /* Remove excess chunks */
-            if(H5D__chunk_prune_by_extent(dset, dxpl_id, curr_dims) < 0)
-                HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to remove chunks")
+        if(H5D_CHUNKED == dset->shared->layout.type) {
+            if(shrink && (*dset->shared->layout.ops->is_space_alloc)(&dset->shared->layout.storage))
+                /* Remove excess chunks */
+                if(H5D__chunk_prune_by_extent(dset, dxpl_id, curr_dims) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to remove chunks")
+
+            /* Update chunks that are no longer edge chunks as a result of
+             * expansion */
+            if(expand && (dset->shared->layout.u.chunk.flags & H5O_LAYOUT_CHUNK_DONT_FILTER_PARTIAL_BOUND_CHUNKS)
+                    && (dset->shared->dcpl_cache.pline.nused > 0))
+                if(H5D__chunk_update_old_edge_chunks(dset, dxpl_id, curr_dims) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to do update old edge chunks")
+	} /* end if */
 
         /* Mark the dataspace as dirty, for later writing to the file */
         if(H5D__mark(dset, dxpl_id, H5D_MARK_SPACE) < 0)
@@ -2222,7 +2870,7 @@ H5D__set_extent(H5D_t *dset, const hsize_t *size, hid_t dxpl_id)
     } /* end if */
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5D__set_extent() */
 
 

@@ -2283,50 +2931,111 @@ done:
 herr_t
 H5D__flush_real(H5D_t *dataset, hid_t dxpl_id)
 {
-    H5O_t *oh = NULL;                   /* Pointer to dataset's object header */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_PACKAGE
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, dataset->oloc.addr, FAIL)
 
     /* Check args */
     HDassert(dataset);
+    HDassert(dataset->shared);
+
+    /* Avoid flushing the dataset (again) if it's closing */
+    if(!dataset->shared->closing) {
+        /* Flush cached raw data for each kind of dataset layout */
+        if(dataset->shared->layout.ops->flush &&
+                (dataset->shared->layout.ops->flush)(dataset, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTFLUSH, FAIL, "unable to flush raw data")
+    } /* end if */
 
-    /* Check for metadata changes that will require updating the object's modification time */
-    if(dataset->shared->layout_dirty || dataset->shared->space_dirty) {
-        unsigned update_flags = H5O_UPDATE_TIME;        /* Modification time flag */
+done:
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* end H5D__flush_real() */
 
-        /* Pin the object header */
-        if(NULL == (oh = H5O_pin(&dataset->oloc, dxpl_id)))
-            HGOTO_ERROR(H5E_DATASET, H5E_CANTPIN, FAIL, "unable to pin dataset object header")
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__format_convert
+ *
+ * Purpose:     To convert a dataset's chunk indexing type to version 1 btree
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:  Vailin Choi; Feb 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__format_convert(H5D_t *dataset, hid_t dxpl_id)
+{
+    H5O_t *oh = NULL;                   	/* Pointer to dataset's object header */
+    H5D_chk_idx_info_t new_idx_info;    	/* Index info for the new layout */
+    H5D_chk_idx_info_t idx_info;        	/* Index info for the current layout */
+    H5O_layout_t        newlayout;		/* The new layout */
+    herr_t ret_value = SUCCEED;         	/* Return value */
 
-        /* Update the layout on disk, if it's been changed */
-        if(dataset->shared->layout_dirty) {
-            if(H5D__layout_oh_write(dataset, dxpl_id, oh, update_flags) < 0)
-                HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to update layout/pline/efl info")
-            dataset->shared->layout_dirty = FALSE;
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, dataset->oloc.addr, FAIL)
 
-            /* Reset the "update the modification time" flag, so we only do it once */
-            update_flags = 0;
-        } /* end if */
+    /* Check args */
+    HDassert(dataset);
 
-        /* Update the dataspace on disk, if it's been changed */
-        if(dataset->shared->space_dirty) {
-            if(H5S_write(dataset->oloc.file, dxpl_id, oh, update_flags, dataset->shared->space) < 0)
-                HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to update file with new dataspace")
-            dataset->shared->space_dirty = FALSE;
+    /* Set up the current index info */
+    idx_info.f = dataset->oloc.file;
+    idx_info.dxpl_id = dxpl_id;
+    idx_info.pline = &dataset->shared->dcpl_cache.pline;
+    idx_info.layout = &dataset->shared->layout.u.chunk;
+    idx_info.storage = &dataset->shared->layout.storage.u.chunk;
+
+    /* Copy the current layout info to the new layout */
+    HDmemcpy(&newlayout, &dataset->shared->layout, sizeof(H5O_layout_t));
+
+    /* Set up info for version 1 B-tree in the new layout */
+    newlayout.version = H5O_LAYOUT_VERSION_3;
+    newlayout.storage.u.chunk.idx_type = H5D_CHUNK_IDX_BTREE;
+    newlayout.storage.u.chunk.idx_addr = HADDR_UNDEF;
+    newlayout.storage.u.chunk.ops = H5D_COPS_BTREE;
+    newlayout.storage.u.chunk.u.btree.shared = NULL;
+
+    /* Set up the index info to version 1 B-tree */
+    new_idx_info.f = dataset->oloc.file;
+    new_idx_info.dxpl_id = dxpl_id;
+    new_idx_info.pline = &dataset->shared->dcpl_cache.pline;
+    new_idx_info.layout = &newlayout.u.chunk;
+    new_idx_info.storage = &newlayout.storage.u.chunk;
+
+    /* Initialize version 1 B-tree */
+    if(newlayout.storage.u.chunk.ops->init && 
+            (newlayout.storage.u.chunk.ops->init)(&new_idx_info, dataset->shared->space, dataset->oloc.addr) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize indexing information")
+    
+    /* If the current chunk index exists */
+    if(H5F_addr_defined(dataset->shared->layout.storage.u.chunk.idx_addr)) {
+	/* Create v1 B-tree chunk index */
+	if((newlayout.storage.u.chunk.ops->create)(&new_idx_info) < 0)
+	    HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't create chunk index")
+
+	/* Iterate over the chunks in the current index and insert the chunk addresses 
+	 * into the version 1 B-tree chunk index */
+	if(H5D__chunk_format_convert(dataset, &idx_info, &new_idx_info) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_BADITER, FAIL, "unable to iterate over chunk index to chunk info")
+    } /* end if */
 
-            /* Reset the "update the modification time" flag, so we only do it once */
-            update_flags = 0;
-        } /* end if */
+    /* Release the old (i.e. current) chunk index */
+    if(dataset->shared->layout.storage.u.chunk.ops->dest &&
+            (dataset->shared->layout.storage.u.chunk.ops->dest)(&idx_info) < 0)
+      HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to release chunk index info")
 
-        /* _Somebody_ should have update the modification time! */
-        HDassert(update_flags == 0);
-    } /* end if */
+    /* Delete the "layout" message */
+    if(H5O_msg_remove(&dataset->oloc, H5O_LAYOUT_ID, H5O_ALL, TRUE, dxpl_id) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTDELETE, FAIL, "unable to delete layout message")
+
+    HDmemcpy(&dataset->shared->layout, &newlayout, sizeof(H5O_layout_t));
 
-    /* Flush cached raw data for each kind of dataset layout */
-    if(dataset->shared->layout.ops->flush &&
-            (dataset->shared->layout.ops->flush)(dataset, dxpl_id) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTFLUSH, FAIL, "unable to flush raw data")
+    if(NULL == (oh = H5O_pin(&dataset->oloc, dxpl_id)))
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTPIN, FAIL, "unable to pin dataset object header")
+
+    /* Append the new layout message to the object header */
+    if(H5O_msg_append_oh(dataset->oloc.file, dxpl_id, oh, H5O_LAYOUT_ID, 0, H5O_UPDATE_TIME, &newlayout) < 0)
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update old fill value header message")
 
 done:
     /* Release pointer to object header */
@@ -2334,8 +3043,8 @@ done:
         if(H5O_unpin(oh) < 0)
             HDONE_ERROR(H5E_DATASET, H5E_CANTUNPIN, FAIL, "unable to unpin dataset object header")
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5D__flush_real() */
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* end H5D__format_convert() */
 
 

 /*-------------------------------------------------------------------------
@@ -2354,19 +3063,50 @@ done:
 herr_t
 H5D__mark(const H5D_t *dataset, hid_t H5_ATTR_UNUSED dxpl_id, unsigned flags)
 {
+    H5O_t *oh = NULL;                   /* Pointer to dataset's object header */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_PACKAGE_NOERR
+    FUNC_ENTER_PACKAGE
 
     /* Check args */
     HDassert(dataset);
     HDassert(!(flags & (unsigned)~(H5D_MARK_SPACE | H5D_MARK_LAYOUT)));
 
     /* Mark aspects of the dataset as dirty */
-    if(flags & H5D_MARK_SPACE)
-        dataset->shared->space_dirty = TRUE;
-    if(flags & H5D_MARK_LAYOUT)
-        dataset->shared->layout_dirty = TRUE;
+    if(flags) {
+        unsigned update_flags = H5O_UPDATE_TIME;        /* Modification time flag */
+
+        /* Pin the object header */
+        if(NULL == (oh = H5O_pin(&dataset->oloc, dxpl_id)))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTPIN, FAIL, "unable to pin dataset object header")
+
+        /* Update the layout on disk, if it's been changed */
+        if(flags & H5D_MARK_LAYOUT) {
+            if(H5D__layout_oh_write(dataset, dxpl_id, oh, update_flags) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to update layout info")
+
+            /* Reset the "update the modification time" flag, so we only do it once */
+            update_flags = 0;
+        } /* end if */
+
+        /* Update the dataspace on disk, if it's been changed */
+        if(flags & H5D_MARK_SPACE) {
+            if(H5S_write(dataset->oloc.file, dxpl_id, oh, update_flags, dataset->shared->space) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to update file with new dataspace")
+
+            /* Reset the "update the modification time" flag, so we only do it once */
+            update_flags = 0;
+        } /* end if */
+
+        /* _Somebody_ should have update the modification time! */
+        HDassert(update_flags == 0);
+    } /* end if */
+
+done:
+    /* Release pointer to object header */
+    if(oh != NULL)
+        if(H5O_unpin(oh) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTUNPIN, FAIL, "unable to unpin dataset object header")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D__mark() */
@@ -2467,29 +3207,77 @@ H5D_get_create_plist(H5D_t *dset)
 {
     H5P_genplist_t      *dcpl_plist;            /* Dataset's DCPL */
     H5P_genplist_t      *new_plist;             /* Copy of dataset's DCPL */
+    H5O_layout_t        copied_layout;          /* Layout to tweak */
     H5O_fill_t          copied_fill;            /* Fill value to tweak */
+    H5O_efl_t           copied_efl;             /* External file list to tweak */
     hid_t		new_dcpl_id = FAIL;
-    hid_t		ret_value;              /* Return value */
+    hid_t		ret_value = H5I_INVALID_HID;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
     /* Check args */
     if(NULL == (dcpl_plist = (H5P_genplist_t *)H5I_object(dset->shared->dcpl_id)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+        HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "can't get property list")
 
     /* Copy the creation property list */
     if((new_dcpl_id = H5P_copy_plist(dcpl_plist, TRUE)) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to copy the creation property list")
     if(NULL == (new_plist = (H5P_genplist_t *)H5I_object(new_dcpl_id)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+        HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "can't get property list")
 
     /* Retrieve any object creation properties */
     if(H5O_get_create_plist(&dset->oloc, H5AC_ind_dxpl_id, new_plist) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get object creation info")
 
+    /* Get the layout property */
+    if(H5P_peek(new_plist, H5D_CRT_LAYOUT_NAME, &copied_layout) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get layout")
+
+    /* Reset layout values set when dataset is created */
+    copied_layout.ops = NULL;
+    switch(copied_layout.type) {
+        case H5D_COMPACT:
+            copied_layout.storage.u.compact.buf = H5MM_xfree(copied_layout.storage.u.compact.buf);
+            HDmemset(&copied_layout.storage.u.compact, 0, sizeof(copied_layout.storage.u.compact));
+            break;
+
+        case H5D_CONTIGUOUS:
+            copied_layout.storage.u.contig.addr = HADDR_UNDEF;
+            copied_layout.storage.u.contig.size = 0;
+            break;
+
+        case H5D_CHUNKED:
+            /* Reset chunk size */
+            copied_layout.u.chunk.size = 0;
+
+            /* Reset index info, if the chunk ops are set */
+            if(copied_layout.storage.u.chunk.ops)
+		/* Reset address and pointer of the array struct for the chunked storage index */
+                if(H5D_chunk_idx_reset(&copied_layout.storage.u.chunk, TRUE) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to reset chunked storage index in dest")
+
+            /* Reset chunk index ops */
+            copied_layout.storage.u.chunk.ops = NULL;
+            break;
+
+        case H5D_VIRTUAL:
+            copied_layout.storage.u.virt.serial_list_hobjid.addr = HADDR_UNDEF;
+            copied_layout.storage.u.virt.serial_list_hobjid.idx = 0;
+            break;
+
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+        default:
+            HDassert(0 && "Unknown layout type!");
+    } /* end switch */
+
+    /* Set back the (possibly modified) layout property to property list */
+    if(H5P_poke(new_plist, H5D_CRT_LAYOUT_NAME, &copied_layout) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to set layout")
+
     /* Get the fill value property */
-    if(H5P_get(new_plist, H5D_CRT_FILL_VALUE_NAME, &copied_fill) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
+    if(H5P_peek(new_plist, H5D_CRT_FILL_VALUE_NAME, &copied_fill) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get fill value")
 
     /* Check if there is a fill value, but no type yet */
     if(copied_fill.buf != NULL && copied_fill.type == NULL) {
@@ -2516,7 +3304,7 @@ H5D_get_create_plist(H5D_t *dset)
             src_id = H5I_register(H5I_DATATYPE, H5T_copy(dset->shared->type, H5T_COPY_ALL), FALSE);
             if(src_id < 0) {
                 H5I_dec_ref(dst_id);
-                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to copy/register datatype")
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to copy/register datatype")
             } /* end if */
 
             /* Allocate a background buffer */
@@ -2524,7 +3312,7 @@ H5D_get_create_plist(H5D_t *dset)
             if(H5T_path_bkg(tpath) && NULL == (bkg_buf = H5FL_BLK_CALLOC(type_conv, bkg_size))) {
                 H5I_dec_ref(src_id);
                 H5I_dec_ref(dst_id);
-                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "memory allocation failed")
             } /* end if */
 
             /* Convert fill value */
@@ -2546,9 +3334,26 @@ H5D_get_create_plist(H5D_t *dset)
         } /* end if */
     } /* end if */
 
-    /* Set back the fill value property to property list */
-    if(H5P_set(new_plist, H5D_CRT_FILL_VALUE_NAME, &copied_fill) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to set property list fill value")
+    /* Set back the (possibly modified) fill value property to property list */
+    if(H5P_poke(new_plist, H5D_CRT_FILL_VALUE_NAME, &copied_fill) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to set fill value")
+
+    /* Get the fill value property */
+    if(H5P_peek(new_plist, H5D_CRT_EXT_FILE_LIST_NAME, &copied_efl) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get external file list")
+
+    /* Reset efl name_offset and heap_addr, these are the values when the dataset is created */
+    if(copied_efl.slot) {
+        unsigned u;
+
+        copied_efl.heap_addr = HADDR_UNDEF;
+        for(u = 0; u < copied_efl.nused; u++)
+            copied_efl.slot[u].name_offset = 0;
+    } /* end if */
+
+    /* Set back the (possibly modified) external file list property to property list */
+    if(H5P_poke(new_plist, H5D_CRT_EXT_FILE_LIST_NAME, &copied_efl) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to set external file list")
 
     /* Set the return value */
     ret_value = new_dcpl_id;
@@ -2598,12 +3403,21 @@ H5D_get_access_plist(H5D_t *dset)
 
     /* If the dataset is chunked then copy the rdcc parameters */
     if (dset->shared->layout.type == H5D_CHUNKED) {
+	H5D_append_flush_t info;
+
         if (H5P_set(new_plist, H5D_ACS_DATA_CACHE_NUM_SLOTS_NAME, &(dset->shared->cache.chunk.nslots)) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set data cache number of slots")
         if (H5P_set(new_plist, H5D_ACS_DATA_CACHE_BYTE_SIZE_NAME, &(dset->shared->cache.chunk.nbytes_max)) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set data cache byte size")
         if (H5P_set(new_plist, H5D_ACS_PREEMPT_READ_CHUNKS_NAME, &(dset->shared->cache.chunk.w0)) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set preempt read chunks")
+
+	info.ndims = dset->shared->append_flush.ndims;
+        info.func = dset->shared->append_flush.func;
+        info.udata = dset->shared->append_flush.udata;
+        HDmemcpy(info.boundary, dset->shared->append_flush.boundary, sizeof(dset->shared->append_flush.boundary));
+        if(H5P_set(new_plist, H5D_ACS_APPEND_FLUSH_NAME, &info) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set append flush property")
     } /* end if */
 
     /* Set the return value */
@@ -2638,10 +3452,15 @@ hid_t
 H5D_get_space(H5D_t *dset)
 {
     H5S_t	*space = NULL;
-    hid_t       ret_value = FAIL;
+    hid_t       ret_value = H5I_INVALID_HID;
 
     FUNC_ENTER_NOAPI_NOINIT
 
+    /* If the layout is virtual, update the extent */
+    if(dset->shared->layout.type == H5D_VIRTUAL)
+        if(H5D__virtual_set_extent_unlim(dset, H5AC_ind_dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update virtual dataset extent")
+
     /* Read the data space message and return a data space object */
     if(NULL == (space = H5S_copy(dset->shared->space, FALSE, TRUE)))
         HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to get data space")
@@ -2709,3 +3528,58 @@ done:
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5D_get_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__refresh
+ *
+ * Purpose:     Refreshes all buffers associated with a dataset.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:	Dana Robinson
+ *		        November 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__refresh(hid_t dset_id, H5D_t *dset, hid_t dxpl_id)
+{
+    H5D_virtual_held_file_t *head = NULL;       /* Pointer to list of files held open */
+    hbool_t virt_dsets_held = FALSE;            /* Whether virtual datasets' files are held open */
+    herr_t      ret_value   = SUCCEED;          /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(dset);
+
+    /* If the layout is virtual... */
+    if(dset->shared->layout.type == H5D_VIRTUAL) {
+        /* Hold open the source datasets' files */
+        if(H5D__virtual_hold_source_dset_files(dset, &head) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINC, FAIL, "unable to hold VDS source files open")
+        virt_dsets_held = TRUE;
+
+        /* Refresh source datasets for virtual dataset */
+        if(H5D__virtual_refresh_source_dsets(dset, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTFLUSH, FAIL, "unable to refresh VDS source datasets")
+    } /* end if */
+    
+    /* Refresh dataset object */
+    if((H5O_refresh_metadata(dset_id, dset->oloc, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTFLUSH, FAIL, "unable to refresh dataset")
+
+done:
+    /* Release hold on virtual datasets' files */
+    if(virt_dsets_held) {
+        /* Sanity check */
+        HDassert(dset->shared->layout.type == H5D_VIRTUAL);
+
+        /* Release the hold on source datasets' files */
+        if(H5D__virtual_release_source_dset_files(head) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTDEC, FAIL, "can't release VDS source files held open")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__refresh() */
+
diff --git a/src/H5Dio.c b/src/H5Dio.c
index 5a931cf..c0aa83e 100644
--- a/src/H5Dio.c
+++ b/src/H5Dio.c
@@ -17,7 +17,7 @@
 /* Module Setup */
 /****************/
 
-#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
 
 
 /***********/
@@ -52,9 +52,6 @@
 /********************/
 
 /* Internal I/O routines */
-static herr_t H5D__write(H5D_t *dataset, hid_t mem_type_id,
-    const H5S_t *mem_space, const H5S_t *file_space, hid_t dset_xfer_plist,
-    const void *buf);
 static herr_t H5D__pre_write(H5D_t *dset, hbool_t direct_write, hid_t mem_type_id, 
     const H5S_t *mem_space, const H5S_t *file_space, hid_t dxpl_id, const void *buf);
 
@@ -302,10 +299,8 @@ H5D__pre_write(H5D_t *dset, hbool_t direct_write, hid_t mem_type_id,
         uint32_t direct_filters;
         hsize_t *direct_offset;
         uint32_t direct_datasize;
-	int      ndims = 0;
-	hsize_t  dims[H5O_LAYOUT_NDIMS];
 	hsize_t  internal_offset[H5O_LAYOUT_NDIMS];
-	unsigned u;
+	unsigned u;                 /* Local index variable */
 
         /* Get the dataset transfer property list */
         if(NULL == (plist = (H5P_genplist_t *)H5I_object(dxpl_id)))
@@ -324,12 +319,9 @@ H5D__pre_write(H5D_t *dset, hbool_t direct_write, hid_t mem_type_id,
 
 	/* The library's chunking code requires the offset terminates with a zero. So transfer the 
          * offset array to an internal offset array */ 
-	if((ndims = H5S_get_simple_extent_dims(dset->shared->space, dims, NULL)) < 0)
-	    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't retrieve dataspace extent dims")
-
-	for(u = 0; u < ndims; u++) {
+	for(u = 0; u < dset->shared->ndims; u++) {
 	    /* Make sure the offset doesn't exceed the dataset's dimensions */
-            if(direct_offset[u] > dims[u])
+            if(direct_offset[u] > dset->shared->curr_dims[u])
 		HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "offset exceeds dimensions of dataset")
 
             /* Make sure the offset fall right on a chunk's boundary */
@@ -340,7 +332,7 @@ H5D__pre_write(H5D_t *dset, hbool_t direct_write, hid_t mem_type_id,
 	} /* end for */
 	   
 	/* Terminate the offset with a zero */ 
-	internal_offset[ndims] = 0;
+	internal_offset[dset->shared->ndims] = 0;
 
 	/* write raw data */
 	if(H5D__chunk_direct_write(dset, dxpl_id, direct_filters, internal_offset, direct_datasize, buf) < 0)
@@ -403,7 +395,7 @@ H5D__read(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
     char        fake_char;              /* Temporary variable for NULL buffer pointers */
     herr_t	ret_value = SUCCEED;	/* Return value	*/
 
-    FUNC_ENTER_PACKAGE
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, dataset->oloc.addr, FAIL)
 
     /* check args */
     HDassert(dataset && dataset->oloc.file);
@@ -428,7 +420,7 @@ H5D__read(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
 #ifdef H5_HAVE_PARALLEL
     /* Collective access is not permissible without a MPI based VFD */
     if(dxpl_cache->xfer_mode == H5FD_MPIO_COLLECTIVE && 
-       !(H5F_HAS_FEATURE(dataset->oloc.file, H5FD_FEAT_HAS_MPI)))
+            !(H5F_HAS_FEATURE(dataset->oloc.file, H5FD_FEAT_HAS_MPI)))
         HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "collective access for MPI-based drivers only")
 #endif /*H5_HAVE_PARALLEL*/
 
@@ -569,7 +561,7 @@ done:
         if(H5S_close(projected_mem_space) < 0)
             HDONE_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to shut down projected memory dataspace")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5D__read() */
 
 

@@ -586,7 +578,7 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
+herr_t
 H5D__write(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
 	  const H5S_t *file_space, hid_t dxpl_id, const void *buf)
 {
@@ -619,7 +611,7 @@ H5D__write(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
     char        fake_char;              /* Temporary variable for NULL buffer pointers */
     herr_t	ret_value = SUCCEED;	/* Return value	*/
 
-    FUNC_ENTER_STATIC
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, dataset->oloc.addr, FAIL)
 
     /* check args */
     HDassert(dataset && dataset->oloc.file);
@@ -647,7 +639,7 @@ H5D__write(H5D_t *dataset, hid_t mem_type_id, const H5S_t *mem_space,
 
     /* Various MPI based checks */
 #ifdef H5_HAVE_PARALLEL
-    if(H5F_HAS_FEATURE(dataset->oloc.file, H5FD_FEAT_HAS_MPI)) {
+    if H5F_HAS_FEATURE(dataset->oloc.file, H5FD_FEAT_HAS_MPI) {
         /* If MPI based VFD is used, no VL datatype support yet. */
         /* This is because they use the global heap in the file and we don't */
         /* support parallel access of that yet */
@@ -824,7 +816,7 @@ done:
         if(H5S_close(projected_mem_space) < 0)
             HDONE_ERROR(H5E_DATASET, H5E_CANTCLOSEOBJ, FAIL, "unable to shut down projected memory dataspace")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5D__write() */
 
 

diff --git a/src/H5Dlayout.c b/src/H5Dlayout.c
index 7787042..293ee42 100644
--- a/src/H5Dlayout.c
+++ b/src/H5Dlayout.c
@@ -17,16 +17,16 @@
 /* Module Setup */
 /****************/
 
-#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
 
 
 /***********/
 /* Headers */
 /***********/
-#include "H5private.h"		/* Generic Functions			*/
-#include "H5Dpkg.h"		/* Datasets 				*/
-#include "H5Eprivate.h"		/* Error handling		  	*/
-#include "H5HLprivate.h"	/* Local heaps				*/
+#include "H5private.h"          /* Generic Functions                        */
+#include "H5Dpkg.h"             /* Datasets                                 */
+#include "H5Eprivate.h"         /* Error handling                           */
+#include "H5HLprivate.h"        /* Local heaps                              */
 
 
 /****************/
@@ -61,15 +61,15 @@
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5D__layout_set_io_ops
+ * Function:    H5D__layout_set_io_ops
  *
- * Purpose:	Set the I/O operation function pointers for a dataset,
+ * Purpose:     Set the I/O operation function pointers for a dataset,
  *              according to the dataset's layout
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:	Quincey Koziol
- *		Thursday, March 20, 2008
+ * Programmer:  Quincey Koziol
+ *              Thursday, March 20, 2008
  *
  *-------------------------------------------------------------------------
  */
@@ -96,14 +96,46 @@ H5D__layout_set_io_ops(const H5D_t *dataset)
             dataset->shared->layout.ops = H5D_LOPS_CHUNK;
 
             /* Set the chunk operations */
-            /* (Only "B-tree" indexing type currently supported) */
-            dataset->shared->layout.storage.u.chunk.ops = H5D_COPS_BTREE;
+            switch(dataset->shared->layout.u.chunk.idx_type) {
+                case H5D_CHUNK_IDX_BTREE:
+                    dataset->shared->layout.storage.u.chunk.ops = H5D_COPS_BTREE;
+                    break;
+
+                case H5D_CHUNK_IDX_NONE:
+                    dataset->shared->layout.storage.u.chunk.ops = H5D_COPS_NONE;
+                    break;
+
+                case H5D_CHUNK_IDX_SINGLE:
+                    dataset->shared->layout.storage.u.chunk.ops = H5D_COPS_SINGLE;
+                    break;
+
+                case H5D_CHUNK_IDX_FARRAY:
+                    dataset->shared->layout.storage.u.chunk.ops = H5D_COPS_FARRAY;
+                    break;
+
+                case H5D_CHUNK_IDX_EARRAY:
+                    dataset->shared->layout.storage.u.chunk.ops = H5D_COPS_EARRAY;
+                    break;
+
+                case H5D_CHUNK_IDX_BT2:
+                    dataset->shared->layout.storage.u.chunk.ops = H5D_COPS_BT2;
+                    break;
+
+                case H5D_CHUNK_IDX_NTYPES:
+                default:
+                    HDassert(0 && "Unknown chunk index method!");
+                    HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unknown chunk index method")
+            } /* end switch */
             break;
 
         case H5D_COMPACT:
             dataset->shared->layout.ops = H5D_LOPS_COMPACT;
             break;
 
+        case H5D_VIRTUAL:
+            dataset->shared->layout.ops = H5D_LOPS_VIRTUAL;
+            break;
+
         case H5D_LAYOUT_ERROR:
         case H5D_NLAYOUTS:
         default:
@@ -133,7 +165,7 @@ done:
 size_t
 H5D__layout_meta_size(const H5F_t *f, const H5O_layout_t *layout, hbool_t include_compact_data)
 {
-    size_t                  ret_value;
+    size_t      ret_value = 0;          /* Return value */
 
     FUNC_ENTER_PACKAGE
 
@@ -146,27 +178,93 @@ H5D__layout_meta_size(const H5F_t *f, const H5O_layout_t *layout, hbool_t includ
 
     switch(layout->type) {
         case H5D_COMPACT:
+            /* This information only present in older versions of message */
             /* Size of raw data */
             ret_value += 2;
             if(include_compact_data)
-                ret_value += layout->storage.u.compact.size;/* data for compact dataset             */
+                ret_value += layout->storage.u.compact.size; /* data for compact dataset             */
             break;
 
         case H5D_CONTIGUOUS:
+            /* This information only present in older versions of message */
             ret_value += H5F_SIZEOF_ADDR(f);    /* Address of data */
             ret_value += H5F_SIZEOF_SIZE(f);    /* Length of data */
             break;
 
         case H5D_CHUNKED:
-            /* Number of dimensions (1 byte) */
-            HDassert(layout->u.chunk.ndims > 0 && layout->u.chunk.ndims <= H5O_LAYOUT_NDIMS);
-            ret_value++;
+            if(layout->version < H5O_LAYOUT_VERSION_4) {
+                /* Number of dimensions (1 byte) */
+                HDassert(layout->u.chunk.ndims > 0 && layout->u.chunk.ndims <= H5O_LAYOUT_NDIMS);
+                ret_value++;
 
-            /* Dimension sizes */
-            ret_value += layout->u.chunk.ndims * 4;
+                /* B-tree address */
+                ret_value += H5F_SIZEOF_ADDR(f);    /* Address of data */
 
-            /* B-tree address */
-            ret_value += H5F_SIZEOF_ADDR(f);    /* Address of data */
+                /* Dimension sizes */
+                ret_value += layout->u.chunk.ndims * 4;
+            } /* end if */
+            else {
+                /* Chunked layout feature flags */
+                ret_value++;
+
+                /* Number of dimensions (1 byte) */
+                HDassert(layout->u.chunk.ndims > 0 && layout->u.chunk.ndims <= H5O_LAYOUT_NDIMS);
+                ret_value++;
+
+                /* Encoded # of bytes for each chunk dimension */
+                HDassert(layout->u.chunk.enc_bytes_per_dim > 0 && layout->u.chunk.enc_bytes_per_dim <= 8);
+                ret_value++;
+
+                /* Dimension sizes */
+                ret_value += layout->u.chunk.ndims * layout->u.chunk.enc_bytes_per_dim;
+
+                /* Type of chunk index */
+                ret_value++;
+
+                switch(layout->u.chunk.idx_type) {
+                    case H5D_CHUNK_IDX_BTREE:
+                        HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, 0, "v1 B-tree index type found for layout message >v3")
+
+                    case H5D_CHUNK_IDX_NONE:
+                        /* nothing */
+                        break;
+
+                    case H5D_CHUNK_IDX_SINGLE:
+                        /* Possible filter information */
+                        if(layout->u.chunk.flags & H5O_LAYOUT_CHUNK_SINGLE_INDEX_WITH_FILTER) {
+                            ret_value += H5F_SIZEOF_SIZE(f);        /* Size of chunk (in file) */
+                            ret_value += 4;                         /* Filter mask for chunk */
+                        } /* end if */
+                        break;
+
+                    case H5D_CHUNK_IDX_FARRAY:
+                        /* Fixed array creation parameters */
+                        ret_value += H5D_FARRAY_CREATE_PARAM_SIZE;
+                        break;
+
+                    case H5D_CHUNK_IDX_EARRAY:
+                        /* Extensible array creation parameters */
+                        ret_value += H5D_EARRAY_CREATE_PARAM_SIZE;
+                        break;
+
+                    case H5D_CHUNK_IDX_BT2:
+                        /* v2 B-tree creation parameters */
+                        ret_value += H5D_BT2_CREATE_PARAM_SIZE;
+                        break;
+
+                    case H5D_CHUNK_IDX_NTYPES:
+                    default:
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, 0, "Invalid chunk index type")
+                } /* end switch */
+
+                /* Chunk index address */
+                ret_value += H5F_SIZEOF_ADDR(f);
+            } /* end else */
+            break;
+
+        case H5D_VIRTUAL:
+            ret_value += H5F_SIZEOF_ADDR(f);    /* Address of global heap */
+            ret_value += 4;                     /* Global heap index */
             break;
 
         case H5D_LAYOUT_ERROR:
@@ -181,15 +279,179 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5D__layout_oh_create
+ * Function:    H5D__layout_set_latest_version
  *
- * Purpose:	Create layout/pline/efl information for dataset
+ * Purpose:     Set the encoding for a layout to the latest version.
+ *              Part of the coding in this routine is moved to
+ *              H5D__layout_set_latest_indexing().
  *
- * Return:	Success:    SUCCEED
- *		Failure:    FAIL
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:	Quincey Koziol
- *		Monday, July 27, 2009
+ * Programmer:  Quincey Koziol
+ *              Thursday, January 15, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__layout_set_latest_version(H5O_layout_t *layout, const H5S_t *space, 
+    const H5D_dcpl_cache_t *dcpl_cache)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(layout);
+    HDassert(space);
+    HDassert(dcpl_cache);
+
+    /* Set encoding of layout to latest version */
+    layout->version = H5O_LAYOUT_VERSION_LATEST;
+
+    /* Set the latest indexing type for the layout message */
+    if(H5D__layout_set_latest_indexing(layout, space, dcpl_cache) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set latest indexing type")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__layout_set_latest_version() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__layout_set_latest_indexing
+ *
+ * Purpose:     Set the latest indexing type for a layout message
+ *              This is moved from H5D_layout_set_latest_version().
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, January 15, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__layout_set_latest_indexing(H5O_layout_t *layout, const H5S_t *space, 
+    const H5D_dcpl_cache_t *dcpl_cache)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(layout);
+    HDassert(space);
+    HDassert(dcpl_cache);
+
+    /* The indexing methods only apply to chunked datasets (currently) */
+    if(layout->type == H5D_CHUNKED) {
+        int sndims;                         /* Rank of dataspace */
+        unsigned ndims;                     /* Rank of dataspace */
+
+        /* Query the dimensionality of the dataspace */
+        if((sndims = H5S_GET_EXTENT_NDIMS(space)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "invalid dataspace rank")
+        ndims = (unsigned)sndims;
+
+        /* Avoid scalar/null dataspace */
+        if(ndims > 0) {
+            hsize_t max_dims[H5O_LAYOUT_NDIMS]; /* Maximum dimension sizes */
+            hsize_t cur_dims[H5O_LAYOUT_NDIMS]; /* Current dimension sizes */
+            unsigned unlim_count = 0;          	/* Count of unlimited max. dimensions */
+            hbool_t single = TRUE;              /* Fulfill single chunk indexing */
+            unsigned u;                     	/* Local index variable */
+
+            /* Query the dataspace's dimensions */
+            if(H5S_get_simple_extent_dims(space, cur_dims, max_dims) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get dataspace max. dimensions")
+
+            /* Spin through the max. dimensions, looking for unlimited dimensions */
+            for(u = 0; u < ndims; u++) {
+                if(max_dims[u] == H5S_UNLIMITED)
+                    unlim_count++;
+                if(cur_dims[u] != max_dims[u] || cur_dims[u] != layout->u.chunk.dim[u])
+                    single = FALSE;
+            } /* end for */
+
+            /* Chunked datasets with unlimited dimension(s) */
+            if(unlim_count) { /* dataset with unlimited dimension(s) must be chunked */
+                if(1 == unlim_count) { /* Chunked dataset with only 1 unlimited dimension */
+                    /* Set the chunk index type to an extensible array */
+                    layout->u.chunk.idx_type = H5D_CHUNK_IDX_EARRAY;
+                    layout->storage.u.chunk.idx_type = H5D_CHUNK_IDX_EARRAY;
+                    layout->storage.u.chunk.ops = H5D_COPS_EARRAY;
+
+                    /* Set the extensible array creation parameters */
+                    /* (use hard-coded defaults for now, until we give applications
+                     *          control over this with a property list - QAK)
+                     */
+                    layout->u.chunk.u.earray.cparam.max_nelmts_bits = H5D_EARRAY_MAX_NELMTS_BITS;
+                    layout->u.chunk.u.earray.cparam.idx_blk_elmts = H5D_EARRAY_IDX_BLK_ELMTS;
+                    layout->u.chunk.u.earray.cparam.sup_blk_min_data_ptrs = H5D_EARRAY_SUP_BLK_MIN_DATA_PTRS;
+                    layout->u.chunk.u.earray.cparam.data_blk_min_elmts = H5D_EARRAY_DATA_BLK_MIN_ELMTS;
+                    layout->u.chunk.u.earray.cparam.max_dblk_page_nelmts_bits = H5D_EARRAY_MAX_DBLOCK_PAGE_NELMTS_BITS;
+                } /* end if */
+                else { /* Chunked dataset with > 1 unlimited dimensions */
+                    /* Set the chunk index type to v2 B-tree */
+                    layout->u.chunk.idx_type = H5D_CHUNK_IDX_BT2;
+                    layout->storage.u.chunk.idx_type = H5D_CHUNK_IDX_BT2;
+                    layout->storage.u.chunk.ops = H5D_COPS_BT2;
+
+                    /* Set the v2 B-tree creation parameters */
+                    /* (use hard-coded defaults for now, until we give applications
+                     *          control over this with a property list - QAK)
+                     */
+                    layout->u.chunk.u.btree2.cparam.node_size = H5D_BT2_NODE_SIZE;
+                    layout->u.chunk.u.btree2.cparam.split_percent = H5D_BT2_SPLIT_PERC;
+                    layout->u.chunk.u.btree2.cparam.merge_percent =  H5D_BT2_MERGE_PERC;
+                } /* end else */
+            } /* end if */
+            else {      /* Chunked dataset with fixed dimensions */
+                /* Check for correct condition for using "single chunk" chunk index */
+                if(single) {
+                    layout->u.chunk.idx_type = H5D_CHUNK_IDX_SINGLE;
+                    layout->storage.u.chunk.idx_type = H5D_CHUNK_IDX_SINGLE;
+                    layout->storage.u.chunk.ops = H5D_COPS_SINGLE;
+                } /* end if */
+                else if(!dcpl_cache->pline.nused && 
+                        dcpl_cache->fill.alloc_time == H5D_ALLOC_TIME_EARLY) {
+
+                    /* Set the chunk index type to "none" Index */
+                    layout->u.chunk.idx_type = H5D_CHUNK_IDX_NONE;
+                    layout->storage.u.chunk.idx_type = H5D_CHUNK_IDX_NONE;
+                    layout->storage.u.chunk.ops = H5D_COPS_NONE;
+                } /* end else-if */
+                else { /* Used Fixed Array */
+                    /* Set the chunk index type to Fixed Array */
+                    layout->u.chunk.idx_type = H5D_CHUNK_IDX_FARRAY;
+                    layout->storage.u.chunk.idx_type = H5D_CHUNK_IDX_FARRAY;
+                    layout->storage.u.chunk.ops = H5D_COPS_FARRAY;
+
+                    /* Set the fixed array creation parameters */
+                    /* (use hard-coded defaults for now, until we give applications
+                     *          control over this with a property list - QAK)
+                     */
+                    layout->u.chunk.u.farray.cparam.max_dblk_page_nelmts_bits = H5D_FARRAY_MAX_DBLK_PAGE_NELMTS_BITS;
+                } /* end else */
+            } /* end else */
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__layout_set_latest_indexing() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__layout_oh_create
+ *
+ * Purpose:     Create layout/pline/efl information for dataset
+ *
+ * Return:      Success:    SUCCEED
+ *              Failure:    FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, July 27, 2009
  *
  *-------------------------------------------------------------------------
  */
@@ -197,12 +459,13 @@ herr_t
 H5D__layout_oh_create(H5F_t *file, hid_t dxpl_id, H5O_t *oh, H5D_t *dset,
     hid_t dapl_id)
 {
-    H5O_layout_t        *layout;         /* Dataset's layout information */
-    const H5O_fill_t	*fill_prop;     /* Pointer to dataset's fill value information */
+    H5O_layout_t        *layout;        /* Dataset's layout information */
+    const H5O_fill_t    *fill_prop;     /* Pointer to dataset's fill value information */
+    unsigned layout_mesg_flags;         /* Flags for inserting layout message */
     hbool_t             layout_init = FALSE;    /* Flag to indicate that chunk information was initialized */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_PACKAGE
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, dset->oloc.addr, FAIL)
 
     /* Sanity checking */
     HDassert(file);
@@ -253,11 +516,11 @@ H5D__layout_oh_create(H5F_t *file, hid_t dxpl_id, H5O_t *oh, H5D_t *dset,
             HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to create EFL file name heap")
 
         /* Pin the heap down in memory */
-        if(NULL == (heap = H5HL_protect(file, dxpl_id, efl->heap_addr, H5AC_WRITE)))
+        if(NULL == (heap = H5HL_protect(file, dxpl_id, efl->heap_addr, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_DATASET, H5E_CANTPROTECT, FAIL, "unable to protect EFL file name heap")
 
         /* Insert "empty" name first */
-        if((size_t)(-1) == H5HL_insert(file, dxpl_id, heap, (size_t)1, "")) {
+        if(UFAIL == H5HL_insert(file, dxpl_id, heap, (size_t)1, "")) {
             H5HL_unprotect(heap);
             HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert file name into heap")
         } /* end if */
@@ -266,14 +529,13 @@ H5D__layout_oh_create(H5F_t *file, hid_t dxpl_id, H5O_t *oh, H5D_t *dset,
             size_t offset;      /* Offset of file name in heap */
 
             /* Insert file name into heap */
-            if((size_t)(-1) == (offset = H5HL_insert(file, dxpl_id, heap,
+            if(UFAIL == (offset = H5HL_insert(file, dxpl_id, heap,
                         HDstrlen(efl->slot[u].name) + 1, efl->slot[u].name))) {
                 H5HL_unprotect(heap);
                 HGOTO_ERROR(H5E_DATASET, H5E_CANTINSERT, FAIL, "unable to insert file name into heap")
             } /* end if */
 
             /* Store EFL file name offset */
-            HDassert(0 == efl->slot[u].name_offset);
             efl->slot[u].name_offset = offset;
         } /* end for */
 
@@ -288,21 +550,25 @@ H5D__layout_oh_create(H5F_t *file, hid_t dxpl_id, H5O_t *oh, H5D_t *dset,
     } /* end if */
 
     /* Create layout message */
-    /* (Don't make layout message constant unless allocation time is early, since space may not be allocated) */
+    /* (Don't make layout message constant unless allocation time is early and non-filtered, since space may not be allocated) */
     /* (Note: this is relying on H5D__alloc_storage not calling H5O_msg_write during dataset creation) */
-    if(H5O_msg_append_oh(file, dxpl_id, oh, H5O_LAYOUT_ID, ((fill_prop->alloc_time == H5D_ALLOC_TIME_EARLY && H5D_COMPACT != layout->type) ? H5O_MSG_FLAG_CONSTANT : 0), 0, layout) < 0)
+    if(fill_prop->alloc_time == H5D_ALLOC_TIME_EARLY && H5D_COMPACT != layout->type
+            && !dset->shared->dcpl_cache.pline.nused)
+        layout_mesg_flags = H5O_MSG_FLAG_CONSTANT;
+    else
+        layout_mesg_flags =  0;
+    if(H5O_msg_append_oh(file, dxpl_id, oh, H5O_LAYOUT_ID, layout_mesg_flags, 0, layout) < 0)
          HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to update layout")
 
 done:
     /* Error cleanup */
-    if(ret_value < 0) {
-        if(dset->shared->layout.type == H5D_CHUNKED && layout_init) {
-            if(H5D__chunk_dest(file, dxpl_id, dset) < 0)
-                HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to destroy chunk cache")
-        } /* end if */
-    } /* end if */
+    if(ret_value < 0)
+        if(layout_init)
+            /* Destroy any cached layout information for the dataset */
+            if(dset->shared->layout.ops->dest && (dset->shared->layout.ops->dest)(dset, dxpl_id) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to destroy layout info")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5D__layout_oh_create() */
 
 

@@ -323,6 +589,8 @@ herr_t
 H5D__layout_oh_read(H5D_t *dataset, hid_t dxpl_id, hid_t dapl_id, H5P_genplist_t *plist)
 {
     htri_t msg_exists;                  /* Whether a particular type of message exists */
+    uint64_t chunk_size;                /* Size of chunk in bytes */
+    unsigned u;                         /* Local index variable */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_PACKAGE
@@ -372,78 +640,21 @@ H5D__layout_oh_read(H5D_t *dataset, hid_t dxpl_id, hid_t dapl_id, H5P_genplist_t
     /* Sanity check that the layout operations are set up */
     HDassert(dataset->shared->layout.ops);
 
+    /* Initialize the layout information for the dataset */
+    if(dataset->shared->layout.ops->init && (dataset->shared->layout.ops->init)(dataset->oloc.file, dxpl_id, dataset, dapl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize layout information")
+
     /* Adjust chunk dimensions to omit datatype size (in last dimension) for creation property */
     if(H5D_CHUNKED == dataset->shared->layout.type)
         dataset->shared->layout.u.chunk.ndims--;
+
     /* Copy layout to the DCPL */
     if(H5P_set(plist, H5D_CRT_LAYOUT_NAME, &dataset->shared->layout) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set layout")
-    /* Adjust chunk dimensions back again (*sigh*) */
-    if(H5D_CHUNKED == dataset->shared->layout.type)
-        dataset->shared->layout.u.chunk.ndims++;
-
-    switch(dataset->shared->layout.type) {
-        case H5D_CONTIGUOUS:
-        {
-            hsize_t tmp_size;                   /* Temporary holder for raw data size */
-            size_t tmp_sieve_buf_size;          /* Temporary holder for sieve buffer size */
-
-            /* Compute the size of the contiguous storage for versions of the
-             * layout message less than version 3 because versions 1 & 2 would
-             * truncate the dimension sizes to 32-bits of information. - QAK 5/26/04
-             */
-            if(dataset->shared->layout.version < 3) {
-                hssize_t snelmts;                   /* Temporary holder for number of elements in dataspace */
-                hsize_t nelmts;                     /* Number of elements in dataspace */
-                size_t dt_size;                     /* Size of datatype */
-
-                /* Retrieve the number of elements in the dataspace */
-                if((snelmts = H5S_GET_EXTENT_NPOINTS(dataset->shared->space)) < 0)
-                    HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve number of elements in dataspace")
-                nelmts = (hsize_t)snelmts;
-
-                /* Get the datatype's size */
-                if(0 == (dt_size = H5T_GET_SIZE(dataset->shared->type)))
-                    HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to retrieve size of datatype")
-
-                /* Compute the size of the dataset's contiguous storage */
-                tmp_size = nelmts * dt_size;
-
-                /* Check for overflow during multiplication */
-                if(nelmts != (tmp_size / dt_size))
-                    HGOTO_ERROR(H5E_DATASET, H5E_OVERFLOW, FAIL, "size of dataset's storage overflowed")
-
-                /* Assign the dataset's contiguous storage size */
-                dataset->shared->layout.storage.u.contig.size = tmp_size;
-            } else
-                tmp_size = dataset->shared->layout.storage.u.contig.size;
-
-	    /* Get the sieve buffer size for the file */
-	    tmp_sieve_buf_size = H5F_SIEVE_BUF_SIZE(dataset->oloc.file);
-
-	    /* Adjust the sieve buffer size to the smaller one between the dataset size and the buffer size
-	     * from the file access property.  (SLU - 2012/3/30) */
-	    if(tmp_size < tmp_sieve_buf_size)
-		dataset->shared->cache.contig.sieve_buf_size = tmp_size;
-	    else
-		dataset->shared->cache.contig.sieve_buf_size = tmp_sieve_buf_size;
-        }
-            break;
-
-        case H5D_CHUNKED:
-            /* Initialize the chunk cache for the dataset */
-            if(H5D__chunk_init(dataset->oloc.file, dxpl_id, dataset, dapl_id) < 0)
-                HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize chunk cache")
-            break;
 
-        case H5D_COMPACT:
-            break;
-
-        case H5D_LAYOUT_ERROR:
-        case H5D_NLAYOUTS:
-        default:
-            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unknown storage method")
-    } /* end switch */ /*lint !e788 All appropriate cases are covered */
+    /* Set chunk sizes */
+    if(H5D__chunk_set_sizes(dataset) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "unable to set chunk sizes")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -453,7 +664,7 @@ done:
 /*-------------------------------------------------------------------------
  * Function:	H5D__layout_oh_write
  *
- * Purpose:	Write layout/pline/efl information for dataset
+ * Purpose:	Write layout information for dataset
  *
  * Return:	Success:    SUCCEED
  *		Failure:    FAIL
@@ -466,6 +677,7 @@ done:
 herr_t
 H5D__layout_oh_write(H5D_t *dataset, hid_t dxpl_id, H5O_t *oh, unsigned update_flags)
 {
+    htri_t msg_exists;                  /* Whether the layout message exists */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_PACKAGE
@@ -474,9 +686,14 @@ H5D__layout_oh_write(H5D_t *dataset, hid_t dxpl_id, H5O_t *oh, unsigned update_f
     HDassert(dataset);
     HDassert(oh);
 
-    /* Write the layout message to the dataset's header */
-    if(H5O_msg_write_oh(dataset->oloc.file, dxpl_id, oh, H5O_LAYOUT_ID, H5O_MSG_FLAG_CONSTANT, update_flags, &dataset->shared->layout) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to update layout message")
+    /* Check if the layout message has been added to the dataset's header */
+    if((msg_exists = H5O_msg_exists_oh(oh, H5O_LAYOUT_ID)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to check if layout message exists")
+    if(msg_exists) {
+        /* Write the layout message to the dataset's header */
+        if(H5O_msg_write_oh(dataset->oloc.file, dxpl_id, oh, H5O_LAYOUT_ID, 0, update_flags, &dataset->shared->layout) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to update layout message")
+    } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
diff --git a/src/H5Dmodule.h b/src/H5Dmodule.h
new file mode 100644
index 0000000..9b0c411
--- /dev/null
+++ b/src/H5Dmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5D package.  Including this header means that the source file
+ *		is part of the H5D package.
+ */
+#ifndef _H5Dmodule_H
+#define _H5Dmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5D_MODULE
+#define H5_MY_PKG       H5D
+#define H5_MY_PKG_ERR   H5E_DATASET
+#define H5_MY_PKG_INIT  YES
+
+#endif /* _H5Dmodule_H */
+
diff --git a/src/H5Dmpio.c b/src/H5Dmpio.c
index 002f44f..a5f34d1 100644
--- a/src/H5Dmpio.c
+++ b/src/H5Dmpio.c
@@ -27,7 +27,7 @@
 /* Module Setup */
 /****************/
 
-#define H5D_PACKAGE /* suppress error about including H5Dpkg */
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
 
 
 /***********/
@@ -605,7 +605,8 @@ H5D__chunk_collective_io(H5D_io_info_t *io_info, const H5D_type_info_t *type_inf
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
 
     /* Check the optional property list on what to do with collective chunk IO. */
-    chunk_opt_mode = (H5FD_mpio_chunk_opt_t)H5P_peek_unsigned(dx_plist, H5D_XFER_MPIO_CHUNK_OPT_HARD_NAME);
+    if(H5P_get(dx_plist, H5D_XFER_MPIO_CHUNK_OPT_HARD_NAME, &chunk_opt_mode) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_CANTGET, FAIL, "couldn't get chunk optimization option")
     if(H5FD_MPIO_CHUNK_ONE_IO == chunk_opt_mode)
         io_option = H5D_ONE_LINK_CHUNK_IO;      /*no opt*/
     /* direct request to multi-chunk-io */
@@ -621,7 +622,9 @@ H5D__chunk_collective_io(H5D_io_info_t *io_info, const H5D_type_info_t *type_inf
         if((mpi_size = H5F_mpi_get_size(io_info->dset->oloc.file)) < 0)
             HGOTO_ERROR(H5E_IO, H5E_MPI, FAIL, "unable to obtain mpi size")
 
-        one_link_chunk_io_threshold = H5P_peek_unsigned(dx_plist, H5D_XFER_MPIO_CHUNK_OPT_NUM_NAME);
+        /* Get the chunk optimization option */
+        if(H5P_get(dx_plist, H5D_XFER_MPIO_CHUNK_OPT_NUM_NAME, &one_link_chunk_io_threshold) < 0)
+            HGOTO_ERROR(H5E_IO, H5E_CANTGET, FAIL, "couldn't get chunk optimization option")
 
         /* step 1: choose an IO option */
         /* If the average number of chunk per process is greater than a threshold, we will do one link chunked IO. */
@@ -860,10 +863,9 @@ H5D__link_chunk_collective_io(H5D_io_info_t *io_info, const H5D_type_info_t *typ
             mspace = chunk_info->mspace;
 
             /* Look up address of chunk */
-            if(H5D__chunk_lookup(io_info->dset, io_info->dxpl_id, chunk_info->coords,
-                    chunk_info->index, &udata) < 0)
+            if(H5D__chunk_lookup(io_info->dset, io_info->dxpl_id, chunk_info->scaled, &udata) < 0)
                 HGOTO_ERROR(H5E_STORAGE, H5E_CANTGET, FAIL, "couldn't get chunk address")
-            ctg_store.contig.dset_addr = udata.addr;
+            ctg_store.contig.dset_addr = udata.chunk_block.offset;
         } /* end else */
 
         /* Set up the base storage address for this chunk */
@@ -1201,8 +1203,7 @@ if(H5DEBUG(D))
             HDassert(chunk_info->index == u);
 
             /* Pass in chunk's coordinates in a union. */
-            store.chunk.offset  = chunk_info->coords;
-            store.chunk.index   = chunk_info->index;
+            store.chunk.scaled  = chunk_info->scaled;
         } /* end if */
 
         /* Collective IO for this chunk,
@@ -1589,10 +1590,9 @@ if(H5DEBUG(D))
             H5D_chunk_ud_t udata;   /* User data for querying chunk info */
 
             /* Get address of chunk */
-            if(H5D__chunk_lookup(io_info->dset, io_info->dxpl_id,
-                    chunk_info->coords, chunk_info->index, &udata) < 0)
+            if(H5D__chunk_lookup(io_info->dset, io_info->dxpl_id, chunk_info->scaled, &udata) < 0)
                 HGOTO_ERROR(H5E_STORAGE, H5E_CANTGET, FAIL, "couldn't get chunk info from skipped list")
-            chunk_addr = udata.addr;
+            chunk_addr = udata.chunk_block.offset;
         } /* end if */
         else
             chunk_addr = total_chunk_addr_array[chunk_info->index];
@@ -1701,7 +1701,8 @@ H5D__obtain_mpio_mode(H5D_io_info_t* io_info, H5D_chunk_map_t *fm,
 
     /* Setup parameters */
     H5_CHECKED_ASSIGN(total_chunks, int, fm->layout->u.chunk.nchunks, hsize_t);
-    percent_nproc_per_chunk = H5P_peek_unsigned(dx_plist, H5D_XFER_MPIO_CHUNK_OPT_RATIO_NAME);
+    if(H5P_get(dx_plist, H5D_XFER_MPIO_CHUNK_OPT_RATIO_NAME, &percent_nproc_per_chunk) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_CANTGET, FAIL, "couldn't get percent nproc per chunk")
     /* if ratio is 0, perform collective io */
     if(0 == percent_nproc_per_chunk) {
         if(H5D__chunk_addrmap(io_info, chunk_addr) < 0)
diff --git a/src/H5Dnone.c b/src/H5Dnone.c
new file mode 100644
index 0000000..0cadac2
--- /dev/null
+++ b/src/H5Dnone.c
@@ -0,0 +1,497 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer: 	Vailin Choi <vchoi at hdfgroup.org>
+ *	       	September 2010
+ *
+ * Purpose:	Implicit (Non Index) chunked I/O functions.  
+ *		This is used when the dataset is:
+ *			extendible but with fixed max. dims
+ *			with early allocation
+ *			without filter
+ *		The chunk coordinate is mapped into the actual disk addresses
+ *		for the chunk without indexing.
+ *
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dpkg.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5MFprivate.h"	/* File space management		*/
+#include "H5VMprivate.h"         /* Vector functions			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Non Index chunking I/O ops */
+static herr_t H5D__none_idx_create(const H5D_chk_idx_info_t *idx_info);
+static hbool_t H5D__none_idx_is_space_alloc(const H5O_storage_chunk_t *storage);
+static herr_t H5D__none_idx_get_addr(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_ud_t *udata);
+static int H5D__none_idx_iterate(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_cb_func_t chunk_cb, void *chunk_udata);
+static herr_t H5D__none_idx_remove(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_common_ud_t *udata);
+static herr_t H5D__none_idx_delete(const H5D_chk_idx_info_t *idx_info);
+static herr_t H5D__none_idx_copy_setup(const H5D_chk_idx_info_t *idx_info_src,
+    const H5D_chk_idx_info_t *idx_info_dst);
+static herr_t H5D__none_idx_size(const H5D_chk_idx_info_t *idx_info,
+    hsize_t *size);
+static herr_t H5D__none_idx_reset(H5O_storage_chunk_t *storage, hbool_t reset_addr);
+static herr_t H5D__none_idx_dump(const H5O_storage_chunk_t *storage, FILE *stream);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Non Index chunk I/O ops */
+const H5D_chunk_ops_t H5D_COPS_NONE[1] = {{
+    FALSE,                      	/* Non-indexed chunking don't current support SWMR access */
+    NULL,				/* init */
+    H5D__none_idx_create,		/* create */
+    H5D__none_idx_is_space_alloc, 	/* is_space_alloc */
+    NULL,				/* insert */
+    H5D__none_idx_get_addr,		/* get_addr */
+    NULL,				/* resize */
+    H5D__none_idx_iterate,		/* iterate */
+    H5D__none_idx_remove,		/* remove */
+    H5D__none_idx_delete,		/* delete */
+    H5D__none_idx_copy_setup,		/* copy_setup */
+    NULL,				/* copy_shutdown */
+    H5D__none_idx_size,			/* size */
+    H5D__none_idx_reset,		/* reset */
+    H5D__none_idx_dump,			/* dump */
+    NULL				/* dest */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__none_idx_create
+ *
+ * Purpose:	Allocate memory for the maximum # of chunks in the dataset.
+ *		
+ * Return:	Non-negative on success 
+ *		Negative on failure.
+ *
+ * Programmer:	Vailin Choi; September 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__none_idx_create(const H5D_chk_idx_info_t *idx_info)
+{
+    hsize_t 	nbytes;                 /* Total size of dataset chunks */
+    haddr_t	addr;			/* The address of dataset chunks */
+    herr_t 	ret_value = SUCCEED; 	/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->pline->nused == 0); /* Shouldn't have filter defined on entering here */
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(idx_info->layout->max_nchunks);
+    HDassert(!H5F_addr_defined(idx_info->storage->idx_addr));	/* address of data shouldn't be defined */
+
+    /* Calculate size of max dataset chunks */
+    nbytes = idx_info->layout->max_nchunks * idx_info->layout->size;
+
+    /* Allocate space for max dataset chunks */
+    addr = H5MF_alloc(idx_info->f, H5FD_MEM_DRAW, idx_info->dxpl_id, nbytes);
+    if(!H5F_addr_defined(addr))
+	HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "file allocation failed")
+
+    /* This is the address of the dataset chunks */
+    idx_info->storage->idx_addr = addr;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__none_idx_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__none_idx_is_space_alloc
+ *
+ * Purpose:	Query if space for the dataset chunks is allocated
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; September 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+H5D__none_idx_is_space_alloc(const H5O_storage_chunk_t *storage)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(storage);
+
+    FUNC_LEAVE_NOAPI((hbool_t)H5F_addr_defined(storage->idx_addr))
+} /* end H5D__none_idx_is_space_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__none_idx_get_addr
+ *
+ * Purpose:	Get the file address of a chunk.
+ *		Save the retrieved information in the udata supplied.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; Sept 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__none_idx_get_addr(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *udata)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->pline->nused == 0);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(udata);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+
+    /* Calculate the index of this chunk */
+    udata->chunk_idx = H5VM_array_offset_pre((idx_info->layout->ndims - 1), idx_info->layout->max_down_chunks, udata->common.scaled);
+
+    /* Calculate the address of the chunk */
+    udata->chunk_block.offset = idx_info->storage->idx_addr + udata->chunk_idx * idx_info->layout->size;
+
+    /* Update the other (constant) information for the chunk */
+    udata->chunk_block.length = idx_info->layout->size;
+    udata->filter_mask = 0;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5D__none_idx_get_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__none_idx_iterate
+ *
+ * Purpose:	Iterate over the chunks in an index, making a callback
+ *              for each one.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; September 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5D__none_idx_iterate(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_cb_func_t chunk_cb, void *chunk_udata)
+{
+    H5D_chunk_rec_t chunk_rec;			/* generic chunk record  */
+    unsigned ndims; 	/* Rank of chunk */
+    unsigned u;		/* Local index variable */
+    int curr_dim;       /* Current rank */
+    hsize_t idx;    	/* Array index of chunk */
+    int ret_value = -1; /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(!idx_info->pline->nused);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(chunk_cb);
+    HDassert(chunk_udata);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+
+    /* Initialize generic chunk record */
+    HDmemset(&chunk_rec, 0, sizeof(chunk_rec));
+    chunk_rec.nbytes = idx_info->layout->size;
+    chunk_rec.filter_mask = 0;
+
+    ndims = idx_info->layout->ndims - 1;
+    HDassert(ndims > 0);
+
+    /* Iterate over all the chunks in the dataset's dataspace */
+    for(u = 0; u < idx_info->layout->nchunks; u++) {
+	/* Calculate the index of this chunk */
+	idx = H5VM_array_offset_pre(ndims, idx_info->layout->max_down_chunks, chunk_rec.scaled);
+
+	/* Calculate the address of the chunk */
+	chunk_rec.chunk_addr = idx_info->storage->idx_addr + idx * idx_info->layout->size;
+
+	/* Make "generic chunk" callback */
+	if((ret_value = (*chunk_cb)(&chunk_rec, chunk_udata)) < 0)
+	    HERROR(H5E_DATASET, H5E_CALLBACK, "failure in generic chunk iterator callback");
+
+	/* Update coordinates of chunk in dataset */
+	curr_dim = (int)(ndims - 1);
+	while(curr_dim >= 0) {
+	    /* Increment coordinate in current dimension */
+	    chunk_rec.scaled[curr_dim]++;
+
+	    /* Check if we went off the end of the current dimension */
+	    if(chunk_rec.scaled[curr_dim] >= idx_info->layout->chunks[curr_dim]) {
+		/* Reset coordinate & move to next faster dimension */
+		chunk_rec.scaled[curr_dim] = 0;
+		curr_dim--;
+	    } /* end if */
+	    else
+		break;
+	} /* end while */
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__none_idx_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__none_idx_remove
+ *
+ * Purpose:	Remove chunk from index.
+ *
+ * Note:	Chunks can't be removed (or added) to datasets with this
+ *		form of index - all the space for all the chunks is always
+ *		allocated in the file.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; Sept 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__none_idx_remove(const H5D_chk_idx_info_t H5_ATTR_UNUSED *idx_info, H5D_chunk_common_ud_t H5_ATTR_UNUSED *udata)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* NO OP */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5D__none_idx_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__none_idx_delete
+ *
+ * Purpose:	Delete raw data storage for entire dataset (i.e. all chunks)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi; Sept 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__none_idx_delete(const H5D_chk_idx_info_t *idx_info)
+{
+    hsize_t nbytes;                 /* Size of all chunks */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(!idx_info->pline->nused); /* Shouldn't have filter defined on entering here */
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));  /* should be defined */
+
+    /* chunk size * max # of chunks */
+    nbytes = idx_info->layout->max_nchunks * idx_info->layout->size;
+    if(H5MF_xfree(idx_info->f, H5FD_MEM_DRAW, idx_info->dxpl_id, idx_info->storage->idx_addr, nbytes) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, H5_ITER_ERROR, "unable to free dataset chunks")
+
+    idx_info->storage->idx_addr = HADDR_UNDEF;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__none_idx_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__none_idx_copy_setup
+ *
+ * Purpose:	Set up any necessary information for copying chunks
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; Sept 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__none_idx_copy_setup(const H5D_chk_idx_info_t *idx_info_src,
+    const H5D_chk_idx_info_t *idx_info_dst)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info_src);
+    HDassert(idx_info_src->f);
+    HDassert(idx_info_src->pline);
+    HDassert(!idx_info_src->pline->nused);
+    HDassert(idx_info_src->layout);
+    HDassert(idx_info_src->storage);
+    HDassert(H5F_addr_defined(idx_info_src->storage->idx_addr));
+
+    HDassert(idx_info_dst);
+    HDassert(idx_info_dst->f);
+    HDassert(idx_info_dst->pline);
+    HDassert(!idx_info_dst->pline->nused);
+    HDassert(idx_info_dst->layout);
+    HDassert(idx_info_dst->storage);
+
+    /* Set copied metadata tag */
+    H5_BEGIN_TAG(idx_info_dst->dxpl_id, H5AC__COPIED_TAG, FAIL);
+
+    /* Allocate dataset chunks in the dest. file */
+    if(H5D__none_idx_create(idx_info_dst) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize chunked storage")
+
+    /* Reset metadata tag */
+    H5_END_TAG(FAIL);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__none_idx_copy_setup() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__none_idx_size
+ *
+ * Purpose:     Retrieve the amount of index storage for chunked dataset
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        negative
+ *
+ * Programmer:	Vailin Choi; Sept 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__none_idx_size(const H5D_chk_idx_info_t H5_ATTR_UNUSED *idx_info, hsize_t *index_size)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(index_size);
+
+    *index_size = 0;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__none_idx_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__none_idx_reset
+ *
+ * Purpose:	Reset indexing information.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; Sept 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__none_idx_reset(H5O_storage_chunk_t *storage, hbool_t reset_addr)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(storage);
+
+    /* Reset index info */
+    if(reset_addr)
+	storage->idx_addr = HADDR_UNDEF;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__none_idx_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__none_idx_dump
+ *
+ * Purpose:	Dump 
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; September 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__none_idx_dump(const H5O_storage_chunk_t *storage, FILE *stream)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(storage);
+    HDassert(stream);
+
+    HDfprintf(stream, "    Address: %a\n", storage->idx_addr);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__none_idx_dump() */
+
diff --git a/src/H5Doh.c b/src/H5Doh.c
index 62600b4..2836ef2 100644
--- a/src/H5Doh.c
+++ b/src/H5Doh.c
@@ -17,8 +17,8 @@
 /* Module Setup */
 /****************/
 
-#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
+#define H5O_FRIEND		/*suppress error about including H5Opkg	  */
 
 
 /***********/
@@ -53,9 +53,9 @@ static hid_t H5O__dset_open(const H5G_loc_t *obj_loc, hid_t lapl_id,
 static void *H5O__dset_create(H5F_t *f, void *_crt_info, H5G_loc_t *obj_loc,
     hid_t dxpl_id);
 static H5O_loc_t *H5O__dset_get_oloc(hid_t obj_id);
-static herr_t H5O__dset_bh_info(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
+static herr_t H5O__dset_bh_info(const H5O_loc_t *loc, hid_t dxpl_id, H5O_t *oh,
     H5_ih_info_t *bh_info);
-static herr_t H5O__dset_flush(H5G_loc_t *obj_loc, hid_t dxpl_id);
+static herr_t H5O__dset_flush(void *_obj_ptr, hid_t dxpl_id);
 
 
 /*********************/
@@ -108,7 +108,7 @@ H5FL_DEFINE(H5D_copy_file_ud_t);
 static void *
 H5O__dset_get_copy_file_udata(void)
 {
-    void *ret_value;       /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_STATIC
 
@@ -156,6 +156,10 @@ H5O__dset_free_copy_file_udata(void *_udata)
     if(udata->common.src_pline)
         H5O_msg_free(H5O_PLINE_ID, udata->common.src_pline);
 
+    /* Release copy of dataset's layout, if it was set */
+    if(udata->src_layout)
+        H5O_msg_free(H5O_LAYOUT_ID, udata->src_layout);
+
     /* Release space for 'copy file' user data */
     udata = H5FL_FREE(H5D_copy_file_ud_t, udata);
 
@@ -223,10 +227,10 @@ done:
 static hid_t
 H5O__dset_open(const H5G_loc_t *obj_loc, hid_t lapl_id, hid_t dxpl_id, hbool_t app_ref)
 {
-    H5D_t       *dset = NULL;           /* Dataset opened */
-    htri_t  isdapl;                 /* lapl_id is a dapl */
-    hid_t   dapl_id;                /* dapl to use to open this dataset */
-    hid_t	ret_value;              /* Return value */
+    H5D_t  *dset = NULL;                /* Dataset opened */
+    htri_t  isdapl;                     /* lapl_id is a dapl */
+    hid_t   dapl_id;                    /* dapl to use to open this dataset */
+    hid_t   ret_value = H5I_INVALID_HID;        /* Return value */
 
     FUNC_ENTER_STATIC
 
@@ -279,7 +283,7 @@ H5O__dset_create(H5F_t *f, void *_crt_info, H5G_loc_t *obj_loc, hid_t dxpl_id)
 {
     H5D_obj_create_t *crt_info = (H5D_obj_create_t *)_crt_info; /* Dataset creation parameters */
     H5D_t *dset = NULL;         /* New dataset created */
-    void *ret_value;            /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_STATIC
 
@@ -327,7 +331,7 @@ static H5O_loc_t *
 H5O__dset_get_oloc(hid_t obj_id)
 {
     H5D_t       *dset;                  /* Dataset opened */
-    H5O_loc_t	*ret_value;             /* Return value */
+    H5O_loc_t	*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_STATIC
 
@@ -356,20 +360,14 @@ done:
  * Programmer:  Vailin Choi
  *              July 11, 2007
  *
- * Modification:Raymond Lu
- *              5 February, 2010
- *              I added the call to H5O_msg_reset after H5D_chunk_bh_info 
- *              to free the PLINE. 
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O__dset_bh_info(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5_ih_info_t *bh_info)
+H5O__dset_bh_info(const H5O_loc_t *loc, hid_t dxpl_id, H5O_t *oh, H5_ih_info_t *bh_info)
 {
     H5O_layout_t        layout;         	/* Data storage layout message */
-    H5O_pline_t         pline;                  /* I/O pipeline message */
     H5O_efl_t           efl;			/* External File List message */
     hbool_t             layout_read = FALSE;    /* Whether the layout message was read */
-    hbool_t             pline_read = FALSE;     /* Whether the I/O pipeline message was read */
     hbool_t             efl_read = FALSE;       /* Whether the external file list message was read */
     htri_t		exists;                 /* Flag if header message of interest exists */
     herr_t      	ret_value = SUCCEED;    /* Return value */
@@ -377,31 +375,34 @@ H5O__dset_bh_info(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5_ih_info_t *bh_info)
     FUNC_ENTER_STATIC
 
     /* Sanity check */
-    HDassert(f);
+    HDassert(loc);
+    HDassert(loc->file);
+    HDassert(H5F_addr_defined(loc->addr));
     HDassert(oh);
     HDassert(bh_info);
 
     /* Get the layout message from the object header */
-    if(NULL == H5O_msg_read_oh(f, dxpl_id, oh, H5O_LAYOUT_ID, &layout))
+    if(NULL == H5O_msg_read_oh(loc->file, dxpl_id, oh, H5O_LAYOUT_ID, &layout))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't find layout message")
     layout_read = TRUE;
 
     /* Check for chunked dataset storage */
     if(layout.type == H5D_CHUNKED && H5D__chunk_is_space_alloc(&layout.storage)) {
-        /* Check for I/O pipeline message */
-        if((exists = H5O_msg_exists_oh(oh, H5O_PLINE_ID)) < 0)
-            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to read object header")
-        else if(exists) {
-            if(NULL == H5O_msg_read_oh(f, dxpl_id, oh, H5O_PLINE_ID, &pline))
-                HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't find I/O pipeline message")
-            pline_read = TRUE;
-        } /* end else if */
-        else
-            HDmemset(&pline, 0, sizeof(pline));
-
-        if(H5D__chunk_bh_info(f, dxpl_id, &layout, &pline, &(bh_info->index_size)) < 0)
+        /* Get size of chunk index */
+        if(H5D__chunk_bh_info(loc, dxpl_id, oh, &layout, &(bh_info->index_size)) < 0)
             HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't determine chunked dataset btree info")
     } /* end if */
+    else if(layout.type == H5D_VIRTUAL
+            && (layout.storage.u.virt.serial_list_hobjid.addr != HADDR_UNDEF)) {
+        size_t virtual_heap_size;
+
+        /* Get size of global heap object for virtual dataset */
+        if(H5HG_get_obj_size(loc->file, dxpl_id, &(layout.storage.u.virt.serial_list_hobjid), &virtual_heap_size) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get global heap size for virtual dataset mapping")
+
+        /* Return heap size */
+        bh_info->heap_size = (hsize_t)virtual_heap_size;
+    } /* end if */
 
     /* Check for External File List message in the object header */
     if((exists = H5O_msg_exists_oh(oh, H5O_EFL_ID)) < 0)
@@ -412,12 +413,12 @@ H5O__dset_bh_info(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5_ih_info_t *bh_info)
         HDmemset(&efl, 0, sizeof(efl));
 
 	/* Get External File List message from the object header */
-	if(NULL == H5O_msg_read_oh(f, dxpl_id, oh, H5O_EFL_ID, &efl))
+	if(NULL == H5O_msg_read_oh(loc->file, dxpl_id, oh, H5O_EFL_ID, &efl))
 	    HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't find EFL message")
         efl_read = TRUE;
 
 	/* Get size of local heap for EFL message's file list */
-	if(H5D__efl_bh_info(f, dxpl_id, &efl, &(bh_info->heap_size)) < 0)
+	if(H5D__efl_bh_info(loc->file, dxpl_id, &efl, &(bh_info->heap_size)) < 0)
             HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't determine EFL heap info")
     } /* end if */
 
@@ -425,8 +426,6 @@ done:
     /* Free messages, if they've been read in */
     if(layout_read && H5O_msg_reset(H5O_LAYOUT_ID, &layout) < 0)
         HDONE_ERROR(H5E_DATASET, H5E_CANTRESET, FAIL, "unable to reset data storage layout message")
-    if(pline_read && H5O_msg_reset(H5O_PLINE_ID, &pline) < 0)
-        HDONE_ERROR(H5E_DATASET, H5E_CANTRESET, FAIL, "unable to reset I/O pipeline message")
     if(efl_read && H5O_msg_reset(H5O_EFL_ID, &efl) < 0)
         HDONE_ERROR(H5E_DATASET, H5E_CANTRESET, FAIL, "unable to reset external file list message")
 
@@ -448,34 +447,27 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O__dset_flush(H5G_loc_t *obj_loc, hid_t dxpl_id)
+H5O__dset_flush(void *_obj_ptr, hid_t dxpl_id)
 {
-    H5D_t       *dset = NULL;          /* Dataset opened */
-    H5O_type_t 	obj_type;              /* Type of object at location */
-    herr_t      ret_value = SUCCEED;    /* Return value */
+    H5D_t *dset = (H5D_t *)_obj_ptr;	/* Pointer to dataset object */
+    H5O_type_t obj_type;              	/* Type of object at location */
+    herr_t ret_value = SUCCEED;   	/* Return value */
 
     FUNC_ENTER_STATIC
 
-    HDassert(obj_loc);
-    HDassert(obj_loc->oloc);
+    HDassert(dset);
+    HDassert(&dset->oloc);
 
     /* Check that the object found is the correct type */
-    if(H5O_obj_type(obj_loc->oloc, &obj_type, dxpl_id) < 0)
+    if(H5O_obj_type(&dset->oloc, &obj_type, dxpl_id) < 0)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get object type")
-
     if(obj_type != H5O_TYPE_DATASET)
         HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a dataset")
 
-    /* Open the dataset */
-    if(NULL == (dset = H5D_open(obj_loc, H5P_DATASET_ACCESS_DEFAULT, dxpl_id)))
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "unable to open dataset")
-    
     if(H5D__flush_real(dset, dxpl_id) < 0)
 	HDONE_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to flush cached dataset info")
 
 done:
-    if(dset && H5D_close(dset) < 0)
-	HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release dataset")
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5O__dset_flush() */
 
diff --git a/src/H5Dpkg.h b/src/H5Dpkg.h
index d0adb51..da6b61e 100644
--- a/src/H5Dpkg.h
+++ b/src/H5Dpkg.h
@@ -21,7 +21,7 @@
  *		the H5D package.  Source files outside the H5D package should
  *		include H5Dprivate.h instead.
  */
-#ifndef H5D_PACKAGE
+#if !(defined H5D_FRIEND || defined H5D_MODULE)
 #error "Do not include this file outside the H5D package!"
 #endif
 
@@ -33,6 +33,8 @@
 
 /* Other private headers needed by this file */
 #include "H5ACprivate.h"	/* Metadata cache			*/
+#include "H5B2private.h"        /* v2 B-trees                           */
+#include "H5Fprivate.h"		/* File access				*/
 #include "H5Gprivate.h"		/* Groups 			  	*/
 #include "H5SLprivate.h"	/* Skip lists				*/
 #include "H5Tprivate.h"		/* Datatypes         			*/
@@ -60,12 +62,31 @@
     (io_info)->op_type = H5D_IO_OP_READ;                                \
     (io_info)->u.rbuf = buf
 
-#define H5D_CHUNK_HASH(D, ADDR) H5F_addr_hash(ADDR, (D)->cache.chunk.nslots)
-
 /* Flags for marking aspects of a dataset dirty */
 #define H5D_MARK_SPACE  0x01
 #define H5D_MARK_LAYOUT  0x02
 
+/* Default creation parameters for chunk index data structures */
+/* See H5O_layout_chunk_t */
+
+/* Fixed array creation values */
+#define H5D_FARRAY_CREATE_PARAM_SIZE		1	/* Size of the creation parameters in bytes */
+#define H5D_FARRAY_MAX_DBLK_PAGE_NELMTS_BITS 	10  	/* i.e. 1024 elements per data block page */
+
+/* Extensible array creation values */
+#define H5D_EARRAY_CREATE_PARAM_SIZE		5	/* Size of the creation parameters in bytes */
+#define H5D_EARRAY_MAX_NELMTS_BITS         	32	/* i.e. 4 giga-elements */
+#define H5D_EARRAY_IDX_BLK_ELMTS           	4
+#define H5D_EARRAY_SUP_BLK_MIN_DATA_PTRS   	4
+#define H5D_EARRAY_DATA_BLK_MIN_ELMTS      	16
+#define H5D_EARRAY_MAX_DBLOCK_PAGE_NELMTS_BITS 	10 	/* i.e. 1024 elements per data block page */
+
+/* v2 B-tree creation values for raw meta_size */
+#define H5D_BT2_CREATE_PARAM_SIZE	6		/* Size of the creation parameters in bytes */
+#define H5D_BT2_NODE_SIZE       	512
+#define H5D_BT2_SPLIT_PERC      	100
+#define H5D_BT2_MERGE_PERC      	40
+
 
 /****************************/
 /* Package Private Typedefs */
@@ -82,7 +103,7 @@ typedef struct H5D_type_info_t {
 
     /* Computed/derived values */
     size_t src_type_size;		/* Size of source type	*/
-    size_t dst_type_size;	        /* Size of destination type*/
+    size_t dst_type_size;	        /* Size of destination type */
     size_t max_type_size;	        /* Size of largest source/destination type */
     hbool_t is_conv_noop;               /* Whether the type conversion is a NOOP */
     hbool_t is_xform_noop;              /* Whether the data transform is a NOOP */
@@ -122,6 +143,7 @@ typedef ssize_t (*H5D_layout_writevv_func_t)(const struct H5D_io_info_t *io_info
     size_t mem_max_nseq, size_t *mem_curr_seq, size_t mem_len_arr[], hsize_t mem_offset_arr[]);
 typedef herr_t (*H5D_layout_flush_func_t)(H5D_t *dataset, hid_t dxpl_id);
 typedef herr_t (*H5D_layout_io_term_func_t)(const struct H5D_chunk_map_t *cm);
+typedef herr_t (*H5D_layout_dest_func_t)(H5D_t *dataset, hid_t dxpl_id);
 
 /* Typedef for grouping layout I/O routines */
 typedef struct H5D_layout_ops_t {
@@ -139,6 +161,7 @@ typedef struct H5D_layout_ops_t {
     H5D_layout_writevv_func_t writevv;  /* Low-level I/O routine for writing data */
     H5D_layout_flush_func_t flush;      /* Low-level I/O routine for flushing raw data */
     H5D_layout_io_term_func_t io_term;  /* I/O shutdown routine */
+    H5D_layout_dest_func_t dest;        /* Destroy layout info */
 } H5D_layout_ops_t;
 
 /* Function pointers for either multiple or single block I/O access */
@@ -164,8 +187,7 @@ typedef struct {
 } H5D_contig_storage_t;
 
 typedef struct {
-    hsize_t index;          /* "Index" of chunk in dataset (must be first for TBBT routines) */
-    hsize_t *offset;        /* Chunk's coordinates in elements */
+    hsize_t *scaled;        /* Scaled coordinates for a chunk */
 } H5D_chunk_storage_t;
 
 typedef struct {
@@ -238,9 +260,9 @@ typedef struct H5D_chk_idx_info_t {
  * The chunk's file address, filter mask and size on disk are not key values.
  */
 typedef struct H5D_chunk_rec_t {
+    hsize_t	scaled[H5O_LAYOUT_NDIMS];	/* Logical offset to start */
     uint32_t	nbytes;				/* Size of stored data	*/
-    hsize_t	offset[H5O_LAYOUT_NDIMS];	/* Logical offset to start */
-    unsigned	filter_mask;			/* Excluded filters	*/
+    uint32_t	filter_mask;			/* Excluded filters	*/
     haddr_t     chunk_addr;                     /* Address of chunk in file */
 } H5D_chunk_rec_t;
 
@@ -253,10 +275,7 @@ typedef struct H5D_chunk_common_ud_t {
     /* downward */
     const H5O_layout_chunk_t *layout;           /* Chunk layout description */
     const H5O_storage_chunk_t *storage;         /* Chunk storage description */
-    const hsize_t *offset;	                /* Logical offset of chunk */
-    const struct H5D_rdcc_t *rdcc;              /* Chunk cache.  Only necessary if the index may
-                                                 * be modified, and if any chunks in the dset
-                                                 * may be cached */
+    const hsize_t *scaled;		        /* Scaled coordinates for a chunk */
 } H5D_chunk_common_ud_t;
 
 /* B-tree callback info for various operations */
@@ -265,9 +284,11 @@ typedef struct H5D_chunk_ud_t {
 
     /* Upward */
     unsigned    idx_hint;               /*index of chunk in cache, if present */
-    uint32_t	nbytes;			/*size of stored data	*/
+    H5F_block_t chunk_block;            /*offset/length of chunk in file */
     unsigned	filter_mask;		/*excluded filters	*/
-    haddr_t	addr;			/*file address of chunk */
+    hbool_t     new_unfilt_chunk;       /*whether the chunk just became unfiltered */
+    hsize_t     chunk_idx;              /*chunk index for EA, FA indexing */
+    hbool_t     need_modify;
 } H5D_chunk_ud_t;
 
 /* Typedef for "generic" chunk callbacks */
@@ -280,7 +301,7 @@ typedef herr_t (*H5D_chunk_init_func_t)(const H5D_chk_idx_info_t *idx_info,
 typedef herr_t (*H5D_chunk_create_func_t)(const H5D_chk_idx_info_t *idx_info);
 typedef hbool_t (*H5D_chunk_is_space_alloc_func_t)(const H5O_storage_chunk_t *storage);
 typedef herr_t (*H5D_chunk_insert_func_t)(const H5D_chk_idx_info_t *idx_info,
-    H5D_chunk_ud_t *udata);
+    H5D_chunk_ud_t *udata, const H5D_t *dset);
 typedef herr_t (*H5D_chunk_get_addr_func_t)(const H5D_chk_idx_info_t *idx_info,
     H5D_chunk_ud_t *udata);
 typedef herr_t (*H5D_chunk_resize_func_t)(H5O_layout_chunk_t *layout);
@@ -302,6 +323,7 @@ typedef herr_t (*H5D_chunk_dest_func_t)(const H5D_chk_idx_info_t *idx_info);
 
 /* Typedef for grouping chunk I/O routines */
 typedef struct H5D_chunk_ops_t {
+    hbool_t can_swim;                       /* Flag to indicate that the index supports SWMR access */
     H5D_chunk_init_func_t init;             /* Routine to initialize indexing information in memory */
     H5D_chunk_create_func_t create;         /* Routine to create chunk index */
     H5D_chunk_is_space_alloc_func_t is_space_alloc;    /* Query routine to determine if storage/index is allocated */
@@ -323,11 +345,11 @@ typedef struct H5D_chunk_ops_t {
 typedef struct H5D_chunk_info_t {
     hsize_t index;              /* "Index" of chunk in dataset */
     uint32_t chunk_points;      /* Number of elements selected in chunk */
-    hsize_t coords[H5O_LAYOUT_NDIMS];   /* Coordinates of chunk in file dataset's dataspace */
+    hsize_t scaled[H5O_LAYOUT_NDIMS];   /* Scaled coordinates of chunk (in file dataset's dataspace) */
     H5S_t *fspace;              /* Dataspace describing chunk & selection in it */
-    unsigned fspace_shared;     /* Indicate that the file space for a chunk is shared and shouldn't be freed */
+    hbool_t fspace_shared;      /* Indicate that the file space for a chunk is shared and shouldn't be freed */
     H5S_t *mspace;              /* Dataspace describing selection in memory corresponding to this chunk */
-    unsigned mspace_shared;     /* Indicate that the memory space for a chunk is shared and shouldn't be freed */
+    hbool_t mspace_shared;      /* Indicate that the memory space for a chunk is shared and shouldn't be freed */
 } H5D_chunk_info_t;
 
 /* Main structure holding the mapping between file chunks and memory */
@@ -337,13 +359,13 @@ typedef struct H5D_chunk_map_t {
 
     const H5S_t *file_space;    /* Pointer to the file dataspace */
     unsigned f_ndims;           /* Number of dimensions for file dataspace */
-    hsize_t f_dims[H5O_LAYOUT_NDIMS];   /* File dataspace dimensions */
 
     const H5S_t *mem_space;     /* Pointer to the memory dataspace */
     H5S_t *mchunk_tmpl;         /* Dataspace template for new memory chunks */
     H5S_sel_iter_t mem_iter;    /* Iterator for elements in memory selection */
     unsigned m_ndims;           /* Number of dimensions for memory dataspace */
     H5S_sel_type msel_type;     /* Selection type in memory */
+    H5S_sel_type fsel_type;     /* Selection type in file */
 
     H5SL_t *sel_chunks;         /* Skip list containing information for each chunk selected */
 
@@ -364,12 +386,23 @@ typedef struct H5D_chunk_map_t {
 /* Cached information about a particular chunk */
 typedef struct H5D_chunk_cached_t {
     hbool_t     valid;                          /*whether cache info is valid*/
-    hsize_t	offset[H5O_LAYOUT_NDIMS];	/*logical offset to start*/
+    hsize_t	scaled[H5O_LAYOUT_NDIMS];	/*scaled offset of chunk*/
+    haddr_t	addr;				/*file address of chunk */
     uint32_t	nbytes;				/*size of stored data	*/
+    hsize_t     chunk_idx;			/*index of chunk in dataset */
     unsigned	filter_mask;			/*excluded filters	*/
-    haddr_t	addr;				/*file address of chunk */
 } H5D_chunk_cached_t;
 
+/****************************/
+/* Virtual dataset typedefs */
+/****************************/
+
+/* List of files held open during refresh operations */
+typedef struct H5D_virtual_held_file_t {
+    H5F_t *file;                                /* Pointer to file held open */
+    struct H5D_virtual_held_file_t *next;       /* Pointer to next node in list */
+} H5D_virtual_held_file_t;
+
 /* The raw data chunk cache */
 typedef struct H5D_rdcc_t {
     struct {
@@ -383,13 +416,19 @@ typedef struct H5D_rdcc_t {
     double		w0;     /* Chunk preemption policy          */
     struct H5D_rdcc_ent_t *head; /* Head of doubly linked list		*/
     struct H5D_rdcc_ent_t *tail; /* Tail of doubly linked list		*/
+    struct H5D_rdcc_ent_t *tmp_head; /* Head of temporary doubly linked list.  Chunks on this list are not in the hash table (slot).  The head entry is a sentinel (does not refer to an actual chunk). */
     size_t		nbytes_used; /* Current cached raw data in bytes */
     int			nused;	/* Number of chunk slots in use		*/
     H5D_chunk_cached_t last;    /* Cached copy of last chunk information */
     struct H5D_rdcc_ent_t **slot; /* Chunk slots, each points to a chunk*/
     H5SL_t		*sel_chunks; /* Skip list containing information for each chunk selected */
     H5S_t		*single_space; /* Dataspace for single element I/O on chunks */
-    H5D_chunk_info_t *single_chunk_info;  /* Pointer to single chunk's info */
+    H5D_chunk_info_t    *single_chunk_info;  /* Pointer to single chunk's info */
+
+    /* Cached information about scaled dataspace dimensions */
+    hsize_t             scaled_dims[H5S_MAX_RANK];          /* The scaled dim sizes */
+    hsize_t             scaled_power2up[H5S_MAX_RANK];      /* The scaled dim sizes, rounded up to next power of 2 */
+    unsigned            scaled_encode_bits[H5S_MAX_RANK];   /* The number of bits needed to encode the scaled dim sizes */
 } H5D_rdcc_t;
 
 /* The raw data contiguous data cache */
@@ -409,15 +448,22 @@ typedef struct H5D_rdcdc_t {
  */
 typedef struct H5D_shared_t {
     size_t              fo_count;       /* Reference count */
+    hbool_t             closing;        /* Flag to indicate dataset is closing */
     hid_t               type_id;        /* ID for dataset's datatype    */
     H5T_t              *type;           /* Datatype for this dataset     */
     H5S_t              *space;          /* Dataspace of this dataset    */
-    hbool_t             space_dirty;    /* Whether the dataspace info needs to be flushed to the file */
-    hbool_t             layout_dirty;   /* Whether the layout info needs to be flushed to the file */
     hid_t               dcpl_id;        /* Dataset creation property id */
     H5D_dcpl_cache_t    dcpl_cache;     /* Cached DCPL values */
     H5O_layout_t        layout;         /* Data layout                  */
     hbool_t             checked_filters;/* TRUE if dataset passes can_apply check */
+    H5O_t              *oh;             /* Pointer to dataset's object header, pinned */
+    hbool_t             is_swimming;    /* TRUE if dataset has SWMR access enabled */
+
+    /* Cached dataspace info */
+    unsigned            ndims;          /* The dataset's dataspace rank */
+    hsize_t             curr_dims[H5S_MAX_RANK];    /* The curr. size of dataset dimensions */
+    hsize_t             curr_power2up[H5S_MAX_RANK];    /* The curr. dim sizes, rounded up to next power of 2 */
+    hsize_t             max_dims[H5S_MAX_RANK];     /* The max. size of dataset dimensions */ 
 
     /* Buffered/cached information for types of raw data storage*/
     struct {
@@ -428,6 +474,7 @@ typedef struct H5D_shared_t {
                                          */
         H5D_rdcc_t      chunk;          /* Information about chunked data */
     } cache;
+    H5D_append_flush_t  append_flush;	/* Append flush property information */
 } H5D_shared_t;
 
 struct H5D_t {
@@ -488,19 +535,28 @@ typedef struct {
     hsize_t size;       /* Accumulated number of bytes for the selection */
 } H5D_vlen_bufsize_t;
 
+/* Flags for the "edge_chunk_state" field below */
+#define H5D_RDCC_DISABLE_FILTERS 0x01u          /* Disable filters on this chunk */
+#define H5D_RDCC_NEWLY_DISABLED_FILTERS 0x02u   /* Filters have been disabled since
+                                                 * the last flush */
+
 /* Raw data chunks are cached.  Each entry in the cache is: */
 typedef struct H5D_rdcc_ent_t {
     hbool_t	locked;		/*entry is locked in cache		*/
     hbool_t	dirty;		/*needs to be written to disk?		*/
-    hbool_t     deleted;        /*chunk about to be deleted (do not flush) */
-    hsize_t	offset[H5O_LAYOUT_NDIMS]; /*chunk name			*/
+    hbool_t     deleted;        /*chunk about to be deleted		*/
+    unsigned    edge_chunk_state; /*states related to edge chunks (see above) */
+    hsize_t 	scaled[H5O_LAYOUT_NDIMS]; /*scaled chunk 'name' (coordinates) */
     uint32_t	rd_count;	/*bytes remaining to be read		*/
     uint32_t	wr_count;	/*bytes remaining to be written		*/
-    haddr_t     chunk_addr;     /*address of chunk in file		*/
+    H5F_block_t chunk_block;    /*offset/length of chunk in file        */
+    hsize_t     chunk_idx;  	/*index of chunk in dataset             */
     uint8_t	*chunk;		/*the unfiltered chunk data		*/
     unsigned	idx;		/*index in hash table			*/
     struct H5D_rdcc_ent_t *next;/*next item in doubly-linked list	*/
     struct H5D_rdcc_ent_t *prev;/*previous item in doubly-linked list	*/
+    struct H5D_rdcc_ent_t *tmp_next;/*next item in temporary doubly-linked list */
+    struct H5D_rdcc_ent_t *tmp_prev;/*previous item in temporary doubly-linked list */
 } H5D_rdcc_ent_t;
 typedef H5D_rdcc_ent_t *H5D_rdcc_ent_ptr_t; /* For free lists */
 
@@ -515,22 +571,33 @@ H5_DLLVAR const H5D_layout_ops_t H5D_LOPS_CONTIG[1];
 H5_DLLVAR const H5D_layout_ops_t H5D_LOPS_EFL[1];
 H5_DLLVAR const H5D_layout_ops_t H5D_LOPS_COMPACT[1];
 H5_DLLVAR const H5D_layout_ops_t H5D_LOPS_CHUNK[1];
+H5_DLLVAR const H5D_layout_ops_t H5D_LOPS_VIRTUAL[1];
 
 /* Chunked layout operations */
 H5_DLLVAR const H5D_chunk_ops_t H5D_COPS_BTREE[1];
+H5_DLLVAR const H5D_chunk_ops_t H5D_COPS_NONE[1];
+H5_DLLVAR const H5D_chunk_ops_t H5D_COPS_SINGLE[1];
+H5_DLLVAR const H5D_chunk_ops_t H5D_COPS_EARRAY[1];
+H5_DLLVAR const H5D_chunk_ops_t H5D_COPS_FARRAY[1];
+H5_DLLVAR const H5D_chunk_ops_t H5D_COPS_BT2[1];
+
+/* The v2 B-tree class for indexing chunked datasets with >1 unlimited dimensions */
+H5_DLLVAR const H5B2_class_t H5D_BT2[1];
+H5_DLLVAR const H5B2_class_t H5D_BT2_FILT[1];
+
 
 
 /******************************/
 /* Package Private Prototypes */
 /******************************/
 
-H5_DLL herr_t H5D__term_pub_interface(void);
-H5_DLL herr_t H5D__term_deprec_interface(void);
 H5_DLL H5D_t *H5D__create(H5F_t *file, hid_t type_id, const H5S_t *space,
     hid_t dcpl_id, hid_t dapl_id, hid_t dxpl_id);
 H5_DLL H5D_t *H5D__create_named(const H5G_loc_t *loc, const char *name,
     hid_t type_id, const H5S_t *space, hid_t lcpl_id, hid_t dcpl_id,
     hid_t dapl_id, hid_t dxpl_id);
+H5_DLL H5D_t *H5D__open_name(const H5G_loc_t *loc, const char *name,
+    hid_t dapl_id, hid_t dxpl_id);
 H5_DLL herr_t H5D__get_space_status(H5D_t *dset, H5D_space_status_t *allocation,
     hid_t dxpl_id);
 H5_DLL herr_t H5D__alloc_storage(const H5D_t *dset, hid_t dxpl_id, H5D_time_alloc_t time_alloc,
@@ -544,13 +611,20 @@ H5_DLL herr_t H5D__check_filters(H5D_t *dataset);
 H5_DLL herr_t H5D__set_extent(H5D_t *dataset, const hsize_t *size, hid_t dxpl_id);
 H5_DLL herr_t H5D__get_dxpl_cache(hid_t dxpl_id, H5D_dxpl_cache_t **cache);
 H5_DLL herr_t H5D__flush_sieve_buf(H5D_t *dataset, hid_t dxpl_id);
-H5_DLL herr_t H5D__mark(const H5D_t *dataset, hid_t dxpl_id, unsigned flags);
 H5_DLL herr_t H5D__flush_real(H5D_t *dataset, hid_t dxpl_id);
+H5_DLL herr_t H5D__mark(const H5D_t *dataset, hid_t dxpl_id, unsigned flags);
+H5_DLL herr_t H5D__refresh(hid_t dset_id, H5D_t *dataset, hid_t dxpl_id);
+
+/* To convert a dataset's chunk indexing type to v1 B-tree */
+H5_DLL herr_t H5D__format_convert(H5D_t *dataset, hid_t dxpl_id);
 
 /* Internal I/O routines */
 H5_DLL herr_t H5D__read(H5D_t *dataset, hid_t mem_type_id,
     const H5S_t *mem_space, const H5S_t *file_space, hid_t dset_xfer_plist,
     void *buf/*out*/);
+H5_DLL herr_t H5D__write(H5D_t *dataset, hid_t mem_type_id,
+    const H5S_t *mem_space, const H5S_t *file_space, hid_t dset_xfer_plist,
+    const void *buf);
 
 /* Functions that perform direct serial I/O operations */
 H5_DLL herr_t H5D__select_read(const H5D_io_info_t *io_info,
@@ -575,6 +649,10 @@ H5_DLL herr_t H5D__scatgath_write(const H5D_io_info_t *io_info,
 H5_DLL herr_t H5D__layout_set_io_ops(const H5D_t *dataset);
 H5_DLL size_t H5D__layout_meta_size(const H5F_t *f, const H5O_layout_t *layout,
     hbool_t include_compact_data);
+H5_DLL herr_t H5D__layout_set_latest_version(H5O_layout_t *layout,
+    const H5S_t *space, const H5D_dcpl_cache_t *dcpl_cache);
+H5_DLL herr_t H5D__layout_set_latest_indexing(H5O_layout_t *layout,
+    const H5S_t *space, const H5D_dcpl_cache_t *dcpl_cache);
 H5_DLL herr_t H5D__layout_oh_create(H5F_t *file, hid_t dxpl_id, H5O_t *oh,
     H5D_t *dset, hid_t dapl_id);
 H5_DLL herr_t H5D__layout_oh_read(H5D_t *dset, hid_t dxpl_id, hid_t dapl_id,
@@ -599,27 +677,27 @@ H5_DLL herr_t H5D__contig_copy(H5F_t *f_src, const H5O_storage_contig_t *storage
 H5_DLL herr_t H5D__contig_delete(H5F_t *f, hid_t dxpl_id,
     const H5O_storage_t *store);
 
-
 /* Functions that operate on chunked dataset storage */
 H5_DLL htri_t H5D__chunk_cacheable(const H5D_io_info_t *io_info, haddr_t caddr,
     hbool_t write_op);
 H5_DLL herr_t H5D__chunk_create(const H5D_t *dset /*in,out*/, hid_t dxpl_id);
 H5_DLL herr_t H5D__chunk_set_info(const H5D_t *dset);
-H5_DLL herr_t H5D__chunk_init(H5F_t *f, hid_t dxpl_id, const H5D_t *dset,
-    hid_t dapl_id);
 H5_DLL hbool_t H5D__chunk_is_space_alloc(const H5O_storage_t *storage);
 H5_DLL herr_t H5D__chunk_lookup(const H5D_t *dset, hid_t dxpl_id,
-    const hsize_t *chunk_offset, hsize_t chunk_idx, H5D_chunk_ud_t *udata);
+    const hsize_t *scaled, H5D_chunk_ud_t *udata);
 H5_DLL void *H5D__chunk_lock(const H5D_io_info_t *io_info,
-    H5D_chunk_ud_t *udata, hbool_t relax);
+    H5D_chunk_ud_t *udata, hbool_t relax, hbool_t prev_unfilt_chunk);
 H5_DLL herr_t H5D__chunk_unlock(const H5D_io_info_t *io_info,
     const H5D_chunk_ud_t *udata, hbool_t dirty, void *chunk,
     uint32_t naccessed);
 H5_DLL herr_t H5D__chunk_allocated(H5D_t *dset, hid_t dxpl_id, hsize_t *nbytes);
 H5_DLL herr_t H5D__chunk_allocate(const H5D_t *dset, hid_t dxpl_id,
     hbool_t full_overwrite, hsize_t old_dim[]);
+H5_DLL herr_t H5D__chunk_update_old_edge_chunks(H5D_t *dset, hid_t dxpl_id,
+    hsize_t old_dim[]);
 H5_DLL herr_t H5D__chunk_prune_by_extent(H5D_t *dset, hid_t dxpl_id,
     const hsize_t *old_dim);
+H5_DLL herr_t H5D__chunk_set_sizes(H5D_t *dset);
 #ifdef H5_HAVE_PARALLEL
 H5_DLL herr_t H5D__chunk_addrmap(const H5D_io_info_t *io_info, haddr_t chunk_addr[]);
 #endif /* H5_HAVE_PARALLEL */
@@ -628,10 +706,9 @@ H5_DLL herr_t H5D__chunk_copy(H5F_t *f_src, H5O_storage_chunk_t *storage_src,
     H5O_layout_chunk_t *layout_src, H5F_t *f_dst, H5O_storage_chunk_t *storage_dst,
     const H5S_extent_t *ds_extent_src, const H5T_t *dt_src,
     const H5O_pline_t *pline_src, H5O_copy_t *cpy_info, hid_t dxpl_id);
-H5_DLL herr_t H5D__chunk_bh_info(H5F_t *f, hid_t dxpl_id, H5O_layout_t *layout,
-    const H5O_pline_t *pline, hsize_t *btree_size);
+H5_DLL herr_t H5D__chunk_bh_info(const H5O_loc_t *loc, hid_t dxpl_id, H5O_t *oh,
+    H5O_layout_t *layout, hsize_t *btree_size);
 H5_DLL herr_t H5D__chunk_dump_index(H5D_t *dset, hid_t dxpl_id, FILE *stream);
-H5_DLL herr_t H5D__chunk_dest(H5F_t *f, hid_t dxpl_id, H5D_t *dset);
 H5_DLL herr_t H5D__chunk_delete(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
     H5O_storage_t *store);
 H5_DLL herr_t H5D__chunk_direct_write(const H5D_t *dset, hid_t dxpl_id, uint32_t filters, 
@@ -640,12 +717,29 @@ H5_DLL herr_t H5D__chunk_direct_write(const H5D_t *dset, hid_t dxpl_id, uint32_t
 H5_DLL herr_t H5D__chunk_stats(const H5D_t *dset, hbool_t headers);
 #endif /* H5D_CHUNK_DEBUG */
 
+/* format convert */
+H5_DLL herr_t H5D__chunk_format_convert(H5D_t *dset, H5D_chk_idx_info_t *idx_info, H5D_chk_idx_info_t *new_idx_info);
+
 /* Functions that operate on compact dataset storage */
 H5_DLL herr_t H5D__compact_fill(const H5D_t *dset, hid_t dxpl_id);
 H5_DLL herr_t H5D__compact_copy(H5F_t *f_src, H5O_storage_compact_t *storage_src,
     H5F_t *f_dst, H5O_storage_compact_t *storage_dst, H5T_t *src_dtype,
     H5O_copy_t *cpy_info, hid_t dxpl_id);
 
+/* Functions that operate on virtual dataset storage */
+H5_DLL herr_t H5D__virtual_copy_layout(H5O_layout_t *layout);
+H5_DLL herr_t H5D__virtual_set_extent_unlim(const H5D_t *dset, hid_t dxpl_id);
+H5_DLL herr_t H5D__virtual_reset_layout(H5O_layout_t *layout);
+H5_DLL herr_t H5D__virtual_delete(H5F_t *f, hid_t dxpl_id, H5O_storage_t *storage);
+H5_DLL herr_t H5D__virtual_copy(H5F_t *f_src, H5O_layout_t *layout_dst,
+    hid_t dxpl_id);
+H5_DLL herr_t H5D__virtual_init(H5F_t *f, hid_t dxpl_id, const H5D_t *dset,
+    hid_t dapl_id);
+H5_DLL hbool_t H5D__virtual_is_space_alloc(const H5O_storage_t *storage);
+H5_DLL herr_t H5D__virtual_hold_source_dset_files(const H5D_t *dset, H5D_virtual_held_file_t **head);
+H5_DLL herr_t H5D__virtual_refresh_source_dsets(H5D_t *dset, hid_t dxpl_id);
+H5_DLL herr_t H5D__virtual_release_source_dset_files(H5D_virtual_held_file_t *head);
+
 /* Functions that operate on EFL (External File List)*/
 H5_DLL hbool_t H5D__efl_is_space_alloc(const H5O_storage_t *storage);
 H5_DLL herr_t H5D__efl_bh_info(H5F_t *f, hid_t dxpl_id, H5O_efl_t *efl,
@@ -709,6 +803,7 @@ H5_DLL htri_t H5D__mpio_opt_possible(const H5D_io_info_t *io_info,
 #ifdef H5D_TESTING
 H5_DLL herr_t H5D__layout_version_test(hid_t did, unsigned *version);
 H5_DLL herr_t H5D__layout_contig_size_test(hid_t did, hsize_t *size);
+H5_DLL herr_t H5D__layout_idx_type_test(hid_t did, H5D_chunk_index_t *idx_type);
 H5_DLL herr_t H5D__current_cache_size_test(hid_t did, size_t *nbytes_used, int *nused);
 #endif /* H5D_TESTING */
 
diff --git a/src/H5Dprivate.h b/src/H5Dprivate.h
index d8381e1..4c5f914 100644
--- a/src/H5Dprivate.h
+++ b/src/H5Dprivate.h
@@ -52,6 +52,9 @@
 #define H5D_ACS_DATA_CACHE_NUM_SLOTS_NAME   "rdcc_nslots"   /* Size of raw data chunk cache(slots) */
 #define H5D_ACS_DATA_CACHE_BYTE_SIZE_NAME   "rdcc_nbytes"   /* Size of raw data chunk cache(bytes) */
 #define H5D_ACS_PREEMPT_READ_CHUNKS_NAME    "rdcc_w0"       /* Preemption read chunks first */
+#define H5D_ACS_VDS_VIEW_NAME               "vds_view"      /* VDS view option */
+#define H5D_ACS_VDS_PRINTF_GAP_NAME         "vds_printf_gap" /* VDS printf gap size */
+#define H5D_ACS_APPEND_FLUSH_NAME    "append_flush"         /* Append flush actions */
 
 /* ======== Data transfer properties ======== */
 #define H5D_XFER_MAX_TEMP_BUF_NAME      "max_temp_buf"  /* Maximum temp buffer size */
@@ -66,7 +69,6 @@
 #define H5D_XFER_VFL_ID_NAME            "vfl_id"        /* File driver ID */
 #define H5D_XFER_VFL_INFO_NAME          "vfl_info"      /* File driver info */
 #define H5D_XFER_HYPER_VECTOR_SIZE_NAME "vec_size"      /* Hyperslab vector size */
-#ifdef H5_HAVE_PARALLEL
 #define H5D_XFER_IO_XFER_MODE_NAME      "io_xfer_mode"  /* I/O transfer mode */
 #define H5D_XFER_MPIO_COLLECTIVE_OPT_NAME "mpio_collective_opt" /* Optimization of MPI-IO transfer mode */
 #define H5D_XFER_MPIO_CHUNK_OPT_HARD_NAME "mpio_chunk_opt_hard"
@@ -76,7 +78,6 @@
 #define H5D_MPIO_ACTUAL_IO_MODE_NAME    "actual_io_mode"
 #define H5D_MPIO_LOCAL_NO_COLLECTIVE_CAUSE_NAME "local_no_collective_cause"  /* cause of broken collective I/O in each process */
 #define H5D_MPIO_GLOBAL_NO_COLLECTIVE_CAUSE_NAME "global_no_collective_cause"  /* cause of broken collective I/O in all processes */
-#endif /* H5_HAVE_PARALLEL */
 #define H5D_XFER_EDC_NAME               "err_detect"    /* EDC */
 #define H5D_XFER_FILTER_CB_NAME         "filter_cb"     /* Filter callback function */
 #define H5D_XFER_CONV_CB_NAME           "type_conv_cb"  /* Type conversion callback function */
@@ -108,6 +109,9 @@
 #define H5D_VLEN_FREE           NULL
 #define H5D_VLEN_FREE_INFO      NULL
 
+/* Default virtual dataset list size */
+#define H5D_VIRTUAL_DEF_LIST_SIZE 8
+
 
 /****************************/
 /* Library Private Typedefs */
@@ -145,8 +149,17 @@ typedef struct H5D_copy_file_ud_t {
     H5O_copy_file_ud_common_t common;   /* Shared information (must be first) */
     struct H5S_extent_t *src_space_extent;     /* Copy of dataspace extent for dataset */
     H5T_t *src_dtype;                   /* Copy of datatype for dataset */
+    H5O_layout_t *src_layout;           /* Copy of layout for dataset */
 } H5D_copy_file_ud_t;
 
+/* Structure for dataset append flush property (H5Pset_append_flush) */
+typedef struct H5D_append_flush_t {
+    unsigned ndims;			/* The # of dimensions for "boundary" */
+    hsize_t boundary[H5S_MAX_RANK];	/* The dimension sizes for determining boundary */
+    H5D_append_cb_t func;		/* The callback function */
+    void *udata;			/* User data */
+} H5D_append_flush_t;
+
 
 /*****************************/
 /* Library Private Variables */
@@ -160,6 +173,8 @@ typedef struct H5D_copy_file_ud_t {
 H5_DLL herr_t H5D_init(void);
 H5_DLL H5D_t *H5D_open(const H5G_loc_t *loc, hid_t dapl_id, hid_t dxpl_id);
 H5_DLL herr_t H5D_close(H5D_t *dataset);
+H5_DLL herr_t H5D_mult_refresh_close(hid_t dset_id, hid_t dxpl_id);
+H5_DLL herr_t H5D_mult_refresh_reopen(H5D_t *dataset, hid_t dxpl_id);
 H5_DLL H5O_loc_t *H5D_oloc(H5D_t *dataset);
 H5_DLL H5G_name_t *H5D_nameof(H5D_t *dataset);
 H5_DLL H5T_t *H5D_typeof(const H5D_t *dset);
@@ -176,9 +191,21 @@ H5_DLL herr_t H5D_vlen_reclaim(hid_t type_id, H5S_t *space, hid_t plist_id,
 /* Functions that operate on chunked storage */
 H5_DLL herr_t H5D_chunk_idx_reset(H5O_storage_chunk_t *storage, hbool_t reset_addr);
 
+/* Functions that operate on virtual storage */
+H5_DLL herr_t H5D_virtual_check_mapping_pre(const H5S_t *vspace,
+    const H5S_t *src_space, H5O_virtual_space_status_t space_status);
+H5_DLL herr_t H5D_virtual_check_mapping_post(
+    const H5O_storage_virtual_ent_t *ent);
+H5_DLL herr_t H5D_virtual_check_min_dims(const H5D_t *dset);
+H5_DLL herr_t H5D_virtual_update_min_dims(H5O_layout_t *layout, size_t idx);
+H5_DLL herr_t H5D_virtual_parse_source_name(const char *source_name,
+    H5O_storage_virtual_name_seg_t **parsed_name, size_t *static_strlen,
+    size_t *nsubs);
+H5_DLL herr_t H5D_virtual_free_parsed_name(H5O_storage_virtual_name_seg_t *name_seg);
+
 /* Functions that operate on indexed storage */
 H5_DLL herr_t H5D_btree_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream,
-				int indent, int fwidth, unsigned ndims);
+    int indent, int fwidth, unsigned ndims, const uint32_t *dim);
 
 #endif /* _H5Dprivate_H */
 
diff --git a/src/H5Dpublic.h b/src/H5Dpublic.h
index e7ae3ae..0bb232f 100644
--- a/src/H5Dpublic.h
+++ b/src/H5Dpublic.h
@@ -34,6 +34,9 @@
 #define H5D_CHUNK_CACHE_NBYTES_DEFAULT      ((size_t) -1)
 #define H5D_CHUNK_CACHE_W0_DEFAULT          (-1.0f)
 
+/* Bit flags for the H5Pset_chunk_opts() and H5Pget_chunk_opts() */
+#define H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS      (0x0002u)
+
 /* Property names for H5LTDdirect_chunk_write */   
 #define H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME	        "direct_chunk_flag"
 #define H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME	"direct_chunk_filters"
@@ -51,12 +54,19 @@ typedef enum H5D_layout_t {
     H5D_COMPACT		= 0,	/*raw data is very small		     */
     H5D_CONTIGUOUS	= 1,	/*the default				     */
     H5D_CHUNKED		= 2,	/*slow and fancy			     */
-    H5D_NLAYOUTS	= 3	/*this one must be last!		     */
+    H5D_VIRTUAL         = 3,    /*actual data is stored in other datasets     */
+    H5D_NLAYOUTS	= 4	/*this one must be last!		     */
 } H5D_layout_t;
 
 /* Types of chunk index data structures */
 typedef enum H5D_chunk_index_t {
-    H5D_CHUNK_BTREE	= 0	/* v1 B-tree index			     */
+    H5D_CHUNK_IDX_BTREE	= 0,	/* v1 B-tree index (default)                 */
+    H5D_CHUNK_IDX_SINGLE = 1,   /* Single Chunk index (cur dims[]=max dims[]=chunk dims[]; filtered & non-filtered) */
+    H5D_CHUNK_IDX_NONE = 2,     /* Implicit: No Index (H5D_ALLOC_TIME_EARLY, non-filtered, fixed dims) */
+    H5D_CHUNK_IDX_FARRAY = 3,	/* Fixed array (for 0 unlimited dims)	     */
+    H5D_CHUNK_IDX_EARRAY = 4,	/* Extensible array (for 1 unlimited dim)    */
+    H5D_CHUNK_IDX_BT2 = 5,   	/* v2 B-tree index (for >1 unlimited dims)   */
+    H5D_CHUNK_IDX_NTYPES	/*this one must be last!		     */
 } H5D_chunk_index_t;
 
 /* Values for the space allocation time property */
@@ -92,6 +102,16 @@ typedef enum H5D_fill_value_t {
     H5D_FILL_VALUE_USER_DEFINED =2
 } H5D_fill_value_t;
 
+/* Values for VDS bounds option */
+typedef enum H5D_vds_view_t {
+    H5D_VDS_ERROR               = -1,
+    H5D_VDS_FIRST_MISSING       = 0,
+    H5D_VDS_LAST_AVAILABLE      = 1
+} H5D_vds_view_t;
+
+/* Callback for H5Pset_append_flush() in a dataset access property list */
+typedef herr_t (*H5D_append_cb_t)(hid_t dataset_id, hsize_t *cur_dims, void *op_data);
+
 /********************/
 /* Public Variables */
 /********************/
@@ -140,12 +160,18 @@ H5_DLL herr_t H5Dvlen_get_buf_size(hid_t dataset_id, hid_t type_id, hid_t space_
 H5_DLL herr_t H5Dfill(const void *fill, hid_t fill_type, void *buf,
         hid_t buf_type, hid_t space);
 H5_DLL herr_t H5Dset_extent(hid_t dset_id, const hsize_t size[]);
+H5_DLL herr_t H5Dflush(hid_t dset_id);
+H5_DLL herr_t H5Drefresh(hid_t dset_id);
 H5_DLL herr_t H5Dscatter(H5D_scatter_func_t op, void *op_data, hid_t type_id,
     hid_t dst_space_id, void *dst_buf);
 H5_DLL herr_t H5Dgather(hid_t src_space_id, const void *src_buf, hid_t type_id,
     size_t dst_buf_size, void *dst_buf, H5D_gather_func_t op, void *op_data);
 H5_DLL herr_t H5Ddebug(hid_t dset_id);
 
+/* Internal API routines */
+H5_DLL herr_t H5Dformat_convert(hid_t dset_id);
+H5_DLL herr_t H5Dget_chunk_index_type(hid_t did, H5D_chunk_index_t *idx_type);
+
 /* Symbols defined for compatibility with previous versions of the HDF5 API.
  *
  * Use of these symbols is deprecated.
@@ -153,6 +179,7 @@ H5_DLL herr_t H5Ddebug(hid_t dset_id);
 #ifndef H5_NO_DEPRECATED_SYMBOLS
 
 /* Macros */
+#define H5D_CHUNK_BTREE H5D_CHUNK_IDX_BTREE
 
 
 /* Typedefs */
diff --git a/src/H5Dscatgath.c b/src/H5Dscatgath.c
index 4b0846f..9902b7b 100644
--- a/src/H5Dscatgath.c
+++ b/src/H5Dscatgath.c
@@ -17,7 +17,7 @@
 /* Module Setup */
 /****************/
 
-#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
 
 
 /***********/
diff --git a/src/H5Dselect.c b/src/H5Dselect.c
index 38f8bc4..ce6073c 100644
--- a/src/H5Dselect.c
+++ b/src/H5Dselect.c
@@ -23,7 +23,7 @@
 /* Module Setup */
 /****************/
 
-#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
 
 
 /***********/
diff --git a/src/H5Dsingle.c b/src/H5Dsingle.c
new file mode 100644
index 0000000..04b8971
--- /dev/null
+++ b/src/H5Dsingle.c
@@ -0,0 +1,557 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer: 	Vailin Choi <vchoi at hdfgroup.org>
+ *	       	May 2011; updated 10/2015
+ *
+ * Purpose:	Single Chunk I/O functions.  
+ *		This is used when the dataset has only 1 chunk (with or without filter):
+ *			cur_dims[] is equal to max_dims[] is equal to the chunk dims[]
+ *		non-filter chunk record: [address of the chunk]
+ *		filtered chunk record: 	[address of the chunk, chunk size, filter mask]
+ *
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dpkg.h"		/* Datasets				*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5MFprivate.h"	/* File space management		*/
+#include "H5VMprivate.h"         /* Vector functions			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Single Chunk Index chunking I/O ops */
+static herr_t H5D__single_idx_init(const H5D_chk_idx_info_t *idx_info,
+    const H5S_t *space, haddr_t dset_ohdr_addr);
+static herr_t H5D__single_idx_create(const H5D_chk_idx_info_t *idx_info);
+static hbool_t H5D__single_idx_is_space_alloc(const H5O_storage_chunk_t *storage);
+static herr_t H5D__single_idx_insert(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_ud_t *udata, const H5D_t *dset);
+static herr_t H5D__single_idx_get_addr(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_ud_t *udata);
+static int H5D__single_idx_iterate(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_cb_func_t chunk_cb, void *chunk_udata);
+static herr_t H5D__single_idx_remove(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_common_ud_t *udata);
+static herr_t H5D__single_idx_delete(const H5D_chk_idx_info_t *idx_info);
+static herr_t H5D__single_idx_copy_setup(const H5D_chk_idx_info_t *idx_info_src,
+    const H5D_chk_idx_info_t *idx_info_dst);
+static herr_t H5D__single_idx_size(const H5D_chk_idx_info_t *idx_info,
+    hsize_t *size);
+static herr_t H5D__single_idx_reset(H5O_storage_chunk_t *storage, hbool_t reset_addr);
+static herr_t H5D__single_idx_dump(const H5O_storage_chunk_t *storage, FILE *stream);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Non Index chunk I/O ops */
+const H5D_chunk_ops_t H5D_COPS_SINGLE[1] = {{
+    FALSE,                      	/* Single Chunk indexing doesn't current support SWMR access */
+    H5D__single_idx_init,		/* init */
+    H5D__single_idx_create,		/* create */
+    H5D__single_idx_is_space_alloc, 	/* is_space_alloc */
+    H5D__single_idx_insert,	        /* insert */
+    H5D__single_idx_get_addr,		/* get_addr */
+    NULL,				/* resize */
+    H5D__single_idx_iterate,		/* iterate */
+    H5D__single_idx_remove,		/* remove */
+    H5D__single_idx_delete,		/* delete */
+    H5D__single_idx_copy_setup,		/* copy_setup */
+    NULL,				/* copy_shutdown */
+    H5D__single_idx_size,		/* size */
+    H5D__single_idx_reset,		/* reset */
+    H5D__single_idx_dump,		/* dump */
+    NULL				/* destroy */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__single_idx_init
+ *
+ * Purpose:     Initialize the indexing information for a dataset.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi
+ *              July, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__single_idx_init(const H5D_chk_idx_info_t *idx_info,
+    const H5S_t H5_ATTR_UNUSED *space, haddr_t H5_ATTR_UNUSED dset_ohdr_addr)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+
+    if(idx_info->pline->nused)
+	idx_info->layout->flags |= H5O_LAYOUT_CHUNK_SINGLE_INDEX_WITH_FILTER;
+    else
+	idx_info->layout->flags = 0;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__single_idx_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__single_idx_create
+ *
+ * Purpose:	Set up Single Chunk Index: filtered or non-filtered
+ *		
+ * Return:	Non-negative on success 
+ *		Negative on failure.
+ *
+ * Programmer:	Vailin Choi; July 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__single_idx_create(const H5D_chk_idx_info_t *idx_info)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(idx_info->layout->max_nchunks == idx_info->layout->nchunks);
+    HDassert(idx_info->layout->nchunks == 1);
+    HDassert(!H5F_addr_defined(idx_info->storage->idx_addr));
+
+    if(idx_info->pline->nused)
+	HDassert(idx_info->layout->flags & H5O_LAYOUT_CHUNK_SINGLE_INDEX_WITH_FILTER);
+    else
+	HDassert(!(idx_info->layout->flags & H5O_LAYOUT_CHUNK_SINGLE_INDEX_WITH_FILTER));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__single_idx_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__single_idx_is_space_alloc
+ *
+ * Purpose:	Query if space is allocated for the single chunk
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; July 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static hbool_t
+H5D__single_idx_is_space_alloc(const H5O_storage_chunk_t *storage)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(storage);
+
+    FUNC_LEAVE_NOAPI((hbool_t)H5F_addr_defined(storage->idx_addr))
+} /* end H5D__single_idx_is_space_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__single_idx_insert
+ *
+ * Purpose:	Allocate space for the single chunk
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; July 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__single_idx_insert(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *udata,
+    const H5D_t *dset)
+{
+    herr_t	ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(idx_info->layout->nchunks == 1);
+    HDassert(idx_info->layout->max_nchunks == 1);
+    HDassert(udata);
+
+    /* Set the address for the chunk */
+    HDassert(H5F_addr_defined(udata->chunk_block.offset));
+    idx_info->storage->idx_addr = udata->chunk_block.offset;
+
+    if(idx_info->pline->nused > 0) {
+        H5_CHECKED_ASSIGN(idx_info->storage->u.single.nbytes, uint32_t, udata->chunk_block.length, hsize_t);
+	idx_info->storage->u.single.filter_mask = udata->filter_mask;
+    } /* end if */
+
+    if(dset) {
+	if(dset->shared->dcpl_cache.fill.alloc_time != H5D_ALLOC_TIME_EARLY || idx_info->pline->nused > 0) {
+	    /* Mark the layout dirty so that the address of the single chunk will be flushed later */
+	    if(H5D__mark(dset, idx_info->dxpl_id, H5D_MARK_LAYOUT) < 0)
+		HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to mark layout as dirty")
+	} /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__single_idx_insert() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__single_idx_get_addr
+ *
+ * Purpose:	Get the file address of a chunk.
+ *		Save the retrieved information in the udata supplied.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; July 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__single_idx_get_addr(const H5D_chk_idx_info_t *idx_info, H5D_chunk_ud_t *udata)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(idx_info->layout->nchunks == 1);
+    HDassert(idx_info->layout->max_nchunks == 1);
+    HDassert(udata);
+
+    udata->chunk_block.offset = idx_info->storage->idx_addr;
+    if(idx_info->layout->flags & H5O_LAYOUT_CHUNK_SINGLE_INDEX_WITH_FILTER) {
+	udata->chunk_block.length = idx_info->storage->u.single.nbytes;
+	udata->filter_mask = idx_info->storage->u.single.filter_mask;
+    } /* end if */
+    else {
+	udata->chunk_block.length = idx_info->layout->size;
+	udata->filter_mask = 0;
+    } /* end else */
+    if(!H5F_addr_defined(udata->chunk_block.offset))
+        udata->chunk_block.length = 0;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5D__single_idx_get_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__single_idx_iterate
+ *
+ * Purpose:	Make callback for the single chunk
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; July 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5D__single_idx_iterate(const H5D_chk_idx_info_t *idx_info,
+    H5D_chunk_cb_func_t chunk_cb, void *chunk_udata)
+{
+    H5D_chunk_rec_t chunk_rec;		/* generic chunk record  */
+    int ret_value = -1;    		/* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(chunk_cb);
+    HDassert(chunk_udata);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+
+    /* Initialize generic chunk record */
+    HDmemset(&chunk_rec, 0, sizeof(chunk_rec));
+    chunk_rec.chunk_addr = idx_info->storage->idx_addr;
+
+    if(idx_info->layout->flags & H5O_LAYOUT_CHUNK_SINGLE_INDEX_WITH_FILTER) {
+	chunk_rec.nbytes = idx_info->storage->u.single.nbytes;
+	chunk_rec.filter_mask = idx_info->storage->u.single.filter_mask;
+    } /* end if */
+    else {
+	chunk_rec.nbytes = idx_info->layout->size;
+	chunk_rec.filter_mask = 0;
+    } /* end else */
+
+    /* Make "generic chunk" callback */
+    if((ret_value = (*chunk_cb)(&chunk_rec, chunk_udata)) < 0)
+	HERROR(H5E_DATASET, H5E_CALLBACK, "failure in generic chunk iterator callback");
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__single_idx_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__single_idx_remove
+ *
+ * Purpose:	Remove the single chunk
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; July 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__single_idx_remove(const H5D_chk_idx_info_t *idx_info, H5D_chunk_common_ud_t H5_ATTR_UNUSED *udata)
+{
+    hsize_t nbytes;                 /* Size of all chunks */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+    HDassert(H5F_addr_defined(idx_info->storage->idx_addr));
+
+    if(idx_info->layout->flags & H5O_LAYOUT_CHUNK_SINGLE_INDEX_WITH_FILTER)
+	nbytes = idx_info->storage->u.single.nbytes;
+    else
+	nbytes = idx_info->layout->size;
+
+    if(H5MF_xfree(idx_info->f, H5FD_MEM_DRAW, idx_info->dxpl_id, idx_info->storage->idx_addr, nbytes) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, H5_ITER_ERROR, "unable to free dataset chunks")
+
+    idx_info->storage->idx_addr = HADDR_UNDEF;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5D__single_idx_remove() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__single_idx_delete
+ *
+ * Purpose:	Delete raw data storage for entire dataset (i.e. the only chunk)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi; Sept 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__single_idx_delete(const H5D_chk_idx_info_t *idx_info)
+{
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(idx_info);
+    HDassert(idx_info->f);
+    HDassert(idx_info->pline);
+    HDassert(idx_info->layout);
+    HDassert(idx_info->storage);
+
+    if(H5F_addr_defined(idx_info->storage->idx_addr))
+	ret_value = H5D__single_idx_remove(idx_info, NULL);
+    else
+	HDassert(!H5F_addr_defined(idx_info->storage->idx_addr));
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__single_idx_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__single_idx_copy_setup
+ *
+ * Purpose:	Set up any necessary information for copying the single chunk
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; Sept 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__single_idx_copy_setup(const H5D_chk_idx_info_t *idx_info_src,
+    const H5D_chk_idx_info_t *idx_info_dst)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check args */
+    HDassert(idx_info_src);
+    HDassert(idx_info_src->f);
+    HDassert(idx_info_src->pline);
+    HDassert(idx_info_src->layout);
+    HDassert(idx_info_src->storage);
+    HDassert(H5F_addr_defined(idx_info_src->storage->idx_addr));
+
+    HDassert(idx_info_dst);
+    HDassert(idx_info_dst->f);
+    HDassert(idx_info_dst->pline);
+    HDassert(idx_info_dst->layout);
+    HDassert(idx_info_dst->storage);
+
+    /* Set copied metadata tag */
+    H5_BEGIN_TAG(idx_info_dst->dxpl_id, H5AC__COPIED_TAG, FAIL);
+
+    /* Set up information at the destination file */
+    if(H5D__single_idx_create(idx_info_dst) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to initialize chunked storage")
+
+    /* Reset metadata tag */
+    H5_END_TAG(FAIL);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__single_idx_copy_setup() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__single_idx_size
+ *
+ * Purpose:     Retrieve the amount of index storage for the chunked dataset
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        negative
+ *
+ * Programmer:	Vailin Choi; Sept 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__single_idx_size(const H5D_chk_idx_info_t H5_ATTR_UNUSED *idx_info, hsize_t *index_size)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(index_size);
+
+    *index_size = 0;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__single_idx_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__single_idx_reset
+ *
+ * Purpose:	Reset indexing information.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; Sept 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__single_idx_reset(H5O_storage_chunk_t *storage, hbool_t reset_addr)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(storage);
+
+    /* Reset index info */
+    if(reset_addr)
+	storage->idx_addr = HADDR_UNDEF;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__single_idx_reset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5D__single_idx_dump
+ *
+ * Purpose:	Dump the address of the single chunk
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; September 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__single_idx_dump(const H5O_storage_chunk_t *storage, FILE *stream)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check args */
+    HDassert(storage);
+    HDassert(stream);
+
+    HDfprintf(stream, "    Address: %a\n", storage->idx_addr);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5D__single_idx_dump() */
+
diff --git a/src/H5Dtest.c b/src/H5Dtest.c
index eef3c91..c3b0b19 100644
--- a/src/H5Dtest.c
+++ b/src/H5Dtest.c
@@ -23,7 +23,7 @@
 /* Module Setup */
 /****************/
 
-#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
 #define H5D_TESTING		/*suppress warning about H5D testing funcs*/
 
 
@@ -144,6 +144,47 @@ done:
 

 /*--------------------------------------------------------------------------
  NAME
+    H5D__layout_idx_type_test
+ PURPOSE
+    Determine the storage layout index type for a dataset's layout information
+ USAGE
+    herr_t H5D__layout_idx_type_test(did, idx_type)
+        hid_t did;              IN: Dataset to query
+        H5D_chunk_index_t *idx_type;      OUT: Pointer to location to place index type info
+ RETURNS
+    Non-negative on success, negative on failure
+ DESCRIPTION
+    Checks the index type of the storage layout information for a dataset.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5D__layout_idx_type_test(hid_t did, H5D_chunk_index_t *idx_type)
+{
+    H5D_t	*dset;          /* Pointer to dataset to query */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check args */
+    if(NULL == (dset = (H5D_t *)H5I_object_verify(did, H5I_DATASET)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset")
+    if(dset->shared->layout.type != H5D_CHUNKED)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dataset is not chunked")
+
+    if(idx_type)
+        *idx_type = dset->shared->layout.u.chunk.idx_type;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5D__layout_idx_type_test() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
     H5D__current_cache_size_test
  PURPOSE
     Determine current the size of the dataset's chunk cache
diff --git a/src/H5Dvirtual.c b/src/H5Dvirtual.c
new file mode 100644
index 0000000..93fc61c
--- /dev/null
+++ b/src/H5Dvirtual.c
@@ -0,0 +1,2946 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Neil Fortner <nfortne2 at hdfgroup.org>
+ *              Wednesday, January 28, 2015
+ *
+ * Purpose:
+ *      Virtual Dataset (VDS) functions.  Creates a layout type which allows
+ *      definition of a virtual dataset, where the actual dataset is stored in
+ *      other datasets (called source datasets).  The mappings between the
+ *      virtual and source datasets are specified by hyperslab or "all"
+ *      dataspace selections.  Point selections are not currently supported.
+ *      Overlaps in the mappings in the virtual dataset result in undefined
+ *      behaviour.
+ *
+ *      Mapping selections may be unlimited, in which case the size of the
+ *      virtual dataset is determined by the size of the source dataset(s).
+ *      Names for the source datasets may also be generated procedurally, in
+ *      which case the virtual selection should be unlimited with an unlimited
+ *      count and the source selection should be limited with a size equal to
+ *      that of the virtual selection with the unlimited count set to 1.
+ *
+ *      Source datasets are opened lazily (only when needed for I/O or to
+ *      determine the size of the virtual dataset), and are currently held open
+ *      until the virtual dataset is closed.
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#include "H5Dmodule.h"          /* This source code file is part of the H5D module */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"          /* Generic Functions                    */
+#include "H5Dpkg.h"             /* Dataset functions                    */
+#include "H5Eprivate.h"         /* Error handling                       */
+#include "H5Fprivate.h"         /* Files                                */
+#include "H5FLprivate.h"        /* Free Lists                           */
+#include "H5Gprivate.h"         /* Groups                               */
+#include "H5HGprivate.h"        /* Global Heaps                         */
+#include "H5Iprivate.h"         /* IDs                                  */
+#include "H5MMprivate.h"        /* Memory management                    */
+#include "H5Oprivate.h"         /* Object headers                       */
+#include "H5Sprivate.h"         /* Dataspaces                           */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Default size for sub_dset array */
+#define H5D_VIRTUAL_DEF_SUB_DSET_SIZE 128
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Layout operation callbacks */
+static herr_t H5D__virtual_read(H5D_io_info_t *io_info, const H5D_type_info_t
+    *type_info, hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space,
+    H5D_chunk_map_t *fm);
+static herr_t H5D__virtual_write(H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info, hsize_t nelmts, const H5S_t *file_space,
+    const H5S_t *mem_space, H5D_chunk_map_t *fm);
+static herr_t H5D__virtual_flush(H5D_t *dset, hid_t dxpl_id);
+
+/* Other functions */
+static herr_t H5D__virtual_open_source_dset(const H5D_t *vdset,
+    H5O_storage_virtual_ent_t *virtual_ent,
+    H5O_storage_virtual_srcdset_t *source_dset, hid_t dxpl_id);
+static herr_t H5D__virtual_reset_source_dset(
+    H5O_storage_virtual_ent_t *virtual_ent,
+    H5O_storage_virtual_srcdset_t *source_dset);
+static herr_t H5D__virtual_str_append(const char *src, size_t src_len, char **p,
+    char **buf, size_t *buf_size);
+static herr_t H5D__virtual_copy_parsed_name(
+    H5O_storage_virtual_name_seg_t **dst, H5O_storage_virtual_name_seg_t *src);
+static herr_t H5D__virtual_build_source_name(char *source_name,
+    const H5O_storage_virtual_name_seg_t *parsed_name, size_t static_strlen,
+    size_t nsubs, hsize_t blockno, char **built_name);
+static herr_t H5D__virtual_init_all(const H5D_t *dset, hid_t dxpl_id);
+static herr_t H5D__virtual_pre_io(H5D_io_info_t *io_info,
+    H5O_storage_virtual_t *storage, const H5S_t *file_space,
+    const H5S_t *mem_space, hsize_t *tot_nelmts);
+static herr_t H5D__virtual_post_io(H5O_storage_virtual_t *storage);
+static herr_t H5D__virtual_read_one(H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info, const H5S_t *file_space,
+    H5O_storage_virtual_srcdset_t *source_dset);
+static herr_t H5D__virtual_write_one(H5D_io_info_t *io_info,
+    const H5D_type_info_t *type_info, const H5S_t *file_space,
+    H5O_storage_virtual_srcdset_t *source_dset);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Contiguous storage layout I/O ops */
+const H5D_layout_ops_t H5D_LOPS_VIRTUAL[1] = {{
+    NULL,
+    H5D__virtual_init,
+    H5D__virtual_is_space_alloc,
+    NULL,
+    H5D__virtual_read,
+    H5D__virtual_write,
+#ifdef H5_HAVE_PARALLEL
+    NULL,
+    NULL,
+#endif /* H5_HAVE_PARALLEL */
+    NULL,
+    NULL,
+    H5D__virtual_flush,
+    NULL,
+    NULL
+}};
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5O_storage_virtual_name_seg_t struct */
+H5FL_DEFINE(H5O_storage_virtual_name_seg_t);
+
+/* Declare a static free list to manage H5D_virtual_file_list_t structs */
+H5FL_DEFINE_STATIC(H5D_virtual_held_file_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D_virtual_check_mapping_pre
+ *
+ * Purpose:     Checks that the provided virtual and source selections are
+ *              legal for use as a VDS mapping, prior to creating the rest
+ *              of the mapping entry.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              August 12, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D_virtual_check_mapping_pre(const H5S_t *vspace, const H5S_t *src_space,
+    H5O_virtual_space_status_t space_status)
+{
+    H5S_sel_type    select_type; /* Selection type */
+    hsize_t         nelmts_vs;  /* Number of elements in virtual selection */
+    hsize_t         nelmts_ss;  /* Number of elements in source selection */
+    herr_t          ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check for point selections (currently unsupported) */
+    if(H5S_SEL_ERROR == (select_type = H5S_GET_SELECT_TYPE(vspace)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get selection type")
+    if(select_type == H5S_SEL_POINTS)
+        HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "point selections not currently supported with virtual datasets")
+    if(H5S_SEL_ERROR == (select_type = H5S_GET_SELECT_TYPE(src_space)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get selection type")
+    if(select_type == H5S_SEL_POINTS)
+        HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "point selections not currently supported with virtual datasets")
+
+    /* Get number of elements in spaces */
+    nelmts_vs = (hsize_t)H5S_GET_SELECT_NPOINTS(vspace);
+    nelmts_ss = (hsize_t)H5S_GET_SELECT_NPOINTS(src_space);
+
+    /* Check for unlimited vspace */
+    if(nelmts_vs == H5S_UNLIMITED) {
+        /* Check for unlimited src_space */
+        if(nelmts_ss == H5S_UNLIMITED) {
+            hsize_t nenu_vs;    /* Number of elements in the non-unlimited dimensions of vspace */
+            hsize_t nenu_ss;    /* Number of elements in the non-unlimited dimensions of src_space */
+
+            /* Non-printf unlimited selection.  Make sure both selections have
+             * the same number of elements in the non-unlimited dimension.  Note
+             * we can always check this even if the space status is invalid
+             * because unlimited selections are never dependent on the extent.
+             */
+            if(H5S_get_select_num_elem_non_unlim(vspace, &nenu_vs) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTCOUNT, FAIL, "can't get number of elements in non-unlimited dimension")
+            if(H5S_get_select_num_elem_non_unlim(src_space, &nenu_ss) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTCOUNT, FAIL, "can't get number of elements in non-unlimited dimension")
+            if(nenu_vs != nenu_ss)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "numbers of elemnts in the non-unlimited dimensions is different for source and virtual spaces")
+        } /* end if */
+        /* We will handle the printf case after parsing the source names */
+    } /* end if */
+    else if(space_status != H5O_VIRTUAL_STATUS_INVALID)
+        /* Limited selections.  Check number of points is the same. */
+        if(nelmts_vs != nelmts_ss)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "virtual and source space selections have different numbers of elements")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D_virtual_check_mapping_pre() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D_virtual_check_mapping_post
+ *
+ * Purpose:     Checks that the provided virtual dataset mapping entry is
+ *              legal, after the mapping is otherwise complete.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              August 12, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D_virtual_check_mapping_post(const H5O_storage_virtual_ent_t *ent)
+{
+    hsize_t         nelmts_vs;  /* Number of elements in virtual selection */
+    hsize_t         nelmts_ss;  /* Number of elements in source selection */
+    H5S_t           *tmp_space = NULL; /* Temporary dataspace */
+    herr_t          ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get number of elements in spaces */
+    nelmts_vs = (hsize_t)H5S_GET_SELECT_NPOINTS(ent->source_dset.virtual_select);
+    nelmts_ss = (hsize_t)H5S_GET_SELECT_NPOINTS(ent->source_select);
+
+    /* Check for printf selection */
+    if((nelmts_vs == H5S_UNLIMITED) && (nelmts_ss != H5S_UNLIMITED)) {
+        /* Make sure there at least one %b substitution in the source file or
+         * dataset name */
+        if((ent->psfn_nsubs == 0) && (ent->psdn_nsubs == 0))
+            HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "unlimited virtual selection, limited source selection, and no printf specifiers in source names")
+
+        /* Make sure virtual space uses hyperslab selection */
+        if(H5S_GET_SELECT_TYPE(ent->source_dset.virtual_select) != H5S_SEL_HYPERSLABS)
+            HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "virtual selection with printf mapping must be hyperslab")
+
+        /* Check that the number of elements in one block in the virtual
+         * selection matches the total number of elements in the source
+         * selection, if the source space status is not invalid (virtual space
+         * status does not matter here because it is unlimited) */
+        if(ent->source_space_status != H5O_VIRTUAL_STATUS_INVALID) {
+            /* Get first block in virtual selection */
+            if(NULL == (tmp_space = H5S_hyper_get_unlim_block(ent->source_dset.virtual_select, (hsize_t)0)))
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get first block in virtual selection")
+
+            /* Check number of points */
+            nelmts_vs = (hsize_t)H5S_GET_SELECT_NPOINTS(tmp_space);
+            if(nelmts_vs != nelmts_ss)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "virtual (single block) and source space selections have different numbers of elements")
+        } /* end if */
+    } /* end if */
+    else
+        /* Make sure there are no printf substitutions */
+        if((ent->psfn_nsubs > 0) || (ent->psdn_nsubs > 0))
+            HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "printf specifier(s) in source name(s) without an unlimited virtual selection and limited source selection")
+
+done:
+    /* Free temporary space */
+    if(tmp_space)
+        if(H5S_close(tmp_space) < 0)
+            HDONE_ERROR(H5E_PLIST, H5E_CLOSEERROR, FAIL, "can't close dataspace")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D_virtual_check_mapping_post() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D_virtual_update_min_dims
+ *
+ * Purpose:     Updates the virtual layout's "min_dims" field to take into
+ *              account the "idx"th entry in the mapping list.  The entry
+ *              must be complete, though top level field list_nused (and
+ *              of course min_dims) does not need to take it into account.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              February 10, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D_virtual_update_min_dims(H5O_layout_t *layout, size_t idx)
+{
+    H5S_sel_type    sel_type;
+    int             rank;
+    hsize_t         bounds_start[H5S_MAX_RANK];
+    hsize_t         bounds_end[H5S_MAX_RANK];
+    int             i;
+    herr_t          ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(layout);
+    HDassert(layout->type == H5D_VIRTUAL);
+    HDassert(idx < layout->storage.u.virt.list_nalloc);
+
+    /* Get type of selection */
+    if(H5S_SEL_ERROR == (sel_type = H5S_GET_SELECT_TYPE(layout->storage.u.virt.list[idx].source_dset.virtual_select)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get selection type")
+
+    /* Do not update min_dims for "all" or "none" selections */
+    if((sel_type == H5S_SEL_ALL) || (sel_type == H5S_SEL_NONE))
+        HGOTO_DONE(SUCCEED)
+
+    /* Get rank of vspace */
+    if((rank = H5S_GET_EXTENT_NDIMS(layout->storage.u.virt.list[idx].source_dset.virtual_select)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get number of dimensions")
+
+    /* Get selection bounds */
+    if(H5S_SELECT_BOUNDS(layout->storage.u.virt.list[idx].source_dset.virtual_select, bounds_start, bounds_end) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get selection bounds")
+
+    /* Update min_dims */
+    for(i = 0; i < rank; i++)
+        /* Don't check unlimited dimensions in the selection */
+        if((i != layout->storage.u.virt.list[idx].unlim_dim_virtual)
+                && (bounds_end[i] >= layout->storage.u.virt.min_dims[i]))
+            layout->storage.u.virt.min_dims[i] = bounds_end[i] + (hsize_t)1;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D_virtual_update_min_dims() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D_virtual_check_min_dims
+ *
+ * Purpose:     Checks if the dataset's dimensions are at least the
+ *              calculated minimum dimensions from the mappings.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              August 13, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D_virtual_check_min_dims(const H5D_t *dset)
+{
+    int             rank;
+    hsize_t         dims[H5S_MAX_RANK];
+    int             i;
+    herr_t          ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(dset);
+    HDassert(dset->shared);
+    HDassert(dset->shared->layout.type == H5D_VIRTUAL);
+
+    /* Get rank of dataspace */
+    if((rank = H5S_GET_EXTENT_NDIMS(dset->shared->space)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get number of dimensions")
+
+    /* Get VDS dimensions */
+    if(H5S_get_simple_extent_dims(dset->shared->space, dims, NULL) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get VDS dimensions")
+
+    /* Verify that dimensions are larger than min_dims */
+    for(i = 0; i < rank; i++)
+        if(dims[i] < dset->shared->layout.storage.u.virt.min_dims[i])
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "virtual dataset dimensions not large enough to contain all limited dimensions in all selections")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D_virtual_check_min_dims() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_copy_layout
+ *
+ * Purpose:     Deep copies virtual storage layout message in memory.
+ *              This function assumes that the top-level struct has
+ *              already been copied (so the source struct retains
+ *              ownership of the fields passed to this function).
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              February 10, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__virtual_copy_layout(H5O_layout_t *layout)
+{
+    H5O_storage_virtual_ent_t *orig_list = NULL;
+    hid_t           orig_source_fapl;
+    hid_t           orig_source_dapl;
+    H5P_genplist_t *plist;
+    size_t          i;
+    herr_t          ret_value = SUCCEED;
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(layout);
+    HDassert(layout->type == H5D_VIRTUAL);
+
+    /* Save original entry list and top-level property lists and reset in layout
+     * so the originals aren't closed on error */
+    orig_source_fapl = layout->storage.u.virt.source_fapl;
+    layout->storage.u.virt.source_fapl = -1;
+    orig_source_dapl = layout->storage.u.virt.source_dapl;
+    layout->storage.u.virt.source_dapl = -1;
+    orig_list = layout->storage.u.virt.list;
+    layout->storage.u.virt.list = NULL;
+
+    /* Copy entry list */
+    if(layout->storage.u.virt.list_nused > 0) {
+        HDassert(orig_list);
+
+        /* Allocate memory for the list */
+        if(NULL == (layout->storage.u.virt.list = (H5O_storage_virtual_ent_t *)H5MM_calloc(layout->storage.u.virt.list_nused * sizeof(H5O_storage_virtual_ent_t))))
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "unable to allocate memory for virtual dataset entry list")
+        layout->storage.u.virt.list_nalloc = layout->storage.u.virt.list_nused;
+
+        /* Copy the list entries, though set source_dset.dset and sub_dset to
+         * NULL */
+        for(i = 0; i < layout->storage.u.virt.list_nused; i++) {
+            /* Copy virtual selection */
+            if(NULL == (layout->storage.u.virt.list[i].source_dset.virtual_select
+                    = H5S_copy(orig_list[i].source_dset.virtual_select, FALSE, TRUE)))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to copy virtual selection")
+
+            /* Copy original source names */
+            if(NULL == (layout->storage.u.virt.list[i].source_file_name
+                    = HDstrdup(orig_list[i].source_file_name)))
+                HGOTO_ERROR(H5E_DATASET, H5E_RESOURCE, FAIL, "unable to duplicate source file name")
+            if(NULL == (layout->storage.u.virt.list[i].source_dset_name
+                    = HDstrdup(orig_list[i].source_dset_name)))
+                HGOTO_ERROR(H5E_DATASET, H5E_RESOURCE, FAIL, "unable to duplicate source dataset name")
+
+            /* Copy source selection */
+            if(NULL == (layout->storage.u.virt.list[i].source_select
+                    = H5S_copy(orig_list[i].source_select, FALSE, TRUE)))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to copy source selection")
+
+            /* Initialize clipped selections */
+            if(orig_list[i].unlim_dim_virtual < 0) {
+                layout->storage.u.virt.list[i].source_dset.clipped_source_select = layout->storage.u.virt.list[i].source_select;
+                layout->storage.u.virt.list[i].source_dset.clipped_virtual_select = layout->storage.u.virt.list[i].source_dset.virtual_select;
+            } /* end if */
+
+            /* Copy parsed names */
+            if(H5D__virtual_copy_parsed_name(&layout->storage.u.virt.list[i].parsed_source_file_name, orig_list[i].parsed_source_file_name) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to copy parsed source file name")
+            layout->storage.u.virt.list[i].psfn_static_strlen = orig_list[i].psfn_static_strlen;
+            layout->storage.u.virt.list[i].psfn_nsubs = orig_list[i].psfn_nsubs;
+            if(H5D__virtual_copy_parsed_name(&layout->storage.u.virt.list[i].parsed_source_dset_name, orig_list[i].parsed_source_dset_name) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to copy parsed source dataset name")
+            layout->storage.u.virt.list[i].psdn_static_strlen = orig_list[i].psdn_static_strlen;
+            layout->storage.u.virt.list[i].psdn_nsubs = orig_list[i].psdn_nsubs;
+
+            /* Copy source names in source dset or add reference as appropriate
+             */
+            if(orig_list[i].source_dset.file_name) {
+                if(orig_list[i].source_dset.file_name
+                        == orig_list[i].source_file_name)
+                    layout->storage.u.virt.list[i].source_dset.file_name = layout->storage.u.virt.list[i].source_file_name;
+                else if(orig_list[i].parsed_source_file_name
+                        && (orig_list[i].source_dset.file_name
+                        != orig_list[i].parsed_source_file_name->name_segment)) {
+                    HDassert(layout->storage.u.virt.list[i].parsed_source_file_name);
+                    HDassert(layout->storage.u.virt.list[i].parsed_source_file_name->name_segment);
+                    layout->storage.u.virt.list[i].source_dset.file_name = layout->storage.u.virt.list[i].parsed_source_file_name->name_segment;
+                } /* end if */
+                else
+                    if(NULL == (layout->storage.u.virt.list[i].source_dset.file_name
+                            = HDstrdup(orig_list[i].source_dset.file_name)))
+                        HGOTO_ERROR(H5E_DATASET, H5E_RESOURCE, FAIL, "unable to duplicate source file name")
+            } /* end if */
+            if(orig_list[i].source_dset.dset_name) {
+                if(orig_list[i].source_dset.dset_name
+                        == orig_list[i].source_dset_name)
+                    layout->storage.u.virt.list[i].source_dset.dset_name = layout->storage.u.virt.list[i].source_dset_name;
+                else if(orig_list[i].parsed_source_dset_name
+                        && (orig_list[i].source_dset.dset_name
+                        != orig_list[i].parsed_source_dset_name->name_segment)) {
+                    HDassert(layout->storage.u.virt.list[i].parsed_source_dset_name);
+                    HDassert(layout->storage.u.virt.list[i].parsed_source_dset_name->name_segment);
+                    layout->storage.u.virt.list[i].source_dset.dset_name = layout->storage.u.virt.list[i].parsed_source_dset_name->name_segment;
+                } /* end if */
+                else
+                    if(NULL == (layout->storage.u.virt.list[i].source_dset.dset_name
+                            = HDstrdup(orig_list[i].source_dset.dset_name)))
+                        HGOTO_ERROR(H5E_DATASET, H5E_RESOURCE, FAIL, "unable to duplicate source dataset name")
+            } /* end if */
+
+            /* Copy other fields in entry */
+            layout->storage.u.virt.list[i].unlim_dim_source = orig_list[i].unlim_dim_source;
+            layout->storage.u.virt.list[i].unlim_dim_virtual = orig_list[i].unlim_dim_virtual;
+            layout->storage.u.virt.list[i].unlim_extent_source = orig_list[i].unlim_extent_source;
+            layout->storage.u.virt.list[i].unlim_extent_virtual = orig_list[i].unlim_extent_virtual;
+            layout->storage.u.virt.list[i].clip_size_source = orig_list[i].clip_size_source;
+            layout->storage.u.virt.list[i].clip_size_virtual = orig_list[i].clip_size_virtual;
+            layout->storage.u.virt.list[i].source_space_status = orig_list[i].source_space_status;
+            layout->storage.u.virt.list[i].virtual_space_status = orig_list[i].virtual_space_status;
+        } /* end for */
+    } /* end if */
+    else {
+        /* Zero out other fields related to list, just to be sure */
+        layout->storage.u.virt.list = NULL;
+        layout->storage.u.virt.list_nalloc = 0;
+    } /* end else */
+
+    /* Copy property lists */
+    if(orig_source_fapl >= 0) {
+        if(NULL == (plist = (H5P_genplist_t *)H5I_object_verify(orig_source_fapl, H5I_GENPROP_LST)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+        if((layout->storage.u.virt.source_fapl = H5P_copy_plist(plist, FALSE)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "can't copy fapl")
+    } /* end if */
+    if(orig_source_dapl >= 0) {
+        if(NULL == (plist = (H5P_genplist_t *)H5I_object_verify(orig_source_dapl, H5I_GENPROP_LST)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+        if((layout->storage.u.virt.source_dapl = H5P_copy_plist(plist, FALSE)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "can't copy dapl")
+    } /* end if */
+
+    /* New layout is not fully initialized */
+    layout->storage.u.virt.init = FALSE;
+
+done:
+    /* Release allocated resources on failure */
+    if(ret_value < 0)
+        if(H5D__virtual_reset_layout(layout) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to reset virtual layout")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_copy_layout() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_reset_layout
+ *
+ * Purpose:     Frees internal structures in a virtual storage layout
+ *              message in memory.  This function is safe to use on
+ *              incomplete structures (for recovery from failure) provided
+ *              the internal structures are initialized with all bytes set
+ *              to 0.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              February 11, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__virtual_reset_layout(H5O_layout_t *layout)
+{
+    size_t          i, j;
+    herr_t          ret_value = SUCCEED;
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(layout);
+    HDassert(layout->type == H5D_VIRTUAL);
+
+    /* Free the list entries.  Note we always attempt to free everything even in
+     * the case of a failure.  Because of this, and because we free the list
+     * afterwards, we do not need to zero out the memory in the list. */
+    for(i = 0; i < layout->storage.u.virt.list_nused; i++) {
+        /* Free source_dset */
+        if(H5D__virtual_reset_source_dset(&layout->storage.u.virt.list[i], &layout->storage.u.virt.list[i].source_dset) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to reset source dataset")
+
+        /* Free original source names */
+        (void)H5MM_xfree(layout->storage.u.virt.list[i].source_file_name);
+        (void)H5MM_xfree(layout->storage.u.virt.list[i].source_dset_name);
+
+        /* Free sub_dset */
+        for(j = 0; j < layout->storage.u.virt.list[i].sub_dset_nalloc; j++)
+            if(H5D__virtual_reset_source_dset(&layout->storage.u.virt.list[i], &layout->storage.u.virt.list[i].sub_dset[j]) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "unable to reset source dataset")
+        layout->storage.u.virt.list[i].sub_dset = (H5O_storage_virtual_srcdset_t *)H5MM_xfree(layout->storage.u.virt.list[i].sub_dset);
+
+        /* Free source_select */
+        if(layout->storage.u.virt.list[i].source_select)
+            if(H5S_close(layout->storage.u.virt.list[i].source_select) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release source selection")
+
+        /* Free parsed_source_file_name */
+        H5D_virtual_free_parsed_name(layout->storage.u.virt.list[i].parsed_source_file_name);
+
+        /* Free parsed_source_dset_name */
+        H5D_virtual_free_parsed_name(layout->storage.u.virt.list[i].parsed_source_dset_name);
+    } /* end for */
+
+    /* Free the list */
+    layout->storage.u.virt.list = (H5O_storage_virtual_ent_t *)H5MM_xfree(layout->storage.u.virt.list);
+    layout->storage.u.virt.list_nalloc = (size_t)0;
+    layout->storage.u.virt.list_nused = (size_t)0;
+    (void)HDmemset(layout->storage.u.virt.min_dims, 0, sizeof(layout->storage.u.virt.min_dims));
+
+    /* Close access property lists */
+    if(layout->storage.u.virt.source_fapl >= 0) {
+        if(H5I_dec_ref(layout->storage.u.virt.source_fapl) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "can't close source fapl")
+        layout->storage.u.virt.source_fapl = -1;
+    } /* end if */
+    if(layout->storage.u.virt.source_dapl >= 0) {
+        if(H5I_dec_ref(layout->storage.u.virt.source_dapl) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "can't close source dapl")
+        layout->storage.u.virt.source_dapl = -1;
+    } /* end if */
+
+    /* The list is no longer initialized */
+    layout->storage.u.virt.init = FALSE;
+
+    /* Note the lack of a done: label.  This is because there are no HGOTO_ERROR
+     * calls.  If one is added, a done: label must also be added */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_reset_layout() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_copy
+ *
+ * Purpose:     Copy virtual storage raw data from SRC file to DST file.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              February 6, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__virtual_copy(H5F_t H5_ATTR_UNUSED *f_dst, H5O_layout_t *layout_dst,
+    hid_t H5_ATTR_UNUSED dxpl_id)
+{
+    herr_t          ret_value = SUCCEED;
+
+#ifdef NOT_YET
+    FUNC_ENTER_PACKAGE
+#endif /* NOT_YET */
+    FUNC_ENTER_PACKAGE_NOERR
+
+#ifdef NOT_YET
+    /* Check for copy to the same file */
+    if(f_dst == f_src) {
+        /* Increase reference count on global heap object */
+        if((heap_rc = H5HG_link(f_dst, dxpl_id, (H5HG_t *)&(layout_dst->u.virt.serial_list_hobjid), 1)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTMODIFY, FAIL, "unable to adjust global heap refence count")
+    } /* end if */
+    else
+#endif /* NOT_YET */
+    {
+        /* Reset global heap id so a new heap object is created when the message
+         * is flushed */
+        layout_dst->storage.u.virt.serial_list_hobjid.addr = HADDR_UNDEF;
+        layout_dst->storage.u.virt.serial_list_hobjid.idx = (size_t)0;
+    } /* end block/else */
+
+#ifdef NOT_YET
+done:
+#endif /* NOT_YET */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_delete
+ *
+ * Purpose:     Delete the file space for a virtual dataset
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              February 6, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__virtual_delete(H5F_t *f, hid_t dxpl_id, H5O_storage_t *storage)
+{
+#ifdef NOT_YET
+    int heap_rc;                /* Reference count of global heap object */
+#endif  /* NOT_YET */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* check args */
+    HDassert(f);
+    HDassert(storage);
+    HDassert(storage->type == H5D_VIRTUAL);
+
+    /* Check for global heap block */
+    if(storage->u.virt.serial_list_hobjid.addr != HADDR_UNDEF) {
+#ifdef NOT_YET
+        /* Unlink the global heap block */
+        if((heap_rc = H5HG_link(f, dxpl_id, (H5HG_t *)&(storage->u.virt.serial_list_hobjid), -1)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTMODIFY, FAIL, "unable to adjust global heap refence count")
+        if(heap_rc == 0)
+#endif /* NOT_YET */
+            /* Delete the global heap block */
+            if(H5HG_remove(f, dxpl_id, (H5HG_t *)&(storage->u.virt.serial_list_hobjid)) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTREMOVE, FAIL, "unable to remove heap object")
+    } /* end if */
+
+    /* Clear global heap ID in storage */
+    storage->u.virt.serial_list_hobjid.addr = HADDR_UNDEF;
+    storage->u.virt.serial_list_hobjid.idx = 0;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_delete */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_open_source_dset
+ *
+ * Purpose:     Attempts to open a source dataset.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              March 6, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__virtual_open_source_dset(const H5D_t *vdset,
+    H5O_storage_virtual_ent_t *virtual_ent,
+    H5O_storage_virtual_srcdset_t *source_dset, hid_t dxpl_id)
+{
+    H5F_t       *src_file = NULL;       /* Source file */
+    hbool_t     src_file_open = FALSE;  /* Whether we have opened and need to close src_file */
+    H5G_loc_t   src_root_loc;           /* Object location of source file root group */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(vdset);
+    HDassert(source_dset);
+    HDassert(!source_dset->dset);
+    HDassert(source_dset->file_name);
+    HDassert(source_dset->dset_name);
+
+    /* Check if we need to open the source file */
+    if(HDstrcmp(source_dset->file_name, ".")) {
+        /* Open the source file */
+        if(NULL == (src_file = H5F_open(source_dset->file_name, H5F_INTENT(vdset->oloc.file) & (H5F_ACC_RDWR | H5F_ACC_SWMR_WRITE | H5F_ACC_SWMR_READ), H5P_FILE_CREATE_DEFAULT, vdset->shared->layout.storage.u.virt.source_fapl, dxpl_id)))
+            H5E_clear_stack(NULL); /* Quick hack until proper support for H5Fopen with missing file is implemented */
+        else
+            src_file_open = TRUE;
+    } /* end if */
+    else
+        /* Source file is ".", use the virtual dataset's file */
+        src_file = vdset->oloc.file;
+
+    if(src_file) {
+        /* Set up the root group in the destination file */
+        if(NULL == (src_root_loc.oloc = H5G_oloc(H5G_rootof(src_file))))
+            HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "unable to get object location for root group")
+        if(NULL == (src_root_loc.path = H5G_nameof(H5G_rootof(src_file))))
+            HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "unable to get path for root group")
+
+        /* Open the source dataset */
+        if(NULL == (source_dset->dset = H5D__open_name(&src_root_loc, source_dset->dset_name, vdset->shared->layout.storage.u.virt.source_dapl, dxpl_id))) {
+            H5E_clear_stack(NULL); /* Quick hack until proper support for H5Dopen with missing file is implemented */
+
+            /* Dataset does not exist */
+            source_dset->dset_exists = FALSE;
+        } /* end if */
+        else {
+            /* Dataset exists */
+            source_dset->dset_exists = TRUE;
+
+            /* Patch the source selection if necessary */
+            if(virtual_ent->source_space_status != H5O_VIRTUAL_STATUS_CORRECT) {
+                if(H5S_extent_copy(virtual_ent->source_select, source_dset->dset->shared->space) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "can't copy source dataspace extent")
+                virtual_ent->source_space_status = H5O_VIRTUAL_STATUS_CORRECT;
+            } /* end if */
+        } /* end else */
+    } /* end if */
+
+done:
+    /* Close source file */
+    if(src_file_open)
+        if(H5F_try_close(src_file) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CANTCLOSEFILE, FAIL, "can't close source file")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_open_source_dset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_reset_source_dset
+ *
+ * Purpose:     Frees space referenced by a source dataset struct.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              May 20, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__virtual_reset_source_dset(H5O_storage_virtual_ent_t *virtual_ent,
+    H5O_storage_virtual_srcdset_t *source_dset)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(source_dset);
+
+    /* Free dataset */
+    if(source_dset->dset) {
+        if(H5D_close(source_dset->dset) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to close source dataset")
+        source_dset->dset = NULL;
+    } /* end if */
+
+    /* Free file name */
+    if(virtual_ent->parsed_source_file_name
+            && (source_dset->file_name
+            != virtual_ent->parsed_source_file_name->name_segment))
+        source_dset->file_name = (char *)H5MM_xfree(source_dset->file_name);
+    else
+        HDassert((source_dset->file_name == virtual_ent->source_file_name)
+                || (virtual_ent->parsed_source_file_name
+                && (source_dset->file_name
+                == virtual_ent->parsed_source_file_name->name_segment))
+                || !source_dset->file_name);
+
+    /* Free dataset name */
+    if(virtual_ent->parsed_source_dset_name
+            && (source_dset->dset_name
+            != virtual_ent->parsed_source_dset_name->name_segment))
+        source_dset->dset_name = (char *)H5MM_xfree(source_dset->dset_name);
+    else
+        HDassert((source_dset->dset_name == virtual_ent->source_dset_name)
+                || (virtual_ent->parsed_source_dset_name
+                && (source_dset->dset_name
+                == virtual_ent->parsed_source_dset_name->name_segment))
+                || !source_dset->dset_name);
+
+    /* Free clipped virtual selection */
+    if(source_dset->clipped_virtual_select) {
+        if(source_dset->clipped_virtual_select != source_dset->virtual_select)
+            if(H5S_close(source_dset->clipped_virtual_select) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release clipped virtual selection")
+        source_dset->clipped_virtual_select = NULL;
+    } /* end if */
+
+    /* Free virtual selection */
+    if(source_dset->virtual_select) {
+        if(H5S_close(source_dset->virtual_select) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release virtual selection")
+        source_dset->virtual_select = NULL;
+    } /* end if */
+
+    /* Free clipped source selection */
+    if(source_dset->clipped_source_select) {
+        if(source_dset->clipped_source_select != virtual_ent->source_select)
+            if(H5S_close(source_dset->clipped_source_select) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release clipped source selection")
+        source_dset->clipped_source_select = NULL;
+    } /* end if */
+
+    /* The projected memory space should never exist when this function is
+     * called */
+    HDassert(!source_dset->projected_mem_space);
+
+    /* Note the lack of a done: label.  This is because there are no HGOTO_ERROR
+     * calls.  If one is added, a done: label must also be added */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_reset_source_dset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_str_append
+ *
+ * Purpose:     Appends src_len bytes of the string src to the position *p
+ *              in the buffer *buf (allocating *buf if necessary).
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              May 19, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__virtual_str_append(const char *src, size_t src_len, char **p, char **buf,
+    size_t *buf_size)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(src);
+    HDassert(src_len > 0);
+    HDassert(p);
+    HDassert(buf);
+    HDassert(*p >= *buf);
+    HDassert(buf_size);
+
+    /* Allocate or extend buffer if necessary */
+    if(!*buf) {
+        HDassert(!*p);
+        HDassert(*buf_size == 0);
+
+        /* Allocate buffer */
+        if(NULL == (*buf = (char *)H5MM_malloc(src_len + (size_t)1)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "unable to allocate name segment struct")
+        *buf_size = src_len + (size_t)1;
+        *p = *buf;
+    } /* end if */
+    else {
+        size_t p_offset = (size_t)(*p - *buf); /* Offset of p within buf */
+
+        /* Extend buffer if necessary */
+        if((p_offset + src_len + (size_t)1) > *buf_size) {
+            char *tmp_buf;
+            size_t tmp_buf_size;
+
+            /* Calculate new size of buffer */
+            tmp_buf_size = MAX(p_offset + src_len + (size_t)1,
+                    *buf_size * (size_t)2);
+
+            /* Reallocate buffer */
+            if(NULL == (tmp_buf = (char *)H5MM_realloc(*buf, tmp_buf_size)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "unable to reallocate name segment buffer")
+            *buf = tmp_buf;
+            *buf_size = tmp_buf_size;
+            *p = *buf + p_offset;
+        } /* end if */
+    } /* end else */
+
+    /* Copy string to *p.  Note that since src in not NULL terminated, we must
+     * use memcpy */
+    (void)HDmemcpy(*p, src, src_len);
+
+    /* Advance *p */
+    *p += src_len;
+
+    /* Add NULL terminator */
+    **p = '\0';
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5D__virtual_str_append() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D_virtual_parse_source_name
+ *
+ * Purpose:     Parses a source file or dataset name.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              May 18, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D_virtual_parse_source_name(const char *source_name,
+    H5O_storage_virtual_name_seg_t **parsed_name, size_t *static_strlen,
+    size_t *nsubs)
+{
+    H5O_storage_virtual_name_seg_t *tmp_parsed_name = NULL;
+    H5O_storage_virtual_name_seg_t **tmp_parsed_name_p = &tmp_parsed_name;
+    size_t      tmp_static_strlen;
+    size_t      tmp_strlen;
+    size_t      tmp_nsubs = 0;
+    const char  *p;
+    const char  *pct;
+    char        *name_seg_p = NULL;
+    size_t      name_seg_size = 0;
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(source_name);
+    HDassert(parsed_name);
+    HDassert(static_strlen);
+    HDassert(nsubs);
+
+    /* Initialize p and tmp_static_strlen */
+    p = source_name;
+    tmp_static_strlen = tmp_strlen = HDstrlen(source_name);
+
+    /* Iterate over name */
+    /* Note this will not work with UTF-8!  We should support this eventually
+     * -NAF 5/18/2015 */
+    while((pct = HDstrchr(p, '%'))) {
+        HDassert(pct >= p);
+
+        /* Allocate name segment struct if necessary */
+        if(!*tmp_parsed_name_p)
+            if(NULL == (*tmp_parsed_name_p = H5FL_CALLOC(H5O_storage_virtual_name_seg_t)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "unable to allocate name segment struct")
+
+        /* Check for type of format specifier */
+        if(pct[1] == 'b') {
+            /* Check for blank string before specifier */
+            if(pct != p)
+                /* Append string to name segment */
+                if(H5D__virtual_str_append(p, (size_t)(pct - p), &name_seg_p, &(*tmp_parsed_name_p)->name_segment, &name_seg_size) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to append name segment")
+
+            /* Update other variables */
+            tmp_parsed_name_p = &(*tmp_parsed_name_p)->next;
+            tmp_static_strlen -= 2;
+            tmp_nsubs++;
+            name_seg_p = NULL;
+            name_seg_size = 0;
+        } /* end if */
+        else if(pct[1] == '%') {
+            /* Append string to name segment (include first '%') */
+            if(H5D__virtual_str_append(p, (size_t)(pct - p) + (size_t)1, &name_seg_p, &(*tmp_parsed_name_p)->name_segment, &name_seg_size) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to append name segment")
+
+            /* Update other variables */
+            tmp_static_strlen -= 1;
+        } /* end else */
+        else
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid format specifier")
+
+        p = pct + 2;
+    } /* end while */
+
+    /* Copy last segment of name, if any, unless the parsed name was not
+     * allocated */
+    if(tmp_parsed_name) {
+        HDassert(p >= source_name);
+        if(*p == '\0')
+            HDassert((size_t)(p - source_name) == tmp_strlen);
+        else {
+            HDassert((size_t)(p - source_name) < tmp_strlen);
+
+            /* Allocate name segment struct if necessary */
+            if(!*tmp_parsed_name_p)
+                if(NULL == (*tmp_parsed_name_p = H5FL_CALLOC(H5O_storage_virtual_name_seg_t)))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "unable to allocate name segment struct")
+
+            /* Append string to name segment */
+            if(H5D__virtual_str_append(p, tmp_strlen - (size_t)(p - source_name), &name_seg_p, &(*tmp_parsed_name_p)->name_segment, &name_seg_size) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to append name segment")
+        } /* end else */
+    } /* end if */
+
+    /* Set return values */
+    *parsed_name = tmp_parsed_name;
+    tmp_parsed_name = NULL;
+    *static_strlen = tmp_static_strlen;
+    *nsubs = tmp_nsubs;
+
+done:
+    if(tmp_parsed_name) {
+        HDassert(ret_value < 0);
+        H5D_virtual_free_parsed_name(tmp_parsed_name);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D_virtual_parse_source_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_copy_parsed_name
+ *
+ * Purpose:     Deep copies a parsed source file or dataset name.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              May 19, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__virtual_copy_parsed_name(H5O_storage_virtual_name_seg_t **dst,
+    H5O_storage_virtual_name_seg_t *src)
+{
+    H5O_storage_virtual_name_seg_t *tmp_dst = NULL;
+    H5O_storage_virtual_name_seg_t *p_src = src;
+    H5O_storage_virtual_name_seg_t **p_dst = &tmp_dst;
+    herr_t          ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(dst);
+
+    /* Walk over parsed name, duplicating it */
+    while(p_src) {
+        /* Allocate name segment struct */
+        if(NULL == (*p_dst = H5FL_CALLOC(H5O_storage_virtual_name_seg_t)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "unable to allocate name segment struct")
+
+        /* Duplicate name segment */
+        if(p_src->name_segment) {
+            if(NULL == ((*p_dst)->name_segment = HDstrdup(p_src->name_segment)))
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "unable to duplicate name segment")
+        } /* end if */
+
+        /* Advance pointers */
+        p_src = p_src->next;
+        p_dst = &(*p_dst)->next;
+    } /* end while */
+
+    /* Set dst */
+    *dst = tmp_dst;
+    tmp_dst = NULL;
+
+done:
+    if(tmp_dst) {
+        HDassert(ret_value < 0);
+        H5D_virtual_free_parsed_name(tmp_dst);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_copy_parsed_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D_virtual_free_parsed_name
+ *
+ * Purpose:     Frees the provided parsed name.
+ *
+ * Return:      void
+ *
+ * Programmer:  Neil Fortner
+ *              May 19, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D_virtual_free_parsed_name(H5O_storage_virtual_name_seg_t *name_seg)
+{
+    H5O_storage_virtual_name_seg_t *next_seg;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Walk name segments, freeing them */
+    while(name_seg) {
+        (void)H5MM_xfree(name_seg->name_segment);
+        next_seg = name_seg->next;
+        (void)H5FL_FREE(H5O_storage_virtual_name_seg_t, name_seg);
+        name_seg = next_seg;
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D_virtual_free_parsed_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_build_source_name
+ *
+ * Purpose:     Builds a source file or dataset name from a parsed name.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              May 18, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__virtual_build_source_name(char *source_name,
+    const H5O_storage_virtual_name_seg_t *parsed_name, size_t static_strlen,
+    size_t nsubs, hsize_t blockno, char **built_name)
+{
+    char        *tmp_name = NULL;       /* Name buffer */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(source_name);
+    HDassert(built_name);
+
+    /* Check for static name */
+    if(nsubs == 0) {
+        if(parsed_name)
+            *built_name = parsed_name->name_segment;
+        else
+            *built_name = source_name;
+    } /* end if */
+    else {
+        const H5O_storage_virtual_name_seg_t *name_seg = parsed_name;
+        char *p;
+        hsize_t blockno_down = blockno;
+        size_t blockno_len = 1;
+        size_t name_len;
+        size_t name_len_rem;
+        size_t seg_len;
+        size_t nsubs_rem = nsubs;
+
+        HDassert(parsed_name);
+
+        /* Calculate length of printed block number */
+        do {
+            blockno_down /= (hsize_t)10;
+            if(blockno_down == 0)
+                break;
+            blockno_len++;
+        } while(1);
+
+        /* Calculate length of name buffer */
+        name_len_rem = name_len = static_strlen + (nsubs * blockno_len) + (size_t)1;
+
+        /* Allocate name buffer */
+        if(NULL == (tmp_name = (char *)H5MM_malloc(name_len)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "unable to allocate name buffer")
+        p = tmp_name;
+
+        /* Build name */
+        do {
+            /* Add name segment */
+            if(name_seg->name_segment) {
+                seg_len = HDstrlen(name_seg->name_segment);
+                HDassert(seg_len > 0);
+                HDassert(seg_len < name_len_rem);
+                HDstrncpy(p, name_seg->name_segment, name_len_rem);
+                name_len_rem -= seg_len;
+                p += seg_len;
+            } /* end if */
+
+            /* Add block number */
+            if(nsubs_rem > 0) {
+                HDassert(blockno_len < name_len_rem);
+                if(HDsnprintf(p, name_len_rem, "%llu", (long long unsigned)blockno) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to write block number to string")
+                name_len_rem -= blockno_len;
+                p += blockno_len;
+                nsubs_rem--;
+            } /* end if */
+
+            /* Advance name_seg */
+            name_seg = name_seg->next;
+        } while(name_seg);
+
+        /* Assign built_name */
+        *built_name = tmp_name;
+        tmp_name = NULL;
+    } /* end else */
+
+done:
+    if(tmp_name) {
+        HDassert(ret_value < 0);
+        H5MM_free(tmp_name);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_build_source_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_set_extent_unlim
+ *
+ * Purpose:     Sets the extent of the virtual dataset by checking the
+ *              extents of source datasets where an unlimited selection
+ *              matching.  Dimensions that are not unlimited in any
+ *              virtual mapping selections are not affected.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              April 22, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__virtual_set_extent_unlim(const H5D_t *dset, hid_t dxpl_id)
+{
+    H5O_storage_virtual_t *storage;
+    hsize_t     new_dims[H5S_MAX_RANK];
+    hsize_t     curr_dims[H5S_MAX_RANK];
+    hsize_t     clip_size;
+    int         rank;
+    hbool_t     changed = FALSE;        /* Whether the VDS extent changed */
+    size_t      i, j;
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(dset);
+    HDassert(dset->shared->layout.storage.type == H5D_VIRTUAL);
+    storage = &dset->shared->layout.storage.u.virt;
+    HDassert((storage->view == H5D_VDS_FIRST_MISSING) || (storage->view == H5D_VDS_LAST_AVAILABLE));
+
+    /* Get rank of VDS */
+    if((rank = H5S_GET_EXTENT_NDIMS(dset->shared->space)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get number of dimensions")
+
+    /* Initialize new_dims to HSIZE_UNDEF */
+    for(i = 0; i < (size_t)rank; i++)
+        new_dims[i] = HSIZE_UNDEF;
+
+    /* Iterate over mappings */
+    for(i = 0; i < storage->list_nused; i++)
+        /* Check for unlimited dimension */
+        if(storage->list[i].unlim_dim_virtual >= 0) {
+            /* Check for "printf" source dataset resolution */
+            if(storage->list[i].unlim_dim_source >= 0 ) {
+                /* Non-printf mapping */
+                /* Open source dataset */
+                if(!storage->list[i].source_dset.dset)
+                    if(H5D__virtual_open_source_dset(dset, &storage->list[i], &storage->list[i].source_dset, dxpl_id) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "unable to open source dataset")
+
+                /* Check if source dataset is open */
+                if(storage->list[i].source_dset.dset) {
+                    /* Retrieve current source dataset extent and patch mapping
+                     */
+                    if(H5S_extent_copy(storage->list[i].source_select, storage->list[i].source_dset.dset->shared->space) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "can't copy source dataspace extent")
+
+                    /* Get source space dimenstions */
+                    if(H5S_get_simple_extent_dims(storage->list[i].source_select, curr_dims, NULL) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get source space dimensions")
+
+                    /* Check if the source extent in the unlimited dimension
+                     * changed since the last time the VDS extent/mapping
+                     * was updated */
+                    if(curr_dims[storage->list[i].unlim_dim_source]
+                            == storage->list[i].unlim_extent_source)
+                        /* Use cached result for clip size */
+                        clip_size = storage->list[i].clip_size_virtual;
+                    else {
+                        /* Get size that virtual selection would be clipped to
+                         * to match size of source selection within source
+                         * extent */
+                        clip_size = H5S_hyper_get_clip_extent_match(storage->list[i].source_dset.virtual_select, storage->list[i].source_select, curr_dims[storage->list[i].unlim_dim_source], storage->view == H5D_VDS_FIRST_MISSING);
+
+                        /* If we are setting the extent by the last available
+                         * data, clip virtual_select and source_select.  Note
+                         * that if we used the cached clip_size above or it
+                         * happens to be the same, the virtual selection will
+                         * already be clipped to the correct size.  Likewise,
+                         * if we used the cached clip_size the source selection
+                         * will already be correct. */
+                        if(storage->view == H5D_VDS_LAST_AVAILABLE) {
+                            if(clip_size != storage->list[i].clip_size_virtual) {
+                                /* Close previous clipped virtual selection, if
+                                 * any */
+                                if(storage->list[i].source_dset.clipped_virtual_select) {
+                                    HDassert(storage->list[i].source_dset.clipped_virtual_select
+                                            != storage->list[i].source_dset.virtual_select);
+                                    if(H5S_close(storage->list[i].source_dset.clipped_virtual_select) < 0)
+                                        HGOTO_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release clipped virtual dataspace")
+                                } /* end if */
+
+                                /* Copy virtual selection */
+                                if(NULL == (storage->list[i].source_dset.clipped_virtual_select = H5S_copy(storage->list[i].source_dset.virtual_select, FALSE, TRUE)))
+                                    HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to copy virtual selection")
+
+                                /* Clip virtual selection */
+                                if(H5S_hyper_clip_unlim(storage->list[i].source_dset.clipped_virtual_select, clip_size))
+                                    HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, FAIL, "failed to clip unlimited selection")
+                            } /* end if */
+
+                            /* Close previous clipped source selection, if any
+                             */
+                            if(storage->list[i].source_dset.clipped_source_select) {
+                                HDassert(storage->list[i].source_dset.clipped_source_select
+                                        != storage->list[i].source_select);
+                                if(H5S_close(storage->list[i].source_dset.clipped_source_select) < 0)
+                                    HGOTO_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release clipped source dataspace")
+                            } /* end if */
+
+                            /* Copy source selection */
+                            if(NULL == (storage->list[i].source_dset.clipped_source_select = H5S_copy(storage->list[i].source_select, FALSE, TRUE)))
+                                HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to copy source selection")
+
+                            /* Clip source selection */
+                            if(H5S_hyper_clip_unlim(storage->list[i].source_dset.clipped_source_select, curr_dims[storage->list[i].unlim_dim_source]))
+                                HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, FAIL, "failed to clip unlimited selection")
+                        } /* end if */
+
+                        /* Update cached values unlim_extent_source and 
+                         * clip_size_virtual */
+                        storage->list[i].unlim_extent_source = curr_dims[storage->list[i].unlim_dim_source];
+                        storage->list[i].clip_size_virtual = clip_size;
+                    } /* end else */
+                } /* end if */
+                else
+                    clip_size = 0;
+            } /* end if */
+            else {
+                /* printf mapping */
+                hsize_t first_missing = 0;  /* First missing dataset in the current block of missing datasets */
+
+                /* Search for source datasets */
+                HDassert(storage->printf_gap != HSIZE_UNDEF);
+                for(j = 0; j <= (storage->printf_gap + first_missing); j++) {
+                    /* Check for running out of space in sub_dset array */
+                    if(j >= (hsize_t)storage->list[i].sub_dset_nalloc) {
+                        if(storage->list[i].sub_dset_nalloc == 0) {
+                            /* Allocate sub_dset */
+                            if(NULL == (storage->list[i].sub_dset = (H5O_storage_virtual_srcdset_t *)H5MM_calloc(H5D_VIRTUAL_DEF_SUB_DSET_SIZE * sizeof(H5O_storage_virtual_srcdset_t))))
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "unable to allocate sub dataset array")
+                            storage->list[i].sub_dset_nalloc = H5D_VIRTUAL_DEF_SUB_DSET_SIZE;
+                        } /* end if */
+                        else {
+                            H5O_storage_virtual_srcdset_t *tmp_sub_dset;
+
+                            /* Extend sub_dset */
+                            if(NULL == (tmp_sub_dset = (H5O_storage_virtual_srcdset_t *)H5MM_realloc(storage->list[i].sub_dset, 2 * storage->list[i].sub_dset_nalloc * sizeof(H5O_storage_virtual_srcdset_t))))
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "unable to extend sub dataset array")
+                            storage->list[i].sub_dset = tmp_sub_dset;
+
+                            /* Clear new space in sub_dset */
+                            (void)HDmemset(&storage->list[i].sub_dset[storage->list[i].sub_dset_nalloc], 0, storage->list[i].sub_dset_nalloc * sizeof(H5O_storage_virtual_srcdset_t));
+
+                            /* Update sub_dset_nalloc */
+                            storage->list[i].sub_dset_nalloc *= 2;
+                        } /* end else */
+                    } /* end if */
+
+                    /* Check if the dataset was already opened */
+                    if(storage->list[i].sub_dset[j].dset_exists)
+                        first_missing = j + 1;
+                    else {
+                        /* Resolve file name */
+                        if(!storage->list[i].sub_dset[j].file_name)
+                            if(H5D__virtual_build_source_name(storage->list[i].source_file_name, storage->list[i].parsed_source_file_name, storage->list[i].psfn_static_strlen, storage->list[i].psfn_nsubs, j, &storage->list[i].sub_dset[j].file_name) < 0)
+                                HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to build source file name")
+
+                        /* Resolve dset name */
+                        if(!storage->list[i].sub_dset[j].dset_name)
+                            if(H5D__virtual_build_source_name(storage->list[i].source_dset_name, storage->list[i].parsed_source_dset_name, storage->list[i].psdn_static_strlen, storage->list[i].psdn_nsubs, j, &storage->list[i].sub_dset[j].dset_name) < 0)
+                                HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to build source dataset name")
+
+                        /* Resolve virtual selection for block */
+                        if(!storage->list[i].sub_dset[j].virtual_select)
+                            if(NULL == (storage->list[i].sub_dset[j].virtual_select = H5S_hyper_get_unlim_block(storage->list[i].source_dset.virtual_select, j)))
+                                HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get block in unlimited selection")
+
+                        /* Initialize clipped selections */
+                        if(!storage->list[i].sub_dset[j].clipped_source_select)
+                            storage->list[i].sub_dset[j].clipped_source_select = storage->list[i].source_select;
+                        if(!storage->list[i].sub_dset[j].clipped_virtual_select)
+                            storage->list[i].sub_dset[j].clipped_virtual_select = storage->list[i].sub_dset[j].virtual_select;
+
+                        /* Open source dataset */
+                        if(H5D__virtual_open_source_dset(dset, &storage->list[i], &storage->list[i].sub_dset[j], dxpl_id) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "unable to open source dataset")
+
+                        if(storage->list[i].sub_dset[j].dset) {
+                            /* Update first_missing */
+                            first_missing = j + 1;
+
+                            /* Close source dataset so we don't have huge
+                             * numbers of datasets open */
+                            if(H5D_close(storage->list[i].sub_dset[j].dset) < 0)
+                                HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to close source dataset")
+                            storage->list[i].sub_dset[j].dset = NULL;
+                        } /* end if */
+                    } /* end else */
+                } /* end for */
+
+                /* Check if the size changed */
+                if((first_missing == (hsize_t)storage->list[i].sub_dset_nused)
+                        && (storage->list[i].clip_size_virtual != HSIZE_UNDEF))
+                    /* Use cached clip_size */
+                    clip_size = storage->list[i].clip_size_virtual;
+                else {
+                    /* Check for no datasets */
+                    if(first_missing == 0)
+                        /* Set clip size to 0 */
+                        clip_size = (hsize_t)0;
+                    else {
+                        hsize_t         bounds_start[H5S_MAX_RANK];
+                        hsize_t         bounds_end[H5S_MAX_RANK];
+
+                        /* Get clip size from selection */
+                        if(storage->view == H5D_VDS_LAST_AVAILABLE) {
+                            /* Get bounds from last valid virtual selection */
+                            if(H5S_SELECT_BOUNDS(storage->list[i].sub_dset[first_missing - (hsize_t)1].virtual_select, bounds_start, bounds_end) < 0)
+                                HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get selection bounds")
+
+                            /* Set clip_size to bounds_end in unlimited
+                             * dimension */
+                            clip_size = bounds_end[storage->list[i].unlim_dim_virtual] + (hsize_t)1;
+                        } /* end if */
+                        else {
+                            /* Get bounds from first missing virtual selection
+                             */
+                            if(H5S_SELECT_BOUNDS(storage->list[i].sub_dset[first_missing].virtual_select, bounds_start, bounds_end) < 0)
+                                HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get selection bounds")
+
+                            /* Set clip_size to bounds_start in unlimited
+                             * dimension */
+                            clip_size = bounds_start[storage->list[i].unlim_dim_virtual];
+                        } /* end else */
+                    } /* end else */
+
+                    /* Set sub_dset_nused and clip_size_virtual */
+                    storage->list[i].sub_dset_nused = (size_t)first_missing;
+                    storage->list[i].clip_size_virtual = clip_size;
+                } /* end else */
+            } /* end else */
+
+            /* Update new_dims */
+            if((new_dims[storage->list[i].unlim_dim_virtual] == HSIZE_UNDEF)
+                    || (storage->view == H5D_VDS_FIRST_MISSING ? (clip_size < (hsize_t)new_dims[storage->list[i].unlim_dim_virtual])
+                        : (clip_size > (hsize_t)new_dims[storage->list[i].unlim_dim_virtual])))
+                new_dims[storage->list[i].unlim_dim_virtual] = clip_size;
+        } /* end if */
+
+    /* Get current VDS dimensions */
+    if(H5S_get_simple_extent_dims(dset->shared->space, curr_dims, NULL) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get VDS dimensions")
+
+    /* Calculate new extent */
+    for(i = 0; i < (size_t)rank; i++) {
+        if(new_dims[i] == HSIZE_UNDEF)
+            new_dims[i] = curr_dims[i];
+        else if(new_dims[i] < storage->min_dims[i])
+            new_dims[i] = storage->min_dims[i];
+        if(new_dims[i] != curr_dims[i])
+            changed = TRUE;
+    } /* end for */
+
+    /* Update extent if it changed */
+    if(changed) {
+        /* Update VDS extent */
+        if(H5S_set_extent(dset->shared->space, new_dims) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to modify size of data space")
+
+        /* Mark the space as dirty, for later writing to the file */
+        if(H5F_INTENT(dset->oloc.file) & H5F_ACC_RDWR) 
+            if(H5D__mark(dset, dxpl_id, H5D_MARK_SPACE) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "unable to mark dataspace as dirty")
+    } /* end if */
+
+    /* If we did not change the VDS dimensions, there is nothing more to update
+     */
+    if(changed || (!storage->init && (storage->view == H5D_VDS_FIRST_MISSING))) {
+        /* Iterate over mappings again to update source selections and virtual
+         * mapping extents */
+        for(i = 0; i < storage->list_nused; i++) {
+            /* If there is an unlimited dimension, we are setting extent by the
+             * minimum of mappings, and the virtual extent in the unlimited
+             * dimension has changed since the last time the VDS extent/mapping
+             * was updated, we must adjust the selections */
+            if((storage->list[i].unlim_dim_virtual >= 0)
+                    && (storage->view == H5D_VDS_FIRST_MISSING)
+                    && (new_dims[storage->list[i].unlim_dim_virtual]
+                    != storage->list[i].unlim_extent_virtual)) {
+                /* Check for "printf" style mapping */
+                if(storage->list[i].unlim_dim_source >= 0) {
+                    /* Non-printf mapping */
+                    /* Close previous clipped virtual selection, if any */
+                    if(storage->list[i].source_dset.clipped_virtual_select) {
+                        HDassert(storage->list[i].source_dset.clipped_virtual_select
+                            != storage->list[i].source_dset.virtual_select);
+                        if(H5S_close(storage->list[i].source_dset.clipped_virtual_select) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release clipped virtual dataspace")
+                    } /* end if */
+
+                    /* Copy virtual selection */
+                    if(NULL == (storage->list[i].source_dset.clipped_virtual_select = H5S_copy(storage->list[i].source_dset.virtual_select, FALSE, TRUE)))
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to copy virtual selection")
+
+                    /* Clip space to virtual extent */
+                    if(H5S_hyper_clip_unlim(storage->list[i].source_dset.clipped_virtual_select, new_dims[storage->list[i].unlim_dim_source]))
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, FAIL, "failed to clip unlimited selection")
+
+                    /* Get size that source selection will be clipped to to
+                     * match size of virtual selection */
+                    clip_size = H5S_hyper_get_clip_extent(storage->list[i].source_select, storage->list[i].source_dset.clipped_virtual_select, FALSE);
+
+                    /* Check if the clip size changed */
+                    if(clip_size != storage->list[i].clip_size_source) {
+                        /* Close previous clipped source selection, if any */
+                        if(storage->list[i].source_dset.clipped_source_select) {
+                            HDassert(storage->list[i].source_dset.clipped_source_select
+                                != storage->list[i].source_select);
+                            if(H5S_close(storage->list[i].source_dset.clipped_source_select) < 0)
+                                HGOTO_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release clipped source dataspace")
+                        } /* end if */
+
+                        /* Copy source selection */
+                        if(NULL == (storage->list[i].source_dset.clipped_source_select = H5S_copy(storage->list[i].source_select, FALSE, TRUE)))
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to copy source selection")
+
+                        /* Clip source selection */
+                        if(H5S_hyper_clip_unlim(storage->list[i].source_dset.clipped_source_select, clip_size))
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, FAIL, "failed to clip unlimited selection")
+
+                        /* Update cached value clip_size_source */
+                        storage->list[i].clip_size_source = clip_size;
+                    } /* end if */
+                } /* end if */
+                else {
+                    /* printf mapping */
+                    hsize_t first_inc_block;
+                    hbool_t partial_block;
+
+                    /* Get index of first incomplete block in virtual
+                     * selection */
+                    first_inc_block = H5S_hyper_get_first_inc_block(storage->list[i].source_dset.virtual_select, new_dims[storage->list[i].unlim_dim_virtual], &partial_block);
+
+                    /* Iterate over sub datasets */
+                    for(j = 0; j < storage->list[i].sub_dset_nalloc; j++) {
+                        /* Close previous clipped source selection, if any */
+                        if(storage->list[i].sub_dset[j].clipped_source_select
+                                != storage->list[i].source_select) {
+                            if(storage->list[i].sub_dset[j].clipped_source_select)
+                                if(H5S_close(storage->list[i].sub_dset[j].clipped_source_select) < 0)
+                                    HGOTO_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release clipped source dataspace")
+
+                            /* Initialize clipped source selection to point to
+                             * base source selection */
+                            storage->list[i].sub_dset[j].clipped_source_select = storage->list[i].source_select;
+                        } /* end if */
+
+                        /* Close previous clipped virtual selection, if any */
+                        if(storage->list[i].sub_dset[j].clipped_virtual_select
+                                != storage->list[i].sub_dset[j].virtual_select) {
+                            if(storage->list[i].sub_dset[j].clipped_virtual_select)
+                                if(H5S_close(storage->list[i].sub_dset[j].clipped_virtual_select) < 0)
+                                    HGOTO_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release clipped virtual dataspace")
+
+                            /* Initialize clipped virtual selection to point to
+                             * unclipped virtual selection */
+                            storage->list[i].sub_dset[j].clipped_virtual_select = storage->list[i].sub_dset[j].virtual_select;
+                        } /* end if */
+
+                        /* Only initialize clipped selections if it is a
+                         * complete block, for incomplete blocks defer to
+                         * H5D__virtual_pre_io() as we may not have a valid
+                         * source extent here.  For unused blocks we will never
+                         * need clipped selections (until the extent is
+                         * recalculated in this function). */
+                        if(j >= (size_t)first_inc_block) {
+                            /* Clear clipped source and virtual selections */
+                            storage->list[i].sub_dset[j].clipped_source_select = NULL;
+                            storage->list[i].sub_dset[j].clipped_virtual_select = NULL;
+                        } /* end if */
+                    } /* end for */
+                } /* end else */
+
+                /* Update cached value unlim_extent_virtual */
+                storage->list[i].unlim_extent_virtual = new_dims[storage->list[i].unlim_dim_virtual];
+            } /* end if */
+
+            /* Update top level virtual_select and clipped_virtual_select
+             * extents */
+            if(H5S_set_extent(storage->list[i].source_dset.virtual_select, new_dims) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to modify size of data space")
+            if((storage->list[i].source_dset.clipped_virtual_select
+                    != storage->list[i].source_dset.virtual_select)
+                    && storage->list[i].source_dset.clipped_virtual_select)
+                if(H5S_set_extent(storage->list[i].source_dset.clipped_virtual_select, new_dims) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to modify size of data space")
+
+            /* Update sub dataset virtual_select and clipped_virtual_select
+             * extents */
+            for(j = 0; j < storage->list[i].sub_dset_nalloc; j++)
+                if(storage->list[i].sub_dset[j].virtual_select) {
+                    if(H5S_set_extent(storage->list[i].sub_dset[j].virtual_select, new_dims) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to modify size of data space")
+                    if((storage->list[i].sub_dset[j].clipped_virtual_select
+                            != storage->list[i].sub_dset[j].virtual_select)
+                            && storage->list[i].sub_dset[j].clipped_virtual_select)
+                        if(H5S_set_extent(storage->list[i].sub_dset[j].clipped_virtual_select, new_dims) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to modify size of data space")
+                } /* end if */
+                else
+                    HDassert(!storage->list[i].sub_dset[j].clipped_virtual_select);
+        } /* end for */
+    } /* end if */
+
+    /* Mark layout as fully initialized */
+    storage->init = TRUE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_set_extent_unlim() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_init_all
+ *
+ * Purpose:     Finishes initializing layout in preparation for I/O.
+ *              Only necessary if H5D__virtual_set_extent_unlim() has not
+ *              been called yet.  Initializes clipped_virtual_select and
+ *              clipped_source_select for all mappings in this layout.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              August 10, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__virtual_init_all(const H5D_t *dset, hid_t dxpl_id)
+{
+    H5O_storage_virtual_t *storage;
+    hsize_t     virtual_dims[H5S_MAX_RANK];
+    hsize_t     source_dims[H5S_MAX_RANK];
+    hsize_t     clip_size;
+    size_t      i, j;
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(dset);
+    HDassert(dset->shared->layout.storage.type == H5D_VIRTUAL);
+    storage = &dset->shared->layout.storage.u.virt;
+    HDassert((storage->view == H5D_VDS_FIRST_MISSING) || (storage->view == H5D_VDS_LAST_AVAILABLE));
+
+    /* Get current VDS dimensions */
+    if(H5S_get_simple_extent_dims(dset->shared->space, virtual_dims, NULL) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get VDS dimensions")
+
+    /* Iterate over mappings */
+    for(i = 0; i < storage->list_nused; i++)
+        /* Check for unlimited dimension */
+        if(storage->list[i].unlim_dim_virtual >= 0) {
+            /* Check for "printf" source dataset resolution */
+            if(storage->list[i].unlim_dim_source >= 0 ) {
+                /* Non-printf mapping */
+                /* Open source dataset */
+                if(!storage->list[i].source_dset.dset)
+                    if(H5D__virtual_open_source_dset(dset, &storage->list[i], &storage->list[i].source_dset, dxpl_id) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "unable to open source dataset")
+
+                /* Check if source dataset is open */
+                if(storage->list[i].source_dset.dset) {
+                    /* Retrieve current source dataset extent and patch mapping
+                     */
+                    if(H5S_extent_copy(storage->list[i].source_select, storage->list[i].source_dset.dset->shared->space) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "can't copy source dataspace extent")
+
+                    /* Get source space dimenstions */
+                    if(H5S_get_simple_extent_dims(storage->list[i].source_select, source_dims, NULL) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get source space dimensions")
+
+                    /* Get size that source selection would be clipped to to
+                     * match size of virtual selection */
+                    clip_size = H5S_hyper_get_clip_extent_match(storage->list[i].source_select, storage->list[i].source_dset.virtual_select, virtual_dims[storage->list[i].unlim_dim_virtual], FALSE);
+
+                    /* Close previous clipped virtual selection, if any */
+                    if(storage->list[i].source_dset.clipped_virtual_select) {
+                        HDassert(storage->list[i].source_dset.clipped_virtual_select
+                                != storage->list[i].source_dset.virtual_select);
+                        if(H5S_close(storage->list[i].source_dset.clipped_virtual_select) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release clipped virtual dataspace")
+                    } /* end if */
+
+                    /* Copy virtual selection */
+                    if(NULL == (storage->list[i].source_dset.clipped_virtual_select = H5S_copy(storage->list[i].source_dset.virtual_select, FALSE, TRUE)))
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to copy virtual selection")
+
+                    /* Close previous clipped source selection, if any */
+                    if(storage->list[i].source_dset.clipped_source_select) {
+                        HDassert(storage->list[i].source_dset.clipped_source_select
+                                != storage->list[i].source_select);
+                        if(H5S_close(storage->list[i].source_dset.clipped_source_select) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release clipped source dataspace")
+                    } /* end if */
+
+                    /* Copy source selection */
+                    if(NULL == (storage->list[i].source_dset.clipped_source_select = H5S_copy(storage->list[i].source_select, FALSE, TRUE)))
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to copy source selection")
+
+                    /* Check if the clip size is within the current extent of
+                     * the source dataset */
+                    if(clip_size <= source_dims[storage->list[i].unlim_dim_source]) {
+                        /* Clip virtual selection to extent */
+                        if(H5S_hyper_clip_unlim(storage->list[i].source_dset.clipped_virtual_select, virtual_dims[storage->list[i].unlim_dim_virtual]))
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, FAIL, "failed to clip unlimited selection")
+
+                        /* Clip source selection to clip_size */
+                        if(H5S_hyper_clip_unlim(storage->list[i].source_dset.clipped_source_select, clip_size))
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, FAIL, "failed to clip unlimited selection")
+                    } /* end if */
+                    else {
+                        /* Get size that virtual selection will be clipped to to
+                         * match size of source selection within source extent
+                         */
+                        clip_size = H5S_hyper_get_clip_extent_match(storage->list[i].source_dset.virtual_select, storage->list[i].source_select, source_dims[storage->list[i].unlim_dim_source], FALSE);
+
+                        /* Clip virtual selection to clip_size */
+                        if(H5S_hyper_clip_unlim(storage->list[i].source_dset.clipped_virtual_select, clip_size))
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, FAIL, "failed to clip unlimited selection")
+
+                        /* Clip source selection to extent */
+                        if(H5S_hyper_clip_unlim(storage->list[i].source_dset.clipped_source_select, source_dims[storage->list[i].unlim_dim_source]))
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, FAIL, "failed to clip unlimited selection")
+                    } /* end else */
+                } /* end if */
+                else {
+                    HDassert(!storage->list[i].source_dset.clipped_virtual_select);
+                    HDassert(!storage->list[i].source_dset.clipped_source_select);
+                } /* end else */
+            } /* end if */
+            else {
+                /* printf mapping */
+                size_t sub_dset_max;
+                hbool_t partial_block;
+
+                /* Get number of sub-source datasets in current extent */
+                sub_dset_max = (size_t)H5S_hyper_get_first_inc_block(storage->list[i].source_dset.virtual_select, virtual_dims[storage->list[i].unlim_dim_virtual], &partial_block);
+                if(partial_block)
+                    sub_dset_max++;
+
+                /* Allocate or grow the sub_dset array if necessary */
+                if(!storage->list[i].sub_dset) {
+                    /* Allocate sub_dset array */
+                    if(NULL == (storage->list[i].sub_dset = (H5O_storage_virtual_srcdset_t *)H5MM_calloc(sub_dset_max * sizeof(H5O_storage_virtual_srcdset_t))))
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "unable to allocate sub dataset array")
+
+                    /* Update sub_dset_nalloc */
+                    storage->list[i].sub_dset_nalloc = sub_dset_max;
+                } /* end if */
+                else if(sub_dset_max > storage->list[i].sub_dset_nalloc) {
+                    H5O_storage_virtual_srcdset_t *tmp_sub_dset;
+
+                    /* Extend sub_dset array */
+                    if(NULL == (tmp_sub_dset = (H5O_storage_virtual_srcdset_t *)H5MM_realloc(storage->list[i].sub_dset, sub_dset_max * sizeof(H5O_storage_virtual_srcdset_t))))
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "unable to extend sub dataset array")
+                    storage->list[i].sub_dset = tmp_sub_dset;
+
+                    /* Clear new space in sub_dset */
+                    (void)HDmemset(&storage->list[i].sub_dset[storage->list[i].sub_dset_nalloc], 0, (sub_dset_max - storage->list[i].sub_dset_nalloc) * sizeof(H5O_storage_virtual_srcdset_t));
+
+                    /* Update sub_dset_nalloc */
+                    storage->list[i].sub_dset_nalloc = sub_dset_max;
+                } /* end if */
+
+                /* Iterate over sub dsets */
+                for(j = 0; j < sub_dset_max; j++) {
+                    /* Resolve file name */
+                    if(!storage->list[i].sub_dset[j].file_name)
+                        if(H5D__virtual_build_source_name(storage->list[i].source_file_name, storage->list[i].parsed_source_file_name, storage->list[i].psfn_static_strlen, storage->list[i].psfn_nsubs, j, &storage->list[i].sub_dset[j].file_name) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to build source file name")
+
+                    /* Resolve dset name */
+                    if(!storage->list[i].sub_dset[j].dset_name)
+                        if(H5D__virtual_build_source_name(storage->list[i].source_dset_name, storage->list[i].parsed_source_dset_name, storage->list[i].psdn_static_strlen, storage->list[i].psdn_nsubs, j, &storage->list[i].sub_dset[j].dset_name) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to build source dataset name")
+
+                    /* Resolve virtual selection for block */
+                    if(!storage->list[i].sub_dset[j].virtual_select)
+                        if(NULL == (storage->list[i].sub_dset[j].virtual_select = H5S_hyper_get_unlim_block(storage->list[i].source_dset.virtual_select, j)))
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get block in unlimited selection")
+
+                    /* Close previous clipped source selection, if any */
+                    if(storage->list[i].sub_dset[j].clipped_source_select != storage->list[i].source_select) {
+                        if(storage->list[i].sub_dset[j].clipped_source_select)
+                            if(H5S_close(storage->list[i].sub_dset[j].clipped_source_select) < 0)
+                                HGOTO_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release clipped source dataspace")
+
+                        /* Initialize clipped source selection to point to base
+                         * source selection */
+                        storage->list[i].sub_dset[j].clipped_source_select = storage->list[i].source_select;
+                    } /* end if */
+
+                    /* Close previous clipped virtual selection, if any */
+                    if(storage->list[i].sub_dset[j].clipped_virtual_select != storage->list[i].sub_dset[j].virtual_select) {
+                        if(storage->list[i].sub_dset[j].clipped_virtual_select)
+                            if(H5S_close(storage->list[i].sub_dset[j].clipped_virtual_select) < 0)
+                                HGOTO_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release clipped virtual dataspace")
+
+                        /* Initialize clipped virtual selection to point to
+                         * unclipped virtual selection */
+                        storage->list[i].sub_dset[j].clipped_virtual_select = storage->list[i].sub_dset[j].virtual_select;
+                    } /* end if */
+
+                    /* Clear clipped selections if this is a partial block,
+                     * defer calculation of real clipped selections to
+                     * H5D__virtual_pre_io() as we may not have a valid source
+                     * extent here */
+                    if((j == (sub_dset_max - 1)) && partial_block) {
+                        /* Clear clipped source and virtual selections */
+                        storage->list[i].sub_dset[j].clipped_source_select = NULL;
+                        storage->list[i].sub_dset[j].clipped_virtual_select = NULL;
+                    } /* end else */
+                    /* Note we do not need to open the source file, this will
+                     * happen later in H5D__virtual_pre_io() */
+                } /* end for */
+
+                /* Update sub_dset_nused */
+                storage->list[i].sub_dset_nused = sub_dset_max;
+            } /* end else */
+        } /* end if */
+        else {
+            /* Limited mapping, just make sure the clipped selections were
+             * already set.  Again, no need to open the source file. */
+            HDassert(storage->list[i].source_dset.clipped_virtual_select);
+            HDassert(storage->list[i].source_dset.clipped_source_select);
+        } /* end else */
+
+    /* Mark layout as fully initialized */
+    storage->init = TRUE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_init_all() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_init
+ *
+ * Purpose:     Initialize the virtual layout information for a dataset.
+ *              This is called when the dataset is initialized.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Thursday, April 30, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__virtual_init(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, const H5D_t *dset,
+    hid_t dapl_id)
+{
+    H5O_storage_virtual_t *storage;     /* Convenience pointer */
+    H5P_genplist_t *dapl;               /* Data access property list object pointer */
+    hssize_t old_offset[H5O_LAYOUT_NDIMS]; /* Old selection offset (unused) */
+    size_t      i;                      /* Local index variables */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(dset);
+    storage = &dset->shared->layout.storage.u.virt;
+    HDassert(storage->list || (storage->list_nused == 0));
+
+    /* Check that the dimensions of the VDS are large enough */
+    if(H5D_virtual_check_min_dims(dset) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "virtual dataset dimensions not large enough to contain all limited dimensions in all selections")
+
+    /* Patch the virtual selection dataspaces.  Note we always patch the space
+     * status because this layout could be from an old version held in the
+     * object header message code.  We cannot update that held message because
+     * the layout message is constant, so just overwrite the values here (and
+     * invalidate other fields by setting storage->init to FALSE below).  Also
+     * remove offset from selections.  We only have to update
+     * source_space_status and virtual_space_status because others will be based
+     * on these and should therefore already have been normalized. */
+    for(i = 0; i < storage->list_nused; i++) {
+        HDassert(storage->list[i].sub_dset_nalloc == 0);
+
+        /* Patch extent */
+        if(H5S_extent_copy(storage->list[i].source_dset.virtual_select, dset->shared->space) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "can't copy virtual dataspace extent")
+        storage->list[i].virtual_space_status = H5O_VIRTUAL_STATUS_CORRECT;
+
+        /* Mark source extent as invalid */
+        storage->list[i].source_space_status = H5O_VIRTUAL_STATUS_INVALID;
+
+        /* Normalize offsets, toss out old offset values */
+        if(H5S_hyper_normalize_offset(storage->list[i].source_dset.virtual_select, old_offset) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_BADSELECT, FAIL, "unable to normalize dataspace by offset")
+        if(H5S_hyper_normalize_offset(storage->list[i].source_select, old_offset) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_BADSELECT, FAIL, "unable to normalize dataspace by offset")
+    } /* end for */
+
+    /* Get dataset access property list */
+    if(NULL == (dapl = (H5P_genplist_t *)H5I_object(dapl_id)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for dapl ID")
+
+    /* Get view option */
+    if(H5P_get(dapl, H5D_ACS_VDS_VIEW_NAME, &storage->view) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get virtual view option")
+
+    /* Get printf gap if view is H5D_VDS_LAST_AVAILABLE, otherwise set to 0 */
+    if(storage->view == H5D_VDS_LAST_AVAILABLE) {
+        if(H5P_get(dapl, H5D_ACS_VDS_PRINTF_GAP_NAME, &storage->printf_gap) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get virtual printf gap")
+    } /* end if */
+    else
+        storage->printf_gap = (hsize_t)0;
+
+    /* Retrieve VDS file FAPL to layout */
+    if(storage->source_fapl <= 0)
+        if((storage->source_fapl = H5F_get_access_plist(f, FALSE)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get fapl")
+
+    /* Copy DAPL to layout */
+    if(storage->source_dapl <= 0)
+        if((storage->source_dapl = H5P_copy_plist(dapl, FALSE)) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "can't copy dapl")
+
+    /* Mark layout as not fully initialized (must be done prior to I/O for
+     * unlimited/printf selections) */
+    storage->init = FALSE;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_is_space_alloc
+ *
+ * Purpose:     Query if space is allocated for layout
+ *
+ * Return:      TRUE if space is allocated
+ *              FALSE if it is not
+ *              Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              February 6, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5D__virtual_is_space_alloc(const H5O_storage_t H5_ATTR_UNUSED *storage)
+{
+    hbool_t ret_value;                  /* Return value */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Just return TRUE, since the global heap object containing the mappings is
+     * created when the layout message is encoded, and nothing else needs to be
+     * allocated for virtual datasets.  This also ensures that the library never
+     * assumes (falsely) that no data is present in the dataset, causing errors.
+     */
+    ret_value = TRUE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_is_space_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_pre_io
+ *
+ * Purpose:     Project all virtual mappings onto mem_space, with the
+ *              results stored in projected_mem_space for each mapping.
+ *              Opens all source datasets if possible.  The total number
+ *              of elements is stored in tot_nelmts.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              June 3, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__virtual_pre_io(H5D_io_info_t *io_info,
+    H5O_storage_virtual_t *storage, const H5S_t *file_space,
+    const H5S_t *mem_space, hsize_t *tot_nelmts)
+{
+    hssize_t    select_nelmts;              /* Number of elements in selection */
+    hsize_t     bounds_start[H5S_MAX_RANK]; /* Selection bounds start */
+    hsize_t     bounds_end[H5S_MAX_RANK];   /* Selection bounds end */
+    int         rank;
+    hbool_t     bounds_init = FALSE;        /* Whether bounds_start, bounds_end, and rank are valid */
+    size_t      i, j, k;                    /* Local index variables */
+    herr_t      ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(storage);
+    HDassert(mem_space);
+    HDassert(file_space);
+    HDassert(tot_nelmts);
+
+    /* Initialize layout if necessary */
+    if(!storage->init)
+        if(H5D__virtual_init_all(io_info->dset, io_info->dxpl_id) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "can't initialize virtual layout")
+
+    /* Initialize tot_nelmts */
+    *tot_nelmts = 0;
+
+    /* Iterate over mappings */
+    for(i = 0; i < storage->list_nused; i++) {
+        /* Sanity check that the virtual space has been patched by now */
+        HDassert(storage->list[i].virtual_space_status == H5O_VIRTUAL_STATUS_CORRECT);
+
+        /* Check for "printf" source dataset resolution */
+        if(storage->list[i].psfn_nsubs || storage->list[i].psdn_nsubs) {
+            hbool_t partial_block;
+
+            HDassert(storage->list[i].unlim_dim_virtual >= 0);
+
+            /* Get selection bounds if necessary */
+            if(!bounds_init) {
+                /* Get rank of VDS */
+                if((rank = H5S_GET_EXTENT_NDIMS(io_info->dset->shared->space)) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get number of dimensions")
+
+                /* Get selection bounds */
+                if(H5S_SELECT_BOUNDS(file_space, bounds_start, bounds_end) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get selection bounds")
+
+                /* Adjust bounds_end to represent the extent just enclosing them
+                 * (add 1) */
+                for(j = 0; j < (size_t)rank; j++)
+                    bounds_end[j]++;
+
+                /* Bounds are now initialized */
+                bounds_init = TRUE;
+            } /* end if */
+
+            /* Get index of first block in virtual selection */
+            storage->list[i].sub_dset_io_start = (size_t)H5S_hyper_get_first_inc_block(storage->list[i].source_dset.virtual_select, bounds_start[storage->list[i].unlim_dim_virtual], NULL);
+
+            /* Get index of first block outside of virtual selection */
+            storage->list[i].sub_dset_io_end = (size_t)H5S_hyper_get_first_inc_block(storage->list[i].source_dset.virtual_select, bounds_end[storage->list[i].unlim_dim_virtual], &partial_block);
+            if(partial_block)
+                storage->list[i].sub_dset_io_end++;
+            if(storage->list[i].sub_dset_io_end > storage->list[i].sub_dset_nused)
+                storage->list[i].sub_dset_io_end = storage->list[i].sub_dset_nused;
+
+            /* Iterate over sub-source dsets */
+            for(j = storage->list[i].sub_dset_io_start; j < storage->list[i].sub_dset_io_end; j++) {
+                /* Check for clipped virtual selection */
+                if(!storage->list[i].sub_dset[j].clipped_virtual_select) {
+                    hsize_t start[H5S_MAX_RANK];
+                    /* This should only be NULL if this is a partial block */
+                    HDassert((j == (storage->list[i].sub_dset_io_end - 1)) && partial_block);
+
+                    /* If the source space status is not correct, we must try to
+                     * open the source dataset to patch it */
+                    if(storage->list[i].source_space_status != H5O_VIRTUAL_STATUS_CORRECT) {
+                        HDassert(!storage->list[i].sub_dset[j].dset);
+                        if(H5D__virtual_open_source_dset(io_info->dset, &storage->list[i], &storage->list[i].sub_dset[j], io_info->dxpl_id) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "unable to open source dataset")
+                    } /* end if */
+
+                    /* If we obtained a valid source space, we must create
+                     * clipped source and virtual selections, otherwise we
+                     * cannot do this and we will leave them NULL.  This doesn't
+                     * hurt anything because we can't do I/O because the dataset
+                     * must not have been found. */
+                    if(storage->list[i].source_space_status == H5O_VIRTUAL_STATUS_CORRECT) {
+                        hsize_t tmp_dims[H5S_MAX_RANK];
+                        hsize_t vbounds_end[H5S_MAX_RANK];
+
+                        /* Get bounds of virtual selection */
+                        if(H5S_SELECT_BOUNDS(storage->list[i].sub_dset[j].virtual_select, tmp_dims, vbounds_end) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "unable to get selection bounds")
+
+                        HDassert(bounds_init);
+
+                        /* Convert bounds to extent (add 1) */
+                        for(k = 0; k < (size_t)rank; k++)
+                            vbounds_end[k]++;
+
+                        /* Temporarily set extent of virtual selection to bounds */
+                        if(H5S_set_extent(storage->list[i].sub_dset[j].virtual_select, vbounds_end) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to modify size of data space")
+
+                        /* Get current VDS dimensions */
+                        if(H5S_get_simple_extent_dims(io_info->dset->shared->space, tmp_dims, NULL) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get VDS dimensions")
+
+                        /* Copy virtual selection */
+                        if(NULL == (storage->list[i].sub_dset[j].clipped_virtual_select = H5S_copy(storage->list[i].sub_dset[j].virtual_select, FALSE, TRUE)))
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to copy virtual selection")
+
+                        /* Clip virtual selection to real virtual extent */
+                        (void)HDmemset(start, 0, sizeof(start));
+                        if(H5S_select_hyperslab(storage->list[i].sub_dset[j].clipped_virtual_select, H5S_SELECT_AND, start, NULL, tmp_dims, NULL) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTSELECT, FAIL, "unable to clip hyperslab")
+
+                        /* Project intersection of virtual space and clipped
+                         * virtual space onto source space (create
+                         * clipped_source_select) */
+                        if(H5S_select_project_intersection(storage->list[i].sub_dset[j].virtual_select, storage->list[i].source_select, storage->list[i].sub_dset[j].clipped_virtual_select, &storage->list[i].sub_dset[j].clipped_source_select) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, FAIL, "can't project virtual intersection onto memory space")
+
+                        /* Set extents of virtual_select and
+                         * clipped_virtual_select to virtual extent */
+                        if(H5S_set_extent(storage->list[i].sub_dset[j].virtual_select, tmp_dims) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to modify size of data space")
+                        if(H5S_set_extent(storage->list[i].sub_dset[j].clipped_virtual_select, tmp_dims) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to modify size of data space")
+                    } /* end if */
+                } /* end if */
+
+                /* Only continue if we managed to obtain a
+                 * clipped_virtual_select */
+                if(storage->list[i].sub_dset[j].clipped_virtual_select) {
+                    /* Project intersection of file space and mapping virtual space
+                     * onto memory space */
+                    if(H5S_select_project_intersection(file_space, mem_space, storage->list[i].sub_dset[j].clipped_virtual_select, &storage->list[i].sub_dset[j].projected_mem_space) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, FAIL, "can't project virtual intersection onto memory space")
+
+                    /* Check number of elements selected */
+                    if((select_nelmts = (hssize_t)H5S_GET_SELECT_NPOINTS(storage->list[i].sub_dset[j].projected_mem_space)) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTCOUNT, FAIL, "unable to get number of elements in selection")
+
+                    /* Check if anything is selected */
+                    if(select_nelmts > (hssize_t)0) {
+                        /* Open source dataset */
+                        if(!storage->list[i].sub_dset[j].dset)
+                            /* Try to open dataset */
+                            if(H5D__virtual_open_source_dset(io_info->dset, &storage->list[i], &storage->list[i].sub_dset[j], io_info->dxpl_id) < 0)
+                                HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "unable to open source dataset")
+
+                        /* If the source dataset is not open, mark the selected
+                         * elements as zero so projected_mem_space is freed */
+                        if(!storage->list[i].sub_dset[j].dset)
+                            select_nelmts = (hssize_t)0;
+                    } /* end if */
+
+                    /* If there are not elements selected in this mapping, free
+                     * projected_mem_space, otherwise update tot_nelmts */
+                    if(select_nelmts == (hssize_t)0) {
+                        if(H5S_close(storage->list[i].sub_dset[j].projected_mem_space) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "can't close projected memory space")
+                        storage->list[i].sub_dset[j].projected_mem_space = NULL;
+                    } /* end if */
+                    else 
+                        *tot_nelmts += (hsize_t)select_nelmts;
+                } /* end if */
+            } /* end for */
+        } /* end if */
+        else {
+            if(storage->list[i].source_dset.clipped_virtual_select) {
+                /* Project intersection of file space and mapping virtual space onto
+                 * memory space */
+                if(H5S_select_project_intersection(file_space, mem_space, storage->list[i].source_dset.clipped_virtual_select, &storage->list[i].source_dset.projected_mem_space) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, FAIL, "can't project virtual intersection onto memory space")
+
+                /* Check number of elements selected, add to tot_nelmts */
+                if((select_nelmts = (hssize_t)H5S_GET_SELECT_NPOINTS(storage->list[i].source_dset.projected_mem_space)) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTCOUNT, FAIL, "unable to get number of elements in selection")
+
+                /* Check if anything is selected */
+                if(select_nelmts > (hssize_t)0) {
+                    /* Open source dataset */
+                    if(!storage->list[i].source_dset.dset) 
+                        /* Try to open dataset */
+                        if(H5D__virtual_open_source_dset(io_info->dset, &storage->list[i], &storage->list[i].source_dset, io_info->dxpl_id) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "unable to open source dataset")
+
+                    /* If the source dataset is not open, mark the selected elements
+                     * as zero so projected_mem_space is freed */
+                    if(!storage->list[i].source_dset.dset)
+                        select_nelmts = (hssize_t)0;
+                } /* end if */
+
+                /* If there are not elements selected in this mapping, free
+                 * projected_mem_space, otherwise update tot_nelmts */
+                if(select_nelmts == (hssize_t)0) {
+                    if(H5S_close(storage->list[i].source_dset.projected_mem_space) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "can't close projected memory space")
+                    storage->list[i].source_dset.projected_mem_space = NULL;
+                } /* end if */
+                else
+                    *tot_nelmts += (hsize_t)select_nelmts;
+            } /* end if */
+            else {
+                /* If there is no clipped_dim_virtual, this must be an unlimited
+                 * selection whose dataset was not found in the last call to
+                 * H5Dget_space().  Do not attempt to open it as this might
+                 * affect the extent and we are not going to recalculate it
+                 * here. */
+                HDassert(storage->list[i].unlim_dim_virtual >= 0);
+                HDassert(!storage->list[i].source_dset.dset);
+            } /* end else */
+        } /* end else */
+    } /* end for */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_pre_io() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_post_io
+ *
+ * Purpose:     Frees memory structures allocated by H5D__virtual_pre_io.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              June 4, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__virtual_post_io(H5O_storage_virtual_t *storage)
+{
+    size_t      i, j;                       /* Local index variables */
+    herr_t      ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(storage);
+
+    /* Iterate over mappings */
+    for(i = 0; i < storage->list_nused; i++)
+        /* Check for "printf" source dataset resolution */
+        if(storage->list[i].psfn_nsubs || storage->list[i].psdn_nsubs) {
+            /* Iterate over sub-source dsets */
+            for(j = storage->list[i].sub_dset_io_start; j < storage->list[i].sub_dset_io_end; j++)
+                /* Close projected memory space */
+                if(storage->list[i].sub_dset[j].projected_mem_space) {
+                    if(H5S_close(storage->list[i].sub_dset[j].projected_mem_space) < 0)
+                        HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "can't close temporary space")
+                    storage->list[i].sub_dset[j].projected_mem_space = NULL;
+                } /* end if */
+        } /* end if */
+        else
+            /* Close projected memory space */
+            if(storage->list[i].source_dset.projected_mem_space) {
+                if(H5S_close(storage->list[i].source_dset.projected_mem_space) < 0)
+                    HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "can't close temporary space")
+                storage->list[i].source_dset.projected_mem_space = NULL;
+            } /* end if */
+
+    /* Note the lack of a done: label.  This is because there are no HGOTO_ERROR
+     * calls.  If one is added, a done: label must also be added */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_post_io() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_read_one
+ *
+ * Purpose:     Read from a singe source dataset in a virtual dataset.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              May 15, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__virtual_read_one(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    const H5S_t *file_space, H5O_storage_virtual_srcdset_t *source_dset)
+{
+    H5S_t       *projected_src_space = NULL; /* File space for selection in a single source dataset */
+    herr_t      ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(source_dset);
+
+    /* Only perform I/O if there is a projected memory space, otherwise there
+     * were no elements in the projection or the source dataset could not be
+     * opened */
+    if(source_dset->projected_mem_space) {
+        HDassert(source_dset->dset);
+        HDassert(source_dset->clipped_source_select);
+
+        /* Project intersection of file space and mapping virtual space onto
+         * mapping source space */
+        if(H5S_select_project_intersection(source_dset->clipped_virtual_select, source_dset->clipped_source_select, file_space, &projected_src_space) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, FAIL, "can't project virtual intersection onto source space")
+
+        /* Perform read on source dataset */
+        if(H5D__read(source_dset->dset, type_info->dst_type_id, source_dset->projected_mem_space, projected_src_space, io_info->dxpl_id, io_info->u.rbuf) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "can't read source dataset")
+
+        /* Close projected_src_space */
+        if(H5S_close(projected_src_space) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "can't close projected source space")
+        projected_src_space = NULL;
+    } /* end if */
+
+done:
+    /* Release allocated resources on failure */
+    if(projected_src_space) {
+        HDassert(ret_value < 0);
+        if(H5S_close(projected_src_space) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "can't close projected source space")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_read_one() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_read
+ *
+ * Purpose:     Read from a virtual dataset.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              February 6, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__virtual_read(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space,
+    H5D_chunk_map_t H5_ATTR_UNUSED *fm)
+{
+    H5O_storage_virtual_t *storage;         /* Convenient pointer into layout struct */
+    hsize_t     tot_nelmts;                 /* Total number of elements mapped to mem_space */
+    H5S_t       *fill_space = NULL;         /* Space to fill with fill value */
+    size_t      i, j;                       /* Local index variables */
+    herr_t      ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(io_info);
+    HDassert(io_info->u.rbuf);
+    HDassert(type_info);
+    HDassert(mem_space);
+    HDassert(file_space);
+
+    storage = &io_info->dset->shared->layout.storage.u.virt;
+    HDassert((storage->view == H5D_VDS_FIRST_MISSING) || (storage->view == H5D_VDS_LAST_AVAILABLE));
+
+#ifdef H5_HAVE_PARALLEL
+    /* Parallel reads are not supported (yet) */
+    if(H5F_HAS_FEATURE(io_info->dset->oloc.file, H5FD_FEAT_HAS_MPI))
+        HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "parallel reads not supported on virtual datasets")
+#endif /* H5_HAVE_PARALLEL */
+
+    /* Prepare for I/O operation */
+    if(H5D__virtual_pre_io(io_info, storage, file_space, mem_space, &tot_nelmts) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, FAIL, "unable to prepare for I/O operation")
+
+    /* Iterate over mappings */
+    for(i = 0; i < storage->list_nused; i++) {
+        /* Sanity check that the virtual space has been patched by now */
+        HDassert(storage->list[i].virtual_space_status == H5O_VIRTUAL_STATUS_CORRECT);
+
+        /* Check for "printf" source dataset resolution */
+        if(storage->list[i].psfn_nsubs || storage->list[i].psdn_nsubs) {
+            /* Iterate over sub-source dsets */
+            for(j = storage->list[i].sub_dset_io_start;
+                    j < storage->list[i].sub_dset_io_end; j++)
+                if(H5D__virtual_read_one(io_info, type_info, file_space, &storage->list[i].sub_dset[j]) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "unable to read source dataset")
+        } /* end if */
+        else
+            /* Read from source dataset */
+            if(H5D__virtual_read_one(io_info, type_info, file_space, &storage->list[i].source_dset) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "unable to read source dataset")
+    } /* end for */
+
+    /* Fill unmapped part of buffer with fill value */
+    if(tot_nelmts < nelmts) {
+        H5D_fill_value_t fill_status;       /* Fill value status */
+
+        /* Check the fill value status */
+        if(H5P_is_fill_value_defined(&io_info->dset->shared->dcpl_cache.fill, &fill_status) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't tell if fill value defined")
+
+        /* Always write fill value to memory buffer unless it is undefined */
+        if(fill_status != H5D_FILL_VALUE_UNDEFINED) {
+            /* Start with fill space equal to memory space */
+            if(NULL == (fill_space = H5S_copy(mem_space, FALSE, TRUE)))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTCOPY, FAIL, "unable to copy memory selection")
+
+            /* Iterate over mappings */
+            for(i = 0; i < storage->list_nused; i++)
+                /* Check for "printf" source dataset resolution */
+                if(storage->list[i].psfn_nsubs || storage->list[i].psdn_nsubs) {
+                    /* Iterate over sub-source dsets */
+                    for(j = storage->list[i].sub_dset_io_start;
+                            j < storage->list[i].sub_dset_io_end; j++)
+                        if(storage->list[i].sub_dset[j].projected_mem_space)
+                            if(H5S_select_subtract(fill_space, storage->list[i].sub_dset[j].projected_mem_space) < 0)
+                                HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, FAIL, "unable to clip fill selection")
+                } /* end if */
+                else
+                    if(storage->list[i].source_dset.projected_mem_space)
+                        /* Subtract projected memory space from fill space */
+                        if(H5S_select_subtract(fill_space, storage->list[i].source_dset.projected_mem_space) < 0)
+                            HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, FAIL, "unable to clip fill selection")
+
+            /* Write fill values to memory buffer */
+            if(H5D__fill(io_info->dset->shared->dcpl_cache.fill.buf, io_info->dset->shared->type, io_info->u.rbuf, type_info->mem_type, fill_space, io_info->dxpl_id) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "filling buf failed")
+
+#ifndef NDEBUG
+            /* Make sure the total number of elements written (including fill
+             * values) >= nelmts */
+            {
+                hssize_t    select_nelmts;  /* Number of elements in selection */
+
+                /* Get number of elements in fill dataspace */
+                if((select_nelmts = (hssize_t)H5S_GET_SELECT_NPOINTS(fill_space)) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTCOUNT, FAIL, "unable to get number of elements in selection")
+
+                /* Verify number of elements is correct.  Note that since we
+                 * don't check for overlap we can't assert that these are equal
+                 */
+                HDassert((tot_nelmts + (hsize_t)select_nelmts) >= nelmts);
+            } /* end block */
+#endif /* NDEBUG */
+        } /* end if */
+    } /* end if */
+
+done:
+    /* Cleanup I/O operation */
+    if(H5D__virtual_post_io(storage) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "can't cleanup I/O operation")
+
+    /* Close fill space */
+    if(fill_space)
+        if(H5S_close(fill_space) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "can't close fill space")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_read() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_write_one
+ *
+ * Purpose:     Write to a singe source dataset in a virtual dataset.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              May 15, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__virtual_write_one(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    const H5S_t *file_space, H5O_storage_virtual_srcdset_t *source_dset)
+{
+    H5S_t       *projected_src_space = NULL; /* File space for selection in a single source dataset */
+    herr_t      ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(source_dset);
+
+    /* Only perform I/O if there is a projected memory space, otherwise there
+     * were no elements in the projection */
+    if(source_dset->projected_mem_space) {
+        HDassert(source_dset->dset);
+        HDassert(source_dset->clipped_source_select);
+
+        /* In the future we may wish to extent this implementation to extend
+         * source datasets if a write to a virtual dataset goes past the current
+         * extent in the unlimited dimension.  -NAF */
+        /* Project intersection of file space and mapping virtual space onto
+         * mapping source space */
+        if(H5S_select_project_intersection(source_dset->virtual_select, source_dset->clipped_source_select, file_space, &projected_src_space) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, FAIL, "can't project virtual intersection onto source space")
+
+        /* Perform write on source dataset */
+        if(H5D__write(source_dset->dset, type_info->dst_type_id, source_dset->projected_mem_space, projected_src_space, io_info->dxpl_id, io_info->u.wbuf) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "can't write to source dataset")
+
+        /* Close projected_src_space */
+        if(H5S_close(projected_src_space) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "can't close projected source space")
+        projected_src_space = NULL;
+    } /* end if */
+
+done:
+    /* Release allocated resources on failure */
+    if(projected_src_space) {
+        HDassert(ret_value < 0);
+        if(H5S_close(projected_src_space) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "can't close projected source space")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_write_one() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_write
+ *
+ * Purpose:     Write to a virtual dataset.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              February 6, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__virtual_write(H5D_io_info_t *io_info, const H5D_type_info_t *type_info,
+    hsize_t nelmts, const H5S_t *file_space, const H5S_t *mem_space,
+    H5D_chunk_map_t H5_ATTR_UNUSED *fm)
+{
+    H5O_storage_virtual_t *storage;         /* Convenient pointer into layout struct */
+    hsize_t     tot_nelmts;                 /* Total number of elements mapped to mem_space */
+    size_t      i, j;                       /* Local index variables */
+    herr_t      ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(io_info);
+    HDassert(io_info->u.wbuf);
+    HDassert(type_info);
+    HDassert(mem_space);
+    HDassert(file_space);
+
+    storage = &io_info->dset->shared->layout.storage.u.virt;
+    HDassert((storage->view == H5D_VDS_FIRST_MISSING) || (storage->view == H5D_VDS_LAST_AVAILABLE));
+
+#ifdef H5_HAVE_PARALLEL
+    /* Parallel writes are not supported (yet) */
+    if(H5F_HAS_FEATURE(io_info->dset->oloc.file, H5FD_FEAT_HAS_MPI))
+        HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "parallel writes not supported on virtual datasets")
+#endif /* H5_HAVE_PARALLEL */
+
+    /* Prepare for I/O operation */
+    if(H5D__virtual_pre_io(io_info, storage, file_space, mem_space, &tot_nelmts) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, FAIL, "unable to prepare for I/O operation")
+
+    /* Fail if there are unmapped parts of the selection as they would not be
+     * written */
+    if(tot_nelmts != nelmts)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, "write requested to unmapped portion of virtual dataset")
+
+    /* Iterate over mappings */
+    for(i = 0; i < storage->list_nused; i++) {
+        /* Sanity check that virtual space has been patched by now */
+        HDassert(storage->list[i].virtual_space_status == H5O_VIRTUAL_STATUS_CORRECT);
+
+        /* Check for "printf" source dataset resolution */
+        if(storage->list[i].psfn_nsubs || storage->list[i].psdn_nsubs) {
+            /* Iterate over sub-source dsets */
+            for(j = storage->list[i].sub_dset_io_start;
+                    j < storage->list[i].sub_dset_io_end; j++)
+                if(H5D__virtual_write_one(io_info, type_info, file_space, &storage->list[i].sub_dset[j]) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to write to source dataset")
+        } /* end if */
+        else
+            /* Write to source dataset */
+            if(H5D__virtual_write_one(io_info, type_info, file_space, &storage->list[i].source_dset) < 0)
+                HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to write to source dataset")
+    } /* end for */
+
+done:
+    /* Cleanup I/O operation */
+    if(H5D__virtual_post_io(storage) < 0)
+        HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "can't cleanup I/O operation")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_flush
+ *
+ * Purpose:     Writes all dirty data to disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              February 6, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__virtual_flush(H5D_t *dset, hid_t dxpl_id)
+{
+    H5O_storage_virtual_t *storage;         /* Convenient pointer into layout struct */
+    size_t      i, j;                       /* Local index variables */
+    herr_t      ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(dset);
+
+    storage = &dset->shared->layout.storage.u.virt;
+
+    /* Flush only open datasets */
+    for(i = 0; i < storage->list_nused; i++)
+        /* Check for "printf" source dataset resolution */
+        if(storage->list[i].psfn_nsubs || storage->list[i].psdn_nsubs) {
+            /* Iterate over sub-source dsets */
+            for(j = 0; j < storage->list[i].sub_dset_nused; j++)
+                if(storage->list[i].sub_dset[j].dset)
+                    /* Flush source dataset */
+                    if(H5D__flush_real(storage->list[i].sub_dset[j].dset, dxpl_id) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to flush source dataset")
+        } /* end if */
+        else
+            if(storage->list[i].source_dset.dset)
+                /* Flush source dataset */
+                if(H5D__flush_real(storage->list[i].source_dset.dset, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_READERROR, FAIL, "unable to flush source dataset")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_hold_source_dset_files
+ *
+ * Purpose:     Hold open the source files that are open, during a refresh event
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              November 7, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__virtual_hold_source_dset_files(const H5D_t *dset, H5D_virtual_held_file_t **head)
+{
+    H5O_storage_virtual_t *storage;         /* Convenient pointer into layout struct */
+    H5D_virtual_held_file_t *tmp;           /* Temporary held file node */
+    size_t      i;                          /* Local index variable */
+    herr_t      ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(dset);
+    HDassert(head && NULL == *head);
+
+    /* Set the convenience pointer */
+    storage = &dset->shared->layout.storage.u.virt;
+
+    /* Hold only files for open datasets */
+    for(i = 0; i < storage->list_nused; i++)
+        /* Check for "printf" source dataset resolution */
+        if(storage->list[i].psfn_nsubs || storage->list[i].psdn_nsubs) {
+            size_t      j;              /* Local index variable */
+
+            /* Iterate over sub-source dsets */
+            for(j = 0; j < storage->list[i].sub_dset_nused; j++)
+                if(storage->list[i].sub_dset[j].dset) {
+                    /* Hold open the file */
+                    H5F_INCR_NOPEN_OBJS(storage->list[i].sub_dset[j].dset->oloc.file);
+
+                    /* Allocate a node for this file */
+                    if(NULL == (tmp = H5FL_MALLOC(H5D_virtual_held_file_t)))
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate held file node")
+
+                    /* Set up node & connect to list */
+                    tmp->file = storage->list[i].sub_dset[j].dset->oloc.file;
+                    tmp->next = *head;
+                    *head = tmp;
+                } /* end if */
+        } /* end if */
+        else
+            if(storage->list[i].source_dset.dset) {
+                /* Hold open the file */
+                H5F_INCR_NOPEN_OBJS(storage->list[i].source_dset.dset->oloc.file);
+
+                /* Allocate a node for this file */
+                if(NULL == (tmp = H5FL_MALLOC(H5D_virtual_held_file_t)))
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTALLOC, FAIL, "can't allocate held file node")
+
+                /* Set up node & connect to list */
+                tmp->file = storage->list[i].source_dset.dset->oloc.file;
+                tmp->next = *head;
+                *head = tmp;
+            } /* end if */
+
+done:
+    if(ret_value < 0) {
+        /* Release hold on files and delete list on error */
+        if(*head)
+            if(H5D__virtual_release_source_dset_files(*head) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "can't release source datasets' files held open")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_hold_source_dset_files() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_refresh_source_dset
+ *
+ * Purpose:     Refresh a source dataset
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              November 7, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5D__virtual_refresh_source_dset(H5D_t **dset, hid_t dxpl_id)
+{
+    hid_t       dset_id;                /* Temporary dataset identifier */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(dset && *dset);
+
+    /* Get a temporary identifier for this source dataset */
+    if((dset_id = H5I_register(H5I_DATASET, *dset, FALSE)) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "can't register source dataset ID")
+
+    /* Refresh source dataset */
+    if(H5D__refresh(dset_id, *dset, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTFLUSH, FAIL, "unable to refresh source dataset")
+
+    /* Discard the identifier & replace the dataset */
+    if(NULL == (*dset = (H5D_t *)H5I_remove(dset_id)))
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTREMOVE, FAIL, "can't unregister source dataset ID")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_refresh_source_dsets() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_refresh_source_dsets
+ *
+ * Purpose:     Refresh the source datasets
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Dana Robinson
+ *              November, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__virtual_refresh_source_dsets(H5D_t *dset, hid_t dxpl_id)
+{
+    H5O_storage_virtual_t *storage;         /* Convenient pointer into layout struct */
+    size_t      i;                          /* Local index variable */
+    herr_t      ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    HDassert(dset);
+
+    /* Set convenience pointer */
+    storage = &dset->shared->layout.storage.u.virt;
+
+    /* Refresh only open datasets */
+    for(i = 0; i < storage->list_nused; i++)
+        /* Check for "printf" source dataset resolution */
+        if(storage->list[i].psfn_nsubs || storage->list[i].psdn_nsubs) {
+            size_t      j;              /* Local index variable */
+
+            /* Iterate over sub-source datasets */
+            for(j = 0; j < storage->list[i].sub_dset_nused; j++)
+                /* Check if sub-source dataset is open */
+                if(storage->list[i].sub_dset[j].dset)
+                    /* Refresh sub-source dataset */
+                    if(H5D__virtual_refresh_source_dset(&storage->list[i].sub_dset[j].dset, dxpl_id) < 0)
+                        HGOTO_ERROR(H5E_DATASET, H5E_CANTFLUSH, FAIL, "unable to refresh source dataset")
+        } /* end if */
+        else
+            /* Check if source dataset is open */
+            if(storage->list[i].source_dset.dset)
+                /* Refresh source dataset */
+                if(H5D__virtual_refresh_source_dset(&storage->list[i].source_dset.dset, dxpl_id) < 0)
+                    HGOTO_ERROR(H5E_DATASET, H5E_CANTFLUSH, FAIL, "unable to refresh source dataset")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_refresh_source_dsets() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5D__virtual_release_source_dset_files
+ *
+ * Purpose:     Release the hold on source files that are open, during a refresh event
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              November 7, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5D__virtual_release_source_dset_files(H5D_virtual_held_file_t *head)
+{
+    herr_t      ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Release hold on files and delete list */
+    while(head) {
+        H5D_virtual_held_file_t *tmp = head->next;      /* Temporary pointer to next node */
+
+        /* Release hold on file */
+        H5F_DECR_NOPEN_OBJS(head->file);
+
+        /* Attempt to close the file */
+        /* (Should always succeed, since the 'top' source file pointer is
+         *      essentially "private" to the virtual dataset, since it wasn't
+         *      opened through an API routine -QAK)
+         */
+        if(H5F_try_close(head->file) < 0)
+            HGOTO_ERROR(H5E_DATASET, H5E_CANTCLOSEFILE, FAIL, "problem attempting file close")
+
+        /* Delete node */
+        (void)H5FL_FREE(H5D_virtual_held_file_t, head);
+
+        /* Advance to next node */
+        head = tmp;
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5D__virtual_release_source_dset_files() */
+
diff --git a/src/H5E.c b/src/H5E.c
index cd4da9f..4374f1d 100644
--- a/src/H5E.c
+++ b/src/H5E.c
@@ -45,10 +45,7 @@
 /* Module Setup */
 /****************/
 
-#define H5E_PACKAGE		/*suppress error about including H5Epkg   */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5E_init_interface
+#include "H5Emodule.h"          /* This source code file is part of the H5E module */
 
 
 /***********/
@@ -83,6 +80,7 @@
 /* Local Prototypes */
 /********************/
 /* Static function declarations */
+static herr_t H5E_set_default_auto(H5E_t *stk);
 static H5E_cls_t *H5E_register_class(const char *cls_name, const char *lib_name,
                                 const char *version);
 static herr_t  H5E_unregister_class(H5E_cls_t *cls);
@@ -100,6 +98,9 @@ static ssize_t H5E_get_num(const H5E_t *err_stack);
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 
 /*****************************/
 /* Library Private Variables */
@@ -122,7 +123,7 @@ H5FL_DEFINE_STATIC(H5E_msg_t);
 /* Error class ID class */
 static const H5I_class_t H5I_ERRCLS_CLS[1] = {{
     H5I_ERROR_CLASS,		/* ID class value */
-    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* Class flags */
     0,				/* # of reserved IDs for class */
     (H5I_free_t)H5E_unregister_class /* Callback routine for closing objects of this class */
 }};
@@ -130,7 +131,7 @@ static const H5I_class_t H5I_ERRCLS_CLS[1] = {{
 /* Error message ID class */
 static const H5I_class_t H5I_ERRMSG_CLS[1] = {{
     H5I_ERROR_MSG,		/* ID class value */
-    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* Class flags */
     0,				/* # of reserved IDs for class */
     (H5I_free_t)H5E_close_msg   /* Callback routine for closing objects of this class */
 }};
@@ -138,7 +139,7 @@ static const H5I_class_t H5I_ERRMSG_CLS[1] = {{
 /* Error stack ID class */
 static const H5I_class_t H5I_ERRSTK_CLS[1] = {{
     H5I_ERROR_STACK,		/* ID class value */
-    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* Class flags */
     0,				/* # of reserved IDs for class */
     (H5I_free_t)H5E_close_stack /* Callback routine for closing objects of this class */
 }};
@@ -173,45 +174,7 @@ done:
 
 

 /*--------------------------------------------------------------------------
- * Function:    H5E_set_default_auto
- *
- * Purpose:     Initialize "automatic" error stack reporting info to library
- *              default
- *
- * Return:      Non-negative on success/Negative on failure
- *
- * Programmer:  Quincey Koziol
- *              Thursday, November 1, 2007
- *
- *--------------------------------------------------------------------------
- */
-static herr_t
-H5E_set_default_auto(H5E_t *stk)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-#ifndef H5_NO_DEPRECATED_SYMBOLS
-#ifdef H5_USE_16_API_DEFAULT
-    stk->auto_op.vers = 1;
-#else /* H5_USE_16_API */
-    stk->auto_op.vers = 2;
-#endif /* H5_USE_16_API_DEFAULT */
-
-    stk->auto_op.func1 = stk->auto_op.func1_default = (H5E_auto1_t)H5Eprint1;
-    stk->auto_op.func2 = stk->auto_op.func2_default = (H5E_auto2_t)H5Eprint2;
-    stk->auto_op.is_default = TRUE;
-#else /* H5_NO_DEPRECATED_SYMBOLS */
-    stk->auto_op.func2 = (H5E_auto2_t)H5Eprint2;
-#endif /* H5_NO_DEPRECATED_SYMBOLS */
-
-    stk->auto_data = NULL;
-
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5E_set_default_auto() */
-
-

-/*--------------------------------------------------------------------------
- * Function:    H5E_init_interface
+ * Function:    H5E__init_package
  *
  * Purpose:     Initialize interface-specific information
  *
@@ -222,15 +185,15 @@ H5E_set_default_auto(H5E_t *stk)
  *
  *--------------------------------------------------------------------------
  */
-static herr_t
-H5E_init_interface(void)
+herr_t
+H5E__init_package(void)
 {
     H5E_cls_t   *cls;           /* Pointer to error class */
     H5E_msg_t   *msg;           /* Pointer to new error message */
     char lib_vers[128];         /* Buffer to constructu library version within */
-    herr_t      ret_value = SUCCEED;   /* Return value */
+    herr_t ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Initialize the atom group for the error class IDs */
     if(H5I_register_type(H5I_ERRCLS_CLS) < 0)
@@ -262,11 +225,11 @@ H5E_init_interface(void)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5E_init_interface() */
+} /* end H5E__init_package() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5E_term_interface
+ * Function:	H5E_term_package
  *
  * Purpose:	Terminates the H5E interface
  *
@@ -281,14 +244,14 @@ done:
  *-------------------------------------------------------------------------
  */
 int
-H5E_term_interface(void)
+H5E_term_package(void)
 {
     int	n = 0;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    if(H5_interface_initialize_g) {
-        int ncls, nmsg, nstk;
+    if(H5_PKG_INIT_VAR) {
+        int64_t ncls, nmsg, nstk;
 
         /* Check if there are any open error stacks, classes or messages */
         ncls = H5I_nmembers(H5I_ERROR_CLASS);
@@ -323,22 +286,57 @@ H5E_term_interface(void)
             n++; /*H5I*/
 	} /* end if */
         else {
-            /* Close deprecated interface */
-            n += H5E__term_deprec_interface();
-
 	    /* Destroy the error class, message, and stack id groups */
-	    (void)H5I_dec_type_ref(H5I_ERROR_STACK);
-	    (void)H5I_dec_type_ref(H5I_ERROR_CLASS);
-	    (void)H5I_dec_type_ref(H5I_ERROR_MSG);
-            n++; /*H5I*/
+	    n += (H5I_dec_type_ref(H5I_ERROR_STACK) > 0);
+	    n += (H5I_dec_type_ref(H5I_ERROR_CLASS) > 0);
+	    n += (H5I_dec_type_ref(H5I_ERROR_MSG) > 0);
 
 	    /* Mark closed */
-	    H5_interface_initialize_g = 0;
+            if(0 == n)
+                H5_PKG_INIT_VAR = FALSE;
 	} /* end else */
     } /* end if */
 
     FUNC_LEAVE_NOAPI(n)
-} /* end H5E_term_interface() */
+} /* end H5E_term_package() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:    H5E_set_default_auto
+ *
+ * Purpose:     Initialize "automatic" error stack reporting info to library
+ *              default
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, November 1, 2007
+ *
+ *--------------------------------------------------------------------------
+ */
+static herr_t
+H5E_set_default_auto(H5E_t *stk)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+#ifdef H5_USE_16_API_DEFAULT
+    stk->auto_op.vers = 1;
+#else /* H5_USE_16_API */
+    stk->auto_op.vers = 2;
+#endif /* H5_USE_16_API_DEFAULT */
+
+    stk->auto_op.func1 = stk->auto_op.func1_default = (H5E_auto1_t)H5Eprint1;
+    stk->auto_op.func2 = stk->auto_op.func2_default = (H5E_auto2_t)H5Eprint2;
+    stk->auto_op.is_default = TRUE;
+#else /* H5_NO_DEPRECATED_SYMBOLS */
+    stk->auto_op.func2 = (H5E_auto2_t)H5Eprint2;
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+    stk->auto_data = NULL;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5E_set_default_auto() */
 
 

 #ifdef H5_HAVE_THREADSAFE
@@ -360,7 +358,7 @@ H5E_term_interface(void)
 H5E_t *
 H5E_get_stack(void)
 {
-    H5E_t *estack;
+    H5E_t *estack = NULL;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -371,7 +369,7 @@ H5E_get_stack(void)
 #ifdef H5_HAVE_WIN_THREADS
         estack = (H5E_t *)LocalAlloc(LPTR, sizeof(H5E_t)); /* Win32 has to use LocalAlloc to match the LocalFree in DllMain */
 #else
-        estack = (H5E_t *)H5FL_MALLOC(H5E_t);
+        estack = (H5E_t *)HDmalloc(sizeof(H5E_t));
 #endif /* H5_HAVE_WIN_THREADS */
         HDassert(estack);
 
@@ -475,8 +473,8 @@ done:
 static H5E_cls_t *
 H5E_register_class(const char *cls_name, const char *lib_name, const char *version)
 {
-    H5E_cls_t   *cls = NULL; /* Pointer to error class */
-    H5E_cls_t   *ret_value;  /* Return value */
+    H5E_cls_t   *cls = NULL;            /* Pointer to error class */
+    H5E_cls_t   *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -631,7 +629,7 @@ done:
 static ssize_t
 H5E_get_class_name(const H5E_cls_t *cls, char *name, size_t size)
 {
-    ssize_t       len;          /* Length of error class's name */
+    ssize_t       len = 0;          /* Length of error class's name */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -812,8 +810,8 @@ done:
 static H5E_msg_t *
 H5E_create_msg(H5E_cls_t *cls, H5E_type_t msg_type, const char *msg_str)
 {
-    H5E_msg_t   *msg = NULL;    /* Pointer to new error message */
-    H5E_msg_t   *ret_value;     /* Return value */
+    H5E_msg_t   *msg = NULL;            /* Pointer to new error message */
+    H5E_msg_t   *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -967,10 +965,10 @@ done:
 static H5E_t *
 H5E_get_current_stack(void)
 {
-    H5E_t	*current_stack; /* Pointer to the current error stack */
-    H5E_t	*estack_copy=NULL;   /* Pointer to new error stack to return */
-    unsigned    u;              /* Local index variable */
-    H5E_t      *ret_value;   /* Return value */
+    H5E_t	*current_stack;         /* Pointer to the current error stack */
+    H5E_t	*estack_copy = NULL;    /* Pointer to new error stack to return */
+    unsigned    u;                      /* Local index variable */
+    H5E_t      *ret_value = NULL;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
diff --git a/src/H5EA.c b/src/H5EA.c
new file mode 100644
index 0000000..bf18239
--- /dev/null
+++ b/src/H5EA.c
@@ -0,0 +1,1117 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5EA.c
+ *			Jun 17 2008
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Implements an "extensible array" for storing elements
+ *                      in an array whose high bounds can extend and shrink.
+ *
+ *                      Please see the documentation in:
+ *                      doc/html/TechNotes/ExtensibleArray.html for a full
+ *                      description of how they work, etc.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5EAmodule.h"         /* This source code file is part of the H5EA module */
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5EApkg.h"		/* Extensible Arrays			*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5VMprivate.h"        /* Vector functions			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Typedef for generically unprotecting an object */
+typedef herr_t (*H5EA__unprotect_func_t)(void *thing, hid_t dxpl_id,
+    unsigned cache_flags);
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
+/* Extensible array client ID to class mapping */
+
+/* Remember to add client ID to H5EA_cls_id_t in H5EAprivate.h when adding a new
+ * client class..
+ */
+const H5EA_class_t *const H5EA_client_class_g[] = {
+    H5EA_CLS_CHUNK,		/* 0 - H5EA_CLS_CHUNK_ID 		*/
+    H5EA_CLS_FILT_CHUNK,	/* 1 - H5EA_CLS_FILT_CHUNK_ID 		*/
+    H5EA_CLS_TEST,		/* ? - H5EA_CLS_TEST_ID			*/
+};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5EA_t struct */
+H5FL_DEFINE_STATIC(H5EA_t);
+
+/* Declare a PQ free list to manage the element */
+H5FL_BLK_DEFINE(ea_native_elmt);
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA_create
+ *
+ * Purpose:	Creates a new empty extensible array in the file.
+ *
+ * Return:	Pointer to earray wrapper on success
+ *              NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jun 17 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERR,
+H5EA_t *, NULL, NULL,
+H5EA_create(H5F_t *f, hid_t dxpl_id, const H5EA_create_t *cparam, void *ctx_udata))
+
+    /* Local variables */
+    H5EA_t *ea = NULL;          /* Pointer to new extensible array */
+    H5EA_hdr_t *hdr = NULL;     /* The extensible array header information */
+    haddr_t ea_addr;            /* Array header address */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(cparam);
+
+    /* H5EA interface sanity check */
+    HDcompile_assert(H5EA_NUM_CLS_ID == NELMTS(H5EA_client_class_g));
+
+    /* Create extensible array header */
+    if(HADDR_UNDEF == (ea_addr = H5EA__hdr_create(f, dxpl_id, cparam, ctx_udata)))
+	H5E_THROW(H5E_CANTINIT, "can't create extensible array header")
+
+    /* Allocate extensible array wrapper */
+    if(NULL == (ea = H5FL_MALLOC(H5EA_t)))
+	H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array info")
+
+    /* Lock the array header into memory */
+    if(NULL == (hdr = H5EA__hdr_protect(f, dxpl_id, ea_addr, ctx_udata, H5AC__NO_FLAGS_SET)))
+	H5E_THROW(H5E_CANTPROTECT, "unable to load extensible array header")
+
+    /* Point extensible array wrapper at header and bump it's ref count */
+    ea->hdr = hdr;
+    if(H5EA__hdr_incr(ea->hdr) < 0)
+	H5E_THROW(H5E_CANTINC, "can't increment reference count on shared array header")
+
+    /* Increment # of files using this array header */
+    if(H5EA__hdr_fuse_incr(ea->hdr) < 0)
+	H5E_THROW(H5E_CANTINC, "can't increment file reference count on shared array header")
+
+    /* Set file pointer for this array open context */
+    ea->f = f;
+
+    /* Set the return value */
+    ret_value = ea;
+
+CATCH
+
+    if(hdr && H5EA__hdr_unprotect(hdr, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+	H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array header")
+    if(!ret_value)
+        if(ea && H5EA_close(ea, dxpl_id) < 0)
+            H5E_THROW(H5E_CLOSEERROR, "unable to close extensible array")
+
+END_FUNC(PRIV)  /* end H5EA_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA_open
+ *
+ * Purpose:	Opens an existing extensible array in the file.
+ *
+ * Return:	Pointer to array wrapper on success
+ *              NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 28 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERR,
+H5EA_t *, NULL, NULL,
+H5EA_open(H5F_t *f, hid_t dxpl_id, haddr_t ea_addr, void *ctx_udata))
+
+    /* Local variables */
+    H5EA_t *ea = NULL;          /* Pointer to new extensible array wrapper */
+    H5EA_hdr_t *hdr = NULL;     /* The extensible array header information */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(ea_addr));
+
+    /* Load the array header into memory */
+#ifdef QAK
+HDfprintf(stderr, "%s: ea_addr = %a\n", FUNC, ea_addr);
+#endif /* QAK */
+    if(NULL == (hdr = H5EA__hdr_protect(f, dxpl_id, ea_addr, ctx_udata, H5AC__READ_ONLY_FLAG)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to load extensible array header, address = %llu", (unsigned long long)ea_addr)
+
+    /* Check for pending array deletion */
+    if(hdr->pending_delete)
+        H5E_THROW(H5E_CANTOPENOBJ, "can't open extensible array pending deletion")
+
+    /* Create fractal heap info */
+    if(NULL == (ea = H5FL_MALLOC(H5EA_t)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array info")
+
+    /* Point extensible array wrapper at header */
+    ea->hdr = hdr;
+    if(H5EA__hdr_incr(ea->hdr) < 0)
+        H5E_THROW(H5E_CANTINC, "can't increment reference count on shared array header")
+
+    /* Increment # of files using this array header */
+    if(H5EA__hdr_fuse_incr(ea->hdr) < 0)
+        H5E_THROW(H5E_CANTINC, "can't increment file reference count on shared array header")
+
+    /* Set file pointer for this array open context */
+    ea->f = f;
+
+    /* Set the return value */
+    ret_value = ea;
+
+CATCH
+
+    if(hdr && H5EA__hdr_unprotect(hdr, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array header")
+    if(!ret_value)
+        if(ea && H5EA_close(ea, dxpl_id) < 0)
+            H5E_THROW(H5E_CLOSEERROR, "unable to close extensible array")
+
+END_FUNC(PRIV)  /* end H5EA_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA_get_nelmts
+ *
+ * Purpose:	Query the current number of elements in array
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 21 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, NOERR,
+herr_t, SUCCEED, -,
+H5EA_get_nelmts(const H5EA_t *ea, hsize_t *nelmts))
+
+    /* Local variables */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(ea);
+    HDassert(nelmts);
+
+    /* Retrieve the max. index set */
+    *nelmts = ea->hdr->stats.stored.max_idx_set;
+
+END_FUNC(PRIV)  /* end H5EA_get_nelmts() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA_get_addr
+ *
+ * Purpose:	Query the address of the array
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 21 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, NOERR,
+herr_t, SUCCEED, -,
+H5EA_get_addr(const H5EA_t *ea, haddr_t *addr))
+
+    /* Local variables */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(ea);
+    HDassert(ea->hdr);
+    HDassert(addr);
+
+    /* Retrieve the address of the extensible array's header */
+    *addr = ea->hdr->addr;
+
+END_FUNC(PRIV)  /* end H5EA_get_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA_lookup_elmt
+ *
+ * Purpose:	Retrieve the metadata object and the element buffer for a
+ *              given element in the array.
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep  9 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__lookup_elmt(const H5EA_t *ea, hid_t dxpl_id, hsize_t idx, unsigned thing_acc,
+    void **thing, uint8_t **thing_elmt_buf, hsize_t *thing_elmt_idx,
+    H5EA__unprotect_func_t *thing_unprot_func))
+
+    /* Local variables */
+    H5EA_hdr_t *hdr = ea->hdr;          /* Header for EA */
+    H5EA_iblock_t *iblock = NULL;       /* Pointer to index block for EA */
+    H5EA_sblock_t *sblock = NULL;       /* Pointer to super block for EA */
+    H5EA_dblock_t *dblock = NULL;       /* Pointer to data block for EA */
+    H5EA_dblk_page_t *dblk_page = NULL; /* Pointer to data block page for EA */
+    unsigned iblock_cache_flags = H5AC__NO_FLAGS_SET;   /* Flags to unprotecting index block */
+    unsigned sblock_cache_flags = H5AC__NO_FLAGS_SET;   /* Flags to unprotecting super block */
+    hbool_t stats_changed = FALSE;      /* Whether array statistics changed */
+    hbool_t hdr_dirty = FALSE;          /* Whether the array header changed */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+HDfprintf(stderr, "%s: Index %Hu\n", FUNC, idx);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(ea);
+    HDassert(hdr);
+    HDassert(thing);
+    HDassert(thing_elmt_buf);
+    HDassert(thing_unprot_func);
+
+    /* only the H5AC__READ_ONLY_FLAG may be set in thing_acc */
+    HDassert((thing_acc & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
+    /* Set the shared array header's file context for this operation */
+    hdr->f = ea->f;
+
+    /* Reset the pointers to the 'thing' info */
+    *thing = NULL;
+    *thing_elmt_buf = NULL;
+    *thing_elmt_idx = 0;
+    *thing_unprot_func = (H5EA__unprotect_func_t)NULL;
+
+    /* Check if we should create the index block */
+    if(!H5F_addr_defined(hdr->idx_blk_addr)) {
+#ifdef QAK
+HDfprintf(stderr, "%s: Index block address not defined!\n", FUNC, idx);
+#endif /* QAK */
+        /* Check if we are allowed to create the thing */
+        if(0 == (thing_acc & H5AC__READ_ONLY_FLAG)) { /* i.e. r/w access */
+            /* Create the index block */
+            hdr->idx_blk_addr = H5EA__iblock_create(hdr, dxpl_id, &stats_changed);
+            if(!H5F_addr_defined(hdr->idx_blk_addr))
+                H5E_THROW(H5E_CANTCREATE, "unable to create index block")
+            hdr_dirty = TRUE;
+        } /* end if */
+        else
+            H5_LEAVE(SUCCEED)
+    } /* end if */
+#ifdef QAK
+HDfprintf(stderr, "%s: Index block address is: %a\n", FUNC, hdr->idx_blk_addr);
+#endif /* QAK */
+
+    /* Protect index block */
+    if(NULL == (iblock = H5EA__iblock_protect(hdr, dxpl_id, thing_acc)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect extensible array index block, address = %llu", (unsigned long long)hdr->idx_blk_addr)
+
+    /* Check if element is in index block */
+    if(idx < hdr->cparam.idx_blk_elmts) {
+        /* Set 'thing' info to refer to the index block */
+        *thing = iblock;
+        *thing_elmt_buf = (uint8_t *)iblock->elmts;
+        *thing_elmt_idx = idx;
+        *thing_unprot_func = (H5EA__unprotect_func_t)H5EA__iblock_unprotect;
+    } /* end if */
+    else {
+        unsigned sblk_idx;      /* Which superblock does this index fall in? */
+        size_t dblk_idx;        /* Data block index */
+        hsize_t elmt_idx;       /* Offset of element in super block */
+
+        /* Get super block index where element is located */
+        sblk_idx = H5EA__dblock_sblk_idx(hdr, idx);
+#ifdef QAK
+HDfprintf(stderr, "%s: sblk_idx = %u, iblock->nsblks = %Zu\n", FUNC, sblk_idx, iblock->nsblks);
+#endif /* QAK */
+
+        /* Adjust index to offset in super block */
+        elmt_idx = idx - (hdr->cparam.idx_blk_elmts + hdr->sblk_info[sblk_idx].start_idx);
+#ifdef QAK
+HDfprintf(stderr, "%s: after adjusting for super block elements, elmt_idx = %Hu\n", FUNC, elmt_idx);
+#endif /* QAK */
+
+        /* Check for data block containing element address in the index block */
+        if(sblk_idx < iblock->nsblks) {
+#ifdef QAK
+HDfprintf(stderr, "%s: Element in data block pointed to by address in index block\n", FUNC);
+#endif /* QAK */
+            /* Compute the data block index in index block */
+            dblk_idx = (size_t)(hdr->sblk_info[sblk_idx].start_dblk + (elmt_idx / hdr->sblk_info[sblk_idx].dblk_nelmts));
+#ifdef QAK
+HDfprintf(stderr, "%s: dblk_idx = %u, iblock->ndblk_addrs = %Zu\n", FUNC, dblk_idx, iblock->ndblk_addrs);
+#endif /* QAK */
+            HDassert(dblk_idx < iblock->ndblk_addrs);
+
+            /* Check if the data block has been allocated on disk yet */
+            if(!H5F_addr_defined(iblock->dblk_addrs[dblk_idx])) {
+                /* Check if we are allowed to create the thing */
+                if(0 == (thing_acc & H5AC__READ_ONLY_FLAG)) { /* i.e. r/w access */
+                    haddr_t dblk_addr;        /* Address of data block created */
+                    hsize_t dblk_off;         /* Offset of data block in array */
+
+                    /* Create data block */
+                    dblk_off = hdr->sblk_info[sblk_idx].start_idx + (dblk_idx * hdr->sblk_info[sblk_idx].dblk_nelmts);
+                    dblk_addr = H5EA__dblock_create(hdr, dxpl_id, iblock, &stats_changed, dblk_off, hdr->sblk_info[sblk_idx].dblk_nelmts);
+                    if(!H5F_addr_defined(dblk_addr))
+                        H5E_THROW(H5E_CANTCREATE, "unable to create extensible array data block")
+
+                    /* Set data block address in index block */
+                    iblock->dblk_addrs[dblk_idx] = dblk_addr;
+                    iblock_cache_flags |= H5AC__DIRTIED_FLAG;
+                } /* end if */
+                else
+                    H5_LEAVE(SUCCEED)
+            } /* end if */
+
+            /* Protect data block */
+            if(NULL == (dblock = H5EA__dblock_protect(hdr, dxpl_id, iblock, iblock->dblk_addrs[dblk_idx], hdr->sblk_info[sblk_idx].dblk_nelmts, thing_acc)))
+                H5E_THROW(H5E_CANTPROTECT, "unable to protect extensible array data block, address = %llu", (unsigned long long)iblock->dblk_addrs[dblk_idx])
+
+            /* Adjust index to offset in data block */
+            elmt_idx %= hdr->sblk_info[sblk_idx].dblk_nelmts;
+
+            /* Set 'thing' info to refer to the data block */
+            *thing = dblock;
+            *thing_elmt_buf = (uint8_t *)dblock->elmts;
+            *thing_elmt_idx = elmt_idx;
+            *thing_unprot_func = (H5EA__unprotect_func_t)H5EA__dblock_unprotect;
+        } /* end if */
+        else {
+            size_t sblk_off;  /* Offset of super block in index block array of super blocks */
+
+            /* Calculate offset of super block in index block's array */
+            sblk_off = sblk_idx - iblock->nsblks;
+
+            /* Check if the super block has been allocated on disk yet */
+            if(!H5F_addr_defined(iblock->sblk_addrs[sblk_off])) {
+                /* Check if we are allowed to create the thing */
+                if(0 == (thing_acc & H5AC__READ_ONLY_FLAG)) { /* i.e. r/w access */
+                    haddr_t sblk_addr;        /* Address of data block created */
+
+                    /* Create super block */
+                    sblk_addr = H5EA__sblock_create(hdr, dxpl_id, iblock, &stats_changed, sblk_idx);
+#ifdef QAK
+HDfprintf(stderr, "%s: New super block address is: %a\n", FUNC, sblk_addr);
+#endif /* QAK */
+                    if(!H5F_addr_defined(sblk_addr))
+                        H5E_THROW(H5E_CANTCREATE, "unable to create extensible array super block")
+
+                    /* Set super block address in index block */
+                    iblock->sblk_addrs[sblk_off] = sblk_addr;
+                    iblock_cache_flags |= H5AC__DIRTIED_FLAG;
+                } /* end if */
+                else
+                    H5_LEAVE(SUCCEED)
+            } /* end if */
+
+            /* Protect super block */
+            if(NULL == (sblock = H5EA__sblock_protect(hdr, dxpl_id, iblock, iblock->sblk_addrs[sblk_off], sblk_idx, thing_acc)))
+                H5E_THROW(H5E_CANTPROTECT, "unable to protect extensible array super block, address = %llu", (unsigned long long)iblock->sblk_addrs[sblk_off])
+
+            /* Compute the data block index in super block */
+            dblk_idx = (size_t)(elmt_idx / sblock->dblk_nelmts);
+#ifdef QAK
+HDfprintf(stderr, "%s: dblk_idx = %u, sblock->ndblks = %Zu\n", FUNC, dblk_idx, sblock->ndblks);
+#endif /* QAK */
+            HDassert(dblk_idx < sblock->ndblks);
+
+            /* Check if the data block has been allocated on disk yet */
+            if(!H5F_addr_defined(sblock->dblk_addrs[dblk_idx])) {
+                /* Check if we are allowed to create the thing */
+                if(0 == (thing_acc & H5AC__READ_ONLY_FLAG)) { /* i.e. r/w access */
+                    haddr_t dblk_addr;        /* Address of data block created */
+                    hsize_t dblk_off;         /* Offset of data block in array */
+
+                    /* Create data block */
+                    dblk_off = hdr->sblk_info[sblk_idx].start_idx + (dblk_idx * hdr->sblk_info[sblk_idx].dblk_nelmts);
+                    dblk_addr = H5EA__dblock_create(hdr, dxpl_id, sblock, &stats_changed, dblk_off, sblock->dblk_nelmts);
+                    if(!H5F_addr_defined(dblk_addr))
+                        H5E_THROW(H5E_CANTCREATE, "unable to create extensible array data block")
+
+                    /* Set data block address in index block */
+                    sblock->dblk_addrs[dblk_idx] = dblk_addr;
+                    sblock_cache_flags |= H5AC__DIRTIED_FLAG;
+                } /* end if */
+                else
+                    H5_LEAVE(SUCCEED)
+            } /* end if */
+
+#ifdef QAK
+if(sblock->dblk_npages)
+    HDfprintf(stderr, "%s: Check 1.0: elmt_idx = %Hu\n", FUNC, elmt_idx);
+#endif /* QAK */
+            /* Adjust index to offset in data block */
+            elmt_idx %= sblock->dblk_nelmts;
+#ifdef QAK
+if(sblock->dblk_npages)
+    HDfprintf(stderr, "%s: Check 2.0: elmt_idx = %Hu\n", FUNC, elmt_idx);
+#endif /* QAK */
+
+            /* Check if the data block is paged */
+            if(sblock->dblk_npages) {
+                haddr_t dblk_page_addr;         /* Address of data block page */
+                size_t page_idx;                /* Index of page within data block */
+                size_t page_init_idx;           /* Index of 'page init' bit */
+
+                /* Compute page index */
+                page_idx = (size_t)elmt_idx / hdr->dblk_page_nelmts;
+
+                /* Compute 'page init' index */
+                page_init_idx = (dblk_idx * sblock->dblk_npages) + page_idx;
+
+                /* Adjust index to offset in data block page */
+                elmt_idx %= hdr->dblk_page_nelmts;
+
+                /* Compute data block page address */
+                dblk_page_addr = sblock->dblk_addrs[dblk_idx] +
+                        H5EA_DBLOCK_PREFIX_SIZE(sblock) +
+                        (page_idx * sblock->dblk_page_size);
+#ifdef QAK
+HDfprintf(stderr, "%s: sblock->addr = %a\n", FUNC, sblock->addr);
+HDfprintf(stderr, "%s: sblock->dblk_addrs[%Zu] = %a\n", FUNC, dblk_idx, sblock->dblk_addrs[dblk_idx]);
+HDfprintf(stderr, "%s: H5EA_DBLOCK_PREFIX_SIZE(sblock) = %u\n", FUNC, (unsigned)H5EA_DBLOCK_PREFIX_SIZE(sblock));
+HDfprintf(stderr, "%s: sblock->page_init[%Zu] = %t\n", FUNC, page_init_idx, H5VM_bit_get(sblock->page_init, page_init_idx));
+HDfprintf(stderr, "%s: page_idx = %Zu, elmt_idx = %Hu, dblk_page_addr = %a\n", FUNC, page_idx, elmt_idx, dblk_page_addr);
+HDfprintf(stderr, "%s: sblock->dblk_page_size = %Zu\n", FUNC, sblock->dblk_page_size);
+#endif /* QAK */
+
+                /* Check if page has been initialized yet */
+                if(!H5VM_bit_get(sblock->page_init, page_init_idx)) {
+                    /* Check if we are allowed to create the thing */
+                    if(0 == (thing_acc & H5AC__READ_ONLY_FLAG)) { /* i.e. r/w access */
+                        /* Create the data block page */
+                        if(H5EA__dblk_page_create(hdr, dxpl_id, sblock, dblk_page_addr) < 0)
+                            H5E_THROW(H5E_CANTCREATE, "unable to create data block page")
+
+                        /* Mark data block page as initialized in super block */
+                        H5VM_bit_set(sblock->page_init, page_init_idx, TRUE);
+                        sblock_cache_flags |= H5AC__DIRTIED_FLAG;
+                    } /* end if */
+                    else
+                        H5_LEAVE(SUCCEED)
+                } /* end if */
+
+                /* Protect data block page */
+                if(NULL == (dblk_page = H5EA__dblk_page_protect(hdr, dxpl_id, sblock, dblk_page_addr, thing_acc)))
+                    H5E_THROW(H5E_CANTPROTECT, "unable to protect extensible array data block page, address = %llu", (unsigned long long)dblk_page_addr)
+
+                /* Set 'thing' info to refer to the data block page */
+                *thing = dblk_page;
+                *thing_elmt_buf = (uint8_t *)dblk_page->elmts;
+                *thing_elmt_idx = elmt_idx;
+                *thing_unprot_func = (H5EA__unprotect_func_t)H5EA__dblk_page_unprotect;
+            } /* end if */
+            else {
+                /* Protect data block */
+                if(NULL == (dblock = H5EA__dblock_protect(hdr, dxpl_id, sblock, sblock->dblk_addrs[dblk_idx], sblock->dblk_nelmts, thing_acc)))
+                    H5E_THROW(H5E_CANTPROTECT, "unable to protect extensible array data block, address = %llu", (unsigned long long)sblock->dblk_addrs[dblk_idx])
+
+                /* Set 'thing' info to refer to the data block */
+                *thing = dblock;
+                *thing_elmt_buf = (uint8_t *)dblock->elmts;
+                *thing_elmt_idx = elmt_idx;
+                *thing_unprot_func = (H5EA__unprotect_func_t)H5EA__dblock_unprotect;
+            } /* end else */
+        } /* end else */
+    } /* end else */
+
+CATCH
+    /* Reset 'thing' info on error */
+    if(ret_value < 0) {
+        *thing = NULL;
+        *thing_elmt_buf = NULL;
+        *thing_elmt_idx = 0;
+        *thing_unprot_func = (H5EA__unprotect_func_t)NULL;
+    } /* end if */
+
+    /* Check for updating array statistics */
+    if(stats_changed)
+        hdr_dirty = TRUE;
+
+    /* Check for header modified */
+    if(hdr_dirty)
+        if(H5EA__hdr_modified(hdr) < 0)
+            H5E_THROW(H5E_CANTMARKDIRTY, "unable to mark extensible array header as modified")
+
+    /* Release resources */
+    if(iblock && *thing != iblock && H5EA__iblock_unprotect(iblock, dxpl_id, iblock_cache_flags) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array index block")
+    /* (Note: super blocks don't contain elements, so don't have a '*thing != sblock' check) */
+    if(sblock && H5EA__sblock_unprotect(sblock, dxpl_id, sblock_cache_flags) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array super block")
+    if(dblock && *thing != dblock && H5EA__dblock_unprotect(dblock, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array data block")
+    if(dblk_page && *thing != dblk_page && H5EA__dblk_page_unprotect(dblk_page, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array data block page")
+
+END_FUNC(STATIC)  /* end H5EA_lookup_elmt() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA_set
+ *
+ * Purpose:	Set an element of an extensible array
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep  9 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA_set(const H5EA_t *ea, hid_t dxpl_id, hsize_t idx, const void *elmt))
+
+    /* Local variables */
+    H5EA_hdr_t *hdr = ea->hdr;          /* Header for EA */
+    void *thing = NULL;                 /* Pointer to the array metadata containing the array index we are interested in */
+    uint8_t *thing_elmt_buf;            /* Pointer to the element buffer for the array metadata */
+    hsize_t thing_elmt_idx;             /* Index of the element in the element buffer for the array metadata */
+    H5EA__unprotect_func_t thing_unprot_func;   /* Function pointer for unprotecting the array metadata */
+    unsigned thing_cache_flags = H5AC__NO_FLAGS_SET;   /* Flags for unprotecting array metadata */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+HDfprintf(stderr, "%s: Index %Hu\n", FUNC, idx);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(ea);
+    HDassert(hdr);
+
+    /* Set the shared array header's file context for this operation */
+    hdr->f = ea->f;
+
+    /* Look up the array metadata containing the element we want to set */
+    if(H5EA__lookup_elmt(ea, dxpl_id, idx, H5AC__NO_FLAGS_SET, &thing, &thing_elmt_buf, &thing_elmt_idx, &thing_unprot_func) < 0)
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect array metadata")
+
+    /* Sanity check */
+    HDassert(thing);
+    HDassert(thing_elmt_buf);
+    HDassert(thing_unprot_func);
+
+    /* Set element in thing's element buffer */
+    HDmemcpy(thing_elmt_buf + (hdr->cparam.cls->nat_elmt_size * thing_elmt_idx), elmt, hdr->cparam.cls->nat_elmt_size);
+    thing_cache_flags |= H5AC__DIRTIED_FLAG;
+
+    /* Update max. element set in array, if appropriate */
+#ifdef QAK
+HDfprintf(stderr, "%s: idx = %Hu, hdr->stats.max_idx_set = %Hu\n", FUNC, idx, hdr->stats.max_idx_set);
+#endif /* QAK */
+    if(idx >= hdr->stats.stored.max_idx_set) {
+        /* Update the max index for the array */
+        hdr->stats.stored.max_idx_set = idx + 1;
+        if(H5EA__hdr_modified(hdr) < 0)
+            H5E_THROW(H5E_CANTMARKDIRTY, "unable to mark extensible array header as modified")
+    } /* end if */
+
+CATCH
+    /* Release resources */
+    if(thing && (thing_unprot_func)(thing, dxpl_id, thing_cache_flags) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array metadata")
+
+END_FUNC(PRIV)  /* end H5EA_set() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA_get
+ *
+ * Purpose:	Get an element of an extensible array
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 11 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA_get(const H5EA_t *ea, hid_t dxpl_id, hsize_t idx, void *elmt))
+
+    /* Local variables */
+    H5EA_hdr_t *hdr = ea->hdr;          /* Header for EA */
+    void *thing = NULL;                 /* Pointer to the array metadata containing the array index we are interested in */
+    H5EA__unprotect_func_t thing_unprot_func;   /* Function pointer for unprotecting the array metadata */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+HDfprintf(stderr, "%s: Index %Hu\n", FUNC, idx);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(ea);
+    HDassert(hdr);
+
+    /* Check for element beyond max. element in array */
+    if(idx >= hdr->stats.stored.max_idx_set) {
+#ifdef QAK
+HDfprintf(stderr, "%s: Element beyond max. index set, hdr->stats.max_idx_set = %Hu, idx = %Hu\n", FUNC, hdr->stats.max_idx_set, idx);
+#endif /* QAK */
+        /* Call the class's 'fill' callback */
+        if((hdr->cparam.cls->fill)(elmt, (size_t)1) < 0)
+            H5E_THROW(H5E_CANTSET, "can't set element to class's fill value")
+    } /* end if */
+    else {
+        uint8_t *thing_elmt_buf;        /* Pointer to the element buffer for the array metadata */
+        hsize_t thing_elmt_idx;         /* Index of the element in the element buffer for the array metadata */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Index block address is: %a\n", FUNC, hdr->idx_blk_addr);
+#endif /* QAK */
+
+        /* Set the shared array header's file context for this operation */
+        hdr->f = ea->f;
+
+        /* Look up the array metadata containing the element we want to set */
+        if(H5EA__lookup_elmt(ea, dxpl_id, idx, H5AC__READ_ONLY_FLAG, &thing, &thing_elmt_buf, &thing_elmt_idx, &thing_unprot_func) < 0)
+            H5E_THROW(H5E_CANTPROTECT, "unable to protect array metadata")
+
+        /* Check if the thing holding the element has been created yet */
+        if(NULL == thing) {
+            /* Call the class's 'fill' callback */
+            if((hdr->cparam.cls->fill)(elmt, (size_t)1) < 0)
+                H5E_THROW(H5E_CANTSET, "can't set element to class's fill value")
+        } /* end if */
+        else
+            /* Get element from thing's element buffer */
+            HDmemcpy(elmt, thing_elmt_buf + (hdr->cparam.cls->nat_elmt_size * thing_elmt_idx), hdr->cparam.cls->nat_elmt_size);
+    } /* end else */
+
+CATCH
+    /* Release thing */
+    if(thing && (thing_unprot_func)(thing, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array metadata")
+
+END_FUNC(PRIV)  /* end H5EA_get() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA_depend
+ *
+ * Purpose:	Make a child flush dependency between the extensible array's
+ *              header and another piece of metadata in the file.
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		May 27 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA_depend(H5AC_info_t *parent_entry, H5EA_t *ea))
+
+    /* Local variables */
+    H5EA_hdr_t *hdr = ea->hdr;          /* Header for EA */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     *
+     * At present, this function is only used to setup a flush dependency
+     * between an object header proxy and the extensible array header when
+     * the extensible array is being used to index a chunked data set.
+     *
+     * Make sure that the parameters are congruent with this.
+     */
+    HDassert(ea);
+    HDassert(hdr);
+    HDassert(parent_entry);
+    HDassert(parent_entry->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(parent_entry->type);
+    HDassert(parent_entry->type->id == H5AC_OHDR_PROXY_ID);
+    HDassert((hdr->fd_parent_addr == HADDR_UNDEF) ||
+             (hdr->fd_parent_addr == parent_entry->addr));
+    HDassert((hdr->fd_parent_ptr == NULL) ||
+             (hdr->fd_parent_ptr == parent_entry));
+
+    /*
+     * Check to see if the flush dependency between the object header proxy
+     * and the extensible array header has already been setup.  If it hasn't
+     * set it up.
+     */
+    if(!H5F_addr_defined(hdr->fd_parent_addr)) {
+        /* Set the shared array header's file context for this operation */
+        hdr->f = ea->f;
+
+        /* Set up flush dependency between parent entry and extensible 
+         * array header 
+         */
+        if(H5EA__create_flush_depend(parent_entry, (H5AC_info_t *)hdr) < 0)
+            H5E_THROW(H5E_CANTDEPEND, "unable to create flush dependency on file metadata")
+
+	hdr->fd_parent_addr = parent_entry->addr;
+        hdr->fd_parent_ptr = parent_entry;
+    } /* end if */
+
+CATCH
+
+END_FUNC(PRIV)  /* end H5EA_depend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA_undepend
+ *
+ * Purpose:	Remove a child flush dependency between the extensible array's
+ *              header and another piece of metadata in the file.
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		May 27 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA_undepend(H5AC_info_t *parent_entry, H5EA_t *ea))
+
+    /* Local variables */
+    H5EA_hdr_t *hdr = ea->hdr;          /* Header for EA */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(ea);
+    HDassert(hdr);
+
+    /* Set the shared array header's file context for this operation */
+    hdr->f = ea->f;
+
+    /* Remove flush dependency between parent entry and extensible array header */
+    if(H5EA__destroy_flush_depend(parent_entry, (H5AC_info_t *)hdr) < 0)
+        H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency on file metadata")
+
+CATCH
+
+END_FUNC(PRIV)  /* end H5EA_undepend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA_close
+ *
+ * Purpose:	Close an extensible array
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 21 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA_close(H5EA_t *ea, hid_t dxpl_id))
+
+    /* Local variables */
+    hbool_t pending_delete = FALSE;     /* Whether the array is pending deletion */
+    haddr_t ea_addr = HADDR_UNDEF;      /* Address of array (for deletion) */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(ea);
+
+    /* Decrement file reference & check if this is the last open extensible array using the shared array header */
+    if(0 == H5EA__hdr_fuse_decr(ea->hdr)) {
+        /* Set the shared array header's file context for this operation */
+        ea->hdr->f = ea->f;
+
+        /* Shut down anything that can't be put in the header's 'flush' callback */
+
+        /* Check for pending array deletion */
+        if(ea->hdr->pending_delete) {
+            /* Set local info, so array deletion can occur after decrementing the
+             *  header's ref count
+             */
+            pending_delete = TRUE;
+            ea_addr = ea->hdr->addr;
+        } /* end if */
+    } /* end if */
+
+    /* Check for pending array deletion */
+    if(pending_delete) {
+        H5EA_hdr_t *hdr;            /* Another pointer to extensible array header */
+
+#ifndef NDEBUG
+{
+    unsigned hdr_status = 0;         /* Header's status in the metadata cache */
+
+    /* Check the header's status in the metadata cache */
+    if(H5AC_get_entry_status(ea->f, ea_addr, &hdr_status) < 0)
+        H5E_THROW(H5E_CANTGET, "unable to check metadata cache status for extensible array header")
+
+    /* Sanity checks on header */
+    HDassert(hdr_status & H5AC_ES__IN_CACHE);
+    HDassert(hdr_status & H5AC_ES__IS_PINNED);
+    HDassert(!(hdr_status & H5AC_ES__IS_PROTECTED));
+}
+#endif /* NDEBUG */
+
+        /* Lock the array header into memory */
+        /* (OK to pass in NULL for callback context, since we know the header must be in the cache) */
+        if(NULL == (hdr = H5EA__hdr_protect(ea->f, dxpl_id, ea_addr, NULL, H5AC__NO_FLAGS_SET)))
+            H5E_THROW(H5E_CANTLOAD, "unable to load extensible array header")
+
+        /* Set the shared array header's file context for this operation */
+        hdr->f = ea->f;
+
+        /* Decrement the reference count on the array header */
+        /* (don't put in H5EA_hdr_fuse_decr() as the array header may be evicted
+         *  immediately -QAK)
+         */
+        if(H5EA__hdr_decr(ea->hdr) < 0)
+            H5E_THROW(H5E_CANTDEC, "can't decrement reference count on shared array header")
+
+        /* Delete array, starting with header (unprotects header) */
+        if(H5EA__hdr_delete(hdr, dxpl_id) < 0)
+            H5E_THROW(H5E_CANTDELETE, "unable to delete extensible array")
+    } /* end if */
+    else {
+        /* Decrement the reference count on the array header */
+        /* (don't put in H5EA_hdr_fuse_decr() as the array header may be evicted
+         *  immediately -QAK)
+         */
+        if(H5EA__hdr_decr(ea->hdr) < 0)
+            H5E_THROW(H5E_CANTDEC, "can't decrement reference count on shared array header")
+    } /* end else */
+
+    /* Release the extensible array wrapper */
+    ea = (H5EA_t *)H5FL_FREE(H5EA_t, ea);
+
+CATCH
+
+END_FUNC(PRIV)  /* end H5EA_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA_delete
+ *
+ * Purpose:	Delete an extensible array
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 28 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA_delete(H5F_t *f, hid_t dxpl_id, haddr_t ea_addr, void *ctx_udata))
+
+    /* Local variables */
+    H5EA_hdr_t *hdr = NULL;             /* The fractal heap header information */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(ea_addr));
+
+    /* Lock the array header into memory */
+#ifdef QAK
+HDfprintf(stderr, "%s: ea_addr = %a\n", FUNC, ea_addr);
+#endif /* QAK */
+    if(NULL == (hdr = H5EA__hdr_protect(f, dxpl_id, ea_addr, ctx_udata, H5AC__NO_FLAGS_SET)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect extensible array header, address = %llu", (unsigned long long)ea_addr)
+
+    /* Check for files using shared array header */
+    if(hdr->file_rc)
+        hdr->pending_delete = TRUE;
+    else {
+        /* Set the shared array header's file context for this operation */
+        hdr->f = f;
+
+        /* Delete array now, starting with header (unprotects header) */
+        if(H5EA__hdr_delete(hdr, dxpl_id) < 0)
+            H5E_THROW(H5E_CANTDELETE, "unable to delete extensible array")
+        hdr = NULL;
+    } /* end if */
+
+CATCH
+
+    /* Unprotect the header, if an error occurred */
+    if(hdr && H5EA__hdr_unprotect(hdr, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array header")
+
+END_FUNC(PRIV)  /* end H5EA_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5EA_iterate
+ *
+ * Purpose:	Iterate over the elements of an extensible array
+ *		(copied and modified from FA_iterate() in H5FA.c)
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi; Feb 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA_iterate(H5EA_t *ea, hid_t dxpl_id, H5EA_operator_t op, void *udata))
+
+    /* Local variables */
+    uint8_t     *elmt = NULL;
+    hsize_t     u;
+
+    /*
+     * Check arguments.
+     */
+    HDassert(ea);
+    HDassert(op);
+    HDassert(udata);
+
+    /* Allocate space for a native array element */
+    if(NULL == (elmt = H5FL_BLK_MALLOC(ea_native_elmt, ea->hdr->cparam.cls->nat_elmt_size)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array element")
+
+    /* Iterate over all elements in array */
+    for(u = 0; u < ea->hdr->stats.stored.max_idx_set; u++) {
+        int cb_ret;     /* Return value from callback */
+
+        /* Get array element */
+        if(H5EA_get(ea, dxpl_id, u, elmt) < 0)
+            H5E_THROW(H5E_CANTGET, "unable to delete fixed array")
+
+        /* Make callback */
+        if((cb_ret = (*op)(u, elmt, udata)) < 0) {
+            H5E_PRINTF(H5E_BADITER, "iterator function failed");
+            H5_LEAVE(cb_ret)
+        } /* end if */
+    } /* end for */
+
+CATCH
+
+    if(elmt)
+        elmt = H5FL_BLK_FREE(ea_native_elmt, elmt);
+
+END_FUNC(PRIV)  /* end H5EA_iterate() */
diff --git a/src/H5EAcache.c b/src/H5EAcache.c
new file mode 100644
index 0000000..d3f3d41
--- /dev/null
+++ b/src/H5EAcache.c
@@ -0,0 +1,2204 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5EAcache.c
+ *			Aug 26 2008
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Implement extensible array metadata cache methods.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5EAmodule.h"         /* This source code file is part of the H5EA module */
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5EApkg.h"		/* Extensible Arrays			*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5VMprivate.h"	/* Vectors and arrays 			*/
+#include "H5WBprivate.h"        /* Wrapped Buffers                      */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Fractal heap format version #'s */
+#define H5EA_HDR_VERSION        0               /* Header */
+#define H5EA_IBLOCK_VERSION     0               /* Index block */
+#define H5EA_SBLOCK_VERSION     0               /* Super block */
+#define H5EA_DBLOCK_VERSION     0               /* Data block */
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Metadata cache (H5AC) callbacks */
+static herr_t H5EA__cache_hdr_get_load_size(const void *image, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5EA__cache_hdr_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
+static void *H5EA__cache_hdr_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty);
+static herr_t H5EA__cache_hdr_image_len(const void *thing, size_t *image_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static herr_t H5EA__cache_hdr_serialize(const H5F_t *f, void *image, size_t len,
+    void *thing);
+static herr_t H5EA__cache_hdr_notify(H5AC_notify_action_t action, void *thing);
+static herr_t H5EA__cache_hdr_free_icr(void *thing);
+
+static herr_t H5EA__cache_iblock_get_load_size(const void *image, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5EA__cache_iblock_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
+static void *H5EA__cache_iblock_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty);
+static herr_t H5EA__cache_iblock_image_len(const void *thing, 
+    size_t *image_len, hbool_t *compressed_ptr, 
+    size_t *compressed_image_len_ptr);
+static herr_t H5EA__cache_iblock_serialize(const H5F_t *f, void *image, size_t len,
+    void *thing);
+static herr_t H5EA__cache_iblock_notify(H5AC_notify_action_t action, void *thing);
+static herr_t H5EA__cache_iblock_free_icr(void *thing);
+
+static herr_t H5EA__cache_sblock_get_load_size(const void *image, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5EA__cache_sblock_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
+static void *H5EA__cache_sblock_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty);
+static herr_t H5EA__cache_sblock_image_len(const void *thing, 
+    size_t *image_len, hbool_t *compressed_ptr, 
+    size_t *compressed_image_len_ptr);
+static herr_t H5EA__cache_sblock_serialize(const H5F_t *f, void *image, size_t len,
+    void *thing);
+static herr_t H5EA__cache_sblock_notify(H5AC_notify_action_t action, void *thing);
+static herr_t H5EA__cache_sblock_free_icr(void *thing);
+
+static herr_t H5EA__cache_dblock_get_load_size(const void *image, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5EA__cache_dblock_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
+static void *H5EA__cache_dblock_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty);
+static herr_t H5EA__cache_dblock_image_len(const void *thing, 
+    size_t *image_len, hbool_t *compressed_ptr, 
+    size_t *compressed_image_len_ptr);
+static herr_t H5EA__cache_dblock_serialize(const H5F_t *f, void *image, size_t len,
+    void *thing);
+static herr_t H5EA__cache_dblock_notify(H5AC_notify_action_t action, void *thing);
+static herr_t H5EA__cache_dblock_free_icr(void *thing);
+static herr_t H5EA__cache_dblock_fsf_size(const void *thing, size_t *fsf_size);
+
+static herr_t H5EA__cache_dblk_page_get_load_size(const void *image, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5EA__cache_dblk_page_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
+static void *H5EA__cache_dblk_page_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty);
+static herr_t H5EA__cache_dblk_page_image_len(const void *thing, 
+    size_t *image_len, hbool_t *compressed_ptr, 
+    size_t *compressed_image_len_ptr);
+static herr_t H5EA__cache_dblk_page_serialize(const H5F_t *f, void *image, size_t len,
+    void *thing);
+static herr_t H5EA__cache_dblk_page_notify(H5AC_notify_action_t action, void *thing);
+static herr_t H5EA__cache_dblk_page_free_icr(void *thing);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* H5EA header inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_EARRAY_HDR[1] = {{
+    H5AC_EARRAY_HDR_ID,                 /* Metadata client ID */
+    "Extensible Array Header",          /* Metadata client name (for debugging) */
+    H5FD_MEM_EARRAY_HDR,                /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5EA__cache_hdr_get_load_size,      /* 'get_load_size' callback */
+    H5EA__cache_hdr_verify_chksum,	/* 'verify_chksum' callback */
+    H5EA__cache_hdr_deserialize,        /* 'deserialize' callback */
+    H5EA__cache_hdr_image_len,          /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5EA__cache_hdr_serialize,          /* 'serialize' callback */
+    H5EA__cache_hdr_notify,             /* 'notify' callback */
+    H5EA__cache_hdr_free_icr,           /* 'free_icr' callback */
+    NULL,				/* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
+}};
+
+/* H5EA index block inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_EARRAY_IBLOCK[1] = {{
+    H5AC_EARRAY_IBLOCK_ID,              /* Metadata client ID */
+    "Extensible Array Index Block",     /* Metadata client name (for debugging) */
+    H5FD_MEM_EARRAY_IBLOCK,             /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5EA__cache_iblock_get_load_size,   /* 'get_load_size' callback */
+    H5EA__cache_iblock_verify_chksum,	/* 'verify_chksum' callback */
+    H5EA__cache_iblock_deserialize,     /* 'deserialize' callback */
+    H5EA__cache_iblock_image_len,       /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5EA__cache_iblock_serialize,       /* 'serialize' callback */
+    H5EA__cache_iblock_notify,          /* 'notify' callback */
+    H5EA__cache_iblock_free_icr,        /* 'free_icr' callback */
+    NULL,				/* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
+}};
+
+/* H5EA super block inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_EARRAY_SBLOCK[1] = {{
+    H5AC_EARRAY_SBLOCK_ID,              /* Metadata client ID */
+    "Extensible Array Super Block",     /* Metadata client name (for debugging) */
+    H5FD_MEM_EARRAY_SBLOCK,             /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5EA__cache_sblock_get_load_size,   /* 'get_load_size' callback */
+    H5EA__cache_sblock_verify_chksum,	/* 'verify_chksum' callback */
+    H5EA__cache_sblock_deserialize,     /* 'deserialize' callback */
+    H5EA__cache_sblock_image_len,       /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5EA__cache_sblock_serialize,       /* 'serialize' callback */
+    H5EA__cache_sblock_notify,          /* 'notify' callback */
+    H5EA__cache_sblock_free_icr,        /* 'free_icr' callback */
+    NULL,				/* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
+}};
+
+/* H5EA data block inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_EARRAY_DBLOCK[1] = {{
+    H5AC_EARRAY_DBLOCK_ID,              /* Metadata client ID */
+    "Extensible Array Data Block",      /* Metadata client name (for debugging) */
+    H5FD_MEM_EARRAY_DBLOCK,             /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5EA__cache_dblock_get_load_size,   /* 'get_load_size' callback */
+    H5EA__cache_dblock_verify_chksum,	/* 'verify_chksum' callback */
+    H5EA__cache_dblock_deserialize,     /* 'deserialize' callback */
+    H5EA__cache_dblock_image_len,       /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5EA__cache_dblock_serialize,       /* 'serialize' callback */
+    H5EA__cache_dblock_notify,          /* 'notify' callback */
+    H5EA__cache_dblock_free_icr,        /* 'free_icr' callback */
+    NULL,				/* 'clear' callback */
+    H5EA__cache_dblock_fsf_size,        /* 'fsf_size' callback */
+}};
+
+/* H5EA data block page inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_EARRAY_DBLK_PAGE[1] = {{
+    H5AC_EARRAY_DBLK_PAGE_ID,           /* Metadata client ID */
+    "Extensible Array Data Block Page", /* Metadata client name (for debugging) */
+    H5FD_MEM_EARRAY_DBLK_PAGE,          /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5EA__cache_dblk_page_get_load_size, /* 'get_load_size' callback */
+    H5EA__cache_dblk_page_verify_chksum, /* 'verify_chksum' callback */
+    H5EA__cache_dblk_page_deserialize,  /* 'deserialize' callback */
+    H5EA__cache_dblk_page_image_len,    /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5EA__cache_dblk_page_serialize,    /* 'serialize' callback */
+    H5EA__cache_dblk_page_notify,       /* 'notify' callback */
+    H5EA__cache_dblk_page_free_icr,     /* 'free_icr' callback */
+    NULL,				/* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5EA__cache_hdr_get_load_size
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 16, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA__cache_hdr_get_load_size(const void *_image, void *_udata, size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr))
+
+    /* Local variables */
+    const uint8_t *image = (const uint8_t *)_image;       		    /* Pointer into raw data buffer */
+    H5EA_hdr_cache_ud_t *udata = (H5EA_hdr_cache_ud_t *)_udata; /* User data for callback */
+
+    /* Check arguments */
+    HDassert(udata);
+    HDassert(udata->f);
+    HDassert(image_len);
+
+    if(image == NULL) {
+	/* Set the image length size */
+	*image_len = (size_t)H5EA_HEADER_SIZE_FILE(udata->f);
+    } else {
+        HDassert(actual_len);
+        HDassert(*actual_len == *image_len);
+    }
+
+END_FUNC(STATIC)   /* end H5EA__cache_hdr_get_load_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_hdr_verify_chksum
+ *
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
+ *
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
+ *
+ * Programmer:	Vailin Choi; Aug 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+htri_t, TRUE, -,
+H5EA__cache_hdr_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSED *_udata))
+
+    /* Local variables */
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+
+    /* Check arguments */
+    HDassert(image);
+
+    /* Get stored and computed checksums */
+    H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
+
+    if(stored_chksum != computed_chksum)
+	ret_value = FALSE;
+
+END_FUNC(STATIC) 	/* end H5EA__cache_hdr_verify_chksum() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_hdr_deserialize
+ *
+ * Purpose:	Loads a data structure from the disk.
+ *
+ * Return:	Success:	Pointer to a new B-tree.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 16, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+void *, NULL, NULL,
+H5EA__cache_hdr_deserialize(const void *_image, size_t len, void *_udata,
+    hbool_t H5_ATTR_UNUSED *dirty))
+
+    /* Local variables */
+    H5EA_cls_id_t       id;		/* ID of extensible array class, as found in file */
+    H5EA_hdr_t		*hdr = NULL;    /* Extensible array info */
+    H5EA_hdr_cache_ud_t *udata = (H5EA_hdr_cache_ud_t *)_udata;
+    const uint8_t	*image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t            stored_chksum;  /* Stored metadata checksum value */
+
+    /* Check arguments */
+    HDassert(image);
+    HDassert(udata);
+    HDassert(udata->f);
+    HDassert(H5F_addr_defined(udata->addr));
+
+    /* Allocate space for the extensible array data structure */
+    if(NULL == (hdr = H5EA__hdr_alloc(udata->f)))
+	H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array shared header")
+
+    /* Set the extensible array header's address */
+    hdr->addr = udata->addr;
+
+    /* Magic number */
+    if(HDmemcmp(image, H5EA_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+	H5E_THROW(H5E_BADVALUE, "wrong extensible array header signature")
+    image += H5_SIZEOF_MAGIC;
+
+    /* Version */
+    if(*image++ != H5EA_HDR_VERSION)
+	H5E_THROW(H5E_VERSION, "wrong extensible array header version")
+
+    /* Extensible array class */
+    id = (H5EA_cls_id_t)*image++;
+    if(id >= H5EA_NUM_CLS_ID)
+	H5E_THROW(H5E_BADTYPE, "incorrect extensible array class")
+    hdr->cparam.cls = H5EA_client_class_g[id];
+
+    /* General array creation/configuration information */
+    hdr->cparam.raw_elmt_size = *image++;          /* Element size in file (in bytes) */
+    hdr->cparam.max_nelmts_bits = *image++;        /* Log2(Max. # of elements in array) - i.e. # of bits needed to store max. # of elements */
+    hdr->cparam.idx_blk_elmts = *image++;          /* # of elements to store in index block */
+    hdr->cparam.data_blk_min_elmts = *image++;     /* Min. # of elements per data block */
+    hdr->cparam.sup_blk_min_data_ptrs = *image++;  /* Min. # of data block pointers for a super block */
+    hdr->cparam.max_dblk_page_nelmts_bits = *image++;  /* Log2(Max. # of elements in data block page) - i.e. # of bits needed to store max. # of elements in data block page */
+
+    /* Array statistics */
+    hdr->stats.computed.hdr_size = len;                        /* Size of header in file */
+    H5F_DECODE_LENGTH(udata->f, image, hdr->stats.stored.nsuper_blks);    /* Number of super blocks created */
+    H5F_DECODE_LENGTH(udata->f, image, hdr->stats.stored.super_blk_size); /* Size of super blocks created */
+    H5F_DECODE_LENGTH(udata->f, image, hdr->stats.stored.ndata_blks);     /* Number of data blocks created */
+    H5F_DECODE_LENGTH(udata->f, image, hdr->stats.stored.data_blk_size);  /* Size of data blocks created */
+    H5F_DECODE_LENGTH(udata->f, image, hdr->stats.stored.max_idx_set);    /* Max. index set (+1) */
+    H5F_DECODE_LENGTH(udata->f, image, hdr->stats.stored.nelmts);         /* Number of elements 'realized' */
+
+    /* Internal information */
+    H5F_addr_decode(udata->f, &image, &hdr->idx_blk_addr); /* Address of index block */
+
+    /* Index block statistics */
+    if(H5F_addr_defined(hdr->idx_blk_addr)) {
+        H5EA_iblock_t iblock;           /* Fake index block for computing size */
+
+        /* Set index block count for file */
+        hdr->stats.computed.nindex_blks = 1;
+
+        /* Set up fake index block for computing size on disk */
+        iblock.hdr = hdr;
+        iblock.nsblks = H5EA_SBLK_FIRST_IDX(hdr->cparam.sup_blk_min_data_ptrs);
+        iblock.ndblk_addrs = 2 * ((size_t)hdr->cparam.sup_blk_min_data_ptrs - 1);
+        iblock.nsblk_addrs = hdr->nsblks - iblock.nsblks;
+
+        /* Compute size of index block in file */
+        hdr->stats.computed.index_blk_size = H5EA_IBLOCK_SIZE(&iblock);
+    } /* end if */
+    else {
+        hdr->stats.computed.nindex_blks = 0;       /* Number of index blocks in file */
+        hdr->stats.computed.index_blk_size = 0;    /* Size of index blocks in file */
+    } /* end else */
+
+    /* Sanity check */
+    /* (allow for checksum not decoded yet) */
+    HDassert((size_t)(image - (const uint8_t *)_image) == (len - H5EA_SIZEOF_CHKSUM));
+
+    /* checksum verification already done in verify_chksum cb */
+
+    /* Metadata checksum */
+    UINT32DECODE(image, stored_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(image - (const uint8_t *)_image) == len);
+
+    /* Finish initializing extensible array header */
+    if(H5EA__hdr_init(hdr, udata->ctx_udata) < 0)
+	H5E_THROW(H5E_CANTINIT, "initialization failed for extensible array header")
+    HDassert(hdr->size == len);
+
+    /* Set return value */
+    ret_value = hdr;
+
+CATCH
+
+    /* Release resources */
+    if(!ret_value)
+        if(hdr && H5EA__hdr_dest(hdr) < 0)
+            H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array header")
+
+END_FUNC(STATIC)   /* end H5EA__cache_hdr_deserialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5EA__cache_hdr_image_len
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 16, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA__cache_hdr_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr))
+
+    /* Local variables */
+    const H5EA_hdr_t *hdr = (const H5EA_hdr_t *)_thing;      /* Pointer to the object */
+
+    /* Check arguments */
+    HDassert(hdr);
+    HDassert(image_len);
+
+    /* Set the image length size */
+    *image_len = hdr->size;
+
+END_FUNC(STATIC)   /* end H5EA__cache_hdr_image_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_hdr_serialize
+ *
+ * Purpose:	Flushes a dirty object to disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 16, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA__cache_hdr_serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
+    void *_thing))
+
+    /* Local variables */
+    H5EA_hdr_t *hdr = (H5EA_hdr_t *)_thing;      /* Pointer to the extensible array header */
+    uint8_t *image = (uint8_t *)_image;         /* Pointer into raw data buffer */
+    uint32_t metadata_chksum;   /* Computed metadata checksum value */
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(image);
+    HDassert(hdr);
+
+    /* Magic number */
+    HDmemcpy(image, H5EA_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    image += H5_SIZEOF_MAGIC;
+
+    /* Version # */
+    *image++ = H5EA_HDR_VERSION;
+
+    /* Extensible array type */
+    *image++ = hdr->cparam.cls->id;
+
+    /* General array creation/configuration information */
+    *image++ = hdr->cparam.raw_elmt_size;          /* Element size in file (in bytes) */
+    *image++ = hdr->cparam.max_nelmts_bits;        /* Log2(Max. # of elements in array) - i.e. # of bits needed to store max. # of elements */
+    *image++ = hdr->cparam.idx_blk_elmts;          /* # of elements to store in index block */
+    *image++ = hdr->cparam.data_blk_min_elmts;     /* Min. # of elements per data block */
+    *image++ = hdr->cparam.sup_blk_min_data_ptrs;  /* Min. # of data block pointers for a super block */
+    *image++ = hdr->cparam.max_dblk_page_nelmts_bits;  /* Log2(Max. # of elements in data block page) - i.e. # of bits needed to store max. # of elements in data block page */
+
+    /* Array statistics */
+    H5F_ENCODE_LENGTH(f, image, hdr->stats.stored.nsuper_blks);    /* Number of super blocks created */
+    H5F_ENCODE_LENGTH(f, image, hdr->stats.stored.super_blk_size); /* Size of super blocks created */
+    H5F_ENCODE_LENGTH(f, image, hdr->stats.stored.ndata_blks);     /* Number of data blocks created */
+    H5F_ENCODE_LENGTH(f, image, hdr->stats.stored.data_blk_size);  /* Size of data blocks created */
+    H5F_ENCODE_LENGTH(f, image, hdr->stats.stored.max_idx_set);    /* Max. index set (+1) */
+    H5F_ENCODE_LENGTH(f, image, hdr->stats.stored.nelmts);         /* Number of elements 'realized' */
+
+    /* Internal information */
+    H5F_addr_encode(f, &image, hdr->idx_blk_addr);  /* Address of index block */
+
+    /* Compute metadata checksum */
+    metadata_chksum = H5_checksum_metadata(_image, (size_t)(image - (uint8_t *)_image), 0);
+
+    /* Metadata checksum */
+    UINT32ENCODE(image, metadata_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(image - (uint8_t *)_image) == len);
+
+END_FUNC(STATIC)   /* end H5EA__cache_hdr_serialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_hdr_notify
+ *
+ * Purpose:	Handle cache action notifications
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	John Mainzer
+ *              11/30/15
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__cache_hdr_notify(H5AC_notify_action_t action, void *_thing))
+
+    /* Local variables */
+    H5EA_hdr_t *hdr = (H5EA_hdr_t *)_thing;      /* Pointer to the object */
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* Check if the file was opened with SWMR-write access */
+    if(hdr->swmr_write) {
+        /* Determine which action to take */
+        switch(action) {
+            case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+	    case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+	    case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+		/* do nothing */
+		break;
+
+	    case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+                /* If hdr->fd_parent_addr != HADDR_UNDEF, the extensible 
+                 * array header must be employed as the index for a chunked
+                 * data set which has been modified by the SWMR writer.
+                 * 
+                 * In this case, hdr->fd_parent_addr must contain the 
+                 * address of object header proxy which is the flush 
+                 * dependency parent of the extensible array header.
+                 *
+                 * hdr->fd_parent_addr (and hdr->fd_parent_ptr) are used to
+                 * destroy the flush dependency before the extensible array
+                 * header is evicted.
+                 */
+                if(hdr->fd_parent_addr != HADDR_UNDEF) {
+		    HDassert(hdr->fd_parent_ptr);
+                    HDassert(hdr->fd_parent_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+		    HDassert(hdr->fd_parent_ptr->addr == hdr->fd_parent_addr);
+                    HDassert(hdr->fd_parent_ptr->type);
+                    HDassert(hdr->fd_parent_ptr->type->id == H5AC_OHDR_PROXY_ID);
+
+		    /* Destroy flush dependency on object header proxy */
+		    if(H5EA__destroy_flush_depend((H5AC_info_t *)hdr->fd_parent_ptr, (H5AC_info_t *)hdr) < 0)
+		        H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between ea header and object header proxy, address = %llu", (unsigned long long)hdr->fd_parent_addr)
+		} /* end if */
+		break;
+
+            default:
+#ifdef NDEBUG
+                H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
+#else /* NDEBUG */
+                HDassert(0 && "Unknown action?!?");
+#endif /* NDEBUG */
+        } /* end switch */
+    } /* end if */
+    else {
+        HDassert(hdr->fd_parent_addr == HADDR_UNDEF);
+        HDassert(hdr->fd_parent_ptr == NULL);
+    } /* end else */
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5EA__cache_hdr_notify() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_hdr_free_icr
+ *
+ * Purpose:	Destroy/release an "in core representation" of a data
+ *              structure
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 16, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__cache_hdr_free_icr(void *thing))
+
+    /* Check arguments */
+    HDassert(thing);
+
+    /* Release the extensible array header */
+    if(H5EA__hdr_dest((H5EA_hdr_t *)thing) < 0)
+        H5E_THROW(H5E_CANTFREE, "can't free extensible array header")
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5EA__cache_hdr_free_icr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5EA__cache_iblock_get_load_size
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA__cache_iblock_get_load_size(const void *_image, void *_udata, size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr))
+
+    /* Local variables */
+    const uint8_t *image = (const uint8_t *)_image;    	/* Pointer into raw data buffer */
+    H5EA_hdr_t *hdr = (H5EA_hdr_t *)_udata;   		/* User data for callback */
+    H5EA_iblock_t iblock;           			/* Fake index block for computing size */
+
+    /* Check arguments */
+    HDassert(hdr);
+    HDassert(image_len);
+
+    if(image == NULL) {
+	/* Set up fake index block for computing size on disk */
+	HDmemset(&iblock, 0, sizeof(iblock));
+	iblock.hdr = (H5EA_hdr_t *)hdr;     /* Casting away 'const' OK - QAK */
+	iblock.nsblks = H5EA_SBLK_FIRST_IDX(hdr->cparam.sup_blk_min_data_ptrs);
+	iblock.ndblk_addrs = 2 * ((size_t)hdr->cparam.sup_blk_min_data_ptrs - 1);
+	iblock.nsblk_addrs = hdr->nsblks - iblock.nsblks;
+
+	/* Set the image length size */
+	*image_len = (size_t)H5EA_IBLOCK_SIZE(&iblock);
+    } else {
+        HDassert(actual_len);
+        HDassert(*actual_len == *image_len);
+    }
+
+END_FUNC(STATIC)   /* end H5EA__cache_iblock_get_load_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_iblock_verify_chksum
+ *
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
+ *
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
+ *
+ * Programmer:	Vailin Choi; Aug 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+htri_t, TRUE, -,
+H5EA__cache_iblock_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSED *_udata))
+
+    /* Local variables */
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+
+    /* Check arguments */
+    HDassert(image);
+
+    /* Get stored and computed checksums */
+    H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
+
+    if(stored_chksum != computed_chksum)
+	ret_value = FALSE;
+
+END_FUNC(STATIC) 	/* end H5EA__cache_iblock_verify_chksum() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_iblock_deserialize
+ *
+ * Purpose:	Loads a data structure from the disk.
+ *
+ * Return:	Success:	Pointer to a new B-tree.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+void *, NULL, NULL,
+H5EA__cache_iblock_deserialize(const void *_image, size_t len,
+    void *_udata, hbool_t H5_ATTR_UNUSED *dirty))
+
+    /* Local variables */
+    H5EA_iblock_t	*iblock = NULL; /* Index block info */
+    H5EA_hdr_t *hdr = (H5EA_hdr_t *)_udata;     /* User data for callback */
+    const uint8_t	*image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t            stored_chksum;  /* Stored metadata checksum value */
+    haddr_t             arr_addr;       /* Address of array header in the file */
+    size_t              u;              /* Local index variable */
+
+    /* Check arguments */
+    HDassert(image);
+    HDassert(hdr);
+
+    /* Allocate the extensible array index block */
+    if(NULL == (iblock = H5EA__iblock_alloc(hdr)))
+	H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array index block")
+
+    /* Set the extensible array index block's address */
+    iblock->addr = hdr->idx_blk_addr;
+
+    /* Magic number */
+    if(HDmemcmp(image, H5EA_IBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+	H5E_THROW(H5E_BADVALUE, "wrong extensible array index block signature")
+    image += H5_SIZEOF_MAGIC;
+
+    /* Version */
+    if(*image++ != H5EA_IBLOCK_VERSION)
+	H5E_THROW(H5E_VERSION, "wrong extensible array index block version")
+
+    /* Extensible array type */
+    if(*image++ != (uint8_t)hdr->cparam.cls->id)
+	H5E_THROW(H5E_BADTYPE, "incorrect extensible array class")
+
+    /* Address of header for array that owns this block (just for file integrity checks) */
+    H5F_addr_decode(hdr->f, &image, &arr_addr);
+    if(H5F_addr_ne(arr_addr, hdr->addr))
+	H5E_THROW(H5E_BADVALUE, "wrong extensible array header address")
+
+    /* Internal information */
+
+    /* Decode elements in index block */
+    if(hdr->cparam.idx_blk_elmts > 0) {
+        /* Convert from raw elements on disk into native elements in memory */
+        if((hdr->cparam.cls->decode)(image, iblock->elmts, (size_t)hdr->cparam.idx_blk_elmts, hdr->cb_ctx) < 0)
+            H5E_THROW(H5E_CANTDECODE, "can't decode extensible array index elements")
+        image += (hdr->cparam.idx_blk_elmts * hdr->cparam.raw_elmt_size);
+    } /* end if */
+
+    /* Decode data block addresses in index block */
+    if(iblock->ndblk_addrs > 0) {
+        /* Decode addresses of data blocks in index block */
+        for(u = 0; u < iblock->ndblk_addrs; u++)
+            H5F_addr_decode(hdr->f, &image, &iblock->dblk_addrs[u]);
+    } /* end if */
+
+    /* Decode super block addresses in index block */
+    if(iblock->nsblk_addrs > 0) {
+        /* Decode addresses of super blocks in index block */
+        for(u = 0; u < iblock->nsblk_addrs; u++)
+            H5F_addr_decode(hdr->f, &image, &iblock->sblk_addrs[u]);
+    } /* end if */
+
+    /* Sanity check */
+    /* (allow for checksum not decoded yet) */
+    HDassert((size_t)(image - (const uint8_t *)_image) == (len - H5EA_SIZEOF_CHKSUM));
+
+    /* Save the index block's size */
+    iblock->size = len;
+
+    /* checksum verification already done in verify_chksum cb */
+
+    /* Metadata checksum */
+    UINT32DECODE(image, stored_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(image - (const uint8_t *)_image) == iblock->size);
+
+    /* Set return value */
+    ret_value = iblock;
+
+CATCH
+
+    /* Release resources */
+    if(!ret_value)
+        if(iblock && H5EA__iblock_dest(iblock) < 0)
+            H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array index block")
+
+END_FUNC(STATIC)   /* end H5EA__cache_iblock_deserialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5EA__cache_iblock_image_len
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA__cache_iblock_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr))
+
+    /* Local variables */
+    const H5EA_iblock_t *iblock = (const H5EA_iblock_t *)_thing;      /* Pointer to the object */
+
+    /* Check arguments */
+    HDassert(iblock);
+    HDassert(image_len);
+
+    /* Set the image length size */
+    *image_len = iblock->size;
+
+END_FUNC(STATIC)   /* end H5EA__cache_iblock_image_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_iblock_serialize
+ *
+ * Purpose:	Flushes a dirty object to disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__cache_iblock_serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
+    void *_thing))
+
+    /* Local variables */
+    H5EA_iblock_t *iblock = (H5EA_iblock_t *)_thing;      /* Pointer to the object to serialize */
+    uint8_t *image = (uint8_t *)_image;         /* Pointer into raw data buffer */
+    uint32_t metadata_chksum;   /* Computed metadata checksum value */
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(image);
+    HDassert(iblock);
+    HDassert(iblock->hdr);
+
+    /* Get temporary pointer to serialized info */
+
+    /* Magic number */
+    HDmemcpy(image, H5EA_IBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    image += H5_SIZEOF_MAGIC;
+
+    /* Version # */
+    *image++ = H5EA_IBLOCK_VERSION;
+
+    /* Extensible array type */
+    *image++ = iblock->hdr->cparam.cls->id;
+
+    /* Address of array header for array which owns this block */
+    H5F_addr_encode(f, &image, iblock->hdr->addr);
+
+    /* Internal information */
+
+    /* Encode elements in index block */
+    if(iblock->hdr->cparam.idx_blk_elmts > 0) {
+        /* Convert from native elements in memory into raw elements on disk */
+        if((iblock->hdr->cparam.cls->encode)(image, iblock->elmts, (size_t)iblock->hdr->cparam.idx_blk_elmts, iblock->hdr->cb_ctx) < 0)
+            H5E_THROW(H5E_CANTENCODE, "can't encode extensible array index elements")
+        image += (iblock->hdr->cparam.idx_blk_elmts * iblock->hdr->cparam.raw_elmt_size);
+    } /* end if */
+
+    /* Encode data block addresses in index block */
+    if(iblock->ndblk_addrs > 0) {
+        size_t u;               /* Local index variable */
+
+        /* Encode addresses of data blocks in index block */
+        for(u = 0; u < iblock->ndblk_addrs; u++)
+            H5F_addr_encode(f, &image, iblock->dblk_addrs[u]);
+    } /* end if */
+
+    /* Encode data block addresses in index block */
+    if(iblock->nsblk_addrs > 0) {
+        size_t u;               /* Local index variable */
+
+        /* Encode addresses of super blocks in index block */
+        for(u = 0; u < iblock->nsblk_addrs; u++)
+            H5F_addr_encode(f, &image, iblock->sblk_addrs[u]);
+    } /* end if */
+
+    /* Compute metadata checksum */
+    metadata_chksum = H5_checksum_metadata(_image, (size_t)(image - (uint8_t *)_image), 0);
+
+    /* Metadata checksum */
+    UINT32ENCODE(image, metadata_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(image - (uint8_t *)_image) == len);
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5EA__cache_iblock_serialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_iblock_notify
+ *
+ * Purpose:	Handle cache action notifications
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__cache_iblock_notify(H5AC_notify_action_t action, void *_thing))
+
+    /* Local variables */
+    H5EA_iblock_t *iblock = (H5EA_iblock_t *)_thing;      /* Pointer to the object */
+
+    /* Sanity check */
+    HDassert(iblock);
+
+    /* Check if the file was opened with SWMR-write access */
+    if(iblock->hdr->swmr_write) {
+        /* Determine which action to take */
+        switch(action) {
+            case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+	    case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+                /* Create flush dependency on extensible array header */
+                if(H5EA__create_flush_depend((H5AC_info_t *)iblock->hdr, (H5AC_info_t *)iblock) < 0)
+                    H5E_THROW(H5E_CANTDEPEND, "unable to create flush dependency between index block and header, address = %llu", (unsigned long long)iblock->addr)
+                break;
+
+	    case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+		/* do nothing */
+		break;
+
+	    case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+		/* Destroy flush dependency on extensible array header */
+		if(H5EA__destroy_flush_depend((H5AC_info_t *)iblock->hdr, (H5AC_info_t *)iblock) < 0)
+		    H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between index block and header, address = %llu", (unsigned long long)iblock->addr)
+		break;
+
+            default:
+#ifdef NDEBUG
+                H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
+#else /* NDEBUG */
+                HDassert(0 && "Unknown action?!?");
+#endif /* NDEBUG */
+        } /* end switch */
+    } /* end if */
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5EA__cache_iblock_notify() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_iblock_free_icr
+ *
+ * Purpose:	Destroy/release an "in core representation" of a data
+ *              structure
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__cache_iblock_free_icr(void *thing))
+
+    /* Check arguments */
+    HDassert(thing);
+
+    /* Release the extensible array index block */
+    if(H5EA__iblock_dest((H5EA_iblock_t *)thing) < 0)
+        H5E_THROW(H5E_CANTFREE, "can't free extensible array index block")
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5EA__cache_iblock_free_icr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5EA__cache_sblock_get_load_size
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA__cache_sblock_get_load_size(const void *_image, void *_udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr))
+
+    /* Local variables */
+    const uint8_t *image = (const uint8_t *)_image;   	/* Pointer into raw data buffer */
+    H5EA_sblock_cache_ud_t *udata = (H5EA_sblock_cache_ud_t *)_udata;      /* User data */
+    H5EA_sblock_t sblock;           			/* Fake super block for computing size */
+
+    /* Check arguments */
+    HDassert(udata);
+    HDassert(udata->hdr);
+    HDassert(udata->sblk_idx > 0);
+    HDassert(H5F_addr_defined(udata->sblk_addr));
+    HDassert(image_len);
+
+    if(image == NULL) {
+	/* Set up fake super block for computing size on disk */
+	/* (Note: extracted from H5EA__sblock_alloc) */
+	HDmemset(&sblock, 0, sizeof(sblock));
+	sblock.hdr = udata->hdr;
+	sblock.ndblks = udata->hdr->sblk_info[udata->sblk_idx].ndblks;
+	sblock.dblk_nelmts = udata->hdr->sblk_info[udata->sblk_idx].dblk_nelmts;
+
+	/* Check if # of elements in data blocks requires paging */
+	if(sblock.dblk_nelmts > udata->hdr->dblk_page_nelmts) {
+	    /* Compute # of pages in each data block from this super block */
+	    sblock.dblk_npages = sblock.dblk_nelmts / udata->hdr->dblk_page_nelmts;
+
+	    /* Sanity check that we have at least 2 pages in data block */
+	    HDassert(sblock.dblk_npages > 1);
+
+	    /* Sanity check for integer truncation */
+	    HDassert((sblock.dblk_npages * udata->hdr->dblk_page_nelmts) == sblock.dblk_nelmts);
+
+	    /* Compute size of buffer for each data block's 'page init' bitmask */
+	    sblock.dblk_page_init_size = ((sblock.dblk_npages) + 7) / 8;
+	    HDassert(sblock.dblk_page_init_size > 0);
+	} /* end if */
+
+	/* Set the image length size */
+	*image_len = (size_t)H5EA_SBLOCK_SIZE(&sblock);
+
+    } else {
+        HDassert(actual_len);
+        HDassert(*actual_len == *image_len);
+    }
+
+END_FUNC(STATIC)   /* end H5EA__cache_sblock_get_load_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_sblock_verify_chksum
+ *
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
+ *
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
+ *
+ * Programmer:	Vailin Choi; Aug 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+htri_t, TRUE, -,
+H5EA__cache_sblock_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSED *_udata))
+
+    /* Local variables */
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+
+    /* Check arguments */
+    HDassert(image);
+
+    /* Get stored and computed checksums */
+    H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
+
+    if(stored_chksum != computed_chksum)
+	ret_value = FALSE;
+
+END_FUNC(STATIC) 	/* end H5EA__cache_sblock_verify_chksum() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_sblock_deserialize
+ *
+ * Purpose:	Loads a data structure from the disk.
+ *
+ * Return:	Success:	Pointer to a new B-tree.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+void *, NULL, NULL,
+H5EA__cache_sblock_deserialize(const void *_image, size_t len,
+    void *_udata, hbool_t H5_ATTR_UNUSED *dirty))
+
+    /* Local variables */
+    H5EA_sblock_t	*sblock = NULL; /* Super block info */
+    H5EA_sblock_cache_ud_t *udata = (H5EA_sblock_cache_ud_t *)_udata;      /* User data */
+    const uint8_t	*image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t            stored_chksum;  /* Stored metadata checksum value */
+    haddr_t             arr_addr;       /* Address of array header in the file */
+    size_t              u;              /* Local index variable */
+
+    /* Sanity check */
+    HDassert(udata);
+    HDassert(udata->hdr);
+    HDassert(udata->parent);
+    HDassert(udata->sblk_idx > 0);
+    HDassert(H5F_addr_defined(udata->sblk_addr));
+
+    /* Allocate the extensible array super block */
+    if(NULL == (sblock = H5EA__sblock_alloc(udata->hdr, udata->parent, udata->sblk_idx)))
+	H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array super block")
+
+    /* Set the extensible array super block's address */
+    sblock->addr = udata->sblk_addr;
+
+    /* Magic number */
+    if(HDmemcmp(image, H5EA_SBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+	H5E_THROW(H5E_BADVALUE, "wrong extensible array super block signature")
+    image += H5_SIZEOF_MAGIC;
+
+    /* Version */
+    if(*image++ != H5EA_SBLOCK_VERSION)
+	H5E_THROW(H5E_VERSION, "wrong extensible array super block version")
+
+    /* Extensible array type */
+    if(*image++ != (uint8_t)udata->hdr->cparam.cls->id)
+	H5E_THROW(H5E_BADTYPE, "incorrect extensible array class")
+
+    /* Address of header for array that owns this block (just for file integrity checks) */
+    H5F_addr_decode(udata->hdr->f, &image, &arr_addr);
+    if(H5F_addr_ne(arr_addr, udata->hdr->addr))
+	H5E_THROW(H5E_BADVALUE, "wrong extensible array header address")
+
+    /* Offset of block within the array's address space */
+    UINT64DECODE_VAR(image, sblock->block_off, udata->hdr->arr_off_size);
+
+    /* Internal information */
+
+    /* Check for 'page init' bitmasks for this super block */
+    if(sblock->dblk_npages > 0) {
+        size_t tot_page_init_size = sblock->ndblks * sblock->dblk_page_init_size;        /* Compute total size of 'page init' buffer */
+
+        /* Retrieve the 'page init' bitmasks */
+        HDmemcpy(sblock->page_init, image, tot_page_init_size);
+        image += tot_page_init_size;
+    } /* end if */
+
+    /* Decode data block addresses */
+    for(u = 0; u < sblock->ndblks; u++)
+        H5F_addr_decode(udata->hdr->f, &image, &sblock->dblk_addrs[u]);
+
+    /* Sanity check */
+    /* (allow for checksum not decoded yet) */
+    HDassert((size_t)(image - (const uint8_t *)_image) == (len - H5EA_SIZEOF_CHKSUM));
+
+    /* Save the super block's size */
+    sblock->size = len;
+
+    /* checksum verification already done in verify_chksum cb */
+
+    /* Metadata checksum */
+    UINT32DECODE(image, stored_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(image - (const uint8_t *)_image) == sblock->size);
+
+    /* Set return value */
+    ret_value = sblock;
+
+CATCH
+
+    /* Release resources */
+    if(!ret_value)
+        if(sblock && H5EA__sblock_dest(sblock) < 0)
+            H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array super block")
+
+END_FUNC(STATIC)   /* end H5EA__cache_sblock_deserialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5EA__cache_sblock_image_len
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA__cache_sblock_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr))
+
+    /* Local variables */
+    const H5EA_sblock_t *sblock = (const H5EA_sblock_t *)_thing;      /* Pointer to the object */
+
+    /* Check arguments */
+    HDassert(sblock);
+    HDassert(image_len);
+
+    /* Set the image length size */
+    *image_len = sblock->size;
+
+END_FUNC(STATIC)   /* end H5EA__cache_sblock_image_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_sblock_serialize
+ *
+ * Purpose:	Flushes a dirty object to disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA__cache_sblock_serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
+    void *_thing))
+
+    /* Local variables */
+    H5EA_sblock_t *sblock = (H5EA_sblock_t *)_thing;      /* Pointer to the object to serialize */
+    uint8_t *image = (uint8_t *)_image;         /* Pointer into raw data buffer */
+    uint32_t metadata_chksum;   /* Computed metadata checksum value */
+    size_t u;                   /* Local index variable */
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(image);
+    HDassert(sblock);
+    HDassert(sblock->hdr);
+
+    /* Magic number */
+    HDmemcpy(image, H5EA_SBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    image += H5_SIZEOF_MAGIC;
+
+    /* Version # */
+    *image++ = H5EA_SBLOCK_VERSION;
+
+    /* Extensible array type */
+    *image++ = sblock->hdr->cparam.cls->id;
+
+    /* Address of array header for array which owns this block */
+    H5F_addr_encode(f, &image, sblock->hdr->addr);
+
+    /* Offset of block in array */
+    UINT64ENCODE_VAR(image, sblock->block_off, sblock->hdr->arr_off_size);
+
+    /* Internal information */
+
+    /* Check for 'page init' bitmasks for this super block */
+    if(sblock->dblk_npages > 0) {
+        size_t tot_page_init_size = sblock->ndblks * sblock->dblk_page_init_size;        /* Compute total size of 'page init' buffer */
+
+        /* Store the 'page init' bitmasks */
+        HDmemcpy(image, sblock->page_init, tot_page_init_size);
+        image += tot_page_init_size;
+    } /* end if */
+
+    /* Encode addresses of data blocks in super block */
+    for(u = 0; u < sblock->ndblks; u++)
+        H5F_addr_encode(f, &image, sblock->dblk_addrs[u]);
+
+    /* Compute metadata checksum */
+    metadata_chksum = H5_checksum_metadata(_image, (size_t)(image - (uint8_t *)_image), 0);
+
+    /* Metadata checksum */
+    UINT32ENCODE(image, metadata_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(image - (uint8_t *)_image) == len);
+
+END_FUNC(STATIC)   /* end H5EA__cache_sblock_serialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_sblock_notify
+ *
+ * Purpose:	Handle cache action notifications
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Mar 31 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__cache_sblock_notify(H5AC_notify_action_t action, void *_thing))
+
+    /* Local variables */
+    H5EA_sblock_t *sblock = (H5EA_sblock_t *)_thing;      /* Pointer to the object */
+
+    /* Sanity check */
+    HDassert(sblock);
+
+    /* Check if the file was opened with SWMR-write access */
+    if(sblock->hdr->swmr_write) {
+        /* Determine which action to take */
+        switch(action) {
+            case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+	    case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+                /* Create flush dependency on index block */
+                if(H5EA__create_flush_depend((H5AC_info_t *)sblock->parent, (H5AC_info_t *)sblock) < 0)
+                    H5E_THROW(H5E_CANTDEPEND, "unable to create flush dependency between super block and index block, address = %llu", (unsigned long long)sblock->addr)
+                break;
+
+	    case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+		/* do nothing */
+		break;
+
+	    case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+		/* Destroy flush dependency on index block */
+		if(H5EA__destroy_flush_depend((H5AC_info_t *)sblock->parent, (H5AC_info_t *)sblock) < 0)
+		    H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between super block and index block, address = %llu", (unsigned long long)sblock->addr)
+		break;
+
+            default:
+#ifdef NDEBUG
+                H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
+#else /* NDEBUG */
+                HDassert(0 && "Unknown action?!?");
+#endif /* NDEBUG */
+        } /* end switch */
+    } /* end if */
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5EA__cache_sblock_notify() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_sblock_free_icr
+ *
+ * Purpose:	Destroy/release an "in core representation" of a data
+ *              structure
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__cache_sblock_free_icr(void *thing))
+
+    /* Check arguments */
+    HDassert(thing);
+
+    /* Release the extensible array super block */
+    if(H5EA__sblock_dest((H5EA_sblock_t *)thing) < 0)
+        H5E_THROW(H5E_CANTFREE, "can't free extensible array super block")
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5EA__cache_sblock_free_icr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5EA__cache_dblock_get_load_size
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA__cache_dblock_get_load_size(const void *_image, void *_udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr))
+
+    /* Local variables */
+    const uint8_t *image = (const uint8_t *)_image;  	/* Pointer into raw data buffer */
+    H5EA_dblock_cache_ud_t *udata = (H5EA_dblock_cache_ud_t *)_udata;      /* User data */
+    H5EA_dblock_t dblock;           			/* Fake data block for computing size */
+
+    /* Check arguments */
+    HDassert(udata);
+    HDassert(udata->hdr);
+    HDassert(udata->nelmts > 0);
+    HDassert(image_len);
+
+    if(image == NULL) {
+	/* Set up fake data block for computing size on disk */
+	/* (Note: extracted from H5EA__dblock_alloc) */
+	HDmemset(&dblock, 0, sizeof(dblock));
+
+	/* need to set:
+	 * 
+	 *    dblock.hdr
+	 *    dblock.npages
+	 *    dblock.nelmts
+	 *
+	 * before we invoke either H5EA_DBLOCK_PREFIX_SIZE() or 
+	 * H5EA_DBLOCK_SIZE().
+	 */
+	dblock.hdr = udata->hdr;
+	dblock.nelmts = udata->nelmts;
+
+	if(udata->nelmts > udata->hdr->dblk_page_nelmts) {
+	    /* Set the # of pages in the direct block */
+	    dblock.npages = udata->nelmts / udata->hdr->dblk_page_nelmts;
+	    HDassert(udata->nelmts==(dblock.npages * udata->hdr->dblk_page_nelmts));
+	} /* end if */
+
+	/* Set the image length size */
+	if(!dblock.npages)
+	    *image_len = H5EA_DBLOCK_SIZE(&dblock);
+	else
+	    *image_len = H5EA_DBLOCK_PREFIX_SIZE(&dblock);
+    } else {
+        HDassert(actual_len);
+        HDassert(*actual_len == *image_len);
+    }
+
+END_FUNC(STATIC)   /* end H5EA__cache_dblock_get_load_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_dblock_verify_chksum
+ *
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
+ *
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
+ *
+ * Programmer:	Vailin Choi; Aug 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+htri_t, TRUE, -,
+H5EA__cache_dblock_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSED *_udata))
+
+    /* Local variables */
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+
+    /* Check arguments */
+    HDassert(image);
+
+    /* Get stored and computed checksums */
+    H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
+
+    if(stored_chksum != computed_chksum)
+	ret_value = FALSE;
+
+END_FUNC(STATIC) 	/* end H5EA__cache_sblock_verify_chksum() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_dblock_deserialize
+ *
+ * Purpose:	Loads a data structure from the disk.
+ *
+ * Return:	Success:	Pointer to a new B-tree.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+void *, NULL, NULL,
+H5EA__cache_dblock_deserialize(const void *_image, size_t len,
+    void *_udata, hbool_t H5_ATTR_UNUSED *dirty))
+
+    /* Local variables */
+    H5EA_dblock_t	*dblock = NULL; /* Data block info */
+    H5EA_dblock_cache_ud_t *udata = (H5EA_dblock_cache_ud_t *)_udata;      /* User data */
+    const uint8_t	*image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t            stored_chksum;  /* Stored metadata checksum value */
+    haddr_t             arr_addr;       /* Address of array header in the file */
+
+    /* Check arguments */
+    HDassert(udata);
+    HDassert(udata->hdr);
+    HDassert(udata->parent);
+    HDassert(udata->nelmts > 0);
+    HDassert(H5F_addr_defined(udata->dblk_addr));
+
+    /* Allocate the extensible array data block */
+    if(NULL == (dblock = H5EA__dblock_alloc(udata->hdr, udata->parent, udata->nelmts)))
+	H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array data block")
+
+    HDassert(((!dblock->npages) && (len == H5EA_DBLOCK_SIZE(dblock))) || 
+             (len == H5EA_DBLOCK_PREFIX_SIZE(dblock)));
+
+    /* Set the extensible array data block's information */
+    dblock->addr = udata->dblk_addr;
+
+    /* Magic number */
+    if(HDmemcmp(image, H5EA_DBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+	H5E_THROW(H5E_BADVALUE, "wrong extensible array data block signature")
+    image += H5_SIZEOF_MAGIC;
+
+    /* Version */
+    if(*image++ != H5EA_DBLOCK_VERSION)
+	H5E_THROW(H5E_VERSION, "wrong extensible array data block version")
+
+    /* Extensible array type */
+    if(*image++ != (uint8_t)udata->hdr->cparam.cls->id)
+	H5E_THROW(H5E_BADTYPE, "incorrect extensible array class")
+
+    /* Address of header for array that owns this block (just for file integrity checks) */
+    H5F_addr_decode(udata->hdr->f, &image, &arr_addr);
+    if(H5F_addr_ne(arr_addr, udata->hdr->addr))
+	H5E_THROW(H5E_BADVALUE, "wrong extensible array header address")
+
+    /* Offset of block within the array's address space */
+    UINT64DECODE_VAR(image, dblock->block_off, udata->hdr->arr_off_size);
+
+    /* Internal information */
+
+    /* Only decode elements if the data block is not paged */
+    if(!dblock->npages) {
+        /* Decode elements in data block */
+        /* Convert from raw elements on disk into native elements in memory */
+        if((udata->hdr->cparam.cls->decode)(image, dblock->elmts, udata->nelmts, udata->hdr->cb_ctx) < 0)
+            H5E_THROW(H5E_CANTDECODE, "can't decode extensible array data elements")
+        image += (udata->nelmts * udata->hdr->cparam.raw_elmt_size);
+    } /* end if */
+
+    /* Sanity check */
+    /* (allow for checksum not decoded yet) */
+    HDassert((size_t)(image - (const uint8_t *)_image) == (len - H5EA_SIZEOF_CHKSUM));
+
+    /* Set the data block's size */
+    /* (Note: This is not the same as the image length, for paged data blocks) */
+    dblock->size = H5EA_DBLOCK_SIZE(dblock);
+
+    /* checksum verification already done in verify_chksum cb */
+
+    /* Metadata checksum */
+    UINT32DECODE(image, stored_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(image - (const uint8_t *)_image) == len);
+
+    /* Set return value */
+    ret_value = dblock;
+
+CATCH
+
+    /* Release resources */
+    if(!ret_value)
+        if(dblock && H5EA__dblock_dest(dblock) < 0)
+            H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array data block")
+
+END_FUNC(STATIC)   /* end H5EA__cache_dblock_deserialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5EA__cache_dblock_image_len
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA__cache_dblock_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr))
+
+    /* Local variables */
+    const H5EA_dblock_t *dblock = (const H5EA_dblock_t *)_thing;      /* Pointer to the object */
+
+    /* Check arguments */
+    HDassert(dblock);
+    HDassert(image_len);
+
+    /* Set the image length size */
+    if(!dblock->npages)
+        *image_len = dblock->size;
+    else
+        *image_len = (size_t)H5EA_DBLOCK_PREFIX_SIZE(dblock);
+
+END_FUNC(STATIC)   /* end H5EA__cache_dblock_image_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_dblock_serialize
+ *
+ * Purpose:	Flushes a dirty object to disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__cache_dblock_serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
+    void *_thing))
+
+    /* Local variables */
+    H5EA_dblock_t *dblock = (H5EA_dblock_t *)_thing;      /* Pointer to the object to serialize */
+    uint8_t *image = (uint8_t *)_image;         /* Pointer into raw data buffer */
+    uint32_t metadata_chksum;   /* Computed metadata checksum value */
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(image);
+    HDassert(dblock);
+    HDassert(dblock->hdr);
+
+    /* Magic number */
+    HDmemcpy(image, H5EA_DBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    image += H5_SIZEOF_MAGIC;
+
+    /* Version # */
+    *image++ = H5EA_DBLOCK_VERSION;
+
+    /* Extensible array type */
+    *image++ = dblock->hdr->cparam.cls->id;
+
+    /* Address of array header for array which owns this block */
+    H5F_addr_encode(f, &image, dblock->hdr->addr);
+
+    /* Offset of block in array */
+    UINT64ENCODE_VAR(image, dblock->block_off, dblock->hdr->arr_off_size);
+
+    /* Internal information */
+
+    /* Only encode elements if the data block is not paged */
+    if(!dblock->npages) {
+        /* Encode elements in data block */
+
+        /* Convert from native elements in memory into raw elements on disk */
+        if((dblock->hdr->cparam.cls->encode)(image, dblock->elmts, dblock->nelmts, dblock->hdr->cb_ctx) < 0)
+            H5E_THROW(H5E_CANTENCODE, "can't encode extensible array data elements")
+        image += (dblock->nelmts * dblock->hdr->cparam.raw_elmt_size);
+    } /* end if */
+
+    /* Compute metadata checksum */
+    metadata_chksum = H5_checksum_metadata(_image, (size_t)(image - (uint8_t *)_image), 0);
+
+    /* Metadata checksum */
+    UINT32ENCODE(image, metadata_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(image - (uint8_t *)_image) == len);
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5EA__cache_dblock_serialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_dblock_notify
+ *
+ * Purpose:	Handle cache action notifications
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Mar 31 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__cache_dblock_notify(H5AC_notify_action_t action, void *_thing))
+
+    /* Local variables */
+    H5EA_dblock_t *dblock = (H5EA_dblock_t *)_thing;      /* Pointer to the object */
+
+    /* Check arguments */
+    HDassert(dblock);
+
+    /* Check if the file was opened with SWMR-write access */
+    if(dblock->hdr->swmr_write) {
+        /* Determine which action to take */
+        switch(action) {
+            case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+	    case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+                /* Create flush dependency on parent */
+                if(H5EA__create_flush_depend((H5AC_info_t *)dblock->parent, (H5AC_info_t *)dblock) < 0)
+                    H5E_THROW(H5E_CANTDEPEND, "unable to create flush dependency between data block and parent, address = %llu", (unsigned long long)dblock->addr)
+                break;
+
+	    case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+		/* do nothing */
+		break;
+
+	    case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+		/* Destroy flush dependency on parent */
+		if(H5EA__destroy_flush_depend((H5AC_info_t *)dblock->parent, (H5AC_info_t *)dblock) < 0)
+		    H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between data block and parent, address = %llu", (unsigned long long)dblock->addr)
+		break;
+
+            default:
+#ifdef NDEBUG
+                H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
+#else /* NDEBUG */
+                HDassert(0 && "Unknown action?!?");
+#endif /* NDEBUG */
+        } /* end switch */
+    } /* end if */
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5EA__cache_dblock_notify() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_dblock_free_icr
+ *
+ * Purpose:	Destroy/release an "in core representation" of a data
+ *              structure
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__cache_dblock_free_icr(void *thing))
+
+    /* Check arguments */
+    HDassert(thing);
+
+    /* Release the extensible array data block */
+    if(H5EA__dblock_dest((H5EA_dblock_t *)thing) < 0)
+        H5E_THROW(H5E_CANTFREE, "can't free extensible array data block")
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5EA__cache_dblock_free_icr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5EA__cache_dblock_fsf_size
+ *
+ * Purpose:     Tell the metadata cache the actual amount of file space
+ *              to free when a dblock entry is destroyed with the free
+ *              file space block set.
+ *
+ *              This function is needed when the data block is paged, as
+ *              the datablock header and all its pages are allocted as a
+ *              single contiguous chunk of file space, and must be
+ *              deallocated the same way.
+ *
+ *              The size of the chunk of memory in which the dblock
+ *              header and all its pages is stored in the size field,
+ *              so we simply pass that value back to the cache.
+ *
+ *              If the datablock is not paged, then the size field of
+ *              the cache_info contains the correct size.  However this
+ *              value will be the same as the size field, so we return
+ *              the contents of the size field to the cache in this case
+ *              as well.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              12/5/14
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA__cache_dblock_fsf_size(const void *_thing, size_t *fsf_size))
+
+    /* Local variables */
+    const H5EA_dblock_t *dblock = (const H5EA_dblock_t *)_thing;        /* Pointer to the object */
+
+    /* Check arguments */
+    HDassert(dblock);
+    HDassert(dblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(dblock->cache_info.type == H5AC_EARRAY_DBLOCK);
+    HDassert(fsf_size);
+
+    *fsf_size = dblock->size;
+
+END_FUNC(STATIC)   /* end H5EA__cache_dblock_fsf_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5EA__cache_dblk_page_get_load_size
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA__cache_dblk_page_get_load_size(const void *_image, void *_udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr))
+
+    /* Local variables */
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    H5EA_dblk_page_cache_ud_t *udata = (H5EA_dblk_page_cache_ud_t *)_udata;      /* User data */
+
+    /* Check arguments */
+    HDassert(udata);
+    HDassert(udata->hdr);
+    HDassert(image_len);
+
+    if(image == NULL)
+	*image_len = (size_t)H5EA_DBLK_PAGE_SIZE(udata->hdr);
+    else {
+        HDassert(actual_len);
+        HDassert(*actual_len == *image_len);
+    }
+
+END_FUNC(STATIC)   /* end H5EA__cache_dblk_page_get_load_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_dblk_page_verify_chksum
+ *
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
+ *
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
+ *
+ * Programmer:	Vailin Choi; Aug 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+htri_t, TRUE, -,
+H5EA__cache_dblk_page_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSED *_udata))
+
+    /* Local variables */
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+
+    /* Check arguments */
+    HDassert(image);
+
+    /* Get stored and computed checksums */
+    H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
+
+    if(stored_chksum != computed_chksum)
+	ret_value = FALSE;
+
+END_FUNC(STATIC) 	/* end H5EA__cache_dblk_page_verify_chksum() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_dblk_page_deserialize
+ *
+ * Purpose:	Loads a data structure from the disk.
+ *
+ * Return:	Success:	Pointer to a new B-tree.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+void *, NULL, NULL,
+H5EA__cache_dblk_page_deserialize(const void *_image, size_t len,
+    void *_udata, hbool_t H5_ATTR_UNUSED *dirty))
+
+    /* Local variables */
+    H5EA_dblk_page_t	*dblk_page = NULL; /* Data block page info */
+    H5EA_dblk_page_cache_ud_t *udata = (H5EA_dblk_page_cache_ud_t *)_udata;      /* User data for loading data block page */
+    const uint8_t	*image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t            stored_chksum;  /* Stored metadata checksum value */
+
+    /* Sanity check */
+    HDassert(udata);
+    HDassert(udata->hdr);
+    HDassert(udata->parent);
+    HDassert(H5F_addr_defined(udata->dblk_page_addr));
+
+    /* Allocate the extensible array data block page */
+    if(NULL == (dblk_page = H5EA__dblk_page_alloc(udata->hdr, udata->parent)))
+	H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array data block page")
+
+    /* Set the extensible array data block page's information */
+    dblk_page->addr = udata->dblk_page_addr;
+
+    /* Internal information */
+
+    /* Decode elements in data block page */
+    /* Convert from raw elements on disk into native elements in memory */
+    if((udata->hdr->cparam.cls->decode)(image, dblk_page->elmts, udata->hdr->dblk_page_nelmts, udata->hdr->cb_ctx) < 0)
+        H5E_THROW(H5E_CANTDECODE, "can't decode extensible array data elements")
+    image += (udata->hdr->dblk_page_nelmts * udata->hdr->cparam.raw_elmt_size);
+
+    /* Sanity check */
+    /* (allow for checksum not decoded yet) */
+    HDassert((size_t)(image - (const uint8_t *)_image) == (len - H5EA_SIZEOF_CHKSUM));
+
+    /* Set the data block page's size */
+    dblk_page->size = len;
+
+    /* checksum verification already done in verify_chksum cb */
+
+    /* Metadata checksum */
+    UINT32DECODE(image, stored_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(image - (const uint8_t *)_image) == dblk_page->size);
+
+    /* Set return value */
+    ret_value = dblk_page;
+
+CATCH
+
+    /* Release resources */
+    if(!ret_value)
+        if(dblk_page && H5EA__dblk_page_dest(dblk_page) < 0)
+            H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array data block page")
+
+END_FUNC(STATIC)   /* end H5EA__cache_dblk_page_deserialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5EA__cache_dblk_page_image_len
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA__cache_dblk_page_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr))
+
+    /* Local variables */
+    const H5EA_dblk_page_t *dblk_page = (const H5EA_dblk_page_t *)_thing;      /* Pointer to the object */
+
+    /* Check arguments */
+    HDassert(dblk_page);
+    HDassert(image_len);
+
+    /* Set the image length size */
+    *image_len = dblk_page->size;
+
+END_FUNC(STATIC)   /* end H5EA__cache_dblk_page_image_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_dblk_page_serialize
+ *
+ * Purpose:	Flushes a dirty object to disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__cache_dblk_page_serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
+    void *_thing))
+
+    /* Local variables */
+    H5EA_dblk_page_t *dblk_page = (H5EA_dblk_page_t *)_thing;      /* Pointer to the object to serialize */
+    uint8_t *image = (uint8_t *)_image;         /* Pointer into raw data buffer */
+    uint32_t metadata_chksum;   /* Computed metadata checksum value */
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(image);
+    HDassert(dblk_page);
+    HDassert(dblk_page->hdr);
+
+    /* Internal information */
+
+    /* Encode elements in data block page */
+
+    /* Convert from native elements in memory into raw elements on disk */
+    if((dblk_page->hdr->cparam.cls->encode)(image, dblk_page->elmts, dblk_page->hdr->dblk_page_nelmts, dblk_page->hdr->cb_ctx) < 0)
+        H5E_THROW(H5E_CANTENCODE, "can't encode extensible array data elements")
+    image += (dblk_page->hdr->dblk_page_nelmts * dblk_page->hdr->cparam.raw_elmt_size);
+
+    /* Compute metadata checksum */
+    metadata_chksum = H5_checksum_metadata(_image, (size_t)(image - (uint8_t *)_image), 0);
+
+    /* Metadata checksum */
+    UINT32ENCODE(image, metadata_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(image - (uint8_t *)_image) == len);
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5EA__cache_dblk_page_serialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_dblk_page_notify
+ *
+ * Purpose:	Handle cache action notifications
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Mar 31 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__cache_dblk_page_notify(H5AC_notify_action_t action, void *_thing))
+
+    /* Local variables */
+    H5EA_dblk_page_t *dblk_page = (H5EA_dblk_page_t *)_thing;      /* Pointer to the object */
+
+    /* Sanity check */
+    HDassert(dblk_page);
+
+    /* Check if the file was opened with SWMR-write access */
+    if(dblk_page->hdr->swmr_write) {
+        /* Determine which action to take */
+        switch(action) {
+            case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+	    case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+                /* Create flush dependency on parent */
+                if(H5EA__create_flush_depend((H5AC_info_t *)dblk_page->parent, (H5AC_info_t *)dblk_page) < 0)
+                    H5E_THROW(H5E_CANTDEPEND, "unable to create flush dependency between data block page and parent, address = %llu", (unsigned long long)dblk_page->addr)
+                break;
+
+	    case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+		/* do nothing */
+		break;
+
+	    case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+		/* Destroy flush dependency on parent */
+		if(H5EA__destroy_flush_depend((H5AC_info_t *)dblk_page->parent, (H5AC_info_t *)dblk_page) < 0)
+		    H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between data block page and parent, address = %llu", (unsigned long long)dblk_page->addr)
+            break;
+
+            default:
+#ifdef NDEBUG
+                H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
+#else /* NDEBUG */
+                HDassert(0 && "Unknown action?!?");
+#endif /* NDEBUG */
+        } /* end switch */
+    } /* end if */
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5EA__cache_dblk_page_notify() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__cache_dblk_page_free_icr
+ *
+ * Purpose:	Destroy/release an "in core representation" of a data
+ *              structure
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__cache_dblk_page_free_icr(void *thing))
+
+    /* Check arguments */
+    HDassert(thing);
+
+    /* Release the extensible array data block page */
+    if(H5EA__dblk_page_dest((H5EA_dblk_page_t *)thing) < 0)
+        H5E_THROW(H5E_CANTFREE, "can't free extensible array data block page")
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5EA__cache_dblk_page_free_icr() */
+
diff --git a/src/H5EAdbg.c b/src/H5EAdbg.c
new file mode 100644
index 0000000..ef45881
--- /dev/null
+++ b/src/H5EAdbg.c
@@ -0,0 +1,478 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5EAdbg.c
+ *			Sep 11 2008
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Dump debugging information about an extensible array.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5EAmodule.h"         /* This source code file is part of the H5EA module */
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5EApkg.h"		/* Extensible Arrays			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__hdr_debug
+ *
+ * Purpose:	Prints debugging info about a extensible array header.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 11 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
+    int fwidth, const H5EA_class_t *cls, haddr_t obj_addr))
+
+    /* Local variables */
+    H5EA_hdr_t *hdr = NULL; 	/* Shared extensible array header */
+    void *dbg_ctx = NULL;       /* Extensible array debugging context */
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(H5F_addr_defined(obj_addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+    HDassert(cls);
+
+    /* Check for debugging context callback available */
+    if(cls->crt_dbg_ctx) {
+        /* Create debugging context */
+        if(NULL == (dbg_ctx = cls->crt_dbg_ctx(f, dxpl_id, obj_addr)))
+            H5E_THROW(H5E_CANTGET, "unable to create fixed array debugging context")
+    } /* end if */
+
+    /* Load the extensible array header */
+    if(NULL == (hdr = H5EA__hdr_protect(f, dxpl_id, addr, dbg_ctx, H5AC__READ_ONLY_FLAG)))
+	H5E_THROW(H5E_CANTPROTECT, "unable to load extensible array header")
+
+    /* Print opening message */
+    HDfprintf(stream, "%*sExtensible Array Header...\n", indent, "");
+
+    /* Print the values */
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "Array class ID:",  hdr->cparam.cls->name);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Header size:",
+	      hdr->size);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Raw Element Size:",
+	      (unsigned)hdr->cparam.raw_elmt_size);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Native Element Size (on this platform):",
+	      hdr->cparam.cls->nat_elmt_size);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Log2(Max. # of elements in array):",
+	      (unsigned)hdr->cparam.max_nelmts_bits);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "# of elements in index block:",
+	      (unsigned)hdr->cparam.idx_blk_elmts);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Min. # of elements per data block:",
+	      (unsigned)hdr->cparam.data_blk_min_elmts);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Min. # of data block pointers for a super block:",
+	      (unsigned)hdr->cparam.sup_blk_min_data_ptrs);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Log2(Max. # of elements in data block page):",
+	      (unsigned)hdr->cparam.max_dblk_page_nelmts_bits);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Highest element index stored (+1):",
+	      hdr->stats.stored.max_idx_set);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Number of super blocks created:",
+	      hdr->stats.stored.nsuper_blks);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Number of data blocks created:",
+	      hdr->stats.stored.ndata_blks);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+	      "Number of elements 'realized':",
+	      hdr->stats.stored.nelmts);
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+	      "Index Block Address:",
+	      hdr->idx_blk_addr);
+
+CATCH
+    if(dbg_ctx && cls->dst_dbg_ctx(dbg_ctx) < 0)
+        H5E_THROW(H5E_CANTRELEASE, "unable to release extensible array debugging context")
+    if(hdr && H5EA__hdr_unprotect(hdr, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+	H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array header")
+
+END_FUNC(PKG)   /* end H5EA__hdr_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__iblock_debug
+ *
+ * Purpose:	Prints debugging info about a extensible array index block.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 11 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__iblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t H5_ATTR_UNUSED addr, FILE *stream, int indent,
+    int fwidth, const H5EA_class_t *cls, haddr_t hdr_addr, haddr_t obj_addr))
+
+    /* Local variables */
+    H5EA_hdr_t *hdr = NULL;         /* Shared extensible array header */
+    H5EA_iblock_t *iblock = NULL;   /* Extensible array index block */
+    void *dbg_ctx = NULL;           /* Extensible array context */
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+    HDassert(cls);
+    HDassert(H5F_addr_defined(hdr_addr));
+    HDassert(H5F_addr_defined(obj_addr));
+
+    /* Check for debugging context callback available */
+    if(cls->crt_dbg_ctx) {
+        /* Create debugging context */
+        if(NULL == (dbg_ctx = cls->crt_dbg_ctx(f, dxpl_id, obj_addr)))
+            H5E_THROW(H5E_CANTGET, "unable to create extensible array debugging context")
+    } /* end if */
+
+    /* Load the extensible array header */
+    if(NULL == (hdr = H5EA__hdr_protect(f, dxpl_id, hdr_addr, dbg_ctx, H5AC__READ_ONLY_FLAG)))
+	H5E_THROW(H5E_CANTPROTECT, "unable to load extensible array header")
+
+    /* Sanity check */
+    HDassert(H5F_addr_eq(hdr->idx_blk_addr, addr));
+
+    /* Protect index block */
+    if(NULL == (iblock = H5EA__iblock_protect(hdr, dxpl_id, H5AC__READ_ONLY_FLAG)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect extensible array index block, address = %llu", (unsigned long long)hdr->idx_blk_addr)
+
+    /* Print opening message */
+    HDfprintf(stream, "%*sExtensible Array Index Block...\n", indent, "");
+
+    /* Print the values */
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "Array class ID:",  hdr->cparam.cls->name);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Index Block size:",
+	      iblock->size);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "# of data block addresses in index block:",
+	      iblock->ndblk_addrs);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "# of super block addresses in index block:",
+	      iblock->nsblk_addrs);
+
+    /* Check if there are any elements in index block */
+    if(hdr->cparam.idx_blk_elmts > 0) {
+        unsigned u;             /* Local index variable */
+
+        /* Print the elements in the index block */
+        HDfprintf(stream, "%*sElements in Index Block:\n", indent, "");
+        for(u = 0; u < hdr->cparam.idx_blk_elmts; u++) {
+            /* Call the class's 'debug' callback */
+            if((hdr->cparam.cls->debug)(stream, (indent + 3), MAX(0, (fwidth - 3)),
+                    (hsize_t)u,
+                    ((uint8_t *)iblock->elmts) + (hdr->cparam.cls->nat_elmt_size * u)) < 0)
+                H5E_THROW(H5E_CANTGET, "can't get element for debugging")
+        } /* end for */
+    } /* end if */
+
+    /* Check if there are any data block addresses in index block */
+    if(iblock->ndblk_addrs > 0) {
+        char temp_str[128];     /* Temporary string, for formatting */
+        unsigned u;             /* Local index variable */
+
+        /* Print the data block addresses in the index block */
+        HDfprintf(stream, "%*sData Block Addresses in Index Block:\n", indent, "");
+        for(u = 0; u < iblock->ndblk_addrs; u++) {
+            /* Print address */
+            sprintf(temp_str, "Address #%u:", u);
+            HDfprintf(stream, "%*s%-*s %a\n", (indent + 3), "", MAX(0, (fwidth - 3)),
+                temp_str,
+                iblock->dblk_addrs[u]);
+        } /* end for */
+    } /* end if */
+
+    /* Check if there are any super block addresses in index block */
+    if(iblock->nsblk_addrs > 0) {
+        char temp_str[128];     /* Temporary string, for formatting */
+        unsigned u;             /* Local index variable */
+
+        /* Print the super block addresses in the index block */
+        HDfprintf(stream, "%*sSuper Block Addresses in Index Block:\n", indent, "");
+        for(u = 0; u < iblock->nsblk_addrs; u++) {
+            /* Print address */
+            sprintf(temp_str, "Address #%u:", u);
+            HDfprintf(stream, "%*s%-*s %a\n", (indent + 3), "", MAX(0, (fwidth - 3)),
+                temp_str,
+                iblock->sblk_addrs[u]);
+        } /* end for */
+    } /* end if */
+
+CATCH
+    if(dbg_ctx && cls->dst_dbg_ctx(dbg_ctx) < 0)
+        H5E_THROW(H5E_CANTRELEASE, "unable to release extensible array debugging context")
+    if(iblock && H5EA__iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array index block")
+    if(hdr && H5EA__hdr_unprotect(hdr, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+	H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array header")
+
+END_FUNC(PKG)   /* end H5EA__iblock_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__sblock_debug
+ *
+ * Purpose:	Prints debugging info about a extensible array super block.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 30 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__sblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
+    int fwidth, const H5EA_class_t *cls, haddr_t hdr_addr, unsigned sblk_idx, haddr_t obj_addr))
+
+    /* Local variables */
+    H5EA_hdr_t *hdr = NULL;         /* Shared extensible array header */
+    H5EA_sblock_t *sblock = NULL;   /* Extensible array super block */
+    void *dbg_ctx = NULL;           /* Extensible array context */
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+    HDassert(cls);
+    HDassert(H5F_addr_defined(hdr_addr));
+    HDassert(H5F_addr_defined(obj_addr));
+
+    /* Check for debugging context callback available */
+    if(cls->crt_dbg_ctx) {
+        /* Create debugging context */
+        if(NULL == (dbg_ctx = cls->crt_dbg_ctx(f, dxpl_id, obj_addr)))
+            H5E_THROW(H5E_CANTGET, "unable to create extensible array debugging context")
+    } /* end if */
+
+    /* Load the extensible array header */
+    if(NULL == (hdr = H5EA__hdr_protect(f, dxpl_id, hdr_addr, dbg_ctx, H5AC__READ_ONLY_FLAG)))
+	H5E_THROW(H5E_CANTPROTECT, "unable to load extensible array header")
+
+    /* Protect super block */
+    /* (Note: setting parent of super block to 'hdr' for this operation should be OK -QAK) */
+    if(NULL == (sblock = H5EA__sblock_protect(hdr, dxpl_id, (H5EA_iblock_t *)hdr, addr, sblk_idx, H5AC__READ_ONLY_FLAG)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect extensible array super block, address = %llu", (unsigned long long)addr)
+
+    /* Print opening message */
+    HDfprintf(stream, "%*sExtensible Array Super Block...\n", indent, "");
+
+    /* Print the values */
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "Array class ID:",  hdr->cparam.cls->name);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Super Block size:",
+	      sblock->size);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "# of data block addresses in super block:",
+	      sblock->ndblks);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "# of elements in data blocks from this super block:",
+	      sblock->dblk_nelmts);
+
+    /* Check if there are any data block addresses in super block */
+    if(sblock->ndblks > 0) {
+        char temp_str[128];     /* Temporary string, for formatting */
+        unsigned u;             /* Local index variable */
+
+        /* Print the data block addresses in the super block */
+        HDfprintf(stream, "%*sData Block Addresses in Super Block:\n", indent, "");
+        for(u = 0; u < sblock->ndblks; u++) {
+            /* Print address */
+            sprintf(temp_str, "Address #%u:", u);
+            HDfprintf(stream, "%*s%-*s %a\n", (indent + 3), "", MAX(0, (fwidth - 3)),
+                temp_str,
+                sblock->dblk_addrs[u]);
+        } /* end for */
+    } /* end if */
+
+CATCH
+    if(dbg_ctx && cls->dst_dbg_ctx(dbg_ctx) < 0)
+        H5E_THROW(H5E_CANTRELEASE, "unable to release extensible array debugging context")
+    if(sblock && H5EA__sblock_unprotect(sblock, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array super block")
+    if(hdr && H5EA__hdr_unprotect(hdr, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+	H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array header")
+
+END_FUNC(PKG)   /* end H5EA__sblock_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__dblock_debug
+ *
+ * Purpose:	Prints debugging info about a extensible array data block.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 22 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__dblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
+    int fwidth, const H5EA_class_t *cls, haddr_t hdr_addr, size_t dblk_nelmts, haddr_t obj_addr))
+
+    /* Local variables */
+    H5EA_hdr_t *hdr = NULL;             /* Shared extensible array header */
+    H5EA_dblock_t *dblock = NULL;       /* Extensible array data block */
+    void *dbg_ctx = NULL;               /* Extensible array context */
+    size_t u;                           /* Local index variable */
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+    HDassert(cls);
+    HDassert(H5F_addr_defined(hdr_addr));
+    HDassert(H5F_addr_defined(obj_addr));
+    HDassert(dblk_nelmts > 0);
+
+    /* Check for debugging context callback available */
+    if(cls->crt_dbg_ctx) {
+        /* Create debugging context */
+        if(NULL == (dbg_ctx = cls->crt_dbg_ctx(f, dxpl_id, obj_addr)))
+            H5E_THROW(H5E_CANTGET, "unable to create extensible array debugging context")
+    } /* end if */
+
+    /* Load the extensible array header */
+    if(NULL == (hdr = H5EA__hdr_protect(f, dxpl_id, hdr_addr, dbg_ctx, H5AC__READ_ONLY_FLAG)))
+	H5E_THROW(H5E_CANTPROTECT, "unable to load extensible array header")
+
+    /* Protect data block */
+    /* (Note: setting parent of data block to 'hdr' for this operation should be OK -QAK) */
+    if(NULL == (dblock = H5EA__dblock_protect(hdr, dxpl_id, hdr, addr, dblk_nelmts, H5AC__READ_ONLY_FLAG)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect extensible array data block, address = %llu", (unsigned long long)addr)
+
+    /* Print opening message */
+    HDfprintf(stream, "%*sExtensible Array data Block...\n", indent, "");
+
+    /* Print the values */
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+	      "Array class ID:",  hdr->cparam.cls->name);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+	      "Data Block size:",
+	      dblock->size);
+
+
+    /* Print the elements in the index block */
+    HDfprintf(stream, "%*sElements:\n", indent, "");
+    for(u = 0; u < dblk_nelmts; u++) {
+        /* Call the class's 'debug' callback */
+        if((hdr->cparam.cls->debug)(stream, (indent + 3), MAX(0, (fwidth - 3)),
+                (hsize_t)u,
+                ((uint8_t *)dblock->elmts) + (hdr->cparam.cls->nat_elmt_size * u)) < 0)
+            H5E_THROW(H5E_CANTGET, "can't get element for debugging")
+    } /* end for */
+
+CATCH
+    if(dbg_ctx && cls->dst_dbg_ctx(dbg_ctx) < 0)
+        H5E_THROW(H5E_CANTRELEASE, "unable to release extensible array debugging context")
+    if(dblock && H5EA__dblock_unprotect(dblock, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array data block")
+    if(hdr && H5EA__hdr_unprotect(hdr, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+	H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array header")
+
+END_FUNC(PKG)   /* end H5EA__dblock_debug() */
+
diff --git a/src/H5EAdblkpage.c b/src/H5EAdblkpage.c
new file mode 100644
index 0000000..9f3b39a
--- /dev/null
+++ b/src/H5EAdblkpage.c
@@ -0,0 +1,322 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5EAdblkpage.c
+ *			Nov 20 2008
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Data block page routines for extensible arrays.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5EAmodule.h"         /* This source code file is part of the H5EA module */
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5EApkg.h"		/* Extensible Arrays			*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5EA_dblk_page_t struct */
+H5FL_DEFINE_STATIC(H5EA_dblk_page_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__dblk_page_alloc
+ *
+ * Purpose:	Allocate extensible array data block page
+ *
+ * Return:	Non-NULL pointer to data block on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov 20 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+H5EA_dblk_page_t *, NULL, NULL,
+H5EA__dblk_page_alloc(H5EA_hdr_t *hdr, H5EA_sblock_t *parent))
+
+    /* Local variables */
+    H5EA_dblk_page_t *dblk_page = NULL;          /* Extensible array data block page */
+
+    /* Check arguments */
+    HDassert(hdr);
+
+    /* Allocate memory for the data block */
+    if(NULL == (dblk_page = H5FL_CALLOC(H5EA_dblk_page_t)))
+	H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array data block page")
+
+    /* Share common array information */
+    if(H5EA__hdr_incr(hdr) < 0)
+	H5E_THROW(H5E_CANTINC, "can't increment reference count on shared array header")
+    dblk_page->hdr = hdr;
+
+    /* Set non-zero internal fields */
+    dblk_page->parent = parent;
+
+    /* Allocate buffer for elements in data block page */
+    if(NULL == (dblk_page->elmts = H5EA__hdr_alloc_elmts(hdr, hdr->dblk_page_nelmts)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for data block page element buffer")
+
+    /* Set the return value */
+    ret_value = dblk_page;
+
+CATCH
+    if(!ret_value)
+        if(dblk_page && H5EA__dblk_page_dest(dblk_page) < 0)
+            H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array data block page")
+
+END_FUNC(PKG)   /* end H5EA__dblk_page_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__dblk_page_create
+ *
+ * Purpose:	Creates a new extensible array data block page in the file
+ *
+ * Return:	Valid file address on success/HADDR_UNDEF on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov 20 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__dblk_page_create(H5EA_hdr_t *hdr, hid_t dxpl_id, H5EA_sblock_t *parent,
+    haddr_t addr))
+
+    /* Local variables */
+    H5EA_dblk_page_t *dblk_page = NULL;      /* Extensible array data block page */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called, addr = %a\n", FUNC, addr);
+#endif /* QAK */
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* Allocate the data block page */
+    if(NULL == (dblk_page = H5EA__dblk_page_alloc(hdr, parent)))
+	H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array data block page")
+
+    /* Set info about data block page on disk */
+    dblk_page->addr = addr;
+    dblk_page->size = H5EA_DBLK_PAGE_SIZE(hdr);
+#ifdef QAK
+HDfprintf(stderr, "%s: dblk_page->size = %Zu\n", FUNC, dblk_page->size);
+#endif /* QAK */
+
+    /* Clear any elements in data block page to fill value */
+    if((hdr->cparam.cls->fill)(dblk_page->elmts, (size_t)hdr->dblk_page_nelmts) < 0)
+        H5E_THROW(H5E_CANTSET, "can't set extensible array data block page elements to class's fill value")
+
+    /* Cache the new extensible array data block page */
+    if(H5AC_insert_entry(hdr->f, dxpl_id, H5AC_EARRAY_DBLK_PAGE, dblk_page->addr, dblk_page, H5AC__NO_FLAGS_SET) < 0)
+	H5E_THROW(H5E_CANTINSERT, "can't add extensible array data block page to cache")
+
+CATCH
+    if(ret_value < 0)
+        if(dblk_page) {
+            /* Destroy data block page */
+            if(H5EA__dblk_page_dest(dblk_page) < 0)
+                H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array data block page")
+        } /* end if */
+
+END_FUNC(PKG)   /* end H5EA__dblk_page_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__dblk_page_protect
+ *
+ * Purpose:	Convenience wrapper around protecting extensible array data
+ *              block page
+ *
+ * Return:	Non-NULL pointer to data block page on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov 20 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+H5EA_dblk_page_t *, NULL, NULL,
+H5EA__dblk_page_protect(H5EA_hdr_t *hdr, hid_t dxpl_id, H5EA_sblock_t *parent,
+    haddr_t dblk_page_addr, unsigned flags))
+
+    /* Local variables */
+    H5EA_dblk_page_cache_ud_t udata;      /* Information needed for loading data block page */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(H5F_addr_defined(dblk_page_addr));
+
+    /* only the H5AC__READ_ONLY_FLAG may be set */
+    HDassert((flags & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
+    /* Set up user data */
+    udata.hdr = hdr;
+    udata.parent = parent;
+    udata.dblk_page_addr = dblk_page_addr;
+
+    /* Protect the data block page */
+    if(NULL == (ret_value = (H5EA_dblk_page_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_EARRAY_DBLK_PAGE, dblk_page_addr, &udata, flags)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect extensible array data block page, address = %llu", (unsigned long long)dblk_page_addr)
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__dblk_page_protect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__dblk_page_unprotect
+ *
+ * Purpose:	Convenience wrapper around unprotecting extensible array
+ *              data block page
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov 20 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__dblk_page_unprotect(H5EA_dblk_page_t *dblk_page, hid_t dxpl_id,
+    unsigned cache_flags))
+
+    /* Local variables */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /* Sanity check */
+    HDassert(dblk_page);
+
+    /* Unprotect the data block page */
+    if(H5AC_unprotect(dblk_page->hdr->f, dxpl_id, H5AC_EARRAY_DBLK_PAGE, dblk_page->addr, dblk_page, cache_flags) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to unprotect extensible array data block page, address = %llu", (unsigned long long)dblk_page->addr)
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__dblk_page_unprotect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__dblk_page_dest
+ *
+ * Purpose:	Destroys an extensible array data block page in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Nov 20 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__dblk_page_dest(H5EA_dblk_page_t *dblk_page))
+
+    /* Sanity check */
+    HDassert(dblk_page);
+
+    /* Check if header field has been initialized */
+    if(dblk_page->hdr) {
+        /* Check if buffer for data block page elements has been initialized */
+        if(dblk_page->elmts) {
+            /* Free buffer for data block page elements */
+            if(H5EA__hdr_free_elmts(dblk_page->hdr, dblk_page->hdr->dblk_page_nelmts, dblk_page->elmts) < 0)
+                H5E_THROW(H5E_CANTFREE, "unable to free extensible array data block element buffer")
+            dblk_page->elmts = NULL;
+        } /* end if */
+
+        /* Decrement reference count on shared info */
+        if(H5EA__hdr_decr(dblk_page->hdr) < 0)
+            H5E_THROW(H5E_CANTDEC, "can't decrement reference count on shared array header")
+        dblk_page->hdr = NULL;
+    } /* end if */
+
+    /* Free the data block page itself */
+    dblk_page = H5FL_FREE(H5EA_dblk_page_t, dblk_page);
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__dblk_page_dest() */
+
diff --git a/src/H5EAdblock.c b/src/H5EAdblock.c
new file mode 100644
index 0000000..3eaaf1c
--- /dev/null
+++ b/src/H5EAdblock.c
@@ -0,0 +1,491 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5EAdblock.c
+ *			Sep 11 2008
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Data block routines for extensible arrays.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5EAmodule.h"         /* This source code file is part of the H5EA module */
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5EApkg.h"		/* Extensible Arrays			*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5EA_dblock_t struct */
+H5FL_DEFINE_STATIC(H5EA_dblock_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__dblock_alloc
+ *
+ * Purpose:	Allocate extensible array data block
+ *
+ * Return:	Non-NULL pointer to data block on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 11 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+H5EA_dblock_t *, NULL, NULL,
+H5EA__dblock_alloc(H5EA_hdr_t *hdr, void *parent, size_t nelmts))
+
+    /* Local variables */
+    H5EA_dblock_t *dblock = NULL;          /* Extensible array data block */
+
+    /* Check arguments */
+    HDassert(hdr);
+    HDassert(parent);
+    HDassert(nelmts > 0);
+
+    /* Allocate memory for the data block */
+    if(NULL == (dblock = H5FL_CALLOC(H5EA_dblock_t)))
+	H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array data block")
+
+    /* Share common array information */
+    if(H5EA__hdr_incr(hdr) < 0)
+	H5E_THROW(H5E_CANTINC, "can't increment reference count on shared array header")
+    dblock->hdr = hdr;
+
+    /* Set non-zero internal fields */
+    dblock->parent = parent;
+    dblock->nelmts = nelmts;
+
+    /* Check if the data block is not going to be paged */
+    if(nelmts > hdr->dblk_page_nelmts) {
+        /* Set the # of pages in the direct block */
+        dblock->npages = nelmts / hdr->dblk_page_nelmts;
+        HDassert(nelmts == (dblock->npages * hdr->dblk_page_nelmts));
+    } /* end if */
+    else {
+        /* Allocate buffer for elements in data block */
+        if(NULL == (dblock->elmts = H5EA__hdr_alloc_elmts(hdr, nelmts)))
+            H5E_THROW(H5E_CANTALLOC, "memory allocation failed for data block element buffer")
+    } /* end else */
+
+    /* Set the return value */
+    ret_value = dblock;
+
+CATCH
+    if(!ret_value)
+        if(dblock && H5EA__dblock_dest(dblock) < 0)
+            H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array data block")
+
+END_FUNC(PKG)   /* end H5EA__dblock_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__dblock_create
+ *
+ * Purpose:	Creates a new extensible array data block in the file
+ *
+ * Return:	Valid file address on success/HADDR_UNDEF on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep  9 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+haddr_t, HADDR_UNDEF, HADDR_UNDEF,
+H5EA__dblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id, void *parent,
+    hbool_t *stats_changed, hsize_t dblk_off, size_t nelmts))
+
+    /* Local variables */
+    H5EA_dblock_t *dblock = NULL;       /* Extensible array data block */
+    haddr_t dblock_addr;                /* Extensible array data block address */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called, hdr->dblk_page_nelmts = %Zu, nelmts = %Zu\n", FUNC, hdr->dblk_page_nelmts, nelmts);
+#endif /* QAK */
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(stats_changed);
+    HDassert(nelmts > 0);
+
+    /* Allocate the data block */
+    if(NULL == (dblock = H5EA__dblock_alloc(hdr, parent, nelmts)))
+	H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array data block")
+
+    /* Set size of data block on disk */
+    dblock->size = H5EA_DBLOCK_SIZE(dblock);
+#ifdef QAK
+HDfprintf(stderr, "%s: dblock->size = %Zu\n", FUNC, dblock->size);
+#endif /* QAK */
+
+    /* Set offset of block in array's address space */
+    dblock->block_off = dblk_off;
+#ifdef QAK
+HDfprintf(stderr, "%s: dblock->block_off = %Hu\n", FUNC, dblock->block_off);
+#endif /* QAK */
+
+    /* Allocate space for the data block on disk */
+    if(HADDR_UNDEF == (dblock_addr = H5MF_alloc(hdr->f, H5FD_MEM_EARRAY_DBLOCK, dxpl_id, (hsize_t)dblock->size)))
+	H5E_THROW(H5E_CANTALLOC, "file allocation failed for extensible array data block")
+    dblock->addr = dblock_addr;
+
+    /* Don't initialize elements if paged */
+    if(!dblock->npages)
+        /* Clear any elements in data block to fill value */
+        if((hdr->cparam.cls->fill)(dblock->elmts, (size_t)dblock->nelmts) < 0)
+            H5E_THROW(H5E_CANTSET, "can't set extensible array data block elements to class's fill value")
+
+    /* Cache the new extensible array data block */
+    if(H5AC_insert_entry(hdr->f, dxpl_id, H5AC_EARRAY_DBLOCK, dblock_addr, dblock, H5AC__NO_FLAGS_SET) < 0)
+	H5E_THROW(H5E_CANTINSERT, "can't add extensible array data block to cache")
+
+    /* Update extensible array data block statistics */
+    hdr->stats.stored.ndata_blks++;
+    hdr->stats.stored.data_blk_size += dblock->size;
+
+    /* Increment count of elements "realized" */
+    hdr->stats.stored.nelmts += nelmts;
+
+    /* Mark the statistics as changed */
+    *stats_changed = TRUE;
+
+    /* Set address of data block to return */
+    ret_value = dblock_addr;
+
+CATCH
+    if(!H5F_addr_defined(ret_value))
+        if(dblock) {
+            /* Release data block's disk space */
+            if(H5F_addr_defined(dblock->addr) && H5MF_xfree(hdr->f, H5FD_MEM_EARRAY_DBLOCK, dxpl_id, dblock->addr, (hsize_t)dblock->size) < 0)
+                H5E_THROW(H5E_CANTFREE, "unable to release extensible array data block")
+
+            /* Destroy data block */
+            if(H5EA__dblock_dest(dblock) < 0)
+                H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array data block")
+        } /* end if */
+
+END_FUNC(PKG)   /* end H5EA__dblock_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__dblock_sblk_idx
+ *
+ * Purpose:	Compute the index of the super block where the element is
+ *              located.
+ *
+ * Return:	Super block index on success/Can't fail
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 11 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, NOERR,
+unsigned, 0, -,
+H5EA__dblock_sblk_idx(const H5EA_hdr_t *hdr, hsize_t idx))
+
+    /* Local variables */
+    unsigned sblk_idx;      /* Which superblock does this index fall in? */
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(idx >= hdr->cparam.idx_blk_elmts);
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Entering - idx = %Hu\n", FUNC, idx);
+#endif /* QAK */
+    /* Adjust index for elements in index block */
+    idx -= hdr->cparam.idx_blk_elmts;
+#ifdef QAK
+HDfprintf(stderr, "%s: after adjusting for index block elements, idx = %Hu\n", FUNC, idx);
+#endif /* QAK */
+
+    /* Determine the superblock information for the index */
+    H5_CHECK_OVERFLOW(idx, /*From:*/hsize_t, /*To:*/uint64_t);
+#ifdef QAK
+HDfprintf(stderr, "%s: hdr->cparam.data_blk_min_elmts = %u\n", FUNC, (unsigned)hdr->cparam.data_blk_min_elmts);
+#endif /* QAK */
+    sblk_idx = H5VM_log2_gen((uint64_t)((idx / hdr->cparam.data_blk_min_elmts) + 1));
+#ifdef QAK
+HDfprintf(stderr, "%s: sblk_idx = %u\n", FUNC, sblk_idx);
+HDfprintf(stderr, "%s: hdr->sblk_info[%u] = {%Hu, %Zu, %Hu, %Hu}\n", FUNC, sblk_idx, hdr->sblk_info[sblk_idx].ndblks, hdr->sblk_info[sblk_idx].dblk_nelmts, hdr->sblk_info[sblk_idx].start_idx, hdr->sblk_info[sblk_idx].start_dblk);
+#endif /* QAK */
+
+    /* Set return value */
+    ret_value = sblk_idx;
+
+END_FUNC(PKG)   /* end H5EA__dblock_sblk_idx() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__dblock_protect
+ *
+ * Purpose:	Convenience wrapper around protecting extensible array data block
+ *
+ * Return:	Non-NULL pointer to data block on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 18 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+H5EA_dblock_t *, NULL, NULL,
+H5EA__dblock_protect(H5EA_hdr_t *hdr, hid_t dxpl_id, void *parent,
+    haddr_t dblk_addr, size_t dblk_nelmts, unsigned flags))
+
+    /* Local variables */
+    H5EA_dblock_cache_ud_t udata;      /* Information needed for loading data block */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(H5F_addr_defined(dblk_addr));
+    HDassert(dblk_nelmts);
+
+    /* only the H5AC__READ_ONLY_FLAG may be set */
+    HDassert((flags & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
+    /* Set up user data */
+    udata.hdr = hdr;
+    udata.parent = parent;
+    udata.nelmts = dblk_nelmts;
+    udata.dblk_addr = dblk_addr;
+
+    /* Protect the data block */
+    if(NULL == (ret_value = (H5EA_dblock_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_EARRAY_DBLOCK, dblk_addr, &udata, flags)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect extensible array data block, address = %llu", (unsigned long long)dblk_addr)
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__dblock_protect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__dblock_unprotect
+ *
+ * Purpose:	Convenience wrapper around unprotecting extensible array data block
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 11 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__dblock_unprotect(H5EA_dblock_t *dblock, hid_t dxpl_id, unsigned cache_flags))
+
+    /* Local variables */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /* Sanity check */
+    HDassert(dblock);
+
+    /* Unprotect the data block */
+    if(H5AC_unprotect(dblock->hdr->f, dxpl_id, H5AC_EARRAY_DBLOCK, dblock->addr, dblock, cache_flags) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to unprotect extensible array data block, address = %llu", (unsigned long long)dblock->addr)
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__dblock_unprotect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__dblock_delete
+ *
+ * Purpose:	Delete a data block
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 22 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__dblock_delete(H5EA_hdr_t *hdr, hid_t dxpl_id, void *parent,
+    haddr_t dblk_addr, size_t dblk_nelmts))
+
+    /* Local variables */
+    H5EA_dblock_t *dblock = NULL;       /* Pointer to data block */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(parent);
+    HDassert(H5F_addr_defined(dblk_addr));
+    HDassert(dblk_nelmts > 0);
+
+    /* Protect data block */
+    if(NULL == (dblock = H5EA__dblock_protect(hdr, dxpl_id, parent, dblk_addr, dblk_nelmts, H5AC__NO_FLAGS_SET)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect extensible array data block, address = %llu", (unsigned long long)dblk_addr)
+
+    /* Check if this is a paged data block */
+    if(dblk_nelmts > hdr->dblk_page_nelmts) {
+        size_t npages = dblk_nelmts / hdr->dblk_page_nelmts;    /* Number of pages in data block */
+        haddr_t dblk_page_addr;         /* Address of each data block page */
+        size_t dblk_page_size;          /* Size of each data block page */
+        size_t u;                       /* Local index variable */
+
+        /* Set up initial state */
+        dblk_page_addr = dblk_addr + H5EA_DBLOCK_PREFIX_SIZE(dblock);
+        dblk_page_size = (hdr->dblk_page_nelmts * hdr->cparam.raw_elmt_size)
+                + H5EA_SIZEOF_CHKSUM;
+
+        /* Iterate over pages in data block */
+        for(u = 0; u < npages; u++) {
+#ifdef QAK
+HDfprintf(stderr, "%s: Expunging data block page from cache\n", FUNC);
+#endif /* QAK */
+            /* Evict the data block page from the metadata cache */
+            /* (OK to call if it doesn't exist in the cache) */
+            if(H5AC_expunge_entry(hdr->f, dxpl_id, H5AC_EARRAY_DBLK_PAGE, dblk_page_addr, H5AC__NO_FLAGS_SET) < 0)
+                H5E_THROW(H5E_CANTEXPUNGE, "unable to remove array data block page from metadata cache")
+#ifdef QAK
+HDfprintf(stderr, "%s: Done expunging data block page from cache\n", FUNC);
+#endif /* QAK */
+
+            /* Advance to next page address */
+            dblk_page_addr += dblk_page_size;
+        } /* end for */
+    } /* end if */
+
+CATCH
+    /* Finished deleting data block in metadata cache */
+    if(dblock && H5EA__dblock_unprotect(dblock, dxpl_id, H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array data block")
+
+END_FUNC(PKG)   /* end H5EA__dblock_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__dblock_dest
+ *
+ * Purpose:	Destroys an extensible array data block in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 11 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__dblock_dest(H5EA_dblock_t *dblock))
+
+    /* Sanity check */
+    HDassert(dblock);
+
+    /* Check if shared header field has been initialized */
+    if(dblock->hdr) {
+        /* Check if we've got elements in the data block */
+        if(dblock->elmts && !dblock->npages) {
+            /* Free buffer for data block elements */
+            HDassert(dblock->nelmts > 0);
+            if(H5EA__hdr_free_elmts(dblock->hdr, dblock->nelmts, dblock->elmts) < 0)
+                H5E_THROW(H5E_CANTFREE, "unable to free extensible array data block element buffer")
+            dblock->elmts = NULL;
+            dblock->nelmts = 0;
+        } /* end if */
+
+        /* Decrement reference count on shared info */
+        if(H5EA__hdr_decr(dblock->hdr) < 0)
+            H5E_THROW(H5E_CANTDEC, "can't decrement reference count on shared array header")
+        dblock->hdr = NULL;
+    } /* end if */
+
+    /* Free the data block itself */
+    dblock = H5FL_FREE(H5EA_dblock_t, dblock);
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__dblock_dest() */
+
diff --git a/src/H5EAhdr.c b/src/H5EAhdr.c
new file mode 100644
index 0000000..46224f6
--- /dev/null
+++ b/src/H5EAhdr.c
@@ -0,0 +1,810 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5EAhdr.c
+ *			Aug 26 2008
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Array header routines for extensible arrays.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5EAmodule.h"         /* This source code file is part of the H5EA module */
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5EApkg.h"		/* Extensible Arrays			*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5VMprivate.h"	/* Vectors and arrays 			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+#ifndef NDEBUG
+/* Max. # of bits for max. nelmts index */
+#define H5EA_MAX_NELMTS_IDX_MAX 64
+#endif /* NDEBUG */
+
+/* # of elements in a data block for a particular super block */
+#define H5EA_SBLK_DBLK_NELMTS(s, m)                                           \
+    (size_t)H5_EXP2(((s) + 1) / 2) * (m)
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+/* Alias for pointer to factory, for use when allocating sequences of them */
+typedef H5FL_fac_head_t *H5FL_fac_head_ptr_t;
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5EA_hdr_t struct */
+H5FL_DEFINE_STATIC(H5EA_hdr_t);
+
+/* Declare a free list to manage the H5FL_fac_head_ptr_t sequence information */
+H5FL_SEQ_DEFINE_STATIC(H5FL_fac_head_ptr_t);
+
+/* Declare a free list to manage the H5EA_sblk_info_t sequence information */
+H5FL_SEQ_DEFINE_STATIC(H5EA_sblk_info_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__hdr_alloc
+ *
+ * Purpose:	Allocate shared extensible array header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 26 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+H5EA_hdr_t *, NULL, NULL,
+H5EA__hdr_alloc(H5F_t *f))
+
+    /* Local variables */
+    H5EA_hdr_t *hdr = NULL;          /* Shared extensible array header */
+
+    /* Check arguments */
+    HDassert(f);
+
+    /* Allocate space for the shared information */
+    if(NULL == (hdr = H5FL_CALLOC(H5EA_hdr_t)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array shared header")
+
+    /* Set non-zero internal fields */
+    hdr->addr = HADDR_UNDEF;
+    hdr->fd_parent_addr = HADDR_UNDEF;
+    hdr->fd_parent_ptr = NULL;
+
+    /* Set the internal parameters for the array */
+    hdr->f = f;
+    hdr->swmr_write = (H5F_INTENT(f) & H5F_ACC_SWMR_WRITE) > 0;
+    hdr->sizeof_addr = H5F_SIZEOF_ADDR(f);
+    hdr->sizeof_size = H5F_SIZEOF_SIZE(f);
+
+    /* Set the return value */
+    ret_value = hdr;
+
+CATCH
+    if(!ret_value)
+        if(hdr && H5EA__hdr_dest(hdr) < 0)
+            H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array header")
+
+END_FUNC(PKG)   /* end H5EA__hdr_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__hdr_init
+ *
+ * Purpose:	Compute useful information for extensible array, based on
+ *              "creation" information.
+ *
+ * Notes:	The equations for variables below are based on this information:
+ *
+ *	<sblk idx>  <# of dblks>  <size of dblks>       Range of elements in sblk
+ *	==========  ============  ===============       =========================
+ *	      0          1         1 * <dblk min elmts>   0 * <dblk min elmts> <->   1 * <dblk min elmts> - 1
+ *	      1          1         2 * <dblk min elmts>   1 * <dblk min elmts> <->   3 * <dblk min elmts> - 1
+ *	      2          2         2 * <dblk min elmts>   3 * <dblk min elmts> <->   7 * <dblk min elmts> - 1
+ *	      3          2         4 * <dblk min elmts>   7 * <dblk min elmts> <->  15 * <dblk min elmts> - 1
+ *	      4          4         4 * <dblk min elmts>  15 * <dblk min elmts> <->  31 * <dblk min elmts> - 1
+ *	      5          4         8 * <dblk min elmts>  31 * <dblk min elmts> <->  63 * <dblk min elmts> - 1
+ *	      6          8         8 * <dblk min elmts>  63 * <dblk min elmts> <-> 127 * <dblk min elmts> - 1
+ *	      7          8        16 * <dblk min elmts> 127 * <dblk min elmts> <-> 255 * <dblk min elmts> - 1
+ *	      .          .         . * <dblk min elmts>   . * <dblk min elmts> <->   . * <dblk min elmts> - 1
+ *	      .          .         . * <dblk min elmts>   . * <dblk min elmts> <->   . * <dblk min elmts> - 1
+ *	      .          .         . * <dblk min elmts>   . * <dblk min elmts> <->   . * <dblk min elmts> - 1
+ *
+ *	Therefore:
+ *		<sblk idx>(<elmt idx>) = lg2((<elmt idx> / <dblk min elmts>) + 1)
+ *		<# of dblks>(<sblk idx>) = 2 ^ (<sblk idx> / 2)
+ *		<size of dblk>(<sblk idx>) = 2 ^ ((<sblk idx> + 1) / 2)
+ *		<total # of sblks>(<max. # of elmts>) = 1 + (lg2(<max. # of elmts>) - lg2(<dblk min_elmts>))
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 18 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__hdr_init(H5EA_hdr_t *hdr, void *ctx_udata))
+
+    /* Local variables */
+    hsize_t start_idx;          /* First element index for each super block */
+    hsize_t start_dblk;         /* First data block index for each super block */
+    size_t u;                   /* Local index variable */
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(hdr->cparam.max_nelmts_bits);
+    HDassert(hdr->cparam.data_blk_min_elmts);
+    HDassert(hdr->cparam.sup_blk_min_data_ptrs);
+
+    /* Compute general information */
+    hdr->nsblks = 1 + (hdr->cparam.max_nelmts_bits - H5VM_log2_of2(hdr->cparam.data_blk_min_elmts));
+    hdr->dblk_page_nelmts = (size_t)1 << hdr->cparam.max_dblk_page_nelmts_bits;
+    hdr->arr_off_size = (unsigned char)H5EA_SIZEOF_OFFSET_BITS(hdr->cparam.max_nelmts_bits);
+#ifdef QAK
+HDfprintf(stderr, "%s: hdr->nsblks = %Zu\n", FUNC, hdr->nsblks);
+#endif /* QAK */
+
+    /* Allocate information for each super block */
+    if(NULL == (hdr->sblk_info = H5FL_SEQ_MALLOC(H5EA_sblk_info_t, hdr->nsblks)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for super block info array")
+
+    /* Compute information about each super block */
+    start_idx = 0;
+    start_dblk = 0;
+    for(u = 0; u < hdr->nsblks; u++) {
+        hdr->sblk_info[u].ndblks = (size_t)H5_EXP2(u / 2);
+        hdr->sblk_info[u].dblk_nelmts = H5EA_SBLK_DBLK_NELMTS(u, hdr->cparam.data_blk_min_elmts);
+        hdr->sblk_info[u].start_idx = start_idx;
+        hdr->sblk_info[u].start_dblk = start_dblk;
+#ifdef QAK
+HDfprintf(stderr, "%s: hdr->sblk_info[%Zu] = {%Zu, %Zu, %Hu, %Hu}\n", FUNC, u, hdr->sblk_info[u].ndblks, hdr->sblk_info[u].dblk_nelmts, hdr->sblk_info[u].start_idx, hdr->sblk_info[u].start_dblk);
+#endif /* QAK */
+
+        /* Advance starting indices for next super block */
+        start_idx += (hsize_t)hdr->sblk_info[u].ndblks * (hsize_t)hdr->sblk_info[u].dblk_nelmts;
+        start_dblk += (hsize_t)hdr->sblk_info[u].ndblks;
+    } /* end for */
+
+    /* Set size of header on disk (locally and in statistics) */
+    hdr->stats.computed.hdr_size = hdr->size = H5EA_HEADER_SIZE_HDR(hdr);
+
+    /* Create the callback context, if there's one */
+    if(hdr->cparam.cls->crt_context) {
+        if(NULL == (hdr->cb_ctx = (*hdr->cparam.cls->crt_context)(ctx_udata)))
+            H5E_THROW(H5E_CANTCREATE, "unable to create extensible array client callback context")
+    } /* end if */
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__hdr_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__hdr_alloc_elmts
+ *
+ * Purpose:	Allocate extensible array data block elements
+ *
+ * Return:	Non-NULL pointer to buffer for elements on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 16 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+void *, NULL, NULL,
+H5EA__hdr_alloc_elmts(H5EA_hdr_t *hdr, size_t nelmts))
+
+    /* Local variables */
+    void *elmts = NULL;         /* Element buffer allocated */
+    unsigned idx;               /* Index of element buffer factory in header */
+
+    /* Check arguments */
+    HDassert(hdr);
+    HDassert(nelmts > 0);
+
+    /* Compute the index of the element buffer factory */
+    H5_CHECK_OVERFLOW(nelmts, /*From:*/size_t, /*To:*/uint32_t);
+    idx = H5VM_log2_of2((uint32_t)nelmts) - H5VM_log2_of2((uint32_t)hdr->cparam.data_blk_min_elmts);
+#ifdef QAK
+HDfprintf(stderr, "%s: nelmts = %Zu, hdr->data_blk_min_elmts = %u, idx = %u\n", FUNC, nelmts, (unsigned)hdr->data_blk_min_elmts, idx);
+#endif /* QAK */
+
+    /* Check for needing to increase size of array of factories */
+    if(idx >= hdr->elmt_fac.nalloc) {
+        H5FL_fac_head_t **new_fac;      /* New array of element factories */
+        size_t new_nalloc = MAX3(1, (idx + 1), (2 * hdr->elmt_fac.nalloc));   /* New number of factories allocated */
+
+        /* Re-allocate array of element factories */
+        if(NULL == (new_fac = H5FL_SEQ_REALLOC(H5FL_fac_head_ptr_t, hdr->elmt_fac.fac, new_nalloc)))
+            H5E_THROW(H5E_CANTALLOC, "memory allocation failed for data block data element buffer factory array")
+
+        /* Zero out new elements allocated */
+        HDmemset(new_fac + hdr->elmt_fac.nalloc, 0, (new_nalloc - hdr->elmt_fac.nalloc) * sizeof(H5FL_fac_head_ptr_t));
+
+        /* Update information about element factories in header */
+        hdr->elmt_fac.nalloc = new_nalloc;
+        hdr->elmt_fac.fac = new_fac;
+    } /* end if */
+
+    /* Check for un-initialized factory at index */
+    if(NULL == hdr->elmt_fac.fac[idx]) {
+        if(NULL == (hdr->elmt_fac.fac[idx] = H5FL_fac_init(nelmts * (size_t)hdr->cparam.cls->nat_elmt_size)))
+            H5E_THROW(H5E_CANTINIT, "can't create data block data element buffer factory")
+    } /* end if */
+
+    /* Allocate buffer for elements in index block */
+    if(NULL == (elmts = H5FL_FAC_MALLOC(hdr->elmt_fac.fac[idx])))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for data block data element buffer")
+
+    /* Set the return value */
+    ret_value = elmts;
+
+CATCH
+    if(!ret_value)
+        if(elmts)
+            elmts = H5FL_FAC_FREE(hdr->elmt_fac.fac[idx], elmts);
+
+END_FUNC(PKG)   /* end H5EA__hdr_alloc_elmts() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__hdr_free_elmts
+ *
+ * Purpose:	Free extensible array data block elements
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 18 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, NOERR,
+herr_t, SUCCEED, -,
+H5EA__hdr_free_elmts(H5EA_hdr_t *hdr, size_t nelmts, void *elmts))
+
+    /* Local variables */
+    unsigned idx;               /* Index of element buffer factory in header */
+
+    /* Check arguments */
+    HDassert(hdr);
+    HDassert(nelmts > 0);
+    HDassert(elmts);
+
+    /* Compute the index of the element buffer factory */
+    H5_CHECK_OVERFLOW(nelmts, /*From:*/size_t, /*To:*/uint32_t);
+    idx = H5VM_log2_of2((uint32_t)nelmts) - H5VM_log2_of2((uint32_t)hdr->cparam.data_blk_min_elmts);
+#ifdef QAK
+HDfprintf(stderr, "%s: nelmts = %Zu, hdr->data_blk_min_elmts = %u, idx = %u\n", FUNC, nelmts, (unsigned)hdr->data_blk_min_elmts, idx);
+#endif /* QAK */
+
+    /* Free buffer for elements in index block */
+    HDassert(idx < hdr->elmt_fac.nalloc);
+    HDassert(hdr->elmt_fac.fac[idx]);
+    elmts = H5FL_FAC_FREE(hdr->elmt_fac.fac[idx], elmts);
+
+END_FUNC(PKG)   /* end H5EA__hdr_free_elmts() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__hdr_create
+ *
+ * Purpose:	Creates a new extensible array header in the file
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jun 17 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+haddr_t, HADDR_UNDEF, HADDR_UNDEF,
+H5EA__hdr_create(H5F_t *f, hid_t dxpl_id, const H5EA_create_t *cparam,
+    void *ctx_udata))
+
+    /* Local variables */
+    H5EA_hdr_t *hdr = NULL;     /* Extensible array header */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(cparam);
+
+#ifndef NDEBUG
+{
+    unsigned sblk_idx;          /* Super block index for first "actual" super block */
+    size_t dblk_nelmts;         /* Number of data block elements */
+    size_t dblk_page_nelmts;    /* Number of elements in a data block page */
+
+    /* Check for valid parameters */
+    if(cparam->raw_elmt_size == 0)
+        H5E_THROW(H5E_BADVALUE, "element size must be greater than zero")
+    if(cparam->max_nelmts_bits == 0)
+        H5E_THROW(H5E_BADVALUE, "max. # of elements bits must be greater than zero")
+    if(cparam->max_nelmts_bits > H5EA_MAX_NELMTS_IDX_MAX)
+        H5E_THROW(H5E_BADVALUE, "max. # of elements bits must be <= %u", (unsigned)H5EA_MAX_NELMTS_IDX_MAX)
+    if(cparam->sup_blk_min_data_ptrs < 2)
+        H5E_THROW(H5E_BADVALUE, "min # of data block pointers in super block must be >= two")
+    if(!POWER_OF_TWO(cparam->sup_blk_min_data_ptrs))
+        H5E_THROW(H5E_BADVALUE, "min # of data block pointers in super block must be power of two")
+    if(!POWER_OF_TWO(cparam->data_blk_min_elmts))
+        H5E_THROW(H5E_BADVALUE, "min # of elements per data block must be power of two")
+    dblk_page_nelmts = (size_t)1 << cparam->max_dblk_page_nelmts_bits;
+    if(dblk_page_nelmts < cparam->idx_blk_elmts)
+        H5E_THROW(H5E_BADVALUE, "# of elements per data block page must be greater than # of elements in index block")
+
+    /* Compute the number of elements in data blocks for first actual super block */
+    sblk_idx = H5EA_SBLK_FIRST_IDX(cparam->sup_blk_min_data_ptrs);
+    dblk_nelmts = H5EA_SBLK_DBLK_NELMTS(sblk_idx, cparam->data_blk_min_elmts);
+    if(dblk_page_nelmts < dblk_nelmts)
+        H5E_THROW(H5E_BADVALUE, "max. # of elements per data block page bits must be > # of elements in first data block from super block")
+
+    if(cparam->max_dblk_page_nelmts_bits > cparam->max_nelmts_bits)
+        H5E_THROW(H5E_BADVALUE, "max. # of elements per data block page bits must be <= max. # of elements bits")
+}
+#endif /* NDEBUG */
+
+    /* Allocate space for the shared information */
+    if(NULL == (hdr = H5EA__hdr_alloc(f)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array shared header")
+
+    /* Set the internal parameters for the array */
+    hdr->idx_blk_addr = HADDR_UNDEF;
+
+    /* Set the creation parameters for the array */
+    HDmemcpy(&hdr->cparam, cparam, sizeof(hdr->cparam));
+
+    /* Finish initializing extensible array header */
+    if(H5EA__hdr_init(hdr, ctx_udata) < 0)
+        H5E_THROW(H5E_CANTINIT, "initialization failed for extensible array header")
+
+    /* Allocate space for the header on disk */
+    if(HADDR_UNDEF == (hdr->addr = H5MF_alloc(f, H5FD_MEM_EARRAY_HDR, dxpl_id, (hsize_t)hdr->size)))
+        H5E_THROW(H5E_CANTALLOC, "file allocation failed for extensible array header")
+
+    /* Cache the new extensible array header */
+    if(H5AC_insert_entry(f, dxpl_id, H5AC_EARRAY_HDR, hdr->addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTINSERT, "can't add extensible array header to cache")
+
+    /* Set address of array header to return */
+    ret_value = hdr->addr;
+
+CATCH
+    if(!H5F_addr_defined(ret_value))
+        if(hdr) {
+            /* Release header's disk space */
+            if(H5F_addr_defined(hdr->addr) && H5MF_xfree(f, H5FD_MEM_EARRAY_HDR, dxpl_id, hdr->addr, (hsize_t)hdr->size) < 0)
+                H5E_THROW(H5E_CANTFREE, "unable to free extensible array header")
+
+            /* Destroy header */
+            if(H5EA__hdr_dest(hdr) < 0)
+                H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array header")
+        } /* end if */
+
+END_FUNC(PKG)   /* end H5EA__hdr_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__hdr_incr
+ *
+ * Purpose:	Increment component reference count on shared array header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 26 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__hdr_incr(H5EA_hdr_t *hdr))
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* Mark header as un-evictable when something is depending on it */
+    if(hdr->rc == 0)
+        if(H5AC_pin_protected_entry(hdr) < 0)
+            H5E_THROW(H5E_CANTPIN, "unable to pin extensible array header")
+
+    /* Increment reference count on shared header */
+    hdr->rc++;
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__hdr_incr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__hdr_decr
+ *
+ * Purpose:	Decrement component reference count on shared array header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 26 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__hdr_decr(H5EA_hdr_t *hdr))
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(hdr->rc);
+
+    /* Decrement reference count on shared header */
+    hdr->rc--;
+
+    /* Mark header as evictable again when nothing depend on it */
+    if(hdr->rc == 0) {
+        HDassert(hdr->file_rc == 0);
+        if(H5AC_unpin_entry(hdr) < 0)
+            H5E_THROW(H5E_CANTUNPIN, "unable to unpin extensible array header")
+    } /* end if */
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__hdr_decr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__hdr_fuse_incr
+ *
+ * Purpose:	Increment file reference count on shared array header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 26 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, NOERR,
+herr_t, SUCCEED, -,
+H5EA__hdr_fuse_incr(H5EA_hdr_t *hdr))
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* Increment file reference count on shared header */
+    hdr->file_rc++;
+
+END_FUNC(PKG)   /* end H5EA__hdr_fuse_incr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__hdr_fuse_decr
+ *
+ * Purpose:	Decrement file reference count on shared array header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 26 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, NOERR,
+size_t, 0, -,
+H5EA__hdr_fuse_decr(H5EA_hdr_t *hdr))
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(hdr->file_rc);
+
+    /* Decrement file reference count on shared header */
+    hdr->file_rc--;
+
+    /* Set return value */
+    ret_value = hdr->file_rc;
+
+END_FUNC(PKG)   /* end H5EA__hdr_fuse_decr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__hdr_modified
+ *
+ * Purpose:	Mark an extensible array as modified
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep  9 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__hdr_modified(H5EA_hdr_t *hdr))
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(hdr->f);
+
+    /* Mark header as dirty in cache */
+    if(H5AC_mark_entry_dirty(hdr) < 0)
+        H5E_THROW(H5E_CANTMARKDIRTY, "unable to mark extensible array header as dirty")
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__hdr_modified() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__hdr_protect
+ *
+ * Purpose:	Convenience wrapper around protecting extensible array header
+ *
+ * Return:	Non-NULL pointer to header on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Jul 31 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+H5EA_hdr_t *, NULL, NULL,
+H5EA__hdr_protect(H5F_t *f, hid_t dxpl_id, haddr_t ea_addr, void *ctx_udata,
+    unsigned flags))
+
+    /* Local variables */
+    H5EA_hdr_cache_ud_t udata;  /* User data for cache callbacks */
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(H5F_addr_defined(ea_addr));
+
+    /* only the H5AC__READ_ONLY_FLAG may appear in flags */
+    HDassert((flags & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
+    /* Set up user data for cache callbacks */
+    udata.f = f;
+    udata.addr = ea_addr;
+    udata.ctx_udata = ctx_udata;
+
+    /* Protect the header */
+    if(NULL == (ret_value = (H5EA_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_EARRAY_HDR, ea_addr, &udata, flags)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect extensible array header, address = %llu", (unsigned long long)ea_addr)
+    ret_value->f = f;   /* (Must be set again here, in case the header was already in the cache -QAK) */
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__hdr_protect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__hdr_unprotect
+ *
+ * Purpose:	Convenience wrapper around unprotecting extensible array header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug  1 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__hdr_unprotect(H5EA_hdr_t *hdr, hid_t dxpl_id, unsigned cache_flags))
+
+    /* Local variables */
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* Unprotect the header */
+    if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_EARRAY_HDR, hdr->addr, hdr, cache_flags) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to unprotect extensible array hdr, address = %llu", (unsigned long long)hdr->addr)
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__hdr_unprotect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__hdr_delete
+ *
+ * Purpose:	Delete an extensible array, starting with the header
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 26 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__hdr_delete(H5EA_hdr_t *hdr, hid_t dxpl_id))
+
+    /* Local variables */
+    unsigned cache_flags = H5AC__NO_FLAGS_SET;  /* Flags for unprotecting header */
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(!hdr->file_rc);
+
+#ifndef NDEBUG
+{
+    unsigned hdr_status = 0;         /* Array header's status in the metadata cache */
+
+    /* Check the array header's status in the metadata cache */
+    if(H5AC_get_entry_status(hdr->f, hdr->addr, &hdr_status) < 0)
+        H5E_THROW(H5E_CANTGET, "unable to check metadata cache status for array header")
+
+    /* Sanity checks on array header */
+    HDassert(hdr_status & H5AC_ES__IN_CACHE);
+    HDassert(hdr_status & H5AC_ES__IS_PROTECTED);
+} /* end block */
+#endif /* NDEBUG */
+
+    /* Check for index block */
+    if(H5F_addr_defined(hdr->idx_blk_addr)) {
+#ifdef QAK
+HDfprintf(stderr, "%s: hdr->idx_blk_addr = %a\n", FUNC, hdr->idx_blk_addr);
+#endif /* QAK */
+        /* Delete index block */
+        if(H5EA__iblock_delete(hdr, dxpl_id) < 0)
+            H5E_THROW(H5E_CANTDELETE, "unable to delete extensible array index block")
+    } /* end if */
+
+    /* Set flags to finish deleting header on unprotect */
+    cache_flags |= H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+
+CATCH
+
+    /* Unprotect the header, deleting it if an error hasn't occurred */
+    if(H5EA__hdr_unprotect(hdr, dxpl_id, cache_flags) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array header")
+
+END_FUNC(PKG)   /* end H5EA__hdr_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__hdr_dest
+ *
+ * Purpose:	Destroys an extensible array header in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 11 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__hdr_dest(H5EA_hdr_t *hdr))
+
+    /* Check arguments */
+    HDassert(hdr);
+    HDassert(hdr->rc == 0);
+
+    /* Destroy the callback context */
+    if(hdr->cb_ctx) {
+        if((*hdr->cparam.cls->dst_context)(hdr->cb_ctx) < 0)
+            H5E_THROW(H5E_CANTRELEASE, "unable to destroy extensible array client callback context")
+    } /* end if */
+    hdr->cb_ctx = NULL;
+
+    /* Check for data block element buffer factory info to free */
+    if(hdr->elmt_fac.fac) {
+        unsigned u;         /* Local index variable */
+
+        /* Sanity check */
+        HDassert(hdr->elmt_fac.nalloc > 0);
+
+        /* Iterate over factories, shutting them down */
+        for(u = 0; u < hdr->elmt_fac.nalloc; u++) {
+            /* Check if this factory has been initialized */
+            if(hdr->elmt_fac.fac[u]) {
+                if(H5FL_fac_term(hdr->elmt_fac.fac[u]) < 0)
+                    H5E_THROW(H5E_CANTRELEASE, "unable to destroy extensible array header factory")
+                hdr->elmt_fac.fac[u] = NULL;
+            } /* end if */
+        } /* end for */
+
+        /* Free factory array */
+        hdr->elmt_fac.fac = (H5FL_fac_head_t **)H5FL_SEQ_FREE(H5FL_fac_head_ptr_t, hdr->elmt_fac.fac);
+    } /* end if */
+
+    /* Free the super block info array */
+    if(hdr->sblk_info)
+        hdr->sblk_info = (H5EA_sblk_info_t *)H5FL_SEQ_FREE(H5EA_sblk_info_t, hdr->sblk_info);
+
+    /* Free the shared info itself */
+    hdr = H5FL_FREE(H5EA_hdr_t, hdr);
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__hdr_dest() */
+
diff --git a/src/H5EAiblock.c b/src/H5EAiblock.c
new file mode 100644
index 0000000..623ae30
--- /dev/null
+++ b/src/H5EAiblock.c
@@ -0,0 +1,479 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5EAiblock.c
+ *			Sep  9 2008
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Index block routines for extensible arrays.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5EAmodule.h"         /* This source code file is part of the H5EA module */
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5EApkg.h"		/* Extensible Arrays			*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5EA_iblock_t struct */
+H5FL_DEFINE_STATIC(H5EA_iblock_t);
+
+/* Declare a free list to manage the index block elements */
+H5FL_BLK_DEFINE_STATIC(idx_blk_elmt_buf);
+
+/* Declare a free list to manage the haddr_t sequence information */
+H5FL_SEQ_DEFINE_STATIC(haddr_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__iblock_alloc
+ *
+ * Purpose:	Allocate extensible array index block
+ *
+ * Return:	Non-NULL pointer to index block on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep  9 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+H5EA_iblock_t *, NULL, NULL,
+H5EA__iblock_alloc(H5EA_hdr_t *hdr))
+
+    /* Local variables */
+    H5EA_iblock_t *iblock = NULL;          /* Extensible array index block */
+
+    /* Check arguments */
+    HDassert(hdr);
+
+    /* Allocate memory for the index block */
+    if(NULL == (iblock = H5FL_CALLOC(H5EA_iblock_t)))
+	H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array index block")
+
+    /* Share common array information */
+    if(H5EA__hdr_incr(hdr) < 0)
+	H5E_THROW(H5E_CANTINC, "can't increment reference count on shared array header")
+    iblock->hdr = hdr;
+
+    /* Set non-zero internal fields */
+    iblock->addr = HADDR_UNDEF;
+
+    /* Compute information */
+    iblock->nsblks = H5EA_SBLK_FIRST_IDX(hdr->cparam.sup_blk_min_data_ptrs);
+    iblock->ndblk_addrs = 2 * ((size_t)hdr->cparam.sup_blk_min_data_ptrs - 1);
+    iblock->nsblk_addrs = hdr->nsblks - iblock->nsblks;
+#ifdef QAK
+HDfprintf(stderr, "%s: iblock->nsblks = %u\n", FUNC, iblock->nsblks);
+HDfprintf(stderr, "%s: iblock->ndblk_addrs = %Zu\n", FUNC, iblock->ndblk_addrs);
+HDfprintf(stderr, "%s: iblock->nsblk_addrs = %Zu\n", FUNC, iblock->nsblk_addrs);
+#endif /* QAK */
+
+    /* Allocate buffer for elements in index block */
+    if(hdr->cparam.idx_blk_elmts > 0)
+        if(NULL == (iblock->elmts = H5FL_BLK_MALLOC(idx_blk_elmt_buf, (size_t)(hdr->cparam.idx_blk_elmts * hdr->cparam.cls->nat_elmt_size))))
+            H5E_THROW(H5E_CANTALLOC, "memory allocation failed for index block data element buffer")
+
+    /* Allocate buffer for data block addresses in index block */
+    if(iblock->ndblk_addrs > 0)
+        if(NULL == (iblock->dblk_addrs = H5FL_SEQ_MALLOC(haddr_t, iblock->ndblk_addrs)))
+            H5E_THROW(H5E_CANTALLOC, "memory allocation failed for index block data block addresses")
+
+    /* Allocate buffer for super block addresses in index block */
+    if(iblock->nsblk_addrs > 0)
+        if(NULL == (iblock->sblk_addrs = H5FL_SEQ_MALLOC(haddr_t, iblock->nsblk_addrs)))
+            H5E_THROW(H5E_CANTALLOC, "memory allocation failed for index block super block addresses")
+
+    /* Set the return value */
+    ret_value = iblock;
+
+CATCH
+    if(!ret_value)
+        if(iblock && H5EA__iblock_dest(iblock) < 0)
+            H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array index block")
+
+END_FUNC(PKG)   /* end H5EA__iblock_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__iblock_create
+ *
+ * Purpose:	Creates a new extensible array index block in the file
+ *
+ * Return:	Valid file address on success/HADDR_UNDEF on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep  9 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+haddr_t, HADDR_UNDEF, HADDR_UNDEF,
+H5EA__iblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id, hbool_t *stats_changed))
+
+    /* Local variables */
+    H5EA_iblock_t *iblock = NULL;       /* Extensible array index block */
+    haddr_t iblock_addr;                /* Extensible array index block address */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(stats_changed);
+
+    /* Allocate the index block */
+    if(NULL == (iblock = H5EA__iblock_alloc(hdr)))
+	H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array index block")
+
+    /* Set size of index block on disk */
+    iblock->size = H5EA_IBLOCK_SIZE(iblock);
+#ifdef QAK
+HDfprintf(stderr, "%s: iblock->size = %Zu\n", FUNC, iblock->size);
+#endif /* QAK */
+
+    /* Allocate space for the index block on disk */
+    if(HADDR_UNDEF == (iblock_addr = H5MF_alloc(hdr->f, H5FD_MEM_EARRAY_IBLOCK, dxpl_id, (hsize_t)iblock->size)))
+	H5E_THROW(H5E_CANTALLOC, "file allocation failed for extensible array index block")
+    iblock->addr = iblock_addr;
+
+    /* Clear any elements in index block to fill value */
+    if(hdr->cparam.idx_blk_elmts > 0) {
+        /* Call the class's 'fill' callback */
+        if((hdr->cparam.cls->fill)(iblock->elmts, (size_t)hdr->cparam.idx_blk_elmts) < 0)
+            H5E_THROW(H5E_CANTSET, "can't set extensible array index block elements to class's fill value")
+    } /* end if */
+
+    /* Reset any data block addresses in the index block */
+    if(iblock->ndblk_addrs > 0) {
+        haddr_t tmp_addr = HADDR_UNDEF;         /* Address value to fill data block addresses with */
+
+        /* Set all the data block addresses to "undefined" address value */
+        H5VM_array_fill(iblock->dblk_addrs, &tmp_addr, sizeof(haddr_t), iblock->ndblk_addrs);
+    } /* end if */
+
+    /* Reset any super block addresses in the index block */
+    if(iblock->nsblk_addrs > 0) {
+        haddr_t tmp_addr = HADDR_UNDEF;         /* Address value to fill super block addresses with */
+
+        /* Set all the super block addresses to "undefined" address value */
+        H5VM_array_fill(iblock->sblk_addrs, &tmp_addr, sizeof(haddr_t), iblock->nsblk_addrs);
+    } /* end if */
+
+    /* Cache the new extensible array index block */
+    if(H5AC_insert_entry(hdr->f, dxpl_id, H5AC_EARRAY_IBLOCK, iblock_addr, iblock, H5AC__NO_FLAGS_SET) < 0)
+	H5E_THROW(H5E_CANTINSERT, "can't add extensible array index block to cache")
+
+    /* Update extensible array index block statistics */
+    HDassert(0 == hdr->stats.computed.nindex_blks);
+    HDassert(0 == hdr->stats.computed.index_blk_size);
+    hdr->stats.computed.nindex_blks = 1;
+    hdr->stats.computed.index_blk_size = iblock->size;
+
+    /* Increment count of elements "realized" */
+    hdr->stats.stored.nelmts += hdr->cparam.idx_blk_elmts;
+
+    /* Mark the statistics as changed */
+    *stats_changed = TRUE;
+
+    /* Set address of index block to return */
+    ret_value = iblock_addr;
+
+CATCH
+    if(!H5F_addr_defined(ret_value))
+        if(iblock) {
+            /* Release index block's disk space */
+            if(H5F_addr_defined(iblock->addr) && H5MF_xfree(hdr->f, H5FD_MEM_EARRAY_IBLOCK, dxpl_id, iblock->addr, (hsize_t)iblock->size) < 0)
+                H5E_THROW(H5E_CANTFREE, "unable to release extensible array index block")
+
+            /* Destroy index block */
+            if(H5EA__iblock_dest(iblock) < 0)
+                H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array index block")
+        } /* end if */
+
+END_FUNC(PKG)   /* end H5EA__iblock_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__iblock_protect
+ *
+ * Purpose:	Convenience wrapper around protecting extensible array index block
+ *
+ * Return:	Non-NULL pointer to index block on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep  9 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+H5EA_iblock_t *, NULL, NULL,
+H5EA__iblock_protect(H5EA_hdr_t *hdr, hid_t dxpl_id, unsigned flags))
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* only the H5AC__READ_ONLY_FLAG may be set */
+    HDassert((flags & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
+    /* Protect the index block */
+    if(NULL == (ret_value = (H5EA_iblock_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_EARRAY_IBLOCK, hdr->idx_blk_addr, hdr, flags)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect extensible array index block, address = %llu", (unsigned long long)hdr->idx_blk_addr)
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__iblock_protect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__iblock_unprotect
+ *
+ * Purpose:	Convenience wrapper around unprotecting extensible array index block
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep  9 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__iblock_unprotect(H5EA_iblock_t *iblock, hid_t dxpl_id, unsigned cache_flags))
+
+    /* Local variables */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /* Sanity check */
+    HDassert(iblock);
+
+    /* Unprotect the index block */
+    if(H5AC_unprotect(iblock->hdr->f, dxpl_id, H5AC_EARRAY_IBLOCK, iblock->addr, iblock, cache_flags) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to unprotect extensible array index block, address = %llu", (unsigned long long)iblock->addr)
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__iblock_unprotect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__iblock_delete
+ *
+ * Purpose:	Delete index block
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep  9 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__iblock_delete(H5EA_hdr_t *hdr, hid_t dxpl_id))
+
+    /* Local variables */
+    H5EA_iblock_t *iblock = NULL;       /* Pointer to index block */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(H5F_addr_defined(hdr->idx_blk_addr));
+
+    /* Protect index block */
+    if(NULL == (iblock = H5EA__iblock_protect(hdr, dxpl_id, H5AC__NO_FLAGS_SET)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect extensible array index block, address = %llu", (unsigned long long)hdr->idx_blk_addr)
+
+    /* Check for index block having data block pointers */
+    if(iblock->ndblk_addrs > 0) {
+        unsigned sblk_idx;      /* Current super block index */
+        unsigned dblk_idx;      /* Current data block index w/in super block */
+        size_t u;               /* Local index variable */
+
+        /* Iterate over data blocks */
+        sblk_idx = dblk_idx = 0;
+        for(u = 0; u < iblock->ndblk_addrs; u++) {
+            /* Check for data block existing */
+            if(H5F_addr_defined(iblock->dblk_addrs[u])) {
+                /* Delete data block */
+                if(H5EA__dblock_delete(hdr, dxpl_id, iblock, iblock->dblk_addrs[u], hdr->sblk_info[sblk_idx].dblk_nelmts) < 0)
+                    H5E_THROW(H5E_CANTDELETE, "unable to delete extensible array data block")
+                iblock->dblk_addrs[u] = HADDR_UNDEF;
+            } /* end if */
+
+            /* Advance to next data block w/in super block */
+            dblk_idx++;
+
+            /* Check for moving to next super block */
+            if(dblk_idx >= hdr->sblk_info[sblk_idx].ndblks) {
+                sblk_idx++;
+                dblk_idx = 0;
+            } /* end if */
+        } /* end for */
+    } /* end if */
+
+    /* Check for index block having data block pointers (not yet) */
+    if(iblock->nsblk_addrs > 0) {
+        size_t u;               /* Local index variable */
+
+        /* Iterate over super blocks */
+        for(u = 0; u < iblock->nsblk_addrs; u++) {
+            /* Check for data block existing */
+            if(H5F_addr_defined(iblock->sblk_addrs[u])) {
+                /* Delete super block */
+                if(H5EA__sblock_delete(hdr, dxpl_id, iblock, iblock->sblk_addrs[u], (unsigned)(u + iblock->nsblks)) < 0)
+                    H5E_THROW(H5E_CANTDELETE, "unable to delete extensible array super block")
+                iblock->sblk_addrs[u] = HADDR_UNDEF;
+            } /* end if */
+        } /* end for */
+    } /* end if */
+
+CATCH
+    /* Finished deleting index block in metadata cache */
+    if(iblock && H5EA__iblock_unprotect(iblock, dxpl_id, H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array index block")
+
+END_FUNC(PKG)   /* end H5EA__iblock_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__iblock_dest
+ *
+ * Purpose:	Destroys an extensible array index block in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 11 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__iblock_dest(H5EA_iblock_t *iblock))
+
+    /* Sanity check */
+    HDassert(iblock);
+
+    /* Check if shared header field has been initialized */
+    if(iblock->hdr) {
+        /* Check if we've got elements in the index block */
+        if(iblock->elmts) {
+            /* Free buffer for index block elements */
+            HDassert(iblock->hdr->cparam.idx_blk_elmts > 0);
+            iblock->elmts = H5FL_BLK_FREE(idx_blk_elmt_buf, iblock->elmts);
+        } /* end if */
+
+        /* Check if we've got data block addresses in the index block */
+        if(iblock->dblk_addrs) {
+            /* Free buffer for index block data block addresses */
+            HDassert(iblock->ndblk_addrs > 0);
+            iblock->dblk_addrs = H5FL_SEQ_FREE(haddr_t, iblock->dblk_addrs);
+            iblock->ndblk_addrs = 0;
+        } /* end if */
+
+        /* Check if we've got super block addresses in the index block */
+        if(iblock->sblk_addrs) {
+            /* Free buffer for index block super block addresses */
+            HDassert(iblock->nsblk_addrs > 0);
+            iblock->sblk_addrs = H5FL_SEQ_FREE(haddr_t, iblock->sblk_addrs);
+            iblock->nsblk_addrs = 0;
+        } /* end if */
+
+        /* Decrement reference count on shared info */
+        if(H5EA__hdr_decr(iblock->hdr) < 0)
+            H5E_THROW(H5E_CANTDEC, "can't decrement reference count on shared array header")
+        iblock->hdr = NULL;
+    } /* end if */
+
+    /* Free the index block itself */
+    iblock = H5FL_FREE(H5EA_iblock_t, iblock);
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__iblock_dest() */
+
diff --git a/src/H5EAint.c b/src/H5EAint.c
new file mode 100644
index 0000000..9f910d0
--- /dev/null
+++ b/src/H5EAint.c
@@ -0,0 +1,141 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5EAint.c
+ *			Jun 17 2008
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Internal routines for extnsible arrays.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5EAmodule.h"         /* This source code file is part of the H5EA module */
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5EApkg.h"		/* Extensible Arrays			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__create_flush_depend
+ *
+ * Purpose:	Create a flush dependency between two data structure components
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Mar 26 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__create_flush_depend(H5AC_info_t *parent_entry, H5AC_info_t *child_entry))
+
+    /* Sanity check */
+    HDassert(parent_entry);
+    HDassert(child_entry);
+
+    /* Create a flush dependency between parent and child entry */
+    if(H5AC_create_flush_dependency(parent_entry, child_entry) < 0)
+        H5E_THROW(H5E_CANTDEPEND, "unable to create flush dependency")
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__create_flush_depend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__destroy_flush_depend
+ *
+ * Purpose:	Destroy a flush dependency between two data structure components
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Mar 26 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__destroy_flush_depend(H5AC_info_t *parent_entry, H5AC_info_t *child_entry))
+
+    /* Sanity check */
+    HDassert(parent_entry);
+    HDassert(child_entry);
+
+    /* Destroy a flush dependency between parent and child entry */
+    if(H5AC_destroy_flush_dependency(parent_entry, child_entry) < 0)
+        H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency")
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__destroy_flush_depend() */
+
diff --git a/src/H5EAmodule.h b/src/H5EAmodule.h
new file mode 100644
index 0000000..405b232
--- /dev/null
+++ b/src/H5EAmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5EA package.  Including this header means that the source file
+ *		is part of the H5EA package.
+ */
+#ifndef _H5EAmodule_H
+#define _H5EAmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5EA_MODULE
+#define H5_MY_PKG       H5EA
+#define H5_MY_PKG_ERR   H5E_EARRAY
+#define H5_MY_PKG_INIT  NO
+
+#endif /* _H5EAmodule_H */
+
diff --git a/src/H5EApkg.h b/src/H5EApkg.h
new file mode 100644
index 0000000..147a612
--- /dev/null
+++ b/src/H5EApkg.h
@@ -0,0 +1,491 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:    Quincey Koziol <koziol at hdfgroup.org>
+ *        Tuesday, June 17, 2008
+ *
+ * Purpose:    This file contains declarations which are visible only within
+ *        the H5EA package.  Source files outside the H5EA package should
+ *        include H5EAprivate.h instead.
+ */
+#if !(defined(H5EA_FRIEND) | defined(H5EA_MODULE))
+#error "Do not include this file outside the H5EA package!"
+#endif
+
+#ifndef _H5EApkg_H
+#define _H5EApkg_H
+
+/* Get package's private header */
+#include "H5EAprivate.h"
+
+/* Other private headers needed by this file */
+#include "H5FLprivate.h"    /* Free Lists                           */
+
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+/* Fill value for extensible array test class */
+#ifdef H5EA_TESTING
+#define H5EA_TEST_FILL          ((uint64_t)ULLONG_MAX)
+#endif /* H5EA_TESTING */
+
+/* Size of checksum information (on disk) */
+#define H5EA_SIZEOF_CHKSUM      4
+
+/* "Standard" size of prefix information for extensible array metadata */
+#define H5EA_METADATA_PREFIX_SIZE(c) (                                        \
+    H5_SIZEOF_MAGIC   /* Signature */                                         \
+    + 1 /* Version */                                                         \
+    + 1 /* Array type */                                                      \
+    + ((c) ? H5EA_SIZEOF_CHKSUM : 0) /* Metadata checksum */                  \
+    )
+
+/* Size of the extensible array header on disk */
+#define H5EA_HEADER_SIZE(sizeof_addr, sizeof_size) (                          \
+    /* General metadata fields */                                             \
+    H5EA_METADATA_PREFIX_SIZE(TRUE)                                           \
+                                                                              \
+    /* General array information */                                           \
+    + 1 /* Element Size */                                                    \
+    + 1 /* Max. # of elements bits */                                         \
+    + 1 /* # of elements to store in index block */                           \
+    + 1 /* Min. # elements per data block */                                  \
+    + 1 /* Min. # of data block pointers for a super block */                 \
+    + 1 /* Log2(Max. # of elements in data block page) - i.e. # of bits needed to store max. # of elements in data block page */ \
+                                                                              \
+    /* Extensible Array statistics fields */                                  \
+    + (sizeof_size) /* Number of super blocks created */		      \
+    + (sizeof_size) /* Size of super blocks created */	        	      \
+    + (sizeof_size) /* Number of data blocks created */	        	      \
+    + (sizeof_size) /* Size of data blocks created */   		      \
+    + (sizeof_size) /* Max. index set */	       			      \
+    + (sizeof_size) /* Number of elements 'realized' */	        	      \
+                                                                              \
+    /* Extensible Array Header specific fields */                             \
+    + (sizeof_addr) /* File address of index block */   		      \
+    )
+
+/* Size of the extensible array header on disk (via file pointer) */
+#define H5EA_HEADER_SIZE_FILE(f)   (                                          \
+    H5EA_HEADER_SIZE(H5F_SIZEOF_ADDR(f), H5F_SIZEOF_SIZE(f))                  \
+    )
+
+/* Size of the extensible array header on disk (via extensible array header) */
+#define H5EA_HEADER_SIZE_HDR(h)   (                                           \
+    H5EA_HEADER_SIZE((h)->sizeof_addr, (h)->sizeof_size)                      \
+    )
+
+/* Size of the extensible array index block on disk */
+#define H5EA_IBLOCK_SIZE(i)     (                                             \
+    /* General metadata fields */                                             \
+    H5EA_METADATA_PREFIX_SIZE(TRUE)                                           \
+                                                                              \
+    /* Sanity-checking fields */                          \
+    + (i)->hdr->sizeof_addr          /* File address of array owning the block */ \
+                                                                              \
+    /* Extensible Array Index Block specific fields */                  \
+    + ((size_t)(i)->hdr->cparam.idx_blk_elmts * (size_t)(i)->hdr->cparam.raw_elmt_size) /* Elements in index block  */ \
+    + ((i)->ndblk_addrs * (i)->hdr->sizeof_addr) /* Data block addresses in index block  */ \
+    + ((i)->nsblk_addrs * (i)->hdr->sizeof_addr) /* Super block addresses in index block  */ \
+    )
+
+/* Size of the extensible array super block on disk */
+#define H5EA_SBLOCK_SIZE(s)     (                                             \
+    /* General metadata fields */                                             \
+    H5EA_METADATA_PREFIX_SIZE(TRUE)                                           \
+                                                                              \
+    /* Sanity-checking fields */                          \
+    + (s)->hdr->sizeof_addr          /* File address of array owning the block */ \
+    + (s)->hdr->arr_off_size         /* Offset of the block in the array */   \
+                                                                              \
+    /* Extensible Array Super Block specific fields */                  \
+    + ((s)->ndblks * (s)->dblk_page_init_size) /* Data block 'page init' bitmasks in super block (can be 0 if no pages) */ \
+    + ((s)->ndblks * (s)->hdr->sizeof_addr) /* Data block addresses in super block  */ \
+    )
+
+/* Size of the extensible array data block prefix on disk */
+#define H5EA_DBLOCK_PREFIX_SIZE(d)  (                          \
+    /* General metadata fields */                                             \
+    H5EA_METADATA_PREFIX_SIZE(TRUE)                                           \
+                                                                              \
+    /* Sanity-checking fields */                          \
+    + (d)->hdr->sizeof_addr          /* File address of array owning the block */ \
+    + (d)->hdr->arr_off_size         /* Offset of the block in the array */   \
+    )
+
+/* Size of the extensible array data block on disk */
+#define H5EA_DBLOCK_SIZE(d)     (                          \
+    /* Data block prefix size  */                                             \
+    H5EA_DBLOCK_PREFIX_SIZE(d)                                                \
+                                                                              \
+    /* Extensible Array Data Block specific fields */                  \
+    + ((d)->nelmts * (size_t)(d)->hdr->cparam.raw_elmt_size) /* Elements in data block  */  \
+    + ((d)->npages * H5EA_SIZEOF_CHKSUM)        /* Checksum for each page */  \
+    )
+
+/* Size of the extensible array data block page on disk */
+#define H5EA_DBLK_PAGE_SIZE(h)     (					      \
+    + ((h)->dblk_page_nelmts * (size_t)(h)->cparam.raw_elmt_size) /* Elements in data block page */  \
+    + H5EA_SIZEOF_CHKSUM                        /* Checksum for each page */  \
+    )
+
+/* Compute the # of bytes required to store an offset into a given buffer size */
+#define H5EA_SIZEOF_OFFSET_BITS(b)      (((b) + 7) / 8)
+
+/* Compute the first super block index that will hold a certain # of data block pointers */
+#define H5EA_SBLK_FIRST_IDX(m)          (2 * H5VM_log2_of2((uint32_t)m))
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+/* Information for each super block in extensible array */
+typedef struct H5EA_sblk_info_t {
+    size_t ndblks;              /* Number of data blocks for a super block */
+    size_t dblk_nelmts;         /* Number of elements in each data block for super block */
+    hsize_t start_idx;          /* Index of first element in super block */
+    hsize_t start_dblk;         /* Index of first data block in super block */
+} H5EA_sblk_info_t;
+
+/* The extensible array header information */
+/* (Each extensible array header has certain information that is shared across
+ * all the blocks in that extensible array)
+ */
+typedef struct H5EA_hdr_t {
+    /* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t cache_info;
+
+    /* Extensible array configuration/creation parameters (stored in header) */
+    H5EA_create_t cparam;               /* Creation parameters for extensible array */
+
+    /* Index block information (stored in header) */
+    haddr_t idx_blk_addr;               /* Address of index block in header */
+
+    /* Statistics for array (stored in index block, actually) */
+    /* (header and index number/size fields not stored) */
+    H5EA_stat_t stats;                  /* Statistics for extensible array */
+
+    /* Data block element buffer factory info (not stored in header) */
+    struct {
+        size_t nalloc;                  /* Number of factories allocated */
+        H5FL_fac_head_t **fac;          /* Array of factories for data block element buffers */
+    } elmt_fac;
+
+    /* Computed/cached values (not stored in header) */
+    size_t rc;                          /* Reference count of heap's components using heap header */
+    haddr_t addr;                       /* Address of header in file */
+    size_t size;                        /* Size of header in file */
+    H5F_t *f;                           /* Pointer to file for extensible array */
+    hbool_t swmr_write;                 /* Flag indicating the file is opened with SWMR-write access */
+    size_t file_rc;                     /* Reference count of files using array header */
+    hbool_t pending_delete;             /* Array is pending deletion */
+    size_t sizeof_addr;                 /* Size of file addresses */
+    size_t sizeof_size;                 /* Size of file sizes */
+    unsigned char arr_off_size;         /* Size of array offsets (in bytes) */
+
+    /* Super block information (not stored) */
+    size_t nsblks;                      /* Number of superblocks needed for array */
+    H5EA_sblk_info_t *sblk_info;        /* Array of information for each super block */
+
+    /* Data block information (not stored) */
+    size_t dblk_page_nelmts;            /* # of elements per data block page */
+
+    /* Client information (not stored) */
+    void *cb_ctx;                       /* Callback context */
+
+    /* Flush depencency parent information (not stored) */
+    haddr_t fd_parent_addr;		/* Address of flush dependency parent,
+                                         * if any.  This field is initialized
+					 * to HADDR_UNDEF.  If the extensible
+					 * array is being used to index a 
+					 * chunked data set and the data set
+					 * metadata is modified by a SWMR 
+					 * writer, this field will be set equal
+					 * to the object header proxy that is 
+					 * the flush dependency parent of the
+					 * extensible array header.
+ 					 *
+ 					 * The field is used to avoid duplicate
+					 * setups of the flush dependency 
+					 * relationship, and to allow the 
+					 * extensible array header to destroy
+					 * the flush dependency on receipt of 
+					 * an eviction notification from the
+					 * metadata cache.
+					 */
+    H5AC_info_t *fd_parent_ptr;		/* Pointer to flush dependency parent,
+					 * if it exists, otherwise NULL.  (See
+					 * comment for fd_parent_addr above for
+					 * further details)
+                                         */
+
+} H5EA_hdr_t;
+
+/* The extensible array index block information */
+typedef struct H5EA_iblock_t {
+    /* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t cache_info;
+
+    /* Extensible array information (stored) */
+    void        *elmts;         /* Buffer for elements stored in index block  */
+    haddr_t     *dblk_addrs;    /* Buffer for addresses of data blocks in index block */
+    haddr_t     *sblk_addrs;    /* Buffer for addresses of super blocks in index block */
+
+    /* Internal array information (not stored) */
+    H5EA_hdr_t    *hdr;            /* Shared array header info                  */
+    haddr_t     addr;           /* Address of this index block on disk          */
+    size_t      size;           /* Size of index block on disk              */
+
+    /* Computed/cached values (not stored) */
+    size_t      nsblks;         /* # of super blocks whose data block addresses are in index block */
+    size_t      ndblk_addrs;    /* Number of pointers to data blocks in index block */
+    size_t      nsblk_addrs;    /* Number of pointers to super blocks in index block */
+} H5EA_iblock_t;
+
+/* The extensible array super block information */
+typedef struct H5EA_sblock_t {
+    /* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t cache_info;
+
+    /* Extensible array information (stored) */
+    hsize_t     block_off;      /* Offset of the block within the array's address space */
+    haddr_t     *dblk_addrs;    /* Addresses of data blocks in super block */
+    uint8_t     *page_init;     /* Bitmap of whether a data block page is initialized */
+
+    /* Internal array information (not stored) */
+    H5EA_hdr_t    *hdr;            /* Shared array header info                  */
+    H5EA_iblock_t *parent;    /* Parent object for super block (index block) */
+    haddr_t     addr;           /* Address of this index block on disk          */
+    size_t      size;           /* Size of index block on disk              */
+
+    /* Computed/cached values (not stored) */
+    unsigned    idx;            /* Super block index within the extensible array */
+    size_t      ndblks;         /* # of data block addresses that are in super block */
+    size_t      dblk_nelmts;    /* # of elements for data blocks reachable through this super block */
+    size_t      dblk_npages;    /* # of pages in each data block */
+    size_t      dblk_page_init_size;    /* Size of 'page init' bitmask for each data block */
+    size_t      dblk_page_size; /* Size of a data block page */
+} H5EA_sblock_t;
+
+/* The extensible array data block information */
+typedef struct H5EA_dblock_t {
+    /* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t cache_info;
+
+    /* Extensible array information (stored) */
+    hsize_t     block_off;      /* Offset of the block within the array's address space */
+    void        *elmts;         /* Buffer for elements stored in data block  */
+
+    /* Internal array information (not stored) */
+    H5EA_hdr_t    *hdr;            /* Shared array header info                  */
+    void        *parent;        /* Parent object for data block (index or super block) */
+    haddr_t     addr;           /* Address of this data block on disk          */
+    size_t      size;           /* Size of data block on disk              */
+
+    /* Computed/cached values (not stored) */
+    size_t      nelmts;         /* Number of elements in block                */
+    size_t      npages;         /* Nummber of pages in a block (zero if not paged) */
+} H5EA_dblock_t;
+
+/* The extensible array data block page information */
+typedef struct H5EA_dbk_page_t {
+    /* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t cache_info;
+
+    /* Extensible array information (stored) */
+    void        *elmts;         /* Buffer for elements stored in data block page */
+
+    /* Internal array information (not stored) */
+    H5EA_hdr_t    *hdr;            /* Shared array header info                  */
+    H5EA_sblock_t *parent;      /* Parent object for data block page (super block) */
+    haddr_t     addr;           /* Address of this data block page on disk    */
+    size_t      size;           /* Size of data block page on disk          */
+
+    /* Computed/cached values (not stored) */
+    /* <none> */
+} H5EA_dblk_page_t;
+
+/* Extensible array */
+struct H5EA_t {
+    H5EA_hdr_t  *hdr;           /* Pointer to internal extensible array header info */
+    H5F_t      *f;              /* Pointer to file for extensible array */
+};
+
+/* Metadata cache callback user data types */
+
+/* Info needed for loading header */
+typedef struct H5EA_hdr_cache_ud_t {
+    H5F_t      *f;              /* Pointer to file for extensible array */
+    haddr_t    addr;            /* Address of header on disk */
+    void       *ctx_udata;      /* User context for class */
+} H5EA_hdr_cache_ud_t;
+
+/* Info needed for loading super block */
+typedef struct H5EA_sblock_cache_ud_t {
+    H5EA_hdr_t    *hdr;         /* Shared extensible array information */
+    H5EA_iblock_t *parent;      /* Pointer to parent object for super block (index block) */
+    unsigned sblk_idx;          /* Index of super block */
+    haddr_t sblk_addr;          /* Address of super block */
+} H5EA_sblock_cache_ud_t;
+
+/* Info needed for loading data block */
+typedef struct H5EA_dblock_cache_ud_t {
+    H5EA_hdr_t    *hdr;         /* Shared extensible array information */
+    void *parent;               /* Pointer to parent object for data block (index or super block) */
+    size_t nelmts;              /* Number of elements in data block */
+    haddr_t dblk_addr;          /* Address of data block */
+} H5EA_dblock_cache_ud_t;
+
+/* Info needed for loading data block page */
+typedef struct H5EA_dblk_page_cache_ud_t {
+    H5EA_hdr_t    *hdr;         /* Shared extensible array information */
+    H5EA_sblock_t *parent;      /* Pointer to parent object for data block page (super block) */
+    haddr_t dblk_page_addr;     /* Address of data block page */
+} H5EA_dblk_page_cache_ud_t;
+
+#ifdef H5EA_TESTING
+typedef struct H5EA__ctx_cb_t {
+    herr_t (*encode)(const void *elmt, size_t nelmts, void *udata);   /* Perform action during encode step */
+    void *udata;                /* User data for encode action */
+} H5EA__ctx_cb_t;
+#endif /* H5EA_TESTING */
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+/* H5EA header inherits cache-like properties from H5AC */
+H5_DLLVAR const H5AC_class_t H5AC_EARRAY_HDR[1];
+
+/* H5EA index block inherits cache-like properties from H5AC */
+H5_DLLVAR const H5AC_class_t H5AC_EARRAY_IBLOCK[1];
+
+/* H5EA index block inherits cache-like properties from H5AC */
+H5_DLLVAR const H5AC_class_t H5AC_EARRAY_SBLOCK[1];
+
+/* H5EA data block inherits cache-like properties from H5AC */
+H5_DLLVAR const H5AC_class_t H5AC_EARRAY_DBLOCK[1];
+
+/* H5EA data block page inherits cache-like properties from H5AC */
+H5_DLLVAR const H5AC_class_t H5AC_EARRAY_DBLK_PAGE[1];
+
+/* Internal extensible array testing class */
+H5_DLLVAR const H5EA_class_t H5EA_CLS_TEST[1];
+
+/* Array of extensible array client ID -> client class mappings */
+H5_DLLVAR const H5EA_class_t *const H5EA_client_class_g[H5EA_NUM_CLS_ID];
+
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+
+/* Generic routines */
+H5_DLL herr_t H5EA__create_flush_depend(H5AC_info_t *parent_entry,
+    H5AC_info_t *child_entry);
+H5_DLL herr_t H5EA__destroy_flush_depend(H5AC_info_t *parent_entry,
+    H5AC_info_t *child_entry);
+
+/* Header routines */
+H5_DLL H5EA_hdr_t *H5EA__hdr_alloc(H5F_t *f);
+H5_DLL herr_t H5EA__hdr_init(H5EA_hdr_t *hdr, void *ctx_udata);
+H5_DLL haddr_t H5EA__hdr_create(H5F_t *f, hid_t dxpl_id, const H5EA_create_t *cparam,
+    void *ctx_udata);
+H5_DLL void *H5EA__hdr_alloc_elmts(H5EA_hdr_t *hdr, size_t nelmts);
+H5_DLL herr_t H5EA__hdr_free_elmts(H5EA_hdr_t *hdr, size_t nelmts, void *elmts);
+H5_DLL herr_t H5EA__hdr_incr(H5EA_hdr_t *hdr);
+H5_DLL herr_t H5EA__hdr_decr(H5EA_hdr_t *hdr);
+H5_DLL herr_t H5EA__hdr_fuse_incr(H5EA_hdr_t *hdr);
+H5_DLL size_t H5EA__hdr_fuse_decr(H5EA_hdr_t *hdr);
+H5_DLL herr_t H5EA__hdr_modified(H5EA_hdr_t *hdr);
+H5_DLL H5EA_hdr_t *H5EA__hdr_protect(H5F_t *f, hid_t dxpl_id, haddr_t ea_addr,
+    void *ctx_udata, unsigned flags);
+H5_DLL herr_t H5EA__hdr_unprotect(H5EA_hdr_t *hdr, hid_t dxpl_id, unsigned cache_flags);
+H5_DLL herr_t H5EA__hdr_delete(H5EA_hdr_t *hdr, hid_t dxpl_id);
+H5_DLL herr_t H5EA__hdr_dest(H5EA_hdr_t *hdr);
+
+/* Index block routines */
+H5_DLL H5EA_iblock_t *H5EA__iblock_alloc(H5EA_hdr_t *hdr);
+H5_DLL haddr_t H5EA__iblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id,
+    hbool_t *stats_changed);
+H5_DLL H5EA_iblock_t *H5EA__iblock_protect(H5EA_hdr_t *hdr, hid_t dxpl_id,
+    unsigned flags);
+H5_DLL herr_t H5EA__iblock_unprotect(H5EA_iblock_t *iblock, hid_t dxpl_id,
+    unsigned cache_flags);
+H5_DLL herr_t H5EA__iblock_delete(H5EA_hdr_t *hdr, hid_t dxpl_id);
+H5_DLL herr_t H5EA__iblock_dest(H5EA_iblock_t *iblock);
+
+/* Super block routines */
+H5_DLL H5EA_sblock_t *H5EA__sblock_alloc(H5EA_hdr_t *hdr, H5EA_iblock_t *parent,
+    unsigned sblk_idx);
+H5_DLL haddr_t H5EA__sblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id,
+    H5EA_iblock_t *parent, hbool_t *stats_changed, unsigned sblk_idx);
+H5_DLL H5EA_sblock_t *H5EA__sblock_protect(H5EA_hdr_t *hdr, hid_t dxpl_id,
+    H5EA_iblock_t *parent, haddr_t sblk_addr, unsigned sblk_idx, 
+    unsigned flags);
+H5_DLL herr_t H5EA__sblock_unprotect(H5EA_sblock_t *sblock, hid_t dxpl_id,
+    unsigned cache_flags);
+H5_DLL herr_t H5EA__sblock_delete(H5EA_hdr_t *hdr, hid_t dxpl_id,
+    H5EA_iblock_t *parent, haddr_t sblk_addr, unsigned sblk_idx);
+H5_DLL herr_t H5EA__sblock_dest(H5EA_sblock_t *sblock);
+
+/* Data block routines */
+H5_DLL H5EA_dblock_t *H5EA__dblock_alloc(H5EA_hdr_t *hdr, void *parent,
+    size_t nelmts);
+H5_DLL haddr_t H5EA__dblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id, void *parent,
+    hbool_t *stats_changed, hsize_t dblk_off, size_t nelmts);
+H5_DLL unsigned H5EA__dblock_sblk_idx(const H5EA_hdr_t *hdr, hsize_t idx);
+H5_DLL H5EA_dblock_t *H5EA__dblock_protect(H5EA_hdr_t *hdr, hid_t dxpl_id,
+    void *parent, haddr_t dblk_addr, size_t dblk_nelmts, unsigned flags);
+H5_DLL herr_t H5EA__dblock_unprotect(H5EA_dblock_t *dblock, hid_t dxpl_id,
+    unsigned cache_flags);
+H5_DLL herr_t H5EA__dblock_delete(H5EA_hdr_t *hdr, hid_t dxpl_id, void *parent,
+    haddr_t dblk_addr, size_t dblk_nelmts);
+H5_DLL herr_t H5EA__dblock_dest(H5EA_dblock_t *dblock);
+
+/* Data block page routines */
+H5_DLL H5EA_dblk_page_t *H5EA__dblk_page_alloc(H5EA_hdr_t *hdr, H5EA_sblock_t *parent);
+H5_DLL herr_t H5EA__dblk_page_create(H5EA_hdr_t *hdr, hid_t dxpl_id,
+    H5EA_sblock_t *parent, haddr_t addr);
+H5_DLL H5EA_dblk_page_t *H5EA__dblk_page_protect(H5EA_hdr_t *hdr, hid_t dxpl_id,
+    H5EA_sblock_t *parent, haddr_t dblk_page_addr, unsigned flags);
+H5_DLL herr_t H5EA__dblk_page_unprotect(H5EA_dblk_page_t *dblk_page,
+    hid_t dxpl_id, unsigned cache_flags);
+H5_DLL herr_t H5EA__dblk_page_dest(H5EA_dblk_page_t *dblk_page);
+
+/* Debugging routines for dumping file structures */
+H5_DLL herr_t H5EA__hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    FILE *stream, int indent, int fwidth, const H5EA_class_t *cls, haddr_t obj_addr);
+H5_DLL herr_t H5EA__iblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    FILE *stream, int indent, int fwidth, const H5EA_class_t *cls,
+    haddr_t hdr_addr, haddr_t obj_addr);
+H5_DLL herr_t H5EA__sblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    FILE *stream, int indent, int fwidth, const H5EA_class_t *cls,
+    haddr_t hdr_addr, unsigned sblk_idx, haddr_t obj_addr);
+H5_DLL herr_t H5EA__dblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    FILE *stream, int indent, int fwidth, const H5EA_class_t *cls,
+    haddr_t hdr_addr, size_t dblk_nelmts, haddr_t obj_addr);
+
+/* Testing routines */
+#ifdef H5EA_TESTING
+H5_DLL herr_t H5EA_get_cparam_test(const H5EA_t *ea, H5EA_create_t *cparam);
+H5_DLL int H5EA_cmp_cparam_test(const H5EA_create_t *cparam1, const H5EA_create_t *cparam2);
+#endif /* H5EA_TESTING */
+
+#endif /* _H5EApkg_H */
+
diff --git a/src/H5EAprivate.h b/src/H5EAprivate.h
new file mode 100644
index 0000000..c00e118
--- /dev/null
+++ b/src/H5EAprivate.h
@@ -0,0 +1,158 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:        H5EAprivate.h
+ *            Jun 17 2008
+ *            Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:        Private header for library accessible extensible
+ *                      array routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef _H5EAprivate_H
+#define _H5EAprivate_H
+
+/* Include package's public header */
+#ifdef NOT_YET
+#include "H5EApublic.h"
+#endif /* NOT_YET */
+
+/* Private headers needed by this file */
+#include "H5ACprivate.h"    /* Metadata cache            */
+#include "H5Fprivate.h"        /* File access                */
+
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+/* Extensible array class IDs */
+typedef enum H5EA_cls_id_t {
+    H5EA_CLS_CHUNK_ID = 0,      /* Extensible array is for indexing dataset chunks w/o filters */
+    H5EA_CLS_FILT_CHUNK_ID,     /* Extensible array is for indexing dataset chunks w/filters */
+
+    /* Start real class IDs at 0 -QAK */
+    /* (keep these last) */
+    H5EA_CLS_TEST_ID,            /* Extensible array is for testing (do not use for actual data) */
+    H5EA_NUM_CLS_ID             /* Number of Extensible Array class IDs (must be last) */
+} H5EA_cls_id_t;
+
+/*
+ * Each type of element that can be stored in an extesible array has a
+ * variable of this type that contains class variables and methods.
+ */
+typedef struct H5EA_class_t {
+    H5EA_cls_id_t id;           /* ID of Extensible Array class, as found in file */
+    const char *name;           /* Name of class (for debugging) */
+    size_t nat_elmt_size;       /* Size of native (memory) element */
+
+    /* Extensible array client callback methods */
+    void *(*crt_context)(void *udata);          /* Create context for other callbacks */
+    herr_t (*dst_context)(void *ctx);           /* Destroy context */
+    herr_t (*fill)(void *nat_blk, size_t nelmts);    /* Fill array of elements with encoded form of "missing element" value */
+    herr_t (*encode)(void *raw, const void *elmt, size_t nelmts, void *ctx);   /* Encode elements from native form to disk storage form */
+    herr_t (*decode)(const void *raw, void *elmt, size_t nelmts, void *ctx);   /* Decode elements from disk storage form to native form */
+    herr_t (*debug)(FILE *stream, int indent, int fwidth, hsize_t idx, const void *elmt); /* Print an element for debugging */
+    void *(*crt_dbg_ctx)(H5F_t *f, hid_t dxpl_id, haddr_t obj_addr); /* Create debugging context */
+    herr_t (*dst_dbg_ctx)(void *dbg_ctx);       /* Destroy debugging context */
+} H5EA_class_t;
+
+/* Extensible array creation parameters */
+typedef struct H5EA_create_t {
+    const H5EA_class_t *cls;            /* Class of extensible array to create */
+    uint8_t raw_elmt_size;              /* Element size in file (in bytes) */
+    uint8_t max_nelmts_bits;            /* Log2(Max. # of elements in array) - i.e. # of bits needed to store max. # of elements */
+    uint8_t idx_blk_elmts;              /* # of elements to store in index block */
+    uint8_t data_blk_min_elmts;         /* Min. # of elements per data block */
+    uint8_t sup_blk_min_data_ptrs;      /* Min. # of data block pointers for a super block */
+    uint8_t max_dblk_page_nelmts_bits;       /* Log2(Max. # of elements in data block page) - i.e. # of bits needed to store max. # of elements in data block page */
+} H5EA_create_t;
+
+/* Extensible array metadata statistics info */
+/* (If these are ever exposed to applications, don't let the application see
+ *      which fields are computed vs. which fields are stored. -QAK)
+ */
+typedef struct H5EA_stat_t {
+    /* Non-stored (i.e. computed) fields */
+    struct {
+        hsize_t hdr_size;           /* Size of header */
+        hsize_t nindex_blks;        /* # of index blocks (should be 0 or 1) */
+        hsize_t index_blk_size;     /* Size of index blocks allocated */
+    } computed;
+
+    /* Stored fields */
+    struct {
+        hsize_t nsuper_blks;        /* # of super blocks */
+        hsize_t super_blk_size;     /* Size of super blocks allocated */
+        hsize_t ndata_blks;         /* # of data blocks */
+        hsize_t data_blk_size;      /* Size of data blocks allocated */
+        hsize_t max_idx_set;        /* Highest element index stored (+1 - i.e. if element 0 has been set, this value with be '1', if no elements have been stored, this value will be '0') */
+        hsize_t nelmts;             /* # of elements "realized" */
+    } stored;
+} H5EA_stat_t;
+
+/* Extensible array info (forward decl - defined in H5EApkg.h) */
+typedef struct H5EA_t H5EA_t;
+
+/* Define the operator callback function pointer for H5EA_iterate() */
+typedef int (*H5EA_operator_t)(hsize_t idx, const void *_elmt, void *_udata);
+
+
+/*****************************/
+/* Library-private Variables */
+/*****************************/
+
+/* The Extensible Array class for dataset chunks w/o filters*/
+H5_DLLVAR const H5EA_class_t H5EA_CLS_CHUNK[1];
+
+/* The Extensible Array class for dataset chunks w/ filters*/
+H5_DLLVAR const H5EA_class_t H5EA_CLS_FILT_CHUNK[1];
+
+
+/***************************************/
+/* Library-private Function Prototypes */
+/***************************************/
+
+/* General routines */
+H5_DLL H5EA_t *H5EA_create(H5F_t *f, hid_t dxpl_id, const H5EA_create_t *cparam,
+    void *ctx_udata);
+H5_DLL H5EA_t *H5EA_open(H5F_t *f, hid_t dxpl_id, haddr_t ea_addr, void *ctx_udata);
+H5_DLL herr_t H5EA_get_nelmts(const H5EA_t *ea, hsize_t *nelmts);
+H5_DLL herr_t H5EA_get_addr(const H5EA_t *ea, haddr_t *addr);
+H5_DLL herr_t H5EA_set(const H5EA_t *ea, hid_t dxpl_id, hsize_t idx, const void *elmt);
+H5_DLL herr_t H5EA_get(const H5EA_t *ea, hid_t dxpl_id, hsize_t idx, void *elmt);
+H5_DLL herr_t H5EA_depend(H5AC_info_t *parent_entry, H5EA_t *ea);
+H5_DLL herr_t H5EA_iterate(H5EA_t *fa, hid_t dxpl_id, H5EA_operator_t op, void *udata);
+H5_DLL herr_t H5EA_close(H5EA_t *ea, hid_t dxpl_id);
+H5_DLL herr_t H5EA_delete(H5F_t *f, hid_t dxpl_id, haddr_t ea_addr, void *ctx_udata);
+
+/* Statistics routines */
+H5_DLL herr_t H5EA_get_stats(const H5EA_t *ea, H5EA_stat_t *stats);
+
+/* Debugging routines */
+#ifdef H5EA_DEBUGGING
+#endif /* H5EA_DEBUGGING */
+
+#endif /* _H5EAprivate_H */
+
diff --git a/src/H5EAsblock.c b/src/H5EAsblock.c
new file mode 100644
index 0000000..f775484
--- /dev/null
+++ b/src/H5EAsblock.c
@@ -0,0 +1,446 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5EAsblock.c
+ *			Sep 30 2008
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Super block routines for extensible arrays.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5EAmodule.h"         /* This source code file is part of the H5EA module */
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5EApkg.h"		/* Extensible Arrays			*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5EA_iblock_t struct */
+H5FL_DEFINE_STATIC(H5EA_sblock_t);
+
+/* Declare a free list to manage the haddr_t sequence information */
+H5FL_SEQ_DEFINE_STATIC(haddr_t);
+
+/* Declare a free list to manage blocks of 'page init' bitmasks */
+H5FL_BLK_DEFINE(page_init);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__sblock_alloc
+ *
+ * Purpose:	Allocate extensible array super block
+ *
+ * Return:	Non-NULL pointer to super block on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 30 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+H5EA_sblock_t *, NULL, NULL,
+H5EA__sblock_alloc(H5EA_hdr_t *hdr, H5EA_iblock_t *parent, unsigned sblk_idx))
+
+    /* Local variables */
+    H5EA_sblock_t *sblock = NULL;          /* Extensible array super block */
+
+    /* Check arguments */
+    HDassert(hdr);
+
+    /* Allocate memory for the index block */
+    if(NULL == (sblock = H5FL_CALLOC(H5EA_sblock_t)))
+	H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array super block")
+
+    /* Share common array information */
+    if(H5EA__hdr_incr(hdr) < 0)
+	H5E_THROW(H5E_CANTINC, "can't increment reference count on shared array header")
+    sblock->hdr = hdr;
+
+    /* Set non-zero internal fields */
+    sblock->parent = parent;
+    sblock->addr = HADDR_UNDEF;
+
+    /* Compute/cache information */
+    sblock->idx = sblk_idx;
+    sblock->ndblks = hdr->sblk_info[sblk_idx].ndblks;
+    HDassert(sblock->ndblks);
+    sblock->dblk_nelmts = hdr->sblk_info[sblk_idx].dblk_nelmts;
+#ifdef QAK
+HDfprintf(stderr, "%s: hdr->dblk_page_nelmts = %Zu, sblock->ndblks = %Zu, sblock->dblk_nelmts = %Zu\n", FUNC, hdr->dblk_page_nelmts, sblock->ndblks, sblock->dblk_nelmts);
+#endif /* QAK */
+
+    /* Allocate buffer for data block addresses in super block */
+    if(NULL == (sblock->dblk_addrs = H5FL_SEQ_MALLOC(haddr_t, sblock->ndblks)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for super block data block addresses")
+
+    /* Check if # of elements in data blocks requires paging */
+    if(sblock->dblk_nelmts > hdr->dblk_page_nelmts) {
+        /* Compute # of pages in each data block from this super block */
+        sblock->dblk_npages = sblock->dblk_nelmts / hdr->dblk_page_nelmts;
+
+        /* Sanity check that we have at least 2 pages in data block */
+        HDassert(sblock->dblk_npages > 1);
+
+        /* Sanity check for integer truncation */
+        HDassert((sblock->dblk_npages * hdr->dblk_page_nelmts) == sblock->dblk_nelmts);
+
+        /* Compute size of buffer for each data block's 'page init' bitmask */
+        sblock->dblk_page_init_size = ((sblock->dblk_npages) + 7) / 8;
+        HDassert(sblock->dblk_page_init_size > 0);
+
+        /* Allocate buffer for all 'page init' bitmasks in super block */
+        if(NULL == (sblock->page_init = H5FL_BLK_CALLOC(page_init, sblock->ndblks * sblock->dblk_page_init_size)))
+            H5E_THROW(H5E_CANTALLOC, "memory allocation failed for super block page init bitmask")
+
+        /* Compute data block page size */
+        sblock->dblk_page_size = (hdr->dblk_page_nelmts * hdr->cparam.raw_elmt_size)
+                + H5EA_SIZEOF_CHKSUM;
+    } /* end if */
+
+    /* Set the return value */
+    ret_value = sblock;
+
+CATCH
+    if(!ret_value)
+        if(sblock && H5EA__sblock_dest(sblock) < 0)
+            H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array super block")
+
+END_FUNC(PKG)   /* end H5EA__sblock_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__sblock_create
+ *
+ * Purpose:	Creates a new extensible array super block in the file
+ *
+ * Return:	Valid file address on success/HADDR_UNDEF on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 30 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+haddr_t, HADDR_UNDEF, HADDR_UNDEF,
+H5EA__sblock_create(H5EA_hdr_t *hdr, hid_t dxpl_id, H5EA_iblock_t *parent,
+    hbool_t *stats_changed, unsigned sblk_idx))
+
+    /* Local variables */
+    H5EA_sblock_t *sblock = NULL;       /* Extensible array super block */
+    haddr_t sblock_addr;                /* Extensible array super block address */
+    haddr_t tmp_addr = HADDR_UNDEF;     /* Address value to fill data block addresses with */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(stats_changed);
+
+    /* Allocate the super block */
+    if(NULL == (sblock = H5EA__sblock_alloc(hdr, parent, sblk_idx)))
+	H5E_THROW(H5E_CANTALLOC, "memory allocation failed for extensible array super block")
+
+    /* Set size of super block on disk */
+    sblock->size = H5EA_SBLOCK_SIZE(sblock);
+#ifdef QAK
+HDfprintf(stderr, "%s: sblock->size = %Zu\n", FUNC, sblock->size);
+#endif /* QAK */
+
+    /* Set offset of block in array's address space */
+    sblock->block_off = hdr->sblk_info[sblk_idx].start_idx;
+#ifdef QAK
+HDfprintf(stderr, "%s: sblock->block_off = %Hu\n", FUNC, sblock->block_off);
+#endif /* QAK */
+
+    /* Allocate space for the super block on disk */
+    if(HADDR_UNDEF == (sblock_addr = H5MF_alloc(hdr->f, H5FD_MEM_EARRAY_SBLOCK, dxpl_id, (hsize_t)sblock->size)))
+	H5E_THROW(H5E_CANTALLOC, "file allocation failed for extensible array super block")
+    sblock->addr = sblock_addr;
+
+    /* Reset data block addresses to "undefined" address value */
+    H5VM_array_fill(sblock->dblk_addrs, &tmp_addr, sizeof(haddr_t), sblock->ndblks);
+
+    /* Cache the new extensible array super block */
+    if(H5AC_insert_entry(hdr->f, dxpl_id, H5AC_EARRAY_SBLOCK, sblock_addr, sblock, H5AC__NO_FLAGS_SET) < 0)
+	H5E_THROW(H5E_CANTINSERT, "can't add extensible array super block to cache")
+
+    /* Update extensible array super block statistics */
+    hdr->stats.stored.nsuper_blks++;
+    hdr->stats.stored.super_blk_size += sblock->size;
+
+    /* Mark the statistics as changed */
+    *stats_changed = TRUE;
+
+    /* Set address of super block to return */
+    ret_value = sblock_addr;
+
+CATCH
+    if(!H5F_addr_defined(ret_value))
+        if(sblock) {
+            /* Release super block's disk space */
+            if(H5F_addr_defined(sblock->addr) && H5MF_xfree(hdr->f, H5FD_MEM_EARRAY_SBLOCK, dxpl_id, sblock->addr, (hsize_t)sblock->size) < 0)
+                H5E_THROW(H5E_CANTFREE, "unable to release extensible array super block")
+
+            /* Destroy super block */
+            if(H5EA__sblock_dest(sblock) < 0)
+                H5E_THROW(H5E_CANTFREE, "unable to destroy extensible array super block")
+        } /* end if */
+
+END_FUNC(PKG)   /* end H5EA__sblock_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__sblock_protect
+ *
+ * Purpose:	Convenience wrapper around protecting extensible array super block
+ *
+ * Return:	Non-NULL pointer to data block on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 30 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+H5EA_sblock_t *, NULL, NULL,
+H5EA__sblock_protect(H5EA_hdr_t *hdr, hid_t dxpl_id, H5EA_iblock_t *parent,
+    haddr_t sblk_addr, unsigned sblk_idx, unsigned flags))
+
+    /* Local variables */
+    H5EA_sblock_cache_ud_t udata;      /* Information needed for loading super block */
+
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(H5F_addr_defined(sblk_addr));
+
+    /* only the H5AC__READ_ONLY_FLAG may be set */
+    HDassert((flags & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
+    /* Set up user data */
+    udata.hdr = hdr;
+    udata.parent = parent;
+    udata.sblk_idx = sblk_idx;
+    udata.sblk_addr = sblk_addr;
+
+    /* Protect the super block */
+    if(NULL == (ret_value = (H5EA_sblock_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_EARRAY_SBLOCK, sblk_addr, &udata, flags)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect extensible array super block, address = %llu", (unsigned long long)sblk_addr)
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__sblock_protect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__sblock_unprotect
+ *
+ * Purpose:	Convenience wrapper around unprotecting extensible array super block
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 30 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__sblock_unprotect(H5EA_sblock_t *sblock, hid_t dxpl_id, unsigned cache_flags))
+
+    /* Local variables */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /* Sanity check */
+    HDassert(sblock);
+
+    /* Unprotect the super block */
+    if(H5AC_unprotect(sblock->hdr->f, dxpl_id, H5AC_EARRAY_SBLOCK, sblock->addr, sblock, cache_flags) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to unprotect extensible array super block, address = %llu", (unsigned long long)sblock->addr)
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__sblock_unprotect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__sblock_delete
+ *
+ * Purpose:	Delete a super block
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 30 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__sblock_delete(H5EA_hdr_t *hdr, hid_t dxpl_id, H5EA_iblock_t *parent,
+    haddr_t sblk_addr, unsigned sblk_idx))
+
+    /* Local variables */
+    H5EA_sblock_t *sblock = NULL;       /* Pointer to super block */
+    size_t u;                           /* Local index variable */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(H5F_addr_defined(sblk_addr));
+
+    /* Protect super block */
+    if(NULL == (sblock = H5EA__sblock_protect(hdr, dxpl_id, parent, sblk_addr, sblk_idx, H5AC__NO_FLAGS_SET)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect extensible array super block, address = %llu", (unsigned long long)sblk_addr)
+
+    /* Iterate over data blocks */
+    for(u = 0; u < sblock->ndblks; u++) {
+        /* Check for data block existing */
+        if(H5F_addr_defined(sblock->dblk_addrs[u])) {
+            /* Delete data block */
+            if(H5EA__dblock_delete(hdr, dxpl_id, sblock, sblock->dblk_addrs[u], sblock->dblk_nelmts) < 0)
+                H5E_THROW(H5E_CANTDELETE, "unable to delete extensible array data block")
+            sblock->dblk_addrs[u] = HADDR_UNDEF;
+        } /* end if */
+    } /* end for */
+
+CATCH
+    /* Finished deleting super block in metadata cache */
+    if(sblock && H5EA__sblock_unprotect(sblock, dxpl_id, H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release extensible array super block")
+
+END_FUNC(PKG)   /* end H5EA__sblock_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__sblock_dest
+ *
+ * Purpose:	Destroys an extensible array super block in memory.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Sep 30 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__sblock_dest(H5EA_sblock_t *sblock))
+
+    /* Sanity check */
+    HDassert(sblock);
+#ifdef QAK
+HDfprintf(stderr, "%s: sblock->hdr->dblk_page_nelmts = %Zu, sblock->ndblks = %Zu, sblock->dblk_nelmts = %Zu\n", FUNC, sblock->hdr->dblk_page_nelmts, sblock->ndblks, sblock->dblk_nelmts);
+#endif /* QAK */
+
+    /* Check if shared header field has been initialized */
+    if(sblock->hdr) {
+        /* Free buffer for super block data block addresses, if there are any */
+        if(sblock->dblk_addrs)
+            sblock->dblk_addrs = H5FL_SEQ_FREE(haddr_t, sblock->dblk_addrs);
+
+        /* Free buffer for super block 'page init' bitmask, if there is one */
+        if(sblock->page_init) {
+            HDassert(sblock->dblk_npages > 0);
+            sblock->page_init = H5FL_BLK_FREE(page_init, sblock->page_init);
+        } /* end if */
+
+        /* Decrement reference count on shared info */
+        if(H5EA__hdr_decr(sblock->hdr) < 0)
+            H5E_THROW(H5E_CANTDEC, "can't decrement reference count on shared array header")
+        sblock->hdr = NULL;
+    } /* end if */
+
+    /* Free the super block itself */
+    sblock = H5FL_FREE(H5EA_sblock_t, sblock);
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__sblock_dest() */
+
diff --git a/src/H5EAstat.c b/src/H5EAstat.c
new file mode 100644
index 0000000..0c27681
--- /dev/null
+++ b/src/H5EAstat.c
@@ -0,0 +1,116 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5EAstat.c
+ *			Sep 11 2008
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:	        Extensible array metadata statistics functions.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5EAmodule.h"         /* This source code file is part of the H5EA module */
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5EApkg.h"		/* Extensible Arrays			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA_get_stats
+ *
+ * Purpose:	Query the metadata stats of an array
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 21 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, NOERR,
+herr_t, SUCCEED, -,
+H5EA_get_stats(const H5EA_t *ea, H5EA_stat_t *stats))
+
+    /* Local variables */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(ea);
+    HDassert(stats);
+
+    /* Copy extensible array statistics */
+    HDmemcpy(stats, &ea->hdr->stats, sizeof(ea->hdr->stats));
+
+END_FUNC(PRIV)  /* end H5EA_get_stats() */
+
diff --git a/src/H5EAtest.c b/src/H5EAtest.c
new file mode 100644
index 0000000..905aa7f
--- /dev/null
+++ b/src/H5EAtest.c
@@ -0,0 +1,487 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at hdfgroup.org>
+ *              Thursday, August 28, 2008
+ *
+ * Purpose:	Extensible array testing functions.
+ *
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5EAmodule.h"         /* This source code file is part of the H5EA module */
+#define H5EA_TESTING
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5EApkg.h"		/* Extensible Arrays			*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5VMprivate.h"         /* Vector functions			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Sanity checking value for callback contexts */
+#define H5EA__TEST_BOGUS_VAL    42
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Callback context */
+typedef struct H5EA__test_ctx_t {
+    uint32_t    bogus;          /* Placeholder field to verify that context is working */
+    H5EA__ctx_cb_t *cb;         /* Pointer to context's callback action */
+} H5EA__test_ctx_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Extensible array class callbacks */
+static void *H5EA__test_crt_context(void *udata);
+static herr_t H5EA__test_dst_context(void *ctx);
+static herr_t H5EA__test_fill(void *nat_blk, size_t nelmts);
+static herr_t H5EA__test_encode(void *raw, const void *elmt, size_t nelmts, void *ctx);
+static herr_t H5EA__test_decode(const void *raw, void *elmt, size_t nelmts, void *ctx);
+static herr_t H5EA__test_debug(FILE *stream, int indent, int fwidth, hsize_t idx, const void *elmt);
+static void *H5EA__test_crt_dbg_context(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t H5_ATTR_UNUSED obj_addr);
+static herr_t H5EA__test_dst_dbg_context(void *_ctx);
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Extensible array testing class information */
+const H5EA_class_t H5EA_CLS_TEST[1]={{
+    H5EA_CLS_TEST_ID,           /* Type of Extensible array */
+    "Testing",                  /* Name of Extensible Array class */
+    sizeof(uint64_t),           /* Size of native element */
+    H5EA__test_crt_context,     /* Create context */
+    H5EA__test_dst_context,     /* Destroy context */
+    H5EA__test_fill,            /* Fill block of missing elements callback */
+    H5EA__test_encode,          /* Element encoding callback */
+    H5EA__test_decode,          /* Element decoding callback */
+    H5EA__test_debug,           /* Element debugging callback */
+    H5EA__test_crt_dbg_context, /* Create debugging context */
+    H5EA__test_dst_dbg_context  /* Destroy debugging context */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5EA__test_ctx_t struct */
+H5FL_DEFINE_STATIC(H5EA__test_ctx_t);
+
+/* Declare a free list to manage the H5EA__ctx_cb_t struct */
+H5FL_DEFINE_STATIC(H5EA__ctx_cb_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__test_crt_context
+ *
+ * Purpose:	Create context for callbacks
+ *
+ * Return:	Success:	non-NULL
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, January 27, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+void *, NULL, NULL,
+H5EA__test_crt_context(void *_udata))
+
+    /* Local variables */
+    H5EA__test_ctx_t *ctx;              /* Context for callbacks */
+    H5EA__ctx_cb_t *udata = (H5EA__ctx_cb_t *)_udata;   /* User data for context */
+
+    /* Sanity checks */
+
+    /* Allocate new context structure */
+    if(NULL == (ctx = H5FL_MALLOC(H5EA__test_ctx_t)))
+	H5E_THROW(H5E_CANTALLOC, "can't allocate extensible array client callback context")
+
+    /* Initialize the context */
+    ctx->bogus = H5EA__TEST_BOGUS_VAL;
+    ctx->cb = udata;
+
+    /* Set return value */
+    ret_value = ctx;
+
+CATCH
+
+END_FUNC(STATIC)  /* end H5EA__test_crt_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__test_dst_context
+ *
+ * Purpose:	Destroy context for callbacks
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, January 27, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA__test_dst_context(void *_ctx))
+
+    /* Local variables */
+    H5EA__test_ctx_t *ctx = (H5EA__test_ctx_t *)_ctx;   /* Callback context to destroy */
+
+    /* Sanity checks */
+    HDassert(H5EA__TEST_BOGUS_VAL == ctx->bogus);
+
+    /* Release context structure */
+    ctx = H5FL_FREE(H5EA__test_ctx_t, ctx);
+
+END_FUNC(STATIC)  /* end H5EA__test_dst_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__test_fill
+ *
+ * Purpose:	Fill "missing elements" in block of elements
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August 28, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA__test_fill(void *nat_blk, size_t nelmts))
+
+    /* Local variables */
+    uint64_t fill_val = H5EA_TEST_FILL;          /* Value to fill elements with */
+
+    /* Sanity checks */
+    HDassert(nat_blk);
+    HDassert(nelmts);
+
+    H5VM_array_fill(nat_blk, &fill_val, sizeof(uint64_t), nelmts);
+
+END_FUNC(STATIC)  /* end H5EA__test_fill() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__test_encode
+ *
+ * Purpose:	Encode an element from "native" to "raw" form
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August 28, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5EA__test_encode(void *raw, const void *_elmt, size_t nelmts, void *_ctx))
+
+    /* Local variables */
+    H5EA__test_ctx_t *ctx = (H5EA__test_ctx_t *)_ctx;   /* Callback context to destroy */
+    const uint64_t *elmt = (const uint64_t *)_elmt;     /* Convenience pointer to native elements */
+
+    /* Sanity checks */
+    HDassert(raw);
+    HDassert(elmt);
+    HDassert(nelmts);
+    HDassert(H5EA__TEST_BOGUS_VAL == ctx->bogus);
+
+    /* Check for callback action */
+    if(ctx->cb) {
+        if((*ctx->cb->encode)(elmt, nelmts, ctx->cb->udata) < 0)
+            H5E_THROW(H5E_BADVALUE, "extensible array testing callback action failed")
+    } /* end if */
+
+    /* Encode native elements into raw elements */
+    while(nelmts) {
+        /* Encode element */
+        /* (advances 'raw' pointer) */
+        UINT64ENCODE(raw, *elmt);
+
+        /* Advance native element pointer */
+        elmt++;
+
+        /* Decrement # of elements to encode */
+        nelmts--;
+    } /* end while */
+
+CATCH
+
+END_FUNC(STATIC)  /* end H5EA__test_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__test_decode
+ *
+ * Purpose:	Decode an element from "raw" to "native" form
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August 28, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA__test_decode(const void *_raw, void *_elmt, size_t nelmts, void *_ctx))
+
+    /* Local variables */
+#ifndef NDEBUG
+    H5EA__test_ctx_t *ctx = (H5EA__test_ctx_t *)_ctx;   /* Callback context to destroy */
+#endif /* NDEBUG */
+    uint64_t *elmt = (uint64_t *)_elmt;     /* Convenience pointer to native elements */
+    const uint8_t *raw = (const uint8_t *)_raw; /* Convenience pointer to raw elements */
+
+    /* Sanity checks */
+    HDassert(raw);
+    HDassert(elmt);
+    HDassert(nelmts);
+    HDassert(H5EA__TEST_BOGUS_VAL == ctx->bogus);
+
+    /* Decode raw elements into native elements */
+    while(nelmts) {
+        /* Decode element */
+        /* (advances 'raw' pointer) */
+        UINT64DECODE(raw, *elmt);
+
+        /* Advance native element pointer */
+        elmt++;
+
+        /* Decrement # of elements to decode */
+        nelmts--;
+    } /* end while */
+
+END_FUNC(STATIC)  /* end H5EA__test_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__test_debug
+ *
+ * Purpose:	Display an element for debugging
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August 28, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA__test_debug(FILE *stream, int indent, int fwidth, hsize_t idx,
+    const void *elmt))
+
+    /* Local variables */
+    char temp_str[128];     /* Temporary string, for formatting */
+
+    /* Sanity checks */
+    HDassert(stream);
+    HDassert(elmt);
+
+    /* Print element */
+    sprintf(temp_str, "Element #%llu:", (unsigned long long)idx);
+    HDfprintf(stream, "%*s%-*s %llu\n", indent, "", fwidth, temp_str,
+        (unsigned long long)*(const uint64_t *)elmt);
+
+END_FUNC(STATIC)  /* end H5EA__test_debug() */
+
+/*-------------------------------------------------------------------------
+ * Function:    H5EA__test_crt_dbg_context
+ *
+ * Purpose:     Create context for debugging callback
+ *              
+ * Return:      Success:        non-NULL
+ *              Failure:        NULL
+ *              
+ * Programmer:	Vailin Choi; August 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+void *, NULL, NULL,
+H5EA__test_crt_dbg_context(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t H5_ATTR_UNUSED obj_addr))
+    
+    /* Local variables */
+    H5EA__ctx_cb_t *ctx;              /* Context for callbacks */
+    
+    /* Allocate new context structure */
+    if(NULL == (ctx = H5FL_MALLOC(H5EA__ctx_cb_t)))
+        H5E_THROW(H5E_CANTALLOC, "can't allocate extensible array client callback context")
+
+    /* Set return value */
+    ret_value = ctx;
+
+CATCH
+
+END_FUNC(STATIC)  /* end H5EA__test_crt_dbg_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA__test_dst_dbg_context
+ *
+ * Purpose:	Destroy context for callbacks
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Vailin Choi; August 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5EA__test_dst_dbg_context(void *_ctx))
+
+    /* Local variables */
+    H5EA__ctx_cb_t *ctx = (H5EA__ctx_cb_t *)_ctx;   /* Callback context to destroy */
+
+    HDassert(_ctx);
+
+    /* Release context structure */
+    ctx = H5FL_FREE(H5EA__ctx_cb_t, ctx);
+
+END_FUNC(STATIC)  /* end H5EA__test_dst_dbg_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA_get_cparam_test
+ *
+ * Purpose:	Retrieve the parameters used to create the extensible array
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August 28, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, NOERR,
+herr_t, SUCCEED, -,
+H5EA_get_cparam_test(const H5EA_t *ea, H5EA_create_t *cparam))
+
+    /* Check arguments. */
+    HDassert(ea);
+    HDassert(cparam);
+
+    /* Get extensible array creation parameters */
+    cparam->raw_elmt_size = ea->hdr->cparam.raw_elmt_size;
+    cparam->max_nelmts_bits = ea->hdr->cparam.max_nelmts_bits;
+    cparam->idx_blk_elmts = ea->hdr->cparam.idx_blk_elmts;
+    cparam->sup_blk_min_data_ptrs = ea->hdr->cparam.sup_blk_min_data_ptrs;
+    cparam->data_blk_min_elmts = ea->hdr->cparam.data_blk_min_elmts;
+    cparam->max_dblk_page_nelmts_bits = ea->hdr->cparam.max_dblk_page_nelmts_bits;
+
+END_FUNC(PRIV)  /* end H5EA_get_cparam_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5EA_cmp_cparam_test
+ *
+ * Purpose:	Compare the parameters used to create the extensible array
+ *
+ * Return:	Success:	non-negative
+ *		Failure:	negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August 28, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERRCATCH,
+int, 0, -,
+H5EA_cmp_cparam_test(const H5EA_create_t *cparam1, const H5EA_create_t *cparam2))
+
+    /* Check arguments. */
+    HDassert(cparam1);
+    HDassert(cparam2);
+
+    /* Compare creation parameters for array */
+    if(cparam1->raw_elmt_size < cparam2->raw_elmt_size)
+        H5_LEAVE(-1)
+    else if(cparam1->raw_elmt_size > cparam2->raw_elmt_size)
+        H5_LEAVE(1)
+    if(cparam1->max_nelmts_bits < cparam2->max_nelmts_bits)
+        H5_LEAVE(-1)
+    else if(cparam1->max_nelmts_bits > cparam2->max_nelmts_bits)
+        H5_LEAVE(1)
+    if(cparam1->idx_blk_elmts < cparam2->idx_blk_elmts)
+        H5_LEAVE(-1)
+    else if(cparam1->idx_blk_elmts > cparam2->idx_blk_elmts)
+        H5_LEAVE(1)
+    if(cparam1->sup_blk_min_data_ptrs < cparam2->sup_blk_min_data_ptrs)
+        H5_LEAVE(-1)
+    else if(cparam1->sup_blk_min_data_ptrs > cparam2->sup_blk_min_data_ptrs)
+        H5_LEAVE(1)
+    if(cparam1->data_blk_min_elmts < cparam2->data_blk_min_elmts)
+        H5_LEAVE(-1)
+    else if(cparam1->data_blk_min_elmts > cparam2->data_blk_min_elmts)
+        H5_LEAVE(1)
+    if(cparam1->max_dblk_page_nelmts_bits < cparam2->max_dblk_page_nelmts_bits)
+        H5_LEAVE(-1)
+    else if(cparam1->max_dblk_page_nelmts_bits > cparam2->max_dblk_page_nelmts_bits)
+        H5_LEAVE(1)
+
+CATCH
+
+END_FUNC(PRIV)  /* end H5EA_cmp_cparam_test() */
+
diff --git a/src/H5Edefin.h b/src/H5Edefin.h
index 8bc52dd..dd3b184 100644
--- a/src/H5Edefin.h
+++ b/src/H5Edefin.h
@@ -21,40 +21,94 @@
 #define _H5Edefin_H
 
 /* Major error IDs */
-hid_t H5E_DATASET_g        = FAIL;      /* Dataset */
-hid_t H5E_FUNC_g           = FAIL;      /* Function entry/exit */
-hid_t H5E_STORAGE_g        = FAIL;      /* Data storage */
-hid_t H5E_FILE_g           = FAIL;      /* File accessibilty */
-hid_t H5E_SOHM_g           = FAIL;      /* Shared Object Header Messages */
-hid_t H5E_SYM_g            = FAIL;      /* Symbol table */
-hid_t H5E_PLUGIN_g         = FAIL;      /* Plugin for dynamically loaded library */
-hid_t H5E_VFL_g            = FAIL;      /* Virtual File Layer */
-hid_t H5E_INTERNAL_g       = FAIL;      /* Internal error (too specific to document in detail) */
-hid_t H5E_BTREE_g          = FAIL;      /* B-Tree node */
-hid_t H5E_REFERENCE_g      = FAIL;      /* References */
-hid_t H5E_DATASPACE_g      = FAIL;      /* Dataspace */
-hid_t H5E_RESOURCE_g       = FAIL;      /* Resource unavailable */
+hid_t H5E_FSPACE_g         = FAIL;      /* Free Space Manager */
 hid_t H5E_PLIST_g          = FAIL;      /* Property lists */
-hid_t H5E_LINK_g           = FAIL;      /* Links */
-hid_t H5E_DATATYPE_g       = FAIL;      /* Datatype */
 hid_t H5E_RS_g             = FAIL;      /* Reference Counted Strings */
-hid_t H5E_HEAP_g           = FAIL;      /* Heap */
-hid_t H5E_OHDR_g           = FAIL;      /* Object header */
-hid_t H5E_ATOM_g           = FAIL;      /* Object atom */
-hid_t H5E_ATTR_g           = FAIL;      /* Attribute */
-hid_t H5E_NONE_MAJOR_g     = FAIL;      /* No error */
+hid_t H5E_DATATYPE_g       = FAIL;      /* Datatype */
+hid_t H5E_ERROR_g          = FAIL;      /* Error API */
+hid_t H5E_DATASPACE_g      = FAIL;      /* Dataspace */
+hid_t H5E_FARRAY_g         = FAIL;      /* Fixed Array */
+hid_t H5E_INTERNAL_g       = FAIL;      /* Internal error (too specific to document in detail) */
+hid_t H5E_PLUGIN_g         = FAIL;      /* Plugin for dynamically loaded library */
+hid_t H5E_CACHE_g          = FAIL;      /* Object cache */
+hid_t H5E_FUNC_g           = FAIL;      /* Function entry/exit */
+hid_t H5E_EARRAY_g         = FAIL;      /* Extensible Array */
 hid_t H5E_IO_g             = FAIL;      /* Low-level I/O */
+hid_t H5E_NONE_MAJOR_g     = FAIL;      /* No error */
 hid_t H5E_SLIST_g          = FAIL;      /* Skip Lists */
+hid_t H5E_RESOURCE_g       = FAIL;      /* Resource unavailable */
+hid_t H5E_SYM_g            = FAIL;      /* Symbol table */
+hid_t H5E_ATOM_g           = FAIL;      /* Object atom */
+hid_t H5E_REFERENCE_g      = FAIL;      /* References */
+hid_t H5E_PLINE_g          = FAIL;      /* Data filters */
+hid_t H5E_ARGS_g           = FAIL;      /* Invalid arguments to routine */
+hid_t H5E_SOHM_g           = FAIL;      /* Shared Object Header Messages */
+hid_t H5E_DATASET_g        = FAIL;      /* Dataset */
+hid_t H5E_STORAGE_g        = FAIL;      /* Data storage */
 hid_t H5E_EFL_g            = FAIL;      /* External file list */
+hid_t H5E_FILE_g           = FAIL;      /* File accessibilty */
 hid_t H5E_TST_g            = FAIL;      /* Ternary Search Trees */
-hid_t H5E_ARGS_g           = FAIL;      /* Invalid arguments to routine */
-hid_t H5E_ERROR_g          = FAIL;      /* Error API */
-hid_t H5E_PLINE_g          = FAIL;      /* Data filters */
-hid_t H5E_FSPACE_g         = FAIL;      /* Free Space Manager */
-hid_t H5E_CACHE_g          = FAIL;      /* Object cache */
+hid_t H5E_ATTR_g           = FAIL;      /* Attribute */
+hid_t H5E_HEAP_g           = FAIL;      /* Heap */
+hid_t H5E_LINK_g           = FAIL;      /* Links */
+hid_t H5E_BTREE_g          = FAIL;      /* B-Tree node */
+hid_t H5E_OHDR_g           = FAIL;      /* Object header */
+hid_t H5E_VFL_g            = FAIL;      /* Virtual File Layer */
 
 /* Minor error IDs */
 
+/* Free space errors */
+hid_t H5E_CANTMERGE_g      = FAIL;      /* Can't merge objects */
+hid_t H5E_CANTREVIVE_g     = FAIL;      /* Can't revive object */
+hid_t H5E_CANTSHRINK_g     = FAIL;      /* Can't shrink container */
+
+/* Heap errors */
+hid_t H5E_CANTRESTORE_g    = FAIL;      /* Can't restore condition */
+hid_t H5E_CANTCOMPUTE_g    = FAIL;      /* Can't compute value */
+hid_t H5E_CANTEXTEND_g     = FAIL;      /* Can't extend heap's space */
+hid_t H5E_CANTATTACH_g     = FAIL;      /* Can't attach object */
+hid_t H5E_CANTUPDATE_g     = FAIL;      /* Can't update object */
+hid_t H5E_CANTOPERATE_g    = FAIL;      /* Can't operate on object */
+
+/* System level errors */
+hid_t H5E_SYSERRSTR_g      = FAIL;      /* System error message */
+
+/* Argument errors */
+hid_t H5E_UNINITIALIZED_g  = FAIL;      /* Information is uinitialized */
+hid_t H5E_UNSUPPORTED_g    = FAIL;      /* Feature is unsupported */
+hid_t H5E_BADTYPE_g        = FAIL;      /* Inappropriate type */
+hid_t H5E_BADRANGE_g       = FAIL;      /* Out of range */
+hid_t H5E_BADVALUE_g       = FAIL;      /* Bad value */
+
+/* Datatype conversion errors */
+hid_t H5E_CANTCONVERT_g    = FAIL;      /* Can't convert datatypes */
+hid_t H5E_BADSIZE_g        = FAIL;      /* Bad size for object */
+
+/* File accessibilty errors */
+hid_t H5E_FILEEXISTS_g     = FAIL;      /* File already exists */
+hid_t H5E_FILEOPEN_g       = FAIL;      /* File already open */
+hid_t H5E_CANTCREATE_g     = FAIL;      /* Unable to create file */
+hid_t H5E_CANTOPENFILE_g   = FAIL;      /* Unable to open file */
+hid_t H5E_CANTCLOSEFILE_g  = FAIL;      /* Unable to close file */
+hid_t H5E_NOTHDF5_g        = FAIL;      /* Not an HDF5 file */
+hid_t H5E_BADFILE_g        = FAIL;      /* Bad file ID accessed */
+hid_t H5E_TRUNCATED_g      = FAIL;      /* File has been truncated */
+hid_t H5E_MOUNT_g          = FAIL;      /* File mount error */
+
+/* Object atom related errors */
+hid_t H5E_BADATOM_g        = FAIL;      /* Unable to find atom information (already closed?) */
+hid_t H5E_BADGROUP_g       = FAIL;      /* Unable to find ID group information */
+hid_t H5E_CANTREGISTER_g   = FAIL;      /* Unable to register new atom */
+hid_t H5E_CANTINC_g        = FAIL;      /* Unable to increment reference count */
+hid_t H5E_CANTDEC_g        = FAIL;      /* Unable to decrement reference count */
+hid_t H5E_NOIDS_g          = FAIL;      /* Out of IDs for group */
+
+/* Property list errors */
+hid_t H5E_CANTGET_g        = FAIL;      /* Can't get value */
+hid_t H5E_CANTSET_g        = FAIL;      /* Can't set value */
+hid_t H5E_DUPCLASS_g       = FAIL;      /* Duplicate class name in parent class */
+hid_t H5E_SETDISALLOWED_g  = FAIL;      /* Disallowed operation */
+
 /* Generic low-level file I/O errors */
 hid_t H5E_SEEKERROR_g      = FAIL;      /* Seek failed */
 hid_t H5E_READERROR_g      = FAIL;      /* Read failed */
@@ -63,6 +117,22 @@ hid_t H5E_CLOSEERROR_g     = FAIL;      /* Close failed */
 hid_t H5E_OVERFLOW_g       = FAIL;      /* Address overflowed */
 hid_t H5E_FCNTL_g          = FAIL;      /* File control (fcntl) failed */
 
+/* Dataspace errors */
+hid_t H5E_CANTCLIP_g       = FAIL;      /* Can't clip hyperslab region */
+hid_t H5E_CANTCOUNT_g      = FAIL;      /* Can't count elements */
+hid_t H5E_CANTSELECT_g     = FAIL;      /* Can't select hyperslab */
+hid_t H5E_CANTNEXT_g       = FAIL;      /* Can't move to next iterator location */
+hid_t H5E_BADSELECT_g      = FAIL;      /* Invalid selection */
+hid_t H5E_CANTCOMPARE_g    = FAIL;      /* Can't compare objects */
+hid_t H5E_CANTAPPEND_g     = FAIL;      /* Can't append object */
+
+/* Link related errors */
+hid_t H5E_TRAVERSE_g       = FAIL;      /* Link traversal failure */
+hid_t H5E_NLINKS_g         = FAIL;      /* Too many soft links in path */
+hid_t H5E_NOTREGISTERED_g  = FAIL;      /* Link class not registered */
+hid_t H5E_CANTMOVE_g       = FAIL;      /* Can't move object */
+hid_t H5E_CANTSORT_g       = FAIL;      /* Can't sort objects */
+
 /* Resource errors */
 hid_t H5E_NOSPACE_g        = FAIL;      /* No space available for allocation */
 hid_t H5E_CANTALLOC_g      = FAIL;      /* Can't allocate space */
@@ -75,29 +145,10 @@ hid_t H5E_CANTGC_g         = FAIL;      /* Unable to garbage collect */
 hid_t H5E_CANTGETSIZE_g    = FAIL;      /* Unable to compute size */
 hid_t H5E_OBJOPEN_g        = FAIL;      /* Object is already open */
 
-/* Heap errors */
-hid_t H5E_CANTRESTORE_g    = FAIL;      /* Can't restore condition */
-hid_t H5E_CANTCOMPUTE_g    = FAIL;      /* Can't compute value */
-hid_t H5E_CANTEXTEND_g     = FAIL;      /* Can't extend heap's space */
-hid_t H5E_CANTATTACH_g     = FAIL;      /* Can't attach object */
-hid_t H5E_CANTUPDATE_g     = FAIL;      /* Can't update object */
-hid_t H5E_CANTOPERATE_g    = FAIL;      /* Can't operate on object */
-
-/* Function entry/exit interface errors */
-hid_t H5E_CANTINIT_g       = FAIL;      /* Unable to initialize object */
-hid_t H5E_ALREADYINIT_g    = FAIL;      /* Object already initialized */
-hid_t H5E_CANTRELEASE_g    = FAIL;      /* Unable to release object */
-
-/* Property list errors */
-hid_t H5E_CANTGET_g        = FAIL;      /* Can't get value */
-hid_t H5E_CANTSET_g        = FAIL;      /* Can't set value */
-hid_t H5E_DUPCLASS_g       = FAIL;      /* Duplicate class name in parent class */
-hid_t H5E_SETDISALLOWED_g  = FAIL;      /* Disallowed operation */
-
-/* Free space errors */
-hid_t H5E_CANTMERGE_g      = FAIL;      /* Can't merge objects */
-hid_t H5E_CANTREVIVE_g     = FAIL;      /* Can't revive object */
-hid_t H5E_CANTSHRINK_g     = FAIL;      /* Can't shrink container */
+/* Parallel MPI errors */
+hid_t H5E_MPI_g            = FAIL;      /* Some MPI function failed */
+hid_t H5E_MPIERRSTR_g      = FAIL;      /* MPI Error String */
+hid_t H5E_CANTRECV_g       = FAIL;      /* Can't receive data */
 
 /* Object header related errors */
 hid_t H5E_LINKCOUNT_g      = FAIL;      /* Bad object header link count */
@@ -110,8 +161,11 @@ hid_t H5E_CANTPACK_g       = FAIL;      /* Can't pack messages */
 hid_t H5E_CANTRESET_g      = FAIL;      /* Can't reset object */
 hid_t H5E_CANTRENAME_g     = FAIL;      /* Unable to rename object */
 
-/* System level errors */
-hid_t H5E_SYSERRSTR_g      = FAIL;      /* System error message */
+/* Group related errors */
+hid_t H5E_CANTOPENOBJ_g    = FAIL;      /* Can't open object */
+hid_t H5E_CANTCLOSEOBJ_g   = FAIL;      /* Can't close object */
+hid_t H5E_COMPLEN_g        = FAIL;      /* Name component is too long */
+hid_t H5E_PATH_g           = FAIL;      /* Problem with path to object */
 
 /* I/O pipeline errors */
 hid_t H5E_NOFILTER_g       = FAIL;      /* Requested filter is not available */
@@ -121,40 +175,10 @@ hid_t H5E_SETLOCAL_g       = FAIL;      /* Error from filter 'set local' callbac
 hid_t H5E_NOENCODER_g      = FAIL;      /* Filter present but encoding disabled */
 hid_t H5E_CANTFILTER_g     = FAIL;      /* Filter operation failed */
 
-/* Group related errors */
-hid_t H5E_CANTOPENOBJ_g    = FAIL;      /* Can't open object */
-hid_t H5E_CANTCLOSEOBJ_g   = FAIL;      /* Can't close object */
-hid_t H5E_COMPLEN_g        = FAIL;      /* Name component is too long */
-hid_t H5E_PATH_g           = FAIL;      /* Problem with path to object */
-
-/* No error */
-hid_t H5E_NONE_MINOR_g     = FAIL;      /* No error */
-
-/* Plugin errors */
-hid_t H5E_OPENERROR_g      = FAIL;      /* Can't open directory or file */
-
-/* File accessibilty errors */
-hid_t H5E_FILEEXISTS_g     = FAIL;      /* File already exists */
-hid_t H5E_FILEOPEN_g       = FAIL;      /* File already open */
-hid_t H5E_CANTCREATE_g     = FAIL;      /* Unable to create file */
-hid_t H5E_CANTOPENFILE_g   = FAIL;      /* Unable to open file */
-hid_t H5E_CANTCLOSEFILE_g  = FAIL;      /* Unable to close file */
-hid_t H5E_NOTHDF5_g        = FAIL;      /* Not an HDF5 file */
-hid_t H5E_BADFILE_g        = FAIL;      /* Bad file ID accessed */
-hid_t H5E_TRUNCATED_g      = FAIL;      /* File has been truncated */
-hid_t H5E_MOUNT_g          = FAIL;      /* File mount error */
-
-/* Object atom related errors */
-hid_t H5E_BADATOM_g        = FAIL;      /* Unable to find atom information (already closed?) */
-hid_t H5E_BADGROUP_g       = FAIL;      /* Unable to find ID group information */
-hid_t H5E_CANTREGISTER_g   = FAIL;      /* Unable to register new atom */
-hid_t H5E_CANTINC_g        = FAIL;      /* Unable to increment reference count */
-hid_t H5E_CANTDEC_g        = FAIL;      /* Unable to decrement reference count */
-hid_t H5E_NOIDS_g          = FAIL;      /* Out of IDs for group */
-
 /* Cache related errors */
 hid_t H5E_CANTFLUSH_g      = FAIL;      /* Unable to flush data from cache */
 hid_t H5E_CANTSERIALIZE_g  = FAIL;      /* Unable to serialize data from cache */
+hid_t H5E_CANTTAG_g        = FAIL;      /* Unable to tag metadata in the cache */
 hid_t H5E_CANTLOAD_g       = FAIL;      /* Unable to load metadata into cache */
 hid_t H5E_PROTECT_g        = FAIL;      /* Protected metadata error */
 hid_t H5E_NOTCACHED_g      = FAIL;      /* Metadata not currently cached */
@@ -168,33 +192,12 @@ hid_t H5E_CANTMARKDIRTY_g  = FAIL;      /* Unable to mark a pinned entry as dirt
 hid_t H5E_CANTDIRTY_g      = FAIL;      /* Unable to mark metadata as dirty */
 hid_t H5E_CANTEXPUNGE_g    = FAIL;      /* Unable to expunge a metadata cache entry */
 hid_t H5E_CANTRESIZE_g     = FAIL;      /* Unable to resize a metadata cache entry */
-
-/* Link related errors */
-hid_t H5E_TRAVERSE_g       = FAIL;      /* Link traversal failure */
-hid_t H5E_NLINKS_g         = FAIL;      /* Too many soft links in path */
-hid_t H5E_NOTREGISTERED_g  = FAIL;      /* Link class not registered */
-hid_t H5E_CANTMOVE_g       = FAIL;      /* Can't move object */
-hid_t H5E_CANTSORT_g       = FAIL;      /* Can't sort objects */
-
-/* Parallel MPI errors */
-hid_t H5E_MPI_g            = FAIL;      /* Some MPI function failed */
-hid_t H5E_MPIERRSTR_g      = FAIL;      /* MPI Error String */
-hid_t H5E_CANTRECV_g       = FAIL;      /* Can't receive data */
-
-/* Dataspace errors */
-hid_t H5E_CANTCLIP_g       = FAIL;      /* Can't clip hyperslab region */
-hid_t H5E_CANTCOUNT_g      = FAIL;      /* Can't count elements */
-hid_t H5E_CANTSELECT_g     = FAIL;      /* Can't select hyperslab */
-hid_t H5E_CANTNEXT_g       = FAIL;      /* Can't move to next iterator location */
-hid_t H5E_BADSELECT_g      = FAIL;      /* Invalid selection */
-hid_t H5E_CANTCOMPARE_g    = FAIL;      /* Can't compare objects */
-
-/* Argument errors */
-hid_t H5E_UNINITIALIZED_g  = FAIL;      /* Information is uinitialized */
-hid_t H5E_UNSUPPORTED_g    = FAIL;      /* Feature is unsupported */
-hid_t H5E_BADTYPE_g        = FAIL;      /* Inappropriate type */
-hid_t H5E_BADRANGE_g       = FAIL;      /* Out of range */
-hid_t H5E_BADVALUE_g       = FAIL;      /* Bad value */
+hid_t H5E_CANTDEPEND_g     = FAIL;      /* Unable to create a flush dependency */
+hid_t H5E_CANTUNDEPEND_g   = FAIL;      /* Unable to destroy a flush dependency */
+hid_t H5E_CANTNOTIFY_g     = FAIL;      /* Unable to notify object about action */
+hid_t H5E_LOGFAIL_g        = FAIL;      /* Failure in the cache logging framework */
+hid_t H5E_CANTCORK_g       = FAIL;      /* Unable to cork an object */
+hid_t H5E_CANTUNCORK_g     = FAIL;      /* Unable to uncork an object */
 
 /* B-tree related errors */
 hid_t H5E_NOTFOUND_g       = FAIL;      /* Object not found */
@@ -209,8 +212,15 @@ hid_t H5E_CANTLIST_g       = FAIL;      /* Unable to list node */
 hid_t H5E_CANTMODIFY_g     = FAIL;      /* Unable to modify record */
 hid_t H5E_CANTREMOVE_g     = FAIL;      /* Unable to remove object */
 
-/* Datatype conversion errors */
-hid_t H5E_CANTCONVERT_g    = FAIL;      /* Can't convert datatypes */
-hid_t H5E_BADSIZE_g        = FAIL;      /* Bad size for object */
+/* Function entry/exit interface errors */
+hid_t H5E_CANTINIT_g       = FAIL;      /* Unable to initialize object */
+hid_t H5E_ALREADYINIT_g    = FAIL;      /* Object already initialized */
+hid_t H5E_CANTRELEASE_g    = FAIL;      /* Unable to release object */
+
+/* Plugin errors */
+hid_t H5E_OPENERROR_g      = FAIL;      /* Can't open directory or file */
+
+/* No error */
+hid_t H5E_NONE_MINOR_g     = FAIL;      /* No error */
 
 #endif /* H5Edefin_H */
diff --git a/src/H5Edeprec.c b/src/H5Edeprec.c
index 6a83745..1a13c01 100644
--- a/src/H5Edeprec.c
+++ b/src/H5Edeprec.c
@@ -31,10 +31,7 @@
 /* Module Setup */
 /****************/
 
-#define H5E_PACKAGE		/*suppress error about including H5Epkg   */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5E__init_deprec_interface
+#include "H5Emodule.h"          /* This source code file is part of the H5E module */
 
 
 /***********/
@@ -82,51 +79,6 @@
 /*******************/
 
 
-

-/*--------------------------------------------------------------------------
-NAME
-   H5E__init_deprec_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5E__init_deprec_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5E_init() currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5E__init_deprec_interface(void)
-{
-    FUNC_ENTER_STATIC_NOERR
-
-    FUNC_LEAVE_NOAPI(H5E_init())
-} /* H5E__init_deprec_interface() */
-
-

-/*--------------------------------------------------------------------------
-NAME
-   H5E__term_deprec_interface -- Terminate interface
-USAGE
-    herr_t H5E__term_deprec_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Terminates interface.  (Just resets H5_interface_initialize_g
-    currently).
-
---------------------------------------------------------------------------*/
-herr_t
-H5E__term_deprec_interface(void)
-{
-    FUNC_ENTER_PACKAGE_NOERR
-
-    /* Mark closed */
-    H5_interface_initialize_g = 0;
-
-    FUNC_LEAVE_NOAPI(0)
-} /* H5E__term_deprec_interface() */
-
 #ifndef H5_NO_DEPRECATED_SYMBOLS
 

 /*-------------------------------------------------------------------------
diff --git a/src/H5Einit.h b/src/H5Einit.h
index 9dadd41..64da1fb 100644
--- a/src/H5Einit.h
+++ b/src/H5Einit.h
@@ -24,167 +24,373 @@
 /* Major error codes */
 /*********************/
 
-assert(H5E_DATASET_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Dataset"))==NULL)
+assert(H5E_FSPACE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Free Space Manager"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_DATASET_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_FSPACE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_FUNC_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Function entry/exit"))==NULL)
+assert(H5E_PLIST_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Property lists"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_FUNC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_PLIST_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_STORAGE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Data storage"))==NULL)
+assert(H5E_RS_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Reference Counted Strings"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_STORAGE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_RS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_FILE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "File accessibilty"))==NULL)
+assert(H5E_DATATYPE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Datatype"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_FILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_DATATYPE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_SOHM_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Shared Object Header Messages"))==NULL)
+assert(H5E_ERROR_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Error API"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_SOHM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_ERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_SYM_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Symbol table"))==NULL)
+assert(H5E_DATASPACE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Dataspace"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_SYM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_DATASPACE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_FARRAY_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Fixed Array"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_FARRAY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_INTERNAL_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Internal error (too specific to document in detail)"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_INTERNAL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 assert(H5E_PLUGIN_g==(-1));
 if((msg = H5E_create_msg(cls, H5E_MAJOR, "Plugin for dynamically loaded library"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
 if((H5E_PLUGIN_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_VFL_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Virtual File Layer"))==NULL)
+assert(H5E_CACHE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Object cache"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_VFL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CACHE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_INTERNAL_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Internal error (too specific to document in detail)"))==NULL)
+assert(H5E_FUNC_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Function entry/exit"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_INTERNAL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_FUNC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_BTREE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "B-Tree node"))==NULL)
+assert(H5E_EARRAY_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Extensible Array"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_BTREE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_EARRAY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_REFERENCE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "References"))==NULL)
+assert(H5E_IO_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Low-level I/O"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_REFERENCE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_IO_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_DATASPACE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Dataspace"))==NULL)
+assert(H5E_NONE_MAJOR_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "No error"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_DATASPACE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_NONE_MAJOR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_SLIST_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Skip Lists"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_SLIST_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 assert(H5E_RESOURCE_g==(-1));
 if((msg = H5E_create_msg(cls, H5E_MAJOR, "Resource unavailable"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
 if((H5E_RESOURCE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_PLIST_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Property lists"))==NULL)
+assert(H5E_SYM_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Symbol table"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_PLIST_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_SYM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_LINK_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Links"))==NULL)
+assert(H5E_ATOM_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Object atom"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_LINK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_ATOM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_DATATYPE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Datatype"))==NULL)
+assert(H5E_REFERENCE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "References"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_DATATYPE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_REFERENCE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_RS_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Reference Counted Strings"))==NULL)
+assert(H5E_PLINE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Data filters"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_RS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_PLINE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_ARGS_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Invalid arguments to routine"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_ARGS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_SOHM_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Shared Object Header Messages"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_SOHM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_DATASET_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Dataset"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_DATASET_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_STORAGE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Data storage"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_STORAGE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_EFL_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "External file list"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_EFL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_FILE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "File accessibilty"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_FILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_TST_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Ternary Search Trees"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_TST_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_ATTR_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Attribute"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_ATTR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 assert(H5E_HEAP_g==(-1));
 if((msg = H5E_create_msg(cls, H5E_MAJOR, "Heap"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
 if((H5E_HEAP_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_LINK_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Links"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_LINK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_BTREE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "B-Tree node"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BTREE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 assert(H5E_OHDR_g==(-1));
 if((msg = H5E_create_msg(cls, H5E_MAJOR, "Object header"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
 if((H5E_OHDR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_ATOM_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Object atom"))==NULL)
+assert(H5E_VFL_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MAJOR, "Virtual File Layer"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_ATOM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_VFL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_ATTR_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Attribute"))==NULL)
+
+/*********************/
+/* Minor error codes */
+/*********************/
+
+
+/* Free space errors */
+assert(H5E_CANTMERGE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't merge objects"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_ATTR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTMERGE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_NONE_MAJOR_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "No error"))==NULL)
+assert(H5E_CANTREVIVE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't revive object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTREVIVE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTSHRINK_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't shrink container"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTSHRINK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Heap errors */
+assert(H5E_CANTRESTORE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't restore condition"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTRESTORE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTCOMPUTE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't compute value"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCOMPUTE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTEXTEND_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't extend heap's space"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTEXTEND_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTATTACH_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't attach object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTATTACH_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTUPDATE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't update object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTUPDATE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTOPERATE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't operate on object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTOPERATE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* System level errors */
+assert(H5E_SYSERRSTR_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "System error message"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_SYSERRSTR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Argument errors */
+assert(H5E_UNINITIALIZED_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Information is uinitialized"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_UNINITIALIZED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_UNSUPPORTED_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Feature is unsupported"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_UNSUPPORTED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_BADTYPE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Inappropriate type"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BADTYPE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_BADRANGE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Out of range"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BADRANGE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_BADVALUE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Bad value"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BADVALUE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Datatype conversion errors */
+assert(H5E_CANTCONVERT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't convert datatypes"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCONVERT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_BADSIZE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Bad size for object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BADSIZE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* File accessibilty errors */
+assert(H5E_FILEEXISTS_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "File already exists"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_FILEEXISTS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_FILEOPEN_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "File already open"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_FILEOPEN_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTCREATE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to create file"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCREATE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTOPENFILE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to open file"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTOPENFILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTCLOSEFILE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to close file"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCLOSEFILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_NOTHDF5_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Not an HDF5 file"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NOTHDF5_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_BADFILE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Bad file ID accessed"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BADFILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_TRUNCATED_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "File has been truncated"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_TRUNCATED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_MOUNT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "File mount error"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_MOUNT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Object atom related errors */
+assert(H5E_BADATOM_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to find atom information (already closed?)"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_NONE_MAJOR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_BADATOM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_IO_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Low-level I/O"))==NULL)
+assert(H5E_BADGROUP_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to find ID group information"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_IO_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_BADGROUP_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_SLIST_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Skip Lists"))==NULL)
+assert(H5E_CANTREGISTER_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to register new atom"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_SLIST_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTREGISTER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_EFL_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "External file list"))==NULL)
+assert(H5E_CANTINC_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to increment reference count"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_EFL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTINC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_TST_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Ternary Search Trees"))==NULL)
+assert(H5E_CANTDEC_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to decrement reference count"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_TST_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTDEC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_ARGS_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Invalid arguments to routine"))==NULL)
+assert(H5E_NOIDS_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Out of IDs for group"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_ARGS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_NOIDS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_ERROR_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Error API"))==NULL)
+
+/* Property list errors */
+assert(H5E_CANTGET_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't get value"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_ERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTGET_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_PLINE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Data filters"))==NULL)
+assert(H5E_CANTSET_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't set value"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_PLINE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTSET_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_FSPACE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Free Space Manager"))==NULL)
+assert(H5E_DUPCLASS_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Duplicate class name in parent class"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_FSPACE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_DUPCLASS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CACHE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MAJOR, "Object cache"))==NULL)
+assert(H5E_SETDISALLOWED_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Disallowed operation"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CACHE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_SETDISALLOWED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
-/*********************/
-/* Minor error codes */
-/*********************/
-
-
 /* Generic low-level file I/O errors */
 assert(H5E_SEEKERROR_g==(-1));
 if((msg = H5E_create_msg(cls, H5E_MINOR, "Seek failed"))==NULL)
@@ -217,6 +423,70 @@ if((msg = H5E_create_msg(cls, H5E_MINOR, "File control (fcntl) failed"))==NULL)
 if((H5E_FCNTL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
+/* Dataspace errors */
+assert(H5E_CANTCLIP_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't clip hyperslab region"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCLIP_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTCOUNT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't count elements"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCOUNT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTSELECT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't select hyperslab"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTSELECT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTNEXT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't move to next iterator location"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTNEXT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_BADSELECT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Invalid selection"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_BADSELECT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTCOMPARE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't compare objects"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTCOMPARE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTAPPEND_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't append object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTAPPEND_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Link related errors */
+assert(H5E_TRAVERSE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Link traversal failure"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_TRAVERSE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_NLINKS_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Too many soft links in path"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NLINKS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_NOTREGISTERED_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Link class not registered"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NOTREGISTERED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTMOVE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't move object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTMOVE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTSORT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't sort objects"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTSORT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
 /* Resource errors */
 assert(H5E_NOSPACE_g==(-1));
 if((msg = H5E_create_msg(cls, H5E_MINOR, "No space available for allocation"))==NULL)
@@ -269,92 +539,21 @@ if((msg = H5E_create_msg(cls, H5E_MINOR, "Object is already open"))==NULL)
 if((H5E_OBJOPEN_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
-/* Heap errors */
-assert(H5E_CANTRESTORE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't restore condition"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTRESTORE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTCOMPUTE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't compute value"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTCOMPUTE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTEXTEND_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't extend heap's space"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTEXTEND_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTATTACH_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't attach object"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTATTACH_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTUPDATE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't update object"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTUPDATE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTOPERATE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't operate on object"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTOPERATE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* Function entry/exit interface errors */
-assert(H5E_CANTINIT_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to initialize object"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTINIT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_ALREADYINIT_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Object already initialized"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_ALREADYINIT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTRELEASE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to release object"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTRELEASE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* Property list errors */
-assert(H5E_CANTGET_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't get value"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTGET_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTSET_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't set value"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTSET_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_DUPCLASS_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Duplicate class name in parent class"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_DUPCLASS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_SETDISALLOWED_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Disallowed operation"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_SETDISALLOWED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* Free space errors */
-assert(H5E_CANTMERGE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't merge objects"))==NULL)
+/* Parallel MPI errors */
+assert(H5E_MPI_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Some MPI function failed"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTMERGE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_MPI_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTREVIVE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't revive object"))==NULL)
+assert(H5E_MPIERRSTR_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "MPI Error String"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTREVIVE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_MPIERRSTR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTSHRINK_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't shrink container"))==NULL)
+assert(H5E_CANTRECV_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't receive data"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTSHRINK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTRECV_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
 /* Object header related errors */
@@ -376,71 +575,32 @@ if((H5E_ALIGNMENT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
 assert(H5E_BADMESG_g==(-1));
 if((msg = H5E_create_msg(cls, H5E_MINOR, "Unrecognized message"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_BADMESG_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTDELETE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't delete message"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTDELETE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_BADITER_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Iteration failed"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_BADITER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTPACK_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't pack messages"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTPACK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTRESET_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't reset object"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTRESET_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTRENAME_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to rename object"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTRENAME_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* System level errors */
-assert(H5E_SYSERRSTR_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "System error message"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_SYSERRSTR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* I/O pipeline errors */
-assert(H5E_NOFILTER_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Requested filter is not available"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_NOFILTER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_BADMESG_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CALLBACK_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Callback failed"))==NULL)
+assert(H5E_CANTDELETE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't delete message"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CALLBACK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTDELETE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANAPPLY_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Error from filter 'can apply' callback"))==NULL)
+assert(H5E_BADITER_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Iteration failed"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANAPPLY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_BADITER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_SETLOCAL_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Error from filter 'set local' callback"))==NULL)
+assert(H5E_CANTPACK_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't pack messages"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_SETLOCAL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTPACK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_NOENCODER_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Filter present but encoding disabled"))==NULL)
+assert(H5E_CANTRESET_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't reset object"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_NOENCODER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTRESET_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTFILTER_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Filter operation failed"))==NULL)
+assert(H5E_CANTRENAME_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to rename object"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTFILTER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTRENAME_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
 /* Group related errors */
@@ -465,97 +625,36 @@ if((msg = H5E_create_msg(cls, H5E_MINOR, "Problem with path to object"))==NULL)
 if((H5E_PATH_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
-/* No error */
-assert(H5E_NONE_MINOR_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "No error"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_NONE_MINOR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* Plugin errors */
-assert(H5E_OPENERROR_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't open directory or file"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_OPENERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* File accessibilty errors */
-assert(H5E_FILEEXISTS_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "File already exists"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_FILEEXISTS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_FILEOPEN_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "File already open"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_FILEOPEN_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTCREATE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to create file"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTCREATE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTOPENFILE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to open file"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTOPENFILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTCLOSEFILE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to close file"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTCLOSEFILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_NOTHDF5_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Not an HDF5 file"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_NOTHDF5_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_BADFILE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Bad file ID accessed"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_BADFILE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_TRUNCATED_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "File has been truncated"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_TRUNCATED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_MOUNT_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "File mount error"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_MOUNT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* Object atom related errors */
-assert(H5E_BADATOM_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to find atom information (already closed?)"))==NULL)
+/* I/O pipeline errors */
+assert(H5E_NOFILTER_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Requested filter is not available"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_BADATOM_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_NOFILTER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_BADGROUP_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to find ID group information"))==NULL)
+assert(H5E_CALLBACK_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Callback failed"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_BADGROUP_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CALLBACK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTREGISTER_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to register new atom"))==NULL)
+assert(H5E_CANAPPLY_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Error from filter 'can apply' callback"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTREGISTER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANAPPLY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTINC_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to increment reference count"))==NULL)
+assert(H5E_SETLOCAL_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Error from filter 'set local' callback"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTINC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_SETLOCAL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTDEC_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to decrement reference count"))==NULL)
+assert(H5E_NOENCODER_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Filter present but encoding disabled"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTDEC_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_NOENCODER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_NOIDS_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Out of IDs for group"))==NULL)
+assert(H5E_CANTFILTER_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Filter operation failed"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_NOIDS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTFILTER_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
 /* Cache related errors */
@@ -569,6 +668,11 @@ if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to serialize data from cache"))
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
 if((H5E_CANTSERIALIZE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTTAG_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to tag metadata in the cache"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTTAG_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 assert(H5E_CANTLOAD_g==(-1));
 if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to load metadata into cache"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
@@ -634,108 +738,35 @@ if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to resize a metadata cache entr
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
 if((H5E_CANTRESIZE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* Link related errors */
-assert(H5E_TRAVERSE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Link traversal failure"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_TRAVERSE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_NLINKS_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Too many soft links in path"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_NLINKS_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_NOTREGISTERED_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Link class not registered"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_NOTREGISTERED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTMOVE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't move object"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTMOVE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTSORT_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't sort objects"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTSORT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* Parallel MPI errors */
-assert(H5E_MPI_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Some MPI function failed"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_MPI_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_MPIERRSTR_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "MPI Error String"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_MPIERRSTR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTRECV_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't receive data"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTRECV_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* Dataspace errors */
-assert(H5E_CANTCLIP_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't clip hyperslab region"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTCLIP_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTCOUNT_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't count elements"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTCOUNT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTSELECT_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't select hyperslab"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTSELECT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTNEXT_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't move to next iterator location"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTNEXT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_BADSELECT_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Invalid selection"))==NULL)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_BADSELECT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
-    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_CANTCOMPARE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't compare objects"))==NULL)
+assert(H5E_CANTDEPEND_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to create a flush dependency"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTCOMPARE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTDEPEND_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-
-/* Argument errors */
-assert(H5E_UNINITIALIZED_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Information is uinitialized"))==NULL)
+assert(H5E_CANTUNDEPEND_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to destroy a flush dependency"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_UNINITIALIZED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTUNDEPEND_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_UNSUPPORTED_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Feature is unsupported"))==NULL)
+assert(H5E_CANTNOTIFY_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to notify object about action"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_UNSUPPORTED_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTNOTIFY_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_BADTYPE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Inappropriate type"))==NULL)
+assert(H5E_LOGFAIL_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Failure in the cache logging framework"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_BADTYPE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_LOGFAIL_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_BADRANGE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Out of range"))==NULL)
+assert(H5E_CANTCORK_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to cork an object"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_BADRANGE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTCORK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_BADVALUE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Bad value"))==NULL)
+assert(H5E_CANTUNCORK_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to uncork an object"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_BADVALUE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTUNCORK_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
 /* B-tree related errors */
@@ -795,16 +826,35 @@ if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to remove object"))==NULL)
 if((H5E_CANTREMOVE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
-/* Datatype conversion errors */
-assert(H5E_CANTCONVERT_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't convert datatypes"))==NULL)
+/* Function entry/exit interface errors */
+assert(H5E_CANTINIT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to initialize object"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_CANTCONVERT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_CANTINIT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
-assert(H5E_BADSIZE_g==(-1));
-if((msg = H5E_create_msg(cls, H5E_MINOR, "Bad size for object"))==NULL)
+assert(H5E_ALREADYINIT_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Object already initialized"))==NULL)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
-if((H5E_BADSIZE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+if((H5E_ALREADYINIT_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+assert(H5E_CANTRELEASE_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Unable to release object"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_CANTRELEASE_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* Plugin errors */
+assert(H5E_OPENERROR_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "Can't open directory or file"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_OPENERROR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
+
+/* No error */
+assert(H5E_NONE_MINOR_g==(-1));
+if((msg = H5E_create_msg(cls, H5E_MINOR, "No error"))==NULL)
+    HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, "error message initialization failed")
+if((H5E_NONE_MINOR_g = H5I_register(H5I_ERROR_MSG, msg, FALSE))<0)
     HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message")
 
 #endif /* H5Einit_H */
diff --git a/src/H5Eint.c b/src/H5Eint.c
index 252972f..6e84a09 100644
--- a/src/H5Eint.c
+++ b/src/H5Eint.c
@@ -28,10 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5E_PACKAGE		/*suppress error about including H5Epkg   */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5E_init_int_interface
+#include "H5Emodule.h"          /* This source code file is part of the H5E module */
 
 
 /***********/
@@ -117,27 +114,6 @@ int	H5E_mpi_error_str_len;
 
 
 

-/*--------------------------------------------------------------------------
-NAME
-   H5E_init_int_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5E_init_int_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5E_init() currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5E_init_int_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5E_init())
-} /* H5E_init_int_interface() */
-
-

 /*-------------------------------------------------------------------------
  * Function:	H5E_get_msg
  *
@@ -154,7 +130,7 @@ H5E_init_int_interface(void)
 ssize_t
 H5E_get_msg(const H5E_msg_t *msg, H5E_type_t *type, char *msg_str, size_t size)
 {
-    ssize_t       len;          /* Length of error message */
+    ssize_t       len = -1;     /* Length of error message */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1001,7 +977,7 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5E_dump_api_stack(int is_api)
+H5E_dump_api_stack(hbool_t is_api)
 {
     herr_t ret_value = SUCCEED;   /* Return value */
 
diff --git a/src/H5Emodule.h b/src/H5Emodule.h
new file mode 100644
index 0000000..d624409
--- /dev/null
+++ b/src/H5Emodule.h
@@ -0,0 +1,36 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5E package.  Including this header means that the source file
+ *		is part of the H5E package.
+ */
+#ifndef _H5Emodule_H
+#define _H5Emodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5E_MODULE
+#define H5_MY_PKG       H5E
+#define H5_MY_PKG_ERR   H5E_ERROR
+#define H5_MY_PKG_INIT  YES
+
+#endif /* _H5Emodule_H */
+
+
diff --git a/src/H5Epkg.h b/src/H5Epkg.h
index bfaaf9d..3af653a 100644
--- a/src/H5Epkg.h
+++ b/src/H5Epkg.h
@@ -21,7 +21,7 @@
  *		the H5E package.  Source files outside the H5E package should
  *		include H5Eprivate.h instead.
  */
-#ifndef H5E_PACKAGE
+#if !(defined H5E_FRIEND || defined H5E_MODULE)
 #error "Do not include this file outside the H5E package!"
 #endif
 
diff --git a/src/H5Eprivate.h b/src/H5Eprivate.h
index b36780b..ba17ada 100644
--- a/src/H5Eprivate.h
+++ b/src/H5Eprivate.h
@@ -70,6 +70,17 @@ typedef struct H5E_t H5E_t;
 }
 
 /*
+ * HGOTO_ERROR_TAG macro, used like HGOTO_ERROR between H5_BEGIN_TAG and
+ * H5_END_TAG statements.  Resets the metadata tag before leaving the function.
+ */
+#define HGOTO_ERROR_TAG(maj, min, ret_val, ...) {                              \
+   if(H5AC_tag(my_dxpl_id, prv_tag, NULL) < 0)                                 \
+      HERROR(H5E_CACHE, H5E_CANTTAG, "unable to apply metadata tag");          \
+   HCOMMON_ERROR(maj, min, __VA_ARGS__);                                       \
+   HGOTO_DONE(ret_val)                                                         \
+}
+
+/*
  * HGOTO_DONE macro, used to facilitate normal return between a FUNC_ENTER()
  * and a FUNC_LEAVE() within a function body. The argument is the return
  * value which is assigned to the `ret_value' variable.	 Control branches to
@@ -77,14 +88,15 @@ typedef struct H5E_t H5E_t;
  */
 #define HGOTO_DONE(ret_val) {ret_value = ret_val; goto done;}
 
-/* Library-private functions defined in H5E package */
-H5_DLL herr_t H5E_init(void);
-H5_DLL herr_t H5E_push_stack(H5E_t *estack, const char *file, const char *func,
-    unsigned line, hid_t cls_id, hid_t maj_id, hid_t min_id, const char *desc);
-H5_DLL herr_t H5E_printf_stack(H5E_t *estack, const char *file, const char *func,
-    unsigned line, hid_t cls_id, hid_t maj_id, hid_t min_id, const char *fmt, ...);
-H5_DLL herr_t H5E_clear_stack(H5E_t *estack);
-H5_DLL herr_t H5E_dump_api_stack(int is_api);
+/*
+ * HGOTO_DONE_TAG macro, used like HGOTO_DONE between H5_BEGIN_TAG and
+ * H5_END_TAG statements.  Resets the metadata tag before leaving the function.
+ */
+#define HGOTO_DONE_TAG(ret_val, err) {                                         \
+   if(H5AC_tag(my_dxpl_id, prv_tag, NULL) < 0)                                 \
+      HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, err, "unable to apply metadata tag") \
+   HGOTO_DONE(ret_val)                                                         \
+}
 
 /*
  * Macros handling system error messages as described in C standard.
@@ -125,5 +137,58 @@ extern	int	H5E_mpi_error_str_len;
 }
 #endif /* H5_HAVE_PARALLEL */
 
+
+/******************************************************************************/
+/* Revisions to Error Macros, to go with Revisions to FUNC_ENTER/LEAVE Macros */
+/******************************************************************************/
+
+/*
+ * H5E_PRINTF macro, used to facilitate error reporting between a BEGIN_FUNC()
+ * and an END_FUNC() within a function body.  The arguments are the minor
+ * error number, a description of the error (as a printf-like format string),
+ * and an optional set of arguments for the printf format arguments.
+ */
+#define H5E_PRINTF(...) H5E_printf_stack(NULL, __FILE__, FUNC, __LINE__, H5E_ERR_CLS_g, H5_MY_PKG_ERR,  __VA_ARGS__)
+
+/*
+ * H5_LEAVE macro, used to facilitate control flow between a
+ * BEGIN_FUNC() and an END_FUNC() within a function body.  The argument is
+ * the return value.
+ * The return value is assigned to a variable `ret_value' and control branches
+ * to the `catch_except' label, if we're not already past it.
+ */
+#define H5_LEAVE(v) {							      \
+    ret_value = v;							      \
+    if(!past_catch)							      \
+        goto catch_except;						      \
+}
+
+/*
+ * H5E_THROW macro, used to facilitate error reporting between a
+ * FUNC_ENTER() and a FUNC_LEAVE() within a function body.  The arguments are
+ * the minor error number, and an error string.
+ * The return value is assigned to a variable `ret_value' and control branches
+ * to the `catch_except' label, if we're not already past it.
+ */
+#define H5E_THROW(...) {						      \
+    H5E_PRINTF(__VA_ARGS__);						      \
+    H5_LEAVE(fail_value)						      \
+}
+
+/* Macro for "catching" flow of control when an error occurs.  Note that the
+ *      H5_LEAVE macro won't jump back here once it's past this point.
+ */
+#define CATCH catch_except:; past_catch = TRUE;
+
+
+/* Library-private functions defined in H5E package */
+H5_DLL herr_t H5E_init(void);
+H5_DLL herr_t H5E_push_stack(H5E_t *estack, const char *file, const char *func,
+    unsigned line, hid_t cls_id, hid_t maj_id, hid_t min_id, const char *desc);
+H5_DLL herr_t H5E_printf_stack(H5E_t *estack, const char *file, const char *func,
+    unsigned line, hid_t cls_id, hid_t maj_id, hid_t min_id, const char *fmt, ...)H5_ATTR_FORMAT(printf, 8, 9);
+H5_DLL herr_t H5E_clear_stack(H5E_t *estack);
+H5_DLL herr_t H5E_dump_api_stack(hbool_t is_api);
+
 #endif /* _H5Eprivate_H */
 
diff --git a/src/H5Epubgen.h b/src/H5Epubgen.h
index 75eca0b..520bc29 100644
--- a/src/H5Epubgen.h
+++ b/src/H5Epubgen.h
@@ -24,73 +24,165 @@
 /* Major error codes */
 /*********************/
 
-#define H5E_DATASET          (H5OPEN H5E_DATASET_g)
-#define H5E_FUNC             (H5OPEN H5E_FUNC_g)
-#define H5E_STORAGE          (H5OPEN H5E_STORAGE_g)
-#define H5E_FILE             (H5OPEN H5E_FILE_g)
-#define H5E_SOHM             (H5OPEN H5E_SOHM_g)
-#define H5E_SYM              (H5OPEN H5E_SYM_g)
-#define H5E_PLUGIN           (H5OPEN H5E_PLUGIN_g)
-#define H5E_VFL              (H5OPEN H5E_VFL_g)
-#define H5E_INTERNAL         (H5OPEN H5E_INTERNAL_g)
-#define H5E_BTREE            (H5OPEN H5E_BTREE_g)
-#define H5E_REFERENCE        (H5OPEN H5E_REFERENCE_g)
-#define H5E_DATASPACE        (H5OPEN H5E_DATASPACE_g)
-#define H5E_RESOURCE         (H5OPEN H5E_RESOURCE_g)
+#define H5E_FSPACE           (H5OPEN H5E_FSPACE_g)
 #define H5E_PLIST            (H5OPEN H5E_PLIST_g)
-#define H5E_LINK             (H5OPEN H5E_LINK_g)
-#define H5E_DATATYPE         (H5OPEN H5E_DATATYPE_g)
 #define H5E_RS               (H5OPEN H5E_RS_g)
-#define H5E_HEAP             (H5OPEN H5E_HEAP_g)
-#define H5E_OHDR             (H5OPEN H5E_OHDR_g)
-#define H5E_ATOM             (H5OPEN H5E_ATOM_g)
-#define H5E_ATTR             (H5OPEN H5E_ATTR_g)
-#define H5E_NONE_MAJOR       (H5OPEN H5E_NONE_MAJOR_g)
+#define H5E_DATATYPE         (H5OPEN H5E_DATATYPE_g)
+#define H5E_ERROR            (H5OPEN H5E_ERROR_g)
+#define H5E_DATASPACE        (H5OPEN H5E_DATASPACE_g)
+#define H5E_FARRAY           (H5OPEN H5E_FARRAY_g)
+#define H5E_INTERNAL         (H5OPEN H5E_INTERNAL_g)
+#define H5E_PLUGIN           (H5OPEN H5E_PLUGIN_g)
+#define H5E_CACHE            (H5OPEN H5E_CACHE_g)
+#define H5E_FUNC             (H5OPEN H5E_FUNC_g)
+#define H5E_EARRAY           (H5OPEN H5E_EARRAY_g)
 #define H5E_IO               (H5OPEN H5E_IO_g)
+#define H5E_NONE_MAJOR       (H5OPEN H5E_NONE_MAJOR_g)
 #define H5E_SLIST            (H5OPEN H5E_SLIST_g)
+#define H5E_RESOURCE         (H5OPEN H5E_RESOURCE_g)
+#define H5E_SYM              (H5OPEN H5E_SYM_g)
+#define H5E_ATOM             (H5OPEN H5E_ATOM_g)
+#define H5E_REFERENCE        (H5OPEN H5E_REFERENCE_g)
+#define H5E_PLINE            (H5OPEN H5E_PLINE_g)
+#define H5E_ARGS             (H5OPEN H5E_ARGS_g)
+#define H5E_SOHM             (H5OPEN H5E_SOHM_g)
+#define H5E_DATASET          (H5OPEN H5E_DATASET_g)
+#define H5E_STORAGE          (H5OPEN H5E_STORAGE_g)
 #define H5E_EFL              (H5OPEN H5E_EFL_g)
+#define H5E_FILE             (H5OPEN H5E_FILE_g)
 #define H5E_TST              (H5OPEN H5E_TST_g)
-#define H5E_ARGS             (H5OPEN H5E_ARGS_g)
-#define H5E_ERROR            (H5OPEN H5E_ERROR_g)
-#define H5E_PLINE            (H5OPEN H5E_PLINE_g)
-#define H5E_FSPACE           (H5OPEN H5E_FSPACE_g)
-#define H5E_CACHE            (H5OPEN H5E_CACHE_g)
-H5_DLLVAR hid_t H5E_DATASET_g;       /* Dataset */
-H5_DLLVAR hid_t H5E_FUNC_g;          /* Function entry/exit */
-H5_DLLVAR hid_t H5E_STORAGE_g;       /* Data storage */
-H5_DLLVAR hid_t H5E_FILE_g;          /* File accessibilty */
-H5_DLLVAR hid_t H5E_SOHM_g;          /* Shared Object Header Messages */
-H5_DLLVAR hid_t H5E_SYM_g;           /* Symbol table */
-H5_DLLVAR hid_t H5E_PLUGIN_g;        /* Plugin for dynamically loaded library */
-H5_DLLVAR hid_t H5E_VFL_g;           /* Virtual File Layer */
-H5_DLLVAR hid_t H5E_INTERNAL_g;      /* Internal error (too specific to document in detail) */
-H5_DLLVAR hid_t H5E_BTREE_g;         /* B-Tree node */
-H5_DLLVAR hid_t H5E_REFERENCE_g;     /* References */
-H5_DLLVAR hid_t H5E_DATASPACE_g;     /* Dataspace */
-H5_DLLVAR hid_t H5E_RESOURCE_g;      /* Resource unavailable */
+#define H5E_ATTR             (H5OPEN H5E_ATTR_g)
+#define H5E_HEAP             (H5OPEN H5E_HEAP_g)
+#define H5E_LINK             (H5OPEN H5E_LINK_g)
+#define H5E_BTREE            (H5OPEN H5E_BTREE_g)
+#define H5E_OHDR             (H5OPEN H5E_OHDR_g)
+#define H5E_VFL              (H5OPEN H5E_VFL_g)
+H5_DLLVAR hid_t H5E_FSPACE_g;        /* Free Space Manager */
 H5_DLLVAR hid_t H5E_PLIST_g;         /* Property lists */
-H5_DLLVAR hid_t H5E_LINK_g;          /* Links */
-H5_DLLVAR hid_t H5E_DATATYPE_g;      /* Datatype */
 H5_DLLVAR hid_t H5E_RS_g;            /* Reference Counted Strings */
-H5_DLLVAR hid_t H5E_HEAP_g;          /* Heap */
-H5_DLLVAR hid_t H5E_OHDR_g;          /* Object header */
-H5_DLLVAR hid_t H5E_ATOM_g;          /* Object atom */
-H5_DLLVAR hid_t H5E_ATTR_g;          /* Attribute */
-H5_DLLVAR hid_t H5E_NONE_MAJOR_g;    /* No error */
+H5_DLLVAR hid_t H5E_DATATYPE_g;      /* Datatype */
+H5_DLLVAR hid_t H5E_ERROR_g;         /* Error API */
+H5_DLLVAR hid_t H5E_DATASPACE_g;     /* Dataspace */
+H5_DLLVAR hid_t H5E_FARRAY_g;        /* Fixed Array */
+H5_DLLVAR hid_t H5E_INTERNAL_g;      /* Internal error (too specific to document in detail) */
+H5_DLLVAR hid_t H5E_PLUGIN_g;        /* Plugin for dynamically loaded library */
+H5_DLLVAR hid_t H5E_CACHE_g;         /* Object cache */
+H5_DLLVAR hid_t H5E_FUNC_g;          /* Function entry/exit */
+H5_DLLVAR hid_t H5E_EARRAY_g;        /* Extensible Array */
 H5_DLLVAR hid_t H5E_IO_g;            /* Low-level I/O */
+H5_DLLVAR hid_t H5E_NONE_MAJOR_g;    /* No error */
 H5_DLLVAR hid_t H5E_SLIST_g;         /* Skip Lists */
+H5_DLLVAR hid_t H5E_RESOURCE_g;      /* Resource unavailable */
+H5_DLLVAR hid_t H5E_SYM_g;           /* Symbol table */
+H5_DLLVAR hid_t H5E_ATOM_g;          /* Object atom */
+H5_DLLVAR hid_t H5E_REFERENCE_g;     /* References */
+H5_DLLVAR hid_t H5E_PLINE_g;         /* Data filters */
+H5_DLLVAR hid_t H5E_ARGS_g;          /* Invalid arguments to routine */
+H5_DLLVAR hid_t H5E_SOHM_g;          /* Shared Object Header Messages */
+H5_DLLVAR hid_t H5E_DATASET_g;       /* Dataset */
+H5_DLLVAR hid_t H5E_STORAGE_g;       /* Data storage */
 H5_DLLVAR hid_t H5E_EFL_g;           /* External file list */
+H5_DLLVAR hid_t H5E_FILE_g;          /* File accessibilty */
 H5_DLLVAR hid_t H5E_TST_g;           /* Ternary Search Trees */
-H5_DLLVAR hid_t H5E_ARGS_g;          /* Invalid arguments to routine */
-H5_DLLVAR hid_t H5E_ERROR_g;         /* Error API */
-H5_DLLVAR hid_t H5E_PLINE_g;         /* Data filters */
-H5_DLLVAR hid_t H5E_FSPACE_g;        /* Free Space Manager */
-H5_DLLVAR hid_t H5E_CACHE_g;         /* Object cache */
+H5_DLLVAR hid_t H5E_ATTR_g;          /* Attribute */
+H5_DLLVAR hid_t H5E_HEAP_g;          /* Heap */
+H5_DLLVAR hid_t H5E_LINK_g;          /* Links */
+H5_DLLVAR hid_t H5E_BTREE_g;         /* B-Tree node */
+H5_DLLVAR hid_t H5E_OHDR_g;          /* Object header */
+H5_DLLVAR hid_t H5E_VFL_g;           /* Virtual File Layer */
 
 /*********************/
 /* Minor error codes */
 /*********************/
 
+/* Free space errors */
+#define H5E_CANTMERGE        (H5OPEN H5E_CANTMERGE_g)
+#define H5E_CANTREVIVE       (H5OPEN H5E_CANTREVIVE_g)
+#define H5E_CANTSHRINK       (H5OPEN H5E_CANTSHRINK_g)
+H5_DLLVAR hid_t H5E_CANTMERGE_g;     /* Can't merge objects */
+H5_DLLVAR hid_t H5E_CANTREVIVE_g;    /* Can't revive object */
+H5_DLLVAR hid_t H5E_CANTSHRINK_g;    /* Can't shrink container */
+
+/* Heap errors */
+#define H5E_CANTRESTORE      (H5OPEN H5E_CANTRESTORE_g)
+#define H5E_CANTCOMPUTE      (H5OPEN H5E_CANTCOMPUTE_g)
+#define H5E_CANTEXTEND       (H5OPEN H5E_CANTEXTEND_g)
+#define H5E_CANTATTACH       (H5OPEN H5E_CANTATTACH_g)
+#define H5E_CANTUPDATE       (H5OPEN H5E_CANTUPDATE_g)
+#define H5E_CANTOPERATE      (H5OPEN H5E_CANTOPERATE_g)
+H5_DLLVAR hid_t H5E_CANTRESTORE_g;   /* Can't restore condition */
+H5_DLLVAR hid_t H5E_CANTCOMPUTE_g;   /* Can't compute value */
+H5_DLLVAR hid_t H5E_CANTEXTEND_g;    /* Can't extend heap's space */
+H5_DLLVAR hid_t H5E_CANTATTACH_g;    /* Can't attach object */
+H5_DLLVAR hid_t H5E_CANTUPDATE_g;    /* Can't update object */
+H5_DLLVAR hid_t H5E_CANTOPERATE_g;   /* Can't operate on object */
+
+/* System level errors */
+#define H5E_SYSERRSTR        (H5OPEN H5E_SYSERRSTR_g)
+H5_DLLVAR hid_t H5E_SYSERRSTR_g;     /* System error message */
+
+/* Argument errors */
+#define H5E_UNINITIALIZED    (H5OPEN H5E_UNINITIALIZED_g)
+#define H5E_UNSUPPORTED      (H5OPEN H5E_UNSUPPORTED_g)
+#define H5E_BADTYPE          (H5OPEN H5E_BADTYPE_g)
+#define H5E_BADRANGE         (H5OPEN H5E_BADRANGE_g)
+#define H5E_BADVALUE         (H5OPEN H5E_BADVALUE_g)
+H5_DLLVAR hid_t H5E_UNINITIALIZED_g; /* Information is uinitialized */
+H5_DLLVAR hid_t H5E_UNSUPPORTED_g;   /* Feature is unsupported */
+H5_DLLVAR hid_t H5E_BADTYPE_g;       /* Inappropriate type */
+H5_DLLVAR hid_t H5E_BADRANGE_g;      /* Out of range */
+H5_DLLVAR hid_t H5E_BADVALUE_g;      /* Bad value */
+
+/* Datatype conversion errors */
+#define H5E_CANTCONVERT      (H5OPEN H5E_CANTCONVERT_g)
+#define H5E_BADSIZE          (H5OPEN H5E_BADSIZE_g)
+H5_DLLVAR hid_t H5E_CANTCONVERT_g;   /* Can't convert datatypes */
+H5_DLLVAR hid_t H5E_BADSIZE_g;       /* Bad size for object */
+
+/* File accessibilty errors */
+#define H5E_FILEEXISTS       (H5OPEN H5E_FILEEXISTS_g)
+#define H5E_FILEOPEN         (H5OPEN H5E_FILEOPEN_g)
+#define H5E_CANTCREATE       (H5OPEN H5E_CANTCREATE_g)
+#define H5E_CANTOPENFILE     (H5OPEN H5E_CANTOPENFILE_g)
+#define H5E_CANTCLOSEFILE    (H5OPEN H5E_CANTCLOSEFILE_g)
+#define H5E_NOTHDF5          (H5OPEN H5E_NOTHDF5_g)
+#define H5E_BADFILE          (H5OPEN H5E_BADFILE_g)
+#define H5E_TRUNCATED        (H5OPEN H5E_TRUNCATED_g)
+#define H5E_MOUNT            (H5OPEN H5E_MOUNT_g)
+H5_DLLVAR hid_t H5E_FILEEXISTS_g;    /* File already exists */
+H5_DLLVAR hid_t H5E_FILEOPEN_g;      /* File already open */
+H5_DLLVAR hid_t H5E_CANTCREATE_g;    /* Unable to create file */
+H5_DLLVAR hid_t H5E_CANTOPENFILE_g;  /* Unable to open file */
+H5_DLLVAR hid_t H5E_CANTCLOSEFILE_g; /* Unable to close file */
+H5_DLLVAR hid_t H5E_NOTHDF5_g;       /* Not an HDF5 file */
+H5_DLLVAR hid_t H5E_BADFILE_g;       /* Bad file ID accessed */
+H5_DLLVAR hid_t H5E_TRUNCATED_g;     /* File has been truncated */
+H5_DLLVAR hid_t H5E_MOUNT_g;         /* File mount error */
+
+/* Object atom related errors */
+#define H5E_BADATOM          (H5OPEN H5E_BADATOM_g)
+#define H5E_BADGROUP         (H5OPEN H5E_BADGROUP_g)
+#define H5E_CANTREGISTER     (H5OPEN H5E_CANTREGISTER_g)
+#define H5E_CANTINC          (H5OPEN H5E_CANTINC_g)
+#define H5E_CANTDEC          (H5OPEN H5E_CANTDEC_g)
+#define H5E_NOIDS            (H5OPEN H5E_NOIDS_g)
+H5_DLLVAR hid_t H5E_BADATOM_g;       /* Unable to find atom information (already closed?) */
+H5_DLLVAR hid_t H5E_BADGROUP_g;      /* Unable to find ID group information */
+H5_DLLVAR hid_t H5E_CANTREGISTER_g;  /* Unable to register new atom */
+H5_DLLVAR hid_t H5E_CANTINC_g;       /* Unable to increment reference count */
+H5_DLLVAR hid_t H5E_CANTDEC_g;       /* Unable to decrement reference count */
+H5_DLLVAR hid_t H5E_NOIDS_g;         /* Out of IDs for group */
+
+/* Property list errors */
+#define H5E_CANTGET          (H5OPEN H5E_CANTGET_g)
+#define H5E_CANTSET          (H5OPEN H5E_CANTSET_g)
+#define H5E_DUPCLASS         (H5OPEN H5E_DUPCLASS_g)
+#define H5E_SETDISALLOWED    (H5OPEN H5E_SETDISALLOWED_g)
+H5_DLLVAR hid_t H5E_CANTGET_g;       /* Can't get value */
+H5_DLLVAR hid_t H5E_CANTSET_g;       /* Can't set value */
+H5_DLLVAR hid_t H5E_DUPCLASS_g;      /* Duplicate class name in parent class */
+H5_DLLVAR hid_t H5E_SETDISALLOWED_g; /* Disallowed operation */
+
 /* Generic low-level file I/O errors */
 #define H5E_SEEKERROR        (H5OPEN H5E_SEEKERROR_g)
 #define H5E_READERROR        (H5OPEN H5E_READERROR_g)
@@ -105,6 +197,34 @@ H5_DLLVAR hid_t H5E_CLOSEERROR_g;    /* Close failed */
 H5_DLLVAR hid_t H5E_OVERFLOW_g;      /* Address overflowed */
 H5_DLLVAR hid_t H5E_FCNTL_g;         /* File control (fcntl) failed */
 
+/* Dataspace errors */
+#define H5E_CANTCLIP         (H5OPEN H5E_CANTCLIP_g)
+#define H5E_CANTCOUNT        (H5OPEN H5E_CANTCOUNT_g)
+#define H5E_CANTSELECT       (H5OPEN H5E_CANTSELECT_g)
+#define H5E_CANTNEXT         (H5OPEN H5E_CANTNEXT_g)
+#define H5E_BADSELECT        (H5OPEN H5E_BADSELECT_g)
+#define H5E_CANTCOMPARE      (H5OPEN H5E_CANTCOMPARE_g)
+#define H5E_CANTAPPEND       (H5OPEN H5E_CANTAPPEND_g)
+H5_DLLVAR hid_t H5E_CANTCLIP_g;      /* Can't clip hyperslab region */
+H5_DLLVAR hid_t H5E_CANTCOUNT_g;     /* Can't count elements */
+H5_DLLVAR hid_t H5E_CANTSELECT_g;    /* Can't select hyperslab */
+H5_DLLVAR hid_t H5E_CANTNEXT_g;      /* Can't move to next iterator location */
+H5_DLLVAR hid_t H5E_BADSELECT_g;     /* Invalid selection */
+H5_DLLVAR hid_t H5E_CANTCOMPARE_g;   /* Can't compare objects */
+H5_DLLVAR hid_t H5E_CANTAPPEND_g;    /* Can't append object */
+
+/* Link related errors */
+#define H5E_TRAVERSE         (H5OPEN H5E_TRAVERSE_g)
+#define H5E_NLINKS           (H5OPEN H5E_NLINKS_g)
+#define H5E_NOTREGISTERED    (H5OPEN H5E_NOTREGISTERED_g)
+#define H5E_CANTMOVE         (H5OPEN H5E_CANTMOVE_g)
+#define H5E_CANTSORT         (H5OPEN H5E_CANTSORT_g)
+H5_DLLVAR hid_t H5E_TRAVERSE_g;      /* Link traversal failure */
+H5_DLLVAR hid_t H5E_NLINKS_g;        /* Too many soft links in path */
+H5_DLLVAR hid_t H5E_NOTREGISTERED_g; /* Link class not registered */
+H5_DLLVAR hid_t H5E_CANTMOVE_g;      /* Can't move object */
+H5_DLLVAR hid_t H5E_CANTSORT_g;      /* Can't sort objects */
+
 /* Resource errors */
 #define H5E_NOSPACE          (H5OPEN H5E_NOSPACE_g)
 #define H5E_CANTALLOC        (H5OPEN H5E_CANTALLOC_g)
@@ -127,45 +247,13 @@ H5_DLLVAR hid_t H5E_CANTGC_g;        /* Unable to garbage collect */
 H5_DLLVAR hid_t H5E_CANTGETSIZE_g;   /* Unable to compute size */
 H5_DLLVAR hid_t H5E_OBJOPEN_g;       /* Object is already open */
 
-/* Heap errors */
-#define H5E_CANTRESTORE      (H5OPEN H5E_CANTRESTORE_g)
-#define H5E_CANTCOMPUTE      (H5OPEN H5E_CANTCOMPUTE_g)
-#define H5E_CANTEXTEND       (H5OPEN H5E_CANTEXTEND_g)
-#define H5E_CANTATTACH       (H5OPEN H5E_CANTATTACH_g)
-#define H5E_CANTUPDATE       (H5OPEN H5E_CANTUPDATE_g)
-#define H5E_CANTOPERATE      (H5OPEN H5E_CANTOPERATE_g)
-H5_DLLVAR hid_t H5E_CANTRESTORE_g;   /* Can't restore condition */
-H5_DLLVAR hid_t H5E_CANTCOMPUTE_g;   /* Can't compute value */
-H5_DLLVAR hid_t H5E_CANTEXTEND_g;    /* Can't extend heap's space */
-H5_DLLVAR hid_t H5E_CANTATTACH_g;    /* Can't attach object */
-H5_DLLVAR hid_t H5E_CANTUPDATE_g;    /* Can't update object */
-H5_DLLVAR hid_t H5E_CANTOPERATE_g;   /* Can't operate on object */
-
-/* Function entry/exit interface errors */
-#define H5E_CANTINIT         (H5OPEN H5E_CANTINIT_g)
-#define H5E_ALREADYINIT      (H5OPEN H5E_ALREADYINIT_g)
-#define H5E_CANTRELEASE      (H5OPEN H5E_CANTRELEASE_g)
-H5_DLLVAR hid_t H5E_CANTINIT_g;      /* Unable to initialize object */
-H5_DLLVAR hid_t H5E_ALREADYINIT_g;   /* Object already initialized */
-H5_DLLVAR hid_t H5E_CANTRELEASE_g;   /* Unable to release object */
-
-/* Property list errors */
-#define H5E_CANTGET          (H5OPEN H5E_CANTGET_g)
-#define H5E_CANTSET          (H5OPEN H5E_CANTSET_g)
-#define H5E_DUPCLASS         (H5OPEN H5E_DUPCLASS_g)
-#define H5E_SETDISALLOWED    (H5OPEN H5E_SETDISALLOWED_g)
-H5_DLLVAR hid_t H5E_CANTGET_g;       /* Can't get value */
-H5_DLLVAR hid_t H5E_CANTSET_g;       /* Can't set value */
-H5_DLLVAR hid_t H5E_DUPCLASS_g;      /* Duplicate class name in parent class */
-H5_DLLVAR hid_t H5E_SETDISALLOWED_g; /* Disallowed operation */
-
-/* Free space errors */
-#define H5E_CANTMERGE        (H5OPEN H5E_CANTMERGE_g)
-#define H5E_CANTREVIVE       (H5OPEN H5E_CANTREVIVE_g)
-#define H5E_CANTSHRINK       (H5OPEN H5E_CANTSHRINK_g)
-H5_DLLVAR hid_t H5E_CANTMERGE_g;     /* Can't merge objects */
-H5_DLLVAR hid_t H5E_CANTREVIVE_g;    /* Can't revive object */
-H5_DLLVAR hid_t H5E_CANTSHRINK_g;    /* Can't shrink container */
+/* Parallel MPI errors */
+#define H5E_MPI              (H5OPEN H5E_MPI_g)
+#define H5E_MPIERRSTR        (H5OPEN H5E_MPIERRSTR_g)
+#define H5E_CANTRECV         (H5OPEN H5E_CANTRECV_g)
+H5_DLLVAR hid_t H5E_MPI_g;           /* Some MPI function failed */
+H5_DLLVAR hid_t H5E_MPIERRSTR_g;     /* MPI Error String */
+H5_DLLVAR hid_t H5E_CANTRECV_g;      /* Can't receive data */
 
 /* Object header related errors */
 #define H5E_LINKCOUNT        (H5OPEN H5E_LINKCOUNT_g)
@@ -187,9 +275,15 @@ H5_DLLVAR hid_t H5E_CANTPACK_g;      /* Can't pack messages */
 H5_DLLVAR hid_t H5E_CANTRESET_g;     /* Can't reset object */
 H5_DLLVAR hid_t H5E_CANTRENAME_g;    /* Unable to rename object */
 
-/* System level errors */
-#define H5E_SYSERRSTR        (H5OPEN H5E_SYSERRSTR_g)
-H5_DLLVAR hid_t H5E_SYSERRSTR_g;     /* System error message */
+/* Group related errors */
+#define H5E_CANTOPENOBJ      (H5OPEN H5E_CANTOPENOBJ_g)
+#define H5E_CANTCLOSEOBJ     (H5OPEN H5E_CANTCLOSEOBJ_g)
+#define H5E_COMPLEN          (H5OPEN H5E_COMPLEN_g)
+#define H5E_PATH             (H5OPEN H5E_PATH_g)
+H5_DLLVAR hid_t H5E_CANTOPENOBJ_g;   /* Can't open object */
+H5_DLLVAR hid_t H5E_CANTCLOSEOBJ_g;  /* Can't close object */
+H5_DLLVAR hid_t H5E_COMPLEN_g;       /* Name component is too long */
+H5_DLLVAR hid_t H5E_PATH_g;          /* Problem with path to object */
 
 /* I/O pipeline errors */
 #define H5E_NOFILTER         (H5OPEN H5E_NOFILTER_g)
@@ -205,61 +299,10 @@ H5_DLLVAR hid_t H5E_SETLOCAL_g;      /* Error from filter 'set local' callback *
 H5_DLLVAR hid_t H5E_NOENCODER_g;     /* Filter present but encoding disabled */
 H5_DLLVAR hid_t H5E_CANTFILTER_g;    /* Filter operation failed */
 
-/* Group related errors */
-#define H5E_CANTOPENOBJ      (H5OPEN H5E_CANTOPENOBJ_g)
-#define H5E_CANTCLOSEOBJ     (H5OPEN H5E_CANTCLOSEOBJ_g)
-#define H5E_COMPLEN          (H5OPEN H5E_COMPLEN_g)
-#define H5E_PATH             (H5OPEN H5E_PATH_g)
-H5_DLLVAR hid_t H5E_CANTOPENOBJ_g;   /* Can't open object */
-H5_DLLVAR hid_t H5E_CANTCLOSEOBJ_g;  /* Can't close object */
-H5_DLLVAR hid_t H5E_COMPLEN_g;       /* Name component is too long */
-H5_DLLVAR hid_t H5E_PATH_g;          /* Problem with path to object */
-
-/* No error */
-#define H5E_NONE_MINOR       (H5OPEN H5E_NONE_MINOR_g)
-H5_DLLVAR hid_t H5E_NONE_MINOR_g;    /* No error */
-
-/* Plugin errors */
-#define H5E_OPENERROR        (H5OPEN H5E_OPENERROR_g)
-H5_DLLVAR hid_t H5E_OPENERROR_g;     /* Can't open directory or file */
-
-/* File accessibilty errors */
-#define H5E_FILEEXISTS       (H5OPEN H5E_FILEEXISTS_g)
-#define H5E_FILEOPEN         (H5OPEN H5E_FILEOPEN_g)
-#define H5E_CANTCREATE       (H5OPEN H5E_CANTCREATE_g)
-#define H5E_CANTOPENFILE     (H5OPEN H5E_CANTOPENFILE_g)
-#define H5E_CANTCLOSEFILE    (H5OPEN H5E_CANTCLOSEFILE_g)
-#define H5E_NOTHDF5          (H5OPEN H5E_NOTHDF5_g)
-#define H5E_BADFILE          (H5OPEN H5E_BADFILE_g)
-#define H5E_TRUNCATED        (H5OPEN H5E_TRUNCATED_g)
-#define H5E_MOUNT            (H5OPEN H5E_MOUNT_g)
-H5_DLLVAR hid_t H5E_FILEEXISTS_g;    /* File already exists */
-H5_DLLVAR hid_t H5E_FILEOPEN_g;      /* File already open */
-H5_DLLVAR hid_t H5E_CANTCREATE_g;    /* Unable to create file */
-H5_DLLVAR hid_t H5E_CANTOPENFILE_g;  /* Unable to open file */
-H5_DLLVAR hid_t H5E_CANTCLOSEFILE_g; /* Unable to close file */
-H5_DLLVAR hid_t H5E_NOTHDF5_g;       /* Not an HDF5 file */
-H5_DLLVAR hid_t H5E_BADFILE_g;       /* Bad file ID accessed */
-H5_DLLVAR hid_t H5E_TRUNCATED_g;     /* File has been truncated */
-H5_DLLVAR hid_t H5E_MOUNT_g;         /* File mount error */
-
-/* Object atom related errors */
-#define H5E_BADATOM          (H5OPEN H5E_BADATOM_g)
-#define H5E_BADGROUP         (H5OPEN H5E_BADGROUP_g)
-#define H5E_CANTREGISTER     (H5OPEN H5E_CANTREGISTER_g)
-#define H5E_CANTINC          (H5OPEN H5E_CANTINC_g)
-#define H5E_CANTDEC          (H5OPEN H5E_CANTDEC_g)
-#define H5E_NOIDS            (H5OPEN H5E_NOIDS_g)
-H5_DLLVAR hid_t H5E_BADATOM_g;       /* Unable to find atom information (already closed?) */
-H5_DLLVAR hid_t H5E_BADGROUP_g;      /* Unable to find ID group information */
-H5_DLLVAR hid_t H5E_CANTREGISTER_g;  /* Unable to register new atom */
-H5_DLLVAR hid_t H5E_CANTINC_g;       /* Unable to increment reference count */
-H5_DLLVAR hid_t H5E_CANTDEC_g;       /* Unable to decrement reference count */
-H5_DLLVAR hid_t H5E_NOIDS_g;         /* Out of IDs for group */
-
 /* Cache related errors */
 #define H5E_CANTFLUSH        (H5OPEN H5E_CANTFLUSH_g)
 #define H5E_CANTSERIALIZE    (H5OPEN H5E_CANTSERIALIZE_g)
+#define H5E_CANTTAG          (H5OPEN H5E_CANTTAG_g)
 #define H5E_CANTLOAD         (H5OPEN H5E_CANTLOAD_g)
 #define H5E_PROTECT          (H5OPEN H5E_PROTECT_g)
 #define H5E_NOTCACHED        (H5OPEN H5E_NOTCACHED_g)
@@ -273,8 +316,15 @@ H5_DLLVAR hid_t H5E_NOIDS_g;         /* Out of IDs for group */
 #define H5E_CANTDIRTY        (H5OPEN H5E_CANTDIRTY_g)
 #define H5E_CANTEXPUNGE      (H5OPEN H5E_CANTEXPUNGE_g)
 #define H5E_CANTRESIZE       (H5OPEN H5E_CANTRESIZE_g)
+#define H5E_CANTDEPEND       (H5OPEN H5E_CANTDEPEND_g)
+#define H5E_CANTUNDEPEND     (H5OPEN H5E_CANTUNDEPEND_g)
+#define H5E_CANTNOTIFY       (H5OPEN H5E_CANTNOTIFY_g)
+#define H5E_LOGFAIL          (H5OPEN H5E_LOGFAIL_g)
+#define H5E_CANTCORK         (H5OPEN H5E_CANTCORK_g)
+#define H5E_CANTUNCORK       (H5OPEN H5E_CANTUNCORK_g)
 H5_DLLVAR hid_t H5E_CANTFLUSH_g;     /* Unable to flush data from cache */
 H5_DLLVAR hid_t H5E_CANTSERIALIZE_g; /* Unable to serialize data from cache */
+H5_DLLVAR hid_t H5E_CANTTAG_g;       /* Unable to tag metadata in the cache */
 H5_DLLVAR hid_t H5E_CANTLOAD_g;      /* Unable to load metadata into cache */
 H5_DLLVAR hid_t H5E_PROTECT_g;       /* Protected metadata error */
 H5_DLLVAR hid_t H5E_NOTCACHED_g;     /* Metadata not currently cached */
@@ -288,52 +338,12 @@ H5_DLLVAR hid_t H5E_CANTMARKDIRTY_g; /* Unable to mark a pinned entry as dirty *
 H5_DLLVAR hid_t H5E_CANTDIRTY_g;     /* Unable to mark metadata as dirty */
 H5_DLLVAR hid_t H5E_CANTEXPUNGE_g;   /* Unable to expunge a metadata cache entry */
 H5_DLLVAR hid_t H5E_CANTRESIZE_g;    /* Unable to resize a metadata cache entry */
-
-/* Link related errors */
-#define H5E_TRAVERSE         (H5OPEN H5E_TRAVERSE_g)
-#define H5E_NLINKS           (H5OPEN H5E_NLINKS_g)
-#define H5E_NOTREGISTERED    (H5OPEN H5E_NOTREGISTERED_g)
-#define H5E_CANTMOVE         (H5OPEN H5E_CANTMOVE_g)
-#define H5E_CANTSORT         (H5OPEN H5E_CANTSORT_g)
-H5_DLLVAR hid_t H5E_TRAVERSE_g;      /* Link traversal failure */
-H5_DLLVAR hid_t H5E_NLINKS_g;        /* Too many soft links in path */
-H5_DLLVAR hid_t H5E_NOTREGISTERED_g; /* Link class not registered */
-H5_DLLVAR hid_t H5E_CANTMOVE_g;      /* Can't move object */
-H5_DLLVAR hid_t H5E_CANTSORT_g;      /* Can't sort objects */
-
-/* Parallel MPI errors */
-#define H5E_MPI              (H5OPEN H5E_MPI_g)
-#define H5E_MPIERRSTR        (H5OPEN H5E_MPIERRSTR_g)
-#define H5E_CANTRECV         (H5OPEN H5E_CANTRECV_g)
-H5_DLLVAR hid_t H5E_MPI_g;           /* Some MPI function failed */
-H5_DLLVAR hid_t H5E_MPIERRSTR_g;     /* MPI Error String */
-H5_DLLVAR hid_t H5E_CANTRECV_g;      /* Can't receive data */
-
-/* Dataspace errors */
-#define H5E_CANTCLIP         (H5OPEN H5E_CANTCLIP_g)
-#define H5E_CANTCOUNT        (H5OPEN H5E_CANTCOUNT_g)
-#define H5E_CANTSELECT       (H5OPEN H5E_CANTSELECT_g)
-#define H5E_CANTNEXT         (H5OPEN H5E_CANTNEXT_g)
-#define H5E_BADSELECT        (H5OPEN H5E_BADSELECT_g)
-#define H5E_CANTCOMPARE      (H5OPEN H5E_CANTCOMPARE_g)
-H5_DLLVAR hid_t H5E_CANTCLIP_g;      /* Can't clip hyperslab region */
-H5_DLLVAR hid_t H5E_CANTCOUNT_g;     /* Can't count elements */
-H5_DLLVAR hid_t H5E_CANTSELECT_g;    /* Can't select hyperslab */
-H5_DLLVAR hid_t H5E_CANTNEXT_g;      /* Can't move to next iterator location */
-H5_DLLVAR hid_t H5E_BADSELECT_g;     /* Invalid selection */
-H5_DLLVAR hid_t H5E_CANTCOMPARE_g;   /* Can't compare objects */
-
-/* Argument errors */
-#define H5E_UNINITIALIZED    (H5OPEN H5E_UNINITIALIZED_g)
-#define H5E_UNSUPPORTED      (H5OPEN H5E_UNSUPPORTED_g)
-#define H5E_BADTYPE          (H5OPEN H5E_BADTYPE_g)
-#define H5E_BADRANGE         (H5OPEN H5E_BADRANGE_g)
-#define H5E_BADVALUE         (H5OPEN H5E_BADVALUE_g)
-H5_DLLVAR hid_t H5E_UNINITIALIZED_g; /* Information is uinitialized */
-H5_DLLVAR hid_t H5E_UNSUPPORTED_g;   /* Feature is unsupported */
-H5_DLLVAR hid_t H5E_BADTYPE_g;       /* Inappropriate type */
-H5_DLLVAR hid_t H5E_BADRANGE_g;      /* Out of range */
-H5_DLLVAR hid_t H5E_BADVALUE_g;      /* Bad value */
+H5_DLLVAR hid_t H5E_CANTDEPEND_g;    /* Unable to create a flush dependency */
+H5_DLLVAR hid_t H5E_CANTUNDEPEND_g;  /* Unable to destroy a flush dependency */
+H5_DLLVAR hid_t H5E_CANTNOTIFY_g;    /* Unable to notify object about action */
+H5_DLLVAR hid_t H5E_LOGFAIL_g;       /* Failure in the cache logging framework */
+H5_DLLVAR hid_t H5E_CANTCORK_g;      /* Unable to cork an object */
+H5_DLLVAR hid_t H5E_CANTUNCORK_g;    /* Unable to uncork an object */
 
 /* B-tree related errors */
 #define H5E_NOTFOUND         (H5OPEN H5E_NOTFOUND_g)
@@ -359,10 +369,20 @@ H5_DLLVAR hid_t H5E_CANTLIST_g;      /* Unable to list node */
 H5_DLLVAR hid_t H5E_CANTMODIFY_g;    /* Unable to modify record */
 H5_DLLVAR hid_t H5E_CANTREMOVE_g;    /* Unable to remove object */
 
-/* Datatype conversion errors */
-#define H5E_CANTCONVERT      (H5OPEN H5E_CANTCONVERT_g)
-#define H5E_BADSIZE          (H5OPEN H5E_BADSIZE_g)
-H5_DLLVAR hid_t H5E_CANTCONVERT_g;   /* Can't convert datatypes */
-H5_DLLVAR hid_t H5E_BADSIZE_g;       /* Bad size for object */
+/* Function entry/exit interface errors */
+#define H5E_CANTINIT         (H5OPEN H5E_CANTINIT_g)
+#define H5E_ALREADYINIT      (H5OPEN H5E_ALREADYINIT_g)
+#define H5E_CANTRELEASE      (H5OPEN H5E_CANTRELEASE_g)
+H5_DLLVAR hid_t H5E_CANTINIT_g;      /* Unable to initialize object */
+H5_DLLVAR hid_t H5E_ALREADYINIT_g;   /* Object already initialized */
+H5_DLLVAR hid_t H5E_CANTRELEASE_g;   /* Unable to release object */
+
+/* Plugin errors */
+#define H5E_OPENERROR        (H5OPEN H5E_OPENERROR_g)
+H5_DLLVAR hid_t H5E_OPENERROR_g;     /* Can't open directory or file */
+
+/* No error */
+#define H5E_NONE_MINOR       (H5OPEN H5E_NONE_MINOR_g)
+H5_DLLVAR hid_t H5E_NONE_MINOR_g;    /* No error */
 
 #endif /* H5Epubgen_H */
diff --git a/src/H5Eterm.h b/src/H5Eterm.h
index 86902b8..67df864 100644
--- a/src/H5Eterm.h
+++ b/src/H5Eterm.h
@@ -22,41 +22,95 @@
 
 /* Reset major error IDs */
     
-H5E_DATASET_g=    
-H5E_FUNC_g=    
-H5E_STORAGE_g=    
-H5E_FILE_g=    
-H5E_SOHM_g=    
-H5E_SYM_g=    
-H5E_PLUGIN_g=    
-H5E_VFL_g=    
-H5E_INTERNAL_g=    
-H5E_BTREE_g=    
-H5E_REFERENCE_g=    
-H5E_DATASPACE_g=    
-H5E_RESOURCE_g=    
+H5E_FSPACE_g=    
 H5E_PLIST_g=    
-H5E_LINK_g=    
-H5E_DATATYPE_g=    
 H5E_RS_g=    
-H5E_HEAP_g=    
-H5E_OHDR_g=    
-H5E_ATOM_g=    
-H5E_ATTR_g=    
-H5E_NONE_MAJOR_g=    
+H5E_DATATYPE_g=    
+H5E_ERROR_g=    
+H5E_DATASPACE_g=    
+H5E_FARRAY_g=    
+H5E_INTERNAL_g=    
+H5E_PLUGIN_g=    
+H5E_CACHE_g=    
+H5E_FUNC_g=    
+H5E_EARRAY_g=    
 H5E_IO_g=    
+H5E_NONE_MAJOR_g=    
 H5E_SLIST_g=    
+H5E_RESOURCE_g=    
+H5E_SYM_g=    
+H5E_ATOM_g=    
+H5E_REFERENCE_g=    
+H5E_PLINE_g=    
+H5E_ARGS_g=    
+H5E_SOHM_g=    
+H5E_DATASET_g=    
+H5E_STORAGE_g=    
 H5E_EFL_g=    
+H5E_FILE_g=    
 H5E_TST_g=    
-H5E_ARGS_g=    
-H5E_ERROR_g=    
-H5E_PLINE_g=    
-H5E_FSPACE_g=    
-H5E_CACHE_g= (-1);
+H5E_ATTR_g=    
+H5E_HEAP_g=    
+H5E_LINK_g=    
+H5E_BTREE_g=    
+H5E_OHDR_g=    
+H5E_VFL_g= (-1);
 
 /* Reset minor error IDs */
 
 
+/* Free space errors */    
+H5E_CANTMERGE_g=    
+H5E_CANTREVIVE_g=    
+H5E_CANTSHRINK_g=
+
+/* Heap errors */    
+H5E_CANTRESTORE_g=    
+H5E_CANTCOMPUTE_g=    
+H5E_CANTEXTEND_g=    
+H5E_CANTATTACH_g=    
+H5E_CANTUPDATE_g=    
+H5E_CANTOPERATE_g=
+
+/* System level errors */    
+H5E_SYSERRSTR_g=
+
+/* Argument errors */    
+H5E_UNINITIALIZED_g=    
+H5E_UNSUPPORTED_g=    
+H5E_BADTYPE_g=    
+H5E_BADRANGE_g=    
+H5E_BADVALUE_g=
+
+/* Datatype conversion errors */    
+H5E_CANTCONVERT_g=    
+H5E_BADSIZE_g=
+
+/* File accessibilty errors */    
+H5E_FILEEXISTS_g=    
+H5E_FILEOPEN_g=    
+H5E_CANTCREATE_g=    
+H5E_CANTOPENFILE_g=    
+H5E_CANTCLOSEFILE_g=    
+H5E_NOTHDF5_g=    
+H5E_BADFILE_g=    
+H5E_TRUNCATED_g=    
+H5E_MOUNT_g=
+
+/* Object atom related errors */    
+H5E_BADATOM_g=    
+H5E_BADGROUP_g=    
+H5E_CANTREGISTER_g=    
+H5E_CANTINC_g=    
+H5E_CANTDEC_g=    
+H5E_NOIDS_g=
+
+/* Property list errors */    
+H5E_CANTGET_g=    
+H5E_CANTSET_g=    
+H5E_DUPCLASS_g=    
+H5E_SETDISALLOWED_g=
+
 /* Generic low-level file I/O errors */    
 H5E_SEEKERROR_g=    
 H5E_READERROR_g=    
@@ -65,6 +119,22 @@ H5E_CLOSEERROR_g=
 H5E_OVERFLOW_g=    
 H5E_FCNTL_g=
 
+/* Dataspace errors */    
+H5E_CANTCLIP_g=    
+H5E_CANTCOUNT_g=    
+H5E_CANTSELECT_g=    
+H5E_CANTNEXT_g=    
+H5E_BADSELECT_g=    
+H5E_CANTCOMPARE_g=    
+H5E_CANTAPPEND_g=
+
+/* Link related errors */    
+H5E_TRAVERSE_g=    
+H5E_NLINKS_g=    
+H5E_NOTREGISTERED_g=    
+H5E_CANTMOVE_g=    
+H5E_CANTSORT_g=
+
 /* Resource errors */    
 H5E_NOSPACE_g=    
 H5E_CANTALLOC_g=    
@@ -77,29 +147,10 @@ H5E_CANTGC_g=
 H5E_CANTGETSIZE_g=    
 H5E_OBJOPEN_g=
 
-/* Heap errors */    
-H5E_CANTRESTORE_g=    
-H5E_CANTCOMPUTE_g=    
-H5E_CANTEXTEND_g=    
-H5E_CANTATTACH_g=    
-H5E_CANTUPDATE_g=    
-H5E_CANTOPERATE_g=
-
-/* Function entry/exit interface errors */    
-H5E_CANTINIT_g=    
-H5E_ALREADYINIT_g=    
-H5E_CANTRELEASE_g=
-
-/* Property list errors */    
-H5E_CANTGET_g=    
-H5E_CANTSET_g=    
-H5E_DUPCLASS_g=    
-H5E_SETDISALLOWED_g=
-
-/* Free space errors */    
-H5E_CANTMERGE_g=    
-H5E_CANTREVIVE_g=    
-H5E_CANTSHRINK_g=
+/* Parallel MPI errors */    
+H5E_MPI_g=    
+H5E_MPIERRSTR_g=    
+H5E_CANTRECV_g=
 
 /* Object header related errors */    
 H5E_LINKCOUNT_g=    
@@ -112,8 +163,11 @@ H5E_CANTPACK_g=
 H5E_CANTRESET_g=    
 H5E_CANTRENAME_g=
 
-/* System level errors */    
-H5E_SYSERRSTR_g=
+/* Group related errors */    
+H5E_CANTOPENOBJ_g=    
+H5E_CANTCLOSEOBJ_g=    
+H5E_COMPLEN_g=    
+H5E_PATH_g=
 
 /* I/O pipeline errors */    
 H5E_NOFILTER_g=    
@@ -123,40 +177,10 @@ H5E_SETLOCAL_g=
 H5E_NOENCODER_g=    
 H5E_CANTFILTER_g=
 
-/* Group related errors */    
-H5E_CANTOPENOBJ_g=    
-H5E_CANTCLOSEOBJ_g=    
-H5E_COMPLEN_g=    
-H5E_PATH_g=
-
-/* No error */    
-H5E_NONE_MINOR_g=
-
-/* Plugin errors */    
-H5E_OPENERROR_g=
-
-/* File accessibilty errors */    
-H5E_FILEEXISTS_g=    
-H5E_FILEOPEN_g=    
-H5E_CANTCREATE_g=    
-H5E_CANTOPENFILE_g=    
-H5E_CANTCLOSEFILE_g=    
-H5E_NOTHDF5_g=    
-H5E_BADFILE_g=    
-H5E_TRUNCATED_g=    
-H5E_MOUNT_g=
-
-/* Object atom related errors */    
-H5E_BADATOM_g=    
-H5E_BADGROUP_g=    
-H5E_CANTREGISTER_g=    
-H5E_CANTINC_g=    
-H5E_CANTDEC_g=    
-H5E_NOIDS_g=
-
 /* Cache related errors */    
 H5E_CANTFLUSH_g=    
 H5E_CANTSERIALIZE_g=    
+H5E_CANTTAG_g=    
 H5E_CANTLOAD_g=    
 H5E_PROTECT_g=    
 H5E_NOTCACHED_g=    
@@ -169,34 +193,13 @@ H5E_CANTUNPIN_g=
 H5E_CANTMARKDIRTY_g=    
 H5E_CANTDIRTY_g=    
 H5E_CANTEXPUNGE_g=    
-H5E_CANTRESIZE_g=
-
-/* Link related errors */    
-H5E_TRAVERSE_g=    
-H5E_NLINKS_g=    
-H5E_NOTREGISTERED_g=    
-H5E_CANTMOVE_g=    
-H5E_CANTSORT_g=
-
-/* Parallel MPI errors */    
-H5E_MPI_g=    
-H5E_MPIERRSTR_g=    
-H5E_CANTRECV_g=
-
-/* Dataspace errors */    
-H5E_CANTCLIP_g=    
-H5E_CANTCOUNT_g=    
-H5E_CANTSELECT_g=    
-H5E_CANTNEXT_g=    
-H5E_BADSELECT_g=    
-H5E_CANTCOMPARE_g=
-
-/* Argument errors */    
-H5E_UNINITIALIZED_g=    
-H5E_UNSUPPORTED_g=    
-H5E_BADTYPE_g=    
-H5E_BADRANGE_g=    
-H5E_BADVALUE_g=
+H5E_CANTRESIZE_g=    
+H5E_CANTDEPEND_g=    
+H5E_CANTUNDEPEND_g=    
+H5E_CANTNOTIFY_g=    
+H5E_LOGFAIL_g=    
+H5E_CANTCORK_g=    
+H5E_CANTUNCORK_g=
 
 /* B-tree related errors */    
 H5E_NOTFOUND_g=    
@@ -211,8 +214,15 @@ H5E_CANTLIST_g=
 H5E_CANTMODIFY_g=    
 H5E_CANTREMOVE_g=
 
-/* Datatype conversion errors */    
-H5E_CANTCONVERT_g=    
-H5E_BADSIZE_g= (-1);
+/* Function entry/exit interface errors */    
+H5E_CANTINIT_g=    
+H5E_ALREADYINIT_g=    
+H5E_CANTRELEASE_g=
+
+/* Plugin errors */    
+H5E_OPENERROR_g=
+
+/* No error */    
+H5E_NONE_MINOR_g= (-1);
 
 #endif /* H5Eterm_H */
diff --git a/src/H5F.c b/src/H5F.c
index 02526ad..948eb7a 100644
--- a/src/H5F.c
+++ b/src/H5F.c
@@ -17,10 +17,7 @@
 /* Module Setup */
 /****************/
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5F__init_pub_interface
+#include "H5Fmodule.h"          /* This source code file is part of the H5F module */
 
 
 /***********/
@@ -46,7 +43,6 @@
 /* Local Macros */
 /****************/
 
-
 /******************/
 /* Local Typedefs */
 /******************/
@@ -62,11 +58,13 @@
 /********************/
 
 
-
 /*********************/
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 
 /*****************************/
 /* Library Private Variables */
@@ -81,7 +79,7 @@
 /* File ID class */
 static const H5I_class_t H5I_FILE_CLS[1] = {{
     H5I_FILE,			/* ID class value */
-    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* Class flags */
     0,				/* # of reserved IDs for class */
     (H5I_free_t)H5F_close	/* Callback routine for closing objects of this class */
 }};
@@ -89,21 +87,21 @@ static const H5I_class_t H5I_FILE_CLS[1] = {{
 

 /*--------------------------------------------------------------------------
 NAME
-   H5F__init_pub_interface -- Initialize interface-specific information
+   H5F__init_package -- Initialize interface-specific information
 USAGE
-    herr_t H5F__init_pub_interface()
+    herr_t H5F__init_package()
 RETURNS
     Non-negative on success/Negative on failure
 DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5F_init() currently).
+    Initializes any interface-specific data or routines.
 
 --------------------------------------------------------------------------*/
-static herr_t
-H5F__init_pub_interface(void)
+herr_t
+H5F__init_package(void)
 {
-    herr_t          ret_value                = SUCCEED;   /* Return value */
-    FUNC_ENTER_STATIC
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_PACKAGE
 
     /*
      * Initialize the atom group for the file IDs.
@@ -111,40 +109,13 @@ H5F__init_pub_interface(void)
     if(H5I_register_type(H5I_FILE_CLS) < 0)
         HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to initialize interface")
 
-    ret_value = H5F_init();
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5F__init_pub_interface() */
+} /* H5F__init_package() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5F_init
- *
- * Purpose:	Initialize the interface from some other layer.
- *
- * Return:	Success:	non-negative
- *		Failure:	negative
- *
- * Programmer:	Robb Matzke
- *              Wednesday, December 16, 1998
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5F_init(void)
-{
-    herr_t ret_value = SUCCEED;   /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-    /* FUNC_ENTER() does all the work */
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5F_init() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5F_term_interface
+ * Function:	H5F_term_package
  *
  * Purpose:	Terminate this interface: free all memory and reset global
  *		variables to their initial values.  Release all ID groups
@@ -162,13 +133,13 @@ done:
  *-------------------------------------------------------------------------
  */
 int
-H5F_term_interface(void)
+H5F_term_package(void)
 {
     int	n = 0;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    if(H5_interface_initialize_g) {
+    if(H5_PKG_INIT_VAR) {
 	if(H5I_nmembers(H5I_FILE) > 0) {
             (void)H5I_clear_type(H5I_FILE, FALSE, FALSE);
             n++; /*H5I*/
@@ -178,16 +149,16 @@ H5F_term_interface(void)
             H5F_sfile_assert_num(0);
 
             /* Destroy the file object id group */
-	    (void)H5I_dec_type_ref(H5I_FILE);
-            n++; /*H5I*/
+	    n += (H5I_dec_type_ref(H5I_FILE) > 0);
 
 	    /* Mark closed */
-	    H5_interface_initialize_g = 0;
+            if(0 == n)
+                H5_PKG_INIT_VAR = FALSE;
 	} /* end else */
     } /* end if */
 
     FUNC_LEAVE_NOAPI(n)
-} /* end H5F_term_interface() */
+} /* end H5F_term_package() */
 
 

 /*-------------------------------------------------------------------------
@@ -484,10 +455,10 @@ H5Fcreate(const char *filename, unsigned flags, hid_t fcpl_id, hid_t fapl_id)
     if(!filename || !*filename)
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file name")
     /* In this routine, we only accept the following flags:
-     *          H5F_ACC_EXCL and H5F_ACC_TRUNC
+     *          H5F_ACC_EXCL, H5F_ACC_TRUNC and H5F_ACC_SWMR_WRITE
      */
-    if(flags & ~(H5F_ACC_EXCL | H5F_ACC_TRUNC))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid flags")
+    if(flags & ~(H5F_ACC_EXCL | H5F_ACC_TRUNC | H5F_ACC_SWMR_WRITE))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid flags")
     /* The H5F_ACC_EXCL and H5F_ACC_TRUNC flags are mutually exclusive */
     if((flags & H5F_ACC_EXCL) && (flags & H5F_ACC_TRUNC))
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "mutually exclusive flags for file creation")
@@ -593,6 +564,12 @@ H5Fopen(const char *filename, unsigned flags, hid_t fapl_id)
     if((flags & ~H5F_ACC_PUBLIC_FLAGS) ||
             (flags & H5F_ACC_TRUNC) || (flags & H5F_ACC_EXCL))
 	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file open flags")
+    /* Asking for SWMR write access on a read-only file is invalid */
+    if((flags & H5F_ACC_SWMR_WRITE) && 0 == (flags & H5F_ACC_RDWR))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "SWMR write access on a file open for read-only access is not allowed")
+    /* Asking for SWMR read access on a non-read-only file is invalid */
+    if((flags & H5F_ACC_SWMR_READ) && (flags & H5F_ACC_RDWR))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "SWMR read access on a file open for read-write access is not allowed")
     if(H5P_DEFAULT == fapl_id)
         fapl_id = H5P_FILE_ACCESS_DEFAULT;
     else
@@ -782,9 +759,10 @@ H5Fclose(hid_t file_id)
     if((f->shared->nrefs > 1) && (H5F_INTENT(f) & H5F_ACC_RDWR)) {
         if((nref = H5I_get_ref(file_id, FALSE)) < 0)
             HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, FAIL, "can't get ID ref count")
-        if(nref == 1)
+        if(nref == 1) {
             if(H5F_flush(f, H5AC_dxpl_id, FALSE) < 0)
                 HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush cache")
+	}
     } /* end if */
 
     /*
@@ -891,10 +869,20 @@ H5Fget_intent(hid_t file_id, unsigned *intent_flags)
          * Simplify things for them so that they only get either H5F_ACC_RDWR
          * or H5F_ACC_RDONLY.
          */
-        if(H5F_INTENT(file) & H5F_ACC_RDWR)
+        if(H5F_INTENT(file) & H5F_ACC_RDWR) {
             *intent_flags = H5F_ACC_RDWR;
-        else
+
+            /* Check for SWMR write access on the file */
+            if(H5F_INTENT(file) & H5F_ACC_SWMR_WRITE)
+                *intent_flags |= H5F_ACC_SWMR_WRITE;
+        } /* end if */
+        else {
             *intent_flags = H5F_ACC_RDONLY;
+
+            /* Check for SWMR read access on the file */
+            if(H5F_INTENT(file) & H5F_ACC_SWMR_READ)
+                *intent_flags |= H5F_ACC_SWMR_READ;
+        } /* end else */
     } /* end if */
 
 done:
@@ -962,6 +950,8 @@ H5Fget_filesize(hid_t file_id, hsize_t *size)
 {
     H5F_t       *file;                  /* File object for file ID */
     haddr_t     eof;                    /* End of file address */
+    haddr_t     eoa;                    /* End of allocation address */
+    haddr_t     max_eof_eoa;            /* Maximum of the EOA & EOF */
     haddr_t     base_addr;              /* Base address for the file */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
@@ -973,12 +963,15 @@ H5Fget_filesize(hid_t file_id, hsize_t *size)
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
 
     /* Go get the actual file size */
-    if(HADDR_UNDEF == (eof = H5FD_get_eof(file->shared->lf)))
-        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get file size")
+    eof = H5FD_get_eof(file->shared->lf, H5FD_MEM_DEFAULT);
+    eoa = H5FD_get_eoa(file->shared->lf, H5FD_MEM_DEFAULT);
+    max_eof_eoa = MAX(eof, eoa);
+    if(HADDR_UNDEF == max_eof_eoa)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "file get eof/eoa requests failed")
     base_addr = H5FD_get_base_addr(file->shared->lf);
 
     if(size)
-        *size = (hsize_t)(eof + base_addr);     /* Convert relative base address for file to absolute address */
+        *size = (hsize_t)(max_eof_eoa + base_addr);     /* Convert relative base address for file to absolute address */
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -1322,11 +1315,13 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5Fget_info
- *		1. Get storage size for superblock extension if there is one
+ * Function:    H5Fget_info2
+ *
+ * Purpose:     Gets general information about the file, including:
+ *		1. Get storage size for superblock extension if there is one.
  *              2. Get the amount of btree and heap storage for entries
  *                 in the SOHM table if there is one.
- *		Consider success when there is no superblock extension and/or SOHM table
+ *		3. The amount of free space tracked in the file.
  *
  * Return:      Success:        non-negative on success
  *              Failure:        Negative
@@ -1337,7 +1332,7 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5Fget_info(hid_t obj_id, H5F_info_t *finfo)
+H5Fget_info2(hid_t obj_id, H5F_info2_t *finfo)
 {
     H5F_t *f;                           /* Top file in mount hierarchy */
     herr_t ret_value = SUCCEED;         /* Return value */
@@ -1368,20 +1363,162 @@ H5Fget_info(hid_t obj_id, H5F_info_t *finfo)
     HDassert(f->shared);
 
     /* Reset file info struct */
-    HDmemset(finfo, 0, sizeof(H5F_info_t));
+    HDmemset(finfo, 0, sizeof(*finfo));
+
+    /* Get the size of the superblock and any superblock extensions */
+    if(H5F__super_size(f, H5AC_ind_dxpl_id, &finfo->super.super_size, &finfo->super.super_ext_size) < 0)
+	HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve superblock sizes")
 
-    /* Check for superblock extension info */
-    if(H5F_super_size(f, H5AC_ind_dxpl_id, NULL, &finfo->super_ext_size) < 0)
-        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve superblock extension size")
+    /* Get the size of any persistent free space */
+    if(H5MF_get_freespace(f, H5AC_ind_dxpl_id, &finfo->free.tot_space, &finfo->free.meta_size) < 0)
+	HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve free space information")
 
     /* Check for SOHM info */
     if(H5F_addr_defined(f->shared->sohm_addr))
-        if(H5SM_ih_size(f, H5AC_ind_dxpl_id, finfo) < 0)
-            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve SOHM btree & heap storage info")
+        if(H5SM_ih_size(f, H5AC_ind_dxpl_id, &finfo->sohm.hdr_size, &finfo->sohm.msgs_info) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve SOHM index & heap storage info")
+
+    /* Set version # fields */
+    finfo->super.version = f->shared->sblock->super_vers;
+    finfo->sohm.version = f->shared->sohm_vers;
+    finfo->free.version = HDF5_FREESPACE_VERSION;
 
 done:
     FUNC_LEAVE_API(ret_value)
-} /* end H5Fget_info() */
+} /* end H5Fget_info2() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Fget_metadata_read_retry_info
+ *
+ * Purpose:     To retrieve the collection of read retries for metadata items with checksum.
+ *
+ * Return:      Success:        non-negative on success
+ *              Failure:        Negative
+ *
+ * Programmer:  Vailin Choi; October 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fget_metadata_read_retry_info(hid_t file_id, H5F_retry_info_t *info)
+{
+    H5F_t    	*file;           	/* File object for file ID */
+    unsigned 	i, j;			/* Local index variable */
+    size_t	tot_size;		/* Size of each retries[i] */
+    herr_t   	ret_value = SUCCEED;   	/* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*x", file_id, info);
+
+    /* Check args */
+    if(!info)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no info struct")
+
+    /* Get the file pointer */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
+
+    /* Copy the # of bins for "retries" array */
+    info->nbins = file->shared->retries_nbins;
+
+    /* Initialize the array of "retries" */
+    HDmemset(info->retries, 0, sizeof(info->retries));
+
+    /* Return if there are no bins -- no retries */
+    if(!info->nbins) 
+	HGOTO_DONE(SUCCEED);
+
+    /* Calculate size for each retries[i] */
+    tot_size = info->nbins * sizeof(uint32_t);
+
+    /* Map and copy information to info's retries for metadata items with tracking for read retries */
+    j = 0;
+    for(i = 0; i < H5AC_NTYPES; i++) {
+        switch(i) {
+            case H5AC_OHDR_ID:
+            case H5AC_OHDR_CHK_ID:
+            case H5AC_BT2_HDR_ID:
+            case H5AC_BT2_INT_ID:
+            case H5AC_BT2_LEAF_ID:
+            case H5AC_FHEAP_HDR_ID:
+            case H5AC_FHEAP_DBLOCK_ID:
+            case H5AC_FHEAP_IBLOCK_ID:
+	    case H5AC_FSPACE_HDR_ID:
+	    case H5AC_FSPACE_SINFO_ID:
+	    case H5AC_SOHM_TABLE_ID:
+	    case H5AC_SOHM_LIST_ID:
+            case H5AC_EARRAY_HDR_ID:
+            case H5AC_EARRAY_IBLOCK_ID:
+            case H5AC_EARRAY_SBLOCK_ID:
+            case H5AC_EARRAY_DBLOCK_ID:
+            case H5AC_EARRAY_DBLK_PAGE_ID:
+	    case H5AC_FARRAY_HDR_ID:
+	    case H5AC_FARRAY_DBLOCK_ID:
+	    case H5AC_FARRAY_DBLK_PAGE_ID:
+            case H5AC_SUPERBLOCK_ID:
+                HDassert(j < H5F_NUM_METADATA_READ_RETRY_TYPES);
+                if(file->shared->retries[i] != NULL) {
+		    /* Allocate memory for retries[i] */
+                    if(NULL == (info->retries[j] = (uint32_t *)HDmalloc(tot_size)))
+			HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+		    /* Copy the information */
+                    HDmemcpy(info->retries[j], file->shared->retries[i], tot_size);
+                } /* end if */
+
+                /* Increment location in info->retries[] array */
+                j++;
+                break;
+
+            default:
+                break;
+        } /* end switch */
+    } /* end for */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fget_metadata_read_retry_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Fget_free_sections
+ *
+ * Purpose:     To get free-space section information for free-space manager with
+ *		TYPE that is associated with file FILE_ID.
+ *		If SECT_INFO is null, this routine returns the total # of free-space
+ *		sections.
+ *
+ * Return:      Success:        non-negative, the total # of free space sections
+ *              Failure:        negative
+ *
+ * Programmer:  Vailin Choi; July 1st, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5Fget_free_sections(hid_t file_id, H5F_mem_t type, size_t nsects,
+    H5F_sect_info_t *sect_info/*out*/)
+{
+    H5F_t         *file;        /* Top file in mount hierarchy */
+    ssize_t       ret_value;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("Zs", "iFmzx", file_id, type, nsects, sect_info);
+
+    /* Check args */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID")
+    if(sect_info && nsects == 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "nsects must be > 0")
+
+    /* Go get the free-space section information in the file */
+    if((ret_value = H5MF_get_free_sections(file, H5AC_ind_dxpl_id, type, nsects, sect_info)) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to check free space for file")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fget_free_sections() */
 
 

 /*-------------------------------------------------------------------------
@@ -1419,3 +1556,319 @@ H5Fclear_elink_file_cache(hid_t file_id)
 done:
     FUNC_LEAVE_API(ret_value)
 } /* end H5Fclear_elink_file_cache() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Fstart_swmr_write
+ *
+ * Purpose:	To enable SWMR writing mode for the file
+ *		1) Refresh opened objects: part 1
+ *		2) Flush & reset accumulator
+ *		3) Mark the file in SWMR writing mode
+ *	 	4) Set metadata read attempts and retries info
+ *		5) Disable accumulator
+ *		6) Evict all cache entries except the superblock
+ *		7) Refresh opened objects (part 2)
+ *		8) Unlock the file
+ *
+ *		Pre-conditions:
+ *		1) The file being opened has v3 superblock
+ *		2) The file is opened with H5F_ACC_RDWR
+ *		3) The file is not already marked for SWMR writing
+ *		4) Current implementaion for opened objects:
+ *		   --only allow datasets and groups without attributes
+ *		   --disallow named datatype with/without attributes
+ *		   --disallow opened attributes attached to objects
+ *		NOTE: Currently, only opened groups and datasets are allowed
+ *	      	when enabling SWMR via H5Fstart_swmr_write().
+ *	      	Will later implement a different approach--
+ *	      	set up flush dependency/proxy even for file opened without
+ *	      	SWMR to resolve issues with opened objects.
+ *	
+ * Return:	Non-negative on success/negative on failure
+ *
+ * Programmer:	
+ *	Vailin Choi; Feb 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fstart_swmr_write(hid_t file_id)
+{
+    H5F_t *file = NULL;         /* File info */
+    size_t grp_dset_count=0; 	/* # of open objects: groups & datasets */
+    size_t nt_attr_count=0; 	/* # of opened named datatypes  + opened attributes */
+    hid_t *obj_ids=NULL;	/* List of ids */
+    H5G_loc_t *obj_glocs=NULL;	/* Group location of the object */
+    H5O_loc_t *obj_olocs=NULL;	/* Object location */
+    H5G_name_t *obj_paths=NULL;	/* Group hierarchy path */
+    size_t u;               	/* Local index variable */
+    hbool_t setup = FALSE;	/* Boolean flag to indicate whether SWMR setting is enabled */
+    H5F_io_info_t fio_info;    	/* I/O info for operation */
+    herr_t ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", file_id);
+
+    /* check args */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
+
+    /* Should have write permission */
+    if((H5F_INTENT(file) & H5F_ACC_RDWR) == 0)
+	HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "no write intent on file")
+
+    if(file->shared->sblock->super_vers < HDF5_SUPERBLOCK_VERSION_3)
+	HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "file superblock version should be at least 3")
+    HDassert(file->shared->latest_flags == H5F_LATEST_ALL_FLAGS);
+
+    /* Should not be marked for SWMR writing mode already */
+    if(file->shared->sblock->status_flags & H5F_SUPER_SWMR_WRITE_ACCESS)
+	HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "file already in SWMR writing mode")
+
+    HDassert(file->shared->sblock->status_flags & H5F_SUPER_WRITE_ACCESS);
+
+    /* Flush data buffers */
+    if(H5F_flush(file, H5AC_dxpl_id, FALSE) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush file's cached information")
+
+    /* Get the # of opened named datatypes and attributes */
+    if(H5F_get_obj_count(file, H5F_OBJ_DATATYPE|H5F_OBJ_ATTR, FALSE, &nt_attr_count) < 0)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_BADITER, FAIL, "H5F_get_obj_count failed")
+    if(nt_attr_count)
+	HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "named datatypes and/or attributes opened in the file")
+
+    /* Get the # of opened datasets and groups */
+    if(H5F_get_obj_count(file, H5F_OBJ_GROUP|H5F_OBJ_DATASET, FALSE, &grp_dset_count) < 0)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_BADITER, FAIL, "H5F_get_obj_count failed")
+
+    if(grp_dset_count) {
+        /* Allocate space for group and object locations */
+	if((obj_ids = (hid_t *) H5MM_malloc(grp_dset_count * sizeof(hid_t))) == NULL)
+	    HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, FAIL, "can't allocate buffer for hid_t")
+	if((obj_glocs = (H5G_loc_t *) H5MM_malloc(grp_dset_count * sizeof(H5G_loc_t))) == NULL)
+	    HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, FAIL, "can't allocate buffer for H5G_loc_t")
+	if((obj_olocs = (H5O_loc_t *) H5MM_malloc(grp_dset_count * sizeof(H5O_loc_t))) == NULL)
+	    HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, FAIL, "can't allocate buffer for H5O_loc_t")
+	if((obj_paths = (H5G_name_t *) H5MM_malloc(grp_dset_count * sizeof(H5G_name_t))) == NULL)
+	    HGOTO_ERROR(H5E_FILE, H5E_NOSPACE, FAIL, "can't allocate buffer for H5G_name_t")
+
+        /* Get the list of opened object ids (groups & datasets) */
+	if(H5F_get_obj_ids(file, H5F_OBJ_GROUP|H5F_OBJ_DATASET, grp_dset_count, obj_ids, FALSE, &grp_dset_count) < 0)
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "H5F_get_obj_ids failed")
+
+        /* Refresh opened objects (groups, datasets) in the file */
+        for(u = 0; u < grp_dset_count; u++) {
+            H5O_loc_t *oloc;            /* object location */
+	    H5G_loc_t tmp_loc;
+            /* Set up the id's group location */
+            obj_glocs[u].oloc = &obj_olocs[u];
+            obj_glocs[u].path = &obj_paths[u];
+            H5G_loc_reset(&obj_glocs[u]);
+
+            /* get the id's object location */
+            if((oloc = H5O_get_loc(obj_ids[u])) == NULL)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an object")
+
+	    /* Make deep local copy of object's location information */
+	    H5G_loc(obj_ids[u], &tmp_loc);
+	    H5G_loc_copy(&obj_glocs[u], &tmp_loc, H5_COPY_DEEP);
+
+	    /* Close the object */
+	    if(H5I_dec_ref(obj_ids[u]) < 0)
+		HGOTO_ERROR(H5E_ATOM, H5E_CANTCLOSEOBJ, FAIL, "decrementing object ID failed")
+        } /* end for */
+    } /* end if */
+
+    /* Set up I/O info for operation */
+    fio_info.f = file;
+    if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(H5AC_dxpl_id)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+
+    /* Flush and reset the accumulator */
+    if(H5F__accum_reset(&fio_info, TRUE) < 0)
+	HGOTO_ERROR(H5E_IO, H5E_CANTRESET, FAIL, "can't reset accumulator")
+
+    /* Turn on SWMR write in shared file open flags */
+    file->shared->flags |= H5F_ACC_SWMR_WRITE;
+
+    /* Mark the file in SWMR writing mode */
+    file->shared->sblock->status_flags |= H5F_SUPER_SWMR_WRITE_ACCESS;
+
+    /* Set up metadata read attempts */
+    file->shared->read_attempts = H5F_SWMR_METADATA_READ_ATTEMPTS;
+
+    /* Initialize "retries" and "retries_nbins" */
+    if(H5F_set_retries(file) < 0)
+	HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "can't set retries and retries_nbins")
+
+    /* Turn off usage of accumulator */
+    file->shared->feature_flags &= ~(unsigned)H5FD_FEAT_ACCUMULATE_METADATA;
+    if(H5FD_set_feature_flags(file->shared->lf, file->shared->feature_flags) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "can't set feature_flags in VFD")
+
+    setup = TRUE;
+
+    /* Mark superblock as dirty */
+    if(H5F_super_dirty(file) < 0)
+	HGOTO_ERROR(H5E_FILE, H5E_CANTMARKDIRTY, FAIL, "unable to mark superblock as dirty")
+
+    /* Flush the superblock */
+    if(H5F_flush_tagged_metadata(file, (haddr_t)0, H5AC_dxpl_id) < 0)
+	HDONE_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush superblock")
+
+    /* Evict all flushed entries in the cache except the pinned superblock */
+    if(H5F_evict_cache_entries(file, H5AC_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to evict file's cached information")
+
+    /* Refresh (reopen) the objects (groups & datasets) in the file */
+    for(u = 0; u < grp_dset_count; u++) {
+	if(H5O_refresh_metadata_reopen(obj_ids[u], &obj_glocs[u], H5AC_dxpl_id, TRUE) < 0)
+	    HGOTO_ERROR(H5E_ATOM, H5E_CLOSEERROR, FAIL, "can't refresh-close object")
+    }
+
+    /* Unlock the file */
+    if(H5FD_unlock(file->shared->lf) < 0)
+	HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to unlock the file")
+done:
+    if(ret_value < 0 && setup) {
+	HDassert(file);
+
+	/* Re-enable accumulator */
+	file->shared->feature_flags |= (unsigned)H5FD_FEAT_ACCUMULATE_METADATA;
+	if(H5FD_set_feature_flags(file->shared->lf, file->shared->feature_flags) < 0)
+	    HDONE_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "can't set feature_flags in VFD")
+
+	/* Reset the # of read attempts */
+	file->shared->read_attempts = H5F_METADATA_READ_ATTEMPTS;
+	if(H5F_set_retries(file) < 0)
+	    HDONE_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "can't set retries and retries_nbins")
+
+	/* Un-set H5F_ACC_SWMR_WRITE in shared open flags */
+	file->shared->flags &= ~H5F_ACC_SWMR_WRITE;
+
+	/* Unmark the file: not in SWMR writing mode */
+	file->shared->sblock->status_flags &= ~(uint8_t)H5F_SUPER_SWMR_WRITE_ACCESS;
+
+	/* Mark superblock as dirty */
+	if(H5F_super_dirty(file) < 0)
+	    HDONE_ERROR(H5E_FILE, H5E_CANTMARKDIRTY, FAIL, "unable to mark superblock as dirty")
+
+	/* Flush the superblock */
+	if(H5F_flush_tagged_metadata(file, (haddr_t)0, H5AC_dxpl_id) < 0)
+	    HDONE_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush superblock")
+    }
+    /* Free memory */
+    if(obj_ids)
+	H5MM_xfree(obj_ids);
+    if(obj_glocs)
+	H5MM_xfree(obj_glocs);
+    if(obj_olocs)
+	H5MM_xfree(obj_olocs);
+    if(obj_paths)
+	H5MM_xfree(obj_paths);
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fstart_swmr_write() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Fstart_mdc_logging
+ *
+ * Purpose:     Start metadata cache logging operations for a file.
+ *                  - Logging must have been set up via the fapl.
+ *
+ * Return:      Non-negative on success/Negative on errors
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fstart_mdc_logging(hid_t file_id)
+{
+    H5F_t *file;                /* File info */
+    herr_t ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", file_id);
+
+    /* Sanity check */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "hid_t identifier is not a file ID")
+
+    /* Call mdc logging function */
+    if(H5C_start_logging(file->shared->cache) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to start mdc logging")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+
+} /* H5Fstart_mdc_logging() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Fstop_mdc_logging
+ *
+ * Purpose:     Stop metadata cache logging operations for a file.
+ *                  - Does not close the log file.
+ *                  - Logging must have been set up via the fapl.
+ *
+ * Return:      Non-negative on success/Negative on errors
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fstop_mdc_logging(hid_t file_id)
+{
+    H5F_t *file;                /* File info */
+    herr_t ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", file_id);
+
+    /* Sanity check */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "hid_t identifier is not a file ID")
+
+    /* Call mdc logging function */
+    if(H5C_stop_logging(file->shared->cache) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to stop mdc logging")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+
+} /* H5Fstop_mdc_logging() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Fget_mdc_logging_status
+ *
+ * Purpose:     Get the logging flags. is_enabled determines if logging was
+ *              set up via the fapl. is_currently_logging determines if
+ *              log messages are being recorded at this time.
+ *
+ * Return:      Non-negative on success/Negative on errors
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fget_mdc_logging_status(hid_t file_id, hbool_t *is_enabled,
+                          hbool_t *is_currently_logging)
+{
+    H5F_t *file;                /* File info */
+    herr_t ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*b*b", file_id, is_enabled, is_currently_logging);
+
+    /* Sanity check */
+    if(NULL == (file = (H5F_t *)H5I_object_verify(file_id, H5I_FILE)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "hid_t identifier is not a file ID")
+
+    /* Call mdc logging function */
+    if(H5C_get_logging_status(file->shared->cache, is_enabled, is_currently_logging) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_LOGFAIL, FAIL, "unable to get logging status")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+
+} /* H5Fstop_mdc_logging() */
diff --git a/src/H5FA.c b/src/H5FA.c
new file mode 100644
index 0000000..a1b4fbc
--- /dev/null
+++ b/src/H5FA.c
@@ -0,0 +1,852 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5FA.c
+ *              April 2009
+ *              Vailin Choi <vchoi at hdfgroup.org>
+ *
+ * Purpose:     Implements a Fixed Array for storing elements
+ *              of datasets with fixed dimensions.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5FAmodule.h"         /* This source code file is part of the H5FA module */
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FApkg.h"		/* Fixed Arrays				*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5VMprivate.h"         /* Vector functions			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
+/* Fixed array client ID to class mapping */
+
+/* Remember to add client ID to H5FA_cls_id_t in H5FAprivate.h when adding a new
+ * client class..
+ */
+const H5FA_class_t *const H5FA_client_class_g[] = {
+    H5FA_CLS_CHUNK,             /* 0 - H5FA_CLS_CHUNK_ID                */
+    H5FA_CLS_FILT_CHUNK,        /* 1 - H5FA_CLS_FILT_CHUNK_ID           */
+    H5FA_CLS_TEST,              /* ? - H5FA_CLS_TEST_ID                 */
+};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5FA_t struct */
+H5FL_DEFINE_STATIC(H5FA_t);
+
+/* Declare a PQ free list to manage the element */
+H5FL_BLK_DEFINE(fa_native_elmt);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA_create
+ *
+ * Purpose:     Creates a new fixed array (header) in the file.
+ *
+ * Return:      Pointer to fixed array wrapper on success
+ *              NULL on failure
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERR,
+H5FA_t *, NULL, NULL,
+H5FA_create(H5F_t *f, hid_t dxpl_id, const H5FA_create_t *cparam, void *ctx_udata))
+
+    /* Local variables */
+    H5FA_t *fa = NULL;          /* Pointer to new fixed array */
+    H5FA_hdr_t *hdr = NULL;     /* The fixed array header information */
+    haddr_t fa_addr;            /* Fixed Array header address */
+
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* H5FA_DEBUG */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(cparam);
+
+    /* H5FA interface sanity check */
+    HDcompile_assert(H5FA_NUM_CLS_ID == NELMTS(H5FA_client_class_g));
+
+    /* Create fixed array header */
+    if(HADDR_UNDEF == (fa_addr = H5FA__hdr_create(f, dxpl_id, cparam, ctx_udata)))
+        H5E_THROW(H5E_CANTINIT, "can't create fixed array header")
+
+    /* Allocate fixed array wrapper */
+    if(NULL == (fa = H5FL_MALLOC(H5FA_t)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for fixed array info")
+
+    /* Lock the array header into memory */
+    if(NULL == (hdr = H5FA__hdr_protect(f, dxpl_id, fa_addr, ctx_udata, H5AC__NO_FLAGS_SET)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to load fixed array header")
+
+    /* Point fixed array wrapper at header and bump it's ref count */
+    fa->hdr = hdr;
+    if(H5FA__hdr_incr(fa->hdr) < 0)
+        H5E_THROW(H5E_CANTINC, "can't increment reference count on shared array header")
+
+    /* Increment # of files using this array header */
+    if(H5FA__hdr_fuse_incr(fa->hdr) < 0)
+        H5E_THROW(H5E_CANTINC, "can't increment file reference count on shared array header")
+
+    /* Set file pointer for this array open context */
+    fa->f = f;
+
+    /* Set the return value */
+    ret_value = fa;
+
+CATCH
+
+    if(hdr && H5FA__hdr_unprotect(hdr, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release fixed array header")
+    if(!ret_value)
+        if(fa && H5FA_close(fa, dxpl_id) < 0)
+            H5E_THROW(H5E_CLOSEERROR, "unable to close fixed array")
+
+END_FUNC(PRIV)  /* end H5FA_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA_open
+ *
+ * Purpose:     Opens an existing fixed array in the file.
+ *
+ * Return:      Pointer to array wrapper on success
+ *              NULL on failure
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERR,
+H5FA_t *, NULL, NULL,
+H5FA_open(H5F_t *f, hid_t dxpl_id, haddr_t fa_addr, void *ctx_udata))
+
+    /* Local variables */
+    H5FA_t *fa = NULL;          /* Pointer to new fixed array wrapper */
+    H5FA_hdr_t *hdr = NULL;     /* The fixed array header information */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(fa_addr));
+
+    /* Load the array header into memory */
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: fa_addr = %a\n", FUNC, fa_addr);
+#endif /* H5FA_DEBUG */
+    if(NULL == (hdr = H5FA__hdr_protect(f, dxpl_id, fa_addr, ctx_udata, H5AC__READ_ONLY_FLAG)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to load fixed array header, address = %llu", (unsigned long long)fa_addr)
+
+    /* Check for pending array deletion */
+    if(hdr->pending_delete)
+        H5E_THROW(H5E_CANTOPENOBJ, "can't open fixed array pending deletion")
+
+    /* Create fixed array info */
+    if(NULL == (fa = H5FL_MALLOC(H5FA_t)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for fixed array info")
+
+    /* Point fixed array wrapper at header */
+    fa->hdr = hdr;
+    if(H5FA__hdr_incr(fa->hdr) < 0)
+        H5E_THROW(H5E_CANTINC, "can't increment reference count on shared array header")
+
+    /* Increment # of files using this array header */
+    if(H5FA__hdr_fuse_incr(fa->hdr) < 0)
+        H5E_THROW(H5E_CANTINC, "can't increment file reference count on shared array header")
+
+    /* Set file pointer for this array open context */
+    fa->f = f;
+
+    /* Set the return value */
+    ret_value = fa;
+
+CATCH
+
+    if(hdr && H5FA__hdr_unprotect(hdr, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release fixed array header")
+    if(!ret_value)
+        if(fa && H5FA_close(fa, dxpl_id) < 0)
+            H5E_THROW(H5E_CLOSEERROR, "unable to close fixed array")
+
+END_FUNC(PRIV)  /* end H5FA_open() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA_get_nelmts
+ *
+ * Purpose:     Query the current number of elements in array
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, NOERR,
+herr_t, SUCCEED, -,
+H5FA_get_nelmts(const H5FA_t *fa, hsize_t *nelmts))
+
+    /* Local variables */
+
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* H5FA_DEBUG */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fa);
+    HDassert(nelmts);
+
+    /* Retrieve the current number of elements in the fixed array */
+    *nelmts = fa->hdr->stats.nelmts;
+
+END_FUNC(PRIV)  /* end H5FA_get_nelmts() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA_get_addr
+ *
+ * Purpose:     Query the address of the array
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, NOERR,
+herr_t, SUCCEED, -,
+H5FA_get_addr(const H5FA_t *fa, haddr_t *addr))
+
+    /* Local variables */
+
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* H5FA_DEBUG */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fa);
+    HDassert(fa->hdr);
+    HDassert(addr);
+
+    /* Retrieve the address of the fixed array's header */
+    *addr = fa->hdr->addr;
+
+END_FUNC(PRIV)  /* end H5FA_get_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA_set
+ *
+ * Purpose:     Set an element of a fixed array
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA_set(const H5FA_t *fa, hid_t dxpl_id, hsize_t idx, const void *elmt))
+
+    /* Local variables */
+    H5FA_hdr_t *hdr = fa->hdr;          /* Header for fixed array */
+    H5FA_dblock_t *dblock = NULL;       /* Pointer to fixed array Data block */
+    H5FA_dblk_page_t *dblk_page = NULL; /* Pointer to fixed array Data block page */
+    unsigned dblock_cache_flags = H5AC__NO_FLAGS_SET;    /* Flags to unprotecting fixed array Data block */
+    unsigned dblk_page_cache_flags = H5AC__NO_FLAGS_SET; /* Flags to unprotecting FIxed Array Data block page */
+    hbool_t hdr_dirty = FALSE;          /* Whether header information changed */
+
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: Called\n", FUNC);
+HDfprintf(stderr, "%s: Index %Hu\n", FUNC, idx);
+#endif /* H5FA_DEBUG */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fa);
+    HDassert(fa->hdr);
+
+    /* Set the shared array header's file context for this operation */
+    hdr->f = fa->f;
+
+    /* Check if we need to create the fixed array data block */
+    if(!H5F_addr_defined(hdr->dblk_addr)) {
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: fixed array data block address not defined!\n", FUNC, idx);
+#endif /* H5FA_DEBUG */
+        /* Create the data block */
+        hdr->dblk_addr = H5FA__dblock_create(hdr, dxpl_id, &hdr_dirty);
+        if(!H5F_addr_defined(hdr->dblk_addr))
+            H5E_THROW(H5E_CANTCREATE, "unable to create fixed array data block")
+    } /* end if */
+
+    HDassert(idx < hdr->cparam.nelmts);
+
+    /* Protect data block */
+    if(NULL == (dblock = H5FA__dblock_protect(hdr, dxpl_id, hdr->dblk_addr, H5AC__NO_FLAGS_SET)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect fixed array data block, address = %llu", (unsigned long long)hdr->dblk_addr)
+
+    /* Check for paging data block */
+    if(!dblock->npages) {
+        /* Set element in data block */
+        HDmemcpy(((uint8_t *)dblock->elmts) + (hdr->cparam.cls->nat_elmt_size * idx), elmt, hdr->cparam.cls->nat_elmt_size);
+        dblock_cache_flags |= H5AC__DIRTIED_FLAG;
+    } /* end if */
+    else { /* paging */
+        size_t  page_idx;      		/* Index of page within data block */
+        size_t  dblk_page_nelmts;      	/* # of elements in a data block page */
+        size_t  elmt_idx;		/* Element index within the page */
+        haddr_t dblk_page_addr;		/* Address of data block page */
+
+        /* Compute the page & element index */
+        page_idx = (size_t)(idx / dblock->dblk_page_nelmts);
+        elmt_idx = (size_t)(idx % dblock->dblk_page_nelmts);
+
+        /* Get the address of the data block page */
+        dblk_page_addr = dblock->addr + H5FA_DBLOCK_PREFIX_SIZE(dblock) +
+                        ((hsize_t)page_idx * dblock->dblk_page_size);
+
+        /* Check for using last page, to set the number of elements on the page */
+        if((page_idx + 1) == dblock->npages)
+            dblk_page_nelmts = dblock->last_page_nelmts;
+        else
+            dblk_page_nelmts = dblock->dblk_page_nelmts;
+
+        /* Check if the page has been created yet */
+        if(!H5VM_bit_get(dblock->dblk_page_init, page_idx)) {
+            /* Create the data block page */
+            if(H5FA__dblk_page_create(hdr, dxpl_id, dblk_page_addr, dblk_page_nelmts) < 0)
+                H5E_THROW(H5E_CANTCREATE, "unable to create data block page")
+
+	    /* Mark data block page as initialized in data block */
+	    H5VM_bit_set(dblock->dblk_page_init, page_idx, TRUE);
+	    dblock_cache_flags |= H5AC__DIRTIED_FLAG;
+	} /* end if */
+
+        /* Protect the data block page */
+	if(NULL == (dblk_page = H5FA__dblk_page_protect(hdr, dxpl_id, dblk_page_addr, dblk_page_nelmts, H5AC__NO_FLAGS_SET)))
+	    H5E_THROW(H5E_CANTPROTECT, "unable to protect fixed array data block page, address = %llu", (unsigned long long)dblk_page_addr)
+
+        /* Set the element in the data block page */
+        HDmemcpy(((uint8_t *)dblk_page->elmts) + (hdr->cparam.cls->nat_elmt_size * elmt_idx), elmt, hdr->cparam.cls->nat_elmt_size);
+        dblk_page_cache_flags |= H5AC__DIRTIED_FLAG;
+    } /* end else */
+
+CATCH
+    /* Check for header modified */
+    if(hdr_dirty)
+        if(H5FA__hdr_modified(hdr) < 0)
+            H5E_THROW(H5E_CANTMARKDIRTY, "unable to mark fixed array header as modified")
+
+    /* Release resources */
+    if(dblock && H5FA__dblock_unprotect(dblock, dxpl_id, dblock_cache_flags) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release fixed array data block")
+    if(dblk_page && H5FA__dblk_page_unprotect(dblk_page, dxpl_id, dblk_page_cache_flags) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release fixed array data block page")
+
+END_FUNC(PRIV)  /* end H5FA_set() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA_get
+ *
+ * Purpose:     Get an element of a fixed array
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA_get(const H5FA_t *fa, hid_t dxpl_id, hsize_t idx, void *elmt))
+
+    /* Local variables */
+    H5FA_hdr_t *hdr = fa->hdr;          /* Header for FA */
+    H5FA_dblock_t *dblock = NULL;       /* Pointer to data block for FA */
+    H5FA_dblk_page_t *dblk_page = NULL; /* Pointer to data block page for FA */
+
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: Called\n", FUNC);
+HDfprintf(stderr, "%s: Index %Hu\n", FUNC, idx);
+#endif /* H5FA_DEBUG */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fa);
+    HDassert(fa->hdr);
+
+    /* Set the shared array header's file context for this operation */
+    hdr->f = fa->f;
+
+    /* Check if the fixed array data block has been allocated on disk yet */
+    if(!H5F_addr_defined(hdr->dblk_addr)) {
+        /* Call the class's 'fill' callback */
+        if((hdr->cparam.cls->fill)(elmt, (size_t)1) < 0)
+            H5E_THROW(H5E_CANTSET, "can't set element to class's fill value")
+    } /* end if */
+    else {
+        /* Get the data block */
+        HDassert(H5F_addr_defined(hdr->dblk_addr));
+        if(NULL == (dblock = H5FA__dblock_protect(hdr, dxpl_id, hdr->dblk_addr, H5AC__READ_ONLY_FLAG)))
+            H5E_THROW(H5E_CANTPROTECT, "unable to protect fixed array data block, address = %llu", (unsigned long long)hdr->dblk_addr)
+
+        /* Check for paged data block */
+        if(!dblock->npages)
+            /* Retrieve element from data block */
+            HDmemcpy(elmt, ((uint8_t *)dblock->elmts) + (hdr->cparam.cls->nat_elmt_size * idx), hdr->cparam.cls->nat_elmt_size);
+        else { /* paging */
+            size_t  page_idx;           /* Index of page within data block */
+
+            /* Compute the page index */
+            page_idx = (size_t)(idx / dblock->dblk_page_nelmts);
+
+            /* Check if the page is defined yet */
+            if(!H5VM_bit_get(dblock->dblk_page_init, page_idx)) {
+                /* Call the class's 'fill' callback */
+                if((hdr->cparam.cls->fill)(elmt, (size_t)1) < 0)
+                    H5E_THROW(H5E_CANTSET, "can't set element to class's fill value")
+
+                /* We've retrieved the value, leave now */
+                H5_LEAVE(SUCCEED)
+            } /* end if */
+            else { /* get the page */
+                size_t  dblk_page_nelmts;	/* # of elements in a data block page */
+                size_t  elmt_idx;		/* Element index within the page */
+                haddr_t dblk_page_addr;		/* Address of data block page */
+
+                /* Compute the element index */
+                elmt_idx = (size_t)(idx % dblock->dblk_page_nelmts);
+
+                /* Compute the address of the data block */
+                dblk_page_addr = dblock->addr + H5FA_DBLOCK_PREFIX_SIZE(dblock) + ((hsize_t)page_idx * dblock->dblk_page_size);
+
+                /* Check for using last page, to set the number of elements on the page */
+                if((page_idx + 1) == dblock->npages)
+                    dblk_page_nelmts = dblock->last_page_nelmts;
+                else
+                    dblk_page_nelmts = dblock->dblk_page_nelmts;
+
+                /* Protect the data block page */
+                if(NULL == (dblk_page = H5FA__dblk_page_protect(hdr, dxpl_id, dblk_page_addr, dblk_page_nelmts, H5AC__READ_ONLY_FLAG)))
+                    H5E_THROW(H5E_CANTPROTECT, "unable to protect fixed array data block page, address = %llu", (unsigned long long)dblk_page_addr)
+
+                /* Retrieve element from data block */
+                HDmemcpy(elmt, ((uint8_t *)dblk_page->elmts) + (hdr->cparam.cls->nat_elmt_size * elmt_idx), hdr->cparam.cls->nat_elmt_size);
+            } /* end else */
+        } /* end else */
+    } /* end else */
+
+CATCH
+    if(dblock && H5FA__dblock_unprotect(dblock, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release fixed array data block")
+    if(dblk_page && H5FA__dblk_page_unprotect(dblk_page, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release fixed array data block page")
+
+END_FUNC(PRIV)  /* end H5FA_get() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA_close
+ *
+ * Purpose:     Close a fixed array
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA_close(H5FA_t *fa, hid_t dxpl_id))
+
+    /* Local variables */
+    hbool_t pending_delete = FALSE;     /* Whether the array is pending deletion */
+    haddr_t fa_addr = HADDR_UNDEF;      /* Address of array (for deletion) */
+
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* H5FA_DEBUG */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fa);
+
+    /* Decrement file reference & check if this is the last open fixed array using the shared array header */
+    if(0 == H5FA__hdr_fuse_decr(fa->hdr)) {
+        /* Set the shared array header's file context for this operation */
+        fa->hdr->f = fa->f;
+
+        /* Shut down anything that can't be put in the header's 'flush' callback */
+
+        /* Check for pending array deletion */
+        if(fa->hdr->pending_delete) {
+            /* Set local info, so array deletion can occur after decrementing the
+             *  header's ref count
+             */
+            pending_delete = TRUE;
+            fa_addr = fa->hdr->addr;
+        } /* end if */
+    } /* end if */
+
+    /* Check for pending array deletion */
+    if(pending_delete) {
+        H5FA_hdr_t *hdr;            /* Another pointer to fixed array header */
+
+#ifndef NDEBUG
+{
+    unsigned hdr_status = 0;         /* Header's status in the metadata cache */
+
+    /* Check the header's status in the metadata cache */
+    if(H5AC_get_entry_status(fa->f, fa_addr, &hdr_status) < 0)
+        H5E_THROW(H5E_CANTGET, "unable to check metadata cache status for fixed array header")
+
+    /* Sanity checks on header */
+    HDassert(hdr_status & H5AC_ES__IN_CACHE);
+    HDassert(hdr_status & H5AC_ES__IS_PINNED);
+    HDassert(!(hdr_status & H5AC_ES__IS_PROTECTED));
+}
+#endif /* NDEBUG */
+
+        /* Lock the array header into memory */
+        /* (OK to pass in NULL for callback context, since we know the header must be in the cache) */
+        if(NULL == (hdr = H5FA__hdr_protect(fa->f, dxpl_id, fa_addr, NULL, H5AC__NO_FLAGS_SET)))
+            H5E_THROW(H5E_CANTLOAD, "unable to load fixed array header")
+
+        /* Set the shared array header's file context for this operation */
+        hdr->f = fa->f;
+
+        /* Decrement the reference count on the array header */
+        /* (don't put in H5FA_hdr_fuse_decr() as the array header may be evicted
+         *  immediately -QAK)
+         */
+        if(H5FA__hdr_decr(fa->hdr) < 0)
+            H5E_THROW(H5E_CANTDEC, "can't decrement reference count on shared array header")
+
+        /* Delete array, starting with header (unprotects header) */
+        if(H5FA__hdr_delete(hdr, dxpl_id) < 0)
+            H5E_THROW(H5E_CANTDELETE, "unable to delete fixed array")
+    } /* end if */
+    else {
+        /* Decrement the reference count on the array header */
+        /* (don't put in H5FA_hdr_fuse_decr() as the array header may be evicted
+         *  immediately -QAK)
+         */
+        if(H5FA__hdr_decr(fa->hdr) < 0)
+            H5E_THROW(H5E_CANTDEC, "can't decrement reference count on shared array header")
+    } /* end else */
+
+    /* Release the fixed array wrapper */
+    fa = H5FL_FREE(H5FA_t, fa);
+
+CATCH
+
+END_FUNC(PRIV)  /* end H5FA_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA_delete
+ *
+ * Purpose:     Delete a fixed array
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA_delete(H5F_t *f, hid_t dxpl_id, haddr_t fa_addr, void *ctx_udata))
+
+    /* Local variables */
+    H5FA_hdr_t *hdr = NULL;             /* The fixed array header information */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(H5F_addr_defined(fa_addr));
+
+    /* Lock the array header into memory */
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: fa_addr = %a\n", FUNC, fa_addr);
+#endif /* H5FA_DEBUG */
+    if(NULL == (hdr = H5FA__hdr_protect(f, dxpl_id, fa_addr, ctx_udata, H5AC__NO_FLAGS_SET)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect fixed array header, address = %llu", (unsigned long long)fa_addr)
+
+    /* Check for files using shared array header */
+    if(hdr->file_rc)
+        hdr->pending_delete = TRUE;
+    else {
+        /* Set the shared array header's file context for this operation */
+        hdr->f = f;
+
+        /* Delete array now, starting with header (unprotects header) */
+        if(H5FA__hdr_delete(hdr, dxpl_id) < 0)
+            H5E_THROW(H5E_CANTDELETE, "unable to delete fixed array")
+        hdr = NULL;
+    } /* end if */
+
+CATCH
+
+    /* Unprotect the header, if an error occurred */
+    if(hdr && H5FA__hdr_unprotect(hdr, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release fixed array header")
+
+END_FUNC(PRIV)  /* end H5FA_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA_iterate
+ *
+ * Purpose:     Iterate over the elements of a fixed array
+ *
+ * Note:        This is not very efficient, we should be iterating directly
+ *              over the fixed array's direct block [pages].
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA_iterate(H5FA_t *fa, hid_t dxpl_id, H5FA_operator_t op, void *udata))
+
+    /* Local variables */
+    uint8_t     *elmt = NULL;
+    hsize_t     u;
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fa);
+    HDassert(op);
+    HDassert(udata);
+
+    /* Allocate space for a native array element */
+    if(NULL == (elmt = H5FL_BLK_MALLOC(fa_native_elmt, fa->hdr->cparam.cls->nat_elmt_size)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for fixed array element")
+
+    /* Iterate over all elements in array */
+    for(u = 0; u < fa->hdr->stats.nelmts; u++) {
+        int cb_ret;     /* Return value from callback */
+
+        /* Get array element */
+        if(H5FA_get(fa, dxpl_id, u, elmt) < 0)
+            H5E_THROW(H5E_CANTGET, "unable to delete fixed array")
+
+        /* Make callback */
+        if((cb_ret = (*op)(u, elmt, udata)) < 0) {
+            H5E_PRINTF(H5E_BADITER, "iterator function failed");
+            H5_LEAVE(cb_ret)
+        } /* end if */
+    } /* end for */
+
+CATCH
+
+    if(elmt)
+        elmt = H5FL_BLK_FREE(fa_native_elmt, elmt);
+
+END_FUNC(PRIV)  /* end H5FA_iterate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA_depend
+ *
+ * Purpose:     Make a child flush dependency between the fixed array's
+ *              header and another piece of metadata in the file.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA_depend(H5AC_info_t *parent_entry, H5FA_t *fa))
+
+    /* Local variables */
+    H5FA_hdr_t *hdr = fa->hdr;          /* Header for FA */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     *
+     * At present, this function is only used to setup a flush dependency
+     * between an object header proxy and the extensible array header when
+     * the extensible array is being used to index a chunked data set.
+     *
+     * Make sure that the parameters are congruent with this.
+     */
+    HDassert(fa);
+    HDassert(hdr);
+    HDassert(parent_entry);
+    HDassert(parent_entry->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(parent_entry->type);
+    HDassert(parent_entry->type->id == H5AC_OHDR_PROXY_ID);
+    HDassert((hdr->fd_parent_addr == HADDR_UNDEF) ||
+             (hdr->fd_parent_addr == parent_entry->addr));
+    HDassert((hdr->fd_parent_ptr == NULL) ||
+             (hdr->fd_parent_ptr == parent_entry));
+
+    /*
+     * Check to see if the flush dependency between the object header proxy
+     * and the fixed array header has already been setup.  If it hasn't
+     * set it up.
+     */
+    if(!H5F_addr_defined(hdr->fd_parent_addr)) {
+        /* Set the shared array header's file context for this operation */
+        hdr->f = fa->f;
+
+        /* Set up flush dependency between parent entry and fixed
+         * array header 
+         */
+        if(H5FA__create_flush_depend(parent_entry, (H5AC_info_t *)hdr) < 0)
+            H5E_THROW(H5E_CANTDEPEND, "unable to create flush dependency on file metadata")
+
+        hdr->fd_parent_addr = parent_entry->addr;
+        hdr->fd_parent_ptr = parent_entry;
+    } /* end if */
+
+CATCH
+
+END_FUNC(PRIV)  /* end H5FA_depend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA_undepend
+ *
+ * Purpose:     Remove a child flush dependency between the fixed array's
+ *              header and another piece of metadata in the file.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA_undepend(H5AC_info_t *parent_entry, H5FA_t *fa))
+
+    /* Local variables */
+    H5FA_hdr_t *hdr = fa->hdr;          /* Header for FA */
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fa);
+    HDassert(hdr);
+
+    /* Set the shared array header's file context for this operation */
+    hdr->f = fa->f;
+
+    /* Remove flush dependency between parent entry and fixed array header */
+    if(H5FA__destroy_flush_depend(parent_entry, (H5AC_info_t *)hdr) < 0)
+        H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency on file metadata")
+
+CATCH
+
+END_FUNC(PRIV)  /* end H5FA_undepend() */
diff --git a/src/H5FAcache.c b/src/H5FAcache.c
new file mode 100644
index 0000000..b4e9dfc
--- /dev/null
+++ b/src/H5FAcache.c
@@ -0,0 +1,1271 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5FAcache.c
+ *		Jul  2 2009
+ *		Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:     Implement fixed array metadata cache methods.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5FAmodule.h"         /* This source code file is part of the H5FA module */
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FApkg.h"		/* Fixed Arrays				*/
+#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5VMprivate.h"	/* Vectors and arrays 			*/
+#include "H5WBprivate.h"        /* Wrapped Buffers                      */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Fixed Array format version #'s */
+#define H5FA_HDR_VERSION        0               /* Header */
+#define H5FA_DBLOCK_VERSION     0               /* Data block */
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Metadata cache (H5AC) callbacks */
+static herr_t H5FA__cache_hdr_get_load_size(const void *image_ptr, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5FA__cache_hdr_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
+static void *H5FA__cache_hdr_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty);
+static herr_t H5FA__cache_hdr_image_len(const void *thing, size_t *image_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static herr_t H5FA__cache_hdr_serialize(const H5F_t *f, void *image, size_t len,
+    void *thing);
+static herr_t H5FA__cache_hdr_notify(H5AC_notify_action_t action, void *thing);
+static herr_t H5FA__cache_hdr_free_icr(void *thing);
+
+static herr_t H5FA__cache_dblock_get_load_size(const void *image_ptr, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5FA__cache_dblock_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
+static void *H5FA__cache_dblock_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty);
+static herr_t H5FA__cache_dblock_image_len(const void *thing, 
+    size_t *image_len, hbool_t *compressed_ptr, 
+    size_t *compressed_image_len_ptr);
+static herr_t H5FA__cache_dblock_serialize(const H5F_t *f, void *image, size_t len,
+    void *thing);
+static herr_t H5FA__cache_dblock_notify(H5AC_notify_action_t action, void *thing);
+static herr_t H5FA__cache_dblock_free_icr(void *thing);
+static herr_t H5FA__cache_dblock_fsf_size(const void *thing, size_t *fsf_size);
+
+static herr_t H5FA__cache_dblk_page_get_load_size(const void *image_ptr, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5FA__cache_dblk_page_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
+static void *H5FA__cache_dblk_page_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty);
+static herr_t H5FA__cache_dblk_page_image_len(const void *thing, 
+    size_t *image_len, hbool_t *compressed_ptr, 
+    size_t *compressed_image_len_ptr);
+static herr_t H5FA__cache_dblk_page_serialize(const H5F_t *f, void *image, size_t len,
+    void *thing);
+static herr_t H5FA__cache_dblk_page_free_icr(void *thing);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* H5FA header inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_FARRAY_HDR[1] = {{
+    H5AC_FARRAY_HDR_ID,                 /* Metadata client ID */
+    "Fixed-array Header",               /* Metadata client name (for debugging) */
+    H5FD_MEM_FARRAY_HDR,                /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5FA__cache_hdr_get_load_size,      /* 'get_load_size' callback */
+    H5FA__cache_hdr_verify_chksum,	/* 'verify_chksum' callback */
+    H5FA__cache_hdr_deserialize,        /* 'deserialize' callback */
+    H5FA__cache_hdr_image_len,          /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5FA__cache_hdr_serialize,          /* 'serialize' callback */
+    H5FA__cache_hdr_notify,             /* 'notify' callback */
+    H5FA__cache_hdr_free_icr,           /* 'free_icr' callback */
+    NULL,				/* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
+}};
+
+/* H5FA data block inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_FARRAY_DBLOCK[1] = {{
+    H5AC_FARRAY_DBLOCK_ID,              /* Metadata client ID */
+    "Fixed Array Data Block",           /* Metadata client name (for debugging) */
+    H5FD_MEM_FARRAY_DBLOCK,             /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5FA__cache_dblock_get_load_size,   /* 'get_load_size' callback */
+    H5FA__cache_dblock_verify_chksum,	/* 'verify_chksum' callback */
+    H5FA__cache_dblock_deserialize,     /* 'deserialize' callback */
+    H5FA__cache_dblock_image_len,       /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5FA__cache_dblock_serialize,       /* 'serialize' callback */
+    H5FA__cache_dblock_notify,		/* 'notify' callback */
+    H5FA__cache_dblock_free_icr,        /* 'free_icr' callback */
+    NULL,				/* 'clear' callback */
+    H5FA__cache_dblock_fsf_size,        /* 'fsf_size' callback */
+}};
+
+/* H5FA data block page inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_FARRAY_DBLK_PAGE[1] = {{
+    H5AC_FARRAY_DBLK_PAGE_ID,           /* Metadata client ID */
+    "Fixed Array Data Block Page",      /* Metadata client name (for debugging) */
+    H5FD_MEM_FARRAY_DBLK_PAGE,          /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5FA__cache_dblk_page_get_load_size, /* 'get_load_size' callback */
+    H5FA__cache_dblk_page_verify_chksum, /* 'verify_chksum' callback */
+    H5FA__cache_dblk_page_deserialize,  /* 'deserialize' callback */
+    H5FA__cache_dblk_page_image_len,    /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5FA__cache_dblk_page_serialize,    /* 'serialize' callback */
+    NULL,                               /* 'notify' callback */
+    H5FA__cache_dblk_page_free_icr,     /* 'free_icr' callback */
+    NULL,				/* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__cache_hdr_get_load_size
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 31, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5FA__cache_hdr_get_load_size(const void *_image, void *_udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr))
+
+    /* Local variables */
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    H5FA_hdr_cache_ud_t *udata = (H5FA_hdr_cache_ud_t *)_udata; /* User data for callback */
+
+    /* Check arguments */
+    HDassert(udata);
+    HDassert(udata->f);
+    HDassert(image_len);
+
+    if(image == NULL) {
+	/* Set the image length size */
+	*image_len = (size_t)H5FA_HEADER_SIZE_FILE(udata->f);
+    } else {
+        HDassert(actual_len);
+        HDassert(*actual_len == *image_len);
+    }
+
+END_FUNC(STATIC)   /* end H5FA__cache_hdr_get_load_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FA__cache_hdr_verify_chksum
+ *
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
+ *
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
+ *
+ * Programmer:	Vailin Choi; Aug 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+htri_t, TRUE, -,
+H5FA__cache_hdr_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSED *_udata))
+
+    /* Local variables */
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+
+    /* Check arguments */
+    HDassert(image);
+
+    /* Get stored and computed checksums */
+    H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
+
+    if(stored_chksum != computed_chksum)
+	ret_value = FALSE;
+
+END_FUNC(STATIC) 	/* end H5FA__cache_hdr_verify_chksum() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FA__cache_hdr_deserialize
+ *
+ * Purpose:	Loads a data structure from the disk.
+ *
+ * Return:	Success:	Pointer to a new Fixed array
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              August 12, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+void *, NULL, NULL,
+H5FA__cache_hdr_deserialize(const void *_image, size_t len,
+    void *_udata, hbool_t H5_ATTR_UNUSED *dirty))
+
+    /* Local variables */
+    H5FA_cls_id_t       id;		/* ID of fixed array class, as found in file */
+    H5FA_hdr_t		*hdr = NULL;    /* Fixed array info */
+    H5FA_hdr_cache_ud_t *udata = (H5FA_hdr_cache_ud_t *)_udata;
+    const uint8_t	*image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t            stored_chksum;  /* Stored metadata checksum value */
+
+    /* Check arguments */
+    HDassert(udata);
+    HDassert(udata->f);
+    HDassert(H5F_addr_defined(udata->addr));
+
+    /* Allocate space for the fixed array data structure */
+    if(NULL == (hdr = H5FA__hdr_alloc(udata->f)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for fixed array shared header")
+
+    /* Set the fixed array header's address */
+    hdr->addr = udata->addr;
+
+    /* Magic number */
+    if(HDmemcmp(image, H5FA_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+        H5E_THROW(H5E_BADVALUE, "wrong fixed array header signature")
+    image += H5_SIZEOF_MAGIC;
+
+    /* Version */
+    if(*image++ != H5FA_HDR_VERSION)
+        H5E_THROW(H5E_VERSION, "wrong fixed array header version")
+
+    /* Fixed array class */
+    id = (H5FA_cls_id_t)*image++;
+    if(id >= H5FA_NUM_CLS_ID)
+        H5E_THROW(H5E_BADTYPE, "incorrect fixed array class")
+    hdr->cparam.cls = H5FA_client_class_g[id];
+
+    /* General array creation/configuration information */
+    hdr->cparam.raw_elmt_size = *image++;             /* Element size in file (in bytes) */
+    hdr->cparam.max_dblk_page_nelmts_bits = *image++; /* Log2(Max. # of elements in data block page) -
+						         i.e. # of bits needed to store max. # of
+						         elements in data block page. */
+
+    /* Array statistics */
+    H5F_DECODE_LENGTH(udata->f, image, hdr->cparam.nelmts);	/* Number of elements */
+
+    /* Internal information */
+    H5F_addr_decode(udata->f, &image, &hdr->dblk_addr); 		/* Address of index block */
+
+    /* Check for data block */
+    if(H5F_addr_defined(hdr->dblk_addr)) {
+        H5FA_dblock_t  dblock;  	/* Fake data block for computing size */
+        size_t	dblk_page_nelmts;	/* # of elements per data block page */
+
+        /* Set up fake data block for computing size on disk */
+        dblock.hdr = hdr;
+        dblock.dblk_page_init_size = 0;
+        dblock.npages = 0;
+        dblk_page_nelmts = (size_t)1 << hdr->cparam.max_dblk_page_nelmts_bits;
+        if(hdr->cparam.nelmts > dblk_page_nelmts) {
+            dblock.npages = (size_t)(((hdr->cparam.nelmts + dblk_page_nelmts) - 1) / dblk_page_nelmts);
+            dblock.dblk_page_init_size = (dblock.npages + 7) / 8;
+        } /* end if */
+
+        /* Compute Fixed Array data block size for hdr statistics */
+        hdr->stats.dblk_size = (size_t)H5FA_DBLOCK_SIZE(&dblock);
+    } /* end if */
+
+    /* Sanity check */
+    /* (allow for checksum not decoded yet) */
+    HDassert((size_t)(image - (const uint8_t *)_image) == (len - H5FA_SIZEOF_CHKSUM));
+
+    /* checksum verification already done in verify_chksum cb */
+
+    /* Metadata checksum */
+    UINT32DECODE(image, stored_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(image - (const uint8_t *)_image) == len);
+
+    /* Finish initializing fixed array header */
+    if(H5FA__hdr_init(hdr, udata->ctx_udata) < 0)
+        H5E_THROW(H5E_CANTINIT, "initialization failed for fixed array header")
+    HDassert(hdr->size == len);
+
+    /* Set return value */
+    ret_value = hdr;
+
+CATCH
+
+    /* Release resources */
+    if(!ret_value)
+        if(hdr && H5FA__hdr_dest(hdr) < 0)
+            H5E_THROW(H5E_CANTFREE, "unable to destroy fixed array header")
+
+END_FUNC(STATIC)   /* end H5FA__cache_hdr_deserialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__cache_hdr_image_len
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              August 12, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5FA__cache_hdr_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr))
+
+    /* Local variables */
+    const H5FA_hdr_t *hdr = (const H5FA_hdr_t *)_thing;      /* Pointer to the object */
+
+    /* Check arguments */
+    HDassert(hdr);
+    HDassert(image_len);
+
+    /* Set the image length size */
+    *image_len = hdr->size;
+
+END_FUNC(STATIC)   /* end H5FA__cache_hdr_image_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FA__cache_hdr_serialize
+ *
+ * Purpose:	Flushes a dirty object to disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              August 12, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5FA__cache_hdr_serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
+    void *_thing))
+
+    /* Local variables */
+    H5FA_hdr_t *hdr = (H5FA_hdr_t *)_thing;     /* Pointer to the fixed array header */
+    uint8_t *image = (uint8_t *)_image;         /* Pointer into raw data buffer */
+    uint32_t metadata_chksum;   /* Computed metadata checksum value */
+
+    /* check arguments */
+    HDassert(f);
+    HDassert(image);
+    HDassert(hdr);
+
+    /* Magic number */
+    HDmemcpy(image, H5FA_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    image += H5_SIZEOF_MAGIC;
+
+    /* Version # */
+    *image++ = H5FA_HDR_VERSION;
+
+    /* Fixed array type */
+    *image++ = hdr->cparam.cls->id;
+
+    /* General array creation/configuration information */
+    *image++ = hdr->cparam.raw_elmt_size;          /* Element size in file (in bytes) */
+    *image++ = hdr->cparam.max_dblk_page_nelmts_bits;  /* Log2(Max. # of elements in data block page) - i.e. # of bits needed to store max. # of elements in data block page */
+
+    /* Array statistics */
+    H5F_ENCODE_LENGTH(f, image, hdr->stats.nelmts);       /* Number of elements for the fixed array */
+
+    /* Internal information */
+    H5F_addr_encode(f, &image, hdr->dblk_addr);  /* Address of fixed array data block */
+
+    /* Compute metadata checksum */
+    metadata_chksum = H5_checksum_metadata(_image, (size_t)(image - (uint8_t *)_image), 0);
+
+    /* Metadata checksum */
+    UINT32ENCODE(image, metadata_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(image - (uint8_t *)_image) == len);
+
+END_FUNC(STATIC)   /* end H5FA__cache_hdr_serialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FA__cache_hdr_notify
+ *
+ * Purpose:	Handle cache action notifications
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Dana Robinson
+ *              December 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__cache_hdr_notify(H5AC_notify_action_t action, void *_thing))
+
+    /* Local variables */
+    H5FA_hdr_t *hdr = (H5FA_hdr_t *)_thing;      /* Pointer to the object */
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* Check if the file was opened with SWMR-write access */
+    if(hdr->swmr_write) {
+        /* Determine which action to take */
+        switch(action) {
+            case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+	        case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+	        case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+                /* do nothing */
+                break;
+
+	        case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+                /* If hdr->fd_parent_addr != HADDR_UNDEF, the fixed 
+                 * array header must be employed as the index for a chunked
+                 * data set which has been modified by the SWMR writer.
+                 * 
+                 * In this case, hdr->fd_parent_addr must contain the 
+                 * address of object header proxy which is the flush 
+                 * dependency parent of the fixed array header.
+                 *
+                 * hdr->fd_parent_addr (and hdr->fd_parent_ptr) are used to
+                 * destroy the flush dependency before the fixed array
+                 * header is evicted.
+                 */
+                if(hdr->fd_parent_addr != HADDR_UNDEF) {
+                    HDassert(hdr->fd_parent_ptr);
+                    HDassert(hdr->fd_parent_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+                    HDassert(hdr->fd_parent_ptr->addr == hdr->fd_parent_addr);
+                    HDassert(hdr->fd_parent_ptr->type);
+                    HDassert(hdr->fd_parent_ptr->type->id == H5AC_OHDR_PROXY_ID);
+
+                    /* Destroy flush dependency on object header proxy */
+                    if(H5FA__destroy_flush_depend((H5AC_info_t *)hdr->fd_parent_ptr, (H5AC_info_t *)hdr) < 0)
+                        H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency between fa header and object header proxy, address = %llu", (unsigned long long)hdr->fd_parent_addr)
+                } /* end if */
+                break;
+
+            default:
+#ifdef NDEBUG
+                H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
+#else /* NDEBUG */
+                HDassert(0 && "Unknown action?!?");
+#endif /* NDEBUG */
+        } /* end switch */
+    } /* end if */
+    else {
+        HDassert(hdr->fd_parent_addr == HADDR_UNDEF);
+        HDassert(hdr->fd_parent_ptr == NULL);
+    } /* end else */
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5FA__cache_hdr_notify() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FA__cache_hdr_free_icr
+ *
+ * Purpose:	Destroy/release an "in core representation" of a data
+ *              structure
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              August 12, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__cache_hdr_free_icr(void *thing))
+
+    /* Check arguments */
+    HDassert(thing);
+
+    /* Release the extensible array header */
+    if(H5FA__hdr_dest((H5FA_hdr_t *)thing) < 0)
+        H5E_THROW(H5E_CANTFREE, "can't free fixed array header")
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5FA__cache_hdr_free_icr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__cache_dblock_get_load_size
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              August 12, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5FA__cache_dblock_get_load_size(const void *_image, void *_udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr))
+
+    /* Local variables */
+    const uint8_t *image = (const uint8_t *)_image;    	/* Pointer into raw data buffer */
+    H5FA_dblock_cache_ud_t *udata = (H5FA_dblock_cache_ud_t *)_udata;      /* User data */
+    H5FA_dblock_t dblock;           			/* Fake data block for computing size */
+    size_t dblk_page_nelmts;				/* # of elements per data block page */
+
+    /* Check arguments */
+    HDassert(udata);
+    HDassert(udata->hdr);
+    HDassert(image_len);
+
+    if(image == NULL) {
+
+	/* Set up fake data block for computing size on disk */
+	/* (Note: extracted from H5FA__dblock_alloc) */
+	HDmemset(&dblock, 0, sizeof(dblock));
+
+	/* Set up fake data block for computing size on disk
+	 *
+	 * need: dblock->hdr
+	 *       dblock->npages
+	 *       dblock->dblk_page_init_size
+	 */
+
+	dblock.hdr = udata->hdr;
+	dblk_page_nelmts = (size_t)1 << udata->hdr->cparam.max_dblk_page_nelmts_bits;
+	if(udata->hdr->cparam.nelmts > dblk_page_nelmts) {
+	    dblock.npages = (size_t)(((udata->hdr->cparam.nelmts + dblk_page_nelmts) - 1) / dblk_page_nelmts);
+	    dblock.dblk_page_init_size = (dblock.npages + 7) / 8;
+	} /* end if */
+
+	/* Set the image length size */
+	if(!dblock.npages)
+	    *image_len = (size_t)H5FA_DBLOCK_SIZE(&dblock);
+	else
+	    *image_len = (size_t)H5FA_DBLOCK_PREFIX_SIZE(&dblock);
+    } else {
+        HDassert(actual_len);
+        HDassert(*actual_len == *image_len);
+    }
+
+END_FUNC(STATIC)   /* end H5FA__cache_dblock_get_load_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FA__cache_dblock_verify_chksum
+ *
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
+ *
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
+ *
+ * Programmer:	Vailin Choi; Aug 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+htri_t, TRUE, -,
+H5FA__cache_dblock_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSED *_udata))
+
+    /* Local variables */
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+
+    /* Check arguments */
+    HDassert(image);
+
+    /* Get stored and computed checksums */
+    H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
+
+    if(stored_chksum != computed_chksum)
+	ret_value = FALSE;
+
+END_FUNC(STATIC) 	/* end H5FA__cache_dblock_verify_chksum() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FA__cache_dblock_deserialize
+ *
+ * Purpose:	Loads a data structure from the disk.
+ *
+ * Return:	Success:	Pointer to a new B-tree.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              August 14, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+void *, NULL, NULL,
+H5FA__cache_dblock_deserialize(const void *_image, size_t len,
+    void *_udata, hbool_t H5_ATTR_UNUSED *dirty))
+
+    /* Local variables */
+    H5FA_dblock_t  *dblock = NULL;  /* Data block info */
+    H5FA_dblock_cache_ud_t *udata = (H5FA_dblock_cache_ud_t *)_udata; /* User data for loading data block */
+    const uint8_t  *image = (const uint8_t *)_image;    /* Pointer into raw data buffer */
+    uint32_t       stored_chksum;   /* Stored metadata checksum value */
+    haddr_t        arr_addr;        /* Address of array header in the file */
+
+    /* Sanity check */
+    HDassert(udata);
+    HDassert(udata->hdr);
+
+    /* Allocate the fixed array data block */
+    if(NULL == (dblock = H5FA__dblock_alloc(udata->hdr)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for fixed array data block")
+
+    HDassert(((!dblock->npages) && (len == (size_t)H5FA_DBLOCK_SIZE(dblock))) 
+             || (len == (size_t)H5FA_DBLOCK_PREFIX_SIZE(dblock)));
+
+    /* Set the fixed array data block's information */
+    dblock->addr = udata->dblk_addr;
+
+    /* Magic number */
+    if(HDmemcmp(image, H5FA_DBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+        H5E_THROW(H5E_BADVALUE, "wrong fixed array data block signature")
+    image += H5_SIZEOF_MAGIC;
+
+    /* Version */
+    if(*image++ != H5FA_DBLOCK_VERSION)
+        H5E_THROW(H5E_VERSION, "wrong fixed array data block version")
+
+    /* Fixed array type */
+    if(*image++ != (uint8_t)udata->hdr->cparam.cls->id)
+        H5E_THROW(H5E_BADTYPE, "incorrect fixed array class")
+
+    /* Address of header for array that owns this block (just for file integrity checks) */
+    H5F_addr_decode(udata->hdr->f, &image, &arr_addr);
+    if(H5F_addr_ne(arr_addr, udata->hdr->addr))
+        H5E_THROW(H5E_BADVALUE, "wrong fixed array header address")
+
+    /* Page initialization flags */
+    if(dblock->npages > 0) {
+	HDmemcpy(dblock->dblk_page_init, image, dblock->dblk_page_init_size);
+        image += dblock->dblk_page_init_size;
+    } /* end if */
+
+    /* Only decode elements if the data block is not paged */
+    if(!dblock->npages) {
+        /* Decode elements in data block */
+        /* Convert from raw elements on disk into native elements in memory */
+        if((udata->hdr->cparam.cls->decode)(image, dblock->elmts, (size_t)udata->hdr->cparam.nelmts, udata->hdr->cb_ctx) < 0)
+            H5E_THROW(H5E_CANTDECODE, "can't decode fixed array data elements")
+        image += (udata->hdr->cparam.nelmts * udata->hdr->cparam.raw_elmt_size);
+    } /* end if */
+
+    /* Sanity check */
+    /* (allow for checksum not decoded yet) */
+    HDassert((size_t)(image - (const uint8_t *)_image) == (len - H5FA_SIZEOF_CHKSUM));
+
+    /* Set the data block's size */
+    dblock->size = H5FA_DBLOCK_SIZE(dblock);
+
+    /* checksum verification already done in verify_chksum cb */
+
+    /* Metadata checksum */
+    UINT32DECODE(image, stored_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(image - (const uint8_t *)_image) == len);
+
+    /* Set return value */
+    ret_value = dblock;
+
+CATCH
+
+    /* Release resources */
+    if(!ret_value)
+        if(dblock && H5FA__dblock_dest(dblock) < 0)
+            H5E_THROW(H5E_CANTFREE, "unable to destroy fixed array data block")
+
+END_FUNC(STATIC)   /* end H5FA__cache_dblock_deserialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__cache_dblock_image_len
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              August 14, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5FA__cache_dblock_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr))
+
+    /* Local variables */
+    const H5FA_dblock_t *dblock = (const H5FA_dblock_t *)_thing;      /* Pointer to the object */
+
+    /* Check arguments */
+    HDassert(dblock);
+    HDassert(image_len);
+
+    /* Set the image length size */
+    if(!dblock->npages)
+        *image_len = (size_t)dblock->size;
+    else
+        *image_len = H5FA_DBLOCK_PREFIX_SIZE(dblock);
+
+END_FUNC(STATIC)   /* end H5FA__cache_dblock_image_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FA__cache_dblock_serialize
+ *
+ * Purpose:	Flushes a dirty object to disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              August 14, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__cache_dblock_serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
+    void *_thing))
+
+    /* Local variables */
+    H5FA_dblock_t *dblock = (H5FA_dblock_t *)_thing;      /* Pointer to the object to serialize */
+    uint8_t *image = (uint8_t *)_image;         /* Pointer into raw data buffer */
+    uint32_t metadata_chksum; /* Computed metadata checksum value */
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(image);
+    HDassert(dblock);
+    HDassert(dblock->hdr);
+
+    /* Magic number */
+    HDmemcpy(image, H5FA_DBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    image += H5_SIZEOF_MAGIC;
+
+    /* Version # */
+    *image++ = H5FA_DBLOCK_VERSION;
+
+    /* Fixed array type */
+    *image++ = dblock->hdr->cparam.cls->id;
+
+    /* Address of array header for array which owns this block */
+    H5F_addr_encode(f, &image, dblock->hdr->addr);
+
+    /* Page init flags */
+    if(dblock->npages > 0) {
+        /* Store the 'page init' bitmasks */
+        HDmemcpy(image, dblock->dblk_page_init, dblock->dblk_page_init_size);
+        image += dblock->dblk_page_init_size;
+    } /* end if */
+
+    /* Only encode elements if the data block is not paged */
+    if(!dblock->npages) {
+        /* Encode elements in data block */
+
+        /* Convert from native elements in memory into raw elements on disk */
+        H5_CHECK_OVERFLOW(dblock->hdr->cparam.nelmts, /* From: */hsize_t, /* To: */size_t);
+        if((dblock->hdr->cparam.cls->encode)(image, dblock->elmts, (size_t)dblock->hdr->cparam.nelmts, dblock->hdr->cb_ctx) < 0)
+            H5E_THROW(H5E_CANTENCODE, "can't encode fixed array data elements")
+        image += (dblock->hdr->cparam.nelmts * dblock->hdr->cparam.raw_elmt_size);
+    } /* end if */
+
+    /* Compute metadata checksum */
+    metadata_chksum = H5_checksum_metadata(_image, (size_t)(image - (uint8_t *)_image), 0);
+
+    /* Metadata checksum */
+    UINT32ENCODE(image, metadata_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(image - (uint8_t *)_image) == len);
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5FA__cache_dblock_serialize() */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__cache_dblock_notify
+ *
+ * Purpose:     Handle cache action notifications
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__cache_dblock_notify(H5AC_notify_action_t action, void *_thing))
+
+    /* Local variables */
+    H5FA_dblock_t *dblock = (H5FA_dblock_t *)_thing;
+
+    /* Sanity check */
+    HDassert(dblock);
+
+    /* Check if the file was opened with SWMR-write access */
+    if(dblock->hdr->swmr_write) {
+        /* Determine which action to take */
+        switch(action) {
+            case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+	    case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+                /* Create flush dependency on parent */
+                if(H5FA__create_flush_depend((H5AC_info_t *)dblock->hdr, (H5AC_info_t *)dblock) < 0)
+                    H5E_THROW(H5E_CANTDEPEND, "unable to create flush dependency between data block and header, address = %llu", (unsigned long long)dblock->addr)
+                break;
+
+	    case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+                /* do nothing */
+                break;
+
+            case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+		/* Destroy flush dependency on parent */
+                if(H5FA__destroy_flush_depend((H5AC_info_t *)dblock->hdr, (H5AC_info_t *)dblock) < 0)
+                    H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency")
+
+                break;
+
+            default:
+#ifdef NDEBUG
+                H5E_THROW(H5E_BADVALUE, "unknown action from metadata cache")
+#else /* NDEBUG */
+                HDassert(0 && "Unknown action?!?");
+#endif /* NDEBUG */
+        } /* end switch */
+    } /* end if */
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5FA__cache_dblock_notify() */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FA__cache_dblock_free_icr
+ *
+ * Purpose:	Destroy/release an "in core representation" of a data
+ *              structure
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              August 14, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__cache_dblock_free_icr(void *_thing))
+
+    H5FA_dblock_t *dblock = (H5FA_dblock_t *)_thing;    /* Pointer to the object */
+
+    /* Check arguments */
+    HDassert(dblock);
+
+    /* Release the fixed array data block */
+    if(H5FA__dblock_dest(dblock) < 0)
+        H5E_THROW(H5E_CANTFREE, "can't free fixed array data block")
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5FA__cache_dblock_free_icr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FA__cache_dblock_fsf_size
+ *
+ * Purpose:	Tell the metadata cache the actual amount of file space
+ *		to free when a dblock entry is destroyed with the free
+ *		file space block set.
+ *
+ *		This function is needed when the data block is paged, as 
+ *		the datablock header and all its pages are allocted as a
+ *		single contiguous chunk of file space, and must be 
+ *		deallocated the same way.
+ *
+ *		The size of the chunk of memory in which the dblock
+ *		header and all its pages is stored in the size field,
+ *		so we simply pass that value back to the cache.
+ *
+ *		If the datablock is not paged, then the size field of 
+ *		the cache_info contains the correct size.  However this
+ *		value will be the same as the size field, so we return
+ *		the contents of the size field to the cache in this case
+ *		as well.
+ *		
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	John Mainzer
+ *              12/5/14
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5FA__cache_dblock_fsf_size(const void *_thing, size_t *fsf_size))
+
+    const H5FA_dblock_t *dblock = (const H5FA_dblock_t *)_thing;    /* Pointer to the object */
+
+    /* Check arguments */
+    HDassert(dblock);
+    HDassert(dblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(dblock->cache_info.type == H5AC_FARRAY_DBLOCK);
+    HDassert(fsf_size);
+
+    *fsf_size = dblock->size;
+
+END_FUNC(STATIC)   /* end H5FA__cache_dblock_fsf_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__cache_dblk_page_get_load_size
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              August 14, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5FA__cache_dblk_page_get_load_size(const void *_image, void *_udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr))
+
+    /* Local variables */
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    H5FA_dblk_page_cache_ud_t *udata = (H5FA_dblk_page_cache_ud_t *)_udata;      /* User data */
+
+    /* Check arguments */
+    HDassert(udata);
+    HDassert(udata->hdr);
+    HDassert(udata->nelmts > 0);
+    HDassert(image_len);
+
+    if(image == NULL)
+	*image_len = (size_t)H5FA_DBLK_PAGE_SIZE(udata->hdr, udata->nelmts);
+    else {
+        HDassert(actual_len);
+        HDassert(*actual_len == *image_len);
+    }
+
+END_FUNC(STATIC)   /* end H5FA__cache_dblk_page_get_load_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FA__cache_dblk_page_verify_chksum
+ *
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
+ *
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
+ *
+ * Programmer:	Vailin Choi; Aug 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+htri_t, TRUE, -,
+H5FA__cache_dblk_page_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSED *_udata))
+
+    /* Local variables */
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+
+    /* Check arguments */
+    HDassert(image);
+
+    /* Get stored and computed checksums */
+    H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
+
+    if(stored_chksum != computed_chksum)
+	ret_value = FALSE;
+
+END_FUNC(STATIC) 	/* end H5FA__cache_dblk_page_verify_chksum() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FA__cache_dblk_page_deserialize
+ *
+ * Purpose:	Loads a data structure from the disk.
+ *
+ * Return:	Success:	Pointer to a new B-tree.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              August 14, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+void *, NULL, NULL,
+H5FA__cache_dblk_page_deserialize(const void *_image, size_t len,
+    void *_udata, hbool_t H5_ATTR_UNUSED *dirty))
+
+    /* Local variables */
+    H5FA_dblk_page_t    *dblk_page = NULL; /* Data block page info */
+    H5FA_dblk_page_cache_ud_t *udata = (H5FA_dblk_page_cache_ud_t *)_udata; /* User data for loading data block page */
+    const uint8_t	*image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t            stored_chksum;  /* Stored metadata checksum value */
+
+    /* Sanity check */
+    HDassert(udata);
+    HDassert(udata->hdr);
+    HDassert(udata->nelmts > 0);
+    HDassert(H5F_addr_defined(udata->dblk_page_addr));
+
+    /* Allocate the fixed array data block page */
+    if(NULL == (dblk_page = H5FA__dblk_page_alloc(udata->hdr, udata->nelmts)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for fixed array data block page")
+
+    /* Set the fixed array data block's information */
+    dblk_page->addr = udata->dblk_page_addr;
+
+    /* Internal information */
+
+    /* Decode elements in data block page */
+    /* Convert from raw elements on disk into native elements in memory */
+    if((udata->hdr->cparam.cls->decode)(image, dblk_page->elmts, udata->nelmts, udata->hdr->cb_ctx) < 0)
+        H5E_THROW(H5E_CANTDECODE, "can't decode fixed array data elements")
+    image += (udata->nelmts * udata->hdr->cparam.raw_elmt_size);
+
+    /* Sanity check */
+    /* (allow for checksum not decoded yet) */
+    HDassert((size_t)(image - (const uint8_t *)_image) == (len - H5FA_SIZEOF_CHKSUM));
+
+    /* Set the data block page's size */
+    dblk_page->size = len;
+
+    /* checksum verification already done in verify_chksum cb */
+
+    /* Metadata checksum */
+    UINT32DECODE(image, stored_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(image - (const uint8_t *)_image) == dblk_page->size);
+
+    /* Set return value */
+    ret_value = dblk_page;
+
+CATCH
+
+    /* Release resources */
+    if(!ret_value)
+        if(dblk_page && H5FA__dblk_page_dest(dblk_page) < 0)
+            H5E_THROW(H5E_CANTFREE, "unable to destroy fixed array data block page")
+
+END_FUNC(STATIC)   /* end H5FA__cache_dblk_page_deserialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__cache_dblk_page_image_len
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              August 14, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5FA__cache_dblk_page_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr))
+
+    /* Local variables */
+    const H5FA_dblk_page_t *dblk_page = (const H5FA_dblk_page_t *)_thing;      /* Pointer to the object */
+
+    /* Check arguments */
+    HDassert(dblk_page);
+    HDassert(image_len);
+
+    /* Set the image length size */
+    *image_len = dblk_page->size; 
+
+END_FUNC(STATIC)   /* end H5FA__cache_dblk_page_image_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FA__cache_dblk_page_serialize
+ *
+ * Purpose:	Flushes a dirty object to disk.
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              August 14, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__cache_dblk_page_serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
+    void *_thing))
+
+    /* Local variables */
+    H5FA_dblk_page_t *dblk_page = (H5FA_dblk_page_t *)_thing;      /* Pointer to the object to serialize */
+    uint8_t *image = (uint8_t *)_image;         /* Pointer into raw data buffer */
+    uint32_t metadata_chksum;   /* Computed metadata checksum value */
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(image);
+    HDassert(dblk_page);
+    HDassert(dblk_page->hdr);
+
+    /* Internal information */
+
+    /* Encode elements in data block page */
+
+    /* Convert from native elements in memory into raw elements on disk */
+    if((dblk_page->hdr->cparam.cls->encode)(image, dblk_page->elmts, dblk_page->nelmts, dblk_page->hdr->cb_ctx) < 0)
+        H5E_THROW(H5E_CANTENCODE, "can't encode fixed array data elements")
+    image += (dblk_page->nelmts * dblk_page->hdr->cparam.raw_elmt_size);
+
+    /* Compute metadata checksum */
+    metadata_chksum = H5_checksum_metadata(_image, (size_t)(image - (uint8_t *)_image), 0);
+
+    /* Metadata checksum */
+    UINT32ENCODE(image, metadata_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(image - (uint8_t *)_image) == len);
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5FA__cache_dblk_page_serialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FA__cache_dblk_page_free_icr
+ *
+ * Purpose:	Destroy/release an "in core representation" of a data
+ *              structure
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              August 14, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__cache_dblk_page_free_icr(void *thing))
+
+    /* Check arguments */
+    HDassert(thing);
+
+    /* Release the fixed array data block page */
+    if(H5FA__dblk_page_dest((H5FA_dblk_page_t *)thing) < 0)
+        H5E_THROW(H5E_CANTFREE, "can't free fixed array data block page")
+
+CATCH
+
+END_FUNC(STATIC)   /* end H5FA__cache_dblk_page_free_icr() */
diff --git a/src/H5FAdbg.c b/src/H5FAdbg.c
new file mode 100644
index 0000000..2dc51c5
--- /dev/null
+++ b/src/H5FAdbg.c
@@ -0,0 +1,285 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5FAdbg.c
+ *
+ * Purpose:     Dump debugging information about a fixed array.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5FAmodule.h"         /* This source code file is part of the H5FA module */
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FApkg.h"		/* Fixed Arrays				*/
+#include "H5Oprivate.h"		/* Object Header 			*/
+#include "H5VMprivate.h"         /* Vector functions                     */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__hdr_debug
+ *
+ * Purpose:     Prints debugging info about a fixed array header.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
+    int fwidth, const H5FA_class_t *cls, haddr_t obj_addr))
+
+    /* Local variables */
+    H5FA_hdr_t *hdr = NULL;     /* Shared fixed array header */
+    void *dbg_ctx = NULL;       /* Fixed array debugging context */
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(H5F_addr_defined(obj_addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+    HDassert(cls);
+
+    /* Check for debugging context callback available */
+    if(cls->crt_dbg_ctx) {
+        /* Create debugging context */
+        if(NULL == (dbg_ctx = cls->crt_dbg_ctx(f, dxpl_id, obj_addr)))
+            H5E_THROW(H5E_CANTGET, "unable to create fixed array debugging context")
+    } /* end if */
+
+    /* Load the fixed array header */
+    if(NULL == (hdr = H5FA__hdr_protect(f, dxpl_id, addr, dbg_ctx, H5AC__READ_ONLY_FLAG)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to load fixed array header")
+
+    /* Print opening message */
+    HDfprintf(stream, "%*sFixed Array Header...\n", indent, "");
+
+    /* Print the values */
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+        "Array class ID:", hdr->cparam.cls->name);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+        "Header size:",
+        hdr->size);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+        "Raw Element Size:",
+        (unsigned)hdr->cparam.raw_elmt_size);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+        "Native Element Size (on this platform):",
+        hdr->cparam.cls->nat_elmt_size);
+
+
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+        "Max. # of elements in data block page:",
+        (unsigned)((size_t)1 << hdr->cparam.max_dblk_page_nelmts_bits));
+
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+        "Number of elements in Fixed Array:", hdr->stats.nelmts);
+
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+        "Fixed Array Data Block Address:", hdr->dblk_addr);
+
+CATCH
+    if(dbg_ctx && cls->dst_dbg_ctx(dbg_ctx) < 0)
+        H5E_THROW(H5E_CANTRELEASE, "unable to release fixed array debugging context")
+    if(hdr && H5FA__hdr_unprotect(hdr, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release fixed array header")
+
+END_FUNC(PKG)   /* end H5FA__hdr_debug() */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__dblock_debug
+ *
+ * Purpose:     Prints debugging info about a fixed array data block.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__dblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
+    int fwidth, const H5FA_class_t *cls, haddr_t hdr_addr, haddr_t obj_addr))
+
+    /* Local variables */
+    H5FA_hdr_t *hdr = NULL;             /* Shared fixed array header */
+    H5FA_dblock_t *dblock = NULL;       /* Fixed array data block */
+    void *dbg_ctx = NULL;               /* Fixed array context */
+    size_t u;                           /* Local index variable */
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+    HDassert(cls);
+    HDassert(H5F_addr_defined(hdr_addr));
+    HDassert(H5F_addr_defined(obj_addr));
+
+    /* Check for debugging context callback available */
+    if(cls->crt_dbg_ctx) {
+        /* Create debugging context */
+        if(NULL == (dbg_ctx = cls->crt_dbg_ctx(f, dxpl_id, obj_addr)))
+            H5E_THROW(H5E_CANTGET, "unable to create fixed array debugging context")
+    } /* end if */
+
+    /* Load the fixed array header */
+    if(NULL == (hdr = H5FA__hdr_protect(f, dxpl_id, hdr_addr, dbg_ctx, H5AC__READ_ONLY_FLAG)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to load fixed array header")
+
+    /* Protect data block */
+    if(NULL == (dblock = H5FA__dblock_protect(hdr, dxpl_id, addr, H5AC__READ_ONLY_FLAG)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect fixed array data block, address = %llu", (unsigned long long)addr)
+
+    /* Print opening message */
+    HDfprintf(stream, "%*sFixed Array data Block...\n", indent, "");
+
+    /* Print the values */
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+        "Array class ID:", hdr->cparam.cls->name);
+    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth, "Address of Data Block:", dblock->addr);
+    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth, "Data Block size:", dblock->size);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+        "Number of elements in Data Block:", hdr->cparam.nelmts);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+        "Number of pages in Data Block:", dblock->npages);
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+        "Number of elements per Data Block page:", dblock->dblk_page_nelmts);
+
+    if(dblock->npages) { /* paging */
+        size_t  dblk_page_nelmts;   /* # of elements in a data block page */
+        haddr_t dblk_page_addr;     /* Address of a data block page */
+        size_t  page_idx;           /* Page index within data block */
+
+        HDfprintf(stream, "%*sPaging:\n", indent, "");
+
+        /* Iterate over the pages */
+        dblk_page_addr = dblock->addr + H5FA_DBLOCK_PREFIX_SIZE(dblock);
+        dblk_page_nelmts = dblock->dblk_page_nelmts;
+
+	/* Read and print each page's elements in the data block */
+	for(page_idx = 0; page_idx < dblock->npages; page_idx++) {
+	    if(!H5VM_bit_get(dblock->dblk_page_init, page_idx)) {
+		HDfprintf(stream, "%*s%-*s %Hu %s\n", indent, "", fwidth,
+		    "Page %Zu:", page_idx, "empty");
+
+            } /* end if */
+            else { /* get the page */
+                H5FA_dblk_page_t *dblk_page;    /* Pointer to a data block page */
+                hsize_t  nelmts_left;           /* Remaining elements in the last data block page */
+
+                /* Check for last page */
+                if(((page_idx + 1) == dblock->npages) && (nelmts_left = hdr->cparam.nelmts % dblock->dblk_page_nelmts))
+                    dblk_page_nelmts = (size_t)nelmts_left;
+
+		if(NULL == (dblk_page = H5FA__dblk_page_protect(hdr, dxpl_id, dblk_page_addr, dblk_page_nelmts, H5AC__READ_ONLY_FLAG)))
+		    H5E_THROW(H5E_CANTPROTECT, "unable to protect fixed array data block page, address = %llu", (unsigned long long)dblk_page_addr)
+
+                HDfprintf(stream, "%*sElements in page %Zu:\n", indent, "", page_idx);
+                for(u = 0; u < dblk_page_nelmts; u++) {
+                    /* Call the class's 'debug' callback */
+                    if((hdr->cparam.cls->debug)(stream, (indent + 3), MAX(0, (fwidth - 3)), (hsize_t)u, ((uint8_t *)dblk_page->elmts) + (hdr->cparam.cls->nat_elmt_size * u)) < 0)
+                        H5E_THROW(H5E_CANTGET, "can't get element for debugging")
+                } /* end for */
+                if(H5FA__dblk_page_unprotect(dblk_page, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+                    H5E_THROW(H5E_CANTUNPROTECT, "unable to release fixed array data block page")
+
+                /* Advance to next page address */
+                dblk_page_addr += dblock->dblk_page_size;
+            } /* paging */
+        } /* end for npages */
+    } /* end if */
+    else { /* not paging */
+        /* Print the elements in the data block */
+        HDfprintf(stream, "%*sElements:\n", indent, "");
+        for(u = 0; u < hdr->cparam.nelmts; u++) {
+            /* Call the class's 'debug' callback */
+            if((hdr->cparam.cls->debug)(stream, (indent + 3), MAX(0, (fwidth - 3)), (hsize_t)u, ((uint8_t *)dblock->elmts) + (hdr->cparam.cls->nat_elmt_size * u)) < 0)
+                H5E_THROW(H5E_CANTGET, "can't get element for debugging")
+        } /* end for */
+    } /* end else */
+
+CATCH
+    if(dbg_ctx && cls->dst_dbg_ctx(dbg_ctx) < 0)
+        H5E_THROW(H5E_CANTRELEASE, "unable to release fixed array debugging context")
+    if(dblock && H5FA__dblock_unprotect(dblock, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release fixed array data block")
+    if(hdr && H5FA__hdr_unprotect(hdr, dxpl_id, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release fixed array header")
+
+END_FUNC(PKG)   /* end H5FA__dblock_debug() */
+
diff --git a/src/H5FAdblkpage.c b/src/H5FAdblkpage.c
new file mode 100644
index 0000000..bba4439
--- /dev/null
+++ b/src/H5FAdblkpage.c
@@ -0,0 +1,315 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5FAdblkpage.c
+ *
+ * Purpose:     Data block page routines for fixed array.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5FAmodule.h"         /* This source code file is part of the H5FA module */
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"      /* Generic Functions                        */
+#include "H5Eprivate.h"     /* Error handling                           */
+#include "H5FApkg.h"        /* Fixed Arrays                             */
+#include "H5FLprivate.h"    /* Free Lists                               */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5FA_dblk_page_t struct */
+H5FL_DEFINE_STATIC(H5FA_dblk_page_t);
+
+/* Declare a free list to manage the page elements */
+H5FL_BLK_DEFINE(page_elmts);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__dblk_page_alloc
+ *
+ * Purpose:     Allocate fixed array data block page
+ *
+ * Return:      Non-NULL pointer to data block on success/NULL on failure
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+H5FA_dblk_page_t *, NULL, NULL,
+H5FA__dblk_page_alloc(H5FA_hdr_t *hdr, size_t nelmts))
+
+    /* Local variables */
+    H5FA_dblk_page_t *dblk_page = NULL;          /* Fixed array data block page */
+
+    /* Check arguments */
+    HDassert(hdr);
+
+    /* Allocate memory for the data block */
+    if(NULL == (dblk_page = H5FL_CALLOC(H5FA_dblk_page_t)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for fixed array data block page")
+
+    /* Share common array information */
+    if(H5FA__hdr_incr(hdr) < 0)
+        H5E_THROW(H5E_CANTINC, "can't increment reference count on shared array header")
+    dblk_page->hdr = hdr;
+
+    /* Set non-zero internal fields */
+    dblk_page->nelmts = nelmts;
+
+    /* Allocate buffer for elements in data block page */
+    if(NULL == (dblk_page->elmts = H5FL_BLK_MALLOC(page_elmts, nelmts * hdr->cparam.cls->nat_elmt_size)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for data block page element buffer")
+
+    /* Set the return value */
+    ret_value = dblk_page;
+
+CATCH
+
+    if(!ret_value)
+        if(dblk_page && H5FA__dblk_page_dest(dblk_page) < 0)
+            H5E_THROW(H5E_CANTFREE, "unable to destroy fixed array data block page")
+
+END_FUNC(PKG)   /* end H5FA__dblk_page_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__dblk_page_create
+ *
+ * Purpose:     Creates a new fixed array data block page in the file
+ *
+ * Return:      Valid file address on success/HADDR_UNDEF on failure
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__dblk_page_create(H5FA_hdr_t *hdr, hid_t dxpl_id, haddr_t addr, size_t nelmts))
+
+    /* Local variables */
+    H5FA_dblk_page_t *dblk_page = NULL;      /* Fixed array data block page */
+
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: Called, addr = %a\n", FUNC, addr);
+#endif /* H5FA_DEBUG */
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* Allocate the data block page */
+    if(NULL == (dblk_page = H5FA__dblk_page_alloc(hdr, nelmts)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for fixed array data block page")
+
+    /* Set info about data block page on disk */
+    dblk_page->addr = addr;
+    dblk_page->size = H5FA_DBLK_PAGE_SIZE(hdr, nelmts);
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: dblk_page->size = %Zu\n", FUNC, dblk_page->size);
+#endif /* H5FA_DEBUG */
+
+    /* Clear any elements in data block page to fill value */
+    if((hdr->cparam.cls->fill)(dblk_page->elmts, nelmts) < 0)
+        H5E_THROW(H5E_CANTSET, "can't set fixed array data block page elements to class's fill value")
+
+    /* Cache the new fixed array data block page */
+    if(H5AC_insert_entry(hdr->f, dxpl_id, H5AC_FARRAY_DBLK_PAGE, dblk_page->addr, dblk_page, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTINSERT, "can't add fixed array data block page to cache")
+
+CATCH
+    if(ret_value < 0)
+        if(dblk_page) {
+            /* Destroy data block page */
+            if(H5FA__dblk_page_dest(dblk_page) < 0)
+                H5E_THROW(H5E_CANTFREE, "unable to destroy fixed array data block page")
+        } /* end if */
+
+END_FUNC(PKG)   /* end H5FA__dblk_page_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__dblk_page_protect
+ *
+ * Purpose:     Convenience wrapper around protecting fixed array data
+ *              block page
+ *
+ * Return:      Non-NULL pointer to data block page on success/NULL on failure
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+H5FA_dblk_page_t *, NULL, NULL,
+H5FA__dblk_page_protect(H5FA_hdr_t *hdr, hid_t dxpl_id, haddr_t dblk_page_addr,
+    size_t dblk_page_nelmts, unsigned flags))
+
+    /* Local variables */
+    H5FA_dblk_page_cache_ud_t udata;      /* Information needed for loading data block page */
+
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* H5FA_DEBUG */
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(H5F_addr_defined(dblk_page_addr));
+
+    /* only the H5AC__READ_ONLY_FLAG is permitted */
+    HDassert((flags & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
+    /* Set up user data */
+    udata.hdr = hdr;
+    udata.nelmts = dblk_page_nelmts;
+    udata.dblk_page_addr = dblk_page_addr;
+
+    /* Protect the data block page */
+    if(NULL == (ret_value = (H5FA_dblk_page_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_FARRAY_DBLK_PAGE, dblk_page_addr, &udata, flags)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect fixed array data block page, address = %llu", (unsigned long long)dblk_page_addr)
+
+CATCH
+
+END_FUNC(PKG)   /* end H5FA__dblk_page_protect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__dblk_page_unprotect
+ *
+ * Purpose:     Convenience wrapper around unprotecting fixed array
+ *              data block page
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__dblk_page_unprotect(H5FA_dblk_page_t *dblk_page, hid_t dxpl_id,
+    unsigned cache_flags))
+
+    /* Local variables */
+
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* H5FA_DEBUG */
+
+    /* Sanity check */
+    HDassert(dblk_page);
+
+    /* Unprotect the data block page */
+    if(H5AC_unprotect(dblk_page->hdr->f, dxpl_id, H5AC_FARRAY_DBLK_PAGE, dblk_page->addr, dblk_page, cache_flags) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to unprotect fixed array data block page, address = %llu", (unsigned long long)dblk_page->addr)
+
+CATCH
+
+END_FUNC(PKG)   /* end H5FA__dblk_page_unprotect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__dblk_page_dest
+ *
+ * Purpose:     Destroys a fixed array data block page in memory.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__dblk_page_dest(H5FA_dblk_page_t *dblk_page))
+
+    /* Sanity check */
+    HDassert(dblk_page);
+
+    /* Check if header field has been initialized */
+    if(dblk_page->hdr) {
+        /* Check if buffer for data block page elements has been initialized */
+        if(dblk_page->elmts) {
+            /* Free buffer for data block page elements */
+            dblk_page->elmts = H5FL_BLK_FREE(page_elmts, dblk_page->elmts);
+        } /* end if */
+
+        /* Decrement reference count on shared info */
+        if(H5FA__hdr_decr(dblk_page->hdr) < 0)
+            H5E_THROW(H5E_CANTDEC, "can't decrement reference count on shared array header")
+        dblk_page->hdr = NULL;
+    } /* end if */
+
+    /* Free the data block page itself */
+    dblk_page = H5FL_FREE(H5FA_dblk_page_t, dblk_page);
+
+CATCH
+
+END_FUNC(PKG)   /* end H5FA__dblk_page_dest() */
+
diff --git a/src/H5FAdblock.c b/src/H5FAdblock.c
new file mode 100644
index 0000000..95419f8
--- /dev/null
+++ b/src/H5FAdblock.c
@@ -0,0 +1,443 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5FAdblock.c
+ *
+ * Purpose:     Data block routines for fixed arrays.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5FAmodule.h"         /* This source code file is part of the H5FA module */
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"      /* Generic Functions                        */
+#include "H5Eprivate.h"     /* Error handling                           */
+#include "H5FApkg.h"        /* Fixed Arrays                             */
+#include "H5FLprivate.h"    /* Free Lists                               */
+#include "H5MFprivate.h"    /* File memory management                   */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5FA_dblock_t struct */
+H5FL_DEFINE_STATIC(H5FA_dblock_t);
+
+/* Declare a free list to manage the chunk elements */
+H5FL_BLK_DEFINE(chunk_elmts);
+
+/* Declare a free list to manage blocks of 'page init' bitmasks */
+H5FL_BLK_DEFINE(fa_page_init);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__dblock_alloc
+ *
+ * Purpose:     Allocate fixed array data block
+ *
+ * Return:      Non-NULL pointer to data block on success/NULL on failure
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+H5FA_dblock_t *, NULL, NULL,
+H5FA__dblock_alloc(H5FA_hdr_t *hdr))
+
+    /* Local variables */
+    H5FA_dblock_t *dblock = NULL;          /* fixed array data block */
+
+    /* Check arguments */
+    HDassert(hdr);
+    HDassert(hdr->cparam.nelmts > 0);
+
+    /* Allocate memory for the data block */
+    if(NULL == (dblock = H5FL_CALLOC(H5FA_dblock_t)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for fixed array data block")
+
+    /* Share common array information */
+    if(H5FA__hdr_incr(hdr) < 0)
+        H5E_THROW(H5E_CANTINC, "can't increment reference count on shared array header")
+    dblock->hdr = hdr;
+
+    /* Set non-zero internal fields */
+    dblock->dblk_page_nelmts = (size_t)1 << hdr->cparam.max_dblk_page_nelmts_bits;
+
+    /* Check if this data block should be paged */
+    if(hdr->cparam.nelmts > dblock->dblk_page_nelmts) {
+        /* Compute number of pages */
+        hsize_t npages = ((hdr->cparam.nelmts + dblock->dblk_page_nelmts) - 1) / dblock->dblk_page_nelmts;
+
+        /* Safely assign the number of pages */
+        H5_CHECKED_ASSIGN(dblock->npages, size_t, npages, hsize_t);
+
+        /* Sanity check that we have at least 1 page */
+        HDassert(dblock->npages > 0);
+
+        /* Compute size of 'page init' flag array, in bytes */
+        dblock->dblk_page_init_size = (dblock->npages + 7) / 8;
+        HDassert(dblock->dblk_page_init_size > 0);
+
+        /* Allocate space for 'page init' flags */
+        if(NULL == (dblock->dblk_page_init = H5FL_BLK_CALLOC(fa_page_init, dblock->dblk_page_init_size)))
+            H5E_THROW(H5E_CANTALLOC, "memory allocation failed for page init bitmask")
+
+        /* Compute data block page size */
+        dblock->dblk_page_size = (dblock->dblk_page_nelmts * hdr->cparam.raw_elmt_size) + H5FA_SIZEOF_CHKSUM;
+
+        /* Compute the # of elements on last page */
+        if(0 == hdr->cparam.nelmts % dblock->dblk_page_nelmts)
+            dblock->last_page_nelmts = dblock->dblk_page_nelmts;
+        else
+            dblock->last_page_nelmts = (size_t)(hdr->cparam.nelmts % dblock->dblk_page_nelmts);
+    } /* end if */
+    else {
+        hsize_t dblk_size = hdr->cparam.nelmts * hdr->cparam.cls->nat_elmt_size;
+
+        /* Allocate buffer for elements in data block */
+        H5_CHECK_OVERFLOW(dblk_size, /* From: */hsize_t, /* To: */size_t);
+        if(NULL == (dblock->elmts = H5FL_BLK_MALLOC(chunk_elmts, (size_t)dblk_size)))
+            H5E_THROW(H5E_CANTALLOC, "memory allocation failed for data block element buffer")
+    } /* end else */
+
+    /* Set the return value */
+    ret_value = dblock;
+
+CATCH
+
+    if(!ret_value)
+        if(dblock && H5FA__dblock_dest(dblock) < 0)
+            H5E_THROW(H5E_CANTFREE, "unable to destroy fixed array data block")
+
+END_FUNC(PKG)   /* end H5FA__dblock_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__dblock_create
+ *
+ * Purpose:     Creates a fixed array data block in the file
+ *
+ * Return:      Valid file address on success/HADDR_UNDEF on failure
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+haddr_t, HADDR_UNDEF, HADDR_UNDEF,
+H5FA__dblock_create(H5FA_hdr_t *hdr, hid_t dxpl_id, hbool_t *hdr_dirty))
+
+    /* Local variables */
+    H5FA_dblock_t *dblock = NULL;       /* fixed array data block */
+    haddr_t dblock_addr;                /* fixed array data block address */
+
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: Called, hdr->stats.nelmts = %Zu, nelmts = %Zu\n", FUNC, hdr->stats.nelmts, hdr->cparam.nelmts);
+#endif /* H5FA_DEBUG */
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(hdr_dirty);
+
+    /* Allocate the data block */
+    if(NULL == (dblock = H5FA__dblock_alloc(hdr)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for fixed array data block")
+
+    /* Set size of data block on disk */
+    hdr->stats.dblk_size = dblock->size = H5FA_DBLOCK_SIZE(dblock);
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: dblock->size = %Zu\n", FUNC, dblock->size);
+#endif /* H5FA_DEBUG */
+
+
+    /* Allocate space for the data block on disk */
+    if(HADDR_UNDEF == (dblock_addr = H5MF_alloc(hdr->f, H5FD_MEM_FARRAY_DBLOCK, dxpl_id, (hsize_t)dblock->size)))
+        H5E_THROW(H5E_CANTALLOC, "file allocation failed for fixed array data block")
+    dblock->addr = dblock_addr;
+
+    /* Don't initialize elements if paged */
+    if(!dblock->npages)
+        /* Clear any elements in data block to fill value */
+        if((hdr->cparam.cls->fill)(dblock->elmts, (size_t)hdr->cparam.nelmts) < 0)
+            H5E_THROW(H5E_CANTSET, "can't set fixed array data block elements to class's fill value")
+
+    /* Cache the new fixed array data block */
+    if(H5AC_insert_entry(hdr->f, dxpl_id, H5AC_FARRAY_DBLOCK, dblock_addr, dblock, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTINSERT, "can't add fixed array data block to cache")
+
+    /* Mark the header dirty (for updating statistics) */
+    *hdr_dirty = TRUE;
+
+    /* Set address of data block to return */
+    ret_value = dblock_addr;
+
+CATCH
+
+    if(!H5F_addr_defined(ret_value))
+        if(dblock) {
+            /* Release data block's disk space */
+            if(H5F_addr_defined(dblock->addr) && H5MF_xfree(hdr->f, H5FD_MEM_FARRAY_DBLOCK, dxpl_id, dblock->addr, (hsize_t)dblock->size) < 0)
+                H5E_THROW(H5E_CANTFREE, "unable to release fixed array data block")
+
+            /* Destroy data block */
+            if(H5FA__dblock_dest(dblock) < 0)
+                H5E_THROW(H5E_CANTFREE, "unable to destroy fixed array data block")
+        } /* end if */
+
+END_FUNC(PKG)   /* end H5FA__dblock_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__dblock_protect
+ *
+ * Purpose:     Convenience wrapper around protecting fixed array data block
+ *
+ * Return:      Non-NULL pointer to data block on success/NULL on failure
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+H5FA_dblock_t *, NULL, NULL,
+H5FA__dblock_protect(H5FA_hdr_t *hdr, hid_t dxpl_id, haddr_t dblk_addr,
+    unsigned flags))
+
+    /* Local variables */
+    H5FA_dblock_cache_ud_t udata;      /* Information needed for loading data block */
+
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* H5FA_DEBUG */
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(H5F_addr_defined(dblk_addr));
+
+    /* only the H5AC__READ_ONLY_FLAG flag is permitted */
+    HDassert((flags & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
+    /* Set up user data */
+    udata.hdr = hdr;
+    udata.dblk_addr = dblk_addr;
+
+    /* Protect the data block */
+    if(NULL == (ret_value = (H5FA_dblock_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_FARRAY_DBLOCK, dblk_addr, &udata, flags)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect fixed array data block, address = %llu", (unsigned long long)dblk_addr)
+
+CATCH
+
+END_FUNC(PKG)   /* end H5FA__dblock_protect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__dblock_unprotect
+ *
+ * Purpose:     Convenience wrapper around unprotecting fixed array data block
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__dblock_unprotect(H5FA_dblock_t *dblock, hid_t dxpl_id, unsigned cache_flags))
+
+    /* Local variables */
+
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* H5FA_DEBUG */
+
+    /* Sanity check */
+    HDassert(dblock);
+
+    /* Unprotect the data block */
+    if(H5AC_unprotect(dblock->hdr->f, dxpl_id, H5AC_FARRAY_DBLOCK, dblock->addr, dblock, cache_flags) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to unprotect fixed array data block, address = %llu", (unsigned long long)dblock->addr)
+
+CATCH
+
+END_FUNC(PKG)   /* end H5FA__dblock_unprotect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__dblock_delete
+ *
+ * Purpose:     Delete a data block
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__dblock_delete(H5FA_hdr_t *hdr, hid_t dxpl_id, haddr_t dblk_addr))
+
+    /* Local variables */
+    H5FA_dblock_t *dblock = NULL;       /* Pointer to data block */
+
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* H5FA_DEBUG */
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(H5F_addr_defined(dblk_addr));
+
+    /* Protect data block */
+    if(NULL == (dblock = H5FA__dblock_protect(hdr, dxpl_id, dblk_addr, H5AC__NO_FLAGS_SET)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect fixed array data block, address = %llu", (unsigned long long)dblk_addr)
+
+    /* Check if data block is paged */
+    if(dblock->npages) {
+        haddr_t dblk_page_addr;         /* Address of each data block page */
+        size_t u;                       /* Local index variable */
+
+        /* Set up initial state */
+        dblk_page_addr = dblk_addr + H5FA_DBLOCK_PREFIX_SIZE(dblock);
+
+        /* Iterate over pages in data block */
+        for(u = 0; u < dblock->npages; u++) {
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: Expunging data block page from cache\n", FUNC);
+#endif /* H5FA_DEBUG */
+            /* Evict the data block page from the metadata cache */
+            /* (OK to call if it doesn't exist in the cache) */
+            if(H5AC_expunge_entry(hdr->f, dxpl_id, H5AC_FARRAY_DBLK_PAGE, dblk_page_addr, H5AC__NO_FLAGS_SET) < 0)
+                H5E_THROW(H5E_CANTEXPUNGE, "unable to remove array data block page from metadata cache")
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: Done expunging data block page from cache\n", FUNC);
+#endif /* H5FA_DEBUG */
+
+            /* Advance to next page address */
+            dblk_page_addr += dblock->dblk_page_size;
+        } /* end for */
+    } /* end if */
+
+CATCH
+
+    /* Finished deleting data block in metadata cache */
+    if(dblock && H5FA__dblock_unprotect(dblock, dxpl_id, H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release fixed array data block")
+
+END_FUNC(PKG)   /* end H5FA__dblock_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__dblock_dest
+ *
+ * Purpose:     Destroys a fixed array data block in memory.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__dblock_dest(H5FA_dblock_t *dblock))
+
+    /* Sanity check */
+    HDassert(dblock);
+
+    /* Check if shared header field has been initialized */
+    if(dblock->hdr) {
+        /* Check if we've got elements in the data block */
+        if(dblock->elmts && !dblock->npages) {
+            /* Free buffer for data block elements */
+            HDassert(dblock->hdr->cparam.nelmts > 0);
+            dblock->elmts = H5FL_BLK_FREE(chunk_elmts, dblock->elmts);
+        } /* end if */
+
+        /* Check if data block is paged */
+        if(dblock->npages) {
+            /* Free buffer for 'page init' bitmask, if there is one */
+            HDassert(dblock->dblk_page_init_size > 0);
+            if(dblock->dblk_page_init)
+                dblock->dblk_page_init = H5FL_BLK_FREE(fa_page_init, dblock->dblk_page_init);
+        } /* end if */
+
+        /* Decrement reference count on shared info */
+        if(H5FA__hdr_decr(dblock->hdr) < 0)
+            H5E_THROW(H5E_CANTDEC, "can't decrement reference count on shared array header")
+        dblock->hdr = NULL;
+    } /* end if */
+
+    /* Free the data block itself */
+    dblock = H5FL_FREE(H5FA_dblock_t, dblock);
+
+CATCH
+
+END_FUNC(PKG)   /* end H5FA__dblock_dest() */
+
diff --git a/src/H5FAhdr.c b/src/H5FAhdr.c
new file mode 100644
index 0000000..a71d92e
--- /dev/null
+++ b/src/H5FAhdr.c
@@ -0,0 +1,565 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5FAhdr.c
+ *
+ * Purpose:     Array header routines for Fixed Array.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5FAmodule.h"         /* This source code file is part of the H5FA module */
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"      /* Generic Functions                            */
+#include "H5Eprivate.h"     /* Error handling                               */
+#include "H5FApkg.h"        /* Fixed Arrays                                 */
+#include "H5MFprivate.h"    /* File memory management                       */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5FA_hdr_t struct */
+H5FL_DEFINE_STATIC(H5FA_hdr_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__hdr_alloc
+ *
+ * Purpose:     Allocate shared Fixed Array header
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+H5FA_hdr_t *, NULL, NULL,
+H5FA__hdr_alloc(H5F_t *f))
+
+    /* Local variables */
+    H5FA_hdr_t *hdr = NULL;          /* Shared Fixed Array header */
+
+    /* Check arguments */
+    HDassert(f);
+
+    /* Allocate space for the shared information */
+    if(NULL == (hdr = H5FL_CALLOC(H5FA_hdr_t)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for Fixed Array shared header")
+
+    /* Set non-zero internal fields */
+    hdr->addr = HADDR_UNDEF;
+    hdr->fd_parent_addr = HADDR_UNDEF;
+    hdr->fd_parent_ptr = NULL;
+
+    /* Set the internal parameters for the array */
+    hdr->f = f;
+    hdr->swmr_write = (H5F_INTENT(f) & H5F_ACC_SWMR_WRITE) > 0;
+    hdr->sizeof_addr = H5F_SIZEOF_ADDR(f);
+    hdr->sizeof_size = H5F_SIZEOF_SIZE(f);
+
+    /* Set the return value */
+    ret_value = hdr;
+
+CATCH
+    if(!ret_value)
+        if(hdr && H5FA__hdr_dest(hdr) < 0)
+            H5E_THROW(H5E_CANTFREE, "unable to destroy fixed array header")
+
+END_FUNC(PKG)   /* end H5FA__hdr_alloc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__hdr_init
+ *
+ * Purpose:     Initialize shared fixed array header
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              Sunday, November 15, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__hdr_init(H5FA_hdr_t *hdr, void *ctx_udata))
+
+    /* Local variables */
+
+    /* Check arguments */
+    HDassert(hdr);
+
+    /* Set size of header on disk (locally and in statistics) */
+    hdr->stats.hdr_size = hdr->size = H5FA_HEADER_SIZE_HDR(hdr);
+
+    /* Set number of elements for Fixed Array in statistics */
+    hdr->stats.nelmts = hdr->cparam.nelmts;
+
+    /* Create the callback context, if there's one */
+    if(hdr->cparam.cls->crt_context) {
+        if(NULL == (hdr->cb_ctx = (*hdr->cparam.cls->crt_context)(ctx_udata)))
+            H5E_THROW(H5E_CANTCREATE, "unable to create fixed array client callback context")
+    } /* end if */
+
+CATCH
+
+END_FUNC(PKG)   /* end H5FA__hdr_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__hdr_create
+ *
+ * Purpose:     Creates a new Fixed Array header in the file
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+haddr_t, HADDR_UNDEF, HADDR_UNDEF,
+H5FA__hdr_create(H5F_t *f, hid_t dxpl_id, const H5FA_create_t *cparam,
+    void *ctx_udata))
+
+    /* Local variables */
+    H5FA_hdr_t *hdr = NULL;     /* Fixed array header */
+
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* H5FA_DEBUG */
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(cparam);
+
+#ifndef NDEBUG
+{
+    /* Check for valid parameters */
+    if(cparam->raw_elmt_size == 0)
+        H5E_THROW(H5E_BADVALUE, "element size must be greater than zero")
+    if(cparam->max_dblk_page_nelmts_bits == 0)
+        H5E_THROW(H5E_BADVALUE, "max. # of elements bits must be greater than zero")
+    if(cparam->nelmts == 0)
+        H5E_THROW(H5E_BADVALUE, "# of elements must be greater than zero")
+}
+#endif /* NDEBUG */
+
+    /* Allocate space for the shared information */
+    if(NULL == (hdr = H5FA__hdr_alloc(f)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for Fixed Array shared header")
+
+    hdr->dblk_addr = HADDR_UNDEF;
+
+    /* Set the creation parameters for the array */
+    HDmemcpy(&hdr->cparam, cparam, sizeof(hdr->cparam));
+
+    /* Finish initializing fixed array header */
+    if(H5FA__hdr_init(hdr, ctx_udata) < 0)
+        H5E_THROW(H5E_CANTINIT, "initialization failed for fixed array header")
+
+    /* Allocate space for the header on disk */
+    if(HADDR_UNDEF == (hdr->addr = H5MF_alloc(f, H5FD_MEM_FARRAY_HDR, dxpl_id, (hsize_t)hdr->size)))
+        H5E_THROW(H5E_CANTALLOC, "file allocation failed for Fixed Array header")
+
+    /* Cache the new Fixed Array header */
+    if(H5AC_insert_entry(f, dxpl_id, H5AC_FARRAY_HDR, hdr->addr, hdr, H5AC__NO_FLAGS_SET) < 0)
+        H5E_THROW(H5E_CANTINSERT, "can't add fixed array header to cache")
+
+    /* Set address of array header to return */
+    ret_value = hdr->addr;
+
+CATCH
+    if(!H5F_addr_defined(ret_value))
+        if(hdr) {
+            /* Release header's disk space */
+            if(H5F_addr_defined(hdr->addr) && H5MF_xfree(f, H5FD_MEM_FARRAY_HDR, dxpl_id, hdr->addr, (hsize_t)hdr->size) < 0)
+                H5E_THROW(H5E_CANTFREE, "unable to free Fixed Array header")
+
+            /* Destroy header */
+            if(H5FA__hdr_dest(hdr) < 0)
+                H5E_THROW(H5E_CANTFREE, "unable to destroy Fixed Array header")
+        } /* end if */
+
+END_FUNC(PKG)   /* end H5FA__hdr_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__hdr_incr
+ *
+ * Purpose:     Increment component reference count on shared array header
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__hdr_incr(H5FA_hdr_t *hdr))
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* Mark header as un-evictable when something is depending on it */
+    if(hdr->rc == 0)
+        if(H5AC_pin_protected_entry(hdr) < 0)
+            H5E_THROW(H5E_CANTPIN, "unable to pin fixed array header")
+
+    /* Increment reference count on shared header */
+    hdr->rc++;
+
+CATCH
+
+END_FUNC(PKG)   /* end H5FA__hdr_incr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__hdr_decr
+ *
+ * Purpose:     Decrement component reference count on shared array header
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__hdr_decr(H5FA_hdr_t *hdr))
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(hdr->rc);
+
+    /* Decrement reference count on shared header */
+    hdr->rc--;
+
+    /* Mark header as evictable again when nothing depend on it */
+    if(hdr->rc == 0) {
+        HDassert(hdr->file_rc == 0);
+        if(H5AC_unpin_entry(hdr) < 0)
+            H5E_THROW(H5E_CANTUNPIN, "unable to unpin fixed array header")
+    } /* end if */
+
+CATCH
+
+END_FUNC(PKG)   /* end H5FA__hdr_decr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__hdr_fuse_incr
+ *
+ * Purpose:     Increment file reference count on shared array header
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, NOERR,
+herr_t, SUCCEED, -,
+H5FA__hdr_fuse_incr(H5FA_hdr_t *hdr))
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* Increment file reference count on shared header */
+    hdr->file_rc++;
+
+END_FUNC(PKG)   /* end H5FA__hdr_fuse_incr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__hdr_fuse_decr
+ *
+ * Purpose:     Decrement file reference count on shared array header
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, NOERR,
+size_t, 0, -,
+H5FA__hdr_fuse_decr(H5FA_hdr_t *hdr))
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(hdr->file_rc);
+
+    /* Decrement file reference count on shared header */
+    hdr->file_rc--;
+
+    /* Set return value */
+    ret_value = hdr->file_rc;
+
+END_FUNC(PKG)   /* end H5FA__hdr_fuse_decr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__hdr_modified
+ *
+ * Purpose:     Mark a fixed array as modified
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__hdr_modified(H5FA_hdr_t *hdr))
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* Mark header as dirty in cache */
+    if(H5AC_mark_entry_dirty(hdr) < 0)
+        H5E_THROW(H5E_CANTMARKDIRTY, "unable to mark fixed array header as dirty")
+
+CATCH
+
+END_FUNC(PKG)   /* end H5FA__hdr_modified() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FA__hdr_protect
+ *
+ * Purpose:	Convenience wrapper around protecting fixed array header
+ *
+ * Return:	Non-NULL pointer to header on success/NULL on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 12 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+H5FA_hdr_t *, NULL, NULL,
+H5FA__hdr_protect(H5F_t *f, hid_t dxpl_id, haddr_t fa_addr, void *ctx_udata,
+    unsigned flags))
+
+    /* Local variables */
+    H5FA_hdr_cache_ud_t udata;  /* User data for cache callbacks */
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(H5F_addr_defined(fa_addr));
+
+    /* only the H5AC__READ_ONLY_FLAG is permitted */
+    HDassert((flags & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
+    /* Set up user data for cache callbacks */
+    udata.f = f;
+    udata.addr = fa_addr;
+    udata.ctx_udata = ctx_udata;
+
+    /* Protect the header */
+    if(NULL == (ret_value = (H5FA_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_FARRAY_HDR, fa_addr, &udata, flags)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to protect fixed array header, address = %llu", (unsigned long long)fa_addr)
+    ret_value->f = f;   /* (Must be set again here, in case the header was already in the cache -QAK) */
+
+CATCH
+
+END_FUNC(PKG)   /* end H5FA__hdr_protect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FA__hdr_unprotect
+ *
+ * Purpose:	Convenience wrapper around unprotecting fixed array header
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 12 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__hdr_unprotect(H5FA_hdr_t *hdr, hid_t dxpl_id, unsigned cache_flags))
+
+    /* Local variables */
+
+    /* Sanity check */
+    HDassert(hdr);
+
+    /* Unprotect the header */
+    if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_FARRAY_HDR, hdr->addr, hdr, cache_flags) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to unprotect fixed array hdr, address = %llu", (unsigned long long)hdr->addr)
+
+CATCH
+
+END_FUNC(PKG)   /* end H5EA__hdr_unprotect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FA__hdr_delete
+ *
+ * Purpose:     Delete a fixed array, starting with the header
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__hdr_delete(H5FA_hdr_t *hdr, hid_t dxpl_id))
+
+    /* Local variables */
+    unsigned cache_flags = H5AC__NO_FLAGS_SET;  /* Flags for unprotecting header */
+
+    /* Sanity check */
+    HDassert(hdr);
+    HDassert(!hdr->file_rc);
+
+#ifndef NDEBUG
+{
+    unsigned hdr_status = 0;         /* Array header's status in the metadata cache */
+
+    /* Check the array header's status in the metadata cache */
+    if(H5AC_get_entry_status(hdr->f, hdr->addr, &hdr_status) < 0)
+        H5E_THROW(H5E_CANTGET, "unable to check metadata cache status for array header")
+
+    /* Sanity checks on array header */
+    HDassert(hdr_status & H5AC_ES__IN_CACHE);
+    HDassert(hdr_status & H5AC_ES__IS_PROTECTED);
+} /* end block */
+#endif /* NDEBUG */
+
+    /* Check for Fixed Array Data block */
+    if(H5F_addr_defined(hdr->dblk_addr)) {
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: hdr->dblk_addr = %a\n", FUNC, hdr->dblk_addr);
+#endif /* H5FA_DEBUG */
+
+        /* Delete Fixed Array Data block */
+        if(H5FA__dblock_delete(hdr, dxpl_id, hdr->dblk_addr) < 0)
+            H5E_THROW(H5E_CANTDELETE, "unable to delete fixed array data block")
+    } /* end if */
+
+    /* Set flags to finish deleting header on unprotect */
+    cache_flags |= H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+
+CATCH
+
+    /* Unprotect the header, deleting it if an error hasn't occurred */
+    if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_FARRAY_HDR, hdr->addr, hdr, cache_flags) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release fixed array header")
+
+END_FUNC(PKG)   /* end H5FA__hdr_delete() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__hdr_dest
+ *
+ * Purpose:     Destroys a fixed array header in memory.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__hdr_dest(H5FA_hdr_t *hdr))
+
+    /* Check arguments */
+    HDassert(hdr);
+    HDassert(hdr->rc == 0);
+
+    /* Destroy the callback context */
+    if(hdr->cb_ctx) {
+        if((*hdr->cparam.cls->dst_context)(hdr->cb_ctx) < 0)
+            H5E_THROW(H5E_CANTRELEASE, "unable to destroy fixed array client callback context")
+    } /* end if */
+    hdr->cb_ctx = NULL;
+
+    /* Free the shared info itself */
+    hdr = H5FL_FREE(H5FA_hdr_t, hdr);
+
+CATCH
+
+END_FUNC(PKG)   /* end H5FA__hdr_dest() */
+
diff --git a/src/H5FAint.c b/src/H5FAint.c
new file mode 100644
index 0000000..331227b
--- /dev/null
+++ b/src/H5FAint.c
@@ -0,0 +1,139 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5FAint.c
+ *              Fall 2012
+ *              Dana Robinson <derobins at hdfgroup.org>
+ *
+ * Purpose:     Internal routines for fixed arrays.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5FAmodule.h"         /* This source code file is part of the H5FA module */
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"              /* Generic Functions                */
+#include "H5Eprivate.h"             /* Error Handling                   */
+#include "H5FApkg.h"                /* Fixed Arrays                     */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__create_flush_depend
+ *
+ * Purpose:     Create a flush dependency between two data structure components
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__create_flush_depend(H5AC_info_t *parent_entry, H5AC_info_t *child_entry))
+
+    /* Sanity check */
+    HDassert(parent_entry);
+    HDassert(child_entry);
+
+    /* Create a flush dependency between parent and child entry */
+    if(H5AC_create_flush_dependency(parent_entry, child_entry) < 0)
+        H5E_THROW(H5E_CANTDEPEND, "unable to create flush dependency")
+
+CATCH
+
+END_FUNC(PKG)   /* end H5FA__create_flush_depend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__destroy_flush_depend
+ *
+ * Purpose:     Destroy a flush dependency between two data structure components
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5FA__destroy_flush_depend(H5AC_info_t *parent_entry, H5AC_info_t *child_entry))
+
+    /* Sanity check */
+    HDassert(parent_entry);
+    HDassert(child_entry);
+
+    /* Destroy a flush dependency between parent and child entry */
+    if(H5AC_destroy_flush_dependency(parent_entry, child_entry) < 0)
+        H5E_THROW(H5E_CANTUNDEPEND, "unable to destroy flush dependency")
+
+CATCH
+
+END_FUNC(PKG)   /* end H5FA__destroy_flush_depend() */
+
diff --git a/src/H5FAmodule.h b/src/H5FAmodule.h
new file mode 100644
index 0000000..e46b071
--- /dev/null
+++ b/src/H5FAmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5FA package.  Including this header means that the source file
+ *		is part of the H5FA package.
+ */
+#ifndef _H5FAmodule_H
+#define _H5FAmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5FA_MODULE
+#define H5_MY_PKG       H5FA
+#define H5_MY_PKG_ERR   H5E_FARRAY
+#define H5_MY_PKG_INIT  NO
+
+#endif /* _H5FAmodule_H */
+
diff --git a/src/H5FApkg.h b/src/H5FApkg.h
new file mode 100644
index 0000000..890bf39
--- /dev/null
+++ b/src/H5FApkg.h
@@ -0,0 +1,331 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:
+ *
+ * Purpose:    This file contains declarations which are visible only within
+ *        the H5FA package.  Source files outside the H5FA package should
+ *        include H5FAprivate.h instead.
+ */
+#if !(defined(H5FA_FRIEND) | defined(H5FA_MODULE))
+#error "Do not include this file outside the H5FA package!"
+#endif
+
+#ifndef _H5FApkg_H
+#define _H5FApkg_H
+
+/* Get package's private header */
+#include "H5FAprivate.h"
+
+/* Other private headers needed by this file */
+#include "H5ACprivate.h"    /* Metadata cache                       */
+#include "H5FLprivate.h"    /* Free Lists                           */
+
+
+/**************************/
+/* Package Private Macros */
+/**************************/
+
+/* Define this to display debugging information for the Fixed Array layer */
+/* #define H5FA_DEBUG */
+
+
+/* Fill value for fixed array test class */
+#ifdef H5FA_TESTING
+#define H5FA_TEST_FILL          ((uint64_t)ULLONG_MAX)
+#endif /* H5FA_TESTING */
+
+/* Size of checksum information (on disk) */
+#define H5FA_SIZEOF_CHKSUM      4
+
+/* "Standard" size of prefix information for fixed array metadata */
+#define H5FA_METADATA_PREFIX_SIZE(c) (                                      \
+    H5_SIZEOF_MAGIC                     /* Signature            */          \
+    + 1                                 /* Version              */          \
+    + 1                                 /* Array type           */          \
+    + ((c) ? H5FA_SIZEOF_CHKSUM : 0)    /* Metadata checksum    */          \
+    )
+
+/* Size of the Fixed Array header on disk */
+#define H5FA_HEADER_SIZE(sizeof_addr, sizeof_size) (                          \
+    /* General metadata fields */                                             \
+    H5FA_METADATA_PREFIX_SIZE(TRUE)                                           \
+                                                                              \
+    /* General array information */                                           \
+    + 1 /* Element Size */                                                    \
+    + 1 /* Log2(Max. # of elements in data block page) - i.e. # of bits needed to store max. # of elements in data block page */ \
+                                                                              \
+    /* Fixed Array statistics fields */                                       \
+    + (sizeof_size) /* # of elements in the fixed array */    		      \
+                                                                              \
+    /* Fixed Array Header specific fields */                                  \
+    + (sizeof_addr) /* File address of Fixed Array data block */  	      \
+    )
+
+/* Size of the fixed array header on disk (via file pointer) */
+#define H5FA_HEADER_SIZE_FILE(f)   (                                          \
+    H5FA_HEADER_SIZE(H5F_SIZEOF_ADDR(f), H5F_SIZEOF_SIZE(f))                  \
+    )
+
+/* Size of the fixed array header on disk (via fixed array header) */
+#define H5FA_HEADER_SIZE_HDR(h)   (                                           \
+    H5FA_HEADER_SIZE((h)->sizeof_addr, (h)->sizeof_size)                      \
+    )
+
+/* Size of the Fixed Array data block prefix on disk */
+#define H5FA_DBLOCK_PREFIX_SIZE(d)  (                                       \
+    /* General metadata fields */                                           \
+    H5FA_METADATA_PREFIX_SIZE(TRUE)                                         \
+                                                                            \
+    /* Sanity-checking fields */                                            \
+    + (d)->hdr->sizeof_addr        /* File address of Fixed Array header owning the data block */   \
+                                                                            \
+    /* Fixed Array Data Block specific fields */                            \
+    + (d)->dblk_page_init_size /* Fixed array data block 'page init' bitmasks (can be 0 if no pages) */ \
+    )
+
+/* Size of the Fixed Array data block on disk */
+#define H5FA_DBLOCK_SIZE(d)  (                                              \
+    /* Data block prefix size  */                                           \
+    H5FA_DBLOCK_PREFIX_SIZE(d)                                              \
+                                                                            \
+    /* Fixed Array Elements|Pages of Elements*/                             \
+    + ((d)->hdr->cparam.nelmts * (size_t)(d)->hdr->cparam.raw_elmt_size)    \
+    + ((d)->npages * H5FA_SIZEOF_CHKSUM)        /* Checksum */              \
+    )
+
+/* Size of the Fixed Array data block page on disk */
+#define H5FA_DBLK_PAGE_SIZE(h, nelmts)     (                                  \
+    /* Fixed Array Data Block Page */					      \
+    + (nelmts * (size_t)(h)->cparam.raw_elmt_size) /* Elements in data block page */  \
+    + H5FA_SIZEOF_CHKSUM                        	/* Checksum for each page */  	   \
+    )
+
+/****************************/
+/* Package Private Typedefs */
+/****************************/
+
+/* The Fixed Array header information */
+typedef struct H5FA_hdr_t {
+    /* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t cache_info;
+
+    /* Fixed array configuration/creation parameters (stored in header) */
+    H5FA_create_t cparam;               /* Creation parameters for Fixed Array */
+
+    /* Fixed Array data block information (stored in header) */
+    haddr_t dblk_addr;                   /* Address of Fixed Array Data block */
+
+    /* Statistics for Fixed Array (stored in header) */
+    H5FA_stat_t stats;                  /* Statistcs for Fixed Array */
+
+    /* Computed/cached values (not stored in header) */
+    size_t rc;                          /* Reference count of the header                                */
+    haddr_t addr;                       /* Address of header in file                                    */
+    size_t size;                        /* Size of header in file                                       */
+    H5F_t *f;                           /* Pointer to file for fixed array                              */
+    hbool_t swmr_write;                 /* Flag indicating the file is opened with SWMR-write access    */
+    size_t file_rc;                     /* Reference count of files using array header                  */
+    hbool_t pending_delete;             /* Array is pending deletion                                    */
+    size_t sizeof_addr;                 /* Size of file addresses                                       */
+    size_t sizeof_size;                 /* Size of file sizes                                           */
+
+    /* Client information (not stored) */
+    void *cb_ctx;                       /* Callback context */
+
+    /* Flush depencency parent information (not stored) */
+    haddr_t fd_parent_addr;             /* Address of flush dependency parent,
+                                         * if any.  This field is initialized
+                                         * to HADDR_UNDEF.  If the fixed
+                                         * array is being used to index a 
+                                         * chunked data set and the dataset
+                                         * metadata is modified by a SWMR 
+                                         * writer, this field will be set equal
+                                         * to the object header proxy that is 
+                                         * the flush dependency parent of the
+                                         * fixed array header.
+                                         *
+                                         * The field is used to avoid duplicate
+                                         * setups of the flush dependency 
+                                         * relationship, and to allow the 
+                                         * fixed array header to destroy
+                                         * the flush dependency on receipt of 
+                                         * an eviction notification from the
+                                         * metadata cache.
+                                         */
+
+    H5AC_info_t *fd_parent_ptr;		    /* Pointer to flush dependency parent,
+                                         * if it exists, otherwise NULL.  (See
+                                         * comment for fd_parent_addr above for
+                                         * further details)
+                                         */
+} H5FA_hdr_t;
+
+/* The fixed array data block information */
+typedef struct H5FA_dblock_t {
+    /* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t cache_info;
+
+    /* Fixed array information (stored) */
+    uint8_t     *dblk_page_init;/* Bitmap of whether a data block page is initialized       */
+    void        *elmts;         /* Buffer for elements stored in data block                 */
+
+    /* Internal array information (not stored) */
+    H5FA_hdr_t    *hdr;            /* Shared array header info                              */
+
+    /* Computed/cached values (not stored) */
+    haddr_t     addr;               /* Address of this data block on disk                   */
+    hsize_t     size;               /* Size of data block on disk                           */
+    size_t      npages;             /* Nummber of pages in data block (zero if not paged)   */
+    size_t      last_page_nelmts;   /* Nummber of elements in last page, if paged           */
+
+    /* Fixed Array data block information (not stored) */
+    size_t dblk_page_nelmts;        /* # of elements per data block page                    */
+    size_t dblk_page_size;          /* Size of a data block page                            */
+    size_t dblk_page_init_size;     /* Size of 'page init' bitmask                          */
+} H5FA_dblock_t;
+
+/* The fixed array data block page information */
+typedef struct H5FA_dbk_page_t {
+    /* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t cache_info;
+
+    /* Fixed array information (stored) */
+    void        *elmts;         /* Buffer for elements stored in data block page */
+
+    /* Internal array information (not stored) */
+    H5FA_hdr_t    *hdr;         /* Shared array header info                     */
+
+    /* Computed/cached values (not stored) */
+    haddr_t     addr;           /* Address of this data block page on disk      */
+    size_t      size;           /* Size of data block page on disk              */
+    size_t      nelmts;         /* Number of elements in data block page        */
+} H5FA_dblk_page_t;
+
+/* Fixed array */
+struct H5FA_t {
+    H5FA_hdr_t  *hdr;           /* Pointer to internal fixed array header info  */
+    H5F_t      *f;              /* Pointer to file for fixed array              */
+};
+
+
+/* Metadata cache callback user data types */
+
+/* Info needed for loading header */
+typedef struct H5FA_hdr_cache_ud_t {
+    H5F_t      *f;              /* Pointer to file for fixed array */
+    haddr_t    addr;            /* Address of header on disk */
+    void       *ctx_udata;      /* User context for class */
+} H5FA_hdr_cache_ud_t;
+
+/* Info needed for loading data block */
+typedef struct H5FA_dblock_cache_ud_t {
+    H5FA_hdr_t *hdr;            /* Shared fixed array information       */
+    haddr_t     dblk_addr;      /* Address of data block on disk        */
+} H5FA_dblock_cache_ud_t;
+
+/* Info needed for loading data block page */
+typedef struct H5FA_dblk_page_cache_ud_t {
+    H5FA_hdr_t *hdr;            /* Shared fixed array information           */
+    size_t nelmts;              /* Number of elements in data block page    */
+    haddr_t     dblk_page_addr; /* Address of data block page on disk */
+} H5FA_dblk_page_cache_ud_t;
+
+
+/*****************************/
+/* Package Private Variables */
+/*****************************/
+
+/* H5FA header inherits cache-like properties from H5AC */
+H5_DLLVAR const H5AC_class_t H5AC_FARRAY_HDR[1];
+
+/* H5FA data block inherits cache-like properties from H5AC */
+H5_DLLVAR const H5AC_class_t H5AC_FARRAY_DBLOCK[1];
+
+/* H5FA data block page inherits cache-like properties from H5AC */
+H5_DLLVAR const H5AC_class_t H5AC_FARRAY_DBLK_PAGE[1];
+
+/* Internal fixed array testing class */
+H5_DLLVAR const H5FA_class_t H5FA_CLS_TEST[1];
+
+/* Array of fixed array client ID -> client class mappings */
+H5_DLLVAR const H5FA_class_t *const H5FA_client_class_g[H5FA_NUM_CLS_ID];
+
+
+/******************************/
+/* Package Private Prototypes */
+/******************************/
+
+/* Generic routines */
+H5_DLL herr_t H5FA__create_flush_depend(H5AC_info_t *parent_entry,
+    H5AC_info_t *child_entry);
+H5_DLL herr_t H5FA__destroy_flush_depend(H5AC_info_t *parent_entry,
+    H5AC_info_t *child_entry);
+
+/* Header routines */
+H5_DLL H5FA_hdr_t *H5FA__hdr_alloc(H5F_t *f);
+H5_DLL herr_t H5FA__hdr_init(H5FA_hdr_t *hdr, void *ctx_udata);
+H5_DLL haddr_t H5FA__hdr_create(H5F_t *f, hid_t dxpl_id, const H5FA_create_t *cparam, void *ctx_udata);
+H5_DLL void *H5FA__hdr_alloc_elmts(H5FA_hdr_t *hdr, size_t nelmts);
+H5_DLL herr_t H5FA__hdr_free_elmts(H5FA_hdr_t *hdr, size_t nelmts, void *elmts);
+H5_DLL herr_t H5FA__hdr_incr(H5FA_hdr_t *hdr);
+H5_DLL herr_t H5FA__hdr_decr(H5FA_hdr_t *hdr);
+H5_DLL herr_t H5FA__hdr_fuse_incr(H5FA_hdr_t *hdr);
+H5_DLL size_t H5FA__hdr_fuse_decr(H5FA_hdr_t *hdr);
+H5_DLL herr_t H5FA__hdr_modified(H5FA_hdr_t *hdr);
+H5_DLL H5FA_hdr_t *H5FA__hdr_protect(H5F_t *f, hid_t dxpl_id, haddr_t fa_addr,
+    void *ctx_udata, unsigned flags);
+H5_DLL herr_t H5FA__hdr_unprotect(H5FA_hdr_t *hdr, hid_t dxpl_id, unsigned cache_flags);
+H5_DLL herr_t H5FA__hdr_delete(H5FA_hdr_t *hdr, hid_t dxpl_id);
+H5_DLL herr_t H5FA__hdr_dest(H5FA_hdr_t *hdr);
+
+/* Data block routines */
+H5_DLL H5FA_dblock_t *H5FA__dblock_alloc(H5FA_hdr_t *hdr);
+H5_DLL haddr_t H5FA__dblock_create(H5FA_hdr_t *hdr, hid_t dxpl_id, hbool_t *hdr_dirty);
+H5_DLL unsigned H5FA__dblock_sblk_idx(const H5FA_hdr_t *hdr, hsize_t idx);
+H5_DLL H5FA_dblock_t *H5FA__dblock_protect(H5FA_hdr_t *hdr, hid_t dxpl_id,
+    haddr_t dblk_addr, unsigned flags);
+H5_DLL herr_t H5FA__dblock_unprotect(H5FA_dblock_t *dblock, hid_t dxpl_id,
+    unsigned cache_flags);
+H5_DLL herr_t H5FA__dblock_delete(H5FA_hdr_t *hdr, hid_t dxpl_id,
+    haddr_t dblk_addr);
+H5_DLL herr_t H5FA__dblock_dest(H5FA_dblock_t *dblock);
+
+/* Data block page routines */
+H5_DLL herr_t H5FA__dblk_page_create(H5FA_hdr_t *hdr, hid_t dxpl_id,
+    haddr_t addr, size_t nelmts);
+H5_DLL H5FA_dblk_page_t *H5FA__dblk_page_alloc(H5FA_hdr_t *hdr, size_t nelmts);
+H5_DLL H5FA_dblk_page_t *H5FA__dblk_page_protect(H5FA_hdr_t *hdr, hid_t dxpl_id,
+    haddr_t dblk_page_addr, size_t dblk_page_nelmts, unsigned flags);
+H5_DLL herr_t H5FA__dblk_page_unprotect(H5FA_dblk_page_t *dblk_page,
+    hid_t dxpl_id, unsigned cache_flags);
+H5_DLL herr_t H5FA__dblk_page_dest(H5FA_dblk_page_t *dblk_page);
+
+/* Debugging routines for dumping file structures */
+H5_DLL herr_t H5FA__hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    FILE *stream, int indent, int fwidth, const H5FA_class_t *cls, haddr_t obj_addr);
+H5_DLL herr_t H5FA__dblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
+    FILE *stream, int indent, int fwidth, const H5FA_class_t *cls,
+    haddr_t hdr_addr, haddr_t obj_addr);
+
+/* Testing routines */
+#ifdef H5FA_TESTING
+H5_DLL herr_t H5FA_get_cparam_test(const H5FA_t *ea, H5FA_create_t *cparam);
+H5_DLL int H5FA_cmp_cparam_test(const H5FA_create_t *cparam1, const H5FA_create_t *cparam2);
+#endif /* H5FA_TESTING */
+
+#endif /* _H5FApkg_H */
+
diff --git a/src/H5FAprivate.h b/src/H5FAprivate.h
new file mode 100644
index 0000000..b7c141a
--- /dev/null
+++ b/src/H5FAprivate.h
@@ -0,0 +1,143 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:        H5FAprivate.h
+ *
+ * Purpose:        Private header for library accessible Fixed
+ *                      Array routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef _H5FAprivate_H
+#define _H5FAprivate_H
+
+/* Include package's public header */
+#ifdef NOT_YET
+#include "H5FApublic.h"
+#endif /* NOT_YET */
+
+/* Private headers needed by this file */
+#include "H5ACprivate.h"            /* Metadata cache               */
+#include "H5Fprivate.h"             /* File access                  */
+
+
+/**************************/
+/* Library Private Macros */
+/**************************/
+
+
+/****************************/
+/* Library Private Typedefs */
+/****************************/
+
+/* Fixed Array class IDs */
+typedef enum H5FA_cls_id_t {
+    H5FA_CLS_CHUNK_ID = 0,      /* Fixed array is for indexing dataset chunks w/o filters   */
+    H5FA_CLS_FILT_CHUNK_ID,     /* Fixed array is for indexing dataset chunks w/filters     */
+
+    /* Start real class IDs at 0 -QAK */
+    /* (keep these last) */
+    H5FA_CLS_TEST_ID,           /* Fixed array is for testing (do not use for actual data)  */
+    H5FA_NUM_CLS_ID             /* Number of Fixed Array class IDs (must be last)           */
+} H5FA_cls_id_t;
+
+/*
+ * Each type of element that can be stored in a Fixed Array has a
+ * variable of this type that contains class variables and methods.
+ */
+typedef struct H5FA_class_t {
+    H5FA_cls_id_t id;           /* ID of Fixed Array class, as found in file    */
+    const char *name;           /* Name of class (for debugging)                */
+    size_t nat_elmt_size;       /* Size of native (memory) element              */
+
+    /* Fixed array client callback methods */
+    void *(*crt_context)(void *udata);          /* Create context for other callbacks */
+    herr_t (*dst_context)(void *ctx);           /* Destroy context */
+    herr_t (*fill)(void *nat_blk, size_t nelmts);    /* Fill array of elements with encoded form of "missing element" value */
+    herr_t (*encode)(void *raw, const void *elmt, size_t nelmts, void *ctx);   /* Encode elements from native form to disk storage form */
+    herr_t (*decode)(const void *raw, void *elmt, size_t nelmts, void *ctx);   /* Decode elements from disk storage form to native form */
+    herr_t (*debug)(FILE *stream, int indent, int fwidth, hsize_t idx, const void *elmt); /* Print an element for debugging */
+    void *(*crt_dbg_ctx)(H5F_t *f, hid_t dxpl_id, haddr_t obj_addr); /* Create debugging context */
+    herr_t (*dst_dbg_ctx)(void *dbg_ctx);       /* Destroy debugging context */
+} H5FA_class_t;
+
+/* Fixed array creation parameters */
+typedef struct H5FA_create_t {
+    const H5FA_class_t *cls;            /* Class of Fixed Array to create   */
+    uint8_t raw_elmt_size;              /* Element size in file (in bytes)  */
+    uint8_t max_dblk_page_nelmts_bits;  /* Log2(Max. # of elements in a data block page) -
+                                         * i.e. # of bits needed to store max. # of elements
+                                         * in a data block page
+                                         */
+    hsize_t nelmts;                     /* # of elements in array */
+} H5FA_create_t;
+
+/* Fixed array metadata statistics info */
+typedef struct H5FA_stat_t {
+    /* Non-stored (i.e. computed) fields */
+    hsize_t hdr_size;           /* Size of header       */
+    hsize_t dblk_size;          /* Size of data block   */
+
+    /* Stored fields */
+    hsize_t nelmts;             /* # of elements        */
+} H5FA_stat_t;
+
+/* Fixed Array info (forward decl - defined in H5FApkg.h) */
+typedef struct H5FA_t H5FA_t;
+
+/* Define the operator callback function pointer for H5FA_iterate() */
+typedef int (*H5FA_operator_t)(hsize_t idx, const void *_elmt, void *_udata);
+
+
+/*****************************/
+/* Library-private Variables */
+/*****************************/
+
+/* The Fixed Array class for dataset chunks w/o filters*/
+H5_DLLVAR const H5FA_class_t H5FA_CLS_CHUNK[1];
+
+/* The Fixed Array class for dataset chunks w/ filters*/
+H5_DLLVAR const H5FA_class_t H5FA_CLS_FILT_CHUNK[1];
+
+
+/***************************************/
+/* Library-private Function Prototypes */
+/***************************************/
+
+/* General routines */
+H5_DLL H5FA_t *H5FA_create(H5F_t *f, hid_t dxpl_id, const H5FA_create_t *cparam,
+    void *ctx_udata);
+H5_DLL H5FA_t *H5FA_open(H5F_t *f, hid_t dxpl_id, haddr_t fa_addr, void *ctx_udata);
+H5_DLL herr_t H5FA_get_nelmts(const H5FA_t *fa, hsize_t *nelmts);
+H5_DLL herr_t H5FA_get_addr(const H5FA_t *fa, haddr_t *addr);
+H5_DLL herr_t H5FA_set(const H5FA_t *fa, hid_t dxpl_id, hsize_t idx, const void *elmt);
+H5_DLL herr_t H5FA_get(const H5FA_t *fa, hid_t dxpl_id, hsize_t idx, void *elmt);
+H5_DLL herr_t H5FA_depend(H5AC_info_t *parent_entry, H5FA_t *fa);
+H5_DLL herr_t H5FA_iterate(H5FA_t *fa, hid_t dxpl_id, H5FA_operator_t op, void *udata);
+H5_DLL herr_t H5FA_close(H5FA_t *fa, hid_t dxpl_id);
+H5_DLL herr_t H5FA_delete(H5F_t *f, hid_t dxpl_id, haddr_t fa_addr, void *ctx_udata);
+
+/* Statistics routines */
+H5_DLL herr_t H5FA_get_stats(const H5FA_t *ea, H5FA_stat_t *stats);
+
+/* Debugging routines */
+#ifdef H5FA_DEBUGGING
+#endif /* H5FA_DEBUGGING */
+
+#endif /* _H5FAprivate_H */
+
diff --git a/src/H5FAstat.c b/src/H5FAstat.c
new file mode 100644
index 0000000..72fa0de
--- /dev/null
+++ b/src/H5FAstat.c
@@ -0,0 +1,113 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:         H5FAstat.c
+ *
+ * Purpose:         Fixed array metadata statistics functions.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5FAmodule.h"         /* This source code file is part of the H5FA module */
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"      /* Generic Functions                        */
+#include "H5Eprivate.h"     /* Error handling                           */
+#include "H5FApkg.h"        /* Fixed Arrays                             */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA_get_stats
+ *
+ * Purpose:     Query the metadata stats of an array
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, NOERR,
+herr_t, SUCCEED, -,
+H5FA_get_stats(const H5FA_t *fa, H5FA_stat_t *stats))
+
+    /* Local variables */
+
+#ifdef H5FA_DEBUG
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* H5FA_DEBUG */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fa);
+    HDassert(stats);
+
+    /* Copy fixed array statistics */
+    HDmemcpy(stats, &fa->hdr->stats, sizeof(fa->hdr->stats));
+
+END_FUNC(PRIV)  /* end H5FA_get_stats() */
+
diff --git a/src/H5FAtest.c b/src/H5FAtest.c
new file mode 100644
index 0000000..091f284
--- /dev/null
+++ b/src/H5FAtest.c
@@ -0,0 +1,422 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Purpose:     Fixed array testing functions.
+ *
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5FAmodule.h"         /* This source code file is part of the H5FA module */
+#define H5FA_TESTING
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FApkg.h"		/* Fixed Arrays				*/
+#include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5VMprivate.h"         /* Vector functions			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Sanity checking value for callback contexts */
+#define H5FA__TEST_BOGUS_VAL    42
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Callback context */
+typedef struct H5FA__test_ctx_t {
+    uint32_t    bogus;          /* Placeholder field to verify that context is working */
+} H5FA__test_ctx_t;
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Fixed array class callbacks */
+static void *H5FA__test_crt_context(void *udata);
+static herr_t H5FA__test_dst_context(void *ctx);
+static herr_t H5FA__test_fill(void *nat_blk, size_t nelmts);
+static herr_t H5FA__test_encode(void *raw, const void *elmt, size_t nelmts,
+    void *ctx);
+static herr_t H5FA__test_decode(const void *raw, void *elmt, size_t nelmts,
+    void *ctx);
+static herr_t H5FA__test_debug(FILE *stream, int indent, int fwidth,
+    hsize_t idx, const void *elmt);
+static void *H5FA__test_crt_dbg_context(H5F_t *f, hid_t dxpl_id,
+    haddr_t obj_addr);
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+/* Fixed array testing class information */
+const H5FA_class_t H5FA_CLS_TEST[1]={{
+    H5FA_CLS_TEST_ID,           /* Type of Fixed array */
+    "Testing",                  /* Name of fixed array class */
+    sizeof(uint64_t),           /* Size of native element */
+    H5FA__test_crt_context,     /* Create context */
+    H5FA__test_dst_context,     /* Destroy context */
+    H5FA__test_fill,            /* Fill block of missing elements callback */
+    H5FA__test_encode,          /* Element encoding callback */
+    H5FA__test_decode,          /* Element decoding callback */
+    H5FA__test_debug,           /* Element debugging callback */
+    H5FA__test_crt_dbg_context, /* Create debugging context */
+    H5FA__test_dst_context      /* Destroy debugging context */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5FA__test_ctx_t struct */
+H5FL_DEFINE_STATIC(H5FA__test_ctx_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__test_crt_context
+ *
+ * Purpose:     Create context for callbacks
+ *
+ * Return:      Success:    non-NULL
+ *              Failure:    NULL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+void *, NULL, NULL,
+H5FA__test_crt_context(void H5_ATTR_UNUSED *udata))
+
+    /* Local variables */
+    H5FA__test_ctx_t *ctx;              /* Context for callbacks */
+
+    /* Allocate new context structure */
+    if(NULL == (ctx = H5FL_MALLOC(H5FA__test_ctx_t)))
+        H5E_THROW(H5E_CANTALLOC, "can't allocate fixed array client callback context")
+
+    /* Initialize the context */
+    ctx->bogus = H5FA__TEST_BOGUS_VAL;
+
+    /* Set return value */
+    ret_value = ctx;
+
+CATCH
+
+END_FUNC(STATIC)  /* end H5FA__test_crt_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__test_dst_context
+ *
+ * Purpose:     Destroy context for callbacks
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5FA__test_dst_context(void *_ctx))
+
+    /* Local variables */
+    H5FA__test_ctx_t *ctx = (H5FA__test_ctx_t *)_ctx;   /* Callback context to destroy */
+
+    /* Sanity checks */
+    HDassert(H5FA__TEST_BOGUS_VAL == ctx->bogus);
+
+    /* Release context structure */
+    ctx = H5FL_FREE(H5FA__test_ctx_t, ctx);
+
+END_FUNC(STATIC)  /* end H5FA__test_dst_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__test_fill
+ *
+ * Purpose:     Fill "missing elements" in block of elements
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5FA__test_fill(void *nat_blk, size_t nelmts))
+
+    /* Local variables */
+    uint64_t fill_val = H5FA_TEST_FILL;          /* Value to fill elements with */
+
+    /* Sanity checks */
+    HDassert(nat_blk);
+    HDassert(nelmts);
+
+    H5VM_array_fill(nat_blk, &fill_val, sizeof(uint64_t), nelmts);
+
+END_FUNC(STATIC)  /* end H5FA__test_fill() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__test_encode
+ *
+ * Purpose:     Encode an element from "native" to "raw" form
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5FA__test_encode(void *raw, const void *_elmt, size_t nelmts, void H5_ATTR_UNUSED *_ctx))
+
+    /* Local variables */
+#ifndef NDEBUG
+    H5FA__test_ctx_t *ctx = (H5FA__test_ctx_t *)_ctx;   /* Callback context to destroy */
+#endif /* NDEBUG */
+    const uint64_t *elmt = (const uint64_t *)_elmt;     /* Convenience pointer to native elements */
+
+    /* Sanity checks */
+    HDassert(raw);
+    HDassert(elmt);
+    HDassert(nelmts);
+    HDassert(H5FA__TEST_BOGUS_VAL == ctx->bogus);
+
+    /* Encode native elements into raw elements */
+    while(nelmts) {
+        /* Encode element */
+        /* (advances 'raw' pointer) */
+        UINT64ENCODE(raw, *elmt);
+
+        /* Advance native element pointer */
+        elmt++;
+
+        /* Decrement # of elements to encode */
+        nelmts--;
+    } /* end while */
+
+END_FUNC(STATIC)  /* end H5FA__test_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__test_decode
+ *
+ * Purpose:     Decode an element from "raw" to "native" form
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5FA__test_decode(const void *_raw, void *_elmt, size_t nelmts, void H5_ATTR_UNUSED *_ctx))
+
+    /* Local variables */
+#ifndef NDEBUG
+    H5FA__test_ctx_t *ctx = (H5FA__test_ctx_t *)_ctx;   /* Callback context to destroy */
+#endif /* NDEBUG */
+    uint64_t *elmt = (uint64_t *)_elmt;     /* Convenience pointer to native elements */
+    const uint8_t *raw = (const uint8_t *)_raw; /* Convenience pointer to raw elements */
+
+    /* Sanity checks */
+    HDassert(raw);
+    HDassert(elmt);
+    HDassert(nelmts);
+    HDassert(H5FA__TEST_BOGUS_VAL == ctx->bogus);
+
+    /* Decode raw elements into native elements */
+    while(nelmts) {
+        /* Decode element */
+        /* (advances 'raw' pointer) */
+        UINT64DECODE(raw, *elmt);
+
+        /* Advance native element pointer */
+        elmt++;
+
+        /* Decrement # of elements to decode */
+        nelmts--;
+    } /* end while */
+
+END_FUNC(STATIC)  /* end H5FA__test_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__test_debug
+ *
+ * Purpose:     Display an element for debugging
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, NOERR,
+herr_t, SUCCEED, -,
+H5FA__test_debug(FILE *stream, int indent, int fwidth, hsize_t idx,
+    const void *elmt))
+
+    /* Local variables */
+    char temp_str[128];     /* Temporary string, for formatting */
+
+    /* Sanity checks */
+    HDassert(stream);
+    HDassert(elmt);
+
+    /* Print element */
+    sprintf(temp_str, "Element #%llu:", (unsigned long long)idx);
+    HDfprintf(stream, "%*s%-*s %llu\n", indent, "", fwidth, temp_str,
+        (unsigned long long)*(const uint64_t *)elmt);
+
+END_FUNC(STATIC)  /* end H5FA__test_debug() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA__test_crt_dbg_context
+ *
+ * Purpose:     Create context for debugging callback
+ *
+ * Return:      Success:    non-NULL
+ *              Failure:    NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, December 1, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(STATIC, ERR,
+void *, NULL, NULL,
+H5FA__test_crt_dbg_context(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t H5_ATTR_UNUSED obj_addr))
+
+    /* Local variables */
+    H5FA__test_ctx_t *ctx;              /* Context for callbacks */
+
+    /* Allocate new context structure */
+    if(NULL == (ctx = H5FL_MALLOC(H5FA__test_ctx_t)))
+        H5E_THROW(H5E_CANTALLOC, "can't allocate fixed array client callback context")
+
+    /* Initialize the context */
+    ctx->bogus = H5FA__TEST_BOGUS_VAL;
+
+    /* Set return value */
+    ret_value = ctx;
+
+CATCH
+
+END_FUNC(STATIC)  /* end H5FA__test_crt_dbg_context() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA_get_cparam_test
+ *
+ * Purpose:     Retrieve the parameters used to create the fixed array
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, NOERR,
+herr_t, SUCCEED, -,
+H5FA_get_cparam_test(const H5FA_t *fa, H5FA_create_t *cparam))
+
+    /* Check arguments. */
+    HDassert(fa);
+    HDassert(cparam);
+
+    /* Get fixed array creation parameters */
+    cparam->raw_elmt_size = fa->hdr->cparam.raw_elmt_size;
+    cparam->nelmts = fa->hdr->cparam.nelmts;
+
+END_FUNC(PRIV)  /* end H5FA_get_cparam_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FA_cmp_cparam_test
+ *
+ * Purpose:     Compare the parameters used to create the fixed array
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Thursday, April 30, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PRIV, ERRCATCH,
+int, 0, -,
+H5FA_cmp_cparam_test(const H5FA_create_t *cparam1, const H5FA_create_t *cparam2))
+
+    /* Check arguments. */
+    HDassert(cparam1);
+    HDassert(cparam2);
+
+    /* Compare creation parameters for array */
+    if(cparam1->raw_elmt_size < cparam2->raw_elmt_size)
+        H5_LEAVE(-1)
+    else if(cparam1->raw_elmt_size > cparam2->raw_elmt_size)
+        H5_LEAVE(1)
+
+CATCH
+
+END_FUNC(PRIV)  /* end H5FA_cmp_cparam_test() */
+
diff --git a/src/H5FD.c b/src/H5FD.c
index dbadafa..1a63795 100644
--- a/src/H5FD.c
+++ b/src/H5FD.c
@@ -28,11 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
-#define H5FD_PACKAGE		/*suppress error about including H5FDpkg  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5FD_init_interface
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
+#include "H5FDmodule.h"         /* This source code file is part of the H5FD module */
 
 
 /***********/
@@ -43,17 +40,6 @@
 #include "H5Eprivate.h"		/* Error handling		  	*/
 #include "H5Fpkg.h"             /* File access				*/
 #include "H5FDpkg.h"		/* File Drivers				*/
-#include "H5FDcore.h"		/* Files stored entirely in memory	*/
-#include "H5FDfamily.h"		/* File families 			*/
-#include "H5FDlog.h"        	/* sec2 driver with I/O logging (for debugging) */
-#include "H5FDmpi.h"            /* MPI-based file drivers		*/
-#include "H5FDmulti.h"		/* Usage-partitioned file family	*/
-#include "H5FDsec2.h"		/* POSIX unbuffered file I/O		*/
-#include "H5FDstdio.h"		/* Standard C buffered I/O		*/
-#ifdef H5_HAVE_WINDOWS
-#include "H5FDwindows.h"        /* Windows buffered I/O     */
-#endif
-#include "H5FDdirect.h"		/* Direct file I/O			*/
 #include "H5Iprivate.h"		/* IDs			  		*/
 #include "H5MMprivate.h"	/* Memory management			*/
 #include "H5Pprivate.h"		/* Property lists			*/
@@ -76,12 +62,7 @@
 /********************/
 /* Local Prototypes */
 /********************/
-static herr_t H5FD_pl_copy(void *(*copy_func)(const void *), size_t pl_size,
-    const void *old_pl, void **copied_pl);
-static herr_t H5FD_pl_close(hid_t driver_id, herr_t (*free_func)(void *),
-    void *pl);
 static herr_t H5FD_free_cls(H5FD_class_t *cls);
-static herr_t H5FD_fapl_copy(hid_t driver_id, const void *fapl, void **copied_fapl);
 static int H5FD_query(const H5FD_t *f, unsigned long *flags/*out*/);
 static int H5FD_driver_query(const H5FD_class_t *driver, unsigned long *flags/*out*/);
 
@@ -89,6 +70,9 @@ static int H5FD_driver_query(const H5FD_class_t *driver, unsigned long *flags/*o
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 
 /*****************************/
 /* Library Private Variables */
@@ -116,7 +100,7 @@ static unsigned long H5FD_file_serial_no_g;
 /* File driver ID class */
 static const H5I_class_t H5I_VFL_CLS[1] = {{
     H5I_VFL,			/* ID class value */
-    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* Class flags */
     0,				/* # of reserved IDs for class */
     (H5I_free_t)H5FD_free_cls	/* Callback routine for closing objects of this class */
 }};
@@ -124,53 +108,24 @@ static const H5I_class_t H5I_VFL_CLS[1] = {{
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FD_init
- *
- * Purpose:	Initialize the interface from some other package.
- *
- * Return:	Success:	non-negative
- *		Failure:	negative
- *
- * Programmer:	Quincey Koziol
- *              Thursday, January  3, 2007
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5FD_init(void)
-{
-    herr_t ret_value = SUCCEED;   /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-    /* FUNC_ENTER() does all the work */
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_init() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5FD_init_interface
+ * Function:	H5FD__init_package
  *
  * Purpose:	Initialize the virtual file layer.
  *
  * Return:	Success:	Non-negative
- *
  *		Failure:	Negative
  *
  * Programmer:	Robb Matzke
  *              Monday, July 26, 1999
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5FD_init_interface(void)
+herr_t
+H5FD__init_package(void)
 {
     herr_t      ret_value = SUCCEED;       /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     if(H5I_register_type(H5I_VFL_CLS) < 0)
 	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "unable to initialize interface")
@@ -180,11 +135,11 @@ H5FD_init_interface(void)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_init_interface() */
+} /* end H5FD__init_package() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FD_term_interface
+ * Function:	H5FD_term_package
  *
  * Purpose:	Terminate this interface: free all memory and reset global
  *		variables to their initial values.  Release all ID groups
@@ -193,60 +148,37 @@ done:
  * Return:	Success:	Positive if anything was done that might
  *				have affected other interfaces; zero
  *				otherwise.
- *
  *		Failure:        Never fails.
  *
  * Programmer:	Robb Matzke
  *              Friday, February 19, 1999
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 int
-H5FD_term_interface(void)
+H5FD_term_package(void)
 {
     int	n = 0;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    if(H5_interface_initialize_g) {
+    if(H5_PKG_INIT_VAR) {
 	if(H5I_nmembers(H5I_VFL) > 0) {
 	    (void)H5I_clear_type(H5I_VFL, FALSE, FALSE);
-
-            /* Reset the VFL drivers, if they've been closed */
-            if(H5I_nmembers(H5I_VFL)==0) {
-                H5FD_sec2_term();
-#ifdef H5_HAVE_DIRECT
-                H5FD_direct_term();
-#endif
-                H5FD_log_term();
-                H5FD_stdio_term();
-#ifdef H5_HAVE_WINDOWS
-                H5FD_windows_term();
-#endif
-                H5FD_family_term();
-                H5FD_core_term();
-                H5FD_multi_term();
-#ifdef H5_HAVE_PARALLEL
-                H5FD_mpio_term();
-#endif /* H5_HAVE_PARALLEL */
-            } /* end if */
-
             n++; /*H5I*/
 	} /* end if */
         else {
             /* Destroy the VFL driver id group */
-	    (void)H5I_dec_type_ref(H5I_VFL);
-            n++; /*H5I*/
+	    n += (H5I_dec_type_ref(H5I_VFL) > 0);
 
 	    /* Mark closed */
-	    H5_interface_initialize_g = 0;
+            if(0 == n)
+                H5_PKG_INIT_VAR = FALSE;
 	} /* end else */
     } /* end if */
 
     FUNC_LEAVE_NOAPI(n)
-} /* end H5FD_term_interface() */
+} /* end H5FD_term_package() */
 
 

 /*-------------------------------------------------------------------------
@@ -254,7 +186,7 @@ H5FD_term_interface(void)
  *
  * Purpose:	Frees a file driver class struct and returns an indication of
  *		success. This function is used as the free callback for the
- *		virtual file layer object identifiers (cf H5FD_init_interface).
+ *		virtual file layer object identifiers (cf H5FD__init_package).
  *
  * Return:	Success:	Non-negative
  *
@@ -270,11 +202,24 @@ H5FD_term_interface(void)
 static herr_t
 H5FD_free_cls(H5FD_class_t *cls)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(cls);
+
+    /* If the file driver has a terminate callback, call it to give the file
+     * driver a chance to free singletons or other resources which will become
+     * invalid once the class structure is freed.
+     */
+    if(cls->terminate && cls->terminate() < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTCLOSEOBJ, FAIL, "virtual file driver '%s' did not terminate cleanly", cls->name)
 
     H5MM_xfree(cls);
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5FD_free_cls() */
 
 

@@ -368,7 +313,7 @@ H5FD_register(const void *_cls, size_t size, hbool_t app_ref)
     const H5FD_class_t	*cls = (const H5FD_class_t *)_cls;
     H5FD_class_t	*saved = NULL;
     H5FD_mem_t		type;
-    hid_t		ret_value;
+    hid_t		ret_value = H5I_INVALID_HID;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -468,16 +413,17 @@ H5FD_get_class(hid_t id)
 	ret_value = (H5FD_class_t *)H5I_object(id);
     else {
         H5P_genplist_t *plist;      /* Property list pointer */
-        hid_t driver_id = -1;
 
         /* Get the plist structure */
         if(NULL == (plist = (H5P_genplist_t *)H5I_object(id)))
             HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, NULL, "can't find object for ID")
 
         if(TRUE == H5P_isa_class(id, H5P_FILE_ACCESS)) {
-            if(H5P_get(plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
-                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get driver ID")
-            ret_value = H5FD_get_class(driver_id);
+            H5FD_driver_prop_t driver_prop;         /* Property for driver ID & info */
+
+            if(H5P_peek(plist, H5F_ACS_FILE_DRV_NAME, &driver_prop) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get driver ID & info")
+            ret_value = H5FD_get_class(driver_prop.driver_id);
         } /* end if */
         else
             HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a driver id or file access property list")
@@ -558,11 +504,11 @@ H5FD_sb_encode(H5FD_t *file, char *name/*out*/, uint8_t *buf)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5FD_sb_encode() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FD_sb_decode
+ * Function:	H5FD__sb_decode
  *
  * Purpose:	Decodes the driver information block.
  *
@@ -574,110 +520,61 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5FD_sb_decode(H5FD_t *file, const char *name, const uint8_t *buf)
+static herr_t
+H5FD__sb_decode(H5FD_t *file, const char *name, const uint8_t *buf)
 {
     herr_t      ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_STATIC
 
     HDassert(file && file->cls);
+
+    /* Decode driver information */
     if(file->cls->sb_decode && (file->cls->sb_decode)(file, name, buf) < 0)
 	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver sb_decode request failed")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_sb_decode() */
+} /* end H5FD__sb_decode() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FD_pl_copy
+ * Function:	H5FD_sb_load
  *
- * Purpose:	Copies the driver-specific part of the a property list.
- *              This is common code, used by both the dataset transfer and
- *              file access property list routines.
+ * Purpose:	Validate and decode the driver information block.
  *
- * Return:	Success:	non-negative
- *
- *		Failure:	negative
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
  *
  * Programmer:	Quincey Koziol
- *              Thursday, October 23, 2003
- *
- * Modifications:
- *  Pedro Vicente Nunes, Wednesday, July 26, 2006
- *  added a HGOTO_ERROR call in the case the copy function returns NULL
+ *              Friday, July 19, 2013
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5FD_pl_copy(void *(*copy_func)(const void *), size_t pl_size, const void *old_pl, void **copied_pl)
+herr_t
+H5FD_sb_load(H5FD_t *file, const char *name, const uint8_t *buf)
 {
-    void *new_pl = NULL;        /* Copy of property list */
-    herr_t ret_value=SUCCEED;   /* Return value */
-
-    FUNC_ENTER_NOAPI_NOINIT
-
-    /* Copy old pl, if one exists */
-    if(old_pl) {
-        /* Allow the driver to copy or do it ourselves */
-        if(copy_func) {
-            new_pl = (copy_func)(old_pl);
-            if(new_pl==NULL)
-                HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, FAIL, "property list copy failed")
-        } else if(pl_size>0) {
-            if((new_pl = H5MM_malloc(pl_size))==NULL)
-                HGOTO_ERROR(H5E_VFL, H5E_NOSPACE, FAIL, "property list allocation failed")
-            HDmemcpy(new_pl, old_pl, pl_size);
-        } else
-            HGOTO_ERROR(H5E_VFL, H5E_UNSUPPORTED, FAIL, "no way to copy driver property list")
-    } /* end if */
-
-    /* Set copied value */
-    *copied_pl=new_pl;
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_pl_copy() */
+    herr_t      ret_value = SUCCEED;    /* Return value */
 
-

-/*-------------------------------------------------------------------------
- * Function:	H5FD_pl_close
- *
- * Purpose:	Closes a driver for a property list
- *              This is common code, used by both the dataset transfer and
- *              file access property list routines.
- *
- * Return:	Success:	non-negative
- *		Failure:	negative
- *
- * Programmer:	Quincey Koziol
- *              Thursday, October 23, 2003
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5FD_pl_close(hid_t driver_id, herr_t (*free_func)(void *), void *pl)
-{
-    herr_t ret_value = SUCCEED;         /* Return value */
+    FUNC_ENTER_NOAPI(FAIL)
 
-    FUNC_ENTER_NOAPI_NOINIT
+    HDassert(file && file->cls);
 
-    /* Allow driver to free or do it ourselves */
-    if(pl && free_func) {
-	if((free_func)(pl) < 0)
-	    HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver free request failed")
-    } /* end if */
-    else
-	H5MM_xfree(pl);
+    /* Check if driver matches driver information saved. Unfortunately, we can't push this
+     * function to each specific driver because we're checking if the driver is correct.
+     */
+    if(!HDstrncmp(name, "NCSAfami", (size_t)8) && HDstrcmp(file->cls->name, "family"))
+        HGOTO_ERROR(H5E_VFL, H5E_BADVALUE, FAIL, "family driver should be used")
+    if(!HDstrncmp(name, "NCSAmult", (size_t)8) && HDstrcmp(file->cls->name, "multi"))
+        HGOTO_ERROR(H5E_VFL, H5E_BADVALUE, FAIL, "multi driver should be used")
 
-    /* Decrement reference count for driver */
-    if(H5I_dec_ref(driver_id) < 0)
-        HGOTO_ERROR(H5E_VFL, H5E_CANTDEC, FAIL, "can't decrement reference count for driver")
+    /* Decode driver information */
+    if(H5FD__sb_decode(file, name, buf) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTDECODE, FAIL, "unable to decode driver information")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_pl_close() */
+} /* end H5FD_sb_load() */
 
 

 /*-------------------------------------------------------------------------
@@ -702,8 +599,6 @@ done:
  * Programmer:	Robb Matzke
  *              Friday, August 13, 1999
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 void *
@@ -724,88 +619,6 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FD_fapl_open
- *
- * Purpose:	Mark a driver as used by a file access property list
- *
- * Return:	Success:	non-negative
- *
- *		Failure:	negative
- *
- * Programmer:	Quincey Koziol
- *              Thursday, October 23, 2003
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5FD_fapl_open(H5P_genplist_t *plist, hid_t driver_id, const void *driver_info)
-{
-    void *copied_driver_info = NULL;           /* Temporary VFL driver info */
-    herr_t ret_value = SUCCEED;   /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    /* Increment the reference count on driver and copy driver info */
-    if(H5I_inc_ref(driver_id, FALSE) < 0)
-        HGOTO_ERROR(H5E_FILE, H5E_CANTINC, FAIL, "unable to increment ref count on VFL driver")
-    if(H5FD_fapl_copy(driver_id, driver_info, &copied_driver_info) < 0)
-        HGOTO_ERROR(H5E_FILE, H5E_CANTCOPY, FAIL, "can't copy VFL driver info")
-
-    /* Set the driver properties for the list */
-    if(H5P_set(plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
-        HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "can't set driver ID")
-    if(H5P_set(plist, H5F_ACS_FILE_DRV_INFO_NAME, &copied_driver_info) < 0)
-        HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "can't set driver info")
-    copied_driver_info = NULL;
-
-done:
-    if(ret_value < 0)
-        if(copied_driver_info && H5FD_fapl_close(driver_id, copied_driver_info) < 0)
-            HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "can't close copy of driver info")
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_fapl_open() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5FD_fapl_copy
- *
- * Purpose:	Copies the driver-specific part of the file access property
- *		list.
- *
- * Return:	Success:	non-negative
- *
- *		Failure:	negative
- *
- * Programmer:	Robb Matzke
- *              Tuesday, August  3, 1999
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5FD_fapl_copy(hid_t driver_id, const void *old_fapl, void **copied_fapl)
-{
-    H5FD_class_t *driver;
-    herr_t ret_value = SUCCEED;       /* Return value */
-
-    FUNC_ENTER_NOAPI_NOINIT
-
-    /* Check args */
-    if(NULL == (driver = (H5FD_class_t *)H5I_object(driver_id)))
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a driver ID")
-
-    /* Copy the file access property list */
-    if(H5FD_pl_copy(driver->fapl_copy, driver->fapl_size, old_fapl, copied_fapl) < 0)
-        HGOTO_ERROR(H5E_VFL, H5E_UNSUPPORTED, FAIL, "can't copy driver file access property list")
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-}
-
-

-/*-------------------------------------------------------------------------
  * Function:	H5FD_fapl_close
  *
  * Purpose:	Closes a driver for a dataset transfer property list
@@ -816,26 +629,32 @@ done:
  * Programmer:	Robb Matzke
  *              Tuesday, August  3, 1999
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5FD_fapl_close(hid_t driver_id, void *fapl)
+H5FD_fapl_close(hid_t driver_id, const void *driver_info)
 {
-    H5FD_class_t	*driver = NULL;
     herr_t      ret_value = SUCCEED;       /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
     /* Check args */
     if(driver_id > 0) {
+        H5FD_class_t	*driver;
+
+        /* Retrieve the driver for the ID */
         if(NULL == (driver = (H5FD_class_t *)H5I_object(driver_id)))
             HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a driver ID")
 
-        /* Close the driver for the property list */
-        if(H5FD_pl_close(driver_id, driver->fapl_free, fapl) < 0)
-            HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver fapl_free request failed")
+        /* Allow driver to free info or do it ourselves */
+        if(driver_info) {
+            if(driver->fapl_free) {
+                if((driver->fapl_free)((void *)driver_info) < 0)        /* Casting away const OK -QAK */
+                    HGOTO_ERROR(H5E_VFL, H5E_CANTFREE, FAIL, "driver free request failed")
+            } /* end if */
+            else
+                H5MM_xfree((void *)driver_info);        /* Casting away const OK -QAK */
+        } /* end if */
     } /* end if */
 
 done:
@@ -947,11 +766,11 @@ H5FD_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
 {
     H5FD_class_t	*driver;                /* VFD for file */
     H5FD_t		*file = NULL;           /* VFD file struct */
-    hid_t               driver_id = -1;         /* VFD ID */
+    H5FD_driver_prop_t  driver_prop;            /* Property for driver ID & info */
     H5P_genplist_t      *plist;                 /* Property list pointer */
     unsigned long       driver_flags = 0;       /* File-inspecific driver feature flags */
     H5FD_file_image_info_t file_image_info;     /* Initial file image */
-    H5FD_t		*ret_value;             /* Return value */
+    H5FD_t		*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -964,11 +783,11 @@ H5FD_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
 
     /* Get the VFD to open the file with */
-    if(H5P_get(plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get driver ID")
+    if(H5P_peek(plist, H5F_ACS_FILE_DRV_NAME, &driver_prop) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get driver ID & info")
 
     /* Get driver info */
-    if(NULL == (driver = (H5FD_class_t *)H5I_object(driver_id)))
+    if(NULL == (driver = (H5FD_class_t *)H5I_object(driver_prop.driver_id)))
 	HGOTO_ERROR(H5E_VFL, H5E_BADVALUE, NULL, "invalid driver ID in file access property list")
     if(NULL == driver->open)
 	HGOTO_ERROR(H5E_VFL, H5E_UNSUPPORTED, NULL, "file driver has no `open' method")
@@ -977,7 +796,7 @@ H5FD_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
     H5FD_driver_query(driver, &driver_flags);
 
     /* Get initial file image info */
-    if(H5P_get(plist, H5F_ACS_FILE_IMAGE_INFO_NAME, &file_image_info) < 0)
+    if(H5P_peek(plist, H5F_ACS_FILE_IMAGE_INFO_NAME, &file_image_info) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get file image info")
 
     /* If an image is provided, make sure the driver supports this feature */
@@ -996,7 +815,7 @@ H5FD_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
      * Fill in public fields. We must increment the reference count on the
      * driver ID to prevent it from being freed while this file is open.
      */
-    file->driver_id = driver_id;
+    file->driver_id = driver_prop.driver_id;
     if(H5I_inc_ref(file->driver_id, FALSE) < 0)
         HGOTO_ERROR(H5E_VFL, H5E_CANTINC, NULL, "unable to increment ref count on VFL driver")
     file->cls = driver;
@@ -1021,6 +840,10 @@ H5FD_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
     /* (This will be changed later, when the superblock is located) */
     file->base_addr = 0;
 
+    /* Check for SWMR reader access */
+    if(flags & H5F_ACC_SWMR_READ)
+        file->swmr_read = TRUE;
+
     /* Set return value */
     ret_value = file;
 
@@ -1166,7 +989,7 @@ done:
 int
 H5FD_cmp(const H5FD_t *f1, const H5FD_t *f2)
 {
-    int	ret_value;
+    int	ret_value = -1;         /* Return value */
 
     FUNC_ENTER_NOAPI(-1) /*return value is arbitrary*/
 
@@ -1540,19 +1363,19 @@ done:
  *-------------------------------------------------------------------------
  */
 haddr_t
-H5FDget_eof(H5FD_t *file)
+H5FDget_eof(H5FD_t *file, H5FD_mem_t type)
 {
     haddr_t	ret_value;
 
     FUNC_ENTER_API(HADDR_UNDEF)
-    H5TRACE1("a", "*x", file);
+    H5TRACE2("a", "*xMt", file, type);
 
     /* Check arguments */
     if(!file || !file->cls)
 	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, HADDR_UNDEF, "invalid file pointer")
 
     /* The real work */
-    if(HADDR_UNDEF == (ret_value = H5FD_get_eof(file)))
+    if(HADDR_UNDEF == (ret_value = H5FD_get_eof(file, type)))
 	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, HADDR_UNDEF, "file get eof request failed")
 
     /* (Note compensating for base address subtraction in internal routine) */
@@ -1579,7 +1402,7 @@ done:
 haddr_t
 H5FD_get_maxaddr(const H5FD_t *file)
 {
-    haddr_t ret_value;          /* Return value */
+    haddr_t ret_value = HADDR_UNDEF;    /* Return value */
 
     FUNC_ENTER_NOAPI(HADDR_UNDEF)
 
@@ -1622,6 +1445,32 @@ H5FD_get_feature_flags(const H5FD_t *file, unsigned long *feature_flags)
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5FD_set_feature_flags
+ *
+ * Purpose:	Set the feature flags for the VFD
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Vailin Choi; Oct 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_set_feature_flags(H5FD_t *file, unsigned long feature_flags)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(file);
+
+    /* Set the file's feature flags */
+    file->feature_flags = feature_flags;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FD_set_feature_flags() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5FD_get_fs_type_map
  *
  * Purpose:	Retrieve the free space type mapping for the VFD
@@ -1914,6 +1763,131 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5FDlock
+ *
+ * Purpose:	Set a file lock
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Vailin Choi; March 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FDlock(H5FD_t *file, hbool_t rw)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "*xb", file, rw);
+
+    /* Check args */
+    if(!file || !file->cls)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file pointer")
+
+    /* The real work */
+    if(H5FD_lock(file, rw) < 0)
+	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "file lock request failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5FDlock() */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_lock
+ *
+ * Purpose:	Private version of H5FDlock()
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Vailin Choi; May 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_lock(H5FD_t *file, hbool_t rw)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(file && file->cls);
+
+    if(file->cls->lock && (file->cls->lock)(file, rw) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTUPDATE, FAIL, "driver lock request failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_lock() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FDunlock
+ *
+ * Purpose:	Remove a file lock
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Vailin Choi; March 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FDunlock(H5FD_t *file)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "*x", file);
+
+    /* Check args */
+    if(!file || !file->cls)
+	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file pointer")
+
+    /* The real work */
+    if(H5FD_unlock(file) < 0)
+	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "file unlock request failed")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5FDunlock() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_unlock
+ *
+ * Purpose:	Private version of H5FDunlock()
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Vailin Choi; May 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FD_unlock(H5FD_t *file)
+{
+    herr_t      ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(file && file->cls);
+
+    if(file->cls->unlock && (file->cls->unlock)(file) < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTUPDATE, FAIL, "driver unlock request failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_unlock() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5FD_get_fileno
  *
  * Purpose:	Quick and dirty routine to retrieve the file's 'fileno' value
diff --git a/src/H5FDcore.c b/src/H5FDcore.c
index bc288e4..f4aa240 100644
--- a/src/H5FDcore.c
+++ b/src/H5FDcore.c
@@ -22,8 +22,7 @@
  *              access to small, temporary hdf5 files.
  */
 
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC  H5FD_core_init_interface
+#include "H5FDdrvr_module.h" /* This source code file is part of the H5FD driver module */
 
 #include "H5private.h"      /* Generic Functions            */
 #include "H5Eprivate.h"     /* Error handling               */
@@ -122,57 +121,61 @@ typedef struct H5FD_core_fapl_t {
                                 (size_t)((A)+(Z))<(size_t)(A))
 
 /* Prototypes */
-static herr_t H5FD_core_add_dirty_region(H5FD_core_t *file, haddr_t start, haddr_t end);
-static herr_t H5FD_core_destroy_dirty_list(H5FD_core_t *file);
-static herr_t H5FD_core_write_to_bstore(H5FD_core_t *file, haddr_t addr, size_t size);
-static void *H5FD_core_fapl_get(H5FD_t *_file);
-static H5FD_t *H5FD_core_open(const char *name, unsigned flags, hid_t fapl_id,
+static herr_t H5FD__core_add_dirty_region(H5FD_core_t *file, haddr_t start, haddr_t end);
+static herr_t H5FD__core_destroy_dirty_list(H5FD_core_t *file);
+static herr_t H5FD__core_write_to_bstore(H5FD_core_t *file, haddr_t addr, size_t size);
+static herr_t H5FD__core_term(void);
+static void *H5FD__core_fapl_get(H5FD_t *_file);
+static H5FD_t *H5FD__core_open(const char *name, unsigned flags, hid_t fapl_id,
             haddr_t maxaddr);
-static herr_t H5FD_core_close(H5FD_t *_file);
-static int H5FD_core_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
-static herr_t H5FD_core_query(const H5FD_t *_f1, unsigned long *flags);
-static haddr_t H5FD_core_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
-static herr_t H5FD_core_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
-static haddr_t H5FD_core_get_eof(const H5FD_t *_file);
-static herr_t  H5FD_core_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
-static herr_t H5FD_core_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
+static herr_t H5FD__core_close(H5FD_t *_file);
+static int H5FD__core_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
+static herr_t H5FD__core_query(const H5FD_t *_f1, unsigned long *flags);
+static haddr_t H5FD__core_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
+static herr_t H5FD__core_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
+static haddr_t H5FD__core_get_eof(const H5FD_t *_file, H5FD_mem_t type);
+static herr_t  H5FD__core_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
+static herr_t H5FD__core_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
             size_t size, void *buf);
-static herr_t H5FD_core_write(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
+static herr_t H5FD__core_write(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
             size_t size, const void *buf);
-static herr_t H5FD_core_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing);
-static herr_t H5FD_core_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing);
+static herr_t H5FD__core_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing);
+static herr_t H5FD__core_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing);
+static herr_t H5FD_core_lock(H5FD_t *_file, hbool_t rw);
+static herr_t H5FD_core_unlock(H5FD_t *_file);
 
 static const H5FD_class_t H5FD_core_g = {
     "core",                     /* name                 */
     MAXADDR,                    /* maxaddr              */
     H5F_CLOSE_WEAK,             /* fc_degree            */
+    H5FD__core_term,            /* terminate            */
     NULL,                       /* sb_size              */
     NULL,                       /* sb_encode            */
     NULL,                       /* sb_decode            */
     sizeof(H5FD_core_fapl_t),   /* fapl_size            */
-    H5FD_core_fapl_get,         /* fapl_get             */
+    H5FD__core_fapl_get,        /* fapl_get             */
     NULL,                       /* fapl_copy            */
     NULL,                       /* fapl_free            */
     0,                          /* dxpl_size            */
     NULL,                       /* dxpl_copy            */
     NULL,                       /* dxpl_free            */
-    H5FD_core_open,             /* open                 */
-    H5FD_core_close,            /* close                */
-    H5FD_core_cmp,              /* cmp                  */
-    H5FD_core_query,            /* query                */
+    H5FD__core_open,            /* open                 */
+    H5FD__core_close,           /* close                */
+    H5FD__core_cmp,             /* cmp                  */
+    H5FD__core_query,           /* query                */
     NULL,                       /* get_type_map         */
     NULL,                       /* alloc                */
     NULL,                       /* free                 */
-    H5FD_core_get_eoa,          /* get_eoa              */
-    H5FD_core_set_eoa,          /* set_eoa              */
-    H5FD_core_get_eof,          /* get_eof              */
-    H5FD_core_get_handle,       /* get_handle           */
-    H5FD_core_read,             /* read                 */
-    H5FD_core_write,            /* write                */
-    H5FD_core_flush,            /* flush                */
-    H5FD_core_truncate,         /* truncate             */
-    NULL,                       /* lock                 */
-    NULL,                       /* unlock               */
+    H5FD__core_get_eoa,         /* get_eoa              */
+    H5FD__core_set_eoa,         /* set_eoa              */
+    H5FD__core_get_eof,         /* get_eof              */
+    H5FD__core_get_handle,      /* get_handle           */
+    H5FD__core_read,            /* read                 */
+    H5FD__core_write,           /* write                */
+    H5FD__core_flush,           /* flush                */
+    H5FD__core_truncate,        /* truncate             */
+    H5FD_core_lock,             /* lock                 */
+    H5FD_core_unlock,           /* unlock               */
     H5FD_FLMAP_DICHOTOMY        /* fl_map               */
 };
 
@@ -181,7 +184,7 @@ H5FL_DEFINE(H5FD_core_region_t);
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FD_core_add_dirty_region
+ * Function:    H5FD__core_add_dirty_region
  *
  * Purpose:     Add a new dirty region to the list for later flushing
  *              to the backing store.
@@ -191,7 +194,7 @@ H5FL_DEFINE(H5FD_core_region_t);
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_core_add_dirty_region(H5FD_core_t *file, haddr_t start, haddr_t end)
+H5FD__core_add_dirty_region(H5FD_core_t *file, haddr_t start, haddr_t end)
 {
     H5FD_core_region_t *b_item  = NULL;
     H5FD_core_region_t *a_item  = NULL;
@@ -204,7 +207,7 @@ H5FD_core_add_dirty_region(H5FD_core_t *file, haddr_t start, haddr_t end)
     hbool_t     was_adjusted    = FALSE;
 #endif
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     HDassert(file);
     HDassert(file->dirty_list);
@@ -308,11 +311,11 @@ if(was_adjusted)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_core_add_dirty_region() */
+} /* end H5FD__core_add_dirty_region() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FD_core_destroy_dirty_list
+ * Function:    H5FD__core_destroy_dirty_list
  *
  * Purpose:     Completely destroy the dirty list.
  *
@@ -321,11 +324,11 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_core_destroy_dirty_list(H5FD_core_t *file)
+H5FD__core_destroy_dirty_list(H5FD_core_t *file)
 {
     herr_t ret_value = SUCCEED;
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     HDassert(file);
 
@@ -350,11 +353,11 @@ if(count != 0)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_core_destroy_dirty_list() */
+} /* end H5FD__core_destroy_dirty_list() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FD_core_write_to_bstore
+ * Function:    H5FD__core_write_to_bstore
  *
  * Purpose:     Write data to the backing store.
  *
@@ -362,7 +365,8 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-static herr_t H5FD_core_write_to_bstore(H5FD_core_t *file, haddr_t addr, size_t size)
+static herr_t
+H5FD__core_write_to_bstore(H5FD_core_t *file, haddr_t addr, size_t size)
 {
     unsigned char  *ptr         = file->mem + addr;     /* mutable pointer into the
                                                          * buffer (can't change mem)
@@ -418,27 +422,31 @@ fprintf(stderr, "bytes wrote: %lu\n", bytes_wrote);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-
-} /* end H5FD_core_write_to_bstore() */
+} /* end H5FD__core_write_to_bstore() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FD_core_init_interface
+ * Function:    H5FD__init_package
  *
  * Purpose:     Initializes any interface-specific data or routines.
  *
- * Return:      Success:    The driver ID for the core driver.
- *              Failure:    Negative.
+ * Return:      Non-negative on success/Negative on failure 
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_core_init_interface(void)
+H5FD__init_package(void)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
 
-    FUNC_LEAVE_NOAPI(H5FD_core_init())
-} /* H5FD_core_init_interface() */
+    if(H5FD_core_init() < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "unable to initialize core VFD")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FD__init_package() */
 
 

 /*-------------------------------------------------------------------------
@@ -458,43 +466,43 @@ H5FD_core_init_interface(void)
 hid_t
 H5FD_core_init(void)
 {
-    hid_t ret_value = H5FD_CORE_g;  /* Return value */
+    hid_t ret_value = H5I_INVALID_HID;  /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
     if(H5I_VFL != H5I_get_type(H5FD_CORE_g))
-        H5FD_CORE_g = H5FD_register(&H5FD_core_g,sizeof(H5FD_class_t),FALSE);
+        H5FD_CORE_g = H5FD_register(&H5FD_core_g, sizeof(H5FD_class_t), FALSE);
 
     /* Set return value */
     ret_value = H5FD_CORE_g;
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5FD_core_init() */
 
 

 /*---------------------------------------------------------------------------
- * Function:    H5FD_core_term
+ * Function:    H5FD__core_term
  *
  * Purpose:     Shut down the VFD
  *
- * Returns:     <none>
+ * Returns:     SUCCEED (Can't fail)
  *
  * Programmer:  Quincey Koziol
  *              Friday, Jan 30, 2004
  *
  *---------------------------------------------------------------------------
  */
-void
-H5FD_core_term(void)
+static herr_t
+H5FD__core_term(void)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Reset VFL ID */
     H5FD_CORE_g = 0;
 
-    FUNC_LEAVE_NOAPI_VOID
-} /* end H5FD_core_term() */
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FD__core_term() */
 
 

 /*-------------------------------------------------------------------------
@@ -528,11 +536,11 @@ H5Pset_fapl_core(hid_t fapl_id, size_t increment, hbool_t backing_store)
     fa.increment = increment;
     fa.backing_store = backing_store;
 
-    ret_value= H5P_set_driver(plist, H5FD_CORE, &fa);
+    ret_value = H5P_set_driver(plist, H5FD_CORE, &fa);
 
 done:
     FUNC_LEAVE_API(ret_value)
-}
+} /* end H5Pset_fapl_core() */
 
 

 /*-------------------------------------------------------------------------
@@ -550,8 +558,8 @@ done:
 herr_t
 H5Pget_fapl_core(hid_t fapl_id, size_t *increment /*out*/, hbool_t *backing_store /*out*/)
 {
-    H5FD_core_fapl_t    *fa;
     H5P_genplist_t      *plist;                 /* Property list pointer */
+    const H5FD_core_fapl_t    *fa;
     herr_t              ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_API(FAIL)
@@ -559,28 +567,27 @@ H5Pget_fapl_core(hid_t fapl_id, size_t *increment /*out*/, hbool_t *backing_stor
 
     if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
-    if(H5FD_CORE != H5P_get_driver(plist))
+    if(H5FD_CORE != H5P_peek_driver(plist))
         HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "incorrect VFL driver")
-    if(NULL == (fa = (H5FD_core_fapl_t *)H5P_get_driver_info(plist)))
+    if(NULL == (fa = (const H5FD_core_fapl_t *)H5P_peek_driver_info(plist)))
         HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "bad VFL driver info")
 
-    if (increment)
+    if(increment)
         *increment = fa->increment;
-    if (backing_store)
+    if(backing_store)
         *backing_store = fa->backing_store;
 
 done:
     FUNC_LEAVE_API(ret_value)
-}
+} /* end H5Pget_fapl_core() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FD_core_fapl_get
+ * Function:    H5FD__core_fapl_get
  *
  * Purpose:     Returns a copy of the file access properties.
  *
  * Return:      Success:    Ptr to new file access properties.
- *
  *              Failure:    NULL
  *
  * Programmer:  Robb Matzke
@@ -589,13 +596,13 @@ done:
  *-------------------------------------------------------------------------
  */
 static void *
-H5FD_core_fapl_get(H5FD_t *_file)
+H5FD__core_fapl_get(H5FD_t *_file)
 {
     H5FD_core_t         *file = (H5FD_core_t*)_file;
     H5FD_core_fapl_t    *fa;
-    void                *ret_value;     /* Return value */
+    void                *ret_value = NULL;      /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     if(NULL == (fa = (H5FD_core_fapl_t *)H5MM_calloc(sizeof(H5FD_core_fapl_t))))
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
@@ -608,18 +615,17 @@ H5FD_core_fapl_get(H5FD_t *_file)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5FD__core_fapl_get() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FD_core_open
+ * Function:    H5FD___core_open
  *
  * Purpose:     Create memory as an HDF5 file.
  *
  * Return:      Success:    A pointer to a new file data structure. The
  *                          public fields will be initialized by the
  *                          caller, which is always H5FD_open().
- *
  *              Failure:    NULL
  *
  * Programmer:  Robb Matzke
@@ -628,7 +634,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static H5FD_t *
-H5FD_core_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
+H5FD__core_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
 {
     int                 o_flags;
     H5FD_core_t         *file = NULL;
@@ -640,9 +646,9 @@ H5FD_core_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
     h5_stat_t           sb;
     int                 fd = -1;
     H5FD_file_image_info_t  file_image_info;
-    H5FD_t              *ret_value;
+    H5FD_t              *ret_value = NULL;      /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Check arguments */
     if(!name || !*name)
@@ -654,7 +660,7 @@ H5FD_core_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
     HDassert(H5P_DEFAULT != fapl_id);
     if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
-    if(NULL == (fa = (H5FD_core_fapl_t *)H5P_get_driver_info(plist)))
+    if(NULL == (fa = (H5FD_core_fapl_t *)H5P_peek_driver_info(plist)))
         HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, NULL, "bad VFL driver info")
 
     /* Build the open flags */
@@ -664,7 +670,7 @@ H5FD_core_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
     if(H5F_ACC_EXCL & flags) o_flags |= O_EXCL;
 
     /* Retrieve initial file image info */
-    if(H5P_get(plist, H5F_ACS_FILE_IMAGE_INFO_NAME, &file_image_info) < 0)
+    if(H5P_peek(plist, H5F_ACS_FILE_IMAGE_INFO_NAME, &file_image_info) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get initial file image info")
 
     /* If the file image exists and this is an open, make sure the file doesn't exist */
@@ -857,11 +863,11 @@ done:
     } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_core_open() */
+} /* end H5FD__core_open() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FD_core_close
+ * Function:    H5FD__core_close
  *
  * Purpose:     Closes the file.
  *
@@ -873,20 +879,20 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_core_close(H5FD_t *_file)
+H5FD__core_close(H5FD_t *_file)
 {
     H5FD_core_t     *file = (H5FD_core_t*)_file;
     herr_t          ret_value = SUCCEED;            /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Flush any changed buffers */
-    if(H5FD_core_flush(_file, (hid_t)-1, TRUE) < 0)
+    if(H5FD__core_flush(_file, (hid_t)-1, TRUE) < 0)
         HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush core vfd backing store")
 
     /* Destroy the dirty region list */
     if(file->dirty_list)
-        if(H5FD_core_destroy_dirty_list(file) != SUCCEED)
+        if(H5FD__core_destroy_dirty_list(file) != SUCCEED)
             HGOTO_ERROR(H5E_VFL, H5E_CANTFREE, FAIL, "unable to free core vfd dirty region list")
 
     /* Release resources */
@@ -908,11 +914,11 @@ H5FD_core_close(H5FD_t *_file)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_core_close() */
+} /* end H5FD__core_close() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FD_core_cmp
+ * Function:    H5FD__core_cmp
  *
  * Purpose:     Compares two files belonging to this driver by name. If one
  *              file doesn't have a name then it is less than the other file.
@@ -920,7 +926,6 @@ done:
  *              address.
  *
  * Return:      Success:    A value like strcmp()
- *
  *              Failure:    never fails (arguments were checked by the
  *                          caller).
  *
@@ -930,13 +935,13 @@ done:
  *-------------------------------------------------------------------------
  */
 static int
-H5FD_core_cmp(const H5FD_t *_f1, const H5FD_t *_f2)
+H5FD__core_cmp(const H5FD_t *_f1, const H5FD_t *_f2)
 {
     const H5FD_core_t   *f1 = (const H5FD_core_t*)_f1;
     const H5FD_core_t   *f2 = (const H5FD_core_t*)_f2;
     int                 ret_value = 0;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     if(f1->fd >= 0 && f2->fd >= 0) {
         /* Compare low level file information for backing store */
@@ -987,11 +992,11 @@ H5FD_core_cmp(const H5FD_t *_f1, const H5FD_t *_f2)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_core_cmp() */
+} /* end H5FD__core_cmp() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FD_core_query
+ * Function:    H5FD__core_query
  *
  * Purpose:     Set the flags that this VFL driver is capable of supporting.
  *              (listed in H5FDpublic.h)
@@ -1004,21 +1009,21 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_core_query(const H5FD_t * _file, unsigned long *flags /* out */)
+H5FD__core_query(const H5FD_t * _file, unsigned long *flags /* out */)
 {
     const H5FD_core_t   *file = (const H5FD_core_t*)_file;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Set the VFL feature flags that this driver supports */
     if(flags) {
         *flags = 0;
-        *flags |= H5FD_FEAT_AGGREGATE_METADATA; /* OK to aggregate metadata allocations */
-        *flags |= H5FD_FEAT_ACCUMULATE_METADATA; /* OK to accumulate metadata for faster writes */
-        *flags |= H5FD_FEAT_DATA_SIEVE;       /* OK to perform data sieving for faster raw data reads & writes */
-        *flags |= H5FD_FEAT_AGGREGATE_SMALLDATA; /* OK to aggregate "small" raw data allocations */
-        *flags |= H5FD_FEAT_ALLOW_FILE_IMAGE;   /* OK to use file image feature with this VFD */
-        *flags |= H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS;       /* OK to use file image callbacks with this VFD */
+        *flags |= H5FD_FEAT_AGGREGATE_METADATA;             /* OK to aggregate metadata allocations                             */
+        *flags |= H5FD_FEAT_ACCUMULATE_METADATA;            /* OK to accumulate metadata for faster writes                      */
+        *flags |= H5FD_FEAT_DATA_SIEVE;                     /* OK to perform data sieving for faster raw data reads & writes    */
+        *flags |= H5FD_FEAT_AGGREGATE_SMALLDATA;            /* OK to aggregate "small" raw data allocations                     */
+        *flags |= H5FD_FEAT_ALLOW_FILE_IMAGE;               /* OK to use file image feature with this VFD                       */
+        *flags |= H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS;   /* OK to use file image callbacks with this VFD                     */
 
         /* If the backing store is open, a POSIX file handle is available */
         if(file && file->fd >= 0 && file->backing_store)
@@ -1026,11 +1031,11 @@ H5FD_core_query(const H5FD_t * _file, unsigned long *flags /* out */)
     } /* end if */
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5FD_core_query() */
+} /* end H5FD__core_query() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FD_core_get_eoa
+ * Function:    H5FD__core_get_eoa
  *
  * Purpose:     Gets the end-of-address marker for the file. The EOA marker
  *              is the first address past the last byte allocated in the
@@ -1044,18 +1049,18 @@ H5FD_core_query(const H5FD_t * _file, unsigned long *flags /* out */)
  *-------------------------------------------------------------------------
  */
 static haddr_t
-H5FD_core_get_eoa(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type)
+H5FD__core_get_eoa(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type)
 {
     const H5FD_core_t   *file = (const H5FD_core_t*)_file;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     FUNC_LEAVE_NOAPI(file->eoa)
-}
+} /* end H5FD__core_get_eoa() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FD_core_set_eoa
+ * Function:    H5FD__core_set_eoa
  *
  * Purpose:     Set the end-of-address marker for the file. This function is
  *              called shortly after an existing HDF5 file is opened in order
@@ -1069,12 +1074,12 @@ H5FD_core_get_eoa(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_core_set_eoa(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr)
+H5FD__core_set_eoa(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr)
 {
     H5FD_core_t *file = (H5FD_core_t*)_file;
     herr_t      ret_value = SUCCEED;            /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     if(ADDR_OVERFLOW(addr))
         HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "address overflow")
@@ -1083,11 +1088,11 @@ H5FD_core_set_eoa(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_core_set_eoa() */
+} /* end H5FD__core_set_eoa() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FD_core_get_eof
+ * Function:    H5FD__core_get_eof
  *
  * Purpose:     Returns the end-of-file marker, which is the greater of
  *              either the size of the underlying memory or the HDF5
@@ -1103,18 +1108,18 @@ done:
  *-------------------------------------------------------------------------
  */
 static haddr_t
-H5FD_core_get_eof(const H5FD_t *_file)
+H5FD__core_get_eof(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type)
 {
     const H5FD_core_t   *file = (const H5FD_core_t*)_file;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
-    FUNC_LEAVE_NOAPI(MAX(file->eof, file->eoa))
-}
+    FUNC_LEAVE_NOAPI(file->eof)
+} /* end H5FD__core_get_eof() */
 
 

 /*-------------------------------------------------------------------------
- * Function:       H5FD_core_get_handle
+ * Function:       H5FD__core_get_handle
  *
  * Purpose:        Gets the file handle of CORE file driver.
  *
@@ -1126,12 +1131,12 @@ H5FD_core_get_eof(const H5FD_t *_file)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_core_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle)
+H5FD__core_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle)
 {
     H5FD_core_t *file = (H5FD_core_t *)_file;   /* core VFD info */
     herr_t ret_value = SUCCEED;                 /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Check args */
     if(!file_handle)
@@ -1170,11 +1175,11 @@ H5FD_core_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_core_get_handle() */
+} /* end H5FD__core_get_handle() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FD_core_read
+ * Function:    H5FD__core_read
  *
  * Purpose:     Reads SIZE bytes of data from FILE beginning at address ADDR
  *              into buffer BUF according to data transfer properties in
@@ -1182,7 +1187,6 @@ done:
  *
  * Return:      Success:    SUCCEED. Result is stored in caller-supplied
  *                          buffer BUF.
- *
  *              Failure:    FAIL, Contents of buffer BUF are undefined.
  *
  * Programmer:  Robb Matzke
@@ -1191,13 +1195,13 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_core_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t addr,
+H5FD__core_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t addr,
         size_t size, void *buf/*out*/)
 {
-    H5FD_core_t  *file = (H5FD_core_t*)_file;
-    herr_t      ret_value=SUCCEED;       /* Return value */
+    H5FD_core_t	*file = (H5FD_core_t*)_file;
+    herr_t ret_value = SUCCEED;       /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     HDassert(file && file->pub.cls);
     HDassert(buf);
@@ -1233,11 +1237,11 @@ H5FD_core_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNUS
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5FD__core_read() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FD_core_write
+ * Function:    H5FD__core_write
  *
  * Purpose:     Writes SIZE bytes of data to FILE beginning at address ADDR
  *              from buffer BUF according to data transfer properties in
@@ -1251,13 +1255,13 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_core_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t addr,
+H5FD__core_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t addr,
         size_t size, const void *buf)
 {
     H5FD_core_t *file = (H5FD_core_t*)_file;
     herr_t      ret_value = SUCCEED;            /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     HDassert(file && file->pub.cls);
     HDassert(buf);
@@ -1303,7 +1307,8 @@ H5FD_core_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNU
     if(file->dirty_list) {
         haddr_t start = addr;
         haddr_t end = addr + (haddr_t)size - 1;
-        if(H5FD_core_add_dirty_region(file, start, end) != SUCCEED)
+
+        if(H5FD__core_add_dirty_region(file, start, end) != SUCCEED)
             HGOTO_ERROR(H5E_VFL, H5E_CANTINSERT, FAIL, "unable to add core VFD dirty region during write call - addresses: start=%llu end=%llu", start, end)
     }
 
@@ -1315,11 +1320,11 @@ H5FD_core_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNU
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_core_write() */
+} /* end H5FD__core_write() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FD_core_flush
+ * Function:    H5FD__core_flush
  *
  * Purpose:     Flushes the file to backing store if there is any and if the
  *              dirty flag is set.
@@ -1332,12 +1337,12 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_core_flush(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, unsigned H5_ATTR_UNUSED closing)
+H5FD__core_flush(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, unsigned H5_ATTR_UNUSED closing)
 {
     H5FD_core_t *file = (H5FD_core_t*)_file;
     herr_t      ret_value = SUCCEED;            /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Write to backing store */
     if (file->dirty && file->fd >= 0 && file->backing_store) {
@@ -1358,18 +1363,19 @@ H5FD_core_flush(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, unsigned H5_ATTR_UN
                 if(item->start < file->eof) {
                     if(item->end >= file->eof)
                         item->end = file->eof - 1;
+
+
                     size = (size_t)((item->end - item->start) + 1);
 #ifdef DER
 fprintf(stderr, "(%llu, %llu : %lu)\n", item->start, item->end, size);
 #endif
-                    if(H5FD_core_write_to_bstore(file, item->start, size) != SUCCEED)
+                    if(H5FD__core_write_to_bstore(file, item->start, size) != SUCCEED)
                         HGOTO_ERROR(H5E_VFL, H5E_WRITEERROR, FAIL, "unable to write to backing store")
                 } /* end if */
-                
+
                 item = H5FL_FREE(H5FD_core_region_t, item);
-            } /* end while */
+           } /* end while */
 
- 
 #ifdef DER
 fprintf(stderr, "EOF: %llu\n", file->eof);
 fprintf(stderr, "EOA: %llu\n", file->eoa);
@@ -1377,24 +1383,23 @@ if(file->eoa > file->eof)
     fprintf(stderr, "*** EOA BADNESS ***\n");
 fprintf(stderr, "\n");
 #endif
-        }
+        } /* end if */
         /* Otherwise, write the entire file out at once */
         else {
-            if(H5FD_core_write_to_bstore(file, (haddr_t)0, (size_t)file->eof) != SUCCEED)
+            if(H5FD__core_write_to_bstore(file, (haddr_t)0, (size_t)file->eof) != SUCCEED)
                 HGOTO_ERROR(H5E_VFL, H5E_WRITEERROR, FAIL, "unable to write to backing store")
-
-        } /* end while */
+        } /* end else */
 
         file->dirty = FALSE;
     }
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5FD__core_flush() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FD_core_truncate
+ * Function:    H5FD__core_truncate
  *
  * Purpose:     Makes sure that the true file size is the same (or larger)
  *              than the end-of-address.
@@ -1429,13 +1434,13 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_core_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t closing)
+H5FD__core_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t closing)
 {
     H5FD_core_t *file = (H5FD_core_t*)_file;
     size_t new_eof;                             /* New size of memory buffer */
     herr_t ret_value = SUCCEED;                 /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     HDassert(file);
 
@@ -1515,5 +1520,77 @@ fprintf(stderr, "OLD: Truncated to: %llu\n", file->eoa);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FD_core_truncate() */
+} /* end H5FD__core_truncate() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_core_lock
+ *
+ * Purpose:     To place an advisory lock on a file.
+ *		The lock type to apply depends on the parameter "rw":
+ *			TRUE--opens for write: an exclusive lock
+ *			FALSE--opens for read: a shared lock
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi; May 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_core_lock(H5FD_t *_file, hbool_t rw)
+{
+    H5FD_core_t *file = (H5FD_core_t*)_file;	/* VFD file struct */
+    int lock;					/* The type of lock */
+    herr_t ret_value = SUCCEED;                 /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file);
+    if(file->fd >= 0) {
+
+	/* Determine the type of lock */
+	lock = rw ? LOCK_EX : LOCK_SH;
+    
+	/* Place the lock with non-blocking */
+	if(HDflock(file->fd, lock | LOCK_NB) < 0)
+	    HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "unable to flock file")
+    }
+    /* Otherwise a noop */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_core_lock() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_core_unlock
+ *
+ * Purpose:     To remove the existing lock on the file
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi; May 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_core_unlock(H5FD_t *_file)
+{
+    H5FD_core_t *file = (H5FD_core_t*)_file;	/* VFD file struct */
+    herr_t ret_value = SUCCEED;                 /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file);
+
+    if(file->fd >= 0) {
+
+	if(HDflock(file->fd, LOCK_UN) < 0)
+	    HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "unable to flock (unlock) file")
+    }
+    /* Otherwise a noop */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_core_unlock() */
diff --git a/src/H5FDcore.h b/src/H5FDcore.h
index dca110e..16cce89 100644
--- a/src/H5FDcore.h
+++ b/src/H5FDcore.h
@@ -17,20 +17,17 @@
  * Programmer:  Robb Matzke <matzke at llnl.gov>
  *              Monday, August  2, 1999
  *
- * Purpose:	The public header file for the sec2 driver.
+ * Purpose:	The public header file for the core driver.
  */
 #ifndef H5FDcore_H
 #define H5FDcore_H
 
-#include "H5Ipublic.h"
-
 #define H5FD_CORE	(H5FD_core_init())
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 H5_DLL hid_t H5FD_core_init(void);
-H5_DLL void H5FD_core_term(void);
 H5_DLL herr_t H5Pset_fapl_core(hid_t fapl_id, size_t increment,
 				hbool_t backing_store);
 H5_DLL herr_t H5Pget_fapl_core(hid_t fapl_id, size_t *increment/*out*/,
@@ -40,3 +37,4 @@ H5_DLL herr_t H5Pget_fapl_core(hid_t fapl_id, size_t *increment/*out*/,
 #endif
 
 #endif
+
diff --git a/src/H5FDdirect.c b/src/H5FDdirect.c
index 5265a23..27088a4 100644
--- a/src/H5FDdirect.c
+++ b/src/H5FDdirect.c
@@ -22,12 +22,8 @@
  *    buffer.  The main system support this feature is Linux.
  */
 
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC  H5FD_direct_init_interface
+#include "H5FDdrvr_module.h" /* This source code file is part of the H5FD driver module */
 
-/* For system function posix_memalign - Commented it out because copper isn't able to compile
- * this file. */
-/* #define _XOPEN_SOURCE 600 */
 
 #include "H5private.h"    /* Generic Functions      */
 #include "H5Eprivate.h"    /* Error handling        */
@@ -97,6 +93,7 @@ typedef struct H5FD_direct_t {
     DWORD fileindexlo;
     DWORD fileindexhi;
 #endif
+
 } H5FD_direct_t;
 
 /*
@@ -123,6 +120,7 @@ typedef struct H5FD_direct_t {
          (HDoff_t)((A)+(Z))<(HDoff_t)(A))
 
 /* Prototypes */
+static herr_t H5FD_direct_term(void);
 static void *H5FD_direct_fapl_get(H5FD_t *file);
 static void *H5FD_direct_fapl_copy(const void *_old_fa);
 static H5FD_t *H5FD_direct_open(const char *name, unsigned flags, hid_t fapl_id,
@@ -132,18 +130,22 @@ static int H5FD_direct_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
 static herr_t H5FD_direct_query(const H5FD_t *_f1, unsigned long *flags);
 static haddr_t H5FD_direct_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
 static herr_t H5FD_direct_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
-static haddr_t H5FD_direct_get_eof(const H5FD_t *_file);
+static haddr_t H5FD_direct_get_eof(const H5FD_t *_file, H5FD_mem_t type);
 static herr_t  H5FD_direct_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
 static herr_t H5FD_direct_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
            size_t size, void *buf);
 static herr_t H5FD_direct_write(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
             size_t size, const void *buf);
 static herr_t H5FD_direct_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing);
+static herr_t H5FD_direct_lock(H5FD_t *_file, hbool_t rw);
+static herr_t H5FD_direct_unlock(H5FD_t *_file);
+
 
 static const H5FD_class_t H5FD_direct_g = {
     "direct",          /*name      */
     MAXADDR,          /*maxaddr    */
     H5F_CLOSE_WEAK,        /* fc_degree    */
+    H5FD_direct_term,                           /*terminate             */
     NULL,          /*sb_size    */
     NULL,          /*sb_encode    */
     NULL,          /*sb_decode    */
@@ -168,10 +170,10 @@ static const H5FD_class_t H5FD_direct_g = {
     H5FD_direct_read,        /*read      */
     H5FD_direct_write,        /*write      */
     NULL,          /*flush      */
-    H5FD_direct_truncate,      /*truncate    */
-    NULL,                                       /*lock                  */
-    NULL,                                       /*unlock                */
-    H5FD_FLMAP_DICHOTOMY                        /*fl_map                */
+    H5FD_direct_truncate,      	/*truncate    */
+    H5FD_direct_lock,          	/*lock                  */
+    H5FD_direct_unlock,        	/*unlock                */
+    H5FD_FLMAP_DICHOTOMY       	/*fl_map                */
 };
 
 /* Declare a free list to manage the H5FD_direct_t struct */
@@ -180,10 +182,9 @@ H5FL_DEFINE_STATIC(H5FD_direct_t);
 

 /*--------------------------------------------------------------------------
 NAME
-   H5FD_direct_init_interface -- Initialize interface-specific information
+   H5FD__init_package -- Initialize interface-specific information
 USAGE
-    herr_t H5FD_direct_init_interface()
-
+    herr_t H5FD__init_package()
 RETURNS
     Non-negative on success/Negative on failure
 DESCRIPTION
@@ -192,12 +193,18 @@ DESCRIPTION
 
 --------------------------------------------------------------------------*/
 static herr_t
-H5FD_direct_init_interface(void)
+H5FD__init_package(void)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    herr_t ret_value = SUCCEED;
 
-    FUNC_LEAVE_NOAPI(H5FD_direct_init())
-} /* H5FD_direct_init_interface() */
+    FUNC_ENTER_STATIC
+
+    if(H5FD_direct_init() < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "unable to initialize direct VFD")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FD__init_package() */
 
 

 /*-------------------------------------------------------------------------
@@ -228,7 +235,7 @@ H5FD_direct_init(void)
         H5FD_DIRECT_g = H5FD_register(&H5FD_direct_g,sizeof(H5FD_class_t),FALSE);
 
     /* Set return value */
-    ret_value=H5FD_DIRECT_g;
+    ret_value = H5FD_DIRECT_g;
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -240,16 +247,14 @@ done:
  *
  * Purpose:  Shut down the VFD
  *
- * Return:  <none>
+ * Returns:     Non-negative on success or negative on failure
  *
  * Programmer:  Raymond Lu
  *              Wednesday, 20 September 2006
  *
- * Modification:
- *
  *---------------------------------------------------------------------------
  */
-void
+static herr_t
 H5FD_direct_term(void)
 {
     FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -257,7 +262,7 @@ H5FD_direct_term(void)
     /* Reset VFL ID */
     H5FD_DIRECT_g=0;
 
-    FUNC_LEAVE_NOAPI_VOID
+    FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5FD_direct_term() */
 
 

@@ -273,8 +278,6 @@ H5FD_direct_term(void)
  * Programmer:  Raymond Lu
  *    Wednesday, 20 September 2006
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -291,17 +294,17 @@ H5Pset_fapl_direct(hid_t fapl_id, size_t boundary, size_t block_size, size_t cbu
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
 
     if(boundary != 0)
-      fa.mboundary = boundary;
+        fa.mboundary = boundary;
     else
-  fa.mboundary = MBOUNDARY_DEF;
+        fa.mboundary = MBOUNDARY_DEF;
     if(block_size != 0)
-      fa.fbsize = block_size;
+        fa.fbsize = block_size;
     else
-  fa.fbsize = FBSIZE_DEF;
+        fa.fbsize = FBSIZE_DEF;
     if(cbuf_size != 0)
-      fa.cbsize = cbuf_size;
+        fa.cbsize = cbuf_size;
     else
-  fa.cbsize = CBSIZE_DEF;
+        fa.cbsize = CBSIZE_DEF;
 
     /* Set the default to be true for data alignment */
     fa.must_align = TRUE;
@@ -310,7 +313,7 @@ H5Pset_fapl_direct(hid_t fapl_id, size_t boundary, size_t block_size, size_t cbu
     if(fa.cbsize % fa.fbsize != 0)
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "copy buffer size must be a multiple of block size")
 
-    ret_value= H5P_set_driver(plist, H5FD_DIRECT, &fa);
+    ret_value = H5P_set_driver(plist, H5FD_DIRECT, &fa);
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -330,37 +333,35 @@ done:
  * Programmer:  Raymond Lu
  *              Wednesday, October 18, 2006
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 herr_t
 H5Pget_fapl_direct(hid_t fapl_id, size_t *boundary/*out*/, size_t *block_size/*out*/,
     size_t *cbuf_size/*out*/)
 {
-    H5FD_direct_fapl_t  *fa;
     H5P_genplist_t *plist;      /* Property list pointer */
-    herr_t      ret_value=SUCCEED;       /* Return value */
+    const H5FD_direct_fapl_t  *fa;
+    herr_t      ret_value = SUCCEED;       /* Return value */
 
     FUNC_ENTER_API(FAIL)
     H5TRACE4("e", "ixxx", fapl_id, boundary, block_size, cbuf_size);
 
     if(NULL == (plist = H5P_object_verify(fapl_id,H5P_FILE_ACCESS)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access list")
-    if (H5FD_DIRECT!=H5P_get_driver(plist))
+    if(H5FD_DIRECT != H5P_peek_driver(plist))
         HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "incorrect VFL driver")
-    if (NULL==(fa=H5P_get_driver_info(plist)))
+    if(NULL == (fa = H5P_peek_driver_info(plist)))
         HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "bad VFL driver info")
-    if (boundary)
+    if(boundary)
         *boundary = fa->mboundary;
-    if (block_size)
-  *block_size = fa->fbsize;
+    if(block_size)
+        *block_size = fa->fbsize;
     if (cbuf_size)
-  *cbuf_size = fa->cbsize;
+        *cbuf_size = fa->cbsize;
 
 done:
     FUNC_LEAVE_API(ret_value)
-}
+} /* end H5Pget_fapl_direct() */
 
 

 /*-------------------------------------------------------------------------
@@ -501,7 +502,7 @@ H5FD_direct_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxadd
     /* Get the driver specific information */
     if(NULL == (plist = H5P_object_verify(fapl_id,H5P_FILE_ACCESS)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
-    if(NULL == (fa = (H5FD_direct_fapl_t *)H5P_get_driver_info(plist)))
+    if(NULL == (fa = (H5FD_direct_fapl_t *)H5P_peek_driver_info(plist)))
         HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, NULL, "bad VFL driver info")
 
     file->fd = fd;
@@ -692,10 +693,11 @@ H5FD_direct_query(const H5FD_t H5_ATTR_UNUSED * _f, unsigned long *flags /* out
     /* Set the VFL feature flags that this driver supports */
     if(flags) {
         *flags = 0;
-        *flags|=H5FD_FEAT_AGGREGATE_METADATA; /* OK to aggregate metadata allocations */
-        *flags|=H5FD_FEAT_ACCUMULATE_METADATA; /* OK to accumulate metadata for faster writes */
-        *flags|=H5FD_FEAT_DATA_SIEVE;       /* OK to perform data sieving for faster raw data reads & writes */
-        *flags|=H5FD_FEAT_AGGREGATE_SMALLDATA; /* OK to aggregate "small" raw data allocations */
+        *flags |= H5FD_FEAT_AGGREGATE_METADATA;     /* OK to aggregate metadata allocations                             */
+        *flags |= H5FD_FEAT_ACCUMULATE_METADATA;    /* OK to accumulate metadata for faster writes                      */
+        *flags |= H5FD_FEAT_DATA_SIEVE;             /* OK to perform data sieving for faster raw data reads & writes    */
+        *flags |= H5FD_FEAT_AGGREGATE_SMALLDATA;    /* OK to aggregate "small" raw data allocations                     */
+        *flags |= H5FD_FEAT_SUPPORTS_SWMR_IO;       /* VFD supports the single-writer/multiple-readers (SWMR) pattern   */
     }
 
     FUNC_LEAVE_NOAPI(SUCCEED)
@@ -789,13 +791,13 @@ H5FD_direct_set_eoa(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr)
  *-------------------------------------------------------------------------
  */
 static haddr_t
-H5FD_direct_get_eof(const H5FD_t *_file)
+H5FD_direct_get_eof(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type)
 {
     const H5FD_direct_t  *file = (const H5FD_direct_t*)_file;
 
     FUNC_ENTER_NOAPI_NOINIT
 
-    FUNC_LEAVE_NOAPI(MAX(file->eof, file->eoa))
+    FUNC_LEAVE_NOAPI(file->eof)
 }
 
 

@@ -1310,5 +1312,72 @@ H5FD_direct_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t H5_ATT
 done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5FD_direct_truncate() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_direct_lock
+ *
+ * Purpose:     To place an advisory lock on a file.
+ *		The lock type to apply depends on the parameter "rw":
+ *			TRUE--opens for write: an exclusive lock
+ *			FALSE--opens for read: a shared lock
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi; May 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_direct_lock(H5FD_t *_file, hbool_t rw)
+{
+    H5FD_direct_t  *file = (H5FD_direct_t*)_file;	/* VFD file struct */
+    int lock;						/* The type of lock */
+    herr_t ret_value = SUCCEED;                 	/* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file);
+
+    /* Determine the type of lock */
+    int lock = rw ? LOCK_EX : LOCK_SH;
+    
+    /* Place the lock with non-blocking */
+    if(HDflock(file->fd, lock | LOCK_NB) < 0)
+        HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "unable to flock file")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_direct_lock() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_direct_unlock
+ *
+ * Purpose:     To remove the existing lock on the file
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi; May 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_direct_unlock(H5FD_t *_file)
+{
+    H5FD_direct_t  *file = (H5FD_direct_t*)_file;	/* VFD file struct */
+    herr_t ret_value = SUCCEED;                 	/* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file);
+
+    if(HDflock(file->fd, LOCK_UN) < 0)
+        HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "unable to flock (unlock) file")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_direct_unlock() */
+
 #endif /* H5_HAVE_DIRECT */
 
diff --git a/src/H5FDdirect.h b/src/H5FDdirect.h
index 26c70f3..5ceb91f 100644
--- a/src/H5FDdirect.h
+++ b/src/H5FDdirect.h
@@ -22,8 +22,6 @@
 #ifndef H5FDdirect_H
 #define H5FDdirect_H
 
-#include "H5Ipublic.h"
-
 #ifdef H5_HAVE_DIRECT
 #       define H5FD_DIRECT	(H5FD_direct_init())
 #else
@@ -42,7 +40,6 @@ extern "C" {
 #define CBSIZE_DEF		16*1024*1024
 
 H5_DLL hid_t H5FD_direct_init(void);
-H5_DLL void H5FD_direct_term(void);
 H5_DLL herr_t H5Pset_fapl_direct(hid_t fapl_id, size_t alignment, size_t block_size,
 			size_t cbuf_size);
 H5_DLL herr_t H5Pget_fapl_direct(hid_t fapl_id, size_t *boundary/*out*/,
@@ -55,3 +52,4 @@ H5_DLL herr_t H5Pget_fapl_direct(hid_t fapl_id, size_t *boundary/*out*/,
 #endif /* H5_HAVE_DIRECT */
 
 #endif
+
diff --git a/src/H5FDdrvr_module.h b/src/H5FDdrvr_module.h
new file mode 100644
index 0000000..8bb83a1
--- /dev/null
+++ b/src/H5FDdrvr_module.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5FD driver package.  Including this header means that the source file
+ *		is part of the H5FD driver package.
+ */
+#ifndef _H5FDdrvr_module_H
+#define _H5FDdrvr_module_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5_MY_PKG       H5FD
+#define H5_MY_PKG_ERR   H5E_FILE
+#define H5_MY_PKG_INIT  YES
+#define H5_PKG_SINGLE_SOURCE
+
+#endif /* _H5FDdrvr_module_H */
+
diff --git a/src/H5FDfamily.c b/src/H5FDfamily.c
index 8003fdd..b92a685 100644
--- a/src/H5FDfamily.c
+++ b/src/H5FDfamily.c
@@ -34,8 +34,7 @@
  *
  */
 
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5FD_family_init_interface
+#include "H5FDdrvr_module.h" /* This source code file is part of the H5FD driver module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -83,6 +82,7 @@ typedef struct H5FD_family_fapl_t {
 } H5FD_family_fapl_t;
 
 /* Callback prototypes */
+static herr_t H5FD_family_term(void);
 static void *H5FD_family_fapl_get(H5FD_t *_file);
 static void *H5FD_family_fapl_copy(const void *_old_fa);
 static herr_t H5FD_family_fapl_free(void *_fa);
@@ -98,7 +98,7 @@ static int H5FD_family_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
 static herr_t H5FD_family_query(const H5FD_t *_f1, unsigned long *flags);
 static haddr_t H5FD_family_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
 static herr_t H5FD_family_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t eoa);
-static haddr_t H5FD_family_get_eof(const H5FD_t *_file);
+static haddr_t H5FD_family_get_eof(const H5FD_t *_file, H5FD_mem_t type);
 static herr_t  H5FD_family_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
 static herr_t H5FD_family_read(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
 			       size_t size, void *_buf/*out*/);
@@ -106,12 +106,15 @@ static herr_t H5FD_family_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, h
 				size_t size, const void *_buf);
 static herr_t H5FD_family_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing);
 static herr_t H5FD_family_truncate(H5FD_t *_file, hid_t dxpl_id, unsigned closing);
+static herr_t H5FD_family_lock(H5FD_t *_file, hbool_t rw);
+static herr_t H5FD_family_unlock(H5FD_t *_file);
 
 /* The class struct */
 static const H5FD_class_t H5FD_family_g = {
     "family",					/*name			*/
     HADDR_MAX,					/*maxaddr		*/
     H5F_CLOSE_WEAK,				/*fc_degree		*/
+    H5FD_family_term,                           /*terminate             */
     H5FD_family_sb_size,			/*sb_size		*/
     H5FD_family_sb_encode,			/*sb_encode		*/
     H5FD_family_sb_decode,			/*sb_decode		*/
@@ -137,18 +140,17 @@ static const H5FD_class_t H5FD_family_g = {
     H5FD_family_write,				/*write			*/
     H5FD_family_flush,				/*flush			*/
     H5FD_family_truncate,			/*truncate		*/
-    NULL,                                       /*lock                  */
-    NULL,                                       /*unlock                */
+    H5FD_family_lock,                           /*lock                  */
+    H5FD_family_unlock,                         /*unlock                */
     H5FD_FLMAP_DICHOTOMY                        /*fl_map                */
 };
 
 

 /*--------------------------------------------------------------------------
 NAME
-   H5FD_family_init_interface -- Initialize interface-specific information
+   H5FD__init_package -- Initialize interface-specific information
 USAGE
-    herr_t H5FD_family_init_interface()
-
+    herr_t H5FD__init_package()
 RETURNS
     Non-negative on success/Negative on failure
 DESCRIPTION
@@ -157,12 +159,18 @@ DESCRIPTION
 
 --------------------------------------------------------------------------*/
 static herr_t
-H5FD_family_init_interface(void)
+H5FD__init_package(void)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
 
-    FUNC_LEAVE_NOAPI(H5FD_family_init())
-} /* H5FD_family_init_interface() */
+    if(H5FD_family_init() < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "unable to initialize family VFD")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FD__init_package() */
 
 

 /*-------------------------------------------------------------------------
@@ -205,16 +213,14 @@ done:
  *
  * Purpose:	Shut down the VFD
  *
- * Return:	<none>
+ * Returns:     Non-negative on success or negative on failure
  *
  * Programmer:  Quincey Koziol
  *              Friday, Jan 30, 2004
  *
- * Modification:
- *
  *---------------------------------------------------------------------------
  */
-void
+static herr_t
 H5FD_family_term(void)
 {
     FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -222,7 +228,7 @@ H5FD_family_term(void)
     /* Reset VFL ID */
     H5FD_FAMILY_g=0;
 
-    FUNC_LEAVE_NOAPI_VOID
+    FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5FD_family_term() */
 
 

@@ -261,7 +267,6 @@ H5Pset_fapl_family(hid_t fapl_id, hsize_t msize, hid_t memb_fapl_id)
     FUNC_ENTER_API(FAIL)
     H5TRACE3("e", "ihi", fapl_id, msize, memb_fapl_id);
 
-
     /* Check arguments */
     if(TRUE != H5P_isa_class(fapl_id, H5P_FILE_ACCESS))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
@@ -271,16 +276,13 @@ H5Pset_fapl_family(hid_t fapl_id, hsize_t msize, hid_t memb_fapl_id)
         if(TRUE != H5P_isa_class(memb_fapl_id, H5P_FILE_ACCESS))
             HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access list")
 
-    /*
-     * Initialize driver specific information. No need to copy it into the FA
-     * struct since all members will be copied by H5P_set_driver().
-     */
+    /* Initialize driver specific information. */
     fa.memb_size = msize;
     fa.memb_fapl_id = memb_fapl_id;
 
     if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
-    ret_value= H5P_set_driver(plist, H5FD_FAMILY, &fa);
+    ret_value = H5P_set_driver(plist, H5FD_FAMILY, &fa);
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -310,21 +312,20 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5Pget_fapl_family(hid_t fapl_id, hsize_t *msize/*out*/,
-		   hid_t *memb_fapl_id/*out*/)
+H5Pget_fapl_family(hid_t fapl_id, hsize_t *msize/*out*/, hid_t *memb_fapl_id/*out*/)
 {
-    H5FD_family_fapl_t	*fa;
     H5P_genplist_t *plist;      /* Property list pointer */
-    herr_t      ret_value=SUCCEED;       /* Return value */
+    const H5FD_family_fapl_t	*fa;
+    herr_t      ret_value = SUCCEED;       /* Return value */
 
     FUNC_ENTER_API(FAIL)
     H5TRACE3("e", "ixx", fapl_id, msize, memb_fapl_id);
 
     if(NULL == (plist = H5P_object_verify(fapl_id,H5P_FILE_ACCESS)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access list")
-    if(H5FD_FAMILY != H5P_get_driver(plist))
+    if(H5FD_FAMILY != H5P_peek_driver(plist))
         HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "incorrect VFL driver")
-    if(NULL == (fa = (H5FD_family_fapl_t *)H5P_get_driver_info(plist)))
+    if(NULL == (fa = (const H5FD_family_fapl_t *)H5P_peek_driver_info(plist)))
         HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "bad VFL driver info")
     if(msize)
         *msize = fa->memb_size;
@@ -362,7 +363,7 @@ H5FD_family_fapl_get(H5FD_t *_file)
     H5FD_family_t	*file = (H5FD_family_t*)_file;
     H5FD_family_fapl_t	*fa = NULL;
     H5P_genplist_t *plist;      /* Property list pointer */
-    void *ret_value;       /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -408,7 +409,7 @@ H5FD_family_fapl_copy(const void *_old_fa)
     const H5FD_family_fapl_t *old_fa = (const H5FD_family_fapl_t*)_old_fa;
     H5FD_family_fapl_t *new_fa = NULL;
     H5P_genplist_t *plist;      /* Property list pointer */
-    void *ret_value;       /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -581,26 +582,21 @@ H5FD_family_sb_decode(H5FD_t *_file, const char H5_ATTR_UNUSED *name, const unsi
      * h5repart is being used to change member file size.  h5repart will open
      * files for read and write.  When the files are closed, metadata will be
      * flushed to the files and updated to this new size */
-    if(file->mem_newsize) {
+    if(file->mem_newsize)
         file->memb_size = file->pmem_size = file->mem_newsize;
-        HGOTO_DONE(ret_value)
-    } /* end if */
-
-    /* Default - use the saved member size */
-    if(file->pmem_size == H5F_FAMILY_DEFAULT)
-       file->pmem_size = msize;
-
-    /* Check if member size from file access property is correct */
-    if(msize != file->pmem_size) {
-        char err_msg[128];
+    else {
+        /* Default - use the saved member size */
+        if(file->pmem_size == H5F_FAMILY_DEFAULT)
+           file->pmem_size = msize;
 
-        HDsnprintf(err_msg, sizeof(err_msg), "Family member size should be %lu.  But the size from file access property is %lu", (unsigned long)msize, (unsigned long)file->pmem_size);
-        HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, err_msg)
-    } /* end if */
+        /* Check if member size from file access property is correct */
+        if(msize != file->pmem_size)
+            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "Family member size should be %lu.  But the size from file access property is %lu", (unsigned long)msize, (unsigned long)file->pmem_size)
 
-    /* Update member file size to the size saved in the superblock.
-     * That's the size intended to be. */
-    file->memb_size = msize;
+        /* Update member file size to the size saved in the superblock.
+         * That's the size intended to be. */
+        file->memb_size = msize;
+    } /* end else */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -621,23 +617,6 @@ done:
  * Programmer:	Robb Matzke
  *              Wednesday, August  4, 1999
  *
- * Modifications:
- *              Raymond Lu
- *              Thursday, November 18, 2004
- *              When file is re-opened, member size passed in from access property
- *              is checked to see if it's reasonable.  If there is only 1 member
- *              file, member size can't be smaller than current member size.
- *              If there are at least 2 member files, member size can only be equal
- *              the 1st member size.
- *
- *              Raymond Lu
- *              Tuesday, May 24, 2005
- *              The modification described above has been changed.  The major checking
- *              is done in H5F_read_superblock.  Member file size is saved in the
- *              superblock now.  H5F_read_superblock() reads this saved size and compare
- *              to the size passed in from file access property.  Wrong size will
- *              result in a failure.
- *
  *-------------------------------------------------------------------------
  */
 static H5FD_t *
@@ -661,7 +640,7 @@ H5FD_family_open(const char *name, unsigned flags, hid_t fapl_id,
     /* Initialize file from file access properties */
     if(NULL == (file = (H5FD_family_t *)H5MM_calloc(sizeof(H5FD_family_t))))
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "unable to allocate file struct")
-    if(H5P_FILE_ACCESS_DEFAULT==fapl_id) {
+    if(H5P_FILE_ACCESS_DEFAULT == fapl_id) {
         file->memb_fapl_id = H5P_FILE_ACCESS_DEFAULT;
         if(H5I_inc_ref(file->memb_fapl_id, FALSE) < 0)
             HGOTO_ERROR(H5E_VFL, H5E_CANTINC, NULL, "unable to increment ref count on VFL driver")
@@ -671,28 +650,25 @@ H5FD_family_open(const char *name, unsigned flags, hid_t fapl_id,
     } /* end if */
     else {
         H5P_genplist_t      *plist;      /* Property list pointer */
-        H5FD_family_fapl_t *fa;
+        const H5FD_family_fapl_t *fa;
 
         if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
             HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
-        if(NULL == (fa = (H5FD_family_fapl_t *)H5P_get_driver_info(plist)))
+        if(NULL == (fa = (const H5FD_family_fapl_t *)H5P_peek_driver_info(plist)))
             HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, NULL, "bad VFL driver info")
 
         /* Check for new family file size. It's used by h5repart only. */
         if(H5P_exist_plist(plist, H5F_ACS_FAMILY_NEWSIZE_NAME) > 0) {
-            hsize_t fam_newsize = 0;        /* New member size, when repartitioning */
-
             /* Get the new family file size */
-            if(H5P_get(plist, H5F_ACS_FAMILY_NEWSIZE_NAME, &fam_newsize) < 0)
+            if(H5P_get(plist, H5F_ACS_FAMILY_NEWSIZE_NAME, &file->mem_newsize) < 0)
                 HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get new family member size")
 
-            /* Store information for later */
-            file->mem_newsize = fam_newsize; /* New member size passed in through property */
+            /* Set flag for later */
             file->repart_members = TRUE;
         } /* end if */
 
-        if(fa->memb_fapl_id==H5P_FILE_ACCESS_DEFAULT) {
-            if(H5I_inc_ref(fa->memb_fapl_id, FALSE)<0)
+        if(fa->memb_fapl_id == H5P_FILE_ACCESS_DEFAULT) {
+            if(H5I_inc_ref(fa->memb_fapl_id, FALSE) < 0)
                 HGOTO_ERROR(H5E_VFL, H5E_CANTINC, NULL, "unable to increment ref count on VFL driver")
             file->memb_fapl_id = fa->memb_fapl_id;
         } /* end if */
@@ -751,7 +727,7 @@ H5FD_family_open(const char *name, unsigned flags, hid_t fapl_id,
      * smaller than the size specified through H5Pset_fapl_family().  Update the actual
      * member size.
      */
-    if ((eof=H5FDget_eof(file->memb[0]))) file->memb_size = eof;
+    if ((eof=H5FDget_eof(file->memb[0], H5FD_MEM_DEFAULT))) file->memb_size = eof;
 
     ret_value=(H5FD_t *)file;
 
@@ -858,18 +834,17 @@ H5FD_family_cmp(const H5FD_t *_f1, const H5FD_t *_f2)
 {
     const H5FD_family_t	*f1 = (const H5FD_family_t*)_f1;
     const H5FD_family_t	*f2 = (const H5FD_family_t*)_f2;
-    int ret_value=(H5FD_VFD_DEFAULT);
+    int ret_value = 0;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    assert(f1->nmembs>=1 && f1->memb[0]);
-    assert(f2->nmembs>=1 && f2->memb[0]);
+    HDassert(f1->nmembs >= 1 && f1->memb[0]);
+    HDassert(f2->nmembs >= 1 && f2->memb[0]);
 
-    ret_value= H5FDcmp(f1->memb[0], f2->memb[0]);
+    ret_value = H5FDcmp(f1->memb[0], f2->memb[0]);
 
-done:
     FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5FD_family_cmp() */
 
 

 /*-------------------------------------------------------------------------
@@ -886,7 +861,6 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
 H5FD_family_query(const H5FD_t * _file, unsigned long *flags /* out */)
 {
@@ -904,7 +878,7 @@ H5FD_family_query(const H5FD_t * _file, unsigned long *flags /* out */)
 
         /* Check for flags that are set by h5repart */
         if(file && file->repart_members)
-            *flags |= H5FD_FEAT_DIRTY_SBLK_LOAD; /* Mark the superblock dirty when it is loaded (so the family member sizes are rewritten) */
+            *flags |= H5FD_FEAT_DIRTY_DRVRINFO_LOAD; /* Mark the superblock dirty when it is loaded (so the family member sizes are rewritten) */
     } /* end if */
 
     FUNC_LEAVE_NOAPI(SUCCEED)
@@ -1042,12 +1016,12 @@ done:
  *-------------------------------------------------------------------------
  */
 static haddr_t
-H5FD_family_get_eof(const H5FD_t *_file)
+H5FD_family_get_eof(const H5FD_t *_file, H5FD_mem_t type)
 {
     const H5FD_family_t	*file = (const H5FD_family_t*)_file;
     haddr_t		eof=0;
     int			i;      /* Local index variable */
-    haddr_t ret_value;   /* Return value */
+    haddr_t ret_value = HADDR_UNDEF;   /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1058,7 +1032,7 @@ H5FD_family_get_eof(const H5FD_t *_file)
      */
     HDassert(file->nmembs > 0);
     for(i = (int)file->nmembs - 1; i >= 0; --i) {
-        if((eof = H5FD_get_eof(file->memb[i])) != 0)
+        if((eof = H5FD_get_eof(file->memb[i], type)) != 0)
             break;
         if(0 == i)
             break;
@@ -1074,7 +1048,7 @@ H5FD_family_get_eof(const H5FD_t *_file)
     eof += ((unsigned)i)*file->memb_size;
 
     /* Set return value */
-    ret_value = MAX(eof, file->eoa);
+    ret_value = eof;
 
     FUNC_LEAVE_NOAPI(ret_value)
 }
@@ -1101,7 +1075,7 @@ H5FD_family_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle)
     H5P_genplist_t      *plist;
     hsize_t             offset;
     int                 memb;
-    herr_t              ret_value;
+    herr_t              ret_value = FAIL;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1329,3 +1303,79 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5FD_family_truncate() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_family_lock
+ *
+ * Purpose:     To place an advisory lock on a file.
+ *              The lock type to apply depends on the parameter "rw":
+ *                      TRUE--opens for write: an exclusive lock
+ *                      FALSE--opens for read: a shared lock
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi; May 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_family_lock(H5FD_t *_file, hbool_t rw)
+{
+    H5FD_family_t *file = (H5FD_family_t *)_file;   	/* VFD file struct */
+    unsigned	u, i;      	/* Local index variable */
+    herr_t ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Place the lock on all the member files */
+    for(u = 0; u < file->nmembs; u++) {
+        if(file->memb[u]) {
+            if(H5FD_lock(file->memb[u], rw) < 0)
+		break;
+        } /* end if */
+    } /* end for */
+
+    if(u < file->nmembs) { /* Try to unlock the member files done before */
+	for(i = 0; i < u; i++) {
+	    if(H5FD_unlock(file->memb[i]) < 0)
+		/* Push error, but keep going*/
+		HDONE_ERROR(H5E_IO, H5E_CANTUNLOCK, FAIL, "unable to unlock member files")
+	}
+	HGOTO_ERROR(H5E_IO, H5E_CANTLOCK, FAIL, "unable to lock member files")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_family_lock() */
+
+/*-------------------------------------------------------------------------
+ * Function:    H5FD_family_unlock
+ *
+ * Purpose:     To remove the existing lock on the file
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi; May 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_family_unlock(H5FD_t *_file)
+{
+    H5FD_family_t *file = (H5FD_family_t *)_file;   	/* VFD file struct */
+    unsigned	u;      	/* Local index variable */
+    herr_t ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Remove the lock on the member files */
+    for(u = 0; u < file->nmembs; u++) {
+        if(file->memb[u]) {
+            if(H5FD_unlock(file->memb[u]) < 0)
+		HGOTO_ERROR(H5E_IO, H5E_CANTUNLOCK, FAIL, "unable to unlock member files")
+        } /* end if */
+    } /* end for */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_family_unlock() */
diff --git a/src/H5FDfamily.h b/src/H5FDfamily.h
index dcb63e6..80969c3 100644
--- a/src/H5FDfamily.h
+++ b/src/H5FDfamily.h
@@ -22,8 +22,6 @@
 #ifndef H5FDfamily_H
 #define H5FDfamily_H
 
-#include "H5Ipublic.h"
-
 #define H5FD_FAMILY	(H5FD_family_init())
 
 #ifdef __cplusplus
@@ -31,7 +29,6 @@ extern "C" {
 #endif
 
 H5_DLL hid_t H5FD_family_init(void);
-H5_DLL void H5FD_family_term(void);
 H5_DLL herr_t H5Pset_fapl_family(hid_t fapl_id, hsize_t memb_size,
 			  hid_t memb_fapl_id);
 H5_DLL herr_t H5Pget_fapl_family(hid_t fapl_id, hsize_t *memb_size/*out*/,
@@ -42,3 +39,4 @@ H5_DLL herr_t H5Pget_fapl_family(hid_t fapl_id, hsize_t *memb_size/*out*/,
 #endif
 
 #endif
+
diff --git a/src/H5FDint.c b/src/H5FDint.c
index 3575340..933752c 100644
--- a/src/H5FDint.c
+++ b/src/H5FDint.c
@@ -28,10 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5FD_PACKAGE		/*suppress error about including H5FDpkg  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5FD_int_init_interface
+#include "H5FDmodule.h"         /* This source code file is part of the H5FD module */
 
 
 /***********/
@@ -80,28 +77,6 @@
 
 
 

-/*--------------------------------------------------------------------------
-NAME
-   H5FD_int_init_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5FD_int_init_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5FD_init_iterface currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5FD_int_init_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5FD_init())
-} /* H5FD_int_init_interface() */
-
-

 /*-------------------------------------------------------------------------
  * Function:    H5FD_locate_signature
  *
@@ -120,7 +95,7 @@ H5FD_int_init_interface(void)
 herr_t
 H5FD_locate_signature(H5FD_t *file, const H5P_genplist_t *dxpl, haddr_t *sig_addr)
 {
-    haddr_t         addr, eoa;
+    haddr_t         addr, eoa, eof;
     uint8_t         buf[H5F_SIGNATURE_LEN];
     unsigned        n, maxpow;
     herr_t          ret_value = SUCCEED; /* Return value */
@@ -128,7 +103,10 @@ H5FD_locate_signature(H5FD_t *file, const H5P_genplist_t *dxpl, haddr_t *sig_add
     FUNC_ENTER_NOAPI_NOINIT
 
     /* Find the least N such that 2^N is larger than the file size */
-    if(HADDR_UNDEF == (addr = H5FD_get_eof(file)) || HADDR_UNDEF == (eoa = H5FD_get_eoa(file, H5FD_MEM_SUPER)))
+    eof = H5FD_get_eof(file, H5FD_MEM_SUPER);
+    eoa = H5FD_get_eoa(file, H5FD_MEM_SUPER);
+    addr = MAX(eof, eoa);
+    if(HADDR_UNDEF == addr)
         HGOTO_ERROR(H5E_IO, H5E_CANTINIT, FAIL, "unable to obtain EOF/EOA value")
     for(maxpow = 0; addr; maxpow++)
         addr >>= 1;
@@ -202,7 +180,15 @@ H5FD_read(H5FD_t *file, const H5P_genplist_t *dxpl, H5FD_mem_t type, haddr_t add
 
     if(HADDR_UNDEF == (eoa = (file->cls->get_eoa)(file, type)))
 	HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "driver get_eoa request failed")
-    if((addr + file->base_addr + size) > eoa)
+
+    /* 
+     * If the file is open for SWMR read access, allow access to data past
+     * the end of the allocated space (the 'eoa').  This is done because the
+     * eoa stored in the file's superblock might be out of sync with the
+     * objects being written within the file by the application performing
+     * SWMR write operations.
+     */
+    if(!file->swmr_read && ((addr + file->base_addr + size) > eoa))
         HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow, addr = %llu, size=%llu, eoa=%llu", 
                     (unsigned long long)(addr+ file->base_addr), (unsigned long long)size, (unsigned long long)eoa)
 
@@ -322,7 +308,7 @@ done:
 haddr_t
 H5FD_get_eoa(const H5FD_t *file, H5FD_mem_t type)
 {
-    haddr_t	ret_value;
+    haddr_t ret_value = HADDR_UNDEF;    /* Return value */
 
     FUNC_ENTER_NOAPI(HADDR_UNDEF)
 
@@ -362,9 +348,9 @@ done:
  *-------------------------------------------------------------------------
  */
 haddr_t
-H5FD_get_eof(const H5FD_t *file)
+H5FD_get_eof(const H5FD_t *file, H5FD_mem_t type)
 {
-    haddr_t	ret_value;
+    haddr_t ret_value = HADDR_UNDEF;    /* Return value */
 
     FUNC_ENTER_NOAPI(HADDR_UNDEF)
 
@@ -372,7 +358,7 @@ H5FD_get_eof(const H5FD_t *file)
 
     /* Dispatch to driver */
     if(file->cls->get_eof) {
-	if(HADDR_UNDEF == (ret_value = (file->cls->get_eof)(file)))
+	if(HADDR_UNDEF == (ret_value = (file->cls->get_eof)(file, type)))
 	    HGOTO_ERROR(H5E_VFL, H5E_CANTGET, HADDR_UNDEF, "driver get_eof request failed")
     } /* end if */
     else
diff --git a/src/H5FDlog.c b/src/H5FDlog.c
index c42e124..1273dba 100644
--- a/src/H5FDlog.c
+++ b/src/H5FDlog.c
@@ -26,8 +26,7 @@
  *              With custom modifications...
  */
 
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5FD_log_init_interface
+#include "H5FDdrvr_module.h" /* This source code file is part of the H5FD driver module */
 
 
 #include "H5private.h"      /* Generic Functions    */
@@ -161,6 +160,7 @@ typedef struct H5FD_log_t {
                                 (HDoff_t)((A)+(Z))<(HDoff_t)(A))
 
 /* Prototypes */
+static herr_t H5FD_log_term(void);
 static void *H5FD_log_fapl_get(H5FD_t *file);
 static void *H5FD_log_fapl_copy(const void *_old_fa);
 static herr_t H5FD_log_fapl_free(void *_fa);
@@ -172,18 +172,21 @@ static herr_t H5FD_log_query(const H5FD_t *_f1, unsigned long *flags);
 static haddr_t H5FD_log_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size);
 static haddr_t H5FD_log_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
 static herr_t H5FD_log_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
-static haddr_t H5FD_log_get_eof(const H5FD_t *_file);
+static haddr_t H5FD_log_get_eof(const H5FD_t *_file, H5FD_mem_t type);
 static herr_t  H5FD_log_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
 static herr_t H5FD_log_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
             size_t size, void *buf);
 static herr_t H5FD_log_write(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
             size_t size, const void *buf);
 static herr_t H5FD_log_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing);
+static herr_t H5FD_log_lock(H5FD_t *_file, hbool_t rw);
+static herr_t H5FD_log_unlock(H5FD_t *_file);
 
 static const H5FD_class_t H5FD_log_g = {
     "log",					/*name			*/
     MAXADDR,					/*maxaddr		*/
     H5F_CLOSE_WEAK,				/* fc_degree		*/
+    H5FD_log_term,                              /*terminate             */
     NULL,					/*sb_size		*/
     NULL,					/*sb_encode		*/
     NULL,					/*sb_decode		*/
@@ -209,8 +212,8 @@ static const H5FD_class_t H5FD_log_g = {
     H5FD_log_write,				/*write			*/
     NULL,					/*flush			*/
     H5FD_log_truncate,				/*truncate		*/
-    NULL,                                       /*lock                  */
-    NULL,                                       /*unlock                */
+    H5FD_log_lock,                              /*lock                  */
+    H5FD_log_unlock,                            /*unlock                */
     H5FD_FLMAP_DICHOTOMY			/*fl_map		*/
 };
 
@@ -219,22 +222,27 @@ H5FL_DEFINE_STATIC(H5FD_log_t);
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FD_log_init_interface
+ * Function:    H5FD__init_package
  *
  * Purpose:     Initializes any interface-specific data or routines.
  *
- * Return:      Success:    The driver ID for the log driver.
- *              Failure:    Negative.
+ * Return:      Non-negative on success/Negative on failure
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_log_init_interface(void)
+H5FD__init_package(void)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
 
-    FUNC_LEAVE_NOAPI(H5FD_log_init())
-} /* H5FD_log_init_interface() */
+    if(H5FD_log_init() < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "unable to initialize log VFD")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FD__init_package() */
 
 

 /*-------------------------------------------------------------------------
@@ -254,7 +262,7 @@ H5FD_log_init_interface(void)
 hid_t
 H5FD_log_init(void)
 {
-    hid_t ret_value;            /* Return value */
+    hid_t ret_value = H5I_INVALID_HID;  /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -274,14 +282,14 @@ done:
  *
  * Purpose:     Shut down the VFD
  *
- * Returns:     <none>
+ * Returns:     SUCCEED (Can't fail)
  *
  * Programmer:  Quincey Koziol
  *              Friday, Jan 30, 2004
  *
  *---------------------------------------------------------------------------
  */
-void
+static herr_t
 H5FD_log_term(void)
 {
     FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -289,7 +297,7 @@ H5FD_log_term(void)
     /* Reset VFL ID */
     H5FD_LOG_g = 0;
 
-    FUNC_LEAVE_NOAPI_VOID
+    FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5FD_log_term() */
 
 

@@ -354,7 +362,7 @@ static void *
 H5FD_log_fapl_get(H5FD_t *_file)
 {
     H5FD_log_t  *file = (H5FD_log_t *)_file;
-    void        *ret_value;                     /* Return value */
+    void        *ret_value = NULL;              /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -383,7 +391,7 @@ H5FD_log_fapl_copy(const void *_old_fa)
 {
     const H5FD_log_fapl_t   *old_fa = (const H5FD_log_fapl_t*)_old_fa;
     H5FD_log_fapl_t         *new_fa = NULL;     /* New FAPL info */
-    void                    *ret_value;         /* Return value */
+    void                    *ret_value = NULL;  /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -464,7 +472,7 @@ H5FD_log_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
 {
     H5FD_log_t      *file = NULL;
     H5P_genplist_t  *plist;         /* Property list */
-    H5FD_log_fapl_t *fa;            /* File access property list information */
+    const H5FD_log_fapl_t *fa;            /* File access property list information */
     int             fd = -1;        /* File descriptor */
     int             o_flags;        /* Flags for open() call */
 #ifdef H5_HAVE_WIN32_API
@@ -476,7 +484,7 @@ H5FD_log_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
     struct timeval stat_timeval_diff;
 #endif /* H5_HAVE_GETTIMEOFDAY */
     h5_stat_t       sb;
-    H5FD_t          *ret_value;     /* Return value */
+    H5FD_t          *ret_value = NULL;  /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -503,7 +511,7 @@ H5FD_log_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
     /* Get the driver specific information */
     if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
-    if(NULL == (fa = (H5FD_log_fapl_t *)H5P_get_driver_info(plist)))
+    if(NULL == (fa = (const H5FD_log_fapl_t *)H5P_peek_driver_info(plist)))
         HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, NULL, "bad VFL driver info")
 
 #ifdef H5_HAVE_GETTIMEOFDAY
@@ -585,6 +593,11 @@ H5FD_log_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
 
     /* Get the flags for logging */
     file->fa.flags = fa->flags;
+    if(fa->logfile)
+        file->fa.logfile = HDstrdup(fa->logfile);
+    else
+        file->fa.logfile = NULL;
+    file->fa.buf_size = fa->buf_size;
 
     /* Check if we are doing any logging at all */
     if(file->fa.flags != 0) {
@@ -785,6 +798,11 @@ H5FD_log_close(H5FD_t *_file)
             HDfclose(file->logfp);
     } /* end if */
 
+    if(file->fa.logfile) {
+        HDfree(file->fa.logfile);
+        file->fa.logfile = NULL;
+    }
+
     /* Release the file info */
     file = H5FL_FREE(H5FD_log_t, file);
 
@@ -872,11 +890,12 @@ H5FD_log_query(const H5FD_t *_file, unsigned long *flags /* out */)
     /* Set the VFL feature flags that this driver supports */
     if(flags) {
         *flags = 0;
-        *flags |= H5FD_FEAT_AGGREGATE_METADATA; /* OK to aggregate metadata allocations */
-        *flags |= H5FD_FEAT_ACCUMULATE_METADATA; /* OK to accumulate metadata for faster writes */
-        *flags |= H5FD_FEAT_DATA_SIEVE;       /* OK to perform data sieving for faster raw data reads & writes */
-        *flags |= H5FD_FEAT_AGGREGATE_SMALLDATA; /* OK to aggregate "small" raw data allocations */
-        *flags |= H5FD_FEAT_POSIX_COMPAT_HANDLE; /* VFD handle is POSIX I/O call compatible */
+        *flags |= H5FD_FEAT_AGGREGATE_METADATA;     /* OK to aggregate metadata allocations                             */
+        *flags |= H5FD_FEAT_ACCUMULATE_METADATA;    /* OK to accumulate metadata for faster writes                      */
+        *flags |= H5FD_FEAT_DATA_SIEVE;             /* OK to perform data sieving for faster raw data reads & writes    */
+        *flags |= H5FD_FEAT_AGGREGATE_SMALLDATA;    /* OK to aggregate "small" raw data allocations                     */
+        *flags |= H5FD_FEAT_POSIX_COMPAT_HANDLE;    /* VFD handle is POSIX I/O call compatible                          */
+        *flags |= H5FD_FEAT_SUPPORTS_SWMR_IO;       /* VFD supports the single-writer/multiple-readers (SWMR) pattern   */
 
         /* Check for flags that are set by h5repart */
         if(file && file->fam_to_sec2)
@@ -905,7 +924,7 @@ H5FD_log_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, hsi
 {
     H5FD_log_t	*file = (H5FD_log_t *)_file;
     haddr_t addr;
-    haddr_t ret_value;          /* Return value */
+    haddr_t ret_value = HADDR_UNDEF;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1028,13 +1047,13 @@ H5FD_log_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr)
  *-------------------------------------------------------------------------
  */
 static haddr_t
-H5FD_log_get_eof(const H5FD_t *_file)
+H5FD_log_get_eof(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type)
 {
     const H5FD_log_t	*file = (const H5FD_log_t *)_file;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    FUNC_LEAVE_NOAPI(MAX(file->eof, file->eoa))
+    FUNC_LEAVE_NOAPI(file->eof)
 } /* end H5FD_log_get_eof() */
 
 

@@ -1540,3 +1559,68 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5FD_log_truncate() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_log_lock
+ *
+ * Purpose:     Place a lock on the file
+ *
+ * Return:      Success:    SUCCEED
+ *              Failure:    FAIL, file not locked.
+ *
+ * Programmer:  Vailin Choi; May 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_log_lock(H5FD_t *_file, hbool_t rw)
+{
+    H5FD_log_t	*file = (H5FD_log_t *)_file;
+    int lock;
+    herr_t ret_value = SUCCEED;                 /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(file);
+
+    /* Determine the type of lock */
+    lock = rw ? LOCK_EX : LOCK_SH;
+
+    /* Place the lock with non-blocking */
+    if(HDflock(file->fd, lock | LOCK_NB) < 0)
+        HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "unable to flock file")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_log_lock() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_log_unlock
+ *
+ * Purpose:     Remove the existing lock on the file
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi; May 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_log_unlock(H5FD_t *_file)
+{
+    H5FD_log_t  *file = (H5FD_log_t *)_file;       /* VFD file struct */
+    herr_t ret_value = SUCCEED;                         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file);
+
+    if(HDflock(file->fd, LOCK_UN) < 0)
+        HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "unable to flock (unlock) file")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_log_unlock() */
+
diff --git a/src/H5FDlog.h b/src/H5FDlog.h
index ffc4df1..2f1544e 100644
--- a/src/H5FDlog.h
+++ b/src/H5FDlog.h
@@ -22,8 +22,6 @@
 #ifndef H5FDlog_H
 #define H5FDlog_H
 
-#include "H5Ipublic.h"
-
 #define H5FD_LOG	(H5FD_log_init())
 
 /* Flags for H5Pset_fapl_log() */
@@ -61,7 +59,6 @@ extern "C" {
 #endif
 
 H5_DLL hid_t H5FD_log_init(void);
-H5_DLL void H5FD_log_term(void);
 H5_DLL herr_t H5Pset_fapl_log(hid_t fapl_id, const char *logfile, unsigned long long flags, size_t buf_size);
 
 #ifdef __cplusplus
diff --git a/src/H5FDmodule.h b/src/H5FDmodule.h
new file mode 100644
index 0000000..6358e86
--- /dev/null
+++ b/src/H5FDmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5FD package.  Including this header means that the source file
+ *		is part of the H5FD package.
+ */
+#ifndef _H5FDmodule_H
+#define _H5FDmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5FD_MODULE
+#define H5_MY_PKG       H5FD
+#define H5_MY_PKG_ERR   H5E_VFL
+#define H5_MY_PKG_INIT  YES
+
+#endif /* _H5FDmodule_H */
+
diff --git a/src/H5FDmpi.c b/src/H5FDmpi.c
index 86a5d39..fdc4eca 100644
--- a/src/H5FDmpi.c
+++ b/src/H5FDmpi.c
@@ -452,24 +452,13 @@ done:
  * Programmer:	Robb Matzke
  *              Monday, August  9, 1999
  *
- * Modifications:
- *
- *              Quincey Koziol - 2002/06/17
- *              Removed 'disp' parameter, read & write routines will use
- *              the address of the dataset in MPI_File_set_view() calls, as
- *              necessary.
- *
- *              Quincey Koziol - 2002/06/17
- *              Changed to set temporary properties in a dxpl, instead of
- *              flags in the file struct, which will make this more threadsafe.
- *
  *-------------------------------------------------------------------------
  */
 herr_t
 H5FD_mpi_setup_collective(hid_t dxpl_id, MPI_Datatype *btype, MPI_Datatype *ftype)
 {
     H5P_genplist_t *plist;      /* Property list pointer */
-    herr_t      ret_value=SUCCEED;       /* Return value */
+    herr_t ret_value = SUCCEED; /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
diff --git a/src/H5FDmpio.c b/src/H5FDmpio.c
index 4b9802f..b3ef1f2 100644
--- a/src/H5FDmpio.c
+++ b/src/H5FDmpio.c
@@ -17,22 +17,21 @@
  * Programmer:  Robb Matzke <matzke at llnl.gov>
  *              Thursday, July 29, 1999
  *
- * Purpose:  This is the MPI-2 I/O driver.
+ * Purpose:	This is the MPI-2 I/O driver.
  *
  */
 
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC  H5FD_mpio_init_interface
+#include "H5FDdrvr_module.h" /* This source code file is part of the H5FD driver module */
 
 
-#include "H5private.h"    /* Generic Functions      */
-#include "H5Dprivate.h"    /* Dataset functions      */
-#include "H5Eprivate.h"    /* Error handling        */
-#include "H5Fprivate.h"    /* File access        */
-#include "H5FDprivate.h"  /* File drivers        */
-#include "H5FDmpi.h"            /* MPI-based file drivers    */
-#include "H5Iprivate.h"    /* IDs            */
-#include "H5MMprivate.h"  /* Memory management      */
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Dprivate.h"		/* Dataset functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5FDprivate.h"	/* File drivers				*/
+#include "H5FDmpi.h"            /* MPI-based file drivers		*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
 #include "H5Pprivate.h"         /* Property lists                       */
 
 #ifdef H5_HAVE_PARALLEL
@@ -60,30 +59,32 @@ static char H5FD_mpi_native_g[] = "native";
  * driver doesn't bother to keep it updated since it's an expensive operation.
  */
 typedef struct H5FD_mpio_t {
-    H5FD_t  pub;    /*public stuff, must be first    */
-    MPI_File  f;    /*MPIO file handle      */
-    MPI_Comm  comm;    /*communicator        */
-    MPI_Info  info;    /*file information      */
+    H5FD_t	pub;		/*public stuff, must be first		*/
+    MPI_File	f;		/*MPIO file handle			*/
+    MPI_Comm	comm;		/*communicator				*/
+    MPI_Info	info;		/*file information			*/
     int         mpi_rank;       /* This process's rank                  */
     int         mpi_size;       /* Total number of processes            */
-    haddr_t  eof;    /*end-of-file marker      */
-    haddr_t  eoa;    /*end-of-address marker      */
-    haddr_t  last_eoa;  /* Last known end-of-address marker  */
+    haddr_t	eof;		/*end-of-file marker			*/
+    haddr_t	eoa;		/*end-of-address marker			*/
+    haddr_t	last_eoa;	/* Last known end-of-address marker	*/
+    haddr_t	local_eof;	/* Local end-of-file address for each process */
 } H5FD_mpio_t;
 
 /* Private Prototypes */
 
 /* Callbacks */
+static herr_t H5FD_mpio_term(void);
 static void *H5FD_mpio_fapl_get(H5FD_t *_file);
 static void *H5FD_mpio_fapl_copy(const void *_old_fa);
 static herr_t H5FD_mpio_fapl_free(void *_fa);
 static H5FD_t *H5FD_mpio_open(const char *name, unsigned flags, hid_t fapl_id,
-            haddr_t maxaddr);
+			      haddr_t maxaddr);
 static herr_t H5FD_mpio_close(H5FD_t *_file);
 static herr_t H5FD_mpio_query(const H5FD_t *_f1, unsigned long *flags);
 static haddr_t H5FD_mpio_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
 static herr_t H5FD_mpio_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
-static haddr_t H5FD_mpio_get_eof(const H5FD_t *_file);
+static haddr_t H5FD_mpio_get_eof(const H5FD_t *_file, H5FD_mem_t type);
 static herr_t  H5FD_mpio_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
 static herr_t H5FD_mpio_read(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
             size_t size, void *buf);
@@ -97,41 +98,42 @@ static MPI_Comm H5FD_mpio_communicator(const H5FD_t *_file);
 
 /* MPIO-specific file access properties */
 typedef struct H5FD_mpio_fapl_t {
-    MPI_Comm    comm;    /*communicator      */
-    MPI_Info    info;    /*file information    */
+    MPI_Comm		comm;		/*communicator			*/
+    MPI_Info		info;		/*file information		*/
 } H5FD_mpio_fapl_t;
 
 /* The MPIO file driver information */
 static const H5FD_class_mpi_t H5FD_mpio_g = {
     {   /* Start of superclass information */
-    "mpio",          /*name      */
-    HADDR_MAX,          /*maxaddr    */
-    H5F_CLOSE_SEMI,        /* fc_degree    */
-    NULL,          /*sb_size    */
-    NULL,          /*sb_encode    */
-    NULL,          /*sb_decode    */
-    sizeof(H5FD_mpio_fapl_t),      /*fapl_size    */
-    H5FD_mpio_fapl_get,        /*fapl_get    */
-    H5FD_mpio_fapl_copy,      /*fapl_copy    */
-    H5FD_mpio_fapl_free,       /*fapl_free    */
-    0,                        /*dxpl_size    */
-    NULL,          /*dxpl_copy    */
-    NULL,          /*dxpl_free    */
-    H5FD_mpio_open,        /*open      */
-    H5FD_mpio_close,        /*close      */
-    NULL,          /*cmp      */
-    H5FD_mpio_query,                    /*query      */
-    NULL,          /*get_type_map    */
-    NULL,          /*alloc      */
-    NULL,          /*free      */
-    H5FD_mpio_get_eoa,        /*get_eoa    */
-    H5FD_mpio_set_eoa,         /*set_eoa    */
-    H5FD_mpio_get_eof,        /*get_eof    */
+    "mpio",					/*name			*/
+    HADDR_MAX,					/*maxaddr		*/
+    H5F_CLOSE_SEMI,				/* fc_degree		*/
+    H5FD_mpio_term,                             /*terminate             */
+    NULL,					/*sb_size		*/
+    NULL,					/*sb_encode		*/
+    NULL,					/*sb_decode		*/
+    sizeof(H5FD_mpio_fapl_t),			/*fapl_size		*/
+    H5FD_mpio_fapl_get,				/*fapl_get		*/
+    H5FD_mpio_fapl_copy,			/*fapl_copy		*/
+    H5FD_mpio_fapl_free, 			/*fapl_free		*/
+    0,		                		/*dxpl_size		*/
+    NULL,					/*dxpl_copy		*/
+    NULL,					/*dxpl_free		*/
+    H5FD_mpio_open,				/*open			*/
+    H5FD_mpio_close,				/*close			*/
+    NULL,					/*cmp			*/
+    H5FD_mpio_query,		                /*query			*/
+    NULL,					/*get_type_map		*/
+    NULL,					/*alloc			*/
+    NULL,					/*free			*/
+    H5FD_mpio_get_eoa,				/*get_eoa		*/
+    H5FD_mpio_set_eoa, 				/*set_eoa		*/
+    H5FD_mpio_get_eof,				/*get_eof		*/
     H5FD_mpio_get_handle,                       /*get_handle            */
-    H5FD_mpio_read,        /*read      */
-    H5FD_mpio_write,        /*write      */
-    H5FD_mpio_flush,        /*flush      */
-    H5FD_mpio_truncate,        /*truncate    */
+    H5FD_mpio_read,				/*read			*/
+    H5FD_mpio_write,				/*write			*/
+    H5FD_mpio_flush,				/*flush			*/
+    H5FD_mpio_truncate,				/*truncate		*/
     NULL,                                       /*lock                  */
     NULL,                                       /*unlock                */
     H5FD_FLMAP_DICHOTOMY                        /*fl_map                */
@@ -164,10 +166,9 @@ static int H5FD_mpio_Debug[256] =
 

 /*--------------------------------------------------------------------------
 NAME
-   H5FD_mpio_init_interface -- Initialize interface-specific information
+   H5FD__init_package -- Initialize interface-specific information
 USAGE
-    herr_t H5FD_mpio_init_interface()
-
+    herr_t H5FD__init_package()
 RETURNS
     Non-negative on success/Negative on failure
 DESCRIPTION
@@ -176,24 +177,30 @@ DESCRIPTION
 
 --------------------------------------------------------------------------*/
 static herr_t
-H5FD_mpio_init_interface(void)
+H5FD__init_package(void)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
 
-    FUNC_LEAVE_NOAPI(H5FD_mpio_init())
-} /* H5FD_mpio_init_interface() */
+    if(H5FD_mpio_init() < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "unable to initialize mpio VFD")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FD__init_package() */
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpio_init
+ * Function:	H5FD_mpio_init
  *
- * Purpose:  Initialize this driver by registering the driver with the
- *    library.
+ * Purpose:	Initialize this driver by registering the driver with the
+ *		library.
  *
- * Return:  Success:  The driver ID for the mpio driver.
- *    Failure:  Negative.
+ * Return:	Success:	The driver ID for the mpio driver.
+ *		Failure:	Negative.
  *
- * Programmer:  Robb Matzke
+ * Programmer:	Robb Matzke
  *              Thursday, August 5, 1999
  *
  *-------------------------------------------------------------------------
@@ -229,7 +236,7 @@ H5FD_mpio_init(void)
 		s++;
 	    } /* end while */
         } /* end if */
-        H5FD_mpio_Debug_inited++;
+	H5FD_mpio_Debug_inited++;
     } /* end if */
 #endif /* H5FDmpio_DEBUG */
 
@@ -242,20 +249,18 @@ done:
 
 

 /*---------------------------------------------------------------------------
- * Function:  H5FD_mpio_term
+ * Function:	H5FD_mpio_term
  *
- * Purpose:  Shut down the VFD
+ * Purpose:	Shut down the VFD
  *
- * Return:  <none>
+ * Returns:     Non-negative on success or negative on failure
  *
  * Programmer:  Quincey Koziol
  *              Friday, Jan 30, 2004
  *
- * Modification:
- *
  *---------------------------------------------------------------------------
  */
-void
+static herr_t
 H5FD_mpio_term(void)
 {
     FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -263,73 +268,46 @@ H5FD_mpio_term(void)
     /* Reset VFL ID */
     H5FD_MPIO_g=0;
 
-    FUNC_LEAVE_NOAPI_VOID
+    FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5FD_mpio_term() */
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5Pset_fapl_mpio
+ * Function:	H5Pset_fapl_mpio
  *
- * Purpose:  Store the user supplied MPIO communicator comm and info in
- *    the file access property list FAPL_ID which can then be used
- *    to create and/or open the file.  This function is available
- *    only in the parallel HDF5 library and is not collective.
+ * Purpose:	Store the user supplied MPIO communicator comm and info in
+ *		the file access property list FAPL_ID which can then be used
+ *		to create and/or open the file.  This function is available
+ *		only in the parallel HDF5 library and is not collective.
  *
- *    comm is the MPI communicator to be used for file open as
- *    defined in MPI_FILE_OPEN of MPI-2. This function makes a
- *    duplicate of comm. Any modification to comm after this function
- *    call returns has no effect on the access property list.
+ *		comm is the MPI communicator to be used for file open as
+ *		defined in MPI_FILE_OPEN of MPI-2. This function makes a
+ *		duplicate of comm. Any modification to comm after this function
+ *		call returns has no effect on the access property list.
  *
- *    info is the MPI Info object to be used for file open as
- *    defined in MPI_FILE_OPEN of MPI-2. This function makes a
- *    duplicate of info. Any modification to info after this
- *    function call returns has no effect on the access property
- *    list.
+ *		info is the MPI Info object to be used for file open as
+ *		defined in MPI_FILE_OPEN of MPI-2. This function makes a
+ *		duplicate of info. Any modification to info after this
+ *		function call returns has no effect on the access property
+ *		list.
  *
  *              If fapl_id has previously set comm and info values, they
  *              will be replaced and the old communicator and Info object
  *              are freed.
  *
- * Return:  Success:  Non-negative
+ * Return:	Success:	Non-negative
  *
- *     Failure:  Negative
+ * 		Failure:	Negative
  *
- * Programmer:  Albert Cheng
- *    Feb 3, 1998
- *
- * Modifications:
- *    Robb Matzke, 1998-02-18
- *    Check all arguments before the property list is updated so we
- *    don't leave the property list in a bad state if something
- *    goes wrong.  Also, the property list data type changed to
- *    allow more generality so all the mpi-related stuff is in the
- *    `u.mpi' member.  The `access_mode' will contain only
- *     mpi-related flags defined in H5Fpublic.h.
- *
- *    Albert Cheng, 1998-04-16
- *    Removed the ACCESS_MODE argument.  The access mode is changed
- *    to be controlled by data transfer property list during data
- *    read/write calls.
- *
- *     Robb Matzke, 1999-08-06
- *    Modified to work with the virtual file layer.
- *
- *    Raymond Lu, 2001-10-23
- *    Changed the file access list to the new generic property
- *    list.
- *
- *    Albert Cheng, 2003-04-17
- *    Modified the description of the function that it now stores
- *    a duplicate of the communicator and INFO object.  Free the
- *    old duplicates if previously set.  (Work is actually done
- *    by H5P_set_driver.)
+ * Programmer:	Albert Cheng
+ *		Feb 3, 1998
  *
  *-------------------------------------------------------------------------
  */
 herr_t
 H5Pset_fapl_mpio(hid_t fapl_id, MPI_Comm comm, MPI_Info info)
 {
-    H5FD_mpio_fapl_t  fa;
+    H5FD_mpio_fapl_t	fa;
     H5P_genplist_t *plist;      /* Property list pointer */
     herr_t ret_value;
 
@@ -343,128 +321,117 @@ H5Pset_fapl_mpio(hid_t fapl_id, MPI_Comm comm, MPI_Info info)
     if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
         HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a file access list")
     if(MPI_COMM_NULL == comm)
-  HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a valid communicator")
+	HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a valid communicator")
 
     /* Initialize driver specific properties */
     fa.comm = comm;
     fa.info = info;
 
     /* duplication is done during driver setting. */
-    ret_value= H5P_set_driver(plist, H5FD_MPIO, &fa);
+    ret_value = H5P_set_driver(plist, H5FD_MPIO, &fa);
 
 done:
     FUNC_LEAVE_API(ret_value)
-}
+} /* H5Pset_fapl_mpio() */
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5Pget_fapl_mpio
- *
- * Purpose:  If the file access property list is set to the H5FD_MPIO
- *    driver then this function returns duplicates of the MPI
- *    communicator and Info object stored through the comm and
- *    info pointers.  It is the responsibility of the application
- *    to free the returned communicator and Info object.
- *
- * Return:  Success:  Non-negative with the communicator and
- *        Info object returned through the comm and
- *        info arguments if non-null. Since they are
- *        duplicates of the stored objects, future
- *        modifications to the access property list do
- *        not affect them and it is the responsibility
- *        of the application to free them.
- *
- *     Failure:  Negative
- *
- * Programmer:  Robb Matzke
- *    Thursday, February 26, 1998
+ * Function:	H5Pget_fapl_mpio
+ *
+ * Purpose:	If the file access property list is set to the H5FD_MPIO
+ *		driver then this function returns duplicates of the MPI
+ *		communicator and Info object stored through the comm and
+ *		info pointers.  It is the responsibility of the application
+ *		to free the returned communicator and Info object.
+ *
+ * Return:	Success:	Non-negative with the communicator and
+ *				Info object returned through the comm and
+ *				info arguments if non-null. Since they are
+ *				duplicates of the stored objects, future
+ *				modifications to the access property list do
+ *				not affect them and it is the responsibility
+ *				of the application to free them.
  *
- * Modifications:
- *
- *          Albert Cheng, Apr 16, 1998
- *          Removed the access_mode argument.  The access_mode is changed
- *          to be controlled by data transfer property list during data
- *          read/write calls.
- *
- *    Raymond Lu, 2001-10-23
- *    Changed the file access list to the new generic property
- *    list.
+ * 		Failure:	Negative
  *
- *    Albert Cheng, 2003-04-17
- *    Return duplicates of the stored communicator and Info object.
+ * Programmer:	Robb Matzke
+ *		Thursday, February 26, 1998
  *
  *-------------------------------------------------------------------------
  */
 herr_t
 H5Pget_fapl_mpio(hid_t fapl_id, MPI_Comm *comm/*out*/, MPI_Info *info/*out*/)
 {
-    H5FD_mpio_fapl_t  *fa;
     H5P_genplist_t *plist;      /* Property list pointer */
-    MPI_Comm  comm_tmp=MPI_COMM_NULL;
-    int    mpi_code;    /* mpi return code */
-    herr_t      ret_value=SUCCEED;      /* Return value */
+    const H5FD_mpio_fapl_t *fa;       /* MPIO fapl info */
+    MPI_Comm	comm_tmp = MPI_COMM_NULL;
+    hbool_t     comm_copied = FALSE;    /* MPI Comm has been duplicated */
+    int		mpi_code;		/* MPI return code */
+    herr_t      ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_API(FAIL)
     H5TRACE3("e", "ixx", fapl_id, comm, info);
 
     if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
         HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a file access list")
-    if(H5FD_MPIO != H5P_get_driver(plist))
+    if(H5FD_MPIO != H5P_peek_driver(plist))
         HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "incorrect VFL driver")
-    if(NULL == (fa = (H5FD_mpio_fapl_t *)H5P_get_driver_info(plist)))
+    if(NULL == (fa = (const H5FD_mpio_fapl_t *)H5P_peek_driver_info(plist)))
         HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "bad VFL driver info")
 
     /* Store the duplicated communicator in a temporary variable for error */
-    /* recovery in case the INFO duplication fails.  We cannot attempt to */
-    /* the value into *comm yet since if MPI_Comm_dup fails, we will end  */
-    /* up freeing whatever *comm holds and that could be invalid. */
-    if (comm){
-  if (MPI_SUCCESS != (mpi_code=MPI_Comm_dup(fa->comm, &comm_tmp)))
-      HMPI_GOTO_ERROR(FAIL, "MPI_Comm_dup failed", mpi_code)
-    }
+    /* recovery in case the INFO duplication fails. */
+    if(comm) {
+	if(MPI_SUCCESS != (mpi_code = MPI_Comm_dup(fa->comm, &comm_tmp)))
+	    HMPI_GOTO_ERROR(FAIL, "MPI_Comm_dup failed", mpi_code)
+        comm_copied = TRUE;
+    } /* end if */
 
-    if (info){
-  if (MPI_INFO_NULL != fa->info){
-      if (MPI_SUCCESS != (mpi_code=MPI_Info_dup(fa->info, info)))
-    HMPI_GOTO_ERROR(FAIL, "MPI_Info_dup failed", mpi_code)
-  }else{
-      /* do not dup it */
-      *info = MPI_INFO_NULL;
-  }
-    }
+    if(info) {
+	if(MPI_INFO_NULL != fa->info) {
+	    if(MPI_SUCCESS != (mpi_code = MPI_Info_dup(fa->info, info)))
+		HMPI_GOTO_ERROR(FAIL, "MPI_Info_dup failed", mpi_code)
+	} /* end if */
+        else
+	    /* do not dup it */
+	    *info = MPI_INFO_NULL;
+    } /* end if */
 
-    if (comm)
+    /* Store the copied communicator, now that the Info object has been
+     *  successfully copied.
+     */
+    if(comm)
         *comm = comm_tmp;
 
 done:
-    if (FAIL==ret_value){
-  /* need to free anything created here */
-  if (comm_tmp != MPI_COMM_NULL)
-      MPI_Comm_free(&comm_tmp);
-    }
+    if(ret_value < 0)
+	/* need to free anything created here */
+	if(comm_copied)
+	    MPI_Comm_free(&comm_tmp);
+
     FUNC_LEAVE_API(ret_value)
-}
+} /* end H5Pget_fapl_mpio() */
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5Pset_dxpl_mpio
+ * Function:	H5Pset_dxpl_mpio
  *
- * Purpose:  Set the data transfer property list DXPL_ID to use transfer
- *    mode XFER_MODE. The property list can then be used to control
- *    the I/O transfer mode during data I/O operations. The valid
- *    transfer modes are:
+ * Purpose:	Set the data transfer property list DXPL_ID to use transfer
+ *		mode XFER_MODE. The property list can then be used to control
+ *		the I/O transfer mode during data I/O operations. The valid
+ *		transfer modes are:
  *
- *     H5FD_MPIO_INDEPENDENT:
- *      Use independent I/O access (the default).
+ * 		H5FD_MPIO_INDEPENDENT:
+ *			Use independent I/O access (the default).
  *
- *     H5FD_MPIO_COLLECTIVE:
- *      Use collective I/O access.
+ * 		H5FD_MPIO_COLLECTIVE:
+ *			Use collective I/O access.
  *
- * Return:  Success:  Non-negative
- *     Failure:  Negative
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
  *
- * Programmer:  Albert Cheng
- *    April 2, 1998
+ * Programmer:	Albert Cheng
+ *		April 2, 1998
  *
  *-------------------------------------------------------------------------
  */
@@ -496,19 +463,19 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5Pget_dxpl_mpio
+ * Function:	H5Pget_dxpl_mpio
  *
- * Purpose:  Queries the transfer mode current set in the data transfer
- *    property list DXPL_ID. This is not collective.
+ * Purpose:	Queries the transfer mode current set in the data transfer
+ *		property list DXPL_ID. This is not collective.
  *
- * Return:  Success:  Non-negative, with the transfer mode returned
- *        through the XFER_MODE argument if it is
- *        non-null.
+ * Return:	Success:	Non-negative, with the transfer mode returned
+ *				through the XFER_MODE argument if it is
+ *				non-null.
  *
- *     Failure:  Negative
+ * 		Failure:	Negative
  *
- * Programmer:  Albert Cheng
- *    April 2, 1998
+ * Programmer:	Albert Cheng
+ *		April 2, 1998
  *
  *-------------------------------------------------------------------------
  */
@@ -535,7 +502,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5Pset_dxpl_mpio_collective_opt
+ * Function:	H5Pset_dxpl_mpio_collective_opt
  *
  * Purpose:	To set a flag to choose linked chunk I/O or multi-chunk I/O
  *		without involving decision-making inside HDF5
@@ -579,7 +546,7 @@ done:
 
 
 /*-------------------------------------------------------------------------
- * Function:  H5Pset_dxpl_mpio_chunk_opt
+ * Function:	H5Pset_dxpl_mpio_chunk_opt
  *
  * Purpose:	To set a flag to choose linked chunk I/O or multi-chunk I/O
  *		without involving decision-making inside HDF5
@@ -623,7 +590,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5Pset_dxpl_mpio_chunk_opt_num
+ * Function:	H5Pset_dxpl_mpio_chunk_opt_num
  *
  * Purpose:	To set a threshold for doing linked chunk IO
  *
@@ -665,7 +632,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5Pset_dxpl_mpio_chunk_opt_ratio
+ * Function:	H5Pset_dxpl_mpio_chunk_opt_ratio
  *
  * Purpose:	To set a threshold for doing collective I/O for each chunk
  *
@@ -710,17 +677,17 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpio_fapl_get
+ * Function:	H5FD_mpio_fapl_get
  *
- * Purpose:  Returns a file access property list which could be used to
- *    create another file the same as this one.
+ * Purpose:	Returns a file access property list which could be used to
+ *		create another file the same as this one.
  *
- * Return:  Success:  Ptr to new file access property list with all
- *        fields copied from the file pointer.
+ * Return:	Success:	Ptr to new file access property list with all
+ *				fields copied from the file pointer.
  *
- *    Failure:  NULL
+ *		Failure:	NULL
  *
- * Programmer:  Robb Matzke
+ * Programmer:	Robb Matzke
  *              Friday, August 13, 1999
  *
  *-------------------------------------------------------------------------
@@ -728,8 +695,8 @@ done:
 static void *
 H5FD_mpio_fapl_get(H5FD_t *_file)
 {
-    H5FD_mpio_t    *file = (H5FD_mpio_t*)_file;
-    H5FD_mpio_fapl_t  *fa = NULL;
+    H5FD_mpio_t		*file = (H5FD_mpio_t*)_file;
+    H5FD_mpio_fapl_t	*fa = NULL;
     void      *ret_value;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
@@ -742,7 +709,7 @@ H5FD_mpio_fapl_get(H5FD_t *_file)
 
     /* Duplicate communicator and Info object. */
     if(FAIL == H5FD_mpi_comm_info_dup(file->comm, file->info, &fa->comm, &fa->info))
-  HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "Communicator/Info duplicate failed")
+	HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "Communicator/Info duplicate failed")
 
     /* Set return value */
     ret_value = fa;
@@ -753,15 +720,15 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpio_fapl_copy
+ * Function:	H5FD_mpio_fapl_copy
  *
- * Purpose:  Copies the mpio-specific file access properties.
+ * Purpose:	Copies the mpio-specific file access properties.
  *
- * Return:  Success:  Ptr to a new property list
+ * Return:	Success:	Ptr to a new property list
  *
- *    Failure:  NULL
+ *		Failure:	NULL
  *
- * Programmer:  Albert Cheng
+ * Programmer:	Albert Cheng
  *              Jan  8, 2003
  *
  *-------------------------------------------------------------------------
@@ -769,9 +736,9 @@ done:
 static void *
 H5FD_mpio_fapl_copy(const void *_old_fa)
 {
-    void    *ret_value = NULL;
+    void		*ret_value = NULL;
     const H5FD_mpio_fapl_t *old_fa = (const H5FD_mpio_fapl_t*)_old_fa;
-    H5FD_mpio_fapl_t  *new_fa = NULL;
+    H5FD_mpio_fapl_t	*new_fa = NULL;
 
     FUNC_ENTER_NOAPI_NOINIT
 #ifdef H5FDmpio_DEBUG
@@ -787,14 +754,14 @@ fprintf(stderr, "enter H5FD_mpio_fapl_copy\n");
 
     /* Duplicate communicator and Info object. */
     if(FAIL == H5FD_mpi_comm_info_dup(old_fa->comm, old_fa->info, &new_fa->comm, &new_fa->info))
-  HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "Communicator/Info duplicate failed")
+	HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "Communicator/Info duplicate failed")
     ret_value = new_fa;
 
 done:
     if (NULL == ret_value){
-  /* cleanup */
-  if (new_fa)
-      H5MM_xfree(new_fa);
+	/* cleanup */
+	if (new_fa)
+	    H5MM_xfree(new_fa);
     }
 
 #ifdef H5FDmpio_DEBUG
@@ -806,15 +773,15 @@ fprintf(stderr, "leaving H5FD_mpio_fapl_copy\n");
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpio_fapl_free
+ * Function:	H5FD_mpio_fapl_free
  *
- * Purpose:  Frees the mpio-specific file access properties.
+ * Purpose:	Frees the mpio-specific file access properties.
  *
- * Return:  Success:  0
+ * Return:	Success:	0
  *
- *    Failure:  -1
+ *		Failure:	-1
  *
- * Programmer:  Albert Cheng
+ * Programmer:	Albert Cheng
  *              Jan  8, 2003
  *
  * Modifications:
@@ -824,8 +791,8 @@ fprintf(stderr, "leaving H5FD_mpio_fapl_copy\n");
 static herr_t
 H5FD_mpio_fapl_free(void *_fa)
 {
-    herr_t    ret_value = SUCCEED;
-    H5FD_mpio_fapl_t  *fa = (H5FD_mpio_fapl_t*)_fa;
+    herr_t		ret_value = SUCCEED;
+    H5FD_mpio_fapl_t	*fa = (H5FD_mpio_fapl_t*)_fa;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 #ifdef H5FDmpio_DEBUG
@@ -945,11 +912,11 @@ done:
  * Function:    H5FD_mpio_open
  *
  * Purpose:     Opens a file with name NAME.  The FLAGS are a bit field with
- *    purpose similar to the second argument of open(2) and which
- *    are defined in H5Fpublic.h. The file access property list
- *    FAPL_ID contains the properties driver properties and MAXADDR
- *    is the largest address which this file will be expected to
- *    access.  This is collective.
+ *		purpose similar to the second argument of open(2) and which
+ *		are defined in H5Fpublic.h. The file access property list
+ *		FAPL_ID contains the properties driver properties and MAXADDR
+ *		is the largest address which this file will be expected to
+ *		access.  This is collective.
  *
  * Return:      Success:        A new file pointer.
  *
@@ -958,98 +925,75 @@ done:
  * Programmer:
  *              January 30, 1998
  *
- * Modifications:
- *     Robb Matzke, 1998-02-18
- *    Added the ACCESS_PARMS argument.  Moved some error checking
- *    here from elsewhere.
- *
- *        rky, 1998-01-11
- *        Added H5FD_mpio_Debug debug flags controlled by MPI_Info.
- *
- *        rky, 1998-08-28
- *    Init flag controlling redundant metadata writes to disk.
- *
- *        rky, 1998-12-07
- *    Added barrier after MPI_File_set_size to prevent race
- *    condition -- subsequent writes were being truncated, causing
- *    holes in file.
- *
- *     Robb Matzke, 1999-08-06
- *    Modified to work with the virtual file layer.
- *
- *        rky & ppw, 1999-11-07
- *    Modified "H5FD_mpio_open" so that file-truncation is
- *              avoided for brand-new files (with zero filesize).
- *
- *     Albert Cheng, 2003-04-17
- *     Duplicate the communicator and Info object so that file is
- *     insulated from the old one.
  *-------------------------------------------------------------------------
  */
 static H5FD_t *
 H5FD_mpio_open(const char *name, unsigned flags, hid_t fapl_id,
 	       haddr_t H5_ATTR_UNUSED maxaddr)
 {
-    H5FD_mpio_t      *file=NULL;
-    MPI_File      fh;
+    H5FD_mpio_t			*file=NULL;
+    MPI_File			fh;
     unsigned                    file_opened=0;  /* Flag to indicate that the file was successfully opened */
-    int        mpi_amode;
-    int        mpi_rank;       /* MPI rank of this process */
-    int        mpi_size;       /* Total number of MPI processes */
-    int        mpi_code;  /* mpi return code */
-    MPI_Offset      size;
-    const H5FD_mpio_fapl_t  *fa=NULL;
-    H5FD_mpio_fapl_t    _fa;
+    int				mpi_amode;
+    int				mpi_rank;       /* MPI rank of this process */
+    int				mpi_size;       /* Total number of MPI processes */
+    int				mpi_code;	/* mpi return code */
+    MPI_Offset			size;
+    const H5FD_mpio_fapl_t	*fa = NULL;
+    H5FD_mpio_fapl_t		_fa;
     H5P_genplist_t *plist;      /* Property list pointer */
-    MPI_Comm                    comm_dup=MPI_COMM_NULL;
-    MPI_Info                    info_dup=MPI_INFO_NULL;
-    H5FD_t      *ret_value;     /* Return value */
+    MPI_Comm                    comm_dup = MPI_COMM_NULL;
+    MPI_Info                    info_dup = MPI_INFO_NULL;
+    H5FD_t			*ret_value;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
 #ifdef H5FDmpio_DEBUG
     if (H5FD_mpio_Debug[(int)'t']) {
-      fprintf(stdout, "Entering H5FD_mpio_open(name=\"%s\", flags=0x%x, "
-    "fapl_id=%d, maxaddr=%lu)\n", name, flags, (int)fapl_id, (unsigned long)maxaddr);
+    	fprintf(stdout, "Entering H5FD_mpio_open(name=\"%s\", flags=0x%x, "
+		"fapl_id=%d, maxaddr=%lu)\n", name, flags, (int)fapl_id, (unsigned long)maxaddr);
     }
 #endif
 
     /* Obtain a pointer to mpio-specific file access properties */
     if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
-    if(H5P_FILE_ACCESS_DEFAULT == fapl_id || H5FD_MPIO != H5P_get_driver(plist)) {
-        _fa.comm = MPI_COMM_SELF; /*default*/
-        _fa.info = MPI_INFO_NULL; /*default*/
-        fa = &_fa;
-    } else {
-        if(NULL == (fa = (const H5FD_mpio_fapl_t *)H5P_get_driver_info(plist)))
+    if(H5P_FILE_ACCESS_DEFAULT == fapl_id || H5FD_MPIO != H5P_peek_driver(plist)) {
+	_fa.comm = MPI_COMM_SELF; /*default*/
+	_fa.info = MPI_INFO_NULL; /*default*/
+	fa = &_fa;
+    } /* end if */
+    else {
+        if(NULL == (fa = (const H5FD_mpio_fapl_t *)H5P_peek_driver_info(plist)))
 	    HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, NULL, "bad VFL driver info")
-    }
+    } /* end else */
 
     /* Duplicate communicator and Info object for use by this file. */
-    if (FAIL==H5FD_mpi_comm_info_dup(fa->comm, fa->info, &comm_dup, &info_dup))
-        HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "Communicator/Info duplicate failed")
+    if(FAIL == H5FD_mpi_comm_info_dup(fa->comm, fa->info, &comm_dup, &info_dup))
+	HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "Communicator/Info duplicate failed")
 
     /* convert HDF5 flags to MPI-IO flags */
     /* some combinations are illegal; let MPI-IO figure it out */
-    mpi_amode  = (flags&H5F_ACC_RDWR) ? MPI_MODE_RDWR : MPI_MODE_RDONLY;
-    if (flags&H5F_ACC_CREAT)  mpi_amode |= MPI_MODE_CREATE;
-    if (flags&H5F_ACC_EXCL)  mpi_amode |= MPI_MODE_EXCL;
+    mpi_amode  = (flags & H5F_ACC_RDWR) ? MPI_MODE_RDWR : MPI_MODE_RDONLY;
+    if(flags & H5F_ACC_CREAT)
+        mpi_amode |= MPI_MODE_CREATE;
+    if(flags & H5F_ACC_EXCL)
+        mpi_amode |= MPI_MODE_EXCL;
 
 #ifdef H5FDmpio_DEBUG
     /* Check for debug commands in the info parameter */
     {
-  char debug_str[128];
-        int flag, i;
-        if (MPI_INFO_NULL != info_dup) {
-            MPI_Info_get(fa->info, H5F_MPIO_DEBUG_KEY, sizeof(debug_str)-1, debug_str, &flag);
-            if (flag) {
-                fprintf(stdout, "H5FD_mpio debug flags=%s\n", debug_str );
-                for (i=0;
-                     debug_str[i]/*end of string*/ && i<128/*just in case*/;
-                     ++i) {
+        if(MPI_INFO_NULL != info_dup) {
+            char debug_str[128];
+            int flag;
+
+            MPI_Info_get(fa->info, H5F_MPIO_DEBUG_KEY, sizeof(debug_str) - 1, debug_str, &flag);
+            if(flag) {
+                int i;
+
+                fprintf(stdout, "H5FD_mpio debug flags = '%s'\n", debug_str);
+                for(i = 0; debug_str[i]/*end of string*/ && i < 128/*just in case*/; ++i)
                     H5FD_mpio_Debug[(int)debug_str[i]] = 1;
-                }
             }
         }
     }
@@ -1099,6 +1043,7 @@ H5FD_mpio_open(const char *name, unsigned flags, hid_t fapl_id,
 
     /* Set the size of the file (from library's perspective) */
     file->eof = H5FD_mpi_MPIOff_to_haddr(size);
+    file->local_eof = file->eof;
 
     /* Set return value */
     ret_value=(H5FD_t*)file;
@@ -1107,12 +1052,12 @@ done:
     if(ret_value==NULL) {
         if(file_opened)
             MPI_File_close(&fh);
-  if (MPI_COMM_NULL != comm_dup)
-      MPI_Comm_free(&comm_dup);
-  if (MPI_INFO_NULL != info_dup)
-      MPI_Info_free(&info_dup);
-  if (file)
-      H5MM_xfree(file);
+	if (MPI_COMM_NULL != comm_dup)
+	    MPI_Comm_free(&comm_dup);
+	if (MPI_INFO_NULL != info_dup)
+	    MPI_Info_free(&info_dup);
+	if (file)
+	    H5MM_xfree(file);
     } /* end if */
 
 #ifdef H5FDmpio_DEBUG
@@ -1128,36 +1073,36 @@ done:
  *
  * Purpose:     Closes a file.  This is collective.
  *
- * Return:      Success:  Non-negative
+ * Return:      Success:	Non-negative
  *
- *     Failure:  Negative
+ * 		Failure:	Negative
  *
  * Programmer:  Unknown
  *              January 30, 1998
  *
  * Modifications:
- *     Robb Matzke, 1998-02-18
- *    Added the ACCESS_PARMS argument.
+ * 		Robb Matzke, 1998-02-18
+ *		Added the ACCESS_PARMS argument.
  *
- *     Robb Matzke, 1999-08-06
- *    Modified to work with the virtual file layer.
+ * 		Robb Matzke, 1999-08-06
+ *		Modified to work with the virtual file layer.
  *
- *     Albert Cheng, 2003-04-17
- *    Free the communicator stored.
+ * 		Albert Cheng, 2003-04-17
+ *		Free the communicator stored.
  *-------------------------------------------------------------------------
  */
 static herr_t
 H5FD_mpio_close(H5FD_t *_file)
 {
-    H5FD_mpio_t  *file = (H5FD_mpio_t*)_file;
-    int    mpi_code;          /* MPI return code */
+    H5FD_mpio_t	*file = (H5FD_mpio_t*)_file;
+    int		mpi_code;	        /* MPI return code */
     herr_t      ret_value=SUCCEED;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
 #ifdef H5FDmpio_DEBUG
     if (H5FD_mpio_Debug[(int)'t'])
-      fprintf(stdout, "Entering H5FD_mpio_close\n");
+    	fprintf(stdout, "Entering H5FD_mpio_close\n");
 #endif
     HDassert(file);
     HDassert(H5FD_MPIO==file->pub.driver_id);
@@ -1173,33 +1118,33 @@ H5FD_mpio_close(H5FD_t *_file)
 done:
 #ifdef H5FDmpio_DEBUG
     if (H5FD_mpio_Debug[(int)'t'])
-      fprintf(stdout, "Leaving H5FD_mpio_close\n");
+    	fprintf(stdout, "Leaving H5FD_mpio_close\n");
 #endif
     FUNC_LEAVE_NOAPI(ret_value)
 }
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpio_query
+ * Function:	H5FD_mpio_query
  *
- * Purpose:  Set the flags that this VFL driver is capable of supporting.
+ * Purpose:	Set the flags that this VFL driver is capable of supporting.
  *              (listed in H5FDpublic.h)
  *
- * Return:  Success:  non-negative
+ * Return:	Success:	non-negative
  *
- *    Failure:  negative
+ *		Failure:	negative
  *
- * Programmer:  Quincey Koziol
+ * Programmer:	Quincey Koziol
  *              Friday, August 25, 2000
  *
  * Modifications:
  *
- *    John Mainzer -- 9/21/05
- *    Modified code to turn off the
- *    H5FD_FEAT_ACCUMULATE_METADATA_WRITE flag.
+ *		John Mainzer -- 9/21/05
+ *		Modified code to turn off the
+ *		H5FD_FEAT_ACCUMULATE_METADATA_WRITE flag.
  *              With the movement of
- *    all cache writes to process 0, this flag has become
- *    problematic in PHDF5.
+ *		all cache writes to process 0, this flag has become
+ *		problematic in PHDF5.
  *
  *-------------------------------------------------------------------------
  */
@@ -1222,17 +1167,17 @@ H5FD_mpio_query(const H5FD_t H5_ATTR_UNUSED *_file, unsigned long *flags /* out
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpio_get_eoa
+ * Function:	H5FD_mpio_get_eoa
  *
- * Purpose:  Gets the end-of-address marker for the file. The EOA marker
- *    is the first address past the last byte allocated in the
- *    format address space.
+ * Purpose:	Gets the end-of-address marker for the file. The EOA marker
+ *		is the first address past the last byte allocated in the
+ *		format address space.
  *
- * Return:  Success:  The end-of-address marker.
+ * Return:	Success:	The end-of-address marker.
  *
- *    Failure:  HADDR_UNDEF
+ *		Failure:	HADDR_UNDEF
  *
- * Programmer:  Robb Matzke
+ * Programmer:	Robb Matzke
  *              Friday, August  6, 1999
  *
  * Modifications:
@@ -1245,7 +1190,7 @@ H5FD_mpio_query(const H5FD_t H5_ATTR_UNUSED *_file, unsigned long *flags /* out
 static haddr_t
 H5FD_mpio_get_eoa(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type)
 {
-    const H5FD_mpio_t  *file = (const H5FD_mpio_t*)_file;
+    const H5FD_mpio_t	*file = (const H5FD_mpio_t*)_file;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1257,17 +1202,17 @@ H5FD_mpio_get_eoa(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type)
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpio_set_eoa
+ * Function:	H5FD_mpio_set_eoa
  *
- * Purpose:  Set the end-of-address marker for the file. This function is
- *    called shortly after an existing HDF5 file is opened in order
- *    to tell the driver where the end of the HDF5 data is located.
+ * Purpose:	Set the end-of-address marker for the file. This function is
+ *		called shortly after an existing HDF5 file is opened in order
+ *		to tell the driver where the end of the HDF5 data is located.
  *
- * Return:  Success:  0
+ * Return:	Success:	0
  *
- *    Failure:  -1
+ *		Failure:	-1
  *
- * Programmer:  Robb Matzke
+ * Programmer:	Robb Matzke
  *              Friday, August 6, 1999
  *
  * Modifications:
@@ -1280,7 +1225,7 @@ H5FD_mpio_get_eoa(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type)
 static herr_t
 H5FD_mpio_set_eoa(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr)
 {
-    H5FD_mpio_t  *file = (H5FD_mpio_t*)_file;
+    H5FD_mpio_t	*file = (H5FD_mpio_t*)_file;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1294,28 +1239,28 @@ H5FD_mpio_set_eoa(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr)
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpio_get_eof
+ * Function:	H5FD_mpio_get_eof
  *
- * Purpose:  Gets the end-of-file marker for the file. The EOF marker
- *    is the real size of the file.
+ * Purpose:	Gets the end-of-file marker for the file. The EOF marker
+ *		is the real size of the file.
  *
- *    The MPIO driver doesn't bother keeping this field updated
- *    since that's a relatively expensive operation. Fortunately
- *    the library only needs the EOF just after the file is opened
- *    in order to determine whether the file is empty, truncated,
- *    or okay.  Therefore, any MPIO I/O function will set its value
- *    to HADDR_UNDEF which is the error return value of this
- *    function.
+ *		The MPIO driver doesn't bother keeping this field updated
+ *		since that's a relatively expensive operation. Fortunately
+ *		the library only needs the EOF just after the file is opened
+ *		in order to determine whether the file is empty, truncated,
+ *		or okay.  Therefore, any MPIO I/O function will set its value
+ *		to HADDR_UNDEF which is the error return value of this
+ *		function.
  *
  *              Keeping the EOF updated (during write calls) is expensive
  *              because any process may extend the physical end of the
  *              file. -QAK
  *
- * Return:  Success:  The end-of-address marker.
+ * Return:	Success:	The end-of-address marker.
  *
- *    Failure:  HADDR_UNDEF
+ *		Failure:	HADDR_UNDEF
  *
- * Programmer:  Robb Matzke
+ * Programmer:	Robb Matzke
  *              Friday, August  6, 1999
  *
  * Modifications:
@@ -1323,9 +1268,9 @@ H5FD_mpio_set_eoa(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr)
  *-------------------------------------------------------------------------
  */
 static haddr_t
-H5FD_mpio_get_eof(const H5FD_t *_file)
+H5FD_mpio_get_eof(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type)
 {
-    const H5FD_mpio_t  *file = (const H5FD_mpio_t*)_file;
+    const H5FD_mpio_t	*file = (const H5FD_mpio_t*)_file;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1369,53 +1314,53 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpio_read
+ * Function:	H5FD_mpio_read
  *
- * Purpose:  Reads SIZE bytes of data from FILE beginning at address ADDR
- *    into buffer BUF according to data transfer properties in
- *    DXPL_ID using potentially complex file and buffer types to
- *    effect the transfer.
+ * Purpose:	Reads SIZE bytes of data from FILE beginning at address ADDR
+ *		into buffer BUF according to data transfer properties in
+ *		DXPL_ID using potentially complex file and buffer types to
+ *		effect the transfer.
  *
- *    Reading past the end of the MPI file returns zeros instead of
- *    failing.  MPI is able to coalesce requests from different
- *    processes (collective or independent).
+ *		Reading past the end of the MPI file returns zeros instead of
+ *		failing.  MPI is able to coalesce requests from different
+ *		processes (collective or independent).
  *
- * Return:  Success:  Zero. Result is stored in caller-supplied
- *        buffer BUF.
+ * Return:	Success:	Zero. Result is stored in caller-supplied
+ *				buffer BUF.
  *
- *    Failure:  -1, Contents of buffer BUF are undefined.
+ *		Failure:	-1, Contents of buffer BUF are undefined.
  *
- * Programmer:  rky, 1998-01-30
+ * Programmer:	rky, 1998-01-30
  *
  * Modifications:
- *     Robb Matzke, 1998-02-18
- *    Added the ACCESS_PARMS argument.
+ * 		Robb Matzke, 1998-02-18
+ *		Added the ACCESS_PARMS argument.
  *
- *     rky, 1998-04-10
- *    Call independent or collective MPI read, based on
- *    ACCESS_PARMS.
+ * 		rky, 1998-04-10
+ *		Call independent or collective MPI read, based on
+ *		ACCESS_PARMS.
  *
- *     Albert Cheng, 1998-06-01
- *    Added XFER_MODE to control independent or collective MPI
- *    read.
+ * 		Albert Cheng, 1998-06-01
+ *		Added XFER_MODE to control independent or collective MPI
+ *		read.
  *
- *     rky, 1998-08-16
- *    Use BTYPE, FTYPE, and DISP from access parms. The guts of
- *    H5FD_mpio_read and H5FD_mpio_write should be replaced by a
- *    single dual-purpose routine.
+ * 		rky, 1998-08-16
+ *		Use BTYPE, FTYPE, and DISP from access parms. The guts of
+ *		H5FD_mpio_read and H5FD_mpio_write should be replaced by a
+ *		single dual-purpose routine.
  *
- *     Robb Matzke, 1999-04-21
- *    Changed XFER_MODE to XFER_PARMS for all H5F_*_read()
- *    callbacks.
+ * 		Robb Matzke, 1999-04-21
+ *		Changed XFER_MODE to XFER_PARMS for all H5F_*_read()
+ *		callbacks.
  *
- *     Robb Matzke, 1999-07-28
- *    The ADDR argument is passed by value.
+ * 		Robb Matzke, 1999-07-28
+ *		The ADDR argument is passed by value.
  *
- *     Robb Matzke, 1999-08-06
- *    Modified to work with the virtual file layer.
+ * 		Robb Matzke, 1999-08-06
+ *		Modified to work with the virtual file layer.
  *
- *    Quincey Koziol,  2002-05-14
- *    Only call MPI_Get_count if we can use MPI_BYTE for the MPI type
+ *		Quincey Koziol,  2002-05-14
+ *		Only call MPI_Get_count if we can use MPI_BYTE for the MPI type
  *              for the I/O transfer.  Someday we might include code to decode
  *              the MPI type used for more complicated transfers and call
  *              MPI_Get_count all the time.
@@ -1438,27 +1383,34 @@ done:
  */
 static herr_t
 H5FD_mpio_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t dxpl_id, haddr_t addr, size_t size,
-         void *buf/*out*/)
+	       void *buf/*out*/)
 {
-    H5FD_mpio_t      *file = (H5FD_mpio_t*)_file;
-    MPI_Offset      mpi_off;
-    MPI_Status      mpi_stat;       /* Status from I/O operation */
-    int        mpi_code;  /* mpi return code */
-    MPI_Datatype    buf_type = MPI_BYTE;      /* MPI description of the selection in memory */
-    int             size_i;         /* Integer copy of 'size' to read */
-    int             bytes_read;     /* Number of bytes read in */
-    int             n;
+    H5FD_mpio_t			*file = (H5FD_mpio_t*)_file;
+    MPI_Offset			mpi_off;
+    MPI_Status  		mpi_stat;       /* Status from I/O operation */
+    int				mpi_code;	/* mpi return code */
+    MPI_Datatype		buf_type = MPI_BYTE;      /* MPI description of the selection in memory */
+    int         		size_i;         /* Integer copy of 'size' to read */
+#if MPI_VERSION >= 3
+    MPI_Count         		bytes_read;     /* Number of bytes read in */
+    MPI_Count                   type_size;      /* MPI datatype used for I/O's size */
+    MPI_Count                   io_size;        /* Actual number of bytes requested */
+    MPI_Count                   n;
+#else
+    int                         bytes_read;     /* Number of bytes read in */
     int                         type_size;      /* MPI datatype used for I/O's size */
     int                         io_size;        /* Actual number of bytes requested */
+    int         		n;
+#endif
     H5P_genplist_t              *plist = NULL;  /* Property list pointer */
-    hbool_t      use_view_this_time = FALSE;
-    herr_t                ret_value = SUCCEED;
+    hbool_t			use_view_this_time = FALSE;
+    herr_t              	ret_value = SUCCEED;
 
     FUNC_ENTER_NOAPI_NOINIT
 
 #ifdef H5FDmpio_DEBUG
     if (H5FD_mpio_Debug[(int)'t'])
-      fprintf(stdout, "Entering H5FD_mpio_read\n" );
+    	fprintf(stdout, "Entering H5FD_mpio_read\n" );
 #endif
     HDassert(file);
     HDassert(H5FD_MPIO==file->pub.driver_id);
@@ -1480,7 +1432,7 @@ H5FD_mpio_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t dxpl_id, had
 #ifdef H5FDmpio_DEBUG
     if (H5FD_mpio_Debug[(int)'r'])
         fprintf(stdout, "in H5FD_mpio_read  mpi_off=%ld  size_i=%d\n",
-    (long)mpi_off, size_i );
+		(long)mpi_off, size_i );
 #endif
 
     /* Only look for MPI views for raw data transfers */
@@ -1502,27 +1454,27 @@ H5FD_mpio_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t dxpl_id, had
          * could mean "use MPI_BYTE" by convention).
          */
         if(xfer_mode==H5FD_MPIO_COLLECTIVE) {
-            MPI_Datatype    file_type;
+            MPI_Datatype		file_type;
 
             /* Remember that views are used */
             use_view_this_time = TRUE;
 
             /* prepare for a full-blown xfer using btype, ftype, and disp */
-            if(H5P_get(plist, H5FD_MPI_XFER_MEM_MPI_TYPE_NAME, &buf_type)<0)
+            if(H5P_get(plist, H5FD_MPI_XFER_MEM_MPI_TYPE_NAME, &buf_type) < 0)
                 HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get MPI-I/O type property")
-            if(H5P_get(plist, H5FD_MPI_XFER_FILE_MPI_TYPE_NAME, &file_type)<0)
+            if(H5P_get(plist, H5FD_MPI_XFER_FILE_MPI_TYPE_NAME, &file_type) < 0)
                 HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get MPI-I/O type property")
 
             /*
              * Set the file view when we are using MPI derived types
              */
-            if (MPI_SUCCESS != (mpi_code=MPI_File_set_view(file->f, mpi_off, MPI_BYTE, file_type, H5FD_mpi_native_g,  file->info)))
+            if(MPI_SUCCESS != (mpi_code = MPI_File_set_view(file->f, mpi_off, MPI_BYTE, file_type, H5FD_mpi_native_g, file->info)))
                 HMPI_GOTO_ERROR(FAIL, "MPI_File_set_view failed", mpi_code)
 
             /* When using types, use the address as the displacement for
              * MPI_File_set_view and reset the address for the read to zero
              */
-            mpi_off=0;
+            mpi_off = 0;
         } /* end if */
     } /* end if */
 
@@ -1531,14 +1483,14 @@ H5FD_mpio_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t dxpl_id, had
        H5FD_mpio_collective_opt_t coll_opt_mode;
 
 #ifdef H5FDmpio_DEBUG
-  if (H5FD_mpio_Debug[(int)'t'])
-      fprintf(stdout, "H5FD_mpio_read: using MPIO collective mode\n");
+	if (H5FD_mpio_Debug[(int)'t'])
+	    fprintf(stdout, "H5FD_mpio_read: using MPIO collective mode\n");
 #endif
         /* Get the collective_opt property to check whether the application wants to do IO individually. */
         HDassert(plist);
 
         /* get the transfer mode from the dxpl */
-        if(H5P_get(plist, H5D_XFER_MPIO_COLLECTIVE_OPT_NAME, &coll_opt_mode)<0)
+        if(H5P_get(plist, H5D_XFER_MPIO_COLLECTIVE_OPT_NAME, &coll_opt_mode) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get MPI-I/O collective_op property")
 
         if(coll_opt_mode == H5FD_MPIO_COLLECTIVE_IO) {
@@ -1570,16 +1522,19 @@ H5FD_mpio_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t dxpl_id, had
     }
 
     /* How many bytes were actually read? */
-    /* [This works because the "basic elements" we use for all our MPI derived
-     *  types are MPI_BYTE.  We should be using the 'buf_type' for the MPI
-     *  datatype in this call though... (We aren't because using it causes
-     *  the LANL "qsc" machine to dump core - 12/19/03) - QAK]
-     */
-    if (MPI_SUCCESS != (mpi_code=MPI_Get_elements(&mpi_stat, MPI_BYTE, &bytes_read)))
+#if MPI_VERSION >= 3
+    if (MPI_SUCCESS != (mpi_code = MPI_Get_elements_x(&mpi_stat, buf_type, &bytes_read)))
+#else
+    if (MPI_SUCCESS != (mpi_code = MPI_Get_elements(&mpi_stat, MPI_BYTE, &bytes_read)))
+#endif
         HMPI_GOTO_ERROR(FAIL, "MPI_Get_elements failed", mpi_code)
 
     /* Get the type's size */
-    if (MPI_SUCCESS != (mpi_code=MPI_Type_size(buf_type,&type_size)))
+#if MPI_VERSION >= 3
+    if (MPI_SUCCESS != (mpi_code = MPI_Type_size_x(buf_type, &type_size)))
+#else
+    if (MPI_SUCCESS != (mpi_code = MPI_Type_size(buf_type, &type_size)))
+#endif
         HMPI_GOTO_ERROR(FAIL, "MPI_Type_size failed", mpi_code)
 
     /* Compute the actual number of bytes requested */
@@ -1598,7 +1553,7 @@ H5FD_mpio_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t dxpl_id, had
 done:
 #ifdef H5FDmpio_DEBUG
     if (H5FD_mpio_Debug[(int)'t'])
-      fprintf(stdout, "Leaving H5FD_mpio_read\n" );
+    	fprintf(stdout, "Leaving H5FD_mpio_read\n" );
 #endif
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -1606,100 +1561,100 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpio_write
+ * Function:	H5FD_mpio_write
  *
- * Purpose:  Writes SIZE bytes of data to FILE beginning at address ADDR
- *    from buffer BUF according to data transfer properties in
- *    DXPL_ID using potentially complex file and buffer types to
- *    effect the transfer.
+ * Purpose:	Writes SIZE bytes of data to FILE beginning at address ADDR
+ *		from buffer BUF according to data transfer properties in
+ *		DXPL_ID using potentially complex file and buffer types to
+ *		effect the transfer.
  *
- *    MPI is able to coalesce requests from different processes
- *    (collective and independent).
+ *		MPI is able to coalesce requests from different processes
+ *		(collective and independent).
  *
- * Return:  Success:  Zero. USE_TYPES and OLD_USE_TYPES in the
- *        access params are altered.
+ * Return:	Success:	Zero. USE_TYPES and OLD_USE_TYPES in the
+ *				access params are altered.
  *
- *    Failure:  -1, USE_TYPES and OLD_USE_TYPES in the
- *        access params may be altered.
+ *		Failure:	-1, USE_TYPES and OLD_USE_TYPES in the
+ *				access params may be altered.
  *
- * Programmer:  Unknown
+ * Programmer:	Unknown
  *              January 30, 1998
  *
  * Modifications:
- *    rky, 1998-08-28
- *    If the file->allsame flag is set, we assume that all the
- *    procs in the relevant MPI communicator will write identical
- *    data at identical offsets in the file, so only proc 0 will
- *    write, and all other procs will wait for p0 to finish. This
- *    is useful for writing metadata, for example. Note that we
- *    don't _check_ that the data is identical. Also, the mechanism
- *    we use to eliminate the redundant writes is by requiring a
- *    call to H5FD_mpio_tas_allsame before the write, which is
- *    rather klugey. Would it be better to pass a parameter to
- *    low-level writes like H5F_block_write and H5F_low_write,
- *    instead?  Or...??? Also, when I created this mechanism I
- *    wanted to minimize the difference in behavior between the old
- *    way of doing things (i.e., all procs write) and the new way,
- *    so the writes are eliminated at the very lowest level, here
- *    in H5FD_mpio_write. It may be better to rethink that, and
- *    short-circuit the writes at a higher level (e.g., at the
- *    points in the code where H5FD_mpio_tas_allsame is called).
- *
- *
- *     Robb Matzke, 1998-02-18
- *    Added the ACCESS_PARMS argument.
- *
- *     rky, 1998-04-10
- *    Call independent or collective MPI write, based on
- *    ACCESS_PARMS.
- *
- *     rky, 1998-04-24
- *    Removed redundant write from H5FD_mpio_write.
- *
- *     Albert Cheng, 1998-06-01
- *    Added XFER_MODE to control independent or collective MPI
- *    write.
- *
- *     rky, 1998-08-16
- *    Use BTYPE, FTYPE, and DISP from access parms. The guts of
- *    H5FD_mpio_read and H5FD_mpio_write should be replaced by a
- *    single dual-purpose routine.
- *
- *     rky, 1998-08-28
- *    Added ALLSAME parameter to make all but proc 0 skip the
- *    actual write.
- *
- *     Robb Matzke, 1999-04-21
- *    Changed XFER_MODE to XFER_PARMS for all H5FD_*_write()
- *    callbacks.
- *
- *     Robb Matzke, 1999-07-28
- *    The ADDR argument is passed by value.
- *
- *     Robb Matzke, 1999-08-06
- *    Modified to work with the virtual file layer.
- *
- *    Albert Cheng, 1999-12-19
- *    When only-p0-write-allsame-data, p0 Bcasts the
- *    ret_value to other processes.  This prevents
- *    a racing condition (that other processes try to
- *    read the file before p0 finishes writing) and also
- *    allows all processes to report the same ret_value.
- *
- *    Kim Yates, Pat Weidhaas,  2000-09-26
- *    Move block of coding where only p0 writes after the
+ *		rky, 1998-08-28
+ *		If the file->allsame flag is set, we assume that all the
+ *		procs in the relevant MPI communicator will write identical
+ *		data at identical offsets in the file, so only proc 0 will
+ *		write, and all other procs will wait for p0 to finish. This
+ *		is useful for writing metadata, for example. Note that we
+ *		don't _check_ that the data is identical. Also, the mechanism
+ *		we use to eliminate the redundant writes is by requiring a
+ *		call to H5FD_mpio_tas_allsame before the write, which is
+ *		rather klugey. Would it be better to pass a parameter to
+ *		low-level writes like H5F_block_write and H5F_low_write,
+ *		instead?  Or...??? Also, when I created this mechanism I
+ *		wanted to minimize the difference in behavior between the old
+ *		way of doing things (i.e., all procs write) and the new way,
+ *		so the writes are eliminated at the very lowest level, here
+ *		in H5FD_mpio_write. It may be better to rethink that, and
+ *		short-circuit the writes at a higher level (e.g., at the
+ *		points in the code where H5FD_mpio_tas_allsame is called).
+ *
+ *
+ * 		Robb Matzke, 1998-02-18
+ *		Added the ACCESS_PARMS argument.
+ *
+ * 		rky, 1998-04-10
+ *		Call independent or collective MPI write, based on
+ *		ACCESS_PARMS.
+ *
+ * 		rky, 1998-04-24
+ *		Removed redundant write from H5FD_mpio_write.
+ *
+ * 		Albert Cheng, 1998-06-01
+ *		Added XFER_MODE to control independent or collective MPI
+ *		write.
+ *
+ * 		rky, 1998-08-16
+ *		Use BTYPE, FTYPE, and DISP from access parms. The guts of
+ *		H5FD_mpio_read and H5FD_mpio_write should be replaced by a
+ *		single dual-purpose routine.
+ *
+ * 		rky, 1998-08-28
+ *		Added ALLSAME parameter to make all but proc 0 skip the
+ *		actual write.
+ *
+ * 		Robb Matzke, 1999-04-21
+ *		Changed XFER_MODE to XFER_PARMS for all H5FD_*_write()
+ *		callbacks.
+ *
+ * 		Robb Matzke, 1999-07-28
+ *		The ADDR argument is passed by value.
+ *
+ * 		Robb Matzke, 1999-08-06
+ *		Modified to work with the virtual file layer.
+ *
+ *		Albert Cheng, 1999-12-19
+ *		When only-p0-write-allsame-data, p0 Bcasts the
+ *		ret_value to other processes.  This prevents
+ *		a racing condition (that other processes try to
+ *		read the file before p0 finishes writing) and also
+ *		allows all processes to report the same ret_value.
+ *
+ *		Kim Yates, Pat Weidhaas,  2000-09-26
+ *		Move block of coding where only p0 writes after the
  *              MPI_File_set_view call.
  *
- *    Quincey Koziol,  2002-05-10
- *    Instead of always writing metadata from process 0, spread the
+ *		Quincey Koziol,  2002-05-10
+ *		Instead of always writing metadata from process 0, spread the
  *              burden among all the processes by using a round-robin rotation
  *              scheme.
  *
- *    Quincey Koziol,  2002-05-10
- *    Removed allsame code, keying off the type parameter instead.
+ *		Quincey Koziol,  2002-05-10
+ *		Removed allsame code, keying off the type parameter instead.
  *
- *    Quincey Koziol,  2002-05-14
- *    Only call MPI_Get_count if we can use MPI_BYTE for the MPI type
+ *		Quincey Koziol,  2002-05-14
+ *		Only call MPI_Get_count if we can use MPI_BYTE for the MPI type
  *              for the I/O transfer.  Someday we might include code to decode
  *              the MPI type used for more complicated transfers and call
  *              MPI_Get_count all the time.
@@ -1728,25 +1683,32 @@ done:
  */
 static herr_t
 H5FD_mpio_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
-    size_t size, const void *buf)
+		size_t size, const void *buf)
 {
-    H5FD_mpio_t      *file = (H5FD_mpio_t*)_file;
-    MPI_Offset        mpi_off;
-    MPI_Status      mpi_stat;       /* Status from I/O operation */
-    MPI_Datatype    buf_type = MPI_BYTE;      /* MPI description of the selection in memory */
-    int              mpi_code;  /* MPI return code */
-    int             size_i, bytes_written;
+    H5FD_mpio_t			*file = (H5FD_mpio_t*)_file;
+    MPI_Offset 		 	mpi_off;
+    MPI_Status  		mpi_stat;       /* Status from I/O operation */
+    MPI_Datatype		buf_type = MPI_BYTE;      /* MPI description of the selection in memory */
+    int			        mpi_code;	/* MPI return code */
+#if MPI_VERSION >= 3
+    MPI_Count         		bytes_written;
+    MPI_Count                   type_size;      /* MPI datatype used for I/O's size */
+    MPI_Count                   io_size;        /* Actual number of bytes requested */
+#else
+    int                         bytes_written;
     int                         type_size;      /* MPI datatype used for I/O's size */
     int                         io_size;        /* Actual number of bytes requested */
-    hbool_t      use_view_this_time = FALSE;
+#endif
+    int                         size_i;
+    hbool_t			use_view_this_time = FALSE;
     H5P_genplist_t              *plist = NULL;  /* Property list pointer */
-    herr_t                ret_value = SUCCEED;
+    herr_t              	ret_value = SUCCEED;
 
     FUNC_ENTER_NOAPI_NOINIT
 
 #ifdef H5FDmpio_DEBUG
     if (H5FD_mpio_Debug[(int)'t'])
-      fprintf(stdout, "Entering H5FD_mpio_write\n" );
+    	fprintf(stdout, "Entering H5FD_mpio_write\n" );
 #endif
     HDassert(file);
     HDassert(H5FD_MPIO==file->pub.driver_id);
@@ -1788,7 +1750,7 @@ H5FD_mpio_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
          * could mean "use MPI_BYTE" by convention).
          */
         if(xfer_mode == H5FD_MPIO_COLLECTIVE) {
-            MPI_Datatype    file_type;
+            MPI_Datatype		file_type;
 
             /* Remember that views are used */
             use_view_this_time = TRUE;
@@ -1863,16 +1825,19 @@ H5FD_mpio_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
     }
 
     /* How many bytes were actually written? */
-    /* [This works because the "basic elements" we use for all our MPI derived
-     *  types are MPI_BYTE.  We should be using the 'buf_type' for the MPI
-     *  datatype in this call though... (We aren't because using it causes
-     *  the LANL "qsc" machine to dump core - 12/19/03) - QAK]
-     */
+#if MPI_VERSION >= 3
+    if(MPI_SUCCESS != (mpi_code = MPI_Get_elements_x(&mpi_stat, buf_type, &bytes_written)))
+#else
     if(MPI_SUCCESS != (mpi_code = MPI_Get_elements(&mpi_stat, MPI_BYTE, &bytes_written)))
+#endif
         HMPI_GOTO_ERROR(FAIL, "MPI_Get_elements failed", mpi_code)
 
     /* Get the type's size */
+#if MPI_VERSION >= 3
+    if(MPI_SUCCESS != (mpi_code = MPI_Type_size_x(buf_type, &type_size)))
+#else
     if(MPI_SUCCESS != (mpi_code = MPI_Type_size(buf_type, &type_size)))
+#endif
         HMPI_GOTO_ERROR(FAIL, "MPI_Type_size failed", mpi_code)
 
     /* Compute the actual number of bytes requested */
@@ -1882,14 +1847,22 @@ H5FD_mpio_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
     if(bytes_written != io_size)
         HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
 
-    /* Forget the EOF value (see H5FD_mpio_get_eof()) --rpm 1999-08-06 */
+    /* Each process will keep track of its perceived EOF value locally, and
+     * ultimately we will reduce this value to the maximum amongst all
+     * processes, but until then keep the actual eof at HADDR_UNDEF just in
+     * case something bad happens before that point. (rather have a value
+     * we know is wrong sitting around rather than one that could only
+     * potentially be wrong.) */
     file->eof = HADDR_UNDEF;
 
+    if(bytes_written && ((bytes_written + addr) > file->local_eof))
+        file->local_eof = addr + bytes_written;
+
 done:
 #ifdef H5FDmpio_DEBUG
     if(H5FD_mpio_Debug[(int)'t'])
-      fprintf(stdout, "proc %d: Leaving H5FD_mpio_write with ret_value=%d\n",
-      file->mpi_rank, ret_value );
+    	fprintf(stdout, "proc %d: Leaving H5FD_mpio_write with ret_value=%d\n",
+	    file->mpi_rank, ret_value );
 #endif
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5FD_mpio_write() */
@@ -1900,9 +1873,9 @@ done:
  *
  * Purpose:     Makes sure that all data is on disk.  This is collective.
  *
- * Return:      Success:  Non-negative
+ * Return:      Success:	Non-negative
  *
- *     Failure:  Negative
+ * 		Failure:	Negative
  *
  * Programmer:  Robb Matzke
  *              January 30, 1998
@@ -1912,15 +1885,15 @@ done:
 static herr_t
 H5FD_mpio_flush(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, unsigned closing)
 {
-    H5FD_mpio_t    *file = (H5FD_mpio_t*)_file;
-    int      mpi_code;  /* mpi return code */
+    H5FD_mpio_t		*file = (H5FD_mpio_t*)_file;
+    int			mpi_code;	/* mpi return code */
     herr_t              ret_value = SUCCEED;
 
     FUNC_ENTER_NOAPI_NOINIT
 
 #ifdef H5FDmpio_DEBUG
     if(H5FD_mpio_Debug[(int)'t'])
-      HDfprintf(stdout, "Entering %s\n", FUNC);
+    	HDfprintf(stdout, "Entering %s\n", FUNC);
 #endif
     HDassert(file);
     HDassert(H5FD_MPIO == file->pub.driver_id);
@@ -1934,7 +1907,7 @@ H5FD_mpio_flush(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, unsigned closing)
 done:
 #ifdef H5FDmpio_DEBUG
     if(H5FD_mpio_Debug[(int)'t'])
-      HDfprintf(stdout, "Leaving %s\n", FUNC);
+    	HDfprintf(stdout, "Leaving %s\n", FUNC);
 #endif
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -1946,8 +1919,8 @@ done:
  *
  * Purpose:     Make certain the file's size matches it's allocated size
  *
- * Return:      Success:  Non-negative
- *     Failure:  Negative
+ * Return:      Success:	Non-negative
+ * 		Failure:	Negative
  *
  * Programmer:  Quincey Koziol
  *              January 31, 2008
@@ -1957,14 +1930,14 @@ done:
 static herr_t
 H5FD_mpio_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t H5_ATTR_UNUSED closing)
 {
-    H5FD_mpio_t    *file = (H5FD_mpio_t*)_file;
+    H5FD_mpio_t		*file = (H5FD_mpio_t*)_file;
     herr_t              ret_value = SUCCEED;
 
     FUNC_ENTER_NOAPI_NOINIT
 
 #ifdef H5FDmpio_DEBUG
     if(H5FD_mpio_Debug[(int)'t'])
-      HDfprintf(stdout, "Entering %s\n", FUNC);
+    	HDfprintf(stdout, "Entering %s\n", FUNC);
 #endif
     HDassert(file);
     HDassert(H5FD_MPIO == file->pub.driver_id);
@@ -1974,7 +1947,7 @@ H5FD_mpio_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t H5_ATTR_
      * we can't just check whether EOF<EOA like with other drivers.
      * Therefore we'll just read the byte at EOA-1 and then write it back. */
     if(file->eoa > file->last_eoa) {
-        int    mpi_code;  /* mpi return code */
+        int		mpi_code;	/* mpi return code */
         MPI_Offset      mpi_off;
 
         if(H5FD_mpi_haddr_to_MPIOff(file->eoa, &mpi_off) < 0)
@@ -2000,7 +1973,7 @@ H5FD_mpio_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t H5_ATTR_
 done:
 #ifdef H5FDmpio_DEBUG
     if(H5FD_mpio_Debug[(int)'t'])
-      HDfprintf(stdout, "Leaving %s\n", FUNC);
+    	HDfprintf(stdout, "Leaving %s\n", FUNC);
 #endif
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -2008,14 +1981,14 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpio_mpi_rank
+ * Function:	H5FD_mpio_mpi_rank
  *
- * Purpose:  Returns the MPI rank for a process
+ * Purpose:	Returns the MPI rank for a process
  *
- * Return:  Success: non-negative
- *    Failure: negative
+ * Return:	Success: non-negative
+ *		Failure: negative
  *
- * Programmer:  Quincey Koziol
+ * Programmer:	Quincey Koziol
  *              Thursday, May 16, 2002
  *
  * Modifications:
@@ -2025,7 +1998,7 @@ done:
 static int
 H5FD_mpio_mpi_rank(const H5FD_t *_file)
 {
-    const H5FD_mpio_t  *file = (const H5FD_mpio_t*)_file;
+    const H5FD_mpio_t	*file = (const H5FD_mpio_t*)_file;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -2037,14 +2010,14 @@ H5FD_mpio_mpi_rank(const H5FD_t *_file)
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpio_mpi_size
+ * Function:	H5FD_mpio_mpi_size
  *
- * Purpose:  Returns the number of MPI processes
+ * Purpose:	Returns the number of MPI processes
  *
- * Return:  Success: non-negative
- *    Failure: negative
+ * Return:	Success: non-negative
+ *		Failure: negative
  *
- * Programmer:  Quincey Koziol
+ * Programmer:	Quincey Koziol
  *              Thursday, May 16, 2002
  *
  * Modifications:
@@ -2054,7 +2027,7 @@ H5FD_mpio_mpi_rank(const H5FD_t *_file)
 static int
 H5FD_mpio_mpi_size(const H5FD_t *_file)
 {
-    const H5FD_mpio_t  *file = (const H5FD_mpio_t*)_file;
+    const H5FD_mpio_t	*file = (const H5FD_mpio_t*)_file;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -2066,15 +2039,15 @@ H5FD_mpio_mpi_size(const H5FD_t *_file)
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5FD_mpio_communicator
+ * Function:	H5FD_mpio_communicator
  *
- * Purpose:  Returns the MPI communicator for the file.
+ * Purpose:	Returns the MPI communicator for the file.
  *
- * Return:  Success:  The communicator
+ * Return:	Success:	The communicator
  *
- *    Failure:  NULL
+ *		Failure:	NULL
  *
- * Programmer:  Robb Matzke
+ * Programmer:	Robb Matzke
  *              Monday, August  9, 1999
  *
  * Modifications:
@@ -2084,7 +2057,7 @@ H5FD_mpio_mpi_size(const H5FD_t *_file)
 static MPI_Comm
 H5FD_mpio_communicator(const H5FD_t *_file)
 {
-    const H5FD_mpio_t  *file = (const H5FD_mpio_t*)_file;
+    const H5FD_mpio_t	*file = (const H5FD_mpio_t*)_file;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -2092,7 +2065,7 @@ H5FD_mpio_communicator(const H5FD_t *_file)
     HDassert(H5FD_MPIO==file->pub.driver_id);
 
     FUNC_LEAVE_NOAPI(file->comm)
-}
+} /* end H5FD_mpio_communicator() */
 
 #endif /* H5_HAVE_PARALLEL */
 
diff --git a/src/H5FDmpio.h b/src/H5FDmpio.h
index 1d91cc3..858e8ba 100644
--- a/src/H5FDmpio.h
+++ b/src/H5FDmpio.h
@@ -47,7 +47,6 @@ H5_DLLVAR hbool_t H5FD_mpi_opt_types_g;
 extern "C" {
 #endif
 H5_DLL hid_t H5FD_mpio_init(void);
-H5_DLL void H5FD_mpio_term(void);
 H5_DLL herr_t H5Pset_fapl_mpio(hid_t fapl_id, MPI_Comm comm, MPI_Info info);
 H5_DLL herr_t H5Pget_fapl_mpio(hid_t fapl_id, MPI_Comm *comm/*out*/,
 			MPI_Info *info/*out*/);
@@ -64,3 +63,4 @@ H5_DLL herr_t H5Pset_dxpl_mpio_chunk_opt_ratio(hid_t dxpl_id, unsigned percent_n
 #endif /* H5_HAVE_PARALLEL */
 
 #endif
+
diff --git a/src/H5FDmulti.c b/src/H5FDmulti.c
index a00c9a6..181ad39 100644
--- a/src/H5FDmulti.c
+++ b/src/H5FDmulti.c
@@ -36,10 +36,6 @@
 #include "hdf5.h"
 
 
-/* Our version of MAX */
-#undef MAX
-#define MAX(X,Y)	((X)>(Y)?(X):(Y))
-
 #ifndef FALSE
 #define FALSE		0
 #endif
@@ -50,14 +46,14 @@
 /* Loop through all mapped files */
 #define UNIQUE_MEMBERS(MAP,LOOPVAR) {					      \
     H5FD_mem_t _unmapped, LOOPVAR;					      \
-    hbool_t _seen[H5FD_MEM_NTYPES];					      \
+    unsigned _seen[H5FD_MEM_NTYPES];					      \
 									      \
-    memset(_seen, 0, sizeof _seen);					      \
+    memset(_seen, 0, sizeof _seen);	      				      \
     for (_unmapped=H5FD_MEM_SUPER; _unmapped<H5FD_MEM_NTYPES; _unmapped=(H5FD_mem_t)(_unmapped+1)) {  \
 	LOOPVAR = MAP[_unmapped];					      \
 	if (H5FD_MEM_DEFAULT==LOOPVAR) LOOPVAR=_unmapped;		      \
 	assert(LOOPVAR>0 && LOOPVAR<H5FD_MEM_NTYPES);			      \
-	if (_seen[LOOPVAR]++) continue;
+	if (_seen[LOOPVAR]++) continue;					      \
 
 #define ALL_MEMBERS(LOOPVAR) {						      \
     H5FD_mem_t LOOPVAR;							      \
@@ -111,6 +107,7 @@ static int compute_next(H5FD_multi_t *file);
 static int open_members(H5FD_multi_t *file);
 
 /* Callback prototypes */
+static herr_t H5FD_multi_term(void);
 static hsize_t H5FD_multi_sb_size(H5FD_t *file);
 static herr_t H5FD_multi_sb_encode(H5FD_t *file, char *name/*out*/,
 				   unsigned char *buf/*out*/);
@@ -127,7 +124,7 @@ static herr_t H5FD_multi_query(const H5FD_t *_f1, unsigned long *flags);
 static herr_t H5FD_multi_get_type_map(const H5FD_t *file, H5FD_mem_t *type_map);
 static haddr_t H5FD_multi_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
 static herr_t H5FD_multi_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t eoa);
-static haddr_t H5FD_multi_get_eof(const H5FD_t *_file);
+static haddr_t H5FD_multi_get_eof(const H5FD_t *_file, H5FD_mem_t type);
 static herr_t  H5FD_multi_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
 static haddr_t H5FD_multi_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size);
 static herr_t H5FD_multi_free(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
@@ -138,12 +135,15 @@ static herr_t H5FD_multi_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, ha
 			       size_t size, const void *_buf);
 static herr_t H5FD_multi_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing);
 static herr_t H5FD_multi_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing);
+static herr_t H5FD_multi_lock(H5FD_t *_file, hbool_t rw);
+static herr_t H5FD_multi_unlock(H5FD_t *_file);
 
 /* The class struct */
 static const H5FD_class_t H5FD_multi_g = {
     "multi",					/*name			*/
     HADDR_MAX,					/*maxaddr		*/
     H5F_CLOSE_WEAK,				/* fc_degree		*/
+    H5FD_multi_term,                            /*terminate             */
     H5FD_multi_sb_size,				/*sb_size		*/
     H5FD_multi_sb_encode,			/*sb_encode		*/
     H5FD_multi_sb_decode,			/*sb_decode		*/
@@ -169,8 +169,8 @@ static const H5FD_class_t H5FD_multi_g = {
     H5FD_multi_write,				/*write			*/
     H5FD_multi_flush,				/*flush			*/
     H5FD_multi_truncate,			/*truncate		*/
-    NULL,                                       /*lock                  */
-    NULL,                                       /*unlock                */
+    H5FD_multi_lock,                            /*lock                  */
+    H5FD_multi_unlock,                          /*unlock                */
     H5FD_FLMAP_DEFAULT 				/*fl_map		*/
 };
 
@@ -187,8 +187,6 @@ static const H5FD_class_t H5FD_multi_g = {
  * Programmer:	Robb Matzke
  *              Friday, August 13, 1999
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static char *
@@ -221,8 +219,6 @@ my_strdup(const char *s)
  * Programmer:	Robb Matzke
  *              Wednesday, August  4, 1999
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 hid_t
@@ -243,21 +239,20 @@ H5FD_multi_init(void)
  *
  * Purpose:	Shut down the VFD
  *
- * Return:	<none>
+ * Returns:     Non-negative on success or negative on failure
  *
  * Programmer:  Quincey Koziol
  *              Friday, Jan 30, 2004
  *
- * Modification:
- *
  *---------------------------------------------------------------------------
  */
-void
+static herr_t
 H5FD_multi_term(void)
 {
     /* Reset VFL ID */
     H5FD_MULTI_g=0;
 
+    return 0;
 } /* end H5FD_multi_term() */
 
 

@@ -275,14 +270,6 @@ H5FD_multi_term(void)
  * Programmer:	Robb Matzke
  *              Wednesday, August 11, 1999
  *
- * Modifications:
- *	Albert Cheng, Sep 17, 2001
- *	Added feature that if the raw or meta extension string contains
- *	a "%s", it will be substituted by the filename given for H5Fopen
- *	or H5Fcreate.  This is same as the multi-file syntax.  If no %s
- *	is found, one is inserted at the beginning.  This is the previous
- *	behavior.
- *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -432,11 +419,6 @@ H5Pset_fapl_split(hid_t fapl, const char *meta_ext, hid_t meta_plist_id,
  * Programmer:	Robb Matzke
  *              Wednesday, August  4, 1999
  *
- * Modifications:
- *
- *		Raymond Lu, 2001-10-25
- *		Use new generic property list for argument checking.
- *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -539,11 +521,6 @@ H5Pset_fapl_multi(hid_t fapl_id, const H5FD_mem_t *memb_map,
  * Programmer:	Robb Matzke
  *              Wednesday, August  4, 1999
  *
- * Modifications:
- *
- *              Raymond Lu, 2001-10-25
- *              Use new generic property list for argument checking.
- *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -608,8 +585,6 @@ H5Pget_fapl_multi(hid_t fapl_id, H5FD_mem_t *memb_map/*out*/,
  * Programmer:	Robb Matzke
  *              Monday, August 16, 1999
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static hsize_t
@@ -661,8 +636,6 @@ H5FD_multi_sb_size(H5FD_t *_file)
  * Programmer:	Robb Matzke
  *              Monday, August 16, 1999
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -882,8 +855,6 @@ H5FD_multi_sb_decode(H5FD_t *_file, const char *name, const unsigned char *buf)
  * Programmer:	Robb Matzke
  *              Friday, August 13, 1999
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static void *
@@ -910,8 +881,6 @@ H5FD_multi_fapl_get(H5FD_t *_file)
  * Programmer:	Robb Matzke
  *              Wednesday, August  4, 1999
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static void *
@@ -966,8 +935,6 @@ H5FD_multi_fapl_copy(const void *_old_fa)
  * Programmer:	Robb Matzke
  *              Wednesday, August  4, 1999
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -1006,8 +973,6 @@ H5FD_multi_fapl_free(void *_fa)
  * Programmer:	Robb Matzke
  *              Wednesday, August  4, 1999
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static H5FD_t *
@@ -1106,8 +1071,6 @@ error:
  * Programmer:	Robb Matzke
  *              Wednesday, August  4, 1999
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -1161,8 +1124,6 @@ H5FD_multi_close(H5FD_t *_file)
  * Programmer:	Robb Matzke
  *              Wednesday, August  4, 1999
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static int
@@ -1204,8 +1165,6 @@ H5FD_multi_cmp(const H5FD_t *_f1, const H5FD_t *_f2)
  * Programmer:	Quincey Koziol
  *              Tuesday, September 26, 2000
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -1279,7 +1238,6 @@ H5FD_multi_get_eoa(const H5FD_t *_file, H5FD_mem_t type)
 {
     const H5FD_multi_t	*file = (const H5FD_multi_t*)_file;
     haddr_t eoa = 0;
-    haddr_t memb_eoa = 0;
     static const char *func="H5FD_multi_get_eoa";  /* Function Name for error reporting */
 
     /* Clear the error stack */
@@ -1293,21 +1251,25 @@ H5FD_multi_get_eoa(const H5FD_t *_file, H5FD_mem_t type)
      */
     if(H5FD_MEM_DEFAULT == type) {
         UNIQUE_MEMBERS(file->fa.memb_map, mt) {
+            haddr_t memb_eoa;
+
 	    if (file->memb[mt]) {
                 /* Retrieve EOA */
 	        H5E_BEGIN_TRY {
                     memb_eoa = H5FDget_eoa(file->memb[mt], mt);
 	        } H5E_END_TRY;
 
-	        if (HADDR_UNDEF==memb_eoa)
+	        if(HADDR_UNDEF == memb_eoa)
                     H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eoa", HADDR_UNDEF)
-	    } else if (file->fa.relax) {
+                if(memb_eoa>0)
+                    memb_eoa += file->fa.memb_addr[mt];
+	    } else if(file->fa.relax) {
 	        /*
 	         * The member is not open yet (maybe it doesn't exist). Make the
 	         * best guess about the end-of-file.
 	         */
 	        memb_eoa = file->memb_next[mt];
-	        assert(HADDR_UNDEF!=memb_eoa);
+	        assert(HADDR_UNDEF != memb_eoa);
 	    } else {
                 H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "bad eoa", HADDR_UNDEF)
 	    }
@@ -1317,23 +1279,26 @@ H5FD_multi_get_eoa(const H5FD_t *_file, H5FD_mem_t type)
         } END_MEMBERS;
     } else {
         H5FD_mem_t mmt = file->fa.memb_map[type];
-        if (H5FD_MEM_DEFAULT==mmt) mmt = type;
 
-	if (file->memb[mmt]) {
+        if(H5FD_MEM_DEFAULT==mmt)
+            mmt = type;
+
+	if(file->memb[mmt]) {
             H5E_BEGIN_TRY {
 	        eoa = H5FDget_eoa(file->memb[mmt], mmt);
             } H5E_END_TRY;
 
-	    if (HADDR_UNDEF==eoa)
+	    if(HADDR_UNDEF == eoa)
                 H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eoa", HADDR_UNDEF)
-	    if (eoa>0) eoa += file->fa.memb_addr[mmt];
-	} else if (file->fa.relax) {
+	    if(eoa > 0)
+                eoa += file->fa.memb_addr[mmt];
+	} else if(file->fa.relax) {
 	    /*
 	     * The member is not open yet (maybe it doesn't exist). Make the
 	     * best guess about the end-of-file.
 	     */
 	    eoa = file->memb_next[mmt];
-	    assert(HADDR_UNDEF!=eoa);
+	    assert(HADDR_UNDEF != eoa);
 	 } else {
             H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "bad eoa", HADDR_UNDEF)
 	 }
@@ -1425,63 +1390,73 @@ H5FD_multi_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t eoa)
  * Programmer:	Robb Matzke
  *              Wednesday, August  4, 1999
  *
- * Modifications:
- *              Raymond Lu
- *              5 January 2007
- *              Multi driver no longer has EOA for the whole file.  Calculate
- *              it in the same way as EOF instead.
- *
  *-------------------------------------------------------------------------
  */
 static haddr_t
-H5FD_multi_get_eof(const H5FD_t *_file)
+H5FD_multi_get_eof(const H5FD_t *_file, H5FD_mem_t type)
 {
     const H5FD_multi_t	*file = (const H5FD_multi_t*)_file;
-    haddr_t		eof=0, tmp_eof;
-    haddr_t		eoa=0, tmp_eoa;
+    haddr_t		eof = 0;
     static const char *func="H5FD_multi_get_eof";  /* Function Name for error reporting */
 
     /* Clear the error stack */
     H5Eclear2(H5E_DEFAULT);
 
-    UNIQUE_MEMBERS(file->fa.memb_map, mt) {
-	if (file->memb[mt]) {
-            /* Retrieve EOF */
-	    H5E_BEGIN_TRY {
-		tmp_eof = H5FDget_eof(file->memb[mt]);
-	    } H5E_END_TRY;
+    if(H5FD_MEM_DEFAULT == type) {
+        UNIQUE_MEMBERS(file->fa.memb_map, mt) {
+            haddr_t tmp_eof;
+
+            if(file->memb[mt]) {
+                /* Retrieve EOF */
+                H5E_BEGIN_TRY {
+                    tmp_eof = H5FDget_eof(file->memb[mt], type);
+                } H5E_END_TRY;
+
+                if(HADDR_UNDEF == tmp_eof)
+                    H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eof", HADDR_UNDEF)
+                if(tmp_eof > 0)
+                    tmp_eof += file->fa.memb_addr[mt];
+            } else if(file->fa.relax) {
+                /*
+                 * The member is not open yet (maybe it doesn't exist). Make the
+                 * best guess about the end-of-file.
+                 */
+                tmp_eof = file->memb_next[mt];
+                assert(HADDR_UNDEF != tmp_eof);
+            } else {
+                H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "bad eof", HADDR_UNDEF)
+            }
+            if(tmp_eof > eof)
+                eof = tmp_eof;
+        } END_MEMBERS;
+    } else {
+        H5FD_mem_t mmt = file->fa.memb_map[type];
 
-	    if (HADDR_UNDEF==tmp_eof)
-                H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eof", HADDR_UNDEF)
-	    if (tmp_eof>0) tmp_eof += file->fa.memb_addr[mt];
+        if(H5FD_MEM_DEFAULT == mmt)
+            mmt = type;
 
-            /* Retrieve EOA */
-	    H5E_BEGIN_TRY {
-		tmp_eoa = H5FDget_eoa(file->memb[mt], mt);
-	    } H5E_END_TRY;
+	if(file->memb[mmt]) {
+            /* Retrieve EOF */
+            H5E_BEGIN_TRY {
+	        eof = H5FDget_eof(file->memb[mmt], mmt);
+            } H5E_END_TRY;
 
-	    if (HADDR_UNDEF==tmp_eoa)
-                H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eoa", HADDR_UNDEF)
-	    if (tmp_eoa>0) tmp_eoa += file->fa.memb_addr[mt];
-	} else if (file->fa.relax) {
+	    if(HADDR_UNDEF == eof)
+                H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eof", HADDR_UNDEF)
+	    if(eof > 0)
+                eof += file->fa.memb_addr[mmt];
+	} else if(file->fa.relax) {
 	    /*
 	     * The member is not open yet (maybe it doesn't exist). Make the
 	     * best guess about the end-of-file.
 	     */
-	    tmp_eof = file->memb_next[mt];
-	    assert(HADDR_UNDEF!=tmp_eof);
-
-	    tmp_eoa = file->memb_next[mt];
-	    assert(HADDR_UNDEF!=tmp_eoa);
-	} else {
+	    eof = file->memb_next[mmt];
+	    assert(HADDR_UNDEF != eof);
+	 } else {
             H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "bad eof", HADDR_UNDEF)
-	}
-
-	if (tmp_eof>eof) eof = tmp_eof;
-	if (tmp_eoa>eoa) eoa = tmp_eoa;
-    } END_MEMBERS;
-
-    return MAX(eoa, eof);
+	 }
+    }
+    return eof;
 }
 
 

@@ -1495,8 +1470,6 @@ H5FD_multi_get_eof(const H5FD_t *_file)
  * Programmer:     Raymond Lu
  *                 Sept. 16, 2002
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -1530,8 +1503,6 @@ H5FD_multi_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle)
  * Programmer:	Robb Matzke
  *              Thursday, August 12, 1999
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static haddr_t
@@ -1579,8 +1550,6 @@ H5FD_multi_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size)
  * Programmer:	Robb Matzke
  *              Thursday, August 12, 1999
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -1627,6 +1596,7 @@ H5FD_multi_read(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
     htri_t              prop_exists = FALSE;    /* Whether the multi VFD DXPL property already exists */
     H5FD_mem_t		mt, mmt, hi = H5FD_MEM_DEFAULT;
     haddr_t		start_addr = 0;
+    dxpl_id = dxpl_id; /* Suppress compiler warning */
 
     /* Clear the error stack */
     H5Eclear2(H5E_DEFAULT);
@@ -1678,6 +1648,7 @@ H5FD_multi_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
     htri_t              prop_exists = FALSE;    /* Whether the multi VFD DXPL property already exists */
     H5FD_mem_t		mt, mmt, hi = H5FD_MEM_DEFAULT;
     haddr_t		start_addr = 0;
+    dxpl_id = dxpl_id; /* Suppress compiler warning */
 
     /* Clear the error stack */
     H5Eclear2(H5E_DEFAULT);
@@ -1817,6 +1788,101 @@ H5FD_multi_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing)
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_lock
+ *
+ * Purpose:	Place a lock on all multi members.
+ *		When there is error in locking a member file, it will not
+ *		proceed further and will try to remove the locks  of those
+ *		member files that are locked before error is encountered.
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ * Programmer:	Vailin Choi; March 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_multi_lock(H5FD_t *_file, hbool_t rw)
+{
+    H5FD_multi_t	*file = (H5FD_multi_t*)_file;
+    int			nerrors = 0;
+    H5FD_mem_t 		out_mt;
+    static const char *func="H5FD_multi_unlock";  /* Function Name for error reporting */
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    /* Lock all member files */
+    ALL_MEMBERS(mt) {
+        out_mt = mt;
+        if(file->memb[mt]) {
+            H5E_BEGIN_TRY {
+                if(H5FDlock(file->memb[mt], rw) < 0) {
+                    nerrors++;
+                    break;
+                } /* end if */
+            } H5E_END_TRY;
+        } /* end if */
+    } END_MEMBERS;
+
+    /* Try to unlock the member files that are locked before error is encountered */
+    if(nerrors) {
+        H5FD_mem_t k;
+
+        for(k = H5FD_MEM_DEFAULT; k < out_mt; k = (H5FD_mem_t)(k + 1)) {
+            H5E_BEGIN_TRY {
+                if(H5FDunlock(file->memb[k]) < 0)
+                    nerrors++;
+            } H5E_END_TRY;
+        } /* end for */
+    } /* end if */
+
+    if(nerrors)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "error locking member files", -1)
+    return 0;
+
+} /* H5FD_multi_lock() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_multi_unlock
+ *
+ * Purpose:	Remove the lock on all multi members.
+ *		It will try to unlock all member files but will record error
+ *		encountered.
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ * Programmer:	Vailin Choi; March 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_multi_unlock(H5FD_t *_file)
+{
+    H5FD_multi_t	*file = (H5FD_multi_t*)_file;
+    int			nerrors=0;
+    static const char *func="H5FD_multi_unlock";  /* Function Name for error reporting */
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    ALL_MEMBERS(mt) {
+        if(file->memb[mt])
+            if(H5FDunlock(file->memb[mt]) < 0)
+		nerrors++;
+    } END_MEMBERS;
+
+    if(nerrors)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "error unlocking member files", -1)
+
+    return 0;
+} /* H5FD_multi_unlock() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	compute_next
  *
  * Purpose:	Compute the memb_next[] values of the file based on the
@@ -1829,8 +1895,6 @@ H5FD_multi_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing)
  * Programmer:	Robb Matzke
  *              Monday, August 23, 1999
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static int
@@ -1872,8 +1936,6 @@ compute_next(H5FD_multi_t *file)
  * Programmer:	Robb Matzke
  *              Monday, August 23, 1999
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static int
diff --git a/src/H5FDmulti.h b/src/H5FDmulti.h
index b45a029..e819e74 100644
--- a/src/H5FDmulti.h
+++ b/src/H5FDmulti.h
@@ -22,17 +22,12 @@
 #ifndef H5FDmulti_H
 #define H5FDmulti_H
 
-#include "H5Ipublic.h"
-#include "H5Ppublic.h"             /* Property lists */
-#include "H5Fpublic.h"
-
 #define H5FD_MULTI	(H5FD_multi_init())
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 H5_DLL hid_t H5FD_multi_init(void);
-H5_DLL void H5FD_multi_term(void);
 H5_DLL herr_t H5Pset_fapl_multi(hid_t fapl_id, const H5FD_mem_t *memb_map,
 			 const hid_t *memb_fapl, const char * const *memb_name,
 			 const haddr_t *memb_addr, hbool_t relax);
@@ -47,3 +42,4 @@ H5_DLL herr_t H5Pset_fapl_split(hid_t fapl, const char *meta_ext,
 #endif
 
 #endif
+
diff --git a/src/H5FDpkg.h b/src/H5FDpkg.h
index 7c0988e..45bcfd8 100644
--- a/src/H5FDpkg.h
+++ b/src/H5FDpkg.h
@@ -21,7 +21,7 @@
  *		the H5FD package.  Source files outside the H5FD package should
  *		include H5FDprivate.h instead.
  */
-#ifndef H5FD_PACKAGE
+#if !(defined H5FD_FRIEND || defined H5FD_MODULE)
 #error "Do not include this file outside the H5FD package!"
 #endif
 
@@ -52,15 +52,14 @@
 /******************************/
 /* Package Private Prototypes */
 /******************************/
-H5_DLL herr_t H5FD_init(void);
 H5_DLL haddr_t H5FD_alloc_real(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type,
     hsize_t size, haddr_t *align_addr, hsize_t *align_size);
 H5_DLL herr_t H5FD_free_real(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type,
     haddr_t addr, hsize_t size);
 
-
-/* Testing routines */
+/* Testing functions */
 #ifdef H5FD_TESTING
+H5_DLL hbool_t H5FD_supports_swmr_test(const char *vfd_name);
 #endif /* H5FD_TESTING */
 
 #endif /* _H5FDpkg_H */
diff --git a/src/H5FDprivate.h b/src/H5FDprivate.h
index 92e613f..2c18659 100644
--- a/src/H5FDprivate.h
+++ b/src/H5FDprivate.h
@@ -90,6 +90,12 @@ typedef struct {
     }                                   \
 }
 
+/* Define structure to hold driver ID & info for FAPLs */
+typedef struct {
+    hid_t driver_id;            /* Driver's ID */
+    const void *driver_info;    /* Driver info, for open callbacks */
+} H5FD_driver_prop_t;
+
 
 /*****************************/
 /* Library Private Variables */
@@ -109,10 +115,9 @@ H5_DLL herr_t H5FD_locate_signature(H5FD_t *file, const H5P_genplist_t *dxpl, ha
 H5_DLL H5FD_class_t *H5FD_get_class(hid_t id);
 H5_DLL hsize_t H5FD_sb_size(H5FD_t *file);
 H5_DLL herr_t H5FD_sb_encode(H5FD_t *file, char *name/*out*/, uint8_t *buf);
-H5_DLL herr_t H5FD_sb_decode(H5FD_t *file, const char *name, const uint8_t *buf);
+H5_DLL herr_t H5FD_sb_load(H5FD_t *file, const char *name, const uint8_t *buf);
 H5_DLL void *H5FD_fapl_get(H5FD_t *file);
-H5_DLL herr_t H5FD_fapl_open(struct H5P_genplist_t *plist, hid_t driver_id, const void *driver_info);
-H5_DLL herr_t H5FD_fapl_close(hid_t driver_id, void *fapl);
+H5_DLL herr_t H5FD_fapl_close(hid_t driver_id, const void *fapl);
 H5_DLL hid_t H5FD_register(const void *cls, size_t size, hbool_t app_ref);
 H5_DLL H5FD_t *H5FD_open(const char *name, unsigned flags, hid_t fapl_id,
 		  haddr_t maxaddr);
@@ -126,9 +131,10 @@ H5_DLL htri_t H5FD_try_extend(H5FD_t *file, H5FD_mem_t type, struct H5F_t *f,
     haddr_t blk_end, hsize_t extra_requested);
 H5_DLL haddr_t H5FD_get_eoa(const H5FD_t *file, H5FD_mem_t type);
 H5_DLL herr_t H5FD_set_eoa(H5FD_t *file, H5FD_mem_t type, haddr_t addr);
-H5_DLL haddr_t H5FD_get_eof(const H5FD_t *file);
+H5_DLL haddr_t H5FD_get_eof(const H5FD_t *file, H5FD_mem_t type);
 H5_DLL haddr_t H5FD_get_maxaddr(const H5FD_t *file);
 H5_DLL herr_t H5FD_get_feature_flags(const H5FD_t *file, unsigned long *feature_flags);
+H5_DLL herr_t H5FD_set_feature_flags(H5FD_t *file, unsigned long feature_flags);
 H5_DLL herr_t H5FD_get_fs_type_map(const H5FD_t *file, H5FD_mem_t *type_map);
 H5_DLL herr_t H5FD_read(H5FD_t *file, const H5P_genplist_t *dxpl, H5FD_mem_t type,
     haddr_t addr, size_t size, void *buf/*out*/);
@@ -136,6 +142,8 @@ H5_DLL herr_t H5FD_write(H5FD_t *file, const H5P_genplist_t *dxpl, H5FD_mem_t ty
     haddr_t addr, size_t size, const void *buf);
 H5_DLL herr_t H5FD_flush(H5FD_t *file, hid_t dxpl_id, unsigned closing);
 H5_DLL herr_t H5FD_truncate(H5FD_t *file, hid_t dxpl_id, hbool_t closing);
+H5_DLL herr_t H5FD_lock(H5FD_t *file, hbool_t rw);
+H5_DLL herr_t H5FD_unlock(H5FD_t *file);
 H5_DLL herr_t H5FD_get_fileno(const H5FD_t *file, unsigned long *filenum);
 H5_DLL herr_t H5FD_get_vfd_handle(H5FD_t *file, hid_t fapl, void** file_handle);
 H5_DLL herr_t H5FD_set_base_addr(H5FD_t *file, haddr_t base_addr);
diff --git a/src/H5FDpublic.h b/src/H5FDpublic.h
index b4c9903..cabca06 100644
--- a/src/H5FDpublic.h
+++ b/src/H5FDpublic.h
@@ -74,6 +74,39 @@ typedef enum H5F_mem_t	H5FD_mem_t;
 #define H5FD_MEM_SOHM_TABLE     H5FD_MEM_OHDR
 #define H5FD_MEM_SOHM_INDEX     H5FD_MEM_BTREE
 
+/* Map "extensible array" header blocks to 'ohdr' type file memory, since its
+ * a fair amount of work to add a new kind of file memory and they are similar
+ * enough to object headers and probably too minor to deserve their own type.
+ *
+ * Map "extensible array" index blocks to 'ohdr' type file memory, since they
+ * are similar to extensible array header blocks.
+ *
+ * Map "extensible array" super blocks to 'btree' type file memory, since they
+ * are similar enough to B-tree nodes.
+ *
+ * Map "extensible array" data blocks & pages to 'lheap' type file memory, since
+ * they are similar enough to local heap info.
+ *
+ *      -QAK
+ */
+#define H5FD_MEM_EARRAY_HDR     H5FD_MEM_OHDR
+#define H5FD_MEM_EARRAY_IBLOCK  H5FD_MEM_OHDR
+#define H5FD_MEM_EARRAY_SBLOCK  H5FD_MEM_BTREE
+#define H5FD_MEM_EARRAY_DBLOCK  H5FD_MEM_LHEAP
+#define H5FD_MEM_EARRAY_DBLK_PAGE  H5FD_MEM_LHEAP
+
+/* Map "fixed array" header blocks to 'ohdr' type file memory, since its
+ * a fair amount of work to add a new kind of file memory and they are similar
+ * enough to object headers and probably too minor to deserve their own type.
+ *
+ * Map "fixed array" data blocks & pages to 'lheap' type file memory, since
+ * they are similar enough to local heap info.
+ *
+ */
+#define H5FD_MEM_FARRAY_HDR     H5FD_MEM_OHDR
+#define H5FD_MEM_FARRAY_DBLOCK  H5FD_MEM_LHEAP
+#define H5FD_MEM_FARRAY_DBLK_PAGE  H5FD_MEM_LHEAP
+
 /*
  * A free-list map which maps all types of allocation requests to a single
  * free list.  This is useful for drivers that don't really care about
@@ -123,13 +156,13 @@ typedef enum H5F_mem_t	H5FD_mem_t;
 /* Define VFL driver features that can be enabled on a per-driver basis */
 /* These are returned with the 'query' function pointer in H5FD_class_t */
     /*
-     * Defining the H5FD_FEAT_AGGREGATE_METADATA for a VFL driver means that
+     * Defining H5FD_FEAT_AGGREGATE_METADATA for a VFL driver means that
      * the library will attempt to allocate a larger block for metadata and
      * then sub-allocate each metadata request from that larger block.
      */
 #define H5FD_FEAT_AGGREGATE_METADATA    0x00000001
     /*
-     * Defining the H5FD_FEAT_ACCUMULATE_METADATA for a VFL driver means that
+     * Defining H5FD_FEAT_ACCUMULATE_METADATA for a VFL driver means that
      * the library will attempt to cache metadata as it is written to the file
      * and build up a larger block of metadata to eventually pass to the VFL
      * 'write' routine.
@@ -144,7 +177,7 @@ typedef enum H5F_mem_t	H5FD_mem_t;
 #define H5FD_FEAT_ACCUMULATE_METADATA_READ      0x00000004
 #define H5FD_FEAT_ACCUMULATE_METADATA   (H5FD_FEAT_ACCUMULATE_METADATA_WRITE|H5FD_FEAT_ACCUMULATE_METADATA_READ)
     /*
-     * Defining the H5FD_FEAT_DATA_SIEVE for a VFL driver means that
+     * Defining H5FD_FEAT_DATA_SIEVE for a VFL driver means that
      * the library will attempt to cache raw data as it is read from/written to
      * a file in a "data seive" buffer.  See Rajeev Thakur's papers:
      *  http://www.mcs.anl.gov/~thakur/papers/romio-coll.ps.gz
@@ -152,33 +185,33 @@ typedef enum H5F_mem_t	H5FD_mem_t;
      */
 #define H5FD_FEAT_DATA_SIEVE            0x00000008
     /*
-     * Defining the H5FD_FEAT_AGGREGATE_SMALLDATA for a VFL driver means that
+     * Defining H5FD_FEAT_AGGREGATE_SMALLDATA for a VFL driver means that
      * the library will attempt to allocate a larger block for "small" raw data
      * and then sub-allocate "small" raw data requests from that larger block.
      */
 #define H5FD_FEAT_AGGREGATE_SMALLDATA   0x00000010
     /*
-     * Defining the H5FD_FEAT_IGNORE_DRVRINFO for a VFL driver means that
+     * Defining H5FD_FEAT_IGNORE_DRVRINFO for a VFL driver means that
      * the library will ignore the driver info that is encoded in the file
      * for the VFL driver.  (This will cause the driver info to be eliminated
      * from the file when it is flushed/closed, if the file is opened R/W).
      */
 #define H5FD_FEAT_IGNORE_DRVRINFO       0x00000020
     /*
-     * Defining the H5FD_FEAT_DIRTY_SBLK_LOAD for a VFL driver means that
-     * the library will mark the superblock dirty when the file is opened
+     * Defining the H5FD_FEAT_DIRTY_DRVRINFO_LOAD for a VFL driver means that
+     * the library will mark the driver info dirty when the file is opened
      * R/W.  This will cause the driver info to be re-encoded when the file
      * is flushed/closed.
      */
-#define H5FD_FEAT_DIRTY_SBLK_LOAD       0x00000040
+#define H5FD_FEAT_DIRTY_DRVRINFO_LOAD   0x00000040
     /*
-     * Defining the H5FD_FEAT_POSIX_COMPAT_HANDLE for a VFL driver means that
+     * Defining H5FD_FEAT_POSIX_COMPAT_HANDLE for a VFL driver means that
      * the handle for the VFD (returned with the 'get_handle' callback) is
      * of type 'int' and is compatible with POSIX I/O calls.
      */
-#define H5FD_FEAT_POSIX_COMPAT_HANDLE   0x00000080
+#define H5FD_FEAT_POSIX_COMPAT_HANDLE   0x00000080    
     /*
-     * Defining the H5FD_FEAT_HAS_MPI for a VFL driver means that
+     * Defining H5FD_FEAT_HAS_MPI for a VFL driver means that
      * the driver makes use of MPI communication and code may retrieve
      * communicator/rank information from it
      */
@@ -190,17 +223,22 @@ typedef enum H5F_mem_t	H5FD_mem_t;
      */
 #define H5FD_FEAT_ALLOCATE_EARLY        0x00000200
     /* 
-     * Defining the H5FD_FEAT_ALLOW_FILE_IMAGE for a VFL driver means that
+     * Defining H5FD_FEAT_ALLOW_FILE_IMAGE for a VFL driver means that
      * the driver is able to use a file image in the fapl as the initial
      * contents of a file.
      */
 #define H5FD_FEAT_ALLOW_FILE_IMAGE      0x00000400
     /*
-     * Defining the H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS for a VFL driver
+     * Defining H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS for a VFL driver
      * means that the driver is able to use callbacks to make a copy of the
      * image to store in memory.
      */
 #define H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS 0x00000800
+    /*
+     * Defining H5FD_FEAT_SUPPORTS_SWMR_IO for a VFL driver means that the
+     * driver supports the single-writer/multiple-readers I/O pattern.
+     */
+#define H5FD_FEAT_SUPPORTS_SWMR_IO      0x00001000
 
 /* Forward declaration */
 typedef struct H5FD_t H5FD_t;
@@ -210,6 +248,7 @@ typedef struct H5FD_class_t {
     const char *name;
     haddr_t maxaddr;
     H5F_close_degree_t fc_degree;
+    herr_t  (*terminate)(void);
     hsize_t (*sb_size)(H5FD_t *file);
     herr_t  (*sb_encode)(H5FD_t *file, char *name/*out*/,
                          unsigned char *p/*out*/);
@@ -232,7 +271,7 @@ typedef struct H5FD_class_t {
                     haddr_t addr, hsize_t size);
     haddr_t (*get_eoa)(const H5FD_t *file, H5FD_mem_t type);
     herr_t  (*set_eoa)(H5FD_t *file, H5FD_mem_t type, haddr_t addr);
-    haddr_t (*get_eof)(const H5FD_t *file);
+    haddr_t (*get_eof)(const H5FD_t *file, H5FD_mem_t type);
     herr_t  (*get_handle)(H5FD_t *file, hid_t fapl, void**file_handle);
     herr_t  (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl,
                     haddr_t addr, size_t size, void *buffer);
@@ -240,8 +279,8 @@ typedef struct H5FD_class_t {
                      haddr_t addr, size_t size, const void *buffer);
     herr_t  (*flush)(H5FD_t *file, hid_t dxpl_id, unsigned closing);
     herr_t  (*truncate)(H5FD_t *file, hid_t dxpl_id, hbool_t closing);
-    herr_t  (*lock)(H5FD_t *file, unsigned char *oid, unsigned lock_type, hbool_t last);
-    herr_t  (*unlock)(H5FD_t *file, unsigned char *oid, hbool_t last);
+    herr_t  (*lock)(H5FD_t *file, hbool_t rw);
+    herr_t  (*unlock)(H5FD_t *file);
     H5FD_mem_t fl_map[H5FD_MEM_NTYPES];
 } H5FD_class_t;
 
@@ -263,6 +302,8 @@ struct H5FD_t {
     unsigned long       feature_flags;  /* VFL Driver feature Flags */
     haddr_t             maxaddr;        /* For this file, overrides class */
     haddr_t             base_addr;      /* Base address for HDF5 data w/in file */
+    hbool_t     	swmr_read;	/* Whether the file is open for SWMR read access */
+					/* Information from file open flags, for SWMR access */
 
     /* Space allocation management fields */
     hsize_t             threshold;      /* Threshold for alignment  */
@@ -313,7 +354,7 @@ H5_DLL herr_t H5FDfree(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id,
                        haddr_t addr, hsize_t size);
 H5_DLL haddr_t H5FDget_eoa(H5FD_t *file, H5FD_mem_t type);
 H5_DLL herr_t H5FDset_eoa(H5FD_t *file, H5FD_mem_t type, haddr_t eoa);
-H5_DLL haddr_t H5FDget_eof(H5FD_t *file);
+H5_DLL haddr_t H5FDget_eof(H5FD_t *file, H5FD_mem_t type);
 H5_DLL herr_t H5FDget_vfd_handle(H5FD_t *file, hid_t fapl, void**file_handle);
 H5_DLL herr_t H5FDread(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id,
                        haddr_t addr, size_t size, void *buf/*out*/);
@@ -321,6 +362,8 @@ H5_DLL herr_t H5FDwrite(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id,
                         haddr_t addr, size_t size, const void *buf);
 H5_DLL herr_t H5FDflush(H5FD_t *file, hid_t dxpl_id, unsigned closing);
 H5_DLL herr_t H5FDtruncate(H5FD_t *file, hid_t dxpl_id, hbool_t closing);
+H5_DLL herr_t H5FDlock(H5FD_t *file, hbool_t rw);
+H5_DLL herr_t H5FDunlock(H5FD_t *file);
 
 #ifdef __cplusplus
 }
diff --git a/src/H5FDsec2.c b/src/H5FDsec2.c
index e513381..149715e 100644
--- a/src/H5FDsec2.c
+++ b/src/H5FDsec2.c
@@ -25,8 +25,7 @@
  *          application to the same file).
  */
 
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC  H5FD_sec2_init_interface
+#include "H5FDdrvr_module.h" /* This source code file is part of the H5FD driver module */
 
 
 #include "H5private.h"      /* Generic Functions        */
@@ -98,6 +97,7 @@ typedef struct H5FD_sec2_t {
      * a single file.
      */
     hbool_t         fam_to_sec2;
+
 } H5FD_sec2_t;
 
 /*
@@ -123,6 +123,7 @@ typedef struct H5FD_sec2_t {
                                 (HDoff_t)((A)+(Z))<(HDoff_t)(A))
 
 /* Prototypes */
+static herr_t H5FD_sec2_term(void);
 static H5FD_t *H5FD_sec2_open(const char *name, unsigned flags, hid_t fapl_id,
             haddr_t maxaddr);
 static herr_t H5FD_sec2_close(H5FD_t *_file);
@@ -130,18 +131,21 @@ static int H5FD_sec2_cmp(const H5FD_t *_f1, const H5FD_t *_f2);
 static herr_t H5FD_sec2_query(const H5FD_t *_f1, unsigned long *flags);
 static haddr_t H5FD_sec2_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
 static herr_t H5FD_sec2_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
-static haddr_t H5FD_sec2_get_eof(const H5FD_t *_file);
+static haddr_t H5FD_sec2_get_eof(const H5FD_t *_file, H5FD_mem_t type);
 static herr_t  H5FD_sec2_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
 static herr_t H5FD_sec2_read(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
             size_t size, void *buf);
 static herr_t H5FD_sec2_write(H5FD_t *_file, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
             size_t size, const void *buf);
 static herr_t H5FD_sec2_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing);
+static herr_t H5FD_sec2_lock(H5FD_t *_file, hbool_t rw);
+static herr_t H5FD_sec2_unlock(H5FD_t *_file);
 
 static const H5FD_class_t H5FD_sec2_g = {
     "sec2",                     /* name                 */
     MAXADDR,                    /* maxaddr              */
     H5F_CLOSE_WEAK,             /* fc_degree            */
+    H5FD_sec2_term,             /* terminate            */
     NULL,                       /* sb_size              */
     NULL,                       /* sb_encode            */
     NULL,                       /* sb_decode            */
@@ -167,8 +171,8 @@ static const H5FD_class_t H5FD_sec2_g = {
     H5FD_sec2_write,            /* write                */
     NULL,                       /* flush                */
     H5FD_sec2_truncate,         /* truncate             */
-    NULL,                       /* lock                 */
-    NULL,                       /* unlock               */
+    H5FD_sec2_lock,             /* lock                 */
+    H5FD_sec2_unlock,           /* unlock               */
     H5FD_FLMAP_DICHOTOMY        /* fl_map               */
 };
 
@@ -177,22 +181,27 @@ H5FL_DEFINE_STATIC(H5FD_sec2_t);
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5FD_sec2_init_interface
+ * Function:    H5FD__init_package
  *
  * Purpose:     Initializes any interface-specific data or routines.
  *
- * Return:      Success:    The driver ID for the sec2 driver.
- *              Failure:    Negative
+ * Return:      Non-negative on success/Negative on failure
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_sec2_init_interface(void)
+H5FD__init_package(void)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    herr_t ret_value = SUCCEED;
 
-    FUNC_LEAVE_NOAPI(H5FD_sec2_init())
-} /* H5FD_sec2_init_interface() */
+    FUNC_ENTER_STATIC
+
+    if(H5FD_sec2_init() < 0)
+        HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "unable to initialize sec2 VFD")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FD__init_package() */
 
 

 /*-------------------------------------------------------------------------
@@ -212,7 +221,7 @@ H5FD_sec2_init_interface(void)
 hid_t
 H5FD_sec2_init(void)
 {
-    hid_t ret_value;            /* Return value */
+    hid_t ret_value = H5I_INVALID_HID;          /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -232,14 +241,14 @@ done:
  *
  * Purpose:     Shut down the VFD
  *
- * Returns:     <none>
+ * Returns:     SUCCEED (Can't fail)
  *
  * Programmer:  Quincey Koziol
  *              Friday, Jan 30, 2004
  *
  *---------------------------------------------------------------------------
  */
-void
+static herr_t
 H5FD_sec2_term(void)
 {
     FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -247,7 +256,7 @@ H5FD_sec2_term(void)
     /* Reset VFL ID */
     H5FD_SEC2_g = 0;
 
-    FUNC_LEAVE_NOAPI_VOID
+    FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5FD_sec2_term() */
 
 

@@ -309,7 +318,7 @@ H5FD_sec2_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr)
     struct _BY_HANDLE_FILE_INFORMATION fileinfo;
 #endif
     h5_stat_t       sb;
-    H5FD_t          *ret_value;             /* Return value             */
+    H5FD_t          *ret_value = NULL;          /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -521,6 +530,7 @@ H5FD_sec2_query(const H5FD_t *_file, unsigned long *flags /* out */)
         *flags |= H5FD_FEAT_DATA_SIEVE;             /* OK to perform data sieving for faster raw data reads & writes    */
         *flags |= H5FD_FEAT_AGGREGATE_SMALLDATA;    /* OK to aggregate "small" raw data allocations                     */
         *flags |= H5FD_FEAT_POSIX_COMPAT_HANDLE;    /* VFD handle is POSIX I/O call compatible                          */
+        *flags |= H5FD_FEAT_SUPPORTS_SWMR_IO;       /* VFD supports the single-writer/multiple-readers (SWMR) pattern   */
 
         /* Check for flags that are set by h5repart */
         if(file && file->fam_to_sec2)
@@ -599,13 +609,13 @@ H5FD_sec2_set_eoa(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr)
  *-------------------------------------------------------------------------
  */
 static haddr_t
-H5FD_sec2_get_eof(const H5FD_t *_file)
+H5FD_sec2_get_eof(const H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type)
 {
     const H5FD_sec2_t   *file = (const H5FD_sec2_t *)_file;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    FUNC_LEAVE_NOAPI(MAX(file->eof, file->eoa))
+    FUNC_LEAVE_NOAPI(file->eof)
 } /* end H5FD_sec2_get_eof() */
 
 

@@ -895,3 +905,69 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5FD_sec2_truncate() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_sec2_lock
+ *
+ * Purpose:     To place an advisory lock on a file.
+ *		The lock type to apply depends on the parameter "rw":
+ *			TRUE--opens for write: an exclusive lock
+ *			FALSE--opens for read: a shared lock
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi; May 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_sec2_lock(H5FD_t *_file, hbool_t rw)
+{
+    H5FD_sec2_t *file = (H5FD_sec2_t *)_file;	/* VFD file struct */
+    int lock;					/* The type of lock */
+    herr_t ret_value = SUCCEED;                 /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file);
+
+    /* Determine the type of lock */
+    lock = rw ? LOCK_EX : LOCK_SH;
+    
+    /* Place the lock with non-blocking */
+    if(HDflock(file->fd, lock | LOCK_NB) < 0)
+        HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "unable to flock file")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_sec2_lock() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_sec2_unlock
+ *
+ * Purpose:     To remove the existing lock on the file
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi; May 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_sec2_unlock(H5FD_t *_file)
+{
+    H5FD_sec2_t *file = (H5FD_sec2_t *)_file;	/* VFD file struct */
+    herr_t ret_value = SUCCEED;                 /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(file);
+
+    if(HDflock(file->fd, LOCK_UN) < 0)
+        HSYS_GOTO_ERROR(H5E_FILE, H5E_BADFILE, FAIL, "unable to flock (unlock) file")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FD_sec2_unlock() */
+
diff --git a/src/H5FDsec2.h b/src/H5FDsec2.h
index b7db0d5..0c62597 100644
--- a/src/H5FDsec2.h
+++ b/src/H5FDsec2.h
@@ -22,8 +22,6 @@
 #ifndef H5FDsec2_H
 #define H5FDsec2_H
 
-#include "H5Ipublic.h"
-
 #define H5FD_SEC2	(H5FD_sec2_init())
 
 #ifdef __cplusplus
@@ -31,7 +29,6 @@ extern "C" {
 #endif
 
 H5_DLL hid_t H5FD_sec2_init(void);
-H5_DLL void H5FD_sec2_term(void);
 H5_DLL herr_t H5Pset_fapl_sec2(hid_t fapl_id);
 
 #ifdef __cplusplus
diff --git a/src/H5FDspace.c b/src/H5FDspace.c
index deb2153..edc83e6 100644
--- a/src/H5FDspace.c
+++ b/src/H5FDspace.c
@@ -28,10 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5FD_PACKAGE		/*suppress error about including H5FDpkg  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5FD_space_init_interface
+#include "H5FDmodule.h"         /* This source code file is part of the H5FD module */
 
 
 /***********/
@@ -86,28 +83,6 @@ H5FL_DEFINE(H5FD_free_t);
 
 
 

-/*--------------------------------------------------------------------------
-NAME
-   H5FD_space_init_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5FD_space_init_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5FD_init_iterface currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5FD_space_init_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5FD_init())
-} /* H5FD_space_init_interface() */
-
-

 /*-------------------------------------------------------------------------
  * Function:    H5FD_extend
  *
@@ -129,7 +104,7 @@ H5FD_extend(H5FD_t *file, H5FD_mem_t type, hbool_t new_block, hsize_t size, hadd
     hsize_t orig_size = size;   /* Original allocation size */
     haddr_t eoa;                /* Address of end-of-allocated space */
     hsize_t extra;        	/* Extra space to allocate, to align request */
-    haddr_t ret_value;          /* Return value */
+    haddr_t ret_value = HADDR_UNDEF;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -197,7 +172,7 @@ done:
 haddr_t
 H5FD_alloc_real(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type, hsize_t size, haddr_t *frag_addr, hsize_t *frag_size)
 {
-    haddr_t     ret_value;              /* Return value */
+    haddr_t ret_value = HADDR_UNDEF;    /* Return value */
 
     FUNC_ENTER_NOAPI(HADDR_UNDEF)
 #ifdef H5FD_ALLOC_DEBUG
@@ -253,7 +228,7 @@ haddr_t
 H5FD_alloc(H5FD_t *file, hid_t dxpl_id, H5FD_mem_t type, H5F_t *f, hsize_t size,
     haddr_t *frag_addr, hsize_t *frag_size)
 {
-    haddr_t     ret_value;              /* Return value */
+    haddr_t ret_value = HADDR_UNDEF;    /* Return value */
 
     FUNC_ENTER_NOAPI(HADDR_UNDEF)
 
diff --git a/src/H5FDstdio.c b/src/H5FDstdio.c
index d63e5f1..bc0b342 100644
--- a/src/H5FDstdio.c
+++ b/src/H5FDstdio.c
@@ -31,6 +31,11 @@
 
 #include "hdf5.h"
 
+#ifdef H5_HAVE_FLOCK
+/* Needed for lock type definitions (e.g., LOCK_EX) */
+#include <sys/file.h>
+#endif /* H5_HAVE_FLOCK */
+
 #ifdef H5_HAVE_UNISTD_H
 #include <unistd.h>
 #endif
@@ -43,17 +48,7 @@
 #include <windows.h>
 #include <io.h>
 
-/* This is not defined in the Windows header files */
-#ifndef F_OK
-#define F_OK 00
-#endif
-
-#endif
-
-#ifdef MAX
-#undef MAX
-#endif /* MAX */
-#define MAX(X,Y)  ((X)>(Y)?(X):(Y))
+#endif /* H5_HAVE_WIN32_API */
 
 /* The driver identification number, initialized at runtime */
 static hid_t H5FD_STDIO_g = 0;
@@ -119,6 +114,7 @@ typedef struct H5FD_stdio_t {
     
     HANDLE          hFile;      /* Native windows file handle */
 #endif  /* H5_HAVE_WIN32_API */
+
 } H5FD_stdio_t;
 
 /* Use similar structure as in H5private.h by defining Windows stuff first. */
@@ -172,6 +168,7 @@ typedef struct H5FD_stdio_t {
     HADDR_UNDEF==(A)+(Z) || (file_offset_t)((A)+(Z))<(file_offset_t)(A))
 
 /* Prototypes */
+static herr_t H5FD_stdio_term(void);
 static H5FD_t *H5FD_stdio_open(const char *name, unsigned flags,
                  hid_t fapl_id, haddr_t maxaddr);
 static herr_t H5FD_stdio_close(H5FD_t *lf);
@@ -180,7 +177,7 @@ static herr_t H5FD_stdio_query(const H5FD_t *_f1, unsigned long *flags);
 static haddr_t H5FD_stdio_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size);
 static haddr_t H5FD_stdio_get_eoa(const H5FD_t *_file, H5FD_mem_t type);
 static herr_t H5FD_stdio_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t addr);
-static haddr_t H5FD_stdio_get_eof(const H5FD_t *_file);
+static haddr_t H5FD_stdio_get_eof(const H5FD_t *_file, H5FD_mem_t type);
 static herr_t  H5FD_stdio_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle);
 static herr_t H5FD_stdio_read(H5FD_t *lf, H5FD_mem_t type, hid_t fapl_id, haddr_t addr,
                 size_t size, void *buf);
@@ -188,11 +185,14 @@ static herr_t H5FD_stdio_write(H5FD_t *lf, H5FD_mem_t type, hid_t fapl_id, haddr
                 size_t size, const void *buf);
 static herr_t H5FD_stdio_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing);
 static herr_t H5FD_stdio_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing);
+static herr_t H5FD_stdio_lock(H5FD_t *_file, hbool_t rw);
+static herr_t H5FD_stdio_unlock(H5FD_t *_file);
 
 static const H5FD_class_t H5FD_stdio_g = {
     "stdio",                    /* name         */
     MAXADDR,                    /* maxaddr      */
     H5F_CLOSE_WEAK,             /* fc_degree    */
+    H5FD_stdio_term,            /* terminate    */
     NULL,                       /* sb_size      */
     NULL,                       /* sb_encode    */
     NULL,                       /* sb_decode    */
@@ -218,8 +218,8 @@ static const H5FD_class_t H5FD_stdio_g = {
     H5FD_stdio_write,           /* write        */
     H5FD_stdio_flush,           /* flush        */
     H5FD_stdio_truncate,        /* truncate     */
-    NULL,                       /* lock         */
-    NULL,                       /* unlock       */
+    H5FD_stdio_lock,            /* lock         */
+    H5FD_stdio_unlock,          /* unlock       */
     H5FD_FLMAP_DICHOTOMY	/* fl_map       */
 };
 
@@ -256,20 +256,20 @@ H5FD_stdio_init(void)
  *
  * Purpose:  Shut down the VFD
  *
- * Returns:     None
+ * Returns:     Non-negative on success or negative on failure
  *
  * Programmer:  Quincey Koziol
  *              Friday, Jan 30, 2004
  *
  *---------------------------------------------------------------------------
  */
-void
+static herr_t
 H5FD_stdio_term(void)
 {
     /* Reset VFL ID */
     H5FD_STDIO_g = 0;
 
-    return;
+    return 0;
 } /* end H5FD_stdio_term() */
 
 

@@ -329,7 +329,7 @@ H5Pset_fapl_stdio(hid_t fapl_id)
  *-------------------------------------------------------------------------
  */
 static H5FD_t *
-H5FD_stdio_open( const char *name, unsigned flags, hid_t fapl_id,
+H5FD_stdio_open( const char *name, unsigned flags, hid_t /*UNUSED*/ fapl_id,
     haddr_t maxaddr)
 {
     FILE                *f = NULL;
@@ -447,7 +447,7 @@ H5FD_stdio_open( const char *name, unsigned flags, hid_t fapl_id,
     file->inode = sb.st_ino;
 #endif /* H5_HAVE_WIN32_API */
 
-    return (H5FD_t*)file;
+    return((H5FD_t*)file);
 } /* end H5FD_stdio_open() */
 
 

@@ -554,12 +554,16 @@ H5FD_stdio_cmp(const H5FD_t *_f1, const H5FD_t *_f2)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_stdio_query(const H5FD_t *_f, unsigned long *flags /* out */)
+H5FD_stdio_query(const H5FD_t *_f, unsigned long /*OUT*/ *flags)
 {
     /* Quiet the compiler */
     _f=_f;
 
-    /* Set the VFL feature flags that this driver supports */
+    /* Set the VFL feature flags that this driver supports.
+     *
+     * Note that this VFD does not support SWMR due to the unpredictable
+     * nature of the buffering layer.
+     */
     if(flags) {
         *flags = 0;
         *flags|=H5FD_FEAT_AGGREGATE_METADATA; /* OK to aggregate metadata allocations */
@@ -591,7 +595,7 @@ H5FD_stdio_query(const H5FD_t *_f, unsigned long *flags /* out */)
  *-------------------------------------------------------------------------
  */
 static haddr_t
-H5FD_stdio_alloc(H5FD_t *_file, H5FD_mem_t /*H5_ATTR_UNUSED*/ type, hid_t /*H5_ATTR_UNUSED*/ dxpl_id, hsize_t size)
+H5FD_stdio_alloc(H5FD_t *_file, H5FD_mem_t /*UNUSED*/ type, hid_t /*UNUSED*/ dxpl_id, hsize_t size)
 {
     H5FD_stdio_t    *file = (H5FD_stdio_t*)_file;
     haddr_t         addr;
@@ -636,7 +640,7 @@ H5FD_stdio_alloc(H5FD_t *_file, H5FD_mem_t /*H5_ATTR_UNUSED*/ type, hid_t /*H5_A
  *-------------------------------------------------------------------------
  */
 static haddr_t
-H5FD_stdio_get_eoa(const H5FD_t *_file, H5FD_mem_t /*H5_ATTR_UNUSED*/ type)
+H5FD_stdio_get_eoa(const H5FD_t *_file, H5FD_mem_t /*UNUSED*/ type)
 {
     const H5FD_stdio_t *file = (const H5FD_stdio_t *)_file;
 
@@ -667,7 +671,7 @@ H5FD_stdio_get_eoa(const H5FD_t *_file, H5FD_mem_t /*H5_ATTR_UNUSED*/ type)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_stdio_set_eoa(H5FD_t *_file, H5FD_mem_t /*H5_ATTR_UNUSED*/ type, haddr_t addr)
+H5FD_stdio_set_eoa(H5FD_t *_file, H5FD_mem_t /*UNUSED*/ type, haddr_t addr)
 {
     H5FD_stdio_t  *file = (H5FD_stdio_t*)_file;
 
@@ -702,14 +706,20 @@ H5FD_stdio_set_eoa(H5FD_t *_file, H5FD_mem_t /*H5_ATTR_UNUSED*/ type, haddr_t ad
  *-------------------------------------------------------------------------
  */
 static haddr_t
-H5FD_stdio_get_eof(const H5FD_t *_file)
+H5FD_stdio_get_eof(const H5FD_t *_file, H5FD_mem_t /*UNUSED*/ type)
 {
     const H5FD_stdio_t  *file = (const H5FD_stdio_t *)_file;
 
+    /* Quiet the compiler */
+    type = type;
+
     /* Clear the error stack */
     H5Eclear2(H5E_DEFAULT);
 
-    return MAX(file->eof, file->eoa);
+    /* Quiet the compiler */
+    type = type;
+
+    return(file->eof);
 } /* end H5FD_stdio_get_eof() */
 
 

@@ -726,7 +736,7 @@ H5FD_stdio_get_eof(const H5FD_t *_file)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_stdio_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle)
+H5FD_stdio_get_handle(H5FD_t *_file, hid_t /*UNUSED*/ fapl, void **file_handle)
 {
     H5FD_stdio_t       *file = (H5FD_stdio_t *)_file;
     static const char  *func = "H5FD_stdio_get_handle";  /* Function Name for error reporting */
@@ -764,8 +774,8 @@ H5FD_stdio_get_handle(H5FD_t *_file, hid_t fapl, void** file_handle)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_stdio_read(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t size,
-    void *buf/*out*/)
+H5FD_stdio_read(H5FD_t *_file, H5FD_mem_t /*UNUSED*/ type, hid_t /*UNUSED*/ dxpl_id,
+    haddr_t addr, size_t size, void /*OUT*/ *buf)
 {
     H5FD_stdio_t    *file = (H5FD_stdio_t*)_file;
     static const char *func = "H5FD_stdio_read";  /* Function Name for error reporting */
@@ -869,8 +879,8 @@ H5FD_stdio_read(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, siz
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_stdio_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
-    size_t size, const void *buf)
+H5FD_stdio_write(H5FD_t *_file, H5FD_mem_t /*UNUSED*/ type, hid_t /*UNUSED*/ dxpl_id,
+    haddr_t addr, size_t size, const void *buf)
 {
     H5FD_stdio_t    *file = (H5FD_stdio_t*)_file;
     static const char *func = "H5FD_stdio_write";  /* Function Name for error reporting */
@@ -959,7 +969,7 @@ H5FD_stdio_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_stdio_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing)
+H5FD_stdio_flush(H5FD_t *_file, hid_t /*UNUSED*/ dxpl_id, unsigned closing)
 {
     H5FD_stdio_t  *file = (H5FD_stdio_t*)_file;
     static const char *func = "H5FD_stdio_flush";  /* Function Name for error reporting */
@@ -1004,7 +1014,8 @@ H5FD_stdio_flush(H5FD_t *_file, hid_t dxpl_id, unsigned closing)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FD_stdio_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing)
+H5FD_stdio_truncate(H5FD_t *_file, hid_t /*UNUSED*/ dxpl_id,
+    hbool_t /*UNUSED*/ closing)
 {
     H5FD_stdio_t  *file = (H5FD_stdio_t*)_file;
     static const char *func = "H5FD_stdio_truncate";  /* Function Name for error reporting */
@@ -1077,6 +1088,87 @@ H5FD_stdio_truncate(H5FD_t *_file, hid_t dxpl_id, hbool_t closing)
 } /* end H5FD_stdio_truncate() */
 
 

+/*-------------------------------------------------------------------------
+ * Function:    H5FD_stdio_lock
+ *
+ * Purpose:     Lock a file via flock
+ *
+ *              NOTE: This function is a no-op if flock() is not present.
+ * Errors:
+ *    IO    FCNTL    flock failed.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi; March 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_stdio_lock(H5FD_t *_file, hbool_t rw)
+{
+#ifdef H5_HAVE_FLOCK
+    H5FD_stdio_t  *file = (H5FD_stdio_t*)_file;
+    int lock;                                   	/* The type of lock */
+    static const char *func = "H5FD_stdio_lock";  	/* Function Name for error reporting */
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    assert(file);
+
+    /* Determine the type of lock */
+    lock = rw ? LOCK_EX : LOCK_SH;
+
+    /* Place the lock with non-blocking */
+    if(flock(file->fd, lock | LOCK_NB) < 0)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_FCNTL, "flock failed", -1)
+    if(fflush(file->fp) < 0)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_WRITEERROR, "fflush failed", -1)
+
+#endif /* H5_HAVE_FLOCK */
+
+    return 0;
+} /* end H5FD_stdio_lock() */
+
+/*-------------------------------------------------------------------------
+ * Function:  H5F_stdio_unlock
+ *
+ * Purpose:  Unlock a file via flock
+ *
+ *
+ *           NOTE: This function is a no-op if flock() is not present.
+ * Errors:
+ *    IO    FCNTL    flock failed.
+ *
+ * Return:  Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi; March 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FD_stdio_unlock(H5FD_t *_file)
+{
+#ifdef H5_HAVE_FLOCK
+    H5FD_stdio_t  *file = (H5FD_stdio_t*)_file;
+    static const char *func = "H5FD_stdio_unlock";  	/* Function Name for error reporting */
+
+    /* Clear the error stack */
+    H5Eclear2(H5E_DEFAULT);
+
+    assert(file);
+
+    if(fflush(file->fp) < 0)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_WRITEERROR, "fflush failed", -1)
+    if(flock(file->fd, LOCK_UN) < 0)
+        H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_FCNTL, "flock (unlock) failed", -1)
+
+#endif /* H5_HAVE_FLOCK */
+
+    return 0;
+} /* end H5FD_stdio_unlock() */
+
+

 #ifdef _H5private_H
 /*
  * This is not related to the functionality of the driver code.
diff --git a/src/H5FDstdio.h b/src/H5FDstdio.h
index 80443d8..8281705 100644
--- a/src/H5FDstdio.h
+++ b/src/H5FDstdio.h
@@ -31,7 +31,6 @@ extern "C" {
 #endif
 
 H5_DLL hid_t H5FD_stdio_init(void);
-H5_DLL void H5FD_stdio_term(void);
 H5_DLL herr_t H5Pset_fapl_stdio(hid_t fapl_id);
 
 #ifdef __cplusplus
diff --git a/src/H5FDtest.c b/src/H5FDtest.c
new file mode 100644
index 0000000..9d2f2e9
--- /dev/null
+++ b/src/H5FDtest.c
@@ -0,0 +1,119 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5FDtest.c
+ *			    Fall 2014
+ *
+ * Purpose:		File driver testing routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#include "H5FDmodule.h"         /* This source code file is part of the H5FD module */
+#define H5FD_TESTING		/* Suppress warning about H5FD testing funcs    */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions    */
+#include "H5FDpkg.h"        /* File Drivers         */
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FD_supports_swmr_test()
+ *
+ * Purpose:	    Determines if a VFD supports SWMR.
+ *
+ *              The function determines SWMR support by inspecting the
+ *              HDF5_DRIVER environment variable, not by checking the
+ *              VFD feature flags (which do not exist until the driver
+ *              is instantiated).
+ *
+ *              See test/Makefile.am for a list of the VFD strings.
+ *
+ *              This function is only intended for use in the test code.
+ *
+ * Return:	    TRUE (1) if the VFD supports SWMR I/O or vfd_name is
+ *              NULL or the empty string (which implies the default VFD).
+ *
+ *              FALSE (0) if it does not
+ *
+ *              This function cannot fail at this time so there is no
+ *              error return value.
+ *
+ * Programmer:	Dana Robinson
+ *              Fall 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+hbool_t
+H5FD_supports_swmr_test(const char *vfd_name)
+{
+    hbool_t ret_value = FALSE;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(!vfd_name || !HDstrcmp(vfd_name, ""))
+        ret_value = TRUE;
+    else
+        ret_value = !HDstrcmp(vfd_name, "direct")
+            || !HDstrcmp(vfd_name, "log")
+            || !HDstrcmp(vfd_name, "sec2");
+
+    FUNC_LEAVE_NOAPI(ret_value)
+    
+} /* end H5FD_supports_swmr_test() */
+
diff --git a/src/H5FDwindows.h b/src/H5FDwindows.h
index 7b547bf..7a9d2cf 100644
--- a/src/H5FDwindows.h
+++ b/src/H5FDwindows.h
@@ -23,27 +23,17 @@
 #ifndef H5FDwindows_H
 #define H5FDwindows_H
 
-#include "H5Ipublic.h"
-#include "H5FDsec2.h"
-
-#define H5FD_WINDOWS	(H5FD_windows_init())
+#define H5FD_WINDOWS	(H5FD_sec2_init())
 
 #ifdef __cplusplus
 extern "C" {
-#endif
+#endif /* __cplusplus */
 
-/* The code behind the windows VFD has been removed and the windows
- * VFD initialization has been redirected to the SEC2 driver.  The
- * "Windows" VFD was actually identical to the SEC2 driver code
- * (a planned Win32 API driver never happened) so this change
- * should be transparent to users.
- */
-#define H5FD_windows_init H5FD_sec2_init
-#define H5FD_windows_term H5FD_sec2_term
 H5_DLL herr_t H5Pset_fapl_windows(hid_t fapl_id);
 
 #ifdef __cplusplus
 }
-#endif
+#endif /* __cplusplus */
+
+#endif /* H5FDwindows_H */
 
-#endif
diff --git a/src/H5FL.c b/src/H5FL.c
index aec92ff..00cbf0c 100644
--- a/src/H5FL.c
+++ b/src/H5FL.c
@@ -27,8 +27,7 @@
  *      move frequently accessed free lists to the head of the queue.
  */
 
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5FL_init_interface
+#include "H5FLmodule.h"         /* This source code file is part of the H5FL module */
 
 
 /* #define H5FL_DEBUG */
@@ -117,6 +116,9 @@ struct H5FL_fac_node_t {
     struct H5FL_fac_node_t *next;   /* Pointer to next block in free list */
 };
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 /* The head of the list of factory things to garbage collect */
 static H5FL_fac_gc_list_t H5FL_fac_gc_head={0,NULL};
 
@@ -130,14 +132,18 @@ static H5FL_track_t *H5FL_out_head_g = NULL;
 #endif /* H5FL_TRACK */
 
 /* Forward declarations of local static functions */
-static herr_t H5FL_reg_gc(void);
-static herr_t H5FL_reg_gc_list(H5FL_reg_head_t *head);
-static herr_t H5FL_arr_gc(void);
-static herr_t H5FL_arr_gc_list(H5FL_arr_head_t *head);
-static herr_t H5FL_blk_gc(void);
-static herr_t H5FL_blk_gc_list(H5FL_blk_head_t *head);
-static herr_t H5FL_fac_gc(void);
-static herr_t H5FL_fac_gc_list(H5FL_fac_head_t *head);
+static herr_t H5FL__reg_gc(void);
+static herr_t H5FL__reg_gc_list(H5FL_reg_head_t *head);
+static int H5FL__reg_term(void);
+static herr_t H5FL__arr_gc(void);
+static herr_t H5FL__arr_gc_list(H5FL_arr_head_t *head);
+static int H5FL__arr_term(void);
+static herr_t H5FL__blk_gc(void);
+static herr_t H5FL__blk_gc_list(H5FL_blk_head_t *head);
+static int H5FL__blk_term(void);
+static herr_t H5FL__fac_gc(void);
+static herr_t H5FL__fac_gc_list(H5FL_fac_head_t *head);
+static int H5FL__fac_term_all(void);
 
 /* Declare a free list to manage the H5FL_blk_node_t struct */
 H5FL_DEFINE(H5FL_blk_node_t);
@@ -150,26 +156,66 @@ H5FL_DEFINE(H5FL_fac_head_t);
 
 

 /*--------------------------------------------------------------------------
-NAME
-   H5FL_init_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5FL_init_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.
-
+ NAME
+    H5FL_term_package
+ PURPOSE
+    Terminate various H5FL objects
+ USAGE
+    void H5FL_term_package()
+ RETURNS
+    Success:	Positive if any action might have caused a change in some
+                other interface; zero otherwise.
+   	Failure:	Negative
+ DESCRIPTION
+    Release any resources allocated.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+     Can't report errors...
+ EXAMPLES
+ REVISION LOG
 --------------------------------------------------------------------------*/
-static herr_t
-H5FL_init_interface(void)
+int
+H5FL_term_package(void)
 {
+    int	n = 0;
+
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    /* Nothing currently... */
+    if(H5_PKG_INIT_VAR) {
+        /* Garbage collect any nodes on the free lists */
+        (void)H5FL_garbage_coll();
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5FL_init_interface() */
+        /* Shut down the various kinds of free lists */
+        n += H5FL__reg_term();
+        n += H5FL__fac_term_all();
+        n += H5FL__arr_term();
+        n += H5FL__blk_term();
+
+        /* Mark interface closed */
+        if(0 == n)
+            H5_PKG_INIT_VAR = FALSE;
+    } /* end if */
+
+#ifdef H5FL_TRACK
+    /* If we haven't freed all the allocated memory, dump out the list now */
+    if(n > 0 && H5FL_out_head_g) {
+        H5FL_track_t *trk = H5FL_out_head_g;
+
+        /* Dump information about all the outstanding allocations */
+        while(trk != NULL) {
+            /* Print information about the outstanding block */
+            HDfprintf(stderr,"%s: Outstanding allocation:\n", FUNC);
+            HDfprintf(stderr,"\tPtr: %p, File: %s, Function: %s, Line: %d\n", (((unsigned char *)trk) + sizeof(H5FL_track_t)), trk->file, trk->func, trk->line);
+            H5CS_print_stack(trk->stack, stderr);
+
+            /* Advance to next node */
+            trk = trk->next;
+        } /* end while */
+    } /* end if */
+#endif /* H5FL_TRACK */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* end H5FL_term_package() */
 
 

 /*-------------------------------------------------------------------------
@@ -191,7 +237,7 @@ H5FL_init_interface(void)
 static void *
 H5FL_malloc(size_t mem_size)
 {
-    void *ret_value;   /* return value*/
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -268,8 +314,7 @@ done:
  *
  * Purpose:	Release an object & put on free list
  *
- * Return:	Success:	Non-negative
- * 		Failure:	Negative
+ * Return:	Always returns NULL
  *
  * Programmer:	Quincey Koziol
  *              Friday, March 24, 2000
@@ -297,7 +342,6 @@ H5FL_reg_free(H5FL_reg_head_t *head, void *obj)
 
         /* Free tracking information about the allocation location */
         H5CS_close_stack(trk->stack);
-        trk->stack = H5MM_xfree(trk->stack);
         trk->file = H5MM_xfree(trk->file);
         trk->func = H5MM_xfree(trk->func);
 
@@ -337,12 +381,12 @@ H5FL_reg_free(H5FL_reg_head_t *head, void *obj)
     /* Check for exceeding free list memory use limits */
     /* First check this particular list */
     if(head->onlist * head->size > H5FL_reg_lst_mem_lim)
-        if(H5FL_reg_gc_list(head)<0)
+        if(H5FL__reg_gc_list(head) < 0)
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, NULL, "garbage collection failed during free")
 
     /* Then check the global amount memory on regular free lists */
     if(H5FL_reg_gc_head.mem_freed>H5FL_reg_glb_mem_lim)
-        if(H5FL_reg_gc()<0)
+        if(H5FL__reg_gc() < 0)
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, NULL, "garbage collection failed during free")
 
 done:
@@ -368,7 +412,7 @@ done:
 void *
 H5FL_reg_malloc(H5FL_reg_head_t *head H5FL_TRACK_PARAMS)
 {
-    void *ret_value;        /* Pointer to object to return */
+    void *ret_value = NULL;     /* Pointer to object to return */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -405,8 +449,8 @@ H5FL_reg_malloc(H5FL_reg_head_t *head H5FL_TRACK_PARAMS)
 
 #ifdef H5FL_TRACK
     /* Copy allocation location information */
-    ((H5FL_track_t *)ret_value)->stack = H5MM_calloc(sizeof(H5CS_t));
-    H5CS_copy_stack(((H5FL_track_t *)ret_value)->stack);
+    ((H5FL_track_t *)ret_value)->stack = H5CS_copy_stack();
+    HDassert(((H5FL_track_t *)ret_value)->stack);
     ((H5FL_track_t *)ret_value)->file = H5MM_strdup(call_file);
     ((H5FL_track_t *)ret_value)->func = H5MM_strdup(call_func);
     ((H5FL_track_t *)ret_value)->line = call_line;
@@ -445,7 +489,7 @@ done:
 void *
 H5FL_reg_calloc(H5FL_reg_head_t *head H5FL_TRACK_PARAMS)
 {
-    void *ret_value;        /* Pointer to object to return */
+    void *ret_value = NULL;     /* Pointer to object to return */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -466,7 +510,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FL_reg_gc_list
+ * Function:	H5FL__reg_gc_list
  *
  * Purpose:	Garbage collect on a particular object free list
  *
@@ -476,26 +520,25 @@ done:
  * Programmer:	Quincey Koziol
  *              Tuesday, July 25, 2000
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FL_reg_gc_list(H5FL_reg_head_t *head)
+H5FL__reg_gc_list(H5FL_reg_head_t *head)
 {
     H5FL_reg_node_t *free_list; /* Pointer to nodes in free list being garbage collected */
-    void *tmp;          /* Temporary node pointer */
     size_t total_mem;   /* Total memory used on list */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Calculate the total memory used on this list */
-    total_mem=head->onlist*head->size;
+    total_mem = head->onlist * head->size;
 
     /* For each free list being garbage collected, walk through the nodes and free them */
-    free_list=head->list;
-    while(free_list!=NULL) {
-        tmp=free_list->next;
+    free_list = head->list;
+    while(free_list != NULL) {
+        void *tmp;          /* Temporary node pointer */
+
+        tmp = free_list->next;
 
         /* Decrement the count of nodes allocated and free the node */
         head->allocated--;
@@ -506,18 +549,18 @@ H5FL_reg_gc_list(H5FL_reg_head_t *head)
     } /* end while */
 
     /* Indicate no free nodes on the free list */
-    head->list=NULL;
-    head->onlist=0;
+    head->list = NULL;
+    head->onlist = 0;
 
     /* Decrement global count of free memory on "regular" lists */
-    H5FL_reg_gc_head.mem_freed-=total_mem;
+    H5FL_reg_gc_head.mem_freed -= total_mem;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-}   /* end H5FL_reg_gc_list() */
+}   /* end H5FL__reg_gc_list() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FL_reg_gc
+ * Function:	H5FL__reg_gc
  *
  * Purpose:	Garbage collect on all the object free lists
  *
@@ -534,30 +577,30 @@ H5FL_reg_gc_list(H5FL_reg_head_t *head)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FL_reg_gc(void)
+H5FL__reg_gc(void)
 {
     H5FL_reg_gc_node_t *gc_node;    /* Pointer into the list of things to garbage collect */
-    herr_t ret_value=SUCCEED;   /* return value*/
+    herr_t ret_value = SUCCEED;   /* return value*/
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Walk through all the free lists, free()'ing the nodes */
-    gc_node=H5FL_reg_gc_head.first;
-    while(gc_node!=NULL) {
+    gc_node = H5FL_reg_gc_head.first;
+    while(gc_node != NULL) {
         /* Release the free nodes on the list */
-        if(H5FL_reg_gc_list(gc_node->list)<0)
+        if(H5FL__reg_gc_list(gc_node->list) < 0)
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "garbage collection of list failed")
 
         /* Go on to the next free list to garbage collect */
-        gc_node=gc_node->next;
+        gc_node = gc_node->next;
     } /* end while */
 
     /* Double check that all the memory on the free lists is recycled */
-    HDassert(H5FL_reg_gc_head.mem_freed==0);
+    HDassert(H5FL_reg_gc_head.mem_freed == 0);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-}   /* end H5FL_reg_gc() */
+}   /* end H5FL__reg_gc() */
 
 

 /*--------------------------------------------------------------------------
@@ -566,7 +609,7 @@ done:
  PURPOSE
     Terminate various H5FL object free lists
  USAGE
-    int H5FL_term()
+    int H5FL_reg_term()
  RETURNS
     Success:	Positive if any action might have caused a change in some
                 other interface; zero otherwise.
@@ -586,50 +629,46 @@ done:
         again to reclaim this layer's memory.
 --------------------------------------------------------------------------*/
 static int
-H5FL_reg_term(void)
+H5FL__reg_term(void)
 {
     H5FL_reg_gc_node_t *left;   /* pointer to garbage collection lists with work left */
-    H5FL_reg_gc_node_t *tmp;    /* Temporary pointer to a garbage collection node */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Free the nodes on the garbage collection list, keeping nodes with allocations outstanding */
+    left = NULL;
+    while(H5FL_reg_gc_head.first != NULL) {
+        H5FL_reg_gc_node_t *tmp;    /* Temporary pointer to a garbage collection node */
 
-    if (H5_interface_initialize_g) {
-        /* Free the nodes on the garbage collection list, keeping nodes with allocations outstanding */
-        left=NULL;
-        while(H5FL_reg_gc_head.first!=NULL) {
-            tmp=H5FL_reg_gc_head.first->next;
+        /* Get a copy of the next node */
+        tmp = H5FL_reg_gc_head.first->next;
 
 #ifdef H5FL_DEBUG
-            printf("H5FL_reg_term: head->name=%s, head->allocated=%d\n", H5FL_reg_gc_head.first->list->name,(int)H5FL_reg_gc_head.first->list->allocated);
+printf("%s: head->name = %s, head->allocated = %d\n", FUNC, H5FL_reg_gc_head.first->list->name, (int)H5FL_reg_gc_head.first->list->allocated);
 #endif /* H5FL_DEBUG */
-            /* Check if the list has allocations outstanding */
-            if(H5FL_reg_gc_head.first->list->allocated>0) {
-                /* Add free list to the list of nodes with allocations open still */
-                H5FL_reg_gc_head.first->next=left;
-                left=H5FL_reg_gc_head.first;
-            } /* end if */
-            /* No allocations left open for list, get rid of it */
-            else {
-                /* Reset the "initialized" flag, in case we restart this list somehow (I don't know how..) */
-                H5FL_reg_gc_head.first->list->init=0;
+        /* Check if the list has allocations outstanding */
+        if(H5FL_reg_gc_head.first->list->allocated > 0) {
+            /* Add free list to the list of nodes with allocations open still */
+            H5FL_reg_gc_head.first->next = left;
+            left = H5FL_reg_gc_head.first;
+        } /* end if */
+        /* No allocations left open for list, get rid of it */
+        else {
+            /* Reset the "initialized" flag, in case we restart this list somehow (I don't know how..) */
+            H5FL_reg_gc_head.first->list->init = 0;
 
-                /* Free the node from the garbage collection list */
-                H5MM_xfree(H5FL_reg_gc_head.first);
-            } /* end else */
+            /* Free the node from the garbage collection list */
+            H5MM_xfree(H5FL_reg_gc_head.first);
+        } /* end else */
 
-            H5FL_reg_gc_head.first=tmp;
-        } /* end while */
+        H5FL_reg_gc_head.first = tmp;
+    } /* end while */
 
-        /* Point to the list of nodes left with allocations open, if any */
-        H5FL_reg_gc_head.first=left;
-        if (!left)
-            H5_interface_initialize_g = 0; /*this layer has reached its initial state*/
-    }
+    /* Point to the list of nodes left with allocations open, if any */
+    H5FL_reg_gc_head.first = left;
 
-    /* Terminating this layer never affects other layers; rather, other layers affect
-     * the termination of this layer. */
-    FUNC_LEAVE_NOAPI(0)
-}   /* end H5FL_reg_term() */
+    FUNC_LEAVE_NOAPI(H5FL_reg_gc_head.first != NULL ? 1 : 0)
+}   /* end H5FL__reg_term() */
 
 

 /*-------------------------------------------------------------------------
@@ -654,7 +693,7 @@ H5FL_reg_term(void)
 static H5FL_blk_node_t *
 H5FL_blk_find_list(H5FL_blk_node_t **head, size_t size)
 {
-    H5FL_blk_node_t *temp;  /* Temp. pointer to node in the native list */
+    H5FL_blk_node_t *temp = NULL;  /* Temp. pointer to node in the native list */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -716,7 +755,7 @@ static H5FL_blk_node_t *
 H5FL_blk_create_list(H5FL_blk_node_t **head, size_t size)
 {
     H5FL_blk_node_t *temp;  /* Temp. pointer to node in the list */
-    H5FL_blk_node_t *ret_value;
+    H5FL_blk_node_t *ret_value = NULL;          /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -809,21 +848,20 @@ done:
 htri_t
 H5FL_blk_free_block_avail(H5FL_blk_head_t *head, size_t size)
 {
-    H5FL_blk_node_t *free_list;  /* The free list of nodes of correct size */
-    htri_t ret_value;   /* Return value */
+    H5FL_blk_node_t *free_list; /* The free list of nodes of correct size */
+    htri_t ret_value = FAIL;    /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_NOERR
 
     /* Double check parameters */
     HDassert(head);
 
     /* check if there is a free list for blocks of this size */
     /* and if there are any blocks available on the list */
-    if((free_list=H5FL_blk_find_list(&(head->head),size))!=NULL && free_list->list!=NULL)
-        ret_value=TRUE;
+    if((free_list = H5FL_blk_find_list(&(head->head), size)) != NULL && free_list->list != NULL)
+        ret_value = TRUE;
     else
-        ret_value=FALSE;
-done:
+        ret_value = FALSE;
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5FL_blk_free_block_avail() */
 
@@ -849,9 +887,9 @@ done:
 void *
 H5FL_blk_malloc(H5FL_blk_head_t *head, size_t size H5FL_TRACK_PARAMS)
 {
-    H5FL_blk_node_t *free_list;  /* The free list of nodes of correct size */
-    H5FL_blk_list_t *temp;  /* Temp. ptr to the new native list allocated */
-    void *ret_value;    /* Pointer to the block to return to the user */
+    H5FL_blk_node_t *free_list; /* The free list of nodes of correct size */
+    H5FL_blk_list_t *temp;      /* Temp. ptr to the new native list allocated */
+    void *ret_value = NULL;     /* Pointer to the block to return to the user */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -897,8 +935,8 @@ H5FL_blk_malloc(H5FL_blk_head_t *head, size_t size H5FL_TRACK_PARAMS)
 
 #ifdef H5FL_TRACK
     /* Copy allocation location information */
-    ((H5FL_track_t *)ret_value)->stack = H5MM_calloc(sizeof(H5CS_t));
-    H5CS_copy_stack(((H5FL_track_t *)ret_value)->stack);
+    ((H5FL_track_t *)ret_value)->stack = H5CS_copy_stack();
+    HDassert(((H5FL_track_t *)ret_value)->stack);
     ((H5FL_track_t *)ret_value)->file = H5MM_strdup(call_file);
     ((H5FL_track_t *)ret_value)->func = H5MM_strdup(call_func);
     ((H5FL_track_t *)ret_value)->line = call_line;
@@ -941,7 +979,7 @@ done:
 void *
 H5FL_blk_calloc(H5FL_blk_head_t *head, size_t size H5FL_TRACK_PARAMS)
 {
-    void *ret_value;    /* Pointer to the block to return to the user */
+    void *ret_value = NULL;     /* Pointer to the block to return to the user */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -1001,7 +1039,6 @@ H5FL_blk_free(H5FL_blk_head_t *head, void *block)
 
         /* Free tracking information about the allocation location */
         H5CS_close_stack(trk->stack);
-        trk->stack = H5MM_xfree(trk->stack);
         trk->file = H5MM_xfree(trk->file);
         trk->func = H5MM_xfree(trk->func);
 
@@ -1044,20 +1081,20 @@ H5FL_blk_free(H5FL_blk_head_t *head, void *block)
 
     /* Increment the number of blocks on free list */
     head->onlist++;
-    head->list_mem+=free_size;
+    head->list_mem += free_size;
 
     /* Increment the amount of "block" freed memory globally */
-    H5FL_blk_gc_head.mem_freed+=free_size;
+    H5FL_blk_gc_head.mem_freed += free_size;
 
     /* Check for exceeding free list memory use limits */
     /* First check this particular list */
-    if(head->list_mem>H5FL_blk_lst_mem_lim)
-        if(H5FL_blk_gc_list(head)<0)
+    if(head->list_mem > H5FL_blk_lst_mem_lim)
+        if(H5FL__blk_gc_list(head) < 0)
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, NULL, "garbage collection failed during free")
 
     /* Then check the global amount memory on block free lists */
-    if(H5FL_blk_gc_head.mem_freed>H5FL_blk_glb_mem_lim)
-        if(H5FL_blk_gc()<0)
+    if(H5FL_blk_gc_head.mem_freed > H5FL_blk_glb_mem_lim)
+        if(H5FL__blk_gc() < 0)
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, NULL, "garbage collection failed during free")
 
 done:
@@ -1121,7 +1158,8 @@ H5FL_blk_realloc(H5FL_blk_head_t *head, void *block, size_t new_size H5FL_TRACK_
                 trk->func = H5MM_xfree(trk->func);
 
                 /* Store new tracking information */
-                H5CS_copy_stack(trk->stack);
+                trk->stack = H5CS_copy_stack();
+                HDassert(trk->stack);
                 trk->file = H5MM_strdup(call_file);
                 trk->func = H5MM_strdup(call_func);
                 trk->line = call_line;
@@ -1140,7 +1178,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FL_blk_gc_list
+ * Function:	H5FL__blk_gc_list
  *
  * Purpose:	Garbage collect a priority queue
  *
@@ -1150,34 +1188,33 @@ done:
  * Programmer:	Quincey Koziol
  *              Thursday, March 23, 2000
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FL_blk_gc_list(H5FL_blk_head_t *head)
+H5FL__blk_gc_list(H5FL_blk_head_t *head)
 {
-    H5FL_blk_list_t *list; /* The free list of native nodes of a particular size */
-    void *next;     /* Temp. ptr to the free list list node */
-    void *temp;     /* Temp. ptr to the free list page node */
-
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Loop through all the nodes in the block free list queue */
-    while(head->head!=NULL) {
-        temp=head->head->next;
+    while(head->head != NULL) {
+        H5FL_blk_list_t *list; /* The free list of native nodes of a particular size */
+        void *temp;     /* Temp. ptr to the free list page node */
+
+        temp = head->head->next;
 
         /* Loop through all the blocks in the free list, freeing them */
-        list=head->head->list;
-        while(list!=NULL) {
-            next=list->next;
+        list = head->head->list;
+        while(list != NULL) {
+            void *next;     /* Temp. ptr to the free list list node */
+
+            next = list->next;
 
             /* Decrement the number of blocks & memory allocated from this PQ */
             head->allocated--;
-            head->list_mem-=head->head->size;
+            head->list_mem -= head->head->size;
 
             /* Decrement global count of free memory on "block" lists */
-            H5FL_blk_gc_head.mem_freed-=head->head->size;
+            H5FL_blk_gc_head.mem_freed -= head->head->size;
 
             /* Free the block */
             H5MM_free(list);
@@ -1200,11 +1237,11 @@ H5FL_blk_gc_list(H5FL_blk_head_t *head)
     HDassert(0 == head->list_mem);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-}   /* end H5FL_blk_gc_list() */
+}   /* end H5FL__blk_gc_list() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FL_blk_gc
+ * Function:	H5FL__blk_gc
  *
  * Purpose:	Garbage collect on all the priority queues
  *
@@ -1214,44 +1251,42 @@ H5FL_blk_gc_list(H5FL_blk_head_t *head)
  * Programmer:	Quincey Koziol
  *              Saturday, March 25, 2000
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FL_blk_gc(void)
+H5FL__blk_gc(void)
 {
     H5FL_blk_gc_node_t *gc_node;    /* Pointer into the list of things to garbage collect */
-    herr_t ret_value=SUCCEED;   /* return value*/
+    herr_t ret_value = SUCCEED;   /* return value*/
 
     FUNC_ENTER_NOAPI_NOINIT
 
     /* Walk through all the free lists, free()'ing the nodes */
-    gc_node=H5FL_blk_gc_head.first;
-    while(gc_node!=NULL) {
+    gc_node = H5FL_blk_gc_head.first;
+    while(gc_node != NULL) {
         /* For each free list being garbage collected, walk through the nodes and free them */
-        if(H5FL_blk_gc_list(gc_node->pq)<0)
+        if(H5FL__blk_gc_list(gc_node->pq) < 0)
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "garbage collection of list failed")
 
         /* Go on to the next free list to garbage collect */
-        gc_node=gc_node->next;
+        gc_node = gc_node->next;
     } /* end while */
 
     /* Double check that all the memory on the free lists are recycled */
-    HDassert(H5FL_blk_gc_head.mem_freed==0);
+    HDassert(H5FL_blk_gc_head.mem_freed == 0);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-}   /* end H5FL_blk_gc() */
+}   /* end H5FL__blk_gc() */
 
 

 /*--------------------------------------------------------------------------
  NAME
-    H5FL_blk_term
+    H5FL__blk_term
  PURPOSE
     Terminate various H5FL_blk objects
  USAGE
-    void H5FL_blk_term()
+    void H5FL__blk_term()
  RETURNS
     Success:	Positive if any action might have caused a change in some
                 other interface; zero otherwise.
@@ -1265,45 +1300,46 @@ done:
  REVISION LOG
 --------------------------------------------------------------------------*/
 static int
-H5FL_blk_term(void)
+H5FL__blk_term(void)
 {
     H5FL_blk_gc_node_t *left;   /* pointer to garbage collection lists with work left */
-    H5FL_blk_gc_node_t *tmp;    /* Temporary pointer to a garbage collection node */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Free the nodes on the garbage collection list, keeping nodes with allocations outstanding */
-    left=NULL;
-    while(H5FL_blk_gc_head.first!=NULL) {
-        tmp=H5FL_blk_gc_head.first->next;
+    left = NULL;
+    while(H5FL_blk_gc_head.first != NULL) {
+        H5FL_blk_gc_node_t *tmp;    /* Temporary pointer to a garbage collection node */
+
+        tmp = H5FL_blk_gc_head.first->next;
 
 #ifdef H5FL_DEBUG
-printf("H5FL_blk_term: head->name=%s, head->allocated=%d\n", H5FL_blk_gc_head.first->pq->name,(int)H5FL_blk_gc_head.first->pq->allocated);
+printf("%s: head->name = %s, head->allocated = %d\n", FUNC, H5FL_blk_gc_head.first->pq->name, (int)H5FL_blk_gc_head.first->pq->allocated);
 #endif /* H5FL_DEBUG */
 
         /* Check if the list has allocations outstanding */
-        if(H5FL_blk_gc_head.first->pq->allocated>0) {
+        if(H5FL_blk_gc_head.first->pq->allocated > 0) {
             /* Add free list to the list of nodes with allocations open still */
-            H5FL_blk_gc_head.first->next=left;
-            left=H5FL_blk_gc_head.first;
+            H5FL_blk_gc_head.first->next = left;
+            left = H5FL_blk_gc_head.first;
         } /* end if */
         /* No allocations left open for list, get rid of it */
         else {
             /* Reset the "initialized" flag, in case we restart this list somehow (I don't know how..) */
-            H5FL_blk_gc_head.first->pq->init=0;
+            H5FL_blk_gc_head.first->pq->init = 0;
 
             /* Free the node from the garbage collection list */
             H5MM_free(H5FL_blk_gc_head.first);
         } /* end else */
 
-        H5FL_blk_gc_head.first=tmp;
+        H5FL_blk_gc_head.first = tmp;
     } /* end while */
 
     /* Point to the list of nodes left with allocations open, if any */
-    H5FL_blk_gc_head.first=left;
+    H5FL_blk_gc_head.first = left;
 
-    FUNC_LEAVE_NOAPI(H5FL_blk_gc_head.first!=NULL ? 1 : 0)
-}   /* end H5FL_blk_term() */
+    FUNC_LEAVE_NOAPI(H5FL_blk_gc_head.first != NULL ? 1 : 0)
+}   /* end H5FL__blk_term() */
 
 

 /*-------------------------------------------------------------------------
@@ -1422,13 +1458,13 @@ H5FL_arr_free(H5FL_arr_head_t *head, void *obj)
 
     /* Check for exceeding free list memory use limits */
     /* First check this particular list */
-    if(head->list_mem>H5FL_arr_lst_mem_lim)
-        if(H5FL_arr_gc_list(head)<0)
+    if(head->list_mem > H5FL_arr_lst_mem_lim)
+        if(H5FL__arr_gc_list(head) < 0)
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, NULL, "garbage collection failed during free")
 
     /* Then check the global amount memory on array free lists */
-    if(H5FL_arr_gc_head.mem_freed>H5FL_arr_glb_mem_lim)
-        if(H5FL_arr_gc()<0)
+    if(H5FL_arr_gc_head.mem_freed > H5FL_arr_glb_mem_lim)
+        if(H5FL__arr_gc() < 0)
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, NULL, "garbage collection failed during free")
 
 done:
@@ -1455,8 +1491,8 @@ void *
 H5FL_arr_malloc(H5FL_arr_head_t *head, size_t elem)
 {
     H5FL_arr_list_t *new_obj;   /* Pointer to the new free list node allocated */
-    void *ret_value;        /* Pointer to object to return */
-    size_t mem_size;        /* Size of memory block being recycled */
+    size_t mem_size;            /* Size of memory block being recycled */
+    void *ret_value = NULL;     /* Pointer to the block to return */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -1529,7 +1565,7 @@ done:
 void *
 H5FL_arr_calloc(H5FL_arr_head_t *head, size_t elem)
 {
-    void *ret_value;        /* Pointer to object to return */
+    void *ret_value = NULL;     /* Pointer to the block to return */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -1567,51 +1603,50 @@ done:
 void *
 H5FL_arr_realloc(H5FL_arr_head_t *head, void * obj, size_t new_elem)
 {
-    void *ret_value;        /* Pointer to object to return */
+    void *ret_value = NULL;     /* Pointer to the block to return */
 
-    FUNC_ENTER_NOAPI(NULL)
+    FUNC_ENTER_NOAPI_NOERR
 
     /* Double check parameters */
     HDassert(head);
     HDassert(new_elem);
 
     /* Check if we are really allocating the object */
-    if(obj==NULL)
-        ret_value=H5FL_arr_malloc(head,new_elem);
+    if(obj == NULL)
+        ret_value = H5FL_arr_malloc(head, new_elem);
     else {
         H5FL_arr_list_t *temp;  /* Temp. ptr to the new free list node allocated */
 
         /* Sanity check that the number of elements is supported */
-        HDassert((int)new_elem<=head->maxelem);
+        HDassert((int)new_elem <= head->maxelem);
 
         /* Get the pointer to the info header in front of the block to free */
-        temp=(H5FL_arr_list_t *)((unsigned char *)obj-sizeof(H5FL_arr_list_t)); /*lint !e826 Pointer-to-pointer cast is appropriate here */
+        temp = (H5FL_arr_list_t *)((unsigned char *)obj - sizeof(H5FL_arr_list_t)); /*lint !e826 Pointer-to-pointer cast is appropriate here */
 
         /* Check if the size is really changing */
-        if(temp->nelem!=new_elem) {
+        if(temp->nelem != new_elem) {
             size_t blk_size;       /* Size of block */
 
             /* Get the new array of objects */
-            ret_value=H5FL_arr_malloc(head,new_elem);
+            ret_value = H5FL_arr_malloc(head, new_elem);
 
             /* Copy the appropriate amount of elements */
-            blk_size = head->list_arr[ MIN(temp->nelem, new_elem) ].size;
-            HDmemcpy(ret_value,obj,blk_size);
+            blk_size = head->list_arr[MIN(temp->nelem, new_elem)].size;
+            HDmemcpy(ret_value, obj, blk_size);
 
             /* Free the old block */
-            H5FL_arr_free(head,obj);
+            H5FL_arr_free(head, obj);
         } /* end if */
         else
-            ret_value=obj;
+            ret_value = obj;
     } /* end else */
 
-done:
     FUNC_LEAVE_NOAPI(ret_value)
 }   /* end H5FL_arr_realloc() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FL_arr_gc_list
+ * Function:	H5FL__arr_gc_list
  *
  * Purpose:	Garbage collect on an array object free list
  *
@@ -1621,29 +1656,29 @@ done:
  * Programmer:	Quincey Koziol
  *              Tuesday, July 25, 2000
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FL_arr_gc_list(H5FL_arr_head_t *head)
+H5FL__arr_gc_list(H5FL_arr_head_t *head)
 {
-    H5FL_arr_list_t *arr_free_list; /* Pointer to nodes in free list being garbage collected */
-    void *tmp;      /* Temporary node pointer */
     unsigned u;     /* Counter for array of free lists */
-    size_t total_mem;   /* Total memory used on list */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Walk through the array of free lists */
-    for(u=0; u<(unsigned)head->maxelem; u++) {
-        if(head->list_arr[u].onlist>0) {
+    for(u = 0; u < (unsigned)head->maxelem; u++) {
+        if(head->list_arr[u].onlist > 0) {
+            H5FL_arr_list_t *arr_free_list; /* Pointer to nodes in free list being garbage collected */
+            size_t total_mem;   /* Total memory used on list */
+
             /* Calculate the total memory used on this list */
-            total_mem=head->list_arr[u].onlist*head->list_arr[u].size;
+            total_mem = head->list_arr[u].onlist * head->list_arr[u].size;
 
             /* For each free list being garbage collected, walk through the nodes and free them */
-            arr_free_list=head->list_arr[u].list;
-            while(arr_free_list!=NULL) {
+            arr_free_list = head->list_arr[u].list;
+            while(arr_free_list != NULL) {
+                void *tmp;      /* Temporary node pointer */
+
                 tmp = arr_free_list->next;
 
                 /* Decrement the count of nodes allocated and free the node */
@@ -1658,22 +1693,22 @@ H5FL_arr_gc_list(H5FL_arr_head_t *head)
             head->list_arr[u].onlist = 0;
 
             /* Decrement count of free memory on this "array" list */
-            head->list_mem-=total_mem;
+            head->list_mem -= total_mem;
 
             /* Decrement global count of free memory on "array" lists */
-            H5FL_arr_gc_head.mem_freed-=total_mem;
+            H5FL_arr_gc_head.mem_freed -= total_mem;
         } /* end if */
     } /* end for */
 
     /* Double check that all the memory on this list is recycled */
-    HDassert(head->list_mem==0);
+    HDassert(head->list_mem == 0);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-}   /* end H5FL_arr_gc_list() */
+}   /* end H5FL__arr_gc_list() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FL_arr_gc
+ * Function:	H5FL__arr_gc
  *
  * Purpose:	Garbage collect on all the array object free lists
  *
@@ -1683,44 +1718,42 @@ H5FL_arr_gc_list(H5FL_arr_head_t *head)
  * Programmer:	Quincey Koziol
  *              Saturday, March 25, 2000
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FL_arr_gc(void)
+H5FL__arr_gc(void)
 {
     H5FL_gc_arr_node_t *gc_arr_node;    /* Pointer into the list of things to garbage collect */
-    herr_t ret_value=SUCCEED;   /* return value*/
+    herr_t ret_value = SUCCEED;   /* return value*/
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Walk through all the free lists, free()'ing the nodes */
-    gc_arr_node=H5FL_arr_gc_head.first;
-    while(gc_arr_node!=NULL) {
+    gc_arr_node = H5FL_arr_gc_head.first;
+    while(gc_arr_node != NULL) {
         /* Release the free nodes on the list */
-        if(H5FL_arr_gc_list(gc_arr_node->list)<0)
+        if(H5FL__arr_gc_list(gc_arr_node->list) < 0)
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "garbage collection of list failed")
 
         /* Go on to the next free list to garbage collect */
-        gc_arr_node=gc_arr_node->next;
+        gc_arr_node = gc_arr_node->next;
     } /* end while */
 
     /* Double check that all the memory on the free lists are recycled */
-    HDassert(H5FL_arr_gc_head.mem_freed==0);
+    HDassert(H5FL_arr_gc_head.mem_freed == 0);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-}   /* end H5FL_arr_gc() */
+}   /* end H5FL__arr_gc() */
 
 

 /*--------------------------------------------------------------------------
  NAME
-    H5FL_arr_term
+    H5FL__arr_term
  PURPOSE
     Terminate various H5FL array object free lists
  USAGE
-    int H5FL_arr_term()
+    int H5FL__arr_term()
  RETURNS
     Success:	Positive if any action might have caused a change in some
                 other interface; zero otherwise.
@@ -1734,26 +1767,27 @@ done:
  REVISION LOG
 --------------------------------------------------------------------------*/
 static int
-H5FL_arr_term(void)
+H5FL__arr_term(void)
 {
     H5FL_gc_arr_node_t *left;   /* pointer to garbage collection lists with work left */
-    H5FL_gc_arr_node_t *tmp;    /* Temporary pointer to a garbage collection node */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Free the nodes on the garbage collection list, keeping nodes with allocations outstanding */
-    left=NULL;
-    while(H5FL_arr_gc_head.first!=NULL) {
-        tmp=H5FL_arr_gc_head.first->next;
+    left = NULL;
+    while(H5FL_arr_gc_head.first != NULL) {
+        H5FL_gc_arr_node_t *tmp;    /* Temporary pointer to a garbage collection node */
+
+        tmp = H5FL_arr_gc_head.first->next;
 
         /* Check if the list has allocations outstanding */
 #ifdef H5FL_DEBUG
-printf("H5FL_arr_term: head->name=%s, head->allocated=%d\n", H5FL_arr_gc_head.first->list->name,(int)H5FL_arr_gc_head.first->list->allocated);
+printf("%s: head->name = %s, head->allocated = %d\n", FUNC, H5FL_arr_gc_head.first->list->name, (int)H5FL_arr_gc_head.first->list->allocated);
 #endif /* H5FL_DEBUG */
-        if(H5FL_arr_gc_head.first->list->allocated>0) {
+        if(H5FL_arr_gc_head.first->list->allocated > 0) {
             /* Add free list to the list of nodes with allocations open still */
-            H5FL_arr_gc_head.first->next=left;
-            left=H5FL_arr_gc_head.first;
+            H5FL_arr_gc_head.first->next = left;
+            left = H5FL_arr_gc_head.first;
         } /* end if */
         /* No allocations left open for list, get rid of it */
         else {
@@ -1761,20 +1795,20 @@ printf("H5FL_arr_term: head->name=%s, head->allocated=%d\n", H5FL_arr_gc_head.fi
             H5MM_xfree(H5FL_arr_gc_head.first->list->list_arr);
 
             /* Reset the "initialized" flag, in case we restart this list somehow (I don't know how..) */
-            H5FL_arr_gc_head.first->list->init=0;
+            H5FL_arr_gc_head.first->list->init = 0;
 
             /* Free the node from the garbage collection list */
             H5MM_free(H5FL_arr_gc_head.first);
         } /* end else */
 
-        H5FL_arr_gc_head.first=tmp;
+        H5FL_arr_gc_head.first = tmp;
     } /* end while */
 
     /* Point to the list of nodes left with allocations open, if any */
-    H5FL_arr_gc_head.first=left;
+    H5FL_arr_gc_head.first = left;
 
-    FUNC_LEAVE_NOAPI(H5FL_arr_gc_head.first!=NULL ? 1 : 0)
-}   /* end H5FL_arr_term() */
+    FUNC_LEAVE_NOAPI(H5FL_arr_gc_head.first != NULL ? 1 : 0)
+}   /* end H5FL__arr_term() */
 
 

 /*-------------------------------------------------------------------------
@@ -1831,18 +1865,17 @@ H5FL_seq_free(H5FL_seq_head_t *head, void *obj)
 void *
 H5FL_seq_malloc(H5FL_seq_head_t *head, size_t elem H5FL_TRACK_PARAMS)
 {
-    void *ret_value;        /* Pointer to object to return */
+    void *ret_value = NULL;     /* Pointer to the block to return */
 
-    FUNC_ENTER_NOAPI(NULL)
+    FUNC_ENTER_NOAPI_NOERR
 
     /* Double check parameters */
     HDassert(head);
     HDassert(elem);
 
     /* Use block routine */
-    ret_value=H5FL_blk_malloc(&(head->queue),head->size*elem H5FL_TRACK_INFO_INT);
+    ret_value = H5FL_blk_malloc(&(head->queue), head->size * elem H5FL_TRACK_INFO_INT);
 
-done:
     FUNC_LEAVE_NOAPI(ret_value)
 }   /* end H5FL_seq_malloc() */
 
@@ -1865,18 +1898,17 @@ done:
 void *
 H5FL_seq_calloc(H5FL_seq_head_t *head, size_t elem H5FL_TRACK_PARAMS)
 {
-    void *ret_value;        /* Pointer to object to return */
+    void *ret_value = NULL;     /* Pointer to the block to return */
 
-    FUNC_ENTER_NOAPI(NULL)
+    FUNC_ENTER_NOAPI_NOERR
 
     /* Double check parameters */
     HDassert(head);
     HDassert(elem);
 
     /* Use block routine */
-    ret_value=H5FL_blk_calloc(&(head->queue),head->size*elem H5FL_TRACK_INFO_INT);
+    ret_value = H5FL_blk_calloc(&(head->queue), head->size * elem H5FL_TRACK_INFO_INT);
 
-done:
     FUNC_LEAVE_NOAPI(ret_value)
 }   /* end H5FL_seq_calloc() */
 
@@ -1899,18 +1931,17 @@ done:
 void *
 H5FL_seq_realloc(H5FL_seq_head_t *head, void * obj, size_t new_elem H5FL_TRACK_PARAMS)
 {
-    void *ret_value;        /* Pointer to object to return */
+    void *ret_value = NULL;     /* Pointer to the block to return */
 
-    FUNC_ENTER_NOAPI(NULL)
+    FUNC_ENTER_NOAPI_NOERR
 
     /* Double check parameters */
     HDassert(head);
     HDassert(new_elem);
 
     /* Use block routine */
-    ret_value=H5FL_blk_realloc(&(head->queue),obj,head->size*new_elem H5FL_TRACK_INFO_INT);
+    ret_value = H5FL_blk_realloc(&(head->queue), obj, head->size * new_elem H5FL_TRACK_INFO_INT);
 
-done:
     FUNC_LEAVE_NOAPI(ret_value)
 }   /* end H5FL_seq_realloc() */
 
@@ -1936,9 +1967,9 @@ done:
 H5FL_fac_head_t *
 H5FL_fac_init(size_t size)
 {
-    H5FL_fac_gc_node_t  *new_node = NULL; /* Pointer to the node for the new list to garbage collect */
-    H5FL_fac_head_t     *factory = NULL; /* Pointer to new block factory */
-    H5FL_fac_head_t     *ret_value;     /* Return value */
+    H5FL_fac_gc_node_t  *new_node = NULL;       /* Pointer to the node for the new list to garbage collect */
+    H5FL_fac_head_t     *factory = NULL;        /* Pointer to new block factory */
+    H5FL_fac_head_t     *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -2013,7 +2044,7 @@ done:
 void *
 H5FL_fac_free(H5FL_fac_head_t *head, void *obj)
 {
-    void *ret_value=NULL;       /* Return value */
+    void *ret_value = NULL;       /* Return value */
 
     /* NOINIT OK here because this must be called after H5FL_fac_init -NAF */
     FUNC_ENTER_NOAPI_NOINIT
@@ -2028,7 +2059,6 @@ H5FL_fac_free(H5FL_fac_head_t *head, void *obj)
 
         /* Free tracking information about the allocation location */
         H5CS_close_stack(trk->stack);
-        trk->stack = H5MM_xfree(trk->stack);
         trk->file = H5MM_xfree(trk->file);
         trk->func = H5MM_xfree(trk->func);
 
@@ -2054,26 +2084,26 @@ H5FL_fac_free(H5FL_fac_head_t *head, void *obj)
     HDassert(head->init);
 
     /* Link into the free list */
-    ((H5FL_fac_node_t *)obj)->next=head->list;
+    ((H5FL_fac_node_t *)obj)->next = head->list;
 
     /* Point free list at the node freed */
-    head->list=(H5FL_fac_node_t *)obj;
+    head->list = (H5FL_fac_node_t *)obj;
 
     /* Increment the number of blocks on free list */
     head->onlist++;
 
     /* Increment the amount of "factory" freed memory globally */
-    H5FL_fac_gc_head.mem_freed+=head->size;
+    H5FL_fac_gc_head.mem_freed += head->size;
 
     /* Check for exceeding free list memory use limits */
     /* First check this particular list */
     if(head->onlist * head->size > H5FL_fac_lst_mem_lim)
-        if(H5FL_fac_gc_list(head)<0)
+        if(H5FL__fac_gc_list(head) < 0)
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, NULL, "garbage collection failed during free")
 
     /* Then check the global amount memory on factory free lists */
     if(H5FL_fac_gc_head.mem_freed > H5FL_fac_glb_mem_lim)
-        if(H5FL_fac_gc()<0)
+        if(H5FL__fac_gc() < 0)
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, NULL, "garbage collection failed during free")
 
 done:
@@ -2102,7 +2132,7 @@ done:
 void *
 H5FL_fac_malloc(H5FL_fac_head_t *head H5FL_TRACK_PARAMS)
 {
-    void *ret_value;        /* Pointer to object to return */
+    void *ret_value = NULL;     /* Pointer to the block to return */
 
     /* NOINIT OK here because this must be called after H5FL_fac_init -NAF */
     FUNC_ENTER_NOAPI_NOINIT
@@ -2136,8 +2166,8 @@ H5FL_fac_malloc(H5FL_fac_head_t *head H5FL_TRACK_PARAMS)
 
 #ifdef H5FL_TRACK
     /* Copy allocation location information */
-    ((H5FL_track_t *)ret_value)->stack = H5MM_calloc(sizeof(H5CS_t));
-    H5CS_copy_stack(((H5FL_track_t *)ret_value)->stack);
+    ((H5FL_track_t *)ret_value)->stack = H5CS_copy_stack();
+    HDassert(((H5FL_track_t *)ret_value)->stack);
     ((H5FL_track_t *)ret_value)->file = H5MM_strdup(call_file);
     ((H5FL_track_t *)ret_value)->func = H5MM_strdup(call_func);
     ((H5FL_track_t *)ret_value)->line = call_line;
@@ -2179,7 +2209,7 @@ done:
 void *
 H5FL_fac_calloc(H5FL_fac_head_t *head H5FL_TRACK_PARAMS)
 {
-    void *ret_value;        /* Pointer to object to return */
+    void *ret_value = NULL;     /* Pointer to the block to return */
 
     /* NOINIT OK here because this must be called after H5FL_fac_init -NAF */
     FUNC_ENTER_NOAPI_NOINIT
@@ -2198,9 +2228,10 @@ H5FL_fac_calloc(H5FL_fac_head_t *head H5FL_TRACK_PARAMS)
 done:
     FUNC_LEAVE_NOAPI(ret_value)
 }   /* end H5FL_fac_calloc() */
+
 

 /*-------------------------------------------------------------------------
- * Function:	H5FL_fac_gc_list
+ * Function:	H5FL__fac_gc_list
  *
  * Purpose:	Garbage collect on a particular factory free list
  *
@@ -2210,26 +2241,25 @@ done:
  * Programmer:	Neil Fortner
  *              Friday, December 19, 2008
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FL_fac_gc_list(H5FL_fac_head_t *head)
+H5FL__fac_gc_list(H5FL_fac_head_t *head)
 {
     H5FL_fac_node_t *free_list; /* Pointer to nodes in free list being garbage collected */
-    void *tmp;          /* Temporary node pointer */
     size_t total_mem;   /* Total memory used on list */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Calculate the total memory used on this list */
-    total_mem=head->onlist*head->size;
+    total_mem = head->onlist * head->size;
 
     /* For each free list being garbage collected, walk through the nodes and free them */
-    free_list=head->list;
-    while(free_list!=NULL) {
-        tmp=free_list->next;
+    free_list = head->list;
+    while(free_list != NULL) {
+        void *tmp;          /* Temporary node pointer */
+
+        tmp = free_list->next;
 
         /* Decrement the count of nodes allocated and free the node */
         head->allocated--;
@@ -2240,18 +2270,18 @@ H5FL_fac_gc_list(H5FL_fac_head_t *head)
     } /* end while */
 
     /* Indicate no free nodes on the free list */
-    head->list=NULL;
-    head->onlist=0;
+    head->list = NULL;
+    head->onlist = 0;
 
     /* Decrement global count of free memory on "factory" lists */
-    H5FL_fac_gc_head.mem_freed-=total_mem;
+    H5FL_fac_gc_head.mem_freed -= total_mem;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-}   /* end H5FL_fac_gc_list() */
+}   /* end H5FL__fac_gc_list() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FL_fac_gc
+ * Function:	H5FL__fac_gc
  *
  * Purpose:	Garbage collect on all the factory free lists
  *
@@ -2261,35 +2291,33 @@ H5FL_fac_gc_list(H5FL_fac_head_t *head)
  * Programmer:	Neil Fortner
  *              Friday, December 19, 2008
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FL_fac_gc(void)
+H5FL__fac_gc(void)
 {
     H5FL_fac_gc_node_t *gc_node;    /* Pointer into the list of things to garbage collect */
-    herr_t ret_value=SUCCEED;   /* return value*/
+    herr_t ret_value = SUCCEED;   /* return value*/
 
     FUNC_ENTER_NOAPI_NOINIT
 
     /* Walk through all the free lists, free()'ing the nodes */
-    gc_node=H5FL_fac_gc_head.first;
-    while(gc_node!=NULL) {
+    gc_node = H5FL_fac_gc_head.first;
+    while(gc_node != NULL) {
         /* Release the free nodes on the list */
-        if(H5FL_fac_gc_list(gc_node->list)<0)
+        if(H5FL__fac_gc_list(gc_node->list) < 0)
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "garbage collection of list failed")
 
         /* Go on to the next free list to garbage collect */
-        gc_node=gc_node->next;
+        gc_node = gc_node->next;
     } /* end while */
 
     /* Double check that all the memory on the free lists is recycled */
-    HDassert(H5FL_fac_gc_head.mem_freed==0);
+    HDassert(H5FL_fac_gc_head.mem_freed == 0);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-}   /* end H5FL_fac_gc() */
+}   /* end H5FL__fac_gc() */
 
 

 /*-------------------------------------------------------------------------
@@ -2323,11 +2351,11 @@ H5FL_fac_term(H5FL_fac_head_t *factory)
     HDassert(factory);
 
     /* Garbage collect all the blocks in the factory's free list */
-    if(H5FL_fac_gc_list(factory)<0)
+    if(H5FL__fac_gc_list(factory) < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "garbage collection of factory failed")
 
     /* Verify that all the blocks have been freed */
-    if(factory->allocated>0)
+    if(factory->allocated > 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "factory still has objects allocated")
 
     /* Unlink block free list for factory from global free list */
@@ -2358,7 +2386,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FL_fac_term_all
+ * Function:	H5FL__fac_term_all
  *
  * Purpose:	Terminate all block factories
  *
@@ -2368,23 +2396,21 @@ done:
  * Programmer:	Neil Fortner
  *              Friday, December 19, 2008
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static int
-H5FL_fac_term_all(void)
+H5FL__fac_term_all(void)
 {
-    H5FL_fac_gc_node_t *tmp;    /* Temporary pointer to a garbage collection node */
-
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Free the nodes on the garbage collection list */
     while(H5FL_fac_gc_head.first != NULL) {
-        tmp=H5FL_fac_gc_head.first->next;
+        H5FL_fac_gc_node_t *tmp;    /* Temporary pointer to a garbage collection node */
+
+        tmp = H5FL_fac_gc_head.first->next;
 
 #ifdef H5FL_DEBUG
-printf("H5FL_fac_term: head->size=%d, head->allocated=%d\n", (int)H5FL_fac_gc_head.first->list->size,(int)H5FL_fac_gc_head.first->list->allocated);
+printf("%s: head->size = %d, head->allocated = %d\n", FUNC, (int)H5FL_fac_gc_head.first->list->size, (int)H5FL_fac_gc_head.first->list->allocated);
 #endif /* H5FL_DEBUG */
 
         /* The list cannot have any allocations outstanding */
@@ -2400,7 +2426,7 @@ printf("H5FL_fac_term: head->size=%d, head->allocated=%d\n", (int)H5FL_fac_gc_he
     } /* end while */
 
     FUNC_LEAVE_NOAPI(0)
-}   /* end H5FL_fac_term_all() */
+}   /* end H5FL__fac_term_all() */
 
 

 /*-------------------------------------------------------------------------
@@ -2426,20 +2452,20 @@ H5FL_garbage_coll(void)
     FUNC_ENTER_NOAPI(FAIL)
 
     /* Garbage collect the free lists for array objects */
-    if(H5FL_arr_gc()<0)
+    if(H5FL__arr_gc() < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "can't garbage collect array objects")
 
     /* Garbage collect free lists for blocks */
-    if(H5FL_blk_gc()<0)
+    if(H5FL__blk_gc() < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "can't garbage collect block objects")
 
     /* Garbage collect the free lists for regular objects */
-    if(H5FL_reg_gc()<0)
+    if(H5FL__reg_gc() < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "can't garbage collect regular objects")
 
     /* Garbage collect the free lists for factory objects */
-    if(H5FL_fac_gc()<0)
-        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "can't garbage collect regular objects")
+    if(H5FL__fac_gc() < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGC, FAIL, "can't garbage collect factory objects")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -2482,82 +2508,28 @@ H5FL_set_free_list_limits(int reg_global_lim, int reg_list_lim, int arr_global_l
     int arr_list_lim, int blk_global_lim, int blk_list_lim, int fac_global_lim,
     int fac_list_lim)
 {
-    herr_t                  ret_value = SUCCEED;
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_NOERR
 
     /* Set the limit variables */
     /* limit on all regular free lists */
-    H5FL_reg_glb_mem_lim=(reg_global_lim==-1 ? UINT_MAX : (size_t)reg_global_lim);
+    H5FL_reg_glb_mem_lim = (reg_global_lim == -1 ? UINT_MAX : (size_t)reg_global_lim);
     /* limit on each regular free list */
-    H5FL_reg_lst_mem_lim=(reg_list_lim==-1 ? UINT_MAX : (size_t)reg_list_lim);
+    H5FL_reg_lst_mem_lim = (reg_list_lim == -1 ? UINT_MAX : (size_t)reg_list_lim);
     /* limit on all array free lists */
-    H5FL_arr_glb_mem_lim=(arr_global_lim==-1 ? UINT_MAX : (size_t)arr_global_lim);
+    H5FL_arr_glb_mem_lim = (arr_global_lim == -1 ? UINT_MAX : (size_t)arr_global_lim);
     /* limit on each array free list */
-    H5FL_arr_lst_mem_lim=(arr_list_lim==-1 ? UINT_MAX : (size_t)arr_list_lim);
+    H5FL_arr_lst_mem_lim = (arr_list_lim == -1 ? UINT_MAX : (size_t)arr_list_lim);
     /* limit on all block free lists */
-    H5FL_blk_glb_mem_lim=(blk_global_lim==-1 ? UINT_MAX : (size_t)blk_global_lim);
+    H5FL_blk_glb_mem_lim = (blk_global_lim == -1 ? UINT_MAX : (size_t)blk_global_lim);
     /* limit on each block free list */
-    H5FL_blk_lst_mem_lim=(blk_list_lim==-1 ? UINT_MAX : (size_t)blk_list_lim);
+    H5FL_blk_lst_mem_lim = (blk_list_lim == -1 ? UINT_MAX : (size_t)blk_list_lim);
     /* limit on all factory free lists */
-    H5FL_fac_glb_mem_lim=(fac_global_lim==-1 ? UINT_MAX : (size_t)fac_global_lim);
+    H5FL_fac_glb_mem_lim = (fac_global_lim == -1 ? UINT_MAX : (size_t)fac_global_lim);
     /* limit on each factory free list */
-    H5FL_fac_lst_mem_lim=(fac_list_lim==-1 ? UINT_MAX : (size_t)fac_list_lim);
+    H5FL_fac_lst_mem_lim = (fac_list_lim == -1 ? UINT_MAX : (size_t)fac_list_lim);
 
-done:
     FUNC_LEAVE_NOAPI(ret_value)
 }   /* end H5FL_set_free_list_limits() */
 
-

-/*--------------------------------------------------------------------------
- NAME
-    H5FL_term_interface
- PURPOSE
-    Terminate various H5FL objects
- USAGE
-    void H5FL_term_interface()
- RETURNS
-    Success:	Positive if any action might have caused a change in some
-                other interface; zero otherwise.
-   	Failure:	Negative
- DESCRIPTION
-    Release any resources allocated.
- GLOBAL VARIABLES
- COMMENTS, BUGS, ASSUMPTIONS
-     Can't report errors...
- EXAMPLES
- REVISION LOG
---------------------------------------------------------------------------*/
-int
-H5FL_term_interface(void)
-{
-    int ret_value=0;
-
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    /* Garbage collect any nodes on the free lists */
-    (void)H5FL_garbage_coll();
-
-    ret_value=H5FL_reg_term()+H5FL_fac_term_all()+H5FL_arr_term()+H5FL_blk_term();
-
-#ifdef H5FL_TRACK
-    /* If we haven't freed all the allocated memory, dump out the list now */
-    if(ret_value > 0 && H5FL_out_head_g) {
-        H5FL_track_t *trk = H5FL_out_head_g;
-
-        /* Dump information about all the outstanding allocations */
-        while(trk != NULL) {
-            /* Print information about the outstanding block */
-            HDfprintf(stderr,"%s: Outstanding allocation:\n", "H5FL_term_interface");
-            HDfprintf(stderr,"\tFile: %s, Function: %s, Line: %d\n", trk->file, trk->func, trk->line);
-            H5CS_print_stack(trk->stack, stderr);
-
-            /* Advance to next node */
-            trk = trk->next;
-        } /* end while */
-    } /* end if */
-#endif /* H5FL_TRACK */
-
-    FUNC_LEAVE_NOAPI(ret_value)
-}
-
diff --git a/src/H5FLmodule.h b/src/H5FLmodule.h
new file mode 100644
index 0000000..cfa585c
--- /dev/null
+++ b/src/H5FLmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5FL package.  Including this header means that the source file
+ *		is part of the H5FL package.
+ */
+#ifndef _H5FLmodule_H
+#define _H5FLmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5FL_MODULE
+#define H5_MY_PKG       H5FL
+#define H5_MY_PKG_ERR   H5E_RESOURCE
+#define H5_MY_PKG_INIT  NO
+
+#endif /* _H5FLmodule_H */
+
diff --git a/src/H5FLprivate.h b/src/H5FLprivate.h
index 72c6b55..3cd30a6 100644
--- a/src/H5FLprivate.h
+++ b/src/H5FLprivate.h
@@ -330,7 +330,7 @@ typedef struct H5FL_seq_head_t {
 #define H5FL_SEQ_CALLOC(t,elem) (t *)H5FL_seq_calloc(&(H5FL_SEQ_NAME(t)),elem H5FL_TRACK_INFO)
 
 /* Free a sequence of type 't' */
-#define H5FL_SEQ_FREE(t,obj) H5FL_seq_free(&(H5FL_SEQ_NAME(t)),obj)
+#define H5FL_SEQ_FREE(t,obj) (t *)H5FL_seq_free(&(H5FL_SEQ_NAME(t)),obj)
 
 /* Re-allocate a sequence of type 't' */
 #define H5FL_SEQ_REALLOC(t,obj,new_elem) (t *)H5FL_seq_realloc(&(H5FL_SEQ_NAME(t)),obj,new_elem H5FL_TRACK_INFO)
diff --git a/src/H5FO.c b/src/H5FO.c
index a6c47cb..a77e268 100644
--- a/src/H5FO.c
+++ b/src/H5FO.c
@@ -21,7 +21,7 @@
  *
  */
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
 
 
 #include "H5Eprivate.h"		/* Error handling		  	*/
diff --git a/src/H5FS.c b/src/H5FS.c
index 38a5a77..bb45c75 100644
--- a/src/H5FS.c
+++ b/src/H5FS.c
@@ -14,12 +14,12 @@
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
- * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ * Programmer:  Quincey Koziol <koziol at hdfgroup.org>
  *              Tuesday, May  2, 2006
  *
- * Purpose:	Free space tracking functions.
+ * Purpose:     Free space tracking functions.
  *
- * Note:	(Used to be in the H5HFflist.c file, prior to the date above)
+ * Note:        (Used to be in the H5HFflist.c file, prior to the date above)
  *
  */
 
@@ -27,16 +27,18 @@
 /* Module Setup */
 /****************/
 
-#define H5FS_PACKAGE		/*suppress error about including H5FSpkg  */
+#include "H5FSmodule.h"         /* This source code file is part of the H5FS module */
+
 
 /***********/
 /* Headers */
 /***********/
-#include "H5private.h"		/* Generic Functions			*/
-#include "H5ACprivate.h"        /* Metadata cache                       */
-#include "H5Eprivate.h"		/* Error handling		  	*/
-#include "H5FSpkg.h"		/* File free space			*/
-#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5private.h"      /* Generic Functions                        */
+#include "H5ACprivate.h"    /* Metadata cache                           */
+#include "H5Eprivate.h"     /* Error handling                           */
+#include "H5FSpkg.h"        /* File free space                          */
+#include "H5MFprivate.h"    /* File memory management                   */
+
 
 /****************/
 /* Local Macros */
@@ -66,6 +68,9 @@ static herr_t H5FS_sinfo_free_node_cb(void *item, void *key, void *op_data);
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 /* Declare a free list to manage the H5FS_section_class_t sequence information */
 H5FL_SEQ_DEFINE(H5FS_section_class_t);
 
@@ -85,31 +90,26 @@ H5FL_DEFINE(H5FS_t);
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_create
- *
- * Purpose:	Allocate & initialize file free space info
+ * Function:    H5FS_create
  *
- * Return:	Success:	Pointer to free space structure
+ * Purpose:     Allocate & initialize file free space info
  *
- *		Failure:	NULL
+ * Return:      Success:    Pointer to free space structure
+ *              Failure:    NULL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Tuesday, March  7, 2006
  *
- * Modifications:
- *	Vailin Choi, July 29th, 2008
- *	  Add two more parameters for handling alignment: alignment & threshhold
- *
  *-------------------------------------------------------------------------
  */
 H5FS_t *
 H5FS_create(H5F_t *f, hid_t dxpl_id, haddr_t *fs_addr, const H5FS_create_t *fs_create,
-    size_t nclasses, const H5FS_section_class_t *classes[], void *cls_init_udata, hsize_t alignment, hsize_t threshold)
+    uint16_t nclasses, const H5FS_section_class_t *classes[], void *cls_init_udata, hsize_t alignment, hsize_t threshold)
 {
     H5FS_t *fspace = NULL;      /* New free space structure */
-    H5FS_t *ret_value;          /* Return value */
+    H5FS_t *ret_value = NULL;   /* Return value */
 
-    FUNC_ENTER_NOAPI(NULL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, NULL)
 #ifdef H5FS_DEBUG
 HDfprintf(stderr, "%s: Creating free space manager, nclasses = %Zu\n", FUNC, nclasses);
 #endif /* H5FS_DEBUG */
@@ -123,8 +123,8 @@ HDfprintf(stderr, "%s: Creating free space manager, nclasses = %Zu\n", FUNC, ncl
     /*
      * Allocate free space structure
      */
-    if(NULL == (fspace = H5FS_new(f, nclasses, classes, cls_init_udata)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for free space free list")
+    if(NULL == (fspace = H5FS__new(f, nclasses, classes, cls_init_udata)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for free space free list")
 
     /* Initialize creation information for free space manager */
     fspace->client = fs_create->client;
@@ -132,6 +132,7 @@ HDfprintf(stderr, "%s: Creating free space manager, nclasses = %Zu\n", FUNC, ncl
     fspace->expand_percent = fs_create->expand_percent;
     fspace->max_sect_addr = fs_create->max_sect_addr;
     fspace->max_sect_size = fs_create->max_sect_size;
+    fspace->swmr_write = (H5F_INTENT(f) & H5F_ACC_SWMR_WRITE) > 0;
 
     fspace->alignment = alignment;
     fspace->threshold = threshold;
@@ -161,44 +162,38 @@ HDfprintf(stderr, "%s: fspace = %p, fspace->addr = %a\n", FUNC, fspace, fspace->
 
 done:
     if(!ret_value && fspace)
-        if(H5FS_hdr_dest(fspace) < 0)
+        if(H5FS__hdr_dest(fspace) < 0)
             HDONE_ERROR(H5E_FSPACE, H5E_CANTFREE, NULL, "unable to destroy free space header")
 
 #ifdef H5FS_DEBUG
 HDfprintf(stderr, "%s: Leaving, ret_value = %d\n", FUNC, ret_value);
 #endif /* H5FS_DEBUG */
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, NULL)
 } /* H5FS_create() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_open
+ * Function:    H5FS_open
  *
- * Purpose:	Open an existing file free space info structure on disk
+ * Purpose:     Open an existing file free space info structure on disk
  *
- * Return:	Success:	Pointer to free space structure
+ * Return:      Success:    Pointer to free space structure
+ *              Failure:    NULL
  *
- *		Failure:	NULL
- *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Tuesday, May  2, 2006
  *
- * Modfications:
- *
- *	Vailin Choi, July 29th, 2008
- *	  Add two more parameters for handling alignment: alignment & threshhold
- *
  *-------------------------------------------------------------------------
  */
 H5FS_t *
-H5FS_open(H5F_t *f, hid_t dxpl_id, haddr_t fs_addr, size_t nclasses,
+H5FS_open(H5F_t *f, hid_t dxpl_id, haddr_t fs_addr, uint16_t nclasses,
     const H5FS_section_class_t *classes[], void *cls_init_udata, hsize_t alignment, hsize_t threshold)
 {
-    H5FS_t *fspace = NULL;      /* New free space structure */
-    H5FS_hdr_cache_ud_t cache_udata; /* User-data for metadata cache callback */
-    H5FS_t *ret_value;          /* Return value */
+    H5FS_t *fspace = NULL;              /* New free space structure */
+    H5FS_hdr_cache_ud_t cache_udata;    /* User-data for metadata cache callback */
+    H5FS_t *ret_value = NULL;           /* Return value */
 
-    FUNC_ENTER_NOAPI(NULL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, NULL)
 #ifdef H5FS_DEBUG
 HDfprintf(stderr, "%s: Opening free space manager, fs_addr = %a, nclasses = %Zu\n", FUNC, fs_addr, nclasses);
 #endif /* H5FS_DEBUG */
@@ -216,7 +211,7 @@ HDfprintf(stderr, "%s: Opening free space manager, fs_addr = %a, nclasses = %Zu\
     cache_udata.addr = fs_addr;
 
     /* Protect the free space header */
-    if(NULL == (fspace = (H5FS_t *)H5AC_protect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, &cache_udata, H5AC_READ)))
+    if(NULL == (fspace = (H5FS_t *)H5AC_protect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, &cache_udata, H5AC__READ_ONLY_FLAG)))
         HGOTO_ERROR(H5E_FSPACE, H5E_CANTPROTECT, NULL, "unable to load free space header")
 #ifdef H5FS_DEBUG
 HDfprintf(stderr, "%s: fspace->sect_addr = %a\n", FUNC, fspace->sect_addr);
@@ -242,20 +237,18 @@ HDfprintf(stderr, "%s: fspace->rc = %u\n", FUNC, fspace->rc);
     ret_value = fspace;
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, NULL)
 } /* H5FS_open() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_delete
+ * Function:    H5FS_delete
  *
- * Purpose:	Delete a free space manager on disk
+ * Purpose:     Delete a free space manager on disk
  *
- * Return:	Success:	non-negative
+ * Return:      SUCCEED/FAIL
  *
- *		Failure:	negative
- *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Tuesday, May 30, 2006
  *
  *-------------------------------------------------------------------------
@@ -267,7 +260,7 @@ H5FS_delete(H5F_t *f, hid_t dxpl_id, haddr_t fs_addr)
     H5FS_hdr_cache_ud_t cache_udata; /* User-data for metadata cache callback */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
 #ifdef H5FS_DEBUG
 HDfprintf(stderr, "%s: Deleting free space manager, fs_addr = %a\n", FUNC, fs_addr);
 #endif /* H5FS_DEBUG */
@@ -284,8 +277,52 @@ HDfprintf(stderr, "%s: Deleting free space manager, fs_addr = %a\n", FUNC, fs_ad
     cache_udata.cls_init_udata = NULL;
     cache_udata.addr = fs_addr;
 
+#ifdef H5FS_DEBUG
+{
+    unsigned fspace_status = 0;      /* Free space section info's status in the metadata cache */
+
+    /* Sanity check */
+    HDassert(H5F_addr_defined(fs_addr));
+
+    /* Check the free space section info's status in the metadata cache */
+    if(H5AC_get_entry_status(f, fs_addr, &fspace_status) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to check metadata cache status for free space section info")
+
+    HDfprintf(stderr, "%s: fspace_status = %0x: ", FUNC, fspace_status);
+    if(fspace_status) {
+        hbool_t printed = FALSE;
+
+        if(fspace_status & H5AC_ES__IN_CACHE) {
+            HDfprintf(stderr, "H5AC_ES__IN_CACHE");
+            printed = TRUE;
+        } /* end if */
+        if(fspace_status & H5AC_ES__IS_DIRTY) {
+            HDfprintf(stderr, "%sH5AC_ES__IS_DIRTY", (printed ? " | " : ""));
+            printed = TRUE;
+        } /* end if */
+        if(fspace_status & H5AC_ES__IS_PROTECTED) {
+            HDfprintf(stderr, "%sH5AC_ES__IS_PROTECTED", (printed ? " | " : ""));
+            printed = TRUE;
+        } /* end if */
+        if(fspace_status & H5AC_ES__IS_PINNED) {
+            HDfprintf(stderr, "%sH5AC_ES__IS_PINNED", (printed ? " | " : ""));
+            printed = TRUE;
+        } /* end if */
+        if(fspace_status & H5AC_ES__IS_FLUSH_DEP_PARENT) {
+            HDfprintf(stderr, "%sH5AC_ES__IS_FLUSH_DEP_PARENT", (printed ? " | " : ""));
+            printed = TRUE;
+        } /* end if */
+        if(fspace_status & H5AC_ES__IS_FLUSH_DEP_CHILD) {
+            HDfprintf(stderr, "%sH5AC_ES__IS_FLUSH_DEP_CHILD", (printed ? " | " : ""));
+            printed = TRUE;
+        } /* end if */
+    } /* end if */
+    HDfprintf(stderr, "\n");
+}
+#endif /* H5FS_DEBUG */
+
     /* Protect the free space header */
-    if(NULL == (fspace = (H5FS_t *)H5AC_protect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, &cache_udata, H5AC_WRITE)))
+    if(NULL == (fspace = (H5FS_t *)H5AC_protect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, &cache_udata, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_FSPACE, H5E_CANTPROTECT, FAIL, "unable to protect free space header")
 
     /* Sanity check */
@@ -317,16 +354,32 @@ HDfprintf(stderr, "%s: Expunging free space section info from cache\n", FUNC);
 #endif /* H5FS_DEBUG */
             /* Evict the free space section info from the metadata cache */
             /* (Free file space) */
-            if(H5AC_expunge_entry(f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, H5AC__FREE_FILE_SPACE_FLAG) < 0)
-                HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "unable to remove free space section info from cache")
+            {
+                unsigned cache_flags = H5AC__NO_FLAGS_SET;
+
+                /* if the indirect block is in real file space, tell
+                 * the cache to free its file space.
+                 */
+                if (!H5F_IS_TMP_ADDR(f, fspace->sect_addr))
+                    cache_flags |= H5AC__FREE_FILE_SPACE_FLAG;
+
+                if(H5AC_expunge_entry(f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, cache_flags) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "unable to remove free space section info from cache")
+            }
+
 #ifdef H5FS_DEBUG
 HDfprintf(stderr, "%s: Done expunging free space section info from cache\n", FUNC);
 #endif /* H5FS_DEBUG */
         } /* end if */
         else {
+#ifdef H5FS_DEBUG
+HDfprintf(stderr, "%s: Deleting free space section info from file\n", FUNC);
+#endif /* H5FS_DEBUG */
             /* Release the space in the file */
-            if(H5MF_xfree(f, H5FD_MEM_FSPACE_SINFO, dxpl_id, fspace->sect_addr, fspace->alloc_sect_size) < 0)
-                HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to release free space sections")
+            if(!H5F_IS_TMP_ADDR(f, fspace->sect_addr)) {
+                if(H5MF_xfree(f, H5FD_MEM_FSPACE_SINFO, dxpl_id, fspace->sect_addr, fspace->alloc_sect_size) < 0)
+                    HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to release free space sections")
+            } /* end if */
         } /* end else */
     } /* end if */
 
@@ -334,21 +387,19 @@ done:
     if(fspace && H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, fspace, H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG) < 0)
         HDONE_ERROR(H5E_FSPACE, H5E_CANTUNPROTECT, FAIL, "unable to release free space header")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* H5FS_delete() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_close
+ * Function:    H5FS_close
  *
- * Purpose:	Destroy & deallocate free list structure, serializing sections
+ * Purpose:     Destroy & deallocate free list structure, serializing sections
  *              in the bins
  *
- * Return:	Success:	non-negative
- *
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Tuesday, March  7, 2006
  *
  *-------------------------------------------------------------------------
@@ -358,7 +409,7 @@ H5FS_close(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace)
 {
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
 
     /* Check arguments. */
     HDassert(f);
@@ -387,8 +438,14 @@ HDfprintf(stderr, "%s: Real sections to store in file\n", FUNC);
                     HDassert(fspace->sect_size > 0);
 
                     /* Allocate space for the section info in file */
-                    if(HADDR_UNDEF == (fspace->sect_addr = H5MF_alloc(f, H5FD_MEM_FSPACE_SINFO, dxpl_id, fspace->sect_size)))
-                        HGOTO_ERROR(H5E_FSPACE, H5E_NOSPACE, FAIL, "file allocation failed for free space sections")
+                    if(H5F_USE_TMP_SPACE(f)) {
+                        if(HADDR_UNDEF == (fspace->sect_addr = H5MF_alloc_tmp(f, fspace->sect_size)))
+                            HGOTO_ERROR(H5E_FSPACE, H5E_NOSPACE, FAIL, "file allocation failed for free space sections")
+                    } /* end if */
+                    else {
+                        if(HADDR_UNDEF == (fspace->sect_addr = H5MF_alloc(f, H5FD_MEM_FSPACE_SINFO, dxpl_id, fspace->sect_size)))
+                            HGOTO_ERROR(H5E_FSPACE, H5E_NOSPACE, FAIL, "file allocation failed for free space sections")
+                    } /* end if */
                     fspace->alloc_sect_size = (size_t)fspace->sect_size;
 
                     /* Mark free space header as dirty */
@@ -396,9 +453,9 @@ HDfprintf(stderr, "%s: Real sections to store in file\n", FUNC);
                         HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty")
                 } /* end if */
             } /* end if */
-	    else
-		/* Sanity check that section info has address */
-		HDassert(H5F_addr_defined(fspace->sect_addr));
+            else
+                /* Sanity check that section info has address */
+                HDassert(H5F_addr_defined(fspace->sect_addr));
 
             /* Cache the free space section info */
             if(H5AC_insert_entry(f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, fspace->sinfo, H5AC__NO_FLAGS_SET) < 0)
@@ -430,19 +487,9 @@ HDfprintf(stderr, "%s: Section info allocated though\n", FUNC);
 HDfprintf(stderr, "%s: Section info is for file free space\n", FUNC);
 #endif /* H5FS_DEBUG */
                     /* Try to shrink the file or absorb the section info into a block aggregator */
-                    if((status = H5MF_try_shrink(f, H5FD_MEM_FSPACE_SINFO, dxpl_id, fspace->sect_addr, fspace->alloc_sect_size)) < 0)
-                        HGOTO_ERROR(H5E_FSPACE, H5E_CANTMERGE, FAIL, "can't check for absorbing section info")
-                    else if(status == FALSE) {
-                        /* Section info can't "go away", but it's free.  Allow
-                         *      header to record it
-                         */
+                    if(H5F_IS_TMP_ADDR(f, fspace->sect_addr)) {
 #ifdef H5FS_DEBUG
-HDfprintf(stderr, "%s: Section info can't 'go away', header will own it\n", FUNC);
-#endif /* H5FS_DEBUG */
-                    } /* end if */
-                    else {
-#ifdef H5FS_DEBUG
-HDfprintf(stderr, "%s: Section info went 'go away'\n", FUNC);
+HDfprintf(stderr, "%s: Section info in temp. address space went 'go away'\n", FUNC);
 #endif /* H5FS_DEBUG */
                         /* Reset section info in header */
                         fspace->sect_addr = HADDR_UNDEF;
@@ -451,6 +498,30 @@ HDfprintf(stderr, "%s: Section info went 'go away'\n", FUNC);
                         /* Mark free space header as dirty */
                         if(H5AC_mark_entry_dirty(fspace) < 0)
                             HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty")
+                    } /* end if */
+                    else {
+                        if((status = H5MF_try_shrink(f, H5FD_MEM_FSPACE_SINFO, dxpl_id, fspace->sect_addr, fspace->alloc_sect_size)) < 0)
+                            HGOTO_ERROR(H5E_FSPACE, H5E_CANTMERGE, FAIL, "can't check for absorbing section info")
+                        else if(status == FALSE) {
+                            /* Section info can't "go away", but it's free.  Allow
+                             *      header to record it
+                             */
+#ifdef H5FS_DEBUG
+    HDfprintf(stderr, "%s: Section info can't 'go away', header will own it\n", FUNC);
+#endif /* H5FS_DEBUG */
+                        } /* end if */
+                        else {
+#ifdef H5FS_DEBUG
+    HDfprintf(stderr, "%s: Section info went 'go away'\n", FUNC);
+#endif /* H5FS_DEBUG */
+                            /* Reset section info in header */
+                            fspace->sect_addr = HADDR_UNDEF;
+                            fspace->alloc_sect_size = 0;
+
+                            /* Mark free space header as dirty */
+                            if(H5AC_mark_entry_dirty(fspace) < 0)
+                                HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty")
+                        } /* end else */
                     } /* end else */
                 } /* end if */
                 else {
@@ -469,10 +540,12 @@ HDfprintf(stderr, "%s: Section info is NOT for file free space\n", FUNC);
                         HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty")
 
                     /* Free previous serialized sections disk space */
-                    if(H5MF_xfree(f, H5FD_MEM_FSPACE_SINFO, dxpl_id, old_sect_addr, old_alloc_sect_size) < 0)
-                        HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to free free space sections")
-                } /* end if */
-            } /* end else */
+                    if(!H5F_IS_TMP_ADDR(f, old_sect_addr)) {
+                        if(H5MF_xfree(f, H5FD_MEM_FSPACE_SINFO, dxpl_id, old_sect_addr, old_alloc_sect_size) < 0)
+                            HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to free free space sections")
+                    } /* end if */
+                } /* end else */
+            } /* end if */
 
             /* Destroy section info */
             if(H5FS_sinfo_dest(fspace->sinfo) < 0)
@@ -487,9 +560,6 @@ HDfprintf(stderr, "%s: Section info is NOT for file free space\n", FUNC);
         if(fspace->serial_sect_count > 0)
             /* Sanity check that section info has address */
             HDassert(H5F_addr_defined(fspace->sect_addr));
-        else
-            /* Sanity check that section info doesn't have address */
-            HDassert(!H5F_addr_defined(fspace->sect_addr));
     } /* end else */
 
     /* Decrement the reference count on the free space manager header */
@@ -500,32 +570,32 @@ done:
 #ifdef H5FS_DEBUG
 HDfprintf(stderr, "%s: Leaving, ret_value = %d, fspace->rc = %u\n", FUNC, ret_value, fspace->rc);
 #endif /* H5FS_DEBUG */
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* H5FS_close() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_new
+ * Function:	H5FS__new
  *
- * Purpose:	Create new free space manager structure
+ * Purpose:     Create new free space manager structure
  *
- * Return:	Success:	non-NULL, pointer to new free space manager struct
- *		Failure:	NULL
+ * Return:      Success:    non-NULL, pointer to new free space manager struct
+ *              Failure:    NULL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Monday, July 31, 2006
  *
  *-------------------------------------------------------------------------
  */
 H5FS_t *
-H5FS_new(const H5F_t *f, size_t nclasses, const H5FS_section_class_t *classes[],
+H5FS__new(const H5F_t *f, uint16_t nclasses, const H5FS_section_class_t *classes[],
     void *cls_init_udata)
 {
     H5FS_t *fspace = NULL;      /* Free space manager */
     size_t u;                   /* Local index variable */
-    H5FS_t *ret_value;          /* Return value */
+    H5FS_t *ret_value = NULL;   /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Check arguments. */
     HDassert(nclasses == 0 || (nclasses > 0 && classes));
@@ -534,10 +604,10 @@ H5FS_new(const H5F_t *f, size_t nclasses, const H5FS_section_class_t *classes[],
      * Allocate free space structure
      */
     if(NULL == (fspace = H5FL_CALLOC(H5FS_t)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for free space free list")
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for free space free list")
 
     /* Set immutable free list parameters */
-    fspace->nclasses = nclasses;
+    H5_CHECKED_ASSIGN(fspace->nclasses, unsigned, nclasses, size_t);
     if(nclasses > 0) {
         if(NULL == (fspace->sect_cls = H5FL_SEQ_MALLOC(H5FS_section_class_t, nclasses)))
             HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for free space section class array")
@@ -563,7 +633,7 @@ H5FS_new(const H5F_t *f, size_t nclasses, const H5FS_section_class_t *classes[],
 
     /* Initialize non-zero information for new free space manager */
     fspace->addr = HADDR_UNDEF;
-    fspace->hdr_size = H5FS_HEADER_SIZE(f);
+    fspace->hdr_size = (size_t)H5FS_HEADER_SIZE(f);
     fspace->sect_addr = HADDR_UNDEF;
 
     /* Set return value */
@@ -581,7 +651,7 @@ done:
         } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5FS_new() */
+} /* H5FS__new() */
 
 

 /*-------------------------------------------------------------------------
@@ -589,8 +659,7 @@ done:
  *
  * Purpose:     Collect meta storage info used by the free space manager
  *
- * Return:      Success:        non-negative
- *              Failure:        negative
+ * Return:      SUCCEED (Can't fail)
  *
  * Programmer:  Vailin Choi
  *              June 19, 2007
@@ -621,8 +690,7 @@ H5FS_size(const H5F_t *f, const H5FS_t *fspace, hsize_t *meta_size)
  *
  * Purpose:     Increment reference count on free space header
  *
- * Return:      Success:        non-negative
- *              Failure:        negative
+ * Return:      SUCCEED/FAIL
  *
  * Programmer:  Quincey Koziol
  *              February  7, 2008
@@ -662,8 +730,7 @@ done:
  *
  * Purpose:     Decrement reference count on free space header
  *
- * Return:      Success:        non-negative
- *              Failure:        negative
+ * Return:      SUCCEED/FAIL
  *
  * Programmer:  Quincey Koziol
  *              February  7, 2008
@@ -695,7 +762,7 @@ HDfprintf(stderr, "%s: Entering, fpace->addr = %a, fspace->rc = %u\n", FUNC, fsp
                 HGOTO_ERROR(H5E_FSPACE, H5E_CANTUNPIN, FAIL, "unable to unpin free space header")
         } /* end if */
         else {
-            if(H5FS_hdr_dest(fspace) < 0)
+            if(H5FS__hdr_dest(fspace) < 0)
                 HGOTO_ERROR(H5E_FSPACE, H5E_CANTCLOSEOBJ, FAIL, "unable to destroy free space header")
         } /* end else */
     } /* end if */
@@ -706,15 +773,14 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_dirty
+ * Function:    H5FS_dirty
  *
- * Purpose:	Mark free space header as dirty
+ * Purpose:     Mark free space header as dirty
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Feb 14 2008
+ * Programmer:  Quincey Koziol
+ *              Feb 14 2008
  *
  *-------------------------------------------------------------------------
  */
@@ -743,25 +809,299 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_hdr_dest
+ * Function:    H5FS_alloc_hdr()
+ *
+ * Purpose:     Allocate space for the free-space manager header
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Feb 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_alloc_hdr(H5F_t *f, H5FS_t *fspace, haddr_t *fs_addr, hid_t dxpl_id)
+{
+    herr_t  ret_value = SUCCEED;              /* Return value */
+
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
+
+    /* Check arguments. */
+    HDassert(f);
+    HDassert(fspace);
+
+    if(!H5F_addr_defined(fspace->addr)) {
+        /* Allocate space for the free space header */
+        if(HADDR_UNDEF == (fspace->addr = H5MF_alloc(f, H5FD_MEM_FSPACE_HDR, dxpl_id, (hsize_t)H5FS_HEADER_SIZE(f))))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "file allocation failed for free space header")
+
+        /* Cache the new free space header (pinned) */
+        if(H5AC_insert_entry(f, dxpl_id, H5AC_FSPACE_HDR, fspace->addr, fspace, H5AC__PIN_ENTRY_FLAG) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTINIT, FAIL, "can't add free space header to cache")
+    } /* end if */
+
+    if(fs_addr)
+        *fs_addr = fspace->addr;
+
+done:
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* H5FS_alloc_hdr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FS_alloc_sect()
+ *
+ * Purpose:     Allocate space for the free-space manager section info header
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Feb 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_alloc_sect(H5F_t *f, H5FS_t *fspace, hid_t dxpl_id)
+{
+    herr_t  ret_value = SUCCEED;              /* Return value */
+
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
+
+    /* Check arguments. */
+    HDassert(f);
+    HDassert(fspace);
+
+    if(!H5F_addr_defined(fspace->sect_addr) && fspace->sinfo && fspace->serial_sect_count > 0) {
+        /* Allocate space for section info from aggregator/vfd (or temp. address space) */
+        /* (The original version called H5MF_alloc(), but that may cause sect_size to change again) */
+        /* (This routine is only called during file close operations, so don't allocate from temp. address space) */
+        if(HADDR_UNDEF == (fspace->sect_addr = H5MF_aggr_vfd_alloc(f, H5FD_MEM_FSPACE_SINFO, dxpl_id, fspace->sect_size)))
+            HGOTO_ERROR(H5E_FSPACE, H5E_NOSPACE, FAIL, "file allocation failed for section info")
+        fspace->alloc_sect_size = fspace->sect_size;
+
+        /* Mark free-space header as dirty */
+        if(H5FS_dirty(fspace) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty")
+
+        /* Cache the free-space section info */
+        if(H5AC_insert_entry(f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, fspace->sinfo, H5AC__NO_FLAGS_SET) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTINIT, FAIL, "can't add free space sections to cache")
+
+        fspace->sinfo = NULL;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* H5FS_alloc_sect() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FS_free()
+ *
+ * Purpose:     Free space for free-space manager header and section info header
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *              Feb 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_free(H5F_t *f, H5FS_t *fspace, hid_t dxpl_id)
+{
+    haddr_t	saved_addr;             /* Previous address of item */
+    unsigned    cache_flags;        /* Flags for unprotecting cache entries */
+    herr_t	ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
+
+    /* Check arguments. */
+    HDassert(f);
+    HDassert(fspace);
+
+    cache_flags = H5AC__DELETED_FLAG | H5AC__TAKE_OWNERSHIP_FLAG;;
+
+    if(H5F_addr_defined(fspace->sect_addr)) {
+        hsize_t	saved_size;     /* Size of previous section info */
+        unsigned sinfo_status = 0;      /* Section info cache status */
+
+        /* Check whether free-space manager section info is in cache or not */
+        if(H5AC_get_entry_status(f, fspace->sect_addr, &sinfo_status) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "unable to check metadata cache status for free-space section info")
+
+        /* Load free-space manager section info */
+        if(sinfo_status & H5AC_ES__IN_CACHE || !fspace->sinfo) {
+            H5FS_sinfo_cache_ud_t cache_udata;      /* User-data for cache callback */
+
+            /* Protect the free space sections */
+            cache_udata.f = f;
+            cache_udata.dxpl_id = dxpl_id;
+            cache_udata.fspace = fspace;
+	    if(NULL == (fspace->sinfo = (H5FS_sinfo_t *)H5AC_protect(f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, &cache_udata, H5AC__READ_ONLY_FLAG)))
+		HGOTO_ERROR(H5E_FSPACE, H5E_CANTPROTECT, FAIL, "unable to protect free space section info")
+
+            /* Unload and release ownership of the free-space manager section info */
+            if(H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, fspace->sinfo, cache_flags) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTUNPROTECT, FAIL, "unable to release free space section info")
+        } /* end if */
+
+        saved_addr = fspace->sect_addr;
+        saved_size = fspace->alloc_sect_size;
+
+        fspace->sect_addr = HADDR_UNDEF;
+        fspace->alloc_sect_size = 0;
+
+        /* Free space for the free-space manager section info */
+        if(!H5F_IS_TMP_ADDR(f, saved_addr)) {
+            if(H5MF_xfree(f, H5FD_MEM_FSPACE_SINFO, dxpl_id, saved_addr, saved_size) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to release free space sections")
+        } /* end if */
+
+        /* Mark free-space manager header as dirty */
+        if(H5FS_dirty(fspace) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty")
+    } /* end if */
+
+    if(H5F_addr_defined(fspace->addr)) {
+        unsigned hdr_status = 0;        /* Header entry status */
+
+        /* Check whether free-space manager header is in cache or not */
+        if(H5AC_get_entry_status(f, fspace->addr, &hdr_status) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "unable to check metadata cache status for free-space section info")
+
+        if(hdr_status & H5AC_ES__IN_CACHE) {
+            H5FS_hdr_cache_ud_t cache_udata; /* User-data for metadata cache callback */
+
+            /* Protect the free-space manager header */
+            /* (no class information necessary since it's in the cache) */
+            cache_udata.f = f;
+            cache_udata.nclasses = 0;
+            cache_udata.classes = NULL;
+            cache_udata.cls_init_udata = NULL;
+	    if(NULL == (fspace = (H5FS_t *)H5AC_protect(f, dxpl_id, H5AC_FSPACE_HDR, fspace->addr, &cache_udata, H5AC__READ_ONLY_FLAG)))
+		HGOTO_ERROR(H5E_FSPACE, H5E_CANTPROTECT, FAIL, "unable to protect free space section info")
+
+            /* Unpin the free-space manager header */
+            if(H5AC_unpin_entry(fspace) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPIN, FAIL, "unable to unpin fractal heap header")
+
+            /* Unload and release ownership of the free-space header */
+            if(H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_HDR, fspace->addr, fspace, cache_flags) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTUNPROTECT, FAIL, "unable to release free space section info")
+        } /* end if */
+
+        saved_addr = fspace->addr;
+        fspace->addr = HADDR_UNDEF;
+
+        /* Free space for the free-space manager header */
+        if(H5MF_xfree(f, H5FD_MEM_FSPACE_HDR, dxpl_id, saved_addr, (hsize_t)H5FS_HEADER_SIZE(f)) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to free free space header")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* H5FS_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FS_depend
  *
- * Purpose:	Destroys a free space header in memory.
+ * Purpose:     Make a child flush dependency between the free space
+ *              manager's and another piece of metadata in the file.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		May  2 2006
+ * Programmer:  Dana Robinson
+ *              Fall 2012
  *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5FS_hdr_dest(H5FS_t *fspace)
+H5FS_depend(H5AC_info_t *parent_entry, H5FS_t *fs)
+{
+    /* Local variables */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fs);
+
+    /* Set up flush dependency between parent entry and free space manager */
+    if(H5FS__create_flush_depend(parent_entry, (H5AC_info_t *)fs) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency on file metadata")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}  /* end H5FS_depend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FS_undepend
+ *
+ * Purpose:     Remove a child flush dependency between the free space
+ *              manager's and another piece of metadata in the file.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS_undepend(H5AC_info_t *parent_entry, H5FS_t *fs)
+{
+    /* Local variables */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fs);
+
+    /* Remove flush dependency between parent entry and free space manager */
+    if(H5FS__destroy_flush_depend(parent_entry, (H5AC_info_t *)fs) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency on file metadata")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FS_undepend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FS__hdr_dest
+ *
+ * Purpose:     Destroys a free space header in memory.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              May  2 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS__hdr_dest(H5FS_t *fspace)
 {
     unsigned u;                 /* Local index variable */
     herr_t ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /*
      * Check arguments.
@@ -785,18 +1125,17 @@ H5FS_hdr_dest(H5FS_t *fspace)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FS_hdr_dest() */
+} /* end H5FS__hdr_dest() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sinfo_free_sect_cb
+ * Function:    H5FS_sinfo_free_sect_cb
  *
- * Purpose:	Free a size-tracking node for a bin
+ * Purpose:     Free a size-tracking node for a bin
  *
- * Return:	Success:	non-negative
- *		Failure:	negative
+ * Return:      SUCCEED (Can't fail)
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Saturday, March 11, 2006
  *
  *-------------------------------------------------------------------------
@@ -815,20 +1154,18 @@ H5FS_sinfo_free_sect_cb(void *_sect, void H5_ATTR_UNUSED *key, void *op_data)
     /* Call the section's class 'free' method on the section */
     (*sinfo->fspace->sect_cls[sect->type].free)(sect);
 
-    FUNC_LEAVE_NOAPI(0)
+    FUNC_LEAVE_NOAPI(SUCCEED)
 }   /* H5FS_sinfo_free_sect_cb() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sinfo_free_node_cb
+ * Function:    H5FS_sinfo_free_node_cb
  *
- * Purpose:	Free a size-tracking node for a bin
+ * Purpose:     Free a size-tracking node for a bin
  *
- * Return:	Success:	non-negative
+ * Return:      SUCCEED (Can't fail)
  *
- *		Failure:	negative
- *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Saturday, March 11, 2006
  *
  *-------------------------------------------------------------------------
@@ -849,20 +1186,19 @@ H5FS_sinfo_free_node_cb(void *item, void H5_ATTR_UNUSED *key, void *op_data)
     /* Release free space list node */
     fspace_node = H5FL_FREE(H5FS_node_t, fspace_node);
 
-    FUNC_LEAVE_NOAPI(0)
+    FUNC_LEAVE_NOAPI(SUCCEED)
 }   /* H5FS_sinfo_free_node_cb() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sinfo_dest
+ * Function:    H5FS_sinfo_dest
  *
- * Purpose:	Destroys a free space section info in memory.
+ * Purpose:     Destroys a free space section info in memory.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		July 31 2006
+ * Programmer:  Quincey Koziol
+ *              July 31 2006
  *
  *-------------------------------------------------------------------------
  */
@@ -915,15 +1251,14 @@ done:
 #ifdef H5FS_DEBUG_ASSERT
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_assert
+ * Function:    H5FS_assert
  *
- * Purpose:	Verify that the free space manager is mostly sane
+ * Purpose:     Verify that the free space manager is mostly sane
  *
- * Return:	Non-negative on success, negative on failure
+ * Return:      SUCCEED (Can't fail)
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Jul 17 2006
+ * Programmer:  Quincey Koziol
+ *              Jul 17 2006
  *
  *-------------------------------------------------------------------------
  */
@@ -931,7 +1266,7 @@ herr_t
 H5FS_assert(const H5FS_t *fspace)
 {
     FUNC_ENTER_NOAPI_NOINIT_NOERR
-#ifndef QAK
+#ifdef QAK
 HDfprintf(stderr, "%s: fspace->tot_sect_count = %Hu\n", "H5FS_assert", fspace->tot_sect_count);
 #endif /* QAK */
 
diff --git a/src/H5FScache.c b/src/H5FScache.c
index a0bfbcf..657c5c4 100644
--- a/src/H5FScache.c
+++ b/src/H5FScache.c
@@ -15,11 +15,11 @@
 
 /*-------------------------------------------------------------------------
  *
- * Created:		H5FScache.c
- *			May  2 2006
- *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ * Created:     H5FScache.c
+ *              May  2 2006
+ *              Quincey Koziol <koziol at hdfgroup.org>
  *
- * Purpose:		Implement file free space metadata cache methods.
+ * Purpose:     Implement file free space metadata cache methods.
  *
  *-------------------------------------------------------------------------
  */
@@ -28,7 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5FS_PACKAGE		/*suppress error about including H5FSpkg  */
+#include "H5FSmodule.h"         /* This source code file is part of the H5FS module */
+
 
 /***********/
 /* Headers */
@@ -38,9 +39,10 @@
 #include "H5Eprivate.h"		/* Error handling		  	*/
 #include "H5FSpkg.h"		/* File free space			*/
 #include "H5MFprivate.h"	/* File memory management		*/
-#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+#include "H5VMprivate.h"	/* Vectors and arrays 			*/
 #include "H5WBprivate.h"        /* Wrapped Buffers                      */
 
+
 /****************/
 /* Local Macros */
 /****************/
@@ -49,9 +51,6 @@
 #define H5FS_HDR_VERSION        0               /* Header */
 #define H5FS_SINFO_VERSION      0               /* Serialized sections */
 
-/* Size of stack buffer for serialized headers */
-#define H5FS_HDR_BUF_SIZE               256
-
 
 /******************/
 /* Local Typedefs */
@@ -60,7 +59,7 @@
 /* User data for skip list iterator callback for iterating over section size nodes when syncing */
 typedef struct {
     H5FS_sinfo_t *sinfo;        /* Free space section info */
-    uint8_t **p;                /* Pointer to address of buffer pointer to serialize with */
+    uint8_t **image;            /* Pointer to address of buffer pointer to serialize with */
     unsigned sect_cnt_size;     /* # of bytes to encode section size counts in */
 } H5FS_iter_ud_t;
 
@@ -75,20 +74,42 @@ typedef struct {
 /********************/
 
 /* Section info routines */
-static herr_t H5FS_sinfo_serialize_sect_cb(void *_item, void H5_ATTR_UNUSED *key, void *_udata);
-static herr_t H5FS_sinfo_serialize_node_cb(void *_item, void H5_ATTR_UNUSED *key, void *_udata);
+static herr_t H5FS__sinfo_serialize_sect_cb(void *_item, void H5_ATTR_UNUSED *key, void *_udata);
+static herr_t H5FS__sinfo_serialize_node_cb(void *_item, void H5_ATTR_UNUSED *key, void *_udata);
 
 /* Metadata cache callbacks */
-static H5FS_t *H5FS_cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static herr_t H5FS_cache_hdr_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5FS_t *fspace, unsigned H5_ATTR_UNUSED * flags_ptr);
-static herr_t H5FS_cache_hdr_dest(H5F_t *f, H5FS_t *fspace);
-static herr_t H5FS_cache_hdr_clear(H5F_t *f, H5FS_t *fspace, hbool_t destroy);
-static herr_t H5FS_cache_hdr_size(const H5F_t *f, const H5FS_t *fspace, size_t *size_ptr);
-static H5FS_sinfo_t *H5FS_cache_sinfo_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static herr_t H5FS_cache_sinfo_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5FS_sinfo_t *sinfo, unsigned H5_ATTR_UNUSED * flags_ptr);
-static herr_t H5FS_cache_sinfo_dest(H5F_t *f, H5FS_sinfo_t *sinfo);
-static herr_t H5FS_cache_sinfo_clear(H5F_t *f, H5FS_sinfo_t *sinfo, hbool_t destroy);
-static herr_t H5FS_cache_sinfo_size(const H5F_t *f, const H5FS_sinfo_t *sinfo, size_t *size_ptr);
+static herr_t H5FS__cache_hdr_get_load_size(const void *image_ptr, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5FS__cache_hdr_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
+static void *H5FS__cache_hdr_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty);
+static herr_t H5FS__cache_hdr_image_len(const void *thing, size_t *image_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static herr_t H5FS__cache_hdr_pre_serialize(const H5F_t *f, hid_t dxpl_id,
+    void *thing, haddr_t addr, size_t len, size_t compressed_len, 
+    haddr_t *new_addr, size_t *new_len, size_t *new_compressed_len, 
+    unsigned *flags);
+static herr_t H5FS__cache_hdr_serialize(const H5F_t *f, void *image, 
+    size_t len, void *thing);
+static herr_t H5FS__cache_hdr_free_icr(void *thing);
+
+static herr_t H5FS__cache_sinfo_get_load_size(const void *image_ptr, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5FS__cache_sinfo_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
+static void *H5FS__cache_sinfo_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty);
+static herr_t H5FS__cache_sinfo_image_len(const void *thing, size_t *image_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static herr_t H5FS__cache_sinfo_pre_serialize(const H5F_t *f, hid_t dxpl_id,
+    void *thing, haddr_t addr, size_t len, size_t compressed_len, 
+    haddr_t *new_addr, size_t *new_len, size_t *new_compressed_len, 
+    unsigned *flags);
+static herr_t H5FS__cache_sinfo_serialize(const H5F_t *f, void *image,
+    size_t len, void *thing);
+static herr_t H5FS__cache_sinfo_notify(H5AC_notify_action_t action, void *thing);
+static herr_t H5FS__cache_sinfo_free_icr(void *thing);
 
 
 /*********************/
@@ -97,22 +118,38 @@ static herr_t H5FS_cache_sinfo_size(const H5F_t *f, const H5FS_sinfo_t *sinfo, s
 
 /* H5FS header inherits cache-like properties from H5AC */
 const H5AC_class_t H5AC_FSPACE_HDR[1] = {{
-    H5AC_FSPACE_HDR_ID,
-    (H5AC_load_func_t)H5FS_cache_hdr_load,
-    (H5AC_flush_func_t)H5FS_cache_hdr_flush,
-    (H5AC_dest_func_t)H5FS_cache_hdr_dest,
-    (H5AC_clear_func_t)H5FS_cache_hdr_clear,
-    (H5AC_size_func_t)H5FS_cache_hdr_size,
+    H5AC_FSPACE_HDR_ID,                 /* Metadata client ID */
+    "Free Space Header",                /* Metadata client name (for debugging) */
+    H5FD_MEM_FSPACE_HDR,                /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5FS__cache_hdr_get_load_size,      /* 'get_load_size' callback */
+    H5FS__cache_hdr_verify_chksum,	/* 'verify_chksum' callback */
+    H5FS__cache_hdr_deserialize,        /* 'deserialize' callback */
+    H5FS__cache_hdr_image_len,          /* 'image_len' callback */
+    H5FS__cache_hdr_pre_serialize,      /* 'pre_serialize' callback */
+    H5FS__cache_hdr_serialize,          /* 'serialize' callback */
+    NULL,                               /* 'notify' callback */
+    H5FS__cache_hdr_free_icr,           /* 'free_icr' callback */
+    NULL,			        /* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
 }};
 
-/* H5FS serialized sections inherit cache-like properties from H5AC */
+/* H5FS section info inherits cache-like properties from H5AC */
 const H5AC_class_t H5AC_FSPACE_SINFO[1] = {{
-    H5AC_FSPACE_SINFO_ID,
-    (H5AC_load_func_t)H5FS_cache_sinfo_load,
-    (H5AC_flush_func_t)H5FS_cache_sinfo_flush,
-    (H5AC_dest_func_t)H5FS_cache_sinfo_dest,
-    (H5AC_clear_func_t)H5FS_cache_sinfo_clear,
-    (H5AC_size_func_t)H5FS_cache_sinfo_size,
+    H5AC_FSPACE_SINFO_ID,               /* Metadata client ID */
+    "Free Space Section Info",          /* Metadata client name (for debugging) */
+    H5FD_MEM_FSPACE_SINFO,              /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5FS__cache_sinfo_get_load_size,    /* 'get_load_size' callback */
+    H5FS__cache_sinfo_verify_chksum,	/* 'verify_chksum' callback */
+    H5FS__cache_sinfo_deserialize,      /* 'deserialize' callback */
+    H5FS__cache_sinfo_image_len,        /* 'image_len' callback */
+    H5FS__cache_sinfo_pre_serialize,    /* 'pre_serialize' callback */
+    H5FS__cache_sinfo_serialize,        /* 'serialize' callback */
+    H5FS__cache_sinfo_notify, 		/* 'notify' callback */
+    H5FS__cache_sinfo_free_icr,         /* 'free_icr' callback */
+    NULL,			        /* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
 }};
 
 
@@ -125,316 +162,635 @@ const H5AC_class_t H5AC_FSPACE_SINFO[1] = {{
 /* Local Variables */
 /*******************/
 
-/* Declare a free list to manage free space section data to/from disk */
-H5FL_BLK_DEFINE_STATIC(sect_block);
-
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_cache_hdr_load
+ * Function:    H5FS__cache_hdr_get_load_size
  *
- * Purpose:	Loads a free space manager header from the disk.
+ * Purpose:     Compute the size of the data structure on disk.
  *
- * Return:      Success:        Pointer to a new free space header
- *              Failure:        NULL
+ * Return:      Non-negative on success/Negative on failure
  *
  * Programmer:  Quincey Koziol
- *              koziol at ncsa.uiuc.edu
- *              May  2 2006
+ *              koziol at hdfgroup.org
+ *              August 14, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS__cache_hdr_get_load_size(const void *_image, void *_udata, size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
+{
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    H5FS_hdr_cache_ud_t *udata = (H5FS_hdr_cache_ud_t *)_udata; /* User-data for metadata cache callback */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(udata);
+    HDassert(udata->f);
+    HDassert(image_len);
+
+    if(image == NULL) {
+	/* Set the image length size */
+	*image_len = (size_t)H5FS_HEADER_SIZE(udata->f);
+    } else {
+        HDassert(actual_len);
+        HDassert(*actual_len == *image_len);
+    }
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FS__cache_hdr_get_load_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FS__cache_hdr_verify_chksum
+ *
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
+ *
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
+ *
+ * Programmer:	Vailin Choi; Aug 2015
  *
  *-------------------------------------------------------------------------
  */
-static H5FS_t *
-H5FS_cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+htri_t
+H5FS__cache_hdr_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSED *_udata)
+{
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+    htri_t ret_value = TRUE;	/* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(image);
+
+    /* Get stored and computed checksums */
+    H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
+
+    if(stored_chksum != computed_chksum)
+        ret_value = FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FS__cache_hdr_verify_chksum() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS__cache_hdr_deserialize
+ *
+ * Purpose:	Given a buffer containing the on disk image of the free space
+ *      	manager section info, allocate an instance of H5FS_t, load
+ *      	it with the data contained in the image, and return a pointer
+ *              to the new instance.
+ *
+ * Return:	Success:	Pointer to new object
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		August 18 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5FS__cache_hdr_deserialize(const void *_image, size_t len, void *_udata, 
+    hbool_t H5_ATTR_UNUSED *dirty)
 {
     H5FS_t		*fspace = NULL; /* Free space header info */
-    H5FS_hdr_cache_ud_t *udata = (H5FS_hdr_cache_ud_t *)_udata; /* user data for callback */
-    H5WB_t              *wb = NULL;     /* Wrapped buffer for header data */
-    uint8_t             hdr_buf[H5FS_HDR_BUF_SIZE]; /* Buffer for header */
-    uint8_t		*hdr;           /* Pointer to header buffer */
-    const uint8_t	*p;             /* Pointer into raw data buffer */
+    H5FS_hdr_cache_ud_t *udata = (H5FS_hdr_cache_ud_t *)_udata;  /* User data for callback */
+    const uint8_t	*image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
     uint32_t            stored_chksum;  /* Stored metadata checksum value */
-    uint32_t            computed_chksum; /* Computed metadata checksum value */
     unsigned            nclasses;       /* Number of section classes */
-    H5FS_t		*ret_value;     /* Return value */
+    H5FS_t		*ret_value = NULL;      /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Check arguments */
-    HDassert(f);
+    HDassert(image);
     HDassert(udata);
+    HDassert(udata->f);
 
     /* Allocate a new free space manager */
-    if(NULL == (fspace = H5FS_new(udata->f, udata->nclasses, udata->classes, udata->cls_init_udata)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    if(NULL == (fspace = H5FS__new(udata->f, udata->nclasses, udata->classes, udata->cls_init_udata)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
 
     /* Set free space manager's internal information */
     fspace->addr = udata->addr;
 
-    /* Wrap the local buffer for serialized header info */
-    if(NULL == (wb = H5WB_wrap(hdr_buf, sizeof(hdr_buf))))
-        HGOTO_ERROR(H5E_FSPACE, H5E_CANTINIT, NULL, "can't wrap buffer")
-
-    /* Get a pointer to a buffer that's large enough for header */
-    if(NULL == (hdr = (uint8_t *)H5WB_actual(wb, fspace->hdr_size)))
-        HGOTO_ERROR(H5E_FSPACE, H5E_NOSPACE, NULL, "can't get actual buffer")
-
-    /* Read header from disk */
-    if(H5F_block_read(f, H5FD_MEM_FSPACE_HDR, addr, fspace->hdr_size, dxpl_id, hdr) < 0)
-	HGOTO_ERROR(H5E_FSPACE, H5E_READERROR, NULL, "can't read free space header")
-
-    p = hdr;
-
     /* Magic number */
-    if(HDmemcmp(p, H5FS_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC))
-	HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "wrong free space header signature")
-    p += H5_SIZEOF_MAGIC;
+    if(HDmemcmp(image, H5FS_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "wrong free space header signature")
+    image += H5_SIZEOF_MAGIC;
 
     /* Version */
-    if(*p++ != H5FS_HDR_VERSION)
-	HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "wrong free space header version")
+    if(*image++ != H5FS_HDR_VERSION)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "wrong free space header version")
 
     /* Client ID */
-    fspace->client = (H5FS_client_t)*p++;
+    fspace->client = (H5FS_client_t)*image++;
     if(fspace->client >= H5FS_NUM_CLIENT_ID)
-	HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "unknown client ID in free space header")
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "unknown client ID in free space header")
 
     /* Total space tracked */
-    H5F_DECODE_LENGTH(udata->f, p, fspace->tot_space);
+    H5F_DECODE_LENGTH(udata->f, image, fspace->tot_space);
 
     /* Total # of free space sections tracked */
-    H5F_DECODE_LENGTH(udata->f, p, fspace->tot_sect_count);
+    H5F_DECODE_LENGTH(udata->f, image, fspace->tot_sect_count);
 
     /* # of serializable free space sections tracked */
-    H5F_DECODE_LENGTH(udata->f, p, fspace->serial_sect_count);
+    H5F_DECODE_LENGTH(udata->f, image, fspace->serial_sect_count);
 
     /* # of ghost free space sections tracked */
-    H5F_DECODE_LENGTH(udata->f, p, fspace->ghost_sect_count);
+    H5F_DECODE_LENGTH(udata->f, image, fspace->ghost_sect_count);
 
     /* # of section classes */
     /* (only check if we actually have some classes) */
-    UINT16DECODE(p, nclasses);
+    UINT16DECODE(image, nclasses);
     if(fspace->nclasses > 0 && fspace->nclasses != nclasses)
-	HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "section class count mismatch")
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "section class count mismatch")
 
     /* Shrink percent */
-    UINT16DECODE(p, fspace->shrink_percent);
+    UINT16DECODE(image, fspace->shrink_percent);
 
     /* Expand percent */
-    UINT16DECODE(p, fspace->expand_percent);
+    UINT16DECODE(image, fspace->expand_percent);
 
-    /* Size of address space free space sections are within (log2 of actual value) */
-    UINT16DECODE(p, fspace->max_sect_addr);
+    /* Size of address space free space sections are within 
+     * (log2 of actual value) 
+     */
+    UINT16DECODE(image, fspace->max_sect_addr);
 
     /* Max. size of section to track */
-    H5F_DECODE_LENGTH(udata->f, p, fspace->max_sect_size);
+    H5F_DECODE_LENGTH(udata->f, image, fspace->max_sect_size);
 
     /* Address of serialized free space sections */
-    H5F_addr_decode(udata->f, &p, &fspace->sect_addr);
+    H5F_addr_decode(udata->f, &image, &fspace->sect_addr);
 
     /* Size of serialized free space sections */
-    H5F_DECODE_LENGTH(udata->f, p, fspace->sect_size);
+    H5F_DECODE_LENGTH(udata->f, image, fspace->sect_size);
 
     /* Allocated size of serialized free space sections */
-    H5F_DECODE_LENGTH(udata->f, p, fspace->alloc_sect_size);
+    H5F_DECODE_LENGTH(udata->f, image, fspace->alloc_sect_size);
 
-    /* Compute checksum on indirect block */
-    computed_chksum = H5_checksum_metadata(hdr, (size_t)(p - (const uint8_t *)hdr), 0);
+    /* checksum verification already done in verify_chksum cb */
 
     /* Metadata checksum */
-    UINT32DECODE(p, stored_chksum);
+    UINT32DECODE(image, stored_chksum);
 
-    HDassert((size_t)(p - (const uint8_t *)hdr) == fspace->hdr_size);
-
-    /* Verify checksum */
-    if(stored_chksum != computed_chksum)
-	HGOTO_ERROR(H5E_FSPACE, H5E_BADVALUE, NULL, "incorrect metadata checksum for fractal heap indirect block")
+    /* Sanity check */
+    HDassert((size_t)(image - (const uint8_t *)_image) <= len);
 
     /* Set return value */
     ret_value = fspace;
 
 done:
     /* Release resources */
-    if(wb && H5WB_unwrap(wb) < 0)
-        HDONE_ERROR(H5E_FSPACE, H5E_CLOSEERROR, NULL, "can't close wrapped buffer")
     if(!ret_value && fspace)
-        if(H5FS_hdr_dest(fspace) < 0)
+        if(H5FS__hdr_dest(fspace) < 0)
             HDONE_ERROR(H5E_FSPACE, H5E_CANTFREE, NULL, "unable to destroy free space header")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FS_cache_hdr_load() */ /*lint !e818 Can't make udata a pointer to const */
+} /* end H5FS__cache_hdr_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_cache_hdr_flush
+ * Function:    H5FS__cache_hdr_image_len
  *
- * Purpose:	Flushes a dirty free space header to disk.
+ * Purpose:     Compute the size of the data structure on disk and return
+ *              it in *image_len.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Non-negative on success/Negative on failure
  *
  * Programmer:  Quincey Koziol
- *              koziol at ncsa.uiuc.edu
- *              May  2 2006
+ *              koziol at hdfgroup.org
+ *              August 14, 2013
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FS_cache_hdr_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5FS_t *fspace, unsigned H5_ATTR_UNUSED * flags_ptr)
+H5FS__cache_hdr_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    H5WB_t      *wb = NULL;             /* Wrapped buffer for header data */
-    uint8_t     hdr_buf[H5FS_HDR_BUF_SIZE]; /* Buffer for header */
-    herr_t ret_value = SUCCEED;         /* Return value */
+    const H5FS_t *fspace = (const H5FS_t *)_thing;       /* Pointer to the object */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(fspace);
+    HDassert(fspace->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(fspace->cache_info.type == H5AC_FSPACE_HDR);
+    HDassert(image_len);
+
+    /* Set the image length size */
+    *image_len = fspace->hdr_size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FS__cache_hdr_image_len() */
 
-    /* check arguments */
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS__cache_hdr_pre_serialize
+ *
+ * Purpose:	The free space manager header contains the address, size, and 
+ *		allocation size of the free space manager section info.  However,
+ *		since it is possible for the section info to either not be allocated
+ *		at all, or be allocated in temporary (AKA imaginary) files space,
+ *		it is possible for the above mentioned fields to contain giberish
+ *		when the free space manager header is serialized.
+ *
+ *		This function exists to prevent this problem.  It does so by 
+ *		forcing allocation of real file space for the section information.
+ *
+ *		Note that in the Version 2 cache, this problem was dealt with by
+ *		simply flushing the section info before flushing the header.  This
+ *		was possible, since the clients handled file I/O directly.  As 
+ *		this responsibility has moved to the cache in Version 3, this 
+ *		solution is no longer directly applicable.
+ *
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
+ *
+ * Programmer:	John Mainzer
+ *		6/21/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5FS__cache_hdr_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
+    haddr_t addr, size_t H5_ATTR_UNUSED len, size_t H5_ATTR_UNUSED compressed_len, 
+    haddr_t *new_addr, size_t *new_len, size_t H5_ATTR_UNUSED *new_compressed_len, 
+    unsigned *flags)
+{
+    H5FS_t 	*fspace = (H5FS_t *)_thing;     /* Pointer to the object */
+    H5P_genplist_t *dxpl = NULL;                /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
+    herr_t     	 ret_value = SUCCEED;           /* Return value */
+
+    FUNC_ENTER_STATIC_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
+
+    /* Sanity check */
     HDassert(f);
-    HDassert(H5F_addr_defined(addr));
     HDassert(fspace);
-    HDassert(H5F_addr_defined(fspace->addr));
+    HDassert(fspace->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(fspace->cache_info.type == H5AC_FSPACE_HDR);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(new_addr);
+    HDassert(new_len);
+    HDassert(flags);
 
-    /* Check if the header "owns" the section info */
     if(fspace->sinfo) {
-        /* Sanity check - should not be trying to destroy header if it still
-         *      "owns" section info
+        H5AC_ring_t ring;
+
+        /* Retrieve the ring type for the header */
+        if(H5AC_get_entry_ring(f, addr, &ring) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "unable to get property value");
+
+        /* Set the ring type for the section info in the DXPL */
+        if(H5AC_set_ring(dxpl_id, ring, &dxpl, &orig_ring) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTSET, FAIL, "unable to set ring value")
+
+        /* This implies that the header "owns" the section info.  
+         *
+         * Unfortunately, the comments in the code are not clear as to 
+	 * what this means, but from reviewing the code (most particularly
+         * H5FS_close(), H5FS_sinfo_lock, and H5FS_sinfo_unlock()), I 
+         * gather that it means that the header is maintaining a pointer to 
+         * an instance of H5FS_sinfo_t in which free space data is 
+         * maintained, and either:
+         *
+         * 1) The instance of H5FS_sinfo_t is not in the metadata cache.
+         *
+         *    This will be TRUE iff H5F_addr_defined(fspace->sect_addr) 
+         *    is FALSE, and fspace->sinfo is not NULL.  This is sometimes
+         *    referred to as "floating" section info in the comments.
+         *
+         *    If the section info structure contains free space data 
+         *    that must be placed on disk eventually, then 
+         *
+         *        fspace->serial_sect_count > 0
+         *
+         *    and
+         *
+         *        H5F_addr_defined(fspace->addr)
+         *
+         *    will both be TRUE.  If this contition does not hold, then
+         *    either the free space info is not persistant 
+         *    (!H5F_addr_defined(fspace->addr)???) or the section info 
+         *    contains no free space data that must be written to file 
+         *    ( fspace->serial_sect_count == 0 ).
+         *
+         * 2) The instance of H5FS_sinfo_t is in the metadata cache with
+         *    address in temporary file space (AKA imaginary file space).
+         *    The entry may or may not be protected, and if protected, it 
+         *    may be protected either RW or RO (as indicated by 
+         *    fspace->sinfo_protected and  fspace->sinfo_accmod).
+         *
+         * 3) The instance of H5FS_sinfo_t is in the metadata cache with
+         *    address in real file space.  As in case 2) above, the entry
+         *    may or may not be protected, and if protected, it 
+         *    may be protected either RW or RO (as indicated by 
+         *    fspace->sinfo_protected and  fspace->sinfo_accmod).
+         *
+         * Observe that fspace->serial_sect_count > 0 must be TRUE in 
+         * cases 2) and 3), as the section info should not be stored on 
+         * disk if it doesn't exist.  Similarly, since the section info
+         * will not be stored to disk unless the header is, 
+         * H5F_addr_defined(fspace->addr) must hold as well.
+	 *
+         * As the objective is to touch up the free space manager header
+         * so that it contains sensical data on the size and location of 
+         * the section information, we have to handle each of the above
+         * cases differently.
+         *
+         * Case 1) If either fspace->serial_sect_count == 0 or 
+         *         ! H5F_addr_defined(fspace->addr) do nothing as either 
+         *         the free space manager data is not persistant, or the 
+         *         section info is empty.
+         *
+         *         Otherwise, allocate space for the section info in real
+         *         file space, insert the section info at this location, and 
+         *         set fspace->sect_addr, fspace->sect_size, and 
+         *	   fspace->alloc_sect_size to reflect the new location
+         *	   of the section info.  Note that it is not necessary to
+         *         force a write of the section info.
+         *
+         * Case 2) Allocate space for the section info in real file space,
+         *         and tell the metadata cache to relocate the entry.  
+         *         Update fspace->sect_addr, fspace->sect_size, and 
+         *         fspace->alloc_sect_size to reflect the new location.
+         *
+         * Case 3) Nothing to be done in this case, although it is useful
+         *         to perform sanity checks.
+         *
+         * Note that while we may alter the contents of the free space 
+         * header in cases 1) and 2), there is no need to mark the header 
+         * as dirty, as the metadata cache would not be attempting to 
+         * serialize the header if it though it was clean.
          */
-        HDassert(!destroy);
-
-        /* Check if the section info is dirty */
-        if(fspace->sinfo->dirty) {
-            if(fspace->serial_sect_count > 0) {
-                /* Check if we need to allocate space for  section info */
-                if(!H5F_addr_defined(fspace->sect_addr)) {
-                    /* Sanity check */
-                    HDassert(fspace->sect_size > 0);
-
-                    /* Allocate space for the section info in file */
-                    if(HADDR_UNDEF == (fspace->sect_addr = H5MF_alloc(f, H5FD_MEM_FSPACE_SINFO, dxpl_id, fspace->sect_size)))
-                        HGOTO_ERROR(H5E_FSPACE, H5E_NOSPACE, FAIL, "file allocation failed for free space sections")
-                    fspace->alloc_sect_size = (size_t)fspace->sect_size;
-
-                    /* Mark header dirty */
-                    /* (don't use cache API, since we're in a callback) */
-                    fspace->cache_info.is_dirty = TRUE;
-                } /* end if */
-
-                /* Write section info to file */
-                if(H5FS_cache_sinfo_flush(f, dxpl_id, FALSE, fspace->sect_addr, fspace->sinfo, NULL) < 0)
-                    HGOTO_ERROR(H5E_FSPACE, H5E_CANTFLUSH, FAIL, "unable to save free space section info to disk")
+        if(fspace->serial_sect_count > 0 && H5F_addr_defined(fspace->addr)) {
+	    /* Sanity check */
+            HDassert(fspace->sect_size > 0);
+
+            if(!H5F_addr_defined(fspace->sect_addr)) { /* case 1 */
+		/* allocate file space for the section info, and insert it
+                 * into the metadata cache.
+                 */
+                if(HADDR_UNDEF == (fspace->sect_addr = H5MF_alloc((H5F_t *)f, H5FD_MEM_FSPACE_SINFO, dxpl_id, fspace->sect_size)))
+                    HGOTO_ERROR(H5E_FSPACE, H5E_NOSPACE, FAIL, "file allocation failed for free space sections")
+
+                fspace->alloc_sect_size = (size_t)fspace->sect_size;
+		if(H5AC_insert_entry((H5F_t *)f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, fspace->sinfo, H5AC__NO_FLAGS_SET) < 0)
+                    HGOTO_ERROR(H5E_FSPACE, H5E_CANTINIT, FAIL, "can't add free space sections to cache")
+
+                HDassert(fspace->sinfo->cache_info.size == fspace->alloc_sect_size);
+
+                /* the metadata cache is now managing the section info, 
+                 * so set fspace->sinfo to NULL.
+                 */
+                fspace->sinfo = NULL;
             } /* end if */
-            else {
-                /* Sanity check that section info doesn't have address */
-                HDassert(!H5F_addr_defined(fspace->sect_addr));
+            else if(H5F_IS_TMP_ADDR(f, fspace->sect_addr)) { /* case 2 */
+                haddr_t new_sect_addr;
+
+		/* move the section info from temporary (AKA imaginary) file
+                 * space to real file space.
+                 */
+
+                /* if my reading of the code is correct, this should always
+                 * be the case.  If not, we will have to add code to resize
+                 * file space allocation for section info as well as moving it.
+                 */
+                HDassert(fspace->sect_size > 0);
+                HDassert(fspace->alloc_sect_size == (size_t)fspace->sect_size);
+
+                /* Allocate space for the section info in file */
+                if(HADDR_UNDEF == (new_sect_addr = H5MF_alloc((H5F_t *)f, H5FD_MEM_FSPACE_SINFO, dxpl_id, fspace->sect_size)))
+                    HGOTO_ERROR(H5E_FSPACE, H5E_NOSPACE, FAIL, "file allocation failed for free space sections")
+
+                fspace->alloc_sect_size = (size_t)fspace->sect_size;
+                HDassert(fspace->sinfo->cache_info.size == fspace->alloc_sect_size);
+
+                /* Let the metadata cache know the section info moved */
+                if(H5AC_move_entry((H5F_t *)f, H5AC_FSPACE_SINFO, fspace->sect_addr, new_sect_addr) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTMOVE, FAIL, "unable to move section info")
+
+                fspace->sect_addr = new_sect_addr;
+            } /* end else-if */
+            else { /* case 3 -- nothing to do but sanity checking */
+                /* if my reading of the code is correct, this should always
+                 * be the case.  If not, we will have to add code to resize
+                 * file space allocation for section info.
+                 */
+                HDassert(fspace->sect_size > 0);
+                HDassert(fspace->alloc_sect_size == (size_t)fspace->sect_size);
             } /* end else */
-            /* Mark section info clean */
-            fspace->sinfo->dirty = FALSE;
-        } /* end if */
+        } /* end else */
+        else {
+            /* for one reason or another (see comment above) there should
+             * not be any file space allocated for the section info.
+             */
+	    HDassert(!H5F_addr_defined(fspace->sect_addr));
+        } /* end else */
     } /* end if */
-    else {
-        /* Just sanity checks... */
-        if(fspace->serial_sect_count > 0)
-            /* Sanity check that section info has address */
-            HDassert(H5F_addr_defined(fspace->sect_addr));
-        else
-            /* Sanity check that section info doesn't have address */
-            HDassert(!H5F_addr_defined(fspace->sect_addr));
+    else if(H5F_addr_defined(fspace->sect_addr)) {
+        /* Here the metadata cache is managing the section info.  
+         *
+         * Do some sanity checks, and then test to see if the section 
+         * info is in real file space.  If it isn't relocate it into 
+         * real file space lest the header be written to file with 
+         * a nonsense section info address.
+         */
+        HDassert(fspace->serial_sect_count > 0);
+        HDassert(fspace->sect_size > 0);
+        HDassert(fspace->alloc_sect_size == (size_t)fspace->sect_size);
+
+        if(H5F_IS_TMP_ADDR(f, fspace->sect_addr)) {
+            unsigned sect_status = 0;
+            haddr_t new_sect_addr;
+
+	    /* we have work to do -- must relocate section info into 
+             * real file space.
+             *
+             * Since the section info address is in temporary space (AKA
+             * imaginary space), it follows that the entry must be in 
+             * cache.  Further, since fspace->sinfo is NULL, it must be 
+             * unprotected and un-pinned.  Start by verifying this.
+             */
+            if(H5AC_get_entry_status(f, fspace->sect_addr, &sect_status) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "can't get section info status")
+
+            HDassert(sect_status & H5AC_ES__IN_CACHE);
+            HDassert((sect_status & H5AC_ES__IS_PROTECTED) == 0);
+            HDassert((sect_status & H5AC_ES__IS_PINNED) == 0);
+
+            /* Allocate space for the section info in file */
+            if(HADDR_UNDEF == (new_sect_addr = H5MF_alloc((H5F_t *)f, H5FD_MEM_FSPACE_SINFO, dxpl_id, fspace->sect_size)))
+                HGOTO_ERROR(H5E_FSPACE, H5E_NOSPACE, FAIL, "file allocation failed for free space sections")
+
+            fspace->alloc_sect_size = (size_t)fspace->sect_size;
+
+            /* Sanity check */
+            HDassert(!H5F_addr_eq(fspace->sect_addr, new_sect_addr));
+
+            /* Let the metadata cache know the section info moved */
+            if(H5AC_move_entry((H5F_t *)f, H5AC_FSPACE_SINFO, fspace->sect_addr, new_sect_addr) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTMOVE, FAIL, "unable to move section info")
+
+            /* Update the internal address for the section info */
+            fspace->sect_addr = new_sect_addr;
+
+            /* No need to mark the header dirty, as we are about to 
+             * serialize it.
+             */
+        } /* end if */
+    } /* end else-if */
+    else {      /* there is no section info at present */
+        /* do some sanity checks */
+        HDassert(fspace->serial_sect_count == 0);
+        HDassert(fspace->tot_sect_count == fspace->ghost_sect_count);
     } /* end else */
 
-    if(fspace->cache_info.is_dirty) {
-        uint8_t	*hdr;                   /* Pointer to header buffer */
-        uint8_t *p;                     /* Pointer into raw data buffer */
-        uint32_t metadata_chksum;       /* Computed metadata checksum value */
-
-        /* Wrap the local buffer for serialized header info */
-        if(NULL == (wb = H5WB_wrap(hdr_buf, sizeof(hdr_buf))))
-            HGOTO_ERROR(H5E_FSPACE, H5E_CANTINIT, FAIL, "can't wrap buffer")
+    /* what ever happened above, set *flags to 0 */
+    *flags = 0;
 
-        /* Get a pointer to a buffer that's large enough for header */
-        if(NULL == (hdr = (uint8_t *)H5WB_actual(wb, fspace->hdr_size)))
-            HGOTO_ERROR(H5E_FSPACE, H5E_NOSPACE, FAIL, "can't get actual buffer")
+done:
+    /* Reset the ring in the DXPL */
+    if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+        HDONE_ERROR(H5E_FSPACE, H5E_CANTSET, FAIL, "unable to set property value")
 
-        /* Get temporary pointer to header */
-        p = hdr;
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* end H5FS__cache_hdr_pre_serialize() */
 
-        /* Magic number */
-        HDmemcpy(p, H5FS_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC);
-        p += H5_SIZEOF_MAGIC;
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FS__cache_hdr_serialize
+ *
+ * Purpose: 	Given an instance of H5FS_t and a suitably sized buffer,
+ *      	serialize the contents of the instance of H5FS_t and write
+ *      	its contents to the buffer.  This buffer will be used to 
+ *      	write the image of the instance to file.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              6/21/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5FS__cache_hdr_serialize(const H5F_t *f, void *_image, size_t len,
+    void *_thing)
+{
+    H5FS_t     *fspace = (H5FS_t *)_thing;      /* Pointer to the object */
+    uint8_t    *image = (uint8_t *)_image;      /* Pointer into raw data buffer */
+    uint32_t    metadata_chksum;       /* Computed metadata checksum value */
+    herr_t      ret_value = SUCCEED;   /* Return value */
 
-        /* Version # */
-        *p++ = H5FS_HDR_VERSION;
+    FUNC_ENTER_STATIC_NOERR
 
-        /* Client ID */
-        *p++ = fspace->client;
+    /* Check arguments */
+    HDassert(f);
+    HDassert(image);
+    HDassert(fspace);
+    HDassert(fspace->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(fspace->cache_info.type == H5AC_FSPACE_HDR);
+    HDassert(fspace->hdr_size == len);
+
+    /* The section information does not always exits, and if it does, 
+     * it is not always in the cache.  To make matters more interesting, 
+     * even if it is in the cache, it may not be in real file space.
+     *
+     * The pre-serialize function should have moved the section info 
+     * into real file space if necessary before this function was called.
+     * The following asserts are a cursory check on this.
+     */
+    HDassert((! H5F_addr_defined(fspace->sect_addr)) || (! H5F_IS_TMP_ADDR(f, fspace->sect_addr)));
+    HDassert((! H5F_addr_defined(fspace->sect_addr)) || 
+             ((fspace->serial_sect_count > 0) && 
+              (fspace->sect_size > 0) && 
+              (fspace->alloc_sect_size == (size_t)fspace->sect_size)));
 
-        /* Total space tracked */
-        H5F_ENCODE_LENGTH(f, p, fspace->tot_space);
+    /* Magic number */
+    HDmemcpy(image, H5FS_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    image += H5_SIZEOF_MAGIC;
 
-        /* Total # of free space sections tracked */
-        H5F_ENCODE_LENGTH(f, p, fspace->tot_sect_count);
+    /* Version # */
+    *image++ = H5FS_HDR_VERSION;
 
-        /* # of serializable free space sections tracked */
-        H5F_ENCODE_LENGTH(f, p, fspace->serial_sect_count);
+    /* Client ID */
+    *image++ = fspace->client;
 
-        /* # of ghost free space sections tracked */
-        H5F_ENCODE_LENGTH(f, p, fspace->ghost_sect_count);
+    /* Total space tracked */
+    H5F_ENCODE_LENGTH(f, image, fspace->tot_space);
 
-        /* # of section classes */
-        UINT16ENCODE(p, fspace->nclasses);
+    /* Total # of free space sections tracked */
+    H5F_ENCODE_LENGTH(f, image, fspace->tot_sect_count);
 
-        /* Shrink percent */
-        UINT16ENCODE(p, fspace->shrink_percent);
+    /* # of serializable free space sections tracked */
+    H5F_ENCODE_LENGTH(f, image, fspace->serial_sect_count);
 
-        /* Expand percent */
-        UINT16ENCODE(p, fspace->expand_percent);
+    /* # of ghost free space sections tracked */
+    H5F_ENCODE_LENGTH(f, image, fspace->ghost_sect_count);
 
-        /* Size of address space free space sections are within (log2 of actual value) */
-        UINT16ENCODE(p, fspace->max_sect_addr);
+    /* # of section classes */
+    UINT16ENCODE(image, fspace->nclasses);
 
-        /* Max. size of section to track */
-        H5F_ENCODE_LENGTH(f, p, fspace->max_sect_size);
+    /* Shrink percent */
+    UINT16ENCODE(image, fspace->shrink_percent);
 
-        /* Address of serialized free space sections */
-        H5F_addr_encode(f, &p, fspace->sect_addr);
+    /* Expand percent */
+    UINT16ENCODE(image, fspace->expand_percent);
 
-        /* Size of serialized free space sections */
-        H5F_ENCODE_LENGTH(f, p, fspace->sect_size);
+    /* Size of address space free space sections are within (log2 of 
+     * actual value) 
+     */
+    UINT16ENCODE(image, fspace->max_sect_addr);
 
-        /* Allocated size of serialized free space sections */
-        H5F_ENCODE_LENGTH(f, p, fspace->alloc_sect_size);
+    /* Max. size of section to track */
+    H5F_ENCODE_LENGTH(f, image, fspace->max_sect_size);
 
-        /* Compute checksum */
-        metadata_chksum = H5_checksum_metadata(hdr, (size_t)(p - (uint8_t *)hdr), 0);
+    /* Address of serialized free space sections */
+    H5F_addr_encode(f, &image, fspace->sect_addr);
 
-        /* Metadata checksum */
-        UINT32ENCODE(p, metadata_chksum);
+    /* Size of serialized free space sections */
+    H5F_ENCODE_LENGTH(f, image, fspace->sect_size);
 
-	/* Write the free space header. */
-        HDassert((size_t)(p - hdr) == fspace->hdr_size);
-	if(H5F_block_write(f, H5FD_MEM_FSPACE_HDR, addr, fspace->hdr_size, dxpl_id, hdr) < 0)
-	    HGOTO_ERROR(H5E_FSPACE, H5E_CANTFLUSH, FAIL, "unable to save free space header to disk")
+    /* Allocated size of serialized free space sections */
+    H5F_ENCODE_LENGTH(f, image, fspace->alloc_sect_size);
 
-	fspace->cache_info.is_dirty = FALSE;
-    } /* end if */
+    /* Compute checksum */
+    metadata_chksum = H5_checksum_metadata((uint8_t *)_image, (size_t)(image - (uint8_t *)_image), 0);
 
-    if(destroy)
-        if(H5FS_cache_hdr_dest(f, fspace) < 0)
-	    HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to destroy free space header")
+    /* Metadata checksum */
+    UINT32ENCODE(image, metadata_chksum);
 
-done:
-    /* Release resources */
-    if(wb && H5WB_unwrap(wb) < 0)
-        HDONE_ERROR(H5E_FSPACE, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+    /* sanity checks */
+    HDassert((size_t)(image - (uint8_t *)_image) == fspace->hdr_size);
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5FS_cache_hdr_flush() */
+} /* H5FS__cache_hdr_serialize() */
+
+/***************************************/
+/* no H5FS__cache_hdr_notify() function */
+/***************************************/
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_cache_hdr_dest
+ * Function:	H5FS__cache_hdr_free_icr
  *
  * Purpose:	Destroys a free space header in memory.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Note:	The metadata cache sets the object's cache_info.magic to
+ *		H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC before calling a free_icr
+ *		callback (checked in assert).
+ *
+ * Return:	Success:        SUCCEED
+ *              Failure:        FAIL
  *
  * Programmer:	Quincey Koziol
  *		koziol at ncsa.uiuc.edu
@@ -443,175 +799,174 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FS_cache_hdr_dest(H5F_t *f, H5FS_t *fspace)
+H5FS__cache_hdr_free_icr(void *_thing)
 {
-    herr_t ret_value = SUCCEED; /* Return value */
+    H5FS_t *fspace = (H5FS_t *)_thing;  /* Pointer to the object */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /* Check arguments */
+    /* Sanity checks */
     HDassert(fspace);
+    HDassert(fspace->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC);
+    HDassert(fspace->cache_info.type == H5AC_FSPACE_HDR);
 
     /* We should not still be holding on to the free space section info */
     HDassert(!fspace->sinfo);
 
-    /* If we're going to free the space on disk, the address must be valid */
-    HDassert(!fspace->cache_info.free_file_space_on_destroy || H5F_addr_defined(fspace->cache_info.addr));
-
-    /* Check for freeing file space for free space header */
-    if(fspace->cache_info.free_file_space_on_destroy) {
-        /* Sanity check */
-        HDassert(H5F_addr_defined(fspace->addr));
-
-        /* Release the space on disk */
-        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
-        if(H5MF_xfree(f, H5FD_MEM_FSPACE_HDR, H5AC_dxpl_id, fspace->cache_info.addr, (hsize_t)fspace->hdr_size) < 0)
-            HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to free free space header")
-    } /* end if */
-
     /* Destroy free space header */
-    if(H5FS_hdr_dest(fspace) < 0)
+    if(H5FS__hdr_dest(fspace) < 0)
         HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to destroy free space header")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FS_cache_hdr_dest() */
+} /* end H5FS__cache_hdr_free_icr() */
+
+/********************************************************/
+/* metadata cache callback definitions for section info */
+/********************************************************/
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_cache_hdr_clear
+ * Function:	H5FS__cache_sinfo_get_load_size()
  *
- * Purpose:	Mark a free space header in memory as non-dirty.
+ * Purpose:	Compute the size of the on disk image of the free space 
+ *		manager section info, and place this value in *image_len.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		May  2 2006
+ * Programmer:	John Mainzer
+ *		7/7/14
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5FS_cache_hdr_clear(H5F_t *f, H5FS_t *fspace, hbool_t destroy)
+static herr_t 
+H5FS__cache_sinfo_get_load_size(const void *_image, void  *_udata, size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    herr_t ret_value = SUCCEED;         /* Return value */
+    const uint8_t *image = (const uint8_t *)_image;     /* Pointer into raw data buffer */
+    const H5FS_t *fspace;        			/* free space manager */
+    H5FS_sinfo_cache_ud_t *udata = (H5FS_sinfo_cache_ud_t *)_udata; /* User data for callback */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR
 
-    /*
-     * Check arguments.
-     */
+    /* Sanity checks */
+    HDassert(udata);
+    fspace = udata->fspace;
     HDassert(fspace);
+    HDassert(fspace->sect_size > 0);
+    HDassert(image_len);
 
-    /* Reset the dirty flag.  */
-    fspace->cache_info.is_dirty = FALSE;
-
-    if(destroy)
-        if(H5FS_cache_hdr_dest(f, fspace) < 0)
-	    HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to destroy free space header")
+    if(image == NULL)
+	*image_len = (size_t)(fspace->sect_size);
+    else {
+        HDassert(actual_len);
+        HDassert(*actual_len == *image_len);
+    }
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FS_cache_hdr_clear() */
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FS__cache_sinfo_get_load_size() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_cache_hdr_size
+ * Function:    H5FS__cache_sinfo_verify_chksum
  *
- * Purpose:	Compute the size in bytes of a free space header
- *		on disk, and return it in *size_ptr.  On failure,
- *		the value of *size_ptr is undefined.
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		May  2 2006
+ * Programmer:	Vailin Choi; Aug 2015
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5FS_cache_hdr_size(const H5F_t H5_ATTR_UNUSED *f, const H5FS_t *fspace, size_t *size_ptr)
+htri_t
+H5FS__cache_sinfo_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSED *_udata)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+    htri_t ret_value = TRUE;	/* Return value */
 
-    /* check arguments */
-    HDassert(f);
-    HDassert(fspace);
-    HDassert(size_ptr);
+    FUNC_ENTER_STATIC_NOERR
 
-    /* Set size value */
-    *size_ptr = fspace->hdr_size;
+    /* Check arguments */
+    HDassert(image);
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5FS_cache_hdr_size() */
+    /* Get stored and computed checksums */
+    H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
+
+    if(stored_chksum != computed_chksum)
+        ret_value = FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FS__cache_sinfo_verify_chksum() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_cache_sinfo_load
+ * Function:	H5FS__cache_sinfo_deserialize
  *
- * Purpose:	Loads free space sections from the disk.
+ * Purpose:	Given a buffer containing the on disk image of the free space
+ *		manager section info, allocate an instance of H5FS_sinfo_t, load
+ *		it with the data contained in the image, and return a pointer to
+ *		the new instance.
  *
- * Return:      Success:        Pointer to a new free space section info
- *              Failure:        NULL
+ * Return:	Success:	Pointer to in core representation
+ *		Failure:	NULL
  *
- * Programmer:  Quincey Koziol
- *              koziol at ncsa.uiuc.edu
- *              July 31 2006
+ * Programmer:	John Mainzer
+ *		7/7/14
  *
  *-------------------------------------------------------------------------
  */
-static H5FS_sinfo_t *
-H5FS_cache_sinfo_load(H5F_t *f, hid_t dxpl_id, haddr_t H5_ATTR_UNUSED addr, void *_udata)
+static void *
+H5FS__cache_sinfo_deserialize(const void *_image, size_t len, void *_udata,
+    hbool_t *dirty)
 {
-    H5FS_sinfo_t	*sinfo = NULL;  /* Free space section info */
-    H5FS_sinfo_cache_ud_t *udata = (H5FS_sinfo_cache_ud_t *)_udata; /* user data for callback */
-    haddr_t             fs_addr;        /* Free space header address */
-    size_t              old_sect_size;  /* Old section size */
-    uint8_t		*buf = NULL;    /* Temporary buffer */
-    const uint8_t	*p;             /* Pointer into raw data buffer */
-    uint32_t            stored_chksum;  /* Stored metadata checksum value */
-    uint32_t            computed_chksum; /* Computed metadata checksum value */
-    H5FS_sinfo_t	*ret_value;     /* Return value */
-
-    FUNC_ENTER_NOAPI_NOINIT
-
-    /* Check arguments */
-    HDassert(f);
+    H5FS_sinfo_cache_ud_t  *udata = (H5FS_sinfo_cache_ud_t *)_udata;    /* User data for callback */
+    H5FS_t                 *fspace;         /* free space manager */
+    H5FS_sinfo_t           *sinfo = NULL;   /* Free space section info */
+    haddr_t                 fs_addr;        /* Free space header address */
+    size_t                  old_sect_size;  /* Old section size */
+    const uint8_t          *image = (const uint8_t *)_image;    /* Pointer into raw data buffer */
+    uint32_t                stored_chksum;  /* Stored metadata checksum  */
+    void *                  ret_value = NULL;   /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(image);
     HDassert(udata);
+    fspace = udata->fspace;
+    HDassert(fspace);
+    HDassert(fspace->sect_size == len);
+    HDassert(dirty);
 
     /* Allocate a new free space section info */
-    if(NULL == (sinfo = H5FS_sinfo_new(udata->f, udata->fspace)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
-
-    /* Allocate space for the buffer to serialize the sections into */
-    H5_CHECKED_ASSIGN(old_sect_size, size_t, udata->fspace->sect_size, hsize_t);
-    if(NULL == (buf = H5FL_BLK_MALLOC(sect_block, (size_t)udata->fspace->sect_size)))
+    if(NULL == (sinfo = H5FS_sinfo_new(udata->f, fspace)))
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
 
-    /* Read buffer from disk */
-    if(H5F_block_read(f, H5FD_MEM_FSPACE_SINFO, udata->fspace->sect_addr, (size_t)udata->fspace->sect_size, dxpl_id, buf) < 0)
-	HGOTO_ERROR(H5E_FSPACE, H5E_READERROR, NULL, "can't read free space sections")
-
-    /* Deserialize free sections from buffer available */
-    p = buf;
+    /* initialize old_sect_size */
+    H5_CHECKED_ASSIGN(old_sect_size, size_t, udata->fspace->sect_size, hsize_t);
 
     /* Magic number */
-    if(HDmemcmp(p, H5FS_SINFO_MAGIC, (size_t)H5_SIZEOF_MAGIC))
-	HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "wrong free space sections signature")
-    p += H5_SIZEOF_MAGIC;
+    if(HDmemcmp(image, H5FS_SINFO_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "wrong free space sections signature")
+    image += H5_SIZEOF_MAGIC;
 
     /* Version */
-    if(*p++ != H5FS_SINFO_VERSION)
-	HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "wrong free space sections version")
+    if(*image++ != H5FS_SINFO_VERSION)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "wrong free space sections version")
 
     /* Address of free space header for these sections */
-    H5F_addr_decode(udata->f, &p, &fs_addr);
+    H5F_addr_decode(udata->f, &image, &fs_addr);
     if(H5F_addr_ne(fs_addr, udata->fspace->addr))
-	HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "incorrect header address for free space sections")
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, NULL, "incorrect header address for free space sections")
 
     /* Check for any serialized sections */
-    if(udata->fspace->serial_sect_count > 0) {
+    if(fspace->serial_sect_count > 0) {
         hsize_t old_tot_sect_count;     /* Total section count from header */
         hsize_t old_serial_sect_count;  /* Total serializable section count from header */
         hsize_t old_ghost_sect_count;   /* Total ghost section count from header */
@@ -622,27 +977,27 @@ H5FS_cache_sinfo_load(H5F_t *f, hid_t dxpl_id, haddr_t H5_ATTR_UNUSED addr, void
         sect_cnt_size = H5VM_limit_enc_size((uint64_t)udata->fspace->serial_sect_count);
 
         /* Reset the section count, the "add" routine will update it */
-        old_tot_sect_count = udata->fspace->tot_sect_count;
-        old_serial_sect_count = udata->fspace->serial_sect_count;
-        old_ghost_sect_count = udata->fspace->ghost_sect_count;
-        old_tot_space = udata->fspace->tot_space;
-        udata->fspace->tot_sect_count = 0;
-        udata->fspace->serial_sect_count = 0;
-        udata->fspace->ghost_sect_count = 0;
-        udata->fspace->tot_space = 0;
-
-        /* Walk through the buffer, deserializing sections */
+        old_tot_sect_count = fspace->tot_sect_count;
+        old_serial_sect_count = fspace->serial_sect_count;
+        old_ghost_sect_count = fspace->ghost_sect_count;
+        old_tot_space = fspace->tot_space;
+        fspace->tot_sect_count = 0;
+        fspace->serial_sect_count = 0;
+        fspace->ghost_sect_count = 0;
+        fspace->tot_space = 0;
+
+        /* Walk through the image, deserializing sections */
         do {
             hsize_t sect_size;      /* Current section size */
             size_t node_count;      /* # of sections of this size */
             size_t u;               /* Local index variable */
 
             /* The number of sections of this node's size */
-            UINT64DECODE_VAR(p, node_count, sect_cnt_size);
+            UINT64DECODE_VAR(image, node_count, sect_cnt_size);
             HDassert(node_count);
 
             /* The size of the sections for this node */
-            UINT64DECODE_VAR(p, sect_size, sinfo->sect_len_size);
+            UINT64DECODE_VAR(image, sect_size, sinfo->sect_len_size);
             HDassert(sect_size);
 
             /* Loop over nodes of this size */
@@ -653,299 +1008,359 @@ H5FS_cache_sinfo_load(H5F_t *f, hid_t dxpl_id, haddr_t H5_ATTR_UNUSED addr, void
                 unsigned des_flags;     /* Flags from deserialize callback */
 
                 /* The address of the section */
-                UINT64DECODE_VAR(p, sect_addr, sinfo->sect_off_size);
+                UINT64DECODE_VAR(image, sect_addr, sinfo->sect_off_size);
 
                 /* The type of this section */
-                sect_type = *p++;
+                sect_type = *image++;
 
                 /* Call 'deserialize' callback for this section */
                 des_flags = 0;
                 HDassert(udata->fspace->sect_cls[sect_type].deserialize);
-                if(NULL == (new_sect = (*udata->fspace->sect_cls[sect_type].deserialize)(&udata->fspace->sect_cls[sect_type], udata->dxpl_id, p, sect_addr, sect_size, &des_flags)))
+                if(NULL == (new_sect = (*fspace->sect_cls[sect_type].deserialize) (&fspace->sect_cls[sect_type], udata->dxpl_id, image, sect_addr, sect_size, &des_flags)))
                     HGOTO_ERROR(H5E_FSPACE, H5E_CANTDECODE, NULL, "can't deserialize section")
 
-                /* Update offset in serialization buffer */
-                p += udata->fspace->sect_cls[sect_type].serial_size;
+                /* Update offset in serialization image */
+                image += udata->fspace->sect_cls[sect_type].serial_size;
 
                 /* Insert section in free space manager, unless requested not to */
                 if(!(des_flags & H5FS_DESERIALIZE_NO_ADD))
                     if(H5FS_sect_add(udata->f, udata->dxpl_id, udata->fspace, new_sect, H5FS_ADD_DESERIALIZING, NULL) < 0)
                         HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, NULL, "can't add section to free space manager")
             } /* end for */
-        } while(p < ((buf + old_sect_size) - H5FS_SIZEOF_CHKSUM));
+        } while(image < (((const uint8_t *)_image + old_sect_size) - H5FS_SIZEOF_CHKSUM));
 
         /* Sanity check */
-        HDassert((size_t)(p - buf) == (old_sect_size - H5FS_SIZEOF_CHKSUM));
-        HDassert(old_sect_size == udata->fspace->sect_size);
-        HDassert(old_tot_sect_count == udata->fspace->tot_sect_count);
-        HDassert(old_serial_sect_count == udata->fspace->serial_sect_count);
-        HDassert(old_ghost_sect_count == udata->fspace->ghost_sect_count);
-        HDassert(old_tot_space == udata->fspace->tot_space);
+        HDassert((size_t)(image - (const uint8_t *)_image) == (old_sect_size - H5FS_SIZEOF_CHKSUM));
+        HDassert(old_sect_size == fspace->sect_size);
+        HDassert(old_tot_sect_count == fspace->tot_sect_count);
+        HDassert(old_serial_sect_count == fspace->serial_sect_count);
+        HDassert(old_ghost_sect_count == fspace->ghost_sect_count);
+        HDassert(old_tot_space == fspace->tot_space);
     } /* end if */
 
-    /* Compute checksum on indirect block */
-    computed_chksum = H5_checksum_metadata(buf, (size_t)(p - (const uint8_t *)buf), 0);
+    /* checksum verification already done in verify_chksum cb */
 
     /* Metadata checksum */
-    UINT32DECODE(p, stored_chksum);
-
-    /* Verify checksum */
-    if(stored_chksum != computed_chksum)
-	HGOTO_ERROR(H5E_FSPACE, H5E_BADVALUE, NULL, "incorrect metadata checksum for fractal heap indirect block")
+    UINT32DECODE(image, stored_chksum);
 
     /* Sanity check */
-    HDassert((size_t)(p - (const uint8_t *)buf) == old_sect_size);
+    HDassert((size_t)(image - (const uint8_t *)_image) == old_sect_size);
 
     /* Set return value */
     ret_value = sinfo;
 
 done:
-    if(buf)
-        buf = H5FL_BLK_FREE(sect_block, buf);
     if(!ret_value && sinfo)
         if(H5FS_sinfo_dest(sinfo) < 0)
             HDONE_ERROR(H5E_FSPACE, H5E_CANTFREE, NULL, "unable to destroy free space info")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FS_cache_sinfo_load() */ /*lint !e818 Can't make udata a pointer to const */
+} /* end H5FS__cache_sinfo_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sinfo_serialize_sect_cb
+ * Function:    H5FS__cache_sinfo_image_len
  *
- * Purpose:	Skip list iterator callback to serialize free space sections
- *              of a particular size
+ * Purpose:     Compute the size of the data structure on disk and return
+ *              it in *image_len.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:	Quincey Koziol
- *              Monday, May  8, 2006
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              August 14, 2013
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FS_sinfo_serialize_sect_cb(void *_item, void H5_ATTR_UNUSED *key, void *_udata)
+H5FS__cache_sinfo_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    H5FS_section_class_t *sect_cls;     /* Class of section */
-    H5FS_section_info_t *sect= (H5FS_section_info_t *)_item;   /* Free space section to work on */
-    H5FS_iter_ud_t *udata = (H5FS_iter_ud_t *)_udata; /* Callback info */
-    herr_t ret_value = SUCCEED;         /* Return value */
-
-    FUNC_ENTER_NOAPI_NOINIT
-
-    /* Check arguments. */
-    HDassert(sect);
-    HDassert(udata->sinfo);
-    HDassert(udata->p);
+    const H5FS_sinfo_t *sinfo = (const H5FS_sinfo_t *)_thing;   /* Pointer to the object */
+    const H5FS_t *fspace;               /* Free space header */
 
-    /* Get section's class */
-    sect_cls = &udata->sinfo->fspace->sect_cls[sect->type];
+    FUNC_ENTER_STATIC_NOERR
 
-    /* Check if this section should be serialized (i.e. is not a ghost section) */
-    if(!(sect_cls->flags & H5FS_CLS_GHOST_OBJ)) {
-        /* The address of the section */
-        UINT64ENCODE_VAR(*udata->p, sect->addr, udata->sinfo->sect_off_size);
-
-        /* The type of this section */
-        *(*udata->p)++ = (uint8_t)sect->type;
-
-        /* Call 'serialize' callback for this section */
-        if(sect_cls->serialize) {
-            if((*sect_cls->serialize)(sect_cls, sect, *udata->p) < 0)
-                HGOTO_ERROR(H5E_FSPACE, H5E_CANTSERIALIZE, FAIL, "can't syncronize section")
+    /* Sanity checks */
+    HDassert(sinfo);
+    HDassert(sinfo->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(sinfo->cache_info.type == H5AC_FSPACE_SINFO);
+    fspace = sinfo->fspace;
+    HDassert(fspace);
+    HDassert(fspace->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(fspace->cache_info.type == H5AC_FSPACE_HDR);
+    HDassert(image_len);
 
-            /* Update offset in serialization buffer */
-            (*udata->p) += sect_cls->serial_size;
-        } /* end if */
-        else
-            HDassert(sect_cls->serial_size == 0);
-    } /* end if */
+    /* Set the image length size */
+    H5_CHECKED_ASSIGN(*image_len, size_t, sinfo->fspace->alloc_sect_size, hsize_t);
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5FS_sinfo_serialize_sect_cb() */
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5FS__cache_sinfo_image_len() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sinfo_serialize_node_cb
+ * Function:	H5FS__cache_sinfo_pre_serialize
  *
- * Purpose:	Skip list iterator callback to serialize free space sections
- *              in a bin
+ * Purpose:	The objective of this function is to test to see if file space 
+ *		for the section info is located in temporary (AKA imaginary) file 
+ *		space.  If it is, relocate file space for the section info to 
+ *		regular file space.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
  *
- * Programmer:	Quincey Koziol
- *              Monday, May  8, 2006
+ * Programmer:	John Mainzer
+ *		7/7/14
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5FS_sinfo_serialize_node_cb(void *_item, void H5_ATTR_UNUSED *key, void *_udata)
+static herr_t 
+H5FS__cache_sinfo_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
+    haddr_t addr, size_t len, size_t H5_ATTR_UNUSED compressed_len, haddr_t *new_addr,
+    size_t *new_len, size_t H5_ATTR_UNUSED *new_compressed_len, unsigned *flags)
 {
-    H5FS_node_t *fspace_node = (H5FS_node_t *)_item;   /* Free space size node to work on */
-    H5FS_iter_ud_t *udata = (H5FS_iter_ud_t *)_udata; /* Callback info */
-    herr_t ret_value = SUCCEED;         /* Return value */
+    H5FS_sinfo_t 	*sinfo = (H5FS_sinfo_t *)_thing;        /* Pointer to the object */
+    H5FS_t 		*fspace;                /* Free space header */
+    haddr_t             sinfo_addr;             /* Address for section info */
+    herr_t              ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /* Check arguments. */
-    HDassert(fspace_node);
-    HDassert(udata->sinfo);
-    HDassert(udata->p);
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(sinfo);
+    HDassert(sinfo->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(sinfo->cache_info.type == H5AC_FSPACE_SINFO);
+    fspace = sinfo->fspace;
+    HDassert(fspace->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(fspace->cache_info.type == H5AC_FSPACE_HDR);
+    HDassert(fspace->cache_info.is_pinned);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(H5F_addr_eq(fspace->sect_addr, addr));
+    HDassert(fspace->sect_size == len);
+    HDassert(new_addr);
+    HDassert(new_len);
+    HDassert(flags);
 
-    /* Check if this node has any serializable sections */
-    if(fspace_node->serial_count > 0) {
-        /* The number of serializable sections of this node's size */
-        UINT64ENCODE_VAR(*udata->p, fspace_node->serial_count, udata->sect_cnt_size);
+    /* we shouldn't be called if the section info is empty */
+    HDassert(fspace->serial_sect_count > 0);
 
-        /* The size of the sections for this node */
-        UINT64ENCODE_VAR(*udata->p, fspace_node->sect_size, udata->sinfo->sect_len_size);
+    sinfo_addr = addr; /* this will change if we relocate the section data */
 
-        /* Iterate through all the sections of this size */
-        HDassert(fspace_node->sect_list);
-        if(H5SL_iterate(fspace_node->sect_list, H5FS_sinfo_serialize_sect_cb, udata) < 0)
-            HGOTO_ERROR(H5E_FSPACE, H5E_BADITER, FAIL, "can't iterate over section nodes")
+    /* Check for section info at temporary address */
+    if(H5F_IS_TMP_ADDR(f, fspace->sect_addr)) {
+        /* Sanity check */
+        HDassert(fspace->sect_size > 0);
+        HDassert(H5F_addr_eq(fspace->sect_addr, addr));
+
+        /* Allocate space for the section info in file */
+        if(HADDR_UNDEF == (sinfo_addr = H5MF_alloc((H5F_t *)f, H5FD_MEM_FSPACE_SINFO, dxpl_id, fspace->sect_size)))
+            HGOTO_ERROR(H5E_FSPACE, H5E_NOSPACE, FAIL, "file allocation failed for free space sections")
+
+        fspace->alloc_sect_size = (size_t)fspace->sect_size;
+
+        /* Sanity check */
+        HDassert(!H5F_addr_eq(sinfo->fspace->sect_addr, sinfo_addr));
+
+        /* Let the metadata cache know the section info moved */
+        if(H5AC_move_entry((H5F_t *)f, H5AC_FSPACE_SINFO, sinfo->fspace->sect_addr, sinfo_addr) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTMOVE, FAIL, "unable to move section info")
+
+        /* Update the internal address for the section info */
+        sinfo->fspace->sect_addr = sinfo_addr;
+
+        /* Mark free space header as dirty */
+        if(H5AC_mark_entry_dirty(fspace) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty")
     } /* end if */
 
+    if(!H5F_addr_eq(addr, sinfo_addr)) {
+        *new_addr = sinfo_addr;
+        *flags = H5C__SERIALIZE_MOVED_FLAG;
+    } /* end if */
+    else
+        *flags = 0;
+
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5FS_sinfo_serialize_node_cb() */
+} /* end H5FS__cache_sinfo_pre_serialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_cache_sinfo_flush
+ * Function:	H5FS__cache_sinfo_serialize
  *
- * Purpose:	Flushes a dirty free space section info to disk.
+ * Purpose:	Given an instance of H5FS_sinfo_t and a suitably sized buffer,
+ *		serialize the contents of the instance of H5FS_sinfo_t and write 
+ *		its contents to the buffer.  This buffer will be used to write 
+ *		the image of the instance to file.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
  *
- * Programmer:  Quincey Koziol
- *              koziol at ncsa.uiuc.edu
- *              July 31 2006
+ * Programmer:	John Mainzer
+ *		6/21/14
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5FS_cache_sinfo_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5FS_sinfo_t *sinfo, unsigned H5_ATTR_UNUSED * flags_ptr)
+static herr_t 
+H5FS__cache_sinfo_serialize(const H5F_t *f, void *_image, size_t len,
+    void *_thing)
 {
-    herr_t ret_value = SUCCEED;         /* Return value */
+    H5FS_sinfo_t        *sinfo = (H5FS_sinfo_t *)_thing;        /* Pointer to the object */
+    H5FS_t              *fspace;            /* Free space header */
+    H5FS_iter_ud_t      udata;              /* User data for callbacks */
+    uint8_t             *image = (uint8_t *)_image;     /* Pointer into raw data buffer */
+    uint32_t            metadata_chksum;    /* Computed metadata checksum value */
+    unsigned            bin;                /* Current bin we are on */
+    herr_t              ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /* check arguments */
+    /* Sanity checks */
     HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    HDassert(image);
     HDassert(sinfo);
-    HDassert(sinfo->fspace);
-    HDassert(sinfo->fspace->sect_cls);
-
-    if(sinfo->cache_info.is_dirty || sinfo->dirty) {
-        H5FS_iter_ud_t udata;       /* User data for callbacks */
-        uint8_t	*buf = NULL;        /* Temporary raw data buffer */
-        uint8_t *p;                 /* Pointer into raw data buffer */
-        uint32_t metadata_chksum;   /* Computed metadata checksum value */
-        unsigned bin;               /* Current bin we are on */
-
-        /* Sanity check address */
-        if(H5F_addr_ne(addr, sinfo->fspace->sect_addr))
-            HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, FAIL, "incorrect address for free space sections")
-
-        /* Allocate temporary buffer */
-        if((buf = H5FL_BLK_MALLOC(sect_block, (size_t)sinfo->fspace->sect_size)) == NULL)
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
-
-        p = buf;
-
-        /* Magic number */
-        HDmemcpy(p, H5FS_SINFO_MAGIC, (size_t)H5_SIZEOF_MAGIC);
-        p += H5_SIZEOF_MAGIC;
-
-        /* Version # */
-        *p++ = H5FS_SINFO_VERSION;
-
-        /* Address of free space header for these sections */
-        H5F_addr_encode(f, &p, sinfo->fspace->addr);
-
-        /* Set up user data for iterator */
-        udata.sinfo = sinfo;
-        udata.p = &p;
-        udata.sect_cnt_size = H5VM_limit_enc_size((uint64_t)sinfo->fspace->serial_sect_count);
-
-        /* Iterate over all the bins */
-        for(bin = 0; bin < sinfo->nbins; bin++) {
-            /* Check if there are any sections in this bin */
-            if(sinfo->bins[bin].bin_list) {
-                /* Iterate over list of section size nodes for bin */
-                if(H5SL_iterate(sinfo->bins[bin].bin_list, H5FS_sinfo_serialize_node_cb, &udata) < 0)
-                    HGOTO_ERROR(H5E_FSPACE, H5E_BADITER, FAIL, "can't iterate over section size nodes")
-            } /* end if */
-        } /* end for */
+    HDassert(sinfo->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(sinfo->cache_info.type == H5AC_FSPACE_SINFO);
+    fspace = sinfo->fspace;
+    HDassert(fspace->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(fspace->cache_info.type == H5AC_FSPACE_HDR);
+    HDassert(fspace->cache_info.is_pinned);
+    HDassert(fspace->sect_size == len);
+    HDassert(fspace->sect_cls);
 
-        /* Compute checksum */
-        metadata_chksum = H5_checksum_metadata(buf, (size_t)(p - buf), 0);
+    /* Magic number */
+    HDmemcpy(image, H5FS_SINFO_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    image += H5_SIZEOF_MAGIC;
 
-        /* Metadata checksum */
-        UINT32ENCODE(p, metadata_chksum);
+    /* Version # */
+    *image++ = H5FS_SINFO_VERSION;
 
-        /* Sanity check */
-        HDassert((size_t)(p - buf) == sinfo->fspace->sect_size);
-        HDassert(sinfo->fspace->sect_size <= sinfo->fspace->alloc_sect_size);
+    /* Address of free space header for these sections */
+    H5F_addr_encode(f, &image, sinfo->fspace->addr);
 
-        /* Write buffer to disk */
-        if(H5F_block_write(f, H5FD_MEM_FSPACE_SINFO, sinfo->fspace->sect_addr, (size_t)sinfo->fspace->sect_size, dxpl_id, buf) < 0)
-            HGOTO_ERROR(H5E_FSPACE, H5E_CANTFLUSH, FAIL, "unable to save free space sections to disk")
+    /* Set up user data for iterator */
+    udata.sinfo = sinfo;
+    udata.image = ℑ
+    udata.sect_cnt_size = H5VM_limit_enc_size((uint64_t)sinfo->fspace->serial_sect_count);
 
-        buf = H5FL_BLK_FREE(sect_block, buf);
+    /* Iterate over all the bins */
+    for(bin = 0; bin < sinfo->nbins; bin++)
+        /* Check if there are any sections in this bin */
+        if(sinfo->bins[bin].bin_list)
+            /* Iterate over list of section size nodes for bin */
+            if(H5SL_iterate(sinfo->bins[bin].bin_list, H5FS__sinfo_serialize_node_cb, &udata) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_BADITER, FAIL, "can't iterate over section size nodes")
 
-	sinfo->cache_info.is_dirty = FALSE;
-        sinfo->dirty = FALSE;
-    } /* end if */
 
-    if(destroy)
-        if(H5FS_cache_sinfo_dest(f, sinfo) < 0)
-	    HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to destroy free space section info")
+    /* Compute checksum */
+    metadata_chksum = H5_checksum_metadata(_image, (size_t)(image - (uint8_t *)_image), 0);
+
+    /* Metadata checksum */
+    UINT32ENCODE(image, metadata_chksum);
+
+    /* Sanity check */
+    HDassert((size_t)(image - (uint8_t *)_image) == sinfo->fspace->sect_size);
+    HDassert(sinfo->fspace->sect_size <= sinfo->fspace->alloc_sect_size);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5FS_cache_sinfo_flush() */
+} /* end H5FS__cache_sinfo_serialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_cache_sinfo_dest
+ * Function:    H5FS__cache_sinfo_notify
  *
- * Purpose:	Destroys a free space section info in memory.
+ * Purpose:     Handle cache action notifications
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		July 31 2006
+ * Programmer:  Dana Robinson
+ *              Fall 2012
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5FS_cache_sinfo_dest(H5F_t *f, H5FS_sinfo_t *sinfo)
+herr_t
+H5FS__cache_sinfo_notify(H5AC_notify_action_t action, void *_thing)
 {
-    herr_t ret_value = SUCCEED; /* Return value */
+    H5FS_sinfo_t *sinfo = (H5FS_sinfo_t *)_thing;
+    herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
-
-    /* Check arguments */
+    
+    /* Sanity check */
     HDassert(sinfo);
 
-    /* If we're going to free the space on disk, the address must be valid */
-    HDassert(!sinfo->cache_info.free_file_space_on_destroy || H5F_addr_defined(sinfo->cache_info.addr));
+    /* Check if the file was opened with SWMR-write access */
+    if(sinfo->fspace->swmr_write) {
+        /* Determine which action to take */
+        switch(action) {
+            case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+	    case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+                /* Create flush dependency on parent */
+                if(H5FS__create_flush_depend((H5AC_info_t *)sinfo->fspace, (H5AC_info_t *)sinfo) < 0)
+                    HGOTO_ERROR(H5E_FSPACE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency between data block and header, address = %llu", (unsigned long long)sinfo->fspace->sect_addr)
+                break;
+
+	    case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+                /* do nothing */
+                break;
+
+            case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+		/* Destroy flush dependency on parent */
+                if(H5FS__destroy_flush_depend((H5AC_info_t *)sinfo->fspace, (H5AC_info_t *)sinfo) < 0)
+                    HGOTO_ERROR(H5E_FSPACE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+                break;
+
+            default:
+#ifdef NDEBUG
+                HGOTO_ERROR(H5E_FSPACE, H5E_BADVALUE, FAIL, "unknown action from metadata cache")
+#else /* NDEBUG */
+                HDassert(0 && "Unknown action?!?");
+#endif /* NDEBUG */
+        } /* end switch */
+    } /* end if */
 
-    /* Check for freeing file space for free space section info */
-    if(sinfo->cache_info.free_file_space_on_destroy) {
-        /* Sanity check */
-        HDassert(sinfo->fspace->alloc_sect_size > 0);
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FS__cache_sinfo_notify() */
 
-        /* Release the space on disk */
-        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
-        if(H5MF_xfree(f, H5FD_MEM_FSPACE_SINFO, H5AC_dxpl_id, sinfo->cache_info.addr, (hsize_t)sinfo->fspace->alloc_sect_size) < 0)
-            HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to free free space section info")
-    } /* end if */
+

+/*-------------------------------------------------------------------------
+ * Function:	H5FS__cache_sinfo_free_icr
+ *
+ * Purpose:	Free the memory used for the in core representation of the 
+ *		free space manager section info.
+ *
+ * Note:	The metadata cache sets the object's cache_info.magic to
+ *		H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC before calling a free_icr
+ *		callback (checked in assert).
+ *
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
+ *
+ * Programmer:	John Mainzer
+ *		6/21/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5FS__cache_sinfo_free_icr(void *_thing)
+{
+    H5FS_sinfo_t        *sinfo = (H5FS_sinfo_t *)_thing;    /* Pointer to the object */
+    H5FS_t              *fspace;                /* Free space header */
+    herr_t              ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(sinfo);
+    HDassert(sinfo->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC);
+    HDassert(sinfo->cache_info.type == H5AC_FSPACE_SINFO);
+    fspace = sinfo->fspace;
+    HDassert(fspace->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(fspace->cache_info.type == H5AC_FSPACE_HDR);
+    HDassert(fspace->cache_info.is_pinned);
 
     /* Destroy free space info */
     if(H5FS_sinfo_dest(sinfo) < 0)
@@ -953,73 +1368,106 @@ H5FS_cache_sinfo_dest(H5F_t *f, H5FS_sinfo_t *sinfo)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FS_cache_sinfo_dest() */
+} /* end H5FS__cache_sinfo_free_icr() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_cache_sinfo_clear
+ * Function:	H5FS__sinfo_serialize_sect_cb
  *
- * Purpose:	Mark a free space section info in memory as non-dirty.
+ * Purpose:	Skip list iterator callback to serialize free space sections
+ *              of a particular size
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      SUCCEED/FAIL
  *
  * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		July 31 2006
+ *              Monday, May  8, 2006
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FS_cache_sinfo_clear(H5F_t *f, H5FS_sinfo_t *sinfo, hbool_t destroy)
+H5FS__sinfo_serialize_sect_cb(void *_item, void H5_ATTR_UNUSED *key, void *_udata)
 {
+    H5FS_section_class_t *sect_cls;     /* Class of section */
+    H5FS_section_info_t *sect= (H5FS_section_info_t *)_item;   /* Free space section to work on */
+    H5FS_iter_ud_t *udata = (H5FS_iter_ud_t *)_udata; /* Callback info */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /*
-     * Check arguments.
-     */
-    HDassert(sinfo);
+    /* Check arguments. */
+    HDassert(sect);
+    HDassert(udata->sinfo);
+    HDassert(udata->image);
 
-    /* Reset the dirty flag.  */
-    sinfo->cache_info.is_dirty = FALSE;
+    /* Get section's class */
+    sect_cls = &udata->sinfo->fspace->sect_cls[sect->type];
+
+    /* Check if this section should be serialized (i.e. is not a ghost section) */
+    if(!(sect_cls->flags & H5FS_CLS_GHOST_OBJ)) {
+        /* The address of the section */
+        UINT64ENCODE_VAR(*udata->image, sect->addr, udata->sinfo->sect_off_size);
 
-    if(destroy)
-        if(H5FS_cache_sinfo_dest(f, sinfo) < 0)
-	    HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to destroy free space section info")
+        /* The type of this section */
+        *(*udata->image)++ = (uint8_t)sect->type;
+
+        /* Call 'serialize' callback for this section */
+        if(sect_cls->serialize) {
+            if((*sect_cls->serialize)(sect_cls, sect, *udata->image) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTSERIALIZE, FAIL, "can't syncronize section")
+
+            /* Update offset in serialization buffer */
+            (*udata->image) += sect_cls->serial_size;
+        } /* end if */
+        else
+            HDassert(sect_cls->serial_size == 0);
+    } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5FS_cache_sinfo_clear() */
+} /* H5FS__sinfo_serialize_sect_cb() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_cache_sinfo_size
+ * Function:	H5FS__sinfo_serialize_node_cb
  *
- * Purpose:	Compute the size in bytes of a free space section info
- *		on disk, and return it in *size_ptr.  On failure,
- *		the value of *size_ptr is undefined.
+ * Purpose:	Skip list iterator callback to serialize free space sections
+ *              in a bin
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      SUCCEED/FAIL
  *
  * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		July 31 2006
+ *              Monday, May  8, 2006
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FS_cache_sinfo_size(const H5F_t H5_ATTR_UNUSED *f, const H5FS_sinfo_t *sinfo, size_t *size_ptr)
+H5FS__sinfo_serialize_node_cb(void *_item, void H5_ATTR_UNUSED *key, void *_udata)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    H5FS_node_t *fspace_node = (H5FS_node_t *)_item;   /* Free space size node to work on */
+    H5FS_iter_ud_t *udata = (H5FS_iter_ud_t *)_udata; /* Callback info */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    /* check arguments */
-    HDassert(sinfo);
-    HDassert(size_ptr);
+    FUNC_ENTER_STATIC
 
-    /* Set size value */
-    H5_CHECKED_ASSIGN(*size_ptr, size_t, sinfo->fspace->alloc_sect_size, hsize_t);
+    /* Check arguments. */
+    HDassert(fspace_node);
+    HDassert(udata->sinfo);
+    HDassert(udata->image);
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5FS_cache_sinfo_size() */
+    /* Check if this node has any serializable sections */
+    if(fspace_node->serial_count > 0) {
+        /* The number of serializable sections of this node's size */
+        UINT64ENCODE_VAR(*udata->image, fspace_node->serial_count, udata->sect_cnt_size);
+
+        /* The size of the sections for this node */
+        UINT64ENCODE_VAR(*udata->image, fspace_node->sect_size, udata->sinfo->sect_len_size);
+
+        /* Iterate through all the sections of this size */
+        HDassert(fspace_node->sect_list);
+        if(H5SL_iterate(fspace_node->sect_list, H5FS__sinfo_serialize_sect_cb, udata) < 0)
+            HGOTO_ERROR(H5E_FSPACE, H5E_BADITER, FAIL, "can't iterate over section nodes")
+    } /* end if */
 
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS__sinfo_serialize_node_cb() */
diff --git a/src/H5FSdbg.c b/src/H5FSdbg.c
index 2cfc094..fbdeb70 100644
--- a/src/H5FSdbg.c
+++ b/src/H5FSdbg.c
@@ -15,11 +15,11 @@
 
 /*-------------------------------------------------------------------------
  *
- * Created:		H5FSdbg.c
- *			May  9 2006
- *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ * Created:     H5FSdbg.c
+ *              May  9 2006
+ *              Quincey Koziol <koziol at hdfgroup.org>
  *
- * Purpose:		Dump debugging information about a free space manager
+ * Purpose:     Dump debugging information about a free space manager
  *
  *-------------------------------------------------------------------------
  */
@@ -28,18 +28,20 @@
 /* Module Setup */
 /****************/
 
-#define H5FS_PACKAGE		/*suppress error about including H5FSpkg  */
+#include "H5FSmodule.h"         /* This source code file is part of the H5FS module */
 #define H5HF_DEBUGGING          /* Need access to fractal heap debugging routines */
 #define H5MF_DEBUGGING          /* Need access to file space debugging routines */
 
+
 /***********/
 /* Headers */
 /***********/
-#include "H5private.h"		/* Generic Functions			*/
-#include "H5Eprivate.h"		/* Error handling		  	*/
-#include "H5FSpkg.h"		/* File free space			*/
-#include "H5HFprivate.h"	/* Fractal heaps			*/
-#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5private.h"      /* Generic Functions                            */
+#include "H5Eprivate.h"     /* Error handling                               */
+#include "H5FSpkg.h"        /* File free space                              */
+#include "H5HFprivate.h"    /* Fractal heaps                                */
+#include "H5MFprivate.h"    /* File memory management                       */
+
 
 /****************/
 /* Local Macros */
@@ -77,26 +79,21 @@
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_debug
- *
- * Purpose:	Prints debugging info about a free space manager.
+ * Function:    H5FS_debug
  *
- * Return:	Non-negative on success/Negative on failure
+ * Purpose:     Prints debugging info about a free space manager.
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		May  9 2006
+ * Return:      SUCCEED/FAIL
  *
- * Modifications:
- *	Vailin Choi, July 29th, 2008
- *	  Add H5FS_CLIENT_FILE_ID for File Memory Management
+ * Programmer:  Quincey Koziol
+ *              May  9 2006
  *
  *-------------------------------------------------------------------------
  */
 herr_t
 H5FS_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int fwidth)
 {
-    H5FS_t	*fspace = NULL;         /* Free space header info */
+    H5FS_t      *fspace = NULL;         /* Free space header info */
     H5FS_hdr_cache_ud_t cache_udata;    /* User-data for cache callback */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
@@ -121,8 +118,8 @@ H5FS_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int
     /*
      * Load the free space header.
      */
-    if(NULL == (fspace = (H5FS_t *)H5AC_protect(f, dxpl_id, H5AC_FSPACE_HDR, addr, &cache_udata, H5AC_READ)))
-	HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, FAIL, "unable to load free space header")
+    if(NULL == (fspace = (H5FS_t *)H5AC_protect(f, dxpl_id, H5AC_FSPACE_HDR, addr, &cache_udata, H5AC__READ_ONLY_FLAG)))
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, FAIL, "unable to load free space header")
 
     /* Print opening message */
     HDfprintf(stream, "%*sFree Space Header...\n", indent, "");
@@ -131,45 +128,45 @@ H5FS_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int
      * Print the values.
      */
     HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
-	      "Free space client:",
-	      (fspace->client == H5FS_CLIENT_FHEAP_ID ? "Fractal heap" :
-	      (fspace->client == H5FS_CLIENT_FILE_ID ? "File" : "Unknown")));
+        "Free space client:",
+        (fspace->client == H5FS_CLIENT_FHEAP_ID ? "Fractal heap" :
+        (fspace->client == H5FS_CLIENT_FILE_ID ? "File" : "Unknown")));
     HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
-	      "Total free space tracked:",
-	      fspace->tot_space);
+        "Total free space tracked:",
+        fspace->tot_space);
     HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
-	      "Total number of free space sections tracked:",
-	      fspace->tot_sect_count);
+        "Total number of free space sections tracked:",
+        fspace->tot_sect_count);
     HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
-	      "Number of serializable free space sections tracked:",
-	      fspace->serial_sect_count);
+        "Number of serializable free space sections tracked:",
+        fspace->serial_sect_count);
     HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
-	      "Number of ghost free space sections tracked:",
-	      fspace->ghost_sect_count);
+        "Number of ghost free space sections tracked:",
+        fspace->ghost_sect_count);
     HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
-	      "Number of free space section classes:",
-	      fspace->nclasses);
+        "Number of free space section classes:",
+        (unsigned)fspace->nclasses);
     HDfprintf(stream, "%*s%-*s %u%%\n", indent, "", fwidth,
-	      "Shrink percent:",
-	      fspace->shrink_percent);
+        "Shrink percent:",
+        fspace->shrink_percent);
     HDfprintf(stream, "%*s%-*s %u%%\n", indent, "", fwidth,
-	      "Expand percent:",
-	      fspace->expand_percent);
+        "Expand percent:",
+        fspace->expand_percent);
     HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
-	      "# of bits for section address space:",
-	      fspace->max_sect_addr);
+        "# of bits for section address space:",
+        fspace->max_sect_addr);
     HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
-	      "Maximum section size:",
-	      fspace->max_sect_size);
+        "Maximum section size:",
+        fspace->max_sect_size);
     HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
-	      "Serialized sections address:",
-	      fspace->sect_addr);
+        "Serialized sections address:",
+        fspace->sect_addr);
     HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
-	      "Serialized sections size used:",
-	      fspace->sect_size);
+        "Serialized sections size used:",
+        fspace->sect_size);
     HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
-	      "Serialized sections size allocated:",
-	      fspace->alloc_sect_size);
+        "Serialized sections size allocated:",
+        fspace->alloc_sect_size);
 
 done:
     if(fspace && H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_HDR, addr, fspace, H5AC__NO_FLAGS_SET) < 0)
@@ -180,15 +177,14 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_debug
+ * Function:    H5FS_sect_debug
  *
- * Purpose:	Prints debugging info about a free space section.
+ * Purpose:     Prints debugging info about a free space section.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		May 30 2006
+ * Programmer:  Quincey Koziol
+ *              May 30 2006
  *
  *-------------------------------------------------------------------------
  */
@@ -219,15 +215,14 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sects_debug
+ * Function:    H5FS_sects_debug
  *
- * Purpose:	Prints debugging info about the free space sections.
+ * Purpose:     Prints debugging info about the free space sections.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		May  9 2006
+ * Programmer:  Quincey Koziol
+ *              May  9 2006
  *
  *-------------------------------------------------------------------------
  */
@@ -235,7 +230,7 @@ herr_t
 H5FS_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t H5_ATTR_UNUSED addr, FILE *stream, int indent, int fwidth,
     haddr_t fs_addr, haddr_t client_addr)
 {
-    H5FS_t	*fspace = NULL;         /* Free space header info */
+    H5FS_t	    *fspace = NULL;         /* Free space header info */
     H5FS_client_t client;               /* The client of the free space */
     H5FS_hdr_cache_ud_t cache_udata;    /* User-data for cache callback */
     herr_t      ret_value = SUCCEED;    /* Return value */
@@ -263,8 +258,8 @@ H5FS_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t H5_ATTR_UNUSED addr, FILE *str
     /*
      * Load the free space header.
      */
-    if(NULL == (fspace = (H5FS_t *)H5AC_protect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, &cache_udata, H5AC_READ)))
-	HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, FAIL, "unable to load free space header")
+    if(NULL == (fspace = (H5FS_t *)H5AC_protect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, &cache_udata, H5AC__READ_ONLY_FLAG)))
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, FAIL, "unable to load free space header")
 
     /* Retrieve the client id */
     client = fspace->client;
@@ -290,10 +285,8 @@ H5FS_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t H5_ATTR_UNUSED addr, FILE *str
             break;
 
         case H5FS_CLIENT_FILE_ID:
-#ifdef NOT_YET
             if(H5MF_sects_debug(f, dxpl_id, fs_addr, stream, indent + 3, MAX(0, fwidth - 3)) < 0)
                 HGOTO_ERROR(H5E_FSPACE, H5E_SYSTEM, FAIL, "unable to dump file free space sections")
-#endif /* NOT_YET */
             break;
 
         case H5FS_NUM_CLIENT_ID:
diff --git a/src/H5FSint.c b/src/H5FSint.c
new file mode 100644
index 0000000..60cedd5
--- /dev/null
+++ b/src/H5FSint.c
@@ -0,0 +1,145 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5FSint.c
+ *              Fall 2012
+ *              Dana Robinson <derobins at hdfgroup.org>
+ *
+ * Purpose:     Internal routines for free space managers.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5FSmodule.h"         /* This source code file is part of the H5FS module */
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"              /* Generic Functions                */
+#include "H5Eprivate.h"             /* Error Handling                   */
+#include "H5FSpkg.h"                /* Free Space Managers              */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FS__create_flush_depend
+ *
+ * Purpose:     Create a flush dependency between two data structure components
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS__create_flush_depend(H5AC_info_t *parent_entry, H5AC_info_t *child_entry)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+    
+    /* Sanity check */
+    HDassert(parent_entry);
+    HDassert(child_entry);
+
+    /* Create a flush dependency between parent and child entry */
+    if(H5AC_create_flush_dependency(parent_entry, child_entry) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FS__create_flush_depend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FS__destroy_flush_depend
+ *
+ * Purpose:     Destroy a flush dependency between two data structure components
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5FS__destroy_flush_depend(H5AC_info_t *parent_entry, H5AC_info_t *child_entry)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+    
+    /* Sanity check */
+    HDassert(parent_entry);
+    HDassert(child_entry);
+
+    /* Destroy a flush dependency between parent and child entry */
+    if(H5AC_destroy_flush_dependency(parent_entry, child_entry) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+        
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5FS__destroy_flush_depend() */
+
diff --git a/src/H5FSmodule.h b/src/H5FSmodule.h
new file mode 100644
index 0000000..b435b79
--- /dev/null
+++ b/src/H5FSmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5FS package.  Including this header means that the source file
+ *		is part of the H5FS package.
+ */
+#ifndef _H5FSmodule_H
+#define _H5FSmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5FS_MODULE
+#define H5_MY_PKG       H5FS
+#define H5_MY_PKG_ERR   H5E_FSPACE
+#define H5_MY_PKG_INIT  NO
+
+#endif /* _H5FSmodule_H */
+
diff --git a/src/H5FSpkg.h b/src/H5FSpkg.h
index e22e411..bb5ba7b 100644
--- a/src/H5FSpkg.h
+++ b/src/H5FSpkg.h
@@ -14,14 +14,14 @@
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
- * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
- *		Tuesday, May  2, 2006
+ * Programmer:  Quincey Koziol <koziol at hdfgroup.org>
+ *              Tuesday, May  2, 2006
  *
- * Purpose:	This file contains declarations which are visible only within
- *		the H5FS package.  Source files outside the H5FS package should
- *		include H5FSprivate.h instead.
+ * Purpose:     This file contains declarations which are visible only within
+ *              the H5FS package.  Source files outside the H5FS package should
+ *              include H5FSprivate.h instead.
  */
-#ifndef H5FS_PACKAGE
+#if !(defined H5FS_FRIEND || defined H5FS_MODULE)
 #error "Do not include this file outside the H5FS package!"
 #endif
 
@@ -38,11 +38,11 @@
 /* #define H5FS_DEBUG_ASSERT */
 
 /* Get package's private header */
-#include "H5FSprivate.h"	/* File free space                      */
+#include "H5FSprivate.h"    /* File free space                      */
 
 /* Other private headers needed by this file */
-#include "H5ACprivate.h"	/* Metadata cache			*/
-#include "H5SLprivate.h"	/* Skip lists				*/
+#include "H5ACprivate.h"    /* Metadata cache                       */
+#include "H5SLprivate.h"    /* Skip lists                           */
 
 /**************************/
 /* Package Private Macros */
@@ -96,7 +96,7 @@
 /* Callback info for loading a free space header into the cache */
 typedef struct H5FS_hdr_cache_ud_t {
     H5F_t *f;                  /* File that free space header is within */
-    size_t nclasses;                            /* Number of section classes */
+    uint16_t nclasses;                            /* Number of section classes */
     const H5FS_section_class_t **classes;       /* Array of section class info */
     void *cls_init_udata;                       /* Pointer to class init user data */
     haddr_t addr;              /* Address of header */
@@ -163,7 +163,7 @@ struct H5FS_t {
 
     /* Creation parameters */
     H5FS_client_t client;       /* Type of user of this free space manager    */
-    unsigned nclasses;          /* Number of section classes handled          */
+    uint16_t nclasses;         /* Number of section classes handled          */
     unsigned shrink_percent;    /* Percent of "normal" serialized size to shrink serialized space at */
     unsigned expand_percent;    /* Percent of "normal" serialized size to expand serialized space at */
     unsigned max_sect_addr;     /* Size of address space free sections are within (log2 of actual value) */
@@ -179,10 +179,13 @@ struct H5FS_t {
     haddr_t addr;               /* Address of free space header on disk       */
     size_t hdr_size;            /* Size of free space header on disk          */
     H5FS_sinfo_t *sinfo;        /* Section information                        */
+    hbool_t swmr_write;         /* Flag indicating the file is opened with SWMR-write access */
     unsigned sinfo_lock_count;  /* # of times the section info has been locked */
     hbool_t sinfo_protected;    /* Whether the section info was protected when locked */
     hbool_t sinfo_modified;     /* Whether the section info has been modified while locked */
-    H5AC_protect_t sinfo_accmode; /* Access mode for protecting the section info */
+    unsigned sinfo_accmode;     /* Access mode for protecting the section info */
+                                /* must be either H5C__NO_FLAGS_SET (i.e r/w)  */
+				/* or H5AC__READ_ONLY_FLAG (i.e. r/o).         */
     size_t max_cls_serial_size; /* Max. additional size of serialized form of section */
     hsize_t    threshold;      	/* Threshold for alignment              */
     hsize_t    alignment;      	/* Alignment                            */
@@ -220,8 +223,14 @@ H5FL_EXTERN(H5FS_t);
 /* Package Private Prototypes */
 /******************************/
 
+/* Generic routines */
+H5_DLL herr_t H5FS__create_flush_depend(H5AC_info_t *parent_entry,
+    H5AC_info_t *child_entry);
+H5_DLL herr_t H5FS__destroy_flush_depend(H5AC_info_t *parent_entry,
+    H5AC_info_t *child_entry);
+
 /* Free space manager header routines */
-H5_DLL H5FS_t *H5FS_new(const H5F_t *f, size_t nclasses,
+H5_DLL H5FS_t *H5FS__new(const H5F_t *f, uint16_t nclasses,
     const H5FS_section_class_t *classes[], void *cls_init_udata);
 H5_DLL herr_t H5FS_incr(H5FS_t *fspace);
 H5_DLL herr_t H5FS_decr(H5FS_t *fspace);
@@ -231,7 +240,7 @@ H5_DLL herr_t H5FS_dirty(H5FS_t *fspace);
 H5_DLL H5FS_sinfo_t *H5FS_sinfo_new(H5F_t *f, H5FS_t *fspace);
 
 /* Routines for destroying structures */
-H5_DLL herr_t H5FS_hdr_dest(H5FS_t *hdr);
+H5_DLL herr_t H5FS__hdr_dest(H5FS_t *hdr);
 H5_DLL herr_t H5FS_sinfo_dest(H5FS_sinfo_t *sinfo);
 
 /* Sanity check routines */
diff --git a/src/H5FSprivate.h b/src/H5FSprivate.h
index cbcb36a..2dacce6 100644
--- a/src/H5FSprivate.h
+++ b/src/H5FSprivate.h
@@ -15,11 +15,11 @@
 
 /*-------------------------------------------------------------------------
  *
- * Created:		H5FSprivate.h
- *			May  2 2006
- *			Quincey Koziol <koziol at ncsa.uiuc.edu>
+ * Created:     H5FSprivate.h
+ *              May  2 2006
+ *              Quincey Koziol <koziol at hdfgroup.org>
  *
- * Purpose:		Private header for library accessible file free space routines.
+ * Purpose:     Private header for library accessible file free space routines.
  *
  *-------------------------------------------------------------------------
  */
@@ -31,6 +31,7 @@
 #include "H5FSpublic.h"
 
 /* Private headers needed by this file */
+#include "H5ACprivate.h"	/* Metadata cache			*/
 #include "H5Fprivate.h"		/* File access				*/
 #include "H5FLprivate.h"	/* Free Lists                           */
 
@@ -127,8 +128,8 @@ struct H5FS_section_info_t {
 
 /* Free space client IDs for identifying user of free space */
 typedef enum H5FS_client_t {
-    H5FS_CLIENT_FHEAP_ID = 0,	/* Free space is used by fractal heap */
-    H5FS_CLIENT_FILE_ID,	/* Free space is used by file */
+    H5FS_CLIENT_FHEAP_ID = 0,   /* Free space is used by fractal heap */
+    H5FS_CLIENT_FILE_ID,        /* Free space is used by file */
     H5FS_NUM_CLIENT_ID          /* Number of free space client IDs (must be last)   */
 } H5FS_client_t;
 
@@ -147,11 +148,11 @@ typedef struct H5FS_stat_t {
     hsize_t tot_sect_count;     /* Total # of sections tracked                */
     hsize_t serial_sect_count;  /* # of serializable sections tracked         */
     hsize_t ghost_sect_count;   /* # of un-serializable sections tracked      */
-    haddr_t addr;		/* Address of free space header on disk       */
-    hsize_t hdr_size;		/* Size of the free-space header on disk      */
+    haddr_t addr;               /* Address of free space header on disk       */
+    hsize_t hdr_size;           /* Size of the free-space header on disk      */
     haddr_t sect_addr;          /* Address of the section info in the file    */
     hsize_t alloc_sect_size;    /* Allocated size of the section info in the file */
-    hsize_t sect_size;    	/* Size of the section info in the file       */
+    hsize_t sect_size;          /* Size of the section info in the file       */
 } H5FS_stat_t;
 
 /* Typedef for iteration operations */
@@ -173,17 +174,24 @@ H5FL_SEQ_EXTERN(H5FS_section_class_t);
 
 /* Free space manager routines */
 H5_DLL H5FS_t *H5FS_create(H5F_t *f, hid_t dxpl_id, haddr_t *fs_addr,
-    const H5FS_create_t *fs_create, size_t nclasses,
+    const H5FS_create_t *fs_create, uint16_t nclasses,
     const H5FS_section_class_t *classes[], void *cls_init_udata, hsize_t alignment, hsize_t threshold);
 H5_DLL H5FS_t *H5FS_open(H5F_t *f, hid_t dxpl_id, haddr_t fs_addr,
-    size_t nclasses, const H5FS_section_class_t *classes[], void *cls_init_udata, hsize_t alignment, hsize_t threshold);
+    uint16_t nclasses, const H5FS_section_class_t *classes[], void *cls_init_udata, hsize_t alignment, hsize_t threshold);
 H5_DLL herr_t H5FS_size(const H5F_t *f, const H5FS_t *fspace, hsize_t *meta_size);
 H5_DLL herr_t H5FS_delete(H5F_t *f, hid_t dxpl_id, haddr_t fs_addr);
 H5_DLL herr_t H5FS_close(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace);
+H5_DLL herr_t H5FS_alloc_hdr(H5F_t *f, H5FS_t *fspace, haddr_t *fs_addr, hid_t dxpl_id);
+H5_DLL herr_t H5FS_alloc_sect(H5F_t *f, H5FS_t *fspace, hid_t dxpl_id);
+H5_DLL herr_t H5FS_free(H5F_t *f, H5FS_t *fspace, hid_t dxpl_id);
+H5_DLL herr_t H5FS_depend(H5AC_info_t *parent_entry, H5FS_t *fs);
+H5_DLL herr_t H5FS_undepend(H5AC_info_t *parent_entry, H5FS_t *fs);
 
 /* Free space section routines */
 H5_DLL herr_t H5FS_sect_add(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
     H5FS_section_info_t *node, unsigned flags, void *op_data);
+H5_DLL htri_t H5FS_sect_try_merge(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
+    H5FS_section_info_t *sect, unsigned flags, void *op_data);
 H5_DLL htri_t H5FS_sect_try_extend(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
     haddr_t addr, hsize_t size, hsize_t extra_requested);
 H5_DLL herr_t H5FS_sect_remove(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
@@ -194,7 +202,7 @@ H5_DLL herr_t H5FS_sect_iterate(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace, H5FS_op
 H5_DLL herr_t H5FS_sect_stats(const H5FS_t *fspace, hsize_t *tot_space,
     hsize_t *nsects);
 H5_DLL herr_t H5FS_sect_change_class(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
-    H5FS_section_info_t *sect, unsigned new_class);
+    H5FS_section_info_t *sect, uint16_t new_class);
 H5_DLL htri_t H5FS_sect_try_shrink_eoa(const H5F_t *f, hid_t dxpl_id, const H5FS_t *fspace, void *op_data);
 H5_DLL herr_t H5FS_sect_query_last_sect(const H5FS_t *fspace, haddr_t *sect_addr, hsize_t *sect_size);
 
diff --git a/src/H5FSpublic.h b/src/H5FSpublic.h
index d1bae94..87debe8 100644
--- a/src/H5FSpublic.h
+++ b/src/H5FSpublic.h
@@ -17,7 +17,7 @@
  *
  * Created:             H5FSpublic.h
  *                      May  2 2006
- *                      Quincey Koziol <koziol at ncsa.uiuc.edu>
+ *                      Quincey Koziol <koziol at hdfgroup.org>
  *
  * Purpose:             Public declarations for the file free space package.
  *
diff --git a/src/H5FSsection.c b/src/H5FSsection.c
index be48ae6..62500e7 100644
--- a/src/H5FSsection.c
+++ b/src/H5FSsection.c
@@ -14,10 +14,10 @@
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
- * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ * Programmer:  Quincey Koziol <koziol at hdfgroup.org>
  *              Monday, July 31, 2006
  *
- * Purpose:	Free space tracking functions.
+ * Purpose:     Free space tracking functions.
  *
  */
 
@@ -25,7 +25,7 @@
 /* Module Setup */
 /****************/
 
-#define H5FS_PACKAGE		/*suppress error about including H5FSpkg  */
+#include "H5FSmodule.h"         /* This source code file is part of the H5FS module */
 
 
 /***********/
@@ -111,14 +111,14 @@ H5FL_DEFINE(H5FS_sinfo_t);
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sinfo_new
+ * Function:    H5FS_sinfo_new
  *
- * Purpose:	Create new section info structure
+ * Purpose:     Create new section info structure
  *
- * Return:	Success:	non-NULL, pointer to new section info struct
- *		Failure:	NULL
+ * Return:      Success:    non-NULL, pointer to new section info struct
+ *              Failure:    NULL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Monday, July 31, 2006
  *
  *-------------------------------------------------------------------------
@@ -126,8 +126,8 @@ H5FL_DEFINE(H5FS_sinfo_t);
 H5FS_sinfo_t *
 H5FS_sinfo_new(H5F_t *f, H5FS_t *fspace)
 {
-    H5FS_sinfo_t *sinfo = NULL; /* Section information struct created */
-    H5FS_sinfo_t *ret_value;    /* Return value */
+    H5FS_sinfo_t *sinfo = NULL;         /* Section information struct created */
+    H5FS_sinfo_t *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -140,7 +140,7 @@ HDfprintf(stderr, "%s: fspace->addr = %a\n", FUNC, fspace->addr);
 
     /* Allocate the free space header */
     if(NULL == (sinfo = H5FL_CALLOC(H5FS_sinfo_t)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
 
     /* Set non-zero values */
     sinfo->nbins = H5VM_log2_gen(fspace->max_sect_size);
@@ -186,30 +186,30 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sinfo_lock
+ * Function:    H5FS_sinfo_lock
  *
- * Purpose:	Make certain the section info for the free space manager is
+ * Purpose:     Make certain the section info for the free space manager is
  *              in memory.
  *
  *              Either uses existing section info owned by the free space
  *              header, loads section info from disk, or creates new section
  *              info
  *
- * Return:	Success:	non-negative
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Thursday, February  7, 2008
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5FS_sinfo_lock(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace, H5AC_protect_t accmode)
+H5FS_sinfo_lock(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace, unsigned accmode)
 {
     H5FS_sinfo_cache_ud_t cache_udata; /* User-data for cache callback */
     herr_t ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, H5AC__FREESPACE_TAG, FAIL)
+
 #ifdef H5FS_SINFO_DEBUG
 HDfprintf(stderr, "%s: Called, fspace->addr = %a, fspace->sinfo = %p, fspace->sect_addr = %a\n", FUNC, fspace->addr, fspace->sinfo, fspace->sect_addr);
 HDfprintf(stderr, "%s: fspace->alloc_sect_size = %Hu, fspace->sect_size = %Hu\n", FUNC, fspace->alloc_sect_size, fspace->sect_size);
@@ -219,14 +219,21 @@ HDfprintf(stderr, "%s: fspace->alloc_sect_size = %Hu, fspace->sect_size = %Hu\n"
     HDassert(f);
     HDassert(fspace);
 
+    /* only H5AC__READ_ONLY_FLAG may appear in accmode */
+    HDassert((accmode & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
     /* If the free space header doesn't already "own" the section info, load
      *  section info or create it
      */
     if(fspace->sinfo) {
         /* Check if the section info was protected & we want a different access mode */
+
+        /* only H5AC__READ_ONLY_FLAG may appear in fspace->sinfo_accmode */
+        HDassert(((fspace->sinfo_accmode) & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
         if(fspace->sinfo_protected && accmode != fspace->sinfo_accmode) {
             /* Check if we need to switch from read-only access to read-write */
-            if(H5AC_WRITE == accmode) {
+	    if(0 == (accmode & (unsigned)(~H5AC__READ_ONLY_FLAG))) {
                 /* Unprotect the read-only section info */
                 if(H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, fspace->sinfo, H5AC__NO_FLAGS_SET) < 0)
                     HGOTO_ERROR(H5E_FSPACE, H5E_CANTUNPROTECT, FAIL, "unable to release free space section info")
@@ -235,11 +242,11 @@ HDfprintf(stderr, "%s: fspace->alloc_sect_size = %Hu, fspace->sect_size = %Hu\n"
                 cache_udata.f = f;
                 cache_udata.dxpl_id = dxpl_id;
                 cache_udata.fspace = fspace;
-                if(NULL == (fspace->sinfo = (H5FS_sinfo_t *)H5AC_protect(f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, &cache_udata, H5AC_WRITE)))
+                if(NULL == (fspace->sinfo = (H5FS_sinfo_t *)H5AC_protect(f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, &cache_udata, H5AC__NO_FLAGS_SET)))
                     HGOTO_ERROR(H5E_FSPACE, H5E_CANTPROTECT, FAIL, "unable to load free space sections")
 
                 /* Switch the access mode we have */
-                fspace->sinfo_accmode = H5AC_WRITE;
+                fspace->sinfo_accmode = H5AC__NO_FLAGS_SET;
             } /* end if */
         } /* end if */
     } /* end if */
@@ -291,20 +298,19 @@ done:
 HDfprintf(stderr, "%s: Leaving, fspace->addr = %a, fspace->sinfo = %p, fspace->sect_addr = %a\n", FUNC, fspace->addr, fspace->sinfo, fspace->sect_addr);
 HDfprintf(stderr, "%s: fspace->alloc_sect_size = %Hu, fspace->sect_size = %Hu\n", FUNC, fspace->alloc_sect_size, fspace->sect_size);
 #endif /* H5FS_SINFO_DEBUG */
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* H5FS_sinfo_lock() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sinfo_unlock
+ * Function:    H5FS_sinfo_unlock
  *
- * Purpose:	Release the section info, either giving ownership back to
+ * Purpose:     Release the section info, either giving ownership back to
  *              the cache or letting the free space header keep it.
  *
- * Return:	Success:	non-negative
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Thursday, February  7, 2008
  *
  *-------------------------------------------------------------------------
@@ -330,7 +336,7 @@ HDfprintf(stderr, "%s: fspace->alloc_sect_size = %Hu, fspace->sect_size = %Hu\n"
     /* Check if we modified any section */
     if(modified) {
         /* Check if the section info was protected with a different access mode */
-        if(fspace->sinfo_protected && fspace->sinfo_accmode != H5AC_WRITE)
+        if(fspace->sinfo_protected && (0 != ((fspace->sinfo_accmode) & H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_FSPACE, H5E_CANTDIRTY, FAIL, "attempt to modify read-only section info")
 
         /* If we modified the section info, mark it dirty */
@@ -444,8 +450,10 @@ HDfprintf(stderr, "%s: Relinquishing section info ownership\n", FUNC);
 HDfprintf(stderr, "%s: Freeing section info on disk, old_sect_addr = %a, old_alloc_sect_size = %Hu\n", FUNC, old_sect_addr, old_alloc_sect_size);
 #endif /* H5FS_SINFO_DEBUG */
             /* Release space for section info in file */
-            if(H5MF_xfree(f, H5FD_MEM_FSPACE_SINFO, dxpl_id, old_sect_addr, old_alloc_sect_size) < 0)
-                HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to free free space sections")
+            if(!H5F_IS_TMP_ADDR(f, old_sect_addr)) {
+                if(H5MF_xfree(f, H5FD_MEM_FSPACE_SINFO, dxpl_id, old_sect_addr, old_alloc_sect_size) < 0)
+                    HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to free free space sections")
+            } /* end if */
         } /* end if */
     } /* end if */
 
@@ -458,14 +466,13 @@ HDfprintf(stderr, "%s: Leaving, ret_value = %d\n", FUNC, ret_value);
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_serialize_size
+ * Function:    H5FS_sect_serialize_size
  *
- * Purpose:	Determine serialized size of all sections in free space manager
+ * Purpose:     Determine serialized size of all sections in free space manager
  *
- * Return:	Success:	non-negative
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Monday, May  8, 2006
  *
  *-------------------------------------------------------------------------
@@ -522,15 +529,14 @@ HDfprintf(stderr, "%s: fspace->serial_sect_count = %Hu\n", "H5FS_sect_serialize_
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_increase
+ * Function:    H5FS_sect_increase
  *
- * Purpose:	Increase the size of the serialized free space section info
+ * Purpose:     Increase the size of the serialized free space section info
  *              on disk
  *
- * Return:	Success:	non-negative
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Monday, May  8, 2006
  *
  *-------------------------------------------------------------------------
@@ -584,16 +590,14 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_decrease
+ * Function:    H5FS_sect_decrease
  *
- * Purpose:	Decrease the size of the serialized free space section info
+ * Purpose:     Decrease the size of the serialized free space section info
  *              on disk
  *
- * Return:	Success:	non-negative
- *
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Monday, May  8, 2006
  *
  *-------------------------------------------------------------------------
@@ -643,14 +647,13 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_size_node_decr
+ * Function:    H5FS_size_node_decr
  *
- * Purpose:	Decrement the number of sections of a particular size
+ * Purpose:     Decrement the number of sections of a particular size
  *
- * Return:	Success:	non-negative
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Wednesday, May 17, 2006
  *
  *-------------------------------------------------------------------------
@@ -731,15 +734,14 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_unlink_size
+ * Function:    H5FS_sect_unlink_size
  *
- * Purpose:	Remove a section node from size tracking data structures for
+ * Purpose:     Remove a section node from size tracking data structures for
  *              a free space manager
  *
- * Return:	Success:	non-negative
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Wednesday, May 17, 2006
  *
  *-------------------------------------------------------------------------
@@ -786,17 +788,15 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_unlink_rest
+ * Function:    H5FS_sect_unlink_rest
  *
- * Purpose:	Finish unlinking a section from the rest of the free space
+ * Purpose:     Finish unlinking a section from the rest of the free space
  *              manager's data structures, after the section has been removed
  *              from the size tracking data structures
  *
- * Return:	Success:	non-negative
+ * Return:      SUCCEED/FAIL
  *
- *		Failure:	negative
- *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Wednesday, May 17, 2006
  *
  *-------------------------------------------------------------------------
@@ -843,14 +843,13 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_remove_real
+ * Function:    H5FS_sect_remove_real
  *
- * Purpose:	Remove a section from the free space manager
+ * Purpose:     Remove a section from the free space manager
  *
- * Return:	Success:	non-negative
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Wednesday, May 17, 2006
  *
  *-------------------------------------------------------------------------
@@ -885,14 +884,13 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_remove
+ * Function:    H5FS_sect_remove
  *
- * Purpose:	Remove a section from the free space manager
+ * Purpose:     Remove a section from the free space manager
  *
- * Return:	Success:	non-negative
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Wednesday, May 17, 2006
  *
  *-------------------------------------------------------------------------
@@ -912,7 +910,7 @@ H5FS_sect_remove(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
     HDassert(sect);
 
     /* Get a pointer to the section info */
-    if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC_WRITE) < 0)
+    if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC__NO_FLAGS_SET) < 0)
         HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "can't get section info")
     sinfo_valid = TRUE;
 
@@ -930,14 +928,13 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_link_size
+ * Function:    H5FS_sect_link_size
  *
- * Purpose:	Add a section of free space to the free list bins
+ * Purpose:     Add a section of free space to the free list bins
  *
- * Return:	Success:	non-negative
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Monday, March 20, 2006
  *
  *-------------------------------------------------------------------------
@@ -1038,16 +1035,14 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_link_rest
+ * Function:    H5FS_sect_link_rest
  *
- * Purpose:	Link a section into the rest of the non-size tracking
+ * Purpose:     Link a section into the rest of the non-size tracking
  *              free space manager data structures
  *
- * Return:	Success:	non-negative
- *
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Wednesday, May 17, 2006
  *
  *-------------------------------------------------------------------------
@@ -1090,15 +1085,13 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_link
+ * Function:    H5FS_sect_link
  *
- * Purpose:	Link a section into the internal data structures
+ * Purpose:     Link a section into the internal data structures
  *
- * Return:	Success:	non-negative
- *
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Wednesday, May 17, 2006
  *
  *-------------------------------------------------------------------------
@@ -1142,24 +1135,16 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_merge
+ * Function:    H5FS_sect_merge
  *
- * Purpose:	Attempt to merge a returned free space section with existing
+ * Purpose:     Attempt to merge a returned free space section with existing
  *              free space.
  *
- * Return:	Success:	non-negative
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Wednesday, May 17, 2006
  *
- * Modifications: Vailin Choi; Sept 25th 2008
- *	Changes to the "shrinking" part--
- *	1. Get last section node in merge-list instead of "less-than"
- *	   node for further iteration
- *	2. Remove "can-be-shrunk" section from free-space instead of
- *	   "less-than" section
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -1167,7 +1152,7 @@ H5FS_sect_merge(H5FS_t *fspace, H5FS_section_info_t **sect, void *op_data)
 {
     H5FS_section_class_t *sect_cls;     /* Section's class */
     hbool_t modified;                   /* Flag to indicate merge or shrink occurred */
-    hbool_t remove_sect = FALSE;       /* Whether a section should be removed before shrinking */
+    hbool_t remove_sect = FALSE;        /* Whether a section should be removed before shrinking */
     htri_t status;                      /* Status value */
     herr_t ret_value = SUCCEED;         /* Return value */
 
@@ -1299,13 +1284,13 @@ HDfprintf(stderr, "%s: Done merging, (*sect) = {%a, %Hu, %u, %s}\n", FUNC, (*sec
 HDfprintf(stderr, "%s: Can shrink!\n", FUNC);
 #endif /* QAK */
 
-		/* Remove SECT from free-space manager */
+                /* Remove SECT from free-space manager */
                 /* (only possible to happen on second+ pass through loop) */
-		if(remove_sect) {
-		    if(H5FS_sect_remove_real(fspace, *sect) < 0)
-			HGOTO_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't remove section from internal data structures")
-		    remove_sect = FALSE;
-		} /* end if */
+                if(remove_sect) {
+                    if(H5FS_sect_remove_real(fspace, *sect) < 0)
+                        HGOTO_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't remove section from internal data structures")
+                    remove_sect = FALSE;
+                } /* end if */
 
                 /* Shrink the container */
                 /* (callback can indicate that it has discarded the section by setting *sect to NULL) */
@@ -1329,7 +1314,7 @@ HDfprintf(stderr, "%s: Can shrink!\n", FUNC);
                             remove_sect = TRUE;
                         } /* end if */
                     } /* end if */
-		} /* end if */
+                } /* end if */
 
                 /* Indicate successful merge occurred */
                 modified = TRUE;
@@ -1339,7 +1324,7 @@ HDfprintf(stderr, "%s: Can shrink!\n", FUNC);
 
     /* Check for section that was shrunk away and next section not shrinking */
     if(remove_sect && (*sect != NULL))
-	*sect = NULL;
+        *sect = NULL;
 
 #ifdef QAK
 HDfprintf(stderr, "%s: Done shrinking\n", FUNC);
@@ -1358,15 +1343,13 @@ HDfprintf(stderr, "%s: Leaving, ret_value = %d\n", FUNC, ret_value);
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_add
+ * Function:    H5FS_sect_add
  *
- * Purpose:	Add a section of free space to the free list
+ * Purpose:     Add a section of free space to the free list
  *
- * Return:	Success:	non-negative
- *
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Tuesday, March  7, 2006
  *
  *-------------------------------------------------------------------------
@@ -1393,7 +1376,7 @@ HDfprintf(stderr, "%s: *sect = {%a, %Hu, %u, %s}\n", FUNC, sect->addr, sect->siz
     HDassert(sect->size);
 
     /* Get a pointer to the section info */
-    if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC_WRITE) < 0)
+    if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC__NO_FLAGS_SET) < 0)
         HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "can't get section info")
     sinfo_valid = TRUE;
 
@@ -1448,14 +1431,13 @@ HDfprintf(stderr, "%s: Leaving, ret_value = %d\n", FUNC, ret_value);
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_try_extend
+ * Function:    H5FS_sect_try_extend
  *
- * Purpose:	Try to extend a block using space from a section on the free list
+ * Purpose:     Try to extend a block using space from a section on the free list
  *
- * Return:	Success:	non-negative
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Tuesday, January  8, 2008
  *
  *-------------------------------------------------------------------------
@@ -1491,7 +1473,7 @@ HDfprintf(stderr, "%s: fspace->ghost_sect_count = %Hu\n", FUNC, fspace->ghost_se
         H5FS_section_info_t *sect;      /* Temporary free space section */
 
         /* Get a pointer to the section info */
-        if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC_WRITE) < 0)
+        if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC__NO_FLAGS_SET) < 0)
             HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "can't get section info")
         sinfo_valid = TRUE;
 
@@ -1579,22 +1561,81 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_find_node
+ * Function:    H5FS_sect_try_merge
  *
- * Purpose:	Locate a section of free space (in existing free space list
- *              bins) that is large enough to fulfill request.
+ * Purpose:     Try to merge/shrink a block
  *
- * Return:	Success:	non-negative
+ * Return:      TRUE:       merged/shrunk
+ *              FALSE:      not merged/not shrunk
+ *              Failure:    negative
  *
- *		Failure:	negative
+ * Programmer:  Vailin Choi
+ *              June 10, 2009
  *
- * Programmer:	Quincey Koziol
- *              Monday, March 20, 2006
+ *-------------------------------------------------------------------------
+ */
+htri_t
+H5FS_sect_try_merge(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace, H5FS_section_info_t *sect,
+    unsigned flags, void *op_data)
+{
+    hbool_t sinfo_valid = FALSE;        /* Whether the section info is valid */
+    hbool_t sinfo_modified = FALSE;     /* Whether the section info was modified */
+    hsize_t saved_fs_size;              /* Copy of the free-space section size */
+    htri_t ret_value = FALSE;           /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments. */
+    HDassert(f);
+    HDassert(fspace);
+    HDassert(sect);
+    HDassert(H5F_addr_defined(sect->addr));
+    HDassert(sect->size);
+
+    /* Get a pointer to the section info */
+    if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC__NO_FLAGS_SET) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "can't get section info")
+    sinfo_valid = TRUE;
+    saved_fs_size = sect->size;
+
+    /* Attempt to merge/shrink section with existing sections */
+    if(H5FS_sect_merge(fspace, &sect, op_data) < 0)
+        HGOTO_ERROR(H5E_FSPACE, H5E_CANTMERGE, FAIL, "can't merge sections")
+
+    /* Check if section is shrunk and/or merged away completely */
+    if(!sect) {
+        sinfo_modified = TRUE;
+        HGOTO_DONE(TRUE)
+    } /* end if */
+    else {
+        /* Check if section is merged */
+        if(sect->size > saved_fs_size) {
+            if(H5FS_sect_link(fspace, sect, flags) < 0)
+                HGOTO_ERROR(H5E_FSPACE, H5E_CANTINSERT, FAIL, "can't insert free space section into skip list")
+            sinfo_modified = TRUE;
+            HGOTO_DONE(TRUE)
+        } /* end if */
+    } /* end else */
+
+done:
+    /* Release the section info */
+    if(sinfo_valid && H5FS_sinfo_unlock(f, dxpl_id, fspace, sinfo_modified) < 0)
+        HDONE_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't release section info")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5FS_sect_try_merge() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FS_sect_find_node
+ *
+ * Purpose:     Locate a section of free space (in existing free space list
+ *              bins) that is large enough to fulfill request.
+ *
+ * Return:      SUCCEED/FAIL
  *
- * Modifications:
- *	Vailin Choi, July 29th, 2008
- *	  Modified to handle alignment by going through each bin to find
- *	  a section that is big enough to fulfill "request+fragment for alignment"
+ * Programmer:  Quincey Koziol
+ *              Monday, March 20, 2006
  *
  *-------------------------------------------------------------------------
  */
@@ -1627,34 +1668,34 @@ HDfprintf(stderr, "%s: bin = %u\n", FUNC, bin);
 #endif /* QAK */
     alignment = fspace->alignment;
     if(!((alignment > 1) && (request >= fspace->threshold)))
-	alignment = 0; /* no alignment */
+        alignment = 0; /* no alignment */
 
     do {
         /* Check if there's any sections in this bin */
-	if(fspace->sinfo->bins[bin].bin_list) {
-
-	    if (!alignment) { /* no alignment */
-		/* Find the first free space section that is large enough to fulfill request */
-		/* (Since the bins use skip lists to track the sizes of the address-ordered
-		 *  lists, this is actually a "best fit" algorithm)
-		 */
-		/* Look for large enough free space section in this bin */
-		if((fspace_node = (H5FS_node_t *)H5SL_greater(fspace->sinfo->bins[bin].bin_list, &request))) {
-		    /* Take first node off of the list (ie. node w/lowest address) */
-		    if(NULL == (*node = (H5FS_section_info_t *)H5SL_remove_first(fspace_node->sect_list)))
-			HGOTO_ERROR(H5E_FSPACE, H5E_CANTREMOVE, FAIL, "can't remove free space node from skip list")
-
-		    /* Get section's class */
-		    cls = &fspace->sect_cls[(*node)->type];
-		    /* Decrement # of sections in section size node */
-		    if(H5FS_size_node_decr(fspace->sinfo, bin, fspace_node, cls) < 0)
-			HGOTO_ERROR(H5E_FSPACE, H5E_CANTREMOVE, FAIL, "can't remove free space size node from skip list")
-		    if(H5FS_sect_unlink_rest(fspace, cls, *node) < 0)
-			HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "can't remove section from non-size tracking data structures")
-		    /* Indicate that we found a node for the request */
-		    HGOTO_DONE(TRUE)
-		} /* end if */
-	    }  /* end if */
+        if(fspace->sinfo->bins[bin].bin_list) {
+
+            if (!alignment) { /* no alignment */
+                /* Find the first free space section that is large enough to fulfill request */
+                /* (Since the bins use skip lists to track the sizes of the address-ordered
+                 *  lists, this is actually a "best fit" algorithm)
+                 */
+                /* Look for large enough free space section in this bin */
+                if((fspace_node = (H5FS_node_t *)H5SL_greater(fspace->sinfo->bins[bin].bin_list, &request))) {
+                    /* Take first node off of the list (ie. node w/lowest address) */
+                    if(NULL == (*node = (H5FS_section_info_t *)H5SL_remove_first(fspace_node->sect_list)))
+                        HGOTO_ERROR(H5E_FSPACE, H5E_CANTREMOVE, FAIL, "can't remove free space node from skip list")
+
+                    /* Get section's class */
+                    cls = &fspace->sect_cls[(*node)->type];
+                    /* Decrement # of sections in section size node */
+                    if(H5FS_size_node_decr(fspace->sinfo, bin, fspace_node, cls) < 0)
+                        HGOTO_ERROR(H5E_FSPACE, H5E_CANTREMOVE, FAIL, "can't remove free space size node from skip list")
+                    if(H5FS_sect_unlink_rest(fspace, cls, *node) < 0)
+                        HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "can't remove section from non-size tracking data structures")
+                    /* Indicate that we found a node for the request */
+                    HGOTO_DONE(TRUE)
+                } /* end if */
+            }  /* end if */
             else { /* alignment is set */
                 /* get the first node of a certain size in this bin */
                 curr_size_node = H5SL_first(fspace->sinfo->bins[bin].bin_list);
@@ -1723,9 +1764,9 @@ HDfprintf(stderr, "%s: bin = %u\n", FUNC, bin);
                     /* Get the next size node in the bin */
                     curr_size_node = H5SL_next(curr_size_node);
                 } /* end while of curr_size_node */
-	    }  /* else of alignment */
-	} /* if bin_list */
-	/* Advance to next larger bin */
+            }  /* else of alignment */
+        } /* if bin_list */
+        /* Advance to next larger bin */
         bin++;
     } while(bin < fspace->sinfo->nbins);
 
@@ -1735,22 +1776,16 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_find
+ * Function:    H5FS_sect_find
  *
- * Purpose:	Locate a section of free space (in existing free space list) that
+ * Purpose:     Locate a section of free space (in existing free space list) that
  *              is large enough to fulfill request.
  *
- * Return:	Success:	non-negative
+ * Return:      SUCCEED/FAIL
  *
- *		Failure:	negative
- *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Tuesday, March  7, 2006
  *
- * Modifications:
- *	Vailin Choi, July 29th 2008
- *	  Move H5FS_sect_unlink_rest() to H5FS_sect_find_node()
- *
  *-------------------------------------------------------------------------
  */
 htri_t
@@ -1781,7 +1816,7 @@ HDfprintf(stderr, "%s: fspace->ghost_sect_count = %Hu\n", FUNC, fspace->ghost_se
 #endif /* QAK */
     if(fspace->tot_sect_count > 0) {
         /* Get a pointer to the section info */
-        if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC_WRITE) < 0)
+        if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC__NO_FLAGS_SET) < 0)
             HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "can't get section info")
         sinfo_valid = TRUE;
 
@@ -1796,7 +1831,7 @@ HDfprintf(stderr, "%s: fspace->ghost_sect_count = %Hu\n", FUNC, fspace->ghost_se
 #ifdef QAK
 HDfprintf(stderr, "%s: (*node)->size = %Hu, (*node)->addr = %a, (*node)->type = %u\n", FUNC, (*node)->size, (*node)->addr, (*node)->type);
 #endif /* QAK */
-	}
+        }
     } /* end if */
 
 done:
@@ -1812,16 +1847,14 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_iterate_sect_cb
+ * Function:    H5FS_iterate_sect_cb
  *
- * Purpose:	Skip list iterator callback to iterate over free space sections
+ * Purpose:     Skip list iterator callback to iterate over free space sections
  *              of a particular size
  *
- * Return:	Success:	non-negative
- *
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Saturday, May 13, 2006
  *
  *-------------------------------------------------------------------------
@@ -1850,16 +1883,14 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_iterate_node_cb
+ * Function:    H5FS_iterate_node_cb
  *
- * Purpose:	Skip list iterator callback to iterate over free space sections
+ * Purpose:     Skip list iterator callback to iterate over free space sections
  *              in a bin
  *
- * Return:	Success:	non-negative
+ * Return:      SUCCEED/FAIL
  *
- *		Failure:	negative
- *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Saturday, May 13, 2006
  *
  *-------------------------------------------------------------------------
@@ -1889,15 +1920,13 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_iterate
- *
- * Purpose:	Iterate over all the sections managed
+ * Function:    H5FS_sect_iterate
  *
- * Return:	Success:	non-negative
+ * Purpose:     Iterate over all the sections managed
  *
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Saturday, May 13, 2006
  *
  *-------------------------------------------------------------------------
@@ -1929,7 +1958,7 @@ HDfprintf(stderr, "%s: fspace->tot_sect_count = %Hu\n", FUNC, fspace->tot_sect_c
         unsigned bin;           /* Current bin we are on */
 
         /* Get a pointer to the section info */
-        if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC_READ) < 0)
+        if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC__READ_ONLY_FLAG) < 0)
             HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "can't get section info")
         sinfo_valid = TRUE;
 
@@ -1957,14 +1986,13 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_stats
+ * Function:    H5FS_sect_stats
  *
- * Purpose:	Retrieve info about the sections managed
+ * Purpose:     Retrieve info about the sections managed
  *
- * Return:	Success:	non-negative
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Tuesday, May 30, 2006
  *
  *-------------------------------------------------------------------------
@@ -1988,23 +2016,21 @@ H5FS_sect_stats(const H5FS_t *fspace, hsize_t *tot_space, hsize_t *nsects)
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_change_class
+ * Function:    H5FS_sect_change_class
  *
- * Purpose:	Make appropriate adjustments to internal data structures when
+ * Purpose:     Make appropriate adjustments to internal data structures when
  *              a section changes class
  *
- * Return:	Success:	non-negative
- *
- *		Failure:	negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Monday, July 10, 2006
  *
  *-------------------------------------------------------------------------
  */
 herr_t
 H5FS_sect_change_class(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
-    H5FS_section_info_t *sect, unsigned new_class)
+    H5FS_section_info_t *sect, uint16_t new_class)
 {
     const H5FS_section_class_t *old_cls;        /* Old class of section */
     const H5FS_section_class_t *new_cls;        /* New class of section */
@@ -2021,7 +2047,7 @@ H5FS_sect_change_class(H5F_t *f, hid_t dxpl_id, H5FS_t *fspace,
     HDassert(new_class < fspace->nclasses);
 
     /* Get a pointer to the section info */
-    if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC_WRITE) < 0)
+    if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC__NO_FLAGS_SET) < 0)
         HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "can't get section info")
     sinfo_valid = TRUE;
 
@@ -2160,15 +2186,14 @@ done:
 #ifdef H5FS_DEBUG_ASSERT
 

 /*-------------------------------------------------------------------------
- * Function:	H5FS_sect_assert
+ * Function:    H5FS_sect_assert
  *
- * Purpose:	Verify that the sections managed are mostly sane
+ * Purpose:     Verify that the sections managed are mostly sane
  *
- * Return:	Non-negative on success, negative on failure
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Jul 17 2006
+ * Programmer:  Quincey Koziol
+ *              Jul 17 2006
  *
  *-------------------------------------------------------------------------
  */
@@ -2335,7 +2360,7 @@ H5FS_sect_try_shrink_eoa(const H5F_t *f, hid_t dxpl_id, const H5FS_t *fspace, vo
     /* Check arguments. */
     HDassert(fspace);
 
-    if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC_WRITE) < 0)
+    if(H5FS_sinfo_lock(f, dxpl_id, fspace, H5AC__NO_FLAGS_SET) < 0)
         HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "can't get section info")
     sinfo_valid = TRUE;
 
diff --git a/src/H5FSstat.c b/src/H5FSstat.c
index 66c5495..d2c0177 100644
--- a/src/H5FSstat.c
+++ b/src/H5FSstat.c
@@ -22,14 +22,16 @@
 /* Module Setup */
 /****************/
 
-#define H5FS_PACKAGE		/*suppress error about including H5FSpkg  */
+#include "H5FSmodule.h"         /* This source code file is part of the H5FS module */
+
 
 /***********/
 /* Headers */
 /***********/
-#include "H5private.h"		/* Generic Functions			*/
-#include "H5Eprivate.h"		/* Error handling		  	*/
-#include "H5FSpkg.h"		/* Free-space manager 			*/
+#include "H5private.h"      /* Generic Functions                        */
+#include "H5Eprivate.h"     /* Error handling                           */
+#include "H5FSpkg.h"        /* Free-space manager                       */
+
 
 /****************/
 /* Local Macros */
@@ -72,12 +74,10 @@
  *
  * Purpose:     Retrieve metadata statistics for the free-space manager
  *
- * Return:      Success:        non-negative
- *
- *              Failure:        does not fail
+ * Return:      SUCCEED (Can't fail)
  *
  * Programmer:  Vailin Choi
- *		August 25th, 2008
+ *              August 25th, 2008
  *
  *-------------------------------------------------------------------------
  */
diff --git a/src/H5FStest.c b/src/H5FStest.c
index 63ba94c..06f5166 100644
--- a/src/H5FStest.c
+++ b/src/H5FStest.c
@@ -22,15 +22,17 @@
 /* Module Setup */
 /****************/
 
-#define H5FS_PACKAGE		/*suppress error about including H5FSpkg  */
-#define H5FS_TESTING		/*suppress warning about H5FS testing funcs */
+#include "H5FSmodule.h"         /* This source code file is part of the H5FS module */
+#define H5FS_TESTING            /* Suppress warning about H5FS testing funcs */
+
 
 /***********/
 /* Headers */
 /***********/
-#include "H5private.h"		/* Generic Functions			*/
-#include "H5Eprivate.h"		/* Error handling		  	*/
-#include "H5FSpkg.h"		/* Free-space manager			*/
+#include "H5private.h"      /* Generic Functions                            */
+#include "H5Eprivate.h"     /* Error handling                               */
+#include "H5FSpkg.h"        /* Free-space manager                           */
+
 
 /****************/
 /* Local Macros */
@@ -72,13 +74,12 @@
  * Function:    H5FS_get_cparam_test
  *
  * Purpose:     Retrieve the parameters used to create the free-space manager
+ *              similar to H5HF_get_cparam_test()
  *
- * Return:      Success:        non-negative
- *
- *              Failure:        negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:  similar to H5HF_get_cparam_test()
- *		Vailin Choi; August 25th, 2008
+ * Programmer:  Vailin Choi
+ *              August 25th, 2008
  *
  *-------------------------------------------------------------------------
  */
@@ -104,13 +105,13 @@ H5FS_get_cparam_test(const H5FS_t *frsp, H5FS_create_t *cparam)
 /*-------------------------------------------------------------------------
  * Function:    H5FS_cmp_cparam_test
  *
- * Purpose:     Compare the parameters used to create the fractal heap
+ * Purpose:     Compare the parameters used to create the free space manager
+ *              similar to H5HF_cmp_cparam_test()
  *
- * Return:      Success:        non-negative
- *              Failure:        negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:  similar to H5HF_cmp_cparam_test()
- *		Vailin Choi; August 25th, 2008
+ * Programmer:  Vailin Choi
+ *              August 25th, 2008
  *
  *-------------------------------------------------------------------------
  */
diff --git a/src/H5Faccum.c b/src/H5Faccum.c
index 71ca9e5..d8cd614 100644
--- a/src/H5Faccum.c
+++ b/src/H5Faccum.c
@@ -30,7 +30,7 @@
 /* Module Setup */
 /****************/
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+#include "H5Fmodule.h"          /* This source code file is part of the H5F module */
 
 
 /***********/
@@ -373,9 +373,9 @@ H5F__accum_adjust(H5F_meta_accum_t *accum, const H5F_io_info_t *fio_info,
 
             /* Trim the accumulator's use of its buffer */
             accum->size = remnant_size;
-            
+
             /* When appending, need to adjust location of accumulator */
-            if (H5F_ACCUM_APPEND == adjust) {
+            if(H5F_ACCUM_APPEND == adjust) {
                 /* Move remnant of accumulator down */
                 HDmemmove(accum->buf, (accum->buf + shrink_size), remnant_size);
 
@@ -418,6 +418,11 @@ done:
  *		koziol at hdfgroup.org
  *		Jan 10 2008
  *
+ * Modifications:
+ *	Vailin Choi; June 2013
+ *	This is a fix for SWMR:
+ *	For a large write that is >= than H5F_ACCUM_MAX_SIZE,
+ *	flush the metadata in the accumulator first before the write.
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -735,6 +740,12 @@ HDmemset(accum->buf + size, 0, (accum->alloc_size - size));
             } /* end else */
         } /* end if */
         else {
+	    if((H5F_INTENT(fio_info->f) & H5F_ACC_SWMR_WRITE) > 0) {
+                /* Flush if dirty and reset accumulator */
+                if(H5F__accum_reset(fio_info, TRUE) < 0)
+                    HGOTO_ERROR(H5E_IO, H5E_CANTRESET, FAIL, "can't reset accumulator")
+            }
+
             /* Write the data */
             if(H5FD_write(fio_info->f->shared->lf, fio_info->dxpl, map_type, addr, size, buf) < 0)
                 HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed")
diff --git a/src/H5Fcwfs.c b/src/H5Fcwfs.c
index 36f0a93..32c73b0 100644
--- a/src/H5Fcwfs.c
+++ b/src/H5Fcwfs.c
@@ -35,7 +35,7 @@
 /* Module Setup */
 /****************/
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+#include "H5Fmodule.h"          /* This source code file is part of the H5F module */
 
 
 /***********/
@@ -260,8 +260,9 @@ herr_t
 H5F_cwfs_advance_heap(H5F_t *f, H5HG_heap_t *heap, hbool_t add_heap)
 {
     unsigned u;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOERR
+    FUNC_ENTER_NOAPI(FAIL)
 
     /* Check args */
     HDassert(f);
@@ -281,7 +282,8 @@ H5F_cwfs_advance_heap(H5F_t *f, H5HG_heap_t *heap, hbool_t add_heap)
         f->shared->cwfs[f->shared->ncwfs - 1] = heap;
     } /* end if */
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* H5F_cwfs_advance_heap() */
 
 

@@ -302,8 +304,9 @@ herr_t
 H5F_cwfs_remove_heap(H5F_file_t *shared, H5HG_heap_t *heap)
 {
     unsigned u;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOERR
+    FUNC_ENTER_NOAPI(FAIL)
 
     /* Check args */
     HDassert(shared);
@@ -318,6 +321,7 @@ H5F_cwfs_remove_heap(H5F_file_t *shared, H5HG_heap_t *heap)
         } /* end if */
     } /* end for */
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* H5F_cwfs_remove_heap() */
 
diff --git a/src/H5Fdbg.c b/src/H5Fdbg.c
index 40d24e5..11accc6 100644
--- a/src/H5Fdbg.c
+++ b/src/H5Fdbg.c
@@ -19,8 +19,8 @@
  * Purpose:	File object debugging functions.
  */
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg   */
+#include "H5Fmodule.h"          /* This source code file is part of the H5F module */
+#define H5G_FRIEND		/*suppress error about including H5Gpkg   */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -104,6 +104,8 @@ H5F_debug(H5F_t *f, FILE *stream, int indent, int fwidth)
 	      "Symbol table leaf node 1/2 rank:", f->shared->sblock->sym_leaf_k);
     HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
 	      "Symbol table internal node 1/2 rank:", f->shared->sblock->btree_k[H5B_SNODE_ID]);
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+	      "Indexed storage internal node 1/2 rank:", f->shared->sblock->btree_k[H5B_CHUNK_ID]);
     HDfprintf(stream, "%*s%-*s 0x%02x\n", indent, "", fwidth,
 	      "File status flags:", (unsigned)(f->shared->sblock->status_flags));
     HDfprintf(stream, "%*s%-*s %a (rel)\n", indent, "", fwidth,
diff --git a/src/H5Fdeprec.c b/src/H5Fdeprec.c
new file mode 100644
index 0000000..d16e2d4
--- /dev/null
+++ b/src/H5Fdeprec.c
@@ -0,0 +1,149 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:	H5Fdeprec.c
+ *		October 1 2009
+ *		Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:	Deprecated functions from the H5F interface.  These
+ *              functions are here for compatibility purposes and may be
+ *              removed in the future.  Applications should switch to the
+ *              newer APIs.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#include "H5Fmodule.h"          /* This source code file is part of the H5F module */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fpkg.h"             /* File access				*/
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5SMprivate.h"        /* Shared object header messages        */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Fget_info1
+ *
+ * Purpose:     Gets general information about the file, including:
+ *		1. Get storage size for superblock extension if there is one.
+ *              2. Get the amount of btree and heap storage for entries
+ *                 in the SOHM table if there is one.
+ *		3. The amount of free space tracked in the file.
+ *
+ * Return:      Success:        non-negative on success
+ *              Failure:        Negative
+ *
+ * Programmer:  Vailin Choi
+ *              July 11, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Fget_info1(hid_t obj_id, H5F_info1_t *finfo)
+{
+    H5F_t *f;                           /* Top file in mount hierarchy */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*x", obj_id, finfo);
+
+    /* Check args */
+    if(!finfo)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no info struct")
+
+    /* For file IDs, get the file object directly */
+    /* (This prevents the H5G_loc() call from returning the file pointer for
+     * the top file in a mount hierarchy)
+     */
+    if(H5I_get_type(obj_id) == H5I_FILE ) {
+        if(NULL == (f = (H5F_t *)H5I_object(obj_id)))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
+    } /* end if */
+    else {
+        H5G_loc_t     loc;        /* Object location */
+
+        /* Get symbol table entry */
+        if(H5G_loc(obj_id, &loc) < 0)
+             HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a valid object ID")
+        f = loc.oloc->file;
+    } /* end else */
+    HDassert(f->shared);
+
+    /* Reset file info struct */
+    HDmemset(finfo, 0, sizeof(*finfo));
+
+    /* Get the size of the superblock extension */
+    if(H5F__super_size(f, H5AC_ind_dxpl_id, NULL, &finfo->super_ext_size) < 0)
+	HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve superblock extension size")
+
+    /* Check for SOHM info */
+    if(H5F_addr_defined(f->shared->sohm_addr))
+        if(H5SM_ih_size(f, H5AC_ind_dxpl_id, &finfo->sohm.hdr_size, &finfo->sohm.msgs_info) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve SOHM index & heap storage info")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Fget_info1() */
+
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
diff --git a/src/H5Fefc.c b/src/H5Fefc.c
index 9916002..5e3deb1 100644
--- a/src/H5Fefc.c
+++ b/src/H5Fefc.c
@@ -26,7 +26,7 @@
  *-------------------------------------------------------------------------
  */
 
-#define H5F_PACKAGE             /*suppress error about including H5Fpkg   */
+#include "H5Fmodule.h"          /* This source code file is part of the H5F module */
 
 
 /* Packages needed by this file... */
@@ -92,7 +92,7 @@ H5F_efc_t *
 H5F_efc_create(unsigned max_nfiles)
 {
     H5F_efc_t   *efc = NULL;            /* EFC object */
-    H5F_efc_t   *ret_value;             /* Return value */
+    H5F_efc_t   *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -162,8 +162,7 @@ H5F_efc_open(H5F_t *parent, const char *name, unsigned flags, hid_t fcpl_id,
      * support this so clients do not have to make 2 different calls depending
      * on the state of the efc. */
     if(!efc) {
-        if(NULL == (ret_value = H5F_open(name, flags, fcpl_id, fapl_id,
-                                         dxpl_id)))
+        if(NULL == (ret_value = H5F_open(name, flags, fcpl_id, fapl_id, dxpl_id)))
             HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "can't open file")
 
         /* Increment the number of open objects to prevent the file from being
@@ -235,8 +234,7 @@ H5F_efc_open(H5F_t *parent, const char *name, unsigned flags, hid_t fcpl_id,
             } /* end if */
             else {
                 /* Cannot cache file, just open file and return */
-                if(NULL == (ret_value = H5F_open(name, flags, fcpl_id, fapl_id,
-                                                 dxpl_id)))
+                if(NULL == (ret_value = H5F_open(name, flags, fcpl_id, fapl_id, dxpl_id)))
                     HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "can't open file")
 
                 /* Increment the number of open objects to prevent the file from
@@ -257,8 +255,7 @@ H5F_efc_open(H5F_t *parent, const char *name, unsigned flags, hid_t fcpl_id,
             HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
 
         /* Open the file */
-        if(NULL == (ent->file = H5F_open(name, flags, fcpl_id, fapl_id,
-                                         dxpl_id)))
+        if(NULL == (ent->file = H5F_open(name, flags, fcpl_id, fapl_id, dxpl_id)))
             HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "can't open file")
         open_file = TRUE;
 
diff --git a/src/H5Ffake.c b/src/H5Ffake.c
index af048bc..e191003 100644
--- a/src/H5Ffake.c
+++ b/src/H5Ffake.c
@@ -13,10 +13,7 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5F_init_fake_interface
+#include "H5Fmodule.h"          /* This source code file is part of the H5F module */
 
 
 /* Packages needed by this file... */
@@ -27,28 +24,6 @@
 /* PRIVATE PROTOTYPES */
 
 

-/*--------------------------------------------------------------------------
-NAME
-   H5F_init_fake_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5F_init_fake_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5F_init() currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5F_init_fake_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5F_init())
-} /* H5F_init_fake_interface() */
-
-

 /*-------------------------------------------------------------------------
  * Function:    H5F_fake_alloc
  *
@@ -70,7 +45,7 @@ H5F_t *
 H5F_fake_alloc(uint8_t sizeof_size)
 {
     H5F_t *f = NULL;            /* Pointer to fake file struct */
-    H5F_t *ret_value;           /* Return value */
+    H5F_t *ret_value = NULL;    /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
diff --git a/src/H5Fint.c b/src/H5Fint.c
index 81b8606..b6cc1f1 100644
--- a/src/H5Fint.c
+++ b/src/H5Fint.c
@@ -17,10 +17,7 @@
 /* Module Setup */
 /****************/
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5F_init_interface
+#include "H5Fmodule.h"          /* This source code file is part of the H5F module */
 
 
 /***********/
@@ -41,18 +38,6 @@
 #include "H5SMprivate.h"	/* Shared Object Header Messages	*/
 #include "H5Tprivate.h"		/* Datatypes				*/
 
-/* Predefined file drivers */
-#include "H5FDcore.h"		/*temporary in-memory files		*/
-#include "H5FDfamily.h"		/*family of files			*/
-#include "H5FDlog.h"            /* sec2 driver with logging, for debugging */
-#include "H5FDmpi.h"            /* MPI-based file drivers		*/
-#include "H5FDmulti.h"		/*multiple files partitioned by mem usage */
-#include "H5FDsec2.h"		/*Posix unbuffered I/O			*/
-#include "H5FDstdio.h"		/* Standard C buffered I/O		*/
-#ifdef H5_HAVE_WINDOWS
-#include "H5FDwindows.h"        /* Windows buffered I/O     */
-#endif
-#include "H5FDdirect.h"         /*Linux direct I/O			*/
 
 /****************/
 /* Local Macros */
@@ -115,30 +100,6 @@ H5FL_DEFINE(H5F_file_t);
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5F_init_interface
- *
- * Purpose:	Initialize interface-specific information.
- *
- * Return:	Success:	non-negative
- *		Failure:	negative
- *
- * Programmer:	Robb Matzke
- *              Friday, November 20, 1998
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5F_init_interface(void)
-{
-    herr_t ret_value = SUCCEED;                 /* Return value */
-
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5F_init_interface() */
-
-

-/*-------------------------------------------------------------------------
  * Function:	H5F_get_access_plist
  *
  * Purpose:	Returns a copy of the file access property list of the
@@ -166,9 +127,11 @@ H5F_get_access_plist(H5F_t *f, hbool_t app_ref)
 {
     H5P_genplist_t *new_plist;              /* New property list */
     H5P_genplist_t *old_plist;              /* Old property list */
-    void		*driver_info=NULL;
-    unsigned            efc_size = 0;
-    hid_t		ret_value = SUCCEED;
+    H5F_object_flush_t  flush_info;         /* Object flush property values */
+    H5FD_driver_prop_t driver_prop;         /* Property for driver ID & info */
+    hbool_t driver_prop_copied = FALSE;     /* Whether the driver property has been set up */
+    unsigned    efc_size = 0;
+    hid_t	ret_value = SUCCEED;        /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -206,37 +169,42 @@ H5F_get_access_plist(H5F_t *f, hbool_t app_ref)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set 'small data' cache size")
     if(H5P_set(new_plist, H5F_ACS_LATEST_FORMAT_NAME, &(f->shared->latest_format)) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set 'latest format' flag")
+    if(H5P_set(new_plist, H5F_ACS_METADATA_READ_ATTEMPTS_NAME, &(f->shared->read_attempts)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set 'read attempts ' flag")
+
+    /* Obtain object flush property values */
+    flush_info.func = f->shared->object_flush.func;
+    flush_info.udata = f->shared->object_flush.udata;
+
+    /* Set values */
+    if(H5P_set(new_plist, H5F_ACS_OBJECT_FLUSH_CB_NAME, &flush_info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set object flush callback")
+
     if(f->shared->efc)
         efc_size = H5F_efc_max_nfiles(f->shared->efc);
     if(H5P_set(new_plist, H5F_ACS_EFC_SIZE_NAME, &efc_size) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set elink file cache size")
 
-    /*
-     * Since we're resetting the driver ID and info, close them if they
-     * exist in this new property list.
-     */
-    if(H5P_facc_close(ret_value, NULL) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTFREE, FAIL, "can't free the old driver information")
+    /* Prepare the driver property */
+    driver_prop.driver_id = f->shared->lf->driver_id;
+    driver_prop.driver_info = H5FD_fapl_get(f->shared->lf);
+    driver_prop_copied = TRUE;
 
-    /* Increment the reference count on the driver ID and insert it into the property list */
-    if(H5I_inc_ref(f->shared->lf->driver_id, FALSE) < 0)
-        HGOTO_ERROR(H5E_FILE, H5E_CANTINC, FAIL, "unable to increment ref count on VFL driver")
-    if(H5P_set(new_plist, H5F_ACS_FILE_DRV_ID_NAME, &(f->shared->lf->driver_id)) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file driver ID")
-
-    /* Set the driver "info" in the property list */
-    driver_info = H5FD_fapl_get(f->shared->lf);
-    if(driver_info != NULL && H5P_set(new_plist, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file driver info")
+    /* Set the driver property */
+    if(H5P_set(new_plist, H5F_ACS_FILE_DRV_NAME, &driver_prop) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file driver ID & info")
 
     /* Set the file close degree appropriately */
-    if(f->shared->fc_degree == H5F_CLOSE_DEFAULT && H5P_set(new_plist, H5F_ACS_CLOSE_DEGREE_NAME, &(f->shared->lf->cls->fc_degree)) < 0) {
+    if(f->shared->fc_degree == H5F_CLOSE_DEFAULT && H5P_set(new_plist, H5F_ACS_CLOSE_DEGREE_NAME, &(f->shared->lf->cls->fc_degree)) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file close degree")
-    } else if(f->shared->fc_degree != H5F_CLOSE_DEFAULT && H5P_set(new_plist, H5F_ACS_CLOSE_DEGREE_NAME, &(f->shared->fc_degree)) < 0) {
+    else if(f->shared->fc_degree != H5F_CLOSE_DEFAULT && H5P_set(new_plist, H5F_ACS_CLOSE_DEGREE_NAME, &(f->shared->fc_degree)) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file close degree")
-    }
 
 done:
+    /* Release the copy of the driver info, if it was set up */
+    if(driver_prop_copied && H5FD_fapl_close(driver_prop.driver_id, driver_prop.driver_info) < 0)
+        HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "can't close copy of driver info")
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5F_get_access_plist() */
 
@@ -428,8 +396,8 @@ static int
 H5F_get_objects_cb(void *obj_ptr, hid_t obj_id, void *key)
 {
     H5F_olist_t *olist = (H5F_olist_t *)key;    /* Alias for search info */
-    int         ret_value = H5_ITER_CONT;    /* Return value */
     hbool_t     add_obj = FALSE;
+    int         ret_value = H5_ITER_CONT;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -443,7 +411,7 @@ H5F_get_objects_cb(void *obj_ptr, hid_t obj_id, void *key)
                 ||  (!olist->file_info.local &&
                         ( !olist->file_info.ptr.shared || (olist->file_info.ptr.shared && ((H5F_t*)obj_ptr)->shared == olist->file_info.ptr.shared) ))) {
             add_obj = TRUE;
-	}
+	} /* end if */
     } /* end if */
     else { /* either count opened object IDs or put the IDs on the list */
         H5O_loc_t *oloc;        /* Group entry info for object */
@@ -496,7 +464,7 @@ H5F_get_objects_cb(void *obj_ptr, hid_t obj_id, void *key)
     	} /* end if */
     } /* end else */
 
-    if(TRUE==add_obj) {
+    if(add_obj) {
         /* Add the object's ID to the ID list, if appropriate */
         if(olist->obj_id_list) {
             olist->obj_id_list[olist->list_index] = obj_id;
@@ -511,9 +479,9 @@ H5F_get_objects_cb(void *obj_ptr, hid_t obj_id, void *key)
          * we have filled up the array. Otherwise return H5_ITER_CONT(RET_VALUE is
          * preset to H5_ITER_CONT) because H5I_iterate needs the return value of 
          * H5_ITER_CONT to continue the iteration. */
-        if(olist->max_nobjs>0 && olist->list_index>=olist->max_nobjs)
+        if(olist->max_nobjs > 0 && olist->list_index >= olist->max_nobjs)
             HGOTO_DONE(H5_ITER_STOP)  /* Indicate that the iterator should stop */
-    }
+    } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -545,7 +513,7 @@ H5F_is_hdf5(const char *name)
 {
     H5FD_t	*file = NULL;           /* Low-level file struct */
     haddr_t     sig_addr;               /* Addess of hdf5 file signature */
-    htri_t	ret_value;              /* Return value */
+    htri_t	ret_value = FAIL;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -593,7 +561,7 @@ done:
 H5F_t *
 H5F_new(H5F_file_t *shared, unsigned flags, hid_t fcpl_id, hid_t fapl_id, H5FD_t *lf)
 {
-    H5F_t	*f = NULL, *ret_value;
+    H5F_t	*f = NULL, *ret_value = NULL;
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -639,6 +607,10 @@ H5F_new(H5F_file_t *shared, unsigned flags, hid_t fcpl_id, hid_t fapl_id, H5FD_t
         if(H5P_get(plist, H5F_CRT_SHMSG_NINDEXES_NAME, &f->shared->sohm_nindexes) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get number of SOHM indexes")
         HDassert(f->shared->sohm_nindexes < 255);
+        if(H5P_get(plist, H5F_CRT_FILE_SPACE_STRATEGY_NAME, &f->shared->fs_strategy) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get file space strategy")
+        if(H5P_get(plist, H5F_CRT_FREE_SPACE_THRESHOLD_NAME, &f->shared->fs_threshold) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get free-space section threshold")
 
         /* Get the FAPL values to cache */
         if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
@@ -661,6 +633,17 @@ H5F_new(H5F_file_t *shared, unsigned flags, hid_t fcpl_id, hid_t fapl_id, H5FD_t
             HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get sieve buffer size")
         if(H5P_get(plist, H5F_ACS_LATEST_FORMAT_NAME, &(f->shared->latest_format)) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get 'latest format' flag")
+        /* Require the latest format to use SWMR */
+        /* (Need to revisit this when the 1.10 release is made, and require
+         *      1.10 or later -QAK)
+         */
+	/* For latest format or SWMR_WRITE, activate all latest version support */
+	if((f->shared->latest_format) || (H5F_INTENT(f) & H5F_ACC_SWMR_WRITE))
+	    f->shared->latest_flags |= H5F_LATEST_ALL_FLAGS;
+	if(H5P_get(plist, H5F_ACS_USE_MDC_LOGGING_NAME, &(f->shared->use_mdc_logging)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get 'use mdc logging' flag")
+        if(H5P_get(plist, H5F_ACS_START_MDC_LOG_ON_ACCESS_NAME, &(f->shared->start_mdc_log_on_access)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get 'start mdc log on access' flag")
         if(H5P_get(plist, H5F_ACS_META_BLOCK_SIZE_NAME, &(f->shared->meta_aggr.alloc_size)) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get metadata cache size")
         f->shared->meta_aggr.feature_flag = H5FD_FEAT_AGGREGATE_METADATA;
@@ -679,6 +662,15 @@ H5F_new(H5F_file_t *shared, unsigned flags, hid_t fcpl_id, hid_t fapl_id, H5FD_t
             HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad maximum address from VFD")
         if(H5FD_get_feature_flags(lf, &f->shared->feature_flags) < 0)
             HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "can't get feature flags from VFD")
+
+	/* Require the SWMR feature flag if SWMR I/O is desired */
+        if(!H5F_HAS_FEATURE(f, H5FD_FEAT_SUPPORTS_SWMR_IO) && (H5F_INTENT(f) & (H5F_ACC_SWMR_WRITE | H5F_ACC_SWMR_READ)))
+            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "must use a SWMR-compatible VFD when SWMR is specified")
+
+        /* Require a POSIX compatible VFD to use SWMR feature */
+        /* (It's reasonable to try to expand this to other VFDs eventually -QAK) */
+        if(!H5F_HAS_FEATURE(f, H5FD_FEAT_POSIX_COMPAT_HANDLE) && (H5F_INTENT(f) & (H5F_ACC_SWMR_WRITE | H5F_ACC_SWMR_READ)))
+            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "must use POSIX compatible VFD with SWMR write access")
         if(H5FD_get_fs_type_map(lf, f->shared->fs_type_map) < 0)
             HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "can't get free space type mapping from VFD")
         if(H5MF_init_merge_flags(f) < 0)
@@ -695,6 +687,49 @@ H5F_new(H5F_file_t *shared, unsigned flags, hid_t fcpl_id, hid_t fapl_id, H5FD_t
          */
         f->shared->use_tmp_space = !H5F_HAS_FEATURE(f, H5FD_FEAT_HAS_MPI);
 
+        /* Retrieve the # of read attempts here so that sohm in superblock will get the correct # of attempts */
+        if(H5P_get(plist, H5F_ACS_METADATA_READ_ATTEMPTS_NAME, &f->shared->read_attempts) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get the # of read attempts")
+
+        /* When opening file with SWMR access, the # of read attempts is H5F_SWMR_METADATA_READ_ATTEMPTS if not set */
+        /* When opening file without SWMR access, the # of read attempts is always H5F_METADATA_READ_ATTEMPTS (set or not set) */
+        if(H5F_INTENT(f) & (H5F_ACC_SWMR_READ | H5F_ACC_SWMR_WRITE)) {
+            /* If no value for read attempts has been set, use the default */
+            if(!f->shared->read_attempts)
+                f->shared->read_attempts = H5F_SWMR_METADATA_READ_ATTEMPTS;
+
+            /* Turn off accumulator with SWMR */
+	    f->shared->feature_flags &= ~(unsigned)H5FD_FEAT_ACCUMULATE_METADATA;
+            if(H5FD_set_feature_flags(f->shared->lf, f->shared->feature_flags) < 0)
+                 HGOTO_ERROR(H5E_FILE, H5E_CANTSET, NULL, "can't set feature_flags in VFD")
+        } /* end if */
+        else
+            f->shared->read_attempts = H5F_METADATA_READ_ATTEMPTS;
+
+	/* Determine the # of bins for metdata read retries */
+ 	if(H5F_set_retries(f) < 0)
+ 	    HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "can't set retries and retries_nbins")
+
+	/* Get the metadata cache log location (if we're logging) */
+        {
+            char *mdc_log_location = NULL;      /* location of metadata cache log location */
+
+            if(H5P_get(plist, H5F_ACS_MDC_LOG_LOCATION_NAME, &mdc_log_location) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get mdc log location")
+            if(mdc_log_location != NULL) {
+                size_t len = HDstrlen(mdc_log_location);
+                if(NULL == (f->shared->mdc_log_location = (char *)HDcalloc(len + 1, sizeof(char))))
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, NULL, "can't allocate memory for mdc log file name")
+                HDstrncpy(f->shared->mdc_log_location, mdc_log_location, len);
+            }
+            else
+                f->shared->mdc_log_location = NULL;
+        }
+
+ 	/* Get object flush callback information */
+ 	if(H5P_get(plist, H5F_ACS_OBJECT_FLUSH_CB_NAME, &(f->shared->object_flush)) < 0)
+ 	    HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "can't get object flush cb info")
+
 	/*
 	 * Create a metadata cache with the specified number of elements.
 	 * The cache might be created with a different number of elements and
@@ -775,13 +810,15 @@ H5F_dest(H5F_t *f, hid_t dxpl_id, hbool_t flush)
          * Only try to flush the file if it was opened with write access, and if
          * the caller requested a flush.
          */
-        if((f->shared->flags & H5F_ACC_RDWR) && flush)
+        if((H5F_ACC_RDWR & H5F_INTENT(f)) && flush)
             if(H5F_flush(f, dxpl_id, TRUE) < 0)
+                /* Push error, but keep going*/
                 HDONE_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush cache")
 
         /* Release the external file cache */
         if(f->shared->efc) {
             if(H5F_efc_destroy(f->shared->efc) < 0)
+                /* Push error, but keep going*/
                 HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "can't destroy external file cache")
             f->shared->efc = NULL;
         } /* end if */
@@ -803,12 +840,29 @@ H5F_dest(H5F_t *f, hid_t dxpl_id, hbool_t flush)
                 /* Flush the file again (if requested), as shutting down the
                  * free space manager may dirty some data structures again.
                  */
-                if(flush)
+                if(flush) {
+		    /* Clear status_flags */
+                    f->shared->sblock->status_flags &= ~H5F_SUPER_WRITE_ACCESS;
+                    f->shared->sblock->status_flags &= ~H5F_SUPER_SWMR_WRITE_ACCESS;
+                    /* Mark superblock dirty in cache, so change will get encoded */
+                    /* Push error, but keep going*/
+                    if(H5F_super_dirty(f) < 0)
+                        HDONE_ERROR(H5E_FILE, H5E_CANTMARKDIRTY, FAIL, "unable to mark superblock as dirty")
+
                     if(H5F_flush(f, dxpl_id, TRUE) < 0)
                         /* Push error, but keep going*/
                         HDONE_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush cache")
+		}
             } /* end if */
 
+            /* if it exists, unpin the driver information block cache entry,
+             * since we're about to destroy the cache 
+             */
+            if(f->shared->drvinfo)
+                if(H5AC_unpin_entry(f->shared->drvinfo) < 0)
+                    /* Push error, but keep going*/
+                    HDONE_ERROR(H5E_FSPACE, H5E_CANTUNPIN, FAIL, "unable to unpin drvinfo")
+
             /* Unpin the superblock, since we're about to destroy the cache */
             if(H5AC_unpin_entry(f->shared->sblock) < 0)
                 /* Push error, but keep going*/
@@ -826,6 +880,10 @@ H5F_dest(H5F_t *f, hid_t dxpl_id, hbool_t flush)
             /* Push error, but keep going*/
             HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "problems closing file")
 
+        /* Clean up the metadata cache log location string */
+        if(f->shared->mdc_log_location)
+            HDfree(f->shared->mdc_log_location);
+
         /*
          * Do not close the root group since we didn't count it, but free
          * the memory associated with it.
@@ -934,6 +992,37 @@ H5F_dest(H5F_t *f, hid_t dxpl_id, hbool_t flush)
  *		The ACCESS_PARMS argument is optional.  A null pointer will
  *		cause the default file access parameters to be used.
  *
+ * The following two tables show results of file opens for single and concurrent access:
+ *
+ * SINGLE PROCESS ACCESS                        CONCURRENT ACCESS
+ *
+ *             #1st open#                                   #1st open#
+ *             -- SR SR -- -- SR SR --                      -- SR SR -- -- SR SR --
+ *             -- -- SW SW SW SW -- --                      -- -- SW SW SW SW -- --
+ *              W  W  W  W  R  R  R  R                       W  W  W  W  R  R  R  R
+ * #2nd open#                                   #2nd open#
+ *            --------------------------                   --------------------------
+ *   -- --  W | s  x  x  s  x  x  f  f |          -- --  W | f  x  x  f  x  x  f  f |
+ *   SR --  W | x  x  x  x  x  x  x  x |          SR --  W | x  x  x  x  x  x  x  x |
+ *   SR SW  W | x  x  x  x  x  x  x  x |          SR SW  W | x  x  x  x  x  x  x  x |
+ *   -- SW  W | f  x  x  s  x  x  f  f |          -- SW  W | f  x  x  f  x  x  f  f |
+ *   -- SW  R | x  x  x  x  x  x  x  x |          -- SW  R | x  x  x  x  x  x  x  x |
+ *   SR SW  R | x  x  x  x  x  x  x  x |          SR SW  R | x  x  x  x  x  x  x  x |
+ *   SR --  R | s  x  x  s  x  x  s  f |          SR --  R | f  x  x  s  x  x  s  s |
+ *   -- --  R | s  x  x  s  x  x  s  s |          -- --  R | f  x  x  f  x  x  s  s |
+ *            --------------------------                   --------------------------
+ *
+ *      Notations:
+ *        W:  H5F_ACC_RDWR
+ *        R:  H5F_ACC_RDONLY
+ *        SW: H5F_ACC_SWMR_WRITE
+ *        SR: H5F_ACC_SWMR_READ
+ *
+ *        x: the first open or second open itself fails due to invalid flags combination
+ *        f: the open fails with flags combination from both the first and second opens
+ *        s: the open succeeds with flags combination from both the first and second opens
+ *
+ *
  * Return:	Success:	A new file pointer.
  *		Failure:	NULL
  *
@@ -953,7 +1042,9 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
     H5FD_class_t       *drvr;               /*file driver class info        */
     H5P_genplist_t     *a_plist;            /*file access property list     */
     H5F_close_degree_t  fc_degree;          /*file close degree             */
-    H5F_t              *ret_value;          /*actual return value           */
+    hbool_t             set_flag = FALSE;   /*set the status_flags in the superblock */
+    hbool_t             clear = FALSE;      /*clear the status_flags 	    */
+    H5F_t              *ret_value = NULL;   /*actual return value           */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -1016,7 +1107,8 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
 	 * file (since we can't do that while the file is open), or if the
 	 * request was to create a non-existent file (since the file already
 	 * exists), or if the new request adds write access (since the
-	 * readers don't expect the file to change under them).
+	 * readers don't expect the file to change under them), or if the
+         * SWMR write/read access flags don't agree.
 	 */
 	if(H5FD_close(lf) < 0)
 	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to close low-level file info")
@@ -1027,6 +1119,11 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
 	if((flags & H5F_ACC_RDWR) && 0 == (shared->flags & H5F_ACC_RDWR))
 	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "file is already open for read-only")
 
+	if((flags & H5F_ACC_SWMR_WRITE) && 0 == (shared->flags & H5F_ACC_SWMR_WRITE))
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "SWMR write access flag not the same for file that is already open")
+	if((flags & H5F_ACC_SWMR_READ) && !((shared->flags & H5F_ACC_SWMR_WRITE) || (shared->flags & H5F_ACC_SWMR_READ) || (shared->flags & H5F_ACC_RDWR)))
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "SWMR read access flag not the same for file that is already open")
+
         /* Allocate new "high-level" file struct */
         if((file = H5F_new(shared, flags, fcpl_id, fapl_id, NULL)) == NULL)
             HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to create new file object")
@@ -1039,18 +1136,24 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
              * open it are different than the desired flags. Close the tentative
              * file and open it for real.
              */
-            if(H5FD_close(lf) < 0) {
-                file = NULL; /*to prevent destruction of wrong file*/
+            if(H5FD_close(lf) < 0)
                 HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to close low-level file info")
-            } /* end if */
-            if(NULL == (lf = H5FD_open(name, flags, fapl_id, HADDR_UNDEF))) {
-                file = NULL; /*to prevent destruction of wrong file*/
+
+            if(NULL == (lf = H5FD_open(name, flags, fapl_id, HADDR_UNDEF)))
                 HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to open file")
-            } /* end if */
         } /* end if */
 
-        if(NULL == (file = H5F_new(NULL, flags, fcpl_id, fapl_id, lf)))
-            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to create new file object")
+	/* Place an advisory lock on the file & create the 'top' file structure */
+        if((H5FD_lock(lf, (hbool_t)((flags & H5F_ACC_RDWR) ? TRUE : FALSE)) < 0) ||
+                (NULL == (file = H5F_new(NULL, flags, fcpl_id, fapl_id, lf)))) {
+            if(H5FD_close(lf) < 0) /* Closing will remove the lock */
+                HDONE_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to close low-level file info")
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to lock the file or initialize file structure")
+        }
+
+	/* Need to set status_flags in the superblock if the driver has a 'lock' method */
+	if(drvr->lock)
+	    set_flag = TRUE;
     } /* end else */
 
     /* Retain the name the file was opened with */
@@ -1064,7 +1167,7 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
      * Read or write the file superblock, depending on whether the file is
      * empty or not.
      */
-    if(0 == H5FD_get_eof(lf) && (flags & H5F_ACC_RDWR)) {
+    if(0 == (MAX(H5FD_get_eof(lf, H5FD_MEM_SUPER), H5FD_get_eoa(lf, H5FD_MEM_SUPER))) && (flags & H5F_ACC_RDWR)) {
         /*
          * We've just opened a fresh new file (or truncated one). We need
          * to create & write the superblock.
@@ -1072,7 +1175,7 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
 
         /* Initialize information about the superblock and allocate space for it */
         /* (Writes superblock extension messages, if there are any) */
-        if(H5F_super_init(file, dxpl_id) < 0)
+        if(H5F__super_init(file, dxpl_id) < 0)
             HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to allocate file superblock")
 
         /* Create and open the root group */
@@ -1082,8 +1185,9 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
         if(H5G_mkroot(file, dxpl_id, TRUE) < 0)
             HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create/open root group")
     } else if (1 == shared->nrefs) {
+
 	/* Read the superblock if it hasn't been read before. */
-        if(H5F_super_read(file, dxpl_id) < 0)
+        if(H5F__super_read(file, dxpl_id, TRUE) < 0)
 	    HGOTO_ERROR(H5E_FILE, H5E_READERROR, NULL, "unable to read superblock")
 
 	/* Open the root group */
@@ -1104,6 +1208,16 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
     if(H5P_get(a_plist, H5F_ACS_CLOSE_DEGREE_NAME, &fc_degree) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get file close degree")
 
+    /* This is a private property to clear the status_flags in the super block */
+    /* Use by h5clear and a routine in test/flush2.c to clear the test file's status_flags */
+    if(H5P_exist_plist(a_plist, H5F_ACS_CLEAR_STATUS_FLAGS_NAME) > 0) {
+        if(H5P_get(a_plist, H5F_ACS_CLEAR_STATUS_FLAGS_NAME, &clear) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get clearance for status_flags")
+        else if(clear) {
+            file->shared->sblock->status_flags = 0;
+        }
+    }
+
     if(shared->nrefs == 1) {
         if(fc_degree == H5F_CLOSE_DEFAULT)
             shared->fc_degree = lf->cls->fc_degree;
@@ -1124,13 +1238,58 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id,
     if(H5F_build_actual_name(file, a_plist, name, &file->actual_name) < 0)
 	HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to build actual name")
 
+    if(set_flag) {
+        if(H5F_INTENT(file) & H5F_ACC_RDWR) { /* Set and check consistency of status_flags */
+	    /* Skip check of status_flags for file with < superblock version 3 */
+            if(file->shared->sblock->super_vers >= HDF5_SUPERBLOCK_VERSION_3) {
+
+		if(file->shared->sblock->status_flags & H5F_SUPER_WRITE_ACCESS ||
+		   file->shared->sblock->status_flags & H5F_SUPER_SWMR_WRITE_ACCESS)
+		    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "file is already open for write/SWMR write (may use <h5clear file> to clear file consistency flags)")
+	    } /* version 3 superblock */
+
+            file->shared->sblock->status_flags |= H5F_SUPER_WRITE_ACCESS;
+            if(H5F_INTENT(file) & H5F_ACC_SWMR_WRITE)
+                file->shared->sblock->status_flags |= H5F_SUPER_SWMR_WRITE_ACCESS;
+
+            /* Flush the superblock */
+            if(H5F_super_dirty(file) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTMARKDIRTY, NULL, "unable to mark superblock as dirty")
+            if(H5F_flush_tagged_metadata(file, (haddr_t)0, H5AC_dxpl_id) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, NULL, "unable to flush superblock")
+
+	    /* Remove the file lock for SWMR_WRITE */
+            if(H5F_INTENT(file) & H5F_ACC_SWMR_WRITE) { 
+                if(H5FD_unlock(file->shared->lf) < 0)
+                    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to unlock the file")
+            }
+        } else { /* H5F_ACC_RDONLY: check consistency of status_flags */
+	    /* Skip check of status_flags for file with < superblock version 3 */
+            if(file->shared->sblock->super_vers >= HDF5_SUPERBLOCK_VERSION_3) {
+
+		if(H5F_INTENT(file) & H5F_ACC_SWMR_READ) { 
+		    if((file->shared->sblock->status_flags & H5F_SUPER_WRITE_ACCESS && 
+		       !(file->shared->sblock->status_flags & H5F_SUPER_SWMR_WRITE_ACCESS))
+			|| 
+		       (!(file->shared->sblock->status_flags & H5F_SUPER_WRITE_ACCESS) && 
+			file->shared->sblock->status_flags & H5F_SUPER_SWMR_WRITE_ACCESS))
+			HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "file is not already open for SWMR writing")
+
+		} else if((file->shared->sblock->status_flags & H5F_SUPER_WRITE_ACCESS) ||
+			  (file->shared->sblock->status_flags & H5F_SUPER_SWMR_WRITE_ACCESS))
+		    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "file is already open for write (may use <h5clear file> to clear file consistency flags)")
+
+	    } /* version 3 superblock */
+        }
+    } /* end if set_flag */
+
     /* Success */
     ret_value = file;
 
 done:
     if(!ret_value && file)
-        if(H5F_dest(file, dxpl_id, FALSE) < 0)
-            HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, NULL, "problems closing file")
+	if(H5F_dest(file, dxpl_id, FALSE) < 0)
+	    HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, NULL, "problems closing file")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5F_open() */
@@ -1452,7 +1611,7 @@ done:
 hid_t
 H5F_get_id(H5F_t *file, hbool_t app_ref)
 {
-    hid_t       ret_value;
+    hid_t ret_value = H5I_INVALID_HID;  /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1826,7 +1985,7 @@ H5F_addr_decode(const H5F_t *f, const uint8_t **pp/*in,out*/, haddr_t *addr_p/*o
  *-------------------------------------------------------------------------
  */
 herr_t
-H5F_set_grp_btree_shared(H5F_t *f, H5RC_t *rc)
+H5F_set_grp_btree_shared(H5F_t *f, H5UC_t *rc)
 {
     /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
     FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -1976,7 +2135,7 @@ H5F_get_file_image(H5F_t *file, void *buf_ptr, size_t buf_len)
 {
     H5FD_t     *fd_ptr;                 /* file driver */
     haddr_t     eoa;                    /* End of file address */
-    ssize_t     ret_value;              /* Return value */
+    ssize_t     ret_value = -1;         /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -2040,6 +2199,8 @@ H5F_get_file_image(H5F_t *file, void *buf_ptr, size_t buf_len)
     /* test to see if a buffer was provided -- if not, we are done */
     if(buf_ptr != NULL) {
         size_t	space_needed;		/* size of file image */
+	hsize_t tmp;
+        size_t tmp_size;
 
         /* Check for buffer too small */
         if((haddr_t)buf_len < eoa)
@@ -2051,8 +2212,203 @@ H5F_get_file_image(H5F_t *file, void *buf_ptr, size_t buf_len)
         /* (Note compensation for base address addition in internal routine) */
         if(H5FD_read(fd_ptr, H5AC_ind_dxpl_g, H5FD_MEM_DEFAULT, 0, space_needed, buf_ptr) < 0)
             HGOTO_ERROR(H5E_FILE, H5E_READERROR, FAIL, "file image read request failed")
+
+	/* Offset to "status_flags" in the superblock */
+        tmp = H5F_SUPER_STATUS_FLAGS_OFF(file->shared->sblock->super_vers);
+        /* Size of "status_flags" depends on the superblock version */
+        tmp_size = H5F_SUPER_STATUS_FLAGS_SIZE(file->shared->sblock->super_vers);
+
+        /* Clear "status_flags" */
+        HDmemset((uint8_t *)(buf_ptr) + tmp, 0, tmp_size);
+
     } /* end if */
     
 done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5F_get_file_image() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_track_metadata_read_retries
+ *
+ * Purpose:     To track the # of a "retries" (log10) for a metadata item.
+ *		This routine should be used only when:
+ *		  "retries" > 0
+ *		  f->shared->read_attempts > 1 (does not have retry when 1)
+ *		  f->shared->retries_nbins > 0 (calculated based on f->shared->read_attempts)
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Vailin Choi; October 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_track_metadata_read_retries(H5F_t *f, unsigned actype, unsigned retries)
+{
+    unsigned log_ind;			/* Index to the array of retries based on log10 of retries */
+    double tmp;                         /* Temporary value, to keep compiler quiet */
+    herr_t ret_value = SUCCEED; 	/* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared->read_attempts > 1);
+    HDassert(f->shared->retries_nbins > 0);
+    HDassert(retries > 0);
+    HDassert(retries < f->shared->read_attempts);
+    HDassert(actype < H5AC_NTYPES);
+
+    /* Allocate memory for retries */
+    if(NULL == f->shared->retries[actype])
+        if(NULL == (f->shared->retries[actype] = (uint32_t *)HDcalloc((size_t)f->shared->retries_nbins, sizeof(uint32_t))))
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+    /* Index to retries based on log10 */
+    tmp = HDlog10((double)retries);
+    log_ind = (unsigned)tmp;
+    HDassert(log_ind < f->shared->retries_nbins);
+
+    /* Increment the # of the "retries" */
+    f->shared->retries[actype][log_ind]++;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5F_track_metadata_read_retries() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_set_retries
+ *
+ * Purpose:     To initialize data structures for read retries:
+ *		--zero out "retries"
+ *		--set up "retries_nbins" based on read_attempts
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Vailin Choi; November 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_set_retries(H5F_t *f)
+{
+    double tmp;				/* Temporary variable */
+
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(f);
+
+    /* Initialize the tracking for metadata read retries */
+    HDmemset(f->shared->retries, 0, sizeof(f->shared->retries));
+
+    /* Initialize the # of bins for retries */
+    f->shared->retries_nbins = 0;
+    if(f->shared->read_attempts > 1) {
+        tmp = HDlog10((double)(f->shared->read_attempts - 1));
+        f->shared->retries_nbins = (unsigned)tmp + 1;
+    }
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5F_set_retries() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_object_flush_cb
+ *
+ * Purpose:     To invoke the callback function for object flush that is set
+ *              in the file's access property list.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  Vailin Choi; October 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_object_flush_cb(H5F_t *f, hid_t obj_id)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(f->shared);
+
+    /* Invoke object flush callback if there is one */
+    if(f->shared->object_flush.func && f->shared->object_flush.func(obj_id, f->shared->object_flush.udata) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "object flush callback returns error")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5F_object_flush_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F__set_base_addr
+ *
+ * Purpose:	Quick and dirty routine to set the file's 'base_addr' value
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		July 19, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F__set_base_addr(const H5F_t *f, haddr_t addr)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    /* Dispatch to driver */
+    if(H5FD_set_base_addr(f->shared->lf, addr) < 0)
+	HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "driver set_base_addr request failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F__set_base_addr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F__set_eoa
+ *
+ * Purpose:	Quick and dirty routine to set the file's 'eoa' value
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		July 19, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F__set_eoa(const H5F_t *f, H5F_mem_t type, haddr_t addr)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    /* Dispatch to driver */
+    if(H5FD_set_eoa(f->shared->lf, type, addr) < 0)
+	HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "driver set_eoa request failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F__set_eoa() */
+
diff --git a/src/H5Fio.c b/src/H5Fio.c
index 1d05cd0..d312b47 100644
--- a/src/H5Fio.c
+++ b/src/H5Fio.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+#include "H5Fmodule.h"          /* This source code file is part of the H5F module */
 
 
 /***********/
@@ -100,6 +100,9 @@ H5F_block_read(const H5F_t *f, H5FD_mem_t type, haddr_t addr, size_t size,
     herr_t      ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
+#ifdef QAK
+HDfprintf(stderr, "%s: read from addr = %a, size = %Zu\n", FUNC, addr, size);
+#endif /* QAK */
 
     HDassert(f);
     HDassert(f->shared);
@@ -174,3 +177,241 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5F_block_write() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_flush_tagged_metadata
+ *
+ * Purpose:     Flushes metadata with specified tag in the metadata cache 
+ *              to disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mike McGreevy
+ *              September 9, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_flush_tagged_metadata(H5F_t * f, haddr_t tag, hid_t dxpl_id)
+{
+    H5F_io_info_t fio_info;             /* I/O info for operation */
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Use tag to search for and flush associated metadata */
+    if(H5AC_flush_tagged_metadata(f, tag, dxpl_id)<0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush tagged metadata")
+
+    /* Set up I/O info for operation */
+    fio_info.f = f;
+
+    if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+    
+
+    /* Flush and reset the accumulator */
+    if(H5F__accum_reset(&fio_info, TRUE) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_CANTRESET, FAIL, "can't reset accumulator")
+
+    /* Flush file buffers to disk. */
+    if(H5FD_flush(f->shared->lf, dxpl_id, FALSE) < 0)
+        HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "low level flush failed")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5F_flush_tagged_metadata */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_evict_tagged_metadata
+ *
+ * Purpose:     Evicts metadata from the cache with specified tag.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:	Mike McGreevy
+ *              September 9, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_evict_tagged_metadata(H5F_t * f, haddr_t tag, hid_t dxpl_id)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Unpin the superblock, as this will be marked for eviction and it can't 
+        be pinned. */
+    if(H5AC_unpin_entry(f->shared->sblock) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, "unable to unpin superblock")
+    f->shared->sblock = NULL;
+
+    /* Evict the object's metadata */
+    if(H5AC_evict_tagged_metadata(f, tag, dxpl_id)<0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, "unable to evict tagged metadata")
+
+    /* Re-read the superblock. */
+    if(H5F__super_read(f, dxpl_id, FALSE) < 0)
+	HGOTO_ERROR(H5E_FILE, H5E_READERROR, FAIL, "unable to read superblock")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5F_evict_tagged_metadata */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_evict_cache_entries
+ *
+ * Purpose:     To revict all cache entries except the pinned superblock entry
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; Dec 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_evict_cache_entries(H5F_t *f, hid_t dxpl_id)
+{
+    unsigned status = 0;
+    int32_t    cur_num_entries;
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    /* Evict all except pinned entries in the cache */
+    if(H5AC_evict(f, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, "unable to evict all except pinned entries")
+
+    /* Retrieve status of the superblock */
+    if(H5AC_get_entry_status(f, (haddr_t)0, &status) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to get entry status")
+
+    /* Verify status of the superblock entry in the cache */
+    if(!(status & H5AC_ES__IN_CACHE) || !(status & H5AC_ES__IS_PINNED))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to get entry status")
+
+    /* Get the number of cache entries */
+    if(H5AC_get_cache_size(f->shared->cache, NULL, NULL, NULL, &cur_num_entries) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_get_cache_size() failed.")
+
+    /* Should be the only one left in the cache */
+    if(cur_num_entries != 1)
+        HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "number of cache entries is not correct")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5F_evict_cache_entries() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_get_checksums
+ *
+ * Purpose:   	Decode checksum stored in the buffer
+ *		Calculate checksum for the data in the buffer
+ *
+ * Note:	Assumes that the checksum is the last data in the buffer
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; Sept 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_get_checksums(const uint8_t *buf, size_t buf_size, uint32_t *s_chksum/*out*/, uint32_t *c_chksum/*out*/)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check arguments */
+    HDassert(buf);
+    HDassert(buf_size);
+
+    /* Return the stored checksum */
+    if(s_chksum) {
+        const uint8_t *chk_p;      	/* Pointer into raw data buffer */
+
+        /* Offset to the checksum in the buffer */
+        chk_p = buf + buf_size - H5_SIZEOF_CHKSUM;
+
+        /* Decode the checksum stored in the buffer */
+        UINT32DECODE(chk_p, *s_chksum);
+    } /* end if */
+
+    /* Return the computed checksum for the buffer */
+    if(c_chksum)
+	*c_chksum = H5_checksum_metadata(buf, buf_size - H5_SIZEOF_CHKSUM, 0);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5F_get_chksums() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_read_check_meatadata
+ *
+ * Purpose:   	Attempts to read and validate a piece of meatadata that has
+ *		checksum as follows:
+ * 		  a) read the piece of metadata
+ * 		  b) calculate checksum for the buffer of metadata
+ * 		  c) decode the checksum stored in the buffer of metadata
+ *		  d) compare the computed checksum with its stored checksum
+ *
+ *	       	The library will perform (a) to (d) above for "f->read_attempts"
+ *		times or until the checksum comparison in (d) passes.
+ *		This routine also records the # of retries via 
+ *		H5F_track_metadata_read_retries()
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; Sept 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_read_check_metadata(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type,
+    unsigned actype, haddr_t addr, size_t read_size, size_t chk_size,
+    uint8_t *buf/*out*/)
+{
+    unsigned tries, max_tries;	/* The # of read attempts */
+    unsigned retries;		/* The # of retries */
+    uint32_t stored_chksum;  	/* Stored metadata checksum value */
+    uint32_t computed_chksum; 	/* Computed metadata checksum value */
+    herr_t ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get the # of read attempts */
+    max_tries = tries = H5F_GET_READ_ATTEMPTS(f);
+
+    do {
+        /* Read header from disk */
+        if(H5F_block_read(f, type, addr, read_size, dxpl_id, buf) < 0)
+	    HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "unable to read metadata")
+
+	/* Get stored and computed checksums */
+	H5F_get_checksums(buf, chk_size, &stored_chksum, &computed_chksum);
+
+        /* Verify checksum */
+        if(stored_chksum == computed_chksum)
+            break;
+    } while(--tries);
+
+    /* Check for too many tries */
+    if(tries == 0)
+        HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "incorrect metadatda checksum after all read attempts (%u) for %u bytes:c_chksum=%u, s_chkum=%u", 
+	    max_tries, chk_size, computed_chksum, stored_chksum)
+
+    /* Calculate and track the # of retries */
+    retries = max_tries - tries;
+    if(retries)         /* Does not track 0 retry */
+	if(H5F_track_metadata_read_retries(f, actype, retries) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "cannot track read tries = %u ", retries)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5F_read_check_metadata */
diff --git a/src/H5Fmodule.h b/src/H5Fmodule.h
new file mode 100644
index 0000000..4bb2506
--- /dev/null
+++ b/src/H5Fmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5F package.  Including this header means that the source file
+ *		is part of the H5F package.
+ */
+#ifndef _H5Fmodule_H
+#define _H5Fmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5F_MODULE
+#define H5_MY_PKG       H5F
+#define H5_MY_PKG_ERR   H5E_FILE
+#define H5_MY_PKG_INIT  YES
+
+#endif /* _H5Fmodule_H */
+
diff --git a/src/H5Fmount.c b/src/H5Fmount.c
index 643eba5..99fa4f2 100644
--- a/src/H5Fmount.c
+++ b/src/H5Fmount.c
@@ -13,10 +13,7 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5F_init_mount_interface
+#include "H5Fmodule.h"          /* This source code file is part of the H5F module */
 
 
 /* Packages needed by this file... */
@@ -36,28 +33,6 @@ static herr_t H5F_unmount(H5G_loc_t *loc, const char *name, hid_t dxpl_id);
 static void H5F_mount_count_ids_recurse(H5F_t *f, unsigned *nopen_files, unsigned *nopen_objs);
 
 

-/*--------------------------------------------------------------------------
-NAME
-   H5F_init_mount_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5F_init_mount_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5F_init() currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5F_init_mount_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5F_init())
-} /* H5F_init_mount_interface() */
-
-

 /*-------------------------------------------------------------------------
  * Function:	H5F_close_mounts
  *
@@ -439,7 +414,7 @@ done:
 hbool_t
 H5F_is_mount(const H5F_t *file)
 {
-    hbool_t ret_value;   /* Return value */
+    hbool_t ret_value = FALSE;          /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
diff --git a/src/H5Fmpi.c b/src/H5Fmpi.c
index 39b8dfa..fe2a774 100644
--- a/src/H5Fmpi.c
+++ b/src/H5Fmpi.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+#include "H5Fmodule.h"          /* This source code file is part of the H5F module */
 
 
 /***********/
diff --git a/src/H5Fpkg.h b/src/H5Fpkg.h
index 21034d7..f9cd89f 100644
--- a/src/H5Fpkg.h
+++ b/src/H5Fpkg.h
@@ -21,7 +21,7 @@
  *		the H5F package.  Source files outside the H5F package should
  *		include H5Fprivate.h instead.
  */
-#ifndef H5F_PACKAGE
+#if !(defined H5F_FRIEND || defined H5F_MODULE)
 #error "Do not include this file outside the H5F package!"
 #endif
 
@@ -42,7 +42,7 @@
 #include "H5FSprivate.h"	/* File free space                      */
 #include "H5Gprivate.h"		/* Groups 			  	*/
 #include "H5Oprivate.h"         /* Object header messages               */
-#include "H5RCprivate.h"	/* Reference counted object functions	*/
+#include "H5UCprivate.h"	/* Reference counted object functions	*/
 
 
 /*
@@ -56,17 +56,20 @@
 /* Superblock status flags */
 #define H5F_SUPER_WRITE_ACCESS          0x01
 #define H5F_SUPER_FILE_OK               0x02
-#define H5F_SUPER_ALL_FLAGS             (H5F_SUPER_WRITE_ACCESS | H5F_SUPER_FILE_OK)
+#define H5F_SUPER_SWMR_WRITE_ACCESS     0x04
+#define H5F_SUPER_ALL_FLAGS             (H5F_SUPER_WRITE_ACCESS | H5F_SUPER_FILE_OK | H5F_SUPER_SWMR_WRITE_ACCESS)
 
 /* Mask for removing private file access flags */
-#define H5F_ACC_PUBLIC_FLAGS 	        0x001fu
+#define H5F_ACC_PUBLIC_FLAGS 	        0x007fu
 
 /* Free space section+aggregator merge flags */
 #define H5F_FS_MERGE_METADATA           0x01    /* Section can merge with metadata aggregator */
 #define H5F_FS_MERGE_RAWDATA            0x02    /* Section can merge with small 'raw' data aggregator */
 
 /* Macro to abstract checking whether file is using a free space manager */
-#define H5F_HAVE_FREE_SPACE_MANAGER(F)  TRUE    /* Currently always have a free space manager */
+#define H5F_HAVE_FREE_SPACE_MANAGER(F)  \
+    ((F)->shared->fs_strategy == H5F_FILE_SPACE_ALL ||                        \
+            (F)->shared->fs_strategy == H5F_FILE_SPACE_ALL_PERSIST)
 
 /* Macros for encoding/decoding superblock */
 #define H5F_MAX_DRVINFOBLOCK_SIZE  1024         /* Maximum size of superblock driver info buffer */
@@ -79,6 +82,21 @@
 #define H5F_SUPERBLOCK_FIXED_SIZE ( H5F_SIGNATURE_LEN                   \
         + 1) /* superblock version */
 
+/* The H5F_SUPERBLOCK_MINIMAL_VARLEN_SIZE is the minimal amount of super block
+ * variable length data guarnateed to load the sizeof offsets and the sizeof 
+ * lengths fields in all versions of the superblock.
+ *
+ * This is necessary in the V3 cache, as on the initial load, we need to 
+ * get enough of the superblock to determine its version and size so that
+ * the metadata cache can load the correct amount of data from file to 
+ * allow the second deserialization attempt to succeed.
+ *
+ * The value selected will have to be revisited for each new version 
+ * of the super block.  Note that the current value is one byte larger
+ * than it needs to be. 
+ */
+#define H5F_SUPERBLOCK_MINIMAL_VARLEN_SIZE	7
+
 /* Macros for computing variable-size superblock size */
 #define H5F_SUPERBLOCK_VARLEN_SIZE_COMMON                               \
         (2  /* freespace, and root group versions */			\
@@ -87,44 +105,91 @@
         + 1 /* reserved */                                              \
         + 4 /* group leaf k, group internal k */                        \
         + 4) /* consistency flags */
-#define H5F_SUPERBLOCK_VARLEN_SIZE_V0(f)                                \
+#define H5F_SUPERBLOCK_VARLEN_SIZE_V0(sizeof_addr, sizeof_size)         \
         ( H5F_SUPERBLOCK_VARLEN_SIZE_COMMON /* Common variable-length info */ \
-        + H5F_SIZEOF_ADDR(f) /* base address */                         \
-        + H5F_SIZEOF_ADDR(f) /* <unused> */				\
-        + H5F_SIZEOF_ADDR(f) /* EOF address */                          \
-        + H5F_SIZEOF_ADDR(f) /* driver block address */                 \
-        + H5G_SIZEOF_ENTRY(f)) /* root group ptr */
-#define H5F_SUPERBLOCK_VARLEN_SIZE_V1(f)                                \
+        + (sizeof_addr) /* base address */                              \
+        + (sizeof_addr) /* <unused> */                                  \
+        + (sizeof_addr) /* EOF address */                               \
+        + (sizeof_addr) /* driver block address */                      \
+        + H5G_SIZEOF_ENTRY(sizeof_addr, sizeof_size)) /* root group ptr */
+#define H5F_SUPERBLOCK_VARLEN_SIZE_V1(sizeof_addr, sizeof_size)         \
         ( H5F_SUPERBLOCK_VARLEN_SIZE_COMMON /* Common variable-length info */ \
         + 2 /* indexed B-tree internal k */                             \
         + 2 /* reserved */                                              \
-        + H5F_SIZEOF_ADDR(f) /* base address */                         \
-        + H5F_SIZEOF_ADDR(f) /* <unused> */				\
-        + H5F_SIZEOF_ADDR(f) /* EOF address */                          \
-        + H5F_SIZEOF_ADDR(f) /* driver block address */                 \
-        + H5G_SIZEOF_ENTRY(f)) /* root group ptr */
-#define H5F_SUPERBLOCK_VARLEN_SIZE_V2(f)                                \
+        + (sizeof_addr) /* base address */                              \
+        + (sizeof_addr) /* <unused> */                                  \
+        + (sizeof_addr) /* EOF address */                               \
+        + (sizeof_addr) /* driver block address */                      \
+        + H5G_SIZEOF_ENTRY(sizeof_addr, sizeof_size)) /* root group ptr */
+#define H5F_SUPERBLOCK_VARLEN_SIZE_V2(sizeof_addr)                      \
         ( 2 /* size of address, size of lengths */                      \
         + 1 /* consistency flags */                                     \
-        + H5F_SIZEOF_ADDR(f) /* base address */                         \
-        + H5F_SIZEOF_ADDR(f) /* superblock extension address */         \
-        + H5F_SIZEOF_ADDR(f) /* EOF address */                          \
-        + H5F_SIZEOF_ADDR(f) /* root group object header address */     \
+        + (sizeof_addr) /* base address */                              \
+        + (sizeof_addr) /* superblock extension address */              \
+        + (sizeof_addr) /* EOF address */                               \
+        + (sizeof_addr) /* root group object header address */          \
         + H5F_SIZEOF_CHKSUM) /* superblock checksum (keep this last) */
-#define H5F_SUPERBLOCK_VARLEN_SIZE(v, f) (				\
-        (v == 0 ? H5F_SUPERBLOCK_VARLEN_SIZE_V0(f) : 0)			\
-        + (v == 1 ? H5F_SUPERBLOCK_VARLEN_SIZE_V1(f) : 0)               \
-        + (v == 2 ? H5F_SUPERBLOCK_VARLEN_SIZE_V2(f) : 0))
+#define H5F_SUPERBLOCK_VARLEN_SIZE(v, sizeof_addr, sizeof_size) (	\
+        (v == 0 ? H5F_SUPERBLOCK_VARLEN_SIZE_V0(sizeof_addr, sizeof_size) : 0) \
+        + (v == 1 ? H5F_SUPERBLOCK_VARLEN_SIZE_V1(sizeof_addr, sizeof_size) : 0) \
+        + (v >= 2 ? H5F_SUPERBLOCK_VARLEN_SIZE_V2(sizeof_addr) : 0))
 
 /* Total size of superblock, depends on superblock version */
-#define H5F_SUPERBLOCK_SIZE(v, f) ( H5F_SUPERBLOCK_FIXED_SIZE           \
-        + H5F_SUPERBLOCK_VARLEN_SIZE(v, f))
+#define H5F_SUPERBLOCK_SIZE(s) ( H5F_SUPERBLOCK_FIXED_SIZE              \
+        + H5F_SUPERBLOCK_VARLEN_SIZE((s)->super_vers, (s)->sizeof_addr, (s)->sizeof_size))
+
+/* For superblock version 0 & 1:
+   Offset to the file consistency flags (status_flags) in the superblock (excluding H5F_SUPERBLOCK_FIXED_SIZE) */
+#define H5F_SUPER_STATUS_OFF_V01                                                \
+        (2  /* freespace, and root group versions */                    \
+        + 1 /* reserved */                                              \
+        + 3 /* shared header vers, size of address, size of lengths */  \
+        + 1 /* reserved */                                              \
+        + 4) /* group leaf k, group internal k */
 
+#define H5F_SUPER_STATUS_OFF(v)   (v >= 2 ? 2 : H5F_SUPER_STATUS_OFF_V01)
+
+/* Offset to the file consistency flags (status_flags) in the superblock */
+#define H5F_SUPER_STATUS_FLAGS_OFF(v) (H5F_SUPERBLOCK_FIXED_SIZE + H5F_SUPER_STATUS_OFF(v))
+
+/* Size of file consistency flags (status_flags) in the superblock */
+#define H5F_SUPER_STATUS_FLAGS_SIZE(v)        (v >= 2 ? 1 : 4)
+
+/* 
+ * User data for superblock protect in H5F_super_read: 
+ *   dirtied: the superblock is modifed or not
+ *   initial read: superlock read upon the file's initial open--
+ *		   whether to skip the check for truncated file in H5F_sblock_load()
+ */
+typedef struct H5F_super_ud_t {
+    hbool_t dirtied;
+    hbool_t initial_read;
+} H5F_super_ud_t;
 
 /* Forward declaration external file cache struct used below (defined in
  * H5Fefc.c) */
 typedef struct H5F_efc_t H5F_efc_t;
 
+/* Structure for passing 'user data' to superblock cache callbacks */
+typedef struct H5F_superblock_cache_ud_t {
+/* IN: */
+    H5F_t *f;               /* Pointer to file */
+    hbool_t ignore_drvrinfo; /* Indicate if the driver info should be ignored */
+/* OUT: */
+    unsigned sym_leaf_k;    /* Symbol table leaf node's 'K' value */
+    unsigned btree_k[H5B_NUM_BTREE_ID]; /* B-tree key values for each type */
+    haddr_t stored_eof;     /* End-of-file in file */
+    hbool_t drvrinfo_removed; /* Indicate if the driver info was removed */
+    unsigned    super_vers;   /* Superblock version obtained in get_load_size callback. 
+			       * It will be used later in verify_chksum callback 
+			       */
+} H5F_superblock_cache_ud_t;
+
+typedef struct H5F_drvrinfo_cache_ud_t {
+    H5F_t   *f;               /* Pointer to file */
+    haddr_t driver_addr;      /* address of driver info block */
+} H5F_drvrinfo_cache_ud_t;
+
 /* Structure for metadata & "small [raw] data" block aggregation fields */
 struct H5F_blk_aggr_t {
     unsigned long       feature_flag;   /* Feature flag type */
@@ -174,6 +239,8 @@ typedef struct H5F_mtab_t {
 typedef struct H5F_super_t {
     H5AC_info_t cache_info;     /* Cache entry information structure          */
     unsigned    super_vers;     /* Superblock version                         */
+    uint8_t	sizeof_addr;	/* Size of addresses in file                  */
+    uint8_t	sizeof_size;	/* Size of offsets in file                    */
     uint8_t     status_flags;   /* File status flags                          */
     unsigned    sym_leaf_k;     /* Size of leaves in symbol tables            */
     unsigned    btree_k[H5B_NUM_BTREE_ID]; /* B-tree key values for each type */
@@ -195,6 +262,13 @@ typedef struct H5F_super_t {
 struct H5F_file_t {
     H5FD_t	*lf; 		/* Lower level file handle for I/O	*/
     H5F_super_t *sblock;        /* Pointer to (pinned) superblock for file */
+    H5O_drvinfo_t *drvinfo;	/* Pointer to the (pinned) driver info 
+                                 * cache entry.  This field is only defined
+                                 * for older versions of the super block,
+                                 * and then only when a driver information
+                                 * block is present.  At all other times
+                                 * it should be NULL.
+                                 */
     unsigned	nrefs;		/* Ref count for times file is opened	*/
     unsigned	flags;		/* Access Permissions for file          */
     H5F_mtab_t	mtab;		/* File mount table                     */
@@ -215,6 +289,10 @@ struct H5F_file_t {
                                 /* metadata cache.  This structure is   */
                                 /* fixed at creation time and should    */
                                 /* not change thereafter.               */
+    hbool_t     use_mdc_logging; /* Set when metadata logging is desired */
+    hbool_t     start_mdc_log_on_access; /* set when mdc logging should  */
+                                /* begin on file access/create          */
+    char        *mdc_log_location; /* location of mdc log               */
     hid_t       fcpl_id;	/* File creation property list ID 	*/
     H5F_close_degree_t fc_degree;   /* File close behavior degree	*/
     size_t	rdcc_nslots;	/* Size of raw data chunk cache (slots)	*/
@@ -225,14 +303,17 @@ struct H5F_file_t {
     hsize_t	alignment;	/* Alignment				*/
     unsigned	gc_ref;		/* Garbage-collect references?		*/
     hbool_t	latest_format;	/* Always use the latest format?	*/
+    unsigned	latest_flags;	/* The latest version support */
     hbool_t	store_msg_crt_idx;  /* Store creation index for object header messages?	*/
     unsigned	ncwfs;		/* Num entries on cwfs list		*/
     struct H5HG_heap_t **cwfs;	/* Global heap cache			*/
     struct H5G_t *root_grp;	/* Open root group			*/
     H5FO_t *open_objs;          /* Open objects in file                 */
-    H5RC_t *grp_btree_shared;   /* Ref-counted group B-tree node info   */
+    H5UC_t *grp_btree_shared;   /* Ref-counted group B-tree node info   */
 
     /* File space allocation information */
+    H5F_file_space_type_t fs_strategy;	/* File space handling strategy		*/
+    hsize_t     fs_threshold;	/* Free space section threshold 	*/
     hbool_t     use_tmp_space;  /* Whether temp. file space allocation is allowed */
     haddr_t	tmp_addr;       /* Next address to use for temp. space in the file */
     unsigned fs_aggr_merge[H5FD_MEM_NTYPES];    /* Flags for whether free space can merge with aggregator(s) */
@@ -247,6 +328,12 @@ struct H5F_file_t {
 
     /* Metadata accumulator information */
     H5F_meta_accum_t accum;     /* Metadata accumulator info           	*/
+
+    /* Metadata retry info */
+    unsigned 		read_attempts;	/* The # of reads to try when reading metadata with checksum */
+    unsigned		retries_nbins;		/* # of bins for each retries[] */
+    uint32_t		*retries[H5AC_NTYPES];  /* Track # of read retries for metdata items with checksum */
+    H5F_object_flush_t 	object_flush;		/* Information for object flush callback */
 };
 
 /*
@@ -279,6 +366,7 @@ H5FL_EXTERN(H5F_t);
 H5FL_EXTERN(H5F_file_t);
 
 H5_DLLVAR const H5AC_class_t H5AC_SUPERBLOCK[1];
+H5_DLLVAR const H5AC_class_t H5AC_DRVRINFO[1];
 
 
 /******************************/
@@ -286,8 +374,6 @@ H5_DLLVAR const H5AC_class_t H5AC_SUPERBLOCK[1];
 /******************************/
 
 /* General routines */
-H5_DLL herr_t H5F_init(void);
-H5_DLL herr_t H5F__term_deprec_interface(void);
 H5F_t *H5F_new(H5F_file_t *shared, unsigned flags, hid_t fcpl_id,
     hid_t fapl_id, H5FD_t *lf);
 herr_t H5F_dest(H5F_t *f, hid_t dxpl_id, hbool_t flush);
@@ -302,15 +388,15 @@ H5_DLL int H5F_term_unmount_cb(void *obj_ptr, hid_t obj_id, void *key);
 H5_DLL herr_t H5F_mount_count_ids(H5F_t *f, unsigned *nopen_files, unsigned *nopen_objs);
 
 /* Superblock related routines */
-H5_DLL herr_t H5F_super_init(H5F_t *f, hid_t dxpl_id);
-H5_DLL herr_t H5F_super_read(H5F_t *f, hid_t dxpl_id);
-H5_DLL herr_t H5F_super_size(H5F_t *f, hid_t dxpl_id, hsize_t *super_size,
-    hsize_t *super_ext_info);
-H5_DLL herr_t H5F_super_free(H5F_super_t *sblock);
+H5_DLL herr_t H5F__super_init(H5F_t *f, hid_t dxpl_id);
+H5_DLL herr_t H5F__super_read(H5F_t *f, hid_t dxpl_id, hbool_t initial_read);
+H5_DLL herr_t H5F__super_size(H5F_t *f, hid_t dxpl_id, hsize_t *super_size, hsize_t *super_ext_size);
+H5_DLL herr_t H5F__super_free(H5F_super_t *sblock);
 
 /* Superblock extension related routines */
 H5_DLL herr_t H5F_super_ext_open(H5F_t *f, haddr_t ext_addr, H5O_loc_t *ext_ptr);
 H5_DLL herr_t H5F_super_ext_write_msg(H5F_t *f, hid_t dxpl_id, void *mesg, unsigned id, hbool_t may_create);
+H5_DLL herr_t H5F_super_ext_remove_msg(H5F_t *f, hid_t dxpl_id, unsigned id);
 H5_DLL herr_t H5F_super_ext_close(H5F_t *f, H5O_loc_t *ext_ptr, hid_t dxpl_id,
     hbool_t was_created);
 
@@ -336,6 +422,10 @@ H5_DLL herr_t H5F_efc_release(H5F_efc_t *efc);
 H5_DLL herr_t H5F_efc_destroy(H5F_efc_t *efc);
 H5_DLL herr_t H5F_efc_try_close(H5F_t *f);
 
+/* Functions that get/retrieve values from VFD layer */
+H5_DLL herr_t H5F__set_eoa(const H5F_t *f, H5F_mem_t type, haddr_t addr);
+H5_DLL herr_t H5F__set_base_addr(const H5F_t *f, haddr_t addr);
+
 /* Testing functions */
 #ifdef H5F_TESTING
 H5_DLL herr_t H5F_get_sohm_mesg_count_test(hid_t fid, unsigned type_id,
diff --git a/src/H5Fprivate.h b/src/H5Fprivate.h
index d8014c1..6be0cff 100644
--- a/src/H5Fprivate.h
+++ b/src/H5Fprivate.h
@@ -27,6 +27,7 @@
 #include "H5FDpublic.h"		/* File drivers				*/
 
 /* Private headers needed by this file */
+#include "H5VMprivate.h"		/* Vectors and arrays */
 
 
 /**************************/
@@ -106,6 +107,35 @@
 /* (Assumes that the high bits of the integer are zero) */
 #  define UINT64ENCODE_VAR(p, n, l)     ENCODE_VAR(p, uint64_t, n, l)
 
+/* Encode a 64-bit unsigned integer and its length into a variable-sized buffer */
+/* (Assumes that the high bits of the integer are zero) */
+#  define UINT64ENCODE_VARLEN(p, n) {					      \
+   uint64_t __n = (uint64_t)(n);							      \
+   unsigned _s = H5VM_limit_enc_size(__n);				      \
+									      \
+   *(p)++ = (uint8_t)_s;						      \
+   UINT64ENCODE_VAR(p, __n, _s);						      \
+}
+
+#  define H5_ENCODE_UNSIGNED(p, n) {					      \
+    HDcompile_assert(sizeof(unsigned) == sizeof(uint32_t));		      \
+    UINT32ENCODE(p, n)							      \
+}
+
+/* Assumes the endianness of uint64_t is the same as double */
+#  define H5_ENCODE_DOUBLE(p, n) {					      \
+    uint64_t _n;							      \
+    size_t _u;								      \
+    uint8_t *_p = (uint8_t*)(p);					      \
+									      \
+    HDcompile_assert(sizeof(double) == 8);				      \
+    HDcompile_assert(sizeof(double) == sizeof(uint64_t));		      \
+    HDmemcpy(&_n, &n, sizeof(double));					      \
+    for(_u = 0; _u < sizeof(uint64_t); _u++, _n >>= 8)			      \
+        *_p++ = (uint8_t)(_n & 0xff);					      \
+    (p) = (uint8_t *)(p) + 8;						      \
+}
+
 /* DECODE converts little endian bytes pointed by p to integer values and store
  * it in i.  For signed values, need to do sign-extension when converting
  * the last byte which carries the sign bit.
@@ -126,11 +156,11 @@
 }
 
 #  define INT32DECODE(p, i) {						      \
-   (i)	= (	     *(p) & 0xff);	  (p)++;			      \
-   (i) |= ((int32_t)(*(p) & 0xff) <<  8); (p)++;			      \
-   (i) |= ((int32_t)(*(p) & 0xff) << 16); (p)++;			      \
-   (i) |= ((int32_t)(((*(p) & 0xff) << 24) |                                  \
-                   ((*(p) & 0x80) ? ~0xffffffff : 0x0))); (p)++;	      \
+   (i)	= ((int32_t)(*(p) & (unsigned)0xff));	  (p)++;		      \
+   (i) |= ((int32_t)(*(p) & (unsigned)0xff) <<  8); (p)++;		      \
+   (i) |= ((int32_t)(*(p) & (unsigned)0xff) << 16); (p)++;		      \
+   (i) |= ((int32_t)(((*(p) & (unsigned)0xff) << 24) |                        \
+                   ((*(p) & (unsigned)0x80) ? (unsigned)(~0xffffffff) : (unsigned)0x0))); (p)++; \
 }
 
 #  define UINT32DECODE(p, i) {						      \
@@ -182,11 +212,38 @@
 /* (Assumes that the high bits of the integer will be zero) */
 #  define UINT64DECODE_VAR(p, n, l)     DECODE_VAR(p, n, l)
 
+/* Decode a 64-bit unsigned integer and its length from a variable-sized buffer */
+/* (Assumes that the high bits of the integer will be zero) */
+#  define UINT64DECODE_VARLEN(p, n) {					      \
+   unsigned _s = *(p)++;						      \
+									      \
+   UINT64DECODE_VAR(p, n, _s);						      \
+}
+
+#  define H5_DECODE_UNSIGNED(p, n) {					      \
+    HDcompile_assert(sizeof(unsigned) == sizeof(uint32_t));		      \
+    UINT32DECODE(p, n)							      \
+}
+
+/* Assumes the endianness of uint64_t is the same as double */
+#  define H5_DECODE_DOUBLE(p, n) {					      \
+    uint64_t _n;							      \
+    size_t _u;								      \
+									      \
+    HDcompile_assert(sizeof(double) == 8);				      \
+    HDcompile_assert(sizeof(double) == sizeof(uint64_t));		      \
+    _n = 0;								      \
+    (p) += 8;								      \
+    for(_u = 0; _u < sizeof(uint64_t); _u++)				      \
+        _n = (_n << 8) | *(--p);					      \
+    HDmemcpy(&(n), &_n, sizeof(double));					      \
+    (p) += 8;								      \
+}
+
 /* Address-related macros */
 #define H5F_addr_overflow(X,Z)	(HADDR_UNDEF==(X) ||			      \
 				 HADDR_UNDEF==(X)+(haddr_t)(Z) ||	      \
 				 (X)+(haddr_t)(Z)<(X))
-#define H5F_addr_hash(X,M)	((unsigned)((X)%(M)))
 #define H5F_addr_defined(X)	((X)!=HADDR_UNDEF)
 /* The H5F_addr_eq() macro guarantees that Y is not HADDR_UNDEF by making
  * certain that X is not HADDR_UNDEF and then checking that X equals Y
@@ -213,7 +270,7 @@
                                  ((O1) >= (O2) && (O1) < ((O2) + (L2))))
 
 /* If the module using this macro is allowed access to the private variables, access them directly */
-#ifdef H5F_PACKAGE
+#ifdef H5F_MODULE
 #define H5F_INTENT(F)           ((F)->shared->flags)
 #define H5F_OPEN_NAME(F)        ((F)->open_name)
 #define H5F_ACTUAL_NAME(F)      ((F)->actual_name)
@@ -226,6 +283,7 @@
 #define H5F_FILE_ID(F)          ((F)->file_id)
 #define H5F_PARENT(F)           ((F)->parent)
 #define H5F_NMOUNTS(F)          ((F)->nmounts)
+#define H5F_GET_READ_ATTEMPTS(F) ((F)->shared->read_attempts)
 #define H5F_DRIVER_ID(F)        ((F)->shared->lf->driver_id)
 #define H5F_GET_FILENO(F,FILENUM) ((FILENUM) = (F)->shared->lf->fileno)
 #define H5F_HAS_FEATURE(F,FL)   ((F)->shared->lf->feature_flags & (FL))
@@ -249,13 +307,14 @@
 #define H5F_SIEVE_BUF_SIZE(F)   ((F)->shared->sieve_buf_size)
 #define H5F_GC_REF(F)           ((F)->shared->gc_ref)
 #define H5F_USE_LATEST_FORMAT(F) ((F)->shared->latest_format)
+#define H5F_USE_LATEST_FLAGS(F,FL)  ((F)->shared->latest_flags & (FL))
 #define H5F_STORE_MSG_CRT_IDX(F)    ((F)->shared->store_msg_crt_idx)
 #define H5F_SET_STORE_MSG_CRT_IDX(F, FL)    ((F)->shared->store_msg_crt_idx = (FL))
 #define H5F_GRP_BTREE_SHARED(F) ((F)->shared->grp_btree_shared)
 #define H5F_SET_GRP_BTREE_SHARED(F, RC) (((F)->shared->grp_btree_shared = (RC)) ? SUCCEED : FAIL)
 #define H5F_USE_TMP_SPACE(F)    ((F)->shared->use_tmp_space)
 #define H5F_IS_TMP_ADDR(F, ADDR) (H5F_addr_le((F)->shared->tmp_addr, (ADDR)))
-#else /* H5F_PACKAGE */
+#else /* H5F_MODULE */
 #define H5F_INTENT(F)           (H5F_get_intent(F))
 #define H5F_OPEN_NAME(F)        (H5F_get_open_name(F))
 #define H5F_ACTUAL_NAME(F)      (H5F_get_actual_name(F))
@@ -268,6 +327,7 @@
 #define H5F_FILE_ID(F)          (H5F_get_file_id(F))
 #define H5F_PARENT(F)           (H5F_get_parent(F))
 #define H5F_NMOUNTS(F)          (H5F_get_nmounts(F))
+#define H5F_GET_READ_ATTEMPTS(F) (H5F_get_read_attempts(F))
 #define H5F_DRIVER_ID(F)        (H5F_get_driver_id(F))
 #define H5F_GET_FILENO(F,FILENUM) (H5F_get_fileno((F), &(FILENUM)))
 #define H5F_HAS_FEATURE(F,FL)   (H5F_has_feature(F,FL))
@@ -291,13 +351,14 @@
 #define H5F_SIEVE_BUF_SIZE(F)   (H5F_sieve_buf_size(F))
 #define H5F_GC_REF(F)           (H5F_gc_ref(F))
 #define H5F_USE_LATEST_FORMAT(F) (H5F_use_latest_format(F))
+#define H5F_USE_LATEST_FLAGS(F,FL) (H5F_use_latest_flags(F,FL))
 #define H5F_STORE_MSG_CRT_IDX(F) (H5F_store_msg_crt_idx(F))
 #define H5F_SET_STORE_MSG_CRT_IDX(F, FL)    (H5F_set_store_msg_crt_idx((F), (FL)))
 #define H5F_GRP_BTREE_SHARED(F) (H5F_grp_btree_shared(F))
 #define H5F_SET_GRP_BTREE_SHARED(F, RC) (H5F_set_grp_btree_shared((F), (RC)))
 #define H5F_USE_TMP_SPACE(F)    (H5F_use_tmp_space(F))
 #define H5F_IS_TMP_ADDR(F, ADDR) (H5F_is_tmp_addr((F), (ADDR)))
-#endif /* H5F_PACKAGE */
+#endif /* H5F_MODULE */
 
 
 /* Macros to encode/decode offset/length's for storing in the file */
@@ -337,13 +398,13 @@
  */
 #if (H5_SIZEOF_SIZE_T >= H5_SIZEOF_OFF_T)
 #   define H5F_OVERFLOW_SIZET2OFFT(X)					      \
-    ((size_t)(X)>=(size_t)((size_t)1<<(8*sizeof(off_t)-1)))
+    ((size_t)(X)>=(size_t)((size_t)1<<(8*sizeof(HDoff_t)-1)))
 #else
 #   define H5F_OVERFLOW_SIZET2OFFT(X) 0
 #endif
 #if (H5_SIZEOF_HSIZE_T >= H5_SIZEOF_OFF_T)
 #   define H5F_OVERFLOW_HSIZET2OFFT(X)					      \
-    ((hsize_t)(X)>=(hsize_t)((hsize_t)1<<(8*sizeof(off_t)-1)))
+    ((hsize_t)(X)>=(hsize_t)((hsize_t)1<<(8*sizeof(HDoff_t)-1)))
 #else
 #   define H5F_OVERFLOW_HSIZET2OFFT(X) 0
 #endif
@@ -369,6 +430,8 @@
 #define H5F_CRT_SHMSG_INDEX_MINSIZE_NAME "shmsg_message_minsize" /* Minimum size of messages in each index */
 #define H5F_CRT_SHMSG_LIST_MAX_NAME  "shmsg_list_max"   /* Shared message list maximum size */
 #define H5F_CRT_SHMSG_BTREE_MIN_NAME "shmsg_btree_min"  /* Shared message B-tree minimum size */
+#define H5F_CRT_FILE_SPACE_STRATEGY_NAME "file_space_strategy"  /* File space handling strategy */
+#define H5F_CRT_FREE_SPACE_THRESHOLD_NAME "free_space_threshold"  /* Free space section threshold */
 
 
 
@@ -383,8 +446,7 @@
 #define H5F_ACS_SIEVE_BUF_SIZE_NAME             "sieve_buf_size" /* Maximum sieve buffer size (when data sieving is allowed by file driver) */
 #define H5F_ACS_SDATA_BLOCK_SIZE_NAME           "sdata_block_size" /* Minimum "small data" allocation block size (when aggregating "small" raw data allocations) */
 #define H5F_ACS_GARBG_COLCT_REF_NAME            "gc_ref"        /* Garbage-collect references */
-#define H5F_ACS_FILE_DRV_ID_NAME                "driver_id"     /* File driver ID */
-#define H5F_ACS_FILE_DRV_INFO_NAME              "driver_info"   /* File driver info */
+#define H5F_ACS_FILE_DRV_NAME                   "driver-id/info" /* File driver ID & info */
 #define H5F_ACS_CLOSE_DEGREE_NAME		"close_degree"  /* File close degree */
 #define H5F_ACS_FAMILY_OFFSET_NAME              "family_offset" /* Offset position in file for family file driver */
 #define H5F_ACS_FAMILY_NEWSIZE_NAME             "family_newsize" /* New member size of family driver.  (private property only used by h5repart) */
@@ -392,8 +454,15 @@
 #define H5F_ACS_MULTI_TYPE_NAME                 "multi_type"    /* Data type in multi file driver */
 #define H5F_ACS_LATEST_FORMAT_NAME              "latest_format" /* 'Use latest format version' flag */
 #define H5F_ACS_WANT_POSIX_FD_NAME              "want_posix_fd" /* Internal: query the file descriptor from the core VFD, instead of the memory address */
+#define H5F_ACS_METADATA_READ_ATTEMPTS_NAME     "metadata_read_attempts" /* # of metadata read attempts */
+#define H5F_ACS_OBJECT_FLUSH_CB_NAME     	"object_flush_cb" 	 /* Object flush callback */
 #define H5F_ACS_EFC_SIZE_NAME                   "efc_size"      /* Size of external file cache */
 #define H5F_ACS_FILE_IMAGE_INFO_NAME            "file_image_info" /* struct containing initial file image and callback info */
+#define H5F_ACS_CLEAR_STATUS_FLAGS_NAME         "clear_status_flags" /* Whether to clear superblock status_flags (private property only used by h5clear) */
+#define H5F_ACS_USE_MDC_LOGGING_NAME            "use_mdc_logging" /* Whether to use metadata cache logging */
+#define H5F_ACS_MDC_LOG_LOCATION_NAME           "mdc_log_location" /* Name of metadata cache log location */
+#define H5F_ACS_START_MDC_LOG_ON_ACCESS_NAME    "start_mdc_log_on_access" /* Whether logging starts on file create/open */
+
 #define H5F_ACS_CORE_WRITE_TRACKING_FLAG_NAME       "core_write_tracking_flag" /* Whether or not core VFD backing store write tracking is enabled */
 #define H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_NAME  "core_write_tracking_page_size" /* The page size in kiB when core VFD write tracking is enabled */
 
@@ -414,7 +483,8 @@
 #define HDF5_SUPERBLOCK_VERSION_DEF	0	/* The default super block format	  */
 #define HDF5_SUPERBLOCK_VERSION_1	1	/* Version with non-default B-tree 'K' value */
 #define HDF5_SUPERBLOCK_VERSION_2	2	/* Revised version with superblock extension and checksum */
-#define HDF5_SUPERBLOCK_VERSION_LATEST	HDF5_SUPERBLOCK_VERSION_2	/* The maximum super block format    */
+#define HDF5_SUPERBLOCK_VERSION_3	3	/* With file locking and consistency flags (at least this version for SWMR support) */
+#define HDF5_SUPERBLOCK_VERSION_LATEST	HDF5_SUPERBLOCK_VERSION_3	/* The maximum super block format    */
 #define HDF5_FREESPACE_VERSION	        0	/* of the Free-Space Info	  */
 #define HDF5_OBJECTDIR_VERSION	        0	/* of the Object Directory format */
 #define HDF5_SHAREDHEADER_VERSION       0	/* of the Shared-Header Info	  */
@@ -431,12 +501,25 @@
 #define HDF5_BTREE_IK_MAX_ENTRIES       65536 	/* 2^16 - 2 bytes for storing entries (children) */
 						/* See format specification on version 1 B-trees */
 
+/* Default file space handling strategy */
+#define H5F_FILE_SPACE_STRATEGY_DEF	        H5F_FILE_SPACE_ALL
+/* Default free space section threshold used by free-space managers */
+#define H5F_FREE_SPACE_THRESHOLD_DEF	        1
+
+/* Metadata read attempt values */
+#define H5F_METADATA_READ_ATTEMPTS		1	/* Default # of read attempts for non-SWMR access */
+#define H5F_SWMR_METADATA_READ_ATTEMPTS		100	/* Default # of read attempts for SWMR access */
+
 /* Macros to define signatures of all objects in the file */
 
 /* Size of signature information (on disk) */
 /* (all on-disk signatures should be this length) */
 #define H5_SIZEOF_MAGIC               4
 
+/* Size of checksum information (on disk) */
+/* (all on-disk checksums should be this length) */
+#define H5_SIZEOF_CHKSUM              	4
+
 /* v1 B-tree node signature */
 #define H5B_MAGIC	                "TREE"
 
@@ -448,8 +531,13 @@
 /* Extensible array signatures */
 #define H5EA_HDR_MAGIC                  "EAHD"          /* Header */
 #define H5EA_IBLOCK_MAGIC               "EAIB"          /* Index block */
+#define H5EA_SBLOCK_MAGIC               "EASB"          /* Super block */
 #define H5EA_DBLOCK_MAGIC               "EADB"          /* Data block */
 
+/* Fixed array signatures */
+#define H5FA_HDR_MAGIC                  "FAHD"          /* Header */
+#define H5FA_DBLOCK_MAGIC               "FADB"          /* Data block */
+
 /* Free space signatures */
 #define H5FS_HDR_MAGIC                  "FSHD"          /* Header */
 #define H5FS_SINFO_MAGIC                "FSSE"          /* Serialized sections */
@@ -477,13 +565,29 @@
 #define H5SM_LIST_MAGIC                 "SMLI"          /* Shared Message List */
 
 
+/* Latest format will activate the following latest version support */
+/* "latest_flags" in H5F_file_t */
+#define H5F_LATEST_DATATYPE             0x0001
+#define H5F_LATEST_DATASPACE            0x0002
+#define H5F_LATEST_ATTRIBUTE            0x0004
+#define H5F_LATEST_FILL_MSG             0x0008
+#define H5F_LATEST_PLINE_MSG            0x0010
+#define H5F_LATEST_LAYOUT_MSG           0x0020
+#define H5F_LATEST_NO_MOD_TIME_MSG	0x0040
+#define H5F_LATEST_STYLE_GROUP          0x0080
+#define H5F_LATEST_OBJ_HEADER		0x0100
+#define H5F_LATEST_SUPERBLOCK           0x0200
+#define H5F_LATEST_ALL_FLAGS            (H5F_LATEST_DATATYPE | H5F_LATEST_DATASPACE | H5F_LATEST_ATTRIBUTE | H5F_LATEST_FILL_MSG | H5F_LATEST_PLINE_MSG | H5F_LATEST_LAYOUT_MSG | H5F_LATEST_NO_MOD_TIME_MSG | H5F_LATEST_STYLE_GROUP | H5F_LATEST_OBJ_HEADER | H5F_LATEST_SUPERBLOCK)
+
+#define H5F_LATEST_DSET_MSG_FLAGS    (H5F_LATEST_FILL_MSG | H5F_LATEST_PLINE_MSG | H5F_LATEST_LAYOUT_MSG)
+
 /****************************/
 /* Library Private Typedefs */
 /****************************/
 
 /* Forward declarations (for prototypes & type definitions) */
 struct H5B_class_t;
-struct H5RC_t;
+struct H5UC_t;
 struct H5O_loc_t;
 struct H5HG_heap_t;
 struct H5P_genplist_t;
@@ -497,12 +601,25 @@ typedef struct H5F_file_t H5F_file_t;
 /* Block aggregation structure */
 typedef struct H5F_blk_aggr_t H5F_blk_aggr_t;
 
+/* Structure for object flush callback property (H5Pset_object_flush_cb)*/
+typedef struct H5F_object_flush_t {
+    H5F_flush_cb_t func;        /* The callback function */
+    void *udata;                /* User data */
+} H5F_object_flush_t;
+
+
 /* I/O Info for an operation */
 typedef struct H5F_io_info_t {
     const H5F_t *f;                     /* File object */
     const struct H5P_genplist_t *dxpl;         /* DXPL object */
 } H5F_io_info_t;
 
+/* Concise info about a block of bytes in a file */
+typedef struct H5F_block_t {
+    haddr_t offset;             /* Offset of the block in the file */
+    hsize_t length;             /* Length of the block in the file */
+} H5F_block_t;
+
 
 /*****************************/
 /* Library-private Variables */
@@ -533,10 +650,12 @@ H5_DLL hid_t H5F_get_file_id(const H5F_t *f);
 H5_DLL ssize_t H5F_get_file_image(H5F_t *f, void *buf_ptr, size_t buf_len);
 H5_DLL H5F_t *H5F_get_parent(const H5F_t *f);
 H5_DLL unsigned H5F_get_nmounts(const H5F_t *f);
+H5_DLL unsigned H5F_get_read_attempts(const H5F_t *f);
 H5_DLL hid_t H5F_get_access_plist(H5F_t *f, hbool_t app_ref);
 H5_DLL hid_t H5F_get_id(H5F_t *file, hbool_t app_ref);
 H5_DLL herr_t H5F_get_obj_count(const H5F_t *f, unsigned types, hbool_t app_ref, size_t *obj_id_count_ptr);
 H5_DLL herr_t H5F_get_obj_ids(const H5F_t *f, unsigned types, size_t max_objs, hid_t *oid_list, hbool_t app_ref, size_t *obj_id_count_ptr);
+H5_DLL haddr_t H5F_get_next_proxy_addr(const H5F_t *f);
 
 /* Functions than retrieve values set/cached from the superblock/FCPL */
 H5_DLL haddr_t H5F_get_base_addr(const H5F_t *f);
@@ -559,10 +678,11 @@ H5_DLL double H5F_rdcc_w0(const H5F_t *f);
 H5_DLL size_t H5F_sieve_buf_size(const H5F_t *f);
 H5_DLL unsigned H5F_gc_ref(const H5F_t *f);
 H5_DLL hbool_t H5F_use_latest_format(const H5F_t *f);
+H5_DLL unsigned H5F_use_latest_flags(const H5F_t *f, unsigned fl);
 H5_DLL hbool_t H5F_store_msg_crt_idx(const H5F_t *f);
 H5_DLL herr_t H5F_set_store_msg_crt_idx(H5F_t *f, hbool_t flag);
-H5_DLL struct H5RC_t *H5F_grp_btree_shared(const H5F_t *f);
-H5_DLL herr_t H5F_set_grp_btree_shared(H5F_t *f, struct H5RC_t *rc);
+H5_DLL struct H5UC_t *H5F_grp_btree_shared(const H5F_t *f);
+H5_DLL herr_t H5F_set_grp_btree_shared(H5F_t *f, struct H5UC_t *rc);
 H5_DLL hbool_t H5F_use_tmp_space(const H5F_t *f);
 H5_DLL hbool_t H5F_is_tmp_addr(const H5F_t *f, haddr_t addr);
 
@@ -571,8 +691,7 @@ H5_DLL hid_t H5F_get_driver_id(const H5F_t *f);
 H5_DLL herr_t H5F_get_fileno(const H5F_t *f, unsigned long *filenum);
 H5_DLL hbool_t H5F_has_feature(const H5F_t *f, unsigned feature);
 H5_DLL haddr_t H5F_get_eoa(const H5F_t *f, H5FD_mem_t type);
-H5_DLL herr_t H5F_get_vfd_handle(const H5F_t *file, hid_t fapl,
-    void **file_handle);
+H5_DLL herr_t H5F_get_vfd_handle(const H5F_t *file, hid_t fapl, void **file_handle);
 
 /* Functions that check file mounting information */
 H5_DLL hbool_t H5F_is_mount(const H5F_t *file);
@@ -586,15 +705,32 @@ H5_DLL herr_t H5F_block_read(const H5F_t *f, H5FD_mem_t type, haddr_t addr,
 H5_DLL herr_t H5F_block_write(const H5F_t *f, H5FD_mem_t type, haddr_t addr,
                 size_t size, hid_t dxpl_id, const void *buf);
 
+/* Functions that flush or evict */
+H5_DLL herr_t H5F_flush_tagged_metadata(H5F_t * f, haddr_t tag, hid_t dxpl_id);
+H5_DLL herr_t H5F_evict_tagged_metadata(H5F_t * f, haddr_t tag, hid_t dxpl_id);
+H5_DLL herr_t H5F_evict_cache_entries(H5F_t *f, hid_t dxpl_id);
+
+
+/* Functions that read & verify a piece of metadata with checksum */
+H5_DLL herr_t H5F_read_check_metadata(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type,
+    unsigned actype, haddr_t addr, size_t read_size, size_t chk_size,
+    uint8_t *buf/*out*/);
+H5_DLL herr_t H5F_get_checksums(const uint8_t *buf, size_t chk_size, uint32_t *s_chksum, uint32_t *c_chksum);
+
+/* Routine to track the # of retries */
+H5_DLL herr_t H5F_track_metadata_read_retries(H5F_t *f, unsigned actype, unsigned retries);
+H5_DLL herr_t H5F_set_retries(H5F_t *f);
+
+/* Routine to invoke callback function upon object flush */
+H5_DLL herr_t H5F_object_flush_cb(H5F_t *f, hid_t obj_id);
+
+
 /* Address-related functions */
 H5_DLL void H5F_addr_encode(const H5F_t *f, uint8_t **pp, haddr_t addr);
 H5_DLL void H5F_addr_encode_len(size_t addr_len, uint8_t **pp, haddr_t addr);
 H5_DLL void H5F_addr_decode(const H5F_t *f, const uint8_t **pp, haddr_t *addr_p);
 H5_DLL void H5F_addr_decode_len(size_t addr_len, const uint8_t **pp, haddr_t *addr_p);
 
-/* File access property list callbacks */
-H5_DLL herr_t H5P_facc_close(hid_t dxpl_id, void *close_data);
-
 /* Shared file list related routines */
 H5_DLL void H5F_sfile_assert_num(unsigned n);
 
diff --git a/src/H5Fpublic.h b/src/H5Fpublic.h
index 5f74523..fa45d10 100644
--- a/src/H5Fpublic.h
+++ b/src/H5Fpublic.h
@@ -41,15 +41,32 @@
  * We're assuming that these constants are used rather early in the hdf5
  * session.
  *
- * H5F_ACC_DEBUG no longer has any prints any special debug info. The symbol is
- * being retained and will be listed as deprecated in HDF5 1.10.0.
+ * Note that H5F_ACC_DEBUG is deprecated (nonfuncational) but retained as a
+ * symbol for backward compatibility.
  */
-#define H5F_ACC_RDONLY	(H5CHECK 0x0000u)	/*absence of rdwr => rd-only        */
-#define H5F_ACC_RDWR	(H5CHECK 0x0001u)	/*open for read and write           */
-#define H5F_ACC_TRUNC	(H5CHECK 0x0002u)	/*overwrite existing files          */
-#define H5F_ACC_EXCL	(H5CHECK 0x0004u)	/*fail if file already exists       */
-#define H5F_ACC_DEBUG	(H5CHECK 0x0000u)	/*print debug info (no longer used) */
-#define H5F_ACC_CREAT	(H5CHECK 0x0010u)	/*create non-existing files         */
+#define H5F_ACC_RDONLY	(H5CHECK 0x0000u)	/*absence of rdwr => rd-only */
+#define H5F_ACC_RDWR	(H5CHECK 0x0001u)	/*open for read and write    */
+#define H5F_ACC_TRUNC	(H5CHECK 0x0002u)	/*overwrite existing files   */
+#define H5F_ACC_EXCL	(H5CHECK 0x0004u)	/*fail if file already exists*/
+/* NOTE: 0x0008u was H5F_ACC_DEBUG, now deprecated */
+#define H5F_ACC_CREAT	(H5CHECK 0x0010u)	/*create non-existing files  */
+#define H5F_ACC_SWMR_WRITE	(H5CHECK 0x0020u) /*indicate that this file is
+                                                 * open for writing in a
+                                                 * single-writer/multi-reader (SWMR)
+                                                 * scenario.  Note that the
+                                                 * process(es) opening the file
+                                                 * for reading must open the file
+                                                 * with RDONLY access, and use
+                                                 * the special "SWMR_READ" access
+                                                 * flag. */
+#define H5F_ACC_SWMR_READ	(H5CHECK 0x0040u) /*indicate that this file is
+                                                 * open for reading in a
+                                                 * single-writer/multi-reader (SWMR)
+                                                 * scenario.  Note that the
+                                                 * process(es) opening the file
+                                                 * for SWMR reading must also
+                                                 * open the file with the RDONLY
+                                                 * flag.  */
 
 /* Value passed to H5Pset_elink_acc_flags to cause flags to be taken from the
  * parent file. */
@@ -102,14 +119,23 @@ typedef enum H5F_close_degree_t {
 } H5F_close_degree_t;
 
 /* Current "global" information about file */
-/* (just size info currently) */
-typedef struct H5F_info_t {
-    hsize_t		super_ext_size;	/* Superblock extension size */
+typedef struct H5F_info2_t {
+    struct {
+	unsigned	version;	/* Superblock version # */
+	hsize_t		super_size;	/* Superblock size */
+	hsize_t		super_ext_size;	/* Superblock extension size */
+    } super;
+    struct {
+	unsigned	version;	/* Version # of file free space management */
+	hsize_t		meta_size;	/* Free space manager metadata size */
+	hsize_t		tot_space;	/* Amount of free space in the file */
+    } free;
     struct {
+	unsigned	version;	/* Version # of shared object header info */
 	hsize_t		hdr_size;       /* Shared object header message header size */
 	H5_ih_info_t	msgs_info;      /* Shared object header message index & heap size */
     } sohm;
-} H5F_info_t;
+} H5F_info2_t;
 
 /*
  * Types of allocation requests. The values larger than H5FD_MEM_DEFAULT
@@ -138,15 +164,40 @@ typedef enum H5F_mem_t {
     H5FD_MEM_NTYPES             /* Sentinel value - must be last */
 } H5F_mem_t;
 
+/* Free space section information */
+typedef struct H5F_sect_info_t {
+    haddr_t             addr;   /* Address of free space section */
+    hsize_t             size;   /* Size of free space section */
+} H5F_sect_info_t;
+
 /* Library's file format versions */
 typedef enum H5F_libver_t {
     H5F_LIBVER_EARLIEST,        /* Use the earliest possible format for storing objects */
     H5F_LIBVER_LATEST           /* Use the latest possible format available for storing objects*/
 } H5F_libver_t;
 
-/* Define file format version for 1.8 to prepare for 1.10 release.  
- * (Not used anywhere now)*/
-#define H5F_LIBVER_18 H5F_LIBVER_LATEST
+/* File space handling strategy */
+typedef enum H5F_file_space_type_t {
+    H5F_FILE_SPACE_DEFAULT = 0,     /* Default (or current) free space strategy setting */
+    H5F_FILE_SPACE_ALL_PERSIST = 1, /* Persistent free space managers, aggregators, virtual file driver */
+    H5F_FILE_SPACE_ALL = 2,	    /* Non-persistent free space managers, aggregators, virtual file driver */
+				    /* This is the library default */
+    H5F_FILE_SPACE_AGGR_VFD = 3,    /* Aggregators, Virtual file driver */
+    H5F_FILE_SPACE_VFD = 4,	    /* Virtual file driver */
+    H5F_FILE_SPACE_NTYPES	    /* must be last */
+} H5F_file_space_type_t;
+
+/* Data structure to report the collection of read retries for metadata items with checksum */
+/* Used by public routine H5Fget_metadata_read_retry_info() */
+#define H5F_NUM_METADATA_READ_RETRY_TYPES	21
+typedef struct H5F_retry_info_t {
+    unsigned nbins;
+    uint32_t *retries[H5F_NUM_METADATA_READ_RETRY_TYPES];
+} H5F_retry_info_t;
+
+/* Callback for H5Pset_object_flush_cb() in a file access property list */
+typedef herr_t (*H5F_flush_cb_t)(hid_t object_id, void *udata);
+
 
 #ifdef __cplusplus
 extern "C" {
@@ -184,13 +235,48 @@ H5_DLL herr_t H5Fget_mdc_size(hid_t file_id,
                               int * cur_num_entries_ptr);
 H5_DLL herr_t H5Freset_mdc_hit_rate_stats(hid_t file_id);
 H5_DLL ssize_t H5Fget_name(hid_t obj_id, char *name, size_t size);
-H5_DLL herr_t H5Fget_info(hid_t obj_id, H5F_info_t *bh_info);
+H5_DLL herr_t H5Fget_info2(hid_t obj_id, H5F_info2_t *finfo);
+H5_DLL herr_t H5Fget_metadata_read_retry_info(hid_t file_id, H5F_retry_info_t *info);
+H5_DLL herr_t H5Fstart_swmr_write(hid_t file_id);
+H5_DLL ssize_t H5Fget_free_sections(hid_t file_id, H5F_mem_t type,
+    size_t nsects, H5F_sect_info_t *sect_info/*out*/);
 H5_DLL herr_t H5Fclear_elink_file_cache(hid_t file_id);
+H5_DLL herr_t H5Fstart_mdc_logging(hid_t file_id);
+H5_DLL herr_t H5Fstop_mdc_logging(hid_t file_id);
+H5_DLL herr_t H5Fget_mdc_logging_status(hid_t file_id,
+                                        /*OUT*/ hbool_t *is_enabled,
+                                        /*OUT*/ hbool_t *is_currently_logging);
 #ifdef H5_HAVE_PARALLEL
 H5_DLL herr_t H5Fset_mpi_atomicity(hid_t file_id, hbool_t flag);
 H5_DLL herr_t H5Fget_mpi_atomicity(hid_t file_id, hbool_t *flag);
 #endif /* H5_HAVE_PARALLEL */
 
+/* Symbols defined for compatibility with previous versions of the HDF5 API.
+ *
+ * Use of these symbols is deprecated.
+ */
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+
+/* Macros */
+#define H5F_ACC_DEBUG	(H5CHECK 0x0000u)	/*print debug info (deprecated)*/
+
+/* Typedefs */
+
+/* Current "global" information about file */
+typedef struct H5F_info1_t {
+    hsize_t		super_ext_size;	/* Superblock extension size */
+    struct {
+	hsize_t		hdr_size;       /* Shared object header message header size */
+	H5_ih_info_t	msgs_info;      /* Shared object header message index & heap size */
+    } sohm;
+} H5F_info1_t;
+
+
+/* Function prototypes */
+H5_DLL herr_t H5Fget_info1(hid_t obj_id, H5F_info1_t *finfo);
+
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/H5Fquery.c b/src/H5Fquery.c
index 6a8c21b..0baec78 100644
--- a/src/H5Fquery.c
+++ b/src/H5Fquery.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+#include "H5Fmodule.h"          /* This source code file is part of the H5F module */
 
 
 /***********/
@@ -322,6 +322,29 @@ H5F_get_nmounts(const H5F_t *f)
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5F_get_read_attempts
+ *
+ * Purpose:	Retrieve the file's 'read_attempts' value
+ *
+ * Return:	'# of read attempts' on success/abort on failure (shouldn't fail)
+ *
+ * Programmer:	Vaili Choi; Sept 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5F_get_read_attempts(const H5F_t *f)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+
+    FUNC_LEAVE_NOAPI(f->shared->read_attempts)
+} /* end H5F_get_read_attempts() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5F_get_fcpl
  *
  * Purpose:	Retrieve the value of a file's FCPL.
@@ -703,7 +726,7 @@ H5F_get_base_addr(const H5F_t *f)
  *
  *-------------------------------------------------------------------------
  */
-H5RC_t *
+H5UC_t *
 H5F_grp_btree_shared(const H5F_t *f)
 {
     /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
@@ -808,6 +831,34 @@ H5F_use_latest_format(const H5F_t *f)
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5F_use_latest_flags
+ *
+ * Purpose:	Retrieve the 'latest version support' for the file.
+ *
+ * Return:	Success:	Non-negative, the requested 'version support'
+ *
+ * 		Failure:	(can't happen)
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Mar  5 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned
+H5F_use_latest_flags(const H5F_t *f, unsigned fl)
+{
+    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(f);
+    HDassert(f->shared);
+
+    FUNC_LEAVE_NOAPI(f->shared->latest_flags & (fl))
+} /* end H5F_use_latest_flags() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5F_get_fc_degree
  *
  * Purpose:	Retrieve the 'file close degree' for the file.
@@ -968,7 +1019,7 @@ done:
 haddr_t
 H5F_get_eoa(const H5F_t *f, H5FD_mem_t type)
 {
-    haddr_t	ret_value;
+    haddr_t	ret_value = HADDR_UNDEF;        /* Return value */
 
     FUNC_ENTER_NOAPI(HADDR_UNDEF)
 
diff --git a/src/H5Fsfile.c b/src/H5Fsfile.c
index a1c6976..4fb9cd9 100644
--- a/src/H5Fsfile.c
+++ b/src/H5Fsfile.c
@@ -13,7 +13,7 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+#include "H5Fmodule.h"          /* This source code file is part of the H5F module */
 
 /* Packages needed by this file... */
 #include "H5private.h"		/* Generic Functions			*/
diff --git a/src/H5Fsuper.c b/src/H5Fsuper.c
index 3f2b33f..da3bf3d 100644
--- a/src/H5Fsuper.c
+++ b/src/H5Fsuper.c
@@ -17,10 +17,7 @@
 /* Module Setup */
 /****************/
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5F_init_super_interface
+#include "H5Fmodule.h"          /* This source code file is part of the H5F module */
 
 
 /***********/
@@ -77,28 +74,6 @@ H5FL_DEFINE(H5F_super_t);
 
 
 

-/*--------------------------------------------------------------------------
-NAME
-   H5F_init_super_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5F_init_super_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5F_init() currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5F_init_super_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5F_init())
-} /* H5F_init_super_interface() */
-
-

 /*-------------------------------------------------------------------------
  * Function:    H5F_super_ext_create
  *
@@ -140,7 +115,7 @@ H5F_super_ext_create(H5F_t *f, hid_t dxpl_id, H5O_loc_t *ext_ptr)
          * extension.
          */
         H5O_loc_reset(ext_ptr);
-        if(H5O_create(f, dxpl_id, 0, (size_t)1, H5P_GROUP_CREATE_DEFAULT, ext_ptr) < 0)
+        if(H5O_create(f, dxpl_id, (size_t)0, (size_t)1, H5P_GROUP_CREATE_DEFAULT, ext_ptr) < 0)
             HGOTO_ERROR(H5E_OHDR, H5E_CANTCREATE, FAIL, "unable to create superblock extension")
 
         /* Record the address of the superblock extension */
@@ -206,6 +181,8 @@ herr_t
 H5F_super_ext_close(H5F_t *f, H5O_loc_t *ext_ptr, hid_t dxpl_id,
     hbool_t was_created)
 {
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
@@ -216,13 +193,17 @@ H5F_super_ext_close(H5F_t *f, H5O_loc_t *ext_ptr, hid_t dxpl_id,
 
     /* Check if extension was created */
     if(was_created) {
+        /* Set the ring type in the DXPL */
+        if(H5AC_set_ring(dxpl_id, H5AC_RING_SBE, &dxpl, &orig_ring) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set ring value")
+
         /* Increment link count on superblock extension's object header */
         if(H5O_link(ext_ptr, 1, dxpl_id) < 0)
             HGOTO_ERROR(H5E_FILE, H5E_LINKCOUNT, FAIL, "unable to increment hard link count")
 
         /* Decrement refcount on superblock extension's object header in memory */
         if(H5O_dec_rc_by_loc(ext_ptr, dxpl_id) < 0)
-           HDONE_ERROR(H5E_FILE, H5E_CANTDEC, FAIL, "unable to decrement refcount on superblock extension")
+            HGOTO_ERROR(H5E_FILE, H5E_CANTDEC, FAIL, "unable to decrement refcount on superblock extension");
     } /* end if */
 
     /* Twiddle the number of open objects to avoid closing the file. */
@@ -232,12 +213,16 @@ H5F_super_ext_close(H5F_t *f, H5O_loc_t *ext_ptr, hid_t dxpl_id,
     f->nopen_objs--;
 
 done:
+    /* Reset the ring in the DXPL */
+    if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+        HDONE_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set property value")
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5F_super_ext_close() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5F_super_read
+ * Function:    H5F__super_read
  *
  * Purpose:     Reads the superblock from the file or from the BUF. If
  *              ADDR is a valid address, then it reads it from the file.
@@ -254,21 +239,32 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5F_super_read(H5F_t *f, hid_t dxpl_id)
+H5F__super_read(H5F_t *f, hid_t dxpl_id, hbool_t initial_read)
 {
-    H5P_genplist_t     *dxpl;               /* DXPL object */
-    H5F_super_t *       sblock = NULL;      /* superblock structure                         */
+    H5P_genplist_t     *dxpl = NULL;        /* DXPL object */
+    H5AC_ring_t         ring, orig_ring = H5AC_RING_INV;
+    H5F_super_t *       sblock = NULL;      /* Superblock structure */
+    H5F_superblock_cache_ud_t udata;        /* User data for cache callbacks */
+    H5P_genplist_t     *c_plist;            /* File creation property list  */
     unsigned            sblock_flags = H5AC__NO_FLAGS_SET;       /* flags used in superblock unprotect call      */
     haddr_t             super_addr;         /* Absolute address of superblock */
-    H5AC_protect_t      rw;                 /* read/write permissions for file              */
-    hbool_t             dirtied = FALSE;    /* Bool for sblock protect call                 */
-    herr_t              ret_value = SUCCEED; /* return value                                */
+    haddr_t             eof;                /* End of file address */
+    unsigned      	rw_flags;           /* Read/write permissions for file */
+    hbool_t 		skip_eof_check = FALSE; /* Whether to skip checking the EOF value */
+    herr_t              ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, H5AC__SUPERBLOCK_TAG, FAIL)
+
+    /* initialize the drvinfo to NULL -- we will overwrite this if there
+     * is a driver information block 
+     */
+    f->shared->drvinfo = NULL;
 
     /* Get the DXPL plist object for DXPL ID */
     if(NULL == (dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+    if((H5P_get(dxpl, H5AC_RING_NAME, &orig_ring)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get property value");
 
     /* Find the superblock */
     if(H5FD_locate_signature(f->shared->lf, dxpl, &super_addr) < 0)
@@ -279,42 +275,452 @@ H5F_super_read(H5F_t *f, hid_t dxpl_id)
     /* Check for userblock present */
     if(H5F_addr_gt(super_addr, 0)) {
         /* Set the base address for the file in the VFD now */
-        if(H5FD_set_base_addr(f->shared->lf, super_addr) < 0)
+        if(H5F__set_base_addr(f, super_addr) < 0)
             HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "failed to set base address for file driver")
     } /* end if */
 
     /* Determine file intent for superblock protect */
-    if(H5F_INTENT(f) & H5F_ACC_RDWR)
-        rw = H5AC_WRITE;
-    else
-        rw = H5AC_READ;
+
+    /* Must tell cache at protect time that the super block is to be
+     * flushed last (and collectively in the parallel case).
+     */
+    rw_flags = H5AC__FLUSH_LAST_FLAG;
+#ifdef H5_HAVE_PARALLEL
+    rw_flags |= H5C__FLUSH_COLLECTIVELY_FLAG;
+#endif /* H5_HAVE_PARALLEL */
+    if(!(H5F_INTENT(f) & H5F_ACC_RDWR))
+        rw_flags |= H5AC__READ_ONLY_FLAG;
+
+    /* Get the shared file creation property list */
+    if(NULL == (c_plist = (H5P_genplist_t *)H5I_object(f->shared->fcpl_id)))
+        HGOTO_ERROR(H5E_FILE, H5E_BADTYPE, FAIL, "can't get property list")
+
+    /* Make certain we can read the fixed-size portion of the superblock */
+    if(H5F__set_eoa(f, H5FD_MEM_SUPER, 
+              (haddr_t)(H5F_SUPERBLOCK_FIXED_SIZE + H5F_SUPERBLOCK_MINIMAL_VARLEN_SIZE)) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "set end of space allocation request failed")
+
+    /* Set up the user data for cache callbacks */
+    udata.f = f;
+    udata.ignore_drvrinfo = H5F_HAS_FEATURE(f, H5FD_FEAT_IGNORE_DRVRINFO);
+    udata.sym_leaf_k = 0;
+    if(H5P_get(c_plist, H5F_CRT_BTREE_RANK_NAME, udata.btree_k) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get rank for btree internal nodes")
+    udata.stored_eof = HADDR_UNDEF;
+    udata.drvrinfo_removed = FALSE;
+
+    /* Set the ring type in the DXPL */
+    ring = H5AC_RING_SB;
+    if((H5P_set(dxpl, H5AC_RING_NAME, &ring)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set property value");
 
     /* Look up the superblock */
-    if(NULL == (sblock = (H5F_super_t *)H5AC_protect(f, dxpl_id, H5AC_SUPERBLOCK, (haddr_t)0, &dirtied, rw)))
-        HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "unable to load superblock")
+    if(NULL == (sblock = (H5F_super_t *)H5AC_protect(f, dxpl_id, H5AC_SUPERBLOCK, (haddr_t)0, &udata, rw_flags)))
+        HGOTO_ERROR(H5E_FILE, H5E_CANTPROTECT, FAIL, "unable to load superblock")
 
-    /* Mark the superblock dirty if it was modified during loading or VFD indicated to do so */
-    if((H5AC_WRITE == rw) && (dirtied || H5F_HAS_FEATURE(f, H5FD_FEAT_DIRTY_SBLK_LOAD)))
-        sblock_flags |= H5AC__DIRTIED_FLAG;
+    if(H5F_INTENT(f) & H5F_ACC_SWMR_WRITE)
+       	if(sblock->super_vers < HDF5_SUPERBLOCK_VERSION_3)
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTPROTECT, FAIL, "invalid superblock version for SWMR_WRITE")
+
+    /* Enable all latest version support when file has v3 superblock */
+    if(sblock->super_vers >= HDF5_SUPERBLOCK_VERSION_3)
+	f->shared->latest_flags |= H5F_LATEST_ALL_FLAGS;
 
     /* Pin the superblock in the cache */
     if(H5AC_pin_protected_entry(sblock) < 0)
-        HGOTO_ERROR(H5E_FSPACE, H5E_CANTPIN, FAIL, "unable to pin superblock")
+        HGOTO_ERROR(H5E_FILE, H5E_CANTPIN, FAIL, "unable to pin superblock")
+
+    /* Mark the superblock dirty if it was modified during loading */
+    if(((rw_flags & H5AC__READ_ONLY_FLAG) == 0) && udata.ignore_drvrinfo && udata.drvrinfo_removed) {
+        HDassert(sblock->super_vers < HDF5_SUPERBLOCK_VERSION_2);
+        sblock_flags |= H5AC__DIRTIED_FLAG;
+    } /* end if */
+
+    /* The superblock must be flushed last (and collectively in parallel) */
+    sblock_flags |= H5AC__FLUSH_LAST_FLAG;
+#ifdef H5_HAVE_PARALLEL
+    sblock_flags |= H5AC__FLUSH_COLLECTIVELY_FLAG;
+#endif /* H5_HAVE_PARALLEL */
+
+    /* Check if superblock address is different from base address and adjust
+     * base address and "end of address" address if so.
+     */
+    if(!H5F_addr_eq(super_addr, sblock->base_addr)) {
+        /* Check if the superblock moved earlier in the file */
+        if(H5F_addr_lt(super_addr, sblock->base_addr))
+            udata.stored_eof -= (sblock->base_addr - super_addr);
+        else
+            /* The superblock moved later in the file */
+            udata.stored_eof += (super_addr - sblock->base_addr);
+
+        /* Adjust base address for offsets of the HDF5 data in the file */
+        sblock->base_addr = super_addr;
+
+        /* Set the base address for the file in the VFD now */
+        if(H5F__set_base_addr(f, sblock->base_addr) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "failed to set base address for file driver")
+
+        /* Indicate that the superblock should be marked dirty */
+        if((rw_flags & H5AC__READ_ONLY_FLAG) == 0)
+            sblock_flags |= H5AC__DIRTIED_FLAG;
+    } /* end if */
+
+    /* Set information in the file's creation property list */
+    if(H5P_set(c_plist, H5F_CRT_SUPER_VERS_NAME, &sblock->super_vers) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set superblock version")
+    if(H5P_set(c_plist, H5F_CRT_ADDR_BYTE_NUM_NAME, &sblock->sizeof_addr) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set byte number in an address")
+    if(H5P_set(c_plist, H5F_CRT_OBJ_BYTE_NUM_NAME, &sblock->sizeof_size) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set byte number for object size")
+
+    /* Handle the B-tree 'K' values */
+    if(sblock->super_vers < HDF5_SUPERBLOCK_VERSION_2) {
+        /* Sanity check */
+        HDassert(udata.sym_leaf_k != 0);
+
+        /* Set the symbol table internal node 'K' value */
+        if(H5P_set(c_plist, H5F_CRT_SYM_LEAF_NAME, &udata.sym_leaf_k) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set rank for symbol table leaf nodes")
+        sblock->sym_leaf_k = udata.sym_leaf_k;
+
+        /* Set the B-tree internal node values, etc */
+        if(H5P_set(c_plist, H5F_CRT_BTREE_RANK_NAME, udata.btree_k) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set rank for btree internal nodes")
+        HDmemcpy(sblock->btree_k, udata.btree_k, sizeof(unsigned) * (size_t)H5B_NUM_BTREE_ID);
+    } /* end if */
+    else {
+        /* Get the (default) B-tree internal node values, etc */
+        /* (Note: these may be reset in a superblock extension) */
+        if(H5P_get(c_plist, H5F_CRT_BTREE_RANK_NAME, sblock->btree_k) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get rank for btree internal nodes")
+        if(H5P_get(c_plist, H5F_CRT_SYM_LEAF_NAME, &sblock->sym_leaf_k) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get rank for btree internal nodes")
+    } /* end else */
+
+    /*
+     * The user-defined data is the area of the file before the base
+     * address.
+     */
+    if(H5P_set(c_plist, H5F_CRT_USER_BLOCK_NAME, &sblock->base_addr) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set userblock size")
+
+    /*
+     * Make sure that the data is not truncated. One case where this is
+     * possible is if the first file of a family of files was opened
+     * individually.
+     */
+    /* Can skip this test when it is not the initial file open--
+     * H5F_super_read() call from H5F_evict_tagged_metadata() for
+     * refreshing object.
+     * When flushing file buffers and fractal heap is involved,
+     * the library will allocate actual space for tmp addresses
+     * via the file layer.  The aggregator allocates a block,
+     * thus the eoa might be greater than eof.
+     * Note: the aggregator is changed again after being reset
+     * earlier before H5AC_flush due to allocation of tmp addresses.
+     */
+    /* The EOF check must be skipped when the file is opened for SWMR read,
+     * as the file can appear truncated if only part of it has been
+     * been flushed to disk by the SWMR writer process.
+     */
+    if(H5F_INTENT(f) & H5F_ACC_SWMR_READ) {
+	/* 
+	 * When the file is opened for SWMR read access, skip the check if:
+	 * --the file is already marked for SWMR writing and
+	 * --the file has version 3 superblock for SWMR support
+	 */
+	if((sblock->status_flags & H5F_SUPER_SWMR_WRITE_ACCESS) &&
+               (sblock->status_flags & H5F_SUPER_WRITE_ACCESS) &&
+                sblock->super_vers >= HDF5_SUPERBLOCK_VERSION_3)
+	    skip_eof_check = TRUE;
+    } /* end if */
+    if(!skip_eof_check && initial_read) {
+        if(HADDR_UNDEF == (eof = H5FD_get_eof(f->shared->lf, H5FD_MEM_DEFAULT)))
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to determine file size")
+
+        /* (Account for the stored EOA being absolute offset -QAK) */
+        if((eof + sblock->base_addr) < udata.stored_eof)
+            HGOTO_ERROR(H5E_FILE, H5E_TRUNCATED, FAIL, "truncated file: eof = %llu, sblock->base_addr = %llu, stored_eof = %llu", (unsigned long long)eof, (unsigned long long)sblock->base_addr, (unsigned long long)udata.stored_eof)
+    } /* end if */
+
+    /*
+     * Tell the file driver how much address space has already been
+     * allocated so that it knows how to allocate additional memory.
+     */
+
+    /* Set the ring type in the DXPL */
+    ring = H5AC_RING_SBE;
+    if((H5P_set(dxpl, H5AC_RING_NAME, &ring)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set property value");
+
+    /* Decode the optional driver information block */
+    if(H5F_addr_defined(sblock->driver_addr)) {
+        H5O_drvinfo_t *drvinfo;         /* Driver info */
+        H5F_drvrinfo_cache_ud_t drvrinfo_udata;  /* User data for metadata callbacks */
+        unsigned drvinfo_flags = H5AC__NO_FLAGS_SET;    /* Flags used in driver info block unprotect call */
+
+        /* Sanity check - driver info block should only be defined for
+         *      superblock version < 2.
+         */
+        HDassert(sblock->super_vers < HDF5_SUPERBLOCK_VERSION_2);
+
+        /* Set up user data */
+        drvrinfo_udata.f           = f;
+        drvrinfo_udata.driver_addr = sblock->driver_addr;
+
+        /* extend EOA so we can read at least the fixed sized 
+         * portion of the driver info block 
+         */
+        if(H5FD_set_eoa(f->shared->lf, H5FD_MEM_SUPER, sblock->driver_addr + H5F_DRVINFOBLOCK_HDR_SIZE) < 0) /* will extend eoa later if required */ 
+            HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, \
+                        "set end of space allocation request failed")
+
+        /* Look up the driver info block */
+        if(NULL == (drvinfo = (H5O_drvinfo_t *)H5AC_protect(f, dxpl_id, H5AC_DRVRINFO, sblock->driver_addr, &drvrinfo_udata, rw_flags)))
+            HGOTO_ERROR(H5E_FILE, H5E_CANTPROTECT, FAIL, "unable to load driver info block")
+
+        /* Loading the driver info block is enough to set up the right info */
+
+        /* Check if we need to rewrite the driver info block info */
+        if ( ( (rw_flags & H5AC__READ_ONLY_FLAG) == 0 ) &&
+             ( H5F_HAS_FEATURE(f, H5FD_FEAT_DIRTY_DRVRINFO_LOAD) ) ) {
+
+            drvinfo_flags |= H5AC__DIRTIED_FLAG;
+        } /* end if */
+
+        /* set the pin entry flag so that the driver information block 
+         * cache entry will be pinned in the cache.
+         */
+        drvinfo_flags |= H5AC__PIN_ENTRY_FLAG;
+
+        /* Release the driver info block */
+        if(H5AC_unprotect(f, dxpl_id, H5AC_DRVRINFO, sblock->driver_addr, drvinfo, drvinfo_flags) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTUNPROTECT, FAIL, "unable to release driver info block")
+
+        /* save a pointer to the driver information cache entry */
+        f->shared->drvinfo = drvinfo;
+    } /* end if */
+
+    /* (Account for the stored EOA being absolute offset -NAF) */
+    if(H5F__set_eoa(f, H5FD_MEM_SUPER, udata.stored_eof - sblock->base_addr) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set end-of-address marker for file")
+
+    /* Decode the optional superblock extension info */
+    if(H5F_addr_defined(sblock->ext_addr)) {
+        H5O_loc_t ext_loc;      /* "Object location" for superblock extension */
+        H5O_btreek_t btreek;    /* v1 B-tree 'K' value message from superblock extension */
+        H5O_drvinfo_t drvinfo;  /* Driver info message from superblock extension */
+	size_t u; 		/* Local index variable */
+        htri_t status;          /* Status for message existing */
+
+        /* Sanity check - superblock extension should only be defined for
+         *      superblock version >= 2.
+         */
+        HDassert(sblock->super_vers >= HDF5_SUPERBLOCK_VERSION_2);
+
+        /* Check for superblock extension being located "outside" the stored
+         *      'eoa' value, which can occur with the split/multi VFD.
+         */
+        if(H5F_addr_gt(sblock->ext_addr, udata.stored_eof)) {
+            /* Set the 'eoa' for the object header memory type large enough
+             *  to give some room for a reasonably sized superblock extension.
+             *  (This is _rather_ a kludge -QAK)
+             */
+            if(H5F__set_eoa(f, H5FD_MEM_OHDR, (haddr_t)(sblock->ext_addr + 1024)) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set end-of-address marker for file")
+        } /* end if */
+
+        /* Open the superblock extension */
+	if(H5F_super_ext_open(f, sblock->ext_addr, &ext_loc) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENOBJ, FAIL, "unable to open file's superblock extension")
+
+        /* Check for the extension having a 'driver info' message */
+        if((status = H5O_msg_exists(&ext_loc, H5O_DRVINFO_ID, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_EXISTS, FAIL, "unable to read object header")
+        if(status) {
+            /* Check for ignoring the driver info for this file */
+            if(!udata.ignore_drvrinfo) {
+
+                /* Retrieve the 'driver info' structure */
+                if(NULL == H5O_msg_read(&ext_loc, H5O_DRVINFO_ID, &drvinfo, dxpl_id))
+                    HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "driver info message not present")
+
+                /* Validate and decode driver information */
+                if(H5FD_sb_load(f->shared->lf, drvinfo.name, drvinfo.buf) < 0)
+                    HGOTO_ERROR(H5E_FILE, H5E_CANTDECODE, FAIL, "unable to decode driver information")
+
+                /* Reset driver info message */
+                H5O_msg_reset(H5O_DRVINFO_ID, &drvinfo);
+            } /* end else */
+        } /* end if */
+
+        /* Read in the shared OH message information if there is any */
+        if(H5SM_get_info(&ext_loc, c_plist, dxpl_id) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to read SOHM table information")
+
+        /* Check for the extension having a 'v1 B-tree "K"' message */
+        if((status = H5O_msg_exists(&ext_loc, H5O_BTREEK_ID, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_EXISTS, FAIL, "unable to read object header")
+        if(status) {
+            /* Retrieve the 'v1 B-tree "K"' structure */
+            if(NULL == H5O_msg_read(&ext_loc, H5O_BTREEK_ID, &btreek, dxpl_id))
+                HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "v1 B-tree 'K' info message not present")
+
+            /* Set non-default v1 B-tree 'K' value info from file */
+            sblock->btree_k[H5B_CHUNK_ID] = btreek.btree_k[H5B_CHUNK_ID];
+            sblock->btree_k[H5B_SNODE_ID] = btreek.btree_k[H5B_SNODE_ID];
+            sblock->sym_leaf_k = btreek.sym_leaf_k;
+
+            /* Set non-default v1 B-tree 'K' values in the property list */
+            if(H5P_set(c_plist, H5F_CRT_BTREE_RANK_NAME, btreek.btree_k) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set rank for btree internal nodes")
+            if(H5P_set(c_plist, H5F_CRT_SYM_LEAF_NAME, &btreek.sym_leaf_k) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set rank for symbol table leaf nodes")
+        } /* end if */
+
+        /* Check for the extension having a 'free-space manager info' message */
+        if((status = H5O_msg_exists(&ext_loc, H5O_FSINFO_ID, dxpl_id)) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_EXISTS, FAIL, "unable to read object header")
+        if(status) {
+            H5O_fsinfo_t fsinfo;    /* Free-space manager info message from superblock extension */
+
+            /* Retrieve the 'free-space manager info' structure */
+	    if(NULL == H5O_msg_read(&ext_loc, H5O_FSINFO_ID, &fsinfo, dxpl_id))
+                HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get free-space manager info message")
+
+            /* Check for non-default info */
+	    if(f->shared->fs_strategy != fsinfo.strategy) {
+		f->shared->fs_strategy = fsinfo.strategy;
+
+		/* Set non-default strategy in the property list */
+		if(H5P_set(c_plist, H5F_CRT_FILE_SPACE_STRATEGY_NAME, &fsinfo.strategy) < 0)
+		    HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set file space strategy")
+	    } /* end if */
+	    if(f->shared->fs_threshold != fsinfo.threshold) {
+		f->shared->fs_threshold = fsinfo.threshold;
+
+		/* Set non-default threshold in the property list */
+		if(H5P_set(c_plist, H5F_CRT_FREE_SPACE_THRESHOLD_NAME, &fsinfo.threshold) < 0)
+		    HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set file space strategy")
+	    } /* end if */
+
+	    /* Set free-space manager addresses */
+	    f->shared->fs_addr[0] = HADDR_UNDEF;
+	    for(u = 1; u < NELMTS(f->shared->fs_addr); u++)
+		f->shared->fs_addr[u] = fsinfo.fs_addr[u-1];
+        } /* end if */
+
+        /* Close superblock extension */
+        if(H5F_super_ext_close(f, &ext_loc, dxpl_id, FALSE) < 0)
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "unable to close file's superblock extension")
+    } /* end if */
+
+    /* Update the driver info if VFD indicated to do so */
+    /* (NOTE: only for later versions of superblock, earlier versions are handled
+     *          earlier in this routine.
+     */
+    if(((rw_flags & H5AC__READ_ONLY_FLAG) == 0) &&
+            sblock->super_vers >= HDF5_SUPERBLOCK_VERSION_2 &&
+            H5F_addr_defined(sblock->ext_addr)) {
+        /* Check for modifying the driver info when opening the file */
+        if(H5F_HAS_FEATURE(f, H5FD_FEAT_DIRTY_DRVRINFO_LOAD)) {
+            size_t          driver_size;    /* Size of driver info block (bytes) */
+
+            /* Check for driver info message */
+            H5_CHECKED_ASSIGN(driver_size, size_t, H5FD_sb_size(f->shared->lf), hsize_t);
+            if(driver_size > 0) {
+                H5O_drvinfo_t drvinfo;      /* Driver info */
+                uint8_t dbuf[H5F_MAX_DRVINFOBLOCK_SIZE];  /* Driver info block encoding buffer */
+
+                /* Sanity check */
+                HDassert(driver_size <= H5F_MAX_DRVINFOBLOCK_SIZE);
+
+                /* Encode driver-specific data */
+                if(H5FD_sb_encode(f->shared->lf, drvinfo.name, dbuf) < 0)
+                    HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to encode driver information")
+
+                /* Set the driver info information for the superblock extension */
+                drvinfo.len = driver_size;
+                drvinfo.buf = dbuf;
+
+                /* Write driver info information to the superblock extension */
+
+#if 1 /* bug fix test code -- tidy this up if all goes well */ /* JRM */
+		/* KLUGE ALERT!!
+		 *
+		 * H5F_super_ext_write_msg() expects f->shared->sblock to 
+		 * be set -- verify that it is NULL, and then set it.
+		 * Set it back to NULL when we are done.
+		 */
+		HDassert(f->shared->sblock == NULL);
+		f->shared->sblock = sblock;
+#endif /* JRM */
+
+                if(H5F_super_ext_write_msg(f, dxpl_id, &drvinfo, H5O_DRVINFO_ID, FALSE) < 0)
+                    HGOTO_ERROR(H5E_FILE, H5E_WRITEERROR, FAIL, "error in writing message to superblock extension")
+
+#if 1 /* bug fix test code -- tidy this up if all goes well */ /* JRM */
+		f->shared->sblock = NULL;
+#endif /* JRM */
+
+            } /* end if */
+        } /* end if */
+        /* Check for eliminating the driver info block */
+        else if(H5F_HAS_FEATURE(f, H5FD_FEAT_IGNORE_DRVRINFO)) {
+            /* Remove the driver info message from the superblock extension */
+            if(H5F_super_ext_remove_msg(f, dxpl_id, H5O_DRVINFO_ID) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "error in removing message from superblock extension")
+
+            /* Check if the superblock extension was removed */
+            if(!H5F_addr_defined(sblock->ext_addr))
+                sblock_flags |= H5AC__DIRTIED_FLAG;
+        } /* end if */
+    } /* end if */
 
     /* Set the pointer to the pinned superblock */
     f->shared->sblock = sblock;
 
 done:
+    /* Reset the ring in the DXPL */
+    if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+        HDONE_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set property value")
+
     /* Release the superblock */
     if(sblock && H5AC_unprotect(f, dxpl_id, H5AC_SUPERBLOCK, (haddr_t)0, sblock, sblock_flags) < 0)
-        HDONE_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "unable to close superblock")
+        HDONE_ERROR(H5E_FILE, H5E_CANTUNPROTECT, FAIL, "unable to close superblock")
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5F_super_read() */
+    /* If we have failed, make sure no entries are left in the 
+     * metadata cache, so that it can be shut down and discarded.
+     */
+    if(ret_value < 0) { 
+        /* Unpin and discard drvinfo cache entry */
+        if(f->shared->drvinfo) {
+            if(H5AC_unpin_entry(f->shared->drvinfo) < 0)
+                HDONE_ERROR(H5E_FILE, H5E_CANTUNPIN, FAIL, "unable to unpin driver info")
+
+            /* Evict the driver info block from the cache */
+            if(H5AC_expunge_entry(f, dxpl_id, H5AC_DRVRINFO, sblock->driver_addr, H5AC__NO_FLAGS_SET) < 0)
+                HDONE_ERROR(H5E_FILE, H5E_CANTEXPUNGE, FAIL, "unable to expunge driver info block")
+        } /* end if */
+
+        /* Unpin & discard superblock */
+        if(sblock) {
+            /* Unpin superblock in cache */
+            if(H5AC_unpin_entry(sblock) < 0)
+                HDONE_ERROR(H5E_FILE, H5E_CANTUNPIN, FAIL, "unable to unpin superblock")
+
+            /* Evict the superblock from the cache */
+            if(H5AC_expunge_entry(f, dxpl_id, H5AC_SUPERBLOCK, (haddr_t)0, H5AC__NO_FLAGS_SET) < 0)
+                HDONE_ERROR(H5E_FILE, H5E_CANTEXPUNGE, FAIL, "unable to expunge superblock")
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* end H5F__super_read() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5F_super_init
+ * Function:    H5F__super_init
  *
  * Purpose:     Allocates the superblock for the file and initializes
  *              information about the superblock in memory.  Writes extension
@@ -330,11 +736,15 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5F_super_init(H5F_t *f, hid_t dxpl_id)
+H5F__super_init(H5F_t *f, hid_t dxpl_id)
 {
     H5F_super_t    *sblock = NULL;      /* Superblock cache structure                 */
     hbool_t         sblock_in_cache = FALSE;    /* Whether the superblock has been inserted into the metadata cache */
+    H5O_drvinfo_t  *drvinfo = NULL;     /* Driver info */
+    hbool_t         drvinfo_in_cache = FALSE;   /* Whether the driver info block has been inserted into the metadata cache */
     H5P_genplist_t *plist;              /* File creation property list                */
+    H5P_genplist_t *dxpl = NULL;
+    H5AC_ring_t ring, orig_ring = H5AC_RING_INV;
     hsize_t         userblock_size;     /* Size of userblock, in bytes                */
     hsize_t         superblock_size;    /* Size of superblock, in bytes               */
     size_t          driver_size;        /* Size of driver info block (bytes)          */
@@ -344,7 +754,7 @@ H5F_super_init(H5F_t *f, hid_t dxpl_id)
     hbool_t         ext_created = FALSE; /* Whether the extension has been created */
     herr_t          ret_value = SUCCEED; /* Return Value                              */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, H5AC__SUPERBLOCK_TAG, FAIL)
 
     /* Allocate space for the superblock */
     if(NULL == (sblock = H5FL_CALLOC(H5F_super_t)))
@@ -368,12 +778,18 @@ H5F_super_init(H5F_t *f, hid_t dxpl_id)
     if(H5P_get(plist, H5F_CRT_BTREE_RANK_NAME, &sblock->btree_k[0]) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get rank for btree internal nodes")
 
-    /* Bump superblock version if we are to use the latest version of the format */
-    if(f->shared->latest_format)
+    /* Bump superblock version if latest superblock version support is enabled */
+    if(H5F_USE_LATEST_FLAGS(f, H5F_LATEST_SUPERBLOCK))
         super_vers = HDF5_SUPERBLOCK_VERSION_LATEST;
     /* Bump superblock version to create superblock extension for SOHM info */
     else if(f->shared->sohm_nindexes > 0)
         super_vers = HDF5_SUPERBLOCK_VERSION_2;
+    /* Bump superblock version to create superblock extension for
+     * non-default file space strategy or non-default free-space threshold
+     */
+    else if(f->shared->fs_strategy != H5F_FILE_SPACE_STRATEGY_DEF ||
+            f->shared->fs_threshold != H5F_FREE_SPACE_THRESHOLD_DEF)
+        super_vers = HDF5_SUPERBLOCK_VERSION_2;
     /* Check for non-default indexed storage B-tree internal 'K' value
      * and set the version # of the superblock to 1 if it is a non-default
      * value.
@@ -412,20 +828,22 @@ H5F_super_init(H5F_t *f, hid_t dxpl_id)
     sblock->status_flags = 0;
 
     /* Reserve space for the userblock */
-    if(H5FD_set_eoa(f->shared->lf, H5FD_MEM_SUPER, userblock_size) < 0)
+    if(H5F__set_eoa(f, H5FD_MEM_SUPER, userblock_size) < 0)
         HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to set EOA value for userblock")
 
     /* Set the base address for the file in the VFD now, after allocating
      *  space for userblock.
      */
-    if(H5FD_set_base_addr(f->shared->lf, sblock->base_addr) < 0)
+    if(H5F__set_base_addr(f, sblock->base_addr) < 0)
         HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "failed to set base address for file driver")
 
-    /* Save a local copy of the superblock version number */
+    /* Save a local copy of the superblock version number, size of addresses & offsets */
     sblock->super_vers = super_vers;
+    sblock->sizeof_addr = f->shared->sizeof_addr;
+    sblock->sizeof_size = f->shared->sizeof_size;
 
     /* Compute the size of the superblock */
-    superblock_size = (hsize_t)H5F_SUPERBLOCK_SIZE(super_vers, f);
+    superblock_size = (hsize_t)H5F_SUPERBLOCK_SIZE(sblock);
 
     /* Compute the size of the driver information block */
     H5_CHECKED_ASSIGN(driver_size, size_t, H5FD_sb_size(f->shared->lf), hsize_t);
@@ -440,26 +858,33 @@ H5F_super_init(H5F_t *f, hid_t dxpl_id)
     } /* end if */
 
     /*
-     * Allocate space for the userblock, superblock & driver info blocks.
-     * We do it with one allocation request because the userblock and
-     * superblock need to be at the beginning of the file and only the first
-     * allocation request is required to return memory at format address zero.
+     * Allocate space for the superblock & driver info block.
+     * We do it with one allocation request because the superblock needs to be
+     * at the beginning of the file and only the first allocation request is
+     * required to return memory at format address zero.
      */
     if(super_vers < HDF5_SUPERBLOCK_VERSION_2)
         superblock_size += driver_size;
 
     /* Reserve space in the file for the superblock, instead of allocating it */
-    if(H5FD_set_eoa(f->shared->lf, H5FD_MEM_SUPER, superblock_size) < 0)
+    if(H5F__set_eoa(f, H5FD_MEM_SUPER, superblock_size) < 0)
         HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to set EOA value for superblock")
 
+    /* Set the ring type in the DXPL */
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_SB, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set ring value")
+
     /* Insert superblock into cache, pinned */
-    if(H5AC_insert_entry(f, dxpl_id, H5AC_SUPERBLOCK, (haddr_t)0, sblock, H5AC__PIN_ENTRY_FLAG) < 0)
+    if(H5AC_insert_entry(f, dxpl_id, H5AC_SUPERBLOCK, (haddr_t)0, sblock, H5AC__PIN_ENTRY_FLAG | H5AC__FLUSH_LAST_FLAG | H5AC__FLUSH_COLLECTIVELY_FLAG) < 0)
         HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, "can't add superblock to cache")
     sblock_in_cache = TRUE;
 
     /* Keep a copy of the superblock info */
     f->shared->sblock = sblock;
 
+    /* set the drvinfo filed to NULL -- will overwrite this later if needed */
+    f->shared->drvinfo = NULL;
+
     /*
      * Determine if we will need a superblock extension
      */
@@ -469,6 +894,12 @@ H5F_super_init(H5F_t *f, hid_t dxpl_id)
         HDassert(super_vers >= HDF5_SUPERBLOCK_VERSION_2);
         need_ext = TRUE;
     } /* end if */
+    /* Files with non-default free space settings always need the superblock extension */
+    else if(f->shared->fs_strategy != H5F_FILE_SPACE_STRATEGY_DEF ||
+            f->shared->fs_threshold != H5F_FREE_SPACE_THRESHOLD_DEF) {
+        HDassert(super_vers >= HDF5_SUPERBLOCK_VERSION_2);
+        need_ext = TRUE;
+    } /* end if */
     /* If we're going to use a version of the superblock format which allows
      *  for the superblock extension, check for non-default values to store
      *  in it.
@@ -488,6 +919,11 @@ H5F_super_init(H5F_t *f, hid_t dxpl_id)
     else
         need_ext = FALSE;
 
+    /* Set the ring type in the DXPL */
+    ring = H5AC_RING_SBE;
+    if((H5P_set(dxpl, H5AC_RING_NAME, &ring)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set property value")
+
     /* Create the superblock extension for "extra" superblock data, if necessary. */
     if(need_ext) {
         /* The superblock extension isn't actually a group, but the
@@ -527,31 +963,96 @@ H5F_super_init(H5F_t *f, hid_t dxpl_id)
 
         /* Check for driver info to store */
         if(driver_size > 0) {
-            H5O_drvinfo_t drvinfo;      /* Driver info */
+            H5O_drvinfo_t info;      /* Driver info */
             uint8_t dbuf[H5F_MAX_DRVINFOBLOCK_SIZE];  /* Driver info block encoding buffer */
 
             /* Sanity check */
             HDassert(driver_size <= H5F_MAX_DRVINFOBLOCK_SIZE);
 
             /* Encode driver-specific data */
-            if(H5FD_sb_encode(f->shared->lf, drvinfo.name, dbuf) < 0)
+            HDmemset(dbuf, 0, sizeof(dbuf));
+            if(H5FD_sb_encode(f->shared->lf, info.name, dbuf) < 0)
                 HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to encode driver information")
 
             /* Write driver info information to the superblock extension */
-            drvinfo.len = driver_size;
-            drvinfo.buf = dbuf;
-            if(H5O_msg_create(&ext_loc, H5O_DRVINFO_ID, H5O_MSG_FLAG_DONTSHARE, H5O_UPDATE_TIME, &drvinfo, dxpl_id) < 0)
+            info.len = driver_size;
+            info.buf = dbuf;
+            if(H5O_msg_create(&ext_loc, H5O_DRVINFO_ID, H5O_MSG_FLAG_DONTSHARE, H5O_UPDATE_TIME, &info, dxpl_id) < 0)
                 HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to update driver info header message")
         } /* end if */
+
+        /* Check for non-default free space settings */
+	if(f->shared->fs_strategy != H5F_FILE_SPACE_STRATEGY_DEF ||
+                f->shared->fs_threshold != H5F_FREE_SPACE_THRESHOLD_DEF) {
+	    H5FD_mem_t   type;         	/* Memory type for iteration */
+            H5O_fsinfo_t fsinfo;	/* Free space manager info message */
+
+	    /* Write free-space manager info message to superblock extension object header if needed */
+	    fsinfo.strategy = f->shared->fs_strategy;
+	    fsinfo.threshold = f->shared->fs_threshold;
+	    for(type = H5FD_MEM_SUPER; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type))
+                fsinfo.fs_addr[type-1] = HADDR_UNDEF;
+
+            if(H5O_msg_create(&ext_loc, H5O_FSINFO_ID, H5O_MSG_FLAG_DONTSHARE, H5O_UPDATE_TIME, &fsinfo, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to update free-space info header message")
+	} /* end if */
+    } /* end if */
+    else {
+        /* Check for creating an "old-style" driver info block */
+        if(driver_size > 0) {
+            /* Sanity check */
+            HDassert(H5F_addr_defined(sblock->driver_addr));
+
+            /* Allocate space for the driver info */
+            if(NULL == (drvinfo = (H5O_drvinfo_t *)H5MM_calloc(sizeof(H5O_drvinfo_t))))
+                HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "memory allocation failed for driver info message")
+
+            /* Set up driver info message */
+            /* (NOTE: All the actual information (name & driver information) is
+             *          actually based on the VFD info in the file handle and
+             *          will be encoded by the VFD's 'encode' callback, so it
+             *          doesn't need to be set here. -QAK, 7/20/2013
+             */
+            H5_CHECKED_ASSIGN(drvinfo->len, size_t, H5FD_sb_size(f->shared->lf), hsize_t);
+
+            /* Insert driver info block into cache */
+            if(H5AC_insert_entry(f, dxpl_id, H5AC_DRVRINFO, sblock->driver_addr, drvinfo, H5AC__PIN_ENTRY_FLAG | H5AC__FLUSH_LAST_FLAG | H5AC__FLUSH_COLLECTIVELY_FLAG) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTINS, FAIL, "can't add driver info block to cache")
+            drvinfo_in_cache = TRUE;
+            f->shared->drvinfo = drvinfo;
+        } /* end if */
+        else
+            HDassert(!H5F_addr_defined(sblock->driver_addr));
     } /* end if */
 
 done:
+    /* Reset the ring in the DXPL */
+    if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+        HDONE_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set property value")
+
     /* Close superblock extension, if it was created */
     if(ext_created && H5F_super_ext_close(f, &ext_loc, dxpl_id, ext_created) < 0)
         HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "unable to close file's superblock extension")
 
     /* Cleanup on failure */
     if(ret_value < 0) {
+        /* Check if the driver info block has been allocated yet */
+        if(drvinfo) {
+            /* Check if we've cached it already */
+            if(drvinfo_in_cache) {
+                /* Unpin drvinfo in cache */
+                if(H5AC_unpin_entry(drvinfo) < 0)
+                    HDONE_ERROR(H5E_FILE, H5E_CANTUNPIN, FAIL, "unable to unpin driver info")
+
+                /* Evict the driver info block from the cache */
+                if(H5AC_expunge_entry(f, dxpl_id, H5AC_DRVRINFO, sblock->driver_addr, H5AC__NO_FLAGS_SET) < 0)
+                    HDONE_ERROR(H5E_FILE, H5E_CANTEXPUNGE, FAIL, "unable to expunge driver info block")
+            } /* end if */
+            else
+                /* Free driver info block */
+                H5MM_xfree(drvinfo);
+        } /* end if */
+
         /* Check if the superblock has been allocated yet */
         if(sblock) {
             /* Check if we've cached it already */
@@ -566,7 +1067,7 @@ done:
             } /* end if */
             else
                 /* Free superblock */
-                if(H5F_super_free(sblock) < 0)
+                if(H5F__super_free(sblock) < 0)
                     HDONE_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "unable to destroy superblock")
 
             /* Reset variables in file structure */
@@ -574,8 +1075,8 @@ done:
         } /* end if */
     } /* end if */
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5F_super_init() */
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* end H5F__super_init() */
 
 

 /*-------------------------------------------------------------------------
@@ -607,13 +1108,21 @@ H5F_super_dirty(H5F_t *f)
     if(H5AC_mark_entry_dirty(f->shared->sblock) < 0)
         HGOTO_ERROR(H5E_FILE, H5E_CANTMARKDIRTY, FAIL, "unable to mark superblock as dirty")
 
+    /* if the driver information block exists, mark it dirty as well 
+     * so that the change in eoa will be reflected there as well if 
+     * appropriate.
+     */
+    if ( f->shared->drvinfo )
+        if(H5AC_mark_entry_dirty(f->shared->drvinfo) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTMARKDIRTY, FAIL, "unable to mark drvinfo as dirty")
+
 done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5F_super_dirty() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5F_super_free
+ * Function:    H5F__super_free
  *
  * Purpose:     Destroyer the file's superblock
  *
@@ -626,9 +1135,9 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5F_super_free(H5F_super_t *sblock)
+H5F__super_free(H5F_super_t *sblock)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_PACKAGE_NOERR
 
     /* Sanity check */
     HDassert(sblock);
@@ -640,11 +1149,11 @@ H5F_super_free(H5F_super_t *sblock)
     sblock = (H5F_super_t *)H5FL_FREE(H5F_super_t, sblock);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5F_super_free() */
+} /* H5F__super_free() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5F_super_size
+ * Function:    H5F__super_size
  *
  * Purpose:     Get storage size of the superblock and superblock extension
  *
@@ -657,11 +1166,13 @@ H5F_super_free(H5F_super_t *sblock)
  *-------------------------------------------------------------------------
  */
 herr_t
-H5F_super_size(H5F_t *f, hid_t dxpl_id, hsize_t *super_size, hsize_t *super_ext_size)
+H5F__super_size(H5F_t *f, hid_t dxpl_id, hsize_t *super_size, hsize_t *super_ext_size)
 {
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_PACKAGE
 
     /* Sanity check */
     HDassert(f);
@@ -670,7 +1181,7 @@ H5F_super_size(H5F_t *f, hid_t dxpl_id, hsize_t *super_size, hsize_t *super_ext_
 
     /* Set the superblock size */
     if(super_size)
-	*super_size = (hsize_t)H5F_SUPERBLOCK_SIZE(f->shared->sblock->super_vers, f);
+	*super_size = (hsize_t)H5F_SUPERBLOCK_SIZE(f->shared->sblock);
 
     /* Set the superblock extension size */
     if(super_ext_size) {
@@ -683,6 +1194,10 @@ H5F_super_size(H5F_t *f, hid_t dxpl_id, hsize_t *super_size, hsize_t *super_ext_
             ext_loc.file = f;
             ext_loc.addr = f->shared->sblock->ext_addr;
 
+            /* Set the ring type in the DXPL */
+            if(H5AC_set_ring(dxpl_id, H5AC_RING_SBE, &dxpl, &orig_ring) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set ring value")
+
             /* Get object header info for superblock extension */
             if(H5O_get_hdr_info(&ext_loc, dxpl_id, &hdr_info) < 0)
                 HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to retrieve superblock extension info")
@@ -696,8 +1211,12 @@ H5F_super_size(H5F_t *f, hid_t dxpl_id, hsize_t *super_size, hsize_t *super_ext_
     } /* end if */
 
 done:
+    /* Reset the ring in the DXPL */
+    if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+        HDONE_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set property value")
+
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5F_super_size() */
+} /* H5F__super_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -714,6 +1233,8 @@ done:
 herr_t
 H5F_super_ext_write_msg(H5F_t *f, hid_t dxpl_id, void *mesg, unsigned id, hbool_t may_create)
 {
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
     hbool_t     ext_created = FALSE;   /* Whether superblock extension was created */
     hbool_t     ext_opened = FALSE;    /* Whether superblock extension was opened */
     H5O_loc_t 	ext_loc; 	/* "Object location" for superblock extension */
@@ -727,6 +1248,10 @@ H5F_super_ext_write_msg(H5F_t *f, hid_t dxpl_id, void *mesg, unsigned id, hbool_
     HDassert(f->shared);
     HDassert(f->shared->sblock);
 
+    /* Set the ring type in the DXPL */
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_SBE, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set ring value")
+
     /* Open/create the superblock extension object header */
     if(H5F_addr_defined(f->shared->sblock->ext_addr)) {
 	if(H5F_super_ext_open(f, f->shared->sblock->ext_addr, &ext_loc) < 0)
@@ -764,6 +1289,10 @@ H5F_super_ext_write_msg(H5F_t *f, hid_t dxpl_id, void *mesg, unsigned id, hbool_
     } /* end else */
 
 done:
+    /* Reset the ring in the DXPL */
+    if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+        HDONE_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set property value")
+
     /* Close the superblock extension, if it was opened */
     if(ext_opened && H5F_super_ext_close(f, &ext_loc, dxpl_id, ext_created) < 0)
         HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "unable to close file's superblock extension")
@@ -775,3 +1304,79 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5F_super_ext_write_msg() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F_super_ext_remove_msg
+ *
+ * Purpose:     Remove the message with ID from the superblock extension
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi; Feb 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5F_super_ext_remove_msg(H5F_t *f, hid_t dxpl_id, unsigned id)
+{
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
+    H5O_loc_t 	ext_loc; 	/* "Object location" for superblock extension */
+    hbool_t     ext_opened = FALSE;     /* Whether the superblock extension was opened */
+    int		null_count = 0;	/* # of null messages */
+    htri_t      status;         /* Indicate whether the message exists or not */
+    herr_t 	ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Make sure that the superblock extension object header exists */
+    HDassert(H5F_addr_defined(f->shared->sblock->ext_addr));
+
+    /* Set the ring type in the DXPL */
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_SBE, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set ring value")
+
+    /* Open superblock extension object header */
+    if(H5F_super_ext_open(f, f->shared->sblock->ext_addr, &ext_loc) < 0)
+	HGOTO_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "error in starting file's superblock extension")
+    ext_opened = TRUE;
+
+    /* Check if message with ID exists in the object header */
+    if((status = H5O_msg_exists(&ext_loc, id, dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to check object header for message")
+    else if(status) { /* message exists */
+	H5O_hdr_info_t 	hdr_info;       /* Object header info for superblock extension */
+
+	/* Remove the message */
+	if(H5O_msg_remove(&ext_loc, id, H5O_ALL, TRUE, dxpl_id) < 0)
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "unable to delete free-space manager info message")
+
+	/* Get info for the superblock extension's object header */
+	if(H5O_get_hdr_info(&ext_loc, dxpl_id, &hdr_info) < 0)
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to retrieve superblock extension info")
+
+	/* If the object header is an empty base chunk, remove superblock extension */
+	if(hdr_info.nchunks == 1) {
+	    if((null_count = H5O_msg_count(&ext_loc, H5O_NULL_ID, dxpl_id)) < 0)
+		HGOTO_ERROR(H5E_SYM, H5E_CANTCOUNT, FAIL, "unable to count messages")
+	    else if((unsigned)null_count == hdr_info.nmesgs) {
+		HDassert(H5F_addr_defined(ext_loc.addr));
+		if(H5O_delete(f, dxpl_id, ext_loc.addr) < 0)
+		    HGOTO_ERROR(H5E_SYM, H5E_CANTCOUNT, FAIL, "unable to count messages")
+		f->shared->sblock->ext_addr = HADDR_UNDEF;
+	    } /* end if */
+	} /* end if */
+    } /* end if */
+
+done:
+    /* Reset the ring in the DXPL */
+    if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+        HDONE_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set property value")
+
+    /* Close superblock extension object header, if opened */
+    if(ext_opened && H5F_super_ext_close(f, &ext_loc, dxpl_id, FALSE) < 0)
+       HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "unable to close file's superblock extension")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5F_super_ext_remove_msg() */
+
diff --git a/src/H5Fsuper_cache.c b/src/H5Fsuper_cache.c
index 6062a03..6f37ff6 100644
--- a/src/H5Fsuper_cache.c
+++ b/src/H5Fsuper_cache.c
@@ -13,12 +13,23 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5Fsuper_cache.c
+ *			Aug 15 2009
+ *			Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:		Implement file superblock & driver info metadata cache methods.
+ *
+ *-------------------------------------------------------------------------
+ */
+
 /****************/
 /* Module Setup */
 /****************/
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+#include "H5Fmodule.h"          /* This source code file is part of the H5F module */
+#define H5G_FRIEND		/*suppress error about including H5Gpkg	  */
 
 
 /***********/
@@ -40,9 +51,6 @@
 /* Local Macros */
 /****************/
 
-/* Maximum size of super-block buffers */
-#define H5F_MAX_SUPERBLOCK_SIZE  134
-
 
 /******************/
 /* Local Typedefs */
@@ -59,27 +67,77 @@
 /********************/
 
 /* Metadata cache (H5AC) callbacks */
-static H5F_super_t *H5F_sblock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static herr_t H5F_sblock_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5F_super_t *sblock);
-static herr_t H5F_sblock_dest(H5F_t *f, H5F_super_t * sblock);
-static herr_t H5F_sblock_clear(H5F_t *f, H5F_super_t *sblock, hbool_t destroy);
-static herr_t H5F_sblock_size(const H5F_t *f, const H5F_super_t *sblock, size_t *size_ptr);
+static herr_t H5F__cache_superblock_get_load_size(const void *image_ptr, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5F__cache_superblock_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
+static void *H5F__cache_superblock_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty);
+static herr_t H5F__cache_superblock_image_len(const void *thing, 
+    size_t *image_len, hbool_t *compressed_ptr, 
+    size_t *compressed_image_len_ptr);
+static herr_t H5F__cache_superblock_pre_serialize(const H5F_t *f, 
+    hid_t dxpl_id, void *thing, haddr_t addr, size_t len, 
+    size_t compressed_len, haddr_t *new_addr, size_t *new_len, 
+    size_t *new_compressed_len, unsigned *flags);
+static herr_t H5F__cache_superblock_serialize(const H5F_t *f, void *image, size_t len,
+    void *thing);
+static herr_t H5F__cache_superblock_free_icr(void *thing);
+
+static herr_t H5F__cache_drvrinfo_get_load_size(const void *image_ptr, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static void *H5F__cache_drvrinfo_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty);
+static herr_t H5F__cache_drvrinfo_image_len(const void *thing, 
+    size_t *image_len, hbool_t *compressed_ptr, 
+    size_t *compressed_image_len_ptr);
+static herr_t H5F__cache_drvrinfo_serialize(const H5F_t *f, void *image, size_t len,
+    void *thing);
+static herr_t H5F__cache_drvrinfo_free_icr(void *thing);
 
 
 /*********************/
 /* Package Variables */
 /*********************/
 
-/* H5F inherits cache-like properties from H5AC */
+/* H5F superblock inherits cache-like properties from H5AC */
 const H5AC_class_t H5AC_SUPERBLOCK[1] = {{
-    H5AC_SUPERBLOCK_ID,
-    (H5AC_load_func_t)H5F_sblock_load,
-    (H5AC_flush_func_t)H5F_sblock_flush,
-    (H5AC_dest_func_t)H5F_sblock_dest,
-    (H5AC_clear_func_t)H5F_sblock_clear,
-    (H5AC_size_func_t)H5F_sblock_size,
+    H5AC_SUPERBLOCK_ID,                 /* Metadata client ID */
+    "Superblock",                       /* Metadata client name (for debugging) */
+    H5FD_MEM_SUPER,                     /* File space memory type for client */
+    H5AC__CLASS_SPECULATIVE_LOAD_FLAG,  /* Client class behavior flags */
+    H5F__cache_superblock_get_load_size,/* 'get_load_size' callback */
+    H5F__cache_superblock_verify_chksum, /* 'verify_chksum' callback */
+    H5F__cache_superblock_deserialize,  /* 'deserialize' callback */
+    H5F__cache_superblock_image_len,    /* 'image_len' callback */
+    H5F__cache_superblock_pre_serialize,/* 'pre_serialize' callback */
+    H5F__cache_superblock_serialize,    /* 'serialize' callback */
+    NULL,       			/* 'notify' callback */
+    H5F__cache_superblock_free_icr,     /* 'free_icr' callback */
+    NULL,				/* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
 }};
 
+/* H5F driver info block inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_DRVRINFO[1] = {{
+    H5AC_DRVRINFO_ID,                   /* Metadata client ID */
+    "Driver info block",                /* Metadata client name (for debugging) */
+    H5FD_MEM_SUPER,                     /* File space memory type for client */
+    H5AC__CLASS_SPECULATIVE_LOAD_FLAG,  /* Client class behavior flags */
+    H5F__cache_drvrinfo_get_load_size,  /* 'get_load_size' callback */
+    NULL,				/* 'verify_chksum' callback */
+    H5F__cache_drvrinfo_deserialize,    /* 'deserialize' callback */
+    H5F__cache_drvrinfo_image_len,      /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5F__cache_drvrinfo_serialize,      /* 'serialize' callback */
+    NULL,                               /* 'notify' callback */
+    H5F__cache_drvrinfo_free_icr,       /* 'free_icr' callback */
+    NULL,				/* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
+}};
+
+
 /*****************************/
 /* Library Private Variables */
 /*****************************/
@@ -95,662 +153,510 @@ H5FL_EXTERN(H5F_super_t);
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5F_sblock_load
+ * Function:    H5F__cache_superblock_get_load_size
  *
- * Purpose:     Loads the superblock from the file, and deserializes
- *              its information into the H5F_super_t structure.
+ * Purpose:     Compute the size of the data structure on disk.
  *
- * Return:      Success:        SUCCEED
- *              Failure:        NULL
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  Mike McGreevy
- *              mamcgree at hdfgroup.org
- *              April 8, 2009
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 17, 2013
  *
  *-------------------------------------------------------------------------
  */
-static H5F_super_t *
-H5F_sblock_load(H5F_t *f, hid_t dxpl_id, haddr_t H5_ATTR_UNUSED addr, void *_udata)
+static herr_t
+H5F__cache_superblock_get_load_size(const void *_image, void *_udata, size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    H5F_super_t        *sblock = NULL;      /* File's superblock */
-    haddr_t             base_addr = HADDR_UNDEF;        /* Base address of file */
-    uint8_t             sbuf[H5F_MAX_SUPERBLOCK_SIZE];     /* Buffer for superblock */
-    H5P_genplist_t     *dxpl;               /* DXPL object */
-    H5P_genplist_t     *c_plist;            /* File creation property list  */
-    H5F_file_t         *shared;             /* shared part of `file'        */
-    H5FD_t             *lf;                 /* file driver part of `shared' */
-    haddr_t             stored_eoa;         /*relative end-of-addr in file  */
-    haddr_t             eof;                /*end of file address           */
-    uint8_t             sizeof_addr;        /* Size of offsets in the file (in bytes) */
-    uint8_t             sizeof_size;        /* Size of lengths in the file (in bytes) */
-    const size_t        fixed_size = H5F_SUPERBLOCK_FIXED_SIZE; /*fixed sizeof superblock   */
-    size_t              variable_size;      /*variable sizeof superblock    */
-    uint8_t            *p;                  /* Temporary pointer into encoding buffer */
-    unsigned            super_vers;         /* Superblock version          */
-    hbool_t            *dirtied = (hbool_t *)_udata;  /* Set up dirtied out value */
-    H5F_super_t        *ret_value;          /* Return value */
+    const uint8_t *image = (const uint8_t *)_image;   			    /* Pointer into raw data buffer */
+    H5F_superblock_cache_ud_t *udata = (H5F_superblock_cache_ud_t *)_udata; /* User data */
+    unsigned super_vers;                /* Superblock version */
+    uint8_t sizeof_addr;                /* Size of offsets in the file (in bytes) */
+    uint8_t sizeof_size;                /* Size of lengths in the file (in bytes) */
+    size_t variable_size;               /* Variable size of superblock */
+    htri_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check arguments */
+    HDassert(image_len);
+
+    if(image == NULL) {
+	HDassert(actual_len == NULL);
+
+	/* Set the initial image length size */
+	*image_len = H5F_SUPERBLOCK_FIXED_SIZE +    /* Fixed size of superblock */
+	    	     H5F_SUPERBLOCK_MINIMAL_VARLEN_SIZE;
+    } else { /* compute actual_len */
+	HDassert(udata);
+	HDassert(udata->f);
+	HDassert(actual_len);
+	HDassert(*actual_len == *image_len);
+
+	image += H5F_SIGNATURE_LEN;
+
+	/* Superblock version */
+	super_vers = *image++;
+	if(super_vers > HDF5_SUPERBLOCK_VERSION_LATEST)
+	    HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad superblock version number")
+
+	/* Save the version to be used in verify_chksum callback */
+	udata->super_vers = super_vers;
+
+	/* Sanity check */
+	HDassert(((size_t)(image - (const uint8_t *)_image)) == H5F_SUPERBLOCK_FIXED_SIZE);
+	HDassert(*image_len >= H5F_SUPERBLOCK_FIXED_SIZE + 6);
+
+	/* Determine the size of addresses & size of offsets, for computing the
+	 * variable-sized portion of the superblock.
+	 */
+	if(super_vers < HDF5_SUPERBLOCK_VERSION_2) {
+	    sizeof_addr = image[4];
+	    sizeof_size = image[5];
+	} /* end if */
+	else {
+	    sizeof_addr = image[0];
+	    sizeof_size = image[1];
+	} /* end else */
+	if(sizeof_addr != 2 && sizeof_addr != 4 &&
+           sizeof_addr != 8 && sizeof_addr != 16 && sizeof_addr != 32)
+	    HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad byte number in an address")
+	if(sizeof_size != 2 && sizeof_size != 4 &&
+           sizeof_size != 8 && sizeof_size != 16 && sizeof_size != 32)
+	    HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad byte number for object size")
+
+	/* Determine the size of the variable-length part of the superblock */
+	variable_size = (size_t)H5F_SUPERBLOCK_VARLEN_SIZE(super_vers, sizeof_addr, sizeof_size);
+	HDassert(variable_size > 0);
+
+	/* Handle metadata cache retry for variable-sized portion of the superblock */
+	if(*image_len != (H5F_SUPERBLOCK_FIXED_SIZE + variable_size)) {
+
+	    /* Sanity check */
+	    HDassert(*image_len == (H5F_SUPERBLOCK_FIXED_SIZE + H5F_SUPERBLOCK_MINIMAL_VARLEN_SIZE));
+
+	    /* Make certain we can read the variabled-sized portion of the superblock */
+	    if(H5F__set_eoa(udata->f, H5FD_MEM_SUPER, (haddr_t)(H5F_SUPERBLOCK_FIXED_SIZE + variable_size)) < 0)
+		HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "set end of space allocation request failed")
+
+	    *actual_len = H5F_SUPERBLOCK_FIXED_SIZE + variable_size;
+
+	} /* end if */
+    }
 
-    FUNC_ENTER_NOAPI_NOINIT
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F__cache_superblock_get_load_size() */
 
-    /* check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_eq(addr, 0));
-    HDassert(dirtied);
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F__cache_superblock_verify_chksum
+ *
+ * Purpose:	Verify the computed checksum of the data structure is the 
+ *		same as the stored chksum.
+ *
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
+ *
+ * Programmer:  Vailin Choi; Aug 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5F__cache_superblock_verify_chksum(const void *_image, size_t len, void *_udata)
+{
+    const uint8_t *image = (const uint8_t *)_image;    	/* Pointer into raw data buffer */
+    H5F_superblock_cache_ud_t *udata = (H5F_superblock_cache_ud_t *)_udata; /* User data */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+    htri_t ret_value = TRUE;	/* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(image);
+    HDassert(udata);
 
-    /* Short cuts */
-    shared = f->shared;
-    lf = shared->lf;
+    /* No checksum for version 0 & 1 */
+    if(udata->super_vers >= HDF5_SUPERBLOCK_VERSION_2) {
 
-    /* Get the shared file creation property list */
-    if(NULL == (c_plist = (H5P_genplist_t *)H5I_object(shared->fcpl_id)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "can't get property list")
+	/* Get stored and computed checksums */
+	H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
 
-    /* Get the base address for the file in the VFD */
-    if(HADDR_UNDEF == (base_addr = H5FD_get_base_addr(lf)))
-        HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "failed to get base address for file driver")
+	if(stored_chksum != computed_chksum)
+	    ret_value = FALSE;
+    }
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F__cache_superblock_verify_chksum() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F__cache_superblock_deserialize
+ *
+ * Purpose:	Loads an object from the disk.
+ *
+ * Return:	Success:	Pointer to new object
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		July 18 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5F__cache_superblock_deserialize(const void *_image, size_t len, void *_udata,
+    hbool_t H5_ATTR_UNUSED *dirty)
+{
+    H5F_super_t         *sblock = NULL; /* File's superblock */
+    H5F_superblock_cache_ud_t *udata = (H5F_superblock_cache_ud_t *)_udata; /* User data */
+    const uint8_t	*image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    size_t              variable_size;  /* Variable size of superblock */
+    unsigned            super_vers;     /* Superblock version */
+    uint8_t             sizeof_addr;    /* Size of offsets in the file (in bytes) */
+    uint8_t             sizeof_size;    /* Size of lengths in the file (in bytes) */
+    H5F_super_t         *ret_value = NULL;      /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check arguments */
+    HDassert(image);
+    HDassert(udata);
+    HDassert(udata->f);
 
     /* Allocate space for the superblock */
     if(NULL == (sblock = H5FL_CALLOC(H5F_super_t)))
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
 
-    /* Get the DXPL plist object for DXPL ID */
-    if(NULL == (dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "can't get property list")
-
-    /* Read fixed-size portion of the superblock */
-    p = sbuf;
-    H5_CHECK_OVERFLOW(fixed_size, size_t, haddr_t);
-    if(H5FD_set_eoa(lf, H5FD_MEM_SUPER, (haddr_t)fixed_size) < 0)
-        HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "set end of space allocation request failed")
-    if(H5FD_read(lf, dxpl, H5FD_MEM_SUPER, (haddr_t)0, fixed_size, p) < 0)
-        HGOTO_ERROR(H5E_FILE, H5E_READERROR, NULL, "unable to read superblock")
-
-    /* Skip over signature (already checked when locating the superblock) */
-    p += H5F_SIGNATURE_LEN;
+    image += H5F_SIGNATURE_LEN;
 
     /* Superblock version */
-    super_vers = *p++;
+    super_vers = *image++;
     if(super_vers > HDF5_SUPERBLOCK_VERSION_LATEST)
         HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad superblock version number")
-    if(H5P_set(c_plist, H5F_CRT_SUPER_VERS_NAME, &super_vers) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set superblock version")
 
     /* Record the superblock version */
     sblock->super_vers = super_vers;
 
     /* Sanity check */
-    HDassert(((size_t)(p - sbuf)) == fixed_size);
+    HDassert(((size_t)(image - (const uint8_t *)_image)) == H5F_SUPERBLOCK_FIXED_SIZE);
+    HDassert(len >= H5F_SUPERBLOCK_FIXED_SIZE + 6);
+
+    /* Determine the size of addresses & size of offsets, for computing the
+     * variable-sized portion of the superblock.
+     */
+    if(super_vers < HDF5_SUPERBLOCK_VERSION_2) {
+        sizeof_addr = image[4];
+        sizeof_size = image[5];
+    } /* end if */
+    else {
+        sizeof_addr = image[0];
+        sizeof_size = image[1];
+    } /* end else */
+    if(sizeof_addr != 2 && sizeof_addr != 4 &&
+            sizeof_addr != 8 && sizeof_addr != 16 && sizeof_addr != 32)
+        HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad byte number in an address")
+    if(sizeof_size != 2 && sizeof_size != 4 &&
+            sizeof_size != 8 && sizeof_size != 16 && sizeof_size != 32)
+        HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad byte number for object size")
+    sblock->sizeof_addr = sizeof_addr;
+    sblock->sizeof_size = sizeof_size;
 
     /* Determine the size of the variable-length part of the superblock */
-    variable_size = (size_t)H5F_SUPERBLOCK_VARLEN_SIZE(super_vers, f);
+    variable_size = (size_t)H5F_SUPERBLOCK_VARLEN_SIZE(super_vers, sizeof_addr, sizeof_size);
     HDassert(variable_size > 0);
-    HDassert(fixed_size + variable_size <= sizeof(sbuf));
 
-    /* Read in variable-sized portion of superblock */
-    if(H5FD_set_eoa(lf, H5FD_MEM_SUPER, (haddr_t)(fixed_size + variable_size)) < 0)
-        HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "set end of space allocation request failed")
-    if(H5FD_read(lf, dxpl, H5FD_MEM_SUPER, (haddr_t)fixed_size, variable_size, p) < 0)
-        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to read superblock")
+    HDassert(len == (H5F_SUPERBLOCK_FIXED_SIZE + variable_size));
 
     /* Check for older version of superblock format */
     if(super_vers < HDF5_SUPERBLOCK_VERSION_2) {
-        uint32_t	status_flags;	    /* File status flags	   */
-        unsigned        btree_k[H5B_NUM_BTREE_ID];  /* B-tree internal node 'K' values */
-        unsigned        sym_leaf_k;         /* Symbol table leaf node's 'K' value */
-
-        /* Freespace version (hard-wired) */
-        if(HDF5_FREESPACE_VERSION != *p++)
-            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad free space version number")
-
-        /* Root group version number (hard-wired) */
-        if(HDF5_OBJECTDIR_VERSION != *p++)
-            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad object directory version number")
-
-        /* Skip over reserved byte */
-        p++;
-
-        /* Shared header version number (hard-wired) */
-        if(HDF5_SHAREDHEADER_VERSION != *p++)
-            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad shared-header format version number")
-
-        /* Size of file addresses */
-        sizeof_addr = *p++;
-        if(sizeof_addr != 2 && sizeof_addr != 4 &&
-                sizeof_addr != 8 && sizeof_addr != 16 && sizeof_addr != 32)
-            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad byte number in an address")
-        if(H5P_set(c_plist, H5F_CRT_ADDR_BYTE_NUM_NAME, &sizeof_addr) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set byte number in an address")
-        shared->sizeof_addr = sizeof_addr;  /* Keep a local copy also */
-
-        /* Size of file sizes */
-        sizeof_size = *p++;
-        if(sizeof_size != 2 && sizeof_size != 4 &&
-                sizeof_size != 8 && sizeof_size != 16 && sizeof_size != 32)
-            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad byte number for object size")
-        if(H5P_set(c_plist, H5F_CRT_OBJ_BYTE_NUM_NAME, &sizeof_size) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set byte number for object size")
-        shared->sizeof_size = sizeof_size;  /* Keep a local copy also */
-
-        /* Skip over reserved byte */
-        p++;
-
-        /* Various B-tree sizes */
-        UINT16DECODE(p, sym_leaf_k);
-        if(sym_leaf_k == 0)
-            HGOTO_ERROR(H5E_FILE, H5E_BADRANGE, NULL, "bad symbol table leaf node 1/2 rank")
-        if(H5P_set(c_plist, H5F_CRT_SYM_LEAF_NAME, &sym_leaf_k) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set rank for symbol table leaf nodes")
-        sblock->sym_leaf_k = sym_leaf_k;    /* Keep a local copy also */
+	uint32_t    status_flags;	    /* File status flags	   */
+	unsigned    sym_leaf_k;         /* Symbol table leaf node's 'K' value */
+	unsigned    snode_btree_k;      /* B-tree symbol table internal node 'K' value */
+	unsigned    chunk_btree_k;      /* B-tree chunk internal node 'K' value */
+
+	/* Freespace version (hard-wired) */
+	if(HDF5_FREESPACE_VERSION != *image++)
+	    HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad free space version number")
+
+	/* Root group version number (hard-wired) */
+	if(HDF5_OBJECTDIR_VERSION != *image++)
+	    HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad object directory version number")
+
+	/* Skip over reserved byte */
+	image++;
+
+	/* Shared header version number (hard-wired) */
+	if(HDF5_SHAREDHEADER_VERSION != *image++)
+	    HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad shared-header format version number")
+
+	/* Size of file addresses */
+	sizeof_addr = *image++;
+	if(sizeof_addr != 2 && sizeof_addr != 4 &&
+		sizeof_addr != 8 && sizeof_addr != 16 && sizeof_addr != 32)
+	    HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad byte number in an address")
+	sblock->sizeof_addr = sizeof_addr;
+	udata->f->shared->sizeof_addr = sizeof_addr;  /* Keep a local copy also */
+
+	/* Size of file sizes */
+	sizeof_size = *image++;
+	if(sizeof_size != 2 && sizeof_size != 4 &&
+		sizeof_size != 8 && sizeof_size != 16 && sizeof_size != 32)
+	    HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad byte number for object size")
+	sblock->sizeof_size = sizeof_size;
+	udata->f->shared->sizeof_size = sizeof_size;  /* Keep a local copy also */
+
+	/* Skip over reserved byte */
+	image++;
+
+	/* Various B-tree sizes */
+	UINT16DECODE(image, sym_leaf_k);
+	if(sym_leaf_k == 0)
+	    HGOTO_ERROR(H5E_FILE, H5E_BADRANGE, NULL, "bad symbol table leaf node 1/2 rank")
+        udata->sym_leaf_k = sym_leaf_k;    /* Keep a local copy also */
 
         /* Need 'get' call to set other array values */
-        if(H5P_get(c_plist, H5F_CRT_BTREE_RANK_NAME, btree_k) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "unable to get rank for btree internal nodes")
-        UINT16DECODE(p, btree_k[H5B_SNODE_ID]);
-        if(btree_k[H5B_SNODE_ID] == 0)
-            HGOTO_ERROR(H5E_FILE, H5E_BADRANGE, NULL, "bad 1/2 rank for btree internal nodes")
-        /*
+        UINT16DECODE(image, snode_btree_k);
+        if(snode_btree_k == 0)
+	    HGOTO_ERROR(H5E_FILE, H5E_BADRANGE, NULL, "bad 1/2 rank for btree internal nodes")
+	udata->btree_k[H5B_SNODE_ID] = snode_btree_k;
+
+	/*
          * Delay setting the value in the property list until we've checked
          * for the indexed storage B-tree internal 'K' value later.
          */
 
         /* File status flags (not really used yet) */
-        UINT32DECODE(p, status_flags);
+        UINT32DECODE(image, status_flags);
         HDassert(status_flags <= 255);
         sblock->status_flags = (uint8_t)status_flags;
         if(sblock->status_flags & ~H5F_SUPER_ALL_FLAGS)
-            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad flag value for superblock")
+	    HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad flag value for superblock")
 
-        /*
+	/*
          * If the superblock version # is greater than 0, read in the indexed
          * storage B-tree internal 'K' value
          */
         if(super_vers > HDF5_SUPERBLOCK_VERSION_DEF) {
-            UINT16DECODE(p, btree_k[H5B_CHUNK_ID]);
-            /* Reserved bytes are present only in version 1 */
-            if(super_vers == HDF5_SUPERBLOCK_VERSION_1)
-                p += 2;   /* reserved */
-        } /* end if */
-        else
-            btree_k[H5B_CHUNK_ID] = HDF5_BTREE_CHUNK_IK_DEF;
-
-        /* Set the B-tree internal node values, etc */
-        if(H5P_set(c_plist, H5F_CRT_BTREE_RANK_NAME, btree_k) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set rank for btree internal nodes")
-        HDmemcpy(sblock->btree_k, btree_k, sizeof(unsigned) * (size_t)H5B_NUM_BTREE_ID);    /* Keep a local copy also */
-
-        /* Remainder of "variable-sized" portion of superblock */
-        H5F_addr_decode(f, (const uint8_t **)&p, &sblock->base_addr/*out*/);
-        H5F_addr_decode(f, (const uint8_t **)&p, &sblock->ext_addr/*out*/);
-        H5F_addr_decode(f, (const uint8_t **)&p, &stored_eoa/*out*/);
-        H5F_addr_decode(f, (const uint8_t **)&p, &sblock->driver_addr/*out*/);
-
-        /* Allocate space for the root group symbol table entry */
-        HDassert(!sblock->root_ent);
-        if(NULL == (sblock->root_ent = (H5G_entry_t *)H5MM_calloc(sizeof(H5G_entry_t))))
-            HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, NULL, "can't allocate space for root group symbol table entry")
-
-        /* decode the root group symbol table entry */
-        if(H5G_ent_decode(f, (const uint8_t **)&p, sblock->root_ent) < 0)
-            HGOTO_ERROR(H5E_FILE, H5E_CANTDECODE, NULL, "can't decode root group symbol table entry")
-
-        /* Set the root group address to the correct value */
-        sblock->root_addr = sblock->root_ent->header;
-
-        /*
-         * Check if superblock address is different from base address and
-         * adjust base address and "end of address" address if so.
-         */
-        if(!H5F_addr_eq(base_addr, sblock->base_addr)) {
-            /* Check if the superblock moved earlier in the file */
-            if(H5F_addr_lt(base_addr, sblock->base_addr))
-                stored_eoa -= (sblock->base_addr - base_addr);
-            else
-                /* The superblock moved later in the file */
-                stored_eoa += (base_addr - sblock->base_addr);
-
-            /* Adjust base address for offsets of the HDF5 data in the file */
-            sblock->base_addr = base_addr;
-
-            /* Set the base address for the file in the VFD now */
-            if(H5FD_set_base_addr(lf, sblock->base_addr) < 0)
-                HGOTO_ERROR(H5E_FILE, H5E_CANTSET, NULL, "failed to set base address for file driver")
-
-            /* Indicate that the superblock should be marked dirty */
-            *dirtied = TRUE;
-        } /* end if */
-
-        /* This step is for h5repart tool only. If user wants to change file driver
+	    UINT16DECODE(image, chunk_btree_k);
+
+	    /* Reserved bytes are present only in version 1 */
+	    if(super_vers == HDF5_SUPERBLOCK_VERSION_1)
+		image += 2;   /* reserved */
+	} /* end if */
+	else
+	    chunk_btree_k = HDF5_BTREE_CHUNK_IK_DEF;
+	udata->btree_k[H5B_CHUNK_ID] = chunk_btree_k;
+
+	/* Remainder of "variable-sized" portion of superblock */
+	H5F_addr_decode(udata->f, (const uint8_t **)&image, &sblock->base_addr/*out*/);
+	H5F_addr_decode(udata->f, (const uint8_t **)&image, &sblock->ext_addr/*out*/);
+	H5F_addr_decode(udata->f, (const uint8_t **)&image, &udata->stored_eof/*out*/);
+	H5F_addr_decode(udata->f, (const uint8_t **)&image, &sblock->driver_addr/*out*/);
+
+	/* Allocate space for the root group symbol table entry */
+	HDassert(!sblock->root_ent);
+	if(NULL == (sblock->root_ent = (H5G_entry_t *)H5MM_calloc(sizeof(H5G_entry_t))))
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, NULL, "can't allocate space for root group symbol table entry")
+
+	/* decode the root group symbol table entry */
+	if(H5G_ent_decode(udata->f, (const uint8_t **)&image, sblock->root_ent) < 0)
+	    HGOTO_ERROR(H5E_FILE, H5E_CANTDECODE, NULL, "can't decode root group symbol table entry")
+
+	/* Set the root group address to the correct value */
+	sblock->root_addr = sblock->root_ent->header;
+
+	/* This step is for h5repart tool only. If user wants to change file driver
          *  from family to sec2 while using h5repart, set the driver address to
          *  undefined to let the library ignore the family driver information saved
          *  in the superblock.
          */
-        if(H5F_HAS_FEATURE(f, H5FD_FEAT_IGNORE_DRVRINFO)) {
-            /* Eliminate the driver info */
-            sblock->driver_addr = HADDR_UNDEF;
+	if(udata->ignore_drvrinfo && H5F_addr_defined(sblock->driver_addr)) {
+	    /* Eliminate the driver info */
+	    sblock->driver_addr = HADDR_UNDEF;
+            udata->drvrinfo_removed = TRUE;
+	} /* end if */
 
-            /* Indicate that the superblock should be marked dirty */
-            *dirtied = TRUE;
-        } /* end if */
+	/* NOTE: Driver info block is decoded separately, later */
 
-        /* Decode the optional driver information block */
-        if(H5F_addr_defined(sblock->driver_addr)) {
-            uint8_t dbuf[H5F_MAX_DRVINFOBLOCK_SIZE];     /* Buffer for driver info block */
-            char drv_name[9];       /* Name of driver */
-            unsigned drv_vers;      /* Version of driver info block */
-            size_t drv_variable_size; /* Size of variable-length portion of driver info block, in bytes */
-
-            /* Read in fixed-sized portion of driver info block */
-            p = dbuf;
-            if(H5FD_set_eoa(lf, H5FD_MEM_SUPER, sblock->driver_addr + H5F_DRVINFOBLOCK_HDR_SIZE) < 0)
-                HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "set end of space allocation request failed")
-            if(H5FD_read(lf, dxpl, H5FD_MEM_SUPER, sblock->driver_addr, (size_t)H5F_DRVINFOBLOCK_HDR_SIZE, p) < 0)
-                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to read driver information block")
-
-            /* Version number */
-            drv_vers = *p++;
-            if(drv_vers != HDF5_DRIVERINFO_VERSION_0)
-                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "bad driver information block version number")
-
-            p += 3; /* reserved bytes */
-
-            /* Driver info size */
-            UINT32DECODE(p, drv_variable_size);
-
-            /* Sanity check */
-            HDassert(H5F_DRVINFOBLOCK_HDR_SIZE + drv_variable_size <= sizeof(dbuf));
-
-            /* Driver name and/or version */
-            HDstrncpy(drv_name, (const char *)p, (size_t)8);
-            drv_name[8] = '\0';
-            p += 8; /* advance past name/version */
-
-            /* Check if driver matches driver information saved. Unfortunately, we can't push this
-             * function to each specific driver because we're checking if the driver is correct.
-             */
-            if(!HDstrncmp(drv_name, "NCSAfami", (size_t)8) && HDstrcmp(lf->cls->name, "family"))
-                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "family driver should be used")
-            if(!HDstrncmp(drv_name, "NCSAmult", (size_t)8) && HDstrcmp(lf->cls->name, "multi"))
-                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "multi driver should be used")
-
-            /* Read in variable-sized portion of driver info block */
-            if(H5FD_set_eoa(lf, H5FD_MEM_SUPER, sblock->driver_addr + H5F_DRVINFOBLOCK_HDR_SIZE + drv_variable_size) < 0)
-                HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "set end of space allocation request failed")
-            if(H5FD_read(lf, dxpl, H5FD_MEM_SUPER, sblock->driver_addr + H5F_DRVINFOBLOCK_HDR_SIZE, drv_variable_size, p) < 0)
-                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to read file driver information")
-
-            /* Decode driver information */
-            if(H5FD_sb_decode(lf, drv_name, p) < 0)
-                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to decode driver information")
-        } /* end if */
     } /* end if */
     else {
-        uint32_t computed_chksum;       /* Computed checksum  */
-        uint32_t read_chksum;           /* Checksum read from file  */
-
-        /* Size of file addresses */
-        sizeof_addr = *p++;
-        if(sizeof_addr != 2 && sizeof_addr != 4 &&
-                sizeof_addr != 8 && sizeof_addr != 16 && sizeof_addr != 32)
-            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad byte number in an address")
-        if(H5P_set(c_plist, H5F_CRT_ADDR_BYTE_NUM_NAME, &sizeof_addr) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set byte number in an address")
-        shared->sizeof_addr = sizeof_addr;  /* Keep a local copy also */
-
-        /* Size of file sizes */
-        sizeof_size = *p++;
-        if(sizeof_size != 2 && sizeof_size != 4 &&
-                sizeof_size != 8 && sizeof_size != 16 && sizeof_size != 32)
-            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad byte number for object size")
-        if(H5P_set(c_plist, H5F_CRT_OBJ_BYTE_NUM_NAME, &sizeof_size) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set byte number for object size")
-        shared->sizeof_size = sizeof_size;  /* Keep a local copy also */
-
-        /* File status flags (not really used yet) */
-        sblock->status_flags = *p++;
-        if(sblock->status_flags & ~H5F_SUPER_ALL_FLAGS)
-            HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad flag value for superblock")
-
-        /* Base, superblock extension, end of file & root group object header addresses */
-        H5F_addr_decode(f, (const uint8_t **)&p, &sblock->base_addr/*out*/);
-        H5F_addr_decode(f, (const uint8_t **)&p, &sblock->ext_addr/*out*/);
-        H5F_addr_decode(f, (const uint8_t **)&p, &stored_eoa/*out*/);
-        H5F_addr_decode(f, (const uint8_t **)&p, &sblock->root_addr/*out*/);
-
-        /* Compute checksum for superblock */
-        computed_chksum = H5_checksum_metadata(sbuf, (size_t)(p - sbuf), 0);
-
-        /* Decode checksum */
-        UINT32DECODE(p, read_chksum);
-
-        /* Verify correct checksum */
-        if(read_chksum != computed_chksum)
-            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "bad checksum on driver information block")
-
-        /*
-         * Check if superblock address is different from base address and
-         * adjust base address and "end of address" address if so.
-         */
-        if(!H5F_addr_eq(base_addr, sblock->base_addr)) {
-            /* Check if the superblock moved earlier in the file */
-            if(H5F_addr_lt(base_addr, sblock->base_addr))
-                stored_eoa -= (sblock->base_addr - base_addr);
-            else
-                /* The superblock moved later in the file */
-                stored_eoa += (base_addr - sblock->base_addr);
-
-            /* Adjust base address for offsets of the HDF5 data in the file */
-            sblock->base_addr = base_addr;
-
-            /* Set the base address for the file in the VFD now */
-            if(H5FD_set_base_addr(lf, sblock->base_addr) < 0)
-                HGOTO_ERROR(H5E_FILE, H5E_CANTSET, NULL, "failed to set base address for file driver")
-
-            /* Indicate that the superblock should be marked dirty */
-            *dirtied = TRUE;
-        } /* end if */
-
-        /* Get the B-tree internal node values, etc */
-        if(H5P_get(c_plist, H5F_CRT_BTREE_RANK_NAME, sblock->btree_k) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "unable to get rank for btree internal nodes")
-        if(H5P_get(c_plist, H5F_CRT_SYM_LEAF_NAME, &sblock->sym_leaf_k) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "unable to get rank for btree internal nodes")
+	uint32_t read_chksum;           /* Checksum read from file  */
+
+       /* Size of file addresses */
+       sizeof_addr = *image++;
+       if(sizeof_addr != 2 && sizeof_addr != 4 &&
+		sizeof_addr != 8 && sizeof_addr != 16 && sizeof_addr != 32)
+	    HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad byte number in an address")
+	sblock->sizeof_addr = sizeof_addr;
+	udata->f->shared->sizeof_addr = sizeof_addr;  /* Keep a local copy also */
+
+	/* Size of file sizes */
+	sizeof_size = *image++;
+	if(sizeof_size != 2 && sizeof_size != 4 &&
+		sizeof_size != 8 && sizeof_size != 16 && sizeof_size != 32)
+	    HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad byte number for object size")
+	sblock->sizeof_size = sizeof_size;
+	udata->f->shared->sizeof_size = sizeof_size;  /* Keep a local copy also */
+
+	/* File status flags (not really used yet) */
+	sblock->status_flags = *image++;
+	if(sblock->status_flags & ~H5F_SUPER_ALL_FLAGS)
+	    HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad flag value for superblock")
+
+	/* Base, superblock extension, end of file & root group object header addresses */
+	H5F_addr_decode(udata->f, (const uint8_t **)&image, &sblock->base_addr/*out*/);
+	H5F_addr_decode(udata->f, (const uint8_t **)&image, &sblock->ext_addr/*out*/);
+	H5F_addr_decode(udata->f, (const uint8_t **)&image, &udata->stored_eof/*out*/);
+	H5F_addr_decode(udata->f, (const uint8_t **)&image, &sblock->root_addr/*out*/);
+
+	/* checksum verification already done in verify_chksum cb */		
+
+	/* Decode checksum */
+	UINT32DECODE(image, read_chksum);
+
+	/* The Driver Information Block may not appear with the version
+	 * 2 super block.  Thus we set the driver_addr field of the in 
+         * core representation of the super block HADDR_UNDEF to prevent 
+         * any attempt to load the Driver Information Block.
+	 */
+	sblock->driver_addr = HADDR_UNDEF;
     } /* end else */
 
-    /*
-     * The user-defined data is the area of the file before the base
-     * address.
-     */
-    if(H5P_set(c_plist, H5F_CRT_USER_BLOCK_NAME, &sblock->base_addr) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set userblock size")
-
-    /*
-     * Make sure that the data is not truncated. One case where this is
-     * possible is if the first file of a family of files was opened
-     * individually.
-     */
-    if(HADDR_UNDEF == (eof = H5FD_get_eof(lf)))
-        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to determine file size")
-
-    /* (Account for the stored EOA being absolute offset -QAK) */
-    if((eof + sblock->base_addr) < stored_eoa)
-        HGOTO_ERROR(H5E_FILE, H5E_TRUNCATED, NULL, "truncated file: eof = %llu, sblock->base_addr = %llu, stored_eoa = %llu", (unsigned long long)eof, (unsigned long long)sblock->base_addr, (unsigned long long)stored_eoa)
-
-    /*
-     * Tell the file driver how much address space has already been
-     * allocated so that it knows how to allocate additional memory.
-     */
-    /* (Account for the stored EOA being absolute offset -NAF) */
-    if(H5FD_set_eoa(lf, H5FD_MEM_SUPER, stored_eoa - sblock->base_addr) < 0)
-        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to set end-of-address marker for file")
-
-    /* Read the file's superblock extension, if there is one. */
-    if(H5F_addr_defined(sblock->ext_addr)) {
-        H5O_loc_t ext_loc;      /* "Object location" for superblock extension */
-        H5O_btreek_t btreek;    /* v1 B-tree 'K' value message from superblock extension */
-        H5O_drvinfo_t drvinfo;  /* Driver info message from superblock extension */
-        htri_t status;          /* Status for message existing */
-
-        /* Sanity check - superblock extension should only be defined for
-         *      superblock version >= 2.
-         */
-        HDassert(super_vers >= HDF5_SUPERBLOCK_VERSION_2);
-
-        /* Check for superblock extension being located "outside" the stored
-         *      'eoa' value, which can occur with the split/multi VFD.
-         */
-        if(H5F_addr_gt(sblock->ext_addr, stored_eoa)) {
-            /* Set the 'eoa' for the object header memory type large enough
-             *  to give some room for a reasonably sized superblock extension.
-             *  (This is _rather_ a kludge -QAK)
-             */
-            if(H5FD_set_eoa(lf, H5FD_MEM_OHDR, (haddr_t)(sblock->ext_addr + 1024)) < 0)
-                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to set end-of-address marker for file")
-        } /* end if */
-
-        /* Open the superblock extension */
-	if(H5F_super_ext_open(f, sblock->ext_addr, &ext_loc) < 0)
-            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENOBJ, NULL, "unable to open file's superblock extension")
-
-        /* Check for the extension having a 'driver info' message */
-        if((status = H5O_msg_exists(&ext_loc, H5O_DRVINFO_ID, dxpl_id)) < 0)
-            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "unable to read object header")
-        if(status) {
-            /* Check for ignoring the driver info for this file */
-            if(H5F_HAS_FEATURE(f, H5FD_FEAT_IGNORE_DRVRINFO)) {
-                /* Indicate that the superblock should be marked dirty */
-                *dirtied = TRUE;
-            } /* end if */
-            else {
-                /* Retrieve the 'driver info' structure */
-                if(NULL == H5O_msg_read(&ext_loc, H5O_DRVINFO_ID, &drvinfo, dxpl_id))
-                    HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "driver info message not present")
-
-                /* Check if driver matches driver information saved. Unfortunately, we can't push this
-                 * function to each specific driver because we're checking if the driver is correct.
-                 */
-                if(!HDstrncmp(drvinfo.name, "NCSAfami", (size_t)8) && HDstrcmp(lf->cls->name, "family"))
-                    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "family driver should be used")
-                if(!HDstrncmp(drvinfo.name, "NCSAmult", (size_t)8) && HDstrcmp(lf->cls->name, "multi"))
-                    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "multi driver should be used")
-
-                /* Decode driver information */
-                if(H5FD_sb_decode(lf, drvinfo.name, drvinfo.buf) < 0)
-                    HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to decode driver information")
-
-                /* Reset driver info message */
-                H5O_msg_reset(H5O_DRVINFO_ID, &drvinfo);
-            } /* end else */
-        } /* end if */
-
-        /* Read in the shared OH message information if there is any */
-        if(H5SM_get_info(&ext_loc, c_plist, dxpl_id) < 0)
-            HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, NULL, "unable to read SOHM table information")
-
-        /* Check for the extension having a 'v1 B-tree "K"' message */
-        if((status = H5O_msg_exists(&ext_loc, H5O_BTREEK_ID, dxpl_id)) < 0)
-            HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "unable to read object header")
-        if(status) {
-            /* Retrieve the 'v1 B-tree "K"' structure */
-            if(NULL == H5O_msg_read(&ext_loc, H5O_BTREEK_ID, &btreek, dxpl_id))
-                HGOTO_ERROR(H5E_FILE, H5E_CANTGET, NULL, "v1 B-tree 'K' info message not present")
-
-            /* Set non-default v1 B-tree 'K' value info from file */
-            sblock->btree_k[H5B_CHUNK_ID] = btreek.btree_k[H5B_CHUNK_ID];
-            sblock->btree_k[H5B_SNODE_ID] = btreek.btree_k[H5B_SNODE_ID];
-            sblock->sym_leaf_k = btreek.sym_leaf_k;
-
-            /* Set non-default v1 B-tree 'K' values in the property list */
-            if(H5P_set(c_plist, H5F_CRT_BTREE_RANK_NAME, btreek.btree_k) < 0)
-                HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set rank for btree internal nodes")
-            if(H5P_set(c_plist, H5F_CRT_SYM_LEAF_NAME, &btreek.sym_leaf_k) < 0)
-                HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, NULL, "unable to set rank for symbol table leaf nodes")
-        } /* end if */
-
-        /* Close superblock extension */
-        if(H5F_super_ext_close(f, &ext_loc, dxpl_id, FALSE) < 0)
-	    HGOTO_ERROR(H5E_FILE, H5E_CANTRELEASE, NULL, "unable to close file's superblock extension")
-    } /* end if */
+    /* Sanity check */
+    HDassert((size_t)(image - (const uint8_t *)_image) <= len);
 
     /* Set return value */
     ret_value = sblock;
 
 done:
-    /* Release the [possibly partially initialized] superblock on errors */
+    /* Release the [possibly partially initialized] superblock on error */
     if(!ret_value && sblock)
-        if(H5F_super_free(sblock) < 0)
+        if(H5F__super_free(sblock) < 0)
             HDONE_ERROR(H5E_FILE, H5E_CANTFREE, NULL, "unable to destroy superblock data")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5F_sblock_load() */
+} /* end H5F__cache_superblock_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5F_sblock_flush
+ * Function:    H5F__cache_superblock_image_len
  *
- * Purpose:     Flushes the superblock.
+ * Purpose:     Compute the size of the data structure on disk.
  *
- * Return:      Success:        SUCCEED
- *              Failure:        NULL
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  Mike McGreevy
- *              mamcgree at hdfgroup.org
- *              April 8, 2009
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 19, 2013
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5F_sblock_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t H5_ATTR_UNUSED addr,
-    H5F_super_t *sblock)
+H5F__cache_superblock_image_len(const void *_thing, size_t *image_len, hbool_t *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    herr_t          ret_value = SUCCEED;
+    const H5F_super_t *sblock = (const H5F_super_t *)_thing;    /* Pointer to the object */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR
 
-    /* check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_eq(addr, 0));
+    /* Check arguments */
     HDassert(sblock);
+    HDassert(sblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(sblock->cache_info.type == H5AC_SUPERBLOCK);
+    HDassert(image_len);
+    HDassert(compressed_ptr);
 
-    if(sblock->cache_info.is_dirty) {
-        H5P_genplist_t *dxpl;               /* DXPL object */
-        uint8_t         buf[H5F_MAX_SUPERBLOCK_SIZE + H5F_MAX_DRVINFOBLOCK_SIZE];  /* Superblock & driver info blockencoding buffer */
-        uint8_t        *p;                  /* Ptr into encoding buffer */
-        haddr_t         rel_eoa;            /* Relative EOA for file */
-        size_t          superblock_size;    /* Size of superblock, in bytes */
-        size_t          driver_size;        /* Size of driver info block (bytes)*/
-
-        /* Encode the common portion of the file superblock for all versions */
-        p = buf;
-        HDmemcpy(p, H5F_SIGNATURE, (size_t)H5F_SIGNATURE_LEN);
-        p += H5F_SIGNATURE_LEN;
-        *p++ = (uint8_t)sblock->super_vers;
-
-        /* Check for older version of superblock format */
-        if(sblock->super_vers < HDF5_SUPERBLOCK_VERSION_2) {
-            *p++ = (uint8_t)HDF5_FREESPACE_VERSION;     /* (hard-wired) */
-            *p++ = (uint8_t)HDF5_OBJECTDIR_VERSION;     /* (hard-wired) */
-            *p++ = 0;   /* reserved*/
-
-            *p++ = (uint8_t)HDF5_SHAREDHEADER_VERSION;  /* (hard-wired) */
-            *p++ = (uint8_t)H5F_SIZEOF_ADDR(f);
-            *p++ = (uint8_t)H5F_SIZEOF_SIZE(f);
-            *p++ = 0;   /* reserved */
-
-            UINT16ENCODE(p, sblock->sym_leaf_k);
-            UINT16ENCODE(p, sblock->btree_k[H5B_SNODE_ID]);
-            UINT32ENCODE(p, (uint32_t)sblock->status_flags);
-
-            /*
-             * Versions of the superblock >0 have the indexed storage B-tree
-             * internal 'K' value stored
-             */
-            if(sblock->super_vers > HDF5_SUPERBLOCK_VERSION_DEF) {
-                UINT16ENCODE(p, sblock->btree_k[H5B_CHUNK_ID]);
-                *p++ = 0;   /*reserved */
-                *p++ = 0;   /*reserved */
-            } /* end if */
-
-            H5F_addr_encode(f, &p, sblock->base_addr);
-            H5F_addr_encode(f, &p, sblock->ext_addr);
-            rel_eoa = H5FD_get_eoa(f->shared->lf, H5FD_MEM_SUPER);
-            H5F_addr_encode(f, &p, (rel_eoa + sblock->base_addr));
-            H5F_addr_encode(f, &p, sblock->driver_addr);
-
-            /* Encode the root group object entry, including the cached stab info */
-            if(H5G_ent_encode(f, &p, sblock->root_ent) < 0)
-                HGOTO_ERROR(H5E_FILE, H5E_CANTENCODE, FAIL, "can't encode root group symbol table entry")
-
-            /* Encode the driver information block. */
-            H5_CHECKED_ASSIGN(driver_size, size_t, H5FD_sb_size(f->shared->lf), hsize_t);
-
-            /* Checking whether driver block address is defined here is to handle backward
-             * compatibility.  If the file was created with v1.6 library or earlier and no
-             * driver info block was written in the superblock, we don't write it either even
-             * though there's some driver info.  Otherwise, the driver block extended will
-             * overwrite the (meta)data right after the superblock. This situation happens to
-             * the family driver particularly.  SLU - 2009/3/24
-             */
-            if(driver_size > 0 && H5F_addr_defined(sblock->driver_addr)) {
-                char driver_name[9];    /* Name of driver, for driver info block */
-                uint8_t *dbuf = p;      /* Pointer to beginning of driver info */
-
-                /* Encode the driver information block */
-                *p++ = HDF5_DRIVERINFO_VERSION_0; /* Version */
-                *p++ = 0; /* reserved */
-                *p++ = 0; /* reserved */
-                *p++ = 0; /* reserved */
-
-                /* Driver info size, excluding header */
-                UINT32ENCODE(p, driver_size);
-
-                /* Encode driver-specific data */
-                if(H5FD_sb_encode(f->shared->lf, driver_name, dbuf + H5F_DRVINFOBLOCK_HDR_SIZE) < 0)
-                    HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to encode driver information")
-
-                /* Store driver name (set in 'H5FD_sb_encode' call above) */
-                HDmemcpy(p, driver_name, (size_t)8);
-
-                /* Advance buffer pointer past name & variable-sized portion of driver info */
-                /* (for later use in computing the superblock size) */
-                p += 8 + driver_size;
-            } /* end if */
-        } /* end if */
-        else {
-            uint32_t        chksum;                 /* Checksum temporary variable      */
-            H5O_loc_t       *root_oloc;             /* Pointer to root group's object location */
-
-            /* Size of file addresses & offsets, and status flags */
-            *p++ = (uint8_t)H5F_SIZEOF_ADDR(f);
-            *p++ = (uint8_t)H5F_SIZEOF_SIZE(f);
-            *p++ = sblock->status_flags;
-
-            /* Base, superblock extension & end of file addresses */
-            H5F_addr_encode(f, &p, sblock->base_addr);
-            H5F_addr_encode(f, &p, sblock->ext_addr);
-            rel_eoa = H5FD_get_eoa(f->shared->lf, H5FD_MEM_SUPER);
-            H5F_addr_encode(f, &p, (rel_eoa + sblock->base_addr));
-
-            /* Retrieve information for root group */
-            if(NULL == (root_oloc = H5G_oloc(f->shared->root_grp)))
-                HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to retrieve root group information")
-
-            /* Encode address of root group's object header */
-            H5F_addr_encode(f, &p, root_oloc->addr);
+    /* Set the image length size */
+    *image_len = (size_t)H5F_SUPERBLOCK_SIZE(sblock);
 
-            /* Compute superblock checksum */
-            chksum = H5_checksum_metadata(buf, ((size_t)H5F_SUPERBLOCK_SIZE(sblock->super_vers, f) - H5F_SIZEOF_CHKSUM), 0);
+    /* Set *compressed_ptr to FALSE unconditionally */
+    *compressed_ptr = FALSE;
 
-            /* Superblock checksum */
-            UINT32ENCODE(p, chksum);
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5F__cache_superblock_image_len() */
 
-            /* Sanity check */
-            HDassert((size_t)(p - buf) == (size_t)H5F_SUPERBLOCK_SIZE(sblock->super_vers, f));
-        } /* end else */
+

+/*-------------------------------------------------------------------------
+ * Function:    H5FS__cache_hdf_pre_serialize
+ *
+ * Purpose:	The current use of this function is a cludge to repair an 
+ *		oversight in the conversion of the superblock code to use the 
+ *		version 3 cache.  
+ *
+ *		In the V2 metadata cache callbacks, the superblock dirver info 
+ *     		message was updated in the flush routine.  Note that this 
+ *		operation only applies to version 2 or later superblocks.
+ *
+ *     		Somehow, this functionality was lost in the conversion to use 
+ *     		the V3 cache, causing failures with the multi file driver 
+ *     		(and possibly the family file driver as well).
+ *
+ *     		Performing this operation is impossible in the current 
+ *		serialize routine, as the dxpl_id is not available.  While 
+ *		I am pretty sure that this is not the correct place for this 
+ *		functionality, as I can see it causing problems with both 
+ *		journaling and possibly parallel HDF5 as well, I am placing 
+ *		code for the necessary update in the pre_serialize call for 
+ *		now for testing purposes.  We will almost certainly want to 
+ *		change this.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              10/82/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F__cache_superblock_pre_serialize(const H5F_t *f, hid_t dxpl_id, 
+    void *_thing, haddr_t H5_ATTR_UNUSED addr, size_t H5_ATTR_UNUSED len, 
+    size_t H5_ATTR_UNUSED compressed_len, haddr_t H5_ATTR_UNUSED *new_addr, 
+    size_t H5_ATTR_UNUSED *new_len, size_t H5_ATTR_UNUSED *new_compressed_len, 
+    unsigned H5_ATTR_UNUSED *flags)
+{
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
+    H5F_super_t *sblock = (H5F_super_t *)_thing; /* Pointer to the super block */
+    herr_t ret_value = SUCCEED; /* Return value */
 
-        /* Retrieve the total size of the superblock info */
-        H5_CHECKED_ASSIGN(superblock_size, size_t, (p - buf), ptrdiff_t);
+    FUNC_ENTER_NOAPI_NOINIT
 
-        /* Double check we didn't overrun the block (unlikely) */
-        HDassert(superblock_size <= sizeof(buf));
+    /* Sanity check */
+    HDassert(f);
+    HDassert(sblock);
+    HDassert(sblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(sblock->cache_info.type == H5AC_SUPERBLOCK);
+    HDassert(flags);
+
+    if(sblock->super_vers >= HDF5_SUPERBLOCK_VERSION_2) {
+        /* WARNING: This code almost certainly doesn't belong here.  Must
+         *          discuss with Quincey where to put it.  Note issues
+         *          for journaling and possibly parallel.
+         *
+         *                                            -- JRM
+         */
+        /* Update the driver information message in the superblock extension
+         * if appropriate.
+         */
+        if(H5F_addr_defined(sblock->ext_addr)) {
+            size_t     driver_size;    /* Size of driver info block (bytes)*/
+            H5O_loc_t  ext_loc;        /* "Object location" for superblock extension */
 
-        /* Get the DXPL plist object for DXPL ID */
-        if(NULL == (dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
-            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+            HDassert(sblock->super_vers >= HDF5_SUPERBLOCK_VERSION_2);
 
-        /* Write superblock */
-        /* (always at relative address 0) */
-        if(H5FD_write(f->shared->lf, dxpl, H5FD_MEM_SUPER, (haddr_t)0, superblock_size, buf) < 0)
-            HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "unable to write superblock")
+            /* Open the superblock extension's object header */
+            if(H5F_super_ext_open((H5F_t *)f, sblock->ext_addr, &ext_loc) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTOPENOBJ, FAIL, "unable to open file's superblock extension")
 
-        /* Check for newer version of superblock format & superblock extension */
-        if(sblock->super_vers >= HDF5_SUPERBLOCK_VERSION_2 && H5F_addr_defined(sblock->ext_addr)) {
             /* Check for ignoring the driver info for this file */
             if(!H5F_HAS_FEATURE(f, H5FD_FEAT_IGNORE_DRVRINFO)) {
                 /* Check for driver info message */
                 H5_CHECKED_ASSIGN(driver_size, size_t, H5FD_sb_size(f->shared->lf), hsize_t);
                 if(driver_size > 0) {
                     H5O_drvinfo_t drvinfo;      /* Driver info */
-                    H5O_loc_t 	ext_loc; 	/* "Object location" for superblock extension */
                     uint8_t dbuf[H5F_MAX_DRVINFOBLOCK_SIZE];  /* Driver info block encoding buffer */
 
                     /* Sanity check */
@@ -760,128 +666,499 @@ H5F_sblock_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t H5_ATTR_UNUSE
                     if(H5FD_sb_encode(f->shared->lf, drvinfo.name, dbuf) < 0)
                         HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to encode driver information")
 
-                    /* Open the superblock extension's object header */
-                    if(H5F_super_ext_open(f, sblock->ext_addr, &ext_loc) < 0)
-                        HGOTO_ERROR(H5E_FILE, H5E_CANTOPENOBJ, FAIL, "unable to open file's superblock extension")
+                    /* Set the ring type in the DXPL */
+                    if(H5AC_set_ring(dxpl_id, H5AC_RING_SBE, &dxpl, &orig_ring) < 0)
+                        HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set ring value")
 
                     /* Write driver info information to the superblock extension */
                     drvinfo.len = driver_size;
                     drvinfo.buf = dbuf;
                     if(H5O_msg_write(&ext_loc, H5O_DRVINFO_ID, H5O_MSG_FLAG_DONTSHARE, H5O_UPDATE_TIME, &drvinfo, dxpl_id) < 0)
                         HGOTO_ERROR(H5E_FILE, H5E_WRITEERROR, FAIL, "unable to update driver info header message")
-
-                    /* Close the superblock extension object header */
-                    if(H5F_super_ext_close(f, &ext_loc, dxpl_id, FALSE) < 0)
-                        HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "unable to close file's superblock extension")
                 } /* end if */
             } /* end if */
+
+            /* Close the superblock extension object header */
+            if(H5F_super_ext_close((H5F_t *)f, &ext_loc, dxpl_id, FALSE) < 0)
+                HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEOBJ, FAIL, "unable to close file's superblock extension")
+        } /* end if */
+    } /* end if */
+
+done:
+    /* Reset the ring in the DXPL */
+    if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+        HDONE_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "unable to set property value")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5FS_cache_superblock_pre_serialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F__cache_superblock_serialize
+ *
+ * Purpose:	Flushes a dirty object to disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		July 19 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F__cache_superblock_serialize(const H5F_t *f, void *_image, size_t H5_ATTR_UNUSED len,
+    void *_thing)
+{
+    H5F_super_t *sblock = (H5F_super_t *)_thing;      /* Pointer to the object */
+    uint8_t *image = (uint8_t *)_image;         /* Pointer into raw data buffer */
+    haddr_t rel_eof;            /* Relative EOF for file */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(f);
+    HDassert(image);
+    HDassert(sblock);
+
+    /* Assert that the superblock is marked as being flushed last (and 
+       collectively in parallel) */
+    /* (We'll rely on the cache to make sure it actually *is* flushed
+       last (and collectively in parallel), but this check doesn't hurt) */
+    HDassert(sblock->cache_info.flush_me_last);    
+#ifdef H5_HAVE_PARALLEL
+    HDassert(sblock->cache_info.flush_me_collectively);
+#endif
+
+    /* Encode the common portion of the file superblock for all versions */
+    HDmemcpy(image, H5F_SIGNATURE, (size_t)H5F_SIGNATURE_LEN);
+    image += H5F_SIGNATURE_LEN;
+    *image++ = (uint8_t)sblock->super_vers;
+
+    /* Check for older version of superblock format */
+    if(sblock->super_vers < HDF5_SUPERBLOCK_VERSION_2) {
+        *image++ = (uint8_t)HDF5_FREESPACE_VERSION;     /* (hard-wired) */
+        *image++ = (uint8_t)HDF5_OBJECTDIR_VERSION;     /* (hard-wired) */
+        *image++ = 0;   /* reserved*/
+
+        *image++ = (uint8_t)HDF5_SHAREDHEADER_VERSION;  /* (hard-wired) */
+        *image++ = sblock->sizeof_addr;
+        *image++ = sblock->sizeof_size;
+        *image++ = 0;   /* reserved */
+
+        UINT16ENCODE(image, sblock->sym_leaf_k);
+        UINT16ENCODE(image, sblock->btree_k[H5B_SNODE_ID]);
+        UINT32ENCODE(image, (uint32_t)sblock->status_flags);
+
+        /*
+         * Versions of the superblock >0 have the indexed storage B-tree
+         * internal 'K' value stored
+         */
+        if(sblock->super_vers > HDF5_SUPERBLOCK_VERSION_DEF) {
+            UINT16ENCODE(image, sblock->btree_k[H5B_CHUNK_ID]);
+            *image++ = 0;   /*reserved */
+            *image++ = 0;   /*reserved */
         } /* end if */
 
-        /* Reset the dirty flag.  */
-        sblock->cache_info.is_dirty = FALSE;
+        /* Encode the base address */
+        H5F_addr_encode(f, &image, sblock->base_addr);
+
+        /* Encode the address of global free-space index */
+        H5F_addr_encode(f, &image, sblock->ext_addr);
+
+        /* Encode the end-of-file address. Note that at this point in time,
+         * the EOF value itself may not be reflective of the file's size, as
+         * we will eventually truncate the file to match the EOA value. As
+         * such, use the EOA value in its place, knowing that the current EOF
+         * value will ultimately match it. */
+        if ((rel_eof = H5FD_get_eoa(f->shared->lf, H5FD_MEM_SUPER)) == HADDR_UNDEF)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "driver get_eoa request failed")
+        H5F_addr_encode(f, &image, (rel_eof + sblock->base_addr));
+
+        /* Encode the driver informaton block address */
+        H5F_addr_encode(f, &image, sblock->driver_addr);
+
+        /* Encode the root group object entry, including the cached stab info */
+        if(H5G_ent_encode(f, &image, sblock->root_ent) < 0)
+            HGOTO_ERROR(H5E_FILE, H5E_CANTENCODE, FAIL, "can't encode root group symbol table entry")
+
+        /* NOTE: Driver info block is handled separately */
+
     } /* end if */
+    else { /* sblock->super_vers >= HDF5_SUPERBLOCK_VERSION_2 */
+        uint32_t        chksum;                 /* Checksum temporary variable      */
+        H5O_loc_t       *root_oloc;             /* Pointer to root group's object location */
+
+        /* Size of file addresses & offsets, and status flags */
+        *image++ = sblock->sizeof_addr;
+        *image++ = sblock->sizeof_size;
+        *image++ = sblock->status_flags;
+
+        /* Encode the base address */
+        H5F_addr_encode(f, &image, sblock->base_addr);
+
+        /* Encode the address of the superblock extension */
+        H5F_addr_encode(f, &image, sblock->ext_addr);
+
+        /* At this point in time, the EOF value itself may
+         * not be reflective of the file's size, since we'll eventually
+         * truncate it to match the EOA value. As such, use the EOA value
+         * in its place, knowing that the current EOF value will
+         * ultimately match it. */
+        if ((rel_eof = H5FD_get_eoa(f->shared->lf, H5FD_MEM_SUPER)) == HADDR_UNDEF)
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "driver get_eoa request failed")
+        H5F_addr_encode(f, &image, (rel_eof + sblock->base_addr));
+
+        /* Retrieve information for root group */
+        if(NULL == (root_oloc = H5G_oloc(f->shared->root_grp)))
+            HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to retrieve root group information")
+
+        /* Encode address of root group's object header */
+        H5F_addr_encode(f, &image, root_oloc->addr);
+
+        /* Compute superblock checksum */
+        chksum = H5_checksum_metadata(_image, ((size_t)H5F_SUPERBLOCK_SIZE(sblock) - H5F_SIZEOF_CHKSUM), 0);
 
-    if(destroy)
-        if(H5F_sblock_dest(f, sblock) < 0)
-            HGOTO_ERROR(H5E_FSPACE, H5E_CLOSEERROR, FAIL, "can't close superblock")
+        /* Superblock checksum */
+        UINT32ENCODE(image, chksum);
+
+        /* Sanity check */
+        HDassert((size_t)(image - (uint8_t *)_image) == (size_t)H5F_SUPERBLOCK_SIZE(sblock));
+    } /* end else */
+
+    /* Sanity check */
+    HDassert((size_t)(image - (uint8_t *)_image) == len);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5F_sblock_flush() */
+} /* H5F__cache_superblock_serialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5F_sblock_dest
+ * Function:	H5F__cache_superblock_free_icr
  *
- * Purpose:     Frees memory used by the superblock.
+ * Purpose:	Destroy/release an "in core representation" of a data
+ *              structure
  *
- * Return:      Non-negative on success/Negative on failure
+ * Note:	The metadata cache sets the object's cache_info.magic to
+ *		H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC before calling a free_icr
+ *		callback (checked in assert).
+ *
+ * Return:	Non-negative on success/Negative on failure
  *
- * Programmer:  Mike McGreevy
- *              April 8, 2009
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 20, 2013
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5F_sblock_dest(H5F_t H5_ATTR_UNUSED *f, H5F_super_t* sblock)
+H5F__cache_superblock_free_icr(void *_thing)
 {
+    H5F_super_t *sblock = (H5F_super_t *)_thing;        /* Pointer to the object */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Sanity check */
     HDassert(sblock);
+    HDassert(sblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC);
+    HDassert(sblock->cache_info.type == H5AC_SUPERBLOCK);
 
-    /* Free superblock */
-    if(H5F_super_free(sblock) < 0)
-        HGOTO_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "unable to destroy superblock")
+    /* Destroy superblock */
+    if(H5F__super_free(sblock) < 0)
+        HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free superblock")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5F_sblock_dest() */
+} /* H5F__cache_superblock_free_icr() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5F_sblock_clear
+ * Function:    H5F__cache_drvrinfo_get_load_size
  *
- * Purpose:     Mark the superblock as no longer being dirty.
+ * Purpose:     Compute the size of the data structure on disk.
  *
  * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  Mike McGreevy
- *              April 8, 2009
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 20, 2013
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5F_sblock_clear(H5F_t *f, H5F_super_t *sblock, hbool_t destroy)
+H5F__cache_drvrinfo_get_load_size(const void *_image, void *_udata, size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    herr_t ret_value = SUCCEED;         /* Return value */
+    const uint8_t *image = (const uint8_t *)_image;   			/* Pointer into raw data buffer */
+    H5F_drvrinfo_cache_ud_t *udata = (H5F_drvrinfo_cache_ud_t *)_udata;	/* User data */
+    unsigned drv_vers;          /* Version of driver info block */
+    size_t drvinfo_len;         /* Length of encoded buffer */
+    htri_t ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /*
-     * Check arguments.
-     */
-    HDassert(sblock);
+    /* Check arguments */
+    HDassert(image_len);
+
+    if(image == NULL) {
+	HDassert(actual_len == NULL);
+
+	/* Set the initial image length size */
+	*image_len = H5F_DRVINFOBLOCK_HDR_SIZE;     /* Fixed size portion of driver info block */
+
+    } else { /* compute actual_len */
+
+	HDassert(udata);
+	HDassert(udata->f);
+	HDassert(actual_len);
+	HDassert(*actual_len == *image_len);
+
+	/* Version number */
+	drv_vers = *image++;
+	if(drv_vers != HDF5_DRIVERINFO_VERSION_0)
+	    HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "bad driver information block version number")
+
+	image += 3; /* reserved bytes */
 
-    /* Reset the dirty flag.  */
-    sblock->cache_info.is_dirty = FALSE;
+	/* Driver info size */
+	UINT32DECODE(image, drvinfo_len);
 
-    if(destroy)
-        if(H5F_sblock_dest(f, sblock) < 0)
-            HGOTO_ERROR(H5E_FILE, H5E_CANTFREE, FAIL, "unable to delete superblock")
+	/* Handle metadata cache retry for variable-sized portion of the driver info block */
+	if(*image_len != (H5F_DRVINFOBLOCK_HDR_SIZE + drvinfo_len)) {
+	    /* Sanity check */
+	    HDassert(*image_len == H5F_DRVINFOBLOCK_HDR_SIZE);
+
+	    /* extend the eoa if required so that we can read the complete driver info block */
+	    {
+		haddr_t eoa;
+		haddr_t min_eoa;
+
+		/* get current eoa... */
+		if ((eoa = H5FD_get_eoa(udata->f->shared->lf, H5FD_MEM_SUPER)) == HADDR_UNDEF)
+		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "driver get_eoa request failed")
+
+		/* ... if it is too small, extend it. */
+		min_eoa = udata->driver_addr + H5F_DRVINFOBLOCK_HDR_SIZE + drvinfo_len;
+
+		if ( H5F_addr_gt(min_eoa, eoa) )
+		    if(H5FD_set_eoa(udata->f->shared->lf, H5FD_MEM_SUPER, min_eoa) < 0)
+			HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, \
+			    "set end of space allocation request failed")
+	    }        
+	    *actual_len = H5F_DRVINFOBLOCK_HDR_SIZE + drvinfo_len;
+	}
+    } /* compute actual_len */
 
 done:
+
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5F_sblock_clear() */
+} /* end H5F__cache_drvrinfo_get_load_size() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5F_sblock_size
+ * Function:	H5F__cache_drvrinfo_deserialize
+ *
+ * Purpose:	Loads an object from the disk.
  *
- * Purpose:     Returns the size of the superblock encoded on disk.
+ * Return:	Success:	Pointer to a new B-tree.
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		July 20 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5F__cache_drvrinfo_deserialize(const void *_image, size_t len, void *_udata,
+    hbool_t H5_ATTR_UNUSED *dirty)
+{
+    H5O_drvinfo_t       *drvinfo = NULL; /* Driver info */
+    H5F_drvrinfo_cache_ud_t *udata = (H5F_drvrinfo_cache_ud_t *)_udata;     /* User data */
+    const uint8_t	*image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    char                drv_name[9];    /* Name of driver */
+    unsigned            drv_vers;       /* Version of driver info block */
+    H5O_drvinfo_t       *ret_value = NULL;      /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(image);
+    HDassert(len >= H5F_DRVINFOBLOCK_HDR_SIZE);
+    HDassert(udata);
+    HDassert(udata->f);
+
+    /* Allocate space for the driver info */
+    if(NULL == (drvinfo = (H5O_drvinfo_t *)H5MM_calloc(sizeof(H5O_drvinfo_t))))
+	HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, NULL, "memory allocation failed for driver info message")
+
+    /* Version number */
+    drv_vers = *image++;
+    if(drv_vers != HDF5_DRIVERINFO_VERSION_0)
+        HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, NULL, "bad driver information block version number")
+
+    image += 3; /* reserved bytes */
+
+    /* Driver info size */
+    UINT32DECODE(image, drvinfo->len);
+
+    /* Driver name and/or version */
+    HDstrncpy(drv_name, (const char *)image, (size_t)8);
+    drv_name[8] = '\0';
+    image += 8; /* advance past name/version */
+
+    HDassert(len == (H5F_DRVINFOBLOCK_HDR_SIZE + drvinfo->len));
+
+    /* Validate and decode driver information */
+    if(H5FD_sb_load(udata->f->shared->lf, drv_name, image) < 0)
+	HGOTO_ERROR(H5E_FILE, H5E_CANTDECODE, NULL, "unable to decode driver information")
+
+    /* Sanity check */
+    HDassert((size_t)(image - (const uint8_t *)_image) <= len);
+
+    /* Set return value */
+    ret_value = drvinfo;
+
+done:
+    /* Release the [possibly partially initialized] driver info message on error */
+    if(!ret_value && drvinfo)
+        H5MM_xfree(drvinfo);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5F__cache_drvrinfo_deserialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5F__cache_drvrinfo_image_len
+ *
+ * Purpose:     Compute the size of the data structure on disk.
  *
  * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:  Mike McGreevy
- *              April 8, 2009
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 20, 2013
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5F_sblock_size(const H5F_t *f, const H5F_super_t *sblock, size_t *size_ptr)
+H5F__cache_drvrinfo_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    const H5O_drvinfo_t *drvinfo = (const H5O_drvinfo_t *)_thing;       /* Pointer to the object */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(drvinfo);
+    HDassert(drvinfo->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(drvinfo->cache_info.type == H5AC_DRVRINFO);
+    HDassert(image_len);
+    HDassert(compressed_ptr);
+
+    /* Set the image length size */
+    *image_len = (size_t)(H5F_DRVINFOBLOCK_HDR_SIZE +   /* Fixed-size portion of driver info block */
+        drvinfo->len);                                  /* Variable-size portion of driver info block */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5F__cache_drvrinfo_image_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F__cache_drvrinfo_serialize
+ *
+ * Purpose:	Flushes a dirty object to disk.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		July 20 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F__cache_drvrinfo_serialize(const H5F_t *f, void *_image, size_t len,
+    void *_thing)
+{
+    H5O_drvinfo_t *drvinfo = (H5O_drvinfo_t *)_thing;   /* Pointer to the object */
+    uint8_t *image = (uint8_t *)_image;         /* Pointer into raw data buffer */
+    uint8_t *dbuf;              /* Pointer to beginning of driver info */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_STATIC
 
     /* check arguments */
     HDassert(f);
-    HDassert(sblock);
-    HDassert(size_ptr);
+    HDassert(image);
+    HDassert(drvinfo);
+    HDassert(drvinfo->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(drvinfo->cache_info.type == H5AC_DRVRINFO);
+    HDassert(len == (size_t)(H5F_DRVINFOBLOCK_HDR_SIZE + drvinfo->len));
+
+    /* Save pointer to beginning of driver info */
+    dbuf = image;
+
+    /* Encode the driver information block */
+    *image++ = HDF5_DRIVERINFO_VERSION_0; /* Version */
+    *image++ = 0; /* reserved */
+    *image++ = 0; /* reserved */
+    *image++ = 0; /* reserved */
+
+    /* Driver info size, excluding header */
+    UINT32ENCODE(image, drvinfo->len);
+
+    /* Encode driver-specific data */
+    if(H5FD_sb_encode(f->shared->lf, (char *)image, dbuf + H5F_DRVINFOBLOCK_HDR_SIZE) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "unable to encode driver information")
+
+    /* Advance buffer pointer past name & variable-sized portion of driver info */
+    image += 8 + drvinfo->len;
+
+    /* Sanity check */
+    HDassert((size_t)(image - (uint8_t *)_image) == len);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5F__cache_drvrinfo_serialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5F__cache_drvrinfo_free_icr
+ *
+ * Purpose:	Destroy/release an "in core representation" of a data
+ *              structure
+ *
+ * Note:	The metadata cache sets the object's cache_info.magic to
+ *		H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC before calling a free_icr
+ *		callback (checked in assert).
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              July 20, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5F__cache_drvrinfo_free_icr(void *_thing)
+{
+    H5O_drvinfo_t *drvinfo = (H5O_drvinfo_t *)_thing;    /* Pointer to the object */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(drvinfo);
+    HDassert(drvinfo->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC);
+    HDassert(drvinfo->cache_info.type == H5AC_DRVRINFO);
 
-    /* Set size value */
-    *size_ptr = (size_t)H5F_SUPERBLOCK_SIZE(sblock->super_vers, f);
+    /* Destroy driver info message */
+    H5MM_xfree(drvinfo);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5F_sblock_size() */
+} /* H5F__cache_drvrinfo_free_icr() */
 
diff --git a/src/H5Ftest.c b/src/H5Ftest.c
index 73b00a6..b741e0d 100644
--- a/src/H5Ftest.c
+++ b/src/H5Ftest.c
@@ -28,12 +28,12 @@
 /* Module Setup */
 /****************/
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg  */
+#include "H5Fmodule.h"          /* This source code file is part of the H5F module */
 #define H5F_TESTING		/*suppress warning about H5F testing funcs*/
-#define H5SM_PACKAGE		/*suppress error about including H5SMpkg  */
-#define H5SM_TESTING		/*suppress warning about H5SM testing funcs*/
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg  */
+#define H5G_FRIEND		/*suppress error about including H5Gpkg  */
 #define H5G_TESTING		/*suppress warning about H5G testing funcs*/
+#define H5SM_FRIEND		/*suppress error about including H5SMpkg  */
+#define H5SM_TESTING		/*suppress warning about H5SM testing funcs*/
 
 
 /***********/
diff --git a/src/H5G.c b/src/H5G.c
index ac71c5c..21957d8 100644
--- a/src/H5G.c
+++ b/src/H5G.c
@@ -79,10 +79,7 @@
 /* Module Setup */
 /****************/
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg   */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5G_init_interface
+#include "H5Gmodule.h"          /* This source code file is part of the H5G module */
 
 
 /***********/
@@ -120,6 +117,9 @@
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 
 /*****************************/
 /* Library Private Variables */
@@ -133,41 +133,18 @@
 /* Group ID class */
 static const H5I_class_t H5I_GROUP_CLS[1] = {{
     H5I_GROUP,			/* ID class value */
-    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* Class flags */
     0,				/* # of reserved IDs for class */
     (H5I_free_t)H5G_close	/* Callback routine for closing objects of this class */
 }};
 
+/* Flag indicating "top" of interface has been initialized */
+static hbool_t H5G_top_package_initialize_s = FALSE;
 
-

-/*-------------------------------------------------------------------------
- * Function:	H5G__init
- *
- * Purpose:	Initialize the interface from some other package.
- *
- * Return:	Success:	non-negative
- *		Failure:	negative
- *
- * Programmer:	Quincey Koziol
- *              Saturday, November 11, 2006
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5G__init(void)
-{
-    herr_t ret_value = SUCCEED;   /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-    /* FUNC_ENTER() does all the work */
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5G__init() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5G_init_interface
+ * Function:	H5G__init_package
  *
  * Purpose:	Initializes the H5G interface.
  *
@@ -177,7 +154,7 @@ done:
  *		Monday, January	 5, 1998
  *
  * Notes:       The group creation properties are registered in the property
- *              list interface initialization routine (H5P_init_interface)
+ *              list interface initialization routine (H5P_init_package)
  *              so that the file creation property class can inherit from it
  *              correctly. (Which allows the file creation property list to
  *              control the group creation properties of the root group of
@@ -185,64 +162,100 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5G_init_interface(void)
+herr_t
+H5G__init_package(void)
 {
     herr_t          ret_value = SUCCEED;  /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Initialize the atom group for the group IDs */
     if(H5I_register_type(H5I_GROUP_CLS) < 0)
 	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to initialize interface")
 
+    /* Mark "top" of interface as initialized, too */
+    H5G_top_package_initialize_s = TRUE;
+
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5G_init_interface() */
+} /* end H5G__init_package() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5G_term_interface
+ * Function:	H5G_top_term_package
  *
- * Purpose:	Terminates the H5G interface
+ * Purpose:	Close the "top" of the interface, releasing IDs, etc.
  *
  * Return:	Success:	Positive if anything is done that might
  *				affect other interfaces; zero otherwise.
- *
  * 		Failure:	Negative.
  *
- * Programmer:	Robb Matzke
- *		Monday, January	 5, 1998
+ * Programmer:	Quincey Koziol
+ *		Sunday, September	13, 2015
  *
  *-------------------------------------------------------------------------
  */
 int
-H5G_term_interface(void)
+H5G_top_term_package(void)
 {
     int	n = 0;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    if(H5_interface_initialize_g) {
+    if(H5G_top_package_initialize_s) {
         if(H5I_nmembers(H5I_GROUP) > 0) {
             (void)H5I_clear_type(H5I_GROUP, FALSE, FALSE);
             n++; /*H5I*/
         } /* end if */
-        else {
-            /* Close deprecated interface */
-            n += H5G__term_deprec_interface();
 
-            /* Destroy the group object id group */
-            (void)H5I_dec_type_ref(H5I_GROUP);
-            n++; /*H5I*/
+        /* Mark closed */
+        if(0 == n)
+            H5G_top_package_initialize_s = FALSE;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* end H5G_top_term_package() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_term_package
+ *
+ * Purpose:	Terminates the H5G interface
+ *
+ * Note:	Finishes shutting down the interface, after
+ *		H5G_top_term_package() is called
+ *
+ * Return:	Success:	Positive if anything is done that might
+ *				affect other interfaces; zero otherwise.
+ * 		Failure:	Negative.
+ *
+ * Programmer:	Robb Matzke
+ *		Monday, January	 5, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5G_term_package(void)
+{
+    int	n = 0;
 
-            /* Mark closed */
-            H5_interface_initialize_g = 0;
-        } /* end else */
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_PKG_INIT_VAR) {
+        /* Sanity checks */
+        HDassert(0 == H5I_nmembers(H5I_GROUP));
+        HDassert(FALSE == H5G_top_package_initialize_s);
+
+        /* Destroy the group object id group */
+        n += (H5I_dec_type_ref(H5I_GROUP) > 0);
+
+        /* Mark closed */
+        if(0 == n)
+            H5_PKG_INIT_VAR = FALSE;
     } /* end if */
 
     FUNC_LEAVE_NOAPI(n)
-} /* end H5G_term_interface() */
+} /* end H5G_term_package() */
 
 

 /*-------------------------------------------------------------------------
@@ -518,101 +531,6 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5G_get_create_plist
- *
- * Purpose:	Private function for H5Gget_create_plist
- *
- * Return:	Success:	ID for a copy of the group creation
- *				property list.  The property list ID should be
- *				released by calling H5Pclose().
- *
- *		Failure:	FAIL
- *
- * Programmer:	Quincey Koziol
- *		Tuesday, October 25, 2005
- *
- *-------------------------------------------------------------------------
- */
-hid_t
-H5G_get_create_plist(H5G_t *grp)
-{
-    H5O_linfo_t         linfo;		        /* Link info message            */
-    htri_t	        ginfo_exists;
-    htri_t	        linfo_exists;
-    htri_t              pline_exists;
-    H5P_genplist_t      *gcpl_plist;
-    H5P_genplist_t      *new_plist;
-    hid_t		new_gcpl_id = FAIL;
-    hid_t		ret_value = FAIL;
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    /* Copy the default group creation property list */
-    if(NULL == (gcpl_plist = (H5P_genplist_t *)H5I_object(H5P_LST_GROUP_CREATE_ID_g)))
-         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get default group creation property list")
-    if((new_gcpl_id = H5P_copy_plist(gcpl_plist, TRUE)) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to copy the creation property list")
-    if(NULL == (new_plist = (H5P_genplist_t *)H5I_object(new_gcpl_id)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
-
-    /* Retrieve any object creation properties */
-    if(H5O_get_create_plist(&grp->oloc, H5AC_ind_dxpl_id, new_plist) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get object creation info")
-
-    /* Check for the group having a group info message */
-    if((ginfo_exists = H5O_msg_exists(&(grp->oloc), H5O_GINFO_ID, H5AC_ind_dxpl_id)) < 0)
-	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
-    if(ginfo_exists) {
-        H5O_ginfo_t ginfo;		/* Group info message            */
-
-        /* Read the group info */
-        if(NULL == H5O_msg_read(&(grp->oloc), H5O_GINFO_ID, &ginfo, H5AC_ind_dxpl_id))
-            HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get group info")
-
-        /* Set the group info for the property list */
-        if(H5P_set(new_plist, H5G_CRT_GROUP_INFO_NAME, &ginfo) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set group info")
-    } /* end if */
-
-    /* Check for the group having a link info message */
-    if((linfo_exists = H5G__obj_get_linfo(&(grp->oloc), &linfo, H5AC_ind_dxpl_id)) < 0)
-	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
-    if(linfo_exists) {
-        /* Set the link info for the property list */
-        if(H5P_set(new_plist, H5G_CRT_LINK_INFO_NAME, &linfo) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set link info")
-    } /* end if */
-
-    /* Check for the group having a pipeline message */
-    if((pline_exists = H5O_msg_exists(&(grp->oloc), H5O_PLINE_ID, H5AC_ind_dxpl_id)) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to read object header")
-    if(pline_exists) {
-        H5O_pline_t pline;      /* Pipeline message */
-
-        /* Read the pipeline */
-        if(NULL == H5O_msg_read(&(grp->oloc), H5O_PLINE_ID, &pline, H5AC_ind_dxpl_id))
-            HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get link pipeline")
-
-        /* Set the pipeline for the property list */
-        if(H5P_set(new_plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set link pipeline")
-    } /* end if */
-
-    /* Set the return value */
-    ret_value = new_gcpl_id;
-
-done:
-    if(ret_value < 0) {
-        if(new_gcpl_id > 0)
-            if(H5I_dec_app_ref(new_gcpl_id) < 0)
-                HDONE_ERROR(H5E_SYM, H5E_CANTDEC, FAIL, "can't free")
-    } /* end if */
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5G_get_create_plist() */
-
-

-/*-------------------------------------------------------------------------
  * Function:	H5Gget_info
  *
  * Purpose:	Retrieve information about a group.
@@ -822,3 +740,71 @@ done:
     FUNC_LEAVE_API(ret_value)
 } /* end H5Gclose() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Gflush
+ *
+ * Purpose:     Flushes all buffers associated with a group to disk.
+ *
+ * Return:      Non-negative on success, negative on failure
+ *
+ * Programmer:  Mike McGreevy
+ *              May 19, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Gflush(hid_t group_id)
+{
+    H5G_t *grp;        /* Dataset for this operation */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", group_id);
+    
+    /* Check args */
+    if(NULL == (grp = (H5G_t *)H5I_object_verify(group_id, H5I_GROUP)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
+
+    /* Flush object's metadata to file */
+    if(H5O_flush_common(&grp->oloc, group_id, H5AC_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTFLUSH, FAIL, "unable to flush group and object flush callback")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Gflush */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Grefresh
+ *
+ * Purpose:     Refreshes all buffers associated with a dataset.
+ *
+ * Return:      Non-negative on success, negative on failure
+ *
+ * Programmer:  Mike McGreevy
+ *              July 21, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Grefresh(hid_t group_id)
+{
+    H5G_t * grp = NULL;
+    herr_t ret_value = SUCCEED; /* return value */
+    
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", group_id);
+
+    /* Check args */
+    if(NULL == (grp = (H5G_t *)H5I_object_verify(group_id, H5I_GROUP)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
+
+    /* Call private function to refresh group object */
+    if ((H5O_refresh_metadata(group_id, grp->oloc, H5AC_dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, FAIL, "unable to refresh group")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Grefresh */
+
diff --git a/src/H5Gbtree2.c b/src/H5Gbtree2.c
index 8d37940..b464930 100644
--- a/src/H5Gbtree2.c
+++ b/src/H5Gbtree2.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg  */
+#include "H5Gmodule.h"          /* This source code file is part of the H5G module */
 
 
 /***********/
@@ -83,8 +83,8 @@ static herr_t H5G_dense_btree2_corder_encode(uint8_t *raw, const void *native,
     void *ctx);
 static herr_t H5G_dense_btree2_corder_decode(const uint8_t *raw, void *native,
     void *ctx);
-static herr_t H5G_dense_btree2_corder_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
-    int indent, int fwidth, const void *record, const void *_udata);
+static herr_t H5G_dense_btree2_corder_debug(FILE *stream, int indent, int fwidth,
+    const void *record, const void *_udata);
 
 /* v2 B-tree driver callbacks for 'name' index */
 static herr_t H5G_dense_btree2_name_store(void *native, const void *udata);
@@ -93,8 +93,8 @@ static herr_t H5G_dense_btree2_name_encode(uint8_t *raw, const void *native,
     void *ctx);
 static herr_t H5G_dense_btree2_name_decode(const uint8_t *raw, void *native,
     void *ctx);
-static herr_t H5G_dense_btree2_name_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
-    int indent, int fwidth, const void *record, const void *_udata);
+static herr_t H5G_dense_btree2_name_debug(FILE *stream, int indent, int fwidth,
+    const void *record, const void *_udata);
 
 /* Fractal heap function callbacks */
 static herr_t H5G_dense_fh_name_cmp(const void *obj, size_t obj_len, void *op_data);
@@ -238,7 +238,7 @@ H5G_dense_btree2_name_compare(const void *_bt2_udata, const void *_bt2_rec)
 {
     const H5G_bt2_ud_common_t *bt2_udata = (const H5G_bt2_ud_common_t *)_bt2_udata;
     const H5G_dense_bt2_name_rec_t *bt2_rec = (const H5G_dense_bt2_name_rec_t *)_bt2_rec;
-    herr_t ret_value;           /* Return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -362,17 +362,16 @@ H5G_dense_btree2_name_decode(const uint8_t *raw, void *_nrecord, void H5_ATTR_UN
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5G_dense_btree2_name_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
-    int indent, int fwidth, const void *_nrecord,
-    const void H5_ATTR_UNUSED *_udata)
+H5G_dense_btree2_name_debug(FILE *stream, int indent, int fwidth,
+    const void *_nrecord, const void H5_ATTR_UNUSED *_udata)
 {
     const H5G_dense_bt2_name_rec_t *nrecord = (const H5G_dense_bt2_name_rec_t *)_nrecord;
     unsigned u;                 /* Local index variable */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    HDfprintf(stream, "%*s%-*s {%lx, ", indent, "", fwidth, "Record:",
-        nrecord->hash);
+    HDfprintf(stream, "%*s%-*s {%x, ", indent, "", fwidth, "Record:",
+        (unsigned)nrecord->hash);
     for(u = 0; u < H5G_DENSE_FHEAP_ID_LEN; u++)
         HDfprintf(stderr, "%02x%s", nrecord->id[u], (u < (H5G_DENSE_FHEAP_ID_LEN - 1) ? " " : "}\n"));
 
@@ -428,7 +427,7 @@ H5G_dense_btree2_corder_compare(const void *_bt2_udata, const void *_bt2_rec)
 {
     const H5G_bt2_ud_common_t *bt2_udata = (const H5G_bt2_ud_common_t *)_bt2_udata;
     const H5G_dense_bt2_corder_rec_t *bt2_rec = (const H5G_dense_bt2_corder_rec_t *)_bt2_rec;
-    herr_t ret_value;           /* Return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -528,17 +527,16 @@ H5G_dense_btree2_corder_decode(const uint8_t *raw, void *_nrecord, void H5_ATTR_
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5G_dense_btree2_corder_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
-    int indent, int fwidth, const void *_nrecord,
-    const void H5_ATTR_UNUSED *_udata)
+H5G_dense_btree2_corder_debug(FILE *stream, int indent, int fwidth,
+    const void *_nrecord, const void H5_ATTR_UNUSED *_udata)
 {
     const H5G_dense_bt2_corder_rec_t *nrecord = (const H5G_dense_bt2_corder_rec_t *)_nrecord;
     unsigned u;                 /* Local index variable */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    HDfprintf(stream, "%*s%-*s {%Hu, ", indent, "", fwidth, "Record:",
-        nrecord->corder);
+    HDfprintf(stream, "%*s%-*s {%llu, ", indent, "", fwidth, "Record:",
+        (unsigned long long)nrecord->corder);
     for(u = 0; u < H5G_DENSE_FHEAP_ID_LEN; u++)
         HDfprintf(stderr, "%02x%s", nrecord->id[u], (u < (H5G_DENSE_FHEAP_ID_LEN - 1) ? " " : "}\n"));
 
diff --git a/src/H5Gcache.c b/src/H5Gcache.c
index a42127b..a4f9530 100644
--- a/src/H5Gcache.c
+++ b/src/H5Gcache.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg   */
+#include "H5Gmodule.h"          /* This source code file is part of the H5G module */
 
 
 /***********/
@@ -46,7 +46,6 @@
 /****************/
 
 #define H5G_NODE_VERS           1       /* Symbol table node version number   */
-#define H5G_NODE_BUF_SIZE       512     /* Size of stack buffer for serialized nodes */
 
 
 /******************/
@@ -64,12 +63,16 @@
 /********************/
 
 /* Metadata cache (H5AC) callbacks */
-static H5G_node_t *H5G_node_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static herr_t H5G_node_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr,
-			     H5G_node_t *sym, unsigned *flags_ptr);
-static herr_t H5G_node_dest(H5F_t *f, H5G_node_t *sym);
-static herr_t H5G_node_clear(H5F_t *f, H5G_node_t *sym, hbool_t destroy);
-static herr_t H5G_node_size(const H5F_t *f, const H5G_node_t *sym, size_t *size_ptr);
+static herr_t H5G__cache_node_get_load_size(const void *image, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static void *H5G__cache_node_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty);
+static herr_t H5G__cache_node_image_len(const void *thing, size_t *image_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static herr_t H5G__cache_node_serialize(const H5F_t *f, void *image,
+    size_t len, void *thing);
+static herr_t H5G__cache_node_free_icr(void *thing);
 
 
 /*********************/
@@ -88,12 +91,20 @@ static herr_t H5G_node_size(const H5F_t *f, const H5G_node_t *sym, size_t *size_
 
 /* Symbol table nodes inherit cache-like properties from H5AC */
 const H5AC_class_t H5AC_SNODE[1] = {{
-    H5AC_SNODE_ID,
-    (H5AC_load_func_t)H5G_node_load,
-    (H5AC_flush_func_t)H5G_node_flush,
-    (H5AC_dest_func_t)H5G_node_dest,
-    (H5AC_clear_func_t)H5G_node_clear,
-    (H5AC_size_func_t)H5G_node_size,
+    H5AC_SNODE_ID,                      /* Metadata client ID */
+    "Symbol table node",                /* Metadata client name (for debugging) */
+    H5FD_MEM_BTREE,                     /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5G__cache_node_get_load_size,      /* 'get_load_size' callback */
+    NULL,				/* 'verify_chksum' callback */
+    H5G__cache_node_deserialize,        /* 'deserialize' callback */
+    H5G__cache_node_image_len,          /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5G__cache_node_serialize,          /* 'serialize' callback */
+    NULL,                               /* 'notify' callback */
+    H5G__cache_node_free_icr,           /* 'free_icr' callback */
+    NULL,			        /* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
 }};
 
 
@@ -105,306 +116,268 @@ H5FL_SEQ_EXTERN(H5G_entry_t);
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5G_node_load
+ * Function:    H5G__cache_node_get_load_size()
  *
- * Purpose:	Loads a symbol table node from the file.
+ * Purpose:	Determine the size of the on disk image of the node, and 
+ *		return this value in *image_len.
  *
- * Return:	Success:	Ptr to the new table.
+ *		Note that this computation requires access to the file pointer,
+ *		which is not provided in the parameter list for this callback.
+ *		Finesse this issue by passing in the file pointer twice to the
+ *		H5AC_protect() call -- once as the file pointer proper, and 
+ *		again as the user data.
+ *      
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- *		Failure:	NULL
- *
- * Programmer:	Robb Matzke
- *		matzke at llnl.gov
- *		Jun 23 1997
+ * Programmer:  John Mainzer
+ *              7/21/14
  *
  *-------------------------------------------------------------------------
  */
-static H5G_node_t *
-H5G_node_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata)
+static herr_t
+H5G__cache_node_get_load_size(const void *_image, void *_udata, size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    H5G_node_t		   *sym = NULL;
-    H5WB_t                 *wb = NULL;     /* Wrapped buffer for node data */
-    uint8_t                 node_buf[H5G_NODE_BUF_SIZE]; /* Buffer for node */
-    uint8_t		   *node;           /* Pointer to node buffer */
-    const uint8_t	   *p;
-    H5G_node_t		   *ret_value;	/*for error handling */
-
-    FUNC_ENTER_NOAPI_NOINIT
-
-    /*
-     * Check arguments.
-     */
+    const uint8_t *image = (const uint8_t *)_image;    	/* Pointer to image to deserialize */
+    H5F_t *f = (H5F_t *)_udata;   		/* User data for callback */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
     HDassert(f);
-    HDassert(H5F_addr_defined(addr));
-    HDassert(udata);
+    HDassert(image_len);
 
-    /*
-     * Initialize variables.
-     */
+    if(image == NULL) {
+	/* report image length */
+	*image_len = (size_t)(H5G_NODE_SIZE(f));
+    } else {
+        HDassert(actual_len);
+        HDassert(*image_len == *actual_len);
+    }
 
-    /* Allocate symbol table data structures */
-    if(NULL == (sym = H5FL_CALLOC(H5G_node_t)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
-    sym->node_size = H5G_NODE_SIZE(f);
-    if(NULL == (sym->entry = H5FL_SEQ_CALLOC(H5G_entry_t, (size_t)(2 * H5F_SYM_LEAF_K(f)))))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    /* Nothing to do for non-NULL image : no need to compute actual_len */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G__cache_node_get_load_size() */
 
-    /* Wrap the local buffer for serialized node info */
-    if(NULL == (wb = H5WB_wrap(node_buf, sizeof(node_buf))))
-        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "can't wrap buffer")
+

+/*-------------------------------------------------------------------------
+ * Function:    H5G__cache_node_deserialize
+ *
+ * Purpose:	Given a buffer containing the on disk image of a symbol table
+ *		node, allocate an instance of H5G_node_t, load the contence of the
+ *		image into it, and return a pointer to the instance.
+ *
+ *		Note that deserializing the image requires access to the file 
+ *		pointer, which is not included in the parameter list for this 
+ *		callback.  Finesse this issue by passing in the file pointer 
+ *		twice to the H5AC_protect() call -- once as the file pointer 
+ *		proper, and again as the user data
+ *
+ * Return:      Success:        Pointer to in core representation
+ *              Failure:        NULL
+ *
+ * Programmer:  John Mainzer
+ *              6/21/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5G__cache_node_deserialize(const void *_image, size_t len, void *_udata,
+    hbool_t H5_ATTR_UNUSED *dirty)
+{
+    H5F_t                  *f = (H5F_t *)_udata;        /* User data for callback */
+    H5G_node_t             *sym = NULL; /* Symbol table node created */
+    const uint8_t          *image = (const uint8_t *)_image;    /* Pointer to image to deserialize */
+    void                   *ret_value = NULL;   /* Return value */
 
-    /* Get a pointer to a buffer that's large enough for node */
-    if(NULL == (node = (uint8_t *)H5WB_actual(wb, sym->node_size)))
-        HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, NULL, "can't get actual buffer")
+    FUNC_ENTER_STATIC
 
-    /* Read the serialized symbol table node. */
-    if(H5F_block_read(f, H5FD_MEM_BTREE, addr, sym->node_size, dxpl_id, node) < 0)
-	HGOTO_ERROR(H5E_SYM, H5E_READERROR, NULL, "unable to read symbol table node")
+    /* Sanity checks */
+    HDassert(image);
+    HDassert(len > 0);
+    HDassert(f);
+    HDassert(dirty);
 
-    /* Get temporary pointer to serialized node */
-    p = node;
+    /* Allocate symbol table data structures */
+    if(NULL == (sym = H5FL_CALLOC(H5G_node_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    sym->node_size = (size_t)(H5G_NODE_SIZE(f));
+    if(NULL == (sym->entry = H5FL_SEQ_CALLOC(H5G_entry_t, (size_t)(2 * H5F_SYM_LEAF_K(f)))))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
 
     /* magic */
-    if(HDmemcmp(p, H5G_NODE_MAGIC, (size_t)H5_SIZEOF_MAGIC))
-	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, NULL, "bad symbol table node signature")
-    p += 4;
+    if(HDmemcmp(image, H5G_NODE_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+        HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, NULL, "bad symbol table node signature")
+    image += H5_SIZEOF_MAGIC;
 
     /* version */
-    if(H5G_NODE_VERS != *p++)
-	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, NULL, "bad symbol table node version")
+    if(H5G_NODE_VERS != *image++)
+        HGOTO_ERROR(H5E_SYM, H5E_VERSION, NULL, "bad symbol table node version")
 
     /* reserved */
-    p++;
+    image++;
 
     /* number of symbols */
-    UINT16DECODE(p, sym->nsyms);
+    UINT16DECODE(image, sym->nsyms);
 
     /* entries */
-    if(H5G__ent_decode_vec(f, &p, sym->entry, sym->nsyms) < 0)
-	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, NULL, "unable to decode symbol table entries")
+    if(H5G__ent_decode_vec(f, &image, sym->entry, sym->nsyms) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, NULL, "unable to decode symbol table entries")
 
     /* Set return value */
     ret_value = sym;
 
 done:
-    /* Release resources */
-    if(wb && H5WB_unwrap(wb) < 0)
-        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, NULL, "can't close wrapped buffer")
     if(!ret_value)
         if(sym && H5G__node_free(sym) < 0)
             HDONE_ERROR(H5E_SYM, H5E_CANTFREE, NULL, "unable to destroy symbol table node")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5G_node_load() */
+} /* end H5G__cache_node_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5G_node_flush
+ * Function:    H5G__cache_node_image_len
  *
- * Purpose:	Flush a symbol table node to disk.
+ * Purpose:     Compute the size of the data structure on disk and return
+ *              it in *image_len.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	Robb Matzke
- *		matzke at llnl.gov
- *		Jun 23 1997
+ * Programmer:  John Mainzer
+ *              6/21/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5G_node_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5G_node_t *sym, unsigned H5_ATTR_UNUSED * flags_ptr)
+H5G__cache_node_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    H5WB_t     *wb = NULL;     /* Wrapped buffer for node data */
-    uint8_t     node_buf[H5G_NODE_BUF_SIZE]; /* Buffer for node */
-    herr_t      ret_value = SUCCEED;       /* Return value */
+    const H5G_node_t *sym = (const H5G_node_t *)_thing; /* Pointer to object */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR
 
-    /*
-     * Check arguments.
-     */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    /* Sanity checks */
     HDassert(sym);
+    HDassert(sym->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(sym->cache_info.type == H5AC_SNODE);
+    HDassert(image_len);
 
-    /*
-     * Write the symbol node to disk.
-     */
-    if(sym->cache_info.is_dirty) {
-        uint8_t	*node;          /* Pointer to node buffer */
-        uint8_t	*p;             /* Pointer into raw data buffer */
-
-        /* Wrap the local buffer for serialized node info */
-        if(NULL == (wb = H5WB_wrap(node_buf, sizeof(node_buf))))
-            HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't wrap buffer")
-
-        /* Get a pointer to a buffer that's large enough for node */
-        if(NULL == (node = (uint8_t *)H5WB_actual(wb, sym->node_size)))
-            HGOTO_ERROR(H5E_SYM, H5E_NOSPACE, FAIL, "can't get actual buffer")
-
-        /* Get temporary pointer to serialized symbol table node */
-        p = node;
-
-        /* magic number */
-        HDmemcpy(p, H5G_NODE_MAGIC, (size_t)H5_SIZEOF_MAGIC);
-        p += 4;
-
-        /* version number */
-        *p++ = H5G_NODE_VERS;
-
-        /* reserved */
-        *p++ = 0;
-
-        /* number of symbols */
-        UINT16ENCODE(p, sym->nsyms);
-
-        /* entries */
-        if(H5G__ent_encode_vec(f, &p, sym->entry, sym->nsyms) < 0)
-            HGOTO_ERROR(H5E_SYM, H5E_CANTENCODE, FAIL, "can't serialize")
-        HDmemset(p, 0, sym->node_size - (size_t)(p - node));
-
-	/* Write the serialized symbol table node. */
-        if(H5F_block_write(f, H5FD_MEM_BTREE, addr, sym->node_size, dxpl_id, node) < 0)
-            HGOTO_ERROR(H5E_SYM, H5E_WRITEERROR, FAIL, "unable to write symbol table node to the file")
-
-        /* Reset the node's dirty flag */
-        sym->cache_info.is_dirty = FALSE;
-    } /* end if */
+    *image_len = sym->node_size;
 
-    /*
-     * Destroy the symbol node?	 This might happen if the node is being
-     * preempted from the cache.
-     */
-    if(destroy)
-        if(H5G_node_dest(f, sym) < 0)
-	    HGOTO_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to destroy symbol table node")
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5G__cache_node_image_len() */
 
-done:
-    /* Release resources */
-    if(wb && H5WB_unwrap(wb) < 0)
-        HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5G_node_flush() */
+/*************************************/
+/* no H5G__cache_node_pre_serialize() */
+/*************************************/
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5G_node_dest
+ * Function:    H5G__cache_node_serialize
  *
- * Purpose:	Destroy a symbol table node in memory.
+ * Purpose:	Given a correctly sized buffer and an instace of H5G_node_t,
+ *		serialize the contents of the instance of H5G_node_t, and write
+ *		this data into the supplied buffer.  This buffer will be written
+ *		to disk.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Jan 15 2003
+ * Programmer:  John Mainzer
+ *              7/21/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5G_node_dest(H5F_t *f, H5G_node_t *sym)
+H5G__cache_node_serialize(const H5F_t *f, void *_image, size_t len,
+    void *_thing)
 {
-    herr_t ret_value = SUCCEED;         /* Return value */
+    H5G_node_t *sym = (H5G_node_t *)_thing;     /* Pointer to object */
+    uint8_t    *image = (uint8_t *)_image;      /* Pointer into raw data buffer */
+    herr_t      ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /*
-     * Check arguments.
-     */
+    /* Sanity checks */
     HDassert(f);
+    HDassert(image);
     HDassert(sym);
+    HDassert(sym->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(sym->cache_info.type == H5AC_SNODE);
+    HDassert(len == sym->node_size);
 
-    /* Verify that node is clean */
-    HDassert(sym->cache_info.is_dirty == FALSE);
+    /* magic number */
+    HDmemcpy(image, H5G_NODE_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    image += H5_SIZEOF_MAGIC;
 
-    /* If we're going to free the space on disk, the address must be valid */
-    HDassert(!sym->cache_info.free_file_space_on_destroy || H5F_addr_defined(sym->cache_info.addr));
+    /* version number */
+    *image++ = H5G_NODE_VERS;
 
-    /* Check for freeing file space for symbol table node */
-    if(sym->cache_info.free_file_space_on_destroy) {
-        /* Release the space on disk */
-        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
-        if(H5MF_xfree(f, H5FD_MEM_BTREE, H5AC_dxpl_id, sym->cache_info.addr, (hsize_t)sym->node_size) < 0)
-            HGOTO_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to free symbol table node")
-    } /* end if */
+    /* reserved */
+    *image++ = 0;
 
-    /* Destroy symbol table node */
-    if(H5G__node_free(sym) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to destroy symbol table node")
+    /* number of symbols */
+    UINT16ENCODE(image, sym->nsyms);
+
+    /* entries */
+    if(H5G__ent_encode_vec(f, &image, sym->entry, sym->nsyms) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTENCODE, FAIL, "can't serialize")
+
+#ifdef H5_CLEAR_MEMORY
+    /* Clear rest of symbol table node */
+    HDmemset(image, 0, len - (size_t)(image - (uint8_t *)_image));
+#endif /* H5_CLEAR_MEMORY */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5G_node_dest() */
+} /* end H5G__cache_node_serialize() */
+
+
+/***************************************/
+/* no H5G__cache_node_notify() function */
+/***************************************/
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5G_node_clear
+ * Function:    H5G__cache_node_free_icr
  *
- * Purpose:	Mark a symbol table node in memory as non-dirty.
+ * Purpose:	Destroys a symbol table node in memory.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Note:	The metadata cache sets the object's cache_info.magic to
+ *		H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC before calling a free_icr
+ *		callback (checked in assert).
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Mar 20 2003
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              6/21/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5G_node_clear(H5F_t *f, H5G_node_t *sym, hbool_t destroy)
+H5G__cache_node_free_icr(void *_thing)
 {
-    herr_t ret_value = SUCCEED;
+    H5G_node_t *sym = (H5G_node_t *)_thing;     /* Pointer to the object */
+    herr_t      ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /*
-     * Check arguments.
-     */
+    /* Sanity checks */
     HDassert(sym);
+    HDassert(sym->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC);
+    HDassert(sym->cache_info.type == H5AC_SNODE);
 
-    /* Reset the node's dirty flag */
-    sym->cache_info.is_dirty = FALSE;
-
-    /*
-     * Destroy the symbol node?	 This might happen if the node is being
-     * preempted from the cache.
-     */
-    if(destroy)
-        if(H5G_node_dest(f, sym) < 0)
-	    HGOTO_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to destroy symbol table node")
+    /* Destroy symbol table node */
+    if(H5G__node_free(sym) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to destroy symbol table node")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5G_node_clear() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5G_node_size
- *
- * Purpose:	Compute the size in bytes of the specified instance of
- *		H5G_node_t on disk, and return it in *size_ptr.  On failure
- *		the value of size_ptr is undefined.
- *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	John Mainzer
- *		5/13/04
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5G_node_size(const H5F_t H5_ATTR_UNUSED *f, const H5G_node_t *sym, size_t *size_ptr)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    /*
-     * Check arguments.
-     */
-    HDassert(f);
-    HDassert(size_ptr);
-
-    *size_ptr = sym->node_size;
-
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5G_node_size() */
+} /* end H5G__cache_node_free_icr() */
 
diff --git a/src/H5Gcompact.c b/src/H5Gcompact.c
index 89e79cc..41ca4f5 100644
--- a/src/H5Gcompact.c
+++ b/src/H5Gcompact.c
@@ -23,7 +23,7 @@
  *
  *-------------------------------------------------------------------------
  */
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+#include "H5Gmodule.h"          /* This source code file is part of the H5G module */
 
 
 /* Packages needed by this file... */
@@ -224,8 +224,8 @@ H5G__compact_get_name_by_idx(const H5O_loc_t *oloc, hid_t dxpl_id,
     const H5O_linfo_t *linfo, H5_index_t idx_type, H5_iter_order_t order,
     hsize_t idx, char* name, size_t size)
 {
-    H5G_link_table_t    ltable = {0, NULL};         /* Link table */
-    ssize_t		ret_value;      /* Return value */
+    H5G_link_table_t    ltable = {0, NULL};     /* Link table */
+    ssize_t		ret_value = -1;         /* Return value */
 
     FUNC_ENTER_PACKAGE
 
@@ -411,7 +411,7 @@ H5G__compact_iterate(const H5O_loc_t *oloc, hid_t dxpl_id, const H5O_linfo_t *li
     H5G_lib_iterate_t op, void *op_data)
 {
     H5G_link_table_t    ltable = {0, NULL};     /* Link table */
-    herr_t		ret_value;              /* Return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_PACKAGE
 
@@ -503,7 +503,7 @@ H5G__compact_lookup(const H5O_loc_t *oloc, const char *name, H5O_link_t *lnk,
 {
     H5G_iter_lkp_t udata;               /* User data for iteration callback */
     H5O_mesg_operator_t op;             /* Message operator */
-    htri_t     ret_value;               /* Return value */
+    htri_t     ret_value = FAIL;        /* Return value */
 
     FUNC_ENTER_PACKAGE
 
@@ -598,7 +598,7 @@ H5G__compact_get_type_by_idx(H5O_loc_t *oloc, hid_t dxpl_id, const H5O_linfo_t *
     hsize_t idx)
 {
     H5G_link_table_t    ltable = {0, NULL};         /* Link table */
-    H5G_obj_t		ret_value;      /* Return value */
+    H5G_obj_t		ret_value = H5G_UNKNOWN;    /* Return value */
 
     FUNC_ENTER_PACKAGE
 
diff --git a/src/H5Gdense.c b/src/H5Gdense.c
index 285355f..e8fa237 100644
--- a/src/H5Gdense.c
+++ b/src/H5Gdense.c
@@ -29,7 +29,7 @@
 /* Module Setup */
 /****************/
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg  */
+#include "H5Gmodule.h"          /* This source code file is part of the H5G module */
 
 /***********/
 /* Headers */
@@ -322,8 +322,9 @@ HDfprintf(stderr, "%s: fheap_id_len = %Zu\n", FUNC, fheap_id_len);
     HDmemset(&bt2_cparam, 0, sizeof(bt2_cparam));
     bt2_cparam.cls = H5G_BT2_NAME;
     bt2_cparam.node_size = (size_t)H5G_NAME_BT2_NODE_SIZE;
+    H5_CHECK_OVERFLOW(fheap_id_len, /* From: */ hsize_t, /* To: */ uint32_t);
     bt2_cparam.rrec_size = 4 +          /* Name's hash value */
-            fheap_id_len;               /* Fractal heap ID */
+            (uint32_t)fheap_id_len;     /* Fractal heap ID */
     bt2_cparam.split_percent = H5G_NAME_BT2_SPLIT_PERC;
     bt2_cparam.merge_percent = H5G_NAME_BT2_MERGE_PERC;
     if(NULL == (bt2_name = H5B2_create(f, dxpl_id, &bt2_cparam, NULL)))
@@ -342,8 +343,9 @@ HDfprintf(stderr, "%s: linfo->name_bt2_addr = %a\n", FUNC, linfo->name_bt2_addr)
         HDmemset(&bt2_cparam, 0, sizeof(bt2_cparam));
         bt2_cparam.cls = H5G_BT2_CORDER;
         bt2_cparam.node_size = (size_t)H5G_CORDER_BT2_NODE_SIZE;
-        bt2_cparam.rrec_size = 8 +      /* Creation order value */
-                fheap_id_len;           /* Fractal heap ID */
+        H5_CHECK_OVERFLOW(fheap_id_len, /* From: */ hsize_t, /* To: */ uint32_t);
+        bt2_cparam.rrec_size = 8 +              /* Creation order value */
+                (uint32_t)fheap_id_len;         /* Fractal heap ID */
         bt2_cparam.split_percent = H5G_CORDER_BT2_SPLIT_PERC;
         bt2_cparam.merge_percent = H5G_CORDER_BT2_MERGE_PERC;
         if(NULL == (bt2_corder = H5B2_create(f, dxpl_id, &bt2_cparam, NULL)))
@@ -540,7 +542,7 @@ H5G__dense_lookup(H5F_t *f, hid_t dxpl_id, const H5O_linfo_t *linfo,
     H5G_bt2_ud_common_t udata;          /* User data for v2 B-tree link lookup */
     H5HF_t *fheap = NULL;               /* Fractal heap handle */
     H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for name index */
-    htri_t ret_value;                   /* Return value */
+    htri_t ret_value = FAIL;            /* Return value */
 
     FUNC_ENTER_PACKAGE
 
@@ -991,7 +993,7 @@ H5G__dense_iterate(H5F_t *f, hid_t dxpl_id, const H5O_linfo_t *linfo,
     H5G_link_table_t ltable = {0, NULL};      /* Table of links */
     H5B2_t *bt2 = NULL;                 /* v2 B-tree handle for index */
     haddr_t bt2_addr;                   /* Address of v2 B-tree to use for lookup */
-    herr_t ret_value;                   /* Return value */
+    herr_t ret_value = FAIL;            /* Return value */
 
     FUNC_ENTER_PACKAGE
 
@@ -1197,7 +1199,7 @@ H5G__dense_get_name_by_idx(H5F_t *f, hid_t dxpl_id, H5O_linfo_t *linfo,
     H5G_link_table_t ltable = {0, NULL};      /* Table of links */
     H5B2_t *bt2 = NULL;         /* v2 B-tree handle for index */
     haddr_t bt2_addr;           /* Address of v2 B-tree to use for lookup */
-    ssize_t ret_value;          /* Return value */
+    ssize_t ret_value = -1;     /* Return value */
 
     FUNC_ENTER_PACKAGE
 
@@ -1836,8 +1838,8 @@ H5G_obj_t
 H5G__dense_get_type_by_idx(H5F_t *f, hid_t dxpl_id, H5O_linfo_t *linfo,
     hsize_t idx)
 {
-    H5G_link_table_t ltable = {0, NULL};         /* Table of links */
-    H5G_obj_t ret_value;        /* Return value */
+    H5G_link_table_t ltable = {0, NULL};        /* Table of links */
+    H5G_obj_t ret_value = H5G_UNKNOWN;          /* Return value */
 
     FUNC_ENTER_PACKAGE
 
diff --git a/src/H5Gdeprec.c b/src/H5Gdeprec.c
index 0927219..e0bc78e 100644
--- a/src/H5Gdeprec.c
+++ b/src/H5Gdeprec.c
@@ -31,10 +31,7 @@
 /* Module Setup */
 /****************/
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg   */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5G__init_deprec_interface
+#include "H5Gmodule.h"          /* This source code file is part of the H5G module */
 
 
 /***********/
@@ -106,51 +103,6 @@ static H5G_obj_t H5G_obj_get_type_by_idx(H5O_loc_t *oloc, hsize_t idx,
 /*******************/
 
 
-

-/*--------------------------------------------------------------------------
-NAME
-   H5G__init_deprec_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5G__init_deprec_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5G__init() currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5G__init_deprec_interface(void)
-{
-    FUNC_ENTER_STATIC_NOERR
-
-    FUNC_LEAVE_NOAPI(H5G__init())
-} /* H5G__init_deprec_interface() */
-
-

-/*--------------------------------------------------------------------------
-NAME
-   H5G__term_deprec_interface -- Terminate interface
-USAGE
-    herr_t H5G__term_deprec_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Terminates interface.  (Just resets H5_interface_initialize_g
-    currently).
-
---------------------------------------------------------------------------*/
-herr_t
-H5G__term_deprec_interface(void)
-{
-    FUNC_ENTER_PACKAGE_NOERR
-
-    /* Mark closed */
-    H5_interface_initialize_g = 0;
-
-    FUNC_LEAVE_NOAPI(0)
-} /* H5G__term_deprec_interface() */
-
 #ifndef H5_NO_DEPRECATED_SYMBOLS
 

 /*-------------------------------------------------------------------------
@@ -168,7 +120,7 @@ H5G__term_deprec_interface(void)
 H5G_obj_t
 H5G_map_obj_type(H5O_type_t obj_type)
 {
-    H5G_obj_t ret_value;        /* Return value */
+    H5G_obj_t ret_value = H5G_UNKNOWN;  /* Return value */
 
     /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
     FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -1164,9 +1116,9 @@ H5G_obj_get_type_by_idx(H5O_loc_t *oloc, hsize_t idx, hid_t dxpl_id)
 {
     H5O_linfo_t	linfo;		/* Link info message */
     htri_t linfo_exists;        /* Whether the link info message exists */
-    H5G_obj_t ret_value;        /* Return value */
+    H5G_obj_t ret_value = H5G_UNKNOWN;  /* Return value */
 
-    FUNC_ENTER_NOAPI(H5G_UNKNOWN)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, oloc->addr, H5G_UNKNOWN)
 
     /* Sanity check */
     HDassert(oloc);
@@ -1193,7 +1145,7 @@ H5G_obj_get_type_by_idx(H5O_loc_t *oloc, hsize_t idx, hid_t dxpl_id)
     } /* end else */
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, H5G_UNKNOWN)
 } /* end H5G_obj_get_type_by_idx() */
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
diff --git a/src/H5Gent.c b/src/H5Gent.c
index 2cef9f7..6020028 100644
--- a/src/H5Gent.c
+++ b/src/H5Gent.c
@@ -22,7 +22,7 @@
 /* Module Setup */
 /****************/
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+#include "H5Gmodule.h"          /* This source code file is part of the H5G module */
 
 
 /***********/
@@ -173,7 +173,7 @@ H5G_ent_decode(const H5F_t *f, const uint8_t **pp, H5G_entry_t *ent)
             HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "unknown symbol table entry cache type")
     } /* end switch */
 
-    *pp = p_ret + H5G_SIZEOF_ENTRY(f);
+    *pp = p_ret + H5G_SIZEOF_ENTRY_FILE(f);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -240,7 +240,7 @@ done:
 herr_t
 H5G_ent_encode(const H5F_t *f, uint8_t **pp, const H5G_entry_t *ent)
 {
-    uint8_t	*p_ret = *pp + H5G_SIZEOF_ENTRY(f);
+    uint8_t	*p_ret = *pp + H5G_SIZEOF_ENTRY_FILE(f);
     herr_t      ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
@@ -411,8 +411,8 @@ H5G__ent_convert(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, const char *name,
      * Add the new name to the heap.
      */
     name_offset = H5HL_insert(f, dxpl_id, heap, HDstrlen(name) + 1, name);
-    if(0 == name_offset || (size_t)(-1) == name_offset)
-	HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert symbol name into heap")
+    if(0 == name_offset || UFAIL == name_offset)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert symbol name into heap")
     ent->name_off = name_offset;
 
     /* Build correct information for symbol table entry based on link type */
@@ -460,7 +460,7 @@ H5G__ent_convert(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, const char *name,
                 targ_oloc.addr = lnk->u.hard.addr;
 
                 /* Get the object header */
-                if(NULL == (oh = H5O_protect(&targ_oloc, dxpl_id, H5AC_READ)))
+                if(NULL == (oh = H5O_protect(&targ_oloc, dxpl_id, H5AC__READ_ONLY_FLAG)))
                     HGOTO_ERROR(H5E_SYM, H5E_CANTPROTECT, FAIL, "unable to protect target object header")
 
                 /* Check if a symbol table message exists */
@@ -505,7 +505,7 @@ H5G__ent_convert(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, const char *name,
                 size_t	lnk_offset;		/* Offset to sym-link value	*/
 
                 /* Insert link value into local heap */
-                if((size_t)(-1) == (lnk_offset = H5HL_insert(f, dxpl_id, heap,
+                if(UFAIL == (lnk_offset = H5HL_insert(f, dxpl_id, heap,
                         HDstrlen(lnk->u.soft.name) + 1, lnk->u.soft.name)))
                     HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to write link value to local heap")
 
diff --git a/src/H5Gint.c b/src/H5Gint.c
index 04b21a5..f7f4afe 100644
--- a/src/H5Gint.c
+++ b/src/H5Gint.c
@@ -28,10 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg   */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5G_init_int_interface
+#include "H5Gmodule.h"          /* This source code file is part of the H5G module */
 
 
 /***********/
@@ -119,34 +116,6 @@ H5FL_DEFINE(H5_obj_t);
 
 
 

-/*--------------------------------------------------------------------------
-NAME
-   H5G_init_int_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5G_init_int_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5G__init() currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5G_init_int_interface(void)
-{
-    herr_t ret_value = SUCCEED;   /* Return value */
-
-    FUNC_ENTER_NOAPI_NOINIT
-
-    /* Funnel all work to H5G__init() */
-    if(H5G__init() < 0)
-        HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "interface initialization failed")
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5G_init_int_interface() */
-
-

 /*-------------------------------------------------------------------------
  * Function:	H5G__create_named
  *
@@ -167,7 +136,7 @@ H5G__create_named(const H5G_loc_t *loc, const char *name, hid_t lcpl_id,
 {
     H5O_obj_create_t ocrt_info;         /* Information for object creation */
     H5G_obj_create_t gcrt_info;         /* Information for group creation */
-    H5G_t	   *ret_value;          /* Return value */
+    H5G_t *ret_value = NULL;            /* Return value */
 
     FUNC_ENTER_PACKAGE
 
@@ -225,7 +194,7 @@ H5G__create(H5F_t *file, H5G_obj_create_t *gcrt_info, hid_t dxpl_id)
 {
     H5G_t	*grp = NULL;	/*new group			*/
     unsigned    oloc_init = 0;  /* Flag to indicate that the group object location was created successfully */
-    H5G_t	*ret_value;	/* Return value */
+    H5G_t *ret_value = NULL;    /* Return value */
 
     FUNC_ENTER_PACKAGE
 
@@ -302,7 +271,7 @@ H5G__open_name(const H5G_loc_t *loc, const char *name, hid_t gapl_id,
     H5O_loc_t   grp_oloc;            	/* Opened object object location */
     hbool_t     loc_found = FALSE;      /* Location at 'name' found */
     H5O_type_t  obj_type;               /* Type of object at location */
-    H5G_t      *ret_value;              /* Return value */
+    H5G_t *ret_value = NULL;            /* Return value */
 
     FUNC_ENTER_PACKAGE
 
@@ -363,7 +332,7 @@ H5G_open(const H5G_loc_t *loc, hid_t dxpl_id)
 {
     H5G_t           *grp = NULL;        /* Group opened */
     H5G_shared_t    *shared_fo;         /* Shared group object */
-    H5G_t           *ret_value;         /* Return value */
+    H5G_t *ret_value = NULL;            /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -503,7 +472,8 @@ done:
 herr_t
 H5G_close(H5G_t *grp)
 {
-    herr_t      ret_value = SUCCEED;       /* Return value */
+    hbool_t	corked;			/* Whether the group is corked or not */
+    herr_t      ret_value = SUCCEED; 	/* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -516,6 +486,14 @@ H5G_close(H5G_t *grp)
     if(0 == grp->shared->fo_count) {
         HDassert(grp != H5G_rootof(H5G_fileof(grp)));
 
+	/* Uncork cache entries with object address tag */
+        if(H5AC_cork(grp->oloc.file, grp->oloc.addr, H5AC__GET_CORKED, &corked) < 0)
+            HGOTO_ERROR(H5E_ATOM, H5E_SYSTEM, FAIL, "unable to retrieve an object's cork status")
+        else if(corked) {
+            if(H5AC_cork(grp->oloc.file, grp->oloc.addr, H5AC__UNCORK, NULL) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_SYSTEM, FAIL, "unable to uncork an object")
+        }
+
         /* Remove the group from the list of opened objects in the file */
         if(H5FO_top_decr(grp->oloc.file, grp->oloc.addr) < 0)
             HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't decrement count for object")
@@ -814,7 +792,7 @@ H5G_iterate(hid_t loc_id, const char *group_name,
     hid_t gid = -1;             /* ID of group to iterate over */
     H5G_t *grp = NULL;          /* Pointer to group data structure to iterate over */
     H5G_iter_appcall_ud_t udata; /* User data for callback */
-    herr_t ret_value;           /* Return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1084,7 +1062,7 @@ H5G_visit(hid_t loc_id, const char *group_name, H5_index_t idx_type,
     H5G_loc_t	loc;                /* Location of group passed in */
     H5G_loc_t	start_loc;          /* Location of starting group */
     unsigned    rc;		    /* Reference count of object    */
-    herr_t      ret_value;          /* Return value */
+    herr_t ret_value = FAIL;        /* Return value */
 
     /* Portably clear udata struct (before FUNC_ENTER) */
     HDmemset(&udata, 0, sizeof(udata));
@@ -1191,3 +1169,97 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5G_visit() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:	H5G_get_create_plist
+ *
+ * Purpose:	Private function for H5Gget_create_plist
+ *
+ * Return:	Success:	ID for a copy of the group creation
+ *				property list.  The property list ID should be
+ *				released by calling H5Pclose().
+ *
+ *		Failure:	FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, October 25, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5G_get_create_plist(H5G_t *grp)
+{
+    H5O_linfo_t         linfo;		        /* Link info message            */
+    htri_t	        ginfo_exists;
+    htri_t	        linfo_exists;
+    htri_t              pline_exists;
+    H5P_genplist_t      *gcpl_plist;
+    H5P_genplist_t      *new_plist;
+    hid_t		new_gcpl_id = FAIL;
+    hid_t		ret_value = FAIL;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Copy the default group creation property list */
+    if(NULL == (gcpl_plist = (H5P_genplist_t *)H5I_object(H5P_LST_GROUP_CREATE_ID_g)))
+         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get default group creation property list")
+    if((new_gcpl_id = H5P_copy_plist(gcpl_plist, TRUE)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to copy the creation property list")
+    if(NULL == (new_plist = (H5P_genplist_t *)H5I_object(new_gcpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
+
+    /* Retrieve any object creation properties */
+    if(H5O_get_create_plist(&grp->oloc, H5AC_ind_dxpl_id, new_plist) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get object creation info")
+
+    /* Check for the group having a group info message */
+    if((ginfo_exists = H5O_msg_exists(&(grp->oloc), H5O_GINFO_ID, H5AC_ind_dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
+    if(ginfo_exists) {
+        H5O_ginfo_t ginfo;		/* Group info message            */
+
+        /* Read the group info */
+        if(NULL == H5O_msg_read(&(grp->oloc), H5O_GINFO_ID, &ginfo, H5AC_ind_dxpl_id))
+            HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get group info")
+
+        /* Set the group info for the property list */
+        if(H5P_set(new_plist, H5G_CRT_GROUP_INFO_NAME, &ginfo) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set group info")
+    } /* end if */
+
+    /* Check for the group having a link info message */
+    if((linfo_exists = H5G__obj_get_linfo(&(grp->oloc), &linfo, H5AC_ind_dxpl_id)) < 0)
+	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header")
+    if(linfo_exists) {
+        /* Set the link info for the property list */
+        if(H5P_set(new_plist, H5G_CRT_LINK_INFO_NAME, &linfo) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set link info")
+    } /* end if */
+
+    /* Check for the group having a pipeline message */
+    if((pline_exists = H5O_msg_exists(&(grp->oloc), H5O_PLINE_ID, H5AC_ind_dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "unable to read object header")
+    if(pline_exists) {
+        H5O_pline_t pline;      /* Pipeline message */
+
+        /* Read the pipeline */
+        if(NULL == H5O_msg_read(&(grp->oloc), H5O_PLINE_ID, &pline, H5AC_ind_dxpl_id))
+            HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get link pipeline")
+
+        /* Set the pipeline for the property list */
+        if(H5P_poke(new_plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set link pipeline")
+    } /* end if */
+
+    /* Set the return value */
+    ret_value = new_gcpl_id;
+
+done:
+    if(ret_value < 0) {
+        if(new_gcpl_id > 0)
+            if(H5I_dec_app_ref(new_gcpl_id) < 0)
+                HDONE_ERROR(H5E_SYM, H5E_CANTDEC, FAIL, "can't free")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5G_get_create_plist() */
diff --git a/src/H5Glink.c b/src/H5Glink.c
index 8b258b5..5a195c8 100644
--- a/src/H5Glink.c
+++ b/src/H5Glink.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+#include "H5Gmodule.h"          /* This source code file is part of the H5G module */
 
 
 /***********/
@@ -159,7 +159,7 @@ H5G_link_cmp_name_dec(const void *lnk1, const void *lnk2)
 static int
 H5G_link_cmp_corder_inc(const void *lnk1, const void *lnk2)
 {
-    int ret_value;              /* Return value */
+    int ret_value = -1;         /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -194,7 +194,7 @@ H5G_link_cmp_corder_inc(const void *lnk1, const void *lnk2)
 static int
 H5G_link_cmp_corder_dec(const void *lnk1, const void *lnk2)
 {
-    int ret_value;              /* Return value */
+    int ret_value = -1;         /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
diff --git a/src/H5Gloc.c b/src/H5Gloc.c
index 677cc25..3fcbd09 100644
--- a/src/H5Gloc.c
+++ b/src/H5Gloc.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+#include "H5Gmodule.h"          /* This source code file is part of the H5G module */
 
 
 /***********/
@@ -259,7 +259,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5G__loc_copy
+ * Function:	H5G_loc_copy
  *
  * Purpose:	Copy over information for a location
  *
@@ -271,11 +271,11 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5G__loc_copy(H5G_loc_t *dst, const H5G_loc_t *src, H5_copy_depth_t depth)
+H5G_loc_copy(H5G_loc_t *dst, const H5G_loc_t *src, H5_copy_depth_t depth)
 {
     herr_t      ret_value = SUCCEED;       /* Return value */
 
-    FUNC_ENTER_PACKAGE
+    FUNC_ENTER_NOAPI(FAIL)
 
     /* Check args. */
     HDassert(dst);
@@ -289,7 +289,7 @@ H5G__loc_copy(H5G_loc_t *dst, const H5G_loc_t *src, H5_copy_depth_t depth)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5G__loc_copy() */
+} /* end H5G_loc_copy() */
 
 

 /*-------------------------------------------------------------------------
@@ -388,7 +388,7 @@ H5G_loc_find_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc/*in*/, const char *name,
     /* (Group traversal callbacks are responsible for either taking ownership
      *  of the group location for the object, or freeing it. - QAK)
      */
-    H5G__loc_copy(udata->loc, obj_loc, H5_COPY_SHALLOW);
+    H5G_loc_copy(udata->loc, obj_loc, H5_COPY_SHALLOW);
     *own_loc = H5G_OWN_OBJ_LOC;
 
 done:
@@ -649,7 +649,7 @@ htri_t
 H5G_loc_exists(const H5G_loc_t *loc, const char *name, hid_t lapl_id, hid_t dxpl_id)
 {
     H5G_loc_exists_t udata;     /* User data for traversal callback */
-    htri_t ret_value;           /* Return value */
+    htri_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -913,7 +913,7 @@ H5G_loc_get_comment(H5G_loc_t *loc, const char *name, char *comment/*out*/,
     size_t bufsize, hid_t lapl_id, hid_t dxpl_id)
 {
     H5G_loc_gc_t udata;         /* User data for traversal callback */
-    ssize_t ret_value;          /* Return value */
+    ssize_t ret_value = -1;     /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
diff --git a/src/H5Gmodule.h b/src/H5Gmodule.h
new file mode 100644
index 0000000..52ac067
--- /dev/null
+++ b/src/H5Gmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5G package.  Including this header means that the source file
+ *		is part of the H5G package.
+ */
+#ifndef _H5Gmodule_H
+#define _H5Gmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5G_MODULE
+#define H5_MY_PKG       H5G
+#define H5_MY_PKG_ERR   H5E_SYM
+#define H5_MY_PKG_INIT  YES
+
+#endif /* _H5Gmodule_H */
+
diff --git a/src/H5Gname.c b/src/H5Gname.c
index 277d08f..aff9d31 100644
--- a/src/H5Gname.c
+++ b/src/H5Gname.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+#include "H5Gmodule.h"          /* This source code file is part of the H5G module */
 
 
 /***********/
@@ -166,7 +166,7 @@ H5G_normalize(const char *name)
     char *norm;         /* Pointer to the normalized string */
     size_t	s,d;    /* Positions within the strings */
     unsigned    last_slash;     /* Flag to indicate last character was a slash */
-    char *ret_value;    /* Return value */
+    char *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -297,7 +297,7 @@ H5G_build_fullpath(const char *prefix, const char *name)
     size_t path_len;            /* Length of the path */
     size_t name_len;            /* Length of the name */
     unsigned need_sep;          /* Flag to indicate if separator is needed */
-    H5RS_str_t *ret_value;      /* Return value */
+    H5RS_str_t *ret_value = NULL;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -354,7 +354,7 @@ H5RS_str_t *
 H5G_build_fullpath_refstr_str(H5RS_str_t *prefix_r, const char *name)
 {
     const char *prefix;         /* Pointer to raw string for path */
-    H5RS_str_t *ret_value;
+    H5RS_str_t *ret_value = NULL;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -565,7 +565,7 @@ H5G_get_name(const H5G_loc_t *loc, char *name/*out*/, size_t size,
     hbool_t *cached, hid_t lapl_id, hid_t dxpl_id)
 {
     ssize_t len = 0;            /* Length of object's name */
-    ssize_t ret_value;          /* Return value */
+    ssize_t ret_value = -1;     /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1292,7 +1292,7 @@ H5G_get_name_by_addr(hid_t file, hid_t lapl_id, hid_t dxpl_id, const H5O_loc_t *
     H5G_loc_t root_loc;         /* Root group's location */
     hbool_t found_obj = FALSE;  /* If we found the object */
     herr_t status;              /* Status from iteration */
-    ssize_t ret_value;          /* Return value */
+    ssize_t ret_value = -1;     /* Return value */
 
     /* Portably clear udata struct (before FUNC_ENTER) */
     HDmemset(&udata, 0, sizeof(udata));
@@ -1349,4 +1349,3 @@ done:
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5G_get_name_by_addr() */
-
diff --git a/src/H5Gnode.c b/src/H5Gnode.c
index e6ec886..4d299dc 100644
--- a/src/H5Gnode.c
+++ b/src/H5Gnode.c
@@ -31,7 +31,7 @@
 /* Module Setup */
 /****************/
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg   */
+#include "H5Gmodule.h"          /* This source code file is part of the H5G module */
 
 
 /***********/
@@ -77,7 +77,7 @@ typedef struct H5G_node_key_t {
 /********************/
 
 /* B-tree callbacks */
-static H5RC_t *H5G_node_get_shared(const H5F_t *f, const void *_udata);
+static H5UC_t *H5G_node_get_shared(const H5F_t *f, const void *_udata);
 static herr_t H5G_node_create(H5F_t *f, hid_t dxpl_id, H5B_ins_t op, void *_lt_key,
 			      void *_udata, void *_rt_key,
 			      haddr_t *addr_p/*out*/);
@@ -119,7 +119,7 @@ H5B_class_t H5B_SNODE[1] = {{
     H5G_node_remove,		/*remove		*/
     H5G_node_decode_key,	/*decode		*/
     H5G_node_encode_key,	/*encode		*/
-    H5G_node_debug_key,		/*debug			*/
+    H5G_node_debug_key		/*debug			*/
 }};
 
 /* Declare a free list to manage the H5G_node_t struct */
@@ -156,7 +156,7 @@ H5FL_SEQ_DEFINE(H5G_entry_t);
  *
  *-------------------------------------------------------------------------
  */
-static H5RC_t *
+static H5UC_t *
 H5G_node_get_shared(const H5F_t *f, const void H5_ATTR_UNUSED *_udata)
 {
     FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -404,7 +404,7 @@ H5G_node_cmp2(void *_lt_key, void *_udata, void *_rt_key)
     H5G_node_key_t	   *rt_key = (H5G_node_key_t *) _rt_key;
     const char		   *s1, *s2;
     const char		   *base;           /* Base of heap */
-    int		           ret_value;
+    int		           ret_value = -1;  /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -541,7 +541,7 @@ H5G_node_found(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void H5_ATTR_UNUSED
     /*
      * Load the symbol table node for exclusive access.
      */
-    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_READ)))
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, FAIL, "unable to protect symbol table node")
 
     /* Get base address of heap */
@@ -647,7 +647,7 @@ H5G_node_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr,
     /*
      * Load the symbol node.
      */
-    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_WRITE)))
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC__NO_FLAGS_SET)))
 	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5B_INS_ERROR, "unable to protect symbol table node")
 
     /* Get base address of heap */
@@ -691,7 +691,7 @@ H5G_node_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr,
 	if(H5G_node_create(f, dxpl_id, H5B_INS_FIRST, NULL, NULL, NULL, new_node_p/*out*/) < 0)
 	    HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, H5B_INS_ERROR, "unable to split symbol table node")
 
-	if(NULL == (snrt = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, *new_node_p, f, H5AC_WRITE)))
+	if(NULL == (snrt = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, *new_node_p, f, H5AC__NO_FLAGS_SET)))
 	    HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5B_INS_ERROR, "unable to split symbol table node")
 
 	HDmemcpy(snrt->entry, sn->entry + H5F_SYM_LEAF_K(f),
@@ -808,7 +808,7 @@ H5G_node_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key/*in,out*/,
     HDassert(udata && udata->common.heap);
 
     /* Load the symbol table */
-    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_WRITE)))
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC__NO_FLAGS_SET)))
 	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5B_INS_ERROR, "unable to protect symbol table node")
 
     /* "Normal" removal of a single entry from the symbol table node */
@@ -1001,7 +1001,7 @@ H5G__node_iterate(H5F_t *f, hid_t dxpl_id, const void H5_ATTR_UNUSED *_lt_key, h
     HDassert(udata && udata->heap);
 
     /* Protect the symbol table node & local heap while we iterate over entries */
-    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_READ)))
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5_ITER_ERROR, "unable to load symbol table node")
 
     /*
@@ -1078,7 +1078,7 @@ H5G__node_sumup(H5F_t *f, hid_t dxpl_id, const void H5_ATTR_UNUSED *_lt_key, had
     HDassert(num_objs);
 
     /* Find the object node and add the number of symbol entries. */
-    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_READ)))
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5_ITER_ERROR, "unable to load symbol table node")
 
     *num_objs += sn->nsyms;
@@ -1123,7 +1123,7 @@ H5G__node_by_idx(H5F_t *f, hid_t dxpl_id, const void H5_ATTR_UNUSED *_lt_key, ha
     HDassert(udata);
 
     /* Get a pointer to the symbol table node */
-    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_READ)))
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5_ITER_ERROR, "unable to load symbol table node");
 
     /* Find the node, locate the object symbol table entry and retrieve the name */
@@ -1189,7 +1189,7 @@ H5G__node_init(H5F_t *f)
         /* <none> */
 
     /* Make shared B-tree info reference counted */
-    if(H5F_SET_GRP_BTREE_SHARED(f, H5RC_create(shared, H5B_shared_free)) < 0)
+    if(H5F_SET_GRP_BTREE_SHARED(f, H5UC_create(shared, H5B_shared_free)) < 0)
 	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't create ref-count wrapper for shared B-tree info")
 
 done:
@@ -1222,7 +1222,7 @@ H5G_node_close(const H5F_t *f)
 
     /* Free the raw B-tree node buffer */
     if(H5F_GRP_BTREE_SHARED(f))
-        H5RC_DEC(H5F_GRP_BTREE_SHARED(f));
+        H5UC_DEC(H5F_GRP_BTREE_SHARED(f));
 
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5G_node_close */
@@ -1261,11 +1261,11 @@ H5G__node_copy(H5F_t *f, hid_t dxpl_id, const void H5_ATTR_UNUSED *_lt_key, hadd
     HDassert(udata);
 
     /* load the symbol table into memory from the source file */
-    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_READ)))
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5_ITER_ERROR, "unable to load symbol table node")
 
     /* get the base address of the heap */
-    if(NULL == (heap = H5HL_protect(f, dxpl_id, udata->src_heap_addr, H5AC_READ)))
+    if(NULL == (heap = H5HL_protect(f, dxpl_id, udata->src_heap_addr, H5AC__READ_ONLY_FLAG)))
        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, H5_ITER_ERROR, "unable to protect symbol name")
 
     /* copy object in this node one by one */
@@ -1359,12 +1359,19 @@ H5G__node_copy(H5F_t *f, hid_t dxpl_id, const void H5_ATTR_UNUSED *_lt_key, hadd
         name = (const char *)H5HL_offset_into(heap, src_ent->name_off);
 	HDassert(name);
 
+        /* Set copied metadata tag */
+        H5_BEGIN_TAG(dxpl_id, H5AC__COPIED_TAG, H5_ITER_ERROR);
+
         /* Insert the new object in the destination file's group */
         /* (Don't increment the link count - that's already done above for hard links) */
         if(H5G__stab_insert_real(udata->dst_file, udata->dst_stab, name, &lnk,
                 obj_type, (obj_type == H5O_TYPE_GROUP ? &gcrt_info : NULL),
                 dxpl_id) < 0)
-            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5_ITER_ERROR, "unable to insert the name")
+            HGOTO_ERROR_TAG(H5E_DATATYPE, H5E_CANTINIT, H5_ITER_ERROR, "unable to insert the name")
+
+        /* Reset metadata tag */
+        H5_END_TAG(H5_ITER_ERROR);
+
     } /* end of for (i=0; i<sn->nsyms; i++) */
 
 done:
@@ -1413,7 +1420,7 @@ H5G__node_build_table(H5F_t *f, hid_t dxpl_id, const void H5_ATTR_UNUSED *_lt_ke
      * Save information about the symbol table node since we can't lock it
      * because we're about to call an application function.
      */
-    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_READ)))
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5_ITER_ERROR, "unable to load symbol table node")
 
     /* Check if the link table needs to be extended */
@@ -1520,14 +1527,14 @@ H5G_node_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent,
 
     /* Pin the heap down in memory */
     if(heap_addr > 0 && H5F_addr_defined(heap_addr))
-        if(NULL == (heap = H5HL_protect(f, dxpl_id, heap_addr, H5AC_READ)))
+        if(NULL == (heap = H5HL_protect(f, dxpl_id, heap_addr, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, FAIL, "unable to protect symbol table heap")
 
     /*
      * If we couldn't load the symbol table node, then try loading the
      * B-tree node.
      */
-    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_READ))) {
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC__READ_ONLY_FLAG))) {
         H5G_bt_common_t	udata;		/*data to pass through B-tree	*/
 
         H5E_clear_stack(NULL); /* discard that error */
diff --git a/src/H5Gobj.c b/src/H5Gobj.c
index f9ef67d..92ad0af 100644
--- a/src/H5Gobj.c
+++ b/src/H5Gobj.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg  */
+#include "H5Gmodule.h"          /* This source code file is part of the H5G module */
 
 
 /***********/
@@ -59,6 +59,7 @@
  */
 typedef struct {
     H5F_t      *f;              /* Pointer to file for insertion */
+    haddr_t     oh_addr;        /* Address of the object header */
     hid_t       dxpl_id;        /* DXPL during insertion */
     H5O_linfo_t *linfo;         /* Pointer to link info */
 } H5G_obj_oh_it_ud1_t;
@@ -155,7 +156,7 @@ H5G__obj_create(H5F_t *f, hid_t dxpl_id, H5G_obj_create_t *gcrt_info,
         HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get group info")
 
     /* Get the pipeline property */
-    if(H5P_get(gc_plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_peek(gc_plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get group info")
 
     /* Call the "real" group creation routine now */
@@ -207,7 +208,7 @@ H5G__obj_create_real(H5F_t *f, hid_t dxpl_id, const H5O_ginfo_t *ginfo,
 
     /* Check for using the latest version of the group format */
     /* (add more checks for creating "new format" groups when needed) */
-    if(H5F_USE_LATEST_FORMAT(f) || linfo->track_corder
+    if(H5F_USE_LATEST_FLAGS(f, H5F_LATEST_STYLE_GROUP) || linfo->track_corder
             || (pline && pline->nused))
         use_latest_format = TRUE;
     else
@@ -319,10 +320,10 @@ done:
 htri_t
 H5G__obj_get_linfo(const H5O_loc_t *grp_oloc, H5O_linfo_t *linfo, hid_t dxpl_id)
 {
-    H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for name index */
-    htri_t ret_value;           /* Return value */
+    H5B2_t *bt2_name = NULL;    /* v2 B-tree handle for name index */
+    htri_t ret_value = FAIL;    /* Return value */
 
-    FUNC_ENTER_PACKAGE
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, grp_oloc->addr, FAIL)
 
     /* check arguments */
     HDassert(grp_oloc);
@@ -362,7 +363,7 @@ done:
     if(bt2_name && H5B2_close(bt2_name, dxpl_id) < 0)
         HDONE_ERROR(H5E_SYM, H5E_CLOSEERROR, FAIL, "can't close v2 B-tree for name index")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5G__obj_get_linfo() */
 
 

@@ -387,7 +388,7 @@ H5G_obj_compact_to_dense_cb(const void *_mesg, unsigned H5_ATTR_UNUSED idx, void
     H5G_obj_oh_it_ud1_t *udata = (H5G_obj_oh_it_ud1_t *)_udata;     /* 'User data' passed in */
     herr_t ret_value = H5_ITER_CONT;   /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(udata->dxpl_id, udata->oh_addr, FAIL)
 
     /* check arguments */
     HDassert(lnk);
@@ -398,7 +399,7 @@ H5G_obj_compact_to_dense_cb(const void *_mesg, unsigned H5_ATTR_UNUSED idx, void
         HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "unable to insert link into dense storage")
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5G_obj_compact_to_dense_cb() */
 
 

@@ -468,7 +469,7 @@ H5G_obj_insert(const H5O_loc_t *grp_oloc, const char *name, H5O_link_t *obj_lnk,
     hbool_t use_new_dense = FALSE;      /* Whether to use "dense" form of 'new format' group */
     herr_t ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, grp_oloc->addr, FAIL)
 
     /* check arguments */
     HDassert(grp_oloc && grp_oloc->file);
@@ -532,6 +533,7 @@ H5G_obj_insert(const H5O_loc_t *grp_oloc, const char *name, H5O_link_t *obj_lnk,
 
             /* Set up user data for object header message iteration */
             udata.f = grp_oloc->file;
+            udata.oh_addr = grp_oloc->addr;
             udata.dxpl_id = dxpl_id;
             udata.linfo = &linfo;
 
@@ -638,7 +640,7 @@ done:
     if(pline && H5O_msg_reset(H5O_PLINE_ID, pline) < 0)
         HDONE_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "can't release pipeline")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5G_obj_insert() */
 
 

@@ -664,9 +666,9 @@ H5G__obj_iterate(const H5O_loc_t *grp_oloc,
 {
     H5O_linfo_t	linfo;		/* Link info message */
     htri_t linfo_exists;        /* Whether the link info message exists */
-    herr_t ret_value;           /* Return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
-    FUNC_ENTER_PACKAGE
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, grp_oloc->addr, FAIL)
 
     /* Sanity check */
     HDassert(grp_oloc);
@@ -709,7 +711,7 @@ H5G__obj_iterate(const H5O_loc_t *grp_oloc,
     } /* end else */
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5G__obj_iterate() */
 
 

@@ -811,9 +813,9 @@ H5G_obj_get_name_by_idx(const H5O_loc_t *oloc, H5_index_t idx_type,
 {
     H5O_linfo_t	linfo;		/* Link info message */
     htri_t linfo_exists;        /* Whether the link info message exists */
-    ssize_t ret_value;          /* Return value */
+    ssize_t ret_value = -1;     /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, oloc->addr, FAIL)
 
     /* Sanity check */
     HDassert(oloc && oloc->file);
@@ -852,7 +854,7 @@ H5G_obj_get_name_by_idx(const H5O_loc_t *oloc, H5_index_t idx_type,
     } /* end else */
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5G_obj_get_name_by_idx() */
 
 

@@ -986,7 +988,7 @@ H5G_obj_remove(const H5O_loc_t *oloc, H5RS_str_t *grp_full_path_r, const char *n
     hbool_t     use_old_format; /* Whether to use 'old format' (symbol table) for deletion or not */
     herr_t	ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, oloc->addr, FAIL)
 
     /* Sanity check */
     HDassert(oloc);
@@ -1026,7 +1028,7 @@ H5G_obj_remove(const H5O_loc_t *oloc, H5RS_str_t *grp_full_path_r, const char *n
             HGOTO_ERROR(H5E_SYM, H5E_CANTUPDATE, FAIL, "unable to update link info")
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5G_obj_remove() */
 
 

@@ -1052,7 +1054,7 @@ H5G_obj_remove_by_idx(const H5O_loc_t *grp_oloc, H5RS_str_t *grp_full_path_r,
     hbool_t     use_old_format; /* Whether to use 'old format' (symbol table) for deletion or not */
     herr_t	ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, grp_oloc->addr, FAIL)
 
     /* Sanity check */
     HDassert(grp_oloc && grp_oloc->file);
@@ -1103,7 +1105,7 @@ H5G_obj_remove_by_idx(const H5O_loc_t *grp_oloc, H5RS_str_t *grp_full_path_r,
     } /* end if */
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5G_obj_remove() */
 
 

@@ -1128,7 +1130,7 @@ H5G__obj_lookup(const H5O_loc_t *grp_oloc, const char *name, H5O_link_t *lnk,
     htri_t linfo_exists;                /* Whether the link info message exists */
     htri_t     ret_value = FALSE;       /* Return value */
 
-    FUNC_ENTER_PACKAGE
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, grp_oloc->addr, FAIL)
 
     /* check arguments */
     HDassert(grp_oloc && grp_oloc->file);
@@ -1157,7 +1159,7 @@ H5G__obj_lookup(const H5O_loc_t *grp_oloc, const char *name, H5O_link_t *lnk,
     } /* end else */
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5G__obj_lookup() */
 
 

@@ -1183,7 +1185,7 @@ H5G_obj_lookup_by_idx(const H5O_loc_t *grp_oloc, H5_index_t idx_type,
     htri_t linfo_exists;                /* Whether the link info message exists */
     herr_t     ret_value = SUCCEED;     /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, grp_oloc->addr, FAIL)
 
     /* check arguments */
     HDassert(grp_oloc && grp_oloc->file);
@@ -1222,6 +1224,6 @@ H5G_obj_lookup_by_idx(const H5O_loc_t *grp_oloc, H5_index_t idx_type,
     } /* end else */
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5G_obj_lookup_by_idx() */
 
diff --git a/src/H5Goh.c b/src/H5Goh.c
index 7b63e52..bde540c 100644
--- a/src/H5Goh.c
+++ b/src/H5Goh.c
@@ -17,8 +17,8 @@
 /* Module Setup */
 /****************/
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+#include "H5Gmodule.h"          /* This source code file is part of the H5G module */
+#define H5O_FRIEND		/*suppress error about including H5Opkg	  */
 
 
 /***********/
@@ -53,7 +53,7 @@ static hid_t H5O_group_open(const H5G_loc_t *obj_loc, hid_t lapl_id,
 static void *H5O_group_create(H5F_t *f, void *_crt_info, H5G_loc_t *obj_loc,
     hid_t dxpl_id);
 static H5O_loc_t *H5O_group_get_oloc(hid_t obj_id);
-static herr_t H5O_group_bh_info(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
+static herr_t H5O_group_bh_info(const H5O_loc_t *loc, hid_t dxpl_id, H5O_t *oh,
     H5_ih_info_t *bh_info);
 
 
@@ -107,7 +107,7 @@ H5FL_DEFINE(H5G_copy_file_ud_t);
 static void *
 H5O_group_get_copy_file_udata(void)
 {
-    void *ret_value;       /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -177,7 +177,7 @@ H5O_group_isa(struct H5O_t *oh)
 {
     htri_t	stab_exists;            /* Whether the 'stab' message is in the object header */
     htri_t	linfo_exists;           /* Whether the 'linfo' message is in the object header */
-    htri_t	ret_value;              /* Return value */
+    htri_t	ret_value = FAIL;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -213,7 +213,7 @@ static hid_t
 H5O_group_open(const H5G_loc_t *obj_loc, hid_t H5_ATTR_UNUSED lapl_id, hid_t dxpl_id, hbool_t app_ref)
 {
     H5G_t       *grp = NULL;            /* Group opened */
-    hid_t	ret_value;              /* Return value */
+    hid_t	ret_value = H5I_INVALID_HID;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -254,7 +254,7 @@ H5O_group_create(H5F_t *f, void *_crt_info, H5G_loc_t *obj_loc, hid_t dxpl_id)
 {
     H5G_obj_create_t *crt_info = (H5G_obj_create_t *)_crt_info; /* Group creation parameters */
     H5G_t *grp = NULL;          /* New group created */
-    void *ret_value;            /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -302,7 +302,7 @@ static H5O_loc_t *
 H5O_group_get_oloc(hid_t obj_id)
 {
     H5G_t       *grp;                   /* Group opened */
-    H5O_loc_t	*ret_value;             /* Return value */
+    H5O_loc_t	*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -333,7 +333,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_group_bh_info(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5_ih_info_t *bh_info)
+H5O_group_bh_info(const H5O_loc_t *loc, hid_t dxpl_id, H5O_t *oh, H5_ih_info_t *bh_info)
 {
     htri_t	exists;                 /* Flag if header message of interest exists */
     H5HF_t      *fheap = NULL;          /* Fractal heap handle */
@@ -341,10 +341,12 @@ H5O_group_bh_info(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5_ih_info_t *bh_info)
     H5B2_t      *bt2_corder = NULL;     /* v2 B-tree handle for creation order index */
     herr_t      ret_value = SUCCEED;  	/* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, oh->cache_info.addr, FAIL)
 
     /* Sanity check */
-    HDassert(f);
+    HDassert(loc);
+    HDassert(loc->file);
+    HDassert(H5F_addr_defined(loc->addr));
     HDassert(oh);
     HDassert(bh_info);
 
@@ -355,13 +357,13 @@ H5O_group_bh_info(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5_ih_info_t *bh_info)
         H5O_linfo_t linfo;          	/* Link info message */
 
         /* Get "new style" group info */
-        if(NULL == H5O_msg_read_oh(f, dxpl_id, oh, H5O_LINFO_ID, &linfo))
+        if(NULL == H5O_msg_read_oh(loc->file, dxpl_id, oh, H5O_LINFO_ID, &linfo))
 	    HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't read LINFO message")
 
         /* Check if name index available */
         if(H5F_addr_defined(linfo.name_bt2_addr)) {
             /* Open the name index v2 B-tree */
-            if(NULL == (bt2_name = H5B2_open(f, dxpl_id, linfo.name_bt2_addr, NULL)))
+            if(NULL == (bt2_name = H5B2_open(loc->file, dxpl_id, linfo.name_bt2_addr, NULL)))
                 HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
 
             /* Get name index B-tree size */
@@ -372,7 +374,7 @@ H5O_group_bh_info(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5_ih_info_t *bh_info)
         /* Check if creation order index available */
 	if(H5F_addr_defined(linfo.corder_bt2_addr)) {
             /* Open the creation order index v2 B-tree */
-            if(NULL == (bt2_corder = H5B2_open(f, dxpl_id, linfo.corder_bt2_addr, NULL)))
+            if(NULL == (bt2_corder = H5B2_open(loc->file, dxpl_id, linfo.corder_bt2_addr, NULL)))
                 HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for creation order index")
 
             /* Get creation order index B-tree size */
@@ -383,7 +385,7 @@ H5O_group_bh_info(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5_ih_info_t *bh_info)
         /* Get fractal heap size, if available */
         if(H5F_addr_defined(linfo.fheap_addr)) {
             /* Open the fractal heap for links */
-            if(NULL == (fheap = H5HF_open(f, dxpl_id, linfo.fheap_addr)))
+            if(NULL == (fheap = H5HF_open(loc->file, dxpl_id, linfo.fheap_addr)))
                 HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
 
             /* Get heap storage size */
@@ -395,11 +397,11 @@ H5O_group_bh_info(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5_ih_info_t *bh_info)
         H5O_stab_t          stab;       	/* Info about symbol table */
 
         /* Must be "old style" group, get symbol table message */
-        if(NULL == H5O_msg_read_oh(f, dxpl_id, oh, H5O_STAB_ID, &stab))
+        if(NULL == H5O_msg_read_oh(loc->file, dxpl_id, oh, H5O_STAB_ID, &stab))
 	    HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't find LINFO nor STAB messages")
 
         /* Get symbol table size info */
-        if(H5G__stab_bh_size(f, dxpl_id, &stab, bh_info) < 0)
+        if(H5G__stab_bh_size(loc->file, dxpl_id, &stab, bh_info) < 0)
             HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve symbol table size info")
     } /* end else */
 
@@ -412,6 +414,6 @@ done:
     if(bt2_corder && H5B2_close(bt2_corder, dxpl_id) < 0)
         HDONE_ERROR(H5E_SYM, H5E_CANTCLOSEOBJ, FAIL, "can't close v2 B-tree for creation order index")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5O_group_bh_info() */
 
diff --git a/src/H5Gpkg.h b/src/H5Gpkg.h
index b194adb..4cb6f9b 100644
--- a/src/H5Gpkg.h
+++ b/src/H5Gpkg.h
@@ -21,7 +21,7 @@
  *              only within the H5G package. Source files outside the
  *              H5G package should include H5Gprivate.h instead.
  */
-#ifndef H5G_PACKAGE
+#if !(defined H5G_FRIEND || defined H5G_MODULE)
 #error "Do not include this file outside the H5G package!"
 #endif
 
@@ -55,7 +55,7 @@
     + 2         /* Number of symbols */                                       \
                                                                               \
     /* Entries */                                                             \
-    + ((2 * H5F_SYM_LEAF_K(f)) * H5G_SIZEOF_ENTRY(f))                         \
+    + ((2 * H5F_SYM_LEAF_K(f)) * H5G_SIZEOF_ENTRY_FILE(f))                    \
     )
 
 
@@ -351,8 +351,6 @@ H5_DLL herr_t H5G__traverse_special(const H5G_loc_t *grp_loc,
 /*
  * Utility functions
  */
-H5_DLL herr_t H5G__init(void);
-H5_DLL herr_t H5G__term_deprec_interface(void);
 H5_DLL const char *H5G__component(const char *name, size_t *size_p);
 
 /*
@@ -518,7 +516,6 @@ H5_DLL herr_t H5G__name_init(H5G_name_t *name, const char *path);
 /*
  * These functions operate on group "locations"
  */
-H5_DLL herr_t H5G__loc_copy(H5G_loc_t *dst, const H5G_loc_t *src, H5_copy_depth_t depth);
 H5_DLL herr_t H5G__loc_insert(H5G_loc_t *grp_loc, const char *name,
     H5G_loc_t *obj_loc, H5O_type_t obj_type, const void *crt_info, hid_t dxpl_id);
 
diff --git a/src/H5Gprivate.h b/src/H5Gprivate.h
index 50f8bda..1ab5522 100644
--- a/src/H5Gprivate.h
+++ b/src/H5Gprivate.h
@@ -47,12 +47,14 @@
  * The disk size for a symbol table entry...
  */
 #define H5G_SIZEOF_SCRATCH      16
-#define H5G_SIZEOF_ENTRY(F)                                                   \
-   (H5F_SIZEOF_SIZE(F) +        /*offset of name into heap              */    \
-    H5F_SIZEOF_ADDR(F) +        /*address of object header              */    \
+#define H5G_SIZEOF_ENTRY(sizeof_addr, sizeof_size)                            \
+   ((sizeof_size) +             /*offset of name into heap              */    \
+    (sizeof_addr) +             /*address of object header              */    \
     4 +                         /*entry type                            */    \
     4 +				/*reserved				*/    \
     H5G_SIZEOF_SCRATCH)         /*scratch pad space                     */
+#define H5G_SIZEOF_ENTRY_FILE(F)                                              \
+    H5G_SIZEOF_ENTRY(H5F_SIZEOF_ADDR(F), H5F_SIZEOF_SIZE(F))
 
 /* ========= Group Creation properties ============ */
 
@@ -99,11 +101,11 @@
                                                 }
 
 /* If the module using this macro is allowed access to the private variables, access them directly */
-#ifdef H5G_PACKAGE
+#ifdef H5G_MODULE
 #define H5G_MOUNTED(G)              ((G)->shared->mounted)
-#else /* H5G_PACKAGE */
+#else /* H5G_MODULE */
 #define H5G_MOUNTED(G)              (H5G_mounted(G))
-#endif /* H5G_PACKAGE */
+#endif /* H5G_MODULE */
 
 /*
  * During name lookups (see H5G_traverse()) we sometimes want information about
@@ -278,6 +280,7 @@ H5_DLL H5RS_str_t *H5G_build_fullpath_refstr_str(H5RS_str_t *path_r, const char
  * These functions operate on group "locations"
  */
 H5_DLL herr_t H5G_loc(hid_t loc_id, H5G_loc_t *loc);
+H5_DLL herr_t H5G_loc_copy(H5G_loc_t *dst, const H5G_loc_t *src, H5_copy_depth_t depth);
 H5_DLL herr_t H5G_loc_find(const H5G_loc_t *loc, const char *name,
     H5G_loc_t *obj_loc/*out*/, hid_t lapl_id, hid_t dxpl_id);
 H5_DLL herr_t H5G_loc_find_by_idx(H5G_loc_t *loc, const char *group_name,
diff --git a/src/H5Gpublic.h b/src/H5Gpublic.h
index 5b8b054..9d8ade5 100644
--- a/src/H5Gpublic.h
+++ b/src/H5Gpublic.h
@@ -84,6 +84,8 @@ H5_DLL herr_t H5Gget_info_by_idx(hid_t loc_id, const char *group_name,
     H5_index_t idx_type, H5_iter_order_t order, hsize_t n, H5G_info_t *ginfo,
     hid_t lapl_id);
 H5_DLL herr_t H5Gclose(hid_t group_id);
+H5_DLL herr_t H5Gflush(hid_t group_id);
+H5_DLL herr_t H5Grefresh(hid_t group_id);
 
 /* Symbols defined for compatibility with previous versions of the HDF5 API.
  *
diff --git a/src/H5Groot.c b/src/H5Groot.c
index 5ec9d3a..ba25f31 100644
--- a/src/H5Groot.c
+++ b/src/H5Groot.c
@@ -28,8 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg  */
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
+#include "H5Gmodule.h"          /* This source code file is part of the H5G module */
 
 
 /***********/
diff --git a/src/H5Gstab.c b/src/H5Gstab.c
index 446d940..27fa67a 100644
--- a/src/H5Gstab.c
+++ b/src/H5Gstab.c
@@ -22,7 +22,7 @@
 /* Module Setup */
 /****************/
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+#include "H5Gmodule.h"          /* This source code file is part of the H5G module */
 
 
 /***********/
@@ -152,20 +152,20 @@ H5G__stab_create_components(H5F_t *f, H5O_stab_t *stab, size_t size_hint, hid_t
     HDassert(size_hint > 0);
 
     /* Create the B-tree */
-    if(H5B_create(f, dxpl_id, H5B_SNODE, NULL, &(stab->btree_addr)/*out*/) < 0)
-	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create B-tree")
+    if(FAIL == H5B_create(f, dxpl_id, H5B_SNODE, NULL, &(stab->btree_addr)/*out*/))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create B-tree")
 
     /* Create symbol table private heap */
-    if(H5HL_create(f, dxpl_id, size_hint, &(stab->heap_addr)/*out*/) < 0)
-	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create heap")
+    if(FAIL == H5HL_create(f, dxpl_id, size_hint, &(stab->heap_addr)/*out*/))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create heap")
 
     /* Pin the heap down in memory */
-    if(NULL == (heap = H5HL_protect(f, dxpl_id, stab->heap_addr, H5AC_WRITE)))
+    if(NULL == (heap = H5HL_protect(f, dxpl_id, stab->heap_addr, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
 
     /* Insert name into the heap */
-    if((size_t)(-1) == (name_offset = H5HL_insert(f, dxpl_id, heap, (size_t)1, "")))
-	HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "can't insert name into heap")
+    if(UFAIL == (name_offset = H5HL_insert(f, dxpl_id, heap, (size_t)1, "")))
+        HGOTO_ERROR(H5E_SYM, H5E_CANTINSERT, FAIL, "can't insert name into heap")
 
     /*
      * B-tree's won't work if the first name isn't at the beginning
@@ -175,7 +175,7 @@ H5G__stab_create_components(H5F_t *f, H5O_stab_t *stab, size_t size_hint, hid_t
 
 done:
     /* Release resources */
-    if(heap && H5HL_unprotect(heap) < 0)
+    if(heap && FAIL == H5HL_unprotect(heap))
         HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to unprotect symbol table heap")
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -210,7 +210,7 @@ H5G__stab_create(H5O_loc_t *grp_oloc, hid_t dxpl_id, const H5O_ginfo_t *ginfo,
     size_t      size_hint;              /* Local heap size hint */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_PACKAGE
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, grp_oloc->addr, FAIL)
 
     /*
      * Check arguments.
@@ -239,7 +239,7 @@ H5G__stab_create(H5O_loc_t *grp_oloc, hid_t dxpl_id, const H5O_ginfo_t *ginfo,
 	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create message")
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5G__stab_create() */
 
 

@@ -276,7 +276,7 @@ H5G__stab_insert_real(H5F_t *f, const H5O_stab_t *stab, const char *name,
     HDassert(obj_lnk);
 
     /* Pin the heap down in memory */
-    if(NULL == (heap = H5HL_protect(f, dxpl_id, stab->heap_addr, H5AC_WRITE)))
+    if(NULL == (heap = H5HL_protect(f, dxpl_id, stab->heap_addr, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
 
     /* Initialize data to pass through B-tree */
@@ -322,7 +322,7 @@ H5G__stab_insert(const H5O_loc_t *grp_oloc, const char *name,
     H5O_stab_t		stab;		/* Symbol table message		*/
     herr_t              ret_value = SUCCEED;       /* Return value */
 
-    FUNC_ENTER_PACKAGE
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, grp_oloc->addr, FAIL)
 
     /* check arguments */
     HDassert(grp_oloc && grp_oloc->file);
@@ -338,7 +338,7 @@ H5G__stab_insert(const H5O_loc_t *grp_oloc, const char *name,
         HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5_ITER_ERROR, "unable to insert the name")
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, H5_ITER_ERROR)
 } /* end H5G__stab_insert() */
 
 

@@ -373,7 +373,7 @@ H5G__stab_remove(const H5O_loc_t *loc, hid_t dxpl_id, H5RS_str_t *grp_full_path_
         HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "not a symbol table")
 
     /* Pin the heap down in memory */
-    if(NULL == (heap = H5HL_protect(loc->file, dxpl_id, stab.heap_addr, H5AC_WRITE)))
+    if(NULL == (heap = H5HL_protect(loc->file, dxpl_id, stab.heap_addr, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
 
     /* Initialize data to pass through B-tree */
@@ -431,7 +431,7 @@ H5G__stab_remove_by_idx(const H5O_loc_t *grp_oloc, hid_t dxpl_id, H5RS_str_t *gr
         HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "not a symbol table")
 
     /* Pin the heap down in memory */
-    if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC_WRITE)))
+    if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
 
     /* Initialize data to pass through B-tree */
@@ -485,7 +485,7 @@ H5G__stab_delete(H5F_t *f, hid_t dxpl_id, const H5O_stab_t *stab)
     HDassert(H5F_addr_defined(stab->heap_addr));
 
     /* Pin the heap down in memory */
-    if(NULL == (heap = H5HL_protect(f, dxpl_id, stab->heap_addr, H5AC_WRITE)))
+    if(NULL == (heap = H5HL_protect(f, dxpl_id, stab->heap_addr, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
 
     /* Set up user data for B-tree deletion */
@@ -533,9 +533,9 @@ H5G__stab_iterate(const H5O_loc_t *oloc, hid_t dxpl_id, H5_iter_order_t order,
     H5HL_t *heap = NULL;                        /* Local heap for group */
     H5O_stab_t stab;		                /* Info about symbol table */
     H5G_link_table_t ltable = {0, NULL};        /* Link table */
-    herr_t ret_value;                           /* Return value */
+    herr_t ret_value = FAIL;                    /* Return value */
 
-    FUNC_ENTER_PACKAGE
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, oloc->addr, FAIL)
 
     /* Sanity check */
     HDassert(oloc);
@@ -546,7 +546,7 @@ H5G__stab_iterate(const H5O_loc_t *oloc, hid_t dxpl_id, H5_iter_order_t order,
 	HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to determine local heap address")
 
     /* Pin the heap down in memory */
-    if(NULL == (heap = H5HL_protect(oloc->file, dxpl_id, stab.heap_addr, H5AC_READ)))
+    if(NULL == (heap = H5HL_protect(oloc->file, dxpl_id, stab.heap_addr, H5AC__READ_ONLY_FLAG)))
         HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
 
     /* Check on iteration order */
@@ -602,7 +602,7 @@ done:
     if(ltable.lnks && H5G__link_release_table(&ltable) < 0)
         HDONE_ERROR(H5E_SYM, H5E_CANTFREE, FAIL, "unable to release link table")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5G__stab_iterate() */
 
 

@@ -624,7 +624,7 @@ H5G__stab_count(H5O_loc_t *oloc, hsize_t *num_objs, hid_t dxpl_id)
     H5O_stab_t		stab;		        /* Info about symbol table */
     herr_t		ret_value = SUCCEED;
 
-    FUNC_ENTER_PACKAGE
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, oloc->addr, FAIL)
 
     /* Sanity check */
     HDassert(oloc);
@@ -642,7 +642,7 @@ H5G__stab_count(H5O_loc_t *oloc, hsize_t *num_objs, hid_t dxpl_id)
         HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "iteration operator failed")
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5G__stab_count() */
 
 

@@ -751,7 +751,7 @@ H5G__stab_get_name_by_idx(const H5O_loc_t *oloc, H5_iter_order_t order, hsize_t
     H5O_stab_t	stab;	        /* Info about local heap & B-tree */
     H5G_bt_it_gnbi_t udata;     /* Iteration information */
     hbool_t udata_valid = FALSE;        /* Whether iteration information is valid */
-    ssize_t ret_value;          /* Return value */
+    ssize_t ret_value = -1;             /* Return value */
 
     /* Portably clear udata struct (before FUNC_ENTER) */
     HDmemset(&udata, 0, sizeof(udata));
@@ -766,7 +766,7 @@ H5G__stab_get_name_by_idx(const H5O_loc_t *oloc, H5_iter_order_t order, hsize_t
 	HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to determine local heap address")
 
     /* Pin the heap down in memory */
-    if(NULL == (heap = H5HL_protect(oloc->file, dxpl_id, stab.heap_addr, H5AC_READ)))
+    if(NULL == (heap = H5HL_protect(oloc->file, dxpl_id, stab.heap_addr, H5AC__READ_ONLY_FLAG)))
         HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
 
     /* Remap index for decreasing iteration order */
@@ -874,7 +874,7 @@ H5G__stab_lookup(const H5O_loc_t *grp_oloc, const char *name, H5O_link_t *lnk,
     H5G_bt_lkp_t bt_udata;              /* Data to pass through B-tree	*/
     H5G_stab_fnd_ud_t udata;            /* 'User data' to give to callback */
     H5O_stab_t stab;		        /* Symbol table message		*/
-    htri_t     ret_value;       /* Return value */
+    htri_t     ret_value = FAIL;        /* Return value */
 
     FUNC_ENTER_PACKAGE
 
@@ -888,7 +888,7 @@ H5G__stab_lookup(const H5O_loc_t *grp_oloc, const char *name, H5O_link_t *lnk,
         HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't read message")
 
     /* Pin the heap down in memory */
-    if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC_READ)))
+    if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC__READ_ONLY_FLAG)))
         HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
 
     /* Set up user data to pass to 'find' operation callback */
@@ -989,7 +989,7 @@ H5G__stab_lookup_by_idx(const H5O_loc_t *grp_oloc, H5_iter_order_t order, hsize_
 	HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to determine local heap address")
 
     /* Pin the heap down in memory */
-    if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC_READ)))
+    if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC__READ_ONLY_FLAG)))
         HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap")
 
     /* Remap index for decreasing iteration order */
@@ -1060,7 +1060,7 @@ H5G__stab_valid(H5O_loc_t *grp_oloc, hid_t dxpl_id, H5O_stab_t *alt_stab)
     hbool_t     changed = FALSE;        /* Whether stab has been modified */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_PACKAGE
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, grp_oloc->addr, FAIL)
 
     /* Read the symbol table message */
     if(NULL == H5O_msg_read(grp_oloc, H5O_STAB_ID, &stab, dxpl_id))
@@ -1081,10 +1081,10 @@ H5G__stab_valid(H5O_loc_t *grp_oloc, hid_t dxpl_id, H5O_stab_t *alt_stab)
     } /* end if */
 
     /* Check if the symbol table message's heap address is valid */
-    if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC_READ))) {
+    if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC__READ_ONLY_FLAG))) {
         /* Address is invalid, try the heap address in the alternate symbol
          * table message */
-        if(!alt_stab || NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, alt_stab->heap_addr, H5AC_READ)))
+        if(!alt_stab || NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, alt_stab->heap_addr, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "unable to locate heap")
         else {
             /* The alternate symbol table's heap address is valid.  Adjust the
@@ -1106,7 +1106,7 @@ done:
     if(heap && H5HL_unprotect(heap) < 0)
         HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to unprotect symbol table heap")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5G__stab_valid */
 #endif /* H5_STRICT_FORMAT_CHECKS */
 
@@ -1191,9 +1191,9 @@ H5G__stab_get_type_by_idx(H5O_loc_t *oloc, hsize_t idx, hid_t dxpl_id)
 {
     H5O_stab_t		stab;	        /* Info about local heap & B-tree */
     H5G_bt_it_gtbi_t	udata;          /* User data for B-tree callback */
-    H5G_obj_t		ret_value;      /* Return value */
+    H5G_obj_t		ret_value = H5G_UNKNOWN;        /* Return value */
 
-    FUNC_ENTER_PACKAGE
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, oloc->addr, H5G_UNKNOWN)
 
     /* Sanity check */
     HDassert(oloc);
@@ -1222,7 +1222,7 @@ H5G__stab_get_type_by_idx(H5O_loc_t *oloc, hsize_t idx, hid_t dxpl_id)
     ret_value = udata.type;
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, H5G_UNKNOWN)
 } /* end H5G__stab_get_type_by_idx() */
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
diff --git a/src/H5Gtest.c b/src/H5Gtest.c
index cc89f60..a8796fb 100644
--- a/src/H5Gtest.c
+++ b/src/H5Gtest.c
@@ -23,7 +23,7 @@
 /* Module Setup */
 /****************/
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+#include "H5Gmodule.h"          /* This source code file is part of the H5G module */
 #define H5G_TESTING		/*suppress warning about H5G testing funcs*/
 
 
@@ -399,37 +399,43 @@ H5G__new_dense_info_test(hid_t gid, hsize_t *name_count, hsize_t *corder_count)
     if(NULL == (grp = (H5G_t *)H5I_object_verify(gid, H5I_GROUP)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
 
+    /* Set metadata tag in dxpl_id */
+    H5_BEGIN_TAG(dxpl_id, grp->oloc.addr, FAIL);
+
     /* Get the link info */
     if(H5G__obj_get_linfo(&(grp->oloc), &linfo, dxpl_id) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get link info")
+        HGOTO_ERROR_TAG(H5E_SYM, H5E_BADMESG, FAIL, "can't get link info")
 
     /* Check for 'dense' link storage file addresses being defined */
     if(!H5F_addr_defined(linfo.fheap_addr))
-        HGOTO_DONE(FAIL)
+        HGOTO_DONE_TAG(FAIL, FAIL)
     if(!H5F_addr_defined(linfo.name_bt2_addr))
-        HGOTO_DONE(FAIL)
+        HGOTO_DONE_TAG(FAIL, FAIL)
 
     /* Open the name index v2 B-tree */
     if(NULL == (bt2_name = H5B2_open(grp->oloc.file, dxpl_id, linfo.name_bt2_addr, NULL)))
-        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+        HGOTO_ERROR_TAG(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
 
     /* Retrieve # of records in name index */
     if(H5B2_get_nrec(bt2_name, name_count) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from name index")
+        HGOTO_ERROR_TAG(H5E_SYM, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from name index")
 
     /* Check if there is a creation order index */
     if(H5F_addr_defined(linfo.corder_bt2_addr)) {
         /* Open the creation order index v2 B-tree */
         if(NULL == (bt2_corder = H5B2_open(grp->oloc.file, dxpl_id, linfo.corder_bt2_addr, NULL)))
-            HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for creation order index")
+            HGOTO_ERROR_TAG(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for creation order index")
 
         /* Retrieve # of records in creation order index */
         if(H5B2_get_nrec(bt2_corder, corder_count) < 0)
-            HGOTO_ERROR(H5E_SYM, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from creation order index")
+            HGOTO_ERROR_TAG(H5E_SYM, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from creation order index")
     } /* end if */
     else
         *corder_count = 0;
 
+    /* Reset metadata tag in dxpl_id */
+    H5_END_TAG(FAIL);
+
 done:
     /* Release resources */
     if(bt2_name && H5B2_close(bt2_name, dxpl_id) < 0)
@@ -610,7 +616,7 @@ H5G__verify_cached_stab_test(H5O_loc_t *grp_oloc, H5G_entry_t *ent)
     hid_t dxpl_id = H5AC_ind_dxpl_id;  /* transfer property list used for this operation */
     herr_t	ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_PACKAGE
+    FUNC_ENTER_PACKAGE_TAG(dxpl_id, grp_oloc->addr, FAIL)
 
     /* Verify that stab info is cached in ent */
     if(ent->type != H5G_CACHED_STAB)
@@ -631,7 +637,7 @@ H5G__verify_cached_stab_test(H5O_loc_t *grp_oloc, H5G_entry_t *ent)
         HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "b-tree address is invalid")
 
     /* Verify that the heap address is valid */
-    if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC_READ)))
+    if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC__READ_ONLY_FLAG)))
         HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "heap address is invalid")
 
 done:
@@ -639,7 +645,7 @@ done:
     if(heap && H5HL_unprotect(heap) < 0)
         HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to unprotect symbol table heap")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5G__verify_cached_stab_test() */
 
 

@@ -680,7 +686,7 @@ H5G_verify_cached_stabs_test_cb(H5F_t *f, hid_t dxpl_id,
     HDassert(H5F_addr_defined(addr));
 
     /* Load the node */
-    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC_READ)))
+    if(NULL == (sn = (H5G_node_t *)H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, f, H5AC__READ_ONLY_FLAG)))
         HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5_ITER_ERROR, "unable to load symbol table node")
 
     /* Check each target object to see if its stab message (if present) matches
@@ -695,7 +701,7 @@ H5G_verify_cached_stabs_test_cb(H5F_t *f, hid_t dxpl_id,
         targ_oloc.addr = sn->entry[i].header;
 
         /* Load target object header */
-        if(NULL == (targ_oh = H5O_protect(&targ_oloc, dxpl_id, H5AC_READ)))
+        if(NULL == (targ_oh = H5O_protect(&targ_oloc, dxpl_id, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_SYM, H5E_CANTPROTECT, H5_ITER_ERROR, "unable to protect target object header")
 
         /* Check if a symbol table message exists */
@@ -763,6 +769,7 @@ H5G__verify_cached_stabs_test(hid_t gid)
     htri_t              stab_exists;
     H5O_stab_t          stab;                   /* Symbol table message */
     H5G_bt_common_t     udata = {NULL, NULL};   /* Dummy udata so H5B_iterate doesn't freak out */
+    haddr_t             prev_tag = HADDR_UNDEF; /* Previous metadata tag */
     hid_t               dxpl_id = H5AC_ind_dxpl_id;  /* transfer property list used for this operation */
     herr_t              ret_value = SUCCEED;    /* Return value */
 
@@ -775,6 +782,10 @@ H5G__verify_cached_stabs_test(hid_t gid)
     if(NULL == (grp = (H5G_t *)H5I_object_verify(gid, H5I_GROUP)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group")
 
+    /* Set up metadata tagging */
+    if(H5AC_tag(dxpl_id, grp->oloc.addr, &prev_tag) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "unable to apply metadata tag")
+
     /* Check for group having a symbol table message */
     /* Check for the group having a group info message */
     if((stab_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID,
@@ -794,6 +805,10 @@ H5G__verify_cached_stabs_test(hid_t gid)
             stab.btree_addr, H5G_verify_cached_stabs_test_cb, &udata)) < 0)
         HGOTO_ERROR(H5E_SYM, H5E_CANTNEXT, FAIL, "iteration operator failed");
 
+    /* Reset metadata tagging */
+    if(H5AC_tag(dxpl_id, prev_tag, NULL) < 0)
+        HDONE_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "unable to apply metadata tag")
+
 done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5G__verify_cached_stabs_test() */
diff --git a/src/H5Gtraverse.c b/src/H5Gtraverse.c
index 87d6d2b..4d84e9f 100644
--- a/src/H5Gtraverse.c
+++ b/src/H5Gtraverse.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+#include "H5Gmodule.h"          /* This source code file is part of the H5G module */
 
 
 /***********/
@@ -201,7 +201,7 @@ H5G_traverse_ud(const H5G_loc_t *grp_loc/*in,out*/, const H5O_link_t *lnk,
     grp_loc_copy.path = &grp_path_copy;
     grp_loc_copy.oloc = &grp_oloc_copy;
     H5G_loc_reset(&grp_loc_copy);
-    if(H5G__loc_copy(&grp_loc_copy, grp_loc, H5_COPY_DEEP) < 0)
+    if(H5G_loc_copy(&grp_loc_copy, grp_loc, H5_COPY_DEEP) < 0)
         HGOTO_ERROR(H5E_SYM, H5E_CANTCOPY, FAIL, "unable to copy object location")
 
     /* Create a group ID to pass to the user-defined callback */
@@ -263,7 +263,7 @@ H5G_traverse_ud(const H5G_loc_t *grp_loc/*in,out*/, const H5O_link_t *lnk,
     H5G_loc_free(obj_loc);
 
     /* Copy new object's location information */
-    H5G__loc_copy(obj_loc, &new_loc, H5_COPY_DEEP);
+    H5G_loc_copy(obj_loc, &new_loc, H5_COPY_DEEP);
 
     /* Hold the file open until we free this object header (otherwise the
      * object location will be invalidated when the file closes).
@@ -344,7 +344,7 @@ H5G_traverse_slink(const H5G_loc_t *grp_loc, const H5O_link_t *lnk,
     /* ("tracking the names properly" means to ignore the effects of the
      *  link traversal on the object's & group's paths - QAK)
      */
-    H5G__loc_copy(&tmp_grp_loc, grp_loc, H5_COPY_DEEP);
+    H5G_loc_copy(&tmp_grp_loc, grp_loc, H5_COPY_DEEP);
     tmp_grp_loc_set = TRUE;
 
     /* Hold the object's group hier. path to restore later */
@@ -544,7 +544,7 @@ H5G_traverse_real(const H5G_loc_t *_loc, const char *name, unsigned target,
 #endif /* H5_USING_MEMCHECKER */
 
     /* Deep copy of the starting location to group location */
-    if(H5G__loc_copy(&grp_loc, &loc, H5_COPY_DEEP) < 0)
+    if(H5G_loc_copy(&grp_loc, &loc, H5_COPY_DEEP) < 0)
         HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to copy location")
     group_copy = TRUE;
 
@@ -761,7 +761,7 @@ H5G_traverse_real(const H5G_loc_t *_loc, const char *name, unsigned target,
 
         /* Transfer "ownership" of the object's information to the group object */
         H5G_loc_free(&grp_loc);
-        H5G__loc_copy(&grp_loc, &obj_loc, H5_COPY_SHALLOW);
+        H5G_loc_copy(&grp_loc, &obj_loc, H5_COPY_SHALLOW);
         H5G_loc_reset(&obj_loc);
         obj_loc_valid = FALSE;
 
@@ -856,9 +856,20 @@ H5G_traverse(const H5G_loc_t *loc, const char *name, unsigned target, H5G_traver
             HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get number of links")
     } /* end else */
 
+    /* Set up invalid tag. This is a precautionary step only. Setting an invalid
+       tag here will ensure that no metadata accessed while doing the traversal
+       is given an improper tag, unless another one is specifically set up 
+       first. This will ensure we're not accidentally tagging something we 
+       shouldn't be during the traversal. Note that for best tagging assertion 
+       coverage, setting H5C_DO_TAGGING_SANITY_CHECKS is advised. */
+    H5_BEGIN_TAG(dxpl_id, H5AC__INVALID_TAG, FAIL);
+
     /* Go perform "real" traversal */
     if(H5G_traverse_real(loc, name, target, &nlinks, op, op_data, lapl_id, dxpl_id) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "internal path traversal failed")
+        HGOTO_ERROR_TAG(H5E_SYM, H5E_NOTFOUND, FAIL, "internal path traversal failed")
+
+    /* Reset tag after traversal */
+    H5_END_TAG(FAIL);
 
 done:
    FUNC_LEAVE_NOAPI(ret_value)
diff --git a/src/H5HF.c b/src/H5HF.c
index 2c32b71..3a6d4ea 100644
--- a/src/H5HF.c
+++ b/src/H5HF.c
@@ -33,7 +33,8 @@
 /* Module Setup */
 /****************/
 
-#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+#include "H5HFmodule.h"         /* This source code file is part of the H5HF module */
+
 
 /***********/
 /* Headers */
@@ -68,6 +69,9 @@
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 
 /*****************************/
 /* Library Private Variables */
@@ -153,7 +157,7 @@ H5HF_create(H5F_t *f, hid_t dxpl_id, const H5HF_create_t *cparam)
     H5HF_t *fh = NULL;          /* Pointer to new fractal heap */
     H5HF_hdr_t *hdr = NULL;     /* The fractal heap header information */
     haddr_t fh_addr;            /* Heap header address */
-    H5HF_t *ret_value;          /* Return value */
+    H5HF_t *ret_value = NULL;   /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -172,7 +176,7 @@ H5HF_create(H5F_t *f, hid_t dxpl_id, const H5HF_create_t *cparam)
         HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "memory allocation failed for fractal heap info")
 
     /* Lock the heap header into memory */
-    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, fh_addr, H5AC_WRITE)))
+    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, fh_addr, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to protect fractal heap header")
 
     /* Point fractal heap wrapper at header and bump it's ref count */
@@ -220,7 +224,7 @@ H5HF_open(H5F_t *f, hid_t dxpl_id, haddr_t fh_addr)
 {
     H5HF_t *fh = NULL;          /* Pointer to new fractal heap */
     H5HF_hdr_t *hdr = NULL;     /* The fractal heap header information */
-    H5HF_t *ret_value;          /* Return value */
+    H5HF_t *ret_value = NULL;   /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -231,7 +235,7 @@ H5HF_open(H5F_t *f, hid_t dxpl_id, haddr_t fh_addr)
     HDassert(H5F_addr_defined(fh_addr));
 
     /* Load the heap header into memory */
-    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, fh_addr, H5AC_READ)))
+    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, fh_addr, H5AC__READ_ONLY_FLAG)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to protect fractal heap header")
 
     /* Check for pending heap deletion */
@@ -439,14 +443,8 @@ H5HF_get_obj_len(H5HF_t *fh, hid_t dxpl_id, const void *_id, size_t *obj_len_p)
 
     /* Check type of object in heap */
     if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_MAN) {
-        /* Skip over the flag byte */
-        id++;
-
-        /* Skip over object offset */
-        id += fh->hdr->heap_off_size;
-
-        /* Retrieve the entry length */
-        UINT64DECODE_VAR(id, *obj_len_p, fh->hdr->heap_len_size);
+        if(H5HF_man_get_obj_len(fh->hdr, id, obj_len_p) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't get 'managed' object's length")
     } /* end if */
     else if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_HUGE) {
         if(H5HF_huge_get_obj_len(fh->hdr, dxpl_id, id, obj_len_p) < 0)
@@ -467,6 +465,68 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5HF_get_obj_off
+ *
+ * Purpose:	Get the offset of an entry in a fractal heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 20 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_get_obj_off(H5HF_t *fh, hid_t dxpl_id, const void *_id, hsize_t *obj_off_p)
+{
+    const uint8_t *id = (const uint8_t *)_id;   /* Object ID */
+    uint8_t id_flags;                   /* Heap ID flag bits */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fh);
+    HDassert(id);
+    HDassert(obj_off_p);
+
+    /* Get the ID flags */
+    id_flags = *id;
+
+    /* Check for correct heap ID version */
+    if((id_flags & H5HF_ID_VERS_MASK) != H5HF_ID_VERS_CURR)
+        HGOTO_ERROR(H5E_HEAP, H5E_VERSION, FAIL, "incorrect heap ID version")
+
+    /* Set the shared heap header's file context for this operation */
+    fh->hdr->f = fh->f;
+
+    /* Check type of object in heap */
+    if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_MAN) {
+        H5HF__man_get_obj_off(fh->hdr, id, obj_off_p);
+    } /* end if */
+    else if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_HUGE) {
+        /* Huge objects are located directly in the file */
+        if(H5HF__huge_get_obj_off(fh->hdr, dxpl_id, id, obj_off_p) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't get 'huge' object's offset")
+    } /* end if */
+    else if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_TINY) {
+        /* Tiny objects are not stored in the heap */
+        *obj_off_p = (hsize_t)0;
+    } /* end if */
+    else {
+HDfprintf(stderr, "%s: Heap ID type not supported yet!\n", FUNC);
+HGOTO_ERROR(H5E_HEAP, H5E_UNSUPPORTED, FAIL, "heap ID type not supported yet")
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_get_obj_off() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5HF_read
  *
  * Purpose:	Read an object from a fractal heap into a buffer
@@ -816,6 +876,9 @@ H5HF_close(H5HF_t *fh, hid_t dxpl_id)
     } /* end if */
 
     /* Decrement the reference count on the heap header */
+    /* (don't put in H5HF_hdr_fuse_decr() as the heap header may be evicted
+     *  immediately -QAK)
+     */
     if(H5HF_hdr_decr(fh->hdr) < 0)
         HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement reference count on shared heap header")
 
@@ -824,7 +887,7 @@ H5HF_close(H5HF_t *fh, hid_t dxpl_id)
         H5HF_hdr_t *hdr;            /* Another pointer to fractal heap header */
 
         /* Lock the heap header into memory */
-        if(NULL == (hdr = H5HF_hdr_protect(fh->f, dxpl_id, heap_addr, H5AC_WRITE)))
+        if(NULL == (hdr = H5HF_hdr_protect(fh->f, dxpl_id, heap_addr, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap header")
 
         /* Delete heap, starting with header (unprotects header) */
@@ -868,7 +931,7 @@ H5HF_delete(H5F_t *f, hid_t dxpl_id, haddr_t fh_addr)
     HDassert(H5F_addr_defined(fh_addr));
 
     /* Lock the heap header into memory */
-    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, fh_addr, H5AC_WRITE)))
+    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, fh_addr, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap header")
 
     /* Check for files using shared heap header */
@@ -889,3 +952,90 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5HF_delete() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HF_depend
+ *
+ * Purpose:     Make a child flush dependency between the fracal heap's
+ *              header and another piece of metadata in the file.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_depend(H5AC_info_t *parent_entry, H5HF_t *fh)
+{
+    /* Local variables */
+    H5HF_hdr_t *hdr = fh->hdr;              /* Header for fractal heap */
+    herr_t ret_value = SUCCEED;             /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fh);
+    HDassert(hdr);
+
+    /* Set the shared heap header's file context for this operation */
+    hdr->f = fh->f;
+
+    /* Set up flush dependency between parent entry and fractal heap header */
+    if(H5HF__create_flush_depend(parent_entry, (H5AC_info_t *)hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDEPEND, FAIL, "unable to create flush dependency on file metadata")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5HF_depend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HF_undepend
+ *
+ * Purpose:     Remove a child flush dependency between the fractal heap's
+ *              header and another piece of metadata in the file.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_undepend(H5AC_info_t *parent_entry, H5HF_t *fh)
+{
+    /* Local variables */
+    H5HF_hdr_t *hdr = fh->hdr;              /* Header for fractal heap */
+    herr_t ret_value = SUCCEED;             /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+#ifdef QAK
+HDfprintf(stderr, "%s: Called\n", FUNC);
+#endif /* QAK */
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fh);
+    HDassert(hdr);
+
+    /* Set the shared heap header's file context for this operation */
+    hdr->f = fh->f;
+
+    /* Remove flush dependency between parent entry and fractal heap header */
+    if(H5HF__destroy_flush_depend(parent_entry, (H5AC_info_t *)hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency on file metadata")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5HF_undepend() */
diff --git a/src/H5HFbtree2.c b/src/H5HFbtree2.c
index 0229ebe..d82de93 100644
--- a/src/H5HFbtree2.c
+++ b/src/H5HFbtree2.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+#include "H5HFmodule.h"         /* This source code file is part of the H5HF module */
 
 
 /***********/
@@ -68,45 +68,50 @@ typedef struct H5HF_huge_bt2_ctx_t {
 
 /* v2 B-tree driver callbacks */
 
-static void *H5HF_huge_bt2_crt_context(void *udata);
-static herr_t H5HF_huge_bt2_dst_context(void *ctx);
-static void *H5HF_huge_bt2_crt_dbg_context(H5F_t *f, hid_t dxpl_id, haddr_t addr);
+/* Common callbacks */
+static void *H5HF__huge_bt2_crt_context(void *udata);
+static herr_t H5HF__huge_bt2_dst_context(void *ctx);
+static void *H5HF__huge_bt2_crt_dbg_context(H5F_t *f, hid_t dxpl_id, haddr_t addr);
 
-static herr_t H5HF_huge_bt2_indir_store(void *native, const void *udata);
-static herr_t H5HF_huge_bt2_indir_compare(const void *rec1, const void *rec2);
-static herr_t H5HF_huge_bt2_indir_encode(uint8_t *raw, const void *native,
+/* Callbacks for indirect objects */
+static herr_t H5HF__huge_bt2_indir_store(void *native, const void *udata);
+static herr_t H5HF__huge_bt2_indir_compare(const void *rec1, const void *rec2);
+static herr_t H5HF__huge_bt2_indir_encode(uint8_t *raw, const void *native,
     void *ctx);
-static herr_t H5HF_huge_bt2_indir_decode(const uint8_t *raw, void *native,
+static herr_t H5HF__huge_bt2_indir_decode(const uint8_t *raw, void *native,
     void *ctx);
-static herr_t H5HF_huge_bt2_indir_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
-    int indent, int fwidth, const void *record, const void *_udata);
+static herr_t H5HF__huge_bt2_indir_debug(FILE *stream, int indent, int fwidth,
+    const void *record, const void *_udata);
 
-static herr_t H5HF_huge_bt2_filt_indir_store(void *native, const void *udata);
-static herr_t H5HF_huge_bt2_filt_indir_compare(const void *rec1, const void *rec2);
-static herr_t H5HF_huge_bt2_filt_indir_encode(uint8_t *raw, const void *native,
+/* Callbacks for filtered indirect objects */
+static herr_t H5HF__huge_bt2_filt_indir_store(void *native, const void *udata);
+static herr_t H5HF__huge_bt2_filt_indir_compare(const void *rec1, const void *rec2);
+static herr_t H5HF__huge_bt2_filt_indir_encode(uint8_t *raw, const void *native,
     void *ctx);
-static herr_t H5HF_huge_bt2_filt_indir_decode(const uint8_t *raw, void *native,
+static herr_t H5HF__huge_bt2_filt_indir_decode(const uint8_t *raw, void *native,
     void *ctx);
-static herr_t H5HF_huge_bt2_filt_indir_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
-    int indent, int fwidth, const void *record, const void *_udata);
+static herr_t H5HF__huge_bt2_filt_indir_debug(FILE *stream, int indent, int fwidth,
+    const void *record, const void *_udata);
 
-static herr_t H5HF_huge_bt2_dir_store(void *native, const void *udata);
-static herr_t H5HF_huge_bt2_dir_compare(const void *rec1, const void *rec2);
-static herr_t H5HF_huge_bt2_dir_encode(uint8_t *raw, const void *native,
+/* Callbacks for direct objects */
+static herr_t H5HF__huge_bt2_dir_store(void *native, const void *udata);
+static herr_t H5HF__huge_bt2_dir_compare(const void *rec1, const void *rec2);
+static herr_t H5HF__huge_bt2_dir_encode(uint8_t *raw, const void *native,
     void *ctx);
-static herr_t H5HF_huge_bt2_dir_decode(const uint8_t *raw, void *native,
+static herr_t H5HF__huge_bt2_dir_decode(const uint8_t *raw, void *native,
     void *ctx);
-static herr_t H5HF_huge_bt2_dir_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
-    int indent, int fwidth, const void *record, const void *_udata);
+static herr_t H5HF__huge_bt2_dir_debug(FILE *stream, int indent, int fwidth,
+    const void *record, const void *_udata);
 
-static herr_t H5HF_huge_bt2_filt_dir_store(void *native, const void *udata);
-static herr_t H5HF_huge_bt2_filt_dir_compare(const void *rec1, const void *rec2);
-static herr_t H5HF_huge_bt2_filt_dir_encode(uint8_t *raw, const void *native,
+/* Callbacks for filtered direct objects */
+static herr_t H5HF__huge_bt2_filt_dir_store(void *native, const void *udata);
+static herr_t H5HF__huge_bt2_filt_dir_compare(const void *rec1, const void *rec2);
+static herr_t H5HF__huge_bt2_filt_dir_encode(uint8_t *raw, const void *native,
     void *ctx);
-static herr_t H5HF_huge_bt2_filt_dir_decode(const uint8_t *raw, void *native,
+static herr_t H5HF__huge_bt2_filt_dir_decode(const uint8_t *raw, void *native,
     void *ctx);
-static herr_t H5HF_huge_bt2_filt_dir_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
-    int indent, int fwidth, const void *record, const void *_udata);
+static herr_t H5HF__huge_bt2_filt_dir_debug(FILE *stream, int indent, int fwidth,
+    const void *record, const void *_udata);
 
 /*********************/
 /* Package Variables */
@@ -116,15 +121,15 @@ const H5B2_class_t H5HF_HUGE_BT2_INDIR[1]={{ /* B-tree class information */
     H5B2_FHEAP_HUGE_INDIR_ID,               /* Type of B-tree */
     "H5B2_FHEAP_HUGE_INDIR_ID",             /* Name of B-tree class */
     sizeof(H5HF_huge_bt2_indir_rec_t),      /* Size of native record */
-    H5HF_huge_bt2_crt_context,              /* Create client callback context */
-    H5HF_huge_bt2_dst_context,              /* Destroy client callback context */
-    H5HF_huge_bt2_indir_store,              /* Record storage callback */
-    H5HF_huge_bt2_indir_compare,            /* Record comparison callback */
-    H5HF_huge_bt2_indir_encode,             /* Record encoding callback */
-    H5HF_huge_bt2_indir_decode,             /* Record decoding callback */
-    H5HF_huge_bt2_indir_debug,              /* Record debugging callback */
-    H5HF_huge_bt2_crt_dbg_context,          /* Create debugging context */
-    H5HF_huge_bt2_dst_context               /* Destroy debugging context */
+    H5HF__huge_bt2_crt_context,             /* Create client callback context */
+    H5HF__huge_bt2_dst_context,             /* Destroy client callback context */
+    H5HF__huge_bt2_indir_store,             /* Record storage callback */
+    H5HF__huge_bt2_indir_compare,           /* Record comparison callback */
+    H5HF__huge_bt2_indir_encode,            /* Record encoding callback */
+    H5HF__huge_bt2_indir_decode,            /* Record decoding callback */
+    H5HF__huge_bt2_indir_debug,             /* Record debugging callback */
+    H5HF__huge_bt2_crt_dbg_context,         /* Create debugging context */
+    H5HF__huge_bt2_dst_context              /* Destroy debugging context */
 }};
 
 /* v2 B-tree class for indirectly accessed, filtered 'huge' objects */
@@ -132,15 +137,15 @@ const H5B2_class_t H5HF_HUGE_BT2_FILT_INDIR[1]={{ /* B-tree class information */
     H5B2_FHEAP_HUGE_FILT_INDIR_ID,          /* Type of B-tree */
     "H5B2_FHEAP_HUGE_FILT_INDIR_ID",        /* Name of B-tree class */
     sizeof(H5HF_huge_bt2_filt_indir_rec_t), /* Size of native record */
-    H5HF_huge_bt2_crt_context,              /* Create client callback context */
-    H5HF_huge_bt2_dst_context,              /* Destroy client callback context */
-    H5HF_huge_bt2_filt_indir_store,         /* Record storage callback */
-    H5HF_huge_bt2_filt_indir_compare,       /* Record comparison callback */
-    H5HF_huge_bt2_filt_indir_encode,        /* Record encoding callback */
-    H5HF_huge_bt2_filt_indir_decode,        /* Record decoding callback */
-    H5HF_huge_bt2_filt_indir_debug,         /* Record debugging callback */
-    H5HF_huge_bt2_crt_dbg_context,          /* Create debugging context */
-    H5HF_huge_bt2_dst_context               /* Destroy debugging context */
+    H5HF__huge_bt2_crt_context,             /* Create client callback context */
+    H5HF__huge_bt2_dst_context,             /* Destroy client callback context */
+    H5HF__huge_bt2_filt_indir_store,        /* Record storage callback */
+    H5HF__huge_bt2_filt_indir_compare,      /* Record comparison callback */
+    H5HF__huge_bt2_filt_indir_encode,       /* Record encoding callback */
+    H5HF__huge_bt2_filt_indir_decode,       /* Record decoding callback */
+    H5HF__huge_bt2_filt_indir_debug,        /* Record debugging callback */
+    H5HF__huge_bt2_crt_dbg_context,         /* Create debugging context */
+    H5HF__huge_bt2_dst_context              /* Destroy debugging context */
 }};
 
 /* v2 B-tree class for directly accessed 'huge' objects */
@@ -148,15 +153,15 @@ const H5B2_class_t H5HF_HUGE_BT2_DIR[1]={{  /* B-tree class information */
     H5B2_FHEAP_HUGE_DIR_ID,                 /* Type of B-tree */
     "H5B2_FHEAP_HUGE_DIR_ID",               /* Name of B-tree class */
     sizeof(H5HF_huge_bt2_dir_rec_t),        /* Size of native record */
-    H5HF_huge_bt2_crt_context,              /* Create client callback context */
-    H5HF_huge_bt2_dst_context,              /* Destroy client callback context */
-    H5HF_huge_bt2_dir_store,                /* Record storage callback */
-    H5HF_huge_bt2_dir_compare,              /* Record comparison callback */
-    H5HF_huge_bt2_dir_encode,               /* Record encoding callback */
-    H5HF_huge_bt2_dir_decode,               /* Record decoding callback */
-    H5HF_huge_bt2_dir_debug,                /* Record debugging callback */
-    H5HF_huge_bt2_crt_dbg_context,          /* Create debugging context */
-    H5HF_huge_bt2_dst_context               /* Destroy debugging context */
+    H5HF__huge_bt2_crt_context,             /* Create client callback context */
+    H5HF__huge_bt2_dst_context,             /* Destroy client callback context */
+    H5HF__huge_bt2_dir_store,               /* Record storage callback */
+    H5HF__huge_bt2_dir_compare,             /* Record comparison callback */
+    H5HF__huge_bt2_dir_encode,              /* Record encoding callback */
+    H5HF__huge_bt2_dir_decode,              /* Record decoding callback */
+    H5HF__huge_bt2_dir_debug,               /* Record debugging callback */
+    H5HF__huge_bt2_crt_dbg_context,         /* Create debugging context */
+    H5HF__huge_bt2_dst_context              /* Destroy debugging context */
 }};
 
 /* v2 B-tree class for directly accessed, filtered 'huge' objects */
@@ -164,15 +169,15 @@ const H5B2_class_t H5HF_HUGE_BT2_FILT_DIR[1]={{ /* B-tree class information */
     H5B2_FHEAP_HUGE_FILT_DIR_ID,            /* Type of B-tree */
     "H5B2_FHEAP_HUGE_FILT_DIR_ID",          /* Name of B-tree class */
     sizeof(H5HF_huge_bt2_filt_dir_rec_t),   /* Size of native record */
-    H5HF_huge_bt2_crt_context,              /* Create client callback context */
-    H5HF_huge_bt2_dst_context,              /* Destroy client callback context */
-    H5HF_huge_bt2_filt_dir_store,           /* Record storage callback */
-    H5HF_huge_bt2_filt_dir_compare,         /* Record comparison callback */
-    H5HF_huge_bt2_filt_dir_encode,          /* Record encoding callback */
-    H5HF_huge_bt2_filt_dir_decode,          /* Record decoding callback */
-    H5HF_huge_bt2_filt_dir_debug,           /* Record debugging callback */
-    H5HF_huge_bt2_crt_dbg_context,          /* Create debugging context */
-    H5HF_huge_bt2_dst_context               /* Destroy debugging context */
+    H5HF__huge_bt2_crt_context,             /* Create client callback context */
+    H5HF__huge_bt2_dst_context,             /* Destroy client callback context */
+    H5HF__huge_bt2_filt_dir_store,          /* Record storage callback */
+    H5HF__huge_bt2_filt_dir_compare,        /* Record comparison callback */
+    H5HF__huge_bt2_filt_dir_encode,         /* Record encoding callback */
+    H5HF__huge_bt2_filt_dir_decode,         /* Record decoding callback */
+    H5HF__huge_bt2_filt_dir_debug,          /* Record debugging callback */
+    H5HF__huge_bt2_crt_dbg_context,         /* Create debugging context */
+    H5HF__huge_bt2_dst_context              /* Destroy debugging context */
 }};
 
 /*****************************/
@@ -190,7 +195,7 @@ H5FL_DEFINE_STATIC(H5HF_huge_bt2_ctx_t);
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_crt_context
+ * Function:	H5HF__huge_bt2_crt_context
  *
  * Purpose:	Create client callback context
  *
@@ -205,13 +210,13 @@ H5FL_DEFINE_STATIC(H5HF_huge_bt2_ctx_t);
  *-------------------------------------------------------------------------
  */
 static void *
-H5HF_huge_bt2_crt_context(void *_f)
+H5HF__huge_bt2_crt_context(void *_f)
 {
     H5F_t *f = (H5F_t *)_f;     /* User data for building callback context */
     H5HF_huge_bt2_ctx_t *ctx;   /* Callback context structure */
-    void *ret_value;            /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Sanity check */
     HDassert(f);
@@ -229,11 +234,11 @@ H5HF_huge_bt2_crt_context(void *_f)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5HF_huge_bt2_crt_context() */
+} /* H5HF__huge_bt2_crt_context() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_dst_context
+ * Function:	H5HF__huge_bt2_dst_context
  *
  * Purpose:	Destroy client callback context
  *
@@ -248,11 +253,11 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_dst_context(void *_ctx)
+H5HF__huge_bt2_dst_context(void *_ctx)
 {
     H5HF_huge_bt2_ctx_t *ctx = (H5HF_huge_bt2_ctx_t *)_ctx;       /* Callback context structure */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Sanity check */
     HDassert(ctx);
@@ -261,11 +266,11 @@ H5HF_huge_bt2_dst_context(void *_ctx)
     ctx = H5FL_FREE(H5HF_huge_bt2_ctx_t, ctx);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_dst_context() */
+} /* H5HF__huge_bt2_dst_context() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_crt_dbg_context
+ * Function:	H5HF__huge_bt2_crt_dbg_context
  *
  * Purpose:	Create context for debugging callback
  *
@@ -278,12 +283,12 @@ H5HF_huge_bt2_dst_context(void *_ctx)
  *-------------------------------------------------------------------------
  */
 static void *
-H5HF_huge_bt2_crt_dbg_context(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t H5_ATTR_UNUSED addr)
+H5HF__huge_bt2_crt_dbg_context(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t H5_ATTR_UNUSED addr)
 {
     H5HF_huge_bt2_ctx_t *ctx;   /* Callback context structure */
-    void *ret_value;            /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Sanity check */
     HDassert(f);
@@ -301,11 +306,11 @@ H5HF_huge_bt2_crt_dbg_context(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t H5
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5HF_huge_bt2_crt_dbg_context() */
+} /* H5HF__huge_bt2_crt_dbg_context() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_indir_found
+ * Function:	H5HF__huge_bt2_indir_found
  *
  * Purpose:	Retrieve record for indirectly accessed 'huge' object, when
  *              it's found in the v2 B-tree
@@ -319,24 +324,18 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5HF_huge_bt2_indir_found(const void *nrecord, void *op_data)
+H5HF__huge_bt2_indir_found(const void *nrecord, void *op_data)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-#ifdef QAK
-HDfprintf(stderr, "%s: nrecord = {%a, %Hu, %Hu}\n", "H5HF_huge_bt2_indir_found",
-        ((const H5HF_huge_bt2_indir_rec_t *)nrecord)->addr,
-        ((const H5HF_huge_bt2_indir_rec_t *)nrecord)->len,
-        ((const H5HF_huge_bt2_indir_rec_t *)nrecord)->id);
-#endif /* QAK */
+    FUNC_ENTER_PACKAGE_NOERR
+
     *(H5HF_huge_bt2_indir_rec_t *)op_data = *(const H5HF_huge_bt2_indir_rec_t *)nrecord;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_indir_found() */
+} /* H5HF__huge_bt2_indir_found() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_indir_remove
+ * Function:	H5HF__huge_bt2_indir_remove
  *
  * Purpose:	Free space for indirectly accessed 'huge' object, as v2 B-tree
  *              is being deleted or v2 B-tree node is removed
@@ -350,12 +349,12 @@ HDfprintf(stderr, "%s: nrecord = {%a, %Hu, %Hu}\n", "H5HF_huge_bt2_indir_found",
  *-------------------------------------------------------------------------
  */
 herr_t
-H5HF_huge_bt2_indir_remove(const void *nrecord, void *_udata)
+H5HF__huge_bt2_indir_remove(const void *nrecord, void *_udata)
 {
     H5HF_huge_remove_ud_t *udata = (H5HF_huge_remove_ud_t *)_udata;   /* User callback data */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Free the space in the file for the object being removed */
     if(H5MF_xfree(udata->hdr->f, H5FD_MEM_FHEAP_HUGE_OBJ, udata->dxpl_id, ((const H5HF_huge_bt2_indir_rec_t *)nrecord)->addr, ((const H5HF_huge_bt2_indir_rec_t *)nrecord)->len) < 0)
@@ -366,11 +365,11 @@ H5HF_huge_bt2_indir_remove(const void *nrecord, void *_udata)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5HF_huge_bt2_indir_remove() */
+} /* H5HF__huge_bt2_indir_remove() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_indir_store
+ * Function:	H5HF__huge_bt2_indir_store
  *
  * Purpose:	Store native information into record for v2 B-tree
  *
@@ -383,18 +382,18 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_indir_store(void *nrecord, const void *udata)
+H5HF__huge_bt2_indir_store(void *nrecord, const void *udata)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     *(H5HF_huge_bt2_indir_rec_t *)nrecord = *(const H5HF_huge_bt2_indir_rec_t *)udata;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_indir_store() */
+} /* H5HF__huge_bt2_indir_store() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_indir_compare
+ * Function:	H5HF__huge_bt2_indir_compare
  *
  * Purpose:	Compare two native information records, according to some key
  *
@@ -408,25 +407,16 @@ H5HF_huge_bt2_indir_store(void *nrecord, const void *udata)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_indir_compare(const void *_rec1, const void *_rec2)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-#ifdef QAK
+H5HF__huge_bt2_indir_compare(const void *_rec1, const void *_rec2)
 {
-const H5HF_huge_bt2_indir_rec_t *rec1 = (const H5HF_huge_bt2_indir_rec_t *)_rec1;
-const H5HF_huge_bt2_indir_rec_t *rec2 = (const H5HF_huge_bt2_indir_rec_t *)_rec2;
+    FUNC_ENTER_STATIC_NOERR
 
-HDfprintf(stderr, "%s: rec1 = {%a, %Hu, %Hu}\n", "H5HF_huge_bt2_indir_compare", rec1->addr, rec1->len, rec1->id);
-HDfprintf(stderr, "%s: rec2 = {%a, %Hu, %Hu}\n", "H5HF_huge_bt2_indir_compare", rec2->addr, rec2->len, rec2->id);
-}
-#endif /* QAK */
     FUNC_LEAVE_NOAPI((herr_t)(((const H5HF_huge_bt2_indir_rec_t *)_rec1)->id - ((const H5HF_huge_bt2_indir_rec_t *)_rec2)->id))
-} /* H5HF_huge_bt2_indir_compare() */
+} /* H5HF__huge_bt2_indir_compare() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_indir_encode
+ * Function:	H5HF__huge_bt2_indir_encode
  *
  * Purpose:	Encode native information into raw form for storing on disk
  *
@@ -439,12 +429,12 @@ HDfprintf(stderr, "%s: rec2 = {%a, %Hu, %Hu}\n", "H5HF_huge_bt2_indir_compare",
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_indir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
+H5HF__huge_bt2_indir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
 {
     H5HF_huge_bt2_ctx_t *ctx = (H5HF_huge_bt2_ctx_t *)_ctx;       /* Callback context structure */
     const H5HF_huge_bt2_indir_rec_t *nrecord = (const H5HF_huge_bt2_indir_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Sanity check */
     HDassert(ctx);
@@ -455,11 +445,11 @@ H5HF_huge_bt2_indir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
     H5F_ENCODE_LENGTH_LEN(raw, nrecord->id, ctx->sizeof_size);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_indir_encode() */
+} /* H5HF__huge_bt2_indir_encode() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_indir_decode
+ * Function:	H5HF__huge_bt2_indir_decode
  *
  * Purpose:	Decode raw disk form of record into native form
  *
@@ -472,12 +462,12 @@ H5HF_huge_bt2_indir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_indir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
+H5HF__huge_bt2_indir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
 {
     H5HF_huge_bt2_ctx_t *ctx = (H5HF_huge_bt2_ctx_t *)_ctx;       /* Callback context structure */
     H5HF_huge_bt2_indir_rec_t *nrecord = (H5HF_huge_bt2_indir_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Sanity check */
     HDassert(ctx);
@@ -488,11 +478,11 @@ H5HF_huge_bt2_indir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
     H5F_DECODE_LENGTH_LEN(raw, nrecord->id, ctx->sizeof_size);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_indir_decode() */
+} /* H5HF__huge_bt2_indir_decode() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_indir_debug
+ * Function:	H5HF__huge_bt2_indir_debug
  *
  * Purpose:	Debug native form of record
  *
@@ -505,23 +495,22 @@ H5HF_huge_bt2_indir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_indir_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
-    int indent, int fwidth, const void *_nrecord,
-    const void H5_ATTR_UNUSED *_udata)
+H5HF__huge_bt2_indir_debug(FILE *stream, int indent, int fwidth,
+    const void *_nrecord, const void H5_ATTR_UNUSED *_udata)
 {
     const H5HF_huge_bt2_indir_rec_t *nrecord = (const H5HF_huge_bt2_indir_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     HDfprintf(stream, "%*s%-*s {%a, %Hu, %Hu}\n", indent, "", fwidth, "Record:",
         nrecord->addr, nrecord->len, nrecord->id);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_indir_debug() */
+} /* H5HF__huge_bt2_indir_debug() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_filt_indir_found
+ * Function:	H5HF__huge_bt2_filt_indir_found
  *
  * Purpose:	Retrieve record for indirectly accessed, filtered 'huge' object,
  *              when it's found in the v2 B-tree
@@ -535,26 +524,18 @@ H5HF_huge_bt2_indir_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_
  *-------------------------------------------------------------------------
  */
 herr_t
-H5HF_huge_bt2_filt_indir_found(const void *nrecord, void *op_data)
+H5HF__huge_bt2_filt_indir_found(const void *nrecord, void *op_data)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-#ifdef QAK
-HDfprintf(stderr, "%s: nrecord = {%a, %Hu, %x, %Hu, %Hu}\n", "H5HF_huge_bt2_filt_indir_found",
-        ((const H5HF_huge_bt2_filt_indir_rec_t *)nrecord)->addr,
-        ((const H5HF_huge_bt2_filt_indir_rec_t *)nrecord)->len,
-        ((const H5HF_huge_bt2_filt_indir_rec_t *)nrecord)->filter_mask,
-        ((const H5HF_huge_bt2_filt_indir_rec_t *)nrecord)->obj_size,
-        ((const H5HF_huge_bt2_filt_indir_rec_t *)nrecord)->id);
-#endif /* QAK */
+    FUNC_ENTER_PACKAGE_NOERR
+
     *(H5HF_huge_bt2_filt_indir_rec_t *)op_data = *(const H5HF_huge_bt2_filt_indir_rec_t *)nrecord;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_filt_indir_found() */
+} /* H5HF__huge_bt2_filt_indir_found() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_filt_indir_remove
+ * Function:	H5HF__huge_bt2_filt_indir_remove
  *
  * Purpose:	Free space for indirectly accessed, filtered 'huge' object, as
  *              v2 B-tree is being deleted or v2 B-tree node is removed
@@ -568,12 +549,12 @@ HDfprintf(stderr, "%s: nrecord = {%a, %Hu, %x, %Hu, %Hu}\n", "H5HF_huge_bt2_filt
  *-------------------------------------------------------------------------
  */
 herr_t
-H5HF_huge_bt2_filt_indir_remove(const void *nrecord, void *_udata)
+H5HF__huge_bt2_filt_indir_remove(const void *nrecord, void *_udata)
 {
     H5HF_huge_remove_ud_t *udata = (H5HF_huge_remove_ud_t *)_udata;   /* User callback data */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Free the space in the file for the object being removed */
     if(H5MF_xfree(udata->hdr->f, H5FD_MEM_FHEAP_HUGE_OBJ, udata->dxpl_id, ((const H5HF_huge_bt2_filt_indir_rec_t *)nrecord)->addr, ((const H5HF_huge_bt2_filt_indir_rec_t *)nrecord)->len) < 0)
@@ -584,11 +565,11 @@ H5HF_huge_bt2_filt_indir_remove(const void *nrecord, void *_udata)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5HF_huge_bt2_filt_indir_remove() */
+} /* H5HF__huge_bt2_filt_indir_remove() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_filt_indir_store
+ * Function:	H5HF__huge_bt2_filt_indir_store
  *
  * Purpose:	Store native information into record for v2 B-tree
  *
@@ -601,18 +582,18 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_filt_indir_store(void *nrecord, const void *udata)
+H5HF__huge_bt2_filt_indir_store(void *nrecord, const void *udata)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     *(H5HF_huge_bt2_filt_indir_rec_t *)nrecord = *(const H5HF_huge_bt2_filt_indir_rec_t *)udata;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_filt_indir_store() */
+} /* H5HF__huge_bt2_filt_indir_store() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_filt_indir_compare
+ * Function:	H5HF__huge_bt2_filt_indir_compare
  *
  * Purpose:	Compare two native information records, according to some key
  *
@@ -626,25 +607,16 @@ H5HF_huge_bt2_filt_indir_store(void *nrecord, const void *udata)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_filt_indir_compare(const void *_rec1, const void *_rec2)
+H5HF__huge_bt2_filt_indir_compare(const void *_rec1, const void *_rec2)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
-#ifdef QAK
-{
-const H5HF_huge_bt2_filt_indir_rec_t *rec1 = (const H5HF_huge_bt2_filt_indir_rec_t *)_rec1;
-const H5HF_huge_bt2_filt_indir_rec_t *rec2 = (const H5HF_huge_bt2_filt_indir_rec_t *)_rec2;
-
-HDfprintf(stderr, "%s: rec1 = {%a, %Hu, %x, %Hu, %Hu}\n", "H5HF_huge_bt2_filt_indir_compare", rec1->addr, rec1->len, rec1->filter_mask, rec1->obj_size, rec1->id);
-HDfprintf(stderr, "%s: rec2 = {%a, %Hu, %x, %Hu, %Hu}\n", "H5HF_huge_bt2_filt_indir_compare", rec2->addr, rec2->len, rec2->filter_mask, rec2->obj_size, rec2->id);
-}
-#endif /* QAK */
     FUNC_LEAVE_NOAPI((herr_t)(((const H5HF_huge_bt2_filt_indir_rec_t *)_rec1)->id - ((const H5HF_huge_bt2_filt_indir_rec_t *)_rec2)->id))
-} /* H5HF_huge_bt2_filt_indir_compare() */
+} /* H5HF__huge_bt2_filt_indir_compare() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_filt_indir_encode
+ * Function:	H5HF__huge_bt2_filt_indir_encode
  *
  * Purpose:	Encode native information into raw form for storing on disk
  *
@@ -657,12 +629,12 @@ HDfprintf(stderr, "%s: rec2 = {%a, %Hu, %x, %Hu, %Hu}\n", "H5HF_huge_bt2_filt_in
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_filt_indir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
+H5HF__huge_bt2_filt_indir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
 {
     H5HF_huge_bt2_ctx_t *ctx = (H5HF_huge_bt2_ctx_t *)_ctx;       /* Callback context structure */
     const H5HF_huge_bt2_filt_indir_rec_t *nrecord = (const H5HF_huge_bt2_filt_indir_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Sanity check */
     HDassert(ctx);
@@ -675,11 +647,11 @@ H5HF_huge_bt2_filt_indir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
     H5F_ENCODE_LENGTH_LEN(raw, nrecord->id, ctx->sizeof_size);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_filt_indir_encode() */
+} /* H5HF__huge_bt2_filt_indir_encode() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_filt_indir_decode
+ * Function:	H5HF__huge_bt2_filt_indir_decode
  *
  * Purpose:	Decode raw disk form of record into native form
  *
@@ -692,12 +664,12 @@ H5HF_huge_bt2_filt_indir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_filt_indir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
+H5HF__huge_bt2_filt_indir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
 {
     H5HF_huge_bt2_ctx_t *ctx = (H5HF_huge_bt2_ctx_t *)_ctx;       /* Callback context structure */
     H5HF_huge_bt2_filt_indir_rec_t *nrecord = (H5HF_huge_bt2_filt_indir_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Sanity check */
     HDassert(ctx);
@@ -710,11 +682,11 @@ H5HF_huge_bt2_filt_indir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
     H5F_DECODE_LENGTH_LEN(raw, nrecord->id, ctx->sizeof_size);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_filt_indir_decode() */
+} /* H5HF__huge_bt2_filt_indir_decode() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_filt_indir_debug
+ * Function:	H5HF__huge_bt2_filt_indir_debug
  *
  * Purpose:	Debug native form of record
  *
@@ -727,23 +699,22 @@ H5HF_huge_bt2_filt_indir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_filt_indir_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
-    int indent, int fwidth, const void *_nrecord,
-    const void H5_ATTR_UNUSED *_udata)
+H5HF__huge_bt2_filt_indir_debug(FILE *stream, int indent, int fwidth,
+    const void *_nrecord, const void H5_ATTR_UNUSED *_udata)
 {
     const H5HF_huge_bt2_filt_indir_rec_t *nrecord = (const H5HF_huge_bt2_filt_indir_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     HDfprintf(stream, "%*s%-*s {%a, %Hu, %x, %Hu, %Hu}\n", indent, "", fwidth, "Record:",
         nrecord->addr, nrecord->len, nrecord->filter_mask, nrecord->obj_size, nrecord->id);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_filt_indir_debug() */
+} /* H5HF__huge_bt2_filt_indir_debug() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_dir_remove
+ * Function:	H5HF__huge_bt2_dir_remove
  *
  * Purpose:	Free space for directly accessed 'huge' object, as v2 B-tree
  *              is being deleted or v2 B-tree node is being removed
@@ -757,12 +728,12 @@ H5HF_huge_bt2_filt_indir_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_
  *-------------------------------------------------------------------------
  */
 herr_t
-H5HF_huge_bt2_dir_remove(const void *nrecord, void *_udata)
+H5HF__huge_bt2_dir_remove(const void *nrecord, void *_udata)
 {
     H5HF_huge_remove_ud_t *udata = (H5HF_huge_remove_ud_t *)_udata;   /* User callback data */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Free the space in the file for the object being removed */
     if(H5MF_xfree(udata->hdr->f, H5FD_MEM_FHEAP_HUGE_OBJ, udata->dxpl_id, ((const H5HF_huge_bt2_indir_rec_t *)nrecord)->addr, ((const H5HF_huge_bt2_indir_rec_t *)nrecord)->len) < 0)
@@ -773,11 +744,11 @@ H5HF_huge_bt2_dir_remove(const void *nrecord, void *_udata)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5HF_huge_bt2_dir_remove() */
+} /* H5HF__huge_bt2_dir_remove() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_dir_store
+ * Function:	H5HF__huge_bt2_dir_store
  *
  * Purpose:	Store native information into record for v2 B-tree
  *
@@ -790,18 +761,18 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_dir_store(void *nrecord, const void *udata)
+H5HF__huge_bt2_dir_store(void *nrecord, const void *udata)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     *(H5HF_huge_bt2_dir_rec_t *)nrecord = *(const H5HF_huge_bt2_dir_rec_t *)udata;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_dir_store() */
+} /* H5HF__huge_bt2_dir_store() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_dir_compare
+ * Function:	H5HF__huge_bt2_dir_compare
  *
  * Purpose:	Compare two native information records, according to some key
  *
@@ -815,18 +786,14 @@ H5HF_huge_bt2_dir_store(void *nrecord, const void *udata)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_dir_compare(const void *_rec1, const void *_rec2)
+H5HF__huge_bt2_dir_compare(const void *_rec1, const void *_rec2)
 {
     const H5HF_huge_bt2_dir_rec_t *rec1 = (const H5HF_huge_bt2_dir_rec_t *)_rec1;
     const H5HF_huge_bt2_dir_rec_t *rec2 = (const H5HF_huge_bt2_dir_rec_t *)_rec2;
-    herr_t ret_value;           /* Return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
-#ifdef QAK
-HDfprintf(stderr, "%s: rec1 = {%a, %Hu}\n", "H5HF_huge_bt2_dir_compare", rec1->addr, rec1->len);
-HDfprintf(stderr, "%s: rec2 = {%a, %Hu}\n", "H5HF_huge_bt2_dir_compare", rec2->addr, rec2->len);
-#endif /* QAK */
     if(rec1->addr < rec2->addr)
         ret_value = -1;
     else if(rec1->addr > rec2->addr)
@@ -839,11 +806,11 @@ HDfprintf(stderr, "%s: rec2 = {%a, %Hu}\n", "H5HF_huge_bt2_dir_compare", rec2->a
         ret_value = 0;
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5HF_huge_bt2_dir_compare() */
+} /* H5HF__huge_bt2_dir_compare() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_dir_encode
+ * Function:	H5HF__huge_bt2_dir_encode
  *
  * Purpose:	Encode native information into raw form for storing on disk
  *
@@ -856,12 +823,12 @@ HDfprintf(stderr, "%s: rec2 = {%a, %Hu}\n", "H5HF_huge_bt2_dir_compare", rec2->a
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_dir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
+H5HF__huge_bt2_dir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
 {
     H5HF_huge_bt2_ctx_t *ctx = (H5HF_huge_bt2_ctx_t *)_ctx;       /* Callback context structure */
     const H5HF_huge_bt2_dir_rec_t *nrecord = (const H5HF_huge_bt2_dir_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Sanity check */
     HDassert(ctx);
@@ -871,11 +838,11 @@ H5HF_huge_bt2_dir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
     H5F_ENCODE_LENGTH_LEN(raw, nrecord->len, ctx->sizeof_size);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_dir_encode() */
+} /* H5HF__huge_bt2_dir_encode() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_dir_decode
+ * Function:	H5HF__huge_bt2_dir_decode
  *
  * Purpose:	Decode raw disk form of record into native form
  *
@@ -888,12 +855,12 @@ H5HF_huge_bt2_dir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_dir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
+H5HF__huge_bt2_dir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
 {
     H5HF_huge_bt2_ctx_t *ctx = (H5HF_huge_bt2_ctx_t *)_ctx;       /* Callback context structure */
     H5HF_huge_bt2_dir_rec_t *nrecord = (H5HF_huge_bt2_dir_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Sanity check */
     HDassert(ctx);
@@ -903,11 +870,11 @@ H5HF_huge_bt2_dir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
     H5F_DECODE_LENGTH_LEN(raw, nrecord->len, ctx->sizeof_size);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_dir_decode() */
+} /* H5HF__huge_bt2_dir_decode() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_dir_debug
+ * Function:	H5HF__huge_bt2_dir_debug
  *
  * Purpose:	Debug native form of record
  *
@@ -920,23 +887,22 @@ H5HF_huge_bt2_dir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_dir_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
-    int indent, int fwidth, const void *_nrecord,
-    const void H5_ATTR_UNUSED *_udata)
+H5HF__huge_bt2_dir_debug(FILE *stream, int indent, int fwidth,
+    const void *_nrecord, const void H5_ATTR_UNUSED *_udata)
 {
     const H5HF_huge_bt2_dir_rec_t *nrecord = (const H5HF_huge_bt2_dir_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     HDfprintf(stream, "%*s%-*s {%a, %Hu}\n", indent, "", fwidth, "Record:",
         nrecord->addr, nrecord->len);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_dir_debug() */
+} /* H5HF__huge_bt2_dir_debug() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_filt_dir_found
+ * Function:	H5HF__huge_bt2_filt_dir_found
  *
  * Purpose:	Retrieve record for directly accessed, filtered 'huge' object,
  *              when it's found in the v2 B-tree
@@ -950,25 +916,18 @@ H5HF_huge_bt2_dir_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_AT
  *-------------------------------------------------------------------------
  */
 herr_t
-H5HF_huge_bt2_filt_dir_found(const void *nrecord, void *op_data)
+H5HF__huge_bt2_filt_dir_found(const void *nrecord, void *op_data)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-#ifdef QAK
-HDfprintf(stderr, "%s: nrecord = {%a, %Hu, %x, %Hu}\n", "H5HF_huge_bt2_filt_dir_found",
-        ((const H5HF_huge_bt2_filt_dir_rec_t *)nrecord)->addr,
-        ((const H5HF_huge_bt2_filt_dir_rec_t *)nrecord)->len,
-        ((const H5HF_huge_bt2_filt_dir_rec_t *)nrecord)->filter_mask,
-        ((const H5HF_huge_bt2_filt_dir_rec_t *)nrecord)->obj_size);
-#endif /* QAK */
+    FUNC_ENTER_PACKAGE_NOERR
+
     *(H5HF_huge_bt2_filt_dir_rec_t *)op_data = *(const H5HF_huge_bt2_filt_dir_rec_t *)nrecord;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_filt_dir_found() */
+} /* H5HF__huge_bt2_filt_dir_found() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_filt_dir_remove
+ * Function:	H5HF__huge_bt2_filt_dir_remove
  *
  * Purpose:	Free space for directly accessed, filtered 'huge' object, as
  *              v2 B-tree is being deleted or v2 B-tree node is removed
@@ -982,12 +941,12 @@ HDfprintf(stderr, "%s: nrecord = {%a, %Hu, %x, %Hu}\n", "H5HF_huge_bt2_filt_dir_
  *-------------------------------------------------------------------------
  */
 herr_t
-H5HF_huge_bt2_filt_dir_remove(const void *nrecord, void *_udata)
+H5HF__huge_bt2_filt_dir_remove(const void *nrecord, void *_udata)
 {
     H5HF_huge_remove_ud_t *udata = (H5HF_huge_remove_ud_t *)_udata;   /* User callback data */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Free the space in the file for the object being removed */
     if(H5MF_xfree(udata->hdr->f, H5FD_MEM_FHEAP_HUGE_OBJ, udata->dxpl_id, ((const H5HF_huge_bt2_filt_dir_rec_t *)nrecord)->addr, ((const H5HF_huge_bt2_filt_dir_rec_t *)nrecord)->len) < 0)
@@ -998,11 +957,11 @@ H5HF_huge_bt2_filt_dir_remove(const void *nrecord, void *_udata)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5HF_huge_bt2_filt_dir_remove() */
+} /* H5HF__huge_bt2_filt_dir_remove() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_filt_dir_store
+ * Function:	H5HF__huge_bt2_filt_dir_store
  *
  * Purpose:	Store native information into record for v2 B-tree
  *
@@ -1015,18 +974,18 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_filt_dir_store(void *nrecord, const void *udata)
+H5HF__huge_bt2_filt_dir_store(void *nrecord, const void *udata)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     *(H5HF_huge_bt2_filt_dir_rec_t *)nrecord = *(const H5HF_huge_bt2_filt_dir_rec_t *)udata;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_filt_dir_store() */
+} /* H5HF__huge_bt2_filt_dir_store() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_filt_dir_compare
+ * Function:	H5HF__huge_bt2_filt_dir_compare
  *
  * Purpose:	Compare two native information records, according to some key
  *
@@ -1040,18 +999,14 @@ H5HF_huge_bt2_filt_dir_store(void *nrecord, const void *udata)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_filt_dir_compare(const void *_rec1, const void *_rec2)
+H5HF__huge_bt2_filt_dir_compare(const void *_rec1, const void *_rec2)
 {
     const H5HF_huge_bt2_filt_dir_rec_t *rec1 = (const H5HF_huge_bt2_filt_dir_rec_t *)_rec1;
     const H5HF_huge_bt2_filt_dir_rec_t *rec2 = (const H5HF_huge_bt2_filt_dir_rec_t *)_rec2;
-    herr_t ret_value;           /* Return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
-#ifdef QAK
-HDfprintf(stderr, "%s: rec1 = {%a, %Hu, %x, %Hu}\n", "H5HF_huge_bt2_filt_dir_compare", rec1->addr, rec1->len, rec1->filter_mask, rec1->obj_size);
-HDfprintf(stderr, "%s: rec2 = {%a, %Hu, %x, %Hu}\n", "H5HF_huge_bt2_filt_dir_compare", rec2->addr, rec2->len, rec2->filter_mask, rec2->obj_size);
-#endif /* QAK */
     if(rec1->addr < rec2->addr)
         ret_value = -1;
     else if(rec1->addr > rec2->addr)
@@ -1064,11 +1019,11 @@ HDfprintf(stderr, "%s: rec2 = {%a, %Hu, %x, %Hu}\n", "H5HF_huge_bt2_filt_dir_com
         ret_value = 0;
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5HF_huge_bt2_filt_dir_compare() */
+} /* H5HF__huge_bt2_filt_dir_compare() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_filt_dir_encode
+ * Function:	H5HF__huge_bt2_filt_dir_encode
  *
  * Purpose:	Encode native information into raw form for storing on disk
  *
@@ -1081,12 +1036,12 @@ HDfprintf(stderr, "%s: rec2 = {%a, %Hu, %x, %Hu}\n", "H5HF_huge_bt2_filt_dir_com
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_filt_dir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
+H5HF__huge_bt2_filt_dir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
 {
     H5HF_huge_bt2_ctx_t *ctx = (H5HF_huge_bt2_ctx_t *)_ctx;       /* Callback context structure */
     const H5HF_huge_bt2_filt_dir_rec_t *nrecord = (const H5HF_huge_bt2_filt_dir_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Sanity check */
     HDassert(ctx);
@@ -1098,11 +1053,11 @@ H5HF_huge_bt2_filt_dir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
     H5F_ENCODE_LENGTH_LEN(raw, nrecord->obj_size, ctx->sizeof_size);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_filt_dir_encode() */
+} /* H5HF__huge_bt2_filt_dir_encode() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_filt_dir_decode
+ * Function:	H5HF__huge_bt2_filt_dir_decode
  *
  * Purpose:	Decode raw disk form of record into native form
  *
@@ -1115,12 +1070,12 @@ H5HF_huge_bt2_filt_dir_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_filt_dir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
+H5HF__huge_bt2_filt_dir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
 {
     H5HF_huge_bt2_ctx_t *ctx = (H5HF_huge_bt2_ctx_t *)_ctx;       /* Callback context structure */
     H5HF_huge_bt2_filt_dir_rec_t *nrecord = (H5HF_huge_bt2_filt_dir_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Sanity check */
     HDassert(ctx);
@@ -1132,11 +1087,11 @@ H5HF_huge_bt2_filt_dir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
     H5F_DECODE_LENGTH_LEN(raw, nrecord->obj_size, ctx->sizeof_size);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_filt_dir_decode() */
+} /* H5HF__huge_bt2_filt_dir_decode() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_huge_bt2_filt_dir_debug
+ * Function:	H5HF__huge_bt2_filt_dir_debug
  *
  * Purpose:	Debug native form of record
  *
@@ -1149,16 +1104,16 @@ H5HF_huge_bt2_filt_dir_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_huge_bt2_filt_dir_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
-    int indent, int fwidth, const void *_nrecord, const void H5_ATTR_UNUSED *_udata)
+H5HF__huge_bt2_filt_dir_debug(FILE *stream, int indent, int fwidth,
+    const void *_nrecord, const void H5_ATTR_UNUSED *_udata)
 {
     const H5HF_huge_bt2_filt_dir_rec_t *nrecord = (const H5HF_huge_bt2_filt_dir_rec_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     HDfprintf(stream, "%*s%-*s {%a, %Hu, %x, %Hu}\n", indent, "", fwidth, "Record:",
         nrecord->addr, nrecord->len, nrecord->filter_mask, nrecord->obj_size);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_huge_bt2_filt_dir_debug() */
+} /* H5HF__huge_bt2_filt_dir_debug() */
 
diff --git a/src/H5HFcache.c b/src/H5HFcache.c
index 8e1f838..7337f39 100644
--- a/src/H5HFcache.c
+++ b/src/H5HFcache.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+#include "H5HFmodule.h"         /* This source code file is part of the H5HF module */
 
 
 /***********/
@@ -40,7 +40,7 @@
 #include "H5HFpkg.h"		/* Fractal heaps			*/
 #include "H5MFprivate.h"	/* File memory management		*/
 #include "H5MMprivate.h"	/* Memory management			*/
-#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+#include "H5VMprivate.h"	/* Vectors and arrays 			*/
 #include "H5WBprivate.h"        /* Wrapped Buffers                      */
 
 
@@ -53,12 +53,6 @@
 #define H5HF_DBLOCK_VERSION     0               /* Direct block */
 #define H5HF_IBLOCK_VERSION     0               /* Indirect block */
 
-/* Size of stack buffer for serialized headers */
-#define H5HF_HDR_BUF_SIZE       512
-
-/* Size of stack buffer for serialized indirect blocks */
-#define H5HF_IBLOCK_BUF_SIZE    4096
-
 
 /******************/
 /* Local Typedefs */
@@ -75,25 +69,73 @@
 /********************/
 
 /* Local encode/decode routines */
-static herr_t H5HF_dtable_encode(H5F_t *f, uint8_t **pp, const H5HF_dtable_t *dtable);
-static herr_t H5HF_dtable_decode(H5F_t *f, const uint8_t **pp, H5HF_dtable_t *dtable);
+static herr_t H5HF__dtable_encode(H5F_t *f, uint8_t **pp, const H5HF_dtable_t *dtable);
+static herr_t H5HF__dtable_decode(H5F_t *f, const uint8_t **pp, H5HF_dtable_t *dtable);
 
 /* Metadata cache (H5AC) callbacks */
-static H5HF_hdr_t *H5HF_cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static herr_t H5HF_cache_hdr_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5HF_hdr_t *hdr, unsigned H5_ATTR_UNUSED * flags_ptr);
-static herr_t H5HF_cache_hdr_dest(H5F_t *f, H5HF_hdr_t *hdr);
-static herr_t H5HF_cache_hdr_clear(H5F_t *f, H5HF_hdr_t *hdr, hbool_t destroy);
-static herr_t H5HF_cache_hdr_size(const H5F_t *f, const H5HF_hdr_t *hdr, size_t *size_ptr);
-static H5HF_indirect_t *H5HF_cache_iblock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static herr_t H5HF_cache_iblock_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5HF_indirect_t *iblock, unsigned H5_ATTR_UNUSED * flags_ptr);
-static herr_t H5HF_cache_iblock_dest(H5F_t *f, H5HF_indirect_t *iblock);
-static herr_t H5HF_cache_iblock_clear(H5F_t *f, H5HF_indirect_t *iblock, hbool_t destroy);
-static herr_t H5HF_cache_iblock_size(const H5F_t *f, const H5HF_indirect_t *iblock, size_t *size_ptr);
-static H5HF_direct_t *H5HF_cache_dblock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static herr_t H5HF_cache_dblock_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5HF_direct_t *dblock, unsigned H5_ATTR_UNUSED * flags_ptr);
-static herr_t H5HF_cache_dblock_dest(H5F_t *f, H5HF_direct_t *dblock);
-static herr_t H5HF_cache_dblock_clear(H5F_t *f, H5HF_direct_t *dblock, hbool_t destroy);
-static herr_t H5HF_cache_dblock_size(const H5F_t *f, const H5HF_direct_t *dblock, size_t *size_ptr);
+static herr_t H5HF__cache_hdr_get_load_size(const void *image_ptr, void *udata, 
+    size_t *image_len, size_t *actual_len, 
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5HF__cache_hdr_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
+static void *H5HF__cache_hdr_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty); 
+static herr_t H5HF__cache_hdr_image_len(const void *thing, size_t *image_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static herr_t H5HF__cache_hdr_pre_serialize(const H5F_t *f, hid_t dxpl_id,
+    void *thing, haddr_t addr, size_t len, size_t compressed_len, 
+    haddr_t *new_addr, size_t *new_len, size_t *new_compressed_len, 
+    unsigned *flags); 
+static herr_t H5HF__cache_hdr_serialize(const H5F_t *f, void *image,
+    size_t len, void *thing); 
+static herr_t H5HF__cache_hdr_free_icr(void *thing);
+
+static herr_t H5HF__cache_iblock_get_load_size(const void *image_ptr, void *udata, 
+    size_t *image_len, size_t *actual_len, 
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5HF__cache_iblock_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
+static void *H5HF__cache_iblock_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty); 
+static herr_t H5HF__cache_iblock_image_len(const void *thing, 
+    size_t *image_len, hbool_t *compressed_ptr, 
+    size_t *compressed_image_len_ptr);
+static herr_t H5HF__cache_iblock_pre_serialize(const H5F_t *f, hid_t dxpl_id,
+    void *thing, haddr_t addr, size_t len, size_t compressed_len, 
+    haddr_t *new_addr, size_t *new_len, size_t *new_compressed_len, 
+    unsigned *flags); 
+static herr_t H5HF__cache_iblock_serialize(const H5F_t *f, void *image,
+    size_t len, void *thing); 
+static herr_t H5HF__cache_iblock_notify(H5C_notify_action_t action, void *thing); 
+static herr_t H5HF__cache_iblock_free_icr(void *thing);
+
+static herr_t H5HF__cache_dblock_get_load_size(const void *image_ptr, void *udata, 
+    size_t *image_len, size_t *actual_len, 
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5HF__cache_dblock_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
+static void *H5HF__cache_dblock_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty); 
+static herr_t H5HF__cache_dblock_image_len(const void *thing, 
+    size_t *image_len, hbool_t *compressed_ptr, 
+    size_t *compressed_image_len_ptr);
+static herr_t H5HF__cache_dblock_pre_serialize(const H5F_t *f, hid_t dxpl_id,
+    void *thing, haddr_t addr, size_t len, size_t compressed_len,
+    haddr_t *new_addr, size_t *new_len, size_t *new_compressed_len, 
+    unsigned *flags); 
+static herr_t H5HF__cache_dblock_serialize(const H5F_t *f, void *image,
+    size_t len, void *thing); 
+static herr_t H5HF__cache_dblock_notify(H5C_notify_action_t action, void *thing);
+static herr_t H5HF__cache_dblock_free_icr(void *thing);
+
+/* Debugging Function Prototypes */
+#ifndef NDEBUG
+static herr_t H5HF__cache_verify_hdr_descendants_clean(H5F_t *f, hid_t dxpl_id,
+    H5HF_hdr_t *hdr, hbool_t *clean);
+static herr_t H5HF__cache_verify_iblock_descendants_clean(H5F_t *f, hid_t dxpl_id,
+    H5HF_indirect_t *iblock, unsigned *iblock_status, hbool_t *clean);
+static herr_t H5HF__cache_verify_iblocks_dblocks_clean(H5F_t *f,
+    H5HF_indirect_t *iblock, hbool_t *clean, hbool_t *has_dblocks);
+static herr_t H5HF__cache_verify_descendant_iblocks_clean(H5F_t *f, hid_t dxpl_id,
+    H5HF_indirect_t *iblock, hbool_t *clean, hbool_t *has_iblocks);
+#endif /* NDEBUG */
 
 
 /*********************/
@@ -102,32 +144,56 @@ static herr_t H5HF_cache_dblock_size(const H5F_t *f, const H5HF_direct_t *dblock
 
 /* H5HF header inherits cache-like properties from H5AC */
 const H5AC_class_t H5AC_FHEAP_HDR[1] = {{
-    H5AC_FHEAP_HDR_ID,
-    (H5AC_load_func_t)H5HF_cache_hdr_load,
-    (H5AC_flush_func_t)H5HF_cache_hdr_flush,
-    (H5AC_dest_func_t)H5HF_cache_hdr_dest,
-    (H5AC_clear_func_t)H5HF_cache_hdr_clear,
-    (H5AC_size_func_t)H5HF_cache_hdr_size,
+    H5AC_FHEAP_HDR_ID,                  /* Metadata client ID */
+    "fractal heap header",              /* Metadata client name (for debugging) */
+    H5FD_MEM_FHEAP_HDR,                 /* File space memory type for client */
+    H5AC__CLASS_SPECULATIVE_LOAD_FLAG,  /* Client class behavior flags */
+    H5HF__cache_hdr_get_load_size,      /* 'get_load_size' callback */
+    H5HF__cache_hdr_verify_chksum, 	/* 'verify_chksum' callback */
+    H5HF__cache_hdr_deserialize,        /* 'deserialize' callback */
+    H5HF__cache_hdr_image_len,          /* 'image_len' callback */
+    H5HF__cache_hdr_pre_serialize,      /* 'pre_serialize' callback */
+    H5HF__cache_hdr_serialize,          /* 'serialize' callback */
+    NULL,                               /* 'notify' callback */
+    H5HF__cache_hdr_free_icr,           /* 'free_icr' callback */
+    NULL,                               /* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
 }};
 
 /* H5HF indirect block inherits cache-like properties from H5AC */
 const H5AC_class_t H5AC_FHEAP_IBLOCK[1] = {{
-    H5AC_FHEAP_IBLOCK_ID,
-    (H5AC_load_func_t)H5HF_cache_iblock_load,
-    (H5AC_flush_func_t)H5HF_cache_iblock_flush,
-    (H5AC_dest_func_t)H5HF_cache_iblock_dest,
-    (H5AC_clear_func_t)H5HF_cache_iblock_clear,
-    (H5AC_size_func_t)H5HF_cache_iblock_size,
+    H5AC_FHEAP_IBLOCK_ID,               /* Metadata client ID */
+    "fractal heap indirect block",      /* Metadata client name (for debugging) */
+    H5FD_MEM_FHEAP_IBLOCK,              /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5HF__cache_iblock_get_load_size,   /* 'get_load_size' callback */
+    H5HF__cache_iblock_verify_chksum,	/* 'verify_chksum' callback */
+    H5HF__cache_iblock_deserialize,     /* 'deserialize' callback */
+    H5HF__cache_iblock_image_len,       /* 'image_len' callback */
+    H5HF__cache_iblock_pre_serialize,   /* 'pre_serialize' callback */
+    H5HF__cache_iblock_serialize,       /* 'serialize' callback */
+    H5HF__cache_iblock_notify,          /* 'notify' callback */
+    H5HF__cache_iblock_free_icr,        /* 'free_icr' callback */
+    NULL,                               /* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
 }};
 
 /* H5HF direct block inherits cache-like properties from H5AC */
 const H5AC_class_t H5AC_FHEAP_DBLOCK[1] = {{
-    H5AC_FHEAP_DBLOCK_ID,
-    (H5AC_load_func_t)H5HF_cache_dblock_load,
-    (H5AC_flush_func_t)H5HF_cache_dblock_flush,
-    (H5AC_dest_func_t)H5HF_cache_dblock_dest,
-    (H5AC_clear_func_t)H5HF_cache_dblock_clear,
-    (H5AC_size_func_t)H5HF_cache_dblock_size,
+    H5AC_FHEAP_DBLOCK_ID,               /* Metadata client ID */
+    "fractal heap direct block",        /* Metadata client name (for debugging) */
+    H5FD_MEM_FHEAP_DBLOCK,              /* File space memory type for client */
+    H5C__CLASS_COMPRESSED_FLAG,         /* Client class behavior flags */
+    H5HF__cache_dblock_get_load_size,   /* 'get_load_size' callback */
+    H5HF__cache_dblock_verify_chksum,	/* 'verify_chksum' callback */
+    H5HF__cache_dblock_deserialize,     /* 'deserialize' callback */
+    H5HF__cache_dblock_image_len,       /* 'image_len' callback */
+    H5HF__cache_dblock_pre_serialize,   /* 'pre_serialize' callback */
+    H5HF__cache_dblock_serialize,       /* 'serialize' callback */
+    H5HF__cache_dblock_notify,          /* 'notify' callback */
+    H5HF__cache_dblock_free_icr,        /* 'free_icr' callback */
+    NULL,                               /* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
 }};
 
 
@@ -146,7 +212,7 @@ H5FL_BLK_DEFINE(direct_block);
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_dtable_decode
+ * Function:	H5HF__dtable_decode
  *
  * Purpose:	Decodes the metadata for a doubling table
  *
@@ -161,9 +227,9 @@ H5FL_BLK_DEFINE(direct_block);
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_dtable_decode(H5F_t *f, const uint8_t **pp, H5HF_dtable_t *dtable)
+H5HF__dtable_decode(H5F_t *f, const uint8_t **pp, H5HF_dtable_t *dtable)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Check arguments */
     HDassert(f);
@@ -192,11 +258,11 @@ H5HF_dtable_decode(H5F_t *f, const uint8_t **pp, H5HF_dtable_t *dtable)
     UINT16DECODE(*pp, dtable->curr_root_rows);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5HF_dtable_decode() */
+} /* end H5HF__dtable_decode() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_dtable_encode
+ * Function:	H5HF__dtable_encode
  *
  * Purpose:	Encodes the metadata for a doubling table
  *
@@ -211,9 +277,9 @@ H5HF_dtable_decode(H5F_t *f, const uint8_t **pp, H5HF_dtable_t *dtable)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HF_dtable_encode(H5F_t *f, uint8_t **pp, const H5HF_dtable_t *dtable)
+H5HF__dtable_encode(H5F_t *f, uint8_t **pp, const H5HF_dtable_t *dtable)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Check arguments */
     HDassert(f);
@@ -242,153 +308,302 @@ H5HF_dtable_encode(H5F_t *f, uint8_t **pp, const H5HF_dtable_t *dtable)
     UINT16ENCODE(*pp, dtable->curr_root_rows);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5HF_dtable_encode() */
+} /* end H5HF__dtable_encode() */
+
+/**************************************************/
+/* metadata cache callback definitions for header */
+/**************************************************/
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_cache_hdr_load
+ * Function:	H5HF__cache_hdr_get_load_size()
  *
- * Purpose:	Loads a fractal heap header from the disk.
+ * Purpose:	Determine the size of the fractal heap header on disk,
+ *		and set *image_len to this value.
  *
- * Return:	Success:	Pointer to a new fractal heap
+ *		This code is based on the old H5HF_cache_hdr_load() routine
+ *		that was used with the version 2 metadata cache.  Note the 
+ *		use of a dummy header to compute the on disk size of the header.
+ *
+ *		Note also that the value returned by this function presumes that 
+ *		there is no I/O filtering data in the header.  If there is, the 
+ *		size reported will be too small, and H5C_load_entry()
+ *		will have to make two tries to load the fractal heap header.
+ *
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
+ *
+ * Programmer:	John Mainzer
+ *		6/21/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5HF__cache_hdr_get_load_size(const void *_image, void *_udata, size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
+{
+    const uint8_t *image = (const uint8_t *)_image;	/* Pointer into raw data buffer */
+    H5HF_hdr_cache_ud_t *udata = (H5HF_hdr_cache_ud_t *)_udata; /* pointer to user data */
+    H5HF_hdr_t dummy_hdr; 				/* dummy header -- to compute size */
+    unsigned id_len;            /* Size of heap IDs (in bytes) */
+    unsigned filter_len;        /* Size of I/O filter information (in bytes) */
+    size_t filter_info_size;    /* Size of filter information */
+    htri_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(udata);
+    HDassert(image_len);
+
+    if(image == NULL) {
+	/* Set the internal parameters for the heap */
+	dummy_hdr.f = udata->f;
+	dummy_hdr.sizeof_size = H5F_SIZEOF_SIZE(udata->f);
+	dummy_hdr.sizeof_addr = H5F_SIZEOF_ADDR(udata->f);
+
+	/* Compute the 'base' size of the fractal heap header on disk */
+	*image_len = (size_t)H5HF_HEADER_SIZE(&dummy_hdr);
+
+    } else { /* compute actual_len */
+
+	HDassert(actual_len);
+	HDassert(*actual_len == *image_len);
+
+	/* Magic number */
+	if(HDmemcmp(image, H5HF_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+	    HGOTO_DONE(FAIL)
+	image += H5_SIZEOF_MAGIC;
+
+	/* Version */
+	if(*image++ != H5HF_HDR_VERSION)
+	    HGOTO_DONE(FAIL)
+
+	/* General heap information */
+	UINT16DECODE(image, id_len);              /* Heap ID length */
+	UINT16DECODE(image, filter_len);          /* I/O filters' encoded length */
+
+	if(filter_len > 0) {
+
+	    /* Compute the size of the extra filter information */
+	    filter_info_size = (size_t)(H5F_SIZEOF_SIZE(udata->f)   /* Size of size for filtered root direct block */
+				+ (unsigned)4		/* Size of filter mask for filtered root direct block */
+				+ filter_len);         	/* Size of encoded I/O filter info */
+
+	    /* Compute the heap header's size */
+	    *actual_len += filter_info_size;
+	}
+
+    } /* compute actual_len */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF__cache_hdr_get_load_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HF__cache_hdr_verify_chksum
+ *
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
+ *
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
+ *
+ * Programmer:  Vailin Choi; Aug 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5HF__cache_hdr_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSED *_udata)
+{
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+    htri_t ret_value = TRUE;	/* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(image);
+
+    /* Get stored and computed checksums */
+    H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
+
+    if(stored_chksum != computed_chksum)
+        ret_value = FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF__cache_hdr_verify_chksum() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF__cache_hdr_deserialize
+ *
+ * Purpose:	Given a buffer containing an on disk image of a fractal heap
+ *		header block, allocate an instance of H5HF_hdr_t, load the contents
+ *		of the buffer into into the new instance of H5HF_hdr_t, and then
+ *		return a pointer to the new instance.
+ *
+ *		Since H5HF__cache_hdr_get_load_size() reports header on disk size 
+ *		base on the assumption that the header contains no I/O filtering 
+ *		data, it is possible that the provided image will be too small.
+ *
+ *		In this case, we DO NOT flag an error when this is discovered.
+ *		Instead, we make note of the correct image size, and report 
+ *		success.
+ *
+ *		Since H5HF__cache_hdr_image_len() callback is defined, 
+ *		H5C_load_entry() will call H5HF__cache_hdr_image_len() and 
+ *		obtain the correct image length.  
+ *
+ *		Since the H5AC__CLASS_SPECULATIVE_LOAD_FLAG is set, 
+ *		H5C_load_entry() will load an image of the correct size, and 
+ *		then call this function again to deserialize it.  Before doing 
+ *		so, it will also call H5HF__cache_hdr_free_icr() to discard the 
+ *		result of the first deserialize call.
+ *
+ *		Note that the v2 B-tree and free space manager associated 
+ *		with the fractal heap (roots stored in the huge_bt2 and fspace 
+ *		fields respectively) are not loaded at this time.  As best I can
+ *		tell from reviewing the code, they are loaded or created when 
+ *		they are accessed.
+ *
+ * Return:	Success:	Pointer to in core representation
  *		Failure:	NULL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 24 2006
+ * Programmer:	John Mainzer
+ *		6/21/14
  *
  *-------------------------------------------------------------------------
  */
-static H5HF_hdr_t *
-H5HF_cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+static void *
+H5HF__cache_hdr_deserialize(const void *_image, size_t len, void *_udata,
+    hbool_t H5_ATTR_UNUSED *dirty)
 {
-    H5HF_hdr_t		*hdr = NULL;     /* Fractal heap info */
-    H5HF_hdr_cache_ud_t *udata = (H5HF_hdr_cache_ud_t *)_udata;
-    size_t		size;           /* Header size */
-    H5WB_t              *wb = NULL;     /* Wrapped buffer for header data */
-    uint8_t             hdr_buf[H5HF_HDR_BUF_SIZE]; /* Buffer for header */
-    uint8_t		*buf;           /* Pointer to header buffer */
-    const uint8_t	*p;             /* Pointer into raw data buffer */
+    H5HF_hdr_t          *hdr = NULL;     /* Fractal heap info */
+    H5HF_hdr_cache_ud_t *udata = (H5HF_hdr_cache_ud_t *)_udata; /* User data for callback */
+    const uint8_t       *image = (const uint8_t *)_image;       /* Pointer into into supplied image */
+    size_t              size;           /* Header size */
     uint32_t            stored_chksum;  /* Stored metadata checksum value */
-    uint32_t            computed_chksum; /* Computed metadata checksum value */
     uint8_t             heap_flags;     /* Status flags for heap */
-    H5HF_hdr_t		*ret_value;     /* Return value */
+    void *              ret_value = NULL;       /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /* Check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    /* Sanity checks */
+    HDassert(image);
+    HDassert(len > 0);
     HDassert(udata);
+    HDassert(dirty);
 
     /* Allocate space for the fractal heap data structure */
     if(NULL == (hdr = H5HF_hdr_alloc(udata->f)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
-
-    /* Wrap the local buffer for serialized header info */
-    if(NULL == (wb = H5WB_wrap(hdr_buf, sizeof(hdr_buf))))
-        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, NULL, "can't wrap buffer")
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
 
     /* Compute the 'base' size of the fractal heap header on disk */
     size = (size_t)H5HF_HEADER_SIZE(hdr);
 
-    /* Get a pointer to a buffer that's large enough for serialized header */
-    if(NULL == (buf = (uint8_t *)H5WB_actual(wb, size)))
-        HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, NULL, "can't get actual buffer")
-
-    /* Read header from disk */
-    if(H5F_block_read(f, H5FD_MEM_FHEAP_HDR, addr, size, dxpl_id, buf) < 0)
-	HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "can't read fractal heap header")
-
-    /* Get temporary pointer to serialized header */
-    p = buf;
+    /* the size we have just calculated presumes that there is no I/O 
+     * filter information in the header.  If there is no filter information,
+     * the deserialize operation should succeed.
+     *
+     * If there is filter information, the first attempt to deserialize 
+     * the header will reveal this.  In this case, we will be unable to 
+     * deserialize the header as the supplied image will be too small.
+     * However, we will make note of the correct size and report success 
+     * anyway.  
+     *
+     * When H5C_load_entry() calls H5HF__cache_hdr_image_len(), we will report 
+     * the correct size.  Since the H5C__CLASS_SPECULATIVE_LOAD_FLAG is set,
+     * this will prompt H5C_load_entry() to load the correct size image,
+     * discard the result of the first attempt at deserialization, and 
+     * call this routine a second time to deserialize the correct size 
+     * buffer.
+     */
+    HDassert(size <= len);
 
     /* Magic number */
-    if(HDmemcmp(p, H5HF_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC))
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "wrong fractal heap header signature")
-    p += H5_SIZEOF_MAGIC;
+    if(HDmemcmp(image, H5HF_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+        HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "wrong fractal heap header signature")
+    image += H5_SIZEOF_MAGIC;
 
     /* Version */
-    if(*p++ != H5HF_HDR_VERSION)
-	HGOTO_ERROR(H5E_HEAP, H5E_VERSION, NULL, "wrong fractal heap header version")
+    if(*image++ != H5HF_HDR_VERSION)
+        HGOTO_ERROR(H5E_HEAP, H5E_VERSION, NULL, "wrong fractal heap header version")
 
     /* General heap information */
-    UINT16DECODE(p, hdr->id_len);               /* Heap ID length */
-    UINT16DECODE(p, hdr->filter_len);           /* I/O filters' encoded length */
+    UINT16DECODE(image, hdr->id_len);              /* Heap ID length */
+    UINT16DECODE(image, hdr->filter_len);          /* I/O filters' encoded length */
 
     /* Heap status flags */
     /* (bit 0: "huge" object IDs have wrapped) */
     /* (bit 1: checksum direct blocks) */
-    heap_flags = *p++;
+    heap_flags = *image++;
     hdr->huge_ids_wrapped = heap_flags & H5HF_HDR_FLAGS_HUGE_ID_WRAPPED;
     hdr->checksum_dblocks = heap_flags & H5HF_HDR_FLAGS_CHECKSUM_DBLOCKS;
 
     /* "Huge" object information */
-    UINT32DECODE(p, hdr->max_man_size);         /* Max. size of "managed" objects */
-    H5F_DECODE_LENGTH(udata->f, p, hdr->huge_next_id); /* Next ID to use for "huge" object */
-    H5F_addr_decode(udata->f, &p, &hdr->huge_bt2_addr); /* Address of "huge" object tracker B-tree */
+    UINT32DECODE(image, hdr->max_man_size);     /* Max. size of "managed" objects */
+    H5F_DECODE_LENGTH(udata->f, image, hdr->huge_next_id); /* Next ID to use for "huge" object */
+    H5F_addr_decode(udata->f, &image, &hdr->huge_bt2_addr); /* Address of "huge" object tracker B-tree */
 
     /* "Managed" object free space information */
-    H5F_DECODE_LENGTH(udata->f, p, hdr->total_man_free); /* Internal free space in managed direct blocks */
-    H5F_addr_decode(udata->f, &p, &hdr->fs_addr);      /* Address of free section header */
+    H5F_DECODE_LENGTH(udata->f, image, hdr->total_man_free); /* Internal free space in managed direct blocks */
+    H5F_addr_decode(udata->f, &image, &hdr->fs_addr);  /* Address of free section header */
 
     /* Heap statistics */
-    H5F_DECODE_LENGTH(udata->f, p, hdr->man_size);
-    H5F_DECODE_LENGTH(udata->f, p, hdr->man_alloc_size);
-    H5F_DECODE_LENGTH(udata->f, p, hdr->man_iter_off);
-    H5F_DECODE_LENGTH(udata->f, p, hdr->man_nobjs);
-    H5F_DECODE_LENGTH(udata->f, p, hdr->huge_size);
-    H5F_DECODE_LENGTH(udata->f, p, hdr->huge_nobjs);
-    H5F_DECODE_LENGTH(udata->f, p, hdr->tiny_size);
-    H5F_DECODE_LENGTH(udata->f, p, hdr->tiny_nobjs);
+    H5F_DECODE_LENGTH(udata->f, image, hdr->man_size);
+    H5F_DECODE_LENGTH(udata->f, image, hdr->man_alloc_size);
+    H5F_DECODE_LENGTH(udata->f, image, hdr->man_iter_off);
+    H5F_DECODE_LENGTH(udata->f, image, hdr->man_nobjs);
+    H5F_DECODE_LENGTH(udata->f, image, hdr->huge_size);
+    H5F_DECODE_LENGTH(udata->f, image, hdr->huge_nobjs);
+    H5F_DECODE_LENGTH(udata->f, image, hdr->tiny_size);
+    H5F_DECODE_LENGTH(udata->f, image, hdr->tiny_nobjs);
 
     /* Managed objects' doubling-table info */
-    if(H5HF_dtable_decode(hdr->f, &p, &(hdr->man_dtable)) < 0)
+    if(H5HF__dtable_decode(hdr->f, &image, &(hdr->man_dtable)) < 0)
         HGOTO_ERROR(H5E_HEAP, H5E_CANTENCODE, NULL, "unable to encode managed obj. doubling table info")
 
     /* Sanity check */
     /* (allow for checksum not decoded yet) */
-    HDassert((size_t)(p - (const uint8_t *)buf) == (size - H5HF_SIZEOF_CHKSUM));
+    HDassert((size_t)(image - (const uint8_t *)_image) == (size - H5HF_SIZEOF_CHKSUM));
 
     /* Check for I/O filter information to decode */
     if(hdr->filter_len > 0) {
-        size_t filter_info_off;     /* Offset in header of filter information */
         size_t filter_info_size;    /* Size of filter information */
         H5O_pline_t *pline;         /* Pipeline information from the header on disk */
 
-        /* Compute the offset of the filter info in the header */
-        filter_info_off = (size_t)(p - (const uint8_t *)buf);
-
         /* Compute the size of the extra filter information */
         filter_info_size = (size_t)(hdr->sizeof_size     /* Size of size for filtered root direct block */
-            + (unsigned)4                       /* Size of filter mask for filtered root direct block */
-            + hdr->filter_len);                 /* Size of encoded I/O filter info */
+            + (unsigned)4		/* Size of filter mask for filtered root direct block */
+            + hdr->filter_len);         /* Size of encoded I/O filter info */
 
         /* Compute the heap header's size */
         hdr->heap_size = size + filter_info_size;
 
-        /* Re-size current buffer */
-        if(NULL == (buf = (uint8_t *)H5WB_actual(wb, hdr->heap_size)))
-            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, NULL, "can't get actual buffer")
+        if(size == len) 
+	    /* we were supplied with too small a buffer -- goto done
+             * and let H5C_load_entry() retry with a larger buffer
+             */
+	    HGOTO_DONE((void *)hdr)
 
-        /* Read in I/O filter information */
-        /* (and the checksum) */
-        if(H5F_block_read(f, H5FD_MEM_FHEAP_HDR, (addr + filter_info_off), (filter_info_size + H5HF_SIZEOF_CHKSUM), dxpl_id, (buf + filter_info_off)) < 0)
-            HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "can't read fractal heap header's I/O pipeline filter info")
-
-        /* Point at correct offset in header for the filter information */
-        p = buf + filter_info_off;
+	else
+            if((size + filter_info_size) != len)
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "bad image len")
 
         /* Decode the size of a filtered root direct block */
-        H5F_DECODE_LENGTH(udata->f, p, hdr->pline_root_direct_size);
+        H5F_DECODE_LENGTH(udata->f, image, hdr->pline_root_direct_size);
 
         /* Decode the filter mask for a filtered root direct block */
-        UINT32DECODE(p, hdr->pline_root_direct_filter_mask);
+        UINT32DECODE(image, hdr->pline_root_direct_filter_mask);
 
         /* Decode I/O filter information */
-        if(NULL == (pline = (H5O_pline_t *)H5O_msg_decode(hdr->f, udata->dxpl_id, NULL, H5O_PLINE_ID, p)))
+        if(NULL == (pline = (H5O_pline_t *)H5O_msg_decode(hdr->f, udata->dxpl_id, NULL, H5O_PLINE_ID, image)))
             HGOTO_ERROR(H5E_HEAP, H5E_CANTDECODE, NULL, "can't decode I/O pipeline filters")
-        p += hdr->filter_len;
+
+        image += hdr->filter_len;
 
         /* Copy the information into the header's I/O pipeline structure */
         if(NULL == H5O_msg_copy(H5O_PLINE_ID, pline, &(hdr->pline)))
@@ -401,380 +616,473 @@ H5HF_cache_hdr_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
         /* Set the heap header's size */
         hdr->heap_size = size;
 
-    /* Compute checksum on entire header */
-    /* (including the filter information, if present) */
-    computed_chksum = H5_checksum_metadata(buf, (size_t)(p - (const uint8_t *)buf), 0);
+    /* checksum verification already done in verify_chksum cb */
 
     /* Metadata checksum */
-    UINT32DECODE(p, stored_chksum);
+    UINT32DECODE(image, stored_chksum);
 
     /* Sanity check */
-    HDassert((size_t)(p - (const uint8_t *)buf) == hdr->heap_size);
-
-    /* Verify checksum */
-    if(stored_chksum != computed_chksum)
-	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "incorrect metadata checksum for fractal heap header")
+    HDassert((size_t)(image - (const uint8_t *)_image) == hdr->heap_size);
 
     /* Finish initialization of heap header */
     if(H5HF_hdr_finish_init(hdr) < 0)
-	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, NULL, "can't finish initializing shared fractal heap header")
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, NULL, "can't finish initializing shared fractal heap header")
 
     /* Set return value */
-    ret_value = hdr;
+    ret_value = (void *)hdr;
 
 done:
-    /* Release resources */
-    if(wb && H5WB_unwrap(wb) < 0)
-        HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, NULL, "can't close wrapped buffer")
     if(!ret_value && hdr)
         if(H5HF_hdr_free(hdr) < 0)
             HDONE_ERROR(H5E_HEAP, H5E_CANTRELEASE, NULL, "unable to release fractal heap header")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HF_cache_hdr_load() */ /*lint !e818 Can't make udata a pointer to const */
+} /* end H5HF__cache_hdr_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_cache_hdr_flush
+ * Function:	H5HF__cache_hdr_image_len
  *
- * Purpose:	Flushes a dirty fractal heap header to disk.
+ * Purpose:	Return the actual size of the fractal heap header on 
+ *		disk image.  
  *
- * Return:	Non-negative on success/Negative on failure
+ *		If the header contains filter information, this size will be 
+ *		larger than the value returned by H5HF__cache_hdr_get_load_size().  
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 24 2006
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
+ *
+ * Programmer:	John Mainzer
+ *		6/21/14
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5HF_cache_hdr_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5HF_hdr_t *hdr, unsigned H5_ATTR_UNUSED * flags_ptr)
+static herr_t 
+H5HF__cache_hdr_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    H5WB_t *wb = NULL;                  /* Wrapped buffer for header data */
-    uint8_t hdr_buf[H5HF_HDR_BUF_SIZE]; /* Buffer for header */
-    herr_t ret_value = SUCCEED;         /* Return value */
+    const H5HF_hdr_t  *hdr = (const H5HF_hdr_t *)_thing;    /* Fractal heap info */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR
 
-    /* check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    /* Sanity checks */
     HDassert(hdr);
+    HDassert(hdr->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(hdr->cache_info.type == H5AC_FHEAP_HDR);
+    HDassert(image_len);
 
-    if(hdr->cache_info.is_dirty) {
-        uint8_t	*buf;           /* Temporary raw data buffer */
-        uint8_t *p;             /* Pointer into raw data buffer */
-        size_t	size;           /* Header size on disk */
-        uint8_t heap_flags;     /* Status flags for heap */
-        uint32_t metadata_chksum; /* Computed metadata checksum value */
-
-        /* Set the shared heap header's file context for this operation */
-        hdr->f = f;
-
-        /* Wrap the local buffer for serialized header info */
-        if(NULL == (wb = H5WB_wrap(hdr_buf, sizeof(hdr_buf))))
-            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't wrap buffer")
-
-        /* Compute the size of the heap header on disk */
-        size = hdr->heap_size;
-
-        /* Get a pointer to a buffer that's large enough for serialized header */
-        if(NULL == (buf = (uint8_t *)H5WB_actual(wb, size)))
-            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "can't get actual buffer")
-
-        /* Get temporary pointer to serialized header */
-        p = buf;
-
-        /* Magic number */
-        HDmemcpy(p, H5HF_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC);
-        p += H5_SIZEOF_MAGIC;
-
-        /* Version # */
-        *p++ = H5HF_HDR_VERSION;
-
-        /* General heap information */
-        UINT16ENCODE(p, hdr->id_len);           /* Heap ID length */
-        UINT16ENCODE(p, hdr->filter_len);       /* I/O filters' encoded length */
-
-        /* Heap status flags */
-        /* (bit 0: "huge" object IDs have wrapped) */
-        /* (bit 1: checksum direct blocks) */
-        heap_flags = 0;
-        heap_flags |= (hdr->huge_ids_wrapped ?  H5HF_HDR_FLAGS_HUGE_ID_WRAPPED : 0);
-        heap_flags |= (hdr->checksum_dblocks ?  H5HF_HDR_FLAGS_CHECKSUM_DBLOCKS : 0);
-        *p++ = heap_flags;
-
-        /* "Huge" object information */
-        UINT32ENCODE(p, hdr->max_man_size);             /* Max. size of "managed" objects */
-        H5F_ENCODE_LENGTH(f, p, hdr->huge_next_id);     /* Next ID to use for "huge" object */
-        H5F_addr_encode(f, &p, hdr->huge_bt2_addr);     /* Address of "huge" object tracker B-tree */
-
-        /* "Managed" object free space information */
-        H5F_ENCODE_LENGTH(f, p, hdr->total_man_free);   /* Internal free space in managed direct blocks */
-        H5F_addr_encode(f, &p, hdr->fs_addr);           /* Address of free section header */
-
-        /* Heap statistics */
-        H5F_ENCODE_LENGTH(f, p, hdr->man_size);
-        H5F_ENCODE_LENGTH(f, p, hdr->man_alloc_size);
-        H5F_ENCODE_LENGTH(f, p, hdr->man_iter_off);
-        H5F_ENCODE_LENGTH(f, p, hdr->man_nobjs);
-        H5F_ENCODE_LENGTH(f, p, hdr->huge_size);
-        H5F_ENCODE_LENGTH(f, p, hdr->huge_nobjs);
-        H5F_ENCODE_LENGTH(f, p, hdr->tiny_size);
-        H5F_ENCODE_LENGTH(f, p, hdr->tiny_nobjs);
-
-        /* Managed objects' doubling-table info */
-        if(H5HF_dtable_encode(hdr->f, &p, &(hdr->man_dtable)) < 0)
-	    HGOTO_ERROR(H5E_HEAP, H5E_CANTENCODE, FAIL, "unable to encode managed obj. doubling table info")
-
-        /* Check for I/O filter information to encode */
-        if(hdr->filter_len > 0) {
-            /* Encode the size of a filtered root direct block */
-            H5F_ENCODE_LENGTH(f, p, hdr->pline_root_direct_size);
+    *image_len = hdr->heap_size;
 
-            /* Encode the filter mask for a filtered root direct block */
-            UINT32ENCODE(p, hdr->pline_root_direct_filter_mask);
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF__cache_hdr_image_len() */
 
-            /* Encode I/O filter information */
-            if(H5O_msg_encode(hdr->f, H5O_PLINE_ID, FALSE, p, &(hdr->pline)) < 0)
-                HGOTO_ERROR(H5E_HEAP, H5E_CANTENCODE, FAIL, "can't encode I/O pipeline fiters")
-            p += hdr->filter_len;
-        } /* end if */
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF__cache_hdr_pre_serialize
+ *
+ * Purpose:	As best I can tell, fractal heap header blocks are always 
+ *		allocated in real file space.  Thus this routine simply verifies
+ *		this, verifies that the len parameter contains the expected
+ *		value, and returns an error if either of these checks fail.
+ *
+ *		When compiled in debug mode, the function also verifies that all
+ *		indirect and direct blocks that are children of the header are 
+ *		either clean, or not in the metadata cache.
+ *
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
+ *
+ * Programmer:	John Mainzer
+ *		6/21/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5HF__cache_hdr_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
+    haddr_t addr, size_t len, size_t H5_ATTR_UNUSED compressed_len, 
+    haddr_t H5_ATTR_UNUSED *new_addr, size_t H5_ATTR_UNUSED *new_len,
+    size_t H5_ATTR_UNUSED *new_compressed_len, unsigned *flags)
+{
+    H5HF_hdr_t *hdr = (H5HF_hdr_t *)_thing;     /* Fractal heap info */
+    herr_t      ret_value = SUCCEED;    /* Return value */
 
-        /* Compute metadata checksum */
-        metadata_chksum = H5_checksum_metadata(buf, (size_t)(p - buf), 0);
+    FUNC_ENTER_STATIC
 
-        /* Metadata checksum */
-        UINT32ENCODE(p, metadata_chksum);
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(hdr);
+    HDassert(hdr->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(hdr->cache_info.type == H5AC_FHEAP_HDR);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(addr == hdr->heap_addr);
+    HDassert(new_addr);
+    HDassert(new_len);
+    HDassert(flags);
+
+#ifndef NDEBUG
+{
+    hbool_t descendants_clean = TRUE;
+
+    /* Verify that flush dependencies are working correctly.  Do this
+     * by verifying that either:
+     *
+     * 1) the header has a root iblock, and that the root iblock and all
+     *    of its children are clean, or
+     *
+     * 2) The header has a root dblock, which is clean, or
+     *
+     * 3) The heap is empty, and thus the header has neither a root
+     *    iblock no a root dblock.  In this case, the flush ordering
+     *    constraint is met by default.
+     *
+     * Do this with a call to H5HF__cache_verify_hdr_descendants_clean().
+     */
+    if(H5HF__cache_verify_hdr_descendants_clean((H5F_t *)f, dxpl_id, hdr, &descendants_clean) < 0)
+         HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "can't verify hdr descendants clean.")
+    HDassert(descendants_clean);
+}
+#endif /* NDEBUG */
 
-	/* Write the heap header. */
-        HDassert((size_t)(p - buf) == size);
-	if(H5F_block_write(f, H5FD_MEM_FHEAP_HDR, addr, size, dxpl_id, buf) < 0)
-	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFLUSH, FAIL, "unable to save fractal heap header to disk")
+    if(H5F_IS_TMP_ADDR(f, addr))
+        HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, FAIL, "addr in temporary space?!?.");
 
-	hdr->cache_info.is_dirty = FALSE;
-    } /* end if */
+    if(len != hdr->heap_size)
+        HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, FAIL, "unexpected image len.");
 
-    if(destroy)
-        if(H5HF_cache_hdr_dest(f, hdr) < 0)
-	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy fractal heap header")
+    *flags = 0;
 
 done:
-    /* Release resources */
-    if(wb && H5WB_unwrap(wb) < 0)
-        HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
-
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5HF_cache_hdr_flush() */
+} /* end H5HF__cache_hdr_pre_serialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_cache_hdr_dest
+ * Function:	H5HF__cache_hdr_serialize
  *
- * Purpose:	Destroys a fractal heap header in memory.
+ * Purpose:	Construct the on disk image of the header, and place it in 
+ *		the buffer pointed to by image.  Return SUCCEED on success,
+ *		and FAIL on failure.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 24 2006
+ * Programmer:	John Mainzer
+ *		6/21/14
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5HF_cache_hdr_dest(H5F_t *f, H5HF_hdr_t *hdr)
+static herr_t 
+H5HF__cache_hdr_serialize(const H5F_t *f, void *_image, size_t len,
+    void *_thing)
 {
+    H5HF_hdr_t *hdr = (H5HF_hdr_t *)_thing;     /* Fractal heap info */
+    uint8_t    *image = (uint8_t *)_image;      /* Pointer into raw data buffer */
+    uint8_t 	heap_flags;             /* Status flags for heap */
+    uint32_t 	metadata_chksum;        /* Computed metadata checksum value */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /*
-     * Check arguments.
-     */
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(image);
     HDassert(hdr);
-    HDassert(hdr->rc == 0);
+    HDassert(hdr->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(hdr->cache_info.type == H5AC_FHEAP_HDR);
+    HDassert(len == hdr->heap_size);
+
+    /* Set the shared heap header's file context for this operation */
+    hdr->f = f;
+
+    /* Magic number */
+    HDmemcpy(image, H5HF_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    image += H5_SIZEOF_MAGIC;
+
+    /* Version # */
+    *image++ = H5HF_HDR_VERSION;
+
+    /* General heap information */
+    UINT16ENCODE(image, hdr->id_len);           /* Heap ID length */
+    UINT16ENCODE(image, hdr->filter_len);       /* I/O filters' encoded length */
+
+    /* Heap status flags */
+    /* (bit 0: "huge" object IDs have wrapped) */
+    /* (bit 1: checksum direct blocks) */
+    heap_flags = 0;
+    heap_flags = (uint8_t)(heap_flags | (hdr->huge_ids_wrapped ? H5HF_HDR_FLAGS_HUGE_ID_WRAPPED : 0));
+    heap_flags = (uint8_t)(heap_flags | (hdr->checksum_dblocks ? H5HF_HDR_FLAGS_CHECKSUM_DBLOCKS : 0));
+    *image++ = heap_flags;
+
+    /* "Huge" object information */
+    UINT32ENCODE(image, hdr->max_man_size);   /* Max. size of "managed" objects */
+    H5F_ENCODE_LENGTH(f, image, hdr->huge_next_id); /* Next ID to use for "huge" object */
+    H5F_addr_encode(f, &image, hdr->huge_bt2_addr); /* Address of "huge" object tracker B-tree */
+
+    /* "Managed" object free space information */
+    H5F_ENCODE_LENGTH(f, image, hdr->total_man_free); /* Internal free space in managed direct blocks */
+    H5F_addr_encode(f, &image, hdr->fs_addr); /* Address of free section header */
+
+    /* Heap statistics */
+    H5F_ENCODE_LENGTH(f, image, hdr->man_size);
+    H5F_ENCODE_LENGTH(f, image, hdr->man_alloc_size);
+    H5F_ENCODE_LENGTH(f, image, hdr->man_iter_off);
+    H5F_ENCODE_LENGTH(f, image, hdr->man_nobjs);
+    H5F_ENCODE_LENGTH(f, image, hdr->huge_size);
+    H5F_ENCODE_LENGTH(f, image, hdr->huge_nobjs);
+    H5F_ENCODE_LENGTH(f, image, hdr->tiny_size);
+    H5F_ENCODE_LENGTH(f, image, hdr->tiny_nobjs);
+
+    /* Managed objects' doubling-table info */
+    if(H5HF__dtable_encode(hdr->f, &image, &(hdr->man_dtable)) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTENCODE, FAIL, "unable to encode managed obj. doubling table info")
+
+    /* Check for I/O filter information to encode */
+    if(hdr->filter_len > 0) {
+        /* Encode the size of a filtered root direct block */
+        H5F_ENCODE_LENGTH(f, image, hdr->pline_root_direct_size);
 
-    /* If we're going to free the space on disk, the address must be valid */
-    HDassert(!hdr->cache_info.free_file_space_on_destroy || H5F_addr_defined(hdr->cache_info.addr));
+        /* Encode the filter mask for a filtered root direct block */
+        UINT32ENCODE(image, hdr->pline_root_direct_filter_mask);
 
-    /* Check for freeing file space for heap header */
-    if(hdr->cache_info.free_file_space_on_destroy) {
-        /* Release the space on disk */
-        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
-        if(H5MF_xfree(f, H5FD_MEM_FHEAP_HDR, H5AC_dxpl_id, hdr->cache_info.addr, (hsize_t)hdr->heap_size) < 0)
-            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free fractal heap header")
+        /* Encode I/O filter information */
+        if(H5O_msg_encode(hdr->f, H5O_PLINE_ID, FALSE, image, &(hdr->pline)) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTENCODE, FAIL, "can't encode I/O pipeline fiters")
+        image += hdr->filter_len;
     } /* end if */
 
-    /* Free the shared info itself */
-    if(H5HF_hdr_free(hdr) < 0)
-        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "unable to release fractal heap header")
+    /* Compute metadata checksum */
+    metadata_chksum = H5_checksum_metadata(_image, (size_t)(image - (uint8_t *)_image), 0);
+
+    /* Metadata checksum */
+    UINT32ENCODE(image, metadata_chksum);
+
+    /* sanity check */
+    HDassert((size_t)(image - (uint8_t *)_image) == len);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HF_cache_hdr_dest() */
+} /* end H5HF__cache_hdr_serialize() */
+
+/***************************************/
+/* no H5HF__cache_hdr_notify() function */
+/***************************************/
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_cache_hdr_clear
+ * Function:	H5HF__cache_hdr_free_icr
  *
- * Purpose:	Mark a fractal heap header in memory as non-dirty.
+ * Purpose:	Free the in core representation of the fractal heap header.
  *
- * Return:	Non-negative on success/Negative on failure
+ *		This routine frees just the header itself, not the 
+ *		associated version 2 B-Tree, the associated Free Space Manager,
+ *		nor the indirect/direct block tree that is rooted in the header.
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 24 2006
+ *		This routine also does not free the file space that may
+ *		be allocated to the header.
+ *
+ * Note:	The metadata cache sets the object's cache_info.magic to
+ *		H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC before calling a free_icr
+ *		callback (checked in assert).
+ *
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
+ *
+ * Programmer:	John Mainzer
+ *		6/21/14
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5HF_cache_hdr_clear(H5F_t *f, H5HF_hdr_t *hdr, hbool_t destroy)
+static herr_t 
+H5HF__cache_hdr_free_icr(void *_thing)
 {
-    herr_t ret_value = SUCCEED;         /* Return value */
+    H5HF_hdr_t *hdr = (H5HF_hdr_t *)_thing;     /* Fractal heap info */
+    herr_t      ret_value = SUCCEED;            /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /*
-     * Check arguments.
-     */
+    /* Sanity checks */
     HDassert(hdr);
+    HDassert(hdr->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC);
+    HDassert(hdr->cache_info.type == H5AC_FHEAP_HDR);
+    HDassert(hdr->rc == 0);
 
-    /* Reset the dirty flag.  */
-    hdr->cache_info.is_dirty = FALSE;
-
-    if(destroy)
-        if(H5HF_cache_hdr_dest(f, hdr) < 0)
-	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy fractal heap header")
+    if(H5HF_hdr_free(hdr) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "unable to release fractal heap header")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HF_cache_hdr_clear() */
+} /* end H5HF__cache_hdr_free_icr() */
+
+/***********************************************************/
+/* metadata cache callback definitions for indirect blocks */
+/***********************************************************/
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_cache_hdr_size
+ * Function:	H5HF__cache_iblock_get_load_size()
  *
- * Purpose:	Compute the size in bytes of a fractal heap header
- *		on disk, and return it in *size_ptr.  On failure,
- *		the value of *size_ptr is undefined.
+ * Purpose:	Compute the size of the on disk image of the indirect 
+ *		block, and place this value in *image_len.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 24 2006
+ * Programmer:	John Mainzer
+ *		6/21/14
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5HF_cache_hdr_size(const H5F_t H5_ATTR_UNUSED *f, const H5HF_hdr_t *hdr, size_t *size_ptr)
+static herr_t 
+H5HF__cache_iblock_get_load_size(const void *_image, void *_udata, size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    H5HF_iblock_cache_ud_t *udata = (H5HF_iblock_cache_ud_t *)_udata;   /* User data for callback */
 
-    /* Check arguments */
-    HDassert(f);
-    HDassert(hdr);
-    HDassert(size_ptr);
+    FUNC_ENTER_STATIC_NOERR
 
-    /* Set size value */
-    *size_ptr = hdr->heap_size;
+    /* Sanity checks */
+    HDassert(udata);
+    HDassert(udata->par_info);
+    HDassert(udata->par_info->hdr);
+    HDassert(image_len);
+   
+    if(image == NULL)
+	*image_len = (size_t)H5HF_MAN_INDIRECT_SIZE(udata->par_info->hdr, *udata->nrows);
+    else {
+        HDassert(actual_len);
+        HDassert(*actual_len == *image_len);
+    } /* end else */
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_cache_hdr_size() */
+} /* end H5HF__cache_iblock_get_load_size() */
+
+/***********************************************************/
+/* metadata cache callback definitions for indirect blocks */
+/***********************************************************/
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HF__cache_iblock_verify_chksum
+ *
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
+ *
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
+ *
+ * Programmer:  Vailin Choi; Aug 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5HF__cache_iblock_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSED *_udata)
+{
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+    htri_t ret_value = TRUE;	/* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(image);
+
+    /* Get stored and computed checksums */
+    H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
+
+    if(stored_chksum != computed_chksum)
+        ret_value = FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF__cache_iblock_verify_chksum() */
+
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_cache_iblock_load
+ * Function:	H5HF__cache_iblock_deserialize
  *
- * Purpose:	Loads a fractal heap indirect block from the disk.
+ * Purpose:	Given a buffer containing the on disk image of the indirect 
+ *		block, allocate an instance of H5HF_indirect_t, load the data 
+ *		in the buffer into this new instance, and return a pointer to 
+ *		it.
  *
- * Return:	Success:	Pointer to a new fractal heap indirect block
+ *		As best I can tell, the size of the indirect block image is fully
+ *		know before the image is loaded, so this function should succeed
+ *		unless the image is corrupt or memory allocation fails.
  *
+ * Return:	Success:	Pointer to in core representation
  *		Failure:	NULL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 27 2006
+ * Programmer:	John Mainzer
+ *		6/21/14
  *
  *-------------------------------------------------------------------------
  */
-static H5HF_indirect_t *
-H5HF_cache_iblock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+static void *
+H5HF__cache_iblock_deserialize(const void *_image, size_t len, void *_udata,
+    hbool_t H5_ATTR_UNUSED *dirty)
 {
     H5HF_hdr_t          *hdr;           /* Shared fractal heap information */
-    H5HF_iblock_cache_ud_t *udata = (H5HF_iblock_cache_ud_t *)_udata; /* user data for callback */
-    H5HF_indirect_t	*iblock = NULL; /* Indirect block info */
-    H5WB_t              *wb = NULL;     /* Wrapped buffer for indirect block data */
-    uint8_t             iblock_buf[H5HF_IBLOCK_BUF_SIZE]; /* Buffer for indirect block */
-    uint8_t		*buf;           /* Temporary buffer */
-    const uint8_t	*p;             /* Pointer into raw data buffer */
+    H5HF_iblock_cache_ud_t *udata = (H5HF_iblock_cache_ud_t *)_udata; /* User data for callback */
+    H5HF_indirect_t     *iblock = NULL; /* Indirect block info */
+    const uint8_t       *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
     haddr_t             heap_addr;      /* Address of heap header in the file */
     uint32_t            stored_chksum;  /* Stored metadata checksum value */
-    uint32_t            computed_chksum; /* Computed metadata checksum value */
     unsigned            u;              /* Local index variable */
-    H5HF_indirect_t	*ret_value;     /* Return value */
+    void *              ret_value = NULL;       /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /* Check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    /* Sanity checks */
+    HDassert(image);
     HDassert(udata);
-
-    /* Allocate space for the fractal heap indirect block */
-    if(NULL == (iblock = H5FL_CALLOC(H5HF_indirect_t)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
-
-    /* Get the pointer to the shared heap header */
+    HDassert(dirty);
     hdr = udata->par_info->hdr;
+    HDassert(hdr->f);
 
     /* Set the shared heap header's file context for this operation */
     hdr->f = udata->f;
 
+    /* Allocate space for the fractal heap indirect block */
+    if(NULL == (iblock = H5FL_CALLOC(H5HF_indirect_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
     /* Share common heap information */
     iblock->hdr = hdr;
     if(H5HF_hdr_incr(hdr) < 0)
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, NULL, "can't increment reference count on shared heap header")
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, NULL, "can't increment reference count on shared heap header")
 
     /* Set block's internal information */
     iblock->rc = 0;
     iblock->nrows = *udata->nrows;
     iblock->nchildren = 0;
 
-    /* Wrap the local buffer for serialized indirect block */
-    if(NULL == (wb = H5WB_wrap(iblock_buf, sizeof(iblock_buf))))
-        HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, NULL, "can't wrap buffer")
-
     /* Compute size of indirect block */
     iblock->size = H5HF_MAN_INDIRECT_SIZE(hdr, iblock->nrows);
 
-    /* Get a pointer to a buffer that's large enough for serialized indirect block */
-    if(NULL == (buf = (uint8_t *)H5WB_actual(wb, iblock->size)))
-        HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, NULL, "can't get actual buffer")
-
-    /* Read indirect block from disk */
-    if(H5F_block_read(f, H5FD_MEM_FHEAP_IBLOCK, addr, iblock->size, dxpl_id, buf) < 0)
-	HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "can't read fractal heap indirect block")
-
-    /* Get temporary pointer to serialized indirect block */
-    p = buf;
+    /* sanity check */
+    HDassert(iblock->size == len);
 
     /* Magic number */
-    if(HDmemcmp(p, H5HF_IBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC))
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "wrong fractal heap indirect block signature")
-    p += H5_SIZEOF_MAGIC;
+    if(HDmemcmp(image, H5HF_IBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+        HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "wrong fractal heap indirect block signature")
+    image += H5_SIZEOF_MAGIC;
 
     /* Version */
-    if(*p++ != H5HF_IBLOCK_VERSION)
-	HGOTO_ERROR(H5E_HEAP, H5E_VERSION, NULL, "wrong fractal heap direct block version")
+    if(*image++ != H5HF_IBLOCK_VERSION)
+        HGOTO_ERROR(H5E_HEAP, H5E_VERSION, NULL, "wrong fractal heap direct block version")
 
     /* Address of heap that owns this block */
-    H5F_addr_decode(udata->f, &p, &heap_addr);
+    H5F_addr_decode(udata->f, &image, &heap_addr);
     if(H5F_addr_ne(heap_addr, hdr->heap_addr))
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "incorrect heap header address for direct block")
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "incorrect heap header address for direct block")
 
     /* Address of parent block */
     iblock->parent = udata->par_info->iblock;
+    /* this copy of the parent pointer is needed by the notify callback so */
+    /* that it can take down flush dependencies on eviction even if        */
+    /* the parent pointer has been nulled out.             JRM -- 5/18/14  */
+    iblock->fd_parent = udata->par_info->iblock;
     iblock->par_entry = udata->par_info->entry;
     if(iblock->parent) {
         /* Share parent block */
@@ -790,14 +1098,15 @@ H5HF_cache_iblock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
     } /* end else */
 
     /* Offset of heap within the heap's address space */
-    UINT64DECODE_VAR(p, iblock->block_off, hdr->heap_off_size);
+    UINT64DECODE_VAR(image, iblock->block_off, hdr->heap_off_size);
 
     /* Allocate & decode child block entry tables */
     HDassert(iblock->nrows > 0);
     if(NULL == (iblock->ents = H5FL_SEQ_MALLOC(H5HF_indirect_ent_t, (size_t)(iblock->nrows * hdr->man_dtable.cparam.width))))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for direct entries")
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for direct entries")
+
     if(hdr->filter_len > 0) {
-        unsigned dir_rows;      /* Number of direct rows in this indirect block */
+        unsigned dir_rows;   /* Number of direct rows in this indirect block */
 
         /* Compute the number of direct rows for this indirect block */
         dir_rows = MIN(iblock->nrows, hdr->man_dtable.max_direct_rows);
@@ -808,9 +1117,10 @@ H5HF_cache_iblock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
     } /* end if */
     else
         iblock->filt_ents = NULL;
+
     for(u = 0; u < (iblock->nrows * hdr->man_dtable.cparam.width); u++) {
         /* Decode child block address */
-        H5F_addr_decode(udata->f, &p, &(iblock->ents[u].addr));
+        H5F_addr_decode(udata->f, &image, &(iblock->ents[u].addr));
 
         /* Check for heap with I/O filters */
         if(hdr->filter_len > 0) {
@@ -820,7 +1130,7 @@ H5HF_cache_iblock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
             /* Decode extra information for direct blocks */
             if(u < (hdr->man_dtable.max_direct_rows * hdr->man_dtable.cparam.width)) {
                 /* Size of filtered direct block */
-                H5F_DECODE_LENGTH(udata->f, p, iblock->filt_ents[u].size);
+                H5F_DECODE_LENGTH(udata->f, image, iblock->filt_ents[u].size);
 
                 /* Sanity check */
                 /* (either both the address & size are defined or both are
@@ -830,7 +1140,7 @@ H5HF_cache_iblock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
                     || (!H5F_addr_defined(iblock->ents[u].addr) && iblock->filt_ents[u].size == 0));
 
                 /* I/O filter mask for filtered direct block */
-                UINT32DECODE(p, iblock->filt_ents[u].filter_mask);
+                UINT32DECODE(image, iblock->filt_ents[u].filter_mask);
             } /* end if */
         } /* end if */
 
@@ -842,24 +1152,19 @@ H5HF_cache_iblock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
     } /* end for */
 
     /* Sanity check */
-    HDassert(iblock->nchildren);        /* indirect blocks w/no children should have been deleted */
+    HDassert(iblock->nchildren);   /* indirect blocks w/no children should have been deleted */
 
-    /* Compute checksum on indirect block */
-    computed_chksum = H5_checksum_metadata(buf, (size_t)(p - (const uint8_t *)buf), 0);
+    /* checksum verification already done by verify_chksum cb */
 
     /* Metadata checksum */
-    UINT32DECODE(p, stored_chksum);
+    UINT32DECODE(image, stored_chksum);
 
     /* Sanity check */
-    HDassert((size_t)(p - (const uint8_t *)buf) == iblock->size);
-
-    /* Verify checksum */
-    if(stored_chksum != computed_chksum)
-	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "incorrect metadata checksum for fractal heap indirect block")
+    HDassert((size_t)(image - (const uint8_t *)_image) == iblock->size);
 
     /* Check if we have any indirect block children */
     if(iblock->nrows > hdr->man_dtable.max_direct_rows) {
-        unsigned indir_rows;      /* Number of indirect rows in this indirect block */
+        unsigned indir_rows;/* Number of indirect rows in this indirect block */
 
         /* Compute the number of indirect rows for this indirect block */
         indir_rows = iblock->nrows - hdr->man_dtable.max_direct_rows;
@@ -872,460 +1177,825 @@ H5HF_cache_iblock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
         iblock->child_iblocks = NULL;
 
     /* Set return value */
-    ret_value = iblock;
+    ret_value = (void *)iblock;
 
 done:
-    /* Release resources */
-    if(wb && H5WB_unwrap(wb) < 0)
-        HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, NULL, "can't close wrapped buffer")
     if(!ret_value && iblock)
         if(H5HF_man_iblock_dest(iblock) < 0)
             HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, NULL, "unable to destroy fractal heap indirect block")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HF_cache_iblock_load() */
+} /* end H5HF__cache_iblock_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_cache_iblock_flush
+ * Function:	H5HF__cache_iblock_image_len
  *
- * Purpose:	Flushes a dirty fractal heap indirect block to disk.
+ * Purpose:	Return the size of the on disk image of the iblock.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Mar  6 2006
+ * Programmer:	John Mainzer
+ *		6/21/14
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5HF_cache_iblock_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5HF_indirect_t *iblock, unsigned H5_ATTR_UNUSED * flags_ptr)
+static herr_t 
+H5HF__cache_iblock_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    H5WB_t      *wb = NULL;             /* Wrapped buffer for indirect block data */
-    uint8_t     iblock_buf[H5HF_IBLOCK_BUF_SIZE]; /* Buffer for indirect block */
-    herr_t      ret_value = SUCCEED;    /* Return value */
+    const H5HF_indirect_t *iblock = (const H5HF_indirect_t *)_thing;    /* Indirect block info */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(iblock);
+    HDassert(iblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(iblock->cache_info.type == H5AC_FHEAP_IBLOCK);
+    HDassert(image_len);
+
+    *image_len = iblock->size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF__cache_iblock_image_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF__cache_iblock_pre_serialize
+ *
+ * Purpose:	The primary objective of this function is to determine if the
+ *		indirect block is currently allocated in temporary file space,
+ *		and if so, to move it to real file space before the entry is 
+ *		serialized.
+ *
+ *		In debug compiles, this function also verifies that all children
+ *		of this indirect block are either clean or are not in cache.
+ *
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
+ *
+ * Programmer:	John Mainzer
+ *		6/21/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5HF__cache_iblock_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
+    haddr_t addr, size_t H5_ATTR_UNUSED len, size_t H5_ATTR_UNUSED compressed_len,
+    haddr_t *new_addr, size_t H5_ATTR_UNUSED *new_len,
+    size_t H5_ATTR_UNUSED *new_compressed_len, unsigned *flags)
+{
+    H5HF_hdr_t          *hdr;                   /* Shared fractal heap information */
+    H5HF_indirect_t     *iblock = (H5HF_indirect_t *)_thing;    /* Indirect block info */
+    herr_t      	 ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /* check arguments */
+    /* Sanity checks */
     HDassert(f);
-    HDassert(H5F_addr_defined(addr));
     HDassert(iblock);
+    HDassert(iblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(iblock->cache_info.type == H5AC_FHEAP_IBLOCK);
+    HDassert(iblock->cache_info.size == iblock->size);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(H5F_addr_eq(iblock->addr, addr));
+    HDassert(new_addr);
+    HDassert(new_len);
+    HDassert(flags);
+    hdr = iblock->hdr;
+    HDassert(hdr);
+    HDassert(hdr->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(hdr->cache_info.type == H5AC_FHEAP_HDR);
 
-    if(iblock->cache_info.is_dirty) {
-        H5HF_hdr_t *hdr;                /* Shared fractal heap information */
-        uint8_t	*buf;                   /* Temporary buffer */
-        uint8_t *p;                     /* Pointer into raw data buffer */
 #ifndef NDEBUG
-        unsigned nchildren = 0;         /* Track # of children */
-        unsigned max_child = 0;         /* Track max. child entry used */
-#endif /* NDEBUG */
-        uint32_t metadata_chksum;       /* Computed metadata checksum value */
-        size_t u;                       /* Local index variable */
+{
+    hbool_t 		 descendants_clean = TRUE;
+    unsigned 		 iblock_status = 0;
 
-        /* Get the pointer to the shared heap header */
-        hdr = iblock->hdr;
+    /* verify that flush dependencies are working correctly.  Do this
+     * by verifying that all children of this iblock are clean.
+     */
+    if(H5AC_get_entry_status(f, iblock->addr, &iblock_status) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't get iblock status")
 
-        /* Set the shared heap header's file context for this operation */
-        hdr->f = f;
+    /* since the current iblock is the guest of honor in a flush, we know
+     * that it is locked into the cache for the duration of the call.  Hence
+     * there is no need to check to see if it is pinned or protected, or to
+     * protect it if it is not.
+     */
+    if(H5HF__cache_verify_iblock_descendants_clean((H5F_t *)f, dxpl_id, iblock, &iblock_status, &descendants_clean) < 0)
+         HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "can't verify descendants clean.")
+    HDassert(descendants_clean);
+}
+#endif /* NDEBUG */
 
-        /* Wrap the local buffer for serialized indirect block */
-        if(NULL == (wb = H5WB_wrap(iblock_buf, sizeof(iblock_buf))))
-            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't wrap buffer")
+    /* Check to see if we must re-allocate the iblock from temporary to 
+     * normal (AKA real) file space.
+     */
+    if(H5F_IS_TMP_ADDR(f, addr)) {
+        haddr_t iblock_addr;
 
-        /* Get a pointer to a buffer that's large enough for serialized indirect block */
-        if(NULL == (buf = (uint8_t *)H5WB_actual(wb, iblock->size)))
-            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "can't get actual buffer")
+        /* Allocate 'normal' space for the new indirect block on disk */
+        if(HADDR_UNDEF == (iblock_addr = H5MF_alloc((H5F_t *)f, H5FD_MEM_FHEAP_IBLOCK, dxpl_id, (hsize_t)iblock->size)))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap indirect block")
 
-        /* Get temporary pointer to buffer for serialized indirect block */
-        p = buf;
+        /* Sanity check */
+        HDassert(!H5F_addr_eq(iblock->addr, iblock_addr));
 
-        /* Magic number */
-        HDmemcpy(p, H5HF_IBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC);
-        p += H5_SIZEOF_MAGIC;
+        /* Let the metadata cache know the block moved */
+        if(H5AC_move_entry((H5F_t *)f, H5AC_FHEAP_IBLOCK, iblock->addr, iblock_addr) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTMOVE, FAIL, "unable to move indirect block")
 
-        /* Version # */
-        *p++ = H5HF_IBLOCK_VERSION;
+        /* Update the internal address for the block */
+        iblock->addr = iblock_addr;
 
-        /* Address of heap header for heap which owns this block */
-        H5F_addr_encode(f, &p, hdr->heap_addr);
+        /* Check for root indirect block */
+        if(NULL == iblock->parent) {
+            /* Update information about indirect block's location */
+            hdr->man_dtable.table_addr = iblock_addr;
 
-        /* Offset of block in heap */
-        UINT64ENCODE_VAR(p, iblock->block_off, hdr->heap_off_size);
+            /* Mark that heap header was modified */
+            if(H5HF_hdr_dirty(hdr) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
+        } /* end if */
+        else {
+            H5HF_indirect_t *par_iblock;    /* Parent indirect block */
+            unsigned par_entry;             /* Entry in parent indirect block */
 
-        /* Encode indirect block-specific fields */
-        for(u = 0; u < (iblock->nrows * hdr->man_dtable.cparam.width); u++) {
-            /* Encode child block address */
-            H5F_addr_encode(f, &p, iblock->ents[u].addr);
+            /* Get parent information */
+            par_iblock = iblock->parent;
+            par_entry = iblock->par_entry;
 
-            /* Check for heap with I/O filters */
-            if(hdr->filter_len > 0) {
-                /* Sanity check */
-                HDassert(iblock->filt_ents);
+            /* Update information about indirect block's location */
+            par_iblock->ents[par_entry].addr = iblock_addr;
 
-                /* Encode extra information for direct blocks */
-                if(u < (hdr->man_dtable.max_direct_rows * hdr->man_dtable.cparam.width)) {
-                    /* Sanity check */
-                    /* (either both the address & size are defined or both are
-                     *  not defined)
-                     */
-                    HDassert((H5F_addr_defined(iblock->ents[u].addr) && iblock->filt_ents[u].size)
-                        || (!H5F_addr_defined(iblock->ents[u].addr) && iblock->filt_ents[u].size == 0));
+            /* Mark that parent was modified */
+            if(H5HF_iblock_dirty(par_iblock) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
+        } /* end if */
 
-                    /* Size of filtered direct block */
-                    H5F_ENCODE_LENGTH(f, p, iblock->filt_ents[u].size);
+	*new_addr = iblock_addr;
+        *flags = H5C__SERIALIZE_MOVED_FLAG;
+    } /* end if */
+    else 
+	*flags = 0;
 
-                    /* I/O filter mask for filtered direct block */
-                    UINT32ENCODE(p, iblock->filt_ents[u].filter_mask);
-                } /* end if */
-            } /* end if */
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF__cache_iblock_pre_serialize() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF__cache_iblock_serialize
+ *
+ * Purpose:	Given a pointer to an iblock, and a pointer to a buffer of 
+ *		the appropriate size, write the contents of the iblock to the 
+ *		buffer in format appropriate for writing to disk.
+ *
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
+ *
+ * Programmer:	John Mainzer
+ *		6/21/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5HF__cache_iblock_serialize(const H5F_t *f, void *_image, size_t len,
+    void *_thing)
+{
+    H5HF_hdr_t 		*hdr;           /* Shared fractal heap information */
+    H5HF_indirect_t     *iblock = (H5HF_indirect_t *)_thing;     /* Indirect block info */
+    uint8_t 		*image = (uint8_t *)_image;     /* Pointer into raw data buffer */
 #ifndef NDEBUG
-            /* Count child blocks */
-            if(H5F_addr_defined(iblock->ents[u].addr)) {
-                nchildren++;
-                if(u > max_child)
-                    max_child = u;
-            } /* end if */
+    unsigned 		 nchildren = 0; /* Track # of children */
+    size_t		 max_child = 0; /* Track max. child entry used */
 #endif /* NDEBUG */
-        } /* end for */
+    uint32_t		 metadata_chksum; /* Computed metadata checksum value */
+    size_t 		 u;             /* Local index variable */
+    herr_t               ret_value = SUCCEED;    /* Return value */
 
-        /* Compute checksum */
-        metadata_chksum = H5_checksum_metadata(buf, (size_t)(p - buf), 0);
+    FUNC_ENTER_STATIC_NOERR
 
-        /* Metadata checksum */
-        UINT32ENCODE(p, metadata_chksum);
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(image);
+    HDassert(iblock);
+    HDassert(iblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(iblock->cache_info.type == H5AC_FHEAP_IBLOCK);
+    HDassert(iblock->cache_info.size == iblock->size);
+    HDassert(len == iblock->size);
 
-        /* Sanity check */
-        HDassert((size_t)(p - buf) == iblock->size);
-#ifndef NDEBUG
-        HDassert(nchildren == iblock->nchildren);
-        HDassert(max_child == iblock->max_child);
-#endif /* NDEBUG */
+    /* Indirect block must be in 'normal' file space */
+    HDassert(!H5F_IS_TMP_ADDR(f, iblock->addr));
+    HDassert(H5F_addr_eq(iblock->addr, iblock->cache_info.addr));
 
-        /* Check for needing to re-allocate indirect block from 'temp.' to 'normal' file space */
-        if(H5F_IS_TMP_ADDR(f, addr)) {
-            /* Sanity check */
-            HDassert(H5F_addr_eq(iblock->addr, addr));
+    /* Get the pointer to the shared heap header */
+    hdr = iblock->hdr;
 
-            /* Allocate 'normal' space for the new indirect block on disk */
-            if(HADDR_UNDEF == (addr = H5MF_alloc(f, H5FD_MEM_FHEAP_IBLOCK, dxpl_id, (hsize_t)iblock->size)))
-                HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap indirect block")
+    /* Set the shared heap header's file context for this operation */
+    hdr->f = f;
 
-            /* Sanity check */
-            HDassert(!H5F_addr_eq(iblock->addr, addr));
+    /* Magic number */
+    HDmemcpy(image, H5HF_IBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    image += H5_SIZEOF_MAGIC;
 
-            /* Let the metadata cache know the block moved */
-            if(H5AC_move_entry(f, H5AC_FHEAP_IBLOCK, iblock->addr, addr) < 0)
-                HGOTO_ERROR(H5E_HEAP, H5E_CANTMOVE, FAIL, "unable to move indirect block")
+    /* Version # */
+    *image++ = H5HF_IBLOCK_VERSION;
 
-            /* Update the internal address for the block */
-            iblock->addr = addr;
+    /* Address of heap header for heap which owns this block */
+    H5F_addr_encode(f, &image, hdr->heap_addr);
 
-            /* Check for root indirect block */
-            if(NULL == iblock->parent) {
-                /* Update information about indirect block's location */
-                hdr->man_dtable.table_addr = addr;
+    /* Offset of block in heap */
+    UINT64ENCODE_VAR(image, iblock->block_off, hdr->heap_off_size);
 
-                /* Mark that heap header was modified */
-                if(H5HF_hdr_dirty(hdr) < 0)
-                    HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
-            } /* end if */
-            else {
-                H5HF_indirect_t *par_iblock;    /* Parent indirect block */
-                unsigned par_entry;             /* Entry in parent indirect block */
+    /* Encode indirect block-specific fields */
+    for(u = 0; u < (iblock->nrows * hdr->man_dtable.cparam.width); u++) {
+        /* Encode child block address */
+        H5F_addr_encode(f, &image, iblock->ents[u].addr);
+
+        /* Check for heap with I/O filters */
+        if(hdr->filter_len > 0) {
+            /* Sanity check */
+            HDassert(iblock->filt_ents);
 
-                /* Get parent information */
-                par_iblock = iblock->parent;
-                par_entry = iblock->par_entry;
+            /* Encode extra information for direct blocks */
+            if(u < (hdr->man_dtable.max_direct_rows * hdr->man_dtable.cparam.width)) {
+                /* Sanity check */
+                /* (either both the address & size are defined or both are
+                 *  not defined)
+                 */
+                HDassert((H5F_addr_defined(iblock->ents[u].addr) && iblock->filt_ents[u].size) 
+                        || (!H5F_addr_defined(iblock->ents[u].addr) && iblock->filt_ents[u].size == 0));
 
-                /* Update information about indirect block's location */
-                par_iblock->ents[par_entry].addr = addr;
+                /* Size of filtered direct block */
+                H5F_ENCODE_LENGTH(f, image, iblock->filt_ents[u].size);
 
-                /* Mark that parent was modified */
-                if(H5HF_iblock_dirty(par_iblock) < 0)
-                    HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
+                /* I/O filter mask for filtered direct block */
+                UINT32ENCODE(image, iblock->filt_ents[u].filter_mask);
             } /* end if */
         } /* end if */
 
-        /* Indirect block must be in 'normal' file space now */
-        HDassert(!H5F_IS_TMP_ADDR(f, addr));
-
-	/* Write the indirect block */
-	if(H5F_block_write(f, H5FD_MEM_FHEAP_IBLOCK, addr, iblock->size, dxpl_id, buf) < 0)
-	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFLUSH, FAIL, "unable to save fractal heap indirect block to disk")
+#ifndef NDEBUG
+        /* Count child blocks */
+        if(H5F_addr_defined(iblock->ents[u].addr)) {
+            nchildren++;
+            if(u > max_child)
+                max_child = u;
+        } /* end if */
+#endif /* NDEBUG */
+    } /* end for */
 
-        /* Reset dirty flags */
-	iblock->cache_info.is_dirty = FALSE;
-    } /* end if */
+    /* Compute checksum */
+    metadata_chksum = H5_checksum_metadata((uint8_t *)_image, (size_t)(image - (uint8_t *)_image), 0);
 
-    if(destroy)
-        if(H5HF_cache_iblock_dest(f, iblock) < 0)
-	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy fractal heap indirect block")
+    /* Metadata checksum */
+    UINT32ENCODE(image, metadata_chksum);
 
-done:
-    /* Release resources */
-    if(wb && H5WB_unwrap(wb) < 0)
-        HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+    /* Sanity checks */
+    HDassert((size_t)(image - (uint8_t *)_image) == iblock->size);
+#ifndef NDEBUG
+    HDassert(nchildren == iblock->nchildren);
+    HDassert(max_child == iblock->max_child);
+#endif /* NDEBUG */
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5HF_cache_iblock_flush() */
+} /* end H5HF__cache_iblock_serialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_cache_iblock_dest
+ * Function:	H5HF__cache_iblock_notify
  *
- * Purpose:	Destroys a fractal heap indirect block in memory.
+ * Purpose:	This function is used to create and destroy flush dependency 
+ *		relationships between iblocks and their parents as indirect blocks
+ *		are loaded / inserted and evicted from the metadata cache.
  *
- * Return:	Non-negative on success/Negative on failure
+ *		In general, the parent will be another iblock, but it may be the 
+ *		header if the iblock in question is the root iblock.
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Mar  6 2006
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
+ *
+ * Programmer:	John Mainzer
+ *		6/21/14
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5HF_cache_iblock_dest(H5F_t *f, H5HF_indirect_t *iblock)
+static herr_t 
+H5HF__cache_iblock_notify(H5C_notify_action_t action, void *_thing)
 {
-    herr_t      ret_value = SUCCEED;    /* Return value */
+    H5HF_indirect_t     *iblock = (H5HF_indirect_t *)_thing;    /* Indirect block info */
+    herr_t      	 ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /*
-     * Check arguments.
-     */
+    /* Sanity checks */
     HDassert(iblock);
-    HDassert(iblock->rc == 0);
+    HDassert(iblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(iblock->cache_info.type == H5AC_FHEAP_IBLOCK);
     HDassert(iblock->hdr);
 
-    /* If we're going to free the space on disk, the address must be valid */
-    HDassert(!iblock->cache_info.free_file_space_on_destroy || H5F_addr_defined(iblock->cache_info.addr));
-
-    /* Check for freeing file space for indirect block */
-    if(iblock->cache_info.free_file_space_on_destroy) {
-        /* Check if the indirect block is NOT currently allocated in temp. file space */
-        /* (temp. file space does not need to be freed) */
-        if(!H5F_IS_TMP_ADDR(f, iblock->cache_info.addr)) {
-            /* Release the space on disk */
-            /* (XXX: Nasty usage of internal DXPL value! -QAK) */
-            if(H5MF_xfree(f, H5FD_MEM_FHEAP_IBLOCK, H5AC_dxpl_id, iblock->cache_info.addr, (hsize_t)iblock->size) < 0)
-                HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free fractal heap indirect block")
-        } /* end if */
+    if(action == H5AC_NOTIFY_ACTION_BEFORE_EVICT)
+        HDassert((iblock->parent == iblock->fd_parent) || ((NULL == iblock->parent) && (iblock->fd_parent)));
+    else
+        HDassert(iblock->parent == iblock->fd_parent);
+
+    /* further sanity checks */
+    if(iblock->parent == NULL) {
+        /* Either this is the root iblock, or the parent pointer is     */
+        /* invalid.  Since we save a copy of the parent pointer on      */
+        /* the insertion event, it doesn't matter if the parent pointer */
+        /* is invalid just before eviction.  However, we will not be    */
+        /* able to function if it is invalid on the insertion event.    */
+        /* Scream and die if this is the case.                          */
+        HDassert((action == H5C_NOTIFY_ACTION_BEFORE_EVICT) || (iblock->block_off == 0));
+
+        /* pointer from hdr to root iblock will not be set up unless */
+        /* the fractal heap has already pinned the hdr.  Do what     */
+        /* sanity checking we can.                                   */
+        if((iblock->block_off == 0) && (iblock->hdr->root_iblock_flags & H5HF_ROOT_IBLOCK_PINNED))
+           HDassert(iblock->hdr->root_iblock == iblock);
     } /* end if */
+    else {
+        /* if this is a child iblock, verify that the pointers are */
+        /* either uninitialized or set up correctly.               */
+        H5HF_indirect_t *par_iblock = iblock->parent;
+        unsigned indir_idx;  /* Index in parent's child iblock pointer array */
 
-    /* Destroy fractal heap indirect block */
-    if(H5HF_man_iblock_dest(iblock) < 0)
-        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy fractal heap indirect block")
+        /* Sanity check */
+        HDassert(par_iblock->child_iblocks);
+        HDassert(iblock->par_entry >= (iblock->hdr->man_dtable.max_direct_rows * iblock->hdr->man_dtable.cparam.width));
+
+        /* Compute index in parent's child iblock pointer array */
+        indir_idx = iblock->par_entry - (iblock->hdr->man_dtable.max_direct_rows * iblock->hdr->man_dtable.cparam.width);
+
+        /* The pointer to iblock in the parent may not be set yet -- */
+        /* verify that it is either NULL, or that it has been set to */
+        /* iblock.                                                   */
+        HDassert((NULL == par_iblock->child_iblocks[indir_idx]) || (par_iblock->child_iblocks[indir_idx] == iblock));
+    } /* end else */
+
+    switch(action) {
+        case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+        case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+            if(iblock->parent) {        /* this is a child iblock */
+                /* create flush dependency with parent iblock */
+                if(H5AC_create_flush_dependency(iblock->parent, iblock) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+            } /* end if */
+            else {      /* this is the root iblock */
+                /* create flush dependency with header */
+                if(H5AC_create_flush_dependency(iblock->hdr, iblock) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+            } /* end else */
+            break;
+
+	case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+	    /* do nothing */
+	    break;
+
+        case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+            if(iblock->fd_parent) {     /* this is a child iblock */
+                /* destroy flush dependency with parent iblock */
+                if(H5AC_destroy_flush_dependency(iblock->fd_parent, iblock) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+            } /* end if */
+            else {      /* this is the root iblock */
+                /* destroy flush dependency with header */
+                if(H5AC_destroy_flush_dependency(iblock->hdr, iblock) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+            } /* end else */
+            break;
+
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unknown action from metadata cache")
+            break;
+    } /* end switch */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HF_cache_iblock_dest() */
+} /* end H5HF__cache_iblock_notify() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_cache_iblock_clear
+ * Function:	H5HF__cache_iblock_free_icr
  *
- * Purpose:	Mark a fractal heap indirect block in memory as non-dirty.
+ * Purpose:	Unlink the supplied instance of H5HF_indirect_t from the 
+ *		fractal heap and free its memory.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Note:	The metadata cache sets the object's cache_info.magic to
+ *		H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC before calling a free_icr
+ *		callback (checked in assert).
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Mar  6 2006
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
+ *
+ * Programmer:	John Mainzer
+ *		6/21/14
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5HF_cache_iblock_clear(H5F_t *f, H5HF_indirect_t *iblock, hbool_t destroy)
+static herr_t 
+H5HF__cache_iblock_free_icr(void *thing)
 {
-    herr_t ret_value = SUCCEED;         /* Return value */
+    H5HF_indirect_t	*iblock = (H5HF_indirect_t *)thing;     /* Fractal heap indirect block to free */
+    herr_t      	 ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /*
-     * Check arguments.
-     */
+    /* Sanity checks */
     HDassert(iblock);
+    HDassert(iblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC);
+    HDassert(iblock->cache_info.type == H5AC_FHEAP_IBLOCK);
+    HDassert(iblock->rc == 0);
+    HDassert(iblock->hdr);
 
-    /* Reset the dirty flag.  */
-    iblock->cache_info.is_dirty = FALSE;
-
-    if(destroy)
-        if(H5HF_cache_iblock_dest(f, iblock) < 0)
-	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy fractal heap indirect block")
+    /* Destroy fractal heap indirect block */
+    if(H5HF_man_iblock_dest(iblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy fractal heap indirect block")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HF_cache_iblock_clear() */
+} /* end H5HF__cache_iblock_free_icr() */
+
+/*********************************************************/
+/* metadata cache callback definitions for direct blocks */
+/*********************************************************/
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_cache_iblock_size
+ * Function:	H5HF__cache_dblock_get_load_size()
  *
- * Purpose:	Compute the size in bytes of a fractal heap indirect block
- *		on disk, and return it in *size_ptr.  On failure,
- *		the value of *size_ptr is undefined.
+ * Purpose:	Determine the size of the direct block on disk image, and 
+ *		return it in *image_len.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Mar  6 2006
+ * Programmer:	John Mainzer
+ *		6/21/14
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5HF_cache_iblock_size(const H5F_t H5_ATTR_UNUSED *f, const H5HF_indirect_t *iblock, size_t *size_ptr)
+static herr_t 
+H5HF__cache_dblock_get_load_size(const void *_image, void *_udata, size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    const uint8_t *image = (const uint8_t *)_image;                     /* Pointer into raw data buffer */
+    const H5HF_dblock_cache_ud_t *udata = (const H5HF_dblock_cache_ud_t *)_udata;    /* User data for callback */
+    const H5HF_parent_t *par_info; 	/* Pointer to parent information */
+    const H5HF_hdr_t  *hdr;     	/* Shared fractal heap information */
+    size_t compressed_size=0;
+    hbool_t compressed;
 
-    /* Check arguments */
-    HDassert(iblock);
-    HDassert(size_ptr);
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(udata);
+    HDassert(image_len);
+    par_info = (const H5HF_parent_t *)(&(udata->par_info));
+    HDassert(par_info);
+    hdr = par_info->hdr;
+    HDassert(hdr);
+    HDassert(hdr->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(hdr->cache_info.type == H5AC_FHEAP_HDR);
 
-    /* Set size value */
-    *size_ptr = iblock->size;
+    /* Check for I/O filters on this heap */
+    if(hdr->filter_len > 0) {
 
+	/* Check for root direct block */
+	if(par_info->iblock == NULL) {
+	    /* filtered direct block */
+	    compressed_size = hdr->pline_root_direct_size;
+	} /* end if */
+	else {
+	    /* filtered direct block */
+	    compressed_size = par_info->iblock->filt_ents[par_info->entry].size;
+	} /* end else */
+    } 
+
+    if(image == NULL) {
+
+	/* depend on I/O filters on this heap */
+	*image_len = (hdr->filter_len > 0) ? compressed_size:udata->dblock_size;
+
+    } else { 
+
+	HDassert(actual_len);
+	HDassert(*actual_len == *image_len);
+	HDassert(compressed_ptr);
+	HDassert(compressed_image_len_ptr);
+
+	if(hdr->filter_len > 0) {
+	    HDassert(*image_len == compressed_size);
+	    compressed = TRUE;
+	} else {
+	    HDassert(*image_len == udata->dblock_size);
+	    compressed = FALSE;
+	    compressed_size = 0;
+	}
+
+	/* decompressed size */
+	*actual_len = udata->dblock_size;
+	*compressed_ptr = compressed;
+	*compressed_image_len_ptr = compressed_size;
+    }
+    
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_cache_iblock_size() */
+} /* end H5HF__cache_dblock_get_load_size() */
+
+/*********************************************************/
+/* metadata cache callback definitions for direct blocks */
+/*********************************************************/
+
+/*-------------------------------------------------------------------------
+ * Function:    H5HF__cache_dblock_verify_chksum
+ *
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
+ *
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
+ *
+ * Programmer:  Vailin Choi; Aug 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5HF__cache_dblock_verify_chksum(const void *_image, size_t len, void *_udata)
+{
+    const uint8_t *image = (const uint8_t *)_image;       		/* Pointer into raw data buffer */
+    H5HF_dblock_cache_ud_t *udata = (H5HF_dblock_cache_ud_t *)_udata;   /* User data for callback */
+    void *read_buf = NULL;     	/* Pointer to buffer to read in */
+    size_t read_size;       	/* Size of filtered direct block to read */
+    H5HF_hdr_t  *hdr;           /* Shared fractal heap information */
+    H5HF_parent_t *par_info;   	/* Pointer to parent information */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+    size_t chk_size;       	/* The size for validating checksum */
+    uint8_t *chk_p;         	/* Pointer to the area for validating checksum */
+    htri_t ret_value = TRUE;	/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(image);
+    HDassert(udata);
+    par_info = (H5HF_parent_t *)(&(udata->par_info));
+    HDassert(par_info);
+    hdr = par_info->hdr;
+    HDassert(hdr);
+
+    /* len is the decompressed size of the direct block */
+
+    udata->decompressed = FALSE;
+    udata->dblk = NULL;
+
+    /* Get out if data block is not checksummed */
+    if(!(hdr->checksum_dblocks))
+	HGOTO_DONE(TRUE);
+
+    /* Determine the size on disk */
+    if(hdr->filter_len > 0) {
+
+	/* Check for root direct block */
+	if(par_info->iblock == NULL) {
+	    /* Set up parameters to read filtered direct block */
+	    read_size = hdr->pline_root_direct_size;
+	} /* end if */
+	else {
+	    /* Set up parameters to read filtered direct block */
+	    read_size = par_info->iblock->filt_ents[par_info->entry].size;
+	} /* end else */
+    } else
+	read_size = len;
+
+    /* Allocate buffer to perform I/O filtering on and copy image into
+     * it.  Must do this as H5Z_pipeline() may re-sized the buffer 
+     * provided to it.
+     */
+    if(NULL == (read_buf = H5MM_malloc(read_size)))
+	HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "memory allocation failed for pipeline buffer")
+
+    if(hdr->filter_len > 0) {
+	size_t nbytes;          /* Number of bytes used in buffer, after applying reverse filters */
+	unsigned filter_mask;	/* Excluded filters for direct block */
+	H5Z_cb_t filter_cb = {NULL, NULL};  /* Filter callback structure */
+
+	/* Push direct block data through I/O filter pipeline */
+	nbytes = read_size;
+	filter_mask = udata->filter_mask;
+        HDmemcpy(read_buf, image, read_size);
+
+	if(H5Z_pipeline(&(hdr->pline), H5Z_FLAG_REVERSE, &filter_mask, H5Z_ENABLE_EDC, filter_cb, &nbytes, &read_size, &read_buf) < 0)
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFILTER, FAIL, "output pipeline failed")
+
+	/* Sanity check */
+	HDassert(nbytes == len); 
+	udata->decompressed = TRUE;
+
+    } else
+        HDmemcpy(read_buf, image, read_size);
+
+    /* Decode checksum */
+    chk_size = (size_t)(H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr) - H5HF_SIZEOF_CHKSUM);
+    chk_p = (uint8_t *)read_buf + chk_size;
+
+    /* Metadata checksum */
+    UINT32DECODE(chk_p, stored_chksum);
+
+    chk_p -= H5HF_SIZEOF_CHKSUM;
+
+    /* Reset checksum field, for computing the checksum */
+    /* (Casting away const OK - QAK) */
+    HDmemset(chk_p, 0, (size_t)H5HF_SIZEOF_CHKSUM);
+
+    /* Compute checksum on entire direct block */
+    computed_chksum = H5_checksum_metadata(read_buf, len, 0);
+
+    /* Restore the checksum */
+    UINT32ENCODE(chk_p, stored_chksum)
+
+    /* Verify checksum */
+    if(stored_chksum != computed_chksum)
+	HGOTO_DONE(FALSE);
+
+    /* Save the decompressed data to be used later in deserialize callback */
+    if(hdr->filter_len > 0) {
+
+	HDassert(udata->decompressed);
+	HDassert(len == udata->dblock_size);
+	/* Allocate block buffer */
+	if(NULL == (udata->dblk = H5FL_BLK_MALLOC(direct_block, (size_t)len)))
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+
+	/* Copy un-filtered data into block's buffer */
+	HDmemcpy(udata->dblk, read_buf, len);
+    }
+
+done:
+    /* Release the read buffer */
+    if(read_buf)
+	H5MM_xfree(read_buf);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF__cache_dblock_verify_chksum() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_cache_dblock_load
+ * Function:	H5HF__cache_dblock_deserialize
  *
- * Purpose:	Loads a fractal heap direct block from the disk.
+ * Purpose:	Given a buffer containing the on disk image of a direct
+ *		block, allocate an instance of H5HF_direct_t, load the data
+ *		in the buffer into this new instance, and return a pointer to
+ *		it.
  *
- * Return:	Success:	Pointer to a new fractal heap direct block
+ *		As best I can tell, the size of the direct block image is fully
+ *		know before the image is loaded, so this function should succeed
+ *		unless the image is corrupt or memory allocation fails.
  *
+ * Return:	Success:	Pointer to in core representation
  *		Failure:	NULL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 27 2006
+ * Programmer:	John Mainzer
+ *		6/21/14
  *
  *-------------------------------------------------------------------------
  */
-static H5HF_direct_t *
-H5HF_cache_dblock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+static void *
+H5HF__cache_dblock_deserialize(const void *_image, size_t len, void *_udata,
+    hbool_t H5_ATTR_UNUSED *dirty)
 {
-    H5HF_dblock_cache_ud_t *udata = (H5HF_dblock_cache_ud_t *)_udata; /* pointer to user data */
     H5HF_hdr_t          *hdr;           /* Shared fractal heap information */
+    H5HF_dblock_cache_ud_t *udata = (H5HF_dblock_cache_ud_t *)_udata;   /* User data for callback */
     H5HF_parent_t       *par_info;      /* Pointer to parent information */
-    H5HF_direct_t	*dblock = NULL; /* Direct block info */
-    const uint8_t	*p;             /* Pointer into raw data buffer */
+    H5HF_direct_t       *dblock = NULL; /* Direct block info */
+    const uint8_t       *image;         /* Pointer into raw data buffer */
     haddr_t             heap_addr;      /* Address of heap header in the file */
-    H5HF_direct_t	*ret_value;     /* Return value */
+    void *              ret_value = NULL;       /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /* Check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
-    HDassert(udata != NULL);
-    HDassert(udata->f != NULL);
-    HDassert(udata->dblock_size > 0);
+    /* Sanity checks */
+    HDassert(_image);
+    HDassert(udata);
+    par_info = (H5HF_parent_t *)(&(udata->par_info));
+    HDassert(par_info);
+    hdr = par_info->hdr;
+    HDassert(hdr);
+    HDassert(hdr->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(hdr->cache_info.type == H5AC_FHEAP_HDR);
+    HDassert(dirty);
 
     /* Allocate space for the fractal heap direct block */
     if(NULL == (dblock = H5FL_MALLOC(H5HF_direct_t)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
     HDmemset(&dblock->cache_info, 0, sizeof(H5AC_info_t));
 
-    /* Get the pointer to the shared heap header */
-    par_info = (H5HF_parent_t *)(&(udata->par_info));
-    hdr = par_info->hdr;
-
     /* Set the shared heap header's file context for this operation */
     hdr->f = udata->f;
 
     /* Share common heap information */
     dblock->hdr = hdr;
     if(H5HF_hdr_incr(hdr) < 0)
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, NULL, "can't increment reference count on shared heap header")
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, NULL, "can't increment reference count on shared heap header")
 
     /* Set block's internal information */
     dblock->size = udata->dblock_size;
     dblock->file_size = 0;
-    dblock->blk_off_size = H5HF_SIZEOF_OFFSET_LEN(dblock->size);
 
-    /* Allocate block buffer */
+    /* initialize fields used in serialization */
+    dblock->write_buf = NULL;
+    dblock->write_size = 0;
+
+    if(udata->dblk && udata->decompressed) { 
+	/* direct block is already decompressed in verify_chksum callback */
+	HDassert(hdr->filter_len > 0);
+	HDassert(len == dblock->size);
+	dblock->blk = udata->dblk;
+    } else {
+	HDassert(udata->dblk == NULL);
+	HDassert(!udata->decompressed);
+
+	/* Allocate block buffer */
 /* XXX: Change to using free-list factories */
-    if(NULL == (dblock->blk = H5FL_BLK_MALLOC(direct_block, (size_t)dblock->size)))
-        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+	if(NULL == (dblock->blk = H5FL_BLK_MALLOC(direct_block, (size_t)dblock->size)))
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    } 
 
     /* Check for I/O filters on this heap */
     if(hdr->filter_len > 0) {
-        H5Z_cb_t filter_cb = {NULL, NULL};  /* Filter callback structure */
-        size_t nbytes;          /* Number of bytes used in buffer, after applying reverse filters */
-        void *read_buf;         /* Pointer to buffer to read in */
-        size_t read_size;       /* Size of filtered direct block to read */
-        unsigned filter_mask;	/* Excluded filters for direct block */
-
-        /* Check for root direct block */
-        if(par_info->iblock == NULL) {
-            /* Sanity check */
-            HDassert(H5F_addr_eq(hdr->man_dtable.table_addr, addr));
-
-            /* Set up parameters to read filtered direct block */
-            read_size = hdr->pline_root_direct_size;
-        } /* end if */
-        else {
-            /* Sanity check */
-            HDassert(H5F_addr_eq(par_info->iblock->ents[par_info->entry].addr, addr));
-
-            /* Set up parameters to read filtered direct block */
-            read_size = par_info->iblock->filt_ents[par_info->entry].size;
-        } /* end else */
-
-        /* Allocate buffer to perform I/O filtering on */
-        if(NULL == (read_buf = H5MM_malloc(read_size)))
-            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, NULL, "memory allocation failed for pipeline buffer")
-
-        /* Read filtered direct block from disk */
-        if(H5F_block_read(f, H5FD_MEM_FHEAP_DBLOCK, addr, read_size, dxpl_id, read_buf) < 0)
-            HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "can't read fractal heap direct block")
-
-        /* Push direct block data through I/O filter pipeline */
-        nbytes = read_size;
-        filter_mask = udata->filter_mask;
-        if(H5Z_pipeline(&(hdr->pline), H5Z_FLAG_REVERSE, &filter_mask, H5Z_ENABLE_EDC, filter_cb, &nbytes, &read_size, &read_buf) < 0)
-            HGOTO_ERROR(H5E_HEAP, H5E_CANTFILTER, NULL, "output pipeline failed")
-
-        /* Sanity check */
-        HDassert(nbytes == dblock->size);
-
-        /* Copy un-filtered data into block's buffer */
-        HDmemcpy(dblock->blk, read_buf, dblock->size);
-
-        /* Release the read buffer */
-        H5MM_xfree(read_buf);
+	H5Z_cb_t filter_cb = {NULL, NULL};  /* Filter callback structure */
+	size_t nbytes;          /* Number of bytes used in buffer, after applying reverse filters */
+	void *read_buf;         /* Pointer to buffer to read in */
+	size_t read_size;       /* Size of filtered direct block to read */
+	unsigned filter_mask;	/* Excluded filters for direct block */
+
+	if(!udata->decompressed) {
+	    HDassert(udata->dblk == NULL);
+
+	    /* Check for root direct block */
+	    if(par_info->iblock == NULL) {
+		/* Set up parameters to read filtered direct block */
+		read_size = hdr->pline_root_direct_size;
+	    } /* end if */
+	    else {
+		/* Set up parameters to read filtered direct block */
+		read_size = par_info->iblock->filt_ents[par_info->entry].size;
+	    } /* end else */
+	    HDassert(len == read_size);
+
+	    /* Allocate buffer to perform I/O filtering on and copy image into
+	     * it.  Must do this as H5Z_pipeline() may re-sized the buffer 
+	     * provided to it.
+	     */
+	    if(NULL == (read_buf = H5MM_malloc(read_size)))
+		HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, NULL, "memory allocation failed for pipeline buffer")
+	    HDmemcpy(read_buf, _image, len);
+
+	    /* Push direct block data through I/O filter pipeline */
+	    nbytes = read_size;
+	    filter_mask = udata->filter_mask;
+	    if(H5Z_pipeline(&(hdr->pline), H5Z_FLAG_REVERSE, &filter_mask, H5Z_ENABLE_EDC, filter_cb, &nbytes, &read_size, &read_buf) < 0)
+		HGOTO_ERROR(H5E_HEAP, H5E_CANTFILTER, NULL, "output pipeline failed")
+
+	    /* Sanity check */
+	    HDassert(nbytes == dblock->size);
+
+	    /* Copy un-filtered data into block's buffer */
+	    HDmemcpy(dblock->blk, read_buf, dblock->size);
+
+	    /* Release the read buffer */
+	    H5MM_xfree(read_buf);
+	}
     } /* end if */
     else {
-        /* Read direct block from disk */
-        if(H5F_block_read(f, H5FD_MEM_FHEAP_DBLOCK, addr, dblock->size, dxpl_id, dblock->blk) < 0)
-            HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "can't read fractal heap direct block")
+        /* copy image to dblock->blk */
+        HDassert(dblock->size == len);
+        HDmemcpy(dblock->blk, _image, dblock->size);
     } /* end else */
 
     /* Start decoding direct block */
-    p = dblock->blk;
+    image = dblock->blk;
 
     /* Magic number */
-    if(HDmemcmp(p, H5HF_DBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC))
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "wrong fractal heap direct block signature")
-    p += H5_SIZEOF_MAGIC;
+    if(HDmemcmp(image, H5HF_DBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+        HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "wrong fractal heap direct block signature")
+    image += H5_SIZEOF_MAGIC;
 
     /* Version */
-    if(*p++ != H5HF_DBLOCK_VERSION)
-	HGOTO_ERROR(H5E_HEAP, H5E_VERSION, NULL, "wrong fractal heap direct block version")
+    if(*image++ != H5HF_DBLOCK_VERSION)
+        HGOTO_ERROR(H5E_HEAP, H5E_VERSION, NULL, "wrong fractal heap direct block version")
 
     /* Address of heap that owns this block (just for file integrity checks) */
-    H5F_addr_decode(udata->f, &p, &heap_addr);
+    H5F_addr_decode(udata->f, &image, &heap_addr);
     if(H5F_addr_ne(heap_addr, hdr->heap_addr))
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "incorrect heap header address for direct block")
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "incorrect heap header address for direct block")
 
     /* Address of parent block */
     dblock->parent = par_info->iblock;
+    dblock->fd_parent = par_info->iblock;
     dblock->par_entry = par_info->entry;
     if(dblock->parent) {
         /* Share parent block */
@@ -1334,33 +2004,24 @@ H5HF_cache_dblock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
     } /* end if */
 
     /* Offset of heap within the heap's address space */
-    UINT64DECODE_VAR(p, dblock->block_off, hdr->heap_off_size);
+    UINT64DECODE_VAR(image, dblock->block_off, hdr->heap_off_size);
 
     /* Decode checksum on direct block, if requested */
     if(hdr->checksum_dblocks) {
-        uint32_t stored_chksum;         /* Metadata checksum value */
-        uint32_t computed_chksum;       /* Computed metadata checksum value */
+	uint32_t stored_chksum;         /* Metadata checksum value */
 
-        /* Metadata checksum */
-        UINT32DECODE(p, stored_chksum);
-
-        /* Reset checksum field, for computing the checksum */
-        /* (Casting away const OK - QAK) */
-        HDmemset((uint8_t *)p - H5HF_SIZEOF_CHKSUM, 0, (size_t)H5HF_SIZEOF_CHKSUM);
+	/* checksum verification already done in verify_chksum cb */
 
-        /* Compute checksum on entire direct block */
-        computed_chksum = H5_checksum_metadata(dblock->blk, dblock->size, 0);
+        /* Metadata checksum */
+        UINT32DECODE(image, stored_chksum);
 
-        /* Verify checksum */
-        if(stored_chksum != computed_chksum)
-            HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "incorrect metadata checksum for fractal heap direct block")
     } /* end if */
 
     /* Sanity check */
-    HDassert((size_t)(p - dblock->blk) == (size_t)H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr));
+    HDassert((size_t)(image - dblock->blk) == (size_t)H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr));
 
     /* Set return value */
-    ret_value = dblock;
+    ret_value = (void *)dblock;
 
 done:
     if(!ret_value && dblock)
@@ -1368,324 +2029,719 @@ done:
             HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, NULL, "unable to destroy fractal heap direct block")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HF_cache_dblock_load() */
+} /* end H5HF__cache_dblock_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_cache_dblock_flush
+ * Function:	H5HF__cache_dblock_image_len
  *
- * Purpose:	Flushes a dirty fractal heap direct block to disk.
+ * Purpose:	Report the actual size of the direct block image on disk.
+ *		Note that this value will probably be incorrect if compression 
+ *		is enabled and the entry is dirty.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 27 2006
+ * Programmer:	John Mainzer
+ *		6/21/14
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5HF_cache_dblock_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5HF_direct_t *dblock, unsigned H5_ATTR_UNUSED * flags_ptr)
+static herr_t 
+H5HF__cache_dblock_image_len(const void *_thing, size_t *image_len, hbool_t *compressed_ptr, size_t *compressed_image_len_ptr)
 {
-    herr_t      ret_value = SUCCEED;    /* Return value */
+    const H5HF_direct_t    *dblock = (const H5HF_direct_t *)_thing;     /* Direct block info */
+    const H5HF_indirect_t  *par_iblock; /* Parent iblock */
+    const H5HF_hdr_t  *hdr;             /* Shared fractal heap information */
+    hbool_t	      compressed;
+    size_t            size;
+    size_t	      compressed_size;
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR
 
-    /* check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    /* Sanity checks */
     HDassert(dblock);
+    HDassert(dblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(dblock->cache_info.type == H5AC_FHEAP_DBLOCK);
+    HDassert(image_len);
+    HDassert(compressed_ptr);
+    HDassert(compressed_image_len_ptr);
 
-    if(dblock->cache_info.is_dirty) {
-        H5HF_hdr_t *hdr;        /* Shared fractal heap information */
-        hbool_t at_tmp_addr = H5F_IS_TMP_ADDR(f, addr);     /* Flag to indicate direct block is at temporary address */
-        void *write_buf;        /* Pointer to buffer to write out */
-        size_t write_size;      /* Size of buffer to write out */
-        uint8_t *p;             /* Pointer into raw data buffer */
+    /* Set up convenience variables */
+    hdr = dblock->hdr;
+    par_iblock = dblock->parent;
 
-        /* Get the pointer to the shared heap header */
-        hdr = dblock->hdr;
+    /* Check for I/O filters on this heap */
+    if(hdr->filter_len > 0) {
 
-        /* Set the shared heap header's file context for this operation */
-        hdr->f = f;
+        /* Filters are enabled, so set compressed to TRUE, and set 
+ 	 * size equal to the uncompressed size of the direct block.
+         * If the data is available, set compressed_size to the compressed
+         * size of the direct block -- otherwise set it equal to the 
+         * uncompressed size.  
+         *
+         * We have three possible scenarios here.
+         *
+         * First, the block may never have been flushed.  In this
+         * case, both dblock->file_size and the size stored in the 
+         * parent (either the header or the parent iblock) will all 
+         * be zero.  In this case, return the uncompressed size 
+         * stored in dblock->size as the compressed size.
+         *
+         * Second, the block may have just been serialized, in which
+         * case, dblock->file_size should be zero, and the correct 
+         * on disk size should be stored in the parent (again, either
+         * the header or the parent iblock as case may be).
+         * 
+         * Third, we may be in the process of discarding this 
+         * dblock without writing it.  In this case, dblock->file_size
+         * should be non-zero and have the correct size.  Note that 
+         * in this case, the direct block will have been detached,
+         * and thus looking up the parent will likely return incorrect
+         * data.
+         */
+        size            = dblock->size;
+        compressed      = TRUE;
+        compressed_size = dblock->size; /* will overwrite if compressed 
+                                         * size is available.
+                                         */
+
+        if(dblock->file_size != 0) 
+            compressed_size = dblock->file_size;
+        else {
+            if(par_iblock) {
+                unsigned          par_entry;  /* Entry in parent indirect block */
 
-        HDassert(dblock->blk);
-        p = dblock->blk;
+                par_entry = dblock->par_entry;
+                compressed_size = par_iblock->filt_ents[par_entry].size;
 
-        /* Magic number */
-        HDmemcpy(p, H5HF_DBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC);
-        p += H5_SIZEOF_MAGIC;
+            } /* end if */
+            else {
+                compressed_size = hdr->pline_root_direct_size;
+            }
 
-        /* Version # */
-        *p++ = H5HF_DBLOCK_VERSION;
+            if(compressed_size == 0)
+                compressed_size = dblock->size;
 
-        /* Address of heap header for heap which owns this block */
-        H5F_addr_encode(f, &p, hdr->heap_addr);
+        } /* end else */
+    } /* end if */
+    else {
+        size = dblock->size;
+        compressed = FALSE;
+        compressed_size = 0; /* a convenient, invalid value */
+    }
 
-        /* Offset of block in heap */
-        UINT64ENCODE_VAR(p, dblock->block_off, hdr->heap_off_size);
+    HDassert(size > 0);
 
-        /* Metadata checksum */
-        if(hdr->checksum_dblocks) {
-            uint32_t metadata_chksum;       /* Computed metadata checksum value */
+    *image_len                = size;
+    *compressed_ptr           = compressed;
+    *compressed_image_len_ptr = compressed_size;
 
-            /* Clear the checksum field, to compute the checksum */
-            HDmemset(p, 0, (size_t)H5HF_SIZEOF_CHKSUM);
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF__cache_dblock_image_len() */
 
-            /* Compute checksum on entire direct block */
-            metadata_chksum = H5_checksum_metadata(dblock->blk, dblock->size, 0);
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF__cache_dblock_pre_serialize
+ *
+ * Purpose:	In principle, the purpose of this function is to determine
+ *		the size and location of the disk image of the target direct 
+ *		block.  In this case, the uncompressed size of the block is
+ *		fixed, but sined the H5C__CLASS_COMPRESSED_FLAG is set, 
+ *		we may need to compute and report the compressed size.
+ *
+ *		This is a bit sticky in the case of a direct block when I/O 
+ *		filters are enabled, as the size of the compressed version
+ *		of the on disk image is not known until the direct block has 
+ *		been run through the filters.  Further, the location of the 
+ *		on disk image may change if the compressed size of the image 
+ *		changes as well.
+ *
+ *		To complicate matters further, the direct block may have been 
+ *		initially allocated in temporary (AKA imaginary) file space. 
+ *		In this case, we must relocate the direct block's on disk 
+ *		image to real file space regardless of whether it has changed 
+ *		size.
+ *
+ *		One simplifying factor is the direct block's "blk" field, 
+ *		which contains a pointer to a buffer which (with the exception
+ *		of a small header) contains the on disk image in uncompressed 
+ *		form.
+ *
+ *		To square this particular circle, this function does 
+ *		everything the serialize function usually does, with the 
+ *		exception of copying the image into the image buffer provided 
+ *		to the serialize function by the metadata cache.  The data to 
+ *		copy is provided to the serialize function in a buffer pointed
+ *		to by the write_buf field.
+ *
+ *		If I/O filters are enabled, on exit, 
+ *		H5HF__cache_dblock_pre_serialize() sets the write_buf field to 
+ *		point to a buffer containing the filtered image of the direct
+ *		block.  The serialize function should free this block, and set
+ *		the write_buf field to NULL after copying it into the image 
+ *		buffer provided by the metadata cache.
+ *
+ *		If I/O filters are not enabled, this function prepares 
+ *		the buffer pointed to by the blk field for copying to the 
+ *		image buffer provided by the metadata cache, and sets the 
+ *		write_buf field equal to the blk field.  In this case, the 
+ *		serialize function should simply set the write_buf field to 
+ *		NULL after copying the direct block image into the image 
+ *		buffer.
+ *
+ *		In both of the above cases, the length of the buffer pointed 
+ *		to by write_buf is provided in the write_len field.  This 
+ *		field must contain 0 on entry to this function, and should 
+ *		be set back to 0 at the end of the serialize function.
+ *
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
+ *
+ * Programmer:	John Mainzer
+ *		6/21/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5HF__cache_dblock_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *_thing,
+    haddr_t addr, size_t len, size_t compressed_len, haddr_t *new_addr, 
+    size_t H5_ATTR_UNUSED *new_len, size_t *new_compressed_len, unsigned *flags)
+{
+    hbool_t 		 at_tmp_addr;  /* Flag to indicate direct block is */
+                                       /* at temporary address */
+    haddr_t		 dblock_addr;
+    H5HF_hdr_t          *hdr;           /* Shared fractal heap information */
+    H5HF_direct_t       *dblock = (H5HF_direct_t *)_thing;      /* Direct block info */
+    H5HF_indirect_t 	*par_iblock;    /* Parent indirect block */
+    unsigned		 par_entry = 0;     /* Entry in parent indirect block */
+    void 		*write_buf;     /* Pointer to buffer to write out */
+    size_t 		 write_size;    /* Size of buffer to write out */
+    uint8_t 		*image;         /* Pointer into raw data buffer */
+    unsigned		 dblock_flags = 0;
+    herr_t               ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(dblock);
+    HDassert(dblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(dblock->cache_info.type == H5AC_FHEAP_DBLOCK);
+    HDassert(dblock->write_buf == NULL);
+    HDassert(dblock->write_size == 0);
+    HDassert(dblock->cache_info.size == len);
+    HDassert(H5F_addr_defined(addr));
+    HDassert(len == dblock->size);
+    HDassert(new_addr);
+    HDassert(new_compressed_len);
+    HDassert(flags);
 
-            /* Metadata checksum */
-            UINT32ENCODE(p, metadata_chksum);
-        } /* end if */
+    /* Set up local variables */
+    hdr = dblock->hdr;
+    dblock_addr = addr;    /* will update dblock_addr if we move the block */
 
-        /* Sanity check */
-        HDassert((size_t)(p - dblock->blk) == (size_t)H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr));
+    /* dblock->size must match dblock->cache_info.size */
+    HDassert(dblock->cache_info.size == dblock->size);
 
-        /* Check for I/O filters on this heap */
-        if(hdr->filter_len > 0) {
-            H5Z_cb_t filter_cb = {NULL, NULL};  /* Filter callback structure */
-            size_t nbytes;                      /* Number of bytes used */
-            unsigned filter_mask = 0;           /* Filter mask for block */
+    /* Set the shared heap header's file context for this operation */
+    hdr->f = (H5F_t *)f;
 
-            /* Allocate buffer to perform I/O filtering on */
-            write_size = dblock->size;
-            if(NULL == (write_buf = H5MM_malloc(write_size)))
-                HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "memory allocation failed for pipeline buffer")
-            HDmemcpy(write_buf, dblock->blk, write_size);
+    HDassert(hdr);
+    HDassert(hdr->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(hdr->cache_info.type == H5AC_FHEAP_HDR);
 
-            /* Push direct block data through I/O filter pipeline */
-            nbytes = write_size;
-            if(H5Z_pipeline(&(hdr->pline), 0, &filter_mask, H5Z_ENABLE_EDC, filter_cb, &nbytes, &write_size, &write_buf) < 0)
-                HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "output pipeline failed")
+    if(dblock->parent) {
+	/* this is the common case, in which the direct block is the child 
+         * of an indirect block.  Set up the convenience variables we will
+         * need if the address and/or compressed size of the on disk image 
+         * of the direct block changes, and do some sanity checking in 
+         * passing.
+         */
+        par_iblock = dblock->parent;
+	par_entry = dblock->par_entry;
+
+	HDassert(par_iblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+	HDassert(par_iblock->cache_info.type == H5AC_FHEAP_IBLOCK);
+        HDassert(H5F_addr_eq(par_iblock->ents[par_entry].addr, addr));
+    } /* end if */
+    else {
+	/* the direct block is a root direct block -- just set par_iblock
+         * to NULL, as the field will not be used.
+         */
+	par_iblock = NULL;
+    } /* end else */
 
-            /* Use the compressed number of bytes as the size to write */
-            write_size = nbytes;
+    at_tmp_addr = H5F_IS_TMP_ADDR(f, addr);
 
-            /* Check for root direct block */
-            if(dblock->parent == NULL) {
-                hbool_t hdr_changed = FALSE;    /* Whether the header information changed */
+    /* Begin by preping the direct block to be written to disk.  Do
+     * this by writing the correct magic number, the dblock version, 
+     * the address of the header, the offset of the block in the heap, 
+     * and the checksum at the beginning of the block.
+     */
 
-                /* Sanity check */
-                HDassert(H5F_addr_eq(hdr->man_dtable.table_addr, addr));
-                HDassert(hdr->pline_root_direct_size > 0);
+    HDassert(dblock->blk);
+    image = dblock->blk;
 
-                /* Check if the filter mask changed */
-                if(hdr->pline_root_direct_filter_mask != filter_mask) {
-                    hdr->pline_root_direct_filter_mask = filter_mask;
-                    hdr_changed = TRUE;
-                } /* end if */
+    /* Magic number */
+    HDmemcpy(image, H5HF_DBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    image += H5_SIZEOF_MAGIC;
 
-                /* Check if we need to re-size the block on disk */
-                if(hdr->pline_root_direct_size != write_size || at_tmp_addr) {
-                    /* Check if the direct block is NOT currently allocated in temp. file space */
-                    /* (temp. file space does not need to be freed) */
-                    if(!at_tmp_addr) {
-                        /* Release direct block's current disk space */
-                        if(H5MF_xfree(f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, addr, (hsize_t)hdr->pline_root_direct_size) < 0)
-                            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free fractal heap direct block")
-                    } /* end if */
+    /* Version # */
+    *image++ = H5HF_DBLOCK_VERSION;
 
-                    /* Allocate space for the compressed direct block */
-                    if(HADDR_UNDEF == (addr = H5MF_alloc(f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, (hsize_t)write_size)))
-                        HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap direct block")
+    /* Address of heap header for heap which owns this block */
+    H5F_addr_encode(f, &image, hdr->heap_addr);
 
-                    /* Let the metadata cache know, if the block moved */
-                    if(!H5F_addr_eq(hdr->man_dtable.table_addr, addr))
-                        if(H5AC_move_entry(f, H5AC_FHEAP_DBLOCK, hdr->man_dtable.table_addr, addr) < 0)
-                            HGOTO_ERROR(H5E_HEAP, H5E_CANTMOVE, FAIL, "unable to move direct block")
+    /* Offset of block in heap */
+    UINT64ENCODE_VAR(image, dblock->block_off, hdr->heap_off_size);
 
-                    /* Update information about compressed direct block's location & size */
-                    hdr->man_dtable.table_addr = addr;
-                    hdr->pline_root_direct_size = write_size;
+    /* Metadata checksum */
+    if(hdr->checksum_dblocks) {
+        uint32_t metadata_chksum;       /* Computed metadata checksum value */
 
-                    /* Note that heap header was modified */
-                    hdr_changed = TRUE;
-                } /* end if */
+        /* Clear the checksum field, to compute the checksum */
+        HDmemset(image, 0, (size_t)H5HF_SIZEOF_CHKSUM);
 
-                /* Check if heap header was modified */
-                if(hdr_changed)
-                    if(H5HF_hdr_dirty(hdr) < 0)
-                        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
-            } /* end if */
-            else {
-                hbool_t par_changed = FALSE;    /* Whether the parent's information changed */
-                H5HF_indirect_t *par_iblock;    /* Parent indirect block */
-                unsigned par_entry;             /* Entry in parent indirect block */
+        /* Compute checksum on entire direct block */
+        metadata_chksum = H5_checksum_metadata(dblock->blk, dblock->size, 0);
 
-                /* Get parent information */
-                par_iblock = dblock->parent;
-                par_entry = dblock->par_entry;
+        /* Metadata checksum */
+        UINT32ENCODE(image, metadata_chksum);
+    } /* end if */
 
-                /* Sanity check */
-                HDassert(H5F_addr_eq(par_iblock->ents[par_entry].addr, addr));
-                HDassert(par_iblock->filt_ents[par_entry].size > 0);
+    /* at this point, dblock->blk should point to an uncompressed image of 
+     * the direct block.  If I/O filters are not enabled, this image should
+     * be ready to hand off to the metadata cache.
+     */
 
-                /* Check if the filter mask changed */
-                if(par_iblock->filt_ents[par_entry].filter_mask != filter_mask) {
-                    par_iblock->filt_ents[par_entry].filter_mask = filter_mask;
-                    par_changed = TRUE;
-                } /* end if */
+    /* Sanity check */
+    HDassert((size_t)(image - dblock->blk) == (size_t)H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr));
 
-                /* Check if we need to re-size the block on disk */
-                if(par_iblock->filt_ents[par_entry].size != write_size || at_tmp_addr) {
-                    /* Check if the direct block is NOT currently allocated in temp. file space */
-                    /* (temp. file space does not need to be freed) */
-                    if(!at_tmp_addr) {
-                        /* Release direct block's current disk space */
-                        if(H5MF_xfree(f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, addr, (hsize_t)par_iblock->filt_ents[par_entry].size) < 0)
-                            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free fractal heap direct block")
-                    } /* end if */
+    /* If I/O filters are enabled on this heap, we must run the direct block
+     * image through the filters to obtain the image that we will hand off
+     * to the metadata cache.
+     */
 
-                    /* Allocate space for the compressed direct block */
-                    if(HADDR_UNDEF == (addr = H5MF_alloc(f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, (hsize_t)write_size)))
-                        HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap direct block")
+    /* Check for I/O filters on this heap */
+    if(hdr->filter_len > 0) {
+        H5Z_cb_t filter_cb = {NULL, NULL};  /* Filter callback structure */
+        size_t nbytes;                      /* Number of bytes used */
+        unsigned filter_mask = 0;           /* Filter mask for block */
 
-                    /* Let the metadata cache know, if the block moved */
-                    if(!H5F_addr_eq(par_iblock->ents[par_entry].addr, addr))
-                        if(H5AC_move_entry(f, H5AC_FHEAP_DBLOCK, par_iblock->ents[par_entry].addr, addr) < 0)
-                            HGOTO_ERROR(H5E_HEAP, H5E_CANTMOVE, FAIL, "unable to move direct block")
+        /* Allocate buffer to perform I/O filtering on */
+        write_size = dblock->size;
 
-                    /* Update information about compressed direct block's location & size */
-                    par_iblock->ents[par_entry].addr = addr;
-                    par_iblock->filt_ents[par_entry].size = write_size;
+        if(NULL == (write_buf = H5MM_malloc(write_size)))
+            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "memory allocation failed for pipeline buffer")
+        HDmemcpy(write_buf, dblock->blk, write_size);
 
-                    /* Note that parent was modified */
-                    par_changed = TRUE;
-                } /* end if */
+        /* Push direct block data through I/O filter pipeline */
+        nbytes = write_size;
+        if(H5Z_pipeline(&(hdr->pline), 0, &filter_mask, H5Z_ENABLE_EDC, filter_cb, &nbytes, &write_size, &write_buf) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "output pipeline failed")
 
-                /* Check if parent was modified */
-                if(par_changed)
-                    if(H5HF_iblock_dirty(par_iblock) < 0)
-                        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
-            } /* end else */
-        } /* end if */
-        else {
-            write_buf = dblock->blk;
-            write_size = dblock->size;
+        /* Use the compressed number of bytes as the size to write */
+        write_size = nbytes;
+
+        /* If the size and/or location of the on disk image of the 
+         * direct block changes, we must touch up its parent to reflect
+         * these changes.  Do this differently depending on whether the
+         * direct block's parent is an indirect block or (rarely) the 
+         * fractal heap header.  In this case, the direct block is known
+         * as a root direct block.
+         */
+
+        /* Check for root direct block */
+        if(dblock->parent == NULL) {
+            hbool_t hdr_changed = FALSE; /* Whether the header info changed */
 
-            /* Check for needing to re-allocate direct block from 'temp.' to 'normal' file space */
-            if(at_tmp_addr) {
-                /* Check for root direct block */
-                if(NULL == dblock->parent) {
-                    /* Sanity check */
-                    HDassert(H5F_addr_eq(hdr->man_dtable.table_addr, addr));
+            /* Sanity check */
+            HDassert(H5F_addr_eq(hdr->man_dtable.table_addr, addr));
+            HDassert(hdr->pline_root_direct_size > 0);
 
-                    /* Allocate 'normal' space for the direct block */
-                    if(HADDR_UNDEF == (addr = H5MF_alloc(f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, (hsize_t)write_size)))
-                        HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap direct block")
+            /* Check if the filter mask changed */
+            if(hdr->pline_root_direct_filter_mask != filter_mask) {
+                hdr->pline_root_direct_filter_mask = filter_mask;
+                hdr_changed = TRUE;
+            } /* end if */
 
-                    /* Sanity check */
-                    HDassert(!H5F_addr_eq(hdr->man_dtable.table_addr, addr));
+            /* verify that the cache's last record of the compressed 
+             * size matches the heap's last record.  This value will
+             * likely change shortly.
+             */
+            HDassert(compressed_len == hdr->pline_root_direct_size);
+
+            /* Check if we need to re-size the block on disk */
+            if(hdr->pline_root_direct_size != write_size || at_tmp_addr) {
+                /* Check if the direct block is NOT currently allocated 
+                 * in temp. file space 
+                 *
+                 * (temp. file space does not need to be freed) 
+                 */
+                if(!at_tmp_addr) {
+                    /* Release direct block's current disk space */
+                    if(H5MF_xfree(f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, addr, (hsize_t)hdr->pline_root_direct_size) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free fractal heap direct block")
+                } /* end if */
+
+                /* Allocate space for the compressed direct block */
+                if(HADDR_UNDEF == (dblock_addr = H5MF_alloc((H5F_t *)f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, (hsize_t)write_size)))
+                    HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap direct block")
 
-                    /* Let the metadata cache know the block moved */
-                    if(H5AC_move_entry(f, H5AC_FHEAP_DBLOCK, hdr->man_dtable.table_addr, addr) < 0)
+                /* Let the metadata cache know, if the block moved */
+                if(!H5F_addr_eq(hdr->man_dtable.table_addr, dblock_addr))
+                    if(H5AC_move_entry((H5F_t *)f, H5AC_FHEAP_DBLOCK, hdr->man_dtable.table_addr, dblock_addr) < 0)
                         HGOTO_ERROR(H5E_HEAP, H5E_CANTMOVE, FAIL, "unable to move direct block")
 
-                    /* Update information about direct block's location */
-                    hdr->man_dtable.table_addr = addr;
+                /* Update information about compressed direct block's 
+                 * location & size 
+                 */
+                HDassert(hdr->man_dtable.table_addr == addr);
+                HDassert(hdr->pline_root_direct_size == compressed_len);
+                hdr->man_dtable.table_addr = dblock_addr;
+                hdr->pline_root_direct_size = write_size;
 
-                    /* Mark that heap header was modified */
-                    if(H5HF_hdr_dirty(hdr) < 0)
-                        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
-                } /* end if */
-                else {
-                    H5HF_indirect_t *par_iblock;    /* Parent indirect block */
-                    unsigned par_entry;             /* Entry in parent indirect block */
+                /* Note that heap header was modified */
+                hdr_changed = TRUE;
+            } /* end if */
 
-                    /* Get parent information */
-                    par_iblock = dblock->parent;
-                    par_entry = dblock->par_entry;
+            /* Check if heap header was modified */
+            if(hdr_changed)
+                if(H5HF_hdr_dirty(hdr) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
+        } /* end if */
+        else { /* the direct block's parent is an indirect block */
+            hbool_t par_changed = FALSE;  /* Whether the parent's infochanged */
 
-                    /* Sanity check */
-                    HDassert(H5F_addr_eq(par_iblock->ents[par_entry].addr, addr));
+            /* Sanity check */
+            HDassert(par_iblock);
+            HDassert(par_iblock->filt_ents[par_entry].size > 0);
 
-                    /* Allocate 'normal' space for the direct block */
-                    if(HADDR_UNDEF == (addr = H5MF_alloc(f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, (hsize_t)write_size)))
-                        HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap direct block")
+            /* Check if the filter mask changed */
+            if(par_iblock->filt_ents[par_entry].filter_mask != filter_mask) {
+                par_iblock->filt_ents[par_entry].filter_mask = filter_mask;
+                par_changed = TRUE;
+            } /* end if */
+
+            /* verify that the cache's last record of the compressed 
+             * size matches the heap's last record.  This value will
+             * likely change shortly.
+             */
+            HDassert(compressed_len == par_iblock->filt_ents[par_entry].size);
+
+            /* Check if we need to re-size the block on disk */
+            if(par_iblock->filt_ents[par_entry].size != write_size || at_tmp_addr) {
+                /* Check if the direct block is NOT currently allocated 
+                 * in temp. file space 
+                 *
+                 * (temp. file space does not need to be freed) 
+                 */
+                if(!at_tmp_addr) {
+                    /* Release direct block's current disk space */
+                    if(H5MF_xfree(f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, addr, (hsize_t)par_iblock->filt_ents[par_entry].size) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free fractal heap direct block")
+                } /* end if */
 
-                    /* Sanity check */
-                    HDassert(!H5F_addr_eq(par_iblock->ents[par_entry].addr, addr));
+                /* Allocate space for the compressed direct block */
+                if(HADDR_UNDEF == (dblock_addr = H5MF_alloc((H5F_t *)f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, (hsize_t)write_size)))
+                    HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap direct block")
 
-                    /* Let the metadata cache know the block moved */
-                    if(H5AC_move_entry(f, H5AC_FHEAP_DBLOCK, par_iblock->ents[par_entry].addr, addr) < 0)
+                /* Let the metadata cache know, if the block moved */
+                if(!H5F_addr_eq(par_iblock->ents[par_entry].addr, dblock_addr))
+                    if(H5AC_move_entry((H5F_t *)f, H5AC_FHEAP_DBLOCK, par_iblock->ents[par_entry].addr, dblock_addr) < 0)
                         HGOTO_ERROR(H5E_HEAP, H5E_CANTMOVE, FAIL, "unable to move direct block")
 
-                    /* Update information about direct block's location */
-                    par_iblock->ents[par_entry].addr = addr;
+                /* Update information about compressed direct block's 
+                 * location & size 
+                 */
+                HDassert(par_iblock->ents[par_entry].addr == addr);
+                HDassert(par_iblock->filt_ents[par_entry].size == compressed_len);
+                par_iblock->ents[par_entry].addr = dblock_addr;
+                par_iblock->filt_ents[par_entry].size = write_size;
 
-                    /* Mark that parent was modified */
-                    if(H5HF_iblock_dirty(par_iblock) < 0)
-                        HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
-                } /* end else */
+                /* Note that parent was modified */
+                par_changed = TRUE;
             } /* end if */
+
+            /* Check if parent was modified */
+            if(par_changed)
+                if(H5HF_iblock_dirty(par_iblock) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
         } /* end else */
+    } /* end if */
+    else {
+        /* I/O filters are not enabled -- thus all we need to do is check to 
+         * see if the direct block is in temporary (AKA imaginary) file 
+         * space, and move it to real file space if it is.
+         *
+         * As in the I/O filters case above, we will have to touch up the 
+         * direct blocks parent if the direct block is relocated.
+         *
+         * Recall that temporary file space need not be freed, which 
+         * simplifies matters slightly.
+         */
+        write_buf = dblock->blk;
+        write_size = dblock->size;
+
+        /* Check to see if we must re-allocate direct block from 'temp.' 
+         * to 'normal' file space 
+         */
+        if(at_tmp_addr) {
+            /* Check for root direct block */
+            if(NULL == dblock->parent) {
+                /* Sanity check */
+                HDassert(H5F_addr_eq(hdr->man_dtable.table_addr, addr));
 
-        /* Direct block must be in 'normal' file space now */
-        HDassert(!H5F_IS_TMP_ADDR(f, addr));
+                /* Allocate 'normal' space for the direct block */
+                if(HADDR_UNDEF == (dblock_addr = H5MF_alloc((H5F_t *)f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, (hsize_t)write_size)))
+                    HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap direct block")
+
+                /* Sanity check */
+                HDassert(!H5F_addr_eq(hdr->man_dtable.table_addr, dblock_addr));
+
+                /* Let the metadata cache know the block moved */
+                if(H5AC_move_entry((H5F_t *)f, H5AC_FHEAP_DBLOCK, hdr->man_dtable.table_addr, dblock_addr) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTMOVE, FAIL, "unable to move direct block")
+
+                /* Update information about direct block's location */
+                hdr->man_dtable.table_addr = dblock_addr;
+
+                /* Mark that heap header was modified */
+                if(H5HF_hdr_dirty(hdr) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
+            } /* end if */
+            else { /* the direct block's parent is an indirect block */
+                /* Sanity check */
+                HDassert(par_iblock);
+                HDassert(par_iblock->ents);
+                HDassert(H5F_addr_eq(par_iblock->ents[par_entry].addr, addr));
+
+                /* Allocate 'normal' space for the direct block */
+                if(HADDR_UNDEF == (dblock_addr = H5MF_alloc((H5F_t *)f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, (hsize_t)write_size)))
+                    HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap direct block")
+
+                /* Sanity check */
+                HDassert(!H5F_addr_eq(par_iblock->ents[par_entry].addr, dblock_addr));
+
+                /* Let the metadata cache know the block moved */
+                if(H5AC_move_entry((H5F_t *)f, H5AC_FHEAP_DBLOCK, par_iblock->ents[par_entry].addr, dblock_addr) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTMOVE, FAIL, "unable to move direct block")
+
+                /* Update information about direct block's location */
+                par_iblock->ents[par_entry].addr = dblock_addr;
+
+                /* Mark that parent was modified */
+                if(H5HF_iblock_dirty(par_iblock) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark heap header as dirty")
+            } /* end else */
+        } /* end if */
+    } /* end else */
 
-	/* Write the direct block */
-	if(H5F_block_write(f, H5FD_MEM_FHEAP_DBLOCK, addr, write_size, dxpl_id, write_buf) < 0)
-	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFLUSH, FAIL, "unable to save fractal heap direct block to disk")
+    /* At this point, write_buf points to a buffer containing the image 
+     * of the direct block that is ready to copy into the image buffer,
+     * and write_size contains the length of this buffer. 
+     *
+     * Also, if image size or address has changed, the direct block's
+     * parent has been modified to reflect the change.
+     *
+     * Now, make note of the pointer and length of the above buffer for
+     * use by the serialize function.
+     */
+    dblock->write_buf = (uint8_t *)write_buf;
+    dblock->write_size = write_size;
 
-        /* Release the write buffer, if it was allocated */
-        if(write_buf != dblock->blk)
-            H5MM_xfree(write_buf);
+    /* finally, pass data back to the metadata cache as appropriate */
+    if(!H5F_addr_eq(addr, dblock_addr)) {
+        dblock_flags |= H5C__SERIALIZE_MOVED_FLAG;
+        *new_addr = dblock_addr;
+    } /* end if */
 
-	dblock->cache_info.is_dirty = FALSE;
+    if((hdr->filter_len > 0) && (compressed_len != write_size)) {
+        dblock_flags |= H5C__SERIALIZE_COMPRESSED_FLAG;
+        *new_compressed_len = write_size;
     } /* end if */
 
-    if(destroy)
-        if(H5HF_cache_dblock_dest(f, dblock) < 0)
-	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy fractal heap direct block")
+    *flags = dblock_flags;
+
+    /* final sanity check */
+    HDassert(dblock->write_buf);
+    HDassert(dblock->write_size > 0);
 
 done:
+    /* discard the write buf if we have an error */
+    if(write_buf && (write_buf != dblock->blk) && (dblock->write_buf == NULL))
+	H5MM_xfree(write_buf);
+
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5HF_cache_dblock_flush() */
+} /* end H5HF__cache_dblock_pre_serialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_cache_dblock_dest
+ * Function:	H5HF__cache_dblock_serialize
  *
- * Purpose:	Destroys a fractal heap direct block in memory.
+ * Purpose:	In principle, this function is supposed to construct the on 
+ *		disk image of the direct block, and place that image in the 
+ *		image buffer provided by the metadata cache.
  *
- * Return:	Non-negative on success/Negative on failure
+ *		However, since there are cases in which the pre_serialize 
+ *		function has to construct the on disk image to determine its size 
+ *		and address, this function simply copies the image prepared by
+ *		the pre-serialize function into the supplied image buffer, and 
+ *		discards a buffer if necessary.
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 27 2006
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
+ *
+ * Programmer:	John Mainzer
+ *		6/21/14
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5HF_cache_dblock_dest(H5F_t *f, H5HF_direct_t *dblock)
+static herr_t 
+H5HF__cache_dblock_serialize(const H5F_t *f, void *image, size_t len,
+    void *_thing)
 {
-    herr_t      ret_value = SUCCEED;    /* Return value */
+    H5HF_direct_t       *dblock = (H5HF_direct_t *)_thing;      /* Direct block info */
+    herr_t               ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR
 
-    /*
-     * Check arguments.
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(image);
+    HDassert(len > 0);
+    HDassert(dblock);
+    HDassert(dblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(dblock->cache_info.type == H5AC_FHEAP_DBLOCK);
+    HDassert((dblock->blk != dblock->write_buf) || (dblock->cache_info.size == dblock->size));
+    HDassert(dblock->write_buf);
+    HDassert(dblock->write_size > 0);
+    HDassert((dblock->blk != dblock->write_buf) || (dblock->write_size == dblock->size));
+    HDassert(dblock->write_size == len);
+
+    /* Copy the image from *(dblock->write_buf) to *image */
+    HDmemcpy(image, dblock->write_buf, dblock->write_size);
+
+    /* Free *(dblock->write_buf) if it was allocated by the 
+     * pre-serialize function 
      */
+    if(dblock->write_buf != dblock->blk)
+        H5MM_xfree(dblock->write_buf);
+
+    /* Reset the write_buf and write_size fields */
+    dblock->write_buf = NULL;
+    dblock->write_size = 0;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF__cache_dblock_serialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF__cache_dblock_notify
+ *
+ * Purpose:	Setup / takedown flush dependencies as direct blocks
+ *		are loaded / inserted and evicted from the metadata cache.
+ *
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
+ *
+ * Programmer:	John Mainzer
+ *		6/21/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5HF__cache_dblock_notify(H5C_notify_action_t action, void *_thing)
+{
+    H5HF_direct_t 	*dblock = (H5HF_direct_t *)_thing;      /* Fractal heap direct block */
+    herr_t 		 ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
     HDassert(dblock);
+    HDassert(dblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(dblock->cache_info.type == H5AC_FHEAP_DBLOCK);
+    HDassert(dblock->hdr);
+    HDassert((dblock->fd_parent) ||
+             ((dblock->hdr->man_dtable.curr_root_rows == 0) && (dblock->block_off == (hsize_t)0)));
+
+    switch(action) {
+        case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+        case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+            HDassert(dblock->parent == dblock->fd_parent);
+            if(dblock->parent) {        /* this is a leaf dblock */
+                /* create flush dependency with parent iblock */
+                if(H5AC_create_flush_dependency(dblock->parent, dblock) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+            } /* end if */
+            else {      /* this is a root dblock */
+                /* create flush dependency with header */
+                if(H5AC_create_flush_dependency(dblock->hdr, dblock) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+            } /* end else */
+            break;
+
+	case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+	    /* do nothing */
+	    break;
+
+        case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+            HDassert((dblock->parent == dblock->fd_parent) ||
+                     ((NULL == dblock->parent) && (dblock->fd_parent)));
+            if(dblock->fd_parent) {     /* this is a leaf dblock */
+                /* destroy flush dependency with parent iblock */
+                if(H5AC_destroy_flush_dependency(dblock->fd_parent, dblock) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+            } /* end if */
+            else {      /* this is a root dblock */
+                /* destroy flush dependency with header */
+                if(H5AC_destroy_flush_dependency(dblock->hdr, dblock) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+            } /* end else */
+            break;
 
-    /* If we're going to free the space on disk, the address must be valid */
-    HDassert(!dblock->cache_info.free_file_space_on_destroy || H5F_addr_defined(dblock->cache_info.addr));
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unknown action from metadata cache")
+            break;
+    } /* end switch */
 
-    /* Check for freeing file space for direct block */
-    if(dblock->cache_info.free_file_space_on_destroy) {
-        /* Sanity check */
-        HDassert(dblock->file_size > 0);
-
-        /* Check if the direct block is NOT currently allocated in temp. file space */
-        /* (temp. file space does not need to be freed) */
-        if(!H5F_IS_TMP_ADDR(f, dblock->cache_info.addr)) {
-            /* Release the space on disk */
-            /* (XXX: Nasty usage of internal DXPL value! -QAK) */
-            if(H5MF_xfree(f, H5FD_MEM_FHEAP_DBLOCK, H5AC_dxpl_id, dblock->cache_info.addr, dblock->file_size) < 0)
-                HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free fractal heap direct block")
-        } /* end if */
-    } /* end if */
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF__cache_dblock_notify() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5HF__cache_dblock_free_icr
+ *
+ * Purpose:	Free the in core memory allocated to the supplied direct
+ *		block.
+ *
+ * Note:	The metadata cache sets the object's cache_info.magic to
+ *		H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC before calling a free_icr
+ *		callback (checked in assert).
+ *
+ * Return:	Success:	SUCCEED
+ *		Failure:	FAIL
+ *
+ * Programmer:	John Mainzer
+ *		6/21/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5HF__cache_dblock_free_icr(void *_thing)
+{
+    H5HF_direct_t       *dblock = (H5HF_direct_t *)_thing;      /* Fractal heap direct block */
+    herr_t      	 ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(dblock);
+    HDassert(dblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC);
+    HDassert(dblock->cache_info.type == H5AC_FHEAP_DBLOCK);
 
     /* Destroy fractal heap direct block */
     if(H5HF_man_dblock_dest(dblock) < 0)
@@ -1693,73 +2749,632 @@ H5HF_cache_dblock_dest(H5F_t *f, H5HF_direct_t *dblock)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HF_cache_dblock_dest() */
+} /* end H5HF__cache_dblock_free_icr() */
 
 

-/*-------------------------------------------------------------------------
- * Function:	H5HF_cache_dblock_clear
+/*------------------------------------------------------------------------
+ * Function:	H5HF__cache_verify_hdr_descendants_clean
  *
- * Purpose:	Mark a fractal heap direct block in memory as non-dirty.
+ * Purpose:	Sanity checking routine that verifies that all indirect 
+ *		and direct blocks that are descendants of the supplied 
+ *		instance of H5HF_hdr_t are clean.  Set *clean to 
+ *		TRUE if this is the case, and to FALSE otherwise.
  *
  * Return:	Non-negative on success/Negative on failure
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 27 2006
+ * Programmer:	John Mainzer
+ *		5/25/14
  *
  *-------------------------------------------------------------------------
  */
+#ifndef NDEBUG
 static herr_t
-H5HF_cache_dblock_clear(H5F_t *f, H5HF_direct_t *dblock, hbool_t destroy)
+H5HF__cache_verify_hdr_descendants_clean(H5F_t *f, hid_t dxpl_id,
+    H5HF_hdr_t * hdr, hbool_t *clean)
 {
-    herr_t ret_value = SUCCEED;         /* Return value */
+    haddr_t	hdr_addr;               /* Address of header */
+    unsigned	hdr_status = 0;         /* Header cache entry status */
+    herr_t      ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /*
-     * Check arguments.
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(hdr);
+    HDassert(hdr->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(hdr->cache_info.type == H5AC_FHEAP_HDR);
+    HDassert(clean);
+    hdr_addr = hdr->cache_info.addr;
+    HDassert(hdr_addr == hdr->heap_addr);
+
+    if(H5AC_get_entry_status(f, hdr_addr, &hdr_status) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't get hdr status")
+    HDassert(hdr_status & H5AC_ES__IN_CACHE);
+
+    /* We have three basic scenarios we have to deal with:
+     *
+     * The first, and most common case, is that there is a root iblock.  
+     * In this case we need to verify that the root iblock and all its 
+     * children are clean.
+     *
+     * The second, and much less common case, is that in which the 
+     * the fractal heap contains only one direct block, which is 
+     * pointed to by hdr->man_dtable.table_addr.  In this case, all we 
+     * need to do is verify that the root direct block is clean.
+     *
+     * Finally, it is possible that the fractal heap is empty, and 
+     * has neither a root indirect block nor a root direct block.
+     * In this case, we have nothing to do.
      */
-    HDassert(dblock);
 
-    /* Reset the dirty flag.  */
-    dblock->cache_info.is_dirty = FALSE;
+    /* There are two ways in which we can arrive at the first scenario.
+     *
+     * By far the most common is when hdr->root_iblock contains a pointer
+     * to the root iblock -- in this case the root iblock is almost certainly 
+     * pinned, although we can't count on that.
+     *
+     * However, it is also possible that there is a root iblock that 
+     * is no longer pointed to by the header.  In this case, the on 
+     * disk address of the iblock will be in hdr->man_dtable.table_addr
+     * and hdr->man_dtable.curr_root_rows will contain a positive value.
+     *
+     * Since the former case is far and away the most common, we don't 
+     * worry too much about efficiency in the second case.
+     */
+    if(hdr->root_iblock ||
+             ((hdr->man_dtable.curr_root_rows > 0) &&
+               (HADDR_UNDEF != hdr->man_dtable.table_addr))) {
+        H5HF_indirect_t *root_iblock = hdr->root_iblock;
+        haddr_t		root_iblock_addr;
+        unsigned	root_iblock_status = 0;
+        hbool_t		root_iblock_in_cache;
+
+        /* make note of the on disk address of the root iblock */
+        if(root_iblock == NULL)
+	    /* hdr->man_dtable.table_addr must contain address of root
+             * iblock.  Check to see if it is in cache.  If it is, 
+             * protect it and put its address in root_iblock.
+             */
+	    root_iblock_addr = hdr->man_dtable.table_addr;
+        else
+	    root_iblock_addr = root_iblock->addr;
+
+	/* get the status of the root iblock */
+	HDassert(root_iblock_addr != HADDR_UNDEF);
+        if(H5AC_get_entry_status(f, root_iblock_addr, &root_iblock_status) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't get root iblock status")
+
+	root_iblock_in_cache = ( (root_iblock_status & H5AC_ES__IN_CACHE) != 0);
+	HDassert(root_iblock_in_cache || (root_iblock == NULL));
+
+	if(!root_iblock_in_cache) /* we are done */
+	    *clean = TRUE;
+	else if(root_iblock_status & H5AC_ES__IS_DIRTY)
+	    *clean = FALSE;
+	else { /* must examine children */
+            hbool_t	unprotect_root_iblock = FALSE;
+
+	    /* At this point, the root iblock may be pinned, protected,
+	     * both, or neither, and we may or may not have a pointer
+	     * to root iblock in memory.  
+	     *
+	     * Before we call H5HF__cache_verify_iblock_descendants_clean(),
+	     * we must ensure that the root iblock is either pinned or 
+	     * protected or both, and that we have a pointer to it.  
+	     * Do this as follows:
+	     */
+	    if(root_iblock == NULL) {   /* we don't have ptr to root iblock */
+		if(0 == (root_iblock_status & H5AC_ES__IS_PROTECTED)) {
+		    /* just protect the root iblock -- this will give us
+		     * the pointer we need to proceed, and ensure that 
+		     * it is locked into the metadata cache for the 
+		     * duration.
+		     *
+		     * Note that the udata is only used in the load callback.
+                     * While the fractal heap makes heavy use of the udata
+                     * in this case, since we know that the entry is in cache,
+                     * we can pass NULL udata.
+		     */
+                    if(NULL == (root_iblock = (H5HF_indirect_t *)H5AC_protect(f, dxpl_id, H5AC_FHEAP_IBLOCK, root_iblock_addr, NULL, H5C__READ_ONLY_FLAG)))
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "H5AC_protect() faild.")
+                    unprotect_root_iblock = TRUE;
+		} /* end if */
+                else {
+		    /* the root iblock is protected, and we have no
+		     * legitimate way of getting a pointer to it.
+		     *
+		     * We square this circle by using the 
+		     * H5AC_get_entry_ptr_from_addr() to get the needed
+		     * pointer.
+		     *
+		     * WARNING: This call should be used only in debugging
+                     *          routines, and it should be avoided there when
+                     *          possible.
+                     *
+                     *          Further, if we ever multi-thread the cache,
+                     *          this routine will have to be either discarded
+                     *          or heavily re-worked.
+                     *
+                     *          Finally, keep in mind that the entry whose
+                     *          pointer is obtained in this fashion may not
+                     *          be in a stable state.
+                     *
+                     * Assuming that the flush dependency code is working
+                     * as it should, the only reason for the root iblock to
+                     * be unpinned is if none of its children are in cache.
+                     * This unfortunately means that if it is protected and
+                     * not pinned, the fractal heap is in the process of loading
+                     * or inserting one of its children.  The obvious implication
+                     * is that there is a significant chance that the root
+                     * iblock is in an unstable state.
+                     *
+                     * All this suggests that using H5AC_get_entry_ptr_from_addr()
+		     * to obtain the pointer to the protected root iblock is 
+		     * questionable here.  However, since this is test/debugging 
+		     * code, I expect that we will use this approach until it 
+		     * causes problems, or we think of a better way.
+                     */
+                    if(H5AC_get_entry_ptr_from_addr(f, root_iblock_addr, (void **)(&root_iblock)) < 0)
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "H5AC_get_entry_ptr_from_addr() failed.")
+                    HDassert(root_iblock);
+		} /* end else */
+	    } /* end if */
+            else {      /* root_iblock != NULL */
+		/* we have the pointer to the root iblock.  Protect it 
+		 * if it is neither pinned nor protected -- otherwise we 
+		 * are ready to go.
+		 */
+                H5HF_indirect_t *   iblock = NULL;
+
+                if(((root_iblock_status & H5AC_ES__IS_PINNED) == 0) &&
+                        ((root_iblock_status & H5AC_ES__IS_PROTECTED) == 0)) {
+                    /* the root iblock is neither pinned nor protected -- hence
+                     * we must protect it before we proceed
+                     *
+                     * Note that the udata is only used in the load callback.
+                     * While the fractal heap makes heavy use of the udata
+                     * in this case, since we know that the entry is in cache,
+                     * we can pass NULL udata.
+                     */
+                    if(NULL == (iblock = (H5HF_indirect_t *)H5AC_protect(f, dxpl_id, H5AC_FHEAP_IBLOCK, root_iblock_addr, NULL, H5C__READ_ONLY_FLAG)))
+                        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "H5AC_protect() faild.")
+                    unprotect_root_iblock = TRUE;
+                    HDassert(iblock == root_iblock);
+		} /* end if */
+	    } /* end else */
+
+            /* at this point, one way or another, the root iblock is locked
+             * in memory for the duration of the call.  Do some sanity checks,
+	     * and then call H5HF__cache_verify_iblock_descendants_clean().
+             */
+            HDassert(hdr->root_iblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+            HDassert(hdr->root_iblock->cache_info.type == H5AC_FHEAP_IBLOCK);
+
+            if(H5HF__cache_verify_iblock_descendants_clean(f, dxpl_id, root_iblock, &root_iblock_status, clean) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "can't verify root iblock & descendants clean.")
+
+            /* unprotect the root indirect block if required */
+            if(unprotect_root_iblock) {
+                HDassert(root_iblock);
+                if(H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_IBLOCK, root_iblock_addr, root_iblock, H5AC__NO_FLAGS_SET) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "H5AC_unprotect() faild.")
+            } /* end if */
+        } /* end else */
+    } /* end if */
+    else if((hdr->man_dtable.curr_root_rows == 0) &&
+		(HADDR_UNDEF != hdr->man_dtable.table_addr)) {
+        haddr_t		root_dblock_addr;
+        unsigned	root_dblock_status = 0;
+        hbool_t		in_cache;
+        hbool_t		type_ok;
+
+	/* this is scenario 2 -- we have a root dblock */
+	root_dblock_addr = hdr->man_dtable.table_addr;
+        if(H5AC_get_entry_status(f, root_dblock_addr, &root_dblock_status) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't get root dblock status")
+
+	if(root_dblock_status & H5AC_ES__IN_CACHE) {
+	    if(H5AC_verify_entry_type(f, root_dblock_addr, &H5AC_FHEAP_DBLOCK[0], &in_cache, &type_ok) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't check dblock type")
+	    HDassert(in_cache);
+	    if(!type_ok)
+		HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "root dblock addr doesn't refer to a dblock?!?")
+
+            /* If a root dblock is in cache, it must have a flush
+             * dependency relationship with the header, and it
+             * may not be the parent in any flush dependency
+             * relationship.
+             *
+             * We don't test this fully, but we will verify that
+             * the root iblock is a child in some flush dependency
+             * relationship.
+             */
+            if(0 == (root_dblock_status & H5AC_ES__IS_FLUSH_DEP_CHILD))
+                HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "root dblock in cache and not a flush dep child.")
+            if(0 != (root_dblock_status & H5AC_ES__IS_FLUSH_DEP_PARENT))
+                HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "root dblock in cache and is a flush dep parent.")
+
+	    *clean = ! (root_dblock_status & H5AC_ES__IS_DIRTY);
+	} /* end if */
+        else    /* root dblock not in cache */
+	    *clean = TRUE;
+    } /* end else-if */
+    else
+	/* this is scenario 3 -- the fractal heap is empty, and we 
+	 * have nothing to do. 
+	 */
+	*clean = TRUE;
 
-    if(destroy)
-        if(H5HF_cache_dblock_dest(f, dblock) < 0)
-	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy fractal heap direct block")
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF__cache_verify_hdr_descendants_clean() */
+#endif /* NDEBUG */
+
+

+/*------------------------------------------------------------------------
+ * Function:	H5HF__cache_verify_iblock_descendants_clean
+ *
+ * Purpose:	Sanity checking routine that verifies that all indirect 
+ *		and direct blocks that are decendents of the supplied 
+ *		instance of H5HF_indirect_t are clean.  Set *clean 
+ *		to TRUE if this is the case, and to FALSE otherwise.
+ *
+ *		In passing, the function also does a cursory check to 
+ *		spot any obvious errors in the flush dependency setup.  
+ *		If any problems are found, the function returns failure.  
+ *		Note that these checks are not exhaustive, thus passing 
+ *		them does not mean that the flush dependencies are 
+ *		correct -- only that there is nothing obviously wrong
+ *		with them.
+ *
+ *		WARNING:  At its top level call, this function is 
+ *		intended to be called from H5HF_cache_iblock_flush(), 
+ *		and thus presumes that the supplied indirect block 
+ *		is in cache.  Any other use of this function and 
+ *		its descendants must insure that this assumption is 
+ *		met.
+ *
+ *		Note that this function and 
+ *		H5HF__cache_verify_descendant_iblocks_clean() are 
+ *		recursive co-routines.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	John Mainzer
+ *		5/25/14
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NDEBUG
+static herr_t
+H5HF__cache_verify_iblock_descendants_clean(H5F_t *f, hid_t dxpl_id,
+    H5HF_indirect_t *iblock, unsigned *iblock_status, hbool_t *clean)
+{
+    hbool_t	has_dblocks = FALSE;
+    hbool_t	has_iblocks = FALSE;
+    herr_t      ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(iblock);
+    HDassert(iblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(iblock->cache_info.type == H5AC_FHEAP_IBLOCK);
+    HDassert(iblock_status);
+    HDassert(clean);
+    HDassert(*clean);
+
+    if((*clean) && H5HF__cache_verify_iblocks_dblocks_clean(f, iblock, clean, &has_dblocks) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "can't verify dblocks clean.")
+
+    if((*clean) && H5HF__cache_verify_descendant_iblocks_clean(f, dxpl_id, iblock, clean, &has_iblocks) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "can't verify iblocks clean.")
+
+    if((NULL == iblock_status) && H5AC_get_entry_status(f, iblock->addr, iblock_status) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't get iblock status")
+
+    /* verify that flush dependency setup is plausible */
+    if(0 == (*iblock_status & H5AC_ES__IS_FLUSH_DEP_CHILD))
+	HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "iblock is not a flush dep child.")
+    if(((has_dblocks || has_iblocks)) && (0 == (*iblock_status & H5AC_ES__IS_FLUSH_DEP_PARENT)))
+	HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "iblock has children and is not a flush dep parent.")
+    if(((has_dblocks || has_iblocks)) && (0 == (*iblock_status & H5AC_ES__IS_PINNED)))
+	HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "iblock has children and is not pinned.")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HF_cache_dblock_clear() */
+} /* H5HF__cache_verify_iblock_descendants_clean() */
+#endif /* NDEBUG */
 
 

-/*-------------------------------------------------------------------------
- * Function:	H5HF_cache_dblock_size
+/*------------------------------------------------------------------------
+ * Function:	H5HF__cache_verify_iblocks_dblocks_clean
+ *
+ * Purpose:	Sanity checking routine that attempts to verify that all
+ *		direct blocks pointed to by the supplied indirect block
+ *		are either clean, or not in the cache.
+ *
+ *		In passing, the function also does a cursory check to 
+ *		spot any obvious errors in the flush dependency setup.  
+ *		If any problems are found, the function returns failure.  
+ *		Note that these checks are not exhaustive, thus passing 
+ *		them does not mean that the flush dependencies are 
+ *		correct -- only that there is nothing obviously wrong
+ *		with them.
+ *
+ *		WARNING:  This function presumes that the supplied 
+ *		iblock is in the cache, and will not be removed 
+ *		during the call.  Caller must ensure that this is 
+ *		the case before the call.
  *
- * Purpose:	Compute the size in bytes of a fractal heap direct block
- *		on disk, and return it in *size_ptr.  On failure,
- *		the value of *size_ptr is undefined.
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	John Mainzer
+ *		5/25/14
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef NDEBUG
+static herr_t
+H5HF__cache_verify_iblocks_dblocks_clean(H5F_t *f, H5HF_indirect_t *iblock, 
+    hbool_t *clean, hbool_t *has_dblocks)
+{
+    unsigned	num_direct_rows;
+    unsigned	max_dblock_index;
+    unsigned    i;
+    herr_t      ret_value = SUCCEED;      /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(iblock);
+    HDassert(iblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(iblock->cache_info.type == H5AC_FHEAP_IBLOCK);
+    HDassert(clean);
+    HDassert(*clean);
+    HDassert(has_dblocks);
+
+    i = 0;
+    num_direct_rows = MIN(iblock->nrows, iblock->hdr->man_dtable.max_direct_rows);
+    HDassert(num_direct_rows <= iblock->nrows);
+    max_dblock_index = (num_direct_rows * iblock->hdr->man_dtable.cparam.width) - 1;
+    while((*clean) && (i <= max_dblock_index)) {
+        haddr_t     dblock_addr;
+
+        dblock_addr = iblock->ents[i].addr;
+	if(H5F_addr_defined(dblock_addr)) {
+            hbool_t	in_cache;
+            hbool_t	type_ok;
+
+	    if(H5AC_verify_entry_type(f, dblock_addr, &H5AC_FHEAP_DBLOCK[0], &in_cache, &type_ok) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't check dblock type")
+
+	    if(in_cache) { /* dblock is in cache */
+                unsigned 	dblock_status = 0;
+
+		if(!type_ok)
+		    HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "dblock addr doesn't refer to a dblock?!?")
+
+                if(H5AC_get_entry_status(f, dblock_addr, &dblock_status) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't get dblock status")
+                HDassert(dblock_status & H5AC_ES__IN_CACHE);
+
+	        *has_dblocks = TRUE;
+                if(dblock_status & H5AC_ES__IS_DIRTY)
+		    *clean = FALSE;
+
+	        /* If a child dblock is in cache, it must have a flush 
+                 * dependency relationship with this iblock, and it 
+                 * may not be the parent in any flush dependency 
+                 * relationship.  
+                 * 
+                 * We don't test this fully, but we will verify that 
+                 * the child iblock is a child in some flush dependency 
+                 * relationship.
+                 */
+	        if(0 == (dblock_status & H5AC_ES__IS_FLUSH_DEP_CHILD))
+		    HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "dblock in cache and not a flush dep child.")
+	        
+                if(0 != (dblock_status & H5AC_ES__IS_FLUSH_DEP_PARENT)) 
+		    HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "dblock in cache and is a flush dep parent.")
+   
+            } /* end if */
+        } /* end if */
+
+        i++;
+    } /* end while */
+    
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF__cache_verify_iblocks_dblocks_clean() */
+#endif /* NDEBUG */
+
+

+/*------------------------------------------------------------------------
+ * Function:	H5HF__cache_verify_descendant_iblocks_clean
+ *
+ * Purpose:	Sanity checking routine that attempts to verify that all
+ *		direct blocks pointed to by the supplied indirect block
+ *		are either clean, or not in the cache.
+ *
+ *		In passing, the function also does a cursory check to 
+ *		spot any obvious errors in the flush dependency setup.  
+ *		If any problems are found, the function returns failure.  
+ *		Note that these checks are not exhaustive, thus passing 
+ *		them does not mean that the flush dependencies are 
+ *		correct -- only that there is nothing obviously wrong
+ *		with them.
+ *
+ *		WARNING:  This function presumes that the supplied 
+ *		iblock is in the cache, and will not be removed 
+ *		during the call.  Caller must ensure that this is 
+ *		the case before the call.
  *
  * Return:	Non-negative on success/Negative on failure
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Feb 24 2006
+ * Programmer:	John Mainzer
+ *		5/25/14
  *
  *-------------------------------------------------------------------------
  */
+#ifndef NDEBUG
 static herr_t
-H5HF_cache_dblock_size(const H5F_t H5_ATTR_UNUSED *f, const H5HF_direct_t *dblock, size_t *size_ptr)
+H5HF__cache_verify_descendant_iblocks_clean(H5F_t *f, hid_t dxpl_id,
+    H5HF_indirect_t *iblock, hbool_t *clean, hbool_t *has_iblocks)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    unsigned	      first_iblock_index;
+    unsigned	      last_iblock_index;
+    unsigned	      num_direct_rows;
+    unsigned	      i;
+    herr_t            ret_value = SUCCEED;      /* Return value */
 
-    /* check arguments */
-    HDassert(dblock);
-    HDassert(size_ptr);
+    FUNC_ENTER_STATIC
 
-    /* Set size value */
-    *size_ptr = dblock->size;
+    /* Sanity checks */
+    HDassert(f);
+    HDassert(iblock);
+    HDassert(iblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(iblock->cache_info.type == H5AC_FHEAP_IBLOCK);
+    HDassert(clean);
+    HDassert(*clean);
+    HDassert(has_iblocks);
+    num_direct_rows = MIN(iblock->nrows, iblock->hdr->man_dtable.max_direct_rows);
+    HDassert(num_direct_rows <= iblock->nrows);
+
+    first_iblock_index = num_direct_rows * iblock->hdr->man_dtable.cparam.width;
+    last_iblock_index = (iblock->nrows * iblock->hdr->man_dtable.cparam.width) - 1;
+
+    i = first_iblock_index;
+    while((*clean) && (i <= last_iblock_index)) {
+        haddr_t           child_iblock_addr = iblock->ents[i].addr;
+
+	if(H5F_addr_defined(child_iblock_addr)) {
+            unsigned 	      child_iblock_status = 0;
+
+            if(H5AC_get_entry_status(f, child_iblock_addr, &child_iblock_status) < 0)
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't get iblock status")
+
+	    if(child_iblock_status & H5AC_ES__IN_CACHE) {
+	        *has_iblocks = TRUE;
+                if(child_iblock_status & H5AC_ES__IS_DIRTY)
+		    *clean = FALSE;
+
+                /* if the child iblock is in cache and *clean is TRUE, 
+                 * we must continue to explore down the fractal heap tree
+                 * structure to verify that all descendant blocks are either
+                 * clean, or not in the metadata cache.  We do this with a 
+                 * recursive call to 
+		 * H5HF__cache_verify_iblock_descendants_clean().
+		 * However, we can't make this call unless the child iblock
+                 * is somehow locked into the cache -- typically via either 
+ 		 * pinning or protecting.
+                 *
+                 * If the child iblock is pinned, we can look up its pointer
+                 * on the current iblock's pinned child iblock list, and 
+                 * and use that pointer in the recursive call.
+                 *
+                 * If the entry is unprotected and unpinned, we simply
+                 * protect it.
+                 *
+		 * If, however, the the child iblock is already protected, 
+                 * but not pinned, we have a bit of a problem, as we have 
+		 * no legitimate way of looking up its pointer in memory.
+		 *
+		 * To solve this problem, I have added a new metadata cache
+		 * call to obtain the pointer.  
+		 *
+		 * WARNING: This call should be used only in debugging 
+		 * 	    routines, and it should be avoided there when 
+		 *	    possible.  
+		 *
+		 *          Further, if we ever multi-thread the cache, 
+		 *	    this routine will have to be either discarded 
+		 *	    or heavily re-worked.
+		 *
+		 *	    Finally, keep in mind that the entry whose 
+		 *	    pointer is obtained in this fashion may not 
+		 *          be in a stable state.  
+		 *
+		 * Assuming that the flush dependency code is working 
+		 * as it should, the only reason for the child entry to 
+		 * be unpinned is if none of its children are in cache.
+		 * This unfortunately means that if it is protected and 
+		 * not pinned, the fractal heap is in the process of loading
+		 * or inserting one of its children.  The obvious implication
+		 * is that there is a significant chance that the child 
+		 * iblock is in an unstable state.
+		 *
+		 * All this suggests that using the new call to obtain the 
+		 * pointer to the protected child iblock is questionable 
+		 * here.  However, since this is test/debugging code, I
+		 * expect that we will use this approach until it causes
+		 * problems, or we think of a better way.
+                 */
+                if(*clean) {
+                    H5HF_indirect_t *child_iblock = NULL;
+                    hbool_t unprotect_child_iblock = FALSE;
+
+		    if(0 == (child_iblock_status & H5AC_ES__IS_PINNED)) {
+			/* child iblock is not pinned */
+			if(0 == (child_iblock_status & H5AC_ES__IS_PROTECTED)) {
+			    /* child iblock is unprotected, and unpinned */
+			    /* protect it.  Note that the udata is only  */
+			    /* used in the load callback.  While the     */
+			    /* fractal heap makes heavy use of the udata */
+			    /* in this case, since we know that the      */
+			    /* entry is in cache, we can pass NULL udata */
+
+			    if(NULL == (child_iblock = (H5HF_indirect_t *) H5AC_protect(f, dxpl_id, H5AC_FHEAP_IBLOCK, child_iblock_addr, NULL, H5C__READ_ONLY_FLAG)))
+                                HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "H5AC_protect() faild.")
+			    unprotect_child_iblock = TRUE;
+			} /* end if */
+                        else {
+			    /* child iblock is protected -- use             */
+			    /* H5AC_get_entry_ptr_from_addr() to get a      */
+			    /* pointer to the entry.  This is very slimy -- */
+			    /* come up with a better solution.              */
+			    if(H5AC_get_entry_ptr_from_addr(f, child_iblock_addr, (void **)(&child_iblock)) < 0)
+                                HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "H5AC_get_entry_ptr_from_addr() faild.")
+			    HDassert(child_iblock);
+			} /* end else */
+		    } /* end if */
+                    else {
+			/* child iblock is pinned -- look it up in the */
+			/* parent iblocks child_iblocks array.         */
+			HDassert(iblock->child_iblocks);
+			child_iblock = iblock->child_iblocks[i - first_iblock_index];
+		    } /* end else */
+
+		    /* At this point, one way or another we should have 
+                     * a pointer to the child iblock.  Verify that we 
+                     * that we have the correct one.
+                     */
+		    HDassert(child_iblock);
+    		    HDassert(child_iblock->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    		    HDassert(child_iblock->cache_info.type == H5AC_FHEAP_IBLOCK);
+		    HDassert(child_iblock->addr == child_iblock_addr);
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HF_cache_dblock_size() */
+		    /* now make the recursive call */
+		    if(H5HF__cache_verify_iblock_descendants_clean(f, dxpl_id, child_iblock, &child_iblock_status, clean) < 0)
+        		HGOTO_ERROR(H5E_HEAP, H5E_SYSTEM, FAIL, "can't verify child iblock clean.")
+
+		    /* if we protected the child iblock, unprotect it now */
+		    if(unprotect_child_iblock) {
+			if(H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_IBLOCK, child_iblock_addr, child_iblock, H5AC__NO_FLAGS_SET) < 0)
+                            HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "H5AC_unprotect() faild.")
+
+                    } /* end if */
+                } /* end if */
+            } /* end if */
+        } /* end if */
+
+        i++;
+    } /* end while */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5HF__cache_verify_descendant_iblocks_clean() */
+#endif /* NDEBUG */
 
diff --git a/src/H5HFdbg.c b/src/H5HFdbg.c
index 41e317d..40191e5 100644
--- a/src/H5HFdbg.c
+++ b/src/H5HFdbg.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+#include "H5HFmodule.h"         /* This source code file is part of the H5HF module */
 #define H5HF_DEBUGGING          /* Need access to fractal heap debugging routines */
 
 /***********/
@@ -100,6 +100,80 @@ static herr_t H5HF_dtable_debug(const H5HF_dtable_t *dtable, FILE *stream,
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5HF_id_print
+ *
+ * Purpose:	Prints a fractal heap ID.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 20 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_id_print(H5HF_t *fh, hid_t dxpl_id, const void *_id, FILE *stream, int indent, int fwidth)
+{
+    const uint8_t *id = (const uint8_t *)_id;   /* Object ID */
+    uint8_t id_flags;                   /* Heap ID flag bits */
+    hsize_t obj_off;                    /* Offset of object */
+    size_t obj_len;                     /* Length of object */
+    char id_type;                       /* Character for the type of heap ID */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(fh);
+    HDassert(id);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    /* Get the ID flags */
+    id_flags = *id;
+
+    /* Check for correct heap ID version */
+    if((id_flags & H5HF_ID_VERS_MASK) != H5HF_ID_VERS_CURR)
+        HGOTO_ERROR(H5E_HEAP, H5E_VERSION, FAIL, "incorrect heap ID version")
+
+    /* Check type of object in heap */
+    if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_MAN) {
+        id_type = 'M';
+    } /* end if */
+    else if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_HUGE) {
+        id_type = 'H';
+    } /* end if */
+    else if((id_flags & H5HF_ID_TYPE_MASK) == H5HF_ID_TYPE_TINY) {
+        id_type = 'T';
+    } /* end if */
+    else {
+HDfprintf(stderr, "%s: Heap ID type not supported yet!\n", FUNC);
+HGOTO_ERROR(H5E_HEAP, H5E_UNSUPPORTED, FAIL, "heap ID type not supported yet")
+    } /* end else */
+
+    /* Get the length of the heap object */
+    if(H5HF_get_obj_len(fh, dxpl_id, id, &obj_len) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve heap ID length")
+
+    /* Get the offset of the heap object */
+    if(H5HF_get_obj_off(fh, dxpl_id, id, &obj_off) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve heap ID length")
+
+    /* Display the heap ID */
+    HDfprintf(stream, "%*s%-*s (%c, %Hu, %Zu)\n", indent, "", fwidth,
+	      "Heap ID info: (type, offset, length)",
+              id_type, obj_off, obj_len);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF_id_print() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5HF_dtable_debug
  *
  * Purpose:	Prints debugging info about a doubling table
@@ -323,7 +397,7 @@ H5HF_hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
     HDassert(fwidth >= 0);
 
     /* Load the fractal heap header */
-    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, addr, H5AC_READ)))
+    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, addr, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap header")
 
     /* Print the information about the heap's header */
@@ -459,13 +533,13 @@ H5HF_dblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream,
     HDassert(block_size > 0);
 
     /* Load the fractal heap header */
-    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, hdr_addr, H5AC_READ)))
+    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, hdr_addr, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap header")
 
     /*
      * Load the heap direct block
      */
-    if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, addr, block_size, NULL, 0, H5AC_READ)))
+    if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, addr, block_size, NULL, 0, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load fractal heap direct block")
 
     /* Print opening message */
@@ -484,9 +558,6 @@ H5HF_dblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream,
     HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
 	      "Size of block header:",
               blk_prefix_size);
-    HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
-	      "Size of block offsets:",
-	      dblock->blk_off_size);
 
     /* Allocate space for the free space markers */
     if(NULL == (marker = (uint8_t *)H5MM_calloc(dblock->size)))
@@ -719,13 +790,13 @@ H5HF_iblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream,
     HDassert(nrows > 0);
 
     /* Load the fractal heap header */
-    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, hdr_addr, H5AC_READ)))
+    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, hdr_addr, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap header")
 
     /*
      * Load the heap indirect block
      */
-    if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, addr, nrows, NULL, 0, FALSE, H5AC_READ, &did_protect)))
+    if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, addr, nrows, NULL, 0, FALSE, H5AC__READ_ONLY_FLAG, &did_protect)))
 	HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load fractal heap indirect block")
 
     /* Print the information about the heap's indirect block */
@@ -828,7 +899,7 @@ H5HF_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t fh_addr,
     HDassert(fwidth >= 0);
 
     /* Load the fractal heap header */
-    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, fh_addr, H5AC_READ)))
+    if(NULL == (hdr = H5HF_hdr_protect(f, dxpl_id, fh_addr, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap header")
 
     /* Initialize the free space information for the heap */
diff --git a/src/H5HFdblock.c b/src/H5HFdblock.c
index 97a519a..73db840 100644
--- a/src/H5HFdblock.c
+++ b/src/H5HFdblock.c
@@ -28,7 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+#include "H5HFmodule.h"         /* This source code file is part of the H5HF module */
+
 
 /***********/
 /* Headers */
@@ -139,7 +140,6 @@ H5HF_man_dblock_create(hid_t dxpl_id, H5HF_hdr_t *hdr, H5HF_indirect_t *par_iblo
         dblock->size = hdr->man_dtable.cparam.start_block_size;
     } /* end else */
     dblock->file_size = 0;
-    dblock->blk_off_size = H5HF_SIZEOF_OFFSET_LEN(dblock->size);
     free_space = dblock->size - H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr);
 
     /* Allocate buffer for block */
@@ -150,6 +150,9 @@ H5HF_man_dblock_create(hid_t dxpl_id, H5HF_hdr_t *hdr, H5HF_indirect_t *par_iblo
 HDmemset(dblock->blk, 0, dblock->size);
 #endif /* H5_CLEAR_MEMORY */
 
+    dblock->write_buf = NULL;
+    dblock->write_size = 0;
+
     /* Allocate [temporary] space for the direct block on disk */
     if(H5F_USE_TMP_SPACE(hdr->f)) {
         if(HADDR_UNDEF == (dblock_addr = H5MF_alloc_tmp(hdr->f, (hsize_t)dblock->size)))
@@ -162,6 +165,7 @@ HDmemset(dblock->blk, 0, dblock->size);
 
     /* Attach to parent indirect block, if there is one */
     dblock->parent = par_iblock;
+    dblock->fd_parent = par_iblock;
     if(dblock->parent)
         if(H5HF_man_iblock_attach(dblock->parent, par_entry, dblock_addr) < 0)
             HGOTO_ERROR(H5E_HEAP, H5E_CANTATTACH, FAIL, "can't attach direct block to parent indirect block")
@@ -308,9 +312,13 @@ H5HF_man_dblock_destroy(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_direct_t *dblock,
         } /* end if */
     } /* end else */
 
-    /* Indicate that the indirect block should be deleted & file space freed */
+    /* Indicate that the indirect block should be deleted */
     dblock->file_size = dblock_size;
-    cache_flags |= H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+    cache_flags |= H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG;
+
+    /* If the dblock is in real file space, also tell the cache to free its file space */
+    if (!H5F_IS_TMP_ADDR(hdr->f, dblock_addr))
+        cache_flags |= H5AC__FREE_FILE_SPACE_FLAG;
 
 done:
     /* Unprotect the indirect block, with appropriate flags */
@@ -360,7 +368,7 @@ H5HF_man_dblock_new(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t request,
     } /* end else */
 
     /* Adjust the size of block needed to fulfill request, with overhead */
-    if((min_dblock_size - request) < H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr))
+    if(min_dblock_size < H5HF_MAN_ABS_DIRECT_OVERHEAD(hdr) + request)
         min_dblock_size *= 2;
 
     /* Check if this is the first block in the heap */
@@ -436,11 +444,11 @@ done:
 H5HF_direct_t *
 H5HF_man_dblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t dblock_addr,
     size_t dblock_size, H5HF_indirect_t *par_iblock, unsigned par_entry,
-    H5AC_protect_t rw)
+    unsigned flags)
 {
     H5HF_direct_t *dblock;      /* Direct block from cache */
     H5HF_dblock_cache_ud_t udata;	/* parent and other infor for deserializing direct block */
-    H5HF_direct_t *ret_value;   /* Return value */
+    H5HF_direct_t *ret_value = NULL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -451,6 +459,9 @@ H5HF_man_dblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t dblock_addr,
     HDassert(H5F_addr_defined(dblock_addr));
     HDassert(dblock_size > 0);
 
+    /* only H5AC__READ_ONLY_FLAG may appear in flags */
+    HDassert((flags & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
     /* Set up parent info */
     udata.par_info.hdr = hdr;
     udata.par_info.iblock = par_iblock;
@@ -485,7 +496,7 @@ H5HF_man_dblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t dblock_addr,
     } /* end else */
 
     /* Protect the direct block */
-    if(NULL == (dblock = (H5HF_direct_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_FHEAP_DBLOCK, dblock_addr, &udata, rw)))
+    if(NULL == (dblock = (H5HF_direct_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_FHEAP_DBLOCK, dblock_addr, &udata, flags)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to protect fractal heap direct block")
 
     /* Set the return value */
@@ -512,7 +523,7 @@ done:
 herr_t
 H5HF_man_dblock_locate(H5HF_hdr_t *hdr, hid_t dxpl_id, hsize_t obj_off,
     H5HF_indirect_t **ret_iblock, unsigned *ret_entry, hbool_t *ret_did_protect,
-    H5AC_protect_t rw)
+    unsigned flags)
 {
     haddr_t iblock_addr;            /* Indirect block's address */
     H5HF_indirect_t *iblock;        /* Pointer to indirect block */
@@ -531,6 +542,9 @@ H5HF_man_dblock_locate(H5HF_hdr_t *hdr, hid_t dxpl_id, hsize_t obj_off,
     HDassert(ret_iblock);
     HDassert(ret_did_protect);
 
+    /* only H5AC__READ_ONLY_FLAG may appear in flags */
+    HDassert((flags & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
     /* Look up row & column for object */
     if(H5HF_dtable_lookup(&hdr->man_dtable, obj_off, &row, &col) < 0)
         HGOTO_ERROR(H5E_HEAP, H5E_CANTCOMPUTE, FAIL, "can't compute row & column of object")
@@ -539,7 +553,7 @@ H5HF_man_dblock_locate(H5HF_hdr_t *hdr, hid_t dxpl_id, hsize_t obj_off,
     iblock_addr = hdr->man_dtable.table_addr;
 
     /* Lock root indirect block */
-    if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, hdr->man_dtable.curr_root_rows, NULL, 0, FALSE, rw, &did_protect)))
+    if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, hdr->man_dtable.curr_root_rows, NULL, 0, FALSE, flags, &did_protect)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block")
 
     /* Check for indirect block row */
@@ -569,7 +583,7 @@ H5HF_man_dblock_locate(H5HF_hdr_t *hdr, hid_t dxpl_id, hsize_t obj_off,
         } /* end if */
 
         /* Lock child indirect block */
-        if(NULL == (new_iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, nrows, iblock, entry, FALSE, rw, &new_did_protect)))
+        if(NULL == (new_iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, nrows, iblock, entry, FALSE, flags, &new_did_protect)))
             HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block")
 
         /* Release the current indirect block */
diff --git a/src/H5HFdtable.c b/src/H5HFdtable.c
index c523396..3ceb6f5 100644
--- a/src/H5HFdtable.c
+++ b/src/H5HFdtable.c
@@ -28,7 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+#include "H5HFmodule.h"         /* This source code file is part of the H5HF module */
+
 
 /***********/
 /* Headers */
@@ -240,7 +241,7 @@ H5HF_dtable_dest(H5HF_dtable_t *dtable)
 unsigned
 H5HF_dtable_size_to_row(const H5HF_dtable_t *dtable, size_t block_size)
 {
-    unsigned row;               /* Row where block will fit */
+    unsigned row = 0;   /* Row where block will fit */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -274,7 +275,7 @@ H5HF_dtable_size_to_row(const H5HF_dtable_t *dtable, size_t block_size)
 unsigned
 H5HF_dtable_size_to_rows(const H5HF_dtable_t *dtable, hsize_t size)
 {
-    unsigned rows;              /* # of rows required for indirect block */
+    unsigned rows = 0;          /* # of rows required for indirect block */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -310,7 +311,7 @@ H5HF_dtable_span_size(const H5HF_dtable_t *dtable, unsigned start_row,
     unsigned end_row;           /* Row for last block covered */
     unsigned end_col;           /* Column for last block covered */
     unsigned end_entry;         /* Entry for last block covered */
-    hsize_t acc_span_size;      /* Accumulated span size */
+    hsize_t acc_span_size = 0;  /* Accumulated span size */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
diff --git a/src/H5HFhdr.c b/src/H5HFhdr.c
index cf8da23..42857c0 100644
--- a/src/H5HFhdr.c
+++ b/src/H5HFhdr.c
@@ -28,7 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+#include "H5HFmodule.h"         /* This source code file is part of the H5HF module */
+
 
 /***********/
 /* Headers */
@@ -110,7 +111,7 @@ H5HF_hdr_t *
 H5HF_hdr_alloc(H5F_t *f)
 {
     H5HF_hdr_t *hdr = NULL;          /* Shared fractal heap header */
-    H5HF_hdr_t *ret_value;              /* Return value */
+    H5HF_hdr_t *ret_value = NULL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -223,7 +224,7 @@ H5HF_hdr_finish_init_phase1(H5HF_hdr_t *hdr)
 	HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize doubling table info")
 
     /* Set the size of heap IDs */
-    hdr->heap_len_size = MIN(hdr->man_dtable.max_dir_blk_off_size,
+    hdr->heap_len_size = (uint8_t)MIN(hdr->man_dtable.max_dir_blk_off_size,
             H5VM_limit_enc_size((uint64_t)hdr->max_man_size));
 
 done:
@@ -342,7 +343,7 @@ H5HF_hdr_create(H5F_t *f, hid_t dxpl_id, const H5HF_create_t *cparam)
 {
     H5HF_hdr_t *hdr = NULL;     /* The new fractal heap header information */
     size_t dblock_overhead;     /* Direct block's overhead */
-    haddr_t ret_value;          /* Return value */
+    haddr_t ret_value = HADDR_UNDEF;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -381,7 +382,7 @@ H5HF_hdr_create(H5F_t *f, hid_t dxpl_id, const H5HF_create_t *cparam)
 	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, HADDR_UNDEF, "can't allocate space for shared heap info")
 
 #ifndef NDEBUG
-    if(cparam->managed.max_index > (8 * hdr->sizeof_size))
+    if(cparam->managed.max_index > (unsigned)(8 * hdr->sizeof_size))
 	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, HADDR_UNDEF, "max. heap size too large for file")
 #endif /* NDEBUG */
 
@@ -426,13 +427,13 @@ H5HF_hdr_create(H5F_t *f, hid_t dxpl_id, const H5HF_create_t *cparam)
             HGOTO_ERROR(H5E_HEAP, H5E_CANTCOPY, HADDR_UNDEF, "can't copy I/O filter pipeline")
 
         /* Pay attention to the latest version flag for the file */
-        if(H5F_USE_LATEST_FORMAT(hdr->f))
+        if(H5F_USE_LATEST_FLAGS(hdr->f, H5F_LATEST_PLINE_MSG))
             /* Set the latest version for the I/O pipeline message */
             if(H5O_pline_set_latest_version(&(hdr->pline)) < 0)
                 HGOTO_ERROR(H5E_HEAP, H5E_CANTSET, HADDR_UNDEF, "can't set latest version of I/O filter pipeline")
 
         /* Compute the I/O filters' encoded size */
-        if(0 == (hdr->filter_len = H5O_msg_raw_size(hdr->f, H5O_PLINE_ID, FALSE, &(hdr->pline))))
+        if(0 == (hdr->filter_len = (unsigned)H5O_msg_raw_size(hdr->f, H5O_PLINE_ID, FALSE, &(hdr->pline))))
             HGOTO_ERROR(H5E_HEAP, H5E_CANTGETSIZE, HADDR_UNDEF, "can't get I/O filter pipeline size")
 
         /* Compute size of header on disk */
@@ -461,13 +462,13 @@ H5HF_hdr_create(H5F_t *f, hid_t dxpl_id, const H5HF_create_t *cparam)
 
         case 1: /* Set the length of heap IDs to just enough to hold the information needed to directly access 'huge' objects in the heap */
             if(hdr->filter_len > 0)
-                hdr->id_len = 1         /* ID flags */
+                hdr->id_len = (unsigned)1 /* ID flags */
                     + hdr->sizeof_addr  /* Address of filtered object */
                     + hdr->sizeof_size  /* Length of filtered object */
                     + 4                 /* Filter mask for filtered object */
                     + hdr->sizeof_size; /* Size of de-filtered object in memory */
             else
-                hdr->id_len = 1         /* ID flags */
+                hdr->id_len = (unsigned)1 /* ID flags */
                     + hdr->sizeof_addr  /* Address of object */
                     + hdr->sizeof_size; /* Length of object */
             break;
@@ -529,11 +530,11 @@ done:
  *-------------------------------------------------------------------------
  */
 H5HF_hdr_t *
-H5HF_hdr_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC_protect_t rw)
+H5HF_hdr_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, unsigned flags)
 {
     H5HF_hdr_cache_ud_t cache_udata;    /* User-data for callback */
     H5HF_hdr_t *hdr;                    /* Fractal heap header */
-    H5HF_hdr_t *ret_value;              /* Return value */
+    H5HF_hdr_t *ret_value = NULL;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -541,12 +542,15 @@ H5HF_hdr_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC_protect_t rw)
     HDassert(f);
     HDassert(H5F_addr_defined(addr));
 
+    /* only H5AC__READ_ONLY_FLAG may appear in flags */
+    HDassert((flags & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
     /* Set up userdata for protect call */
     cache_udata.f = f;
     cache_udata.dxpl_id = dxpl_id;
 
     /* Lock the heap header into memory */
-    if(NULL == (hdr = (H5HF_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_FHEAP_HDR, addr, &cache_udata, rw)))
+    if(NULL == (hdr = (H5HF_hdr_t *)H5AC_protect(f, dxpl_id, H5AC_FHEAP_HDR, addr, &cache_udata, flags)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to protect fractal heap header")
 
     /* Set the header's address */
@@ -760,7 +764,7 @@ H5HF_hdr_adj_free(H5HF_hdr_t *hdr, ssize_t amt)
 
     /* Update heap header */
     HDassert(amt > 0 || hdr->total_man_free >= (hsize_t)-amt);
-    hdr->total_man_free += amt;
+    hdr->total_man_free = (hsize_t)((hssize_t)hdr->total_man_free + amt);
 
     /* Mark heap header as modified */
     if(H5HF_hdr_dirty(hdr) < 0)
@@ -800,7 +804,8 @@ H5HF_hdr_adjust_heap(H5HF_hdr_t *hdr, hsize_t new_size, hssize_t extra_free)
     hdr->man_size = new_size;
 
     /* Adjust the free space in direct blocks */
-    hdr->total_man_free += extra_free;
+    HDassert(extra_free > 0 || hdr->total_man_free >= (hsize_t)-extra_free);
+    hdr->total_man_free = (hsize_t)((hssize_t)hdr->total_man_free + extra_free);
 
     /* Mark heap header as modified */
     if(H5HF_hdr_dirty(hdr) < 0)
@@ -1109,7 +1114,7 @@ H5HF_hdr_update_iter(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t min_dblock_size)
                         HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "can't allocate fractal heap indirect block")
 
                     /* Lock new indirect block */
-                    if(NULL == (new_iblock = H5HF_man_iblock_protect(hdr, dxpl_id, new_iblock_addr, child_nrows, iblock, next_entry, FALSE, H5AC_WRITE, &did_protect)))
+                    if(NULL == (new_iblock = H5HF_man_iblock_protect(hdr, dxpl_id, new_iblock_addr, child_nrows, iblock, next_entry, FALSE, H5AC__NO_FLAGS_SET, &did_protect)))
                         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block")
 
                     /* Move iterator down one level (pins indirect block) */
@@ -1242,7 +1247,7 @@ H5HF_hdr_reverse_iter(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t dblock_addr)
 
         /* Walk backwards through entries, until we find one that has a child */
         /* (Skip direct block that will be deleted, if we find it) */
-        tmp_entry = curr_entry;
+        tmp_entry = (int)curr_entry;
         while(tmp_entry >= 0 &&
                 (H5F_addr_eq(iblock->ents[tmp_entry].addr, dblock_addr) ||
                     !H5F_addr_defined(iblock->ents[tmp_entry].addr)))
@@ -1277,7 +1282,7 @@ H5HF_hdr_reverse_iter(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t dblock_addr)
         else {
             unsigned row;           /* Row for entry */
 
-            curr_entry = tmp_entry;
+            curr_entry = (unsigned)tmp_entry;
 
             /* Check if entry is for a direct block */
             row = curr_entry / hdr->man_dtable.cparam.width;
@@ -1303,7 +1308,7 @@ H5HF_hdr_reverse_iter(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t dblock_addr)
                 child_nrows = H5HF_dtable_size_to_rows(&hdr->man_dtable, hdr->man_dtable.row_block_size[row]);
 
                 /* Lock child indirect block */
-                if(NULL == (child_iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock->ents[curr_entry].addr, child_nrows, iblock, curr_entry, FALSE, H5AC_WRITE, &did_protect)))
+                if(NULL == (child_iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock->ents[curr_entry].addr, child_nrows, iblock, curr_entry, FALSE, H5AC__NO_FLAGS_SET, &did_protect)))
                     HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block")
 
                 /* Set the current location of the iterator */
diff --git a/src/H5HFhuge.c b/src/H5HFhuge.c
index 7f0da02..2b01a74 100644
--- a/src/H5HFhuge.c
+++ b/src/H5HFhuge.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+#include "H5HFmodule.h"         /* This source code file is part of the H5HF module */
 
 
 /***********/
@@ -124,31 +124,31 @@ H5HF_huge_bt2_create(H5HF_hdr_t *hdr, hid_t dxpl_id)
      */
     if(hdr->huge_ids_direct) {
         if(hdr->filter_len > 0) {
-            bt2_cparam.rrec_size = (size_t)(hdr->sizeof_addr    /* Address of object */
-                + hdr->sizeof_size          /* Length of object */
-                + 4                         /* Filter mask for filtered object */
-                + hdr->sizeof_size);        /* Size of de-filtered object in memory */
+            bt2_cparam.rrec_size = (size_t)((unsigned)hdr->sizeof_addr    /* Address of object */
+                + (unsigned)hdr->sizeof_size    /* Length of object */
+                + (unsigned)4                   /* Filter mask for filtered object */
+                + (unsigned)hdr->sizeof_size);  /* Size of de-filtered object in memory */
             bt2_cparam.cls = H5HF_HUGE_BT2_FILT_DIR;
         } /* end if */
         else {
-            bt2_cparam.rrec_size = (size_t)(hdr->sizeof_addr    /* Address of object */
-                + hdr->sizeof_size);         /* Length of object */
+            bt2_cparam.rrec_size = (size_t)((unsigned)hdr->sizeof_addr    /* Address of object */
+                + (unsigned)hdr->sizeof_size);  /* Length of object */
             bt2_cparam.cls = H5HF_HUGE_BT2_DIR;
         } /* end else */
     } /* end if */
     else {
         if(hdr->filter_len > 0) {
-            bt2_cparam.rrec_size = (size_t)(hdr->sizeof_addr    /* Address of filtered object */
-                + hdr->sizeof_size          /* Length of filtered object */
-                + 4                         /* Filter mask for filtered object */
-                + hdr->sizeof_size          /* Size of de-filtered object in memory */
-                + hdr->sizeof_size);        /* Unique ID for object */
+            bt2_cparam.rrec_size = (size_t)((unsigned)hdr->sizeof_addr    /* Address of filtered object */
+                + (unsigned)hdr->sizeof_size    /* Length of filtered object */
+                + (unsigned)4                   /* Filter mask for filtered object */
+                + (unsigned)hdr->sizeof_size    /* Size of de-filtered object in memory */
+                + (unsigned)hdr->sizeof_size);  /* Unique ID for object */
             bt2_cparam.cls = H5HF_HUGE_BT2_FILT_INDIR;
         } /* end if */
         else {
-            bt2_cparam.rrec_size = (size_t)(hdr->sizeof_addr    /* Address of object */
-                + hdr->sizeof_size          /* Length of object */
-                + hdr->sizeof_size);        /* Unique ID for object */
+            bt2_cparam.rrec_size = (size_t)((unsigned)hdr->sizeof_addr    /* Address of object */
+                + (unsigned)hdr->sizeof_size    /* Length of object */
+                + (unsigned)hdr->sizeof_size);  /* Unique ID for object */
             bt2_cparam.cls = H5HF_HUGE_BT2_INDIR;
         } /* end else */
     } /* end else */
@@ -261,7 +261,7 @@ static hsize_t
 H5HF_huge_new_id(H5HF_hdr_t *hdr)
 {
     hsize_t new_id;             /* New object's ID */
-    hsize_t ret_value;          /* Return value */
+    hsize_t ret_value = 0;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -557,7 +557,7 @@ H5HF_huge_get_obj_len(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
             UINT64DECODE_VAR(id, search_rec.id, hdr->huge_id_size)
 
             /* Look up object in v2 B-tree */
-            if(H5B2_find(hdr->huge_bt2, dxpl_id, &search_rec, H5HF_huge_bt2_filt_indir_found, &found_rec) != TRUE)
+            if(H5B2_find(hdr->huge_bt2, dxpl_id, &search_rec, H5HF__huge_bt2_filt_indir_found, &found_rec) != TRUE)
                 HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "can't find object in B-tree")
 
             /* Retrieve the object's length */
@@ -571,7 +571,7 @@ H5HF_huge_get_obj_len(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
             UINT64DECODE_VAR(id, search_rec.id, hdr->huge_id_size)
 
             /* Look up object in v2 B-tree */
-            if(H5B2_find(hdr->huge_bt2, dxpl_id, &search_rec, H5HF_huge_bt2_indir_found, &found_rec) != TRUE)
+            if(H5B2_find(hdr->huge_bt2, dxpl_id, &search_rec, H5HF__huge_bt2_indir_found, &found_rec) != TRUE)
                 HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "can't find object in B-tree")
 
             /* Retrieve the object's length */
@@ -585,6 +585,93 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5HF__huge_get_obj_off
+ *
+ * Purpose:	Get the offset of a 'huge' object in a fractal heap
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug  8 2006
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF__huge_get_obj_off(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
+    hsize_t *obj_off_p)
+{
+    haddr_t obj_addr;                   /* Object's address in the file */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(H5F_addr_defined(hdr->huge_bt2_addr));
+    HDassert(id);
+    HDassert(obj_off_p);
+
+    /* Skip over the flag byte */
+    id++;
+
+    /* Check if 'huge' object ID encodes address & length directly */
+    if(hdr->huge_ids_direct) {
+        /* Retrieve the object's address (common) */
+        H5F_addr_decode(hdr->f, &id, &obj_addr);
+    } /* end if */
+    else {
+        /* Sanity check */
+        HDassert(H5F_addr_defined(hdr->huge_bt2_addr));
+
+        /* Check if v2 B-tree is open yet */
+        if(NULL == hdr->huge_bt2) {
+            /* Open existing v2 B-tree */
+            if(NULL == (hdr->huge_bt2 = H5B2_open(hdr->f, dxpl_id, hdr->huge_bt2_addr, hdr->f)))
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for tracking 'huge' heap objects")
+        } /* end if */
+
+        if(hdr->filter_len > 0) {
+            H5HF_huge_bt2_filt_indir_rec_t found_rec;  /* Record found from tracking object */
+            H5HF_huge_bt2_filt_indir_rec_t search_rec; /* Record for searching for object */
+
+            /* Get ID for looking up 'huge' object in v2 B-tree */
+            UINT64DECODE_VAR(id, search_rec.id, hdr->huge_id_size)
+
+            /* Look up object in v2 B-tree */
+            if(H5B2_find(hdr->huge_bt2, dxpl_id, &search_rec, H5HF__huge_bt2_filt_indir_found, &found_rec) != TRUE)
+                HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "can't find object in B-tree")
+
+            /* Retrieve the object's address & length */
+            obj_addr = found_rec.addr;
+        } /* end if */
+        else {
+            H5HF_huge_bt2_indir_rec_t found_rec;  /* Record found from tracking object */
+            H5HF_huge_bt2_indir_rec_t search_rec; /* Record for searching for object */
+
+            /* Get ID for looking up 'huge' object in v2 B-tree */
+            UINT64DECODE_VAR(id, search_rec.id, hdr->huge_id_size)
+
+            /* Look up object in v2 B-tree */
+            if(H5B2_find(hdr->huge_bt2, dxpl_id, &search_rec, H5HF__huge_bt2_indir_found, &found_rec) != TRUE)
+                HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "can't find object in B-tree")
+
+            /* Retrieve the object's address & length */
+            obj_addr = found_rec.addr;
+        } /* end else */
+    } /* end else */
+
+    /* Set the value to return */
+    *obj_off_p = (hsize_t)obj_addr;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HF__huge_get_obj_off() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5HF_huge_op_real
  *
  * Purpose:	Internal routine to perform an operation on a 'huge' object
@@ -648,7 +735,7 @@ H5HF_huge_op_real(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
             UINT64DECODE_VAR(id, search_rec.id, hdr->huge_id_size)
 
             /* Look up object in v2 B-tree */
-            if(H5B2_find(hdr->huge_bt2, dxpl_id, &search_rec, H5HF_huge_bt2_filt_indir_found, &found_rec) != TRUE)
+            if(H5B2_find(hdr->huge_bt2, dxpl_id, &search_rec, H5HF__huge_bt2_filt_indir_found, &found_rec) != TRUE)
                 HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "can't find object in B-tree")
 
             /* Retrieve the object's address & length */
@@ -664,7 +751,7 @@ H5HF_huge_op_real(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
             UINT64DECODE_VAR(id, search_rec.id, hdr->huge_id_size)
 
             /* Look up object in v2 B-tree */
-            if(H5B2_find(hdr->huge_bt2, dxpl_id, &search_rec, H5HF_huge_bt2_indir_found, &found_rec) != TRUE)
+            if(H5B2_find(hdr->huge_bt2, dxpl_id, &search_rec, H5HF__huge_bt2_indir_found, &found_rec) != TRUE)
                 HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "can't find object in B-tree")
 
             /* Retrieve the object's address & length */
@@ -792,7 +879,7 @@ H5HF_huge_write(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
         UINT64DECODE_VAR(id, search_rec.id, hdr->huge_id_size)
 
         /* Look up object in v2 B-tree */
-        if(H5B2_find(hdr->huge_bt2, dxpl_id, &search_rec, H5HF_huge_bt2_indir_found, &found_rec) != TRUE)
+        if(H5B2_find(hdr->huge_bt2, dxpl_id, &search_rec, H5HF__huge_bt2_indir_found, &found_rec) != TRUE)
             HGOTO_ERROR(H5E_HEAP, H5E_NOTFOUND, FAIL, "can't find object in B-tree")
 
         /* Retrieve the object's address & length */
@@ -937,7 +1024,7 @@ H5HF_huge_remove(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id)
 
             /* Remove the record for tracking the 'huge' object from the v2 B-tree */
             /* (space in the file for the object is freed in the 'remove' callback) */
-            if(H5B2_remove(hdr->huge_bt2, dxpl_id, &search_rec, H5HF_huge_bt2_filt_dir_remove, &udata) < 0)
+            if(H5B2_remove(hdr->huge_bt2, dxpl_id, &search_rec, H5HF__huge_bt2_filt_dir_remove, &udata) < 0)
                 HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "can't remove object from B-tree")
         } /* end if */
         else {
@@ -950,7 +1037,7 @@ H5HF_huge_remove(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id)
 
             /* Remove the record for tracking the 'huge' object from the v2 B-tree */
             /* (space in the file for the object is freed in the 'remove' callback) */
-            if(H5B2_remove(hdr->huge_bt2, dxpl_id, &search_rec, H5HF_huge_bt2_dir_remove, &udata) < 0)
+            if(H5B2_remove(hdr->huge_bt2, dxpl_id, &search_rec, H5HF__huge_bt2_dir_remove, &udata) < 0)
                 HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "can't remove object from B-tree")
         } /* end else */
     } /* end if */
@@ -963,7 +1050,7 @@ H5HF_huge_remove(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id)
 
             /* Remove the record for tracking the 'huge' object from the v2 B-tree */
             /* (space in the file for the object is freed in the 'remove' callback) */
-            if(H5B2_remove(hdr->huge_bt2, dxpl_id, &search_rec, H5HF_huge_bt2_filt_indir_remove, &udata) < 0)
+            if(H5B2_remove(hdr->huge_bt2, dxpl_id, &search_rec, H5HF__huge_bt2_filt_indir_remove, &udata) < 0)
                 HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "can't remove object from B-tree")
         } /* end if */
         else {
@@ -974,7 +1061,7 @@ H5HF_huge_remove(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id)
 
             /* Remove the record for tracking the 'huge' object from the v2 B-tree */
             /* (space in the file for the object is freed in the 'remove' callback) */
-            if(H5B2_remove(hdr->huge_bt2, dxpl_id, &search_rec, H5HF_huge_bt2_indir_remove, &udata) < 0)
+            if(H5B2_remove(hdr->huge_bt2, dxpl_id, &search_rec, H5HF__huge_bt2_indir_remove, &udata) < 0)
                 HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "can't remove object from B-tree")
         } /* end else */
     } /* end else */
@@ -1034,7 +1121,7 @@ H5HF_huge_term(H5HF_hdr_t *hdr, hid_t dxpl_id)
     if(H5F_addr_defined(hdr->huge_bt2_addr) && hdr->huge_nobjs == 0) {
         /* Sanity check */
         HDassert(hdr->huge_size == 0);
-
+        
         /* Delete the v2 B-tree */
         /* (any v2 B-tree class will work here) */
         if(H5B2_delete(hdr->f, dxpl_id, hdr->huge_bt2_addr, hdr->f, NULL, NULL) < 0)
@@ -1093,15 +1180,15 @@ H5HF_huge_delete(H5HF_hdr_t *hdr, hid_t dxpl_id)
     /* Set the v2 B-tree callback operator */
     if(hdr->huge_ids_direct) {
         if(hdr->filter_len > 0)
-            op = H5HF_huge_bt2_filt_dir_remove;
+            op = H5HF__huge_bt2_filt_dir_remove;
         else
-            op = H5HF_huge_bt2_dir_remove;
+            op = H5HF__huge_bt2_dir_remove;
     } /* end if */
     else {
         if(hdr->filter_len > 0)
-            op = H5HF_huge_bt2_filt_indir_remove;
+            op = H5HF__huge_bt2_filt_indir_remove;
         else
-            op = H5HF_huge_bt2_indir_remove;
+            op = H5HF__huge_bt2_indir_remove;
     } /* end else */
 
     /* Delete the v2 B-tree */
diff --git a/src/H5HFiblock.c b/src/H5HFiblock.c
index c989bfc..f3ec78f 100644
--- a/src/H5HFiblock.c
+++ b/src/H5HFiblock.c
@@ -28,7 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+#include "H5HFmodule.h"         /* This source code file is part of the H5HF module */
+
 
 /***********/
 /* Headers */
@@ -213,7 +214,7 @@ H5HF_iblock_unpin(H5HF_indirect_t *iblock)
             } /* end if */
 
             /* Indicate that the root indirect block is unpinned */
-            iblock->hdr->root_iblock_flags &= ~(H5HF_ROOT_IBLOCK_PINNED);
+            iblock->hdr->root_iblock_flags &= (unsigned)(~(H5HF_ROOT_IBLOCK_PINNED));
         } /* end if */
     } /* end else */
 
@@ -330,8 +331,15 @@ H5HF_iblock_decr(H5HF_indirect_t *iblock)
 
 	/* Check for expunging the indirect block from the metadata cache */
 	if(expunge_iblock) {
-            /* Evict the indirect block from the metadata cache */
-            if(H5AC_expunge_entry(hdr->f, H5AC_dxpl_id, H5AC_FHEAP_IBLOCK, iblock_addr, H5AC__FREE_FILE_SPACE_FLAG) < 0)
+            unsigned cache_flags = H5AC__NO_FLAGS_SET;
+
+            /* if the indirect block is in real file space, tell 
+             * the cache to free its file space.
+             */
+            if (!H5F_IS_TMP_ADDR(hdr->f, iblock_addr))
+                cache_flags |= H5AC__FREE_FILE_SPACE_FLAG;
+
+            if(H5AC_expunge_entry(hdr->f, H5AC_dxpl_id, H5AC_FHEAP_IBLOCK, iblock_addr, cache_flags) < 0)
                 HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "unable to remove indirect block from cache")
         } /* end if */
     } /* end if */
@@ -424,7 +432,7 @@ H5HF_man_iblock_root_create(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t min_dblock_si
     /* Move current direct block (used as root) into new indirect block */
 
     /* Lock new indirect block */
-    if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, nrows, NULL, 0, FALSE, H5AC_WRITE, &did_protect)))
+    if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, nrows, NULL, 0, FALSE, H5AC__NO_FLAGS_SET, &did_protect)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block")
 
     /* Check if there's already a direct block as root) */
@@ -433,12 +441,25 @@ H5HF_man_iblock_root_create(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t min_dblock_si
         H5HF_direct_t *dblock;          /* Pointer to direct block to query */
 
         /* Lock first (root) direct block */
-        if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, hdr->man_dtable.table_addr, hdr->man_dtable.cparam.start_block_size, NULL, 0, H5AC_WRITE)))
+        if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, hdr->man_dtable.table_addr, hdr->man_dtable.cparam.start_block_size, NULL, 0, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap direct block")
 
         /* Attach direct block to new root indirect block */
         dblock->parent = iblock;
+        dblock->fd_parent = iblock;
         dblock->par_entry = 0;
+
+	/* destroy flush dependency between direct block and header */
+	if(H5AC_destroy_flush_dependency(dblock->hdr, dblock) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTUNDEPEND, FAIL, \
+                        "unable to destroy flush dependency")
+
+	/* create flush dependency between direct block and new root indirect block */
+	if(H5AC_create_flush_dependency(dblock->parent, dblock) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTDEPEND, FAIL, \
+		        "unable to create flush dependency")
+
+
         if(H5HF_man_iblock_attach(iblock, 0, hdr->man_dtable.table_addr) < 0)
             HGOTO_ERROR(H5E_HEAP, H5E_CANTATTACH, FAIL, "can't attach root direct block to parent indirect block")
 
@@ -628,7 +649,7 @@ H5HF_man_iblock_root_double(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t min_dblock_si
     /* Initialize new direct block entries in rows added */
     acc_dblock_free = 0;
     for(u = (old_nrows * hdr->man_dtable.cparam.width); u < (iblock->nrows * hdr->man_dtable.cparam.width); u++) {
-        unsigned row = u / hdr->man_dtable.cparam.width;        /* Row for current entry */
+        unsigned row = (unsigned)(u / hdr->man_dtable.cparam.width);        /* Row for current entry */
 
         iblock->ents[u].addr = HADDR_UNDEF;
         acc_dblock_free += hdr->man_dtable.row_tot_dblock_free[row];
@@ -730,7 +751,7 @@ H5HF_man_iblock_root_halve(H5HF_indirect_t *iblock, hid_t dxpl_id)
     max_child_row = iblock->max_child / hdr->man_dtable.cparam.width;
 
     /* Compute new # of rows in root indirect block */
-    new_nrows = 1 << (1 + H5VM_log2_gen((uint64_t)max_child_row));
+    new_nrows = (unsigned)1 << (1 + H5VM_log2_gen((uint64_t)max_child_row));
 
     /* Check if the indirect block is NOT currently allocated in temp. file space */
     /* (temp. file space does not need to be freed) */
@@ -866,7 +887,7 @@ H5HF_man_iblock_root_revert(H5HF_indirect_t *root_iblock, hid_t dxpl_id)
     dblock_size = hdr->man_dtable.cparam.start_block_size;
 
     /* Get pointer to last direct block */
-    if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, root_iblock, 0, H5AC_WRITE)))
+    if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, root_iblock, 0, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap direct block")
     HDassert(dblock->parent == root_iblock);
     HDassert(dblock->par_entry == 0);
@@ -884,6 +905,19 @@ H5HF_man_iblock_root_revert(H5HF_indirect_t *root_iblock, hid_t dxpl_id)
     dblock->parent = NULL;
     dblock->par_entry = 0;
 
+    /* destroy flush dependency between old root iblock and new root direct block*/
+    if(H5AC_destroy_flush_dependency(dblock->fd_parent, dblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTUNDEPEND, FAIL, \
+                    "unable to destroy flush dependency")
+
+
+    /* create flush dependency between header and new root direct block */
+    if(H5AC_create_flush_dependency(dblock->hdr, dblock) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDEPEND, FAIL, \
+                    "unable to create flush dependency")
+
+    dblock->fd_parent = NULL;
+
     /* Point root at direct block */
     hdr->man_dtable.curr_root_rows = 0;
     hdr->man_dtable.table_addr = dblock_addr;
@@ -1078,6 +1112,12 @@ H5HF_man_iblock_create(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_indirect_t *par_iblo
 
     /* Attach to parent indirect block, if there is one */
     iblock->parent = par_iblock;
+    iblock->fd_parent = par_iblock; /* this copy of the parent pointer is */
+				    /* needed by the notify callback so   */
+				    /* that it can take down flush        */
+				    /* dependencies on eviction even if   */
+				    /* the parent pointer has been nulled */
+				    /* out.		JRM -- 5/18/14    */
     iblock->par_entry = par_entry;
     if(iblock->parent) {
         /* Attach new block to parent */
@@ -1127,12 +1167,12 @@ done:
 H5HF_indirect_t *
 H5HF_man_iblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t iblock_addr,
     unsigned iblock_nrows, H5HF_indirect_t *par_iblock, unsigned par_entry,
-    hbool_t must_protect, H5AC_protect_t rw, hbool_t *did_protect)
+    hbool_t must_protect, unsigned flags, hbool_t *did_protect)
 {
     H5HF_parent_t par_info;             /* Parent info for loading block */
     H5HF_indirect_t *iblock = NULL;     /* Indirect block from cache */
     hbool_t should_protect = FALSE;     /* Whether we should protect the indirect block or not */
-    H5HF_indirect_t *ret_value;         /* Return value */
+    H5HF_indirect_t *ret_value = NULL;  /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1144,6 +1184,9 @@ H5HF_man_iblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t iblock_addr,
     HDassert(iblock_nrows > 0);
     HDassert(did_protect);
 
+    /* only H5AC__READ_ONLY_FLAG may appear in flags */
+    HDassert((flags & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
     /* Check if we are allowed to use existing pinned iblock pointer */
     if(!must_protect) {
         /* Check for this block already being pinned */
@@ -1203,7 +1246,7 @@ H5HF_man_iblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t iblock_addr,
         cache_udata.nrows = &iblock_nrows;
 
         /* Protect the indirect block */
-        if(NULL == (iblock = (H5HF_indirect_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_FHEAP_IBLOCK, iblock_addr, &cache_udata, rw)))
+        if(NULL == (iblock = (H5HF_indirect_t *)H5AC_protect(hdr->f, dxpl_id, H5AC_FHEAP_IBLOCK, iblock_addr, &cache_udata, flags)))
             HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to protect fractal heap indirect block")
 
         /* Set the indirect block's address */
@@ -1280,7 +1323,7 @@ H5HF_man_iblock_unprotect(H5HF_indirect_t *iblock, hid_t dxpl_id,
             } /* end if */
 
             /* Indicate that the root indirect block is unprotected */
-            iblock->hdr->root_iblock_flags &= ~(H5HF_ROOT_IBLOCK_PROTECTED);
+            iblock->hdr->root_iblock_flags &= (unsigned)(~(H5HF_ROOT_IBLOCK_PROTECTED));
         } /* end if */
 
         /* Unprotect the indirect block */
@@ -1547,7 +1590,7 @@ H5HF_man_iblock_delete(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t iblock_addr,
     HDassert(iblock_nrows > 0);
 
     /* Lock indirect block */
-    if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, iblock_nrows, par_iblock, par_entry, TRUE, H5AC_WRITE, &did_protect)))
+    if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, iblock_nrows, par_iblock, par_entry, TRUE, H5AC__NO_FLAGS_SET, &did_protect)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block")
     HDassert(iblock->nchildren > 0);
     HDassert(did_protect == TRUE);
@@ -1605,8 +1648,14 @@ H5HF_man_iblock_delete(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t iblock_addr,
 }
 #endif /* NDEBUG */
 
-    /* Indicate that the indirect block should be deleted & file space freed */
-    cache_flags |= H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+    /* Indicate that the indirect block should be deleted  */
+    cache_flags |= H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG;
+
+    /* If the indirect block is in real file space, tell
+     * the cache to free its file space as well.
+     */
+    if (!H5F_IS_TMP_ADDR(hdr->f, iblock_addr))
+        cache_flags |= H5AC__FREE_FILE_SPACE_FLAG;
 
 done:
     /* Unprotect the indirect block, with appropriate flags */
@@ -1648,7 +1697,7 @@ H5HF_man_iblock_size(H5F_t *f, hid_t dxpl_id, H5HF_hdr_t *hdr, haddr_t iblock_ad
     HDassert(heap_size);
 
     /* Protect the indirect block */
-    if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, nrows, par_iblock, par_entry, FALSE, H5AC_READ, &did_protect)))
+    if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, nrows, par_iblock, par_entry, FALSE, H5AC__READ_ONLY_FLAG, &did_protect)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load fractal heap indirect block")
 
     /* Accumulate size of this indirect block */
diff --git a/src/H5HFint.c b/src/H5HFint.c
new file mode 100644
index 0000000..61c357c
--- /dev/null
+++ b/src/H5HFint.c
@@ -0,0 +1,146 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5HFint.c
+ *              Fall 2012
+ *              Dana Robinson
+ *
+ * Purpose:     Internal routines for fractal heaps.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/**********************/
+/* Module Declaration */
+/**********************/
+
+#include "H5HFmodule.h"         /* This source code file is part of the H5HF module */
+
+
+/***********************/
+/* Other Packages Used */
+/***********************/
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"      /* Generic Functions                            */
+#include "H5ACprivate.h"    /* Metadata Cache                               */
+#include "H5Eprivate.h"     /* Error handling                               */
+#include "H5HFpkg.h"        /* Fractal Heaps                                */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HF__create_flush_depend
+ *
+ * Purpose:     Create a flush dependency between two data structure components
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF__create_flush_depend(H5AC_info_t *parent_entry, H5AC_info_t *child_entry)
+{
+    herr_t ret_value = SUCCEED;             /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+    
+    /* Sanity check */
+    HDassert(parent_entry);
+    HDassert(child_entry);
+
+    /* Create a flush dependency between parent and child entry */
+    if(H5AC_create_flush_dependency(parent_entry, child_entry) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5HF__create_flush_depend() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HF__destroy_flush_depend
+ *
+ * Purpose:     Destroy a flush dependency between two data structure components
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Dana Robinson
+ *              Fall 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF__destroy_flush_depend(H5AC_info_t *parent_entry, H5AC_info_t *child_entry)
+{
+    herr_t ret_value = SUCCEED;             /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+    
+    /* Sanity check */
+    HDassert(parent_entry);
+    HDassert(child_entry);
+
+    /* Destroy a flush dependency between parent and child entry */
+    if(H5AC_destroy_flush_dependency(parent_entry, child_entry) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* end H5HF__destroy_flush_depend() */
+
diff --git a/src/H5HFiter.c b/src/H5HFiter.c
index 137d0ee..55a8532 100644
--- a/src/H5HFiter.c
+++ b/src/H5HFiter.c
@@ -28,7 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+#include "H5HFmodule.h"         /* This source code file is part of the H5HF module */
+
 
 /***********/
 /* Headers */
@@ -217,7 +218,7 @@ H5HF_man_iter_start_offset(H5HF_hdr_t *hdr, hid_t dxpl_id,
         } /* end else */
 
         /* Load indirect block for this context location */
-        if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, iblock_nrows, iblock_parent, iblock_par_entry, FALSE, H5AC_WRITE, &did_protect)))
+        if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, iblock_nrows, iblock_parent, iblock_par_entry, FALSE, H5AC__NO_FLAGS_SET, &did_protect)))
             HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block")
 
         /* Make indirect block the context for the current location */
diff --git a/src/H5HFman.c b/src/H5HFman.c
index a2de63c..cff4395 100644
--- a/src/H5HFman.c
+++ b/src/H5HFman.c
@@ -28,7 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+#include "H5HFmodule.h"         /* This source code file is part of the H5HF module */
+
 
 /***********/
 /* Headers */
@@ -157,11 +158,11 @@ H5HF_man_insert(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t obj_size, const void *obj
     HDassert(sec_node->sect_info.state == H5FS_SECT_LIVE);
 
     /* Retrieve direct block address from section */
-    if(H5HF_sect_single_dblock_info(hdr, dxpl_id, sec_node, &dblock_addr, &dblock_size) < 0)
+    if(H5HF_sect_single_dblock_info(hdr, sec_node, &dblock_addr, &dblock_size) < 0)
         HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve direct block information")
 
     /* Lock direct block */
-    if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, sec_node->u.single.parent, sec_node->u.single.par_entry, H5AC_WRITE)))
+    if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, sec_node->u.single.parent, sec_node->u.single.par_entry, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load fractal heap direct block")
 
     /* Insert object into block */
@@ -218,6 +219,79 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5HF_man_get_obj_len
+ *
+ * Purpose:     Get the size of a managed heap object
+ *
+ * Return:      SUCCEED (Can't fail)
+ *
+ * Programmer:  Dana Robinson (derobins at hdfgroup.org)
+ *              August 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HF_man_get_obj_len(H5HF_hdr_t *hdr, const uint8_t *id, size_t *obj_len_p)
+{
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(id);
+    HDassert(obj_len_p);
+    
+    /* Skip over the flag byte */
+    id++;
+
+    /* Skip over object offset */
+    id += hdr->heap_off_size;
+
+    /* Retrieve the entry length */
+    UINT64DECODE_VAR(id, *obj_len_p, hdr->heap_len_size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HF_man_get_obj_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HF__man_get_obj_off
+ *
+ * Purpose:     Get the offset of a managed heap object
+ *
+ * Return:      SUCCEED (Can't fail)
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		Aug 20 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5HF__man_get_obj_off(const H5HF_hdr_t *hdr, const uint8_t *id, hsize_t *obj_off_p)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /*
+     * Check arguments.
+     */
+    HDassert(hdr);
+    HDassert(id);
+    HDassert(obj_off_p);
+    
+    /* Skip over the flag byte */
+    id++;
+
+    /* Skip over object offset */
+    UINT64DECODE_VAR(id, *obj_off_p, hdr->heap_off_size);
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5HF__man_get_obj_off() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5HF_man_op_real
  *
  * Purpose:	Internal routine to perform an operation on a managed heap
@@ -236,7 +310,11 @@ H5HF_man_op_real(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
     H5HF_operator_t op, void *op_data, unsigned op_flags)
 {
     H5HF_direct_t *dblock = NULL;       /* Pointer to direct block to query */
-    H5AC_protect_t dblock_access;       /* Access method for direct block */
+    unsigned dblock_access_flags;       /* Access method for direct block */
+                                        /* must equal either 
+                                         * H5AC__NO_FLAGS_SET or 
+                                         * H5AC__READ_ONLY_FLAG
+                                         */
     haddr_t dblock_addr;                /* Direct block address */
     size_t dblock_size;                 /* Direct block size */
     unsigned dblock_cache_flags;        /* Flags for unprotecting direct block */
@@ -260,11 +338,11 @@ H5HF_man_op_real(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
         /* Check pipeline */
         H5HF_MAN_WRITE_CHECK_PLINE(hdr)
 
-        dblock_access = H5AC_WRITE;
+        dblock_access_flags = H5AC__NO_FLAGS_SET;
         dblock_cache_flags = H5AC__DIRTIED_FLAG;
     } /* end if */
     else {
-        dblock_access = H5AC_READ;
+        dblock_access_flags = H5AC__READ_ONLY_FLAG;
         dblock_cache_flags = H5AC__NO_FLAGS_SET;
     } /* end else */
 
@@ -294,7 +372,7 @@ H5HF_man_op_real(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
         dblock_size = hdr->man_dtable.cparam.start_block_size;
 
         /* Lock direct block */
-        if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, NULL, 0, dblock_access)))
+        if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, NULL, 0, dblock_access_flags)))
             HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap direct block")
     } /* end if */
     else {
@@ -303,7 +381,7 @@ H5HF_man_op_real(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
         unsigned entry;                 /* Entry of block */
 
         /* Look up indirect block containing direct block */
-        if(H5HF_man_dblock_locate(hdr, dxpl_id, obj_off, &iblock, &entry, &did_protect, H5AC_READ) < 0)
+        if(H5HF_man_dblock_locate(hdr, dxpl_id, obj_off, &iblock, &entry, &did_protect, H5AC__READ_ONLY_FLAG) < 0)
             HGOTO_ERROR(H5E_HEAP, H5E_CANTCOMPUTE, FAIL, "can't compute row & column of section")
 
         /* Set direct block info */
@@ -321,7 +399,7 @@ H5HF_man_op_real(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
         } /* end if */
 
         /* Lock direct block */
-        if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, iblock, entry, dblock_access))) {
+        if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, iblock, entry, dblock_access_flags))) {
             /* Unlock indirect block */
             if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0)
                 HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block")
@@ -540,7 +618,7 @@ H5HF_man_remove(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id)
     } /* end if */
     else {
         /* Look up indirect block containing direct block */
-        if(H5HF_man_dblock_locate(hdr, dxpl_id, obj_off, &iblock, &dblock_entry, &did_protect, H5AC_WRITE) < 0)
+        if(H5HF_man_dblock_locate(hdr, dxpl_id, obj_off, &iblock, &dblock_entry, &did_protect, H5AC__NO_FLAGS_SET) < 0)
             HGOTO_ERROR(H5E_HEAP, H5E_CANTCOMPUTE, FAIL, "can't compute row & column of section")
 
         /* Check for offset of invalid direct block */
diff --git a/src/H5HFmodule.h b/src/H5HFmodule.h
new file mode 100644
index 0000000..e3274ce
--- /dev/null
+++ b/src/H5HFmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5HF package.  Including this header means that the source file
+ *		is part of the H5HF package.
+ */
+#ifndef _H5HFmodule_H
+#define _H5HFmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5HF_MODULE
+#define H5_MY_PKG       H5HF
+#define H5_MY_PKG_ERR   H5E_HEAP
+#define H5_MY_PKG_INIT  NO
+
+#endif /* _H5HFmodule_H */
+
diff --git a/src/H5HFpkg.h b/src/H5HFpkg.h
index 9c9c34c..15b62e2 100644
--- a/src/H5HFpkg.h
+++ b/src/H5HFpkg.h
@@ -21,7 +21,7 @@
  *		the H5HF package.  Source files outside the H5HF package should
  *		include H5HFprivate.h instead.
  */
-#ifndef H5HF_PACKAGE
+#if !(defined H5HF_FRIEND || defined H5HF_MODULE)
 #error "Do not include this file outside the H5HF package!"
 #endif
 
@@ -48,19 +48,19 @@
 /* "Standard" size of prefix information for fractal heap metadata */
 #define H5HF_METADATA_PREFIX_SIZE(c) (                                        \
     H5_SIZEOF_MAGIC   /* Signature */                                         \
-    + 1 /* Version */                                                         \
-    + ((c) ? H5HF_SIZEOF_CHKSUM : 0) /* Metadata checksum */                  \
+    + (unsigned)1 /* Version */                                               \
+    + ((c) ? (unsigned)H5HF_SIZEOF_CHKSUM : (unsigned)0) /* Metadata checksum */ \
     )
 
 /* Size of doubling-table information */
 #define H5HF_DTABLE_INFO_SIZE(h) (                                            \
-    2   /* Width of table (i.e. # of columns) */                              \
-    + (h)->sizeof_size /* Starting block size */                              \
-    + (h)->sizeof_size /* Maximum direct block size */                        \
-    + 2 /* Max. size of heap (log2 of actual value - i.e. the # of bits) */   \
-    + 2 /* Starting # of rows in root indirect block */                       \
-    + (h)->sizeof_addr /* File address of table managed */                    \
-    + 2 /* Current # of rows in root indirect block */                        \
+    (unsigned)2   /* Width of table (i.e. # of columns) */                    \
+    + (unsigned)(h)->sizeof_size /* Starting block size */                    \
+    + (unsigned)(h)->sizeof_size /* Maximum direct block size */              \
+    + (unsigned)2 /* Max. size of heap (log2 of actual value - i.e. the # of bits) */   \
+    + (unsigned)2 /* Starting # of rows in root indirect block */             \
+    + (unsigned)(h)->sizeof_addr /* File address of table managed */          \
+    + (unsigned)2 /* Current # of rows in root indirect block */              \
     )
 
 /* Flags for status byte */
@@ -78,28 +78,28 @@
     /* Fractal Heap Header specific fields */                                 \
                                                                               \
     /* General heap information */                                            \
-    + 2 /* Heap ID len */                                                     \
-    + 2 /* I/O filters' encoded len */                                        \
-    + 1 /* Status flags */                                                    \
+    + (unsigned)2 /* Heap ID len */                                           \
+    + (unsigned)2 /* I/O filters' encoded len */                              \
+    + (unsigned)1 /* Status flags */                                          \
                                                                               \
     /* "Huge" object fields */                                                \
-    + 4 /* Max. size of "managed" object */                                   \
-    + (h)->sizeof_size /* Next ID for "huge" object */                        \
-    + (h)->sizeof_addr /* File address of "huge" object tracker B-tree  */    \
+    + (unsigned)4 /* Max. size of "managed" object */                         \
+    + (unsigned)(h)->sizeof_size /* Next ID for "huge" object */              \
+    + (unsigned)(h)->sizeof_addr /* File address of "huge" object tracker B-tree  */    \
                                                                               \
     /* "Managed" object free space fields */                                  \
-    + (h)->sizeof_size /* Total man. free space */                            \
-    + (h)->sizeof_addr /* File address of free section header */              \
+    + (unsigned)(h)->sizeof_size /* Total man. free space */                  \
+    + (unsigned)(h)->sizeof_addr /* File address of free section header */    \
                                                                               \
     /* Statistics fields */                                                   \
-    + (h)->sizeof_size /* Size of man. space in heap */                       \
-    + (h)->sizeof_size /* Size of man. space iterator offset in heap */       \
-    + (h)->sizeof_size /* Size of alloacted man. space in heap */             \
-    + (h)->sizeof_size /* Number of man. objects in heap */                   \
-    + (h)->sizeof_size /* Size of huge space in heap */                       \
-    + (h)->sizeof_size /* Number of huge objects in heap */                   \
-    + (h)->sizeof_size /* Size of tiny space in heap */                       \
-    + (h)->sizeof_size /* Number of tiny objects in heap */                   \
+    + (unsigned)(h)->sizeof_size /* Size of man. space in heap */             \
+    + (unsigned)(h)->sizeof_size /* Size of man. space iterator offset in heap */ \
+    + (unsigned)(h)->sizeof_size /* Size of alloacted man. space in heap */   \
+    + (unsigned)(h)->sizeof_size /* Number of man. objects in heap */         \
+    + (unsigned)(h)->sizeof_size /* Size of huge space in heap */             \
+    + (unsigned)(h)->sizeof_size /* Number of huge objects in heap */         \
+    + (unsigned)(h)->sizeof_size /* Size of tiny space in heap */             \
+    + (unsigned)(h)->sizeof_size /* Number of tiny objects in heap */         \
                                                                               \
     /* "Managed" object doubling table info */                                \
     + H5HF_DTABLE_INFO_SIZE(h) /* Size of managed obj. doubling-table info */ \
@@ -111,15 +111,15 @@
     H5HF_METADATA_PREFIX_SIZE(h->checksum_dblocks)                            \
                                                                               \
     /* Fractal heap managed, absolutely mapped direct block specific fields */ \
-    + (h)->sizeof_addr          /* File address of heap owning the block */   \
-    + (h)->heap_off_size        /* Offset of the block in the heap */         \
+    + (unsigned)(h)->sizeof_addr          /* File address of heap owning the block */ \
+    + (unsigned)(h)->heap_off_size        /* Offset of the block in the heap */ \
     )
 
 /* Size of managed indirect block entry for a child direct block */
 #define H5HF_MAN_INDIRECT_CHILD_DIR_ENTRY_SIZE(h) (                           \
     ((h)->filter_len > 0 ?                                                    \
-        ((h)->sizeof_addr + (h)->sizeof_size + 4) : /* Size of entries for filtered direct blocks */ \
-        (h)->sizeof_addr)             /* Size of entries for un-filtered direct blocks */ \
+        ((unsigned)(h)->sizeof_addr + (unsigned)(h)->sizeof_size + (unsigned)4) : /* Size of entries for filtered direct blocks */ \
+        (unsigned)(h)->sizeof_addr)             /* Size of entries for un-filtered direct blocks */ \
     )
 
 /* Size of managed indirect block */
@@ -128,8 +128,8 @@
     H5HF_METADATA_PREFIX_SIZE(TRUE)                                           \
                                                                               \
     /* Fractal heap managed, absolutely mapped indirect block specific fields */ \
-    + (h)->sizeof_addr          /* File address of heap owning the block */   \
-    + (h)->heap_off_size        /* Offset of the block in the heap */         \
+    + (unsigned)(h)->sizeof_addr          /* File address of heap owning the block */   \
+    + (unsigned)(h)->heap_off_size        /* Offset of the block in the heap */         \
     + (MIN(r, (h)->man_dtable.max_direct_rows) * (h)->man_dtable.cparam.width * H5HF_MAN_INDIRECT_CHILD_DIR_ENTRY_SIZE(h)) /* Size of entries for direct blocks */ \
     + (((r > (h)->man_dtable.max_direct_rows) ? (r - (h)->man_dtable.max_direct_rows) : 0)  * (h)->man_dtable.cparam.width * (h)->sizeof_addr) /* Size of entries for indirect blocks */ \
     )
@@ -341,7 +341,7 @@ typedef struct H5HF_hdr_t {
     size_t      rc;             /* Reference count of heap's components using heap header */
     haddr_t     heap_addr;      /* Address of heap header in the file */
     size_t      heap_size;      /* Size of heap header in the file */
-    H5AC_protect_t mode;        /* Access mode for heap */
+    unsigned    mode;           /* Access mode for heap */
     H5F_t      *f;              /* Pointer to file for heap */
     size_t      file_rc;        /* Reference count of files using heap header */
     hbool_t     pending_delete; /* Heap is pending deletion */
@@ -384,6 +384,13 @@ struct H5HF_indirect_t {
     size_t      rc;             /* Reference count of objects using this block */
     H5HF_hdr_t	*hdr;	        /* Shared heap header info	              */
     struct H5HF_indirect_t *parent;	/* Shared parent indirect block info  */
+    struct H5HF_indirect_t 
+		*fd_parent;	/* Saved copy of the parent pointer -- this   */
+				/* necessary as the parent field is sometimes */
+				/* nulled out before the eviction notify call */
+				/* is made from the metadata cache.  Since    */
+				/* this call cancels flush dependencies, it   */
+				/* needs this information.		      */
     unsigned    par_entry;      /* Entry in parent's table                    */
     haddr_t     addr;           /* Address of this indirect block on disk     */
     size_t      size;           /* Size of indirect block on disk             */
@@ -407,11 +414,41 @@ typedef struct H5HF_direct_t {
     /* Internal heap information */
     H5HF_hdr_t	*hdr;	        /* Shared heap header info	              */
     H5HF_indirect_t *parent;	/* Shared parent indirect block info          */
+    H5HF_indirect_t *fd_parent;	/* Saved copy of the parent pointer -- this   */
+				/* necessary as the parent field is sometimes */
+				/* nulled out before the eviction notify call */
+				/* is made from the metadata cache.  Since    */
+				/* this call cancels flush dependencies, it   */
+				/* needs this information.		      */
     unsigned    par_entry;      /* Entry in parent's table                    */
     size_t      size;           /* Size of direct block                       */
     hsize_t     file_size;      /* Size of direct block in file (only valid when block's space is being freed) */
-    unsigned    blk_off_size;   /* Size of offsets in the block               */
     uint8_t     *blk;           /* Pointer to buffer containing block data    */
+    uint8_t	*write_buf;	/* Pointer to buffer containing the block data */
+                                /* in form ready to copy to the metadata       */
+                                /* cache's image buffer.                       */
+                                /*                                             */
+                                /* This field is used by                       */
+                                /* H5HF_cache_dblock_pre_serialize() to pass   */
+                                /* the serialized image of the direct block to */
+                                /* H5HF_cache_dblock_serialize().  It should   */
+                                /* NULL at all other times.                    */
+                                /*                                             */
+                                /* If I/O filters are enabled, the pre-        */
+                                /* the pre-serialize function will allocate    */
+                                /* a buffer, copy the filtered version of the  */
+                                /* direct block image into it, and place the   */
+                                /* base address of the buffer in this field.   */
+                                /* The serialize function must discard this    */
+                                /* buffer after it copies the contents into    */
+                                /* the image buffer provided by the metadata   */
+                                /* cache.                                      */
+                                /*                                             */
+                                /* If I/O filters are not enabled, the         */
+                                /* write_buf field is simply set equal to the  */
+                                /* blk field by the pre-serialize function,    */
+                                /* and back to NULL by the serialize function. */
+    size_t	write_size;     /* size of the buffer pointed to by write_buf. */
 
     /* Stored values */
     hsize_t     block_off;      /* Offset of the block within the heap's address space */
@@ -507,6 +544,14 @@ typedef struct H5HF_dblock_cache_ud_t {
 				 * calls to it.
 				 */
     unsigned filter_mask;	/* Excluded filters for direct block */
+    uint8_t *dblk;		/* Pointer to the buffer containing the decompressed
+ 			         * direct block data obtained in verify_chksum callback.
+				 * It will be used later in deserialize callback.
+				 */
+    htri_t decompressed;	/* Indicate that the direct block has been
+ 				 * decompressed in verify_chksum callback.
+				 * It will be used later in deserialize callback.
+				 */
 } H5HF_dblock_cache_ud_t;
 
 
@@ -571,6 +616,12 @@ H5FL_BLK_EXTERN(direct_block);
 /* Package Private Prototypes */
 /******************************/
 
+/* Generic routines */
+H5_DLL herr_t H5HF__create_flush_depend(H5AC_info_t *parent_entry,
+    H5AC_info_t *child_entry);
+H5_DLL herr_t H5HF__destroy_flush_depend(H5AC_info_t *parent_entry,
+    H5AC_info_t *child_entry);
+
 /* Doubling table routines */
 H5_DLL herr_t H5HF_dtable_init(H5HF_dtable_t *dtable);
 H5_DLL herr_t H5HF_dtable_dest(H5HF_dtable_t *dtable);
@@ -585,7 +636,7 @@ H5_DLL hsize_t H5HF_dtable_span_size(const H5HF_dtable_t *dtable, unsigned start
 H5_DLL H5HF_hdr_t * H5HF_hdr_alloc(H5F_t *f);
 H5_DLL haddr_t H5HF_hdr_create(H5F_t *f, hid_t dxpl_id, const H5HF_create_t *cparam);
 H5_DLL H5HF_hdr_t *H5HF_hdr_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr,
-    H5AC_protect_t rw);
+    unsigned flags);
 H5_DLL herr_t H5HF_hdr_finish_init_phase1(H5HF_hdr_t *hdr);
 H5_DLL herr_t H5HF_hdr_finish_init_phase2(H5HF_hdr_t *hdr);
 H5_DLL herr_t H5HF_hdr_finish_init(H5HF_hdr_t *hdr);
@@ -626,7 +677,7 @@ H5_DLL herr_t H5HF_man_iblock_create(H5HF_hdr_t *hdr, hid_t dxpl_id,
 H5_DLL H5HF_indirect_t *H5HF_man_iblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id,
     haddr_t iblock_addr, unsigned iblock_nrows,
     H5HF_indirect_t *par_iblock, unsigned par_entry, hbool_t must_protect,
-    H5AC_protect_t rw, hbool_t *did_protect);
+    unsigned flags, hbool_t *did_protect);
 H5_DLL herr_t H5HF_man_iblock_unprotect(H5HF_indirect_t *iblock, hid_t dxpl_id,
     unsigned cache_flags, hbool_t did_protect);
 H5_DLL herr_t H5HF_man_iblock_attach(H5HF_indirect_t *iblock, unsigned entry,
@@ -652,10 +703,10 @@ H5_DLL herr_t H5HF_man_dblock_destroy(H5HF_hdr_t *hdr, hid_t dxpl_id,
 H5_DLL H5HF_direct_t *H5HF_man_dblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id,
     haddr_t dblock_addr, size_t dblock_size,
     H5HF_indirect_t *par_iblock, unsigned par_entry,
-    H5AC_protect_t rw);
+    unsigned flags);
 H5_DLL herr_t H5HF_man_dblock_locate(H5HF_hdr_t *hdr, hid_t dxpl_id,
     hsize_t obj_off, H5HF_indirect_t **par_iblock,
-    unsigned *par_entry, hbool_t *par_did_protect, H5AC_protect_t rw);
+    unsigned *par_entry, hbool_t *par_did_protect, unsigned flags);
 H5_DLL herr_t H5HF_man_dblock_delete(H5F_t *f, hid_t dxpl_id, haddr_t dblock_addr,
     hsize_t dblock_size);
 H5_DLL herr_t H5HF_man_dblock_dest(H5HF_direct_t *dblock);
@@ -663,6 +714,10 @@ H5_DLL herr_t H5HF_man_dblock_dest(H5HF_direct_t *dblock);
 /* Managed object routines */
 H5_DLL herr_t H5HF_man_insert(H5HF_hdr_t *fh, hid_t dxpl_id, size_t obj_size,
     const void *obj, void *id);
+H5_DLL herr_t H5HF_man_get_obj_len(H5HF_hdr_t *hdr, const uint8_t *id,
+    size_t *obj_len_p);
+H5_DLL void H5HF__man_get_obj_off(const H5HF_hdr_t *hdr, const uint8_t *id,
+    hsize_t *obj_off_p);
 H5_DLL herr_t H5HF_man_read(H5HF_hdr_t *fh, hid_t dxpl_id, const uint8_t *id,
     void *obj);
 H5_DLL herr_t H5HF_man_write(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
@@ -677,6 +732,8 @@ H5_DLL herr_t H5HF_huge_insert(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t obj_size,
     void *obj, void *id);
 H5_DLL herr_t H5HF_huge_get_obj_len(H5HF_hdr_t *hdr, hid_t dxpl_id,
     const uint8_t *id, size_t *obj_len_p);
+H5_DLL herr_t H5HF__huge_get_obj_off(H5HF_hdr_t *hdr, hid_t dxpl_id,
+    const uint8_t *id, hsize_t *obj_off_p);
 H5_DLL herr_t H5HF_huge_read(H5HF_hdr_t *fh, hid_t dxpl_id, const uint8_t *id,
     void *obj);
 H5_DLL herr_t H5HF_huge_write(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id,
@@ -688,13 +745,13 @@ H5_DLL herr_t H5HF_huge_term(H5HF_hdr_t *hdr, hid_t dxpl_id);
 H5_DLL herr_t H5HF_huge_delete(H5HF_hdr_t *hdr, hid_t dxpl_id);
 
 /* 'Huge' object v2 B-tree function callbacks */
-H5_DLL herr_t H5HF_huge_bt2_indir_found(const void *nrecord, void *op_data);
-H5_DLL herr_t H5HF_huge_bt2_indir_remove(const void *nrecord, void *op_data);
-H5_DLL herr_t H5HF_huge_bt2_filt_indir_found(const void *nrecord, void *op_data);
-H5_DLL herr_t H5HF_huge_bt2_filt_indir_remove(const void *nrecord, void *op_data);
-H5_DLL herr_t H5HF_huge_bt2_dir_remove(const void *nrecord, void *op_data);
-H5_DLL herr_t H5HF_huge_bt2_filt_dir_found(const void *nrecord, void *op_data);
-H5_DLL herr_t H5HF_huge_bt2_filt_dir_remove(const void *nrecord, void *op_data);
+H5_DLL herr_t H5HF__huge_bt2_indir_found(const void *nrecord, void *op_data);
+H5_DLL herr_t H5HF__huge_bt2_indir_remove(const void *nrecord, void *op_data);
+H5_DLL herr_t H5HF__huge_bt2_filt_indir_found(const void *nrecord, void *op_data);
+H5_DLL herr_t H5HF__huge_bt2_filt_indir_remove(const void *nrecord, void *op_data);
+H5_DLL herr_t H5HF__huge_bt2_dir_remove(const void *nrecord, void *op_data);
+H5_DLL herr_t H5HF__huge_bt2_filt_dir_found(const void *nrecord, void *op_data);
+H5_DLL herr_t H5HF__huge_bt2_filt_dir_remove(const void *nrecord, void *op_data);
 
 /* 'Tiny' object routines */
 H5_DLL herr_t H5HF_tiny_init(H5HF_hdr_t *hdr);
@@ -709,7 +766,7 @@ H5_DLL herr_t H5HF_tiny_remove(H5HF_hdr_t *fh, const uint8_t *id);
 
 /* Debugging routines for dumping file structures */
 H5_DLL void H5HF_hdr_print(const H5HF_hdr_t *hdr, hid_t dxpl_id,
-	hbool_t dump_internal, FILE *stream, int indent, int fwidth);
+    hbool_t dump_internal, FILE *stream, int indent, int fwidth);
 H5_DLL herr_t H5HF_hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
     FILE *stream, int indent, int fwidth);
 H5_DLL herr_t H5HF_dblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
@@ -753,14 +810,14 @@ H5_DLL herr_t H5HF_space_remove(H5HF_hdr_t *hdr, hid_t dxpl_id,
 H5_DLL herr_t H5HF_space_close(H5HF_hdr_t *hdr, hid_t dxpl_id);
 H5_DLL herr_t H5HF_space_delete(H5HF_hdr_t *hdr, hid_t dxpl_id);
 H5_DLL herr_t H5HF_space_sect_change_class(H5HF_hdr_t *hdr, hid_t dxpl_id,
-    H5HF_free_section_t *sect, unsigned new_class);
+    H5HF_free_section_t *sect, uint16_t new_class);
 
 /* Free space section routines */
 H5_DLL H5HF_free_section_t *H5HF_sect_single_new(hsize_t sect_off,
     size_t sect_size, H5HF_indirect_t *parent, unsigned par_entry);
 H5_DLL herr_t H5HF_sect_single_revive(H5HF_hdr_t *hdr, hid_t dxpl_id,
     H5HF_free_section_t *sect);
-H5_DLL herr_t H5HF_sect_single_dblock_info(H5HF_hdr_t *hdr, hid_t dxpl_id,
+H5_DLL herr_t H5HF_sect_single_dblock_info(H5HF_hdr_t *hdr,
     H5HF_free_section_t *sect, haddr_t *dblock_addr, size_t *dblock_size);
 H5_DLL herr_t H5HF_sect_single_reduce(H5HF_hdr_t *hdr, hid_t dxpl_id,
     H5HF_free_section_t *sect, size_t amt);
diff --git a/src/H5HFprivate.h b/src/H5HFprivate.h
index 55daa30..c052143 100644
--- a/src/H5HFprivate.h
+++ b/src/H5HFprivate.h
@@ -116,6 +116,8 @@ H5_DLL herr_t H5HF_insert(H5HF_t *fh, hid_t dxpl_id, size_t size,
     const void *obj, void *id/*out*/);
 H5_DLL herr_t H5HF_get_obj_len(H5HF_t *fh, hid_t dxpl_id, const void *id,
     size_t *obj_len_p/*out*/);
+H5_DLL herr_t H5HF_get_obj_off(H5HF_t *fh, hid_t dxpl_id, const void *_id,
+    hsize_t *obj_off_p/*out*/);
 H5_DLL herr_t H5HF_read(H5HF_t *fh, hid_t dxpl_id, const void *id,
     void *obj/*out*/);
 H5_DLL herr_t H5HF_write(H5HF_t *fh, hid_t dxpl_id, void *id, hbool_t *id_changed,
@@ -125,12 +127,16 @@ H5_DLL herr_t H5HF_op(H5HF_t *fh, hid_t dxpl_id, const void *id,
 H5_DLL herr_t H5HF_remove(H5HF_t *fh, hid_t dxpl_id, const void *id);
 H5_DLL herr_t H5HF_close(H5HF_t *fh, hid_t dxpl_id);
 H5_DLL herr_t H5HF_delete(H5F_t *f, hid_t dxpl_id, haddr_t fh_addr);
+H5_DLL herr_t H5HF_depend(H5AC_info_t *parent_entry, H5HF_t *fh);
+H5_DLL herr_t H5HF_undepend(H5AC_info_t *parent_entry, H5HF_t *fh);
 
 /* Statistics routines */
 H5_DLL herr_t H5HF_stat_info(const H5HF_t *fh, H5HF_stat_t *stats);
 H5_DLL herr_t H5HF_size(const H5HF_t *fh, hid_t dxpl_id, hsize_t *heap_size/*out*/);
 
 /* Debugging routines */
+H5_DLL herr_t H5HF_id_print(H5HF_t *fh, hid_t dxpl_id,
+    const void *id, FILE *stream, int indent, int fwidth);
 #ifdef H5HF_DEBUGGING
 H5_DLL herr_t H5HF_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
     FILE *stream, int indent, int fwidth);
diff --git a/src/H5HFsection.c b/src/H5HFsection.c
index 9098f0f..8699827 100644
--- a/src/H5HFsection.c
+++ b/src/H5HFsection.c
@@ -14,10 +14,10 @@
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
- * Programmer:	Quincey Koziol <koziol at ncsa.uiuc.edu>
+ * Programmer:  Quincey Koziol <koziol at hdfgroup.org>
  *              Monday, May  1, 2006
  *
- * Purpose:	Free space section routines for fractal heaps.
+ * Purpose:     Free space section routines for fractal heaps
  *
  */
 
@@ -25,7 +25,8 @@
 /* Module Setup */
 /****************/
 
-#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+#include "H5HFmodule.h"         /* This source code file is part of the H5HF module */
+
 
 /***********/
 /* Headers */
@@ -42,10 +43,10 @@
 
 /* Size of serialized indirect section information */
 #define H5HF_SECT_INDIRECT_SERIAL_SIZE(h) (                                   \
-    (h)->heap_off_size  /* Indirect block's offset in "heap space" */         \
-        + 2             /* Row */                                             \
-        + 2             /* Column */                                          \
-        + 2             /* # of entries */                                    \
+    (unsigned)(h)->heap_off_size  /* Indirect block's offset in "heap space" */         \
+        + (unsigned)2             /* Row */                                             \
+        + (unsigned)2             /* Column */                                          \
+        + (unsigned)2             /* # of entries */                                    \
     )
 
 
@@ -407,8 +408,8 @@ static H5HF_free_section_t *
 H5HF_sect_node_new(unsigned sect_type, haddr_t sect_addr, hsize_t sect_size,
     H5FS_section_state_t sect_state)
 {
-    H5HF_free_section_t *new_sect;      /* New section */
-    H5HF_free_section_t *ret_value;     /* Return value */
+    H5HF_free_section_t *new_sect;              /* New section */
+    H5HF_free_section_t *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -449,7 +450,7 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-herr_t
+static herr_t
 H5HF_sect_node_free(H5HF_free_section_t *sect, H5HF_indirect_t *iblock)
 {
     herr_t ret_value = SUCCEED;               /* Return value */
@@ -489,7 +490,7 @@ H5HF_sect_single_new(hsize_t sect_off, size_t sect_size,
     H5HF_indirect_t *parent, unsigned par_entry)
 {
     H5HF_free_section_t *sect = NULL;   /* 'Single' free space section to add */
-    H5HF_free_section_t *ret_value;     /* Return value */
+    H5HF_free_section_t *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -555,7 +556,7 @@ H5HF_sect_single_locate_parent(H5HF_hdr_t *hdr, hid_t dxpl_id, hbool_t refresh,
     HDassert(sect);
 
     /* Look up indirect block containing direct blocks for range */
-    if(H5HF_man_dblock_locate(hdr, dxpl_id, sect->sect_info.addr, &sec_iblock, &sec_entry, &did_protect, H5AC_READ) < 0)
+    if(H5HF_man_dblock_locate(hdr, dxpl_id, sect->sect_info.addr, &sec_iblock, &sec_entry, &did_protect, H5AC__READ_ONLY_FLAG) < 0)
         HGOTO_ERROR(H5E_HEAP, H5E_CANTCOMPUTE, FAIL, "can't compute row & column of section")
 
     /* Increment reference count on indirect block that free section is in */
@@ -586,15 +587,15 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_sect_single_revive
+ * Function:    H5HF_sect_single_revive
  *
- * Purpose:	Update the memory information for a 'single' free section
+ * Purpose:     Update the memory information for a 'single' free section
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		May  8 2006
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              May  8 2006
  *
  *-------------------------------------------------------------------------
  */
@@ -635,20 +636,20 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_sect_single_dblock_info
+ * Function:    H5HF_sect_single_dblock_info
  *
- * Purpose:	Retrieve the direct block information for a single section
+ * Purpose:     Retrieve the direct block information for a single section
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		October 24 2006
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              October 24 2006
  *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5HF_sect_single_dblock_info(H5HF_hdr_t *hdr, hid_t dxpl_id,
+H5HF_sect_single_dblock_info(H5HF_hdr_t *hdr,
     H5HF_free_section_t *sect, haddr_t *dblock_addr, size_t *dblock_size)
 {
     FUNC_ENTER_NOAPI_NOERR
@@ -766,7 +767,7 @@ H5HF_sect_single_full_dblock(H5HF_hdr_t *hdr, hid_t dxpl_id,
     HDassert(hdr);
 
     /* Retrieve direct block address from section */
-    if(H5HF_sect_single_dblock_info(hdr, dxpl_id, sect, &dblock_addr, &dblock_size) < 0)
+    if(H5HF_sect_single_dblock_info(hdr, sect, &dblock_addr, &dblock_size) < 0)
         HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve direct block information")
 
     /* Check for section occupying entire direct block */
@@ -776,7 +777,7 @@ H5HF_sect_single_full_dblock(H5HF_hdr_t *hdr, hid_t dxpl_id,
             hdr->man_dtable.curr_root_rows > 0) {
         H5HF_direct_t *dblock;          /* Pointer to direct block for section */
 
-        if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, sect->u.single.parent, sect->u.single.par_entry, H5AC_WRITE)))
+        if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, sect->u.single.parent, sect->u.single.par_entry, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load fractal heap direct block")
         HDassert(H5F_addr_eq(dblock->block_off + dblock_overhead, sect->sect_info.addr));
 
@@ -866,7 +867,7 @@ H5HF_sect_single_deserialize(const H5FS_section_class_t H5_ATTR_UNUSED *cls,
     hsize_t sect_size, unsigned H5_ATTR_UNUSED *des_flags)
 {
     H5HF_free_section_t *new_sect;      /* New section */
-    H5FS_section_info_t *ret_value;     /* Return value */
+    H5FS_section_info_t *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1087,14 +1088,14 @@ H5HF_sect_single_shrink(H5FS_section_info_t **_sect, void H5_ATTR_UNUSED *_udata
             HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't revive single free section")
 
     /* Retrieve direct block address from section */
-    if(H5HF_sect_single_dblock_info(hdr, dxpl_id, (*sect), &dblock_addr, &dblock_size) < 0)
+    if(H5HF_sect_single_dblock_info(hdr, (*sect), &dblock_addr, &dblock_size) < 0)
         HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve direct block information")
 
     /* Protect the direct block for the section */
     /* (should be a root direct block) */
     HDassert(dblock_addr == hdr->man_dtable.table_addr);
     if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr,
-            dblock_size, (*sect)->u.single.parent, (*sect)->u.single.par_entry, H5AC_WRITE)))
+            dblock_size, (*sect)->u.single.parent, (*sect)->u.single.par_entry, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load fractal heap direct block")
     HDassert(H5F_addr_eq(dblock->block_off + dblock_size, (*sect)->sect_info.addr + (*sect)->sect_info.size));
 
@@ -1197,7 +1198,7 @@ H5HF_sect_single_valid(const H5FS_section_class_t H5_ATTR_UNUSED *cls, const H5F
 
             /* Retrieve direct block address from section */
             /* (Casting away const OK - QAK) */
-            status = H5HF_sect_single_dblock_info(iblock->hdr, H5AC_dxpl_id, (H5HF_free_section_t *)sect, &dblock_addr, &dblock_size);
+            status = H5HF_sect_single_dblock_info(iblock->hdr, (H5HF_free_section_t *)sect, &dblock_addr, &dblock_size);
             HDassert(status >= 0);
             HDassert(H5F_addr_eq(iblock->ents[sect->u.single.par_entry].addr, dblock_addr));
             HDassert(dblock_size > 0);
@@ -1221,7 +1222,7 @@ H5HF_sect_single_valid(const H5FS_section_class_t H5_ATTR_UNUSED *cls, const H5F
                 H5HF_direct_t *dblock;      /* Direct block for section */
 
                 /* Protect the direct block for the section */
-                dblock = H5HF_man_dblock_protect(iblock->hdr, H5AC_dxpl_id, dblock_addr, dblock_size, iblock, sect->u.single.par_entry, H5AC_READ);
+                dblock = H5HF_man_dblock_protect(iblock->hdr, H5AC_dxpl_id, dblock_addr, dblock_size, iblock, sect->u.single.par_entry, H5AC__READ_ONLY_FLAG);
                 HDassert(dblock);
 
                 /* Sanity check settings for section */
@@ -1261,7 +1262,7 @@ H5HF_sect_row_create(haddr_t sect_off, hsize_t sect_size, hbool_t is_first,
     unsigned row, unsigned col, unsigned nentries, H5HF_free_section_t *under_sect)
 {
     H5HF_free_section_t *sect = NULL;   /* 'Row' section created */
-    H5HF_free_section_t *ret_value;     /* Return value */
+    H5HF_free_section_t *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1513,7 +1514,7 @@ done:
 H5HF_indirect_t *
 H5HF_sect_row_get_iblock(H5HF_free_section_t *sect)
 {
-    H5HF_indirect_t *ret_value;         /* Return value */
+    H5HF_indirect_t *ret_value = NULL;          /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1675,7 +1676,7 @@ H5HF_sect_row_deserialize(const H5FS_section_class_t *cls, hid_t dxpl_id,
     unsigned *des_flags)
 {
     H5HF_hdr_t *hdr;                    /* Fractal heap header */
-    H5FS_section_info_t *ret_value;     /* Return value */
+    H5FS_section_info_t *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -2102,7 +2103,7 @@ H5HF_sect_row_debug(const H5FS_section_info_t *_sect,
 static hsize_t
 H5HF_sect_indirect_iblock_off(const H5HF_free_section_t *sect)
 {
-    hsize_t ret_value;           /* Return value */
+    hsize_t ret_value = 0;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -2133,7 +2134,7 @@ H5HF_sect_indirect_iblock_off(const H5HF_free_section_t *sect)
 static H5HF_free_section_t *
 H5HF_sect_indirect_top(H5HF_free_section_t *sect)
 {
-    H5HF_free_section_t *ret_value;           /* Return value */
+    H5HF_free_section_t *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -2242,7 +2243,7 @@ H5HF_sect_indirect_new(H5HF_hdr_t *hdr, haddr_t sect_off, hsize_t sect_size,
     unsigned nentries)
 {
     H5HF_free_section_t *sect = NULL;   /* 'Indirect' free space section to add */
-    H5HF_free_section_t *ret_value;     /* Return value */
+    H5HF_free_section_t *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -2313,7 +2314,7 @@ H5HF_sect_indirect_for_row(H5HF_hdr_t *hdr, H5HF_indirect_t *iblock,
     H5HF_free_section_t *row_sect)
 {
     H5HF_free_section_t *sect = NULL;   /* 'Indirect' free space section to add */
-    H5HF_free_section_t *ret_value;     /* Return value */
+    H5HF_free_section_t *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -2536,7 +2537,7 @@ H5HF_sect_indirect_init_rows(H5HF_hdr_t *hdr, hid_t dxpl_id,
 
                     /* If the child indirect block's address is defined, protect it */
                     if(H5F_addr_defined(child_iblock_addr)) {
-                        if(NULL == (child_iblock = H5HF_man_iblock_protect(hdr, dxpl_id, child_iblock_addr, child_nrows, sect->u.indirect.u.iblock, curr_entry, FALSE, H5AC_WRITE, &did_protect)))
+                        if(NULL == (child_iblock = H5HF_man_iblock_protect(hdr, dxpl_id, child_iblock_addr, child_nrows, sect->u.indirect.u.iblock, curr_entry, FALSE, H5AC__NO_FLAGS_SET, &did_protect)))
                             HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block")
                     } /* end if */
                     else
@@ -2771,7 +2772,7 @@ H5HF_sect_indirect_revive_row(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_free_section_
     HDassert(sect->sect_info.state == H5FS_SECT_SERIALIZED);
 
     /* Look up indirect block containing indirect blocks for section */
-    if(H5HF_man_dblock_locate(hdr, dxpl_id, sect->sect_info.addr, &sec_iblock, NULL, &did_protect, H5AC_READ) < 0)
+    if(H5HF_man_dblock_locate(hdr, dxpl_id, sect->sect_info.addr, &sec_iblock, NULL, &did_protect, H5AC__READ_ONLY_FLAG) < 0)
         HGOTO_ERROR(H5E_HEAP, H5E_CANTCOMPUTE, FAIL, "can't compute row & column of section")
 
     /* Increment reference count on indirect block that free section is in */
@@ -3945,7 +3946,7 @@ H5HF_sect_indirect_deserialize(H5HF_hdr_t *hdr, hid_t dxpl_id,
     unsigned end_entry;                 /* End entry in indirect block */
     unsigned end_row;                   /* End row in indirect block */
     unsigned end_col;                   /* End column in indirect block */
-    H5FS_section_info_t *ret_value;     /* Return value */
+    H5FS_section_info_t *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
diff --git a/src/H5HFspace.c b/src/H5HFspace.c
index 520c117..20057e4 100644
--- a/src/H5HFspace.c
+++ b/src/H5HFspace.c
@@ -28,7 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+#include "H5HFmodule.h"         /* This source code file is part of the H5HF module */
+
 
 /***********/
 /* Headers */
@@ -121,7 +122,7 @@ H5HF_space_start(H5HF_hdr_t *hdr, hid_t dxpl_id, hbool_t may_create)
     if(H5F_addr_defined(hdr->fs_addr)) {
         /* Open an existing free space structure for the heap */
         if(NULL == (hdr->fspace = H5FS_open(hdr->f, dxpl_id, hdr->fs_addr,
-                NELMTS(classes), classes, hdr, H5HF_FSPACE_THRHD_DEF, H5HF_FSPACE_ALIGN_DEF)))
+                NELMTS(classes), classes, hdr, (hsize_t)H5HF_FSPACE_THRHD_DEF, (hsize_t)H5HF_FSPACE_ALIGN_DEF)))
             HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize free space info")
     } /* end if */
     else {
@@ -138,7 +139,7 @@ H5HF_space_start(H5HF_hdr_t *hdr, hid_t dxpl_id, hbool_t may_create)
 
             /* Create the free space structure for the heap */
             if(NULL == (hdr->fspace = H5FS_create(hdr->f, dxpl_id, &hdr->fs_addr,
-                    &fs_create, NELMTS(classes), classes, hdr, H5HF_FSPACE_THRHD_DEF, H5HF_FSPACE_ALIGN_DEF)))
+                    &fs_create, NELMTS(classes), classes, hdr, (hsize_t)H5HF_FSPACE_THRHD_DEF, (hsize_t)H5HF_FSPACE_ALIGN_DEF)))
                 HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't initialize free space info")
             HDassert(H5F_addr_defined(hdr->fs_addr));
         } /* end if */
@@ -216,7 +217,7 @@ htri_t
 H5HF_space_find(H5HF_hdr_t *hdr, hid_t dxpl_id, hsize_t request, H5HF_free_section_t **node)
 {
     htri_t node_found = FALSE;  /* Whether an existing free list node was found */
-    htri_t ret_value;           /* Return value */
+    htri_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -613,7 +614,7 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5HF_space_sect_change_class(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_free_section_t *sect, unsigned new_class)
+H5HF_space_sect_change_class(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_free_section_t *sect, uint16_t new_class)
 {
     herr_t ret_value = SUCCEED;         /* Return value */
 
diff --git a/src/H5HFstat.c b/src/H5HFstat.c
index b0e1987..303b1f4 100644
--- a/src/H5HFstat.c
+++ b/src/H5HFstat.c
@@ -24,7 +24,8 @@
 /* Module Setup */
 /****************/
 
-#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+#include "H5HFmodule.h"         /* This source code file is part of the H5HF module */
+
 
 /***********/
 /* Headers */
diff --git a/src/H5HFtest.c b/src/H5HFtest.c
index c2e9cb0..4b97194 100644
--- a/src/H5HFtest.c
+++ b/src/H5HFtest.c
@@ -24,9 +24,10 @@
 /* Module Setup */
 /****************/
 
-#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+#include "H5HFmodule.h"         /* This source code file is part of the H5HF module */
 #define H5HF_TESTING		/*suppress warning about H5HF testing funcs*/
 
+
 /***********/
 /* Headers */
 /***********/
@@ -96,10 +97,10 @@ H5HF_get_cparam_test(const H5HF_t *fh, H5HF_create_t *cparam)
     /* Get fractal heap creation parameters */
     if(fh->hdr->id_len == (unsigned)(1 + fh->hdr->heap_off_size + fh->hdr->heap_len_size))
         cparam->id_len = 0;
-    else if(fh->hdr->id_len == (1 + fh->hdr->sizeof_size + fh->hdr->sizeof_addr))
+    else if(fh->hdr->id_len == (unsigned)(1 + fh->hdr->sizeof_size + fh->hdr->sizeof_addr))
         cparam->id_len = 1;
     else
-        cparam->id_len = fh->hdr->id_len;
+        H5_CHECKED_ASSIGN(cparam->id_len, uint16_t, fh->hdr->id_len, unsigned);
     cparam->max_man_size = fh->hdr->max_man_size;
     HDmemcpy(&(cparam->managed), &(fh->hdr->man_dtable.cparam), sizeof(H5HF_dtable_cparam_t));
     H5O_msg_copy(H5O_PLINE_ID, &(fh->hdr->pline), &(cparam->pline));
@@ -244,7 +245,7 @@ done:
 unsigned
 H5HF_get_max_root_rows(const H5HF_t *fh)
 {
-    unsigned	ret_value;              /* Return value */
+    unsigned	ret_value = 0;  /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -275,7 +276,7 @@ H5HF_get_max_root_rows(const H5HF_t *fh)
 unsigned
 H5HF_get_dtable_width_test(const H5HF_t *fh)
 {
-    unsigned	ret_value;              /* Return value */
+    unsigned	ret_value = 0;  /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -306,7 +307,7 @@ H5HF_get_dtable_width_test(const H5HF_t *fh)
 unsigned
 H5HF_get_dtable_max_drows_test(const H5HF_t *fh)
 {
-    unsigned	ret_value;              /* Return value */
+    unsigned	ret_value = 0;  /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -341,7 +342,7 @@ H5HF_get_dtable_max_drows_test(const H5HF_t *fh)
 unsigned
 H5HF_get_iblock_max_drows_test(const H5HF_t *fh, unsigned pos)
 {
-    unsigned	ret_value;              /* Return value */
+    unsigned	ret_value = 0;  /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -374,7 +375,7 @@ H5HF_get_iblock_max_drows_test(const H5HF_t *fh, unsigned pos)
 hsize_t
 H5HF_get_dblock_size_test(const H5HF_t *fh, unsigned row)
 {
-    hsize_t	ret_value;              /* Return value */
+    hsize_t	ret_value = 0;          /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -406,7 +407,7 @@ H5HF_get_dblock_size_test(const H5HF_t *fh, unsigned row)
 hsize_t
 H5HF_get_dblock_free_test(const H5HF_t *fh, unsigned row)
 {
-    hsize_t	ret_value;              /* Return value */
+    hsize_t	ret_value = 0;          /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
diff --git a/src/H5HFtiny.c b/src/H5HFtiny.c
index a4cbdc1..bdfe30d 100644
--- a/src/H5HFtiny.c
+++ b/src/H5HFtiny.c
@@ -15,11 +15,11 @@
 
 /*-------------------------------------------------------------------------
  *
- * Created:		H5HFtiny.c
- *			Aug 14 2006
- *			Quincey Koziol <koziol at hdfgroup.org>
+ * Created:     H5HFtiny.c
+ *              Aug 14 2006
+ *              Quincey Koziol <koziol at hdfgroup.org>
  *
- * Purpose:		Routines for "tiny" objects in fractal heap
+ * Purpose:     Routines for "tiny" objects in fractal heap
  *
  *-------------------------------------------------------------------------
  */
@@ -28,15 +28,15 @@
 /* Module Setup */
 /****************/
 
-#define H5HF_PACKAGE		/*suppress error about including H5HFpkg  */
+#include "H5HFmodule.h"         /* This source code file is part of the H5HF module */
 
 
 /***********/
 /* Headers */
 /***********/
-#include "H5private.h"		/* Generic Functions			*/
-#include "H5Eprivate.h"		/* Error handling		  	*/
-#include "H5HFpkg.h"		/* Fractal heaps			*/
+#include "H5private.h"      /* Generic Functions        */
+#include "H5Eprivate.h"     /* Error handling           */
+#include "H5HFpkg.h"        /* Fractal heaps            */
 
 
 /****************/
@@ -44,11 +44,11 @@
 /****************/
 
 /* Tiny object length information */
-#define H5HF_TINY_LEN_SHORT     16              /* Max. length able to be encoded in first heap ID byte */
-#define H5HF_TINY_MASK_SHORT    0x0F            /* Mask for length in first heap ID byte */
-#define H5HF_TINY_MASK_EXT      0x0FFF          /* Mask for length in two heap ID bytes */
-#define H5HF_TINY_MASK_EXT_1    0x0F00          /* Mask for length in first byte of two heap ID bytes */
-#define H5HF_TINY_MASK_EXT_2    0x00FF          /* Mask for length in second byte of two heap ID bytes */
+#define H5HF_TINY_LEN_SHORT     16          /* Max. length able to be encoded in first heap ID byte */
+#define H5HF_TINY_MASK_SHORT    0x0F        /* Mask for length in first heap ID byte                */
+#define H5HF_TINY_MASK_EXT      0x0FFF      /* Mask for length in two heap ID bytes                 */
+#define H5HF_TINY_MASK_EXT_1    0x0F00      /* Mask for length in first byte of two heap ID bytes   */
+#define H5HF_TINY_MASK_EXT_2    0x00FF      /* Mask for length in second byte of two heap ID bytes  */
 
 
 /******************/
@@ -84,15 +84,15 @@ static herr_t H5HF_tiny_op_real(H5HF_hdr_t *hdr, const uint8_t *id,
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_tiny_init
+ * Function:    H5HF_tiny_init
  *
- * Purpose:	Initialize information for tracking 'tiny' objects
+ * Purpose:     Initialize information for tracking 'tiny' objects
  *
- * Return:	SUCCEED/FAIL
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Aug 14 2006
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Aug 14 2006
  *
  *-------------------------------------------------------------------------
  */
@@ -131,15 +131,15 @@ H5HF_tiny_init(H5HF_hdr_t *hdr)
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_tiny_insert
+ * Function:    H5HF_tiny_insert
  *
- * Purpose:	Pack a 'tiny' object in a heap ID
+ * Purpose:     Pack a 'tiny' object in a heap ID
  *
- * Return:	SUCCEED/FAIL
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Aug 14 2006
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Aug 14 2006
  *
  *-------------------------------------------------------------------------
  */
@@ -169,17 +169,17 @@ HDfprintf(stderr, "%s: obj_size = %Zu\n", FUNC, obj_size);
 
     /* Encode object into ID */
     if(!hdr->tiny_len_extended) {
-        *id++ = H5HF_ID_VERS_CURR | H5HF_ID_TYPE_TINY |
-                (enc_obj_size & H5HF_TINY_MASK_SHORT);
+        *id++ = (uint8_t)(H5HF_ID_VERS_CURR | H5HF_ID_TYPE_TINY |
+                (enc_obj_size & H5HF_TINY_MASK_SHORT));
     } /* end if */
     else {
-        *id++ = H5HF_ID_VERS_CURR | H5HF_ID_TYPE_TINY |
-                ((enc_obj_size & H5HF_TINY_MASK_EXT_1) >> 8);
+        *id++ = (uint8_t)(H5HF_ID_VERS_CURR | H5HF_ID_TYPE_TINY |
+                ((enc_obj_size & H5HF_TINY_MASK_EXT_1) >> 8));
         *id++ = enc_obj_size & H5HF_TINY_MASK_EXT_2;
     } /* end else */
     HDmemcpy(id, obj, obj_size);
 #ifdef H5_CLEAR_MEMORY
-HDmemset(id + obj_size, 0, (hdr->id_len - (1 + hdr->tiny_len_extended + obj_size)));
+HDmemset(id + obj_size, 0, (hdr->id_len - ((size_t)1 + (size_t)hdr->tiny_len_extended + obj_size)));
 #endif /* H5_CLEAR_MEMORY */
 
     /* Update statistics about heap */
@@ -196,15 +196,15 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_tiny_get_obj_len
+ * Function:    H5HF_tiny_get_obj_len
  *
- * Purpose:	Get the size of a 'tiny' object in a fractal heap
+ * Purpose:     Get the size of a 'tiny' object in a fractal heap
  *
- * Return:	SUCCEED/FAIL
+ * Return:      SUCCEED (Can't fail)
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Aug 14 2006
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Aug 14 2006
  *
  *-------------------------------------------------------------------------
  */
@@ -226,10 +226,10 @@ H5HF_tiny_get_obj_len(H5HF_hdr_t *hdr, const uint8_t *id, size_t *obj_len_p)
     if(!hdr->tiny_len_extended)
         enc_obj_size = *id & H5HF_TINY_MASK_SHORT;
     else
-	/* (performed in this odd way to avoid compiler bug on tg-login3 with
-	 *  gcc 3.2.2 - QAK)
-	 */
-        enc_obj_size = *(id + 1) | ((*id & H5HF_TINY_MASK_EXT_1) << 8);
+        /* (performed in this odd way to avoid compiler bug on tg-login3 with
+         *  gcc 3.2.2 - QAK)
+         */
+        enc_obj_size = (size_t)*(id + 1) | ((size_t)(*id & H5HF_TINY_MASK_EXT_1) << 8);
 
     /* Set the object's length */
     *obj_len_p = enc_obj_size + 1;
@@ -239,15 +239,15 @@ H5HF_tiny_get_obj_len(H5HF_hdr_t *hdr, const uint8_t *id, size_t *obj_len_p)
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_tiny_op_real
+ * Function:    H5HF_tiny_op_real
  *
- * Purpose:	Internal routine to perform operation on 'tiny' object
+ * Purpose:     Internal routine to perform operation on 'tiny' object
  *
- * Return:	SUCCEED/FAIL
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Sep 11 2006
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Sep 11 2006
  *
  *-------------------------------------------------------------------------
  */
@@ -266,31 +266,23 @@ H5HF_tiny_op_real(H5HF_hdr_t *hdr, const uint8_t *id, H5HF_operator_t op,
     HDassert(hdr);
     HDassert(id);
     HDassert(op);
-
-    /* Check if 'tiny' object ID is in extended form */
-    if(!hdr->tiny_len_extended) {
-        /* Retrieve the object's encoded length */
-        enc_obj_size = *id & H5HF_TINY_MASK_SHORT;
-
-        /* Advance past flag byte(s) */
+    
+    /* Get the object's encoded length */
+    /* H5HF_tiny_obj_len can't fail */
+    ret_value = H5HF_tiny_get_obj_len(hdr, id, &enc_obj_size);
+    
+    /* Advance past flag byte(s) */
+    if(!hdr->tiny_len_extended)
         id++;
-    } /* end if */
     else {
-        /* Retrieve the object's encoded length */
-	/* (performed in this odd way to avoid compiler bug on tg-login3 with
-	 *  gcc 3.2.2 - QAK)
-	 */
-        enc_obj_size = *(id + 1) | ((*id & H5HF_TINY_MASK_EXT_1) << 8);
-
-        /* Advance past flag byte(s) */
-	/* (performed in two steps to avoid compiler bug on tg-login3 with
-	 *  gcc 3.2.2 - QAK)
-	 */
+        /* (performed in two steps to avoid compiler bug on tg-login3 with
+         *  gcc 3.2.2 - QAK)
+         */
         id++; id++;
-    } /* end else */
+    }
 
     /* Call the user's 'op' callback */
-    if(op(id, (enc_obj_size + 1), op_data) < 0)
+    if(op(id, enc_obj_size, op_data) < 0)
         HGOTO_ERROR(H5E_HEAP, H5E_CANTOPERATE, FAIL, "application's callback failed")
 
 done:
@@ -299,15 +291,15 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_tiny_read
+ * Function:    H5HF_tiny_read
  *
- * Purpose:	Read a 'tiny' object from the heap
+ * Purpose:     Read a 'tiny' object from the heap
  *
- * Return:	SUCCEED/FAIL
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Aug  8 2006
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Aug  8 2006
  *
  *-------------------------------------------------------------------------
  */
@@ -335,15 +327,15 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_tiny_op
+ * Function:    H5HF_tiny_op
  *
- * Purpose:	Operate directly on a 'tiny' object
+ * Purpose:     Operate directly on a 'tiny' object
  *
- * Return:	SUCCEED/FAIL
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Sept 11 2006
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Sept 11 2006
  *
  *-------------------------------------------------------------------------
  */
@@ -372,15 +364,15 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HF_tiny_remove
+ * Function:    H5HF_tiny_remove
  *
- * Purpose:	Remove a 'tiny' object from the heap statistics
+ * Purpose:     Remove a 'tiny' object from the heap statistics
  *
- * Return:	SUCCEED/FAIL
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Aug 14 2006
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              Aug 14 2006
  *
  *-------------------------------------------------------------------------
  */
@@ -398,17 +390,12 @@ H5HF_tiny_remove(H5HF_hdr_t *hdr, const uint8_t *id)
     HDassert(hdr);
     HDassert(id);
 
-    /* Check if 'tiny' object ID is in extended form */
-    if(!hdr->tiny_len_extended)
-        enc_obj_size = *id & H5HF_TINY_MASK_SHORT;
-    else
-	/* (performed in this odd way to avoid compiler bug on tg-login3 with
-	 *  gcc 3.2.2 - QAK)
-	 */
-        enc_obj_size = *(id + 1) | ((*id & H5HF_TINY_MASK_EXT_1) << 8);
+    /* Get the object's encoded length */
+    /* H5HF_tiny_obj_len can't fail */
+    ret_value = H5HF_tiny_get_obj_len(hdr, id, &enc_obj_size);
 
     /* Update statistics about heap */
-    hdr->tiny_size -= (enc_obj_size + 1);
+    hdr->tiny_size -= enc_obj_size;
     hdr->tiny_nobjs--;
 
     /* Mark heap header as modified */
@@ -418,4 +405,3 @@ H5HF_tiny_remove(H5HF_hdr_t *hdr, const uint8_t *id)
 done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5HF_tiny_remove() */
-
diff --git a/src/H5HG.c b/src/H5HG.c
index a861042..41c5007 100644
--- a/src/H5HG.c
+++ b/src/H5HG.c
@@ -41,7 +41,7 @@
 /* Module Setup */
 /****************/
 
-#define H5HG_PACKAGE		/*suppress error about including H5HGpkg	  */
+#include "H5HGmodule.h"         /* This source code file is part of the H5HG module */
 
 
 /***********/
@@ -91,6 +91,9 @@ static haddr_t H5HG_create(H5F_t *f, hid_t dxpl_id, size_t size);
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 /* Declare a free list to manage the H5HG_heap_t struct */
 H5FL_DEFINE(H5HG_heap_t);
 
@@ -140,7 +143,7 @@ H5HG_create(H5F_t *f, hid_t dxpl_id, size_t size)
     size_t	n;
     haddr_t	ret_value = HADDR_UNDEF;        /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, H5AC__GLOBALHEAP_TAG, HADDR_UNDEF)
 
     /* Check args */
     HDassert(f);
@@ -229,7 +232,7 @@ done:
         } /* end if */
     } /* end if */
 
-    FUNC_LEAVE_NOAPI(ret_value);
+    FUNC_LEAVE_NOAPI_TAG(ret_value, HADDR_UNDEF);
 } /* H5HG_create() */
 
 

@@ -246,10 +249,10 @@ done:
  *-------------------------------------------------------------------------
  */
 H5HG_heap_t *
-H5HG_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC_protect_t rw)
+H5HG_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, unsigned flags)
 {
     H5HG_heap_t *heap;          /* Global heap */
-    H5HG_heap_t *ret_value;     /* Return value */
+    H5HG_heap_t *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -257,8 +260,11 @@ H5HG_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC_protect_t rw)
     HDassert(f);
     HDassert(H5F_addr_defined(addr));
 
+    /* only H5AC__READ_ONLY_FLAG may appear in flags */
+    HDassert((flags & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
     /* Lock the heap into memory */
-    if(NULL == (heap = (H5HG_heap_t *)H5AC_protect(f, dxpl_id, H5AC_GHEAP, addr, f, rw)))
+    if(NULL == (heap = (H5HG_heap_t *)H5AC_protect(f, dxpl_id, H5AC_GHEAP, addr, f, flags)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to protect global heap")
 
     /* Set the heap's address */
@@ -293,10 +299,10 @@ done:
 static size_t
 H5HG_alloc(H5F_t *f, H5HG_heap_t *heap, size_t size, unsigned *heap_flags_ptr)
 {
-    size_t	idx;
-    uint8_t	*p;
-    size_t	need = H5HG_SIZEOF_OBJHDR(f) + H5HG_ALIGN(size);
-    size_t      ret_value;         /* Return value */
+    size_t      idx;
+    uint8_t     *p;
+    size_t      need = H5HG_SIZEOF_OBJHDR(f) + H5HG_ALIGN(size);
+    size_t      ret_value = 0;          /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -354,11 +360,11 @@ H5HG_alloc(H5F_t *f, H5HG_heap_t *heap, size_t size, unsigned *heap_flags_ptr)
 
     /* Fix the free space object */
     if(need == heap->obj[0].size) {
-	/*
-	 * All free space has been exhausted from this collection.
-	 */
-	heap->obj[0].size = 0;
-	heap->obj[0].begin = NULL;
+        /*
+         * All free space has been exhausted from this collection.
+         */
+        heap->obj[0].size = 0;
+        heap->obj[0].begin = NULL;
     } /* end if */
     else if(heap->obj[0].size-need >= H5HG_SIZEOF_OBJHDR (f)) {
 	/*
@@ -440,7 +446,7 @@ H5HG_extend(H5F_t *f, hid_t dxpl_id, haddr_t addr, size_t need)
     HDassert(H5F_addr_defined(addr));
 
     /* Protect the heap */
-    if(NULL == (heap = H5HG_protect(f, dxpl_id, addr, H5AC_WRITE)))
+    if(NULL == (heap = H5HG_protect(f, dxpl_id, addr, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect global heap")
 
     /* Re-allocate the heap information in memory */
@@ -524,7 +530,7 @@ H5HG_insert(H5F_t *f, hid_t dxpl_id, size_t size, void *obj, H5HG_t *hobj/*out*/
     unsigned 	heap_flags = H5AC__NO_FLAGS_SET;
     herr_t      ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__GLOBALHEAP_TAG, FAIL)
 
     /* Check args */
     HDassert(f);
@@ -554,7 +560,7 @@ H5HG_insert(H5F_t *f, hid_t dxpl_id, size_t size, void *obj, H5HG_t *hobj/*out*/
     } /* end if */
     HDassert(H5F_addr_defined(addr));
 
-    if(NULL == (heap = H5HG_protect(f, dxpl_id, addr, H5AC_WRITE)))
+    if(NULL == (heap = H5HG_protect(f, dxpl_id, addr, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect global heap")
 
     /* Split the free space to make room for the new object */
@@ -580,7 +586,7 @@ done:
     if(heap && H5AC_unprotect(f, dxpl_id, H5AC_GHEAP, heap->addr, heap, heap_flags) < 0)
         HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to unprotect heap.")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* H5HG_insert() */
 
 

@@ -609,16 +615,16 @@ H5HG_read(H5F_t *f, hid_t dxpl_id, H5HG_t *hobj, void *object/*out*/,
     size_t	size;                   /* Size of the heap object */
     uint8_t	*p;                     /* Pointer to object in heap buffer */
     void        *orig_object = object;  /* Keep a copy of the original object pointer */
-    void	*ret_value;             /* Return value */
+    void	*ret_value = NULL;      /* Return value */
 
-    FUNC_ENTER_NOAPI(NULL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__GLOBALHEAP_TAG, NULL)
 
     /* Check args */
     HDassert(f);
     HDassert(hobj);
 
     /* Load the heap */
-    if(NULL == (heap = H5HG_protect(f, dxpl_id, hobj->addr, H5AC_READ)))
+    if(NULL == (heap = H5HG_protect(f, dxpl_id, hobj->addr, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to protect global heap")
 
     HDassert(hobj->idx < heap->nused);
@@ -654,7 +660,7 @@ done:
     if(NULL == ret_value && NULL == orig_object && object)
         H5MM_free(object);
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, NULL)
 } /* end H5HG_read() */
 
 

@@ -681,9 +687,9 @@ H5HG_link(H5F_t *f, hid_t dxpl_id, const H5HG_t *hobj, int adjust)
 {
     H5HG_heap_t *heap = NULL;
     unsigned heap_flags = H5AC__NO_FLAGS_SET;
-    int ret_value;              /* Return value */
+    int ret_value = -1;         /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__GLOBALHEAP_TAG, FAIL)
 
     /* Check args */
     HDassert(f);
@@ -692,7 +698,7 @@ H5HG_link(H5F_t *f, hid_t dxpl_id, const H5HG_t *hobj, int adjust)
 	HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "no write intent on file")
 
     /* Load the heap */
-    if(NULL == (heap = H5HG_protect(f, dxpl_id, hobj->addr, H5AC_WRITE)))
+    if(NULL == (heap = H5HG_protect(f, dxpl_id, hobj->addr, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect global heap")
 
     if(adjust != 0) {
@@ -713,11 +719,55 @@ done:
     if(heap && H5AC_unprotect(f, dxpl_id, H5AC_GHEAP, hobj->addr, heap, heap_flags) < 0)
         HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5HG_link() */
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5HG_get_obj_size
+ *
+ * Purpose:     Returns the size of a global heap object.
+ * Return:      Success:        Non-negative
+ *
+ *              Failure:        Negative
+ *
+ * Programmer:  Neil Fortner
+ *              Thursday, February 12, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5HG_get_obj_size(H5F_t *f, hid_t dxpl_id, H5HG_t *hobj, size_t *obj_size)
+{
+    H5HG_heap_t *heap = NULL;           /* Pointer to global heap object */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__GLOBALHEAP_TAG, FAIL)
+
+    /* Check args */
+    HDassert(f);
+    HDassert(hobj);
+    HDassert(obj_size);
+
+    /* Load the heap */
+    if(NULL == (heap = H5HG_protect(f, dxpl_id, hobj->addr, H5AC__READ_ONLY_FLAG)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect global heap")
+
+    HDassert(hobj->idx < heap->nused);
+    HDassert(heap->obj[hobj->idx].begin);
+
+    /* Set object size */
+    *obj_size = heap->obj[hobj->idx].size;
+
+done:
+    if(heap && H5AC_unprotect(f, dxpl_id, H5AC_GHEAP, hobj->addr, heap, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
+} /* end H5HG_get_obj_size() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5HG_remove
  *
  * Purpose:	Removes the specified object from the global heap.
@@ -739,14 +789,14 @@ done:
 herr_t
 H5HG_remove (H5F_t *f, hid_t dxpl_id, H5HG_t *hobj)
 {
-    H5HG_heap_t	*heap = NULL;
-    uint8_t	*p = NULL, *obj_start = NULL;
-    size_t	need;
-    unsigned	u;
+    H5HG_heap_t *heap = NULL;
+    uint8_t     *p = NULL, *obj_start = NULL;
+    size_t      need;
+    unsigned    u;
     unsigned    flags = H5AC__NO_FLAGS_SET;/* Whether the heap gets deleted */
     herr_t      ret_value = SUCCEED;       /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__GLOBALHEAP_TAG, FAIL);
 
     /* Check args */
     HDassert(f);
@@ -755,7 +805,7 @@ H5HG_remove (H5F_t *f, hid_t dxpl_id, H5HG_t *hobj)
         HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "no write intent on file")
 
     /* Load the heap */
-    if(NULL == (heap = H5HG_protect(f, dxpl_id, hobj->addr, H5AC_WRITE)))
+    if(NULL == (heap = H5HG_protect(f, dxpl_id, hobj->addr, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect global heap")
 
     HDassert(hobj->idx < heap->nused);
@@ -808,7 +858,7 @@ done:
     if(heap && H5AC_unprotect(f, dxpl_id, H5AC_GHEAP, hobj->addr, heap, flags) < 0)
         HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
 
-    FUNC_LEAVE_NOAPI(ret_value);
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL);
 } /* end H5HG_remove() */
 
 

diff --git a/src/H5HGcache.c b/src/H5HGcache.c
index 533e26b..511937d 100644
--- a/src/H5HGcache.c
+++ b/src/H5HGcache.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5HG_PACKAGE		/*suppress error about including H5HGpkg  */
+#include "H5HGmodule.h"         /* This source code file is part of the H5HG module */
 
 
 /***********/
@@ -62,12 +62,16 @@
 /********************/
 
 /* Metadata cache callbacks */
-static H5HG_heap_t *H5HG_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static herr_t H5HG_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest, haddr_t addr,
-			 H5HG_heap_t *heap, unsigned H5_ATTR_UNUSED * flags_ptr);
-static herr_t H5HG_dest(H5F_t *f, H5HG_heap_t *heap);
-static herr_t H5HG_clear(H5F_t *f, H5HG_heap_t *heap, hbool_t destroy);
-static herr_t H5HG_size(const H5F_t *f, const H5HG_heap_t *heap, size_t *size_ptr);
+static herr_t H5HG__cache_heap_get_load_size(const void *_image, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static void *H5HG__cache_heap_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty); 
+static herr_t H5HG__cache_heap_image_len(const void *thing, size_t *image_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static herr_t H5HG__cache_heap_serialize(const H5F_t *f, void *image,
+    size_t len, void *thing); 
+static herr_t H5HG__cache_heap_free_icr(void *thing);
 
 
 /*********************/
@@ -76,12 +80,20 @@ static herr_t H5HG_size(const H5F_t *f, const H5HG_heap_t *heap, size_t *size_pt
 
 /* H5HG inherits cache-like properties from H5AC */
 const H5AC_class_t H5AC_GHEAP[1] = {{
-    H5AC_GHEAP_ID,
-    (H5AC_load_func_t)H5HG_load,
-    (H5AC_flush_func_t)H5HG_flush,
-    (H5AC_dest_func_t)H5HG_dest,
-    (H5AC_clear_func_t)H5HG_clear,
-    (H5AC_size_func_t)H5HG_size,
+    H5AC_GHEAP_ID,                      /* Metadata client ID */
+    "global heap",                      /* Metadata client name (for debugging) */
+    H5FD_MEM_GHEAP,                     /* File space memory type for client */
+    H5AC__CLASS_SPECULATIVE_LOAD_FLAG,  /* Client class behavior flags */
+    H5HG__cache_heap_get_load_size,     /* 'get_load_size' callback */
+    NULL, 				/* 'verify_chksum' callback */
+    H5HG__cache_heap_deserialize,       /* 'deserialize' callback */
+    H5HG__cache_heap_image_len,         /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5HG__cache_heap_serialize,         /* 'serialize' callback */
+    NULL,                               /* 'notify' callback */
+    H5HG__cache_heap_free_icr,          /* 'free_icr' callback */
+    NULL,                               /* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
 }};
 
 
@@ -97,319 +109,366 @@ const H5AC_class_t H5AC_GHEAP[1] = {{
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HG_load
+ * Function:    H5HG__cache_heap_get_load_size()
  *
- * Purpose:	Loads a global heap collection from disk.
+ * Purpose:	Return the initial speculative read size to the metadata 
+ *		cache.  This size will be used in the initial attempt to read 
+ *		the global heap.  If this read is too small, the cache will 
+ *		try again with the correct value obtained from 
+ *		H5HG__cache_heap_image_len().
  *
- * Return:	Success:	Ptr to a global heap collection.
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- *		Failure:	NULL
- *
- * Programmer:	Robb Matzke
- *              Friday, March 27, 1998
+ * Programmer:  John Mainzer
+ *              7/27/14
  *
  *-------------------------------------------------------------------------
  */
-static H5HG_heap_t *
-H5HG_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata)
+static herr_t
+H5HG__cache_heap_get_load_size(const void *_image, void *_udata, size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    H5HG_heap_t	*heap = NULL;
-    uint8_t	*p;
-    size_t	nalloc, need;
-    size_t      max_idx = 0;            /* The maximum index seen */
-    H5HG_heap_t	*ret_value = NULL;      /* Return value */
-
-    FUNC_ENTER_NOAPI_NOINIT
-
-    /* check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
-    HDassert(udata);
-
-    /* Read the initial 4k page */
-    if(NULL == (heap = H5FL_CALLOC(H5HG_heap_t)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
-    heap->shared = H5F_SHARED(f);
-    if(NULL == (heap->chunk = H5FL_BLK_MALLOC(gheap_chunk, (size_t)H5HG_MINSIZE)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
-    if(H5F_block_read(f, H5FD_MEM_GHEAP, addr, (size_t)H5HG_MINSIZE, dxpl_id, heap->chunk) < 0)
-	HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "unable to read global heap collection")
-    p = heap->chunk;
+    const uint8_t *image = (const uint8_t *)_image;   	/* Pointer into raw data buffer */
+    H5F_t *f = (H5F_t *)_udata;                         /* File pointer -- obtained from user data */
+    size_t heap_size;                                   /* Total size of collection      */
+    htri_t ret_value = SUCCEED;                         /* Return value */
 
-    /* Magic number */
-    if(HDmemcmp(p, H5HG_MAGIC, (size_t)H5_SIZEOF_MAGIC))
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "bad global heap collection signature")
-    p += H5_SIZEOF_MAGIC;
+    FUNC_ENTER_STATIC
 
-    /* Version */
-    if(H5HG_VERSION != *p++)
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "wrong version number in global heap")
+    HDassert(image_len);
 
-    /* Reserved */
-    p += 3;
+    if(image == NULL) {
+	*image_len = (size_t)H5HG_MINSIZE;
 
-    /* Size */
-    H5F_DECODE_LENGTH(f, p, heap->size);
-    HDassert(heap->size >= H5HG_MINSIZE);
+    } else { /* compute actual_len */
+	HDassert(f);
+	HDassert(actual_len);
+	HDassert(*actual_len == *image_len);
 
-    /*
-     * If we didn't read enough in the first try, then read the rest of the
-     * collection now.
-     */
-    if(heap->size > H5HG_MINSIZE) {
-	haddr_t next_addr = addr + (hsize_t)H5HG_MINSIZE;
-
-	if(NULL == (heap->chunk = H5FL_BLK_REALLOC(gheap_chunk, heap->chunk, heap->size)))
-	    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
-	if(H5F_block_read(f, H5FD_MEM_GHEAP, next_addr, (heap->size - H5HG_MINSIZE), dxpl_id, heap->chunk + H5HG_MINSIZE) < 0)
-	    HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "unable to read global heap collection")
-    } /* end if */
-
-    /* Decode each object */
-    p = heap->chunk + H5HG_SIZEOF_HDR(f);
-    nalloc = H5HG_NOBJS(f, heap->size);
-
-    /* Calloc the obj array because the file format spec makes no guarantee
-     * about the order of the objects, and unused slots must be set to zero.
-     */
-    if(NULL == (heap->obj = H5FL_SEQ_CALLOC(H5HG_obj_t, nalloc)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
-
-    heap->nalloc = nalloc;
-    while(p < (heap->chunk + heap->size)) {
-	if((p + H5HG_SIZEOF_OBJHDR(f)) > (heap->chunk + heap->size)) {
-	    /*
-	     * The last bit of space is too tiny for an object header, so we
-	     * assume that it's free space.
-	     */
-	    HDassert(NULL == heap->obj[0].begin);
-	    heap->obj[0].size = ((const uint8_t *)heap->chunk + heap->size) - p;
-	    heap->obj[0].begin = p;
-	    p += heap->obj[0].size;
-	} /* end if */
-        else {
-	    unsigned idx;
-	    uint8_t *begin = p;
-
-	    UINT16DECODE(p, idx);
-
-            /* Check if we need more room to store heap objects */
-            if(idx >= heap->nalloc) {
-                size_t new_alloc;       /* New allocation number */
-                H5HG_obj_t *new_obj;	/* New array of object descriptions */
-
-                /* Determine the new number of objects to index */
-                new_alloc = MAX(heap->nalloc * 2, (idx + 1));
-                HDassert(idx < new_alloc);
-
-                /* Reallocate array of objects */
-                if(NULL == (new_obj = H5FL_SEQ_REALLOC(H5HG_obj_t, heap->obj, new_alloc)))
-                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
-
-                /* Clear newly allocated space */
-                HDmemset(&new_obj[heap->nalloc], 0, (new_alloc - heap->nalloc) * sizeof(heap->obj[0]));
-
-                /* Update heap information */
-                heap->nalloc = new_alloc;
-                heap->obj = new_obj;
-                HDassert(heap->nalloc > heap->nused);
-            } /* end if */
+	/* Magic number */
+	if(HDmemcmp(image, H5HG_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "bad global heap collection signature")
+	image += H5_SIZEOF_MAGIC;
 
-	    UINT16DECODE(p, heap->obj[idx].nrefs);
-	    p += 4; /*reserved*/
-	    H5F_DECODE_LENGTH(f, p, heap->obj[idx].size);
-	    heap->obj[idx].begin = begin;
-
-	    /*
-	     * The total storage size includes the size of the object header
-	     * and is zero padded so the next object header is properly
-	     * aligned. The entire obj array was calloc'ed, so no need to zero
-	     * the space here. The last bit of space is the free space object
-	     * whose size is never padded and already includes the object
-	     * header.
-	     */
-	    if(idx > 0) {
-		need = H5HG_SIZEOF_OBJHDR(f) + H5HG_ALIGN(heap->obj[idx].size);
-
-                if(idx > max_idx)
-                    max_idx = idx;
-	    } /* end if */
-            else
-		need = heap->obj[idx].size;
-	    p = begin + need;
-	} /* end else */
-    } /* end while */
-    HDassert(p == heap->chunk + heap->size);
-    HDassert(H5HG_ISALIGNED(heap->obj[0].size));
-
-    /* Set the next index value to use */
-    if(max_idx > 0)
-        heap->nused = max_idx + 1;
-    else
-        heap->nused = 1;
+	/* Version */
+	if(H5HG_VERSION != *image++)
+	    HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "wrong version number in global heap")
 
-    HDassert(max_idx < heap->nused);
+	/* Reserved */
+	image += 3;
 
-    /* Add the new heap to the CWFS list for the file */
-    if(H5F_cwfs_add(f, heap) < 0)
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, NULL, "unable to add global heap collection to file's CWFS")
+	/* Size */
+	H5F_DECODE_LENGTH(f, image, heap_size);
+	HDassert(heap_size >= H5HG_MINSIZE);
+	HDassert(*image_len == H5HG_MINSIZE);
 
-    ret_value = heap;
+	*actual_len = heap_size;
+    }
 
 done:
-    if(!ret_value && heap)
-        if(H5HG_free(heap) < 0)
-	    HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, NULL, "unable to destroy global heap collection")
-
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HG_load() */
+} /* end H5HG__cache_heap_get_load_size() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HG_flush
+ * Function:    H5HG__cache_heap_deserialize
+ *
+ * Purpose:	Given a buffer containing the on disk image of the global 
+ *		heap, deserialize it, load its contents into a newly allocated
+ *		instance of H5HG_heap_t, and return a pointer to the new instance.
  *
- * Purpose:	Flushes a global heap collection from memory to disk if it's
- *		dirty.  Optionally deletes teh heap from memory.
+ *		Note that this heap client uses speculative reads.  If the supplied
+ *		buffer is too small, we simply make note of the correct size, and 
+ *		wait for the metadata cache to try again.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        Pointer to in core representation
+ *              Failure:        NULL
  *
- * Programmer:	Robb Matzke
- *              Friday, March 27, 1998
+ * Programmer:  John Mainzer
+ *              7/27/14
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5HG_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5HG_heap_t *heap, unsigned H5_ATTR_UNUSED * flags_ptr)
+static void *
+H5HG__cache_heap_deserialize(const void *_image, size_t len, void *_udata,
+    hbool_t H5_ATTR_UNUSED *dirty)
 {
-    herr_t ret_value = SUCCEED;       /* Return value */
+    H5F_t       *f = (H5F_t *)_udata;   /* File pointer -- obtained from user data */
+    H5HG_heap_t *heap = NULL;   /* New global heap */
+    uint8_t     *image;         /* Pointer to image to decode */
+    void        *ret_value = NULL;      /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /* Check arguments */
+    /* Sanity checks */
+    HDassert(_image);
+    HDassert(len >= (size_t)H5HG_MINSIZE);
     HDassert(f);
-    HDassert(H5F_addr_defined(addr));
-    HDassert(H5F_addr_eq(addr, heap->addr));
-    HDassert(heap);
+    HDassert(dirty);
+
+    /* Allocate a new global heap */
+    if(NULL == (heap = H5FL_CALLOC(H5HG_heap_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    heap->shared = H5F_SHARED(f);
+    if(NULL == (heap->chunk = H5FL_BLK_MALLOC(gheap_chunk, len)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* copy the image buffer into the newly allocate chunk */
+    HDmemcpy(heap->chunk, _image, len);
+
+    image = heap->chunk;
+
+    /* Magic number */
+    if(HDmemcmp(image, H5HG_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "bad global heap collection signature")
+    image += H5_SIZEOF_MAGIC;
 
-    if(heap->cache_info.is_dirty) {
-	if(H5F_block_write(f, H5FD_MEM_GHEAP, addr, heap->size, dxpl_id, heap->chunk) < 0)
-	    HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "unable to write global heap collection to file")
-	heap->cache_info.is_dirty = FALSE;
-    } /* end if */
+    /* Version */
+    if(H5HG_VERSION != *image++) 
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "wrong version number in global heap")
 
-    if(destroy)
-        if(H5HG_dest(f, heap) < 0)
-	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy global heap collection")
+    /* Reserved */
+    image += 3;
+
+    /* Size */
+    H5F_DECODE_LENGTH(f, image, heap->size);
+    HDassert(heap->size >= H5HG_MINSIZE);
+    HDassert((len == H5HG_MINSIZE) /* first try */ || 
+             ((len == heap->size) && (len > H5HG_MINSIZE))); /* second try */
+    
+    if(len == heap->size) {     /* proceed with the deserialize */
+        size_t       max_idx = 0;
+        size_t       nalloc;
+
+        /* Decode each object */
+        image = heap->chunk + H5HG_SIZEOF_HDR(f);
+        nalloc = H5HG_NOBJS(f, heap->size);
+
+        /* Calloc the obj array because the file format spec makes no guarantee
+         * about the order of the objects, and unused slots must be set to zero.
+         */
+        if(NULL == (heap->obj = H5FL_SEQ_CALLOC(H5HG_obj_t, nalloc)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+        heap->nalloc = nalloc;
+
+        while(image < (heap->chunk + heap->size)) {
+            if((image + H5HG_SIZEOF_OBJHDR(f)) > (heap->chunk + heap->size)) {
+                /*
+                 * The last bit of space is too tiny for an object header, so
+                 * we assume that it's free space.
+                 */
+                HDassert(NULL == heap->obj[0].begin);
+                heap->obj[0].size = (size_t)(((const uint8_t *)heap->chunk + heap->size) - image);
+                heap->obj[0].begin = image;
+                image += heap->obj[0].size;
+            } /* end if */
+            else {
+                size_t need;
+                unsigned idx;
+                uint8_t *begin = image;
+
+                UINT16DECODE(image, idx);
+
+                /* Check if we need more room to store heap objects */
+                if(idx >= heap->nalloc) {
+                    size_t new_alloc;       /* New allocation number */
+                    H5HG_obj_t *new_obj;    /* New array of object   descriptions          */
+
+                    /* Determine the new number of objects to index */
+                    new_alloc = MAX(heap->nalloc * 2, (idx + 1));
+                    HDassert(idx < new_alloc);
+
+                    /* Reallocate array of objects */
+                    if(NULL == (new_obj = H5FL_SEQ_REALLOC(H5HG_obj_t, heap->obj, new_alloc)))
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+                    /* Clear newly allocated space */
+                    HDmemset(&new_obj[heap->nalloc], 0, (new_alloc - heap->nalloc) * sizeof(heap->obj[0]));
+
+                    /* Update heap information */
+                    heap->nalloc = new_alloc;
+                    heap->obj = new_obj;
+                    HDassert(heap->nalloc > heap->nused);
+                } /* end if */
+
+                UINT16DECODE(image, heap->obj[idx].nrefs);
+                image += 4; /*reserved*/
+                H5F_DECODE_LENGTH(f, image, heap->obj[idx].size);
+                heap->obj[idx].begin = begin;
+
+                /*
+                 * The total storage size includes the size of the object 
+                 * header and is zero padded so the next object header is 
+                 * properly aligned. The entire obj array was calloc'ed, 
+                 * so no need to zero the space here. The last bit of space 
+                 * is the free space object whose size is never padded and 
+                 * already includes the object header.
+                 */
+                if(idx > 0) {
+                    need = H5HG_SIZEOF_OBJHDR(f) + H5HG_ALIGN(heap->obj[idx].size);
+                    if(idx > max_idx)
+                        max_idx = idx;
+                } /* end if */
+                else
+                    need = heap->obj[idx].size;
+
+                image = begin + need;
+            } /* end else */
+        } /* end while */
+
+        HDassert(image == heap->chunk + heap->size);
+        HDassert(H5HG_ISALIGNED(heap->obj[0].size));
+
+        /* Set the next index value to use */
+        if(max_idx > 0)
+            heap->nused = max_idx + 1;
+        else
+            heap->nused = 1;
+
+        HDassert(max_idx < heap->nused);
+
+        /* Add the new heap to the CWFS list for the file */
+        if(H5F_cwfs_add(f, heap) < 0)
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, NULL, "unable to add global heap collection to file's CWFS")
+    } /* end if ( len == heap->size ) */
+    else
+        /* if len is less than heap size, then the initial speculative 
+         * read was too small.  In this case we return without reporting
+         * failure.  H5C_load_entry() will call H5HG__cache_heap_image_len()
+         * to get the actual read size, and then repeat the read with the 
+         * correct size, and call this function a second time.
+         */
+        HDassert(len < heap->size);
+
+    ret_value = heap;
 
 done:
+    if(!ret_value && heap)
+        if(H5HG_free(heap) < 0)
+            HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, NULL, "unable to destroy global heap collection")
+
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HG_flush() */
+} /* end H5HG__cache_heap_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HG_dest
+ * Function:    H5HG__cache_heap_image_len
  *
- * Purpose:	Destroys a global heap collection in memory
+ * Purpose:	Return the on disk image size of the global heap to the 
+ *		metadata cache via the image_len.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	Quincey Koziol
- *              Wednesday, January 15, 2003
+ * Programmer:  John Mainzer
+ *              7/27/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HG_dest(H5F_t *f, H5HG_heap_t *heap)
+H5HG__cache_heap_image_len(const void *_thing, size_t *image_len, 
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    herr_t ret_value = SUCCEED;         /* Return value */
+    const H5HG_heap_t *heap = (const H5HG_heap_t *)_thing;
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR
 
-    /* Check arguments */
+    /* Sanity checks */
     HDassert(heap);
+    HDassert(heap->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(heap->cache_info.type == H5AC_GHEAP);
+    HDassert(heap->size >= H5HG_MINSIZE);
+    HDassert(image_len);
 
-    /* Verify that node is clean */
-    HDassert(heap->cache_info.is_dirty == FALSE);
-
-    /* If we're going to free the space on disk, the address must be valid */
-    HDassert(!heap->cache_info.free_file_space_on_destroy || H5F_addr_defined(heap->cache_info.addr));
+    *image_len = heap->size;
 
-    /* Check for freeing file space for globalheap */
-    if(heap->cache_info.free_file_space_on_destroy) {
-        /* Release the space on disk */
-        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
-        if(H5MF_xfree(f, H5FD_MEM_GHEAP, H5AC_dxpl_id, heap->cache_info.addr, (hsize_t)heap->size) < 0)
-            HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free global heap")
-    } /* end if */
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HG__cache_heap_image_len() */
 
-    /* Destroy global heap collection */
-    if(H5HG_free(heap) < 0)
-        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy global heap collection")
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5HG_dest() */
+/**************************************/
+/* no H5HG_cache_heap_pre_serialize() */
+/**************************************/
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HG_clear
+ * Function:    H5HG__cache_heap_serialize
  *
- * Purpose:	Mark a global heap in memory as non-dirty.
+ * Purpose:	Given an appropriately sized buffer and an instance of 
+ *		H5HG_heap_t, serialize the global heap for writing to file,
+ *		and copy the serialized verion into the buffer.
  *
- * Return:	Non-negative on success/Negative on failure
  *
- * Programmer:	Quincey Koziol
- *              Thursday, March 20, 2003
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              7/27/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HG_clear(H5F_t *f, H5HG_heap_t *heap, hbool_t destroy)
+H5HG__cache_heap_serialize(const H5F_t *f, void *image, size_t len,
+    void *_thing)
 {
-    herr_t ret_value = SUCCEED;
+    H5HG_heap_t *heap = (H5HG_heap_t *)_thing;
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR
 
-    /* Check arguments */
+    HDassert(f);
+    HDassert(image);
     HDassert(heap);
+    HDassert(heap->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(heap->cache_info.type == H5AC_GHEAP);
+    HDassert(heap->size == len);
+    HDassert(heap->chunk);
 
-    /* Mark heap as clean */
-    heap->cache_info.is_dirty = FALSE;
+    /* copy the image into the buffer */
+    HDmemcpy(image, heap->chunk, len);
 
-    if(destroy)
-        if(H5HG_dest(f, heap) < 0)
-	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy global heap collection")
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HG__cache_heap_serialize() */
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5HG_clear() */
+/****************************************/
+/* no H5HG_cache_heap_notify() function */
+/****************************************/
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HG_size
+ * Function:    H5HG__cache_heap_free_icr
+ *
+ * Purpose:	Free the in memory representation of the supplied global heap.
  *
- * Purpose:	Compute the size in bytes of the specified instance of
- *              H5HG_heap_t on disk, and return it in *len_ptr.  On failure,
- *              the value of *len_ptr is undefined.
+ * Note:	The metadata cache sets the object's cache_info.magic to
+ *		H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC before calling a free_icr
+ *		callback (checked in assert).
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	John Mainzer
- *              5/13/04
+ * Programmer:  John Mainzer
+ *              7/27/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HG_size(const H5F_t H5_ATTR_UNUSED *f, const H5HG_heap_t *heap, size_t *size_ptr)
+H5HG__cache_heap_free_icr(void *_thing)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    H5HG_heap_t *heap = (H5HG_heap_t *)_thing;
+    herr_t      ret_value = SUCCEED;    /* Return value */
 
-    /* Check arguments */
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
     HDassert(heap);
-    HDassert(size_ptr);
+    HDassert(heap->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC);
+    HDassert(heap->cache_info.type == H5AC_GHEAP);
 
-    *size_ptr = heap->size;
+    /* Destroy global heap collection */
+    if(H5HG_free(heap) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy global heap collection")
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HG_size() */
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HG__cache_heap_free_icr() */
 
diff --git a/src/H5HGdbg.c b/src/H5HGdbg.c
index 16d8c49..6013de5 100644
--- a/src/H5HGdbg.c
+++ b/src/H5HGdbg.c
@@ -23,7 +23,7 @@
 /* Module Setup */
 /****************/
 
-#define H5HG_PACKAGE		/*suppress error about including H5HGpkg	  */
+#include "H5HGmodule.h"         /* This source code file is part of the H5HG module */
 
 
 /***********/
@@ -103,7 +103,7 @@ H5HG_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent,
     HDassert(indent >= 0);
     HDassert(fwidth >= 0);
 
-    if(NULL == (h = H5HG_protect(f, dxpl_id, addr, H5AC_READ)))
+    if(NULL == (h = H5HG_protect(f, dxpl_id, addr, H5AC__READ_ONLY_FLAG)))
         HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect global heap collection");
 
     HDfprintf(stream, "%*sGlobal Heap Collection...\n", indent, "");
diff --git a/src/H5HGmodule.h b/src/H5HGmodule.h
new file mode 100644
index 0000000..aa34f29
--- /dev/null
+++ b/src/H5HGmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5HG package.  Including this header means that the source file
+ *		is part of the H5HG package.
+ */
+#ifndef _H5HGmodule_H
+#define _H5HGmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5HG_MODULE
+#define H5_MY_PKG       H5HG
+#define H5_MY_PKG_ERR   H5E_HEAP
+#define H5_MY_PKG_INIT  NO
+
+#endif /* _H5HGmodule_H */
+
diff --git a/src/H5HGpkg.h b/src/H5HGpkg.h
index f3546a2..e566ece 100644
--- a/src/H5HGpkg.h
+++ b/src/H5HGpkg.h
@@ -21,7 +21,7 @@
  *              only within the H5HG package. Source files outside the
  *              H5HG package should include H5HGprivate.h instead.
  */
-#ifndef H5HG_PACKAGE
+#if !(defined H5HG_FRIEND || defined H5HG_MODULE)
 #error "Do not include this file outside the H5HG package!"
 #endif
 
@@ -116,9 +116,9 @@ H5FL_BLK_EXTERN(gheap_chunk);
 /****************************/
 
 typedef struct H5HG_obj_t {
-    int		nrefs;		/*reference count		*/
-    size_t		size;		/*total size of object		*/
-    uint8_t		*begin;		/*ptr to object into heap->chunk*/
+    int         nrefs;      /* reference count                  */
+    size_t      size;       /* total size of object             */
+    uint8_t     *begin;     /* ptr to object into heap->chunk   */
 } H5HG_obj_t;
 
 /* Forward declarations for fields */
@@ -143,7 +143,7 @@ struct H5HG_heap_t {
 /* Package Private Prototypes */
 /******************************/
 H5_DLL herr_t H5HG_free(H5HG_heap_t *heap);
-H5_DLL H5HG_heap_t *H5HG_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC_protect_t rw);
+H5_DLL H5HG_heap_t *H5HG_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, unsigned flags);
 
 #endif /* _H5HGpkg_H */
 
diff --git a/src/H5HGprivate.h b/src/H5HGprivate.h
index 3765c47..0c0aa69 100644
--- a/src/H5HGprivate.h
+++ b/src/H5HGprivate.h
@@ -44,15 +44,15 @@ typedef struct H5HG_heap_t H5HG_heap_t;
 #define H5HG_MAXSIZE	65536
 
 /* If the module using this macro is allowed access to the private variables, access them directly */
-#ifdef H5HG_PACKAGE
+#ifdef H5HG_MODULE
 #define H5HG_ADDR(H)            ((H)->addr)
 #define H5HG_SIZE(H)            ((H)->size)
 #define H5HG_FREE_SIZE(H)       ((H)->obj[0].size)
-#else /* H5HG_PACKAGE */
+#else /* H5HG_MODULE */
 #define H5HG_ADDR(H)            (H5HG_get_addr(H))
 #define H5HG_SIZE(H)            (H5HG_get_size(H))
 #define H5HG_FREE_SIZE(H)       (H5HG_get_free_size(H))
-#endif /* H5HG_PACKAGE */
+#endif /* H5HG_MODULE */
 
 
 /* Main global heap routines */
@@ -60,6 +60,7 @@ H5_DLL herr_t H5HG_insert(H5F_t *f, hid_t dxpl_id, size_t size, void *obj,
 			   H5HG_t *hobj/*out*/);
 H5_DLL void *H5HG_read(H5F_t *f, hid_t dxpl_id, H5HG_t *hobj, void *object, size_t *buf_size/*out*/);
 H5_DLL int H5HG_link(H5F_t *f, hid_t dxpl_id, const H5HG_t *hobj, int adjust);
+H5_DLL herr_t H5HG_get_obj_size(H5F_t *f, hid_t dxpl_id, H5HG_t *hobj, size_t *obj_size);
 H5_DLL herr_t H5HG_remove(H5F_t *f, hid_t dxpl_id, H5HG_t *hobj);
 
 /* Support routines */
diff --git a/src/H5HGquery.c b/src/H5HGquery.c
index a1b3777..d07edcc 100644
--- a/src/H5HGquery.c
+++ b/src/H5HGquery.c
@@ -25,7 +25,7 @@
 /* Module Setup */
 /****************/
 
-#define H5HG_PACKAGE		/*suppress error about including H5HGpkg	  */
+#include "H5HGmodule.h"         /* This source code file is part of the H5HG module */
 
 
 /***********/
diff --git a/src/H5HL.c b/src/H5HL.c
index a5d01cd..7ad2e3c 100644
--- a/src/H5HL.c
+++ b/src/H5HL.c
@@ -15,12 +15,12 @@
 
 /*-------------------------------------------------------------------------
  *
- * Created:		H5HL.c
- *			Jul 16 1997
- *			Robb Matzke <matzke at llnl.gov>
+ * Created:         H5HL.c
+ *                  Jul 16 1997
+ *                  Robb Matzke <matzke at llnl.gov>
  *
- * Purpose:		Heap functions for the local heaps used by symbol
- *			tables to store names (among other things).
+ * Purpose:         Heap functions for the local heaps used by symbol
+ *                  tables to store names (among other things).
  *
  *-------------------------------------------------------------------------
  */
@@ -29,24 +29,24 @@
 /* Module Setup */
 /****************/
 
-#define H5HL_PACKAGE		/* Suppress error about including H5HLpkg */
+#include "H5HLmodule.h"         /* This source code file is part of the H5HL module */
 
 
 /***********/
 /* Headers */
 /***********/
-#include "H5private.h"		/* Generic Functions			*/
-#include "H5Eprivate.h"		/* Error handling		  	*/
-#include "H5Fprivate.h"         /* File access				*/
-#include "H5HLpkg.h"		/* Local Heaps				*/
-#include "H5MFprivate.h"	/* File memory management		*/
+#include "H5private.h"      /* Generic Functions        */
+#include "H5Eprivate.h"     /* Error handling           */
+#include "H5Fprivate.h"     /* File access              */
+#include "H5HLpkg.h"        /* Local Heaps              */
+#include "H5MFprivate.h"    /* File memory management   */
 
 
 /****************/
 /* Local Macros */
 /****************/
 
-#define H5HL_MIN_HEAP   128             /* Minimum size to reduce heap buffer to */
+#define H5HL_MIN_HEAP   128     /* Minimum size to reduce heap buffer to */
 
 
 /******************/
@@ -63,14 +63,18 @@
 /* Local Prototypes */
 /********************/
 
-static H5HL_free_t *H5HL_remove_free(H5HL_t *heap, H5HL_free_t *fl);
-static herr_t H5HL_minimize_heap_space(H5F_t *f, hid_t dxpl_id, H5HL_t *heap);
+static H5HL_free_t *H5HL__remove_free(H5HL_t *heap, H5HL_free_t *fl);
+static herr_t H5HL__minimize_heap_space(H5F_t *f, hid_t dxpl_id, H5HL_t *heap);
+static herr_t H5HL__dirty(H5HL_t *heap);
 
 
 /*********************/
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 /* Declare a free list to manage the H5HL_free_t struct */
 H5FL_DEFINE(H5HL_free_t);
 
@@ -90,35 +94,29 @@ H5FL_BLK_DEFINE(lheap_chunk);
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_create
- *
- * Purpose:	Creates a new heap data structure on disk and caches it
- *		in memory.  SIZE_HINT is a hint for the initial size of the
- *		data area of the heap.	If size hint is invalid then a
- *		reasonable (but probably not optimal) size will be chosen.
- *		If the heap ever has to grow, then REALLOC_HINT is the
- *		minimum amount by which the heap will grow.
+ * Function:    H5HL_create
  *
- * Return:	Success:	Non-negative. The file address of new heap is
- *				returned through the ADDR argument.
+ * Purpose:     Creates a new heap data structure on disk and caches it
+ *              in memory.  SIZE_HINT is a hint for the initial size of the
+ *              data area of the heap.  If size hint is invalid then a
+ *              reasonable (but probably not optimal) size will be chosen.
  *
- *		Failure:	Negative
+ * Return:      Success:    SUCCEED. The file address of new heap is
+ *                          returned through the ADDR argument.
+ *              Failure:    FAIL.  addr_p will be HADDR_UNDEF.
  *
- * Programmer:	Robb Matzke
- *		matzke at llnl.gov
- *		Jul 16 1997
+ * Programmer:  Robb Matzke
+ *              Jul 16 1997
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5HL_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, haddr_t *addr_p/*out*/)
-{
-    H5HL_t	*heap = NULL;           /* Heap created */
-    H5HL_prfx_t *prfx = NULL;           /* Heap prefix */
-    hsize_t	total_size;		/* Total heap size on disk	*/
-    herr_t	ret_value = SUCCEED;    /* Return value */
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5HL_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, haddr_t *addr_p/*out*/))
 
-    FUNC_ENTER_NOAPI(FAIL)
+    H5HL_t      *heap = NULL;           /* Heap created                 */
+    H5HL_prfx_t *prfx = NULL;           /* Heap prefix                  */
+    hsize_t     total_size = 0;         /* Total heap size on disk      */
 
     /* check arguments */
     HDassert(f);
@@ -126,17 +124,17 @@ H5HL_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, haddr_t *addr_p/*out*/)
 
     /* Adjust size hint as necessary */
     if(size_hint && size_hint < H5HL_SIZEOF_FREE(f))
-	size_hint = H5HL_SIZEOF_FREE(f);
+        size_hint = H5HL_SIZEOF_FREE(f);
     size_hint = H5HL_ALIGN(size_hint);
 
     /* Allocate new heap structure */
-    if(NULL == (heap = H5HL_new(H5F_SIZEOF_SIZE(f), H5F_SIZEOF_ADDR(f), H5HL_SIZEOF_HDR(f))))
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "can't allocate new heap struct")
+    if(NULL == (heap = H5HL__new(H5F_SIZEOF_SIZE(f), H5F_SIZEOF_ADDR(f), H5HL_SIZEOF_HDR(f))))
+        H5E_THROW(H5E_CANTALLOC, "can't allocate new heap struct");
 
     /* Allocate file space */
     total_size = heap->prfx_size + size_hint;
     if(HADDR_UNDEF == (heap->prfx_addr = H5MF_alloc(f, H5FD_MEM_LHEAP, dxpl_id, total_size)))
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "unable to allocate file memory")
+        H5E_THROW(H5E_CANTALLOC, "unable to allocate file memory");
 
     /* Initialize info */
     heap->single_cache_obj = TRUE;
@@ -144,188 +142,72 @@ H5HL_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, haddr_t *addr_p/*out*/)
     heap->dblk_size = size_hint;
     if(size_hint)
         if(NULL == (heap->dblk_image = H5FL_BLK_CALLOC(lheap_chunk, size_hint)))
-            HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "memory allocation failed")
+            H5E_THROW(H5E_CANTALLOC, "memory allocation failed");
 
     /* free list */
     if(size_hint) {
-	if(NULL == (heap->freelist = H5FL_MALLOC(H5HL_free_t)))
-	    HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "memory allocation failed")
-	heap->freelist->offset = 0;
-	heap->freelist->size = size_hint;
-	heap->freelist->prev = heap->freelist->next = NULL;
+        if(NULL == (heap->freelist = H5FL_MALLOC(H5HL_free_t)))
+            H5E_THROW(H5E_CANTALLOC, "memory allocation failed");
+        heap->freelist->offset = 0;
+        heap->freelist->size = size_hint;
+        heap->freelist->prev = heap->freelist->next = NULL;
         heap->free_block = 0;
     } /* end if */
     else {
-	heap->freelist = NULL;
+        heap->freelist = NULL;
         heap->free_block = H5HL_FREE_NULL;
     } /* end else */
 
     /* Allocate the heap prefix */
-    if(NULL == (prfx = H5HL_prfx_new(heap)))
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "memory allocation failed")
+    if(NULL == (prfx = H5HL__prfx_new(heap)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed");
 
     /* Add to cache */
-    if(H5AC_insert_entry(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, prfx, H5AC__NO_FLAGS_SET) < 0)
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "unable to cache local heap prefix")
+    if(FAIL == H5AC_insert_entry(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, prfx, H5AC__NO_FLAGS_SET))
+        H5E_THROW(H5E_CANTINIT, "unable to cache local heap prefix");
 
     /* Set address to return */
     *addr_p = heap->prfx_addr;
 
-done:
+CATCH
     if(ret_value < 0) {
+        *addr_p = HADDR_UNDEF;
         if(prfx) {
-            if(H5HL_prfx_dest(prfx) < 0)
-                HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy local heap prefix")
+            if(FAIL == H5HL__prfx_dest(prfx))
+                H5E_THROW(H5E_CANTFREE, "unable to destroy local heap prefix");
         } /* end if */
         else {
             if(heap) {
                 if(H5F_addr_defined(heap->prfx_addr))
-                    if(H5MF_xfree(f, H5FD_MEM_LHEAP, dxpl_id, heap->prfx_addr, total_size) < 0)
-                        HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "can't release heap data?")
-                if(H5HL_dest(heap) < 0)
-                    HDONE_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy local heap")
+                    if(FAIL == H5MF_xfree(f, H5FD_MEM_LHEAP, dxpl_id, heap->prfx_addr, total_size))
+                        H5E_THROW(H5E_CANTFREE, "can't release heap data?");
+                if(FAIL == H5HL__dest(heap))
+                    H5E_THROW(H5E_CANTFREE, "unable to destroy local heap");
             } /* end if */
         } /* end else */
     } /* end if */
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_create() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5HL_dblk_realloc
- *
- * Purpose:	Reallocate data block for heap
- *
- * Return:	Success:	Non-negative
- *		Failure:	Negative
- *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Oct 12 2008
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5HL_dblk_realloc(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t new_heap_size)
-{
-    H5HL_dblk_t *dblk;                  /* Local heap data block */
-    haddr_t old_addr;                   /* Old location of heap data block */
-    haddr_t new_addr;                   /* New location of heap data block */
-    size_t old_heap_size;               /* Old size of heap data block */
-    herr_t ret_value = SUCCEED;         /* Return value */
-
-    FUNC_ENTER_NOAPI_NOINIT
-
-    /* check arguments */
-    HDassert(heap);
-    HDassert(new_heap_size > 0);
-
-    /* Release old space on disk */
-    old_addr = heap->dblk_addr;
-    old_heap_size = heap->dblk_size;
-    H5_CHECK_OVERFLOW(old_heap_size, size_t, hsize_t);
-    if(H5MF_xfree(f, H5FD_MEM_LHEAP, dxpl_id, old_addr, (hsize_t)old_heap_size) < 0)
-        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "can't release old heap data?")
-
-    /* Allocate new space on disk */
-    H5_CHECK_OVERFLOW(new_heap_size, size_t, hsize_t);
-    if(HADDR_UNDEF == (new_addr = H5MF_alloc(f, H5FD_MEM_LHEAP, dxpl_id, (hsize_t)new_heap_size)))
-        HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "unable to allocate file space for heap")
-
-    /* Update heap info*/
-    heap->dblk_addr = new_addr;
-    heap->dblk_size = new_heap_size;
-
-    /* Check if heap data block actually moved in the file */
-    if(H5F_addr_eq(old_addr, new_addr)) {
-        /* Check if heap data block is contiguous w/prefix */
-        if(heap->single_cache_obj) {
-            /* Sanity check */
-            HDassert(H5F_addr_eq(heap->prfx_addr + heap->prfx_size, old_addr));
-            HDassert(heap->prfx);
-
-            /* Resize the heap prefix in the cache */
-            if(H5AC_resize_entry(heap->prfx, (size_t)(heap->prfx_size + new_heap_size)) < 0)
-                HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to resize heap in cache")
-        } /* end if */
-        else {
-            /* Sanity check */
-            HDassert(H5F_addr_ne(heap->prfx_addr + heap->prfx_size, old_addr));
-            HDassert(heap->dblk);
-
-            /* Resize the heap data block in the cache */
-            if(H5AC_resize_entry(heap->dblk, (size_t)new_heap_size) < 0)
-                HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to resize heap in cache")
-        } /* end else */
-    } /* end if */
-    else {
-        /* Check if heap data block was contiguous w/prefix previously */
-        if(heap->single_cache_obj) {
-            /* Create new heap data block */
-            if(NULL == (dblk = H5HL_dblk_new(heap)))
-                HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "unable to allocate local heap data block")
-
-            /* Resize current heap prefix */
-            heap->prfx_size = H5HL_SIZEOF_HDR(f);
-            if(H5AC_resize_entry(heap->prfx, (size_t)heap->prfx_size) < 0)
-                HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to resize heap prefix in cache")
-
-            /* Insert data block into cache (pinned) */
-            if(H5AC_insert_entry(f, dxpl_id, H5AC_LHEAP_DBLK, new_addr, dblk, H5AC__PIN_ENTRY_FLAG) < 0)
-                HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "unable to cache local heap data block")
-            dblk = NULL;
-
-            /* Reset 'single cache object' flag */
-            heap->single_cache_obj = FALSE;
-        } /* end if */
-        else {
-            /* Resize the heap data block in the cache */
-            /* (ignore [unlikely] case where heap data block ends up
-             *      contiguous w/heap prefix again.
-             */
-            if(H5AC_resize_entry(heap->dblk, (size_t)new_heap_size) < 0)
-                HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to resize heap data block in cache")
-
-            /* Relocate the heap data block in the cache */
-            if(H5AC_move_entry(f, H5AC_LHEAP_DBLK, old_addr, new_addr) < 0)
-                HGOTO_ERROR(H5E_HEAP, H5E_CANTMOVE, FAIL, "unable to move heap data block in cache")
-        } /* end else */
-    } /* end else */
-
-done:
-    if(ret_value < 0) {
-        /* Restore old heap address & size */
-        heap->dblk_addr = old_addr;
-        heap->dblk_size = old_heap_size;
-    } /* end if */
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_dblk_realloc() */
+END_FUNC(PRIV) /* end H5HL_create() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5HL_minimize_heap_space
+ * Function:    H5HL__minimize_heap_space
  *
  * Purpose:     Go through the heap's freelist and determine if we can
  *              eliminate the free blocks at the tail of the buffer.
  *
- * Return:      Success:        SUCCEED
- *              Failure:        FAIL
+ * Return:      SUCCEED/FAIL
  *
  * Programmer:  Bill Wendling
- *              wendling at ncsa.uiuc.edu
  *              Sept. 16, 2003
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5HL_minimize_heap_space(H5F_t *f, hid_t dxpl_id, H5HL_t *heap)
-{
-    size_t new_heap_size = heap->dblk_size;     /* New size of heap */
-    herr_t ret_value = SUCCEED;                 /* Return value */
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5HL__minimize_heap_space(H5F_t *f, hid_t dxpl_id, H5HL_t *heap))
 
-    FUNC_ENTER_NOAPI(FAIL)
+    size_t new_heap_size = heap->dblk_size;     /* New size of heap */
 
     /* check args */
     HDassert(f);
@@ -390,7 +272,7 @@ H5HL_minimize_heap_space(H5F_t *f, hid_t dxpl_id, H5HL_t *heap)
                         new_heap_size = last_fl->offset;
 
                         /* Eliminate the free block from the list */
-                        last_fl = H5HL_remove_free(heap, last_fl);
+                        last_fl = H5HL__remove_free(heap, last_fl);
                     } /* end else */
                 } /* end if */
                 else {
@@ -410,20 +292,21 @@ H5HL_minimize_heap_space(H5F_t *f, hid_t dxpl_id, H5HL_t *heap)
      * storage.
      */
     if(new_heap_size != heap->dblk_size) {
-	HDassert(new_heap_size < heap->dblk_size);
+        HDassert(new_heap_size < heap->dblk_size);
 
         /* Resize the memory buffer */
         if(NULL == (heap->dblk_image = H5FL_BLK_REALLOC(lheap_chunk, heap->dblk_image, new_heap_size)))
-            HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "memory allocation failed")
+            H5E_THROW(H5E_CANTALLOC, "memory allocation failed");
 
         /* Reallocate data block in file */
-        if(H5HL_dblk_realloc(f, dxpl_id, heap, new_heap_size) < 0)
-            HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "reallocating data block failed")
+        if(FAIL == H5HL__dblk_realloc(f, dxpl_id, heap, new_heap_size))
+            H5E_THROW(H5E_CANTRESIZE, "reallocating data block failed");
     } /* end if */
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5HL_minimize_heap_space() */
+CATCH
+    /* No special processing on errors */
+
+END_FUNC(STATIC) /* H5HL__minimize_heap_space() */
 
 

 /*-------------------------------------------------------------------------
@@ -435,37 +318,39 @@ done:
  *              Failure:    NULL
  *
  * Programmer:  Bill Wendling
- *              wendling at ncsa.uiuc.edu
  *              Sept. 17, 2003
  *
  *-------------------------------------------------------------------------
  */
-H5HL_t *
-H5HL_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC_protect_t rw)
-{
-    H5HL_cache_prfx_ud_t prfx_udata; /* User data for protecting local heap prefix */
-    H5HL_prfx_t *prfx = NULL;   /* Local heap prefix */
-    H5HL_dblk_t *dblk = NULL;   /* Local heap data block */
-    H5HL_t *heap;               /* Heap data structure */
-    unsigned prfx_cache_flags = H5AC__NO_FLAGS_SET;         /* Cache flags for unprotecting prefix entry */
-    unsigned dblk_cache_flags = H5AC__NO_FLAGS_SET;         /* Cache flags for unprotecting data block entry */
-    H5HL_t *ret_value;          /* Return value */
-
-    FUNC_ENTER_NOAPI(NULL)
+BEGIN_FUNC(PRIV, ERR,
+H5HL_t *, NULL, NULL,
+H5HL_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, unsigned flags))
+
+    H5HL_cache_prfx_ud_t prfx_udata;                    /* User data for protecting local heap prefix       */
+    H5HL_prfx_t *prfx = NULL;                           /* Local heap prefix                                */
+    H5HL_dblk_t *dblk = NULL;                           /* Local heap data block                            */
+    H5HL_t *heap = NULL;                                /* Heap data structure                              */
+    unsigned prfx_cache_flags = H5AC__NO_FLAGS_SET;     /* Cache flags for unprotecting prefix entry        */
+    unsigned dblk_cache_flags = H5AC__NO_FLAGS_SET;     /* Cache flags for unprotecting data block entry    */
 
     /* check arguments */
     HDassert(f);
     HDassert(H5F_addr_defined(addr));
 
+    /* only the H5AC__READ_ONLY_FLAG may appear in flags */
+    HDassert((flags & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
     /* Construct the user data for protect callback */
+    prfx_udata.made_attempt = FALSE;
     prfx_udata.sizeof_size = H5F_SIZEOF_SIZE(f);
     prfx_udata.sizeof_addr = H5F_SIZEOF_ADDR(f);
     prfx_udata.prfx_addr = addr;
     prfx_udata.sizeof_prfx = H5HL_SIZEOF_HDR(f);
+    prfx_udata.loaded = FALSE;
 
     /* Protect the local heap prefix */
-    if(NULL == (prfx = (H5HL_prfx_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_PRFX, addr, &prfx_udata, rw)))
-        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to load heap prefix")
+    if(NULL == (prfx = (H5HL_prfx_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_PRFX, addr, &prfx_udata, flags)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to load heap prefix");
 
     /* Get the pointer to the heap */
     heap = prfx->heap;
@@ -486,8 +371,8 @@ H5HL_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC_protect_t rw)
             dblk_udata.loaded = FALSE;
 
             /* Protect the local heap data block */
-            if(NULL == (dblk = (H5HL_dblk_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_DBLK, heap->dblk_addr, &dblk_udata, rw)))
-                HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to load heap data block")
+            if(NULL == (dblk = (H5HL_dblk_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_DBLK, heap->dblk_addr, &dblk_udata, flags)))
+                H5E_THROW(H5E_CANTPROTECT, "unable to load heap data block");
 
             /* Pin the prefix, if the data block was loaded from file */
             if(dblk_udata.loaded)
@@ -504,49 +389,43 @@ H5HL_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC_protect_t rw)
     /* Set return value */
     ret_value = heap;
 
-done:
+CATCH
     /* Release the prefix from the cache, now pinned */
-    if(prfx && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, prfx, prfx_cache_flags) < 0)
-        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, NULL, "unable to release local heap prefix")
+    if(prfx && heap && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, prfx, prfx_cache_flags) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release local heap prefix");
 
     /* Release the data block from the cache, now pinned */
-    if(dblk && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_DBLK, heap->dblk_addr, dblk, dblk_cache_flags) < 0)
-        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, NULL, "unable to release local heap data block")
+    if(dblk && heap && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_DBLK, heap->dblk_addr, dblk, dblk_cache_flags) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release local heap data block");
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_protect() */
+END_FUNC(PRIV) /* end H5HL_protect() */
 
 

 /*-------------------------------------------------------------------------
  * Function:    H5HL_offset_into
  *
  * Purpose:     Called directly after the call to H5HL_protect so that
- *              a pointer to the object in the heap can be got.
+ *              a pointer to the object in the heap can be obtained.
  *
  * Return:      Success:    Valid pointer.
- *              Failure:    NULL
+ *              Failure:    Can't fail
  *
  * Programmer:  Bill Wendling
- *              wendling at ncsa.uiuc.edu
  *              Sept. 17, 2003
  *
  *-------------------------------------------------------------------------
  */
-void *
-H5HL_offset_into(const H5HL_t *heap, size_t offset)
-{
-    /*
-     * We need to have called some other function before this to get a
-     * valid heap pointer. So, this can remain "FUNC_ENTER_NOAPI_NOINIT"
-     */
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+BEGIN_FUNC(PRIV, NOERR,
+void *, NULL, -,
+H5HL_offset_into(const H5HL_t *heap, size_t offset))
 
     /* Sanity check */
     HDassert(heap);
     HDassert(offset < heap->dblk_size);
 
-    FUNC_LEAVE_NOAPI(heap->dblk_image + offset)
-} /* end H5HL_offset_into() */
+    ret_value = heap->dblk_image + offset;
+
+END_FUNC(PRIV) /* end H5HL_offset_into() */
 
 

 /*-------------------------------------------------------------------------
@@ -554,21 +433,16 @@ H5HL_offset_into(const H5HL_t *heap, size_t offset)
  *
  * Purpose:     Unprotect the data retrieved by the H5HL_protect call.
  *
- * Return:      Success:    SUCCEED
- *              Failure:    FAIL
+ * Return:      SUCCEED/FAIL
  *
  * Programmer:  Bill Wendling
- *              wendling at ncsa.uiuc.edu
  *              Sept. 17, 2003
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5HL_unprotect(H5HL_t *heap)
-{
-    herr_t  ret_value = SUCCEED;
-
-    FUNC_ENTER_NOAPI(FAIL)
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5HL_unprotect(H5HL_t *heap))
 
     /* check arguments */
     HDassert(heap);
@@ -581,8 +455,8 @@ H5HL_unprotect(H5HL_t *heap)
         /* Check for separate heap data block */
         if(heap->single_cache_obj) {
             /* Mark local heap prefix as evictable again */
-            if(H5AC_unpin_entry(heap->prfx) < 0)
-                HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPIN, FAIL, "unable to unpin local heap data block")
+            if(FAIL == H5AC_unpin_entry(heap->prfx))
+                H5E_THROW(H5E_CANTUNPIN, "unable to unpin local heap data block");
         } /* end if */
         else {
             /* Sanity check */
@@ -590,34 +464,33 @@ H5HL_unprotect(H5HL_t *heap)
 
             /* Mark local heap data block as evictable again */
             /* (data block still pins prefix) */
-            if(H5AC_unpin_entry(heap->dblk) < 0)
-                HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPIN, FAIL, "unable to unpin local heap data block")
+            if(FAIL == H5AC_unpin_entry(heap->dblk))
+                H5E_THROW(H5E_CANTUNPIN, "unable to unpin local heap data block");
         } /* end else */
     } /* end if */
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_unprotect() */
+CATCH
+    /* No special processing on errors */
+
+END_FUNC(PRIV) /* end H5HL_unprotect() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_remove_free
+ * Function:    H5HL__remove_free
  *
- * Purpose:	Removes free list element FL from the specified heap and
- *		frees it.
+ * Purpose:     Removes free list element FL from the specified heap and
+ *              frees it.
  *
- * Return:	NULL
+ * Return:      NULL
  *
- * Programmer:	Robb Matzke
- *		matzke at llnl.gov
- *		Jul 17 1997
+ * Programmer:  Robb Matzke
+ *              Jul 17 1997
  *
  *-------------------------------------------------------------------------
  */
-static H5HL_free_t *
-H5HL_remove_free(H5HL_t *heap, H5HL_free_t *fl)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+BEGIN_FUNC(STATIC, NOERR,
+H5HL_free_t *, NULL, -,
+H5HL__remove_free(H5HL_t *heap, H5HL_free_t *fl))
 
     if(fl->prev)
         fl->prev->next = fl->next;
@@ -627,30 +500,27 @@ H5HL_remove_free(H5HL_t *heap, H5HL_free_t *fl)
     if(!fl->prev)
         heap->freelist = fl->next;
 
-    FUNC_LEAVE_NOAPI((H5HL_free_t *)H5FL_FREE(H5HL_free_t, fl))
-} /* end H5HL_remove_free() */
+    /* H5FL_FREE always returns NULL so we can't check for errors */
+    ret_value = (H5HL_free_t *)H5FL_FREE(H5HL_free_t, fl);
+
+END_FUNC(STATIC) /* end H5HL__remove_free() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_dirty
+ * Function:    H5HL__dirty
  *
- * Purpose:	Mark heap as dirty
+ * Purpose:     Mark heap as dirty
  *
- * Return:	Success:	Non-negative
- *		Failure:	Negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Oct 12 2008
+ * Programmer:  Quincey Koziol
+ *              Oct 12 2008
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5HL_dirty(H5HL_t *heap)
-{
-    herr_t ret_value = SUCCEED;         /* Return value */
-
-    FUNC_ENTER_NOAPI_NOINIT
+BEGIN_FUNC(STATIC, ERR,
+herr_t, SUCCEED, FAIL,
+H5HL__dirty(H5HL_t *heap))
 
     /* check arguments */
     HDassert(heap);
@@ -661,43 +531,41 @@ H5HL_dirty(H5HL_t *heap)
         /* Sanity check */
         HDassert(heap->dblk);
 
-        if(H5AC_mark_entry_dirty(heap->dblk) < 0)
-            HGOTO_ERROR(H5E_HEAP, H5E_CANTMARKDIRTY, FAIL, "unable to mark heap data block as dirty")
+        if(FAIL == H5AC_mark_entry_dirty(heap->dblk))
+            H5E_THROW(H5E_CANTMARKDIRTY, "unable to mark heap data block as dirty");
     } /* end if */
 
     /* Mark heap prefix as dirty */
-    if(H5AC_mark_entry_dirty(heap->prfx) < 0)
-        HGOTO_ERROR(H5E_HEAP, H5E_CANTMARKDIRTY, FAIL, "unable to mark heap prefix as dirty")
+    if(FAIL == H5AC_mark_entry_dirty(heap->prfx))
+        H5E_THROW(H5E_CANTMARKDIRTY, "unable to mark heap prefix as dirty");
+
+CATCH
+    /* No special processing on errors */
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_dirty() */
+END_FUNC(STATIC) /* end H5HL__dirty() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_insert
+ * Function:    H5HL_insert
  *
- * Purpose:	Inserts a new item into the heap.
+ * Purpose:     Inserts a new item into the heap.
  *
- * Return:	Success:	Offset of new item within heap.
- *		Failure:	UFAIL
+ * Return:      Success:    Offset of new item within heap.
+ *              Failure:    UFAIL
  *
- * Programmer:	Robb Matzke
- *		matzke at llnl.gov
- *		Jul 17 1997
+ * Programmer:  Robb Matzke
+ *              Jul 17 1997
  *
  *-------------------------------------------------------------------------
  */
-size_t
-H5HL_insert(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t buf_size, const void *buf)
-{
-    H5HL_free_t	*fl = NULL, *last_fl = NULL;
-    size_t	offset = 0;
-    size_t	need_size;
-    hbool_t	found;
-    size_t	ret_value;      /* Return value */
+BEGIN_FUNC(PRIV, ERR,
+size_t, UFAIL, UFAIL,
+H5HL_insert(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t buf_size, const void *buf))
 
-    FUNC_ENTER_NOAPI(UFAIL)
+    H5HL_free_t     *fl = NULL, *last_fl = NULL;
+    size_t          offset = 0;
+    size_t          need_size;
+    hbool_t         found;
 
     /* check arguments */
     HDassert(f);
@@ -711,8 +579,8 @@ H5HL_insert(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t buf_size, const void *
      *  so we just accept that an extra flush of the heap info could occur
      *  if an error occurs -QAK)
      */
-    if(H5HL_dirty(heap) < 0)
-        HGOTO_ERROR(H5E_HEAP, H5E_CANTMARKDIRTY, UFAIL, "unable to mark heap as dirty")
+    if(FAIL == H5HL__dirty(heap))
+        H5E_THROW(H5E_CANTMARKDIRTY, "unable to mark heap as dirty");
 
     /*
      * In order to keep the free list descriptors aligned on word boundaries,
@@ -726,26 +594,25 @@ H5HL_insert(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t buf_size, const void *
      * leave zero or at least H5G_SIZEOF_FREE bytes left over.
      */
     for(fl = heap->freelist, found = FALSE; fl; fl = fl->next) {
-	if(fl->size > need_size &&
-                fl->size - need_size >= H5HL_SIZEOF_FREE(f)) {
-	    /* a big enough free block was found */
-	    offset = fl->offset;
-	    fl->offset += need_size;
-	    fl->size -= need_size;
-	    HDassert(fl->offset == H5HL_ALIGN(fl->offset));
-	    HDassert(fl->size == H5HL_ALIGN(fl->size));
-	    found = TRUE;
-	    break;
-	} else if(fl->size == need_size) {
-	    /* free block of exact size found */
-	    offset = fl->offset;
-	    fl = H5HL_remove_free(heap, fl);
-	    found = TRUE;
-	    break;
-	} else if(!last_fl || last_fl->offset < fl->offset) {
-	    /* track free space that's closest to end of heap */
-	    last_fl = fl;
-	}
+        if(fl->size > need_size && fl->size - need_size >= H5HL_SIZEOF_FREE(f)) {
+            /* a big enough free block was found */
+            offset = fl->offset;
+            fl->offset += need_size;
+            fl->size -= need_size;
+            HDassert(fl->offset == H5HL_ALIGN(fl->offset));
+            HDassert(fl->size == H5HL_ALIGN(fl->size));
+            found = TRUE;
+            break;
+        } else if(fl->size == need_size) {
+            /* free block of exact size found */
+            offset = fl->offset;
+            fl = H5HL__remove_free(heap, fl);
+            found = TRUE;
+            break;
+        } else if(!last_fl || last_fl->offset < fl->offset) {
+            /* track free space that's closest to end of heap */
+            last_fl = fl;
+        }
     } /* end for */
 
     /*
@@ -762,7 +629,7 @@ H5HL_insert(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t buf_size, const void *
 
         /* At least double the heap's size, making certain there's enough room
          * for the new object */
-	need_more = MAX(need_size, heap->dblk_size);
+        need_more = MAX(need_size, heap->dblk_size);
 
         /* If there is no last free block or it's not at the end of the heap,
          * and the amount of space to allocate is not big enough to include at
@@ -770,106 +637,104 @@ H5HL_insert(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t buf_size, const void *
          * space requested to just the amount of space needed.  (Generally
          * speaking, this only occurs when the heap is small -QAK)
          */
-	if(!(last_fl && last_fl->offset + last_fl->size == heap->dblk_size)
+        if(!(last_fl && last_fl->offset + last_fl->size == heap->dblk_size)
                 && (need_more < (need_size + H5HL_SIZEOF_FREE(f))))
             need_more = need_size;
 
-	new_dblk_size = heap->dblk_size + need_more;
-	HDassert(heap->dblk_size < new_dblk_size);
+        new_dblk_size = heap->dblk_size + need_more;
+        HDassert(heap->dblk_size < new_dblk_size);
         old_dblk_size = heap->dblk_size;
-	H5_CHECK_OVERFLOW(heap->dblk_size, size_t, hsize_t);
-	H5_CHECK_OVERFLOW(new_dblk_size, size_t, hsize_t);
+        H5_CHECK_OVERFLOW(heap->dblk_size, size_t, hsize_t);
+        H5_CHECK_OVERFLOW(new_dblk_size, size_t, hsize_t);
 
         /* Extend current heap if possible */
-	was_extended = H5MF_try_extend(f, dxpl_id, H5FD_MEM_LHEAP, heap->dblk_addr, (hsize_t)(heap->dblk_size), (hsize_t)need_more);
-        if(was_extended < 0)
-            HGOTO_ERROR(H5E_HEAP, H5E_CANTEXTEND, UFAIL, "error trying to extend heap")
+        was_extended = H5MF_try_extend(f, dxpl_id, H5FD_MEM_LHEAP, heap->dblk_addr, (hsize_t)(heap->dblk_size), (hsize_t)need_more);
+        if(FAIL == was_extended)
+            H5E_THROW(H5E_CANTEXTEND, "error trying to extend heap");
 
         /* Check if we extended the heap data block in file */
         if(was_extended == TRUE) {
             /* Check for prefix & data block contiguous */
             if(heap->single_cache_obj) {
                 /* Resize prefix+data block */
-                if(H5AC_resize_entry(heap->prfx, (size_t)(heap->prfx_size + new_dblk_size)) < 0)
-                    HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, UFAIL, "unable to resize heap prefix in cache")
+                if(FAIL == H5AC_resize_entry(heap->prfx, (size_t)(heap->prfx_size + new_dblk_size)))
+                    H5E_THROW(H5E_CANTRESIZE, "unable to resize heap prefix in cache");
             } /* end if */
             else {
                 /* Resize 'standalone' data block */
-                if(H5AC_resize_entry(heap->dblk, (size_t)new_dblk_size) < 0)
-                    HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, UFAIL, "unable to resize heap data block in cache")
+                if(FAIL == H5AC_resize_entry(heap->dblk, (size_t)new_dblk_size))
+                    H5E_THROW(H5E_CANTRESIZE, "unable to resize heap data block in cache");
             } /* end else */
 
             /* Note new size */
             heap->dblk_size = new_dblk_size;
-	} /* end if */
+        } /* end if */
         else { /* ...if we can't, allocate a new chunk & release the old */
             /* Reallocate data block in file */
-            if(H5HL_dblk_realloc(f, dxpl_id, heap, new_dblk_size) < 0)
-                HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, UFAIL, "reallocating data block failed")
-	} /* end if */
+            if(FAIL == H5HL__dblk_realloc(f, dxpl_id, heap, new_dblk_size))
+                H5E_THROW(H5E_CANTRESIZE, "reallocating data block failed");
+        } /* end if */
 
         /* If the last free list in the heap is at the end of the heap, extend it */
-	if(last_fl && last_fl->offset + last_fl->size == old_dblk_size) {
-	    /*
-	     * Increase the size of the last free block.
-	     */
-	    offset = last_fl->offset;
-	    last_fl->offset += need_size;
-	    last_fl->size += need_more - need_size;
-	    HDassert(last_fl->offset == H5HL_ALIGN(last_fl->offset));
-	    HDassert(last_fl->size == H5HL_ALIGN(last_fl->size));
-
-	    if (last_fl->size < H5HL_SIZEOF_FREE(f)) {
+        if(last_fl && last_fl->offset + last_fl->size == old_dblk_size) {
+            /*
+             * Increase the size of the last free block.
+             */
+            offset = last_fl->offset;
+            last_fl->offset += need_size;
+            last_fl->size += need_more - need_size;
+            HDassert(last_fl->offset == H5HL_ALIGN(last_fl->offset));
+            HDassert(last_fl->size == H5HL_ALIGN(last_fl->size));
+
+            if (last_fl->size < H5HL_SIZEOF_FREE(f)) {
 #ifdef H5HL_DEBUG
-		if (H5DEBUG(HL) && last_fl->size) {
-		    fprintf(H5DEBUG(HL), "H5HL: lost %lu bytes at line %d\n",
-			    (unsigned long)(last_fl->size), __LINE__);
-		}
+                if (H5DEBUG(HL) && last_fl->size) {
+                    HDfprintf(H5DEBUG(HL), "H5HL: lost %lu bytes at line %d\n",
+                        (unsigned long)(last_fl->size), __LINE__);
+                }
 #endif
-		last_fl = H5HL_remove_free(heap, last_fl);
-	    }
-	} /* end if */
+                last_fl = H5HL__remove_free(heap, last_fl);
+            }
+        } /* end if */
         else {
-	    /*
-	     * Create a new free list element large enough that we can
-	     * take some space out of it right away.
-	     */
-	    offset = old_dblk_size;
-	    if(need_more - need_size >= H5HL_SIZEOF_FREE(f)) {
-		if(NULL == (fl = H5FL_MALLOC(H5HL_free_t)))
-		    HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, UFAIL, "memory allocation failed")
-		fl->offset = old_dblk_size + need_size;
-		fl->size = need_more - need_size;
-		HDassert(fl->offset == H5HL_ALIGN(fl->offset));
-		HDassert(fl->size == H5HL_ALIGN(fl->size));
-		fl->prev = NULL;
-		fl->next = heap->freelist;
-		if(heap->freelist)
+            /*
+             * Create a new free list element large enough that we can
+             * take some space out of it right away.
+             */
+            offset = old_dblk_size;
+            if(need_more - need_size >= H5HL_SIZEOF_FREE(f)) {
+                if(NULL == (fl = H5FL_MALLOC(H5HL_free_t)))
+                    H5E_THROW(H5E_CANTALLOC, "memory allocation failed");
+                fl->offset = old_dblk_size + need_size;
+                fl->size = need_more - need_size;
+                HDassert(fl->offset == H5HL_ALIGN(fl->offset));
+                HDassert(fl->size == H5HL_ALIGN(fl->size));
+                fl->prev = NULL;
+                fl->next = heap->freelist;
+                if(heap->freelist)
                     heap->freelist->prev = fl;
-		heap->freelist = fl;
+                heap->freelist = fl;
 #ifdef H5HL_DEBUG
-	    } else if (H5DEBUG(HL) && need_more > need_size) {
-		fprintf(H5DEBUG(HL),
-			"H5HL_insert: lost %lu bytes at line %d\n",
-			(unsigned long)(need_more - need_size), __LINE__);
+            } else if (H5DEBUG(HL) && need_more > need_size) {
+                HDfprintf(H5DEBUG(HL), "H5HL_insert: lost %lu bytes at line %d\n",
+                    (unsigned long)(need_more - need_size), __LINE__);
 #endif
-	    }
-	} /* end else */
+            }
+        } /* end else */
 
 #ifdef H5HL_DEBUG
-	if (H5DEBUG(HL)) {
-	    fprintf(H5DEBUG(HL),
-		    "H5HL: resize mem buf from %lu to %lu bytes\n",
-		    (unsigned long)(old_dblk_size),
-		    (unsigned long)(old_dblk_size + need_more));
-	}
+        if (H5DEBUG(HL)) {
+            HDfprintf(H5DEBUG(HL), "H5HL: resize mem buf from %lu to %lu bytes\n",
+                (unsigned long)(old_dblk_size),
+                (unsigned long)(old_dblk_size + need_more));
+        }
 #endif
-	if(NULL == (heap->dblk_image = H5FL_BLK_REALLOC(lheap_chunk, heap->dblk_image, heap->dblk_size)))
-	    HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, UFAIL, "memory allocation failed")
+        if(NULL == (heap->dblk_image = H5FL_BLK_REALLOC(lheap_chunk, heap->dblk_image, heap->dblk_size)))
+            H5E_THROW(H5E_CANTALLOC, "memory allocation failed");
 
-	/* Clear new section so junk doesn't appear in the file */
+        /* Clear new section so junk doesn't appear in the file */
         /* (Avoid clearing section which will be overwritten with newly inserted data) */
-	HDmemset(heap->dblk_image + offset + buf_size, 0, (new_dblk_size - (offset + buf_size)));
+        HDmemset(heap->dblk_image + offset + buf_size, 0, (new_dblk_size - (offset + buf_size)));
     } /* end if */
 
     /* Copy the data into the heap */
@@ -878,42 +743,40 @@ H5HL_insert(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t buf_size, const void *
     /* Set return value */
     ret_value = offset;
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* H5HL_insert() */
+CATCH
+    /* No special processing on errors */
+
+END_FUNC(PRIV) /* H5HL_insert() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_remove
+ * Function:    H5HL_remove
  *
- * Purpose:	Removes an object or part of an object from the heap at
- *		address ADDR of file F.	 The object (or part) to remove
- *		begins at byte OFFSET from the beginning of the heap and
- *		continues for SIZE bytes.
+ * Purpose:     Removes an object or part of an object from the heap at
+ *              address ADDR of file F.	 The object (or part) to remove
+ *              begins at byte OFFSET from the beginning of the heap and
+ *              continues for SIZE bytes.
  *
- *		Once part of an object is removed, one must not attempt
- *		to access that part.  Removing the beginning of an object
- *		results in the object OFFSET increasing by the amount
- *		truncated.  Removing the end of an object results in
- *		object truncation.  Removing the middle of an object results
- *		in two separate objects, one at the original offset and
- *		one at the first offset past the removed portion.
+ *              Once part of an object is removed, one must not attempt
+ *              to access that part.  Removing the beginning of an object
+ *              results in the object OFFSET increasing by the amount
+ *              truncated.  Removing the end of an object results in
+ *              object truncation.  Removing the middle of an object results
+ *              in two separate objects, one at the original offset and
+ *              one at the first offset past the removed portion.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Robb Matzke
- *		matzke at llnl.gov
- *		Jul 16 1997
+ * Programmer:  Robb Matzke
+ *              Jul 16 1997
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5HL_remove(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t offset, size_t size)
-{
-    H5HL_free_t		*fl = NULL;
-    herr_t      	ret_value = SUCCEED;       /* Return value */
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5HL_remove(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t offset, size_t size))
 
-    FUNC_ENTER_NOAPI(FAIL)
+    H5HL_free_t *fl = NULL;
 
     /* check arguments */
     HDassert(f);
@@ -932,8 +795,8 @@ H5HL_remove(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t offset, size_t size)
      *  so we just accept that an extra flush of the heap info could occur
      *  if an error occurs -QAK)
      */
-    if(H5HL_dirty(heap) < 0)
-        HGOTO_ERROR(H5E_HEAP, H5E_CANTMARKDIRTY, FAIL, "unable to mark heap as dirty")
+    if(FAIL == H5HL__dirty(heap))
+        H5E_THROW(H5E_CANTMARKDIRTY, "unable to mark heap as dirty");
 
     /*
      * Check if this chunk can be prepended or appended to an already
@@ -944,60 +807,60 @@ H5HL_remove(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t offset, size_t size)
     while(fl) {
         H5HL_free_t *fl2 = NULL;
 
-	if((offset + size) == fl->offset) {
-	    fl->offset = offset;
-	    fl->size += size;
-	    HDassert(fl->offset == H5HL_ALIGN(fl->offset));
-	    HDassert(fl->size == H5HL_ALIGN(fl->size));
-	    fl2 = fl->next;
-	    while(fl2) {
-		if((fl2->offset + fl2->size) == fl->offset) {
-		    fl->offset = fl2->offset;
-		    fl->size += fl2->size;
-		    HDassert(fl->offset == H5HL_ALIGN(fl->offset));
-		    HDassert(fl->size == H5HL_ALIGN(fl->size));
-		    fl2 = H5HL_remove_free(heap, fl2);
-	            if(((fl->offset + fl->size) == heap->dblk_size) &&
+        if((offset + size) == fl->offset) {
+            fl->offset = offset;
+            fl->size += size;
+            HDassert(fl->offset == H5HL_ALIGN(fl->offset));
+            HDassert(fl->size == H5HL_ALIGN(fl->size));
+            fl2 = fl->next;
+            while(fl2) {
+                if((fl2->offset + fl2->size) == fl->offset) {
+                    fl->offset = fl2->offset;
+                    fl->size += fl2->size;
+                    HDassert(fl->offset == H5HL_ALIGN(fl->offset));
+                    HDassert(fl->size == H5HL_ALIGN(fl->size));
+                    fl2 = H5HL__remove_free(heap, fl2);
+                    if(((fl->offset + fl->size) == heap->dblk_size) &&
                              ((2 * fl->size) > heap->dblk_size)) {
-                        if(H5HL_minimize_heap_space(f, dxpl_id, heap) < 0)
-	                    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "heap size minimization failed")
+                        if(FAIL == H5HL__minimize_heap_space(f, dxpl_id, heap))
+                            H5E_THROW(H5E_CANTFREE, "heap size minimization failed");
                     }
-		    HGOTO_DONE(SUCCEED);
-		}
-		fl2 = fl2->next;
-	    }
-	    if(((fl->offset + fl->size) == heap->dblk_size) &&
+                    H5_LEAVE(SUCCEED);
+                }
+                fl2 = fl2->next;
+            }
+            if(((fl->offset + fl->size) == heap->dblk_size) &&
                      ((2 * fl->size) > heap->dblk_size)) {
-                if(H5HL_minimize_heap_space(f, dxpl_id, heap) < 0)
-	            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "heap size minimization failed")
+                if(FAIL == H5HL__minimize_heap_space(f, dxpl_id, heap))
+                    H5E_THROW(H5E_CANTFREE, "heap size minimization failed");
             }
-	    HGOTO_DONE(SUCCEED);
-	} else if(fl->offset + fl->size == offset) {
-	    fl->size += size;
-	    fl2 = fl->next;
-	    HDassert(fl->size == H5HL_ALIGN(fl->size));
-	    while(fl2) {
-		if(fl->offset + fl->size == fl2->offset) {
-		    fl->size += fl2->size;
-		    HDassert(fl->size == H5HL_ALIGN(fl->size));
-		    fl2 = H5HL_remove_free(heap, fl2);
-	            if(((fl->offset + fl->size) == heap->dblk_size) &&
-                            ((2 * fl->size) > heap->dblk_size)) {
-                        if(H5HL_minimize_heap_space(f, dxpl_id, heap) < 0)
-	                    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "heap size minimization failed")
+            H5_LEAVE(SUCCEED);
+        } else if(fl->offset + fl->size == offset) {
+            fl->size += size;
+            fl2 = fl->next;
+            HDassert(fl->size == H5HL_ALIGN(fl->size));
+            while(fl2) {
+                if(fl->offset + fl->size == fl2->offset) {
+                    fl->size += fl2->size;
+                    HDassert(fl->size == H5HL_ALIGN(fl->size));
+                    fl2 = H5HL__remove_free(heap, fl2);
+                    if(((fl->offset + fl->size) == heap->dblk_size) &&
+                        ((2 * fl->size) > heap->dblk_size)) {
+                        if(FAIL == H5HL__minimize_heap_space(f, dxpl_id, heap))
+                            H5E_THROW(H5E_CANTFREE, "heap size minimization failed");
                     } /* end if */
-		    HGOTO_DONE(SUCCEED);
-		} /* end if */
-		fl2 = fl2->next;
-	    } /* end while */
-	    if(((fl->offset + fl->size) == heap->dblk_size) &&
+                    H5_LEAVE(SUCCEED);
+                } /* end if */
+                fl2 = fl2->next;
+            } /* end while */
+            if(((fl->offset + fl->size) == heap->dblk_size) &&
                     ((2 * fl->size) > heap->dblk_size)) {
-                if(H5HL_minimize_heap_space(f, dxpl_id, heap) < 0)
-	            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "heap size minimization failed")
+                if(FAIL == H5HL__minimize_heap_space(f, dxpl_id, heap))
+                    H5E_THROW(H5E_CANTFREE, "heap size minimization failed");
             } /* end if */
-	    HGOTO_DONE(SUCCEED);
-	} /* end if */
-	fl = fl->next;
+            H5_LEAVE(SUCCEED);
+        } /* end if */
+        fl = fl->next;
     } /* end while */
 
     /*
@@ -1007,19 +870,18 @@ H5HL_remove(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t offset, size_t size)
      */
     if(size < H5HL_SIZEOF_FREE(f)) {
 #ifdef H5HL_DEBUG
-	if(H5DEBUG(HL)) {
-	    fprintf(H5DEBUG(HL), "H5HL: lost %lu bytes\n",
-		    (unsigned long) size);
-	}
+        if(H5DEBUG(HL)) {
+            HDfprintf(H5DEBUG(HL), "H5HL: lost %lu bytes\n", (unsigned long) size);
+        }
 #endif
-	HGOTO_DONE(SUCCEED);
+        H5_LEAVE(SUCCEED);
     } /* end if */
 
     /*
      * Add an entry to the free list.
      */
     if(NULL == (fl = H5FL_MALLOC(H5HL_free_t)))
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "memory allocation failed")
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed");
     fl->offset = offset;
     fl->size = size;
     HDassert(fl->offset == H5HL_ALIGN(fl->offset));
@@ -1032,53 +894,53 @@ H5HL_remove(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t offset, size_t size)
 
     if(((fl->offset + fl->size) == heap->dblk_size) &&
             ((2 * fl->size) > heap->dblk_size)) {
-        if(H5HL_minimize_heap_space(f, dxpl_id, heap) < 0)
-            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "heap size minimization failed")
+        if(FAIL == H5HL__minimize_heap_space(f, dxpl_id, heap))
+            H5E_THROW(H5E_CANTFREE, "heap size minimization failed");
     } /* end if */
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_remove() */
+CATCH
+    /* No special processing on exit */
+
+END_FUNC(PRIV) /* end H5HL_remove() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_delete
+ * Function:    H5HL_delete
  *
- * Purpose:	Deletes a local heap from disk, freeing disk space used.
+ * Purpose:     Deletes a local heap from disk, freeing disk space used.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Mar 22 2003
+ * Programmer:  Quincey Koziol
+ *              Mar 22 2003
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5HL_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr)
-{
-    H5HL_t	*heap;                  /* Local heap to delete */
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5HL_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr))
+
+    H5HL_t      *heap = NULL;           /* Local heap to delete */
     H5HL_cache_prfx_ud_t prfx_udata;    /* User data for protecting local heap prefix */
     H5HL_prfx_t *prfx = NULL;           /* Local heap prefix */
     H5HL_dblk_t *dblk = NULL;           /* Local heap data block */
     unsigned    cache_flags = H5AC__NO_FLAGS_SET;       /* Flags for unprotecting heap */
-    herr_t      ret_value = SUCCEED;    /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
 
     /* check arguments */
     HDassert(f);
     HDassert(H5F_addr_defined(addr));
 
     /* Construct the user data for protect callback */
+    prfx_udata.made_attempt = FALSE;
     prfx_udata.sizeof_size = H5F_SIZEOF_SIZE(f);
     prfx_udata.sizeof_addr = H5F_SIZEOF_ADDR(f);
     prfx_udata.prfx_addr = addr;
     prfx_udata.sizeof_prfx = H5HL_SIZEOF_HDR(f);
+    prfx_udata.loaded = FALSE;
 
     /* Protect the local heap prefix */
-    if(NULL == (prfx = (H5HL_prfx_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_PRFX, addr, &prfx_udata, H5AC_WRITE)))
-        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load heap prefix")
+    if(NULL == (prfx = (H5HL_prfx_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_PRFX, addr, &prfx_udata, H5AC__NO_FLAGS_SET)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to load heap prefix");
 
     /* Get the pointer to the heap */
     heap = prfx->heap;
@@ -1092,54 +954,50 @@ H5HL_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr)
         dblk_udata.loaded = FALSE;
 
         /* Protect the local heap data block */
-        if(NULL == (dblk = (H5HL_dblk_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_DBLK, heap->dblk_addr, &dblk_udata, H5AC_WRITE)))
-            HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load heap data block")
+        if(NULL == (dblk = (H5HL_dblk_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_DBLK, heap->dblk_addr, &dblk_udata, H5AC__NO_FLAGS_SET)))
+            H5E_THROW(H5E_CANTPROTECT, "unable to load heap data block");
 
         /* Pin the prefix, if the data block was loaded from file */
         if(dblk_udata.loaded) {
-            if(H5AC_pin_protected_entry(prfx) < 0)
-                HGOTO_ERROR(H5E_HEAP, H5E_CANTPIN, FAIL, "unable to pin local heap prefix")
+            if(FAIL == H5AC_pin_protected_entry(prfx))
+                H5E_THROW(H5E_CANTPIN, "unable to pin local heap prefix");
         } /* end if */
     } /* end if */
 
     /* Set the flags for releasing the prefix and data block */
     cache_flags |= H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
 
-done:
+CATCH
     /* Release the data block from the cache, now deleted */
-    if(dblk && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_DBLK, heap->dblk_addr, dblk, cache_flags) < 0)
-        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release local heap data block")
+    if(dblk && heap && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_DBLK, heap->dblk_addr, dblk, cache_flags) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release local heap data block");
 
     /* Release the prefix from the cache, now deleted */
-    if(prfx && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, prfx, cache_flags) < 0)
-        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release local heap prefix")
+    if(prfx && heap && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, prfx, cache_flags) < 0)
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release local heap prefix");
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_delete() */
+END_FUNC(PRIV) /* end H5HL_delete() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_get_size
+ * Function:    H5HL_get_size
  *
- * Purpose:	Retrieves the current size of a heap
+ * Purpose:     Retrieves the current size of a heap
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Nov  7 2005
+ * Programmer:  Quincey Koziol
+ *              Nov  7 2005
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5HL_get_size(H5F_t *f, hid_t dxpl_id, haddr_t addr, size_t *size)
-{
-    H5HL_cache_prfx_ud_t prfx_udata;      /* User data for protecting local heap prefix */
-    H5HL_prfx_t *prfx = NULL;   /* Local heap prefix */
-    H5HL_t *heap;               /* Heap data structure */
-    herr_t ret_value = SUCCEED; /* Return value */
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5HL_get_size(H5F_t *f, hid_t dxpl_id, haddr_t addr, size_t *size))
 
-    FUNC_ENTER_NOAPI(FAIL)
+    H5HL_cache_prfx_ud_t prfx_udata;    /* User data for protecting local heap prefix */
+    H5HL_prfx_t *prfx = NULL;           /* Local heap prefix */
+    H5HL_t *heap;                       /* Heap data structure */
 
     /* check arguments */
     HDassert(f);
@@ -1147,14 +1005,16 @@ H5HL_get_size(H5F_t *f, hid_t dxpl_id, haddr_t addr, size_t *size)
     HDassert(size);
 
     /* Construct the user data for protect callback */
+    prfx_udata.made_attempt = FALSE;
     prfx_udata.sizeof_size = H5F_SIZEOF_SIZE(f);
     prfx_udata.sizeof_addr = H5F_SIZEOF_ADDR(f);
     prfx_udata.prfx_addr = addr;
     prfx_udata.sizeof_prfx = H5HL_SIZEOF_HDR(f);
+    prfx_udata.loaded = FALSE;
 
     /* Protect the local heap prefix */
-    if(NULL == (prfx = (H5HL_prfx_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_PRFX, addr, &prfx_udata, H5AC_READ)))
-        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load heap prefix")
+    if(NULL == (prfx = (H5HL_prfx_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_PRFX, addr, &prfx_udata, H5AC__READ_ONLY_FLAG)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to load heap prefix");
 
     /* Get the pointer to the heap */
     heap = prfx->heap;
@@ -1162,12 +1022,11 @@ H5HL_get_size(H5F_t *f, hid_t dxpl_id, haddr_t addr, size_t *size)
     /* Set the size to return */
     *size = heap->dblk_size;
 
-done:
-    if(prfx && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, prfx, H5AC__NO_FLAGS_SET) < 0)
-        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release local heap prefix")
+CATCH
+    if(prfx && FAIL == H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, prfx, H5AC__NO_FLAGS_SET))
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release local heap prefix");
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_get_size() */
+END_FUNC(PRIV) /* end H5HL_get_size() */
 
 

 /*-------------------------------------------------------------------------
@@ -1176,22 +1035,20 @@ done:
  * Purpose:     Compute the size in bytes of the specified instance of
  *              H5HL_t via H5HL_size()
  *
- * Return:      Non-negative on success/Negative on failure
+ * Return:      SUCCEED/FAIL
  *
  * Programmer:  Vailin Choi
  *              June 19 2007
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5HL_heapsize(H5F_t *f, hid_t dxpl_id, haddr_t addr, hsize_t *heap_size)
-{
-    H5HL_cache_prfx_ud_t prfx_udata;      /* User data for protecting local heap prefix */
-    H5HL_prfx_t *prfx = NULL;   /* Local heap prefix */
-    H5HL_t *heap;               /* Heap data structure */
-    herr_t ret_value = SUCCEED;    /* Return value */
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5HL_heapsize(H5F_t *f, hid_t dxpl_id, haddr_t addr, hsize_t *heap_size))
 
-    FUNC_ENTER_NOAPI(FAIL)
+    H5HL_cache_prfx_ud_t prfx_udata;    /* User data for protecting local heap prefix */
+    H5HL_prfx_t *prfx = NULL;           /* Local heap prefix */
+    H5HL_t *heap;                       /* Heap data structure */
 
     /* check arguments */
     HDassert(f);
@@ -1199,14 +1056,16 @@ H5HL_heapsize(H5F_t *f, hid_t dxpl_id, haddr_t addr, hsize_t *heap_size)
     HDassert(heap_size);
 
     /* Construct the user data for protect callback */
+    prfx_udata.made_attempt = FALSE;
     prfx_udata.sizeof_size = H5F_SIZEOF_SIZE(f);
     prfx_udata.sizeof_addr = H5F_SIZEOF_ADDR(f);
     prfx_udata.prfx_addr = addr;
     prfx_udata.sizeof_prfx = H5HL_SIZEOF_HDR(f);
+    prfx_udata.loaded = FALSE;
 
     /* Protect the local heap prefix */
-    if(NULL == (prfx = (H5HL_prfx_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_PRFX, addr, &prfx_udata, H5AC_READ)))
-        HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load heap prefix")
+    if(NULL == (prfx = (H5HL_prfx_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_PRFX, addr, &prfx_udata, H5AC__READ_ONLY_FLAG)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to load heap prefix");
 
     /* Get the pointer to the heap */
     heap = prfx->heap;
@@ -1214,10 +1073,9 @@ H5HL_heapsize(H5F_t *f, hid_t dxpl_id, haddr_t addr, hsize_t *heap_size)
     /* Accumulate the size of the local heap */
     *heap_size += (hsize_t)(heap->prfx_size + heap->dblk_size);
 
-done:
-    if(prfx && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, prfx, H5AC__NO_FLAGS_SET) < 0)
-        HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release local heap prefix")
+CATCH
+    if(prfx && FAIL == H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, prfx, H5AC__NO_FLAGS_SET))
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release local heap prefix");
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_heapsize() */
+END_FUNC(PRIV) /* end H5HL_heapsize() */
 
diff --git a/src/H5HLcache.c b/src/H5HLcache.c
index e4ffd5a..678da7f 100644
--- a/src/H5HLcache.c
+++ b/src/H5HLcache.c
@@ -15,11 +15,11 @@
 
 /*-------------------------------------------------------------------------
  *
- * Created:		H5HLcache.c
- *			Feb  5 2008
- *			Quincey Koziol <koziol at hdfgroup.org>
+ * Created:     H5HLcache.c
+ *              Feb  5 2008
+ *              Quincey Koziol <koziol at hdfgroup.org>
  *
- * Purpose:		Implement local heap metadata cache methods.
+ * Purpose:     Implement local heap metadata cache methods.
  *
  *-------------------------------------------------------------------------
  */
@@ -28,30 +28,31 @@
 /* Module Setup */
 /****************/
 
-#define H5HL_PACKAGE		/* Suppress error about including H5HLpkg */
+#include "H5HLmodule.h"         /* This source code file is part of the H5HL module */
 
 
 /***********/
 /* Headers */
 /***********/
-#include "H5private.h"		/* Generic Functions			*/
-#include "H5Eprivate.h"		/* Error handling		  	*/
-#include "H5HLpkg.h"		/* Local Heaps				*/
-#include "H5MFprivate.h"	/* File memory management		*/
-#include "H5WBprivate.h"        /* Wrapped Buffers                      */
+#include "H5private.h"      /* Generic Functions            */
+#include "H5Eprivate.h"     /* Error handling               */
+#include "H5HLpkg.h"        /* Local Heaps                  */
+#include "H5MFprivate.h"    /* File memory management       */
+#include "H5WBprivate.h"    /* Wrapped Buffers              */
 
 
 /****************/
 /* Local Macros */
 /****************/
 
-#define H5HL_VERSION	0               /* Local heap collection version    */
+#define H5HL_VERSION    0               /* Local heap collection version    */
 
-/* Set the local heap size to speculatively read in */
-/* (needs to be more than the local heap prefix size to work at all and
+/* Set the local heap size to speculatively read in
+ *      (needs to be more than the local heap prefix size to work at all and
  *      should be larger than the default local heap size to save the
- *      extra I/O operations) */
-#define H5HL_SPEC_READ_SIZE 512
+ *      extra I/O operations)
+ */
+#define H5HL_SPEC_READ_SIZE     512
 
 
 /******************/
@@ -69,19 +70,35 @@
 /********************/
 
 /* Metadata cache callbacks */
-static void *H5HL_prefix_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static herr_t H5HL_prefix_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest, haddr_t addr,
-    void *thing, unsigned *flags_ptr);
-static herr_t H5HL_prefix_dest(H5F_t *f, void *thing);
-static herr_t H5HL_prefix_clear(H5F_t *f, void *thing, hbool_t destroy);
-static herr_t H5HL_prefix_size(const H5F_t *f, const void *thing, size_t *size_ptr);
-static void *H5HL_datablock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static herr_t H5HL_datablock_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest, haddr_t addr,
-    void *thing, unsigned *flags_ptr);
-static herr_t H5HL_datablock_dest(H5F_t *f, void *thing);
-static herr_t H5HL_datablock_clear(H5F_t *f, void *thing, hbool_t destroy);
-static herr_t H5HL_datablock_size(const H5F_t *f, const void *thing, size_t *size_ptr);
-
+/* Local heap prefix */
+static herr_t H5HL__cache_prefix_get_load_size(const void *_image, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static void *H5HL__cache_prefix_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty);
+static herr_t H5HL__cache_prefix_image_len(const void *thing, 
+    size_t *image_len, hbool_t *compressed_ptr, 
+    size_t *compressed_image_len_ptr);
+static herr_t H5HL__cache_prefix_serialize(const H5F_t *f, void *image,
+    size_t len, void *thing); 
+static herr_t H5HL__cache_prefix_free_icr(void *thing);
+
+/* Local heap data block */
+static herr_t H5HL__cache_datablock_get_load_size(const void *_image, void *udata,
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static void *H5HL__cache_datablock_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty); 
+static herr_t H5HL__cache_datablock_image_len(const void *thing, 
+    size_t *image_len, hbool_t *compressed_ptr, 
+    size_t *compressed_image_len_ptr);
+static herr_t H5HL__cache_datablock_serialize(const H5F_t *f, void *image,
+    size_t len, void *thing); 
+static herr_t H5HL__cache_datablock_free_icr(void *thing);
+
+/* Free list de/serialization */
+static herr_t H5HL__fl_deserialize(H5HL_t *heap);
+static void H5HL__fl_serialize(const H5HL_t *heap);
 
 /*********************/
 /* Package Variables */
@@ -89,21 +106,37 @@ static herr_t H5HL_datablock_size(const H5F_t *f, const void *thing, size_t *siz
 
 /* H5HL inherits cache-like properties from H5AC */
 const H5AC_class_t H5AC_LHEAP_PRFX[1] = {{
-    H5AC_LHEAP_PRFX_ID,
-    H5HL_prefix_load,
-    H5HL_prefix_flush,
-    H5HL_prefix_dest,
-    H5HL_prefix_clear,
-    H5HL_prefix_size,
+    H5AC_LHEAP_PRFX_ID,                 /* Metadata client ID */
+    "local heap prefix",                /* Metadata client name (for debugging) */
+    H5FD_MEM_LHEAP,                     /* File space memory type for client */
+    H5AC__CLASS_SPECULATIVE_LOAD_FLAG,  /* Client class behavior flags */
+    H5HL__cache_prefix_get_load_size,   /* 'get_load_size' callback */
+    NULL,				/* 'verify_chksum' callback */
+    H5HL__cache_prefix_deserialize,     /* 'deserialize' callback */
+    H5HL__cache_prefix_image_len,       /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5HL__cache_prefix_serialize,       /* 'serialize' callback */
+    NULL,                               /* 'notify' callback */
+    H5HL__cache_prefix_free_icr,        /* 'free_icr' callback */
+    NULL,                               /* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
 }};
 
 const H5AC_class_t H5AC_LHEAP_DBLK[1] = {{
-    H5AC_LHEAP_DBLK_ID,
-    H5HL_datablock_load,
-    H5HL_datablock_flush,
-    H5HL_datablock_dest,
-    H5HL_datablock_clear,
-    H5HL_datablock_size,
+    H5AC_LHEAP_DBLK_ID,                 /* Metadata client ID */
+    "local heap datablock",             /* Metadata client name (for debugging) */
+    H5FD_MEM_LHEAP,                     /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5HL__cache_datablock_get_load_size,/* 'get_load_size' callback */
+    NULL,				/* 'verify_chksum' callback */
+    H5HL__cache_datablock_deserialize,  /* 'deserialize' callback */
+    H5HL__cache_datablock_image_len,    /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5HL__cache_datablock_serialize,    /* 'serialize' callback */
+    NULL,                               /* 'notify' callback */
+    H5HL__cache_datablock_free_icr,     /* 'free_icr' callback */
+    NULL,                               /* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
 }};
 
 
@@ -119,26 +152,25 @@ const H5AC_class_t H5AC_LHEAP_DBLK[1] = {{
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_fl_deserialize
+ * Function:    H5HL__fl_deserialize
  *
- * Purpose:	Deserialize the free list for a heap data block
+ * Purpose:     Deserialize the free list for a heap data block
  *
- * Return:      Non-negative on success/Negative on failure
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Oct 12 2008
+ * Programmer:  Quincey Koziol
+ *              Oct 12 2008
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HL_fl_deserialize(H5HL_t *heap)
+H5HL__fl_deserialize(H5HL_t *heap)
 {
     H5HL_free_t *fl = NULL, *tail = NULL;      /* Heap free block nodes */
     hsize_t free_block;                 /* Offset of free block */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* check arguments */
     HDassert(heap);
@@ -147,7 +179,7 @@ H5HL_fl_deserialize(H5HL_t *heap)
     /* Build free list */
     free_block = heap->free_block;
     while(H5HL_FREE_NULL != free_block) {
-        const uint8_t *p;               /* Pointer into image buffer */
+        const uint8_t *image;           /* Pointer into image buffer */
 
         /* Sanity check */
         if(free_block >= heap->dblk_size)
@@ -161,13 +193,13 @@ H5HL_fl_deserialize(H5HL_t *heap)
         fl->next = NULL;
 
         /* Decode offset of next free block */
-        p = heap->dblk_image + free_block;
-        H5F_DECODE_LENGTH_LEN(p, free_block, heap->sizeof_size);
-        if(free_block == 0)
+        image = heap->dblk_image + free_block;
+        H5F_DECODE_LENGTH_LEN(image, free_block, heap->sizeof_size);
+        if(0 == free_block)
             HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, FAIL, "free block size is zero?")
 
         /* Decode length of this free block */
-        H5F_DECODE_LENGTH_LEN(p, fl->size, heap->sizeof_size);
+        H5F_DECODE_LENGTH_LEN(image, fl->size, heap->sizeof_size);
         if((fl->offset + fl->size) > heap->dblk_size)
             HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "bad heap free list")
 
@@ -183,141 +215,214 @@ H5HL_fl_deserialize(H5HL_t *heap)
 done:
     if(ret_value < 0)
         if(fl)
+            /* H5FL_FREE always returns NULL so we can't check for errors */
             fl = H5FL_FREE(H5HL_free_t, fl);
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_fl_deserialize() */
+} /* end H5HL__fl_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_fl_serialize
+ * Function:    H5HL__fl_serialize
  *
- * Purpose:	Serialize the free list for a heap data block
+ * Purpose:     Serialize the free list for a heap data block
  *
- * Return:	Success:	SUCCESS
- *		Failure:	FAIL
+ * Return:      Nothing (void)
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Oct 12 2008
+ * Programmer:  Quincey Koziol
+ *              Oct 12 2008
  *
  *-------------------------------------------------------------------------
  */
 static void
-H5HL_fl_serialize(const H5HL_t *heap)
+H5HL__fl_serialize(const H5HL_t *heap)
 {
-    H5HL_free_t	*fl;                    /* Pointer to heap free list node */
+    H5HL_free_t *fl;                    /* Pointer to heap free list node */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* check arguments */
     HDassert(heap);
 
     /* Serialize the free list into the heap data's image */
     for(fl = heap->freelist; fl; fl = fl->next) {
-        uint8_t     *p;                     /* Pointer into raw data buffer */
+        uint8_t     *image;     /* Pointer into raw data buffer */
 
         HDassert(fl->offset == H5HL_ALIGN(fl->offset));
-        p = heap->dblk_image + fl->offset;
+        image = heap->dblk_image + fl->offset;
 
         if(fl->next)
-            H5F_ENCODE_LENGTH_LEN(p, fl->next->offset, heap->sizeof_size)
+            H5F_ENCODE_LENGTH_LEN(image, fl->next->offset, heap->sizeof_size)
         else
-            H5F_ENCODE_LENGTH_LEN(p, H5HL_FREE_NULL, heap->sizeof_size)
+            H5F_ENCODE_LENGTH_LEN(image, H5HL_FREE_NULL, heap->sizeof_size)
 
-        H5F_ENCODE_LENGTH_LEN(p, fl->size, heap->sizeof_size)
+        H5F_ENCODE_LENGTH_LEN(image, fl->size, heap->sizeof_size)
     } /* end for */
 
     FUNC_LEAVE_NOAPI_VOID
-} /* end H5HL_fl_serialize() */
+
+} /* end H5HL__fl_serialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_prefix_load
+ * Function:    H5HL__cache_prefix_get_load_size()
  *
- * Purpose:	Loads a local heap prefix from disk.
+ * Purpose:	Return the size of the buffer the metadata cache should 
+ *		load from file and pass to the deserialize routine.
  *
- * Return:	Success:	Ptr to a local heap memory data structure.
- *		Failure:	NULL
+ *		The version 2 metadata cache callbacks included a test to 
+ *		ensure that the read did not pass the end of file, but this 
+ *		functionality has been moved to H5C_load_entry().  Thus 
+ *		all this function does is set *image_len equal to 
+ *		H5HL_SPEC_READ_SIZE, leaving it to the metadata cache to 
+ *		reduce the size of the read if appropriate.
  *
- * Programmer:	Robb Matzke
- *		matzke at llnl.gov
- *		Jul 17 1997
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              6/21/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5HL__cache_prefix_get_load_size(const void *_image, void *_udata, size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
+{
+    const uint8_t *image = (const uint8_t *)_image;   			/* Pointer into raw data buffer */
+    H5HL_cache_prfx_ud_t *udata = (H5HL_cache_prfx_ud_t *)_udata; 	/* User data for callback */
+    H5HL_t heap;        	/* Local heap */
+    htri_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDassert(udata);
+    HDassert(image_len);
+
+    if(image == NULL)
+	*image_len = H5HL_SPEC_READ_SIZE;
+
+    else { /* compute actual_len */
+
+	HDassert(actual_len);
+	HDassert(*actual_len == *image_len);
+
+	/* Check magic number */
+	if(HDmemcmp(image, H5HL_MAGIC, (size_t)H5_SIZEOF_MAGIC)) 
+	    HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, FAIL, "bad local heap signature")
+	image += H5_SIZEOF_MAGIC;
+
+	/* Version */
+	if(H5HL_VERSION != *image++) 
+	    HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, FAIL, "wrong version number in local heap")
+
+	/* Reserved */
+	image += 3;
+    
+	/* Store the prefix's address & length */
+	heap.prfx_addr = udata->prfx_addr; /* NEED */
+	heap.prfx_size = udata->sizeof_prfx; /* NEED */
+
+	/* Heap data size */
+	H5F_DECODE_LENGTH_LEN(image, heap.dblk_size, udata->sizeof_size); /* NEED */
+
+	/* Free list head */
+	H5F_DECODE_LENGTH_LEN(image, heap.free_block, udata->sizeof_size);
+	if(heap.free_block != H5HL_FREE_NULL && heap.free_block >= heap.dblk_size)
+	    HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, FAIL, "bad heap free list");
+
+	/* Heap data address */
+	H5F_addr_decode_len(udata->sizeof_addr, &image, &(heap.dblk_addr)); /* NEED */
+
+	*actual_len = heap.prfx_size;
+
+	/* Check if heap block exists */
+	if(heap.dblk_size) {
+	    /* Check if heap data block is contiguous with header */
+	    if(H5F_addr_eq((heap.prfx_addr + heap.prfx_size), heap.dblk_addr)) {
+		/* Note that the heap should be a single object in the cache */
+		*actual_len += heap.dblk_size;
+	    } 
+	} /* end if */
+    } /* end compute actual_len */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5HL__cache_prefix_get_load_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HL__cache_prefix_deserialize
+ *
+ * Purpose:	Given a buffer containing the on disk image of the local 
+ *		heap prefix, deserialize it, load its contents into a newly allocated
+ *		instance of H5HL_prfx_t, and return a pointer to the new instance.
+ *
+ * Return:      Success:        Pointer to in core representation
+ *              Failure:        NULL
+ *
+ * Programmer:  John Mainzer
+ *              6/21/14
  *
  *-------------------------------------------------------------------------
  */
 static void *
-H5HL_prefix_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+H5HL__cache_prefix_deserialize(const void *_image, size_t len, void *_udata,
+    hbool_t H5_ATTR_UNUSED *dirty)
 {
-    H5HL_t *heap = NULL;            /* Local heap */
-    H5HL_prfx_t *prfx = NULL;       /* Heap prefix deserialized */
+    H5HL_t               *heap = NULL;  /* Local heap */
+    H5HL_prfx_t          *prfx = NULL;  /* Heap prefix deserialized */
+    const uint8_t        *image = (const uint8_t *)_image;      /* Pointer into decoding buffer */
     H5HL_cache_prfx_ud_t *udata = (H5HL_cache_prfx_ud_t *)_udata;       /* User data for callback */
-    uint8_t		buf[H5HL_SPEC_READ_SIZE];   /* Buffer for decoding */
-    size_t	        spec_read_size; /* Size of buffer to speculatively read in */
-    const uint8_t	*p;         /* Pointer into decoding buffer */
-    haddr_t             eoa;        /* Relative end of file address */
-    hsize_t min;                    /* temp min value to avoid macro nesting */
-    H5HL_prfx_t *ret_value;         /* Return value */
+    void                 *ret_value = NULL;     /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /* check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    /* Check arguments */
+    HDassert(image);
+    HDassert(len > 0);
     HDassert(udata);
     HDassert(udata->sizeof_size > 0);
     HDassert(udata->sizeof_addr > 0);
     HDassert(udata->sizeof_prfx > 0);
-    HDassert(udata->sizeof_prfx <= sizeof(buf));
-
-    /* Make certain we don't speculatively read off the end of the file */
-    if(HADDR_UNDEF == (eoa = H5F_get_eoa(f, H5FD_MEM_LHEAP)))
-        HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, NULL, "unable to determine file size")
-
-    /* Compute the size of the speculative local heap prefix buffer */
-    min = MIN(eoa - addr, H5HL_SPEC_READ_SIZE);
-    H5_CHECKED_ASSIGN(spec_read_size, size_t, min, hsize_t);
-    HDassert(spec_read_size >= udata->sizeof_prfx);
-
-    /* Attempt to speculatively read both local heap prefix and heap data */
-    if(H5F_block_read(f, H5FD_MEM_LHEAP, addr, spec_read_size, dxpl_id, buf) < 0)
-	HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "unable to read local heap prefix")
-    p = buf;
+    HDassert(H5F_addr_defined(udata->prfx_addr));
+    HDassert(dirty);
 
     /* Check magic number */
-    if(HDmemcmp(p, H5HL_MAGIC, (size_t)H5_SIZEOF_MAGIC))
-	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "bad local heap signature")
-    p += H5_SIZEOF_MAGIC;
+    if(HDmemcmp(image, H5HL_MAGIC, (size_t)H5_SIZEOF_MAGIC)) 
+        HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "bad local heap signature")
+    image += H5_SIZEOF_MAGIC;
 
     /* Version */
-    if(H5HL_VERSION != *p++)
-	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "wrong version number in local heap")
+    if(H5HL_VERSION != *image++) 
+        HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "wrong version number in local heap")
 
     /* Reserved */
-    p += 3;
-
+    image += 3;
+    
     /* Allocate space in memory for the heap */
-    if(NULL == (heap = H5HL_new(udata->sizeof_size, udata->sizeof_addr, udata->sizeof_prfx)))
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "can't allocate local heap structure")
+    if(NULL == (heap = H5HL__new(udata->sizeof_size, udata->sizeof_addr, udata->sizeof_prfx)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "can't allocate local heap structure");
 
     /* Allocate the heap prefix */
-    if(NULL == (prfx = H5HL_prfx_new(heap)))
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "can't allocate local heap prefix")
+    if(NULL == (prfx = H5HL__prfx_new(heap)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "can't allocate local heap prefix");
 
     /* Store the prefix's address & length */
     heap->prfx_addr = udata->prfx_addr;
     heap->prfx_size = udata->sizeof_prfx;
 
     /* Heap data size */
-    H5F_DECODE_LENGTH_LEN(p, heap->dblk_size, udata->sizeof_size);
+    H5F_DECODE_LENGTH_LEN(image, heap->dblk_size, udata->sizeof_size);
 
     /* Free list head */
-    H5F_DECODE_LENGTH_LEN(p, heap->free_block, udata->sizeof_size);
-    if(heap->free_block != H5HL_FREE_NULL && heap->free_block >= heap->dblk_size)
-	HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "bad heap free list")
+    H5F_DECODE_LENGTH_LEN(image, heap->free_block, udata->sizeof_size);
+
+    if((heap->free_block != H5HL_FREE_NULL) && (heap->free_block >= heap->dblk_size))
+        HGOTO_ERROR(H5E_HEAP, H5E_BADVALUE, NULL, "bad heap free list")
 
     /* Heap data address */
-    H5F_addr_decode_len(udata->sizeof_addr, &p, &(heap->dblk_addr));
+    H5F_addr_decode_len(udata->sizeof_addr, &image, &(heap->dblk_addr));
 
     /* Check if heap block exists */
     if(heap->dblk_size) {
@@ -326,35 +431,53 @@ H5HL_prefix_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
             /* Note that the heap should be a single object in the cache */
             heap->single_cache_obj = TRUE;
 
-            /* Allocate space for the heap data image */
-            if(NULL == (heap->dblk_image = H5FL_BLK_MALLOC(lheap_chunk, heap->dblk_size)))
-                HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "memory allocation failed")
+            /* Check if the current buffer from the speculative read 
+             * already has the heap data 
+             */
+            if(len >= (heap->prfx_size + heap->dblk_size)) {
+                /* Allocate space for the heap data image */
+                if(NULL == (heap->dblk_image = H5FL_BLK_MALLOC(lheap_chunk, heap->dblk_size)))
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "memory allocation failed")
 
-            /* Check if the current buffer from the speculative read already has the heap data */
-            if(spec_read_size >= (heap->prfx_size + heap->dblk_size)) {
-                /* Set p to the start of the data block.  This is necessary
+                /* Set image to the start of the data block.  This is necessary
                  * because there may be a gap between the used portion of the
                  * prefix and the data block due to alignment constraints. */
-                p = buf + heap->prfx_size;
+                image = ((const uint8_t *)_image) + heap->prfx_size;
 
                 /* Copy the heap data from the speculative read buffer */
-                HDmemcpy(heap->dblk_image, p, heap->dblk_size);
+                HDmemcpy(heap->dblk_image, image, heap->dblk_size);
+
+                /* Build free list */
+                if(H5HL__fl_deserialize(heap) < 0)
+                    HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, NULL, "can't initialize free list")
             } /* end if */
             else {
-                /* Read the local heap data block directly into buffer */
-                if(H5F_block_read(f, H5FD_MEM_LHEAP, heap->dblk_addr, heap->dblk_size, dxpl_id, heap->dblk_image) < 0)
-                    HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "unable to read heap data")
-            } /* end else */
-
-            /* Build free list */
-            if(H5HL_fl_deserialize(heap) < 0)
-                HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, NULL, "can't initialize free list")
+		/* the supplied buffer is too small -- We have already made note
+                 * of the correct size, so simply return success.  H5C_load_entry()
+                 * will notice the size discrepency, and re-try the load.
+                 */
+
+                /* Make certain that this is the first try ... */
+                HDassert(!udata->made_attempt);
+
+                /* ... and mark the udata so that we know that we have used up
+                 * our first try.
+                 */
+                udata->made_attempt = TRUE;
+	    } /* end else */
         } /* end if */
-        else
-            /* Note that the heap should _NOT_ be a single object in the cache */
+        else {
+            /* Note that the heap should _NOT_ be a single 
+             * object in the cache 
+             */
             heap->single_cache_obj = FALSE;
+
+	} /* end else */
     } /* end if */
 
+    /* Set flag to indicate prefix from loaded from file */
+    udata->loaded = TRUE;
+
     /* Set return value */
     ret_value = prfx;
 
@@ -362,301 +485,303 @@ done:
     /* Release the [possibly partially initialized] local heap on errors */
     if(!ret_value) {
         if(prfx) {
-            if(H5HL_prfx_dest(prfx) < 0)
-                HDONE_ERROR(H5E_HEAP, H5E_CANTRELEASE, NULL, "unable to destroy local heap prefix")
+            if(FAIL == H5HL__prfx_dest(prfx))
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, NULL, "unable to destroy local heap prefix");
         } /* end if */
         else {
-            if(heap && H5HL_dest(heap) < 0)
-                HDONE_ERROR(H5E_HEAP, H5E_CANTRELEASE, NULL, "unable to destroy local heap")
+            if(heap && FAIL == H5HL__dest(heap))
+                HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, NULL, "unable to destroy local heap");
         } /* end else */
     } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_prefix_load() */
+} /* end H5HL__cache_prefix_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_prefix_flush
+ * Function:    H5HL__cache_prefix_image_len
  *
- * Purpose:	Flushes a heap from memory to disk if it's dirty.  Optionally
- *		deletes the heap from memory.
+ * Purpose:	Return the on disk image size of a local heap prefix to the 
+ *		metadata cache via the image_len.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	Robb Matzke
- *		matzke at llnl.gov
- *		Jul 17 1997
+ * Programmer:  John Mainzer
+ *              6/21/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HL_prefix_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr,
-    void *thing, unsigned H5_ATTR_UNUSED *flags_ptr)
+H5HL__cache_prefix_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    H5HL_prfx_t *prfx = (H5HL_prfx_t *)thing;   /* Local heap prefix to flush */
-    H5WB_t *wb = NULL;                  /* Wrapped buffer for heap data */
-    uint8_t heap_buf[H5HL_SPEC_READ_SIZE]; /* Buffer for heap */
-    herr_t ret_value = SUCCEED;         /* Return value */
+    const H5HL_prfx_t *prfx = (const H5HL_prfx_t *)_thing;  /* Pointer to local heap prefix to query */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR
 
-    /* check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    /* Check arguments */
     HDassert(prfx);
+    HDassert(prfx->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(prfx->cache_info.type == H5AC_LHEAP_PRFX);
+    HDassert(image_len);
 
-    if(prfx->cache_info.is_dirty) {
-        H5HL_t *heap = prfx->heap; /* Pointer to the local heap */
-        uint8_t *buf;           /* Pointer to heap buffer */
-        size_t buf_size;        /* Size of buffer for encoding & writing heap info */
-        uint8_t *p;             /* Pointer into raw data buffer */
-
-        /* Wrap the local buffer for serialized heap info */
-        if(NULL == (wb = H5WB_wrap(heap_buf, sizeof(heap_buf))))
-            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't wrap buffer")
-
-        /* Compute the size of the buffer to encode & write */
-        buf_size = heap->prfx_size;
-        if(heap->single_cache_obj)
-            buf_size += heap->dblk_size;
-
-        /* Get a pointer to a buffer that's large enough for serialized heap */
-        if(NULL == (buf = (uint8_t *)H5WB_actual(wb, buf_size)))
-            HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "can't get actual buffer")
-
-        /* Update the free block value from the free list */
-        heap->free_block = heap->freelist ? heap->freelist->offset : H5HL_FREE_NULL;
-
-        /* Serialize the heap prefix */
-        p = buf;
-        HDmemcpy(p, H5HL_MAGIC, (size_t)H5_SIZEOF_MAGIC);
-        p += H5_SIZEOF_MAGIC;
-        *p++ = H5HL_VERSION;
-        *p++ = 0;	/*reserved*/
-        *p++ = 0;	/*reserved*/
-        *p++ = 0;	/*reserved*/
-        H5F_ENCODE_LENGTH_LEN(p, heap->dblk_size, heap->sizeof_size);
-        H5F_ENCODE_LENGTH_LEN(p, heap->free_block, heap->sizeof_size);
-        H5F_addr_encode_len(heap->sizeof_addr, &p, heap->dblk_addr);
-
-        /* Check if the local heap is a single object in cache */
-        if(heap->single_cache_obj) {
-            if((size_t)(p - buf) < heap->prfx_size) {
-                size_t gap;         /* Size of gap between prefix and data block */
-
-                /* Set p to the start of the data block.  This is necessary because
-                 * there may be a gap between the used portion of the prefix and the
-                 * data block due to alignment constraints. */
-                gap = heap->prfx_size - (size_t)(p - buf);
-                HDmemset(p, 0, gap);
-                p += gap;
-            } /* end if */
-
-            /* Serialize the free list into the heap data's image */
-            H5HL_fl_serialize(heap);
-
-            /* Copy the heap data block into the cache image */
-            HDmemcpy(p, heap->dblk_image, heap->dblk_size);
-        } /* end if */
-
-        /* Write the prefix [and possibly the data block] to the file */
-        if(H5F_block_write(f, H5FD_MEM_LHEAP, addr, buf_size, dxpl_id, buf) < 0)
-            HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "unable to write heap header and data to file")
-
-	prfx->cache_info.is_dirty = FALSE;
-    } /* end if */
+    /* Set the prefix's size */
+    *image_len = prfx->heap->prfx_size;
 
-    /* Should we destroy the memory version? */
-    if(destroy)
-        if(H5HL_prefix_dest(f, prfx) < 0)
-	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy local heap prefix")
+    /* If the heap is stored as a single object, add in the 
+     * data block size also 
+     */
+    if(prfx->heap->single_cache_obj)
+        *image_len += prfx->heap->dblk_size;
 
-done:
-    /* Release resources */
-    if(wb && H5WB_unwrap(wb) < 0)
-        HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HL__cache_prefix_image_len() */
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_prefix_flush() */
+/****************************************/
+/* no H5HL_cache_prefix_pre_serialize() */
+/****************************************/
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_prefix_dest
+ * Function:    H5HL__cache_prefix_serialize
  *
- * Purpose:	Destroys a heap prefix in memory.
+ * Purpose:	Given a pointer to an instance of H5HL_prfx_t and an 
+ *		appropriately sized buffer, serialize the contents of the 
+ *		instance for writing to disk, and copy the serialized data 
+ *		into the buffer.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Jan 15 2003
+ * Programmer:  John Mainzer
+ *              7/21/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HL_prefix_dest(H5F_t *f, void *thing)
+H5HL__cache_prefix_serialize(const H5F_t *f, void *_image, size_t len,
+    void *_thing)
 {
-    H5HL_prfx_t *prfx = (H5HL_prfx_t *)thing;   /* Local heap prefix to destroy */
-    herr_t ret_value = SUCCEED;         /* Return value */
+    H5HL_prfx_t *prfx = (H5HL_prfx_t *)_thing;  /* Pointer to local heap prefix to query */
+    H5HL_t      *heap;          /* Pointer to the local heap */
+    uint8_t     *image = (uint8_t *)_image;     /* Pointer into image buffer */
+    size_t       buf_size;      /* expected size of the image buffer */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR
 
-    /* check arguments */
+    /* Check arguments */
+    HDassert(f);
+    HDassert(image);
     HDassert(prfx);
-    HDassert(prfx->heap);
+    HDassert(prfx->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(prfx->cache_info.type == H5AC_LHEAP_PRFX);
     HDassert(H5F_addr_eq(prfx->cache_info.addr, prfx->heap->prfx_addr));
+    HDassert(prfx->heap);
 
-    /* Verify that entry is clean */
-    HDassert(prfx->cache_info.is_dirty == FALSE);
+    /* Get the pointer to the heap */
+    heap = prfx->heap;
+    HDassert(heap);
 
-    /* If we're going to free the space on disk, the address must be valid */
-    HDassert(!prfx->cache_info.free_file_space_on_destroy || H5F_addr_defined(prfx->cache_info.addr));
+    /* Compute the buffer size */
+    buf_size = heap->prfx_size;
+    if(heap->single_cache_obj)
+        buf_size += heap->dblk_size;
+    HDassert(len == buf_size);
+
+    /* Update the free block value from the free list */
+    heap->free_block = heap->freelist ? heap->freelist->offset : H5HL_FREE_NULL;
+
+    /* Serialize the heap prefix */
+    HDmemcpy(image, H5HL_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    image += H5_SIZEOF_MAGIC;
+    *image++ = H5HL_VERSION;
+    *image++ = 0;       /*reserved*/
+    *image++ = 0;       /*reserved*/
+    *image++ = 0;       /*reserved*/
+    H5F_ENCODE_LENGTH_LEN(image, heap->dblk_size, heap->sizeof_size);
+    H5F_ENCODE_LENGTH_LEN(image, heap->free_block, heap->sizeof_size);
+    H5F_addr_encode_len(heap->sizeof_addr, &image, heap->dblk_addr);
+
+    /* Check if the local heap is a single object in cache */
+    if(heap->single_cache_obj) {
+        if((size_t)(image - (uint8_t *)_image) < heap->prfx_size) {
+            size_t gap;         /* Size of gap between prefix and data block */
+
+            /* Set image to the start of the data block.  This is necessary 
+             * because there may be a gap between the used portion of 
+             * the prefix and the data block due to alignment constraints. 
+             */
+            gap = heap->prfx_size - (size_t)(image - (uint8_t *)_image);
+            HDmemset(image, 0, gap);
+            image += gap;
+        } /* end if */
 
-    /* Check for freeing file space for local heap prefix */
-    if(prfx->cache_info.free_file_space_on_destroy) {
-        hsize_t free_size;       /* Size of region to free in file */
+        /* Serialize the free list into the heap data's image */
+        H5HL__fl_serialize(heap);
 
-        /* Compute size to free for later */
-        free_size = prfx->heap->prfx_size;
-        if(prfx->heap->single_cache_obj)
-            free_size += prfx->heap->dblk_size;
+        /* Copy the heap data block into the cache image */
+        HDmemcpy(image, heap->dblk_image, heap->dblk_size);
 
-        /* Free the local heap prefix [and possible the data block] on disk */
-        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
-        if(H5MF_xfree(f, H5FD_MEM_LHEAP, H5AC_dxpl_id, prfx->cache_info.addr, free_size) < 0)
-            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free local heap prefix")
+        /* Sanity check */
+        HDassert((size_t)(image - (uint8_t *)_image) + heap->dblk_size == len);
     } /* end if */
+    else {
+        /* Sanity check */
+        HDassert((size_t)(image - (uint8_t *)_image) <= len);
 
-    /* Destroy local heap prefix */
-    if(H5HL_prfx_dest(prfx) < 0)
-        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't destroy local heap prefix")
+#ifdef H5_CLEAR_MEMORY
+        /* Clear rest of local heap */
+        HDmemset(image, 0, len - (size_t)(image - (uint8_t *)_image));
+#endif /* H5_CLEAR_MEMORY */
+    } /* end else */
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_prefix_dest() */
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HL__cache_prefix_serialize() */
+
+/******************************************/
+/* no H5HL_cache_prefix_notify() function */
+/******************************************/
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_prefix_clear
+ * Function:    H5HL__cache_prefix_free_icr
+ *
+ * Purpose:	Free the supplied in core representation of a local heap 
+ *		prefix.
  *
- * Purpose:	Mark a local heap prefix in memory as non-dirty.
+ *		Note that this function handles the partially initialize prefix 
+ *		from a failed speculative load attempt.  See comments below for 
+ *		details.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Note:	The metadata cache sets the object's cache_info.magic to
+ *		H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC before calling a free_icr
+ *		callback (checked in assert).
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Mar 20 2003
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              6/21/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HL_prefix_clear(H5F_t H5_ATTR_UNUSED *f, void *thing, hbool_t destroy)
+H5HL__cache_prefix_free_icr(void *_thing)
 {
-    H5HL_prfx_t *prfx = (H5HL_prfx_t *)thing;   /* The local heap prefix to operate on */
-    herr_t ret_value = SUCCEED;         /* Return value */
+    H5HL_prfx_t *prfx = (H5HL_prfx_t *)_thing;  /* Pointer to local heap prefix to query */
+    herr_t       ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /* check arguments */
+    /* Check arguments */
     HDassert(prfx);
+    HDassert(prfx->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC);
+    HDassert(prfx->cache_info.type == H5AC_LHEAP_PRFX);
+    HDassert(H5F_addr_eq(prfx->cache_info.addr, prfx->heap->prfx_addr));
 
-    /* Mark heap prefix as clean */
-    prfx->cache_info.is_dirty = FALSE;
-
-    if(destroy)
-        if(H5HL_prefix_dest(f, prfx) < 0)
-	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy local heap prefix")
+    /* Destroy local heap prefix */
+    if(H5HL__prfx_dest(prfx) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't destroy local heap prefix")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_prefix_clear() */
+} /* end H5HL__cache_prefix_free_icr() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_prefix_size
+ * Function:    H5HL__cache_datablock_get_load_size()
  *
- * Purpose:	Compute the size in bytes of the heap prefix on disk,
- *              and return it in *len_ptr.  On failure, the value of *len_ptr
- *              is undefined.
+ * Purpose:	Tell the metadata cache how large a buffer to read from 
+ *		file when loading a datablock.  In this case, we simply lookup
+ *		the correct value in the user data, and return it in *image_len.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	John Mainzer
- *		5/13/04
+ * Programmer:  John Mainzer
+ *              6/21/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HL_prefix_size(const H5F_t H5_ATTR_UNUSED *f, const void *thing, size_t *size_ptr)
+H5HL__cache_datablock_get_load_size(const void *_image, void *_udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    const H5HL_prfx_t *prfx = (const H5HL_prfx_t *)thing;   /* Pointer to local heap prefix to query */
+    const uint8_t *image = (const uint8_t *)_image;     	  /* Pointer into image buffer */
+    H5HL_cache_dblk_ud_t *udata = (H5HL_cache_dblk_ud_t *)_udata; /* User data for callback */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    /* check arguments */
-    HDassert(prfx);
-    HDassert(prfx->heap);
-    HDassert(size_ptr);
+    FUNC_ENTER_STATIC_NOERR
 
-    /* Calculate size of prefix in cache */
-    *size_ptr = prfx->heap->prfx_size;
+    /* Check arguments */
+    HDassert(udata);
+    HDassert(udata->heap);
+    HDassert(udata->heap->dblk_size > 0);
+    HDassert(image_len);
 
-    /* If the heap is stored as a single object, add in the data block size also */
-    if(prfx->heap->single_cache_obj)
-        *size_ptr += prfx->heap->dblk_size;
+    if(image == NULL)
+	*image_len = udata->heap->dblk_size;
+    else {
+	HDassert(actual_len);
+        HDassert(*actual_len == *image_len);
+    }
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HL_prefix_size() */
+} /* end H5HL__cache_datablock_get_load_size() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_datablock_load
+ * Function:    H5HL__cache_datablock_deserialize
  *
- * Purpose:	Loads a local heap data block from disk.
+ * Purpose:	Given a buffer containing the on disk image of a local 
+ *		heap data block, deserialize it, load its contents into a newly allocated
+ *		instance of H5HL_dblk_t, and return a pointer to the new instance.
  *
- * Return:	Success:	Ptr to a local heap data block memory data structure.
- *		Failure:	NULL
+ * Return:      Success:        Pointer to in core representation
+ *              Failure:        NULL
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Jan  5 2010
+ * Programmer:  John Mainzer
+ *              6/21/14
  *
  *-------------------------------------------------------------------------
  */
 static void *
-H5HL_datablock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+H5HL__cache_datablock_deserialize(const void *image, size_t len, void *_udata,
+    hbool_t H5_ATTR_UNUSED *dirty)
 {
-    H5HL_dblk_t *dblk = NULL;       /* Local heap data block deserialized */
-    H5HL_cache_dblk_ud_t *udata = (H5HL_cache_dblk_ud_t *)_udata;       /* User data for callback */
-    H5HL_dblk_t *ret_value;         /* Return value */
+    H5HL_dblk_t          *dblk = NULL;  /* Local heap data block deserialized */
+    H5HL_cache_dblk_ud_t *udata = (H5HL_cache_dblk_ud_t *)_udata; /* User data for callback */
+    void                 *ret_value = NULL;     /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /* check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    /* Check arguments */
+    HDassert(image);
+    HDassert(len > 0);
     HDassert(udata);
     HDassert(udata->heap);
+    HDassert(udata->heap->dblk_size == len);
     HDassert(!udata->heap->single_cache_obj);
     HDassert(NULL == udata->heap->dblk);
+    HDassert(dirty);
 
     /* Allocate space in memory for the heap data block */
-    if(NULL == (dblk = H5HL_dblk_new(udata->heap)))
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "memory allocation failed")
+    if(NULL == (dblk = H5HL__dblk_new(udata->heap)))
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "memory allocation failed");
 
     /* Check for heap still retaining image */
     if(NULL == udata->heap->dblk_image) {
         /* Allocate space for the heap data image */
         if(NULL == (udata->heap->dblk_image = H5FL_BLK_MALLOC(lheap_chunk, udata->heap->dblk_size)))
-            HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "can't allocate data block image buffer")
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "can't allocate data block image buffer");
 
-        /* Read local heap data block */
-        if(H5F_block_read(f, H5FD_MEM_LHEAP, udata->heap->dblk_addr, udata->heap->dblk_size, dxpl_id, udata->heap->dblk_image) < 0)
-            HGOTO_ERROR(H5E_HEAP, H5E_READERROR, NULL, "unable to read local heap data block")
+        /* copy the datablock from the read buffer */
+        HDmemcpy(udata->heap->dblk_image, image, len);
 
         /* Build free list */
-        if(H5HL_fl_deserialize(udata->heap) < 0)
-            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, NULL, "can't initialize free list")
+        if(FAIL == H5HL__fl_deserialize(udata->heap))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, NULL, "can't initialize free list");
     } /* end if */
 
     /* Set flag to indicate data block from loaded from file */
@@ -668,184 +793,137 @@ H5HL_datablock_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
 done:
     /* Release the [possibly partially initialized] local heap on errors */
     if(!ret_value && dblk)
-        if(H5HL_dblk_dest(dblk) < 0)
-	    HDONE_ERROR(H5E_HEAP, H5E_CANTRELEASE, NULL, "unable to destroy local heap data block")
+        if(FAIL == H5HL__dblk_dest(dblk))
+            HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, NULL, "unable to destroy local heap data block");
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_datablock_load() */
+} /* end H5HL__cache_datablock_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_datablock_flush
+ * Function:    H5HL__cache_datablock_image_len
  *
- * Purpose:	Flushes a heap's data block from memory to disk if it's dirty.
- *              Optionally deletes the heap data block from memory.
+ * Purpose:	Return the size of the on disk image of the datablock.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	Robb Matzke
- *		matzke at llnl.gov
- *		Jul 17 1997
+ * Programmer:  John Mainzer
+ *              6/21/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HL_datablock_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr,
-    void *_thing, unsigned H5_ATTR_UNUSED * flags_ptr)
+H5HL__cache_datablock_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    H5HL_dblk_t *dblk = (H5HL_dblk_t *)_thing; /* Pointer to the local heap data block */
-    herr_t ret_value = SUCCEED;         /* Return value */
+    const H5HL_dblk_t *dblk = (const H5HL_dblk_t *)_thing;    /* Pointer to the local heap data block */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR
 
-    /* check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    /* Check arguments */
     HDassert(dblk);
+    HDassert(dblk->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(dblk->cache_info.type == H5AC_LHEAP_DBLK);
     HDassert(dblk->heap);
-    HDassert(!dblk->heap->single_cache_obj);
+    HDassert(dblk->heap->dblk_size > 0);
+    HDassert(image_len);
 
-    if(dblk->cache_info.is_dirty) {
-        H5HL_t *heap = dblk->heap;      /* Pointer to the local heap */
+    *image_len = dblk->heap->dblk_size;
 
-        /* Update the free block value from the free list */
-        heap->free_block = heap->freelist ? heap->freelist->offset : H5HL_FREE_NULL;
-
-        /* Serialize the free list into the heap data's image */
-        H5HL_fl_serialize(heap);
-
-        /* Write the data block to the file */
-        if(H5F_block_write(f, H5FD_MEM_LHEAP, heap->dblk_addr, heap->dblk_size, dxpl_id, heap->dblk_image) < 0)
-            HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "unable to write heap data block to file")
-
-	dblk->cache_info.is_dirty = FALSE;
-    } /* end if */
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HL__cache_datablock_image_len() */
 
-    /* Should we destroy the memory version? */
-    if(destroy)
-        if(H5HL_datablock_dest(f, dblk) < 0)
-	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy local heap data block")
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_datablock_flush() */
+/*******************************************/
+/* no H5HL_cache_datablock_pre_serialize() */
+/*******************************************/
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_datablock_dest
+ * Function:    H5HL__cache_datablock_serialize
  *
- * Purpose:	Destroys a local heap data block in memory.
+ * Purpose:	Serialize the supplied datablock, and copy the serialized
+ *		image into the supplied image buffer.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Jan 15 2003
+ * Programmer:  John Mainzer
+ *              6/21/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HL_datablock_dest(H5F_t *f, void *_thing)
+H5HL__cache_datablock_serialize(const H5F_t *f, void *image, size_t len,
+    void *_thing)
 {
-    H5HL_dblk_t *dblk = (H5HL_dblk_t *)_thing; /* Pointer to the local heap data block */
-    herr_t ret_value = SUCCEED;         /* Return value */
+    H5HL_t      *heap;          /* Pointer to the local heap */
+    H5HL_dblk_t *dblk = (H5HL_dblk_t *)_thing;  /* Pointer to the local heap data block */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR
 
-    /* check arguments */
+    /* Check arguments */
+    HDassert(f);
+    HDassert(image);
     HDassert(dblk);
+    HDassert(dblk->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(dblk->cache_info.type == H5AC_LHEAP_DBLK);
     HDassert(dblk->heap);
-    HDassert(!dblk->heap->single_cache_obj);
-    HDassert(H5F_addr_eq(dblk->cache_info.addr, dblk->heap->dblk_addr));
+    heap = dblk->heap;
+    HDassert(heap->dblk_size == len);
+    HDassert(!heap->single_cache_obj);
 
-    /* Verify that entry is clean */
-    HDassert(dblk->cache_info.is_dirty == FALSE);
+    /* Update the free block value from the free list */
+    heap->free_block = heap->freelist ? heap->freelist->offset : H5HL_FREE_NULL;
 
-    /* If we're going to free the space on disk, the address must be valid */
-    HDassert(!dblk->cache_info.free_file_space_on_destroy || H5F_addr_defined(dblk->cache_info.addr));
+    /* Serialize the free list into the heap data's image */
+    H5HL__fl_serialize(heap);
 
-    /* Check for freeing file space for local heap data block */
-    if(dblk->cache_info.free_file_space_on_destroy) {
-        /* Free the local heap data block on disk */
-        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
-        if(H5MF_xfree(f, H5FD_MEM_LHEAP, H5AC_dxpl_id, dblk->cache_info.addr, (hsize_t)dblk->heap->dblk_size) < 0)
-            HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free local heap data block")
-    } /* end if */
+    /* Copy the heap's data block into the cache's image */
+    HDmemcpy(image, heap->dblk_image, heap->dblk_size);
 
-    /* Destroy local heap data block */
-    if(H5HL_dblk_dest(dblk) < 0)
-        HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't destroy local heap data block")
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5HL__cache_datablock_serialize() */
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_datablock_dest() */
+/*********************************************/
+/* no H5HL_cache_datablock_notify() function */
+/*********************************************/
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_datablock_clear
+ * Function:    H5HL__cache_datablock_free_icr
+ *
+ * Purpose:	Free the in memory representation of the supplied local heap data block.
  *
- * Purpose:	Mark a local heap data block in memory as non-dirty.
+ * Note:	The metadata cache sets the object's cache_info.magic to
+ *		H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC before calling a free_icr
+ *		callback (checked in assert).
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Mar 20 2003
+ * Programmer:  John Mainzer
+ *              6/21/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5HL_datablock_clear(H5F_t *f, void *_thing, hbool_t destroy)
+H5HL__cache_datablock_free_icr(void *_thing)
 {
     H5HL_dblk_t *dblk = (H5HL_dblk_t *)_thing; /* Pointer to the local heap data block */
-    herr_t ret_value = SUCCEED;         /* Return value */
+    herr_t       ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /* check arguments */
+    /* Check arguments */
     HDassert(dblk);
+    HDassert(dblk->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC);
+    HDassert(dblk->cache_info.type == H5AC_LHEAP_DBLK);
 
-    /* Mark local heap data block as clean */
-    dblk->cache_info.is_dirty = FALSE;
-
-    if(destroy)
-        if(H5HL_datablock_dest(f, dblk) < 0)
-	    HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy local heap data block")
+    /* Destroy the data block */
+    if(H5HL__dblk_dest(dblk) < 0)
+        HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to destroy local heap data block")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_datablock_clear() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5HL_datablock_size
- *
- * Purpose:	Compute the size in bytes of the local heap data block on disk,
- *              and return it in *len_ptr.  On failure, the value of *len_ptr
- *              is undefined.
- *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	John Mainzer
- *		5/13/04
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5HL_datablock_size(const H5F_t H5_ATTR_UNUSED *f, const void *_thing, size_t *size_ptr)
-{
-    const H5HL_dblk_t *dblk = (const H5HL_dblk_t *)_thing; /* Pointer to the local heap data block */
-
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    /* check arguments */
-    HDassert(dblk);
-    HDassert(dblk->heap);
-    HDassert(size_ptr);
-
-    /* Set size of data block in cache */
-    *size_ptr = dblk->heap->dblk_size;
-
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5HL_datablock_size() */
-
+} /* end H5HL__cache_datablock_free_icr() */
diff --git a/src/H5HLdbg.c b/src/H5HLdbg.c
index 4ac22b8..fc8f5d3 100644
--- a/src/H5HLdbg.c
+++ b/src/H5HLdbg.c
@@ -13,54 +13,49 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-/* Programmer:  Quincey Koziol <koziol at ncsa.uiuc.edu>
+/* Programmer:  Quincey Koziol <koziol at hdfgroup.org>
  *              Wednesday, July 9, 2003
  *
- * Purpose:	Local Heap object debugging functions.
+ * Purpose:     Local Heap object debugging functions.
  */
-#define H5HL_PACKAGE		/* Suppress error about including H5HLpkg */
 
+/****************/
+/* Module Setup */
+/****************/
 
-#include "H5private.h"		/* Generic Functions			*/
-#include "H5Eprivate.h"		/* Error handling		        */
-#include "H5HLpkg.h"		/* Local heaps				*/
-#include "H5Iprivate.h"		/* ID Functions		                */
-#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5HLmodule.h"         /* This source code file is part of the H5HL module */
+
+/***********/
+/* Headers */
+/***********/
+
+#include "H5private.h"      /* Generic Functions            */
+#include "H5Eprivate.h"     /* Error handling               */
+#include "H5HLpkg.h"        /* Local heaps                  */
+#include "H5MMprivate.h"    /* Memory management            */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_debug
- *
- * Purpose:	Prints debugging information about a heap.
+ * Function:    H5HL_debug
  *
- * Return:	Non-negative on success/Negative on failure
+ * Purpose:     Prints debugging information about a heap.
  *
- * Programmer:	Robb Matzke
- *		matzke at llnl.gov
- *		Aug  1 1997
+ * Return:      SUCCEED/FAIL
  *
- * Modifications:
- *		Robb Matzke, 1999-07-28
- *		The ADDR argument is passed by value.
- *
- *              John Mainzer, 6/17/05
- *              Modified the function to use the new dirtied parameter of
- *              of H5AC_unprotect() instead of modifying the is_dirty
- *              field of the cache info.
+ * Programmer:  Robb Matzke
+ *              Aug  1 1997
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5HL_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent, int fwidth)
-{
+BEGIN_FUNC(PRIV, ERR,
+herr_t, SUCCEED, FAIL,
+H5HL_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent, int fwidth))
+
     H5HL_t		*h = NULL;
     int			free_block;
     H5HL_free_t		*freelist;
     uint8_t		*marker = NULL;
     size_t		amount_free = 0;
-    herr_t              ret_value = SUCCEED;       /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
 
     /* check arguments */
     HDassert(f);
@@ -69,18 +64,18 @@ H5HL_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent, int
     HDassert(indent >= 0);
     HDassert(fwidth >= 0);
 
-    if(NULL == (h = (H5HL_t *)H5HL_protect(f, dxpl_id, addr, H5AC_READ)))
-        HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load heap")
+    if(NULL == (h = (H5HL_t *)H5HL_protect(f, dxpl_id, addr, H5AC__READ_ONLY_FLAG)))
+        H5E_THROW(H5E_CANTPROTECT, "unable to load/protect local heap");
 
     HDfprintf(stream, "%*sLocal Heap...\n", indent, "");
     HDfprintf(stream, "%*s%-*s %lu\n", indent, "", fwidth,
 	    "Header size (in bytes):",
 	    (unsigned long)h->prfx_size);
     HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
-	      "Address of heap data:",
-	      h->dblk_addr);
+              "Address of heap data:",
+              h->dblk_addr);
     HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
-	    "Data bytes allocated for heap:",
+            "Data bytes allocated for heap:",
             h->dblk_size);
 
     /*
@@ -88,7 +83,7 @@ H5HL_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent, int
      * the heap and that no two free blocks point to the same region of
      * the heap.  */
     if(NULL == (marker = (uint8_t *)H5MM_calloc(h->dblk_size)))
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "memory allocation failed")
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed");
 
     HDfprintf(stream, "%*sFree Blocks (offset, size):\n", indent, "");
     for(free_block = 0, freelist = h->freelist; freelist; freelist = freelist->next, free_block++) {
@@ -126,11 +121,11 @@ H5HL_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent, int
      */
     H5_buffer_dump(stream, indent, h->dblk_image, marker, (size_t)0, h->dblk_size);
 
-done:
-    if(h && H5HL_unprotect(h) < 0)
-	HDONE_ERROR(H5E_OHDR, H5E_PROTECT, FAIL, "unable to release object header")
-    H5MM_xfree(marker);
+CATCH
+    if(h && FAIL == H5HL_unprotect(h))
+        H5E_THROW(H5E_CANTUNPROTECT, "unable to release/unprotect local heap");
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_debug() */
+    if(marker && NULL != (marker = (uint8_t *)H5MM_xfree(marker)))
+        H5E_THROW(H5E_CANTFREE, "can't free marker buffer");
 
+END_FUNC(PRIV) /* end H5HL_debug() */
diff --git a/src/H5HLdblk.c b/src/H5HLdblk.c
new file mode 100644
index 0000000..6a4d8ce
--- /dev/null
+++ b/src/H5HLdblk.c
@@ -0,0 +1,282 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5HLdblk.c
+ *              Summer 2012
+ *              Dana Robinson <derobins at hdfgroup.org>
+ *
+ * Purpose:     Data block routines for local heaps.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#include "H5HLmodule.h"         /* This source code file is part of the H5HL module */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"      /* Generic Functions            */
+#include "H5Eprivate.h"     /* Error handling               */
+#include "H5FLprivate.h"    /* Free lists                   */
+#include "H5HLpkg.h"        /* Local Heaps                  */
+#include "H5MFprivate.h"    /* File memory management       */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5HL_dblk_t struct */
+H5FL_DEFINE_STATIC(H5HL_dblk_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HL__dblk_new
+ *
+ * Purpose:     Create a new local heap data block object
+ *
+ * Return:      Success:    non-NULL pointer to new local heap data block
+ *              Failure:    NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              Oct 12 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+H5HL_dblk_t *, NULL, NULL,
+H5HL__dblk_new(H5HL_t *heap))
+
+    H5HL_dblk_t *dblk = NULL;           /* New local heap data block */
+
+    /* check arguments */
+    HDassert(heap);
+
+    /* Allocate new local heap data block */
+    if(NULL == (dblk = H5FL_CALLOC(H5HL_dblk_t)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for local heap data block")
+
+    /* Increment ref. count on heap data structure */
+    if(FAIL == H5HL__inc_rc(heap))
+        H5E_THROW(H5E_CANTINC, "can't increment heap ref. count")
+
+    /* Link the heap & the data block */
+    dblk->heap = heap;
+    heap->dblk = dblk;
+
+    /* Set the return value */
+    ret_value = dblk;
+
+CATCH
+    /* Ensure that the data block memory is deallocated on errors */
+    if(!ret_value && dblk != NULL) {
+        /* H5FL_FREE always returns NULL so we can't check for errors */
+        dblk = H5FL_FREE(H5HL_dblk_t, dblk);
+    }
+
+END_FUNC(PKG) /* end H5HL__dblk_new() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HL__dblk_dest
+ *
+ * Purpose:     Destroy a local heap data block object
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              Oct 12 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5HL__dblk_dest(H5HL_dblk_t *dblk))
+
+    /* check arguments */
+    HDassert(dblk);
+
+    /* Check if data block was initialized */
+    if(dblk->heap) {
+        /* Unlink data block from heap */
+        dblk->heap->dblk = NULL;
+
+        /* Unpin the local heap prefix */
+        if(FAIL == H5AC_unpin_entry(dblk->heap->prfx))
+            H5E_THROW(H5E_CANTUNPIN, "can't unpin local heap prefix")
+
+        /* Decrement ref. count on heap data structure */
+        if(FAIL == H5HL__dec_rc(dblk->heap))
+            H5E_THROW(H5E_CANTDEC, "can't decrement heap ref. count")
+
+        /* Unlink heap from data block */
+        dblk->heap = NULL;
+    } /* end if */
+
+CATCH
+    /* Free local heap data block */
+    /* H5FL_FREE always returns NULL so we can't check for errors */
+    dblk = H5FL_FREE(H5HL_dblk_t, dblk);
+
+END_FUNC(PKG) /* end H5HL__dblk_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HL__dblk_realloc
+ *
+ * Purpose:     Reallocate data block for heap
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              Oct 12 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5HL__dblk_realloc(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t new_heap_size))
+
+    H5HL_dblk_t *dblk;                  /* Local heap data block */
+    haddr_t old_addr;                   /* Old location of heap data block */
+    haddr_t new_addr;                   /* New location of heap data block */
+    size_t old_heap_size;               /* Old size of heap data block */
+
+    /* check arguments */
+    HDassert(heap);
+    HDassert(new_heap_size > 0);
+
+    /* Release old space on disk */
+    old_addr = heap->dblk_addr;
+    old_heap_size = heap->dblk_size;
+    H5_CHECK_OVERFLOW(old_heap_size, size_t, hsize_t);
+    if(FAIL == H5MF_xfree(f, H5FD_MEM_LHEAP, dxpl_id, old_addr, (hsize_t)old_heap_size))
+        H5E_THROW(H5E_CANTFREE, "can't free old local heap data");
+
+    /* Allocate new space on disk */
+    H5_CHECK_OVERFLOW(new_heap_size, size_t, hsize_t);
+    if(HADDR_UNDEF == (new_addr = H5MF_alloc(f, H5FD_MEM_LHEAP, dxpl_id, (hsize_t)new_heap_size)))
+        H5E_THROW(H5E_CANTALLOC, "unable to allocate file space for local heap");
+
+    /* Update heap info*/
+    heap->dblk_addr = new_addr;
+    heap->dblk_size = new_heap_size;
+
+    /* Check if heap data block actually moved in the file */
+    if(H5F_addr_eq(old_addr, new_addr)) {
+        /* Check if heap data block is contiguous w/prefix */
+        if(heap->single_cache_obj) {
+            /* Sanity check */
+            HDassert(H5F_addr_eq(heap->prfx_addr + heap->prfx_size, old_addr));
+            HDassert(heap->prfx);
+
+            /* Resize the heap prefix in the cache */
+            if(FAIL == H5AC_resize_entry(heap->prfx, (size_t)(heap->prfx_size + new_heap_size)))
+                H5E_THROW(H5E_CANTRESIZE, "unable to resize heap in cache");
+
+        } /* end if */
+        else {
+            /* Sanity check */
+            HDassert(H5F_addr_ne(heap->prfx_addr + heap->prfx_size, old_addr));
+            HDassert(heap->dblk);
+
+            /* Resize the heap data block in the cache */
+            if(H5AC_resize_entry(heap->dblk, (size_t)new_heap_size) < 0)
+                H5E_THROW(H5E_CANTRESIZE, "unable to resize heap (data block) in cache");
+
+        } /* end else */
+    } /* end if */
+    else {
+        /* Check if heap data block was contiguous w/prefix previously */
+        if(heap->single_cache_obj) {
+            /* Create new heap data block */
+            if(NULL == (dblk = H5HL__dblk_new(heap)))
+                H5E_THROW(H5E_CANTALLOC, "unable to allocate local heap data block");
+
+            /* Resize current heap prefix */
+            heap->prfx_size = H5HL_SIZEOF_HDR(f);
+            if(FAIL == H5AC_resize_entry(heap->prfx, (size_t)heap->prfx_size))
+                H5E_THROW(H5E_CANTRESIZE, "unable to resize heap prefix in cache");
+
+            /* Insert data block into cache (pinned) */
+            if(FAIL == H5AC_insert_entry(f, dxpl_id, H5AC_LHEAP_DBLK, new_addr, dblk, H5AC__PIN_ENTRY_FLAG))
+                H5E_THROW(H5E_CANTINIT, "unable to cache local heap data block");
+                
+            dblk = NULL;
+
+            /* Reset 'single cache object' flag */
+            heap->single_cache_obj = FALSE;
+        } /* end if */
+        else {
+            /* Resize the heap data block in the cache */
+            /* (ignore [unlikely] case where heap data block ends up
+             *      contiguous w/heap prefix again.
+             */
+            if(FAIL == H5AC_resize_entry(heap->dblk, (size_t)new_heap_size))
+                H5E_THROW(H5E_CANTRESIZE, "unable to resize heap data block in cache");
+
+            /* Relocate the heap data block in the cache */
+            if(FAIL == H5AC_move_entry(f, H5AC_LHEAP_DBLK, old_addr, new_addr))
+                H5E_THROW(H5E_CANTMOVE, "unable to move heap data block in cache");
+
+        } /* end else */
+    } /* end else */
+
+CATCH
+    /* Restore old heap address & size on errors */
+    if(FAIL == ret_value) {
+        heap->dblk_addr = old_addr;
+        heap->dblk_size = old_heap_size;
+    } /* end if */
+
+END_FUNC(PKG) /* end H5HL__dblk_realloc() */
diff --git a/src/H5HLint.c b/src/H5HLint.c
index d5238eb..5b547cf 100644
--- a/src/H5HLint.c
+++ b/src/H5HLint.c
@@ -15,11 +15,11 @@
 
 /*-------------------------------------------------------------------------
  *
- * Created:		H5HLint.c
- *			Oct 12 2008
- *			Quincey Koziol <koziol at hdfgroup.org>
+ * Created:     H5HLint.c
+ *              Oct 12 2008
+ *              Quincey Koziol <koziol at hdfgroup.org>
  *
- * Purpose:		Local heap internal routines.
+ * Purpose:     Local heap internal routines.
  *
  *-------------------------------------------------------------------------
  */
@@ -28,15 +28,16 @@
 /* Module Setup */
 /****************/
 
-#define H5HL_PACKAGE		/* Suppress error about including H5HLpkg */
+#include "H5HLmodule.h"         /* This source code file is part of the H5HL module */
 
 
 /***********/
 /* Headers */
 /***********/
-#include "H5private.h"		/* Generic Functions			*/
-#include "H5Eprivate.h"		/* Error handling		  	*/
-#include "H5HLpkg.h"		/* Local Heaps				*/
+#include "H5private.h"      /* Generic Functions            */
+#include "H5Eprivate.h"     /* Error handling               */
+#include "H5FLprivate.h"    /* Free lists                   */
+#include "H5HLpkg.h"        /* Local Heaps                  */
 
 
 /****************/
@@ -76,35 +77,26 @@
 /* Declare a free list to manage the H5HL_t struct */
 H5FL_DEFINE_STATIC(H5HL_t);
 
-/* Declare a free list to manage the H5HL_dblk_t struct */
-H5FL_DEFINE_STATIC(H5HL_dblk_t);
-
-/* Declare a free list to manage the H5HL_prfx_t struct */
-H5FL_DEFINE_STATIC(H5HL_prfx_t);
-
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_new
+ * Function:    H5HL__new
  *
- * Purpose:	Create a new local heap object
+ * Purpose:     Create a new local heap object
  *
- * Return:	Success:	non-NULL pointer to new local heap
- *		Failure:	NULL
+ * Return:      Success:    non-NULL pointer to new local heap
+ *              Failure:    NULL
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Jan  5 2010
+ * Programmer:  Quincey Koziol
+ *              Jan  5 2010
  *
  *-------------------------------------------------------------------------
  */
-H5HL_t *
-H5HL_new(size_t sizeof_size, size_t sizeof_addr, size_t prfx_size)
-{
-    H5HL_t *heap = NULL;        /* New local heap */
-    H5HL_t *ret_value;          /* Return value */
+BEGIN_FUNC(PKG, ERR,
+H5HL_t *, NULL, NULL,
+H5HL__new(size_t sizeof_size, size_t sizeof_addr, size_t prfx_size))
 
-    FUNC_ENTER_NOAPI(NULL)
+    H5HL_t *heap = NULL;        /* New local heap */
 
     /* check arguments */
     HDassert(sizeof_size > 0);
@@ -113,7 +105,7 @@ H5HL_new(size_t sizeof_size, size_t sizeof_addr, size_t prfx_size)
 
     /* Allocate new local heap structure */
     if(NULL == (heap = H5FL_CALLOC(H5HL_t)))
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "memory allocation failed")
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed");
 
     /* Initialize non-zero fields */
     heap->sizeof_size = sizeof_size;
@@ -123,29 +115,29 @@ H5HL_new(size_t sizeof_size, size_t sizeof_addr, size_t prfx_size)
     /* Set the return value */
     ret_value = heap;
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_new() */
+CATCH
+    if(!ret_value && heap != NULL)
+        if (NULL == (heap = H5FL_FREE(H5HL_t, heap)))
+            H5E_THROW(H5E_CANTFREE, "can't free heap memory");
+
+END_FUNC(PKG) /* end H5HL__new() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_inc_rc
+ * Function:	H5HL__inc_rc
  *
- * Purpose:	Increment ref. count on heap
+ * Purpose:     Increment ref. count on heap
  *
- * Return:	Success:	Non-negative
- *		Failure:	Negative
+ * Return:      SUCCEED (Can't fail)
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Oct 12 2008
+ * Programmer:  Quincey Koziol
+ *              Oct 12 2008
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5HL_inc_rc(H5HL_t *heap)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+BEGIN_FUNC(PKG, NOERR,
+herr_t, SUCCEED, -,
+H5HL__inc_rc(H5HL_t *heap))
 
     /* check arguments */
     HDassert(heap);
@@ -153,28 +145,24 @@ H5HL_inc_rc(H5HL_t *heap)
     /* Increment heap's ref. count */
     heap->rc++;
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5HL_inc_rc() */
+END_FUNC(PKG) /* end H5HL__inc_rc() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_dec_rc
+ * Function:	H5HL__dec_rc
  *
- * Purpose:	Decrement ref. count on heap
+ * Purpose:     Decrement ref. count on heap
  *
- * Return:	Success:	Non-negative
- *		Failure:	Negative
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Oct 12 2008
+ * Programmer:  Quincey Koziol
+ *              Oct 12 2008
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5HL_dec_rc(H5HL_t *heap)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5HL__dec_rc(H5HL_t *heap))
 
     /* check arguments */
     HDassert(heap);
@@ -182,31 +170,29 @@ H5HL_dec_rc(H5HL_t *heap)
     /* Decrement heap's ref. count */
     heap->rc--;
 
+CATCH
     /* Check if we should destroy the heap */
-    if(heap->rc == 0)
-        H5HL_dest(heap);
+    if(heap->rc == 0 && FAIL == H5HL__dest(heap))
+        H5E_THROW(H5E_CANTFREE, "unable to destroy local heap");
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5HL_dec_rc() */
+END_FUNC(PKG) /* end H5HL__dec_rc() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5HL_dest
+ * Function:    H5HL__dest
  *
- * Purpose:	Destroys a heap in memory.
+ * Purpose:     Destroys a heap in memory.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      SUCCEED/FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Jan 15 2003
+ * Programmer:  Quincey Koziol
+ *              Jan 15 2003
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5HL_dest(H5HL_t *heap)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5HL__dest(H5HL_t *heap))
 
     /* check arguments */
     HDassert(heap);
@@ -217,201 +203,20 @@ H5HL_dest(H5HL_t *heap)
     HDassert(heap->prfx == NULL);
     HDassert(heap->dblk == NULL);
 
+CATCH
     if(heap->dblk_image)
-        heap->dblk_image = H5FL_BLK_FREE(lheap_chunk, heap->dblk_image);
+        if(NULL != (heap->dblk_image = H5FL_BLK_FREE(lheap_chunk, heap->dblk_image)))
+            H5E_THROW(H5E_CANTFREE, "unable to free local heap data block image");
     while(heap->freelist) {
         H5HL_free_t	*fl;
 
         fl = heap->freelist;
         heap->freelist = fl->next;
-        fl = H5FL_FREE(H5HL_free_t, fl);
+        if(NULL != (fl = H5FL_FREE(H5HL_free_t, fl)))
+            H5E_THROW(H5E_CANTFREE, "unable to free local heap free list");
     } /* end while */
-    heap = H5FL_FREE(H5HL_t, heap);
-
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5HL_dest() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5HL_prfx_new
- *
- * Purpose:	Create a new local heap prefix object
- *
- * Return:	Success:	non-NULL pointer to new local heap prefix
- *		Failure:	NULL
- *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Oct 12 2008
- *
- *-------------------------------------------------------------------------
- */
-H5HL_prfx_t *
-H5HL_prfx_new(H5HL_t *heap)
-{
-    H5HL_prfx_t *prfx = NULL;       /* New local heap prefix */
-    H5HL_prfx_t *ret_value;         /* Return value */
-
-    FUNC_ENTER_NOAPI(NULL)
-
-    /* check arguments */
-    HDassert(heap);
-
-    /* Allocate new local heap prefix */
-    if(NULL == (prfx = H5FL_CALLOC(H5HL_prfx_t)))
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "memory allocation failed")
-
-    /* Increment ref. count on heap data structure */
-    if(H5HL_inc_rc(heap) < 0)
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, NULL, "can't increment heap ref. count")
-
-    /* Link the heap & the prefix */
-    prfx->heap = heap;
-    heap->prfx = prfx;
-
-    /* Set the return value */
-    ret_value = prfx;
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_prfx_new() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5HL_prfx_dest
- *
- * Purpose:	Destroy a local heap prefix object
- *
- * Return:	Success:	Non-negative
- *		Failure:	Negative
- *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Oct 12 2008
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5HL_prfx_dest(H5HL_prfx_t *prfx)
-{
-    herr_t ret_value = SUCCEED;         /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    /* check arguments */
-    HDassert(prfx);
-
-    /* Check if prefix was initialized */
-    if(prfx->heap) {
-        /* Unlink prefix from heap */
-        prfx->heap->prfx = NULL;
-
-        /* Decrement ref. count on heap data structure */
-        if(H5HL_dec_rc(prfx->heap) < 0)
-            HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement heap ref. count")
-
-        /* Unlink heap from prefix */
-        prfx->heap = NULL;
-    } /* end if */
-
-    /* Free local heap prefix */
-    prfx = H5FL_FREE(H5HL_prfx_t, prfx);
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_prfx_dest() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5HL_dblk_new
- *
- * Purpose:	Create a new local heap data block object
- *
- * Return:	Success:	non-NULL pointer to new local heap data block
- *		Failure:	NULL
- *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Oct 12 2008
- *
- *-------------------------------------------------------------------------
- */
-H5HL_dblk_t *
-H5HL_dblk_new(H5HL_t *heap)
-{
-    H5HL_dblk_t *dblk = NULL;       /* New local heap data block */
-    H5HL_dblk_t *ret_value;         /* Return value */
-
-    FUNC_ENTER_NOAPI(NULL)
-
-    /* check arguments */
-    HDassert(heap);
-
-    /* Allocate new local heap data block */
-    if(NULL == (dblk = H5FL_CALLOC(H5HL_dblk_t)))
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, NULL, "memory allocation failed")
-
-    /* Increment ref. count on heap data structure */
-    if(H5HL_inc_rc(heap) < 0)
-	HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, NULL, "can't increment heap ref. count")
-
-    /* Link the heap & the data block */
-    dblk->heap = heap;
-    heap->dblk = dblk;
-
-    /* Set the return value */
-    ret_value = dblk;
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_dblk_new() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5HL_dblk_dest
- *
- * Purpose:	Destroy a local heap data block object
- *
- * Return:	Success:	Non-negative
- *		Failure:	Negative
- *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Oct 12 2008
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5HL_dblk_dest(H5HL_dblk_t *dblk)
-{
-    herr_t ret_value = SUCCEED;         /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    /* check arguments */
-    HDassert(dblk);
-
-    /* Check if data block was initialized */
-    if(dblk->heap) {
-        /* Unlink data block from heap */
-        dblk->heap->dblk = NULL;
-
-        /* Unpin the local heap prefix */
-        if(H5AC_unpin_entry(dblk->heap->prfx) < 0)
-            HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPIN, FAIL, "can't unpin local heap prefix")
-
-        /* Decrement ref. count on heap data structure */
-        if(H5HL_dec_rc(dblk->heap) < 0)
-            HGOTO_ERROR(H5E_HEAP, H5E_CANTDEC, FAIL, "can't decrement heap ref. count")
-
-        /* Unlink heap from data block */
-        dblk->heap = NULL;
-    } /* end if */
-
-    /* Free local heap data block */
-    dblk = H5FL_FREE(H5HL_dblk_t, dblk);
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5HL_dblk_dest() */
+    
+    if(NULL != (heap = H5FL_FREE(H5HL_t, heap)))
+        H5E_THROW(H5E_CANTFREE, "unable to free local heap");
 
+END_FUNC(PKG) /* end H5HL__dest() */
diff --git a/src/H5HLmodule.h b/src/H5HLmodule.h
new file mode 100644
index 0000000..b38c077
--- /dev/null
+++ b/src/H5HLmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5HL package.  Including this header means that the source file
+ *		is part of the H5HL package.
+ */
+#ifndef _H5HLmodule_H
+#define _H5HLmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5HL_MODULE
+#define H5_MY_PKG       H5HL
+#define H5_MY_PKG_ERR   H5E_HEAP
+#define H5_MY_PKG_INIT  NO
+
+#endif /* _H5HLmodule_H */
+
diff --git a/src/H5HLpkg.h b/src/H5HLpkg.h
index bf9be2c..fb8667b 100644
--- a/src/H5HLpkg.h
+++ b/src/H5HLpkg.h
@@ -14,14 +14,14 @@
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
- * Programmer: Quincey Koziol <koziol at ncsa.uiuc.edu>
+ * Programmer: Quincey Koziol <koziol at hdfgroup.org>
  *             Wednesday, July 9, 2003
  *
  * Purpose:     This file contains declarations which are visible
  *              only within the H5HL package. Source files outside the
  *              H5HL package should include H5HLprivate.h instead.
  */
-#ifndef H5HL_PACKAGE
+#if !(defined H5HL_FRIEND || defined H5HL_MODULE)
 #error "Do not include this file outside the H5HL package!"
 #endif
 
@@ -32,7 +32,7 @@
 #include "H5HLprivate.h"
 
 /* Other private headers needed by this file */
-#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5FLprivate.h"    /* Free lists                           */
 
 
 /*****************************/
@@ -56,16 +56,26 @@ H5FL_BLK_EXTERN(lheap_chunk);
 /* Package Private Macros */
 /**************************/
 
-#define H5HL_SIZEOF_HDR(F)						      \
-    H5HL_ALIGN(H5_SIZEOF_MAGIC +	/*heap signature		*/    \
-	       1 +			/*version			*/    \
-	       3 +			/*reserved			*/    \
-	       H5F_SIZEOF_SIZE(F) +	/*data size			*/    \
-	       H5F_SIZEOF_SIZE(F) +	/*free list head		*/    \
-	       H5F_SIZEOF_ADDR(F))	/*data address			*/
+/* If this package header is being included in one of the H5HL source files,
+ *      define the proper control macros for the generic FUNC_ENTER/LEAVE and
+ *      error reporting macros.
+ */
+#ifdef H5HL_PACKAGE
+#define H5_MY_PKG       H5HL
+#define H5_MY_PKG_ERR   H5E_HEAP
+#define H5_MY_PKG_INIT  NO
+#endif /* H5HL_PACKAGE */
+
+#define H5HL_SIZEOF_HDR(F)                                                  \
+    H5HL_ALIGN(H5_SIZEOF_MAGIC +    /* heap signature   */                  \
+        1 +                         /* version          */                  \
+        3 +	                        /* reserved         */                  \
+        H5F_SIZEOF_SIZE(F) +        /* data size        */                  \
+        H5F_SIZEOF_SIZE(F) +        /* free list head   */                  \
+        H5F_SIZEOF_ADDR(F))         /* data address     */
 
 /* Value indicating end of free list on disk */
-#define H5HL_FREE_NULL	1
+#define H5HL_FREE_NULL  1
 
 
 /****************************/
@@ -73,10 +83,10 @@ H5FL_BLK_EXTERN(lheap_chunk);
 /****************************/
 
 typedef struct H5HL_free_t {
-    size_t		offset;		/*offset of free block		*/
-    size_t		size;		/*size of free block		*/
-    struct H5HL_free_t	*prev;		/*previous entry in free list	*/
-    struct H5HL_free_t	*next;		/*next entry in free list	*/
+    size_t              offset;     /* offset of free block         */
+    size_t              size;       /* size of free block           */
+    struct H5HL_free_t  *prev;      /* previous entry in free list  */
+    struct H5HL_free_t  *next;      /* next entry in free list      */
 } H5HL_free_t;
 
 /* Forward declarations */
@@ -85,58 +95,62 @@ typedef struct H5HL_prfx_t H5HL_prfx_t;
 
 struct H5HL_t {
     /* General heap-management fields */
-    size_t                  rc;         /* Ref. count for prefix & data block using this struct */
-    size_t                  prots;      /* # of times the heap has been protected */
-    size_t                  sizeof_size; /* Size of file sizes */
-    size_t                  sizeof_addr; /* Size of file addresses */
-    hbool_t                 single_cache_obj;   /* Indicate if the heap is a single object in the cache */
-    H5HL_free_t		   *freelist;	/*the free list			*/
+    size_t          rc;                 /* Ref. count for prefix & data block using this struct         */
+    size_t          prots;              /* # of times the heap has been protected                       */
+    size_t          sizeof_size;        /* Size of file sizes                                           */
+    size_t          sizeof_addr;        /* Size of file addresses                                       */
+    hbool_t         single_cache_obj;   /* Indicate if the heap is a single object in the cache         */
+    H5HL_free_t     *freelist;          /* the free list                                                */
 
     /* Prefix-specific fields */
-    H5HL_prfx_t            *prfx;       /* The prefix object for the heap */
-    haddr_t                 prfx_addr;  /* address of heap prefix */
-    size_t                  prfx_size;  /* size of heap prefix */
-    hsize_t                 free_block; /* Address of first free block */
+    H5HL_prfx_t     *prfx;              /* The prefix object for the heap                       */
+    haddr_t         prfx_addr;          /* address of heap prefix                               */
+    size_t          prfx_size;          /* size of heap prefix                                  */
+    hsize_t         free_block;         /* Address of first free block                          */
 
     /* Data block-specific fields */
-    H5HL_dblk_t            *dblk;       /* The data block object for the heap */
-    haddr_t		    dblk_addr;	/* address of data block	*/
-    size_t		    dblk_size;	/* size of heap data block on disk and in mem */
-    uint8_t		   *dblk_image;	/* The data block image */
+    H5HL_dblk_t     *dblk;              /* The data block object for the heap                   */
+    haddr_t         dblk_addr;          /* address of data block                                */
+    size_t          dblk_size;          /* size of heap data block on disk and in mem           */
+    uint8_t         *dblk_image;        /* The data block image                                 */
 };
 
 /* Struct for heap data block */
 struct H5HL_dblk_t {
-    H5AC_info_t cache_info;    /* Information for H5AC cache functions, _must_ be */
-                                /* first field in structure */
-    H5HL_t                 *heap;       /* Pointer to heap for data block */
+    H5AC_info_t     cache_info;         /* Information for H5AC cache functions, _must_ be      */
+                                        /* first field in structure                             */
+    H5HL_t          *heap;              /* Pointer to heap for data block                       */
 };
 
 /* Struct for heap prefix */
 struct H5HL_prfx_t {
-    H5AC_info_t cache_info;    /* Information for H5AC cache functions, _must_ be */
-                                /* first field in structure */
-    H5HL_t                 *heap;       /* Pointer to heap for prefix */
+    H5AC_info_t     cache_info;         /* Information for H5AC cache functions, _must_ be      */
+                                        /* first field in structure                             */
+    H5HL_t          *heap;              /* Pointer to heap for prefix                           */
 };
 
 /* Callback information for loading local heap prefix from disk */
 typedef struct H5HL_cache_prfx_ud_t {
     /* Downwards */
+    hbool_t made_attempt;               /* Whether the deserialize routine */
+                                        /* was already attempted */
     size_t sizeof_size;                 /* Size of file sizes */
     size_t sizeof_addr;                 /* Size of file addresses */
     haddr_t prfx_addr;                  /* Address of prefix */
     size_t sizeof_prfx;                 /* Size of heap prefix */
 
     /* Upwards */
+    hbool_t loaded;                     /* Whether prefix was loaded */
+                                        /* from file */
 } H5HL_cache_prfx_ud_t;
 
 /* Callback information for loading local heap data block from disk */
 typedef struct H5HL_cache_dblk_ud_t {
     /* Downwards */
-    H5HL_t *heap;                       /* Local heap */
+    H5HL_t *heap;                       /* Local heap                               */
 
     /* Upwards */
-    hbool_t loaded;                     /* Whether data block was loaded from file */
+    hbool_t loaded;                     /* Whether data block was loaded from file  */
 } H5HL_cache_dblk_ud_t;
 
 
@@ -145,16 +159,18 @@ typedef struct H5HL_cache_dblk_ud_t {
 /******************************/
 
 /* Heap routines */
-H5_DLL H5HL_t *H5HL_new(size_t sizeof_size, size_t sizeof_addr, size_t prfx_size);
-H5_DLL herr_t H5HL_dest(H5HL_t *heap);
+H5_DLL H5HL_t *H5HL__new(size_t sizeof_size, size_t sizeof_addr, size_t prfx_size);
+H5_DLL herr_t H5HL__dest(H5HL_t *heap);
+H5_DLL herr_t H5HL__inc_rc(H5HL_t *heap);
+H5_DLL herr_t H5HL__dec_rc(H5HL_t *heap);
 
 /* Heap prefix routines */
-H5_DLL H5HL_prfx_t *H5HL_prfx_new(H5HL_t *heap);
-H5_DLL herr_t H5HL_prfx_dest(H5HL_prfx_t *prfx);
+H5_DLL H5HL_prfx_t *H5HL__prfx_new(H5HL_t *heap);
+H5_DLL herr_t H5HL__prfx_dest(H5HL_prfx_t *prfx);
 
 /* Heap data block routines */
-H5_DLL H5HL_dblk_t *H5HL_dblk_new(H5HL_t *heap);
-H5_DLL herr_t H5HL_dblk_dest(H5HL_dblk_t *dblk);
+H5_DLL H5HL_dblk_t *H5HL__dblk_new(H5HL_t *heap);
+H5_DLL herr_t H5HL__dblk_dest(H5HL_dblk_t *dblk);
+H5_DLL herr_t H5HL__dblk_realloc(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t new_heap_size);
 
 #endif /* _H5HLpkg_H */
-
diff --git a/src/H5HLprfx.c b/src/H5HLprfx.c
new file mode 100644
index 0000000..66c4dad
--- /dev/null
+++ b/src/H5HLprfx.c
@@ -0,0 +1,166 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5HLprfx.c
+ *              Summer 2012
+ *              Dana Robinson <derobins at hdfgroup.org>
+ *
+ * Purpose:     Prefix routines for local heaps.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#include "H5HLmodule.h"         /* This source code file is part of the H5HL module */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"      /* Generic Functions            */
+#include "H5Eprivate.h"     /* Error handling               */
+#include "H5FLprivate.h"    /* Free lists                   */
+#include "H5HLpkg.h"        /* Local Heaps                  */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage the H5HL_prfx_t struct */
+H5FL_DEFINE_STATIC(H5HL_prfx_t);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HL__prfx_new
+ *
+ * Purpose:     Create a new local heap prefix object
+ *
+ * Return:      Success:    non-NULL pointer to new local heap prefix
+ *              Failure:    NULL
+ *
+ * Programmer:  Quincey Koziol
+ *              Oct 12 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+H5HL_prfx_t *, NULL, NULL,
+H5HL__prfx_new(H5HL_t *heap))
+
+    H5HL_prfx_t *prfx = NULL;           /* New local heap prefix */
+
+    /* check arguments */
+    HDassert(heap);
+
+    /* Allocate new local heap prefix */
+    if(NULL == (prfx = H5FL_CALLOC(H5HL_prfx_t)))
+        H5E_THROW(H5E_CANTALLOC, "memory allocation failed for local heap prefix")
+
+    /* Increment ref. count on heap data structure */
+    if(FAIL == H5HL__inc_rc(heap))
+        H5E_THROW(H5E_CANTINC, "can't increment heap ref. count")
+
+    /* Link the heap & the prefix */
+    prfx->heap = heap;
+    heap->prfx = prfx;
+
+    /* Set the return value */
+    ret_value = prfx;
+
+CATCH
+    /* Ensure that the prefix memory is deallocated on errors */
+    if(!ret_value && prfx != NULL) {
+        /* H5FL_FREE always returns NULL so we can't check for errors */
+        prfx = H5FL_FREE(H5HL_prfx_t, prfx);
+    }
+
+END_FUNC(PKG) /* end H5HL__prfx_new() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5HL__prfx_dest
+ *
+ * Purpose:     Destroy a local heap prefix object
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer:  Quincey Koziol
+ *              Oct 12 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+BEGIN_FUNC(PKG, ERR,
+herr_t, SUCCEED, FAIL,
+H5HL__prfx_dest(H5HL_prfx_t *prfx))
+
+    /* check arguments */
+    HDassert(prfx);
+
+    /* Check if prefix was initialized */
+    if(prfx->heap) {
+        /* Unlink prefix from heap */
+        prfx->heap->prfx = NULL;
+
+        /* Decrement ref. count on heap data structure */
+        if(FAIL == H5HL__dec_rc(prfx->heap))
+            H5E_THROW(H5E_CANTDEC, "can't decrement heap ref. count")
+
+        /* Unlink heap from prefix */
+        prfx->heap = NULL;
+    } /* end if */
+
+CATCH
+    /* Free prefix memory */
+    /* H5FL_FREE always returns NULL so we can't check for errors */
+    prfx = H5FL_FREE(H5HL_prfx_t, prfx);
+
+END_FUNC(PKG) /* end H5HL__prfx_dest() */
diff --git a/src/H5HLprivate.h b/src/H5HLprivate.h
index 0b044b6..e2bf29c 100644
--- a/src/H5HLprivate.h
+++ b/src/H5HLprivate.h
@@ -15,13 +15,11 @@
 
 /*-------------------------------------------------------------------------
  *
- * Created:		H5HLprivate.h
- *			Jul 16 1997
- *			Robb Matzke <matzke at llnl.gov>
+ * Created:         H5HLprivate.h
+ *                  Jul 16 1997
+ *                  Robb Matzke <matzke at llnl.gov>
  *
- * Purpose:
- *
- * Modifications:
+ * Purpose:         Private declarations for the H5HL (local heap) package.
  *
  *-------------------------------------------------------------------------
  */
@@ -32,23 +30,23 @@
 #include "H5HLpublic.h"
 
 /* Private headers needed by this file. */
-#include "H5private.h"		/* Generic Functions			*/
-#include "H5ACprivate.h"	/* Metadata cache			*/
-#include "H5Fprivate.h"		/* File access				*/
+#include "H5private.h"          /* Generic Functions                */
+#include "H5ACprivate.h"        /* Metadata cache                   */
+#include "H5Fprivate.h"         /* File access                      */
 
 /*
  * Feature: Define H5HL_DEBUG on the compiler command line if you want to
- *	    diagnostic messages from this layer.
+ *          enable diagnostic messages from this layer.
  */
 #ifdef NDEBUG
 #  undef H5HL_DEBUG
 #endif
 
-#define H5HL_ALIGN(X)	((((unsigned)X)+7)&(unsigned)(~0x07)) /*align on 8-byte boundary	*/
+#define H5HL_ALIGN(X)   ((((unsigned)X)+7)&(unsigned)(~0x07)) /* align on 8-byte boundary   */
 
-#define H5HL_SIZEOF_FREE(F)						      \
-    H5HL_ALIGN(H5F_SIZEOF_SIZE (F) +	/*ptr to next free block	*/    \
-	       H5F_SIZEOF_SIZE (F))	/*size of this free block	*/
+#define H5HL_SIZEOF_FREE(F) \
+    H5HL_ALIGN(H5F_SIZEOF_SIZE (F) +    /* ptr to next free block   */  \
+        H5F_SIZEOF_SIZE (F))            /* size of this free block  */
 
 /****************************/
 /* Library Private Typedefs */
@@ -58,22 +56,23 @@
 typedef struct H5HL_t H5HL_t;
 
 /*
- * Library prototypes...
+ * Library prototypes
  */
 H5_DLL herr_t H5HL_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, haddr_t *addr/*out*/);
-H5_DLL H5HL_t *H5HL_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC_protect_t rw);
+H5_DLL herr_t H5HL_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr);
+H5_DLL herr_t H5HL_get_size(H5F_t *f, hid_t dxpl_id, haddr_t addr, size_t *size);
+H5_DLL herr_t H5HL_heapsize(H5F_t *f, hid_t dxpl_id, haddr_t addr, hsize_t *heap_size);
+H5_DLL size_t H5HL_insert(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t size,
+    const void *buf);
 H5_DLL void *H5HL_offset_into(const H5HL_t *heap, size_t offset);
+H5_DLL H5HL_t *H5HL_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, unsigned flags);
 H5_DLL herr_t H5HL_remove(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t offset,
     size_t size);
 H5_DLL herr_t H5HL_unprotect(H5HL_t *heap);
-H5_DLL size_t H5HL_insert(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t size,
-    const void *buf);
-H5_DLL herr_t H5HL_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr);
-H5_DLL herr_t H5HL_get_size(H5F_t *f, hid_t dxpl_id, haddr_t addr, size_t *size);
-H5_DLL herr_t H5HL_heapsize(H5F_t *f, hid_t dxpl_id, haddr_t addr, hsize_t *heap_size);
 
-/* Debugging functions */
+/* Debugging routines for dumping file structures */
 H5_DLL herr_t H5HL_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent,
-			  int fwidth);
+    int fwidth);
+
 #endif
 
diff --git a/src/H5HLpublic.h b/src/H5HLpublic.h
index db00f51..6dc1828 100644
--- a/src/H5HLpublic.h
+++ b/src/H5HLpublic.h
@@ -21,8 +21,6 @@
  *
  * Purpose:             Public declarations for the H5HL (local heap) package.
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 #ifndef _H5HLpublic_H
diff --git a/src/H5I.c b/src/H5I.c
index 4eeaba0..e952388 100644
--- a/src/H5I.c
+++ b/src/H5I.c
@@ -35,10 +35,7 @@
  *	5/18/04 - Expanded to allow registration of new types at run-time
  */
 
-#define H5I_PACKAGE		/*suppress error about including H5Ipkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5I_init_interface
+#include "H5Imodule.h"          /* This source code file is part of the H5I module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -55,7 +52,7 @@
 #ifndef H5I_DEBUG_OUTPUT
 #include "H5Gprivate.h"		/* Groups				*/
 #else /* H5I_DEBUG_OUTPUT */
-#define H5G_PACKAGE /*suppress error message about including H5Gpkg.h */
+#define H5G_FRIEND		/*suppress error about including H5Gpkg	  */
 #include "H5Gpkg.h"		/* Groups		  		*/
 #include "H5Dprivate.h"		/* Datasets				*/
 #include "H5Tprivate.h"		/* Datatypes				*/
@@ -63,10 +60,6 @@
 
 /* Local Macros */
 
-/* Define the maximum number of returned ID structures to keep around
-   for re-use. */
-#define MAX_FREE_ID_STRUCTS 1000
-
 /* Combine a Type number and an atom index into an atom */
 #define H5I_MAKE(g,i)	((((hid_t)(g) & TYPE_MASK) << ID_BITS) |	  \
 			     ((hid_t)(i) & ID_MASK))
@@ -85,14 +78,9 @@ typedef struct H5I_id_info_t {
 typedef struct {
     const H5I_class_t *cls;     /* Pointer to ID class                      */
     unsigned	init_count;	/* # of times this type has been initialized*/
-    hbool_t	wrapped;	/* Whether the id count has wrapped around  */
-    unsigned	id_count;	/* Current number of IDs held		    */
-    hid_t	nextid;		/* ID to use for the next atom		    */
+    uint64_t	id_count;	/* Current number of IDs held		    */
+    uint64_t	nextid;		/* ID to use for the next atom		    */
     H5SL_t      *ids;           /* Pointer to skip list that stores IDs     */
-
-    /* Fields for holding available IDs */
-    unsigned    avail_count;    /* # of available ID structures awaiting recycling */
-    H5SL_t      *avail_ids;     /* pointer to skip list of available IDs */
 } H5I_id_type_t;
 
 typedef struct {
@@ -101,11 +89,6 @@ typedef struct {
     void *ret_obj;              /* Object to return */
 } H5I_search_ud_t;
 
-/* User data for iterator callback when IDs have wrapped */
-typedef struct {
-    hid_t nextid;               /* Next ID to expect */
-} H5I_wrap_ud_t;
-
 /* User data for iterator callback for ID iteration */
 typedef struct {
     H5I_search_func_t user_func;        /* 'User' function to invoke */
@@ -120,6 +103,9 @@ typedef struct {
     hbool_t app_ref;            /* Whether this is an appl. ref. call */
 } H5I_clear_type_ud_t;
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 /*-------------------- Locally scoped variables -----------------------------*/
 
 /* Array of pointers to atomic types */
@@ -143,7 +129,6 @@ H5FL_DEFINE_STATIC(H5I_id_type_t);
 H5FL_DEFINE_STATIC(H5I_class_t);
 
 /*--------------------- Local function prototypes ---------------------------*/
-static herr_t H5I__free_cb(void *_item, void *_key, void *_udata);
 static htri_t H5I__clear_type_cb(void *_id, void *key, void *udata);
 static int H5I__destroy_type(H5I_type_t type);
 static void *H5I__remove_verify(hid_t id, H5I_type_t id_type);
@@ -156,29 +141,8 @@ static herr_t H5I__debug(H5I_type_t type);
 #endif /* H5I_DEBUG_OUTPUT */
 
 

-/*--------------------------------------------------------------------------
-NAME
-   H5I_init_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5I_init_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.
-
---------------------------------------------------------------------------*/
-static herr_t
-H5I_init_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5I_init_interface() */
-
-

 /*-------------------------------------------------------------------------
- * Function:	H5I_term_interface
+ * Function:	H5I_term_package
  *
  * Purpose:	Terminate the H5I interface: release all memory, reset all
  *		global variables to initial values. This only happens if all
@@ -194,20 +158,20 @@ H5I_init_interface(void)
  *-------------------------------------------------------------------------
  */
 int
-H5I_term_interface(void)
+H5I_term_package(void)
 {
-    H5I_id_type_t	*type_ptr;
-    H5I_type_t		type;
-    int		n = 0;
+    int	n = 0;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    if(H5_interface_initialize_g) {
+    if(H5_PKG_INIT_VAR) {
+        H5I_id_type_t *type_ptr;        /* Pointer to ID type */
+        H5I_type_t type;                /* Type of ID */
+
         /* How many types are still being used? */
-        for(type = (H5I_type_t)0; type < H5I_next_type; H5_INC_ENUM(H5I_type_t, type)) {
+        for(type = (H5I_type_t)0; type < H5I_next_type; H5_INC_ENUM(H5I_type_t, type))
             if((type_ptr = H5I_id_type_list_g[type]) && type_ptr->ids)
                 n++;
-        } /* end for */
 
         /* If no types are used then clean up */
         if(0 == n) {
@@ -217,16 +181,18 @@ H5I_term_interface(void)
                     HDassert(NULL == type_ptr->ids);
                     type_ptr = H5FL_FREE(H5I_id_type_t, type_ptr);
                     H5I_id_type_list_g[type] = NULL;
+                    n++;
                 } /* end if */
             } /* end for */
-        } /* end if */
 
-        /* Mark interface closed */
-        H5_interface_initialize_g = 0;
+            /* Mark interface closed */
+            if(0 == n)
+                H5_PKG_INIT_VAR = FALSE;
+        } /* end if */
     } /* end if */
 
     FUNC_LEAVE_NOAPI(n)
-} /* end H5I_term_interface() */
+} /* end H5I_term_package() */
 
 

 /*-------------------------------------------------------------------------
@@ -253,9 +219,9 @@ H5I_term_interface(void)
 H5I_type_t
 H5Iregister_type(size_t hash_size, unsigned reserved, H5I_free_t free_func)
 {
-    H5I_class_t *cls = NULL;    /* New ID class */
-    H5I_type_t new_type;        /* New ID type value */
-    H5I_type_t ret_value;       /* Return value */
+    H5I_class_t *cls = NULL;            /* New ID class */
+    H5I_type_t new_type;                /* New ID type value */
+    H5I_type_t ret_value = H5I_BADID;   /* Return value */
 
     FUNC_ENTER_API(H5I_BADID)
     H5TRACE3("It", "zIux", hash_size, reserved, free_func);
@@ -305,10 +271,9 @@ H5Iregister_type(size_t hash_size, unsigned reserved, H5I_free_t free_func)
 
 done:
     /* Clean up on error */
-    if(ret_value < 0) {
+    if(ret_value < 0)
         if(cls)
             cls = H5FL_FREE(H5I_class_t, cls);
-    } /* end if */
 
     FUNC_LEAVE_API(ret_value)
 } /* end H5Iregister_type() */
@@ -357,14 +322,10 @@ H5I_register_type(const H5I_class_t *cls)
     /* Initialize the ID type structure for new types */
     if(type_ptr->init_count == 0) {
         type_ptr->cls = cls;
-        type_ptr->wrapped = FALSE;
         type_ptr->id_count = 0;
-        type_ptr->nextid = (hid_t)cls->reserved;
+        type_ptr->nextid = cls->reserved;
         if(NULL == (type_ptr->ids = H5SL_create(H5SL_TYPE_HID, NULL)))
             HGOTO_ERROR(H5E_ATOM, H5E_CANTCREATE, FAIL, "skip list creation failed")
-        type_ptr->avail_count = 0;
-        if(NULL == (type_ptr->avail_ids = H5SL_create(H5SL_TYPE_HID, NULL)))
-            HGOTO_ERROR(H5E_ATOM, H5E_CANTCREATE, FAIL, "skip list creation failed")
     } /* end if */
 
     /* Increment the count of the times this type has been initialized */
@@ -375,8 +336,6 @@ done:
         if(type_ptr) {
             if(type_ptr->ids)
                 H5SL_close(type_ptr->ids);
-            if(type_ptr->avail_ids)
-                H5SL_close(type_ptr->avail_ids);
             (void)H5FL_FREE(H5I_id_type_t, type_ptr);
         } /* end if */
     } /* end if */
@@ -457,12 +416,12 @@ H5Inmembers(H5I_type_t type, hsize_t *num_members)
 	HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "supplied type does not exist")
 
     if(num_members) {
-        int members;
+        int64_t members;
 
         if((members = H5I_nmembers(type)) < 0)
             HGOTO_ERROR(H5E_ATOM, H5E_CANTCOUNT, FAIL, "can't compute number of members")
 
-        H5_CHECKED_ASSIGN(*num_members, hsize_t, members, int);
+        H5_CHECKED_ASSIGN(*num_members, hsize_t, members, int64_t);
     } /* end if */
 
 done:
@@ -485,21 +444,21 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-int
+int64_t
 H5I_nmembers(H5I_type_t type)
 {
-    H5I_id_type_t	*type_ptr = NULL;
-    int		        ret_value;
+    H5I_id_type_t *type_ptr;            /* Pointer to the ID type */
+    int64_t ret_value = 0;              /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
     if(type <= H5I_BADID || type >= H5I_next_type)
-        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number")
+	HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number")
     if(NULL == (type_ptr = H5I_id_type_list_g[type]) || type_ptr->init_count <= 0)
-        HGOTO_DONE(0);
+	HGOTO_DONE(0);
 
     /* Set return value */
-    H5_CHECKED_ASSIGN(ret_value, int, type_ptr->id_count, unsigned);
+    H5_CHECKED_ASSIGN(ret_value, int64_t, type_ptr->id_count, uint64_t);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -525,7 +484,7 @@ done:
 herr_t
 H5Iclear_type(H5I_type_t type, hbool_t force)
 {
-    herr_t ret_value;                      /* Return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_API(FAIL)
     H5TRACE2("e", "Itb", type, force);
@@ -541,35 +500,6 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5I__free_cb
- *
- * Purpose:	Callback for freeing ID nodes in H5I__remove_common
- *
- * Return:	Success:	Non-negative
- *		Failure:	Negative
- *
- * Programmer:	Quincey Koziol
- *              Friday, October 4, 2013
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5I__free_cb(void *_item, void H5_ATTR_UNUSED *_key, void H5_ATTR_UNUSED *_udata)
-{
-    H5I_id_info_t *item = (H5I_id_info_t *)_item;       /* Pointer to the ID node */
-
-    FUNC_ENTER_STATIC_NOERR
-
-    /* Sanity check */
-    HDassert(item);
-
-    item = H5FL_FREE(H5I_id_info_t, item);
-
-    FUNC_LEAVE_NOAPI(H5_ITER_CONT)
-} /* end H5I__free_cb() */
-
-

-/*-------------------------------------------------------------------------
  * Function:	H5I_clear_type
  *
  * Purpose:	Removes all objects from the type, calling the free
@@ -606,13 +536,6 @@ H5I_clear_type(H5I_type_t type, hbool_t force, hbool_t app_ref)
     if(H5SL_try_free_safe(udata.type_ptr->ids, H5I__clear_type_cb, &udata) < 0)
         HGOTO_ERROR(H5E_ATOM, H5E_CANTDELETE, FAIL, "can't free ids in type")
 
-    /* Also free any ID structures being retained for potential re-use */
-    if(udata.type_ptr->avail_count > 0) {
-        if(H5SL_free(udata.type_ptr->avail_ids, H5I__free_cb, NULL) < 0)
-            HGOTO_ERROR(H5E_ATOM, H5E_CANTREMOVE, FAIL, "can't release available ID nodes")
-        udata.type_ptr->avail_count = 0;
-    } /* end if */
-
 done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5I_clear_type() */
@@ -705,7 +628,7 @@ H5I__clear_type_cb(void *_id, void H5_ATTR_UNUSED *key, void *_udata)
 herr_t
 H5Idestroy_type(H5I_type_t type)
 {
-    herr_t ret_value;           /* Return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_API(FAIL)
     H5TRACE1("e", "It", type);
@@ -759,10 +682,6 @@ H5I__destroy_type(H5I_type_t type)
     if(type_ptr->cls->flags & H5I_CLASS_IS_APPLICATION)
         type_ptr->cls = H5FL_FREE(H5I_class_t, (void *)type_ptr->cls);
 
-    if(H5SL_close(type_ptr->avail_ids) < 0)
-        HGOTO_ERROR(H5E_ATOM, H5E_CANTCLOSEOBJ, FAIL, "can't close skip list")
-    type_ptr->avail_ids = NULL;
-
     if(H5SL_close(type_ptr->ids) < 0)
         HGOTO_ERROR(H5E_ATOM, H5E_CANTCLOSEOBJ, FAIL, "can't close skip list")
     type_ptr->ids = NULL;
@@ -791,7 +710,7 @@ done:
 hid_t
 H5Iregister(H5I_type_t type, const void *object)
 {
-    hid_t ret_value;                      /* Return value */
+    hid_t ret_value = H5I_INVALID_HID;  /* Return value */
 
     FUNC_ENTER_API(H5I_INVALID_HID)
     H5TRACE2("i", "It*x", type, object);
@@ -807,47 +726,6 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5I__wrapped_cb
- *
- * Purpose:	Callback for searching for next free ID, when IDs have wrapped
- *
- * Return:	Success:	Non-negative
- *		Failure:	Negative
- *
- * Programmer:	Quincey Koziol
- *              Thursday, October 3, 2013
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5I__wrapped_cb(void *_item, void H5_ATTR_UNUSED *_key, void *_udata)
-{
-    H5I_id_info_t *item = (H5I_id_info_t *)_item;       /* Pointer to the ID node */
-    H5I_wrap_ud_t *udata = (H5I_wrap_ud_t *)_udata;     /* Pointer to user data */
-    int ret_value = H5_ITER_CONT;                       /* Return value */
-
-    FUNC_ENTER_STATIC_NOERR
-
-    /* Sanity check */
-    HDassert(item);
-    HDassert(udata);
-
-    /* Break out if we see a free ID */
-    if(udata->nextid != (ID_MASK & item->id)) {
-        /* Sanity check */
-        HDassert(item->id > udata->nextid);
-
-        ret_value = H5_ITER_STOP;
-    } /* end if */
-    else
-        /* Increment to expect the next ID */
-        udata->nextid++;
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5I__wrapped_cb() */
-
-

-/*-------------------------------------------------------------------------
  * Function:	H5I_register
  *
  * Purpose:	Registers an OBJECT in a TYPE and returns an ID for it.
@@ -870,6 +748,7 @@ H5I_register(H5I_type_t type, const void *object, hbool_t app_ref)
 {
     H5I_id_type_t	*type_ptr;	/*ptr to the type		*/
     H5I_id_info_t	*id_ptr;	/*ptr to the new ID information */
+    hid_t		new_id;		/*new ID			*/
     hid_t		ret_value = SUCCEED; /*return value		*/
 
     FUNC_ENTER_NOAPI(FAIL)
@@ -880,65 +759,90 @@ H5I_register(H5I_type_t type, const void *object, hbool_t app_ref)
     type_ptr = H5I_id_type_list_g[type];
     if(NULL == type_ptr || type_ptr->init_count <= 0)
 	HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "invalid type")
+    if(NULL == (id_ptr = H5FL_MALLOC(H5I_id_info_t)))
+        HGOTO_ERROR(H5E_ATOM, H5E_NOSPACE, FAIL, "memory allocation failed")
 
-    /* If there is an available ID structure, use it. */
-    if(type_ptr->avail_count > 0) {
-        /* Use existing available ID struct */
-        if(NULL == (id_ptr = (H5I_id_info_t *)H5SL_remove_first(type_ptr->avail_ids)))
-            HGOTO_ERROR(H5E_ATOM, H5E_CANTREMOVE, FAIL, "can't remove ID from available ID list")
-    
-        /* Decrease count of available ID structures */
-        type_ptr->avail_count--;
-    } /* end if */
-    /* If no available ID structure, then create a new id for use, and
-     * allocate a new struct to house it. */
-    else {
-        /*
-         * This next section of code checks for the 'nextid' getting too large and
-         * wrapping around, thus necessitating checking for duplicate IDs being
-         * handed out.
-         */
-        if(type_ptr->nextid > (hid_t)ID_MASK)
-            type_ptr->wrapped = TRUE;
+    /* Create the struct & it's ID */
+    new_id = H5I_MAKE(type, type_ptr->nextid);
+    id_ptr->id = new_id;
+    id_ptr->count = 1; /*initial reference count*/
+    id_ptr->app_count = !!app_ref;
+    id_ptr->obj_ptr = object;
 
-        /*
-         * If we've wrapped around then we need to check for duplicate id's being
-         * handed out.
-         */
-        if(type_ptr->wrapped) {
-            H5I_wrap_ud_t udata;    /* User data for iteration */
-            herr_t iter_status;     /* Iteration status */
+    /* Insert into the type */
+    if(H5SL_insert(type_ptr->ids, id_ptr, &id_ptr->id) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTINSERT, FAIL, "can't insert ID node into skip list")
+    type_ptr->id_count++;
+    type_ptr->nextid++;
 
-            /* Set up user data for iteration */
-            udata.nextid = (hid_t)type_ptr->cls->reserved;
+    /*
+     * Sanity check for the 'nextid' getting too large and wrapping around.
+     */
+    HDassert(type_ptr->nextid <= ID_MASK);
 
-            /* Iterate over all the ID nodes, looking for a gap in the ID sequence */
-            if((iter_status = H5SL_iterate(type_ptr->ids, H5I__wrapped_cb, &udata)) < 0)
-                HGOTO_ERROR(H5E_ATOM, H5E_BADITER, FAIL, "ID iteration failed")
+    /* Set return value */
+    ret_value = new_id;
 
-            /* If we didn't break out of the iteration and we're at the max. ID, we've used all the IDs */
-            if(0 == iter_status && udata.nextid >= ID_MASK)
-                HGOTO_ERROR(H5E_ATOM, H5E_NOIDS, FAIL, "no IDs available in type")
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5I_register() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5I_register_with_id
+ *
+ * Purpose:	Registers an OBJECT in a TYPE with the supplied ID for it.
+ *          This routine will check to ensure the supplied ID is not already
+ *          in use, and ensure that it is a valid ID for the given type, 
+ *          but will NOT check to ensure the OBJECT is not already
+ *          registered (thus, it is possible to register one object under
+ *          multiple IDs).
+ *
+ * Return:  Success:    0
+ *          Failure:    -1
+ *
+ * Programmer: Mike McGreevy
+ *             Wednesday, July 21, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5I_register_with_id(H5I_type_t type, const void *object, hbool_t app_ref, hid_t id)
+{
+    H5I_id_type_t	*type_ptr;	/*ptr to the type		*/
+    H5I_id_info_t	*id_ptr;	/*ptr to the new ID information */
+    herr_t		ret_value = SUCCEED; /*return value		*/
 
-            /* Sanity check */
-            HDassert(udata.nextid < ID_MASK);
+    FUNC_ENTER_NOAPI(FAIL)
 
-            /* Retain the next ID for the class */
-            type_ptr->nextid = udata.nextid;
-        } /* end if */
+    /* Check arguments */
 
-        /* Allocate new ID struct */
-        if(NULL == (id_ptr = H5FL_MALLOC(H5I_id_info_t)))
-            HGOTO_ERROR(H5E_ATOM, H5E_NOSPACE, FAIL, "memory allocation failed")
+    /* Make sure ID is not already in use */
+    if(NULL != (id_ptr = H5I__find_id(id)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADRANGE, FAIL, "ID already in use?!")
 
-        /* Make a new ID */
-        id_ptr->id = H5I_MAKE(type, type_ptr->nextid);
+    /* Make sure type number is valid */
+    if(type <= H5I_BADID || type >= H5I_next_type)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid type number")
 
-        /* Increment nextid value */
-        type_ptr->nextid++;
-    } /* end if */
+    /* Get type pointer from list of types */
+    type_ptr = H5I_id_type_list_g[type];
+
+    if(NULL == type_ptr || type_ptr->init_count <= 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_BADGROUP, FAIL, "invalid type")
+
+    /* Make sure requested ID belongs to object's type */
+    if(H5I_TYPE(id) != type)
+        HGOTO_ERROR(H5E_ATOM, H5E_BADRANGE, FAIL, "invalid type for provided ID")
+
+    /* Allocate new structure to house this ID */
+    if(NULL == (id_ptr = H5FL_MALLOC(H5I_id_info_t)))
+        HGOTO_ERROR(H5E_ATOM, H5E_NOSPACE, FAIL, "memory allocation failed")
 
-    /* Fill in remaining fields of ID struct */
+    /* Create the struct & insert requested ID */
+    id_ptr->id = id;
     id_ptr->count = 1; /*initial reference count*/
     id_ptr->app_count = !!app_ref;
     id_ptr->obj_ptr = object;
@@ -948,12 +852,9 @@ H5I_register(H5I_type_t type, const void *object, hbool_t app_ref)
         HGOTO_ERROR(H5E_ATOM, H5E_CANTINSERT, FAIL, "can't insert ID node into skip list")
     type_ptr->id_count++;
 
-    /* Set return value */
-    ret_value = id_ptr->id;
-
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5I_register() */
+} /* end H5I_register_with_id() */
 
 

 /*-------------------------------------------------------------------------
@@ -973,8 +874,8 @@ done:
 void *
 H5I_subst(hid_t id, const void *new_object)
 {
-    H5I_id_info_t	*id_ptr;	/* Ptr to the atom	*/
-    void		*ret_value;	/* Return value		*/
+    H5I_id_info_t *id_ptr;      /* Pointer to the atom */
+    void *ret_value = NULL;	/* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -1013,7 +914,7 @@ H5I_object(hid_t id)
     H5I_id_info_t	*id_ptr;		/*ptr to the new atom	*/
     void		*ret_value = NULL;	/*return value		*/
 
-    FUNC_ENTER_NOAPI(NULL)
+    FUNC_ENTER_NOAPI_NOERR
 
     /* General lookup of the ID */
     if(NULL != (id_ptr = H5I__find_id(id))) {
@@ -1022,7 +923,6 @@ H5I_object(hid_t id)
         ret_value = (void *)id_ptr->obj_ptr;
     } /* end if */
 
-done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end if */
 
@@ -1047,7 +947,7 @@ done:
 void *
 H5Iobject_verify(hid_t id, H5I_type_t id_type)
 {
-    void * ret_value;                      /* Return value */
+    void *ret_value = NULL;             /* Return value */
 
     FUNC_ENTER_API(NULL)
     H5TRACE2("*x", "iIt", id, id_type);
@@ -1086,7 +986,7 @@ H5I_object_verify(hid_t id, H5I_type_t id_type)
     H5I_id_info_t	*id_ptr = NULL;		/*ptr to the new atom	*/
     void		*ret_value = NULL;	/*return value		*/
 
-    FUNC_ENTER_NOAPI(NULL)
+    FUNC_ENTER_NOAPI_NOERR
 
     HDassert(id_type >= 1 && id_type < H5I_next_type);
 
@@ -1097,7 +997,6 @@ H5I_object_verify(hid_t id, H5I_type_t id_type)
         ret_value = (void *)id_ptr->obj_ptr;
     } /* end if */
 
-done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5I_object_verify() */
 
@@ -1121,16 +1020,15 @@ done:
 H5I_type_t
 H5I_get_type(hid_t id)
 {
-    H5I_type_t		ret_value = H5I_BADID;
+    H5I_type_t ret_value = H5I_BADID;           /* Return value */
 
-    FUNC_ENTER_NOAPI(H5I_BADID)
+    FUNC_ENTER_NOAPI_NOERR
 
     if(id > 0)
         ret_value = H5I_TYPE(id);
 
     HDassert(ret_value >= H5I_BADID && ret_value < H5I_next_type);
 
-done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5I_get_type() */
 
@@ -1153,7 +1051,7 @@ done:
 H5I_type_t
 H5Iget_type(hid_t id)
 {
-    H5I_type_t		ret_value = H5I_BADID;          /* Return value */
+    H5I_type_t ret_value = H5I_BADID;   /* Return value */
 
     FUNC_ENTER_API(H5I_BADID)
     H5TRACE1("It", "i", id);
@@ -1188,7 +1086,7 @@ done:
 void *
 H5Iremove_verify(hid_t id, H5I_type_t id_type)
 {
-    void * ret_value;                      /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_API(NULL)
     H5TRACE2("*x", "iIt", id, id_type);
@@ -1255,8 +1153,8 @@ H5I__remove_verify(hid_t id, H5I_type_t id_type)
 static void *
 H5I__remove_common(H5I_id_type_t *type_ptr, hid_t id)
 {
-    H5I_id_info_t	*curr_id;	/*ptr to the current atom	*/
-    void *	        ret_value;	/*return value			*/
+    H5I_id_info_t *curr_id;	/* Pointer to the current atom */
+    void *ret_value = NULL;	/* Return value */
 
     FUNC_ENTER_STATIC
 
@@ -1269,44 +1167,11 @@ H5I__remove_common(H5I_id_type_t *type_ptr, hid_t id)
 
     /* (Casting away const OK -QAK) */
     ret_value = (void *)curr_id->obj_ptr;
-
-    /* See if we can reuse IDs of this type */
-    if(type_ptr->cls->flags & H5I_CLASS_REUSE_IDS) {
-        /* See if we can decrement the next ID for the ID class */
-        if(type_ptr->nextid == (ID_MASK & (curr_id->id + 1))) {
-            type_ptr->nextid--;
-            curr_id = H5FL_FREE(H5I_id_info_t, curr_id);
-        } /* end if */
-        else {
-            /* Store the ID on the available ID list, for later */
-            if((type_ptr->avail_count < MAX_FREE_ID_STRUCTS)
-                    && (type_ptr->id_count > 1)) {
-                if(H5SL_insert(type_ptr->avail_ids, curr_id, &curr_id->id) < 0)
-                    HGOTO_ERROR(H5E_ATOM, H5E_CANTINSERT, NULL, "can't insert available ID node into skip list")
-                type_ptr->avail_count++;
-            }
-            else
-                curr_id = H5FL_FREE(H5I_id_info_t, curr_id);
-        } /* end else */
-    } /* end if */
-    /* Otherwise, just toss it. */
-    else
-        curr_id = H5FL_FREE(H5I_id_info_t, curr_id);
+    curr_id = H5FL_FREE(H5I_id_info_t, curr_id);
 
     /* Decrement the number of IDs in the type */
     (type_ptr->id_count)--;
 
-    /* If there are no more IDs of this type, then we can free all available
-       ID strutures, and reset starting typeid and wrapped status. */
-    if(0 == type_ptr->id_count) {
-        if(H5SL_free(type_ptr->avail_ids, H5I__free_cb, NULL) < 0)
-            HGOTO_ERROR(H5E_ATOM, H5E_CANTREMOVE, NULL, "can't release available ID nodes")
-        type_ptr->avail_count = 0;
-
-        type_ptr->nextid = (hid_t)type_ptr->cls->reserved;
-        type_ptr->wrapped = FALSE;
-    } /* end if */
-
 done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5I__remove_common() */
@@ -1329,9 +1194,9 @@ done:
 void *
 H5I_remove(hid_t id)
 {
-    H5I_id_type_t	*type_ptr;	/*ptr to the atomic type	*/
-    H5I_type_t		type;		/*atom's atomic type		*/
-    void *	        ret_value;	/*return value			*/
+    H5I_id_type_t	*type_ptr;	        /* Pointer to the atomic type */
+    H5I_type_t		type;		        /* Atom's atomic type */
+    void *	        ret_value = NULL;	/* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -1370,7 +1235,7 @@ done:
 int
 H5Idec_ref(hid_t id)
 {
-    int ret_value;                      /* Return value */
+    int ret_value = 0;          /* Return value */
 
     FUNC_ENTER_API(FAIL)
     H5TRACE1("Is", "i", id);
@@ -1408,8 +1273,8 @@ done:
 int
 H5I_dec_ref(hid_t id)
 {
-    H5I_id_info_t	*id_ptr;	/*ptr to the new ID	*/
-    int ret_value;                      /* Return value */
+    H5I_id_info_t *id_ptr;      /* Pointer to the new ID */
+    int ret_value = 0;          /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1478,8 +1343,8 @@ done:
 int
 H5I_dec_app_ref(hid_t id)
 {
-    H5I_id_info_t	*id_ptr;	/*ptr to the new ID	*/
-    int ret_value;                      /* Return value */
+    H5I_id_info_t *id_ptr;      /* Pointer to the new ID */
+    int ret_value = 0;          /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1526,7 +1391,7 @@ done:
 int
 H5I_dec_app_ref_always_close(hid_t id)
 {
-    int ret_value;                      /* Return value */
+    int ret_value = 0;          /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1604,8 +1469,8 @@ done:
 int
 H5I_inc_ref(hid_t id, hbool_t app_ref)
 {
-    H5I_id_info_t	*id_ptr;	/*ptr to the ID		*/
-    int ret_value;                      /* Return value */
+    H5I_id_info_t *id_ptr;      /* Pointer to the ID */
+    int ret_value = 0;          /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1679,8 +1544,8 @@ done:
 int
 H5I_get_ref(hid_t id, hbool_t app_ref)
 {
-    H5I_id_info_t	*id_ptr;	/*ptr to the ID		*/
-    int ret_value;                      /* Return value */
+    H5I_id_info_t *id_ptr;      /* Pointer to the ID */
+    int ret_value = 0;          /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1754,8 +1619,8 @@ done:
 static int
 H5I__inc_type_ref(H5I_type_t type)
 {
-    H5I_id_type_t	*type_ptr;	/* ptr to the type	*/
-    int ret_value;                      /* Return value */
+    H5I_id_type_t *type_ptr;    /* Pointer to the type */
+    int ret_value = -1;         /* Return value */
 
     FUNC_ENTER_STATIC
 
@@ -1838,8 +1703,8 @@ done:
 herr_t
 H5I_dec_type_ref(H5I_type_t type)
 {
-    H5I_id_type_t	*type_ptr;      /* Pointer to the ID type */
-    herr_t		ret_value;      /* Return value */
+    H5I_id_type_t *type_ptr;    /* Pointer to the ID type */
+    herr_t ret_value = SUCCEED; /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1927,7 +1792,7 @@ static int
 H5I__get_type_ref(H5I_type_t type)
 {
     H5I_id_type_t	*type_ptr;	/*ptr to the type	*/
-    int ret_value;                      /* Return value */
+    int ret_value = -1;                 /* Return value */
 
     FUNC_ENTER_STATIC
 
@@ -2005,7 +1870,7 @@ static int
 H5I__search_cb(void *obj, hid_t id, void *_udata)
 {
     H5I_search_ud_t *udata = (H5I_search_ud_t *)_udata; /* User data for callback */
-    int ret_value;     /* Callback return value */
+    int ret_value = -1;         /* Callback return value */
 
     FUNC_ENTER_STATIC_NOERR
 
@@ -2193,7 +2058,7 @@ H5I__find_id(hid_t id)
 {
     H5I_type_t		type;			/*ID's type		*/
     H5I_id_type_t	*type_ptr;		/*ptr to the type	*/
-    H5I_id_info_t	*ret_value;		/*return value		*/
+    H5I_id_info_t	*ret_value = NULL;	/* Return value */
 
     FUNC_ENTER_STATIC_NOERR
 
@@ -2310,7 +2175,7 @@ hid_t
 H5I_get_file_id(hid_t obj_id, hbool_t app_ref)
 {
     H5I_type_t type;            /* ID type */
-    hid_t ret_value;            /* Return value */
+    hid_t ret_value = H5I_INVALID_HID;            /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -2426,9 +2291,8 @@ H5I__debug(H5I_type_t type)
     /* Header */
     fprintf(stderr, "	 init_count = %u\n", type_ptr->init_count);
     fprintf(stderr, "	 reserved   = %u\n", type_ptr->cls->reserved);
-    fprintf(stderr, "	 wrapped    = %u\n", type_ptr->wrapped);
-    fprintf(stderr, "	 id_count   = %u\n", type_ptr->id_count);
-    fprintf(stderr, "	 nextid	    = %u\n", type_ptr->nextid);
+    fprintf(stderr, "	 id_count   = %llu\n", (unsigned long long)type_ptr->id_count);
+    fprintf(stderr, "	 nextid	    = %llu\n", (unsigned long long)type_ptr->nextid);
 
     /* List */
     fprintf(stderr, "	 List:\n");
diff --git a/src/H5Imodule.h b/src/H5Imodule.h
new file mode 100644
index 0000000..19cc9a4
--- /dev/null
+++ b/src/H5Imodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5I package.  Including this header means that the source file
+ *		is part of the H5I package.
+ */
+#ifndef _H5Imodule_H
+#define _H5Imodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5I_MODULE
+#define H5_MY_PKG       H5I
+#define H5_MY_PKG_ERR   H5E_ATOM
+#define H5_MY_PKG_INIT  NO
+
+#endif /* _H5Imodule_H */
+
diff --git a/src/H5Ipkg.h b/src/H5Ipkg.h
index 1666b76..0a6ae8c 100644
--- a/src/H5Ipkg.h
+++ b/src/H5Ipkg.h
@@ -21,7 +21,7 @@
  *		the H5I package.  Source files outside the H5I package should
  *		include H5Iprivate.h instead.
  */
-#ifndef H5I_PACKAGE
+#if !(defined H5I_FRIEND || defined H5I_MODULE)
 #error "Do not include this file outside the H5I package!"
 #endif
 
diff --git a/src/H5Iprivate.h b/src/H5Iprivate.h
index 88c2432..c916f31 100644
--- a/src/H5Iprivate.h
+++ b/src/H5Iprivate.h
@@ -37,7 +37,6 @@
 
 /* Flags for ID class */
 #define H5I_CLASS_IS_APPLICATION        0x01
-#define H5I_CLASS_REUSE_IDS             0x02
 
 
 /****************************/
@@ -67,9 +66,10 @@ typedef struct H5I_class_t {
 /* Library-private Function Prototypes */
 /***************************************/
 H5_DLL herr_t H5I_register_type(const H5I_class_t *cls);
-H5_DLL int H5I_nmembers(H5I_type_t type);
+H5_DLL int64_t H5I_nmembers(H5I_type_t type);
 H5_DLL herr_t H5I_clear_type(H5I_type_t type, hbool_t force, hbool_t app_ref);
 H5_DLL hid_t H5I_register(H5I_type_t type, const void *object, hbool_t app_ref);
+H5_DLL herr_t H5I_register_with_id(H5I_type_t type, const void *object, hbool_t app_ref, hid_t id);
 H5_DLL void *H5I_subst(hid_t id, const void *new_object);
 H5_DLL void *H5I_object(hid_t id);
 H5_DLL void *H5I_object_verify(hid_t id, H5I_type_t id_type);
diff --git a/src/H5Ipublic.h b/src/H5Ipublic.h
index 5160434..3bf3c66 100644
--- a/src/H5Ipublic.h
+++ b/src/H5Ipublic.h
@@ -53,8 +53,8 @@ typedef enum H5I_type_t {
 } H5I_type_t;
 
 /* Type of atoms to return to users */
-typedef int hid_t;
-#define H5_SIZEOF_HID_T         H5_SIZEOF_INT
+typedef int64_t hid_t;
+#define H5_SIZEOF_HID_T         H5_SIZEOF_INT64_T
 
 /* An invalid object ID. This is also negative for error return. */
 #define H5I_INVALID_HID         (-1)
diff --git a/src/H5Itest.c b/src/H5Itest.c
index 5236e8d..9d451c6 100644
--- a/src/H5Itest.c
+++ b/src/H5Itest.c
@@ -23,7 +23,7 @@
 /* Module Setup */
 /****************/
 
-#define H5I_PACKAGE		/*suppress error about including H5Ipkg	  */
+#include "H5Imodule.h"          /* This source code file is part of the H5I module */
 #define H5I_TESTING		/*suppress warning about H5I testing funcs*/
 
 
@@ -80,7 +80,7 @@ ssize_t
 H5I_get_name_test(hid_t id, char *name/*out*/, size_t size, hbool_t *cached)
 {
     H5G_loc_t     loc;          /* Object location */
-    ssize_t       ret_value;    /* Return value */
+    ssize_t       ret_value = -1;       /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
diff --git a/src/H5L.c b/src/H5L.c
index 9c81f98..a1f3b6e 100644
--- a/src/H5L.c
+++ b/src/H5L.c
@@ -17,10 +17,8 @@
 /* Module Setup */
 /****************/
 
-#define H5L_PACKAGE		/*suppress error about including H5Lpkg   */
+#include "H5Lmodule.h"          /* This source code file is part of the H5L module */
 
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5L_init_interface
 
 /***********/
 /* Headers */
@@ -191,6 +189,9 @@ static herr_t H5L_get_name_by_idx_cb(H5G_loc_t *grp_loc/*in*/,
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 
 /*****************************/
 /* Library Private Variables */
@@ -235,7 +236,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5L_init_interface
+ * Function:	H5L__init_package
  *
  * Purpose:	Initialize information specific to H5L interface.
  *
@@ -246,12 +247,12 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5L_init_interface(void)
+herr_t
+H5L__init_package(void)
 {
     herr_t ret_value = SUCCEED;   /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Initialize user-defined link classes */
     if(H5L_register_external() < 0)
@@ -259,13 +260,13 @@ H5L_init_interface(void)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5L_init_interface() */
+} /* end H5L_init_package() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5L_term_interface
+ * Function:	H5L_term_package
  *
- * Purpose:	Terminate any resources allocated in H5L_init_interface.
+ * Purpose:	Terminate any resources allocated in H5L__init_package.
  *
  * Return:	Non-negative on success/Negative on failure
  *
@@ -275,21 +276,27 @@ done:
  *-------------------------------------------------------------------------
  */
 int
-H5L_term_interface(void)
+H5L_term_package(void)
 {
     int	n = 0;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    /* Free the table of link types */
-    H5L_table_g = (H5L_class_t *)H5MM_xfree(H5L_table_g);
-    H5L_table_used_g = H5L_table_alloc_g = 0;
+    if(H5_PKG_INIT_VAR) {
+        /* Free the table of link types */
+        if(H5L_table_g) {
+            H5L_table_g = (H5L_class_t *)H5MM_xfree(H5L_table_g);
+            H5L_table_used_g = H5L_table_alloc_g = 0;
+            n++;
+        } /* end if */
 
-    /* Mark the interface as uninitialized */
-    H5_interface_initialize_g = 0;
+        /* Mark the interface as uninitialized */
+        if(0 == n)
+            H5_PKG_INIT_VAR = FALSE;
+    } /* end if */
 
     FUNC_LEAVE_NOAPI(n)
-} /* H5L_term_interface() */
+} /* H5L_term_package() */
 
 

 /*-------------------------------------------------------------------------
@@ -2372,7 +2379,7 @@ H5L_delete_by_idx_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc/*in*/, const char H5_ATTR
     H5L_trav_gvbi_t *udata = (H5L_trav_gvbi_t *)_udata;   /* User data passed in */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(udata->dxpl_id, (obj_loc) ? (obj_loc->oloc->addr) : HADDR_UNDEF, FAIL)
 
     /* Check if the name of the group resolved to a valid object */
     if(obj_loc == NULL)
@@ -2388,7 +2395,7 @@ done:
      * location for the object */
     *own_loc = H5G_OWN_NONE;
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5L_delete_by_idx_cb() */
 
 

@@ -2756,7 +2763,7 @@ static htri_t
 H5L_exists(const H5G_loc_t *loc, const char *name, hid_t lapl_id, hid_t dxpl_id)
 {
     hbool_t exists = FALSE;     /* Whether the link exists in the group */
-    htri_t ret_value;           /* Return value */
+    htri_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -2913,7 +2920,7 @@ done:
 hid_t
 H5L_get_default_lcpl(void)
 {
-    hid_t ret_value;            /* Return value */
+    hid_t ret_value = H5I_INVALID_HID;          /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
diff --git a/src/H5Lexternal.c b/src/H5Lexternal.c
index 6269ae7..dd2061c 100644
--- a/src/H5Lexternal.c
+++ b/src/H5Lexternal.c
@@ -13,12 +13,17 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg   */
-#define H5L_PACKAGE		/*suppress error about including H5Lpkg   */
+/****************/
+/* Module Setup */
+/****************/
 
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5L_init_extern_interface
+#define H5G_FRIEND		/*suppress error about including H5Gpkg   */
+#include "H5Lmodule.h"          /* This source code file is part of the H5L module */
 
+
+/***********/
+/* Headers */
+/***********/
 #include "H5private.h"          /* Generic Functions                    */
 #include "H5ACprivate.h"        /* Metadata cache                       */
 #include "H5Eprivate.h"         /* Error handling                       */
@@ -29,13 +34,52 @@
 #include "H5Opublic.h"          /* File objects                         */
 #include "H5Pprivate.h"         /* Property lists                       */
 
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Version of external link format */
+#define H5L_EXT_VERSION         0
+
+/* Valid flags for external links */
+#define H5L_EXT_FLAGS_ALL       0
+
+/* Size of local link name buffer for traversing external links */
+#define H5L_EXT_TRAVERSE_BUF_SIZE       256
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
 static hid_t H5L_extern_traverse(const char H5_ATTR_UNUSED *link_name, hid_t cur_group,
     const void *udata, size_t H5_ATTR_UNUSED udata_size, hid_t lapl_id);
 static ssize_t H5L_extern_query(const char H5_ATTR_UNUSED * link_name, const void *udata,
     size_t udata_size, void * buf /*out*/, size_t buf_size);
 
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
 /* Default External Link link class */
-const H5L_class_t H5L_EXTERN_LINK_CLASS[1] = {{
+static const H5L_class_t H5L_EXTERN_LINK_CLASS[1] = {{
     H5L_LINK_CLASS_T_VERS,      /* H5L_class_t version            */
     H5L_TYPE_EXTERNAL,		/* Link type id number            */
     "external",                 /* Link name for debugging        */
@@ -47,41 +91,9 @@ const H5L_class_t H5L_EXTERN_LINK_CLASS[1] = {{
     H5L_extern_query            /* Query callback                 */
 }};
 
-/* Version of external link format */
-#define H5L_EXT_VERSION         0
-
-/* Valid flags for external links */
-#define H5L_EXT_FLAGS_ALL       0
-
-/* Size of local link name buffer for traversing external links */
-#define H5L_EXT_TRAVERSE_BUF_SIZE       256
 
 

 /*--------------------------------------------------------------------------
-NAME
-   H5L_init_extern_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5L_init_extern_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5L_init() currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5L_init_extern_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5L_init())
-} /* H5L_init_extern_interface() */
-
-

-
-/*--------------------------------------------------------------------------
  * Function: H5L_getenv_prefix_name --
  *
  * Purpose:  Get the first pathname in the list of pathnames stored in ENV_PREFIX,
@@ -180,8 +192,8 @@ done:
  *		Otherwise, the file access property retrieved from H5Pget_elink_fapl()
  *		is used to H5F_open() the target file.
  *
- *              Vailin Choi; Nov 2010
- *              Free memory pointed to by tmp_env_prefix for HDF5_EXT_PREFIX case.
+ *		Vailin Choi; Nov 2010
+ *		Free memory pointed to by tmp_env_prefix for HDF5_EXT_PREFIX case.
  *
  *-------------------------------------------------------------------------
  */
@@ -210,7 +222,7 @@ H5L_extern_traverse(const char H5_ATTR_UNUSED *link_name, hid_t cur_group,
     char        *actual_file_name = NULL; /* Parent file's actual name */
     H5P_genplist_t  *fa_plist;          /* File access property list pointer */
     H5F_close_degree_t 	fc_degree = H5F_CLOSE_WEAK;  /* File close degree for target file */
-    hid_t       ret_value;              /* Return value */
+    hid_t ret_value = H5I_INVALID_HID;  /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -254,7 +266,7 @@ H5L_extern_traverse(const char H5_ATTR_UNUSED *link_name, hid_t cur_group,
 	HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "can't get parent's file access property list")
 
     /* Get callback_info */
-    if(H5P_get(plist, H5L_ACS_ELINK_CB_NAME, &cb_info)<0)
+    if(H5P_get(plist, H5L_ACS_ELINK_CB_NAME, &cb_info) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get elink callback info")
 
     /* Get file access property list */
@@ -279,7 +291,7 @@ H5L_extern_traverse(const char H5_ATTR_UNUSED *link_name, hid_t cur_group,
         /* Check if we need to allocate larger buffer */
         if((size_t)group_name_len > sizeof(local_group_name)) {
             if(NULL == (parent_group_name = (char *)H5MM_malloc((size_t)group_name_len)))
-                HGOTO_ERROR(H5E_LINK, H5E_CANTALLOC, FAIL, "can't allocate buffer to hold group name, group_name_len = %Zu", group_name_len)
+                HGOTO_ERROR(H5E_LINK, H5E_CANTALLOC, FAIL, "can't allocate buffer to hold group name, group_name_len = %zd", group_name_len)
         } /* end if */
         else
             parent_group_name = local_group_name;
@@ -306,7 +318,7 @@ H5L_extern_traverse(const char H5_ATTR_UNUSED *link_name, hid_t cur_group,
      */
 
     /* Simplify intent flags for open calls */
-    intent = ((intent & H5F_ACC_RDWR) ? H5F_ACC_RDWR : H5F_ACC_RDONLY);
+    intent &= (H5F_ACC_RDWR | H5F_ACC_SWMR_WRITE | H5F_ACC_SWMR_READ);
 
     /* Copy the file name to use */
     if(NULL == (temp_file_name = H5MM_strdup(file_name)))
@@ -378,7 +390,7 @@ H5L_extern_traverse(const char H5_ATTR_UNUSED *link_name, hid_t cur_group,
 
     /* try searching from property list */
     if(ext_file == NULL) {
-        if(H5P_get(plist, H5L_ACS_ELINK_PREFIX_NAME, &my_prefix) < 0)
+        if(H5P_peek(plist, H5L_ACS_ELINK_PREFIX_NAME, &my_prefix) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external link prefix")
         if(my_prefix) {
             if(H5L_build_name(my_prefix, temp_file_name, &full_name/*out*/) < 0)
diff --git a/src/H5Lmodule.h b/src/H5Lmodule.h
new file mode 100644
index 0000000..e665c81
--- /dev/null
+++ b/src/H5Lmodule.h
@@ -0,0 +1,36 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5L package.  Including this header means that the source file
+ *		is part of the H5L package.
+ */
+#ifndef _H5Lmodule_H
+#define _H5Lmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5L_MODULE
+#define H5_MY_PKG       H5L
+#define H5_MY_PKG_ERR   H5E_LINK
+#define H5_MY_PKG_INIT  YES
+
+#endif /* _H5Lmodule_H */
+
+
diff --git a/src/H5Lpkg.h b/src/H5Lpkg.h
index 2e931f5..bb8534b 100644
--- a/src/H5Lpkg.h
+++ b/src/H5Lpkg.h
@@ -21,7 +21,7 @@
  *              only within the H5L package. Source files outside the
  *              H5L package should include H5Lprivate.h instead.
  */
-#ifndef H5L_PACKAGE
+#if !(defined H5L_FRIEND || defined H5L_MODULE)
 #error "Do not include this file outside the H5L package!"
 #endif
 
diff --git a/src/H5MF.c b/src/H5MF.c
index 82a87f1..0f2857e 100644
--- a/src/H5MF.c
+++ b/src/H5MF.c
@@ -28,8 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
-#define H5MF_PACKAGE		/*suppress error about including H5MFpkg  */
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
+#include "H5MFmodule.h"         /* This source code file is part of the H5MF module */
 
 
 /***********/
@@ -66,6 +66,13 @@ typedef enum {
     H5MF_AGGR_MERGE_TOGETHER            /* Metadata & raw data in one free list */
 } H5MF_aggr_merge_t;
 
+/* User data for section info iterator callback for iterating over free space sections */
+typedef struct {
+    H5F_sect_info_t *sects;     /* section info to be retrieved */
+    size_t sect_count;          /* # of sections requested */
+    size_t sect_idx;            /* the current count of sections */
+} H5MF_sect_iter_ud_t;
+
 
 /********************/
 /* Package Typedefs */
@@ -85,6 +92,9 @@ static herr_t H5MF_alloc_close(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type);
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 
 /*****************************/
 /* Library Private Variables */
@@ -230,6 +240,8 @@ H5MF_alloc_open(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type)
 {
     const H5FS_section_class_t *classes[] = { /* Free space section classes implemented for file */
         H5MF_FSPACE_SECT_CLS_SIMPLE};
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
@@ -243,6 +255,10 @@ H5MF_alloc_open(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type)
     HDassert(H5F_addr_defined(f->shared->fs_addr[type]));
     HDassert(f->shared->fs_state[type] == H5F_FS_STATE_CLOSED);
 
+    /* Set the ring type in the DXPL */
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_FSM, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+
     /* Open an existing free space structure for the file */
     if(NULL == (f->shared->fs_man[type] = H5FS_open(f, dxpl_id, f->shared->fs_addr[type],
 	    NELMTS(classes), classes, f, f->shared->alignment, f->shared->threshold)))
@@ -253,6 +269,10 @@ H5MF_alloc_open(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type)
         f->shared->fs_state[type] = H5F_FS_STATE_OPEN;
 
 done:
+    /* Reset the ring in the DXPL */
+    if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+        HDONE_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set property value")
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5MF_alloc_open() */
 
@@ -416,8 +436,10 @@ done:
 haddr_t
 H5MF_alloc(H5F_t *f, H5FD_mem_t alloc_type, hid_t dxpl_id, hsize_t size)
 {
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
     H5FD_mem_t  fs_type;                /* Free space type (mapped from allocation type) */
-    haddr_t	ret_value;              /* Return value */
+    haddr_t ret_value = HADDR_UNDEF;    /* Return value */
 
     FUNC_ENTER_NOAPI(HADDR_UNDEF)
 #ifdef H5MF_ALLOC_DEBUG
@@ -433,6 +455,10 @@ HDfprintf(stderr, "%s: alloc_type = %u, size = %Hu\n", FUNC, (unsigned)alloc_typ
     /* Get free space type from allocation type */
     fs_type = H5MF_ALLOC_TO_FS_TYPE(f, alloc_type);
 
+    /* Set the ring type in the DXPL */
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_FSM, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, HADDR_UNDEF, "unable to set ring value")
+
     /* Check if we are using the free space manager for this file */
     if(H5F_HAVE_FREE_SPACE_MANAGER(f)) {
         /* Check if the free space manager for the file has been initialized */
@@ -505,6 +531,10 @@ HDfprintf(stderr, "%s: Check 2.0\n", FUNC);
 	HGOTO_ERROR(H5E_VFL, H5E_CANTALLOC, HADDR_UNDEF, "allocation failed from aggr/vfd")
 
 done:
+    /* Reset the ring in the DXPL */
+    if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+        HDONE_ERROR(H5E_RESOURCE, H5E_CANTSET, HADDR_UNDEF, "unable to set property value")
+
 #ifdef H5MF_ALLOC_DEBUG
 HDfprintf(stderr, "%s: Leaving: ret_value = %a, size = %Hu\n", FUNC, ret_value, size);
 #endif /* H5MF_ALLOC_DEBUG */
@@ -544,7 +574,7 @@ haddr_t
 H5MF_alloc_tmp(H5F_t *f, hsize_t size)
 {
     haddr_t eoa;                /* End of allocated space in the file */
-    haddr_t ret_value;          /* Return value */
+    haddr_t ret_value = HADDR_UNDEF;    /* Return value */
 
     FUNC_ENTER_NOAPI(HADDR_UNDEF)
 #ifdef H5MF_ALLOC_DEBUG
@@ -558,7 +588,7 @@ HDfprintf(stderr, "%s: size = %Hu\n", FUNC, size);
     HDassert(size > 0);
 
     /* Retrieve the 'eoa' for the file */
-    if(HADDR_UNDEF == (eoa = H5FD_get_eoa(f->shared->lf, H5FD_MEM_DEFAULT)))
+    if(HADDR_UNDEF == (eoa = H5F_get_eoa(f, H5FD_MEM_DEFAULT)))
 	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, HADDR_UNDEF, "driver get_eoa request failed")
 
     /* Compute value to return */
@@ -591,12 +621,14 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5MF_xfree(H5F_t *f, H5FD_mem_t alloc_type, hid_t dxpl_id, haddr_t addr,
+H5MF_xfree(const H5F_t *f, H5FD_mem_t alloc_type, hid_t dxpl_id, haddr_t addr,
     hsize_t size)
 {
     H5F_io_info_t fio_info;             /* I/O info for operation */
     H5MF_free_section_t *node = NULL;   /* Free space section pointer */
     H5MF_sect_ud_t udata;               /* User data for callback */
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
     H5FD_mem_t fs_type;                 /* Free space type (mapped from allocation type) */
     herr_t ret_value = SUCCEED;         /* Return value */
 
@@ -615,6 +647,10 @@ HDfprintf(stderr, "%s: Entering - alloc_type = %u, addr = %a, size = %Hu\n", FUN
     if(H5F_addr_le(f->shared->tmp_addr, addr))
         HGOTO_ERROR(H5E_RESOURCE, H5E_BADRANGE, FAIL, "attempting to free temporary file space")
 
+    /* Set the ring type in the DXPL */
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_FSM, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+
     /* Set up I/O info for operation */
     fio_info.f = f;
     if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(dxpl_id)))
@@ -651,6 +687,12 @@ HDfprintf(stderr, "%s: Trying to avoid starting up free space manager\n", FUNC);
             else if(status > 0)
                 /* Indicate success */
                 HGOTO_DONE(SUCCEED)
+	    else if(size < f->shared->fs_threshold) {
+#ifdef H5MF_ALLOC_DEBUG_MORE
+HDfprintf(stderr, "%s: dropping addr = %a, size = %Hu, on the floor!\n", FUNC, addr, size);
+#endif /* H5MF_ALLOC_DEBUG_MORE */
+		HGOTO_DONE(SUCCEED)
+	    }
         } /* end if */
 
         /* If we are deleting the free space manager, leave now, to avoid
@@ -677,7 +719,6 @@ HDfprintf(stderr, "%s: dropping addr = %a, size = %Hu, on the floor!\n", FUNC, a
         if(H5MF_alloc_start(f, dxpl_id, fs_type) < 0)
             HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize file free space")
     } /* end if */
-    HDassert(f->shared->fs_man[fs_type]);
 
     /* Create free space section for block */
     if(NULL == (node = H5MF_sect_simple_new(addr, size)))
@@ -690,18 +731,37 @@ HDfprintf(stderr, "%s: dropping addr = %a, size = %Hu, on the floor!\n", FUNC, a
     udata.allow_sect_absorb = TRUE;
     udata.allow_eoa_shrink_only = FALSE; 
 
-    /* Add to the free space for the file */
+    /* If size of section freed is larger than threshold, add it to the free space manager */
+    if(size >= f->shared->fs_threshold) {
+	HDassert(f->shared->fs_man[fs_type]);
+
 #ifdef H5MF_ALLOC_DEBUG_MORE
 HDfprintf(stderr, "%s: Before H5FS_sect_add()\n", FUNC);
 #endif /* H5MF_ALLOC_DEBUG_MORE */
-    if(H5FS_sect_add(f, dxpl_id, f->shared->fs_man[fs_type], (H5FS_section_info_t *)node, H5FS_ADD_RETURNED_SPACE, &udata) < 0)
-        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINSERT, FAIL, "can't add section to file free space")
-    node = NULL;
+        /* Add to the free space for the file */
+	if(H5FS_sect_add(f, dxpl_id, f->shared->fs_man[fs_type], (H5FS_section_info_t *)node, H5FS_ADD_RETURNED_SPACE, &udata) < 0)
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINSERT, FAIL, "can't add section to file free space")
+	node = NULL;
 #ifdef H5MF_ALLOC_DEBUG_MORE
 HDfprintf(stderr, "%s: After H5FS_sect_add()\n", FUNC);
 #endif /* H5MF_ALLOC_DEBUG_MORE */
+    } /* end if */
+    else {
+        htri_t merged;          /* Whether node was merged */
+
+        /* Try to merge the section that is smaller than threshold */
+	if((merged = H5FS_sect_try_merge(f, dxpl_id, f->shared->fs_man[fs_type], (H5FS_section_info_t *)node, H5FS_ADD_RETURNED_SPACE, &udata)) < 0)
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINSERT, FAIL, "can't merge section to file free space")
+	else if(merged == TRUE) /* successfully merged */
+	    /* Indicate that the node was used */
+            node = NULL;
+    } /* end else */
 
 done:
+    /* Reset the ring in the DXPL */
+    if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+        HDONE_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set property value")
+
     /* Release section node, if allocated and not added to section list or merged */
     if(node)
         if(H5MF_sect_simple_free((H5FS_section_info_t *)node) < 0)
@@ -735,9 +795,11 @@ htri_t
 H5MF_try_extend(H5F_t *f, hid_t dxpl_id, H5FD_mem_t alloc_type, haddr_t addr,
     hsize_t size, hsize_t extra_requested)
 {
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
     haddr_t     end;            /* End of block to extend */
     H5FD_mem_t  map_type;       /* Mapped type */
-    htri_t	ret_value;      /* Return value */
+    htri_t	ret_value = FAIL;       /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 #ifdef H5MF_ALLOC_DEBUG
@@ -754,6 +816,10 @@ HDfprintf(stderr, "%s: Entering: alloc_type = %u, addr = %a, size = %Hu, extra_r
     /* Compute end of block to extend */
     end = addr + size;
 
+    /* Set the ring type in the DXPL */
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_FSM, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+
     /* Check if the block is exactly at the end of the file */
     if((ret_value = H5FD_try_extend(f->shared->lf, map_type, f, end, extra_requested)) < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTEXTEND, FAIL, "error extending file")
@@ -783,6 +849,10 @@ HDfprintf(stderr, "%s: Entering: alloc_type = %u, addr = %a, size = %Hu, extra_r
     } /* end if */
 
 done:
+    /* Reset the ring in the DXPL */
+    if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+        HDONE_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set property value")
+
 #ifdef H5MF_ALLOC_DEBUG
 HDfprintf(stderr, "%s: Leaving: ret_value = %t\n", FUNC, ret_value);
 #endif /* H5MF_ALLOC_DEBUG */
@@ -815,6 +885,8 @@ H5MF_sects_dump(f, dxpl_id, stderr);
 herr_t
 H5MF_get_freespace(H5F_t *f, hid_t dxpl_id, hsize_t *tot_space, hsize_t *meta_size)
 {
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
     haddr_t eoa;                /* End of allocated space in the file */
     haddr_t ma_addr = HADDR_UNDEF;    /* Base "metadata aggregator" address */
     hsize_t ma_size = 0;        /* Size of "metadata aggregator" */
@@ -835,9 +907,13 @@ H5MF_get_freespace(H5F_t *f, hid_t dxpl_id, hsize_t *tot_space, hsize_t *meta_si
     HDassert(f->shared->lf);
 
     /* Retrieve the 'eoa' for the file */
-    if(HADDR_UNDEF == (eoa = H5FD_get_eoa(f->shared->lf, H5FD_MEM_DEFAULT)))
+    if(HADDR_UNDEF == (eoa = H5F_get_eoa(f, H5FD_MEM_DEFAULT)))
 	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "driver get_eoa request failed")
 
+    /* Set the ring type in the DXPL */
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_FSM, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+
     /* Retrieve metadata aggregator info, if available */
     if(H5MF_aggr_query(f, &(f->shared->meta_aggr), &ma_addr, &ma_size) < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query metadata aggregator stats")
@@ -926,6 +1002,10 @@ H5MF_get_freespace(H5F_t *f, hid_t dxpl_id, hsize_t *tot_space, hsize_t *meta_si
 	*meta_size = tot_meta_size;
 
 done:
+    /* Reset the ring in the DXPL */
+    if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+        HDONE_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set property value")
+
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5MF_get_freespace() */
 
@@ -950,7 +1030,9 @@ H5MF_try_shrink(H5F_t *f, H5FD_mem_t alloc_type, hid_t dxpl_id, haddr_t addr,
 {
     H5MF_free_section_t *node = NULL;   /* Free space section pointer */
     H5MF_sect_ud_t udata;               /* User data for callback */
-    htri_t ret_value;                   /* Return value */
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
+    htri_t ret_value = FAIL;                   /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 #ifdef H5MF_ALLOC_DEBUG
@@ -964,6 +1046,10 @@ HDfprintf(stderr, "%s: Entering - alloc_type = %u, addr = %a, size = %Hu\n", FUN
     HDassert(H5F_addr_defined(addr));
     HDassert(size > 0);
 
+    /* Set the ring type in the DXPL */
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_FSM, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+
     /* Create free space section for block */
     if(NULL == (node = H5MF_sect_simple_new(addr, size)))
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize free space section")
@@ -985,6 +1071,10 @@ HDfprintf(stderr, "%s: Entering - alloc_type = %u, addr = %a, size = %Hu\n", FUN
     } /* end if */
 
 done:
+    /* Reset the ring in the DXPL */
+    if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+        HDONE_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set property value")
+
     /* Free section node allocated */
     if(node && H5MF_sect_simple_free((H5FS_section_info_t *)node) < 0)
         HDONE_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't free simple section node")
@@ -1077,6 +1167,8 @@ done:
 herr_t
 H5MF_close(H5F_t *f, hid_t dxpl_id)
 {
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
     H5FD_mem_t type;                    /* Memory type for iteration */
     herr_t ret_value = SUCCEED;         /* Return value */
 
@@ -1089,6 +1181,11 @@ HDfprintf(stderr, "%s: Entering\n", FUNC);
     HDassert(f);
     HDassert(f->shared);
     HDassert(f->shared->lf);
+    HDassert(f->shared->sblock);
+
+    /* Set the ring type in the DXPL */
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_FSM, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
 
     /* Free the space in aggregators */
     /* (for space not at EOF, it may be put into free space managers) */
@@ -1099,55 +1196,147 @@ HDfprintf(stderr, "%s: Entering\n", FUNC);
     if(H5MF_close_shrink_eoa(f, dxpl_id) < 0)
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't shrink eoa")
 
-    /* Iterate over all the free space types that have managers and get each free list's space */
-    for(type = H5FD_MEM_DEFAULT; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type)) {
+    /* Making free-space managers persistent for superblock version >= 2 */
+    if(f->shared->sblock->super_vers >= HDF5_SUPERBLOCK_VERSION_2
+            && f->shared->fs_strategy == H5F_FILE_SPACE_ALL_PERSIST) {
+        H5O_fsinfo_t fsinfo;		/* Free space manager info message */
+        hbool_t update = FALSE;		/* To update info for the message */
+
+        /* Check to remove free-space manager info message from superblock extension */
+        if(H5F_addr_defined(f->shared->sblock->ext_addr))
+            if(H5F_super_ext_remove_msg(f, dxpl_id, H5O_FSINFO_ID) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "error in removing message from superblock extension")
+
+	/* Free free-space manager header and/or section info header */
+	for(type = H5FD_MEM_SUPER; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type)) {
+	    H5FS_stat_t	fs_stat;	/* Information for free-space manager */
+
+	    /* Check for free space manager of this type */
+            if(f->shared->fs_man[type]) {
+		/* Switch to "about to be deleted" state */
+                f->shared->fs_state[type] = H5F_FS_STATE_DELETING;
+
+		/* Query the free space manager's information */
+                if(H5FS_stat_info(f, f->shared->fs_man[type], &fs_stat) < 0)
+		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't get free-space info")
+
+		/* Check if the free space manager has space in the file */
+                if(H5F_addr_defined(fs_stat.addr) || H5F_addr_defined(fs_stat.sect_addr)) {
+		    /* Delete the free space manager in the file */
+                     /* (will re-allocate later) */
+                    if(H5FS_free(f, f->shared->fs_man[type], dxpl_id) < 0)
+			HGOTO_ERROR(H5E_RESOURCE, H5E_CANTRELEASE, FAIL, "can't release free-space headers")
+		    f->shared->fs_addr[type] = HADDR_UNDEF;
+		} /* end if */
+	    } /* end iif */
+	    fsinfo.fs_addr[type-1] = HADDR_UNDEF;
+	} /* end for */
+
+	fsinfo.strategy = f->shared->fs_strategy;
+	fsinfo.threshold = f->shared->fs_threshold;
+
+	/* Write free-space manager info message to superblock extension object header */
+	/* Create the superblock extension object header in advance if needed */
+	if(H5F_super_ext_write_msg(f, dxpl_id, &fsinfo, H5O_FSINFO_ID, TRUE) < 0)
+	    HGOTO_ERROR(H5E_RESOURCE, H5E_WRITEERROR, FAIL, "error in writing message to superblock extension")
+
+	/* Re-allocate free-space manager header and/or section info header */
+	for(type = H5FD_MEM_SUPER; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type)) {
+	    H5FS_stat_t	fs_stat;		/* Information for free-space manager */
+
+	    /* Check for active free space manager of this type */
+            if(f->shared->fs_man[type]) {
+		/* Re-query free space manager info for this type */
+                if(H5FS_stat_info(f, f->shared->fs_man[type], &fs_stat) < 0)
+		    HGOTO_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't get free-space info")
+
+		/* Are there sections to persist? */
+                if(fs_stat.serial_sect_count) {
+		    /* Allocate space for free-space manager header */
+		    if(H5FS_alloc_hdr(f, f->shared->fs_man[type], &f->shared->fs_addr[type], dxpl_id) < 0)
+			HGOTO_ERROR(H5E_FSPACE, H5E_NOSPACE, FAIL, "can't allocated free-space header")
+
+		    /* Allocate space for free-space maanger section info header */
+		    if(H5FS_alloc_sect(f, f->shared->fs_man[type], dxpl_id) < 0)
+			HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate free-space section info")
+
+		    HDassert(f->shared->fs_addr[type]);
+		    fsinfo.fs_addr[type-1] = f->shared->fs_addr[type];
+		    update = TRUE;
+		} /* end if */
+	    } else if(H5F_addr_defined(f->shared->fs_addr[type])) {
+		fsinfo.fs_addr[type-1] = f->shared->fs_addr[type];
+		update = TRUE;
+	    } /* end else-if */
+	} /* end for */
+
+	/* Update the free space manager info message in superblock extension object header */
+	if(update)
+            if(H5F_super_ext_write_msg(f, dxpl_id, &fsinfo, H5O_FSINFO_ID, FALSE) < 0)
+	        HGOTO_ERROR(H5E_RESOURCE, H5E_WRITEERROR, FAIL, "error in writing message to superblock extension")
+
+	/* Final close of free-space managers */
+	for(type = H5FD_MEM_DEFAULT; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type)) {
+	    if(f->shared->fs_man[type]) {
+		if(H5FS_close(f, dxpl_id, f->shared->fs_man[type]) < 0)
+		    HGOTO_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't close free space manager")
+		f->shared->fs_man[type] = NULL;
+		f->shared->fs_state[type] = H5F_FS_STATE_CLOSED;
+	    } /* end if */
+	    f->shared->fs_addr[type] = HADDR_UNDEF;
+	} /* end for */
+    } /* end if */
+    else {  /* super_vers can be 0, 1, 2 */
+	/* Iterate over all the free space types that have managers and get each free list's space */
+	for(type = H5FD_MEM_DEFAULT; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type)) {
 #ifdef H5MF_ALLOC_DEBUG_MORE
 HDfprintf(stderr, "%s: Check 1.0 - f->shared->fs_man[%u] = %p, f->shared->fs_addr[%u] = %a\n", FUNC, (unsigned)type, f->shared->fs_man[type], (unsigned)type, f->shared->fs_addr[type]);
 #endif /* H5MF_ALLOC_DEBUG_MORE */
-        /* If the free space manager for this type is open, close it */
-        if(f->shared->fs_man[type]) {
+	    /* If the free space manager for this type is open, close it */
+	    if(f->shared->fs_man[type]) {
 #ifdef H5MF_ALLOC_DEBUG_MORE
 HDfprintf(stderr, "%s: Before closing free space manager\n", FUNC);
 #endif /* H5MF_ALLOC_DEBUG_MORE */
-            if(H5FS_close(f, dxpl_id, f->shared->fs_man[type]) < 0)
-                HGOTO_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't release free space info")
-            f->shared->fs_man[type] = NULL;
-            f->shared->fs_state[type] = H5F_FS_STATE_CLOSED;
-        } /* end if */
+		if(H5FS_close(f, dxpl_id, f->shared->fs_man[type]) < 0)
+		    HGOTO_ERROR(H5E_FSPACE, H5E_CANTRELEASE, FAIL, "can't release free space info")
+		f->shared->fs_man[type] = NULL;
+		f->shared->fs_state[type] = H5F_FS_STATE_CLOSED;
+	    } /* end if */
 #ifdef H5MF_ALLOC_DEBUG_MORE
 HDfprintf(stderr, "%s: Check 2.0 - f->shared->fs_man[%u] = %p, f->shared->fs_addr[%u] = %a\n", FUNC, (unsigned)type, f->shared->fs_man[type], (unsigned)type, f->shared->fs_addr[type]);
 #endif /* H5MF_ALLOC_DEBUG_MORE */
 
-        /* If there is free space manager info for this type, delete it */
-        /* (XXX: Make this optional when free space for a file can be persistant) */
-        if(H5F_addr_defined(f->shared->fs_addr[type])) {
-            haddr_t tmp_fs_addr;            /* Temporary holder for free space manager address */
+	    /* If there is free space manager info for this type, delete it */
+	    if(H5F_addr_defined(f->shared->fs_addr[type])) {
+		haddr_t tmp_fs_addr;            /* Temporary holder for free space manager address */
 
-            /* Put address into temporary variable and reset it */
-            /* (Avoids loopback in file space freeing routine) */
-            tmp_fs_addr = f->shared->fs_addr[type];
-            f->shared->fs_addr[type] = HADDR_UNDEF;
+		/* Put address into temporary variable and reset it */
+		/* (Avoids loopback in file space freeing routine) */
+		tmp_fs_addr = f->shared->fs_addr[type];
+		f->shared->fs_addr[type] = HADDR_UNDEF;
 
-            /* Shift to "deleting" state, to make certain we don't track any
-             *  file space freed as a result of deleting the free space manager.
-             */
-            f->shared->fs_state[type] = H5F_FS_STATE_DELETING;
+		/* Shift to "deleting" state, to make certain we don't track any
+		 *  file space freed as a result of deleting the free space manager.
+		 */
+		f->shared->fs_state[type] = H5F_FS_STATE_DELETING;
 
 #ifdef H5MF_ALLOC_DEBUG_MORE
 HDfprintf(stderr, "%s: Before deleting free space manager\n", FUNC);
 #endif /* H5MF_ALLOC_DEBUG_MORE */
-            /* Delete free space manager for this type */
-	    if(H5FS_delete(f, dxpl_id, tmp_fs_addr) < 0)
-		HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "can't delete free space manager")
 
-            /* Shift [back] to closed state */
-            HDassert(f->shared->fs_state[type] == H5F_FS_STATE_DELETING);
-            f->shared->fs_state[type] = H5F_FS_STATE_CLOSED;
+		/* Delete free space manager for this type */
+		if(H5FS_delete(f, dxpl_id, tmp_fs_addr) < 0)
+		    HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "can't delete free space manager")
 
-            /* Sanity check that the free space manager for this type wasn't started up again */
-            HDassert(!H5F_addr_defined(f->shared->fs_addr[type]));
-        } /* end if */
-    } /* end for */
+		/* Shift [back] to closed state */
+		HDassert(f->shared->fs_state[type] == H5F_FS_STATE_DELETING);
+		f->shared->fs_state[type] = H5F_FS_STATE_CLOSED;
+
+		/* Sanity check that the free space manager for this type wasn't started up again */
+		HDassert(!H5F_addr_defined(f->shared->fs_addr[type]));
+	    } /* end if */
+	} /* end for */
+    } /* end else */
 
     /* Free the space in aggregators (again) */
     /* (in case any free space information re-started them) */
@@ -1160,9 +1349,146 @@ HDfprintf(stderr, "%s: Before deleting free space manager\n", FUNC);
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSHRINK, FAIL, "can't shrink eoa")
 
 done:
+    /* Reset the ring in the DXPL */
+    if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+        HDONE_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set property value")
+
 #ifdef H5MF_ALLOC_DEBUG
 HDfprintf(stderr, "%s: Leaving\n", FUNC);
 #endif /* H5MF_ALLOC_DEBUG */
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5MF_close() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_sects_cb()
+ *
+ * Purpose:	Iterator callback for each free-space section
+ *		Retrieve address and size into user data
+ *
+ * Return:	Always succeed
+ *
+ * Programmer:  Vailin Choi
+ *	        July 1st, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5MF_sects_cb(H5FS_section_info_t *_sect, void *_udata)
+{
+    H5MF_free_section_t *sect = (H5MF_free_section_t *)_sect;
+    H5MF_sect_iter_ud_t *udata = (H5MF_sect_iter_ud_t *)_udata;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(udata->sect_idx < udata->sect_count) {
+        udata->sects[udata->sect_idx].addr = sect->sect_info.addr;
+        udata->sects[udata->sect_idx].size  = sect->sect_info.size;
+        udata->sect_idx++;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5MF_sects_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5MF_get_free_sections()
+ *
+ * Purpose: 	To iterate over one or all free-space managers for:
+ *			# of sections
+ *			section info as defined in H5F_sect_info_t
+ *
+ * Return:	SUCCEED/FAIL
+ *
+ * Programmer:  Vailin Choi
+ *	        July 1st, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+ssize_t
+H5MF_get_free_sections(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type, size_t nsects, H5F_sect_info_t *sect_info)
+{
+    size_t 	total_sects = 0;	/* total number of sections */
+    H5MF_sect_iter_ud_t sect_udata;     /* User data for callback */
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
+    H5FD_mem_t	start_type, end_type;   /* Memory types to iterate over */
+    H5FD_mem_t 	ty;     		/* Memory type for iteration */
+    ssize_t 	ret_value = -1;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(f->shared);
+    HDassert(f->shared->lf);
+
+    /* Determine start/end points for loop */
+    if(type == H5FD_MEM_DEFAULT) {
+	start_type = H5FD_MEM_SUPER;
+	end_type = H5FD_MEM_NTYPES;
+    } /* end if */
+    else {
+	start_type = end_type = type;
+	H5_INC_ENUM(H5FD_mem_t, end_type);
+    } /* end else */
+
+    /* Set up user data for section iteration */
+    sect_udata.sects = sect_info;
+    sect_udata.sect_count = nsects;
+    sect_udata.sect_idx = 0;
+
+    /* Set the ring type in the DXPL */
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_FSM, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set ring value")
+
+    /* Iterate over memory types, retrieving the number of sections of each type */
+    for(ty = start_type; ty < end_type; H5_INC_ENUM(H5FD_mem_t, ty)) {
+	hbool_t fs_started = FALSE;
+
+	/* Open free space manager of this type, if it isn't already */
+        if(!f->shared->fs_man[ty] && H5F_addr_defined(f->shared->fs_addr[ty])) {
+	    if(H5MF_alloc_open(f, dxpl_id, ty) < 0)
+		HGOTO_ERROR(H5E_RESOURCE, H5E_CANTOPENOBJ, FAIL, "can't initialize file free space")
+            HDassert(f->shared->fs_man[ty]);
+	    fs_started = TRUE;
+	} /* end if */
+
+	/* Check if f there's free space sections of this type */
+        if(f->shared->fs_man[ty]) {
+            hsize_t hnums = 0;          /* Total # of sections */
+            size_t nums;                /* Total # of sections, cast to a size_t */
+
+            /* Query how many sections of this type */
+	    if(H5FS_sect_stats(f->shared->fs_man[ty], NULL, &hnums) < 0)
+		HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "can't query free space stats")
+            H5_CHECKED_ASSIGN(nums, size_t, hnums, hsize_t);
+
+            /* Increment total # of sections */
+            total_sects += nums;
+
+            /* Check if we should retrieve the section info */
+            if(sect_info && nums > 0) {
+                /* Iterate over all the free space sections of this type, adding them to the user's section info */
+                if(H5FS_sect_iterate(f, dxpl_id, f->shared->fs_man[ty], H5MF_sects_cb, &sect_udata) < 0)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_BADITER, FAIL, "can't iterate over sections")
+            } /* end if */
+        } /* end if */
+
+	/* Close the free space manager of this type, if we started it here */
+        if(fs_started)
+            if(H5MF_alloc_close(f, dxpl_id, ty) < 0)
+	        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTCLOSEOBJ, FAIL, "can't close file free space")
+    } /* end for */
+
+    /* Set return value */
+    ret_value = (ssize_t)total_sects;
+
+done:
+    /* Reset the ring in the DXPL */
+    if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+        HDONE_ERROR(H5E_RESOURCE, H5E_CANTSET, FAIL, "unable to set property value")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MF_get_free_sections() */
+
diff --git a/src/H5MFaggr.c b/src/H5MFaggr.c
index 02a1720..40f3ac0 100644
--- a/src/H5MFaggr.c
+++ b/src/H5MFaggr.c
@@ -25,8 +25,8 @@
 /* Module Setup */
 /****************/
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
-#define H5MF_PACKAGE		/*suppress error about including H5MFpkg  */
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
+#include "H5MFmodule.h"         /* This source code file is part of the H5MF module */
 
 
 /***********/
@@ -97,7 +97,7 @@ static herr_t H5MF_aggr_free(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type,
 haddr_t
 H5MF_aggr_vfd_alloc(H5F_t *f, H5FD_mem_t alloc_type, hid_t dxpl_id, hsize_t size)
 {
-    haddr_t	ret_value;              /* Return value */
+    haddr_t     ret_value = HADDR_UNDEF;        /* Return value */
 
     FUNC_ENTER_NOAPI(HADDR_UNDEF)
 #ifdef H5MF_ALLOC_DEBUG
@@ -158,7 +158,7 @@ H5MF_aggr_alloc(H5F_t *f, hid_t dxpl_id, H5F_blk_aggr_t *aggr,
     haddr_t	eoa_frag_addr = HADDR_UNDEF;    /* Address of fragment at EOA */
     hsize_t	eoa_frag_size = 0;      /* Size of fragment at EOA */
     haddr_t	eoa = HADDR_UNDEF;      /* Initial EOA for the file */
-    haddr_t 	ret_value;              /* Return value */
+    haddr_t     ret_value = HADDR_UNDEF;        /* Return value */
 
     FUNC_ENTER_NOAPI(HADDR_UNDEF)
 #ifdef H5MF_AGGR_DEBUG
@@ -180,11 +180,11 @@ HDfprintf(stderr, "%s: type = %u, size = %Hu\n", FUNC, (unsigned)type, size);
         HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, HADDR_UNDEF, "Unable to get eoa")
 
     /*
-     * If the aggregation feature is enabled for this file, allocate "generic"
-     * space and sub-allocate out of that, if possible. Otherwise just allocate
-     * through H5FD_alloc()
+     * If the aggregation feature is enabled for this file and strategy is not H5F_FILE_SPACE_VFD,
+     * allocate "generic" space and sub-allocate out of that, if possible.
+     * Otherwise just allocate through H5FD_alloc().
      */
-    if(f->shared->feature_flags & aggr->feature_flag) {
+    if((f->shared->feature_flags & aggr->feature_flag) && f->shared->fs_strategy != H5F_FILE_SPACE_VFD) {
         haddr_t	aggr_frag_addr = HADDR_UNDEF;   /* Address of aggregrator fragment */
         hsize_t	aggr_frag_size = 0;             /* Size of aggregator fragment */
         hsize_t alignment;                      /* Alignment of this section */
@@ -871,7 +871,7 @@ H5MF_aggrs_try_shrink_eoa(H5F_t *f, hid_t dxpl_id)
 {
     htri_t ma_status;        /* Whether the metadata aggregator can shrink the EOA */
     htri_t sda_status;       /* Whether the small data aggregator can shrink the EOA */
-    htri_t ret_value;        /* Return value */
+    htri_t ret_value = FAIL; /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
diff --git a/src/H5MFdbg.c b/src/H5MFdbg.c
index b4bb942..59da9e8 100644
--- a/src/H5MFdbg.c
+++ b/src/H5MFdbg.c
@@ -28,8 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
-#define H5MF_PACKAGE		/*suppress error about including H5MFpkg  */
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
+#include "H5MFmodule.h"         /* This source code file is part of the H5MF module */
 #define H5MF_DEBUGGING          /* Need access to file space debugging routines */
 
 
@@ -41,7 +41,6 @@
 #include "H5Fpkg.h"             /* File access				*/
 #include "H5MFpkg.h"		/* File memory management		*/
 
-#ifdef H5MF_ALLOC_DEBUG_DUMP
 
 /****************/
 /* Local Macros */
@@ -139,6 +138,67 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5MF_sects_debug_cb() */
 
+
+/*-------------------------------------------------------------------------
+ * Function:	H5MF_sects_debug
+ *
+ * Purpose:	Iterate over free space sections for a file
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at hdfgroup.org
+ *		January 31 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5MF_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t fs_addr, FILE *stream, int indent, int fwidth)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+    H5FD_mem_t 	type;                    /* Memory type for iteration */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /*
+     * Check arguments.
+     */
+    HDassert(f);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    for(type = H5FD_MEM_DEFAULT; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type))
+	if(H5F_addr_eq(f->shared->fs_addr[type], fs_addr)) {
+	    if(!f->shared->fs_man[type])
+		if(H5MF_alloc_open(f, dxpl_id, type) < 0)
+		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "can't initialize file free space")
+
+	    if(f->shared->fs_man[type]) {
+		H5MF_debug_iter_ud_t udata;        /* User data for callbacks */
+
+		/* Prepare user data for section iteration callback */
+		udata.fspace = f->shared->fs_man[type];
+		udata.stream = stream;
+		udata.indent = indent;
+		udata.fwidth = fwidth;
+
+		/* Iterate over all the free space sections */
+		if(H5FS_sect_iterate(f, dxpl_id, f->shared->fs_man[type], H5MF_sects_debug_cb, &udata) < 0)
+		    HGOTO_ERROR(H5E_HEAP, H5E_BADITER, FAIL, "can't iterate over heap's free space")
+
+		/* Close the free space information */
+		if(H5FS_close(f, dxpl_id, f->shared->fs_man[type]) < 0)
+		    HGOTO_ERROR(H5E_HEAP, H5E_CANTRELEASE, FAIL, "can't release free space info")
+	    } /* end if */
+	    break;
+	}
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5MF_sects_debug() */
+
+#ifdef H5MF_ALLOC_DEBUG_DUMP
 

 /*-------------------------------------------------------------------------
  * Function:	H5MF_sects_dump
@@ -178,7 +238,7 @@ HDfprintf(stderr, "%s: Dumping file free space sections\n", FUNC);
     HDassert(stream);
 
     /* Retrieve the 'eoa' for the file */
-    if(HADDR_UNDEF == (eoa = H5FD_get_eoa(f->shared->lf, H5FD_MEM_DEFAULT)))
+    if(HADDR_UNDEF == (eoa = H5F_get_eoa(f, H5FD_MEM_DEFAULT)))
 	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "driver get_eoa request failed")
 #ifdef H5MF_ALLOC_DEBUG
 HDfprintf(stderr, "%s: for type = H5FD_MEM_DEFAULT, eoa = %a\n", FUNC, eoa);
@@ -205,7 +265,7 @@ HDfprintf(stderr, "%s: sda_addr = %a, sda_size = %Hu, end of sda = %a\n", FUNC,
         if(H5FD_MEM_DEFAULT == f->shared->fs_type_map[type] ||
                 type == f->shared->fs_type_map[type]) {
             /* Retrieve the 'eoa' for this file memory type */
-            if(HADDR_UNDEF == (eoa = H5FD_get_eoa(f->shared->lf, type)))
+            if(HADDR_UNDEF == (eoa = H5F_get_eoa(f, type)))
                 HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "driver get_eoa request failed")
             HDfprintf(stream, "%*s%-*s %a\n", indent + 3, "", MAX(0, fwidth - 3),
                       "eoa:",
diff --git a/src/H5MFmodule.h b/src/H5MFmodule.h
new file mode 100644
index 0000000..6e5f8ad
--- /dev/null
+++ b/src/H5MFmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5MF package.  Including this header means that the source file
+ *		is part of the H5MF package.
+ */
+#ifndef _H5MFmodule_H
+#define _H5MFmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5MF_MODULE
+#define H5_MY_PKG       H5MF
+#define H5_MY_PKG_ERR   H5E_RESOURCE
+#define H5_MY_PKG_INIT  NO
+
+#endif /* _H5MFmodule_H */
+
diff --git a/src/H5MFpkg.h b/src/H5MFpkg.h
index 2071a0a..1a62710 100644
--- a/src/H5MFpkg.h
+++ b/src/H5MFpkg.h
@@ -21,7 +21,7 @@
  *		the H5MF package.  Source files outside the H5MF package should
  *		include H5MFprivate.h instead.
  */
-#ifndef H5MF_PACKAGE
+#if !(defined H5MF_FRIEND || defined H5MF_MODULE)
 #error "Do not include this file outside the H5MF package!"
 #endif
 
diff --git a/src/H5MFprivate.h b/src/H5MFprivate.h
index 97c7aa3..024cc91 100644
--- a/src/H5MFprivate.h
+++ b/src/H5MFprivate.h
@@ -67,12 +67,14 @@ H5_DLL herr_t H5MF_close(H5F_t *f, hid_t dxpl_id);
 /* File space allocation routines */
 H5_DLL haddr_t H5MF_alloc(H5F_t *f, H5FD_mem_t type, hid_t dxpl_id, hsize_t size);
 H5_DLL haddr_t H5MF_aggr_vfd_alloc(H5F_t *f, H5FD_mem_t type, hid_t dxpl_id, hsize_t size);
-H5_DLL herr_t H5MF_xfree(H5F_t *f, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
+H5_DLL herr_t H5MF_xfree(const H5F_t *f, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr,
 			  hsize_t size);
 H5_DLL herr_t H5MF_try_extend(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type,
     haddr_t addr, hsize_t size, hsize_t extra_requested);
 H5_DLL htri_t H5MF_try_shrink(H5F_t *f, H5FD_mem_t alloc_type, hid_t dxpl_id,
     haddr_t addr, hsize_t size);
+H5_DLL ssize_t H5MF_get_free_sections(H5F_t *f, hid_t dxpl_id, H5FD_mem_t type,
+    size_t nsects, H5F_sect_info_t *sect_info);
 
 /* File 'temporary' space allocation routines */
 H5_DLL haddr_t H5MF_alloc_tmp(H5F_t *f, hsize_t size);
@@ -83,10 +85,8 @@ H5_DLL htri_t H5MF_aggrs_try_shrink_eoa(H5F_t *f, hid_t dxpl_id);
 
 /* Debugging routines */
 #ifdef H5MF_DEBUGGING
-#ifdef NOT_YET
 H5_DLL herr_t H5MF_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr,
     FILE *stream, int indent, int fwidth);
-#endif /* NOT_YET */
 #endif /* H5MF_DEBUGGING */
 
 #endif /* end _H5MFprivate_H */
diff --git a/src/H5MFsection.c b/src/H5MFsection.c
index bc147ed..f333356 100644
--- a/src/H5MFsection.c
+++ b/src/H5MFsection.c
@@ -25,8 +25,8 @@
 /* Module Setup */
 /****************/
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
-#define H5MF_PACKAGE		/*suppress error about including H5MFpkg  */
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
+#include "H5MFmodule.h"         /* This source code file is part of the H5MF module */
 
 
 /***********/
@@ -132,7 +132,7 @@ H5MF_free_section_t *
 H5MF_sect_simple_new(haddr_t sect_off, hsize_t sect_size)
 {
     H5MF_free_section_t *sect = NULL;   /* 'Simple' free space section to add */
-    H5MF_free_section_t *ret_value;     /* Return value */
+    H5MF_free_section_t *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -178,7 +178,7 @@ H5MF_sect_simple_deserialize(const H5FS_section_class_t H5_ATTR_UNUSED *cls,
     hsize_t sect_size, unsigned H5_ATTR_UNUSED *des_flags)
 {
     H5MF_free_section_t *sect;          /* New section */
-    H5FS_section_info_t *ret_value;     /* Return value */
+    H5FS_section_info_t *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -219,7 +219,7 @@ H5MF_sect_simple_can_merge(const H5FS_section_info_t *_sect1,
 {
     const H5MF_free_section_t *sect1 = (const H5MF_free_section_t *)_sect1;   /* File free section */
     const H5MF_free_section_t *sect2 = (const H5MF_free_section_t *)_sect2;   /* File free section */
-    htri_t ret_value;                   /* Return value */
+    htri_t ret_value = FAIL;            /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -300,7 +300,7 @@ H5MF_sect_simple_can_shrink(const H5FS_section_info_t *_sect, void *_udata)
     H5MF_sect_ud_t *udata = (H5MF_sect_ud_t *)_udata;   /* User data for callback */
     haddr_t eoa;                /* End of address space in the file */
     haddr_t end;                /* End of section to extend */
-    htri_t ret_value;           /* Return value */
+    htri_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -310,7 +310,7 @@ H5MF_sect_simple_can_shrink(const H5FS_section_info_t *_sect, void *_udata)
     HDassert(udata->f);
 
     /* Retrieve the end of the file's address space */
-    if(HADDR_UNDEF == (eoa = H5FD_get_eoa(udata->f->shared->lf, udata->alloc_type)))
+    if(HADDR_UNDEF == (eoa = H5F_get_eoa(udata->f, udata->alloc_type)))
 	HGOTO_ERROR(H5E_RESOURCE, H5E_CANTGET, FAIL, "driver get_eoa request failed")
 
     /* Compute address of end of section to check */
@@ -519,7 +519,7 @@ H5MF_sect_simple_valid(const H5FS_section_class_t H5_ATTR_UNUSED *cls,
 static H5FS_section_info_t *
 H5MF_sect_simple_split(H5FS_section_info_t *sect, hsize_t frag_size)
 {
-    H5MF_free_section_t *ret_value;     /* Return value */
+    H5MF_free_section_t *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
diff --git a/src/H5MM.c b/src/H5MM.c
index c5450fe..a37bbff 100644
--- a/src/H5MM.c
+++ b/src/H5MM.c
@@ -15,13 +15,11 @@
 
 /*-------------------------------------------------------------------------
  *
- * Created:		H5MM.c
- *			Jul 10 1997
- *			Robb Matzke <matzke at llnl.gov>
- *
- * Purpose:		Memory management functions.
+ * Created:     H5MM.c
+ *              Jul 10 1997
+ *              Robb Matzke <matzke at llnl.gov>
  *
- * Modifications:
+ * Purpose:     Memory management functions
  *
  *-------------------------------------------------------------------------
  */
@@ -168,7 +166,6 @@ H5MM_realloc(void *mem, size_t size)
  *              NULL is an acceptable value for the input string.
  *
  * Return:      Success:    Pointer to a new string (NULL if s is NULL).
- *
  *              Failure:    abort()
  *
  * Programmer:  Robb Matzke
@@ -179,7 +176,7 @@ H5MM_realloc(void *mem, size_t size)
 char *
 H5MM_xstrdup(const char *s)
 {
-    char	*ret_value = NULL;
+    char    *ret_value = NULL;
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -204,7 +201,6 @@ done:
  *              an error will be raised.
  *
  * Return:      Success:    Pointer to a new string
- *
  *              Failure:    abort()
  *
  * Programmer:  Robb Matzke
@@ -215,14 +211,14 @@ done:
 char *
 H5MM_strdup(const char *s)
 {
-    char	*ret_value;
+    char *ret_value;
 
     FUNC_ENTER_NOAPI(NULL)
 
     if(!s)
-	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "null string")
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "null string")
     if(NULL == (ret_value = (char *)H5MM_malloc(HDstrlen(s) + 1)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
     HDstrcpy(ret_value, s);
 
 done:
@@ -231,21 +227,20 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5MM_xfree
+ * Function:    H5MM_xfree
  *
- * Purpose:	Just like free(3) except null pointers are allowed as
- *		arguments, and the return value (always NULL) can be
- *		assigned to the pointer whose memory was just freed:
+ * Purpose:     Just like free(3) except null pointers are allowed as
+ *              arguments, and the return value (always NULL) can be
+ *              assigned to the pointer whose memory was just freed:
  *
- *			thing = H5MM_xfree (thing);
+ *              thing = H5MM_xfree (thing);
  *
- * Return:	Success:	NULL
+ * Return:      Success:    NULL
+ *              Failure:    never fails
  *
- *		Failure:	never fails
- *
- * Programmer:	Robb Matzke
- *		matzke at llnl.gov
- *		Jul 10 1997
+ * Programmer:  Robb Matzke
+ *              matzke at llnl.gov
+ *              Jul 10 1997
  *
  *-------------------------------------------------------------------------
  */
diff --git a/src/H5MP.c b/src/H5MP.c
index 4820b76..50fc598 100644
--- a/src/H5MP.c
+++ b/src/H5MP.c
@@ -29,7 +29,7 @@
  *-------------------------------------------------------------------------
  */
 
-#define H5MP_PACKAGE		/*suppress error about including H5MPpkg  */
+#include "H5MPmodule.h"         /* This source code file is part of the H5MP module */
 
 /* Private headers */
 #include "H5private.h"		/* Generic Functions			*/
@@ -63,6 +63,9 @@
 /* Package Variable Definitions */
 /********************************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 
 /********************/
 /* Static Variables */
@@ -90,7 +93,7 @@ H5MP_pool_t *
 H5MP_create(size_t page_size, unsigned flags)
 {
     H5MP_pool_t *mp = NULL;             /* New memory pool header */
-    H5MP_pool_t *ret_value;             /* Return value */
+    H5MP_pool_t *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -141,7 +144,7 @@ H5MP_new_page(H5MP_pool_t *mp, size_t page_size)
 {
     H5MP_page_t *new_page;              /* New page created */
     H5MP_page_blk_t *first_blk;         /* Pointer to first block in page */
-    H5MP_page_t *ret_value;             /* Return value */
+    H5MP_page_t *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -212,7 +215,7 @@ H5MP_malloc (H5MP_pool_t *mp, size_t request)
     H5MP_page_t *alloc_page = NULL; /* Page to allocate space from */
     H5MP_page_blk_t *alloc_free;    /* Pointer to free space in page */
     size_t needed;                  /* Size requested, plus block header and alignment */
-    void *ret_value;                /* Return value */
+    void *ret_value = NULL;         /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
diff --git a/src/H5MPmodule.h b/src/H5MPmodule.h
new file mode 100644
index 0000000..ca6c405
--- /dev/null
+++ b/src/H5MPmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5MP package.  Including this header means that the source file
+ *		is part of the H5MP package.
+ */
+#ifndef _H5MPmodule_H
+#define _H5MPmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5MP_MODULE
+#define H5_MY_PKG       H5MP
+#define H5_MY_PKG_ERR   H5E_RESOURCE
+#define H5_MY_PKG_INIT  NO
+
+#endif /* _H5MPmodule_H */
+
diff --git a/src/H5MPpkg.h b/src/H5MPpkg.h
index 5a0b1f8..e724146 100644
--- a/src/H5MPpkg.h
+++ b/src/H5MPpkg.h
@@ -21,7 +21,7 @@
  *		the H5MP package.  Source files outside the H5MP package should
  *		include H5MPprivate.h instead.
  */
-#ifndef H5MP_PACKAGE
+#if !(defined H5MP_FRIEND || defined H5MP_MODULE)
 #error "Do not include this file outside the H5MP package!"
 #endif
 
diff --git a/src/H5MPtest.c b/src/H5MPtest.c
index ccbd140..3f218db 100644
--- a/src/H5MPtest.c
+++ b/src/H5MPtest.c
@@ -19,7 +19,7 @@
  * Purpose:	Memory pool testing functions.
  */
 
-#define H5MP_PACKAGE		/*suppress error about including H5MPpkg  */
+#include "H5MPmodule.h"         /* This source code file is part of the H5MP module */
 #define H5MP_TESTING		/*include H5MP testing funcs*/
 
 /* Private headers */
diff --git a/src/H5O.c b/src/H5O.c
index 38d9f6b..788d657 100644
--- a/src/H5O.c
+++ b/src/H5O.c
@@ -28,10 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
 
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5O_init_interface
 
 /***********/
 /* Headers */
@@ -44,6 +42,9 @@
 #include "H5Iprivate.h"		/* IDs			  		*/
 #include "H5Lprivate.h"		/* Links				*/
 #include "H5MFprivate.h"	/* File memory management		*/
+#ifdef H5O_ENABLE_BOGUS
+#include "H5MMprivate.h"	/* Memory management			*/
+#endif /* H5O_ENABLE_BOGUS */
 #include "H5Opkg.h"             /* Object headers			*/
 #include "H5SMprivate.h"        /* Shared object header messages        */
 
@@ -91,6 +92,9 @@ static const H5O_obj_class_t *H5O_obj_class_real(H5O_t *oh);
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 /* Header message ID to class mapping */
 
 /* Remember to increment H5O_MSG_TYPES in H5Opkg.h when adding a new
@@ -125,7 +129,8 @@ const H5O_msg_class_t *const H5O_msg_class_g[] = {
     H5O_MSG_DRVINFO,		/*0x0014 Driver info settings		*/
     H5O_MSG_AINFO,		/*0x0015 Attribute information		*/
     H5O_MSG_REFCOUNT,		/*0x0016 Object's ref. count		*/
-    H5O_MSG_UNKNOWN		/*0x0017 Placeholder for unknown message */
+    H5O_MSG_FSINFO,		/*0x0017 Free-space manager info message */
+    H5O_MSG_UNKNOWN,		/*0x0018 Placeholder for unknown message */
 };
 
 /* Declare a free list to manage the H5O_t struct */
@@ -174,7 +179,7 @@ static const H5O_obj_class_t *const H5O_obj_class_g[] = {
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_init_interface
+ * Function:	H5O__init_package
  *
  * Purpose:	Initialize information specific to H5O interface.
  *
@@ -183,25 +188,21 @@ static const H5O_obj_class_t *const H5O_obj_class_g[] = {
  * Programmer:	Quincey Koziol
  *              Thursday, January 18, 2007
  *
- * Changes:     JRM -- 12/12/07
- *              Added santity check verifying that H5O_msg_class_g
- *              is big enough.
- *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5O_init_interface(void)
+herr_t
+H5O__init_package(void)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_PACKAGE_NOERR
 
     /* H5O interface sanity checks */
-    HDassert(H5O_MSG_TYPES == NELMTS(H5O_msg_class_g));
-    HDassert(sizeof(H5O_fheap_id_t) == H5O_FHEAP_ID_LEN);
+    HDcompile_assert(H5O_MSG_TYPES == NELMTS(H5O_msg_class_g));
+    HDcompile_assert(sizeof(H5O_fheap_id_t) == H5O_FHEAP_ID_LEN);
 
-    HDassert(H5O_UNKNOWN_ID < H5O_MSG_TYPES);
+    HDcompile_assert(H5O_UNKNOWN_ID < H5O_MSG_TYPES);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5O_init_interface() */
+} /* end H5O__init_package() */
 
 

 /*-------------------------------------------------------------------------
@@ -243,7 +244,7 @@ H5Oopen(hid_t loc_id, const char *name, hid_t lapl_id)
 
     /* Open the object */
     if((ret_value = H5O_open_name(&loc, name, lapl_id, TRUE)) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open object")
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open object")
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -309,18 +310,18 @@ H5Oopen_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type,
 
     /* Find the object's location, according to the order in the index */
     if(H5G_loc_find_by_idx(&loc, group_name, idx_type, order, n, &obj_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group not found")
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "group not found")
     loc_found = TRUE;
 
     /* Open the object */
     if((ret_value = H5O_open_by_loc(&obj_loc, lapl_id, H5AC_ind_dxpl_id, TRUE)) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open object")
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open object")
 
 done:
     /* Release the object location if we failed after copying it */
     if(ret_value < 0 && loc_found)
         if(H5G_loc_free(&obj_loc) < 0)
-            HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't free location")
+            HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "can't free location")
 
     FUNC_LEAVE_API(ret_value)
 } /* end H5Oopen_by_idx() */
@@ -390,7 +391,7 @@ H5Oopen_by_addr(hid_t loc_id, haddr_t addr)
 
     /* Open the object */
     if((ret_value = H5O_open_by_loc(&obj_loc, lapl_id, H5AC_ind_dxpl_id, TRUE)) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open object")
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open object")
 
 done:
 
@@ -449,7 +450,7 @@ H5Olink(hid_t obj_id, hid_t new_loc_id, const char *new_name, hid_t lcpl_id,
 
     /* Link to the object */
     if(H5L_link(&new_loc, new_name, &obj_loc, lcpl_id, lapl_id, H5AC_dxpl_id) < 0)
-        HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link")
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to create link")
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -555,7 +556,7 @@ htri_t
 H5Oexists_by_name(hid_t loc_id, const char *name, hid_t lapl_id)
 {
     H5G_loc_t	loc;                    /* Location info */
-    hid_t       ret_value = FAIL;       /* Return value */
+    htri_t      ret_value = FAIL;       /* Return value */
 
     FUNC_ENTER_API(FAIL)
     H5TRACE3("t", "i*si", loc_id, name, lapl_id);
@@ -610,7 +611,7 @@ H5Oget_info(hid_t loc_id, H5O_info_t *oinfo)
 
     /* Retrieve the object's information */
     if(H5G_loc_info(&loc, ".", TRUE, oinfo/*out*/, H5P_LINK_ACCESS_DEFAULT, H5AC_ind_dxpl_id) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found")
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -654,7 +655,7 @@ H5Oget_info_by_name(hid_t loc_id, const char *name, H5O_info_t *oinfo, hid_t lap
 
     /* Retrieve the object's information */
     if(H5G_loc_info(&loc, name, TRUE, oinfo/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found")
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -714,17 +715,17 @@ H5Oget_info_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type,
 
     /* Find the object's location, according to the order in the index */
     if(H5G_loc_find_by_idx(&loc, group_name, idx_type, order, n, &obj_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group not found")
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "group not found")
     loc_found = TRUE;
 
     /* Retrieve the object's information */
     if(H5O_get_info(obj_loc.oloc, H5AC_ind_dxpl_id, TRUE, oinfo) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve object info")
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't retrieve object info")
 
 done:
     /* Release the object location */
     if(loc_found && H5G_loc_free(&obj_loc) < 0)
-        HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't free location")
+        HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "can't free location")
 
     FUNC_LEAVE_API(ret_value)
 } /* end H5Oget_info_by_idx() */
@@ -762,7 +763,7 @@ H5Oset_comment(hid_t obj_id, const char *comment)
 
     /* (Re)set the object's comment */
     if(H5G_loc_set_comment(&loc, ".", comment, H5P_LINK_ACCESS_DEFAULT, H5AC_ind_dxpl_id) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found")
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -809,7 +810,7 @@ H5Oset_comment_by_name(hid_t loc_id, const char *name, const char *comment,
 
     /* (Re)set the object's comment */
     if(H5G_loc_set_comment(&loc, name, comment, lapl_id, H5AC_ind_dxpl_id) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found")
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -847,7 +848,7 @@ H5Oget_comment(hid_t obj_id, char *comment, size_t bufsize)
 
     /* Retrieve the object's comment */
     if((ret_value = H5G_loc_get_comment(&loc, ".", comment/*out*/, bufsize, H5P_LINK_ACCESS_DEFAULT, H5AC_ind_dxpl_id)) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found")
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -893,7 +894,7 @@ H5Oget_comment_by_name(hid_t loc_id, const char *name, char *comment, size_t buf
 
     /* Retrieve the object's comment */
     if((ret_value = H5G_loc_get_comment(&loc, name, comment/*out*/, bufsize, lapl_id, H5AC_ind_dxpl_id)) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found")
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -951,7 +952,7 @@ H5Ovisit(hid_t obj_id, H5_index_t idx_type, H5_iter_order_t order,
 
     /* Call internal object visitation routine */
     if((ret_value = H5O_visit(obj_id, ".", idx_type, order, op, op_data, H5P_LINK_ACCESS_DEFAULT, H5AC_ind_dxpl_id)) < 0)
-	HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "object visitation failed")
+	HGOTO_ERROR(H5E_OHDR, H5E_BADITER, FAIL, "object visitation failed")
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -1017,7 +1018,7 @@ H5Ovisit_by_name(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
 
     /* Call internal object visitation routine */
     if((ret_value = H5O_visit(loc_id, obj_name, idx_type, order, op, op_data, lapl_id, H5AC_ind_dxpl_id)) < 0)
-	HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "object visitation failed")
+	HGOTO_ERROR(H5E_OHDR, H5E_BADITER, FAIL, "object visitation failed")
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -1085,6 +1086,117 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5Odisable_mdc_flushes
+ *
+ * Purpose:	To "cork" an object:
+ *		--keep dirty entries assoicated with the object in the metadata cache
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Vailin Choi; January 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Odisable_mdc_flushes(hid_t object_id)
+{
+    H5O_loc_t  *oloc;			/* Object location */
+    herr_t      ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", object_id);
+
+    /* Get the object's oloc */
+    if((oloc = H5O_get_loc(object_id)) == NULL)
+        HGOTO_ERROR(H5E_ATOM, H5E_BADVALUE, FAIL, "unable to get object location from ID")
+
+    if(H5AC_cork(oloc->file, oloc->addr, H5AC__SET_CORK, NULL) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "unable to cork an object")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Odisable_mdc_flushes() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Oenable_mdc_flushes
+ *
+ * Purpose:	To "uncork" an object
+ *		--release keeping dirty entries associated with the object 
+ *		  in the metadata cache
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Vailin Choi; January 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Oenable_mdc_flushes(hid_t object_id)
+{
+    H5O_loc_t  *oloc;			/* Object location */
+    herr_t      ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", object_id);
+
+    /* Get the object's oloc */
+    if((oloc = H5O_get_loc(object_id)) == NULL)
+        HGOTO_ERROR(H5E_ATOM, H5E_BADVALUE, FAIL, "unable to get object location from ID")
+
+    /* Set the value */
+    if(H5AC_cork(oloc->file, oloc->addr, H5AC__UNCORK, NULL) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "unable to uncork an object")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Oenable_mdc_flushes() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Oare_mdc_flushes_disabled
+ *
+ * Purpose:	Retrieve the object's "cork" status in the parameter "are_disabled":
+ *		  TRUE if mdc flushes for the object is disabled
+ *		  FALSE if mdc flushes for the object is not disabled
+ *		Return error if the parameter "are_disabled" is not supplied
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Vailin Choi; January 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Oare_mdc_flushes_disabled(hid_t object_id, hbool_t *are_disabled)
+{
+    H5O_loc_t  *oloc;			/* Object location */
+    herr_t      ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*b", object_id, are_disabled);
+
+    /* Check args */
+
+    /* Get the object's oloc */
+    if((oloc = H5O_get_loc(object_id)) == NULL)
+        HGOTO_ERROR(H5E_ATOM, H5E_BADVALUE, FAIL, "unable to get object location from ID")
+    if(!are_disabled)
+        HGOTO_ERROR(H5E_ATOM, H5E_BADVALUE, FAIL, "unable to get object location from ID")
+
+    /* Get the cork status */
+    if(H5AC_cork(oloc->file, oloc->addr, H5AC__GET_CORKED, are_disabled) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_BADVALUE, FAIL, "unable to retrieve an object's cork status")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Oare_mdc_flushes_disabled() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5O_create
  *
  * Purpose:	Creates a new object header. Allocates space for it and
@@ -1145,12 +1257,13 @@ H5O_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, size_t initial_rc,
 
     /* Initialize file-specific information for object header */
     store_msg_crt_idx = H5F_STORE_MSG_CRT_IDX(f);
-    if(H5F_USE_LATEST_FORMAT(f) || store_msg_crt_idx || (oh_flags & H5O_HDR_ATTR_CRT_ORDER_TRACKED))
+    if(H5F_USE_LATEST_FLAGS(f, H5F_LATEST_OBJ_HEADER) || store_msg_crt_idx || (oh_flags & H5O_HDR_ATTR_CRT_ORDER_TRACKED))
         oh->version = H5O_VERSION_LATEST;
     else
         oh->version = H5O_VERSION_1;
     oh->sizeof_size = H5F_SIZEOF_SIZE(f);
     oh->sizeof_addr = H5F_SIZEOF_ADDR(f);
+    oh->swmr_write = !!(H5F_INTENT(f) & H5F_ACC_SWMR_WRITE);
 #ifdef H5O_ENABLE_BAD_MESG_COUNT
     /* Check whether the "bad message count" property is set */
     if(H5P_exist_plist(oc_plist, H5O_BAD_MESG_COUNT_NAME) > 0) {
@@ -1163,6 +1276,14 @@ H5O_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, size_t initial_rc,
     /* Set initial status flags */
     oh->flags = oh_flags;
 
+    /* Create object header proxy if doing SWMR writes */
+    if(H5F_INTENT(f) & H5F_ACC_SWMR_WRITE) {
+        if(H5O_proxy_create(f, dxpl_id, oh) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTCREATE, FAIL, "can't create object header proxy")
+    } /* end if */
+    else
+        oh->proxy_addr = HADDR_UNDEF;
+
     /* Initialize version-specific fields */
     if(oh->version > H5O_VERSION_1) {
         /* Initialize all time fields with current time, if we are storing them */
@@ -1252,11 +1373,17 @@ H5O_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, size_t initial_rc,
         insert_flags |= H5AC__PIN_ENTRY_FLAG;
     } /* end if */
 
+    /* Set metadata tag in dxpl_id */
+    H5_BEGIN_TAG(dxpl_id, oh_addr, FAIL);
+
     /* Cache object header */
     if(H5AC_insert_entry(f, dxpl_id, H5AC_OHDR, oh_addr, oh, insert_flags) < 0)
-        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "unable to cache object header")
+        HGOTO_ERROR_TAG(H5E_OHDR, H5E_CANTINSERT, FAIL, "unable to cache object header")
     oh = NULL;
 
+    /* Reset metadata tag in dxpl_id */
+    H5_END_TAG(FAIL);
+
     /* Set up object location */
     loc->file = f;
     loc->addr = oh_addr;
@@ -1355,17 +1482,17 @@ H5O_open_name(H5G_loc_t *loc, const char *name, hid_t lapl_id, hbool_t app_ref)
 
     /* Find the object's location */
     if(H5G_loc_find(loc, name, &obj_loc/*out*/, lapl_id, dxpl_id) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
+        HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "object not found")
     loc_found = TRUE;
 
     /* Open the object */
     if((ret_value = H5O_open_by_loc(&obj_loc, lapl_id, dxpl_id, app_ref)) < 0)
-        HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open object")
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open object")
 
 done:
     if(ret_value < 0 && loc_found)
         if(H5G_loc_free(&obj_loc) < 0)
-            HDONE_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't free location")
+            HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "can't free location")
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5O_open_name() */
@@ -1388,7 +1515,7 @@ hid_t
 H5O_open_by_loc(const H5G_loc_t *obj_loc, hid_t lapl_id, hid_t dxpl_id, hbool_t app_ref)
 {
     const H5O_obj_class_t *obj_class;   /* Class of object for location */
-    hid_t      ret_value;               /* Return value */
+    hid_t               ret_value = H5I_INVALID_HID;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1484,7 +1611,7 @@ int
 H5O_link_oh(H5F_t *f, int adjust, hid_t dxpl_id, H5O_t *oh, hbool_t *deleted)
 {
     haddr_t addr = H5O_OH_GET_ADDR(oh);     /* Object header address */
-    int	ret_value;                      /* Return value */
+    int	ret_value = -1;                     /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1600,9 +1727,9 @@ H5O_link(const H5O_loc_t *loc, int adjust, hid_t dxpl_id)
 {
     H5O_t	*oh = NULL;
     hbool_t deleted = FALSE;            /* Whether the object was deleted */
-    int	ret_value;                      /* Return value */
+    int	ret_value = -1;                 /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, loc->addr, FAIL)
 
     /* check args */
     HDassert(loc);
@@ -1623,7 +1750,7 @@ done:
     if(ret_value >= 0 && deleted && H5O_delete(loc->file, dxpl_id, loc->addr) < 0)
         HDONE_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "can't delete object from file")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5O_link() */
 
 

@@ -1645,27 +1772,30 @@ done:
  *-------------------------------------------------------------------------
  */
 H5O_t *
-H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC_protect_t prot)
+H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, unsigned prot_flags)
 {
     H5O_t *oh = NULL;           /* Object header protected */
     H5O_cache_ud_t udata;       /* User data for protecting object header */
     H5O_cont_msgs_t cont_msg_info;      /* Continuation message info */
     unsigned file_intent;       /* R/W intent on file */
-    H5O_t *ret_value;           /* Return value */
+    H5O_t *ret_value = NULL;    /* Return value */
 
-    FUNC_ENTER_NOAPI(NULL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, loc->addr, NULL)
 
     /* check args */
     HDassert(loc);
     HDassert(loc->file);
 
+    /* prot_flags may only contain the H5AC__READ_ONLY_FLAG */
+    HDassert((prot_flags & (unsigned)(~H5AC__READ_ONLY_FLAG)) == 0);
+
     /* Check for valid address */
     if(!H5F_addr_defined(loc->addr))
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "address undefined")
 
     /* Check for write access on the file */
     file_intent = H5F_INTENT(loc->file);
-    if((prot == H5AC_WRITE) && (0 == (file_intent & H5F_ACC_RDWR)))
+    if((0 == (prot_flags & H5AC__READ_ONLY_FLAG)) && (0 == (file_intent & H5F_ACC_RDWR)))
 	HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "no write intent on file")
 
     /* Construct the user data for protect callback */
@@ -1681,7 +1811,7 @@ H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC_protect_t prot)
     udata.common.addr = loc->addr;
 
     /* Lock the object header into the cache */
-    if(NULL == (oh = (H5O_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, &udata, prot)))
+    if(NULL == (oh = (H5O_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, &udata, prot_flags)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to load object header")
 
     /* Check if there are any continuation messages to process */
@@ -1718,7 +1848,7 @@ H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC_protect_t prot)
             /* (which adds to the object header) */
             chk_udata.common.addr = cont_msg_info.msgs[curr_msg].addr;
             chk_udata.size = cont_msg_info.msgs[curr_msg].size;
-            if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR_CHK, cont_msg_info.msgs[curr_msg].addr, &chk_udata, prot)))
+            if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR_CHK, cont_msg_info.msgs[curr_msg].addr, &chk_udata, prot_flags)))
                 HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to load object header chunk")
 
             /* Sanity check */
@@ -1762,7 +1892,7 @@ H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC_protect_t prot)
             /* (object header will have been marked dirty during protect, if we
              *  have write access -QAK)
              */
-            if(prot != H5AC_WRITE)
+            if((prot_flags & H5AC__READ_ONLY_FLAG) != 0)
                 oh->prefix_modified = TRUE;
 #ifndef NDEBUG
             else {
@@ -1780,7 +1910,7 @@ H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC_protect_t prot)
         } /* end if */
 
         /* Check for any messages that were modified while being read in */
-        if(udata.common.mesgs_modified && prot != H5AC_WRITE)
+        if(udata.common.mesgs_modified && (0 == (prot_flags & H5AC__READ_ONLY_FLAG)))
             oh->mesgs_modified = TRUE;
 
         /* Reset the field that contained chunk 0's size during speculative load */
@@ -1790,7 +1920,7 @@ H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC_protect_t prot)
     /* Take care of loose ends for modifications made while bringing in the
      *      object header & chunks.
      */
-    if(prot == H5AC_WRITE) {
+    if(0 == (prot_flags & H5AC__READ_ONLY_FLAG)) {
         /* Check for the object header prefix being modified somehow */
         /* (usually through updating the # of object header messages) */
         if(oh->prefix_modified) {
@@ -1843,7 +1973,7 @@ done:
         if(H5AC_unprotect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, oh, H5AC__NO_FLAGS_SET) < 0)
             HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, NULL, "unable to release object header")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, NULL)
 } /* end H5O_protect() */
 
 

@@ -1867,8 +1997,8 @@ done:
 H5O_t *
 H5O_pin(const H5O_loc_t *loc, hid_t dxpl_id)
 {
-    H5O_t       *oh = NULL;     /* Object header */
-    H5O_t       *ret_value;     /* Return value */
+    H5O_t       *oh = NULL;             /* Object header */
+    H5O_t       *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -1876,7 +2006,7 @@ H5O_pin(const H5O_loc_t *loc, hid_t dxpl_id)
     HDassert(loc);
 
     /* Get header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_WRITE)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__NO_FLAGS_SET)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to protect object header")
 
     /* Increment the reference count on the object header */
@@ -2089,7 +2219,7 @@ H5O_touch(const H5O_loc_t *loc, hbool_t force, hid_t dxpl_id)
     HDassert(loc);
 
     /* Get the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_WRITE)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__NO_FLAGS_SET)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Create/Update the modification time message */
@@ -2191,9 +2321,10 @@ H5O_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr)
     H5O_t *oh = NULL;           /* Object header information */
     H5O_loc_t loc;              /* Object location for object to delete */
     unsigned oh_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting object header */
+    hbool_t corked;
     herr_t ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, addr, FAIL)
 
     /* Check args */
     HDassert(f);
@@ -2205,13 +2336,21 @@ H5O_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr)
     loc.holding_file = FALSE;
 
     /* Get the object header information */
-    if(NULL == (oh = H5O_protect(&loc, dxpl_id, H5AC_WRITE)))
+    if(NULL == (oh = H5O_protect(&loc, dxpl_id, H5AC__NO_FLAGS_SET)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Delete object */
     if(H5O_delete_oh(f, dxpl_id, oh) < 0)
         HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "can't delete object from file")
 
+    /* Uncork cache entries with tag: addr */
+    if(H5AC_cork(f, addr, H5AC__GET_CORKED, &corked) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_SYSTEM, FAIL, "unable to retrieve an object's cork status")
+    else if(corked) {
+	if(H5AC_cork(f, addr, H5AC__UNCORK, NULL) < 0)
+	    HGOTO_ERROR(H5E_OHDR, H5E_SYSTEM, FAIL, "unable to uncork an object")
+    }
+    
     /* Mark object header as deleted */
     oh_flags = H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
 
@@ -2219,7 +2358,7 @@ done:
     if(oh && H5O_unprotect(&loc, dxpl_id, oh, oh_flags) < 0)
 	HDONE_ERROR(H5E_OHDR, H5E_PROTECT, FAIL, "unable to release object header")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5O_delete() */
 
 

@@ -2286,10 +2425,10 @@ H5O_obj_type(const H5O_loc_t *loc, H5O_type_t *obj_type, hid_t dxpl_id)
     H5O_t	*oh = NULL;             /* Object header for location */
     herr_t      ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, loc->addr, FAIL)
 
     /* Load the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Retrieve the type of the object */
@@ -2300,7 +2439,7 @@ done:
     if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
 	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5O_obj_type() */
 
 

@@ -2362,12 +2501,12 @@ const H5O_obj_class_t *
 H5O_obj_class(const H5O_loc_t *loc, hid_t dxpl_id)
 {
     H5O_t	*oh = NULL;                     /* Object header for location */
-    const H5O_obj_class_t *ret_value;           /* Return value */
+    const H5O_obj_class_t *ret_value = NULL;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, loc->addr, NULL)
 
     /* Load the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to load object header")
 
     /* Test whether entry qualifies as a particular type of object */
@@ -2378,7 +2517,7 @@ done:
     if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
 	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, NULL, "unable to release object header")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, NULL)
 } /* end H5O_obj_class() */
 
 

@@ -2399,7 +2538,7 @@ static const H5O_obj_class_t *
 H5O_obj_class_real(H5O_t *oh)
 {
     size_t	i;                      /* Local index variable */
-    const H5O_obj_class_t *ret_value;   /* Return value */
+    const H5O_obj_class_t *ret_value = NULL;   /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -2441,7 +2580,7 @@ done:
 H5O_loc_t *
 H5O_get_loc(hid_t object_id)
 {
-    H5O_loc_t   *ret_value;     /* Return value */
+    H5O_loc_t   *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -2664,7 +2803,7 @@ H5O_get_hdr_info(const H5O_loc_t *loc, hid_t dxpl_id, H5O_hdr_info_t *hdr)
     HDmemset(hdr, 0, sizeof(*hdr));
 
     /* Get the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to load object header")
 
     /* Get the information for the object header */
@@ -2781,14 +2920,14 @@ H5O_get_info(const H5O_loc_t *loc, hid_t dxpl_id, hbool_t want_ih_info,
     H5O_t *oh = NULL;                   /* Object header */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, loc->addr, FAIL)
 
     /* Check args */
     HDassert(loc);
     HDassert(oinfo);
 
     /* Get the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Reset the object info structure */
@@ -2864,7 +3003,7 @@ H5O_get_info(const H5O_loc_t *loc, hid_t dxpl_id, hbool_t want_ih_info,
         /* Check for 'bh_info' callback for this type of object */
         if(obj_class->bh_info) {
             /* Call the object's class 'bh_info' routine */
-            if((obj_class->bh_info)(loc->file, dxpl_id, oh, &oinfo->meta_size.obj) < 0)
+            if((obj_class->bh_info)(loc, dxpl_id, oh, &oinfo->meta_size.obj) < 0)
                 HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "can't retrieve object's btree & heap info")
         } /* end if */
 
@@ -2879,7 +3018,7 @@ done:
     if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
 	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5O_get_info() */
 
 

@@ -2909,7 +3048,7 @@ H5O_get_create_plist(const H5O_loc_t *loc, hid_t dxpl_id, H5P_genplist_t *oc_pli
     HDassert(oc_plist);
 
     /* Get the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Set property values, if they were used for the object */
@@ -2964,7 +3103,7 @@ H5O_get_nlinks(const H5O_loc_t *loc, hid_t dxpl_id, hsize_t *nlinks)
     HDassert(nlinks);
 
     /* Get the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Retrieve the # of link messages seen when the object header was loaded */
@@ -3081,7 +3220,7 @@ H5O_get_rc_and_type(const H5O_loc_t *loc, hid_t dxpl_id, unsigned *rc, H5O_type_
     HDassert(loc);
 
     /* Get the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Set the object's reference count */
@@ -3261,7 +3400,7 @@ H5O_visit(hid_t loc_id, const char *obj_name, H5_index_t idx_type,
     hbool_t     loc_found = FALSE;      /* Entry at 'name' found */
     H5O_info_t  oinfo;          /* Object info struct */
     hid_t       obj_id = (-1);  /* ID of object */
-    herr_t      ret_value;      /* Return value */
+    herr_t      ret_value = FAIL;       /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -3454,7 +3593,7 @@ H5O_dec_rc_by_loc(const H5O_loc_t *loc, hid_t dxpl_id)
     HDassert(loc);
 
     /* Get header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
        HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
 
     /* Decrement the reference count on the object header */
@@ -3529,3 +3668,121 @@ H5O_free(H5O_t *oh)
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5O_free() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_pin_flush_dep_proxy
+ *
+ * Purpose:     Pin an object header proxy for use as a flush dependency
+ *              parent for items referenced by the object header.
+ *
+ * Return:      Success:        Pointer to the object header proxy
+ *                              structure for the object.
+ *              Failure:        NULL
+ *
+ * Programmer:  Neil Fortner
+ *              Mar 16 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+H5O_proxy_t *
+H5O_pin_flush_dep_proxy(H5O_loc_t *loc, hid_t dxpl_id)
+{
+    H5O_t       *oh = NULL;     /* Object header */
+    H5O_proxy_t *proxy = NULL;  /* Object header proxy */
+    H5O_proxy_t *ret_value = NULL; /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check args */
+    HDassert(loc);
+
+    /* Get header */
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to protect object header")
+
+    /* Pin object header proxy */
+    if(NULL == (proxy = H5O_proxy_pin(loc->file, dxpl_id, oh)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTPIN, NULL, "unable to pin object header proxy")
+
+    /* Set the return value */
+    ret_value = proxy;
+
+done:
+    /* Release the object header from the cache */
+    if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, NULL, "unable to release object header")
+
+    if(!ret_value)
+        if(proxy && H5O_proxy_unpin(proxy) < 0)
+            HDONE_ERROR(H5E_OHDR, H5E_CANTUNPIN, NULL, "unable to release object header proxy")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_pin_flush_dep_proxy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_pin_flush_dep_proxy_oh
+ *
+ * Purpose:     Pin an object header proxy for use as a flush dependency
+ *              parent for items referenced by the object header.
+ *
+ * Return:      Success:        Pointer to the object header proxy
+ *                              structure for the object.
+ *              Failure:        NULL
+ *
+ * Programmer:  Neil Fortner
+ *              Mar 16 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+H5O_proxy_t *
+H5O_pin_flush_dep_proxy_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh)
+{
+    H5O_proxy_t *ret_value = NULL; /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* check args */
+    HDassert(f);
+    HDassert(oh);
+
+    /* Pin object header proxy */
+    if(NULL == (ret_value = H5O_proxy_pin(f, dxpl_id, oh)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTPIN, NULL, "unable to pin object header proxy")
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_pin_flush_dep_proxy_oh() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_unpin_flush_dep_proxy
+ *
+ * Purpose:     Unpin an object header proxy.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Mar 16 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_unpin_flush_dep_proxy(H5O_proxy_t *proxy)
+{
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* check args */
+    HDassert(proxy);
+
+    /* Unin object header proxy */
+    if(H5O_proxy_unpin(proxy) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPIN, FAIL, "unable to unpin object header proxy")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_unpin_flush_dep_proxy() */
+
diff --git a/src/H5Oainfo.c b/src/H5Oainfo.c
index 5e0703b..44c6611 100644
--- a/src/H5Oainfo.c
+++ b/src/H5Oainfo.c
@@ -24,8 +24,9 @@
  *-------------------------------------------------------------------------
  */
 
-#define H5A_PACKAGE		/*suppress error about including H5Apkg	  */
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#define H5A_FRIEND		/*suppress error about including H5Apkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Apkg.h"             /* Attributes				*/
@@ -110,7 +111,7 @@ H5O_ainfo_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *o
 {
     H5O_ainfo_t	*ainfo = NULL;  /* Attribute info */
     unsigned char flags;        /* Flags for encoding attribute info */
-    void        *ret_value;     /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -239,7 +240,7 @@ H5O_ainfo_copy(const void *_mesg, void *_dest)
 {
     const H5O_ainfo_t   *ainfo = (const H5O_ainfo_t *)_mesg;
     H5O_ainfo_t         *dest = (H5O_ainfo_t *) _dest;
-    void                *ret_value;     /* Return value */
+    void                *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -279,7 +280,7 @@ static size_t
 H5O_ainfo_size(const H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, const void *_mesg)
 {
     const H5O_ainfo_t   *ainfo = (const H5O_ainfo_t *)_mesg;
-    size_t ret_value;   /* Return value */
+    size_t ret_value = 0;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -323,7 +324,9 @@ H5O_ainfo_free(void *mesg)
 /*-------------------------------------------------------------------------
  * Function:    H5O_ainfo_delete
  *
- * Purpose:     Free file space referenced by message
+ * Purpose:     Free file space referenced by message.  Note that open_oh
+ *              *must* be non-NULL - this means that calls to
+ *              H5O_msg_delete must include an oh if the type is ainfo.
  *
  * Return:      Non-negative on success/Negative on failure
  *
@@ -333,7 +336,7 @@ H5O_ainfo_free(void *mesg)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_ainfo_delete(H5F_t *f, hid_t dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh, void *_mesg)
+H5O_ainfo_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, void *_mesg)
 {
     H5O_ainfo_t *ainfo = (H5O_ainfo_t *)_mesg;
     herr_t ret_value = SUCCEED;   /* Return value */
@@ -343,11 +346,14 @@ H5O_ainfo_delete(H5F_t *f, hid_t dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh, void *_
     /* check args */
     HDassert(f);
     HDassert(ainfo);
+    HDassert(open_oh);
 
     /* If the object is using "dense" attribute storage, delete it */
-    if(H5F_addr_defined(ainfo->fheap_addr))
+    if(H5F_addr_defined(ainfo->fheap_addr)) {
+        /* Delete the attribute */
         if(H5A_dense_delete(f, dxpl_id, ainfo) < 0)
             HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free dense attribute storage")
+    } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -408,7 +414,7 @@ H5O_ainfo_copy_file(H5F_t *file_src, void *mesg_src, H5F_t *file_dst,
 {
     H5O_ainfo_t *ainfo_src = (H5O_ainfo_t *)mesg_src;
     H5O_ainfo_t *ainfo_dst = NULL;
-    void        *ret_value;             /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -427,10 +433,16 @@ H5O_ainfo_copy_file(H5F_t *file_src, void *mesg_src, H5F_t *file_dst,
     *ainfo_dst = *ainfo_src;
 
     if(H5F_addr_defined(ainfo_src->fheap_addr)) {
-        /* copy dense attribute */
+        /* Prepare to copy dense attributes - actual copy in post_copy */
+
+        /* Set copied metadata tag */
+        H5_BEGIN_TAG(dxpl_id, H5AC__COPIED_TAG, NULL);
 
         if(H5A_dense_create(file_dst, dxpl_id, ainfo_dst) < 0)
-            HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to create dense storage for attributes")
+            HGOTO_ERROR_TAG(H5E_OHDR, H5E_CANTINIT, NULL, "unable to create dense storage for attributes")
+
+        /* Reset metadata tag */
+        H5_END_TAG(NULL);
     } /* end if */
 
     /* Set return value */
diff --git a/src/H5Oalloc.c b/src/H5Oalloc.c
index e9d4f85..7263ca6 100644
--- a/src/H5Oalloc.c
+++ b/src/H5Oalloc.c
@@ -28,7 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 /***********/
 /* Headers */
@@ -515,7 +516,7 @@ H5O_alloc_extend_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned chunkno,
     uint8_t     *old_image;     /* Old address of chunk's image in memory */
     size_t      old_size;       /* Old size of chunk */
     htri_t      was_extended;   /* If chunk can be extended */
-    size_t      extend_msg;     /* Index of null message to extend */
+    size_t      extend_msg = 0; /* Index of null message to extend */
     hbool_t     extended_msg = FALSE;   /* Whether an existing message was extended */
     uint8_t     new_size_flags = 0;     /* New chunk #0 size flags */
     hbool_t     adjust_size_flags = FALSE;      /* Whether to adjust the chunk #0 size flags */
@@ -920,7 +921,7 @@ H5O_alloc_new_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t size, size_t *new
         oh->chunk = x;
     } /* end if */
 
-    chunkno = oh->nchunks++;
+    chunkno = (unsigned)oh->nchunks++;
     oh->chunk[chunkno].addr = new_chunk_addr;
     oh->chunk[chunkno].size = size;
     oh->chunk[chunkno].gap = 0;
@@ -965,6 +966,8 @@ H5O_alloc_new_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t size, size_t *new
                     oh->nmesgs--;
                 } /* end if */
                 else {
+                    HDassert(curr_msg->type->id != H5O_CONT_ID);
+
                     /* Copy the raw data */
                     HDmemcpy(p, curr_msg->raw - (size_t)H5O_SIZEOF_MSGHDR_OH(oh),
                         curr_msg->raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh));
@@ -1081,7 +1084,7 @@ H5O_alloc_new_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t size, size_t *new
     oh->mesg[idx].chunkno = chunkno;
 
     /* Insert the new chunk into the cache */
-    if(H5O_chunk_add(f, dxpl_id, oh, chunkno) < 0)
+    if(H5O_chunk_add(f, dxpl_id, oh, chunkno, oh->mesg[found_null].chunkno) < 0)
         HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "can't add new chunk to cache")
 
     /* Initialize the continuation information */
@@ -1454,11 +1457,12 @@ H5O_move_msgs_forward(H5F_t *f, hid_t dxpl_id, H5O_t *oh)
 {
     H5O_chunk_proxy_t *null_chk_proxy = NULL;  /* Chunk that null message is in */
     H5O_chunk_proxy_t *curr_chk_proxy = NULL;  /* Chunk that message is in */
+    H5O_chunk_proxy_t *cont_targ_chk_proxy = NULL; /* Chunk that continuation message points to */
     hbool_t null_chk_dirtied = FALSE;  /* Flags for unprotecting null chunk */
     hbool_t curr_chk_dirtied = FALSE;  /* Flags for unprotecting curr chunk */
     hbool_t packed_msg;                 /* Flag to indicate that messages were packed */
     hbool_t did_packing = FALSE;        /* Whether any messages were packed */
-    htri_t ret_value; 	                /* Return value */
+    htri_t ret_value = FAIL; 	        /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1543,13 +1547,13 @@ H5O_move_msgs_forward(H5F_t *f, hid_t dxpl_id, H5O_t *oh)
                 if(H5O_CONT_ID == curr_msg->type->id) {
                     htri_t status;      /* Status from moving messages */
 
-		    if((status = H5O_move_cont(f, dxpl_id, oh, u)) < 0)
-			HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "Error in moving messages into cont message")
-		    else if(status > 0) { /* Message(s) got moved into "continuation" message */
+                    if((status = H5O_move_cont(f, dxpl_id, oh, u)) < 0)
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "Error in moving messages into cont message")
+                    else if(status > 0) { /* Message(s) got moved into "continuation" message */
                         packed_msg = TRUE;
-			break;
-		    } /* end else-if */
-		} /* end if */
+                        break;
+                    } /* end else-if */
+                } /* end if */
 
                 /* Don't let locked messages be moved into earlier chunk */
                 if(!curr_msg->locked) {
@@ -1570,6 +1574,65 @@ H5O_move_msgs_forward(H5F_t *f, hid_t dxpl_id, H5O_t *oh)
                             if(NULL == (curr_chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, curr_msg->chunkno)))
                                 HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
 
+                            /* If the message being moved is a continuation
+                             * message and we are doing SWMR writes, we must
+                             * update the flush dependencies */
+                            if((H5F_INTENT(f) & H5F_ACC_SWMR_WRITE)
+                                    && (H5O_CONT_ID == curr_msg->type->id)) {
+                                void *null_chk_mdc_obj = NULL; /* The metadata cache object for the null_msg chunk */
+
+                                /* Point to the metadata cache object for the
+                                 * null message chunk, oh if in chunk 0 or the
+                                 * proxy otherwise */
+                                null_chk_mdc_obj = (null_msg->chunkno == 0
+                                        ? (void *)oh
+                                        : (void *)null_chk_proxy);
+
+                                /* The other chunks involved should never be
+                                 * chunk 0 */
+                                HDassert(curr_msg->chunkno > 0);
+                                HDassert(((H5O_cont_t *)(curr_msg->native))->chunkno > 0);
+
+                                /* Protect continuation message target chunk */
+                                if(NULL == (cont_targ_chk_proxy = H5O_chunk_protect(f, dxpl_id, oh, ((H5O_cont_t *)(curr_msg->native))->chunkno)))
+                                    HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
+
+                                /* Remove flush dependency on old continuation
+                                 * message chunk */
+				HDassert(cont_targ_chk_proxy);
+                                HDassert(cont_targ_chk_proxy->fd_parent_addr != HADDR_UNDEF);
+				HDassert(cont_targ_chk_proxy->fd_parent_ptr);
+				HDassert(curr_chk_proxy);
+				HDassert((void *)curr_chk_proxy == cont_targ_chk_proxy->fd_parent_ptr);
+				HDassert(H5F_addr_eq(curr_chk_proxy->cache_info.addr, cont_targ_chk_proxy->fd_parent_addr));
+
+                                if(H5AC_destroy_flush_dependency(curr_chk_proxy, cont_targ_chk_proxy) < 0)
+                                    HGOTO_ERROR(H5E_OHDR, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+
+				cont_targ_chk_proxy->fd_parent_addr = HADDR_UNDEF;
+				cont_targ_chk_proxy->fd_parent_ptr = NULL;
+
+                                /* Create flush dependency on new continuation
+                                 * message chunk */
+                                if(H5AC_create_flush_dependency(null_chk_mdc_obj, cont_targ_chk_proxy) < 0)
+                                    HGOTO_ERROR(H5E_OHDR, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+
+				HDassert(null_chk_mdc_obj);
+				HDassert(((H5C_cache_entry_t *)null_chk_mdc_obj)->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+				HDassert(((H5C_cache_entry_t *)null_chk_mdc_obj)->type);
+				HDassert((((H5C_cache_entry_t *)null_chk_mdc_obj)->type->id == H5AC_OHDR_ID) ||
+                                         (((H5C_cache_entry_t *)null_chk_mdc_obj)->type->id == H5AC_OHDR_CHK_ID));
+
+				cont_targ_chk_proxy->fd_parent_addr = ((H5C_cache_entry_t *)null_chk_mdc_obj)->addr;
+				cont_targ_chk_proxy->fd_parent_ptr = null_chk_mdc_obj;
+
+                                /* Unprotect continuation message target chunk
+                                 */
+                                if(H5O_chunk_unprotect(f, dxpl_id, cont_targ_chk_proxy, FALSE) < 0)
+                                    HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+                                cont_targ_chk_proxy = NULL;
+                            } /* end if */
+
                             /* Copy raw data for non-null message to new chunk */
                             HDmemcpy(null_msg->raw - H5O_SIZEOF_MSGHDR_OH(oh), curr_msg->raw - H5O_SIZEOF_MSGHDR_OH(oh), curr_msg->raw_size + (size_t)H5O_SIZEOF_MSGHDR_OH(oh));
 
@@ -1714,10 +1777,16 @@ H5O_move_msgs_forward(H5F_t *f, hid_t dxpl_id, H5O_t *oh)
     ret_value = (htri_t)did_packing;
 
 done:
-    if(null_chk_proxy && H5O_chunk_unprotect(f, dxpl_id, null_chk_proxy, null_chk_dirtied) < 0)
-        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect null object header chunk")
-    if(curr_chk_proxy && H5O_chunk_unprotect(f, dxpl_id, curr_chk_proxy, curr_chk_dirtied) < 0)
-        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect current object header chunk")
+    if(ret_value < 0) {
+        if(null_chk_proxy && H5O_chunk_unprotect(f, dxpl_id, null_chk_proxy, null_chk_dirtied) < 0)
+            HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect null object header chunk")
+        if(curr_chk_proxy && H5O_chunk_unprotect(f, dxpl_id, curr_chk_proxy, curr_chk_dirtied) < 0)
+            HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect current object header chunk")
+        if(cont_targ_chk_proxy && H5O_chunk_unprotect(f, dxpl_id, cont_targ_chk_proxy, FALSE) < 0)
+            HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect continuation message target object header chunk")
+    } /* end if */
+    else
+        HDassert(!null_chk_proxy && !curr_chk_proxy && !cont_targ_chk_proxy);
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* H5O_move_msgs_forward() */
@@ -1742,7 +1811,7 @@ H5O_merge_null(H5F_t *f, hid_t dxpl_id, H5O_t *oh)
 {
     hbool_t merged_msg;                 /* Flag to indicate that messages were merged */
     hbool_t did_merging = FALSE;        /* Whether any messages were merged */
-    htri_t ret_value; 	                /* Return value */
+    htri_t ret_value = FAIL; 	        /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1877,7 +1946,7 @@ H5O_remove_empty_chunks(H5F_t *f, hid_t dxpl_id, H5O_t *oh)
 {
     hbool_t deleted_chunk;              /* Whether to a chunk was deleted */
     hbool_t did_deleting = FALSE;       /* Whether any chunks were deleted */
-    htri_t ret_value; 	                /* Return value */
+    htri_t ret_value = FAIL; 	        /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
diff --git a/src/H5Oattr.c b/src/H5Oattr.c
index fd7fcda..9cbcdc4 100644
--- a/src/H5Oattr.c
+++ b/src/H5Oattr.c
@@ -13,9 +13,9 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#define H5A_PACKAGE             /*prevent warning from including H5Apkg   */
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
-#define H5S_PACKAGE	        /*suppress error about including H5Spkg	  */
+#define H5A_FRIEND		/*suppress error about including H5Apkg   */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+#define H5S_FRIEND	        /*suppress error about including H5Spkg	  */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -129,7 +129,7 @@ H5O_attr_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned H5_ATTR_UNUSED
     H5S_extent_t	*extent;	/*extent dimensionality information  */
     size_t		name_len;   	/*attribute name length */
     unsigned            flags = 0;      /* Attribute flags */
-    H5A_t		*ret_value;     /* Return value */
+    H5A_t		*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -380,7 +380,7 @@ done:
 static void *
 H5O_attr_copy(const void *_src, void *_dst)
 {
-    void *ret_value;            /* Return value */
+    void *ret_value = NULL;            /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -496,10 +496,6 @@ H5O_attr_reset(void H5_ATTR_UNUSED *_mesg)
  * Programmer:	Quincey Koziol
  *              Thursday, November 18, 2004
  *
- * Modification:Raymond Lu
- *              4 June 2008
- *              Let this function call H5A_close in turn.
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -652,7 +648,7 @@ H5O_attr_copy_file(H5F_t *file_src, const H5O_msg_class_t H5_ATTR_UNUSED *mesg_t
     void *native_src, H5F_t *file_dst, hbool_t *recompute_size,
     H5O_copy_t *cpy_info, void H5_ATTR_UNUSED *udata, hid_t dxpl_id)
 {
-    void        *ret_value;             /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
diff --git a/src/H5Oattribute.c b/src/H5Oattribute.c
index 0e6adf0..9b494a1 100644
--- a/src/H5Oattribute.c
+++ b/src/H5Oattribute.c
@@ -28,8 +28,9 @@
 /* Module Setup */
 /****************/
 
-#define H5A_PACKAGE		/*suppress error about including H5Apkg	  */
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#define H5A_FRIEND		/*suppress error about including H5Apkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 /***********/
 /* Headers */
@@ -40,8 +41,8 @@
 #include "H5MMprivate.h"	/* Memory management			*/
 #include "H5Opkg.h"             /* Object headers			*/
 #include "H5SMprivate.h"	/* Shared Object Header Messages	*/
-#include "H5Iprivate.h"		/* IDs			  		*/
-#include "H5Fprivate.h"		/* File 			        */
+#include "H5Iprivate.h"         /* IDs                                  */
+#include "H5Fprivate.h"         /* File                                 */
 
 
 /****************/
@@ -166,10 +167,6 @@ static htri_t H5O_attr_find_opened_attr(const H5O_loc_t *loc, H5A_t **attr,
  *		koziol at hdfgroup.org
  *		Dec  4 2006
  *
- * Modifications:
- *      Vailin Choi; Sept 2011
- *      Indicate that the object header is modified and might possibly need
- *      to condense messages in the object header
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -416,10 +413,6 @@ done:
  *		koziol at hdfgroup.org
  *		Dec 11 2006
  *
- * Modifications:
- *	Vailin Choi; September 2011
- *      Change oh_modified from boolean to unsigned
- *      (See H5Oprivate.h for possible flags)
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -482,16 +475,16 @@ H5O_attr_open_by_name(const H5O_loc_t *loc, const char *name, hid_t dxpl_id)
     H5A_t *exist_attr = NULL;           /* Existing opened attribute object */
     H5A_t *opened_attr = NULL;          /* Newly opened attribute object */
     htri_t found_open_attr = FALSE;     /* Whether opened object is found */
-    H5A_t *ret_value;                   /* Return value */
+    H5A_t *ret_value = NULL;            /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, loc->addr, NULL)
 
     /* Check arguments */
     HDassert(loc);
     HDassert(name);
 
     /* Protect the object header to iterate over */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, NULL, "unable to load object header")
 
     /* Check for attribute info stored */
@@ -558,7 +551,7 @@ done:
         if(H5A_close(opened_attr) < 0)
             HDONE_ERROR(H5E_ATTR, H5E_CANTCLOSEOBJ, NULL, "can't close attribute")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, NULL)
 } /* end H5O_attr_open_by_name() */
 
 

@@ -624,7 +617,7 @@ H5O_attr_open_by_idx(const H5O_loc_t *loc, H5_index_t idx_type,
     H5A_t *exist_attr = NULL;           /* Existing opened attribute object */
     H5A_t *opened_attr = NULL;          /* Newly opened attribute object */
     htri_t found_open_attr = FALSE;     /* Whether opened object is found */
-    H5A_t *ret_value;                   /* Return value */
+    H5A_t *ret_value = NULL;            /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -640,7 +633,7 @@ H5O_attr_open_by_idx(const H5O_loc_t *loc, H5_index_t idx_type,
         HGOTO_ERROR(H5E_ATTR, H5E_BADITER, NULL, "can't locate attribute")
 
     /* Protect the object header to iterate over */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, NULL, "unable to load object header")
 
     /* Find out whether it has already been opened.  If it has, close the object
@@ -854,11 +847,6 @@ done:
  *              4 June 2008
  *              Took out the data copying part because the attribute data
  *              is shared between attribute handle and object header.
- *
- * Modifications:
- *      Vailin Choi; Sept 2011
- *      Indicate that the object header is modified but does not need to
- *	condense messages in the object header
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -1018,10 +1006,6 @@ done:
  *		koziol at hdfgroup.org
  *		Dec  5 2006
  *
- * Modifications:
- *      Vailin Choi; September 2011
- *      Change "oh_modified" from boolean to unsigned
- *      (See H5Oprivate.h for possible flags)
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -1068,10 +1052,6 @@ H5O_attr_rename_chk_cb(H5O_t H5_ATTR_UNUSED *oh, H5O_mesg_t *mesg/*in,out*/,
  *		koziol at hdfgroup.org
  *		Dec  5 2006
  *
- * Modifications:
- *      Vailin Choi; Sept 2011
- *      Indicate that the object header is modified and might possibly need
- *      to condense messages in the object header
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -1204,7 +1184,7 @@ H5O_attr_rename(const H5O_loc_t *loc, hid_t dxpl_id, const char *old_name,
     H5O_ainfo_t ainfo;                  /* Attribute information for object */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, loc->addr, FAIL)
 
     /* Check arguments */
     HDassert(loc);
@@ -1269,7 +1249,7 @@ done:
     if(oh && H5O_unpin(oh) < 0)
         HDONE_ERROR(H5E_ATTR, H5E_CANTUNPIN, FAIL, "unable to unpin object header")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5O_attr_rename */
 
 

@@ -1293,9 +1273,9 @@ H5O_attr_iterate_real(hid_t loc_id, const H5O_loc_t *loc, hid_t dxpl_id,
     H5O_t *oh = NULL;                   /* Pointer to actual object header */
     H5O_ainfo_t ainfo;                  /* Attribute information for object */
     H5A_attr_table_t atable = {0, NULL};        /* Table of attributes */
-    herr_t ret_value;                   /* Return value */
+    herr_t ret_value = FAIL;            /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, loc->addr, FAIL)
 
     /* Check arguments */
     HDassert(loc);
@@ -1304,7 +1284,7 @@ H5O_attr_iterate_real(hid_t loc_id, const H5O_loc_t *loc, hid_t dxpl_id,
     HDassert(attr_op);
 
     /* Protect the object header to iterate over */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Check for attribute info stored */
@@ -1356,7 +1336,7 @@ done:
     if(atable.attrs && H5A_attr_release_table(&atable) < 0)
         HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "unable to release attribute table")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5O_attr_iterate_real() */
 
 

@@ -1378,7 +1358,7 @@ H5O_attr_iterate(hid_t loc_id, hid_t dxpl_id,
     hsize_t *last_attr, const H5A_attr_iter_op_t *attr_op, void *op_data)
 {
     H5G_loc_t loc;	        /* Object location */
-    herr_t ret_value;           /* Return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1534,10 +1514,6 @@ done:
  *		koziol at hdfgroup.org
  *		Dec 11 2006
  *
- * Modifications:
- *      Vailin Choi; Sept 2011
- *      Indicate that the object header is modified and might possibly need
- *      to condense messages in the object header
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -1595,7 +1571,7 @@ H5O_attr_remove(const H5O_loc_t *loc, const char *name, hid_t dxpl_id)
     htri_t ainfo_exists = FALSE;        /* Whether the attribute info exists in the file */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, loc->addr, FAIL)
 
     /* Check arguments */
     HDassert(loc);
@@ -1653,7 +1629,7 @@ done:
     if(oh && H5O_unpin(oh) < 0)
         HDONE_ERROR(H5E_ATTR, H5E_CANTUNPIN, FAIL, "unable to unpin object header")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5O_attr_remove() */
 
 

@@ -1680,7 +1656,7 @@ H5O_attr_remove_by_idx(const H5O_loc_t *loc, H5_index_t idx_type,
     H5A_attr_table_t atable = {0, NULL};        /* Table of attributes */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, loc->addr, FAIL)
 
     /* Check arguments */
     HDassert(loc);
@@ -1747,7 +1723,7 @@ done:
     if(atable.attrs && H5A_attr_release_table(&atable) < 0)
         HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "unable to release attribute table")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5O_attr_remove_by_idx() */
 
 

@@ -1768,7 +1744,7 @@ H5O_attr_count_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh, hsize_t *nattrs)
 {
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, oh->cache_info.addr, FAIL)
 
     /* Check arguments */
     HDassert(f);
@@ -1801,7 +1777,7 @@ H5O_attr_count_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh, hsize_t *nattrs)
     } /* end else */
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5O_attr_count_real */
 
 

@@ -1817,10 +1793,6 @@ done:
  *		koziol at hdfgroup.org
  *		Dec 11 2006
  *
- * Modifications:
- *      Vailin Choi; September 2011
- *      Change "oh_modified" from boolean to unsigned
- *      (See H5Oprivate.h for possible flags)
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -1866,16 +1838,16 @@ H5O_attr_exists(const H5O_loc_t *loc, const char *name, hid_t dxpl_id)
 {
     H5O_t *oh = NULL;           /* Pointer to actual object header */
     H5O_ainfo_t ainfo;          /* Attribute information for object */
-    htri_t ret_value;           /* Return value */
+    htri_t ret_value = FAIL;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, loc->addr, FAIL)
 
     /* Check arguments */
     HDassert(loc);
     HDassert(name);
 
     /* Protect the object header to iterate over */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Check for attribute info stored */
@@ -1916,7 +1888,7 @@ done:
     if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
         HDONE_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5O_attr_exists */
 
 

@@ -2021,7 +1993,7 @@ H5O_attr_count(const H5O_loc_t *loc, hid_t dxpl_id)
 {
     H5O_t *oh = NULL;           /* Pointer to actual object header */
     hsize_t nattrs;             /* Number of attributes */
-    int ret_value;              /* Return value */
+    int ret_value = -1;         /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -2029,7 +2001,7 @@ H5O_attr_count(const H5O_loc_t *loc, hid_t dxpl_id)
     HDassert(loc);
 
     /* Protect the object header to iterate over */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Retrieve # of attributes on object */
diff --git a/src/H5Obogus.c b/src/H5Obogus.c
index b368ab6..de205f6 100644
--- a/src/H5Obogus.c
+++ b/src/H5Obogus.c
@@ -28,7 +28,8 @@
  *-------------------------------------------------------------------------
  */
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
diff --git a/src/H5Obtreek.c b/src/H5Obtreek.c
index 802f23a..ac6fe37 100644
--- a/src/H5Obtreek.c
+++ b/src/H5Obtreek.c
@@ -21,7 +21,8 @@
  *              information in the superblock extension.
  */
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
@@ -83,7 +84,7 @@ H5O_btreek_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H
     unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
 {
     H5O_btreek_t	*mesg;          /* Native message */
-    void                *ret_value;     /* Return value */
+    void		*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -165,7 +166,7 @@ H5O_btreek_copy(const void *_mesg, void *_dest)
 {
     const H5O_btreek_t	*mesg = (const H5O_btreek_t *)_mesg;
     H5O_btreek_t	*dest = (H5O_btreek_t *)_dest;
-    void		*ret_value;
+    void		*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
diff --git a/src/H5Ocache.c b/src/H5Ocache.c
index 9057223..fb12a06 100644
--- a/src/H5Ocache.c
+++ b/src/H5Ocache.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
 
 
 /***********/
@@ -38,6 +38,7 @@
 #include "H5Eprivate.h"		/* Error handling		  	*/
 #include "H5FLprivate.h"	/* Free lists                           */
 #include "H5MFprivate.h"	/* File memory management		*/
+#include "H5MMprivate.h"        /* Memory management                    */
 #include "H5Opkg.h"             /* Object headers			*/
 #include "H5WBprivate.h"        /* Wrapped Buffers                      */
 
@@ -68,29 +69,45 @@
 /********************/
 
 /* Metadata cache callbacks */
-static H5O_t *H5O_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static herr_t H5O_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5O_t *oh, unsigned H5_ATTR_UNUSED * flags_ptr);
-static herr_t H5O_dest(H5F_t *f, H5O_t *oh);
-static herr_t H5O_clear(H5F_t *f, H5O_t *oh, hbool_t destroy);
-static herr_t H5O_size(const H5F_t *f, const H5O_t *oh, size_t *size_ptr);
-
-static H5O_chunk_proxy_t *H5O_cache_chk_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static herr_t H5O_cache_chk_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5O_chunk_proxy_t *chk_proxy, unsigned H5_ATTR_UNUSED * flags_ptr);
-static herr_t H5O_cache_chk_dest(H5F_t *f, H5O_chunk_proxy_t *chk_proxy);
-static herr_t H5O_cache_chk_clear(H5F_t *f, H5O_chunk_proxy_t *chk_proxy, hbool_t destroy);
-static herr_t H5O_cache_chk_size(const H5F_t *f, const H5O_chunk_proxy_t *chk_proxy, size_t *size_ptr);
+static herr_t H5O__cache_get_load_size(const void *image_ptr, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5O__cache_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
+static void *H5O__cache_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty); 
+static herr_t H5O__cache_image_len(const void *thing, size_t *image_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static herr_t H5O__cache_serialize(const H5F_t *f, void *image, size_t len,
+    void *thing); 
+static herr_t H5O__cache_free_icr(void *thing);
+static herr_t H5O__cache_clear(const H5F_t *f, void *thing, hbool_t about_to_destroy);
+
+static herr_t H5O__cache_chk_get_load_size(const void *image_ptr, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5O__cache_chk_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
+static void *H5O__cache_chk_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty); 
+static herr_t H5O__cache_chk_image_len(const void *thing, size_t *image_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static herr_t H5O__cache_chk_serialize(const H5F_t *f, void *image, size_t len,
+    void *thing);
+static herr_t H5O__cache_chk_notify(H5AC_notify_action_t action, void *_thing);
+static herr_t H5O__cache_chk_free_icr(void *thing);
+static herr_t H5O__cache_chk_clear(const H5F_t *f, void *thing, hbool_t about_to_destroy);
 
 /* Chunk proxy routines */
-static herr_t H5O_chunk_proxy_dest(H5O_chunk_proxy_t *chunk_proxy);
+static herr_t H5O__chunk_proxy_dest(H5O_chunk_proxy_t *chunk_proxy);
 
 /* Chunk routines */
-static herr_t H5O_chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len,
+static herr_t H5O__chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len,
     const uint8_t *image, H5O_common_cache_ud_t *udata, hbool_t *dirty);
-static herr_t H5O_chunk_serialize(const H5F_t *f, H5O_t *oh, unsigned chunkno);
+static herr_t H5O__chunk_serialize(const H5F_t *f, H5O_t *oh, unsigned chunkno);
 
 /* Misc. routines */
-static herr_t H5O_add_cont_msg(H5O_cont_msgs_t *cont_msg_info,
+static herr_t H5O__add_cont_msg(H5O_cont_msgs_t *cont_msg_info,
     const H5O_cont_t *cont);
+static herr_t H5O_decode_prefix(H5F_t *f, H5O_t *oh, const uint8_t *buf, void *_udata);
 
 
 /*********************/
@@ -99,22 +116,38 @@ static herr_t H5O_add_cont_msg(H5O_cont_msgs_t *cont_msg_info,
 
 /* H5O object header prefix inherits cache-like properties from H5AC */
 const H5AC_class_t H5AC_OHDR[1] = {{
-    H5AC_OHDR_ID,
-    (H5AC_load_func_t)H5O_load,
-    (H5AC_flush_func_t)H5O_flush,
-    (H5AC_dest_func_t)H5O_dest,
-    (H5AC_clear_func_t)H5O_clear,
-    (H5AC_size_func_t)H5O_size,
+    H5AC_OHDR_ID,                       /* Metadata client ID */
+    "object header",                    /* Metadata client name (for debugging) */
+    H5FD_MEM_OHDR,                      /* File space memory type for client */
+    H5AC__CLASS_SPECULATIVE_LOAD_FLAG,  /* Client class behavior flags */
+    H5O__cache_get_load_size,           /* 'get_load_size' callback */
+    H5O__cache_verify_chksum, 		/* 'verify_chksum' callback */
+    H5O__cache_deserialize,             /* 'deserialize' callback */
+    H5O__cache_image_len,               /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5O__cache_serialize,               /* 'serialize' callback */
+    NULL,                               /* 'notify' callback */
+    H5O__cache_free_icr,                /* 'free_icr' callback */
+    H5O__cache_clear,                   /* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
 }};
 
 /* H5O object header chunk inherits cache-like properties from H5AC */
 const H5AC_class_t H5AC_OHDR_CHK[1] = {{
-    H5AC_OHDR_CHK_ID,
-    (H5AC_load_func_t)H5O_cache_chk_load,
-    (H5AC_flush_func_t)H5O_cache_chk_flush,
-    (H5AC_dest_func_t)H5O_cache_chk_dest,
-    (H5AC_clear_func_t)H5O_cache_chk_clear,
-    (H5AC_size_func_t)H5O_cache_chk_size,
+    H5AC_OHDR_CHK_ID,                   /* Metadata client ID */
+    "object header continuation chunk", /* Metadata client name (for debugging) */
+    H5FD_MEM_OHDR,                      /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5O__cache_chk_get_load_size,       /* 'get_load_size' callback */
+    H5O__cache_chk_verify_chksum,	/* 'verify_chksum' callback */
+    H5O__cache_chk_deserialize,         /* 'deserialize' callback */
+    H5O__cache_chk_image_len,           /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5O__cache_chk_serialize,           /* 'serialize' callback */
+    H5O__cache_chk_notify,              /* 'notify' callback */
+    H5O__cache_chk_free_icr,            /* 'free_icr' callback */
+    H5O__cache_chk_clear,               /* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
 }};
 
 /* Declare external the free list for H5O_unknown_t's */
@@ -136,66 +169,34 @@ H5FL_SEQ_DEFINE(H5O_cont_t);
 /* Local Variables */
 /*******************/
 
-
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_load
- *
- * Purpose:	Loads an object header from disk.
+ * Function:	H5O_decode_prefix
  *
- * Return:	Success:	Pointer to the new object header.
+ * Purpose:	To decode the object header prefix.
+ *		The coding is extracted fromt H5O__cache_deserialize() to this routine.
  *
- *		Failure:	NULL
+ * Return:	Non-negative on success/Negative on failure
  *
- * Programmer:	Robb Matzke
- *		matzke at llnl.gov
- *		Aug  5 1997
+ * Programmer:	Vailin Choi; Aug 2015
  *
  *-------------------------------------------------------------------------
  */
-static H5O_t *
-H5O_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+static herr_t
+H5O_decode_prefix(H5F_t *f, H5O_t *oh, const uint8_t *buf, void *_udata)
 {
-    H5O_t	*oh = NULL;     /* Object header read in */
     H5O_cache_ud_t *udata = (H5O_cache_ud_t *)_udata;       /* User data for callback */
-    H5WB_t      *wb = NULL;     /* Wrapped buffer for prefix data */
-    uint8_t     read_buf[H5O_SPEC_READ_SIZE];       /* Buffer for speculative read */
-    const uint8_t *p;           /* Pointer into buffer to decode */
-    uint8_t     *buf;           /* Buffer to decode */
-    size_t	spec_read_size; /* Size of buffer to speculatively read in */
-    size_t	prefix_size;    /* Size of object header prefix */
-    size_t	buf_size;       /* Size of prefix+chunk #0 buffer */
-    haddr_t     eoa;		/* Relative end of file address	*/
-    H5O_t	*ret_value;     /* Return value */
+    const uint8_t *p = buf;   	/* Pointer into buffer to decode */
+    size_t prefix_size;    	/* Size of object header prefix */
+    herr_t ret_value = SUCCEED; /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
     /* Check arguments */
     HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    HDassert(oh);
+    HDassert(buf);
     HDassert(udata);
-    HDassert(udata->common.f);
-    HDassert(udata->common.cont_msg_info);
-
-    /* Make certain we don't speculatively read off the end of the file */
-    if(HADDR_UNDEF == (eoa = H5F_get_eoa(f, H5FD_MEM_OHDR)))
-        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to determine file size")
-
-    /* Compute the size of the speculative object header buffer */
-    H5_CHECKED_ASSIGN(spec_read_size, size_t, MIN(eoa - addr, H5O_SPEC_READ_SIZE), hsize_t);
-
-    /* Attempt to speculatively read both object header prefix and first chunk */
-    if(H5F_block_read(f, H5FD_MEM_OHDR, addr, spec_read_size, dxpl_id, read_buf) < 0)
-	HGOTO_ERROR(H5E_OHDR, H5E_READERROR, NULL, "unable to read object header")
-    p = read_buf;
-
-    /* Allocate space for the object header data structure */
-    if(NULL == (oh = H5FL_CALLOC(H5O_t)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
-
-    /* File-specific, non-stored information */
-    oh->sizeof_size = H5F_SIZEOF_SIZE(udata->common.f);
-    oh->sizeof_addr = H5F_SIZEOF_ADDR(udata->common.f);
 
     /* Check for presence of magic number */
     /* (indicates version 2 or later) */
@@ -206,12 +207,12 @@ H5O_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
         /* Version */
         oh->version = *p++;
         if(H5O_VERSION_2 != oh->version)
-            HGOTO_ERROR(H5E_OHDR, H5E_VERSION, NULL, "bad object header version number")
+            HGOTO_ERROR(H5E_OHDR, H5E_VERSION, FAIL, "bad object header version number")
 
         /* Flags */
         oh->flags = *p++;
         if(oh->flags & ~H5O_HDR_ALL_FLAGS)
-            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "unknown object header status flag(s)")
+            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "unknown object header status flag(s)")
 
         /* Number of links to object (unless overridden by refcount message) */
         oh->nlink = 1;
@@ -237,7 +238,7 @@ H5O_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
             UINT16DECODE(p, oh->max_compact);
             UINT16DECODE(p, oh->min_dense);
             if(oh->max_compact < oh->min_dense)
-                HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "bad object header attribute phase change values")
+                HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "bad object header attribute phase change values")
         } /* end if */
         else {
             oh->max_compact = H5O_CRT_ATTR_MAX_COMPACT_DEF;
@@ -263,16 +264,16 @@ H5O_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
                 break;
 
             default:
-                HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "bad size for chunk 0")
+                HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "bad size for chunk 0")
         } /* end switch */
         if(oh->chunk0_size > 0 && oh->chunk0_size < H5O_SIZEOF_MSGHDR_OH(oh))
-            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "bad object header chunk size")
+            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "bad object header chunk size")
     } /* end if */
     else {
         /* Version */
         oh->version = *p++;
         if(H5O_VERSION_1 != oh->version)
-            HGOTO_ERROR(H5E_OHDR, H5E_VERSION, NULL, "bad object header version number")
+            HGOTO_ERROR(H5E_OHDR, H5E_VERSION, FAIL, "bad object header version number")
 
         /* Flags */
         oh->flags = H5O_CRT_OHDR_FLAGS_DEF;
@@ -297,42 +298,193 @@ H5O_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
         UINT32DECODE(p, oh->chunk0_size);
         if((udata->v1_pfx_nmesgs > 0 && oh->chunk0_size < H5O_SIZEOF_MSGHDR_OH(oh)) ||
                 (udata->v1_pfx_nmesgs == 0 && oh->chunk0_size > 0))
-            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "bad object header chunk size")
+            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "bad object header chunk size")
 
         /* Reserved, in version 1 (for 8-byte alignment padding) */
         p += 4;
     } /* end else */
 
     /* Determine object header prefix length */
-    prefix_size = (size_t)(p - (const uint8_t *)read_buf);
+    prefix_size = (size_t)(p - buf);
     HDassert((size_t)prefix_size == (size_t)(H5O_SIZEOF_HDR(oh) - H5O_SIZEOF_CHKSUM_OH(oh)));
 
-    /* Compute the size of the buffer used */
-    buf_size = oh->chunk0_size + (size_t)H5O_SIZEOF_HDR(oh);
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O_decode_prefix() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O__cache_get_load_size()
+ *
+ * Purpose:	Tell the metadata cache how much data to read from file in 
+ *		the first speculative read for the object header.  Note that we do 
+ *		not have to be concerned about reading past the end of file, as the 
+ *		cache will clamp the read to avoid this if needed.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              7/28/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O__cache_get_load_size(const void *_image, void *_udata, size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
+{
+    const uint8_t *image = (const uint8_t *)_image;   	/* Pointer into raw data buffer */
+    H5O_cache_ud_t *udata = (H5O_cache_ud_t *)_udata;   /* User data for callback */
+    H5O_t oh;                                           /* Object header read in */
+    htri_t ret_value = SUCCEED;                         /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(image_len);
+
+    if(image == NULL)
+	*image_len = H5O_SPEC_READ_SIZE;
+
+    else { /* compute actual_len */
+	HDassert(udata);
+	HDassert(actual_len);
+	HDassert(*actual_len == *image_len);
+
+	/* Decode header prefix */
+	if(H5O_decode_prefix(udata->common.f, &oh, image, udata) < 0)
+	    HGOTO_DONE(FAIL)
+
+	/* Save the version to be used in verify_chksum callback */
+	udata->version = oh.version;
+	*actual_len = oh.chunk0_size + (size_t)H5O_SIZEOF_HDR(&oh);
+    }
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__cache_get_load_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O__cache_verify_chksum
+ *
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
+ *
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
+ *
+ * Programmer:  Vailin Choi; Aug 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5O__cache_verify_chksum(const void *_image, size_t len, void *_udata)
+{
+    const uint8_t *image = (const uint8_t *)_image;    	/* Pointer into raw data buffer */
+    H5O_cache_ud_t *udata = (H5O_cache_ud_t *)_udata;  	/* User data for callback */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+    htri_t ret_value = TRUE;	/* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(image);
+    HDassert(udata);
+
+    /* There is no checksum for version 1 */
+    if(udata->version != H5O_VERSION_1) {
+
+	/* Get stored and computed checksums */
+	H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
+
+	if(stored_chksum != computed_chksum)
+	    ret_value = FALSE;
+    }
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__cache_verify_chksum() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O__cache_deserialize
+ *
+ * Purpose:	Attempt to deserialize the object header contained in the 
+ *		supplied buffer, load the data into an instance of H5O_t, and 
+ *		return a pointer to the new instance.
+ *
+ *		Note that the object header is read with with a speculative read.  
+ *		If the initial read is too small, make note of this fact and return 
+ *     		without error.  H5C_load_entry() will note the size discrepency
+ *		and retry the deserialize operation with the correct size read.
+ *
+ * Return:      Success:        Pointer to in core representation
+ *              Failure:        NULL
+ *
+ * Programmer:  John Mainzer
+ *              7/28/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O__cache_deserialize(const void *_image, size_t len, void *_udata,
+    hbool_t *dirty)
+{
+    H5O_t          *oh = NULL;          /* Object header read in */
+    H5O_cache_ud_t *udata = (H5O_cache_ud_t *)_udata;   /* User data for callback */
+    const uint8_t  *image = (const uint8_t *)_image;    /* Pointer into buffer to decode */
+    size_t          buf_size;           /* Size of prefix+chunk #0 buffer */
+    void *          ret_value = NULL;   /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check arguments */
+    HDassert(image);
+    HDassert(len > 0); 
+    HDassert(udata);
+    HDassert(udata->common.f);
+    HDassert(udata->common.cont_msg_info);
+    HDassert(dirty);
+
+    /* Allocate space for the object header data structure */
+    if(NULL == (oh = H5FL_CALLOC(H5O_t)))
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
 
-    /* Check if the speculative read was large enough to parse the first chunk */
-    if(spec_read_size < buf_size) {
-        /* Wrap the local buffer for serialized header info */
-        if(NULL == (wb = H5WB_wrap(read_buf, sizeof(read_buf))))
-            HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "can't wrap buffer")
+    /* File-specific, non-stored information */
+    oh->sizeof_size = H5F_SIZEOF_SIZE(udata->common.f);
+    oh->sizeof_addr = H5F_SIZEOF_ADDR(udata->common.f);
 
-        /* Get a pointer to a buffer that's large enough for serialized header */
-        if(NULL == (buf = (uint8_t *)H5WB_actual(wb, buf_size)))
-            HGOTO_ERROR(H5E_OHDR, H5E_NOSPACE, NULL, "can't get actual buffer")
+    /* Decode header prefix */
+    if(H5O_decode_prefix(udata->common.f, oh, image, udata) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "can't deserialize object header prefix")
+
+    /* Compute the size of the buffer used */
+    buf_size = oh->chunk0_size + (size_t)H5O_SIZEOF_HDR(oh);
 
-        /* Copy existing raw data into new buffer */
-        HDmemcpy(buf, read_buf, spec_read_size);
+    oh->swmr_write = !!(H5F_INTENT(udata->common.f) & H5F_ACC_SWMR_WRITE);
 
-        /* Read rest of the raw data */
-        if(H5F_block_read(f, H5FD_MEM_OHDR, (addr + spec_read_size), (buf_size - spec_read_size), dxpl_id, (buf + spec_read_size)) < 0)
-            HGOTO_ERROR(H5E_OHDR, H5E_READERROR, NULL, "unable to read object header data")
+    /* Create object header proxy if doing SWMR writes */
+    HDassert(!oh->proxy_present);
+    if(H5F_INTENT(udata->common.f) & H5F_ACC_SWMR_WRITE) {
+	if(H5O_proxy_create(udata->common.f, udata->common.dxpl_id, oh) < 0)
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTCREATE, NULL, "can't create object header proxy")
     } /* end if */
     else
-        buf = read_buf;
-
-    /* Parse the first chunk */
-    if(H5O_chunk_deserialize(oh, udata->common.addr, oh->chunk0_size, buf, &(udata->common), &oh->cache_info.is_dirty) < 0)
-        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "can't deserialize first object header chunk")
+	oh->proxy_addr = HADDR_UNDEF;
+
+    /* Check to see if the buffer provided is large enough to contain both 
+     * the prefix and the first chunk.  If it isn't, make note of the desired
+     * size, but otherwise do nothing.  H5C_load_entry() will notice the 
+     * discrepency, load the correct size buffer, and retry the deserialize.
+     */
+    if(len >= buf_size) {
+        /* Parse the first chunk */
+        if(H5O__chunk_deserialize(oh, udata->common.addr, oh->chunk0_size, (const uint8_t *)_image, &(udata->common), dirty) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "can't deserialize first object header chunk")
+    } /* end if */
+    else
+        HDassert(!udata->made_attempt);
 
     /* Note that we've loaded the object header from the file */
     udata->made_attempt = TRUE;
@@ -341,202 +493,234 @@ H5O_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
     ret_value = oh;
 
 done:
-    /* Release resources */
-    if(wb && H5WB_unwrap(wb) < 0)
-        HDONE_ERROR(H5E_OHDR, H5E_CLOSEERROR, NULL, "can't close wrapped buffer")
-
     /* Release the [possibly partially initialized] object header on errors */
     if(!ret_value && oh)
         if(H5O_free(oh) < 0)
-	    HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, NULL, "unable to destroy object header data")
+            HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, NULL, "unable to destroy object header data")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_load() */
+} /* end H5O__cache_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_flush
+ * Function:    H5O__cache_image_len
  *
- * Purpose:	Flushes (and destroys) an object header.
+ * Purpose:	Compute the size in bytes of the specified instance of
+ *		H5O_t on disk, and return it in *image_len.  On failure,
+ *		the value of *image_len is undefined.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	Robb Matzke
- *		matzke at llnl.gov
- *		Aug  5 1997
+ * Programmer:  John Mainzer
+ *              7/28/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t H5_ATTR_UNUSED addr, H5O_t *oh, unsigned H5_ATTR_UNUSED * flags_ptr)
+H5O__cache_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    herr_t ret_value = SUCCEED; /* Return value */
+    const H5O_t *oh = (const H5O_t *)_thing;    /* Object header to query */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR
 
     /* Check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
     HDassert(oh);
+    HDassert(oh->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(oh->cache_info.type == H5AC_OHDR);
+    HDassert(image_len);
+
+    /* Report the object header's prefix+first chunk length */
+    if(oh->chunk0_size)
+       *image_len = (size_t)H5O_SIZEOF_HDR(oh) + oh->chunk0_size;
+    else
+       *image_len = oh->chunk[0].size;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O__cache_image_len() */
 
-    /* flush */
-    if(oh->cache_info.is_dirty) {
-        uint8_t	*p;             /* Pointer to object header prefix buffer */
+/********************************/
+/* no H5O_cache_pre_serialize() */
+/********************************/
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O__cache_serialize
+ *
+ * Purpose:	Serialize the contents of the supplied object header, and
+ *		load this data into the supplied buffer.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              7/28/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O__cache_serialize(const H5F_t *f, void *image, size_t len, void *_thing)
+{
+    H5O_t      *oh = (H5O_t *)_thing;   /* Object header to encode */
+    uint8_t     *chunk_image;           /* Pointer to object header prefix buffer */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check arguments */
+    HDassert(f);
+    HDassert(image);
+    HDassert(oh);
+    HDassert(oh->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(oh->cache_info.type == H5AC_OHDR);
+    HDassert(oh->chunk[0].size == len);
 #ifdef H5O_DEBUG
-H5O_assert(oh);
+    H5O_assert(oh);
 #endif /* H5O_DEBUG */
 
-        /* Point to raw data 'image' for first chunk, which has room for the prefix */
-        p = oh->chunk[0].image;
+    /* Point to raw data 'image' for first chunk, which 
+     * has room for the prefix 
+     */
+    chunk_image = oh->chunk[0].image;
 
-        /* Later versions of object header prefix have different format and
-         * also require that chunk 0 always be updated, since the checksum
-         * on the entire block of memory needs to be updated if anything is
-         * modified */
-        if(oh->version > H5O_VERSION_1) {
-            uint64_t chunk0_size;       /* Size of chunk 0's data */
-
-            HDassert(oh->chunk[0].size >= (size_t)H5O_SIZEOF_HDR(oh));
-            chunk0_size = oh->chunk[0].size - (size_t)H5O_SIZEOF_HDR(oh);
+    /* Later versions of object header prefix have different format and
+     * also require that chunk 0 always be updated, since the checksum
+     * on the entire block of memory needs to be updated if anything is
+     * modified 
+     */
+    if(oh->version > H5O_VERSION_1) {
+        uint64_t chunk0_size;       /* Size of chunk 0's data */
 
-            /* Verify magic number */
-            HDassert(!HDmemcmp(p, H5O_HDR_MAGIC, H5_SIZEOF_MAGIC));
-            p += H5_SIZEOF_MAGIC;
+        HDassert(oh->chunk[0].size >= (size_t)H5O_SIZEOF_HDR(oh));
+        chunk0_size = oh->chunk[0].size - (size_t)H5O_SIZEOF_HDR(oh);
 
-            /* Version */
-            *p++ = oh->version;
+        /* Verify magic number */
+        HDassert(!HDmemcmp(chunk_image, H5O_HDR_MAGIC, H5_SIZEOF_MAGIC));
+        chunk_image += H5_SIZEOF_MAGIC;
 
-            /* Flags */
-            *p++ = oh->flags;
+        /* Version */
+        *chunk_image++ = oh->version;
 
-            /* Time fields */
-            if(oh->flags & H5O_HDR_STORE_TIMES) {
-                UINT32ENCODE(p, oh->atime);
-                UINT32ENCODE(p, oh->mtime);
-                UINT32ENCODE(p, oh->ctime);
-                UINT32ENCODE(p, oh->btime);
-            } /* end if */
+        /* Flags */
+        *chunk_image++ = oh->flags;
 
-            /* Attribute fields */
-            if(oh->flags & H5O_HDR_ATTR_STORE_PHASE_CHANGE) {
-                UINT16ENCODE(p, oh->max_compact);
-                UINT16ENCODE(p, oh->min_dense);
-            } /* end if */
+        /* Time fields */
+        if(oh->flags & H5O_HDR_STORE_TIMES) {
+            UINT32ENCODE(chunk_image, oh->atime);
+            UINT32ENCODE(chunk_image, oh->mtime);
+            UINT32ENCODE(chunk_image, oh->ctime);
+            UINT32ENCODE(chunk_image, oh->btime);
+        } /* end if */
 
-            /* First chunk size */
-            switch(oh->flags & H5O_HDR_CHUNK0_SIZE) {
-                case 0:     /* 1 byte size */
-                    HDassert(chunk0_size < 256);
-                    *p++ = (uint8_t)chunk0_size;
-                    break;
-
-                case 1:     /* 2 byte size */
-                    HDassert(chunk0_size < 65536);
-                    UINT16ENCODE(p, chunk0_size);
-                    break;
-
-                case 2:     /* 4 byte size */
-		    /* use <= 2**32 -1 to stay within 4 bytes integer range */
-                    HDassert(chunk0_size <= 4294967295UL);
-                    UINT32ENCODE(p, chunk0_size);
-                    break;
-
-                case 3:     /* 8 byte size */
-                    UINT64ENCODE(p, chunk0_size);
-                    break;
-
-                default:
-                    HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "bad size for chunk 0")
-            } /* end switch */
+        /* Attribute fields */
+        if(oh->flags & H5O_HDR_ATTR_STORE_PHASE_CHANGE) {
+            UINT16ENCODE(chunk_image, oh->max_compact);
+            UINT16ENCODE(chunk_image, oh->min_dense);
         } /* end if */
-        else {
-            /* Version */
-            *p++ = oh->version;
 
-            /* Reserved */
-            *p++ = 0;
+        /* First chunk size */
+        switch(oh->flags & H5O_HDR_CHUNK0_SIZE) {
+            case 0:     /* 1 byte size */
+                HDassert(chunk0_size < 256);
+                *chunk_image++ = (uint8_t)chunk0_size;
+                break;
+
+            case 1:     /* 2 byte size */
+                HDassert(chunk0_size < 65536);
+                UINT16ENCODE(chunk_image, chunk0_size);
+                break;
+
+            case 2:     /* 4 byte size */
+                /* use <= 2**32 -1 to stay within 4 bytes integer range */
+                HDassert(chunk0_size <= 4294967295UL);
+                UINT32ENCODE(chunk_image, chunk0_size);
+                break;
 
-            /* Number of messages */
+            case 3:     /* 8 byte size */
+                UINT64ENCODE(chunk_image, chunk0_size);
+                break;
+
+            default:
+                HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "bad size for chunk 0")
+        } /* end switch */
+    } /* end if */
+    else {
+        /* Version */
+        *chunk_image++ = oh->version;
+
+        /* Reserved */
+        *chunk_image++ = 0;
+
+        /* Number of messages */
 #ifdef H5O_ENABLE_BAD_MESG_COUNT
-            if(oh->store_bad_mesg_count)
-                UINT16ENCODE(p, (oh->nmesgs - 1))
-            else
+        if(oh->store_bad_mesg_count)
+           UINT16ENCODE(chunk_image, (oh->nmesgs - 1))
+        else
 #endif /* H5O_ENABLE_BAD_MESG_COUNT */
-                UINT16ENCODE(p, oh->nmesgs);
+            UINT16ENCODE(chunk_image, oh->nmesgs);
 
-            /* Link count */
-            UINT32ENCODE(p, oh->nlink);
-
-            /* First chunk size */
-            UINT32ENCODE(p, (oh->chunk[0].size - (size_t)H5O_SIZEOF_HDR(oh)));
+        /* Link count */
+        UINT32ENCODE(chunk_image, oh->nlink);
 
-            /* Zero to alignment */
-            HDmemset(p, 0, (size_t)(H5O_SIZEOF_HDR(oh) - 12));
-            p += (size_t)(H5O_SIZEOF_HDR(oh) - 12);
-        } /* end else */
-        HDassert((size_t)(p - oh->chunk[0].image) == (size_t)(H5O_SIZEOF_HDR(oh) - H5O_SIZEOF_CHKSUM_OH(oh)));
+        /* First chunk size */
+        UINT32ENCODE(chunk_image, (oh->chunk[0].size - (size_t)H5O_SIZEOF_HDR(oh)));
 
-        /* Serialize messages for this chunk */
-        if(H5O_chunk_serialize(f, oh, (unsigned)0) < 0)
-            HGOTO_ERROR(H5E_OHDR, H5E_CANTSERIALIZE, FAIL, "unable to serialize first object header chunk")
+        /* Zero to alignment */
+        HDmemset(chunk_image, 0, (size_t)(H5O_SIZEOF_HDR(oh) - 12));
+        chunk_image += (size_t)(H5O_SIZEOF_HDR(oh) - 12);
+    } /* end else */
 
-        /* Write the chunk out */
-        HDassert(H5F_addr_defined(oh->chunk[0].addr));
-        if(H5F_block_write(f, H5FD_MEM_OHDR, oh->chunk[0].addr, oh->chunk[0].size, dxpl_id, oh->chunk[0].image) < 0)
-            HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to write object header chunk to disk")
+    HDassert((size_t)(chunk_image - oh->chunk[0].image) == (size_t)(H5O_SIZEOF_HDR(oh) - H5O_SIZEOF_CHKSUM_OH(oh)));
 
-        /* Mark object header as clean now */
-	oh->cache_info.is_dirty = FALSE;
-    } /* end if */
+    /* Serialize messages for this chunk */
+    if(H5O__chunk_serialize(f, oh, (unsigned)0) < 0) 
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTSERIALIZE, FAIL, "unable to serialize first object header chunk")
 
-    /* Destroy the object header, if requested */
-    if(destroy)
-        if(H5O_dest(f, oh) < 0)
-	    HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header data")
+    /* copy the chunk into the image -- this is potentially expensive.  
+     * Can we rework things so that the object header and the cache 
+     * share a buffer?
+     */
+    HDmemcpy(image, oh->chunk[0].image, len);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_flush() */
+} /* end H5O__cache_serialize() */
+
+/**********************************/
+/* no H5O_cache_notify() function */
+/**********************************/
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_dest
+ * Function:    H5O__cache_free_icr
  *
- * Purpose:	Destroys an object header.
+ * Purpose:	Free the in core representation of the supplied object header.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Note:	The metadata cache sets the object's cache_info.magic to
+ *		H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC before calling a free_icr
+ *		callback (checked in assert).
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Jan 15 2003
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              7/28/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_dest(H5F_t *f, H5O_t *oh)
-{
-    herr_t ret_value = SUCCEED;         /* Return value */
+H5O__cache_free_icr(void *_thing)
+{ 
+    H5O_t      *oh = (H5O_t *)_thing;   /* Object header to destroy */
+    herr_t      ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /* check args */
+    /* Check arguments */
     HDassert(oh);
-    HDassert(oh->rc == 0);
-
-    /* Verify that node is clean */
-    HDassert(!oh->cache_info.is_dirty);
-
-    /* If we're going to free the space on disk, the address must be valid */
-    HDassert(!oh->cache_info.free_file_space_on_destroy || H5F_addr_defined(oh->cache_info.addr));
-
-    /* Check for releasing file space for object header */
-    if(oh->chunk && oh->cache_info.free_file_space_on_destroy) {
-        /* Free main (first) object header "chunk" */
-        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
-        if(H5MF_xfree(f, H5FD_MEM_OHDR, H5AC_dxpl_id, oh->chunk[0].addr, (hsize_t)oh->chunk[0].size) < 0)
-            HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free object header")
-    } /* end if */
+    HDassert(oh->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC);
+    HDassert(oh->cache_info.type == H5AC_OHDR);
 
     /* Destroy object header */
     if(H5O_free(oh) < 0)
@@ -544,173 +728,207 @@ H5O_dest(H5F_t *f, H5O_t *oh)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_dest() */
+} /* end H5O__cache_free_icr() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_clear
+ * Function:    H5O__cache_clear
  *
- * Purpose:	Mark a object header in memory as non-dirty.
+ * Purpose: 	Clear all dirty bits associated with this cache entry.
  *
- * Return:	Non-negative on success/Negative on failure
+ *		This is ncessary as the object header cache client maintains 
+ *		its own dirty bits on individual messages.  These dirty bits 
+ *		used to be cleared by the old V2 metadata cache flush callback,
+ *		but now the metadata cache must clear them explicitly, as 
+ *		the serialize callback does not imply that the data has been
+ *		written to disk.
  *
- * Programmer:	Quincey Koziol
- *		koziol at ncsa.uiuc.edu
- *		Mar 20 2003
+ *		This callback is also necessary for the parallel case.
  *
- * Changes:	In the parallel case, there is the possibility that the 
- *		the object header may be flushed by different processes
- *		over the life of the computation.  Thus we must ensure
- *		that the chunk images are up to date before we mark the
- *		messages clean -- as otherwise we may overwrite valid
- *		data with a blank section of a chunk image.
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- *		To deal with this, I have added code to call 
- *		H5O_chunk_serialize() for all chunks before we 
- *		mark all messages as clean if we are not destroying the 
- *		object.  Do this in the parallel case only, as the problem 
- *		can only occur in this context.
- *
- *						JRM -- 10/12/10
+ * Programmer:  John Mainzer
+ *              9/22/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_clear(H5F_t *f, H5O_t *oh, hbool_t destroy)
-{
-    unsigned	u;      /* Local index variable */
-    herr_t ret_value = SUCCEED;
+#ifdef H5_HAVE_PARALLEL
+H5O__cache_clear(const H5F_t *f, void *_thing, hbool_t H5_ATTR_UNUSED about_to_destroy)
+#else
+H5O__cache_clear(const H5F_t H5_ATTR_UNUSED *f, void *_thing, hbool_t H5_ATTR_UNUSED about_to_destroy)
+#endif /* H5_HAVE_PARALLEL */
+{ 
+    H5O_t      *oh = (H5O_t *)_thing;   /* Object header to reset */
+    unsigned    u;                      /* Local index variable */
+    herr_t      ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+#ifdef H5_HAVE_PARALLEL
+    FUNC_ENTER_STATIC
+#else
+    FUNC_ENTER_STATIC_NOERR
+#endif /* H5_HAVE_PARALLEL */
 
-    /* check args */
+    /* Check arguments */
     HDassert(oh);
+    HDassert(oh->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(oh->cache_info.type == H5AC_OHDR);
 
 #ifdef H5_HAVE_PARALLEL
-    if ( ( oh->cache_info.is_dirty ) && ( ! destroy ) ) {
-
-	size_t i;
-
-        /* scan through all chunks associated with the object header,
-	 * and cause them to update their images for all entries currently
- 	 * marked dirty.  Must do this in the parallel case, as it is possible
-	 * that this processor may clear this object header several times
-	 * before flushing it -- thus causing undefined sections of the image
-	 * to be written to disk overwriting valid data.
+    if((oh->nchunks > 0) && (!about_to_destroy)) {
+        /* Scan through chunk 0 (the chunk stored contiguously with this 
+         * object header) and cause it to update its image of all entries 
+         * currently marked dirty.  Must do this in the parallel case, as 
+         * it is possible that this processor may clear this object header 
+         * several times before flushing it -- thus causing undefined 
+         * sections of the image to be written to disk overwriting valid data.
          */
-
-	for ( i = 0; i < oh->nchunks; i++ ) {
-
-            if ( H5O_chunk_serialize(f, oh, i) < 0 ) {
-
-                HGOTO_ERROR(H5E_OHDR, H5E_CANTSERIALIZE, FAIL, 
-			    "unable to serialize object header chunk")
-	    }
-        }
-    }
+        if(H5O__chunk_serialize(f, oh, 0) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTSERIALIZE, FAIL, "unable to serialize object header chunk")
+    } /* end if */
 #endif /* H5_HAVE_PARALLEL */
 
-    /* Mark messages as clean */
+    /* Mark messages stored with the object header (i.e. messages in chunk 0) as clean */
     for(u = 0; u < oh->nmesgs; u++)
-        oh->mesg[u].dirty = FALSE;
+        if(oh->mesg[u].chunkno == 0)
+            oh->mesg[u].dirty = FALSE;
 
 #ifndef NDEBUG
     /* Reset the number of messages dirtied by decoding */
     oh->ndecode_dirtied = 0;
 #endif /* NDEBUG */
 
-    /* Mark whole header as clean */
-    oh->cache_info.is_dirty = FALSE;
-
-    if(destroy)
-        if(H5O_dest(f, oh) < 0)
-            HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header data")
-
+#ifdef H5_HAVE_PARALLEL
 done:
+#endif /* H5_HAVE_PARALLEL */
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_clear() */
+} /* end H5O__cache_clear() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_size
+ * Function:    H5O__cache_chk_get_load_size()
  *
- * Purpose:	Compute the size in bytes of the specified instance of
- *              H5O_t on disk, and return it in *len_ptr.  On failure,
- *              the value of *len_ptr is undefined.
+ * Purpose:	Tell the metadata cache how large the on disk image of the 
+ *		chunk proxy is, so it can load the image into a buffer for the 
+ *		deserialize call.  In this case, we simply look up the size in 
+ *		the user data, and return it in *image_len,
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	John Mainzer
- *		5/13/04
+ * Programmer:  John Mainzer
+ *              7/28/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_size(const H5F_t H5_ATTR_UNUSED *f, const H5O_t *oh, size_t *size_ptr)
+H5O__cache_chk_get_load_size(const void *_image, void *_udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    const uint8_t *image = (const uint8_t *)_image;       		  /* Pointer into raw data buffer */
+    const H5O_chk_cache_ud_t *udata = (const H5O_chk_cache_ud_t *)_udata; /* User data for callback */
 
-    /* check args */
-    HDassert(oh);
-    HDassert(size_ptr);
+    FUNC_ENTER_STATIC_NOERR
 
-    /* Report the object header's prefix+first chunk length */
-    if(oh->chunk0_size)
-       *size_ptr = (size_t)H5O_SIZEOF_HDR(oh) + oh->chunk0_size;
-    else
-       *size_ptr = oh->chunk[0].size;
+    /* Check arguments */
+    HDassert(udata);
+    HDassert(udata->oh);
+    HDassert(image_len);
+
+    if(image == NULL)
+	*image_len = udata->size;
+    else {
+	HDassert(actual_len);
+        HDassert(*actual_len == *image_len);
+    }
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5O_size() */
+} /* end H5O__cache_chk_get_load_size() */
+
+/*-------------------------------------------------------------------------
+ * Function:    H5B2__cache_chk_verify_chksum
+ *
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
+ *
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
+ *
+ * Programmer:  Vailin Choi; Aug 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+H5O__cache_chk_verify_chksum(const void *_image, size_t len, void *_udata)
+{
+    const uint8_t *image = (const uint8_t *)_image;       	/* Pointer into raw data buffer */
+    H5O_chk_cache_ud_t *udata = (H5O_chk_cache_ud_t *)_udata;   /* User data for callback */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+    htri_t ret_value = TRUE;	/* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(image);
+
+    /* There is no checksum for version 1 */
+    if(udata->oh->version != H5O_VERSION_1) {
+
+	/* Get stored and computed checksums */
+	H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
+
+	if(stored_chksum != computed_chksum)
+	    ret_value = FALSE;
+    }
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__cache_chk_verify_chksum() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_cache_chk_load
+ * Function:    H5O__cache_chk_deserialize
  *
- * Purpose:	Loads an object header continuation chunk from disk.
+ * Purpose:	Attempt to deserialize the object header continuation chunk
+ *		contained in the supplied buffer, load the data into an instance 
+ *		of H5O_chunk_proxy_t, and return a pointer to the new instance.
  *
- * Return:	Success:	Pointer to the new object header chunk proxy.
- *		Failure:	NULL
+ * Return:      Success:        Pointer to in core representation
+ *              Failure:        NULL
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Jul 12 2008
+ * Programmer:  John Mainzer
+ *              7/28/14
  *
  *-------------------------------------------------------------------------
  */
-static H5O_chunk_proxy_t *
-H5O_cache_chk_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+static void *
+H5O__cache_chk_deserialize(const void *image, size_t len, void *_udata,
+    hbool_t *dirty)
 {
-    H5O_chunk_proxy_t	*chk_proxy = NULL;     /* Chunk proxy object */
-    H5O_chk_cache_ud_t *udata = (H5O_chk_cache_ud_t *)_udata;       /* User data for callback */
-    H5WB_t      *wb = NULL;             /* Wrapped buffer for prefix data */
-    uint8_t     chunk_buf[H5O_SPEC_READ_SIZE];       /* Buffer for speculative read */
-    uint8_t     *buf;                   /* Buffer to decode */
-    H5O_chunk_proxy_t	*ret_value;     /* Return value */
+    H5O_chunk_proxy_t  *chk_proxy = NULL;       /* Chunk proxy object */
+    H5O_chk_cache_ud_t *udata = (H5O_chk_cache_ud_t *)_udata;   /* User data for callback */
+    void		*ret_value = NULL;      /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    HDassert(image);
+    HDassert(len > 0);
     HDassert(udata);
     HDassert(udata->oh);
+    HDassert(dirty);
 
     /* Allocate space for the object header data structure */
-    if(NULL == (chk_proxy = H5FL_CALLOC(H5O_chunk_proxy_t)))
-	HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "memory allocation failed")
-
-    /* Wrap the local buffer for serialized header info */
-    if(NULL == (wb = H5WB_wrap(chunk_buf, sizeof(chunk_buf))))
-        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "can't wrap buffer")
+    if(NULL == (chk_proxy = H5FL_CALLOC(H5O_chunk_proxy_t))) 
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "memory allocation failed")
 
-    /* Get a pointer to a buffer that's large enough for serialized header */
-    if(NULL == (buf = (uint8_t *)H5WB_actual(wb, udata->size)))
-        HGOTO_ERROR(H5E_OHDR, H5E_NOSPACE, NULL, "can't get actual buffer")
-
-    /* Read rest of the raw data */
-    if(H5F_block_read(f, H5FD_MEM_OHDR, addr, udata->size, dxpl_id, buf) < 0)
-        HGOTO_ERROR(H5E_OHDR, H5E_READERROR, NULL, "unable to read object header continuation chunk")
+    /* initialize the flush dependency parent fields.  If needed, they
+     * will be set in the notify routine.
+     */
+    chk_proxy->fd_parent_addr = HADDR_UNDEF;
+    chk_proxy->fd_parent_ptr = NULL;
 
     /* Check if we are still decoding the object header */
     /* (as opposed to bringing a piece of it back from the file) */
@@ -720,7 +938,7 @@ H5O_cache_chk_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
         HDassert(udata->common.cont_msg_info);
 
         /* Parse the chunk */
-        if(H5O_chunk_deserialize(udata->oh, udata->common.addr, udata->size, buf, &(udata->common), &chk_proxy->cache_info.is_dirty) < 0)
+        if(H5O__chunk_deserialize(udata->oh, udata->common.addr, udata->size, (const uint8_t *)image, &(udata->common), dirty) < 0)
             HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "can't deserialize object header chunk")
 
         /* Set the fields for the chunk proxy */
@@ -735,10 +953,10 @@ H5O_cache_chk_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
         chk_proxy->oh = udata->oh;
         chk_proxy->chunkno = udata->chunkno;
 
-        /* Sanity check that the chunk representation we have in memory is the same
-         *      as the one being brought in from disk.
+        /* Sanity check that the chunk representation we have in memory is 
+         * the same as the one being brought in from disk.
          */
-        HDassert(0 == HDmemcmp(buf, chk_proxy->oh->chunk[chk_proxy->chunkno].image, chk_proxy->oh->chunk[chk_proxy->chunkno].size));
+        HDassert(0 == HDmemcmp(image, chk_proxy->oh->chunk[chk_proxy->chunkno].image, chk_proxy->oh->chunk[chk_proxy->chunkno].size));
     } /* end else */
 
     /* Increment reference count of object header */
@@ -749,222 +967,307 @@ H5O_cache_chk_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
     ret_value = chk_proxy;
 
 done:
-    /* Release resources */
-    if(wb && H5WB_unwrap(wb) < 0)
-        HDONE_ERROR(H5E_OHDR, H5E_CLOSEERROR, NULL, "can't close wrapped buffer")
-
-    /* Release the [possibly partially initialized] object header on errors */
-    if(!ret_value && chk_proxy)
-        if(H5O_chunk_proxy_dest(chk_proxy) < 0)
-	    HDONE_ERROR(H5E_OHDR, H5E_CANTRELEASE, NULL, "unable to destroy object header chunk proxy")
-
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_cache_chk_load() */
+} /* end H5O__cache_chk_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_cache_chk_flush
+ * Function:    H5O__cache_chk_image_len
  *
- * Purpose:	Flushes (and destroys) an object header continuation chunk.
+ * Purpose:	Return the on disk image size of a object header chunk to the 
+ *		metadata cache via the image_len.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Jul 12 2008
+ * Programmer:  John Mainzer
+ *              7/28/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_cache_chk_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr,
-    H5O_chunk_proxy_t *chk_proxy, unsigned H5_ATTR_UNUSED * flags_ptr)
+H5O__cache_chk_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    herr_t ret_value = SUCCEED; /* Return value */
+    const H5O_chunk_proxy_t * chk_proxy = (const H5O_chunk_proxy_t *)_thing;    /* Chunk proxy to query */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR
 
-    /* flush */
-    if(chk_proxy->cache_info.is_dirty) {
-        /* Serialize messages for this chunk */
-        if(H5O_chunk_serialize(f, chk_proxy->oh, chk_proxy->chunkno) < 0)
-            HGOTO_ERROR(H5E_OHDR, H5E_CANTSERIALIZE, FAIL, "unable to serialize object header continuation chunk")
+    /* Check arguments */
+    HDassert(chk_proxy);
+    HDassert(chk_proxy->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(chk_proxy->cache_info.type == H5AC_OHDR_CHK);
+    HDassert(chk_proxy->oh);
+    HDassert(image_len);
 
-        /* Write the chunk out */
-        HDassert(H5F_addr_defined(chk_proxy->oh->chunk[chk_proxy->chunkno].addr));
-        HDassert(H5F_addr_eq(addr, chk_proxy->oh->chunk[chk_proxy->chunkno].addr));
-        if(H5F_block_write(f, H5FD_MEM_OHDR, addr, chk_proxy->oh->chunk[chk_proxy->chunkno].size, dxpl_id, chk_proxy->oh->chunk[chk_proxy->chunkno].image) < 0)
-            HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to write object header continuation chunk to disk")
+    *image_len = chk_proxy->oh->chunk[chk_proxy->chunkno].size;
 
-        /* Mark object header as clean now */
-	chk_proxy->cache_info.is_dirty = FALSE;
-    } /* end if */
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O__cache_chk_image_len() */
 
-    /* Destroy the object header, if requested */
-    if(destroy)
-        if(H5O_cache_chk_dest(f, chk_proxy) < 0)
-	    HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header continuation chunk data")
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_cache_chk_flush() */
+/************************************/
+/* no H5O_cache_chk_pre_serialize() */
+/************************************/
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_cache_chk_dest
+ * Function:    H5O__cache_chk_serialize
  *
- * Purpose:	Destroys an object header continuation chunk.
+ * Purpose:	Given a pointer to an instance of an object header chunk and an 
+ *		appropriately sized buffer, serialize the contents of the 
+ *		instance for writing to disk, and copy the serialized data 
+ *		into the buffer.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	Quincey Koziol
- *              koziol at hdfgroup.org
- *              July 12, 2008
+ * Programmer:  John Mainzer
+ *              7/28/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_cache_chk_dest(H5F_t *f, H5O_chunk_proxy_t *chk_proxy)
+H5O__cache_chk_serialize(const H5F_t *f, void *image, size_t len, void *_thing)
 {
-    herr_t      ret_value = SUCCEED;    /* Return value */
+    H5O_chunk_proxy_t * chk_proxy = (H5O_chunk_proxy_t *)_thing;        /* Object header chunk to serialize */
+    herr_t              ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Check arguments */
+    HDassert(f);
+    HDassert(image);
     HDassert(chk_proxy);
-    HDassert(chk_proxy->chunkno > 0);
-
-    /* Verify that node is clean */
-    HDassert(chk_proxy->cache_info.is_dirty == FALSE);
+    HDassert(chk_proxy->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(chk_proxy->cache_info.type == H5AC_OHDR_CHK);
+    HDassert(chk_proxy->oh);
+    HDassert(chk_proxy->oh->chunk[chk_proxy->chunkno].size == len);
 
-    /* If we're going to free the space on disk, the address must be valid */
-    HDassert(!chk_proxy->cache_info.free_file_space_on_destroy || H5F_addr_defined(chk_proxy->cache_info.addr));
+    /* Serialize messages for this chunk */
+    if(H5O__chunk_serialize(f, chk_proxy->oh, chk_proxy->chunkno) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTSERIALIZE, FAIL, "unable to serialize object header continuation chunk")
 
-    /* Check for releasing file space for object header */
-    if(chk_proxy->cache_info.free_file_space_on_destroy) {
-        /* Release the space on disk */
-        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
-        if(H5MF_xfree(f, H5FD_MEM_OHDR, H5AC_dxpl_id, chk_proxy->oh->chunk[chk_proxy->chunkno].addr, (hsize_t)chk_proxy->oh->chunk[chk_proxy->chunkno].size) < 0)
-            HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free object header continuation chunk")
-    } /* end if */
-
-    /* Destroy object header chunk proxy */
-    if(H5O_chunk_proxy_dest(chk_proxy) < 0)
-        HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "unable to destroy object header chunk proxy")
+    /* copy the chunk into the image -- this is potentially expensive.
+     * Can we rework things so that the chunk and the cache share a buffer?
+     */
+    HDmemcpy(image, chk_proxy->oh->chunk[chk_proxy->chunkno].image, len);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_cache_chk_dest() */
+} /* end H5O__cache_chk_serialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_cache_chk_clear
- *
- * Purpose:	Mark a object header continuation chunk in memory as non-dirty.
- *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	Quincey Koziol
- *              koziol at hdfgroup.org
- *              July 12, 2008
+ * Function:    H5O__cache_chk_notify
  *
- * Changes:	In the parallel case, there is the possibility that the 
- *		the object header chunk may be flushed by different 
- *		processes over the life of the computation.  Thus we must 
- *		ensure that the chunk image is up to date before we mark its
- *		messages clean -- as otherwise we may overwrite valid
- *		data with a blank section of a chunk image.
+ * Purpose:     Handle cache action notifications
  *
- *		To deal with this, I have added code to call 
- *		H5O_chunk_serialize() for this chunk before we 
- *		mark all messages as clean if we are not destroying the 
- *		chunk.
+ * Return:      Non-negative on success/Negative on failure
  *
- *		Do this in the parallel case only, as the problem 
- *		can only occur in this context.
- *
- *		Note that at present at least, it seems that this fix
- *		is not necessary, as we don't seem to be able to 
- *		generate a dirty chunk without creating a dirty object
- *		header.  However, the object header code will be changing
- *		a lot in the near future, so I'll leave this fix in 
- *		for now, unless Quincey requests otherwise.
- *
- *						JRM -- 10/12/10
+ * Programmer:  Neil Fortner
+ *              Mar 20 2012
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_cache_chk_clear(H5F_t *f, H5O_chunk_proxy_t *chk_proxy, hbool_t destroy)
+H5O__cache_chk_notify(H5AC_notify_action_t action, void *_thing)
 {
-    unsigned	u;      /* Local index variable */
-    herr_t ret_value = SUCCEED;
+    H5O_chunk_proxy_t *chk_proxy = (H5O_chunk_proxy_t *)_thing;
+    void *parent = NULL;                /* Chunk containing continuation message that points to this chunk */
+    H5O_chunk_proxy_t *cont_chk_proxy = NULL; /* Proxy for chunk containing continuation message that points to this chunk, if not chunk 0 */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
-    /* check args */
+    /*
+     * Check arguments.
+     */
     HDassert(chk_proxy);
+    HDassert(chk_proxy->oh);
+
+    if(chk_proxy->oh->swmr_write) {
+        switch(action) {
+            case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+	    case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+                /* Add flush dependency from chunk containing the continuation message
+                 * that points to this chunk (either oh or another chunk proxy object)
+                 */
+                if(chk_proxy->cont_chunkno == 0)
+                    parent = chk_proxy->oh;
+                else {
+                    if(NULL == (cont_chk_proxy = H5O_chunk_protect(chk_proxy->f, H5AC_ind_dxpl_id, chk_proxy->oh, chk_proxy->cont_chunkno)))
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
+                    parent = cont_chk_proxy;
+                } /* end else */
+
+                if(H5AC_create_flush_dependency(parent, chk_proxy) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+
+                /* make note of the address and pointer of the flush 
+                 * dependency parent so we can take the dependency down
+                 * on eviction.
+                 */
+		HDassert(parent);
+                HDassert(((H5C_cache_entry_t *)parent)->magic == 
+                         H5C__H5C_CACHE_ENTRY_T_MAGIC);
+                HDassert(((H5C_cache_entry_t *)parent)->type);
+                HDassert((((H5C_cache_entry_t *)(parent))->type->id
+                          == H5AC_OHDR_ID) ||
+                         (((H5C_cache_entry_t *)(parent))->type->id
+                          == H5AC_OHDR_CHK_ID));
+
+                chk_proxy->fd_parent_addr = ((H5C_cache_entry_t *)parent)->addr;
+                chk_proxy->fd_parent_ptr = parent;
+
+
+                /* Add flush dependency on object header proxy, if proxy exists */
+                if(chk_proxy->oh->proxy_present)
+                    if(H5O_proxy_depend(chk_proxy->f, H5AC_ind_dxpl_id, chk_proxy->oh, chk_proxy) < 0)
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTDEPEND, FAIL, "can't create flush dependency on object header proxy")
+
+	    case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+                /* do nothing */
+                break;
 
-#ifdef H5_HAVE_PARALLEL
-    if ( ( chk_proxy->oh->cache_info.is_dirty ) && ( ! destroy ) ) {
+            case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+                HDassert(chk_proxy->fd_parent_addr != HADDR_UNDEF);
+                HDassert(chk_proxy->fd_parent_ptr != NULL);
+                HDassert(((H5C_cache_entry_t *)(chk_proxy->fd_parent_ptr))->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+                HDassert(((H5C_cache_entry_t *)(chk_proxy->fd_parent_ptr))->type);
+                HDassert((((H5C_cache_entry_t *)(chk_proxy->fd_parent_ptr))->type->id == H5AC_OHDR_ID) || (((H5C_cache_entry_t *)(chk_proxy->fd_parent_ptr))->type->id == H5AC_OHDR_CHK_ID));
 
-        if ( H5O_chunk_serialize(f, chk_proxy->oh, chk_proxy->chunkno) < 0 ) {
+                if(H5AC_destroy_flush_dependency(chk_proxy->fd_parent_ptr, chk_proxy) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+                break;
 
-            HGOTO_ERROR(H5E_OHDR, H5E_CANTSERIALIZE, FAIL, 
-                       "unable to serialize object header chunk")
-        }
-    }
-#endif /* H5_HAVE_PARALLEL */
+            default:
+#ifdef NDEBUG
+                HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "unknown action from metadata cache")
+#else /* NDEBUG */
+                HDassert(0 && "Unknown action?!?");
+#endif /* NDEBUG */
+        } /* end switch */
+    } /* end if */
 
-    /* Mark messages in chunk as clean */
-    for(u = 0; u < chk_proxy->oh->nmesgs; u++)
-        if(chk_proxy->oh->mesg[u].chunkno == chk_proxy->chunkno)
-            chk_proxy->oh->mesg[u].dirty = FALSE;
+done:
+    if(cont_chk_proxy)
+        if(H5O_chunk_unprotect(chk_proxy->f, H5AC_ind_dxpl_id, cont_chk_proxy, FALSE) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__cache_chk_notify() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O__cache_chk_free_icr
+ *
+ * Purpose:	Free the in core memory associated with the supplied object
+ *		header continuation chunk.
+ *
+ * Note:	The metadata cache sets the object's cache_info.magic to
+ *		H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC before calling a free_icr
+ *		callback (checked in assert).
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              7/28/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O__cache_chk_free_icr(void *_thing)
+{
+    H5O_chunk_proxy_t * chk_proxy = (H5O_chunk_proxy_t *)_thing;        /* Object header chunk proxy to release */
+    herr_t              ret_value = SUCCEED;    /* Return value */
 
-    /* Mark as clean */
-    chk_proxy->cache_info.is_dirty = FALSE;
+    FUNC_ENTER_STATIC
 
-    if(destroy)
-        if(H5O_cache_chk_dest(f, chk_proxy) < 0)
-            HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header continuation chunk data")
+    /* Check arguments */
+    HDassert(chk_proxy);
+    HDassert(chk_proxy->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC);
+    HDassert(chk_proxy->cache_info.type == H5AC_OHDR_CHK);
+
+    /* Destroy object header chunk proxy */
+    if(H5O__chunk_proxy_dest(chk_proxy) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "unable to destroy object header chunk proxy")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_cache_chk_clear() */
+} /* end H5O__cache_chk_free_icr() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_cache_chk_size
+ * Function:    H5O__cache_chk_clear
  *
- * Purpose:	Compute the size in bytes of the specified instance of
- *              an object header continuation chunk on disk, and return it in
- *              *len_ptr.  On failure, the value of *len_ptr is undefined.
+ * Purpose: 	Clear all dirty bits associated with this cache entry.
  *
- * Return:	Non-negative on success/Negative on failure
+ *		This is ncessary as the object header cache client maintains 
+ *		its own dirty bits on individual messages.  These dirty bits 
+ *		used to be cleared by the old V2 metadata cache flush callback,
+ *		but now the metadata cache must clear them explicitly, as 
+ *		the serialize callback does not imply that the data has been
+ *		written to disk.
  *
- * Programmer:	Quincey Koziol
- *              koziol at hdfgroup.org
- *              July 12, 2008
+ *		This callback is also necessary for the parallel case.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              9/22/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_cache_chk_size(const H5F_t H5_ATTR_UNUSED *f, const H5O_chunk_proxy_t *chk_proxy, size_t *size_ptr)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+#ifdef H5_HAVE_PARALLEL
+H5O__cache_chk_clear(const H5F_t *f, void *_thing, hbool_t about_to_destroy)
+#else
+H5O__cache_chk_clear(const H5F_t H5_ATTR_UNUSED *f, void *_thing, hbool_t H5_ATTR_UNUSED about_to_destroy)
+#endif /* H5_HAVE_PARALLEL */
+{ 
+    H5O_chunk_proxy_t  *chk_proxy = (H5O_chunk_proxy_t *)_thing;        /* Object header chunk to reset */
+    H5O_t              *oh;                     /* Object header for chunk */
+    unsigned            u;                      /* Local index variable */
+    herr_t              ret_value = SUCCEED;    /* Return value */
 
-    /* check args */
+#ifdef H5_HAVE_PARALLEL
+    FUNC_ENTER_STATIC
+#else
+    FUNC_ENTER_STATIC_NOERR
+#endif /* H5_HAVE_PARALLEL */
+
+    /* Check arguments */
     HDassert(chk_proxy);
-    HDassert(size_ptr);
+    HDassert(chk_proxy->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(chk_proxy->cache_info.type == H5AC_OHDR_CHK);
+    oh = chk_proxy->oh;
+    HDassert(oh);
+    HDassert(oh->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(oh->cache_info.type == H5AC_OHDR);
 
-    /* Report the object header continuation chunk's length */
-    *size_ptr = chk_proxy->oh->chunk[chk_proxy->chunkno].size;
+#ifdef H5_HAVE_PARALLEL
+    if((chk_proxy->oh->cache_info.is_dirty) && (!about_to_destroy))
+        if(H5O__chunk_serialize(f, chk_proxy->oh, chk_proxy->chunkno) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTSERIALIZE, FAIL, "unable to serialize object header chunk")
+#endif /* H5_HAVE_PARALLEL */
+
+    /* Mark messages in chunk as clean */
+    for(u = 0; u < chk_proxy->oh->nmesgs; u++)
+        if(chk_proxy->oh->mesg[u].chunkno == chk_proxy->chunkno)
+            chk_proxy->oh->mesg[u].dirty = FALSE;
+
+#ifdef H5_HAVE_PARALLEL
+done:
+#endif /* H5_HAVE_PARALLEL */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__cache_chk_clear() */
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5O_cache_chk_size() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_add_cont_msg
+ * Function:	H5O__add_cont_msg
  *
  * Purpose:	Add information from a continuation message to the list of
  *              continuation messages in the object header
@@ -979,12 +1282,12 @@ H5O_cache_chk_size(const H5F_t H5_ATTR_UNUSED *f, const H5O_chunk_proxy_t *chk_p
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_add_cont_msg(H5O_cont_msgs_t *cont_msg_info, const H5O_cont_t *cont)
+H5O__add_cont_msg(H5O_cont_msgs_t *cont_msg_info, const H5O_cont_t *cont)
 {
     size_t contno;              /* Continuation message index */
     herr_t ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Check arguments */
     HDassert(cont_msg_info);
@@ -1009,11 +1312,11 @@ H5O_add_cont_msg(H5O_cont_msgs_t *cont_msg_info, const H5O_cont_t *cont)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5O_add_cont_msg() */
+} /* H5O__add_cont_msg() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_chunk_deserialize
+ * Function:	H5O__chunk_deserialize
  *
  * Purpose:	Deserialize a chunk for an object header
  *
@@ -1027,10 +1330,10 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image,
+H5O__chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image,
     H5O_common_cache_ud_t *udata, hbool_t *dirty)
 {
-    const uint8_t *p;           /* Pointer into buffer to decode */
+    const uint8_t *chunk_image; /* Pointer into buffer to decode */
     uint8_t *eom_ptr;           /* Pointer to end of messages for a chunk */
     size_t curmesg;             /* Current message being decoded in object header */
     unsigned merged_null_msgs = 0;  /* Number of null messages merged together */
@@ -1040,7 +1343,7 @@ H5O_chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image,
 #endif /* NDEBUG */
     herr_t ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Check arguments */
     HDassert(oh);
@@ -1061,7 +1364,7 @@ H5O_chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image,
     } /* end if */
 
     /* Init the chunk data info */
-    chunkno = oh->nchunks++;
+    chunkno = (unsigned)oh->nchunks++;
     oh->chunk[chunkno].gap = 0;
     if(chunkno == 0) {
         /* First chunk's 'image' includes room for the object header prefix */
@@ -1079,18 +1382,18 @@ H5O_chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image,
     HDmemcpy(oh->chunk[chunkno].image, image, oh->chunk[chunkno].size);
 
     /* Point into chunk image to decode */
-    p = oh->chunk[chunkno].image;
+    chunk_image = oh->chunk[chunkno].image;
 
     /* Handle chunk 0 as special case */
     if(chunkno == 0)
         /* Skip over [already decoded] prefix */
-        p += (size_t)(H5O_SIZEOF_HDR(oh) - H5O_SIZEOF_CHKSUM_OH(oh));
+        chunk_image += (size_t)(H5O_SIZEOF_HDR(oh) - H5O_SIZEOF_CHKSUM_OH(oh));
     /* Check for magic # on chunks > 0 in later versions of the format */
     else if(chunkno > 0 && oh->version > H5O_VERSION_1) {
         /* Magic number */
-        if(HDmemcmp(p, H5O_CHK_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+        if(HDmemcmp(chunk_image, H5O_CHK_MAGIC, (size_t)H5_SIZEOF_MAGIC))
             HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "wrong object header chunk signature")
-        p += H5_SIZEOF_MAGIC;
+        chunk_image += H5_SIZEOF_MAGIC;
     } /* end if */
 
     /* Save # of messages already inspected */
@@ -1101,7 +1404,7 @@ H5O_chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image,
 #ifndef NDEBUG
     nullcnt = 0;
 #endif /* NDEBUG */
-    while(p < eom_ptr) {
+    while(chunk_image < eom_ptr) {
         size_t mesgno;          /* Current message to operate on */
         size_t mesg_size;       /* Size of message read in */
         unsigned id;            /* ID (type) of current message */
@@ -1112,20 +1415,20 @@ H5O_chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image,
 
         /* Version # */
         if(oh->version == H5O_VERSION_1)
-            UINT16DECODE(p, id)
+            UINT16DECODE(chunk_image, id)
         else
-            id = *p++;
+            id = *chunk_image++;
 
         /* Check for unknown message ID getting encoded in file */
-        if(id == H5O_UNKNOWN_ID)
+        if(id >= H5O_UNKNOWN_ID)
             HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "'unknown' message ID encoded in file?!?")
 
         /* Message size */
-        UINT16DECODE(p, mesg_size);
+        UINT16DECODE(chunk_image, mesg_size);
         HDassert(mesg_size == H5O_ALIGN_OH(oh, mesg_size));
 
         /* Message flags */
-        flags = *p++;
+        flags = *chunk_image++;
         if(flags & ~H5O_MSG_FLAG_BITS)
             HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unknown flag for message")
         if((flags & H5O_MSG_FLAG_SHARED) && (flags & H5O_MSG_FLAG_DONTSHARE))
@@ -1137,17 +1440,17 @@ H5O_chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image,
 
         /* Reserved bytes/creation index */
         if(oh->version == H5O_VERSION_1)
-            p += 3; /*reserved*/
+            chunk_image += 3; /*reserved*/
         else {
             /* Only decode creation index if they are being tracked */
             if(oh->flags & H5O_HDR_ATTR_CRT_ORDER_TRACKED)
-                UINT16DECODE(p, crt_idx);
+                UINT16DECODE(chunk_image, crt_idx);
         } /* end else */
 
         /* Try to detect invalidly formatted object header message that
          *  extends past end of chunk.
          */
-        if(p + mesg_size > eom_ptr)
+        if(chunk_image + mesg_size > eom_ptr)
             HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "corrupt object header")
 
 #ifndef NDEBUG
@@ -1183,7 +1486,7 @@ H5O_chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image,
             oh->mesg[mesgno].flags = flags;
             oh->mesg[mesgno].crt_idx = crt_idx;
             oh->mesg[mesgno].native = NULL;
-            oh->mesg[mesgno].raw = (uint8_t *)p;        /* Casting away const OK - QAK */
+            oh->mesg[mesgno].raw = (uint8_t *)chunk_image;        /* Casting away const OK - QAK */
             oh->mesg[mesgno].raw_size = mesg_size;
             oh->mesg[mesgno].chunkno = chunkno;
 
@@ -1205,9 +1508,10 @@ H5O_chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image,
                 /* Set message to "unknown" class */
                 oh->mesg[mesgno].type = H5O_msg_class_g[H5O_UNKNOWN_ID];
 
-                /* Check for "fail if unknown" message flag */
-                if((udata->file_intent & H5F_ACC_RDWR) && 
-                   (flags & H5O_MSG_FLAG_FAIL_IF_UNKNOWN_AND_OPEN_FOR_WRITE))
+                /* Check for "fail if unknown" message flags */
+                if(((udata->file_intent & H5F_ACC_RDWR) && 
+                       (flags & H5O_MSG_FLAG_FAIL_IF_UNKNOWN_AND_OPEN_FOR_WRITE))
+                        || (flags & H5O_MSG_FLAG_FAIL_IF_UNKNOWN_ALWAYS))
                     HGOTO_ERROR(H5E_OHDR, H5E_BADMESG, FAIL, "unknown message with 'fail if unknown' flag found")
                 /* Check for "mark if unknown" message flag, etc. */
                 else if((flags & H5O_MSG_FLAG_MARK_IF_UNKNOWN) &&
@@ -1239,10 +1543,10 @@ H5O_chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image,
         } /* end else */
 
         /* Advance decode pointer past message */
-        p += mesg_size;
+        chunk_image += mesg_size;
 
         /* Check for 'gap' at end of chunk */
-        if((eom_ptr - p) > 0 && (eom_ptr - p) < H5O_SIZEOF_MSGHDR_OH(oh)) {
+        if((eom_ptr - chunk_image) > 0 && (eom_ptr - chunk_image) < H5O_SIZEOF_MSGHDR_OH(oh)) {
             /* Gaps can only occur in later versions of the format */
             HDassert(oh->version > H5O_VERSION_1);
 
@@ -1250,31 +1554,26 @@ H5O_chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image,
             HDassert(nullcnt == 0);
 
             /* Set gap information for chunk */
-            oh->chunk[chunkno].gap = (size_t)(eom_ptr - p);
+            oh->chunk[chunkno].gap = (size_t)(eom_ptr - chunk_image);
 
             /* Increment location in chunk */
-            p += oh->chunk[chunkno].gap;
+            chunk_image += oh->chunk[chunkno].gap;
         } /* end if */
     } /* end while */
 
     /* Check for correct checksum on chunks, in later versions of the format */
     if(oh->version > H5O_VERSION_1) {
         uint32_t stored_chksum;     /* Checksum from file */
-        uint32_t computed_chksum;   /* Checksum computed in memory */
 
-        /* Metadata checksum */
-        UINT32DECODE(p, stored_chksum);
+	/* checksum verification already done in verify_chksum cb */
 
-        /* Compute checksum on chunk */
-        computed_chksum = H5_checksum_metadata(oh->chunk[chunkno].image, (oh->chunk[chunkno].size - H5O_SIZEOF_CHKSUM), 0);
+        /* Metadata checksum */
+        UINT32DECODE(chunk_image, stored_chksum);
 
-        /* Verify checksum */
-        if(stored_chksum != computed_chksum)
-            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "incorrect metadata checksum for object header chunk")
     } /* end if */
 
     /* Sanity check */
-    HDassert(p == oh->chunk[chunkno].image + oh->chunk[chunkno].size);
+    HDassert(chunk_image == oh->chunk[chunkno].image + oh->chunk[chunkno].size);
 
     /* Do some inspection/interpretation of new messages from this chunk */
     /* (detect continuation messages, ref. count messages, etc.) */
@@ -1292,7 +1591,7 @@ H5O_chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image,
             oh->mesg[curmesg].native = cont;
 
             /* Add to continuation messages left to interpret */
-            if(H5O_add_cont_msg(udata->cont_msg_info, cont) < 0)
+            if(H5O__add_cont_msg(udata->cont_msg_info, cont) < 0)
                 HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't add continuation message")
 
             /* Mark the message & chunk as dirty if the message was changed by decoding */
@@ -1348,11 +1647,11 @@ H5O_chunk_deserialize(H5O_t *oh, haddr_t addr, size_t len, const uint8_t *image,
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5O_chunk_deserialize() */
+} /* H5O__chunk_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_chunk_serialize
+ * Function:	H5O__chunk_serialize
  *
  * Purpose:	Serialize a chunk for an object header
  *
@@ -1366,13 +1665,13 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_chunk_serialize(const H5F_t *f, H5O_t *oh, unsigned chunkno)
+H5O__chunk_serialize(const H5F_t *f, H5O_t *oh, unsigned chunkno)
 {
     H5O_mesg_t *curr_msg;       /* Pointer to current message being operated on */
     unsigned	u;              /* Local index variable */
     herr_t ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Check arguments */
     HDassert(f);
@@ -1396,7 +1695,7 @@ H5O_chunk_serialize(const H5F_t *f, H5O_t *oh, unsigned chunkno)
     /* Extra work, for later versions of the format */
     if(oh->version > H5O_VERSION_1) {
         uint32_t metadata_chksum;   /* Computed metadata checksum value */
-        uint8_t	*p;                 /* Pointer into object header chunk */
+        uint8_t	*chunk_image;       /* Pointer into object header chunk */
 
         /* Check for gap in chunk & zero it out */
         if(oh->chunk[chunkno].gap)
@@ -1407,17 +1706,17 @@ H5O_chunk_serialize(const H5F_t *f, H5O_t *oh, unsigned chunkno)
         metadata_chksum = H5_checksum_metadata(oh->chunk[chunkno].image, (oh->chunk[chunkno].size - H5O_SIZEOF_CHKSUM), 0);
 
         /* Metadata checksum */
-        p = oh->chunk[chunkno].image + (oh->chunk[chunkno].size - H5O_SIZEOF_CHKSUM);
-        UINT32ENCODE(p, metadata_chksum);
+        chunk_image = oh->chunk[chunkno].image + (oh->chunk[chunkno].size - H5O_SIZEOF_CHKSUM);
+        UINT32ENCODE(chunk_image, metadata_chksum);
     } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5O_chunk_serialize() */
+} /* H5O__chunk_serialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_chunk_proxy_dest
+ * Function:	H5O__chunk_proxy_dest
  *
  * Purpose:	Destroy a chunk proxy object
  *
@@ -1431,11 +1730,11 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_chunk_proxy_dest(H5O_chunk_proxy_t *chk_proxy)
+H5O__chunk_proxy_dest(H5O_chunk_proxy_t *chk_proxy)
 {
     herr_t ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Check arguments */
     HDassert(chk_proxy);
@@ -1449,5 +1748,4 @@ H5O_chunk_proxy_dest(H5O_chunk_proxy_t *chk_proxy)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5O_chunk_proxy_dest() */
-
+} /* H5O__chunk_proxy_dest() */
diff --git a/src/H5Ochunk.c b/src/H5Ochunk.c
index d6d4a1a..2ccb2f3 100644
--- a/src/H5Ochunk.c
+++ b/src/H5Ochunk.c
@@ -28,7 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 /***********/
 /* Headers */
@@ -92,12 +93,13 @@ H5FL_DEFINE(H5O_chunk_proxy_t);
  *-------------------------------------------------------------------------
  */
 herr_t
-H5O_chunk_add(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx)
+H5O_chunk_add(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx,
+    unsigned cont_chunkno)
 {
-    H5O_chunk_proxy_t *chk_proxy = NULL;       /* Proxy for chunk, to mark it dirty in the cache */
+    H5O_chunk_proxy_t *chk_proxy = NULL;        /* Proxy for chunk, to mark it dirty in the cache */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, oh->cache_info.addr, FAIL)
 
     /* check args */
     HDassert(f);
@@ -110,8 +112,13 @@ H5O_chunk_add(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx)
 	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
 
     /* Set the values in the chunk proxy */
+    chk_proxy->f = f;
     chk_proxy->oh = oh;
     chk_proxy->chunkno = idx;
+    chk_proxy->cont_chunkno = cont_chunkno;
+
+    chk_proxy->fd_parent_addr = HADDR_UNDEF;
+    chk_proxy->fd_parent_ptr = NULL;
 
     /* Increment reference count on object header */
     if(H5O_inc_rc(oh) < 0)
@@ -120,6 +127,7 @@ H5O_chunk_add(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx)
     /* Insert the chunk proxy into the cache */
     if(H5AC_insert_entry(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, chk_proxy, H5AC__NO_FLAGS_SET) < 0)
         HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "unable to cache object header chunk")
+
     chk_proxy = NULL;
 
 done:
@@ -127,7 +135,7 @@ done:
         if(chk_proxy)
             chk_proxy = H5FL_FREE(H5O_chunk_proxy_t, chk_proxy);
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5O_chunk_add() */
 
 

@@ -149,9 +157,9 @@ H5O_chunk_proxy_t *
 H5O_chunk_protect(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx)
 {
     H5O_chunk_proxy_t *chk_proxy = NULL;        /* Proxy for protected chunk */
-    H5O_chunk_proxy_t *ret_value;               /* Return value */
+    H5O_chunk_proxy_t *ret_value = NULL;        /* Return value */
 
-    FUNC_ENTER_NOAPI(NULL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, oh->cache_info.addr, NULL)
 
     /* check args */
     HDassert(f);
@@ -170,6 +178,7 @@ H5O_chunk_protect(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx)
             HGOTO_ERROR(H5E_OHDR, H5E_CANTINC, NULL, "can't increment reference count on object header")
 
         /* Set chunk proxy fields */
+        chk_proxy->f = f;
         chk_proxy->oh = oh;
         chk_proxy->chunkno = idx;
     } /* end if */
@@ -184,7 +193,7 @@ H5O_chunk_protect(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx)
         chk_udata.size = oh->chunk[idx].size;
 
         /* Get the chunk proxy */
-        if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC_protect(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, &chk_udata, H5AC_WRITE)))
+        if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC_protect(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, &chk_udata, H5AC__NO_FLAGS_SET)))
             HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to load object header chunk")
 
         /* Sanity check */
@@ -201,7 +210,7 @@ done:
         if(0 == idx && chk_proxy)
             chk_proxy = H5FL_FREE(H5O_chunk_proxy_t, chk_proxy);
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, NULL)
 } /* end H5O_chunk_protect() */
 
 

@@ -337,7 +346,7 @@ H5O_chunk_update_idx(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx)
     chk_udata.size = oh->chunk[idx].size;
 
     /* Get the chunk proxy */
-    if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC_protect(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, &chk_udata, H5AC_WRITE)))
+    if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC_protect(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, &chk_udata, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
 
     /* Update index for chunk proxy in cache */
@@ -371,9 +380,10 @@ H5O_chunk_delete(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx)
 {
     H5O_chunk_proxy_t *chk_proxy;       /* Proxy for chunk, to mark it dirty in the cache */
     H5O_chk_cache_ud_t chk_udata;       /* User data for loading chunk */
+    unsigned cache_flags = H5AC__DELETED_FLAG; /* Flags for unprotecting proxy */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, oh->cache_info.addr, FAIL)
 
     /* check args */
     HDassert(f);
@@ -389,18 +399,29 @@ H5O_chunk_delete(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx)
     chk_udata.size = oh->chunk[idx].size;
 
     /* Get the chunk proxy */
-    if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC_protect(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, &chk_udata, H5AC_WRITE)))
+    if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC_protect(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, &chk_udata, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
 
     /* Sanity check */
     HDassert(chk_proxy->oh == oh);
     HDassert(chk_proxy->chunkno == idx);
 
+    /* Update flush dependencies if doing SWMR writes */
+    if(H5F_INTENT(f) & H5F_ACC_SWMR_WRITE) {
+        /* Remove flush dependency on object header proxy, if proxy exists */
+        if(oh->proxy_present)
+            if(H5O_proxy_undepend(f, dxpl_id, oh, chk_proxy) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTUNDEPEND, FAIL, "can't destroy flush dependency on object header proxy")
+    } /* end if */
+    else
+        /* Only free file space if not doing SWMR writes */
+        cache_flags |= H5AC__DIRTIED_FLAG | H5AC__FREE_FILE_SPACE_FLAG;
+
     /* Release the chunk proxy from the cache, marking it deleted */
-    if(H5AC_unprotect(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, chk_proxy, (H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG | H5AC__FREE_FILE_SPACE_FLAG)) < 0)
+    if(H5AC_unprotect(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, chk_proxy, cache_flags) < 0)
         HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header chunk")
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5O_chunk_delete() */
 
diff --git a/src/H5Ocont.c b/src/H5Ocont.c
index a139654..63002c5 100644
--- a/src/H5Ocont.c
+++ b/src/H5Ocont.c
@@ -27,7 +27,8 @@
  *-------------------------------------------------------------------------
  */
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
@@ -94,7 +95,7 @@ H5O_cont_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *op
     unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
 {
     H5O_cont_t             *cont = NULL;
-    void                   *ret_value;
+    void                   *ret_value = NULL;   /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -174,7 +175,7 @@ H5O_cont_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, con
 static size_t
 H5O_cont_size(const H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, const void H5_ATTR_UNUSED *_mesg)
 {
-    size_t ret_value;   /* Return value */
+    size_t ret_value = 0;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
diff --git a/src/H5Ocopy.c b/src/H5Ocopy.c
index cc2030f..aaafd72 100644
--- a/src/H5Ocopy.c
+++ b/src/H5Ocopy.c
@@ -28,7 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 /***********/
 /* Headers */
@@ -336,7 +337,7 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out*/,
     size_t                 null_msgs;               /* Number of NULL messages found in each loop */
     size_t                 orig_dst_msgs;           /* Original # of messages in dest. object */
     H5O_mesg_t             *mesg_src;               /* Message in source object header */
-    H5O_mesg_t             *mesg_dst;               /* Message in source object header */
+    H5O_mesg_t             *mesg_dst;               /* Message in destination object header */
     const H5O_msg_class_t  *copy_type;              /* Type of message to use for copying */
     const H5O_obj_class_t  *obj_class = NULL;       /* Type of object we are copying */
     void                   *cpy_udata = NULL;       /* User data for passing to message callbacks */
@@ -347,7 +348,7 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out*/,
     size_t                 msghdr_size;
     herr_t                 ret_value = SUCCEED;
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, oloc_src->addr, FAIL)
 
     HDassert(oloc_src);
     HDassert(oloc_src->file);
@@ -356,35 +357,46 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out*/,
     HDassert(cpy_info);
 
     /* Get pointer to object class for this object */
-    if((obj_class = H5O_obj_class(oloc_src, dxpl_id)) == NULL)
+    if(NULL == (obj_class = H5O_obj_class(oloc_src, dxpl_id)))
         HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to determine object type")
 
     /* Check if the object at the address is already open in the file */
     if(H5FO_opened(oloc_src->file, oloc_src->addr) != NULL) {
-	
-	H5G_loc_t   tmp_loc; 	/* Location of object */
-	H5O_loc_t   tmp_oloc; 	/* Location of object */
-	H5G_name_t  tmp_path;	/* Object's path */
+	H5G_loc_t tmp_loc; 	/* Location of object */
+	H5O_loc_t tmp_oloc; 	/* Location of object */
+	H5G_name_t tmp_path;	/* Object's path */
+	void *obj_ptr = NULL;	/* Object pointer */
+	hid_t tmp_id = -1;	/* Object ID */
 
 	tmp_loc.oloc = &tmp_oloc;
 	tmp_loc.path = &tmp_path;
 	tmp_oloc.file = oloc_src->file;
 	tmp_oloc.addr = oloc_src->addr;
-	tmp_oloc.holding_file = oloc_src->holding_file;
+	tmp_oloc.holding_file = FALSE;
 	H5G_name_reset(tmp_loc.path);
 
-	/* Flush the object of this class */
-        if(obj_class->flush && obj_class->flush(&tmp_loc, dxpl_id) < 0)
+	/* Get a temporary ID */
+	if((tmp_id = obj_class->open(&tmp_loc, H5P_DEFAULT, dxpl_id, FALSE)) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTFLUSH, FAIL, "unable to open object")
+
+	/* Get object pointer */
+	obj_ptr = H5I_object(tmp_id);
+
+	/* Flush the object */
+        if(obj_class->flush && obj_class->flush(obj_ptr, dxpl_id) < 0)
             HGOTO_ERROR(H5E_OHDR, H5E_CANTFLUSH, FAIL, "unable to flush object")
-    }
+
+	/* Release the temporary ID */
+	if(tmp_id != -1 && H5I_dec_app_ref(tmp_id))
+	    HGOTO_ERROR(H5E_OHDR, H5E_CANTRELEASE, FAIL, "unable to close temporary ID")
+    } /* end if */
 
     /* Get source object header */
-    if(NULL == (oh_src = H5O_protect(oloc_src, dxpl_id, H5AC_READ)))
+    if(NULL == (oh_src = H5O_protect(oloc_src, dxpl_id, H5AC__READ_ONLY_FLAG)))
         HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Retrieve user data for particular type of object to copy */
-    if(obj_class->get_copy_file_udata &&
-            (NULL == (cpy_udata = (obj_class->get_copy_file_udata)())))
+    if(obj_class->get_copy_file_udata && (NULL == (cpy_udata = (obj_class->get_copy_file_udata)())))
         HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to retrieve copy user data")
 
     /* If we are merging committed datatypes, check for a match in the destination
@@ -449,6 +461,7 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out*/,
     oh_dst->attr_msgs_seen = oh_src->attr_msgs_seen;
     oh_dst->sizeof_size = H5F_SIZEOF_SIZE(oloc_dst->file);
     oh_dst->sizeof_addr = H5F_SIZEOF_ADDR(oloc_dst->file);
+    oh_dst->swmr_write = !!(H5F_INTENT(oloc_dst->file) & H5F_ACC_SWMR_WRITE);
 
     /* Copy time fields */
     oh_dst->atime = oh_src->atime;
@@ -460,6 +473,14 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out*/,
     oh_dst->max_compact = oh_src->max_compact;
     oh_dst->min_dense = oh_src->min_dense;
 
+    /* Create object header proxy if doing SWMR writes */
+    if(H5F_INTENT(oloc_dst->file) & H5F_ACC_SWMR_WRITE) {
+        if(H5O_proxy_create(oloc_dst->file, dxpl_id, oh_dst) < 0)
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTCREATE, FAIL, "can't create object header proxy")
+    } /* end if */
+    else
+        oh_dst->proxy_addr = HADDR_UNDEF;
+
     /* Initialize size of chunk array.  Start off with zero chunks so this field
      * is consistent with the current state of the chunk array.  This is
      * important if an error occurs.
@@ -467,7 +488,7 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out*/,
     oh_dst->alloc_nchunks = oh_dst->nchunks = 0;
 
     /* Allocate memory for the chunk array - always start with 1 chunk */
-    if(NULL == (oh_dst->chunk = H5FL_SEQ_MALLOC(H5O_chunk_t, 1)))
+    if(NULL == (oh_dst->chunk = H5FL_SEQ_MALLOC(H5O_chunk_t, (size_t)1)))
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
 
     /* Update number of allocated chunks.  There are still no chunks used. */
@@ -857,12 +878,22 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out*/,
         oh_dst->nlink += (unsigned)addr_map->inc_ref_count;
     } /* end if */
 
+    /* Set metadata tag for destination object's object header */
+    H5_BEGIN_TAG(dxpl_id, oloc_dst->addr, FAIL);
+
     /* Insert destination object header in cache */
     if(H5AC_insert_entry(oloc_dst->file, dxpl_id, H5AC_OHDR, oloc_dst->addr, oh_dst, H5AC__NO_FLAGS_SET) < 0)
-        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "unable to cache object header")
+        HGOTO_ERROR_TAG(H5E_OHDR, H5E_CANTINSERT, FAIL, "unable to cache object header")
     oh_dst = NULL;
     inserted = TRUE;
 
+    /* Reset metadat tag */
+    H5_END_TAG(FAIL);
+
+    /* Retag all copied metadata to apply the destination object's tag */
+    if(H5AC_retag_copied_metadata(oloc_dst->file, oloc_dst->addr) < 0)
+        HGOTO_ERROR(H5E_CACHE, H5E_CANTTAG, FAIL, "unable to re-tag metadata entries")
+
     /* Set obj_type and udata, if requested */
     if(obj_type) {
         HDassert(udata);
@@ -887,7 +918,7 @@ done:
             HDONE_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header data")
     } /* end if */
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5O_copy_header_real() */
 
 

@@ -1074,7 +1105,7 @@ H5O_copy_header(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */,
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get object copy flag")
 
     /* Retrieve the marge committed datatype list */
-    if(H5P_get(ocpy_plist, H5O_CPY_MERGE_COMM_DT_LIST_NAME, &dt_list) < 0)
+    if(H5P_peek(ocpy_plist, H5O_CPY_MERGE_COMM_DT_LIST_NAME, &dt_list) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get merge committed datatype list")
 
     /* Get callback info */
@@ -1556,9 +1587,9 @@ done:
  *              Nov 3 2011
  *
  * Modifications:
- *	Vailin Choi; August 2012
- *	Use H5O_obj_class to get object type instead of
- *	H5O_get_info(...TRUE....) saving time in traversing metadata.
+ *      Vailin Choi; August 2012
+ *      Use H5O_obj_class to get object type instead of
+ *      H5O_get_info(...TRUE....) saving time in traversing metadata.
  *-------------------------------------------------------------------------
  */
 static herr_t
diff --git a/src/H5Odbg.c b/src/H5Odbg.c
index 0531a90..d9d4b8b 100644
--- a/src/H5Odbg.c
+++ b/src/H5Odbg.c
@@ -28,7 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 /***********/
 /* Headers */
@@ -247,8 +248,8 @@ H5O_assert(const H5O_t *oh)
 herr_t
 H5O_debug_id(unsigned type_id, H5F_t *f, hid_t dxpl_id, const void *mesg, FILE *stream, int indent, int fwidth)
 {
-    const H5O_msg_class_t *type;            /* Actual H5O class type for the ID */
-    herr_t      ret_value;       /* Return value */
+    const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
+    herr_t      ret_value = FAIL;       /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -454,20 +455,23 @@ H5O_debug_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh, haddr_t addr, FILE *stream, i
 	if(oh->mesg[i].flags) {
             hbool_t flag_printed = FALSE;
 
-            if(oh->mesg[i].flags & H5O_MSG_FLAG_SHARED) {
-                HDfprintf(stream, "<S");
-                flag_printed = TRUE;
-            } /* end if */
+            /* Sanity check that all flags in format are covered below */
+            HDcompile_assert(H5O_MSG_FLAG_BITS == (H5O_MSG_FLAG_CONSTANT|H5O_MSG_FLAG_SHARED|H5O_MSG_FLAG_DONTSHARE|H5O_MSG_FLAG_FAIL_IF_UNKNOWN_AND_OPEN_FOR_WRITE|H5O_MSG_FLAG_MARK_IF_UNKNOWN|H5O_MSG_FLAG_WAS_UNKNOWN|H5O_MSG_FLAG_SHAREABLE|H5O_MSG_FLAG_FAIL_IF_UNKNOWN_ALWAYS));
+
             if(oh->mesg[i].flags & H5O_MSG_FLAG_CONSTANT) {
                 HDfprintf(stream, "%sC", (flag_printed ? ", " : "<"));
                 flag_printed = TRUE;
             } /* end if */
+            if(oh->mesg[i].flags & H5O_MSG_FLAG_SHARED) {
+                HDfprintf(stream, "%sS", (flag_printed ? ", " : "<"));
+                flag_printed = TRUE;
+            } /* end if */
             if(oh->mesg[i].flags & H5O_MSG_FLAG_DONTSHARE) {
                 HDfprintf(stream, "%sDS", (flag_printed ? ", " : "<"));
                 flag_printed = TRUE;
             } /* end if */
             if(oh->mesg[i].flags & H5O_MSG_FLAG_FAIL_IF_UNKNOWN_AND_OPEN_FOR_WRITE) {
-                HDfprintf(stream, "%sFIU", (flag_printed ? ", " : "<"));
+                HDfprintf(stream, "%sFIUW", (flag_printed ? ", " : "<"));
                 flag_printed = TRUE;
             } /* end if */
             if(oh->mesg[i].flags & H5O_MSG_FLAG_MARK_IF_UNKNOWN) {
@@ -479,6 +483,14 @@ H5O_debug_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh, haddr_t addr, FILE *stream, i
                 HDfprintf(stream, "%sWU", (flag_printed ? ", " : "<"));
                 flag_printed = TRUE;
             } /* end if */
+            if(oh->mesg[i].flags & H5O_MSG_FLAG_SHAREABLE) {
+                HDfprintf(stream, "%sSA", (flag_printed ? ", " : "<"));
+                flag_printed = TRUE;
+            } /* end if */
+            if(oh->mesg[i].flags & H5O_MSG_FLAG_FAIL_IF_UNKNOWN_ALWAYS) {
+                HDfprintf(stream, "%sFIUA", (flag_printed ? ", " : "<"));
+                flag_printed = TRUE;
+            } /* end if */
             if(!flag_printed)
                 HDfprintf(stream, "-");
             HDfprintf(stream, ">\n");
@@ -566,7 +578,7 @@ H5O_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int f
     loc.addr = addr;
     loc.holding_file = FALSE;
 
-    if(NULL == (oh = H5O_protect(&loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(&loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* debug */
diff --git a/src/H5Odrvinfo.c b/src/H5Odrvinfo.c
index 73cb7cc..2fdf494 100644
--- a/src/H5Odrvinfo.c
+++ b/src/H5Odrvinfo.c
@@ -21,7 +21,8 @@
  *              in the superblock extension.
  */
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
@@ -84,7 +85,7 @@ H5O_drvinfo_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t
     unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
 {
     H5O_drvinfo_t	*mesg;          /* Native message */
-    void                *ret_value;     /* Return value */
+    void		*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -181,7 +182,7 @@ H5O_drvinfo_copy(const void *_mesg, void *_dest)
 {
     const H5O_drvinfo_t	*mesg = (const H5O_drvinfo_t *)_mesg;
     H5O_drvinfo_t	*dest = (H5O_drvinfo_t *)_dest;
-    void		*ret_value;
+    void		*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -228,7 +229,7 @@ static size_t
 H5O_drvinfo_size(const H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared, const void *_mesg)
 {
     const H5O_drvinfo_t *mesg = (const H5O_drvinfo_t *)_mesg;
-    size_t                   ret_value;
+    size_t ret_value = 0;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
diff --git a/src/H5Odtype.c b/src/H5Odtype.c
index 622a18e..e51d319 100644
--- a/src/H5Odtype.c
+++ b/src/H5Odtype.c
@@ -13,8 +13,9 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
-#define H5T_PACKAGE		/*prevent warning from including H5Tpkg   */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+#define H5T_FRIEND		/*prevent warning from including H5Tpkg   */
+
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Dprivate.h"		/* Datasets				*/
@@ -35,7 +36,7 @@ static void *H5O_dtype_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
 static void *H5O_dtype_copy(const void *_mesg, void *_dest);
 static size_t H5O_dtype_size(const H5F_t *f, const void *_mesg);
 static herr_t H5O_dtype_reset(void *_mesg);
-static herr_t H5O_dtype_free(void *_mesg);
+static herr_t H5O__dtype_free(void *_mesg);
 static herr_t H5O_dtype_set_share(void *_mesg, const H5O_shared_t *sh);
 static htri_t H5O_dtype_can_share(const void *_mesg);
 static herr_t H5O_dtype_pre_copy_file(H5F_t *file_src, const void *mesg_src,
@@ -101,7 +102,7 @@ const H5O_msg_class_t H5O_MSG_DTYPE[1] = {{
     H5O_dtype_copy,		/* copy the native value	*/
     H5O_dtype_shared_size,	/* size of raw message		*/
     H5O_dtype_reset,		/* reset method			*/
-    H5O_dtype_free,		/* free method			*/
+    H5O__dtype_free,		/* free method			*/
     H5O_dtype_shared_delete,	/* file delete method		*/
     H5O_dtype_shared_link,	/* link method			*/
     H5O_dtype_set_share,	/* set share method		*/
@@ -262,7 +263,7 @@ H5O_dtype_decode_helper(H5F_t *f, unsigned *ioflags/*in,out*/, const uint8_t **p
                 unsigned offset_nbytes;         /* Size needed to encode member offsets */
                 size_t max_memb_pos = 0;        /* Maximum member covered, so far */
                 unsigned max_version = 0;       /* Maximum member version */
-                hbool_t upgrade_to = 0;         /* Version number we can "soft" upgrade to */
+                unsigned upgrade_to = 0;         /* Version number we can "soft" upgrade to */
                 unsigned j;
 
                 /* Compute the # of bytes required to store a member offset */
@@ -1093,7 +1094,7 @@ H5O_dtype_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *o
     unsigned *ioflags/*in,out*/, const uint8_t *p)
 {
     H5T_t	*dt = NULL;
-    void        *ret_value;     /* Return value */
+    void        *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1175,9 +1176,9 @@ done:
 static void *
 H5O_dtype_copy(const void *_src, void *_dst)
 {
-    const H5T_t		   *src = (const H5T_t *) _src;
-    H5T_t		   *dst;
-    void 		   *ret_value;  /* Return value */
+    const H5T_t	*src = (const H5T_t *) _src;
+    H5T_t	*dst;
+    void        *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1224,7 +1225,7 @@ H5O_dtype_size(const H5F_t *f, const void *_mesg)
 {
     const H5T_t	*dt = (const H5T_t *)_mesg;
     unsigned	u;                      /* Local index variable */
-    size_t	ret_value;
+    size_t	ret_value = 0;          /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1369,31 +1370,34 @@ H5O_dtype_reset(void *_mesg)
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_dtype_free
+ * Function:	H5O__dtype_free
  *
- * Purpose:	Free's the message
+ * Purpose:	Frees the message
  *
  * Return:	Non-negative on success/Negative on failure
  *
  * Programmer:	Quincey Koziol
  *              Thursday, March 30, 2000
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_dtype_free(void *mesg)
+H5O__dtype_free(void *mesg)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    herr_t ret_value = SUCCEED;         /* Return value */
 
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
     HDassert(mesg);
 
-    ((H5T_t *) mesg)->shared = H5FL_FREE(H5T_shared_t, ((H5T_t *) mesg)->shared);
-    mesg = H5FL_FREE(H5T_t, mesg);
+    /* Release the datatype */
+    if(H5T_close((H5T_t *)mesg) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free datatype")
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5O_dtype_free() */
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__dtype_free() */
 
 

 /*-------------------------------------------------------------------------
@@ -1562,7 +1566,7 @@ H5O_dtype_copy_file(H5F_t H5_ATTR_UNUSED *file_src, const H5O_msg_class_t *mesg_
     H5O_copy_t H5_ATTR_UNUSED *cpy_info, void H5_ATTR_UNUSED *udata, hid_t H5_ATTR_UNUSED dxpl_id)
 {
     H5T_t *dst_mesg;            /* Destination datatype */
-    void *ret_value;            /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
diff --git a/src/H5Oefl.c b/src/H5Oefl.c
index c413c3c..149c8b2 100644
--- a/src/H5Oefl.c
+++ b/src/H5Oefl.c
@@ -18,7 +18,7 @@
  *	       Tuesday, November 25, 1997
  */
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -96,8 +96,8 @@ H5O_efl_decode(H5F_t *f, hid_t dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
     int			version;
     const char		*s = NULL;
     H5HL_t              *heap;
-    size_t		u;      /* Local index variable */
-    void *ret_value;            /* Return value */
+    size_t		u;                      /* Local index variable */
+    void                *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -128,7 +128,7 @@ H5O_efl_decode(H5F_t *f, hid_t dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
 #ifndef NDEBUG
     HDassert(H5F_addr_defined(mesg->heap_addr));
 
-    if(NULL == (heap = H5HL_protect(f, dxpl_id, mesg->heap_addr, H5AC_READ)))
+    if(NULL == (heap = H5HL_protect(f, dxpl_id, mesg->heap_addr, H5AC__READ_ONLY_FLAG)))
         HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, NULL, "unable to read protect link value")
 
     s = (const char *)H5HL_offset_into(heap, 0);
@@ -145,7 +145,7 @@ H5O_efl_decode(H5F_t *f, hid_t dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
     if(NULL == mesg->slot)
 	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
 
-    if(NULL == (heap = H5HL_protect(f, dxpl_id, mesg->heap_addr, H5AC_READ)))
+    if(NULL == (heap = H5HL_protect(f, dxpl_id, mesg->heap_addr, H5AC__READ_ONLY_FLAG)))
         HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, NULL, "unable to read protect link value")
     for(u = 0; u < mesg->nused; u++) {
 	/* Name */
@@ -258,64 +258,47 @@ H5O_efl_copy(const void *_mesg, void *_dest)
 {
     const H5O_efl_t	*mesg = (const H5O_efl_t *) _mesg;
     H5O_efl_t		*dest = (H5O_efl_t *) _dest;
-    size_t		u;              /* Local index variable */
-    void                *ret_value;     /* Return value */
+    size_t		u;                      /* Local index variable */
+    hbool_t             slot_allocated = FALSE; /* Flag to indicate that dynamic allocation has begun */
+    void                *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
     /* check args */
     HDassert(mesg);
-    if(!dest) {
-	if(NULL == (dest = (H5O_efl_t *)H5MM_calloc(sizeof(H5O_efl_t))))
-	    HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "can't allocate efl message")
-        if(NULL == (dest->slot = (H5O_efl_entry_t *)H5MM_calloc(mesg->nalloc * sizeof(H5O_efl_entry_t))))
-	    HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "can't allocate efl message slots")
-    } /* end if */
-    else if(dest->nalloc < mesg->nalloc) {
-        H5O_efl_entry_t *temp_slot;     /* Temporary pointer to new slot information */
 
-        /* Allocate new 'slot' information */
-        if(NULL == (temp_slot = (H5O_efl_entry_t *)H5MM_calloc(mesg->nalloc * sizeof(H5O_efl_entry_t))))
-            HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "can't allocate efl message slots")
+    /* Allocate destination message, if necessary */
+    if(!dest && NULL == (dest = (H5O_efl_t *)H5MM_calloc(sizeof(H5O_efl_t))))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "can't allocate efl message")
 
-        /* Release old 'slot' information */
-        for(u = 0; u < dest->nused; u++)
-            dest->slot[u].name = (char *)H5MM_xfree(dest->slot[u].name);
-        dest->slot = (H5O_efl_entry_t *)H5MM_xfree(dest->slot);
+    /* copy */
+    *dest = *mesg;
 
-        /* Point to new 'slot' information */
-        dest->slot = temp_slot;
+    /* Deep copy allocated information */
+    if(dest->nalloc > 0) {
+        if(NULL == (dest->slot = (H5O_efl_entry_t *)H5MM_calloc(dest->nalloc * sizeof(H5O_efl_entry_t))))
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "can't allocate efl message slots")
+        slot_allocated = TRUE;
+        for(u = 0; u < mesg->nused; u++) {
+            dest->slot[u] = mesg->slot[u];
+            if(NULL == (dest->slot[u].name = H5MM_xstrdup(mesg->slot[u].name)))
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "can't allocate efl message slot name")
+        } /* end for */
     } /* end if */
-    else {
-        /* Release old 'slot' information */
-        for(u = 0; u < dest->nused; u++)
-            dest->slot[u].name = (char *)H5MM_xfree(dest->slot[u].name);
-    } /* end else */
-    dest->heap_addr = mesg->heap_addr;
-    dest->nalloc = mesg->nalloc;
-    dest->nused = mesg->nused;
-
-    for(u = 0; u < mesg->nused; u++) {
-	dest->slot[u] = mesg->slot[u];
-	if(NULL == (dest->slot[u].name = H5MM_xstrdup(mesg->slot[u].name)))
-            HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "can't allocate efl message slot name")
-    } /* end for */
 
     /* Set return value */
     ret_value = dest;
 
 done:
     if(NULL == ret_value) {
-        if(dest && NULL == _dest) {
-            if(dest->slot) {
-                for(u = 0; u < mesg->nused; u++) {
-                    if(dest->slot[u].name != NULL && dest->slot[u].name != mesg->slot[u].name)
-                        dest->slot[u].name = (char *)H5MM_xfree(dest->slot[u].name);
-                } /* end for */
-                dest->slot = (H5O_efl_entry_t *)H5MM_xfree(dest->slot);
-            } /* end if */
-            dest = (H5O_efl_t *)H5MM_xfree(dest);
+        if(slot_allocated) {
+            for(u = 0; u < dest->nused; u++)
+                if(dest->slot[u].name != NULL && dest->slot[u].name != mesg->slot[u].name)
+                    dest->slot[u].name = (char *)H5MM_xfree(dest->slot[u].name);
+            dest->slot = (H5O_efl_entry_t *)H5MM_xfree(dest->slot);
         } /* end if */
+        if(NULL == _dest)
+            dest = (H5O_efl_t *)H5MM_xfree(dest);
     } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
@@ -389,8 +372,10 @@ H5O_efl_reset(void *_mesg)
 
     /* reset */
     if(mesg->slot) {
-        for(u = 0; u < mesg->nused; u++)
+        for(u = 0; u < mesg->nused; u++) {
             mesg->slot[u].name = (char *)H5MM_xfree(mesg->slot[u].name);
+            mesg->slot[u].name_offset = 0;
+        } /* end for */
         mesg->slot = (H5O_efl_entry_t *)H5MM_xfree(mesg->slot);
     } /* end if */
     mesg->heap_addr = HADDR_UNDEF;
@@ -460,11 +445,11 @@ H5O_efl_copy_file(H5F_t H5_ATTR_UNUSED *file_src, void *mesg_src, H5F_t *file_ds
 {
     H5O_efl_t   *efl_src = (H5O_efl_t *) mesg_src;
     H5O_efl_t   *efl_dst = NULL;
-    H5HL_t      *heap = NULL;                           /* Pointer to local heap for EFL file names */
+    H5HL_t      *heap = NULL;                   /* Pointer to local heap for EFL file names */
     size_t      idx, size, name_offset, heap_size;
-    void        *ret_value;          /* Return value */
+    void        *ret_value = NULL;              /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, H5AC__COPIED_TAG, NULL)
 
     /* check args */
     HDassert(efl_src);
@@ -487,11 +472,11 @@ H5O_efl_copy_file(H5F_t H5_ATTR_UNUSED *file_src, void *mesg_src, H5F_t *file_ds
         HGOTO_ERROR(H5E_EFL, H5E_CANTINIT, NULL, "can't create heap")
 
     /* Pin the heap down in memory */
-    if(NULL == (heap = H5HL_protect(file_dst, dxpl_id, efl_dst->heap_addr, H5AC_WRITE)))
+    if(NULL == (heap = H5HL_protect(file_dst, dxpl_id, efl_dst->heap_addr, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_EFL, H5E_PROTECT, NULL, "unable to protect EFL file name heap")
 
     /* Insert "empty" name first */
-    if((size_t)(-1) == (name_offset = H5HL_insert(file_dst, dxpl_id, heap, (size_t)1, "")))
+    if(UFAIL == (name_offset = H5HL_insert(file_dst, dxpl_id, heap, (size_t)1, "")))
         HGOTO_ERROR(H5E_EFL, H5E_CANTINSERT, NULL, "can't insert file name into heap")
     HDassert(0 == name_offset);
 
@@ -508,7 +493,7 @@ H5O_efl_copy_file(H5F_t H5_ATTR_UNUSED *file_src, void *mesg_src, H5F_t *file_ds
     /* copy the name from the source */
     for(idx = 0; idx < efl_src->nused; idx++) {
         efl_dst->slot[idx].name = H5MM_xstrdup(efl_src->slot[idx].name);
-        if((size_t)(-1) == (efl_dst->slot[idx].name_offset = H5HL_insert(file_dst, dxpl_id, heap,
+        if(UFAIL == (efl_dst->slot[idx].name_offset = H5HL_insert(file_dst, dxpl_id, heap,
                 HDstrlen(efl_dst->slot[idx].name) + 1, efl_dst->slot[idx].name)))
             HGOTO_ERROR(H5E_EFL, H5E_CANTINSERT, NULL, "can't insert file name into heap")
     } /* end for */
@@ -524,7 +509,7 @@ done:
         if(efl_dst)
             H5MM_xfree(efl_dst);
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, NULL)
 } /* end H5O_efl_copy_file() */
 
 

diff --git a/src/H5Ofill.c b/src/H5Ofill.c
index 3bdf2b6..ebcb5d3 100644
--- a/src/H5Ofill.c
+++ b/src/H5Ofill.c
@@ -20,7 +20,8 @@
  *		uninitialized data points of a dataset.
  */
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Dprivate.h"		/* Datasets				*/
@@ -188,7 +189,7 @@ H5O_fill_new_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t
     unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
 {
     H5O_fill_t	*fill = NULL;
-    void	*ret_value;
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -301,8 +302,8 @@ static void *
 H5O_fill_old_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
     unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
 {
-    H5O_fill_t *fill = NULL;		/* Decoded fill value message */
-    void *ret_value;                    /* Return value */
+    H5O_fill_t *fill = NULL;	/* Decoded fill value message */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -494,7 +495,7 @@ H5O_fill_copy(const void *_src, void *_dst)
 {
     const H5O_fill_t	*src = (const H5O_fill_t *)_src;
     H5O_fill_t		*dst = (H5O_fill_t *)_dst;
-    void		*ret_value;
+    void		*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -611,7 +612,7 @@ static size_t
 H5O_fill_new_size(const H5F_t H5_ATTR_UNUSED *f, const void *_fill)
 {
     const H5O_fill_t	*fill = (const H5O_fill_t *)_fill;
-    size_t		ret_value;
+    size_t		ret_value = 0;          /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -890,7 +891,7 @@ H5O_fill_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void
     else
 	fprintf(stream, "<dataset type>\n");
 
-    FUNC_LEAVE_NOAPI(SUCCEED);
+    FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5O_fill_debug() */
 
 

@@ -993,7 +994,7 @@ done:
     if(bkg)
         H5MM_xfree(bkg);
 
-    FUNC_LEAVE_NOAPI(ret_value);
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5O_fill_convert() */
 
 

diff --git a/src/H5Oflush.c b/src/H5Oflush.c
new file mode 100644
index 0000000..00fa937
--- /dev/null
+++ b/src/H5Oflush.c
@@ -0,0 +1,427 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     H5Oflush.c
+ *              Aug 19, 2010
+ *              Mike McGreevy <mamcgree at hdfgroup.org>
+ *
+ * Purpose:     Object flush/refresh routines.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
+/***********/
+/* Headers */
+/***********/
+
+#include "H5private.h"      /* Generic Functions */
+#include "H5Dprivate.h"     /* Datasets */
+#include "H5Eprivate.h"     /* Errors   */
+#include "H5Fprivate.h"     /* Files    */
+#include "H5Gprivate.h"        /* Groups    */
+#include "H5Iprivate.h"        /* IDs    */
+#include "H5Opkg.h"         /* Objects  */
+
+/********************/
+/* Local Prototypes */
+/********************/
+static herr_t H5O_oh_tag(const H5O_loc_t *oloc, hid_t dxpl_id, haddr_t *tag);
+
+/*************/
+/* Functions */
+/*************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:   H5Oflush
+ *
+ * Purpose:    Flushes all buffers associated with an object to disk.
+ *
+ * Return:    Non-negative on success, negative on failure
+ *
+ * Programmer:  Mike McGreevy
+ *              May 19, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Oflush(hid_t obj_id)
+{
+    H5O_loc_t *oloc;            /* object location */
+    void *obj_ptr;		/* Pointer to object */
+    const H5O_obj_class_t  *obj_class = NULL;       /* Class of object */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", obj_id);
+
+    /* Check args */
+    if(NULL == (oloc = H5O_get_loc(obj_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an object")
+
+    /* Get the object pointer */
+    if(NULL == (obj_ptr = H5I_object(obj_id)))
+	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid object identifier")
+
+    /* Get the object class */
+    if(NULL == (obj_class = H5O_obj_class(oloc, H5AC_dxpl_id)))
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to determine object class")
+
+    /* Flush the object of this class */
+    if(obj_class->flush && obj_class->flush(obj_ptr, H5AC_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTFLUSH, FAIL, "unable to flush object")
+
+    /* Flush the object metadata and invoke flush callback */
+    if(H5O_flush_common(oloc, obj_id, H5AC_dxpl_id) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTFLUSH, FAIL, "unable to flush object and object flush callback")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Oflush() */
+
+/*-------------------------------------------------------------------------
+ * Function:    H5O_flush_common
+ *
+ * Purpose:    	Flushes the object's metadata
+ *		Invokes the user-defined callback if there is one.
+ *
+ * Return:  	Non-negative on success, negative on failure
+ *
+ * Programmer:  Vailin Choi; Dec 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_flush_common(H5O_loc_t *oloc, hid_t obj_id, hid_t dxpl_id)
+{
+    haddr_t 	tag = 0;
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Retrieve tag for object */
+    if(H5O_oh_tag(oloc, dxpl_id, &tag) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTFLUSH, FAIL, "unable to flush object metadata")
+
+    /* Flush metadata based on tag value of the object */
+    if(H5F_flush_tagged_metadata(oloc->file, tag, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush tagged metadata")
+
+    /* Check to invoke callback */
+    if(H5F_object_flush_cb(oloc->file, obj_id) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTFLUSH, FAIL, "unable to do object flush callback")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_flush_common() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_oh_tag
+ *
+ * Purpose:     Get object header's address--tag value for the object
+ *
+ * Return:  	Success:    Non-negative
+ *          	Failure:    Negative
+ *
+ * Programmer: Mike McGreevy
+ *             May 19, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_oh_tag(const H5O_loc_t *oloc, hid_t dxpl_id, haddr_t *tag)
+{
+    H5O_t       *oh = NULL;             /* Object header */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(oloc);
+
+    /* Get object header for object */
+    if(NULL == (oh = H5O_protect(oloc, dxpl_id, H5AC__READ_ONLY_FLAG)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object's object header")
+
+    /* Get object header's address (i.e. the tag value for this object) */
+    if(HADDR_UNDEF == (*tag = H5O_OH_GET_ADDR(oh)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to get address of object header")
+
+done:
+    /* Unprotect object header on failure */
+    if(oh && H5O_unprotect(oloc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
+        HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_oh_tag() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Orefresh
+ *
+ * Purpose:    Refreshes all buffers associated with an object.
+ *
+ * Return:    Non-negative on success, negative on failure
+ *
+ * Programmer:  Mike McGreevy
+ *              July 28, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Orefresh(hid_t oid)
+{
+    H5O_loc_t *oloc;            /* object location */
+    herr_t ret_value = SUCCEED; /* return value */
+    
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", oid);
+
+    /* Check args */
+    if((oloc = H5O_get_loc(oid)) == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an object")
+
+    /* Private function */
+    if(H5O_refresh_metadata(oid, *oloc, H5AC_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to refresh object")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Orefresh() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_refresh_metadata
+ *
+ * Purpose:     Refreshes all buffers associated with an object.
+ *
+ * Note:	This is based on the original H5O_refresh_metadata() but
+ *	        is split into 2 routines.  
+ *	        This is done so that H5Fstart_swmr_write() can use these
+ *	        2 routines to refresh opened objects.  This may be 
+ *	        restored back to the original code when H5Fstart_swmr_write()
+ *	        uses a different approach to handle issues with opened objects.	
+ *	 	H5Fstart_swmr_write() no longer calls the 1st routine.	(12/24/15)
+ *
+ * Return:    	Non-negative on success, negative on failure
+ *
+ * Programmer: Mike McGreevy/Vailin Choi
+ *             July 28, 2010/Feb 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_refresh_metadata(hid_t oid, H5O_loc_t oloc, hid_t dxpl_id)
+{
+    H5G_loc_t obj_loc;
+    H5O_loc_t obj_oloc;
+    H5G_name_t obj_path;
+    hbool_t objs_incr = FALSE;          /* Whether the object count in the file was incremented */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* If the file is opened with write access, 
+       no need to perform refresh actions. */
+    if(H5F_INTENT(oloc.file) & H5F_ACC_RDWR)
+	HGOTO_DONE(SUCCEED)
+
+    /* Create empty object location */
+    obj_loc.oloc = &obj_oloc;
+    obj_loc.path = &obj_path;
+    H5G_loc_reset(&obj_loc);
+
+    /* "Fake" another open object in the file, so that it doesn't get closed
+     *  if this object is the only thing holding the file open.
+     */
+    H5F_incr_nopen_objs(oloc.file);
+    objs_incr = TRUE;
+
+    /* Close object & evict its metadata */
+    if((H5O_refresh_metadata_close(oid, oloc, &obj_loc, dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to refresh object")
+
+    /* Re-open the object, re-fetching its metadata */
+    if((H5O_refresh_metadata_reopen(oid, &obj_loc, dxpl_id, FALSE)) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to refresh object")
+
+done:
+    if(objs_incr)
+        H5F_decr_nopen_objs(oloc.file);
+
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5O_refresh_metadata() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_refresh_metadata_close
+ *
+ * Purpose:     This is the first part of the original routine H5O_refresh_metadata().
+ *		(1) Save object location information.
+ *		(2) Handle multiple dataset opens
+ *		(3) Get object cork status
+ *		(4) Close the object
+ *		(5) Flush and evict object metadata
+ *		(6) Re-cork the object if needed
+ *
+ * Return:  Success:    Non-negative
+ *          Failure:    Negative
+ *
+ * Programmer: Mike McGreevy/Vailin Choi
+ *             July 28, 2010/Feb 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_refresh_metadata_close(hid_t oid, H5O_loc_t oloc, H5G_loc_t *obj_loc, hid_t dxpl_id)
+{
+    haddr_t tag = 0;
+    hbool_t corked;
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+    
+    /* Make deep local copy of object's location information */
+    if(obj_loc) {
+        H5G_loc_t tmp_loc;
+
+        H5G_loc(oid, &tmp_loc);
+        H5G_loc_copy(obj_loc, &tmp_loc, H5_COPY_DEEP);
+    } /* end if */
+
+    /* Get object's type */
+    if(H5I_get_type(oid) == H5I_DATASET) {
+	if(H5D_mult_refresh_close(oid, dxpl_id) < 0)
+	    HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "unable to prepare refresh for dataset")
+    }
+
+    /* Retrieve tag for object */
+    if(H5O_oh_tag(&oloc, dxpl_id, &tag) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTFLUSH, FAIL, "unable to get object header address")
+
+    /* Get cork status of the object with tag */
+    if(H5AC_cork(oloc.file, tag, H5AC__GET_CORKED, &corked) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_SYSTEM, FAIL, "unable to retrieve an object's cork status")
+
+    /* Close the object */
+    if(H5I_dec_ref(oid) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to close object")
+
+    /* Flush metadata based on tag value of the object */
+    if(H5F_flush_tagged_metadata(oloc.file, tag, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to flush tagged metadata")
+
+    /* Evict the object's tagged metadata */
+    if(H5F_evict_tagged_metadata(oloc.file, tag, dxpl_id) < 0)
+        HGOTO_ERROR(H5E_FILE, H5E_CANTFLUSH, FAIL, "unable to evict metadata")
+
+    /* Re-cork object with tag */
+    if(corked)
+	if(H5AC_cork(oloc.file, tag, H5AC__SET_CORK, &corked) < 0)
+	    HGOTO_ERROR(H5E_ATOM, H5E_SYSTEM, FAIL, "unable to cork the object")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5O_refresh_metadata_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_refresh_metadata_reopen
+ *
+ * Purpose:     This is the second part of the original routine H5O_refresh_metadata().
+ *		  (1) Re-open object with the saved object location information.
+ *		  (2) Re-register object ID with the re-opened object.
+ *
+ * Return:      SUCCEED/FAIL
+ *
+ * Programmer: Mike McGreevy/Vailin Choi
+ *             July 28, 2010/Feb 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_refresh_metadata_reopen(hid_t oid, H5G_loc_t *obj_loc, hid_t dxpl_id, hbool_t start_swmr)
+{
+    void *object = NULL;        /* Dataset for this operation */
+    H5I_type_t type;
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Get object's type */
+    type = H5I_get_type(oid);
+
+    switch(type) {
+        case(H5I_GROUP):
+
+            /* Re-open the group */
+            if(NULL == (object = H5G_open(obj_loc, dxpl_id)))
+                HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group")
+            break;
+
+        case(H5I_DATATYPE):
+
+            /* Re-open the named datatype */
+            if(NULL == (object = H5T_open(obj_loc, dxpl_id)))
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTOPENOBJ, FAIL, "unable to open named datatype")
+            break;
+
+        case(H5I_DATASET):
+
+            /* Re-open the dataset */
+            if(NULL == (object = H5D_open(obj_loc, H5P_DATASET_ACCESS_DEFAULT, dxpl_id)))
+                HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "unable to open dataset")
+	    if(!start_swmr) { /* No need to handle multiple opens when H5Fstart_swmr_write() */
+		if(H5D_mult_refresh_reopen(object, dxpl_id) < 0)
+		    HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "unable to finish refresh for dataset")
+	    }
+            break;
+
+        case(H5I_UNINIT):
+        case(H5I_BADID):
+        case(H5I_FILE):
+        case(H5I_DATASPACE):
+        case(H5I_ATTR):
+        case(H5I_REFERENCE):
+        case(H5I_VFL):
+        case(H5I_GENPROP_CLS):
+        case(H5I_GENPROP_LST):
+        case(H5I_ERROR_CLASS):
+        case(H5I_ERROR_MSG):
+        case(H5I_ERROR_STACK):
+        case(H5I_NTYPES):
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_CANTRELEASE, FAIL, "not a valid file object ID (dataset, group, or datatype)")
+        break;
+
+    } /* end switch */
+
+    /* Re-register ID for the object */
+    if((H5I_register_with_id(type, object, TRUE, oid)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to re-register object atom")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value);
+} /* end H5O_refresh_metadata_reopen() */
+
diff --git a/src/H5Ofsinfo.c b/src/H5Ofsinfo.c
new file mode 100644
index 0000000..1712857
--- /dev/null
+++ b/src/H5Ofsinfo.c
@@ -0,0 +1,310 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Ofsinfo.c
+ *                      Feb 2009
+ *			Vailin Choi
+ *
+ * Purpose:             Free space manager info message.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
+
+#include "H5private.h"		/* Generic Functions	*/
+#include "H5Eprivate.h"		/* Error handling	*/
+#include "H5FLprivate.h"	/* Free lists          	*/
+#include "H5Opkg.h"             /* Object headers	*/
+
+/* PRIVATE PROTOTYPES */
+static void *H5O_fsinfo_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
+static herr_t H5O_fsinfo_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static void *H5O_fsinfo_copy(const void *_mesg, void *_dest);
+static size_t H5O_fsinfo_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+static herr_t H5O_fsinfo_free(void *mesg);
+static herr_t H5O_fsinfo_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg,
+    FILE * stream, int indent, int fwidth);
+
+/* This message derives from H5O message class */
+const H5O_msg_class_t H5O_MSG_FSINFO[1] = {{
+    H5O_FSINFO_ID,            	/* message id number             	*/
+    "fsinfo",                 	/* message name for debugging    	*/
+    sizeof(H5O_fsinfo_t),     	/* native message size           	*/
+    0,				/* messages are sharable?        	*/
+    H5O_fsinfo_decode,        	/* decode message                	*/
+    H5O_fsinfo_encode,        	/* encode message                	*/
+    H5O_fsinfo_copy,          	/* copy the native value         	*/
+    H5O_fsinfo_size,          	/* size of free-space manager info message */
+    NULL,                   	/* default reset method         	*/
+    H5O_fsinfo_free,	        /* free method				*/
+    NULL,        		/* file delete method			*/
+    NULL,			/* link method				*/
+    NULL,			/* set share method			*/
+    NULL,		    	/* can share method			*/
+    NULL,			/* pre copy native value to file 	*/
+    NULL,			/* copy native value to file    	*/
+    NULL,			/* post copy native value to file	*/
+    NULL,			/* get creation index			*/
+    NULL,			/* set creation index			*/
+    H5O_fsinfo_debug          	/* debug the message            	*/
+}};
+
+/* Current version of free-space manager info information */
+#define H5O_FSINFO_VERSION 	0
+
+/* Declare a free list to manage the H5O_fsinfo_t struct */
+H5FL_DEFINE_STATIC(H5O_fsinfo_t);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_fsinfo_decode
+ *
+ * Purpose:     Decode a message and return a pointer to a newly allocated one.
+ *
+ * Return:      Success:        Ptr to new message in native form.
+ *              Failure:        NULL
+ *
+ * Programmer:  Vailin Choi; Feb 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_fsinfo_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+    unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
+{
+    H5O_fsinfo_t	*fsinfo = NULL; /* free-space manager info */
+    H5FD_mem_t 		type;		/* Memory type for iteration */
+    void                *ret_value = NULL;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+
+    /* Version of message */
+    if(*p++ != H5O_FSINFO_VERSION)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for message")
+
+    /* Allocate space for message */
+    if(NULL == (fsinfo = H5FL_CALLOC(H5O_fsinfo_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    fsinfo->strategy = (H5F_file_space_type_t)*p++;	/* file space strategy */
+    H5F_DECODE_LENGTH(f, p, fsinfo->threshold);	/* free space section size threshold */
+
+    /* Addresses of free space managers: only exist for H5F_FILE_SPACE_ALL_PERSIST */
+    if(fsinfo->strategy == H5F_FILE_SPACE_ALL_PERSIST) {
+	for(type = H5FD_MEM_SUPER; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type))
+	    H5F_addr_decode(f, &p, &(fsinfo->fs_addr[type-1]));
+    } /* end if */
+    else {
+	for(type = H5FD_MEM_SUPER; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type))
+	    fsinfo->fs_addr[type-1] = HADDR_UNDEF;
+    } /* end else */
+
+    /* Set return value */
+    ret_value = fsinfo;
+
+done:
+    if(ret_value == NULL && fsinfo != NULL)
+        fsinfo = H5FL_FREE(H5O_fsinfo_t, fsinfo);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_fsinfo_decode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_fsinfo_encode
+ *
+ * Purpose:     Encodes a message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi; Feb 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_fsinfo_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
+{
+    const H5O_fsinfo_t  *fsinfo = (const H5O_fsinfo_t *)_mesg;
+    H5FD_mem_t 		type;	/* Memory type for iteration */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(p);
+    HDassert(fsinfo);
+
+    *p++ = H5O_FSINFO_VERSION;	/* message version */
+    *p++ = fsinfo->strategy;	/* file space strategy */
+    H5F_ENCODE_LENGTH(f, p, fsinfo->threshold); /* free-space section size threshold */
+
+    /* Addresses of free space managers: only exist for H5F_FILE_SPACE_ALL_PERSIST */
+    if(fsinfo->strategy == H5F_FILE_SPACE_ALL_PERSIST) {
+	for(type = H5FD_MEM_SUPER; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type))
+	    H5F_addr_encode(f, &p, fsinfo->fs_addr[type-1]);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_fsinfo_encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_fsinfo_copy
+ *
+ * Purpose:     Copies a message from _MESG to _DEST, allocating _DEST if
+ *              necessary.
+ *
+ * Return:      Success:        Ptr to _DEST
+ *              Failure:        NULL
+ *
+ * Programmer:  Vailin Choi; Feb 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O_fsinfo_copy(const void *_mesg, void *_dest)
+{
+    const H5O_fsinfo_t  *fsinfo = (const H5O_fsinfo_t *)_mesg;
+    H5O_fsinfo_t        *dest = (H5O_fsinfo_t *) _dest;
+    void                *ret_value = NULL;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* check args */
+    HDassert(fsinfo);
+    if(!dest && NULL == (dest = H5FL_CALLOC(H5O_fsinfo_t)))
+	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+
+    /* copy */
+    *dest = *fsinfo;
+
+    /* Set return value */
+    ret_value = dest;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_fsinfo_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_fsinfo_size
+ *
+ * Purpose:     Returns the size of the raw message in bytes not counting
+ *              the message type or size fields, but only the data fields.
+ *              This function doesn't take into account alignment.
+ *
+ * Return:      Success:        Message data size in bytes without alignment.
+ *              Failure:        zero
+ *
+ * Programmer:  Vailin Choi; Feb 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+H5O_fsinfo_size(const H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, const void *_mesg)
+{
+    const H5O_fsinfo_t   *fsinfo = (const H5O_fsinfo_t *)_mesg;
+    size_t fs_addr_size = 0;
+    size_t ret_value = 0;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+
+    /* Addresses of free-space managers exist only for H5F_FILE_SPACE_ALL_PERSIST type */
+    if(H5F_FILE_SPACE_ALL_PERSIST == fsinfo->strategy)
+	fs_addr_size = (H5FD_MEM_NTYPES - 1) * (size_t)H5F_SIZEOF_ADDR(f);
+
+    ret_value = 2                       /* Version & strategy */
+		+ (size_t)H5F_SIZEOF_SIZE(f)	/* Threshold */
+                + fs_addr_size;		/* Addresses of free-space managers */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_fsinfo_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_fsinfo_free
+ *
+ * Purpose:     Free's the message
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi; Feb 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_fsinfo_free(void *mesg)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(mesg);
+
+    mesg = H5FL_FREE(H5O_fsinfo_t, mesg);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_fsinfo_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_fsinfo_debug
+ *
+ * Purpose:     Prints debugging info for a message.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Vailin Choi; Feb 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_fsinfo_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg, FILE * stream,
+	       int indent, int fwidth)
+{
+    const H5O_fsinfo_t	*fsinfo = (const H5O_fsinfo_t *) _mesg;
+    H5FD_mem_t 		type;	/* Memory type for iteration */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* check args */
+    HDassert(f);
+    HDassert(fsinfo);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
+
+    HDfprintf(stream, "%*s%-*s %u\n", indent, "", fwidth,
+              "File space strategy:", fsinfo->strategy);
+
+    HDfprintf(stream, "%*s%-*s %Hu\n", indent, "", fwidth,
+              "Free space section threshold:", fsinfo->threshold);
+
+    if(fsinfo->strategy == H5F_FILE_SPACE_ALL_PERSIST) {
+	for(type = H5FD_MEM_SUPER; type < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, type))
+	    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+		"Free space manager address:", fsinfo->fs_addr[type-1]);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O_fsinfo_debug() */
+
diff --git a/src/H5Oginfo.c b/src/H5Oginfo.c
index 5519021..9cd0dc1 100644
--- a/src/H5Oginfo.c
+++ b/src/H5Oginfo.c
@@ -24,7 +24,8 @@
  *-------------------------------------------------------------------------
  */
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
@@ -100,7 +101,7 @@ H5O_ginfo_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5
 {
     H5O_ginfo_t         *ginfo = NULL;  /* Pointer to group information message */
     unsigned char       flags;          /* Flags for encoding group info */
-    void                *ret_value;     /* Return value */
+    void                *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -224,7 +225,7 @@ H5O_ginfo_copy(const void *_mesg, void *_dest)
 {
     const H5O_ginfo_t   *ginfo = (const H5O_ginfo_t *)_mesg;
     H5O_ginfo_t         *dest = (H5O_ginfo_t *)_dest;
-    void                *ret_value;     /* Return value */
+    void                *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -265,7 +266,7 @@ static size_t
 H5O_ginfo_size(const H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared, const void *_mesg)
 {
     const H5O_ginfo_t   *ginfo = (const H5O_ginfo_t *)_mesg;
-    size_t ret_value;   /* Return value */
+    size_t ret_value = 0;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
diff --git a/src/H5Olayout.c b/src/H5Olayout.c
index 20ea1a0..5963094 100644
--- a/src/H5Olayout.c
+++ b/src/H5Olayout.c
@@ -19,60 +19,65 @@
  * Purpose:     Messages related to data layout.
  */
 
-#define H5D_PACKAGE		/*suppress error about including H5Dpkg	  */
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#define H5D_FRIEND              /*suppress error about including H5Dpkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
 
-#include "H5private.h"		/* Generic Functions			*/
-#include "H5Dpkg.h"		/* Dataset functions			*/
-#include "H5Eprivate.h"		/* Error handling		  	*/
-#include "H5FLprivate.h"	/* Free Lists                           */
-#include "H5MFprivate.h"	/* File space management		*/
-#include "H5MMprivate.h"	/* Memory management			*/
-#include "H5Opkg.h"             /* Object headers			*/
-#include "H5Pprivate.h"		/* Property lists			*/
+
+#include "H5private.h"          /* Generic Functions                        */
+#include "H5Dpkg.h"             /* Dataset functions                        */
+#include "H5Eprivate.h"         /* Error handling                           */
+#include "H5FLprivate.h"        /* Free Lists                               */
+#include "H5MFprivate.h"        /* File space management                    */
+#include "H5MMprivate.h"        /* Memory management                        */
+#include "H5Opkg.h"             /* Object headers                           */
+#include "H5Pprivate.h"         /* Property lists                           */
+#include "H5Sprivate.h"         /* Dataspaces                               */
 
 
 /* Local macros */
 
+/* Version # of encoded virtual dataset global heap blocks */
+#define H5O_LAYOUT_VDS_GH_ENC_VERS      0
+
 
 /* PRIVATE PROTOTYPES */
-static void *H5O_layout_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+static void *H5O__layout_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
     unsigned mesg_flags, unsigned *ioflags, const uint8_t *p);
-static herr_t H5O_layout_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
-static void *H5O_layout_copy(const void *_mesg, void *_dest);
-static size_t H5O_layout_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
-static herr_t H5O_layout_reset(void *_mesg);
-static herr_t H5O_layout_free(void *_mesg);
-static herr_t H5O_layout_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
+static herr_t H5O__layout_encode(H5F_t *f, hbool_t disable_shared, uint8_t *p, const void *_mesg);
+static void *H5O__layout_copy(const void *_mesg, void *_dest);
+static size_t H5O__layout_size(const H5F_t *f, hbool_t disable_shared, const void *_mesg);
+static herr_t H5O__layout_reset(void *_mesg);
+static herr_t H5O__layout_free(void *_mesg);
+static herr_t H5O__layout_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
     void *_mesg);
-static void *H5O_layout_copy_file(H5F_t *file_src, void *mesg_src,
+static void *H5O__layout_copy_file(H5F_t *file_src, void *mesg_src,
     H5F_t *file_dst, hbool_t *recompute_size, unsigned *mesg_flags,
     H5O_copy_t *cpy_info, void *udata, hid_t dxpl_id);
-static herr_t H5O_layout_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE * stream,
-			       int indent, int fwidth);
+static herr_t H5O__layout_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg,
+    FILE * stream, int indent, int fwidth);
 
 /* This message derives from H5O message class */
 const H5O_msg_class_t H5O_MSG_LAYOUT[1] = {{
-    H5O_LAYOUT_ID,          	/*message id number             */
-    "layout",               	/*message name for debugging    */
-    sizeof(H5O_layout_t),   	/*native message size           */
-    0,				/* messages are sharable?       */
-    H5O_layout_decode,      	/*decode message                */
-    H5O_layout_encode,      	/*encode message                */
-    H5O_layout_copy,        	/*copy the native value         */
-    H5O_layout_size,        	/*size of message on disk       */
-    H5O_layout_reset,		/*reset method                  */
-    H5O_layout_free,        	/*free the struct		*/
-    H5O_layout_delete,	        /* file delete method		*/
-    NULL,			/* link method			*/
-    NULL,			/*set share method		*/
-    NULL,		    	/*can share method		*/
-    NULL,			/* pre copy native value to file */
-    H5O_layout_copy_file,	/* copy native value to file    */
-    NULL,		        /* post copy native value to file */
-    NULL,			/* get creation index		*/
-    NULL,			/* set creation index		*/
-    H5O_layout_debug       	/*debug the message             */
+    H5O_LAYOUT_ID,              /* message id number                    */
+    "layout",                   /* message name for debugging           */
+    sizeof(H5O_layout_t),       /* native message size                  */
+    0,                          /* messages are sharable?               */
+    H5O__layout_decode,         /* decode message                       */
+    H5O__layout_encode,         /* encode message                       */
+    H5O__layout_copy,           /* copy the native value                */
+    H5O__layout_size,           /* size of message on disk              */
+    H5O__layout_reset,          /* reset method                         */
+    H5O__layout_free,           /* free the struct                      */
+    H5O__layout_delete,	        /* file delete method                   */
+    NULL,                       /* link method                          */
+    NULL,                       /* set share method                     */
+    NULL,                       /* can share method                     */
+    NULL,                       /* pre copy native value to file        */
+    H5O__layout_copy_file,      /* copy native value to file            */
+    NULL,                       /* post copy native value to file       */
+    NULL,                       /* get creation index                   */
+    NULL,                       /* set creation index                   */
+    H5O__layout_debug           /* debug the message                    */
 }};
 
 
@@ -81,7 +86,7 @@ H5FL_DEFINE(H5O_layout_t);
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5O_layout_decode
+ * Function:    H5O__layout_decode
  *
  * Purpose:     Decode an data layout message and return a pointer to a
  *              new one created with malloc().
@@ -96,14 +101,15 @@ H5FL_DEFINE(H5O_layout_t);
  *-------------------------------------------------------------------------
  */
 static void *
-H5O_layout_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
+H5O__layout_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
     unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
 {
     H5O_layout_t           *mesg = NULL;
+    uint8_t                *heap_block = NULL;
     unsigned               u;
-    void                   *ret_value;          /* Return value */
+    void                   *ret_value = NULL;   /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* check args */
     HDassert(f);
@@ -112,13 +118,14 @@ H5O_layout_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *
     /* decode */
     if(NULL == (mesg = H5FL_CALLOC(H5O_layout_t)))
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+    mesg->storage.type = H5D_LAYOUT_ERROR;
 
     mesg->version = *p++;
-    if(mesg->version < H5O_LAYOUT_VERSION_1 || mesg->version > H5O_LAYOUT_VERSION_3)
+    if(mesg->version < H5O_LAYOUT_VERSION_1 || mesg->version > H5O_LAYOUT_VERSION_4)
         HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "bad version number for layout message")
 
     if(mesg->version < H5O_LAYOUT_VERSION_3) {
-        unsigned	ndims;			/* Num dimensions in chunk           */
+        unsigned    ndims;                      /* Num dimensions in chunk */
 
         /* Dimensionality */
         ndims = *p++;
@@ -129,6 +136,9 @@ H5O_layout_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *
         mesg->type = (H5D_layout_t)*p++;
         HDassert(H5D_CONTIGUOUS == mesg->type || H5D_CHUNKED == mesg->type || H5D_COMPACT == mesg->type);
 
+        /* Set the storage type */
+        mesg->storage.type = mesg->type;
+
         /* Reserved bytes */
         p += 5;
 
@@ -147,7 +157,7 @@ H5O_layout_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *
 
             /* Set the chunk operations */
             /* (Only "btree" indexing type currently supported in this version) */
-            mesg->storage.u.chunk.idx_type = H5D_CHUNK_BTREE;
+            mesg->storage.u.chunk.idx_type = H5D_CHUNK_IDX_BTREE;
             mesg->storage.u.chunk.ops = H5D_COPS_BTREE;
         } /* end if */
         else {
@@ -189,16 +199,21 @@ H5O_layout_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *
         } /* end if */
     } /* end if */
     else {
-        /* Layout class */
-        mesg->type = (H5D_layout_t)*p++;
+        /* Layout & storage class */
+        mesg->type = mesg->storage.type = (H5D_layout_t)*p++;
 
         /* Interpret the rest of the message according to the layout class */
         switch(mesg->type) {
             case H5D_COMPACT:
+                /* Compact data size */
                 UINT16DECODE(p, mesg->storage.u.compact.size);
+
                 if(mesg->storage.u.compact.size > 0) {
+                    /* Allocate space for compact data */
                     if(NULL == (mesg->storage.u.compact.buf = H5MM_malloc(mesg->storage.u.compact.size)))
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed for compact data buffer")
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "memory allocation failed for compact data buffer")
+
+                    /* Compact data */
                     HDmemcpy(mesg->storage.u.compact.buf, p, mesg->storage.u.compact.size);
                     p += mesg->storage.u.compact.size;
                 } /* end if */
@@ -208,7 +223,10 @@ H5O_layout_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *
                 break;
 
             case H5D_CONTIGUOUS:
+                /* Contiguous storage address */
                 H5F_addr_decode(f, &p, &(mesg->storage.u.contig.addr));
+
+                /* Contiguous storage size */
                 H5F_DECODE_LENGTH(f, p, mesg->storage.u.contig.size);
 
                 /* Set the layout operations */
@@ -216,29 +234,278 @@ H5O_layout_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *
                 break;
 
             case H5D_CHUNKED:
-                /* Dimensionality */
-                mesg->u.chunk.ndims = *p++;
-                if(mesg->u.chunk.ndims > H5O_LAYOUT_NDIMS)
-                    HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "dimensionality is too large")
-
-                /* B-tree address */
-                H5F_addr_decode(f, &p, &(mesg->storage.u.chunk.idx_addr));
-
-                /* Chunk dimensions */
-                for(u = 0; u < mesg->u.chunk.ndims; u++)
-                    UINT32DECODE(p, mesg->u.chunk.dim[u]);
+                if(mesg->version < H5O_LAYOUT_VERSION_4) {
+                    /* Set the chunked layout flags */
+                    mesg->u.chunk.flags = (uint8_t)0;
+
+                    /* Dimensionality */
+                    mesg->u.chunk.ndims = *p++;
+                    if(mesg->u.chunk.ndims > H5O_LAYOUT_NDIMS)
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "dimensionality is too large")
+
+                    /* B-tree address */
+                    H5F_addr_decode(f, &p, &(mesg->storage.u.chunk.idx_addr));
+
+                    /* Chunk dimensions */
+                    for(u = 0; u < mesg->u.chunk.ndims; u++)
+                        UINT32DECODE(p, mesg->u.chunk.dim[u]);
+
+                    /* Compute chunk size */
+                    for(u = 1, mesg->u.chunk.size = mesg->u.chunk.dim[0]; u < mesg->u.chunk.ndims; u++)
+                        mesg->u.chunk.size *= mesg->u.chunk.dim[u];
+
+                    /* Set the chunk operations */
+                    /* (Only "btree" indexing type supported with v3 of message format) */
+                    mesg->storage.u.chunk.idx_type = H5D_CHUNK_IDX_BTREE;
+                    mesg->storage.u.chunk.ops = H5D_COPS_BTREE;
+                } /* end if */
+                else {
+                    /* Get the chunked layout flags */
+                    mesg->u.chunk.flags = *p++;
+
+                    /* Check for valid flags */
+                    /* (Currently issues an error for all non-zero values,
+                     *      until features are added for the flags)
+                     */
+                    if(mesg->u.chunk.flags & ~H5O_LAYOUT_ALL_CHUNK_FLAGS)
+                        HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "bad flag value for message")
+
+                    /* Dimensionality */
+                    mesg->u.chunk.ndims = *p++;
+                    if(mesg->u.chunk.ndims > H5O_LAYOUT_NDIMS)
+                        HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "dimensionality is too large")
+
+                    /* Encoded # of bytes for each chunk dimension */
+                    mesg->u.chunk.enc_bytes_per_dim = *p++;
+                    if(mesg->u.chunk.enc_bytes_per_dim == 0 || mesg->u.chunk.enc_bytes_per_dim > 8)
+                        HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "encoded chunk dimension size is too large")
+
+                    /* Chunk dimensions */
+                    for(u = 0; u < mesg->u.chunk.ndims; u++)
+                        UINT64DECODE_VAR(p, mesg->u.chunk.dim[u], mesg->u.chunk.enc_bytes_per_dim);
+
+                    /* Compute chunk size */
+                    for(u = 1, mesg->u.chunk.size = mesg->u.chunk.dim[0]; u < mesg->u.chunk.ndims; u++)
+                        mesg->u.chunk.size *= mesg->u.chunk.dim[u];
+
+                    /* Chunk index type */
+                    mesg->u.chunk.idx_type = (H5D_chunk_index_t)*p++;
+                    if(mesg->u.chunk.idx_type >= H5D_CHUNK_IDX_NTYPES)
+                        HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "unknown chunk index type")
+                    mesg->storage.u.chunk.idx_type = mesg->u.chunk.idx_type;
+
+                    switch(mesg->u.chunk.idx_type) {
+                        case H5D_CHUNK_IDX_BTREE:
+                            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "v1 B-tree index type should never be in a v4 layout message")
+                            break;
+
+                        case H5D_CHUNK_IDX_NONE:       /* Implicit Index */
+                            mesg->storage.u.chunk.ops = H5D_COPS_NONE;
+                            break;
+
+                        case H5D_CHUNK_IDX_SINGLE:     /* Single Chunk Index */
+                            if(mesg->u.chunk.flags & H5O_LAYOUT_CHUNK_SINGLE_INDEX_WITH_FILTER) {
+                                H5F_DECODE_LENGTH(f, p, mesg->storage.u.chunk.u.single.nbytes);
+                                UINT32DECODE(p, mesg->storage.u.chunk.u.single.filter_mask);
+                            } /* end if */
+
+                            /* Set the chunk operations */
+                            mesg->storage.u.chunk.ops = H5D_COPS_SINGLE;
+                            break;
+
+                        case H5D_CHUNK_IDX_FARRAY:
+                            /* Fixed array creation parameters */
+                            mesg->u.chunk.u.farray.cparam.max_dblk_page_nelmts_bits = *p++;
+                            if(0 == mesg->u.chunk.u.farray.cparam.max_dblk_page_nelmts_bits)
+                                HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "invalid fixed array creation parameter")
+
+                            /* Set the chunk operations */
+                            mesg->storage.u.chunk.ops = H5D_COPS_FARRAY;
+                            break;
+
+                        case H5D_CHUNK_IDX_EARRAY:
+                            /* Extensible array creation parameters */
+                            mesg->u.chunk.u.earray.cparam.max_nelmts_bits = *p++;
+                            if(0 == mesg->u.chunk.u.earray.cparam.max_nelmts_bits)
+                                HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "invalid extensible array creation parameter")
+                            mesg->u.chunk.u.earray.cparam.idx_blk_elmts = *p++;
+                            if(0 == mesg->u.chunk.u.earray.cparam.idx_blk_elmts)
+                                HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "invalid extensible array creation parameter")
+                            mesg->u.chunk.u.earray.cparam.sup_blk_min_data_ptrs = *p++;
+                            if(0 == mesg->u.chunk.u.earray.cparam.sup_blk_min_data_ptrs)
+                                HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "invalid extensible array creation parameter")
+                            mesg->u.chunk.u.earray.cparam.data_blk_min_elmts = *p++;
+                            if(0 == mesg->u.chunk.u.earray.cparam.data_blk_min_elmts)
+                                HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "invalid extensible array creation parameter")
+                            mesg->u.chunk.u.earray.cparam.max_dblk_page_nelmts_bits = *p++;
+                            if(0 == mesg->u.chunk.u.earray.cparam.max_dblk_page_nelmts_bits)
+                                HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "invalid extensible array creation parameter")
+
+                            /* Set the chunk operations */
+                            mesg->storage.u.chunk.ops = H5D_COPS_EARRAY;
+                            break;
+
+                        case H5D_CHUNK_IDX_BT2:       /* v2 B-tree index */
+                            UINT32DECODE(p, mesg->u.chunk.u.btree2.cparam.node_size);
+                            mesg->u.chunk.u.btree2.cparam.split_percent = *p++;
+                            mesg->u.chunk.u.btree2.cparam.merge_percent = *p++;
+
+                            /* Set the chunk operations */
+                            mesg->storage.u.chunk.ops = H5D_COPS_BT2;
+                            break;
+
+                        case H5D_CHUNK_IDX_NTYPES:
+                        default:
+                            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "Invalid chunk index type")
+                    } /* end switch */
+
+                    /* Chunk index address */
+                    H5F_addr_decode(f, &p, &(mesg->storage.u.chunk.idx_addr));
+                } /* end else */
 
-                /* Compute chunk size */
-                for(u = 1, mesg->u.chunk.size = mesg->u.chunk.dim[0]; u < mesg->u.chunk.ndims; u++)
-                    mesg->u.chunk.size *= mesg->u.chunk.dim[u];
+                /* Set the layout operations */
+                mesg->ops = H5D_LOPS_CHUNK;
+                break;
 
-                /* Set the chunk operations */
-                /* (Only "btree" indexing type supported with v3 of message format) */
-                mesg->storage.u.chunk.idx_type = H5D_CHUNK_BTREE;
-                mesg->storage.u.chunk.ops = H5D_COPS_BTREE;
+            case H5D_VIRTUAL:
+                /* Check version */
+                if(mesg->version < H5O_LAYOUT_VERSION_4)
+                    HGOTO_ERROR(H5E_OHDR, H5E_VERSION, NULL, "invalid layout version with virtual layout")
+                
+                /* Heap information */
+                H5F_addr_decode(f, &p, &(mesg->storage.u.virt.serial_list_hobjid.addr));
+                UINT32DECODE(p, mesg->storage.u.virt.serial_list_hobjid.idx);
+
+                /* Initialize other fields */
+                mesg->storage.u.virt.list_nused = 0;
+                mesg->storage.u.virt.list = NULL;
+                mesg->storage.u.virt.list_nalloc = 0;
+                mesg->storage.u.virt.view = H5D_VDS_ERROR;
+                mesg->storage.u.virt.printf_gap = HSIZE_UNDEF;
+                mesg->storage.u.virt.source_fapl = -1;
+                mesg->storage.u.virt.source_dapl = -1;
+                mesg->storage.u.virt.init = FALSE;
+
+                /* Decode heap block if it exists */
+                if(mesg->storage.u.virt.serial_list_hobjid.addr != HADDR_UNDEF) {
+                    const uint8_t *heap_block_p;
+                    uint8_t heap_vers;
+                    size_t block_size = 0;
+                    size_t tmp_size;
+                    hsize_t tmp_hsize;
+                    uint32_t stored_chksum;
+                    uint32_t computed_chksum;
+                    size_t i;
+
+                    /* Read heap */
+                    if(NULL == (heap_block = (uint8_t *)H5HG_read(f, dxpl_id, &(mesg->storage.u.virt.serial_list_hobjid), NULL, &block_size)))
+                        HGOTO_ERROR(H5E_OHDR, H5E_READERROR, NULL, "Unable to read global heap block")
+
+                    heap_block_p = (const uint8_t *)heap_block;
+
+                    /* Decode the version number of the heap block encoding */
+                    heap_vers = (uint8_t)*heap_block_p++;
+                    if((uint8_t)H5O_LAYOUT_VDS_GH_ENC_VERS != heap_vers)
+                        HGOTO_ERROR(H5E_OHDR, H5E_VERSION, NULL, "bad version # of encoded VDS heap information, expected %u, got %u", (unsigned)H5O_LAYOUT_VDS_GH_ENC_VERS, (unsigned)heap_vers)
+
+                    /* Number of entries */
+                    H5F_DECODE_LENGTH(f, heap_block_p, tmp_hsize)
+
+                    /* Allocate entry list */
+                    if(NULL == (mesg->storage.u.virt.list = (H5O_storage_virtual_ent_t *)H5MM_calloc((size_t)tmp_hsize * sizeof(H5O_storage_virtual_ent_t))))
+                        HGOTO_ERROR(H5E_OHDR, H5E_RESOURCE, NULL, "unable to allocate heap block")
+                    mesg->storage.u.virt.list_nalloc = (size_t)tmp_hsize;
+                    mesg->storage.u.virt.list_nused = (size_t)tmp_hsize;
+
+                    /* Decode each entry */
+                    for(i = 0; i < mesg->storage.u.virt.list_nused; i++) {
+                        /* Source file name */
+                        tmp_size = HDstrlen((const char *)heap_block_p) + 1;
+                        if(NULL == (mesg->storage.u.virt.list[i].source_file_name = (char *)H5MM_malloc(tmp_size)))
+                            HGOTO_ERROR(H5E_OHDR, H5E_RESOURCE, NULL, "unable to allocate memory for source file name")
+                        (void)HDmemcpy(mesg->storage.u.virt.list[i].source_file_name, heap_block_p, tmp_size);
+                        heap_block_p += tmp_size;
+
+                        /* Source dataset name */
+                        tmp_size = HDstrlen((const char *)heap_block_p) + 1;
+                        if(NULL == (mesg->storage.u.virt.list[i].source_dset_name = (char *)H5MM_malloc(tmp_size)))
+                            HGOTO_ERROR(H5E_OHDR, H5E_RESOURCE, NULL, "unable to allocate memory for source dataset name")
+                        (void)HDmemcpy(mesg->storage.u.virt.list[i].source_dset_name, heap_block_p, tmp_size);
+                        heap_block_p += tmp_size;
+
+                        /* Source selection */
+                        if(H5S_SELECT_DESERIALIZE(&mesg->storage.u.virt.list[i].source_select, &heap_block_p) < 0)
+                            HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, NULL, "can't decode source space selection")
+
+                        /* Virtual selection */
+                        if(H5S_SELECT_DESERIALIZE(&mesg->storage.u.virt.list[i].source_dset.virtual_select, &heap_block_p) < 0)
+                            HGOTO_ERROR(H5E_OHDR, H5E_CANTDECODE, NULL, "can't decode virtual space selection")
+
+                        /* Parse source file and dataset names for "printf"
+                         * style format specifiers */
+                        if(H5D_virtual_parse_source_name(mesg->storage.u.virt.list[i].source_file_name, &mesg->storage.u.virt.list[i].parsed_source_file_name, &mesg->storage.u.virt.list[i].psfn_static_strlen, &mesg->storage.u.virt.list[i].psfn_nsubs) < 0)
+                            HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "can't parse source file name")
+                        if(H5D_virtual_parse_source_name(mesg->storage.u.virt.list[i].source_dset_name, &mesg->storage.u.virt.list[i].parsed_source_dset_name, &mesg->storage.u.virt.list[i].psdn_static_strlen, &mesg->storage.u.virt.list[i].psdn_nsubs) < 0)
+                            HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "can't parse source dataset name")
+
+                        /* Set source names in source_dset struct */
+                        if((mesg->storage.u.virt.list[i].psfn_nsubs == 0)
+                                && (mesg->storage.u.virt.list[i].psdn_nsubs == 0)) {
+                            if(mesg->storage.u.virt.list[i].parsed_source_file_name)
+                                mesg->storage.u.virt.list[i].source_dset.file_name = mesg->storage.u.virt.list[i].parsed_source_file_name->name_segment;
+                            else
+                                mesg->storage.u.virt.list[i].source_dset.file_name = mesg->storage.u.virt.list[i].source_file_name;
+                            if(mesg->storage.u.virt.list[i].parsed_source_dset_name)
+                                mesg->storage.u.virt.list[i].source_dset.dset_name = mesg->storage.u.virt.list[i].parsed_source_dset_name->name_segment;
+                            else
+                                mesg->storage.u.virt.list[i].source_dset.dset_name = mesg->storage.u.virt.list[i].source_dset_name;
+                        } /* end if */
+
+                        /* unlim_dim fields */
+                        mesg->storage.u.virt.list[i].unlim_dim_source = H5S_get_select_unlim_dim(mesg->storage.u.virt.list[i].source_select);
+                        mesg->storage.u.virt.list[i].unlim_dim_virtual = H5S_get_select_unlim_dim(mesg->storage.u.virt.list[i].source_dset.virtual_select);
+                        mesg->storage.u.virt.list[i].unlim_extent_source = HSIZE_UNDEF;
+                        mesg->storage.u.virt.list[i].unlim_extent_virtual = HSIZE_UNDEF;
+                        mesg->storage.u.virt.list[i].clip_size_source = HSIZE_UNDEF;
+                        mesg->storage.u.virt.list[i].clip_size_virtual = HSIZE_UNDEF;
+
+                        /* Clipped selections */
+                        if(mesg->storage.u.virt.list[i].unlim_dim_virtual < 0) {
+                            mesg->storage.u.virt.list[i].source_dset.clipped_source_select = mesg->storage.u.virt.list[i].source_select;
+                            mesg->storage.u.virt.list[i].source_dset.clipped_virtual_select = mesg->storage.u.virt.list[i].source_dset.virtual_select;
+                        } /* end if */
+
+                        /* Check mapping for validity (do both pre and post
+                         * checks here, since we had to allocate the entry list
+                         * before decoding the selections anyways) */
+                        if(H5D_virtual_check_mapping_pre(mesg->storage.u.virt.list[i].source_dset.virtual_select, mesg->storage.u.virt.list[i].source_select, H5O_VIRTUAL_STATUS_INVALID) < 0)
+                            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "invalid mapping selections")
+                         if(H5D_virtual_check_mapping_post(&mesg->storage.u.virt.list[i]) < 0)
+                            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid mapping entry")
+
+                        /* Update min_dims */
+                        if(H5D_virtual_update_min_dims(mesg, i) < 0)
+                            HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to update virtual dataset minimum dimensions")
+                    } /* end for */
+
+                    /* Read stored checksum */
+                    UINT32DECODE(heap_block_p, stored_chksum)
+
+                    /* Compute checksum */
+                    computed_chksum = H5_checksum_metadata(heap_block, block_size - (size_t)4, 0);
+
+                    /* Verify checksum */
+                    if(stored_chksum != computed_chksum)
+                        HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "incorrect metadata checksum for global heap block")
+
+                    /* Verify that the heap block size is correct */
+                    if((size_t)(heap_block_p - heap_block) != block_size)
+                        HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "incorrect heap block size")
+                } /* end if */
 
                 /* Set the layout operations */
-                mesg->ops = H5D_LOPS_CHUNK;
+                mesg->ops = H5D_LOPS_VIRTUAL;
+
                 break;
 
             case H5D_LAYOUT_ERROR:
@@ -253,15 +520,21 @@ H5O_layout_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *
 
 done:
     if(ret_value == NULL)
-        if(mesg)
+        if(mesg) {
+            if(mesg->type == H5D_VIRTUAL)
+                if(H5D__virtual_reset_layout(mesg) < 0)
+                    HDONE_ERROR(H5E_OHDR, H5E_CANTFREE, NULL, "unable to reset virtual layout")
             mesg = H5FL_FREE(H5O_layout_t, mesg);
+        } /* end if */
+
+    heap_block = (uint8_t *)H5MM_xfree(heap_block);
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_layout_decode() */
+} /* end H5O__layout_decode() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5O_layout_encode
+ * Function:    H5O__layout_encode
  *
  * Purpose:     Encodes a message.
  *
@@ -274,30 +547,18 @@ done:
  *      Quincey Koziol, 2004-5-21
  *      We write out version 3 messages by default now.
  *
- * Modifications:
- * 	Robb Matzke, 1998-07-20
- *	Rearranged the message to add a version number at the beginning.
- *
- *	Raymond Lu, 2002-2-26
- *	Added version number 2 case depends on if space has been allocated
- *	at the moment when layout header message is updated.
- *
- *      Quincey Koziol, 2004-5-21
- *      Added version number 3 case to straighten out problems with contiguous
- *      layout's sizes (was encoding them as 4-byte values when they were
- *      really n-byte values (where n usually is 8)) and additionally clean up
- *      the information written out.
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_layout_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
+H5O__layout_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, const void *_mesg)
 {
     const H5O_layout_t     *mesg = (const H5O_layout_t *) _mesg;
+    uint8_t                *heap_block = NULL;
+    size_t                  *str_size = NULL;
     unsigned               u;
     herr_t ret_value = SUCCEED;   /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* check args */
     HDassert(f);
@@ -305,7 +566,8 @@ H5O_layout_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, c
     HDassert(p);
 
     /* Message version */
-    *p++ = (uint8_t)H5O_LAYOUT_VERSION_3;
+    *p++ = (uint8_t)((mesg->version < H5O_LAYOUT_VERSION_3) ?
+             H5O_LAYOUT_VERSION_3 : mesg->version);
 
     /* Layout class */
     *p++ = mesg->type;
@@ -327,21 +589,196 @@ H5O_layout_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, c
             break;
 
         case H5D_CONTIGUOUS:
+            /* Contiguous storage address */
             H5F_addr_encode(f, &p, mesg->storage.u.contig.addr);
+
+            /* Contiguous storage size */
             H5F_ENCODE_LENGTH(f, p, mesg->storage.u.contig.size);
             break;
 
         case H5D_CHUNKED:
-            /* Number of dimensions */
-            HDassert(mesg->u.chunk.ndims > 0 && mesg->u.chunk.ndims <= H5O_LAYOUT_NDIMS);
-            *p++ = (uint8_t)mesg->u.chunk.ndims;
+            if(mesg->version < H5O_LAYOUT_VERSION_4) {
+                /* Number of dimensions */
+                HDassert(mesg->u.chunk.ndims > 0 && mesg->u.chunk.ndims <= H5O_LAYOUT_NDIMS);
+                *p++ = (uint8_t)mesg->u.chunk.ndims;
+
+                /* B-tree address */
+                H5F_addr_encode(f, &p, mesg->storage.u.chunk.idx_addr);
+
+                /* Dimension sizes */
+                for(u = 0; u < mesg->u.chunk.ndims; u++)
+                    UINT32ENCODE(p, mesg->u.chunk.dim[u]);
+            } /* end if */
+            else {
+                /* Chunk feature flags */
+                *p++ = mesg->u.chunk.flags;
+
+                /* Number of dimensions */
+                HDassert(mesg->u.chunk.ndims > 0 && mesg->u.chunk.ndims <= H5O_LAYOUT_NDIMS);
+                *p++ = (uint8_t)mesg->u.chunk.ndims;
+
+                /* Encoded # of bytes for each chunk dimension */
+                HDassert(mesg->u.chunk.enc_bytes_per_dim > 0 && mesg->u.chunk.enc_bytes_per_dim <= 8);
+                *p++ = (uint8_t)mesg->u.chunk.enc_bytes_per_dim;
+
+                /* Dimension sizes */
+                for(u = 0; u < mesg->u.chunk.ndims; u++)
+                    UINT64ENCODE_VAR(p, mesg->u.chunk.dim[u], mesg->u.chunk.enc_bytes_per_dim);
+
+                /* Chunk index type */
+                *p++ = (uint8_t)mesg->u.chunk.idx_type;
+
+                switch(mesg->u.chunk.idx_type) {
+                    case H5D_CHUNK_IDX_BTREE:
+                        HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "v1 B-tree index type should never be in a v4 layout message")
+                        break;
+
+                    case H5D_CHUNK_IDX_NONE:       /* Implicit */
+                        break;
+
+                    case H5D_CHUNK_IDX_SINGLE:     /* Single Chunk */
+                        /* Filter information */
+                        if(mesg->u.chunk.flags & H5O_LAYOUT_CHUNK_SINGLE_INDEX_WITH_FILTER) {
+                            H5F_ENCODE_LENGTH(f, p, mesg->storage.u.chunk.u.single.nbytes);
+                            UINT32ENCODE(p, mesg->storage.u.chunk.u.single.filter_mask);
+                        } /* end if */
+                        break;
+
+                    case H5D_CHUNK_IDX_FARRAY:
+                        /* Fixed array creation parameters */
+                        *p++ = mesg->u.chunk.u.farray.cparam.max_dblk_page_nelmts_bits;
+                        break;
+
+                    case H5D_CHUNK_IDX_EARRAY:
+                        /* Extensible array creation parameters */
+                        *p++ = mesg->u.chunk.u.earray.cparam.max_nelmts_bits;
+                        *p++ = mesg->u.chunk.u.earray.cparam.idx_blk_elmts;
+                        *p++ = mesg->u.chunk.u.earray.cparam.sup_blk_min_data_ptrs;
+                        *p++ = mesg->u.chunk.u.earray.cparam.data_blk_min_elmts;
+                        *p++ = mesg->u.chunk.u.earray.cparam.max_dblk_page_nelmts_bits;
+                        break;
+
+                    case H5D_CHUNK_IDX_BT2:       /* v2 B-tree index */
+                        UINT32ENCODE(p, mesg->u.chunk.u.btree2.cparam.node_size);
+                        *p++ = mesg->u.chunk.u.btree2.cparam.split_percent;
+                        *p++ = mesg->u.chunk.u.btree2.cparam.merge_percent;
+                        break;
+
+                    case H5D_CHUNK_IDX_NTYPES:
+                    default:
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, FAIL, "Invalid chunk index type")
+                } /* end switch */
+
+                /*
+                 * Implicit index: Address of the chunks
+                 * Single chunk index: address of the single chunk
+                 * Other indexes: chunk index address
+                 */
+                H5F_addr_encode(f, &p, mesg->storage.u.chunk.idx_addr);
+            } /* end else */
+            break;
+
+        case H5D_VIRTUAL:
+            /* Create heap block if it has not been created yet */
+            /* Note that we assume here that the contents of the heap block
+             * cannot change!  If this ever stops being the case we must change
+             * this code to allow overwrites of the heap block.  -NAF */
+            if((mesg->storage.u.virt.serial_list_hobjid.addr == HADDR_UNDEF)
+                    && (mesg->storage.u.virt.list_nused > 0)) {
+                uint8_t *heap_block_p;
+                size_t block_size;
+                hssize_t select_serial_size;
+                hsize_t tmp_hsize;
+                uint32_t chksum;
+                size_t i;
+
+                /* Allocate array for caching results of strlen */
+                if(NULL == (str_size = (size_t *)H5MM_malloc(2 * mesg->storage.u.virt.list_nused *sizeof(size_t))))
+                    HGOTO_ERROR(H5E_OHDR, H5E_RESOURCE, FAIL, "unable to allocate string length array")
+
+                /*
+                 * Calculate heap block size
+                 */
+                /* Version and number of entries */
+                block_size = (size_t)1 + H5F_SIZEOF_SIZE(f);
+
+                /* Calculate size of each entry */
+                for(i = 0; i < mesg->storage.u.virt.list_nused; i++) {
+                    HDassert(mesg->storage.u.virt.list[i].source_file_name);
+                    HDassert(mesg->storage.u.virt.list[i].source_dset_name);
+                    HDassert(mesg->storage.u.virt.list[i].source_select);
+                    HDassert(mesg->storage.u.virt.list[i].source_dset.virtual_select);
+
+                    /* Source file name */
+                    str_size[2 * i] = HDstrlen(mesg->storage.u.virt.list[i].source_file_name) + (size_t)1;
+                    block_size += str_size[2 * i];
+
+                    /* Source dset name */
+                    str_size[(2 * i) + 1] = HDstrlen(mesg->storage.u.virt.list[i].source_dset_name) + (size_t)1;
+                    block_size += str_size[(2 * i) + 1];
+
+                    /* Source selection */
+                    if((select_serial_size = H5S_SELECT_SERIAL_SIZE(mesg->storage.u.virt.list[i].source_select)) < 0)
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, FAIL, "unable to check dataspace selection size")
+                    block_size += (size_t)select_serial_size;
+
+                    /* Virtual dataset selection */
+                    if((select_serial_size = H5S_SELECT_SERIAL_SIZE(mesg->storage.u.virt.list[i].source_dset.virtual_select)) < 0)
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, FAIL, "unable to check dataspace selection size")
+                    block_size += (size_t)select_serial_size;
+                } /* end for */
+
+                /* Checksum */
+                block_size += 4;
+
+                /* Allocate heap block */
+                if(NULL == (heap_block = (uint8_t *)H5MM_malloc(block_size)))
+                    HGOTO_ERROR(H5E_OHDR, H5E_RESOURCE, FAIL, "unable to allocate heap block")
+
+                /*
+                 * Encode heap block
+                 */
+                heap_block_p = heap_block;
+
+                /* Encode heap block encoding version */
+                *heap_block_p++ = (uint8_t)H5O_LAYOUT_VDS_GH_ENC_VERS;
+
+                /* Number of entries */
+                tmp_hsize = (hsize_t)mesg->storage.u.virt.list_nused;
+                H5F_ENCODE_LENGTH(f, heap_block_p, tmp_hsize)
+
+                /* Encode each entry */
+                for(i = 0; i < mesg->storage.u.virt.list_nused; i++) {
+                    /* Source file name */
+                    (void)HDmemcpy((char *)heap_block_p, mesg->storage.u.virt.list[i].source_file_name, str_size[2 * i]);
+                    heap_block_p += str_size[2 * i];
+
+                    /* Source dataset name */
+                    (void)HDmemcpy((char *)heap_block_p, mesg->storage.u.virt.list[i].source_dset_name, str_size[(2 * i) + 1]);
+                    heap_block_p += str_size[(2 * i) + 1];
+
+                    /* Source selection */
+                    if(H5S_SELECT_SERIALIZE(mesg->storage.u.virt.list[i].source_select, &heap_block_p) < 0)
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to serialize source selection")
+
+                    /* Virtual selection */
+                    if(H5S_SELECT_SERIALIZE(mesg->storage.u.virt.list[i].source_dset.virtual_select, &heap_block_p) < 0)
+                        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to serialize virtual selection")
+                } /* end for */
+
+                /* Checksum */
+                chksum = H5_checksum_metadata(heap_block, block_size - (size_t)4, 0);
+                UINT32ENCODE(heap_block_p, chksum)
+
+                /* Insert block into global heap */
+                if(H5HG_insert(f, H5AC_ind_dxpl_id, block_size, heap_block, &((H5O_layout_t *)mesg)->storage.u.virt.serial_list_hobjid) < 0) /* Casting away const OK  --NAF */
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "unable to insert virtual dataset heap block")
+            } /* end if */
 
-            /* B-tree address */
-            H5F_addr_encode(f, &p, mesg->storage.u.chunk.idx_addr);
+            /* Heap information */
+            H5F_addr_encode(f, &p, mesg->storage.u.virt.serial_list_hobjid.addr);
+            UINT32ENCODE(p, mesg->storage.u.virt.serial_list_hobjid.idx);
 
-            /* Dimension sizes */
-            for(u = 0; u < mesg->u.chunk.ndims; u++)
-                UINT32ENCODE(p, mesg->u.chunk.dim[u]);
             break;
 
         case H5D_LAYOUT_ERROR:
@@ -351,12 +788,15 @@ H5O_layout_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, c
     } /* end switch */
 
 done:
+    heap_block = (uint8_t *)H5MM_xfree(heap_block);
+    str_size = (size_t *)H5MM_xfree(str_size);
+
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_layout_encode() */
+} /* end H5O__layout_encode() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5O_layout_copy
+ * Function:    H5O__layout_copy
  *
  * Purpose:     Copies a message from _MESG to _DEST, allocating _DEST if
  *              necessary.
@@ -371,13 +811,13 @@ done:
  *-------------------------------------------------------------------------
  */
 static void *
-H5O_layout_copy(const void *_mesg, void *_dest)
+H5O__layout_copy(const void *_mesg, void *_dest)
 {
     const H5O_layout_t     *mesg = (const H5O_layout_t *) _mesg;
     H5O_layout_t           *dest = (H5O_layout_t *) _dest;
-    void                   *ret_value;          /* Return value */
+    void                   *ret_value = NULL;   /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* check args */
     HDassert(mesg);
@@ -389,19 +829,45 @@ H5O_layout_copy(const void *_mesg, void *_dest)
     /* copy */
     *dest = *mesg;
 
-    /* Deep copy the buffer for compact datasets also */
-    if(mesg->type == H5D_COMPACT && mesg->storage.u.compact.size > 0) {
-        /* Allocate memory for the raw data */
-        if(NULL == (dest->storage.u.compact.buf = H5MM_malloc(dest->storage.u.compact.size)))
-            HGOTO_ERROR(H5E_OHDR, H5E_NOSPACE, NULL, "unable to allocate memory for compact dataset")
+    /* Special actions for each type of layout */
+    switch(mesg->type) {
+        case H5D_COMPACT:
+            /* Deep copy the buffer for compact datasets also */
+            if(mesg->storage.u.compact.size > 0) {
+                /* Sanity check */
+                HDassert(mesg->storage.u.compact.buf);
+
+                /* Allocate memory for the raw data */
+                if(NULL == (dest->storage.u.compact.buf = H5MM_malloc(dest->storage.u.compact.size)))
+                    HGOTO_ERROR(H5E_OHDR, H5E_NOSPACE, NULL, "unable to allocate memory for compact dataset")
 
-        /* Copy over the raw data */
-        HDmemcpy(dest->storage.u.compact.buf, mesg->storage.u.compact.buf, dest->storage.u.compact.size);
-    } /* end if */
+                /* Copy over the raw data */
+                HDmemcpy(dest->storage.u.compact.buf, mesg->storage.u.compact.buf, dest->storage.u.compact.size);
+            } /* end if */
+            else
+                HDassert(dest->storage.u.compact.buf == NULL);
+            break;
 
-    /* Reset the pointer of the chunked storage index but not the address */
-    if(dest->type == H5D_CHUNKED && dest->storage.u.chunk.ops)
-	H5D_chunk_idx_reset(&dest->storage.u.chunk, FALSE);
+        case H5D_CONTIGUOUS:
+            /* Nothing required */
+            break;
+
+        case H5D_CHUNKED:
+            /* Reset the pointer of the chunked storage index but not the address */
+            if(dest->storage.u.chunk.ops)
+                H5D_chunk_idx_reset(&dest->storage.u.chunk, FALSE);
+            break;
+
+        case H5D_VIRTUAL:
+            if(H5D__virtual_copy_layout(dest) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy virtual layout")
+            break;
+
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+        default:
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTENCODE, NULL, "Invalid layout class")
+    } /* end switch */
 
     /* Set return value */
     ret_value = dest;
@@ -412,11 +878,11 @@ done:
             dest = H5FL_FREE(H5O_layout_t, dest);
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_layout_copy() */
+} /* end H5O__layout_copy() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5O_layout_size
+ * Function:    H5O__layout_size
  *
  * Purpose:     Returns the size of the raw message in bytes.  If it's
  *              compact dataset, the data part is also included.
@@ -432,12 +898,12 @@ done:
  *-------------------------------------------------------------------------
  */
 static size_t
-H5O_layout_size(const H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, const void *_mesg)
+H5O__layout_size(const H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, const void *_mesg)
 {
     const H5O_layout_t     *mesg = (const H5O_layout_t *) _mesg;
-    size_t                  ret_value;
+    size_t                  ret_value = 0;      /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* check args */
     HDassert(f);
@@ -448,44 +914,51 @@ H5O_layout_size(const H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, const voi
     ret_value = H5D__layout_meta_size(f, mesg, TRUE);
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_layout_size() */
+} /* end H5O__layout_size() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_layout_reset
+ * Function:    H5O__layout_reset
  *
- * Purpose:	Frees resources within a data type message, but doesn't free
- *		the message itself.
+ * Purpose:     Frees resources within a data type message, but doesn't free
+ *              the message itself.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Non-negative on success/Negative on failure
  *
- * Programmer:	Quincey Koziol
+ * Programmer:  Quincey Koziol
  *              Friday, September 13, 2002
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_layout_reset(void *_mesg)
+H5O__layout_reset(void *_mesg)
 {
     H5O_layout_t     *mesg = (H5O_layout_t *)_mesg;
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC
 
     if(mesg) {
         /* Free the compact storage buffer */
         if(H5D_COMPACT == mesg->type)
             mesg->storage.u.compact.buf = H5MM_xfree(mesg->storage.u.compact.buf);
+        else if(H5D_VIRTUAL == mesg->type)
+            /* Free the virtual entry list */
+            if(H5D__virtual_reset_layout(mesg) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to reset virtual layout")
 
         /* Reset the message */
         mesg->type = H5D_CONTIGUOUS;
+        mesg->version = H5O_LAYOUT_VERSION_DEFAULT;
     } /* end if */
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5O_layout_reset() */
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__layout_reset() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_layout_free
+ * Function:	H5O__layout_free
  *
  * Purpose:	Free's the message
  *
@@ -497,28 +970,25 @@ H5O_layout_reset(void *_mesg)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_layout_free(void *_mesg)
+H5O__layout_free(void *_mesg)
 {
     H5O_layout_t     *mesg = (H5O_layout_t *) _mesg;
-    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR
 
     HDassert(mesg);
 
     /* Free resources within the message */
-    if(H5O_layout_reset(mesg) < 0)
-        HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free message resources")
+    H5O__layout_reset(mesg);
 
-    mesg = H5FL_FREE(H5O_layout_t, mesg);
+    (void)H5FL_FREE(H5O_layout_t, mesg);
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_layout_free() */
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O__layout_free() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5O_layout_delete
+ * Function:    H5O__layout_delete
  *
  * Purpose:     Free file space referenced by message
  *
@@ -530,12 +1000,12 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_layout_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, void *_mesg)
+H5O__layout_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, void *_mesg)
 {
     H5O_layout_t *mesg = (H5O_layout_t *) _mesg;
     herr_t ret_value = SUCCEED;   /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* check args */
     HDassert(f);
@@ -560,6 +1030,12 @@ H5O_layout_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, void *_mesg)
                 HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free raw data")
             break;
 
+        case H5D_VIRTUAL:       /* Virtual dataset */
+            /* Free the file space virtual dataset */
+            if(H5D__virtual_delete(f, dxpl_id, &mesg->storage) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to free raw data")
+            break;
+
         case H5D_LAYOUT_ERROR:
         case H5D_NLAYOUTS:
         default:
@@ -568,11 +1044,11 @@ H5O_layout_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, void *_mesg)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_layout_delete() */
+} /* end H5O__layout_delete() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5O_layout_copy_file
+ * Function:    H5O__layout_copy_file
  *
  * Purpose:     Copies a message from _MESG to _DEST in file
  *
@@ -586,39 +1062,36 @@ done:
  *-------------------------------------------------------------------------
  */
 static void *
-H5O_layout_copy_file(H5F_t *file_src, void *mesg_src, H5F_t *file_dst,
+H5O__layout_copy_file(H5F_t *file_src, void *mesg_src, H5F_t *file_dst,
     hbool_t H5_ATTR_UNUSED *recompute_size, unsigned H5_ATTR_UNUSED *mesg_flags,
     H5O_copy_t *cpy_info, void *_udata, hid_t dxpl_id)
 {
     H5D_copy_file_ud_t *udata = (H5D_copy_file_ud_t *)_udata;   /* Dataset copying user data */
     H5O_layout_t       *layout_src = (H5O_layout_t *) mesg_src;
     H5O_layout_t       *layout_dst = NULL;
-    hbool_t             copied = FALSE;                         /* Whether the data was copied */
-    void               *ret_value;                              /* Return value */
+    hbool_t             copied = FALSE;         /* Whether the data was copied */
+    void               *ret_value = NULL;       /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* check args */
     HDassert(file_src);
     HDassert(layout_src);
     HDassert(file_dst);
 
-    /* Allocate space for the destination layout */
-    if(NULL == (layout_dst = H5FL_MALLOC(H5O_layout_t)))
-        HGOTO_ERROR(H5E_OHDR, H5E_CANTALLOC, NULL, "memory allocation failed")
-
-    /* Copy the "top level" information */
-    *layout_dst = *layout_src;
+    /* Copy the layout information */
+    if(NULL == (layout_dst = (H5O_layout_t *)H5O__layout_copy(layout_src, NULL)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy layout")
 
     /* Copy the layout type specific information */
     switch(layout_src->type) {
         case H5D_COMPACT:
-	    if(layout_src->storage.u.compact.buf) {
+            if(layout_src->storage.u.compact.buf) {
                 /* copy compact raw data */
                 if(H5D__compact_copy(file_src, &layout_src->storage.u.compact, file_dst, &layout_dst->storage.u.compact, udata->src_dtype, cpy_info, dxpl_id) < 0)
                     HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy chunked storage")
                 copied = TRUE;
-	    } /* end if */
+            } /* end if */
             break;
 
         case H5D_CONTIGUOUS:
@@ -647,6 +1120,13 @@ H5O_layout_copy_file(H5F_t *file_src, void *mesg_src, H5F_t *file_dst,
             } /* end if */
             break;
 
+        case H5D_VIRTUAL:
+            /* Copy virtual layout.  Always copy so the memory fields get copied
+             * properly. */
+            if(H5D__virtual_copy(file_dst, layout_dst, dxpl_id) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, NULL, "unable to copy virtual storage")
+            break;
+
         case H5D_LAYOUT_ERROR:
         case H5D_NLAYOUTS:
         default:
@@ -666,11 +1146,11 @@ done:
 	    layout_dst = H5FL_FREE(H5O_layout_t, layout_dst);
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_layout_copy_file() */
+} /* end H5O__layout_copy_file() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5O_layout_debug
+ * Function:    H5O__layout_debug
  *
  * Purpose:     Prints debugging info for a message.
  *
@@ -682,13 +1162,13 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_layout_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg,
+H5O__layout_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg,
     FILE * stream, int indent, int fwidth)
 {
     const H5O_layout_t     *mesg = (const H5O_layout_t *) _mesg;
-    unsigned                    u;
+    size_t                  u;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* check args */
     HDassert(f);
@@ -709,24 +1189,53 @@ H5O_layout_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const vo
                       "Number of dimensions:",
                       (unsigned long)(mesg->u.chunk.ndims));
             HDfprintf(stream, "%*s%-*s {", indent, "", fwidth, "Size:");
-            for(u = 0; u < mesg->u.chunk.ndims; u++)
+            for(u = 0; u < (size_t)mesg->u.chunk.ndims; u++)
                 HDfprintf(stream, "%s%lu", u ? ", " : "", (unsigned long)(mesg->u.chunk.dim[u]));
             HDfprintf(stream, "}\n");
 
             /* Index information */
-            switch(mesg->storage.u.chunk.idx_type) {
-                case H5D_CHUNK_BTREE:
+            switch(mesg->u.chunk.idx_type) {
+                case H5D_CHUNK_IDX_BTREE:
                     HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
                               "Index Type:", "v1 B-tree");
-                    HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
-                              "B-tree address:", mesg->storage.u.chunk.idx_addr);
                     break;
 
+                case H5D_CHUNK_IDX_NONE:
+                    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                              "Index Type:", "Implicit");
+                    break;
+
+                case H5D_CHUNK_IDX_SINGLE:
+                    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                              "Index Type:", "Single Chunk");
+                    break;
+
+                case H5D_CHUNK_IDX_FARRAY:
+                    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                              "Index Type:", "Fixed Array");
+                    /* (Should print the fixed array creation parameters) */
+                    break;
+
+                case H5D_CHUNK_IDX_EARRAY:
+                    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                              "Index Type:", "Extensible Array");
+                    /* (Should print the extensible array creation parameters) */
+                    break;
+
+                case H5D_CHUNK_IDX_BT2:
+                    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                              "Index Type:", "v2 B-tree");
+                    /* (Should print the v2-Btree creation parameters) */
+                    break;
+
+                case H5D_CHUNK_IDX_NTYPES:
                 default:
                     HDfprintf(stream, "%*s%-*s %s (%u)\n", indent, "", fwidth,
-                              "Index Type:", "Unknown", (unsigned)mesg->storage.u.chunk.idx_type);
+                              "Index Type:", "Unknown", (unsigned)mesg->u.chunk.idx_type);
                     break;
             } /* end switch */
+            HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+                      "Index address:", mesg->storage.u.chunk.idx_addr);
             break;
 
         case H5D_CONTIGUOUS:
@@ -745,6 +1254,26 @@ H5O_layout_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const vo
                       "Data Size:", mesg->storage.u.compact.size);
             break;
 
+        case H5D_VIRTUAL:
+            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+                      "Type:", "Virtual");
+            HDfprintf(stream, "%*s%-*s %a\n", indent, "", fwidth,
+                      "Global heap address:", mesg->storage.u.virt.serial_list_hobjid.addr);
+            HDfprintf(stream, "%*s%-*s %Zu\n", indent, "", fwidth,
+                      "Global heap index:", mesg->storage.u.virt.serial_list_hobjid.idx);
+            for(u = 0; u < mesg->storage.u.virt.list_nused; u++) {
+                HDfprintf(stream, "%*sMapping %u:\n", indent, "", u);
+                HDfprintf(stream, "%*s%-*s %s\n", indent + 3, "", fwidth - 3,
+                      "Virtual selection:", "<Not yet implemented>");
+                HDfprintf(stream, "%*s%-*s %s\n", indent + 3, "", fwidth - 3,
+                      "Source file name:", mesg->storage.u.virt.list[u].source_file_name);
+                HDfprintf(stream, "%*s%-*s %s\n", indent + 3, "", fwidth - 3,
+                      "Source dataset name:", mesg->storage.u.virt.list[u].source_dset_name);
+                HDfprintf(stream, "%*s%-*s %s\n", indent + 3, "", fwidth - 3,
+                      "Source selection:", "<Not yet implemented>");
+            } /* end for */
+            break;
+
         case H5D_LAYOUT_ERROR:
         case H5D_NLAYOUTS:
         default:
@@ -754,5 +1283,5 @@ H5O_layout_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const vo
     } /* end switch */
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5O_layout_debug() */
+} /* end H5O__layout_debug() */
 
diff --git a/src/H5Olinfo.c b/src/H5Olinfo.c
index d9351b3..62e63d4 100644
--- a/src/H5Olinfo.c
+++ b/src/H5Olinfo.c
@@ -24,9 +24,10 @@
  *-------------------------------------------------------------------------
  */
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
-#define H5L_PACKAGE		/*suppress error about including H5Lpkg	  */
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#define H5G_FRIEND		/*suppress error about including H5Gpkg   */
+#define H5L_FRIEND		/*suppress error about including H5Lpkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
@@ -119,7 +120,7 @@ H5O_linfo_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *o
 {
     H5O_linfo_t	*linfo = NULL;  /* Link info */
     unsigned char index_flags;  /* Flags for encoding link index info */
-    void        *ret_value;     /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -249,7 +250,7 @@ H5O_linfo_copy(const void *_mesg, void *_dest)
 {
     const H5O_linfo_t   *linfo = (const H5O_linfo_t *)_mesg;
     H5O_linfo_t         *dest = (H5O_linfo_t *) _dest;
-    void                *ret_value;     /* Return value */
+    void                *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -289,7 +290,7 @@ static size_t
 H5O_linfo_size(const H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, const void *_mesg)
 {
     const H5O_linfo_t   *linfo = (const H5O_linfo_t *)_mesg;
-    size_t ret_value;   /* Return value */
+    size_t ret_value = 0;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -383,12 +384,12 @@ H5O_linfo_copy_file(H5F_t H5_ATTR_UNUSED *file_src, void *native_src, H5F_t *fil
     hbool_t H5_ATTR_UNUSED *recompute_size, unsigned H5_ATTR_UNUSED *mesg_flags,
     H5O_copy_t *cpy_info, void *_udata, hid_t dxpl_id)
 {
-    H5O_linfo_t          *linfo_src = (H5O_linfo_t *) native_src;
-    H5O_linfo_t          *linfo_dst = NULL;
+    H5O_linfo_t         *linfo_src = (H5O_linfo_t *) native_src;
+    H5O_linfo_t         *linfo_dst = NULL;
     H5G_copy_file_ud_t *udata = (H5G_copy_file_ud_t *) _udata;
-    void                 *ret_value;          /* Return value */
+    void                *ret_value = NULL;      /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, H5AC__COPIED_TAG, NULL)
 
     /* check args */
     HDassert(linfo_src);
@@ -429,7 +430,7 @@ done:
         if(linfo_dst)
             linfo_dst = H5FL_FREE(H5O_linfo_t, linfo_dst);
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, NULL)
 } /* H5O_linfo_copy_file() */
 
 

@@ -468,10 +469,16 @@ H5O_linfo_post_copy_file_cb(const H5O_link_t *src_lnk, void *_udata)
         HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, H5_ITER_ERROR, "unable to copy link")
     dst_lnk_init = TRUE;
 
+    /* Set metadata tag in dxpl_id */
+    H5_BEGIN_TAG(udata->dxpl_id, H5AC__COPIED_TAG, FAIL);
+
     /* Insert the new object in the destination file's group */
     /* (Doesn't increment the link count - that's already been taken care of for hard links) */
     if(H5G__dense_insert(udata->dst_oloc->file, udata->dxpl_id, udata->dst_linfo, &dst_lnk) < 0)
-        HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, H5_ITER_ERROR, "unable to insert destination link")
+        HGOTO_ERROR_TAG(H5E_OHDR, H5E_CANTINSERT, H5_ITER_ERROR, "unable to insert destination link")
+
+    /* Reset metadata tag in dxpl_id */
+    H5_END_TAG(FAIL);
 
 done:
     /* Check if the destination link has been initialized */
diff --git a/src/H5Olink.c b/src/H5Olink.c
index 53191ca..fd4ee88 100644
--- a/src/H5Olink.c
+++ b/src/H5Olink.c
@@ -24,9 +24,10 @@
  *-------------------------------------------------------------------------
  */
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
-#define H5L_PACKAGE		/*suppress error about including H5Lpkg	  */
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#define H5G_FRIEND		/*suppress error about including H5Gpkg   */
+#define H5L_FRIEND		/*suppress error about including H5Lpkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
@@ -124,7 +125,7 @@ H5O_link_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *op
     H5O_link_t          *lnk = NULL;    /* Pointer to link message */
     size_t              len = 0;        /* Length of a string in the message */
     unsigned char       link_flags;     /* Flags for encoding link info */
-    void                *ret_value;     /* Return value */
+    void                *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -411,7 +412,7 @@ H5O_link_copy(const void *_mesg, void *_dest)
 {
     const H5O_link_t    *lnk = (const H5O_link_t *) _mesg;
     H5O_link_t          *dest = (H5O_link_t *) _dest;
-    void                *ret_value;     /* Return value */
+    void                *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -478,9 +479,9 @@ static size_t
 H5O_link_size(const H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, const void *_mesg)
 {
     const H5O_link_t *lnk = (const H5O_link_t *)_mesg;
-    uint64_t name_len;    /* Length of name */
-    size_t name_size;   /* Size of encoded name length */
-    size_t ret_value;   /* Return value */
+    uint64_t name_len;          /* Length of name */
+    size_t name_size;           /* Size of encoded name length */
+    size_t ret_value = 0;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -727,7 +728,7 @@ H5O_link_copy_file(H5F_t H5_ATTR_UNUSED *file_src, void *native_src, H5F_t H5_AT
     H5O_copy_t H5_ATTR_UNUSED *cpy_info, void H5_ATTR_UNUSED *udata, hid_t H5_ATTR_UNUSED dxpl_id)
 {
     H5O_link_t  *link_src = (H5O_link_t *)native_src;
-    void        *ret_value;          /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -834,7 +835,7 @@ H5O_link_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void
     HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
 	      "Link Name Character Set:", (lnk->cset == H5T_CSET_ASCII ?
                 "ASCII" : (lnk->cset == H5T_CSET_UTF8 ? "UTF-8" : "Unknown")));
-    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+    HDfprintf(stream, "%*s%-*s '%s'\n", indent, "", fwidth,
 	      "Link Name:", lnk->name);
 
     /* Display link-specific information */
@@ -845,7 +846,7 @@ H5O_link_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void
             break;
 
         case H5L_TYPE_SOFT:
-            HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+            HDfprintf(stream, "%*s%-*s '%s'\n", indent, "", fwidth,
                       "Link Value:", lnk->u.soft.name);
             break;
 
diff --git a/src/H5Omessage.c b/src/H5Omessage.c
index 7a946df..d42896c 100644
--- a/src/H5Omessage.c
+++ b/src/H5Omessage.c
@@ -28,7 +28,8 @@
 /* Module Setup */
 /****************/
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 /***********/
 /* Headers */
@@ -73,10 +74,10 @@ typedef struct {
 /* Local Prototypes */
 /********************/
 
-static herr_t H5O_msg_reset_real(const H5O_msg_class_t *type, void *native);
-static herr_t H5O_msg_remove_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
+static herr_t H5O__msg_reset_real(const H5O_msg_class_t *type, void *native);
+static herr_t H5O__msg_remove_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
     unsigned sequence, unsigned *oh_modified, void *_udata/*in,out*/);
-static herr_t H5O_copy_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t idx,
+static herr_t H5O__copy_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t idx,
     const H5O_msg_class_t *type, const void *mesg, unsigned mesg_flags,
     unsigned update_flags);
 
@@ -224,7 +225,7 @@ H5O_msg_append_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh, const H5O_msg_class_t *t
         HGOTO_ERROR(H5E_OHDR, H5E_NOSPACE, FAIL, "unable to create new message")
 
     /* Copy the information for the message */
-    if(H5O_copy_mesg(f, dxpl_id, oh, idx, type, mesg, mesg_flags, update_flags) < 0)
+    if(H5O__copy_mesg(f, dxpl_id, oh, idx, type, mesg, mesg_flags, update_flags) < 0)
         HGOTO_ERROR(H5E_OHDR, H5E_CANTCOPY, FAIL, "unable to write message")
 #ifdef H5O_DEBUG
 H5O_assert(oh);
@@ -318,7 +319,7 @@ H5O_msg_write_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned type_id,
     const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, oh->cache_info.addr, FAIL)
 
     /* check args */
     HDassert(f);
@@ -335,7 +336,7 @@ H5O_msg_write_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned type_id,
         HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to write object header message")
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5O_msg_write_oh() */
 
 

@@ -426,7 +427,7 @@ H5O_msg_write_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh, const H5O_msg_class_t *ty
     } /* end if */
 
     /* Copy the information for the message */
-    if(H5O_copy_mesg(f, dxpl_id, oh, idx, type, mesg, mesg_flags, update_flags) < 0)
+    if(H5O__copy_mesg(f, dxpl_id, oh, idx, type, mesg, mesg_flags, update_flags) < 0)
         HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to write message")
 #ifdef H5O_DEBUG
 H5O_assert(oh);
@@ -465,9 +466,9 @@ H5O_msg_read(const H5O_loc_t *loc, unsigned type_id, void *mesg,
     hid_t dxpl_id)
 {
     H5O_t *oh = NULL;                   /* Object header to use */
-    void *ret_value;                    /* Return value */
+    void *ret_value = NULL;             /* Return value */
 
-    FUNC_ENTER_NOAPI(NULL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, loc->addr, NULL)
 
     /* check args */
     HDassert(loc);
@@ -476,7 +477,7 @@ H5O_msg_read(const H5O_loc_t *loc, unsigned type_id, void *mesg,
     HDassert(type_id < NELMTS(H5O_msg_class_g));
 
     /* Get the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to protect object header")
 
     /* Call the "real" read routine */
@@ -487,7 +488,7 @@ done:
     if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
 	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, NULL, "unable to release object header")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, NULL)
 } /* end H5O_msg_read() */
 
 

@@ -586,7 +587,7 @@ H5O_msg_reset(unsigned type_id, void *native)
     HDassert(type);
 
     /* Call the "real" reset routine */
-    if(H5O_msg_reset_real(type, native) < 0)
+    if(H5O__msg_reset_real(type, native) < 0)
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTRESET, FAIL, "unable to reset object header")
 
 done:
@@ -595,7 +596,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_msg_reset_real
+ * Function:	H5O__msg_reset_real
  *
  * Purpose:	Some message data structures have internal fields that
  *		need to be freed.  This function does that if appropriate
@@ -610,11 +611,11 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_msg_reset_real(const H5O_msg_class_t *type, void *native)
+H5O__msg_reset_real(const H5O_msg_class_t *type, void *native)
 {
     herr_t      ret_value = SUCCEED;       /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* check args */
     HDassert(type);
@@ -630,7 +631,7 @@ H5O_msg_reset_real(const H5O_msg_class_t *type, void *native)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_msg_reset_real() */
+} /* end H5O__msg_reset_real() */
 
 

 /*-------------------------------------------------------------------------
@@ -652,7 +653,7 @@ void *
 H5O_msg_free(unsigned type_id, void *mesg)
 {
     const H5O_msg_class_t *type;            /* Actual H5O class type for the ID */
-    void * ret_value;                   /* Return value */
+    void *ret_value = NULL;             /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -719,7 +720,7 @@ H5O_msg_free_real(const H5O_msg_class_t *type, void *msg_native)
     HDassert(type);
 
     if(msg_native) {
-        H5O_msg_reset_real(type, msg_native);
+        H5O__msg_reset_real(type, msg_native);
         if(NULL != (type->free))
             (type->free)(msg_native);
         else
@@ -749,7 +750,7 @@ void *
 H5O_msg_copy(unsigned type_id, const void *mesg, void *dst)
 {
     const H5O_msg_class_t *type;            /* Actual H5O class type for the ID */
-    void	*ret_value;             /* Return value */
+    void *ret_value = NULL;             /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -789,7 +790,7 @@ H5O_msg_count(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id)
     H5O_t *oh = NULL;           /* Object header to operate on */
     const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
     unsigned msg_count;         /* Message count */
-    int	ret_value;              /* Return value */
+    int	ret_value = FAIL;       /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -802,7 +803,7 @@ H5O_msg_count(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id)
     HDassert(type);
 
     /* Load the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
 
     /* Count the messages of the correct type */
@@ -836,7 +837,7 @@ unsigned
 H5O_msg_count_real(const H5O_t *oh, const H5O_msg_class_t *type)
 {
     unsigned u;                 /* Local index variable */
-    unsigned ret_value;         /* Return value */
+    unsigned ret_value = 0;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -875,16 +876,16 @@ htri_t
 H5O_msg_exists(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id)
 {
     H5O_t	*oh = NULL;             /* Object header for location */
-    htri_t      ret_value;              /* Return value */
+    htri_t      ret_value = FAIL;       /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, loc->addr, FAIL)
 
     HDassert(loc);
     HDassert(loc->file);
     HDassert(type_id < NELMTS(H5O_msg_class_g));
 
     /* Load the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
 
     /* Call the "real" exists routine */
@@ -895,7 +896,7 @@ done:
     if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0)
 	HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5O_msg_exists() */
 
 

@@ -966,8 +967,8 @@ H5O_msg_remove(const H5O_loc_t *loc, unsigned type_id, int sequence, hbool_t adj
     hid_t dxpl_id)
 {
     H5O_t *oh = NULL;                   /* Pointer to actual object header */
-    const H5O_msg_class_t *type;            /* Actual H5O class type for the ID */
-    herr_t      ret_value;              /* Return value */
+    const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
+    herr_t ret_value = FAIL;            /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1018,8 +1019,8 @@ H5O_msg_remove_op(const H5O_loc_t *loc, unsigned type_id, int sequence,
     H5O_operator_t op, void *op_data, hbool_t adj_link, hid_t dxpl_id)
 {
     H5O_t *oh = NULL;                   /* Pointer to actual object header */
-    const H5O_msg_class_t *type;            /* Actual H5O class type for the ID */
-    herr_t      ret_value;              /* Return value */
+    const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
+    herr_t ret_value = FAIL;            /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1049,7 +1050,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_msg_remove_cb
+ * Function:	H5O__msg_remove_cb
  *
  * Purpose:	Object header iterator callback routine to remove messages
  *              of a particular type that match a particular sequence number,
@@ -1061,21 +1062,17 @@ done:
  *		koziol at ncsa.uiuc.edu
  *		Sep  6 2005
  *
- * Modifications:
- *	Vailin Choi; Sept 2011
- *	Indicate that the object header is modified and might possibly need
- *	to condense messages in the object header 
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_msg_remove_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/, unsigned sequence,
+H5O__msg_remove_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/, unsigned sequence,
     unsigned *oh_modified, void *_udata/*in,out*/)
 {
     H5O_iter_rm_t *udata = (H5O_iter_rm_t *)_udata;   /* Operator user data */
     htri_t try_remove = FALSE;         /* Whether to try removing a message */
     herr_t ret_value = H5_ITER_CONT;   /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* check args */
     HDassert(mesg);
@@ -1103,7 +1100,7 @@ H5O_msg_remove_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/, unsigned sequence,
         if(H5O_release_mesg(udata->f, udata->dxpl_id, oh, mesg, udata->adj_link) < 0)
             HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, H5_ITER_ERROR, "unable to release message")
 
-        /* Indicate that the object header was modified & might need to condense messages in object header */
+        /* Indicate that the object header was modified */
         *oh_modified = H5O_MODIFY_CONDENSE;
 
         /* Break out now, if we've found the correct message */
@@ -1113,7 +1110,7 @@ H5O_msg_remove_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/, unsigned sequence,
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_msg_remove_cb() */
+} /* end H5O__msg_remove_cb() */
 
 

 /*-------------------------------------------------------------------------
@@ -1164,7 +1161,7 @@ H5O_msg_remove_real(H5F_t *f, H5O_t *oh, const H5O_msg_class_t *type,
 
     /* Iterate over the messages, deleting appropriate one(s) */
     op.op_type = H5O_MESG_OP_LIB;
-    op.u.lib_op = H5O_msg_remove_cb;
+    op.u.lib_op = H5O__msg_remove_cb;
     if(H5O_msg_iterate_real(f, oh, type, &op, &udata, dxpl_id) < 0)
         HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "error iterating over messages")
 
@@ -1214,7 +1211,7 @@ H5O_msg_iterate(const H5O_loc_t *loc, unsigned type_id,
 {
     H5O_t *oh = NULL;               /* Pointer to actual object header */
     const H5O_msg_class_t *type;    /* Actual H5O class type for the ID */
-    herr_t ret_value;               /* Return value */
+    herr_t ret_value = FAIL;        /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1228,7 +1225,7 @@ H5O_msg_iterate(const H5O_loc_t *loc, unsigned type_id,
     HDassert(op);
 
     /* Protect the object header to iterate over */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
 
     /* Call the "real" iterate routine */
@@ -1272,12 +1269,6 @@ done:
  *      C. Negative causes the iterator to immediately return that value,
  *          indicating failure.
  *
- * Modifications:
- *	Vailin Choi; September 2011
- *	Change "oh_modified" from boolean to unsigned so as to know:
- *	1) object header is just modified
- *	2) object header is modified and possibly need to condense messages there
- *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -1287,7 +1278,7 @@ H5O_msg_iterate_real(H5F_t *f, H5O_t *oh, const H5O_msg_class_t *type,
     H5O_mesg_t         *idx_msg;        /* Pointer to current message */
     unsigned		idx;            /* Absolute index of current message in all messages */
     unsigned		sequence;       /* Relative index of current message for messages of type */
-    unsigned		oh_modified = 0;    /* Whether the callback modified the object header */
+    unsigned 		oh_modified = 0;    	/* Whether the callback modified the object header */
     herr_t              ret_value = H5_ITER_CONT;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
@@ -1327,7 +1318,7 @@ H5O_msg_iterate_real(H5F_t *f, H5O_t *oh, const H5O_msg_class_t *type,
 done:
     /* Check if object message was modified */
     if(oh_modified) {
-        /* Try to condense object header info if the flag indicates so */
+        /* Try to condense object header info */
         /* (Since this routine is used to remove messages from an
          *  object header, the header will be condensed after each
          *  message removal)
@@ -1369,7 +1360,7 @@ H5O_msg_raw_size(const H5F_t *f, unsigned type_id, hbool_t disable_shared,
     const void *mesg)
 {
     const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
-    size_t ret_value;                   /* Return value */
+    size_t ret_value = 0;               /* Return value */
 
     FUNC_ENTER_NOAPI(0)
 
@@ -1414,7 +1405,7 @@ H5O_msg_size_f(const H5F_t *f, hid_t ocpl_id, unsigned type_id,
     const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
     H5P_genplist_t *ocpl;       /* Object Creation Property list */
     uint8_t oh_flags;           /* Object header status flags */
-    size_t ret_value;           /* Return value */
+    size_t ret_value = 0;       /* Return value */
 
     FUNC_ENTER_NOAPI(0)
 
@@ -1476,7 +1467,7 @@ H5O_msg_size_oh(const H5F_t *f, const H5O_t *oh, unsigned type_id,
     const void *mesg, size_t extra_raw)
 {
     const H5O_msg_class_t *type; /* Actual H5O class type for the ID */
-    size_t ret_value;           /* Return value */
+    size_t ret_value = 0;       /* Return value */
 
     FUNC_ENTER_NOAPI(0)
 
@@ -1527,7 +1518,7 @@ htri_t
 H5O_msg_can_share(unsigned type_id, const void *mesg)
 {
     const H5O_msg_class_t *type;    /* Actual H5O class type for the ID */
-    htri_t ret_value;
+    htri_t ret_value = FAIL;        /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1574,7 +1565,7 @@ htri_t
 H5O_msg_can_share_in_ohdr(unsigned type_id)
 {
     const H5O_msg_class_t *type;    /* Actual H5O class type for the ID */
-    htri_t ret_value;
+    htri_t ret_value = FAIL;        /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1612,7 +1603,7 @@ htri_t
 H5O_msg_is_shared(unsigned type_id, const void *mesg)
 {
     const H5O_msg_class_t *type;    /* Actual H5O class type for the ID */
-    htri_t ret_value;
+    htri_t ret_value = FAIL;        /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1826,8 +1817,8 @@ H5O_msg_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned type_id,
     const unsigned char *buf)
 {
     const H5O_msg_class_t   *type;      /* Actual H5O class type for the ID */
-    void *ret_value;                    /* Return value */
     unsigned ioflags = 0;               /* Flags for decode routine */
+    void *ret_value = NULL;             /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -1869,7 +1860,7 @@ H5O_msg_copy_file(const H5O_msg_class_t *type, H5F_t *file_src,
     void *native_src, H5F_t *file_dst, hbool_t *recompute_size,
     unsigned *mesg_flags, H5O_copy_t *cpy_info, void *udata, hid_t dxpl_id)
 {
-    void        *ret_value;
+    void *ret_value = NULL;             /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1960,7 +1951,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5O_copy_mesg
+ * Function:	H5O__copy_mesg
  *
  * Purpose:	Make a copy of the native object for an object header's
  *              native message info
@@ -1973,7 +1964,7 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5O_copy_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t idx,
+H5O__copy_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t idx,
     const H5O_msg_class_t *type, const void *mesg, unsigned mesg_flags,
     unsigned update_flags)
 {
@@ -1982,7 +1973,7 @@ H5O_copy_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t idx,
     hbool_t chk_dirtied = FALSE;                /* Flag for unprotecting chunk */
     herr_t      ret_value = SUCCEED;            /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* check args */
     HDassert(f);
@@ -1996,7 +1987,7 @@ H5O_copy_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t idx,
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header chunk")
 
     /* Reset existing native information for the header's message */
-    H5O_msg_reset_real(type, idx_msg->native);
+    H5O__msg_reset_real(type, idx_msg->native);
 
     /* Copy the native object for the message */
     if(NULL == (idx_msg->native = (type->copy)(mesg, idx_msg->native)))
@@ -2025,7 +2016,7 @@ done:
         HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header chunk")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5O_copy_mesg() */
+} /* end H5O__copy_mesg() */
 
 

 /*-------------------------------------------------------------------------
@@ -2057,7 +2048,7 @@ H5O_msg_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned type_id,
     const H5O_msg_class_t   *type;      /* Actual H5O class type for the ID */
     herr_t ret_value = SUCCEED;                    /* Return value */
 
-    FUNC_ENTER_NOAPI(NULL)
+    FUNC_ENTER_NOAPI(FAIL)
 
     /* check args */
     HDassert(f);
@@ -2286,7 +2277,7 @@ H5O_msg_get_chunkno(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id)
     const H5O_msg_class_t *type;        /* Actual H5O class type for the ID */
     H5O_mesg_t *idx_msg;                /* Pointer to message to modify */
     unsigned idx;                       /* Index of message to modify */
-    int ret_value;                      /* Return value */
+    int ret_value = -1;                 /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -2299,7 +2290,7 @@ H5O_msg_get_chunkno(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id)
     HDassert(type);
 
     /* Get the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
 
     /* Locate message of correct type */
@@ -2354,7 +2345,7 @@ H5O_msg_lock(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id)
     HDassert(type);
 
     /* Get the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
 
     /* Locate message of correct type */
@@ -2412,7 +2403,7 @@ H5O_msg_unlock(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id)
     HDassert(type);
 
     /* Get the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
 
     /* Locate message of correct type */
diff --git a/src/H5Omodule.h b/src/H5Omodule.h
new file mode 100644
index 0000000..a8f1301
--- /dev/null
+++ b/src/H5Omodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5O package.  Including this header means that the source file
+ *		is part of the H5O package.
+ */
+#ifndef _H5Omodule_H
+#define _H5Omodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5O_MODULE
+#define H5_MY_PKG       H5O
+#define H5_MY_PKG_ERR   H5E_OHDR
+#define H5_MY_PKG_INIT  YES
+
+#endif /* _H5Omodule_H */
+
diff --git a/src/H5Omtime.c b/src/H5Omtime.c
index 7c1851b..c61fa66 100644
--- a/src/H5Omtime.c
+++ b/src/H5Omtime.c
@@ -19,7 +19,8 @@
  * Purpose:	The object modification time message.
  */
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
@@ -41,7 +42,7 @@ static size_t H5O_mtime_size(const H5F_t *f, hbool_t disable_shared, const void
 static herr_t H5O_mtime_reset(void *_mesg);
 static herr_t H5O_mtime_free(void *_mesg);
 static herr_t H5O_mtime_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE *stream,
-			     int indent, int fwidth);
+           int indent, int fwidth);
 
 /* This message derives from H5O message class */
 const H5O_msg_class_t H5O_MSG_MTIME[1] = {{
@@ -95,9 +96,6 @@ const H5O_msg_class_t H5O_MSG_MTIME_NEW[1] = {{
 /* Current version of new mtime information */
 #define H5O_MTIME_VERSION 	1
 
-/* Track whether tzset routine was called */
-static hbool_t ntzset = FALSE;
-
 /* Declare a free list to manage the time_t struct */
 H5FL_DEFINE(time_t);
 
@@ -105,8 +103,11 @@ H5FL_DEFINE(time_t);
 /*-------------------------------------------------------------------------
  * Function:	H5O_mtime_new_decode
  *
- * Purpose:	Decode a new modification time message and return a pointer to a
- *		new time_t value.
+ * Purpose:     Decode a new modification time message and return a pointer to
+ *              a new time_t value.
+ *
+ *              The new modification time message format was added due to the
+ *              performance overhead of the old format.
  *
  * Return:	Success:	Ptr to new message in native struct.
  *
@@ -123,14 +124,14 @@ H5O_mtime_new_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_
     unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
 {
     time_t	*mesg;
-    uint32_t    tmp_time;       /* Temporary copy of the time */
-    void        *ret_value;     /* Return value */
+    uint32_t    tmp_time;               /* Temporary copy of the time */
+    void        *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
     /* check args */
-    assert(f);
-    assert(p);
+    HDassert(f);
+    HDassert(p);
 
     /* decode */
     if(*p++ != H5O_MTIME_VERSION)
@@ -144,7 +145,7 @@ H5O_mtime_new_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_
 
     /* The return value */
     if (NULL==(mesg = H5FL_MALLOC(time_t)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
     *mesg = (time_t)tmp_time;
 
     /* Set return value */
@@ -158,8 +159,11 @@ done:
 /*-------------------------------------------------------------------------
  * Function:	H5O_mtime_decode
  *
- * Purpose:	Decode a modification time message and return a pointer to a
- *		new time_t value.
+ * Purpose:     Decode a modification time message and return a pointer to a
+ *              new time_t value.
+ *
+ *              The new modification time message format was added due to the
+ *              performance overhead of the old format.
  *
  * Return:	Success:	Ptr to new message in native struct.
  *
@@ -176,16 +180,9 @@ H5O_mtime_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5
     unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
 {
     time_t	*mesg, the_time;
-    int	i;
     struct tm	tm;
+    int	i;                              /* Local index variable */
     void        *ret_value = NULL;      /* Return value */
-#if _MSC_VER >= 1900  /* VS 2015 */
-/* In gcc and in Visual Studio prior to VS 2015 'timezone' is a global
- * variable declared in time.h. That variable was deprecated and in VS 2015
- * is removed, with _get_timezone replacing it.
- */
-    long timezone = 0;
-#endif
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -193,54 +190,22 @@ H5O_mtime_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5
     HDassert(f);
     HDassert(p);
 
-    /* Initialize time zone information */
-    if(!ntzset) {
-        HDtzset();
-        ntzset = TRUE;
-    } /* end if */
-
     /* decode */
     for(i = 0; i < 14; i++)
         if(!HDisdigit(p[i]))
             HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "badly formatted modification time message")
 
-    /*
-     * Convert YYYYMMDDhhmmss UTC to a time_t.  This is a little problematic
-     * because mktime() operates on local times.  We convert to local time
-     * and then figure out the adjustment based on the local time zone and
-     * daylight savings setting.
-     */
+    /* Convert YYYYMMDDhhmmss UTC to a time_t. */
     HDmemset(&tm, 0, sizeof tm);
-    tm.tm_year = (p[0]-'0')*1000 + (p[1]-'0')*100 +
-		 (p[2]-'0')*10 + (p[3]-'0') - 1900;
+    tm.tm_year = (p[0]-'0')*1000 + (p[1]-'0')*100 + (p[2]-'0')*10 + (p[3]-'0') - 1900;
     tm.tm_mon = (p[4]-'0')*10 + (p[5]-'0') - 1;
     tm.tm_mday = (p[6]-'0')*10 + (p[7]-'0');
     tm.tm_hour = (p[8]-'0')*10 + (p[9]-'0');
     tm.tm_min = (p[10]-'0')*10 + (p[11]-'0');
     tm.tm_sec = (p[12]-'0')*10 + (p[13]-'0');
-    tm.tm_isdst = -1; /*figure it out*/
-    if((time_t)-1 == (the_time = HDmktime(&tm)))
-        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "badly formatted modification time message")
-
-#if defined(H5_HAVE_TM_GMTOFF)
-    /* BSD-like systems */
-    the_time += tm.tm_gmtoff;
-#elif defined(H5_HAVE_TIMEZONE)
-    #if _MSC_VER >= 1900  // VS 2015
-        HDget_timezone(&timezone);
-    #endif
-    /* GNU/Linux systems */
-    the_time -= timezone - (tm.tm_isdst ? 3600 : 0);
-#else
-    /*
-     * The catch-all.  If we can't convert a character string universal
-     * coordinated time to a time_t value reliably then we can't decode the
-     * modification time message. This really isn't as bad as it sounds -- the
-     * only way a user can get the modification time is from our internal
-     * query routines, which can gracefully recover.
-     */
-    HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "unable to obtain local timezone information")
-#endif
+    tm.tm_isdst = -1; /* (figure it out) */
+    if((time_t)-1 == (the_time = H5_make_time(&tm)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, NULL, "can't construct time info")
 
     /* The return value */
     if(NULL == (mesg = H5FL_MALLOC(time_t)))
@@ -276,9 +241,9 @@ H5O_mtime_new_encode(H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_sha
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
     /* check args */
-    assert(f);
-    assert(p);
-    assert(mesg);
+    HDassert(f);
+    HDassert(p);
+    HDassert(mesg);
 
     /* Version */
     *p++ = H5O_MTIME_VERSION;
@@ -319,15 +284,15 @@ H5O_mtime_encode(H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared,
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
     /* check args */
-    assert(f);
-    assert(p);
-    assert(mesg);
+    HDassert(f);
+    HDassert(p);
+    HDassert(mesg);
 
     /* encode */
     tm = HDgmtime(mesg);
     sprintf((char*)p, "%04d%02d%02d%02d%02d%02d",
-	    1900+tm->tm_year, 1+tm->tm_mon, tm->tm_mday,
-	    tm->tm_hour, tm->tm_min, tm->tm_sec);
+      1900+tm->tm_year, 1+tm->tm_mon, tm->tm_mday,
+      tm->tm_hour, tm->tm_min, tm->tm_sec);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
 }
@@ -356,12 +321,12 @@ H5O_mtime_copy(const void *_mesg, void *_dest)
 {
     const time_t	*mesg = (const time_t *) _mesg;
     time_t		*dest = (time_t *) _dest;
-    void        *ret_value;     /* Return value */
+    void                *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
     /* check args */
-    assert(mesg);
+    HDassert(mesg);
     if (!dest && NULL==(dest = H5FL_MALLOC(time_t)))
         HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed");
 
@@ -402,8 +367,8 @@ H5O_mtime_new_size(const H5F_t H5_ATTR_UNUSED * f, hbool_t H5_ATTR_UNUSED disabl
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
     /* check args */
-    assert(f);
-    assert(mesg);
+    HDassert(f);
+    HDassert(mesg);
 
     FUNC_LEAVE_NOAPI(8)
 } /* end H5O_mtime_new_size() */
@@ -435,8 +400,8 @@ H5O_mtime_size(const H5F_t H5_ATTR_UNUSED * f, hbool_t H5_ATTR_UNUSED disable_sh
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
     /* check args */
-    assert(f);
-    assert(mesg);
+    HDassert(f);
+    HDassert(mesg);
 
     FUNC_LEAVE_NOAPI(16)
 }
@@ -510,7 +475,7 @@ H5O_mtime_free(void *mesg)
  */
 static herr_t
 H5O_mtime_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const void *_mesg, FILE *stream,
-		int indent, int fwidth)
+    int indent, int fwidth)
 {
     const time_t	*mesg = (const time_t *)_mesg;
     struct tm		*tm;
@@ -519,18 +484,18 @@ H5O_mtime_debug(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const voi
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
     /* check args */
-    assert(f);
-    assert(mesg);
-    assert(stream);
-    assert(indent >= 0);
-    assert(fwidth >= 0);
+    HDassert(f);
+    HDassert(mesg);
+    HDassert(stream);
+    HDassert(indent >= 0);
+    HDassert(fwidth >= 0);
 
     /* debug */
     tm = HDlocaltime(mesg);
 
     HDstrftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", tm);
-    fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
-	    "Time:", buf);
+    HDfprintf(stream, "%*s%-*s %s\n", indent, "", fwidth,
+      "Time:", buf);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
 }
diff --git a/src/H5Oname.c b/src/H5Oname.c
index 2cd9e72..6c4f76f 100644
--- a/src/H5Oname.c
+++ b/src/H5Oname.c
@@ -24,7 +24,8 @@
  *-------------------------------------------------------------------------
  */
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
@@ -88,7 +89,7 @@ H5O_name_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_
     unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
 {
     H5O_name_t          *mesg;
-    void                *ret_value;     /* Return value */
+    void                *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -170,9 +171,9 @@ H5O_name_encode(H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared,
 static void *
 H5O_name_copy(const void *_mesg, void *_dest)
 {
-    const H5O_name_t       *mesg = (const H5O_name_t *) _mesg;
-    H5O_name_t             *dest = (H5O_name_t *) _dest;
-    void                *ret_value;     /* Return value */
+    const H5O_name_t    *mesg = (const H5O_name_t *) _mesg;
+    H5O_name_t          *dest = (H5O_name_t *) _dest;
+    void                *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -223,7 +224,7 @@ static size_t
 H5O_name_size(const H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shared, const void *_mesg)
 {
     const H5O_name_t       *mesg = (const H5O_name_t *) _mesg;
-    size_t                  ret_value;
+    size_t                  ret_value = 0;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
diff --git a/src/H5Onull.c b/src/H5Onull.c
index a6c6524..258f695 100644
--- a/src/H5Onull.c
+++ b/src/H5Onull.c
@@ -24,7 +24,8 @@
  *-------------------------------------------------------------------------
  */
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Opkg.h"             /* Object headers			*/
diff --git a/src/H5Opkg.h b/src/H5Opkg.h
index ff52537..8ce2718 100644
--- a/src/H5Opkg.h
+++ b/src/H5Opkg.h
@@ -13,7 +13,7 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#ifndef H5O_PACKAGE
+#if !(defined H5O_FRIEND || defined H5O_MODULE)
 #error "Do not include this file outside the H5O package!"
 #endif
 
@@ -31,7 +31,7 @@
 #define H5O_NMESGS	8 		/*initial number of messages	     */
 #define H5O_NCHUNKS	2		/*initial number of chunks	     */
 #define H5O_MIN_SIZE	22		/* Min. obj header data size (must be big enough for a message prefix and a continuation message) */
-#define H5O_MSG_TYPES   24              /* # of types of messages            */
+#define H5O_MSG_TYPES   26              /* # of types of messages            */
 #define H5O_MAX_CRT_ORDER_IDX 65535     /* Max. creation order index value   */
 
 /* Versions of object header structure */
@@ -48,6 +48,17 @@
  *      and 'size' callback for places to change when updating this. */
 #define H5O_VERSION_LATEST	H5O_VERSION_2
 
+/* This is the initial size of the dynamically allocated list of object 
+ * header continuation chunk flush dependency parents maintained by the 
+ * object header proxy.  
+ *
+ * The current value of 1 presumes that the typical number of entries 
+ * on this list is almost always either zero or 1.  Increase this value 
+ * if appropriate.
+ */
+#define H5O_FD_PAR_LIST_BASE	1
+
+
 /*
  * Align messages on 8-byte boundaries because we would like to copy the
  * object header chunks directly into memory and operate on them there, even
@@ -66,7 +77,7 @@
 #define H5O_ALIGN_OH(O, X)						      \
      H5O_ALIGN_VERS((O)->version, X)
 #define H5O_ALIGN_F(F, X)						      \
-     H5O_ALIGN_VERS((H5F_USE_LATEST_FORMAT(F) ? H5O_VERSION_LATEST : H5O_VERSION_1), X)
+     H5O_ALIGN_VERS((H5F_USE_LATEST_FLAGS(F, H5F_LATEST_OBJ_HEADER) ? H5O_VERSION_LATEST : H5O_VERSION_1), X)
 
 /* Size of checksum (on disk) */
 #define H5O_SIZEOF_CHKSUM               4
@@ -138,7 +149,7 @@
 #define H5O_SIZEOF_MSGHDR_OH(O)						      \
     H5O_SIZEOF_MSGHDR_VERS((O)->version, (O)->flags & H5O_HDR_ATTR_CRT_ORDER_TRACKED)
 #define H5O_SIZEOF_MSGHDR_F(F, C)						      \
-    H5O_SIZEOF_MSGHDR_VERS((H5F_USE_LATEST_FORMAT(F) || H5F_STORE_MSG_CRT_IDX(F)) ? H5O_VERSION_LATEST : H5O_VERSION_1, (C))
+    H5O_SIZEOF_MSGHDR_VERS((H5F_USE_LATEST_FLAGS(F, H5F_LATEST_OBJ_HEADER) || H5F_STORE_MSG_CRT_IDX(F)) ? H5O_VERSION_LATEST : H5O_VERSION_1, (C))
 
 /*
  * Size of chunk "header" for each chunk
@@ -267,6 +278,7 @@ struct H5O_t {
     /* File-specific information (not stored) */
     size_t      sizeof_size;            /* Size of file sizes 		     */
     size_t      sizeof_addr;            /* Size of file addresses	     */
+    hbool_t     swmr_write;             /* Whether we are doing SWMR writes  */
 
     /* Debugging information (not stored) */
 #ifdef H5O_ENABLE_BAD_MESG_COUNT
@@ -312,6 +324,10 @@ struct H5O_t {
     size_t	nchunks;		/*number of chunks		     */
     size_t	alloc_nchunks;		/*chunks allocated		     */
     H5O_chunk_t *chunk;			/*array of chunks		     */
+
+    /* Object header proxy information (not stored) */
+    haddr_t     proxy_addr;             /* Temporary address of object header proxy */
+    hbool_t     proxy_present;          /* Whether the proxy is present in cache (and we have to track dependencies) */
 };
 
 /* Class for types of objects in file */
@@ -324,8 +340,8 @@ typedef struct H5O_obj_class_t {
     hid_t	(*open)(const H5G_loc_t *, hid_t, hid_t, hbool_t );	/*open an object of this class */
     void	*(*create)(H5F_t *, void *, H5G_loc_t *, hid_t );	/*create an object of this class */
     H5O_loc_t	*(*get_oloc)(hid_t );		/*get the object header location for an object */
-    herr_t      (*bh_info)(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5_ih_info_t *bh_info); /*get the index & heap info for an object */
-    herr_t      (*flush)(H5G_loc_t *loc, hid_t dxpl_id); 		/*flush an opened object of this class */
+    herr_t      (*bh_info)(const H5O_loc_t *loc, hid_t dxpl_id, H5O_t *oh, H5_ih_info_t *bh_info); /*get the index & heap info for an object */
+    herr_t      (*flush)(void *obj_ptr, hid_t dxpl_id); /*flush an opened object of this class */
 } H5O_obj_class_t;
 
 /* Node in skip list to map addresses from one file to another during object header copy */
@@ -360,6 +376,9 @@ typedef struct H5O_common_cache_ud_t {
 typedef struct H5O_cache_ud_t {
     hbool_t made_attempt;               /* Whether the deserialize routine was already attempted */
     unsigned v1_pfx_nmesgs;             /* Number of messages from v1 prefix header */
+    uint8_t     version;                /* Version number obtained in get_load_size callback.
+					 * It will be used later in verify_chksum callback
+					 */ 
     H5O_common_cache_ud_t common;       /* Common object header cache callback info */
 } H5O_cache_ud_t;
 
@@ -368,8 +387,34 @@ typedef struct H5O_chunk_proxy_t {
     H5AC_info_t cache_info;    /* Information for metadata cache functions, _must_ be */
                                 /* first field in structure */
 
+    H5F_t *f;                           /* Pointer to file for object header/chunk */
     H5O_t       *oh;                    /* Object header for this chunk */
     unsigned    chunkno;                /* Chunk number for this chunk */
+    unsigned    cont_chunkno;           /* Chunk number for the chunk containing the continuation message that points to this chunk */
+
+    /* Flush depencency parent information (not stored) 
+     *
+     * The following fields are used to store the base address and a pointer 
+     * to the in core representation of the chunk proxy's flush dependency
+     * parent -- if it exists.  If it does not exist, these fields will
+     * contain HADDR_UNDEF and NULL respectively.
+     *
+     * If the file is opened in SWMR write mode, the flush dependency 
+     * parent of the chunk proxy will be either its object header 
+     * (if cont_chunkno == 0) or the chunk proxy indicated by the 
+     * cont_chunkno field (if cont_chunkno > 0).
+     *
+     * Note that the flush dependency parent address is maintained purely
+     * for sanity checking.  Once we are reasonably confident of the code,
+     * it can be deleted or be maintained only in debug mode.
+     */
+    haddr_t fd_parent_addr;             /* Address of flush dependency parent
+                                         * if any.  This field is initialized
+                                         * to HADDR_UNDEF.  
+                                         */
+    void * fd_parent_ptr;               /* pointer to flush dependency parent
+                                         * it it exists.  NULL otherwise.
+                                         */
 } H5O_chunk_proxy_t;
 
 /* Callback information for loading object header chunk from disk */
@@ -381,6 +426,65 @@ typedef struct H5O_chk_cache_ud_t {
     H5O_common_cache_ud_t common;       /* Common object header cache callback info */
 } H5O_chk_cache_ud_t;
 
+/* Metadata cache object header proxy type */
+struct H5O_proxy_t {
+    H5AC_info_t cache_info;             /* Information for H5AC cache functions, _must_ be */
+                                        /* first field in structure */
+    H5F_t *f;                           /* Pointer to file for object header/chunk */
+    H5O_t *oh;                          /* Object header */
+
+    /* Flush depencency parent information (not stored) 
+     *
+     * The following fields are used to store base addresses and pointers
+     * to the in core representations of the object header proxy's flush 
+     * dependency parents -- if they exist.
+     *
+     * At present, object header proxies may have two types of parents:
+     *
+     * 1) Exactly one object header.
+     *
+     * 2) Zero or more object header continuation chunks.
+     *
+     * The base address and pointer to the object header flush dependency 
+     * parent are stored in the oh_fd_parent_addr and oh_fd_parent_ptr fields.
+     * These fields are set to HADDR_UNDEF and NULL if there is no object 
+     * header flush dependency parent.  Note that when defined, 
+     * oh_fd_parent_ptr should point to the same object as oh.
+     *
+     * The number of object header continuation chunks (H5O_chunk_proxy_t) 
+     * that are flush dependency parents of the object header proxy is stored
+     * in chk_fd_parent_count.  
+     *
+     * If this field is greater than zero, chk_fd_parent_addrs must point to 
+     * a dynamically allocated array of haddr_t of length chk_fd_parent_alloc, 
+     * and chk_fd_parent_ptrs must point to a dynamically allocated array of 
+     * void * of the same length.  These arrays are used to store the base 
+     * addresses and pointers to the object header continuation chunk flush 
+     * dependency parents of the object header proxy.  chk_fd_parent_alloc
+     * must always be greater than or equal to chk_fd_parent_count.
+     *
+     * If chk_fd_parent_count is zero, chk_fd_parent_addrs and 
+     * chk_fd_parent_ptrs must be NULL.
+     *
+     * Note that the flush dependency parent addresses are maintined 
+     * purely for sanity checking.  Once we are confident of the code,
+     * these fields and their supporting code can be either deleted 
+     * on maintained only in debug builds.
+     */
+    haddr_t oh_fd_parent_addr;
+    void * oh_fd_parent_ptr;
+
+    unsigned chk_fd_parent_count;
+    unsigned chk_fd_parent_alloc;
+    haddr_t *chk_fd_parent_addrs;
+    void **chk_fd_parent_ptrs;
+};
+
+/* Callback information for loading object header proxy */
+typedef struct H5O_proxy_cache_ud_t {
+    H5F_t *f;                           /* Pointer to file for object header/chunk */
+    H5O_t *oh;                          /* Object header for this chunk */
+} H5O_proxy_cache_ud_t;
 
 /* H5O object header inherits cache-like properties from H5AC */
 H5_DLLVAR const H5AC_class_t H5AC_OHDR[1];
@@ -502,7 +606,10 @@ H5_DLLVAR const H5O_msg_class_t H5O_MSG_AINFO[1];
 /* Reference Count Message. (0x0016) */
 H5_DLLVAR const H5O_msg_class_t H5O_MSG_REFCOUNT[1];
 
-/* Placeholder for unknown message. (0x0017) */
+/* Free-space Manager Info message. (0x0017) */
+H5_DLLVAR const H5O_msg_class_t H5O_MSG_FSINFO[1];
+
+/* Placeholder for unknown message. (0x0018) */
 H5_DLLVAR const H5O_msg_class_t H5O_MSG_UNKNOWN[1];
 
 
@@ -553,7 +660,8 @@ H5_DLL herr_t H5O_msg_iterate_real(H5F_t *f, H5O_t *oh, const H5O_msg_class_t *t
     const H5O_mesg_operator_t *op, void *op_data, hid_t dxpl_id);
 
 /* Object header chunk routines */
-H5_DLL herr_t H5O_chunk_add(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx);
+H5_DLL herr_t H5O_chunk_add(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx,
+    unsigned cont_chunkno);
 H5_DLL H5O_chunk_proxy_t *H5O_chunk_protect(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
     unsigned idx);
 H5_DLL herr_t H5O_chunk_unprotect(H5F_t *f, hid_t dxpl_id,
@@ -601,9 +709,12 @@ H5_DLL herr_t H5O_attr_link(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, void *_mesg
 H5_DLL herr_t H5O_attr_count_real(H5F_t *f, hid_t dxpl_id, H5O_t *oh,
     hsize_t *nattrs);
 
-
-/* These functions operate on object locations */
-H5_DLL H5O_loc_t *H5O_get_loc(hid_t id);
+/* Object header proxy operators */
+H5_DLL herr_t H5O_proxy_create(H5F_t *f, hid_t dxpl_id, H5O_t *oh);
+H5_DLL H5O_proxy_t *H5O_proxy_pin(H5F_t *f, hid_t dxpl_id, H5O_t *oh);
+H5_DLL herr_t H5O_proxy_unpin(H5O_proxy_t *proxy);
+H5_DLL herr_t H5O_proxy_depend(H5F_t *f, hid_t dxpl_id, H5O_t *oh, void *parent);
+H5_DLL herr_t H5O_proxy_undepend(H5F_t *f, hid_t dxpl_id, H5O_t *oh, void *parent);
 
 /* Testing functions */
 #ifdef H5O_TESTING
diff --git a/src/H5Opline.c b/src/H5Opline.c
index b79a73c..95a82b5 100644
--- a/src/H5Opline.c
+++ b/src/H5Opline.c
@@ -20,8 +20,9 @@
  * Purpose:	Data filter pipeline message.
  */
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
-#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+#define H5Z_FRIEND		/*suppress error about including H5Zpkg	  */
+
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Dprivate.h"		/* Datasets				*/
@@ -116,7 +117,7 @@ H5O_pline_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5
     H5Z_filter_info_t   *filter;                /* Filter to decode */
     size_t		name_length;            /* Length of filter name */
     size_t		i;                      /* Local index variable */
-    void		*ret_value;             /* Return value */
+    void		*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -344,7 +345,7 @@ H5O_pline_copy(const void *_src, void *_dst/*out*/)
     const H5O_pline_t	*src = (const H5O_pline_t *)_src;       /* Source pipeline message */
     H5O_pline_t		*dst = (H5O_pline_t *)_dst;             /* Destination pipeline message */
     size_t		i;                      /* Local index variable */
-    H5O_pline_t		*ret_value;             /* Return value */
+    H5O_pline_t		*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -434,7 +435,7 @@ H5O_pline_size(const H5F_t H5_ATTR_UNUSED *f, const void *mesg)
 {
     const H5O_pline_t	*pline = (const H5O_pline_t*)mesg;      /* Pipeline message */
     size_t i;                   /* Local index variable */
-    size_t ret_value;           /* Return value */
+    size_t ret_value = 0;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
diff --git a/src/H5Oprivate.h b/src/H5Oprivate.h
index 94ba6a0..3c7b78a 100644
--- a/src/H5Oprivate.h
+++ b/src/H5Oprivate.h
@@ -35,8 +35,10 @@
 #include "H5Spublic.h"		/* Dataspace functions			*/
 
 /* Private headers needed by this file */
+#include "H5private.h"          /* Generic Functions                    */
 #include "H5ACprivate.h"        /* Metadata cache                       */
 #include "H5Fprivate.h"		/* File access				*/
+#include "H5HGprivate.h"        /* Global Heaps                         */
 #include "H5SLprivate.h"	/* Skip lists				*/
 #include "H5Tprivate.h"		/* Datatype functions			*/
 #include "H5Zprivate.h"         /* I/O pipeline filters			*/
@@ -45,6 +47,7 @@
 typedef struct H5O_msg_class_t H5O_msg_class_t;
 typedef struct H5O_mesg_t H5O_mesg_t;
 typedef struct H5O_t H5O_t;
+typedef struct H5O_proxy_t H5O_proxy_t;
 
 /* Values used to create the shared message & attribute heaps */
 /* (Note that these parameters have been tuned so that the resulting heap ID
@@ -74,7 +77,8 @@ typedef struct H5O_t H5O_t;
 #define H5O_MSG_FLAG_MARK_IF_UNKNOWN 0x10u
 #define H5O_MSG_FLAG_WAS_UNKNOWN 0x20u
 #define H5O_MSG_FLAG_SHAREABLE  0x40u
-#define H5O_MSG_FLAG_BITS	(H5O_MSG_FLAG_CONSTANT|H5O_MSG_FLAG_SHARED|H5O_MSG_FLAG_DONTSHARE|H5O_MSG_FLAG_FAIL_IF_UNKNOWN_AND_OPEN_FOR_WRITE|H5O_MSG_FLAG_MARK_IF_UNKNOWN|H5O_MSG_FLAG_WAS_UNKNOWN|H5O_MSG_FLAG_SHAREABLE)
+#define H5O_MSG_FLAG_FAIL_IF_UNKNOWN_ALWAYS 0x80u
+#define H5O_MSG_FLAG_BITS	(H5O_MSG_FLAG_CONSTANT|H5O_MSG_FLAG_SHARED|H5O_MSG_FLAG_DONTSHARE|H5O_MSG_FLAG_FAIL_IF_UNKNOWN_AND_OPEN_FOR_WRITE|H5O_MSG_FLAG_MARK_IF_UNKNOWN|H5O_MSG_FLAG_WAS_UNKNOWN|H5O_MSG_FLAG_SHAREABLE|H5O_MSG_FLAG_FAIL_IF_UNKNOWN_ALWAYS)
 
 /* Flags for updating messages */
 #define H5O_UPDATE_TIME         0x01u
@@ -83,6 +87,9 @@ typedef struct H5O_t H5O_t;
 /* Hash value constants */
 #define H5O_HASH_SIZE 32
 
+/* Enable reading/writing "bogus" messages */
+/* #define H5O_ENABLE_BOGUS */
+
 /* ========= Object Creation properties ============ */
 #define H5O_CRT_ATTR_MAX_COMPACT_NAME	"max compact attr"      /* Max. # of attributes to store compactly */
 #define H5O_CRT_ATTR_MIN_DENSE_NAME	"min dense attr"	/* Min. # of attributes to store densely */
@@ -104,11 +111,11 @@ typedef struct H5O_t H5O_t;
 #define H5O_CPY_MCDT_SEARCH_CB_NAME 	 "committed dtype list search" /* Callback function when the search for a matching committed datatype is complete */
 
 /* If the module using this macro is allowed access to the private variables, access them directly */
-#ifdef H5O_PACKAGE
+#ifdef H5O_MODULE
 #define H5O_OH_GET_ADDR(O)    ((O)->chunk[0].addr)
-#else /* H5O_PACKAGE */
+#else /* H5O_MODULE */
 #define H5O_OH_GET_ADDR(O)    (H5O_get_oh_addr(O))
-#endif /* H5O_PACKAGE */
+#endif /* H5O_MODULE */
 
 /* Set the fields in a shared message structure */
 #define H5O_UPDATE_SHARED(SH_MESG, SH_TYPE, F, MSG_TYPE, CRT_IDX, OH_ADDR)    \
@@ -191,10 +198,10 @@ typedef struct H5O_copy_t {
 #define H5O_DRVINFO_ID  0x0014          /* Driver info message.  */
 #define H5O_AINFO_ID    0x0015          /* Attribute info message.  */
 #define H5O_REFCOUNT_ID 0x0016          /* Reference count message.  */
-#define H5O_UNKNOWN_ID  0x0017          /* Placeholder message ID for unknown message.  */
+#define H5O_FSINFO_ID   0x0017          /* Free-space manager info message.  */
+#define H5O_UNKNOWN_ID  0x0018          /* Placeholder message ID for unknown message.  */
                                         /* (this should never exist in a file) */
 
-
 /* Shared object message types.
  * Shared objects can be committed, in which case the shared message contains
  * the location of the object header that holds the message, or shared in the
@@ -354,6 +361,14 @@ typedef struct H5O_efl_t {
  */
 #define H5O_LAYOUT_NDIMS	(H5S_MAX_RANK+1)
 
+/* Flags for chunked layout feature encoding */
+#define H5O_LAYOUT_CHUNK_DONT_FILTER_PARTIAL_BOUND_CHUNKS         0x01
+#define H5O_LAYOUT_CHUNK_SINGLE_INDEX_WITH_FILTER		  0x02
+#define H5O_LAYOUT_ALL_CHUNK_FLAGS                    (                     \
+    H5O_LAYOUT_CHUNK_DONT_FILTER_PARTIAL_BOUND_CHUNKS                       \
+    | H5O_LAYOUT_CHUNK_SINGLE_INDEX_WITH_FILTER                             \
+    )
+
 /* Initial version of the layout information.  Used when space is allocated */
 #define H5O_LAYOUT_VERSION_1	1
 
@@ -367,6 +382,21 @@ typedef struct H5O_efl_t {
  */
 #define H5O_LAYOUT_VERSION_3	3
 
+/* This version adds different types of indices to chunked datasets, allows
+ *      for larger chunk dimensions, stores chunk indices into their own
+ *      message (the "layout index" message), adds features for compact/dense
+ *      storage of elements and/or chunk records, adds features for abbreviating
+ *      the storage used for partial chunks on boundaries, adds the virtual
+ *      layout type, etc.
+ */
+#define H5O_LAYOUT_VERSION_4	4
+
+/* The default version of the format.  (Earlier versions had bugs) */
+#define H5O_LAYOUT_VERSION_DEFAULT H5O_LAYOUT_VERSION_3
+
+/* The latest version of the format.  Look through the 'encode'
+ *      and 'size' callbacks for places to change when updating this. */
+#define H5O_LAYOUT_VERSION_LATEST H5O_LAYOUT_VERSION_4
 
 /* Forward declaration of structs used below */
 struct H5D_layout_ops_t;                /* Defined in H5Dpkg.h               */
@@ -379,15 +409,49 @@ typedef struct H5O_storage_contig_t {
 
 typedef struct H5O_storage_chunk_btree_t {
     haddr_t     dset_ohdr_addr;         /* File address dataset's object header */
-    H5RC_t     *shared;			/* Ref-counted shared info for B-tree nodes */
+    H5UC_t     *shared;			/* Ref-counted shared info for B-tree nodes */
 } H5O_storage_chunk_btree_t;
 
+/* Forward declaration of structs used below */
+struct H5FA_t;                          /* Defined in H5FAprivate.h          */
+
+typedef struct H5O_storage_chunk_farray_t {
+    haddr_t     dset_ohdr_addr;         /* File address dataset's object header */
+    struct H5FA_t *fa;                  /* Pointer to fixed index array struct */
+} H5O_storage_chunk_farray_t;
+
+/* Forward declaration of structs used below */
+struct H5EA_t;                          /* Defined in H5EAprivate.h          */
+
+typedef struct H5O_storage_chunk_earray_t {
+    haddr_t	dset_ohdr_addr;		/* File address dataset's object header */
+    struct H5EA_t *ea;                  /* Pointer to extensible index array struct */
+} H5O_storage_chunk_earray_t;
+
+/* Filtered info for single chunk index */
+typedef struct H5O_storage_chunk_single_filt_t {
+    uint32_t nbytes;            /* Size of chunk (in file) */
+    uint32_t filter_mask;       /* Excluded filters for chunk */
+} H5O_storage_chunk_single_filt_t;
+
+/* Forward declaration of structs used below */
+struct H5B2_t;                          /* Defined in H5B2pkg.h          */
+
+typedef struct H5O_storage_chunk_bt2_t {
+    haddr_t     dset_ohdr_addr;         /* File address dataset's object header */
+    struct H5B2_t *bt2;                 /* Pointer to b-tree 2 struct */
+} H5O_storage_chunk_bt2_t;
+
 typedef struct H5O_storage_chunk_t {
     H5D_chunk_index_t idx_type;		/* Type of chunk index               */
     haddr_t	idx_addr;		/* File address of chunk index       */
     const struct H5D_chunk_ops_t *ops;  /* Pointer to chunked storage operations */
     union {
-        H5O_storage_chunk_btree_t btree; /* Information for v1 B-tree index   */
+        H5O_storage_chunk_btree_t btree;   /* Information for v1 B-tree index   */
+	H5O_storage_chunk_bt2_t btree2;    /* Information for v2 B-tree index */	
+        H5O_storage_chunk_earray_t earray; /* Information for extensible array index   */
+        H5O_storage_chunk_farray_t farray; /* Information for fixed array index   */
+	H5O_storage_chunk_single_filt_t single; /* Information for single chunk w/ filters index */
     } u;
 } H5O_storage_chunk_t;
 
@@ -397,22 +461,142 @@ typedef struct H5O_storage_compact_t {
     void        *buf;                   /* Buffer for compact dataset        */
 } H5O_storage_compact_t;
 
+typedef struct H5O_storage_virtual_srcdset_t {
+    /* Stored */
+    struct H5S_t *virtual_select;       /* Selection in the virtual dataset that is mapped to source selection */
+
+    /* Not stored */
+    char *file_name;                    /* Source file name used for virtual dataset mapping */
+    char *dset_name;                    /* Source dataset name used for virtual dataset mapping */
+    struct H5S_t *clipped_source_select; /* Clipped version of source_select  */
+    struct H5S_t *clipped_virtual_select; /* Clipped version of virtual_select */
+    struct H5D_t *dset;                 /* Source dataset                     */
+    hbool_t dset_exists;                /* Whether the dataset exists (was opened successfully) */
+
+    /* Temporary - only used during I/O operation, NULL at all other times */
+    struct H5S_t *projected_mem_space;  /* Selection within mem_space for this mapping */
+} H5O_storage_virtual_srcdset_t;
+
+typedef struct H5O_storage_virtual_name_seg_t {
+    char *name_segment;                 /* String for this name segment       */
+    struct H5O_storage_virtual_name_seg_t *next; /* Next name segment         */
+} H5O_storage_virtual_name_seg_t;
+
+typedef enum H5O_virtual_space_status_t {
+    H5O_VIRTUAL_STATUS_INVALID = 0,     /* Space extent is invalid            */
+    H5O_VIRTUAL_STATUS_SEL_BOUNDS,      /* Space extent set to bounds of selection */
+    H5O_VIRTUAL_STATUS_USER,            /* Space extent provided by application */
+    H5O_VIRTUAL_STATUS_CORRECT          /* Space extent matches dataset       */
+} H5O_virtual_space_status_t;
+
+typedef struct H5O_storage_virtual_ent_t {
+    /* Stored */
+    H5O_storage_virtual_srcdset_t source_dset; /* Information about the source dataset */
+    char *source_file_name;             /* Original (unparsed) source file name */
+    char *source_dset_name;             /* Original (unparsed) source dataset name */
+    struct H5S_t *source_select;        /* Selection in the source dataset for mapping */
+
+    /* Not stored */
+    H5O_storage_virtual_srcdset_t *sub_dset; /* Array of sub-source dataset info structs */
+    size_t sub_dset_nalloc;             /* Number of slots allocated in sub_dset */
+    size_t sub_dset_nused;              /* Number of slots "used" in sub_dset - essentially the farthest sub dataset in the extent */
+    size_t sub_dset_io_start;           /* First element in sub_dset involved in current I/O op.  Field has no meaning and may be uninitialized at all other times */
+    size_t sub_dset_io_end;             /* First element in sub_dset outside of current I/O op.  Field has no meaning and may be uninitialized at all other times */
+    H5O_storage_virtual_name_seg_t *parsed_source_file_name; /* Parsed version of source_dset.file_name */
+    size_t psfn_static_strlen;          /* Length of parsed_source_file_name without block number substitutions */
+    size_t psfn_nsubs;                  /* Number of block number substitutions in parsed_source_file_name */
+    H5O_storage_virtual_name_seg_t *parsed_source_dset_name; /* Parsed version of source_dset.dset_name */
+    size_t psdn_static_strlen;          /* Length of parsed_source_dset_name without block number substitutions */
+    size_t psdn_nsubs;                  /* Number of block number substitutions in parsed_source_dset_name */
+    int unlim_dim_source;               /* Unlimited dimension in source_select */
+    int unlim_dim_virtual;              /* Unlimited dimension in virtual_select */
+    hsize_t unlim_extent_source;        /* Extent of unlimited dimension in source dset last time virtual_select was patched to match selection */
+    hsize_t unlim_extent_virtual;       /* Extent of unlimited dimension in virtual dset last time source_select was patched to match selection */
+    hsize_t clip_size_virtual;          /* Size selection would be clipped to in virtual selection, ignoring other mappings, when source extent == unlim_extent_source */
+    hsize_t clip_size_source;           /* Size selection would be clipped to in source selection when virtual extent == unlim_extent_virtual */
+    H5O_virtual_space_status_t source_space_status; /* Extent patching status of source_select */
+    H5O_virtual_space_status_t virtual_space_status; /* Extent patching status of virtual_select */
+} H5O_storage_virtual_ent_t;
+
+typedef struct H5O_storage_virtual_t {
+    /* Stored in message */
+    H5HG_t      serial_list_hobjid;     /* Global heap ID for the list of virtual mapping entries stored on disk */
+
+    /* Stored in heap */
+    size_t      list_nused;             /* Number of array elements used in list    */
+    H5O_storage_virtual_ent_t *list;    /* Array of virtual dataset mapping entries */
+
+    /* Not stored */
+    size_t      list_nalloc;            /* Number of slots allocated          */
+    hsize_t     min_dims[H5S_MAX_RANK]; /* Minimum extent of VDS (maximum of all non-unlimited selection bounds) */
+    H5D_vds_view_t view;                /* Method for calculating the extent of the virtual dataset with unlimited selections */
+    hsize_t     printf_gap;             /* Maximum number of sequential missing source datasets before terminating the search for more */
+    hid_t       source_fapl;            /* FAPL to use to open source files */
+    hid_t       source_dapl;            /* DAPL to use to open source datasets */
+    hbool_t     init;                   /* Whether all information has been completely initialized */
+} H5O_storage_virtual_t;
+
 typedef struct H5O_storage_t {
     H5D_layout_t type;			/* Type of layout                    */
     union {
         H5O_storage_contig_t contig;    /* Information for contiguous storage */
         H5O_storage_chunk_t chunk;      /* Information for chunked storage    */
         H5O_storage_compact_t compact;  /* Information for compact storage    */
+        H5O_storage_virtual_t virt;     /* Information for virtual storage    */
     } u;
 } H5O_storage_t;
 
+typedef struct H5O_layout_chunk_farray_t {
+    /* Creation parameters for fixed array data structure */
+    struct {
+        uint8_t max_dblk_page_nelmts_bits;  /* Log2(Max. # of elements in a data block page) - 
+                                               i.e. # of bits needed to store max. # of elements 
+                                               in a data block page */
+    } cparam;
+} H5O_layout_chunk_farray_t;
+
+typedef struct H5O_layout_chunk_earray_t {
+    /* Creation parameters for extensible array data structure */
+    struct {
+        uint8_t max_nelmts_bits;            /* Log2(Max. # of elements in array) - i.e. # of bits needed to store max. # of elements */
+        uint8_t idx_blk_elmts;              /* # of elements to store in index block */
+        uint8_t data_blk_min_elmts;         /* Min. # of elements per data block */
+        uint8_t sup_blk_min_data_ptrs;      /* Min. # of data block pointers for a super block */
+        uint8_t max_dblk_page_nelmts_bits;       /* Log2(Max. # of elements in data block page) - i.e. # of bits needed to store max. # of elements in data block page */
+    } cparam;
+
+    unsigned    unlim_dim;              /* Rank of unlimited dimension for dataset */
+    uint32_t    swizzled_dim[H5O_LAYOUT_NDIMS]; /* swizzled chunk dimensions */
+    hsize_t    	swizzled_down_chunks[H5O_LAYOUT_NDIMS];	/* swizzled "down" size of number of chunks in each dimension */
+} H5O_layout_chunk_earray_t;
+
+typedef struct H5O_layout_chunk_bt2_t {
+    /* Creation parameters for v2 B-tree data structure */
+    struct {
+	uint32_t node_size;	/* Size of each node (in bytes) */
+	uint8_t split_percent;	/* % full to split nodes */
+	uint8_t merge_percent; 	/* % full to merge nodes */
+    } cparam;
+} H5O_layout_chunk_bt2_t;
+
 typedef struct H5O_layout_chunk_t {
+    H5D_chunk_index_t idx_type;		/* Type of chunk index               */
+    uint8_t     flags;                  /* Chunk layout flags                */
     unsigned	ndims;			/* Num dimensions in chunk           */
     uint32_t	dim[H5O_LAYOUT_NDIMS];	/* Size of chunk in elements         */
+    unsigned    enc_bytes_per_dim;      /* Encoded # of bytes for storing each chunk dimension */
     uint32_t    size;                   /* Size of chunk in bytes            */
     hsize_t     nchunks;                /* Number of chunks in dataset	     */
-    hsize_t     chunks[H5O_LAYOUT_NDIMS]; /* # of chunks in dataset dimensions */
-    hsize_t    	down_chunks[H5O_LAYOUT_NDIMS];	/* "down" size of number of chunks in each dimension */
+    hsize_t     max_nchunks;                       /* Max. number of chunks in dataset	     */
+    hsize_t     chunks[H5O_LAYOUT_NDIMS];          /* # of chunks in each dataset dimension  */
+    hsize_t     max_chunks[H5O_LAYOUT_NDIMS];      /* # of chunks in each dataset's max. dimension */
+    hsize_t    	down_chunks[H5O_LAYOUT_NDIMS];     /* "down" size of number of chunks in each dimension */
+    hsize_t    	max_down_chunks[H5O_LAYOUT_NDIMS]; /* "down" size of number of chunks in each max dim */
+    union {
+        H5O_layout_chunk_farray_t farray; /* Information for fixed array index */
+        H5O_layout_chunk_earray_t earray; /* Information for extensible array index */
+        H5O_layout_chunk_bt2_t btree2; /* Information for v2 B-tree index */
+    } u;
 } H5O_layout_chunk_t;
 
 typedef struct H5O_layout_t {
@@ -425,9 +609,6 @@ typedef struct H5O_layout_t {
     H5O_storage_t storage;              /* Information for storing dataset elements */
 } H5O_layout_t;
 
-/* Enable reading/writing "bogus" messages */
-/* #define H5O_ENABLE_BOGUS */
-
 #ifdef H5O_ENABLE_BOGUS
 /*
  * "Bogus" Message.
@@ -550,6 +731,8 @@ typedef struct H5O_btreek_t {
  * (Data structure in memory)
  */
 typedef struct H5O_drvinfo_t {
+/* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t         cache_info;
     char                name[9];                /* Driver name */
     size_t		len;                    /* Length of encoded buffer */
     uint8_t            *buf;                    /* Buffer for encoded info */
@@ -585,11 +768,27 @@ typedef uint32_t H5O_refcount_t;        /* Contains # of links to object, if >1
  */
 typedef unsigned H5O_unknown_t;         /* Original message type ID */
 
+/*
+ * Free space manager info Message.
+ * Contains file space management info and
+ * addresses of free space managers for file memory
+ * (Data structure in memory)
+ */
+typedef struct H5O_fsinfo_t {
+    H5F_file_space_type_t strategy;	/* File space strategy */
+    hsize_t		  threshold;	/* Free space section threshold */
+    haddr_t     	  fs_addr[H5FD_MEM_NTYPES-1]; /* Addresses of free space managers */
+} H5O_fsinfo_t;
 
 /* Typedef for "application" iteration operations */
 typedef herr_t (*H5O_operator_t)(const void *mesg/*in*/, unsigned idx,
     void *operator_data/*in,out*/);
 
+#ifdef OUT
+/* Typedef for "internal library" iteration operations */
+typedef herr_t (*H5O_lib_operator_t)(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
+    unsigned sequence, hbool_t *oh_modified/*out*/, void *operator_data/*in,out*/);
+#endif
 /* Typedef for "internal library" iteration operations */
 typedef herr_t (*H5O_lib_operator_t)(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/,
     unsigned sequence, unsigned *oh_modified/*out*/, void *operator_data/*in,out*/);
@@ -600,10 +799,8 @@ typedef enum H5O_mesg_operator_type_t {
     H5O_MESG_OP_LIB             /* Library internal callback */
 } H5O_mesg_operator_type_t;
 
-/* To indicate that the object header is just modified */
-#define H5O_MODIFY		0x01
-/* To indicate that the object header is modified and might possibly need to condense messages */
-#define H5O_MODIFY_CONDENSE	0x02
+#define H5O_MODIFY_CONDENSE	0x01
+#define H5O_MODIFY		0x02
 
 typedef struct {
     H5O_mesg_operator_type_t op_type;
@@ -631,7 +828,7 @@ H5_DLL herr_t H5O_create(H5F_t *f, hid_t dxpl_id, size_t size_hint,
 H5_DLL herr_t H5O_open(H5O_loc_t *loc);
 H5_DLL herr_t H5O_close(H5O_loc_t *loc);
 H5_DLL int H5O_link(const H5O_loc_t *loc, int adjust, hid_t dxpl_id);
-H5_DLL H5O_t *H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC_protect_t prot);
+H5_DLL H5O_t *H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, unsigned prot_flags);
 H5_DLL H5O_t *H5O_pin(const H5O_loc_t *loc, hid_t dxpl_id);
 H5_DLL herr_t H5O_unpin(H5O_t *oh);
 H5_DLL herr_t H5O_dec_rc_by_loc(const H5O_loc_t *loc, hid_t dxpl_id);
@@ -654,6 +851,10 @@ H5_DLL herr_t H5O_get_nlinks(const H5O_loc_t *loc, hid_t dxpl_id, hsize_t *nlink
 H5_DLL void *H5O_obj_create(H5F_t *f, H5O_type_t obj_type, void *crt_info, H5G_loc_t *obj_loc, hid_t dxpl_id);
 H5_DLL haddr_t H5O_get_oh_addr(const H5O_t *oh);
 H5_DLL herr_t H5O_get_rc_and_type(const H5O_loc_t *oloc, hid_t dxpl_id, unsigned *rc, H5O_type_t *otype);
+H5_DLL H5O_proxy_t *H5O_pin_flush_dep_proxy(H5O_loc_t *loc, hid_t dxpl_id);
+H5_DLL H5O_proxy_t *H5O_pin_flush_dep_proxy_oh(H5F_t *f, hid_t dxpl_id,
+    H5O_t *oh);
+H5_DLL herr_t H5O_unpin_flush_dep_proxy(H5O_proxy_t *proxy);
 
 /* Object header message routines */
 H5_DLL herr_t H5O_msg_create(const H5O_loc_t *loc, unsigned type_id, unsigned mesg_flags,
@@ -704,6 +905,12 @@ H5_DLL int H5O_msg_get_chunkno(const H5O_loc_t *loc, unsigned type_id, hid_t dxp
 H5_DLL herr_t H5O_msg_lock(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id);
 H5_DLL herr_t H5O_msg_unlock(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id);
 
+/* Object metadata flush/refresh routines */
+H5_DLL herr_t H5O_flush_common(H5O_loc_t *oloc, hid_t obj_id, hid_t dxpl_id);
+H5_DLL herr_t H5O_refresh_metadata(hid_t oid, H5O_loc_t oloc, hid_t dxpl_id);
+H5_DLL herr_t H5O_refresh_metadata_close(hid_t oid, H5O_loc_t oloc, H5G_loc_t *obj_loc, hid_t dxpl_id);
+H5_DLL herr_t H5O_refresh_metadata_reopen(hid_t oid, H5G_loc_t *obj_loc, hid_t dxpl_id, hbool_t start_swmr);
+
 /* Object copying routines */
 H5_DLL herr_t H5O_copy_header_map(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */,
     hid_t dxpl_id, H5O_copy_t *cpy_info, hbool_t inc_depth,
@@ -722,6 +929,7 @@ H5_DLL herr_t H5O_loc_reset(H5O_loc_t *loc);
 H5_DLL herr_t H5O_loc_copy(H5O_loc_t *dst, H5O_loc_t *src, H5_copy_depth_t depth);
 H5_DLL herr_t H5O_loc_hold_file(H5O_loc_t *loc);
 H5_DLL herr_t H5O_loc_free(H5O_loc_t *loc);
+H5_DLL H5O_loc_t *H5O_get_loc(hid_t id);
 
 /* EFL operators */
 H5_DLL hsize_t H5O_efl_total_size(H5O_efl_t *efl);
diff --git a/src/H5Oproxy.c b/src/H5Oproxy.c
new file mode 100644
index 0000000..811e73e
--- /dev/null
+++ b/src/H5Oproxy.c
@@ -0,0 +1,952 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:             H5Oproxy.c
+ *                      February 28 2012
+ *                      Neil Fortner <nfortne2 at hdfgroup.org>
+ *
+ * Purpose:             Implement object header's metadata cache proxy cache
+ *                      methods.
+ *
+ * Note:                Object header proxies exist only to make integrating the
+ *                      object header chunks with the metadata cache's flush
+ *                      dependencies easier and less coupled than directly tying
+ *                      them together.
+ *
+ *                      Object header proxies never exist on disk (hence their
+ *                      lack of a 'load' callback) and their 'flush' callback
+ *                      does nothing.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"          /* Generic Functions                    */
+#include "H5Opkg.h"             /* Object headers                       */
+#include "H5Eprivate.h"         /* Error handling                       */
+#include "H5FLprivate.h"        /* Free Lists                           */
+#include "H5MFprivate.h"        /* File memory management               */
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+
+/********************/
+/* Package Typedefs */
+/********************/
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+/* Metadata cache (H5AC) callbacks */
+static herr_t H5O__cache_proxy_get_load_size(const void *image, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static void *H5O__cache_proxy_deserialize(const void *image, size_t len, void *udata, hbool_t *dirty);
+static herr_t H5O__cache_proxy_image_len(const void *thing, size_t *image_len, hbool_t *compressed_ptr,
+    size_t *compressed_image_len_ptr);
+static herr_t H5O__cache_proxy_serialize(const H5F_t *f, void *image, size_t len, void *thing);
+static herr_t H5O__cache_proxy_notify(H5AC_notify_action_t action, void *thing);
+static herr_t H5O__cache_proxy_free_icr(void *thing);
+
+static herr_t H5O_proxy_depend_core(void *parent, H5O_proxy_t *proxy);
+static herr_t H5O__cache_proxy_dest(H5O_proxy_t *proxy);
+static herr_t H5O_proxy_undepend_core(void *parent, H5O_proxy_t *proxy);
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+const H5AC_class_t H5AC_OHDR_PROXY[1] = {{
+    H5AC_OHDR_PROXY_ID,                	/* Metadata client ID */
+    "Object header proxy",           	/* Metadata client name (for debugging) */
+    H5FD_MEM_OHDR,                     	/* File space memory type for client */
+    H5AC__CLASS_SKIP_READS|H5AC__CLASS_SKIP_WRITES,           /* Client class behavior flags */
+    H5O__cache_proxy_get_load_size,    	/* 'get_load_size' callback */
+    NULL,				/* 'verify_chksum' callback */
+    H5O__cache_proxy_deserialize,    	/* 'deserialize' callback */
+    H5O__cache_proxy_image_len,      	/* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5O__cache_proxy_serialize,       	/* 'serialize' callback */
+    H5O__cache_proxy_notify,		/* 'notify' callback */
+    H5O__cache_proxy_free_icr,        	/* 'free_icr' callback */
+    NULL,                              	/* 'clear' callback */
+    NULL,                              	/* 'fsf_size' callback */
+}};
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Declare a free list to manage H5O_proxy_t objects */
+H5FL_DEFINE_STATIC(H5O_proxy_t);
+
+/* Declare a free list to manage flush dependency parent addr arrays.
+ * Note that this array is used purely for sanity checking -- once we
+ * are pretty sure the code is working properly, it can be removed.
+ *
+ *					JRM -- 12/10/15
+ */
+H5FL_BLK_DEFINE_STATIC(parent_addr);
+
+/* Declare a free list to manage flush dependency parent ptr arrays */
+H5FL_BLK_DEFINE_STATIC(parent_ptr);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O__cache_proxy_get_load_size
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              May 18, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O__cache_proxy_get_load_size(const void *_image, void H5_ATTR_UNUSED *_udata, 
+    size_t *image_len, size_t H5_ATTR_UNUSED *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, 
+    size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
+{
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(image_len);
+
+    if(image == NULL) {
+	/* Set the image length size */
+	/* Object header proxies are represented as 1 byte in cache */
+	/* (would be 0 bytes, but cache won't allow it currently.  See
+	* H5D_cache_proxy_size) */
+	*image_len = 1;
+    }
+    /* Nothing to do for non-NULL image: no need to compute actual_len */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O__cache_proxy_get_load_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O__cache_proxy_deserialize
+ *
+ * Purpose:     Creates an object header proxy and creates flush
+ *              dependencies from all object header chunks on this proxy.
+ *
+ * Return:      Success:        Pointer to a new object header proxy
+ *              Failure:        NULL
+ *
+ * Programmer:  Neil Fortner
+ *              Mar 15 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5O__cache_proxy_deserialize(const void H5_ATTR_UNUSED *_image, size_t H5_ATTR_UNUSED len, void *_udata,
+    hbool_t H5_ATTR_UNUSED *dirty)
+{
+    H5O_proxy_t          *proxy = NULL;				/* Object header proxy */
+    H5O_proxy_cache_ud_t *udata = (H5O_proxy_cache_ud_t *)_udata;	/* User data for callback */
+    H5O_proxy_t          *ret_value = NULL;  				/* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* check arguments */
+    HDassert(udata);
+
+    /* Create object header proxy object & initialize fields */
+    if(NULL == (proxy = H5FL_MALLOC(H5O_proxy_t)))
+        HGOTO_ERROR(H5E_OHDR, H5E_NOSPACE, NULL, "can't allocate object header proxy")
+    HDmemset(&proxy->cache_info, 0, sizeof(H5AC_info_t));
+
+    proxy->f = udata->f;
+    proxy->oh = udata->oh;
+
+    proxy->oh_fd_parent_addr = HADDR_UNDEF;
+    proxy->oh_fd_parent_ptr = NULL;
+
+    proxy->chk_fd_parent_count = 0;
+    proxy->chk_fd_parent_alloc = 0;
+    proxy->chk_fd_parent_addrs = NULL;
+    proxy->chk_fd_parent_ptrs = NULL;
+
+    /* Set return value */
+    ret_value = proxy;
+
+done:
+    if(!ret_value && proxy)
+        if(H5O__cache_proxy_dest(proxy) < 0)
+            HDONE_ERROR(H5E_OHDR, H5E_CANTFREE, NULL, "unable to destroy object header proxy")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__cache_proxy_deserialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5B2__cache_hdr_image_len
+ *
+ * Purpose:     Compute the size of the data structure on disk.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Quincey Koziol
+ *              koziol at hdfgroup.org
+ *              May 20, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O__cache_proxy_image_len(const void H5_ATTR_UNUSED *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(image_len);
+
+    /* Set the image length size */
+    /* Object header proxies are represented as 1 byte in cache */
+    /* (would be 0 bytes, but cache won't allow it currently.  See
+     * H5D_cache_proxy_size) */
+    *image_len = 1;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5O__cache_proxy_image_len() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O__cache_proxy_serialize
+ *
+ * Purpose:	A no-op
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		koziol at ncsa.uiuc.edu
+ *		Feb 2 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O__cache_proxy_serialize(const H5F_t H5_ATTR_UNUSED *f, void H5_ATTR_UNUSED *_image, size_t H5_ATTR_UNUSED len,
+    void H5_ATTR_UNUSED *_thing)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* A no-op */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* H5O__cache_proxy_serialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O__cache_proxy_notify
+ *
+ * Purpose:     Handle cache action notifications
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              nfortne2 at hdfgroup.org
+ *              Apr 25 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O__cache_proxy_notify(H5AC_notify_action_t action, void *_thing)
+{
+    H5O_proxy_t *proxy = (H5O_proxy_t *)_thing;
+    H5O_chunk_proxy_t *chk_proxy = NULL; 	/* Object header chunk proxy */
+    unsigned i;                         	/* Local index variable */
+    herr_t ret_value = SUCCEED;         	/* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /*
+     * Check arguments.
+     */
+    HDassert(proxy);
+    HDassert(proxy->f);
+    HDassert(proxy->oh);
+    HDassert(proxy->oh->swmr_write);
+
+    switch(action) {
+        case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+	case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+            /* Create flush dependency on object header chunk 0 */
+            if(H5O_proxy_depend_core(proxy->oh, proxy) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+
+            /* Create flush dependencies on all other object header chunks */
+            for(i = 1; i < proxy->oh->nchunks; i++) {
+                if(NULL == (chk_proxy = H5O_chunk_protect(proxy->f, H5AC_ind_dxpl_id, proxy->oh, i)))
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk")
+/* same as before, but looks backward...need to check into that..(proxy, chk_proxy) */
+                if(H5O_proxy_depend_core(chk_proxy, proxy) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+                if(H5O_chunk_unprotect(proxy->f, H5AC_ind_dxpl_id, chk_proxy, FALSE) < 0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+                chk_proxy = NULL;
+            } /* end for */
+
+            /* Mark proxy as present on the object header */
+            proxy->oh->proxy_present = TRUE;
+
+            break;
+
+	case H5AC_NOTIFY_ACTION_AFTER_FLUSH:
+	    /* do nothing */
+	    break;
+
+        case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+	    HDassert(proxy->oh_fd_parent_addr != HADDR_UNDEF);
+            HDassert(proxy->oh_fd_parent_ptr != NULL);
+
+	    if(H5O_proxy_undepend_core(proxy->oh_fd_parent_ptr, proxy) < 0)
+                HGOTO_ERROR(H5E_OHDR, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency with object header")
+
+	    while(proxy->chk_fd_parent_count > 0){
+
+		i = proxy->chk_fd_parent_count - 1;
+
+	        if(H5O_proxy_undepend_core(proxy->chk_fd_parent_ptrs[i], proxy)<0)
+                    HGOTO_ERROR(H5E_OHDR, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency with object header continuation chunk")
+	    }
+
+            /* Mark proxy as not present on the object header */
+            proxy->oh->proxy_present = FALSE;
+            break;
+
+        default:
+#ifdef NDEBUG
+            HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, FAIL, "unknown action from metadata cache")
+#else /* NDEBUG */
+            HDassert(0 && "Unknown action?!?");
+#endif /* NDEBUG */
+    } /* end switch */
+
+done:
+    if(chk_proxy) {
+        HDassert(ret_value < 0);
+        if(H5O_chunk_unprotect(proxy->f, H5AC_ind_dxpl_id, chk_proxy, FALSE) < 0)
+            HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* end H5O__cache_proxy_notify() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5O__cache_proxy_free_icr
+ *
+ * Purpose:	Destroy/release an "in core representation" of a data
+ *              structure
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Mar 15 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O__cache_proxy_free_icr(void *_thing)
+{
+    H5O_proxy_t *proxy = (H5O_proxy_t *)_thing;
+    herr_t ret_value = SUCCEED;     		/* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    if(H5O__cache_proxy_dest(proxy) < 0)
+	HGOTO_ERROR(H5E_OHDR, H5E_CANTFREE, FAIL, "unable to destroy object header proxy")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5O__cache_proxy_free_icr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_cache_proxy_dest
+ *
+ * Purpose:     Destroys an object header proxy in memory.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Mar 15 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O__cache_proxy_dest(H5O_proxy_t *proxy)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(proxy);
+    HDassert(proxy->oh);
+
+    /* Free the object header proxy object */
+    proxy = H5FL_FREE(H5O_proxy_t, proxy);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O__cache_proxy_dest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_proxy_create
+ *
+ * Purpose:     Allocate temporary space for the object header proxy.  We
+ *              save the actual creation of the proxy to the "load"
+ *              callback, to save time for objects that do not have any
+ *              flush dependency children and to simplify the code.  The
+ *              load callback needs to  set up the flush dependencies
+ *              anyways because the proxy cannot stay pinned by the object
+ *              header or it would be imnpossible to evict the two due to
+ *              the circular dependencies.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Mar 15 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_proxy_create(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t *oh)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(f);
+    HDassert(oh);
+
+    /* Get a temp. address for object header proxy */
+    if(HADDR_UNDEF == (oh->proxy_addr = H5MF_alloc_tmp(f, (hsize_t)1)))
+        HGOTO_ERROR(H5E_OHDR, H5E_NOSPACE, FAIL, "file allocation failed for object header proxy")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_proxy_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_proxy_pin
+ *
+ * Purpose:     Returns the proxy object for the specified object header,
+ *              pinned.  This proxy can be used as a flush dependency
+ *              parent for items that depend on this object header.
+ *
+ * Return:      Success:        Pointer to a pinned object header proxy
+ *              Failure:        NULL
+ *
+ * Programmer:  Neil Fortner
+ *              Mar 15 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+H5O_proxy_t *
+H5O_proxy_pin(H5F_t *f, hid_t dxpl_id, H5O_t *oh)
+{
+    H5O_proxy_t *proxy = NULL;          /* Object header proxy */
+    H5O_proxy_cache_ud_t udata;		/* User-data for callback */
+    H5O_proxy_t *ret_value = NULL;      /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(f);
+    HDassert(oh);
+    HDassert(H5F_addr_defined(oh->proxy_addr));
+
+    udata.f = f;
+    udata.oh  = oh;
+    /* Protect the object header proxy */
+    if(NULL == (proxy = (H5O_proxy_t *)H5AC_protect(f, dxpl_id, H5AC_OHDR_PROXY, oh->proxy_addr, &udata, H5AC__READ_ONLY_FLAG)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to protect object header proxy");
+
+    /* Unprotect the object header proxy and pin it */
+    if(H5AC_unprotect(f, dxpl_id, H5AC_OHDR_PROXY, oh->proxy_addr, proxy, H5AC__PIN_ENTRY_FLAG) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, NULL, "unable to unprotect object header proxy");
+
+    /* Set return value */
+    ret_value = proxy;
+    proxy = NULL;
+
+done:
+    if(proxy) {
+        HDassert(!ret_value);
+        if(H5AC_unprotect(f, dxpl_id, H5AC_OHDR_PROXY, oh->proxy_addr, proxy, H5AC__NO_FLAGS_SET) < 0)
+            HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, NULL, "unable to unprotect object header proxy");
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_proxy_pin() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_proxy_unpin
+ *
+ * Purpose:     Unpins the specified object header proxy from the cache.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Mar 15 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_proxy_unpin(H5O_proxy_t *proxy)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(proxy);
+
+    /* Unpin the object header proxy */
+    if(H5AC_unpin_entry(proxy) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPIN, FAIL, "unable to unpin object header proxy")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_proxy_unpin() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_proxy_depend
+ *
+ * Purpose:     Creates a flush dependency between the object header proxy
+ *              (as child) and the specified object (as parent).
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Mar 20 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_proxy_depend(H5F_t *f, hid_t dxpl_id, H5O_t *oh, void *parent)
+{
+    H5O_proxy_t *proxy = NULL;          /* Object header proxy */
+    H5O_proxy_cache_ud_t udata;         /* User-data for callback */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(f);
+    HDassert(oh);
+
+    HDassert(H5F_addr_defined(oh->proxy_addr));
+    HDassert(parent);
+    HDassert(((H5C_cache_entry_t *)parent)->magic == 
+             H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(((H5C_cache_entry_t *)parent)->type);
+    HDassert((((H5C_cache_entry_t *)(parent))->type->id == H5AC_OHDR_ID) ||
+             (((H5C_cache_entry_t *)(parent))->type->id == H5AC_OHDR_CHK_ID));
+
+    udata.f = f;
+    udata.oh  = oh;
+    /* Protect the object header proxy */
+    if(NULL == (proxy = (H5O_proxy_t *)H5AC_protect(f, dxpl_id, H5AC_OHDR_PROXY, oh->proxy_addr, &udata, H5AC__READ_ONLY_FLAG)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header proxy");
+
+    /* Add the flush dependency on the parent object */
+    if(H5O_proxy_depend_core(parent, proxy) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+
+    /* Unprotect the object header proxy */
+    if(H5AC_unprotect(f, dxpl_id, H5AC_OHDR_PROXY, oh->proxy_addr, proxy, H5AC__NO_FLAGS_SET) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header proxy");
+    proxy = NULL;
+
+done:
+    if(proxy) {
+        HDassert(ret_value < 0);
+        if(H5AC_unprotect(f, dxpl_id, H5AC_OHDR_PROXY, oh->proxy_addr, proxy, H5AC__NO_FLAGS_SET) < 0)
+            HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header proxy");
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_proxy_depend() */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_proxy_depend_core
+ *
+ * Purpose:     Creates a flush dependency between the object header proxy
+ *              (as child) and the specified object (as parent).
+ *
+ *		This function accepts a pointer to the proxy, which it 
+ *		assumes is somehow locked in the cache.  In general, this
+ *		means the proxy is protected, however, this is not necessary
+ *		when called from the proxy notify routine.
+ *
+ *		It also handles the book keeping required to track the flush
+ *		dependency parent of the object header proxy.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              12/08/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_proxy_depend_core(void *parent, H5O_proxy_t *proxy)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(parent);
+    HDassert(((H5C_cache_entry_t *)parent)->magic == 
+             H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(((H5C_cache_entry_t *)parent)->type);
+    HDassert((((H5C_cache_entry_t *)(parent))->type->id == H5AC_OHDR_ID) ||
+             (((H5C_cache_entry_t *)(parent))->type->id == H5AC_OHDR_CHK_ID));
+    HDassert(proxy);
+    HDassert(proxy->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(proxy->cache_info.type);
+    HDassert(proxy->cache_info.type->id == H5AC_OHDR_PROXY_ID);
+
+    /* Add the flush dependency on the parent object */
+    if(H5AC_create_flush_dependency(parent, proxy) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTDEPEND, FAIL, "unable to create flush dependency")
+
+    /* make record of the flush dependency relationship */
+    if(((H5C_cache_entry_t *)(parent))->type->id == H5AC_OHDR_ID) {
+
+	HDassert(proxy->oh_fd_parent_addr == HADDR_UNDEF);
+	HDassert(proxy->oh_fd_parent_ptr == NULL);
+
+	proxy->oh_fd_parent_addr = ((H5C_cache_entry_t *)parent)->addr;
+        proxy->oh_fd_parent_ptr = parent;
+
+    } else {
+
+	HDassert(((H5C_cache_entry_t *)(parent))->type->id == H5AC_OHDR_CHK_ID);
+
+        /* check to see if we need to resize the chunk fd parent arrays */
+        if ( proxy->chk_fd_parent_count >= proxy->chk_fd_parent_alloc ) {
+
+            if ( proxy->chk_fd_parent_alloc == 0 ) {
+
+	        /* must allocate arrays */
+	        if ( NULL == (proxy->chk_fd_parent_addrs = (haddr_t *)
+		    	        H5FL_BLK_MALLOC(parent_addr, 
+				    H5O_FD_PAR_LIST_BASE * sizeof(haddr_t))) )
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for flush dependency parent addr list")
+
+	        if ( NULL == (proxy->chk_fd_parent_ptrs = (void **)
+		    	        H5FL_BLK_MALLOC(parent_ptr, 
+				    H5O_FD_PAR_LIST_BASE * sizeof(void *))) )
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for flush dependency parent ptr list")
+
+	        proxy->chk_fd_parent_alloc = H5O_FD_PAR_LIST_BASE;
+
+	    } else {
+
+		/* resize existing arrays */
+		HDassert(proxy->chk_fd_parent_addrs);
+		HDassert(proxy->chk_fd_parent_ptrs);
+
+		if ( NULL == (proxy->chk_fd_parent_addrs = (haddr_t *)
+				H5FL_BLK_REALLOC(parent_addr,
+					proxy->chk_fd_parent_addrs,
+					2 * proxy->chk_fd_parent_alloc * 
+                                	sizeof(haddr_t))) )
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory reallocation failed for flush dependency parent addr list")
+
+		if ( NULL == (proxy->chk_fd_parent_ptrs = (void **)
+				H5FL_BLK_REALLOC(parent_ptr,
+					proxy->chk_fd_parent_ptrs,
+					2 * proxy->chk_fd_parent_alloc * 
+                                	sizeof(void *))) )
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory reallocation failed for flush dependency parent ptr list")
+
+	        proxy->chk_fd_parent_alloc *= 2;
+            }
+	}
+
+	HDassert(proxy->chk_fd_parent_count < proxy->chk_fd_parent_alloc);
+
+	(proxy->chk_fd_parent_addrs)[proxy->chk_fd_parent_count] = 
+		((H5C_cache_entry_t *)(parent))->addr;
+
+	(proxy->chk_fd_parent_ptrs)[proxy->chk_fd_parent_count] = parent;
+
+	(proxy->chk_fd_parent_count)++;
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* end H5O_proxy_depend_core() */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_proxy_undepend
+ *
+ * Purpose:     Destroys the flush dependency between the object header
+ *              proxy (as child) and the specified object (as parent).
+ *
+ *		Update: This function also seems to be used to delete
+ *		flush dependencies between object header proxy (as child)
+ *		and object header chunk continuations (as parent)
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Mar 20 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5O_proxy_undepend(H5F_t *f, hid_t dxpl_id, H5O_t *oh, void *parent)
+{
+    H5O_proxy_t *proxy = NULL;          /* Object header proxy */
+    H5O_proxy_cache_ud_t udata;         /* User-data for callback */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(f);
+    HDassert(oh);
+    HDassert(H5F_addr_defined(oh->proxy_addr));
+    HDassert(parent);
+
+    udata.f = f;
+    udata.oh  = oh;
+    /* Protect the object header proxy */
+    if(NULL == (proxy = (H5O_proxy_t *)H5AC_protect(f, dxpl_id, H5AC_OHDR_PROXY, oh->proxy_addr, &udata, H5AC__READ_ONLY_FLAG)))
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header proxy");
+
+    /* destroy the flush dependency on the parent object */
+    if(H5O_proxy_undepend_core(parent, proxy) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+
+    /* Unprotect the object header proxy */
+    if(H5AC_unprotect(f, dxpl_id, H5AC_OHDR_PROXY, oh->proxy_addr, proxy, H5AC__NO_FLAGS_SET) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header proxy");
+    proxy = NULL;
+
+done:
+    if(proxy) {
+        HDassert(ret_value < 0);
+        if(H5AC_unprotect(f, dxpl_id, H5AC_OHDR_PROXY, oh->proxy_addr, proxy, H5AC__NO_FLAGS_SET) < 0)
+            HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header proxy");
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5O_proxy_undepend() */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5O_proxy_undepend_core
+ *
+ * Purpose:     Destroys the flush dependency between the object header
+ *              proxy (as child) and the specified object (as parent).
+ *
+ *		Also update records of the flush dependency parents of 
+ *		the object header proxy so that they can be taken down
+ *		on notification of object header proxy eviction.
+ *
+ *		Unlike H5O_proxy_undepend, this function does not 
+ *		protect and unprotect the object header proxy.  Instead,
+ *		it takes a pointer to the object header proxy as a 
+ *		parameter, and presumes that the proxy is protected or 
+ *		otherwise locked in the metadata cache.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  John Mainzer
+ *              12/8/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5O_proxy_undepend_core(void *parent, H5O_proxy_t *proxy)
+{
+    unsigned i;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(parent);
+
+#ifndef NDEBUG
+    /* do sanity checks */
+    HDassert(parent);
+    HDassert(((H5C_cache_entry_t *)parent)->magic == 
+             H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(((H5C_cache_entry_t *)parent)->type);
+    HDassert((((H5C_cache_entry_t *)(parent))->type->id == H5AC_OHDR_ID) ||
+             (((H5C_cache_entry_t *)(parent))->type->id == H5AC_OHDR_CHK_ID));
+
+    if ( (((H5C_cache_entry_t *)(parent))->type->id == H5AC_OHDR_ID) ) {
+
+	HDassert(proxy->oh_fd_parent_addr != HADDR_UNDEF);
+	HDassert(proxy->oh_fd_parent_ptr != NULL);
+	HDassert(proxy->oh_fd_parent_addr ==
+                 (((H5C_cache_entry_t *)(parent))->addr));
+	HDassert(proxy->oh_fd_parent_ptr == parent);
+
+    } else {
+
+	hbool_t found = FALSE;
+
+	HDassert(proxy->chk_fd_parent_alloc > 0);
+	HDassert(proxy->chk_fd_parent_count > 0);
+	HDassert(proxy->chk_fd_parent_addrs);
+	HDassert(proxy->chk_fd_parent_ptrs);
+
+	for( i = 0; i < proxy->chk_fd_parent_count; i++ ) {
+
+            if ( proxy->chk_fd_parent_ptrs[i] == parent ) {
+
+		found = TRUE;
+                break;
+            }
+        }
+
+	HDassert(found);
+	HDassert(proxy->chk_fd_parent_addrs[i] == 
+		 (((H5C_cache_entry_t *)(parent))->addr));
+    }
+#endif /* NDEBUG */
+
+    /* destroy the flush dependency on the parent object */
+    if(H5AC_destroy_flush_dependency(parent, proxy) < 0)
+        HGOTO_ERROR(H5E_OHDR, H5E_CANTUNDEPEND, FAIL, "unable to destroy flush dependency")
+
+    /* delete parent from object header's list of parents */
+    if ( (((H5C_cache_entry_t *)(parent))->type->id == H5AC_OHDR_ID) ) {
+
+	proxy->oh_fd_parent_addr = HADDR_UNDEF;
+	proxy->oh_fd_parent_ptr = NULL;
+
+    } else {
+
+	/* find parent in parent ptrs array */
+	for ( i = 0; i < proxy->chk_fd_parent_count; i++ ) {
+
+            if ( proxy->chk_fd_parent_ptrs[i] == parent ) {
+
+                break;
+	    }
+        }
+
+        if ( i == proxy->chk_fd_parent_count )
+
+            HGOTO_ERROR(H5E_OHDR, H5E_CANTUNDEPEND, FAIL, "Parent entry isn't in chunk fd parent list")
+
+	/* Remove parent entry from chunk fd parent ptr and addr lists */
+        if ( i < proxy->chk_fd_parent_count - 1 ) {
+
+            HDmemmove(&proxy->chk_fd_parent_addrs[i],
+                      &proxy->chk_fd_parent_addrs[i+1],
+                      (proxy->chk_fd_parent_count - i - 1)
+                       * sizeof(proxy->chk_fd_parent_addrs[0]));
+
+            HDmemmove(&proxy->chk_fd_parent_ptrs[i],
+                      &proxy->chk_fd_parent_ptrs[i+1],
+                      (proxy->chk_fd_parent_count - i - 1)
+                       * sizeof(proxy->chk_fd_parent_ptrs[0]));
+	}
+
+    	proxy->chk_fd_parent_count--;
+
+	/* shrink or free the fd parent ptr and addr lists as appropriate */
+        if( proxy->chk_fd_parent_count == 0 ) {
+
+            proxy->chk_fd_parent_addrs = (haddr_t *)
+		H5FL_BLK_FREE(parent_addr, proxy->chk_fd_parent_addrs);
+
+            proxy->chk_fd_parent_ptrs = (void **)
+		H5FL_BLK_FREE(parent_ptr, proxy->chk_fd_parent_ptrs);
+
+	    proxy->chk_fd_parent_alloc = 0;
+
+        } 
+        else if ( ( proxy->chk_fd_parent_count > H5O_FD_PAR_LIST_BASE ) &&
+                  ( proxy->chk_fd_parent_count <= 
+                    (proxy->chk_fd_parent_alloc / 4) ) ) {
+
+            if ( NULL == (proxy->chk_fd_parent_addrs = (haddr_t *)
+		    H5FL_BLK_REALLOC(parent_addr, proxy->chk_fd_parent_addrs, 
+				     (proxy->chk_fd_parent_alloc / 4) * 
+					sizeof(haddr_t))) )
+
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory reallocation failed for chk fd parent addr list")
+
+            if ( NULL == (proxy->chk_fd_parent_ptrs = (void **)
+		    H5FL_BLK_REALLOC(parent_ptr, proxy->chk_fd_parent_ptrs, 
+				     (proxy->chk_fd_parent_alloc / 4) * 
+					sizeof(void *))) )
+
+                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory reallocation failed for chk fd parent ptr list")
+
+            proxy->chk_fd_parent_alloc /= 4;
+
+        } /* end if */
+    }
+
+done:
+
+    FUNC_LEAVE_NOAPI(ret_value)
+
+} /* end H5O_proxy_undepend_core() */
+
diff --git a/src/H5Opublic.h b/src/H5Opublic.h
index 32945e8..dec7b5b 100644
--- a/src/H5Opublic.h
+++ b/src/H5Opublic.h
@@ -182,6 +182,11 @@ H5_DLL herr_t H5Ovisit_by_name(hid_t loc_id, const char *obj_name,
     H5_index_t idx_type, H5_iter_order_t order, H5O_iterate_t op,
     void *op_data, hid_t lapl_id);
 H5_DLL herr_t H5Oclose(hid_t object_id);
+H5_DLL herr_t H5Oflush(hid_t obj_id);
+H5_DLL herr_t H5Orefresh(hid_t oid);
+H5_DLL herr_t H5Odisable_mdc_flushes(hid_t object_id);
+H5_DLL herr_t H5Oenable_mdc_flushes(hid_t object_id);
+H5_DLL herr_t H5Oare_mdc_flushes_disabled(hid_t object_id, hbool_t *are_disabled);
 
 /* Symbols defined for compatibility with previous versions of the HDF5 API.
  *
@@ -193,7 +198,7 @@ H5_DLL herr_t H5Oclose(hid_t object_id);
 
 /* Typedefs */
 
-/* A struct that's part of the H5G_stat_t routine (deprecated) */
+/* A struct that's part of the H5G_stat_t structure (deprecated) */
 typedef struct H5O_stat_t {
     hsize_t size;               /* Total size of object header in file */
     hsize_t free;               /* Free space within object header */
diff --git a/src/H5Orefcount.c b/src/H5Orefcount.c
index f5c7e25..ff7dfee 100644
--- a/src/H5Orefcount.c
+++ b/src/H5Orefcount.c
@@ -24,7 +24,8 @@
  *-------------------------------------------------------------------------
  */
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
@@ -93,8 +94,8 @@ static void *
 H5O_refcount_decode(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
     unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
 {
-    H5O_refcount_t *refcount = NULL;  /* Reference count */
-    void        *ret_value;     /* Return value */
+    H5O_refcount_t *refcount = NULL;    /* Reference count */
+    void *ret_value = NULL;             /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -177,9 +178,9 @@ H5O_refcount_encode(H5F_t H5_ATTR_UNUSED *f, hbool_t H5_ATTR_UNUSED disable_shar
 static void *
 H5O_refcount_copy(const void *_mesg, void *_dest)
 {
-    const H5O_refcount_t   *refcount = (const H5O_refcount_t *)_mesg;
-    H5O_refcount_t         *dest = (H5O_refcount_t *) _dest;
-    void                *ret_value;     /* Return value */
+    const H5O_refcount_t    *refcount = (const H5O_refcount_t *)_mesg;
+    H5O_refcount_t          *dest = (H5O_refcount_t *) _dest;
+    void                    *ret_value = NULL;  /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
diff --git a/src/H5Osdspace.c b/src/H5Osdspace.c
index 8d357c2..28021de 100644
--- a/src/H5Osdspace.c
+++ b/src/H5Osdspace.c
@@ -13,8 +13,8 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#define H5O_PACKAGE	/*suppress error about including H5Opkg	  */
-#define H5S_PACKAGE		/*prevent warning from including H5Spkg.h */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+#define H5S_FRIEND		/*prevent warning from including H5Spkg.h */
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Dprivate.h"		/* Datasets				*/
@@ -115,9 +115,9 @@ H5O_sdspace_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED
     unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
 {
     H5S_extent_t	*sdim = NULL;/* New extent dimensionality structure */
-    void		*ret_value;
-    unsigned		i;		/* local counting variable */
     unsigned		flags, version;
+    unsigned		i;                      /* Local counting variable */
+    void                *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -302,7 +302,7 @@ H5O_sdspace_copy(const void *_mesg, void *_dest)
 {
     const H5S_extent_t	   *mesg = (const H5S_extent_t *)_mesg;
     H5S_extent_t	   *dest = (H5S_extent_t *)_dest;
-    void                   *ret_value;          /* Return value */
+    void                   *ret_value = NULL;   /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -312,7 +312,7 @@ H5O_sdspace_copy(const void *_mesg, void *_dest)
 	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
 
     /* Copy extent information */
-    if(H5S_extent_copy(dest, mesg, TRUE) < 0)
+    if(H5S_extent_copy_real(dest, mesg, TRUE) < 0)
         HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, NULL, "can't copy extent")
 
     /* Set return value */
@@ -352,7 +352,7 @@ static size_t
 H5O_sdspace_size(const H5F_t *f, const void *_mesg)
 {
     const H5S_extent_t	*space = (const H5S_extent_t *)_mesg;
-    size_t		ret_value;
+    size_t		ret_value = 0;  /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -467,7 +467,7 @@ H5O_sdspace_pre_copy_file(H5F_t H5_ATTR_UNUSED *file_src, const void *mesg_src,
             HGOTO_ERROR(H5E_DATASPACE, H5E_NOSPACE, FAIL, "dataspace extent allocation failed")
 
         /* Create a copy of the dataspace extent */
-        if(H5S_extent_copy(udata->src_space_extent, src_space_extent, TRUE) < 0)
+        if(H5S_extent_copy_real(udata->src_space_extent, src_space_extent, TRUE) < 0)
             HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "can't copy extent")
     } /* end if */
 
diff --git a/src/H5Oshared.c b/src/H5Oshared.c
index bd1bb07..25baa88 100644
--- a/src/H5Oshared.c
+++ b/src/H5Oshared.c
@@ -30,7 +30,7 @@
 /* Module Setup */
 /****************/
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
 
 
 /***********/
@@ -313,7 +313,7 @@ H5O_shared_decode(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned *ioflags,
 {
     H5O_shared_t sh_mesg;       /* Shared message info */
     unsigned version;           /* Shared message version */
-    void *ret_value;            /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -477,7 +477,7 @@ H5O_set_shared(H5O_shared_t *dst, const H5O_shared_t *src)
 size_t
 H5O_shared_size(const H5F_t *f, const H5O_shared_t *sh_mesg)
 {
-    size_t ret_value;           /* Return value */
+    size_t ret_value = 0;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -618,8 +618,14 @@ H5O_shared_copy_file(H5F_t *file_src, H5F_t *file_dst,
      */
     if(shared_src->type != H5O_SHARE_TYPE_COMMITTED) {
         /* Simulate trying to share new message in the destination file. */
+        /* Set copied metadata tag */
+        H5_BEGIN_TAG(dxpl_id, H5AC__COPIED_TAG, FAIL);
+
         if(H5SM_try_share(file_dst, dxpl_id, NULL, H5SM_DEFER, mesg_type->id, _native_dst, mesg_flags) < 0)
-            HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to determine if message should be shared")
+            HGOTO_ERROR_TAG(H5E_OHDR, H5E_WRITEERROR, FAIL, "unable to determine if message should be shared")
+
+        /* Reset metadata tag */
+        H5_END_TAG(FAIL);
     } /* end if */
     else {
         /* Mark the message as committed - as it will be committed in post copy
diff --git a/src/H5Oshared.h b/src/H5Oshared.h
index 2ac2a98..e8d620a 100644
--- a/src/H5Oshared.h
+++ b/src/H5Oshared.h
@@ -51,7 +51,7 @@ static H5_INLINE void *
 H5O_SHARED_DECODE(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned mesg_flags,
     unsigned *ioflags, const uint8_t *p)
 {
-    void *ret_value;            /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -166,7 +166,7 @@ static H5_INLINE size_t
 H5O_SHARED_SIZE(const H5F_t *f, hbool_t disable_shared, const void *_mesg)
 {
     const H5O_shared_t *sh_mesg = (const H5O_shared_t *)_mesg;     /* Pointer to shared message portion of actual message */
-    size_t ret_value;           /* Return value */
+    size_t ret_value = 0;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -324,7 +324,7 @@ H5O_SHARED_COPY_FILE(H5F_t *file_src, void *_native_src, H5F_t *file_dst,
     void *udata, hid_t dxpl_id)
 {
     void *dst_mesg = NULL;      /* Destination message */
-    void *ret_value;            /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
diff --git a/src/H5Oshmesg.c b/src/H5Oshmesg.c
index deb10ab..a506ce2 100644
--- a/src/H5Oshmesg.c
+++ b/src/H5Oshmesg.c
@@ -21,7 +21,8 @@
  *              information in the superblock extension.
  */
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
@@ -79,8 +80,8 @@ static void *
 H5O_shmesg_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
     unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
 {
-    H5O_shmesg_table_t	*mesg;          /* Native message */
-    void                *ret_value;     /* Return value */
+    H5O_shmesg_table_t	*mesg;                  /* Native message */
+    void		*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -156,7 +157,7 @@ H5O_shmesg_copy(const void *_mesg, void *_dest)
 {
     const H5O_shmesg_table_t	*mesg = (const H5O_shmesg_table_t *)_mesg;
     H5O_shmesg_table_t		*dest = (H5O_shmesg_table_t *)_dest;
-    void			*ret_value;
+    void			*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -194,7 +195,7 @@ done:
 static size_t
 H5O_shmesg_size(const H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, const void H5_ATTR_UNUSED *_mesg)
 {
-    size_t                   ret_value;
+    size_t ret_value = 0;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
diff --git a/src/H5Ostab.c b/src/H5Ostab.c
index cfbaacb..bb39e58 100644
--- a/src/H5Ostab.c
+++ b/src/H5Ostab.c
@@ -24,8 +24,9 @@
  *-------------------------------------------------------------------------
  */
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#define H5G_FRIEND		/*suppress error about including H5Gpkg   */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
@@ -101,7 +102,7 @@ H5O_stab_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *op
     unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags, const uint8_t *p)
 {
     H5O_stab_t          *stab = NULL;
-    void                *ret_value;     /* Return value */
+    void                *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -180,9 +181,9 @@ H5O_stab_encode(H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, uint8_t *p, con
 static void *
 H5O_stab_copy(const void *_mesg, void *_dest)
 {
-    const H5O_stab_t       *stab = (const H5O_stab_t *) _mesg;
-    H5O_stab_t             *dest = (H5O_stab_t *) _dest;
-    void                *ret_value;     /* Return value */
+    const H5O_stab_t    *stab = (const H5O_stab_t *) _mesg;
+    H5O_stab_t          *dest = (H5O_stab_t *) _dest;
+    void                *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -222,7 +223,7 @@ done:
 static size_t
 H5O_stab_size(const H5F_t *f, hbool_t H5_ATTR_UNUSED disable_shared, const void H5_ATTR_UNUSED *_mesg)
 {
-    size_t ret_value;   /* Return value */
+    size_t ret_value = 0;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -314,8 +315,8 @@ H5O_stab_copy_file(H5F_t *file_src, void *native_src, H5F_t *file_dst,
     H5O_stab_t          *stab_src = (H5O_stab_t *) native_src;
     H5O_stab_t          *stab_dst = NULL;
     H5G_copy_file_ud_t  *udata = (H5G_copy_file_ud_t *)_udata;
-    size_t              size_hint;              /* Local heap initial size */
-    void                *ret_value;             /* Return value */
+    size_t              size_hint;             /* Local heap initial size */
+    void                *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -331,9 +332,15 @@ H5O_stab_copy_file(H5F_t *file_src, void *native_src, H5F_t *file_dst,
     if(H5HL_get_size(file_src, dxpl_id, stab_src->heap_addr, &size_hint) < 0)
 	HGOTO_ERROR(H5E_SYM, H5E_CANTGETSIZE, NULL, "can't query local heap size")
 
+    /* Set copy metadata tag */
+    H5_BEGIN_TAG(dxpl_id, H5AC__COPIED_TAG, NULL);
+
     /* Create components of symbol table message */
     if(H5G__stab_create_components(file_dst, stab_dst, size_hint, dxpl_id) < 0)
-	HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, NULL, "can't create symbol table components")
+	HGOTO_ERROR_TAG(H5E_SYM, H5E_CANTINIT, NULL, "can't create symbol table components")
+
+    /* Reset metadata tag */
+    H5_END_TAG(NULL);
 
     /* Cache stab in udata */
     udata->cache_type = H5G_CACHED_STAB;
diff --git a/src/H5Otest.c b/src/H5Otest.c
index 0b33e49..1c149e3 100644
--- a/src/H5Otest.c
+++ b/src/H5Otest.c
@@ -23,8 +23,8 @@
 /* Module Setup */
 /****************/
 
-#define H5A_PACKAGE		/*suppress error about including H5Apkg	  */
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#define H5A_FRIEND		/*suppress error about including H5Apkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
 #define H5O_TESTING		/*suppress warning about H5O testing funcs*/
 
 
@@ -99,7 +99,7 @@ H5O_is_attr_dense_test(hid_t oid)
     H5O_t *oh = NULL;           /* Object header */
     H5O_ainfo_t ainfo;          /* Attribute information for object */
     H5O_loc_t *loc;             /* Pointer to object's location */
-    htri_t ret_value;           /* Return value */
+    htri_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -108,7 +108,7 @@ H5O_is_attr_dense_test(hid_t oid)
         HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
 
     /* Get the object header */
-    if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Check for attribute info stored */
@@ -159,12 +159,12 @@ htri_t
 H5O_is_attr_empty_test(hid_t oid)
 {
     H5O_t *oh = NULL;           /* Object header */
-    H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for name index */
+    H5B2_t *bt2_name = NULL;    /* v2 B-tree handle for name index */
     H5O_ainfo_t ainfo;          /* Attribute information for object */
     htri_t ainfo_exists = FALSE;        /* Whether the attribute info exists in the file */
-    H5O_loc_t *loc;            /* Pointer to object's location */
+    H5O_loc_t *loc;             /* Pointer to object's location */
     hsize_t nattrs;             /* Number of attributes */
-    htri_t ret_value;           /* Return value */
+    htri_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -173,7 +173,7 @@ H5O_is_attr_empty_test(hid_t oid)
         HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
 
     /* Get the object header */
-    if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Check for attribute info stored */
@@ -194,9 +194,15 @@ H5O_is_attr_empty_test(hid_t oid)
                 /* Check for any messages in object header */
                 HDassert(nattrs == 0);
 
+                /* Set metadata tag in dxpl_id */
+                H5_BEGIN_TAG(H5AC_ind_dxpl_id, loc->addr, FAIL);
+
                 /* Open the name index v2 B-tree */
                 if(NULL == (bt2_name = H5B2_open(loc->file, H5AC_ind_dxpl_id, ainfo.name_bt2_addr, NULL)))
-                    HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+                    HGOTO_ERROR_TAG(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+
+                /* Reset metadata tag in dxpl_id */
+                H5_END_TAG(FAIL);
 
                 /* Retrieve # of records in name index */
                 if(H5B2_get_nrec(bt2_name, &nattrs) < 0)
@@ -247,9 +253,9 @@ herr_t
 H5O_num_attrs_test(hid_t oid, hsize_t *nattrs)
 {
     H5O_t *oh = NULL;           /* Object header */
-    H5B2_t *bt2_name = NULL;            /* v2 B-tree handle for name index */
+    H5B2_t *bt2_name = NULL;    /* v2 B-tree handle for name index */
     H5O_ainfo_t ainfo;          /* Attribute information for object */
-    H5O_loc_t *loc;            /* Pointer to object's location */
+    H5O_loc_t *loc;             /* Pointer to object's location */
     hsize_t obj_nattrs;         /* Number of attributes */
     herr_t ret_value = SUCCEED; /* Return value */
 
@@ -260,7 +266,7 @@ H5O_num_attrs_test(hid_t oid, hsize_t *nattrs)
         HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
 
     /* Get the object header */
-    if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Check for attribute info stored */
@@ -281,9 +287,15 @@ H5O_num_attrs_test(hid_t oid, hsize_t *nattrs)
             /* Check for any messages in object header */
             HDassert(obj_nattrs == 0);
 
+            /* Set metadata tag in dxpl_id */
+            H5_BEGIN_TAG(H5AC_ind_dxpl_id, loc->addr, FAIL);
+
             /* Open the name index v2 B-tree */
             if(NULL == (bt2_name = H5B2_open(loc->file, H5AC_ind_dxpl_id, ainfo.name_bt2_addr, NULL)))
-                HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+                HGOTO_ERROR_TAG(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+
+            /* Reset metadata tag in dxpl_id */
+            H5_END_TAG(FAIL);
 
             /* Retrieve # of records in name index */
             if(H5B2_get_nrec(bt2_name, &obj_nattrs) < 0)
@@ -345,45 +357,51 @@ H5O_attr_dense_info_test(hid_t oid, hsize_t *name_count, hsize_t *corder_count)
     if(NULL == (loc = H5O_get_loc(oid)))
         HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
 
+    /* Set metadata tag in dxpl_id */
+    H5_BEGIN_TAG(H5AC_ind_dxpl_id, loc->addr, FAIL);
+
     /* Get the object header */
-    if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC_READ)))
-	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
+    if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC__READ_ONLY_FLAG)))
+	HGOTO_ERROR_TAG(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Check for attribute info stored */
     ainfo.fheap_addr = HADDR_UNDEF;
     if(oh->version > H5O_VERSION_1) {
         /* Check for (& retrieve if available) attribute info */
         if(H5A_get_ainfo(loc->file, H5AC_ind_dxpl_id, oh, &ainfo) < 0)
-            HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't check for attribute info message")
+            HGOTO_ERROR_TAG(H5E_ATTR, H5E_CANTGET, FAIL, "can't check for attribute info message")
     } /* end if */
 
     /* Check for 'dense' attribute storage file addresses being defined */
     if(!H5F_addr_defined(ainfo.fheap_addr))
-        HGOTO_DONE(FAIL)
+        HGOTO_DONE_TAG(FAIL, FAIL)
     if(!H5F_addr_defined(ainfo.name_bt2_addr))
-        HGOTO_DONE(FAIL)
+        HGOTO_DONE_TAG(FAIL, FAIL)
 
     /* Open the name index v2 B-tree */
     if(NULL == (bt2_name = H5B2_open(loc->file, H5AC_ind_dxpl_id, ainfo.name_bt2_addr, NULL)))
-        HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
+        HGOTO_ERROR_TAG(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for name index")
 
     /* Retrieve # of records in name index */
     if(H5B2_get_nrec(bt2_name, name_count) < 0)
-        HGOTO_ERROR(H5E_OHDR, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from name index")
+        HGOTO_ERROR_TAG(H5E_OHDR, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from name index")
 
     /* Check if there is a creation order index */
     if(H5F_addr_defined(ainfo.corder_bt2_addr)) {
         /* Open the creation order index v2 B-tree */
         if(NULL == (bt2_corder = H5B2_open(loc->file, H5AC_ind_dxpl_id, ainfo.corder_bt2_addr, NULL)))
-            HGOTO_ERROR(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for creation order index")
+            HGOTO_ERROR_TAG(H5E_OHDR, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for creation order index")
 
         /* Retrieve # of records in creation order index */
         if(H5B2_get_nrec(bt2_corder, corder_count) < 0)
-            HGOTO_ERROR(H5E_OHDR, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from creation order index")
+            HGOTO_ERROR_TAG(H5E_OHDR, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from creation order index")
     } /* end if */
     else
         *corder_count = 0;
 
+    /* Reset metadata tag in dxpl_id */
+    H5_END_TAG(FAIL);
+
 done:
     /* Release resources */
     if(bt2_name && H5B2_close(bt2_name, H5AC_ind_dxpl_id) < 0)
@@ -434,7 +452,7 @@ H5O_check_msg_marked_test(hid_t oid, hbool_t flag_val)
         HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found")
 
     /* Get the object header */
-    if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header")
 
     /* Locate "unknown" message  */
@@ -493,7 +511,7 @@ H5O_expunge_chunks_test(const H5O_loc_t *loc, hid_t dxpl_id)
     FUNC_ENTER_NOAPI(FAIL)
 
     /* Get the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_WRITE)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__NO_FLAGS_SET)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
 
     /* Safety check */
@@ -553,7 +571,7 @@ H5O_get_rc(const H5O_loc_t *loc, hid_t dxpl_id, unsigned *rc)
     HDassert(rc);
 
     /* Get the object header */
-    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ)))
+    if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to protect object header")
 
     /* Save the refcount for the object header */
diff --git a/src/H5Ounknown.c b/src/H5Ounknown.c
index 548f74d..546e839 100644
--- a/src/H5Ounknown.c
+++ b/src/H5Ounknown.c
@@ -24,7 +24,8 @@
  *-------------------------------------------------------------------------
  */
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
+#include "H5Omodule.h"          /* This source code file is part of the H5O module */
+
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
diff --git a/src/H5P.c b/src/H5P.c
index fc19dd1..3d09231 100644
--- a/src/H5P.c
+++ b/src/H5P.c
@@ -22,10 +22,7 @@
 /* Module Setup */
 /****************/
 
-#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5P__init_pub_interface
+#include "H5Pmodule.h"          /* This source code file is part of the H5P module */
 
 
 /***********/
@@ -62,6 +59,9 @@ typedef struct {
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 
 /*****************************/
 /* Library Private Variables */
@@ -74,51 +74,6 @@ typedef struct {
 
 

 /*--------------------------------------------------------------------------
-NAME
-   H5P__init_pub_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5P__init_pub_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5P_init() currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5P__init_pub_interface(void)
-{
-    FUNC_ENTER_STATIC_NOERR
-
-    FUNC_LEAVE_NOAPI(H5P_init())
-} /* H5P__init_pub_interface() */
-
-

-/*--------------------------------------------------------------------------
-NAME
-   H5P__term_pub_interface -- Terminate interface
-USAGE
-    herr_t H5P__term_pub_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Terminates interface.  (Just resets H5_interface_initialize_g
-    currently).
-
---------------------------------------------------------------------------*/
-herr_t
-H5P__term_pub_interface(void)
-{
-    FUNC_ENTER_PACKAGE_NOERR
-
-    /* Mark closed */
-    H5_interface_initialize_g = 0;
-
-    FUNC_LEAVE_NOAPI(0)
-} /* H5P__term_pub_interface() */
-
-

-/*--------------------------------------------------------------------------
  NAME
     H5Pcopy
  PURPOSE
@@ -486,7 +441,7 @@ H5Pregister2(hid_t cls_id, const char *name, size_t size, void *def_value,
 
     /* Create the new property list class */
     orig_pclass = pclass;
-    if((ret_value = H5P_register(&pclass, name, size, def_value, prp_create, prp_set, prp_get, prp_delete, prp_copy, prp_cmp, prp_close)) < 0)
+    if((ret_value = H5P_register(&pclass, name, size, def_value, prp_create, prp_set, prp_get, NULL, NULL, prp_delete, prp_copy, prp_cmp, prp_close)) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to register property in class")
 
     /* Check if the property class changed and needs to be substituted in the ID */
@@ -669,7 +624,8 @@ H5Pinsert2(hid_t plist_id, const char *name, size_t size, void *value,
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "properties >0 size must have default")
 
     /* Create the new property list class */
-    if((ret_value = H5P_insert(plist, name, size, value, prp_set, prp_get, prp_delete, prp_copy, prp_cmp, prp_close)) < 0)
+    if((ret_value = H5P_insert(plist, name, size, value, prp_set, prp_get,
+            NULL, NULL, prp_delete, prp_copy, prp_cmp, prp_close)) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to register property in plist")
 
 done:
@@ -862,6 +818,89 @@ done:
 

 /*--------------------------------------------------------------------------
  NAME
+    H5Pencode
+ PURPOSE
+    Routine to convert the property values in a property list into a binary buffer
+ USAGE
+    herr_t H5Pencode(plist_id, buf, nalloc)
+        hid_t plist_id;         IN: Identifier to property list to encode
+        void *buf:              OUT: buffer to gold the encoded plist
+        size_t *nalloc;         IN/OUT: size of buffer needed to encode plist
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Encodes a property list into a binary buffer. If the buffer is NULL, then
+    the call will set the size needed to encode the plist in nalloc. Otherwise
+    the routine will encode the plist in buf.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Pencode(hid_t plist_id, void *buf, size_t *nalloc)
+{
+    H5P_genplist_t	*plist;         /* Property list to query */
+    herr_t ret_value = SUCCEED;          /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*x*z", plist_id, buf, nalloc);
+
+    /* Check arguments. */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object_verify(plist_id, H5I_GENPROP_LST)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list");
+
+    /* Call the internal encode routine */
+    if((ret_value = H5P__encode(plist, TRUE, buf, nalloc)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTENCODE, FAIL, "unable to encode property list");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pencode() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Pdecode
+ PURPOSE
+    API routine to decode a property list from a binary buffer.
+ USAGE
+    hid_t H5Pdecode(buf)
+        void *buf;    IN: buffer that holds the encoded plist
+ RETURNS
+    Returns non-negative ID of new property list object on success, negative
+        on failure.
+ DESCRIPTION
+     Decodes a property list from a binary buffer. The contents of the buffer
+     contain the values for the correponding properties of the plist. The decode 
+     callback of a certain property decodes its value from the buffer and sets it
+     in the property list.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+     Properties in the property list that are not encoded in the serialized
+     form retain their default value.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hid_t
+H5Pdecode(const void *buf)
+{
+    hid_t ret_value = SUCCEED;          /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("i", "*x", buf);
+
+    /* Call the internal decode routine */
+    if((ret_value = H5P__decode(buf)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTDECODE, FAIL, "unable to decode property list");
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Pdecode() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
     H5Pget_class
  PURPOSE
     Routine to query the class of a generic property list
@@ -1311,7 +1350,7 @@ H5Premove(hid_t plist_id, const char *name)
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid property name");
 
     /* Create the new property list class */
-    if((ret_value = H5P_remove(plist_id,plist,name)) < 0)
+    if((ret_value = H5P_remove(plist, name)) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTDELETE, FAIL, "unable to remove property");
 
 done:
@@ -1601,7 +1640,7 @@ done:
 herr_t
 H5Pclose_class(hid_t cls_id)
 {
-    hid_t	ret_value = SUCCEED;    /* Return value			*/
+    herr_t	ret_value = SUCCEED;    /* Return value			*/
 
     FUNC_ENTER_API(FAIL)
     H5TRACE1("e", "i", cls_id);
diff --git a/src/H5PL.c b/src/H5PL.c
index d691eb5..4c35c09 100644
--- a/src/H5PL.c
+++ b/src/H5PL.c
@@ -16,8 +16,7 @@
 /* Module Setup */
 /****************/
 
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5PL__init_interface
+#include "H5PLmodule.h"          /* This source code file is part of the H5PL module */
 
 
 /***********/
@@ -52,7 +51,6 @@
  * If you do not do this, people will be unable to incorporate our
  * source code into their own CMake builds if they define UNICODE.
  */
-
 #ifdef H5_HAVE_WIN32_API
 
 #define H5PL_PATH_SEPARATOR     ";"
@@ -103,6 +101,7 @@ typedef const void *(*H5PL_get_plugin_info_t)(void);
 /* Special symbol to indicate no plugin loading */
 #define H5PL_NO_PLUGIN          "::"
 
+
 /******************/
 /* Local Typedefs */
 /******************/
@@ -130,6 +129,9 @@ static herr_t H5PL__close(H5PL_HANDLE handle);
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 
 /*****************************/
 /* Library Private Variables */
@@ -153,36 +155,94 @@ static hbool_t          H5PL_path_found_g = FALSE;
 /* Enable all plugin libraries */
 static unsigned int     H5PL_plugin_g = H5PL_ALL_PLUGIN;
 
+
 

 /*--------------------------------------------------------------------------
 NAME
-   H5PL__init_interface -- Initialize interface-specific information
+   H5PL__init_package -- Initialize interface-specific information
 USAGE
-    herr_t H5PL__init_interface()
+    herr_t H5PL__init_package()
 RETURNS
     Non-negative on success/Negative on failure
 DESCRIPTION
     Initializes any interface-specific data or routines.
 
 --------------------------------------------------------------------------*/
-static herr_t
-H5PL__init_interface(void)
+herr_t
+H5PL__init_package(void)
 {
     char        *preload_path;
 
-    FUNC_ENTER_STATIC_NOERR
+    FUNC_ENTER_PACKAGE_NOERR
 
     /* Retrieve pathnames from HDF5_PLUGIN_PRELOAD if the user sets it
      * to tell the library to load plugin libraries without search.
      */
-    if(NULL != (preload_path = HDgetenv("HDF5_PLUGIN_PRELOAD"))) {
+    if(NULL != (preload_path = HDgetenv("HDF5_PLUGIN_PRELOAD")))
         /* Special symbal "::" means no plugin during data reading. */
         if(!HDstrcmp(preload_path, H5PL_NO_PLUGIN))
             H5PL_plugin_g = 0;
-    } /* end if */
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5PL__init_interface() */
+} /* end H5PL__init_package() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5PL_term_package
+ *
+ * Purpose:     Terminate the H5PL interface: release all memory, reset all
+ *              global variables to initial values. This only happens if all
+ *              types have been destroyed from other interfaces.
+ *
+ * Return:      Success:    Positive if any action was taken that might
+ *                          affect some other interface; zero otherwise.
+ *              Failure:    Negative.
+ *
+ * Programmer:  Raymond Lu
+ *              20 February 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5PL_term_package(void)
+{
+    int  n = 0;
+    
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_PKG_INIT_VAR) {
+        size_t u;       /* Local index variable */
+
+        /* Close opened dynamic libraries */
+        if(H5PL_table_g) {
+            for(u = 0; u < H5PL_table_used_g; u++)
+                H5PL__close((H5PL_table_g[u]).handle);
+
+            /* Free the table of dynamic libraries */
+            H5PL_table_g = (H5PL_table_t *)H5MM_xfree(H5PL_table_g);
+            H5PL_table_used_g = H5PL_table_alloc_g = 0;
+
+            n++;
+        } /* end if */
+
+        /* Free the table of search paths */
+        if(H5PL_num_paths_g > 0) {
+            for(u = 0; u < H5PL_num_paths_g; u++)
+                if(H5PL_path_table_g[u])
+                    H5PL_path_table_g[u] = (char *)H5MM_xfree(H5PL_path_table_g[u]);
+            H5PL_num_paths_g = 0;
+            H5PL_path_found_g = FALSE;
+
+            n++;
+        } /* end if */
+
+        /* Mark the interface as uninitialized */
+        if(0 == n)
+            H5_PKG_INIT_VAR = FALSE;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* end H5PL_term_package() */
 
 

 /*-------------------------------------------------------------------------
@@ -209,21 +269,24 @@ H5PLset_loading_state(unsigned int plugin_type)
 {
     char *preload_path;
     herr_t ret_value = SUCCEED; /* Return value */
+
     FUNC_ENTER_API(FAIL)
     H5TRACE1("e", "Iu", plugin_type);
+
     /* change the bit value of the requested plugin type(s) */
     H5PL_plugin_g = plugin_type;
+
     /* check if special ENV variable is set and disable all plugin types */
-    if(NULL != (preload_path = HDgetenv("HDF5_PLUGIN_PRELOAD"))) {
+    if(NULL != (preload_path = HDgetenv("HDF5_PLUGIN_PRELOAD")))
         /* Special symbol "::" means no plugin during data reading. */
         if(!HDstrcmp(preload_path, H5PL_NO_PLUGIN))
             H5PL_plugin_g = 0;
-    }
+
 done:
     FUNC_LEAVE_API(ret_value)
 } /* end H5PLset_loading_state() */
 
-
+

 /*-------------------------------------------------------------------------
  * Function: H5PLget_loading_state
  *
@@ -240,67 +303,19 @@ herr_t
 H5PLget_loading_state(unsigned int *plugin_type)
 {
     herr_t ret_value = SUCCEED; /* Return value */
+
     FUNC_ENTER_API(FAIL)
     H5TRACE1("e", "*Iu", plugin_type);
 
     if(plugin_type)
         *plugin_type = H5PL_plugin_g;
-    done:
+
+done:
     FUNC_LEAVE_API(ret_value)
 } /* end H5PLget_loading_state() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5PL_term_interface
- *
- * Purpose:     Terminate the H5PL interface: release all memory, reset all
- *              global variables to initial values. This only happens if all
- *              types have been destroyed from other interfaces.
- *
- * Return:      Success:    Positive if any action was taken that might
- *                          affect some other interface; zero otherwise.
- *
- *              Failure:    Negative.
- *
- * Programmer:  Raymond Lu
- *              20 February 2013
- *
- *-------------------------------------------------------------------------
- */
-int
-H5PL_term_interface(void)
-{
-    int  i = 0;
-    
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    if(H5_interface_initialize_g) {
-        size_t u;       /* Local index variable */
-
-        /* Close opened dynamic libraries */
-        for(u = 0; u < H5PL_table_used_g; u++)
-            H5PL__close((H5PL_table_g[u]).handle);
-
-        /* Free the table of dynamic libraries */
-        H5PL_table_g = (H5PL_table_t *)H5MM_xfree(H5PL_table_g);
-        H5PL_table_used_g = H5PL_table_alloc_g = 0;
-
-        /* Free the table of search paths */
-        for(u = 0; u < H5PL_num_paths_g; u++)
-            if(H5PL_path_table_g[u])
-                H5PL_path_table_g[u] = (char *)H5MM_xfree(H5PL_path_table_g[u]);
-        H5PL_num_paths_g = 0;
-        H5PL_path_found_g = FALSE;
-
-        H5_interface_initialize_g = 0;
-        i = 1;
-    } /* end if */
-
-    FUNC_LEAVE_NOAPI(i)
-} /* end H5PL_term_interface() */
-
-

-/*-------------------------------------------------------------------------
  * Function:    H5PL_load
  *
  * Purpose:     Given the plugin type and identifier, this function searches
@@ -323,14 +338,17 @@ H5PL_load(H5PL_type_t type, int id)
 
     FUNC_ENTER_NOAPI(NULL)
 
-    switch (type) {
-    case H5PL_TYPE_FILTER:
-        if((H5PL_plugin_g & H5PL_FILTER_PLUGIN) == 0)
-            HGOTO_ERROR(H5E_PLUGIN, H5E_CANTLOAD, NULL, "required dynamically loaded plugin filter '%d' is not available", id)
-        break;
-    default:
-        HGOTO_ERROR(H5E_PLUGIN, H5E_CANTLOAD, NULL, "required dynamically loaded plugin '%d' is not valid", id)
-    }
+    switch(type) {
+        case H5PL_TYPE_FILTER:
+            if((H5PL_plugin_g & H5PL_FILTER_PLUGIN) == 0)
+                HGOTO_ERROR(H5E_PLUGIN, H5E_CANTLOAD, NULL, "required dynamically loaded plugin filter '%d' is not available", id)
+            break;
+
+        case H5PL_TYPE_ERROR:
+        case H5PL_TYPE_NONE:
+        default:
+            HGOTO_ERROR(H5E_PLUGIN, H5E_CANTLOAD, NULL, "required dynamically loaded plugin '%d' is not valid", id)
+    } /* end switch */
 
     /* Initialize the location paths for dynamic libraries, if they aren't
      * already set up.
@@ -723,3 +741,4 @@ H5PL__close(H5PL_HANDLE handle)
    
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5PL__close() */
+
diff --git a/src/H5PLmodule.h b/src/H5PLmodule.h
new file mode 100644
index 0000000..0339737
--- /dev/null
+++ b/src/H5PLmodule.h
@@ -0,0 +1,36 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5PL package.  Including this header means that the source file
+ *		is part of the H5PL package.
+ */
+#ifndef _H5PLmodule_H
+#define _H5PLmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5PL_MODULE
+#define H5_MY_PKG       H5PL
+#define H5_MY_PKG_ERR   H5E_PLUGIN
+#define H5_MY_PKG_INIT  YES
+
+#endif /* _H5PLmodule_H */
+
+
diff --git a/src/H5PLpublic.h b/src/H5PLpublic.h
index 0296819..0528945 100644
--- a/src/H5PLpublic.h
+++ b/src/H5PLpublic.h
@@ -43,7 +43,7 @@ extern "C" {
 
 /* plugin state */
 H5_DLL herr_t H5PLset_loading_state(unsigned int plugin_type);
-H5_DLL herr_t H5PLget_loading_state(unsigned int *plugin_type/*out*/);
+H5_DLL herr_t H5PLget_loading_state(unsigned int* plugin_type/*out*/);
 
 #ifdef __cplusplus
 }
diff --git a/src/H5Pacpl.c b/src/H5Pacpl.c
index 0a0641c..bfed332 100644
--- a/src/H5Pacpl.c
+++ b/src/H5Pacpl.c
@@ -27,7 +27,9 @@
 /****************/
 /* Module Setup */
 /****************/
-#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+#include "H5Pmodule.h"          /* This source code file is part of the H5P module */
+
 
 /***********/
 /* Headers */
diff --git a/src/H5Pdapl.c b/src/H5Pdapl.c
index 485fcba..9f7822e 100644
--- a/src/H5Pdapl.c
+++ b/src/H5Pdapl.c
@@ -27,7 +27,8 @@
 /****************/
 /* Module Setup */
 /****************/
-#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+#include "H5Pmodule.h"          /* This source code file is part of the H5P module */
 
 
 /***********/
@@ -49,12 +50,32 @@
 /* Definitions for size of raw data chunk cache(slots) */
 #define H5D_ACS_DATA_CACHE_NUM_SLOTS_SIZE       sizeof(size_t)
 #define H5D_ACS_DATA_CACHE_NUM_SLOTS_DEF        H5D_CHUNK_CACHE_NSLOTS_DEFAULT
+#define H5D_ACS_DATA_CACHE_NUM_SLOTS_ENC        H5P__encode_chunk_cache_nslots
+#define H5D_ACS_DATA_CACHE_NUM_SLOTS_DEC        H5P__decode_chunk_cache_nslots
 /* Definition for size of raw data chunk cache(bytes) */
 #define H5D_ACS_DATA_CACHE_BYTE_SIZE_SIZE       sizeof(size_t)
 #define H5D_ACS_DATA_CACHE_BYTE_SIZE_DEF        H5D_CHUNK_CACHE_NBYTES_DEFAULT
+#define H5D_ACS_DATA_CACHE_BYTE_SIZE_ENC        H5P__encode_chunk_cache_nbytes
+#define H5D_ACS_DATA_CACHE_BYTE_SIZE_DEC        H5P__decode_chunk_cache_nbytes
 /* Definition for preemption read chunks first */
 #define H5D_ACS_PREEMPT_READ_CHUNKS_SIZE        sizeof(double)
 #define H5D_ACS_PREEMPT_READ_CHUNKS_DEF         H5D_CHUNK_CACHE_W0_DEFAULT
+#define H5D_ACS_PREEMPT_READ_CHUNKS_ENC         H5P__encode_double
+#define H5D_ACS_PREEMPT_READ_CHUNKS_DEC         H5P__decode_double
+/* Definitions for VDS view option */
+#define H5D_ACS_VDS_VIEW_SIZE                   sizeof(H5D_vds_view_t)
+#define H5D_ACS_VDS_VIEW_DEF                    H5D_VDS_LAST_AVAILABLE
+#define H5D_ACS_VDS_VIEW_ENC                    H5P__dacc_vds_view_enc
+#define H5D_ACS_VDS_VIEW_DEC                    H5P__dacc_vds_view_dec
+/* Definitions for VDS printf gap */
+#define H5D_ACS_VDS_PRINTF_GAP_SIZE             sizeof(hsize_t)
+#define H5D_ACS_VDS_PRINTF_GAP_DEF              (hsize_t)0
+#define H5D_ACS_VDS_PRINTF_GAP_ENC              H5P__encode_hsize_t
+#define H5D_ACS_VDS_PRINTF_GAP_DEC              H5P__decode_hsize_t
+/* Definition for append flush */
+#define H5D_ACS_APPEND_FLUSH_SIZE            	sizeof(H5D_append_flush_t)
+#define H5D_ACS_APPEND_FLUSH_DEF             	{0,{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},NULL,NULL}
+
 
 
 /******************/
@@ -73,6 +94,16 @@
 
 /* Property class callbacks */
 static herr_t H5P__dacc_reg_prop(H5P_genclass_t *pclass);
+static herr_t H5P__encode_chunk_cache_nslots(const void *value, void **_pp,
+    size_t *size);
+static herr_t H5P__decode_chunk_cache_nslots(const void **_pp, void *_value);
+static herr_t H5P__encode_chunk_cache_nbytes(const void *value, void **_pp,
+    size_t *size);
+static herr_t H5P__decode_chunk_cache_nbytes(const void **_pp, void *_value);
+
+/* Property list callbacks */
+static herr_t H5P__dacc_vds_view_enc(const void *value, void **pp, size_t *size);
+static herr_t H5P__dacc_vds_view_dec(const void **pp, void *value);
 
 
 /*********************/
@@ -107,7 +138,7 @@ const H5P_libclass_t H5P_CLS_DACC[1] = {{
 /*******************/
 /* Local Variables */
 /*******************/
-
+static const H5D_append_flush_t H5D_def_append_flush_g = H5D_ACS_APPEND_FLUSH_DEF;       /* Default setting for append flush */
 
 

 /*-------------------------------------------------------------------------
@@ -128,20 +159,43 @@ H5P__dacc_reg_prop(H5P_genclass_t *pclass)
     size_t rdcc_nslots = H5D_ACS_DATA_CACHE_NUM_SLOTS_DEF;      /* Default raw data chunk cache # of slots */
     size_t rdcc_nbytes = H5D_ACS_DATA_CACHE_BYTE_SIZE_DEF;      /* Default raw data chunk cache # of bytes */
     double rdcc_w0 = H5D_ACS_PREEMPT_READ_CHUNKS_DEF;           /* Default raw data chunk cache dirty ratio */
+    H5D_vds_view_t virtual_view = H5D_ACS_VDS_VIEW_DEF;         /* Default VDS view option */
+    hsize_t printf_gap = H5D_ACS_VDS_PRINTF_GAP_DEF;            /* Default VDS printf gap */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
 
     /* Register the size of raw data chunk cache (elements) */
-    if(H5P_register_real(pclass, H5D_ACS_DATA_CACHE_NUM_SLOTS_NAME, H5D_ACS_DATA_CACHE_NUM_SLOTS_SIZE, &rdcc_nslots, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_ACS_DATA_CACHE_NUM_SLOTS_NAME, H5D_ACS_DATA_CACHE_NUM_SLOTS_SIZE, &rdcc_nslots, 
+             NULL, NULL, NULL, H5D_ACS_DATA_CACHE_NUM_SLOTS_ENC, H5D_ACS_DATA_CACHE_NUM_SLOTS_DEC, NULL, NULL, NULL, NULL) < 0)
          HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the size of raw data chunk cache(bytes) */
-    if(H5P_register_real(pclass, H5D_ACS_DATA_CACHE_BYTE_SIZE_NAME, H5D_ACS_DATA_CACHE_BYTE_SIZE_SIZE, &rdcc_nbytes, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_ACS_DATA_CACHE_BYTE_SIZE_NAME, H5D_ACS_DATA_CACHE_BYTE_SIZE_SIZE, &rdcc_nbytes, 
+             NULL, NULL, NULL, H5D_ACS_DATA_CACHE_BYTE_SIZE_ENC, H5D_ACS_DATA_CACHE_BYTE_SIZE_DEC, NULL, NULL, NULL, NULL) < 0)
          HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the preemption for reading chunks */
-    if(H5P_register_real(pclass, H5D_ACS_PREEMPT_READ_CHUNKS_NAME, H5D_ACS_PREEMPT_READ_CHUNKS_SIZE, &rdcc_w0, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_ACS_PREEMPT_READ_CHUNKS_NAME, H5D_ACS_PREEMPT_READ_CHUNKS_SIZE, &rdcc_w0, 
+             NULL, NULL, NULL, H5D_ACS_PREEMPT_READ_CHUNKS_ENC, H5D_ACS_PREEMPT_READ_CHUNKS_DEC, NULL, NULL, NULL, NULL) < 0)
+         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the VDS view option */
+    if(H5P_register_real(pclass, H5D_ACS_VDS_VIEW_NAME, H5D_ACS_VDS_VIEW_SIZE, &virtual_view,
+            NULL, NULL, NULL, H5D_ACS_VDS_VIEW_ENC, H5D_ACS_VDS_VIEW_DEC,
+            NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the VDS printf gap */
+    if(H5P_register_real(pclass, H5D_ACS_VDS_PRINTF_GAP_NAME, H5D_ACS_VDS_PRINTF_GAP_SIZE, &printf_gap,
+            NULL, NULL, NULL, H5D_ACS_VDS_PRINTF_GAP_ENC, H5D_ACS_VDS_PRINTF_GAP_DEC,
+            NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register info for append flush */
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5D_ACS_APPEND_FLUSH_NAME, H5D_ACS_APPEND_FLUSH_SIZE, &H5D_def_append_flush_g, 
+             NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
          HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
 done:
@@ -274,5 +328,592 @@ H5Pget_chunk_cache(hid_t dapl_id, size_t *rdcc_nslots, size_t *rdcc_nbytes, doub
 
 done:
     FUNC_LEAVE_API(ret_value)
-}
+} /* end H5Pget_chunk_cache() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__encode_chunk_cache_nslots
+ *
+ * Purpose:        Encode the rdcc_nslots parameter to a serialized
+ *                 property list.  Similar to H5P__encode_size_t except
+ *                 the value of 255 for the enc_size field is reserved to
+ *                 indicate H5D_ACS_DATA_CACHE_NUM_SLOTS_DEF, in which
+ *                 nothing further is encoded.
+ *
+ * Return:         Success:     Non-negative
+ *                 Failure:     Negative
+ *
+ * Programmer:     Neil Fortner
+ *                 Wednesday, January 23, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__encode_chunk_cache_nslots(const void *value, void **_pp, size_t *size)
+{
+    uint64_t enc_value;     /* Property value to encode */
+    uint8_t **pp = (uint8_t **)_pp;
+    unsigned enc_size;      /* Size of encoded property */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity checks */
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+    HDassert(size);
+
+    /* Determine if this is the default value, in which case only encode
+     * enc_size (as 255).  Also set size needed for encoding. */
+    if(*(const size_t *)value == H5D_ACS_DATA_CACHE_NUM_SLOTS_DEF) {
+        enc_size = 0;
+        *size += 1;
+    } /* end if */
+    else {
+        enc_value = (uint64_t)*(const size_t *)value;
+        enc_size = H5VM_limit_enc_size(enc_value);
+        HDassert(enc_size > 0);
+        *size += (1 + enc_size);
+    } /* end else */
+
+    HDassert(enc_size < 256);
+
+    if(NULL != *pp) {
+        /* Encode the size */
+        *(*pp)++ = (uint8_t)enc_size;
+
+        /* Encode the value if necessary */
+        if(enc_size != 0) {
+            UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__encode_chunk_cache_nslots() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__decode_chunk_cache_nslots
+ *
+ * Purpose:        Decode the rdcc_nslots parameter from a serialized
+ *                 property list.  Similar to H5P__decode_size_t except
+ *                 the value of 255 for the enc_size field is reserved to
+ *                 indicate H5D_ACS_DATA_CACHE_NUM_SLOTS_DEF, in which
+ *                 nothing further needs to be decoded.
+ *
+ * Return:         Success:     Non-negative
+ *                 Failure:     Negative
+ *
+ * Programmer:     Neil Fortner
+ *                 Wednesday, January 23, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__decode_chunk_cache_nslots(const void **_pp, void *_value)
+{
+    size_t *value = (size_t *)_value;   /* Property value to return */
+    const uint8_t **pp = (const uint8_t **)_pp;
+    uint64_t enc_value;                 /* Decoded property value */
+    unsigned enc_size;                  /* Size of encoded property */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity check */
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(value);
+
+    /* Decode the size */
+    enc_size = *(*pp)++;
+    HDassert(enc_size < 256);
+
+    /* Determine if enc_size indicates that this is the default value, in which
+     * case set value to H5D_ACS_DATA_CACHE_NUM_SLOTS_DEF and return */
+    if(enc_size == 0)
+        *value = H5D_ACS_DATA_CACHE_NUM_SLOTS_DEF;
+    else {
+        /* Decode the value */
+        UINT64DECODE_VAR(*pp, enc_value, enc_size);
+        H5_CHECKED_ASSIGN(*value, uint64_t, enc_value, size_t);
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__decode_chunk_cache_nslots() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__encode_chunk_cache_nbytes
+ *
+ * Purpose:        Encode the rdcc_nbytes parameter to a serialized
+ *                 property list.  Similar to H5P__encode_size_t except
+ *                 the value of 255 for the enc_size field is reserved to
+ *                 indicate H5D_ACS_DATA_CACHE_BYTE_SIZE_DEF, in which
+ *                 nothing further is encoded.
+ *
+ * Return:         Success:     Non-negative
+ *                 Failure:     Negative
+ *
+ * Programmer:     Neil Fortner
+ *                 Wednesday, January 23, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__encode_chunk_cache_nbytes(const void *value, void **_pp, size_t *size)
+{
+    uint64_t enc_value;     /* Property value to encode */
+    uint8_t **pp = (uint8_t **)_pp;
+    unsigned enc_size;      /* Size of encoded property */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity checks */
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+    HDassert(size);
+
+    /* Determine if this is the default value, in which case only encode
+     * enc_size (as 255).  Also set size needed for encoding. */
+    if(*(const size_t *)value == H5D_ACS_DATA_CACHE_BYTE_SIZE_DEF) {
+        enc_size = 0;
+        *size += 1;
+    } /* end if */
+    else {
+        enc_value = (uint64_t)*(const size_t *)value;
+        enc_size = H5VM_limit_enc_size(enc_value);
+        HDassert(enc_size > 0);
+        *size += (1 + enc_size);
+    } /* end else */
+
+    HDassert(enc_size < 256);
+
+    if(NULL != *pp) {
+        /* Encode the size */
+        *(*pp)++ = (uint8_t)enc_size;
+
+        /* Encode the value if necessary */
+        if(enc_size != 0) {
+            UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__encode_chunk_cache_nbytes() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__decode_chunk_cache_nbytes
+ *
+ * Purpose:        Decode the rdcc_nbytes parameter from a serialized
+ *                 property list.  Similar to H5P__decode_size_t except
+ *                 the value of 255 for the enc_size field is reserved to
+ *                 indicate H5D_ACS_DATA_CACHE_BYTE_SIZE_DEF, in which
+ *                 nothing further needs to be decoded.
+ *
+ * Return:         Success:     Non-negative
+ *                 Failure:     Negative
+ *
+ * Programmer:     Neil Fortner
+ *                 Wednesday, January 23, 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__decode_chunk_cache_nbytes(const void **_pp, void *_value)
+{
+    size_t *value = (size_t *)_value;   /* Property value to return */
+    const uint8_t **pp = (const uint8_t **)_pp;
+    uint64_t enc_value;                 /* Decoded property value */
+    unsigned enc_size;                  /* Size of encoded property */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity check */
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(value);
+
+    /* Decode the size */
+    enc_size = *(*pp)++;
+    HDassert(enc_size < 256);
+
+    /* Determine if enc_size indicates that this is the default value, in which
+     * case set value to H5D_ACS_DATA_CACHE_BYTE_SIZE_DEF and return */
+    if(enc_size == 0)
+        *value = H5D_ACS_DATA_CACHE_BYTE_SIZE_DEF;
+    else {
+        /* Decode the value */
+        UINT64DECODE_VAR(*pp, enc_value, enc_size);
+        H5_CHECKED_ASSIGN(*value, uint64_t, enc_value, size_t);
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__decode_chunk_cache_nbytes() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_virtual_view
+ *
+ * Purpose:     Takes the access property list for the virtual dataset,
+ *              dapl_id, and the flag, view, and sets the VDS view
+ *              according to the flag value.  The view will include all
+ *              data before the first missing mapped data found if the
+ *              flag is set to H5D_VDS_FIRST_MISSING or to include all
+ *              available mapped data if the flag is set to
+ *              H5D_VDS_LAST_AVAIALBLE.  Missing mapped data will be
+ *              filled with the fill value according to the VDS creation
+ *              property settings.  For VDS with unlimited mappings, the
+ *              view defines the extent.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              May 4, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_virtual_view(hid_t plist_id, H5D_vds_view_t view)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iDv", plist_id, view);
+
+    /* Check argument */
+    if((view != H5D_VDS_FIRST_MISSING) && (view != H5D_VDS_LAST_AVAILABLE))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a valid bounds option")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Update property list */
+    if(H5P_set(plist, H5D_ACS_VDS_VIEW_NAME, &view) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_virtual_view() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_virtual_view
+ *
+ * Purpose:     Takes the access property list for the virtual dataset,
+ *              dapl_id, and gets the flag, view, set by the
+ *              H5Pset_virtual_view call.  The possible values of view are
+ *              H5D_VDS_FIRST_MISSING or H5D_VDS_LAST_AVAIALBLE. 
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              May 4, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_virtual_view(hid_t plist_id, H5D_vds_view_t *view)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*Dv", plist_id, view);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get value from property list */
+    if(view)
+        if(H5P_get(plist, H5D_ACS_VDS_VIEW_NAME, view) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_virtual_view() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dacc_vds_view_enc
+ *
+ * Purpose:     Callback routine which is called whenever the vds view
+ *              property in the dataset access property list is encoded.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Neil Fortner
+ *              Tuesday, May 5, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dacc_vds_view_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5D_vds_view_t *view = (const H5D_vds_view_t *)value; /* Create local alias for values */
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(view);
+    HDassert(size);
+
+    if(NULL != *pp)
+        /* Encode EDC property */
+        *(*pp)++ = (uint8_t)*view;
+
+    /* Size of EDC property */
+    (*size)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__dacc_vds_view_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dacc_vds_view_dec
+ *
+ * Purpose:     Callback routine which is called whenever the vds view
+ *              property in the dataset access property list is encoded.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Neil Fortner
+ *              Tuesday, May 5, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dacc_vds_view_dec(const void **_pp, void *_value)
+{
+    H5D_vds_view_t *view = (H5D_vds_view_t *)_value;
+    const uint8_t **pp = (const uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(view);
+
+    /* Decode EDC property */
+    *view = (H5D_vds_view_t)*(*pp)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__dacc_vds_view_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_virtual_printf_gap
+ *
+ * Purpose:     Sets the access property list for the virtual dataset,
+ *              dapl_id, to instruct the library to stop looking for the
+ *              mapped data stored in the files and/or datasets with the
+ *              printf-style names after not finding gap_size files and/or
+ *              datasets.  The found source files and datasets will
+ *              determine the extent of the unlimited VDS with the printf
+ *              -style mappings.
+ *
+ *              For example, if regularly spaced blocks of VDS are mapped
+ *              to datasets with the names d-1, d-2, d-3, ..., d-N, ...,
+ *              and d-2 dataset is missing and gap_size is set to 0, then
+ *              VDS will contain only data found in d-1.  If d-2 and d-3
+ *              are missing and gap_size is set to 2, then VDS will
+ *              contain the data from d-1, d-3, ..., d-N, ....  The blocks
+ *              that are mapped to d-2 and d-3 will be filled according to
+ *              the VDS fill value setting.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              May 21, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_virtual_printf_gap(hid_t plist_id, hsize_t gap_size)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ih", plist_id, gap_size);
+
+    /* Check argument */
+    if(gap_size == HSIZE_UNDEF)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a valid printf gap size")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Update property list */
+    if(H5P_set(plist, H5D_ACS_VDS_PRINTF_GAP_NAME, &gap_size) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_virtual_printf_gap() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_virtual_printf_gap
+ *
+ * Purpose:     Gets the maximum number of missing printf-style files
+ *              and/or datasets for determining the extent of the
+ *              unlimited VDS, gap_size, using the access property list
+ *              for the virtual dataset, dapl_id.  The default library
+ *              value for gap_size is 0.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              May 21, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_virtual_printf_gap(hid_t plist_id, hsize_t *gap_size)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "i*h", plist_id, gap_size);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get value from property list */
+    if(gap_size)
+        if(H5P_get(plist, H5D_ACS_VDS_PRINTF_GAP_NAME, gap_size) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "unable to get value")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_virtual_printf_gap() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_append_flush
+ *
+ * Purpose:	Sets the boundary, callback function, and user data in the
+ *		property list.
+ *		"ndims": number of array elements for boundary
+ *		"boundary": used to determine whether the current dimension hits 
+ *			  a boundary; if so, invoke the callback function and
+ *			  flush the dataset.
+ *		"func": the callback function to invoke when the boundary is hit
+ *		"udata": the user data to pass as parameter with the callback function
+ *	
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; Dec 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_append_flush(hid_t plist_id, unsigned ndims, const hsize_t *boundary, H5D_append_cb_t func, void *udata)
+{
+    H5P_genplist_t *plist;      	/* property list pointer */
+    H5D_append_flush_t info;
+    unsigned u;				/* local index variable */
+    herr_t ret_value = SUCCEED;   	/* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "iIu*hx*x", plist_id, ndims, boundary, func, udata);
+
+    /* Check arguments */
+    if(0 == ndims)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dimensionality cannot be zero")
+    if(ndims > H5S_MAX_RANK)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dimensionality is too large")
+    if(!boundary)
+	    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no boundary dimensions specified")
+
+    /* Check if the callback function is NULL and the user data is non-NULL.
+     * This is almost certainly an error as the user data will not be used. */
+    if(!func && udata)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "callback is NULL while user data is not")
+ 
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set up values */
+    info.ndims = ndims;
+    info.func = func;
+    info.udata = udata;
+
+    HDmemset(info.boundary, 0, sizeof(info.boundary));
+    /* boundary can be 0 to indicate no boundary is set */
+    for(u = 0; u < ndims; u++) {
+        if(boundary[u] != (boundary[u] & 0xffffffff)) /* negative value (including H5S_UNLIMITED) */
+            HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "all boundary dimensions must be less than 2^32")
+        info.boundary[u] = boundary[u]; /* Store user's boundary dimensions */
+    } /* end for */
+
+    /* Set values */
+    if(H5P_set(plist, H5D_ACS_APPEND_FLUSH_NAME, &info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set append flush")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Pset_append_flush() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_append_flush()
+ *
+ * Purpose:	Retrieves the boundary, callback function and user data set in 
+ *		property list.
+ *		Note that the # of boundary sizes to retrieve will not exceed
+ *		the parameter "ndims" and the ndims set previously via 
+ *		H5Pset_append_flush().
+ *	
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; Dec 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_append_flush(hid_t plist_id, unsigned ndims, hsize_t boundary[], H5D_append_cb_t *func, void **udata)
+{
+    H5P_genplist_t *plist;      /* property list pointer */
+    H5D_append_flush_t  info;
+    unsigned u;			/* local index variable */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "iIu*h*x**x", plist_id, ndims, boundary, func, udata);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Retrieve info for append flush */
+    if(H5P_get(plist, H5D_ACS_APPEND_FLUSH_NAME, &info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get object flush callback")
+
+    /* Assign return values */
+    if(boundary) {
+	HDmemset(boundary, 0, ndims * sizeof(hsize_t));
+	if(info.ndims > 0)
+	    for(u = 0; u < info.ndims && u < ndims; u++)
+		boundary[u] = info.boundary[u];
+    } /* end if */
+    if(func)
+	*func = info.func;
+    if(udata)
+	*udata = info.udata;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Pget_append_flush() */
 
diff --git a/src/H5Pdcpl.c b/src/H5Pdcpl.c
index 071ce41..c6a8f9a 100644
--- a/src/H5Pdcpl.c
+++ b/src/H5Pdcpl.c
@@ -27,22 +27,26 @@
 /****************/
 /* Module Setup */
 /****************/
-#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
-#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
+
+#include "H5Pmodule.h"          /* This source code file is part of the H5P module */
+#define H5D_FRIEND		        /* Suppress error about including H5Dpkg	       */
 
 
 /***********/
 /* Headers */
 /***********/
 #include "H5private.h"		/* Generic Functions			*/
-#include "H5ACprivate.h"	/* Metadata cache			*/
-#include "H5Dprivate.h"		/* Datasets				*/
+#include "H5Dpkg.h"		/* Datasets 				*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
 #include "H5FLprivate.h"	/* Free Lists                           */
 #include "H5Iprivate.h"		/* IDs			  		*/
 #include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Oprivate.h"		/* Object headers		  	*/
 #include "H5Ppkg.h"		/* Property lists		  	*/
-#include "H5Zpkg.h"		/* Data filters				*/
+#include "H5Sprivate.h"         /* Dataspaces                           */
+#include "H5Tprivate.h"		/* Datatypes 				*/
+#include "H5VMprivate.h"	/* Vectors and arrays 			*/
+#include "H5Zprivate.h"		/* Data filters				*/
 
 
 /****************/
@@ -52,43 +56,70 @@
 /* Define default layout information */
 #define H5D_DEF_STORAGE_COMPACT_INIT  {(hbool_t)FALSE, (size_t)0, NULL}
 #define H5D_DEF_STORAGE_CONTIG_INIT   {HADDR_UNDEF, (hsize_t)0}
-#define H5D_DEF_STORAGE_CHUNK_INIT    {H5D_CHUNK_BTREE, HADDR_UNDEF,  NULL, {{HADDR_UNDEF, NULL}}}
-#define H5D_DEF_LAYOUT_CHUNK_INIT    {(unsigned)0, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, (uint32_t)0, (hsize_t)0, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}
+#define H5D_DEF_STORAGE_CHUNK_INIT    {H5D_CHUNK_IDX_BTREE, HADDR_UNDEF, H5D_COPS_BTREE, {{HADDR_UNDEF, NULL}}}
+#define H5D_DEF_LAYOUT_CHUNK_INIT    {H5D_CHUNK_IDX_BTREE, (uint8_t)0, (unsigned)0, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, (unsigned)0, (uint32_t)0, (hsize_t)0, (hsize_t)0, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {{{(uint8_t)0}}}}
+#define H5D_DEF_STORAGE_VIRTUAL_INIT  {{HADDR_UNDEF, 0}, 0, NULL, 0, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, H5D_VDS_ERROR, HSIZE_UNDEF, -1, -1, FALSE}
 #ifdef H5_HAVE_C99_DESIGNATED_INITIALIZER
 #define H5D_DEF_STORAGE_COMPACT  {H5D_COMPACT, { .compact = H5D_DEF_STORAGE_COMPACT_INIT }}
 #define H5D_DEF_STORAGE_CONTIG   {H5D_CONTIGUOUS, { .contig = H5D_DEF_STORAGE_CONTIG_INIT }}
 #define H5D_DEF_STORAGE_CHUNK    {H5D_CHUNKED, { .chunk = H5D_DEF_STORAGE_CHUNK_INIT }}
-#define H5D_DEF_LAYOUT_COMPACT  {H5D_COMPACT, H5O_LAYOUT_VERSION_3, NULL, {H5D_DEF_LAYOUT_CHUNK_INIT}, H5D_DEF_STORAGE_COMPACT}
-#define H5D_DEF_LAYOUT_CONTIG   {H5D_CONTIGUOUS, H5O_LAYOUT_VERSION_3, NULL, {H5D_DEF_LAYOUT_CHUNK_INIT}, H5D_DEF_STORAGE_CONTIG}
-#define H5D_DEF_LAYOUT_CHUNK    {H5D_CHUNKED, H5O_LAYOUT_VERSION_3, NULL, {H5D_DEF_LAYOUT_CHUNK_INIT}, H5D_DEF_STORAGE_CHUNK}
+#define H5D_DEF_STORAGE_VIRTUAL  {H5D_VIRTUAL, { .virt = H5D_DEF_STORAGE_VIRTUAL_INIT }}
+#define H5D_DEF_LAYOUT_COMPACT  {H5D_COMPACT, H5O_LAYOUT_VERSION_DEFAULT, H5D_LOPS_COMPACT, {H5D_DEF_LAYOUT_CHUNK_INIT}, H5D_DEF_STORAGE_COMPACT}
+#define H5D_DEF_LAYOUT_CONTIG   {H5D_CONTIGUOUS, H5O_LAYOUT_VERSION_DEFAULT, H5D_LOPS_CONTIG, {H5D_DEF_LAYOUT_CHUNK_INIT}, H5D_DEF_STORAGE_CONTIG}
+#define H5D_DEF_LAYOUT_CHUNK    {H5D_CHUNKED, H5O_LAYOUT_VERSION_DEFAULT, H5D_LOPS_CHUNK, {H5D_DEF_LAYOUT_CHUNK_INIT}, H5D_DEF_STORAGE_CHUNK}
+#define H5D_DEF_LAYOUT_VIRTUAL  {H5D_VIRTUAL, H5O_LAYOUT_VERSION_4, H5D_LOPS_VIRTUAL, {H5D_DEF_LAYOUT_CHUNK_INIT}, H5D_DEF_STORAGE_VIRTUAL}
 #else /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
 /* Note that the compact & chunked layout initialization values are using the
  *      contiguous layout initialization in the union, because the contiguous
  *      layout is first in the union.  These values are overridden in the
  *      H5P__init_def_layout() routine. -QAK
  */
-#define H5D_DEF_LAYOUT_COMPACT  {H5D_COMPACT, H5O_LAYOUT_VERSION_3, NULL, {H5D_DEF_LAYOUT_CHUNK_INIT}, {H5D_CONTIGUOUS, H5D_DEF_STORAGE_CONTIG_INIT}}
-#define H5D_DEF_LAYOUT_CONTIG   {H5D_CONTIGUOUS, H5O_LAYOUT_VERSION_3, NULL, {H5D_DEF_LAYOUT_CHUNK_INIT}, {H5D_CONTIGUOUS, H5D_DEF_STORAGE_CONTIG_INIT}}
-#define H5D_DEF_LAYOUT_CHUNK    {H5D_CHUNKED, H5O_LAYOUT_VERSION_3, NULL, {H5D_DEF_LAYOUT_CHUNK_INIT}, {H5D_CONTIGUOUS, H5D_DEF_STORAGE_CONTIG_INIT}}
+#define H5D_DEF_LAYOUT_COMPACT  {H5D_COMPACT, H5O_LAYOUT_VERSION_DEFAULT, NULL, {H5D_DEF_LAYOUT_CHUNK_INIT}, {H5D_CONTIGUOUS, H5D_DEF_STORAGE_CONTIG_INIT}}
+#define H5D_DEF_LAYOUT_CONTIG   {H5D_CONTIGUOUS, H5O_LAYOUT_VERSION_DEFAULT, NULL, {H5D_DEF_LAYOUT_CHUNK_INIT}, {H5D_CONTIGUOUS, H5D_DEF_STORAGE_CONTIG_INIT}}
+#define H5D_DEF_LAYOUT_CHUNK    {H5D_CHUNKED, H5O_LAYOUT_VERSION_DEFAULT, NULL, {H5D_DEF_LAYOUT_CHUNK_INIT}, {H5D_CONTIGUOUS, H5D_DEF_STORAGE_CONTIG_INIT}}
+#define H5D_DEF_LAYOUT_VIRTUAL  {H5D_VIRTUAL, H5O_LAYOUT_VERSION_4, NULL, {H5D_DEF_LAYOUT_CHUNK_INIT}, {H5D_CONTIGUOUS, H5D_DEF_STORAGE_CONTIG_INIT}}
 #endif /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
 
 /* ========  Dataset creation properties ======== */
 /* Definitions for storage layout property */
 #define H5D_CRT_LAYOUT_SIZE        sizeof(H5O_layout_t)
 #define H5D_CRT_LAYOUT_DEF         H5D_DEF_LAYOUT_CONTIG
+#define H5D_CRT_LAYOUT_SET         H5P__dcrt_layout_set
+#define H5D_CRT_LAYOUT_GET         H5P__dcrt_layout_get
+#define H5D_CRT_LAYOUT_ENC         H5P__dcrt_layout_enc
+#define H5D_CRT_LAYOUT_DEC         H5P__dcrt_layout_dec
+#define H5D_CRT_LAYOUT_DEL         H5P__dcrt_layout_del
+#define H5D_CRT_LAYOUT_COPY        H5P__dcrt_layout_copy
 #define H5D_CRT_LAYOUT_CMP         H5P__dcrt_layout_cmp
+#define H5D_CRT_LAYOUT_CLOSE       H5P__dcrt_layout_close
 /* Definitions for fill value.  size=0 means fill value will be 0 as
  * library default; size=-1 means fill value is undefined. */
 #define H5D_CRT_FILL_VALUE_SIZE    sizeof(H5O_fill_t)
 #define H5D_CRT_FILL_VALUE_DEF     {{0, NULL, H5O_NULL_ID, {{0, HADDR_UNDEF}}}, H5O_FILL_VERSION_2, NULL, 0, NULL, H5D_ALLOC_TIME_LATE, H5D_FILL_TIME_IFSET, FALSE}
+#define H5D_CRT_FILL_VALUE_SET     H5P__dcrt_fill_value_set
+#define H5D_CRT_FILL_VALUE_GET     H5P__dcrt_fill_value_get
+#define H5D_CRT_FILL_VALUE_ENC     H5P__dcrt_fill_value_enc
+#define H5D_CRT_FILL_VALUE_DEC     H5P__dcrt_fill_value_dec
+#define H5D_CRT_FILL_VALUE_DEL     H5P__dcrt_fill_value_del
+#define H5D_CRT_FILL_VALUE_COPY    H5P__dcrt_fill_value_copy
 #define H5D_CRT_FILL_VALUE_CMP     H5P_fill_value_cmp
+#define H5D_CRT_FILL_VALUE_CLOSE   H5P__dcrt_fill_value_close
 /* Definitions for space allocation time state */
 #define H5D_CRT_ALLOC_TIME_STATE_SIZE   sizeof(unsigned)
 #define H5D_CRT_ALLOC_TIME_STATE_DEF    1
+#define H5D_CRT_ALLOC_TIME_STATE_ENC    H5P__encode_unsigned
+#define H5D_CRT_ALLOC_TIME_STATE_DEC    H5P__decode_unsigned
 /* Definitions for external file list */
 #define H5D_CRT_EXT_FILE_LIST_SIZE sizeof(H5O_efl_t)
 #define H5D_CRT_EXT_FILE_LIST_DEF  {HADDR_UNDEF, 0, 0, NULL}
+#define H5D_CRT_EXT_FILE_LIST_SET  H5P__dcrt_ext_file_list_set
+#define H5D_CRT_EXT_FILE_LIST_GET  H5P__dcrt_ext_file_list_get
+#define H5D_CRT_EXT_FILE_LIST_ENC  H5P__dcrt_ext_file_list_enc
+#define H5D_CRT_EXT_FILE_LIST_DEC  H5P__dcrt_ext_file_list_dec
+#define H5D_CRT_EXT_FILE_LIST_DEL  H5P__dcrt_ext_file_list_del
+#define H5D_CRT_EXT_FILE_LIST_COPY H5P__dcrt_ext_file_list_copy
 #define H5D_CRT_EXT_FILE_LIST_CMP  H5P__dcrt_ext_file_list_cmp
+#define H5D_CRT_EXT_FILE_LIST_CLOSE H5P__dcrt_ext_file_list_close
 
 
 /******************/
@@ -113,12 +144,31 @@ static herr_t H5P__init_def_layout(void);
 
 /* Property class callbacks */
 static herr_t H5P__dcrt_reg_prop(H5P_genclass_t *pclass);
-static herr_t H5P__dcrt_copy(hid_t new_plist_t, hid_t old_plist_t, void *copy_data);
-static herr_t H5P__dcrt_close(hid_t dxpl_id, void *close_data);
 
 /* Property callbacks */
+static herr_t H5P__dcrt_layout_set(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__dcrt_layout_get(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__dcrt_layout_enc(const void *value, void **pp, size_t *size);
+static herr_t H5P__dcrt_layout_dec(const void **pp, void *value);
+static herr_t H5P__dcrt_layout_del(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__dcrt_layout_copy(const char *name, size_t size, void *value);
 static int H5P__dcrt_layout_cmp(const void *value1, const void *value2, size_t size);
+static herr_t H5P__dcrt_layout_close(const char *name, size_t size, void *value);
+static herr_t H5P__dcrt_fill_value_set(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__dcrt_fill_value_get(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__dcrt_fill_value_enc(const void *value, void **pp, size_t *size);
+static herr_t H5P__dcrt_fill_value_dec(const void **pp, void *value);
+static herr_t H5P__dcrt_fill_value_del(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__dcrt_fill_value_copy(const char *name, size_t size, void *value);
+static herr_t H5P__dcrt_fill_value_close(const char *name, size_t size, void *value);
+static herr_t H5P__dcrt_ext_file_list_set(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__dcrt_ext_file_list_get(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__dcrt_ext_file_list_enc(const void *value, void **pp, size_t *size);
+static herr_t H5P__dcrt_ext_file_list_dec(const void **pp, void *value);
+static herr_t H5P__dcrt_ext_file_list_del(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__dcrt_ext_file_list_copy(const char *name, size_t size, void *value);
 static int H5P__dcrt_ext_file_list_cmp(const void *value1, const void *value2, size_t size);
+static herr_t H5P__dcrt_ext_file_list_close(const char *name, size_t size, void *value);
 
 
 /*********************/
@@ -138,9 +188,9 @@ const H5P_libclass_t H5P_CLS_DCRT[1] = {{
 
     NULL,		        /* Class creation callback      */
     NULL,		        /* Class creation callback info */
-    H5P__dcrt_copy,		/* Class copy callback          */
+    NULL,                       /* Class copy callback          */
     NULL,		        /* Class copy callback info     */
-    H5P__dcrt_close,		/* Class close callback         */
+    NULL,                       /* Class close callback         */
     NULL 		        /* Class close callback info    */
 }};
 
@@ -152,15 +202,28 @@ const H5P_libclass_t H5P_CLS_DCRT[1] = {{
 /* Declare extern the free list to manage blocks of type conversion data */
 H5FL_BLK_EXTERN(type_conv);
 
+
+/***************************/
+/* Local Private Variables */
+/***************************/
+
+/* Property value defaults */
+static const H5O_layout_t H5D_def_layout_g = H5D_CRT_LAYOUT_DEF;        /* Default storage layout */
+static const H5O_fill_t H5D_def_fill_g = H5D_CRT_FILL_VALUE_DEF;        /* Default fill value */
+static const unsigned H5D_def_alloc_time_state_g = H5D_CRT_ALLOC_TIME_STATE_DEF;  /* Default allocation time state */
+static const H5O_efl_t H5D_def_efl_g = H5D_CRT_EXT_FILE_LIST_DEF;                 /* Default external file list */
+
 /* Defaults for each type of layout */
 #ifdef H5_HAVE_C99_DESIGNATED_INITIALIZER
 static const H5O_layout_t H5D_def_layout_compact_g = H5D_DEF_LAYOUT_COMPACT;
 static const H5O_layout_t H5D_def_layout_contig_g = H5D_DEF_LAYOUT_CONTIG;
 static const H5O_layout_t H5D_def_layout_chunk_g = H5D_DEF_LAYOUT_CHUNK;
+static const H5O_layout_t H5D_def_layout_virtual_g = H5D_DEF_LAYOUT_VIRTUAL;
 #else /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
 static H5O_layout_t H5D_def_layout_compact_g = H5D_DEF_LAYOUT_COMPACT;
 static H5O_layout_t H5D_def_layout_contig_g = H5D_DEF_LAYOUT_CONTIG;
 static H5O_layout_t H5D_def_layout_chunk_g = H5D_DEF_LAYOUT_CHUNK;
+static H5O_layout_t H5D_def_layout_virtual_g = H5D_DEF_LAYOUT_VIRTUAL;
 static hbool_t H5P_dcrt_def_layout_init_g = FALSE;
 #endif /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
 
@@ -180,28 +243,32 @@ static hbool_t H5P_dcrt_def_layout_init_g = FALSE;
 static herr_t
 H5P__dcrt_reg_prop(H5P_genclass_t *pclass)
 {
-    H5O_layout_t layout = H5D_CRT_LAYOUT_DEF;          /* Default storage layout */
-    H5O_fill_t fill = H5D_CRT_FILL_VALUE_DEF;           /* Default fill value */
-    unsigned alloc_time_state = H5D_CRT_ALLOC_TIME_STATE_DEF;   /* Default allocation time state */
-    H5O_efl_t efl = H5D_CRT_EXT_FILE_LIST_DEF;          /* Default external file list */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
 
     /* Register the storage layout property */
-    if(H5P_register_real(pclass, H5D_CRT_LAYOUT_NAME, H5D_CRT_LAYOUT_SIZE, &layout, NULL, NULL, NULL, NULL, NULL, H5D_CRT_LAYOUT_CMP, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_CRT_LAYOUT_NAME, H5D_CRT_LAYOUT_SIZE, &H5D_def_layout_g, 
+            NULL, H5D_CRT_LAYOUT_SET, H5D_CRT_LAYOUT_GET, H5D_CRT_LAYOUT_ENC, H5D_CRT_LAYOUT_DEC,
+            H5D_CRT_LAYOUT_DEL, H5D_CRT_LAYOUT_COPY, H5D_CRT_LAYOUT_CMP, H5D_CRT_LAYOUT_CLOSE) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the fill value property */
-    if(H5P_register_real(pclass, H5D_CRT_FILL_VALUE_NAME, H5D_CRT_FILL_VALUE_SIZE, &fill, NULL, NULL, NULL, NULL, NULL, H5D_CRT_FILL_VALUE_CMP, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_CRT_FILL_VALUE_NAME, H5D_CRT_FILL_VALUE_SIZE, &H5D_def_fill_g, 
+            NULL, H5D_CRT_FILL_VALUE_SET, H5D_CRT_FILL_VALUE_GET, H5D_CRT_FILL_VALUE_ENC, H5D_CRT_FILL_VALUE_DEC,
+            H5D_CRT_FILL_VALUE_DEL, H5D_CRT_FILL_VALUE_COPY, H5D_CRT_FILL_VALUE_CMP, H5D_CRT_FILL_VALUE_CLOSE) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the space allocation time state property */
-    if(H5P_register_real(pclass, H5D_CRT_ALLOC_TIME_STATE_NAME, H5D_CRT_ALLOC_TIME_STATE_SIZE, &alloc_time_state, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_CRT_ALLOC_TIME_STATE_NAME, H5D_CRT_ALLOC_TIME_STATE_SIZE, &H5D_def_alloc_time_state_g, 
+            NULL, NULL, NULL, H5D_CRT_ALLOC_TIME_STATE_ENC, H5D_CRT_ALLOC_TIME_STATE_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the external file list property */
-    if(H5P_register_real(pclass, H5D_CRT_EXT_FILE_LIST_NAME, H5D_CRT_EXT_FILE_LIST_SIZE, &efl, NULL, NULL, NULL, NULL, NULL, H5D_CRT_EXT_FILE_LIST_CMP, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_CRT_EXT_FILE_LIST_NAME, H5D_CRT_EXT_FILE_LIST_SIZE, &H5D_def_efl_g, 
+            NULL, H5D_CRT_EXT_FILE_LIST_SET, H5D_CRT_EXT_FILE_LIST_GET, H5D_CRT_EXT_FILE_LIST_ENC, H5D_CRT_EXT_FILE_LIST_DEC,
+            H5D_CRT_EXT_FILE_LIST_DEL, H5D_CRT_EXT_FILE_LIST_COPY, H5D_CRT_EXT_FILE_LIST_CMP, H5D_CRT_EXT_FILE_LIST_CLOSE) < 0)
        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
 done:
@@ -210,165 +277,464 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:       H5P__dcrt_copy
+ * Function:    H5P__dcrt_layout_set
  *
- * Purpose:        Callback routine which is called whenever any dataset
- *                 creation property list is copied.  This routine copies
- *                 the properties from the old list to the new list.
+ * Purpose:     Copies a layout property when it's set for a property list
  *
- * Return:         Success:        Non-negative
- *                 Failure:        Negative
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
  *
- * Programmer:     Raymond Lu
- *                 Tuesday, October 2, 2001
+ * Programmer:  Quincey Koziol
+ *              Tuesday, Sept 1, 2015
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
-H5P__dcrt_copy(hid_t dst_plist_id, hid_t src_plist_id, void H5_ATTR_UNUSED *copy_data)
+H5P__dcrt_layout_set(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
 {
-    H5O_fill_t     src_fill, dst_fill;          /* Source & destination fill values */
-    H5O_efl_t      src_efl, dst_efl;            /* Source & destination external file lists */
-    H5O_layout_t   src_layout, dst_layout;      /* Source & destination layout */
-    H5P_genplist_t *src_plist;                  /* Pointer to source property list */
-    H5P_genplist_t *dst_plist;                  /* Pointer to destination property list */
-    herr_t         ret_value = SUCCEED;         /* Return value */
+    H5O_layout_t    *layout = (H5O_layout_t *)value; /* Create local aliases for values */
+    H5O_layout_t    new_layout;
+    herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
 
-    /* Verify property list IDs */
-    if(NULL == (dst_plist = (H5P_genplist_t *)H5I_object(dst_plist_id)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset creation property list")
-    if(NULL == (src_plist = (H5P_genplist_t *)H5I_object(src_plist_id)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset creation property list")
+    /* Sanity check */
+    HDassert(value);
 
-    /* Get the layout, fill value, external file list, and data pipeline
-     *  properties from the old property list
-     */
-    if(H5P_get(src_plist, H5D_CRT_LAYOUT_NAME, &src_layout) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get layout")
-    if(H5P_get(src_plist, H5D_CRT_FILL_VALUE_NAME, &src_fill) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
-    if(H5P_get(src_plist, H5D_CRT_EXT_FILE_LIST_NAME, &src_efl) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external file list")
+    /* Make copy of layout */
+    if(NULL == H5O_msg_copy(H5O_LAYOUT_ID, layout, &new_layout))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy layout")
+
+    /* Copy new layout message over old one */
+    *layout = new_layout;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_layout_set() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dcrt_layout_get
+ *
+ * Purpose:     Copies a layout property when it's retrieved from a property list
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, Sept 1, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dcrt_layout_get(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    H5O_layout_t    *layout = (H5O_layout_t *)value; /* Create local aliases for values */
+    H5O_layout_t    new_layout;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
 
     /* Make copy of layout */
-    if(NULL == H5O_msg_copy(H5O_LAYOUT_ID, &src_layout, &dst_layout))
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't copy layout")
+    if(NULL == H5O_msg_copy(H5O_LAYOUT_ID, layout, &new_layout))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy layout")
+
+    /* Copy new layout message over old one */
+    *layout = new_layout;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_layout_get() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dcrt_layout_enc
+ *
+ * Purpose:        Callback routine which is called whenever the layout
+ *                 property in the dataset creation property list is
+ *                 encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 Monday, October 10, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dcrt_layout_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5O_layout_t *layout = (const H5O_layout_t *)value; /* Create local aliases for values */
+    uint8_t **pp = (uint8_t **)_pp;
+    uint8_t *tmp_p;
+    size_t tmp_size;
+    size_t u;                           /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(layout);
+    HDassert(size);
+
+    if(NULL != *pp) {
+        /* Encode layout type */
+        *(*pp)++ = (uint8_t)layout->type;
+        *size += sizeof(uint8_t);
+
+        /* If layout is chunked, encode chunking structure */
+        if(H5D_CHUNKED == layout->type) {
+            /* Encode rank */
+            *(*pp)++ = (uint8_t)layout->u.chunk.ndims;
+            *size += sizeof(uint8_t);
+
+            /* Encode chunk dims */
+            HDcompile_assert(sizeof(uint32_t) == sizeof(layout->u.chunk.dim[0]));
+            for(u = 0; u < (size_t)layout->u.chunk.ndims; u++) {
+                UINT32ENCODE(*pp, layout->u.chunk.dim[u])
+                *size += sizeof(uint32_t);
+            } /* end for */
+        } /* end if */
+        else if(H5D_VIRTUAL == layout->type) {
+            uint64_t nentries = (uint64_t)layout->storage.u.virt.list_nused;
+
+            /* Encode number of entries */
+            UINT64ENCODE(*pp, nentries)
+            *size += (size_t)8;
+
+            /* Iterate over entries */
+            for(u = 0; u < layout->storage.u.virt.list_nused; u++) {
+                /* Source file name */
+                tmp_size = HDstrlen(layout->storage.u.virt.list[u].source_file_name) + (size_t)1;
+                (void)HDmemcpy(*pp, layout->storage.u.virt.list[u].source_file_name, tmp_size);
+                *pp += tmp_size;
+                *size += tmp_size;
+
+                /* Source dataset name */
+                tmp_size = HDstrlen(layout->storage.u.virt.list[u].source_dset_name) + (size_t)1;
+                (void)HDmemcpy(*pp, layout->storage.u.virt.list[u].source_dset_name, tmp_size);
+                *pp += tmp_size;
+                *size += tmp_size;
+
+                /* Source selection.  Note that we are not passing the real
+                 * allocated size because we do not know it.  H5P__encode should
+                 * have verified that the buffer is large enough for the entire
+                 * list before we get here. */
+                tmp_size = (size_t)-1;
+                tmp_p = *pp;
+                if(H5S_encode(layout->storage.u.virt.list[u].source_select, pp, &tmp_size) < 0)
+                    HGOTO_ERROR(H5E_PLIST, H5E_CANTENCODE, FAIL, "unable to serialize source selection")
+                *size += (size_t)(*pp - tmp_p);
+
+                /* Virtual dataset selection.  Same notes as above apply. */
+                tmp_size = (size_t)-1;
+                tmp_p = *pp;
+                if(H5S_encode(layout->storage.u.virt.list[u].source_dset.virtual_select, pp, &tmp_size) < 0)
+                    HGOTO_ERROR(H5E_PLIST, H5E_CANTENCODE, FAIL, "unable to serialize virtual selection")
+                *size += (size_t)(*pp - tmp_p);
+            } /* end for */
+        } /* end if */
+    } /* end if */
+    else {
+        /* Size of layout type */
+        *size += sizeof(uint8_t);
+
+        /* If layout is chunked, calculate chunking structure */
+        if(H5D_CHUNKED == layout->type) {
+            *size += sizeof(uint8_t);
+            *size += layout->u.chunk.ndims * sizeof(uint32_t);
+        } /* end if */
+        else if(H5D_VIRTUAL == layout->type) {
+            /* Calculate size of virtual layout info */
+            /* number of entries */
+            *size += (size_t)8;
+
+            /* Iterate over entries */
+            for(u = 0; u < layout->storage.u.virt.list_nused; u++) {
+                /* Source file name */
+                tmp_size = HDstrlen(layout->storage.u.virt.list[u].source_file_name) + (size_t)1;
+                *size += tmp_size;
+
+                /* Source dataset name */
+                tmp_size = HDstrlen(layout->storage.u.virt.list[u].source_dset_name) + (size_t)1;
+                *size += tmp_size;
+
+                /* Source selection */
+                tmp_size = (size_t)0;
+                tmp_p = NULL;
+                if(H5S_encode(layout->storage.u.virt.list[u].source_select, &tmp_p, &tmp_size) < 0)
+                    HGOTO_ERROR(H5E_PLIST, H5E_CANTENCODE, FAIL, "unable to serialize source selection")
+                *size += tmp_size;
+
+                /* Virtual dataset selection */
+                tmp_size = (size_t)0;
+                tmp_p = NULL;
+                if(H5S_encode(layout->storage.u.virt.list[u].source_dset.virtual_select, &tmp_p, &tmp_size) < 0)
+                    HGOTO_ERROR(H5E_PLIST, H5E_CANTENCODE, FAIL, "unable to serialize virtual selection")
+                *size += tmp_size;
+            } /* end for */
+        } /* end if */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_layout_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dcrt_layout_dec
+ *
+ * Purpose:        Callback routine which is called whenever the layout
+ *                 property in the dataset creation property list is
+ *                 decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 Monday, October 10, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dcrt_layout_dec(const void **_pp, void *value)
+{
+    const H5O_layout_t *layout;         /* Storage layout */
+    H5O_layout_t tmp_layout;            /* Temporary local layout structure */
+    H5D_layout_t type;                  /* Layout type */
+    const uint8_t **pp = (const uint8_t **)_pp;
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    /* Reset layout values set when dataset is created */
-    dst_layout.ops = NULL;
-    switch(dst_layout.type) {
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(value);
+
+    /* Decode layout type */
+    type = (H5D_layout_t)*(*pp)++;
+
+    /* set default layout in case the type is compact or contiguous, otherwise
+     * decode the chunked structure and set chunked layout */
+    switch(type) {
         case H5D_COMPACT:
-            dst_layout.storage.u.compact.buf = H5MM_xfree(dst_layout.storage.u.compact.buf);
-            HDmemset(&dst_layout.storage.u.compact, 0, sizeof(dst_layout.storage.u.compact));
+            layout = &H5D_def_layout_compact_g;
             break;
 
         case H5D_CONTIGUOUS:
-            dst_layout.storage.u.contig.addr = HADDR_UNDEF;
-            dst_layout.storage.u.contig.size = 0;
+            layout = &H5D_def_layout_contig_g;
             break;
 
         case H5D_CHUNKED:
-            /* Reset chunk size */
-            dst_layout.u.chunk.size = 0;
+            {
+                unsigned ndims;                 /* Number of chunk dimensions */
+
+                /* Decode the number of chunk dimensions */
+                ndims = *(*pp)++;
 
-            /* Reset index info, if the chunk ops are set */
-            if(dst_layout.storage.u.chunk.ops)
-		/* Reset address and pointer of the array struct for the chunked storage index */
-                if(H5D_chunk_idx_reset(&dst_layout.storage.u.chunk, TRUE) < 0)
-                    HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "unable to reset chunked storage index in dest")
+                /* default chunk layout */
+                if(0 == ndims)
+                    layout = &H5D_def_layout_chunk_g;
+                else { /* chunk layout structure is encoded*/
+                    unsigned u;             /* Local index variable */
 
-            /* Reset chunk index ops */
-            dst_layout.storage.u.chunk.ops = NULL;
+                    /* Initialize to default values */
+                    tmp_layout = H5D_def_layout_chunk_g;
+
+                    /* Set rank & dimensions */
+                    tmp_layout.u.chunk.ndims = (unsigned)ndims;
+                    for(u = 0; u < ndims; u++)
+                        UINT32DECODE(*pp, tmp_layout.u.chunk.dim[u])
+
+                    /* Point at the newly set up struct */
+                    layout = &tmp_layout;
+                } /* end else */
+            }
+            break;
+
+        case H5D_VIRTUAL:
+            {
+                uint64_t nentries;              /* Number of VDS mappings */
+
+                /* Decode number of entries */
+                UINT64DECODE(*pp, nentries)
+
+                if(nentries == (uint64_t)0)
+                    /* Just use the default struct */
+                    layout = &H5D_def_layout_virtual_g;
+                else {
+                    size_t tmp_size;
+                    size_t u;           /* Local index variable */
+
+                    /* Initialize to default values */
+                    tmp_layout = H5D_def_layout_virtual_g;
+
+                    /* Allocate entry list */
+                    if(NULL == (tmp_layout.storage.u.virt.list = (H5O_storage_virtual_ent_t *)H5MM_calloc((size_t)nentries * sizeof(H5O_storage_virtual_ent_t))))
+                        HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "unable to allocate heap block")
+                    tmp_layout.storage.u.virt.list_nalloc = (size_t)nentries;
+                    tmp_layout.storage.u.virt.list_nused = (size_t)nentries;
+
+                    /* Decode each entry */
+                    for(u = 0; u < (size_t)nentries; u++) {
+                        /* Source file name */
+                        tmp_size = HDstrlen((const char *)*pp) + 1;
+                        if(NULL == (tmp_layout.storage.u.virt.list[u].source_file_name = (char *)H5MM_malloc(tmp_size)))
+                            HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "unable to allocate memory for source file name")
+                        (void)HDmemcpy(tmp_layout.storage.u.virt.list[u].source_file_name, *pp, tmp_size);
+                        *pp += tmp_size;
+
+                        /* Source dataset name */
+                        tmp_size = HDstrlen((const char *)*pp) + 1;
+                        if(NULL == (tmp_layout.storage.u.virt.list[u].source_dset_name = (char *)H5MM_malloc(tmp_size)))
+                            HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "unable to allocate memory for source dataset name")
+                        (void)HDmemcpy(tmp_layout.storage.u.virt.list[u].source_dset_name, *pp, tmp_size);
+                        *pp += tmp_size;
+
+                        /* Source selection */
+                        if(NULL == (tmp_layout.storage.u.virt.list[u].source_select = H5S_decode(pp)))
+                            HGOTO_ERROR(H5E_PLIST, H5E_CANTDECODE, FAIL, "can't decode source space selection")
+                        tmp_layout.storage.u.virt.list[u].source_space_status = H5O_VIRTUAL_STATUS_USER;
+
+                        /* Virtual selection */
+                        if(NULL == (tmp_layout.storage.u.virt.list[u].source_dset.virtual_select = H5S_decode(pp)))
+                            HGOTO_ERROR(H5E_PLIST, H5E_CANTDECODE, FAIL, "can't decode virtual space selection")
+                        tmp_layout.storage.u.virt.list[u].virtual_space_status = H5O_VIRTUAL_STATUS_USER;
+
+                        /* Parse source file and dataset names for "printf"
+                         * style format specifiers */
+                        if(H5D_virtual_parse_source_name(tmp_layout.storage.u.virt.list[u].source_file_name, &tmp_layout.storage.u.virt.list[u].parsed_source_file_name, &tmp_layout.storage.u.virt.list[u].psfn_static_strlen, &tmp_layout.storage.u.virt.list[u].psfn_nsubs) < 0)
+                            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't parse source file name")
+                        if(H5D_virtual_parse_source_name(tmp_layout.storage.u.virt.list[u].source_dset_name, &tmp_layout.storage.u.virt.list[u].parsed_source_dset_name, &tmp_layout.storage.u.virt.list[u].psdn_static_strlen, &tmp_layout.storage.u.virt.list[u].psdn_nsubs) < 0)
+                            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't parse source dataset name")
+
+                        /* Set source names in source_dset struct */
+                        if((tmp_layout.storage.u.virt.list[u].psfn_nsubs == 0)
+                                && (tmp_layout.storage.u.virt.list[u].psdn_nsubs == 0)) {
+                            if(tmp_layout.storage.u.virt.list[u].parsed_source_file_name)
+                                tmp_layout.storage.u.virt.list[u].source_dset.file_name = tmp_layout.storage.u.virt.list[u].parsed_source_file_name->name_segment;
+                            else
+                                tmp_layout.storage.u.virt.list[u].source_dset.file_name = tmp_layout.storage.u.virt.list[u].source_file_name;
+                            if(tmp_layout.storage.u.virt.list[u].parsed_source_dset_name)
+                                tmp_layout.storage.u.virt.list[u].source_dset.dset_name = tmp_layout.storage.u.virt.list[u].parsed_source_dset_name->name_segment;
+                            else
+                                tmp_layout.storage.u.virt.list[u].source_dset.dset_name = tmp_layout.storage.u.virt.list[u].source_dset_name;
+                        } /* end if */
+
+                        /* unlim_dim fields */
+                        tmp_layout.storage.u.virt.list[u].unlim_dim_source = H5S_get_select_unlim_dim(tmp_layout.storage.u.virt.list[u].source_select);
+                        tmp_layout.storage.u.virt.list[u].unlim_dim_virtual = H5S_get_select_unlim_dim(tmp_layout.storage.u.virt.list[u].source_dset.virtual_select);
+                        tmp_layout.storage.u.virt.list[u].unlim_extent_source = HSIZE_UNDEF;
+                        tmp_layout.storage.u.virt.list[u].unlim_extent_virtual = HSIZE_UNDEF;
+                        tmp_layout.storage.u.virt.list[u].clip_size_source = HSIZE_UNDEF;
+                        tmp_layout.storage.u.virt.list[u].clip_size_virtual = HSIZE_UNDEF;
+
+                        /* Clipped selections */
+                        if(tmp_layout.storage.u.virt.list[u].unlim_dim_virtual < 0) {
+                            tmp_layout.storage.u.virt.list[u].source_dset.clipped_source_select = tmp_layout.storage.u.virt.list[u].source_select;
+                            tmp_layout.storage.u.virt.list[u].source_dset.clipped_virtual_select = tmp_layout.storage.u.virt.list[u].source_dset.virtual_select;
+                        } /* end if */
+
+                        /* Update min_dims */
+                        if(H5D_virtual_update_min_dims(&tmp_layout, u) < 0)
+                            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "unable to update virtual dataset minimum dimensions")
+                    } /* end for */
+
+                    /* Point at the newly set up struct */
+                    layout = &tmp_layout;
+                } /* end else */
+            } /* end block */
             break;
 
         case H5D_LAYOUT_ERROR:
         case H5D_NLAYOUTS:
         default:
-            HDassert(0 && "Unknown layout type!");
+            HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "bad layout type")
     } /* end switch */
 
-    /* Make copy of fill value */
-    if(NULL == H5O_msg_copy(H5O_FILL_ID, &src_fill, &dst_fill))
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't copy fill value")
+    /* Set the value */
+    HDmemcpy(value, layout, sizeof(H5O_layout_t));
 
-    /* Make copy of external file list */
-    HDmemset(&dst_efl, 0, sizeof(H5O_efl_t));
-    if(NULL == H5O_msg_copy(H5O_EFL_ID, &src_efl, &dst_efl))
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't copy external file list")
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_layout_dec() */
 
-    /* Reset efl name_offset and heap_addr, these are the values when the dataset is created */
-    if(dst_efl.slot) {
-        unsigned int i;
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dcrt_layout_del
+ *
+ * Purpose:     Frees memory used to store the layout property
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Neil Fortner
+ *              Tuesday, Feb 10, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dcrt_layout_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-        dst_efl.heap_addr = HADDR_UNDEF;
-        for(i = 0; i < dst_efl.nused; i++)
-            dst_efl.slot[i].name_offset = 0;
-    } /* end if */
+    FUNC_ENTER_STATIC
 
-    /* Set the layout, fill value, external file list, and data pipeline
-     *  properties for the destination property list
-     */
-    if(H5P_set(dst_plist, H5D_CRT_LAYOUT_NAME, &dst_layout) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set layout")
-    if(H5P_set(dst_plist, H5D_CRT_FILL_VALUE_NAME, &dst_fill) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set fill value")
-    if(H5P_set(dst_plist, H5D_CRT_EXT_FILE_LIST_NAME, &dst_efl) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set external file list")
+    /* Sanity check */
+    HDassert(value);
+
+    /* Reset the old layout */
+    if(H5O_msg_reset(H5O_LAYOUT_ID, value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTRESET, FAIL, "can't release layout message")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P__dcrt_copy() */
+} /* end H5P__dcrt_layout_del() */
 
 

-/*-------------------------------------------------------------------------
- * Function:	H5P__dcrt_close
+/*--------------------------------------------------------------------------
+ * Function:    H5P__dcrt_layout_copy
  *
- * Purpose:	Callback routine which is called whenever any dataset create
- *              property list is closed.  This routine performs any generic
- *              cleanup needed on the properties the library put into the list.
+ * Purpose:     Copy the layout property
  *
- * Return:	Success:	Non-negative
- *		Failure:	Negative
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
  *
- * Programmer:	Quincey Koziol
- *              Wednesday, July 11, 2001
+ * Programmer:  Neil Fortner
+ *              Monday, Feb 9, 2015
  *
- *-------------------------------------------------------------------------
+ *--------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
-H5P__dcrt_close(hid_t dcpl_id, void H5_ATTR_UNUSED *close_data)
+H5P__dcrt_layout_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size,
+    void *value)
 {
-    H5O_fill_t      fill;               /* Fill value */
-    H5O_efl_t       efl;                /* External file list */
-    H5P_genplist_t *plist;              /* Property list */
-    herr_t ret_value = SUCCEED;         /* Return value */
+    H5O_layout_t    *layout = (H5O_layout_t *)value; /* Create local aliases for values */
+    H5O_layout_t    new_layout;
+    herr_t          ret_value = SUCCEED;
 
     FUNC_ENTER_STATIC
 
-    /* Check arguments */
-    if(NULL == (plist = (H5P_genplist_t *)H5I_object(dcpl_id)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset creation property list")
+    HDassert(layout);
 
-    /* Get the fill value, external file list, and data pipeline properties
-     * from the old property list */
-    if(H5P_get(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
-    if(H5P_get(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external file list")
+    /* Make copy of layout */
+    if(NULL == H5O_msg_copy(H5O_LAYOUT_ID, layout, &new_layout))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy layout")
 
-    /* Clean up any values set for the fill-value and external file-list */
-    if(H5O_msg_reset(H5O_FILL_ID, &fill) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "can't release fill info")
-    if(H5O_msg_reset(H5O_EFL_ID, &efl) < 0)
-        HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "can't release external file list info")
+    /* Set new layout message directly into property list */
+    *layout = new_layout;
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P__dcrt_close() */
+} /* end H5P__dcrt_layout_copy() */
 
 

 /*-------------------------------------------------------------------------
@@ -388,7 +754,8 @@ done:
  *-------------------------------------------------------------------------
  */
 static int
-H5P__dcrt_layout_cmp(const void *_layout1, const void *_layout2, size_t H5_ATTR_UNUSED size)
+H5P__dcrt_layout_cmp(const void *_layout1, const void *_layout2,
+    size_t H5_ATTR_UNUSED size)
 {
     const H5O_layout_t *layout1 = (const H5O_layout_t *)_layout1,     /* Create local aliases for values */
         *layout2 = (const H5O_layout_t *)_layout2;
@@ -402,12 +769,16 @@ H5P__dcrt_layout_cmp(const void *_layout1, const void *_layout2, size_t H5_ATTR_
     HDassert(size == sizeof(H5O_layout_t));
 
     /* Check for different layout type */
-    if(layout1->type < layout2->type) HGOTO_DONE(-1)
-    if(layout1->type > layout2->type) HGOTO_DONE(1)
+    if(layout1->type < layout2->type)
+        HGOTO_DONE(-1)
+    if(layout1->type > layout2->type)
+        HGOTO_DONE(1)
 
     /* Check for different layout version */
-    if(layout1->version < layout2->version) HGOTO_DONE(-1)
-    if(layout1->version > layout2->version) HGOTO_DONE(1)
+    if(layout1->version < layout2->version)
+        HGOTO_DONE(-1)
+    if(layout1->version > layout2->version)
+        HGOTO_DONE(1)
 
     /* Compare non-dataset-specific fields in layout info */
     switch(layout1->type) {
@@ -420,17 +791,66 @@ H5P__dcrt_layout_cmp(const void *_layout1, const void *_layout2, size_t H5_ATTR_
                 unsigned u;     /* Local index variable */
 
                 /* Check the number of dimensions */
-                if(layout1->u.chunk.ndims < layout2->u.chunk.ndims) HGOTO_DONE(-1)
-                if(layout1->u.chunk.ndims > layout2->u.chunk.ndims) HGOTO_DONE(1)
+                if(layout1->u.chunk.ndims < layout2->u.chunk.ndims)
+                    HGOTO_DONE(-1)
+                if(layout1->u.chunk.ndims > layout2->u.chunk.ndims)
+                    HGOTO_DONE(1)
 
                 /* Compare the chunk dims */
                 for(u = 0; u < layout1->u.chunk.ndims - 1; u++) {
-                    if(layout1->u.chunk.dim[u] < layout2->u.chunk.dim[u]) HGOTO_DONE(-1)
-                    if(layout1->u.chunk.dim[u] > layout2->u.chunk.dim[u]) HGOTO_DONE(1)
+                    if(layout1->u.chunk.dim[u] < layout2->u.chunk.dim[u])
+                        HGOTO_DONE(-1)
+                    if(layout1->u.chunk.dim[u] > layout2->u.chunk.dim[u])
+                        HGOTO_DONE(1)
                 } /* end for */
             } /* end case */
             break;
 
+        case H5D_VIRTUAL:
+            {
+                htri_t equal;
+                int strcmp_ret;
+                size_t u;       /* Local index variable */
+
+                /* Compare number of mappings */
+                if(layout1->storage.u.virt.list_nused < layout2->storage.u.virt.list_nused) HGOTO_DONE(-1)
+                if(layout1->storage.u.virt.list_nused > layout2->storage.u.virt.list_nused) HGOTO_DONE(1)
+
+                /* Iterate over mappings */
+                for(u = 0; u < layout1->storage.u.virt.list_nused; u++) {
+                    /* Compare virtual spaces.  Note we cannot tell which is
+                     * "greater", so just return 1 if different, -1 on failure.
+                     */
+                    if((equal = H5S_extent_equal(layout1->storage.u.virt.list[u].source_dset.virtual_select, layout2->storage.u.virt.list[u].source_dset.virtual_select)) < 0) HGOTO_DONE(-1)
+                    if(!equal)
+                        HGOTO_DONE(1)
+                    if((equal = H5S_select_shape_same(layout1->storage.u.virt.list[u].source_dset.virtual_select, layout2->storage.u.virt.list[u].source_dset.virtual_select)) < 0) HGOTO_DONE(-1)
+                    if(!equal)
+                        HGOTO_DONE(1)
+
+                    /* Compare source file names */
+                    strcmp_ret = HDstrcmp(layout1->storage.u.virt.list[u].source_file_name, layout2->storage.u.virt.list[u].source_file_name);
+                    if(strcmp_ret < 0) HGOTO_DONE(-1)
+                    if(strcmp_ret > 0) HGOTO_DONE(1)
+
+                    /* Compare source dataset names */
+                    strcmp_ret = HDstrcmp(layout1->storage.u.virt.list[u].source_dset_name, layout2->storage.u.virt.list[u].source_dset_name);
+                    if(strcmp_ret < 0) HGOTO_DONE(-1)
+                    if(strcmp_ret > 0) HGOTO_DONE(1)
+
+                    /* Compare source spaces.  Note we cannot tell which is
+                     * "greater", so just return 1 if different, -1 on failure.
+                     */
+                    if((equal = H5S_extent_equal(layout1->storage.u.virt.list[u].source_select, layout2->storage.u.virt.list[u].source_select)) < 0) HGOTO_DONE(-1)
+                    if(!equal)
+                        HGOTO_DONE(1)
+                    if((equal = H5S_select_shape_same(layout1->storage.u.virt.list[u].source_select, layout2->storage.u.virt.list[u].source_select)) < 0) HGOTO_DONE(-1)
+                    if(!equal)
+                        HGOTO_DONE(1)
+                } /* end for */
+            } /* end block */
+            break;
+
         case H5D_LAYOUT_ERROR:
         case H5D_NLAYOUTS:
         default:
@@ -443,414 +863,1800 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:       H5P_fill_value_cmp
+ * Function:    H5P__dcrt_layout_close
  *
- * Purpose:        Callback routine which is called whenever the fill value
- *                 property in the dataset creation property list is compared.
+ * Purpose:     Frees memory used to store the layout property
  *
- * Return:         positive if VALUE1 is greater than VALUE2, negative if
- *                      VALUE2 is greater than VALUE1 and zero if VALUE1 and
- *                      VALUE2 are equal.
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
  *
- * Programmer:     Quincey Koziol
- *                 Wednesday, January 7, 2004
+ * Programmer:  Neil Fortner
+ *              Tuesday, Feb 10, 2015
  *
  *-------------------------------------------------------------------------
  */
-int
-H5P_fill_value_cmp(const void *_fill1, const void *_fill2, size_t H5_ATTR_UNUSED size)
+static herr_t
+H5P__dcrt_layout_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size,
+    void *value)
 {
-    const H5O_fill_t *fill1 = (const H5O_fill_t *)_fill1,     /* Create local aliases for values */
-        *fill2 = (const H5O_fill_t *)_fill2;
-    int cmp_value;              /* Value from comparison */
-    herr_t ret_value = 0;       /* Return value */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC
 
     /* Sanity check */
-    HDassert(fill1);
-    HDassert(fill2);
-    HDassert(size == sizeof(H5O_fill_t));
-
-    /* Check the size of fill values */
-    if(fill1->size < fill2->size) HGOTO_DONE(-1);
-    if(fill1->size > fill2->size) HGOTO_DONE(1);
-
-    /* Check the types of the fill values */
-    if(fill1->type == NULL && fill2->type != NULL) HGOTO_DONE(-1);
-    if(fill1->type != NULL && fill2->type == NULL) HGOTO_DONE(1);
-    if(fill1->type != NULL)
-        if((cmp_value = H5T_cmp(fill1->type, fill2->type, FALSE)) != 0)
-            HGOTO_DONE(cmp_value);
-
-    /* Check the fill values in the buffers */
-    if(fill1->buf == NULL && fill2->buf != NULL) HGOTO_DONE(-1);
-    if(fill1->buf != NULL && fill2->buf == NULL) HGOTO_DONE(1);
-    if(fill1->buf != NULL)
-        if((cmp_value = HDmemcmp(fill1->buf, fill2->buf, (size_t)fill1->size)) != 0)
-            HGOTO_DONE(cmp_value);
+    HDassert(value);
 
-    /* Check the allocation time for the fill values */
-    if(fill1->alloc_time < fill2->alloc_time) HGOTO_DONE(-1);
-    if(fill1->alloc_time > fill2->alloc_time) HGOTO_DONE(1);
-
-    /* Check the fill time for the fill values */
-    if(fill1->fill_time < fill2->fill_time) HGOTO_DONE(-1);
-    if(fill1->fill_time > fill2->fill_time) HGOTO_DONE(1);
+    /* Reset the old layout */
+    if(H5O_msg_reset(H5O_LAYOUT_ID, value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTRESET, FAIL, "can't release layout message")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_fill_value_cmp() */
+} /* end H5P__dcrt_layout_close() */
 
 

 /*-------------------------------------------------------------------------
- * Function:       H5P__dcrt_ext_file_list_cmp
+ * Function:    H5P__dcrt_fill_value_set
  *
- * Purpose:        Callback routine which is called whenever the external file
- *                 list property in the dataset creation property list is
- *                 compared.
+ * Purpose:     Copies a fill value property when it's set for a property list
  *
- * Return:         positive if VALUE1 is greater than VALUE2, negative if
- *                      VALUE2 is greater than VALUE1 and zero if VALUE1 and
- *                      VALUE2 are equal.
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
  *
- * Programmer:     Quincey Koziol
- *                 Wednesday, January 7, 2004
+ * Programmer:  Quincey Koziol
+ *              Tuesday, Sept 1, 2015
  *
  *-------------------------------------------------------------------------
  */
-static int
-H5P__dcrt_ext_file_list_cmp(const void *_efl1, const void *_efl2, size_t H5_ATTR_UNUSED size)
+static herr_t
+H5P__dcrt_fill_value_set(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
 {
-    const H5O_efl_t *efl1 = (const H5O_efl_t *)_efl1,     /* Create local aliases for values */
-        *efl2 = (const H5O_efl_t *)_efl2;
-    int cmp_value;              /* Value from comparison */
-    herr_t ret_value = 0;       /* Return value */
+    H5O_fill_t    *fill = (H5O_fill_t *)value; /* Create local aliases for values */
+    H5O_fill_t    new_fill;
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_STATIC_NOERR
+    FUNC_ENTER_STATIC
 
     /* Sanity check */
-    HDassert(efl1);
-    HDassert(efl2);
-    HDassert(size == sizeof(H5O_efl_t));
-
-    /* Check the heap address of external file lists */
-    if(H5F_addr_defined(efl1->heap_addr) || H5F_addr_defined(efl2->heap_addr)) {
-        if(!H5F_addr_defined(efl1->heap_addr) && H5F_addr_defined(efl2->heap_addr)) HGOTO_DONE(-1);
-        if(H5F_addr_defined(efl1->heap_addr) && !H5F_addr_defined(efl2->heap_addr)) HGOTO_DONE(1);
-        if((cmp_value = H5F_addr_cmp(efl1->heap_addr, efl2->heap_addr)) != 0)
-            HGOTO_DONE(cmp_value);
-    } /* end if */
-
-    /* Check the number of allocated efl entries */
-    if(efl1->nalloc < efl2->nalloc) HGOTO_DONE(-1);
-    if(efl1->nalloc > efl2->nalloc) HGOTO_DONE(1);
-
-    /* Check the number of used efl entries */
-    if(efl1->nused < efl2->nused) HGOTO_DONE(-1);
-    if(efl1->nused > efl2->nused) HGOTO_DONE(1);
-
-    /* Check the efl entry information */
-    if(efl1->slot == NULL && efl2->slot != NULL) HGOTO_DONE(-1);
-    if(efl1->slot != NULL && efl2->slot == NULL) HGOTO_DONE(1);
-    if(efl1->slot != NULL && efl1->nused > 0) {
-        size_t u;       /* Local index variable */
-
-        /* Loop through all entries, comparing them */
-        for(u = 0; u < efl1->nused; u++) {
-            /* Check the name offset of the efl entry */
-            if(efl1->slot[u].name_offset < efl2->slot[u].name_offset) HGOTO_DONE(-1);
-            if(efl1->slot[u].name_offset > efl2->slot[u].name_offset) HGOTO_DONE(1);
-
-            /* Check the name of the efl entry */
-            if(efl1->slot[u].name == NULL && efl2->slot[u].name != NULL) HGOTO_DONE(-1);
-            if(efl1->slot[u].name != NULL && efl2->slot[u].name == NULL) HGOTO_DONE(1);
-            if(efl1->slot[u].name != NULL)
-                if((cmp_value = HDstrcmp(efl1->slot[u].name, efl2->slot[u].name)) != 0)
-                    HGOTO_DONE(cmp_value);
+    HDassert(value);
 
-            /* Check the file offset of the efl entry */
-            if(efl1->slot[u].offset < efl2->slot[u].offset) HGOTO_DONE(-1);
-            if(efl1->slot[u].offset > efl2->slot[u].offset) HGOTO_DONE(1);
+    /* Make copy of fill value */
+    if(NULL == H5O_msg_copy(H5O_FILL_ID, fill, &new_fill))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy fill value")
 
-            /* Check the file size of the efl entry */
-            if(efl1->slot[u].size < efl2->slot[u].size) HGOTO_DONE(-1);
-            if(efl1->slot[u].size > efl2->slot[u].size) HGOTO_DONE(1);
-        } /* end for */
-    } /* end if */
+    /* Copy new fill value message over old one */
+    *fill = new_fill;
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P__dcrt_ext_file_list_cmp() */
+} /* end H5P__dcrt_fill_value_set() */
 
 

 /*-------------------------------------------------------------------------
- * Function:  H5P__set_layout
+ * Function:    H5P__dcrt_fill_value_get
  *
- * Purpose:   Sets the layout of raw data in the file.
+ * Purpose:     Copies a fill value property when it's retrieved from a property list
  *
- * Return:    Non-negative on success/Negative on failure
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
  *
- * Programmer:	Quincey Koziol
- *              Tuesday, November 23, 2004
+ * Programmer:  Quincey Koziol
+ *              Tuesday, Sept 1, 2015
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5P__set_layout(H5P_genplist_t *plist, const H5O_layout_t *layout)
+H5P__dcrt_fill_value_get(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
 {
-    unsigned alloc_time_state;          /* State of allocation time property */
-    herr_t ret_value = SUCCEED;         /* return value */
+    H5O_fill_t    *fill = (H5O_fill_t *)value; /* Create local aliases for values */
+    H5O_fill_t    new_fill;
+    herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
 
-    /* Get the allocation time state */
-    if(H5P_get(plist, H5D_CRT_ALLOC_TIME_STATE_NAME, &alloc_time_state) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get space allocation time state")
+    /* Sanity check */
+    HDassert(value);
+
+    /* Make copy of fill value */
+    if(NULL == H5O_msg_copy(H5O_FILL_ID, fill, &new_fill))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy fill value")
+
+    /* Copy new fill value message over old one */
+    *fill = new_fill;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_fill_value_get() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dcrt_fill_value_enc
+ *
+ * Purpose:        Callback routine which is called whenever the fill value
+ *                 property in the dataset creation property list is
+ *                 encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 Monday, October 10, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dcrt_fill_value_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5O_fill_t *fill = (const H5O_fill_t *)value; /* Create local aliases for values */
+    size_t   dt_size = 0;                 /* Size of encoded datatype */
+    herr_t ret_value = SUCCEED;         /* Return value */
+    uint8_t **pp = (uint8_t **)_pp;
+    uint64_t enc_value;
+    unsigned enc_size = 0;
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+    HDcompile_assert(sizeof(ssize_t) <= sizeof(int64_t));
+    HDassert(fill);
+    HDassert(size);
+
+    if(NULL != *pp) {
+        /* Encode alloc and fill time */
+        *(*pp)++ = (uint8_t)fill->alloc_time;
+        *(*pp)++ = (uint8_t)fill->fill_time;
+
+        /* Encode size of fill value */
+        INT64ENCODE(*pp, fill->size)
+
+        /* Encode the fill value & datatype */
+        if(fill->size > 0) {
+            /* Encode the fill value itself */
+            HDmemcpy(*pp, (uint8_t *)fill->buf, (size_t)fill->size);
+            *pp += fill->size;
+
+            /* Encode fill value datatype */
+            HDassert(fill->type);
+
+            if(H5T_encode(fill->type, NULL, &dt_size) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't encode datatype")
+
+            /* Encode the size of a size_t */
+            enc_value = (uint64_t)dt_size;
+            enc_size = H5VM_limit_enc_size(enc_value);
+            HDassert(enc_size < 256);
+
+            /* Encode the size */
+            *(*pp)++ = (uint8_t)enc_size;
+
+            /* Encode the size of the encoded datatype */
+            UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+
+            if(H5T_encode(fill->type, *pp, &dt_size) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't encode datatype")
+            *pp += dt_size;
+        } /* end if */
+    } /* end if */
+
+    /* Calculate size needed for encoding */
+    *size += 2;
+    *size += sizeof(int64_t);
+    if(fill->size > 0) {
+        /* The size of the fill value buffer */
+        *size += (size_t)fill->size;
+
+        /* calculate those if they were not calculated earlier */
+        if(NULL == *pp) {
+            /* Get the size of the encoded datatype */
+            HDassert(fill->type);
+            if(H5T_encode(fill->type, NULL, &dt_size) < 0)
+                HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't encode datatype")
+            enc_value = (uint64_t)dt_size;
+            enc_size = H5VM_limit_enc_size(enc_value);
+        }
+        *size += (1 + enc_size);
+        *size += dt_size;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_fill_value_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dcrt_fill_value_dec
+ *
+ * Purpose:        Callback routine which is called whenever the fill value
+ *                 property in the dataset creation property list is
+ *                 decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 Monday, October 10, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dcrt_fill_value_dec(const void **_pp, void *_value)
+{
+    H5O_fill_t *fill = (H5O_fill_t *)_value;   /* Fill value */
+    const uint8_t **pp = (const uint8_t **)_pp;
+    herr_t ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+    HDcompile_assert(sizeof(ssize_t) <= sizeof(int64_t));
+
+    /* Set property to default value */
+    *fill = H5D_def_fill_g;
+
+    /* Decode alloc and fill time */
+    fill->alloc_time = (H5D_alloc_time_t)*(*pp)++;
+    fill->fill_time = (H5D_fill_time_t)*(*pp)++;
+
+    /* Decode fill size */
+    INT64DECODE(*pp, fill->size)
+
+    /* Check if there's a fill value */
+    if(fill->size > 0) {
+        size_t dt_size = 0;
+        uint64_t enc_value;
+        unsigned enc_size;
+
+        /* Allocate fill buffer and copy the contents in it */
+        if(NULL == (fill->buf = H5MM_malloc((size_t)fill->size)))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "memory allocation failed for fill value buffer")
+        HDmemcpy((uint8_t *)fill->buf, *pp, (size_t)fill->size);
+        *pp += fill->size;
+
+        enc_size = *(*pp)++;
+        HDassert(enc_size < 256);
+
+        /* Decode the size of encoded datatype */
+        UINT64DECODE_VAR(*pp, enc_value, enc_size);
+        dt_size = (size_t)enc_value;
+
+        /* Decode type */
+        if(NULL == (fill->type = H5T_decode(*pp)))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTDECODE, FAIL, "can't decode fill value datatype")
+        *pp += dt_size;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_fill_value_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dcrt_fill_value_del
+ *
+ * Purpose:     Frees memory used to store the fill value property
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Neil Fortner
+ *              Thursday, Feb 26, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dcrt_fill_value_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Reset the old fill value message */
+    if(H5O_msg_reset(H5O_FILL_ID, value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTRESET, FAIL, "can't release fill value message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_fill_value_del() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:    H5P__dcrt_fill_value_copy
+ *
+ * Purpose:     Copy the fill value property
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Neil Fortner
+ *              Thursday, Feb 26, 2015
+ *
+ *--------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dcrt_fill_value_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size,
+    void *value)
+{
+    H5O_fill_t      *fill = (H5O_fill_t *)value; /* Create local aliases for values */
+    H5O_fill_t      new_fill;
+    herr_t          ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    HDassert(fill);
+
+    /* Make copy of fill value message */
+    if(NULL == H5O_msg_copy(H5O_FILL_ID, fill, &new_fill))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy fill value")
+
+    /* Set new fill value message directly into property list */
+    *fill = new_fill;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_fill_value_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P_fill_value_cmp
+ *
+ * Purpose:        Callback routine which is called whenever the fill value
+ *                 property in the dataset creation property list is compared.
+ *
+ * Return:         positive if VALUE1 is greater than VALUE2, negative if
+ *                      VALUE2 is greater than VALUE1 and zero if VALUE1 and
+ *                      VALUE2 are equal.
+ *
+ * Programmer:     Quincey Koziol
+ *                 Wednesday, January 7, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5P_fill_value_cmp(const void *_fill1, const void *_fill2,
+    size_t H5_ATTR_UNUSED size)
+{
+    const H5O_fill_t *fill1 = (const H5O_fill_t *)_fill1,     /* Create local aliases for values */
+        *fill2 = (const H5O_fill_t *)_fill2;
+    int cmp_value;              /* Value from comparison */
+    herr_t ret_value = 0;       /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(fill1);
+    HDassert(fill2);
+    HDassert(size == sizeof(H5O_fill_t));
+
+    /* Check the size of fill values */
+    if(fill1->size < fill2->size) HGOTO_DONE(-1);
+    if(fill1->size > fill2->size) HGOTO_DONE(1);
+
+    /* Check the types of the fill values */
+    if(fill1->type == NULL && fill2->type != NULL) HGOTO_DONE(-1);
+    if(fill1->type != NULL && fill2->type == NULL) HGOTO_DONE(1);
+    if(fill1->type != NULL)
+        if((cmp_value = H5T_cmp(fill1->type, fill2->type, FALSE)) != 0)
+            HGOTO_DONE(cmp_value);
+
+    /* Check the fill values in the buffers */
+    if(fill1->buf == NULL && fill2->buf != NULL) HGOTO_DONE(-1);
+    if(fill1->buf != NULL && fill2->buf == NULL) HGOTO_DONE(1);
+    if(fill1->buf != NULL)
+        if((cmp_value = HDmemcmp(fill1->buf, fill2->buf, (size_t)fill1->size)) != 0)
+            HGOTO_DONE(cmp_value);
+
+    /* Check the allocation time for the fill values */
+    if(fill1->alloc_time < fill2->alloc_time) HGOTO_DONE(-1);
+    if(fill1->alloc_time > fill2->alloc_time) HGOTO_DONE(1);
+
+    /* Check the fill time for the fill values */
+    if(fill1->fill_time < fill2->fill_time) HGOTO_DONE(-1);
+    if(fill1->fill_time > fill2->fill_time) HGOTO_DONE(1);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_fill_value_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dcrt_fill_value_close
+ *
+ * Purpose:     Frees memory used to store the fill value property
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Neil Fortner
+ *              Thursday, Feb 26, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dcrt_fill_value_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size,
+    void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Reset the old fill value message */
+    if(H5O_msg_reset(H5O_FILL_ID, value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTRESET, FAIL, "can't release fill value message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_fill_value_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dcrt_ext_file_list_set
+ *
+ * Purpose:     Copies an external file list property when it's set for a property list
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, Sept 1, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dcrt_ext_file_list_set(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    H5O_efl_t    *efl = (H5O_efl_t *)value; /* Create local aliases for values */
+    H5O_efl_t    new_efl;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Make copy of external file list */
+    if(NULL == H5O_msg_copy(H5O_EFL_ID, efl, &new_efl))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy external file list")
+
+    /* Copy new external file list message over old one */
+    *efl = new_efl;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_ext_file_list_set() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dcrt_ext_file_list_get
+ *
+ * Purpose:     Copies an external file lsit property when it's retrieved from a property list
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, Sept 1, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dcrt_ext_file_list_get(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    H5O_efl_t    *efl = (H5O_efl_t *)value; /* Create local aliases for values */
+    H5O_efl_t    new_efl;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Make copy of external file list */
+    if(NULL == H5O_msg_copy(H5O_EFL_ID, efl, &new_efl))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy external file list")
+
+    /* Copy new external file list message over old one */
+    *efl = new_efl;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_ext_file_list_get() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dcrt_ext_file_list_enc
+ *
+ * Purpose:        Callback routine which is called whenever the efl
+ *                 property in the dataset creation property list is
+ *                 encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 Monday, October 10, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dcrt_ext_file_list_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5O_efl_t *efl = (const H5O_efl_t *)value; /* Create local aliases for values */
+    size_t len = 0;                     /* String length of slot name */
+    size_t u;                           /* Local index variable */
+    uint8_t **pp = (uint8_t **)_pp;
+    unsigned enc_size;
+    uint64_t enc_value;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(efl);
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+    HDcompile_assert(sizeof(off_t) <= sizeof(uint64_t));
+    HDcompile_assert(sizeof(hsize_t) <= sizeof(uint64_t));
+    HDassert(size);
+
+    if(NULL != *pp) {
+        /* Encode number of slots used */
+        enc_value = (uint64_t)efl->nused;
+        enc_size = H5VM_limit_enc_size(enc_value);
+        HDassert(enc_size < 256);
+        *(*pp)++ = (uint8_t)enc_size;
+        UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+
+        /* Encode file list */
+        for(u = 0; u < efl->nused; u++) {
+            /* Calculate length of slot name and encode it */
+            len = HDstrlen(efl->slot[u].name) + 1;
+            enc_value = (uint64_t)len;
+            enc_size = H5VM_limit_enc_size(enc_value);
+            HDassert(enc_size < 256);
+            *(*pp)++ = (uint8_t)enc_size;
+            UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+
+            /* Encode name */
+            HDmemcpy(*pp, (uint8_t *)(efl->slot[u].name), len);
+            *pp += len;
+
+            /* Encode offset */
+            enc_value = (uint64_t)efl->slot[u].offset;
+            enc_size = H5VM_limit_enc_size(enc_value);
+            HDassert(enc_size < 256);
+            *(*pp)++ = (uint8_t)enc_size;
+            UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+
+            /* encode size */
+            enc_value = (uint64_t)efl->slot[u].size;
+            enc_size = H5VM_limit_enc_size(enc_value);
+            HDassert(enc_size < 256);
+            *(*pp)++ = (uint8_t)enc_size;
+            UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+        } /* end for */
+    } /* end if */
+
+    /* Calculate size needed for encoding */
+    *size += (1 + H5VM_limit_enc_size((uint64_t)efl->nused));
+    for(u = 0; u < efl->nused; u++) {
+        len = HDstrlen(efl->slot[u].name) + 1;
+        *size += (1 + H5VM_limit_enc_size((uint64_t)len));
+        *size += len;
+        *size += (1 + H5VM_limit_enc_size((uint64_t)efl->slot[u].offset));
+        *size += (1 + H5VM_limit_enc_size((uint64_t)efl->slot[u].size));
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__dcrt_ext_file_list_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dcrt_ext_file_list_dec
+ *
+ * Purpose:        Callback routine which is called whenever the efl
+ *                 property in the dataset creation property list is
+ *                 decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 Monday, October 10, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dcrt_ext_file_list_dec(const void **_pp, void *_value)
+{
+    H5O_efl_t *efl = (H5O_efl_t *)_value;  /* External file list */
+    const uint8_t **pp = (const uint8_t **)_pp;
+    size_t u, nused;
+    unsigned enc_size;
+    uint64_t enc_value;
+    herr_t ret_value = SUCCEED;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(efl);
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+    HDcompile_assert(sizeof(off_t) <= sizeof(uint64_t));
+    HDcompile_assert(sizeof(hsize_t) <= sizeof(uint64_t));
+
+    /* Set property to default value */
+    *efl = H5D_def_efl_g;
+
+    /* Decode number of slots used */
+    enc_size = *(*pp)++;
+    HDassert(enc_size < 256);
+    UINT64DECODE_VAR(*pp, enc_value, enc_size);
+    nused = (size_t)enc_value;
+
+    /* Decode information for each slot */
+    for(u = 0; u < nused; u++) {
+        size_t len;
+        if(efl->nused >= efl->nalloc) {
+            size_t na = efl->nalloc + H5O_EFL_ALLOC;
+            H5O_efl_entry_t *x = (H5O_efl_entry_t *)H5MM_realloc(efl->slot, 
+                                                                 na * sizeof(H5O_efl_entry_t));
+            if(!x)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "memory allocation failed")
+
+            efl->nalloc = na;
+            efl->slot = x;
+        } /* end if */
+
+        /* Decode length of slot name */
+        enc_size = *(*pp)++;
+        HDassert(enc_size < 256);
+        UINT64DECODE_VAR(*pp, enc_value, enc_size);
+        len = (size_t)enc_value;
+
+        /* Allocate name buffer and decode the name into it */
+        efl->slot[u].name = H5MM_xstrdup((const char *)(*pp));
+        *pp += len;
+
+        /* decode offset */
+        enc_size = *(*pp)++;
+        HDassert(enc_size < 256);
+        UINT64DECODE_VAR(*pp, enc_value, enc_size);
+        efl->slot[u].offset = (off_t)enc_value;
+
+        /* decode size */
+        enc_size = *(*pp)++;
+        HDassert(enc_size < 256);
+        UINT64DECODE_VAR(*pp, enc_value, enc_size);
+        efl->slot[u].size = (hsize_t)enc_value;
+
+        efl->slot[u].name_offset = 0; /*not entered into heap yet*/
+        efl->nused++;
+    } /* end for */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_ext_file_list_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dcrt_ext_file_list_del
+ *
+ * Purpose:     Frees memory used to store the efl property
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Neil Fortner
+ *              Thursday, Feb 26, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dcrt_ext_file_list_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Reset the old efl message */
+    if(H5O_msg_reset(H5O_EFL_ID, value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTRESET, FAIL, "can't release external file list message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_ext_file_list_del() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:    H5P__dcrt_ext_file_list_copy
+ *
+ * Purpose:     Copy the efl property
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Neil Fortner
+ *              Thurday, Feb 26, 2015
+ *
+ *--------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dcrt_ext_file_list_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size,
+    void *value)
+{
+    H5O_efl_t       *efl = (H5O_efl_t *)value; /* Create local aliases for values */
+    H5O_efl_t       new_efl;
+    herr_t          ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    HDassert(efl);
+
+    /* Make copy of efl message */
+    if(NULL == H5O_msg_copy(H5O_EFL_ID, efl, &new_efl))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy external file list")
+
+    /* Set new efl message directly into property list */
+    *efl = new_efl;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_ext_file_list_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dcrt_ext_file_list_cmp
+ *
+ * Purpose:        Callback routine which is called whenever the external file
+ *                 list property in the dataset creation property list is
+ *                 compared.
+ *
+ * Return:         positive if VALUE1 is greater than VALUE2, negative if
+ *                      VALUE2 is greater than VALUE1 and zero if VALUE1 and
+ *                      VALUE2 are equal.
+ *
+ * Programmer:     Quincey Koziol
+ *                 Wednesday, January 7, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5P__dcrt_ext_file_list_cmp(const void *_efl1, const void *_efl2,
+    size_t H5_ATTR_UNUSED size)
+{
+    const H5O_efl_t *efl1 = (const H5O_efl_t *)_efl1,     /* Create local aliases for values */
+        *efl2 = (const H5O_efl_t *)_efl2;
+    int cmp_value;              /* Value from comparison */
+    herr_t ret_value = 0;       /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(efl1);
+    HDassert(efl2);
+    HDassert(size == sizeof(H5O_efl_t));
+
+    /* Check the heap address of external file lists */
+    if(H5F_addr_defined(efl1->heap_addr) || H5F_addr_defined(efl2->heap_addr)) {
+        if(!H5F_addr_defined(efl1->heap_addr) && H5F_addr_defined(efl2->heap_addr)) HGOTO_DONE(-1);
+        if(H5F_addr_defined(efl1->heap_addr) && !H5F_addr_defined(efl2->heap_addr)) HGOTO_DONE(1);
+        if((cmp_value = H5F_addr_cmp(efl1->heap_addr, efl2->heap_addr)) != 0)
+            HGOTO_DONE(cmp_value);
+    } /* end if */
+
+    /* Check the number of allocated efl entries */
+    if(efl1->nalloc < efl2->nalloc) HGOTO_DONE(-1);
+    if(efl1->nalloc > efl2->nalloc) HGOTO_DONE(1);
+
+    /* Check the number of used efl entries */
+    if(efl1->nused < efl2->nused) HGOTO_DONE(-1);
+    if(efl1->nused > efl2->nused) HGOTO_DONE(1);
+
+    /* Check the efl entry information */
+    if(efl1->slot == NULL && efl2->slot != NULL) HGOTO_DONE(-1);
+    if(efl1->slot != NULL && efl2->slot == NULL) HGOTO_DONE(1);
+    if(efl1->slot != NULL && efl1->nused > 0) {
+        size_t u;       /* Local index variable */
+
+        /* Loop through all entries, comparing them */
+        for(u = 0; u < efl1->nused; u++) {
+            /* Check the name offset of the efl entry */
+            if(efl1->slot[u].name_offset < efl2->slot[u].name_offset) HGOTO_DONE(-1);
+            if(efl1->slot[u].name_offset > efl2->slot[u].name_offset) HGOTO_DONE(1);
+
+            /* Check the name of the efl entry */
+            if(efl1->slot[u].name == NULL && efl2->slot[u].name != NULL) HGOTO_DONE(-1);
+            if(efl1->slot[u].name != NULL && efl2->slot[u].name == NULL) HGOTO_DONE(1);
+            if(efl1->slot[u].name != NULL)
+                if((cmp_value = HDstrcmp(efl1->slot[u].name, efl2->slot[u].name)) != 0)
+                    HGOTO_DONE(cmp_value);
+
+            /* Check the file offset of the efl entry */
+            if(efl1->slot[u].offset < efl2->slot[u].offset) HGOTO_DONE(-1);
+            if(efl1->slot[u].offset > efl2->slot[u].offset) HGOTO_DONE(1);
+
+            /* Check the file size of the efl entry */
+            if(efl1->slot[u].size < efl2->slot[u].size) HGOTO_DONE(-1);
+            if(efl1->slot[u].size > efl2->slot[u].size) HGOTO_DONE(1);
+        } /* end for */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_ext_file_list_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dcrt_ext_file_list_close
+ *
+ * Purpose:     Frees memory used to store the efl property
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Neil Fortner
+ *              Thursday, Feb 26, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dcrt_ext_file_list_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size,
+    void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Reset the old efl message */
+    if(H5O_msg_reset(H5O_EFL_ID, value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTRESET, FAIL, "can't release external file list message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dcrt_ext_file_list_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  H5P__set_layout
+ *
+ * Purpose:   Sets the layout of raw data in the file.
+ *
+ * Return:    Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November 23, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__set_layout(H5P_genplist_t *plist, const H5O_layout_t *layout)
+{
+    unsigned alloc_time_state;          /* State of allocation time property */
+    herr_t ret_value = SUCCEED;         /* return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Get the allocation time state */
+    if(H5P_get(plist, H5D_CRT_ALLOC_TIME_STATE_NAME, &alloc_time_state) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get space allocation time state")
+
+    /* If we still have the "default" allocation time, change it according to the new layout */
+    if(alloc_time_state) {
+        H5O_fill_t fill;                    /* Fill value */
+
+        /* Get current fill value info */
+        if(H5P_peek(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
+
+        /* Set the default based on layout */
+        switch(layout->type) {
+            case H5D_COMPACT:
+                fill.alloc_time = H5D_ALLOC_TIME_EARLY;
+                break;
+
+            case H5D_CONTIGUOUS:
+                fill.alloc_time = H5D_ALLOC_TIME_LATE;
+                break;
+
+            case H5D_CHUNKED:
+            case H5D_VIRTUAL:
+                fill.alloc_time = H5D_ALLOC_TIME_INCR;
+                break;
+
+            case H5D_LAYOUT_ERROR:
+            case H5D_NLAYOUTS:
+            default:
+                HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unknown layout type")
+        } /* end switch */
+
+        /* Set updated fill value info */
+        if(H5P_poke(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set space allocation time")
+    } /* end if */
+
+    /* Set layout value */
+    if(H5P_set(plist, H5D_CRT_LAYOUT_NAME, layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't set layout")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__set_layout() */
+
+#ifndef H5_HAVE_C99_DESIGNATED_INITIALIZER
+

+/*-------------------------------------------------------------------------
+ * Function:  H5P__init_def_layout
+ *
+ * Purpose:   Set the default layout information for the various types of
+ *              dataset layouts
+ *
+ * Return:    Non-negative on success/Negative on failure
+ *
+ * Programmer:	Quincey Koziol
+ *		Tuesday, January 13, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__init_def_layout(void)
+{
+    const H5O_layout_chunk_t def_layout_chunk = H5D_DEF_LAYOUT_CHUNK_INIT;
+    const H5O_storage_compact_t def_store_compact = H5D_DEF_STORAGE_COMPACT_INIT;
+    const H5O_storage_chunk_t def_store_chunk = H5D_DEF_STORAGE_CHUNK_INIT;
+    const H5O_storage_virtual_t def_store_virtual = H5D_DEF_STORAGE_VIRTUAL_INIT;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Initialize the default layout info for non-contigous layouts */
+    H5D_def_layout_compact_g.storage.type = H5D_COMPACT;
+    H5D_def_layout_compact_g.storage.u.compact = def_store_compact;
+    H5D_def_layout_chunk_g.u.chunk = def_layout_chunk;
+    H5D_def_layout_chunk_g.storage.type = H5D_CHUNKED;
+    H5D_def_layout_chunk_g.storage.u.chunk = def_store_chunk;
+    H5D_def_layout_virtual_g.storage.type = H5D_VIRTUAL;
+    H5D_def_layout_virtual_g.storage.u.virt = def_store_virtual;
+
+    /* Note that we've initialized the default values */
+    H5P_dcrt_def_layout_init_g = TRUE;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__init_def_layout() */
+#endif /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_layout
+ *
+ * Purpose:	Sets the layout of raw data in the file.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, January  6, 1998
+ *
+ * Modifications:
+ *
+ *              Raymond Lu
+ *              Tuesday, October 2, 2001
+ *              Changed the way to check parameter and set property for
+ *              generic property list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_layout(hid_t plist_id, H5D_layout_t layout_type)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    const H5O_layout_t *layout;         /* Pointer to default layout information for type specified */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iDl", plist_id, layout_type);
+
+    /* Check arguments */
+    if(layout_type < 0 || layout_type >= H5D_NLAYOUTS)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "raw data layout method is not valid")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+#ifndef H5_HAVE_C99_DESIGNATED_INITIALIZER
+    /* If the compiler doesn't support C99 designated initializers, check if
+     *  the default layout structs have been initialized yet or not.  *ick* -QAK
+     */
+    if(!H5P_dcrt_def_layout_init_g)
+        if(H5P__init_def_layout() < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't initialize default layout info")
+#endif /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
+
+    /* Get pointer to correct default layout */
+    switch(layout_type) {
+        case H5D_COMPACT:
+            layout = &H5D_def_layout_compact_g;
+            break;
+
+        case H5D_CONTIGUOUS:
+            layout = &H5D_def_layout_contig_g;
+            break;
+
+        case H5D_CHUNKED:
+            layout = &H5D_def_layout_chunk_g;
+            break;
+
+        case H5D_VIRTUAL:
+            layout = &H5D_def_layout_virtual_g;
+            break;
+
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+        default:
+            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unknown layout type")
+    } /* end switch */
+
+    /* Set value */
+    if(H5P__set_layout(plist, layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't set layout")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_layout() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_layout
+ *
+ * Purpose:	Retrieves layout type of a dataset creation property list.
+ *
+ * Return:	Success:	The layout type
+ *
+ *		Failure:	H5D_LAYOUT_ERROR (negative)
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ * Modifications:
+ *
+ *              Raymond Lu
+ *              Tuesday, October 2, 2001
+ *              Changed the way to check parameter and get property for
+ *              generic property list.
+ *
+ *-------------------------------------------------------------------------
+ */
+H5D_layout_t
+H5Pget_layout(hid_t plist_id)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5O_layout_t layout;        /* Layout property */
+    H5D_layout_t ret_value;     /* Return value */
+
+    FUNC_ENTER_API(H5D_LAYOUT_ERROR)
+    H5TRACE1("Dl", "i", plist_id);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, H5D_LAYOUT_ERROR, "can't find object for ID")
+
+    /* Peek at layout property */
+    if(H5P_peek(plist, H5D_CRT_LAYOUT_NAME, &layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5D_LAYOUT_ERROR, "can't get layout")
+
+    /* Set return value */
+    ret_value = layout.type;
 
-    /* If we still have the "default" allocation time, change it according to the new layout */
-    if(alloc_time_state) {
-        H5O_fill_t fill;            /* Fill value */
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* ed H5Pget_layout() */
 
-        /* Get current fill value info */
-        if(H5P_get(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_chunk
+ *
+ * Purpose:	Sets the number of dimensions and the size of each chunk to
+ *		the values specified.  The dimensionality of the chunk should
+ *		match the dimensionality of the dataspace.
+ *
+ *		As a side effect, the layout method is changed to
+ *		H5D_CHUNKED.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Robb Matzke
+ *		Tuesday, January  6, 1998
+ *
+ * Modifications:
+ *
+ *              Raymond Lu
+ *              Tuesday, October 2, 2001
+ *              Changed the way to check parameter and set property for
+ *              generic property list.
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_chunk(hid_t plist_id, int ndims, const hsize_t dim[/*ndims*/])
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5O_layout_t chunk_layout;  /* Layout information for setting chunk info */
+    uint64_t chunk_nelmts;      /* Number of elements in chunk */
+    unsigned max_enc_bytes_per_dim;     /* Max. number of bytes required to encode this dimension */
+    unsigned u;                 /* Local index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
 
-        /* Set the default based on layout */
-        switch(layout->type) {
-            case H5D_COMPACT:
-                fill.alloc_time = H5D_ALLOC_TIME_EARLY;
-                break;
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "iIs*[a1]h", plist_id, ndims, dim);
 
-            case H5D_CONTIGUOUS:
-                fill.alloc_time = H5D_ALLOC_TIME_LATE;
-                break;
+    /* Check arguments */
+    if(ndims <= 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "chunk dimensionality must be positive")
+    if(ndims > H5S_MAX_RANK)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "chunk dimensionality is too large")
+    if(!dim)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no chunk dimensions specified")
 
-            case H5D_CHUNKED:
-                fill.alloc_time = H5D_ALLOC_TIME_INCR;
-                break;
+#ifndef H5_HAVE_C99_DESIGNATED_INITIALIZER
+    /* If the compiler doesn't support C99 designated initializers, check if
+     *  the default layout structs have been initialized yet or not.  *ick* -QAK
+     */
+    if(!H5P_dcrt_def_layout_init_g)
+        if(H5P__init_def_layout() < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't initialize default layout info")
+#endif /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
+
+    /* Verify & initialize property's chunk dims */
+    HDmemcpy(&chunk_layout, &H5D_def_layout_chunk_g, sizeof(H5D_def_layout_chunk_g));
+    HDmemset(&chunk_layout.u.chunk.dim, 0, sizeof(chunk_layout.u.chunk.dim));
+    chunk_nelmts = 1;
+    max_enc_bytes_per_dim = 0;
+    for(u = 0; u < (unsigned)ndims; u++) {
+        unsigned enc_bytes_per_dim;     /* Number of bytes required to encode this dimension */
+
+        if(dim[u] == 0)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "all chunk dimensions must be positive")
+        if(dim[u] != (dim[u] & 0xffffffff))
+            HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "all chunk dimensions must be less than 2^32")
+        chunk_nelmts *= dim[u];
+        if(chunk_nelmts > (uint64_t)0xffffffff)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "number of elements in chunk must be < 4GB")
+        chunk_layout.u.chunk.dim[u] = (uint32_t)dim[u]; /* Store user's chunk dimensions */
+
+        /* Get encoded size of dim, in bytes */
+        enc_bytes_per_dim = (H5VM_log2_gen(dim[u]) + 8) / 8;
+
+        /* Check if this is the largest value so far */
+        if(enc_bytes_per_dim > max_enc_bytes_per_dim)
+            max_enc_bytes_per_dim = enc_bytes_per_dim;
+    } /* end for */
+    HDassert(max_enc_bytes_per_dim > 0 && max_enc_bytes_per_dim <= 8);
+    chunk_layout.u.chunk.enc_bytes_per_dim = max_enc_bytes_per_dim;
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set chunk information in property list */
+    chunk_layout.u.chunk.ndims = (unsigned)ndims;
+    if(H5P__set_layout(plist, &chunk_layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set layout")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_chunk() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_chunk
+ *
+ * Purpose:	Retrieves the chunk size of chunked layout.  The chunk
+ *		dimensionality is returned and the chunk size in each
+ *		dimension is returned through the DIM argument.	 At most
+ *		MAX_NDIMS elements of DIM will be initialized.
+ *
+ * Return:	Success:	Positive Chunk dimensionality.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ * Modifications:
+ *
+ *              Raymond Lu
+ *              Tuesday, October 2, 2001
+ *              Changed the way to check parameter and set property for
+ *              generic property list.
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5Pget_chunk(hid_t plist_id, int max_ndims, hsize_t dim[]/*out*/)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5O_layout_t layout;        /* Layout information */
+    int ret_value;              /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("Is", "iIsx", plist_id, max_ndims, dim);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Peek at the layout property */
+    if(H5P_peek(plist, H5D_CRT_LAYOUT_NAME, &layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "can't get layout")
+    if(H5D_CHUNKED != layout.type)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a chunked storage layout")
+
+    if(dim) {
+        unsigned	u;      /* Local index variable */
+
+        /* Get the dimension sizes */
+        for(u = 0; u < layout.u.chunk.ndims && u < (unsigned)max_ndims; u++)
+            dim[u] = layout.u.chunk.dim[u];
+    } /* end if */
+
+    /* Set the return value */
+    ret_value = (int)layout.u.chunk.ndims;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_chunk() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pset_virtual
+ *
+ * Purpose:     Maps elements of the virtual dataset described by the
+ *              virtual dataspace identifier vspace_id to the elements of
+ *              the source dataset described by the source dataset
+ *              dataspace identifier src_space_id.  The source dataset is
+ *              identified by the name of the file where it is located,
+ *              src_file_name, and the name of the dataset, src_dset_name.
+ *
+ *              As a side effect, the layout method is changed to
+ *              H5D_VIRTUAL.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Friday, February  13, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_virtual(hid_t dcpl_id, hid_t vspace_id, const char *src_file_name,
+    const char *src_dset_name, hid_t src_space_id)
+{
+    H5P_genplist_t *plist;          /* Property list pointer */
+    H5O_layout_t virtual_layout;    /* Layout information for setting virtual info */
+    H5S_t *vspace;                  /* Virtual dataset space selection */
+    H5S_t *src_space;               /* Source dataset space selection */
+    H5O_storage_virtual_ent_t *old_list = NULL; /* List pointer previously on property list */
+    H5O_storage_virtual_ent_t *ent = NULL; /* Convenience pointer to new VDS entry */
+    hbool_t retrieved_layout = FALSE;   /* Whether the layout has been retrieved */
+    hbool_t free_list = FALSE;      /* Whether to free the list of virtual entries */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "ii*s*si", dcpl_id, vspace_id, src_file_name, src_dset_name,
+             src_space_id);
+
+    /* Check arguments */
+    if(!src_file_name)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "source file name not provided")
+    if(!src_dset_name)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADRANGE, FAIL, "source dataset name not provided")
+    if(NULL == (vspace = (H5S_t *)H5I_object_verify(vspace_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a dataspace")
+    if(NULL == (src_space = (H5S_t *)H5I_object_verify(src_space_id, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a dataspace")
+
+    /* Check selections for validity */
+    if(H5D_virtual_check_mapping_pre(vspace, src_space, H5O_VIRTUAL_STATUS_USER) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "invalid mapping selections")
+
+#ifndef H5_HAVE_C99_DESIGNATED_INITIALIZER
+    /* If the compiler doesn't support C99 designated initializers, check if
+     *  the default layout structs have been initialized yet or not.  *ick* -QAK
+     */
+    if(!H5P_dcrt_def_layout_init_g)
+        if(H5P__init_def_layout() < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't initialize default layout info")
+#endif /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(dcpl_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get the current layout */
+    if(H5P_peek(plist, H5D_CRT_LAYOUT_NAME, &virtual_layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get layout")
+    retrieved_layout = TRUE;
+
+    /* If the layout was not already virtual, Start with default virtual layout.
+     * Otherwise, add the mapping to the current list. */
+    if(virtual_layout.type == H5D_VIRTUAL)
+        /* Save old list pointer for error recovery */
+        old_list = virtual_layout.storage.u.virt.list;
+    else {
+        /* Reset the old layout */
+        if(H5O_msg_reset(H5O_LAYOUT_ID, &virtual_layout) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTRESET, FAIL, "can't release layout message")
+
+        /* Copy the default virtual layout */
+        HDmemcpy(&virtual_layout, &H5D_def_layout_virtual_g, sizeof(H5D_def_layout_virtual_g));
+
+        /* Sanity check */
+        HDassert(virtual_layout.storage.u.virt.list_nalloc == 0);
+    } /* end else */
+
+    /* Expand list if necessary */
+    if(virtual_layout.storage.u.virt.list_nused == virtual_layout.storage.u.virt.list_nalloc) {
+        H5O_storage_virtual_ent_t *x;           /* Pointer to the new list */
+        size_t new_alloc = MAX(H5D_VIRTUAL_DEF_LIST_SIZE, virtual_layout.storage.u.virt.list_nalloc * 2);
+
+        /* Expand size of entry list */
+        if(NULL == (x = (H5O_storage_virtual_ent_t *)H5MM_realloc(virtual_layout.storage.u.virt.list, new_alloc * sizeof(H5O_storage_virtual_ent_t))))
+            HGOTO_ERROR(H5E_PLIST, H5E_RESOURCE, FAIL, "can't reallocate virtual dataset mapping list")
+        virtual_layout.storage.u.virt.list = x;
+        virtual_layout.storage.u.virt.list_nalloc = new_alloc;
+    } /* end if */
+
+    /* Add virtual dataset mapping entry */
+    ent = &virtual_layout.storage.u.virt.list[virtual_layout.storage.u.virt.list_nused];
+    HDmemset(ent, 0, sizeof(H5O_storage_virtual_ent_t));        /* Clear before starting to set up */
+    if(NULL == (ent->source_dset.virtual_select = H5S_copy(vspace, FALSE, TRUE)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "unable to copy virtual selection")
+    if(NULL == (ent->source_file_name = HDstrdup(src_file_name)))
+        HGOTO_ERROR(H5E_PLIST, H5E_RESOURCE, FAIL, "can't duplicate source file name")
+    if(NULL == (ent->source_dset_name = HDstrdup(src_dset_name)))
+        HGOTO_ERROR(H5E_PLIST, H5E_RESOURCE, FAIL, "can't duplicate source file name")
+    if(NULL == (ent->source_select = H5S_copy(src_space, FALSE, TRUE)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "unable to copy source selection")
+    if(H5D_virtual_parse_source_name(ent->source_file_name, &ent->parsed_source_file_name, &ent->psfn_static_strlen, &ent->psfn_nsubs) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't parse source file name")
+    if(H5D_virtual_parse_source_name(ent->source_dset_name, &ent->parsed_source_dset_name, &ent->psdn_static_strlen, &ent->psdn_nsubs) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't parse source dataset name")
+    if((ent->psfn_nsubs == 0) && (ent->psdn_nsubs == 0)) {
+        if(ent->parsed_source_file_name)
+            ent->source_dset.file_name = ent->parsed_source_file_name->name_segment;
+        else 
+            ent->source_dset.file_name = ent->source_file_name;
+        if(ent->parsed_source_dset_name)
+            ent->source_dset.dset_name = ent->parsed_source_dset_name->name_segment;
+        else
+            ent->source_dset.dset_name = ent->source_dset_name;
+    } /* end if */
+    ent->unlim_dim_source = H5S_get_select_unlim_dim(src_space);
+    ent->unlim_dim_virtual = H5S_get_select_unlim_dim(vspace);
+    if(ent->unlim_dim_virtual < 0) {
+        ent->source_dset.clipped_source_select = ent->source_select;
+        ent->source_dset.clipped_virtual_select = ent->source_dset.virtual_select;
+    } /* end if */
+    ent->unlim_extent_source = HSIZE_UNDEF;
+    ent->unlim_extent_virtual = HSIZE_UNDEF;
+    ent->clip_size_source = HSIZE_UNDEF;
+    ent->clip_size_virtual = HSIZE_UNDEF;
+    ent->source_space_status = H5O_VIRTUAL_STATUS_USER;
+    ent->virtual_space_status = H5O_VIRTUAL_STATUS_USER;
+
+    /* Check entry for validity */
+    if(H5D_virtual_check_mapping_post(ent) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid mapping entry")
+
+    /* Update min_dims */
+    if(H5D_virtual_update_min_dims(&virtual_layout, virtual_layout.storage.u.virt.list_nused) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "unable to update virtual dataset minimum dimensions")
+
+    /* Finish adding entry */
+    virtual_layout.storage.u.virt.list_nused++;
+
+done:
+    /* Set VDS layout information in property list */
+    /* (Even on faliure, so there's not a mangled layout struct in the list) */
+    if(retrieved_layout) {
+        if(H5P_poke(plist, H5D_CRT_LAYOUT_NAME, &virtual_layout) < 0) {
+            HDONE_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set layout")
+            if(old_list != virtual_layout.storage.u.virt.list)
+                free_list = TRUE;
+        } /* end if */
+    } /* end if */
+
+    /* Check if the entry has been partly allocated but not added to the
+     * property list or not included in list_nused */
+    if(ret_value < 0) {
+        /* Free incomplete entry if present */
+        if(ent) {
+            ent->source_file_name = (char *)H5MM_xfree(ent->source_file_name);
+            ent->source_dset_name = (char *)H5MM_xfree(ent->source_dset_name);
+            if(ent->source_dset.virtual_select && H5S_close(ent->source_dset.virtual_select) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release virtual selection")
+            ent->source_dset.virtual_select = NULL;
+            if(ent->source_select && H5S_close(ent->source_select) < 0)
+                HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release source selection")
+            ent->source_select = NULL;
+            H5D_virtual_free_parsed_name(ent->parsed_source_file_name);
+            ent->parsed_source_file_name = NULL;
+            H5D_virtual_free_parsed_name(ent->parsed_source_dset_name);
+            ent->parsed_source_dset_name = NULL;
+        } /* end if */
+
+        /* Free list if necessary */
+        if(free_list)
+            virtual_layout.storage.u.virt.list = (H5O_storage_virtual_ent_t *)H5MM_xfree(virtual_layout.storage.u.virt.list);
+    } /* end if */
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_virtual() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_virtual_count
+ *
+ * Purpose:     Gets the number of mappings for the virtual dataset that
+ *              has a creation property list specified by the dcpl_id
+ *              parameter.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Friday, February  13, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_virtual_count(hid_t dcpl_id, size_t *count/*out*/)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5O_layout_t layout;        /* Layout information */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ix", dcpl_id, count);
+
+    if(count) {
+        /* Get the plist structure */
+        if(NULL == (plist = H5P_object_verify(dcpl_id, H5P_DATASET_CREATE)))
+            HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+        /* Retrieve the layout property */
+        if(H5P_peek(plist, H5D_CRT_LAYOUT_NAME, &layout) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "can't get layout")
+        if(H5D_VIRTUAL != layout.type)
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a virtual storage layout")
+
+        /* Return the number of mappings  */
+        *count = layout.storage.u.virt.list_nused;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_virtual_count() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Pget_virtual_vspace
+ *
+ * Purpose:     Takes the dataset creation property list for the virtual
+ *              dataset, dcpl_id, and the mapping index, index, and
+ *              returns a dataspace identifier for the selection within
+ *              the virtual dataset used in the mapping. 
+ *
+ * Return:      Returns a dataspace identifier if successful; otherwise
+ *              returns a negative value.
+ *
+ * Programmer:  Neil Fortner
+ *              Friday, February  13, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5Pget_virtual_vspace(hid_t dcpl_id, size_t index)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5O_layout_t layout;        /* Layout information */
+    H5S_t *space = NULL;        /* Dataspace pointer */
+    hid_t ret_value;            /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("i", "iz", dcpl_id, index);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(dcpl_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
-            case H5D_LAYOUT_ERROR:
-            case H5D_NLAYOUTS:
-            default:
-                HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unknown layout type")
-        } /* end switch */
+    /* Retrieve the layout property */
+    if(H5P_peek(plist, H5D_CRT_LAYOUT_NAME, &layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "can't get layout")
+    if(H5D_VIRTUAL != layout.type)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a virtual storage layout")
 
-        /* Set updated fill value info */
-        if(H5P_set(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set space allocation time")
-    } /* end if */
+    /* Get the virtual space */
+    if(index >= layout.storage.u.virt.list_nused)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid index (out of range)")
+    HDassert(layout.storage.u.virt.list_nused <= layout.storage.u.virt.list_nalloc);
+    if(NULL == (space = H5S_copy(layout.storage.u.virt.list[index].source_dset.virtual_select, FALSE, TRUE)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "unable to copy virtual selection")
 
-    /* Set layout value */
-    if(H5P_set(plist, H5D_CRT_LAYOUT_NAME, layout) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't set layout")
+    /* Register ID */
+    if((ret_value = H5I_register(H5I_DATASPACE, space, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register data space")
 
 done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P__set_layout() */
+    /* Free space on failure */
+    if((ret_value < 0) && space)
+        if(H5S_close(space) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release source selection")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_virtual_vspace() */
 
-#ifndef H5_HAVE_C99_DESIGNATED_INITIALIZER
 

 /*-------------------------------------------------------------------------
- * Function:  H5P__init_def_layout
+ * Function:    H5Pget_virtual_srcspace
  *
- * Purpose:   Set the default layout information for the various types of
- *              dataset layouts
+ * Purpose:     Takes the dataset creation property list for the virtual
+ *              dataset, dcpl_id, and the mapping index, index, and
+ *              returns a dataspace identifier for the selection within
+ *              the source dataset used in the mapping. 
  *
- * Return:    Non-negative on success/Negative on failure
+ * Return:      Returns a dataspace identifier if successful; otherwise
+ *              returns a negative value.
  *
- * Programmer:	Quincey Koziol
- *		Tuesday, January 13, 2009
+ * Programmer:  Neil Fortner
+ *              Saturday, February  14, 2015
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5P__init_def_layout(void)
+hid_t
+H5Pget_virtual_srcspace(hid_t dcpl_id, size_t index)
 {
-    const H5O_layout_chunk_t def_layout_chunk = H5D_DEF_LAYOUT_CHUNK_INIT;
-    const H5O_storage_compact_t def_store_compact = H5D_DEF_STORAGE_COMPACT_INIT;
-    const H5O_storage_chunk_t def_store_chunk = H5D_DEF_STORAGE_CHUNK_INIT;
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5O_layout_t layout;        /* Layout information */
+    H5S_t *space = NULL;        /* Dataspace pointer */
+    hid_t ret_value = FAIL;     /* Return value */
 
-    FUNC_ENTER_STATIC_NOERR
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("i", "iz", dcpl_id, index);
 
-    /* Initialize the default layout info for non-contigous layouts */
-    H5D_def_layout_compact_g.storage.u.compact = def_store_compact;
-    H5D_def_layout_chunk_g.u.chunk = def_layout_chunk;
-    H5D_def_layout_chunk_g.storage.u.chunk = def_store_chunk;
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(dcpl_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
-    /* Note that we've initialized the default values */
-    H5P_dcrt_def_layout_init_g = TRUE;
+    /* Retrieve the layout property */
+    if(H5P_peek(plist, H5D_CRT_LAYOUT_NAME, &layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "can't get layout")
+    if(H5D_VIRTUAL != layout.type)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a virtual storage layout")
+
+    /* Check index */
+    if(index >= layout.storage.u.virt.list_nused)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid index (out of range)")
+    HDassert(layout.storage.u.virt.list_nused <= layout.storage.u.virt.list_nalloc);
+
+    /* Attempt to open source dataset and patch extent if extent status is not
+     * H5O_VIRTUAL_STATUS_CORRECT?  -NAF */
+    /* If source space status is H5O_VIRTUAL_STATUS_INVALID, patch with bounds
+     * of selection */
+    if((H5O_VIRTUAL_STATUS_INVALID == layout.storage.u.virt.list[index].source_space_status)
+            && (layout.storage.u.virt.list[index].unlim_dim_source < 0)) {
+        hsize_t bounds_start[H5S_MAX_RANK];
+        hsize_t bounds_end[H5S_MAX_RANK];
+        int rank;
+        int i;
+
+        /* Get rank of source space */
+        if((rank = H5S_GET_EXTENT_NDIMS(layout.storage.u.virt.list[index].source_select)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get source space rank")
+
+        /* Get bounds of selection */
+        if(H5S_SELECT_BOUNDS(layout.storage.u.virt.list[index].source_select, bounds_start, bounds_end) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get selection bounds")
+
+        /* Adjust bounds to extent */
+        for(i = 0; i < rank; i++)
+            bounds_end[i]++;
+
+        /* Set extent */
+        if(H5S_set_extent_simple(layout.storage.u.virt.list[index].source_select, (unsigned)rank, bounds_end, NULL) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set source space extent")
+
+        /* Update source space status */
+        layout.storage.u.virt.list[index].source_space_status = H5O_VIRTUAL_STATUS_SEL_BOUNDS;
+    } /* end if */
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5P__init_def_layout() */
-#endif /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
+    /* Get the source space */
+    if(NULL == (space = H5S_copy(layout.storage.u.virt.list[index].source_select, FALSE, TRUE)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "unable to copy source selection")
+
+    /* Register ID */
+    if((ret_value = H5I_register(H5I_DATASPACE, space, TRUE)) < 0)
+        HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register data space")
+
+done:
+    /* Free space on failure */
+    if((ret_value < 0) && space)
+        if(H5S_close(space) < 0)
+            HDONE_ERROR(H5E_DATASET, H5E_CLOSEERROR, FAIL, "unable to release source selection")
+
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_virtual_srcspace() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5Pset_layout
+ * Function:    H5Pget_virtual_filename
  *
- * Purpose:	Sets the layout of raw data in the file.
+ * Purpose:     Takes the dataset creation property list for the virtual
+ *              dataset, dcpl_id, and the mapping index, index, and
+ *              retrieves a name of a file for a source dataset used in
+ *              the mapping.
  *
- * Return:	Non-negative on success/Negative on failure
+ *              Up to size characters of the filename are returned in
+ *              name; additional characters, if any, are not returned to
+ *              the user application.
  *
- * Programmer:	Robb Matzke
- *		Tuesday, January  6, 1998
+ *              If the length of the filename, which determines the
+ *              required value of size, is unknown, a preliminary call to
+ *              H5Pget_virtual_filename with the last two parameters set
+ *              to NULL can be made.  The return value of this call will
+ *              be the size in bytes of the filename.  That value, plus 1
+ *              for a NULL terminator, is then assigned to size for a
+ *              second H5Pget_virtual_filename call, which will retrieve
+ *              the actual filename. 
  *
- * Modifications:
+ * Return:      Returns the length of the name if successful, otherwise
+ *              returns a negative value.
  *
- *              Raymond Lu
- *              Tuesday, October 2, 2001
- *              Changed the way to check parameter and set property for
- *              generic property list.
+ * Programmer:  Neil Fortner
+ *              Saturday, February  14, 2015
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5Pset_layout(hid_t plist_id, H5D_layout_t layout_type)
+ssize_t
+H5Pget_virtual_filename(hid_t dcpl_id, size_t index, char *name/*out*/,
+    size_t size)
 {
-    H5P_genplist_t *plist;              /* Property list pointer */
-    const H5O_layout_t *layout;         /* Pointer to default layout information for type specified */
-    herr_t ret_value = SUCCEED;         /* Return value */
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5O_layout_t layout;        /* Layout information */
+    ssize_t ret_value;            /* Return value */
 
     FUNC_ENTER_API(FAIL)
-    H5TRACE2("e", "iDl", plist_id, layout_type);
-
-    /* Check arguments */
-    if(layout_type < 0 || layout_type >= H5D_NLAYOUTS)
-        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "raw data layout method is not valid")
+    H5TRACE4("Zs", "izxz", dcpl_id, index, name, size);
 
     /* Get the plist structure */
-    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
+    if(NULL == (plist = H5P_object_verify(dcpl_id, H5P_DATASET_CREATE)))
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
-#ifndef H5_HAVE_C99_DESIGNATED_INITIALIZER
-    /* If the compiler doesn't support C99 designated initializers, check if
-     *  the default layout structs have been initialized yet or not.  *ick* -QAK
-     */
-    if(!H5P_dcrt_def_layout_init_g)
-        if(H5P__init_def_layout() < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't initialize default layout info")
-#endif /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
-
-    /* Get pointer to correct default layout */
-    switch(layout_type) {
-        case H5D_COMPACT:
-            layout = &H5D_def_layout_compact_g;
-            break;
-
-        case H5D_CONTIGUOUS:
-            layout = &H5D_def_layout_contig_g;
-            break;
-
-        case H5D_CHUNKED:
-            layout = &H5D_def_layout_chunk_g;
-            break;
-
-        case H5D_LAYOUT_ERROR:
-        case H5D_NLAYOUTS:
-        default:
-            HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unknown layout type")
-    } /* end switch */
-
-    /* Set value */
-    if(H5P__set_layout(plist, layout) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't set layout")
+    /* Retrieve the layout property */
+    if(H5P_peek(plist, H5D_CRT_LAYOUT_NAME, &layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "can't get layout")
+    if(H5D_VIRTUAL != layout.type)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a virtual storage layout")
+
+    /* Get the virtual filename */
+    if(index >= layout.storage.u.virt.list_nused)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid index (out of range)")
+    HDassert(layout.storage.u.virt.list_nused <= layout.storage.u.virt.list_nalloc);
+    HDassert(layout.storage.u.virt.list[index].source_file_name);
+    if(name && (size > 0))
+        (void)HDstrncpy(name, layout.storage.u.virt.list[index].source_file_name, size);
+    ret_value = (ssize_t)HDstrlen(layout.storage.u.virt.list[index].source_file_name);
 
 done:
     FUNC_LEAVE_API(ret_value)
-} /* end H5Pset_layout() */
+} /* end H5Pget_virtual_filename() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5Pget_layout
- *
- * Purpose:	Retrieves layout type of a dataset creation property list.
+ * Function:    H5Pget_virtual_dsetname
  *
- * Return:	Success:	The layout type
+ * Purpose:     Takes the dataset creation property list for the virtual
+ *              dataset, dcpl_id, and the mapping index, index, and
+ *              retrieves the name of a source dataset used in the mapping.
  *
- *		Failure:	H5D_LAYOUT_ERROR (negative)
+ *              Up to size characters of the name are returned in name;
+ *              additional characters, if any, are not returned to the
+ *              user application.
  *
- * Programmer:	Robb Matzke
- *		Wednesday, January  7, 1998
+ *              If the length of the filename, which determines the
+ *              required value of size, is unknown, a preliminary call to
+ *              H5Pget_virtual_dsetname with the last two parameters set
+ *              to NULL can be made.  The return value of this call will
+ *              be the size in bytes of the filename.  That value, plus 1
+ *              for a NULL terminator, is then assigned to size for a
+ *              second H5Pget_virtual_dsetname call, which will retrieve
+ *              the actual filename. 
  *
- * Modifications:
+ * Return:      Returns the length of the name if successful, otherwise
+ *              returns a negative value.
  *
- *              Raymond Lu
- *              Tuesday, October 2, 2001
- *              Changed the way to check parameter and get property for
- *              generic property list.
+ * Programmer:  Neil Fortner
+ *              Saturday, February  14, 2015
  *
  *-------------------------------------------------------------------------
  */
-H5D_layout_t
-H5Pget_layout(hid_t plist_id)
+ssize_t
+H5Pget_virtual_dsetname(hid_t dcpl_id, size_t index, char *name/*out*/,
+    size_t size)
 {
     H5P_genplist_t *plist;      /* Property list pointer */
-    H5O_layout_t layout;        /* Layout property */
-    H5D_layout_t ret_value;     /* Return value */
+    H5O_layout_t layout;        /* Layout information */
+    ssize_t ret_value;            /* Return value */
 
-    FUNC_ENTER_API(H5D_LAYOUT_ERROR)
-    H5TRACE1("Dl", "i", plist_id);
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("Zs", "izxz", dcpl_id, index, name, size);
 
     /* Get the plist structure */
-    if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
-        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, H5D_LAYOUT_ERROR, "can't find object for ID")
-
-    /* Get layout property */
-    if(H5P_get(plist, H5D_CRT_LAYOUT_NAME, &layout) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5D_LAYOUT_ERROR, "can't get layout")
+    if(NULL == (plist = H5P_object_verify(dcpl_id, H5P_DATASET_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
-    /* Set return value */
-    ret_value = layout.type;
+    /* Retrieve the layout property */
+    if(H5P_peek(plist, H5D_CRT_LAYOUT_NAME, &layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "can't get layout")
+    if(H5D_VIRTUAL != layout.type)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a virtual storage layout")
+
+    /* Get the virtual filename */
+    if(index >= layout.storage.u.virt.list_nused)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "invalid index (out of range)")
+    HDassert(layout.storage.u.virt.list_nused <= layout.storage.u.virt.list_nalloc);
+    HDassert(layout.storage.u.virt.list[index].source_dset_name);
+    if(name && (size > 0))
+        (void)HDstrncpy(name, layout.storage.u.virt.list[index].source_dset_name, size);
+    ret_value = (ssize_t)HDstrlen(layout.storage.u.virt.list[index].source_dset_name);
 
 done:
     FUNC_LEAVE_API(ret_value)
-} /* ed H5Pget_layout() */
+} /* end H5Pget_virtual_dsetname() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5Pset_chunk
- *
- * Purpose:	Sets the number of dimensions and the size of each chunk to
- *		the values specified.  The dimensionality of the chunk should
- *		match the dimensionality of the dataspace.
- *
- *		As a side effect, the layout method is changed to
- *		H5D_CHUNKED.
+ * Function:    H5Pset_chunk_opts
  *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	Robb Matzke
- *		Tuesday, January  6, 1998
+ * Purpose:     Sets the options related to chunked storage for a dataset.
+ *              The storage must already be set to chunked.
  *
- * Modifications:
+ * Return:      Non-negative on success/Negative on failure
  *
- *              Raymond Lu
- *              Tuesday, October 2, 2001
- *              Changed the way to check parameter and set property for
- *              generic property list.
+ * Programmer:  Neil Fortner
+ *              Thursday, January 21, 2010
  *
  *-------------------------------------------------------------------------
  */
 herr_t
-H5Pset_chunk(hid_t plist_id, int ndims, const hsize_t dim[/*ndims*/])
+H5Pset_chunk_opts(hid_t plist_id, unsigned options)
 {
-    H5P_genplist_t *plist;      /* Property list pointer */
-    H5O_layout_t chunk_layout;  /* Layout information for setting chunk info */
-    uint64_t chunk_nelmts;      /* Number of elements in chunk */
-    unsigned u;                 /* Local index variable */
-    herr_t ret_value = SUCCEED; /* Return value */
+    H5P_genplist_t      *plist;         /* Property list pointer */
+    H5O_layout_t        layout;         /* Layout information for setting chunk info */
+    uint8_t             layout_flags = 0; /* "options" translated into layout message flags format */
+    herr_t              ret_value = SUCCEED; /* Return value */
 
     FUNC_ENTER_API(FAIL)
-    H5TRACE3("e", "iIs*[a1]h", plist_id, ndims, dim);
+    H5TRACE2("e", "iIu", plist_id, options);
 
     /* Check arguments */
-    if(ndims <= 0)
-        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "chunk dimensionality must be positive")
-    if(ndims > H5S_MAX_RANK)
-        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "chunk dimensionality is too large")
-    if(!dim)
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no chunk dimensions specified")
+    if(options & ~(H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "unknown chunk options")
 
 #ifndef H5_HAVE_C99_DESIGNATED_INITIALIZER
     /* If the compiler doesn't support C99 designated initializers, check if
@@ -861,93 +2667,88 @@ H5Pset_chunk(hid_t plist_id, int ndims, const hsize_t dim[/*ndims*/])
             HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't initialize default layout info")
 #endif /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
 
-    /* Verify & initialize property's chunk dims */
-    HDmemcpy(&chunk_layout, &H5D_def_layout_chunk_g, sizeof(H5D_def_layout_chunk_g));
-    HDmemset(&chunk_layout.u.chunk.dim, 0, sizeof(chunk_layout.u.chunk.dim));
-    chunk_nelmts = 1;
-    for(u = 0; u < (unsigned)ndims; u++) {
-        if(dim[u] == 0)
-            HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "all chunk dimensions must be positive")
-        if(dim[u] != (dim[u] & 0xffffffff))
-            HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "all chunk dimensions must be less than 2^32")
-        chunk_nelmts *= dim[u];
-        if(chunk_nelmts > (uint64_t)0xffffffff)
-            HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, "number of elements in chunk must be < 4GB")
-        chunk_layout.u.chunk.dim[u] = (uint32_t)dim[u]; /* Store user's chunk dimensions */
-    } /* end for */
-
     /* Get the plist structure */
     if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
-    /* Set chunk information in property list */
-    chunk_layout.u.chunk.ndims = (unsigned)ndims;
-    if(H5P__set_layout(plist, &chunk_layout) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set layout")
+    /* Retrieve the layout property */
+    if(H5P_peek(plist, H5D_CRT_LAYOUT_NAME, &layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "can't get layout")
+    if(H5D_CHUNKED != layout.type)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a chunked storage layout")
+
+    /* Translate options into flags that can be used with the layout message */
+    if(options & H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS)
+        layout_flags |= H5O_LAYOUT_CHUNK_DONT_FILTER_PARTIAL_BOUND_CHUNKS;
+
+    /* Update the layout message, including the version (if necessary) */
+    /* This probably isn't the right way to do this, and should be changed once
+     * this branch gets the "real" way to set the layout version */
+    layout.u.chunk.flags = layout_flags;
+    if(layout.version < H5O_LAYOUT_VERSION_4)
+        layout.version = H5O_LAYOUT_VERSION_4;
+
+    /* Set layout value */
+    if(H5P_poke(plist, H5D_CRT_LAYOUT_NAME, &layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't set layout")
 
 done:
     FUNC_LEAVE_API(ret_value)
-} /* end H5Pset_chunk() */
+} /* end H5Pset_chunk_opts() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5Pget_chunk
- *
- * Purpose:	Retrieves the chunk size of chunked layout.  The chunk
- *		dimensionality is returned and the chunk size in each
- *		dimension is returned through the DIM argument.	 At most
- *		MAX_NDIMS elements of DIM will be initialized.
- *
- * Return:	Success:	Positive Chunk dimensionality.
+ * Function:    H5Pget_chunk_opts
  *
- *		Failure:	Negative
- *
- * Programmer:	Robb Matzke
- *		Wednesday, January  7, 1998
+ * Purpose:     Gets the options related to chunked storage for a dataset.
  *
- * Modifications:
+ * Return:      Non-negative on success/Negative on failure
  *
- *              Raymond Lu
- *              Tuesday, October 2, 2001
- *              Changed the way to check parameter and set property for
- *              generic property list.
+ * Programmer:  Neil Fortner
+ *              Friday, January 22, 2010
  *
  *-------------------------------------------------------------------------
  */
-int
-H5Pget_chunk(hid_t plist_id, int max_ndims, hsize_t dim[]/*out*/)
+herr_t
+H5Pget_chunk_opts(hid_t plist_id, unsigned *options)
 {
-    H5P_genplist_t *plist;      /* Property list pointer */
-    H5O_layout_t layout;        /* Layout information */
-    int ret_value;              /* Return value */
+    H5P_genplist_t      *plist;         /* Property list pointer */
+    H5O_layout_t        layout;         /* Layout information for setting chunk info */
+    herr_t              ret_value = SUCCEED; /* Return value */
 
     FUNC_ENTER_API(FAIL)
-    H5TRACE3("Is", "iIsx", plist_id, max_ndims, dim);
+    H5TRACE2("e", "i*Iu", plist_id, options);
+
+#ifndef H5_HAVE_C99_DESIGNATED_INITIALIZER
+    /* If the compiler doesn't support C99 designated initializers, check if
+     *  the default layout structs have been initialized yet or not.  *ick* -QAK
+     */
+    if(!H5P_dcrt_def_layout_init_g)
+        if(H5P__init_def_layout() < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't initialize default layout info")
+#endif /* H5_HAVE_C99_DESIGNATED_INITIALIZER */
 
     /* Get the plist structure */
     if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Retrieve the layout property */
-    if(H5P_get(plist, H5D_CRT_LAYOUT_NAME, &layout) < 0)
+    if(H5P_peek(plist, H5D_CRT_LAYOUT_NAME, &layout) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "can't get layout")
     if(H5D_CHUNKED != layout.type)
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a chunked storage layout")
 
-    if(dim) {
-        unsigned	u;      /* Local index variable */
-
-        /* Get the dimension sizes */
-        for(u = 0; u < layout.u.chunk.ndims && u < (unsigned)max_ndims; u++)
-            dim[u] = layout.u.chunk.dim[u];
+    if(options) {
+        /* Translate options from flags that can be used with the layout message
+         * to those known to the public */
+        *options = 0;
+        if(layout.u.chunk.flags & H5O_LAYOUT_CHUNK_DONT_FILTER_PARTIAL_BOUND_CHUNKS)
+            *options |= H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS;
     } /* end if */
 
-    /* Set the return value */
-    ret_value = (int)layout.u.chunk.ndims;
-
 done:
     FUNC_LEAVE_API(ret_value)
-} /* end H5Pget_chunk() */
+} /* end H5Pget_chunk_opts() */
 
 

 /*-------------------------------------------------------------------------
@@ -995,7 +2796,7 @@ H5Pset_external(hid_t plist_id, const char *name, off_t offset, hsize_t size)
     if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_CREATE)))
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
-    if(H5P_get(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
+    if(H5P_peek(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external file list")
     if(efl.nused > 0 && H5O_EFL_UNLIMITED == efl.slot[efl.nused - 1].size)
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "previous file size is unlimited")
@@ -1008,7 +2809,6 @@ H5Pset_external(hid_t plist_id, const char *name, off_t offset, hsize_t size)
         } /* end for */
     } /* end if */
 
-
     /* Add to the list */
     if(efl.nused >= efl.nalloc) {
         size_t na = efl.nalloc + H5O_EFL_ALLOC;
@@ -1026,7 +2826,7 @@ H5Pset_external(hid_t plist_id, const char *name, off_t offset, hsize_t size)
     efl.slot[idx].size = size;
     efl.nused++;
 
-    if(H5P_set(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
+    if(H5P_poke(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set external file list")
 
 done:
@@ -1070,7 +2870,7 @@ H5Pget_external_count(hid_t plist_id)
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Get value */
-    if(H5P_get(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
+    if(H5P_peek(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external file list")
 
     /* Set return value */
@@ -1128,7 +2928,7 @@ H5Pget_external(hid_t plist_id, unsigned idx, size_t name_size, char *name/*out*
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Get value */
-    if(H5P_get(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
+    if(H5P_peek(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external file list")
 
     if(idx >= efl.nused)
@@ -1207,11 +3007,11 @@ H5Pset_szip(hid_t plist_id, unsigned options_mask, unsigned pixels_per_block)
     cd_values[1]=pixels_per_block;
 
     /* Add the filter */
-    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
     if(H5Z_append(&pline, H5Z_FILTER_SZIP, H5Z_FLAG_OPTIONAL, (size_t)2, cd_values) < 0)
         HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add szip filter to pipeline")
-    if(H5P_set(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_poke(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to set pipeline")
 
 done:
@@ -1254,11 +3054,11 @@ H5Pset_shuffle(hid_t plist_id)
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Add the filter */
-    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
     if(H5Z_append(&pline, H5Z_FILTER_SHUFFLE, H5Z_FLAG_OPTIONAL, (size_t)0, NULL) < 0)
         HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to shuffle the data")
-    if(H5P_set(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_poke(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to set pipeline")
 
 done:
@@ -1300,11 +3100,11 @@ H5Pset_nbit(hid_t plist_id)
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Add the nbit filter */
-    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
     if(H5Z_append(&pline, H5Z_FILTER_NBIT, H5Z_FLAG_OPTIONAL, (size_t)0, NULL) < 0)
         HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add nbit filter to pipeline")
-    if(H5P_set(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_poke(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to set pipeline")
 
 done:
@@ -1379,11 +3179,11 @@ H5Pset_scaleoffset(hid_t plist_id, H5Z_SO_scale_type_t scale_type, int scale_fac
     cd_values[1] = (unsigned)scale_factor;
 
     /* Add the scaleoffset filter */
-    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
     if(H5Z_append(&pline, H5Z_FILTER_SCALEOFFSET, H5Z_FLAG_OPTIONAL, (size_t)2, cd_values) < 0)
         HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add scaleoffset filter to pipeline")
-    if(H5P_set(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_poke(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to set pipeline")
 
 done:
@@ -1395,7 +3195,7 @@ done:
  * Function:	H5Pset_fill_value
  *
  * Purpose:	Set the fill value for a dataset creation property list. The
- *		VALUE is interpretted as being of type TYPE, which need not
+ *		VALUE is interpreted as being of type TYPE, which need not
  *		be the same type as the dataset but the library must be able
  *		to convert VALUE to the dataset type when the dataset is
  *		created.  If VALUE is NULL, it will be interpreted as
@@ -1406,13 +3206,6 @@ done:
  * Programmer:	Robb Matzke
  *              Thursday, October  1, 1998
  *
- * Modifications:
- *
- *              Raymond Lu
- *              Tuesday, October 2, 2001
- *              Changed the way to check parameter and set property for
- *              generic property list.
- *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -1430,7 +3223,7 @@ H5Pset_fill_value(hid_t plist_id, hid_t type_id, const void *value)
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Get the current fill value */
-    if(H5P_get(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+    if(H5P_peek(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
 
     /* Release the dynamic fill value components */
@@ -1480,7 +3273,7 @@ H5Pset_fill_value(hid_t plist_id, hid_t type_id, const void *value)
         fill.size = (-1);
 
     /* Update fill value in property list */
-    if(H5P_set(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+    if(H5P_poke(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set fill value")
 
 done:
@@ -1524,7 +3317,7 @@ H5P_get_fill_value(H5P_genplist_t *plist, const H5T_t *type, void *value/*out*/,
      * datatype conversion might not have resulted in zero.  If fill value
      * is undefined, also return error.
      */
-    if(H5P_get(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+    if(H5P_peek(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
     if(fill.size == -1)
 	HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "fill value is undefined")
@@ -1536,8 +3329,8 @@ H5P_get_fill_value(H5P_genplist_t *plist, const H5T_t *type, void *value/*out*/,
     } /* end if */
 
      /*
-     * Can we convert between the source and destination datatypes?
-     */
+      * Can we convert between the source and destination datatypes?
+      */
     if(NULL == (tpath = H5T_path_find(fill.type, type, NULL, NULL, dxpl_id, FALSE)))
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "unable to convert between src and dst datatypes")
     if((src_id = H5I_register(H5I_DATATYPE, H5T_copy(fill.type, H5T_COPY_TRANSIENT), FALSE)) < 0)
@@ -1692,7 +3485,7 @@ H5P_fill_value_defined(H5P_genplist_t *plist, H5D_fill_value_t *status)
     HDassert(status);
 
     /* Get the fill value struct */
-    if(H5P_get(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+    if(H5P_peek(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
 
     /* Get the fill-value status */
@@ -1780,8 +3573,8 @@ H5Pset_alloc_time(hid_t plist_id, H5D_alloc_time_t alloc_time)
     if(alloc_time == H5D_ALLOC_TIME_DEFAULT) {
         H5O_layout_t layout;            /* Type of storage layout */
 
-        /* Retrieve the storage layout */
-        if(H5P_get(plist, H5D_CRT_LAYOUT_NAME, &layout) < 0)
+        /* Peek at the storage layout */
+        if(H5P_peek(plist, H5D_CRT_LAYOUT_NAME, &layout) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get layout")
 
         /* Set the default based on layout */
@@ -1798,6 +3591,10 @@ H5Pset_alloc_time(hid_t plist_id, H5D_alloc_time_t alloc_time)
                 alloc_time = H5D_ALLOC_TIME_INCR;
                 break;
 
+            case H5D_VIRTUAL:
+                alloc_time = H5D_ALLOC_TIME_INCR;
+                break;
+
             case H5D_LAYOUT_ERROR:
             case H5D_NLAYOUTS:
             default:
@@ -1812,14 +3609,14 @@ H5Pset_alloc_time(hid_t plist_id, H5D_alloc_time_t alloc_time)
         alloc_time_state = 0;
 
     /* Retrieve previous fill value settings */
-    if(H5P_get(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+    if(H5P_peek(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
 
     /* Update property value */
     fill.alloc_time = alloc_time;
 
     /* Set values */
-    if(H5P_set(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+    if(H5P_poke(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set fill value")
     if(H5P_set(plist, H5D_CRT_ALLOC_TIME_STATE_NAME, &alloc_time_state) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set space allocation time")
@@ -1861,7 +3658,7 @@ H5Pget_alloc_time(hid_t plist_id, H5D_alloc_time_t *alloc_time/*out*/)
             HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
         /* Retrieve fill value settings */
-        if(H5P_get(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+        if(H5P_peek(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
 
         /* Set user's value */
@@ -1905,14 +3702,14 @@ H5Pset_fill_time(hid_t plist_id, H5D_fill_time_t fill_time)
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Retrieve previous fill value settings */
-    if(H5P_get(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+    if(H5P_peek(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
 
     /* Update property value */
     fill.fill_time = fill_time;
 
     /* Set values */
-    if(H5P_set(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+    if(H5P_poke(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set fill value")
 
 done:
@@ -1954,7 +3751,7 @@ H5Pget_fill_time(hid_t plist_id, H5D_fill_time_t *fill_time/*out*/)
             HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
         /* Retrieve fill value settings */
-        if(H5P_get(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
+        if(H5P_peek(plist, H5D_CRT_FILL_VALUE_NAME, &fill) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value")
 
         /* Set user's value */
diff --git a/src/H5Pdeprec.c b/src/H5Pdeprec.c
index e265c50..ecf2bea 100644
--- a/src/H5Pdeprec.c
+++ b/src/H5Pdeprec.c
@@ -31,10 +31,7 @@
 /* Module Setup */
 /****************/
 
-#define H5P_PACKAGE		/*suppress error about including H5Ppkg   */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5P__init_deprec_interface
+#include "H5Pmodule.h"          /* This source code file is part of the H5P module */
 
 
 /***********/
@@ -82,51 +79,6 @@
 /*******************/
 
 
-

-/*--------------------------------------------------------------------------
-NAME
-   H5P__init_deprec_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5P__init_deprec_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5P_init() currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5P__init_deprec_interface(void)
-{
-    FUNC_ENTER_STATIC_NOERR
-
-    FUNC_LEAVE_NOAPI(H5P_init())
-} /* H5P__init_deprec_interface() */
-
-

-/*--------------------------------------------------------------------------
-NAME
-   H5P__term_deprec_interface -- Terminate interface
-USAGE
-    herr_t H5P__term_deprec_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Terminates interface.  (Just resets H5_interface_initialize_g
-    currently).
-
---------------------------------------------------------------------------*/
-herr_t
-H5P__term_deprec_interface(void)
-{
-    FUNC_ENTER_PACKAGE_NOERR
-
-    /* Mark closed */
-    H5_interface_initialize_g = 0;
-
-    FUNC_LEAVE_NOAPI(0)
-} /* H5P__term_deprec_interface() */
-
 #ifndef H5_NO_DEPRECATED_SYMBOLS
 

 /*--------------------------------------------------------------------------
@@ -292,7 +244,7 @@ H5Pregister1(hid_t cls_id, const char *name, size_t size, void *def_value,
 
     /* Create the new property list class */
     orig_pclass = pclass;
-    if((ret_value = H5P_register(&pclass, name, size, def_value, prp_create, prp_set, prp_get, prp_delete, prp_copy, NULL, prp_close)) < 0)
+    if((ret_value = H5P_register(&pclass, name, size, def_value, prp_create, prp_set, prp_get, NULL, NULL, prp_delete, prp_copy, NULL, prp_close)) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to register property in class");
 
     /* Check if the property class changed and needs to be substituted in the ID */
@@ -475,11 +427,66 @@ H5Pinsert1(hid_t plist_id, const char *name, size_t size, void *value,
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "properties >0 size must have default")
 
     /* Create the new property list class */
-    if((ret_value = H5P_insert(plist, name, size, value, prp_set, prp_get, prp_delete, prp_copy, NULL, prp_close)) < 0)
+    if((ret_value = H5P_insert(plist, name, size, value, prp_set, prp_get,
+            NULL, NULL, prp_delete, prp_copy, NULL, prp_close)) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "unable to register property in plist")
 
 done:
     FUNC_LEAVE_API(ret_value)
 }   /* H5Pinsert1() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_version
+ *
+ * Purpose:	Retrieves version information for various parts of a file.
+ *
+ *		SUPER:		The file super block.
+ *		FREELIST:	The global free list.
+ *		STAB:		The root symbol table entry.
+ *		SHHDR:		Shared object headers.
+ *
+ *		Any (or even all) of the output arguments can be null
+ *		pointers.
+ *
+ * Return:	Success:	Non-negative, version information is returned
+ *				through the arguments.
+ *
+ *		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *		Wednesday, January  7, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_version(hid_t plist_id, unsigned *super/*out*/, unsigned *freelist/*out*/,
+    unsigned *stab/*out*/, unsigned *shhdr/*out*/)
+{
+    H5P_genplist_t *plist;     	/* Property list pointer */
+    herr_t ret_value = SUCCEED;	/* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "ixxxx", plist_id, super, freelist, stab, shhdr);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get values */
+    if(super)
+        if(H5P_get(plist, H5F_CRT_SUPER_VERS_NAME, super) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get superblock version")
+    if(freelist)
+        *freelist = HDF5_FREESPACE_VERSION;     /* (hard-wired) */
+    if(stab)
+        *stab = HDF5_OBJECTDIR_VERSION;         /* (hard-wired) */
+    if(shhdr)
+        *shhdr = HDF5_SHAREDHEADER_VERSION;     /* (hard-wired) */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_version() */
+
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
diff --git a/src/H5Pdxpl.c b/src/H5Pdxpl.c
index ce16036..a4d8293 100644
--- a/src/H5Pdxpl.c
+++ b/src/H5Pdxpl.c
@@ -27,16 +27,19 @@
 /****************/
 /* Module Setup */
 /****************/
-#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+#include "H5Pmodule.h"          /* This source code file is part of the H5P module */
 
 
 /***********/
 /* Headers */
 /***********/
 #include "H5private.h"		/* Generic Functions			*/
+#include "H5ACprivate.h"        /* Cache                                */
 #include "H5Dprivate.h"		/* Datasets				*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
 #include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
 #include "H5Ppkg.h"		/* Property lists		  	*/
 
 
@@ -48,6 +51,8 @@
 /* Definitions for maximum temp buffer size property */
 #define H5D_XFER_MAX_TEMP_BUF_SIZE      sizeof(size_t)
 #define H5D_XFER_MAX_TEMP_BUF_DEF       H5D_TEMP_BUF_SIZE
+#define H5D_XFER_MAX_TEMP_BUF_ENC       H5P__encode_size_t
+#define H5D_XFER_MAX_TEMP_BUF_DEC       H5P__decode_size_t
 /* Definitions for type conversion buffer property */
 #define H5D_XFER_TCONV_BUF_SIZE         sizeof(void *)
 #define H5D_XFER_TCONV_BUF_DEF          NULL
@@ -57,12 +62,16 @@
 /* Definitions for background buffer type property */
 #define H5D_XFER_BKGR_BUF_TYPE_SIZE     sizeof(H5T_bkg_t)
 #define H5D_XFER_BKGR_BUF_TYPE_DEF      H5T_BKG_NO
+#define H5D_XFER_BKGR_BUF_TYPE_ENC      H5P__dxfr_bkgr_buf_type_enc
+#define H5D_XFER_BKGR_BUF_TYPE_DEC      H5P__dxfr_bkgr_buf_type_dec
 /* Definitions for B-tree node splitting ratio property */
 /* (These default B-tree node splitting ratios are also used for splitting
  * group's B-trees as well as chunked dataset's B-trees - QAK)
  */
 #define H5D_XFER_BTREE_SPLIT_RATIO_SIZE sizeof(double[3])
-#define H5D_XFER_BTREE_SPLIT_RATIO_DEF  {0.1F, 0.5F, 0.9F}
+#define H5D_XFER_BTREE_SPLIT_RATIO_DEF  {0.1f, 0.5f, 0.9f}
+#define H5D_XFER_BTREE_SPLIT_RATIO_ENC  H5P__dxfr_btree_split_ratio_enc
+#define H5D_XFER_BTREE_SPLIT_RATIO_DEC  H5P__dxfr_btree_split_ratio_dec
 /* Definitions for vlen allocation function property */
 #define H5D_XFER_VLEN_ALLOC_SIZE        sizeof(H5MM_allocate_t)
 #define H5D_XFER_VLEN_ALLOC_DEF         H5D_VLEN_ALLOC
@@ -81,20 +90,37 @@
  */
 #define H5D_XFER_HYPER_VECTOR_SIZE_SIZE sizeof(size_t)
 #define H5D_XFER_HYPER_VECTOR_SIZE_DEF  H5D_IO_VECTOR_SIZE
+#define H5D_XFER_HYPER_VECTOR_SIZE_ENC  H5P__encode_size_t
+#define H5D_XFER_HYPER_VECTOR_SIZE_DEC  H5P__decode_size_t
+
+/* Parallel I/O properties */
+/* Note: Some of these are registered with the DXPL class even when parallel
+ *      is disabled, so that property list comparisons of encoded property
+ *      lists (between parallel & non-parallel builds) work properly. -QAK
+ */
 
-#ifdef H5_HAVE_PARALLEL
 /* Definitions for I/O transfer mode property */
 #define H5D_XFER_IO_XFER_MODE_SIZE      sizeof(H5FD_mpio_xfer_t)
 #define H5D_XFER_IO_XFER_MODE_DEF       H5FD_MPIO_INDEPENDENT
+#define H5D_XFER_IO_XFER_MODE_ENC       H5P__dxfr_io_xfer_mode_enc
+#define H5D_XFER_IO_XFER_MODE_DEC       H5P__dxfr_io_xfer_mode_dec
 /* Definitions for optimization of MPI-IO transfer mode property */
 #define H5D_XFER_MPIO_COLLECTIVE_OPT_SIZE       sizeof(H5FD_mpio_collective_opt_t)
 #define H5D_XFER_MPIO_COLLECTIVE_OPT_DEF        H5FD_MPIO_COLLECTIVE_IO
+#define H5D_XFER_MPIO_COLLECTIVE_OPT_ENC        H5P__dxfr_mpio_collective_opt_enc
+#define H5D_XFER_MPIO_COLLECTIVE_OPT_DEC        H5P__dxfr_mpio_collective_opt_dec
 #define H5D_XFER_MPIO_CHUNK_OPT_HARD_SIZE       sizeof(H5FD_mpio_chunk_opt_t)
 #define H5D_XFER_MPIO_CHUNK_OPT_HARD_DEF        H5FD_MPIO_CHUNK_DEFAULT
+#define H5D_XFER_MPIO_CHUNK_OPT_HARD_ENC        H5P__dxfr_mpio_chunk_opt_hard_enc
+#define H5D_XFER_MPIO_CHUNK_OPT_HARD_DEC        H5P__dxfr_mpio_chunk_opt_hard_dec
 #define H5D_XFER_MPIO_CHUNK_OPT_NUM_SIZE        sizeof(unsigned)
 #define H5D_XFER_MPIO_CHUNK_OPT_NUM_DEF         H5D_ONE_LINK_CHUNK_IO_THRESHOLD
+#define H5D_XFER_MPIO_CHUNK_OPT_NUM_ENC         H5P__encode_unsigned
+#define H5D_XFER_MPIO_CHUNK_OPT_NUM_DEC         H5P__decode_unsigned
 #define H5D_XFER_MPIO_CHUNK_OPT_RATIO_SIZE      sizeof(unsigned)
 #define H5D_XFER_MPIO_CHUNK_OPT_RATIO_DEF       H5D_MULTI_CHUNK_IO_COL_THRESHOLD
+#define H5D_XFER_MPIO_CHUNK_OPT_RATIO_ENC       H5P__encode_unsigned
+#define H5D_XFER_MPIO_CHUNK_OPT_RATIO_DEC       H5P__decode_unsigned
 /* Definitions for chunk opt mode property. */
 #define H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_SIZE     sizeof(H5D_mpio_actual_chunk_opt_mode_t)
 #define H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_DEF      H5D_MPIO_NO_CHUNK_OPTIMIZATION
@@ -104,6 +130,7 @@
 /* Definitions for cause of broken collective io property */
 #define H5D_MPIO_NO_COLLECTIVE_CAUSE_SIZE   sizeof(uint32_t)
 #define H5D_MPIO_NO_COLLECTIVE_CAUSE_DEF   H5D_MPIO_COLLECTIVE 
+#ifdef H5_HAVE_PARALLEL
 /* Definitions for memory MPI type property */
 #define H5FD_MPI_XFER_MEM_MPI_TYPE_SIZE        sizeof(MPI_Datatype)
 #define H5FD_MPI_XFER_MEM_MPI_TYPE_DEF         MPI_DATATYPE_NULL
@@ -115,6 +142,8 @@
 /* Definitions for EDC property */
 #define H5D_XFER_EDC_SIZE           sizeof(H5Z_EDC_t)
 #define H5D_XFER_EDC_DEF            H5Z_ENABLE_EDC
+#define H5D_XFER_EDC_ENC            H5P__dxfr_edc_enc
+#define H5D_XFER_EDC_DEC            H5P__dxfr_edc_dec
 /* Definitions for filter callback function property */
 #define H5D_XFER_FILTER_CB_SIZE     sizeof(H5Z_cb_t)
 #define H5D_XFER_FILTER_CB_DEF      {NULL,NULL}
@@ -124,6 +153,10 @@
 /* Definitions for data transform property */
 #define H5D_XFER_XFORM_SIZE         sizeof(void *)
 #define H5D_XFER_XFORM_DEF          NULL
+#define H5D_XFER_XFORM_SET          H5P__dxfr_xform_set
+#define H5D_XFER_XFORM_GET          H5P__dxfr_xform_get
+#define H5D_XFER_XFORM_ENC          H5P__dxfr_xform_enc
+#define H5D_XFER_XFORM_DEC          H5P__dxfr_xform_dec
 #define H5D_XFER_XFORM_DEL          H5P__dxfr_xform_del
 #define H5D_XFER_XFORM_COPY         H5P__dxfr_xform_copy
 #define H5D_XFER_XFORM_CMP          H5P__dxfr_xform_cmp
@@ -137,6 +170,11 @@
 #define H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_DEF		NULL
 #define H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_SIZE	sizeof(uint32_t)
 #define H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_DEF	0
+/* Ring type - private property */
+#define H5AC_XFER_RING_SIZE      sizeof(unsigned)
+#define H5AC_XFER_RING_DEF       H5AC_RING_US
+#define H5AC_XFER_RING_ENC       H5P__encode_unsigned
+#define H5AC_XFER_RING_DEC       H5P__decode_unsigned
 
 /******************/
 /* Local Typedefs */
@@ -156,6 +194,22 @@
 static herr_t H5P__dxfr_reg_prop(H5P_genclass_t *pclass);
 
 /* Property list callbacks */
+static herr_t H5P__dxfr_bkgr_buf_type_enc(const void *value, void **pp, size_t *size);
+static herr_t H5P__dxfr_bkgr_buf_type_dec(const void **pp, void *value);
+static herr_t H5P__dxfr_btree_split_ratio_enc(const void *value, void **pp, size_t *size);
+static herr_t H5P__dxfr_btree_split_ratio_dec(const void **pp, void *value);
+static herr_t H5P__dxfr_io_xfer_mode_enc(const void *value, void **pp, size_t *size);
+static herr_t H5P__dxfr_io_xfer_mode_dec(const void **pp, void *value);
+static herr_t H5P__dxfr_mpio_collective_opt_enc(const void *value, void **pp, size_t *size);
+static herr_t H5P__dxfr_mpio_collective_opt_dec(const void **pp, void *value);
+static herr_t H5P__dxfr_mpio_chunk_opt_hard_enc(const void *value, void **pp, size_t *size);
+static herr_t H5P__dxfr_mpio_chunk_opt_hard_dec(const void **pp, void *value);
+static herr_t H5P__dxfr_edc_enc(const void *value, void **pp, size_t *size);
+static herr_t H5P__dxfr_edc_dec(const void **pp, void *value);
+static herr_t H5P__dxfr_xform_set(hid_t prop_id, const char* name, size_t size, void* value);
+static herr_t H5P__dxfr_xform_get(hid_t prop_id, const char* name, size_t size, void* value);
+static herr_t H5P__dxfr_xform_enc(const void *value, void **pp, size_t *size);
+static herr_t H5P__dxfr_xform_dec(const void **pp, void *value);
 static herr_t H5P__dxfr_xform_del(hid_t prop_id, const char* name, size_t size, void* value);
 static herr_t H5P__dxfr_xform_copy(const char* name, size_t size, void* value);
 static int H5P__dxfr_xform_cmp(const void *value1, const void *value2, size_t size);
@@ -195,6 +249,38 @@ const H5P_libclass_t H5P_CLS_DXFR[1] = {{
 /* Local Private Variables */
 /***************************/
 
+/* Property value defaults */
+static const size_t H5D_def_max_temp_buf_g = H5D_XFER_MAX_TEMP_BUF_DEF;        /* Default value for maximum temp buffer size */
+static const void *H5D_def_tconv_buf_g = H5D_XFER_TCONV_BUF_DEF;               /* Default value for type conversion buffer */
+static const void *H5D_def_bkgr_buf_g = H5D_XFER_BKGR_BUF_DEF;                 /* Default value for background buffer */
+static const H5T_bkg_t H5D_def_bkgr_buf_type_g = H5D_XFER_BKGR_BUF_TYPE_DEF;
+static const double H5D_def_btree_split_ratio_g[3] = H5D_XFER_BTREE_SPLIT_RATIO_DEF;   /* Default value for B-tree node split ratios */
+static const H5MM_allocate_t H5D_def_vlen_alloc_g = H5D_XFER_VLEN_ALLOC_DEF;   /* Default value for vlen allocation function */
+static const void *H5D_def_vlen_alloc_info_g = H5D_XFER_VLEN_ALLOC_INFO_DEF;   /* Default value for vlen allocation information */
+static const H5MM_free_t H5D_def_vlen_free_g = H5D_XFER_VLEN_FREE_DEF;         /* Default value for vlen free function */
+static const void *H5D_def_vlen_free_info_g = H5D_XFER_VLEN_FREE_INFO_DEF;     /* Default value for vlen free information */
+static const size_t H5D_def_hyp_vec_size_g = H5D_XFER_HYPER_VECTOR_SIZE_DEF;   /* Default value for vector size */
+static const H5FD_mpio_xfer_t H5D_def_io_xfer_mode_g = H5D_XFER_IO_XFER_MODE_DEF;      /* Default value for I/O transfer mode */
+static const H5FD_mpio_chunk_opt_t H5D_def_mpio_chunk_opt_mode_g = H5D_XFER_MPIO_CHUNK_OPT_HARD_DEF;
+static const H5FD_mpio_collective_opt_t H5D_def_mpio_collective_opt_mode_g = H5D_XFER_MPIO_COLLECTIVE_OPT_DEF;
+static const unsigned H5D_def_mpio_chunk_opt_num_g = H5D_XFER_MPIO_CHUNK_OPT_NUM_DEF;
+static const unsigned H5D_def_mpio_chunk_opt_ratio_g = H5D_XFER_MPIO_CHUNK_OPT_RATIO_DEF;
+static const H5D_mpio_actual_chunk_opt_mode_t H5D_def_mpio_actual_chunk_opt_mode_g = H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_DEF;
+static const H5D_mpio_actual_io_mode_t H5D_def_mpio_actual_io_mode_g = H5D_MPIO_ACTUAL_IO_MODE_DEF;
+static const H5D_mpio_no_collective_cause_t H5D_def_mpio_no_collective_cause_g = H5D_MPIO_NO_COLLECTIVE_CAUSE_DEF; 
+#ifdef H5_HAVE_PARALLEL
+static const MPI_Datatype H5D_def_btype_g = H5FD_MPI_XFER_MEM_MPI_TYPE_DEF;  /* Default value for MPI buffer type */
+static const MPI_Datatype H5D_def_ftype_g = H5FD_MPI_XFER_FILE_MPI_TYPE_DEF; /* Default value for MPI file type */
+#endif /* H5_HAVE_PARALLEL */
+static const H5Z_EDC_t H5D_def_enable_edc_g = H5D_XFER_EDC_DEF;            /* Default value for EDC property */
+static const H5Z_cb_t H5D_def_filter_cb_g = H5D_XFER_FILTER_CB_DEF;        /* Default value for filter callback */
+static const H5T_conv_cb_t H5D_def_conv_cb_g = H5D_XFER_CONV_CB_DEF;       /* Default value for datatype conversion callback */
+static const void *H5D_def_xfer_xform_g = H5D_XFER_XFORM_DEF;          /* Default value for data transform */
+static const hbool_t H5D_def_direct_chunk_flag_g = H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_DEF; 	/* Default value for the flag of direct chunk write */
+static const uint32_t H5D_def_direct_chunk_filters_g = H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_DEF;	/* Default value for the filters of direct chunk write */
+static const hsize_t *H5D_def_direct_chunk_offset_g = H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_DEF; 	/* Default value for the offset of direct chunk write */
+static const uint32_t H5D_def_direct_chunk_datasize_g = H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_DEF; /* Default value for the datasize of direct chunk write */
+static const H5AC_ring_t H5D_ring_g = H5AC_XFER_RING_DEF; /* Default value for the cache entry ring type */
 
 

 /*-------------------------------------------------------------------------
@@ -211,158 +297,187 @@ const H5P_libclass_t H5P_CLS_DXFR[1] = {{
 static herr_t
 H5P__dxfr_reg_prop(H5P_genclass_t *pclass)
 {
-    size_t def_max_temp_buf = H5D_XFER_MAX_TEMP_BUF_DEF;        /* Default value for maximum temp buffer size */
-    void *def_tconv_buf = H5D_XFER_TCONV_BUF_DEF;               /* Default value for type conversion buffer */
-    void *def_bkgr_buf = H5D_XFER_BKGR_BUF_DEF;                 /* Default value for background buffer */
-    H5T_bkg_t def_bkgr_buf_type = H5D_XFER_BKGR_BUF_TYPE_DEF;
-    double def_btree_split_ratio[3] = H5D_XFER_BTREE_SPLIT_RATIO_DEF;   /* Default value for B-tree node split ratios */
-    H5MM_allocate_t def_vlen_alloc = H5D_XFER_VLEN_ALLOC_DEF;   /* Default value for vlen allocation function */
-    void *def_vlen_alloc_info = H5D_XFER_VLEN_ALLOC_INFO_DEF;   /* Default value for vlen allocation information */
-    H5MM_free_t def_vlen_free = H5D_XFER_VLEN_FREE_DEF;         /* Default value for vlen free function */
-    void *def_vlen_free_info = H5D_XFER_VLEN_FREE_INFO_DEF;     /* Default value for vlen free information */
-    size_t def_hyp_vec_size = H5D_XFER_HYPER_VECTOR_SIZE_DEF;   /* Default value for vector size */
-#ifdef H5_HAVE_PARALLEL
-    H5FD_mpio_xfer_t def_io_xfer_mode = H5D_XFER_IO_XFER_MODE_DEF;      /* Default value for I/O transfer mode */
-    H5FD_mpio_chunk_opt_t def_mpio_chunk_opt_mode = H5D_XFER_MPIO_CHUNK_OPT_HARD_DEF;
-    H5FD_mpio_collective_opt_t def_mpio_collective_opt_mode = H5D_XFER_MPIO_COLLECTIVE_OPT_DEF;
-    unsigned def_mpio_chunk_opt_num = H5D_XFER_MPIO_CHUNK_OPT_NUM_DEF;
-    unsigned def_mpio_chunk_opt_ratio = H5D_XFER_MPIO_CHUNK_OPT_RATIO_DEF;
-    H5D_mpio_actual_chunk_opt_mode_t def_mpio_actual_chunk_opt_mode = H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_DEF;
-    H5D_mpio_actual_io_mode_t def_mpio_actual_io_mode = H5D_MPIO_ACTUAL_IO_MODE_DEF;
-    H5D_mpio_no_collective_cause_t def_mpio_no_collective_cause = H5D_MPIO_NO_COLLECTIVE_CAUSE_DEF; 
-    MPI_Datatype btype = H5FD_MPI_XFER_MEM_MPI_TYPE_DEF;  /* Default value for MPI buffer type */
-    MPI_Datatype ftype = H5FD_MPI_XFER_FILE_MPI_TYPE_DEF; /* Default value for MPI file type */
-#endif /* H5_HAVE_PARALLEL */
-    H5Z_EDC_t enable_edc = H5D_XFER_EDC_DEF;            /* Default value for EDC property */
-    H5Z_cb_t filter_cb = H5D_XFER_FILTER_CB_DEF;        /* Default value for filter callback */
-    H5T_conv_cb_t conv_cb = H5D_XFER_CONV_CB_DEF;       /* Default value for datatype conversion callback */
-    void *def_xfer_xform = H5D_XFER_XFORM_DEF;          /* Default value for data transform */
-    hbool_t direct_chunk_flag = H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_DEF; 	        /* Default value for the flag of direct chunk write */
-    uint32_t direct_chunk_filters = H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_DEF;	/* Default value for the filters of direct chunk write */
-    hsize_t *direct_chunk_offset = H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_DEF; 	/* Default value for the offset of direct chunk write */
-    uint32_t direct_chunk_datasize = H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_DEF;    /* Default value for the datasize of direct chunk write */
+    H5C_tag_t tag = H5C_TAG_DEF;                                /* Default value for cache entry tag */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
 
     /* Register the max. temp buffer size property */
-    if(H5P_register_real(pclass, H5D_XFER_MAX_TEMP_BUF_NAME, H5D_XFER_MAX_TEMP_BUF_SIZE, &def_max_temp_buf, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_XFER_MAX_TEMP_BUF_NAME, H5D_XFER_MAX_TEMP_BUF_SIZE, &H5D_def_max_temp_buf_g, 
+            NULL, NULL, NULL, H5D_XFER_MAX_TEMP_BUF_ENC, H5D_XFER_MAX_TEMP_BUF_DEC,
+            NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the cache tag property */
+    if(H5P_register_real(pclass, H5C_TAG_NAME, H5C_TAG_SIZE, &tag, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the type conversion buffer property */
-    if(H5P_register_real(pclass, H5D_XFER_TCONV_BUF_NAME, H5D_XFER_TCONV_BUF_SIZE, &def_tconv_buf, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5D_XFER_TCONV_BUF_NAME, H5D_XFER_TCONV_BUF_SIZE, &H5D_def_tconv_buf_g, 
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the background buffer property */
-    if(H5P_register_real(pclass, H5D_XFER_BKGR_BUF_NAME, H5D_XFER_BKGR_BUF_SIZE, &def_bkgr_buf, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5D_XFER_BKGR_BUF_NAME, H5D_XFER_BKGR_BUF_SIZE, &H5D_def_bkgr_buf_g, 
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the background buffer type property */
-    if(H5P_register_real(pclass, H5D_XFER_BKGR_BUF_TYPE_NAME, H5D_XFER_BKGR_BUF_TYPE_SIZE, &def_bkgr_buf_type, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_XFER_BKGR_BUF_TYPE_NAME, H5D_XFER_BKGR_BUF_TYPE_SIZE, &H5D_def_bkgr_buf_type_g, 
+             NULL, NULL, NULL, H5D_XFER_BKGR_BUF_TYPE_ENC, H5D_XFER_BKGR_BUF_TYPE_DEC,
+             NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the B-Tree node splitting ratios property */
-    if(H5P_register_real(pclass, H5D_XFER_BTREE_SPLIT_RATIO_NAME, H5D_XFER_BTREE_SPLIT_RATIO_SIZE, def_btree_split_ratio, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_XFER_BTREE_SPLIT_RATIO_NAME, H5D_XFER_BTREE_SPLIT_RATIO_SIZE, H5D_def_btree_split_ratio_g, 
+            NULL, NULL, NULL, H5D_XFER_BTREE_SPLIT_RATIO_ENC, H5D_XFER_BTREE_SPLIT_RATIO_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the vlen allocation function property */
-    if(H5P_register_real(pclass, H5D_XFER_VLEN_ALLOC_NAME, H5D_XFER_VLEN_ALLOC_SIZE, &def_vlen_alloc, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5D_XFER_VLEN_ALLOC_NAME, H5D_XFER_VLEN_ALLOC_SIZE, &H5D_def_vlen_alloc_g, 
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the vlen allocation information property */
-    if(H5P_register_real(pclass, H5D_XFER_VLEN_ALLOC_INFO_NAME, H5D_XFER_VLEN_ALLOC_INFO_SIZE, &def_vlen_alloc_info, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5D_XFER_VLEN_ALLOC_INFO_NAME, H5D_XFER_VLEN_ALLOC_INFO_SIZE, &H5D_def_vlen_alloc_info_g, 
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the vlen free function property */
-    if(H5P_register_real(pclass, H5D_XFER_VLEN_FREE_NAME, H5D_XFER_VLEN_FREE_SIZE, &def_vlen_free, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5D_XFER_VLEN_FREE_NAME, H5D_XFER_VLEN_FREE_SIZE, &H5D_def_vlen_free_g, 
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the vlen free information property */
-    if(H5P_register_real(pclass, H5D_XFER_VLEN_FREE_INFO_NAME, H5D_XFER_VLEN_FREE_INFO_SIZE, &def_vlen_free_info, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5D_XFER_VLEN_FREE_INFO_NAME, H5D_XFER_VLEN_FREE_INFO_SIZE, &H5D_def_vlen_free_info_g, 
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the vector size property */
-    if(H5P_register_real(pclass, H5D_XFER_HYPER_VECTOR_SIZE_NAME, H5D_XFER_HYPER_VECTOR_SIZE_SIZE, &def_hyp_vec_size, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_XFER_HYPER_VECTOR_SIZE_NAME, H5D_XFER_HYPER_VECTOR_SIZE_SIZE, &H5D_def_hyp_vec_size_g, 
+            NULL, NULL, NULL, H5D_XFER_HYPER_VECTOR_SIZE_ENC, H5D_XFER_HYPER_VECTOR_SIZE_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
-#ifdef H5_HAVE_PARALLEL
     /* Register the I/O transfer mode properties */
-    if(H5P_register_real(pclass, H5D_XFER_IO_XFER_MODE_NAME, H5D_XFER_IO_XFER_MODE_SIZE, &def_io_xfer_mode, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_XFER_IO_XFER_MODE_NAME, H5D_XFER_IO_XFER_MODE_SIZE, &H5D_def_io_xfer_mode_g, 
+            NULL, NULL, NULL, H5D_XFER_IO_XFER_MODE_ENC, H5D_XFER_IO_XFER_MODE_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
-    if(H5P_register_real(pclass, H5D_XFER_MPIO_COLLECTIVE_OPT_NAME, H5D_XFER_MPIO_COLLECTIVE_OPT_SIZE, &def_mpio_collective_opt_mode, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_XFER_MPIO_COLLECTIVE_OPT_NAME, H5D_XFER_MPIO_COLLECTIVE_OPT_SIZE, &H5D_def_mpio_collective_opt_mode_g, 
+            NULL, NULL, NULL, H5D_XFER_MPIO_COLLECTIVE_OPT_ENC, H5D_XFER_MPIO_COLLECTIVE_OPT_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
-    if(H5P_register_real(pclass, H5D_XFER_MPIO_CHUNK_OPT_HARD_NAME, H5D_XFER_MPIO_CHUNK_OPT_HARD_SIZE, &def_mpio_chunk_opt_mode, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_XFER_MPIO_CHUNK_OPT_HARD_NAME, H5D_XFER_MPIO_CHUNK_OPT_HARD_SIZE, &H5D_def_mpio_chunk_opt_mode_g, 
+            NULL, NULL, NULL, H5D_XFER_MPIO_CHUNK_OPT_HARD_ENC, H5D_XFER_MPIO_CHUNK_OPT_HARD_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
-    if(H5P_register_real(pclass, H5D_XFER_MPIO_CHUNK_OPT_NUM_NAME, H5D_XFER_MPIO_CHUNK_OPT_NUM_SIZE, &def_mpio_chunk_opt_num, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_XFER_MPIO_CHUNK_OPT_NUM_NAME, H5D_XFER_MPIO_CHUNK_OPT_NUM_SIZE, &H5D_def_mpio_chunk_opt_num_g, 
+            NULL, NULL, NULL, H5D_XFER_MPIO_CHUNK_OPT_NUM_ENC, H5D_XFER_MPIO_CHUNK_OPT_NUM_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
-    if(H5P_register_real(pclass, H5D_XFER_MPIO_CHUNK_OPT_RATIO_NAME, H5D_XFER_MPIO_CHUNK_OPT_RATIO_SIZE, &def_mpio_chunk_opt_ratio, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_XFER_MPIO_CHUNK_OPT_RATIO_NAME, H5D_XFER_MPIO_CHUNK_OPT_RATIO_SIZE, &H5D_def_mpio_chunk_opt_ratio_g, 
+            NULL, NULL, NULL, H5D_XFER_MPIO_CHUNK_OPT_RATIO_ENC, H5D_XFER_MPIO_CHUNK_OPT_RATIO_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the chunk optimization mode property. */
-    if(H5P_register_real(pclass, H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME, H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_SIZE, &def_mpio_actual_chunk_opt_mode, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME, H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_SIZE, &H5D_def_mpio_actual_chunk_opt_mode_g, 
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the actual I/O mode property. */
-    if(H5P_register_real(pclass, H5D_MPIO_ACTUAL_IO_MODE_NAME, H5D_MPIO_ACTUAL_IO_MODE_SIZE, &def_mpio_actual_io_mode, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5D_MPIO_ACTUAL_IO_MODE_NAME, H5D_MPIO_ACTUAL_IO_MODE_SIZE, &H5D_def_mpio_actual_io_mode_g, 
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the local cause of broken collective I/O */
-    if(H5P_register_real(pclass, H5D_MPIO_LOCAL_NO_COLLECTIVE_CAUSE_NAME, H5D_MPIO_NO_COLLECTIVE_CAUSE_SIZE, &def_mpio_no_collective_cause, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5D_MPIO_LOCAL_NO_COLLECTIVE_CAUSE_NAME, H5D_MPIO_NO_COLLECTIVE_CAUSE_SIZE, &H5D_def_mpio_no_collective_cause_g,
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the global cause of broken collective I/O */
-    if(H5P_register_real(pclass, H5D_MPIO_GLOBAL_NO_COLLECTIVE_CAUSE_NAME, H5D_MPIO_NO_COLLECTIVE_CAUSE_SIZE, &def_mpio_no_collective_cause, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5D_MPIO_GLOBAL_NO_COLLECTIVE_CAUSE_NAME, H5D_MPIO_NO_COLLECTIVE_CAUSE_SIZE, &H5D_def_mpio_no_collective_cause_g,
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
+#ifdef H5_HAVE_PARALLEL
     /* Register the MPI memory type property */
-    if(H5P_register_real(pclass, H5FD_MPI_XFER_MEM_MPI_TYPE_NAME, H5FD_MPI_XFER_MEM_MPI_TYPE_SIZE, 
-                         &btype, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5FD_MPI_XFER_MEM_MPI_TYPE_NAME, H5FD_MPI_XFER_MEM_MPI_TYPE_SIZE, &H5D_def_btype_g,
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the MPI file type property */
-    if(H5P_register_real(pclass, H5FD_MPI_XFER_FILE_MPI_TYPE_NAME, H5FD_MPI_XFER_FILE_MPI_TYPE_SIZE, 
-                         &ftype, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5FD_MPI_XFER_FILE_MPI_TYPE_NAME, H5FD_MPI_XFER_FILE_MPI_TYPE_SIZE, &H5D_def_ftype_g,
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 #endif /* H5_HAVE_PARALLEL */
 
     /* Register the EDC property */
-    if(H5P_register_real(pclass, H5D_XFER_EDC_NAME, H5D_XFER_EDC_SIZE, &enable_edc, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_XFER_EDC_NAME, H5D_XFER_EDC_SIZE, &H5D_def_enable_edc_g,
+            NULL, NULL, NULL, H5D_XFER_EDC_ENC, H5D_XFER_EDC_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the filter callback property */
-    if(H5P_register_real(pclass, H5D_XFER_FILTER_CB_NAME, H5D_XFER_FILTER_CB_SIZE, &filter_cb, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5D_XFER_FILTER_CB_NAME, H5D_XFER_FILTER_CB_SIZE, &H5D_def_filter_cb_g,
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the type conversion callback property */
-    if(H5P_register_real(pclass, H5D_XFER_CONV_CB_NAME, H5D_XFER_CONV_CB_SIZE, &conv_cb, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5D_XFER_CONV_CB_NAME, H5D_XFER_CONV_CB_SIZE, &H5D_def_conv_cb_g,
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the data transform property */
-    if(H5P_register_real(pclass, H5D_XFER_XFORM_NAME, H5D_XFER_XFORM_SIZE, &def_xfer_xform, NULL, NULL, NULL, H5D_XFER_XFORM_DEL, H5D_XFER_XFORM_COPY, H5D_XFER_XFORM_CMP, H5D_XFER_XFORM_CLOSE) < 0)
+    if(H5P_register_real(pclass, H5D_XFER_XFORM_NAME, H5D_XFER_XFORM_SIZE, &H5D_def_xfer_xform_g,
+            NULL, H5D_XFER_XFORM_SET, H5D_XFER_XFORM_GET, H5D_XFER_XFORM_ENC, H5D_XFER_XFORM_DEC, 
+            H5D_XFER_XFORM_DEL, H5D_XFER_XFORM_COPY, H5D_XFER_XFORM_CMP, H5D_XFER_XFORM_CLOSE) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the property of flag for direct chunk write */
     /* (Note: this property should not have an encode/decode callback -QAK) */
-    if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_SIZE, &direct_chunk_flag,
-            NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_SIZE, &H5D_def_direct_chunk_flag_g,
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the property of filter for direct chunk write */
     /* (Note: this property should not have an encode/decode callback -QAK) */
-    if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_SIZE, &direct_chunk_filters,
-            NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_SIZE, &H5D_def_direct_chunk_filters_g,
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the property of offset for direct chunk write */
     /* (Note: this property should not have an encode/decode callback -QAK) */
-    if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_SIZE, &direct_chunk_offset,
-            NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_SIZE, &H5D_def_direct_chunk_offset_g,
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the property of datasize for direct chunk write */
     /* (Note: this property should not have an encode/decode callback -QAK) */
-    if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_SIZE, &direct_chunk_datasize,
-            NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME, H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_SIZE, &H5D_def_direct_chunk_datasize_g,
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the data transform property */
+    if(H5P_register_real(pclass, H5AC_RING_NAME, H5AC_XFER_RING_SIZE, &H5D_ring_g,
+            NULL, NULL, NULL, H5AC_XFER_RING_ENC, H5AC_XFER_RING_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
 done:
@@ -371,7 +486,365 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function: H5P_dxfr_xform_del
+ * Function:       H5P__dxfr_bkgr_buf_type_enc
+ *
+ * Purpose:        Callback routine which is called whenever the background
+ *                 buffer type property in the dataset transfer property list
+ *                 is encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Friday, August 3, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dxfr_bkgr_buf_type_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5T_bkg_t *bkgr_buf_type = (const H5T_bkg_t *)value; /* Create local alias for values */
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(bkgr_buf_type);
+    HDassert(size);
+
+    if(NULL != *pp)
+        /* Encode background buffer type */
+        *(*pp)++ = (uint8_t)*bkgr_buf_type;
+
+    /* Size of background buffer type */
+    (*size)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__dxfr_bkgr_buf_type_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dxfr_bkgr_buf_type_dec
+ *
+ * Purpose:        Callback routine which is called whenever the background
+ *                 buffer type property in the dataset transfer property list
+ *                 is decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Friday, August 3, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dxfr_bkgr_buf_type_dec(const void **_pp, void *_value)
+{
+    H5T_bkg_t *bkgr_buf_type = (H5T_bkg_t *)_value;     /* Background buffer type */
+    const uint8_t **pp = (const uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(bkgr_buf_type);
+
+    /* Decode background buffer type */
+    *bkgr_buf_type = (H5T_bkg_t)*(*pp)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__dxfr_bkgr_buf_type_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dxfr_btree_split_ratio_enc
+ *
+ * Purpose:        Callback routine which is called whenever the B-tree split
+ *                 ratio property in the dataset transfer property list
+ *                 is encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Friday, August 3, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dxfr_btree_split_ratio_enc(const void *value, void **_pp, size_t *size)
+{
+    const double *btree_split_ratio = (const double *)value; /* Create local alias for values */
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(btree_split_ratio);
+    HDassert(size);
+
+    if(NULL != *pp) {
+        /* Encode the size of a double*/
+        *(*pp)++ = (uint8_t)sizeof(double);
+
+        /* Encode the left split value */
+        H5_ENCODE_DOUBLE(*pp, *(const double *)btree_split_ratio)
+        btree_split_ratio++;
+
+        /* Encode the middle split value */
+        H5_ENCODE_DOUBLE(*pp, *(const double *)btree_split_ratio)
+        btree_split_ratio++;
+
+        /* Encode the right split value */
+        H5_ENCODE_DOUBLE(*pp, *(const double *)btree_split_ratio)
+    } /* end if */
+
+    /* Size of B-tree split ratio values */
+    *size += 1 + (3 * sizeof(double));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__dxfr_btree_split_ratio_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dxfr_btree_split_ratio_dec
+ *
+ * Purpose:        Callback routine which is called whenever the B-tree split
+ *                 ratio property in the dataset transfer property list
+ *                 is decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Friday, August 3, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dxfr_btree_split_ratio_dec(const void **_pp, void *_value)
+{
+    double *btree_split_ratio = (double *)_value;        /* B-tree split ratio */
+    unsigned enc_size;                  /* Size of encoded property */
+    const uint8_t **pp = (const uint8_t **)_pp;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(btree_split_ratio);
+
+    /* Decode the size */
+    enc_size = *(*pp)++;
+    if(enc_size != sizeof(double))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "double value can't be decoded")
+
+    /* Decode the left, middle & left B-tree split ratios */
+    H5_DECODE_DOUBLE(*pp, btree_split_ratio[0])
+    H5_DECODE_DOUBLE(*pp, btree_split_ratio[1])
+    H5_DECODE_DOUBLE(*pp, btree_split_ratio[2])
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dxfr_btree_split_ratio_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dxfr_xform_set
+ *
+ * Purpose:     Copies a data transform property when it's set for a property list
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, Sept 1, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dxfr_xform_set(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Make copy of data transform */
+    if(H5Z_xform_copy((H5Z_data_xform_t **)value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "error copying the data transform info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dxfr_xform_set() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__dxfr_xform_get
+ *
+ * Purpose:     Copies a data transform property when it's retrieved for a property list
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, Sept 1, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dxfr_xform_get(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Make copy of data transform */
+    if(H5Z_xform_copy((H5Z_data_xform_t **)value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "error copying the data transform info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dxfr_xform_get() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dxfr_xform_enc
+ *
+ * Purpose:        Callback routine which is called whenever the data transform
+ *                 property in the dataset transfer property list
+ *                 is encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Monday, August 6, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dxfr_xform_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5Z_data_xform_t *data_xform_prop = *(const H5Z_data_xform_t * const *)value; /* Create local alias for values */
+    const char *pexp = NULL;            /* Pointer to transform expression */
+    size_t	len = 0;                /* Length of transform expression */
+    uint8_t **pp = (uint8_t **)_pp;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+    HDassert(size);
+
+    /* Check for data transform set */
+    if(NULL != data_xform_prop) {
+        /* Get the transform expression */
+        if(NULL == (pexp = H5Z_xform_extract_xform_str(data_xform_prop)))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "failed to retrieve transform expression")
+
+        /* Get the transform string expression size */
+        len = HDstrlen(pexp) + 1;
+    } /* end if */
+
+    if(NULL != *pp) {
+        uint64_t enc_value;
+        unsigned enc_size;
+
+        /* encode the length of the prefix */
+        enc_value = (uint64_t)len;
+        enc_size = H5VM_limit_enc_size(enc_value);
+        HDassert(enc_size < 256);
+        *(*pp)++ = (uint8_t)enc_size;
+        UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+
+        if(NULL != data_xform_prop) {
+            /* Sanity check */
+            HDassert(pexp);
+
+            /* Copy the expression into the buffer */
+            HDmemcpy(*pp, (const uint8_t *)pexp, len);
+            *pp += len;
+            *pp[0] = '\0';
+        } /* end if */
+    } /* end if */
+
+    /* Size of encoded data transform */
+    *size += (1 + H5VM_limit_enc_size((uint64_t)len));
+    if(NULL != pexp)
+        *size += len;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dxfr_xform_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dxfr_xform_dec
+ *
+ * Purpose:        Callback routine which is called whenever the data transform
+ *                 property in the dataset transfer property list
+ *                 is decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Monday, August 6, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dxfr_xform_dec(const void **_pp, void *_value)
+{
+    H5Z_data_xform_t **data_xform_prop = (H5Z_data_xform_t **)_value;    /* New data xform property */
+    size_t len;                         /* Length of encoded string */
+    const uint8_t **pp = (const uint8_t **)_pp;
+    unsigned enc_size;
+    uint64_t enc_value;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(data_xform_prop);
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+
+    /* Decode the length of xform expression */
+    enc_size = *(*pp)++;
+    HDassert(enc_size < 256);
+    UINT64DECODE_VAR(*pp, enc_value, enc_size);
+    len = (size_t)enc_value;
+
+    if(0 != len) {
+        if(NULL == (*data_xform_prop = H5Z_xform_create((const char *)*pp)))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL, "unable to create data transform info")
+        *pp += len;
+    } /* end if */
+    else
+        *data_xform_prop = H5D_XFER_XFORM_DEF;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__dxfr_xform_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5P__dxfr_xform_del
  *
  * Purpose: Frees memory allocated by H5P_dxfr_xform_set
  *
@@ -383,7 +856,6 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
 H5P__dxfr_xform_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
 {
@@ -415,7 +887,6 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
 H5P__dxfr_xform_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
 {
@@ -423,10 +894,12 @@ H5P__dxfr_xform_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size
 
     FUNC_ENTER_STATIC
 
+    /* Sanity check */
     HDassert(value);
 
+    /* Make copy of data transform */
     if(H5Z_xform_copy((H5Z_data_xform_t **)value) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTCLOSEOBJ, FAIL, "error copying the data transform info")
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "error copying the data transform info")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -500,7 +973,6 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
 H5P__dxfr_xform_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
 {
@@ -549,7 +1021,7 @@ H5Pset_data_transform(hid_t plist_id, const char *expression)
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* See if a data transform is already set, and free it if it is */
-    if(H5P_get(plist, H5D_XFER_XFORM_NAME, &data_xform_prop) < 0)
+    if(H5P_peek(plist, H5D_XFER_XFORM_NAME, &data_xform_prop) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "error getting data transform expression")
 
     /* Destroy previous data transform property */
@@ -560,15 +1032,14 @@ H5Pset_data_transform(hid_t plist_id, const char *expression)
     if(NULL == (data_xform_prop = H5Z_xform_create(expression)))
         HGOTO_ERROR(H5E_PLINE, H5E_NOSPACE, FAIL, "unable to create data transform info")
 
-    /* Update property list */
-    if(H5P_set(plist, H5D_XFER_XFORM_NAME, &data_xform_prop) < 0)
+    /* Update property list (takes ownership of transform) */
+    if(H5P_poke(plist, H5D_XFER_XFORM_NAME, &data_xform_prop) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "Error setting data transform expression")
 
 done:
-    if(ret_value <  0) {
+    if(ret_value < 0)
         if(data_xform_prop && H5Z_xform_destroy(data_xform_prop) <  0)
             HDONE_ERROR(H5E_PLINE, H5E_CLOSEERROR, FAIL, "unable to release data transform expression")
-    } /* end if */
 
     FUNC_LEAVE_API(ret_value)
 } /* end H5Pset_data_transform() */
@@ -612,7 +1083,7 @@ H5Pget_data_transform(hid_t plist_id, char *expression /*out*/, size_t size)
     if(NULL == (plist = H5P_object_verify(plist_id, H5P_DATASET_XFER)))
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
-    if(H5P_get(plist, H5D_XFER_XFORM_NAME, &data_xform_prop) < 0)
+    if(H5P_peek(plist, H5D_XFER_XFORM_NAME, &data_xform_prop) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "error getting data transform expression")
 
     if(NULL == data_xform_prop)
@@ -622,6 +1093,7 @@ H5Pget_data_transform(hid_t plist_id, char *expression /*out*/, size_t size)
     if(NULL == (pexp = H5Z_xform_extract_xform_str(data_xform_prop)))
 	HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "failed to retrieve transform expression")
 
+    /* Copy into application buffer */
     len = HDstrlen(pexp);
     if(expression) {
 	HDstrncpy(expression, pexp, MIN(len + 1, size));
@@ -632,11 +1104,6 @@ H5Pget_data_transform(hid_t plist_id, char *expression /*out*/, size_t size)
     ret_value = (ssize_t)len;
 
 done:
-    if(ret_value < 0) {
-	if(data_xform_prop && H5Z_xform_destroy(data_xform_prop) < 0)
-            HDONE_ERROR(H5E_PLINE, H5E_CLOSEERROR, FAIL, "unable to release data transform expression")
-    } /* end if */
-
     FUNC_LEAVE_API(ret_value)
 } /* end H5Pget_data_transform() */
 
@@ -1339,6 +1806,225 @@ done:
     FUNC_LEAVE_API(ret_value)
 } /* end H5Pget_hyper_vector_size() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dxfr_io_xfer_mode_enc
+ *
+ * Purpose:        Callback routine which is called whenever the I/O transfer
+ *                 mode property in the dataset transfer property list
+ *                 is encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Friday, August 3, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dxfr_io_xfer_mode_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5FD_mpio_xfer_t *xfer_mode = (const H5FD_mpio_xfer_t *)value; /* Create local alias for values */
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(xfer_mode);
+    HDassert(size);
+
+    if(NULL != *pp)
+        /* Encode I/O transfer mode */
+        *(*pp)++ = (uint8_t)*xfer_mode;
+
+    /* Size of I/O transfer mode */
+    (*size)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__dxfr_io_xfer_mode_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dxfr_io_xfer_mode_dec
+ *
+ * Purpose:        Callback routine which is called whenever the I/O transfer
+ *                 mode property in the dataset transfer property list
+ *                 is decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Friday, August 3, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dxfr_io_xfer_mode_dec(const void **_pp, void *_value)
+{
+    H5FD_mpio_xfer_t *xfer_mode = (H5FD_mpio_xfer_t *)_value;         /* I/O transfer mode */
+    const uint8_t **pp = (const uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(xfer_mode);
+
+    /* Decode I/O transfer mode */
+    *xfer_mode = (H5FD_mpio_xfer_t)*(*pp)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__dxfr_io_xfer_mode_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dxfr_mpio_collective_opt_enc
+ *
+ * Purpose:        Callback routine which is called whenever the MPI-I/O
+ *                 collective optimization property in the dataset transfer
+ *		   property list is encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Friday, August 3, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dxfr_mpio_collective_opt_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5FD_mpio_collective_opt_t *coll_opt = (const H5FD_mpio_collective_opt_t *)value; /* Create local alias for values */
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(coll_opt);
+    HDassert(size);
+
+    if(NULL != *pp)
+        /* Encode MPI-I/O collective optimization property */
+        *(*pp)++ = (uint8_t)*coll_opt;
+
+    /* Size of MPI-I/O collective optimization property */
+    (*size)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__dxfr_mpio_collective_opt_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dxfr_mpio_collective_opt_dec
+ *
+ * Purpose:        Callback routine which is called whenever the MPI-I/O
+ *                 collective optimization property in the dataset transfer
+ *		   property list is decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Friday, August 3, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dxfr_mpio_collective_opt_dec(const void **_pp, void *_value)
+{
+    H5FD_mpio_collective_opt_t *coll_opt = (H5FD_mpio_collective_opt_t *)_value;         /* MPI-I/O collective optimization mode */
+    const uint8_t **pp = (const uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(coll_opt);
+
+    /* Decode MPI-I/O collective optimization mode */
+    *coll_opt = (H5FD_mpio_collective_opt_t)*(*pp)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__dxfr_mpio_collective_opt_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dxfr_mpio_chunk_opt_hard_enc
+ *
+ * Purpose:        Callback routine which is called whenever the MPI-I/O
+ *                 chunk optimization property in the dataset transfer
+ *		   property list is encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Friday, August 3, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dxfr_mpio_chunk_opt_hard_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5FD_mpio_chunk_opt_t *chunk_opt = (const H5FD_mpio_chunk_opt_t *)value; /* Create local alias for values */
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(chunk_opt);
+    HDassert(size);
+
+    if(NULL != *pp)
+        /* Encode MPI-I/O chunk optimization property */
+        *(*pp)++ = (uint8_t)*chunk_opt;
+
+    /* Size of MPI-I/O chunk optimization property */
+    (*size)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__dxfr_mpio_chunk_opt_hard_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dxfr_mpio_chunk_opt_hard_enc
+ *
+ * Purpose:        Callback routine which is called whenever the MPI-I/O
+ *                 chunk collective optimization property in the dataset transfer
+ *		   property list is decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Friday, August 3, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dxfr_mpio_chunk_opt_hard_dec(const void **_pp, void *_value)
+{
+    H5FD_mpio_chunk_opt_t *chunk_opt = (H5FD_mpio_chunk_opt_t *)_value;         /* MPI-I/O chunk optimization mode */
+    const uint8_t **pp = (const uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(chunk_opt);
+
+    /* Decode MPI-I/O chunk optimization mode */
+    *chunk_opt = (H5FD_mpio_chunk_opt_t)*(*pp)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__dxfr_mpio_chunk_opt_hard_dec() */
+
 #ifdef H5_HAVE_PARALLEL
 

 /*-------------------------------------------------------------------------
@@ -1451,3 +2137,76 @@ done:
 
 #endif /* H5_HAVE_PARALLEL */
 
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dxfr_edc_enc
+ *
+ * Purpose:        Callback routine which is called whenever the error detect
+ *                 property in the dataset transfer property list
+ *                 is encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Friday, August 3, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dxfr_edc_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5Z_EDC_t *check = (const H5Z_EDC_t *)value; /* Create local alias for values */
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(check);
+    HDassert(size);
+
+    if(NULL != *pp)
+        /* Encode EDC property */
+        *(*pp)++ = (uint8_t)*check;
+
+    /* Size of EDC property */
+    (*size)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__dxfr_edc_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__dxfr_edc_dec
+ *
+ * Purpose:        Callback routine which is called whenever the error detect
+ *                 property in the dataset transfer property list
+ *                 is decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Friday, August 3, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__dxfr_edc_dec(const void **_pp, void *_value)
+{
+    H5Z_EDC_t *check = (H5Z_EDC_t *)_value;         /* EDC property */
+    const uint8_t **pp = (const uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(check);
+
+    /* Decode EDC property */
+    *check = (H5Z_EDC_t)*(*pp)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__dxfr_edc_dec() */
+
diff --git a/src/H5Pencdec.c b/src/H5Pencdec.c
new file mode 100644
index 0000000..1bcd19c
--- /dev/null
+++ b/src/H5Pencdec.c
@@ -0,0 +1,791 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at hdfgroup.org>
+ *
+ * Purpose:	Generic Property Functions
+ */
+
+/****************/
+/* Module Setup */
+/****************/
+
+#include "H5Pmodule.h"          /* This source code file is part of the H5P module */
+
+
+/***********/
+/* Headers */
+/***********/
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* Files		  	        */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5Ppkg.h"		/* Property lists		  	*/
+#include "H5VMprivate.h"        /* Vector functions			*/
+
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* Version # of encoded property lists */
+#define H5P_ENCODE_VERS         0
+
+
+/******************/
+/* Local Typedefs */
+/******************/
+
+/* Typedef for iterator when encoding a property list */
+typedef struct {
+    hbool_t encode;             /* Whether the property list should be encoded */
+    size_t *enc_size_ptr;       /* Pointer to size of encoded buffer */
+    void **pp;               /* Pointer to encoding buffer pointer */
+} H5P_enc_iter_ud_t;
+
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+
+/*********************/
+/* Package Variables */
+/*********************/
+
+
+/*****************************/
+/* Library Private Variables */
+/*****************************/
+
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__encode_size_t
+ *
+ * Purpose:        Generic encoding callback routine for 'size_t' properties.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Sunday, July 29, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P__encode_size_t(const void *value, void **_pp, size_t *size)
+{
+    uint64_t enc_value = (uint64_t)*(const size_t *)value;    /* Property value to encode */
+    uint8_t **pp = (uint8_t **)_pp;
+    unsigned enc_size = H5VM_limit_enc_size(enc_value);  /* Size of encoded property */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity checks */
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+    HDassert(enc_size < 256);
+    HDassert(size);
+
+    if(NULL != *pp) {
+        /* Encode the size */
+        *(*pp)++ = (uint8_t)enc_size;
+
+        /* Encode the value */
+        UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+    } /* end if */
+
+    /* Set size needed for encoding */
+    *size += (1 + enc_size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__encode_size_t() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__encode_hsize_t
+ *
+ * Purpose:        Generic encoding callback routine for 'hsize_t' properties.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 August 07, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P__encode_hsize_t(const void *value, void **_pp, size_t *size)
+{
+    uint64_t enc_value = (uint64_t)*(const hsize_t *)value;    /* Property value to encode */
+    unsigned enc_size = H5VM_limit_enc_size(enc_value);  /* Size of encoded property */
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity checks */
+    HDcompile_assert(sizeof(hsize_t) <= sizeof(uint64_t));
+    HDassert(enc_size < 256);
+    HDassert(size);
+
+    if(NULL != *pp) {
+        *(*pp)++ = (uint8_t)enc_size;
+
+        /* Encode the value */
+        UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+    } /* end if */
+
+    /* Set size needed for encoding */
+    *size += (1 + enc_size);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__encode_hsize_t() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__encode_unsigned
+ *
+ * Purpose:        Generic encoding callback routine for 'unsigned' properties.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Sunday, July 29, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P__encode_unsigned(const void *value, void **_pp, size_t *size)
+{
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity checks */
+    HDassert(value);
+    HDassert(size);
+
+    if(NULL != *pp) {
+        /* Encode the size */
+        *(*pp)++ = (uint8_t)sizeof(unsigned);
+
+        /* Encode the value */
+        H5_ENCODE_UNSIGNED(*pp, *(const unsigned *)value)
+    } /* end if */
+
+    /* Set size needed for encoding */
+    *size += (1 + sizeof(unsigned));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__encode_unsigned() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__encode_uint8_t
+ *
+ * Purpose:        Generic encoding callback routine for 'uint8_t' properties.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 August 07, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P__encode_uint8_t(const void *value, void **_pp, size_t *size)
+{
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity checks */
+    HDassert(value);
+    HDassert(size);
+
+    if(NULL != *pp) {
+        /* Encode the value */
+        *(*pp)++ = *(const uint8_t *)value;
+    } /* end if */
+
+    /* Set size needed for encoding */
+    *size += 1;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__encode_uint8_t() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__encode_hbool_t
+ *
+ * Purpose:        Generic encoding callback routine for 'hbool_t' properties.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 August 15, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P__encode_hbool_t(const void *value, void **_pp, size_t *size)
+{
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity checks */
+    HDassert(value);
+    HDassert(size);
+
+    if(NULL != *pp)
+        /* Encode the value */
+        *(*pp)++ = (uint8_t)*(const hbool_t *)value;
+
+    /* Set size needed for encoding */
+    *size += 1;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__encode_hbool_t() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__encode_double
+ *
+ * Purpose:        Generic encoding callback routine for 'double' properties.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Sunday, July 29, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P__encode_double(const void *value, void **_pp, size_t *size)
+{
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity checks */
+    HDassert(value);
+    HDassert(size);
+
+    if(NULL != *pp) {
+        /* Encode the size */
+        *(*pp)++ = (uint8_t)sizeof(double);
+
+        /* Encode the value */
+        H5_ENCODE_DOUBLE(*pp, *(const double *)value)
+    } /* end if */
+
+    /* Set size needed for encoding */
+    *size += (1 + sizeof(double));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__encode_double() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P__encode_cb
+ PURPOSE
+    Internal callback routine when iterating over properties while encoding
+    a property list.
+ USAGE
+    int H5P__encode_cb(item, key, udata)
+        H5P_genprop_t *prop;        IN: Pointer to the property
+        void *udata;                IN/OUT: Pointer to iteration data from user
+ RETURNS
+    Success: H5_ITER_CONT
+    Fail: H5_ITER_ERROR
+ DESCRIPTION
+    This routine encodes a property in a property list
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static int
+H5P__encode_cb(H5P_genprop_t *prop, void *_udata)
+{
+    H5P_enc_iter_ud_t *udata = (H5P_enc_iter_ud_t *)_udata;     /* Pointer to user data */
+    int ret_value = H5_ITER_CONT;       /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(prop);
+    HDassert(udata);
+
+    /* Check if this property can be encoded */
+    if(prop->encode) {
+        size_t prop_name_len;       /* Length of property's name */
+        size_t prop_value_len;      /* Encoded size of property's value */
+
+        /* Encode (or not, if the 'encode' flag is off) the property's name */
+        prop_name_len = HDstrlen(prop->name) + 1;
+        if(udata->encode) {
+            HDstrncpy((char *)*(udata->pp), prop->name, prop_name_len);
+            *(uint8_t **)(udata->pp) += prop_name_len;
+        } /* end if */
+        *(udata->enc_size_ptr) += prop_name_len;
+
+        /* Encode (or not, if *(udata->pp) is NULL) the property value */
+        prop_value_len = 0;
+        if((prop->encode)(prop->value, udata->pp, &prop_value_len) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTENCODE, H5_ITER_ERROR, "property encoding routine failed")
+        *(udata->enc_size_ptr) += prop_value_len;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__encode_cb() */
+
+

+/*-------------------------------------------------------------------------
+ NAME
+    H5P__encode
+ PURPOSE
+    Internal routine to encode a property list into a binary buffer.
+ USAGE
+    herr_t H5P__encode(plist, enc_all_prop, buf, nalloc)
+        const H5P_genplist_t *plist;  IN: Property list to encode
+        hbool_t enc_all_prop;  IN: Whether to encode all properties (TRUE),
+                or just non-default (i.e. changed) properties (FALSE).
+        uint8_t *buf;    OUT: buffer to hold the encoded plist
+        size_t *nalloc;  IN/OUT: size of buffer needed to encode plist
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Encodes a property list into a binary buffer. If the buffer is NULL, then
+    the call will set the size needed to encode the plist in nalloc. Otherwise
+    the routine will encode the plist in buf.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P__encode(const H5P_genplist_t *plist, hbool_t enc_all_prop, void *buf,
+    size_t *nalloc)
+{
+    H5P_enc_iter_ud_t udata;        /* User data for property iteration callback */
+    uint8_t *p = (uint8_t *)buf;    /* Temporary pointer to encoding buffer */
+    int idx;                        /* Index of property to start at */
+    size_t encode_size = 0;         /* Size of buffer needed to encode properties */
+    hbool_t encode = TRUE;          /* Whether the property list should be encoded */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    if(NULL == nalloc)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "bad allocation size pointer")
+
+    /* If the buffer is NULL, then this call to H5P__encode will return how much
+     * space is needed to encode a property.
+     */
+    if(NULL == p)
+        encode = FALSE;
+
+    /* Encode property list description info */
+    if(encode) {
+        /* Version # of property list encoding */
+        *p++ = (uint8_t)H5P_ENCODE_VERS;
+
+        /* Type of property list */
+        *p++ = (uint8_t)plist->pclass->type;
+    } /* end if */
+    encode_size += 2;
+
+    /* Initialize user data for iteration callback */
+    udata.encode = encode;
+    udata.enc_size_ptr = &encode_size;
+    udata.pp = (void **)&p;
+
+    /* Iterate over all properties in property list, encoding them */
+    idx = 0;
+    if(H5P_iterate_plist(plist, enc_all_prop, &idx, H5P__encode_cb, &udata) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADITER, FAIL, "can't iterate over properties")
+
+    /* Encode a terminator for list of properties */
+    if(encode)
+        *p++ = 0;
+    encode_size++;
+
+    /* Set the size of the buffer needed/used to encode the property list */
+    *nalloc = encode_size;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__encode() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__decode_size_t
+ *
+ * Purpose:        Generic decoding callback routine for 'size_t' properties.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Thursday, August 2, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P__decode_size_t(const void **_pp, void *_value)
+{
+    size_t *value = (size_t *)_value;   /* Property value to return */
+    const uint8_t **pp = (const uint8_t **)_pp;
+    uint64_t enc_value;                 /* Decoded property value */
+    unsigned enc_size;                  /* Size of encoded property */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity check */
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(value);
+
+    /* Decode the size */
+    enc_size = *(*pp)++;
+    HDassert(enc_size < 256);
+
+    /* Decode the value */
+    UINT64DECODE_VAR(*pp, enc_value, enc_size);
+    H5_CHECKED_ASSIGN(*value, size_t, enc_value, uint64_t);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__decode_size_t() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__decode_hsize_t
+ *
+ * Purpose:        Generic decoding callback routine for 'hsize_t' properties.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 August 07, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P__decode_hsize_t(const void **_pp, void *_value)
+{
+    hsize_t *value = (hsize_t *)_value; /* Property value to return */
+    const uint8_t **pp = (const uint8_t **)_pp;
+    uint64_t enc_value;                 /* Decoded property value */
+    unsigned enc_size;                  /* Size of encoded property */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity check */
+    HDcompile_assert(sizeof(hsize_t) <= sizeof(uint64_t));
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(value);
+
+    /* Decode the size */
+    enc_size = *(*pp)++;
+    HDassert(enc_size < 256);
+
+    /* Decode the value */
+    UINT64DECODE_VAR(*pp, enc_value, enc_size);
+    H5_CHECKED_ASSIGN(*value, hsize_t, enc_value, uint64_t);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__decode_hsize_t() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__decode_unsigned
+ *
+ * Purpose:        Generic decoding callback routine for 'unsigned' properties.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Thursday, August 2, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P__decode_unsigned(const void **_pp, void *_value)
+{
+    unsigned *value = (unsigned *)_value; /* Property value to return */
+    const uint8_t **pp = (const uint8_t **)_pp;
+    unsigned enc_size;          /* Size of encoded property */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(value);
+
+    /* Decode the size */
+    enc_size = *(*pp)++;
+    if(enc_size != sizeof(unsigned))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "unsigned value can't be decoded")
+
+    H5_DECODE_UNSIGNED(*pp, *value)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__decode_unsigned() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__decode_uint8_t
+ *
+ * Purpose:        Generic decoding callback routine for 'uint8_t' properties.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Thursday, August 2, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P__decode_uint8_t(const void **_pp, void *_value)
+{
+    uint8_t *value = (uint8_t *)_value; /* Property value to return */
+    const uint8_t **pp = (const uint8_t **)_pp;
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(value);
+
+    /* Decode the value */
+    *value = *(*pp)++;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__decode_uint8_t() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__decode_hbool_t
+ *
+ * Purpose:        Generic decoding callback routine for 'hbool_t' properties.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Wednesday, August 15, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P__decode_hbool_t(const void **_pp, void *_value)
+{
+    hbool_t *value = (hbool_t *)_value; /* Property value to return */
+    const uint8_t **pp = (const uint8_t **)_pp;
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(value);
+
+    /* Decode the value */
+    *value = (hbool_t)*(*pp)++;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__decode_hbool_t() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__decode_double
+ *
+ * Purpose:        Generic decoding callback routine for 'double' properties.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Thursday, August 2, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5P__decode_double(const void **_pp, void *_value)
+{
+    double *value = (double *)_value; /* Property value to return */
+    const uint8_t **pp = (const uint8_t **)_pp;
+    unsigned enc_size;          /* Size of encoded property */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(value);
+
+    /* Decode the size */
+    enc_size = *(*pp)++;
+    if(enc_size != sizeof(double))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "double value can't be decoded")
+
+    H5_DECODE_DOUBLE(*pp, *value)
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__decode_double() */
+
+

+/*-------------------------------------------------------------------------
+ NAME
+    H5P__decode
+ PURPOSE
+    Internal routine to decode a property list from a binary buffer.
+ USAGE
+    H5P_genplist_t *H5P__decode(buf)
+        const void *buf;    IN: buffer that holds the encoded plist
+ RETURNS
+    Returns non-negative ID of new property list object on success, negative
+        on failure.
+ DESCRIPTION
+     Decodes a property list from a binary buffer. The contents of the buffer
+     contain the values for the correponding properties of the plist. The decode 
+     callback of a certain property decodes its value from the buffer and sets it
+     in the property list.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+     Properties in the property list that are not encoded in the serialized
+     form retain their default value.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hid_t
+H5P__decode(const void *buf)
+{
+    H5P_genplist_t *plist;      /* Property list to decode into */
+    void *value_buf = NULL;     /* Pointer to buffer to use when decoding values */
+    const uint8_t *p = (const uint8_t *)buf;     /* Current pointer into buffer */
+    H5P_plist_type_t type;      /* Type of encoded property list */
+    hid_t plist_id = -1;        /* ID of new property list */
+    size_t value_buf_size = 0;  /* Size of current value buffer */
+    uint8_t vers;               /* Version of encoded property list */
+    hid_t ret_value = H5I_INVALID_HID;  /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity check */
+    if(NULL == p)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "decode buffer is NULL")
+
+    /* Get the version number of the encoded property list */
+    vers = (uint8_t)*p++;
+    if((uint8_t)H5P_ENCODE_VERS != vers)
+        HGOTO_ERROR(H5E_PLIST, H5E_VERSION, FAIL, "bad version # of encoded information, expected %u, got %u", (unsigned)H5P_ENCODE_VERS, (unsigned)vers)
+
+    /* Get the type of the property list */
+    type = (H5P_plist_type_t)*p++;
+    if(type <= H5P_TYPE_USER || type > H5P_TYPE_LINK_ACCESS)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADRANGE, FAIL, "bad type of encoded information: %u", (unsigned)type)
+
+    /* Create new property list of the specified type */
+    if((plist_id = H5P__new_plist_of_type(type)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_VERSION, FAIL, "can't create property list of type: %u\n", (unsigned)type);
+
+    /* Get the property list object */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(plist_id)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a property class")
+
+    /* Loop over encoded properties, deserializing their values */
+    while(p) {
+        H5P_genprop_t *prop;    /* Pointer to property with same name */
+        const char *name;       /* Pointer to property list name */
+
+        /* Check for end of serialized list of properties */
+        if(0 == *p)
+            break;
+
+        /* Get property list name */
+        name = (const char *)p;
+        p += HDstrlen(name) + 1;
+
+        /* Find property with name */
+        if(NULL == (prop = H5P__find_prop_plist(plist, name)))
+            HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "property doesn't exist: '%s'", name)
+
+        /* Check if we should increase the size of the value buffer */
+        if(prop->size > value_buf_size) {
+            if(NULL == (value_buf = H5MM_realloc(value_buf, prop->size)))
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "decoding buffer allocation failed")
+            value_buf_size = prop->size;
+        } /* end if */
+
+        /* Decode serialized value */
+        if(prop->decode) {
+            if((prop->decode)((const void **)&p, value_buf) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTDECODE, FAIL, "property decoding routine failed, property: '%s'", name)
+        } /* end if */
+        else
+            HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "no decode callback for property: '%s'", name)
+
+        /* Set the value for the property */
+        if(H5P_poke(plist, name, value_buf) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value for property: '%s'", name)
+    } /* end while */
+
+    /* Set return value */
+    ret_value = plist_id;
+
+done:
+    /* Release resources */
+    if(value_buf)
+        value_buf = H5MM_xfree(value_buf);
+
+    /* Cleanup on error */
+    if(ret_value < 0) {
+        if(plist_id > 0 && H5I_dec_ref(plist_id) < 0)
+            HDONE_ERROR(H5E_PLIST, H5E_CANTCLOSEOBJ, FAIL, "unable to close partially initialized property list")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__decode() */
+
diff --git a/src/H5Pfapl.c b/src/H5Pfapl.c
index 3c9dcc4..40a529b 100644
--- a/src/H5Pfapl.c
+++ b/src/H5Pfapl.c
@@ -27,7 +27,8 @@
 /****************/
 /* Module Setup */
 /****************/
-#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+#include "H5Pmodule.h"          /* This source code file is part of the H5P module */
 
 
 /***********/
@@ -59,48 +60,77 @@
 /* Definitions for the initial metadata cache resize configuration */
 #define H5F_ACS_META_CACHE_INIT_CONFIG_SIZE	sizeof(H5AC_cache_config_t)
 #define H5F_ACS_META_CACHE_INIT_CONFIG_DEF	H5AC__DEFAULT_CACHE_CONFIG
+#define H5F_ACS_META_CACHE_INIT_CONFIG_ENC	H5P__facc_cache_config_enc
+#define H5F_ACS_META_CACHE_INIT_CONFIG_DEC	H5P__facc_cache_config_dec
+#define H5F_ACS_META_CACHE_INIT_CONFIG_CMP      H5P__facc_cache_config_cmp
 /* Definitions for size of raw data chunk cache(slots) */
 #define H5F_ACS_DATA_CACHE_NUM_SLOTS_SIZE       sizeof(size_t)
 #define H5F_ACS_DATA_CACHE_NUM_SLOTS_DEF        521
+#define H5F_ACS_DATA_CACHE_NUM_SLOTS_ENC        H5P__encode_size_t
+#define H5F_ACS_DATA_CACHE_NUM_SLOTS_DEC        H5P__decode_size_t
 /* Definition for size of raw data chunk cache(bytes) */
 #define H5F_ACS_DATA_CACHE_BYTE_SIZE_SIZE       sizeof(size_t)
 #define H5F_ACS_DATA_CACHE_BYTE_SIZE_DEF        (1024*1024)
+#define H5F_ACS_DATA_CACHE_BYTE_SIZE_ENC        H5P__encode_size_t
+#define H5F_ACS_DATA_CACHE_BYTE_SIZE_DEC        H5P__decode_size_t
 /* Definition for preemption read chunks first */
 #define H5F_ACS_PREEMPT_READ_CHUNKS_SIZE        sizeof(double)
 #define H5F_ACS_PREEMPT_READ_CHUNKS_DEF         0.75f
+#define H5F_ACS_PREEMPT_READ_CHUNKS_ENC         H5P__encode_double
+#define H5F_ACS_PREEMPT_READ_CHUNKS_DEC         H5P__decode_double
 /* Definition for threshold for alignment */
 #define H5F_ACS_ALIGN_THRHD_SIZE                sizeof(hsize_t)
 #define H5F_ACS_ALIGN_THRHD_DEF                 1
+#define H5F_ACS_ALIGN_THRHD_ENC                 H5P__encode_hsize_t
+#define H5F_ACS_ALIGN_THRHD_DEC                 H5P__decode_hsize_t
 /* Definition for alignment */
 #define H5F_ACS_ALIGN_SIZE                      sizeof(hsize_t)
 #define H5F_ACS_ALIGN_DEF                       1
+#define H5F_ACS_ALIGN_ENC                       H5P__encode_hsize_t
+#define H5F_ACS_ALIGN_DEC                       H5P__decode_hsize_t
 /* Definition for minimum metadata allocation block size (when
    aggregating metadata allocations. */
 #define H5F_ACS_META_BLOCK_SIZE_SIZE            sizeof(hsize_t)
 #define H5F_ACS_META_BLOCK_SIZE_DEF             2048
+#define H5F_ACS_META_BLOCK_SIZE_ENC             H5P__encode_hsize_t
+#define H5F_ACS_META_BLOCK_SIZE_DEC             H5P__decode_hsize_t
 /* Definition for maximum sieve buffer size (when data sieving
    is allowed by file driver */
 #define H5F_ACS_SIEVE_BUF_SIZE_SIZE             sizeof(size_t)
 #define H5F_ACS_SIEVE_BUF_SIZE_DEF              (64*1024)
+#define H5F_ACS_SIEVE_BUF_SIZE_ENC              H5P__encode_size_t
+#define H5F_ACS_SIEVE_BUF_SIZE_DEC              H5P__decode_size_t
 /* Definition for minimum "small data" allocation block size (when
    aggregating "small" raw data allocations. */
 #define H5F_ACS_SDATA_BLOCK_SIZE_SIZE           sizeof(hsize_t)
 #define H5F_ACS_SDATA_BLOCK_SIZE_DEF            2048
+#define H5F_ACS_SDATA_BLOCK_SIZE_ENC            H5P__encode_hsize_t
+#define H5F_ACS_SDATA_BLOCK_SIZE_DEC            H5P__decode_hsize_t
 /* Definition for garbage-collect references */
 #define H5F_ACS_GARBG_COLCT_REF_SIZE            sizeof(unsigned)
 #define H5F_ACS_GARBG_COLCT_REF_DEF             0
-/* Definition for file driver ID */
-#define H5F_ACS_FILE_DRV_ID_SIZE                sizeof(hid_t)
-#define H5F_ACS_FILE_DRV_ID_DEF                 H5_DEFAULT_VFD
-/* Definition for file driver info */
-#define H5F_ACS_FILE_DRV_INFO_SIZE              sizeof(void*)
-#define H5F_ACS_FILE_DRV_INFO_DEF               NULL
+#define H5F_ACS_GARBG_COLCT_REF_ENC             H5P__encode_unsigned
+#define H5F_ACS_GARBG_COLCT_REF_DEC             H5P__decode_unsigned
+/* Definition for file driver ID & info*/
+#define H5F_ACS_FILE_DRV_SIZE                   sizeof(H5FD_driver_prop_t)
+#define H5F_ACS_FILE_DRV_DEF                    {H5_DEFAULT_VFD, NULL}
+#define H5F_ACS_FILE_DRV_CRT                    H5P__facc_file_driver_create
+#define H5F_ACS_FILE_DRV_SET                    H5P__facc_file_driver_set
+#define H5F_ACS_FILE_DRV_GET                    H5P__facc_file_driver_get
+#define H5F_ACS_FILE_DRV_DEL                    H5P__facc_file_driver_del
+#define H5F_ACS_FILE_DRV_COPY                   H5P__facc_file_driver_copy
+#define H5F_ACS_FILE_DRV_CMP                    H5P__facc_file_driver_cmp
+#define H5F_ACS_FILE_DRV_CLOSE                  H5P__facc_file_driver_close
 /* Definition for file close degree */
 #define H5F_CLOSE_DEGREE_SIZE		        sizeof(H5F_close_degree_t)
 #define H5F_CLOSE_DEGREE_DEF		        H5F_CLOSE_DEFAULT
+#define H5F_CLOSE_DEGREE_ENC		        H5P__facc_fclose_degree_enc
+#define H5F_CLOSE_DEGREE_DEC		        H5P__facc_fclose_degree_dec
 /* Definition for offset position in file for family file driver */
 #define H5F_ACS_FAMILY_OFFSET_SIZE              sizeof(hsize_t)
 #define H5F_ACS_FAMILY_OFFSET_DEF               0
+#define H5F_ACS_FAMILY_OFFSET_ENC               H5P__encode_hsize_t
+#define H5F_ACS_FAMILY_OFFSET_DEC               H5P__decode_hsize_t
 /* Definition for new member size of family driver. It's private
  * property only used by h5repart */
 #define H5F_ACS_FAMILY_NEWSIZE_SIZE             sizeof(hsize_t)
@@ -112,9 +142,13 @@
 /* Definition for data type in multi file driver */
 #define H5F_ACS_MULTI_TYPE_SIZE                 sizeof(H5FD_mem_t)
 #define H5F_ACS_MULTI_TYPE_DEF                  H5FD_MEM_DEFAULT
+#define H5F_ACS_MULTI_TYPE_ENC                  H5P__facc_multi_type_enc
+#define H5F_ACS_MULTI_TYPE_DEC                  H5P__facc_multi_type_dec
 /* Definition for 'use latest format version' flag */
 #define H5F_ACS_LATEST_FORMAT_SIZE              sizeof(hbool_t)
 #define H5F_ACS_LATEST_FORMAT_DEF               FALSE
+#define H5F_ACS_LATEST_FORMAT_ENC               H5P__encode_hbool_t
+#define H5F_ACS_LATEST_FORMAT_DEC               H5P__decode_hbool_t
 /* Definition for whether to query the file descriptor from the core VFD
  * instead of the memory address.  (Private to library)
  */
@@ -123,18 +157,58 @@
 /* Definition for external file cache size */
 #define H5F_ACS_EFC_SIZE_SIZE                   sizeof(unsigned)
 #define H5F_ACS_EFC_SIZE_DEF                    0
+#define H5F_ACS_EFC_SIZE_ENC                    H5P__encode_unsigned
+#define H5F_ACS_EFC_SIZE_DEC                    H5P__decode_unsigned
 /* Definition of pointer to initial file image info */
 #define H5F_ACS_FILE_IMAGE_INFO_SIZE            sizeof(H5FD_file_image_info_t)
 #define H5F_ACS_FILE_IMAGE_INFO_DEF             H5FD_DEFAULT_FILE_IMAGE_INFO
-#define H5F_ACS_FILE_IMAGE_INFO_DEL             H5P_file_image_info_del
-#define H5F_ACS_FILE_IMAGE_INFO_COPY            H5P_file_image_info_copy
-#define H5F_ACS_FILE_IMAGE_INFO_CLOSE           H5P_file_image_info_close
+#define H5F_ACS_FILE_IMAGE_INFO_SET             H5P__facc_file_image_info_set
+#define H5F_ACS_FILE_IMAGE_INFO_GET             H5P__facc_file_image_info_get
+#define H5F_ACS_FILE_IMAGE_INFO_DEL             H5P__facc_file_image_info_del
+#define H5F_ACS_FILE_IMAGE_INFO_COPY            H5P__facc_file_image_info_copy
+#define H5F_ACS_FILE_IMAGE_INFO_CMP             H5P__facc_file_image_info_cmp
+#define H5F_ACS_FILE_IMAGE_INFO_CLOSE           H5P__facc_file_image_info_close
 /* Definition of core VFD write tracking flag */
 #define H5F_ACS_CORE_WRITE_TRACKING_FLAG_SIZE   sizeof(hbool_t)
 #define H5F_ACS_CORE_WRITE_TRACKING_FLAG_DEF    FALSE
+#define H5F_ACS_CORE_WRITE_TRACKING_FLAG_ENC    H5P__encode_hbool_t
+#define H5F_ACS_CORE_WRITE_TRACKING_FLAG_DEC    H5P__decode_hbool_t
 /* Definition of core VFD write tracking page size */
 #define H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_SIZE      sizeof(size_t)
 #define H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_DEF       524288
+#define H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_ENC       H5P__encode_size_t
+#define H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_DEC       H5P__decode_size_t
+/* Definition for # of metadata read attempts */
+#define H5F_ACS_METADATA_READ_ATTEMPTS_SIZE	sizeof(unsigned)
+#define H5F_ACS_METADATA_READ_ATTEMPTS_DEF     	0
+#define H5F_ACS_METADATA_READ_ATTEMPTS_ENC     	H5P__encode_unsigned
+#define H5F_ACS_METADATA_READ_ATTEMPTS_DEC     	H5P__decode_unsigned
+/* Definition for object flush callback */
+#define H5F_ACS_OBJECT_FLUSH_CB_SIZE		sizeof(H5F_object_flush_t)
+#define H5F_ACS_OBJECT_FLUSH_CB_DEF             {NULL, NULL}
+/* Definition for status_flags in the superblock */
+#define H5F_ACS_CLEAR_STATUS_FLAGS_SIZE         sizeof(hbool_t)
+#define H5F_ACS_CLEAR_STATUS_FLAGS_DEF          FALSE
+/* Definition for 'use metadata cache logging' flag */
+#define H5F_ACS_USE_MDC_LOGGING_SIZE            sizeof(hbool_t)
+#define H5F_ACS_USE_MDC_LOGGING_DEF             FALSE
+#define H5F_ACS_USE_MDC_LOGGING_ENC             H5P__encode_hbool_t
+#define H5F_ACS_USE_MDC_LOGGING_DEC             H5P__decode_hbool_t
+/* Definition for 'mdc log location' flag */
+#define H5F_ACS_MDC_LOG_LOCATION_SIZE           sizeof(char *)
+#define H5F_ACS_MDC_LOG_LOCATION_DEF            NULL /* default is no log location */
+#define H5F_ACS_MDC_LOG_LOCATION_ENC            H5P_facc_mdc_log_location_enc
+#define H5F_ACS_MDC_LOG_LOCATION_DEC            H5P_facc_mdc_log_location_dec
+#define H5F_ACS_MDC_LOG_LOCATION_DEL            H5P_facc_mdc_log_location_del
+#define H5F_ACS_MDC_LOG_LOCATION_COPY           H5P_facc_mdc_log_location_copy
+#define H5F_ACS_MDC_LOG_LOCATION_CMP            H5P_facc_mdc_log_location_cmp
+#define H5F_ACS_MDC_LOG_LOCATION_CLOSE          H5P_facc_mdc_log_location_close
+/* Definition for 'start metadata cache logging on access' flag */
+#define H5F_ACS_START_MDC_LOG_ON_ACCESS_SIZE    sizeof(hbool_t)
+#define H5F_ACS_START_MDC_LOG_ON_ACCESS_DEF     FALSE
+#define H5F_ACS_START_MDC_LOG_ON_ACCESS_ENC     H5P__encode_hbool_t
+#define H5F_ACS_START_MDC_LOG_ON_ACCESS_DEC     H5P__decode_hbool_t
+
 
 /******************/
 /* Local Typedefs */
@@ -151,14 +225,43 @@
 /********************/
 
 /* Property class callbacks */
-static herr_t H5P_facc_reg_prop(H5P_genclass_t *pclass);
-static herr_t H5P_facc_create(hid_t fapl_id, void *copy_data);
-static herr_t H5P_facc_copy(hid_t new_plist_t, hid_t old_plist_t, void *copy_data);
+static herr_t H5P__facc_reg_prop(H5P_genclass_t *pclass);
+
+/* File driver ID & info property callbacks */
+static herr_t H5P__facc_file_driver_create(const char *name, size_t size, void *value);
+static herr_t H5P__facc_file_driver_set(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__facc_file_driver_get(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__facc_file_driver_del(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__facc_file_driver_copy(const char *name, size_t size, void *value);
+static int H5P__facc_file_driver_cmp(const void *value1, const void *value2, size_t size);
+static herr_t H5P__facc_file_driver_close(const char *name, size_t size, void *value);
 
 /* File image info property callbacks */
-static herr_t H5P_file_image_info_del(hid_t prop_id, const char *name, size_t size, void *value);
-static herr_t H5P_file_image_info_copy(const char *name, size_t size, void *value);
-static herr_t H5P_file_image_info_close(const char *name, size_t size, void *value);
+static herr_t H5P__file_image_info_copy(void *value);
+static herr_t H5P__file_image_info_free(void *value);
+static herr_t H5P__facc_file_image_info_set(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__facc_file_image_info_get(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__facc_file_image_info_del(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__facc_file_image_info_copy(const char *name, size_t size, void *value);
+static int H5P__facc_file_image_info_cmp(const void *value1, const void *value2, size_t size);
+static herr_t H5P__facc_file_image_info_close(const char *name, size_t size, void *value);
+
+/* encode & decode callbacks */
+static herr_t H5P__facc_cache_config_enc(const void *value, void **_pp, size_t *size);
+static herr_t H5P__facc_cache_config_dec(const void **_pp, void *value);
+static int H5P__facc_cache_config_cmp(const void *value1, const void *value2, size_t size);
+static herr_t H5P__facc_fclose_degree_enc(const void *value, void **_pp, size_t *size);
+static herr_t H5P__facc_fclose_degree_dec(const void **pp, void *value);
+static herr_t H5P__facc_multi_type_enc(const void *value, void **_pp, size_t *size);
+static herr_t H5P__facc_multi_type_dec(const void **_pp, void *value);
+
+/* Metadata cache log location property callbacks */
+static herr_t H5P_facc_mdc_log_location_enc(const void *value, void **_pp, size_t *size);
+static herr_t H5P_facc_mdc_log_location_dec(const void **_pp, void *value);
+static herr_t H5P_facc_mdc_log_location_del(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P_facc_mdc_log_location_copy(const char *name, size_t size, void *value);
+static int    H5P_facc_mdc_log_location_cmp(const void *value1, const void *value2, size_t size);
+static herr_t H5P_facc_mdc_log_location_close(const char *name, size_t size, void *value);
 
 
 /*********************/
@@ -174,13 +277,13 @@ const H5P_libclass_t H5P_CLS_FACC[1] = {{
     &H5P_CLS_FILE_ACCESS_g,	/* Pointer to class             */
     &H5P_CLS_FILE_ACCESS_ID_g,	/* Pointer to class ID          */
     &H5P_LST_FILE_ACCESS_ID_g,	/* Pointer to default property list ID */
-    H5P_facc_reg_prop,		/* Default property registration routine */
+    H5P__facc_reg_prop,		/* Default property registration routine */
 
-    H5P_facc_create,		/* Class creation callback      */
+    NULL,			/* Class creation callback      */
     NULL,		        /* Class creation callback info */
-    H5P_facc_copy,		/* Class copy callback          */
+    NULL,			/* Class copy callback          */
     NULL,		        /* Class copy callback info     */
-    H5P_facc_close,		/* Class close callback         */
+    NULL,			/* Class close callback         */
     NULL 		        /* Class close callback info    */
 }};
 
@@ -194,9 +297,39 @@ const H5P_libclass_t H5P_CLS_FACC[1] = {{
 /* Local Variables */
 /*******************/
 
+/* Property value defaults */
+static const H5AC_cache_config_t H5F_def_mdc_initCacheCfg_g = H5F_ACS_META_CACHE_INIT_CONFIG_DEF;  /* Default metadata cache settings */
+static const size_t H5F_def_rdcc_nslots_g = H5F_ACS_DATA_CACHE_NUM_SLOTS_DEF;      /* Default raw data chunk cache # of slots */
+static const size_t H5F_def_rdcc_nbytes_g = H5F_ACS_DATA_CACHE_BYTE_SIZE_DEF;      /* Default raw data chunk cache # of bytes */
+static const double H5F_def_rdcc_w0_g = H5F_ACS_PREEMPT_READ_CHUNKS_DEF;           /* Default raw data chunk cache dirty ratio */
+static const hsize_t H5F_def_threshold_g = H5F_ACS_ALIGN_THRHD_DEF;                /* Default allocation alignment threshold */
+static const hsize_t H5F_def_alignment_g = H5F_ACS_ALIGN_DEF;                      /* Default allocation alignment value */
+static const hsize_t H5F_def_meta_block_size_g = H5F_ACS_META_BLOCK_SIZE_DEF;      /* Default metadata allocation block size */
+static const size_t H5F_def_sieve_buf_size_g = H5F_ACS_SIEVE_BUF_SIZE_DEF;         /* Default raw data I/O sieve buffer size */
+static const hsize_t H5F_def_sdata_block_size_g = H5F_ACS_SDATA_BLOCK_SIZE_DEF;    /* Default small data allocation block size */
+static const unsigned H5F_def_gc_ref_g = H5F_ACS_GARBG_COLCT_REF_DEF;              /* Default garbage collection for references setting */
+static const H5F_close_degree_t H5F_def_close_degree_g = H5F_CLOSE_DEGREE_DEF;     /* Default file close degree */
+static const hsize_t H5F_def_family_offset_g = H5F_ACS_FAMILY_OFFSET_DEF;          /* Default offset for family VFD */
+static const hsize_t H5F_def_family_newsize_g = H5F_ACS_FAMILY_NEWSIZE_DEF;        /* Default size of new files for family VFD */
+static const hbool_t H5F_def_family_to_sec2_g = H5F_ACS_FAMILY_TO_SEC2_DEF;        /* Default ?? for family VFD */
+static const H5FD_mem_t H5F_def_mem_type_g = H5F_ACS_MULTI_TYPE_DEF;               /* Default file space type for multi VFD */
+static const hbool_t H5F_def_latest_format_g = H5F_ACS_LATEST_FORMAT_DEF;          /* Default setting for "use the latest version of the format" flag */
+static const hbool_t H5F_def_want_posix_fd_g = H5F_ACS_WANT_POSIX_FD_DEF;          /* Default setting for retrieving 'handle' from core VFD */
+static const unsigned H5F_def_efc_size_g = H5F_ACS_EFC_SIZE_DEF;                   /* Default external file cache size */
+static const H5FD_file_image_info_t H5F_def_file_image_info_g = H5F_ACS_FILE_IMAGE_INFO_DEF;                 /* Default file image info and callbacks */
+static const hbool_t H5F_def_core_write_tracking_flag_g = H5F_ACS_CORE_WRITE_TRACKING_FLAG_DEF;              /* Default setting for core VFD write tracking */
+static const size_t H5F_def_core_write_tracking_page_size_g = H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_DEF;     /* Default core VFD write tracking page size */
+static const unsigned H5F_def_metadata_read_attempts_g = H5F_ACS_METADATA_READ_ATTEMPTS_DEF;  /* Default setting for the # of metadata read attempts */
+static const H5F_object_flush_t H5F_def_object_flush_cb_g = H5F_ACS_OBJECT_FLUSH_CB_DEF;      /* Default setting for object flush callback */
+static const hbool_t H5F_def_clear_status_flags_g = H5F_ACS_CLEAR_STATUS_FLAGS_DEF;           /* Default to clear the superblock status_flags */
+static const hbool_t H5F_def_use_mdc_logging_g = H5F_ACS_USE_MDC_LOGGING_DEF;                 /* Default metadata cache logging flag */
+static const char *H5F_def_mdc_log_location_g = H5F_ACS_MDC_LOG_LOCATION_DEF;                 /* Default mdc log location */
+static const hbool_t H5F_def_start_mdc_log_on_access_g = H5F_ACS_START_MDC_LOG_ON_ACCESS_DEF; /* Default mdc log start on access flag */
+
+
 

 /*-------------------------------------------------------------------------
- * Function:    H5P_facc_reg_prop
+ * Function:    H5P__facc_reg_prop
  *
  * Purpose:     Register the file access property list class's properties
  *
@@ -207,285 +340,184 @@ const H5P_libclass_t H5P_CLS_FACC[1] = {{
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5P_facc_reg_prop(H5P_genclass_t *pclass)
-{
-    H5AC_cache_config_t mdc_initCacheCfg = H5F_ACS_META_CACHE_INIT_CONFIG_DEF;  /* Default metadata cache settings */
-    size_t rdcc_nslots = H5F_ACS_DATA_CACHE_NUM_SLOTS_DEF;      /* Default raw data chunk cache # of slots */
-    size_t rdcc_nbytes = H5F_ACS_DATA_CACHE_BYTE_SIZE_DEF;      /* Default raw data chunk cache # of bytes */
-    double rdcc_w0 = H5F_ACS_PREEMPT_READ_CHUNKS_DEF;           /* Default raw data chunk cache dirty ratio */
-    hsize_t threshold = H5F_ACS_ALIGN_THRHD_DEF;                /* Default allocation alignment threshold */
-    hsize_t alignment = H5F_ACS_ALIGN_DEF;                      /* Default allocation alignment value */
-    hsize_t meta_block_size = H5F_ACS_META_BLOCK_SIZE_DEF;      /* Default metadata allocation block size */
-    size_t sieve_buf_size = H5F_ACS_SIEVE_BUF_SIZE_DEF;         /* Default raw data I/O sieve buffer size */
-    hsize_t sdata_block_size = H5F_ACS_SDATA_BLOCK_SIZE_DEF;    /* Default small data allocation block size */
-    unsigned gc_ref = H5F_ACS_GARBG_COLCT_REF_DEF;              /* Default garbage collection for references setting */
-    hid_t driver_id = H5F_ACS_FILE_DRV_ID_DEF;                  /* Default VFL driver ID */
-    void *driver_info = H5F_ACS_FILE_DRV_INFO_DEF;              /* Default VFL driver info */
-    H5F_close_degree_t close_degree = H5F_CLOSE_DEGREE_DEF;     /* Default file close degree */
-    hsize_t family_offset = H5F_ACS_FAMILY_OFFSET_DEF;          /* Default offset for family VFD */
-    hsize_t family_newsize = H5F_ACS_FAMILY_NEWSIZE_DEF;        /* Default size of new files for family VFD */
-    hbool_t family_to_sec2 = H5F_ACS_FAMILY_TO_SEC2_DEF;        /* Default ?? for family VFD */
-    H5FD_mem_t mem_type = H5F_ACS_MULTI_TYPE_DEF;               /* Default file space type for multi VFD */
-    hbool_t latest_format = H5F_ACS_LATEST_FORMAT_DEF;          /* Default setting for "use the latest version of the format" flag */
-    hbool_t want_posix_fd = H5F_ACS_WANT_POSIX_FD_DEF;          /* Default setting for retrieving 'handle' from core VFD */
-    unsigned efc_size = H5F_ACS_EFC_SIZE_DEF;                   /* Default external file cache size */
-    H5FD_file_image_info_t file_image_info = H5F_ACS_FILE_IMAGE_INFO_DEF;  /* Default file image info and callbacks */
-    hbool_t core_write_tracking_flag = H5F_ACS_CORE_WRITE_TRACKING_FLAG_DEF;              /* Default setting for core VFD write tracking */
-    size_t core_write_tracking_page_size = H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_DEF;     /* Default core VFD write tracking page size */
+H5P__facc_reg_prop(H5P_genclass_t *pclass)
+{
+    const H5FD_driver_prop_t def_driver_prop = H5F_ACS_FILE_DRV_DEF;           /* Default VFL driver ID & info (initialized from a variable) */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Register the initial metadata cache resize configuration */
-    if(H5P_register_real(pclass, H5F_ACS_META_CACHE_INIT_CONFIG_NAME, H5F_ACS_META_CACHE_INIT_CONFIG_SIZE, &mdc_initCacheCfg, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_ACS_META_CACHE_INIT_CONFIG_NAME, H5F_ACS_META_CACHE_INIT_CONFIG_SIZE, &H5F_def_mdc_initCacheCfg_g, 
+            NULL, NULL, NULL, H5F_ACS_META_CACHE_INIT_CONFIG_ENC, H5F_ACS_META_CACHE_INIT_CONFIG_DEC, 
+            NULL, NULL, H5F_ACS_META_CACHE_INIT_CONFIG_CMP, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the size of raw data chunk cache (elements) */
-    if(H5P_register_real(pclass, H5F_ACS_DATA_CACHE_NUM_SLOTS_NAME, H5F_ACS_DATA_CACHE_NUM_SLOTS_SIZE, &rdcc_nslots, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_ACS_DATA_CACHE_NUM_SLOTS_NAME, H5F_ACS_DATA_CACHE_NUM_SLOTS_SIZE, &H5F_def_rdcc_nslots_g, 
+            NULL, NULL, NULL, H5F_ACS_DATA_CACHE_NUM_SLOTS_ENC, H5F_ACS_DATA_CACHE_NUM_SLOTS_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the size of raw data chunk cache(bytes) */
-    if(H5P_register_real(pclass, H5F_ACS_DATA_CACHE_BYTE_SIZE_NAME, H5F_ACS_DATA_CACHE_BYTE_SIZE_SIZE, &rdcc_nbytes, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_ACS_DATA_CACHE_BYTE_SIZE_NAME, H5F_ACS_DATA_CACHE_BYTE_SIZE_SIZE, &H5F_def_rdcc_nbytes_g, 
+            NULL, NULL, NULL, H5F_ACS_DATA_CACHE_BYTE_SIZE_ENC, H5F_ACS_DATA_CACHE_BYTE_SIZE_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the preemption for reading chunks */
-    if(H5P_register_real(pclass, H5F_ACS_PREEMPT_READ_CHUNKS_NAME, H5F_ACS_PREEMPT_READ_CHUNKS_SIZE, &rdcc_w0, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_ACS_PREEMPT_READ_CHUNKS_NAME, H5F_ACS_PREEMPT_READ_CHUNKS_SIZE, &H5F_def_rdcc_w0_g, 
+            NULL, NULL, NULL, H5F_ACS_PREEMPT_READ_CHUNKS_ENC, H5F_ACS_PREEMPT_READ_CHUNKS_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the threshold for alignment */
-    if(H5P_register_real(pclass, H5F_ACS_ALIGN_THRHD_NAME, H5F_ACS_ALIGN_THRHD_SIZE, &threshold, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_ACS_ALIGN_THRHD_NAME, H5F_ACS_ALIGN_THRHD_SIZE, &H5F_def_threshold_g, 
+            NULL, NULL, NULL, H5F_ACS_ALIGN_THRHD_ENC, H5F_ACS_ALIGN_THRHD_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the alignment */
-    if(H5P_register_real(pclass, H5F_ACS_ALIGN_NAME, H5F_ACS_ALIGN_SIZE, &alignment, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_ACS_ALIGN_NAME, H5F_ACS_ALIGN_SIZE, &H5F_def_alignment_g, 
+            NULL, NULL, NULL, H5F_ACS_ALIGN_ENC, H5F_ACS_ALIGN_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the minimum metadata allocation block size */
-    if(H5P_register_real(pclass, H5F_ACS_META_BLOCK_SIZE_NAME, H5F_ACS_META_BLOCK_SIZE_SIZE, &meta_block_size, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_ACS_META_BLOCK_SIZE_NAME, H5F_ACS_META_BLOCK_SIZE_SIZE, &H5F_def_meta_block_size_g, 
+            NULL, NULL, NULL, H5F_ACS_META_BLOCK_SIZE_ENC, H5F_ACS_META_BLOCK_SIZE_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the maximum sieve buffer size */
-    if(H5P_register_real(pclass, H5F_ACS_SIEVE_BUF_SIZE_NAME, H5F_ACS_SIEVE_BUF_SIZE_SIZE, &sieve_buf_size, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_ACS_SIEVE_BUF_SIZE_NAME, H5F_ACS_SIEVE_BUF_SIZE_SIZE, &H5F_def_sieve_buf_size_g, 
+            NULL, NULL, NULL, H5F_ACS_SIEVE_BUF_SIZE_ENC, H5F_ACS_SIEVE_BUF_SIZE_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the minimum "small data" allocation block size */
-    if(H5P_register_real(pclass, H5F_ACS_SDATA_BLOCK_SIZE_NAME, H5F_ACS_SDATA_BLOCK_SIZE_SIZE, &sdata_block_size, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_ACS_SDATA_BLOCK_SIZE_NAME, H5F_ACS_SDATA_BLOCK_SIZE_SIZE, &H5F_def_sdata_block_size_g, 
+            NULL, NULL, NULL, H5F_ACS_SDATA_BLOCK_SIZE_ENC, H5F_ACS_SDATA_BLOCK_SIZE_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the garbage collection reference */
-    if(H5P_register_real(pclass, H5F_ACS_GARBG_COLCT_REF_NAME, H5F_ACS_GARBG_COLCT_REF_SIZE, &gc_ref, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
-
-    /* Register the file driver ID */
-    if(H5P_register_real(pclass, H5F_ACS_FILE_DRV_ID_NAME, H5F_ACS_FILE_DRV_ID_SIZE, &driver_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_ACS_GARBG_COLCT_REF_NAME, H5F_ACS_GARBG_COLCT_REF_SIZE, &H5F_def_gc_ref_g, 
+            NULL, NULL, NULL, H5F_ACS_GARBG_COLCT_REF_ENC, H5F_ACS_GARBG_COLCT_REF_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
-    /* Register the file driver info */
-    if(H5P_register_real(pclass, H5F_ACS_FILE_DRV_INFO_NAME, H5F_ACS_FILE_DRV_INFO_SIZE, &driver_info, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* Register the file driver ID & info */
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5F_ACS_FILE_DRV_NAME, H5F_ACS_FILE_DRV_SIZE, &def_driver_prop, 
+            H5F_ACS_FILE_DRV_CRT, H5F_ACS_FILE_DRV_SET, H5F_ACS_FILE_DRV_GET, NULL, NULL,
+            H5F_ACS_FILE_DRV_DEL, H5F_ACS_FILE_DRV_COPY, H5F_ACS_FILE_DRV_CMP, H5F_ACS_FILE_DRV_CLOSE) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the file close degree */
-    if(H5P_register_real(pclass, H5F_ACS_CLOSE_DEGREE_NAME, H5F_CLOSE_DEGREE_SIZE, &close_degree, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_ACS_CLOSE_DEGREE_NAME, H5F_CLOSE_DEGREE_SIZE, &H5F_def_close_degree_g, 
+            NULL, NULL, NULL, H5F_CLOSE_DEGREE_ENC, H5F_CLOSE_DEGREE_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the offset of family driver info */
-    if(H5P_register_real(pclass, H5F_ACS_FAMILY_OFFSET_NAME, H5F_ACS_FAMILY_OFFSET_SIZE, &family_offset, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_ACS_FAMILY_OFFSET_NAME, H5F_ACS_FAMILY_OFFSET_SIZE, &H5F_def_family_offset_g, 
+            NULL, NULL, NULL, H5F_ACS_FAMILY_OFFSET_ENC, H5F_ACS_FAMILY_OFFSET_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the private property of new family file size. It's used by h5repart only. */
-    if(H5P_register_real(pclass, H5F_ACS_FAMILY_NEWSIZE_NAME, H5F_ACS_FAMILY_NEWSIZE_SIZE, &family_newsize, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5F_ACS_FAMILY_NEWSIZE_NAME, H5F_ACS_FAMILY_NEWSIZE_SIZE, &H5F_def_family_newsize_g, 
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the private property of whether convert family to sec2 driver. It's used by h5repart only. */
-    if(H5P_register_real(pclass, H5F_ACS_FAMILY_TO_SEC2_NAME, H5F_ACS_FAMILY_TO_SEC2_SIZE, &family_to_sec2, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5F_ACS_FAMILY_TO_SEC2_NAME, H5F_ACS_FAMILY_TO_SEC2_SIZE, &H5F_def_family_to_sec2_g, 
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the data type of multi driver info */
-    if(H5P_register_real(pclass, H5F_ACS_MULTI_TYPE_NAME, H5F_ACS_MULTI_TYPE_SIZE, &mem_type, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_ACS_MULTI_TYPE_NAME, H5F_ACS_MULTI_TYPE_SIZE, &H5F_def_mem_type_g, 
+            NULL, NULL, NULL, H5F_ACS_MULTI_TYPE_ENC, H5F_ACS_MULTI_TYPE_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the 'use the latest version of the format' flag */
-    if(H5P_register_real(pclass, H5F_ACS_LATEST_FORMAT_NAME, H5F_ACS_LATEST_FORMAT_SIZE, &latest_format, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_ACS_LATEST_FORMAT_NAME, H5F_ACS_LATEST_FORMAT_SIZE, &H5F_def_latest_format_g, 
+            NULL, NULL, NULL, H5F_ACS_LATEST_FORMAT_ENC, H5F_ACS_LATEST_FORMAT_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the private property of whether to retrieve the file descriptor from the core VFD */
     /* (used internally to the library only) */
-    if(H5P_register_real(pclass, H5F_ACS_WANT_POSIX_FD_NAME, H5F_ACS_WANT_POSIX_FD_SIZE, &want_posix_fd, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5F_ACS_WANT_POSIX_FD_NAME, H5F_ACS_WANT_POSIX_FD_SIZE, &H5F_def_want_posix_fd_g, 
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the external file cache size */
-    if(H5P_register_real(pclass, H5F_ACS_EFC_SIZE_NAME, H5F_ACS_EFC_SIZE_SIZE, &efc_size, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_ACS_EFC_SIZE_NAME, H5F_ACS_EFC_SIZE_SIZE, &H5F_def_efc_size_g, 
+            NULL, NULL, NULL, H5F_ACS_EFC_SIZE_ENC, H5F_ACS_EFC_SIZE_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the initial file image info */
-    if(H5P_register_real(pclass, H5F_ACS_FILE_IMAGE_INFO_NAME, H5F_ACS_FILE_IMAGE_INFO_SIZE, &file_image_info, NULL, NULL, NULL, H5F_ACS_FILE_IMAGE_INFO_DEL, H5F_ACS_FILE_IMAGE_INFO_COPY, NULL, H5F_ACS_FILE_IMAGE_INFO_CLOSE) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5F_ACS_FILE_IMAGE_INFO_NAME, H5F_ACS_FILE_IMAGE_INFO_SIZE, &H5F_def_file_image_info_g, 
+            NULL, H5F_ACS_FILE_IMAGE_INFO_SET, H5F_ACS_FILE_IMAGE_INFO_GET, NULL, NULL,
+            H5F_ACS_FILE_IMAGE_INFO_DEL, H5F_ACS_FILE_IMAGE_INFO_COPY, H5F_ACS_FILE_IMAGE_INFO_CMP, H5F_ACS_FILE_IMAGE_INFO_CLOSE) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the core VFD backing store write tracking flag */
-    if(H5P_register_real(pclass, H5F_ACS_CORE_WRITE_TRACKING_FLAG_NAME, H5F_ACS_CORE_WRITE_TRACKING_FLAG_SIZE, &core_write_tracking_flag, 
-            NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_ACS_CORE_WRITE_TRACKING_FLAG_NAME, H5F_ACS_CORE_WRITE_TRACKING_FLAG_SIZE, &H5F_def_core_write_tracking_flag_g , 
+            NULL, NULL, NULL, H5F_ACS_CORE_WRITE_TRACKING_FLAG_ENC, H5F_ACS_CORE_WRITE_TRACKING_FLAG_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the size of the core VFD backing store page size */
-    if(H5P_register_real(pclass, H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_NAME, H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_SIZE, &core_write_tracking_page_size, 
-            NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_NAME, H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_SIZE, &H5F_def_core_write_tracking_page_size_g , 
+            NULL, NULL, NULL, H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_ENC, H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_facc_reg_prop() */
-
-

-/*----------------------------------------------------------------------------
- * Function:	H5P_facc_create
- *
- * Purpose:	Callback routine which is called whenever a file access
- *		property list is closed.  This routine performs any generic
- * 		initialization needed on the properties the library put into
- * 		the list.
- *
- * Return:	Success:		Non-negative
- * 		Failure:		Negative
- *
- * Programmer:	Raymond Lu
- *		Tuesday, Oct 23, 2001
- *
- *----------------------------------------------------------------------------
- */
-/* ARGSUSED */
-static herr_t
-H5P_facc_create(hid_t fapl_id, void H5_ATTR_UNUSED *copy_data)
-{
-    hid_t          driver_id;
-    H5P_genplist_t *plist;              /* Property list */
-    herr_t         ret_value = SUCCEED;
-
-    FUNC_ENTER_NOAPI_NOINIT
-
-    /* Check argument */
-    if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
-
-    /* Retrieve driver ID property */
-    if(H5P_get(plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get driver ID")
-
-    if(driver_id > 0) {
-        void *driver_info;
-
-        /* Retrieve driver info property */
-        if(H5P_get(plist, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get driver info")
-
-        /* Set the driver for the property list */
-        if(H5FD_fapl_open(plist, driver_id, driver_info) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set driver")
-    } /* end if */
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_facc_create() */
-
-

-/*--------------------------------------------------------------------------
- * Function:	H5P_facc_copy
- *
- * Purpose:	Callback routine which is called whenever a file access
- * 		property list is copied.  This routine performs any generic
- * 	 	copy needed on the properties.
- *
- * Return:	Success:	Non-negative
- * 		Failure:	Negative
- *
- * Programmer:	Raymond Lu
- *		Tuesday, Oct 23, 2001
- *
- *--------------------------------------------------------------------------
- */
-/* ARGSUSED */
-static herr_t
-H5P_facc_copy(hid_t dst_fapl_id, hid_t src_fapl_id, void H5_ATTR_UNUSED *copy_data)
-{
-    hid_t          driver_id;
-    H5P_genplist_t *src_plist;              /* Source property list */
-    herr_t         ret_value = SUCCEED;
-
-    FUNC_ENTER_NOAPI_NOINIT
-
-    /* Get driver ID from source property list */
-    if(NULL == (src_plist = (H5P_genplist_t *)H5I_object(src_fapl_id)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
-    if(H5P_get(src_plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get driver ID")
-
-    if(driver_id > 0) {
-        H5P_genplist_t *dst_plist;              /* Destination property list */
-        void *driver_info;
-
-        /* Get driver info from source property list */
-        if(H5P_get(src_plist, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get driver info")
-
-        /* Set the driver for the destination property list */
-        if(NULL == (dst_plist = (H5P_genplist_t *)H5I_object(dst_fapl_id)))
-            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
-        if(H5FD_fapl_open(dst_plist, driver_id, driver_info) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set driver")
-    } /* end if */
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_facc_copy() */
-
-

-/*--------------------------------------------------------------------------
- * Function:	H5P_facc_close
- *
- * Purpose:	Callback routine which is called whenever a file access
- *		property list is closed.  This routine performs any generic
- *		cleanup needed on the properties.
- *
- * Return:	Success:	Non-negative
- * 		Failure:	Negative
- *
- * Programmer:	Raymond Lu
- *		Tuesday, Oct 23, 2001
- *
- *---------------------------------------------------------------------------
- */
-/* ARGSUSED */
-herr_t
-H5P_facc_close(hid_t fapl_id, void H5_ATTR_UNUSED *close_data)
-{
-    hid_t      driver_id;
-    H5P_genplist_t *plist;              /* Property list */
-    herr_t     ret_value = SUCCEED;
-
-    FUNC_ENTER_NOAPI(FAIL)
+    /* Register the # of read attempts */
+    if(H5P_register_real(pclass, H5F_ACS_METADATA_READ_ATTEMPTS_NAME, H5F_ACS_METADATA_READ_ATTEMPTS_SIZE, &H5F_def_metadata_read_attempts_g, 
+            NULL, NULL, NULL, H5F_ACS_METADATA_READ_ATTEMPTS_ENC, H5F_ACS_METADATA_READ_ATTEMPTS_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
-    /* Check argument */
-    if(NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
+    /* Register object flush callback */
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5F_ACS_OBJECT_FLUSH_CB_NAME, H5F_ACS_OBJECT_FLUSH_CB_SIZE, &H5F_def_object_flush_cb_g, 
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
-    /* Get driver ID property */
-    if(H5P_get(plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
-        HGOTO_DONE(FAIL) /* Can't return errors when library is shutting down */
+    /* Register the private property of whether to clear the superblock status_flags. It's used by h5clear only. */
+    if(H5P_register_real(pclass, H5F_ACS_CLEAR_STATUS_FLAGS_NAME, H5F_ACS_CLEAR_STATUS_FLAGS_SIZE, &H5F_def_clear_status_flags_g,
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
-    if(driver_id > 0) {
-        void *driver_info;
+    /* Register the metadata cache logging flag. */
+    if(H5P_register_real(pclass, H5F_ACS_USE_MDC_LOGGING_NAME, H5F_ACS_USE_MDC_LOGGING_SIZE, &H5F_def_use_mdc_logging_g,
+            NULL, NULL, NULL, H5F_ACS_USE_MDC_LOGGING_ENC, H5F_ACS_USE_MDC_LOGGING_DEC, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
-        /* Get driver info property */
-        if(H5P_get(plist, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0)
-            HGOTO_DONE(FAIL) /* Can't return errors when library is shutting down */
+    /* Register the metadata cache log location. */
+    if(H5P_register_real(pclass, H5F_ACS_MDC_LOG_LOCATION_NAME, H5F_ACS_MDC_LOG_LOCATION_SIZE, &H5F_def_mdc_log_location_g,
+        NULL, NULL, NULL, H5F_ACS_MDC_LOG_LOCATION_ENC, H5F_ACS_MDC_LOG_LOCATION_DEC,
+        H5F_ACS_MDC_LOG_LOCATION_DEL, H5F_ACS_MDC_LOG_LOCATION_COPY, H5F_ACS_MDC_LOG_LOCATION_CMP, H5F_ACS_MDC_LOG_LOCATION_CLOSE) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
-        /* Close the driver for the property list */
-        if(H5FD_fapl_close(driver_id, driver_info) < 0)
-            HGOTO_DONE(FAIL) /* Can't return errors when library is shutting down */
-    } /* end if */
+    /* Register the flag that indicates whether mdc logging starts on file access. */
+    if(H5P_register_real(pclass, H5F_ACS_START_MDC_LOG_ON_ACCESS_NAME, H5F_ACS_START_MDC_LOG_ON_ACCESS_SIZE, &H5F_def_start_mdc_log_on_access_g,
+            NULL, NULL, NULL, H5F_ACS_START_MDC_LOG_ON_ACCESS_ENC, H5F_ACS_START_MDC_LOG_ON_ACCESS_DEC, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_facc_close() */
+} /* end H5P__facc_reg_prop() */
 
 

 /*-------------------------------------------------------------------------
@@ -609,9 +641,7 @@ done:
 herr_t
 H5P_set_driver(H5P_genplist_t *plist, hid_t new_driver_id, const void *new_driver_info)
 {
-    hid_t driver_id;            /* VFL driver ID */
-    void *driver_info;          /* VFL driver info */
-    herr_t ret_value = SUCCEED; /* Return value */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -619,19 +649,15 @@ H5P_set_driver(H5P_genplist_t *plist, hid_t new_driver_id, const void *new_drive
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file driver ID")
 
     if(TRUE == H5P_isa_class(plist->plist_id, H5P_FILE_ACCESS)) {
-        /* Get the current driver information */
-        if(H5P_get(plist, H5F_ACS_FILE_DRV_ID_NAME, &driver_id) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get driver ID")
-        if(H5P_get(plist, H5F_ACS_FILE_DRV_INFO_NAME, &driver_info) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET,FAIL,"can't get driver info")
+        H5FD_driver_prop_t driver_prop;         /* Property for driver ID & info */
 
-        /* Close the driver for the property list */
-        if(H5FD_fapl_close(driver_id, driver_info) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't reset driver")
+        /* Prepare the driver property */
+        driver_prop.driver_id = new_driver_id;
+        driver_prop.driver_info = new_driver_info;
 
-        /* Set the driver for the property list */
-        if(H5FD_fapl_open(plist, new_driver_id, new_driver_info) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set driver")
+        /* Set the driver ID & info property */
+        if(H5P_set(plist, H5F_ACS_FILE_DRV_NAME, &driver_prop) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set driver ID & info")
     } /* end if */
     else
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
@@ -685,7 +711,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5P_get_driver
+ * Function:	H5P_peek_driver
  *
  * Purpose:	Return the ID of the low-level file driver.  PLIST_ID should
  *		be a file access property list.
@@ -703,7 +729,7 @@ done:
  *-------------------------------------------------------------------------
  */
 hid_t
-H5P_get_driver(H5P_genplist_t *plist)
+H5P_peek_driver(H5P_genplist_t *plist)
 {
     hid_t ret_value = FAIL;     /* Return value */
 
@@ -711,18 +737,21 @@ H5P_get_driver(H5P_genplist_t *plist)
 
     /* Get the current driver ID */
     if(TRUE == H5P_isa_class(plist->plist_id, H5P_FILE_ACCESS)) {
-        if(H5P_get(plist, H5F_ACS_FILE_DRV_ID_NAME, &ret_value) < 0)
+        H5FD_driver_prop_t driver_prop;         /* Property for driver ID & info */
+
+        if(H5P_peek(plist, H5F_ACS_FILE_DRV_NAME, &driver_prop) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get driver ID")
+        ret_value = driver_prop.driver_id;
     } /* end if */
     else
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list")
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a file access property list")
 
     if(H5FD_VFD_DEFAULT == ret_value)
         ret_value = H5_DEFAULT_VFD;
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_get_driver() */
+} /* end H5P_peek_driver() */
 
 

 /*-------------------------------------------------------------------------
@@ -731,6 +760,8 @@ done:
  * Purpose:	Return the ID of the low-level file driver.  PLIST_ID should
  *		be a file access property list.
  *
+ * Note:	The ID returned should not be closed.
+ *
  * Return:	Success:	A low-level driver ID which is the same ID
  *				used when the driver was set for the property
  *				list. The driver ID is only valid as long as
@@ -756,7 +787,7 @@ H5Pget_driver(hid_t plist_id)
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
 
     /* Get the driver */
-    if((ret_value = H5P_get_driver(plist)) < 0)
+    if((ret_value = H5P_peek_driver(plist)) < 0)
          HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get driver")
 
 done:
@@ -765,7 +796,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5P_get_driver_info
+ * Function:	H5P_peek_driver_info
  *
  * Purpose:	Returns a pointer directly to the file driver-specific
  *		information of a file access.
@@ -783,8 +814,8 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-void *
-H5P_get_driver_info(H5P_genplist_t *plist)
+const void *
+H5P_peek_driver_info(H5P_genplist_t *plist)
 {
     void *ret_value = NULL;     /* Return value */
 
@@ -792,15 +823,18 @@ H5P_get_driver_info(H5P_genplist_t *plist)
 
     /* Get the current driver info */
     if(TRUE == H5P_isa_class(plist->plist_id, H5P_FILE_ACCESS)) {
-        if(H5P_get(plist, H5F_ACS_FILE_DRV_INFO_NAME, &ret_value) < 0)
+        H5FD_driver_prop_t driver_prop;         /* Property for driver ID & info */
+
+        if(H5P_peek(plist, H5F_ACS_FILE_DRV_NAME, &driver_prop) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get driver info")
+        ret_value = (void *)driver_prop.driver_info;
     } /* end if */
     else
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list")
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, NULL, "not a file access property list")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_get_driver_info() */
+} /* end H5P_peek_driver_info() */
 
 

 /*-------------------------------------------------------------------------
@@ -835,7 +869,7 @@ H5Pget_driver_info(hid_t plist_id)
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a property list")
 
     /* Get the driver info */
-    if(NULL == (ret_value = H5P_get_driver_info(plist)))
+    if(NULL == (ret_value = (void *)H5P_peek_driver_info(plist)))
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, NULL, "can't get driver info")
 
 done:
@@ -844,6 +878,365 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5P__file_driver_copy
+ *
+ * Purpose:     Copy file driver ID & info.
+ *
+ * Note:        This is an "in-place" copy, since this routine gets called
+ *              after the top-level copy has been performed and this routine
+ *		finishes the "deep" part of the copy.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, Sept 8, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__file_driver_copy(void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    if(value) {
+        H5FD_driver_prop_t *info = (H5FD_driver_prop_t *)value; /* Driver ID & info struct */
+
+        /* Copy the driver & info, if there is one */
+        if(info->driver_id > 0) {
+            /* Increment the reference count on driver and copy driver info */
+            if(H5I_inc_ref(info->driver_id, FALSE) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTINC, FAIL, "unable to increment ref count on VFL driver")
+
+            /* Copy driver info, if it exists */
+            if(info->driver_info) {
+                H5FD_class_t *driver;       /* Pointer to driver */
+                void *new_pl;        /* Copy of driver info */
+
+                /* Retrieve the driver for the ID */
+                if(NULL == (driver = (H5FD_class_t *)H5I_object(info->driver_id)))
+                    HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a driver ID")
+
+                /* Allow the driver to copy or do it ourselves */
+                if(driver->fapl_copy) {
+                    if(NULL == (new_pl = (driver->fapl_copy)(info->driver_info)))
+                        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "driver info copy failed")
+                } /* end if */
+                else if(driver->fapl_size > 0) {
+                    if(NULL == (new_pl = H5MM_malloc(driver->fapl_size)))
+                        HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "driver info allocation failed")
+                    HDmemcpy(new_pl, info->driver_info, driver->fapl_size);
+                } /* end else-if */
+                else
+                    HGOTO_ERROR(H5E_PLIST, H5E_UNSUPPORTED, FAIL, "no way to copy driver info")
+
+                /* Set the driver info for the copy */
+                info->driver_info = new_pl;
+            } /* end if */
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__file_driver_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__file_driver_free
+ *
+ * Purpose:     Free file driver ID & info.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, Sept 8, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__file_driver_free(void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    if(value) {
+        H5FD_driver_prop_t *info = (H5FD_driver_prop_t *)value; /* Driver ID & info struct */
+
+        /* Copy the driver & info, if there is one */
+        if(info->driver_id > 0) {
+            if(info->driver_info) {
+                H5FD_class_t *driver;       /* Pointer to driver */
+
+                /* Retrieve the driver for the ID */
+                if(NULL == (driver = (H5FD_class_t *)H5I_object(info->driver_id)))
+                    HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a driver ID")
+
+                /* Allow driver to free info or do it ourselves */
+                if(driver->fapl_free) {
+                    if((driver->fapl_free)((void *)info->driver_info) < 0)      /* Casting away const OK -QAK */
+                        HGOTO_ERROR(H5E_PLIST, H5E_CANTFREE, FAIL, "driver info free request failed")
+                } /* end if */
+                else
+                    H5MM_xfree((void *)info->driver_info);      /* Casting away const OK -QAK */
+            } /* end if */
+
+            /* Decrement reference count for driver */
+            if(H5I_dec_ref(info->driver_id) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTDEC, FAIL, "can't decrement reference count for driver ID")
+        } /* end if */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__file_driver_free() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__facc_file_driver_create
+ *
+ * Purpose:     Create callback for the file driver ID & info property.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, September 8, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__facc_file_driver_create(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Make copy of file driver */
+    if(H5P__file_driver_copy(value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy file driver")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__facc_file_driver_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__facc_file_driver_set
+ *
+ * Purpose:     Copies a file driver property when it's set for a property list
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, Sept 7, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__facc_file_driver_set(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Make copy of file driver ID & info */
+    if(H5P__file_driver_copy(value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy file driver")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__facc_file_driver_set() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__facc_file_driver_get
+ *
+ * Purpose:     Copies a file driver property when it's retrieved from a property list
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, Sept 7, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__facc_file_driver_get(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Make copy of file driver */
+    if(H5P__file_driver_copy(value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy file driver")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__facc_file_driver_get() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__facc_file_driver_del
+ *
+ * Purpose:     Frees memory used to store the driver ID & info property
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, September 8, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__facc_file_driver_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Free the file driver ID & info */
+    if(H5P__file_driver_free(value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "can't release file driver")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__facc_file_driver_del() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__facc_file_driver_copy
+ *
+ * Purpose:     Copy callback for the file driver ID & info property.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, September 8, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__facc_file_driver_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Make copy of file driver */
+    if(H5P__file_driver_copy(value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy file driver")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__facc_file_driver_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__facc_file_driver_cmp
+ *
+ * Purpose:        Callback routine which is called whenever the file driver ID & info
+ *                 property in the file access property list is compared.
+ *
+ * Return:         positive if VALUE1 is greater than VALUE2, negative if
+ *                      VALUE2 is greater than VALUE1 and zero if VALUE1 and
+ *                      VALUE2 are equal.
+ *
+ * Programmer:     Quincey Koziol
+ *                 Monday, September 8, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5P__facc_file_driver_cmp(const void *_info1, const void *_info2,
+    size_t H5_ATTR_UNUSED size)
+{
+    const H5FD_driver_prop_t *info1 = (const H5FD_driver_prop_t *)_info1, /* Create local aliases for values */
+        *info2 = (const H5FD_driver_prop_t *)_info2;
+    H5FD_class_t *cls1, *cls2;  /* Driver class for each property */
+    int cmp_value;              /* Value from comparison */
+    herr_t ret_value = 0;       /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(info1);
+    HDassert(info2);
+    HDassert(size == sizeof(H5FD_driver_prop_t));
+
+    /* Compare drivers */
+    if(NULL == (cls1 = H5FD_get_class(info1->driver_id)))
+        HGOTO_DONE(-1)
+    if(NULL == (cls2 = H5FD_get_class(info2->driver_id)))
+        HGOTO_DONE(1)
+    if(cls1->name == NULL && cls2->name != NULL) HGOTO_DONE(-1);
+    if(cls1->name != NULL && cls2->name == NULL) HGOTO_DONE(1);
+    if(0 != (cmp_value = HDstrcmp(cls1->name, cls2->name)))
+        HGOTO_DONE(cmp_value);
+
+    /* Compare driver infos */
+    if(cls1->fapl_size < cls2->fapl_size) HGOTO_DONE(-1)
+    if(cls1->fapl_size > cls2->fapl_size) HGOTO_DONE(1)
+    HDassert(cls1->fapl_size == cls2->fapl_size);
+    if(info1->driver_info == NULL && info2->driver_info != NULL) HGOTO_DONE(-1);
+    if(info1->driver_info != NULL && info2->driver_info == NULL) HGOTO_DONE(1);
+    if(info1->driver_info) {
+        HDassert(cls1->fapl_size > 0);
+        if(0 != (cmp_value = HDmemcmp(info1->driver_info, info2->driver_info, cls1->fapl_size)))
+            HGOTO_DONE(cmp_value);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__facc_file_driver_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__facc_file_driver_close
+ *
+ * Purpose:     Close callback for the file driver ID & info property.
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, September 8, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__facc_file_driver_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Free the file driver */
+    if(H5P__file_driver_free(value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "can't release file driver")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__facc_file_driver_close() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    H5Pset_family_offset
  *
  * Purpose:     Set offset for family driver.  This file access property
@@ -915,7 +1308,7 @@ H5Pget_family_offset(hid_t fapl_id, hsize_t *offset)
     /* Get value */
     if(offset) {
         if(H5P_get(plist, H5F_ACS_FAMILY_OFFSET_NAME, offset) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set offset for family file")
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set offset for family file")
     } /* end if */
 
 done:
@@ -995,7 +1388,7 @@ H5Pget_multi_type(hid_t fapl_id, H5FD_mem_t *type)
     /* Get value */
     if(type) {
         if(H5P_get(plist, H5F_ACS_MULTI_TYPE_NAME, type) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't get type for multi driver")
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get type for multi driver")
     } /* end if */
 
 done:
@@ -1916,7 +2309,7 @@ H5Pset_file_image(hid_t fapl_id, void *buf_ptr, size_t buf_len)
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
         
     /* Get old image info */
-    if(H5P_get(fapl, H5F_ACS_FILE_IMAGE_INFO_NAME, &image_info) < 0)
+    if(H5P_peek(fapl, H5F_ACS_FILE_IMAGE_INFO_NAME, &image_info) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get old file image pointer")
         
     /* Release previous buffer, if it exists */
@@ -1957,7 +2350,7 @@ H5Pset_file_image(hid_t fapl_id, void *buf_ptr, size_t buf_len)
     image_info.size = buf_len;
 
     /* Set values */
-    if(H5P_set(fapl, H5F_ACS_FILE_IMAGE_INFO_NAME, &image_info) < 0)
+    if(H5P_poke(fapl, H5F_ACS_FILE_IMAGE_INFO_NAME, &image_info) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file image info")
 
 done:
@@ -2009,7 +2402,7 @@ H5Pget_file_image(hid_t fapl_id, void **buf_ptr_ptr, size_t *buf_len_ptr)
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Get values */
-    if(H5P_get(fapl, H5F_ACS_FILE_IMAGE_INFO_NAME, &image_info) < 0)
+    if(H5P_peek(fapl, H5F_ACS_FILE_IMAGE_INFO_NAME, &image_info) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get file image info")
 
     /* verify file image field consistancy */
@@ -2085,7 +2478,7 @@ H5Pset_file_image_callbacks(hid_t fapl_id, H5FD_file_image_callbacks_t *callback
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Get old info */
-    if(H5P_get(fapl, H5F_ACS_FILE_IMAGE_INFO_NAME, &info) < 0)
+    if(H5P_peek(fapl, H5F_ACS_FILE_IMAGE_INFO_NAME, &info) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get old file image info")
 
     /* verify file image field consistancy */
@@ -2123,7 +2516,7 @@ H5Pset_file_image_callbacks(hid_t fapl_id, H5FD_file_image_callbacks_t *callback
     } /* end if */
 
     /* Set values */
-    if(H5P_set(fapl, H5F_ACS_FILE_IMAGE_INFO_NAME, &info) < 0)
+    if(H5P_poke(fapl, H5F_ACS_FILE_IMAGE_INFO_NAME, &info) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set file image info")
 
 done:
@@ -2161,7 +2554,7 @@ H5Pget_file_image_callbacks(hid_t fapl_id, H5FD_file_image_callbacks_t *callback
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Get old info */
-    if(H5P_get(fapl, H5F_ACS_FILE_IMAGE_INFO_NAME, &info) < 0)
+    if(H5P_peek(fapl, H5F_ACS_FILE_IMAGE_INFO_NAME, &info) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get file image info")
 
     /* verify file image field consistancy */
@@ -2188,80 +2581,30 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function: H5P_file_image_info_del
+ * Function:    H5P__file_image_info_copy
  *
- * Purpose:     Delete callback for the file image info property, called
- *              when the property is deleted from the plist. The buffer
- *              and udata may need to be freed, possibly using their 
- *              respective callbacks so the default free won't work.
+ * Purpose:     Copy file image info. The buffer
+ *              and udata may need to be copied, possibly using their 
+ *              respective callbacks so the default copy won't work.
  *
- * Return:      Non-negative on success/Negative on failure
- *
- * Programmer:  Jacob Gruber
- *              Thurday, August 11, 2011
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5P_file_image_info_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
-{
-    H5FD_file_image_info_t info;        /* Image info struct */
-    herr_t ret_value = SUCCEED;         /* Return value */
-
-    FUNC_ENTER_NOAPI_NOINIT
-
-    if(value) {
-        info = *(H5FD_file_image_info_t *)value;
-
-        /* verify file image field consistancy */
-        HDassert(((info.buffer != NULL) && (info.size > 0)) || 
-                 ((info.buffer == NULL) && (info.size == 0)));
-
-        if(info.buffer && info.size > 0) {
-            /* Free buffer */
-            if(info.callbacks.image_free) {
-                if(info.callbacks.image_free(info.buffer, H5FD_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE, info.callbacks.udata) < 0)
-		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "image_free callback failed")
-            } /* end if */
-            else
-                HDfree(info.buffer);
-        } /* end if */
-
-        /* Free udata if it exists */
-        if(info.callbacks.udata) {
-            if(NULL == info.callbacks.udata_free)
-                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "udata_free not defined")
-
-            if(info.callbacks.udata_free(info.callbacks.udata) < 0)
-	        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "udata_free callback failed")
-        } /* end if */
-    } /* end if */
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_file_image_info_del() */
-
-

-/*-------------------------------------------------------------------------
- * Function: H5P_file_image_info_copy
- *
- * Purpose:     Copy callback for the file image info property. The buffer
- *              and udata may need to be copied, possibly using their 
- *              respective callbacks so the default copy won't work.
+ * Note:        This is an "in-place" copy, since this routine gets called
+ *              after the top-level copy has been performed and this routine
+ *		finishes the "deep" part of the copy.
  *
- * Return:      Non-negative on success/Negative on failure
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
  *
- * Programmer:  Jacob Gruber
- *              Thurday, August 11, 2011
+ * Programmer:  Quincey Koziol
+ *              Tuesday, Sept 1, 2015
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5P_file_image_info_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+static herr_t
+H5P__file_image_info_copy(void *value)
 {
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     if(value) {
         H5FD_file_image_info_t *info;   /* Image info struct */
@@ -2282,19 +2625,18 @@ H5P_file_image_info_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED
             if(info->callbacks.image_malloc) {
                 if(NULL == (info->buffer = info->callbacks.image_malloc(info->size,
                         H5FD_FILE_IMAGE_OP_PROPERTY_LIST_COPY, info->callbacks.udata)))
-                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "image malloc callback failed")
+                    HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "image malloc callback failed")
             } /* end if */
             else {
                 if(NULL == (info->buffer = H5MM_malloc(info->size)))
-                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "unable to allocate memory block")
+                    HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "unable to allocate memory block")
             } /* end else */
             
             /* Copy data to new buffer */
             if(info->callbacks.image_memcpy) {
                 if(info->buffer != info->callbacks.image_memcpy(info->buffer, old_buffer, 
-			info->size, H5FD_FILE_IMAGE_OP_PROPERTY_LIST_COPY, 
-			info->callbacks.udata))
-		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTCOPY, FAIL, "image_memcpy callback failed")
+			info->size, H5FD_FILE_IMAGE_OP_PROPERTY_LIST_COPY, info->callbacks.udata))
+		    HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "image_memcpy callback failed")
             } /* end if */
 	    else
                 HDmemcpy(info->buffer, old_buffer, info->size);
@@ -2305,50 +2647,53 @@ H5P_file_image_info_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED
             void *old_udata = info->callbacks.udata;
 
             if(NULL == info->callbacks.udata_copy)
-                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "udata_copy not defined")
+                HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "udata_copy not defined")
 
             info->callbacks.udata = info->callbacks.udata_copy(old_udata);
         } /* end if */
-
     } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_file_image_info_copy() */
+} /* end H5P__file_image_info_copy() */
 
 

 /*-------------------------------------------------------------------------
- * Function: H5P_file_image_info_close
+ * Function:    H5P__file_image_info_free
  *
- * Purpose:     Close callback for the file image info property. The buffer
- *              and udata may need to be freed, possibly using their 
- *              respective callbacks so the standard free won't work.
+ * Purpose:     Free file image info.  The buffer and udata may need to be
+ *		freed, possibly using their respective callbacks, so the
+ *		default free won't work.
  *
- * Return:      Non-negative on success/Negative on failure
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
  *
- * Programmer:  Jacob Gruber
- *              Thurday, August 11, 2011
+ * Programmer:  Quincey Koziol
+ *              Wednesday, Sept 2, 2015
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5P_file_image_info_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+static herr_t
+H5P__file_image_info_free(void *value)
 {
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     if(value) {
         H5FD_file_image_info_t *info;        /* Image info struct */
 
         info = (H5FD_file_image_info_t *)value;
              
+        /* Verify file image field consistancy */
+        HDassert(((info->buffer != NULL) && (info->size > 0)) || 
+                 ((info->buffer == NULL) && (info->size == 0)));
+
+        /* Free buffer */
         if(info->buffer != NULL && info->size > 0) { 
-            /* Free buffer */
             if(info->callbacks.image_free) {
-                if(info->callbacks.image_free(info->buffer, H5FD_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE,
-                        info->callbacks.udata) < 0)
-		    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "image_free callback failed")
+                if((*info->callbacks.image_free)(info->buffer, H5FD_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE, info->callbacks.udata) < 0)
+		    HGOTO_ERROR(H5E_PLIST, H5E_CANTFREE, FAIL, "image_free callback failed")
             } /* end if */
             else
                 H5MM_xfree(info->buffer);
@@ -2357,90 +2702,1327 @@ H5P_file_image_info_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED
         /* Free udata if it exists */
         if(info->callbacks.udata) {
             if(NULL == info->callbacks.udata_free)
-                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "udata_free not defined")
-            if(info->callbacks.udata_free(info->callbacks.udata) < 0)
-                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, "udata_free callback failed")
+                HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "udata_free not defined")
+            if((*info->callbacks.udata_free)(info->callbacks.udata) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTFREE, FAIL, "udata_free callback failed")
         } /* end if */
     } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_file_image_info_close() */
+} /* end H5P__file_image_info_free() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5Pset_core_write_tracking
+ * Function:    H5P__facc_file_image_info_set
  *
- * Purpose:	Enables/disables core VFD write tracking and page
- *              aggregation size.
+ * Purpose:     Copies a file image property when it's set for a property list
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, Sept 1, 2015
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5Pset_core_write_tracking(hid_t plist_id, hbool_t is_enabled, size_t page_size)
+static herr_t
+H5P__facc_file_image_info_set(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
 {
-    H5P_genplist_t *plist;        /* Property list pointer */
-    herr_t ret_value = SUCCEED;   /* return value */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_API(FAIL)
-    H5TRACE3("e", "ibz", plist_id, is_enabled, page_size);
+    FUNC_ENTER_STATIC
 
-    /* The page size cannot be zero */
-    if(page_size == 0)
-        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "page_size cannot be zero")
+    /* Sanity check */
+    HDassert(value);
 
-    /* Get the plist structure */
-    if(NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_ACCESS)))
-        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+    /* Make copy of file image info */
+    if(H5P__file_image_info_copy(value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy file image info")
 
-    /* Set values */
-    if(H5P_set(plist, H5F_ACS_CORE_WRITE_TRACKING_FLAG_NAME, &is_enabled) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set core VFD write tracking flag")
-    if(H5P_set(plist, H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_NAME, &page_size) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set core VFD write tracking page size")
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__facc_file_image_info_set() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__facc_file_image_info_get
+ *
+ * Purpose:     Copies a file image property when it's retrieved from a property list
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, Sept 1, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__facc_file_image_info_get(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Make copy of file image info */
+    if(H5P__file_image_info_copy(value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy file image info")
 
 done:
-    FUNC_LEAVE_API(ret_value)
-}
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__facc_file_image_info_get() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5Pget_core_write_tracking
+ * Function:    H5P__facc_file_image_info_del
  *
- * Purpose:	Gets information about core VFD write tracking and page
- *              aggregation size.
+ * Purpose:     Delete callback for the file image info property, called
+ *              when the property is deleted from the plist. The buffer
+ *              and udata may need to be freed, possibly using their 
+ *              respective callbacks so the default free won't work.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Jacob Gruber
+ *              Thurday, August 11, 2011
  *
  *-------------------------------------------------------------------------
  */
-herr_t
-H5Pget_core_write_tracking(hid_t plist_id, hbool_t *is_enabled, size_t *page_size)
+static herr_t
+H5P__facc_file_image_info_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
 {
-    H5P_genplist_t *plist;      /* Property list pointer */
-    herr_t ret_value = SUCCEED;   /* return value */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_API(FAIL)
-    H5TRACE3("e", "i*b*z", plist_id, is_enabled, page_size);
+    FUNC_ENTER_STATIC
 
-    /* Get the plist structure */
-    if(NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_ACCESS)))
-        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+    /* Free the file image info */
+    if(H5P__file_image_info_free(value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "can't release file image info")
 
-    /* Get values */
-    if(is_enabled) {
-        if(H5P_get(plist, H5F_ACS_CORE_WRITE_TRACKING_FLAG_NAME, is_enabled) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get core VFD write tracking flag")
-    } /* end if */
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__facc_file_image_info_del() */
 
-    if(page_size) {
-        if(H5P_get(plist, H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_NAME, page_size) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get core VFD write tracking page size")
-    } /* end if */
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__facc_file_image_info_copy
+ *
+ * Purpose:     Copy callback for the file image info property. The buffer
+ *              and udata may need to be copied, possibly using their 
+ *              respective callbacks so the default copy won't work.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Jacob Gruber
+ *              Thurday, August 11, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__facc_file_image_info_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Make copy of file image info */
+    if(H5P__file_image_info_copy(value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy file image info")
 
 done:
-    FUNC_LEAVE_API(ret_value)
-}
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__facc_file_image_info_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__facc_file_image_info_cmp
+ *
+ * Purpose:        Callback routine which is called whenever the file image info
+ *                 property in the file access property list is compared.
+ *
+ * Return:         positive if VALUE1 is greater than VALUE2, negative if
+ *                      VALUE2 is greater than VALUE1 and zero if VALUE1 and
+ *                      VALUE2 are equal.
+ *
+ * Programmer:     Quincey Koziol
+ *                 Thursday, September 3, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5P__facc_file_image_info_cmp(const void *_info1, const void *_info2,
+    size_t H5_ATTR_UNUSED size)
+{
+    const H5FD_file_image_info_t *info1 = (const H5FD_file_image_info_t *)_info1, /* Create local aliases for values */
+        *info2 = (const H5FD_file_image_info_t *)_info2;
+    herr_t ret_value = 0;       /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(info1);
+    HDassert(info2);
+    HDassert(size == sizeof(H5FD_file_image_info_t));
+
+    /* Check for different buffer sizes */
+    if(info1->size < info2->size) HGOTO_DONE(-1)
+    if(info1->size > info2->size) HGOTO_DONE(1)
+
+    /* Check for different callbacks */
+    /* (Order in memory is fairly meaningless, so just check for equality) */
+    if(info1->callbacks.image_malloc != info2->callbacks.image_malloc) HGOTO_DONE(1)
+    if(info1->callbacks.image_memcpy != info2->callbacks.image_memcpy) HGOTO_DONE(-1)
+    if(info1->callbacks.image_realloc != info2->callbacks.image_realloc) HGOTO_DONE(1)
+    if(info1->callbacks.image_free != info2->callbacks.image_free) HGOTO_DONE(-1)
+    if(info1->callbacks.udata_copy != info2->callbacks.udata_copy) HGOTO_DONE(1)
+    if(info1->callbacks.udata_free != info2->callbacks.udata_free) HGOTO_DONE(-1)
+
+    /* Check for different udata */
+    /* (Don't know how big it is, so can't check contents) */
+    if(info1->callbacks.udata < info2->callbacks.udata) HGOTO_DONE(-1)
+    if(info1->callbacks.udata > info2->callbacks.udata) HGOTO_DONE(1)
+
+    /* Check buffer contents (instead of buffer pointers) */
+    if(info1->buffer != NULL && info2->buffer == NULL) HGOTO_DONE(-1)
+    if(info1->buffer == NULL && info2->buffer != NULL) HGOTO_DONE(1)
+    if(info1->buffer != NULL && info2->buffer != NULL)
+        ret_value = HDmemcmp(info1->buffer, info2->buffer, size);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__facc_file_image_info_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__facc_file_image_info_close
+ *
+ * Purpose:     Close callback for the file image info property. The buffer
+ *              and udata may need to be freed, possibly using their 
+ *              respective callbacks so the standard free won't work.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Jacob Gruber
+ *              Thurday, August 11, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__facc_file_image_info_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Free the file image info */
+    if(H5P__file_image_info_free(value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "can't release file image info")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__facc_file_image_info_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: H5P__facc_cache_config_cmp
+ *
+ * Purpose: Compare two cache configurations.
+ *
+ * Return: positive if VALUE1 is greater than VALUE2, negative if VALUE2 is
+ *		greater than VALUE1 and zero if VALUE1 and VALUE2 are equal.
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 September 24, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5P__facc_cache_config_cmp(const void *_config1, const void *_config2, size_t H5_ATTR_UNUSED size)
+{
+    const H5AC_cache_config_t *config1 = (const H5AC_cache_config_t *)_config1; /* Create local aliases for values */
+    const H5AC_cache_config_t *config2 = (const H5AC_cache_config_t *)_config2; /* Create local aliases for values */
+    int ret_value = 0;               /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check for a property being set */
+    if(config1 == NULL && config2 != NULL) HGOTO_DONE(-1);
+    if(config1 != NULL && config2 == NULL) HGOTO_DONE(1);
+
+    if(config1->version < config2->version) HGOTO_DONE(-1);
+    if(config1->version > config2->version) HGOTO_DONE(1);
+
+    if(config1->rpt_fcn_enabled < config2->rpt_fcn_enabled) HGOTO_DONE(-1);
+    if(config1->rpt_fcn_enabled > config2->rpt_fcn_enabled) HGOTO_DONE(1);
+
+    if(config1->evictions_enabled < config2->evictions_enabled) HGOTO_DONE(-1);
+    if(config1->evictions_enabled > config2->evictions_enabled) HGOTO_DONE(1);
+
+    if(config1->set_initial_size < config2->set_initial_size) HGOTO_DONE(-1);
+    if(config1->set_initial_size > config2->set_initial_size) HGOTO_DONE(1);
+
+    if(config1->initial_size < config2->initial_size) HGOTO_DONE(-1);
+    if(config1->initial_size > config2->initial_size) HGOTO_DONE(1);
+
+    if(config1->min_clean_fraction < config2->min_clean_fraction) HGOTO_DONE(-1);
+    if(config1->min_clean_fraction > config2->min_clean_fraction) HGOTO_DONE(1);
+
+    if(config1->max_size < config2->max_size) HGOTO_DONE(-1);
+    if(config1->max_size > config2->max_size) HGOTO_DONE(1);
+
+    if(config1->min_size < config2->min_size) HGOTO_DONE(-1);
+    if(config1->min_size > config2->min_size) HGOTO_DONE(1);
+
+    if(config1->epoch_length < config2->epoch_length) HGOTO_DONE(-1);
+    if(config1->epoch_length > config2->epoch_length) HGOTO_DONE(1);
+
+    if(config1->incr_mode < config2->incr_mode) HGOTO_DONE(-1);
+    if(config1->incr_mode > config2->incr_mode) HGOTO_DONE(1);
+
+    if(config1->lower_hr_threshold < config2->lower_hr_threshold) HGOTO_DONE(-1);
+    if(config1->lower_hr_threshold > config2->lower_hr_threshold) HGOTO_DONE(1);
+
+    if(config1->increment < config2->increment) HGOTO_DONE(-1);
+    if(config1->increment > config2->increment) HGOTO_DONE(1);
+
+    if(config1->apply_max_increment < config2->apply_max_increment) HGOTO_DONE(-1);
+    if(config1->apply_max_increment > config2->apply_max_increment) HGOTO_DONE(1);
+
+    if(config1->max_increment < config2->max_increment) HGOTO_DONE(-1);
+    if(config1->max_increment > config2->max_increment) HGOTO_DONE(1);
+
+    if(config1->flash_incr_mode < config2->flash_incr_mode) HGOTO_DONE(-1);
+    if(config1->flash_incr_mode > config2->flash_incr_mode) HGOTO_DONE(1);
+
+    if(config1->flash_multiple < config2->flash_multiple) HGOTO_DONE(-1);
+    if(config1->flash_multiple > config2->flash_multiple) HGOTO_DONE(1);
+
+    if(config1->flash_threshold < config2->flash_threshold) HGOTO_DONE(-1);
+    if(config1->flash_threshold > config2->flash_threshold) HGOTO_DONE(1);
+
+    if(config1->decr_mode < config2->decr_mode) HGOTO_DONE(-1);
+    if(config1->decr_mode > config2->decr_mode) HGOTO_DONE(1);
+
+    if(config1->upper_hr_threshold < config2->upper_hr_threshold) HGOTO_DONE(-1);
+    if(config1->upper_hr_threshold > config2->upper_hr_threshold) HGOTO_DONE(1);
+
+    if(config1->decrement < config2->decrement) HGOTO_DONE(-1);
+    if(config1->decrement > config2->decrement) HGOTO_DONE(1);
+
+    if(config1->apply_max_decrement < config2->apply_max_decrement) HGOTO_DONE(-1);
+    if(config1->apply_max_decrement > config2->apply_max_decrement) HGOTO_DONE(1);
+
+    if(config1->max_decrement < config2->max_decrement) HGOTO_DONE(-1);
+    if(config1->max_decrement > config2->max_decrement) HGOTO_DONE(1);
+
+    if(config1->epochs_before_eviction < config2->epochs_before_eviction) HGOTO_DONE(-1);
+    if(config1->epochs_before_eviction > config2->epochs_before_eviction) HGOTO_DONE(1);
+
+    if(config1->apply_empty_reserve < config2->apply_empty_reserve) HGOTO_DONE(-1);
+    if(config1->apply_empty_reserve > config2->apply_empty_reserve) HGOTO_DONE(1);
+
+    if(config1->empty_reserve < config2->empty_reserve) HGOTO_DONE(-1);
+    if(config1->empty_reserve > config2->empty_reserve) HGOTO_DONE(1);
+
+    if(config1->dirty_bytes_threshold < config2->dirty_bytes_threshold) HGOTO_DONE(-1);
+    if(config1->dirty_bytes_threshold > config2->dirty_bytes_threshold) HGOTO_DONE(1);
+
+    if(config1->metadata_write_strategy < config2->metadata_write_strategy) HGOTO_DONE(-1);
+    if(config1->metadata_write_strategy > config2->metadata_write_strategy) HGOTO_DONE(1);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__facc_cache_config_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__facc_cache_config_enc
+ *
+ * Purpose:        Callback routine which is called whenever the default
+ *                 cache config property in the file creation property list is
+ *                 encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 August 09, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__facc_cache_config_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5AC_cache_config_t *config = (const H5AC_cache_config_t *)value; /* Create local aliases for values */
+    uint8_t **pp = (uint8_t **)_pp;
+    unsigned enc_size;      /* Size of encoded property */
+    uint64_t enc_value;         /* Property to encode */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(value);
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+
+    if(NULL != *pp) {
+        /* Encode type sizes (as a safety check) */
+        *(*pp)++ = (uint8_t)sizeof(unsigned);
+        *(*pp)++ = (uint8_t)sizeof(double);
+
+        /* int */
+        INT32ENCODE(*pp, (int32_t)config->version);
+
+        H5_ENCODE_UNSIGNED(*pp, config->rpt_fcn_enabled);
+
+        H5_ENCODE_UNSIGNED(*pp, config->open_trace_file);
+
+        H5_ENCODE_UNSIGNED(*pp, config->close_trace_file);
+
+        HDmemcpy(*pp, (const uint8_t *)(config->trace_file_name), (size_t)(H5AC__MAX_TRACE_FILE_NAME_LEN + 1));
+        *pp += H5AC__MAX_TRACE_FILE_NAME_LEN + 1;
+
+        H5_ENCODE_UNSIGNED(*pp, config->evictions_enabled);
+
+        H5_ENCODE_UNSIGNED(*pp, config->set_initial_size);
+
+        enc_value = (uint64_t)config->initial_size;
+        enc_size = H5VM_limit_enc_size(enc_value);
+        HDassert(enc_size < 256);
+        *(*pp)++ = (uint8_t)enc_size;
+        UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+
+        H5_ENCODE_DOUBLE(*pp, config->min_clean_fraction);
+
+        enc_value = (uint64_t)config->max_size;
+        enc_size = H5VM_limit_enc_size(enc_value);
+        HDassert(enc_size < 256);
+        *(*pp)++ = (uint8_t)enc_size;
+        UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+
+        enc_value = (uint64_t)config->min_size;
+        enc_size = H5VM_limit_enc_size(enc_value);
+        HDassert(enc_size < 256);
+        *(*pp)++ = (uint8_t)enc_size;
+        UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+
+        /* long int */
+        INT64ENCODE(*pp, (int64_t)config->epoch_length);
+
+        /* enum */
+        *(*pp)++ = (uint8_t)config->incr_mode;
+
+        H5_ENCODE_DOUBLE(*pp, config->lower_hr_threshold);
+
+        H5_ENCODE_DOUBLE(*pp, config->increment);
+
+        H5_ENCODE_UNSIGNED(*pp, config->apply_max_increment);
+
+        enc_value = (uint64_t)config->max_increment;
+        enc_size = H5VM_limit_enc_size(enc_value);
+        HDassert(enc_size < 256);
+        *(*pp)++ = (uint8_t)enc_size;
+        UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+
+        /* enum */
+        *(*pp)++ = (uint8_t)config->flash_incr_mode;
+
+        H5_ENCODE_DOUBLE(*pp, config->flash_multiple);
+
+        H5_ENCODE_DOUBLE(*pp, config->flash_threshold);
+
+        /* enum */
+        *(*pp)++ = (uint8_t)config->decr_mode;
+
+        H5_ENCODE_DOUBLE(*pp, config->upper_hr_threshold);
+
+        H5_ENCODE_DOUBLE(*pp, config->decrement);
+
+        H5_ENCODE_UNSIGNED(*pp, config->apply_max_decrement);
+
+        enc_value = (uint64_t)config->max_decrement;
+        enc_size = H5VM_limit_enc_size(enc_value);
+        HDassert(enc_size < 256);
+        *(*pp)++ = (uint8_t)enc_size;
+        UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+
+        /* int */
+        INT32ENCODE(*pp, (int32_t)config->epochs_before_eviction);
+
+        H5_ENCODE_UNSIGNED(*pp, config->apply_empty_reserve);
+
+        H5_ENCODE_DOUBLE(*pp, config->empty_reserve);
+
+        /* unsigned */
+        UINT32ENCODE(*pp, (uint32_t)config->dirty_bytes_threshold);
+
+        /* int */
+        INT32ENCODE(*pp, (int32_t)config->metadata_write_strategy);
+    } /* end if */
+
+    /* Compute encoded size of variably-encoded values */
+    enc_value = (uint64_t)config->initial_size;
+    *size += 1 + H5VM_limit_enc_size(enc_value);
+    enc_value = (uint64_t)config->max_size;
+    *size += 1 + H5VM_limit_enc_size(enc_value);
+    enc_value = (uint64_t)config->min_size;
+    *size += 1 + H5VM_limit_enc_size(enc_value);
+    enc_value = (uint64_t)config->max_increment;
+    *size += 1 + H5VM_limit_enc_size(enc_value);
+    enc_value = (uint64_t)config->max_decrement;
+    *size += 1 + H5VM_limit_enc_size(enc_value);
+
+    /* Compute encoded size of fixed-size values */
+    *size += (5 + (sizeof(unsigned) * 8) + (sizeof(double) * 8) +
+            (sizeof(int32_t) * 4) + sizeof(int64_t) +
+            H5AC__MAX_TRACE_FILE_NAME_LEN + 1);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__facc_cache_config_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__facc_cache_config_dec
+ *
+ * Purpose:        Callback routine which is called whenever the default
+ *                 cache config property in the file creation property list is
+ *                 decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 August 09, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__facc_cache_config_dec(const void **_pp, void *_value)
+{
+    H5AC_cache_config_t *config = (H5AC_cache_config_t *)_value;
+    const uint8_t **pp = (const uint8_t **)_pp;
+    unsigned enc_size;
+    uint64_t enc_value;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(config);
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+
+    /* Set property to default value */
+    HDmemcpy(config, &H5F_def_mdc_initCacheCfg_g, sizeof(H5AC_cache_config_t));
+
+    /* Decode type sizes */
+    enc_size = *(*pp)++;
+    if(enc_size != sizeof(unsigned))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "unsigned value can't be decoded")
+    enc_size = *(*pp)++;
+    if(enc_size != sizeof(double))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "double value can't be decoded")
+
+    /* int */
+    INT32DECODE(*pp, config->version);
+
+    H5_DECODE_UNSIGNED(*pp, config->rpt_fcn_enabled);
+
+    H5_DECODE_UNSIGNED(*pp, config->open_trace_file);
+
+    H5_DECODE_UNSIGNED(*pp, config->close_trace_file);
+
+    HDstrcpy(config->trace_file_name, (const char *)(*pp));
+    *pp += H5AC__MAX_TRACE_FILE_NAME_LEN + 1;
+
+    H5_DECODE_UNSIGNED(*pp, config->evictions_enabled);
+
+    H5_DECODE_UNSIGNED(*pp, config->set_initial_size);
+
+    enc_size = *(*pp)++;
+    HDassert(enc_size < 256);
+    UINT64DECODE_VAR(*pp, enc_value, enc_size);
+    config->initial_size = (size_t)enc_value;
+
+    H5_DECODE_DOUBLE(*pp, config->min_clean_fraction);
+
+    enc_size = *(*pp)++;
+    HDassert(enc_size < 256);
+    UINT64DECODE_VAR(*pp, enc_value, enc_size);
+    config->max_size = (size_t)enc_value;
+
+    enc_size = *(*pp)++;
+    HDassert(enc_size < 256);
+    UINT64DECODE_VAR(*pp, enc_value, enc_size);
+    config->min_size = (size_t)enc_value;
+
+    /* long int */
+    {
+        int64_t temp;
+        INT64DECODE(*pp, temp);
+        config->epoch_length = (long int)temp;
+    }
+    /* enum */
+    config->incr_mode = (enum H5C_cache_incr_mode)*(*pp)++;
+
+    H5_DECODE_DOUBLE(*pp, config->lower_hr_threshold);
+
+    H5_DECODE_DOUBLE(*pp, config->increment);
+
+    H5_DECODE_UNSIGNED(*pp, config->apply_max_increment);
+
+    enc_size = *(*pp)++;
+    HDassert(enc_size < 256);
+    UINT64DECODE_VAR(*pp, enc_value, enc_size);
+    config->max_increment = (size_t)enc_value;
+
+    /* enum */
+    config->flash_incr_mode = (enum H5C_cache_flash_incr_mode)*(*pp)++;
+
+    H5_DECODE_DOUBLE(*pp, config->flash_multiple);
+
+    H5_DECODE_DOUBLE(*pp, config->flash_threshold);
+
+    /* enum */
+    config->decr_mode = (enum H5C_cache_decr_mode)*(*pp)++;
+
+    H5_DECODE_DOUBLE(*pp, config->upper_hr_threshold);
+
+    H5_DECODE_DOUBLE(*pp, config->decrement);
+
+    H5_DECODE_UNSIGNED(*pp, config->apply_max_decrement);
+
+    enc_size = *(*pp)++;
+    HDassert(enc_size < 256);
+    UINT64DECODE_VAR(*pp, enc_value, enc_size);
+    config->max_decrement = (size_t)enc_value;
+
+    /* int */
+    INT32DECODE(*pp, config->epochs_before_eviction);
+
+    H5_DECODE_UNSIGNED(*pp, config->apply_empty_reserve);
+
+    H5_DECODE_DOUBLE(*pp, config->empty_reserve);
+
+    /* unsigned */
+    UINT32DECODE(*pp, config->dirty_bytes_threshold);
+
+    /* int */
+    INT32DECODE(*pp, config->metadata_write_strategy);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__facc_cache_config_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__facc_fclose_degree_enc
+ *
+ * Purpose:        Callback routine which is called whenever the file close
+ *                 degree property in the file access property list
+ *                 is encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Wednesday, August 15, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__facc_fclose_degree_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5F_close_degree_t *fclose_degree = (const H5F_close_degree_t *)value; /* Create local alias for values */
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(fclose_degree);
+    HDassert(size);
+
+    if(NULL != *pp)
+        /* Encode file close degree */
+        *(*pp)++ = (uint8_t)*fclose_degree;
+
+    /* Size of file close degree */
+    (*size)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__facc_fclose_degree_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__facc_fclose_degree_dec
+ *
+ * Purpose:        Callback routine which is called whenever the file close
+ *                 degree property in the file access property list
+ *                 is decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Wednesday, August 15, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__facc_fclose_degree_dec(const void **_pp, void *_value)
+{
+    H5F_close_degree_t *fclose_degree = (H5F_close_degree_t *)_value;            /* File close degree */
+    const uint8_t **pp = (const uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(fclose_degree);
+
+    /* Decode file close degree */
+    *fclose_degree = (H5F_close_degree_t)*(*pp)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__facc_fclose_degree_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__facc_multi_type_enc
+ *
+ * Purpose:        Callback routine which is called whenever the multi VFD
+ *                 memory type property in the file access property list
+ *                 is encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Wednesday, August 15, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__facc_multi_type_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5FD_mem_t *type = (const H5FD_mem_t *)value; /* Create local alias for values */
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(type);
+    HDassert(size);
+
+    if(NULL != *pp)
+        /* Encode file close degree */
+        *(*pp)++ = (uint8_t)*type;
+
+    /* Size of multi VFD memory type */
+    (*size)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__facc_multi_type_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__facc_multi_type_dec
+ *
+ * Purpose:        Callback routine which is called whenever the multi VFD
+ *                 memory type property in the file access property list
+ *                 is decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Wednesday, August 15, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__facc_multi_type_dec(const void **_pp, void *_value)
+{
+    H5FD_mem_t *type = (H5FD_mem_t *)_value;            /* File close degree */
+    const uint8_t **pp = (const uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(type);
+
+    /* Decode multi VFD memory type */
+    *type = (H5FD_mem_t)*(*pp)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__facc_multi_type_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_core_write_tracking
+ *
+ * Purpose:	Enables/disables core VFD write tracking and page
+ *              aggregation size.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_core_write_tracking(hid_t plist_id, hbool_t is_enabled, size_t page_size)
+{
+    H5P_genplist_t *plist;        /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ibz", plist_id, is_enabled, page_size);
+
+    /* The page size cannot be zero */
+    if(page_size == 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "page_size cannot be zero")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set values */
+    if(H5P_set(plist, H5F_ACS_CORE_WRITE_TRACKING_FLAG_NAME, &is_enabled) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set core VFD write tracking flag")
+    if(H5P_set(plist, H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_NAME, &page_size) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set core VFD write tracking page size")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_core_write_tracking
+ *
+ * Purpose:	Gets information about core VFD write tracking and page
+ *              aggregation size.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_core_write_tracking(hid_t plist_id, hbool_t *is_enabled, size_t *page_size)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*b*z", plist_id, is_enabled, page_size);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get values */
+    if(is_enabled) {
+        if(H5P_get(plist, H5F_ACS_CORE_WRITE_TRACKING_FLAG_NAME, is_enabled) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get core VFD write tracking flag")
+    } /* end if */
+
+    if(page_size) {
+        if(H5P_get(plist, H5F_ACS_CORE_WRITE_TRACKING_PAGE_SIZE_NAME, page_size) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get core VFD write tracking page size")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_metadata_read_attempts
+ *
+ * Purpose:	Sets the # of read attempts in the file access property list
+ *		when reading metadata with checksum.
+ *		The # of read attempts set via this routine will only apply
+ *		when opening a file with SWMR access. 
+ *		The # of read attempts set via this routine does not have 
+ *		any effect when opening a file with non-SWMR access; for this
+ *		case, the # of read attempts will be always be 1.
+ *	
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; Sept 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_metadata_read_attempts(hid_t plist_id, unsigned attempts)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "iIu", plist_id, attempts);
+
+    /* Cannot set the # of attempts to 0 */
+    if(attempts == 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "number of metadatata read attempts must be greater than 0");
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set values */
+    if(H5P_set(plist, H5F_ACS_METADATA_READ_ATTEMPTS_NAME, &attempts) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set # of metadata read attempts")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Pset_metadata_read_attempts() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_metadata_read_attempts
+ *
+ * Purpose:	Returns the # of metadata read attempts set in the file access property list. 
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; Sept 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_metadata_read_attempts(hid_t plist_id, unsigned *attempts/*out*/)
+{
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE2("e", "ix", plist_id, attempts);
+
+    /* Get values */
+    if(attempts) {
+        H5P_genplist_t *plist;              /* Property list pointer */
+
+        /* Get the plist structure */
+        if(NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_ACCESS)))
+            HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+	/* Get the # of read attempts set */
+        if(H5P_get(plist, H5F_ACS_METADATA_READ_ATTEMPTS_NAME, attempts) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get the number of metadata read attempts")
+
+	/* If not set, return the default value */
+	if(*attempts == H5F_ACS_METADATA_READ_ATTEMPTS_DEF)	/* 0 */
+	    *attempts = H5F_METADATA_READ_ATTEMPTS;
+    } /* end if */
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_metadata_read_attempts() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_obj_flush_cb
+ *
+ * Purpose:	Sets the callback function to invoke and the user data when an
+ *		object flush occurs in the file.
+ *	
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; Dec 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_object_flush_cb(hid_t plist_id, H5F_flush_cb_t func, void *udata)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5F_object_flush_t flush_info;
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "ix*x", plist_id, func, udata);
+
+    /* Check if the callback function is NULL and the user data is non-NULL.
+     * This is almost certainly an error as the user data will not be used. */
+    if(!func && udata)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "callback is NULL while user data is not")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Update property list */
+    flush_info.func = func;
+    flush_info.udata = udata;
+
+    /* Set values */
+    if(H5P_set(plist, H5F_ACS_OBJECT_FLUSH_CB_NAME, &flush_info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set object flush callback")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Pset_obj_flush_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_obj_flush_cb
+ *
+ * Purpose:	Retrieves the callback function and user data set in the
+ *		property list for an object flush.
+ *	
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; Dec 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_object_flush_cb(hid_t plist_id, H5F_flush_cb_t *func, void **udata)
+{
+    H5P_genplist_t *plist;      /* Property list pointer */
+    H5F_object_flush_t flush_info;
+    herr_t ret_value = SUCCEED;   /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*x**x", plist_id, func, udata);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Retrieve the callback function and user data */
+    if(H5P_get(plist, H5F_ACS_OBJECT_FLUSH_CB_NAME, &flush_info) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get object flush callback")
+
+    /* Assign return value */
+    if(func)
+	*func = flush_info.func;
+    if(udata)
+	*udata = flush_info.udata;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Pget_obj_flush_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_mdc_log_options
+ *
+ * Purpose:	Set metadata cache log options.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_mdc_log_options(hid_t plist_id, hbool_t is_enabled, const char *location,
+                       hbool_t start_on_access)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    char *      tmp_location;           /* Working location pointer */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE4("e", "ib*sb", plist_id, is_enabled, location, start_on_access);
+
+    /* Check arguments */
+    if(H5P_DEFAULT == plist_id)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "can't modify default property list")
+    if(!location)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "location cannot be NULL")
+
+    /* Get the property list structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "plist_id is not a file access property list")
+
+    /* Get the current location string and free it */
+    if(H5P_get(plist, H5F_ACS_MDC_LOG_LOCATION_NAME, &tmp_location) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get current log location")
+    H5MM_xfree(tmp_location);
+
+    /* Make a copy of the passed-in location */
+    if(NULL == (tmp_location = H5MM_xstrdup(location)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy passed-in log location")
+
+    /* Set values */
+    if(H5P_set(plist, H5F_ACS_USE_MDC_LOGGING_NAME, &is_enabled) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set is_enabled flag")
+    if(H5P_set(plist, H5F_ACS_MDC_LOG_LOCATION_NAME, &tmp_location) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set log location")
+    if(H5P_set(plist, H5F_ACS_START_MDC_LOG_ON_ACCESS_NAME, &start_on_access) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set start_on_access flag")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pset_mdc_log_options() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_mdc_log_options
+ *
+ * Purpose:	Get metadata cache log options. 
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_mdc_log_options(hid_t plist_id, hbool_t *is_enabled, char *location,
+                       size_t *location_size, hbool_t *start_on_access)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    char *location_ptr;                 /* Pointer to location string */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "i*b*s*z*b", plist_id, is_enabled, location, location_size,
+             start_on_access);
+
+    /* Get the property list structure */
+    if(NULL == (plist = H5P_object_verify(plist_id, H5P_FILE_ACCESS)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "plist_id is not a file access property list")
+
+    /* Get simple values */
+    if(is_enabled)
+        if(H5P_get(plist, H5F_ACS_USE_MDC_LOGGING_NAME, is_enabled) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get log location")
+    if(start_on_access)
+        if(H5P_get(plist, H5F_ACS_START_MDC_LOG_ON_ACCESS_NAME, start_on_access) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get start_on_access flag")
+
+    /* Get the location */
+    if(location || location_size)
+        if(H5P_get(plist, H5F_ACS_MDC_LOG_LOCATION_NAME, &location_ptr) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get log location")
+
+    /* Copy log location to output buffer */
+    if(location_ptr && location)
+        HDmemcpy(location, location_ptr, *location_size);
+
+    /* Get location size, including terminating NULL */
+    if(location_size) {
+        if(location_ptr)
+            *location_size = HDstrlen(location_ptr) + 1;
+        else
+            *location_size = 0;
+    }
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Pget_mdc_log_options() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P_facc_mdc_log_location_enc
+ *
+ * Purpose:        Callback routine which is called whenever the metadata
+ *                 cache log location property in the file access property
+ *                 list is encoded.
+ *
+ * Return:         Success:     Non-negative
+ *                 Failure:     Negative
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P_facc_mdc_log_location_enc(const void *value, void **_pp, size_t *size)
+{
+    const char *log_location = *(const char * const *)value;
+    uint8_t **pp = (uint8_t **)_pp;
+    size_t len = 0;
+    uint64_t enc_value;
+    unsigned enc_size;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+
+    /* calculate prefix length */
+    if(NULL != log_location)
+        len = HDstrlen(log_location);
+
+    enc_value = (uint64_t)len;
+    enc_size = H5VM_limit_enc_size(enc_value);
+    HDassert(enc_size < 256);
+
+    if(NULL != *pp) {
+        /* encode the length of the prefix */
+        *(*pp)++ = (uint8_t)enc_size;
+        UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+
+        /* encode the prefix */
+        if(NULL != log_location) {
+            HDmemcpy(*(char **)pp, log_location, len);
+            *pp += len;
+        } /* end if */
+    } /* end if */
+
+    *size += (1 + enc_size);
+    if(NULL != log_location)
+        *size += len;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P_facc_mdc_log_location_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P_facc_mdc_log_location_dec
+ *
+ * Purpose:        Callback routine which is called whenever the metadata
+ *                 cache log location property in the file access property
+ *                 list is decoded.
+ *
+ * Return:         Success:     Non-negative
+ *                 Failure:     Negative
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P_facc_mdc_log_location_dec(const void **_pp, void *_value)
+{
+    char **log_location = (char **)_value;
+    const uint8_t **pp = (const uint8_t **)_pp;
+    size_t len;
+    uint64_t enc_value;                 /* Decoded property value */
+    unsigned enc_size;                  /* Size of encoded property */
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(log_location);
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+
+    /* Decode the size */
+    enc_size = *(*pp)++;
+    HDassert(enc_size < 256);
+
+    /* Decode the value */
+    UINT64DECODE_VAR(*pp, enc_value, enc_size);
+    len = enc_value;
+
+    if(0 != len) {
+        /* Make a copy of the user's prefix string */
+        if(NULL == (*log_location = (char *)H5MM_malloc(len + 1)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "memory allocation failed for prefix")
+        HDstrncpy(*log_location, *(const char **)pp, len);
+        (*log_location)[len] = '\0';
+
+        *pp += len;
+    } /* end if */
+    else
+        *log_location = NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_facc_mdc_log_location_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P_facc_mdc_log_location_del
+ *
+ * Purpose:     Frees memory used to store the metadata cache log location.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P_facc_mdc_log_location_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(value);
+
+    H5MM_xfree(*(void **)value);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P_facc_mdc_log_location_del() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P_facc_mdc_log_location_copy
+ *
+ * Purpose:     Creates a copy of the metadata cache log location string.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P_facc_mdc_log_location_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(value);
+
+    *(char **)value = H5MM_xstrdup(*(const char **)value);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P_facc_mdc_log_location_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P_facc_mdc_log_location_cmp
+ *
+ * Purpose:        Callback routine which is called whenever the metadata
+ *                 cache log location property in the file creation property
+ *                 list is compared.
+ *
+ * Return:         zero if VALUE1 and VALUE2 are equal, non zero otherwise.
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+H5P_facc_mdc_log_location_cmp(const void *value1, const void *value2, size_t H5_ATTR_UNUSED size)
+{
+    const char *pref1 = *(const char * const *)value1;
+    const char *pref2 = *(const char * const *)value2;
+    int ret_value = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(NULL == pref1 && NULL != pref2)
+        HGOTO_DONE(1);
+    if(NULL != pref1 && NULL == pref2)
+        HGOTO_DONE(-1);
+    if(NULL != pref1 && NULL != pref2)
+        ret_value = HDstrcmp(pref1, pref2);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P_facc_mdc_log_location_cmp() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P_facc_mdc_log_location_close
+ *
+ * Purpose:     Frees memory used to store the metadata cache log location
+ *              string
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P_facc_mdc_log_location_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+{
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(value);
+
+    H5MM_xfree(*(void **)value);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P_facc_mdc_log_location_close() */
 
diff --git a/src/H5Pfcpl.c b/src/H5Pfcpl.c
index a054471..d451982 100644
--- a/src/H5Pfcpl.c
+++ b/src/H5Pfcpl.c
@@ -27,7 +27,8 @@
 /****************/
 /* Module Setup */
 /****************/
-#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+#include "H5Pmodule.h"          /* This source code file is part of the H5P module */
 
 
 /***********/
@@ -49,32 +50,61 @@
 /* Definitions for the size of the file user block in bytes */
 #define H5F_CRT_USER_BLOCK_SIZE      sizeof(hsize_t)
 #define H5F_CRT_USER_BLOCK_DEF       0
+#define H5F_CRT_USER_BLOCK_ENC       H5P__encode_hsize_t
+#define H5F_CRT_USER_BLOCK_DEC       H5P__decode_hsize_t
 /* Definitions for the 1/2 rank for symbol table leaf nodes */
 #define H5F_CRT_SYM_LEAF_SIZE        sizeof(unsigned)
+#define H5F_CRT_SYM_LEAF_ENC         H5P__encode_unsigned
+#define H5F_CRT_SYM_LEAF_DEC         H5P__decode_unsigned
 /* Definitions for the 1/2 rank for btree internal nodes    */
 #define H5F_CRT_BTREE_RANK_SIZE      sizeof(unsigned[H5B_NUM_BTREE_ID])
 #define H5F_CRT_BTREE_RANK_DEF       {HDF5_BTREE_SNODE_IK_DEF,HDF5_BTREE_CHUNK_IK_DEF}
+#define H5F_CRT_BTREE_RANK_ENC       H5P__fcrt_btree_rank_enc
+#define H5F_CRT_BTREE_RANK_DEC       H5P__fcrt_btree_rank_dec
 /* Definitions for byte number in an address                */
 #define H5F_CRT_ADDR_BYTE_NUM_SIZE   sizeof(uint8_t)
 #define H5F_CRT_ADDR_BYTE_NUM_DEF    H5F_OBJ_ADDR_SIZE
+#define H5F_CRT_ADDR_BYTE_NUM_ENC    H5P__encode_uint8_t
+#define H5F_CRT_ADDR_BYTE_NUM_DEC    H5P__decode_uint8_t
 /* Definitions for byte number for object size              */
 #define H5F_CRT_OBJ_BYTE_NUM_SIZE     sizeof(uint8_t)
 #define H5F_CRT_OBJ_BYTE_NUM_DEF      H5F_OBJ_SIZE_SIZE
+#define H5F_CRT_OBJ_BYTE_NUM_ENC      H5P__encode_uint8_t
+#define H5F_CRT_OBJ_BYTE_NUM_DEC      H5P__decode_uint8_t
 /* Definitions for version number of the superblock         */
 #define H5F_CRT_SUPER_VERS_SIZE       sizeof(unsigned)
 #define H5F_CRT_SUPER_VERS_DEF        HDF5_SUPERBLOCK_VERSION_DEF
 /* Definitions for shared object header messages */
 #define H5F_CRT_SHMSG_NINDEXES_SIZE    sizeof(unsigned)
 #define H5F_CRT_SHMSG_NINDEXES_DEF     (0)
+#define H5F_CRT_SHMSG_NINDEXES_ENC     H5P__encode_unsigned
+#define H5F_CRT_SHMSG_NINDEXES_DEC     H5P__decode_unsigned
 #define H5F_CRT_SHMSG_INDEX_TYPES_SIZE sizeof(unsigned[H5O_SHMESG_MAX_NINDEXES])
 #define H5F_CRT_SHMSG_INDEX_TYPES_DEF  {0,0,0,0,0,0}
+#define H5F_CRT_SHMSG_INDEX_TYPES_ENC  H5P__fcrt_shmsg_index_types_enc
+#define H5F_CRT_SHMSG_INDEX_TYPES_DEC  H5P__fcrt_shmsg_index_types_dec
 #define H5F_CRT_SHMSG_INDEX_MINSIZE_SIZE sizeof(unsigned[H5O_SHMESG_MAX_NINDEXES])
 #define H5F_CRT_SHMSG_INDEX_MINSIZE_DEF {250,250,250,250,250,250}
+#define H5F_CRT_SHMSG_INDEX_MINSIZE_ENC H5P__fcrt_shmsg_index_minsize_enc
+#define H5F_CRT_SHMSG_INDEX_MINSIZE_DEC H5P__fcrt_shmsg_index_minsize_dec
 /* Definitions for shared object header list/btree phase change cutoffs */
 #define H5F_CRT_SHMSG_LIST_MAX_SIZE     sizeof(unsigned)
 #define H5F_CRT_SHMSG_LIST_MAX_DEF      (50)
+#define H5F_CRT_SHMSG_LIST_MAX_ENC      H5P__encode_unsigned
+#define H5F_CRT_SHMSG_LIST_MAX_DEC      H5P__decode_unsigned
 #define H5F_CRT_SHMSG_BTREE_MIN_SIZE    sizeof(unsigned)
 #define H5F_CRT_SHMSG_BTREE_MIN_DEF     (40)
+#define H5F_CRT_SHMSG_BTREE_MIN_ENC     H5P__encode_unsigned
+#define H5F_CRT_SHMSG_BTREE_MIN_DEC     H5P__decode_unsigned
+/* Definitions for file space handling strategy */
+#define H5F_CRT_FILE_SPACE_STRATEGY_SIZE       sizeof(unsigned)
+#define H5F_CRT_FILE_SPACE_STRATEGY_DEF        H5F_FILE_SPACE_STRATEGY_DEF
+#define H5F_CRT_FILE_SPACE_STRATEGY_ENC        H5P__encode_unsigned
+#define H5F_CRT_FILE_SPACE_STRATEGY_DEC        H5P__decode_unsigned
+#define H5F_CRT_FREE_SPACE_THRESHOLD_SIZE      sizeof(hsize_t)
+#define H5F_CRT_FREE_SPACE_THRESHOLD_DEF       H5F_FREE_SPACE_THRESHOLD_DEF
+#define H5F_CRT_FREE_SPACE_THRESHOLD_ENC       H5P__encode_hsize_t
+#define H5F_CRT_FREE_SPACE_THRESHOLD_DEC       H5P__decode_hsize_t
 
 
 /******************/
@@ -94,6 +124,14 @@
 /* Property class callbacks */
 static herr_t H5P_fcrt_reg_prop(H5P_genclass_t *pclass);
 
+/* property callbacks */
+static herr_t H5P__fcrt_btree_rank_enc(const void *value, void **_pp, size_t *size);
+static herr_t H5P__fcrt_btree_rank_dec(const void **_pp, void *value);
+static herr_t H5P__fcrt_shmsg_index_types_enc(const void *value, void **_pp, size_t *size);
+static herr_t H5P__fcrt_shmsg_index_types_dec(const void **_pp, void *value);
+static herr_t H5P__fcrt_shmsg_index_minsize_enc(const void *value, void **_pp, size_t *size);
+static herr_t H5P__fcrt_shmsg_index_minsize_dec(const void **_pp, void *value);
+
 
 /*********************/
 /* Package Variables */
@@ -128,6 +166,21 @@ const H5P_libclass_t H5P_CLS_FCRT[1] = {{
 /* Local Variables */
 /*******************/
 
+/* Property value defaults */
+static const hsize_t H5F_def_userblock_size_g = H5F_CRT_USER_BLOCK_DEF;    /* Default userblock size */
+static const unsigned H5F_def_sym_leaf_k_g = H5F_CRT_SYM_LEAF_DEF;         /* Default size for symbol table leaf nodes */
+static const unsigned H5F_def_btree_k_g[H5B_NUM_BTREE_ID] = H5F_CRT_BTREE_RANK_DEF;    /* Default 'K' values for B-trees in file */
+static const uint8_t H5F_def_sizeof_addr_g = H5F_CRT_ADDR_BYTE_NUM_DEF;     /* Default size of addresses in the file */
+static const uint8_t H5F_def_sizeof_size_g = H5F_CRT_OBJ_BYTE_NUM_DEF;      /* Default size of sizes in the file */
+static const unsigned H5F_def_superblock_ver_g = H5F_CRT_SUPER_VERS_DEF;   /* Default superblock version # */
+static const unsigned H5F_def_num_sohm_indexes_g    = H5F_CRT_SHMSG_NINDEXES_DEF;
+static const unsigned H5F_def_sohm_index_flags_g[H5O_SHMESG_MAX_NINDEXES]    = H5F_CRT_SHMSG_INDEX_TYPES_DEF;
+static const unsigned H5F_def_sohm_index_minsizes_g[H5O_SHMESG_MAX_NINDEXES] = H5F_CRT_SHMSG_INDEX_MINSIZE_DEF;
+static const unsigned H5F_def_sohm_list_max_g  = H5F_CRT_SHMSG_LIST_MAX_DEF;
+static const unsigned H5F_def_sohm_btree_min_g  = H5F_CRT_SHMSG_BTREE_MIN_DEF;
+static const unsigned H5F_def_file_space_strategy_g = H5F_CRT_FILE_SPACE_STRATEGY_DEF;
+static const hsize_t H5F_def_free_space_threshold_g = H5F_CRT_FREE_SPACE_THRESHOLD_DEF;
+
 
 

 /*-------------------------------------------------------------------------
@@ -144,59 +197,81 @@ const H5P_libclass_t H5P_CLS_FCRT[1] = {{
 static herr_t
 H5P_fcrt_reg_prop(H5P_genclass_t *pclass)
 {
-    hsize_t userblock_size = H5F_CRT_USER_BLOCK_DEF;    /* Default userblock size */
-    unsigned sym_leaf_k = H5F_CRT_SYM_LEAF_DEF;         /* Default size for symbol table leaf nodes */
-    unsigned btree_k[H5B_NUM_BTREE_ID] = H5F_CRT_BTREE_RANK_DEF;    /* Default 'K' values for B-trees in file */
-    uint8_t sizeof_addr = H5F_CRT_ADDR_BYTE_NUM_DEF;     /* Default size of addresses in the file */
-    uint8_t sizeof_size = H5F_CRT_OBJ_BYTE_NUM_DEF;      /* Default size of sizes in the file */
-    unsigned superblock_ver = H5F_CRT_SUPER_VERS_DEF;   /* Default superblock version # */
-    unsigned num_sohm_indexes    = H5F_CRT_SHMSG_NINDEXES_DEF;
-    unsigned sohm_index_flags[H5O_SHMESG_MAX_NINDEXES]    = H5F_CRT_SHMSG_INDEX_TYPES_DEF;
-    unsigned sohm_index_minsizes[H5O_SHMESG_MAX_NINDEXES] = H5F_CRT_SHMSG_INDEX_MINSIZE_DEF;
-    unsigned sohm_list_max  = H5F_CRT_SHMSG_LIST_MAX_DEF;
-    unsigned sohm_btree_min  = H5F_CRT_SHMSG_BTREE_MIN_DEF;
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
     /* Register the user block size */
-    if(H5P_register_real(pclass, H5F_CRT_USER_BLOCK_NAME, H5F_CRT_USER_BLOCK_SIZE, &userblock_size, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_CRT_USER_BLOCK_NAME, H5F_CRT_USER_BLOCK_SIZE, &H5F_def_userblock_size_g, 
+            NULL, NULL, NULL, H5F_CRT_USER_BLOCK_ENC, H5F_CRT_USER_BLOCK_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the 1/2 rank for symbol table leaf nodes */
-    if(H5P_register_real(pclass, H5F_CRT_SYM_LEAF_NAME, H5F_CRT_SYM_LEAF_SIZE, &sym_leaf_k, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_CRT_SYM_LEAF_NAME, H5F_CRT_SYM_LEAF_SIZE, &H5F_def_sym_leaf_k_g, 
+            NULL, NULL, NULL, H5F_CRT_SYM_LEAF_ENC, H5F_CRT_SYM_LEAF_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the 1/2 rank for btree internal nodes */
-    if(H5P_register_real(pclass, H5F_CRT_BTREE_RANK_NAME, H5F_CRT_BTREE_RANK_SIZE, btree_k, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_CRT_BTREE_RANK_NAME, H5F_CRT_BTREE_RANK_SIZE, H5F_def_btree_k_g, 
+            NULL, NULL, NULL, H5F_CRT_BTREE_RANK_ENC, H5F_CRT_BTREE_RANK_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the byte number for an address */
-    if(H5P_register_real(pclass, H5F_CRT_ADDR_BYTE_NUM_NAME, H5F_CRT_ADDR_BYTE_NUM_SIZE, &sizeof_addr, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_CRT_ADDR_BYTE_NUM_NAME, H5F_CRT_ADDR_BYTE_NUM_SIZE, &H5F_def_sizeof_addr_g, 
+            NULL, NULL, NULL, H5F_CRT_ADDR_BYTE_NUM_ENC, H5F_CRT_ADDR_BYTE_NUM_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the byte number for object size */
-    if(H5P_register_real(pclass, H5F_CRT_OBJ_BYTE_NUM_NAME, H5F_CRT_OBJ_BYTE_NUM_SIZE, &sizeof_size, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5F_CRT_OBJ_BYTE_NUM_NAME, H5F_CRT_OBJ_BYTE_NUM_SIZE, &H5F_def_sizeof_size_g, 
+            NULL, NULL, NULL, H5F_CRT_OBJ_BYTE_NUM_ENC, H5F_CRT_OBJ_BYTE_NUM_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the superblock version number */
-    if(H5P_register_real(pclass, H5F_CRT_SUPER_VERS_NAME, H5F_CRT_SUPER_VERS_SIZE, &superblock_ver, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5F_CRT_SUPER_VERS_NAME, H5F_CRT_SUPER_VERS_SIZE, &H5F_def_superblock_ver_g, 
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the shared OH message information */
-    if(H5P_register_real(pclass,H5F_CRT_SHMSG_NINDEXES_NAME, H5F_CRT_SHMSG_NINDEXES_SIZE, &num_sohm_indexes,NULL,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+    if(H5P_register_real(pclass, H5F_CRT_SHMSG_NINDEXES_NAME, H5F_CRT_SHMSG_NINDEXES_SIZE, &H5F_def_num_sohm_indexes_g,
+            NULL, NULL, NULL, H5F_CRT_SHMSG_NINDEXES_ENC, H5F_CRT_SHMSG_NINDEXES_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
-    if(H5P_register_real(pclass,H5F_CRT_SHMSG_INDEX_TYPES_NAME, H5F_CRT_SHMSG_INDEX_TYPES_SIZE, &sohm_index_flags,NULL,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+    if(H5P_register_real(pclass, H5F_CRT_SHMSG_INDEX_TYPES_NAME, H5F_CRT_SHMSG_INDEX_TYPES_SIZE, &H5F_def_sohm_index_flags_g,
+            NULL, NULL, NULL, H5F_CRT_SHMSG_INDEX_TYPES_ENC, H5F_CRT_SHMSG_INDEX_TYPES_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
-    if(H5P_register_real(pclass,H5F_CRT_SHMSG_INDEX_MINSIZE_NAME, H5F_CRT_SHMSG_INDEX_MINSIZE_SIZE, &sohm_index_minsizes,NULL,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+    if(H5P_register_real(pclass, H5F_CRT_SHMSG_INDEX_MINSIZE_NAME, H5F_CRT_SHMSG_INDEX_MINSIZE_SIZE, &H5F_def_sohm_index_minsizes_g,
+            NULL, NULL, NULL, H5F_CRT_SHMSG_INDEX_MINSIZE_ENC, H5F_CRT_SHMSG_INDEX_MINSIZE_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the shared OH cutoff size information */
-    if(H5P_register_real(pclass,H5F_CRT_SHMSG_LIST_MAX_NAME, H5F_CRT_SHMSG_LIST_MAX_SIZE, &sohm_list_max,NULL,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+    if(H5P_register_real(pclass, H5F_CRT_SHMSG_LIST_MAX_NAME, H5F_CRT_SHMSG_LIST_MAX_SIZE, &H5F_def_sohm_list_max_g,
+            NULL, NULL, NULL, H5F_CRT_SHMSG_LIST_MAX_ENC, H5F_CRT_SHMSG_LIST_MAX_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
-    if(H5P_register_real(pclass,H5F_CRT_SHMSG_BTREE_MIN_NAME, H5F_CRT_SHMSG_BTREE_MIN_SIZE, &sohm_btree_min,NULL,NULL,NULL,NULL,NULL,NULL,NULL)<0)
+    if(H5P_register_real(pclass, H5F_CRT_SHMSG_BTREE_MIN_NAME, H5F_CRT_SHMSG_BTREE_MIN_SIZE, &H5F_def_sohm_btree_min_g,
+            NULL, NULL, NULL, H5F_CRT_SHMSG_BTREE_MIN_ENC, H5F_CRT_SHMSG_BTREE_MIN_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
+    /* Register the file space handling strategy */
+    if(H5P_register_real(pclass, H5F_CRT_FILE_SPACE_STRATEGY_NAME, H5F_CRT_FILE_SPACE_STRATEGY_SIZE, &H5F_def_file_space_strategy_g, 
+            NULL, NULL, NULL, H5F_CRT_FILE_SPACE_STRATEGY_ENC, H5F_CRT_FILE_SPACE_STRATEGY_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+
+    /* Register the free space section threshold */
+    if(H5P_register_real(pclass, H5F_CRT_FREE_SPACE_THRESHOLD_NAME, H5F_CRT_FREE_SPACE_THRESHOLD_SIZE, &H5F_def_free_space_threshold_g, 
+            NULL, NULL, NULL, H5F_CRT_FREE_SPACE_THRESHOLD_ENC, H5F_CRT_FREE_SPACE_THRESHOLD_DEC, 
+            NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -204,59 +279,6 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5Pget_version
- *
- * Purpose:	Retrieves version information for various parts of a file.
- *
- *		SUPER:		The file super block.
- *		FREELIST:	The global free list.
- *		STAB:		The root symbol table entry.
- *		SHHDR:		Shared object headers.
- *
- *		Any (or even all) of the output arguments can be null
- *		pointers.
- *
- * Return:	Success:	Non-negative, version information is returned
- *				through the arguments.
- *
- *		Failure:	Negative
- *
- * Programmer:	Robb Matzke
- *		Wednesday, January  7, 1998
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5Pget_version(hid_t plist_id, unsigned *super/*out*/, unsigned *freelist/*out*/,
-    unsigned *stab/*out*/, unsigned *shhdr/*out*/)
-{
-    H5P_genplist_t *plist;      /* Property list pointer */
-    herr_t ret_value = SUCCEED;   /* Return value */
-
-    FUNC_ENTER_API(FAIL)
-    H5TRACE5("e", "ixxxx", plist_id, super, freelist, stab, shhdr);
-
-    /* Get the plist structure */
-    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_CREATE)))
-        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
-
-    /* Get values */
-    if(super)
-        if(H5P_get(plist, H5F_CRT_SUPER_VERS_NAME, super) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get superblock version")
-    if(freelist)
-        *freelist = HDF5_FREESPACE_VERSION;     /* (hard-wired) */
-    if(stab)
-        *stab = HDF5_OBJECTDIR_VERSION;         /* (hard-wired) */
-    if(shhdr)
-        *shhdr = HDF5_SHAREDHEADER_VERSION;     /* (hard-wired) */
-
-done:
-    FUNC_LEAVE_API(ret_value)
-} /* end H5Pget_version() */
-
-

-/*-------------------------------------------------------------------------
  * Function:	H5Pset_userblock
  *
  * Purpose:	Sets the userblock size field of a file creation property
@@ -663,6 +685,97 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:       H5P__fcrt_btree_rank_enc
+ *
+ * Purpose:        Callback routine which is called whenever the index storage
+ *                 btree in file creation property list is encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 August 7, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__fcrt_btree_rank_enc(const void *value, void **_pp, size_t *size)
+{
+    const unsigned *btree_k = (const unsigned *)value; /* Create local alias for values */
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(btree_k);
+    HDassert(size);
+
+    if(NULL != *pp) {
+        unsigned u;             /* Local index variable */
+
+        /* Encode the size of an unsigned*/
+        *(*pp)++ = (uint8_t)sizeof(unsigned);
+
+        /* Encode all the btree  */
+        for(u = 0 ; u < H5B_NUM_BTREE_ID; u++) {
+            /* Encode the left split value */
+            H5_ENCODE_UNSIGNED(*pp, *(const unsigned *)btree_k)
+            btree_k++;
+        } /* end for */
+    } /* end if */
+
+    /* Size of type flags values */
+    *size += 1 + (H5B_NUM_BTREE_ID * sizeof(unsigned));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__fcrt_btree_rank_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__fcrt_btree_rank_dec
+ *
+ * Purpose:        Callback routine which is called whenever the index storage
+ *                 btree in file creation property list is decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 August 7, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__fcrt_btree_rank_dec(const void **_pp, void *_value)
+{
+    unsigned *btree_k = (unsigned *)_value;
+    const uint8_t **pp = (const uint8_t **)_pp;
+    unsigned enc_size;                  /* Size of encoded property */
+    unsigned u;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(btree_k);
+
+    /* Decode the size */
+    enc_size = *(*pp)++;
+    if(enc_size != sizeof(unsigned))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "unsigned value can't be decoded")
+
+    /* Decode all the type flags */
+    for(u = 0 ; u < H5B_NUM_BTREE_ID; u++)
+        H5_DECODE_UNSIGNED(*pp, btree_k[u])
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__fcrt_btree_rank_dec() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5Pset_shared_mesg_nindexes
  *
  * Purpose:	Set the number of Shared Object Header Message (SOHM)
@@ -862,6 +975,192 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:       H5P__fcrt_shmsg_index_types_enc
+ *
+ * Purpose:        Callback routine which is called whenever the shared
+ *                 message indec types in file creation property list
+ *                 is encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 August 7, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__fcrt_shmsg_index_types_enc(const void *value, void **_pp, size_t *size)
+{
+    const unsigned *type_flags = (const unsigned *)value; /* Create local alias for values */
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(type_flags);
+    HDassert(size);
+
+    if(NULL != *pp) {
+        unsigned u;             /* Local index variable */
+
+        /* Encode the size of a double*/
+        *(*pp)++ = (uint8_t)sizeof(unsigned);
+
+        /* Encode all the type flags */
+        for(u = 0; u < H5O_SHMESG_MAX_NINDEXES; u++) {
+            /* Encode the left split value */
+            H5_ENCODE_UNSIGNED(*pp, *(const unsigned *)type_flags)
+            type_flags++;
+        } /* end for */
+    } /* end if */
+
+    /* Size of type flags values */
+    *size += 1 + (H5O_SHMESG_MAX_NINDEXES * sizeof(unsigned));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__fcrt_shmsg_index_types_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__fcrt_shmsg_index_types_dec
+ *
+ * Purpose:        Callback routine which is called whenever the shared
+ *                 message indec types in file creation property list
+ *                 is decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 August 7, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__fcrt_shmsg_index_types_dec(const void **_pp, void *_value)
+{
+    unsigned *type_flags = (unsigned *)_value;
+    const uint8_t **pp = (const uint8_t **)_pp;
+    unsigned enc_size;                  /* Size of encoded property */
+    unsigned u;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(type_flags);
+
+    /* Decode the size */
+    enc_size = *(*pp)++;
+    if(enc_size != sizeof(unsigned))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "unsigned value can't be decoded")
+
+    /* Decode all the type flags */
+    for(u = 0; u < H5O_SHMESG_MAX_NINDEXES; u++)
+        H5_DECODE_UNSIGNED(*pp, type_flags[u])
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__fcrt_shmsg_index_types_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__fcrt_shmsg_index_minsize_enc
+ *
+ * Purpose:        Callback routine which is called whenever the shared
+ *                 message index minsize in file creation property list
+ *                 is encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 August 7, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__fcrt_shmsg_index_minsize_enc(const void *value, void **_pp, size_t *size)
+{
+    const unsigned *minsizes = (const unsigned *)value; /* Create local alias for values */
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(minsizes);
+    HDassert(size);
+
+    if(NULL != *pp) {
+        unsigned u;             /* Local index variable */
+
+        /* Encode the size of a double*/
+        *(*pp)++ = (uint8_t)sizeof(unsigned);
+
+        /* Encode all the minsize values */
+        for(u = 0 ; u < H5O_SHMESG_MAX_NINDEXES; u++) {
+            /* Encode the left split value */
+            H5_ENCODE_UNSIGNED(*pp, *(const unsigned *)minsizes)
+            minsizes++;
+        } /* end for */
+    } /* end if */
+
+    /* Size of type flags values */
+    *size += 1 + (H5O_SHMESG_MAX_NINDEXES * sizeof(unsigned));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__fcrt_shmsg_index_minsize_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__fcrt_shmsg_index_minsize_dec
+ *
+ * Purpose:        Callback routine which is called whenever the shared
+ *                 message indec minsize in file creation property list
+ *                 is decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 August 7, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__fcrt_shmsg_index_minsize_dec(const void **_pp, void *_value)
+{
+    unsigned *minsizes = (unsigned *)_value;
+    const uint8_t **pp = (const uint8_t **)_pp;
+    unsigned enc_size;                  /* Size of encoded property */
+    unsigned u;                         /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(minsizes);
+
+    /* Decode the size */
+    enc_size = *(*pp)++;
+    if(enc_size != sizeof(unsigned))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "unsigned value can't be decoded")
+
+    /* Decode all the minsize values */
+    for(u = 0 ; u < H5O_SHMESG_MAX_NINDEXES; u++)
+        H5_DECODE_UNSIGNED(*pp, minsizes[u])
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__fcrt_shmsg_index_minsize_dec() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5Pset_shared_mesg_phase_change
  *
  * Purpose:	Sets the cutoff values for indexes storing shared object
@@ -961,3 +1260,88 @@ done:
     FUNC_LEAVE_API(ret_value)
 } /* end H5Pget_shared_mesg_phase_change() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pset_file_space
+ *
+ * Purpose:	Sets the strategy that the library employs in managing file space.
+ *		If strategy is zero, the property is not changed; the existing
+ *			strategy is retained.
+ *		Sets the threshold value that the file's free space
+ *			manager(s) will use to track free space sections.
+ *		If threshold is zero, the property is not changed; the existing
+ *			threshold is retained.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; June 10, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pset_file_space(hid_t plist_id, H5F_file_space_type_t strategy, hsize_t threshold)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "iFfh", plist_id, strategy, threshold);
+
+    if((unsigned)strategy >= H5F_FILE_SPACE_NTYPES)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid strategy")
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Set value(s), if non-zero */
+    if(strategy)
+	if(H5P_set(plist, H5F_CRT_FILE_SPACE_STRATEGY_NAME, &strategy) < 0)
+	    HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set file space strategy")
+    if(threshold)
+	if(H5P_set(plist, H5F_CRT_FREE_SPACE_THRESHOLD_NAME, &threshold) < 0)
+	    HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't set free-space threshold")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Pset_file_space() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5Pget_file_space
+ *
+ * Purpose:	Retrieves the strategy that the library uses in managing file space.
+ *		Retrieves the threshold value that the file's free space
+ *			managers use to track free space sections.
+ *
+ * Return:	Non-negative on success/Negative on failure
+ *
+ * Programmer:	Vailin Choi; June 10, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Pget_file_space(hid_t plist_id, H5F_file_space_type_t *strategy, hsize_t *threshold)
+{
+    H5P_genplist_t *plist;              /* Property list pointer */
+    herr_t      ret_value = SUCCEED;    /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("e", "i*Ff*h", plist_id, strategy, threshold);
+
+    /* Get the plist structure */
+    if(NULL == (plist = H5P_object_verify(plist_id,H5P_FILE_CREATE)))
+        HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
+
+    /* Get value(s) */
+    if(strategy)
+        if(H5P_get(plist, H5F_CRT_FILE_SPACE_STRATEGY_NAME, strategy) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get file space strategy")
+    if(threshold)
+        if(H5P_get(plist, H5F_CRT_FREE_SPACE_THRESHOLD_NAME, threshold) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get free-space threshold")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Pget_file_space() */
+
diff --git a/src/H5Pfmpl.c b/src/H5Pfmpl.c
index 3d1f9b2..de9fa3b 100644
--- a/src/H5Pfmpl.c
+++ b/src/H5Pfmpl.c
@@ -27,7 +27,8 @@
 /****************/
 /* Module Setup */
 /****************/
-#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+#include "H5Pmodule.h"          /* This source code file is part of the H5P module */
 
 
 /***********/
@@ -97,6 +98,14 @@ const H5P_libclass_t H5P_CLS_FMNT[1] = {{
 /*****************************/
 
 
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* Property value defaults */
+static const hbool_t H5F_def_local_g = H5F_MNT_SYM_LOCAL_DEF;      /* Whether symlinks are local to file */
+
+
 

 /*-------------------------------------------------------------------------
  * Function:    H5P_fmnt_reg_prop
@@ -112,14 +121,14 @@ const H5P_libclass_t H5P_CLS_FMNT[1] = {{
 static herr_t
 H5P_fmnt_reg_prop(H5P_genclass_t *pclass)
 {
-    hbool_t local = H5F_MNT_SYM_LOCAL_DEF;      /* Whether symlinks are local to file */
     herr_t ret_value = SUCCEED;                 /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
     /* Register property of whether symlinks is local to file */
-    if(H5P_register_real(pclass, H5F_MNT_SYM_LOCAL_NAME, H5F_MNT_SYM_LOCAL_SIZE, &local, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
-         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
+    if(H5P_register_real(pclass, H5F_MNT_SYM_LOCAL_NAME, H5F_MNT_SYM_LOCAL_SIZE, &H5F_def_local_g, 
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
diff --git a/src/H5Pgcpl.c b/src/H5Pgcpl.c
index bf29f28..f028f7a 100644
--- a/src/H5Pgcpl.c
+++ b/src/H5Pgcpl.c
@@ -27,7 +27,9 @@
 /****************/
 /* Module Setup */
 /****************/
-#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+#include "H5Pmodule.h"          /* This source code file is part of the H5P module */
+
 
 /***********/
 /* Headers */
@@ -44,6 +46,12 @@
 /* Local Macros */
 /****************/
 
+/* ========= Group Creation properties ============ */
+#define H5G_CRT_GROUP_INFO_ENC    H5P__gcrt_group_info_enc
+#define H5G_CRT_GROUP_INFO_DEC    H5P__gcrt_group_info_dec
+#define H5G_CRT_LINK_INFO_ENC     H5P__gcrt_link_info_enc
+#define H5G_CRT_LINK_INFO_DEC     H5P__gcrt_link_info_dec
+
 
 /******************/
 /* Local Typedefs */
@@ -62,6 +70,12 @@
 /* Property class callbacks */
 static herr_t H5P__gcrt_reg_prop(H5P_genclass_t *pclass);
 
+/* Property callbacks */
+static herr_t H5P__gcrt_group_info_enc(const void *value, void **_pp, size_t *size);
+static herr_t H5P__gcrt_group_info_dec(const void **_pp, void *value);
+static herr_t H5P__gcrt_link_info_enc(const void *value, void **_pp, size_t *size);
+static herr_t H5P__gcrt_link_info_dec(const void **_pp, void *value);
+
 
 /*********************/
 /* Package Variables */
@@ -96,6 +110,10 @@ const H5P_libclass_t H5P_CLS_GCRT[1] = {{
 /* Local Variables */
 /*******************/
 
+/* Property value defaults */
+static const H5O_ginfo_t H5G_def_ginfo_g = H5G_CRT_GROUP_INFO_DEF;     /* Default group info settings */
+static const H5O_linfo_t H5G_def_linfo_g = H5G_CRT_LINK_INFO_DEF;      /* Default link info settings */
+
 
 

 /*-------------------------------------------------------------------------
@@ -112,18 +130,20 @@ const H5P_libclass_t H5P_CLS_GCRT[1] = {{
 static herr_t
 H5P__gcrt_reg_prop(H5P_genclass_t *pclass)
 {
-    H5O_ginfo_t ginfo = H5G_CRT_GROUP_INFO_DEF;     /* Default group info settings */
-    H5O_linfo_t linfo = H5G_CRT_LINK_INFO_DEF;      /* Default link info settings */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
 
     /* Register group info property */
-    if(H5P_register_real(pclass, H5G_CRT_GROUP_INFO_NAME, H5G_CRT_GROUP_INFO_SIZE, &ginfo, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5G_CRT_GROUP_INFO_NAME, H5G_CRT_GROUP_INFO_SIZE, &H5G_def_ginfo_g, 
+            NULL, NULL, NULL, H5G_CRT_GROUP_INFO_ENC, H5G_CRT_GROUP_INFO_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register link info property */
-    if(H5P_register_real(pclass, H5G_CRT_LINK_INFO_NAME, H5G_CRT_LINK_INFO_SIZE, &linfo, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5G_CRT_LINK_INFO_NAME, H5G_CRT_LINK_INFO_SIZE, &H5G_def_linfo_g, 
+            NULL, NULL, NULL, H5G_CRT_LINK_INFO_ENC, H5G_CRT_LINK_INFO_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
 done:
@@ -511,3 +531,178 @@ done:
     FUNC_LEAVE_API(ret_value)
 } /* end H5Pget_link_creation_order() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__gcrt_group_info_enc
+ *
+ * Purpose:        Callback routine which is called whenever the group
+ *                 property in the dataset access property list is
+ *                 encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 Monday, October 10, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5P__gcrt_group_info_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5O_ginfo_t *ginfo = (const H5O_ginfo_t *)value; /* Create local aliases for values */
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    if(NULL != *pp) {
+        UINT32ENCODE(*pp, ginfo->lheap_size_hint)
+        UINT16ENCODE(*pp, ginfo->max_compact)
+        UINT16ENCODE(*pp, ginfo->min_dense)
+        UINT16ENCODE(*pp, ginfo->est_num_entries)
+        UINT16ENCODE(*pp, ginfo->est_name_len)      
+    } /* end if */
+
+    *size += sizeof(uint16_t) * 4 + sizeof(uint32_t);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__gcrt_group_info_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__gcrt_group_info_dec
+ *
+ * Purpose:        Callback routine which is called whenever the group info
+ *                 property in the dataset access property list is
+ *                 decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 Monday, October 10, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5P__gcrt_group_info_dec(const void **_pp, void *_value)
+{
+    H5O_ginfo_t *ginfo = (H5O_ginfo_t *)_value;     /* Group info settings */
+    const uint8_t **pp = (const uint8_t **)_pp;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Set property to default value */
+    HDmemset(ginfo, 0, sizeof(H5O_ginfo_t));
+    *ginfo = H5G_def_ginfo_g;
+
+    UINT32DECODE(*pp, ginfo->lheap_size_hint)
+    UINT16DECODE(*pp, ginfo->max_compact)
+    UINT16DECODE(*pp, ginfo->min_dense)
+    UINT16DECODE(*pp, ginfo->est_num_entries)
+    UINT16DECODE(*pp, ginfo->est_name_len)      
+
+    /* Update fields */
+    if(ginfo->max_compact != H5G_CRT_GINFO_MAX_COMPACT || 
+            ginfo->min_dense != H5G_CRT_GINFO_MIN_DENSE)
+        ginfo->store_link_phase_change = TRUE;
+    else
+        ginfo->store_link_phase_change = FALSE;
+
+    if(ginfo->est_num_entries != H5G_CRT_GINFO_EST_NUM_ENTRIES || 
+            ginfo->est_name_len != H5G_CRT_GINFO_EST_NAME_LEN)
+        ginfo->store_est_entry_info = TRUE;
+    else
+        ginfo->store_est_entry_info = FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__gcrt_group_info_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__gcrt_link_info_enc
+ *
+ * Purpose:        Callback routine which is called whenever the link
+ *                 property in the dataset access property list is
+ *                 encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 Monday, October 10, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5P__gcrt_link_info_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5O_linfo_t *linfo = (const H5O_linfo_t *)value; /* Create local aliases for values */
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    if(NULL != *pp) {
+        unsigned crt_order_flags = 0;
+
+        crt_order_flags |= linfo->track_corder ? H5P_CRT_ORDER_TRACKED : 0;
+        crt_order_flags |= linfo->index_corder ? H5P_CRT_ORDER_INDEXED : 0;
+
+        /* Encode the size of unsigned*/
+        *(*pp)++ = (uint8_t)sizeof(unsigned);
+
+        /* Encode the value */
+        H5_ENCODE_UNSIGNED(*pp, crt_order_flags)
+    } /* end if */
+
+    *size += (1 + sizeof(unsigned));
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__gcrt_link_info_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__gcrt_link_info_dec
+ *
+ * Purpose:        Callback routine which is called whenever the link info
+ *                 property in the dataset access property list is
+ *                 decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 Monday, October 10, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5P__gcrt_link_info_dec(const void **_pp, void *_value)
+{
+    H5O_linfo_t *linfo = (H5O_linfo_t *)_value;  /* Link info settings */
+    const uint8_t **pp = (const uint8_t **)_pp;
+    unsigned crt_order_flags;
+    unsigned enc_size;
+    herr_t ret_value = SUCCEED;                 /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    enc_size = *(*pp)++;
+    if(enc_size != sizeof(unsigned))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "unsigned value can't be decoded")
+
+    /* Set property to default value */
+    HDmemset(linfo, 0, sizeof(H5O_linfo_t));
+    *linfo = H5G_def_linfo_g;
+
+    H5_DECODE_UNSIGNED(*pp, crt_order_flags)
+
+    /* Update fields */
+    linfo->track_corder = (hbool_t)((crt_order_flags & H5P_CRT_ORDER_TRACKED) ? TRUE : FALSE);
+    linfo->index_corder = (hbool_t)((crt_order_flags & H5P_CRT_ORDER_INDEXED) ? TRUE : FALSE);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__gcrt_link_info_dec() */
+
diff --git a/src/H5Pint.c b/src/H5Pint.c
index abd204e..69b2791 100644
--- a/src/H5Pint.c
+++ b/src/H5Pint.c
@@ -22,10 +22,7 @@
 /* Module Setup */
 /****************/
 
-#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5P_init_interface
+#include "H5Pmodule.h"          /* This source code file is part of the H5P module */
 
 
 /***********/
@@ -79,6 +76,22 @@ typedef struct {
     int cmp_value;              /* Value from property comparison */
 } H5P_plist_cmp_ud_t;
 
+/* Typedef for property list set/poke callbacks */
+typedef struct {
+    const void *value;          /* Pointer to value to set */
+} H5P_prop_set_ud_t;
+
+/* Typedef for property list get/peek callbacks */
+typedef struct {
+    void *value;                /* Pointer for retrieved value */
+} H5P_prop_get_ud_t;
+
+/* Typedef for H5P__do_prop() callbacks */
+typedef herr_t (*H5P_do_plist_op_t)(H5P_genplist_t *plist, const char *name, H5P_genprop_t *prop,
+    void *udata);
+typedef herr_t (*H5P_do_pclass_op_t)(H5P_genplist_t *plist, const char *name, H5P_genprop_t *prop,
+    void *udata);
+
 
 /********************/
 /* Local Prototypes */
@@ -88,6 +101,8 @@ typedef struct {
 static H5P_genprop_t *H5P_dup_prop(H5P_genprop_t *oprop, H5P_prop_within_t type);
 static herr_t H5P_free_prop(H5P_genprop_t *prop);
 static int H5P_cmp_prop(const H5P_genprop_t *prop1, const H5P_genprop_t *prop2);
+static herr_t H5P__do_prop(H5P_genplist_t *plist, const char *name, H5P_do_plist_op_t plist_op, 
+    H5P_do_pclass_op_t pclass_op, void *udata);
 
 
 /*********************/
@@ -96,7 +111,7 @@ static int H5P_cmp_prop(const H5P_genprop_t *prop1, const H5P_genprop_t *prop2);
 
 /*
  * Predefined property list classes. These are initialized at runtime by
- * H5P_init_interface() in this source file.
+ * H5P__init_package() in this source file.
  */
 hid_t H5P_CLS_ROOT_ID_g                         = FAIL;
 H5P_genclass_t *H5P_CLS_ROOT_g                  = NULL;
@@ -135,7 +150,7 @@ H5P_genclass_t *H5P_CLS_STRING_CREATE_g         = NULL;
 
 /*
  * Predefined property lists for each predefined class. These are initialized
- * at runtime by H5P_init_interface() in this source file.
+ * at runtime by H5P__init_package() in this source file.
  */
 hid_t H5P_LST_FILE_CREATE_ID_g          = FAIL;
 hid_t H5P_LST_FILE_ACCESS_ID_g          = FAIL;
@@ -297,7 +312,7 @@ H5FL_DEFINE_STATIC(H5P_genplist_t);
 /* Generic Property Class ID class */
 static const H5I_class_t H5I_GENPROPCLS_CLS[1] = {{
     H5I_GENPROP_CLS,		/* ID class value */
-    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* Class flags */
     0,				/* # of reserved IDs for class */
     (H5I_free_t)H5P_close_class	/* Callback routine for closing objects of this class */
 }};
@@ -305,96 +320,24 @@ static const H5I_class_t H5I_GENPROPCLS_CLS[1] = {{
 /* Generic Property List ID class */
 static const H5I_class_t H5I_GENPROPLST_CLS[1] = {{
     H5I_GENPROP_LST,		/* ID class value */
-    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* Class flags */
     0,				/* # of reserved IDs for class */
     (H5I_free_t)H5P_close	/* Callback routine for closing objects of this class */
 }};
 
 
 

-/*--------------------------------------------------------------------------
- NAME
-    H5P_do_prop_cb1
- PURPOSE
-    Internal routine to call a property list callback routine and update
-    the property list accordingly.
- USAGE
-    herr_t H5P_do_prop_cb1(slist,prop,cb)
-        H5SL_t *slist;          IN/OUT: Skip list to hold changed properties
-        H5P_genprop_t *prop;    IN: Property to call callback for
-        H5P_prp_cb1_t *cb;      IN: Callback routine to call
- RETURNS
-    Returns non-negative on success, negative on failure.
- DESCRIPTION
-        Calls the callback routine passed in.  If the callback routine changes
-    the property value, then the property is duplicated and added to skip list.
-
- GLOBAL VARIABLES
- COMMENTS, BUGS, ASSUMPTIONS
- EXAMPLES
- REVISION LOG
---------------------------------------------------------------------------*/
-static herr_t
-H5P_do_prop_cb1(H5SL_t *slist, H5P_genprop_t *prop, H5P_prp_cb1_t cb)
-{
-    void *tmp_value=NULL;       /* Temporary value buffer */
-    H5P_genprop_t *pcopy=NULL;  /* Copy of property to insert into skip list */
-    herr_t ret_value=SUCCEED;   /* Return value */
-
-    FUNC_ENTER_NOAPI_NOINIT
-
-    /* Allocate space for a temporary copy of the property value */
-    if(NULL == (tmp_value = H5MM_malloc(prop->size)))
-        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for temporary property value")
-    HDmemcpy(tmp_value,prop->value,prop->size);
-
-    /* Call "type 1" callback ('create', 'copy' or 'close') */
-    if(cb(prop->name,prop->size,tmp_value) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL,"Property callback failed")
-
-    /* Check if the property value changed */
-    if((prop->cmp)(tmp_value,prop->value,prop->size)) {
-        /* Make a copy of the class's property */
-        if((pcopy=H5P_dup_prop(prop,H5P_PROP_WITHIN_LIST)) == NULL)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL,"Can't copy property")
-
-        /* Copy the changed value into the new property */
-        HDmemcpy(pcopy->value,tmp_value,prop->size);
-
-        /* Insert the changed property into the property list */
-        if(H5P_add_prop(slist,pcopy) < 0)
-            HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL,"Can't insert property into skip list")
-    } /* end if */
-
-done:
-    /* Release the temporary value buffer */
-    if(tmp_value!=NULL)
-        H5MM_xfree(tmp_value);
-
-    /* Cleanup on failure */
-    if(ret_value<0) {
-        if(pcopy!=NULL)
-            H5P_free_prop(pcopy);
-    } /* end if */
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_do_prop_cb1() */
-
-

 /*-------------------------------------------------------------------------
  * Function:	H5P_init
  *
  * Purpose:	Initialize the interface from some other layer.
  *
  * Return:	Success:	non-negative
- *
  *		Failure:	negative
  *
  * Programmer:	Quincey Koziol
  *              Saturday, March 4, 2000
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -412,22 +355,22 @@ done:
 

 /*--------------------------------------------------------------------------
 NAME
-   H5P_init_interface -- Initialize interface-specific information
+   H5P__init_package -- Initialize interface-specific information
 USAGE
-    herr_t H5P_init_interface()
+    herr_t H5P__init_package()
 RETURNS
     Non-negative on success/Negative on failure
 DESCRIPTION
     Initializes any interface-specific data or routines.
 --------------------------------------------------------------------------*/
-static herr_t
-H5P_init_interface(void)
+herr_t
+H5P__init_package(void)
 {
     size_t tot_init;                    /* Total # of classes initialized */
     size_t pass_init;                   /* # of classes initialized in each pass */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /*
      * Initialize the Generic Property class & object groups.
@@ -490,16 +433,16 @@ H5P_init_interface(void)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_init_interface() */
+} /* end H5P__init_package() */
 
 

 /*--------------------------------------------------------------------------
  NAME
-    H5P_term_interface
+    H5P_term_package
  PURPOSE
     Terminate various H5P objects
  USAGE
-    void H5P_term_interface()
+    void H5P_term_package()
  RETURNS
     Non-negative on success/Negative on failure
  DESCRIPTION
@@ -511,14 +454,14 @@ done:
  REVISION LOG
 --------------------------------------------------------------------------*/
 int
-H5P_term_interface(void)
+H5P_term_package(void)
 {
     int	n = 0;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    if(H5_interface_initialize_g) {
-        int	nlist, nclass;
+    if(H5_PKG_INIT_VAR) {
+        int64_t	nlist, nclass;
 
         /* Destroy HDF5 library property classes & lists */
 
@@ -597,25 +540,89 @@ H5P_term_interface(void)
 
             n++; /*H5I*/
         } else {
-            /* Close public interface */
-            n += H5P__term_pub_interface();
-
-            /* Close deprecated interface */
-            n += H5P__term_deprec_interface();
-
             /* Destroy the property list and class id groups */
-            (void)H5I_dec_type_ref(H5I_GENPROP_LST);
-            n++; /*H5I*/
-            (void)H5I_dec_type_ref(H5I_GENPROP_CLS);
-            n++; /*H5I*/
+            n += (H5I_dec_type_ref(H5I_GENPROP_LST) > 0);
+            n += (H5I_dec_type_ref(H5I_GENPROP_CLS) > 0);
 
             /* Mark closed */
-            H5_interface_initialize_g = 0;
+            if(0 == n)
+                H5_PKG_INIT_VAR = FALSE;
         } /* end else */
     } /* end if */
 
     FUNC_LEAVE_NOAPI(n)
-} /* end H5P_term_interface() */
+} /* end H5P_term_package() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P__do_prop_cb1
+ PURPOSE
+    Internal routine to call a property list callback routine and update
+    the property list accordingly.
+ USAGE
+    herr_t H5P__do_prop_cb1(slist,prop,cb)
+        H5SL_t *slist;          IN/OUT: Skip list to hold changed properties
+        H5P_genprop_t *prop;    IN: Property to call callback for
+        H5P_prp_cb1_t *cb;      IN: Callback routine to call
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Calls the callback routine passed in.  If the callback routine changes
+    the property value, then the property is duplicated and added to skip list.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5P__do_prop_cb1(H5SL_t *slist, H5P_genprop_t *prop, H5P_prp_cb1_t cb)
+{
+    void *tmp_value = NULL;         /* Temporary value buffer */
+    H5P_genprop_t *pcopy = NULL;    /* Copy of property to insert into skip list */
+    herr_t ret_value = SUCCEED;     /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(slist);
+    HDassert(prop);
+    HDassert(prop->cmp);
+    HDassert(cb);
+
+    /* Allocate space for a temporary copy of the property value */
+    if(NULL == (tmp_value = H5MM_malloc(prop->size)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "memory allocation failed for temporary property value")
+    HDmemcpy(tmp_value, prop->value, prop->size);
+
+    /* Call "type 1" callback ('create', 'copy' or 'close') */
+    if(cb(prop->name, prop->size, tmp_value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL,"Property callback failed")
+
+    /* Make a copy of the class's property */
+    if(NULL == (pcopy = H5P_dup_prop(prop, H5P_PROP_WITHIN_LIST)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "Can't copy property")
+
+    /* Copy the changed value into the new property */
+    HDmemcpy(pcopy->value, tmp_value, prop->size);
+
+    /* Insert the changed property into the property list */
+    if(H5P_add_prop(slist, pcopy) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "Can't insert property into skip list")
+
+done:
+    /* Release the temporary value buffer */
+    if(tmp_value)
+        H5MM_xfree(tmp_value);
+
+    /* Cleanup on failure */
+    if(ret_value < 0)
+        if(pcopy)
+            H5P_free_prop(pcopy);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__do_prop_cb1() */
 
 

 /*--------------------------------------------------------------------------
@@ -838,10 +845,10 @@ H5P_copy_plist(const H5P_genplist_t *old_plist, hbool_t app_ref)
 
                 /* Only "copy" properties we haven't seen before */
                 if(nseen==0 || H5SL_search(seen,tmp->name) == NULL) {
-                    /* Call property creation callback, if it exists */
+                    /* Call property copy callback, if it exists */
                     if(tmp->copy) {
                         /* Call the callback & insert changed value into skip list (if necessary) */
-                        if(H5P_do_prop_cb1(new_plist->props,tmp,tmp->copy) < 0)
+                        if(H5P__do_prop_cb1(new_plist->props, tmp, tmp->copy) < 0)
                             HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL,"Can't create property")
                     } /* end if */
 
@@ -934,7 +941,7 @@ static H5P_genprop_t *
 H5P_dup_prop(H5P_genprop_t *oprop, H5P_prop_within_t type)
 {
     H5P_genprop_t *prop = NULL;      /* Pointer to new property copied */
-    H5P_genprop_t *ret_value;        /* Return value */
+    H5P_genprop_t *ret_value = NULL; /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1015,7 +1022,7 @@ done:
     Internal routine to create a new property
  USAGE
     H5P_genprop_t *H5P_create_prop(name,size,type,value,prp_create,prp_set,
-            prp_get,prp_delete,prp_close)
+                                   prp_get,prp_delete,prp_close, prp_encode, prp_decode)
         const char *name;       IN: Name of property to register
         size_t size;            IN: Size of property in bytes
         H5P_prop_within_t type; IN: Type of object the property will be inserted into
@@ -1024,6 +1031,8 @@ done:
                                     creation callback
         H5P_prp_set_func_t prp_set; IN: Function pointer to property set callback
         H5P_prp_get_func_t prp_get; IN: Function pointer to property get callback
+        H5P_prp_encode_func_t prp_encode; IN: Function pointer to property encode
+        H5P_prp_decode_func_t prp_decode; IN: Function pointer to property decode
         H5P_prp_delete_func_t prp_delete; IN: Function pointer to property delete callback
         H5P_prp_copy_func_t prp_copy; IN: Function pointer to property copy callback
         H5P_prp_compare_func_t prp_cmp; IN: Function pointer to property compare callback
@@ -1041,14 +1050,15 @@ done:
 --------------------------------------------------------------------------*/
 static H5P_genprop_t *
 H5P_create_prop(const char *name, size_t size, H5P_prop_within_t type,
-    const void *value,
-    H5P_prp_create_func_t prp_create, H5P_prp_set_func_t prp_set,
-    H5P_prp_get_func_t prp_get, H5P_prp_delete_func_t prp_delete,
+    const void *value, H5P_prp_create_func_t prp_create,
+    H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
+    H5P_prp_encode_func_t prp_encode, H5P_prp_decode_func_t prp_decode,
+    H5P_prp_delete_func_t prp_delete,
     H5P_prp_copy_func_t prp_copy, H5P_prp_compare_func_t prp_cmp,
     H5P_prp_close_func_t prp_close)
 {
-    H5P_genprop_t *prop = NULL;        /* Pointer to new property copied */
-    H5P_genprop_t *ret_value;        /* Return value */
+    H5P_genprop_t *prop = NULL;      /* Pointer to new property copied */
+    H5P_genprop_t *ret_value = NULL; /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1079,6 +1089,8 @@ H5P_create_prop(const char *name, size_t size, H5P_prop_within_t type,
     prop->create = prp_create;
     prop->set = prp_set;
     prop->get = prp_get;
+    prop->encode = prp_encode;
+    prop->decode = prp_decode;
     prop->del = prp_delete;
     prop->copy = prp_copy;
     /* Use custom comparison routine if available, otherwise default to memcmp() */
@@ -1166,7 +1178,7 @@ done:
 H5P_genprop_t *
 H5P__find_prop_plist(const H5P_genplist_t *plist, const char *name)
 {
-    H5P_genprop_t *ret_value;   /* Property pointer return value */
+    H5P_genprop_t *ret_value = NULL;    /* Return value */
 
     FUNC_ENTER_PACKAGE
 
@@ -1226,7 +1238,7 @@ done:
 static H5P_genprop_t *
 H5P_find_prop_pclass(H5P_genclass_t *pclass, const char *name)
 {
-    H5P_genprop_t *ret_value;   /* Property pointer return value */
+    H5P_genprop_t *ret_value = NULL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1536,8 +1548,8 @@ H5P_create_class(H5P_genclass_t *par_class, const char *name, H5P_plist_type_t t
     H5P_cls_copy_func_t cls_copy, void *copy_data,
     H5P_cls_close_func_t cls_close, void *close_data)
 {
-    H5P_genclass_t *pclass=NULL;   /* Property list class created */
-    H5P_genclass_t *ret_value;     /* return value */
+    H5P_genclass_t *pclass = NULL;      /* Property list class created */
+    H5P_genclass_t *ret_value = NULL;   /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -1631,10 +1643,10 @@ static H5P_genplist_t *
 H5P_create(H5P_genclass_t *pclass)
 {
     H5P_genclass_t *tclass;         /* Temporary class pointer */
-    H5P_genplist_t *plist=NULL;     /* New property list created */
+    H5P_genplist_t *plist = NULL;   /* New property list created */
     H5P_genprop_t *tmp;             /* Temporary pointer to parent class properties */
-    H5SL_t *seen=NULL;              /* Skip list to hold names of properties already seen */
-    H5P_genplist_t *ret_value;      /* Return value */
+    H5SL_t *seen = NULL;            /* Skip list to hold names of properties already seen */
+    H5P_genplist_t *ret_value = NULL;   /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1689,7 +1701,7 @@ H5P_create(H5P_genclass_t *pclass)
                     /* Call property creation callback, if it exists */
                     if(tmp->create) {
                         /* Call the callback & insert changed value into skip list (if necessary) */
-                        if(H5P_do_prop_cb1(plist->props,tmp,tmp->create) < 0)
+                        if(H5P__do_prop_cb1(plist->props, tmp, tmp->create) < 0)
                             HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, NULL,"Can't create property")
                     } /* end if */
 
@@ -1770,10 +1782,10 @@ done:
 hid_t
 H5P_create_id(H5P_genclass_t *pclass, hbool_t app_ref)
 {
-    H5P_genclass_t *tclass;         /* Temporary class pointer */
-    H5P_genplist_t *plist = NULL;   /* Property list created */
-    hid_t plist_id = FAIL;      /* Property list ID */
-    hid_t ret_value;            /* return value */
+    H5P_genclass_t *tclass;             /* Temporary class pointer */
+    H5P_genplist_t *plist = NULL;       /* Property list created */
+    hid_t plist_id = FAIL;              /* Property list ID */
+    hid_t ret_value = H5I_INVALID_HID;  /* return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1827,7 +1839,8 @@ done:
  PURPOSE
     Internal routine to register a new property in a property list class.
  USAGE
-    herr_t H5P_register_real(class, name, size, default, prp_create, prp_set, prp_get, prp_close)
+    herr_t H5P_register_real(class, name, size, default, prp_create, prp_set, 
+                             prp_get, prp_close, prp_encode, prp_decode)
         H5P_genclass_t *class;  IN: Property list class to modify
         const char *name;       IN: Name of property to register
         size_t size;            IN: Size of property in bytes
@@ -1837,6 +1850,8 @@ done:
                                     creation callback
         H5P_prp_set_func_t prp_set; IN: Function pointer to property set callback
         H5P_prp_get_func_t prp_get; IN: Function pointer to property get callback
+        H5P_prp_encode_func_t prp_encode; IN: Function pointer to property encode
+        H5P_prp_decode_func_t prp_decode; IN: Function pointer to property decode
         H5P_prp_delete_func_t prp_delete; IN: Function pointer to property delete callback
         H5P_prp_copy_func_t prp_copy; IN: Function pointer to property copy callback
         H5P_prp_compare_func_t prp_cmp; IN: Function pointer to property compare callback
@@ -1956,6 +1971,33 @@ done:
     'close' routine returns a negative value, the property list close
     routine returns an error value but the property list is still closed.
 
+        The 'encode' callback is called when a property list with this
+    property is being encoded.  H5P_prp_encode_func_t is defined as:
+        typedef herr_t (*H5P_prp_encode_func_t)(void *f, size_t *size, 
+        void *value, void *plist, uint8_t **buf);
+    where the parameters to the callback function are:
+        void *f;            IN: A fake file structure used to encode.
+        size_t *size;       IN/OUT: The size of the buffer to encode the property.
+        void *value;        IN: The value of the property being encoded.
+        void *plist;        IN: The property list structure.
+        uint8_t **buf;      OUT: The buffer that holds the encoded property;
+    The 'encode' routine returns the size needed to encode the property value
+    if the buffer passed in is NULL or the size is zero. Otherwise it encodes 
+    the property value into binary in buf.
+
+        The 'decode' callback is called when a property list with this
+    property is being decoded.  H5P_prp_encode_func_t is defined as:
+        typedef herr_t (*H5P_prp_encode_func_t)(void *f, size_t *size, 
+        void *value, void *plist, uint8_t **buf);
+    where the parameters to the callback function are:
+        void *f;            IN: A fake file structure used to decode.
+        size_t *size;       IN: H5_ATTR_UNUSED
+        void *value;        IN: H5_ATTR_UNUSED
+        void *plist;        IN: The property list structure.
+        uint8_t **buf;      IN: The buffer that holds the binary encoded property;
+    The 'decode' routine decodes the binary buffer passed in and transforms it into
+    corresponding property values that are set in the property list passed in.
+
  GLOBAL VARIABLES
  COMMENTS, BUGS, ASSUMPTIONS
         The 'set' callback function may be useful to range check the value being
@@ -1977,8 +2019,10 @@ done:
 --------------------------------------------------------------------------*/
 herr_t
 H5P_register_real(H5P_genclass_t *pclass, const char *name, size_t size,
-    const void *def_value, H5P_prp_create_func_t prp_create, H5P_prp_set_func_t prp_set,
-    H5P_prp_get_func_t prp_get, H5P_prp_delete_func_t prp_delete,
+    const void *def_value, H5P_prp_create_func_t prp_create,
+    H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
+    H5P_prp_encode_func_t prp_encode, H5P_prp_decode_func_t prp_decode,
+    H5P_prp_delete_func_t prp_delete,
     H5P_prp_copy_func_t prp_copy, H5P_prp_compare_func_t prp_cmp,
     H5P_prp_close_func_t prp_close)
 {
@@ -1998,7 +2042,9 @@ H5P_register_real(H5P_genclass_t *pclass, const char *name, size_t size,
         HGOTO_ERROR(H5E_PLIST, H5E_EXISTS, FAIL, "property already exists")
 
     /* Create property object from parameters */
-    if(NULL == (new_prop = H5P_create_prop(name, size, H5P_PROP_WITHIN_CLASS, def_value, prp_create, prp_set, prp_get, prp_delete, prp_copy, prp_cmp, prp_close)))
+    if(NULL == (new_prop = H5P_create_prop(name, size, H5P_PROP_WITHIN_CLASS, 
+            def_value, prp_create, prp_set, prp_get, prp_encode, prp_decode,
+            prp_delete, prp_copy, prp_cmp, prp_close)))
         HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL,"Can't create property")
 
     /* Insert property into property list class */
@@ -2036,6 +2082,8 @@ done:
                                     creation callback
         H5P_prp_set_func_t prp_set; IN: Function pointer to property set callback
         H5P_prp_get_func_t prp_get; IN: Function pointer to property get callback
+        H5P_prp_encode_func_t prp_encode; IN: Function pointer to property encode
+        H5P_prp_decode_func_t prp_decode; IN: Function pointer to property decode
         H5P_prp_delete_func_t prp_delete; IN: Function pointer to property delete callback
         H5P_prp_copy_func_t prp_copy; IN: Function pointer to property copy callback
         H5P_prp_compare_func_t prp_cmp; IN: Function pointer to property compare callback
@@ -2101,6 +2149,33 @@ done:
     negative value, the property value is returned and the property list get
     routine returns an error value.
 
+        The 'encode' callback is called when a property list with this
+    property is being encoded.  H5P_prp_encode_func_t is defined as:
+        typedef herr_t (*H5P_prp_encode_func_t)(void *f, size_t *size, 
+        void *value, void *plist, uint8_t **buf);
+    where the parameters to the callback function are:
+        void *f;            IN: A fake file structure used to encode.
+        size_t *size;       IN/OUT: The size of the buffer to encode the property.
+        void *value;        IN: The value of the property being encoded.
+        void *plist;        IN: The property list structure.
+        uint8_t **buf;      OUT: The buffer that holds the encoded property;
+    The 'encode' routine returns the size needed to encode the property value
+    if the buffer passed in is NULL or the size is zero. Otherwise it encodes 
+    the property value into binary in buf.
+
+        The 'decode' callback is called when a property list with this
+    property is being decoded.  H5P_prp_encode_func_t is defined as:
+        typedef herr_t (*H5P_prp_encode_func_t)(void *f, size_t *size, 
+        void *value, void *plist, uint8_t **buf);
+    where the parameters to the callback function are:
+        void *f;            IN: A fake file structure used to decode.
+        size_t *size;       IN: H5_ATTR_UNUSED
+        void *value;        IN: H5_ATTR_UNUSED
+        void *plist;        IN: The property list structure.
+        uint8_t **buf;      IN: The buffer that holds the binary encoded property;
+    The 'decode' routine decodes the binary buffer passed in and transforms it into
+    corresponding property values that are set in the property list passed in.
+
         The 'delete' callback is called when a property is deleted from a
     property list.  H5P_prp_del_func_t is defined as:
         typedef herr_t (*H5P_prp_del_func_t)(hid_t prop_id, const char *name,
@@ -2176,8 +2251,10 @@ done:
 --------------------------------------------------------------------------*/
 herr_t
 H5P_register(H5P_genclass_t **ppclass, const char *name, size_t size,
-    const void *def_value, H5P_prp_create_func_t prp_create, H5P_prp_set_func_t prp_set,
-    H5P_prp_get_func_t prp_get, H5P_prp_delete_func_t prp_delete,
+    const void *def_value, H5P_prp_create_func_t prp_create,
+    H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
+    H5P_prp_encode_func_t prp_encode, H5P_prp_decode_func_t prp_decode,
+    H5P_prp_delete_func_t prp_delete,
     H5P_prp_copy_func_t prp_copy, H5P_prp_compare_func_t prp_cmp,
     H5P_prp_close_func_t prp_close)
 {
@@ -2231,7 +2308,8 @@ H5P_register(H5P_genclass_t **ppclass, const char *name, size_t size,
     } /* end if */
 
     /* Really register the property in the class */
-    if(H5P_register_real(pclass, name, size, def_value, prp_create, prp_set, prp_get, prp_delete, prp_copy, prp_cmp, prp_close) < 0)
+    if(H5P_register_real(pclass, name, size, def_value, prp_create, prp_set, prp_get, 
+            prp_encode, prp_decode, prp_delete, prp_copy, prp_cmp, prp_close) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL, "can't register property")
 
     /* Update pointer to pointer to class, if a new one was generated */
@@ -2253,13 +2331,16 @@ done:
  PURPOSE
     Internal routine to insert a new property in a property list.
  USAGE
-    herr_t H5P_insert(plist, name, size, value, prp_set, prp_get, prp_close)
+    herr_t H5P_insert(plist, name, size, value, prp_set, prp_get, prp_close, 
+                      prp_encode, prp_decode)
         H5P_genplist_t *plist;  IN: Property list to add property to
         const char *name;       IN: Name of property to add
         size_t size;            IN: Size of property in bytes
         void *value;            IN: Pointer to the value for the property
         H5P_prp_set_func_t prp_set; IN: Function pointer to property set callback
         H5P_prp_get_func_t prp_get; IN: Function pointer to property get callback
+        H5P_prp_encode_func_t prp_encode; IN: Function pointer to property encode
+        H5P_prp_decode_func_t prp_decode; IN: Function pointer to property decode
         H5P_prp_delete_func_t prp_delete; IN: Function pointer to property delete callback
         H5P_prp_copy_func_t prp_copy; IN: Function pointer to property copy callback
         H5P_prp_compare_func_t prp_cmp; IN: Function pointer to property compare callback
@@ -2309,6 +2390,33 @@ done:
     negative value, the property value is returned and the property list get
     routine returns an error value.
 
+        The 'encode' callback is called when a property list with this
+    property is being encoded.  H5P_prp_encode_func_t is defined as:
+        typedef herr_t (*H5P_prp_encode_func_t)(void *f, size_t *size, 
+        void *value, void *plist, uint8_t **buf);
+    where the parameters to the callback function are:
+        void *f;            IN: A fake file structure used to encode.
+        size_t *size;       IN/OUT: The size of the buffer to encode the property.
+        void *value;        IN: The value of the property being encoded.
+        void *plist;        IN: The property list structure.
+        uint8_t **buf;      OUT: The buffer that holds the encoded property;
+    The 'encode' routine returns the size needed to encode the property value
+    if the buffer passed in is NULL or the size is zero. Otherwise it encodes 
+    the property value into binary in buf.
+
+        The 'decode' callback is called when a property list with this
+    property is being decoded.  H5P_prp_encode_func_t is defined as:
+        typedef herr_t (*H5P_prp_encode_func_t)(void *f, size_t *size, 
+        void *value, void *plist, uint8_t **buf);
+    where the parameters to the callback function are:
+        void *f;            IN: A fake file structure used to decode.
+        size_t *size;       IN: H5_ATTR_UNUSED
+        void *value;        IN: H5_ATTR_UNUSED
+        void *plist;        IN: The property list structure.
+        uint8_t **buf;      IN: The buffer that holds the binary encoded property;
+    The 'decode' routine decodes the binary buffer passed in and transforms it into
+    corresponding property values that are set in the property list passed in.
+
         The 'delete' callback is called when a property is deleted from a
     property list.  H5P_prp_del_func_t is defined as:
         typedef herr_t (*H5P_prp_del_func_t)(hid_t prop_id, const char *name,
@@ -2389,6 +2497,7 @@ done:
 herr_t
 H5P_insert(H5P_genplist_t *plist, const char *name, size_t size,
     void *value, H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
+    H5P_prp_encode_func_t prp_encode, H5P_prp_decode_func_t prp_decode,
     H5P_prp_delete_func_t prp_delete, H5P_prp_copy_func_t prp_copy,
     H5P_prp_compare_func_t prp_cmp, H5P_prp_close_func_t prp_close)
 {
@@ -2436,7 +2545,9 @@ H5P_insert(H5P_genplist_t *plist, const char *name, size_t size,
     /* Ok to add to property list */
 
     /* Create property object from parameters */
-    if(NULL == (new_prop = H5P_create_prop(name, size, H5P_PROP_WITHIN_LIST, value, NULL, prp_set, prp_get, prp_delete, prp_copy, prp_cmp, prp_close)))
+    if(NULL == (new_prop = H5P_create_prop(name, size, H5P_PROP_WITHIN_LIST, value, NULL, 
+            prp_set, prp_get, prp_encode, prp_decode, prp_delete, prp_copy, 
+            prp_cmp, prp_close)))
         HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL, "Can't create property")
 
     /* Insert property into property list class */
@@ -2457,285 +2568,572 @@ done:
 

 /*--------------------------------------------------------------------------
  NAME
-    H5P_set
+    H5P__do_prop
  PURPOSE
-    Internal routine to set a property's value in a property list.
+    Internal routine to perform an operation on a property in a property list
  USAGE
-    herr_t H5P_set(plist, name, value)
+    herr_t H5P__do_prop(plist, name, cb, udata)
         H5P_genplist_t *plist;  IN: Property list to find property in
         const char *name;       IN: Name of property to set
-        void *value;            IN: Pointer to the value for the property
+        H5P_do_plist_op_t plist_op;  IN: Pointer to the callback to invoke when the
+                                    property is found in the property list
+        H5P_do_pclass_op_t pclass_op; IN: Pointer to the callback to invoke when the
+                                    property is found in the property class
+        void *udata;            IN: Pointer to the user data for the callback
  RETURNS
     Returns non-negative on success, negative on failure.
  DESCRIPTION
-        Sets a new value for a property in a property list.  The property name
-    must exist or this routine will fail.  If there is a 'set' callback routine
-    registered for this property, the 'value' will be passed to that routine and
-    any changes to the 'value' will be used when setting the property value.
-    The information pointed at by the 'value' pointer (possibly modified by the
-    'set' callback) is copied into the property list value and may be changed
-    by the application making the H5Pset call without affecting the property
-    value.
-
-        If the 'set' callback routine returns an error, the property value will
-    not be modified.  This routine may not be called for zero-sized properties
-    and will return an error in that case.
-
+        Finds a property in a property list and calls the callback with it.
  GLOBAL VARIABLES
  COMMENTS, BUGS, ASSUMPTIONS
  EXAMPLES
  REVISION LOG
 --------------------------------------------------------------------------*/
-herr_t
-H5P_set(H5P_genplist_t *plist, const char *name, const void *value)
+static herr_t
+H5P__do_prop(H5P_genplist_t *plist, const char *name, H5P_do_plist_op_t plist_op, 
+    H5P_do_pclass_op_t pclass_op, void *udata)
 {
     H5P_genclass_t *tclass;     /* Temporary class pointer */
     H5P_genprop_t *prop;        /* Temporary property pointer */
-    herr_t      ret_value=SUCCEED;       /* Return value */
+    herr_t ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_STATIC
 
+    /* Sanity check */
     HDassert(plist);
     HDassert(name);
-    HDassert(value);
+    HDassert(plist_op);
+    HDassert(pclass_op);
 
     /* Check if the property has been deleted */
-    if(H5SL_search(plist->del,name)!=NULL)
+    if(NULL != H5SL_search(plist->del, name))
         HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "property doesn't exist")
 
     /* Find property in changed list */
     if(NULL != (prop = (H5P_genprop_t *)H5SL_search(plist->props, name))) {
-        /* Check for property size >0 */
-        if(prop->size==0)
-            HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "property has zero size")
-
-        /* Make a copy of the value and pass to 'set' callback */
-        if(prop->set!=NULL) {
-            void *tmp_value;            /* Temporary value for property */
-
-            /* Make a copy of the current value, in case the callback fails */
-            if(NULL==(tmp_value=H5MM_malloc(prop->size)))
-                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed temporary property value")
-            HDmemcpy(tmp_value,value,prop->size);
-
-            /* Call user's callback */
-            if((*(prop->set))(plist->plist_id,name,prop->size,tmp_value) < 0) {
-                H5MM_xfree(tmp_value);
-                HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't set property value")
-            } /* end if */
-
-            /* Copy new [possibly unchanged] value into property value */
-            HDmemcpy(prop->value,tmp_value,prop->size);
-
-            /* Free the temporary value buffer */
-            H5MM_xfree(tmp_value);
-        } /* end if */
-        /* No 'set' callback, just copy value */
-        else
-            HDmemcpy(prop->value,value,prop->size);
+        /* Call the 'found in propery list' callback */
+        if((*plist_op)(plist, name, prop, udata) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTOPERATE, FAIL, "can't operate on property")
     } /* end if */
     else {
         /*
          * Check if we should set class properties (up through list of parent classes also),
          * & make property 'set' callback.
          */
-        tclass=plist->pclass;
-        while(tclass!=NULL) {
-            if(tclass->nprops>0) {
+        tclass = plist->pclass;
+        while(NULL != tclass) {
+            if(tclass->nprops > 0) {
                 /* Find the property in the class */
-                if((prop = (H5P_genprop_t *)H5SL_search(tclass->props,name))!=NULL) {
-                    H5P_genprop_t *pcopy;  /* Copy of property to insert into skip list */
-
-                    /* Check for property size >0 */
-                    if(prop->size==0)
-                        HGOTO_ERROR(H5E_PLIST,H5E_BADVALUE,FAIL,"property has zero size")
-
-                    /* Make a copy of the value and pass to 'set' callback */
-                    if(prop->set!=NULL) {
-                        void *tmp_value;            /* Temporary value for property */
-
-                        /* Make a copy of the current value, in case the callback fails */
-                        if(NULL==(tmp_value=H5MM_malloc(prop->size)))
-                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed temporary property value")
-                        HDmemcpy(tmp_value,value,prop->size);
-
-                        /* Call user's callback */
-                        if((*(prop->set))(plist->plist_id,name,prop->size,tmp_value) < 0) {
-                            H5MM_xfree(tmp_value);
-                            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't set property value")
-                        } /* end if */
-
-                        if((prop->cmp)(tmp_value,prop->value,prop->size)) {
-                            /* Make a copy of the class's property */
-                            if((pcopy=H5P_dup_prop(prop,H5P_PROP_WITHIN_LIST)) == NULL)
-                                HGOTO_ERROR(H5E_PLIST,H5E_CANTCOPY,FAIL,"Can't copy property")
-
-                            /* Copy new value into property value */
-                            HDmemcpy(pcopy->value,tmp_value,pcopy->size);
-
-                            /* Insert the changed property into the property list */
-                            if(H5P_add_prop(plist->props,pcopy) < 0)
-                                HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL,"Can't insert changed property into skip list")
-                        } /* end if */
-
-                        /* Free the temporary value buffer */
-                        H5MM_xfree(tmp_value);
-                    } /* end if */
-                    /* No 'set' callback, just copy value */
-                    else {
-                        if((prop->cmp)(value,prop->value,prop->size)) {
-                            /* Make a copy of the class's property */
-                            if((pcopy=H5P_dup_prop(prop,H5P_PROP_WITHIN_LIST)) == NULL)
-                                HGOTO_ERROR(H5E_PLIST,H5E_CANTCOPY,FAIL,"Can't copy property")
-
-                            HDmemcpy(pcopy->value,value,pcopy->size);
-
-                            /* Insert the changed property into the property list */
-                            if(H5P_add_prop(plist->props,pcopy) < 0)
-                                HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL,"Can't insert changed property into skip list")
-                        } /* end if */
-                    } /* end else */
+                if(NULL != (prop = (H5P_genprop_t *)H5SL_search(tclass->props, name))) {
+                    /* Call the 'found in class' callback */
+                    if((*pclass_op)(plist, name, prop, udata) < 0)
+                        HGOTO_ERROR(H5E_PLIST, H5E_CANTOPERATE, FAIL, "can't operate on property")
 
                     /* Leave */
-                    HGOTO_DONE(SUCCEED);
-                } /* end while */
+                    break;
+                } /* end if */
             } /* end if */
 
             /* Go up to parent class */
-            tclass=tclass->parent;
+            tclass = tclass->parent;
         } /* end while */
 
         /* If we get this far, then it wasn't in the list of changed properties,
          * nor in the properties in the class hierarchy, indicate an error
          */
-        HGOTO_ERROR(H5E_PLIST,H5E_NOTFOUND,FAIL,"can't find property in skip list")
+        if(NULL == tclass)
+            HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "can't find property in skip list")
     } /* end else */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-}   /* H5P_set() */
+}   /* H5P__do_prop() */
 
 

 /*--------------------------------------------------------------------------
  NAME
-    H5P_exist_plist
+    H5P__poke_plist_cb
  PURPOSE
-    Internal routine to query the existance of a property in a property list.
+    Internal callback for H5P__do_prop, to overwrite a property's value in a property list.
  USAGE
-    htri_t H5P_exist_plist(plist, name)
-        const H5P_genplist_t *plist;  IN: Property list to check
-        const char *name;       IN: Name of property to check for
+    herr_t H5P__poke_plist_cb(plist, name, value)
+        H5P_genplist_t *plist;  IN: Property list to overwrite property in
+        const char *name;       IN: Name of property to overwrite
+        H5P_genprop_t *prop;    IN: Property to overwrite
+        void *udata;            IN: User data for operation
  RETURNS
-    Success: Positive if the property exists in the property list, zero
-            if the property does not exist.
-    Failure: negative value
+    Returns non-negative on success, negative on failure.
  DESCRIPTION
-        This routine checks if a property exists within a property list.
-
+    Overwrite a value for a property in a property list.
  GLOBAL VARIABLES
  COMMENTS, BUGS, ASSUMPTIONS
+    Called when the property is found in the property list.
  EXAMPLES
  REVISION LOG
 --------------------------------------------------------------------------*/
-htri_t
-H5P_exist_plist(const H5P_genplist_t *plist, const char *name)
+static herr_t
+H5P__poke_plist_cb(H5P_genplist_t *plist, const char *name, H5P_genprop_t *prop,
+    void *_udata)
 {
-    htri_t ret_value = FAIL;     /* return value */
+    H5P_prop_set_ud_t *udata = (H5P_prop_set_ud_t *)_udata;    /* User data for callback */
+    herr_t ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC
 
+    /* Sanity check */
     HDassert(plist);
     HDassert(name);
+    HDassert(prop);
 
-    /* Check for property in deleted property list */
-    if(H5SL_search(plist->del, name) != NULL)
-        ret_value = FALSE;
-    else {
-        /* Check for property in changed property list */
-        if(H5SL_search(plist->props, name) != NULL)
-            ret_value = TRUE;
-        else {
-            H5P_genclass_t *tclass;     /* Temporary class pointer */
-
-            tclass = plist->pclass;
-            while(tclass != NULL) {
-                if(H5SL_search(tclass->props, name) != NULL)
-                    HGOTO_DONE(TRUE)
-
-                /* Go up to parent class */
-                tclass = tclass->parent;
-            } /* end while */
+    /* Check for property size >0 */
+    if(0 == prop->size)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "property has zero size")
 
-            /* If we've reached here, we couldn't find the property */
-            ret_value = FALSE;
-        } /* end else */
-    } /* end else */
+    /* Overwrite value in property */
+    HDmemcpy(prop->value, udata->value, prop->size);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-}   /* H5P_exist_plist() */
+}   /* H5P__poke_plist_cb() */
 
 

 /*--------------------------------------------------------------------------
  NAME
-    H5P_exist_pclass
+    H5P__poke_pclass_cb
  PURPOSE
-    Internal routine to query the existance of a property in a property class.
+    Internal callback for H5P__do_prop, to overwrite a property's value in a property list.
  USAGE
-    herr_t H5P_exist_pclass(pclass, name)
-        H5P_genclass_t *pclass;  IN: Property class to check
-        const char *name;       IN: Name of property to check for
+    herr_t H5P__poke_pclass_cb(plist, name, value)
+        H5P_genplist_t *plist;  IN: Property list to overwrite property in
+        const char *name;       IN: Name of property to overwrite
+        H5P_genprop_t *prop;    IN: Property to overwrite
+        void *udata;            IN: User data for operation
  RETURNS
-    Success: Positive if the property exists in the property class, zero
-            if the property does not exist.
-    Failure: negative value
+    Returns non-negative on success, negative on failure.
  DESCRIPTION
-        This routine checks if a property exists within a property class.
-
+    Overwrite a value for a property in a property list.
  GLOBAL VARIABLES
  COMMENTS, BUGS, ASSUMPTIONS
+    Called when the property is found in the property class.
  EXAMPLES
  REVISION LOG
 --------------------------------------------------------------------------*/
-htri_t
-H5P_exist_pclass(H5P_genclass_t *pclass, const char *name)
+static herr_t
+H5P__poke_pclass_cb(H5P_genplist_t *plist, const char *name, H5P_genprop_t *prop,
+    void *_udata)
 {
-    htri_t ret_value = FAIL;     /* return value */
+    H5P_prop_set_ud_t *udata = (H5P_prop_set_ud_t *)_udata;    /* User data for callback */
+    H5P_genprop_t *pcopy = NULL;        /* Copy of property to insert into skip list */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC
 
-    HDassert(pclass);
+    /* Sanity check */
+    HDassert(plist);
     HDassert(name);
+    HDassert(prop);
+    HDassert(prop->cmp);
 
-    /* Check for property in property list */
-    if(H5SL_search(pclass->props, name) != NULL)
-        ret_value = TRUE;
-    else {
-        H5P_genclass_t *tclass;     /* Temporary class pointer */
+    /* Check for property size >0 */
+    if(0 == prop->size)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "property has zero size")
 
-        tclass = pclass->parent;
-        while(tclass != NULL) {
-            if(H5SL_search(tclass->props, name) != NULL)
-                HGOTO_DONE(TRUE)
+    /* Make a copy of the class's property */
+    if(NULL == (pcopy = H5P_dup_prop(prop, H5P_PROP_WITHIN_LIST)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "Can't copy property")
 
-            /* Go up to parent class */
-            tclass = tclass->parent;
-        } /* end while */
+    HDmemcpy(pcopy->value, udata->value, pcopy->size);
 
-        /* If we've reached here, we couldn't find the property */
-        ret_value = FALSE;
-    } /* end else */
+    /* Insert the changed property into the property list */
+    if(H5P_add_prop(plist->props, pcopy) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL,"Can't insert changed property into skip list")
 
 done:
+    /* Cleanup on failure */
+    if(ret_value < 0)
+        if(pcopy)
+            H5P_free_prop(pcopy);
+
     FUNC_LEAVE_NOAPI(ret_value)
-}   /* H5P_exist_pclass() */
+}   /* H5P__poke_pclass_cb() */
 
 

 /*--------------------------------------------------------------------------
  NAME
-    H5P_get_size_plist
+    H5P_poke
  PURPOSE
-    Internal routine to query the size of a property in a property list.
+    Internal routine to overwrite a property's value in a property list.
+ USAGE
+    herr_t H5P_poke(plist, name, value)
+        H5P_genplist_t *plist;  IN: Property list to find property in
+        const char *name;       IN: Name of property to overwrite
+        void *value;            IN: Pointer to the value for the property
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Overwrites a property in a property list (i.e. a "shallow" copy over
+    the property value).  The property name must exist or this routine will
+    fail.  If there is a setget' callback routine registered for this property,
+    it is _NOT_ called.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+        This routine may not be called for zero-sized properties and will
+    return an error in that case.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_poke(H5P_genplist_t *plist, const char *name, const void *value)
+{
+    H5P_prop_set_ud_t udata;    /* User data for callback */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(plist);
+    HDassert(name);
+    HDassert(value);
+
+    /* Find the property and set the value */
+    udata.value = value;
+    if(H5P__do_prop(plist, name, H5P__poke_plist_cb, H5P__poke_pclass_cb, &udata) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTOPERATE, FAIL, "can't operate on plist to overwrite value")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_poke() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P__set_plist_cb
+ PURPOSE
+    Internal callback for H5P__do_prop, to set a property's value in a property list.
+ USAGE
+    herr_t H5P__set_plist_cb(plist, name, value)
+        H5P_genplist_t *plist;  IN: Property list to set property in
+        const char *name;       IN: Name of property to set
+        H5P_genprop_t *prop;    IN: Property to set
+        void *udata;            IN: User data for operation
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Sets a new value for a property in a property list.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Called when the property is found in the property list.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5P__set_plist_cb(H5P_genplist_t *plist, const char *name, H5P_genprop_t *prop,
+    void *_udata)
+{
+    H5P_prop_set_ud_t *udata = (H5P_prop_set_ud_t *)_udata;    /* User data for callback */
+    void *tmp_value = NULL;     /* Temporary value for property */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(plist);
+    HDassert(name);
+    HDassert(prop);
+
+    /* Check for property size >0 */
+    if(0 == prop->size)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "property has zero size")
+
+    /* Make a copy of the value and pass to 'set' callback */
+    if(NULL != prop->set) {
+        /* Make a copy of the current value, in case the callback fails */
+        if(NULL == (tmp_value = H5MM_malloc(prop->size)))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "memory allocation failed temporary property value")
+        HDmemcpy(tmp_value, udata->value, prop->size);
+
+        /* Call user's callback */
+        if((*(prop->set))(plist->plist_id, name, prop->size, tmp_value) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't set property value")
+    } /* end if */
+    /* No 'set' callback, just copy value */
+    else
+        tmp_value = (void *)udata->value;       /* Casting away const OK -QAK */
+
+    /* Free any previous value for the property */
+    if(NULL != prop->del) {
+        /* Call user's 'delete' callback */
+        if((*(prop->del))(plist->plist_id, name, prop->size, prop->value) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTFREE, FAIL, "can't release property value")
+    } /* end if */
+
+    /* Copy new [possibly unchanged] value into property value */
+    HDmemcpy(prop->value, tmp_value, prop->size);
+
+done:
+    /* Free the temporary value buffer */
+    if(tmp_value != NULL && tmp_value != udata->value)
+        H5MM_xfree(tmp_value);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P__set_plist_cb() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P__set_pclass_cb
+ PURPOSE
+    Internal callback for H5P__do_prop, to set a property's value in a property list.
+ USAGE
+    herr_t H5P__set_pclass_cb(plist, name, value)
+        H5P_genplist_t *plist;  IN: Property list to set property in
+        const char *name;       IN: Name of property to set
+        H5P_genprop_t *prop;    IN: Property to set
+        void *udata;            IN: User data for operation
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+    Sets a new value for a property in a property list.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Called when the property is found in the property class.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5P__set_pclass_cb(H5P_genplist_t *plist, const char *name, H5P_genprop_t *prop,
+    void *_udata)
+{
+    H5P_prop_set_ud_t *udata = (H5P_prop_set_ud_t *)_udata;    /* User data for callback */
+    H5P_genprop_t *pcopy = NULL;        /* Copy of property to insert into skip list */
+    void *tmp_value = NULL;             /* Temporary value for property */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(plist);
+    HDassert(name);
+    HDassert(prop);
+    HDassert(prop->cmp);
+
+    /* Check for property size >0 */
+    if(0 == prop->size)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "property has zero size")
+
+    /* Make a copy of the value and pass to 'set' callback */
+    if(NULL != prop->set) {
+        /* Make a copy of the current value, in case the callback fails */
+        if(NULL == (tmp_value = H5MM_malloc(prop->size)))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "memory allocation failed temporary property value")
+        HDmemcpy(tmp_value, udata->value, prop->size);
+
+        /* Call user's callback */
+        if((*(prop->set))(plist->plist_id, name, prop->size, tmp_value) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't set property value")
+    } /* end if */
+    /* No 'set' callback, just copy value */
+    else
+        tmp_value = (void *)udata->value;       /* Casting away const OK -QAK */
+
+    /* Make a copy of the class's property */
+    if(NULL == (pcopy = H5P_dup_prop(prop, H5P_PROP_WITHIN_LIST)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "Can't copy property")
+
+    HDmemcpy(pcopy->value, tmp_value, pcopy->size);
+
+    /* Insert the changed property into the property list */
+    if(H5P_add_prop(plist->props, pcopy) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL,"Can't insert changed property into skip list")
+
+done:
+    /* Free the temporary value buffer */
+    if(tmp_value != NULL && tmp_value != udata->value)
+        H5MM_xfree(tmp_value);
+
+    /* Cleanup on failure */
+    if(ret_value < 0)
+        if(pcopy)
+            H5P_free_prop(pcopy);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P__set_pclass_cb() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_set
+ PURPOSE
+    Internal routine to set a property's value in a property list.
+ USAGE
+    herr_t H5P_set(plist, name, value)
+        H5P_genplist_t *plist;  IN: Property list to find property in
+        const char *name;       IN: Name of property to set
+        void *value;            IN: Pointer to the value for the property
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Sets a new value for a property in a property list.  The property name
+    must exist or this routine will fail.  If there is a 'set' callback routine
+    registered for this property, the 'value' will be passed to that routine and
+    any changes to the 'value' will be used when setting the property value.
+    The information pointed at by the 'value' pointer (possibly modified by the
+    'set' callback) is copied into the property list value and may be changed
+    by the application making the H5Pset call without affecting the property
+    value.
+
+        If the 'set' callback routine returns an error, the property value will
+    not be modified.  This routine may not be called for zero-sized properties
+    and will return an error in that case.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5P_set(H5P_genplist_t *plist, const char *name, const void *value)
+{
+    H5P_prop_set_ud_t udata;    /* User data for callback */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(plist);
+    HDassert(name);
+    HDassert(value);
+
+    /* Find the property and set the value */
+    udata.value = value;
+    if(H5P__do_prop(plist, name, H5P__set_plist_cb, H5P__set_pclass_cb, &udata) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTOPERATE, FAIL, "can't operate on plist to set value")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_set() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_exist_plist
+ PURPOSE
+    Internal routine to query the existance of a property in a property list.
+ USAGE
+    htri_t H5P_exist_plist(plist, name)
+        const H5P_genplist_t *plist;  IN: Property list to check
+        const char *name;       IN: Name of property to check for
+ RETURNS
+    Success: Positive if the property exists in the property list, zero
+            if the property does not exist.
+    Failure: negative value
+ DESCRIPTION
+        This routine checks if a property exists within a property list.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5P_exist_plist(const H5P_genplist_t *plist, const char *name)
+{
+    htri_t ret_value = FAIL;     /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(plist);
+    HDassert(name);
+
+    /* Check for property in deleted property list */
+    if(H5SL_search(plist->del, name) != NULL)
+        ret_value = FALSE;
+    else {
+        /* Check for property in changed property list */
+        if(H5SL_search(plist->props, name) != NULL)
+            ret_value = TRUE;
+        else {
+            H5P_genclass_t *tclass;     /* Temporary class pointer */
+
+            tclass = plist->pclass;
+            while(tclass != NULL) {
+                if(H5SL_search(tclass->props, name) != NULL)
+                    HGOTO_DONE(TRUE)
+
+                /* Go up to parent class */
+                tclass = tclass->parent;
+            } /* end while */
+
+            /* If we've reached here, we couldn't find the property */
+            ret_value = FALSE;
+        } /* end else */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_exist_plist() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_exist_pclass
+ PURPOSE
+    Internal routine to query the existance of a property in a property class.
+ USAGE
+    herr_t H5P_exist_pclass(pclass, name)
+        H5P_genclass_t *pclass;  IN: Property class to check
+        const char *name;       IN: Name of property to check for
+ RETURNS
+    Success: Positive if the property exists in the property class, zero
+            if the property does not exist.
+    Failure: negative value
+ DESCRIPTION
+        This routine checks if a property exists within a property class.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5P_exist_pclass(H5P_genclass_t *pclass, const char *name)
+{
+    htri_t ret_value = FAIL;     /* return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    HDassert(pclass);
+    HDassert(name);
+
+    /* Check for property in property list */
+    if(H5SL_search(pclass->props, name) != NULL)
+        ret_value = TRUE;
+    else {
+        H5P_genclass_t *tclass;     /* Temporary class pointer */
+
+        tclass = pclass->parent;
+        while(tclass != NULL) {
+            if(H5SL_search(tclass->props, name) != NULL)
+                HGOTO_DONE(TRUE)
+
+            /* Go up to parent class */
+            tclass = tclass->parent;
+        } /* end while */
+
+        /* If we've reached here, we couldn't find the property */
+        ret_value = FALSE;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_exist_pclass() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_get_size_plist
+ PURPOSE
+    Internal routine to query the size of a property in a property list.
  USAGE
     herr_t H5P_get_size_plist(plist, name)
         const H5P_genplist_t *plist;  IN: Property list to check
@@ -2960,6 +3358,16 @@ H5P_cmp_prop(const H5P_genprop_t *prop1, const H5P_genprop_t *prop2)
     if(prop1->get != NULL && prop2->get == NULL) HGOTO_DONE(1);
     if(prop1->get != prop2->get) HGOTO_DONE(-1);
 
+    /* Check if they both have the same 'encode' callback */
+    if(prop1->encode == NULL && prop2->encode != NULL) HGOTO_DONE(-1);
+    if(prop1->encode != NULL && prop2->encode == NULL) HGOTO_DONE(1);
+    if(prop1->encode != prop2->encode) HGOTO_DONE(-1);
+
+    /* Check if they both have the same 'decode' callback */
+    if(prop1->decode == NULL && prop2->decode != NULL) HGOTO_DONE(-1);
+    if(prop1->decode != NULL && prop2->decode == NULL) HGOTO_DONE(1);
+    if(prop1->decode != prop2->decode) HGOTO_DONE(-1);
+
     /* Check if they both have the same 'delete' callback */
     if(prop1->del == NULL && prop2->del != NULL) HGOTO_DONE(-1);
     if(prop1->del != NULL && prop2->del == NULL) HGOTO_DONE(1);
@@ -3269,7 +3677,7 @@ done:
 htri_t
 H5P_class_isa(const H5P_genclass_t *pclass1, const H5P_genclass_t *pclass2)
 {
-    htri_t ret_value;
+    htri_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -3322,7 +3730,7 @@ H5P_isa_class(hid_t plist_id, hid_t pclass_id)
 {
     H5P_genplist_t	*plist;         /* Property list to query */
     H5P_genclass_t	*pclass;        /* Property list class */
-    htri_t ret_value;                   /* return value */
+    htri_t ret_value = FAIL;            /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -3372,7 +3780,7 @@ done:
 H5P_genplist_t *
 H5P_object_verify(hid_t plist_id, hid_t pclass_id)
 {
-    H5P_genplist_t *ret_value;                   /* return value */
+    H5P_genplist_t *ret_value = NULL;   /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -3742,330 +4150,359 @@ done:
 

 /*--------------------------------------------------------------------------
  NAME
-    H5P_peek_unsigned
+    H5P__peek_cb
  PURPOSE
-    Internal routine to quickly retrieve the value of a property in a property list.
+    Internal callback for H5P__do_prop, to peek at a property's value in a property list.
  USAGE
-    int H5P_peek_unsigned(plist, name)
-        H5P_genplist_t *plist;  IN: Property list to check
-        const char *name;       IN: Name of property to query
+    herr_t H5P__peek_plist_cb(plist, name, value)
+        H5P_genplist_t *plist;  IN: Property list to peek property in
+        const char *name;       IN: Name of property to peek
+        H5P_genprop_t *prop;    IN: Property to peek
+        void *udata;            IN: User data for operation
  RETURNS
-    Directly returns the value of the property in the list
+    Returns non-negative on success, negative on failure.
  DESCRIPTION
-        This function directly returns the value of a property in a property
-    list.  Because this function is only able to just copy a particular property
-    value to the return value, there is no way to check for errors.  We attempt
-    to make certain that bad things don't happen by validating that the size of
-    the property is the same as the size of the return type, but that can't
-    catch all errors.
-        This function does call the user's 'get' callback routine still.
-
+        Peeks at a new value for a property in a property list.
  GLOBAL VARIABLES
  COMMENTS, BUGS, ASSUMPTIONS
-    No error checking!
-    Use with caution!
+    Called when the property is found in the property list and when it's found
+        for the property class.
  EXAMPLES
  REVISION LOG
 --------------------------------------------------------------------------*/
-unsigned
-H5P_peek_unsigned(H5P_genplist_t *plist, const char *name)
+static herr_t
+H5P__peek_cb(H5P_genplist_t *plist, const char *name, H5P_genprop_t *prop,
+    void *_udata)
 {
-    unsigned ret_value;            /* return value */
+    H5P_prop_get_ud_t *udata = (H5P_prop_get_ud_t *)_udata;    /* User data for callback */
+    herr_t ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_NOAPI(UFAIL)
+    FUNC_ENTER_STATIC
 
+    /* Sanity check */
     HDassert(plist);
     HDassert(name);
+    HDassert(prop);
 
-    /* Get the value to return, don't worry about the return value, we can't return it */
-    H5P_get(plist,name,&ret_value);
+    /* Check for property size >0 */
+    if(0 == prop->size)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "property has zero size")
+
+    /* Make a (shallow) copy of the value */
+    HDmemcpy(udata->value, prop->value, prop->size);
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-}   /* H5P_peek_unsigned() */
+}   /* H5P__peek_cb() */
 
 

 /*--------------------------------------------------------------------------
  NAME
-    H5P_peek_hid_t
+    H5P_peek
  PURPOSE
-    Internal routine to quickly retrieve the value of a property in a property list.
+    Internal routine to look at the value of a property in a property list.
  USAGE
-    hid_t H5P_peek_hid_t(plist, name)
+    herr_t H5P_peek(plist, name, value)
         H5P_genplist_t *plist;  IN: Property list to check
         const char *name;       IN: Name of property to query
+        void *value;            OUT: Pointer to the buffer for the property value
  RETURNS
-    Directly returns the value of the property in the list
+    Returns non-negative on success, negative on failure.
  DESCRIPTION
-        This function directly returns the value of a property in a property
-    list.  Because this function is only able to just copy a particular property
-    value to the return value, there is no way to check for errors.  We attempt
-    to make certain that bad things don't happen by validating that the size of
-    the property is the same as the size of the return type, but that can't
-    catch all errors.
-        This function does call the user's 'get' callback routine still.
-
+        Retrieves a "shallow" copy of the value for a property in a property
+    list.  The property name must exist or this routine will fail.  If there
+    is a 'get' callback routine registered for this property, it is _NOT_
+    called.
  GLOBAL VARIABLES
  COMMENTS, BUGS, ASSUMPTIONS
-    No error checking!
-    Use with caution!
+        This routine may not be called for zero-sized properties and will
+    return an error in that case.
  EXAMPLES
  REVISION LOG
 --------------------------------------------------------------------------*/
-hid_t
-H5P_peek_hid_t(H5P_genplist_t *plist, const char *name)
+herr_t
+H5P_peek(H5P_genplist_t *plist, const char *name, void *value)
 {
-    hid_t ret_value;            /* return value */
+    H5P_prop_get_ud_t udata;       /* User data for callback */
+    herr_t ret_value = SUCCEED;     /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
+    /* Sanity check */
     HDassert(plist);
     HDassert(name);
+    HDassert(value);
 
-    /* Get the value to return, don't worry about the return value, we can't return it */
-    H5P_get(plist,name,&ret_value);
+    /* Find the property and peek at the value */
+    udata.value = value;
+    if(H5P__do_prop(plist, name, H5P__peek_cb, H5P__peek_cb, &udata) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTOPERATE, FAIL, "can't operate on plist to peek at value")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-}   /* H5P_peek_hid_t() */
+} /* H5P_peek() */
 
 

 /*--------------------------------------------------------------------------
  NAME
-    H5P_peek_voidp
+    H5P__get_cb
  PURPOSE
-    Internal routine to quickly retrieve the value of a property in a property list.
+    Internal callback for H5P__do_prop, to get a property's value in a property list.
  USAGE
-    void *H5P_peek_voidp(plist, name)
-        H5P_genplist_t *plist;  IN: Property list to check
-        const char *name;       IN: Name of property to query
+    herr_t H5P__get_plist_cb(plist, name, value)
+        H5P_genplist_t *plist;  IN: Property list to get property in
+        const char *name;       IN: Name of property to get
+        H5P_genprop_t *prop;    IN: Property to get
+        void *udata;            IN: User data for operation
  RETURNS
-    Directly returns the value of the property in the list
+    Returns non-negative on success, negative on failure.
  DESCRIPTION
-        This function directly returns the value of a property in a property
-    list.  Because this function is only able to just copy a particular property
-    value to the return value, there is no way to check for errors.  We attempt
-    to make certain that bad things don't happen by validating that the size of
-    the property is the same as the size of the return type, but that can't
-    catch all errors.
-        This function does call the user's 'get' callback routine still.
-
+        Gets a new value for a property in a property list.
  GLOBAL VARIABLES
  COMMENTS, BUGS, ASSUMPTIONS
-    No error checking!
-    Use with caution!
+    Called when the property is found in the property list and when it's found
+        for the property class.
  EXAMPLES
  REVISION LOG
 --------------------------------------------------------------------------*/
-void *
-H5P_peek_voidp(H5P_genplist_t *plist, const char *name)
+static herr_t
+H5P__get_cb(H5P_genplist_t *plist, const char *name, H5P_genprop_t *prop,
+    void *_udata)
 {
-    void * ret_value;            /* return value */
+    H5P_prop_get_ud_t *udata = (H5P_prop_get_ud_t *)_udata;    /* User data for callback */
+    void *tmp_value = NULL;     /* Temporary value for property */
+    herr_t ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_NOAPI(NULL)
+    FUNC_ENTER_STATIC
 
+    /* Sanity check */
     HDassert(plist);
     HDassert(name);
+    HDassert(prop);
+
+    /* Check for property size >0 */
+    if(0 == prop->size)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "property has zero size")
+
+    /* Call the 'get' callback, if there is one */
+    if(NULL != prop->get) {
+        /* Make a copy of the current value, in case the callback fails */
+        if(NULL == (tmp_value = H5MM_malloc(prop->size)))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "memory allocation failed temporary property value")
+        HDmemcpy(tmp_value, prop->value, prop->size);
 
-    /* Get the value to return, don't worry about the return value, we can't return it */
-    H5P_get(plist,name,&ret_value);
+        /* Call user's callback */
+        if((*(prop->get))(plist->plist_id, name, prop->size, tmp_value) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't set property value")
+
+        /* Copy new [possibly unchanged] value into return value */
+        HDmemcpy(udata->value, tmp_value, prop->size);
+    } /* end if */
+    /* No 'get' callback, just copy value */
+    else
+        HDmemcpy(udata->value, prop->value, prop->size);
 
 done:
+    /* Free the temporary value buffer */
+    if(tmp_value)
+        H5MM_xfree(tmp_value);
+
     FUNC_LEAVE_NOAPI(ret_value)
-}   /* H5P_peek_voidp() */
+}   /* H5P__get_cb() */
 
 

 /*--------------------------------------------------------------------------
  NAME
-    H5P_peek_size_t
+    H5P_get
  PURPOSE
-    Internal routine to quickly retrieve the value of a property in a property list.
+    Internal routine to query the value of a property in a property list.
  USAGE
-    hsize_t H5P_peek_size_t(plist, name)
+    herr_t H5P_get(plist, name, value)
         H5P_genplist_t *plist;  IN: Property list to check
         const char *name;       IN: Name of property to query
+        void *value;            OUT: Pointer to the buffer for the property value
  RETURNS
-    Directly returns the value of the property in the list
+    Returns non-negative on success, negative on failure.
  DESCRIPTION
-        This function directly returns the value of a property in a property
-    list.  Because this function is only able to just copy a particular property
-    value to the return value, there is no way to check for errors.  We attempt
-    to make certain that bad things don't happen by validating that the size of
-    the property is the same as the size of the return type, but that can't
-    catch all errors.
-        This function does call the user's 'get' callback routine still.
+        Retrieves a copy of the value for a property in a property list.  The
+    property name must exist or this routine will fail.  If there is a
+    'get' callback routine registered for this property, the copy of the
+    value of the property will first be passed to that routine and any changes
+    to the copy of the value will be used when returning the property value
+    from this routine.
+        If the 'get' callback routine returns an error, 'value' will not be
+    modified and this routine will return an error.  This routine may not be
+    called for zero-sized properties.
 
  GLOBAL VARIABLES
  COMMENTS, BUGS, ASSUMPTIONS
-    No error checking!
-    Use with caution!
  EXAMPLES
  REVISION LOG
 --------------------------------------------------------------------------*/
-size_t
-H5P_peek_size_t(H5P_genplist_t *plist, const char *name)
+herr_t
+H5P_get(H5P_genplist_t *plist, const char *name, void *value)
 {
-    size_t ret_value;            /* return value */
+    H5P_prop_get_ud_t udata;    /* User data for callback */
+    herr_t ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_NOAPI(UFAIL)
+    FUNC_ENTER_NOAPI(FAIL)
 
+    /* Sanity check */
     HDassert(plist);
     HDassert(name);
+    HDassert(value);
 
-    /* Get the value to return, don't worry about the return value, we can't return it */
-    H5P_get(plist,name,&ret_value);
+    /* Find the property and get the value */
+    udata.value = value;
+    if(H5P__do_prop(plist, name, H5P__get_cb, H5P__get_cb, &udata) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTOPERATE, FAIL, "can't operate on plist to get value")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-}   /* H5P_peek_size_t() */
+}   /* H5P_get() */
 
 

 /*--------------------------------------------------------------------------
  NAME
-    H5P_get
+    H5P__del_plist_cb
  PURPOSE
-    Internal routine to query the value of a property in a property list.
+    Internal callback for H5P__do_prop, to remove a property's value in a property list.
  USAGE
-    herr_t H5P_get(plist, name, value)
-        H5P_genplist_t *plist;  IN: Property list to check
-        const char *name;       IN: Name of property to query
-        void *value;            OUT: Pointer to the buffer for the property value
+    herr_t H5P__del_plist_cb(plist, name, value)
+        H5P_genplist_t *plist;  IN: Property list to remove property from
+        const char *name;       IN: Name of property to remove
+        H5P_genprop_t *prop;    IN: Property to remove
+        void *udata;            IN: User data for operation
  RETURNS
     Returns non-negative on success, negative on failure.
  DESCRIPTION
-        Retrieves a copy of the value for a property in a property list.  The
-    property name must exist or this routine will fail.  If there is a
-    'get' callback routine registered for this property, the copy of the
-    value of the property will first be passed to that routine and any changes
-    to the copy of the value will be used when returning the property value
-    from this routine.
-        If the 'get' callback routine returns an error, 'value' will not be
-    modified and this routine will return an error.  This routine may not be
-    called for zero-sized properties.
-
+        Remove a property in a property list.  Called when the
+    property is found in the property list.
  GLOBAL VARIABLES
  COMMENTS, BUGS, ASSUMPTIONS
  EXAMPLES
  REVISION LOG
 --------------------------------------------------------------------------*/
-herr_t
-H5P_get(const H5P_genplist_t *plist, const char *name, void *value)
+static herr_t
+H5P__del_plist_cb(H5P_genplist_t *plist, const char *name, H5P_genprop_t *prop,
+    void H5_ATTR_UNUSED *_udata)
 {
-    H5P_genclass_t *tclass;     /* Temporary class pointer */
-    H5P_genprop_t *prop;        /* Temporary property pointer */
-    herr_t      ret_value=SUCCEED;       /* Return value */
+    char *del_name = NULL;      /* Pointer to deleted name */
+    herr_t ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_STATIC
 
+    /* Sanity check */
     HDassert(plist);
     HDassert(name);
-    HDassert(value);
-
-    /* Check if the property has been deleted */
-    if(H5SL_search(plist->del,name)!=NULL)
-        HGOTO_ERROR(H5E_PLIST, H5E_NOTFOUND, FAIL, "property doesn't exist")
+    HDassert(prop);
 
-    /* Find property */
-    if((prop = (H5P_genprop_t *)H5SL_search(plist->props,name))!=NULL) {
-        /* Check for property size >0 */
-        if(prop->size==0)
-            HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "property has zero size")
+    /* Pass value to 'close' callback, if it exists */
+    if(NULL != prop->del) {
+        /* Call user's callback */
+        if((*(prop->del))(plist->plist_id, name, prop->size, prop->value) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTFREE, FAIL, "can't release property value")
+    } /* end if */
 
-        /* Make a copy of the value and pass to 'get' callback */
-        if(prop->get!=NULL) {
-            void *tmp_value;            /* Temporary value for property */
+    /* Duplicate string for insertion into new deleted property skip list */
+    if(NULL == (del_name = H5MM_xstrdup(name)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "memory allocation failed")
 
-            /* Make a copy of the current value, in case the callback fails */
-            if(NULL==(tmp_value=H5MM_malloc(prop->size)))
-                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed temporary property value")
-            HDmemcpy(tmp_value,prop->value,prop->size);
+    /* Insert property name into deleted list */
+    if(H5SL_insert(plist->del, del_name, del_name) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into deleted skip list")
 
-            /* Call user's callback */
-            if((*(prop->get))(plist->plist_id,name,prop->size,tmp_value) < 0)
-                HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't get property value")
+    /* Remove the property from the skip list */
+    if(NULL == H5SL_remove(plist->props, prop->name))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTDELETE, FAIL, "can't remove property from skip list")
 
-            /* Copy new [possibly unchanged] value into return value */
-            HDmemcpy(value,tmp_value,prop->size);
+    /* Free the property, ignoring return value, nothing we can do */
+    H5P_free_prop(prop);
 
-            /* Free the temporary value buffer */
-            H5MM_xfree(tmp_value);
-        } /* end if */
-        /* No 'get' callback, just copy value */
-        else
-            HDmemcpy(value,prop->value,prop->size);
-    } /* end if */
-    else {
-        /*
-         * Check if we should get class properties (up through list of parent classes also),
-         * & make property 'get' callback.
-         */
-        tclass=plist->pclass;
-        while(tclass!=NULL) {
-            if(tclass->nprops>0) {
-                /* Find the property in the class */
-                if((prop = (H5P_genprop_t *)H5SL_search(tclass->props,name))!=NULL) {
-                    /* Check for property size >0 */
-                    if(prop->size==0)
-                        HGOTO_ERROR(H5E_PLIST,H5E_BADVALUE,FAIL,"property has zero size")
+    /* Decrement the number of properties in list */
+    plist->nprops--;
 
-                    /* Call the 'get' callback, if there is one */
-                    if(prop->get!=NULL) {
-                        void *tmp_value;            /* Temporary value for property */
+done:
+    /* Error cleanup */
+    if(ret_value < 0)
+        if(del_name)
+            H5MM_xfree(del_name);
 
-                        /* Make a copy of the current value, in case the callback fails */
-                        if(NULL==(tmp_value=H5MM_malloc(prop->size)))
-                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed temporary property value")
-                        HDmemcpy(tmp_value,prop->value,prop->size);
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P__del_plist_cb() */
 
-                        /* Call user's callback */
-                        if((*(prop->get))(plist->plist_id,name,prop->size,tmp_value) < 0) {
-                            H5MM_xfree(tmp_value);
-                            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't set property value")
-                        } /* end if */
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P__del_pclass_cb
+ PURPOSE
+    Internal callback for H5P__do_prop, to remove a property's value in a property list.
+ USAGE
+    herr_t H5P__del_pclass_cb(plist, name, value)
+        H5P_genplist_t *plist;  IN: Property list to remove property from
+        const char *name;       IN: Name of property to remove
+        H5P_genprop_t *prop;    IN: Property to remove
+        void *udata;            IN: User data for operation
+ RETURNS
+    Returns non-negative on success, negative on failure.
+ DESCRIPTION
+        Remove a property in a property list.  Called when the
+    property is found in the property class.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5P__del_pclass_cb(H5P_genplist_t *plist, const char *name, H5P_genprop_t *prop,
+    void H5_ATTR_UNUSED *_udata)
+{
+    char *del_name = NULL;      /* Pointer to deleted name */
+    void *tmp_value = NULL;     /* Temporary value for property */
+    herr_t ret_value = SUCCEED; /* Return value */
 
-                        if((prop->cmp)(tmp_value,prop->value,prop->size)) {
-                            H5P_genprop_t *pcopy;  /* Copy of property to insert into skip list */
+    FUNC_ENTER_STATIC
 
-                            /* Make a copy of the class's property */
-                            if((pcopy=H5P_dup_prop(prop,H5P_PROP_WITHIN_LIST)) == NULL)
-                                HGOTO_ERROR(H5E_PLIST,H5E_CANTCOPY,FAIL,"Can't copy property")
+    /* Sanity check */
+    HDassert(plist);
+    HDassert(name);
+    HDassert(prop);
 
-                            /* Copy new value into property value */
-                            HDmemcpy(pcopy->value,tmp_value,prop->size);
+    /* Pass value to 'del' callback, if it exists */
+    if(NULL != prop->del) {
+        /* Allocate space for a temporary copy of the property value */
+        if(NULL == (tmp_value = H5MM_malloc(prop->size)))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "memory allocation failed for temporary property value")
+        HDmemcpy(tmp_value, prop->value, prop->size);
 
-                            /* Insert the changed property into the property list */
-                            if(H5P_add_prop(plist->props,pcopy) < 0)
-                                HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL,"Can't insert changed property into skip list")
-                        } /* end if */
+        /* Call user's callback */
+        if((*(prop->del))(plist->plist_id, name, prop->size, tmp_value) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't close property value")
+    } /* end if */
 
-                        /* Copy new [possibly unchanged] value into return value */
-                        HDmemcpy(value,tmp_value,prop->size);
+    /* Duplicate string for insertion into new deleted property skip list */
+    if(NULL == (del_name = H5MM_xstrdup(name)))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "memory allocation failed")
 
-                        /* Free the temporary value buffer */
-                        H5MM_xfree(tmp_value);
-                    } /* end if */
-                    /* No 'get' callback, just copy value */
-                    else
-                        HDmemcpy(value,prop->value,prop->size);
+    /* Insert property name into deleted list */
+    if(H5SL_insert(plist->del, del_name, del_name) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into deleted skip list")
 
-                    /* Leave */
-                    HGOTO_DONE(SUCCEED);
-                } /* end while */
-            } /* end if */
+    /* Decrement the number of properties in list */
+    plist->nprops--;
 
-            /* Go up to parent class */
-            tclass=tclass->parent;
-        } /* end while */
+done:
+    /* Free the temporary value buffer */
+    if(tmp_value)
+        H5MM_xfree(tmp_value);
 
-        /* If we get this far, then it wasn't in the list of changed properties,
-         * nor in the properties in the class hierarchy, indicate an error
-         */
-        HGOTO_ERROR(H5E_PLIST,H5E_NOTFOUND,FAIL,"can't find property in skip list")
-    } /* end else */
+    /* Error cleanup */
+    if(ret_value < 0)
+        if(del_name)
+            H5MM_xfree(del_name);
 
-done:
     FUNC_LEAVE_NOAPI(ret_value)
-}   /* H5P_get() */
+}   /* H5P__del_pclass_cb() */
 
 

 /*--------------------------------------------------------------------------
@@ -4095,104 +4532,19 @@ done:
  REVISION LOG
 --------------------------------------------------------------------------*/
 herr_t
-H5P_remove(hid_t plist_id, H5P_genplist_t *plist, const char *name)
+H5P_remove(H5P_genplist_t *plist, const char *name)
 {
-    H5P_genclass_t *tclass;     /* Temporary class pointer */
-    H5P_genprop_t *prop;        /* Temporary property pointer */
-    char *del_name;             /* Pointer to deleted name */
-    herr_t ret_value=SUCCEED;   /* Return value */
+    herr_t ret_value = SUCCEED;   /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
+    /* Sanity check */
     HDassert(plist);
     HDassert(name);
 
-    /* Indicate that the property isn't in the list if it has been deleted already */
-    if(H5SL_search(plist->del,name)!=NULL)
-        HGOTO_ERROR(H5E_PLIST,H5E_NOTFOUND,FAIL,"can't find property in skip list")
-
-    /* Get the property node from the changed property skip list */
-    if((prop = (H5P_genprop_t *)H5SL_search(plist->props,name))!=NULL) {
-        /* Pass value to 'close' callback, if it exists */
-        if(prop->del!=NULL) {
-            /* Call user's callback */
-            if((*(prop->del))(plist_id,name,prop->size,prop->value) < 0)
-                HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't close property value")
-        } /* end if */
-
-        /* Duplicate string for insertion into new deleted property skip list */
-        if((del_name=H5MM_xstrdup(name)) == NULL)
-            HGOTO_ERROR(H5E_RESOURCE,H5E_NOSPACE,FAIL,"memory allocation failed")
-
-        /* Insert property name into deleted list */
-        if(H5SL_insert(plist->del,del_name,del_name) < 0)
-            HGOTO_ERROR(H5E_PLIST,H5E_CANTINSERT,FAIL,"can't insert property into deleted skip list")
-
-        /* Remove the property from the skip list */
-        if(H5SL_remove(plist->props,prop->name) == NULL)
-            HGOTO_ERROR(H5E_PLIST,H5E_CANTDELETE,FAIL,"can't remove property from skip list")
-
-        /* Free the property, ignoring return value, nothing we can do */
-        H5P_free_prop(prop);
-
-        /* Decrement the number of properties in list */
-        plist->nprops--;
-    } /* end if */
-    /* Walk through all the properties in the class hierarchy, looking for the property */
-    else {
-        /*
-         * Check if we should delete class properties (up through list of parent classes also),
-         * & make property 'delete' callback.
-         */
-        tclass=plist->pclass;
-        while(tclass!=NULL) {
-            if(tclass->nprops>0) {
-                /* Find the property in the class */
-                if((prop=H5P_find_prop_pclass(tclass,name))!=NULL) {
-                    /* Pass value to 'del' callback, if it exists */
-                    if(prop->del!=NULL) {
-                        void *tmp_value;       /* Temporary value buffer */
-
-                        /* Allocate space for a temporary copy of the property value */
-                        if(NULL==(tmp_value=H5MM_malloc(prop->size)))
-                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for temporary property value")
-                        HDmemcpy(tmp_value,prop->value,prop->size);
-
-                        /* Call user's callback */
-                        if((*(prop->del))(plist_id,name,prop->size,tmp_value) < 0) {
-                            H5MM_xfree(tmp_value);
-                            HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't close property value")
-                        } /* end if */
-
-                        /* Release the temporary value buffer */
-                        H5MM_xfree(tmp_value);
-                    } /* end if */
-
-                    /* Duplicate string for insertion into new deleted property skip list */
-                    if((del_name=H5MM_xstrdup(name)) == NULL)
-                        HGOTO_ERROR(H5E_RESOURCE,H5E_NOSPACE,FAIL,"memory allocation failed")
-
-                    /* Insert property name into deleted list */
-                    if(H5SL_insert(plist->del,del_name,del_name) < 0)
-                        HGOTO_ERROR(H5E_PLIST,H5E_CANTINSERT,FAIL,"can't insert property into deleted skip list")
-
-                    /* Decrement the number of properties in list */
-                    plist->nprops--;
-
-                    /* Leave */
-                    HGOTO_DONE(SUCCEED);
-                } /* end while */
-            } /* end if */
-
-            /* Go up to parent class */
-            tclass=tclass->parent;
-        } /* end while */
-
-        /* If we get this far, then it wasn't in the list of changed properties,
-         * nor in the properties in the class hierarchy, indicate an error
-         */
-        HGOTO_ERROR(H5E_PLIST,H5E_NOTFOUND,FAIL,"can't find property in skip list")
-    } /* end else */
+    /* Find the property and get the value */
+    if(H5P__do_prop(plist, name, H5P__del_plist_cb, H5P__del_pclass_cb, NULL) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTOPERATE, FAIL, "can't operate on plist to remove value")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -4250,7 +4602,7 @@ H5P_copy_prop_plist(hid_t dst_id, hid_t src_id, const char *name)
     /* If the property exists in the destination alread */
     if(NULL != H5P__find_prop_plist(dst_plist, name)) {
         /* Delete the property from the destination list, calling the 'close' callback if necessary */
-        if(H5P_remove(dst_id,dst_plist,name) < 0)
+        if(H5P_remove(dst_plist, name) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTDELETE, FAIL, "unable to remove property")
 
         /* Get the pointer to the source property */
@@ -4280,7 +4632,7 @@ H5P_copy_prop_plist(hid_t dst_id, hid_t src_id, const char *name)
 
         /* Create property object from parameters */
         if(NULL == (new_prop = H5P_create_prop(prop->name, prop->size, H5P_PROP_WITHIN_LIST, prop->value,
-                prop->create, prop->set, prop->get,
+                prop->create, prop->set, prop->get, prop->encode, prop->decode,
                 prop->del, prop->copy, prop->cmp, prop->close)))
             HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL,"Can't create property")
 
@@ -4372,7 +4724,7 @@ H5P_copy_prop_pclass(hid_t dst_id, hid_t src_id, const char *name)
     /* Register the property into the destination */
     orig_dst_pclass = dst_pclass;
     if(H5P_register(&dst_pclass, name, prop->size, prop->value, prop->create, prop->set, prop->get,
-            prop->del, prop->copy, prop->cmp, prop->close) < 0)
+            prop->encode, prop->decode, prop->del, prop->copy, prop->cmp, prop->close) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTDELETE, FAIL, "unable to remove property")
 
     /* Check if the property class changed and needs to be substituted in the ID */
@@ -4645,7 +4997,7 @@ done:
 char *
 H5P_get_class_name(H5P_genclass_t *pclass)
 {
-    char *ret_value;      /* return value */
+    char *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -4683,7 +5035,7 @@ done:
 char *
 H5P_get_class_path(H5P_genclass_t *pclass)
 {
-    char *ret_value;    /* return value */
+    char *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -4749,7 +5101,7 @@ H5P_open_class_path(const char *path)
     char *delimit;              /* Pointer to path delimiter during traversal */
     H5P_genclass_t *curr_class; /* Pointer to class during path traversal */
     H5P_check_class_t check_info;   /* Structure to hold the information for checking duplicate names */
-    H5P_genclass_t *ret_value;  /* Return value */
+    H5P_genclass_t *ret_value = NULL;   /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -4829,7 +5181,7 @@ done:
 H5P_genclass_t *
 H5P_get_class_parent(const H5P_genclass_t *pclass)
 {
-    H5P_genclass_t *ret_value;      /* return value */
+    H5P_genclass_t *ret_value = NULL;   /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -4879,6 +5231,124 @@ done:
 
 

 /*-------------------------------------------------------------------------
+ * Function:       H5P__new_plist_of_type
+ *
+ * Purpose:        Create a new property list, of a given type
+ *
+ * Return:	   Success:	ID of new property list
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Thursday, August 2, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+H5P__new_plist_of_type(H5P_plist_type_t type)
+{
+    H5P_genclass_t *pclass;     /* Class of property list to create */
+    hid_t class_id;             /* ID of class to create */
+    hid_t ret_value = H5I_INVALID_HID;  /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Sanity checks */
+    HDcompile_assert(H5P_TYPE_LINK_ACCESS == (H5P_TYPE_MAX_TYPE - 1));
+    HDassert(type >= H5P_TYPE_USER && type <= H5P_TYPE_LINK_ACCESS);
+
+    /* Check arguments */
+    if(type == H5P_TYPE_USER)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "can't create user property list");
+    if(type == H5P_TYPE_ROOT)
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "shouldn't be creating root class property list");
+
+    /* Instantiate a property list of the proper type */
+    switch(type) {
+        case H5P_TYPE_OBJECT_CREATE:
+            class_id = H5P_CLS_OBJECT_CREATE_ID_g;
+            break;
+
+        case H5P_TYPE_FILE_CREATE:
+            class_id = H5P_CLS_FILE_CREATE_ID_g;
+            break;
+
+        case H5P_TYPE_FILE_ACCESS:
+            class_id = H5P_CLS_FILE_ACCESS_ID_g;
+            break;
+
+        case H5P_TYPE_DATASET_CREATE:
+            class_id = H5P_CLS_DATASET_CREATE_ID_g;
+            break;
+
+        case H5P_TYPE_DATASET_ACCESS:
+            class_id = H5P_CLS_DATASET_ACCESS_ID_g;
+            break;
+
+        case H5P_TYPE_DATASET_XFER:
+            class_id = H5P_CLS_DATASET_XFER_ID_g;
+            break;
+
+        case H5P_TYPE_FILE_MOUNT:
+            class_id = H5P_CLS_FILE_MOUNT_ID_g;
+            break;
+
+        case H5P_TYPE_GROUP_CREATE:
+            class_id = H5P_CLS_GROUP_CREATE_ID_g;
+            break;
+
+        case H5P_TYPE_GROUP_ACCESS:
+            class_id = H5P_CLS_GROUP_ACCESS_ID_g;
+            break;
+
+        case H5P_TYPE_DATATYPE_CREATE:
+            class_id = H5P_CLS_DATATYPE_CREATE_ID_g;
+            break;
+
+        case H5P_TYPE_DATATYPE_ACCESS:
+            class_id = H5P_CLS_DATATYPE_ACCESS_ID_g;
+            break;
+
+        case H5P_TYPE_STRING_CREATE:
+            class_id = H5P_CLS_STRING_CREATE_ID_g;
+            break;
+
+        case H5P_TYPE_ATTRIBUTE_CREATE:
+            class_id = H5P_CLS_ATTRIBUTE_CREATE_ID_g;
+            break;
+
+        case H5P_TYPE_OBJECT_COPY:
+            class_id = H5P_CLS_OBJECT_COPY_ID_g;
+            break;
+
+        case H5P_TYPE_LINK_CREATE:
+            class_id = H5P_CLS_LINK_CREATE_ID_g;
+            break;
+
+        case H5P_TYPE_LINK_ACCESS:
+            class_id = H5P_CLS_LINK_ACCESS_ID_g;
+            break;
+
+        case H5P_TYPE_USER:     /* shut compiler warnings up */
+        case H5P_TYPE_ROOT:
+        case H5P_TYPE_MAX_TYPE:
+        default:
+            HGOTO_ERROR(H5E_PLIST, H5E_BADRANGE, FAIL, "invalid property list type: %u\n", (unsigned)type);
+    } /* end switch */
+
+    /* Get the class object */
+    if(NULL == (pclass = (H5P_genclass_t *)H5I_object(class_id)))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a property class")
+
+    /* Create the new property list */
+    if((ret_value = H5P_create_id(pclass, TRUE)) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCREATE, FAIL, "unable to create property list")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__new_plist_of_type() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	H5P_get_plist_id
  *
  * Purpose:	Quick and dirty routine to retrieve property list ID from
diff --git a/src/H5Plapl.c b/src/H5Plapl.c
index 24c6614..ac7fabb 100644
--- a/src/H5Plapl.c
+++ b/src/H5Plapl.c
@@ -27,7 +27,9 @@
 /****************/
 /* Module Setup */
 /****************/
-#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+#include "H5Pmodule.h"          /* This source code file is part of the H5P module */
+
 
 /***********/
 /* Headers */
@@ -48,26 +50,39 @@
 /* Definitions for number of soft links to traverse */
 #define H5L_ACS_NLINKS_SIZE        sizeof(size_t)
 #define H5L_ACS_NLINKS_DEF         H5L_NUM_LINKS /*max symlinks to follow per lookup  */
+#define H5L_ACS_NLINKS_ENC         H5P__encode_size_t
+#define H5L_ACS_NLINKS_DEC         H5P__decode_size_t
+
 
 /* Definitions for external link prefix */
 #define H5L_ACS_ELINK_PREFIX_SIZE        sizeof(char *)
 #define H5L_ACS_ELINK_PREFIX_DEF         NULL /*default is no prefix */
-#define H5L_ACS_ELINK_PREFIX_DEL         H5P_lacc_elink_pref_del
-#define H5L_ACS_ELINK_PREFIX_COPY        H5P_lacc_elink_pref_copy
-#define H5L_ACS_ELINK_PREFIX_CMP         H5P_lacc_elink_pref_cmp
-#define H5L_ACS_ELINK_PREFIX_CLOSE       H5P_lacc_elink_pref_close
+#define H5L_ACS_ELINK_PREFIX_SET         H5P__lacc_elink_pref_set
+#define H5L_ACS_ELINK_PREFIX_GET         H5P__lacc_elink_pref_get
+#define H5L_ACS_ELINK_PREFIX_ENC         H5P__lacc_elink_pref_enc
+#define H5L_ACS_ELINK_PREFIX_DEC         H5P__lacc_elink_pref_dec
+#define H5L_ACS_ELINK_PREFIX_DEL         H5P__lacc_elink_pref_del
+#define H5L_ACS_ELINK_PREFIX_COPY        H5P__lacc_elink_pref_copy
+#define H5L_ACS_ELINK_PREFIX_CMP         H5P__lacc_elink_pref_cmp
+#define H5L_ACS_ELINK_PREFIX_CLOSE       H5P__lacc_elink_pref_close
 
 /* Definitions for setting fapl of external link access */
 #define H5L_ACS_ELINK_FAPL_SIZE        	sizeof(hid_t)
 #define H5L_ACS_ELINK_FAPL_DEF         	H5P_DEFAULT
-#define H5L_ACS_ELINK_FAPL_DEL		H5P_lacc_elink_fapl_del
-#define H5L_ACS_ELINK_FAPL_COPY        	H5P_lacc_elink_fapl_copy
-#define H5L_ACS_ELINK_FAPL_CMP        	H5P_lacc_elink_fapl_cmp
-#define H5L_ACS_ELINK_FAPL_CLOSE       	H5P_lacc_elink_fapl_close
+#define H5L_ACS_ELINK_FAPL_SET		H5P__lacc_elink_fapl_set
+#define H5L_ACS_ELINK_FAPL_GET		H5P__lacc_elink_fapl_get
+#define H5L_ACS_ELINK_FAPL_ENC		H5P__lacc_elink_fapl_enc
+#define H5L_ACS_ELINK_FAPL_DEC         	H5P__lacc_elink_fapl_dec
+#define H5L_ACS_ELINK_FAPL_DEL		H5P__lacc_elink_fapl_del
+#define H5L_ACS_ELINK_FAPL_COPY        	H5P__lacc_elink_fapl_copy
+#define H5L_ACS_ELINK_FAPL_CMP        	H5P__lacc_elink_fapl_cmp
+#define H5L_ACS_ELINK_FAPL_CLOSE       	H5P__lacc_elink_fapl_close
 
 /* Definitions for file access flags for external link traversal */
 #define H5L_ACS_ELINK_FLAGS_SIZE        sizeof(unsigned)
 #define H5L_ACS_ELINK_FLAGS_DEF         H5F_ACC_DEFAULT
+#define H5L_ACS_ELINK_FLAGS_ENC         H5P__encode_unsigned
+#define H5L_ACS_ELINK_FLAGS_DEC         H5P__decode_unsigned
 
 /* Definitions for callback function for external link traversal */
 #define H5L_ACS_ELINK_CB_SIZE           sizeof(H5L_elink_cb_t)
@@ -89,17 +104,25 @@
 /********************/
 
 /* Property class callbacks */
-static herr_t H5P_lacc_reg_prop(H5P_genclass_t *pclass);
+static herr_t H5P__lacc_reg_prop(H5P_genclass_t *pclass);
 
 /* Property list callbacks */
-static herr_t H5P_lacc_elink_pref_del(hid_t prop_id, const char* name, size_t size, void* value);
-static herr_t H5P_lacc_elink_pref_copy(const char* name, size_t size, void* value);
-static int H5P_lacc_elink_pref_cmp(const void *value1, const void *value2, size_t size);
-static herr_t H5P_lacc_elink_pref_close(const char* name, size_t size, void* value);
-static herr_t H5P_lacc_elink_fapl_del(hid_t prop_id, const char* name, size_t size, void* value);
-static herr_t H5P_lacc_elink_fapl_copy(const char* name, size_t size, void* value);
-static int H5P_lacc_elink_fapl_cmp(const void *value1, const void *value2, size_t size);
-static herr_t H5P_lacc_elink_fapl_close(const char* name, size_t size, void* value);
+static herr_t H5P__lacc_elink_pref_set(hid_t prop_id, const char* name, size_t size, void* value);
+static herr_t H5P__lacc_elink_pref_get(hid_t prop_id, const char* name, size_t size, void* value);
+static herr_t H5P__lacc_elink_pref_enc(const void *value, void **_pp, size_t *size);
+static herr_t H5P__lacc_elink_pref_dec(const void **_pp, void *value);
+static herr_t H5P__lacc_elink_pref_del(hid_t prop_id, const char* name, size_t size, void* value);
+static herr_t H5P__lacc_elink_pref_copy(const char* name, size_t size, void* value);
+static int H5P__lacc_elink_pref_cmp(const void *value1, const void *value2, size_t size);
+static herr_t H5P__lacc_elink_pref_close(const char* name, size_t size, void* value);
+static herr_t H5P__lacc_elink_fapl_set(hid_t prop_id, const char* name, size_t size, void* value);
+static herr_t H5P__lacc_elink_fapl_get(hid_t prop_id, const char* name, size_t size, void* value);
+static herr_t H5P__lacc_elink_fapl_enc(const void *value, void **_pp, size_t *size);
+static herr_t H5P__lacc_elink_fapl_dec(const void **_pp, void *value);
+static herr_t H5P__lacc_elink_fapl_del(hid_t prop_id, const char* name, size_t size, void* value);
+static herr_t H5P__lacc_elink_fapl_copy(const char* name, size_t size, void* value);
+static int H5P__lacc_elink_fapl_cmp(const void *value1, const void *value2, size_t size);
+static herr_t H5P__lacc_elink_fapl_close(const char* name, size_t size, void* value);
 
 
 /*********************/
@@ -115,7 +138,7 @@ const H5P_libclass_t H5P_CLS_LACC[1] = {{
     &H5P_CLS_LINK_ACCESS_g,	/* Pointer to class             */
     &H5P_CLS_LINK_ACCESS_ID_g,	/* Pointer to class ID          */
     &H5P_LST_LINK_ACCESS_ID_g,	/* Pointer to default property list ID */
-    H5P_lacc_reg_prop,		/* Default property registration routine */
+    H5P__lacc_reg_prop,		/* Default property registration routine */
 
     NULL,		        /* Class creation callback      */
     NULL,		        /* Class creation callback info */
@@ -135,10 +158,17 @@ const H5P_libclass_t H5P_CLS_LACC[1] = {{
 /* Local Variables */
 /*******************/
 
+/* Property value defaults */
+static const size_t H5L_def_nlinks_g = H5L_ACS_NLINKS_DEF; 	   /* Default number of soft links to traverse */
+static const char *H5L_def_elink_prefix_g = H5L_ACS_ELINK_PREFIX_DEF; /* Default external link prefix string */
+static const hid_t H5L_def_fapl_id_g = H5L_ACS_ELINK_FAPL_DEF;    /* Default fapl for external link access */
+static const unsigned H5L_def_elink_flags_g = H5L_ACS_ELINK_FLAGS_DEF; /* Default file access flags for external link traversal */
+static const H5L_elink_cb_t H5L_def_elink_cb_g = H5L_ACS_ELINK_CB_DEF; /* Default external link traversal callback */
+
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5P_lacc_reg_prop
+ * Function:    H5P__lacc_reg_prop
  *
  * Purpose:     Register the dataset creation property list class's properties
  *
@@ -147,52 +177,269 @@ const H5P_libclass_t H5P_CLS_LACC[1] = {{
  * Programmer:  Quincey Koziol
  *              October 31, 2006
  *
- * Modifications:
- *	Vailin Choi, Sept. 12th 2008
- *	Register the setting of file access property list for link access
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5P_lacc_reg_prop(H5P_genclass_t *pclass)
+H5P__lacc_reg_prop(H5P_genclass_t *pclass)
 {
-    size_t nlinks = H5L_ACS_NLINKS_DEF; 	   /* Default number of soft links to traverse */
-    char *elink_prefix = H5L_ACS_ELINK_PREFIX_DEF; /* Default external link prefix string */
-    hid_t def_fapl_id = H5L_ACS_ELINK_FAPL_DEF;    /* Default fapl for external link access */
-    unsigned elink_flags = H5L_ACS_ELINK_FLAGS_DEF; /* Default file access flags for external link traversal */
-    H5L_elink_cb_t elink_cb = H5L_ACS_ELINK_CB_DEF; /* Default external link traversal callback */
-
     herr_t ret_value = SUCCEED;         	   /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Register property for number of links traversed */
-    if(H5P_register_real(pclass, H5L_ACS_NLINKS_NAME, H5L_ACS_NLINKS_SIZE, &nlinks, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5L_ACS_NLINKS_NAME, H5L_ACS_NLINKS_SIZE, &H5L_def_nlinks_g, 
+            NULL, NULL, NULL, H5L_ACS_NLINKS_ENC, H5L_ACS_NLINKS_DEC,
+            NULL, NULL, NULL, NULL) < 0)
          HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register property for external link prefix */
-    if(H5P_register_real(pclass, H5L_ACS_ELINK_PREFIX_NAME, H5L_ACS_ELINK_PREFIX_SIZE, &elink_prefix, NULL, NULL, NULL, H5L_ACS_ELINK_PREFIX_DEL, H5L_ACS_ELINK_PREFIX_COPY, H5L_ACS_ELINK_PREFIX_CMP, H5L_ACS_ELINK_PREFIX_CLOSE) < 0)
+    if(H5P_register_real(pclass, H5L_ACS_ELINK_PREFIX_NAME, H5L_ACS_ELINK_PREFIX_SIZE, &H5L_def_elink_prefix_g, 
+            NULL, H5L_ACS_ELINK_PREFIX_SET, H5L_ACS_ELINK_PREFIX_GET, H5L_ACS_ELINK_PREFIX_ENC, H5L_ACS_ELINK_PREFIX_DEC,
+            H5L_ACS_ELINK_PREFIX_DEL, H5L_ACS_ELINK_PREFIX_COPY, H5L_ACS_ELINK_PREFIX_CMP, H5L_ACS_ELINK_PREFIX_CLOSE) < 0)
          HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register fapl for link access */
-    if(H5P_register_real(pclass, H5L_ACS_ELINK_FAPL_NAME, H5L_ACS_ELINK_FAPL_SIZE, &def_fapl_id, NULL, NULL, NULL, H5L_ACS_ELINK_FAPL_DEL, H5L_ACS_ELINK_FAPL_COPY, H5L_ACS_ELINK_FAPL_CMP, H5L_ACS_ELINK_FAPL_CLOSE) < 0)
+    if(H5P_register_real(pclass, H5L_ACS_ELINK_FAPL_NAME, H5L_ACS_ELINK_FAPL_SIZE, &H5L_def_fapl_id_g, 
+             NULL, H5L_ACS_ELINK_FAPL_SET, H5L_ACS_ELINK_FAPL_GET, H5L_ACS_ELINK_FAPL_ENC, H5L_ACS_ELINK_FAPL_DEC,
+             H5L_ACS_ELINK_FAPL_DEL, H5L_ACS_ELINK_FAPL_COPY, H5L_ACS_ELINK_FAPL_CMP, H5L_ACS_ELINK_FAPL_CLOSE) < 0)
          HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register property for external link file access flags */
-    if(H5P_register_real(pclass, H5L_ACS_ELINK_FLAGS_NAME, H5L_ACS_ELINK_FLAGS_SIZE, &elink_flags, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5L_ACS_ELINK_FLAGS_NAME, H5L_ACS_ELINK_FLAGS_SIZE, &H5L_def_elink_flags_g, 
+             NULL, NULL, NULL, H5L_ACS_ELINK_FLAGS_ENC, H5L_ACS_ELINK_FLAGS_DEC,
+             NULL, NULL, NULL, NULL) < 0)
          HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register property for external link file traversal callback */
-    if(H5P_register_real(pclass, H5L_ACS_ELINK_CB_NAME, H5L_ACS_ELINK_CB_SIZE, &elink_cb, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5L_ACS_ELINK_CB_NAME, H5L_ACS_ELINK_CB_SIZE, &H5L_def_elink_cb_g, 
+             NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
          HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_lacc_reg_prop() */
+} /* end H5P__lacc_reg_prop() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__lacc_elink_fapl_set
+ *
+ * Purpose:     Copies an external link FAPL property when it's set for a property list
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Wednesday, Sept 2, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__lacc_elink_fapl_set(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    hid_t          l_fapl_id;
+    herr_t         ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Get the FAPL ID */
+    l_fapl_id = *(const hid_t *)value;
+
+    /* Duplicate the FAPL, if it's non-default */
+    if(l_fapl_id != H5P_DEFAULT) {
+        H5P_genplist_t *l_fapl_plist;
+
+        if(NULL == (l_fapl_plist = (H5P_genplist_t *)H5P_object_verify(l_fapl_id, H5P_FILE_ACCESS)))
+            HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "can't get property list")
+	if(((*(hid_t *)value) = H5P_copy_plist(l_fapl_plist, FALSE)) < 0)
+	    HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "unable to copy file access property list")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__lacc_elink_fapl_set() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__lacc_elink_fapl_get
+ *
+ * Purpose:     Copies an external link FAPL property when it's retrieved from a property list
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Wednesday, Sept 2, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__lacc_elink_fapl_get(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    hid_t          l_fapl_id;
+    herr_t         ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Get the FAPL ID */
+    l_fapl_id = *(const hid_t *)value;
+
+    /* Duplicate the FAPL, if it's non-default */
+    if(l_fapl_id != H5P_DEFAULT) {
+        H5P_genplist_t *l_fapl_plist;
+
+        if(NULL == (l_fapl_plist = (H5P_genplist_t *)H5P_object_verify(l_fapl_id, H5P_FILE_ACCESS)))
+            HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "can't get property list")
+	if(((*(hid_t *)value) = H5P_copy_plist(l_fapl_plist, FALSE)) < 0)
+	    HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "unable to copy file access property list")
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__lacc_elink_fapl_get() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__lacc_elink_fapl_enc
+ *
+ * Purpose:        Callback routine which is called whenever the elink FAPL
+ *                 property in the dataset access property list is
+ *                 encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Wednesday, August 15, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__lacc_elink_fapl_enc(const void *value, void **_pp, size_t *size)
+{
+    const hid_t *elink_fapl = (const hid_t *)value;     /* Property to encode */
+    uint8_t **pp = (uint8_t **)_pp;
+    H5P_genplist_t *fapl_plist;         /* Pointer to property list */
+    hbool_t non_default_fapl = FALSE;   /* Whether the FAPL is non-default */
+    size_t fapl_size = 0;                /* FAPL's encoded size */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check for non-default FAPL */
+    if(*elink_fapl != H5P_DEFAULT) {
+        if(NULL == (fapl_plist = (H5P_genplist_t *)H5P_object_verify(*elink_fapl, H5P_FILE_ACCESS)))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get property list")
+        non_default_fapl = TRUE;
+    } /* end if */
+
+    if(NULL != *pp) {
+        /* Store whether the FAPL is non-default */
+        *(*pp)++ = (uint8_t)non_default_fapl;
+    } /* end if */
+
+    /* Encode the property list, if non-default */
+    /* (if *pp == NULL, will only compute the size) */
+    if(non_default_fapl) {
+        if(H5P__encode(fapl_plist, TRUE, NULL, &fapl_size) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTENCODE, FAIL, "can't encode property list")
+
+        if(*pp) {
+            uint64_t enc_value;
+            unsigned enc_size;
+
+            /* encode the length of the plist */
+            enc_value = (uint64_t)fapl_size;
+            enc_size = H5VM_limit_enc_size(enc_value);
+            HDassert(enc_size < 256);
+            *(*pp)++ = (uint8_t)enc_size;
+            UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+
+            /* encode the plist */
+            if(H5P__encode(fapl_plist, TRUE, *pp, &fapl_size) < 0)
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTENCODE, FAIL, "can't encode property list")
+
+            *pp += fapl_size;
+        }
+        fapl_size += (1 + H5VM_limit_enc_size((uint64_t)fapl_size));
+    } /* end if */
+
+    *size += (1 + fapl_size);      /* Non-default flag, plus encoded property list size */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__lacc_elink_fapl_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__lacc_elink_fapl_dec
+ *
+ * Purpose:        Callback routine which is called whenever the elink FAPL
+ *                 property in the dataset access property list is
+ *                 decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Wednesday, August 15, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__lacc_elink_fapl_dec(const void **_pp, void *_value)
+{
+    hid_t *elink_fapl = (hid_t *)_value;        /* The elink FAPL value */
+    const uint8_t **pp = (const uint8_t **)_pp;
+    hbool_t non_default_fapl;           /* Whether the FAPL is non-default */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(elink_fapl);
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+
+    /* Determine if the FAPL is non-default */
+    non_default_fapl = (hbool_t)*(*pp)++;
+
+    if(non_default_fapl) {
+        size_t fapl_size = 0;                /* Encoded size of property list */
+        unsigned enc_size;
+        uint64_t enc_value;
+
+        /* Decode the plist length */
+        enc_size = *(*pp)++;
+        HDassert(enc_size < 256);
+        UINT64DECODE_VAR(*pp, enc_value, enc_size);
+        fapl_size = (size_t)enc_value;
+
+        /* Decode the property list */
+        if((*elink_fapl = H5P__decode(*pp)) < 0)
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTDECODE, FAIL, "can't decode property")
+
+        *pp += fapl_size;
+    } /* end if */
+    else
+        *elink_fapl = H5P_DEFAULT;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__lacc_elink_fapl_dec() */
 
 

 /*--------------------------------------------------------------------------
- * Function:	H5P_lacc_elink_fapl_del
+ * Function:	H5P__lacc_elink_fapl_del
  *
  * Purpose:	Close the FAPL for link access
  *
@@ -204,29 +451,31 @@ done:
  *
  *--------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
-H5P_lacc_elink_fapl_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+H5P__lacc_elink_fapl_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
 {
     hid_t          l_fapl_id;
     herr_t         ret_value = SUCCEED;
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_STATIC
 
+    /* Sanity check */
     HDassert(value);
 
+    /* Get the FAPL ID */
     l_fapl_id = (*(const hid_t *)value);
 
-    if((l_fapl_id > H5P_DEFAULT) && (H5I_dec_ref(l_fapl_id) < 0))
+    /* Close the FAPL */
+    if(l_fapl_id != H5P_DEFAULT && H5I_dec_ref(l_fapl_id) < 0)
 	HGOTO_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "unable to close atom for file access property list")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_lacc_elink_fapl_del() */
+} /* end H5P__lacc_elink_fapl_del() */
 
 

 /*--------------------------------------------------------------------------
- * Function:	H5P_lacc_elink_fapl_copy
+ * Function:	H5P__lacc_elink_fapl_copy
  *
  * Purpose:	Copy the FAPL for link access
  *
@@ -238,36 +487,37 @@ done:
  *
  *--------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
-H5P_lacc_elink_fapl_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+H5P__lacc_elink_fapl_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
 {
     hid_t          l_fapl_id;
     herr_t         ret_value = SUCCEED;
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_STATIC
 
+    /* Sanity check */
     HDassert(value);
 
+    /* Get the FAPL ID */
     l_fapl_id = (*(const hid_t *)value);
 
-    if(l_fapl_id > H5P_DEFAULT) {
+    /* Duplicate the FAPL, if it's non-default */
+    if(l_fapl_id != H5P_DEFAULT) {
         H5P_genplist_t *l_fapl_plist;
 
         if(NULL == (l_fapl_plist = (H5P_genplist_t *)H5P_object_verify(l_fapl_id, H5P_FILE_ACCESS)))
-            HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list")
-
+            HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "can't get property list")
 	if(((*(hid_t *)value) = H5P_copy_plist(l_fapl_plist, FALSE)) < 0)
-	    HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "unable to copy file access properties")
+	    HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "unable to copy file access property list")
     } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_lacc_elink_fapl_copy() */
+} /* end H5P__lacc_elink_fapl_copy() */
 
 

 /*-------------------------------------------------------------------------
- * Function:       H5P_lacc_elink_fapl_cmp
+ * Function:       H5P__lacc_elink_fapl_cmp
  *
  * Purpose:        Callback routine which is called whenever the elink FAPL
  *                 property in the link access property list is
@@ -281,14 +531,14 @@ done:
  *-------------------------------------------------------------------------
  */
 static int
-H5P_lacc_elink_fapl_cmp(const void *value1, const void *value2, size_t H5_ATTR_UNUSED size)
+H5P__lacc_elink_fapl_cmp(const void *value1, const void *value2, size_t H5_ATTR_UNUSED size)
 {
     const hid_t *fapl1 = (const hid_t *)value1;
     const hid_t *fapl2 = (const hid_t *)value2;
     H5P_genplist_t *obj1, *obj2;          /* Property lists to compare */
     int ret_value = 0;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Check for comparison with default value */
     if(*fapl1 == 0 && *fapl2 > 0) HGOTO_DONE(1);
@@ -310,11 +560,11 @@ H5P_lacc_elink_fapl_cmp(const void *value1, const void *value2, size_t H5_ATTR_U
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_lacc_elink_fapl_cmp() */
+} /* end H5P__lacc_elink_fapl_cmp() */
 
 

 /*--------------------------------------------------------------------------
- * Function:	H5P_lacc_elink_fapl_close
+ * Function:	H5P__lacc_elink_fapl_close
  *
  * Purpose:	Close the FAPL for link access
  *
@@ -326,28 +576,202 @@ done:
  *
  *---------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
-H5P_lacc_elink_fapl_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+H5P__lacc_elink_fapl_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
 {
     hid_t		l_fapl_id;
     herr_t     		ret_value = SUCCEED;
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
+    /* Sanity check */
     HDassert(value);
 
+    /* Get the FAPL ID */
     l_fapl_id = (*(const hid_t *)value);
+
+    /* Close the FAPL */
     if((l_fapl_id > H5P_DEFAULT) && (H5I_dec_ref(l_fapl_id) < 0))
 	HGOTO_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "unable to close atom for file access property list")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_lacc_elink_fapl_close() */
+} /* end H5P__lacc_elink_fapl_close() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__lacc_elink_pref_set
+ *
+ * Purpose:     Copies an external link prefix property when it's set for a property list
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Wednesday, Sept 2, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__lacc_elink_pref_set(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Copy the prefix */
+    *(char **)value = H5MM_xstrdup(*(const char **)value);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__lacc_elink_pref_set() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__lacc_elink_pref_get
+ *
+ * Purpose:     Copies an external link prefix property when it's retrieved from a property list
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Wednesday, Sept 2, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__lacc_elink_pref_get(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Copy the prefix */
+    *(char **)value = H5MM_xstrdup(*(const char **)value);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__lacc_elink_pref_get() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__lacc_elink_pref_enc
+ *
+ * Purpose:        Callback routine which is called whenever the elink flags
+ *                 property in the dataset access property list is
+ *                 encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 Monday, October 10, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__lacc_elink_pref_enc(const void *value, void **_pp, size_t *size)
+{
+    const char *elink_pref = *(const char * const *)value;
+    uint8_t **pp = (uint8_t **)_pp;
+    size_t len = 0;
+    uint64_t enc_value;
+    unsigned enc_size;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+
+    /* calculate prefix length */
+    if(NULL != elink_pref)
+        len = HDstrlen(elink_pref);
+
+    enc_value = (uint64_t)len;
+    enc_size = H5VM_limit_enc_size(enc_value);
+    HDassert(enc_size < 256);
+
+    if(NULL != *pp) {
+        /* encode the length of the prefix */
+        *(*pp)++ = (uint8_t)enc_size;
+        UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+
+        /* encode the prefix */
+        if(NULL != elink_pref) {
+            HDmemcpy(*(char **)pp, elink_pref, len);
+            *pp += len;
+        } /* end if */
+    } /* end if */
+
+    *size += (1 + enc_size);
+    if(NULL != elink_pref)
+        *size += len;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__lacc_elink_pref_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__lacc_elink_pref_dec
+ *
+ * Purpose:        Callback routine which is called whenever the elink prefix
+ *                 property in the dataset access property list is
+ *                 decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 Monday, October 10, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__lacc_elink_pref_dec(const void **_pp, void *_value)
+{
+    char **elink_pref = (char **)_value;
+    const uint8_t **pp = (const uint8_t **)_pp;
+    size_t len;
+    uint64_t enc_value;                 /* Decoded property value */
+    unsigned enc_size;                  /* Size of encoded property */
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(elink_pref);
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+
+    /* Decode the size */
+    enc_size = *(*pp)++;
+    HDassert(enc_size < 256);
+
+    /* Decode the value */
+    UINT64DECODE_VAR(*pp, enc_value, enc_size);
+    len = (size_t)enc_value;
+
+    if(0 != len) {
+        /* Make a copy of the user's prefix string */
+        if(NULL == (*elink_pref = (char *)H5MM_malloc(len + 1)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, FAIL, "memory allocation failed for prefix")
+        HDstrncpy(*elink_pref, *(const char **)pp, len);
+        (*elink_pref)[len] = '\0';
+
+        *pp += len;
+    } /* end if */
+    else
+        *elink_pref = NULL;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__lacc_elink_pref_dec() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5P_lacc_elink_pref_del
+ * Function:    H5P__lacc_elink_pref_del
  *
  * Purpose:     Frees memory used to store the external link prefix string
  *
@@ -358,22 +782,21 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
-H5P_lacc_elink_pref_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+H5P__lacc_elink_pref_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     HDassert(value);
 
     H5MM_xfree(*(void **)value);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5P_lacc_elink_pref_del() */
+} /* end H5P__lacc_elink_pref_del() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5P_lacc_elink_pref_copy
+ * Function:    H5P__lacc_elink_pref_copy
  *
  * Purpose:     Creates a copy of the external link prefix string
  *
@@ -384,22 +807,21 @@ H5P_lacc_elink_pref_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
-H5P_lacc_elink_pref_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+H5P__lacc_elink_pref_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     HDassert(value);
 
     *(char **)value = H5MM_xstrdup(*(const char **)value);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5P_lacc_elink_pref_copy() */
+} /* end H5P__lacc_elink_pref_copy() */
 
 

 /*-------------------------------------------------------------------------
- * Function:       H5P_lacc_elink_pref_cmp
+ * Function:       H5P__lacc_elink_pref_cmp
  *
  * Purpose:        Callback routine which is called whenever the elink prefix
  *                 property in the dataset creation property list is
@@ -413,13 +835,13 @@ H5P_lacc_elink_pref_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED
  *-------------------------------------------------------------------------
  */
 static int
-H5P_lacc_elink_pref_cmp(const void *value1, const void *value2, size_t H5_ATTR_UNUSED size)
+H5P__lacc_elink_pref_cmp(const void *value1, const void *value2, size_t H5_ATTR_UNUSED size)
 {
     const char *pref1 = *(const char * const *)value1;
     const char *pref2 = *(const char * const *)value2;
     int ret_value = 0;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     if(NULL == pref1 && NULL != pref2)
         HGOTO_DONE(1);
@@ -430,11 +852,11 @@ H5P_lacc_elink_pref_cmp(const void *value1, const void *value2, size_t H5_ATTR_U
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P_lacc_elink_pref_cmp() */
+} /* end H5P__lacc_elink_pref_cmp() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    H5P_lacc_elink_pref_close
+ * Function:    H5P__lacc_elink_pref_close
  *
  * Purpose:     Frees memory used to store the external link prefix string
  *
@@ -445,18 +867,17 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
-H5P_lacc_elink_pref_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
+H5P__lacc_elink_pref_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     HDassert(value);
 
     H5MM_xfree(*(void **)value);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5P_lacc_elink_pref_close() */
+} /* end H5P__lacc_elink_pref_close() */
 
 

 /*-------------------------------------------------------------------------
@@ -564,7 +985,6 @@ herr_t
 H5Pset_elink_prefix(hid_t plist_id, const char *prefix)
 {
     H5P_genplist_t *plist;              /* Property list pointer */
-    char *my_prefix;                    /* Copy of prefix string */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_API(FAIL)
@@ -574,19 +994,8 @@ H5Pset_elink_prefix(hid_t plist_id, const char *prefix)
     if(NULL == (plist = H5P_object_verify(plist_id, H5P_LINK_ACCESS)))
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
-    /* Get current prefix value */
-    if(H5P_get(plist, H5L_ACS_ELINK_PREFIX_NAME, &my_prefix) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get prefix info")
-
-    /* Free existing prefix, if there is one */
-    H5MM_xfree(my_prefix);
-
-    /* Make a copy of the user's prefix string */
-    if(NULL == (my_prefix = H5MM_xstrdup(prefix)))
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy prefix")
-
     /* Set prefix */
-    if(H5P_set(plist, H5L_ACS_ELINK_PREFIX_NAME, &my_prefix) < 0)
+    if(H5P_set(plist, H5L_ACS_ELINK_PREFIX_NAME, &prefix) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set prefix info")
 
 done:
@@ -626,7 +1035,7 @@ H5Pget_elink_prefix(hid_t plist_id, char *prefix, size_t size)
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Get the current prefix */
-    if(H5P_get(plist, H5L_ACS_ELINK_PREFIX_NAME, &my_prefix) < 0)
+    if(H5P_peek(plist, H5L_ACS_ELINK_PREFIX_NAME, &my_prefix) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external link prefix")
 
     /* Check for prefix being set */
@@ -664,9 +1073,8 @@ done:
 herr_t
 H5Pset_elink_fapl(hid_t lapl_id, hid_t fapl_id)
 {
-    H5P_genplist_t 	*plist, *fapl_plist;	/* Property list pointer */
-    hid_t		l_fapl_id, new_fapl_id;
-    herr_t 		ret_value = SUCCEED;         		/* Return value */
+    H5P_genplist_t 	*plist;         /* Property list pointer */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_API(FAIL)
     H5TRACE2("e", "ii", lapl_id, fapl_id);
@@ -675,23 +1083,8 @@ H5Pset_elink_fapl(hid_t lapl_id, hid_t fapl_id)
     if(NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link access property list");
 
-    /* Get the current file access property list for the link access */
-    if(H5P_get(plist, H5L_ACS_ELINK_FAPL_NAME, &l_fapl_id) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fapl")
-
-    /* Close the current file access property list if set */
-    if((l_fapl_id > H5P_DEFAULT) && (H5I_dec_ref(l_fapl_id) < 0))
-	HGOTO_ERROR(H5E_PLIST, H5E_CANTRELEASE, FAIL, "unable to close atom for file access property list")
-
-    if(NULL == (fapl_plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS)))
-	HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a file access property list");
-
-    /* Make a copy of the property list for FAPL_ID */
-    if((new_fapl_id = H5P_copy_plist(fapl_plist, FALSE)) < 0)
-	HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "unable to copy file access properties")
-
     /* Set the file access property list for the link access */
-    if(H5P_set(plist, H5L_ACS_ELINK_FAPL_NAME, &new_fapl_id) < 0)
+    if(H5P_set(plist, H5L_ACS_ELINK_FAPL_NAME, &fapl_id) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set fapl for link")
 
 done:
@@ -715,9 +1108,8 @@ done:
 hid_t
 H5Pget_elink_fapl(hid_t lapl_id)
 {
-    H5P_genplist_t 	*plist, *fapl_plist; 	/* Property list pointer */
-    hid_t		l_fapl_id;
-    hid_t		ret_value=FAIL;		/* Return value */
+    H5P_genplist_t *plist; 	/* Property list pointer */
+    hid_t ret_value;		/* Return value */
 
     FUNC_ENTER_API(FAIL)
     H5TRACE1("i", "i", lapl_id);
@@ -726,18 +1118,9 @@ H5Pget_elink_fapl(hid_t lapl_id)
     if(NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS)))
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
-    if(H5P_get(plist, H5L_ACS_ELINK_FAPL_NAME, &l_fapl_id) < 0)
+    if(H5P_get(plist, H5L_ACS_ELINK_FAPL_NAME, &ret_value) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fapl for links")
 
-    if(l_fapl_id > H5P_DEFAULT) {
-	if(NULL==(fapl_plist = H5P_object_verify(l_fapl_id, H5P_FILE_ACCESS)))
-	    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list");
-
-	if((ret_value = H5P_copy_plist(fapl_plist, TRUE)) < 0)
-	    HGOTO_ERROR(H5E_INTERNAL, H5E_CANTINIT, FAIL, "unable to copy file access properties")
-    } else
-	ret_value = l_fapl_id;
-
 done:
     FUNC_LEAVE_API(ret_value);
 } /* end H5Pget_elink_fapl() */
@@ -750,7 +1133,7 @@ done:
  *              external link.  This should be either H5F_ACC_RDONLY or
  *              H5F_ACC_RDWR, or H5F_ACC_DEFAULT to unset the value.
  *
- * Return:  Non-negative on success/Negative on failure
+ * Return:      Non-negative on success/Negative on failure
  *
  * Programmer:  Neil Fortner
  *              Tuesday, December 9, 2008
@@ -767,7 +1150,9 @@ H5Pset_elink_acc_flags(hid_t lapl_id, unsigned flags)
     H5TRACE2("e", "iIu", lapl_id, flags);
 
     /* Check that flags are valid */
-    if((flags != H5F_ACC_RDWR) && (flags != H5F_ACC_RDONLY) && (flags != H5F_ACC_DEFAULT))
+    if((    flags != H5F_ACC_RDWR)      && (flags != (H5F_ACC_RDWR   | H5F_ACC_SWMR_WRITE))
+        && (flags != H5F_ACC_RDONLY)    && (flags != (H5F_ACC_RDONLY | H5F_ACC_SWMR_READ))
+        && (flags != H5F_ACC_DEFAULT))
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid file open flags")
 
     /* Get the plist structure */
@@ -789,7 +1174,7 @@ done:
  * Purpose:     Gets the file access flags to be used when traversing an
  *              external link.
  *
- * Return:  Non-negative on success/Negative on failure
+ * Return:      Non-negative on success/Negative on failure
  *
  * Programmer:  Neil Fortner
  *              Tuesday, December 9, 2008
@@ -810,8 +1195,8 @@ H5Pget_elink_acc_flags(hid_t lapl_id, unsigned *flags)
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Get flags */
-    if (flags)
-        if(H5P_get(plist, H5L_ACS_ELINK_FLAGS_NAME, flags)<0)
+    if(flags)
+        if(H5P_get(plist, H5L_ACS_ELINK_FLAGS_NAME, flags) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, 0, "can't get access flags")
 
 done:
@@ -826,7 +1211,7 @@ done:
  *              external link.  This should be either H5F_ACC_RDONLY or
  *              H5F_ACC_RDWR.
  *
- * Return:  Non-negative on success/Negative on failure
+ * Return:      Non-negative on success/Negative on failure
  *
  * Programmer:  Neil Fortner
  *              Tuesday, December 15, 2008
@@ -871,7 +1256,7 @@ done:
  * Purpose:     Gets the file access flags to be used when traversing an
  *              external link.
  *
- * Return:  Non-negative on success/Negative on failure
+ * Return:      Non-negative on success/Negative on failure
  *
  * Programmer:  Neil Fortner
  *              Tuesday, December 15, 2008
@@ -893,12 +1278,11 @@ H5Pget_elink_cb(hid_t lapl_id, H5L_elink_traverse_t *func, void **op_data)
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Get callback_info */
-    if(H5P_get(plist, H5L_ACS_ELINK_CB_NAME, &cb_info)<0)
+    if(H5P_get(plist, H5L_ACS_ELINK_CB_NAME, &cb_info) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get callback info")
 
     if(func)
         *func = cb_info.func;
-
     if(op_data)
         *op_data = cb_info.user_data;
 
@@ -906,4 +1290,3 @@ done:
     FUNC_LEAVE_API(ret_value)
 } /* end H5Pget_elink_cb() */
 
-

diff --git a/src/H5Plcpl.c b/src/H5Plcpl.c
index 21ee74b..f6e7793 100644
--- a/src/H5Plcpl.c
+++ b/src/H5Plcpl.c
@@ -27,7 +27,8 @@
 /****************/
 /* Module Setup */
 /****************/
-#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+#include "H5Pmodule.h"          /* This source code file is part of the H5P module */
 
 
 /***********/
@@ -48,7 +49,8 @@
 /* Definitions for create intermediate groups flag */
 #define H5L_CRT_INTERMEDIATE_GROUP_SIZE         sizeof(unsigned)
 #define H5L_CRT_INTERMEDIATE_GROUP_DEF          0
-
+#define H5L_CRT_INTERMEDIATE_GROUP_ENC          H5P__encode_unsigned
+#define H5L_CRT_INTERMEDIATE_GROUP_DEC          H5P__decode_unsigned
 
 /******************/
 /* Local Typedefs */
@@ -101,6 +103,9 @@ const H5P_libclass_t H5P_CLS_LCRT[1] = {{
 /* Local Variables */
 /*******************/
 
+/* Property value defaults */
+static const unsigned H5L_def_intmd_group_g = H5L_CRT_INTERMEDIATE_GROUP_DEF;      /* Default setting for creating intermediate groups */
+
 
 

 /*-------------------------------------------------------------------------
@@ -117,13 +122,14 @@ const H5P_libclass_t H5P_CLS_LCRT[1] = {{
 herr_t
 H5P_lcrt_reg_prop(H5P_genclass_t *pclass)
 {
-    unsigned intmd_group = H5L_CRT_INTERMEDIATE_GROUP_DEF;      /* Default setting for creating intermediate groups */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
     /* Register create intermediate groups property */
-    if(H5P_register_real(pclass, H5L_CRT_INTERMEDIATE_GROUP_NAME, H5L_CRT_INTERMEDIATE_GROUP_SIZE, &intmd_group, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5L_CRT_INTERMEDIATE_GROUP_NAME, H5L_CRT_INTERMEDIATE_GROUP_SIZE, &H5L_def_intmd_group_g, 
+            NULL, NULL, NULL, H5L_CRT_INTERMEDIATE_GROUP_ENC, H5L_CRT_INTERMEDIATE_GROUP_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
 done:
diff --git a/src/H5Pmodule.h b/src/H5Pmodule.h
new file mode 100644
index 0000000..ddf7c0f
--- /dev/null
+++ b/src/H5Pmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5P package.  Including this header means that the source file
+ *		is part of the H5P package.
+ */
+#ifndef _H5Pmodule_H
+#define _H5Pmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5P_MODULE
+#define H5_MY_PKG       H5P
+#define H5_MY_PKG_ERR   H5E_PLIST
+#define H5_MY_PKG_INIT  YES
+
+#endif /* _H5Pmodule_H */
+
diff --git a/src/H5Pocpl.c b/src/H5Pocpl.c
index 74b0bc7..27044d5 100644
--- a/src/H5Pocpl.c
+++ b/src/H5Pocpl.c
@@ -27,8 +27,9 @@
 /****************/
 /* Module Setup */
 /****************/
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
-#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+#define H5O_FRIEND		/*suppress error about including H5Opkg	  */
+#include "H5Pmodule.h"          /* This source code file is part of the H5P module */
 
 
 /***********/
@@ -37,6 +38,7 @@
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
 #include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5MMprivate.h"	/* Memory management			*/
 #include "H5Opkg.h"             /* Object headers			*/
 #include "H5Ppkg.h"		/* Property lists		  	*/
 #include "H5PLprivate.h"	/* Dynamic plugin			*/
@@ -50,13 +52,26 @@
 /* ========= Object Creation properties ============ */
 /* Definitions for the max. # of attributes to store compactly */
 #define H5O_CRT_ATTR_MAX_COMPACT_SIZE   sizeof(unsigned)
+#define H5O_CRT_ATTR_MAX_COMPACT_ENC    H5P__encode_unsigned
+#define H5O_CRT_ATTR_MAX_COMPACT_DEC    H5P__decode_unsigned
 /* Definitions for the min. # of attributes to store densely */
 #define H5O_CRT_ATTR_MIN_DENSE_SIZE     sizeof(unsigned)
+#define H5O_CRT_ATTR_MIN_DENSE_ENC      H5P__encode_unsigned
+#define H5O_CRT_ATTR_MIN_DENSE_DEC      H5P__decode_unsigned
 /* Definitions for object header flags */
 #define H5O_CRT_OHDR_FLAGS_SIZE         sizeof(uint8_t)
+#define H5O_CRT_OHDR_FLAGS_ENC          H5P__encode_uint8_t
+#define H5O_CRT_OHDR_FLAGS_DEC          H5P__decode_uint8_t
 /* Definitions for filter pipeline */
 #define H5O_CRT_PIPELINE_SIZE sizeof(H5O_pline_t)
+#define H5O_CRT_PIPELINE_SET            H5P__ocrt_pipeline_set
+#define H5O_CRT_PIPELINE_GET            H5P__ocrt_pipeline_get
+#define H5O_CRT_PIPELINE_ENC            H5P__ocrt_pipeline_enc
+#define H5O_CRT_PIPELINE_DEC            H5P__ocrt_pipeline_dec
+#define H5O_CRT_PIPELINE_DEL            H5P__ocrt_pipeline_del
+#define H5O_CRT_PIPELINE_COPY           H5P__ocrt_pipeline_copy
 #define H5O_CRT_PIPELINE_CMP            H5P__ocrt_pipeline_cmp
+#define H5O_CRT_PIPELINE_CLOSE          H5P__ocrt_pipeline_close
 
 
 /******************/
@@ -75,11 +90,16 @@
 
 /* Property class callbacks */
 static herr_t H5P__ocrt_reg_prop(H5P_genclass_t *pclass);
-static herr_t H5P__ocrt_copy(hid_t new_plist_t, hid_t old_plist_t, void *copy_data);
-static herr_t H5P__ocrt_close(hid_t dxpl_id, void *close_data);
 
 /* Property callbacks */
+static herr_t H5P__ocrt_pipeline_enc(const void *value, void **_pp, size_t *size);
+static herr_t H5P__ocrt_pipeline_dec(const void **_pp, void *value);
+static herr_t H5P__ocrt_pipeline_set(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__ocrt_pipeline_get(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__ocrt_pipeline_del(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__ocrt_pipeline_copy(const char *name, size_t size, void *value);
 static int H5P__ocrt_pipeline_cmp(const void *value1, const void *value2, size_t size);
+static herr_t H5P__ocrt_pipeline_close(const char *name, size_t size, void *value);
 
 /* Local routines */
 static herr_t H5P__set_filter(H5P_genplist_t *plist, H5Z_filter_t filter, 
@@ -102,9 +122,9 @@ const H5P_libclass_t H5P_CLS_OCRT[1] = {{
 
     NULL,		        /* Class creation callback      */
     NULL,		        /* Class creation callback info */
-    H5P__ocrt_copy,		/* Class copy callback          */
+    NULL,			/* Class copy callback          */
     NULL,		        /* Class copy callback info     */
-    H5P__ocrt_close,		/* Class close callback         */
+    NULL,			/* Class close callback         */
     NULL 		        /* Class close callback info    */
 }};
 
@@ -119,6 +139,12 @@ const H5P_libclass_t H5P_CLS_OCRT[1] = {{
 /* Local Variables */
 /*******************/
 
+/* Property value defaults */
+static const unsigned H5O_def_attr_max_compact_g = H5O_CRT_ATTR_MAX_COMPACT_DEF;   /* Default max. compact attribute storage settings */
+static const unsigned H5O_def_attr_min_dense_g = H5O_CRT_ATTR_MIN_DENSE_DEF;       /* Default min. dense attribute storage settings */
+static const uint8_t H5O_def_ohdr_flags_g = H5O_CRT_OHDR_FLAGS_DEF;        /* Default object header flag settings */
+static const H5O_pline_t H5O_def_pline_g = H5O_CRT_PIPELINE_DEF;           /* Default I/O pipeline setting */
+
 
 

 /*-------------------------------------------------------------------------
@@ -136,28 +162,32 @@ const H5P_libclass_t H5P_CLS_OCRT[1] = {{
 static herr_t
 H5P__ocrt_reg_prop(H5P_genclass_t *pclass)
 {
-    unsigned attr_max_compact = H5O_CRT_ATTR_MAX_COMPACT_DEF;   /* Default max. compact attribute storage settings */
-    unsigned attr_min_dense = H5O_CRT_ATTR_MIN_DENSE_DEF;       /* Default min. dense attribute storage settings */
-    uint8_t ohdr_flags = H5O_CRT_OHDR_FLAGS_DEF;        /* Default object header flag settings */
-    H5O_pline_t pline = H5O_CRT_PIPELINE_DEF;           /* Default I/O pipeline setting */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
 
     /* Register max. compact attribute storage property */
-    if(H5P_register_real(pclass, H5O_CRT_ATTR_MAX_COMPACT_NAME, H5O_CRT_ATTR_MAX_COMPACT_SIZE, &attr_max_compact, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5O_CRT_ATTR_MAX_COMPACT_NAME, H5O_CRT_ATTR_MAX_COMPACT_SIZE, &H5O_def_attr_max_compact_g, 
+            NULL, NULL, NULL, H5O_CRT_ATTR_MAX_COMPACT_ENC, H5O_CRT_ATTR_MAX_COMPACT_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register min. dense attribute storage property */
-    if(H5P_register_real(pclass, H5O_CRT_ATTR_MIN_DENSE_NAME, H5O_CRT_ATTR_MIN_DENSE_SIZE, &attr_min_dense, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5O_CRT_ATTR_MIN_DENSE_NAME, H5O_CRT_ATTR_MIN_DENSE_SIZE, &H5O_def_attr_min_dense_g, 
+            NULL, NULL, NULL, H5O_CRT_ATTR_MIN_DENSE_ENC, H5O_CRT_ATTR_MIN_DENSE_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register object header flags property */
-    if(H5P_register_real(pclass, H5O_CRT_OHDR_FLAGS_NAME, H5O_CRT_OHDR_FLAGS_SIZE, &ohdr_flags, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5O_CRT_OHDR_FLAGS_NAME, H5O_CRT_OHDR_FLAGS_SIZE, &H5O_def_ohdr_flags_g, 
+            NULL, NULL, NULL, H5O_CRT_OHDR_FLAGS_ENC, H5O_CRT_OHDR_FLAGS_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register the pipeline property */
-    if(H5P_register_real(pclass, H5O_CRT_PIPELINE_NAME, H5O_CRT_PIPELINE_SIZE, &pline, NULL, NULL, NULL, NULL, NULL, H5O_CRT_PIPELINE_CMP, NULL) < 0)
+    if(H5P_register_real(pclass, H5O_CRT_PIPELINE_NAME, H5O_CRT_PIPELINE_SIZE, &H5O_def_pline_g, 
+            NULL, H5O_CRT_PIPELINE_SET, H5O_CRT_PIPELINE_GET, H5O_CRT_PIPELINE_ENC, H5O_CRT_PIPELINE_DEC,
+            H5O_CRT_PIPELINE_DEL, H5O_CRT_PIPELINE_COPY, H5O_CRT_PIPELINE_CMP, H5O_CRT_PIPELINE_CLOSE) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
 done:
@@ -166,97 +196,6 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:       H5P__ocrt_copy
- *
- * Purpose:        Callback routine which is called whenever any object
- *                 creation property list is copied.  This routine copies
- *                 the properties from the old list to the new list.
- *
- * Return:         Success:        Non-negative
- *                 Failure:        Negative
- *
- * Programmer:     Neil Fortner
- *                 Monday, September 21, 2009
- *
- *-------------------------------------------------------------------------
- */
-/* ARGSUSED */
-static herr_t
-H5P__ocrt_copy(hid_t dst_plist_id, hid_t src_plist_id, void H5_ATTR_UNUSED *copy_data)
-{
-    H5O_pline_t    src_pline, dst_pline;        /* Source & destination pipelines */
-    H5P_genplist_t *src_plist;                  /* Pointer to source property list */
-    H5P_genplist_t *dst_plist;                  /* Pointer to destination property list */
-    herr_t         ret_value = SUCCEED;         /* Return value */
-
-    FUNC_ENTER_STATIC
-
-    /* Verify property list IDs */
-    if(NULL == (dst_plist = (H5P_genplist_t *)H5I_object(dst_plist_id)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an object creation property list")
-    if(NULL == (src_plist = (H5P_genplist_t *)H5I_object(src_plist_id)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an object creation property list")
-
-    /* Get the link pipeline property from the old property list */
-    if(H5P_get(src_plist, H5O_CRT_PIPELINE_NAME, &src_pline) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
-
-    /* Make copy of link pipeline */
-    if(NULL == H5O_msg_copy(H5O_PLINE_ID, &src_pline, &dst_pline))
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTINIT, FAIL, "can't copy link pipeline")
-
-    /* Set the link pipeline property for the destination property list */
-    if(H5P_set(dst_plist, H5O_CRT_PIPELINE_NAME, &dst_pline) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set pipeline")
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P__ocrt_copy() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5P__ocrt_close
- *
- * Purpose:	Callback routine which is called whenever any object create
- *              property list is closed.  This routine performs any generic
- *              cleanup needed on the properties the library put into the list.
- *
- * Return:	Success:	Non-negative
- *		Failure:	Negative
- *
- * Programmer:     Neil Fortner
- *                 Monday, September 21, 2009
- *
- *-------------------------------------------------------------------------
- */
-/* ARGSUSED */
-static herr_t
-H5P__ocrt_close(hid_t dcpl_id, void H5_ATTR_UNUSED *close_data)
-{
-    H5O_pline_t     pline;              /* I/O pipeline */
-    H5P_genplist_t *plist;              /* Property list */
-    herr_t ret_value = SUCCEED;         /* Return value */
-
-    FUNC_ENTER_STATIC
-
-    /* Check arguments */
-    if(NULL == (plist = (H5P_genplist_t *)H5I_object(dcpl_id)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an object creation property list")
-
-    /* Get the link pipeline property from the old property list */
-    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
-
-    /* Clean up any values set for the link pipeline */
-    if(H5O_msg_reset(H5O_PLINE_ID, &pline) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTFREE, FAIL, "can't release pipeline info")
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5P__ocrt_close() */
-
-

-/*-------------------------------------------------------------------------
  * Function:	H5Pset_attr_phase_change
  *
  * Purpose:	Sets the cutoff values for indexes storing attributes
@@ -594,7 +533,7 @@ H5P_modify_filter(H5P_genplist_t *plist, H5Z_filter_t filter, unsigned flags,
     FUNC_ENTER_NOAPI(FAIL)
 
     /* Get the pipeline property to modify */
-    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
 
     /* Modify the filter parameters of the I/O pipeline */
@@ -602,7 +541,7 @@ H5P_modify_filter(H5P_genplist_t *plist, H5Z_filter_t filter, unsigned flags,
         HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add filter to pipeline")
 
     /* Put the I/O pipeline information back into the property list */
-    if(H5P_set(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_poke(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set pipeline")
 
 done:
@@ -807,7 +746,7 @@ H5P__set_filter(H5P_genplist_t *plist, H5Z_filter_t filter, unsigned int flags,
 
     /* Check if filter is already available */
     if((filter_avail = H5Z_filter_avail(filter)) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't check filter availability")
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't check filter availability")
 
     /* If filter is not available, try to dynamically load it */
     if(!filter_avail) {
@@ -816,11 +755,11 @@ H5P__set_filter(H5P_genplist_t *plist, H5Z_filter_t filter, unsigned int flags,
         if(NULL == (filter_info = (const H5Z_class2_t *)H5PL_load(H5PL_TYPE_FILTER, (int)filter)))
             HGOTO_ERROR(H5E_PLINE, H5E_CANTLOAD, FAIL, "failed to load dynamically loaded plugin")
         if(H5Z_register(filter_info) < 0)
-	    HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register dynamic filter")
+	    HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register filter")
     } /* end if */
 
     /* Get the pipeline property to append to */
-    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
 
     /* Add the filter to the I/O pipeline */
@@ -828,7 +767,7 @@ H5P__set_filter(H5P_genplist_t *plist, H5Z_filter_t filter, unsigned int flags,
         HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add filter to pipeline")
 
     /* Put the I/O pipeline information back into the property list */
-    if(H5P_set(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_poke(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set pipeline")
 
 done:
@@ -878,7 +817,7 @@ H5Pget_nfilters(hid_t plist_id)
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Get the pipeline property to query */
-    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
 
     /* Set return value */
@@ -961,7 +900,7 @@ H5Pget_filter2(hid_t plist_id, unsigned idx, unsigned int *flags/*out*/,
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, H5Z_FILTER_ERROR, "can't find object for ID")
 
     /* Get the pipeline property to query */
-    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5Z_FILTER_ERROR, "can't get pipeline")
 
     /* Check index */
@@ -1017,7 +956,7 @@ H5P_get_filter_by_id(H5P_genplist_t *plist, H5Z_filter_t id, unsigned int *flags
     FUNC_ENTER_NOAPI(FAIL)
 
     /* Get pipeline info */
-    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
 
     /* Get pointer to filter in pipeline */
@@ -1068,8 +1007,6 @@ H5Pget_filter_by_id2(hid_t plist_id, H5Z_filter_t id, unsigned int *flags/*out*/
     size_t namelen, char name[]/*out*/, unsigned *filter_config)
 {
     H5P_genplist_t  *plist;                 /* Property list */
-    H5O_pline_t     pline;                  /* Filter pipeline */
-    const H5Z_filter_info_t *filter;        /* Pointer to filter information */
     herr_t          ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_API(FAIL)
@@ -1148,7 +1085,7 @@ H5Pall_filters_avail(hid_t plist_id)
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Get the pipeline property to query */
-    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
 
     /* Check if all filters are available */
@@ -1171,7 +1108,7 @@ done:
  *              FAIL: 		error
  *
  * Programmer:	Raymond Lu
- *              14 May 2013
+ *              26 April 2013
  *
  *-------------------------------------------------------------------------
  */
@@ -1184,7 +1121,7 @@ H5P_filter_in_pline(H5P_genplist_t *plist, H5Z_filter_t id)
     FUNC_ENTER_NOAPI(FAIL)
 
     /* Get pipeline info */
-    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
 
     /* Check if the file is in the pipeline */
@@ -1231,7 +1168,7 @@ H5Premove_filter(hid_t plist_id, H5Z_filter_t filter)
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Get the pipeline property to modify */
-    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
 
     /* Check if there are any filters */
@@ -1241,7 +1178,7 @@ H5Premove_filter(hid_t plist_id, H5Z_filter_t filter)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't delete filter")
 
         /* Put the I/O pipeline information back into the property list */
-        if(H5P_set(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+        if(H5P_poke(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set pipeline")
     } /* end if */
 
@@ -1299,7 +1236,7 @@ H5Pset_deflate(hid_t plist_id, unsigned level)
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Get the pipeline property to append to */
-    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
 
     /* Add the filter */
@@ -1307,7 +1244,7 @@ H5Pset_deflate(hid_t plist_id, unsigned level)
         HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add deflate filter to pipeline")
 
     /* Put the I/O pipeline information back into the property list */
-    if(H5P_set(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_poke(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set pipeline")
 
 done:
@@ -1350,7 +1287,7 @@ H5Pset_fletcher32(hid_t plist_id)
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Get the pipeline property to append to */
-    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get pipeline")
 
     /* Add the Fletcher32 checksum as a filter */
@@ -1358,7 +1295,7 @@ H5Pset_fletcher32(hid_t plist_id)
         HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add fletcher32 filter to pipeline")
 
     /* Put the I/O pipeline information back into the property list */
-    if(H5P_set(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_poke(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set pipeline")
 
 done:
@@ -1443,6 +1380,342 @@ H5P_get_filter(const H5Z_filter_info_t *filter, unsigned int *flags/*out*/,
 
 

 /*-------------------------------------------------------------------------
+ * Function:    H5P__ocrt_pipeline_set
+ *
+ * Purpose:     Copies an I/O pipeline property when it's set for a property list
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, Sept 3, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__ocrt_pipeline_set(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    H5O_pline_t     *pline = (H5O_pline_t *)value; /* Create local aliases for values */
+    H5O_pline_t     new_pline;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Make copy of I/O pipeline */
+    if(NULL == H5O_msg_copy(H5O_PLINE_ID, pline, &new_pline))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy I/O pipeline")
+
+    /* Copy new I/O pipeline message over old one */
+    *pline = new_pline;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__ocrt_pipeline_set() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__ocrt_pipeline_get
+ *
+ * Purpose:     Copies a layout property when it's retrieved from a property list
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, Sept 1, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__ocrt_pipeline_get(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    H5O_pline_t     *pline = (H5O_pline_t *)value; /* Create local aliases for values */
+    H5O_pline_t     new_pline;
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Make copy of I/O pipeline */
+    if(NULL == H5O_msg_copy(H5O_PLINE_ID, pline, &new_pline))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy I/O pipeline")
+
+    /* Copy new I/O pipeline message over old one */
+    *pline = new_pline;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__ocrt_pipeline_get() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__ocrt_pipeline_enc
+ *
+ * Purpose:        Callback routine which is called whenever the pipeline
+ *                 property in the dataset access property list is
+ *                 decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 Monday, October 10, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__ocrt_pipeline_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5O_pline_t *pline = (const H5O_pline_t *)value;
+    uint8_t **pp = (uint8_t **)_pp;
+    size_t u;           /* Local index variable */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    HDassert(pline);
+    HDassert(size);
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+
+    if(NULL != *pp) {
+        unsigned enc_size;
+        uint64_t enc_value;
+
+        /* Encode size of unsigned */
+        *(*pp)++ = (uint8_t)sizeof(unsigned);
+
+        /* encode nused value */
+        enc_value = (uint64_t)pline->nused;
+        enc_size = H5VM_limit_enc_size(enc_value);
+        HDassert(enc_size < 256);
+        *(*pp)++ = (uint8_t)enc_size;
+        UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+
+        /* encode each pipeline */
+        for(u = 0; u < pline->nused; u++) {
+            unsigned v;         /* Local index variable */
+
+            /* encode filter ID */
+            INT32ENCODE(*pp, pline->filter[u].id)
+
+            /* encode filter flags */
+            H5_ENCODE_UNSIGNED(*pp, pline->filter[u].flags)
+
+            /* encode filter name if it exists */
+            if(NULL != pline->filter[u].name) {
+                /* encode TRUE indicating that it exits */
+                *(*pp)++ = (uint8_t)TRUE;
+
+                /* encode filter name */
+                HDmemcpy(*pp, (uint8_t *)(pline->filter[u].name), H5Z_COMMON_NAME_LEN);
+                *pp += H5Z_COMMON_NAME_LEN;
+            } /* end if */
+            else
+                /* encode FALSE indicating that it does not exist */
+                *(*pp)++ = (uint8_t)FALSE;
+
+            /* encode cd_nelmts */
+            enc_value = (uint64_t)pline->filter[u].cd_nelmts;
+            enc_size = H5VM_limit_enc_size(enc_value);
+            HDassert(enc_size < 256);
+            *(*pp)++ = (uint8_t)enc_size;
+            UINT64ENCODE_VAR(*pp, enc_value, enc_size);
+
+            /* encode all values */
+            for(v = 0; v < pline->filter[u].cd_nelmts; v++)
+                H5_ENCODE_UNSIGNED(*pp, pline->filter[u].cd_values[v])
+        } /* end for */
+    } /* end if */
+
+    /* calculate size required for encoding */
+    *size += 1;
+    *size += (1 + H5VM_limit_enc_size((uint64_t)pline->nused));
+    for(u = 0; u < pline->nused; u++) {
+        *size += (sizeof(int32_t) + sizeof(unsigned) + 1);
+        if(NULL != pline->filter[u].name)
+            *size += H5Z_COMMON_NAME_LEN;
+        *size += (1 + H5VM_limit_enc_size((uint64_t)pline->filter[u].cd_nelmts));
+        *size += pline->filter[u].cd_nelmts * sizeof(unsigned);
+    } /* end for */
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__ocrt_pipeline_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__ocrt_pipeline_dec
+ *
+ * Purpose:        Callback routine which is called whenever the pipeline
+ *                 property in the dataset access property list is
+ *                 decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Mohamad Chaarawi
+ *                 Monday, October 10, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5P__ocrt_pipeline_dec(const void **_pp, void *_value)
+{
+    H5O_pline_t *pline = (H5O_pline_t *)_value;   /* Property to set */
+    const uint8_t **pp = (const uint8_t **)_pp;
+    size_t nused;                       /* Number of filters used for pipeline */
+    unsigned enc_size;                  /* Size of encoded value (in bytes) */
+    uint64_t enc_value;                 /* Value to encode */
+    size_t u;                           /* Local index variable */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    HDcompile_assert(sizeof(size_t) <= sizeof(uint64_t));
+
+    /* Decode the size of size_t */
+    enc_size = *(*pp)++;
+    if(enc_size != sizeof(unsigned))
+        HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "unsigned value can't be decoded")
+
+    /* decode nused */
+    enc_size = *(*pp)++;
+    HDassert(enc_size < 256);
+    UINT64DECODE_VAR(*pp, enc_value, enc_size);
+    nused = (size_t)enc_value;
+
+    /* Set property default value */
+    HDmemset(pline, 0, sizeof(H5O_pline_t));
+    *pline = H5O_def_pline_g;
+
+    for(u = 0; u < nused; u++) {
+        H5Z_filter_info_t filter;       /* Filter info, for pipeline */
+        uint8_t has_name;               /* Flag to indicate whether filter has a name */
+        unsigned v;                     /* Local index variable */
+
+        /* decode filter id */
+        INT32DECODE(*pp, filter.id)
+
+        /* decode filter flags */
+        H5_DECODE_UNSIGNED(*pp, filter.flags)
+
+        /* decode value indicating if the name is encoded */
+        has_name = *(*pp)++;
+        if(has_name) {
+            /* decode name */
+            filter.name = H5MM_xstrdup((const char *)(*pp));
+            *pp += H5Z_COMMON_NAME_LEN;
+        } /* end if */
+        else
+            filter.name = NULL;
+
+        /* decode num elements */
+        enc_size = *(*pp)++;
+        HDassert(enc_size < 256);
+        UINT64DECODE_VAR(*pp, enc_value, enc_size);
+        filter.cd_nelmts = (size_t)enc_value;
+
+        if(filter.cd_nelmts) {
+            if(NULL == (filter.cd_values = (unsigned *)H5MM_malloc(sizeof(unsigned) * filter.cd_nelmts)))
+                HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "memory allocation failed for cd_values")
+        } /* end if */
+        else
+            filter.cd_values = NULL;
+
+        /* decode values */
+        for(v = 0; v < filter.cd_nelmts; v++)
+            H5_DECODE_UNSIGNED(*pp, filter.cd_values[v])
+
+        /* Add the filter to the I/O pipeline */
+        if(H5Z_append(pline, filter.id, filter.flags, filter.cd_nelmts, filter.cd_values) < 0)
+            HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to add filter to pipeline")
+
+        /* Free cd_values, if it was allocated */
+        filter.cd_values = (unsigned *)H5MM_xfree(filter.cd_values);
+    } /* end for */
+
+done: 
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5P__ocrt_pipeline_dec() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__ocrt_pipeline_del
+ *
+ * Purpose:     Frees memory used to store the I/O pipeline property
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, Sept 3, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__ocrt_pipeline_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Reset the old I/O pipeline */
+    if(H5O_msg_reset(H5O_PLINE_ID, value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTRESET, FAIL, "can't release I/O pipeline message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__ocrt_pipeline_del() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:    H5P__ocrt_pipeline_copy
+ *
+ * Purpose:     Copy the I/O pipeline property
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, Sept 3, 2015
+ *
+ *--------------------------------------------------------------------------
+ */
+static herr_t
+H5P__ocrt_pipeline_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size,
+    void *value)
+{
+    H5O_pline_t     *pline = (H5O_pline_t *)value; /* Create local aliases for values */
+    H5O_pline_t     new_pline;
+    herr_t          ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(pline);
+
+    /* Make copy of I/O pipeline */
+    if(NULL == H5O_msg_copy(H5O_PLINE_ID, pline, &new_pline))
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy I/O pipeline")
+
+    /* Copy new I/O pipeline message over old one */
+    *pline = new_pline;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__ocrt_pipeline_copy() */
+
+

+/*-------------------------------------------------------------------------
  * Function:       H5P__ocrt_pipeline_cmp
  *
  * Purpose:        Callback routine which is called whenever a filter pipeline
@@ -1523,6 +1796,39 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5P__ocrt_pipeline_cmp() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__ocrt_pipeline_close
+ *
+ * Purpose:     Frees memory used to store the I/O pipeline property
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Thursday, Sept 3, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__ocrt_pipeline_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size,
+    void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Reset the old I/O pipeline */
+    if(H5O_msg_reset(H5O_PLINE_ID, value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTRESET, FAIL, "can't release I/O pipeline message")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__ocrt_pipeline_close() */
+
 #ifndef H5_NO_DEPRECATED_SYMBOLS
 

 /*-------------------------------------------------------------------------
@@ -1588,7 +1894,7 @@ H5Pget_filter1(hid_t plist_id, unsigned idx, unsigned int *flags/*out*/,
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, H5Z_FILTER_ERROR, "can't find object for ID")
 
     /* Get pipeline info */
-    if(H5P_get(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
+    if(H5P_peek(plist, H5O_CRT_PIPELINE_NAME, &pline) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5Z_FILTER_ERROR, "can't get pipeline")
 
     /* Check more args */
diff --git a/src/H5Pocpypl.c b/src/H5Pocpypl.c
index 3de20ff..faa2a04 100644
--- a/src/H5Pocpypl.c
+++ b/src/H5Pocpypl.c
@@ -27,7 +27,8 @@
 /****************/
 /* Module Setup */
 /****************/
-#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+#include "H5Pmodule.h"          /* This source code file is part of the H5P module */
 
 
 /***********/
@@ -50,9 +51,16 @@
 /* Definitions for copy options */
 #define H5O_CPY_OPTION_SIZE			sizeof(unsigned)
 #define H5O_CPY_OPTION_DEF			0
+#define H5O_CPY_OPTION_ENC			H5P__encode_unsigned
+#define H5O_CPY_OPTION_DEC			H5P__decode_unsigned
 /* Definitions for merge committed dtype list */
-#define H5O_CPY_MERGE_COMM_DT_LIST_SIZE        sizeof(char *)
+#define H5O_CPY_MERGE_COMM_DT_LIST_SIZE        sizeof(H5O_copy_dtype_merge_list_t *)
 #define H5O_CPY_MERGE_COMM_DT_LIST_DEF         NULL
+#define H5O_CPY_MERGE_COMM_DT_LIST_SET         H5P__ocpy_merge_comm_dt_list_set
+#define H5O_CPY_MERGE_COMM_DT_LIST_GET         H5P__ocpy_merge_comm_dt_list_get
+#define H5O_CPY_MERGE_COMM_DT_LIST_ENC         H5P__ocpy_merge_comm_dt_list_enc
+#define H5O_CPY_MERGE_COMM_DT_LIST_DEC         H5P__ocpy_merge_comm_dt_list_dec
+#define H5O_CPY_MERGE_COMM_DT_LIST_DEL         H5P__ocpy_merge_comm_dt_list_del
 #define H5O_CPY_MERGE_COMM_DT_LIST_COPY        H5P__ocpy_merge_comm_dt_list_copy
 #define H5O_CPY_MERGE_COMM_DT_LIST_CMP         H5P__ocpy_merge_comm_dt_list_cmp
 #define H5O_CPY_MERGE_COMM_DT_LIST_CLOSE       H5P__ocpy_merge_comm_dt_list_close
@@ -77,11 +85,17 @@
 
 /* General routines */
 static H5O_copy_dtype_merge_list_t *H5P__free_merge_comm_dtype_list(H5O_copy_dtype_merge_list_t *dt_list);
+static herr_t H5P__copy_merge_comm_dt_list(H5O_copy_dtype_merge_list_t **value);
 
 /* Property class callbacks */
 static herr_t H5P__ocpy_reg_prop(H5P_genclass_t *pclass);
 
 /* Property callbacks */
+static herr_t H5P__ocpy_merge_comm_dt_list_set(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__ocpy_merge_comm_dt_list_get(hid_t prop_id, const char *name, size_t size, void *value);
+static herr_t H5P__ocpy_merge_comm_dt_list_enc(const void *value, void **_pp, size_t *size);
+static herr_t H5P__ocpy_merge_comm_dt_list_dec(const void **_pp, void *value);
+static herr_t H5P__ocpy_merge_comm_dt_list_del(hid_t prop_id, const char *name, size_t size, void *value);
 static herr_t H5P__ocpy_merge_comm_dt_list_copy(const char* name, size_t size, void* value);
 static int H5P__ocpy_merge_comm_dt_list_cmp(const void *value1, const void *value2, size_t size);
 static herr_t H5P__ocpy_merge_comm_dt_list_close(const char* name, size_t size, void* value);
@@ -120,6 +134,11 @@ const H5P_libclass_t H5P_CLS_OCPY[1] = {{
 /* Local Variables */
 /*******************/
 
+/* Property value defaults */
+static const unsigned H5O_def_ocpy_option_g = H5O_CPY_OPTION_DEF;  /* Default object copy flags */
+static const H5O_copy_dtype_merge_list_t *H5O_def_merge_comm_dtype_list_g = H5O_CPY_MERGE_COMM_DT_LIST_DEF; /* Default merge committed dtype list */
+static const H5O_mcdt_cb_info_t H5O_def_mcdt_cb_g = H5O_CPY_MCDT_SEARCH_CB_DEF; /* Default callback before searching the global list of committed datatypes at destination */
+
 /* Declare a free list to manage the H5O_copy_dtype_merge_list_t struct */
 H5FL_DEFINE(H5O_copy_dtype_merge_list_t);
 
@@ -139,23 +158,26 @@ H5FL_DEFINE(H5O_copy_dtype_merge_list_t);
 static herr_t
 H5P__ocpy_reg_prop(H5P_genclass_t *pclass)
 {
-    unsigned ocpy_option = H5O_CPY_OPTION_DEF;  /* Default object copy flags */
-    H5O_copy_dtype_merge_list_t *merge_comm_dtype_list = H5O_CPY_MERGE_COMM_DT_LIST_DEF; /* Default merge committed dtype list */
-    H5O_mcdt_cb_info_t mcdt_cb = H5O_CPY_MCDT_SEARCH_CB_DEF; /* Default callback before searching the global list of committed datatypes at destination */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
 
     /* Register copy options property */
-    if(H5P_register_real(pclass, H5O_CPY_OPTION_NAME, H5O_CPY_OPTION_SIZE, &ocpy_option, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5O_CPY_OPTION_NAME, H5O_CPY_OPTION_SIZE, &H5O_def_ocpy_option_g, 
+            NULL, NULL, NULL, H5O_CPY_OPTION_ENC, H5O_CPY_OPTION_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register merge named dtype list property */
-    if(H5P_register_real(pclass, H5O_CPY_MERGE_COMM_DT_LIST_NAME, H5O_CPY_MERGE_COMM_DT_LIST_SIZE, &merge_comm_dtype_list, NULL, NULL, NULL, NULL, H5O_CPY_MERGE_COMM_DT_LIST_COPY, H5O_CPY_MERGE_COMM_DT_LIST_CMP, H5O_CPY_MERGE_COMM_DT_LIST_CLOSE) < 0)
+    if(H5P_register_real(pclass, H5O_CPY_MERGE_COMM_DT_LIST_NAME, H5O_CPY_MERGE_COMM_DT_LIST_SIZE, &H5O_def_merge_comm_dtype_list_g, 
+            NULL, H5O_CPY_MERGE_COMM_DT_LIST_SET, H5O_CPY_MERGE_COMM_DT_LIST_GET, H5O_CPY_MERGE_COMM_DT_LIST_ENC, H5O_CPY_MERGE_COMM_DT_LIST_DEC,
+            H5O_CPY_MERGE_COMM_DT_LIST_DEL, H5O_CPY_MERGE_COMM_DT_LIST_COPY, H5O_CPY_MERGE_COMM_DT_LIST_CMP, H5O_CPY_MERGE_COMM_DT_LIST_CLOSE) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
     /* Register property for callback when completing the search for a matching named datatype from the named dtype list */
-    if(H5P_register_real(pclass, H5O_CPY_MCDT_SEARCH_CB_NAME, H5O_CPY_MCDT_SEARCH_CB_SIZE, &mcdt_cb, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    /* (Note: this property should not have an encode/decode callback -QAK) */
+    if(H5P_register_real(pclass, H5O_CPY_MCDT_SEARCH_CB_NAME, H5O_CPY_MCDT_SEARCH_CB_SIZE, &H5O_def_mcdt_cb_g, 
+            NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
 done:
@@ -172,20 +194,23 @@ done:
  *
  * Programmer:  Neil Fortner
  *              October 27, 2011
+ *
  *-------------------------------------------------------------------------
  */
 static H5O_copy_dtype_merge_list_t *
 H5P__free_merge_comm_dtype_list(H5O_copy_dtype_merge_list_t *dt_list)
 {
-    H5O_copy_dtype_merge_list_t *tmp_node;
-
     FUNC_ENTER_STATIC_NOERR
 
     /* Free the list */
     while(dt_list) {
+        H5O_copy_dtype_merge_list_t *tmp_node;
+
         tmp_node = dt_list->next;
+
         (void)H5MM_xfree(dt_list->path);
         (void)H5FL_FREE(H5O_copy_dtype_merge_list_t, dt_list);
+
         dt_list = tmp_node;
     } /* end while */
 
@@ -194,22 +219,20 @@ H5P__free_merge_comm_dtype_list(H5O_copy_dtype_merge_list_t *dt_list)
 
 

 /*--------------------------------------------------------------------------
- * Function:	H5P__ocpy_merge_comm_dt_list_copy
+ * Function:	H5P__copy_merge_comm_dt_list
  *
- * Purpose:	Copy the merge committed datatype list
+ * Purpose:	Copy a merge committed datatype list
  *
  * Return:	Success:	Non-negative
  * 		Failure:	Negative
  *
  * Programmer:	Quincey Koziol
- *		Friday, August 31, 2012
+ *		Wednesday, September 2, 2015
  *
  *--------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
-H5P__ocpy_merge_comm_dt_list_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size,
-    void *value)
+H5P__copy_merge_comm_dt_list(H5O_copy_dtype_merge_list_t **value)
 {
     const H5O_copy_dtype_merge_list_t *src_dt_list;     /* Source merge named datatype lists */
     H5O_copy_dtype_merge_list_t *dst_dt_list = NULL;    /* Destination merge named datatype lists */
@@ -218,16 +241,17 @@ H5P__ocpy_merge_comm_dt_list_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATT
 
     FUNC_ENTER_STATIC
 
+    /* Sanity check */
     HDassert(value);
 
     /* Make copy of merge committed dtype list */
-    src_dt_list = *(const H5O_copy_dtype_merge_list_t **)value;
+    src_dt_list = *value;
     while(src_dt_list) {
         /* Copy src_dt_list */
         if(NULL == (tmp_dt_list = H5FL_CALLOC(H5O_copy_dtype_merge_list_t)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "memory allocation failed")
         if(NULL == (tmp_dt_list->path = H5MM_strdup(src_dt_list->path)))
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed")
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "memory allocation failed")
 
         /* Add copied node to dest dtype list */
         if(dst_dt_list_tail) {
@@ -245,7 +269,7 @@ H5P__ocpy_merge_comm_dt_list_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATT
     } /* end while */
 
     /* Set the merge named dtype list property for the destination property list */
-    *(H5O_copy_dtype_merge_list_t **)value = dst_dt_list;
+    *value = dst_dt_list;
 
 done:
     if(ret_value < 0) {
@@ -257,6 +281,268 @@ done:
     } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__copy_merge_comm_dt_list() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__ocpy_merge_comm_dt_list_set
+ *
+ * Purpose:     Copies a merge committed datatype list property when it's set for a property list
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Wednesday, Sept 2, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__ocpy_merge_comm_dt_list_set(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Make copy of merge committed dtype list */
+    if(H5P__copy_merge_comm_dt_list((H5O_copy_dtype_merge_list_t **)value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy merge committed dtype list")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__ocpy_merge_comm_dt_list_set() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5P__ocpy_merge_comm_dt_list_get
+ *
+ * Purpose:     Copies a merge committed datatype list property when it's retrieved from a property list
+ *
+ * Return:      Success:        Non-negative
+ *              Failure:        Negative
+ *
+ * Programmer:  Quincey Koziol
+ *              Wednesday, Sept 2, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__ocpy_merge_comm_dt_list_get(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Make copy of merge committed dtype list */
+    if(H5P__copy_merge_comm_dt_list((H5O_copy_dtype_merge_list_t **)value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy merge committed dtype list")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5P__ocpy_merge_comm_dt_list_get() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__ocpy_merge_comm_dt_list_enc
+ *
+ * Purpose:        Callback routine which is called whenever the common
+ *		   datatype property in the object copy property list is
+ *                 decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Friday, August 31, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__ocpy_merge_comm_dt_list_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5O_copy_dtype_merge_list_t * const *dt_list_ptr = (const H5O_copy_dtype_merge_list_t * const *)value;
+    uint8_t **pp = (uint8_t **)_pp;
+    const H5O_copy_dtype_merge_list_t *dt_list;         /* Pointer to merge named datatype list */
+    size_t len;                                 /* Length of path component */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    HDassert(dt_list_ptr);
+    HDassert(size);
+
+    /* Iterate over merge committed dtype list */
+    dt_list = *dt_list_ptr;
+    while(dt_list) {
+        /* Get length of encoded path */
+        len = HDstrlen(dt_list->path) + 1;
+
+        /* Encode merge committed dtype list */
+        if(*pp) {
+            HDmemcpy(*(char **)pp, dt_list->path, len);
+            *pp += len;
+        } /* end if */
+
+        /* Increment the size of the buffer */
+        *size += len;
+
+        /* Advance to the next node */
+        dt_list = dt_list->next;
+    } /* end while */
+
+    /* Encode the terminator for the string sequence */
+    if(*pp)
+        *(*pp)++ = (uint8_t)'\0';
+
+    /* Account for the string sequence terminator */
+    *size += 1;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__ocpy_merge_comm_dt_list_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__ocpy_merge_comm_dt_list_dec
+ *
+ * Purpose:        Callback routine which is called whenever the common
+ *                 datatype property in the dataset access property list is
+ *                 decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Friday, August 31, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t 
+H5P__ocpy_merge_comm_dt_list_dec(const void **_pp, void *_value)
+{
+    H5O_copy_dtype_merge_list_t **dt_list = (H5O_copy_dtype_merge_list_t **)_value;        /* Pointer to merge named datatype list */
+    const uint8_t **pp = (const uint8_t **)_pp;
+    H5O_copy_dtype_merge_list_t *dt_list_tail = NULL, *tmp_dt_list = NULL; /* temporary merge named datatype lists */
+    size_t len;                         /* Length of path component */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(dt_list);
+
+    /* Start off with NULL (default value) */
+    *dt_list = NULL;
+    
+    /* Decode the string sequence */
+    len = HDstrlen(*(const char **)pp);
+    while(len > 0) {
+        /* Create new node & duplicate string */
+        if(NULL == (tmp_dt_list = H5FL_CALLOC(H5O_copy_dtype_merge_list_t)))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "memory allocation failed")
+        if(NULL == (tmp_dt_list->path = H5MM_strdup(*(const char **)pp)))
+            HGOTO_ERROR(H5E_PLIST, H5E_CANTALLOC, FAIL, "memory allocation failed")
+        *pp += len + 1;
+        HDassert(len == HDstrlen(tmp_dt_list->path));
+
+        /* Add copied node to dtype list */
+        if(dt_list_tail) {
+            dt_list_tail->next = tmp_dt_list;
+            dt_list_tail = tmp_dt_list;
+        } /* end if */
+        else {
+            *dt_list = tmp_dt_list;
+            dt_list_tail = tmp_dt_list;
+        } /* end else */
+        tmp_dt_list = NULL;
+
+        /* Compute length of next string */
+        len = HDstrlen(*(const char **)pp);
+    } /* end while */
+
+    /* Advance past terminator for string sequence */
+    *pp += 1;
+
+done: 
+    if(ret_value < 0) {
+        *dt_list = H5P__free_merge_comm_dtype_list(*dt_list);
+        if(tmp_dt_list) {
+            tmp_dt_list->path = (char *)H5MM_xfree(tmp_dt_list->path);
+            tmp_dt_list = H5FL_FREE(H5O_copy_dtype_merge_list_t, tmp_dt_list);
+        } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5P__ocpy_merge_comm_dt_list_dec() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:	H5P__ocpy_merge_comm_dt_list_del
+ *
+ * Purpose:     Frees memory used to store the merge committed datatype list property
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, September 2, 2015
+ *
+ *--------------------------------------------------------------------------
+ */
+static herr_t
+H5P__ocpy_merge_comm_dt_list_del(hid_t H5_ATTR_UNUSED prop_id, const char H5_ATTR_UNUSED *name,
+    size_t H5_ATTR_UNUSED size, void *value)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Free the merge named dtype list */
+    H5P__free_merge_comm_dtype_list(*(H5O_copy_dtype_merge_list_t **)value);
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__ocpy_merge_comm_dt_list_del() */
+
+

+/*--------------------------------------------------------------------------
+ * Function:	H5P__ocpy_merge_comm_dt_list_copy
+ *
+ * Purpose:	Copy the merge committed datatype list
+ *
+ * Return:	Success:	Non-negative
+ * 		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *		Friday, August 31, 2012
+ *
+ *--------------------------------------------------------------------------
+ */
+static herr_t
+H5P__ocpy_merge_comm_dt_list_copy(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size,
+    void *value)
+{
+    herr_t         ret_value = SUCCEED;
+
+    FUNC_ENTER_STATIC
+
+    /* Sanity check */
+    HDassert(value);
+
+    /* Make copy of merge committed dtype list */
+    if(H5P__copy_merge_comm_dt_list((H5O_copy_dtype_merge_list_t **)value) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTCOPY, FAIL, "can't copy merge committed dtype list")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5P__ocpy_merge_comm_dt_list_copy() */
 
 

@@ -294,6 +580,9 @@ H5P__ocpy_merge_comm_dt_list_cmp(const void *_dt_list1, const void *_dt_list2,
     /* Walk through the lists, comparing each path.  For the lists to be the
      * same, the paths must be in the same order. */
     while(dt_list1 && dt_list2) {
+        HDassert(dt_list1->path);
+        HDassert(dt_list2->path);
+
         /* Compare paths */
         ret_value = HDstrcmp(dt_list1->path, dt_list2->path);
         if(ret_value != 0) HGOTO_DONE(ret_value)
@@ -325,7 +614,6 @@ done:
  *
  *---------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
 H5P__ocpy_merge_comm_dt_list_close(const char H5_ATTR_UNUSED *name, size_t H5_ATTR_UNUSED size, void *value)
 {
@@ -456,13 +744,15 @@ H5Padd_merge_committed_dtype_path(hid_t plist_id, const char *path)
     /* Check parameters */
     if(!path)
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no path specified")
+    if(path[0] == '\0')
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "path is empty string")
 
     /* Get the plist structure */
     if(NULL == (plist = H5P_object_verify(plist_id, H5P_OBJECT_COPY)))
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Get dtype list */
-    if(H5P_get(plist, H5O_CPY_MERGE_COMM_DT_LIST_NAME, &old_list) < 0)
+    if(H5P_peek(plist, H5O_CPY_MERGE_COMM_DT_LIST_NAME, &old_list) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get merge named dtype list")
 
     /* Add the new path to the list */
@@ -473,7 +763,7 @@ H5Padd_merge_committed_dtype_path(hid_t plist_id, const char *path)
     new_obj->next = old_list;
 
     /* Update the list stored in the property list */
-    if(H5P_set(plist, H5O_CPY_MERGE_COMM_DT_LIST_NAME, &new_obj) < 0)
+    if(H5P_poke(plist, H5O_CPY_MERGE_COMM_DT_LIST_NAME, &new_obj) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set merge named dtype list")
 
 done:
@@ -518,14 +808,14 @@ H5Pfree_merge_committed_dtype_paths(hid_t plist_id)
         HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID")
 
     /* Get dtype list */
-    if(H5P_get(plist, H5O_CPY_MERGE_COMM_DT_LIST_NAME, &dt_list) < 0)
+    if(H5P_peek(plist, H5O_CPY_MERGE_COMM_DT_LIST_NAME, &dt_list) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get merge committed dtype list")
 
     /* Free dtype list */
     dt_list = H5P__free_merge_comm_dtype_list(dt_list);
 
     /* Update the list stored in the property list (to NULL) */
-    if(H5P_set(plist, H5O_CPY_MERGE_COMM_DT_LIST_NAME, &dt_list) < 0)
+    if(H5P_poke(plist, H5O_CPY_MERGE_COMM_DT_LIST_NAME, &dt_list) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set merge committed dtype list")
 
 done:
diff --git a/src/H5Ppkg.h b/src/H5Ppkg.h
index 44ef473..6dffcec 100644
--- a/src/H5Ppkg.h
+++ b/src/H5Ppkg.h
@@ -21,7 +21,7 @@
  *		the H5P package.  Source files outside the H5P package should
  *		include H5Pprivate.h instead.
  */
-#ifndef H5P_PACKAGE
+#if !(defined H5P_FRIEND || defined H5P_MODULE)
 #error "Do not include this file outside the H5P package!"
 #endif
 
@@ -75,6 +75,8 @@ typedef struct H5P_genprop_t {
     H5P_prp_create_func_t create;   /* Function to call when a property is created */
     H5P_prp_set_func_t set; /* Function to call when a property value is set */
     H5P_prp_get_func_t get; /* Function to call when a property value is retrieved */
+    H5P_prp_encode_func_t encode; /* Function to call when a property is encoded */
+    H5P_prp_decode_func_t decode; /* Function to call when a property is decoded */
     H5P_prp_delete_func_t del; /* Function to call when a property is deleted */
     H5P_prp_copy_func_t copy;  /* Function to call when a property is copied */
     H5P_prp_compare_func_t cmp; /* Function to call when a property is compared */
@@ -156,8 +158,6 @@ struct H5Z_filter_info_t;
 /******************************/
 
 /* Private functions, not part of the publicly documented API */
-H5_DLL herr_t H5P__term_pub_interface(void);
-H5_DLL herr_t H5P__term_deprec_interface(void);
 H5_DLL H5P_genclass_t *H5P_create_class(H5P_genclass_t *par_class,
     const char *name, H5P_plist_type_t type,
     H5P_cls_create_func_t cls_create, void *create_data,
@@ -165,13 +165,17 @@ H5_DLL H5P_genclass_t *H5P_create_class(H5P_genclass_t *par_class,
     H5P_cls_close_func_t cls_close, void *close_data);
 H5_DLL H5P_genclass_t *H5P_copy_pclass(H5P_genclass_t *pclass);
 H5_DLL herr_t H5P_register_real(H5P_genclass_t *pclass, const char *name, size_t size,
-    const void *def_value, H5P_prp_create_func_t prp_create, H5P_prp_set_func_t prp_set,
-    H5P_prp_get_func_t prp_get, H5P_prp_delete_func_t prp_delete,
+    const void *def_value, H5P_prp_create_func_t prp_create,
+    H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
+    H5P_prp_encode_func_t prp_encode, H5P_prp_decode_func_t prp_decode,
+    H5P_prp_delete_func_t prp_delete,
     H5P_prp_copy_func_t prp_copy, H5P_prp_compare_func_t prp_cmp,
     H5P_prp_close_func_t prp_close);
 H5_DLL herr_t H5P_register(H5P_genclass_t **pclass, const char *name, size_t size,
-    const void *def_value, H5P_prp_create_func_t prp_create, H5P_prp_set_func_t prp_set,
-    H5P_prp_get_func_t prp_get, H5P_prp_delete_func_t prp_delete,
+    const void *def_value, H5P_prp_create_func_t prp_create,
+    H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
+    H5P_prp_encode_func_t prp_encode, H5P_prp_decode_func_t prp_decode,
+    H5P_prp_delete_func_t prp_delete,
     H5P_prp_copy_func_t prp_copy, H5P_prp_compare_func_t prp_cmp,
     H5P_prp_close_func_t prp_close);
 H5_DLL herr_t H5P_add_prop(H5SL_t *props, H5P_genprop_t *prop);
@@ -197,6 +201,24 @@ H5_DLL H5P_genclass_t *H5P_open_class_path(const char *path);
 H5_DLL H5P_genclass_t *H5P_get_class_parent(const H5P_genclass_t *pclass);
 H5_DLL herr_t H5P_close_class(void *_pclass);
 H5_DLL H5P_genprop_t *H5P__find_prop_plist(const H5P_genplist_t *plist, const char *name);
+H5_DLL hid_t H5P__new_plist_of_type(H5P_plist_type_t type);
+
+/* Encode/decode routines */
+H5_DLL herr_t H5P__encode(const H5P_genplist_t *plist, hbool_t enc_all_prop,
+    void *buf, size_t *nalloc);
+H5_DLL hid_t H5P__decode(const void *buf);
+H5_DLL herr_t H5P__encode_hsize_t(const void *value, void **_pp, size_t *size);
+H5_DLL herr_t H5P__encode_size_t(const void *value, void **_pp, size_t *size);
+H5_DLL herr_t H5P__encode_unsigned(const void *value, void **_pp, size_t *size);
+H5_DLL herr_t H5P__encode_uint8_t(const void *value, void **_pp, size_t *size);
+H5_DLL herr_t H5P__encode_hbool_t(const void *value, void **_pp, size_t *size);
+H5_DLL herr_t H5P__encode_double(const void *value, void **_pp, size_t *size);
+H5_DLL herr_t H5P__decode_hsize_t(const void **_pp, void *value);
+H5_DLL herr_t H5P__decode_size_t(const void **_pp, void *value);
+H5_DLL herr_t H5P__decode_unsigned(const void **_pp, void *value);
+H5_DLL herr_t H5P__decode_uint8_t(const void **_pp, void *value);
+H5_DLL herr_t H5P__decode_hbool_t(const void **_pp, void *value);
+H5_DLL herr_t H5P__decode_double(const void **_pp, void *value);
 
 /* Private OCPL routines */
 H5_DLL herr_t H5P_get_filter(const struct H5Z_filter_info_t *filter,
@@ -208,6 +230,7 @@ H5_DLL herr_t H5P_get_filter(const struct H5Z_filter_info_t *filter,
 H5_DLL char *H5P_get_class_path_test(hid_t pclass_id);
 H5_DLL hid_t H5P_open_class_path_test(const char *path);
 H5_DLL herr_t H5P_reset_external_file_test(hid_t dcpl_id);
+H5_DLL herr_t H5P_reset_layout_test(hid_t dcpl_id);
 #endif /* H5P_TESTING */
 
 #endif /* _H5Ppkg_H */
diff --git a/src/H5Pprivate.h b/src/H5Pprivate.h
index 542fd52..05830d1 100644
--- a/src/H5Pprivate.h
+++ b/src/H5Pprivate.h
@@ -33,13 +33,13 @@
 #define H5P_STRCRT_CHAR_ENCODING_NAME  "character_encoding"     /* Character set encoding for string */
 
 /* If the module using this macro is allowed access to the private variables, access them directly */
-#ifdef H5P_PACKAGE
+#ifdef H5P_MODULE
 #define H5P_PLIST_ID(P)     ((P)->plist_id)
 #define H5P_CLASS(P)        ((P)->pclass)
-#else /* H5F_PACKAGE */
+#else /* H5P_MODULE */
 #define H5P_PLIST_ID(P)     (H5P_get_plist_id(P))
 #define H5P_CLASS(P)        (H5P_get_class(P))
-#endif /* H5P_PACKAGE */
+#endif /* H5P_MODULE */
 
 
 /****************************/
@@ -111,20 +111,23 @@ H5_DLL herr_t H5P_init(void);
 H5_DLL herr_t H5P_close(void *_plist);
 H5_DLL hid_t H5P_create_id(H5P_genclass_t *pclass, hbool_t app_ref);
 H5_DLL hid_t H5P_copy_plist(const H5P_genplist_t *old_plist, hbool_t app_ref);
-H5_DLL herr_t H5P_get(const H5P_genplist_t *plist, const char *name, void *value);
+H5_DLL herr_t H5P_get(H5P_genplist_t *plist, const char *name, void *value);
 H5_DLL herr_t H5P_set(H5P_genplist_t *plist, const char *name, const void *value);
+H5_DLL herr_t H5P_peek(H5P_genplist_t *plist, const char *name, void *value);
+H5_DLL herr_t H5P_poke(H5P_genplist_t *plist, const char *name, const void *value);
 H5_DLL herr_t H5P_insert(H5P_genplist_t *plist, const char *name, size_t size,
     void *value, H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get,
+    H5P_prp_encode_func_t prp_encode, H5P_prp_decode_func_t prp_decode,
     H5P_prp_delete_func_t prp_delete, H5P_prp_copy_func_t prp_copy,
     H5P_prp_compare_func_t prp_cmp, H5P_prp_close_func_t prp_close);
-H5_DLL herr_t H5P_remove(hid_t plist_id, H5P_genplist_t *plist, const char *name);
+H5_DLL herr_t H5P_remove(H5P_genplist_t *plist, const char *name);
 H5_DLL htri_t H5P_exist_plist(const H5P_genplist_t *plist, const char *name);
 H5_DLL htri_t H5P_class_isa(const H5P_genclass_t *pclass1, const H5P_genclass_t *pclass2);
 H5_DLL char *H5P_get_class_name(H5P_genclass_t *pclass);
 H5_DLL herr_t H5P_get_nprops_pclass(const H5P_genclass_t *pclass, size_t *nprops,
     hbool_t recurse);
-H5_DLL hid_t H5P_get_driver(H5P_genplist_t *plist);
-H5_DLL void * H5P_get_driver_info(H5P_genplist_t *plist);
+H5_DLL hid_t H5P_peek_driver(H5P_genplist_t *plist);
+H5_DLL const void *H5P_peek_driver_info(H5P_genplist_t *plist);
 H5_DLL herr_t H5P_set_driver(H5P_genplist_t *plist, hid_t new_driver_id,
             const void *new_driver_info);
 H5_DLL herr_t H5P_set_vlen_mem_manager(H5P_genplist_t *plist,
diff --git a/src/H5Ppublic.h b/src/H5Ppublic.h
index b47576c..1cfba40 100644
--- a/src/H5Ppublic.h
+++ b/src/H5Ppublic.h
@@ -116,6 +116,8 @@ typedef herr_t (*H5P_prp_cb2_t)(hid_t prop_id, const char *name, size_t size, vo
 typedef H5P_prp_cb1_t H5P_prp_create_func_t;
 typedef H5P_prp_cb2_t H5P_prp_set_func_t;
 typedef H5P_prp_cb2_t H5P_prp_get_func_t;
+typedef herr_t (*H5P_prp_encode_func_t)(const void *value, void **buf, size_t *size);
+typedef herr_t (*H5P_prp_decode_func_t)(const void **buf, void *value);
 typedef H5P_prp_cb2_t H5P_prp_delete_func_t;
 typedef H5P_prp_cb1_t H5P_prp_copy_func_t;
 typedef int (*H5P_prp_compare_func_t)(const void *value1, const void *value2, size_t size);
@@ -230,6 +232,8 @@ H5_DLL herr_t H5Pinsert2(hid_t plist_id, const char *name, size_t size,
     H5P_prp_compare_func_t prp_cmp, H5P_prp_close_func_t prp_close);
 H5_DLL herr_t H5Pset(hid_t plist_id, const char *name, void *value);
 H5_DLL htri_t H5Pexist(hid_t plist_id, const char *name);
+H5_DLL herr_t H5Pencode(hid_t plist_id, void *buf, size_t *nalloc);
+H5_DLL hid_t  H5Pdecode(const void *buf);
 H5_DLL herr_t H5Pget_size(hid_t id, const char *name, size_t *size);
 H5_DLL herr_t H5Pget_nprops(hid_t id, size_t *nprops);
 H5_DLL hid_t H5Pget_class(hid_t plist_id);
@@ -276,9 +280,6 @@ H5_DLL herr_t H5Pset_deflate(hid_t plist_id, unsigned aggression);
 H5_DLL herr_t H5Pset_fletcher32(hid_t plist_id);
 
 /* File creation property list (FCPL) routines */
-H5_DLL herr_t H5Pget_version(hid_t plist_id, unsigned *boot/*out*/,
-         unsigned *freelist/*out*/, unsigned *stab/*out*/,
-         unsigned *shhdr/*out*/);
 H5_DLL herr_t H5Pset_userblock(hid_t plist_id, hsize_t size);
 H5_DLL herr_t H5Pget_userblock(hid_t plist_id, hsize_t *size);
 H5_DLL herr_t H5Pset_sizes(hid_t plist_id, size_t sizeof_addr,
@@ -295,6 +296,8 @@ H5_DLL herr_t H5Pset_shared_mesg_index(hid_t plist_id, unsigned index_num, unsig
 H5_DLL herr_t H5Pget_shared_mesg_index(hid_t plist_id, unsigned index_num, unsigned *mesg_type_flags, unsigned *min_mesg_size);
 H5_DLL herr_t H5Pset_shared_mesg_phase_change(hid_t plist_id, unsigned max_list, unsigned min_btree);
 H5_DLL herr_t H5Pget_shared_mesg_phase_change(hid_t plist_id, unsigned *max_list, unsigned *min_btree);
+H5_DLL herr_t H5Pset_file_space(hid_t plist_id, H5F_file_space_type_t strategy, hsize_t threshold);
+H5_DLL herr_t H5Pget_file_space(hid_t plist_id, H5F_file_space_type_t *strategy, hsize_t *threshold);
 
 /* File access property list (FAPL) routines */
 H5_DLL herr_t H5Pset_alignment(hid_t fapl_id, hsize_t threshold,
@@ -342,17 +345,33 @@ H5_DLL herr_t H5Pset_file_image_callbacks(hid_t fapl_id,
        H5FD_file_image_callbacks_t *callbacks_ptr);
 H5_DLL herr_t H5Pget_file_image_callbacks(hid_t fapl_id,
        H5FD_file_image_callbacks_t *callbacks_ptr);
-
 H5_DLL herr_t H5Pset_core_write_tracking(hid_t fapl_id, hbool_t is_enabled, size_t page_size);
 H5_DLL herr_t H5Pget_core_write_tracking(hid_t fapl_id, hbool_t *is_enabled, size_t *page_size);
+H5_DLL herr_t H5Pset_metadata_read_attempts(hid_t plist_id, unsigned attempts);
+H5_DLL herr_t H5Pget_metadata_read_attempts(hid_t plist_id, unsigned *attempts);
+H5_DLL herr_t H5Pset_object_flush_cb(hid_t plist_id, H5F_flush_cb_t func, void *udata);
+H5_DLL herr_t H5Pget_object_flush_cb(hid_t plist_id, H5F_flush_cb_t *func, void **udata);
+H5_DLL herr_t H5Pset_mdc_log_options(hid_t plist_id, hbool_t is_enabled, const char *location, hbool_t start_on_access);
+H5_DLL herr_t H5Pget_mdc_log_options(hid_t plist_id, hbool_t *is_enabled, char *location, size_t *location_size, hbool_t *start_on_access);
 
 /* Dataset creation property list (DCPL) routines */
 H5_DLL herr_t H5Pset_layout(hid_t plist_id, H5D_layout_t layout);
 H5_DLL H5D_layout_t H5Pget_layout(hid_t plist_id);
 H5_DLL herr_t H5Pset_chunk(hid_t plist_id, int ndims, const hsize_t dim[/*ndims*/]);
 H5_DLL int H5Pget_chunk(hid_t plist_id, int max_ndims, hsize_t dim[]/*out*/);
+H5_DLL herr_t H5Pset_virtual(hid_t dcpl_id, hid_t vspace_id,
+    const char *src_file_name, const char *src_dset_name, hid_t src_space_id);
+H5_DLL herr_t H5Pget_virtual_count(hid_t dcpl_id, size_t *count/*out*/);
+H5_DLL hid_t H5Pget_virtual_vspace(hid_t dcpl_id, size_t index);
+H5_DLL hid_t H5Pget_virtual_srcspace(hid_t dcpl_id, size_t index);
+H5_DLL ssize_t H5Pget_virtual_filename(hid_t dcpl_id, size_t index,
+    char *name/*out*/, size_t size);
+H5_DLL ssize_t H5Pget_virtual_dsetname(hid_t dcpl_id, size_t index,
+    char *name/*out*/, size_t size);
 H5_DLL herr_t H5Pset_external(hid_t plist_id, const char *name, off_t offset,
           hsize_t size);
+H5_DLL herr_t H5Pset_chunk_opts(hid_t plist_id, unsigned opts);
+H5_DLL herr_t H5Pget_chunk_opts(hid_t plist_id, unsigned *opts);
 H5_DLL int H5Pget_external_count(hid_t plist_id);
 H5_DLL herr_t H5Pget_external(hid_t plist_id, unsigned idx, size_t name_size,
           char *name/*out*/, off_t *offset/*out*/,
@@ -381,6 +400,14 @@ H5_DLL herr_t H5Pget_chunk_cache(hid_t dapl_id,
        size_t *rdcc_nslots/*out*/,
        size_t *rdcc_nbytes/*out*/,
        double *rdcc_w0/*out*/);
+H5_DLL herr_t H5Pset_virtual_view(hid_t plist_id, H5D_vds_view_t view);
+H5_DLL herr_t H5Pget_virtual_view(hid_t plist_id, H5D_vds_view_t *view);
+H5_DLL herr_t H5Pset_virtual_printf_gap(hid_t plist_id, hsize_t gap_size);
+H5_DLL herr_t H5Pget_virtual_printf_gap(hid_t plist_id, hsize_t *gap_size);
+H5_DLL herr_t H5Pset_append_flush(hid_t plist_id, unsigned ndims,
+    const hsize_t boundary[], H5D_append_cb_t func, void *udata);
+H5_DLL herr_t H5Pget_append_flush(hid_t plist_id, unsigned dims,
+    hsize_t boundary[], H5D_append_cb_t *func, void **udata);
 
 /* Dataset xfer property list (DXPL) routines */
 H5_DLL herr_t H5Pset_data_transform(hid_t plist_id, const char* expression);
@@ -488,7 +515,9 @@ H5_DLL H5Z_filter_t H5Pget_filter1(hid_t plist_id, unsigned filter,
 H5_DLL herr_t H5Pget_filter_by_id1(hid_t plist_id, H5Z_filter_t id,
     unsigned int *flags/*out*/, size_t *cd_nelmts/*out*/,
     unsigned cd_values[]/*out*/, size_t namelen, char name[]/*out*/);
-
+H5_DLL herr_t H5Pget_version(hid_t plist_id, unsigned *boot/*out*/,
+         unsigned *freelist/*out*/, unsigned *stab/*out*/,
+         unsigned *shhdr/*out*/);
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
 #ifdef __cplusplus
diff --git a/src/H5Pstrcpl.c b/src/H5Pstrcpl.c
index cc845af..5a09cd7 100644
--- a/src/H5Pstrcpl.c
+++ b/src/H5Pstrcpl.c
@@ -27,7 +27,9 @@
 /****************/
 /* Module Setup */
 /****************/
-#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+
+#include "H5Pmodule.h"          /* This source code file is part of the H5P module */
+
 
 /***********/
 /* Headers */
@@ -47,6 +49,8 @@
 /* Definitions for character set encoding property */
 #define H5P_STRCRT_CHAR_ENCODING_SIZE  sizeof(H5T_cset_t)
 #define H5P_STRCRT_CHAR_ENCODING_DEF   H5F_DEFAULT_CSET
+#define H5P_STRCRT_CHAR_ENCODING_ENC   H5P__strcrt_char_encoding_enc
+#define H5P_STRCRT_CHAR_ENCODING_DEC   H5P__strcrt_char_encoding_dec
 
 
 /******************/
@@ -66,6 +70,10 @@
 /* Property class callbacks */
 static herr_t H5P__strcrt_reg_prop(H5P_genclass_t *pclass);
 
+/* encode & decode callbacks */
+static herr_t H5P__strcrt_char_encoding_enc(const void *value, void **_pp, size_t *size);
+static herr_t H5P__strcrt_char_encoding_dec(const void **_pp, void *value);
+
 
 /*********************/
 /* Package Variables */
@@ -100,6 +108,9 @@ const H5P_libclass_t H5P_CLS_STRCRT[1] = {{
 /* Local Variables */
 /*******************/
 
+/* Property value defaults */
+static const H5T_cset_t H5P_def_char_encoding_g = H5P_STRCRT_CHAR_ENCODING_DEF;  /* Default character set encoding */
+
 
 

 /*-------------------------------------------------------------------------
@@ -116,13 +127,14 @@ const H5P_libclass_t H5P_CLS_STRCRT[1] = {{
 static herr_t
 H5P__strcrt_reg_prop(H5P_genclass_t *pclass)
 {
-    H5T_cset_t char_encoding = H5P_STRCRT_CHAR_ENCODING_DEF;  /* Default character set encoding */
     herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_STATIC
 
     /* Register character encoding */
-    if(H5P_register_real(pclass, H5P_STRCRT_CHAR_ENCODING_NAME, H5P_STRCRT_CHAR_ENCODING_SIZE, &char_encoding, NULL, NULL, NULL, NULL, NULL, NULL, NULL) < 0)
+    if(H5P_register_real(pclass, H5P_STRCRT_CHAR_ENCODING_NAME, H5P_STRCRT_CHAR_ENCODING_SIZE, &H5P_def_char_encoding_g, 
+            NULL, NULL, NULL, H5P_STRCRT_CHAR_ENCODING_ENC, H5P_STRCRT_CHAR_ENCODING_DEC,
+            NULL, NULL, NULL, NULL) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTINSERT, FAIL, "can't insert property into class")
 
 done:
@@ -200,3 +212,76 @@ done:
     FUNC_LEAVE_API(ret_value)
 } /* end H5Pget_char_encoding() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__strcrt_char_encoding_enc
+ *
+ * Purpose:        Callback routine which is called whenever the character
+ *                 set encoding property in the string create property list
+ *                 is encoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Friday, August 31, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__strcrt_char_encoding_enc(const void *value, void **_pp, size_t *size)
+{
+    const H5T_cset_t *encoding = (const H5T_cset_t *)value; /* Create local alias for values */
+    uint8_t **pp = (uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity check */
+    HDassert(encoding);
+    HDassert(size);
+
+    if(NULL != *pp)
+        /* Encode character set encoding */
+        *(*pp)++ = (uint8_t)*encoding;
+
+    /* Size of character set encoding */
+    (*size)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__strcrt_char_encoding_enc() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:       H5P__strcrt_char_encoding_dec
+ *
+ * Purpose:        Callback routine which is called whenever the character
+ *                 set encoding property in the string create property list
+ *                 is decoded.
+ *
+ * Return:	   Success:	Non-negative
+ *		   Failure:	Negative
+ *
+ * Programmer:     Quincey Koziol
+ *                 Friday, August 31, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5P__strcrt_char_encoding_dec(const void **_pp, void *_value)
+{
+    H5T_cset_t *encoding = (H5T_cset_t *)_value;            /* Character set encoding */
+    const uint8_t **pp = (const uint8_t **)_pp;
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Sanity checks */
+    HDassert(pp);
+    HDassert(*pp);
+    HDassert(encoding);
+
+    /* Decode character set encoding */
+    *encoding = (H5T_cset_t)*(*pp)++;
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5P__strcrt_char_encoding_dec() */
+
diff --git a/src/H5Ptest.c b/src/H5Ptest.c
index b36da6a..63708e7 100644
--- a/src/H5Ptest.c
+++ b/src/H5Ptest.c
@@ -19,7 +19,7 @@
  * Purpose:	Generic Property Testing Functions
  */
 
-#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+#include "H5Pmodule.h"          /* This source code file is part of the H5P module */
 #define H5P_TESTING		/*suppress warning about H5P testing funcs*/
 
 
@@ -60,8 +60,8 @@
 char *
 H5P_get_class_path_test(hid_t pclass_id)
 {
-    H5P_genclass_t	*pclass;    /* Property class to query */
-    char *ret_value;       /* return value */
+    H5P_genclass_t	*pclass;        /* Property class to query */
+    char *ret_value = NULL;             /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -101,8 +101,8 @@ done:
 hid_t
 H5P_open_class_path_test(const char *path)
 {
-    H5P_genclass_t *pclass=NULL;/* Property class to query */
-    hid_t ret_value;            /* Return value */
+    H5P_genclass_t *pclass = NULL;      /* Property class to query */
+    hid_t ret_value = H5I_INVALID_HID;  /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -156,7 +156,7 @@ H5P_reset_external_file_test(hid_t dcpl_id)
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset creation property list")
 
     /* get external file list */
-    if(H5P_get(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
+    if(H5P_peek(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
         HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external file list")
 
     /* Clean up any values set for the external file-list */
@@ -164,10 +164,56 @@ H5P_reset_external_file_test(hid_t dcpl_id)
         HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "can't release external file list info")
 
     /* set external file list */
-    if(H5P_set(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
-        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get external file list")
+    if(H5P_poke(plist, H5D_CRT_EXT_FILE_LIST_NAME, &efl) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set external file list")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
 }   /* H5P_reset_external_file_test() */
 
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5P_reset_layout_test
+ PURPOSE
+    Routine to reset layout message
+ USAGE
+    herr_t H5P_reset_layout_test(plist)
+           hid_t dcpl_id; IN: the property list
+
+ RETURNS
+    Non-negative on success/Negative on failure
+
+ PROGRAMMER
+    Quincey Koziol
+    April 5, 2012
+--------------------------------------------------------------------------*/
+herr_t
+H5P_reset_layout_test(hid_t dcpl_id)
+{
+    H5O_layout_t    layout;             /* Layout message */
+    H5P_genplist_t *plist;              /* Property list */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check arguments */
+    if(NULL == (plist = (H5P_genplist_t *)H5I_object(dcpl_id)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset creation property list")
+
+    /* Get layout message */
+    if(H5P_peek(plist, H5D_CRT_LAYOUT_NAME, &layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get layout")
+
+    /* Clean up any values set for the layout */
+    if(H5O_msg_reset(H5O_LAYOUT_ID, &layout) < 0)
+        HGOTO_ERROR(H5E_DATASET, H5E_CANTFREE, FAIL, "can't release layout info")
+
+    /* Set layout message */
+    if(H5P_poke(plist, H5D_CRT_LAYOUT_NAME, &layout) < 0)
+        HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set layout")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5P_reset_layout_test() */
+
diff --git a/src/H5R.c b/src/H5R.c
index a2b310c..61b45e1 100644
--- a/src/H5R.c
+++ b/src/H5R.c
@@ -17,10 +17,7 @@
 /* Module Setup */
 /****************/
 
-#define H5R_PACKAGE		/*suppress error about including H5Rpkg   */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5R_init_interface
+#include "H5Rmodule.h"          /* This source code file is part of the H5R module */
 
 
 /***********/
@@ -54,8 +51,6 @@
 
 static herr_t H5R_create(void *ref, H5G_loc_t *loc, const char *name,
         H5R_type_t ref_type, H5S_t *space, hid_t dxpl_id);
-static hid_t H5R_dereference(H5F_t *file, hid_t dxpl_id, H5R_type_t ref_type,
-    const void *_ref, hbool_t app_ref);
 static H5S_t * H5R_get_region(H5F_t *file, hid_t dxpl_id, const void *_ref);
 static ssize_t H5R_get_name(H5F_t *file, hid_t lapl_id, hid_t dxpl_id, hid_t id,
     H5R_type_t ref_type, const void *_ref, char *name, size_t size);
@@ -65,6 +60,9 @@ static ssize_t H5R_get_name(H5F_t *file, hid_t lapl_id, hid_t dxpl_id, hid_t id,
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 
 /*****************************/
 /* Library Private Variables */
@@ -78,44 +76,21 @@ static ssize_t H5R_get_name(H5F_t *file, hid_t lapl_id, hid_t dxpl_id, hid_t id,
 /* Reference ID class */
 static const H5I_class_t H5I_REFERENCE_CLS[1] = {{
     H5I_REFERENCE,		/* ID class value */
-    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* Class flags */
     0,				/* # of reserved IDs for class */
     NULL			/* Callback routine for closing objects of this class */
 }};
 
+/* Flag indicating "top" of interface has been initialized */
+static hbool_t H5R_top_package_initialize_s = FALSE;
 
-

-/*-------------------------------------------------------------------------
- * Function:	H5R_init
- *
- * Purpose:	Initialize the interface from some other package.
- *
- * Return:	Success:	non-negative
- *		Failure:	negative
- *
- * Programmer:	Quincey Koziol
- *              Thursday, September 13, 2007
- *
- *-------------------------------------------------------------------------
- */
-herr_t
-H5R_init(void)
-{
-    herr_t ret_value = SUCCEED;   /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-    /* FUNC_ENTER() does all the work */
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5R_init() */
 
 

 /*--------------------------------------------------------------------------
 NAME
-   H5R_init_interface -- Initialize interface-specific information
+   H5R__init_package -- Initialize interface-specific information
 USAGE
-    herr_t H5R_init_interface()
+    herr_t H5R__init_package()
 
 RETURNS
     Non-negative on success/Negative on failure
@@ -123,33 +98,37 @@ DESCRIPTION
     Initializes any interface-specific data or routines.
 
 --------------------------------------------------------------------------*/
-static herr_t
-H5R_init_interface(void)
+herr_t
+H5R__init_package(void)
 {
-    herr_t      ret_value=SUCCEED;       /* Return value */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
     /* Initialize the atom group for the file IDs */
     if(H5I_register_type(H5I_REFERENCE_CLS) < 0)
-	HGOTO_ERROR(H5E_REFERENCE, H5E_CANTINIT, FAIL, "unable to initialize interface");
+	HGOTO_ERROR(H5E_REFERENCE, H5E_CANTINIT, FAIL, "unable to initialize interface")
+
+    /* Mark "top" of interface as initialized, too */
+    H5R_top_package_initialize_s = TRUE;
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5R__init_package() */
 
 

 /*--------------------------------------------------------------------------
  NAME
-    H5R_term_interface
+    H5R_top_term_package
  PURPOSE
     Terminate various H5R objects
  USAGE
-    void H5R_term_interface()
+    void H5R_top_term_package()
  RETURNS
     void
  DESCRIPTION
-    Release the atom group and any other resources allocated.
+    Release IDs for the atom group, deferring full interface shutdown
+    until later (in H5R_term_package).
  GLOBAL VARIABLES
  COMMENTS, BUGS, ASSUMPTIONS
      Can't report errors...
@@ -157,32 +136,69 @@ done:
  REVISION LOG
 --------------------------------------------------------------------------*/
 int
-H5R_term_interface(void)
+H5R_top_term_package(void)
 {
     int	n = 0;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    if (H5_interface_initialize_g) {
+    if(H5R_top_package_initialize_s) {
 	if(H5I_nmembers(H5I_REFERENCE) > 0) {
 	    (void)H5I_clear_type(H5I_REFERENCE, FALSE, FALSE);
             n++; /*H5I*/
 	} /* end if */
-        else {
-            /* Close deprecated interface */
-            n += H5R__term_deprec_interface();
 
-            /* Destroy the reference id group */
-	    (void)H5I_dec_type_ref(H5I_REFERENCE);
-            n++; /*H5I*/
+        /* Mark closed */
+        if(0 == n)
+            H5R_top_package_initialize_s = FALSE;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* end H5R_top_term_package() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5R_term_package
+ PURPOSE
+    Terminate various H5R objects
+ USAGE
+    void H5R_term_package()
+ RETURNS
+    void
+ DESCRIPTION
+    Release the atom group and any other resources allocated.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+     Can't report errors...
 
-            /* Mark closed */
-	    H5_interface_initialize_g = 0;
-	} /* end else */
+     Finishes shutting down the interface, after H5R_top_term_package()
+     is called
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+int
+H5R_term_package(void)
+{
+    int	n = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_PKG_INIT_VAR) {
+        /* Sanity checks */
+        HDassert(0 == H5I_nmembers(H5I_REFERENCE));
+        HDassert(FALSE == H5R_top_package_initialize_s);
+
+        /* Destroy the reference id group */
+        n += (H5I_dec_type_ref(H5I_REFERENCE) > 0);
+
+        /* Mark closed */
+        if(0 == n)
+            H5_PKG_INIT_VAR = FALSE;
     } /* end if */
 
     FUNC_LEAVE_NOAPI(n)
-} /* end H5R_term_interface() */
+} /* end H5R_term_package() */
 
 

 /*--------------------------------------------------------------------------
@@ -293,7 +309,7 @@ H5R_create(void *_ref, H5G_loc_t *loc, const char *name, H5R_type_t ref_type, H5
             H5F_addr_encode(loc->oloc->file, &p, obj_loc.oloc->addr);
 
             /* Serialize the selection into heap buffer */
-            if(H5S_SELECT_SERIALIZE(space, p) < 0)
+            if(H5S_SELECT_SERIALIZE(space, &p) < 0)
                 HGOTO_ERROR(H5E_REFERENCE, H5E_CANTCOPY, FAIL, "Unable to serialize selection")
 
             /* Save the serialized buffer for later */
@@ -409,20 +425,24 @@ done:
     Currently only set up to work with references to datasets
  EXAMPLES
  REVISION LOG
+    Raymond Lu
+    13 July 2011
+    I added the OAPL_ID parameter for the object being referenced.  It only
+    supports dataset access property list currently.
 
     M. Scot Breitenfeld
     3 March 2015
     Added a check for undefined reference pointer.
 --------------------------------------------------------------------------*/
-static hid_t
-H5R_dereference(H5F_t *file, hid_t dxpl_id, H5R_type_t ref_type, const void *_ref, hbool_t app_ref)
+hid_t
+H5R_dereference(H5F_t *file, hid_t oapl_id, hid_t dxpl_id, H5R_type_t ref_type, const void *_ref, hbool_t app_ref)
 {
     H5O_loc_t oloc;             /* Object location */
     H5G_name_t path;            /* Path of object */
     H5G_loc_t loc;              /* Group location */
     unsigned rc;		/* Reference count of object */
     H5O_type_t obj_type;        /* Type of object */
-    hid_t ret_value;            /* Return value */
+    hid_t ret_value = H5I_INVALID_HID;  /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -519,11 +539,16 @@ H5R_dereference(H5F_t *file, hid_t dxpl_id, H5R_type_t ref_type, const void *_re
 
         case H5O_TYPE_DATASET:
             {
-                hid_t dapl_id = H5P_DATASET_ACCESS_DEFAULT; /* dapl to use to open dataset */
                 H5D_t *dset;                /* Pointer to dataset to open */
 
+                /* Get correct property list */
+                if(H5P_DEFAULT == oapl_id)
+                    oapl_id = H5P_DATASET_ACCESS_DEFAULT;
+                else if(TRUE != H5P_isa_class(oapl_id, H5P_DATASET_ACCESS))
+                    HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not dataset access property list")
+
                 /* Open the dataset */
-                if(NULL == (dset = H5D_open(&loc, dapl_id, dxpl_id)))
+                if(NULL == (dset = H5D_open(&loc, oapl_id, dxpl_id)))
                     HGOTO_ERROR(H5E_DATASET, H5E_NOTFOUND, FAIL, "not found")
 
                 /* Create an atom for the dataset */
@@ -547,13 +572,14 @@ done:
 

 /*--------------------------------------------------------------------------
  NAME
-    H5Rdereference
+    H5Rdereference2
  PURPOSE
     Opens the HDF5 object referenced.
  USAGE
-    hid_t H5Rdereference(ref)
+    hid_t H5Rdereference2(ref)
         hid_t id;       IN: Dataset reference object is in or location ID of
                             object that the dataset is located within.
+        hid_t oapl_id;  IN: Property list of the object being referenced.
         H5R_type_t ref_type;    IN: Type of reference to create
         void *ref;      IN: Reference to open.
 
@@ -566,20 +592,26 @@ done:
  COMMENTS, BUGS, ASSUMPTIONS
  EXAMPLES
  REVISION LOG
+    Raymond Lu
+    13 July 2011
+    I added the OAPL_ID parameter for the object being referenced.  It only
+    supports dataset access property list currently.
 --------------------------------------------------------------------------*/
 hid_t
-H5Rdereference(hid_t id, H5R_type_t ref_type, const void *_ref)
+H5Rdereference2(hid_t obj_id, hid_t oapl_id, H5R_type_t ref_type, const void *_ref)
 {
     H5G_loc_t loc;      /* Group location */
     H5F_t *file = NULL; /* File object */
     hid_t ret_value;
 
     FUNC_ENTER_API(FAIL)
-    H5TRACE3("i", "iRt*x", id, ref_type, _ref);
+    H5TRACE4("i", "iiRt*x", obj_id, oapl_id, ref_type, _ref);
 
     /* Check args */
-    if(H5G_loc(id, &loc) < 0)
+    if(H5G_loc(obj_id, &loc) < 0)
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(oapl_id < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list")
     if(ref_type <= H5R_BADTYPE || ref_type >= H5R_MAXTYPE)
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference type")
     if(_ref == NULL)
@@ -589,12 +621,12 @@ H5Rdereference(hid_t id, H5R_type_t ref_type, const void *_ref)
     file = loc.oloc->file;
 
     /* Create reference */
-    if((ret_value = H5R_dereference(file, H5AC_ind_dxpl_id, ref_type, _ref, TRUE)) < 0)
+    if((ret_value = H5R_dereference(file, oapl_id, H5AC_ind_dxpl_id, ref_type, _ref, TRUE)) < 0)
         HGOTO_ERROR(H5E_REFERENCE, H5E_CANTINIT, FAIL, "unable to dereference object")
 
 done:
     FUNC_LEAVE_API(ret_value)
-}   /* end H5Rdereference() */
+}   /* end H5Rdereference2() */
 
 

 /*--------------------------------------------------------------------------
@@ -654,7 +686,7 @@ H5R_get_region(H5F_t *file, hid_t dxpl_id, const void *_ref)
         HGOTO_ERROR(H5E_DATASPACE, H5E_NOTFOUND, NULL, "not found")
 
     /* Unserialize the selection */
-    if(H5S_select_deserialize(ret_value, p) < 0)
+    if(H5S_SELECT_DESERIALIZE(&ret_value, &p) < 0)
         HGOTO_ERROR(H5E_REFERENCE, H5E_CANTDECODE, NULL, "can't deserialize selection")
 
 done:
@@ -888,16 +920,15 @@ static ssize_t
 H5R_get_name(H5F_t *f, hid_t lapl_id, hid_t dxpl_id, hid_t id, H5R_type_t ref_type,
     const void *_ref, char *name, size_t size)
 {
-    hid_t file_id = (-1);       /* ID for file that the reference is in */
+    hid_t file_id = H5I_INVALID_HID;    /* ID for file that the reference is in */
     H5O_loc_t oloc;             /* Object location describing object for reference */
-    ssize_t ret_value;          /* Return value */
+    ssize_t ret_value = -1;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
     /* Check args */
     HDassert(f);
     HDassert(_ref);
-    HDassert(name);
 
     /* Initialize the object location */
     H5O_loc_reset(&oloc);
@@ -968,8 +999,10 @@ done:
                             object that the dataset is located within.
         H5R_type_t ref_type;    IN: Type of reference
         void *ref;      IN: Reference to query.
-        char *name;     OUT: Buffer to place name of object referenced
-        size_t size;    IN: Size of name buffer
+        char *name;     OUT: Buffer to place name of object referenced. If NULL
+	                     then this call will return the size in bytes of name.
+        size_t size;    IN: Size of name buffer (user needs to include NULL terminator
+                            when passing in the size)
 
  RETURNS
     Non-negative length of the path on success, Negative on failure
@@ -981,6 +1014,12 @@ done:
     This may not be the only path to that object.
  EXAMPLES
  REVISION LOG
+    M. Scot Breitenfeld
+    22 January 2014
+    Changed the behavior for the returned value of the function when name is NULL.
+    If name is NULL then size is ignored and the function returns the size 
+    of the name buffer (not including the NULL terminator), it still returns
+    negative on failure.
 --------------------------------------------------------------------------*/
 ssize_t
 H5Rget_name(hid_t id, H5R_type_t ref_type, const void *_ref, char *name,
diff --git a/src/H5RC.c b/src/H5RC.c
deleted file mode 100644
index 6abe837..0000000
--- a/src/H5RC.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group.                                               *
- * Copyright by the Board of Trustees of the University of Illinois.         *
- * All rights reserved.                                                      *
- *                                                                           *
- * This file is part of HDF5.  The full HDF5 copyright notice, including     *
- * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Reference counting buffer algorithms.
- *
- * These are used for various internal buffers which are shared.
- *
- */
-
-
-#include "H5Eprivate.h"		/* Error handling		  	*/
-#include "H5FLprivate.h"	/* Free lists                           */
-#include "H5RCprivate.h"        /* Reference-counted buffers            */
-
-/* Private typedefs & structs */
-
-/* Declare a free list to manage the H5RC_t struct */
-H5FL_DEFINE_STATIC(H5RC_t);
-
-

-/*--------------------------------------------------------------------------
- NAME
-    H5RC_create
- PURPOSE
-    Create a reference counted object
- USAGE
-    H5RC_t *H5RC_create(o,free)
-        const void *o;          IN: Object to initialize ref-counted object with
-        H5RC_free_func_t free;  IN: Function to call when ref-count drop to zero
-
- RETURNS
-    Returns a pointer to a new ref-counted object on success, NULL on failure.
- DESCRIPTION
-    Create a reference counted object.  The object is not duplicated, it is
-    assumed to be owned by the reference counted object now and will be freed
-    with the 'free' function when the reference count drops to zero.
- GLOBAL VARIABLES
- COMMENTS, BUGS, ASSUMPTIONS
- EXAMPLES
- REVISION LOG
---------------------------------------------------------------------------*/
-H5RC_t *
-H5RC_create(void *o, H5RC_free_func_t free_func)
-{
-    H5RC_t *ret_value;   /* Return value */
-
-    FUNC_ENTER_NOAPI(NULL)
-
-    /* Sanity check */
-    HDassert(o);
-    HDassert(free_func);
-
-    /* Allocate ref-counted string structure */
-    if(NULL == (ret_value = H5FL_MALLOC(H5RC_t)))
-        HGOTO_ERROR(H5E_RS,H5E_NOSPACE,NULL,"memory allocation failed")
-
-    /* Set the internal fields */
-    ret_value->o = o;
-    ret_value->n = 1;
-    ret_value->free_func = free_func;
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5RC_create() */
-
-

-/*--------------------------------------------------------------------------
- NAME
-    H5RC_decr
- PURPOSE
-    Decrement the reference count for a ref-counted object
- USAGE
-    herr_t H5RC_decr(rc)
-        H5RC_t *rc;             IN: Ref-counted object to decrement count for
-
- RETURNS
-    SUCCEED/FAIL
- DESCRIPTION
-    Decrements the reference count for a ref-counted object, calling the
-    object's free function if ref-count drops to zero.
- GLOBAL VARIABLES
- COMMENTS, BUGS, ASSUMPTIONS
- EXAMPLES
- REVISION LOG
---------------------------------------------------------------------------*/
-herr_t
-H5RC_decr(H5RC_t *rc)
-{
-    herr_t ret_value = SUCCEED;   /* Return value */
-
-    FUNC_ENTER_NOAPI(FAIL)
-
-    /* Sanity check */
-    HDassert(rc);
-    HDassert(rc->o);
-    HDassert(rc->n > 0);
-    HDassert(rc->free_func);
-
-    /* Decrement reference count */
-    rc->n--;
-
-    /* Check if we should delete this object now */
-    if(rc->n == 0) {
-        if((rc->free_func)(rc->o) < 0) {
-            rc = H5FL_FREE(H5RC_t, rc);
-            HGOTO_ERROR(H5E_RS, H5E_CANTFREE, FAIL, "memory release failed")
-        } /* end if */
-        rc = H5FL_FREE(H5RC_t, rc);
-    } /* end if */
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5RC_decr() */
-
diff --git a/src/H5RCprivate.h b/src/H5RCprivate.h
deleted file mode 100644
index 2fe3551..0000000
--- a/src/H5RCprivate.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Copyright by The HDF Group.                                               *
- * Copyright by the Board of Trustees of the University of Illinois.         *
- * All rights reserved.                                                      *
- *                                                                           *
- * This file is part of HDF5.  The full HDF5 copyright notice, including     *
- * terms governing use, modification, and redistribution, is contained in    *
- * the files COPYING and Copyright.html.  COPYING can be found at the root   *
- * of the source code distribution tree; Copyright.html can be found at the  *
- * root level of an installed copy of the electronic HDF5 document set and   *
- * is linked from the top-level documents page.  It can also be found at     *
- * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
- * access to either file, you may request a copy from help at hdfgroup.org.     *
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * This file contains private information about the H5RC module
- */
-#ifndef _H5RCprivate_H
-#define _H5RCprivate_H
-
-/**************************************/
-/* Public headers needed by this file */
-/**************************************/
-#ifdef LATER
-#include "H5RCpublic.h"
-#endif /* LATER */
-
-/***************************************/
-/* Private headers needed by this file */
-/***************************************/
-#include "H5private.h"
-
-/************/
-/* Typedefs */
-/************/
-
-/* Typedef for function to release object when reference count drops to zero */
-typedef herr_t (*H5RC_free_func_t)(void *o);
-
-/* Typedef for reference counted objects */
-typedef struct H5RC_t {
-    void *o;            /* Object to be reference counted */
-    size_t n;           /* Reference count of number of pointers sharing object */
-    H5RC_free_func_t free_func; /* Function to free object */
-} H5RC_t;
-
-/**********/
-/* Macros */
-/**********/
-#define H5RC_INC(rc)            ((rc)->n++)
-#define H5RC_DEC(rc)            (H5RC_decr(rc))
-#define H5RC_GET_OBJ(rc)        ((rc)->o)
-
-/********************/
-/* Private routines */
-/********************/
-H5_DLL H5RC_t *H5RC_create(void *s, H5RC_free_func_t free_func);
-H5_DLL herr_t H5RC_decr(H5RC_t *rc);
-
-#endif /* _H5RSprivate_H */
-
-
diff --git a/src/H5Rdeprec.c b/src/H5Rdeprec.c
index 049792e..b8133b2 100644
--- a/src/H5Rdeprec.c
+++ b/src/H5Rdeprec.c
@@ -31,10 +31,7 @@
 /* Module Setup */
 /****************/
 
-#define H5R_PACKAGE		/*suppress error about including H5Rpkg   */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5R__init_deprec_interface
+#include "H5Rmodule.h"          /* This source code file is part of the H5R module */
 
 
 /***********/
@@ -46,6 +43,7 @@
 #include "H5Gprivate.h"		/* Groups				*/
 #include "H5Oprivate.h"		/* Object headers		  	*/
 #include "H5Rpkg.h"		/* References				*/
+#include "H5Ppublic.h"          /* for using H5P_DATASET_ACCESS_DEFAULT */
 
 
 /****************/
@@ -83,51 +81,6 @@
 /*******************/
 
 
-

-/*--------------------------------------------------------------------------
-NAME
-   H5R__init_deprec_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5R__init_deprec_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5R_init() currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5R__init_deprec_interface(void)
-{
-    FUNC_ENTER_STATIC_NOERR
-
-    FUNC_LEAVE_NOAPI(H5R_init())
-} /* H5R__init_deprec_interface() */
-
-

-/*--------------------------------------------------------------------------
-NAME
-   H5R__term_deprec_interface -- Terminate interface
-USAGE
-    herr_t H5R__term_deprec_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Terminates interface.  (Just resets H5_interface_initialize_g
-    currently).
-
---------------------------------------------------------------------------*/
-herr_t
-H5R__term_deprec_interface(void)
-{
-    FUNC_ENTER_PACKAGE_NOERR
-
-    /* Mark closed */
-    H5_interface_initialize_g = 0;
-
-    FUNC_LEAVE_NOAPI(0)
-} /* H5R__term_deprec_interface() */
-
 #ifndef H5_NO_DEPRECATED_SYMBOLS
 

 /*--------------------------------------------------------------------------
@@ -182,5 +135,57 @@ done:
     FUNC_LEAVE_API(ret_value)
 }   /* end H5Rget_obj_type1() */
 
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Rdereference1
+ PURPOSE
+    Opens the HDF5 object referenced.
+ USAGE
+    hid_t H5Rdereference1(ref)
+        hid_t id;       IN: Dataset reference object is in or location ID of
+                            object that the dataset is located within.
+        H5R_type_t ref_type;    IN: Type of reference to create
+        void *ref;      IN: Reference to open.
+
+ RETURNS
+    Valid ID on success, Negative on failure
+ DESCRIPTION
+    Given a reference to some object, open that object and return an ID for
+    that object.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hid_t
+H5Rdereference1(hid_t obj_id, H5R_type_t ref_type, const void *_ref)
+{
+    H5G_loc_t loc;      /* Group location */
+    H5F_t *file = NULL; /* File object */
+    hid_t ret_value;
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE3("i", "iRt*x", obj_id, ref_type, _ref);
+
+    /* Check args */
+    if(H5G_loc(obj_id, &loc) < 0)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location")
+    if(ref_type <= H5R_BADTYPE || ref_type >= H5R_MAXTYPE)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference type")
+    if(_ref == NULL)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference pointer")
+
+    /* Get the file pointer from the entry */
+    file = loc.oloc->file;
+
+    /* Create reference */
+    if((ret_value = H5R_dereference(file, H5P_DATASET_ACCESS_DEFAULT, H5AC_ind_dxpl_id, ref_type, _ref, TRUE)) < 0)
+        HGOTO_ERROR(H5E_REFERENCE, H5E_CANTINIT, FAIL, "unable dereference object")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* end H5Rdereference1() */
+
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
diff --git a/src/H5Rmodule.h b/src/H5Rmodule.h
new file mode 100644
index 0000000..6799483
--- /dev/null
+++ b/src/H5Rmodule.h
@@ -0,0 +1,36 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5R package.  Including this header means that the source file
+ *		is part of the H5R package.
+ */
+#ifndef _H5Rmodule_H
+#define _H5Rmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5R_MODULE
+#define H5_MY_PKG       H5R
+#define H5_MY_PKG_ERR   H5E_REFERENCE
+#define H5_MY_PKG_INIT  YES
+
+#endif /* _H5Rmodule_H */
+
+
diff --git a/src/H5Rpkg.h b/src/H5Rpkg.h
index 2ff1c2c..8ed8d65 100644
--- a/src/H5Rpkg.h
+++ b/src/H5Rpkg.h
@@ -21,7 +21,7 @@
  *              only within the H5R package. Source files outside the
  *              H5R package should include H5Rprivate.h instead.
  */
-#ifndef H5R_PACKAGE
+#if !(defined H5R_FRIEND || defined H5R_MODULE)
 #error "Do not include this file outside the H5R package!"
 #endif
 
@@ -54,10 +54,10 @@
 /******************************/
 
 /* General functions */
-H5_DLL herr_t H5R_init(void);
-H5_DLL herr_t H5R__term_deprec_interface(void);
 H5_DLL herr_t H5R_get_obj_type(H5F_t *file, hid_t dxpl_id, H5R_type_t ref_type,
     const void *_ref, H5O_type_t *obj_type);
+H5_DLL hid_t H5R_dereference(H5F_t *file, hid_t dapl_id, hid_t dxpl_id, H5R_type_t ref_type,
+    const void *_ref, hbool_t app_ref);
 
 
 #endif /* _H5Rpkg_H */
diff --git a/src/H5Rpublic.h b/src/H5Rpublic.h
index 04d319b..e990661 100644
--- a/src/H5Rpublic.h
+++ b/src/H5Rpublic.h
@@ -14,7 +14,7 @@
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
- * This file contains public declarations for the H5S module.
+ * This file contains public declarations for the H5R module.
  */
 #ifndef _H5Rpublic_H
 #define _H5Rpublic_H
@@ -60,7 +60,7 @@ extern "C" {
 /* Functions in H5R.c */
 H5_DLL herr_t H5Rcreate(void *ref, hid_t loc_id, const char *name,
 			 H5R_type_t ref_type, hid_t space_id);
-H5_DLL hid_t H5Rdereference(hid_t dataset, H5R_type_t ref_type, const void *ref);
+H5_DLL hid_t H5Rdereference2(hid_t obj_id, hid_t oapl_id, H5R_type_t ref_type, const void *ref);
 H5_DLL hid_t H5Rget_region(hid_t dataset, H5R_type_t ref_type, const void *ref);
 H5_DLL herr_t H5Rget_obj_type2(hid_t id, H5R_type_t ref_type, const void *_ref,
     H5O_type_t *obj_type);
@@ -81,6 +81,7 @@ H5_DLL ssize_t H5Rget_name(hid_t loc_id, H5R_type_t ref_type, const void *ref,
 
 /* Function prototypes */
 H5_DLL H5G_obj_t H5Rget_obj_type1(hid_t id, H5R_type_t ref_type, const void *_ref);
+H5_DLL hid_t H5Rdereference1(hid_t obj_id, H5R_type_t ref_type, const void *ref);
 
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
 
diff --git a/src/H5S.c b/src/H5S.c
index 5eb4425..738a7da 100644
--- a/src/H5S.c
+++ b/src/H5S.c
@@ -17,10 +17,7 @@
 /* Module Setup */
 /****************/
 
-#define H5S_PACKAGE		/*suppress error about including H5Spkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5S_init_interface
+#include "H5Smodule.h"          /* This source code file is part of the H5S module */
 
 
 /***********/
@@ -52,17 +49,16 @@
 /********************/
 /* Local Prototypes */
 /********************/
-static herr_t H5S_set_extent_simple (H5S_t *space, unsigned rank,
-    const hsize_t *dims, const hsize_t *max);
 static htri_t H5S_is_simple(const H5S_t *sdim);
-static herr_t H5S_encode(H5S_t *obj, unsigned char *buf, size_t *nalloc);
-static H5S_t *H5S_decode(const unsigned char *buf);
 
 
 /*********************/
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 
 /*****************************/
 /* Library Private Variables */
@@ -80,57 +76,62 @@ H5FL_DEFINE(H5S_extent_t);
 H5FL_DEFINE(H5S_t);
 
 /* Declare a free list to manage the array's of hsize_t's */
-H5FL_ARR_DEFINE(hsize_t,H5S_MAX_RANK);
+H5FL_ARR_DEFINE(hsize_t, H5S_MAX_RANK);
 
 /* Dataspace ID class */
 static const H5I_class_t H5I_DATASPACE_CLS[1] = {{
     H5I_DATASPACE,		/* ID class value */
-    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* Class flags */
     2,				/* # of reserved IDs for class */
     (H5I_free_t)H5S_close	/* Callback routine for closing objects of this class */
 }};
 
+/* Flag indicating "top" of interface has been initialized */
+static hbool_t H5S_top_package_initialize_s = FALSE;
+
 
 

 /*--------------------------------------------------------------------------
 NAME
-   H5S_init_interface -- Initialize interface-specific information
+   H5S__init_package -- Initialize interface-specific information
 USAGE
-    herr_t H5S_init_interface()
-
+    herr_t H5S__init_package()
 RETURNS
     Non-negative on success/Negative on failure
 DESCRIPTION
     Initializes any interface-specific data or routines.
-
 --------------------------------------------------------------------------*/
-static herr_t
-H5S_init_interface(void)
+herr_t
+H5S__init_package(void)
 {
     herr_t ret_value = SUCCEED;   /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Initialize the atom group for the file IDs */
     if(H5I_register_type(H5I_DATASPACE_CLS) < 0)
 	HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize interface")
 
+    /* Mark "top" of interface as initialized, too */
+    H5S_top_package_initialize_s = TRUE;
+
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5S_init_interface() */
+} /* end H5S__init_package() */
 
 

 /*--------------------------------------------------------------------------
  NAME
-    H5S_term_interface
+    H5S_top_term_package
  PURPOSE
     Terminate various H5S objects
  USAGE
-    void H5S_term_interface()
+    void H5S_top_term_package()
  RETURNS
     Non-negative on success/Negative on failure
  DESCRIPTION
-    Release the atom group and any other resources allocated.
+    Release IDs for the atom group, deferring full interface shutdown
+    until later (in H5S_term_package).
  GLOBAL VARIABLES
  COMMENTS, BUGS, ASSUMPTIONS
      Can't report errors...
@@ -138,29 +139,69 @@ done:
  REVISION LOG
 --------------------------------------------------------------------------*/
 int
-H5S_term_interface(void)
+H5S_top_term_package(void)
 {
     int	n = 0;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    if(H5_interface_initialize_g) {
+    if(H5S_top_package_initialize_s) {
 	if(H5I_nmembers(H5I_DATASPACE) > 0) {
 	    (void)H5I_clear_type(H5I_DATASPACE, FALSE, FALSE);
             n++; /*H5I*/
 	} /* end if */
-        else {
-            /* Destroy the dataspace object id group */
-	    (void)H5I_dec_type_ref(H5I_DATASPACE);
-            n++; /*H5I*/
 
-	    /* Shut down interface */
-	    H5_interface_initialize_g = 0;
-	} /* end else */
+	/* Mark "top" of interface as closed */
+        if(0 == n)
+            H5S_top_package_initialize_s = FALSE;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* end H5S_top_term_package() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_term_package
+ PURPOSE
+    Terminate various H5S objects
+ USAGE
+    void H5S_term_package()
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Release the atom group and any other resources allocated.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+     Can't report errors...
+
+     Finishes shutting down the interface, after H5S_top_term_package()
+     is called
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+int
+H5S_term_package(void)
+{
+    int	n = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_PKG_INIT_VAR) {
+        /* Sanity checks */
+        HDassert(0 == H5I_nmembers(H5I_DATASPACE));
+        HDassert(FALSE == H5S_top_package_initialize_s);
+
+        /* Destroy the dataspace object id group */
+        n += (H5I_dec_type_ref(H5I_DATASPACE) > 0);
+
+	/* Mark interface as closed */
+        if(0 == n)
+            H5_PKG_INIT_VAR = FALSE;
     } /* end if */
 
     FUNC_LEAVE_NOAPI(n)
-} /* end H5S_term_interface() */
+} /* end H5S_term_package() */
 
 

 /*--------------------------------------------------------------------------
@@ -185,7 +226,7 @@ H5S_t *
 H5S_create(H5S_class_t type)
 {
     H5S_t *new_ds = NULL;    /* New dataspace created */
-    H5S_t *ret_value;           /* Return value */
+    H5S_t *ret_value = NULL; /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -467,7 +508,7 @@ H5Sextent_copy(hid_t dst_id,hid_t src_id)
 {
     H5S_t	*src;
     H5S_t	*dst;
-    hid_t	ret_value = SUCCEED;
+    herr_t	ret_value = SUCCEED;
 
     FUNC_ENTER_API(FAIL)
     H5TRACE2("e", "ii", dst_id, src_id);
@@ -479,7 +520,40 @@ H5Sextent_copy(hid_t dst_id,hid_t src_id)
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
 
     /* Copy */
-    if(H5S_extent_copy(&(dst->extent), &(src->extent), TRUE) < 0)
+    if(H5S_extent_copy(dst, src) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "can't copy extent")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* end H5Sextent_copy() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5S_extent_copy
+ *
+ * Purpose:     Copies a dataspace extent
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              Monday, February 23, 2015
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5S_extent_copy(H5S_t *dst, const H5S_t *src)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    HDassert(dst);
+    HDassert(src);
+
+    /* Copy extent */
+    if(H5S_extent_copy_real(&(dst->extent), &(src->extent), TRUE) < 0)
         HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "can't copy extent")
 
     /* If the selection is 'all', update the number of elements selected in the
@@ -489,12 +563,12 @@ H5Sextent_copy(hid_t dst_id,hid_t src_id)
             HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
 
 done:
-    FUNC_LEAVE_API(ret_value)
-} /* end H5Sextent_copy() */
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_extent_copy() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5S_extent_copy
+ * Function:	H5S_extent_copy_real
  *
  * Purpose:	Copies a dataspace extent
  *
@@ -508,7 +582,7 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5S_extent_copy(H5S_extent_t *dst, const H5S_extent_t *src, hbool_t copy_max)
+H5S_extent_copy_real(H5S_extent_t *dst, const H5S_extent_t *src, hbool_t copy_max)
 {
     unsigned u;
     herr_t ret_value = SUCCEED;   /* Return value */
@@ -561,7 +635,7 @@ H5S_extent_copy(H5S_extent_t *dst, const H5S_extent_t *src, hbool_t copy_max)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5S_extent_copy() */
+} /* end H5S_extent_copy_real() */
 
 

 /*-------------------------------------------------------------------------
@@ -588,8 +662,8 @@ done:
 H5S_t *
 H5S_copy(const H5S_t *src, hbool_t share_selection, hbool_t copy_max)
 {
-    H5S_t		   *dst = NULL;
-    H5S_t		   *ret_value;   /* Return value */
+    H5S_t	*dst = NULL;
+    H5S_t       *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -597,7 +671,7 @@ H5S_copy(const H5S_t *src, hbool_t share_selection, hbool_t copy_max)
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
 
     /* Copy the source dataspace's extent */
-    if(H5S_extent_copy(&(dst->extent), &(src->extent), copy_max) < 0)
+    if(H5S_extent_copy_real(&(dst->extent), &(src->extent), copy_max) < 0)
         HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, NULL, "can't copy extent")
 
     /* Copy the source dataspace's selection */
@@ -640,7 +714,7 @@ done:
 hssize_t
 H5S_get_simple_extent_npoints(const H5S_t *ds)
 {
-    hssize_t    ret_value;
+    hssize_t    ret_value = -1;         /* Return value */
 
     FUNC_ENTER_NOAPI(-1)
 
@@ -716,8 +790,8 @@ done:
 hsize_t
 H5S_get_npoints_max(const H5S_t *ds)
 {
-    hsize_t	    ret_value;
     unsigned	    u;
+    hsize_t	    ret_value = 0;      /* Return value */
 
     FUNC_ENTER_NOAPI(0)
 
@@ -821,7 +895,7 @@ done:
 int
 H5S_get_simple_extent_ndims(const H5S_t *ds)
 {
-    int	ret_value;      /* Return value */
+    int	ret_value = -1;         /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -906,8 +980,8 @@ done:
 int
 H5S_extent_get_dims(const H5S_extent_t *ext, hsize_t dims[], hsize_t max_dims[])
 {
-    int	i;              /* Local index variable */
-    int	ret_value;      /* Return value */
+    int	i;                      /* Local index variable */
+    int	ret_value = -1;         /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -965,7 +1039,7 @@ done:
 int
 H5S_get_simple_extent_dims(const H5S_t *ds, hsize_t dims[], hsize_t max_dims[])
 {
-    int	ret_value;      /* Return value */
+    int	ret_value = -1;         /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -1073,8 +1147,8 @@ done:
 H5S_t *
 H5S_read(const H5O_loc_t *loc, hid_t dxpl_id)
 {
-    H5S_t	   *ds = NULL;          /* Dataspace to return */
-    H5S_t	   *ret_value;          /* Return value */
+    H5S_t	*ds = NULL;             /* Dataspace to return */
+    H5S_t       *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -1121,7 +1195,7 @@ done:
 static htri_t
 H5S_is_simple(const H5S_t *sdim)
 {
-    htri_t		    ret_value;
+    htri_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1262,14 +1336,14 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
+herr_t
 H5S_set_extent_simple(H5S_t *space, unsigned rank, const hsize_t *dims,
 		       const hsize_t *max)
 {
     unsigned u;                 /* Local index variable */
     herr_t ret_value = SUCCEED;   /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI(FAIL)
 
     /* Check args */
     HDassert(rank <= H5S_MAX_RANK);
@@ -1314,7 +1388,8 @@ H5S_set_extent_simple(H5S_t *space, unsigned rank, const hsize_t *dims,
     /* Selection related cleanup */
 
     /* Set offset to zeros */
-    HDmemset(space->select.offset, 0, sizeof(hsize_t) * space->extent.rank);
+    for(u = 0; u < space->extent.rank; u++)
+        space->select.offset[u] = 0;
     space->select.offset_changed = FALSE;
 
     /* If the selection is 'all', update the number of elements selected */
@@ -1425,7 +1500,7 @@ H5S_t *
 H5S_create_simple(unsigned rank, const hsize_t dims[/*rank*/],
 		  const hsize_t maxdims[/*rank*/])
 {
-    H5S_t	*ret_value;     /* Return value */
+    H5S_t       *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -1474,7 +1549,7 @@ H5Sencode(hid_t obj_id, void *buf, size_t *nalloc)
     if (NULL==(dspace=(H5S_t *)H5I_object_verify(obj_id, H5I_DATASPACE)))
 	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
 
-    if(H5S_encode(dspace, (unsigned char *)buf, nalloc)<0)
+    if(H5S_encode(dspace, (unsigned char **)&buf, nalloc)<0)
 	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "can't encode datatype")
 
 done:
@@ -1498,14 +1573,14 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5S_encode(H5S_t *obj, unsigned char *buf, size_t *nalloc)
+herr_t
+H5S_encode(H5S_t *obj, unsigned char **p, size_t *nalloc)
 {
+    H5F_t       *f = NULL;      /* Fake file structure*/
     size_t      extent_size;    /* Size of serialized dataspace extent */
     hssize_t    sselect_size;   /* Signed size of serialized dataspace selection */
     size_t      select_size;    /* Size of serialized dataspace selection */
-    H5F_t       *f = NULL;      /* Fake file structure*/
-    herr_t      ret_value = SUCCEED;
+    herr_t      ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1524,28 +1599,31 @@ H5S_encode(H5S_t *obj, unsigned char *buf, size_t *nalloc)
 
     /* Verify the size of buffer.  If it's not big enough, simply return the
      * right size without filling the buffer. */
-    if(!buf || *nalloc < (extent_size + select_size + 1 + 1 + 1 + 4))
+    if(!*p || *nalloc < (extent_size + select_size + 1 + 1 + 1 + 4))
         *nalloc = extent_size + select_size + 1 + 1 + 1 + 4;
     else {
+        unsigned char *pp = (*p);   /* Local pointer for decoding */
+
         /* Encode the type of the information */
-        *buf++ = H5O_SDSPACE_ID;
+        *pp++ = H5O_SDSPACE_ID;
 
         /* Encode the version of the dataspace information */
-        *buf++ = H5S_ENCODE_VERSION;
+        *pp++ = H5S_ENCODE_VERSION;
 
         /* Encode the "size of size" information */
-        *buf++ = (unsigned char)H5F_SIZEOF_SIZE(f);
+        *pp++ = (unsigned char)H5F_SIZEOF_SIZE(f);
 
         /* Encode size of extent information. Pointer is actually moved in this macro. */
-        UINT32ENCODE(buf, extent_size);
+        UINT32ENCODE(pp, extent_size);
 
         /* Encode the extent part of dataspace */
-        if(H5O_msg_encode(f, H5O_SDSPACE_ID, TRUE, buf, obj) < 0)
+        if(H5O_msg_encode(f, H5O_SDSPACE_ID, TRUE, pp, obj) < 0)
             HGOTO_ERROR(H5E_DATASPACE, H5E_CANTENCODE, FAIL, "can't encode extent space")
-        buf += extent_size;
+        pp += extent_size;
 
         /* Encode the selection part of dataspace.  */
-        if(H5S_SELECT_SERIALIZE(obj, buf) < 0)
+        *p = pp;
+        if(H5S_SELECT_SERIALIZE(obj, p) < 0)
             HGOTO_ERROR(H5E_DATASPACE, H5E_CANTENCODE, FAIL, "can't encode select space")
     } /* end else */
 
@@ -1586,7 +1664,7 @@ H5Sdecode(const void *buf)
     if(buf == NULL)
 	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "empty buffer")
 
-    if((ds = H5S_decode((const unsigned char *)buf)) == NULL)
+    if((ds = H5S_decode((const unsigned char **)&buf)) == NULL)
 	HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDECODE, FAIL, "can't decode object")
 
     /* Register the type and return the ID */
@@ -1614,41 +1692,42 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-static H5S_t*
-H5S_decode(const unsigned char *buf)
+H5S_t*
+H5S_decode(const unsigned char **p)
 {
-    H5S_t       *ds;
-    H5S_extent_t *extent;
-    size_t      extent_size;            /* size of the extent message*/
     H5F_t       *f = NULL;              /* Fake file structure*/
+    H5S_t       *ds;                    /* Decoded dataspace */
+    H5S_extent_t *extent;               /* Entent of decoded dataspace */
+    const unsigned char *pp = (*p);     /* Local pointer for decoding */
+    size_t      extent_size;            /* size of the extent message*/
     uint8_t     sizeof_size;            /* 'Size of sizes' for file */
-    H5S_t       *ret_value;
+    H5S_t       *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
     /* Decode the type of the information */
-    if(*buf++ != H5O_SDSPACE_ID)
+    if(*pp++ != H5O_SDSPACE_ID)
 	HGOTO_ERROR(H5E_DATASPACE, H5E_BADMESG, NULL, "not an encoded dataspace")
 
     /* Decode the version of the dataspace information */
-    if(*buf++ != H5S_ENCODE_VERSION)
+    if(*pp++ != H5S_ENCODE_VERSION)
 	HGOTO_ERROR(H5E_DATASPACE, H5E_VERSION, NULL, "unknown version of encoded dataspace")
 
     /* Decode the "size of size" information */
-    sizeof_size = *buf++;
+    sizeof_size = *pp++;
 
     /* Allocate "fake" file structure */
     if(NULL == (f = H5F_fake_alloc(sizeof_size)))
 	HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, NULL, "can't allocate fake file struct")
 
     /* Decode size of extent information */
-    UINT32DECODE(buf, extent_size);
+    UINT32DECODE(pp, extent_size);
 
     /* Decode the extent part of dataspace */
     /* (pass mostly bogus file pointer and bogus DXPL) */
-    if((extent = (H5S_extent_t *)H5O_msg_decode(f, H5P_DEFAULT, NULL, H5O_SDSPACE_ID, buf))==NULL)
+    if((extent = (H5S_extent_t *)H5O_msg_decode(f, H5P_DEFAULT, NULL, H5O_SDSPACE_ID, pp))==NULL)
 	HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDECODE, NULL, "can't decode object")
-    buf += extent_size;
+    pp += extent_size;
 
     /* Copy the extent into dataspace structure */
     if((ds = H5FL_CALLOC(H5S_t))==NULL)
@@ -1664,7 +1743,8 @@ H5S_decode(const unsigned char *buf)
         HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, NULL, "unable to set all selection")
 
     /* Decode the select part of dataspace.  I believe this part always exists. */
-    if(H5S_SELECT_DESERIALIZE(ds, buf) < 0)
+    *p = pp;
+    if(H5S_SELECT_DESERIALIZE(&ds, p) < 0)
         HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDECODE, NULL, "can't decode space selection")
 
     /* Set return value */
@@ -1704,7 +1784,7 @@ done:
 H5S_class_t
 H5S_get_simple_extent_type(const H5S_t *space)
 {
-    H5S_class_t	ret_value;
+    H5S_class_t	ret_value = H5S_NO_CLASS;       /* Return value */
 
     FUNC_ENTER_NOAPI(H5S_NO_CLASS)
 
@@ -1902,7 +1982,7 @@ done:
 hbool_t
 H5S_has_extent(const H5S_t *ds)
 {
-    hbool_t ret_value;
+    hbool_t ret_value = FALSE;          /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -2143,14 +2223,13 @@ H5S_extend(H5S_t *space, const hsize_t *size)
     HDassert(size);
 
     /* Check through all the dimensions to see if modifying the dataspace is allowed */
-    for(u = 0; u < space->extent.rank; u++) {
-        if(space->extent.size[u]<size[u]) {
-            if(space->extent.max && H5S_UNLIMITED!=space->extent.max[u] &&
-                    space->extent.max[u]<size[u])
+    for(u = 0; u < space->extent.rank; u++)
+        if(space->extent.size[u] < size[u]) {
+            if(space->extent.max && H5S_UNLIMITED != space->extent.max[u] &&
+                    space->extent.max[u] < size[u])
                 HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "dimension cannot be increased")
             ret_value++;
         } /* end if */
-    } /* end for */
 
     /* Update */
     if(ret_value) {
diff --git a/src/H5SL.c b/src/H5SL.c
index d766066..1cd64ec 100644
--- a/src/H5SL.c
+++ b/src/H5SL.c
@@ -59,16 +59,15 @@
  *
  */
 
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5SL_init_interface
+#include "H5SLmodule.h"         /* This source code file is part of the H5SL module */
 
 
 /* Private headers needed */
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
 #include "H5FLprivate.h"	/* Free Lists                           */
+#include "H5MMprivate.h"	/* Memory management                    */
 #include "H5SLprivate.h"	/* Skip list routines			*/
-#include "H5MMprivate.h"    /* Memory management                    */
 
 /* Local Macros */
 
@@ -576,6 +575,9 @@ static H5SL_node_t *H5SL_insert_common(H5SL_t *slist, void *item, const void *ke
 static herr_t H5SL_release_common(H5SL_t *slist, H5SL_operator_t op, void *op_data);
 static herr_t H5SL_close_common(H5SL_t *slist, H5SL_operator_t op, void *op_data);
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 /* Declare a free list to manage the H5SL_t struct */
 H5FL_DEFINE_STATIC(H5SL_t);
 
@@ -590,12 +592,11 @@ static size_t H5SL_fac_nalloc_g;
 

 /*--------------------------------------------------------------------------
  NAME
-    H5SL_init_interface
+    H5SL__init_package
  PURPOSE
     Initialize interface-specific information
  USAGE
-    herr_t H5SL_init_interface()
-
+    herr_t H5SL__init_package()
  RETURNS
     Non-negative on success/Negative on failure
  DESCRIPTION
@@ -605,10 +606,10 @@ static size_t H5SL_fac_nalloc_g;
  EXAMPLES
  REVISION LOG
 --------------------------------------------------------------------------*/
-static herr_t
-H5SL_init_interface(void)
+herr_t
+H5SL__init_package(void)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_PACKAGE_NOERR
 
     /* Allocate space for array of factories */
     H5SL_fac_g = (H5FL_fac_head_t **)H5MM_malloc(sizeof(H5FL_fac_head_t *));
@@ -621,7 +622,64 @@ H5SL_init_interface(void)
     H5SL_fac_nused_g = 1;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5SL_init_interface() */
+} /* end H5SL__init_package() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5SL_term_package
+ PURPOSE
+    Terminate all the H5FL factories used in this package, and clear memory
+ USAGE
+    int H5SL_term_package()
+ RETURNS
+    Success:	Positive if any action might have caused a change in some
+                other interface; zero otherwise.
+   	Failure:	Negative
+ DESCRIPTION
+    Release any resources allocated.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+     Can't report errors...
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+int H5SL_term_package(void)
+{
+    int     n = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_PKG_INIT_VAR) {
+        /* Terminate all the factories */
+        if(H5SL_fac_nused_g > 0) {
+            size_t  i;
+            herr_t  ret;
+
+            for(i = 0; i < H5SL_fac_nused_g; i++) {
+                ret = H5FL_fac_term(H5SL_fac_g[i]);
+                HDassert(ret >= 0);
+            } /* end if */
+            H5SL_fac_nused_g = 0;
+
+            n++;
+        } /* end if */
+
+        /* Free the list of factories */
+        if(H5SL_fac_g) {
+            H5SL_fac_g = (H5FL_fac_head_t **)H5MM_xfree((void *)H5SL_fac_g);
+            H5SL_fac_nalloc_g = 0;
+
+            n++;
+        } /* end if */
+
+        /* Mark the interface as uninitialized */
+        if(0 == n)
+            H5_PKG_INIT_VAR = FALSE;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* H5SL_term_package() */
 
 

 /*--------------------------------------------------------------------------
@@ -649,7 +707,7 @@ H5SL_init_interface(void)
 static H5SL_node_t *
 H5SL_new_node(void *item, const void *key, uint32_t hashval)
 {
-    H5SL_node_t *ret_value;      /* New skip list node */
+    H5SL_node_t *ret_value = NULL;      /* New skip list node */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -938,7 +996,7 @@ H5SL_create(H5SL_type_t type, H5SL_cmp_t cmp)
 {
     H5SL_t *new_slist = NULL;   /* Pointer to new skip list object created */
     H5SL_node_t *header;        /* Pointer to skip list header node */
-    H5SL_t *ret_value;          /* Return value */
+    H5SL_t *ret_value = NULL;   /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -1097,7 +1155,7 @@ done:
 H5SL_node_t *
 H5SL_add(H5SL_t *slist, void *item, const void *key)
 {
-    H5SL_node_t *ret_value;                   /* Return value */
+    H5SL_node_t *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1425,9 +1483,9 @@ done:
 void *
 H5SL_less(H5SL_t *slist, const void *key)
 {
-    H5SL_node_t *x;                             /* Current node to examine */
-    uint32_t hashval = 0;                       /* Hash value for key */
-    void *ret_value;                            /* Return value */
+    H5SL_node_t *x;             /* Current node to examine */
+    uint32_t hashval = 0;       /* Hash value for key */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1534,9 +1592,9 @@ done:
 void *
 H5SL_greater(H5SL_t *slist, const void *key)
 {
-    H5SL_node_t *x;                             /* Current node to examine */
-    uint32_t hashval = 0;                       /* Hash value for key */
-    void *ret_value;                            /* Return value */
+    H5SL_node_t *x;                     /* Current node to examine */
+    uint32_t hashval = 0;               /* Hash value for key */
+    void *ret_value = NULL;             /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1726,9 +1784,9 @@ done:
 H5SL_node_t *
 H5SL_below(H5SL_t *slist, const void *key)
 {
-    H5SL_node_t *x;                             /* Current node to examine */
-    uint32_t hashval = 0;                       /* Hash value for key */
-    H5SL_node_t *ret_value;                     /* Return value */
+    H5SL_node_t *x;                     /* Current node to examine */
+    uint32_t hashval = 0;               /* Hash value for key */
+    H5SL_node_t *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1832,9 +1890,9 @@ done:
 H5SL_node_t *
 H5SL_above(H5SL_t *slist, const void *key)
 {
-    H5SL_node_t *x;                             /* Current node to examine */
-    uint32_t hashval = 0;                       /* Hash value for key */
-    H5SL_node_t *ret_value;                     /* Return value */
+    H5SL_node_t *x;                     /* Current node to examine */
+    uint32_t hashval = 0;               /* Hash value for key */
+    H5SL_node_t *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -2509,50 +2567,3 @@ H5SL_close(H5SL_t *slist)
     FUNC_LEAVE_NOAPI(SUCCEED)
 } /* end H5SL_close() */
 
-

-/*--------------------------------------------------------------------------
- NAME
-    H5SL_term_interface
- PURPOSE
-    Terminate all the H5FL factories used in this package, and clear memory
- USAGE
-    int H5SL_term_interface()
- RETURNS
-    Success:	Positive if any action might have caused a change in some
-                other interface; zero otherwise.
-   	Failure:	Negative
- DESCRIPTION
-    Release any resources allocated.
- GLOBAL VARIABLES
- COMMENTS, BUGS, ASSUMPTIONS
-     Can't report errors...
- EXAMPLES
- REVISION LOG
---------------------------------------------------------------------------*/
-int H5SL_term_interface(void)
-{
-    size_t  i;
-    herr_t  ret;
-    int     n = H5_interface_initialize_g ? 1 : 0;
-
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    if(n) {
-        /* Terminate all the factories */
-        for(i=0; i<H5SL_fac_nused_g; i++) {
-            ret = H5FL_fac_term(H5SL_fac_g[i]);
-            HDassert(ret >= 0);
-        }
-        H5SL_fac_nused_g = 0;
-
-        /* Free the list of factories */
-        H5SL_fac_g = (H5FL_fac_head_t **)H5MM_xfree((void *)H5SL_fac_g);
-        H5SL_fac_nalloc_g = 0;
-
-        /* Mark the interface as uninitialized */
-        H5_interface_initialize_g = 0;
-    } /* end if */
-
-    FUNC_LEAVE_NOAPI(n)
-} /* H5SL_term_interface() */
-
diff --git a/src/H5SLmodule.h b/src/H5SLmodule.h
new file mode 100644
index 0000000..d5bfbc2
--- /dev/null
+++ b/src/H5SLmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5SL package.  Including this header means that the source file
+ *		is part of the H5SL package.
+ */
+#ifndef _H5SLmodule_H
+#define _H5SLmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5SL_MODULE
+#define H5_MY_PKG       H5SL
+#define H5_MY_PKG_ERR   H5E_SLIST
+#define H5_MY_PKG_INIT  YES
+
+#endif /* _H5SLmodule_H */
+
diff --git a/src/H5SM.c b/src/H5SM.c
index f8c47c1..4a562dd 100644
--- a/src/H5SM.c
+++ b/src/H5SM.c
@@ -17,8 +17,9 @@
 /* Module Setup */
 /****************/
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg 	  */
-#define H5SM_PACKAGE		/*suppress error about including H5SMpkg	  */
+#define H5O_FRIEND		/*suppress error about including H5Opkg	  */
+#include "H5SMmodule.h"         /* This source code file is part of the H5SM module */
+
 
 /***********/
 /* Headers */
@@ -84,6 +85,9 @@ static herr_t H5SM_read_mesg(H5F_t *f, const H5SM_sohm_t *mesg, H5HF_t *fheap,
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 H5FL_DEFINE(H5SM_master_table_t);
 H5FL_ARR_DEFINE(H5SM_index_header_t, H5O_SHMESG_MAX_NINDEXES);
 H5FL_DEFINE(H5SM_list_t);
@@ -122,6 +126,8 @@ H5SM_init(H5F_t *f, H5P_genplist_t * fc_plist, const H5O_loc_t *ext_loc, hid_t d
 {
     H5O_shmesg_table_t sohm_table;      /* SOHM message for superblock extension */
     H5SM_master_table_t *table = NULL;  /* SOHM master table for file */
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t ring, orig_ring = H5AC_RING_INV;      /* Original ring value */
     haddr_t table_addr = HADDR_UNDEF;   /* Address of SOHM master table in file */
     unsigned list_max, btree_min;       /* Phase change limits for SOHM indices */
     unsigned index_type_flags[H5O_SHMESG_MAX_NINDEXES]; /* Messages types stored in each index */
@@ -130,12 +136,16 @@ H5SM_init(H5F_t *f, H5P_genplist_t * fc_plist, const H5O_loc_t *ext_loc, hid_t d
     unsigned x;                         /* Local index variable */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI(NULL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__SOHM_TAG, FAIL)
 
     HDassert(f);
     /* File should not already have a SOHM table */
     HDassert(!H5F_addr_defined(H5F_SOHM_ADDR(f)));
 
+    /* Set the ring type in the DXPL */
+    if(H5AC_set_ring(dxpl_id, H5AC_RING_US, &dxpl, &orig_ring) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTSET, FAIL, "unable to set ring value")
+
     /* Initialize master table */
     if(NULL == (table = H5FL_MALLOC(H5SM_master_table_t)))
 	HGOTO_ERROR(H5E_SOHM, H5E_CANTALLOC, FAIL, "memory allocation failed for SOHM table")
@@ -220,6 +230,11 @@ H5SM_init(H5F_t *f, H5P_genplist_t * fc_plist, const H5O_loc_t *ext_loc, hid_t d
     if(type_flags_used & H5O_SHMESG_ATTR_FLAG)
         H5F_SET_STORE_MSG_CRT_IDX(f, TRUE);
 
+    /* Set the ring type to superblock extension */
+    ring = H5AC_RING_SBE;
+    if((H5P_set(dxpl, H5AC_RING_NAME, &ring)) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTSET, FAIL, "unable to set property value")
+
     /* Write shared message information to the superblock extension */
     sohm_table.addr = H5F_SOHM_ADDR(f);
     sohm_table.version = H5F_SOHM_VERS(f);
@@ -228,6 +243,10 @@ H5SM_init(H5F_t *f, H5P_genplist_t * fc_plist, const H5O_loc_t *ext_loc, hid_t d
         HGOTO_ERROR(H5E_SOHM, H5E_CANTINIT, FAIL, "unable to update SOHM header message")
 
 done:
+    /* Reset the ring in the DXPL */
+    if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+        HDONE_ERROR(H5E_SOHM, H5E_CANTSET, FAIL, "unable to set property value")
+
     if(ret_value < 0) {
         if(table_addr != HADDR_UNDEF)
             H5MF_xfree(f, H5FD_MEM_SOHM_TABLE, dxpl_id, table_addr, (hsize_t)table->table_size);
@@ -235,7 +254,7 @@ done:
             table = H5FL_FREE(H5SM_master_table_t, table);
     } /* end if */
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5SM_init() */
 
 

@@ -345,7 +364,7 @@ H5SM_type_shared(H5F_t *f, unsigned type_id, hid_t dxpl_id)
     size_t u;                           /* Local index variable */
     htri_t ret_value = FALSE;           /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, H5AC__SOHM_TAG, FAIL)
 
     /* Translate the H5O type_id into an H5SM type flag */
     if(H5SM_type_to_flag(type_id, &type_flag) < 0)
@@ -358,7 +377,7 @@ H5SM_type_shared(H5F_t *f, unsigned type_id, hid_t dxpl_id)
         /* Set up user data for callback */
         cache_udata.f = f;
 
-        if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC_READ)))
+        if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
     } /* end if */
     else
@@ -377,7 +396,7 @@ done:
     if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), table, H5AC__NO_FLAGS_SET) < 0)
 	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5SM_type_shared() */
 
 

@@ -402,7 +421,7 @@ H5SM_get_fheap_addr(H5F_t *f, hid_t dxpl_id, unsigned type_id, haddr_t *fheap_ad
     ssize_t index_num;                  /* Which index */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__SOHM_TAG, FAIL)
 
     /* Sanity checks */
     HDassert(f);
@@ -412,7 +431,7 @@ H5SM_get_fheap_addr(H5F_t *f, hid_t dxpl_id, unsigned type_id, haddr_t *fheap_ad
     cache_udata.f = f;
 
     /* Look up the master SOHM table */
-    if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC_READ)))
+    if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
 
     /* Look up index for message type */
@@ -427,7 +446,7 @@ done:
     if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), table, H5AC__NO_FLAGS_SET) < 0)
 	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5SM_get_fheap_addr() */
 
 

@@ -627,9 +646,9 @@ H5SM_create_list(H5F_t *f, H5SM_index_header_t *header, hid_t dxpl_id)
     hsize_t x;                  /* Counter variable */
     size_t num_entries;         /* Number of messages to create in list */
     haddr_t addr = HADDR_UNDEF; /* Address of the list on disk */
-    haddr_t ret_value;
+    haddr_t ret_value = HADDR_UNDEF;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, H5AC__SOHM_TAG, HADDR_UNDEF)
 
     HDassert(f);
     HDassert(header);
@@ -671,7 +690,7 @@ done:
             H5MF_xfree(f, H5FD_MEM_SOHM_INDEX, dxpl_id, addr, (hsize_t)header->list_size);
     } /* end if */
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, HADDR_UNDEF)
 } /* end H5SM_create_list */
 
 

@@ -812,7 +831,7 @@ H5SM_convert_btree_to_list(H5F_t * f, H5SM_index_header_t * header, hid_t dxpl_i
     haddr_t          btree_addr;
     herr_t           ret_value = SUCCEED;
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, H5AC__SOHM_TAG, FAIL)
 
     /* Remember the address of the old B-tree, but change the header over to be
      * a list..
@@ -831,7 +850,7 @@ H5SM_convert_btree_to_list(H5F_t * f, H5SM_index_header_t * header, hid_t dxpl_i
     cache_udata.header = header;
 
     /* Protect the SOHM list */
-    if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, &cache_udata, H5AC_WRITE)))
+    if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, &cache_udata, H5AC__NO_FLAGS_SET)))
         HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM list index")
 
     /* Delete the B-tree and have messages copy themselves to the
@@ -845,7 +864,7 @@ done:
     if(list && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, list, H5AC__DIRTIED_FLAG) < 0)
         HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to unprotect SOHM index")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5SM_convert_btree_to_list() */
 
 

@@ -870,7 +889,7 @@ done:
 static htri_t
 H5SM_can_share_common(const H5F_t *f, unsigned type_id, const void *mesg)
 {
-    htri_t ret_value;           /* Return value */
+    htri_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -921,7 +940,7 @@ H5SM_can_share(H5F_t *f, hid_t dxpl_id, H5SM_master_table_t *table,
     htri_t              tri_ret;
     htri_t              ret_value = TRUE;
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__SOHM_TAG, FAIL)
 
     /* "trivial" sharing checks */
     if((tri_ret = H5SM_can_share_common(f, type_id, mesg)) < 0)
@@ -939,7 +958,7 @@ H5SM_can_share(H5F_t *f, hid_t dxpl_id, H5SM_master_table_t *table,
         /* Set up user data for callback */
         cache_udata.f = f;
 
-        if(NULL == (my_table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC_READ)))
+        if(NULL == (my_table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
     } /* end if */
 
@@ -966,7 +985,7 @@ done:
     if(my_table && my_table != table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), my_table, H5AC__NO_FLAGS_SET) < 0)
 	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5SM_can_share() */
 
 

@@ -1044,7 +1063,7 @@ H5SM_try_share(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned defer_flags,
 #endif
     htri_t              ret_value = TRUE;
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__SOHM_TAG, FAIL)
 
     /* If we previously deferred this operation, the saved message type should
      * be the same as the one we get here.  In debug mode, we make sure this
@@ -1071,7 +1090,7 @@ H5SM_try_share(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned defer_flags,
     cache_udata.f = f;
 
     /* Look up the master SOHM table */
-    if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC_WRITE)))
+    if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC__NO_FLAGS_SET)))
 	HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
 
     /* "complex" sharing checks */
@@ -1123,7 +1142,7 @@ done:
     if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), table, cache_flags) < 0)
 	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5SM_try_share() */
 
 

@@ -1237,7 +1256,7 @@ H5SM_write_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
     size_t                empty_pos = UFAIL; /* Empty entry in list */
     herr_t                ret_value = SUCCEED;
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, H5AC__SOHM_TAG, FAIL)
 
     /* Sanity check */
     HDassert(header);
@@ -1277,7 +1296,7 @@ H5SM_write_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
         cache_udata.header = header;
 
         /* The index is a list; get it from the cache */
-        if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, &cache_udata, defer ? H5AC_READ : H5AC_WRITE)))
+        if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, &cache_udata, defer ? H5AC__READ_ONLY_FLAG : H5AC__NO_FLAGS_SET)))
 	    HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM index")
 
         /* See if the message is already in the index and get its location.
@@ -1483,7 +1502,7 @@ done:
     if(encoding_buf)
         encoding_buf = H5MM_xfree(encoding_buf);
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5SM_write_mesg() */
 
 

@@ -1517,7 +1536,7 @@ H5SM_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, H5O_shared_t *sh_mesg)
     unsigned              type_id;              /* Message type ID to operate on */
     herr_t                ret_value = SUCCEED;
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__SOHM_TAG, FAIL)
 
     HDassert(f);
     HDassert(H5F_addr_defined(H5F_SOHM_ADDR(f)));
@@ -1530,7 +1549,7 @@ H5SM_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, H5O_shared_t *sh_mesg)
     cache_udata.f = f;
 
     /* Look up the master SOHM table */
-    if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC_WRITE)))
+    if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC__NO_FLAGS_SET)))
 	HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
 
     /* Find the correct index and try to delete from it */
@@ -1574,7 +1593,7 @@ done:
     if(mesg_buf)
         mesg_buf = H5MM_xfree(mesg_buf);
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5SM_delete() */
 
 

@@ -1602,8 +1621,8 @@ done:
 static size_t
 H5SM_find_in_list(const H5SM_list_t *list, const H5SM_mesg_key_t *key, size_t *empty_pos)
 {
-    size_t               x;
-    size_t               ret_value;
+    size_t x;
+    size_t ret_value = 0;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1620,7 +1639,7 @@ H5SM_find_in_list(const H5SM_list_t *list, const H5SM_mesg_key_t *key, size_t *e
      */
     for(x = 0; x < list->header->list_max; x++) {
         if((list->messages[x].location != H5SM_NO_LOC) &&
-                (0 == H5SM_message_compare(key, &(list->messages[x]))))
+                (0 == H5SM__message_compare(key, &(list->messages[x]))))
             HGOTO_DONE(x)
         else if(empty_pos && list->messages[x].location == H5SM_NO_LOC) {
             /* Note position */
@@ -1746,7 +1765,7 @@ H5SM_delete_from_index(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
     unsigned        type_id;            /* Message type to operate on */
     herr_t          ret_value = SUCCEED;
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, H5AC__SOHM_TAG, FAIL)
 
     /* Sanity check */
     HDassert(f);
@@ -1799,7 +1818,7 @@ H5SM_delete_from_index(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
         cache_udata.header = header;
 
         /* If the index is stored as a list, get it from the cache */
-        if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, &cache_udata, H5AC_WRITE)))
+        if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, &cache_udata, H5AC__NO_FLAGS_SET)))
 	    HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM index")
 
         /* Find the message in the list */
@@ -1907,7 +1926,7 @@ done:
     if(encoding_buf && (NULL == *encoded_mesg || ret_value < 0))
         encoding_buf = H5MM_xfree(encoding_buf);
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5SM_delete_from_index() */
 
 

@@ -1929,11 +1948,13 @@ H5SM_get_info(const H5O_loc_t *ext_loc, H5P_genplist_t *fc_plist, hid_t dxpl_id)
     H5F_t *f = ext_loc->file;           /* File pointer (convenience variable) */
     H5O_shmesg_table_t sohm_table;      /* SOHM message from superblock extension */
     H5SM_master_table_t *table = NULL;  /* SOHM master table */
+    H5P_genplist_t *dxpl = NULL;        /* DXPL for setting ring */
+    H5AC_ring_t orig_ring = H5AC_RING_INV;      /* Original ring value */
     unsigned tmp_sohm_nindexes;		/* Number of shared messages indexes in the table */
     htri_t status;                      /* Status for message existing */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__SOHM_TAG, FAIL)
 
     /* Sanity check */
     HDassert(ext_loc);
@@ -1969,8 +1990,12 @@ H5SM_get_info(const H5O_loc_t *ext_loc, H5P_genplist_t *fc_plist, hid_t dxpl_id)
         /* Set up user data for callback */
         cache_udata.f = f;
 
+        /* Set the ring type in the DXPL */
+        if(H5AC_set_ring(dxpl_id, H5AC_RING_US, &dxpl, &orig_ring) < 0)
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTSET, FAIL, "unable to set ring value")
+
         /* Read the rest of the SOHM table information from the cache */
-        if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC_READ)))
+        if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
 
         /* Get index conversion limits */
@@ -2020,11 +2045,15 @@ H5SM_get_info(const H5O_loc_t *ext_loc, H5P_genplist_t *fc_plist, hid_t dxpl_id)
     } /* end else */
 
 done:
+    /* Reset the ring in the DXPL */
+    if(H5AC_reset_ring(dxpl, orig_ring) < 0)
+        HDONE_ERROR(H5E_SOHM, H5E_CANTSET, FAIL, "unable to set property value")
+
     /* Release the master SOHM table if we took it out of the cache */
     if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), table, H5AC__NO_FLAGS_SET) < 0)
 	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5SM_get_info() */
 
 

@@ -2122,7 +2151,7 @@ H5SM_get_refcount(H5F_t *f, hid_t dxpl_id, unsigned type_id,
     void * encoding_buf = NULL;         /* Buffer for encoded message */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, H5AC__SOHM_TAG, FAIL)
 
     /* Sanity check */
     HDassert(f);
@@ -2133,7 +2162,7 @@ H5SM_get_refcount(H5F_t *f, hid_t dxpl_id, unsigned type_id,
     tbl_cache_udata.f = f;
 
     /* Look up the master SOHM table */
-    if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &tbl_cache_udata, H5AC_READ)))
+    if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &tbl_cache_udata, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
 
     /* Find the correct index and find the message in it */
@@ -2172,7 +2201,7 @@ H5SM_get_refcount(H5F_t *f, hid_t dxpl_id, unsigned type_id,
         lst_cache_udata.header = header;
 
         /* If the index is stored as a list, get it from the cache */
-        if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, &lst_cache_udata, H5AC_READ)))
+        if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, &lst_cache_udata, H5AC__READ_ONLY_FLAG)))
 	    HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM index")
 
         /* Find the message in the list */
@@ -2216,7 +2245,7 @@ done:
     if(encoding_buf)
         encoding_buf = H5MM_xfree(encoding_buf);
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5SM_get_refcount() */
 
 

@@ -2236,10 +2265,6 @@ done:
  * Programmer:	James Laird
  *              Wednesday, February 21, 2006
  *
- * Modifications:
- *      Vailin Choi; September 2011
- *      Change "oh_modified" from boolean to unsigned
- *      (See H5Oprivate.h for possible flags)
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -2344,7 +2369,7 @@ H5SM_read_mesg(H5F_t *f, const H5SM_sohm_t *mesg, H5HF_t *fheap,
     H5O_t *oh = NULL;           /* Object header for message in object header */
     herr_t ret_value = SUCCEED;
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, H5AC__SOHM_TAG, FAIL)
 
     HDassert(f);
     HDassert(mesg);
@@ -2379,7 +2404,7 @@ H5SM_read_mesg(H5F_t *f, const H5SM_sohm_t *mesg, H5HF_t *fheap,
 	        HGOTO_ERROR(H5E_SOHM, H5E_CANTLOAD, FAIL, "unable to open object header")
 
             /* Load the object header from the cache */
-            if(NULL == (oh = H5O_protect(&oloc, dxpl_id, H5AC_READ)))
+            if(NULL == (oh = H5O_protect(&oloc, dxpl_id, H5AC__READ_ONLY_FLAG)))
 	        HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load object header")
         } /* end if */
         else
@@ -2418,7 +2443,7 @@ done:
     if(ret_value < 0 && udata.encoding_buf)
         udata.encoding_buf = H5MM_xfree(udata.encoding_buf);
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5SM_read_mesg */
 
 

@@ -2504,7 +2529,7 @@ H5SM_table_debug(H5F_t *f, hid_t dxpl_id, haddr_t table_addr,
     unsigned x;                         /* Counter variable */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__SOHM_TAG, FAIL)
 
     HDassert(f);
     HDassert(table_addr != HADDR_UNDEF);
@@ -2534,7 +2559,7 @@ H5SM_table_debug(H5F_t *f, hid_t dxpl_id, haddr_t table_addr,
     cache_udata.f = f;
 
     /* Look up the master SOHM table */
-    if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, table_addr, &cache_udata, H5AC_READ)))
+    if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, table_addr, &cache_udata, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
 
     HDfprintf(stream, "%*sShared Message Master Table...\n", indent, "");
@@ -2565,7 +2590,7 @@ done:
     if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, table_addr, table, H5AC__NO_FLAGS_SET) < 0)
 	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5SM_table_debug() */
 
 

@@ -2584,18 +2609,19 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5SM_list_debug(H5F_t *f, hid_t dxpl_id, haddr_t list_addr,
-                         FILE *stream, int indent, int fwidth,
-                         unsigned table_vers, size_t num_messages)
+H5SM_list_debug(H5F_t *f, hid_t dxpl_id, haddr_t list_addr, FILE *stream,
+    int indent, int fwidth, haddr_t table_addr)
 {
-
+    H5SM_master_table_t *table = NULL;  /* SOHM master table */
     H5SM_list_t *list = NULL;           /* SOHM index list for message type (if in list form) */
-    H5SM_index_header_t header;         /* A "false" header used to read the list */
-    H5SM_list_cache_ud_t cache_udata;   /* User-data for metadata cache callback */
+    H5SM_list_cache_ud_t lst_cache_udata;   /* List user-data for metadata cache callback */
+    H5SM_table_cache_ud_t tbl_cache_udata;  /* Table user-data for metadata cache callback */
+    H5HF_t *fh = NULL;                  /* Fractal heap for SOHM messages */
+    unsigned index_num;                 /* Index of list, within master table */
     unsigned x;                         /* Counter variable */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__SOHM_TAG, FAIL)
 
     HDassert(f);
     HDassert(list_addr != HADDR_UNDEF);
@@ -2603,35 +2629,48 @@ H5SM_list_debug(H5F_t *f, hid_t dxpl_id, haddr_t list_addr,
     HDassert(indent >= 0);
     HDassert(fwidth >= 0);
 
-    /* Check arguments.  Version must be 0, the only version implemented so far */
-    if(table_vers > H5SM_LIST_VERSION)
-        HGOTO_ERROR(H5E_SOHM, H5E_BADVALUE, FAIL, "unknown shared message list version")
-    if(num_messages == 0 || num_messages > H5O_SHMESG_MAX_LIST_SIZE)
-        HGOTO_ERROR(H5E_SOHM, H5E_BADVALUE, FAIL, "number of indexes must be between 1 and H5O_SHMESG_MAX_NINDEXES")
+    /* Set up user data for callback */
+    tbl_cache_udata.f = f;
 
-    /* Create a temporary header using the arguments.  The cache needs this to load the list. */
-    HDmemset(&header, 0, sizeof(H5SM_index_header_t));
-    header.list_max = header.num_messages = num_messages;
-    header.index_type = H5SM_LIST;
-    header.index_addr = list_addr;
+    /* Look up the master SOHM table */
+    if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, table_addr, &tbl_cache_udata, H5AC__READ_ONLY_FLAG)))
+	HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
+
+    /* Determine which index the list is part of */
+    index_num = table->num_indexes;
+    for(x = 0; x < table->num_indexes; x++) {
+        if(H5F_addr_eq(table->indexes[x].index_addr, list_addr)) {
+            index_num = x;
+            break;
+        } /* end if */
+    } /* end for */
+    if(x == table->num_indexes)
+        HGOTO_ERROR(H5E_SOHM, H5E_BADVALUE, FAIL, "list address doesn't match address for any indices in table")
 
     /* Set up user data for metadata cache callback */
-    cache_udata.f = f;
-    cache_udata.header = &header;
+    lst_cache_udata.f = f;
+    lst_cache_udata.header = &(table->indexes[index_num]);
 
     /* Get the list from the cache */
-    if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, list_addr, &cache_udata, H5AC_READ)))
+    if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, list_addr, &lst_cache_udata, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM index")
 
+    /* Open the heap, if one exists */
+    if(H5F_addr_defined(table->indexes[index_num].heap_addr))
+        if(NULL == (fh = H5HF_open(f, dxpl_id, table->indexes[index_num].heap_addr)))
+            HGOTO_ERROR(H5E_SOHM, H5E_CANTOPENOBJ, FAIL, "unable to open SOHM heap")
+
     HDfprintf(stream, "%*sShared Message List Index...\n", indent, "");
-    for(x = 0; x < num_messages; ++x) {
+    for(x = 0; x < table->indexes[index_num].num_messages; ++x) {
         HDfprintf(stream, "%*sShared Object Header Message %d...\n", indent, "", x);
         HDfprintf(stream, "%*s%-*s %08lu\n", indent + 3, "", fwidth,
                 "Hash value:", (unsigned long)list->messages[x].hash);
         if(list->messages[x].location == H5SM_IN_HEAP) {
+            HDassert(fh);
+
             HDfprintf(stream, "%*s%-*s %s\n", indent + 3, "", fwidth,
                     "Location:", "in heap");
-            HDfprintf(stream, "%*s%-*s %Zu\n", indent + 3, "", fwidth,
+            HDfprintf(stream, "%*s%-*s 0x%Zx\n", indent + 3, "", fwidth,
                     "Heap ID:", list->messages[x].u.heap_loc.fheap_id);
             HDfprintf(stream, "%*s%-*s %u\n", indent + 3, "", fwidth,
                     "Reference count:", list->messages[x].u.heap_loc.ref_count);
@@ -2652,10 +2691,14 @@ H5SM_list_debug(H5F_t *f, hid_t dxpl_id, haddr_t list_addr,
     } /* end for */
 
 done:
+    if(fh && H5HF_close(fh, dxpl_id) < 0)
+	HDONE_ERROR(H5E_SOHM, H5E_CANTCLOSEOBJ, FAIL, "unable to close SOHM heap")
     if(list && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, list_addr, list, H5AC__NO_FLAGS_SET) < 0)
 	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM index")
+    if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, table_addr, table, H5AC__NO_FLAGS_SET) < 0)
+	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5SM_list_debug() */
 
 

@@ -2676,31 +2719,32 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5SM_ih_size(H5F_t *f, hid_t dxpl_id, H5F_info_t *finfo)
+H5SM_ih_size(H5F_t *f, hid_t dxpl_id, hsize_t *hdr_size, H5_ih_info_t *ih_info)
 {
     H5SM_master_table_t *table = NULL;          /* SOHM master table */
     H5SM_table_cache_ud_t cache_udata;          /* User-data for callback */
     H5HF_t              *fheap = NULL;          /* Fractal heap handle */
     H5B2_t              *bt2 = NULL;            /* v2 B-tree handle for index */
-    unsigned    	u;                      /* Local index variable */
-    herr_t              ret_value = SUCCEED;    /* Return value */
+    unsigned             u;                     /* Local index variable */
+    herr_t               ret_value = SUCCEED;   /* Return value */
 
-    FUNC_ENTER_NOAPI(FAIL)
+    FUNC_ENTER_NOAPI_TAG(dxpl_id, H5AC__SOHM_TAG, FAIL)
 
     /* Sanity check */
     HDassert(f);
     HDassert(H5F_addr_defined(H5F_SOHM_ADDR(f)));
-    HDassert(finfo);
+    HDassert(hdr_size);
+    HDassert(ih_info);
 
     /* Set up user data for callback */
     cache_udata.f = f;
 
     /* Look up the master SOHM table */
-    if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC_READ)))
+    if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC__READ_ONLY_FLAG)))
 	HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
 
     /* Get SOHM header size */
-    finfo->sohm.hdr_size = table->table_size;
+    *hdr_size = table->table_size;
 
     /* Loop over all the indices for shared messages */
     for(u = 0; u < table->num_indexes; u++) {
@@ -2711,7 +2755,7 @@ H5SM_ih_size(H5F_t *f, hid_t dxpl_id, H5F_info_t *finfo)
                 if(NULL == (bt2 = H5B2_open(f, dxpl_id, table->indexes[u].index_addr, f)))
                     HGOTO_ERROR(H5E_SOHM, H5E_CANTOPENOBJ, FAIL, "unable to open v2 B-tree for SOHM index")
 
-		if(H5B2_size(bt2, dxpl_id, &(finfo->sohm.msgs_info.index_size)) < 0)
+		if(H5B2_size(bt2, dxpl_id, &(ih_info->index_size)) < 0)
                     HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, FAIL, "can't retrieve B-tree storage info")
 
                 /* Close the v2 B-tree */
@@ -2722,7 +2766,7 @@ H5SM_ih_size(H5F_t *f, hid_t dxpl_id, H5F_info_t *finfo)
         } /* end if */
         else {
             HDassert(table->indexes[u].index_type == H5SM_LIST);
-	    finfo->sohm.msgs_info.index_size += table->indexes[u].list_size;
+	    ih_info->index_size += table->indexes[u].list_size;
         } /* end else */
 
         /* Check for heap for this index */
@@ -2732,7 +2776,7 @@ H5SM_ih_size(H5F_t *f, hid_t dxpl_id, H5F_info_t *finfo)
                 HGOTO_ERROR(H5E_SOHM, H5E_CANTOPENOBJ, FAIL, "unable to open fractal heap")
 
             /* Get heap storage size */
-	    if(H5HF_size(fheap, dxpl_id, &(finfo->sohm.msgs_info.heap_size)) < 0)
+	    if(H5HF_size(fheap, dxpl_id, &(ih_info->heap_size)) < 0)
 		HGOTO_ERROR(H5E_SOHM, H5E_CANTGET, FAIL, "can't retrieve fractal heap storage info")
 
             /* Close the fractal heap */
@@ -2751,6 +2795,6 @@ done:
     if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), table, H5AC__NO_FLAGS_SET) < 0)
         HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5SM_ih_size() */
 
diff --git a/src/H5SMbtree2.c b/src/H5SMbtree2.c
index e18e9fb..e533ae8 100644
--- a/src/H5SMbtree2.c
+++ b/src/H5SMbtree2.c
@@ -17,8 +17,8 @@
 /* Module Setup */
 /****************/
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg 	  */
-#define H5SM_PACKAGE		/*suppress error about including H5SMpkg	  */
+#define H5O_FRIEND		/*suppress error about including H5Opkg	  */
+#include "H5SMmodule.h"         /* This source code file is part of the H5SM module */
 
 
 /***********/
@@ -45,12 +45,12 @@
 /********************/
 
 /* v2 B-tree callbacks */
-static void *H5SM_bt2_crt_context(void *udata);
-static herr_t H5SM_bt2_dst_context(void *ctx);
-static herr_t H5SM_bt2_store(void *native, const void *udata);
-static herr_t H5SM_bt2_debug(FILE *stream, const H5F_t *f, hid_t dxpl_id,
-    int indent, int fwidth, const void *record, const void *_udata);
-static void *H5SM_bt2_crt_dbg_context(H5F_t *f, hid_t dxpl_id, haddr_t addr);
+static void *H5SM__bt2_crt_context(void *udata);
+static herr_t H5SM__bt2_dst_context(void *ctx);
+static herr_t H5SM__bt2_store(void *native, const void *udata);
+static herr_t H5SM__bt2_debug(FILE *stream, int indent, int fwidth,
+    const void *record, const void *_udata);
+static void *H5SM__bt2_crt_dbg_context(H5F_t *f, hid_t dxpl_id, haddr_t addr);
 
 
 /*****************************/
@@ -61,15 +61,15 @@ const H5B2_class_t H5SM_INDEX[1]={{   /* B-tree class information */
     H5B2_SOHM_INDEX_ID,               /* Type of B-tree */
     "H5B2_SOHM_INDEX_ID",             /* Name of B-tree class */
     sizeof(H5SM_sohm_t),              /* Size of native record */
-    H5SM_bt2_crt_context,             /* Create client callback context */
-    H5SM_bt2_dst_context,             /* Destroy client callback context */
-    H5SM_bt2_store,                   /* Record storage callback */
-    H5SM_message_compare,             /* Record comparison callback */
-    H5SM_message_encode,              /* Record encoding callback */
-    H5SM_message_decode,              /* Record decoding callback */
-    H5SM_bt2_debug,                   /* Record debugging callback */
-    H5SM_bt2_crt_dbg_context,	      /* Create debugging context */
-    H5SM_bt2_dst_context 	      /* Destroy debugging context */
+    H5SM__bt2_crt_context,            /* Create client callback context */
+    H5SM__bt2_dst_context,            /* Destroy client callback context */
+    H5SM__bt2_store,                  /* Record storage callback */
+    H5SM__message_compare,            /* Record comparison callback */
+    H5SM__message_encode,             /* Record encoding callback */
+    H5SM__message_decode,             /* Record decoding callback */
+    H5SM__bt2_debug,                  /* Record debugging callback */
+    H5SM__bt2_crt_dbg_context,	      /* Create debugging context */
+    H5SM__bt2_dst_context 	      /* Destroy debugging context */
 }};
 
 
@@ -83,7 +83,7 @@ H5FL_DEFINE_STATIC(H5SM_bt2_ctx_t);
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5SM_bt2_crt_context
+ * Function:	H5SM__bt2_crt_context
  *
  * Purpose:	Create client callback context
  *
@@ -96,13 +96,13 @@ H5FL_DEFINE_STATIC(H5SM_bt2_ctx_t);
  *-------------------------------------------------------------------------
  */
 static void *
-H5SM_bt2_crt_context(void *_f)
+H5SM__bt2_crt_context(void *_f)
 {
     H5F_t *f = (H5F_t *)_f;     /* User data for building callback context */
     H5SM_bt2_ctx_t *ctx;        /* Callback context structure */
-    void *ret_value;            /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Sanity check */
     HDassert(f);
@@ -119,11 +119,11 @@ H5SM_bt2_crt_context(void *_f)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5SM_bt2_crt_context() */
+} /* H5SM__bt2_crt_context() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5SM_bt2_dst_context
+ * Function:	H5SM__bt2_dst_context
  *
  * Purpose:	Destroy client callback context
  *
@@ -136,11 +136,11 @@ done:
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5SM_bt2_dst_context(void *_ctx)
+H5SM__bt2_dst_context(void *_ctx)
 {
     H5SM_bt2_ctx_t *ctx = (H5SM_bt2_ctx_t *)_ctx;       /* Callback context structure */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Sanity check */
     HDassert(ctx);
@@ -149,11 +149,11 @@ H5SM_bt2_dst_context(void *_ctx)
     ctx = H5FL_FREE(H5SM_bt2_ctx_t, ctx);
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* H5SM_bt2_dst_context() */
+} /* H5SM__bt2_dst_context() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5SM_bt2_store
+ * Function:	H5SM__bt2_store
  *
  * Purpose:	Store a H5SM_sohm_t SOHM message in the B-tree.  The message
  *              comes in UDATA as a H5SM_mesg_key_t* and is copied to
@@ -168,21 +168,21 @@ H5SM_bt2_dst_context(void *_ctx)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5SM_bt2_store(void *native, const void *udata)
+H5SM__bt2_store(void *native, const void *udata)
 {
     const H5SM_mesg_key_t *key = (const H5SM_mesg_key_t *)udata;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     /* Copy the source message to the B-tree */
     *(H5SM_sohm_t *)native = key->message;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5SM_bt2_store */
+} /* end H5SM__bt2_store */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5SM_bt2_debug
+ * Function:	H5SM__bt2_debug
  *
  * Purpose:	Print debugging information for a H5SM_sohm_t.
  *
@@ -195,12 +195,12 @@ H5SM_bt2_store(void *native, const void *udata)
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5SM_bt2_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id,
-    int indent, int fwidth, const void *record, const void H5_ATTR_UNUSED *_udata)
+H5SM__bt2_debug(FILE *stream, int indent, int fwidth,
+    const void *record, const void H5_ATTR_UNUSED *_udata)
 {
     const H5SM_sohm_t *sohm = (const H5SM_sohm_t *)record;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
     if(sohm->location == H5SM_IN_HEAP)
         HDfprintf(stream, "%*s%-*s {%a, %lo, %Hx}\n", indent, "", fwidth,
@@ -214,11 +214,11 @@ H5SM_bt2_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED
     } /* end else */
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5SM_bt2_debug */
+} /* end H5SM__bt2_debug */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5SM_bt2_crt_dbg_context
+ * Function:	H5SM__bt2_crt_dbg_context
  *
  * Purpose:	Create context for debugging callback
  *
@@ -231,12 +231,12 @@ H5SM_bt2_debug(FILE *stream, const H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED
  *-------------------------------------------------------------------------
  */
 static void *
-H5SM_bt2_crt_dbg_context(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t H5_ATTR_UNUSED addr)
+H5SM__bt2_crt_dbg_context(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t H5_ATTR_UNUSED addr)
 {
     H5SM_bt2_ctx_t *ctx;        /* Callback context structure */
-    void *ret_value;            /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Sanity check */
     HDassert(f);
@@ -253,7 +253,7 @@ H5SM_bt2_crt_dbg_context(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t H5_ATTR
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* H5SM_bt2_crt_dbg_context() */
+} /* H5SM__bt2_crt_dbg_context() */
 
 

 /*-------------------------------------------------------------------------
diff --git a/src/H5SMcache.c b/src/H5SMcache.c
index 49456d8..7b94743 100644
--- a/src/H5SMcache.c
+++ b/src/H5SMcache.c
@@ -13,11 +13,22 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
+/*-------------------------------------------------------------------------
+ *
+ * Created:		H5SMcache.c
+ *			Nov 13 2006
+ *			James Laird <jlaird at hdfgroup.org>
+ *
+ * Purpose:		Implement shared message metadata cache methods.
+ *
+ *-------------------------------------------------------------------------
+ */
+
 /****************/
 /* Module Setup */
 /****************/
 
-#define H5SM_PACKAGE		/*suppress error about including H5SMpkg	  */
+#include "H5SMmodule.h"         /* This source code file is part of the H5SM module */
 
 
 /***********/
@@ -36,12 +47,6 @@
 /* Local Macros */
 /****************/
 
-/* Size of stack buffer for serialized tables */
-#define H5SM_TBL_BUF_SIZE       1024
-
-/* Size of stack buffer for serialized list indices */
-#define H5SM_LST_BUF_SIZE       1024
-
 
 /******************/
 /* Local Typedefs */
@@ -53,38 +58,68 @@
 /********************/
 
 /* Metadata cache (H5AC) callbacks */
-static H5SM_master_table_t *H5SM_table_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static herr_t H5SM_table_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5SM_master_table_t *table);
-static herr_t H5SM_table_dest(H5F_t *f, H5SM_master_table_t* table);
-static herr_t H5SM_table_clear(H5F_t *f, H5SM_master_table_t *table, hbool_t destroy);
-static herr_t H5SM_table_size(const H5F_t *f, const H5SM_master_table_t *table, size_t *size_ptr);
-static H5SM_list_t *H5SM_list_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static herr_t H5SM_list_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5SM_list_t *list);
-static herr_t H5SM_list_dest(H5F_t *f, H5SM_list_t* list);
-static herr_t H5SM_list_clear(H5F_t *f, H5SM_list_t *list, hbool_t destroy);
-static herr_t H5SM_list_size(const H5F_t *f, const H5SM_list_t H5_ATTR_UNUSED *list, size_t *size_ptr);
+static herr_t H5SM__cache_table_get_load_size(const void *image_ptr, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5SM__cache_table_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
+static void *H5SM__cache_table_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty); 
+static herr_t H5SM__cache_table_image_len(const void *thing, size_t *image_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static herr_t H5SM__cache_table_serialize(const H5F_t *f, void *image,
+    size_t len, void *thing); 
+static herr_t H5SM__cache_table_free_icr(void *thing);
+
+static herr_t H5SM__cache_list_get_load_size(const void *image_ptr, void *udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static htri_t H5SM__cache_list_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
+static void *H5SM__cache_list_deserialize(const void *image, size_t len,
+    void *udata, hbool_t *dirty); 
+static herr_t H5SM__cache_list_image_len(const void *thing, size_t *image_len,
+    hbool_t *compressed_ptr, size_t *compressed_image_len_ptr);
+static herr_t H5SM__cache_list_serialize(const H5F_t *f, void *image,
+    size_t len, void *thing);
+static herr_t H5SM__cache_list_free_icr(void *thing);
 
 
 /*********************/
 /* Package Variables */
 /*********************/
+
 /* H5SM inherits cache-like properties from H5AC */
 const H5AC_class_t H5AC_SOHM_TABLE[1] = {{
-    H5AC_SOHM_TABLE_ID,
-    (H5AC_load_func_t)H5SM_table_load,
-    (H5AC_flush_func_t)H5SM_table_flush,
-    (H5AC_dest_func_t)H5SM_table_dest,
-    (H5AC_clear_func_t)H5SM_table_clear,
-    (H5AC_size_func_t)H5SM_table_size,
+    H5AC_SOHM_TABLE_ID,                 /* Metadata client ID */
+    "shared message table",             /* Metadata client name (for debugging) */
+    H5FD_MEM_SOHM_TABLE,                /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5SM__cache_table_get_load_size,    /* 'get_load_size' callback */
+    H5SM__cache_table_verify_chksum,	/* 'verify_chksum' callback */
+    H5SM__cache_table_deserialize,      /* 'deserialize' callback */
+    H5SM__cache_table_image_len,        /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5SM__cache_table_serialize,        /* 'serialize' callback */
+    NULL,                               /* 'notify' callback */
+    H5SM__cache_table_free_icr,         /* 'free_icr' callback */
+    NULL,			        /* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
 }};
 
 const H5AC_class_t H5AC_SOHM_LIST[1] = {{
-    H5AC_SOHM_LIST_ID,
-    (H5AC_load_func_t)H5SM_list_load,
-    (H5AC_flush_func_t)H5SM_list_flush,
-    (H5AC_dest_func_t)H5SM_list_dest,
-    (H5AC_clear_func_t)H5SM_list_clear,
-    (H5AC_size_func_t)H5SM_list_size,
+    H5AC_SOHM_LIST_ID,                  /* Metadata client ID */
+    "shared message list",              /* Metadata client name (for debugging) */
+    H5FD_MEM_SOHM_TABLE,                /* File space memory type for client */
+    H5AC__CLASS_NO_FLAGS_SET,           /* Client class behavior flags */
+    H5SM__cache_list_get_load_size,     /* 'get_load_size' callback */
+    H5SM__cache_list_verify_chksum,	/* 'verify_chksum' callback */
+    H5SM__cache_list_deserialize,       /* 'deserialize' callback */
+    H5SM__cache_list_image_len,         /* 'image_len' callback */
+    NULL,                               /* 'pre_serialize' callback */
+    H5SM__cache_list_serialize,         /* 'serialize' callback */
+    NULL,                               /* 'notify' callback */
+    H5SM__cache_list_free_icr,          /* 'free_icr' callback */
+    NULL,			        /* 'clear' callback */
+    NULL,                               /* 'fsf_size' callback */
 }};
 
 
@@ -100,32 +135,119 @@ const H5AC_class_t H5AC_SOHM_LIST[1] = {{
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5SM_table_load
+ * Function:    H5SM__cache_table_get_load_size()
+ *
+ * Purpose:	Return the size of the master table of Shared Object Header 
+ *		Message indexes on disk.  As this cache client doesn't use 
+ *		speculative reads, this value should be accurate.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              7/28/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM__cache_table_get_load_size(const void *_image, void *_udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
+{
+    const uint8_t *image = (const uint8_t *)_image;       			 /* Pointer into raw data buffer */
+    const H5SM_table_cache_ud_t *udata = (const H5SM_table_cache_ud_t *)_udata;  /* User data for callback */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(udata);
+    HDassert(udata->f);
+    HDassert(image_len);
+
+    if(image == NULL)
+	*image_len = H5SM_TABLE_SIZE(udata->f);
+    else {
+	HDassert(actual_len);
+        HDassert(*actual_len == *image_len);
+    }
+
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM__cache_table_get_load_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM__cache_table_verify_chksum
  *
- * Purpose:	Loads the master table of Shared Object Header Message
- *              indexes.
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
  *
- * Programmer:	James Laird
- *		November 6, 2006
+ * Programmer: 	Vailin Choi; Aug 2015
  *
  *-------------------------------------------------------------------------
  */
-static H5SM_master_table_t *
-H5SM_table_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void H5_ATTR_UNUSED *udata)
+htri_t
+H5SM__cache_table_verify_chksum(const void *_image, size_t len, void H5_ATTR_UNUSED *_udata)
 {
-    H5SM_master_table_t *table = NULL;
-    H5WB_t        *wb = NULL;           /* Wrapped buffer for table data */
-    uint8_t       tbl_buf[H5SM_TBL_BUF_SIZE]; /* Buffer for table */
-    uint8_t       *buf;                 /* Reading buffer */
-    const uint8_t *p;                   /* Pointer into input buffer */
-    uint32_t      stored_chksum;        /* Stored metadata checksum value */
-    uint32_t      computed_chksum;      /* Computed metadata checksum value */
-    size_t        x;                    /* Counter variable for index headers */
-    H5SM_master_table_t *ret_value;
-
-    FUNC_ENTER_NOAPI_NOINIT
+    const uint8_t *image = (const uint8_t *)_image;       /* Pointer into raw data buffer */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+    htri_t ret_value = TRUE;	/* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check arguments */
+    HDassert(image);
+
+    /* Get stored and computed checksums */
+    H5F_get_checksums(image, len, &stored_chksum, &computed_chksum);
+
+    if(stored_chksum != computed_chksum)
+        ret_value = FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM__cache_table_verify_chksum() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM__cache_table_deserialize
+ *
+ * Purpose:	Given a buffer containing the on disk representation of the 
+ *		master table of Shared Object Header Message indexes, deserialize
+ *		the table, copy the contents into a newly allocated instance of 
+ *		H5SM_master_table_t, and return a pointer to the new instance.
+ *
+ * Return:      Success:        Pointer to in core representation
+ *              Failure:        NULL
+ *
+ * Programmer:  John Mainzer
+ *              7/28/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+H5SM__cache_table_deserialize(const void *_image, size_t len, void *_udata,
+    hbool_t H5_ATTR_UNUSED *dirty)
+{
+    H5F_t		   *f;                  /* File pointer -- from user data */
+    H5SM_master_table_t    *table = NULL;       /* Shared message table that we deserializing */
+    H5SM_table_cache_ud_t  *udata = (H5SM_table_cache_ud_t *)_udata;    /* Pointer to user data */
+    const uint8_t          *image = (const uint8_t *)_image;    /* Pointer into input buffer */
+    uint32_t                stored_chksum;      /* Stored metadata checksum value */
+    size_t                  u;                  /* Counter variable for index headers */
+    void                   *ret_value = NULL;   /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check arguments */
+    HDassert(image);
+    HDassert(len > 0);
+    HDassert(udata);
+    HDassert(udata->f);
+    f = udata->f;
+    HDassert(dirty);
 
     /* Verify that we're reading version 0 of the table; this is the only
      * version defined so far.
@@ -134,236 +256,237 @@ H5SM_table_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void H5_ATTR_UNUSED *udat
 
     /* Allocate space for the master table in memory */
     if(NULL == (table = H5FL_CALLOC(H5SM_master_table_t)))
-	HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, NULL, "memory allocation failed")
+        HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, NULL, "memory allocation failed")
 
     /* Read number of indexes and version from file superblock */
     table->num_indexes = H5F_SOHM_NINDEXES(f);
-
-    HDassert(addr == H5F_SOHM_ADDR(f));
-    HDassert(addr != HADDR_UNDEF);
     HDassert(table->num_indexes > 0);
 
-    /* Wrap the local buffer for serialized table info */
-    if(NULL == (wb = H5WB_wrap(tbl_buf, sizeof(tbl_buf))))
-        HGOTO_ERROR(H5E_SOHM, H5E_CANTINIT, NULL, "can't wrap buffer")
-
     /* Compute the size of the SOHM table header on disk.  This is the "table"
      * itself plus each index within the table
      */
     table->table_size = H5SM_TABLE_SIZE(f);
-
-    /* Get a pointer to a buffer that's large enough for serialized table */
-    if(NULL == (buf = (uint8_t *)H5WB_actual(wb, table->table_size)))
-        HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, NULL, "can't get actual buffer")
-
-    /* Read header from disk */
-    if(H5F_block_read(f, H5FD_MEM_SOHM_TABLE, addr, table->table_size, dxpl_id, buf) < 0)
-	HGOTO_ERROR(H5E_SOHM, H5E_READERROR, NULL, "can't read SOHM table")
-
-    /* Get temporary pointer to serialized table */
-    p = buf;
+    HDassert(table->table_size == len);
 
     /* Check magic number */
-    if(HDmemcmp(p, H5SM_TABLE_MAGIC, (size_t)H5_SIZEOF_MAGIC))
-	HGOTO_ERROR(H5E_SOHM, H5E_CANTLOAD, NULL, "bad SOHM table signature")
-    p += H5_SIZEOF_MAGIC;
+    if(HDmemcmp(image, H5SM_TABLE_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTLOAD, NULL, "bad SOHM table signature")
+    image += H5_SIZEOF_MAGIC;
 
     /* Allocate space for the index headers in memory*/
     if(NULL == (table->indexes = (H5SM_index_header_t *)H5FL_ARR_MALLOC(H5SM_index_header_t, (size_t)table->num_indexes)))
-	HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, NULL, "memory allocation failed for SOHM indexes")
+        HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, NULL, "memory allocation failed for SOHM indexes")
 
     /* Read in the index headers */
-    for(x = 0; x < table->num_indexes; ++x) {
+    for(u = 0; u < table->num_indexes; ++u) {
         /* Verify correct version of index list */
-        if(H5SM_LIST_VERSION != *p++)
+        if(H5SM_LIST_VERSION != *image++) 
             HGOTO_ERROR(H5E_SOHM, H5E_VERSION, NULL, "bad shared message list version number")
 
         /* Type of the index (list or B-tree) */
-        table->indexes[x].index_type= (H5SM_index_type_t)*p++;
+        table->indexes[u].index_type= (H5SM_index_type_t)*image++;
 
         /* Type of messages in the index */
-        UINT16DECODE(p, table->indexes[x].mesg_types);
+        UINT16DECODE(image, table->indexes[u].mesg_types);
 
         /* Minimum size of message to share */
-        UINT32DECODE(p, table->indexes[x].min_mesg_size);
+        UINT32DECODE(image, table->indexes[u].min_mesg_size);
 
         /* List cutoff; fewer than this number and index becomes a list */
-        UINT16DECODE(p, table->indexes[x].list_max);
+        UINT16DECODE(image, table->indexes[u].list_max);
 
         /* B-tree cutoff; more than this number and index becomes a B-tree */
-        UINT16DECODE(p, table->indexes[x].btree_min);
+        UINT16DECODE(image, table->indexes[u].btree_min);
 
         /* Number of messages shared */
-        UINT16DECODE(p, table->indexes[x].num_messages);
+        UINT16DECODE(image, table->indexes[u].num_messages);
 
         /* Address of the actual index */
-        H5F_addr_decode(f, &p, &(table->indexes[x].index_addr));
+        H5F_addr_decode(f, &image, &(table->indexes[u].index_addr));
 
         /* Address of the index's heap */
-        H5F_addr_decode(f, &p, &(table->indexes[x].heap_addr));
+        H5F_addr_decode(f, &image, &(table->indexes[u].heap_addr));
 
-        /* Compute the size of a list index for this SOHM index */
-        table->indexes[x].list_size = H5SM_LIST_SIZE(f, table->indexes[x].list_max);
+	/* Compute the size of a list index for this SOHM index */
+        table->indexes[u].list_size = H5SM_LIST_SIZE(f, table->indexes[u].list_max);
+	table->indexes[u].list_size = H5SM_LIST_SIZE(f, table->indexes[u].list_max);
     } /* end for */
 
+    /* checksum verification already done in verify_chksum cb */
+
     /* Read in checksum */
-    UINT32DECODE(p, stored_chksum);
+    UINT32DECODE(image, stored_chksum);
 
     /* Sanity check */
-    HDassert((size_t)(p - (const uint8_t *)buf) == table->table_size);
-
-    /* Compute checksum on entire header */
-    computed_chksum = H5_checksum_metadata(buf, (table->table_size - H5SM_SIZEOF_CHECKSUM), 0);
-
-    /* Verify checksum */
-    if(stored_chksum != computed_chksum)
-        HGOTO_ERROR(H5E_SOHM, H5E_BADVALUE, NULL, "incorrect metadata checksum for shared message table")
+    HDassert((size_t)(image - (const uint8_t *)_image) == table->table_size);
 
     /* Set return value */
     ret_value = table;
 
 done:
-    /* Release resources */
-    if(wb && H5WB_unwrap(wb) < 0)
-        HDONE_ERROR(H5E_SOHM, H5E_CLOSEERROR, NULL, "can't close wrapped buffer")
     if(!ret_value && table)
         if(H5SM_table_free(table) < 0)
-	    HDONE_ERROR(H5E_SOHM, H5E_CANTFREE, NULL, "unable to destroy sohm table")
+            HDONE_ERROR(H5E_SOHM, H5E_CANTFREE, NULL, "unable to destroy sohm table")
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5SM_table_load() */
+} /* end H5SM__cache_table_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5SM_table_flush
+ * Function:    H5SM__cache_table_image_len
  *
- * Purpose:	Flushes (and destroys) the table of Shared Object Header
- *              Message indexes.
+ * Purpose:	Compute the size in bytes of the specified instance of
+ *		H5SM_master_table_t on disk, and return it in *image_len.
+ *		On failure, the value of *image_len is undefined.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	James Laird
- *		November 6, 2006
+ * Programmer:  John Mainzer
+ *              7/28/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5SM_table_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5SM_master_table_t *table)
+H5SM__cache_table_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    H5WB_t *wb = NULL;                  /* Wrapped buffer for table data */
-    uint8_t tbl_buf[H5SM_TBL_BUF_SIZE]; /* Buffer for table */
-    herr_t ret_value = SUCCEED;  /* Return value */
+    const H5SM_master_table_t *table = (const H5SM_master_table_t *)_thing;     /* Shared message table to query */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR
 
-    /* check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    /* Check arguments */
     HDassert(table);
+    HDassert(table->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(table->cache_info.type == H5AC_SOHM_TABLE);
+    HDassert(image_len);
 
-    if(table->cache_info.is_dirty) {
-        uint8_t  *buf;               /* Temporary buffer */
-        uint8_t  *p;                 /* Pointer into raw data buffer */
-        uint32_t computed_chksum;    /* Computed metadata checksum value */
-        size_t   x;                  /* Counter variable */
+    *image_len = table->table_size;
 
-        /* Verify that we're writing version 0 of the table; this is the only
-         * version defined so far.
-         */
-        HDassert(H5F_SOHM_VERS(f) == HDF5_SHAREDHEADER_VERSION);
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM__cache_table_image_len() */
 
-        /* Wrap the local buffer for serialized header info */
-        if(NULL == (wb = H5WB_wrap(tbl_buf, sizeof(tbl_buf))))
-            HGOTO_ERROR(H5E_SOHM, H5E_CANTINIT, FAIL, "can't wrap buffer")
+/***************************************/
+/* no H5SM_cache_table_pre_serialize() */
+/***************************************/
 
-        /* Get a pointer to a buffer that's large enough for serialized table */
-        if(NULL == (buf = (uint8_t *)H5WB_actual(wb, table->table_size)))
-            HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, FAIL, "can't get actual buffer")
+

+/*-------------------------------------------------------------------------
+ * Function:    H5SM__cache_table_serialize
+ *
+ * Purpose:	Serialize the contents of the supplied shared message table, and
+ *		load this data into the supplied buffer.
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              7/28/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+H5SM__cache_table_serialize(const H5F_t *f, void *_image, size_t len,
+    void *_thing)
+{
+    H5SM_master_table_t *table = (H5SM_master_table_t *)_thing; /* Shared message table to encode */
+    uint8_t            *image = (uint8_t *)_image;      /* Pointer into raw data buffer */
+    uint32_t            computed_chksum;    /* Computed metadata checksum value */
+    size_t              u;                  /* Counter variable */
 
-        /* Get temporary pointer to buffer for serialized table */
-        p = buf;
+    FUNC_ENTER_STATIC_NOERR
 
-        /* Encode magic number */
-        HDmemcpy(p, H5SM_TABLE_MAGIC, (size_t)H5_SIZEOF_MAGIC);
-        p += H5_SIZEOF_MAGIC;
+    /* Check arguments */
+    HDassert(f);
+    HDassert(image);
+    HDassert(table);
+    HDassert(table->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(table->cache_info.type == H5AC_SOHM_TABLE);
+    HDassert(table->table_size == len);
 
-        /* Encode each index header */
-        for(x = 0; x < table->num_indexes; ++x) {
-            /* Version for this list. */
-            *p++ = H5SM_LIST_VERSION;
+    /* Verify that we're writing version 0 of the table; this is the only
+     * version defined so far.
+     */
+    HDassert(H5F_SOHM_VERS(f) == HDF5_SHAREDHEADER_VERSION);
 
-            /* Is message index a list or a B-tree? */
-            *p++ = table->indexes[x].index_type;
+    /* Encode magic number */
+    HDmemcpy(image, H5SM_TABLE_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    image += H5_SIZEOF_MAGIC;
 
-            /* Type of messages in the index */
-            UINT16ENCODE(p, table->indexes[x].mesg_types);
+    /* Encode each index header */
+   for(u = 0; u < table->num_indexes; ++u) {
+        /* Version for this list */
+        *image++ = H5SM_LIST_VERSION;
 
-            /* Minimum size of message to share */
-            UINT32ENCODE(p, table->indexes[x].min_mesg_size);
+        /* Is message index a list or a B-tree? */
+        *image++ = table->indexes[u].index_type;
 
-            /* List cutoff; fewer than this number and index becomes a list */
-            UINT16ENCODE(p, table->indexes[x].list_max);
+        /* Type of messages in the index */
+        UINT16ENCODE(image, table->indexes[u].mesg_types);
 
-            /* B-tree cutoff; more than this number and index becomes a B-tree */
-            UINT16ENCODE(p, table->indexes[x].btree_min);
+        /* Minimum size of message to share */
+        UINT32ENCODE(image, table->indexes[u].min_mesg_size);
 
-            /* Number of messages shared */
-            UINT16ENCODE(p, table->indexes[x].num_messages);
+        /* List cutoff; fewer than this number and index becomes a list */
+        UINT16ENCODE(image, table->indexes[u].list_max);
 
-            /* Address of the actual index */
-            H5F_addr_encode(f, &p, table->indexes[x].index_addr);
+        /* B-tree cutoff; more than this number and index becomes a B-tree */
+        UINT16ENCODE(image, table->indexes[u].btree_min);
 
-            /* Address of the index's heap */
-            H5F_addr_encode(f, &p, table->indexes[x].heap_addr);
-        } /* end for */
+        /* Number of messages shared */
+        UINT16ENCODE(image, table->indexes[u].num_messages);
 
-        /* Compute checksum on buffer */
-        computed_chksum = H5_checksum_metadata(buf, (table->table_size - H5SM_SIZEOF_CHECKSUM), 0);
-        UINT32ENCODE(p, computed_chksum);
+        /* Address of the actual index */
+        H5F_addr_encode(f, &image, table->indexes[u].index_addr);
 
-        /* Write the table to disk */
-        HDassert((size_t)(p - buf) == table->table_size);
-	if(H5F_block_write(f, H5FD_MEM_SOHM_TABLE, addr, table->table_size, dxpl_id, buf) < 0)
-	    HGOTO_ERROR(H5E_SOHM, H5E_CANTFLUSH, FAIL, "unable to save sohm table to disk")
+        /* Address of the index's heap */
+        H5F_addr_encode(f, &image, table->indexes[u].heap_addr);
+    } /* end for */
 
-	table->cache_info.is_dirty = FALSE;
-    } /* end if */
+    /* Compute checksum on buffer */
+    computed_chksum = H5_checksum_metadata(_image, (table->table_size - H5SM_SIZEOF_CHECKSUM), 0);
+    UINT32ENCODE(image, computed_chksum);
 
-    if(destroy)
-        if(H5SM_table_dest(f, table) < 0)
-	    HGOTO_ERROR(H5E_SOHM, H5E_CANTFREE, FAIL, "unable to destroy sohm table")
+    /* sanity check */
+    HDassert((size_t)(image - ((uint8_t *)_image)) == table->table_size);
 
-done:
-    /* Release resources */
-    if(wb && H5WB_unwrap(wb) < 0)
-        HDONE_ERROR(H5E_SOHM, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM__cache_table_serialize() */
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5SM_table_flush() */
+/*****************************************/
+/* no H5SM_cache_table_notify() function */
+/*****************************************/
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5SM_table_dest
+ * Function:    H5SM__cache_table_free_icr
  *
- * Purpose:	Frees memory used by the SOHM table.
+ * Purpose:	Free memory used by the SOHM table.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Note:	The metadata cache sets the object's cache_info.magic to
+ *		H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC before calling a free_icr
+ *		callback (checked in assert).
  *
- * Programmer:	James Laird
- *		November 6, 2006
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              7/28/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5SM_table_dest(H5F_t H5_ATTR_UNUSED *f, H5SM_master_table_t* table)
+H5SM__cache_table_free_icr(void *_thing)
 {
-    herr_t ret_value = SUCCEED;         /* Return value */
+    H5SM_master_table_t *table = (H5SM_master_table_t *)_thing;  /* Shared message table to release */
+    herr_t               ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /* Sanity check */
+    /* Check arguments */
     HDassert(table);
-    HDassert(table->indexes);
+    HDassert(table->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC);
+    HDassert(table->cache_info.type == H5AC_SOHM_TABLE);
 
     /* Destroy Shared Object Header Message table */
     if(H5SM_table_free(table) < 0)
@@ -371,169 +494,170 @@ H5SM_table_dest(H5F_t H5_ATTR_UNUSED *f, H5SM_master_table_t* table)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5SM_table_dest() */
+} /* end H5SM_cache_table_free_icr() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5SM_table_clear
+ * Function:    H5SM__cache_list_get_load_size()
  *
- * Purpose:	Mark this table as no longer being dirty.
+ * Purpose:	Return the on disk size of list of SOHM messages.  In this case,
+ *		we simply look up the size in the user data, and return that value
+ *		in *image_len.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	James Laird
- *		November 6, 2006
+ * Programmer:  John Mainzer
+ *              7/28/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5SM_table_clear(H5F_t *f, H5SM_master_table_t *table, hbool_t destroy)
+H5SM__cache_list_get_load_size(const void *_image, void *_udata, 
+    size_t *image_len, size_t *actual_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    herr_t ret_value = SUCCEED;         /* Return value */
-
-    FUNC_ENTER_NOAPI_NOINIT
+    const uint8_t *image = (const uint8_t *)_image;       			/* Pointer into raw data buffer */
+    const H5SM_list_cache_ud_t *udata = (const H5SM_list_cache_ud_t *)_udata;  	/* User data for callback */
 
-    /*
-     * Check arguments.
-     */
-    HDassert(table);
+    FUNC_ENTER_STATIC_NOERR
 
-    /* Reset the dirty flag.  */
-    table->cache_info.is_dirty = FALSE;
+    /* Check arguments */
+    HDassert(udata);
+    HDassert(udata->header);
+    HDassert(udata->header->list_size > 0);
+    HDassert(image_len);
 
-    if(destroy)
-        if(H5SM_table_dest(f, table) < 0)
-	    HGOTO_ERROR(H5E_SOHM, H5E_CANTFREE, FAIL, "unable to delete SOHM master table")
+    if(image == NULL)
+	*image_len = udata->header->list_size;
+    else {
+	HDassert(actual_len);
+        HDassert(*actual_len == *image_len);
+    }
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5SM_table_clear() */
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM__cache_list_get_load_size() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5SM_table_size
+ * Function:	H5SM__cache_list_verify_chksum
  *
- * Purpose:	Returns the size of the table encoded on disk.
+ * Purpose:     Verify the computed checksum of the data structure is the
+ *              same as the stored chksum.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        TRUE/FALSE
+ *              Failure:        Negative
  *
- * Programmer:	James Laird
- *		November 6, 2006
+ * Programmer:	Vailin Choi; Aug 2015
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5SM_table_size(const H5F_t H5_ATTR_UNUSED *f, const H5SM_master_table_t *table, size_t *size_ptr)
+htri_t
+H5SM__cache_list_verify_chksum(const void *_image, size_t H5_ATTR_UNUSED len, void *_udata)
 {
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    const uint8_t *image = (const uint8_t *)_image;       		/* Pointer into raw data buffer */
+    H5SM_list_cache_ud_t *udata = (H5SM_list_cache_ud_t *)_udata;    	/* User data for callback */
+    size_t chk_size;       	/* Exact size of the node with checksum at the end */
+    uint32_t stored_chksum;     /* Stored metadata checksum value */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+    htri_t ret_value = TRUE;	/* Return value */
 
-    /* check arguments */
-    HDassert(f);
-    HDassert(table);
-    HDassert(size_ptr);
+    FUNC_ENTER_STATIC_NOERR
 
-    /* Set size value */
-    *size_ptr = table->table_size;
+    /* Check arguments */
+    HDassert(image);
+    HDassert(udata);
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5SM_table_size() */
+    /* Exact size with checksum at the end */
+    chk_size = H5SM_LIST_SIZE(udata->f, udata->header->num_messages);
+
+    /* Get stored and computed checksums */
+    H5F_get_checksums(image, chk_size, &stored_chksum, &computed_chksum);
+
+    if(stored_chksum != computed_chksum)
+	ret_value = FALSE;
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5SM__cache_list_verify_chksum() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5SM_list_load
+ * Function:    H5SM__cache_list_deserialize
  *
- * Purpose:	Loads a list of SOHM messages.
+ * Purpose:	Given a buffer containing the on disk image of a list of 
+ *		SOHM message, deserialize the list, load it into a newly allocated 
+ *		instance of H5SM_list_t, and return a pointer to same.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        Pointer to in core representation
+ *              Failure:        NULL
  *
- * Programmer:	James Laird
- *		November 6, 2006
+ * Programmer:  John Mainzer
+ *              7/28/14
  *
  *-------------------------------------------------------------------------
  */
-static H5SM_list_t *
-H5SM_list_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_udata)
+static void *
+H5SM__cache_list_deserialize(const void *_image, size_t len, void *_udata,
+    hbool_t H5_ATTR_UNUSED *dirty)
 {
-    H5SM_list_t *list;          /* The SOHM list being read in */
-    H5SM_list_cache_ud_t *udata = (H5SM_list_cache_ud_t *)_udata; /* User data for callback */
-    H5SM_bt2_ctx_t ctx;         /* Message encoding context */
-    H5WB_t *wb = NULL;          /* Wrapped buffer for list index data */
-    uint8_t lst_buf[H5SM_LST_BUF_SIZE]; /* Buffer for list index */
-    uint8_t *buf;               /* Reading buffer */
-    uint8_t *p;                 /* Pointer into input buffer */
-    uint32_t stored_chksum;     /* Stored metadata checksum value */
-    uint32_t computed_chksum;   /* Computed metadata checksum value */
-    size_t x;                   /* Counter variable for messages in list */
-    H5SM_list_t *ret_value;     /* Return value */
-
-    FUNC_ENTER_NOAPI_NOINIT
-
-    /* Sanity check */
+    H5SM_list_t          *list = NULL;     /* The SOHM list being read in */
+    H5SM_list_cache_ud_t *udata = (H5SM_list_cache_ud_t *)_udata;    /* User data for callback */
+    H5SM_bt2_ctx_t        ctx;             /* Message encoding context */
+    const uint8_t        *image = (const uint8_t *)_image;      /* Pointer into input buffer */
+    uint32_t              stored_chksum;   /* Stored metadata checksum value */
+    size_t                u;               /* Counter variable for messages in list */
+    void                 *ret_value = NULL;   /* Return value */
+
+    FUNC_ENTER_STATIC
+
+    /* Check arguments */
+    HDassert(image);
+    HDassert(len > 0);
+    HDassert(udata);
     HDassert(udata->header);
+    HDassert(udata->header->list_size == len);
+    HDassert(dirty);
 
     /* Allocate space for the SOHM list data structure */
     if(NULL == (list = H5FL_MALLOC(H5SM_list_t)))
-	HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, NULL, "memory allocation failed")
+        HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, NULL, "memory allocation failed")
     HDmemset(&list->cache_info, 0, sizeof(H5AC_info_t));
 
     /* Allocate list in memory as an array*/
-    if((list->messages = (H5SM_sohm_t *)H5FL_ARR_MALLOC(H5SM_sohm_t, udata->header->list_max)) == NULL)
-	HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, NULL, "file allocation failed for SOHM list")
-
+    if(NULL == (list->messages = (H5SM_sohm_t *)H5FL_ARR_MALLOC(H5SM_sohm_t, udata->header->list_max)))
+        HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, NULL, "file allocation failed for SOHM list")
     list->header = udata->header;
 
-    /* Wrap the local buffer for serialized list index info */
-    if(NULL == (wb = H5WB_wrap(lst_buf, sizeof(lst_buf))))
-        HGOTO_ERROR(H5E_SOHM, H5E_CANTINIT, NULL, "can't wrap buffer")
-
-    /* Get a pointer to a buffer that's large enough for serialized list index */
-    if(NULL == (buf = (uint8_t *)H5WB_actual(wb, udata->header->list_size)))
-        HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, NULL, "can't get actual buffer")
-
-    /* Read list from disk */
-    if(H5F_block_read(f, H5FD_MEM_SOHM_INDEX, addr, udata->header->list_size, dxpl_id, buf) < 0)
-	HGOTO_ERROR(H5E_SOHM, H5E_READERROR, NULL, "can't read SOHM list")
-
-    /* Get temporary pointer to serialized list index */
-    p = buf;
-
     /* Check magic number */
-    if(HDmemcmp(p, H5SM_LIST_MAGIC, (size_t)H5_SIZEOF_MAGIC))
+    if(HDmemcmp(image, H5SM_LIST_MAGIC, (size_t)H5_SIZEOF_MAGIC))
         HGOTO_ERROR(H5E_SOHM, H5E_CANTLOAD, NULL, "bad SOHM list signature")
-    p += H5_SIZEOF_MAGIC;
+    image += H5_SIZEOF_MAGIC;
 
     /* Read messages into the list array */
     ctx.sizeof_addr = H5F_SIZEOF_ADDR(udata->f);
-    for(x = 0; x < udata->header->num_messages; x++) {
-        if(H5SM_message_decode(p, &(list->messages[x]), &ctx) < 0)
+    for(u = 0; u < udata->header->num_messages; u++) {
+        if(H5SM__message_decode(image, &(list->messages[u]), &ctx) < 0)
             HGOTO_ERROR(H5E_SOHM, H5E_CANTLOAD, NULL, "can't decode shared message")
-        p += H5SM_SOHM_ENTRY_SIZE(udata->f);
+
+        image += H5SM_SOHM_ENTRY_SIZE(udata->f);
     } /* end for */
 
+    /* checksum verification already done in verify_chksum cb */
+
     /* Read in checksum */
-    UINT32DECODE(p, stored_chksum);
+    UINT32DECODE(image, stored_chksum);
 
     /* Sanity check */
-    HDassert((size_t)(p - buf) <= udata->header->list_size);
-
-    /* Compute checksum on entire header */
-    computed_chksum = H5_checksum_metadata(buf, ((size_t)(p - buf) - H5SM_SIZEOF_CHECKSUM), 0);
-
-    /* Verify checksum */
-    if(stored_chksum != computed_chksum)
-        HGOTO_ERROR(H5E_SOHM, H5E_BADVALUE, NULL, "incorrect metadata checksum for shared message list")
+    HDassert((size_t)(image - (const uint8_t *)_image) <= udata->header->list_size);
 
     /* Initialize the rest of the array */
-    for(x = udata->header->num_messages; x < udata->header->list_max; x++)
-        list->messages[x].location = H5SM_NO_LOC;
+    for(u = udata->header->num_messages; u < udata->header->list_max; u++)
+        list->messages[u].location = H5SM_NO_LOC;
 
     /* Set return value */
     ret_value = list;
 
 done:
-    /* Release resources */
-    if(wb && H5WB_unwrap(wb) < 0)
-        HDONE_ERROR(H5E_SOHM, H5E_CLOSEERROR, NULL, "can't close wrapped buffer")
     if(!ret_value && list) {
         if(list->messages)
             list->messages = H5FL_ARR_FREE(H5SM_sohm_t, list->messages);
@@ -541,207 +665,158 @@ done:
     } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5SM_list_load() */
+} /* end H5SM__cache_list_deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5SM_list_flush
+ * Function:    H5SM__cache_list_image_len
  *
- * Purpose:	Flush this list index.
+ * Purpose:	Get the size of the shared message list on disk.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	James Laird
- *		November 6, 2006
+ * Programmer:  John Mainzer
+ *              7/28/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5SM_list_flush(H5F_t *f, hid_t dxpl_id, hbool_t destroy, haddr_t addr, H5SM_list_t *list)
+H5SM__cache_list_image_len(const void *_thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_image_len_ptr)
 {
-    H5WB_t *wb = NULL;                  /* Wrapped buffer for list index data */
-    uint8_t lst_buf[H5SM_LST_BUF_SIZE]; /* Buffer for list index */
-    herr_t ret_value = SUCCEED;         /* Return value */
+    const H5SM_list_t *list = (const H5SM_list_t *)_thing;      /* Shared message list to query */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC_NOERR
 
-    /* check arguments */
-    HDassert(f);
-    HDassert(H5F_addr_defined(addr));
+    /* Check arguments */
     HDassert(list);
+    HDassert(list->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(list->cache_info.type == H5AC_SOHM_LIST);
     HDassert(list->header);
+    HDassert(image_len);
 
-    if(list->cache_info.is_dirty) {
-        H5SM_bt2_ctx_t ctx;         /* Message encoding context */
-        uint8_t *buf;               /* Temporary buffer */
-        uint8_t *p;                 /* Pointer into raw data buffer */
-        uint32_t computed_chksum;   /* Computed metadata checksum value */
-        size_t mesgs_written;       /* Number of messages written to list */
-        size_t x;                   /* Local index variable */
-
-        /* Wrap the local buffer for serialized list index info */
-        if(NULL == (wb = H5WB_wrap(lst_buf, sizeof(lst_buf))))
-            HGOTO_ERROR(H5E_SOHM, H5E_CANTINIT, FAIL, "can't wrap buffer")
-
-        /* Get a pointer to a buffer that's large enough for serialized list index */
-        if(NULL == (buf = (uint8_t *)H5WB_actual(wb, list->header->list_size)))
-            HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, FAIL, "can't get actual buffer")
-
-        /* Get temporary pointer to buffer for serialized list index */
-        p = buf;
-
-        /* Encode magic number */
-        HDmemcpy(p, H5SM_LIST_MAGIC, (size_t)H5_SIZEOF_MAGIC);
-        p += H5_SIZEOF_MAGIC;
-
-        /* Write messages from the messages array to disk */
-        mesgs_written = 0;
-        ctx.sizeof_addr = H5F_SIZEOF_ADDR(f);
-        for(x = 0; x < list->header->list_max && mesgs_written < list->header->num_messages; x++) {
-            if(list->messages[x].location != H5SM_NO_LOC) {
-                if(H5SM_message_encode(p, &(list->messages[x]), &ctx) < 0)
-                    HGOTO_ERROR(H5E_SOHM, H5E_CANTFLUSH, FAIL, "unable to write shared message to disk")
-
-                p += H5SM_SOHM_ENTRY_SIZE(f);
-                ++mesgs_written;
-            } /* end if */
-        } /* end for */
-        HDassert(mesgs_written == list->header->num_messages);
-
-        /* Compute checksum on buffer */
-        computed_chksum = H5_checksum_metadata(buf, (size_t)(p - buf), 0);
-        UINT32ENCODE(p, computed_chksum);
-#ifdef H5_CLEAR_MEMORY
-HDmemset(p, 0, (list->header->list_size - (size_t)(p - buf)));
-#endif /* H5_CLEAR_MEMORY */
-
-        /* Write the list to disk */
-        HDassert((size_t)(p - buf) <= list->header->list_size);
-	if(H5F_block_write(f, H5FD_MEM_SOHM_INDEX, addr, list->header->list_size, dxpl_id, buf) < 0)
-	    HGOTO_ERROR(H5E_SOHM, H5E_CANTFLUSH, FAIL, "unable to save sohm table to disk")
-
-        list->cache_info.is_dirty = FALSE;
-    } /* end if */
+    *image_len = list->header->list_size;
 
-    if(destroy)
-        if(H5SM_list_dest(f, list) < 0)
-	    HGOTO_ERROR(H5E_SOHM, H5E_CANTFREE, FAIL, "unable to destroy list")
-
-done:
-    /* Release resources */
-    if(wb && H5WB_unwrap(wb) < 0)
-        HDONE_ERROR(H5E_SOHM, H5E_CLOSEERROR, FAIL, "can't close wrapped buffer")
+    FUNC_LEAVE_NOAPI(SUCCEED)
+} /* end H5SM__cache_list_image_len() */
 
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5SM_list_flush() */
+/**************************************/
+/* no H5SM_cache_list_pre_serialize() */
+/**************************************/
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5SM_list_dest
+ * Function:    H5SM__cache_list_serialize
  *
- * Purpose:	Frees all memory used by the list.
+ * Purpose:	Serialize the contents of the supplied shared message list, and
+ *		load this data into the supplied buffer.
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	James Laird
- *		November 6, 2006
+ * Programmer:  John Mainzer
+ *              7/28/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5SM_list_dest(H5F_t *f, H5SM_list_t* list)
+H5SM__cache_list_serialize(const H5F_t *f, void *_image, size_t len,
+    void *_thing)
 {
-    herr_t ret_value = SUCCEED;         /* Return value */
+    H5SM_list_t *list = (H5SM_list_t *)_thing ;   /* Instance being serialized */
+    H5SM_bt2_ctx_t ctx;         /* Message encoding context */
+    uint8_t *image = (uint8_t *)_image;         /* Pointer into raw data buffer */
+    uint32_t computed_chksum;   /* Computed metadata checksum value */
+    size_t mesgs_serialized;    /* Number of messages serialized */
+    size_t u;                   /* Local index variable */
+    herr_t       ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /* Sanity check */
+    /* Check arguments */
+    HDassert(f);
+    HDassert(image);
     HDassert(list);
+    HDassert(list->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert(list->cache_info.type == H5AC_SOHM_LIST);
     HDassert(list->header);
-    HDassert(list->messages);
+    HDassert(list->header->list_size == len);
+
+    /* Encode magic number */
+    HDmemcpy(image, H5SM_LIST_MAGIC, (size_t)H5_SIZEOF_MAGIC);
+    image += H5_SIZEOF_MAGIC;
+
+    /* serialize messages from the messages array */
+    mesgs_serialized = 0;
+    ctx.sizeof_addr = H5F_SIZEOF_ADDR(f);
+    for(u = 0; ((u < list->header->list_max) && (mesgs_serialized < list->header->num_messages)); u++) {
+        if(list->messages[u].location != H5SM_NO_LOC) {
+            if(H5SM__message_encode(image, &(list->messages[u]), &ctx) < 0)
+                HGOTO_ERROR(H5E_SOHM, H5E_CANTFLUSH, FAIL, "unable to serialize shared message")
+
+            image += H5SM_SOHM_ENTRY_SIZE(f);
+            ++mesgs_serialized;
+        } /* end if */
+    } /* end for */
 
-    /* If we're going to free the space on disk, the address must be valid */
-    HDassert(!list->cache_info.free_file_space_on_destroy || H5F_addr_defined(list->cache_info.addr));
+    HDassert(mesgs_serialized == list->header->num_messages);
 
-    /* Check for freeing file space for shared message index list */
-    if(list->cache_info.free_file_space_on_destroy) {
-        /* Release the space on disk */
-        /* (XXX: Nasty usage of internal DXPL value! -QAK) */
-        if(H5MF_xfree(f, H5FD_MEM_SOHM_INDEX, H5AC_dxpl_id, list->cache_info.addr, (hsize_t)list->header->list_size) < 0)
-            HGOTO_ERROR(H5E_SOHM, H5E_NOSPACE, FAIL, "unable to free shared message list")
-    } /* end if */
+    /* Compute checksum on buffer */
+    computed_chksum = H5_checksum_metadata(_image, (size_t)(image - (uint8_t *)_image), 0);
+    UINT32ENCODE(image, computed_chksum);
 
-    /* Destroy Shared Object Header Message list */
-    if(H5SM_list_free(list) < 0)
-        HGOTO_ERROR(H5E_SOHM, H5E_CANTRELEASE, FAIL, "unable to free shared message list")
+    /* sanity check */
+    HDassert((size_t)(image - (uint8_t *)_image) <= list->header->list_size);
+
+#ifdef H5_CLEAR_MEMORY
+    HDmemset(image, 0, (list->header->list_size - (size_t)(image - (uint8_t *)_image)));
+#endif /* H5_CLEAR_MEMORY */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5SM_list_dest() */
+} /* end H5SM__cache_list_serialize() */
+
+/****************************************/
+/* no H5SM_cache_list_notify() function */
+/****************************************/
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5SM_list_clear
+ * Function:    H5SM__cache_list_free_icr
+ *
+ * Purpose:	Free all memory used by the list.
  *
- * Purpose:	Marks a list as not dirty.
+ * Note:	The metadata cache sets the object's cache_info.magic to
+ *		H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC before calling a free_icr
+ *		callback (checked in assert).
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
  *
- * Programmer:	James Laird
- *		November 6, 2006
+ * Programmer:  John Mainzer
+ *              7/28/14
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5SM_list_clear(H5F_t *f, H5SM_list_t *list, hbool_t destroy)
+H5SM__cache_list_free_icr(void *_thing)
 {
-    herr_t ret_value = SUCCEED;         /* Return value */
+    H5SM_list_t *list = (H5SM_list_t *)_thing;  /* Shared message list to release */
+    herr_t       ret_value = SUCCEED;    /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
-    /*
-     * Check arguments.
-     */
+    /* Check arguments */
     HDassert(list);
+    HDassert(list->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC);
+    HDassert(list->cache_info.type == H5AC_SOHM_LIST);
 
-    /* Reset the dirty flag.  */
-    list->cache_info.is_dirty = FALSE;
-
-    if(destroy)
-        if(H5SM_list_dest(f, list) < 0)
-	    HGOTO_ERROR(H5E_SOHM, H5E_CANTFREE, FAIL, "unable to destroy SOHM list")
+    /* Destroy Shared Object Header Message list */
+    if(H5SM_list_free(list) < 0)
+        HGOTO_ERROR(H5E_SOHM, H5E_CANTRELEASE, FAIL, "unable to free shared message list")
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end of H5SM_list_clear() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5SM_list_size
- *
- * Purpose:	Gets the size of a list on disk.
- *
- * Return:	Non-negative on success/Negative on failure
- *
- * Programmer:	James Laird
- *		November 6, 2006
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5SM_list_size(const H5F_t H5_ATTR_UNUSED *f, const H5SM_list_t *list, size_t *size_ptr)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    /* check arguments */
-    HDassert(f);
-    HDassert(list);
-    HDassert(list->header);
-    HDassert(size_ptr);
-
-    /* Set size value */
-    *size_ptr = list->header->list_size;
-
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5SM_list_size() */
+} /* end H5O_cache_list_free_icr() */
 
diff --git a/src/H5SMmessage.c b/src/H5SMmessage.c
index 6965fd7..426ea20 100644
--- a/src/H5SMmessage.c
+++ b/src/H5SMmessage.c
@@ -17,8 +17,8 @@
 /* Module Setup */
 /****************/
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg 	  */
-#define H5SM_PACKAGE		/*suppress error about including H5SMpkg	  */
+#define H5O_FRIEND		/*suppress error about including H5Opkg	  */
+#include "H5SMmodule.h"         /* This source code file is part of the H5SM module */
 
 
 /***********/
@@ -74,7 +74,7 @@ static herr_t H5SM_compare_iter_op(H5O_t *oh, H5O_mesg_t *mesg, unsigned sequenc
 /*-------------------------------------------------------------------------
  * Function:	H5SM_compare_cb
  *
- * Purpose:	Callback for H5HF_op, used in H5SM_message_compare below.
+ * Purpose:	Callback for H5HF_op, used in H5SM__message_compare below.
  *              Determines whether the search key passed in in _UDATA is
  *              equal to OBJ or not.
  *
@@ -121,10 +121,6 @@ H5SM_compare_cb(const void *obj, size_t obj_len, void *_udata)
  * Programmer:	James Laird
  *              Wednesday, February 7, 2007
  *
- * Modifications:
- *      Vailin Choi; September 2011
- *      Change "oh_modified" from boolean to unsigned
- *      (See H5Oprivate.h for possible flags)
  *-------------------------------------------------------------------------
  */
 static herr_t
@@ -174,7 +170,7 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5SM_message_compare
+ * Function:	H5SM__message_compare
  *
  * Purpose:	Determine whether the search key rec1 represents a shared
  *              message that is equal to rec2 or not, and if not, whether
@@ -190,13 +186,13 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5SM_message_compare(const void *rec1, const void *rec2)
+H5SM__message_compare(const void *rec1, const void *rec2)
 {
     const H5SM_mesg_key_t *key = (const H5SM_mesg_key_t *) rec1;
     const H5SM_sohm_t *mesg = (const H5SM_sohm_t *) rec2;
     herr_t ret_value = 0;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_PACKAGE_NOERR
 
     /* If the key has an fheap ID, we're looking for a message that's
      * already in the index; if the fheap ID matches, we've found the message
@@ -273,11 +269,11 @@ H5SM_message_compare(const void *rec1, const void *rec2)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5SM_message_compare */
+} /* end H5SM__message_compare */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5SM_message_encode
+ * Function:	H5SM__message_encode
  *
  * Purpose:	Serialize a H5SM_sohm_t struct into a buffer RAW.
  *
@@ -290,12 +286,12 @@ done:
  *-------------------------------------------------------------------------
  */
 herr_t
-H5SM_message_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
+H5SM__message_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
 {
     H5SM_bt2_ctx_t *ctx = (H5SM_bt2_ctx_t *)_ctx;       /* Callback context structure */
     const H5SM_sohm_t *message = (const H5SM_sohm_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_PACKAGE_NOERR
 
     /* Sanity check */
     HDassert(ctx);
@@ -317,11 +313,11 @@ H5SM_message_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
     } /* end else */
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5SM_message_encode */
+} /* end H5SM__message_encode */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5SM_message_decode
+ * Function:	H5SM__message_decode
  *
  * Purpose:	Read an encoded SOHM message from RAW into an H5SM_sohm_t struct.
  *
@@ -334,12 +330,12 @@ H5SM_message_encode(uint8_t *raw, const void *_nrecord, void *_ctx)
  *-------------------------------------------------------------------------
  */
 herr_t
-H5SM_message_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
+H5SM__message_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
 {
     H5SM_bt2_ctx_t *ctx = (H5SM_bt2_ctx_t *)_ctx;       /* Callback context structure */
     H5SM_sohm_t *message = (H5SM_sohm_t *)_nrecord;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_PACKAGE_NOERR
 
     message->location = (H5SM_storage_loc_t)*raw++;
     UINT32DECODE(raw, message->hash);
@@ -358,5 +354,5 @@ H5SM_message_decode(const uint8_t *raw, void *_nrecord, void *_ctx)
     } /* end else */
 
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5SM_message_decode */
+} /* end H5SM__message_decode */
 
diff --git a/src/H5SMmodule.h b/src/H5SMmodule.h
new file mode 100644
index 0000000..b6991b6
--- /dev/null
+++ b/src/H5SMmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5SM package.  Including this header means that the source file
+ *		is part of the H5SM package.
+ */
+#ifndef _H5SMmodule_H
+#define _H5SMmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5SM_MODULE
+#define H5_MY_PKG       H5SM
+#define H5_MY_PKG_ERR   H5E_SOHM
+#define H5_MY_PKG_INIT  NO
+
+#endif /* _H5SMmodule_H */
+
diff --git a/src/H5SMpkg.h b/src/H5SMpkg.h
index 68dc484..f072741 100644
--- a/src/H5SMpkg.h
+++ b/src/H5SMpkg.h
@@ -21,7 +21,7 @@
  *              the H5SM shared object header messages package.  Source files
  *              outside the H5SM package should	include H5SMprivate.h instead.
  */
-#ifndef H5SM_PACKAGE
+#if !(defined H5SM_FRIEND || defined H5SM_MODULE)
 #error "Do not include this file outside the H5SM package!"
 #endif
 
@@ -268,9 +268,9 @@ H5_DLLVAR const H5B2_class_t H5SM_INDEX[1];
 H5_DLL ssize_t H5SM_get_index(const H5SM_master_table_t *table, unsigned type_id);
 
 /* Encode and decode routines, used for B-tree and cache encoding/decoding */
-H5_DLL herr_t H5SM_message_compare(const void *rec1, const void *rec2);
-H5_DLL herr_t H5SM_message_encode(uint8_t *raw, const void *native, void *ctx);
-H5_DLL herr_t H5SM_message_decode(const uint8_t *raw, void *native, void *ctx);
+H5_DLL herr_t H5SM__message_compare(const void *rec1, const void *rec2);
+H5_DLL herr_t H5SM__message_encode(uint8_t *raw, const void *native, void *ctx);
+H5_DLL herr_t H5SM__message_decode(const uint8_t *raw, void *native, void *ctx);
 
 /* H5B2_remove_t callback to add messages to a list index */
 H5_DLL herr_t H5SM_bt2_convert_to_list_op(const void * record, void *op_data);
diff --git a/src/H5SMprivate.h b/src/H5SMprivate.h
index dddc0a8..57afacf 100644
--- a/src/H5SMprivate.h
+++ b/src/H5SMprivate.h
@@ -66,7 +66,7 @@ H5_DLL herr_t H5SM_reconstitute(H5O_shared_t *sh_mesg, H5F_t *f,
     unsigned msg_type_id, H5O_fheap_id_t heap_id);
 H5_DLL herr_t H5SM_get_refcount(H5F_t *f, hid_t dxpl_id, unsigned type_id,
     const H5O_shared_t *sh_mesg, hsize_t *ref_count);
-H5_DLL herr_t H5SM_ih_size(H5F_t *f, hid_t dxpl_id, H5F_info_t *bh_info);
+H5_DLL herr_t H5SM_ih_size(H5F_t *f, hid_t dxpl_id, hsize_t *hdr_size, H5_ih_info_t *ih_info);
 
 
 /* Debugging routines */
@@ -74,7 +74,7 @@ H5_DLL herr_t H5SM_table_debug(H5F_t *f, hid_t dxpl_id, haddr_t table_addr,
     FILE *stream, int indent, int fwidth, unsigned table_vers,
     unsigned num_indexes);
 H5_DLL herr_t H5SM_list_debug(H5F_t *f, hid_t dxpl_id, haddr_t list_addr,
-    FILE *stream, int indent, int fwidth, unsigned list_vers, size_t num_messages);
+    FILE *stream, int indent, int fwidth, haddr_t table_addr);
 
 #endif /*_H5SMprivate_H*/
 
diff --git a/src/H5SMtest.c b/src/H5SMtest.c
index d10f8a2..798203d 100644
--- a/src/H5SMtest.c
+++ b/src/H5SMtest.c
@@ -17,7 +17,7 @@
 /* Module Setup */
 /****************/
 
-#define H5SM_PACKAGE		/*suppress error about including H5SMpkg	  */
+#include "H5SMmodule.h"         /* This source code file is part of the H5SM module */
 #define H5SM_TESTING		/*suppress warning about H5SM testing funcs*/
 
 
@@ -82,7 +82,7 @@ H5SM_get_mesg_count_test(H5F_t *f, hid_t dxpl_id, unsigned type_id,
     H5SM_master_table_t *table = NULL;  /* SOHM master table */
     herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, H5AC__SOHM_TAG, FAIL)
 
     /* Sanity check */
     HDassert(f);
@@ -98,7 +98,7 @@ H5SM_get_mesg_count_test(H5F_t *f, hid_t dxpl_id, unsigned type_id,
         cache_udata.f = f;
 
         /* Look up the master SOHM table */
-        if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC_READ)))
+        if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), &cache_udata, H5AC__READ_ONLY_FLAG)))
             HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table")
 
         /* Find the correct index for this message type */
@@ -118,6 +118,6 @@ done:
     if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, H5F_SOHM_ADDR(f), table, H5AC__NO_FLAGS_SET) < 0)
 	HDONE_ERROR(H5E_SOHM, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table")
 
-    FUNC_LEAVE_NOAPI(ret_value)
+    FUNC_LEAVE_NOAPI_TAG(ret_value, FAIL)
 } /* end H5SM_get_mesg_count_test() */
 
diff --git a/src/H5Sall.c b/src/H5Sall.c
index 2d2e5fb..fb6b45f 100644
--- a/src/H5Sall.c
+++ b/src/H5Sall.c
@@ -20,7 +20,7 @@
  * Purpose:	"All" selection data space I/O functions.
  */
 
-#define H5S_PACKAGE		/*suppress error about including H5Spkg	  */
+#include "H5Smodule.h"          /* This source code file is part of the H5S module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -39,10 +39,12 @@ static herr_t H5S_all_get_seq_list(const H5S_t *space, unsigned flags,
 static herr_t H5S_all_release(H5S_t *space);
 static htri_t H5S_all_is_valid(const H5S_t *space);
 static hssize_t H5S_all_serial_size(const H5S_t *space);
-static herr_t H5S_all_serialize(const H5S_t *space, uint8_t *buf);
-static herr_t H5S_all_deserialize(H5S_t *space, const uint8_t *buf);
+static herr_t H5S_all_serialize(const H5S_t *space, uint8_t **p);
+static herr_t H5S_all_deserialize(H5S_t *space, uint32_t version, uint8_t flags,
+    const uint8_t **p);
 static herr_t H5S_all_bounds(const H5S_t *space, hsize_t *start, hsize_t *end);
 static herr_t H5S_all_offset(const H5S_t *space, hsize_t *off);
+static int H5S__all_unlim_dim(const H5S_t *space);
 static htri_t H5S_all_is_contiguous(const H5S_t *space);
 static htri_t H5S_all_is_single(const H5S_t *space);
 static htri_t H5S_all_is_regular(const H5S_t *space);
@@ -74,6 +76,8 @@ const H5S_select_class_t H5S_sel_all[1] = {{
     H5S_all_deserialize,
     H5S_all_bounds,
     H5S_all_offset,
+    H5S__all_unlim_dim,
+    NULL,
     H5S_all_is_contiguous,
     H5S_all_is_single,
     H5S_all_is_regular,
@@ -496,9 +500,11 @@ H5S_all_serial_size (const H5S_t H5_ATTR_UNUSED *space)
  PURPOSE
     Serialize the current selection into a user-provided buffer.
  USAGE
-    herr_t H5S_all_serialize(space, buf)
-        H5S_t *space;           IN: Dataspace pointer of selection to serialize
-        uint8 *buf;             OUT: Buffer to put serialized selection into
+    herr_t H5S_all_serialize(space, p)
+        const H5S_t *space;     IN: Dataspace with selection to serialize
+        uint8_t **p;            OUT: Pointer to buffer to put serialized
+                                selection.  Will be advanced to end of
+                                serialized selection.
  RETURNS
     Non-negative on success/Negative on failure
  DESCRIPTION
@@ -510,17 +516,25 @@ H5S_all_serial_size (const H5S_t H5_ATTR_UNUSED *space)
  REVISION LOG
 --------------------------------------------------------------------------*/
 static herr_t
-H5S_all_serialize (const H5S_t *space, uint8_t *buf)
+H5S_all_serialize(const H5S_t *space, uint8_t **p)
 {
+    uint8_t *pp = (*p);         /* Local pointer for decoding */
+
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
+    /* Check args */
     HDassert(space);
+    HDassert(p);
+    HDassert(pp);
 
     /* Store the preamble information */
-    UINT32ENCODE(buf, (uint32_t)H5S_GET_SELECT_TYPE(space));  /* Store the type of selection */
-    UINT32ENCODE(buf, (uint32_t)1);  /* Store the version number */
-    UINT32ENCODE(buf, (uint32_t)0);  /* Store the un-used padding */
-    UINT32ENCODE(buf, (uint32_t)0);  /* Store the additional information length */
+    UINT32ENCODE(pp, (uint32_t)H5S_GET_SELECT_TYPE(space));  /* Store the type of selection */
+    UINT32ENCODE(pp, (uint32_t)1);  /* Store the version number */
+    UINT32ENCODE(pp, (uint32_t)0);  /* Store the un-used padding */
+    UINT32ENCODE(pp, (uint32_t)0);  /* Store the additional information length */
+
+    /* Update encoding pointer */
+    *p = pp;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
 }   /* H5S_all_serialize() */
@@ -532,9 +546,14 @@ H5S_all_serialize (const H5S_t *space, uint8_t *buf)
  PURPOSE
     Deserialize the current selection from a user-provided buffer.
  USAGE
-    herr_t H5S_all_deserialize(space, buf)
-        H5S_t *space;           IN/OUT: Dataspace pointer to place selection into
-        uint8 *buf;             IN: Buffer to retrieve serialized selection from
+    herr_t H5S_all_deserialize(space, p)
+        H5S_t *space;           IN/OUT: Dataspace pointer to place
+                                selection into
+        uint32_t version        IN: Selection version
+        uint8_t flags           IN: Selection flags
+        uint8 **p;              OUT: Pointer to buffer holding serialized
+                                selection.  Will be advanced to end of
+                                serialized selection.
  RETURNS
     Non-negative on success/Negative on failure
  DESCRIPTION
@@ -546,16 +565,19 @@ H5S_all_serialize (const H5S_t *space, uint8_t *buf)
  REVISION LOG
 --------------------------------------------------------------------------*/
 static herr_t
-H5S_all_deserialize(H5S_t *space, const uint8_t H5_ATTR_UNUSED *buf)
+H5S_all_deserialize(H5S_t *space, uint32_t H5_ATTR_UNUSED version, uint8_t H5_ATTR_UNUSED flags,
+        const uint8_t H5_ATTR_UNUSED **p)
 {
-    herr_t ret_value;   /* return value */
+    herr_t ret_value = SUCCEED;   /* return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
     HDassert(space);
+    HDassert(p);
+    HDassert(*p);
 
     /* Change to "all" selection */
-    if((ret_value = H5S_select_all(space, TRUE)) < 0)
+    if(H5S_select_all(space, TRUE) < 0)
         HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
 
 done:
@@ -650,6 +672,36 @@ H5S_all_offset(const H5S_t H5_ATTR_UNUSED *space, hsize_t *offset)
 

 /*--------------------------------------------------------------------------
  NAME
+    H5S__all_unlim_dim
+ PURPOSE
+    Return unlimited dimension of selection, or -1 if none
+ USAGE
+    int H5S__all_unlim_dim(space)
+        H5S_t *space;           IN: Dataspace pointer to check
+ RETURNS
+    Unlimited dimension of selection, or -1 if none (never fails).
+ DESCRIPTION
+    Returns the index of the unlimited dimension in this selection, or -1
+    if the selection has no unlimited dimension.  "All" selections are
+    always unlimited in every dimension, though this is not reflected in
+    other calls, where the selection is "clipped" against the current
+    extent, so for consistency this function always returns -1.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static int
+H5S__all_unlim_dim(const H5S_t H5_ATTR_UNUSED *space)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    FUNC_LEAVE_NOAPI(-1)
+} /* end H5S__all_unlim_dim() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
     H5S_all_is_contiguous
  PURPOSE
     Check if a "all" selection is contiguous within the dataspace extent.
@@ -967,6 +1019,7 @@ H5S_all_get_seq_list(const H5S_t H5_ATTR_UNUSED *space, unsigned H5_ATTR_UNUSED
     /* Determine the actual number of elements to use */
     H5_CHECK_OVERFLOW(iter->elmt_left,hsize_t,size_t);
     elem_used=MIN(maxelem,(size_t)iter->elmt_left);
+    HDassert(elem_used > 0);
 
     /* Compute the offset in the dataset */
     off[0]=iter->u.all.byte_offset;
diff --git a/src/H5Sdbg.c b/src/H5Sdbg.c
index 0cbe4f2..b69604c 100644
--- a/src/H5Sdbg.c
+++ b/src/H5Sdbg.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5S_PACKAGE		/*suppress error about including H5Spkg	  */
+#include "H5Smodule.h"          /* This source code file is part of the H5S module */
 
 
 /***********/
diff --git a/src/H5Shyper.c b/src/H5Shyper.c
index cde58e6..fe013a7 100644
--- a/src/H5Shyper.c
+++ b/src/H5Shyper.c
@@ -20,7 +20,7 @@
  * Purpose:	Hyperslab selection data space I/O functions.
  */
 
-#define H5S_PACKAGE		/*suppress error about including H5Spkg	  */
+#include "H5Smodule.h"          /* This source code file is part of the H5S module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -45,6 +45,10 @@ static herr_t H5S_hyper_generate_spans(H5S_t *space);
 #ifdef NEW_HYPERSLAB_API
 static herr_t H5S_select_select (H5S_t *space1, H5S_seloper_t op, H5S_t *space2);
 #endif /*NEW_HYPERSLAB_API*/
+static void H5S__hyper_get_clip_diminfo(hsize_t start, hsize_t stride,
+    hsize_t *count, hsize_t *block, hsize_t clip_size);
+static hsize_t H5S__hyper_get_clip_extent_real(const H5S_t *clip_space,
+    hsize_t num_slices, hbool_t incl_trail);
 
 /* Selection callbacks */
 static herr_t H5S_hyper_copy(H5S_t *dst, const H5S_t *src, hbool_t share_selection);
@@ -54,10 +58,14 @@ static herr_t H5S_hyper_get_seq_list(const H5S_t *space, unsigned flags,
 static herr_t H5S_hyper_release(H5S_t *space);
 static htri_t H5S_hyper_is_valid(const H5S_t *space);
 static hssize_t H5S_hyper_serial_size(const H5S_t *space);
-static herr_t H5S_hyper_serialize(const H5S_t *space, uint8_t *buf);
-static herr_t H5S_hyper_deserialize(H5S_t *space, const uint8_t *buf);
+static herr_t H5S_hyper_serialize(const H5S_t *space, uint8_t **p);
+static herr_t H5S_hyper_deserialize(H5S_t *space, uint32_t version, uint8_t flags,
+    const uint8_t **p);
 static herr_t H5S_hyper_bounds(const H5S_t *space, hsize_t *start, hsize_t *end);
 static herr_t H5S_hyper_offset(const H5S_t *space, hsize_t *offset);
+static int H5S__hyper_unlim_dim(const H5S_t *space);
+static herr_t H5S_hyper_num_elem_non_unlim(const H5S_t *space,
+    hsize_t *num_elem_non_unlim);
 static htri_t H5S_hyper_is_contiguous(const H5S_t *space);
 static htri_t H5S_hyper_is_single(const H5S_t *space);
 static htri_t H5S_hyper_is_regular(const H5S_t *space);
@@ -94,6 +102,8 @@ const H5S_select_class_t H5S_sel_hyper[1] = {{
     H5S_hyper_deserialize,
     H5S_hyper_bounds,
     H5S_hyper_offset,
+    H5S__hyper_unlim_dim,
+    H5S_hyper_num_elem_non_unlim,
     H5S_hyper_is_contiguous,
     H5S_hyper_is_single,
     H5S_hyper_is_regular,
@@ -248,6 +258,7 @@ H5S_hyper_iter_init(H5S_sel_iter_t *iter, const H5S_t *space)
     /* Check args */
     HDassert(space && H5S_SEL_HYPERSLABS == H5S_GET_SELECT_TYPE(space));
     HDassert(iter);
+    HDassert(space->select.sel_info.hslab->unlim_dim < 0);
 
     /* Initialize the number of points to iterate over */
     iter->elmt_left = space->select.num_elem;
@@ -1093,7 +1104,7 @@ H5S_hyper_iter_release (H5S_sel_iter_t *iter)
 static H5S_hyper_span_t *
 H5S_hyper_new_span(hsize_t low, hsize_t high, H5S_hyper_span_info_t *down, H5S_hyper_span_t *next)
 {
-    H5S_hyper_span_t *ret_value;
+    H5S_hyper_span_t *ret_value = NULL;         /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1288,7 +1299,7 @@ H5S_hyper_copy_span_helper (H5S_hyper_span_info_t *spans)
     H5S_hyper_span_t *new_span;     /* Temporary hyperslab span */
     H5S_hyper_span_t *prev_span;    /* Previous hyperslab span */
     H5S_hyper_span_info_t *new_down;    /* New down span tree */
-    H5S_hyper_span_info_t *ret_value;
+    H5S_hyper_span_info_t *ret_value = NULL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1374,7 +1385,7 @@ done:
 static H5S_hyper_span_info_t *
 H5S_hyper_copy_span(H5S_hyper_span_info_t *spans)
 {
-    H5S_hyper_span_info_t *ret_value;
+    H5S_hyper_span_info_t *ret_value = NULL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1644,6 +1655,8 @@ H5S_hyper_copy (H5S_t *dst, const H5S_t *src, hbool_t share_selection)
             dst_hslab->app_diminfo[u]=src_hslab->app_diminfo[u];
         } /* end for */
     } /* end if */
+    dst_hslab->unlim_dim = src_hslab->unlim_dim;
+    dst_hslab->num_elem_non_unlim = src_hslab->num_elem_non_unlim;
     dst->select.sel_info.hslab->span_lst=src->select.sel_info.hslab->span_lst;
 
     /* Check if there is hyperslab span information to copy */
@@ -1753,12 +1766,16 @@ static htri_t
 H5S_hyper_is_valid (const H5S_t *space)
 {
     unsigned u;                    /* Counter */
-    htri_t ret_value=TRUE;      /* return value */
+    htri_t ret_value = TRUE;      /* return value */
 
-    FUNC_ENTER_NOAPI_NOERR
+    FUNC_ENTER_NOAPI(FAIL)
 
     HDassert(space);
 
+    /* Check for unlimited selection */
+    if(space->select.sel_info.hslab->unlim_dim >= 0)
+        HGOTO_DONE(FALSE)
+
     /* Check for a "regular" hyperslab selection */
     if(space->select.sel_info.hslab->diminfo_valid) {
         const H5S_hyper_dim_t *diminfo=space->select.sel_info.hslab->opt_diminfo; /* local alias for diminfo */
@@ -1858,11 +1875,12 @@ H5S_hyper_span_nblocks(H5S_hyper_span_info_t *spans)
 static hsize_t
 H5S_get_select_hyper_nblocks(H5S_t *space)
 {
-    hsize_t ret_value;         /* return value */
+    hsize_t ret_value = 0;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
     HDassert(space);
+    HDassert(space->select.sel_info.hslab->unlim_dim < 0);
 
     /* Check for a "regular" hyperslab selection */
     if(space->select.sel_info.hslab->diminfo_valid) {
@@ -1910,6 +1928,8 @@ H5Sget_select_hyper_nblocks(hid_t spaceid)
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
     if(H5S_GET_SELECT_TYPE(space) != H5S_SEL_HYPERSLABS)
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a hyperslab selection")
+    if(space->select.sel_info.hslab->unlim_dim >= 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "cannot get number of blocks for unlimited selection")
 
     ret_value = (hssize_t)H5S_get_select_hyper_nblocks(space);
 
@@ -1940,32 +1960,49 @@ done:
 static hssize_t
 H5S_hyper_serial_size(const H5S_t *space)
 {
-    unsigned u;                 /* Counter */
     hsize_t block_count;       /* block counter for regular hyperslabs */
-    hssize_t ret_value;         /* return value */
+    unsigned u;                /* Counter */
+    hssize_t ret_value = -1;   /* return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
     HDassert(space);
 
-    /* Basic number of bytes required to serialize hyperslab selection:
-     *  <type (4 bytes)> + <version (4 bytes)> + <padding (4 bytes)> +
-     *      <length (4 bytes)> + <rank (4 bytes)> + <# of blocks (4 bytes)> = 24 bytes
-     */
-    ret_value = 24;
+    /* Check for version (right now, an unlimited dimension is the only thing
+     * that would bump the version) */
+    if(space->select.sel_info.hslab->unlim_dim >= 0)
+        /* Version 2 */
+        /* Size required is always:
+         * <type (4 bytes)> + <version (4 bytes)> + <flags (1 byte)> +
+         * <length (4 bytes)> + <rank (4 bytes)> +
+         * (4 (start/stride/count/block) * <rank> * <value (8 bytes)>) =
+         * 17 + (4 * rank * 8) bytes
+         */
+        ret_value = (hssize_t)17 + ((hssize_t)4 * (hssize_t)space->extent.rank
+                * (hssize_t)8);
+    else {
+        /* Version 1 */
+        /* Basic number of bytes required to serialize hyperslab selection:
+         * <type (4 bytes)> + <version (4 bytes)> + <padding (4 bytes)> +
+         * <length (4 bytes)> + <rank (4 bytes)> + <# of blocks (4 bytes)>
+         * = 24 bytes
+         */
+        ret_value = 24;
 
-    /* Check for a "regular" hyperslab selection */
-    if(space->select.sel_info.hslab->diminfo_valid) {
-        /* Check each dimension */
-        for(block_count = 1, u = 0; u < space->extent.rank; u++)
-            block_count *= space->select.sel_info.hslab->opt_diminfo[u].count;
-    } /* end if */
-    else
-        /* Spin through hyperslab spans, adding 8 * rank bytes for each block */
-        block_count = H5S_hyper_span_nblocks(space->select.sel_info.hslab->span_lst);
+        /* Check for a "regular" hyperslab selection */
+        if(space->select.sel_info.hslab->diminfo_valid) {
+            /* Check each dimension */
+            for(block_count = 1, u = 0; u < space->extent.rank; u++)
+                block_count *= space->select.sel_info.hslab->opt_diminfo[u].count;
+        } /* end if */
+        else
+            /* Spin through hyperslab spans, adding 8 * rank bytes for each
+             * block */
+            block_count = H5S_hyper_span_nblocks(space->select.sel_info.hslab->span_lst);
 
-    H5_CHECK_OVERFLOW((8 * space->extent.rank * block_count), hsize_t, hssize_t);
-    ret_value += (hssize_t)(8 * block_count * space->extent.rank);
+        H5_CHECK_OVERFLOW((8 * space->extent.rank * block_count), hsize_t, hssize_t);
+        ret_value += (hssize_t)(8 * block_count * space->extent.rank);
+    } /* end else */
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5S_hyper_serial_size() */
@@ -1977,14 +2014,14 @@ H5S_hyper_serial_size(const H5S_t *space)
  PURPOSE
     Serialize the current selection into a user-provided buffer.
  USAGE
-    herr_t H5S_hyper_serialize_helper(spans, start, end, rank, buf)
+    void H5S_hyper_serialize_helper(spans, start, end, rank, buf)
         H5S_hyper_span_info_t *spans;   IN: Hyperslab span tree to serialize
         hssize_t start[];       IN/OUT: Accumulated start points
         hssize_t end[];         IN/OUT: Accumulated end points
         hsize_t rank;           IN: Current rank looking at
         uint8 *buf;             OUT: Buffer to put serialized selection into
  RETURNS
-    Non-negative on success/Negative on failure
+    <none>
  DESCRIPTION
     Serializes the current element selection into a buffer.  (Primarily for
     storing on disk).
@@ -1993,21 +2030,22 @@ H5S_hyper_serial_size(const H5S_t *space)
  EXAMPLES
  REVISION LOG
 --------------------------------------------------------------------------*/
-static herr_t
-H5S_hyper_serialize_helper (const H5S_hyper_span_info_t *spans, hsize_t *start, hsize_t *end, hsize_t rank, uint8_t **buf)
+static void
+H5S_hyper_serialize_helper(const H5S_hyper_span_info_t *spans,
+        hsize_t *start, hsize_t *end, hsize_t rank, uint8_t **p)
 {
     H5S_hyper_span_t *curr;     /* Pointer to current hyperslab span */
+    uint8_t *pp = (*p);         /* Local pointer for decoding */
     hsize_t u;                  /* Index variable */
-    herr_t ret_value=SUCCEED;  /* return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
 
     /* Sanity checks */
     HDassert(spans);
     HDassert(start);
     HDassert(end);
     HDassert(rank < H5O_LAYOUT_NDIMS);
-    HDassert(buf && *buf);
+    HDassert(p && pp);
 
     /* Walk through the list of spans, recursing or outputing them */
     curr=spans->head;
@@ -2019,33 +2057,34 @@ H5S_hyper_serialize_helper (const H5S_hyper_span_info_t *spans, hsize_t *start,
             end[rank]=curr->high;
 
             /* Recurse down to the next dimension */
-            if(H5S_hyper_serialize_helper(curr->down,start,end,rank+1,buf)<0)
-                HGOTO_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "failed to release hyperslab spans")
+            H5S_hyper_serialize_helper(curr->down, start, end, rank + 1, &pp);
         } /* end if */
         else {
             /* Encode all the previous dimensions starting & ending points */
 
             /* Encode previous starting points */
             for(u=0; u<rank; u++)
-                UINT32ENCODE(*buf, (uint32_t)start[u]);
+                UINT32ENCODE(pp, (uint32_t)start[u]);
 
             /* Encode starting point for this span */
-            UINT32ENCODE(*buf, (uint32_t)curr->low);
+            UINT32ENCODE(pp, (uint32_t)curr->low);
 
             /* Encode previous ending points */
             for(u=0; u<rank; u++)
-                UINT32ENCODE(*buf, (uint32_t)end[u]);
+                UINT32ENCODE(pp, (uint32_t)end[u]);
 
             /* Encode starting point for this span */
-            UINT32ENCODE(*buf, (uint32_t)curr->high);
+            UINT32ENCODE(pp, (uint32_t)curr->high);
         } /* end else */
 
         /* Advance to next node */
         curr=curr->next;
     } /* end while */
 
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
+    /* Update encoding pointer */
+    *p = pp;
+
+    FUNC_LEAVE_NOAPI_VOID
 }   /* H5S_hyper_serialize_helper() */
 
 

@@ -2055,9 +2094,11 @@ done:
  PURPOSE
     Serialize the current selection into a user-provided buffer.
  USAGE
-    herr_t H5S_hyper_serialize(space, buf)
-        H5S_t *space;           IN: Dataspace pointer of selection to serialize
-        uint8 *buf;             OUT: Buffer to put serialized selection into
+    herr_t H5S_hyper_serialize(space, p)
+        const H5S_t *space;     IN: Dataspace with selection to serialize
+        uint8_t **p;            OUT: Pointer to buffer to put serialized
+                                selection.  Will be advanced to end of
+                                serialized selection.
  RETURNS
     Non-negative on success/Negative on failure
  DESCRIPTION
@@ -2069,9 +2110,10 @@ done:
  REVISION LOG
 --------------------------------------------------------------------------*/
 static herr_t
-H5S_hyper_serialize (const H5S_t *space, uint8_t *buf)
+H5S_hyper_serialize(const H5S_t *space, uint8_t **p)
 {
     const H5S_hyper_dim_t *diminfo;         /* Alias for dataspace's diminfo information */
+    uint8_t *pp = (*p);                     /* Local pointer for decoding */
     hsize_t tmp_count[H5O_LAYOUT_NDIMS];    /* Temporary hyperslab counts */
     hsize_t offset[H5O_LAYOUT_NDIMS];      /* Offset of element in dataspace */
     hsize_t start[H5O_LAYOUT_NDIMS];   /* Location of start of hyperslab */
@@ -2079,6 +2121,8 @@ H5S_hyper_serialize (const H5S_t *space, uint8_t *buf)
     hsize_t temp_off;            /* Offset in a given dimension */
     uint8_t *lenp;          /* pointer to length location for later storage */
     uint32_t len = 0;       /* number of bytes used */
+    uint32_t version;       /* Version number */
+    uint8_t flags = 0;      /* Flags for message */
     hsize_t block_count;    /* block counter for regular hyperslabs */
     unsigned fast_dim;      /* Rank of the fastest changing dimension for the dataspace */
     unsigned ndims;         /* Rank of the dataspace */
@@ -2087,20 +2131,48 @@ H5S_hyper_serialize (const H5S_t *space, uint8_t *buf)
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
     HDassert(space);
+    HDassert(p);
+    HDassert(pp);
+
+    /* Calculate version */
+    if(space->select.sel_info.hslab->unlim_dim >= 0) {
+        version = 2;
+        flags |= H5S_SELECT_FLAG_UNLIM;
+    } /* end if */
+    else
+        version = 1;
 
     /* Store the preamble information */
-    UINT32ENCODE(buf, (uint32_t)H5S_GET_SELECT_TYPE(space));  /* Store the type of selection */
-    UINT32ENCODE(buf, (uint32_t)1);  /* Store the version number */
-    UINT32ENCODE(buf, (uint32_t)0);  /* Store the un-used padding */
-    lenp = buf;           /* keep the pointer to the length location for later */
-    buf += 4;             /* skip over space for length */
+    UINT32ENCODE(pp, (uint32_t)H5S_GET_SELECT_TYPE(space)); /* Store the type of selection */
+    UINT32ENCODE(pp, version); /* Store the version number */
+    if(version >= 2)
+        *(pp)++ = flags; /* Store the flags */
+    else
+        UINT32ENCODE(pp, (uint32_t)0); /* Store the un-used padding */
+    lenp = pp;           /* keep the pointer to the length location for later */
+    pp += 4;             /* skip over space for length */
 
     /* Encode number of dimensions */
-    UINT32ENCODE(buf, (uint32_t)space->extent.rank);
+    UINT32ENCODE(pp, (uint32_t)space->extent.rank);
     len += 4;
 
+    /* If there is an unlimited dimension, only encode opt_unlim_diminfo */
+    if(flags & H5S_SELECT_FLAG_UNLIM) {
+        unsigned i;
+
+        HDassert(H5S_UNLIMITED == HSIZE_UNDEF);
+
+        /* Iterate over dimensions */
+        for(i = 0; i < space->extent.rank; i++) {
+            /* Encode start/stride/block/count */
+            UINT64ENCODE(pp, space->select.sel_info.hslab->opt_diminfo[i].start);
+            UINT64ENCODE(pp, space->select.sel_info.hslab->opt_diminfo[i].stride);
+            UINT64ENCODE(pp, space->select.sel_info.hslab->opt_diminfo[i].count);
+            UINT64ENCODE(pp, space->select.sel_info.hslab->opt_diminfo[i].block);
+        } /* end for */
+    } /* end if */
     /* Check for a "regular" hyperslab selection */
-    if(space->select.sel_info.hslab->diminfo_valid) {
+    else if(space->select.sel_info.hslab->diminfo_valid) {
         unsigned u;     /* Local counting variable */
 
         /* Set some convienence values */
@@ -2114,7 +2186,7 @@ H5S_hyper_serialize (const H5S_t *space, uint8_t *buf)
 
         /* Encode number of hyperslabs */
         H5_CHECK_OVERFLOW(block_count, hsize_t, uint32_t);
-        UINT32ENCODE(buf, (uint32_t)block_count);
+        UINT32ENCODE(pp, (uint32_t)block_count);
         len+=4;
 
         /* Now serialize the information for the regular hyperslab */
@@ -2137,11 +2209,11 @@ H5S_hyper_serialize (const H5S_t *space, uint8_t *buf)
 
                 /* Encode hyperslab starting location */
                 for(u = 0; u < ndims; u++)
-                    UINT32ENCODE(buf, (uint32_t)offset[u]);
+                    UINT32ENCODE(pp, (uint32_t)offset[u]);
 
                 /* Encode hyperslab ending location */
                 for(u = 0; u < ndims; u++)
-                    UINT32ENCODE(buf, (uint32_t)(offset[u] + (diminfo[u].block - 1)));
+                    UINT32ENCODE(pp, (uint32_t)(offset[u] + (diminfo[u].block - 1)));
 
                 /* Move the offset to the next sequence to start */
                 offset[fast_dim]+=diminfo[fast_dim].stride;
@@ -2192,20 +2264,23 @@ H5S_hyper_serialize (const H5S_t *space, uint8_t *buf)
         /* Encode number of hyperslabs */
         block_count = H5S_hyper_span_nblocks(space->select.sel_info.hslab->span_lst);
         H5_CHECK_OVERFLOW(block_count, hsize_t, uint32_t);
-        UINT32ENCODE(buf, (uint32_t)block_count);
+        UINT32ENCODE(pp, (uint32_t)block_count);
         len+=4;
 
         /* Add 8 bytes times the rank for each hyperslab selected */
         H5_CHECK_OVERFLOW((8 * space->extent.rank * block_count), hsize_t, size_t);
-        len += (size_t)(8 * space->extent.rank * block_count);
+        len += (uint32_t)(8 * space->extent.rank * block_count);
 
         /* Encode each hyperslab in selection */
-        H5S_hyper_serialize_helper(space->select.sel_info.hslab->span_lst, start, end, (hsize_t)0, &buf);
+        H5S_hyper_serialize_helper(space->select.sel_info.hslab->span_lst, start, end, (hsize_t)0, &pp);
     } /* end else */
 
     /* Encode length */
     UINT32ENCODE(lenp, (uint32_t)len);  /* Store the length of the extra information */
 
+    /* Update encoding pointer */
+    *p = pp;
+
     FUNC_LEAVE_NOAPI(SUCCEED)
 }   /* H5S_hyper_serialize() */
 
@@ -2216,9 +2291,14 @@ H5S_hyper_serialize (const H5S_t *space, uint8_t *buf)
  PURPOSE
     Deserialize the current selection from a user-provided buffer.
  USAGE
-    herr_t H5S_hyper_deserialize(space, buf)
-        H5S_t *space;           IN/OUT: Dataspace pointer to place selection into
-        uint8 *buf;             IN: Buffer to retrieve serialized selection from
+    herr_t H5S_hyper_deserialize(space, p)
+        H5S_t *space;           IN/OUT: Dataspace pointer to place
+                                selection into
+        uint32_t version        IN: Selection version
+        uint8_t flags           IN: Selection flags
+        uint8 **p;              OUT: Pointer to buffer holding serialized
+                                selection.  Will be advanced to end of
+                                serialized selection.
  RETURNS
     Non-negative on success/Negative on failure
  DESCRIPTION
@@ -2230,9 +2310,11 @@ H5S_hyper_serialize (const H5S_t *space, uint8_t *buf)
  REVISION LOG
 --------------------------------------------------------------------------*/
 static herr_t
-H5S_hyper_deserialize (H5S_t *space, const uint8_t *buf)
+H5S_hyper_deserialize(H5S_t *space, uint32_t H5_ATTR_UNUSED version, uint8_t flags,
+    const uint8_t **p)
 {
-    uint32_t rank;           	/* rank of points */
+    unsigned rank;           	/* rank of points */
+    const uint8_t *pp = (*p);   /* Local pointer for decoding */
     size_t num_elem=0;      	/* number of elements in selection */
     hsize_t start[H5O_LAYOUT_NDIMS];	/* hyperslab start information */
     hsize_t end[H5O_LAYOUT_NDIMS];	/* hyperslab end information */
@@ -2251,39 +2333,63 @@ H5S_hyper_deserialize (H5S_t *space, const uint8_t *buf)
 
     /* Check args */
     HDassert(space);
-    HDassert(buf);
+    HDassert(p);
+    HDassert(pp);
 
     /* Deserialize slabs to select */
-    buf+=16;    /* Skip over selection header */
-    UINT32DECODE(buf,rank);  /* decode the rank of the point selection */
-    if(rank!=space->extent.rank)
-        HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "rank of pointer does not match dataspace")
-    UINT32DECODE(buf,num_elem);  /* decode the number of points */
-
-    /* Set the count & stride for all blocks */
-    for(tcount=count,tstride=stride,j=0; j<rank; j++,tstride++,tcount++) {
-        *tcount=1;
-        *tstride=1;
-    } /* end for */
+    /* (The header and rank have already beed decoded) */
+    rank = space->extent.rank;  /* Retrieve rank from space */
+
+    /* If there is an unlimited dimension, only encode opt_unlim_diminfo */
+    if(flags & H5S_SELECT_FLAG_UNLIM) {
+        HDassert(H5S_UNLIMITED == HSIZE_UNDEF);
+        HDassert(version >= 2);
+
+        /* Iterate over dimensions */
+        for(i = 0; i < space->extent.rank; i++) {
+            /* Decode start/stride/block/count */
+            UINT64DECODE(pp, start[i]);
+            UINT64DECODE(pp, stride[i]);
+            UINT64DECODE(pp, count[i]);
+            UINT64DECODE(pp, block[i]);
+        } /* end for */
+
+        /* Select the hyperslab to the current selection */
+        if((ret_value = H5S_select_hyperslab(space, H5S_SELECT_SET, start, stride, count, block)) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
+    } /* end if */
+    else {
+        /* decode the number of points */
+        UINT32DECODE(pp,num_elem);
 
-    /* Retrieve the coordinates from the buffer */
-    for(i=0; i<num_elem; i++) {
-        /* Decode the starting points */
-        for(tstart=start,j=0; j<rank; j++,tstart++)
-            UINT32DECODE(buf, *tstart);
+        /* Set the count & stride for all blocks */
+        for(tcount = count, tstride = stride, j = 0; j < rank; j++, tstride++, tcount++) {
+            *tcount=1;
+            *tstride=1;
+        } /* end for */
 
-        /* Decode the ending points */
-        for(tend=end,j=0; j<rank; j++,tend++)
-            UINT32DECODE(buf, *tend);
+        /* Retrieve the coordinates from the buffer */
+        for(i = 0; i < num_elem; i++) {
+            /* Decode the starting points */
+            for(tstart=start,j=0; j<rank; j++,tstart++)
+                UINT32DECODE(pp, *tstart);
 
-        /* Change the ending points into blocks */
-        for(tblock=block,tstart=start,tend=end,j=0; j<(unsigned)rank; j++,tstart++,tend++,tblock++)
-            *tblock=(*tend-*tstart)+1;
+            /* Decode the ending points */
+            for(tend = end, j = 0; j < rank; j++, tend++)
+                UINT32DECODE(pp, *tend);
 
-        /* Select or add the hyperslab to the current selection */
-        if((ret_value=H5S_select_hyperslab(space,(i==0 ? H5S_SELECT_SET : H5S_SELECT_OR),start,stride,count,block))<0)
-            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
-    } /* end for */
+            /* Change the ending points into blocks */
+            for(tblock=block,tstart=start,tend=end,j=0; j<rank; j++,tstart++,tend++,tblock++)
+                *tblock=(*tend-*tstart)+1;
+
+            /* Select or add the hyperslab to the current selection */
+            if((ret_value=H5S_select_hyperslab(space,(i==0 ? H5S_SELECT_SET : H5S_SELECT_OR),start,stride,count,block))<0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
+        } /* end for */
+    } /* end else */
+
+    /* Update decoding pointer */
+    *p = pp;
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -2433,6 +2539,7 @@ H5S_get_select_hyper_blocklist(H5S_t *space, hbool_t internal, hsize_t startbloc
 
     HDassert(space);
     HDassert(buf);
+    HDassert(space->select.sel_info.hslab->unlim_dim < 0);
 
     /* Check for a "regular" hyperslab selection */
     if(space->select.sel_info.hslab->diminfo_valid) {
@@ -2456,11 +2563,19 @@ H5S_get_select_hyper_blocklist(H5S_t *space, hbool_t internal, hsize_t startbloc
              */
             diminfo = space->select.sel_info.hslab->opt_diminfo;
         else
-            /*
-             * Use the "application dimension information" to pass back to the user
-             * the blocks they set, not the optimized, internal information.
-             */
-            diminfo = space->select.sel_info.hslab->app_diminfo;
+            if(space->select.sel_info.hslab->unlim_dim >= 0)
+                /*
+                 * There is an unlimited dimension so we must use opt_diminfo as
+                 * it has been "clipped" to the current extent.
+                 */
+                diminfo = space->select.sel_info.hslab->opt_diminfo;
+            else
+                /*
+                 * Use the "application dimension information" to pass back to
+                 * the user the blocks they set, not the optimized, internal
+                 * information.
+                 */
+                diminfo = space->select.sel_info.hslab->app_diminfo;
 
         /* Build the tables of count sizes as well as the initial offset */
         for(u = 0; u < ndims; u++) {
@@ -2597,6 +2712,8 @@ H5Sget_select_hyper_blocklist(hid_t spaceid, hsize_t startblock,
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
     if(H5S_GET_SELECT_TYPE(space)!=H5S_SEL_HYPERSLABS)
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a hyperslab selection")
+    if(space->select.sel_info.hslab->unlim_dim >= 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "cannot get blocklist for unlimited selection")
 
     /* Go get the correct number of blocks */
     if(numblocks > 0)
@@ -2739,7 +2856,10 @@ H5S_hyper_bounds(const H5S_t *space, hsize_t *start, hsize_t *end)
             start[i] = diminfo[i].start + (hsize_t)space->select.offset[i];
 
             /* Compute the largest location in this dimension */
-            end[i] = diminfo[i].start + diminfo[i].stride * (diminfo[i].count - 1) + (diminfo[i].block - 1) + (hsize_t)space->select.offset[i];
+            if((int)i == space->select.sel_info.hslab->unlim_dim)
+                end[i] = H5S_UNLIMITED;
+            else
+                end[i] = diminfo[i].start + diminfo[i].stride * (diminfo[i].count - 1) + (diminfo[i].block - 1) + (hsize_t)space->select.offset[i];
         } /* end for */
     } /* end if */
     else {
@@ -2862,6 +2982,75 @@ done:
 

 /*--------------------------------------------------------------------------
  NAME
+    H5S__hyper_unlim_dim
+ PURPOSE
+    Return unlimited dimension of selection, or -1 if none
+ USAGE
+    int H5S__hyper_unlim_dim(space)
+        H5S_t *space;           IN: Dataspace pointer to check
+ RETURNS
+    Unlimited dimension of selection, or -1 if none (never fails).
+ DESCRIPTION
+    Returns the index of the unlimited dimension of the selection, or -1
+    if the selection has no unlimited dimension.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static int
+H5S__hyper_unlim_dim(const H5S_t *space)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    FUNC_LEAVE_NOAPI(space->select.sel_info.hslab->unlim_dim);
+} /* end H5S__hyper_unlim_dim() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_num_elem_non_unlim
+ PURPOSE
+    Return number of elements in the non-unlimited dimensions
+ USAGE
+    herr_t H5S_hyper_num_elem_non_unlim(space,num_elem_non_unlim)
+        H5S_t *space;           IN: Dataspace pointer to check
+        hsize_t *num_elem_non_unlim; OUT: Number of elements in the non-unlimited dimensions
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Returns the number of elements in a slice through the non-unlimited
+    dimensions of the selection.  Fails if the selection has no unlimited
+    dimension.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static herr_t
+H5S_hyper_num_elem_non_unlim(const H5S_t *space, hsize_t *num_elem_non_unlim)
+{
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(space);
+    HDassert(num_elem_non_unlim);
+
+    /* Get number of elements in the non-unlimited dimensions */
+    if(space->select.sel_info.hslab->unlim_dim >= 0)
+        *num_elem_non_unlim = space->select.sel_info.hslab->num_elem_non_unlim;
+    else
+        HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, "selection has no unlimited dimension")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_hyper_num_elem_non_unlim() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
     H5S_hyper_is_contiguous
  PURPOSE
     Check if a hyperslab selection is contiguous within the dataspace extent.
@@ -2886,7 +3075,7 @@ H5S_hyper_is_contiguous(const H5S_t *space)
     unsigned u;                     /* index variable */
     htri_t ret_value = FALSE;       /* Return value */
 
-    FUNC_ENTER_NOAPI_NOERR
+    FUNC_ENTER_NOAPI(FAIL)
 
     HDassert(space);
 
@@ -3041,6 +3230,7 @@ H5S_hyper_is_contiguous(const H5S_t *space)
             ret_value=TRUE;
     } /* end else */
 
+done:
     FUNC_LEAVE_NOAPI(ret_value)
 }   /* H5S_hyper_is_contiguous() */
 
@@ -3071,7 +3261,7 @@ H5S_hyper_is_single(const H5S_t *space)
     unsigned u;                     /* index variable */
     htri_t ret_value=TRUE;         /* return value */
 
-    FUNC_ENTER_NOAPI_NOERR
+    FUNC_ENTER_NOAPI(FAIL)
 
     HDassert(space);
 
@@ -3136,7 +3326,7 @@ done:
 static htri_t
 H5S_hyper_is_regular(const H5S_t *space)
 {
-    htri_t ret_value;  /* return value */
+    htri_t ret_value = FAIL;    /* return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -3189,13 +3379,15 @@ H5S_hyper_release(H5S_t *space)
     space->select.num_elem = 0;
 
     /* Release irregular hyperslab information */
-    if(space->select.sel_info.hslab->span_lst != NULL) {
-        if(H5S_hyper_free_span_info(space->select.sel_info.hslab->span_lst) < 0)
-            HGOTO_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "failed to release hyperslab spans")
-    } /* end if */
+    if(space->select.sel_info.hslab) {
+        if(space->select.sel_info.hslab->span_lst != NULL) {
+            if(H5S_hyper_free_span_info(space->select.sel_info.hslab->span_lst) < 0)
+                HGOTO_ERROR(H5E_INTERNAL, H5E_CANTFREE, FAIL, "failed to release hyperslab spans")
+        } /* end if */
 
-    /* Release space for the hyperslab selection information */
-    space->select.sel_info.hslab = H5FL_FREE(H5S_hyper_sel_t, space->select.sel_info.hslab);
+        /* Release space for the hyperslab selection information */
+        space->select.sel_info.hslab = H5FL_FREE(H5S_hyper_sel_t, space->select.sel_info.hslab);
+    } /* end if */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -3570,6 +3762,9 @@ H5S_hyper_add_span_element(H5S_t *space, unsigned rank, hsize_t *coords)
         /* Reset "regular" hyperslab flag */
         space->select.sel_info.hslab->diminfo_valid = FALSE;
 
+        /* Set unlim_dim */
+        space->select.sel_info.hslab->unlim_dim = -1;
+
         /* Set # of elements in selection */
         space->select.num_elem = 1;
     } /* end if */
@@ -4279,6 +4474,9 @@ H5S_hyper_project_simple(const H5S_t *base_space, H5S_t *new_space, hsize_t *off
     if(NULL == (new_space->select.sel_info.hslab = H5FL_MALLOC(H5S_hyper_sel_t)))
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab info")
 
+    /* Set unlim_dim */
+    new_space->select.sel_info.hslab->unlim_dim = -1;
+
     /* Check for a "regular" hyperslab selection */
     if(base_space->select.sel_info.hslab->diminfo_valid) {
         unsigned base_space_dim;    /* Current dimension in the base dataspace */
@@ -4829,7 +5027,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
 
                     /* Merge/add span 'a' with/to a_not_b list */
                     if(H5S_hyper_append_span(&last_a_not_b,a_not_b,span_a->low,span_a->high,span_a->down,NULL)==FAIL)
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
 
                     /* Advance span 'a', leave span 'b' */
                     H5S_hyper_recover_span(&recover_a,&span_a,span_a->next);
@@ -4844,7 +5042,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
 
                     /* Merge/add lower part of span 'a' with/to a_not_b list */
                     if(H5S_hyper_append_span(&last_a_not_b,a_not_b,span_a->low,span_b->low-1,span_a->down,NULL)==FAIL)
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
 
                     /* Check for overlaps between upper part of span 'a' and lower part of span 'b' */
 
@@ -4855,7 +5053,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
                     if(span_a->down==NULL) {
                         /* Merge/add overlapped part with/to a_and_b list */
                         if(H5S_hyper_append_span(&last_a_and_b,a_and_b,span_b->low,span_a->high,NULL,NULL)==FAIL)
-                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
                     } /* end if */
                     /* If there are down spans, check for the overlap in them and add to each appropriate list */
                     else {
@@ -4872,7 +5070,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
                         if(down_a_not_b!=NULL) {
                             /* Merge/add overlapped part with/to a_not_b list */
                             if(H5S_hyper_append_span(&last_a_not_b,a_not_b,span_b->low,span_a->high,down_a_not_b,NULL)==FAIL)
-                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
 
                             /* Release the down span tree generated */
                             H5S_hyper_free_span_info(down_a_not_b);
@@ -4882,7 +5080,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
                         if(down_a_and_b!=NULL) {
                             /* Merge/add overlapped part with/to a_and_b list */
                             if(H5S_hyper_append_span(&last_a_and_b,a_and_b,span_b->low,span_a->high,down_a_and_b,NULL)==FAIL)
-                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
 
                             /* Release the down span tree generated */
                             H5S_hyper_free_span_info(down_a_and_b);
@@ -4892,7 +5090,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
                         if(down_b_not_a!=NULL) {
                             /* Merge/add overlapped part with/to b_not_a list */
                             if(H5S_hyper_append_span(&last_b_not_a,b_not_a,span_b->low,span_a->high,down_b_not_a,NULL)==FAIL)
-                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
 
                             /* Release the down span tree generated */
                             H5S_hyper_free_span_info(down_b_not_a);
@@ -4931,7 +5129,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
 
                     /* Merge/add lower part of span 'a' with/to a_not_b list */
                     if(H5S_hyper_append_span(&last_a_not_b,a_not_b,span_a->low,span_b->low-1,span_a->down,NULL)==FAIL)
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
 
                     /* Check for overlaps between middle part of span 'a' and span 'b' */
 
@@ -4942,7 +5140,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
                     if(span_a->down==NULL) {
                         /* Merge/add overlapped part with/to a_and_b list */
                         if(H5S_hyper_append_span(&last_a_and_b,a_and_b,span_b->low,span_b->high,NULL,NULL)==FAIL)
-                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
                     } /* end if */
                     /* If there are down spans, check for the overlap in them and add to each appropriate list */
                     else {
@@ -4959,7 +5157,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
                         if(down_a_not_b!=NULL) {
                             /* Merge/add overlapped part with/to a_not_b list */
                             if(H5S_hyper_append_span(&last_a_not_b,a_not_b,span_b->low,span_b->high,down_a_not_b,NULL)==FAIL)
-                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
 
                             /* Release the down span tree generated */
                             H5S_hyper_free_span_info(down_a_not_b);
@@ -4969,7 +5167,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
                         if(down_a_and_b!=NULL) {
                             /* Merge/add overlapped part with/to a_and_b list */
                             if(H5S_hyper_append_span(&last_a_and_b,a_and_b,span_b->low,span_b->high,down_a_and_b,NULL)==FAIL)
-                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
 
                             /* Release the down span tree generated */
                             H5S_hyper_free_span_info(down_a_and_b);
@@ -4979,7 +5177,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
                         if(down_b_not_a!=NULL) {
                             /* Merge/add overlapped part with/to b_not_a list */
                             if(H5S_hyper_append_span(&last_b_not_a,b_not_a,span_b->low,span_b->high,down_b_not_a,NULL)==FAIL)
-                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
 
                             /* Release the down span tree generated */
                             H5S_hyper_free_span_info(down_b_not_a);
@@ -5010,7 +5208,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
                     if(span_a->low>span_b->low) {
                         /* Merge/add lower part of span 'b' with/to b_not_a list */
                         if(H5S_hyper_append_span(&last_b_not_a,b_not_a,span_b->low,span_a->low-1,span_b->down,NULL)==FAIL)
-                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
                     } /* end if */
                     else {
                         /* Keep going, nothing to split off */
@@ -5025,7 +5223,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
                     if(span_a->down==NULL) {
                         /* Merge/add overlapped part with/to a_and_b list */
                         if(H5S_hyper_append_span(&last_a_and_b,a_and_b,span_a->low,span_a->high,NULL,NULL)==FAIL)
-                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
                     } /* end if */
                     /* If there are down spans, check for the overlap in them and add to each appropriate list */
                     else {
@@ -5042,7 +5240,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
                         if(down_a_not_b!=NULL) {
                             /* Merge/add overlapped part with/to a_not_b list */
                             if(H5S_hyper_append_span(&last_a_not_b,a_not_b,span_a->low,span_a->high,down_a_not_b,NULL)==FAIL)
-                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
 
                             /* Release the down span tree generated */
                             H5S_hyper_free_span_info(down_a_not_b);
@@ -5052,7 +5250,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
                         if(down_a_and_b!=NULL) {
                             /* Merge/add overlapped part with/to a_and_b list */
                             if(H5S_hyper_append_span(&last_a_and_b,a_and_b,span_a->low,span_a->high,down_a_and_b,NULL)==FAIL)
-                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
 
                             /* Release the down span tree generated */
                             H5S_hyper_free_span_info(down_a_and_b);
@@ -5062,7 +5260,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
                         if(down_b_not_a!=NULL) {
                             /* Merge/add overlapped part with/to b_not_a list */
                             if(H5S_hyper_append_span(&last_b_not_a,b_not_a,span_a->low,span_a->high,down_b_not_a,NULL)==FAIL)
-                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
 
                             /* Release the down span tree generated */
                             H5S_hyper_free_span_info(down_b_not_a);
@@ -5102,7 +5300,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
 
                         /* Merge/add lower part of span 'b' with/to b_not_a list */
                         if(H5S_hyper_append_span(&last_b_not_a,b_not_a,span_b->low,span_a->low-1,span_b->down,NULL)==FAIL)
-                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
                     } /* end if */
                     else {
                         /* Keep going, nothing to split off */
@@ -5117,7 +5315,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
                     if(span_a->down==NULL) {
                         /* Merge/add overlapped part with/to a_and_b list */
                         if(H5S_hyper_append_span(&last_a_and_b,a_and_b,span_a->low,span_b->high,NULL,NULL)==FAIL)
-                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
                     } /* end if */
                     /* If there are down spans, check for the overlap in them and add to each appropriate list */
                     else {
@@ -5134,7 +5332,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
                         if(down_a_not_b!=NULL) {
                             /* Merge/add overlapped part with/to a_not_b list */
                             if(H5S_hyper_append_span(&last_a_not_b,a_not_b,span_a->low,span_b->high,down_a_not_b,NULL)==FAIL)
-                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
 
                             /* Release the down span tree generated */
                             H5S_hyper_free_span_info(down_a_not_b);
@@ -5144,7 +5342,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
                         if(down_a_and_b!=NULL) {
                             /* Merge/add overlapped part with/to a_and_b list */
                             if(H5S_hyper_append_span(&last_a_and_b,a_and_b,span_a->low,span_b->high,down_a_and_b,NULL)==FAIL)
-                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
 
                             /* Release the down span tree generated */
                             H5S_hyper_free_span_info(down_a_and_b);
@@ -5154,7 +5352,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
                         if(down_b_not_a!=NULL) {
                             /* Merge/add overlapped part with/to b_not_a list */
                             if(H5S_hyper_append_span(&last_b_not_a,b_not_a,span_a->low,span_b->high,down_b_not_a,NULL)==FAIL)
-                                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
 
                             /* Release the down span tree generated */
                             H5S_hyper_free_span_info(down_b_not_a);
@@ -5183,7 +5381,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
 
                     /* Merge/add span 'b' with/to b_not_a list */
                     if(H5S_hyper_append_span(&last_b_not_a,b_not_a,span_b->low,span_b->high,span_b->down,NULL)==FAIL)
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
 
                     /* Advance span 'b', leave span 'a' */
                     H5S_hyper_recover_span(&recover_b,&span_b,span_b->next);
@@ -5197,7 +5395,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
 
                     /* Merge/add span 'a' with/to a_not_b list */
                     if(H5S_hyper_append_span(&last_a_not_b,a_not_b,span_a->low,span_a->high,span_a->down,NULL)==FAIL)
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
 
                     /* Advance to the next 'a' span */
                     H5S_hyper_recover_span(&recover_a,&span_a,span_a->next);
@@ -5210,7 +5408,7 @@ H5S_hyper_clip_spans (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_info_t *b_s
 
                     /* Merge/add span 'b' with/to b_not_a list */
                     if(H5S_hyper_append_span(&last_b_not_a,b_not_a,span_b->low,span_b->high,span_b->down,NULL)==FAIL)
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab span")
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
 
                     /* Advance to the next 'b' span */
                     H5S_hyper_recover_span(&recover_b,&span_b,span_b->next);
@@ -5255,7 +5453,7 @@ H5S_hyper_merge_spans_helper (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_inf
     H5S_hyper_span_t *span_b;           /* Pointer to current span 'b' working on */
     H5S_hyper_span_t *prev_span_merge;  /* Pointer to previous merged span */
     unsigned recover_a, recover_b;         /* Flags to indicate when to recover temporary spans */
-    H5S_hyper_span_info_t *ret_value;
+    H5S_hyper_span_info_t *ret_value = NULL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -5292,7 +5490,7 @@ H5S_hyper_merge_spans_helper (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_inf
             if(span_a->high<span_b->low) {
                 /* Merge/add span 'a' with/to the merged spans */
                 if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_a->low,span_a->high,span_a->down,NULL)==FAIL)
-                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, NULL, "can't allocate hyperslab span")
 
                 /* Advance span 'a' */
                 H5S_hyper_recover_span(&recover_a,&span_a,span_a->next);
@@ -5307,19 +5505,19 @@ H5S_hyper_merge_spans_helper (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_inf
                 if(H5S_hyper_cmp_spans(span_a->down,span_b->down)==TRUE) {
                     /* Merge/add copy of span 'a' with/to merged spans */
                     if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_a->low,span_a->high,span_a->down,NULL)==FAIL)
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, NULL, "can't allocate hyperslab span")
                 } /* end if */
                 else {
                     /* Merge/add lower part of span 'a' with/to merged spans */
                     if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_a->low,span_b->low-1,span_a->down,NULL)==FAIL)
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, NULL, "can't allocate hyperslab span")
 
                     /* Get merged span tree for overlapped section */
                     tmp_spans=H5S_hyper_merge_spans_helper(span_a->down,span_b->down);
 
                     /* Merge/add overlapped section to merged spans */
                     if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_b->low,span_a->high,tmp_spans,NULL)==FAIL)
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, NULL, "can't allocate hyperslab span")
 
                     /* Release merged span tree for overlapped section */
                     H5S_hyper_free_span_info(tmp_spans);
@@ -5356,19 +5554,19 @@ H5S_hyper_merge_spans_helper (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_inf
                 if(H5S_hyper_cmp_spans(span_a->down,span_b->down)==TRUE) {
                     /* Merge/add copy of lower & middle parts of span 'a' to merged spans */
                     if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_a->low,span_b->high,span_a->down,NULL)==FAIL)
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, NULL, "can't allocate hyperslab span")
                 } /* end if */
                 else {
                     /* Merge/add lower part of span 'a' to merged spans */
                     if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_a->low,span_b->low-1,span_a->down,NULL)==FAIL)
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, NULL, "can't allocate hyperslab span")
 
                     /* Get merged span tree for overlapped section */
                     tmp_spans=H5S_hyper_merge_spans_helper(span_a->down,span_b->down);
 
                     /* Merge/add overlapped section to merged spans */
                     if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_b->low,span_b->high,tmp_spans,NULL)==FAIL)
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, NULL, "can't allocate hyperslab span")
 
                     /* Release merged span tree for overlapped section */
                     H5S_hyper_free_span_info(tmp_spans);
@@ -5396,14 +5594,14 @@ H5S_hyper_merge_spans_helper (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_inf
                 if(H5S_hyper_cmp_spans(span_a->down,span_b->down)==TRUE) {
                     /* Merge/add copy of lower & middle parts of span 'b' to merged spans */
                     if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_b->low,span_a->high,span_a->down,NULL)==FAIL)
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, NULL, "can't allocate hyperslab span")
                 } /* end if */
                 else {
                     /* Check if there is a lower part of span 'b' */
                     if(span_a->low>span_b->low) {
                         /* Merge/add lower part of span 'b' to merged spans */
                         if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_b->low,span_a->low-1,span_b->down,NULL)==FAIL)
-                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, NULL, "can't allocate hyperslab span")
                     } /* end if */
                     else {
                         /* No lower part of span 'b' , keep going... */
@@ -5414,7 +5612,7 @@ H5S_hyper_merge_spans_helper (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_inf
 
                     /* Merge/add overlapped section to merged spans */
                     if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_a->low,span_a->high,tmp_spans,NULL)==FAIL)
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, NULL, "can't allocate hyperslab span")
 
                     /* Release merged span tree for overlapped section */
                     H5S_hyper_free_span_info(tmp_spans);
@@ -5451,14 +5649,14 @@ H5S_hyper_merge_spans_helper (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_inf
                 if(H5S_hyper_cmp_spans(span_a->down,span_b->down)==TRUE) {
                     /* Merge/add copy of span 'b' to merged spans if so */
                     if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_b->low,span_b->high,span_b->down,NULL)==FAIL)
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, NULL, "can't allocate hyperslab span")
                 } /* end if */
                 else {
                     /* Check if there is a lower part of span 'b' */
                     if(span_a->low>span_b->low) {
                         /* Merge/add lower part of span 'b' to merged spans */
                         if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_b->low,span_a->low-1,span_b->down,NULL)==FAIL)
-                            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, NULL, "can't allocate hyperslab span")
                     } /* end if */
                     else {
                         /* No lower part of span 'b' , keep going... */
@@ -5469,7 +5667,7 @@ H5S_hyper_merge_spans_helper (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_inf
 
                     /* Merge/add overlapped section to merged spans */
                     if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_a->low,span_b->high,tmp_spans,NULL)==FAIL)
-                        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, NULL, "can't allocate hyperslab span")
 
                     /* Release merged span tree for overlapped section */
                     H5S_hyper_free_span_info(tmp_spans);
@@ -5495,7 +5693,7 @@ H5S_hyper_merge_spans_helper (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_inf
             else {
                 /* Merge/add span 'b' with the merged spans */
                 if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_b->low,span_b->high,span_b->down,NULL)==FAIL)
-                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, NULL, "can't allocate hyperslab span")
 
                 /* Advance span 'b' */
                 H5S_hyper_recover_span(&recover_b,&span_b,span_b->next);
@@ -5507,7 +5705,7 @@ H5S_hyper_merge_spans_helper (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_inf
             while(span_a!=NULL) {
                 /* Merge/add all 'a' spans into the merged spans */
                 if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_a->low,span_a->high,span_a->down,NULL)==FAIL)
-                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, NULL, "can't allocate hyperslab span")
 
                 /* Advance to next 'a' span, until all processed */
                 H5S_hyper_recover_span(&recover_a,&span_a,span_a->next);
@@ -5519,7 +5717,7 @@ H5S_hyper_merge_spans_helper (H5S_hyper_span_info_t *a_spans, H5S_hyper_span_inf
             while(span_b!=NULL) {
                 /* Merge/add all 'b' spans into the merged spans */
                 if(H5S_hyper_append_span(&prev_span_merge,&merged_spans,span_b->low,span_b->high,span_b->down,NULL)==FAIL)
-                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab span")
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, NULL, "can't allocate hyperslab span")
 
                 /* Advance to next 'b' span, until all processed */
                 H5S_hyper_recover_span(&recover_b,&span_b,span_b->next);
@@ -5623,7 +5821,7 @@ static hsize_t
 H5S_hyper_spans_nelem (H5S_hyper_span_info_t *spans)
 {
     H5S_hyper_span_t *span;     /* Hyperslab span */
-    hsize_t ret_value;
+    hsize_t ret_value = 0;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -5685,7 +5883,7 @@ H5S_hyper_make_spans(unsigned rank, const hsize_t *start, const hsize_t *stride,
     hsize_t                stride_iter;     /* Iterator over the stride values */
     int                    i;               /* Counters */
     unsigned               u;               /* Counters */
-    H5S_hyper_span_info_t *ret_value;       /* Return value */
+    H5S_hyper_span_info_t *ret_value = NULL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -6025,6 +6223,15 @@ H5S_hyper_generate_spans(H5S_t *space)
 
     /* Get the diminfo */
     for(u=0; u<space->extent.rank; u++) {
+        /* Check for unlimited dimension and return error */
+        /* These should be able to be converted to assertions once everything
+         * that calls this function checks for unlimited selections first
+         * (especially the new hyperslab API)  -NAF */
+        if(space->select.sel_info.hslab->opt_diminfo[u].count == H5S_UNLIMITED)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "can't generate spans with unlimited count")
+        if(space->select.sel_info.hslab->opt_diminfo[u].block == H5S_UNLIMITED)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "can't generate spans with unlimited block")
+
         tmp_start[u]=space->select.sel_info.hslab->opt_diminfo[u].start;
         tmp_stride[u]=space->select.sel_info.hslab->opt_diminfo[u].stride;
         tmp_count[u]=space->select.sel_info.hslab->opt_diminfo[u].count;
@@ -6312,6 +6519,7 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
     const hsize_t *opt_count;       /* Optimized count information */
     const hsize_t *opt_block;       /* Optimized block information */
     unsigned u;                     /* Counters */
+    int unlim_dim = -1;             /* Unlimited dimension in selection, of -1 if none */
     herr_t      ret_value=SUCCEED;       /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
@@ -6330,6 +6538,18 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
     if(block==NULL)
         block = _ones;
 
+    /* Check for unlimited dimension */
+    for(u = 0; u<space->extent.rank; u++)
+        if((count[u] == H5S_UNLIMITED) || (block[u] == H5S_UNLIMITED)) {
+            if(unlim_dim >= 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "cannot have more than one unlimited dimension in selection")
+            else {
+                if(count[u] == block[u] /* == H5S_UNLIMITED */)
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "count and block cannot both be unlimited")
+                unlim_dim = (int)u;
+            } /* end else */
+        } /* end if */
+
     /*
      * Check new selection.
      */
@@ -6378,7 +6598,7 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
         opt_block = int_block;
         for(u=0; u<space->extent.rank; u++) {
             /* contiguous hyperslabs have the block size equal to the stride */
-            if(stride[u]==block[u]) {
+            if((stride[u] == block[u]) && (count[u] != H5S_UNLIMITED)) {
                 int_count[u]=1;
                 int_stride[u]=1;
                 if(block[u]==1)
@@ -6390,7 +6610,8 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
                 if(count[u]==1)
                     int_stride[u]=1;
                 else {
-                    HDassert(stride[u] > block[u]);
+                    HDassert((stride[u] > block[u]) || ((stride[u] == block[u])
+                            && (count[u] == H5S_UNLIMITED)));
                     int_stride[u]=stride[u];
                 } /* end else */
                 int_count[u]=count[u];
@@ -6399,6 +6620,32 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
         } /* end for */
     } /* end else */
 
+    /* Check for operating on unlimited selection */
+    if((H5S_GET_SELECT_TYPE(space) == H5S_SEL_HYPERSLABS)
+            && (space->select.sel_info.hslab->unlim_dim >= 0)
+            && (op != H5S_SELECT_SET))
+            {
+        /* Check for invalid operation */
+        if(unlim_dim >= 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "cannot modify unlimited selection with another unlimited selection")
+        if(!((op == H5S_SELECT_AND) || (op == H5S_SELECT_NOTA)))
+            HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "unsupported operation on unlimited selection")
+        HDassert(space->select.sel_info.hslab->diminfo_valid);
+
+        /* Clip unlimited selection to include new selection */
+        if(H5S_hyper_clip_unlim(space,
+                start[space->select.sel_info.hslab->unlim_dim]
+                + ((opt_count[space->select.sel_info.hslab->unlim_dim]
+                - (hsize_t)1)
+                * opt_stride[space->select.sel_info.hslab->unlim_dim])
+                + opt_block[space->select.sel_info.hslab->unlim_dim]) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCLIP, FAIL, "failed to clip unlimited selection")
+
+        /* If an empty space was returned it must be "none" */
+        HDassert((space->select.num_elem > (hsize_t)0)
+                || (space->select.type->type == H5S_SEL_NONE));
+    } /* end if */
+
     /* Fixup operation for non-hyperslab selections */
     switch(H5S_GET_SELECT_TYPE(space)) {
         case H5S_SEL_NONE:   /* No elements selected in dataspace */
@@ -6518,16 +6765,64 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
             space->select.num_elem *= (opt_count[u] * opt_block[u]);
         } /* end for */
 
+        /* Save unlim_dim */
+        space->select.sel_info.hslab->unlim_dim = unlim_dim;
+
         /* Indicate that the dimension information is valid */
         space->select.sel_info.hslab->diminfo_valid = TRUE;
 
         /* Indicate that there's no slab information */
         space->select.sel_info.hslab->span_lst = NULL;
+
+        /* Handle unlimited selections */
+        if(unlim_dim >= 0) {
+            /* Calculate num_elem_non_unlim */
+            space->select.sel_info.hslab->num_elem_non_unlim = (hsize_t)1;
+            for(u = 0; u < space->extent.rank; u++)
+                if((int)u != unlim_dim)
+                    space->select.sel_info.hslab->num_elem_non_unlim *= (opt_count[u] * opt_block[u]);
+
+            /* Set num_elem */
+            if(space->select.num_elem != (hsize_t)0)
+                space->select.num_elem = H5S_UNLIMITED;
+        } /* end if */
     } /* end if */
     else if(op >= H5S_SELECT_OR && op <= H5S_SELECT_NOTA) {
         /* Sanity check */
         HDassert(H5S_GET_SELECT_TYPE(space) == H5S_SEL_HYPERSLABS);
 
+        /* Handle unlimited selections */
+        if(unlim_dim >= 0) {
+            hsize_t bounds_start[H5S_MAX_RANK];
+            hsize_t bounds_end[H5S_MAX_RANK];
+            hsize_t tmp_count = opt_count[unlim_dim];
+            hsize_t tmp_block = opt_block[unlim_dim];
+
+            /* Check for invalid operation */
+            if(space->select.sel_info.hslab->unlim_dim >= 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "cannot modify unlimited selection with another unlimited selection")
+            if(!((op == H5S_SELECT_AND) || (op == H5S_SELECT_NOTB)))
+                HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "unsupported operation with unlimited selection")
+
+            /* Get bounds of existing selection */
+            if(H5S_hyper_bounds(space, bounds_start, bounds_end) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't get selection bounds")
+
+            /* Patch count and block to remove unlimited and include the
+             * existing selection */
+            H5S__hyper_get_clip_diminfo(start[unlim_dim], opt_stride[unlim_dim], &tmp_count, &tmp_block, bounds_end[unlim_dim] + (hsize_t)1);
+            HDassert((tmp_count == 1) || (opt_count != _ones));
+            HDassert((tmp_block == 1) || (opt_block != _ones));
+            if(opt_count != _ones) {
+                HDassert(opt_count == int_count);
+                int_count[unlim_dim] = tmp_count;
+            } /* end if */
+            if(opt_block != _ones) {
+                HDassert(opt_block == int_block);
+                int_block[unlim_dim] = tmp_block;
+            } /* end if */
+        } /* end if */
+
         /* Check if there's no hyperslab span information currently */
         if(NULL == space->select.sel_info.hslab->span_lst)
             if(H5S_hyper_generate_spans(space) < 0)
@@ -6874,6 +7169,9 @@ H5S_generate_hyperslab (H5S_t *space, H5S_seloper_t op,
         /* Allocate space for the hyperslab selection information */
         if((space->select.sel_info.hslab=H5FL_MALLOC(H5S_hyper_sel_t))==NULL)
             HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab info")
+
+        /* Set unlim_dim */
+        space->select.sel_info.hslab->unlim_dim = -1;
     } /* end if */
 
     /* Combine tmp_space (really space) & new_space, with the result in space */
@@ -6921,6 +7219,7 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
     const hsize_t *opt_count;       /* Optimized count information */
     const hsize_t *opt_block;       /* Optimized block information */
     unsigned u;                    /* Counters */
+    int unlim_dim = -1;             /* Unlimited dimension in selection, of -1 if none */
     herr_t      ret_value=SUCCEED;       /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
@@ -6939,6 +7238,18 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
     if(block==NULL)
         block = _ones;
 
+    /* Check for unlimited dimension */
+    for(u = 0; u<space->extent.rank; u++)
+        if((count[u] == H5S_UNLIMITED) || (block[u] == H5S_UNLIMITED)) {
+            if(unlim_dim >= 0) 
+                HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "cannot have more than one unlimited dimension in selection")
+            else {
+                if(count[u] == block[u] /* == H5S_UNLIMITED */)
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "count and block cannot both be unlimited")
+                unlim_dim = (int)u;
+            } /* end else */
+        } /* end if */
+
     /*
      * Check new selection.
      */
@@ -6983,7 +7294,7 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
         opt_block = int_block;
         for(u=0; u<space->extent.rank; u++) {
             /* contiguous hyperslabs have the block size equal to the stride */
-            if(stride[u]==block[u]) {
+            if((stride[u] == block[u]) && (count[u] != H5S_UNLIMITED)) {
                 int_count[u]=1;
                 int_stride[u]=1;
                 if(block[u]==1)
@@ -6995,7 +7306,8 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
                 if(count[u]==1)
                     int_stride[u]=1;
                 else {
-                    HDassert(stride[u] > block[u]);
+                    HDassert((stride[u] > block[u]) || ((stride[u] == block[u])
+                            && (count[u] == H5S_UNLIMITED)));
                     int_stride[u]=stride[u];
                 } /* end else */
                 int_count[u]=count[u];
@@ -7004,6 +7316,32 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
         } /* end for */
     } /* end else */
 
+    /* Check for operating on unlimited selection */
+    if((H5S_GET_SELECT_TYPE(space) == H5S_SEL_HYPERSLABS)
+            && (space->select.sel_info.hslab->unlim_dim >= 0)
+            && (op != H5S_SELECT_SET))
+            {
+        /* Check for invalid operation */
+        if(unlim_dim >= 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "cannot modify unlimited selection with another unlimited selection")
+        if(!((op == H5S_SELECT_AND) || (op == H5S_SELECT_NOTA)))
+            HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "unsupported operation on unlimited selection")
+        HDassert(space->select.sel_info.hslab->diminfo_valid);
+
+        /* Clip unlimited selection to include new selection */
+        if(H5S_hyper_clip_unlim(space,
+                start[space->select.sel_info.hslab->unlim_dim]
+                + ((opt_count[space->select.sel_info.hslab->unlim_dim]
+                - (hsize_t)1)
+                * opt_stride[space->select.sel_info.hslab->unlim_dim])
+                + opt_block[space->select.sel_info.hslab->unlim_dim]) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCLIP, FAIL, "failed to clip unlimited selection")
+
+        /* If an empty space was returned it must be "none" */
+        HDassert((space->select.num_elem > (hsize_t)0)
+                || (space->select.type->type == H5S_SEL_NONE));
+    } /* end if */
+
     /* Fixup operation for non-hyperslab selections */
     switch(H5S_GET_SELECT_TYPE(space)) {
         case H5S_SEL_NONE:   /* No elements selected in dataspace */
@@ -7095,8 +7433,8 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
             HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't release hyperslab")
 
         /* Allocate space for the hyperslab selection information */
-        if((space->select.sel_info.hslab=H5FL_MALLOC(H5S_hyper_sel_t))==NULL)
-            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab info")
+        if(NULL == (space->select.sel_info.hslab = H5FL_MALLOC(H5S_hyper_sel_t)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab info")
 
         /* Save the diminfo */
         space->select.num_elem=1;
@@ -7114,33 +7452,81 @@ H5S_select_hyperslab (H5S_t *space, H5S_seloper_t op,
             space->select.num_elem*=(opt_count[u]*opt_block[u]);
         } /* end for */
 
+        /* Save unlim_dim */
+        space->select.sel_info.hslab->unlim_dim = unlim_dim;
+
         /* Indicate that the dimension information is valid */
-        space->select.sel_info.hslab->diminfo_valid=TRUE;
+        space->select.sel_info.hslab->diminfo_valid = TRUE;
 
         /* Indicate that there's no slab information */
-        space->select.sel_info.hslab->span_lst=NULL;
+        space->select.sel_info.hslab->span_lst = NULL;
+
+        /* Handle unlimited selections */
+        if(unlim_dim >= 0) {
+            /* Calculate num_elem_non_unlim */
+            space->select.sel_info.hslab->num_elem_non_unlim = (hsize_t)1;
+            for(u = 0; u < space->extent.rank; u++)
+                if((int)u != unlim_dim)
+                    space->select.sel_info.hslab->num_elem_non_unlim *= (opt_count[u] * opt_block[u]);
+
+            /* Set num_elem */
+            if(space->select.num_elem != (hsize_t)0)
+                space->select.num_elem = H5S_UNLIMITED;
+        } /* end if */
     } /* end if */
     else if(op>=H5S_SELECT_OR && op<=H5S_SELECT_NOTA) {
         /* Sanity check */
         HDassert(H5S_GET_SELECT_TYPE(space) == H5S_SEL_HYPERSLABS);
 
+        /* Handle unlimited selections */
+        if(unlim_dim >= 0) {
+            hsize_t bounds_start[H5S_MAX_RANK];
+            hsize_t bounds_end[H5S_MAX_RANK];
+            hsize_t tmp_count = opt_count[unlim_dim];
+            hsize_t tmp_block = opt_block[unlim_dim];
+
+            /* Check for invalid operation */
+            if(space->select.sel_info.hslab->unlim_dim >= 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "cannot modify unlimited selection with another unlimited selection")
+            if(!((op == H5S_SELECT_AND) || (op == H5S_SELECT_NOTB)))
+                HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "unsupported operation with unlimited selection")
+
+            /* Get bounds of existing selection */
+            if(H5S_hyper_bounds(space, bounds_start, bounds_end) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't get selection bounds")
+
+            /* Patch count and block to remove unlimited and include the
+             * existing selection */
+            H5S__hyper_get_clip_diminfo(start[unlim_dim], opt_stride[unlim_dim], &tmp_count, &tmp_block, bounds_end[unlim_dim] + (hsize_t)1);
+            HDassert((tmp_count == 1) || (opt_count != _ones));
+            HDassert((tmp_block == 1) || (opt_block != _ones));
+            if(opt_count != _ones) {
+                HDassert(opt_count == int_count);
+                int_count[unlim_dim] = tmp_count;
+            } /* end if */
+            if(opt_block != _ones) {
+                HDassert(opt_block == int_block);
+                int_block[unlim_dim] = tmp_block;
+            } /* end if */
+        } /* end if */
+
         /* Check if there's no hyperslab span information currently */
-        if(space->select.sel_info.hslab->span_lst==NULL)
-            if(H5S_hyper_generate_spans(space)<0)
+        if(NULL == space->select.sel_info.hslab->span_lst)
+            if(H5S_hyper_generate_spans(space) < 0)
                 HGOTO_ERROR(H5E_DATASPACE, H5E_UNINITIALIZED, FAIL, "dataspace does not have span tree")
 
+        /* Indicate that the regular dimensions are no longer valid */
+        space->select.sel_info.hslab->diminfo_valid = FALSE;
+
         /* Add in the new hyperslab information */
         if(H5S_generate_hyperslab (space, op, start, opt_stride, opt_count, opt_block)<0)
             HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't generate hyperslabs")
-
-        /* Indicate that the regular dimensions are no longer valid */
-        space->select.sel_info.hslab->diminfo_valid=FALSE;
     } /* end if */
     else
         HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "invalid selection operation")
 
     /* Set selection type */
-    space->select.type=H5S_sel_hyper;
+    space->select.type = H5S_sel_hyper;
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -7329,6 +7715,9 @@ H5S_combine_select (H5S_t *space1, H5S_seloper_t op, H5S_t *space2)
     if((new_space->select.sel_info.hslab=H5FL_CALLOC(H5S_hyper_sel_t))==NULL)
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "can't allocate hyperslab info")
 
+    /* Set unlim_dim */
+    new_space->select.sel_info.hslab->unlim_dim = -1;
+
     /* Combine space1 & space2, with the result in new_space */
     if(H5S_operate_hyperslab(new_space,space1->select.sel_info.hslab->span_lst,op,space2->select.sel_info.hslab->span_lst,FALSE,&span2_owned)<0)
         HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCLIP, NULL, "can't clip hyperslab information")
@@ -7458,6 +7847,9 @@ H5S_select_select (H5S_t *space1, H5S_seloper_t op, H5S_t *space2)
     if((space1->select.sel_info.hslab=H5FL_CALLOC(H5S_hyper_sel_t))==NULL)
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab info")
 
+    /* Set unlim_dim */
+    space1->select.sel_info.hslab->unlim_dim = -1;
+
     /* Combine tmp_spans (from space1) & spans from space2, with the result in space1 */
     if(H5S_operate_hyperslab(space1,tmp_spans,op,space2->select.sel_info.hslab->span_lst,FALSE,&span2_owned)<0)
         HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCLIP, FAIL, "can't clip hyperslab information")
@@ -8716,7 +9108,7 @@ H5S_hyper_get_seq_list(const H5S_t *space, unsigned H5_ATTR_UNUSED flags, H5S_se
     size_t maxseq, size_t maxelem, size_t *nseq, size_t *nelem,
     hsize_t *off, size_t *len)
 {
-    herr_t ret_value;      /* return value */
+    herr_t ret_value = FAIL;    /* return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -8730,6 +9122,7 @@ H5S_hyper_get_seq_list(const H5S_t *space, unsigned H5_ATTR_UNUSED flags, H5S_se
     HDassert(nelem);
     HDassert(off);
     HDassert(len);
+    HDassert(space->select.sel_info.hslab->unlim_dim < 0);
 
     /* Check for the special case of just one H5Sselect_hyperslab call made */
     if(space->select.sel_info.hslab->diminfo_valid) {
@@ -8790,7 +9183,7 @@ H5S_hyper_get_seq_list(const H5S_t *space, unsigned H5_ATTR_UNUSED flags, H5S_se
             /* Make certain that we don't write too many */
             actual_elem = MIN3(leftover, (size_t)iter->elmt_left, maxelem);
 
-            /* initialize row sizes for each dimension */
+            /* Initialize row sizes for each dimension */
             elem_size = iter->elmt_size;
             for(i = (int)fast_dim, acc = elem_size; i >= 0; i--) {
                 slab[i] = acc;
@@ -8856,3 +9249,1188 @@ H5S_hyper_get_seq_list(const H5S_t *space, unsigned H5_ATTR_UNUSED flags, H5S_se
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5S_hyper_get_seq_list() */
 
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S__hyper_project_intersection
+ PURPOSE
+    Projects the intersection of of the selections of src_space and
+    src_intersect_space within the selection of src_space as a selection
+    within the selection of dst_space
+ USAGE
+    herr_t H5S__hyper_project_intersection(src_space,dst_space,src_intersect_space,proj_space)
+        H5S_t *src_space;       IN: Selection that is mapped to dst_space, and intersected with src_intersect_space
+        H5S_t *dst_space;       IN: Selection that is mapped to src_space, and which contains the result
+        H5S_t *src_intersect_space; IN: Selection whose intersection with src_space is projected to dst_space to obtain the result
+        H5S_t *proj_space;      OUT: Will contain the result (intersection of src_intersect_space and src_space projected from src_space to dst_space) after the operation
+ RETURNS
+    Non-negative on success/Negative on failure.
+ DESCRIPTION
+    Projects the intersection of of the selections of src_space and
+    src_intersect_space within the selection of src_space as a selection
+    within the selection of dst_space.  The result is placed in the
+    selection of proj_space.  Note src_space, dst_space, and
+    src_intersect_space do not need to use hyperslab selections, but they
+    cannot use point selections.  The result is always a hyperslab
+    selection.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S__hyper_project_intersection(const H5S_t *src_space, const H5S_t *dst_space,
+    const H5S_t *src_intersect_space, H5S_t *proj_space)
+{
+    hsize_t             ss_off[H5S_PROJECT_INTERSECT_NSEQS]; /* Offset array for src_space */
+    size_t              ss_len[H5S_PROJECT_INTERSECT_NSEQS]; /* Length array for src_space */
+    size_t              ss_nseq;        /* Number of sequences for src_space */
+    size_t              ss_nelem;       /* Number of elements for src_space */
+    size_t              ss_i = (size_t)0; /* Index into offset/length arrays for src_space */
+    hbool_t             advance_ss = FALSE; /* Whether to advance ss_i on the next iteration */
+    H5S_sel_iter_t      ss_iter;        /* Selection iterator for src_space */
+    hbool_t             ss_iter_init = FALSE; /* Whether ss_iter is initialized */
+    hsize_t             ss_sel_off = (hsize_t)0; /* Offset within src_space selection */
+    hsize_t             ds_off[H5S_PROJECT_INTERSECT_NSEQS]; /* Offset array for dst_space */
+    size_t              ds_len[H5S_PROJECT_INTERSECT_NSEQS]; /* Length array for dst_space */
+    size_t              ds_nseq;        /* Number of sequences for dst_space */
+    size_t              ds_nelem;       /* Number of elements for dst_space */
+    size_t              ds_i = (size_t)0; /* Index into offset/length arrays for dst_space */
+    H5S_sel_iter_t      ds_iter;        /* Selection iterator for dst_space */
+    hbool_t             ds_iter_init = FALSE; /* Whether ds_iter is initialized */
+    hsize_t             ds_sel_off = (hsize_t)0; /* Offset within dst_space selection */
+    hsize_t             sis_off[H5S_PROJECT_INTERSECT_NSEQS]; /* Offset array for src_intersect_space */
+    size_t              sis_len[H5S_PROJECT_INTERSECT_NSEQS]; /* Length array for src_intersect_space */
+    size_t              sis_nseq;       /* Number of sequences for src_intersect_space */
+    size_t              sis_nelem;      /* Number of elements for src_intersect_space */
+    size_t              sis_i = (size_t)0; /* Index into offset/length arrays for src_intersect_space */
+    hbool_t             advance_sis = FALSE; /* Whether to advance sis_i on the next iteration */
+    H5S_sel_iter_t      sis_iter;       /* Selection iterator for src_intersect_space */
+    hbool_t             sis_iter_init = FALSE; /* Whether sis_iter is initialized */
+    hsize_t             int_sel_off;    /* Offset within intersected selections (ss/sis and ds/ps) */
+    size_t              int_len;        /* Length of segment in intersected selections */
+    hsize_t             proj_off;       /* Segment offset in proj_space */
+    size_t              proj_len;       /* Segment length in proj_space */
+    size_t              proj_len_rem;   /* Remaining length in proj_space for segment */
+    hsize_t             proj_down_dims[H5S_MAX_RANK]; /* "Down" dimensions in proj_space */
+    H5S_hyper_span_info_t *curr_span_tree[H5S_MAX_RANK]; /* Current span tree being built (in each dimension) */
+    H5S_hyper_span_t    *prev_span[H5S_MAX_RANK]; /* Previous span in tree (in each dimension) */
+    hsize_t             curr_span_up_dim[H5S_MAX_RANK]; /* "Up" dimensions for current span */
+    unsigned            proj_rank;      /* Rank of proj_space */
+    hsize_t             low;            /* Low value of span */
+    hsize_t             high;           /* High value of span */
+    size_t              span_len;       /* Length of span */
+    size_t              nelem;          /* Number of elements returned for get_seq_list op */
+    unsigned            i;              /* Local index variable */
+    herr_t              ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_PACKAGE
+
+    /* Check parameters */
+    HDassert(src_space);
+    HDassert(dst_space);
+    HDassert(src_intersect_space);
+    HDassert(proj_space);
+        
+    /* Assert that src_space and src_intersect_space have same extent and there
+     * are no point selections */
+    HDassert(H5S_GET_EXTENT_NDIMS(src_space)
+            == H5S_GET_EXTENT_NDIMS(src_intersect_space));
+    HDassert(!HDmemcmp(src_space->extent.size, src_intersect_space->extent.size,
+            (size_t)H5S_GET_EXTENT_NDIMS(src_space)
+            * sizeof(src_space->extent.size[0])));
+    HDassert(H5S_GET_SELECT_TYPE(src_space) != H5S_SEL_POINTS);
+    HDassert(H5S_GET_SELECT_TYPE(dst_space) != H5S_SEL_POINTS);
+    HDassert(H5S_GET_SELECT_TYPE(src_intersect_space) != H5S_SEL_POINTS);
+
+    /* Initialize prev_space, curr_span_tree, and curr_span_up_dim */
+    for(i = 0; i < H5S_MAX_RANK; i++) {
+        curr_span_tree[i] = NULL;
+        prev_span[i] = NULL;
+        curr_span_up_dim[i] = (hsize_t)0;
+    } /* end for */
+
+    /* Save rank of projected space */
+    proj_rank = proj_space->extent.rank;
+    HDassert(proj_rank > 0);
+
+    /* Get numbers of elements */
+    ss_nelem = (size_t)H5S_GET_SELECT_NPOINTS(src_space);
+    ds_nelem = (size_t)H5S_GET_SELECT_NPOINTS(dst_space);
+    sis_nelem = (size_t)H5S_GET_SELECT_NPOINTS(src_intersect_space);
+    HDassert(ss_nelem == ds_nelem);
+
+    /* Calculate proj_down_dims (note loop relies on unsigned i wrapping around)
+     */
+    if(H5VM_array_down(proj_rank, proj_space->extent.size, proj_down_dims) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, FAIL, "can't compute 'down' chunk size value")
+
+    /* Remove current selection from proj_space */
+    if(H5S_SELECT_RELEASE(proj_space) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't release selection")
+
+    /* If any selections are empty, skip to the end so "none" is selected */
+    if((ss_nelem == 0) || (ds_nelem == 0) || (sis_nelem == 0))
+        goto loop_end;
+
+    /* Allocate space for the hyperslab selection information (note this sets
+     * diminfo_valid to FALSE, diminfo arrays to 0, and span list to NULL) */
+    if((proj_space->select.sel_info.hslab = H5FL_CALLOC(H5S_hyper_sel_t)) == NULL)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "can't allocate hyperslab info")
+
+    /* Set selection type */
+    proj_space->select.type = H5S_sel_hyper;
+
+    /* Set unlim_dim */
+    proj_space->select.sel_info.hslab->unlim_dim = -1;
+
+    /* Initialize source space iterator */
+    if(H5S_select_iter_init(&ss_iter, src_space, (size_t)1) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator")
+    ss_iter_init = TRUE;
+
+    /* Get sequence list for source space */
+    if(H5S_SELECT_GET_SEQ_LIST(src_space, 0u, &ss_iter, H5S_PROJECT_INTERSECT_NSEQS, ss_nelem, &ss_nseq, &nelem, ss_off, ss_len) < 0)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "sequence length generation failed")
+    ss_nelem -= nelem;
+    HDassert(ss_nseq > 0);
+
+    /* Initialize destination space iterator */
+    if(H5S_select_iter_init(&ds_iter, dst_space, (size_t)1) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator")
+    ds_iter_init = TRUE;
+
+    /* Get sequence list for destination space */
+    if(H5S_SELECT_GET_SEQ_LIST(dst_space, 0u, &ds_iter, H5S_PROJECT_INTERSECT_NSEQS, ds_nelem, &ds_nseq, &nelem, ds_off, ds_len) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator")
+    ds_nelem -= nelem;
+    HDassert(ds_nseq > 0);
+
+    /* Initialize source intersect space iterator */
+    if(H5S_select_iter_init(&sis_iter, src_intersect_space, (size_t)1) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator")
+    sis_iter_init = TRUE;
+
+    /* Get sequence list for source intersect space */
+    if(H5S_SELECT_GET_SEQ_LIST(src_intersect_space, 0u, &sis_iter, H5S_PROJECT_INTERSECT_NSEQS, sis_nelem, &sis_nseq, &nelem, sis_off, sis_len) < 0)
+        HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "sequence length generation failed")
+    sis_nelem -= nelem;
+    HDassert(sis_nseq > 0);
+
+    /* Loop until we run out of sequences in either the source or source
+     * intersect space */
+    while(1) {
+        while(advance_ss || (ss_off[ss_i] + ss_len[ss_i] <= sis_off[sis_i])) {
+            /* Either we finished the current source sequence or the
+             * sequences do not intersect.  Advance source space. */
+            ss_sel_off += (hsize_t)ss_len[ss_i];
+            if(++ss_i == ss_nseq) {
+                if(ss_nelem > 0) {
+                    /* Try to grab more sequences from src_space */
+                    if(H5S_SELECT_GET_SEQ_LIST(src_space, 0u, &ss_iter, H5S_PROJECT_INTERSECT_NSEQS, ss_nelem, &ss_nseq, &nelem, ss_off, ss_len) < 0)
+                        HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "sequence length generation failed")
+                    HDassert(ss_len[0] > 0);
+
+                    /* Update ss_nelem */
+                    HDassert(nelem > 0);
+                    HDassert(nelem <= ss_nelem);
+                    ss_nelem -= nelem;
+
+                    /* Reset source space index */
+                    ss_i = 0;
+                } /* end if */
+                else
+                    /* There are no more sequences in src_space, so we can exit
+                     * the loop.  Use goto instead of break so we exit the outer
+                     * loop. */
+                    goto loop_end;
+            } /* end if */
+
+            /* Reset advance_ss */
+            advance_ss = FALSE;
+        } /* end if */
+        if(advance_sis
+                || (sis_off[sis_i] + sis_len[sis_i] <= ss_off[ss_i])) {
+            do {
+                /* Either we finished the current source intersect sequence or
+                 * the sequences do not intersect.  Advance source intersect
+                 * space. */
+                if(++sis_i == sis_nseq) {
+                    if(sis_nelem > 0) {
+                        /* Try to grab more sequences from src_intersect_space
+                         */
+                        if(H5S_SELECT_GET_SEQ_LIST(src_intersect_space, 0u, &sis_iter, H5S_PROJECT_INTERSECT_NSEQS, sis_nelem, &sis_nseq, &nelem, sis_off, sis_len) < 0)
+                            HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "sequence length generation failed")
+                        HDassert(sis_len[0] > 0);
+
+                        /* Update ss_nelem */
+                        HDassert(nelem > 0);
+                        HDassert(nelem <= sis_nelem);
+                        sis_nelem -= nelem;
+
+                        /* Reset source space index */
+                        sis_i = 0;
+                    } /* end if */
+                    else
+                        /* There are no more sequences in src_intersect_space,
+                         * so we can exit the loop.  Use goto instead of break
+                         * so we exit the outer loop. */
+                        goto loop_end;
+                } /* end if */
+            } while(sis_off[sis_i] + sis_len[sis_i] <= ss_off[ss_i]);
+
+            /* Reset advance_sis */
+            advance_sis = FALSE;
+        } /* end if */
+        else {
+            /* Sequences intersect, add intersection to projected space */
+            /* Calculate intersection sequence in terms of offset within source
+             * selection and advance any sequences we complete */
+            if(ss_off[ss_i] >= sis_off[sis_i])
+                int_sel_off = ss_sel_off;
+            else 
+                int_sel_off = sis_off[sis_i] - ss_off[ss_i] + ss_sel_off;
+            if((ss_off[ss_i] + (hsize_t)ss_len[ss_i]) <= (sis_off[sis_i]
+                    + (hsize_t)sis_len[sis_i])) {
+                int_len = (size_t)((hsize_t)ss_len[ss_i] + ss_sel_off - int_sel_off);
+                advance_ss = TRUE;
+            } /* end if */
+            else
+                int_len = (size_t)(sis_off[sis_i] + (hsize_t)sis_len[sis_i] - ss_off[ss_i] + ss_sel_off - int_sel_off);
+            if((ss_off[ss_i] + (hsize_t)ss_len[ss_i]) >= (sis_off[sis_i]
+                    + (hsize_t)sis_len[sis_i]))
+                advance_sis = TRUE;
+
+            /* Project intersection sequence to destination selection */
+            while(int_len > (size_t)0) {
+                while(ds_sel_off + (hsize_t)ds_len[ds_i] <= int_sel_off) {
+                    /* Intersection is not projected to this destination
+                     * sequence, advance destination space */
+                    ds_sel_off += (hsize_t)ds_len[ds_i];
+                    if(++ds_i == ds_nseq) {
+                        HDassert(ds_nelem > 0);
+
+                        /* Try to grab more sequences from dst_space */
+                        if(H5S_SELECT_GET_SEQ_LIST(dst_space, 0u, &ds_iter, H5S_PROJECT_INTERSECT_NSEQS, ds_nelem, &ds_nseq, &nelem, ds_off, ds_len) < 0)
+                            HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "sequence length generation failed")
+                        HDassert(ds_len[0] > 0);
+
+                        /* Update ss_nelem */
+                        HDassert(nelem > 0);
+                        HDassert(nelem <= ds_nelem);
+                        ds_nelem -= nelem;
+
+                        /* Reset source space index */
+                        ds_i = 0;
+                    } /* end if */
+                } /* end while */
+
+                /* Add sequence to projected space */
+                HDassert(ds_sel_off <= int_sel_off);
+                proj_off = ds_off[ds_i] + int_sel_off - ds_sel_off;
+                proj_len = proj_len_rem = (size_t)MIN(int_len,
+                        (size_t)(ds_sel_off + (hsize_t)ds_len[ds_i]
+                        - int_sel_off));
+
+                /* Add to span tree */
+                while(proj_len_rem > (size_t)0) {
+                    /* Check for more than one full row (in every dim) and
+                     * append multiple spans at once? -NAF */
+                    /* Append spans in higher dimensions if we're going ouside
+                     * the plane of the span currently being built (i.e. it's
+                     * finished being built) */
+                    for(i = proj_rank - 1; ((i > 0)
+                            && ((proj_off / proj_down_dims[i - 1])
+                            != curr_span_up_dim[i - 1])); i--) {
+                        if(curr_span_tree[i]) {
+                            HDassert(prev_span[i]);
+
+                            /* Append complete lower dimension span tree to
+                             * current dimension */
+                            low = curr_span_up_dim[i - 1] % proj_space->extent.size[i - 1];
+                            if(H5S_hyper_append_span(&prev_span[i - 1], &curr_span_tree[i - 1], low, low, curr_span_tree[i], NULL) < 0)
+                                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
+
+                            /* Reset lower dimension's span tree and previous
+                             * span since we just committed it and will start
+                             * over with a new one */
+                            if(H5S_hyper_free_span_info(curr_span_tree[i]) < 0)
+                                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTFREE, FAIL, "can't free span info")
+                            curr_span_tree[i] = NULL;
+                            prev_span[i] = NULL;
+                        } /* end if */
+
+                        /* Update curr_span_up_dim */
+                        curr_span_up_dim[i - 1] = proj_off / proj_down_dims[i - 1];
+                    } /* end for */
+
+                    /* Compute bounds for new span in lowest dimension */
+                    low = proj_off % proj_space->extent.size[proj_rank - 1];
+                    span_len = MIN(proj_len_rem,
+                            (size_t)(proj_space->extent.size[proj_rank - 1]
+                            - low));
+                    HDassert(proj_len_rem >= span_len);
+                    high = low + (hsize_t)span_len - (hsize_t)1;
+
+                    /* Append span in lowest dimension */
+                    if(H5S_hyper_append_span(&prev_span[proj_rank - 1], &curr_span_tree[proj_rank - 1], low, high, NULL, NULL) < 0)
+                        HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
+
+                    /* Update remaining offset and length */
+                    proj_off += (hsize_t)span_len;
+                    proj_len_rem -= span_len;
+                } /* end while */
+
+                /* Update intersection sequence */
+                int_sel_off += (hsize_t)proj_len;
+                int_len -= proj_len;
+            } /* end while */
+        } /* end else */
+    } /* end while */
+
+loop_end:
+    /* Add remaining spans to span tree */
+    for(i = proj_rank - 1; i > 0; i--)
+        if(curr_span_tree[i]) {
+            HDassert(prev_span[i]);
+
+            /* Append remaining span tree to higher dimension */
+            low = curr_span_up_dim[i - 1] % proj_space->extent.size[i - 1];
+            if(H5S_hyper_append_span(&prev_span[i - 1], &curr_span_tree[i - 1], low, low, curr_span_tree[i], NULL) < 0)
+                HGOTO_ERROR(H5E_RESOURCE, H5E_CANTAPPEND, FAIL, "can't allocate hyperslab span")
+
+            /* Reset span tree */
+            if(H5S_hyper_free_span_info(curr_span_tree[i]) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTFREE, FAIL, "can't free span info")
+            curr_span_tree[i] = NULL;
+        } /* end if */
+
+    /* Add span tree to proj_space */
+    if(curr_span_tree[0]) {
+        proj_space->select.sel_info.hslab->span_lst = curr_span_tree[0];
+        curr_span_tree[0] = NULL;
+
+        /* Set the number of elements in current selection */
+        proj_space->select.num_elem = H5S_hyper_spans_nelem(proj_space->select.sel_info.hslab->span_lst);
+
+        /* Attempt to rebuild "optimized" start/stride/count/block information.
+         * from resulting hyperslab span tree */
+        if(H5S_hyper_rebuild(proj_space) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOUNT, FAIL, "can't rebuild hyperslab info")
+    } /* end if */
+    else
+        /* If we did not add anything to proj_space, select none instead */
+        if(H5S_select_none(proj_space) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't convert selection")
+
+done:
+    /* Release source selection iterator */
+    if(ss_iter_init)
+        if(H5S_SELECT_ITER_RELEASE(&ss_iter) < 0)
+            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
+
+    /* Release destination selection iterator */
+    if(ds_iter_init)
+        if(H5S_SELECT_ITER_RELEASE(&ds_iter) < 0)
+            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
+
+    /* Release source intersect selection iterator */
+    if(sis_iter_init)
+        if(H5S_SELECT_ITER_RELEASE(&sis_iter) < 0)
+            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
+
+    /* Cleanup on error */
+    if(ret_value < 0) {
+        /* Remove current selection from proj_space */
+        if(H5S_SELECT_RELEASE(proj_space) < 0)
+            HDONE_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't release selection")
+
+        /* Free span trees */
+        for(i = 0; i < proj_rank; i++)
+            if(curr_span_tree[i]) {
+                if(H5S_hyper_free_span_info(curr_span_tree[i]) < 0)
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTFREE, FAIL, "can't free span info")
+                curr_span_tree[i] = NULL;
+            } /* end if */
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S__hyper_project_intersection() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S__hyper_subtract
+ PURPOSE
+    Subtract one hyperslab selection from another
+ USAGE
+    herr_t H5S__hyper_subtract(space,subtract_space)
+        H5S_t *space;           IN/OUT: Selection to be operated on
+        H5S_t *subtract_space;  IN: Selection that will be subtracted from space
+ RETURNS
+    Non-negative on success/Negative on failure.
+ DESCRIPTION
+    Removes any and all portions of space that are also present in
+    subtract_space.  In essence, performs an A_NOT_B operation with the
+    two selections.
+
+    Note this function basically duplicates a subset of the functionality
+    of H5S_select_select().  It should probably be removed when that
+    function is enabled.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S__hyper_subtract(H5S_t *space, H5S_t *subtract_space)
+{
+    H5S_hyper_span_info_t *a_not_b = NULL;  /* Span tree for hyperslab spans in old span tree and not in new span tree */
+    H5S_hyper_span_info_t *a_and_b = NULL;  /* Span tree for hyperslab spans in both old and new span trees */
+    H5S_hyper_span_info_t *b_not_a = NULL;  /* Span tree for hyperslab spans in new span tree and not in old span tree */
+    herr_t      ret_value = SUCCEED;        /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Check args */
+    HDassert(space);
+    HDassert(subtract_space);
+
+    /* Check that the space selections both have span trees */
+    if(space->select.sel_info.hslab->span_lst == NULL)
+        if(H5S_hyper_generate_spans(space) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_UNINITIALIZED, FAIL, "dataspace does not have span tree")
+    if(subtract_space->select.sel_info.hslab->span_lst == NULL)
+        if(H5S_hyper_generate_spans(subtract_space) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_UNINITIALIZED, FAIL, "dataspace does not have span tree")
+
+    /* Generate lists of spans which overlap and don't overlap */
+    if(H5S_hyper_clip_spans(space->select.sel_info.hslab->span_lst, subtract_space->select.sel_info.hslab->span_lst, &a_not_b, &a_and_b, &b_not_a)<0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCLIP, FAIL, "can't clip hyperslab information")
+
+    /* Reset the other dataspace selection information */
+    if(H5S_SELECT_RELEASE(space) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't release selection")
+
+    /* Allocate space for the hyperslab selection information */
+    if((space->select.sel_info.hslab = H5FL_CALLOC(H5S_hyper_sel_t)) == NULL)
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "can't allocate hyperslab info")
+
+    /* Set unlim_dim */
+    space->select.sel_info.hslab->unlim_dim = -1;
+
+    /* Check for anything returned in a_not_b */
+    if(a_not_b) {
+        /* Update spans in space */
+        space->select.sel_info.hslab->span_lst = a_not_b;
+        a_not_b = NULL;
+
+        /* Update number of elements */
+        space->select.num_elem = H5S_hyper_spans_nelem(space->select.sel_info.hslab->span_lst);
+
+        /* Attempt to rebuild "optimized" start/stride/count/block information.
+         * from resulting hyperslab span tree */
+        if(H5S_hyper_rebuild(space) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOUNT, FAIL, "can't rebuild hyperslab info")
+    } /* end if */
+    else {
+        H5S_hyper_span_info_t *spans;     /* Empty hyperslab span tree */
+
+        /* Set number of elements */
+        space->select.num_elem = 0;
+
+        /* Allocate a span info node */
+        if(NULL == (spans = H5FL_MALLOC(H5S_hyper_span_info_t)))
+            HGOTO_ERROR(H5E_RESOURCE, H5E_CANTALLOC, FAIL, "can't allocate hyperslab span")
+
+        /* Set the reference count */
+        spans->count = 1;
+
+        /* Reset the scratch pad space */
+        spans->scratch = 0;
+
+        /* Set to empty tree */
+        spans->head = NULL;
+
+        /* Set pointer to empty span tree */
+        space->select.sel_info.hslab->span_lst = spans;
+    } /* end if */
+
+done:
+    /* Free span trees */
+    if(a_and_b)
+        H5S_hyper_free_span_info(a_and_b);
+    if(b_not_a)
+        H5S_hyper_free_span_info(b_not_a);
+    if(a_not_b) {
+        HDassert(ret_value < 0);
+        H5S_hyper_free_span_info(b_not_a);
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S__hyper_subtract() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S__hyper_get_clip_diminfo
+ PURPOSE
+    Calculates the count and block required to clip the specified
+    unlimited dimension to include clip_size.  The returned selection may
+    extent beyond clip_size.
+ USAGE
+    void H5S__hyper_get_clip_diminfo(start,stride,count,block,clip_size)
+        hsize_t start;          IN: Start of hyperslab in unlimited dimension
+        hsize_t stride;         IN: Stride of hyperslab in unlimited dimension
+        hsize_t *count;         IN/OUT: Count of hyperslab in unlimited dimension
+        hsize_t *block;         IN/OUT: Block of hyperslab in unlimited dimension
+        hsize_t clip_size;      IN: Extent that hyperslab will be clipped to
+ RETURNS
+    Non-negative on success/Negative on failure.
+ DESCRIPTION
+    This function recalculates the internal description of the hyperslab
+    to make the unlimited dimension extend to the specified extent.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+void
+H5S__hyper_get_clip_diminfo(hsize_t start, hsize_t stride, hsize_t *count,
+    hsize_t *block, hsize_t clip_size)
+{
+    FUNC_ENTER_PACKAGE_NOERR
+
+    /* Check for selection outside clip size */
+    if(start >= clip_size) {
+        if(*block == H5S_UNLIMITED)
+            *block = 0;
+        else
+            *count = 0;
+    } /* end if */
+    /* Check for single block in unlimited dimension */
+    else if((*block == H5S_UNLIMITED) || (*block == stride)) {
+        /* Calculate actual block size for this clip size */
+        *block = clip_size - start;
+        *count = (hsize_t)1;
+    } /* end if */
+    else {
+        HDassert(*count == H5S_UNLIMITED);
+
+        /* Calculate initial count (last block may be partial) */
+        *count = (clip_size - start + stride - (hsize_t)1) / stride;
+        HDassert(*count > (hsize_t)0);
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5S_hyper_get_clip_diminfo() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_clip_unlim
+ PURPOSE
+    Clips the unlimited dimension of the hyperslab selection to the
+    specified size
+ USAGE
+    void H5S_hyper_clip_unlim(space,clip_size)
+        H5S_t *space,           IN/OUT: Unlimited space to clip
+        hsize_t clip_size;      IN: Extent that hyperslab will be clipped to
+ RETURNS
+    Non-negative on success/Negative on failure.
+ DESCRIPTION
+    This function changes the unlimited selection into a limited selection
+    with the extent of the formerly unlimited dimension specified by
+    * clip_size.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Note this function does not take the offset into account.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_hyper_clip_unlim(H5S_t *space, hsize_t clip_size)
+{
+    H5S_hyper_sel_t *hslab;     /* Convenience pointer to hyperslab info */
+    hsize_t orig_count;         /* Original count in unlimited dimension */
+    int orig_unlim_dim;         /* Original unliminted dimension */
+    H5S_hyper_dim_t *diminfo;   /* Convenience pointer to opt_diminfo in unlimited dimension */
+    herr_t ret_value = SUCCEED;
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check parameters */
+    HDassert(space);
+    hslab = space->select.sel_info.hslab;
+    HDassert(hslab);
+    HDassert(hslab->unlim_dim >= 0);
+    HDassert(!hslab->span_lst);
+
+    /* Save original unlimited dimension */
+    orig_unlim_dim = hslab->unlim_dim;
+
+    diminfo = &hslab->opt_diminfo[orig_unlim_dim];
+
+    /* Save original count in unlimited dimension */
+    orig_count = diminfo->count;
+
+    /* Get initial diminfo */
+    H5S__hyper_get_clip_diminfo(diminfo->start, diminfo->stride, &diminfo->count, &diminfo->block, clip_size);
+
+    /* Selection is no longer unlimited */
+    space->select.sel_info.hslab->unlim_dim = -1;
+
+    /* Check for nothing returned */
+    if((diminfo->block == 0) || (diminfo->count == 0)) {
+        /* Convert to "none" selection */
+        if(H5S_select_none(space) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't convert selection")
+    } /* end if */
+    /* Check for single block in unlimited dimension */
+    else if(orig_count == (hsize_t)1) {
+        /* Calculate number of elements */
+        space->select.num_elem = diminfo->block * hslab->num_elem_non_unlim;
+
+        /* Mark that opt_diminfo is valid */
+        hslab->diminfo_valid = TRUE;
+    } /* end if */
+    else {
+        /* Calculate number of elements */
+        space->select.num_elem = diminfo->count * diminfo->block
+                * hslab->num_elem_non_unlim;
+
+        /* Check if last block is partial.  If superset is set, just keep the
+         * last block complete to speed computation. */
+        HDassert(clip_size > diminfo->start);
+        if(((diminfo->stride * (diminfo->count - (hsize_t)1)) + diminfo->block)
+                > (clip_size - diminfo->start)) {
+            hsize_t start[H5S_MAX_RANK];
+            hsize_t block[H5S_MAX_RANK];
+            unsigned i;
+
+            /* Last block is partial, need to construct compound selection */
+            /* Fill start with zeros */
+            HDmemset(start, 0, sizeof(start));
+
+            /* Set block to clip_size in unlimited dimension, H5S_MAX_SIZE in
+             * others so only unlimited dimension is clipped */
+            for(i = 0; i < space->extent.rank; i++)
+                if((int)i == orig_unlim_dim)
+                    block[i] = clip_size;
+                else
+                    block[i] = H5S_MAX_SIZE;
+
+            /* Generate span tree in selection */
+            if(!hslab->span_lst)
+                if(H5S_hyper_generate_spans(space) < 0)
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to generate span tree")
+
+            /* Indicate that the regular dimensions are no longer valid */
+            hslab->diminfo_valid = FALSE;
+
+            /* "And" selection with calculated block to perform clip operation
+             */
+            if(H5S_generate_hyperslab(space, H5S_SELECT_AND, start, _ones, _ones, block) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINSERT, FAIL, "can't generate hyperslabs")
+        } /* end if */
+        else
+            /* Last block is complete, simply mark that opt_diminfo is valid */
+            hslab->diminfo_valid = TRUE;
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_hyper_clip_unlim() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S__hyper_get_clip_extent_real
+ PURPOSE
+    Gets the extent a space should be clipped to in order to contain the
+    specified number of slices in the unlimited dimension
+ USAGE
+    hsize_t H5S__hyper_get_clip_extent_real(clip_space,num_slices,incl_trail)
+        const H5S_t *clip_space, IN: Space that clip size will be calculated based on
+        hsize_t num_slizes,     IN: Number of slices clip_space should contain when clipped
+        hbool_t incl_trail;     IN: Whether to include trailing unselected space
+ RETURNS
+    Clip extent to match num_slices (never fails)
+ DESCRIPTION
+    Calculates and returns the extent that clip_space should be clipped to
+    (via H5S_hyper_clip_unlim) in order for it to contain num_slices
+    slices in the unlimited dimension.  If the clipped selection would end
+    immediately before a section of unselected space (i.e. at the end of a
+    block), then if incl_trail is TRUE, the returned clip extent is
+    selected to include that trailing "blank" space, otherwise it is
+    selected to end at the end before the blank space.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Note this assumes the offset has been normalized.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static hsize_t
+H5S__hyper_get_clip_extent_real(const H5S_t *clip_space, hsize_t num_slices,
+    hbool_t incl_trail)
+{
+    const H5S_hyper_dim_t *diminfo; /* Convenience pointer to opt_unlim_diminfo in unlimited dimension */
+    hsize_t count;
+    hsize_t rem_slices;
+    hsize_t ret_value = 0;      /* Return value */
+
+    FUNC_ENTER_STATIC_NOERR
+
+    /* Check parameters */
+    HDassert(clip_space);
+    HDassert(clip_space->select.sel_info.hslab);
+    HDassert(clip_space->select.sel_info.hslab->unlim_dim >= 0);
+
+    diminfo = &clip_space->select.sel_info.hslab->opt_diminfo[clip_space->select.sel_info.hslab->unlim_dim];
+
+    if(num_slices == 0)
+        ret_value = incl_trail ? diminfo->start : 0;
+    else if((diminfo->block == H5S_UNLIMITED)
+            || (diminfo->block == diminfo->stride))
+        /* Unlimited block, just set the extent large enough for the block size
+         * to match num_slices */
+        ret_value = diminfo->start + num_slices;
+    else {
+        /* Unlimited count, need to match extent so a block (possibly) gets cut
+         * off so the number of slices matches num_slices */
+        HDassert(diminfo->count == H5S_UNLIMITED);
+
+        /* Calculate number of complete blocks in clip_space */
+        count = num_slices / diminfo->block;
+
+        /* Calculate slices remaining */
+        rem_slices = num_slices - (count * diminfo->block);
+
+        if(rem_slices > 0)
+            /* Must end extent in middle of partial block (or beginning of empty
+             * block if include_trailing_space and rem_slices == 0) */
+            ret_value = diminfo->start + (count * diminfo->stride) + rem_slices;
+        else {
+            if(incl_trail)
+                /* End extent just before first missing block */
+                ret_value = diminfo->start + (count * diminfo->stride);
+            else
+                /* End extent at end of last block */
+                ret_value = diminfo->start + ((count - (hsize_t)1)
+                        * diminfo->stride) + diminfo->block;
+        } /* end else */
+    } /* end else */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S__hyper_get_clip_extent_real() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_get_clip_extent
+ PURPOSE
+    Gets the extent a space should be clipped to in order to contain the
+    same number of elements as another space
+ USAGE
+    hsize_t H5S__hyper_get_clip_extent(clip_space,match_space,incl_trail)
+        const H5S_t *clip_space, IN: Space that clip size will be calculated based on
+        const H5S_t *match_space, IN: Space containing the same number of elements as clip_space should after clipping
+        hbool_t incl_trail;     IN: Whether to include trailing unselected space
+ RETURNS
+    Calculated clip extent (never fails)
+ DESCRIPTION
+    Calculates and returns the extent that clip_space should be clipped to
+    (via H5S_hyper_clip_unlim) in order for it to contain the same number
+    of elements as match_space.  If the clipped selection would end
+    immediately before a section of unselected space (i.e. at the end of a
+    block), then if incl_trail is TRUE, the returned clip extent is
+    selected to include that trailing "blank" space, otherwise it is
+    selected to end at the end before the blank space.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Note this assumes the offset has been normalized.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hsize_t
+H5S_hyper_get_clip_extent(const H5S_t *clip_space, const H5S_t *match_space,
+    hbool_t incl_trail)
+{
+    hsize_t num_slices;         /* Number of slices in unlimited dimension */
+    hsize_t ret_value = 0;      /* Return value */
+
+    FUNC_ENTER_NOAPI(0)
+
+    /* Check parameters */
+    HDassert(clip_space);
+    HDassert(match_space);
+    HDassert(clip_space->select.sel_info.hslab->unlim_dim >= 0);
+
+    /* Check for "none" match space */
+    if(match_space->select.type->type == H5S_SEL_NONE)
+        num_slices = (hsize_t)0;
+    else {
+        HDassert(match_space->select.type->type == H5S_SEL_HYPERSLABS);
+        HDassert(match_space->select.sel_info.hslab);
+
+        /* Calculate number of slices */
+        num_slices = match_space->select.num_elem
+                / clip_space->select.sel_info.hslab->num_elem_non_unlim;
+        HDassert((match_space->select.num_elem
+                % clip_space->select.sel_info.hslab->num_elem_non_unlim) == 0);
+    } /* end else */
+
+    /* Call "real" get_clip_extent function */
+    ret_value = H5S__hyper_get_clip_extent_real(clip_space, num_slices, incl_trail);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_hyper_get_clip_extent() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_get_clip_extent_match
+ PURPOSE
+    Gets the extent a space should be clipped to in order to contain the
+    same number of elements as another unlimited space that has been
+    clipped to a different extent
+ USAGE
+    hsize_t H5S__hyper_get_clip_extent_match(clip_space,match_space,match_clip_size,incl_trail)
+        const H5S_t *clip_space, IN: Space that clip size will be calculated based on
+        const H5S_t *match_space, IN: Space that, after being clipped to match_clip_size, contains the same number of elements as clip_space should after clipping
+        hsize_t match_clip_size, IN: Extent match_space would be clipped to to match the number of elements in clip_space
+        hbool_t incl_trail;     IN: Whether to include trailing unselected space
+ RETURNS
+    Calculated clip extent (never fails)
+ DESCRIPTION
+    Calculates and returns the extent that clip_space should be clipped to
+    (via H5S_hyper_clip_unlim) in order for it to contain the same number
+    of elements as match_space would have after being clipped to
+    match_clip_size.  If the clipped selection would end immediately
+    before a section of unselected space (i.e. at the end of a block),
+    then if incl_trail is TRUE, the returned clip extent is selected to
+    include that trailing "blank" space, otherwise it is selected to end
+    at the end before the blank space.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Note this assumes the offset has been normalized.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hsize_t
+H5S_hyper_get_clip_extent_match(const H5S_t *clip_space,
+    const H5S_t *match_space, hsize_t match_clip_size, hbool_t incl_trail)
+{
+    const H5S_hyper_dim_t *match_diminfo; /* Convenience pointer to opt_unlim_diminfo in unlimited dimension in match_space */
+    hsize_t count;              /* Temporary count */
+    hsize_t block;              /* Temporary block */
+    hsize_t num_slices;         /* Number of slices in unlimited dimension */
+    hsize_t ret_value = 0;      /* Return value */
+
+    FUNC_ENTER_NOAPI(0)
+
+    /* Check parameters */
+    HDassert(clip_space);
+    HDassert(match_space);
+    HDassert(clip_space->select.sel_info.hslab);
+    HDassert(match_space->select.sel_info.hslab);
+    HDassert(clip_space->select.sel_info.hslab->unlim_dim >= 0);
+    HDassert(match_space->select.sel_info.hslab->unlim_dim >= 0);
+    HDassert(clip_space->select.sel_info.hslab->num_elem_non_unlim
+            == match_space->select.sel_info.hslab->num_elem_non_unlim);
+
+    match_diminfo = &match_space->select.sel_info.hslab->opt_diminfo[match_space->select.sel_info.hslab->unlim_dim];
+
+    /* Get initial count and block */
+    count = match_diminfo->count;
+    block = match_diminfo->block;
+    H5S__hyper_get_clip_diminfo(match_diminfo->start, match_diminfo->stride, &count, &block, match_clip_size);
+
+    /* Calculate number of slices */
+    /* Check for nothing returned */
+    if((block == 0) || (count == 0))
+        num_slices = (hsize_t)0;
+    /* Check for single block in unlimited dimension */
+    else if(count == (hsize_t)1)
+        num_slices = block;
+    else {
+        /* Calculate initial num_slices */
+        num_slices = block * count;
+
+        /* Check for partial last block */
+        HDassert(match_clip_size >= match_diminfo->start);
+        if(((match_diminfo->stride * (count - (hsize_t)1)) + block)
+                > (match_clip_size - match_diminfo->start)) {
+            /* Subtract slices missing from last block */
+            HDassert((((match_diminfo->stride * (count - (hsize_t)1)) + block)
+                    - (match_clip_size - match_diminfo->start)) < num_slices);
+            num_slices -= ((match_diminfo->stride * (count - (hsize_t)1))
+                    + block) - (match_clip_size - match_diminfo->start);
+        } /* end if */
+    } /* end else */
+
+    /* Call "real" get_clip_extent function */
+    ret_value = H5S__hyper_get_clip_extent_real(clip_space, num_slices, incl_trail);
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_hyper_get_clip_extent_match() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_get_unlim_block
+ PURPOSE
+    Get the nth block in the unlimited dimension
+ USAGE
+    H5S_t *H5S_hyper_get_unlim_block(space,block_index)
+        const H5S_t *space,     IN: Space with unlimited selection
+        hsize_t block_index,    IN: Index of block to return in unlimited dimension
+        hbool_t incl_trail;     IN: Whether to include trailing unselected space
+ RETURNS
+    New space on success/NULL on failure.
+ DESCRIPTION
+    Returns a space containing only the block_indexth block in the
+    unlimited dimension on space.  All blocks in all other dimensions are
+    preserved.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Note this assumes the offset has been normalized.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5S_t *
+H5S_hyper_get_unlim_block(const H5S_t *space, hsize_t block_index)
+{
+    H5S_hyper_sel_t *hslab;     /* Convenience pointer to hyperslab info */
+    H5S_t *space_out = NULL;
+    hsize_t start[H5S_MAX_RANK];
+    hsize_t stride[H5S_MAX_RANK];
+    hsize_t count[H5S_MAX_RANK];
+    hsize_t block[H5S_MAX_RANK];
+    unsigned i;
+    H5S_t *ret_value = NULL;
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Check parameters */
+    HDassert(space);
+    hslab = space->select.sel_info.hslab;
+    HDassert(hslab);
+    HDassert(hslab->unlim_dim >= 0);
+    HDassert(hslab->opt_diminfo[hslab->unlim_dim].count == H5S_UNLIMITED);
+
+    /* Set start to select block_indexth block in unlimited dimension and set
+     * count to 1 in that dimension to only select that block.  Copy all other
+     * diminfo parameters. */
+    for(i = 0; i < space->extent.rank; i++) {
+        if((int)i == hslab->unlim_dim){
+            start[i] = hslab->opt_diminfo[i].start + (block_index
+                    * hslab->opt_diminfo[i].stride);
+            count[i] = (hsize_t)1;
+        } /* end if */
+        else {
+            start[i] = hslab->opt_diminfo[i].start;
+            count[i] = hslab->opt_diminfo[i].count;
+        } /* end else */
+        stride[i] = hslab->opt_diminfo[i].stride;
+        block[i] = hslab->opt_diminfo[i].block;
+    } /* end for */
+
+    /* Create output space, copy extent */
+    if(NULL == (space_out = H5S_create(H5S_SIMPLE)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, NULL, "unable to create output dataspace")
+    if(H5S_extent_copy_real(&space_out->extent, &space->extent, TRUE) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, NULL, "unable to copy destination space extent")
+
+    /* Select block as defined by start/stride/count/block computed above */
+    if(H5S_select_hyperslab(space_out, H5S_SELECT_SET, start, stride, count, block) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, NULL, "can't select hyperslab")
+
+    /* Set return value */
+    ret_value = space_out;
+
+done:
+    /* Free space on error */
+    if(!ret_value)
+        if(space_out && H5S_close(space_out) < 0)
+            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, NULL, "unable to release dataspace")
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_hyper_get_unlim_block */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_hyper_get_first_inc_block
+ PURPOSE
+    Get the index of the first incomplete block in the specified extent
+ USAGE
+    hsize_t H5S_hyper_get_first_inc_block(space,clip_size,partial)
+        const H5S_t *space,     IN: Space with unlimited selection
+        hsize_t clip_size,      IN: Extent space would be clipped to
+        hbool_t *partial;       OUT: Whether the ret_valueth block (first incomplete block) is partial
+ RETURNS
+    Index of first incomplete block in clip_size (never fails).
+ DESCRIPTION
+    Calculates and returns the index (as would be passed to
+    H5S_hyper_get_unlim_block()) of the first block in the unlimited
+    dimension of space which would be incomplete or missing when space is
+    clipped to clip_size.  partial is set to TRUE if the first incomplete
+    block is partial, and FALSE if the first incomplete block is missing.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Note this assumes the offset has been normalized.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hsize_t
+H5S_hyper_get_first_inc_block(const H5S_t *space, hsize_t clip_size,
+    hbool_t *partial)
+{
+    H5S_hyper_sel_t *hslab;     /* Convenience pointer to hyperslab info */
+    H5S_hyper_dim_t *diminfo;   /* Convenience pointer to opt_diminfo in unlimited dimension */
+    hsize_t ret_value = 0;
+
+    FUNC_ENTER_NOAPI(0)
+
+    /* Check parameters */
+    HDassert(space);
+    hslab = space->select.sel_info.hslab;
+    HDassert(hslab);
+    HDassert(hslab->unlim_dim >= 0);
+    HDassert(hslab->opt_diminfo[hslab->unlim_dim].count == H5S_UNLIMITED);
+
+    diminfo = &hslab->opt_diminfo[hslab->unlim_dim];
+
+    /* Check for selection outside of clip_size */
+    if(diminfo->start >= clip_size) {
+        ret_value = 0;
+        if(partial)
+            partial = FALSE;
+    } /* end if */
+    else {
+        /* Calculate index of first incomplete block */
+        ret_value = (clip_size - diminfo->start + diminfo->stride
+                - diminfo->block) / diminfo->stride;
+
+        if(partial) {
+            /* Check for partial block */
+            if((diminfo->stride * ret_value) < (clip_size - diminfo->start))
+                *partial = TRUE;
+            else
+                *partial = FALSE;
+        } /* end if */
+    } /* end else */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_hyper_get_first_inc_block */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Sis_regular_hyperslab
+ PURPOSE
+    Determine if a hyperslab selection is regular
+ USAGE
+    htri_t H5Sis_regular_hyperslab(dsid)
+        hid_t dsid;             IN: Dataspace ID of hyperslab selection to query
+ RETURNS
+    TRUE/FALSE for hyperslab selection, FAIL on error or when querying other
+    selection types.
+ DESCRIPTION
+    If a hyperslab can be represented as a single call to H5Sselect_hyperslab,
+    with the H5S_SELECT_SET option, it is regular.  If the hyperslab selection
+    would require multiple calls to H5Sselect_hyperslab, it is irregular.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+htri_t
+H5Sis_regular_hyperslab(hid_t spaceid)
+{
+    H5S_t *space;               /* Dataspace to query */
+    htri_t ret_value;           /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("t", "i", spaceid);
+
+    /* Check args */
+    if(NULL == (space = (H5S_t *)H5I_object_verify(spaceid, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+    if(H5S_GET_SELECT_TYPE(space) != H5S_SEL_HYPERSLABS)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a hyperslab selection")
+
+    ret_value = H5S_hyper_is_regular(space);
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Sis_regular_hyperslab() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5Sgetregular_hyperslab
+ PURPOSE
+    Retrieve a regular hyperslab selection
+ USAGE
+    herr_t H5Sget_regular_hyperslab(dsid, start, stride, block, count)
+        hid_t dsid;             IN: Dataspace ID of hyperslab selection to query
+        hsize_t start[];        OUT: Offset of start of hyperslab
+        hsize_t stride[];       OUT: Hyperslab stride
+        hsize_t count[];        OUT: Number of blocks included in hyperslab
+        hsize_t block[];        OUT: Size of block in hyperslab
+ RETURNS
+    Non-negative on success/Negative on failure.  (It is an error to query
+    the regular hyperslab selections for non-regular hyperslab selections)
+ DESCRIPTION
+    Retrieve the start/stride/count/block for a regular hyperslab selection.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+    Note that if a hyperslab is originally regular, then becomes irregular
+    through selection operations, and then becomes regular again, the new
+    final regular selection may be equivalent but not identical to the
+    original regular selection.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Sget_regular_hyperslab(hid_t spaceid, hsize_t start[], hsize_t stride[],
+    hsize_t count[], hsize_t block[])
+{
+    H5S_t *space;               /* Dataspace to query */
+    unsigned u;                 /* Local index variable */
+    herr_t ret_value = SUCCEED; /* Return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE5("e", "i*h*h*h*h", spaceid, start, stride, count, block);
+
+    /* Check args */
+    if(NULL == (space = (H5S_t *)H5I_object_verify(spaceid, H5I_DATASPACE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+    if(H5S_GET_SELECT_TYPE(space) != H5S_SEL_HYPERSLABS)
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a hyperslab selection")
+    if(TRUE != H5S_hyper_is_regular(space))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a regular hyperslab selection")
+
+    /* Retrieve hyperslab parameters */
+    if(start)
+        for(u = 0; u < space->extent.rank; u++)
+            start[u] = space->select.sel_info.hslab->app_diminfo[u].start;
+    if(stride)
+        for(u = 0; u < space->extent.rank; u++)
+            stride[u] = space->select.sel_info.hslab->app_diminfo[u].stride;
+    if(count)
+        for(u = 0; u < space->extent.rank; u++)
+            count[u] = space->select.sel_info.hslab->app_diminfo[u].count;
+    if(block)
+        for(u = 0; u < space->extent.rank; u++)
+            block[u] = space->select.sel_info.hslab->app_diminfo[u].block;
+
+done:
+    FUNC_LEAVE_API(ret_value)
+}   /* H5Sget_regular_hyperslab() */
+
diff --git a/src/H5Smodule.h b/src/H5Smodule.h
new file mode 100644
index 0000000..d4d94f2
--- /dev/null
+++ b/src/H5Smodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5S package.  Including this header means that the source file
+ *		is part of the H5S package.
+ */
+#ifndef _H5Smodule_H
+#define _H5Smodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5S_MODULE
+#define H5_MY_PKG       H5S
+#define H5_MY_PKG_ERR   H5E_DATASPACE
+#define H5_MY_PKG_INIT  YES
+
+#endif /* _H5Smodule_H */
+
diff --git a/src/H5Smpio.c b/src/H5Smpio.c
index 2187f0e..1f97bc8 100644
--- a/src/H5Smpio.c
+++ b/src/H5Smpio.c
@@ -22,7 +22,7 @@
  *		I didn't make them portable.
  */
 
-#define H5S_PACKAGE		/*suppress error about including H5Spkg	  */
+#include "H5Smodule.h"          /* This source code file is part of the H5S module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -168,18 +168,23 @@ H5S_mpio_create_point_datatype (size_t elmt_size, hsize_t num_points,
     if(MPI_SUCCESS != (mpi_code = MPI_Type_contiguous((int)elmt_size, MPI_BYTE, &elmt_type)))
         HMPI_GOTO_ERROR(FAIL, "MPI_Type_contiguous failed", mpi_code)
     elmt_type_created = TRUE;
-    
+
+#if MPI_VERSION >= 3
+    /* Create an MPI datatype for the whole point selection */
+    if(MPI_SUCCESS != (mpi_code = MPI_Type_create_hindexed_block((int)num_points, 1, disp, elmt_type, new_type)))
+        HMPI_GOTO_ERROR(FAIL, "MPI_Type_create_indexed_block failed", mpi_code)
+#else
     /* Allocate block sizes for MPI datatype call */
     if(NULL == (blocks = (int *)H5MM_malloc(sizeof(int) * num_points)))
         HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate array of blocks")
 
-    /* Would be nice to have Create_Hindexed_block to avoid this array of all ones */
     for(u = 0; u < num_points; u++)
         blocks[u] = 1;
 
     /* Create an MPI datatype for the whole point selection */
     if(MPI_SUCCESS != (mpi_code = MPI_Type_create_hindexed((int)num_points, blocks, disp, elmt_type, new_type)))
         HMPI_GOTO_ERROR(FAIL, "MPI_Type_create_indexed_block failed", mpi_code)
+#endif
 
     /* Commit MPI datatype for later use */
     if(MPI_SUCCESS != (mpi_code = MPI_Type_commit(new_type)))
@@ -357,8 +362,6 @@ H5S_mpio_permute_type(const H5S_t *space, size_t elmt_size, hsize_t **permute,
     MPI_Aint *disp = NULL;      /* Datatype displacement for each point*/
     H5S_sel_iter_t sel_iter;    /* Selection iteration info */
     hbool_t sel_iter_init = FALSE;      /* Selection iteration info has been initialized */
-    hsize_t off[H5D_IO_VECTOR_SIZE];    /* Array to store sequence offsets */
-    size_t len[H5D_IO_VECTOR_SIZE];     /* Array to store sequence lengths */
     hssize_t snum_points;       /* Signed number of elements in selection */
     hsize_t num_points;         /* Number of points in the selection */
     size_t max_elem;            /* Maximum number of elements allowed in sequences */
diff --git a/src/H5Snone.c b/src/H5Snone.c
index 5016677..3492325 100644
--- a/src/H5Snone.c
+++ b/src/H5Snone.c
@@ -20,7 +20,7 @@
  * Purpose:	"None" selection data space I/O functions.
  */
 
-#define H5S_PACKAGE		/*suppress error about including H5Spkg	  */
+#include "H5Smodule.h"          /* This source code file is part of the H5S module */
 
 
 #include "H5private.h"
@@ -40,10 +40,12 @@ static herr_t H5S_none_get_seq_list(const H5S_t *space, unsigned flags,
 static herr_t H5S_none_release(H5S_t *space);
 static htri_t H5S_none_is_valid(const H5S_t *space);
 static hssize_t H5S_none_serial_size(const H5S_t *space);
-static herr_t H5S_none_serialize(const H5S_t *space, uint8_t *buf);
-static herr_t H5S_none_deserialize(H5S_t *space, const uint8_t *buf);
+static herr_t H5S_none_serialize(const H5S_t *space, uint8_t **p);
+static herr_t H5S_none_deserialize(H5S_t *space, uint32_t version, uint8_t flags,
+    const uint8_t **p);
 static herr_t H5S_none_bounds(const H5S_t *space, hsize_t *start, hsize_t *end);
 static herr_t H5S_none_offset(const H5S_t *space, hsize_t *off);
+static int H5S__none_unlim_dim(const H5S_t *space);
 static htri_t H5S_none_is_contiguous(const H5S_t *space);
 static htri_t H5S_none_is_single(const H5S_t *space);
 static htri_t H5S_none_is_regular(const H5S_t *space);
@@ -75,6 +77,8 @@ const H5S_select_class_t H5S_sel_none[1] = {{
     H5S_none_deserialize,
     H5S_none_bounds,
     H5S_none_offset,
+    H5S__none_unlim_dim,
+    NULL,
     H5S_none_is_contiguous,
     H5S_none_is_single,
     H5S_none_is_regular,
@@ -464,9 +468,11 @@ H5S_none_serial_size(const H5S_t H5_ATTR_UNUSED *space)
  PURPOSE
     Serialize the current selection into a user-provided buffer.
  USAGE
-    herr_t H5S_none_serialize(space, buf)
-        H5S_t *space;           IN: Dataspace pointer of selection to serialize
-        uint8 *buf;             OUT: Buffer to put serialized selection into
+    herr_t H5S_none_serialize(space, p)
+        const H5S_t *space;     IN: Dataspace with selection to serialize
+        uint8_t **p;            OUT: Pointer to buffer to put serialized
+                                selection.  Will be advanced to end of
+                                serialized selection.
  RETURNS
     Non-negative on success/Negative on failure
  DESCRIPTION
@@ -478,17 +484,25 @@ H5S_none_serial_size(const H5S_t H5_ATTR_UNUSED *space)
  REVISION LOG
 --------------------------------------------------------------------------*/
 static herr_t
-H5S_none_serialize(const H5S_t *space, uint8_t *buf)
+H5S_none_serialize(const H5S_t *space, uint8_t **p)
 {
+    uint8_t *pp = (*p);         /* Local pointer for decoding */
+
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
+    /* Check args */
     HDassert(space);
+    HDassert(p);
+    HDassert(pp);
 
     /* Store the preamble information */
-    UINT32ENCODE(buf, (uint32_t)H5S_GET_SELECT_TYPE(space));  /* Store the type of selection */
-    UINT32ENCODE(buf, (uint32_t)1);  /* Store the version number */
-    UINT32ENCODE(buf, (uint32_t)0);  /* Store the un-used padding */
-    UINT32ENCODE(buf, (uint32_t)0);  /* Store the additional information length */
+    UINT32ENCODE(pp, (uint32_t)H5S_GET_SELECT_TYPE(space));  /* Store the type of selection */
+    UINT32ENCODE(pp, (uint32_t)1);  /* Store the version number */
+    UINT32ENCODE(pp, (uint32_t)0);  /* Store the un-used padding */
+    UINT32ENCODE(pp, (uint32_t)0);  /* Store the additional information length */
+
+    /* Update encoding pointer */
+    *p = pp;
 
     FUNC_LEAVE_NOAPI(SUCCEED)
 }   /* H5S_none_serialize() */
@@ -500,9 +514,14 @@ H5S_none_serialize(const H5S_t *space, uint8_t *buf)
  PURPOSE
     Deserialize the current selection from a user-provided buffer.
  USAGE
-    herr_t H5S_none_deserialize(space, buf)
-        H5S_t *space;           IN/OUT: Dataspace pointer to place selection into
-        uint8 *buf;             IN: Buffer to retrieve serialized selection from
+    herr_t H5S_none_deserialize(space, version, flags, p)
+        H5S_t *space;           IN/OUT: Dataspace pointer to place
+                                selection into
+        uint32_t version        IN: Selection version
+        uint8_t flags           IN: Selection flags
+        uint8 **p;              OUT: Pointer to buffer holding serialized
+                                selection.  Will be advanced to end of
+                                serialized selection.
  RETURNS
     Non-negative on success/Negative on failure
  DESCRIPTION
@@ -514,13 +533,16 @@ H5S_none_serialize(const H5S_t *space, uint8_t *buf)
  REVISION LOG
 --------------------------------------------------------------------------*/
 static herr_t
-H5S_none_deserialize(H5S_t *space, const uint8_t H5_ATTR_UNUSED *buf)
+H5S_none_deserialize(H5S_t *space, uint32_t H5_ATTR_UNUSED version, uint8_t H5_ATTR_UNUSED flags,
+    const uint8_t H5_ATTR_UNUSED **p)
 {
     herr_t ret_value = SUCCEED;  /* return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
     HDassert(space);
+    HDassert(p);
+    HDassert(*p);
 
     /* Change to "none" selection */
     if(H5S_select_none(space) < 0)
@@ -603,6 +625,34 @@ H5S_none_offset(const H5S_t H5_ATTR_UNUSED *space, hsize_t H5_ATTR_UNUSED *offse
 

 /*--------------------------------------------------------------------------
  NAME
+    H5S__none_unlim_dim
+ PURPOSE
+    Return unlimited dimension of selection, or -1 if none
+ USAGE
+    int H5S__none_unlim_dim(space)
+        H5S_t *space;           IN: Dataspace pointer to check
+ RETURNS
+    Unlimited dimension of selection, or -1 if none (never fails).
+ DESCRIPTION
+    Returns the index of the unlimited dimension in this selection, or -1
+    if the selection has no unlimited dimension.  "None" selections cannot
+    have an unlimited dimension, so this function always returns -1.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static int
+H5S__none_unlim_dim(const H5S_t H5_ATTR_UNUSED *space)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    FUNC_LEAVE_NOAPI(-1)
+} /* end H5S__none_unlim_dim() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
     H5S_none_is_contiguous
  PURPOSE
     Check if a "none" selection is contiguous within the dataspace extent.
diff --git a/src/H5Spkg.h b/src/H5Spkg.h
index 0a9df69..e57650a 100644
--- a/src/H5Spkg.h
+++ b/src/H5Spkg.h
@@ -21,7 +21,7 @@
  *		the H5S package.  Source files outside the H5S package should
  *		include H5Sprivate.h instead.
  */
-#ifndef H5S_PACKAGE
+#if !(defined H5S_FRIEND || defined H5S_MODULE)
 #error "Do not include this file outside the H5S package!"
 #endif
 
@@ -34,6 +34,13 @@
 #define H5S_VALID_MAX	0x01
 #define H5S_VALID_PERM	0x02
 
+/* Flags for serialization of selections */
+#define H5S_SELECT_FLAG_UNLIM   0x01
+#define H5S_SELECT_FLAG_BITS    (H5S_SELECT_FLAG_UNLIM)
+
+/* Length of stack-allocated sequences for "project intersect" routines */
+#define H5S_PROJECT_INTERSECT_NSEQS 256
+
 
 /* Initial version of the dataspace information */
 #define H5O_SDSPACE_VERSION_1	1
@@ -48,6 +55,10 @@
  *      and 'size' callbacks for places to change when updating this. */
 #define H5O_SDSPACE_VERSION_LATEST H5O_SDSPACE_VERSION_2
 
+/* Maximum dimension size (highest value that is not a special value e.g.
+ * H5S_UNLIMITED) */
+#define H5S_MAX_SIZE            ((hsize_t)(hssize_t)(-2))
+
 
 /*
  * Dataspace extent information
@@ -113,6 +124,8 @@ typedef struct {
          * are only used for re-gurgitating the original values used to set the
          * hyperslab to the application when it queries the hyperslab selection
          * information. */
+    int unlim_dim;                              /* Dimension where selection is unlimited, or -1 if none */
+    hsize_t num_elem_non_unlim;                 /* # of elements in a "slice" excluding the unlimited dimension */
     H5S_hyper_span_info_t *span_lst; /* List of hyperslab span information */
 } H5S_hyper_sel_t;
 
@@ -130,13 +143,19 @@ typedef htri_t (*H5S_sel_is_valid_func_t)(const H5S_t *space);
 /* Method to determine number of bytes required to store current selection */
 typedef hssize_t (*H5S_sel_serial_size_func_t)(const H5S_t *space);
 /* Method to store current selection in "serialized" form (a byte sequence suitable for storing on disk) */
-typedef herr_t (*H5S_sel_serialize_func_t)(const H5S_t *space, uint8_t *buf);
-/* Method to store create selection from "serialized" form (a byte sequence suitable for storing on disk) */
-typedef herr_t (*H5S_sel_deserialize_func_t)(H5S_t *space, const uint8_t *buf);
+typedef herr_t (*H5S_sel_serialize_func_t)(const H5S_t *space, uint8_t **p);
+/* Method to create selection from "serialized" form (a byte sequence suitable for storing on disk) */
+typedef herr_t (*H5S_sel_deserialize_func_t)(H5S_t *space, uint32_t version, uint8_t flags,
+    const uint8_t **p);
 /* Method to determine smallest n-D bounding box containing the current selection */
 typedef herr_t (*H5S_sel_bounds_func_t)(const H5S_t *space, hsize_t *start, hsize_t *end);
 /* Method to determine linear offset of initial element in selection within dataspace */
 typedef herr_t (*H5S_sel_offset_func_t)(const H5S_t *space, hsize_t *offset);
+/* Method to get unlimited dimension of selection (or -1 for none) */
+typedef int (*H5S_sel_unlim_dim_func_t)(const H5S_t *space);
+/* Method to get the number of elements in a slice through the unlimited dimension */
+typedef herr_t (*H5S_sel_num_elem_non_unlim_func_t)(const H5S_t *space,
+    hsize_t *num_elem_non_unlim);
 /* Method to determine if current selection is contiguous */
 typedef htri_t (*H5S_sel_is_contiguous_func_t)(const H5S_t *space);
 /* Method to determine if current selection is a single block */
@@ -166,6 +185,8 @@ typedef struct {
     H5S_sel_deserialize_func_t deserialize;     /* Method to store create selection from "serialized" form (a byte sequence suitable for storing on disk) */
     H5S_sel_bounds_func_t bounds;               /* Method to determine to smallest n-D bounding box containing the current selection */
     H5S_sel_offset_func_t offset;               /* Method to determine linear offset of initial element in selection within dataspace */
+    H5S_sel_unlim_dim_func_t unlim_dim;              /* Method to get unlimited dimension of selection (or -1 for none) */
+    H5S_sel_num_elem_non_unlim_func_t num_elem_non_unlim; /* Method to get the number of elements in a slice through the unlimited dimension */
     H5S_sel_is_contiguous_func_t is_contiguous; /* Method to determine if current selection is contiguous */
     H5S_sel_is_single_func_t is_single;         /* Method to determine if current selection is a single block */
     H5S_sel_is_regular_func_t is_regular;       /* Method to determine if current selection is "regular" */
@@ -245,10 +266,14 @@ H5_DLLVAR const H5S_select_class_t H5S_sel_point[1];
 
 /* Extent functions */
 H5_DLL herr_t H5S_extent_release(H5S_extent_t *extent);
-H5_DLL herr_t H5S_extent_copy(H5S_extent_t *dst, const H5S_extent_t *src,
+H5_DLL herr_t H5S_extent_copy_real(H5S_extent_t *dst, const H5S_extent_t *src,
     hbool_t copy_max);
 
 /* Operations on selections */
+H5_DLL herr_t H5S__hyper_project_intersection(const H5S_t *src_space,
+    const H5S_t *dst_space, const H5S_t *src_intersect_space,
+    H5S_t *proj_space);
+H5_DLL herr_t H5S__hyper_subtract(H5S_t *space, H5S_t *subtract_space);
 
 /* Testing functions */
 #ifdef H5S_TESTING
diff --git a/src/H5Spoint.c b/src/H5Spoint.c
index de7a316..0f85110 100644
--- a/src/H5Spoint.c
+++ b/src/H5Spoint.c
@@ -20,7 +20,7 @@
  * Purpose:	Point selection data space I/O functions.
  */
 
-#define H5S_PACKAGE		/*suppress error about including H5Spkg	  */
+#include "H5Smodule.h"          /* This source code file is part of the H5S module */
 
 
 #include "H5private.h"		/* Generic Functions			  */
@@ -41,10 +41,12 @@ static herr_t H5S_point_get_seq_list(const H5S_t *space, unsigned flags,
 static herr_t H5S_point_release(H5S_t *space);
 static htri_t H5S_point_is_valid(const H5S_t *space);
 static hssize_t H5S_point_serial_size(const H5S_t *space);
-static herr_t H5S_point_serialize(const H5S_t *space, uint8_t *buf);
-static herr_t H5S_point_deserialize(H5S_t *space, const uint8_t *buf);
+static herr_t H5S_point_serialize(const H5S_t *space, uint8_t **p);
+static herr_t H5S_point_deserialize(H5S_t *space, uint32_t version, uint8_t flags,
+    const uint8_t **p);
 static herr_t H5S_point_bounds(const H5S_t *space, hsize_t *start, hsize_t *end);
 static herr_t H5S_point_offset(const H5S_t *space, hsize_t *off);
+static int H5S__point_unlim_dim(const H5S_t *space);
 static htri_t H5S_point_is_contiguous(const H5S_t *space);
 static htri_t H5S_point_is_single(const H5S_t *space);
 static htri_t H5S_point_is_regular(const H5S_t *space);
@@ -76,6 +78,8 @@ const H5S_select_class_t H5S_sel_point[1] = {{
     H5S_point_deserialize,
     H5S_point_bounds,
     H5S_point_offset,
+    H5S__point_unlim_dim,
+    NULL,
     H5S_point_is_contiguous,
     H5S_point_is_single,
     H5S_point_is_regular,
@@ -774,7 +778,7 @@ static hssize_t
 H5S_point_serial_size (const H5S_t *space)
 {
     H5S_pnt_node_t *curr;       /* Point information nodes */
-    hssize_t ret_value;         /* return value */
+    hssize_t ret_value = -1;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -804,9 +808,11 @@ H5S_point_serial_size (const H5S_t *space)
  PURPOSE
     Serialize the current selection into a user-provided buffer.
  USAGE
-    herr_t H5S_point_serialize(space, buf)
-        H5S_t *space;           IN: Dataspace pointer of selection to serialize
-        uint8 *buf;             OUT: Buffer to put serialized selection into
+    herr_t H5S_point_serialize(space, p)
+        const H5S_t *space;     IN: Dataspace with selection to serialize
+        uint8_t **p;            OUT: Pointer to buffer to put serialized
+                                selection.  Will be advanced to end of
+                                serialized selection.
  RETURNS
     Non-negative on success/Negative on failure
  DESCRIPTION
@@ -818,30 +824,34 @@ H5S_point_serial_size (const H5S_t *space)
  REVISION LOG
 --------------------------------------------------------------------------*/
 static herr_t
-H5S_point_serialize (const H5S_t *space, uint8_t *buf)
+H5S_point_serialize (const H5S_t *space, uint8_t **p)
 {
-    H5S_pnt_node_t *curr;   /* Point information nodes */
-    uint8_t *lenp;          /* pointer to length location for later storage */
-    uint32_t len=0;         /* number of bytes used */
-    unsigned u;                /* local counting variable */
+    H5S_pnt_node_t *curr;       /* Point information nodes */
+    uint8_t *pp = (*p);         /* Local pointer for decoding */
+    uint8_t *lenp;              /* pointer to length location for later storage */
+    uint32_t len=0;             /* number of bytes used */
+    unsigned u;                 /* local counting variable */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
+    /* Check args */
     HDassert(space);
+    HDassert(p);
+    HDassert(pp);
 
     /* Store the preamble information */
-    UINT32ENCODE(buf, (uint32_t)H5S_GET_SELECT_TYPE(space));  /* Store the type of selection */
-    UINT32ENCODE(buf, (uint32_t)1);  /* Store the version number */
-    UINT32ENCODE(buf, (uint32_t)0);  /* Store the un-used padding */
-    lenp=buf;           /* keep the pointer to the length location for later */
-    buf+=4;             /* skip over space for length */
+    UINT32ENCODE(pp, (uint32_t)H5S_GET_SELECT_TYPE(space));  /* Store the type of selection */
+    UINT32ENCODE(pp, (uint32_t)1);  /* Store the version number */
+    UINT32ENCODE(pp, (uint32_t)0);  /* Store the un-used padding */
+    lenp = pp;          /* Keep the pointer to the length location for later */
+    pp += 4;            /* Skip over space for length */
 
     /* Encode number of dimensions */
-    UINT32ENCODE(buf, (uint32_t)space->extent.rank);
+    UINT32ENCODE(pp, (uint32_t)space->extent.rank);
     len+=4;
 
     /* Encode number of elements */
-    UINT32ENCODE(buf, (uint32_t)space->select.num_elem);
+    UINT32ENCODE(pp, (uint32_t)space->select.num_elem);
     len+=4;
 
     /* Encode each point in selection */
@@ -852,7 +862,7 @@ H5S_point_serialize (const H5S_t *space, uint8_t *buf)
 
         /* Encode each point */
         for(u=0; u<space->extent.rank; u++)
-            UINT32ENCODE(buf, (uint32_t)curr->pnt[u]);
+            UINT32ENCODE(pp, (uint32_t)curr->pnt[u]);
 
         curr=curr->next;
     } /* end while */
@@ -860,6 +870,9 @@ H5S_point_serialize (const H5S_t *space, uint8_t *buf)
     /* Encode length */
     UINT32ENCODE(lenp, (uint32_t)len);  /* Store the length of the extra information */
 
+    /* Update encoding pointer */
+    *p = pp;
+
     FUNC_LEAVE_NOAPI(SUCCEED)
 }   /* H5S_point_serialize() */
 
@@ -870,9 +883,14 @@ H5S_point_serialize (const H5S_t *space, uint8_t *buf)
  PURPOSE
     Deserialize the current selection from a user-provided buffer.
  USAGE
-    herr_t H5S_point_deserialize(space, buf)
-        H5S_t *space;           IN/OUT: Dataspace pointer to place selection into
-        uint8 *buf;             IN: Buffer to retrieve serialized selection from
+    herr_t H5S_point_deserialize(space, p)
+        H5S_t *space;           IN/OUT: Dataspace pointer to place
+                                selection into
+        uint32_t version        IN: Selection version
+        uint8_t flags           IN: Selection flags
+        uint8 **p;              OUT: Pointer to buffer holding serialized
+                                selection.  Will be advanced to end of
+                                serialized selection.
  RETURNS
     Non-negative on success/Negative on failure
  DESCRIPTION
@@ -884,27 +902,28 @@ H5S_point_serialize (const H5S_t *space, uint8_t *buf)
  REVISION LOG
 --------------------------------------------------------------------------*/
 static herr_t
-H5S_point_deserialize (H5S_t *space, const uint8_t *buf)
+H5S_point_deserialize(H5S_t *space, uint32_t H5_ATTR_UNUSED version, uint8_t H5_ATTR_UNUSED flags,
+    const uint8_t **p)
 {
-    H5S_seloper_t op=H5S_SELECT_SET;    /* Selection operation */
-    uint32_t rank;           /* Rank of points */
-    size_t num_elem=0;      /* Number of elements in selection */
-    hsize_t *coord=NULL, *tcoord;   /* Pointer to array of elements */
+    H5S_seloper_t op = H5S_SELECT_SET;  /* Selection operation */
+    hsize_t *coord = NULL, *tcoord;     /* Pointer to array of elements */
+    const uint8_t *pp = (*p);   /* Local pointer for decoding */
+    size_t num_elem = 0;        /* Number of elements in selection */
+    unsigned rank;              /* Rank of points */
     unsigned i, j;              /* local counting variables */
-    herr_t ret_value = SUCCEED; /* return value */
+    herr_t ret_value = SUCCEED; /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
     /* Check args */
     HDassert(space);
-    HDassert(buf);
+    HDassert(p);
+    HDassert(pp);
 
     /* Deserialize points to select */
-    buf += 16;    /* Skip over selection header */
-    UINT32DECODE(buf, rank);  /* decode the rank of the point selection */
-    if(rank != space->extent.rank)
-        HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "rank of pointer does not match dataspace")
-    UINT32DECODE(buf, num_elem);  /* decode the number of points */
+    /* (The header and rank have already beed decoded) */
+    rank = space->extent.rank;  /* Retrieve rank from space */
+    UINT32DECODE(pp, num_elem); /* decode the number of points */
 
     /* Allocate space for the coordinates */
     if(NULL == (coord = (hsize_t *)H5MM_malloc(num_elem * rank * sizeof(hsize_t))))
@@ -913,12 +932,15 @@ H5S_point_deserialize (H5S_t *space, const uint8_t *buf)
     /* Retrieve the coordinates from the buffer */
     for(tcoord = coord, i = 0; i < num_elem; i++)
         for(j = 0; j < (unsigned)rank; j++, tcoord++)
-            UINT32DECODE(buf, *tcoord);
+            UINT32DECODE(pp, *tcoord);
 
     /* Select points */
     if(H5S_select_elements(space, op, num_elem, (const hsize_t *)coord) < 0)
         HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
 
+    /* Update decoding pointer */
+    *p = pp;
+
 done:
     /* Free the coordinate array if necessary */
     if(coord != NULL)
@@ -1182,6 +1204,35 @@ done:
 

 /*--------------------------------------------------------------------------
  NAME
+    H5S__point_unlim_dim
+ PURPOSE
+    Return unlimited dimension of selection, or -1 if none
+ USAGE
+    int H5S__point_unlim_dim(space)
+        H5S_t *space;           IN: Dataspace pointer to check
+ RETURNS
+    Unlimited dimension of selection, or -1 if none (never fails).
+ DESCRIPTION
+    Returns the index of the unlimited dimension in this selection, or -1
+    if the selection has no unlimited dimension.  Currently point
+    selections cannot have an unlimited dimension, so this function always
+    returns -1.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+static int
+H5S__point_unlim_dim(const H5S_t H5_ATTR_UNUSED *space)
+{
+    FUNC_ENTER_STATIC_NOERR
+
+    FUNC_LEAVE_NOAPI(-1)
+} /* end H5S__point_unlim_dim() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
     H5S_point_is_contiguous
  PURPOSE
     Check if a point selection is contiguous within the dataspace extent.
@@ -1204,7 +1255,7 @@ done:
 static htri_t
 H5S_point_is_contiguous(const H5S_t *space)
 {
-    htri_t ret_value;  /* return value */
+    htri_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1241,7 +1292,7 @@ H5S_point_is_contiguous(const H5S_t *space)
 static htri_t
 H5S_point_is_single(const H5S_t *space)
 {
-    htri_t ret_value;  /* return value */
+    htri_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1281,7 +1332,7 @@ H5S_point_is_single(const H5S_t *space)
 static htri_t
 H5S_point_is_regular(const H5S_t *space)
 {
-    htri_t ret_value;  /* return value */
+    htri_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
diff --git a/src/H5Sprivate.h b/src/H5Sprivate.h
index 81b30f7..b00dc6b 100644
--- a/src/H5Sprivate.h
+++ b/src/H5Sprivate.h
@@ -140,7 +140,7 @@ typedef struct H5S_sel_iter_op_t {
 } H5S_sel_iter_op_t;
 
 /* If the module using this macro is allowed access to the private variables, access them directly */
-#ifdef H5S_PACKAGE
+#ifdef H5S_MODULE
 #define H5S_GET_EXTENT_TYPE(S)          ((S)->extent.type)
 #define H5S_GET_EXTENT_NDIMS(S)         ((S)->extent.rank)
 #define H5S_GET_EXTENT_NPOINTS(S)       ((S)->extent.nelem)
@@ -166,7 +166,7 @@ typedef struct H5S_sel_iter_op_t {
 #define H5S_SELECT_ITER_NEXT(ITER,NELEM)((*(ITER)->type->iter_next)(ITER,NELEM))
 #define H5S_SELECT_ITER_NEXT_BLOCK(ITER)        ((*(ITER)->type->iter_next_block)(ITER))
 #define H5S_SELECT_ITER_RELEASE(ITER)   ((*(ITER)->type->iter_release)(ITER))
-#else /* H5S_PACKAGE */
+#else /* H5S_MODULE */
 #define H5S_GET_EXTENT_TYPE(S)          (H5S_get_simple_extent_type(S))
 #define H5S_GET_EXTENT_NDIMS(S)         (H5S_get_simple_extent_ndims(S))
 #define H5S_GET_EXTENT_NPOINTS(S)       (H5S_get_simple_extent_npoints(S))
@@ -192,7 +192,7 @@ typedef struct H5S_sel_iter_op_t {
 #define H5S_SELECT_ITER_NEXT(ITER,NELEM)(H5S_select_iter_next(ITER,NELEM))
 #define H5S_SELECT_ITER_NEXT_BLOCK(ITER)        (H5S_select_iter_next_block(ITER))
 #define H5S_SELECT_ITER_RELEASE(ITER)   (H5S_select_iter_release(ITER))
-#endif /* H5S_PACKAGE */
+#endif /* H5S_MODULE */
 /* Handle these two callbacks in a special way, since they have prologs that need to be executed */
 #define H5S_SELECT_COPY(DST,SRC,SHARE)  (H5S_select_copy(DST,SRC,SHARE))
 #define H5S_SELECT_DESERIALIZE(S,BUF)   (H5S_select_deserialize(S,BUF))
@@ -214,10 +214,14 @@ H5_DLL herr_t H5S_append(H5F_t *f, hid_t dxpl_id, struct H5O_t *oh, H5S_t *ds);
 H5_DLL H5S_t *H5S_read(const struct H5O_loc_t *loc, hid_t dxpl_id);
 H5_DLL htri_t H5S_set_extent(H5S_t *space, const hsize_t *size);
 H5_DLL herr_t H5S_set_extent_real(H5S_t *space, const hsize_t *size);
+H5_DLL herr_t H5S_set_extent_simple(H5S_t *space, unsigned rank,
+    const hsize_t *dims, const hsize_t *max);
 H5_DLL H5S_t *H5S_create(H5S_class_t type);
 H5_DLL H5S_t *H5S_create_simple(unsigned rank, const hsize_t dims[/*rank*/],
     const hsize_t maxdims[/*rank*/]);
 H5_DLL herr_t H5S_set_latest_version(H5S_t *ds);
+H5_DLL herr_t H5S_encode(H5S_t *obj, unsigned char **p, size_t *nalloc);
+H5_DLL H5S_t *H5S_decode(const unsigned char **p);
 H5_DLL herr_t H5S_debug(H5F_t *f, hid_t dxpl_id, const void *_mesg, FILE *stream,
     int indent, int fwidth);
 #ifndef H5_NO_DEPRECATED_SYMBOLS
@@ -228,9 +232,10 @@ H5_DLL int H5S_extend(H5S_t *space, const hsize_t *size);
 H5_DLL hsize_t H5S_extent_nelem(const H5S_extent_t *ext);
 H5_DLL int H5S_extent_get_dims(const H5S_extent_t *ext, hsize_t dims[], hsize_t max_dims[]);
 H5_DLL htri_t H5S_extent_equal(const H5S_t *ds1, const H5S_t *ds2);
+H5_DLL herr_t H5S_extent_copy(H5S_t *dst, const H5S_t *src);
 
 /* Operations on selections */
-H5_DLL herr_t H5S_select_deserialize(H5S_t *space, const uint8_t *buf);
+H5_DLL herr_t H5S_select_deserialize(H5S_t **space, const uint8_t **p);
 H5_DLL H5S_sel_type H5S_get_select_type(const H5S_t *space);
 H5_DLL herr_t H5S_select_iterate(void *buf, const H5T_t *type, const H5S_t *space,
     const H5S_sel_iter_op_t *op, void *op_data);
@@ -240,6 +245,9 @@ H5_DLL htri_t H5S_select_valid(const H5S_t *space);
 H5_DLL hssize_t H5S_get_select_npoints(const H5S_t *space);
 H5_DLL herr_t H5S_get_select_bounds(const H5S_t *space, hsize_t *start, hsize_t *end);
 H5_DLL herr_t H5S_get_select_offset(const H5S_t *space, hsize_t *offset);
+H5_DLL int H5S_get_select_unlim_dim(const H5S_t *space);
+H5_DLL herr_t H5S_get_select_num_elem_non_unlim(const H5S_t *space,
+    hsize_t *num_elem_non_unlim);
 H5_DLL herr_t H5S_select_offset(H5S_t *space, const hssize_t *offset);
 H5_DLL herr_t H5S_select_copy(H5S_t *dst, const H5S_t *src, hbool_t share_selection);
 H5_DLL htri_t H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2);
@@ -251,13 +259,17 @@ H5_DLL herr_t H5S_select_get_seq_list(const H5S_t *space, unsigned flags,
     H5S_sel_iter_t *iter, size_t maxseq, size_t maxbytes,
     size_t *nseq, size_t *nbytes, hsize_t *off, size_t *len);
 H5_DLL hssize_t H5S_select_serial_size(const H5S_t *space);
-H5_DLL herr_t H5S_select_serialize(const H5S_t *space, uint8_t *buf);
+H5_DLL herr_t H5S_select_serialize(const H5S_t *space, uint8_t **p);
 H5_DLL htri_t H5S_select_is_contiguous(const H5S_t *space);
 H5_DLL htri_t H5S_select_is_single(const H5S_t *space);
 H5_DLL htri_t H5S_select_is_regular(const H5S_t *space);
 H5_DLL herr_t H5S_select_adjust_u(H5S_t *space, const hsize_t *offset);
 H5_DLL herr_t H5S_select_project_scalar(const H5S_t *space, hsize_t *offset);
 H5_DLL herr_t H5S_select_project_simple(const H5S_t *space, H5S_t *new_space, hsize_t *offset);
+H5_DLL herr_t H5S_select_project_intersection(const H5S_t *src_space,
+    const H5S_t *dst_space, const H5S_t *src_intersect_space,
+    H5S_t **new_space_ptr);
+H5_DLL herr_t H5S_select_subtract(H5S_t *space, H5S_t *subtract_space);
 
 /* Operations on all selections */
 H5_DLL herr_t H5S_select_all(H5S_t *space, hbool_t rel_prev);
@@ -283,6 +295,15 @@ H5_DLL htri_t H5S_hyper_intersect_block (H5S_t *space, hsize_t *start, hsize_t *
 H5_DLL herr_t H5S_hyper_adjust_s(H5S_t *space, const hssize_t *offset);
 H5_DLL htri_t H5S_hyper_normalize_offset(H5S_t *space, hssize_t *old_offset);
 H5_DLL herr_t H5S_hyper_denormalize_offset(H5S_t *space, const hssize_t *old_offset);
+H5_DLL herr_t H5S_hyper_clip_unlim(H5S_t *space, hsize_t clip_size);
+H5_DLL hsize_t H5S_hyper_get_clip_extent(const H5S_t *clip_space,
+    const H5S_t *match_space, hbool_t incl_trail);
+H5_DLL hsize_t H5S_hyper_get_clip_extent_match(const H5S_t *clip_space,
+    const H5S_t *match_space, hsize_t match_clip_size, hbool_t incl_trail);
+H5_DLL H5S_t *H5S_hyper_get_unlim_block(const H5S_t *space,
+    hsize_t block_index);
+H5_DLL hsize_t H5S_hyper_get_first_inc_block(const H5S_t *space,
+    hsize_t clip_size, hbool_t *partial);
 
 /* Operations on selection iterators */
 H5_DLL herr_t H5S_select_iter_init(H5S_sel_iter_t *iter, const H5S_t *space, size_t elmt_size);
diff --git a/src/H5Spublic.h b/src/H5Spublic.h
index 097bf30..721c4bf 100644
--- a/src/H5Spublic.h
+++ b/src/H5Spublic.h
@@ -25,7 +25,7 @@
 
 /* Define atomic datatypes */
 #define H5S_ALL         (hid_t)0
-#define H5S_UNLIMITED	((hsize_t)(hssize_t)(-1))
+#define H5S_UNLIMITED   HSIZE_UNDEF
 
 /* Define user-level maximum number of dimensions */
 #define H5S_MAX_RANK    32
@@ -114,6 +114,8 @@ H5_DLL herr_t H5Sselect_hyperslab(hid_t space_id, H5S_seloper_t op,
 				   const hsize_t count[],
 				   const hsize_t _block[]);
 /* #define NEW_HYPERSLAB_API */
+/* Note that these haven't been working for a while and were never
+ *      publicly released - QAK */
 #ifdef NEW_HYPERSLAB_API
 H5_DLL hid_t H5Scombine_hyperslab(hid_t space_id, H5S_seloper_t op,
 				   const hsize_t start[],
@@ -135,6 +137,9 @@ H5_DLL herr_t H5Sselect_all(hid_t spaceid);
 H5_DLL herr_t H5Sselect_none(hid_t spaceid);
 H5_DLL herr_t H5Soffset_simple(hid_t space_id, const hssize_t *offset);
 H5_DLL htri_t H5Sselect_valid(hid_t spaceid);
+H5_DLL htri_t H5Sis_regular_hyperslab(hid_t spaceid);
+H5_DLL htri_t H5Sget_regular_hyperslab(hid_t spaceid, hsize_t start[],
+    hsize_t stride[], hsize_t count[], hsize_t block[]);
 H5_DLL hssize_t H5Sget_select_hyper_nblocks(hid_t spaceid);
 H5_DLL hssize_t H5Sget_select_elem_npoints(hid_t spaceid);
 H5_DLL herr_t H5Sget_select_hyper_blocklist(hid_t spaceid, hsize_t startblock,
diff --git a/src/H5Sselect.c b/src/H5Sselect.c
index d5cee57..d4a4d69 100644
--- a/src/H5Sselect.c
+++ b/src/H5Sselect.c
@@ -19,7 +19,7 @@
  * Purpose:	Dataspace selection functions.
  */
 
-#define H5S_PACKAGE		/*suppress error about including H5Spkg	  */
+#include "H5Smodule.h"          /* This source code file is part of the H5S module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -107,7 +107,7 @@ H5S_select_offset(H5S_t *space, const hssize_t *offset)
 herr_t
 H5S_select_copy (H5S_t *dst, const H5S_t *src, hbool_t share_selection)
 {
-    herr_t ret_value;     /* return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -148,7 +148,7 @@ done:
 herr_t
 H5S_select_release(H5S_t *ds)
 {
-    herr_t ret_value;   /* Return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -185,7 +185,7 @@ H5S_select_get_seq_list(const H5S_t *space, unsigned flags,
     H5S_sel_iter_t *iter, size_t maxseq, size_t maxbytes,
     size_t *nseq, size_t *nbytes, hsize_t *off, size_t *len)
 {
-    herr_t ret_value;   /* Return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -220,7 +220,7 @@ H5S_select_get_seq_list(const H5S_t *space, unsigned flags,
 hssize_t
 H5S_select_serial_size(const H5S_t *space)
 {
-    hssize_t ret_value;   /* Return value */
+    hssize_t ret_value = -1;   /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -239,9 +239,11 @@ H5S_select_serial_size(const H5S_t *space)
  PURPOSE
     Serialize the selection for a dataspace into a buffer
  USAGE
-    herr_t H5S_select_serialize(space, buf)
+    herr_t H5S_select_serialize(space, p)
         const H5S_t *space;     IN: Dataspace with selection to serialize
-        uint8_t *buf;           OUT: Buffer to put serialized selection
+        uint8_t **p;            OUT: Pointer to buffer to put serialized
+                                selection.  Will be advanced to end of
+                                serialized selection.
  RETURNS
     Non-negative on success/Negative on failure
  DESCRIPTION
@@ -256,17 +258,17 @@ H5S_select_serial_size(const H5S_t *space)
  REVISION LOG
 --------------------------------------------------------------------------*/
 herr_t
-H5S_select_serialize(const H5S_t *space, uint8_t *buf)
+H5S_select_serialize(const H5S_t *space, uint8_t **p)
 {
     herr_t ret_value=SUCCEED;   /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
     HDassert(space);
-    HDassert(buf);
+    HDassert(p);
 
     /* Call the selection type's serialize function */
-    ret_value=(*space->select.type->serialize)(space,buf);
+    ret_value=(*space->select.type->serialize)(space,p);
 
     FUNC_LEAVE_NOAPI(ret_value)
 }   /* end H5S_select_serialize() */
@@ -409,7 +411,7 @@ done:
 htri_t
 H5S_select_valid(const H5S_t *space)
 {
-    htri_t ret_value;   /* Return value */
+    htri_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -428,9 +430,13 @@ H5S_select_valid(const H5S_t *space)
     Deserialize the current selection from a user-provided buffer into a real
         selection in the dataspace.
  USAGE
-    herr_t H5S_select_deserialize(space, buf)
-        H5S_t *space;           IN/OUT: Dataspace pointer to place selection into
-        uint8 *buf;             IN: Buffer to retrieve serialized selection from
+    herr_t H5S_select_deserialize(space, p)
+        H5S_t **space;          IN/OUT: Dataspace pointer to place
+                                selection into.  Will be allocated if not
+                                provided.
+        uint8 **p;              OUT: Pointer to buffer holding serialized
+                                selection.  Will be advanced to end of
+                                serialized selection.
  RETURNS
     Non-negative on success/Negative on failure
  DESCRIPTION
@@ -444,42 +450,103 @@ H5S_select_valid(const H5S_t *space)
  REVISION LOG
 --------------------------------------------------------------------------*/
 herr_t
-H5S_select_deserialize (H5S_t *space, const uint8_t *buf)
+H5S_select_deserialize(H5S_t **space, const uint8_t **p)
 {
-    const uint8_t *tbuf;    /* Temporary pointer to the selection type */
-    uint32_t sel_type;       /* Pointer to the selection type */
-    herr_t ret_value=FAIL;  /* return value */
+    H5S_t *tmp_space = NULL;    /* Pointer to actual dataspace to use, either
+                                 *space or a newly allocated one */
+    uint32_t sel_type;          /* Pointer to the selection type */
+    uint32_t version;           /* Version number */
+    uint8_t flags = 0;          /* Flags */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
     HDassert(space);
 
-    tbuf=buf;
-    UINT32DECODE(tbuf, sel_type);
+    /* Allocate space if not provided */
+    if(!*space) {
+        if(NULL == (tmp_space = H5S_create(H5S_SIMPLE)))
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "can't create dataspace")
+    } /* end if */
+    else
+        tmp_space = *space;
+
+    /* Decode selection type */
+    UINT32DECODE(*p, sel_type);
+
+    /* Decode version */
+    UINT32DECODE(*p, version);
+
+    if(version >= (uint32_t)2) {
+        /* Decode flags */
+        flags = *(*p)++;
+
+        /* Check for unknown flags */
+        if(flags & ~H5S_SELECT_FLAG_BITS)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTLOAD, FAIL, "unknown flag for selection")
+
+        /* Skip over the remainder of the header */
+        *p += 4;
+    } /* end if */
+    else
+        /* Skip over the remainder of the header */
+        *p += 8;
+
+    /* Decode and check or patch rank for point and hyperslab selections */
+    if((sel_type == H5S_SEL_POINTS) || (sel_type == H5S_SEL_HYPERSLABS)) {
+        uint32_t rank;              /* Rank of dataspace */
+
+        /* Decode the rank of the point selection */
+        UINT32DECODE(*p,rank);
+
+        if(!*space) {
+            hsize_t dims[H5S_MAX_RANK];
+
+            /* Patch the rank of the allocated dataspace */
+            (void)HDmemset(dims, 0, (size_t)rank * sizeof(dims[0]));
+            if(H5S_set_extent_simple(tmp_space, rank, dims, NULL) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "can't set dimensions")
+        } /* end if */
+        else
+            /* Verify the rank of the provided dataspace */
+            if(rank != tmp_space->extent.rank)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "rank of serialized selection does not match dataspace")
+    } /* end if */
+
+    /* Make routine for selection type */
     switch(sel_type) {
         case H5S_SEL_POINTS:         /* Sequence of points selected */
-            ret_value=(*H5S_sel_point->deserialize)(space,buf);
+            ret_value = (*H5S_sel_point->deserialize)(tmp_space, version, flags, p);
             break;
 
         case H5S_SEL_HYPERSLABS:     /* Hyperslab selection defined */
-            ret_value=(*H5S_sel_hyper->deserialize)(space,buf);
+            ret_value = (*H5S_sel_hyper->deserialize)(tmp_space, version, flags, p);
             break;
 
         case H5S_SEL_ALL:            /* Entire extent selected */
-            ret_value=(*H5S_sel_all->deserialize)(space,buf);
+            ret_value = (*H5S_sel_all->deserialize)(tmp_space, version, flags, p);
             break;
 
         case H5S_SEL_NONE:           /* Nothing selected */
-            ret_value=(*H5S_sel_none->deserialize)(space,buf);
+            ret_value = (*H5S_sel_none->deserialize)(tmp_space, version, flags, p);
             break;
 
         default:
             break;
     }
-    if(ret_value<0)
+    if(ret_value < 0)
         HGOTO_ERROR(H5E_DATASPACE, H5E_CANTLOAD, FAIL, "can't deserialize selection")
 
+    /* Return space to the caller if allocated */
+    if(!*space)
+        *space = tmp_space;
+
 done:
+    /* Free temporary space if not passed to caller (only happens on error) */
+    if(!*space && tmp_space)
+        if(H5S_close(tmp_space) < 0)
+            HDONE_ERROR(H5E_DATASPACE, H5E_CANTFREE, FAIL, "can't close dataspace")
+
     FUNC_LEAVE_NOAPI(ret_value)
 }   /* H5S_select_deserialize() */
 
@@ -566,7 +633,7 @@ done:
 herr_t
 H5S_get_select_bounds(const H5S_t *space, hsize_t *start, hsize_t *end)
 {
-    herr_t ret_value;        /* return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -607,7 +674,7 @@ H5S_get_select_bounds(const H5S_t *space, hsize_t *start, hsize_t *end)
 herr_t
 H5S_get_select_offset(const H5S_t *space, hsize_t *offset)
 {
-    herr_t ret_value;        /* return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -623,6 +690,89 @@ H5S_get_select_offset(const H5S_t *space, hsize_t *offset)
 

 /*--------------------------------------------------------------------------
  NAME
+    H5S_get_select_unlim_dim
+ PURPOSE
+    Gets the unlimited dimension in the selection, or -1 if there is no
+    unlimited dimension.
+ USAGE
+    int H5S_get_select_unlim_dim(space)
+        const H5S_t *space;     IN: Dataspace pointer of selection to query
+ RETURNS
+    Unlimited dimension in the selection, or -1 if there is no unlimited
+    dimension (never fails)
+ DESCRIPTION
+    Gets the unlimited dimension in the selection, or -1 if there is no
+    unlimited dimension.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+        Currently only implemented for hyperslab selections, all others
+        simply return -1.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+int
+H5S_get_select_unlim_dim(const H5S_t *space)
+{
+    herr_t ret_value = FAIL;    /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Check args */
+    HDassert(space);
+
+    ret_value = (*space->select.type->unlim_dim)(space);
+
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_get_select_unlim_dim() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_get_select_num_elem_non_unlim
+ PURPOSE
+    Gets the number of elements in the non-unlimited dimensions
+ USAGE
+    herr_t H5S_get_select_num_elem_non_unlim(space,num_elem_non_unlim)
+        H5S_t *space;           IN: Dataspace pointer to check
+        hsize_t *num_elem_non_unlim; OUT: Number of elements in the non-unlimited dimensions
+ RETURNS
+    Non-negative on success/Negative on failure
+ DESCRIPTION
+    Returns the number of elements in a slice through the non-unlimited
+    dimensions of the selection.  Fails if the selection has no unlimited
+    dimension.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_get_select_num_elem_non_unlim(const H5S_t *space,
+    hsize_t *num_elem_non_unlim)
+{
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Check args */
+    HDassert(space);
+    HDassert(num_elem_non_unlim);
+
+    /* Check for selection callback */
+    if(!space->select.type->num_elem_non_unlim)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "selection type has no num_elem_non_unlim callback")
+
+    /* Make selection callback */
+    if((*space->select.type->num_elem_non_unlim)(space, num_elem_non_unlim) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOUNT, FAIL, "can't get number of elements in non-unlimited dimension")
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+}   /* H5S_get_select_unlim_dim() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
     H5S_select_is_contiguous
  PURPOSE
     Determines if a selection is contiguous in the dataspace
@@ -645,7 +795,7 @@ H5S_get_select_offset(const H5S_t *space, hsize_t *offset)
 htri_t
 H5S_select_is_contiguous(const H5S_t *space)
 {
-    herr_t ret_value;        /* return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -682,7 +832,7 @@ H5S_select_is_contiguous(const H5S_t *space)
 htri_t
 H5S_select_is_single(const H5S_t *space)
 {
-    herr_t ret_value;        /* return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -719,7 +869,7 @@ H5S_select_is_single(const H5S_t *space)
 htri_t
 H5S_select_is_regular(const H5S_t *space)
 {
-    herr_t ret_value;        /* return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -756,7 +906,7 @@ H5S_select_is_regular(const H5S_t *space)
 herr_t
 H5S_select_adjust_u(H5S_t *space, const hsize_t *offset)
 {
-    herr_t ret_value;        /* return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -794,7 +944,7 @@ H5S_select_adjust_u(H5S_t *space, const hsize_t *offset)
 herr_t
 H5S_select_project_scalar(const H5S_t *space, hsize_t *offset)
 {
-    herr_t ret_value;        /* Return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -834,7 +984,7 @@ H5S_select_project_scalar(const H5S_t *space, hsize_t *offset)
 herr_t
 H5S_select_project_simple(const H5S_t *space, H5S_t *new_space, hsize_t *offset)
 {
-    herr_t ret_value;        /* Return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -869,7 +1019,7 @@ H5S_select_project_simple(const H5S_t *space, H5S_t *new_space, hsize_t *offset)
 herr_t
 H5S_select_iter_init(H5S_sel_iter_t *sel_iter, const H5S_t *space, size_t elmt_size)
 {
-    herr_t ret_value;   /* Return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -924,7 +1074,7 @@ H5S_select_iter_init(H5S_sel_iter_t *sel_iter, const H5S_t *space, size_t elmt_s
 herr_t
 H5S_select_iter_coords(const H5S_sel_iter_t *sel_iter, hsize_t *coords)
 {
-    herr_t ret_value;         /* return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1006,7 +1156,7 @@ H5S_select_iter_block(const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end)
 hsize_t
 H5S_select_iter_nelmts(const H5S_sel_iter_t *sel_iter)
 {
-    hsize_t ret_value;         /* return value */
+    hsize_t ret_value = 0;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1085,7 +1235,7 @@ H5S_select_iter_has_next_block(const H5S_sel_iter_t *iter)
 herr_t
 H5S_select_iter_next(H5S_sel_iter_t *iter, size_t nelem)
 {
-    herr_t ret_value;         /* return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1168,7 +1318,7 @@ H5S_select_iter_next_block(H5S_sel_iter_t *iter)
 herr_t
 H5S_select_iter_release(H5S_sel_iter_t *sel_iter)
 {
-    herr_t ret_value;         /* return value */
+    herr_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1393,7 +1543,7 @@ done:
 H5S_sel_type
 H5S_get_select_type(const H5S_t *space)
 {
-    H5S_sel_type        ret_value;       /* Return value */
+    H5S_sel_type        ret_value = H5S_SEL_ERROR;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -2064,3 +2214,189 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 }   /* H5S_select_fill() */
 
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_project_intersection
+
+ PURPOSE
+    Projects the intersection of of the selections of src_space and
+    src_intersect_space within the selection of src_space as a selection
+    within the selection of dst_space
+
+ USAGE
+    herr_t H5S_select_project_intersection(src_space,dst_space,src_intersect_space,proj_space)
+        H5S_t *src_space;       IN: Selection that is mapped to dst_space, and intersected with src_intersect_space
+        H5S_t *dst_space;       IN: Selection that is mapped to src_space, and which contains the result
+        H5S_t *src_intersect_space; IN: Selection whose intersection with src_space is projected to dst_space to obtain the result
+        H5S_t *proj_space;      OUT: Will contain the result (intersection of src_intersect_space and src_space projected from src_space to dst_space) after the operation
+
+ RETURNS
+    Non-negative on success/Negative on failure.
+
+ DESCRIPTION
+    Projects the intersection of of the selections of src_space and
+    src_intersect_space within the selection of src_space as a selection
+    within the selection of dst_space.  The result is placed in the
+    selection of proj_space.
+    
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_project_intersection(const H5S_t *src_space, const H5S_t *dst_space,
+    const H5S_t *src_intersect_space, H5S_t **new_space_ptr)
+{
+    H5S_t *new_space = NULL;           /* New dataspace constructed */
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(src_space);
+    HDassert(dst_space);
+    HDassert(src_intersect_space);
+    HDassert(new_space_ptr);
+
+    /* Create new space, using dst extent.  Start with "all" selection. */
+    if(NULL == (new_space = H5S_create(H5S_SIMPLE)))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "unable to create output dataspace")
+    if(H5S_extent_copy_real(&new_space->extent, &dst_space->extent, TRUE) < 0)
+        HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "unable to copy destination space extent")
+
+    /* If the intersecting space is "all", the intersection must be equal to the
+     * source space and the projection must be equal to the destination space */
+    if(src_intersect_space->select.type->type == H5S_SEL_ALL) {
+        /* Copy the destination selection. */
+        if(H5S_select_copy(new_space, dst_space, FALSE) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "can't copy destination space selection")
+    } /* end if */
+    /* If any of the spaces are "none", the projection must also be "none" */
+    else if((src_intersect_space->select.type->type == H5S_SEL_NONE)
+            || (src_space->select.type->type == H5S_SEL_NONE)
+            || (dst_space->select.type->type == H5S_SEL_NONE)) {
+        /* Change to "none" selection */
+        if(H5S_select_none(new_space) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
+    } /* end if */
+    /* If any of the spaces use point selection, fall back to general algorithm
+     */
+    else if((src_intersect_space->select.type->type == H5S_SEL_POINTS)
+            || (src_space->select.type->type == H5S_SEL_POINTS)
+            || (dst_space->select.type->type == H5S_SEL_POINTS))
+        HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "point selections not currently supported")
+    else {
+        HDassert(src_intersect_space->select.type->type == H5S_SEL_HYPERSLABS);
+        /* Intersecting space is hyperslab selection.  Call the hyperslab
+         * routine to project to another hyperslab selection. */
+        if(H5S__hyper_project_intersection(src_space, dst_space, src_intersect_space, new_space) < 0)
+            HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCLIP, FAIL, "can't project hyperslab ondot destination selection")
+    } /* end else */
+
+    /* load the address of the new space into *new_space_ptr */
+    *new_space_ptr = new_space;
+
+done:
+    /* Cleanup on error */
+    if(ret_value < 0) {
+        if(new_space && H5S_close(new_space) < 0)
+            HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release dataspace")
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5S_select_project_intersection() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5S_select_subtract
+
+ PURPOSE
+    Subtract one selection from another
+
+ USAGE
+    herr_t H5S_select_subtract(space,subtract_space)
+        H5S_t *space;           IN/OUT: Selection to be operated on
+        H5S_t *subtract_space;  IN: Selection that will be subtracted from space
+
+ RETURNS
+    Non-negative on success/Negative on failure.
+
+ DESCRIPTION
+    Removes any and all portions of space that are also present in
+    subtract_space.  In essence, performs an A_NOT_B operation with the
+    two selections.
+    
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_subtract(H5S_t *space, H5S_t *subtract_space)
+{
+    herr_t ret_value = SUCCEED;         /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity checks */
+    HDassert(space);
+    HDassert(subtract_space);
+
+    /* If either space is using the none selection, then we do not need to do
+     * anything */
+    if((space->select.type->type != H5S_SEL_NONE)
+            && (subtract_space->select.type->type != H5S_SEL_NONE)) {
+        /* If subtract_space is using the all selection, set space to none */
+        if(subtract_space->select.type->type == H5S_SEL_ALL) {
+            /* Change to "none" selection */
+            if(H5S_select_none(space) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
+        } /* end if */
+        else {
+            /* Check for point selection in subtract_space, convert to
+             * hyperslab */
+            if(subtract_space->select.type->type == H5S_SEL_POINTS)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "point selections not currently supported")
+
+            /* Check for point or all selection in space, convert to hyperslab
+             */
+            if(space->select.type->type == H5S_SEL_ALL) {
+                /* Convert current "all" selection to "real" hyperslab selection */
+                /* Then allow operation to proceed */
+                hsize_t tmp_start[H5O_LAYOUT_NDIMS];    /* Temporary start information */
+                hsize_t tmp_stride[H5O_LAYOUT_NDIMS];   /* Temporary stride information */
+                hsize_t tmp_count[H5O_LAYOUT_NDIMS];    /* Temporary count information */
+                hsize_t tmp_block[H5O_LAYOUT_NDIMS];    /* Temporary block information */
+                unsigned i;                             /* Local index variable */
+
+                /* Fill in temporary information for the dimensions */
+                for(i = 0; i < space->extent.rank; i++) {
+                    tmp_start[i] = 0;
+                    tmp_stride[i] = 1;
+                    tmp_count[i] = 1;
+                    tmp_block[i] = space->extent.size[i];
+                } /* end for */
+
+                /* Convert to hyperslab selection */
+                if(H5S_select_hyperslab(space, H5S_SELECT_SET, tmp_start, tmp_stride, tmp_count, tmp_block) < 0)
+                    HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSELECT, FAIL, "can't convert selection")
+            } /* end if */
+            else if(space->select.type->type == H5S_SEL_POINTS)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "point selections not currently supported")
+
+            HDassert(space->select.type->type == H5S_SEL_HYPERSLABS);
+            HDassert(subtract_space->select.type->type == H5S_SEL_HYPERSLABS);
+
+            /* Both spaces are now hyperslabs, perform the operation */
+            if(H5S__hyper_subtract(space, subtract_space) < 0)
+                HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCLIP, FAIL, "can't subtract hyperslab")
+        } /* end else */
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* H5S_select_subtract() */
+
diff --git a/src/H5Stest.c b/src/H5Stest.c
index 62a4179..e1f4b61 100644
--- a/src/H5Stest.c
+++ b/src/H5Stest.c
@@ -19,7 +19,7 @@
  * Purpose:	Dataspace selection testing functions.
  */
 
-#define H5S_PACKAGE		/*suppress error about including H5Spkg	  */
+#include "H5Smodule.h"          /* This source code file is part of the H5S module */
 #define H5S_TESTING		/*suppress warning about H5S testing funcs*/
 
 
@@ -54,7 +54,7 @@ H5S_select_shape_same_test(hid_t sid1, hid_t sid2)
 {
     H5S_t	*space1;                /* Pointer to 1st dataspace */
     H5S_t	*space2;                /* Pointer to 2nd dataspace */
-    htri_t      ret_value;              /* Return value */
+    htri_t      ret_value = FAIL;       /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -95,7 +95,7 @@ htri_t
 H5S_get_rebuild_status_test(hid_t space_id)
 {
     H5S_t *space;               /* Pointer to 1st dataspace */
-    htri_t ret_value;           /* Return value */
+    htri_t ret_value = FAIL;    /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
diff --git a/src/H5T.c b/src/H5T.c
index 29d8f40..030f5a7 100644
--- a/src/H5T.c
+++ b/src/H5T.c
@@ -1,4 +1,3 @@
-
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  * Copyright by The HDF Group.                                               *
  * Copyright by the Board of Trustees of the University of Illinois.         *
@@ -25,10 +24,7 @@
 /* Module Setup */
 /****************/
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5T_init_interface
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 /***********/
@@ -289,8 +285,6 @@ static herr_t H5T_unregister(H5T_pers_t pers, const char *name, H5T_t *src,
 static herr_t H5T_register(H5T_pers_t pers, const char *name, H5T_t *src,
         H5T_t *dst, H5T_conv_t func, hid_t dxpl_id, hbool_t api_call);
 static htri_t H5T_compiler_conv(H5T_t *src, H5T_t *dst);
-static herr_t H5T_encode(H5T_t *obj, unsigned char *buf, size_t *nalloc);
-static H5T_t *H5T_decode(const unsigned char *buf);
 static herr_t H5T_set_size(H5T_t *dt, size_t size);
 
 
@@ -306,12 +300,15 @@ H5T_order_t H5T_native_order_g = H5T_ORDER_ERROR;
 /* Package Variables */
 /*********************/
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 /*
  * Predefined data types. These are initialized at runtime in H5Tinit.c and
- * by H5T_init_interface() in this source file.
+ * by H5T__init_package() in this source file.
  *
  * If more of these are added, the new ones must be added to the list of
- * types to reset in H5T_term_interface().
+ * types to reset in H5T_term_package().
  */
 hid_t H5T_IEEE_F32BE_g			= FAIL;
 hid_t H5T_IEEE_F32LE_g			= FAIL;
@@ -526,11 +523,14 @@ H5FL_DEFINE_STATIC(H5T_path_t);
 /* Datatype ID class */
 static const H5I_class_t H5I_DATATYPE_CLS[1] = {{
     H5I_DATATYPE,		/* ID class value */
-    H5I_CLASS_REUSE_IDS,	/* Class flags */
+    0,				/* Class flags */
     8,				/* # of reserved IDs for class */
     (H5I_free_t)H5T_close	/* Callback routine for closing objects of this class */
 }};
 
+/* Flag indicating "top" of interface has been initialized */
+static hbool_t H5T_top_package_initialize_s = FALSE;
+
 
 

 /*-------------------------------------------------------------------------
@@ -539,48 +539,42 @@ static const H5I_class_t H5I_DATATYPE_CLS[1] = {{
  * Purpose:	Initialize the interface from some other package.
  *
  * Return:	Success:	non-negative
- *
  *		Failure:	negative
  *
  * Programmer:	Robb Matzke
  *              Wednesday, December 16, 1998
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 herr_t
 H5T_init(void)
 {
-    herr_t ret_value=SUCCEED;   /* Return value */
+    herr_t ret_value = SUCCEED;   /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
     /* FUNC_ENTER() does all the work */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5T_init() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5T_init_inf
+ * Function:	H5T__init_inf
  *
  * Purpose:	Initialize the +/- Infinity floating-poing values for type
  *              conversion.
  *
  * Return:	Success:	non-negative
- *
  *		Failure:	negative
  *
  * Programmer:	Quincey Koziol
  *              Saturday, November 22, 2003
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static herr_t
-H5T_init_inf(void)
+H5T__init_inf(void)
 {
     H5T_t	*dst_p;		/* Datatype type operate on */
     H5T_atomic_t *dst;		/* Datatype's atomic info */
@@ -589,7 +583,7 @@ H5T_init_inf(void)
     size_t      u;              /* Local index value */
     herr_t ret_value = SUCCEED; /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_STATIC
 
     /* Get the float datatype */
     if(NULL == (dst_p = (H5T_t *)H5I_object(H5T_NATIVE_FLOAT_g)))
@@ -675,63 +669,22 @@ H5T_init_inf(void)
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5T_init_inf() */
-
-

-/*-------------------------------------------------------------------------
- * Function:	H5T_init_hw
- *
- * Purpose:	Perform hardware specific [floating-point] initialization
- *
- * Return:	Success:	non-negative
- *		Failure:	negative
- *
- * Programmer:	Quincey Koziol
- *              Monday, November 24, 2003
- *
- *-------------------------------------------------------------------------
- */
-static herr_t
-H5T_init_hw(void)
-{
-#ifdef H5_HAVE_GET_FPC_CSR
-    union fpc_csr csr;          /* Union to hold results of floating-point status register query */
-#endif /* H5_HAVE_GET_FPC_CSR */
-    herr_t ret_value = SUCCEED;   /* Return value */
-
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-#ifdef H5_HAVE_GET_FPC_CSR
-    /* [This code is specific to SGI machines] */
-
-    /* Get the floating-point status register */
-    csr.fc_word = get_fpc_csr();
-
-    /* If the "flush denormalized values to zero" flag is set, unset it */
-    if(csr.fc_struct.flush) {
-        csr.fc_struct.flush = 0;
-        set_fpc_csr(csr.fc_word);
-    } /* end if */
-#endif /* H5_HAVE_GET_FPC_CSR */
-
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5T_init_hw() */
+} /* end H5T__init_inf() */
 
 

 /*--------------------------------------------------------------------------
 NAME
-   H5T_init_interface -- Initialize interface-specific information
+   H5T__init_package -- Initialize interface-specific information
 USAGE
-    herr_t H5T_init_interface()
-
+    herr__t H5T_init_package()
 RETURNS
     Non-negative on success/Negative on failure
 DESCRIPTION
     Initializes any interface-specific data or routines.
 
 --------------------------------------------------------------------------*/
-static herr_t
-H5T_init_interface(void)
+herr_t
+H5T__init_package(void)
 {
     H5T_t       *native_schar=NULL;     /* Datatype structure for native signed char */
     H5T_t       *native_uchar=NULL;     /* Datatype structure for native unsigned char */
@@ -779,17 +732,13 @@ H5T_init_interface(void)
 
     /* Make certain there aren't too many classes of datatypes defined */
     /* Only 16 (numbered 0-15) are supported in the current file format */
-    HDassert(H5T_NCLASSES < 16);
-
-    /* Perform any necessary hardware initializations */
-    if(H5T_init_hw() < 0)
-	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to initialize interface")
+    HDcompile_assert(H5T_NCLASSES < 16);
 
     /*
      * Initialize pre-defined native datatypes from code generated during
      * the library configuration by H5detect.
      */
-    if(H5TN_init_interface() < 0)
+    if(H5T__init_native() < 0)
 	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to initialize interface")
 
     /* Get the atomic datatype structures needed by the initialization code below */
@@ -852,7 +801,7 @@ H5T_init_interface(void)
     H5T_INIT_TYPE(OFFSET,H5T_NATIVE_HERR_g,COPY,native_int,SET,sizeof(herr_t))
 
     /* hbool_t */
-    H5T_INIT_TYPE(OFFSET,H5T_NATIVE_HBOOL_g,COPY,native_int,SET,sizeof(hbool_t))
+    H5T_INIT_TYPE(OFFSET,H5T_NATIVE_HBOOL_g,COPY,native_uint,SET,sizeof(hbool_t))
 
     /*------------------------------------------------------------
      * IEEE Types
@@ -1006,7 +955,7 @@ H5T_init_interface(void)
 
     /* One-byte character string */
     H5T_INIT_TYPE(CSTRING, H5T_C_S1_g, ALLOC, -, SET, 1)
-    string=dt;    /* Keep type for later */
+    string = dt;    /* Keep type for later */
 
     /*------------------------------------------------------------
      * The `Fortran' architecture
@@ -1023,7 +972,7 @@ H5T_init_interface(void)
 
     /* Object reference (i.e. object header address in file) */
     H5T_INIT_TYPE(OBJREF, H5T_STD_REF_OBJ_g, ALLOC, -, SET, H5R_OBJ_REF_BUF_SIZE)
-    objref=dt;    /* Keep type for later */
+    objref = dt;    /* Keep type for later */
 
     /* Dataset Region reference (i.e. selection inside a dataset) */
     H5T_INIT_TYPE(REGREF, H5T_STD_REF_DSETREG_g, ALLOC, -, SET, H5R_DSET_REG_REF_BUF_SIZE)
@@ -1265,6 +1214,7 @@ H5T_init_interface(void)
     status |= H5T_register(H5T_PERS_HARD, "dbl_uint", native_double, native_uint, H5T__conv_double_uint, H5AC_ind_dxpl_id, FALSE);
     status |= H5T_register(H5T_PERS_HARD, "ldbl_uint", native_ldouble, native_uint, H5T__conv_ldouble_uint, H5AC_ind_dxpl_id, FALSE);
 
+    /* From floats to long */
     status |= H5T_register(H5T_PERS_HARD, "flt_long", native_float, native_long, H5T__conv_float_long, H5AC_ind_dxpl_id, FALSE);
     status |= H5T_register(H5T_PERS_HARD, "dbl_long", native_double, native_long, H5T__conv_double_long, H5AC_ind_dxpl_id, FALSE);
     status |= H5T_register(H5T_PERS_HARD, "ldbl_long", native_ldouble, native_long, H5T__conv_ldouble_long, H5AC_ind_dxpl_id, FALSE);
@@ -1296,13 +1246,13 @@ H5T_init_interface(void)
     status |= H5T_register(H5T_PERS_HARD, "no-op", native_int, native_int, H5T__conv_noop, H5AC_ind_dxpl_id, FALSE);
 
     /* Initialize the +/- Infinity values for floating-point types */
-    status |= H5T_init_inf();
+    status |= H5T__init_inf();
 
-    if (status<0)
+    if(status < 0)
 	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to register conversion function(s)")
 
     /* Register datatype creation property class properties here.  See similar
-     * code in H5D_init_interface(), etc. for example.
+     * code in H5D__init_package(), etc. for example.
      */
 
     /* Only register the default property list if it hasn't been created yet */
@@ -1315,6 +1265,9 @@ H5T_init_interface(void)
              HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "can't insert property into class")
     } /* end if */
 
+    /* Mark "top" of interface as initialized, too */
+    H5T_top_package_initialize_s = TRUE;
+
 done:
     /* General cleanup */
     if(compound != NULL)
@@ -1340,11 +1293,11 @@ done:
     } /* end if */
 
     FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5T_init_interface() */
+} /* end H5T__init_package() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5T_unlock_cb
+ * Function:	H5T__unlock_cb
  *
  * Purpose:	Clear the immutable flag for a datatype.  This function is
  *		called when the library is closing in order to unlock all
@@ -1358,198 +1311,252 @@ done:
  *-------------------------------------------------------------------------
  */
 static int
-H5T_unlock_cb(void *_dt, hid_t H5_ATTR_UNUSED id, void H5_ATTR_UNUSED *key)
+H5T__unlock_cb(void *_dt, hid_t H5_ATTR_UNUSED id, void *_udata)
 {
     H5T_t	*dt = (H5T_t *)_dt;
+    int *n = (int *)_udata;
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_STATIC_NOERR
 
-    HDassert (dt && dt->shared);
-    if (H5T_STATE_IMMUTABLE==dt->shared->state)
+    HDassert(dt && dt->shared);
+
+    if(H5T_STATE_IMMUTABLE==dt->shared->state) {
 	dt->shared->state = H5T_STATE_RDONLY;
 
+        (*n)++;
+    } /* end if */
+
     FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5T_unlock_cb() */
+} /* end H5T__unlock_cb() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5T_term_interface
+ * Function:	H5T_top_term_package
  *
- * Purpose:	Close this interface.
+ * Purpose:	Close the "top" of the interface, releasing IDs, etc.
  *
  * Return:	Success:	Positive if any action might have caused a
- *				change in some other interface; zero
- *				otherwise.
- *
+ *				change in some other interface; zero otherwise.
  * 		Failure:	Negative
  *
- * Programmer:	Robb Matzke
- *              Friday, November 20, 1998
+ * Programmer:	Quincey Koziol
+ *              Thursday, September 10, 2015
  *
  *-------------------------------------------------------------------------
  */
 int
-H5T_term_interface(void)
+H5T_top_term_package(void)
 {
     int	n = 0;
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
-    if(H5_interface_initialize_g) {
-        int i, nprint = 0;
-
+    if(H5T_top_package_initialize_s) {
 	/* Unregister all conversion functions */
-	for(i = 0; i < H5T_g.npaths; i++) {
-            H5T_path_t *path;
-
-	    path = H5T_g.path[i];
-	    HDassert(path);
-	    if(path->func) {
-		H5T__print_stats(path, &nprint/*in,out*/);
-		path->cdata.command = H5T_CONV_FREE;
-		if((path->func)((hid_t)FAIL, (hid_t)FAIL, &(path->cdata), (size_t)0,
-                        (size_t)0, (size_t)0, NULL, NULL,H5AC_ind_dxpl_id) < 0) {
+	if(H5T_g.path) {
+            int i, nprint = 0;
+
+            for(i = 0; i < H5T_g.npaths; i++) {
+                H5T_path_t *path;
+
+                path = H5T_g.path[i];
+                HDassert(path);
+                if(path->func) {
+                    H5T__print_stats(path, &nprint/*in,out*/);
+                    path->cdata.command = H5T_CONV_FREE;
+                    if((path->func)((hid_t)FAIL, (hid_t)FAIL, &(path->cdata), (size_t)0,
+                            (size_t)0, (size_t)0, NULL, NULL,H5AC_ind_dxpl_id) < 0) {
 #ifdef H5T_DEBUG
-		    if (H5DEBUG(T)) {
-			fprintf(H5DEBUG(T), "H5T: conversion function "
-				 "0x%08lx failed to free private data for "
-				 "%s (ignored)\n",
-				 (unsigned long)(path->func), path->name);
-		    } /* end if */
+                        if (H5DEBUG(T)) {
+                            fprintf(H5DEBUG(T), "H5T: conversion function "
+                                     "0x%08lx failed to free private data for "
+                                     "%s (ignored)\n",
+                                     (unsigned long)(path->func), path->name);
+                        } /* end if */
 #endif
-		    H5E_clear_stack(NULL); /*ignore the error*/
-		} /* end if */
-	    } /* end if */
+                        H5E_clear_stack(NULL); /*ignore the error*/
+                    } /* end if */
+                } /* end if */
 
-            if(path->src)
-                H5T_close(path->src);
-            if(path->dst)
-                H5T_close(path->dst);
-            path = H5FL_FREE(H5T_path_t, path);
-	    H5T_g.path[i] = NULL;
-	} /* end for */
+                if(path->src)
+                    H5T_close(path->src);
+                if(path->dst)
+                    H5T_close(path->dst);
+                path = H5FL_FREE(H5T_path_t, path);
+                H5T_g.path[i] = NULL;
+            } /* end for */
+
+            /* Clear conversion tables */
+            H5T_g.path = (H5T_path_t **)H5MM_xfree(H5T_g.path);
+            H5T_g.npaths = 0;
+            H5T_g.apaths = 0;
+            H5T_g.soft = (H5T_soft_t *)H5MM_xfree(H5T_g.soft);
+            H5T_g.nsoft = 0;
+            H5T_g.asoft = 0;
 
-	/* Clear conversion tables */
-	H5T_g.path = (H5T_path_t **)H5MM_xfree(H5T_g.path);
-	H5T_g.npaths = 0;
-	H5T_g.apaths = 0;
-	H5T_g.soft = (H5T_soft_t *)H5MM_xfree(H5T_g.soft);
-	H5T_g.nsoft = 0;
-	H5T_g.asoft = 0;
+            n++;
+        } /* end if */
 
 	/* Unlock all datatypes, then free them */
 	/* note that we are ignoring the return value from H5I_iterate() */
-	H5I_iterate(H5I_DATATYPE, H5T_unlock_cb, NULL, FALSE);
-
-        /* Close deprecated interface */
-        n += H5T__term_deprec_interface();
+        /* Also note that we are incrementing 'n' in the callback */
+	H5I_iterate(H5I_DATATYPE, H5T__unlock_cb, &n, FALSE);
 
-        /* Destroy the datatype object id group */
-	(void)H5I_dec_type_ref(H5I_DATATYPE);
-	n++; /*H5I*/
+        /* Release all datatype IDs */
+	if(H5I_nmembers(H5I_DATATYPE) > 0) {
+	    (void)H5I_clear_type(H5I_DATATYPE, FALSE, FALSE);
+            n++; /*H5I*/
+	} /* end if */
 
         /* Reset all the datatype IDs */
-        H5T_IEEE_F32BE_g			= FAIL;
-        H5T_IEEE_F32LE_g			= FAIL;
-        H5T_IEEE_F64BE_g			= FAIL;
-        H5T_IEEE_F64LE_g			= FAIL;
-
-        H5T_STD_I8BE_g			= FAIL;
-        H5T_STD_I8LE_g			= FAIL;
-        H5T_STD_I16BE_g			= FAIL;
-        H5T_STD_I16LE_g			= FAIL;
-        H5T_STD_I32BE_g			= FAIL;
-        H5T_STD_I32LE_g			= FAIL;
-        H5T_STD_I64BE_g			= FAIL;
-        H5T_STD_I64LE_g			= FAIL;
-        H5T_STD_U8BE_g			= FAIL;
-        H5T_STD_U8LE_g			= FAIL;
-        H5T_STD_U16BE_g			= FAIL;
-        H5T_STD_U16LE_g			= FAIL;
-        H5T_STD_U32BE_g			= FAIL;
-        H5T_STD_U32LE_g			= FAIL;
-        H5T_STD_U64BE_g			= FAIL;
-        H5T_STD_U64LE_g			= FAIL;
-        H5T_STD_B8BE_g			= FAIL;
-        H5T_STD_B8LE_g			= FAIL;
-        H5T_STD_B16BE_g			= FAIL;
-        H5T_STD_B16LE_g			= FAIL;
-        H5T_STD_B32BE_g			= FAIL;
-        H5T_STD_B32LE_g			= FAIL;
-        H5T_STD_B64BE_g			= FAIL;
-        H5T_STD_B64LE_g 			= FAIL;
-        H5T_STD_REF_OBJ_g 		= FAIL;
-        H5T_STD_REF_DSETREG_g 		= FAIL;
-
-        H5T_UNIX_D32BE_g			= FAIL;
-        H5T_UNIX_D32LE_g			= FAIL;
-        H5T_UNIX_D64BE_g			= FAIL;
-        H5T_UNIX_D64LE_g 			= FAIL;
-
-        H5T_C_S1_g			= FAIL;
-
-        H5T_FORTRAN_S1_g			= FAIL;
-
-        H5T_NATIVE_SCHAR_g		= FAIL;
-        H5T_NATIVE_UCHAR_g		= FAIL;
-        H5T_NATIVE_SHORT_g		= FAIL;
-        H5T_NATIVE_USHORT_g		= FAIL;
-        H5T_NATIVE_INT_g			= FAIL;
-        H5T_NATIVE_UINT_g			= FAIL;
-        H5T_NATIVE_LONG_g			= FAIL;
-        H5T_NATIVE_ULONG_g		= FAIL;
-        H5T_NATIVE_LLONG_g		= FAIL;
-        H5T_NATIVE_ULLONG_g		= FAIL;
-        H5T_NATIVE_FLOAT_g		= FAIL;
-        H5T_NATIVE_DOUBLE_g		= FAIL;
+        if(H5T_IEEE_F32BE_g > 0) {
+            H5T_IEEE_F32BE_g			= FAIL;
+            H5T_IEEE_F32LE_g			= FAIL;
+            H5T_IEEE_F64BE_g			= FAIL;
+            H5T_IEEE_F64LE_g			= FAIL;
+
+            H5T_STD_I8BE_g			= FAIL;
+            H5T_STD_I8LE_g			= FAIL;
+            H5T_STD_I16BE_g			= FAIL;
+            H5T_STD_I16LE_g			= FAIL;
+            H5T_STD_I32BE_g			= FAIL;
+            H5T_STD_I32LE_g			= FAIL;
+            H5T_STD_I64BE_g			= FAIL;
+            H5T_STD_I64LE_g			= FAIL;
+            H5T_STD_U8BE_g			= FAIL;
+            H5T_STD_U8LE_g			= FAIL;
+            H5T_STD_U16BE_g			= FAIL;
+            H5T_STD_U16LE_g			= FAIL;
+            H5T_STD_U32BE_g			= FAIL;
+            H5T_STD_U32LE_g			= FAIL;
+            H5T_STD_U64BE_g			= FAIL;
+            H5T_STD_U64LE_g			= FAIL;
+            H5T_STD_B8BE_g			= FAIL;
+            H5T_STD_B8LE_g			= FAIL;
+            H5T_STD_B16BE_g			= FAIL;
+            H5T_STD_B16LE_g			= FAIL;
+            H5T_STD_B32BE_g			= FAIL;
+            H5T_STD_B32LE_g			= FAIL;
+            H5T_STD_B64BE_g			= FAIL;
+            H5T_STD_B64LE_g 			= FAIL;
+            H5T_STD_REF_OBJ_g 			= FAIL;
+            H5T_STD_REF_DSETREG_g 		= FAIL;
+
+            H5T_UNIX_D32BE_g			= FAIL;
+            H5T_UNIX_D32LE_g			= FAIL;
+            H5T_UNIX_D64BE_g			= FAIL;
+            H5T_UNIX_D64LE_g 			= FAIL;
+
+            H5T_C_S1_g				= FAIL;
+
+            H5T_FORTRAN_S1_g			= FAIL;
+
+            H5T_NATIVE_SCHAR_g			= FAIL;
+            H5T_NATIVE_UCHAR_g			= FAIL;
+            H5T_NATIVE_SHORT_g			= FAIL;
+            H5T_NATIVE_USHORT_g			= FAIL;
+            H5T_NATIVE_INT_g			= FAIL;
+            H5T_NATIVE_UINT_g			= FAIL;
+            H5T_NATIVE_LONG_g			= FAIL;
+            H5T_NATIVE_ULONG_g			= FAIL;
+            H5T_NATIVE_LLONG_g			= FAIL;
+            H5T_NATIVE_ULLONG_g			= FAIL;
+            H5T_NATIVE_FLOAT_g			= FAIL;
+            H5T_NATIVE_DOUBLE_g			= FAIL;
 #if H5_SIZEOF_LONG_DOUBLE !=0
-        H5T_NATIVE_LDOUBLE_g		= FAIL;
+            H5T_NATIVE_LDOUBLE_g		= FAIL;
 #endif
-        H5T_NATIVE_B8_g			= FAIL;
-        H5T_NATIVE_B16_g			= FAIL;
-        H5T_NATIVE_B32_g			= FAIL;
-        H5T_NATIVE_B64_g			= FAIL;
-        H5T_NATIVE_OPAQUE_g		= FAIL;
-        H5T_NATIVE_HADDR_g		= FAIL;
-        H5T_NATIVE_HSIZE_g		= FAIL;
-        H5T_NATIVE_HSSIZE_g		= FAIL;
-        H5T_NATIVE_HERR_g			= FAIL;
-        H5T_NATIVE_HBOOL_g		= FAIL;
-
-        H5T_NATIVE_INT8_g			= FAIL;
-        H5T_NATIVE_UINT8_g		= FAIL;
-        H5T_NATIVE_INT_LEAST8_g		= FAIL;
-        H5T_NATIVE_UINT_LEAST8_g		= FAIL;
-        H5T_NATIVE_INT_FAST8_g		= FAIL;
-        H5T_NATIVE_UINT_FAST8_g		= FAIL;
-
-        H5T_NATIVE_INT16_g		= FAIL;
-        H5T_NATIVE_UINT16_g		= FAIL;
-        H5T_NATIVE_INT_LEAST16_g		= FAIL;
-        H5T_NATIVE_UINT_LEAST16_g		= FAIL;
-        H5T_NATIVE_INT_FAST16_g		= FAIL;
-        H5T_NATIVE_UINT_FAST16_g		= FAIL;
-
-        H5T_NATIVE_INT32_g		= FAIL;
-        H5T_NATIVE_UINT32_g		= FAIL;
-        H5T_NATIVE_INT_LEAST32_g		= FAIL;
-        H5T_NATIVE_UINT_LEAST32_g		= FAIL;
-        H5T_NATIVE_INT_FAST32_g		= FAIL;
-        H5T_NATIVE_UINT_FAST32_g		= FAIL;
-
-        H5T_NATIVE_INT64_g		= FAIL;
-        H5T_NATIVE_UINT64_g		= FAIL;
-        H5T_NATIVE_INT_LEAST64_g		= FAIL;
-        H5T_NATIVE_UINT_LEAST64_g		= FAIL;
-        H5T_NATIVE_INT_FAST64_g		= FAIL;
-        H5T_NATIVE_UINT_FAST64_g		= FAIL;
+            H5T_NATIVE_B8_g			= FAIL;
+            H5T_NATIVE_B16_g			= FAIL;
+            H5T_NATIVE_B32_g			= FAIL;
+            H5T_NATIVE_B64_g			= FAIL;
+            H5T_NATIVE_OPAQUE_g			= FAIL;
+            H5T_NATIVE_HADDR_g			= FAIL;
+            H5T_NATIVE_HSIZE_g			= FAIL;
+            H5T_NATIVE_HSSIZE_g			= FAIL;
+            H5T_NATIVE_HERR_g			= FAIL;
+            H5T_NATIVE_HBOOL_g			= FAIL;
+
+            H5T_NATIVE_INT8_g			= FAIL;
+            H5T_NATIVE_UINT8_g			= FAIL;
+            H5T_NATIVE_INT_LEAST8_g		= FAIL;
+            H5T_NATIVE_UINT_LEAST8_g		= FAIL;
+            H5T_NATIVE_INT_FAST8_g		= FAIL;
+            H5T_NATIVE_UINT_FAST8_g		= FAIL;
+
+            H5T_NATIVE_INT16_g			= FAIL;
+            H5T_NATIVE_UINT16_g			= FAIL;
+            H5T_NATIVE_INT_LEAST16_g		= FAIL;
+            H5T_NATIVE_UINT_LEAST16_g		= FAIL;
+            H5T_NATIVE_INT_FAST16_g		= FAIL;
+            H5T_NATIVE_UINT_FAST16_g		= FAIL;
+
+            H5T_NATIVE_INT32_g			= FAIL;
+            H5T_NATIVE_UINT32_g			= FAIL;
+            H5T_NATIVE_INT_LEAST32_g		= FAIL;
+            H5T_NATIVE_UINT_LEAST32_g		= FAIL;
+            H5T_NATIVE_INT_FAST32_g		= FAIL;
+            H5T_NATIVE_UINT_FAST32_g		= FAIL;
+
+            H5T_NATIVE_INT64_g			= FAIL;
+            H5T_NATIVE_UINT64_g			= FAIL;
+            H5T_NATIVE_INT_LEAST64_g		= FAIL;
+            H5T_NATIVE_UINT_LEAST64_g		= FAIL;
+            H5T_NATIVE_INT_FAST64_g		= FAIL;
+            H5T_NATIVE_UINT_FAST64_g		= FAIL;
+
+            n++;
+        } /* end if */
+
+	/* Mark "top" of interface as closed */
+        if(0 == n)
+            H5T_top_package_initialize_s = FALSE;
+    } /* end if */
+
+    FUNC_LEAVE_NOAPI(n)
+} /* end H5T_top_term_package() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5T_term_package
+ *
+ * Purpose:	Close this interface.
+ *
+ * Note:	Finishes shutting down the interface, after
+ *		H5T_top_term_package() is called
+ *
+ * Return:	Success:	Positive if any action might have caused a
+ *				change in some other interface; zero
+ *				otherwise.
+ * 		Failure:	Negative
+ *
+ * Programmer:	Robb Matzke
+ *              Friday, November 20, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+H5T_term_package(void)
+{
+    int	n = 0;
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_PKG_INIT_VAR) {
+        /* Sanity check */
+        HDassert(0 == H5I_nmembers(H5I_DATATYPE));
+        HDassert(FALSE == H5T_top_package_initialize_s);
+
+        /* Destroy the datatype object id group */
+	n += (H5I_dec_type_ref(H5I_DATATYPE) > 0);
 
 	/* Mark interface as closed */
-	H5_interface_initialize_g = 0;
+        if(0 == n)
+            H5_PKG_INIT_VAR = FALSE;
     } /* end if */
 
     FUNC_LEAVE_NOAPI(n)
-} /* end H5T_term_interface() */
+} /* end H5T_term_package() */
 
 

 /*-------------------------------------------------------------------------
@@ -1867,7 +1874,7 @@ done:
 H5T_class_t
 H5T_get_class(const H5T_t *dt, htri_t internal)
 {
-    H5T_class_t ret_value;
+    H5T_class_t ret_value = H5T_NO_CLASS;       /* Return value */
 
     FUNC_ENTER_NOAPI(H5T_NO_CLASS)
 
@@ -2854,7 +2861,7 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
+herr_t
 H5T_encode(H5T_t *obj, unsigned char *buf, size_t *nalloc)
 {
     size_t      buf_size;               /* Encoded size of datatype */
@@ -2911,11 +2918,11 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-static H5T_t *
+H5T_t *
 H5T_decode(const unsigned char *buf)
 {
-    H5F_t       *f = NULL;      /* Fake file structure*/
-    H5T_t       *ret_value;     /* Return value */
+    H5F_t *f = NULL;            /* Fake file structure*/
+    H5T_t *ret_value = NULL;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -3118,7 +3125,7 @@ H5T_copy(H5T_t *old_dt, H5T_copy_t method)
     H5T_shared_t    *reopened_fo = NULL;
     unsigned	i;
     char	*s;
-    H5T_t	*ret_value;
+    H5T_t       *ret_value = NULL;    /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -3447,7 +3454,7 @@ H5T_t *
 H5T__alloc(void)
 {
     H5T_t *dt = NULL;           /* Pointer to datatype allocated */
-    H5T_t *ret_value;           /* Return value */
+    H5T_t *ret_value = NULL;    /* Return value */
 
     FUNC_ENTER_PACKAGE
 
@@ -3534,21 +3541,23 @@ H5T__free(H5T_t *dt)
     switch(dt->shared->type) {
         case H5T_COMPOUND:
             for(i = 0; i < dt->shared->u.compnd.nmembs; i++) {
-                H5MM_xfree(dt->shared->u.compnd.memb[i].name);
+                dt->shared->u.compnd.memb[i].name = (char *)H5MM_xfree(dt->shared->u.compnd.memb[i].name);
                 H5T_close(dt->shared->u.compnd.memb[i].type);
             } /* end for */
-            H5MM_xfree(dt->shared->u.compnd.memb);
+            dt->shared->u.compnd.memb = (H5T_cmemb_t *)H5MM_xfree(dt->shared->u.compnd.memb);
+            dt->shared->u.compnd.nmembs = 0;
             break;
 
         case H5T_ENUM:
             for(i = 0; i < dt->shared->u.enumer.nmembs; i++)
-                H5MM_xfree(dt->shared->u.enumer.name[i]);
-            H5MM_xfree(dt->shared->u.enumer.name);
-            H5MM_xfree(dt->shared->u.enumer.value);
+                dt->shared->u.enumer.name[i] = (char *)H5MM_xfree(dt->shared->u.enumer.name[i]);
+            dt->shared->u.enumer.name = (char **)H5MM_xfree(dt->shared->u.enumer.name);
+            dt->shared->u.enumer.value = (uint8_t *)H5MM_xfree(dt->shared->u.enumer.value);
+            dt->shared->u.enumer.nmembs = 0;
             break;
 
         case H5T_OPAQUE:
-            H5MM_xfree(dt->shared->u.opaque.tag);
+            dt->shared->u.opaque.tag = (char *)H5MM_xfree(dt->shared->u.opaque.tag);
             break;
 
         case H5T_NO_CLASS:
@@ -3564,11 +3573,13 @@ H5T__free(H5T_t *dt)
         default:
             break;
     } /* end switch */
+    dt->shared->type = H5T_NO_CLASS;
 
     /* Close the parent */
     HDassert(dt->shared->parent != dt);
     if(dt->shared->parent && H5T_close(dt->shared->parent) < 0)
 	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCLOSEOBJ, FAIL, "unable to close parent data type")
+    dt->shared->parent = NULL;
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -3586,25 +3597,13 @@ done:
  * Programmer:	Robb Matzke
  *		Monday, December  8, 1997
  *
- * Modifications:
- *      Robb Matzke, 1999-04-27
- *      This function fails if the datatype state is IMMUTABLE.
- *
- *      Robb Matzke, 1999-05-20
- *      Closes opaque types also.
- *
- *      Pedro Vicente, <pvn at ncsa.uiuc.edu> 22 Aug 2002
- *      Added "ID to name" support
- *
- *      Quincey Koziol, 2003-01-06
- *      Moved "guts" of function to H5T__free()
- *
  *-------------------------------------------------------------------------
  */
 herr_t
 H5T_close(H5T_t *dt)
 {
-    herr_t      ret_value = SUCCEED;       /* Return value */
+    hbool_t 	corked;			/* Whether the named datatype is corked or not */
+    herr_t      ret_value = SUCCEED;   	/* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -3614,11 +3613,22 @@ H5T_close(H5T_t *dt)
         dt->shared->fo_count--;
 
     if(dt->shared->state != H5T_STATE_OPEN || dt->shared->fo_count == 0) {
+	/* Uncork cache entries with object address tag for named datatype only */
+	if(dt->shared->state == H5T_STATE_OPEN && dt->shared->fo_count == 0) {
+	    if(H5AC_cork(dt->oloc.file, dt->oloc.addr, H5AC__GET_CORKED, &corked) < 0)
+		HGOTO_ERROR(H5E_ATOM, H5E_SYSTEM, FAIL, "unable to retrieve an object's cork status")
+	    if(corked) {
+		if(H5AC_cork(dt->oloc.file, dt->oloc.addr, H5AC__UNCORK, NULL) < 0)
+		    HGOTO_ERROR(H5E_OHDR, H5E_SYSTEM, FAIL, "unable to uncork an object")
+	    } /* end if */
+	} /* end if */
+
         if(H5T__free(dt) < 0)
             HGOTO_ERROR(H5E_DATATYPE, H5E_CANTFREE, FAIL, "unable to free datatype");
 
         dt->shared = H5FL_FREE(H5T_shared_t, dt->shared);
-    } else {
+    } /* end if */
+    else {
         /*
          * If a named type is being closed then close the object header and
          * remove from the list of open objects in the file.
@@ -3643,7 +3653,7 @@ H5T_close(H5T_t *dt)
                     HGOTO_ERROR(H5E_DATATYPE, H5E_CANTRELEASE, FAIL, "problem attempting to free location")
         } /* end if */
 
-        /* Free the group hier. path since we're not calling H5T__free*/
+        /* Free the group hier. path since we're not calling H5T__free() */
         H5G_name_free(&(dt->path));
     } /* end else */
 
@@ -4377,7 +4387,7 @@ done:
  *              function like H5Tregister() is calling this function to
  *              register a new hard conversion function, IS_API is TRUE
  *              and the old path is replaced.  If a private function like
- *              H5T_init_interface() is trying to register hard conversions,
+ *              H5T__init_package() is trying to register hard conversions,
  *              IS_API is FALSE and the old hard path is not replaced.
  *              Tuesday, Sept 13, 2005
  *
@@ -4396,13 +4406,15 @@ H5T_path_find(const H5T_t *src, const H5T_t *dst, const char *name,
     hid_t	src_id = -1, dst_id = -1;	/*src and dst type identifiers	*/
     int	i;			/*counter			*/
     int	nprint = 0;		/*lines of output printed	*/
-    H5T_path_t	*ret_value;	/*return value			*/
+    H5T_path_t	*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
     /* Sanity check */
     HDassert(src);
+    HDassert(src->shared);
     HDassert(dst);
+    HDassert(dst->shared);
 
     /*
      * Make sure the first entry in the table is the no-op conversion path.
@@ -4755,7 +4767,7 @@ static htri_t
 H5T_compiler_conv(H5T_t *src, H5T_t *dst)
 {
     H5T_path_t	*path;
-    htri_t	ret_value;
+    htri_t	ret_value = FAIL;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -5047,7 +5059,7 @@ done:
 htri_t
 H5T_is_sensible(const H5T_t *dt)
 {
-    htri_t	ret_value;
+    htri_t	ret_value = FAIL;       /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -5452,3 +5464,75 @@ done:
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5T_patch_file() */
 
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Tflush
+ *
+ * Purpose:     Flushes all buffers associated with a named datatype to disk.
+ *
+ * Return:      Non-negative on success, negative on failure
+ *
+ * Programmer:  Mike McGreevy
+ *              May 19, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Tflush(hid_t type_id)
+{
+    H5T_t *dt; /* Datatype for this operation */
+    herr_t ret_value = SUCCEED; /* return value */
+
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", type_id);
+    
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if(!H5T_is_named(dt))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a committed datatype")
+
+    /* To flush metadata and invoke flush callback if there is */
+    if(H5O_flush_common(&dt->oloc, type_id, H5AC_dxpl_id) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTFLUSH, FAIL, "unable to flush datatype and object flush callback")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Tflush */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    H5Trefresh
+ *
+ * Purpose:     Refreshes all buffers associated with a named datatype.
+ *
+ * Return:      Non-negative on success, negative on failure
+ *
+ * Programmer:  Mike McGreevy
+ *              July 21, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5Trefresh(hid_t type_id)
+{
+    H5T_t * dt = NULL;
+    herr_t ret_value = SUCCEED; /* return value */
+    
+    FUNC_ENTER_API(FAIL)
+    H5TRACE1("e", "i", type_id);
+
+    /* Check args */
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if(!H5T_is_named(dt))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a committed datatype")
+
+    /* Call private function to refresh datatype object */
+    if ((H5O_refresh_metadata(type_id, dt->oloc, H5AC_dxpl_id)) < 0)
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTLOAD, FAIL, "unable to refresh datatype")
+
+done:
+    FUNC_LEAVE_API(ret_value)
+} /* H5Trefresh */
+
diff --git a/src/H5TS.c b/src/H5TS.c
index 7df65bf..987bead 100644
--- a/src/H5TS.c
+++ b/src/H5TS.c
@@ -62,7 +62,7 @@ static void
 H5TS_key_destructor(void *key_val)
 {
     /* Use HDfree here instead of H5MM_xfree(), to avoid calling the H5CS routines */
-    if(key_val!=NULL)
+    if(key_val != NULL)
         HDfree(key_val);
 }
 
@@ -91,8 +91,9 @@ H5TS_key_destructor(void *key_val)
 void
 H5TS_pthread_first_thread_init(void)
 {
-    H5_g.H5_libinit_g = FALSE;
-    
+    H5_g.H5_libinit_g = FALSE;  /* Library hasn't been initialized */
+    H5_g.H5_libterm_g = FALSE;  /* Library isn't being shutdown */
+
 #ifdef H5_HAVE_WIN32_API
 # ifdef PTW32_STATIC_LIB
     pthread_win32_process_attach_np();
diff --git a/src/H5Tarray.c b/src/H5Tarray.c
index 752f2aa..4b2c7cf 100644
--- a/src/H5Tarray.c
+++ b/src/H5Tarray.c
@@ -22,10 +22,7 @@
 /* Module Setup */
 /****************/
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5T_init_array_interface
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 /***********/
@@ -78,28 +75,6 @@
 
 
 

-/*--------------------------------------------------------------------------
-NAME
-   H5T_init_array_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5T_init_array_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5T_init_iterface currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5T_init_array_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5T_init())
-} /* H5T_init_array_interface() */
-
-

 /*-------------------------------------------------------------------------
  * Function:	H5Tarray_create2
  *
@@ -179,8 +154,8 @@ done:
 H5T_t *
 H5T__array_create(H5T_t *base, unsigned ndims, const hsize_t dim[/* ndims */])
 {
-    H5T_t	*ret_value;	/* new array data type	*/
-    unsigned    u;              /* local index variable */
+    unsigned    u;                      /* Local index variable */
+    H5T_t	*ret_value = NULL;	/* New array data type	*/
 
     FUNC_ENTER_PACKAGE
 
diff --git a/src/H5Tbit.c b/src/H5Tbit.c
index 79cf3a6..8c53066 100644
--- a/src/H5Tbit.c
+++ b/src/H5Tbit.c
@@ -19,7 +19,7 @@
  *		the bytes are in little-endian order.
  */
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 #include "H5private.h"		/*generic functions			  */
@@ -82,7 +82,7 @@ H5T__bit_copy(uint8_t *dst, size_t dst_offset, const uint8_t *src,
 	size_t mask = ((size_t)1 << nbits) - 1;
 
 	dst[d_idx] &= (uint8_t)~(mask << dst_offset);
-	dst[d_idx] |= (uint8_t)(((src[s_idx] >> src_offset) & (uint8_t)mask) << dst_offset);
+	dst[d_idx] = (uint8_t)(dst[d_idx] | (((src[s_idx] >> src_offset) & (uint8_t)mask) << dst_offset));
 
 	src_offset += nbits;
 	if(src_offset >= 8) {
@@ -141,7 +141,7 @@ H5T__bit_copy(uint8_t *dst, size_t dst_offset, const uint8_t *src,
 	size_t mask = ((size_t)1 << nbits) - 1;
 
 	dst[d_idx] &= (uint8_t)(~(mask << dst_offset));
-	dst[d_idx] |= (uint8_t)(((src[s_idx] >> src_offset) & (uint8_t)mask) << dst_offset);
+	dst[d_idx] = (uint8_t)(dst[d_idx] | (((src[s_idx] >> src_offset) & (uint8_t)mask) << dst_offset));
 
 	src_offset += nbits;
 	if(src_offset >= 8) {
@@ -261,7 +261,7 @@ H5T__bit_get_d(uint8_t *buf, size_t offset, size_t size)
 {
     uint64_t	val = 0;
     size_t	i, hs;
-    uint64_t	ret_value;      /* Return value */
+    uint64_t	ret_value = 0;  /* Return value */
 
     FUNC_ENTER_PACKAGE_NOERR
 
@@ -376,9 +376,11 @@ H5T__bit_set(uint8_t *buf, size_t offset, size_t size, hbool_t value)
 	unsigned mask = ((unsigned)1 << nbits) - 1;
 
 	if(value)
-	    buf[idx++] |= (uint8_t)(mask << offset);
+	    buf[idx] = (uint8_t)(buf[idx] | (mask << offset));
 	else
-	    buf[idx++] &= (uint8_t)(~(mask << offset));
+	    buf[idx] &= (uint8_t)(~(mask << offset));
+
+	idx++;
 	size -= nbits;
     } /* end if */
 
@@ -551,7 +553,7 @@ H5T__bit_inc(uint8_t *buf, size_t start, size_t size)
 	acc++;
 	carry = acc & ((unsigned)1 << MIN(size, 8 - start));
 	buf[idx] &= (uint8_t)(~(mask << start));
-	buf[idx] |= (uint8_t)((acc & mask) << start);
+	buf[idx] = (uint8_t)(buf[idx] | ((acc & mask) << start));
 	size -= MIN(size, 8 - start);
 	start = 0;
 	idx++;
diff --git a/src/H5Tcommit.c b/src/H5Tcommit.c
index 024cc83..783d9d8 100644
--- a/src/H5Tcommit.c
+++ b/src/H5Tcommit.c
@@ -22,10 +22,7 @@
 /* Module Setup */
 /****************/
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5T_init_commit_interface
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 /***********/
@@ -83,28 +80,6 @@ static H5T_t *H5T_open_oid(const H5G_loc_t *loc, hid_t dxpl_id);
 
 
 

-/*--------------------------------------------------------------------------
-NAME
-   H5T_init_commit_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5T_init_commit_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5T_init_iterface currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5T_init_commit_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5T_init())
-} /* H5T_init_commit_interface() */
-
-

 /*-------------------------------------------------------------------------
  * Function:	H5Tcommit2
  *
@@ -184,10 +159,10 @@ herr_t
 H5T__commit_named(const H5G_loc_t *loc, const char *name, H5T_t *dt,
     hid_t lcpl_id, hid_t tcpl_id, hid_t tapl_id, hid_t dxpl_id)
 {
-    H5O_obj_create_t ocrt_info;             /* Information for object creation */
-    H5T_obj_create_t tcrt_info;             /* Information for named datatype creation */
-    H5T_state_t old_state = H5T_STATE_TRANSIENT;        /* The state of the datatype before H5T__commit. */
-    herr_t      ret_value = SUCCEED;        /* Return value */
+    H5O_obj_create_t ocrt_info;         /* Information for object creation */
+    H5T_obj_create_t tcrt_info;         /* Information for named datatype creation */
+    H5T_state_t old_state;              /* The state of the datatype before H5T__commit. */
+    herr_t      ret_value = SUCCEED;    /* Return value */
 
     FUNC_ENTER_PACKAGE
 
@@ -380,7 +355,7 @@ H5T__commit(H5F_t *file, H5T_t *type, hid_t tcpl_id, hid_t dxpl_id)
     loc_init = TRUE;
 
     /* Set the latest format, if requested */
-    if(H5F_USE_LATEST_FORMAT(file))
+    if(H5F_USE_LATEST_FLAGS(file, H5F_LATEST_DATATYPE))
         if(H5T_set_latest_version(type) < 0)
             HGOTO_ERROR(H5E_DATASET, H5E_CANTSET, FAIL, "can't set latest version of datatype")
 
@@ -518,7 +493,7 @@ H5T_committed(const H5T_t *type)
 int
 H5T_link(const H5T_t *type, int adjust, hid_t dxpl_id)
 {
-    int ret_value;      /* Return value */
+    int ret_value = -1;         /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -705,7 +680,7 @@ H5T_open(const H5G_loc_t *loc, hid_t dxpl_id)
 {
     H5T_shared_t   *shared_fo = NULL;
     H5T_t          *dt = NULL;
-    H5T_t          *ret_value;
+    H5T_t          *ret_value = NULL;   /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -821,7 +796,7 @@ static H5T_t *
 H5T_open_oid(const H5G_loc_t *loc, hid_t dxpl_id)
 {
     H5T_t *dt = NULL;          /* Datatype from the file */
-    H5T_t *ret_value;          /* Return value */
+    H5T_t *ret_value = NULL;   /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
diff --git a/src/H5Tcompound.c b/src/H5Tcompound.c
index b377b29..1342770 100644
--- a/src/H5Tcompound.c
+++ b/src/H5Tcompound.c
@@ -22,10 +22,7 @@
 /* Module Setup */
 /****************/
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5T_init_compound_interface
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 /***********/
@@ -80,26 +77,6 @@ static htri_t H5T_is_packed(const H5T_t *dt);
 
 
 

-/*--------------------------------------------------------------------------
-NAME
-   H5T_init_compound_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5T_init_compound_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5T_init() currently).
---------------------------------------------------------------------------*/
-static herr_t
-H5T_init_compound_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5T_init())
-} /* H5T_init_compound_interface() */
-
-

 /*-------------------------------------------------------------------------
  * Function:	H5Tget_member_offset
  *
@@ -282,7 +259,7 @@ done:
 H5T_t *
 H5T_get_member_type(const H5T_t *dt, unsigned membno, H5T_copy_t method)
 {
-    H5T_t	*ret_value;     /* Return value */
+    H5T_t	*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
diff --git a/src/H5Tconv.c b/src/H5Tconv.c
index 49bfeec..8b96d22 100644
--- a/src/H5Tconv.c
+++ b/src/H5Tconv.c
@@ -21,10 +21,7 @@
 /* Module Setup */
 /****************/
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	     */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5T_init_conv_interface
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 /***********/
@@ -174,10 +171,10 @@
  *		destination.
  *
  */
-#define H5T_CONV_xX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_xX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     *(D) = (DT)(*(S));							      \
 }
-#define H5T_CONV_xX_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_xX_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     *(D) = (DT)(*(S));							      \
 }
 
@@ -188,7 +185,7 @@
  * equal. In this case, do not return exception but make sure the maximum is assigned
  * to the destination.   SLU - 2005/06/29
  */
-#define H5T_CONV_Xx_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_Xx_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     if (*(S) > (ST)(D_MAX)) {                                                 \
         H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, \
                 src_id, dst_id, S, D, cb_struct.user_data);                   \
@@ -210,7 +207,7 @@
     } else 								      \
         *(D) = (DT)(*(S));						      \
 }
-#define H5T_CONV_Xx_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_Xx_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     if (*(S) > (ST)(D_MAX)) {                                                 \
         *(D) = (DT)(D_MAX);						      \
     } else if (*(S) < (ST)(D_MIN)) {                                          \
@@ -219,7 +216,7 @@
         *(D) = (DT)(*(S));						      \
 }
 
-#define H5T_CONV_Ux_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_Ux_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     if (*(S) > (ST)(D_MAX)) {                                                 \
         H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI,               \
                 src_id, dst_id, S, D, cb_struct.user_data);                   \
@@ -232,7 +229,7 @@
     } else								      \
         *(D) = (DT)(*(S));						      \
 }
-#define H5T_CONV_Ux_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_Ux_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     if (*(S) > (ST)(D_MAX)) {                                                 \
         *(D) = (DT)(D_MAX);						      \
     } else								      \
@@ -244,7 +241,7 @@
     H5T_CONV(H5T_CONV_xX, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N)              \
 }
 
-#define H5T_CONV_sU_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_sU_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     if (*(S) < 0) {                                                           \
         H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW,              \
                 src_id, dst_id, S, D, cb_struct.user_data);                   \
@@ -257,7 +254,7 @@
     } else								      \
         *(D) = (DT)(*(S));						      \
 }
-#define H5T_CONV_sU_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_sU_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     if(*(S) < 0)                                                              \
         *(D) = 0;						              \
     else								      \
@@ -269,28 +266,87 @@
     H5T_CONV(H5T_CONV_sU, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N)              \
 }
 
-#define H5T_CONV_uS_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
-    if(sizeof(ST) == sizeof(DT) && *(S) > (DT)(D_MAX)) {                      \
-        H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI,               \
+/* Define to 1 if overflow is possible during conversion, 0 otherwise
+ * Because destination is at least as wide as the source, this should only
+ * occur between types of equal size */
+#define H5T_CONV_uS_UCHAR_SHORT     0
+#define H5T_CONV_uS_UCHAR_INT       0
+#define H5T_CONV_uS_UCHAR_LONG      0
+#define H5T_CONV_uS_UCHAR_LLONG     0
+#if H5_SIZEOF_SHORT == H5_SIZEOF_INT
+  #define H5T_CONV_uS_USHORT_INT    1
+#else
+  #define H5T_CONV_uS_USHORT_INT    0
+#endif
+#define H5T_CONV_uS_USHORT_LONG     0
+#define H5T_CONV_uS_USHORT_LLONG    0
+#if H5_SIZEOF_INT == H5_SIZEOF_LONG
+  #define H5T_CONV_uS_UINT_LONG     1
+#else
+  #define H5T_CONV_uS_UINT_LONG     0
+#endif
+#define H5T_CONV_uS_UINT_LLONG      0
+#if H5_SIZEOF_LONG == H5_SIZEOF_LONG_LONG
+  #define H5T_CONV_uS_ULONG_LLONG   1
+#else
+  #define H5T_CONV_uS_ULONG_LLONG   0
+#endif
+
+/* Note. If an argument is stringified or concatenated, the prescan does not
+ * occur. To expand the macro, then stringify or concatenate its expansion,
+ * one macro must call another macro that does the stringification or
+ * concatenation. */
+#define H5T_CONV_uS_EVAL_TYPES(STYPE, DTYPE)                                  \
+        H5_GLUE4(H5T_CONV_uS_, STYPE, _, DTYPE)
+
+/* Called if overflow is possible */
+#define H5T_CONV_uS_CORE_1(S, D, ST, DT, D_MIN, D_MAX)                        \
+    if (*(S) > (DT)(D_MAX)) {                                                 \
+        H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI,\
                 src_id, dst_id, S, D, cb_struct.user_data);                   \
         if(except_ret == H5T_CONV_UNHANDLED)                                  \
-            /* Let compiler convert if case is ignored by user handler*/      \
-            *(D) = (DT)(D_MAX);						      \
-        else if(except_ret == H5T_CONV_ABORT)                                 \
-            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception") \
-        /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \
-    } else								      \
-        *(D) = (DT)(*(S));						      \
-}
-#define H5T_CONV_uS_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
-    if (sizeof(ST)==sizeof(DT) && *(S) > (DT)(D_MAX)) {                       \
-        *(D) = (D_MAX);							      \
-    } else								      \
-        *(D) = (DT)(*(S));						      \
+            /* Let compiler convert if case is ignored by user handler */     \
+            *(D) = (DT)(D_MAX);                                               \
+        else if (except_ret == H5T_CONV_ABORT)                                \
+            HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL,                  \
+                    "can't handle conversion exception")                      \
+        /* if (except_ret==H5T_CONV_HANDLED): Fall through, user handled it */\
+    } else                                                                    \
+        *(D) = (DT)(*(S));
+
+/* Called if no overflow is possible */
+#define H5T_CONV_uS_CORE_0(S, D, ST, DT, D_MIN, D_MAX)                        \
+    *(D) = (DT)(*(S));
+
+#define H5T_CONV_uS_CORE_I(over, S, D, ST, DT, D_MIN, D_MAX)                  \
+        H5_GLUE(H5T_CONV_uS_CORE_, over)(S, D, ST, DT, D_MIN, D_MAX)
+
+#define H5T_CONV_uS_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) {          \
+        H5T_CONV_uS_CORE_I(H5T_CONV_uS_EVAL_TYPES(STYPE, DTYPE),              \
+                S, D, ST, DT, D_MIN, D_MAX)                                   \
+}
+
+/* Called if overflow is possible */
+#define H5T_CONV_uS_NOEX_CORE_1(S, D, ST, DT, D_MIN, D_MAX)                   \
+    if (*(S) > (DT)(D_MAX))                                                   \
+        *(D) = (D_MAX);                                                       \
+    else                                                                      \
+        *(D) = (DT)(*(S));
+
+/* Called if no overflow is possible */
+#define H5T_CONV_uS_NOEX_CORE_0(S, D, ST, DT, D_MIN, D_MAX)                   \
+    *(D) = (DT)(*(S));
+
+#define H5T_CONV_uS_NOEX_CORE_I(over, S, D, ST, DT, D_MIN, D_MAX)             \
+        H5_GLUE(H5T_CONV_uS_NOEX_CORE_, over)(S, D, ST, DT, D_MIN, D_MAX)
+
+#define H5T_CONV_uS_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) {     \
+        H5T_CONV_uS_NOEX_CORE_I(H5T_CONV_uS_EVAL_TYPES(STYPE, DTYPE),         \
+                S, D, ST, DT, D_MIN, D_MAX)                                   \
 }
 
-#define H5T_CONV_uS(STYPE,DTYPE,ST,DT,D_MIN,D_MAX) {			      \
-    HDcompile_assert(sizeof(ST)<=sizeof(DT));				      \
+#define H5T_CONV_uS(STYPE, DTYPE, ST, DT, D_MIN, D_MAX) {                     \
+    HDcompile_assert(sizeof(ST) <= sizeof(DT));                               \
     H5T_CONV(H5T_CONV_uS, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N)              \
 }
 
@@ -304,7 +360,7 @@
     H5T_CONV(H5T_CONV_Xx, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N)              \
 }
 
-#define H5T_CONV_Su_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_Su_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     if(*(S) < 0) {                                                            \
         H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW,              \
                 src_id, dst_id, S, D, cb_struct.user_data);                   \
@@ -326,7 +382,7 @@
     } else								      \
         *(D) = (DT)(*(S));						      \
 }
-#define H5T_CONV_Su_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_Su_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     if(*(S) < 0)                                                              \
         *(D) = 0;						              \
     else if (sizeof(ST)>sizeof(DT) && *(S) > (ST)(D_MAX))                     \
@@ -350,7 +406,7 @@
     H5T_CONV(H5T_CONV_Ux, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N)              \
 }
 
-#define H5T_CONV_su_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_su_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     /* Assumes memory format of unsigned & signed integers is same */	      \
     if(*(S) < 0) {                                                            \
         H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_LOW,              \
@@ -364,7 +420,7 @@
     } else								      \
         *(D) = (DT)(*(S));						      \
 }
-#define H5T_CONV_su_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_su_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     /* Assumes memory format of unsigned & signed integers is same */	      \
     if(*(S) < 0)                                                              \
         *(D) = 0;						              \
@@ -377,7 +433,7 @@
     H5T_CONV(H5T_CONV_su, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N)              \
 }
 
-#define H5T_CONV_us_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_us_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     /* Assumes memory format of unsigned & signed integers is same */	      \
     if (*(S) > (ST)(D_MAX)) {                                                 \
         H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI,               \
@@ -391,7 +447,7 @@
     } else								      \
         *(D) = (DT)(*(S));						      \
 }
-#define H5T_CONV_us_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_us_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     /* Assumes memory format of unsigned & signed integers is same */	      \
     if(*(S) > (ST)(D_MAX))                                                    \
         *(D) = (DT)(D_MAX);						      \
@@ -412,7 +468,7 @@
 /* Same as H5T_CONV_Xx_CORE, except that instead of using D_MAX and D_MIN
  * when an overflow occurs, use the 'float' infinity values.
  */
-#define H5T_CONV_Ff_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_Ff_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     if(*(S) > (ST)(D_MAX)) {                                                  \
         H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI,               \
                 src_id, dst_id, S, D, cb_struct.user_data);                   \
@@ -434,7 +490,7 @@
     } else								      \
         *(D) = (DT)(*(S));						      \
 }
-#define H5T_CONV_Ff_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_Ff_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     if(*(S) > (ST)(D_MAX))                                                    \
         *(D) = (H5T_NATIVE_FLOAT_POS_INF_g);		                      \
     else if (*(S) < (ST)(D_MIN))                                              \
@@ -507,7 +563,7 @@
     LO = count;                                                               \
 }
 
-#define H5T_CONV_xF_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_xF_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     if (sprec > dprec) {						      \
         unsigned low_bit_pos, high_bit_pos;                                   \
                                                                               \
@@ -531,7 +587,7 @@
     else                                                                      \
         *(D) = (DT)(*(S));						      \
 }
-#define H5T_CONV_xF_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_xF_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     *(D) = (DT)(*(S));							      \
 }
 
@@ -547,7 +603,7 @@
  * (ST)(D_MAX))) is for some compilers like Sun, HP, IBM, and SGI where under
  * the same situation the "int" doesn't overflow.  SLU - 2005/9/12
  */
-#define H5T_CONV_Fx_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_Fx_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     if(*(S) > (ST)(D_MAX) || (sprec < dprec && *(S) == (ST)(D_MAX))) {        \
         H5T_conv_ret_t except_ret = (cb_struct.func)(H5T_CONV_EXCEPT_RANGE_HI, \
                 src_id, dst_id, S, D, cb_struct.user_data);                   \
@@ -579,7 +635,7 @@
     else                                                                      \
         *(D) = (DT)(*(S));						      \
 }
-#define H5T_CONV_Fx_NOEX_CORE(S,D,ST,DT,D_MIN,D_MAX) {			      \
+#define H5T_CONV_Fx_NOEX_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {			      \
     if(*(S) > (ST)(D_MAX))                                                    \
         *(D) = (DT)(D_MAX);						      \
     else if(*(S) < (ST)(D_MIN))                                               \
@@ -597,7 +653,7 @@
  * to do them all.
  */
 #ifndef H5_WANT_DCONV_EXCEPTION
-#define H5T_CONV_NO_EXCEPT_CORE(S,D,ST,DT,D_MIN,D_MAX) {		      \
+#define H5T_CONV_NO_EXCEPT_CORE(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) {		      \
     *(D) = (DT)(*(S));		        				      \
 }
 #endif /* H5_WANT_DCONV_EXCEPTION */
@@ -718,17 +774,17 @@
             if (s_mv && d_mv) {						      \
                 /* Alignment is required for both source and dest */	      \
                 s = &src_aligned;					      \
-                H5T_CONV_LOOP_OUTER(PRE_SALIGN,PRE_DALIGN,POST_SALIGN,POST_DALIGN,GUTS,s,d,ST,DT,D_MIN,D_MAX) \
+                H5T_CONV_LOOP_OUTER(PRE_SALIGN,PRE_DALIGN,POST_SALIGN,POST_DALIGN,GUTS,STYPE,DTYPE,s,d,ST,DT,D_MIN,D_MAX) \
             } else if(s_mv) {						      \
                 /* Alignment is required only for source */		      \
                 s = &src_aligned;					      \
-                H5T_CONV_LOOP_OUTER(PRE_SALIGN,PRE_DNOALIGN,POST_SALIGN,POST_DNOALIGN,GUTS,s,dst,ST,DT,D_MIN,D_MAX) \
+                H5T_CONV_LOOP_OUTER(PRE_SALIGN,PRE_DNOALIGN,POST_SALIGN,POST_DNOALIGN,GUTS,STYPE,DTYPE,s,dst,ST,DT,D_MIN,D_MAX) \
             } else if(d_mv) {						      \
                 /* Alignment is required only for destination */	      \
-                H5T_CONV_LOOP_OUTER(PRE_SNOALIGN,PRE_DALIGN,POST_SNOALIGN,POST_DALIGN,GUTS,src,d,ST,DT,D_MIN,D_MAX) \
+                H5T_CONV_LOOP_OUTER(PRE_SNOALIGN,PRE_DALIGN,POST_SNOALIGN,POST_DALIGN,GUTS,STYPE,DTYPE,src,d,ST,DT,D_MIN,D_MAX) \
             } else {							      \
                 /* Alignment is not required for both source and destination */ \
-                H5T_CONV_LOOP_OUTER(PRE_SNOALIGN,PRE_DNOALIGN,POST_SNOALIGN,POST_DNOALIGN,GUTS,src,dst,ST,DT,D_MIN,D_MAX) \
+                H5T_CONV_LOOP_OUTER(PRE_SNOALIGN,PRE_DNOALIGN,POST_SNOALIGN,POST_DNOALIGN,GUTS,STYPE,DTYPE,src,dst,ST,DT,D_MIN,D_MAX) \
             }	 	 	 	 	 	 	 	      \
 									      \
             /* Decrement number of elements left to convert */		      \
@@ -812,16 +868,16 @@ done:                                                                         \
 }
 
 /* The outer wrapper for the type conversion loop, to check for an exception handling routine */
-#define H5T_CONV_LOOP_OUTER(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,GUTS,S,D,ST,DT,D_MIN,D_MAX) \
+#define H5T_CONV_LOOP_OUTER(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,GUTS,STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) \
     if(cb_struct.func) {			                              \
-        H5T_CONV_LOOP(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,GUTS,S,D,ST,DT,D_MIN,D_MAX) \
+        H5T_CONV_LOOP(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,GUTS,STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) \
     }                                                                         \
     else {                                                                    \
-        H5T_CONV_LOOP(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,H5_GLUE(GUTS,_NOEX),S,D,ST,DT,D_MIN,D_MAX) \
+        H5T_CONV_LOOP(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,H5_GLUE(GUTS,_NOEX),STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) \
     }
 
 /* The inner loop of the type conversion macro, actually converting the elements */
-#define H5T_CONV_LOOP(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,GUTS,S,D,ST,DT,D_MIN,D_MAX) \
+#define H5T_CONV_LOOP(PRE_SALIGN_GUTS,PRE_DALIGN_GUTS,POST_SALIGN_GUTS,POST_DALIGN_GUTS,GUTS,STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX) \
     for (elmtno=0; elmtno<safe; elmtno++) {				      \
         /* Handle source pre-alignment */				      \
         H5_GLUE(H5T_CONV_LOOP_,PRE_SALIGN_GUTS)(ST)			      \
@@ -830,7 +886,7 @@ done:                                                                         \
         H5_GLUE(H5T_CONV_LOOP_,PRE_DALIGN_GUTS)(DT)			      \
                                                                               \
         /* ... user-defined stuff here -- the conversion ... */		      \
-        H5T_CONV_LOOP_GUTS(GUTS,S,D,ST,DT,D_MIN,D_MAX)			      \
+        H5T_CONV_LOOP_GUTS(GUTS,STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX)			      \
                                                                               \
         /* Handle source post-alignment */				      \
         H5_GLUE(H5T_CONV_LOOP_,POST_SALIGN_GUTS)(ST)			      \
@@ -847,12 +903,12 @@ done:                                                                         \
 
 /* Macro to call the actual "guts" of the type conversion, or call the "no exception" guts */
 #ifdef H5_WANT_DCONV_EXCEPTION
-#define H5T_CONV_LOOP_GUTS(GUTS,S,D,ST,DT,D_MIN,D_MAX)			      \
+#define H5T_CONV_LOOP_GUTS(GUTS,STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX)			      \
         /* ... user-defined stuff here -- the conversion ... */		      \
-        H5_GLUE(GUTS,_CORE)(S,D,ST,DT,D_MIN,D_MAX)
+        H5_GLUE(GUTS,_CORE)(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX)
 #else /* H5_WANT_DCONV_EXCEPTION */
-#define H5T_CONV_LOOP_GUTS(GUTS,S,D,ST,DT,D_MIN,D_MAX)			      \
-        H5_GLUE(H5T_CONV_NO_EXCEPT,_CORE)(S,D,ST,DT,D_MIN,D_MAX)
+#define H5T_CONV_LOOP_GUTS(GUTS,STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX)			      \
+        H5_GLUE(H5T_CONV_NO_EXCEPT,_CORE)(STYPE,DTYPE,S,D,ST,DT,D_MIN,D_MAX)
 #endif /* H5_WANT_DCONV_EXCEPTION */
 
 
@@ -970,26 +1026,6 @@ H5FL_BLK_DEFINE_STATIC(vlen_seq);
 H5FL_BLK_DEFINE_STATIC(array_seq);
 
 

-/*--------------------------------------------------------------------------
-NAME
-   H5T_init_conv_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5T_init_conv_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5T_init() currently).
---------------------------------------------------------------------------*/
-static herr_t
-H5T_init_conv_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5T_init())
-} /* H5T_init_conv_interface() */
-
-
 /*-------------------------------------------------------------------------
  * Function:	H5T__conv_noop
  *
@@ -2076,7 +2112,7 @@ done:
 H5T_subset_info_t *
 H5T__conv_struct_subset(const H5T_cdata_t *cdata)
 {
-    H5T_conv_struct_t	*priv;
+    H5T_conv_struct_t	*priv = NULL;
 
     FUNC_ENTER_PACKAGE_NOERR
 
@@ -2861,7 +2897,7 @@ H5T__conv_enum(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
                      * number 0x0f000000 on little-endian machine. But we won't fix it because it's an 
                      * optimization code. Please also see the comment in the H5T_conv_enum_init() function.
                      * SLU - 2011/5/24)
-                     */
+                     */ 
                     if(1 == src->shared->size)
                         n = *((signed char*)s);
                     else if(sizeof(short) == src->shared->size)
@@ -2890,7 +2926,7 @@ H5T__conv_enum(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
                     /* Use O(log N) lookup */
                     unsigned lt = 0;
                     unsigned rt = src->shared->u.enumer.nmembs;
-                    unsigned md;
+                    unsigned md = 0;
                     int cmp;
 
                     while(lt < rt) {
@@ -8689,7 +8725,9 @@ H5T__conv_float_ullong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
                        size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
                        hid_t H5_ATTR_UNUSED dxpl_id)
 {
+H5_GCC_DIAG_OFF(float-equal)
     H5T_CONV_Fx(FLOAT, ULLONG, float, unsigned long long, 0, ULLONG_MAX);
+H5_GCC_DIAG_ON(float-equal)
 }
 
 

@@ -8741,7 +8779,9 @@ H5T__conv_double_ullong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
                        size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
                        hid_t dxpl_id)
 {
+H5_GCC_DIAG_OFF(float-equal)
     H5T_CONV_Fx(DOUBLE, ULLONG, double, unsigned long long, 0, ULLONG_MAX);
+H5_GCC_DIAG_ON(float-equal)
 }
 
 

@@ -8796,7 +8836,9 @@ H5T__conv_ldouble_ullong (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata,
                        size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg,
                        hid_t dxpl_id)
 {
+H5_GCC_DIAG_OFF(float-equal)
     H5T_CONV_Fx(LDOUBLE, ULLONG, long double, unsigned long long, 0, ULLONG_MAX);
+H5_GCC_DIAG_ON(float-equal)
 }
 #endif /*H5T_CONV_INTERNAL_LDOUBLE_ULLONG*/
 
@@ -8914,7 +8956,7 @@ H5T__conv_f_i(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
             /* Allocate enough space for the buffer holding temporary
              * converted value
              */
-            buf_size = (size_t)HDpow((double)2.0f, (double)src.u.f.esize) / 8 + 1;
+            buf_size = (size_t) (HDpow((double)2.0f, (double)src.u.f.esize) / 8 + 1);
             int_buf = (uint8_t*)H5MM_calloc(buf_size);
 
             /* Get the plist structure. Do I need to close it? */
@@ -8990,7 +9032,7 @@ H5T__conv_f_i(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
                 /*
                  * Find the sign bit value of the source.
                  */
-                sign = H5T__bit_get_d(s, src.u.f.sign, (size_t)1);
+                sign = (hssize_t) H5T__bit_get_d(s, src.u.f.sign, (size_t)1);
 
                 /*
                  * Check for special cases: +0, -0, +Inf, -Inf, NaN
@@ -9117,16 +9159,16 @@ H5T__conv_f_i(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
                  * the source bit field where it's located.   Not expecting
                  * exponent to be greater than the maximal value of hssize_t.
                  */
-                expo = H5T__bit_get_d(s, src.u.f.epos, src.u.f.esize);
+                expo = (hssize_t) H5T__bit_get_d(s, src.u.f.epos, src.u.f.esize);
 
                 /*
                  * Calculate the true source exponent by adjusting according to
                  * the source exponent bias.
                  */
                 if (0==expo || H5T_NORM_NONE==src.u.f.norm) {
-                    expo -= (src.u.f.ebias-1);
+                    expo -= (hssize_t) (src.u.f.ebias-1);
                 } else if (H5T_NORM_IMPLIED==src.u.f.norm) {
-                    expo -= src.u.f.ebias;
+                    expo -= (hssize_t) src.u.f.ebias;
                 } else {
                     HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "normalization method not implemented yet")
                 }
@@ -9156,7 +9198,7 @@ H5T__conv_f_i(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
                  * 10...010111, expo=20, expo-msize=-3.  Right-shift the sequence, we get
                  * 00010...10.  The last three bits were dropped.
                  */
-                H5T__bit_shift(int_buf, (ssize_t)(expo-src.u.f.msize), (size_t)0, buf_size * 8);
+                H5T__bit_shift(int_buf, expo - (ssize_t)src.u.f.msize, (size_t)0, buf_size * 8);
 
                 /*
                  * If expo is less than mantissa size, the frantional value is dropped off
@@ -9361,11 +9403,11 @@ H5T__conv_f_i(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
                 if (d==dbuf)
                     HDmemcpy (dp, d, dst_p->shared->size);
                 if (buf_stride) {
-                    sp += direction * buf_stride;
-                    dp += direction * buf_stride;
+                    sp += direction * (ssize_t) buf_stride;
+                    dp += direction * (ssize_t) buf_stride;
                 } else {
-                    sp += direction * src_p->shared->size;
-                    dp += direction * dst_p->shared->size;
+                    sp += direction * (ssize_t) src_p->shared->size;
+                    dp += direction * (ssize_t) dst_p->shared->size;
                 }
 
                 HDmemset(int_buf, 0, buf_size);
@@ -9711,7 +9753,7 @@ H5T__conv_i_f(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
 
 
                 /* Check if the exponent is too big */
-                expo_max = (hsize_t)HDpow((double)2.0f, (double)dst.u.f.esize) - 1;
+                expo_max = (hsize_t) (HDpow((double)2.0f, (double)dst.u.f.esize) - 1);
 
                 if(expo > expo_max) {  /*overflows*/
                     if(cb_struct.func) { /*user's exception handler.  Reverse back source order*/
@@ -9790,11 +9832,11 @@ H5T__conv_i_f(hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, size_t nelmts,
                 if (d==dbuf)
                     HDmemcpy (dp, d, dst_p->shared->size);
                 if (buf_stride) {
-                    sp += direction * buf_stride;
-                    dp += direction * buf_stride;
+                    sp += direction * (ssize_t) buf_stride;
+                    dp += direction * (ssize_t) buf_stride;
                 } else {
-                    sp += direction * src_p->shared->size;
-                    dp += direction * dst_p->shared->size;
+                    sp += direction * (ssize_t) src_p->shared->size;
+                    dp += direction * (ssize_t) dst_p->shared->size;
                 }
 
                 HDmemset(int_buf, 0, buf_size);
diff --git a/src/H5Tcset.c b/src/H5Tcset.c
index 33fb32a..95658ed 100644
--- a/src/H5Tcset.c
+++ b/src/H5Tcset.c
@@ -18,10 +18,7 @@
  *      the character set (cset) for the H5T interface.
  */
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5T_init_cset_interface
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 #include "H5private.h"		/*generic functions			  */
@@ -30,28 +27,6 @@
 #include "H5Tpkg.h"		/*data-type functions			  */
 
 

-/*--------------------------------------------------------------------------
-NAME
-   H5T_init_cset_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5T_init_cset_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5T_init_iterface currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5T_init_cset_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5T_init())
-} /* H5T_init_cset_interface() */
-
-

 /*-------------------------------------------------------------------------
  * Function:	H5Tget_cset
  *
diff --git a/src/H5Tdbg.c b/src/H5Tdbg.c
index 375cd6e..8a10cc6 100644
--- a/src/H5Tdbg.c
+++ b/src/H5Tdbg.c
@@ -28,7 +28,7 @@
 /* Module Setup */
 /****************/
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 /***********/
@@ -165,14 +165,19 @@ H5T_debug(const H5T_t *dt, FILE *stream)
 {
     const char	*s1 = "", *s2 = "";
     unsigned	i;
+    herr_t      ret_value = SUCCEED;       /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
+    FUNC_ENTER_NOAPI_NOINIT
 
     /* Check args */
     HDassert(dt);
     HDassert(stream);
 
     switch(dt->shared->type) {
+        case H5T_NO_CLASS:
+            HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "no class");
+            break;
+
         case H5T_INTEGER:
             s1 = "int";
             break;
@@ -212,6 +217,9 @@ H5T_debug(const H5T_t *dt, FILE *stream)
                 s1 = "vlen";
             break;
 
+        case H5T_REFERENCE:
+        case H5T_ARRAY:
+        case H5T_NCLASSES:
         default:
             s1 = "";
             break;
@@ -247,6 +255,10 @@ H5T_debug(const H5T_t *dt, FILE *stream)
         uint64_t	tmp;
 
 	switch(dt->shared->u.atomic.order) {
+            case H5T_ORDER_ERROR:
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "order error");
+                break;
+
             case H5T_ORDER_BE:
                 s1 = "BE";
                 break;
@@ -263,6 +275,7 @@ H5T_debug(const H5T_t *dt, FILE *stream)
                 s1 = "NONE";
                 break;
 
+            case H5T_ORDER_MIXED:
             default:
                 s1 = "order?";
                 break;
@@ -277,8 +290,16 @@ H5T_debug(const H5T_t *dt, FILE *stream)
 	    fprintf(stream, ", prec=%lu",
 		    (unsigned long) (dt->shared->u.atomic.prec));
 	switch(dt->shared->type) {
+            case H5T_NO_CLASS:
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "no class");
+                break;
+
             case H5T_INTEGER:
                 switch(dt->shared->u.atomic.u.i.sign) {
+                    case H5T_SGN_ERROR:
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "sign error");
+                        break;
+
                     case H5T_SGN_NONE:
                         s1 = "unsigned";
                         break;
@@ -287,6 +308,7 @@ H5T_debug(const H5T_t *dt, FILE *stream)
                         s1 = NULL;
                         break;
 
+                    case H5T_NSGN:
                     default:
                         s1 = "sign?";
                         break;
@@ -298,6 +320,10 @@ H5T_debug(const H5T_t *dt, FILE *stream)
 
             case H5T_FLOAT:
                 switch(dt->shared->u.atomic.u.f.norm) {
+                    case H5T_NORM_ERROR:
+                        HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "norm error");
+                        break;
+
                     case H5T_NORM_IMPLIED:
                         s1 = "implied";
                         break;
@@ -335,6 +361,16 @@ H5T_debug(const H5T_t *dt, FILE *stream)
                 }
                 break;
 
+            case H5T_TIME:
+            case H5T_STRING:
+            case H5T_BITFIELD:
+            case H5T_OPAQUE:
+            case H5T_COMPOUND:
+            case H5T_REFERENCE:
+            case H5T_ENUM:
+            case H5T_VLEN:
+            case H5T_ARRAY:
+            case H5T_NCLASSES:
             default:
                 /* No additional info */
                 break;
@@ -351,6 +387,10 @@ H5T_debug(const H5T_t *dt, FILE *stream)
 	fprintf(stream, "\n");
     } else if(H5T_VLEN == dt->shared->type) {
         switch(dt->shared->u.vlen.loc) {
+            case H5T_LOC_BADLOC:
+                HGOTO_ERROR(H5E_DATATYPE, H5E_BADTYPE, FAIL, "invalid datatype location");
+                break;
+
             case H5T_LOC_MEMORY:
                 fprintf(stream, ", loc=memory");
                 break;
@@ -359,6 +399,7 @@ H5T_debug(const H5T_t *dt, FILE *stream)
                 fprintf(stream, ", loc=disk");
                 break;
 
+            case H5T_LOC_MAXLOC:
             default:
                 fprintf(stream, ", loc=UNKNOWN");
                 break;
@@ -397,6 +438,7 @@ H5T_debug(const H5T_t *dt, FILE *stream)
     }
     fprintf(stream, "}");
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5T_debug() */
 
diff --git a/src/H5Tdeprec.c b/src/H5Tdeprec.c
index f1586bd..cd4de1d 100644
--- a/src/H5Tdeprec.c
+++ b/src/H5Tdeprec.c
@@ -31,10 +31,7 @@
 /* Module Setup */
 /****************/
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg   */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5T__init_deprec_interface
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 /***********/
@@ -84,51 +81,6 @@
 /*******************/
 
 
-

-/*--------------------------------------------------------------------------
-NAME
-   H5T__init_deprec_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5T__init_deprec_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5T_init() currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5T__init_deprec_interface(void)
-{
-    FUNC_ENTER_STATIC_NOERR
-
-    FUNC_LEAVE_NOAPI(H5T_init())
-} /* H5T__init_deprec_interface() */
-
-

-/*--------------------------------------------------------------------------
-NAME
-   H5T__term_deprec_interface -- Terminate interface
-USAGE
-    herr_t H5T__term_deprec_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Terminates interface.  (Just resets H5_interface_initialize_g
-    currently).
-
---------------------------------------------------------------------------*/
-herr_t
-H5T__term_deprec_interface(void)
-{
-    FUNC_ENTER_PACKAGE_NOERR
-
-    /* Mark closed */
-    H5_interface_initialize_g = 0;
-
-    FUNC_LEAVE_NOAPI(0)
-} /* H5T__term_deprec_interface() */
-
 #ifndef H5_NO_DEPRECATED_SYMBOLS
 

 /*-------------------------------------------------------------------------
diff --git a/src/H5Tenum.c b/src/H5Tenum.c
index 2b7563b..e80d748 100644
--- a/src/H5Tenum.c
+++ b/src/H5Tenum.c
@@ -18,10 +18,7 @@
  *      in the H5T interface.
  */
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5T_init_enum_interface
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 #include "H5private.h"		/*generic functions			  */
@@ -36,27 +33,6 @@ static char *H5T_enum_nameof(const H5T_t *dt, const void *value, char *name/*out
 static herr_t H5T_enum_valueof(const H5T_t *dt, const char *name,
 				void *value/*out*/);
 
-

-/*--------------------------------------------------------------------------
-NAME
-   H5T_init_enum_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5T_init_enum_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5T_init_iterface currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5T_init_enum_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5T_init())
-} /* H5T_init_enum_interface() */
 
 

 /*-------------------------------------------------------------------------
@@ -123,7 +99,7 @@ done:
 H5T_t *
 H5T__enum_create(const H5T_t *parent)
 {
-    H5T_t	*ret_value;		/*new enumeration data type	*/
+    H5T_t	*ret_value = NULL;	/* New enumeration data type	*/
 
     FUNC_ENTER_PACKAGE
 
@@ -416,7 +392,7 @@ H5T_enum_nameof(const H5T_t *dt, const void *value, char *name/*out*/, size_t si
     unsigned	lt, md = 0, rt;		/* Indices for binary search	*/
     int	        cmp = (-1);		/* Comparison result		*/
     hbool_t     alloc_name = FALSE;     /* Whether name has been allocated */
-    char        *ret_value;             /* Return value */
+    char        *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
diff --git a/src/H5Tfields.c b/src/H5Tfields.c
index fb186fb..8818a73 100644
--- a/src/H5Tfields.c
+++ b/src/H5Tfields.c
@@ -18,10 +18,7 @@
  *      enumerated & compound datatypes in the H5T interface.
  */
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5T_init_fields_interface
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 #include "H5private.h"		/*generic functions			  */
@@ -31,28 +28,6 @@
 #include "H5Tpkg.h"		/*data-type functions			  */
 
 

-/*--------------------------------------------------------------------------
-NAME
-   H5T_init_fields_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5T_init_fields_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5T_init_iterface currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5T_init_fields_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5T_init())
-} /* H5T_init_fields_interface() */
-
-

 /*-------------------------------------------------------------------------
  * Function:	H5Tget_nmembers
  *
@@ -117,7 +92,7 @@ done:
 int
 H5T_get_nmembers(const H5T_t *dt)
 {
-    int	ret_value;
+    int	ret_value = -1;         /* Return value */
 
     FUNC_ENTER_NOAPI(FAIL)
 
@@ -199,7 +174,7 @@ done:
 char *
 H5T__get_member_name(H5T_t const *dt, unsigned membno)
 {
-    char	*ret_value;
+    char	*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_PACKAGE
 
diff --git a/src/H5Tfixed.c b/src/H5Tfixed.c
index b2401d4..62b8e79 100644
--- a/src/H5Tfixed.c
+++ b/src/H5Tfixed.c
@@ -18,10 +18,7 @@
  *      integer) datatypes in the H5T interface.
  */
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5T_init_fixed_interface
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 #include "H5private.h"		/*generic functions			  */
@@ -30,28 +27,6 @@
 #include "H5Tpkg.h"		/*data-type functions			  */
 
 

-/*--------------------------------------------------------------------------
-NAME
-   H5T_init_fixed_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5T_init_fixed_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5T_init_iterface currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5T_init_fixed_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5T_init())
-} /* H5T_init_fixed_interface() */
-
-

 /*-------------------------------------------------------------------------
  * Function:	H5Tget_sign
  *
@@ -79,8 +54,8 @@ H5Tget_sign(hid_t type_id)
     H5TRACE1("Ts", "i", type_id);
 
     /* Check args */
-    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_SGN_ERROR, "not an integer datatype")
+    if (NULL == (dt = (H5T_t *)H5I_object_verify(type_id,H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_SGN_ERROR, "not an integer datatype")
 
     ret_value = H5T_get_sign(dt);
 
@@ -109,7 +84,7 @@ done:
 H5T_sign_t
 H5T_get_sign(H5T_t const *dt)
 {
-    H5T_sign_t		ret_value;
+    H5T_sign_t		ret_value = H5T_SGN_ERROR;      /* Return value */
 
     FUNC_ENTER_NOAPI(H5T_SGN_ERROR)
 
@@ -158,18 +133,18 @@ H5Tset_sign(hid_t type_id, H5T_sign_t sign)
     H5TRACE2("e", "iTs", type_id, sign);
 
     /* Check args */
-    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an integer datatype")
+    if (NULL == (dt = (H5T_t *)H5I_object_verify(type_id,H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an integer datatype")
     if (H5T_STATE_TRANSIENT!=dt->shared->state)
-	HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "datatype is read-only")
+        HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "datatype is read-only")
     if (sign < H5T_SGN_NONE || sign >= H5T_NSGN)
-	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal sign type")
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal sign type")
     if (H5T_ENUM==dt->shared->type && dt->shared->u.enumer.nmembs>0)
-	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not allowed after members are defined")
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not allowed after members are defined")
     while (dt->shared->parent)
         dt = dt->shared->parent; /*defer to parent*/
     if (H5T_INTEGER!=dt->shared->type)
-	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for datatype class")
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for datatype class")
 
     /* Commit */
     dt->shared->u.atomic.u.i.sign = sign;
diff --git a/src/H5Tfloat.c b/src/H5Tfloat.c
index fff413d..b8b1c07 100644
--- a/src/H5Tfloat.c
+++ b/src/H5Tfloat.c
@@ -18,10 +18,7 @@
  *      datatypes in the H5T interface.
  */
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5T_init_float_interface
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 #include "H5private.h"		/*generic functions			  */
@@ -29,27 +26,6 @@
 #include "H5Iprivate.h"		/*ID functions		   		  */
 #include "H5Tpkg.h"		/*data-type functions			  */
 
-

-/*--------------------------------------------------------------------------
-NAME
-   H5T_init_float_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5T_init_float_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5T_init_iterface currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5T_init_float_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5T_init())
-} /* H5T_init_float_interface() */
 
 

 /*-------------------------------------------------------------------------
diff --git a/src/H5Tmodule.h b/src/H5Tmodule.h
new file mode 100644
index 0000000..bfaab5e
--- /dev/null
+++ b/src/H5Tmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5T package.  Including this header means that the source file
+ *		is part of the H5T package.
+ */
+#ifndef _H5Tmodule_H
+#define _H5Tmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5T_MODULE
+#define H5_MY_PKG       H5T
+#define H5_MY_PKG_ERR   H5E_DATATYPE
+#define H5_MY_PKG_INIT  YES
+
+#endif /* _H5Tmodule_H */
+
diff --git a/src/H5Tnative.c b/src/H5Tnative.c
index bf6ba08..229fe94 100644
--- a/src/H5Tnative.c
+++ b/src/H5Tnative.c
@@ -18,10 +18,7 @@
  *      a "native" datatype for the H5T interface.
  */
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5T_init_native_interface
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -43,27 +40,6 @@ static H5T_t* H5T_get_native_bitfield(size_t prec, H5T_direction_t direction,
 static herr_t H5T_cmp_offset(size_t *comp_size, size_t *offset, size_t elem_size,
                          size_t nelems, size_t align, size_t *struct_align);
 
-

-/*--------------------------------------------------------------------------
-NAME
-   H5T_init_native_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5T_init_native_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5T_init_iterface currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5T_init_native_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5T_init())
-} /* H5T_init_native_interface() */
 
 

 /*-------------------------------------------------------------------------
@@ -168,7 +144,7 @@ H5T_get_native_type(H5T_t *dtype, H5T_direction_t direction, size_t *struct_alig
     int         snmemb;             /* Number of members in compound & enum types */
     unsigned    nmemb = 0;          /* Number of members in compound & enum types */
     unsigned    u;                  /* Local index variable */
-    H5T_t       *ret_value;         /* Return value */
+    H5T_t       *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -571,7 +547,7 @@ H5T_get_native_integer(size_t prec, H5T_sign_t sign, H5T_direction_t direction,
         H5T_NATIVE_INT_MATCH_LLONG,
         H5T_NATIVE_INT_MATCH_UNKNOWN
     } match = H5T_NATIVE_INT_MATCH_UNKNOWN;
-    H5T_t       *ret_value;     /* Return value */
+    H5T_t       *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -711,7 +687,7 @@ H5T_get_native_float(size_t size, H5T_direction_t direction, size_t *struct_alig
 #endif
         H5T_NATIVE_FLOAT_MATCH_UNKNOWN
     } match=H5T_NATIVE_FLOAT_MATCH_UNKNOWN;
-    H5T_t       *ret_value;     /* Return value */
+    H5T_t       *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -829,7 +805,7 @@ H5T_get_native_bitfield(size_t prec, H5T_direction_t direction, size_t *struct_a
     hid_t       tid=(-1);       /* Datatype ID of appropriate native datatype */
     size_t      align=0;        /* Alignment necessary for native datatype */
     size_t      native_size=0;  /* Datatype size of the native type */
-    H5T_t       *ret_value;     /* Return value */
+    H5T_t       *ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
diff --git a/src/H5Toffset.c b/src/H5Toffset.c
index ea4b3b5..cc45d8e 100644
--- a/src/H5Toffset.c
+++ b/src/H5Toffset.c
@@ -18,10 +18,7 @@
  *      the datatype offset for the H5T interface.
  */
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5T_init_offset_interface
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -32,27 +29,6 @@
 /* Static local functions */
 static herr_t H5T_set_offset(const H5T_t *dt, size_t offset);
 
-

-/*--------------------------------------------------------------------------
-NAME
-   H5T_init_offset_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5T_init_offset_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5T_init_iterface currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5T_init_offset_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5T_init())
-} /* H5T_init_offset_interface() */
 
 

 /*-------------------------------------------------------------------------
@@ -138,7 +114,7 @@ done:
 int
 H5T_get_offset(const H5T_t *dt)
 {
-    int	ret_value;
+    int	ret_value = -1;         /* Return value */
 
     FUNC_ENTER_NOAPI(-1)
 
diff --git a/src/H5Toh.c b/src/H5Toh.c
index abf8a51..9c8ad80 100644
--- a/src/H5Toh.c
+++ b/src/H5Toh.c
@@ -17,8 +17,8 @@
 /* Module Setup */
 /****************/
 
-#define H5O_PACKAGE		/*suppress error about including H5Opkg	  */
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+#define H5O_FRIEND		/*suppress error about including H5Opkg	  */
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 /***********/
@@ -102,7 +102,7 @@ const H5O_obj_class_t H5O_OBJ_DATATYPE[1] = {{
 static htri_t
 H5O_dtype_isa(struct H5O_t *oh)
 {
-    htri_t	ret_value;              /* Return value */
+    htri_t	ret_value = FAIL;       /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -133,7 +133,7 @@ static hid_t
 H5O_dtype_open(const H5G_loc_t *obj_loc, hid_t H5_ATTR_UNUSED lapl_id, hid_t dxpl_id, hbool_t app_ref)
 {
     H5T_t       *type = NULL;           /* Datatype opened */
-    hid_t	ret_value;              /* Return value */
+    hid_t	ret_value = H5I_INVALID_HID;    /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -173,7 +173,7 @@ static void *
 H5O_dtype_create(H5F_t *f, void *_crt_info, H5G_loc_t *obj_loc, hid_t dxpl_id)
 {
     H5T_obj_create_t *crt_info = (H5T_obj_create_t *)_crt_info; /* Named datatype creation parameters */
-    void *ret_value;            /* Return value */
+    void *ret_value = NULL;     /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -217,7 +217,7 @@ static H5O_loc_t *
 H5O_dtype_get_oloc(hid_t obj_id)
 {
     H5T_t       *type;                  /* Datatype opened */
-    H5O_loc_t	*ret_value;             /* Return value */
+    H5O_loc_t	*ret_value = NULL;      /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
diff --git a/src/H5Topaque.c b/src/H5Topaque.c
index e93bf65..9cc22c9 100644
--- a/src/H5Topaque.c
+++ b/src/H5Topaque.c
@@ -18,10 +18,7 @@
  *      datatypes in the H5T interface.
  */
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5T_init_opaque_interface
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -30,27 +27,6 @@
 #include "H5MMprivate.h"	/* Memory management			*/
 #include "H5Tpkg.h"		/* Datatypes				*/
 
-

-/*--------------------------------------------------------------------------
-NAME
-   H5T_init_opaque_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5T_init_opaque_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5T_init_iterface currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5T_init_opaque_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5T_init())
-} /* H5T_init_opaque_interface() */
 
 

 /*-------------------------------------------------------------------------
@@ -77,18 +53,18 @@ H5Tset_tag(hid_t type_id, const char *tag)
     H5TRACE2("e", "i*s", type_id, tag);
 
     /* Check args */
-    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type")
+    if (NULL == (dt = (H5T_t *)H5I_object_verify(type_id,H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type")
     if (H5T_STATE_TRANSIENT!=dt->shared->state)
-	HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only")
+        HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only")
     while (dt->shared->parent)
         dt = dt->shared->parent; /*defer to parent*/
     if (H5T_OPAQUE!=dt->shared->type)
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an opaque data type")
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an opaque data type")
     if (!tag)
-	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no tag")
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no tag")
     if (HDstrlen(tag) >= H5T_OPAQUE_TAG_MAX)
-	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "tag too long")
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "tag too long")
 
     /* Commit */
     H5MM_xfree(dt->shared->u.opaque.tag);
@@ -124,16 +100,16 @@ H5Tget_tag(hid_t type_id)
     H5TRACE1("*s", "i", type_id);
 
     /* Check args */
-    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type")
+    if (NULL == (dt = (H5T_t *)H5I_object_verify(type_id,H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type")
     while (dt->shared->parent)
         dt = dt->shared->parent; /*defer to parent*/
     if (H5T_OPAQUE != dt->shared->type)
-	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "operation not defined for data type class")
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "operation not defined for data type class")
 
     /* result */
     if (NULL==(ret_value=H5MM_strdup(dt->shared->u.opaque.tag)))
-	HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
+        HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed")
 
 done:
     FUNC_LEAVE_API(ret_value)
diff --git a/src/H5Torder.c b/src/H5Torder.c
index 35be454..6c9c55c 100644
--- a/src/H5Torder.c
+++ b/src/H5Torder.c
@@ -22,10 +22,7 @@
 /* Module Setup */
 /****************/
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5T_init_order_interface
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 /***********/
@@ -79,27 +76,6 @@ static herr_t H5T_set_order(H5T_t *dtype, H5T_order_t order);
 
 
 

-/*--------------------------------------------------------------------------
-NAME
-   H5T_init_order_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5T_init_order_interface()
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5T_init_iterface currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5T_init_order_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5T_init())
-} /* H5T_init_order_interface() */
-
-

 /*-------------------------------------------------------------------------
  * Function:	H5Tget_order
  *
diff --git a/src/H5Tpad.c b/src/H5Tpad.c
index 88a5e13..e636a84 100644
--- a/src/H5Tpad.c
+++ b/src/H5Tpad.c
@@ -18,10 +18,7 @@
  *      the datatype padding for the H5T interface.
  */
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5T_init_pad_interface
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -29,27 +26,6 @@
 #include "H5Iprivate.h"		/* IDs			  		*/
 #include "H5Tpkg.h"		/* Datatypes				*/
 
-

-/*--------------------------------------------------------------------------
-NAME
-   H5T_init_pad_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5T_init_pad_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5T_init_iterface currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5T_init_pad_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5T_init())
-} /* H5T_init_pad_interface() */
 
 

 /*-------------------------------------------------------------------------
@@ -80,12 +56,12 @@ H5Tget_pad(hid_t type_id, H5T_pad_t *lsb/*out*/, H5T_pad_t *msb/*out*/)
     H5TRACE3("e", "ixx", type_id, lsb, msb);
 
     /* Check args */
-    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type")
+    if (NULL == (dt = (H5T_t *)H5I_object_verify(type_id,H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type")
     while (dt->shared->parent)
         dt = dt->shared->parent; /*defer to parent*/
     if (!H5T_IS_ATOMIC(dt->shared))
-	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "operation not defined for specified data type")
+        HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "operation not defined for specified data type")
 
     /* Get values */
     if (lsb)
@@ -124,18 +100,18 @@ H5Tset_pad(hid_t type_id, H5T_pad_t lsb, H5T_pad_t msb)
     H5TRACE3("e", "iTpTp", type_id, lsb, msb);
 
     /* Check args */
-    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type")
+    if (NULL == (dt = (H5T_t *)H5I_object_verify(type_id,H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type")
     if (H5T_STATE_TRANSIENT!=dt->shared->state)
-	HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only")
+        HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only")
     if (lsb < H5T_PAD_ZERO || lsb >= H5T_NPAD || msb < H5T_PAD_ZERO || msb >= H5T_NPAD)
-	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid pad type")
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid pad type")
     if (H5T_ENUM==dt->shared->type && dt->shared->u.enumer.nmembs>0)
-	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not allowed after members are defined")
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not allowed after members are defined")
     while (dt->shared->parent)
         dt = dt->shared->parent; /*defer to parent*/
     if (!H5T_IS_ATOMIC(dt->shared))
-	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "operation not defined for specified data type")
+        HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "operation not defined for specified data type")
 
     /* Commit */
     dt->shared->u.atomic.lsb_pad = lsb;
diff --git a/src/H5Tpkg.h b/src/H5Tpkg.h
index 0b0cd61..0bd1e06 100644
--- a/src/H5Tpkg.h
+++ b/src/H5Tpkg.h
@@ -21,7 +21,7 @@
  *		the H5T package.  Source files outside the H5T package should
  *		include H5Tprivate.h instead.
  */
-#ifndef H5T_PACKAGE
+#if !(defined H5T_FRIEND || defined H5T_MODULE)
 #error "Do not include this file outside the H5T package!"
 #endif
 
@@ -424,7 +424,7 @@ H5FL_EXTERN(H5T_t);
 H5FL_EXTERN(H5T_shared_t);
 
 /* Common functions */
-H5_DLL herr_t H5T__term_deprec_interface(void);
+H5_DLL herr_t H5T__init_native(void);
 H5_DLL H5T_t *H5T__create(H5T_class_t type, size_t size);
 H5_DLL herr_t H5T__commit(H5F_t *file, H5T_t *type, hid_t tcpl_id, hid_t dxpl_id);
 H5_DLL herr_t H5T__commit_named(const H5G_loc_t *loc, const char *name,
diff --git a/src/H5Tprecis.c b/src/H5Tprecis.c
index b3975af..be85491 100644
--- a/src/H5Tprecis.c
+++ b/src/H5Tprecis.c
@@ -18,10 +18,7 @@
  *      the datatype precision for the H5T interface.
  */
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5T_init_precis_interface
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -32,27 +29,6 @@
 /* Static local functions */
 static herr_t H5T_set_precision(const H5T_t *dt, size_t prec);
 
-

-/*--------------------------------------------------------------------------
-NAME
-   H5T_init_precis_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5T_init_precis_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5T_init_iterface currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5T_init_precis_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5T_init())
-} /* H5T_init_precis_interface() */
 
 

 /*-------------------------------------------------------------------------
@@ -87,12 +63,12 @@ H5Tget_precision(hid_t type_id)
     H5TRACE1("z", "i", type_id);
 
     /* Check args */
-    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a datatype")
+    if (NULL == (dt = (H5T_t *)H5I_object_verify(type_id,H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a datatype")
 
     /* Get precision */
     if((ret_value = H5T_get_precision(dt)) == 0)
-	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, 0, "cant't get precision for specified datatype")
+        HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, 0, "cant't get precision for specified datatype")
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -119,7 +95,7 @@ done:
 size_t
 H5T_get_precision(const H5T_t *dt)
 {
-    size_t	ret_value;
+    size_t	ret_value = 0;          /* Return value */
 
     FUNC_ENTER_NOAPI(0)
 
@@ -176,22 +152,22 @@ H5Tset_precision(hid_t type_id, size_t prec)
     H5TRACE2("e", "iz", type_id, prec);
 
     /* Check args */
-    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if (NULL == (dt = (H5T_t *)H5I_object_verify(type_id,H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
     if (H5T_STATE_TRANSIENT!=dt->shared->state)
-	HGOTO_ERROR(H5E_ARGS, H5E_CANTSET, FAIL, "datatype is read-only")
+        HGOTO_ERROR(H5E_ARGS, H5E_CANTSET, FAIL, "datatype is read-only")
     if (prec == 0)
-	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "precision must be positive")
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "precision must be positive")
     if (H5T_ENUM==dt->shared->type && dt->shared->u.enumer.nmembs>0)
-	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "operation not allowed after members are defined")
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "operation not allowed after members are defined")
     if (H5T_STRING==dt->shared->type)
         HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "precision for this type is read-only")
     if (H5T_COMPOUND==dt->shared->type || H5T_OPAQUE==dt->shared->type)
-	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "operation not defined for specified datatype")
+        HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "operation not defined for specified datatype")
 
     /* Do the work */
     if (H5T_set_precision(dt, prec)<0)
-	HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "unable to set precision")
+        HGOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "unable to set precision")
 
 done:
     FUNC_LEAVE_API(ret_value)
@@ -283,9 +259,19 @@ H5T_set_precision(const H5T_t *dt, size_t prec)
                             dt->shared->u.atomic.u.f.mpos + dt->shared->u.atomic.u.f.msize > prec+offset)
                         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "adjust sign, mantissa, and exponent fields first")
                     break;
+
+                case H5T_NO_CLASS:
+                case H5T_STRING:
+                case H5T_OPAQUE:
+                case H5T_COMPOUND:
+                case H5T_REFERENCE:
+                case H5T_ENUM:
+                case H5T_VLEN:
+                case H5T_ARRAY:
+                case H5T_NCLASSES:
                 default:
                     HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "operation not defined for datatype class")
-	    } /* end switch */ /*lint !e788 All appropriate cases are covered */
+	    } /* end switch */
 
 	    /* Commit */
 	    dt->shared->size = size;
diff --git a/src/H5Tprivate.h b/src/H5Tprivate.h
index 345924c..93fe599 100644
--- a/src/H5Tprivate.h
+++ b/src/H5Tprivate.h
@@ -34,17 +34,17 @@
 #define H5T_ELEM_BUF_SIZE       256
 
 /* If the module using this macro is allowed access to the private variables, access them directly */
-#ifdef H5T_PACKAGE
+#ifdef H5T_MODULE
 #define H5T_GET_SIZE(T)                 ((T)->shared->size)
 #define H5T_GET_SHARED(T)               ((T)->shared)
 #define H5T_GET_MEMBER_OFFSET(T, I)     ((T)->u.compnd.memb[I].offset)
 #define H5T_GET_MEMBER_SIZE(T, I)       ((T)->u.compnd.memb[I].shared->size)
-#else /* H5T_PACKAGE */
+#else /* H5T_MODULE */
 #define H5T_GET_SIZE(T)                 (H5T_get_size(T))
 #define H5T_GET_SHARED(T)               (H5T_get_shared(T))
 #define H5T_GET_MEMBER_OFFSET(T, I)     (H5T_get_member_offset((T), (I)))
 #define H5T_GET_MEMBER_SIZE(T, I)       (H5T_get_member_size((T), (I)))
-#endif /* H5T_PACKAGE */
+#endif /* H5T_MODULE */
 
 /* Forward references of package typedefs (declared in H5Tpkg.h) */
 typedef struct H5T_t H5T_t;
@@ -104,7 +104,6 @@ struct H5O_t;
 H5_DLLVAR H5T_order_t H5T_native_order_g;
 
 /* Private functions */
-H5_DLL herr_t H5TN_init_interface(void);
 H5_DLL herr_t H5T_init(void);
 H5_DLL H5T_t *H5T_copy(H5T_t *old_dt, H5T_copy_t method);
 H5_DLL herr_t H5T_lock(H5T_t *dt, hbool_t immutable);
@@ -114,6 +113,8 @@ H5_DLL H5T_class_t H5T_get_class(const H5T_t *dt, htri_t internal);
 H5_DLL htri_t H5T_detect_class(const H5T_t *dt, H5T_class_t cls, hbool_t from_api);
 H5_DLL size_t H5T_get_size(const H5T_t *dt);
 H5_DLL int    H5T_cmp(const H5T_t *dt1, const H5T_t *dt2, hbool_t superset);
+H5_DLL herr_t H5T_encode(H5T_t *obj, unsigned char *buf, size_t *nalloc);
+H5_DLL H5T_t *H5T_decode(const unsigned char *buf);
 H5_DLL herr_t H5T_debug(const H5T_t *dt, FILE * stream);
 H5_DLL struct H5O_loc_t *H5T_oloc(H5T_t *dt);
 H5_DLL H5G_name_t *H5T_nameof(H5T_t *dt);
diff --git a/src/H5Tpublic.h b/src/H5Tpublic.h
index d646ef1..df7ad41 100644
--- a/src/H5Tpublic.h
+++ b/src/H5Tpublic.h
@@ -511,6 +511,8 @@ H5_DLL hid_t H5Tget_create_plist(hid_t type_id);
 H5_DLL htri_t H5Tcommitted(hid_t type_id);
 H5_DLL herr_t H5Tencode(hid_t obj_id, void *buf, size_t *nalloc);
 H5_DLL hid_t H5Tdecode(const void *buf);
+H5_DLL herr_t H5Tflush(hid_t type_id);
+H5_DLL herr_t H5Trefresh(hid_t type_id);
 
 /* Operations defined on compound datatypes */
 H5_DLL herr_t H5Tinsert(hid_t parent_id, const char *name, size_t offset,
diff --git a/src/H5Tstrpad.c b/src/H5Tstrpad.c
index e8ac4f5..2cd1db4 100644
--- a/src/H5Tstrpad.c
+++ b/src/H5Tstrpad.c
@@ -18,10 +18,7 @@
  *      the datatype string padding for the H5T interface.
  */
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5T_init_strpad_interface
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -29,27 +26,6 @@
 #include "H5Iprivate.h"		/* IDs			  		*/
 #include "H5Tpkg.h"		/* Datatypes				*/
 
-

-/*--------------------------------------------------------------------------
-NAME
-   H5T_init_strpad_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5T_init_strpad_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5T_init_iterface currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5T_init_strpad_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5T_init())
-} /* H5T_init_strpad_interface() */
 
 

 /*-------------------------------------------------------------------------
@@ -83,12 +59,12 @@ H5Tget_strpad(hid_t type_id)
     H5TRACE1("Tz", "i", type_id);
 
     /* Check args */
-    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_STR_ERROR, "not a datatype")
+    if (NULL == (dt = (H5T_t *)H5I_object_verify(type_id,H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_STR_ERROR, "not a datatype")
     while (dt->shared->parent && !H5T_IS_STRING(dt->shared))
         dt = dt->shared->parent;  /*defer to parent*/
     if (!H5T_IS_STRING(dt->shared))
-	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, H5T_STR_ERROR, "operation not defined for datatype class")
+        HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, H5T_STR_ERROR, "operation not defined for datatype class")
 
     /* result */
     if(H5T_IS_FIXED_STRING(dt->shared))
@@ -140,16 +116,16 @@ H5Tset_strpad(hid_t type_id, H5T_str_t strpad)
     H5TRACE2("e", "iTz", type_id, strpad);
 
     /* Check args */
-    if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)))
-	HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
+    if (NULL == (dt = (H5T_t *)H5I_object_verify(type_id,H5I_DATATYPE)))
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
     if (H5T_STATE_TRANSIENT!=dt->shared->state)
-	HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "datatype is read-only")
+        HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "datatype is read-only")
     if (strpad < H5T_STR_NULLTERM || strpad >= H5T_NSTR)
-	HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal string pad type")
+        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal string pad type")
     while (dt->shared->parent && !H5T_IS_STRING(dt->shared))
         dt = dt->shared->parent;  /*defer to parent*/
     if (!H5T_IS_STRING(dt->shared))
-	HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "operation not defined for datatype class")
+        HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "operation not defined for datatype class")
 
     /* Commit */
     if(H5T_IS_FIXED_STRING(dt->shared))
diff --git a/src/H5Tvisit.c b/src/H5Tvisit.c
index 68cabda..d732fb3 100644
--- a/src/H5Tvisit.c
+++ b/src/H5Tvisit.c
@@ -35,7 +35,7 @@
 /* Module Setup */
 /****************/
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	  */
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 /***********/
@@ -136,6 +136,19 @@ H5T__visit(H5T_t *dt, unsigned visit_flags, H5T_operator_t op, void *op_value)
                 HGOTO_ERROR(H5E_DATATYPE, H5E_BADITER, FAIL, "can't visit parent datatype")
             break;
 
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+            /* Not real values */
+            HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "operation not defined for datatype class")
+            break;
+
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+        case H5T_TIME:
+        case H5T_STRING:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_REFERENCE:
         default:
             /* Visit "simple" datatypes here */
             if(visit_flags & H5T_VISIT_SIMPLE)
diff --git a/src/H5Tvlen.c b/src/H5Tvlen.c
index 4ee3d0d..2abdf6f 100644
--- a/src/H5Tvlen.c
+++ b/src/H5Tvlen.c
@@ -18,10 +18,7 @@
  *      datatypes in the H5T interface.
  */
 
-#define H5T_PACKAGE		/*suppress error about including H5Tpkg	     */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5T_init_vlen_interface
+#include "H5Tmodule.h"          /* This source code file is part of the H5T module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -64,27 +61,6 @@ static H5T_vlen_alloc_info_t H5T_vlen_def_vl_alloc_info ={
     H5D_VLEN_FREE_INFO
 };
 
-

-/*--------------------------------------------------------------------------
-NAME
-   H5T_init_vlen_interface -- Initialize interface-specific information
-USAGE
-    herr_t H5T_init_vlen_interface()
-
-RETURNS
-    Non-negative on success/Negative on failure
-DESCRIPTION
-    Initializes any interface-specific data or routines.  (Just calls
-    H5T_init_iterface currently).
-
---------------------------------------------------------------------------*/
-static herr_t
-H5T_init_vlen_interface(void)
-{
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    FUNC_LEAVE_NOAPI(H5T_init())
-} /* H5T_init_vlen_interface() */
 
 

 /*-------------------------------------------------------------------------
@@ -113,7 +89,7 @@ H5Tvlen_create(hid_t base_id)
     H5TRACE1("i", "i", base_id);
 
     /* Check args */
-    if(NULL == (base = H5I_object_verify(base_id, H5I_DATATYPE)))
+    if(NULL == (base = (H5T_t *)H5I_object_verify(base_id, H5I_DATATYPE)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an valid base datatype")
 
     /* Create up VL datatype */
@@ -147,8 +123,8 @@ done:
 H5T_t *
 H5T__vlen_create(const H5T_t *base)
 {
-    H5T_t	*dt = NULL;		/*new VL datatype	*/
-    H5T_t	*ret_value;	/*return value			*/
+    H5T_t	*dt = NULL;		/* New VL datatype */
+    H5T_t	*ret_value = NULL;	/* Return value */
 
     FUNC_ENTER_PACKAGE
 
@@ -288,6 +264,8 @@ H5T__vlen_set_loc(const H5T_t *dt, H5F_t *f, H5T_loc_t loc)
                  */
                 break;
 
+            case H5T_LOC_MAXLOC:
+                /* MAXLOC is invalid */
             default:
                 HGOTO_ERROR(H5E_DATATYPE, H5E_BADRANGE, FAIL, "invalid VL datatype location")
         } /* end switch */ /*lint !e788 All appropriate cases are covered */
@@ -387,7 +365,6 @@ H5T_vlen_seq_mem_getptr(void *_vl)
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static htri_t
 H5T_vlen_seq_mem_isnull(const H5F_t H5_ATTR_UNUSED *f, void *_vl)
 {
@@ -425,7 +402,6 @@ H5T_vlen_seq_mem_isnull(const H5F_t H5_ATTR_UNUSED *f, void *_vl)
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
 H5T_vlen_seq_mem_read(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, void *_vl, void *buf, size_t len)
 {
@@ -467,7 +443,6 @@ H5T_vlen_seq_mem_read(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, voi
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
 H5T_vlen_seq_mem_write(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const H5T_vlen_alloc_info_t *vl_alloc_info, void *_vl, void *buf, void H5_ATTR_UNUSED *_bg, size_t seq_len, size_t base_size)
 {
@@ -524,7 +499,6 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
 H5T_vlen_seq_mem_setnull(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, void *_vl, void H5_ATTR_UNUSED *_bg)
 {
@@ -628,7 +602,6 @@ H5T_vlen_str_mem_getptr(void *_vl)
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static htri_t
 H5T_vlen_str_mem_isnull(const H5F_t H5_ATTR_UNUSED *f, void *_vl)
 {
@@ -660,7 +633,6 @@ H5T_vlen_str_mem_isnull(const H5F_t H5_ATTR_UNUSED *f, void *_vl)
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
 H5T_vlen_str_mem_read(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, void *_vl, void *buf, size_t len)
 {
@@ -701,7 +673,6 @@ H5T_vlen_str_mem_read(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, voi
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
 H5T_vlen_str_mem_write(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, const H5T_vlen_alloc_info_t *vl_alloc_info, void *_vl, void *buf, void H5_ATTR_UNUSED *_bg, size_t seq_len, size_t base_size)
 {
@@ -716,11 +687,11 @@ H5T_vlen_str_mem_write(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, co
 
     /* Use the user's memory allocation routine if one is defined */
     if(vl_alloc_info->alloc_func!=NULL) {
-        if(NULL==(t=(vl_alloc_info->alloc_func)((seq_len+1)*base_size,vl_alloc_info->alloc_info)))
+        if(NULL==(t = (char *)(vl_alloc_info->alloc_func)((seq_len+1)*base_size,vl_alloc_info->alloc_info)))
             HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for VL data")
       } /* end if */
     else {  /* Default to system malloc */
-        if(NULL==(t=H5MM_malloc((seq_len+1)*base_size)))
+        if(NULL==(t = (char *)H5MM_malloc((seq_len+1)*base_size)))
             HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for VL data")
       } /* end else */
 
@@ -748,7 +719,6 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
 H5T_vlen_str_mem_setnull(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, void *_vl, void H5_ATTR_UNUSED *_bg)
 {
@@ -779,7 +749,7 @@ static ssize_t
 H5T_vlen_disk_getlen(const void *_vl)
 {
     const uint8_t *vl=(const uint8_t *)_vl; /* Pointer to the disk VL information */
-    size_t	seq_len;        /* Sequence length */
+    size_t	seq_len = 0;    /* Sequence length */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -804,7 +774,6 @@ H5T_vlen_disk_getlen(const void *_vl)
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static void *
 H5T_vlen_disk_getptr(void H5_ATTR_UNUSED *vl)
 {
@@ -862,7 +831,6 @@ H5T_vlen_disk_isnull(const H5F_t *f, void *_vl)
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
 H5T_vlen_disk_read(H5F_t *f, hid_t dxpl_id, void *_vl, void *buf, size_t H5_ATTR_UNUSED len)
 {
@@ -908,7 +876,6 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
 H5T_vlen_disk_write(H5F_t *f, hid_t dxpl_id, const H5T_vlen_alloc_info_t H5_ATTR_UNUSED *vl_alloc_info,
     void *_vl, void *buf, void *_bg, size_t seq_len, size_t base_size)
@@ -1119,8 +1086,24 @@ H5T_vlen_reclaim_recurse(void *elem, const H5T_t *dt, H5MM_free_t free_func, voi
             } /* end else */
             break;
 
+        /* Don't do anything for simple types */
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+        case H5T_TIME:
+        case H5T_STRING:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_REFERENCE:
+        case H5T_ENUM:
+            break;
+
+        /* Should never have these values */
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
         default:
+            HGOTO_ERROR(H5E_DATATYPE, H5E_BADRANGE, FAIL, "invalid VL datatype class")
             break;
+
     } /* end switch */ /*lint !e788 All appropriate cases are covered */
 
 done:
@@ -1152,7 +1135,6 @@ done:
  EXAMPLES
  REVISION LOG
 --------------------------------------------------------------------------*/
-/* ARGSUSED */
 herr_t
 H5T_vlen_reclaim(void *elem, hid_t type_id, unsigned H5_ATTR_UNUSED ndim, const hsize_t H5_ATTR_UNUSED *point, void *op_data)
 {
@@ -1167,7 +1149,7 @@ H5T_vlen_reclaim(void *elem, hid_t type_id, unsigned H5_ATTR_UNUSED ndim, const
     HDassert(H5I_DATATYPE == H5I_get_type(type_id));
 
     /* Check args */
-    if(NULL == (dt = H5I_object_verify(type_id, H5I_DATATYPE)))
+    if(NULL == (dt = (H5T_t *)H5I_object_verify(type_id, H5I_DATATYPE)))
         HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype")
 
     /* Pull the free function and free info pointer out of the op_data and call the recurse datatype free function */
diff --git a/src/H5UC.c b/src/H5UC.c
new file mode 100644
index 0000000..5762cc5
--- /dev/null
+++ b/src/H5UC.c
@@ -0,0 +1,130 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Reference counting buffer algorithms.
+ *
+ * These are used for various internal buffers which are shared.
+ *
+ * The module used to be H5RC, but changed to H5UC because of 
+ * conflicting requirement for the use of H5RC.
+ *
+ */
+
+
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5FLprivate.h"	/* Free lists                           */
+#include "H5UCprivate.h"        /* Reference-counted buffers            */
+
+/* Private typedefs & structs */
+
+/* Declare a free list to manage the H5UC_t struct */
+H5FL_DEFINE_STATIC(H5UC_t);
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5UC_create
+ PURPOSE
+    Create a reference counted object
+ USAGE
+    H5UC_t *H5UC_create(o,free)
+        const void *o;          IN: Object to initialize ref-counted object with
+        H5UC_free_func_t free;  IN: Function to call when ref-count drop to zero
+
+ RETURNS
+    Returns a pointer to a new ref-counted object on success, NULL on failure.
+ DESCRIPTION
+    Create a reference counted object.  The object is not duplicated, it is
+    assumed to be owned by the reference counted object now and will be freed
+    with the 'free' function when the reference count drops to zero.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+H5UC_t *
+H5UC_create(void *o, H5UC_free_func_t free_func)
+{
+    H5UC_t *ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI(NULL)
+
+    /* Sanity check */
+    HDassert(o);
+    HDassert(free_func);
+
+    /* Allocate ref-counted string structure */
+    if(NULL == (ret_value = H5FL_MALLOC(H5UC_t)))
+        HGOTO_ERROR(H5E_RS,H5E_NOSPACE,NULL,"memory allocation failed")
+
+    /* Set the internal fields */
+    ret_value->o = o;
+    ret_value->n = 1;
+    ret_value->free_func = free_func;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5UC_create() */
+
+

+/*--------------------------------------------------------------------------
+ NAME
+    H5UC_decr
+ PURPOSE
+    Decrement the reference count for a ref-counted object
+ USAGE
+    herr_t H5UC_decr(rc)
+        H5UC_t *rc;             IN: Ref-counted object to decrement count for
+
+ RETURNS
+    SUCCEED/FAIL
+ DESCRIPTION
+    Decrements the reference count for a ref-counted object, calling the
+    object's free function if ref-count drops to zero.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5UC_decr(H5UC_t *rc)
+{
+    herr_t ret_value = SUCCEED;   /* Return value */
+
+    FUNC_ENTER_NOAPI(FAIL)
+
+    /* Sanity check */
+    HDassert(rc);
+    HDassert(rc->o);
+    HDassert(rc->n > 0);
+    HDassert(rc->free_func);
+
+    /* Decrement reference count */
+    rc->n--;
+
+    /* Check if we should delete this object now */
+    if(rc->n == 0) {
+        if((rc->free_func)(rc->o) < 0) {
+            rc = H5FL_FREE(H5UC_t, rc);
+            HGOTO_ERROR(H5E_RS, H5E_CANTFREE, FAIL, "memory release failed")
+        } /* end if */
+        rc = H5FL_FREE(H5UC_t, rc);
+    } /* end if */
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5UC_decr() */
+
diff --git a/src/H5UCprivate.h b/src/H5UCprivate.h
new file mode 100644
index 0000000..a702c03
--- /dev/null
+++ b/src/H5UCprivate.h
@@ -0,0 +1,66 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file contains private information about the H5UC module
+ * The module used to be H5RC, but changed to H5UC because of 
+ * conflicting requirement for the use of H5RC.
+ */
+
+#ifndef _H5UCprivate_H
+#define _H5UCprivate_H
+
+/**************************************/
+/* Public headers needed by this file */
+/**************************************/
+#ifdef LATER
+#include "H5UCpublic.h"
+#endif /* LATER */
+
+/***************************************/
+/* Private headers needed by this file */
+/***************************************/
+#include "H5private.h"
+
+/************/
+/* Typedefs */
+/************/
+
+/* Typedef for function to release object when reference count drops to zero */
+typedef herr_t (*H5UC_free_func_t)(void *o);
+
+/* Typedef for reference counted objects */
+typedef struct H5UC_t {
+    void *o;            /* Object to be reference counted */
+    size_t n;           /* Reference count of number of pointers sharing object */
+    H5UC_free_func_t free_func; /* Function to free object */
+} H5UC_t;
+
+/**********/
+/* Macros */
+/**********/
+#define H5UC_INC(rc)            ((rc)->n++)
+#define H5UC_DEC(rc)            (H5UC_decr(rc))
+#define H5UC_GET_OBJ(rc)        ((rc)->o)
+
+/********************/
+/* Private routines */
+/********************/
+H5_DLL H5UC_t *H5UC_create(void *s, H5UC_free_func_t free_func);
+H5_DLL herr_t H5UC_decr(H5UC_t *rc);
+
+#endif /* _H5RSprivate_H */
+
+
diff --git a/src/H5VM.c b/src/H5VM.c
index a1eafb6..c546609 100644
--- a/src/H5VM.c
+++ b/src/H5VM.c
@@ -386,56 +386,6 @@ done:
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5VM_hyper_disjointp
- *
- * Purpose:	Determines if two hyperslabs are disjoint.
- *
- * Return:	Success:	FALSE if they are not disjoint.
- *				TRUE if they are disjoint.
- *
- *		Failure:	A hyperslab of zero size is disjoint from all
- *				other hyperslabs.
- *
- * Programmer:	Robb Matzke
- *		Thursday, October 16, 1997
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-htri_t
-H5VM_hyper_disjointp(unsigned n,
-    const hsize_t *offset1, const uint32_t *size1,
-    const hsize_t *offset2, const uint32_t *size2)
-{
-    unsigned	u;
-    htri_t      ret_value = FALSE;        /* Return value */
-
-    /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
-    FUNC_ENTER_NOAPI_NOINIT_NOERR
-
-    if(!n || !size1 || !size2)
-        HGOTO_DONE(TRUE)
-
-    for(u = 0; u < n; u++) {
-        HDassert(size1[u] < HSIZET_MAX);
-        HDassert(size2[u] < HSIZET_MAX);
-
-        if(0 == size1[u] || 0 == size2[u])
-            HGOTO_DONE(TRUE)
-        if(((offset1 ? offset1[u] : 0) < (offset2 ? offset2[u] : 0) &&
-                    ((offset1 ? offset1[u] : 0) + size1[u] <= (offset2 ? offset2[u] : 0))) ||
-                ((offset2 ? offset2[u] : 0) < (offset1 ? offset1[u] : 0) &&
-                    ((offset2 ? offset2[u] : 0) + size2[u] <= (offset1 ? offset1[u] : 0))))
-            HGOTO_DONE(TRUE)
-    } /* end for */
-
-done:
-    FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5VM_hyper_disjointp() */
-
-

-/*-------------------------------------------------------------------------
  * Function:	H5VM_hyper_fill
  *
  * Purpose:	Similar to memset() except it operates on hyperslabs...
@@ -1069,17 +1019,12 @@ H5VM_array_down(unsigned n, const hsize_t *total_size, hsize_t *down)
  * Programmer:	Quincey Koziol
  *		Tuesday, June 22, 1999
  *
- * Modifications:
- *              Use precomputed accumulator array
- *              Quincey Koziol
- *		Saturday, April 26, 2003
- *
  *-------------------------------------------------------------------------
  */
 hsize_t
 H5VM_array_offset_pre(unsigned n, const hsize_t *acc, const hsize_t *offset)
 {
-    int             i;		/*counter				*/
+    unsigned        u;		/* Local index variable */
     hsize_t	    ret_value;  /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -1089,8 +1034,8 @@ H5VM_array_offset_pre(unsigned n, const hsize_t *acc, const hsize_t *offset)
     HDassert(offset);
 
     /* Compute offset in array */
-    for(i = (int)(n - 1), ret_value = 0; i >= 0; --i)
-        ret_value += acc[i] * offset[i];
+    for(u = 0, ret_value = 0; u < n; u++)
+        ret_value += acc[u] * offset[u];
 
     FUNC_LEAVE_NOAPI(ret_value)
 } /* end H5VM_array_offset_pre() */
@@ -1158,7 +1103,7 @@ done:
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
+herr_t
 H5VM_array_calc_pre(hsize_t offset, unsigned n, const hsize_t *down,
     hsize_t *coords)
 {
@@ -1259,21 +1204,52 @@ done:
  *              The chunk index is placed in the CHUNK_IDX location for return
  *              from this function
  *
- * Return:	Non-negative on success/Negative on failure
+ * Return:	Chunk index on success (can't fail)
  *
  * Programmer:	Quincey Koziol
  *		Monday, April 21, 2003
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
-herr_t
+hsize_t
 H5VM_chunk_index(unsigned ndims, const hsize_t *coord, const uint32_t *chunk,
-    const hsize_t *down_nchunks, hsize_t *chunk_idx)
+    const hsize_t *down_nchunks)
 {
-    hsize_t	scaled_coord[H5VM_HYPER_NDIMS];	/* Scaled, coordinates, in terms of chunks */
-    unsigned    u;                      /* Local index variable */
+    hsize_t scaled_coord[H5VM_HYPER_NDIMS];	/* Scaled, coordinates, in terms of chunks */
+    hsize_t chunk_idx;          /* Chunk index computed */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(ndims <= H5VM_HYPER_NDIMS);
+    HDassert(coord);
+    HDassert(chunk);
+    HDassert(down_nchunks);
+
+    /* Defer to H5VM_chunk_index_scaled */
+    chunk_idx = H5VM_chunk_index_scaled(ndims, coord, chunk, down_nchunks, scaled_coord);
+    
+    FUNC_LEAVE_NOAPI(chunk_idx)
+} /* end H5VM_chunk_index() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_chunk_scaled
+ *
+ * Purpose:	Compute the scaled coordinates for a chunk offset
+ *
+ * Return:	<none>
+ *
+ * Programmer:	Quincey Koziol
+ *		Wednesday, November 19, 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+H5VM_chunk_scaled(unsigned ndims, const hsize_t *coord, const uint32_t *chunk,
+    hsize_t *scaled)
+{
+    unsigned u;                 /* Local index variable */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
@@ -1281,17 +1257,86 @@ H5VM_chunk_index(unsigned ndims, const hsize_t *coord, const uint32_t *chunk,
     HDassert(ndims <= H5VM_HYPER_NDIMS);
     HDassert(coord);
     HDassert(chunk);
-    HDassert(chunk_idx);
+    HDassert(scaled);
 
     /* Compute the scaled coordinates for actual coordinates */
-    for(u=0; u<ndims; u++)
-        scaled_coord[u]=coord[u]/chunk[u];
+    /* (Note that the 'scaled' array is an 'OUT' parameter) */
+    for(u = 0; u < ndims; u++)
+        scaled[u] = coord[u] / chunk[u];
+
+    FUNC_LEAVE_NOAPI_VOID
+} /* end H5VM_chunk_scaled() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5VM_chunk_index_scaled
+ *
+ * Purpose:	Given a coordinate offset (COORD), the size of each chunk
+ *              (CHUNK), the number of chunks in each dimension (NCHUNKS)
+ *              and the number of dimensions of all of these (NDIMS), calculate
+ *              a "chunk index" for the chunk that the coordinate offset is
+ *              located in.
+ *
+ *              The chunk index starts at 0 and increases according to the
+ *              fastest changing dimension, then the next fastest, etc.
+ *
+ *              For example, with a 3x5 chunk size and 6 chunks in the fastest
+ *              changing dimension and 3 chunks in the slowest changing
+ *              dimension, the chunk indices are as follows:
+ *
+ *              +-----+-----+-----+-----+-----+-----+
+ *              |     |     |     |     |     |     |
+ *              |  0  |  1  |  2  |  3  |  4  |  5  |
+ *              |     |     |     |     |     |     |
+ *              +-----+-----+-----+-----+-----+-----+
+ *              |     |     |     |     |     |     |
+ *              |  6  |  7  |  8  |  9  | 10  | 11  |
+ *              |     |     |     |     |     |     |
+ *              +-----+-----+-----+-----+-----+-----+
+ *              |     |     |     |     |     |     |
+ *              | 12  | 13  | 14  | 15  | 16  | 17  |
+ *              |     |     |     |     |     |     |
+ *              +-----+-----+-----+-----+-----+-----+
+ *
+ *              The chunk index is placed in the CHUNK_IDX location for return
+ *              from this function
+ *
+ * Note:	This routine is identical to H5VM_chunk_index(), except for
+ *		caching the scaled information.  Make changes in both places.
+ *
+ * Return:	Chunk index on success (can't fail)
+ *
+ * Programmer:	Vailin Choi
+ *		Monday, February 9, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+hsize_t
+H5VM_chunk_index_scaled(unsigned ndims, const hsize_t *coord, const uint32_t *chunk,
+    const hsize_t *down_nchunks, hsize_t *scaled)
+{
+    hsize_t chunk_idx;          /* Computed chunk index */
+    unsigned u;                 /* Local index variable */
+
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    /* Sanity check */
+    HDassert(ndims <= H5VM_HYPER_NDIMS);
+    HDassert(coord);
+    HDassert(chunk);
+    HDassert(down_nchunks);
+    HDassert(scaled);
+
+    /* Compute the scaled coordinates for actual coordinates */
+    /* (Note that the 'scaled' array is an 'OUT' parameter) */
+    for(u = 0; u < ndims; u++)
+        scaled[u] = coord[u] / chunk[u];
 
     /* Compute the chunk index */
-    *chunk_idx=H5VM_array_offset_pre(ndims,down_nchunks,scaled_coord); /*lint !e772 scaled_coord will always be initialized */
+    chunk_idx = H5VM_array_offset_pre(ndims, down_nchunks, scaled); /*lint !e772 scaled_coord will always be initialized */
 
-    FUNC_LEAVE_NOAPI(SUCCEED)
-} /* end H5VM_chunk_index() */
+    FUNC_LEAVE_NOAPI(chunk_idx)
+} /* end H5VM_chunk_index_scaled() */
 
 

 /*-------------------------------------------------------------------------
diff --git a/src/H5VMprivate.h b/src/H5VMprivate.h
index 78799d8..cbe108a 100644
--- a/src/H5VMprivate.h
+++ b/src/H5VMprivate.h
@@ -49,6 +49,39 @@ typedef herr_t (*H5VM_opvv_func_t)(hsize_t dst_off, hsize_t src_off,
 
 #define H5VM_vector_zero(N,DST) HDmemset(DST,0,(N)*sizeof(*(DST)))
 
+/* Given a coordinate offset array (COORDS) of type TYPE, move the unlimited
+ * dimension (UNLIM_DIM) value to offset 0, sliding any intermediate values down
+ * one position. */
+#define H5VM_swizzle_coords(TYPE,COORDS,UNLIM_DIM) {                            \
+    /* COORDS must be an array of type TYPE */                                 \
+    HDassert(sizeof(COORDS[0]) == sizeof(TYPE));                               \
+                                                                               \
+    /* Nothing to do when unlimited dimension is at position 0 */              \
+    if(0 != (UNLIM_DIM)) {                                                     \
+        TYPE _tmp = (COORDS)[UNLIM_DIM];                                       \
+                                                                               \
+        HDmemmove(&(COORDS)[1], &(COORDS)[0], sizeof(TYPE) * (UNLIM_DIM));     \
+        (COORDS)[0] = _tmp;                                                    \
+    } /* end if */                                                             \
+}
+
+/* Given a coordinate offset array (COORDS) of type TYPE, move the value at
+ * offset 0 to offset of the unlimied dimension (UNLIM_DIM), sliding any
+ * intermediate values up one position.  Undoes the "swizzle_coords" operation.
+ */
+#define H5VM_unswizzle_coords(TYPE,COORDS,UNLIM_DIM) {                          \
+    /* COORDS must be an array of type TYPE */                                 \
+    HDassert(sizeof(COORDS[0]) == sizeof(TYPE));                               \
+                                                                               \
+    /* Nothing to do when unlimited dimension is at position 0 */              \
+    if(0 != (UNLIM_DIM)) {                                                     \
+        TYPE _tmp = (COORDS)[0];                                               \
+                                                                               \
+        HDmemmove(&(COORDS)[0], &(COORDS)[1], sizeof(TYPE) * (UNLIM_DIM));     \
+        (COORDS)[UNLIM_DIM] = _tmp;                                            \
+    } /* end if */                                                             \
+}
+
 /* A null pointer is equivalent to a zero vector */
 #define H5VM_ZERO        NULL
 
@@ -56,8 +89,6 @@ H5_DLL hsize_t H5VM_hyper_stride(unsigned n, const hsize_t *size,
 				 const hsize_t *total_size,
 				 const hsize_t *offset,
 				 hsize_t *stride);
-H5_DLL htri_t H5VM_hyper_disjointp(unsigned n, const hsize_t *offset1,
-    const uint32_t *size1, const hsize_t *offset2, const uint32_t *size2);
 H5_DLL htri_t H5VM_hyper_eq(unsigned n, const hsize_t *offset1,
 			    const hsize_t *size1, const hsize_t *offset2,
 			    const hsize_t *size2);
@@ -87,10 +118,16 @@ H5_DLL hsize_t H5VM_array_offset_pre(unsigned n,
     const hsize_t *acc, const hsize_t *offset);
 H5_DLL hsize_t H5VM_array_offset(unsigned n, const hsize_t *total_size,
     const hsize_t *offset);
+H5_DLL herr_t H5VM_array_calc_pre(hsize_t offset, unsigned n,
+    const hsize_t *down, hsize_t *coords);
 H5_DLL herr_t H5VM_array_calc(hsize_t offset, unsigned n,
     const hsize_t *total_size, hsize_t *coords);
-H5_DLL herr_t H5VM_chunk_index(unsigned ndims, const hsize_t *coord,
-    const uint32_t *chunk, const hsize_t *down_nchunks, hsize_t *chunk_idx);
+H5_DLL hsize_t H5VM_chunk_index(unsigned ndims, const hsize_t *coord,
+    const uint32_t *chunk, const hsize_t *down_nchunks);
+H5_DLL void H5VM_chunk_scaled(unsigned ndims, const hsize_t *coord,
+    const uint32_t *chunk, hsize_t *scaled);
+H5_DLL hsize_t H5VM_chunk_index_scaled(unsigned ndims, const hsize_t *coord,
+    const uint32_t *chunk, const hsize_t *down_nchunks, hsize_t *scaled);
 H5_DLL ssize_t H5VM_opvv(size_t dst_max_nseq, size_t *dst_curr_seq, size_t dst_len_arr[],
     hsize_t dst_off_arr[],
     size_t src_max_nseq, size_t *src_curr_seq, size_t src_len_arr[],
@@ -399,7 +436,7 @@ static const unsigned MultiplyDeBruijnBitPosition[32] =
  *
  *-------------------------------------------------------------------------
  */
-static H5_INLINE unsigned H5_ATTR_UNUSED
+static H5_INLINE H5_ATTR_PURE unsigned
 H5VM_log2_of2(uint32_t n)
 {
 #ifndef NDEBUG
@@ -410,6 +447,29 @@ H5VM_log2_of2(uint32_t n)
 
 

 /*-------------------------------------------------------------------------
+ * Function:	H5VM_power2up
+ *
+ * Purpose:	Round up a number to the next power of 2
+ *
+ * Return:	Return the number which is a power of 2
+ *
+ * Programmer:	Vailin Choi; Nov 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_INLINE H5_ATTR_CONST hsize_t
+H5VM_power2up(hsize_t n)
+{
+    hsize_t     ret_value = 1;  /* Return value */
+
+    while(ret_value < n)
+        ret_value <<= 1;
+
+    return(ret_value);
+} /* H5VM_power2up */
+
+

+/*-------------------------------------------------------------------------
  * Function:    H5VM_limit_enc_size
  *
  * Purpose:     Determine the # of bytes needed to encode values within a
diff --git a/src/H5Z.c b/src/H5Z.c
index 8d85c81..87fc803 100644
--- a/src/H5Z.c
+++ b/src/H5Z.c
@@ -13,10 +13,7 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
-
-/* Interface initialization */
-#define H5_INTERFACE_INIT_FUNC	H5Z_init_interface
+#include "H5Zmodule.h"          /* This source code file is part of the H5Z module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -57,6 +54,9 @@ typedef enum {
     H5Z_PRELUDE_SET_LOCAL       /* Call "set local" callback */
 } H5Z_prelude_type_t;
 
+/* Package initialization variable */
+hbool_t H5_PKG_INIT_VAR = FALSE;
+
 /* Local variables */
 static size_t		H5Z_table_alloc_g = 0;
 static size_t		H5Z_table_used_g = 0;
@@ -73,7 +73,7 @@ static int H5Z__flush_file_cb(void *obj_ptr, hid_t obj_id, void *key);
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5Z_init_interface
+ * Function:	H5Z__init_package
  *
  * Purpose:	Initializes the data filter layer.
  *
@@ -82,45 +82,43 @@ static int H5Z__flush_file_cb(void *obj_ptr, hid_t obj_id, void *key);
  * Programmer:	Robb Matzke
  *              Thursday, April 16, 1998
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
-static herr_t
-H5Z_init_interface (void)
+herr_t
+H5Z__init_package(void)
 {
-    herr_t	ret_value=SUCCEED;      /* Return value */
+    herr_t ret_value = SUCCEED;         /* Return value */
 
-    FUNC_ENTER_NOAPI_NOINIT
+    FUNC_ENTER_PACKAGE
 
     /* Internal filters */
-    if (H5Z_register (H5Z_SHUFFLE)<0)
-        HGOTO_ERROR (H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register shuffle filter")
-    if (H5Z_register (H5Z_FLETCHER32)<0)
-        HGOTO_ERROR (H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register fletcher32 filter")
-    if (H5Z_register (H5Z_NBIT)<0)
-        HGOTO_ERROR (H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register nbit filter")
-    if (H5Z_register (H5Z_SCALEOFFSET)<0)
-        HGOTO_ERROR (H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register scaleoffset filter")
+    if(H5Z_register(H5Z_SHUFFLE) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register shuffle filter")
+    if(H5Z_register(H5Z_FLETCHER32) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register fletcher32 filter")
+    if(H5Z_register(H5Z_NBIT) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register nbit filter")
+    if(H5Z_register(H5Z_SCALEOFFSET) < 0)
+        HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register scaleoffset filter")
 
     /* External filters */
 #ifdef H5_HAVE_FILTER_DEFLATE
-    if (H5Z_register (H5Z_DEFLATE)<0)
+    if(H5Z_register(H5Z_DEFLATE) < 0)
         HGOTO_ERROR (H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register deflate filter")
 #endif /* H5_HAVE_FILTER_DEFLATE */
 #ifdef H5_HAVE_FILTER_SZIP
     H5Z_SZIP->encoder_present = SZ_encoder_enabled();
-    if (H5Z_register (H5Z_SZIP)<0)
+    if(H5Z_register(H5Z_SZIP) < 0)
         HGOTO_ERROR (H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register szip filter")
 #endif /* H5_HAVE_FILTER_SZIP */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
-}
+} /* end H5Z__init_package() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5Z_term_interface
+ * Function:	H5Z_term_package
  *
  * Purpose:	Terminate the H5Z layer.
  *
@@ -129,44 +127,44 @@ done:
  * Programmer:	Robb Matzke
  *              Thursday, April 16, 1998
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 int
-H5Z_term_interface(void)
+H5Z_term_package(void)
 {
-#ifdef H5Z_DEBUG
-    size_t	i;
-    int		dir, nprint=0;
-    char	comment[16], bandwidth[32];
-#endif
+    int	n = 0;
 
-    if(H5_interface_initialize_g) {
+    FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+    if(H5_PKG_INIT_VAR) {
 #ifdef H5Z_DEBUG
-	if (H5DEBUG(Z)) {
-	    for (i=0; i<H5Z_table_used_g; i++) {
-		for (dir=0; dir<2; dir++) {
-		    if (0==H5Z_stat_table_g[i].stats[dir].total) continue;
+        char comment[16], bandwidth[32];
+        int dir, nprint = 0;
+        size_t i;
 
-		    if (0==nprint++) {
+	if(H5DEBUG(Z)) {
+	    for(i = 0; i < H5Z_table_used_g; i++) {
+		for(dir = 0; dir<2; dir++) {
+		    if(0 == H5Z_stat_table_g[i].stats[dir].total)
+                        continue;
+
+		    if(0 == nprint++) {
 			/* Print column headers */
-			HDfprintf (H5DEBUG(Z), "H5Z: filter statistics "
+			HDfprintf(H5DEBUG(Z), "H5Z: filter statistics "
 				   "accumulated over life of library:\n");
-			HDfprintf (H5DEBUG(Z),
+			HDfprintf(H5DEBUG(Z),
 				   "   %-16s %10s %10s %8s %8s %8s %10s\n",
 				   "Filter", "Total", "Errors", "User",
 				   "System", "Elapsed", "Bandwidth");
-			HDfprintf (H5DEBUG(Z),
+			HDfprintf(H5DEBUG(Z),
 				   "   %-16s %10s %10s %8s %8s %8s %10s\n",
 				   "------", "-----", "------", "----",
 				   "------", "-------", "---------");
-		    }
+		    } /* end if */
 
 		    /* Truncate the comment to fit in the field */
-		    HDstrncpy(comment, H5Z_table_g[i].name,
-			      sizeof comment);
-		    comment[sizeof(comment)-1] = '\0';
+		    HDstrncpy(comment, H5Z_table_g[i].name, sizeof comment);
+		    comment[sizeof(comment) - 1] = '\0';
 
 		    /*
 		     * Format bandwidth to have four significant digits and
@@ -178,7 +176,7 @@ H5Z_term_interface(void)
 				 H5Z_stat_table_g[i].stats[dir].timer.etime);
 
 		    /* Print the statistics */
-		    HDfprintf (H5DEBUG(Z),
+		    HDfprintf(H5DEBUG(Z),
 			       "   %s%-15s %10Hd %10Hd %8.2f %8.2f %8.2f "
 			       "%10s\n", dir?"<":">", comment,
 			       H5Z_stat_table_g[i].stats[dir].total,
@@ -187,21 +185,28 @@ H5Z_term_interface(void)
 			       H5Z_stat_table_g[i].stats[dir].timer.stime,
 			       H5Z_stat_table_g[i].stats[dir].timer.etime,
 			       bandwidth);
-		}
-	    }
-	}
+		} /* end for */
+	    } /* end for */
+	} /* end if */
 #endif /* H5Z_DEBUG */
 	/* Free the table of filters */
-	H5Z_table_g = (H5Z_class2_t *)H5MM_xfree(H5Z_table_g);
+        if(H5Z_table_g) {
+            H5Z_table_g = (H5Z_class2_t *)H5MM_xfree(H5Z_table_g);
 #ifdef H5Z_DEBUG
-	H5Z_stat_table_g = (H5Z_stats_t *)H5MM_xfree(H5Z_stat_table_g);
+            H5Z_stat_table_g = (H5Z_stats_t *)H5MM_xfree(H5Z_stat_table_g);
 #endif /* H5Z_DEBUG */
-	H5Z_table_used_g = H5Z_table_alloc_g = 0;
-	H5_interface_initialize_g = 0;
+            H5Z_table_used_g = H5Z_table_alloc_g = 0;
+
+            n++;
+        } /* end if */
+
+	/* Mark interface as closed */
+        if(0 == n)
+            H5_PKG_INIT_VAR = FALSE;
     } /* end if */
 
-    return(0);
-} /* end H5Z_term_interface() */
+    FUNC_LEAVE_NOAPI(n)
+} /* end H5Z_term_package() */
 
 

 /*-------------------------------------------------------------------------
@@ -825,8 +830,8 @@ H5Z_prepare_prelude_callback_dcpl(hid_t dcpl_id, hid_t type_id, H5Z_prelude_type
         if(NULL == (dc_plist = (H5P_genplist_t *)H5I_object(dcpl_id)))
             HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get dataset creation property list")
 
-        /* Get layout information */
-        if(H5P_get(dc_plist, H5D_CRT_LAYOUT_NAME, &dcpl_layout) < 0)
+        /* Peek at the layout information */
+        if(H5P_peek(dc_plist, H5D_CRT_LAYOUT_NAME, &dcpl_layout) < 0)
             HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't retrieve layout")
 
         /* Check if the dataset is chunked */
@@ -834,7 +839,7 @@ H5Z_prepare_prelude_callback_dcpl(hid_t dcpl_id, hid_t type_id, H5Z_prelude_type
             H5O_pline_t     dcpl_pline;     /* Object's I/O pipeline information */
 
             /* Get I/O pipeline information */
-            if(H5P_get(dc_plist, H5O_CRT_PIPELINE_NAME, &dcpl_pline) < 0)
+            if(H5P_peek(dc_plist, H5O_CRT_PIPELINE_NAME, &dcpl_pline) < 0)
                 HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't retrieve pipeline filter")
 
             /* Check if the chunks have filters */
@@ -843,7 +848,7 @@ H5Z_prepare_prelude_callback_dcpl(hid_t dcpl_id, hid_t type_id, H5Z_prelude_type
                 H5S_t *space;           /* Dataspace describing chunk */
                 size_t u;               /* Local index variable */
 
-                /* Create a dataspace for a chunk & set the extent */
+                /* Create a data space for a chunk & set the extent */
                 for(u = 0; u < dcpl_layout.u.chunk.ndims; u++)
                     chunk_dims[u] = dcpl_layout.u.chunk.dim[u];
                 if(NULL == (space = H5S_create_simple(dcpl_layout.u.chunk.ndims, chunk_dims, NULL)))
@@ -1323,21 +1328,20 @@ H5Z_pipeline(const H5O_pline_t *pline, unsigned flags,
              */
 	    if((fclass_idx = H5Z_find_idx(pline->filter[idx].id)) < 0) {
                 hbool_t issue_error = FALSE;
+				const H5Z_class2_t    *filter_info;
 
-                    const H5Z_class2_t    *filter_info;
-
-                    /* Try loading the filter */
-                    if(NULL != (filter_info = (const H5Z_class2_t *)H5PL_load(H5PL_TYPE_FILTER, (int)(pline->filter[idx].id)))) {
-                        /* Register the filter we loaded */
-                        if(H5Z_register(filter_info) < 0)
-                            HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register filter")
+				/* Try loading the filter */
+				if(NULL != (filter_info = (const H5Z_class2_t *)H5PL_load(H5PL_TYPE_FILTER, (int)(pline->filter[idx].id)))) {
+					/* Register the filter we loaded */
+					if(H5Z_register(filter_info) < 0)
+						HGOTO_ERROR(H5E_PLINE, H5E_CANTINIT, FAIL, "unable to register filter")
 
-                        /* Search in the table of registered filters again to find the dynamic filter just loaded and registered */ 
-                        if((fclass_idx = H5Z_find_idx(pline->filter[idx].id)) < 0)
-                            issue_error = TRUE;
-                    } /* end if */
-                    else
-                        issue_error = TRUE;
+					/* Search in the table of registered filters again to find the dynamic filter just loaded and registered */
+					if((fclass_idx = H5Z_find_idx(pline->filter[idx].id)) < 0)
+						issue_error = TRUE;
+				} /* end if */
+				else
+					issue_error = TRUE;
 
                 /* Check for error */
                 if(issue_error) {
@@ -1446,8 +1450,8 @@ done:
 H5Z_filter_info_t *
 H5Z_filter_info(const H5O_pline_t *pline, H5Z_filter_t filter)
 {
-    size_t	idx;                    /* Index of filter in pipeline */
-    H5Z_filter_info_t *ret_value;       /* Return value */
+    size_t	idx;                            /* Index of filter in pipeline */
+    H5Z_filter_info_t *ret_value = NULL;        /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
diff --git a/src/H5Zdeflate.c b/src/H5Zdeflate.c
index 06d9866..15aac27 100644
--- a/src/H5Zdeflate.c
+++ b/src/H5Zdeflate.c
@@ -18,7 +18,7 @@
  *              Friday, August 27, 1999
  */
 
-#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
+#include "H5Zmodule.h"          /* This source code file is part of the H5Z module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -77,7 +77,7 @@ H5Z_filter_deflate (unsigned flags, size_t cd_nelmts,
 {
     void	*outbuf = NULL;         /* Pointer to new buffer */
     int		status;                 /* Status from zlib operation */
-    size_t	ret_value;              /* Return value */
+    size_t	ret_value = 0;          /* Return value */
 
     FUNC_ENTER_NOAPI(0)
 
diff --git a/src/H5Zfletcher32.c b/src/H5Zfletcher32.c
index 1877ddd..9ff85cc 100644
--- a/src/H5Zfletcher32.c
+++ b/src/H5Zfletcher32.c
@@ -14,11 +14,11 @@
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
 /*
- * Programmer:  Raymond Lu<slu at ncsa.uiuc.edu>
+ * Programmer:  Raymond Lu <slu at ncsa.uiuc.edu>
  *              Jan 3, 2003
  */
 
-#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
+#include "H5Zmodule.h"          /* This source code file is part of the H5Z module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -70,7 +70,6 @@ const H5Z_class2_t H5Z_FLETCHER32[1] = {{
  *              with Release 1.6.2 and before.
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static size_t
 H5Z_filter_fletcher32 (unsigned flags, size_t H5_ATTR_UNUSED cd_nelmts, const unsigned H5_ATTR_UNUSED cd_values[],
                      size_t nbytes, size_t *buf_size, void **buf)
@@ -81,7 +80,7 @@ H5Z_filter_fletcher32 (unsigned flags, size_t H5_ATTR_UNUSED cd_nelmts, const un
     uint32_t reversed_fletcher; /* Possible wrong checksum value */
     uint8_t  c[4];
     uint8_t  tmp;
-    size_t   ret_value;         /* Return value */
+    size_t   ret_value = 0;     /* Return value */
 
     FUNC_ENTER_NOAPI(0)
 
diff --git a/src/H5Zmodule.h b/src/H5Zmodule.h
new file mode 100644
index 0000000..fa0ef8f
--- /dev/null
+++ b/src/H5Zmodule.h
@@ -0,0 +1,35 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:	Quincey Koziol <koziol at hdfgroup.org>
+ *		Saturday, September 12, 2015
+ *
+ * Purpose:	This file contains declarations which define macros for the
+ *		H5Z package.  Including this header means that the source file
+ *		is part of the H5Z package.
+ */
+#ifndef _H5Zmodule_H
+#define _H5Zmodule_H
+
+/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error
+ *      reporting macros.
+ */
+#define H5Z_MODULE
+#define H5_MY_PKG       H5Z
+#define H5_MY_PKG_ERR   H5E_PLINE
+#define H5_MY_PKG_INIT  YES
+
+#endif /* _H5Zmodule_H */
+
diff --git a/src/H5Znbit.c b/src/H5Znbit.c
index 38610b6..e2fb300 100644
--- a/src/H5Znbit.c
+++ b/src/H5Znbit.c
@@ -13,7 +13,7 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
+#include "H5Zmodule.h"          /* This source code file is part of the H5Z module */
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5Eprivate.h"		/* Error handling		  	*/
@@ -266,9 +266,23 @@ H5Z_calc_parms_array(const H5T_t *type)
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot compute parameters for datatype")
             break;
 
-        default: /* Other datatype class: nbit does no compression */
+        case H5T_TIME:
+        case H5T_STRING:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_REFERENCE:
+        case H5T_ENUM:
+        case H5T_VLEN:
+            /* Other datatype classes: nbit does no compression */
             H5Z_calc_parms_nooptype();
             break;
+
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+        default:
+            /* Badness */
+            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit received bad datatype")
+            break;
     } /* end switch */
 
 done:
@@ -351,9 +365,23 @@ H5Z_calc_parms_compound(const H5T_t *type)
                     HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot compute parameters for datatype")
                 break;
 
-            default: /* Other datatype class: nbit does no compression */
+            case H5T_TIME:
+            case H5T_STRING:
+            case H5T_BITFIELD:
+            case H5T_OPAQUE:
+            case H5T_REFERENCE:
+            case H5T_ENUM:
+            case H5T_VLEN:
+                /* Other datatype classes: nbit does no compression */
                 H5Z_calc_parms_nooptype();
                 break;
+
+            case H5T_NO_CLASS:
+            case H5T_NCLASSES:
+            default:
+                /* Badness */
+                HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit received bad datatype")
+                break;
         } /* end switch */
 
         /* Close member datatype */
@@ -444,7 +472,7 @@ H5Z_set_parms_atomic(const H5T_t *type, unsigned cd_values[])
 
     /* Get datatype's size */
     if((dtype_size = H5T_get_size(type)) == 0)
-	HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype size")
+        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype size")
 
     /* Set "local" parameter for datatype size */
     cd_values[cd_values_index++] = dtype_size;
@@ -463,6 +491,10 @@ H5Z_set_parms_atomic(const H5T_t *type, unsigned cd_values[])
             cd_values[cd_values_index++] = H5Z_NBIT_ORDER_BE;
             break;
 
+        case H5T_ORDER_VAX:
+        case H5T_ORDER_MIXED:
+        case H5T_ORDER_ERROR:
+        case H5T_ORDER_NONE:
         default:
             HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype endianness order")
     } /* end switch */
@@ -561,7 +593,7 @@ H5Z_set_parms_array(const H5T_t *type, unsigned cd_values[])
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
             break;
 
-        default: /* other datatype that nbit does no compression */
+        case H5T_VLEN:
             /* Check if base datatype is a variable-length string */
             if((is_vlstring = H5T_is_variable_str(dtype_base)) < 0)
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot determine if datatype is a variable-length string")
@@ -573,6 +605,23 @@ H5Z_set_parms_array(const H5T_t *type, unsigned cd_values[])
             if(H5Z_set_parms_nooptype(dtype_base, cd_values) == FAIL)
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
             break;
+
+        case H5T_TIME:
+        case H5T_STRING:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_REFERENCE:
+        case H5T_ENUM:
+            if(H5Z_set_parms_nooptype(dtype_base, cd_values) == FAIL)
+                HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+        default:
+            /* Badness */
+            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit received bad datatype")
+            break;
     } /* end switch */
 
 done:
@@ -666,16 +715,16 @@ H5Z_set_parms_compound(const H5T_t *type, unsigned cd_values[])
                     HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
                 break;
 
-            default: /* other datatype that nbit does no compression */
+            case H5T_VLEN:
                 /* Check if datatype is a variable-length string */
                 if((is_vlstring = H5T_is_variable_str(dtype_member)) < 0)
                     HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot determine if datatype is a variable-length string")
 
                 /* Because for some no-op datatype (VL datatype and VL string datatype), its
-		 * size can not be retrieved correctly by using function call H5T_get_size,
-		 * special handling is needed for getting the size. Here the difference between
+		         * size can not be retrieved correctly by using function call H5T_get_size,
+		         * special handling is needed for getting the size. Here the difference between
                  * adjacent member offset is used (if alignment is present, the result can be
-		 * larger, but it does not affect the nbit filter's correctness).
+		         * larger, but it does not affect the nbit filter's correctness).
                  */
                 if(dtype_member_class == H5T_VLEN || is_vlstring) {
                     /* Set datatype class code */
@@ -688,9 +737,25 @@ H5Z_set_parms_compound(const H5T_t *type, unsigned cd_values[])
 
                     /* Set "local" parameter for datatype size */
                     cd_values[cd_values_index++] = dtype_next_member_offset - dtype_member_offset;
-                } else
-                    if(H5Z_set_parms_nooptype(dtype_member, cd_values)==FAIL)
-                        HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
+                } 
+                break;
+
+            case H5T_TIME:
+            case H5T_STRING:
+            case H5T_BITFIELD:
+            case H5T_OPAQUE:
+            case H5T_REFERENCE:
+            case H5T_ENUM:
+                /* other datatype that nbit does no compression */
+                if(H5Z_set_parms_nooptype(dtype_member, cd_values) == FAIL)
+                    HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
+                break;
+
+            case H5T_NO_CLASS:
+            case H5T_NCLASSES:
+            default:
+                /* Badness */
+                HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit was passed bad datatype")
                 break;
         } /* end switch */
 
@@ -770,8 +835,22 @@ H5Z_set_local_nbit(hid_t dcpl_id, hid_t type_id, hid_t space_id)
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot compute parameters for datatype")
             break;
 
-        default: /* no need to calculate other datatypes at top level */
-             break;
+        case H5T_TIME:
+        case H5T_STRING:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_REFERENCE:
+        case H5T_ENUM:
+        case H5T_VLEN:
+            /* No need to calculate other datatypes at top level */
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+        default:
+            /* Badness */
+            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit received bad datatype")
+            break;
     } /* end switch */
 
     /* Check if the number of parameters exceed what cd_values[] can store */
@@ -826,8 +905,22 @@ H5Z_set_local_nbit(hid_t dcpl_id, hid_t type_id, hid_t space_id)
                 HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit cannot set parameters for datatype")
             break;
 
-        default: /* no need to set parameters for other datatypes at top level */
-             break;
+        case H5T_TIME:
+        case H5T_STRING:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_REFERENCE:
+        case H5T_ENUM:
+        case H5T_VLEN:
+            /* No need to set parameters for other datatypes at top level */
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+        default:
+            /* Badness */
+            HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "nbit received bad datatype")
+            break;
     } /* end switch */
 
     /* Check if calculation of parameters matches with setting of parameters */
diff --git a/src/H5Zpkg.h b/src/H5Zpkg.h
index e2cec89..aa2ffe2 100644
--- a/src/H5Zpkg.h
+++ b/src/H5Zpkg.h
@@ -13,7 +13,7 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#ifndef H5Z_PACKAGE
+#if !(defined H5Z_FRIEND || defined H5Z_MODULE)
 #error "Do not include this file outside the H5Z package!"
 #endif
 
diff --git a/src/H5Zscaleoffset.c b/src/H5Zscaleoffset.c
index 673b9e0..0dc12a3 100644
--- a/src/H5Zscaleoffset.c
+++ b/src/H5Zscaleoffset.c
@@ -13,7 +13,7 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
+#include "H5Zmodule.h"          /* This source code file is part of the H5Z module */
 
 #include "H5private.h"		/* Generic Functions			*/
 #include "H5ACprivate.h"	/* Metadata cache			*/
@@ -49,7 +49,7 @@ static herr_t H5Z_set_local_scaleoffset(hid_t dcpl_id, hid_t type_id, hid_t spac
 static size_t H5Z_filter_scaleoffset(unsigned flags, size_t cd_nelmts,
     const unsigned cd_values[], size_t nbytes, size_t *buf_size, void **buf);
 static void H5Z_scaleoffset_convert(void *buf, unsigned d_nelmts, size_t dtype_size);
-static unsigned H5Z_scaleoffset_log2(unsigned long long num);
+static H5_ATTR_CONST unsigned H5Z_scaleoffset_log2(unsigned long long num);
 static void H5Z_scaleoffset_precompress_i(void *data, unsigned d_nelmts,
     enum H5Z_scaleoffset_t type, unsigned filavail, const unsigned cd_values[],
     uint32_t *minbits, unsigned long long *minval);
@@ -746,7 +746,7 @@ static enum H5Z_scaleoffset_t
 H5Z_scaleoffset_get_type(unsigned dtype_class, unsigned dtype_size, unsigned dtype_sign)
 {
     enum H5Z_scaleoffset_t type = t_bad; /* integer type */
-    enum H5Z_scaleoffset_t ret_value;             /* return value */
+    enum H5Z_scaleoffset_t ret_value = t_bad;   /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -977,6 +977,7 @@ H5Z_set_local_scaleoffset(hid_t dcpl_id, hid_t type_id, hid_t space_id)
 
         case H5T_ORDER_ERROR:
         case H5T_ORDER_VAX:
+        case H5T_ORDER_MIXED:
         case H5T_ORDER_NONE:
         default:
             HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "bad datatype endianness order")
@@ -1075,6 +1076,7 @@ H5Z_filter_scaleoffset(unsigned flags, size_t cd_nelmts, const unsigned cd_value
 
         case H5T_ORDER_ERROR:
         case H5T_ORDER_VAX:
+        case H5T_ORDER_MIXED:
         case H5T_ORDER_NONE:
         default:
             HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, 0, "bad H5T_NATIVE_INT endianness order")
diff --git a/src/H5Zshuffle.c b/src/H5Zshuffle.c
index 654a7d5..4cf6adf 100644
--- a/src/H5Zshuffle.c
+++ b/src/H5Zshuffle.c
@@ -13,7 +13,7 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
+#include "H5Zmodule.h"          /* This source code file is part of the H5Z module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -61,7 +61,6 @@ const H5Z_class2_t H5Z_SHUFFLE[1] = {{
  *
  *-------------------------------------------------------------------------
  */
-/* ARGSUSED */
 static herr_t
 H5Z_set_local_shuffle(hid_t dcpl_id, hid_t type_id, hid_t H5_ATTR_UNUSED space_id)
 {
@@ -135,7 +134,7 @@ H5Z_filter_shuffle(unsigned flags, size_t cd_nelmts, const unsigned cd_values[],
     size_t j;                   /* Local index variable */
 #endif /* NO_DUFFS_DEVICE */
     size_t leftover;            /* Extra bytes at end of buffer */
-    size_t ret_value;           /* Return value */
+    size_t ret_value = 0;       /* Return value */
 
     FUNC_ENTER_NOAPI(0)
 
diff --git a/src/H5Zszip.c b/src/H5Zszip.c
index dc09ebf..2c2ed07 100644
--- a/src/H5Zszip.c
+++ b/src/H5Zszip.c
@@ -13,7 +13,7 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
+#include "H5Zmodule.h"          /* This source code file is part of the H5Z module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -190,7 +190,7 @@ H5Z_set_local_szip(hid_t dcpl_id, hid_t type_id, hid_t space_id)
 
     /* Get dataspace */
     if(NULL == (ds = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
-        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
+        HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space")
 
     /* Get dimensions for dataspace */
     if((ndims = H5S_get_simple_extent_dims(ds, dims, NULL)) < 0)
@@ -333,7 +333,7 @@ H5Z_filter_szip (unsigned flags, size_t cd_nelmts, const unsigned cd_values[],
         *buf = outbuf;
         outbuf = NULL;
         *buf_size = nalloc;
-        ret_value = nalloc;
+        ret_value = size_out;
     }
     /* Output; compress */
     else {
@@ -359,7 +359,7 @@ H5Z_filter_szip (unsigned flags, size_t cd_nelmts, const unsigned cd_values[],
         /* Set return values */
         *buf = outbuf;
         outbuf = NULL;
-        *buf_size = size_out+4;
+        *buf_size = nbytes+4;
         ret_value = size_out+4;
     }
 
diff --git a/src/H5Ztrans.c b/src/H5Ztrans.c
index 7a94487..0a9a4da 100644
--- a/src/H5Ztrans.c
+++ b/src/H5Ztrans.c
@@ -13,7 +13,7 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#define H5Z_PACKAGE		/*suppress error about including H5Zpkg	  */
+#include "H5Zmodule.h"          /* This source code file is part of the H5Z module */
 
 
 #include "H5private.h"		/* Generic Functions			*/
@@ -255,8 +255,14 @@ static void H5Z_print(H5Z_node *tree, FILE *stream);
     else                                                                                                                \
     {                                                                                                                   \
         ret_value->type = (TYPE);                                                                                       \
-        ret_value->lchild = (H5Z_node*) H5Z_xform_copy_tree(tree->lchild, dat_val_pointers, new_dat_val_pointers);      \
-        ret_value->rchild = (H5Z_node*) H5Z_xform_copy_tree(tree->rchild, dat_val_pointers, new_dat_val_pointers);      \
+        if(tree->lchild)												\
+            ret_value->lchild = (H5Z_node*) H5Z_xform_copy_tree(tree->lchild, dat_val_pointers, new_dat_val_pointers);  \
+        else														\
+            ret_value->lchild = NULL;											\
+        if(tree->rchild)												\
+            ret_value->rchild = (H5Z_node*) H5Z_xform_copy_tree(tree->rchild, dat_val_pointers, new_dat_val_pointers);  \
+        else														\
+            ret_value->rchild = NULL;											\
     }                                                                                                                   \
 }
 
@@ -542,7 +548,7 @@ static void *
 H5Z_xform_parse(const char *expression, H5Z_datval_ptrs* dat_val_pointers)
 {
     H5Z_token tok;
-    void* ret_value;
+    void *ret_value = NULL;             /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -581,7 +587,7 @@ static H5Z_node *
 H5Z_parse_expression(H5Z_token *current, H5Z_datval_ptrs* dat_val_pointers)
 {
     H5Z_node *expr;
-    H5Z_node *ret_value;        /* Return value */
+    H5Z_node *ret_value = NULL;         /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -675,7 +681,7 @@ static H5Z_node *
 H5Z_parse_term(H5Z_token *current, H5Z_datval_ptrs* dat_val_pointers)
 {
     H5Z_node *term = NULL;
-    H5Z_node *ret_value;
+    H5Z_node *ret_value = NULL;         /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -731,11 +737,21 @@ H5Z_parse_term(H5Z_token *current, H5Z_datval_ptrs* dat_val_pointers)
             case H5Z_XFORM_END:
                 HGOTO_DONE(term)
 
-            default:
+            case H5Z_XFORM_INTEGER:
+            case H5Z_XFORM_FLOAT:
+            case H5Z_XFORM_SYMBOL:
+            case H5Z_XFORM_PLUS:
+            case H5Z_XFORM_MINUS:
+            case H5Z_XFORM_LPAREN:
                 H5Z_unget_token(current);
                 HGOTO_DONE(term)
-	}
-    }
+
+            case H5Z_XFORM_ERROR:
+            default:
+                H5Z_xform_destroy_parse_tree(term);
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "bad transform type passed to data transform expression")
+	    } /* end switch */
+    } /* end for */
 
 done:
     FUNC_LEAVE_NOAPI(ret_value)
@@ -766,119 +782,122 @@ H5Z_parse_factor(H5Z_token *current, H5Z_datval_ptrs* dat_val_pointers)
 {
     H5Z_node 	*factor=NULL;
     H5Z_node 	*new_node;
-    H5Z_node    *ret_value;
+    H5Z_node    *ret_value = NULL;         /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
     current = H5Z_get_token(current);
 
     switch (current->tok_type) {
-	case H5Z_XFORM_INTEGER:
-	    factor = H5Z_new_node(H5Z_XFORM_INTEGER);
+        case H5Z_XFORM_INTEGER:
+            factor = H5Z_new_node(H5Z_XFORM_INTEGER);
 
-	    if (!factor)
-                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Unable to allocate new node")
+            if (!factor)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Unable to allocate new node")
             sscanf(current->tok_begin, "%ld", &factor->value.int_val);
-	    break;
+            break;
 
-	case H5Z_XFORM_FLOAT:
-	    factor = H5Z_new_node(H5Z_XFORM_FLOAT);
+        case H5Z_XFORM_FLOAT:
+            factor = H5Z_new_node(H5Z_XFORM_FLOAT);
 
-	    if (!factor)
-                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Unable to allocate new node")
+            if (!factor)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Unable to allocate new node")
             sscanf(current->tok_begin, "%lf", &factor->value.float_val);
-	    break;
+            break;
 
-	case H5Z_XFORM_SYMBOL:
-	    factor = H5Z_new_node(H5Z_XFORM_SYMBOL);
+        case H5Z_XFORM_SYMBOL:
+            factor = H5Z_new_node(H5Z_XFORM_SYMBOL);
 
-	    if (!factor)
-                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Unable to allocate new node")
+            if (!factor)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Unable to allocate new node")
 
             factor->value.dat_val = &(dat_val_pointers->ptr_dat_val[dat_val_pointers->num_ptrs]);
-	    dat_val_pointers->num_ptrs++;
-	    break;
+            dat_val_pointers->num_ptrs++;
+            break;
 
-	case H5Z_XFORM_LPAREN:
-	    factor = H5Z_parse_expression(current, dat_val_pointers);
+        case H5Z_XFORM_LPAREN:
+            factor = H5Z_parse_expression(current, dat_val_pointers);
 
-	    if (!factor)
-                HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Unable to allocate new node")
+            if (!factor)
+                    HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "Unable to allocate new node")
 
             current = H5Z_get_token(current);
 
-	    if (current->tok_type != H5Z_XFORM_RPAREN) {
-		H5Z_xform_destroy_parse_tree(factor);
-		HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Syntax error in data transform expression")
-	    }
-	    break;
-
-	case H5Z_XFORM_RPAREN:
-	    /* We shouldn't see a ) right now */
-	    H5Z_xform_destroy_parse_tree(factor);
-	    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Syntax error: unexpected ')' ")
+            if (current->tok_type != H5Z_XFORM_RPAREN) {
+                H5Z_xform_destroy_parse_tree(factor);
+                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Syntax error in data transform expression")
+            }
+            break;
 
-	case H5Z_XFORM_PLUS:
-            /* unary + */
-            new_node = H5Z_parse_factor(current, dat_val_pointers);
+        case H5Z_XFORM_RPAREN:
+            /* We shouldn't see a ) right now */
+            H5Z_xform_destroy_parse_tree(factor);
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Syntax error: unexpected ')' ")
+
+        case H5Z_XFORM_PLUS:
+                /* unary + */
+                new_node = H5Z_parse_factor(current, dat_val_pointers);
+
+                if (new_node) {
+                    if (new_node->type != H5Z_XFORM_INTEGER && new_node->type != H5Z_XFORM_FLOAT &&
+                            new_node->type != H5Z_XFORM_SYMBOL) {
+                        H5Z_xform_destroy_parse_tree(new_node);
+                        H5Z_xform_destroy_parse_tree(factor);
+                        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
+                    }
 
-            if (new_node) {
-                if (new_node->type != H5Z_XFORM_INTEGER && new_node->type != H5Z_XFORM_FLOAT &&
-                        new_node->type != H5Z_XFORM_SYMBOL) {
-                    H5Z_xform_destroy_parse_tree(new_node);
-                    H5Z_xform_destroy_parse_tree(factor);
-                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
-                }
+                    factor = new_node;
+                    new_node = H5Z_new_node(H5Z_XFORM_PLUS);
 
-                factor = new_node;
-                new_node = H5Z_new_node(H5Z_XFORM_PLUS);
+                    if (!new_node) {
+                        H5Z_xform_destroy_parse_tree(factor);
+                        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
+                    }
 
-                if (!new_node) {
+                    new_node->rchild = factor;
+                    factor = new_node;
+                } else {
                     H5Z_xform_destroy_parse_tree(factor);
                     HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
                 }
+                break;
 
-                new_node->rchild = factor;
-                factor = new_node;
-            } else {
-                H5Z_xform_destroy_parse_tree(factor);
-                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
-            }
-            break;
+        case H5Z_XFORM_MINUS:
+                /* unary - */
+                new_node = H5Z_parse_factor(current, dat_val_pointers);
 
-	case H5Z_XFORM_MINUS:
-            /* unary - */
-            new_node = H5Z_parse_factor(current, dat_val_pointers);
+                if (new_node) {
+                    if (new_node->type != H5Z_XFORM_INTEGER && new_node->type != H5Z_XFORM_FLOAT &&
+                            new_node->type != H5Z_XFORM_SYMBOL) {
+                        H5Z_xform_destroy_parse_tree(new_node);
+                        H5Z_xform_destroy_parse_tree(factor);
+                        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
+                    }
 
-            if (new_node) {
-                if (new_node->type != H5Z_XFORM_INTEGER && new_node->type != H5Z_XFORM_FLOAT &&
-                        new_node->type != H5Z_XFORM_SYMBOL) {
-                    H5Z_xform_destroy_parse_tree(new_node);
-                    H5Z_xform_destroy_parse_tree(factor);
-                    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
-                }
+                    factor = new_node;
+                    new_node = H5Z_new_node(H5Z_XFORM_MINUS);
 
-                factor = new_node;
-                new_node = H5Z_new_node(H5Z_XFORM_MINUS);
+                    if (!new_node) {
+                        H5Z_xform_destroy_parse_tree(factor);
+                        HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
+                    }
 
-                if (!new_node) {
+                    new_node->rchild = factor;
+                    factor = new_node;
+                } else {
                     H5Z_xform_destroy_parse_tree(factor);
                     HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
                 }
+                break;
 
-                new_node->rchild = factor;
-                factor = new_node;
-            } else {
-                H5Z_xform_destroy_parse_tree(factor);
-                HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error parsing data transform expression")
-            }
-            break;
-
-	case H5Z_XFORM_END:
-            break;
+        case H5Z_XFORM_END:
+                break;
 
-	default:
-	    HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Invalid token while parsing data transform expression")
+        case H5Z_XFORM_MULT:
+        case H5Z_XFORM_DIVIDE:
+        case H5Z_XFORM_ERROR:
+        default:
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Invalid token while parsing data transform expression")
 
     }
 
@@ -905,7 +924,7 @@ done:
 static H5Z_node *
 H5Z_new_node(H5Z_token_type type)
 {
-    H5Z_node *ret_value;
+    H5Z_node *ret_value = NULL;         /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT
 
@@ -1091,23 +1110,30 @@ H5Z_xform_eval_full(H5Z_node *tree, const size_t array_size,  const hid_t array_
 
 	switch (tree->type) {
 	    case H5Z_XFORM_PLUS:
-	 	H5Z_XFORM_TYPE_OP(resl, resr, array_type, +, array_size)
-		break;
+            H5Z_XFORM_TYPE_OP(resl, resr, array_type, +, array_size)
+            break;
 
 	    case H5Z_XFORM_MINUS:
-	 	H5Z_XFORM_TYPE_OP(resl, resr, array_type, -, array_size)
-		break;
+            H5Z_XFORM_TYPE_OP(resl, resr, array_type, -, array_size)
+            break;
 
 	    case H5Z_XFORM_MULT:
-		H5Z_XFORM_TYPE_OP(resl, resr, array_type, *, array_size)
-		break;
+            H5Z_XFORM_TYPE_OP(resl, resr, array_type, *, array_size)
+            break;
 
 	    case H5Z_XFORM_DIVIDE:
-	 	H5Z_XFORM_TYPE_OP(resl, resr, array_type, /, array_size)
-		break;
+            H5Z_XFORM_TYPE_OP(resl, resr, array_type, /, array_size)
+            break;
 
+        case H5Z_XFORM_ERROR:
+        case H5Z_XFORM_INTEGER:
+        case H5Z_XFORM_FLOAT:
+        case H5Z_XFORM_SYMBOL:
+        case H5Z_XFORM_LPAREN:
+        case H5Z_XFORM_RPAREN:
+        case H5Z_XFORM_END:
 	    default:
-		HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Invalid expression tree")
+            HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Invalid expression tree")
 	} /* end switch */
 
 	/* The result stores a pointer to the new data */
@@ -1277,14 +1303,11 @@ H5Z_xform_copy_tree(H5Z_node* tree, H5Z_datval_ptrs* dat_val_pointers, H5Z_datva
         H5Z_XFORM_DO_OP4(H5Z_XFORM_MINUS)
     else if(tree->type == H5Z_XFORM_DIVIDE)
         H5Z_XFORM_DO_OP4(H5Z_XFORM_DIVIDE)
-
     else
         HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "Error in parse tree while trying to copy")
 
-
-
-            done:
-            FUNC_LEAVE_NOAPI(ret_value)
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
 }
 
 

@@ -1458,10 +1481,10 @@ H5Z_do_op(H5Z_node* tree)
 H5Z_data_xform_t *
 H5Z_xform_create(const char *expr)
 {
-    H5Z_data_xform_t *data_xform_prop=NULL;
-    H5Z_data_xform_t *ret_value;
+    H5Z_data_xform_t *data_xform_prop = NULL;
     unsigned int i;
     unsigned int count = 0;
+    H5Z_data_xform_t *ret_value = NULL;         /* Return value */
 
     FUNC_ENTER_NOAPI(NULL)
 
@@ -1494,7 +1517,7 @@ H5Z_xform_create(const char *expr)
      * of the data we have for polynomial transforms */
     data_xform_prop->dat_val_pointers->num_ptrs = 0;
 
-     /* we generate the parse tree right here and store a poitner to its root in the property. */
+     /* we generate the parse tree right here and store a pointer to its root in the property. */
     if((data_xform_prop->parse_root = (H5Z_node *)H5Z_xform_parse(expr, data_xform_prop->dat_val_pointers))==NULL)
         HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "unable to generate parse tree from expression")
 
@@ -1590,8 +1613,6 @@ H5Z_xform_destroy(H5Z_data_xform_t *data_xform_prop)
  *      after the top-level copy has been performed and this routine finishes
  *      the "deep" part of the copy.
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 herr_t
@@ -1677,7 +1698,7 @@ done:
 hbool_t
 H5Z_xform_noop(const H5Z_data_xform_t *data_xform_prop)
 {
-    hbool_t ret_value;
+    hbool_t ret_value = FALSE;          /* Return value */
 
     FUNC_ENTER_NOAPI_NOINIT_NOERR
 
diff --git a/src/H5api_adpt.h b/src/H5api_adpt.h
index ab7287c..910bef9 100644
--- a/src/H5api_adpt.h
+++ b/src/H5api_adpt.h
@@ -21,28 +21,6 @@
 #ifndef H5API_ADPT_H
 #define H5API_ADPT_H
 
-/*
- * Does the compiler support the __attribute__(()) syntax?  It's no
- * big deal if we don't.
- *
- * Note that Solaris Studio supports attribute, but does not support the
- * attributes we use.
- */
-#ifdef __cplusplus
-#   define H5_ATTR_FORMAT(X,Y,Z)  /*void*/
-#   define H5_ATTR_UNUSED    /*void*/
-#   define H5_ATTR_NORETURN  /*void*/
-#else /* __cplusplus */
-#if defined(H5_HAVE_ATTRIBUTE) && !defined(__SUNPRO_C)
-#   define H5_ATTR_FORMAT(X,Y,Z)  __attribute__((format(X, Y, Z)))
-#   define H5_ATTR_UNUSED    __attribute__((unused))
-#   define H5_ATTR_NORETURN  __attribute__((noreturn))
-#else
-#   define H5_ATTR_FORMAT(X,Y,Z)  /*void*/
-#   define H5_ATTR_UNUSED    /*void*/
-#   define H5_ATTR_NORETURN  /*void*/
-#endif
-#endif /* __cplusplus */
 
 /* This will only be defined if HDF5 was built with CMake */
 #ifdef H5_BUILT_AS_DYNAMIC_LIB
diff --git a/src/H5config.h.in b/src/H5config.h.in
index 6075f3f..c787deb 100644
--- a/src/H5config.h.in
+++ b/src/H5config.h.in
@@ -13,7 +13,7 @@
 /* Define the default plugins path to compile */
 #undef DEFAULT_PLUGINDIR
 
-/* Define if `dev_t' is a scalar */
+/* Define if dev_t is a scalar */
 #undef DEV_T_IS_SCALAR
 
 /* Define to dummy `main' function (if any) required to link to the Fortran
@@ -30,6 +30,42 @@
 /* As FC_FUNC, but for C identifiers containing underscores. */
 #undef FC_FUNC_
 
+/* Define if Fortran C_LONG_DOUBLE is different from C_DOUBLE */
+#undef FORTRAN_C_LONG_DOUBLE_IS_UNIQUE
+
+/* Define if we have Fortran C_LONG_DOUBLE */
+#undef FORTRAN_HAVE_C_LONG_DOUBLE
+
+/* Define if we have Fortran intrinsic C_SIZEOF */
+#undef FORTRAN_HAVE_C_SIZEOF
+
+/* Define if we have Fortran intrinsic SIZEOF */
+#undef FORTRAN_HAVE_SIZEOF
+
+/* Define if we have Fortran intrinsic STORAGE_SIZE */
+#undef FORTRAN_HAVE_STORAGE_SIZE
+
+/* Determine the size of C long double */
+#undef FORTRAN_SIZEOF_LONG_DOUBLE
+
+/* Define Fortran compiler ID */
+#undef Fortran_COMPILER_ID
+
+/* Define valid Fortran INTEGER KINDs */
+#undef H5CONFIG_F_IKIND
+
+/* Define number of valid Fortran INTEGER KINDs */
+#undef H5CONFIG_F_NUM_IKIND
+
+/* Define number of valid Fortran REAL KINDs */
+#undef H5CONFIG_F_NUM_RKIND
+
+/* Define valid Fortran REAL KINDs */
+#undef H5CONFIG_F_RKIND
+
+/* Define valid Fortran REAL KINDs Sizeof */
+#undef H5CONFIG_F_RKIND_SIZEOF
+
 /* Define to 1 if you have the `alarm' function. */
 #undef HAVE_ALARM
 
@@ -73,6 +109,9 @@
 /* Define if library information should be embedded in the executables */
 #undef HAVE_EMBEDDED_LIBINFO
 
+/* Define to 1 if you have the `fcntl' function. */
+#undef HAVE_FCNTL
+
 /* Define to 1 if you have the <features.h> header file. */
 #undef HAVE_FEATURES_H
 
@@ -82,6 +121,12 @@
 /* Define if support for szip filter is enabled */
 #undef HAVE_FILTER_SZIP
 
+/* Determine if __float128 is available */
+#undef HAVE_FLOAT128
+
+/* Define to 1 if you have the `flock' function. */
+#undef HAVE_FLOCK
+
 /* Define to 1 if you have the `fork' function. */
 #undef HAVE_FORK
 
@@ -112,6 +157,9 @@
 /* Define if the compiler understands the __FUNCTION__ keyword */
 #undef HAVE_FUNCTION
 
+/* Determine if INTEGER*16 is available */
+#undef HAVE_Fortran_INTEGER_SIZEOF_16
+
 /* Define to 1 if you have the `GetConsoleScreenBufferInfo' function. */
 #undef HAVE_GETCONSOLESCREENBUFFERINFO
 
@@ -191,10 +239,10 @@
 /* Define to 1 if you have the <mpe.h> header file. */
 #undef HAVE_MPE_H
 
-/* Define if `MPI_Comm_c2f' and `MPI_Comm_f2c' exists */
+/* Define if MPI_Comm_c2f and MPI_Comm_f2c exist */
 #undef HAVE_MPI_MULTI_LANG_Comm
 
-/* Define if `MPI_Info_c2f' and `MPI_Info_f2c' exists */
+/* Define if MPI_Info_c2f and MPI_Info_f2c exist */
 #undef HAVE_MPI_MULTI_LANG_Info
 
 /* Define if we have parallel support */
@@ -203,6 +251,9 @@
 /* Define to 1 if you have the <pthread.h> header file. */
 #undef HAVE_PTHREAD_H
 
+/* Define to 1 if you have the <quadmath.h> header file. */
+#undef HAVE_QUADMATH_H
+
 /* Define to 1 if you have the `random' function. */
 #undef HAVE_RANDOM
 
@@ -239,9 +290,12 @@
 /* Define to 1 if you have the `stat64' function. */
 #undef HAVE_STAT64
 
-/* Define if `struct stat' has the `st_blocks' field */
+/* Define if struct stat has the st_blocks field */
 #undef HAVE_STAT_ST_BLOCKS
 
+/* Define to 1 if you have the <stdbool.h> header file. */
+#undef HAVE_STDBOOL_H
+
 /* Define to 1 if you have the <stddef.h> header file. */
 #undef HAVE_STDDEF_H
 
@@ -260,10 +314,10 @@
 /* Define to 1 if you have the <string.h> header file. */
 #undef HAVE_STRING_H
 
-/* Define if `struct text_info' is defined */
+/* Define if struct text_info is defined */
 #undef HAVE_STRUCT_TEXT_INFO
 
-/* Define if `struct videoconfig' is defined */
+/* Define if struct videoconfig is defined */
 #undef HAVE_STRUCT_VIDEOCONFIG
 
 /* Define to 1 if you have the `symlink' function. */
@@ -272,6 +326,9 @@
 /* Define to 1 if you have the `system' function. */
 #undef HAVE_SYSTEM
 
+/* Define to 1 if you have the <sys/file.h> header file. */
+#undef HAVE_SYS_FILE_H
+
 /* Define to 1 if you have the <sys/ioctl.h> header file. */
 #undef HAVE_SYS_IOCTL_H
 
@@ -299,7 +356,7 @@
 /* Define if we have thread safe support */
 #undef HAVE_THREADSAFE
 
-/* Define if `timezone' is a global variable */
+/* Define if timezone is a global variable */
 #undef HAVE_TIMEZONE
 
 /* Define if the ioctl TIOCGETD is defined */
@@ -311,7 +368,7 @@
 /* Define to 1 if you have the `tmpfile' function. */
 #undef HAVE_TMPFILE
 
-/* Define if `tm_gmtoff' is a member of `struct tm' */
+/* Define if tm_gmtoff is a member of struct tm */
 #undef HAVE_TM_GMTOFF
 
 /* Define to 1 if you have the <unistd.h> header file. */
@@ -400,9 +457,18 @@
 /* Define to the version of this package. */
 #undef PACKAGE_VERSION
 
+/* Determine the maximum decimal precision in C */
+#undef PAC_C_MAX_REAL_PRECISION
+
+/* Define Fortran Maximum Real Decimal Precision */
+#undef PAC_FC_MAX_REAL_PRECISION
+
 /* Width for printf() for type `long long' or `__int64', use `ll' */
 #undef PRINTF_LL_WIDTH
 
+/* The size of `bool', as computed by sizeof. */
+#undef SIZEOF_BOOL
+
 /* The size of `char', as computed by sizeof. */
 #undef SIZEOF_CHAR
 
@@ -517,6 +583,12 @@
 /* The size of `unsigned', as computed by sizeof. */
 #undef SIZEOF_UNSIGNED
 
+/* The size of `_Quad', as computed by sizeof. */
+#undef SIZEOF__QUAD
+
+/* The size of `__float128', as computed by sizeof. */
+#undef SIZEOF___FLOAT128
+
 /* The size of `__int64', as computed by sizeof. */
 #undef SIZEOF___INT64
 
diff --git a/src/H5detect.c b/src/H5detect.c
index 299f5fa..ee02c52 100644
--- a/src/H5detect.c
+++ b/src/H5detect.c
@@ -40,7 +40,7 @@ static const char *FileHeader = "\n\
  *		Livermore National Laboratory.
  *
  *		Detects machine byte order and floating point
- *		format and generates a C source file (native.c)
+ *		format and generates a C source file (H5Tinit.c)
  *		to describe those paramters.
  *
  * Assumptions: We have an ANSI compiler.  We're on a Unix like
@@ -90,41 +90,41 @@ static const char *FileHeader = "\n\
  * was detected.
  */
 typedef struct detected_t {
-    const char		*varname;
-    int			size;		/*total byte size		*/
-    int			precision;	/*meaningful bits		*/
-    int			offset;		/*bit offset to meaningful bits	*/
-    int			perm[32];	/*for detection of byte order	*/
-    int                 is_vax;         /*for vax (float & double) only */
-    int			sign;		/*location of sign bit		*/
-    int			mpos, msize, imp;/*information about mantissa	*/
-    int			epos, esize;	/*information about exponent	*/
-    unsigned long	bias;		/*exponent bias for floating pt.*/
-    size_t		align;		/*required byte alignment	*/
-    size_t		comp_align;	/*alignment for structure       */
+    const char *varname;
+    unsigned int size;                  /* total byte size                  */
+    unsigned int precision;             /* meaningful bits                  */
+    unsigned int offset;                /* bit offset to meaningful bits    */
+    int perm[32];                       /* for detection of byte order      */
+    hbool_t is_vax;                     /* for vax (float & double) only    */
+    unsigned int sign;                  /* location of sign bit             */
+    unsigned int mpos, msize, imp;      /* information about mantissa       */
+    unsigned int epos, esize;           /* information about exponent       */
+    unsigned long bias;                 /* exponent bias for floating pt    */
+    unsigned int align;                 /* required byte alignment          */
+    unsigned int comp_align;            /* alignment for structure          */
 } detected_t;
 
 /* This structure holds structure alignment for pointers, hvl_t, hobj_ref_t,
  * hdset_reg_ref_t */
 typedef struct malign_t {
     const char          *name;
-    size_t              comp_align;         /*alignment for structure   */
+    unsigned int         comp_align;    /* alignment for structure          */
 } malign_t;
 
 /* global variables types detection code */
-static detected_t	d_g[MAXDETECT];
-static malign_t        m_g[MAXDETECT];
-static volatile int	nd_g = 0, na_g = 0;
+H5_GCC_DIAG_OFF(larger-than=)
+static detected_t d_g[MAXDETECT];
+H5_GCC_DIAG_ON(larger-than=)
+static malign_t m_g[MAXDETECT];
+static volatile int nd_g = 0, na_g = 0;
 
 static void print_results(int nd, detected_t *d, int na, malign_t *m);
 static void iprint(detected_t *);
 static int byte_cmp(int, const void *, const void *, const unsigned char *);
-static int bit_cmp(int, int *, volatile void *, volatile void *,
-    const unsigned char *);
+static unsigned int bit_cmp(unsigned int, int *, void *, void *, const unsigned char *);
 static void fix_order(int, int, int *, const char **);
-static int imp_bit(int, int *, volatile void *, volatile void *,
-    const unsigned char *);
-static unsigned long find_bias(int, int, int *, volatile void *);
+static unsigned int imp_bit(unsigned int, int *, void *, void *, const unsigned char *);
+static unsigned int find_bias(unsigned int, unsigned int, int *, void *);
 static void precision (detected_t*);
 static void print_header(void);
 static void detect_C89_integers(void);
@@ -136,7 +136,7 @@ static void detect_C99_integers16(void);
 static void detect_C99_integers32(void);
 static void detect_C99_integers64(void);
 static void detect_alignments(void);
-static size_t align_g[] = {1, 2, 4, 8, 16};
+static unsigned int align_g[] = {1, 2, 4, 8, 16};
 static int align_status_g = 0;		/* ALIGNMENT Signal Status */
 static int sigbus_handler_called_g = 0;	/* how many times called */
 static int sigsegv_handler_called_g = 0;/* how many times called */
@@ -167,39 +167,41 @@ static H5JMP_BUF jbuf_g;
 static void
 precision (detected_t *d)
 {
-    int		n;
+    unsigned int n;
 
-    if (0==d->msize) {
-	/*
-	 * An integer.	The permutation can have negative values at the
-	 * beginning or end which represent padding of bytes.  We must adjust
-	 * the precision and offset accordingly.
-	 */
-	if (d->perm[0] < 0) {
-	    /*
-	     * Lower addresses are padded.
-	     */
-	    for (n=0; n<d->size && d->perm[n]<0; n++) /*void*/;
-	    d->precision = 8*(d->size-n);
-	    d->offset = 0;
-	} else if (d->perm[d->size - 1] < 0) {
-	    /*
-	     * Higher addresses are padded.
-	     */
-	    for (n=0; n<d->size && d->perm[d->size-(n+1)]; n++) /*void*/;
-	    d->precision = 8*(d->size-n);
-	    d->offset = 8*n;
-	} else {
-	    /*
-	     * No padding.
-	     */
-	    d->precision = 8*d->size;
-	    d->offset = 0;
-	}
+    if (0 == d->msize) {
+        /*
+         * An integer.	The permutation can have negative values at the
+         * beginning or end which represent padding of bytes.  We must adjust
+         * the precision and offset accordingly.
+         */
+        if (d->perm[0] < 0) {
+            /*
+             * Lower addresses are padded.
+             */
+            for (n = 0; n < d->size && d->perm[n] < 0; n++)
+                /*void*/;
+            d->precision = 8 * (d->size - n);
+            d->offset = 0;
+        } else if (d->perm[d->size - 1] < 0) {
+            /*
+             * Higher addresses are padded.
+             */
+            for (n = 0; n < d->size && d->perm[d->size - (n + 1)]; n++)
+                /*void*/;
+            d->precision = 8 * (d->size - n);
+            d->offset = 8 * n;
+        } else {
+            /*
+             * No padding.
+             */
+            d->precision = 8 * d->size;
+            d->offset = 0;
+        }
     } else {
-	/* A floating point */
-	d->offset = MIN3 (d->mpos, d->epos, d->sign);
-	d->precision = d->msize + d->esize + 1;
+        /* A floating point */
+        d->offset = MIN3(d->mpos, d->epos, d->sign);
+        d->precision = d->msize + d->esize + 1;
     }
 }
 
@@ -251,7 +253,8 @@ precision (detected_t *d)
     INFO.size = sizeof(TYPE);                                                 \
                                                                               \
     for(_i = sizeof(DETECT_TYPE), _v = 0; _i > 0; --_i)                       \
-        _v = (_v << 8) + _i;                                                  \
+        _v = (DETECT_TYPE) ((DETECT_TYPE) (_v << 8) + (DETECT_TYPE) _i);      \
+                                                                              \
     for(_i = 0, _x = (unsigned char *)&_v; _i < (signed)sizeof(DETECT_TYPE); _i++) { \
         _j = (*_x++) - 1;                                                     \
         HDassert(_j < (signed)sizeof(DETECT_TYPE));                           \
@@ -290,9 +293,6 @@ precision (detected_t *d)
  *		absence of implicit mantissa bit, and exponent bias and
  *		initializes a detected_t structure with those properties.
  *
- * Note:	'volatile' is used for the variables below to prevent the
- *		compiler from optimizing them away.
- *
  * Return:	void
  *
  * Programmer:	Robb Matzke
@@ -302,12 +302,12 @@ precision (detected_t *d)
  *-------------------------------------------------------------------------
  */
 #define DETECT_F(TYPE,VAR,INFO) {                                             \
-    volatile TYPE _v1, _v2, _v3;                                              \
+    TYPE _v1, _v2, _v3;                                                       \
     unsigned char _buf1[sizeof(TYPE)], _buf3[sizeof(TYPE)];                   \
     unsigned char _pad_mask[sizeof(TYPE)];                                    \
     unsigned char _byte_mask;                                                 \
     int _i, _j, _last = (-1);                                                 \
-    char *_mesg;                                                              \
+    const char *_mesg;                                                        \
                                                                               \
     HDmemset(&INFO, 0, sizeof(INFO));                                         \
     INFO.varname = #VAR;                                                      \
@@ -326,11 +326,13 @@ precision (detected_t *d)
     _v1 = (TYPE)4.0L;                                                         \
     HDmemcpy(_buf1, (const void *)&_v1, sizeof(TYPE));                        \
     for(_i = 0; _i < (int)sizeof(TYPE); _i++)                                 \
-        for(_byte_mask = (unsigned char)1; _byte_mask; _byte_mask <<= 1) {    \
+        for(_byte_mask = (unsigned char)1; _byte_mask; _byte_mask = (unsigned char) (_byte_mask << 1)) {    \
             _buf1[_i] ^= _byte_mask;                                          \
             HDmemcpy((void *)&_v2, (const void *)_buf1, sizeof(TYPE));        \
+            H5_GCC_DIAG_OFF(float-equal)                                      \
             if(_v1 != _v2)                                                    \
                 _pad_mask[_i] |= _byte_mask;                                  \
+            H5_GCC_DIAG_ON(float-equal)                                       \
             _buf1[_i] ^= _byte_mask;                                          \
         } /* end for */                                                       \
                                                                               \
@@ -368,7 +370,7 @@ precision (detected_t *d)
     _v1 = (TYPE)1.0L;                                                         \
     _v2 = (TYPE)1.5L;                                                         \
     INFO.msize = bit_cmp (sizeof(TYPE), INFO.perm, &_v1, &_v2, _pad_mask);    \
-    INFO.msize += 1 + (INFO.imp?0:1) - INFO.mpos;                             \
+    INFO.msize += 1 + (unsigned int) (INFO.imp ? 0 : 1) - INFO.mpos;          \
                                                                               \
     /* Exponent */                                                            \
     INFO.epos = INFO.mpos + INFO.msize;                                       \
@@ -415,14 +417,13 @@ precision (detected_t *d)
         TYPE    x;                                                            \
     } s;                                                                      \
                                                                               \
-    COMP_ALIGN = (size_t)((char*)(&(s.x)) - (char*)(&s));                     \
+    COMP_ALIGN = (unsigned int)((char*)(&(s.x)) - (char*)(&s));               \
 }
 
 #if defined(H5SETJMP) && defined(H5_HAVE_SIGNAL)
 #define ALIGNMENT(TYPE,INFO) {						      \
-    char		*volatile _buf = NULL;				      \
-    volatile TYPE	_val = 1;						      \
-    volatile TYPE	_val2;						      \
+    char *volatile _buf = NULL;   					      \
+    TYPE _val = 1, _val2;						      \
     volatile size_t	_ano = 0;					      \
     void		(*_handler)(int) = HDsignal(SIGBUS, sigbus_handler);  \
     void		(*_handler2)(int) = HDsignal(SIGSEGV, sigsegv_handler);\
@@ -445,8 +446,10 @@ precision (detected_t *d)
 	else /* Little-Endian */					      \
 	    HDmemcpy(_buf+align_g[_ano]+(INFO.offset/8),((char *)&_val)+(INFO.offset/8),(size_t)(INFO.precision/8)); \
 	_val2 = *((TYPE*)(_buf+align_g[_ano]));				      \
+    H5_GCC_DIAG_OFF(float-equal)					      \
 	if(_val!=_val2)							      \
 	    H5LONGJMP(jbuf_g, 1);		        		      \
+    H5_GCC_DIAG_ON(float-equal) 					      \
 	/* End Cray Check */						      \
 	(INFO.align)=align_g[_ano];					      \
     } else {								      \
@@ -605,7 +608,7 @@ print_results(int nd, detected_t *d, int na, malign_t *misc_align)
 /* Module Setup */\n\
 /****************/\n\
 \n\
-#define H5T_PACKAGE /*suppress error about including H5Tpkg.h*/\n\
+#include \"H5Tmodule.h\"          /* This source code file is part of the H5T module */\n\
 \n\
 \n\
 /***********/\n\
@@ -664,7 +667,7 @@ print_results(int nd, detected_t *d, int na, malign_t *misc_align)
     printf("\n\
 
\n\
 /*-------------------------------------------------------------------------\n\
- * Function:	H5TN_init_interface\n\
+ * Function:	H5T__init_native\n\
  *\n\
  * Purpose:	Initialize pre-defined native datatypes from code generated\n\
  *              during the library configuration by H5detect.\n\
@@ -678,12 +681,12 @@ print_results(int nd, detected_t *d, int na, malign_t *misc_align)
  *-------------------------------------------------------------------------\n\
  */\n\
 herr_t\n\
-H5TN_init_interface(void)\n\
+H5T__init_native(void)\n\
 {\n\
     H5T_t	*dt = NULL;\n\
     herr_t	ret_value = SUCCEED;\n\
 \n\
-    FUNC_ENTER_NOAPI(FAIL)\n");
+    FUNC_ENTER_PACKAGE\n");
 
     for(i = 0; i < nd; i++) {
         /* The native endianess of this machine */
@@ -806,7 +809,7 @@ done:\n\
         } /* end if */\n\
     } /* end if */\n\
 \n\
-    FUNC_LEAVE_NOAPI(ret_value);\n} /* end H5TN_init_interface() */\n");
+    FUNC_LEAVE_NOAPI(ret_value);\n} /* end H5T__init_native() */\n");
 
     /* Print the ALIGNMENT and signal-handling status as comments */
     printf("\n"
@@ -881,63 +884,69 @@ done:\n\
 static void
 iprint(detected_t *d)
 {
-    int		i, j, k, pass;
+    unsigned int pass;
 
-    for (pass=(d->size-1)/4; pass>=0; --pass) {
-	/*
-	 * Print the byte ordering above the bit fields.
-	 */
-	printf("    * ");
-	for (i=MIN(pass*4+3,d->size-1); i>=pass*4; --i) {
-	    printf ("%4d", d->perm[i]);
-	    if (i>pass*4) HDfputs ("     ", stdout);
-	}
+    for (pass = (d->size - 1) / 4; ; --pass) {
+        unsigned int i, k;
+        /*
+         * Print the byte ordering above the bit fields.
+         */
+        printf("    * ");
+        for (i = MIN(pass * 4 + 3, d->size - 1); i >= pass * 4; --i) {
+            printf("%4d", d->perm[i]);
+            if (i > pass * 4) HDfputs("     ", stdout);
+            if (!i) break;
+        }
 
-	/*
-	 * Print the bit fields
-	 */
-	printf("\n    * ");
-	for (i=MIN(pass*4+3,d->size-1),
-	     k=MIN(pass*32+31,8*d->size-1);
-	     i>=pass*4; --i) {
-	    for (j=7; j>=0; --j) {
-		if (k==d->sign && d->msize) {
-		    HDputchar('S');
-		} else if (k>=d->epos && k<d->epos+d->esize) {
-		    HDputchar('E');
-		} else if (k>=d->mpos && k<d->mpos+d->msize) {
-		    HDputchar('M');
-		} else if (d->msize) {
-		    HDputchar('?');   /*unknown floating point bit */
-		} else if (d->sign) {
-		    HDputchar('I');
-		} else {
-		    HDputchar('U');
-		}
-		--k;
-	    }
-	    if (i>pass*4) HDputchar(' ');
-	}
-	HDputchar('\n');
+        /*
+         * Print the bit fields
+         */
+        printf("\n    * ");
+        for (i = MIN(pass * 4 + 3, d->size - 1), k = MIN(pass * 32 + 31,
+                8 * d->size - 1); i >= pass * 4; --i) {
+            unsigned int j;
+
+            for (j = 8; j > 0; --j) {
+                if (k == d->sign && d->msize) {
+                    HDputchar('S');
+                } else if (k >= d->epos && k < d->epos + d->esize) {
+                    HDputchar('E');
+                } else if (k >= d->mpos && k < d->mpos + d->msize) {
+                    HDputchar('M');
+                } else if (d->msize) {
+                    HDputchar('?'); /*unknown floating point bit */
+                } else if (d->sign) {
+                    HDputchar('I');
+                } else {
+                    HDputchar('U');
+                }
+                --k;
+            }
+            if (i > pass * 4) HDputchar(' ');
+            if (!i) break;
+        }
+        HDputchar('\n');
+        if (!pass) break;
     }
 
     /*
      * Is there an implicit bit in the mantissa.
      */
     if (d->msize) {
-	printf("    * Implicit bit? %s\n", d->imp ? "yes" : "no");
+        printf("    * Implicit bit? %s\n", d->imp ? "yes" : "no");
     }
 
     /*
      * Alignment
      */
-    if (0==d->align) {
-	printf("    * Alignment: NOT CALCULATED\n");
-    } else if (1==d->align) {
-	printf("    * Alignment: none\n");
+    if (0 == d->align) {
+        printf("    * Alignment: NOT CALCULATED\n");
+    } else if (1 == d->align) {
+        printf("    * Alignment: none\n");
     } else {
-	printf("    * Alignment: %lu\n", (unsigned long)(d->align));
+        printf("    * Alignment: %lu\n", (unsigned long) (d->align));
     }
+
 }
 
 

@@ -985,31 +994,25 @@ byte_cmp(int n, const void *_a, const void *_b, const unsigned char *pad_mask)
  *		actual order to little endian.  Ignores differences where
  *              the corresponding bit in pad_mask is set to 0.
  *
- * Return:	Success:	Index of first differing bit.
- *
- *		Failure:	-1
- *
- * Programmer:	Robb Matzke
- *		matzke at llnl.gov
- *		Jun 13, 1996
- *
- * Modifications:
+ * Return:	Index of first differing bit.
  *
  *-------------------------------------------------------------------------
  */
-static int
-bit_cmp(int nbytes, int *perm, volatile void *_a, volatile void *_b,
-    const unsigned char *pad_mask)
+static unsigned int
+bit_cmp(unsigned int nbytes, int *perm, void *_a, void *_b,
+        const unsigned char *pad_mask)
 {
-    int                 i, j;
-    volatile unsigned char      *a = (volatile unsigned char *) _a;
-    volatile unsigned char      *b = (volatile unsigned char *) _b;
-    unsigned char       aa, bb;
+    unsigned int i;
+    unsigned char *a = (unsigned char *) _a;
+    unsigned char *b = (unsigned char *) _b;
+    unsigned char aa, bb;
 
     for (i = 0; i < nbytes; i++) {
-        HDassert(perm[i] < nbytes);
-        if ((aa = a[perm[i]] & pad_mask[perm[i]])
-                != (bb = b[perm[i]] & pad_mask[perm[i]])) {
+        HDassert(perm[i] < (int) nbytes);
+        if ((aa = (unsigned char) (a[perm[i]] & pad_mask[perm[i]]))
+                != (bb = (unsigned char) (b[perm[i]] & pad_mask[perm[i]]))) {
+            unsigned int j;
+
             for (j = 0; j < 8; j++, aa >>= 1, bb >>= 1) {
                 if ((aa & 1) != (bb & 1)) return i * 8 + j;
             }
@@ -1017,7 +1020,9 @@ bit_cmp(int nbytes, int *perm, volatile void *_a, volatile void *_b,
             HDabort();
         }
     }
-    return -1;
+    fprintf(stderr, "INTERNAL ERROR");
+    HDabort();
+    return 0;
 }
 
 

@@ -1123,21 +1128,19 @@ fix_order(int n, int last, int *perm, const char **mesg)
  *
  *-------------------------------------------------------------------------
  */
-static int
-imp_bit(int n, int *perm, volatile void *_a, volatile void *_b,
-    const unsigned char *pad_mask)
+static unsigned int
+imp_bit(unsigned int n, int *perm, void *_a, void *_b, const unsigned char *pad_mask)
 {
-    volatile unsigned char      *a = (volatile unsigned char *) _a;
-    volatile unsigned char      *b = (volatile unsigned char *) _b;
-    int                 changed, major, minor;
-    int                 msmb;   /*most significant mantissa bit */
+    unsigned char *a = (unsigned char *) _a;
+    unsigned char *b = (unsigned char *) _b;
+    unsigned int changed, major, minor;
+    unsigned int msmb; /* most significant mantissa bit */
 
     /*
      * Look for the least significant bit that has changed between
      * A and B.  This is the least significant bit of the exponent.
      */
     changed = bit_cmp(n, perm, a, b, pad_mask);
-    HDassert(changed >= 0);
 
     /*
      * The bit to the right (less significant) of the changed bit should
@@ -1174,22 +1177,22 @@ imp_bit(int n, int *perm, volatile void *_a, volatile void *_b,
  *
  *-------------------------------------------------------------------------
  */
-static unsigned long
-find_bias(int epos, int esize, int *perm, volatile void *_a)
+static unsigned int
+find_bias(unsigned int epos, unsigned int esize, int *perm, void *_a)
 {
-    unsigned char	*a = (unsigned char *) _a;
-    unsigned char	mask;
-    unsigned long	b, shift = 0, nbits, bias = 0;
+    unsigned char *a = (unsigned char *) _a;
+    unsigned char mask;
+    unsigned int b, shift = 0, nbits, bias = 0;
 
     while (esize > 0) {
-	nbits = MIN(esize, (8 - epos % 8));
-	mask = (1 << nbits) - 1;
-	b = (a[perm[epos / 8]] >> (epos % 8)) & mask;
-	bias |= b << shift;
-
-	shift += nbits;
-	esize -= nbits;
-	epos += nbits;
+        nbits = MIN(esize, (8 - epos % 8));
+        mask = (unsigned char) ((1 << nbits) - 1);
+        b = (unsigned int) (a[perm[epos / 8]] >> (epos % 8)) & mask;
+        bias |= b << shift;
+
+        shift += nbits;
+        esize -= nbits;
+        epos += nbits;
     }
     return bias;
 }
@@ -1667,7 +1670,7 @@ detect_alignments(void)
 static int verify_signal_handlers(int signum, void (*handler)(int))
 {						      
     void	(*save_handler)(int) = HDsignal(signum, handler);    
-    int i, val;
+    volatile int i, val;
     int ntries=5;
     volatile int nfailures=0;
     volatile int nsuccesses=0;
diff --git a/src/H5err.txt b/src/H5err.txt
index e94014d..a156316 100644
--- a/src/H5err.txt
+++ b/src/H5err.txt
@@ -74,6 +74,8 @@ MAJOR, H5E_ERROR, Error API
 MAJOR, H5E_SLIST, Skip Lists
 MAJOR, H5E_FSPACE, Free Space Manager
 MAJOR, H5E_SOHM, Shared Object Header Messages
+MAJOR, H5E_EARRAY, Extensible Array
+MAJOR, H5E_FARRAY, Fixed Array
 MAJOR, H5E_PLUGIN, Plugin for dynamically loaded library
 MAJOR, H5E_NONE_MAJOR, No error
 
@@ -156,6 +158,7 @@ MINOR, ATOM, H5E_NOIDS, Out of IDs for group
 # Cache related errors
 MINOR, CACHE, H5E_CANTFLUSH, Unable to flush data from cache
 MINOR, CACHE, H5E_CANTSERIALIZE, Unable to serialize data from cache
+MINOR, CACHE, H5E_CANTTAG, Unable to tag metadata in the cache
 MINOR, CACHE, H5E_CANTLOAD, Unable to load metadata into cache
 MINOR, CACHE, H5E_PROTECT, Protected metadata error
 MINOR, CACHE, H5E_NOTCACHED, Metadata not currently cached
@@ -169,6 +172,12 @@ MINOR, CACHE, H5E_CANTMARKDIRTY, Unable to mark a pinned entry as dirty
 MINOR, CACHE, H5E_CANTDIRTY, Unable to mark metadata as dirty
 MINOR, CACHE, H5E_CANTEXPUNGE, Unable to expunge a metadata cache entry
 MINOR, CACHE, H5E_CANTRESIZE, Unable to resize a metadata cache entry
+MINOR, CACHE, H5E_CANTDEPEND, Unable to create a flush dependency
+MINOR, CACHE, H5E_CANTUNDEPEND, Unable to destroy a flush dependency
+MINOR, CACHE, H5E_CANTNOTIFY, Unable to notify object about action
+MINOR, CACHE, H5E_LOGFAIL, Failure in the cache logging framework
+MINOR, CACHE, H5E_CANTCORK, Unable to cork an object
+MINOR, CACHE, H5E_CANTUNCORK, Unable to uncork an object
 
 # B-tree related errors
 MINOR, BTREE, H5E_NOTFOUND, Object not found
@@ -211,6 +220,7 @@ MINOR, DSPACE, H5E_CANTSELECT, Can't select hyperslab
 MINOR, DSPACE, H5E_CANTNEXT, Can't move to next iterator location
 MINOR, DSPACE, H5E_BADSELECT, Invalid selection
 MINOR, DSPACE, H5E_CANTCOMPARE, Can't compare objects
+MINOR, DSPACE, H5E_CANTAPPEND, Can't append object
 
 # Property list errors
 MINOR, PLIST, H5E_CANTGET, Can't get value
diff --git a/src/H5overflow.h b/src/H5overflow.h
index f4064f4..dc4ed2d 100644
--- a/src/H5overflow.h
+++ b/src/H5overflow.h
@@ -39,6 +39,18 @@
         ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
 #endif /* src: unsigned dst: int */
 
+/* src: unsigned, dst: int64_t */
+#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_INT64_T
+    #define ASSIGN_unsigned_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_INT64_T
+    #define ASSIGN_unsigned_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_INT64_T */
+    #define ASSIGN_unsigned_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: unsigned dst: int64_t */
+
 /* src: unsigned, dst: uint8_t */
 #if H5_SIZEOF_UNSIGNED < H5_SIZEOF_UINT8_T
     #define ASSIGN_unsigned_TO_uint8_t(dst, dsttype, src, srctype) \
@@ -186,6 +198,18 @@
         ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
 #endif /* src: int dst: unsigned */
 
+/* src: int, dst: int64_t */
+#if H5_SIZEOF_INT < H5_SIZEOF_INT64_T
+    #define ASSIGN_int_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT > H5_SIZEOF_INT64_T
+    #define ASSIGN_int_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT == H5_SIZEOF_INT64_T */
+    #define ASSIGN_int_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: int dst: int64_t */
+
 /* src: int, dst: uint8_t */
 #if H5_SIZEOF_INT < H5_SIZEOF_UINT8_T
     #define ASSIGN_int_TO_uint8_t(dst, dsttype, src, srctype) \
@@ -319,6 +343,165 @@
 #endif /* src: int dst: h5_stat_size_t */
 
 
+/* Assignment checks for int64_t */
+
+/* src: int64_t, dst: unsigned */
+#if H5_SIZEOF_INT64_T < H5_SIZEOF_UNSIGNED
+    #define ASSIGN_int64_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT64_T > H5_SIZEOF_UNSIGNED
+    #define ASSIGN_int64_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT64_T == H5_SIZEOF_UNSIGNED */
+    #define ASSIGN_int64_t_TO_unsigned(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: int64_t dst: unsigned */
+
+/* src: int64_t, dst: int */
+#if H5_SIZEOF_INT64_T < H5_SIZEOF_INT
+    #define ASSIGN_int64_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT64_T > H5_SIZEOF_INT
+    #define ASSIGN_int64_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT64_T == H5_SIZEOF_INT */
+    #define ASSIGN_int64_t_TO_int(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: int64_t dst: int */
+
+/* src: int64_t, dst: uint8_t */
+#if H5_SIZEOF_INT64_T < H5_SIZEOF_UINT8_T
+    #define ASSIGN_int64_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT64_T > H5_SIZEOF_UINT8_T
+    #define ASSIGN_int64_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT64_T == H5_SIZEOF_UINT8_T */
+    #define ASSIGN_int64_t_TO_uint8_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: int64_t dst: uint8_t */
+
+/* src: int64_t, dst: uint16_t */
+#if H5_SIZEOF_INT64_T < H5_SIZEOF_UINT16_T
+    #define ASSIGN_int64_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT64_T > H5_SIZEOF_UINT16_T
+    #define ASSIGN_int64_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT64_T == H5_SIZEOF_UINT16_T */
+    #define ASSIGN_int64_t_TO_uint16_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: int64_t dst: uint16_t */
+
+/* src: int64_t, dst: uint32_t */
+#if H5_SIZEOF_INT64_T < H5_SIZEOF_UINT32_T
+    #define ASSIGN_int64_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT64_T > H5_SIZEOF_UINT32_T
+    #define ASSIGN_int64_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT64_T == H5_SIZEOF_UINT32_T */
+    #define ASSIGN_int64_t_TO_uint32_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: int64_t dst: uint32_t */
+
+/* src: int64_t, dst: uint64_t */
+#if H5_SIZEOF_INT64_T < H5_SIZEOF_UINT64_T
+    #define ASSIGN_int64_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT64_T > H5_SIZEOF_UINT64_T
+    #define ASSIGN_int64_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT64_T == H5_SIZEOF_UINT64_T */
+    #define ASSIGN_int64_t_TO_uint64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: int64_t dst: uint64_t */
+
+/* src: int64_t, dst: ptrdiff_t */
+#if H5_SIZEOF_INT64_T < H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_int64_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT64_T > H5_SIZEOF_PTRDIFF_T
+    #define ASSIGN_int64_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT64_T == H5_SIZEOF_PTRDIFF_T */
+    #define ASSIGN_int64_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: int64_t dst: ptrdiff_t */
+
+/* src: int64_t, dst: size_t */
+#if H5_SIZEOF_INT64_T < H5_SIZEOF_SIZE_T
+    #define ASSIGN_int64_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT64_T > H5_SIZEOF_SIZE_T
+    #define ASSIGN_int64_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT64_T == H5_SIZEOF_SIZE_T */
+    #define ASSIGN_int64_t_TO_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: int64_t dst: size_t */
+
+/* src: int64_t, dst: ssize_t */
+#if H5_SIZEOF_INT64_T < H5_SIZEOF_SSIZE_T
+    #define ASSIGN_int64_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT64_T > H5_SIZEOF_SSIZE_T
+    #define ASSIGN_int64_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT64_T == H5_SIZEOF_SSIZE_T */
+    #define ASSIGN_int64_t_TO_ssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: int64_t dst: ssize_t */
+
+/* src: int64_t, dst: haddr_t */
+#if H5_SIZEOF_INT64_T < H5_SIZEOF_HADDR_T
+    #define ASSIGN_int64_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT64_T > H5_SIZEOF_HADDR_T
+    #define ASSIGN_int64_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT64_T == H5_SIZEOF_HADDR_T */
+    #define ASSIGN_int64_t_TO_haddr_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: int64_t dst: haddr_t */
+
+/* src: int64_t, dst: hsize_t */
+#if H5_SIZEOF_INT64_T < H5_SIZEOF_HSIZE_T
+    #define ASSIGN_int64_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT64_T > H5_SIZEOF_HSIZE_T
+    #define ASSIGN_int64_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT64_T == H5_SIZEOF_HSIZE_T */
+    #define ASSIGN_int64_t_TO_hsize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: int64_t dst: hsize_t */
+
+/* src: int64_t, dst: hssize_t */
+#if H5_SIZEOF_INT64_T < H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_int64_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT64_T > H5_SIZEOF_HSSIZE_T
+    #define ASSIGN_int64_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT64_T == H5_SIZEOF_HSSIZE_T */
+    #define ASSIGN_int64_t_TO_hssize_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: int64_t dst: hssize_t */
+
+/* src: int64_t, dst: h5_stat_size_t */
+#if H5_SIZEOF_INT64_T < H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_int64_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_INT64_T > H5_SIZEOF_H5_STAT_SIZE_T
+    #define ASSIGN_int64_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_INT64_T == H5_SIZEOF_H5_STAT_SIZE_T */
+    #define ASSIGN_int64_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)
+#endif /* src: int64_t dst: h5_stat_size_t */
+
+
 /* Assignment checks for uint8_t */
 
 /* src: uint8_t, dst: unsigned */
@@ -345,6 +528,18 @@
         ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
 #endif /* src: uint8_t dst: int */
 
+/* src: uint8_t, dst: int64_t */
+#if H5_SIZEOF_UINT8_T < H5_SIZEOF_INT64_T
+    #define ASSIGN_uint8_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_INT64_T
+    #define ASSIGN_uint8_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_INT64_T */
+    #define ASSIGN_uint8_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint8_t dst: int64_t */
+
 /* src: uint8_t, dst: uint16_t */
 #if H5_SIZEOF_UINT8_T < H5_SIZEOF_UINT16_T
     #define ASSIGN_uint8_t_TO_uint16_t(dst, dsttype, src, srctype) \
@@ -492,6 +687,18 @@
         ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
 #endif /* src: uint16_t dst: int */
 
+/* src: uint16_t, dst: int64_t */
+#if H5_SIZEOF_UINT16_T < H5_SIZEOF_INT64_T
+    #define ASSIGN_uint16_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_INT64_T
+    #define ASSIGN_uint16_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_INT64_T */
+    #define ASSIGN_uint16_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint16_t dst: int64_t */
+
 /* src: uint16_t, dst: uint8_t */
 #if H5_SIZEOF_UINT16_T < H5_SIZEOF_UINT8_T
     #define ASSIGN_uint16_t_TO_uint8_t(dst, dsttype, src, srctype) \
@@ -639,6 +846,18 @@
         ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
 #endif /* src: uint32_t dst: int */
 
+/* src: uint32_t, dst: int64_t */
+#if H5_SIZEOF_UINT32_T < H5_SIZEOF_INT64_T
+    #define ASSIGN_uint32_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_INT64_T
+    #define ASSIGN_uint32_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_INT64_T */
+    #define ASSIGN_uint32_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint32_t dst: int64_t */
+
 /* src: uint32_t, dst: uint8_t */
 #if H5_SIZEOF_UINT32_T < H5_SIZEOF_UINT8_T
     #define ASSIGN_uint32_t_TO_uint8_t(dst, dsttype, src, srctype) \
@@ -786,6 +1005,18 @@
         ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
 #endif /* src: uint64_t dst: int */
 
+/* src: uint64_t, dst: int64_t */
+#if H5_SIZEOF_UINT64_T < H5_SIZEOF_INT64_T
+    #define ASSIGN_uint64_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_INT64_T
+    #define ASSIGN_uint64_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_INT64_T */
+    #define ASSIGN_uint64_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: uint64_t dst: int64_t */
+
 /* src: uint64_t, dst: uint8_t */
 #if H5_SIZEOF_UINT64_T < H5_SIZEOF_UINT8_T
     #define ASSIGN_uint64_t_TO_uint8_t(dst, dsttype, src, srctype) \
@@ -933,6 +1164,18 @@
         ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
 #endif /* src: ptrdiff_t dst: int */
 
+/* src: ptrdiff_t, dst: int64_t */
+#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_INT64_T
+    #define ASSIGN_ptrdiff_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_INT64_T
+    #define ASSIGN_ptrdiff_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_INT64_T */
+    #define ASSIGN_ptrdiff_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: ptrdiff_t dst: int64_t */
+
 /* src: ptrdiff_t, dst: uint8_t */
 #if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_UINT8_T
     #define ASSIGN_ptrdiff_t_TO_uint8_t(dst, dsttype, src, srctype) \
@@ -1080,6 +1323,18 @@
         ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
 #endif /* src: size_t dst: int */
 
+/* src: size_t, dst: int64_t */
+#if H5_SIZEOF_SIZE_T < H5_SIZEOF_INT64_T
+    #define ASSIGN_size_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_INT64_T
+    #define ASSIGN_size_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_INT64_T */
+    #define ASSIGN_size_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: size_t dst: int64_t */
+
 /* src: size_t, dst: uint8_t */
 #if H5_SIZEOF_SIZE_T < H5_SIZEOF_UINT8_T
     #define ASSIGN_size_t_TO_uint8_t(dst, dsttype, src, srctype) \
@@ -1227,6 +1482,18 @@
         ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
 #endif /* src: ssize_t dst: int */
 
+/* src: ssize_t, dst: int64_t */
+#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_INT64_T
+    #define ASSIGN_ssize_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_INT64_T
+    #define ASSIGN_ssize_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_INT64_T */
+    #define ASSIGN_ssize_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: ssize_t dst: int64_t */
+
 /* src: ssize_t, dst: uint8_t */
 #if H5_SIZEOF_SSIZE_T < H5_SIZEOF_UINT8_T
     #define ASSIGN_ssize_t_TO_uint8_t(dst, dsttype, src, srctype) \
@@ -1374,6 +1641,18 @@
         ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
 #endif /* src: haddr_t dst: int */
 
+/* src: haddr_t, dst: int64_t */
+#if H5_SIZEOF_HADDR_T < H5_SIZEOF_INT64_T
+    #define ASSIGN_haddr_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_INT64_T
+    #define ASSIGN_haddr_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_INT64_T */
+    #define ASSIGN_haddr_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: haddr_t dst: int64_t */
+
 /* src: haddr_t, dst: uint8_t */
 #if H5_SIZEOF_HADDR_T < H5_SIZEOF_UINT8_T
     #define ASSIGN_haddr_t_TO_uint8_t(dst, dsttype, src, srctype) \
@@ -1521,6 +1800,18 @@
         ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
 #endif /* src: hsize_t dst: int */
 
+/* src: hsize_t, dst: int64_t */
+#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_INT64_T
+    #define ASSIGN_hsize_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_INT64_T
+    #define ASSIGN_hsize_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_INT64_T */
+    #define ASSIGN_hsize_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: hsize_t dst: int64_t */
+
 /* src: hsize_t, dst: uint8_t */
 #if H5_SIZEOF_HSIZE_T < H5_SIZEOF_UINT8_T
     #define ASSIGN_hsize_t_TO_uint8_t(dst, dsttype, src, srctype) \
@@ -1668,6 +1959,18 @@
         ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
 #endif /* src: hssize_t dst: int */
 
+/* src: hssize_t, dst: int64_t */
+#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_INT64_T
+    #define ASSIGN_hssize_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_INT64_T
+    #define ASSIGN_hssize_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_INT64_T */
+    #define ASSIGN_hssize_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: hssize_t dst: int64_t */
+
 /* src: hssize_t, dst: uint8_t */
 #if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_UINT8_T
     #define ASSIGN_hssize_t_TO_uint8_t(dst, dsttype, src, srctype) \
@@ -1815,6 +2118,18 @@
         ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
 #endif /* src: h5_stat_size_t dst: int */
 
+/* src: h5_stat_size_t, dst: int64_t */
+#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_INT64_T
+    #define ASSIGN_h5_stat_size_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_INT64_T
+    #define ASSIGN_h5_stat_size_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)
+#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_INT64_T */
+    #define ASSIGN_h5_stat_size_t_TO_int64_t(dst, dsttype, src, srctype) \
+        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)
+#endif /* src: h5_stat_size_t dst: int64_t */
+
 /* src: h5_stat_size_t, dst: uint8_t */
 #if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_UINT8_T
     #define ASSIGN_h5_stat_size_t_TO_uint8_t(dst, dsttype, src, srctype) \
diff --git a/src/H5overflow.txt b/src/H5overflow.txt
index c093fd5..3e9f069 100644
--- a/src/H5overflow.txt
+++ b/src/H5overflow.txt
@@ -32,6 +32,7 @@
 
 unsigned, UNSIGNED;
 int, SIGNED;
+int64_t, SIGNED;
 uint8_t, UNSIGNED;
 uint16_t, UNSIGNED;
 uint32_t, UNSIGNED;
diff --git a/src/H5private.h b/src/H5private.h
index f554476..c536566 100644
--- a/src/H5private.h
+++ b/src/H5private.h
@@ -119,6 +119,13 @@
 #endif
 
 /*
+ * flock() in sys/file.h is used for the implemention of file locking.
+ */
+#if defined(H5_HAVE_FLOCK) && defined(H5_HAVE_SYS_FILE_H)
+#   include <sys/file.h>
+#endif
+
+/*
  * Resource usage is not Posix.1 but HDF5 uses it anyway for some performance
  * and debugging code if available.
  */
@@ -175,7 +182,7 @@
 #endif
 
 #ifdef H5_HAVE_THREADSAFE
-#include <process.h>            /* For _beginthread() */
+#include <process.h>        /* For _beginthread() */
 #endif
 
 #include <windows.h>
@@ -237,7 +244,6 @@
  * color information down to the BEGIN_MPE_LOG macro (which should have a new
  * BEGIN_MPE_LOG_COLOR variant). -QAK
  */
-
 #define BEGIN_MPE_LOG                                                   \
     if (H5_MPEinit_g){                                                  \
         sprintf(p_event_start, "start %s", FUNC);                       \
@@ -289,12 +295,33 @@
 /*
  * Does the compiler support the __attribute__(()) syntax?  It's no
  * big deal if we don't.
+ *
+ * Note that Solaris Studio supports attribute, but does not support the
+ * attributes we use.
+ *
+ * H5_ATTR_CONST is redefined in tools/h5repack/dynlib_rpk.c to quiet
+ * gcc warnings (it has to use the public API and can't include this
+ * file). Be sure to update that file if the #ifdefs change here.
  */
 #ifdef __cplusplus
-#   define __attribute__(X)  /*void*/
+#   define H5_ATTR_FORMAT(X,Y,Z)  /*void*/
+#   define H5_ATTR_UNUSED       /*void*/
+#   define H5_ATTR_NORETURN     /*void*/
+#   define H5_ATTR_CONST        /*void*/
+#   define H5_ATTR_PURE         /*void*/
 #else /* __cplusplus */
-#ifndef H5_HAVE_ATTRIBUTE
-#   define __attribute__(X)  /*void*/
+#if defined(H5_HAVE_ATTRIBUTE) && !defined(__SUNPRO_C)
+#   define H5_ATTR_FORMAT(X,Y,Z)  __attribute__((format(X, Y, Z)))
+#   define H5_ATTR_UNUSED       __attribute__((unused))
+#   define H5_ATTR_NORETURN     __attribute__((noreturn))
+#   define H5_ATTR_CONST        __attribute__((const))
+#   define H5_ATTR_PURE         __attribute__((pure))
+#else
+#   define H5_ATTR_FORMAT(X,Y,Z)  /*void*/
+#   define H5_ATTR_UNUSED       /*void*/
+#   define H5_ATTR_NORETURN     /*void*/
+#   define H5_ATTR_CONST        /*void*/
+#   define H5_ATTR_PURE         /*void*/
 #endif
 #endif /* __cplusplus */
 
@@ -347,14 +374,17 @@
 /* (from: http://graphics.stanford.edu/~seander/bithacks.html#DetermineIfPowerOf2) */
 #  define POWER_OF_TWO(n)  (!(n & (n - 1)) && n)
 
+/* Raise an integer to a power of 2 */
+#  define H5_EXP2(n)    (1 << (n))
+
 /*
  * HDF Boolean type.
  */
 #ifndef FALSE
-#   define FALSE 0
+  #define FALSE false
 #endif
 #ifndef TRUE
-#   define TRUE 1
+  #define TRUE true
 #endif
 
 /*
@@ -482,7 +512,7 @@
 #endif
 
 /* Double constant wrapper
- * 
+ *
  * Quiets gcc warnings from -Wunsuffixed-float-constants.
  *
  * This is a really annoying warning since the standard specifies that
@@ -523,6 +553,18 @@
 #define H5_TB (1024.0F * 1024.0F * 1024.0F * 1024.0F)
 #define H5_EB (1024.0F * 1024.0F * 1024.0F * 1024.0F * 1024.0F)
 
+#ifndef H5_HAVE_FLOCK
+/* flock() operations. Used in the source so we have to define them when
+ * the call is not available (e.g.: Windows). These should NOT be used
+ * with system-provided flock() calls since the values will come from the
+ * header file.
+ */
+#define LOCK_SH     0x01
+#define LOCK_EX     0x02
+#define LOCK_NB     0x04
+#define LOCK_UN     0x08
+#endif /* H5_HAVE_FLOCK */
+
 /*
  * Data types and functions for timing certain parts of the library.
  */
@@ -711,6 +753,9 @@ typedef struct {
 #ifndef HDexp
     #define HDexp(X)    exp(X)
 #endif /* HDexp */
+#ifndef HDexp2
+    #define HDexp2(X)    exp2(X)
+#endif /* HDexp2 */
 #ifndef HDfabs
     #define HDfabs(X)    fabs(X)
 #endif /* HDfabs */
@@ -724,7 +769,11 @@ typedef struct {
 #ifndef HDfclose
     #define HDfclose(F)    fclose(F)
 #endif /* HDfclose */
-/* fcntl() variable arguments */
+#ifdef H5_HAVE_FCNTL
+    #ifndef HDfcntl
+        #define HDfcntl(F,C,...)    fcntl(F,C,__VA_ARGS__)
+    #endif /* HDfcntl */
+#endif /* H5_HAVE_FCNTL */
 #ifndef HDfdopen
     #define HDfdopen(N,S)    fdopen(N,S)
 #endif /* HDfdopen */
@@ -749,6 +798,27 @@ typedef struct {
 #ifndef HDfileno
     #define HDfileno(F)    fileno(F)
 #endif /* HDfileno */
+/* Since flock is so prevalent, always build these functions
+ * when possible to avoid them becoming dead code.
+ */
+#ifdef H5_HAVE_FCNTL
+H5_DLL int Pflock(int fd, int operation);
+#endif /* H5_HAVE_FCNTL */
+H5_DLL H5_ATTR_CONST int Nflock(int fd, int operation);
+#ifndef HDflock
+    /* NOTE: flock(2) is not present on all POSIX systems.
+     * If it is not present, we try a flock() equivalent based on
+     * fcntl(2), then fall back to a function that always fails if
+     * it is not present at all.
+     */
+    #if defined(H5_HAVE_FLOCK)
+        #define HDflock(F,L)    flock(F,L)
+    #elif defined(H5_HAVE_FCNTL)
+        #define HDflock(F,L)    Pflock(F,L)
+    #else
+        #define HDflock(F,L)    Nflock(F,L)
+    #endif /* H5_HAVE_FLOCK */
+#endif /* HDflock */
 #ifndef HDfloor
     #define HDfloor(X)    floor(X)
 #endif /* HDfloor */
@@ -1141,6 +1211,9 @@ H5_DLL int HDfprintf (FILE *stream, const char *fmt, ...);
     #define HDrmdir(S)    rmdir(S)
 #endif /* HDrmdir */
 /* scanf() variable arguments */
+#ifndef HDselect
+    #define HDselect(N,RD,WR,ER,T)    select(N,RD,WR,ER,T)
+#endif /* HDsetbuf */
 #ifndef HDsetbuf
     #define HDsetbuf(F,S)    setbuf(F,S)
 #endif /* HDsetbuf */
@@ -1243,7 +1316,7 @@ H5_DLL int HDfprintf (FILE *stream, const char *fmt, ...);
     #define HDstrchr(S,C)    strchr(S,C)
 #endif /* HDstrchr */
 #ifndef HDstrcmp
-    #define HDstrcmp(X,Y)    strcmp(X,Y)
+    #define HDstrcmp(X,Y)       strcmp(X,Y)
 #endif /* HDstrcmp */
 #ifndef HDstrcasecmp
     #define HDstrcasecmp(X,Y)       strcasecmp(X,Y)
@@ -1447,6 +1520,16 @@ extern char *strdup(const char *s);
     #define HDpthread_self_ulong()    ((unsigned long)pthread_self())
 #endif /* HDpthread_self_ulong */
 
+/* Macro for "stringizing" an integer in the C preprocessor (use H5_TOSTRING) */
+/* (use H5_TOSTRING, H5_STRINGIZE is just part of the implementation) */
+#define H5_STRINGIZE(x) #x
+#define H5_TOSTRING(x) H5_STRINGIZE(x)
+
+/* Macro for "glueing" together items, for re-scanning macros */
+#define H5_GLUE(x,y)       x##y
+#define H5_GLUE3(x,y,z)    x##y##z
+#define H5_GLUE4(w,x,y,z)  w##x##y##z
+
 /*
  * A macro for detecting over/under-flow when casting between types
  */
@@ -1766,10 +1849,12 @@ extern char  H5_lib_vers_info_g[];
 typedef struct H5_api_struct {
     H5TS_mutex_t init_lock;  /* API entrance mutex */
     hbool_t H5_libinit_g;    /* Has the library been initialized? */
+    hbool_t H5_libterm_g;    /* Is the library being shutdown? */
 } H5_api_t;
 
 /* Macros for accessing the global variables */
-#define H5_INIT_GLOBAL H5_g.H5_libinit_g
+#define H5_INIT_GLOBAL (H5_g.H5_libinit_g)
+#define H5_TERM_GLOBAL (H5_g.H5_libterm_g)
 
 /* Macro for first thread initialization */
 #ifdef H5_HAVE_WIN_THREADS
@@ -1808,9 +1893,11 @@ extern H5_api_t H5_g;
 
 /* extern global variables */
 extern hbool_t H5_libinit_g;    /* Has the library been initialized? */
+extern hbool_t H5_libterm_g;    /* Is the library being shutdown? */
 
 /* Macros for accessing the global variables */
-#define H5_INIT_GLOBAL H5_libinit_g
+#define H5_INIT_GLOBAL (H5_libinit_g)
+#define H5_TERM_GLOBAL (H5_libterm_g)
 
 #endif /* H5_HAVE_THREADSAFE */
 
@@ -1830,101 +1917,110 @@ extern hbool_t H5_libinit_g;    /* Has the library been initialized? */
 extern hbool_t H5_MPEinit_g;   /* Has the MPE Library been initialized? */
 #endif
 
-/* Macros for defining interface initialization routines */
-#ifdef H5_INTERFACE_INIT_FUNC
-static int    H5_interface_initialize_g = 0;
-static herr_t    H5_INTERFACE_INIT_FUNC(void);
-#define H5_INTERFACE_INIT(err)                  \
-   /* Initialize this interface or bust */              \
-   if (!H5_interface_initialize_g) {                \
-      H5_interface_initialize_g = 1;                \
-      if (H5_INTERFACE_INIT_FUNC()<0) {                \
-         H5_interface_initialize_g = 0;                      \
-         HGOTO_ERROR (H5E_FUNC, H5E_CANTINIT, err,                  \
-            "interface initialization failed")                          \
-      }                              \
-   }
-#else /* H5_INTERFACE_INIT_FUNC */
-#define H5_INTERFACE_INIT(err)
-#endif /* H5_INTERFACE_INIT_FUNC */
+/* Macros for referencing package initialization symbols */
+#define H5_PACKAGE_INIT_VAR(x)    H5_GLUE(x, _init_g)
+#define H5_PACKAGE_INIT_FUNC(x)   H5_GLUE(x, __init_package)
+
+/* Macros for defining package initialization routines */
+#ifdef H5_MY_PKG
+#define H5_PKG_INIT_VAR                 H5_PACKAGE_INIT_VAR(H5_MY_PKG)
+#define H5_PKG_INIT_FUNC                H5_PACKAGE_INIT_FUNC(H5_MY_PKG)
+#define H5_PACKAGE_YES_INIT(err)                                              \
+    /* Initialize this interface or bust */                                   \
+    if(!H5_PKG_INIT_VAR && !H5_TERM_GLOBAL) {                                 \
+        H5_PKG_INIT_VAR = TRUE;                                               \
+        if(H5_PKG_INIT_FUNC() < 0) {                                          \
+            H5_PKG_INIT_VAR = FALSE;                                          \
+            HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, err, "interface initialization failed") \
+        }                                                                     \
+    }
+#define H5_PACKAGE_NO_INIT(err)                                               \
+    /* Initialize this interface or bust */                                   \
+    if(!H5_PKG_INIT_VAR && !H5_TERM_GLOBAL)                                   \
+        H5_PKG_INIT_VAR = TRUE;
+#define H5_PACKAGE_INIT(pkg_init, err)  H5_GLUE3(H5_PACKAGE_, pkg_init, _INIT)(err)
+#else /* H5_MY_PKG */
+#define H5_PKG_INIT_VAR                 (TRUE)
+#define H5_PACKAGE_INIT(pkg_init, err)
+#endif /* H5_MY_PKG */
 
 
 #ifndef NDEBUG
-#define FUNC_ENTER_CHECK_NAME(asrt)                \
-    {                                \
-        static hbool_t func_check = FALSE;                      \
+#define FUNC_ENTER_CHECK_NAME(asrt)                                           \
+    {                                                                         \
+        static hbool_t func_check = FALSE;                                    \
                                                                               \
-        if(!func_check) {                     \
-            /* Check function naming status */              \
-            HDassert(asrt);                                    \
+        if(!func_check) {                                                     \
+            /* Check function naming status */                                \
+            HDassert(asrt);                                                   \
                                                                               \
-            /* Don't check again */                             \
-            func_check = TRUE;                  \
-        } /* end if */                    \
+            /* Don't check again */                                           \
+            func_check = TRUE;                                                \
+        } /* end if */                                                        \
     } /* end scope */
 #else /* NDEBUG */
 #define FUNC_ENTER_CHECK_NAME(asrt)
 #endif /* NDEBUG */
 
 
-#define FUNC_ENTER_COMMON(asrt)                                    \
-    hbool_t err_occurred = FALSE;                \
+#define FUNC_ENTER_COMMON(asrt)                                               \
+    hbool_t err_occurred = FALSE;                                             \
+                                                                              \
     FUNC_ENTER_CHECK_NAME(asrt);
 
-#define FUNC_ENTER_COMMON_NOERR(asrt)                              \
+#define FUNC_ENTER_COMMON_NOERR(asrt)                                         \
     FUNC_ENTER_CHECK_NAME(asrt);
 
 /* Threadsafety initialization code for API routines */
 #define FUNC_ENTER_API_THREADSAFE                                             \
-   /* Initialize the thread-safe code */              \
+   /* Initialize the thread-safe code */                                      \
    H5_FIRST_THREAD_INIT                                                       \
-                        \
-   /* Grab the mutex for the library */               \
+                                                                              \
+   /* Grab the mutex for the library */                                       \
    H5_API_UNSET_CANCEL                                                        \
    H5_API_LOCK
 
 /* Local variables for API routines */
 #define FUNC_ENTER_API_VARS                                                   \
-    MPE_LOG_VARS                                                  \
+    MPE_LOG_VARS                                                              \
     H5TRACE_DECL
 
-#define FUNC_ENTER_API_COMMON                         \
+#define FUNC_ENTER_API_COMMON                                                 \
     FUNC_ENTER_API_VARS                                                       \
-    FUNC_ENTER_COMMON(H5_IS_API(FUNC));                      \
+    FUNC_ENTER_COMMON(H5_IS_API(FUNC));                                       \
     FUNC_ENTER_API_THREADSAFE;
 
-#define FUNC_ENTER_API_INIT(err)                     \
-   /* Initialize the library */                         \
-   if(!(H5_INIT_GLOBAL)) {                                                    \
-       H5_INIT_GLOBAL = TRUE;                                                 \
-       if(H5_init_library() < 0)                  \
-          HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, err,                  \
-            "library initialization failed")                          \
-   }                              \
+#define FUNC_ENTER_API_INIT(err)                                              \
+    /* Initialize the library */                                              \
+    if(!H5_INIT_GLOBAL && !H5_TERM_GLOBAL) {                                  \
+        H5_INIT_GLOBAL = TRUE;                                                \
+        if(H5_init_library() < 0)                                             \
+            HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, err, "library initialization failed") \
+    } /* end if */                                                            \
                                                                               \
-   /* Initialize the interface, if appropriate */                  \
-   H5_INTERFACE_INIT(err)                  \
+    /* Initialize the package, if appropriate */                              \
+    H5_PACKAGE_INIT(H5_MY_PKG_INIT, err)                                      \
                                                                               \
-   /* Push the name of this function on the function stack */                 \
-   H5_PUSH_FUNC                                                               \
+    /* Push the name of this function on the function stack */                \
+    H5_PUSH_FUNC                                                              \
                                                                               \
-   BEGIN_MPE_LOG
+    BEGIN_MPE_LOG
 
 /* Use this macro for all "normal" API functions */
-#define FUNC_ENTER_API(err) {{                                      \
+#define FUNC_ENTER_API(err) {{                                                \
     FUNC_ENTER_API_COMMON                                                     \
-    FUNC_ENTER_API_INIT(err);                            \
-    /* Clear thread error stack entering public functions */          \
-    H5E_clear_stack(NULL);                              \
+    FUNC_ENTER_API_INIT(err);                                                 \
+    /* Clear thread error stack entering public functions */                  \
+    H5E_clear_stack(NULL);                                                    \
     {
 
 /*
  * Use this macro for API functions that shouldn't clear the error stack
  *      like H5Eprint and H5Ewalk.
  */
-#define FUNC_ENTER_API_NOCLEAR(err) {{                              \
+#define FUNC_ENTER_API_NOCLEAR(err) {{                                        \
     FUNC_ENTER_API_COMMON                                                     \
-    FUNC_ENTER_API_INIT(err);                            \
+    FUNC_ENTER_API_INIT(err);                                                 \
     {
 
 /*
@@ -1933,7 +2029,7 @@ static herr_t    H5_INTERFACE_INIT_FUNC(void);
  *      are: H5check_version, etc.
  *
  */
-#define FUNC_ENTER_API_NOINIT {{                                   \
+#define FUNC_ENTER_API_NOINIT {{                                              \
     FUNC_ENTER_API_COMMON                                                     \
     H5_PUSH_FUNC                                                              \
     BEGIN_MPE_LOG                                                             \
@@ -1946,56 +2042,32 @@ static herr_t    H5_INTERFACE_INIT_FUNC(void);
  *      are: H5close, H5check_version, etc.
  *
  */
-#define FUNC_ENTER_API_NOINIT_NOERR_NOFS {{                       \
+#define FUNC_ENTER_API_NOINIT_NOERR_NOFS {{                                   \
     FUNC_ENTER_API_VARS                                                       \
-    FUNC_ENTER_COMMON_NOERR(H5_IS_API(FUNC));                      \
-    FUNC_ENTER_API_THREADSAFE;                  \
+    FUNC_ENTER_COMMON_NOERR(H5_IS_API(FUNC));                                 \
+    FUNC_ENTER_API_THREADSAFE;                                                \
     BEGIN_MPE_LOG                                                             \
     {
 
 /* Note: this macro only works when there's _no_ interface initialization routine for the module */
-#define FUNC_ENTER_NOAPI_INIT(err)                     \
-   /* Initialize the interface, if appropriate */                  \
-   H5_INTERFACE_INIT(err)                  \
+#define FUNC_ENTER_NOAPI_INIT(err)                                            \
+    /* Initialize the package, if appropriate */                              \
+    H5_PACKAGE_INIT(H5_MY_PKG_INIT, err)                                      \
                                                                               \
-   /* Push the name of this function on the function stack */                 \
-   H5_PUSH_FUNC            
+    /* Push the name of this function on the function stack */                \
+    H5_PUSH_FUNC
 
 /* Use this macro for all "normal" non-API functions */
-#define FUNC_ENTER_NOAPI(err) {                                     \
-    FUNC_ENTER_COMMON(!H5_IS_API(FUNC));                     \
-    FUNC_ENTER_NOAPI_INIT(err)                          \
-    {
-
-/* Use this macro for all "normal" package-level functions */
-#define FUNC_ENTER_PACKAGE {                                                  \
-    FUNC_ENTER_COMMON(H5_IS_PKG(FUNC));                                       \
-    H5_PUSH_FUNC                                                              \
-    {
-
-/* Use this macro for package-level functions which propgate errors, but don't issue them */
-#define FUNC_ENTER_PACKAGE_NOERR {                                            \
-    FUNC_ENTER_COMMON_NOERR(H5_IS_PKG(FUNC));                                 \
-    H5_PUSH_FUNC                                                              \
-    {
-
-/* Use this macro for all "normal" staticly-scoped functions */
-#define FUNC_ENTER_STATIC {                                                   \
-    FUNC_ENTER_COMMON(H5_IS_PKG(FUNC));                                       \
-    H5_PUSH_FUNC                                                              \
-    {
-
-/* Use this macro for staticly-scoped functions which propgate errors, but don't issue them */
-#define FUNC_ENTER_STATIC_NOERR {                                             \
-    FUNC_ENTER_COMMON_NOERR(H5_IS_PKG(FUNC));                                 \
-    H5_PUSH_FUNC                                                              \
-    {
+#define FUNC_ENTER_NOAPI(err) {                                               \
+    FUNC_ENTER_COMMON(!H5_IS_API(FUNC));                                      \
+    FUNC_ENTER_NOAPI_INIT(err)                                                \
+    if(H5_PKG_INIT_VAR || !H5_TERM_GLOBAL) {
 
 /* Use this macro for all non-API functions, which propagate errors, but don't issue them */
-#define FUNC_ENTER_NOAPI_NOERR {                               \
-    FUNC_ENTER_COMMON_NOERR(!H5_IS_API(FUNC));               \
-    FUNC_ENTER_NOAPI_INIT(-)                          \
-    {
+#define FUNC_ENTER_NOAPI_NOERR {                                              \
+    FUNC_ENTER_COMMON_NOERR(!H5_IS_API(FUNC));                                \
+    FUNC_ENTER_NOAPI_INIT(-)                                                  \
+    if(H5_PKG_INIT_VAR || !H5_TERM_GLOBAL) {
 
 /*
  * Use this macro for non-API functions which fall into these categories:
@@ -2005,10 +2077,10 @@ static herr_t    H5_INTERFACE_INIT_FUNC(void);
  *      - functions which are called during library shutdown, since we don't
  *              want to re-initialize the library.
  */
-#define FUNC_ENTER_NOAPI_NOINIT {                                  \
-    FUNC_ENTER_COMMON(!H5_IS_API(FUNC));                     \
+#define FUNC_ENTER_NOAPI_NOINIT {                                             \
+    FUNC_ENTER_COMMON(!H5_IS_API(FUNC));                                      \
     H5_PUSH_FUNC                                                              \
-    {
+    if(H5_PKG_INIT_VAR || !H5_TERM_GLOBAL) {
 
 /*
  * Use this macro for non-API functions which fall into these categories:
@@ -2019,10 +2091,23 @@ static herr_t    H5_INTERFACE_INIT_FUNC(void);
  *              want to re-initialize the library.
  *      - functions that propagate, but don't issue errors
  */
-#define FUNC_ENTER_NOAPI_NOINIT_NOERR {                            \
-    FUNC_ENTER_COMMON_NOERR(!H5_IS_API(FUNC));               \
+#define FUNC_ENTER_NOAPI_NOINIT_NOERR {                                       \
+    FUNC_ENTER_COMMON_NOERR(!H5_IS_API(FUNC));                                \
     H5_PUSH_FUNC                                                              \
-    {
+    if(H5_PKG_INIT_VAR || !H5_TERM_GLOBAL) {
+
+/*
+ * Use this macro for non-API functions which fall into these categories:
+ *      - functions which shouldn't push their name on the function stack
+ *              (so far, just the H5CS routines themselves)
+ *
+ */
+#define FUNC_ENTER_NOAPI_NOFS {                                               \
+    FUNC_ENTER_COMMON(!H5_IS_API(FUNC));                                      \
+                                                                              \
+    /* Initialize the package, if appropriate */                              \
+    H5_PACKAGE_INIT(H5_MY_PKG_INIT, err)                                      \
+    if(H5_PKG_INIT_VAR || !H5_TERM_GLOBAL) {
 
 /*
  * Use this macro for non-API functions which fall into these categories:
@@ -2033,9 +2118,87 @@ static herr_t    H5_INTERFACE_INIT_FUNC(void);
  * also don't use the 'FUNC' variable (i.e. don't push errors on the error stack)
  *
  */
-#define FUNC_ENTER_NOAPI_NOERR_NOFS {                             \
-    FUNC_ENTER_COMMON_NOERR(!H5_IS_API(FUNC));               \
-    {
+#define FUNC_ENTER_NOAPI_NOERR_NOFS {                                         \
+    FUNC_ENTER_COMMON_NOERR(!H5_IS_API(FUNC));                                \
+    if(H5_PKG_INIT_VAR || !H5_TERM_GLOBAL) {
+
+/* Use the following two macros as replacements for the FUNC_ENTER_NOAPI
+ * and FUNC_ENTER_NOAPI_NOINIT macros when the function needs to set
+ * up a metadata tag. */
+#define FUNC_ENTER_NOAPI_TAG(dxpl_id, tag, err) {                             \
+    haddr_t prev_tag = HADDR_UNDEF;                                           \
+    hid_t tag_dxpl_id = dxpl_id;                                              \
+                                                                              \
+    FUNC_ENTER_COMMON(!H5_IS_API(FUNC));                                      \
+    if(H5AC_tag(tag_dxpl_id, tag, &prev_tag)<0)                               \
+        HGOTO_ERROR(H5_MY_PKG_ERR, H5E_CANTTAG, err, "unable to apply metadata tag") \
+    FUNC_ENTER_NOAPI_INIT(err)                                                \
+    if(H5_PKG_INIT_VAR || !H5_TERM_GLOBAL) {
+
+#define FUNC_ENTER_NOAPI_NOINIT_TAG(dxpl_id, tag, err) {                      \
+    haddr_t prev_tag = HADDR_UNDEF;                                           \
+    hid_t tag_dxpl_id = dxpl_id;                                              \
+                                                                              \
+    FUNC_ENTER_COMMON(!H5_IS_API(FUNC));                                      \
+    if(H5AC_tag(tag_dxpl_id, tag, &prev_tag)<0)                               \
+        HGOTO_ERROR(H5_MY_PKG_ERR, H5E_CANTTAG, err, "unable to apply metadata tag") \
+    H5_PUSH_FUNC                                                              \
+    if(H5_PKG_INIT_VAR || !H5_TERM_GLOBAL) {
+
+/* Use this macro for all "normal" package-level functions */
+#define FUNC_ENTER_PACKAGE {                                                  \
+    FUNC_ENTER_COMMON(H5_IS_PKG(FUNC));                                       \
+    H5_PUSH_FUNC                                                              \
+    if(H5_PKG_INIT_VAR || !H5_TERM_GLOBAL) {
+
+/* Use this macro for package-level functions which propgate errors, but don't issue them */
+#define FUNC_ENTER_PACKAGE_NOERR {                                            \
+    FUNC_ENTER_COMMON_NOERR(H5_IS_PKG(FUNC));                                 \
+    H5_PUSH_FUNC                                                              \
+    if(H5_PKG_INIT_VAR || !H5_TERM_GLOBAL) {
+
+/* Use the following macro as replacement for the FUNC_ENTER_PACKAGE
+ * macro when the function needs to set up a metadata tag. */
+#define FUNC_ENTER_PACKAGE_TAG(dxpl_id, tag, err) {                           \
+    haddr_t prev_tag = HADDR_UNDEF;                                           \
+    hid_t tag_dxpl_id = dxpl_id;                                              \
+                                                                              \
+    FUNC_ENTER_COMMON(H5_IS_PKG(FUNC));                                       \
+    if(H5AC_tag(tag_dxpl_id, tag, &prev_tag) < 0)                             \
+        HGOTO_ERROR(H5_MY_PKG_ERR, H5E_CANTTAG, err, "unable to apply metadata tag") \
+    H5_PUSH_FUNC                                                              \
+    if(H5_PKG_INIT_VAR || !H5_TERM_GLOBAL) {
+
+/* Use this macro for all "normal" staticly-scoped functions */
+#define FUNC_ENTER_STATIC {                                                   \
+    FUNC_ENTER_COMMON(H5_IS_PKG(FUNC));                                       \
+    H5_PUSH_FUNC                                                              \
+    if(H5_PKG_INIT_VAR || !H5_TERM_GLOBAL) {
+
+/* Use this macro for staticly-scoped functions which propgate errors, but don't issue them */
+#define FUNC_ENTER_STATIC_NOERR {                                             \
+    FUNC_ENTER_COMMON_NOERR(H5_IS_PKG(FUNC));                                 \
+    H5_PUSH_FUNC                                                              \
+    if(H5_PKG_INIT_VAR || !H5_TERM_GLOBAL) {
+
+/* Use this macro for staticly-scoped functions which propgate errors, but don't issue them */
+/* And that shouldn't push their name on the function stack */
+#define FUNC_ENTER_STATIC_NOERR_NOFS {                                        \
+    FUNC_ENTER_COMMON_NOERR(H5_IS_PKG(FUNC));                                 \
+    if(H5_PKG_INIT_VAR || !H5_TERM_GLOBAL) {
+
+/* Use the following macro as replacement for the FUNC_ENTER_STATIC
+ * macro when the function needs to set up a metadata tag. */
+#define FUNC_ENTER_STATIC_TAG(dxpl_id, tag, err) {                            \
+    haddr_t prev_tag = HADDR_UNDEF;                                           \
+    hid_t tag_dxpl_id = dxpl_id;                                              \
+                                                                              \
+    FUNC_ENTER_COMMON(H5_IS_PKG(FUNC));                                       \
+    if(H5AC_tag(tag_dxpl_id, tag, &prev_tag) < 0)                             \
+        HGOTO_ERROR(H5_MY_PKG_ERR, H5E_CANTTAG, err, "unable to apply metadata tag") \
+    H5_PUSH_FUNC                                                              \
+    if(H5_PKG_INIT_VAR || !H5_TERM_GLOBAL) {
+
 
 /*-------------------------------------------------------------------------
  * Purpose:  Register function exit for code profiling.  This should be
@@ -2051,35 +2214,39 @@ static herr_t    H5_INTERFACE_INIT_FUNC(void);
     H5_API_SET_CANCEL
 
 #define FUNC_LEAVE_API(ret_value)                                             \
-        FINISH_MPE_LOG                                                       \
-        H5TRACE_RETURN(ret_value);                \
-        H5_POP_FUNC                                                           \
-        if(err_occurred)                  \
-           (void)H5E_dump_api_stack(TRUE);              \
-        FUNC_LEAVE_API_THREADSAFE                                             \
-        return(ret_value);                  \
+        ;                                                                     \
     } /*end scope from end of FUNC_ENTER*/                                    \
+    FINISH_MPE_LOG                                                            \
+    H5TRACE_RETURN(ret_value);                                                \
+    H5_POP_FUNC                                                               \
+    if(err_occurred)                                                          \
+       (void)H5E_dump_api_stack(TRUE);                                        \
+    FUNC_LEAVE_API_THREADSAFE                                                 \
+    return(ret_value);                                                        \
 }} /*end scope from beginning of FUNC_ENTER*/
 
 /* Use this macro to match the FUNC_ENTER_API_NOFS macro */
 #define FUNC_LEAVE_API_NOFS(ret_value)                                        \
-        FINISH_MPE_LOG                                                       \
-        H5TRACE_RETURN(ret_value);                \
-        FUNC_LEAVE_API_THREADSAFE                                             \
-        return(ret_value);                  \
+        ;                                                                     \
     } /*end scope from end of FUNC_ENTER*/                                    \
+    FINISH_MPE_LOG                                                            \
+    H5TRACE_RETURN(ret_value);                                                \
+    FUNC_LEAVE_API_THREADSAFE                                                 \
+    return(ret_value);                                                        \
 }} /*end scope from beginning of FUNC_ENTER*/
 
 #define FUNC_LEAVE_NOAPI(ret_value)                                           \
-        H5_POP_FUNC                                                           \
-        return(ret_value);                  \
+        ;                                                                     \
     } /*end scope from end of FUNC_ENTER*/                                    \
+    H5_POP_FUNC                                                               \
+    return(ret_value);                                                        \
 } /*end scope from beginning of FUNC_ENTER*/
 
 #define FUNC_LEAVE_NOAPI_VOID                                                 \
-        H5_POP_FUNC                                                           \
-        return;                                  \
+        ;                                                                     \
     } /*end scope from end of FUNC_ENTER*/                                    \
+    H5_POP_FUNC                                                               \
+    return;                                                                   \
 } /*end scope from beginning of FUNC_ENTER*/
 
 /*
@@ -2088,15 +2255,284 @@ static herr_t    H5_INTERFACE_INIT_FUNC(void);
  *              (so far, just the H5CS routines themselves)
  */
 #define FUNC_LEAVE_NOAPI_NOFS(ret_value)                                      \
-        return(ret_value);                  \
+        ;                                                                     \
     } /*end scope from end of FUNC_ENTER*/                                    \
+    return(ret_value);                                                        \
 } /*end scope from beginning of FUNC_ENTER*/
 
+/* Use this macro when exiting a function that set up a metadata tag */
+#define FUNC_LEAVE_NOAPI_TAG(ret_value, err)                                  \
+        ;                                                                     \
+    } /*end scope from end of FUNC_ENTER*/                                    \
+    if(H5AC_tag(tag_dxpl_id, prev_tag, NULL) < 0)                             \
+        HDONE_ERROR(H5E_CACHE, H5E_CANTTAG, err, "unable to apply metadata tag") \
+    H5_POP_FUNC                                                               \
+    return(ret_value);                                                        \
+} /*end scope from beginning of FUNC_ENTER*/
 
-/* Macro for "glueing" together items, for re-scanning macros */
-#define H5_GLUE(x,y)       x##y
-#define H5_GLUE3(x,y,z)    x##y##z
-#define H5_GLUE4(w,x,y,z)  w##x##y##z
+
+/****************************************/
+/* Revisions to FUNC_ENTER/LEAVE Macros */
+/****************************************/
+
+/* Macros to check if a package is initialized */
+#define H5_CHECK_PACKAGE_INIT_REG_YES(asrt)   HDassert(H5_PACKAGE_INIT_VAR(pkg));
+#define H5_CHECK_PACKAGE_INIT_REG_NO(asrt)
+#define H5_CHECK_PACKAGE_INIT_INIT_YES(asrt)
+#define H5_CHECK_PACKAGE_INIT_INIT_NO(asrt)
+#define H5_CHECK_PACKAGE_INIT(pkg, pkg_init, init)  H5_GLUE4(H5_CHECK_PACKAGE_INIT_, init, _, pkg_init)(pkg)
+
+/* Macros to initialize package, if a package initialization routine is defined */
+#define H5_PKG_YES_INIT(pkg)                                                  \
+    if(!H5_PACKAGE_INIT_VAR(pkg) && !H5_TERM_GLOBAL) {                        \
+        H5_PACKAGE_INIT_VAR(pkg) = TRUE;                                      \
+        if(H5_PACKAGE_INIT_FUNC(pkg)() < 0) {                                 \
+            H5_PACKAGE_INIT_VAR(pkg) = FALSE;                                 \
+            /* (Can't use H5E_THROW here) */                                  \
+            H5E_PRINTF(H5E_CANTINIT, "interface initialization failed");      \
+            ret_value = fail_value;                                           \
+            goto func_init_failed;                                            \
+        } /* end if */                                                        \
+    } /* end if */
+#define H5_PKG_NO_INIT(pkg)                                                   \
+    if(!H5_PACKAGE_INIT_VAR(pkg) && !H5_TERM_GLOBAL)                          \
+        H5_PACKAGE_INIT_VAR(pkg) = TRUE;
+#define H5_PKG_INIT(pkg_init, pkg)      H5_GLUE3(H5_PKG_, pkg_init, _INIT)(pkg)
+
+/* Macros to declare package initialization function, if a package initialization routine is defined */
+#ifdef H5_PKG_SINGLE_SOURCE
+#define H5_PKG_DECLARE_YES_FUNC(pkg) static herr_t H5_PACKAGE_INIT_FUNC(pkg)(void);
+#else  /* H5_PKG_SINGLE_SOURCE */
+#define H5_PKG_DECLARE_YES_FUNC(pkg) extern herr_t H5_PACKAGE_INIT_FUNC(pkg)(void);
+#endif /* H5_PKG_SINGLE_SOURCE */
+#define H5_PKG_DECLARE_NO_FUNC(pkg)
+
+/* Declare package initialization symbols (if in a package) */
+#ifdef H5_PKG_SINGLE_SOURCE
+#define H5_PKG_DECLARE_VAR(pkg)         static hbool_t H5_PACKAGE_INIT_VAR(pkg);
+#else  /* H5_PKG_SINGLE_SOURCE */
+#define H5_PKG_DECLARE_VAR(pkg)         extern hbool_t H5_PACKAGE_INIT_VAR(pkg);
+#endif  /* H5_PKG_SINGLE_SOURCE */
+#define H5_PKG_DECLARE_FUNC(pkg_init, pkg) H5_GLUE3(H5_PKG_DECLARE_, pkg_init, _FUNC)(pkg)
+#ifdef H5_MY_PKG
+H5_PKG_DECLARE_VAR(H5_MY_PKG)
+H5_PKG_DECLARE_FUNC(H5_MY_PKG_INIT, H5_MY_PKG)
+#endif /* H5_MY_PKG */
+
+/* API re-entrance variable */
+extern hbool_t H5_api_entered_g;    /* Has library already been entered through API? */
+
+/* Macros for entering different scopes of routines */
+#define H5_PACKAGE_ENTER(pkg, pkg_init, init)                                 \
+    FUNC_ENTER_CHECK_NAME(H5_IS_PKG(FUNC))                                    \
+                                                                              \
+    /* The library should be initialized already */                           \
+    HDassert(H5_INIT_GLOBAL);                                                 \
+                                                                              \
+    /* This interface should be initialized already */                        \
+    /* (except for package initialization routines :-) */                     \
+    H5_CHECK_PACKAGE_INIT(pkg, pkg_init, init)                                \
+                                                                              \
+    /* Push the name of this function on the function stack */                \
+    H5_PUSH_FUNC                                                              \
+                                                                              \
+    /* Enter scope for this type of function */                               \
+    {
+
+#define H5_PRIVATE_ENTER(pkg, pkg_init)                                       \
+    FUNC_ENTER_CHECK_NAME(H5_IS_PRIV(FUNC))                                   \
+                                                                              \
+    /* The library should be initialized already */                           \
+    HDassert(H5_INIT_GLOBAL);                                                 \
+                                                                              \
+    /* Initialize this interface if desired */                                \
+    H5_PKG_INIT(pkg_init, pkg)                                                \
+                                                                              \
+    /* Push the name of this function on the function stack */                \
+    H5_PUSH_FUNC                                                              \
+                                                                              \
+    /* Enter scope for this type of function */                               \
+    {{
+
+#define H5_PUBLIC_ENTER(pkg, pkg_init)                                        \
+    FUNC_ENTER_API_VARS                                                       \
+    FUNC_ENTER_API_THREADSAFE;                                                \
+    FUNC_ENTER_CHECK_NAME(H5_IS_PUB(FUNC))                                    \
+                                                                              \
+    /* Clear thread error stack when entering public functions */             \
+    H5E_clear_stack(NULL);                                                    \
+                                                                              \
+    /* Initialize the library or bust */                                      \
+    if(!H5_INIT_GLOBAL && !H5_TERM_GLOBAL) {                                  \
+        H5_INIT_GLOBAL = TRUE;                                                \
+        if(H5_init_library() < 0) {                                           \
+            /* (Can't use H5E_THROW here) */                                  \
+            H5E_PRINTF(H5E_CANTINIT, "interface initialization failed");      \
+            ret_value = fail_value;                                           \
+            goto func_init_failed;                                            \
+        } /* end if */                                                        \
+    } /* end if */                                                            \
+                                                                              \
+    /* Initialize this interface if desired */                                \
+    H5_PKG_INIT(pkg_init, pkg)                                                \
+                                                                              \
+    /* Check for re-entering API routine */                                   \
+    HDassert(!H5_api_entered_g);                                              \
+    H5_api_entered_g = TRUE;                                                  \
+                                                                              \
+    /* Start logging MPI's MPE information */                                 \
+    BEGIN_MPE_LOG                                                             \
+                                                                              \
+    /* Push the name of this function on the function stack */                \
+    H5_PUSH_FUNC                                                              \
+                                                                              \
+    /* Enter scope for this type of function */                               \
+    {{{
+
+/* Macros for substituting the package name */
+#define FUNC_ENT_STATIC(pkg, pkg_init)  H5_PACKAGE_ENTER(pkg, pkg_init, REG)
+#define FUNC_ENT_PKGINIT(pkg, pkg_init)  H5_PACKAGE_ENTER(pkg, pkg_init, INIT)
+#define FUNC_ENT_PKG(pkg, pkg_init)    H5_PACKAGE_ENTER(pkg, pkg_init, REG)
+#define FUNC_ENT_PRIV(pkg, pkg_init)    H5_PRIVATE_ENTER(pkg, pkg_init)
+#define FUNC_ENT_PUB(pkg, pkg_init)    H5_PUBLIC_ENTER(pkg, pkg_init)
+
+/* Macros for substituting a function prefix */
+#define FUNC_PREFIX_STATIC      static
+#define FUNC_PREFIX_PKGINIT
+#define FUNC_PREFIX_PKG
+#define FUNC_PREFIX_PRIV
+#define FUNC_PREFIX_PUB
+
+/* Macros for declaring error variables */
+/* Function can detect errors and has a specific error return value */
+#define FUNC_ERR_VAR_ERR(ret_typ, err)                                        \
+    hbool_t past_catch = FALSE;                                               \
+    ret_typ fail_value = err;
+/* Function can detect errors but cannot return an error value (Cleanup only) */
+#define FUNC_ERR_VAR_ERRCATCH(ret_typ, err)                                   \
+    hbool_t past_catch = FALSE;
+/* Function has no need to detect or clean up from errors */
+#define FUNC_ERR_VAR_NOERR(ret_typ, err)
+
+/* Use this macro when entering all functions */
+#define BEGIN_FUNC(scope, use_err, ret_typ, ret_init, err, func)              \
+H5_GLUE(FUNC_PREFIX_, scope)                                                  \
+ret_typ                                                                       \
+func                                                                          \
+/* Open function */                                                           \
+{                                                                             \
+    ret_typ ret_value = ret_init;                                             \
+    H5_GLUE(FUNC_ERR_VAR_, use_err)(ret_typ, err)                             \
+    H5_GLUE(FUNC_ENT_, scope)(H5_MY_PKG, H5_MY_PKG_INIT)
+
+/* Use this macro when entering functions that have no return value */
+#define BEGIN_FUNC_VOID(scope, use_err, func)                               \
+H5_GLUE(FUNC_PREFIX_, scope)                                                \
+void                                                                        \
+func                                                                        \
+/* Open function */                                                         \
+{                                                                           \
+    H5_GLUE(FUNC_ERR_VAR_, use_err)(void, -, -)                             \
+    H5_GLUE(FUNC_ENT_, scope)
+
+/* Macros for label when a function initialization can fail */
+#define H5_PRIV_YES_FUNC_INIT_FAILED func_init_failed:
+#define H5_PRIV_NO_FUNC_INIT_FAILED
+#define H5_PRIV_FUNC_INIT_FAILED(pkg_init) H5_GLUE3(H5_PRIV_, pkg_init, _FUNC_INIT_FAILED)
+
+/* Macros for leaving different scopes of routines */
+#define FUNC_LEAVE_PKGINIT                                                    \
+    /* Leave scope for this type of function */                               \
+    }                                                                         \
+                                                                              \
+    /* Pop the name of this function off the function stack */                \
+    H5_POP_FUNC
+
+#define FUNC_LEAVE_STATIC                                                     \
+    /* Leave scope for this type of function */                               \
+    }                                                                         \
+                                                                              \
+    /* Pop the name of this function off the function stack */                \
+    H5_POP_FUNC
+
+#define FUNC_LEAVE_PKG                                                        \
+    /* Leave scope for this type of function */                               \
+    }                                                                         \
+                                                                              \
+    /* Pop the name of this function off the function stack */                \
+    H5_POP_FUNC
+
+#define FUNC_LEAVE_PRIV                                                       \
+    /* Leave scope for this type of function */                               \
+    }}                                                                        \
+                                                                              \
+    /* Label for errors during FUNC_ENTER */                                  \
+    H5_PRIV_FUNC_INIT_FAILED(H5_MY_PKG_INIT)                                  \
+                                                                              \
+    /* Pop the name of this function off the function stack */                \
+    H5_POP_FUNC
+
+#define FUNC_LEAVE_PUB                                                        \
+    /* Leave scope for this type of function */                               \
+    }}}                                                                       \
+                                                                              \
+    /* Label for errors during FUNC_ENTER */                                  \
+func_init_failed:                                                             \
+                                                                              \
+    /* Dump error stack if an error occurred during API routine */            \
+    if(ret_value == fail_value)                                               \
+        (void)H5E_dump_api_stack(TRUE);                                       \
+                                                                              \
+    /* Finish the API tracing info */                                         \
+    H5TRACE_RETURN(ret_value);                                                \
+                                                                              \
+    /* Pop the name of this function off the function stack */                \
+    H5_POP_FUNC                                                               \
+                                                                              \
+    /* Finish the MPE tracing info */                                         \
+    FINISH_MPE_LOG                                                            \
+                                                                              \
+    /* Check for leaving API routine */                                       \
+    HDassert(H5_api_entered_g);                                               \
+    H5_api_entered_g = FALSE;                                                 \
+                                                                              \
+    /* Release thread-safety semaphore */                                     \
+    FUNC_LEAVE_API_THREADSAFE
+
+/* Use this macro when leaving all functions */
+#define END_FUNC(scope)                                                       \
+    /* Scope-specific function conclusion */                                  \
+    H5_GLUE(FUNC_LEAVE_, scope)                                               \
+                                                                              \
+    /* Leave routine */                                                       \
+    return(ret_value);                                                        \
+                                                                              \
+    /* Close Function */                                                      \
+}
+
+/* Use this macro when leaving void functions */
+#define END_FUNC_VOID(scope)                                                \
+    /* Scope-specific function conclusion */                                \
+    H5_GLUE(FUNC_LEAVE_, scope)                                             \
+                                                                            \
+    /* Leave routine */                                                     \
+    return;                                                                 \
+                                                                            \
+    /* Close Function */                                                    \
+}
+
+/* Macro to begin/end tagging (when FUNC_ENTER_*TAG macros are insufficient).
+ * Make sure to use HGOTO_ERROR_TAG and HGOTO_DONE_TAG between these macros! */
+#define H5_BEGIN_TAG(dxpl, tag, err) {                                           \
+    haddr_t prv_tag = HADDR_UNDEF;                                               \
+    hid_t my_dxpl_id = dxpl;                                                     \
+    if(H5AC_tag(my_dxpl_id, tag, &prv_tag) < 0)                                  \
+        HGOTO_ERROR(H5_MY_PKG_ERR, H5E_CANTTAG, err, "unable to apply metadata tag")
+
+#define H5_END_TAG(err)                                                          \
+    if(H5AC_tag(my_dxpl_id, prv_tag, NULL) <0)                                   \
+        HGOTO_ERROR(H5_MY_PKG_ERR, H5E_CANTTAG, err, "unable to apply metadata tag") \
+}
 
 /* Compile-time "assert" macro */
 #define HDcompile_assert(e)     ((void)sizeof(char[ !!(e) ? 1 : -1]))
@@ -2110,21 +2546,30 @@ H5_DLL herr_t H5_init_library(void);
 H5_DLL void H5_term_library(void);
 
 /* Functions to terminate interfaces */
-H5_DLL int H5A_term_interface(void);
-H5_DLL int H5AC_term_interface(void);
-H5_DLL int H5D_term_interface(void);
-H5_DLL int H5E_term_interface(void);
-H5_DLL int H5F_term_interface(void);
-H5_DLL int H5FS_term_interface(void);
-H5_DLL int H5G_term_interface(void);
-H5_DLL int H5I_term_interface(void);
-H5_DLL int H5L_term_interface(void);
-H5_DLL int H5P_term_interface(void);
-H5_DLL int H5PL_term_interface(void);
-H5_DLL int H5R_term_interface(void);
-H5_DLL int H5S_term_interface(void);
-H5_DLL int H5T_term_interface(void);
-H5_DLL int H5Z_term_interface(void);
+H5_DLL int H5A_term_package(void);
+H5_DLL int H5A_top_term_package(void);
+H5_DLL int H5AC_term_package(void);
+H5_DLL int H5D_term_package(void);
+H5_DLL int H5D_top_term_package(void);
+H5_DLL int H5E_term_package(void);
+H5_DLL int H5F_term_package(void);
+H5_DLL int H5FD_term_package(void);
+H5_DLL int H5FL_term_package(void);
+H5_DLL int H5FS_term_package(void);
+H5_DLL int H5G_term_package(void);
+H5_DLL int H5G_top_term_package(void);
+H5_DLL int H5I_term_package(void);
+H5_DLL int H5L_term_package(void);
+H5_DLL int H5P_term_package(void);
+H5_DLL int H5PL_term_package(void);
+H5_DLL int H5R_term_package(void);
+H5_DLL int H5R_top_term_package(void);
+H5_DLL int H5S_term_package(void);
+H5_DLL int H5S_top_term_package(void);
+H5_DLL int H5SL_term_package(void);
+H5_DLL int H5T_term_package(void);
+H5_DLL int H5T_top_term_package(void);
+H5_DLL int H5Z_term_package(void);
 
 /* Checksum functions */
 H5_DLL uint32_t H5_checksum_fletcher32(const void *data, size_t len);
@@ -2133,6 +2578,9 @@ H5_DLL uint32_t H5_checksum_lookup3(const void *data, size_t len, uint32_t initv
 H5_DLL uint32_t H5_checksum_metadata(const void *data, size_t len, uint32_t initval);
 H5_DLL uint32_t H5_hash_string(const char *str);
 
+/* Time related routines */
+H5_DLL time_t H5_make_time(struct tm *tm);
+
 /* Functions for building paths, etc. */
 H5_DLL herr_t   H5_build_extpath(const char *, char ** /*out*/ );
 
diff --git a/src/H5public.h b/src/H5public.h
index 3ebc454..37c04b3 100644
--- a/src/H5public.h
+++ b/src/H5public.h
@@ -93,11 +93,11 @@ extern "C" {
 
 /* Version numbers */
 #define H5_VERS_MAJOR	1	/* For major interface/format changes  	     */
-#define H5_VERS_MINOR	8	/* For minor interface/format changes  	     */
-#define H5_VERS_RELEASE	16	/* For tweaks, bug-fixes, or development     */
-#define H5_VERS_SUBRELEASE ""	/* For pre-releases like snap0       */
+#define H5_VERS_MINOR	10	/* For minor interface/format changes  	     */
+#define H5_VERS_RELEASE	0	/* For tweaks, bug-fixes, or development     */
+#define H5_VERS_SUBRELEASE "alpha0"	/* For pre-releases like snap0       */
 				/* Empty string for real releases.           */
-#define H5_VERS_INFO    "HDF5 library version: 1.8.16"      /* Full version string */
+#define H5_VERS_INFO    "HDF5 library version: 1.10.0-alpha0"      /* Full version string */
 
 #define H5check()	H5check_version(H5_VERS_MAJOR,H5_VERS_MINOR,	      \
 				        H5_VERS_RELEASE)
@@ -141,7 +141,20 @@ typedef int herr_t;
  * 	    printf("error determining whether data type is committed\n");
  *	}
  */
-typedef unsigned int hbool_t;
+#ifdef H5_HAVE_STDBOOL_H
+  #include <stdbool.h>
+#else /* H5_HAVE_STDBOOL_H */
+  #ifndef __cplusplus
+    #if defined(H5_SIZEOF_BOOL) && (H5_SIZEOF_BOOL != 0)
+      #define bool    _Bool
+    #else
+      #define bool    unsigned int
+    #endif
+    #define true    1
+    #define false   0
+  #endif /* __cplusplus */
+#endif /* H5_HAVE_STDBOOL_H */
+typedef bool hbool_t;
 typedef int htri_t;
 
 /* Define the ssize_t type if it not is defined */
@@ -176,6 +189,7 @@ H5_GCC_DIAG_ON(long-long)
 #else
 #   error "nothing appropriate for hsize_t"
 #endif
+#define HSIZE_UNDEF             ((hsize_t)(hssize_t)(-1))
 
 /*
  * File addresses have their own types.
diff --git a/src/H5system.c b/src/H5system.c
index 5c8027d..4baebc5 100644
--- a/src/H5system.c
+++ b/src/H5system.c
@@ -32,11 +32,10 @@
 /***********/
 /* Headers */
 /***********/
-#include "H5private.h"    /* Generic Functions      */
-#include "H5Fprivate.h"    /* File access        */
-#include "H5MMprivate.h"  /* Memory management      */
-#include "H5Eprivate.h"
-
+#include "H5private.h"		/* Generic Functions			*/
+#include "H5Eprivate.h"		/* Error handling		  	*/
+#include "H5Fprivate.h"		/* File access				*/
+#include "H5MMprivate.h"	/* Memory management			*/
 
 
 /****************/
@@ -73,6 +72,9 @@
 /* Local Variables */
 /*******************/
 
+/* Track whether tzset routine was called */
+static hbool_t H5_ntzset = FALSE;
+
 

 /*-------------------------------------------------------------------------
  * Function:  HDfprintf
@@ -313,7 +315,7 @@ HDfprintf(FILE *stream, const char *fmt, ...)
                 case 'G':
                     if(!HDstrcmp(modifier, "h")) {
                         float x = (float)va_arg(ap, double);
-                        n = fprintf(stream, format_templ, x);
+                        n = fprintf(stream, format_templ, (double)x);
                     } else if(!*modifier || !HDstrcmp(modifier, "l")) {
                         double x = va_arg(ap, double);
                         n = fprintf(stream, format_templ, x);
@@ -584,7 +586,154 @@ void HDsrand(unsigned int seed)
 }
 #endif /* H5_HAVE_RAND_R */
 
+

+

+/*-------------------------------------------------------------------------
+ * Function:    Pflock
+ *
+ * Purpose:     Wrapper function for POSIX systems where flock(2) is not
+ *              available.
+ *
+ * Return:      Success:    0
+ *              Failure:    -1
+ *
+ *-------------------------------------------------------------------------
+ */
+/* NOTE: Compile this all the time on POSIX systems, even when flock(2) is
+ *       present so that it's less likely to become dead code.
+ */
+#ifdef H5_HAVE_FCNTL
+int
+Pflock(int fd, int operation) {
+    
+    struct flock    flk;
+
+    /* Set the lock type */
+    if(operation & LOCK_UN)
+        flk.l_type = F_UNLCK;
+    else if(operation & LOCK_SH)
+        flk.l_type = F_RDLCK;
+    else
+        flk.l_type = F_WRLCK;
+
+    /* Set the other flock struct values */
+    flk.l_whence = SEEK_SET;
+    flk.l_start = 0;
+    flk.l_len = 0;              /* to EOF */
+    flk.l_pid = 0;              /* not used with set */
+
+    /* Lock or unlock */
+    if(HDfcntl(fd, F_SETLK, flk) < 0)
+        return -1;
+
+    return 0;
+
+} /* end Pflock() */
+#endif /* H5_HAVE_FCNTL */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    Nflock
+ *
+ * Purpose:     Wrapper function for systems where no file locking is
+ *              available.
+ *
+ * Return:      Failure:    -1 (always fails)
+ *
+ *-------------------------------------------------------------------------
+ */
+int H5_ATTR_CONST
+Nflock(int H5_ATTR_UNUSED fd, int H5_ATTR_UNUSED operation) {
+    /* just fail */
+    return -1;
+} /* end Nflock() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	H5_make_time
+ *
+ * Purpose:	Portability routine to abstract converting a 'tm' struct into
+ *		a time_t value.
+ *
+ * Note:	This is a little problematic because mktime() operates on
+ *		local times.  We convert to local time and then figure out the
+ *		adjustment based on the local time zone and daylight savings
+ *		setting.
+ *
+ * Return:	Success:  The value of timezone
+ *		Failure:  -1
+ *
+ * Programmer:  Quincey Koziol
+ *              November 18, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+time_t
+H5_make_time(struct tm *tm)
+{
+    time_t the_time;    /* The converted time */
+#if defined(H5_HAVE_VISUAL_STUDIO) && (_MSC_VER >= 1900)  /* VS 2015 */
+    /* In gcc and in Visual Studio prior to VS 2015 'timezone' is a global
+     * variable declared in time.h. That variable was deprecated and in
+     * VS 2015 is removed, with _get_timezone replacing it.
+     */
+    long timezone = 0;
+#endif /* defined(H5_HAVE_VISUAL_STUDIO) && (_MSC_VER >= 1900) */
+    time_t ret_value;   /* Return value */
+
+    FUNC_ENTER_NOAPI_NOINIT
+
+    /* Sanity check */
+    HDassert(tm);
+
+    /* Initialize timezone information */
+    if(!H5_ntzset) {
+        HDtzset();
+        H5_ntzset = TRUE;
+    } /* end if */
+
+    /* Perform base conversion */
+    if((time_t)-1 == (the_time = HDmktime(tm)))
+        HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCONVERT, FAIL, "badly formatted modification time message")
+
+    /* Adjust for timezones */
+#if defined(H5_HAVE_TM_GMTOFF)
+    /* BSD-like systems */
+    the_time += tm->tm_gmtoff;
+#elif defined(H5_HAVE_TIMEZONE)
+#if defined(H5_HAVE_VISUAL_STUDIO) && (_MSC_VER >= 1900)  /* VS 2015 */
+    /* In gcc and in Visual Studio prior to VS 2015 'timezone' is a global
+     * variable declared in time.h. That variable was deprecated and in
+     * VS 2015 is removed, with _get_timezone replacing it.
+     */
+    _get_timezone(&timezone);
+#endif /* defined(H5_HAVE_VISUAL_STUDIO) && (_MSC_VER >= 1900) */
+
+    the_time -= timezone - (tm->tm_isdst ? 3600 : 0);
+#else
+    /*
+     * The catch-all.  If we can't convert a character string universal
+     * coordinated time to a time_t value reliably then we can't decode the
+     * modification time message. This really isn't as bad as it sounds -- the
+     * only way a user can get the modification time is from our internal
+     * query routines, which can gracefully recover.
+     */
+    HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "unable to obtain local timezone information")
+#endif
+
+    /* Set return value */
+    ret_value = the_time;
+
+done:
+    FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5_make_time() */
+
+#ifdef H5_HAVE_VISUAL_STUDIO
 
+/* Offset between 1/1/1601 and 1/1/1970 in 100 nanosecond units */
+#define _W32_FT_OFFSET (116444736000000000ULL)
+
+

 /*-------------------------------------------------------------------------
  * Function:  Wgettimeofday
  *
@@ -606,11 +755,6 @@ void HDsrand(unsigned int seed)
  *
  *-------------------------------------------------------------------------
  */
-#ifdef H5_HAVE_VISUAL_STUDIO
-
-/* Offset between 1/1/1601 and 1/1/1970 in 100 nanosecond units */
-#define _W32_FT_OFFSET (116444736000000000ULL)
-
 int
 Wgettimeofday(struct timeval *tv, struct timezone *tz)
  {
@@ -685,7 +829,55 @@ int c99_vsnprintf(char* str, size_t size, const char* format, va_list ap)
     return count;
 }
 
-#endif
+

+/*-------------------------------------------------------------------------
+ * Function:    Wflock
+ *
+ * Purpose:     Wrapper function for flock on Windows systems
+ *
+ * Return:      Success:    0
+ *              Failure:    -1
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+Wflock(int H5_ATTR_UNUSED fd, int H5_ATTR_UNUSED operation) {
+
+/* This is a no-op while we implement a Win32 VFD */
+#if 0
+int
+Wflock(int fd, int operation) {
+
+    HANDLE          hFile;
+    DWORD           dwFlags = LOCKFILE_FAIL_IMMEDIATELY;
+    DWORD           dwReserved = 0;
+                    /* MAXDWORD for entire file */
+    DWORD           nNumberOfBytesToLockLow = MAXDWORD;
+    DWORD           nNumberOfBytesToLockHigh = MAXDWORD;
+                    /* Must initialize OVERLAPPED struct */
+    OVERLAPPED      overlapped = {0};
+
+    /* Get Windows HANDLE */
+    hFile = _get_osfhandle(fd);
+
+    /* Convert to Windows flags */
+    if(operation & LOCK_EX)
+        dwFlags |= LOCKFILE_EXCLUSIVE_LOCK;
+
+    /* Lock or unlock */
+    if(operation & LOCK_UN)
+        if(0 == UnlockFileEx(hFile, dwReserved, nNumberOfBytesToLockLow,
+                            nNumberOfBytesToLockHigh, &overlapped))
+            return -1;
+    else
+        if(0 == LockFileEx(hFile, dwFlags, dwReserved, nNumberOfBytesToLockLow,
+                            nNumberOfBytesToLockHigh, &overlapped))
+            return -1;
+#endif /* 0 */
+    return 0;
+} /* end Wflock() */
+
+#endif /* H5_HAVE_VISUAL_STUDIO */
 
 

 /*-------------------------------------------------------------------------
diff --git a/src/H5trace.c b/src/H5trace.c
index 2ee6367..44b2ed5 100644
--- a/src/H5trace.c
+++ b/src/H5trace.c
@@ -15,11 +15,11 @@
 
 /*-------------------------------------------------------------------------
  *
- * Created:		H5trace.c
- *			Aug 21 2006
- *			Quincey Koziol <koziol at hdfgroup.org>
+ * Created:     H5trace.c
+ *              Aug 21 2006
+ *              Quincey Koziol <koziol at hdfgroup.org>
  *
- * Purpose:		Internal code for tracing API calls
+ * Purpose:     Internal code for tracing API calls
  *
  *-------------------------------------------------------------------------
  */
@@ -27,18 +27,17 @@
 /****************/
 /* Module Setup */
 /****************/
-#define H5I_PACKAGE		/*suppress error about including H5Ipkg	  */
-
+#define H5I_FRIEND		/*suppress error about including H5Ipkg	  */
 
 /***********/
 /* Headers */
 /***********/
-#include "H5private.h"		/* Generic Functions			*/
-#include "H5Dprivate.h"		/* Datasets				*/
-#include "H5Eprivate.h"		/* Error handling		  	*/
-#include "H5FDprivate.h"	/* File drivers				*/
-#include "H5Ipkg.h"		/* IDs			  		*/
-#include "H5MMprivate.h"	/* Memory management			*/
+#include "H5private.h"      /* Generic Functions                        */
+#include "H5Dprivate.h"     /* Datasets                                 */
+#include "H5Eprivate.h"     /* Error handling                           */
+#include "H5FDprivate.h"    /* File drivers                             */
+#include "H5Ipkg.h"         /* IDs                                      */
+#include "H5MMprivate.h"    /* Memory management                        */
 
 #ifdef H5_HAVE_PARALLEL
 /* datatypes of predefined drivers needed by H5_trace() */
@@ -83,36 +82,36 @@
 
 

 /*-------------------------------------------------------------------------
- * Function:	H5_trace
+ * Function:    H5_trace
  *
- * Purpose:	This function is called whenever an API function is called
- *		and tracing is turned on.  If RETURNING is non-zero then
- *		the caller is about to return and RETURNING points to the
+ * Purpose:     This function is called whenever an API function is called
+ *              and tracing is turned on.  If RETURNING is non-zero then
+ *              the caller is about to return and RETURNING points to the
  *              time for the corresponding function call event.  Otherwise
  *              we print the function name and the arguments.
  *
- *		The TYPE argument is a string which gives the type of each of
- *		the following argument pairs.  Each type is zero or more
- *		asterisks (one for each level of indirection, although some
- *		types have one level of indirection already implied) followed
- *		by either one letter (lower case) or two letters (first one
- *		uppercase).
+ *              The TYPE argument is a string which gives the type of each of
+ *              the following argument pairs.  Each type is zero or more
+ *              asterisks (one for each level of indirection, although some
+ *              types have one level of indirection already implied) followed
+ *              by either one letter (lower case) or two letters (first one
+ *              uppercase).
  *
- *		The variable argument list consists of pairs of values. Each
- *		pair is a string which is the formal argument name in the
- *		calling function, followed by the argument value.  The type
- *		of the argument value is given by the TYPE string.
+ *              The variable argument list consists of pairs of values. Each
+ *              pair is a string which is the formal argument name in the
+ *              calling function, followed by the argument value.  The type
+ *              of the argument value is given by the TYPE string.
  *
- * Note:	The TYPE string is meant to be terse and is generated by a
- *		separate perl script.
+ * Note:        The TYPE string is meant to be terse and is generated by a
+ *              separate perl script.
  *
- * WARNING:	DO NOT CALL ANY HDF5 FUNCTION THAT CALLS FUNC_ENTER(). DOING
- *		SO MAY CAUSE H5_trace() TO BE INVOKED RECURSIVELY OR MAY
- *		CAUSE LIBRARY INITIALIZATIONS THAT ARE NOT DESIRED.
+ * WARNING:     DO NOT CALL ANY HDF5 FUNCTION THAT CALLS FUNC_ENTER(). DOING
+ *              SO MAY CAUSE H5_trace() TO BE INVOKED RECURSIVELY OR MAY
+ *              CAUSE LIBRARY INITIALIZATIONS THAT ARE NOT DESIRED.
  *
- * Return:	Execution time for an API call
+ * Return:      Execution time for an API call
  *
- * Programmer:	Robb Matzke
+ * Programmer:  Robb Matzke
  *              Tuesday, June 16, 1998
  *
  *-------------------------------------------------------------------------
@@ -120,14 +119,14 @@
 double
 H5_trace(const double *returning, const char *func, const char *type, ...)
 {
-    va_list		ap;
-    char		buf[64], *rest;
-    const char		*argname;
-    int			argno = 0, ptr, asize_idx;
-    hssize_t		asize[16];
-    hssize_t		i;
-    void		*vp = NULL;
-    FILE		*out = H5_debug_g.trace;
+    va_list             ap;
+    char                buf[64], *rest;
+    const char          *argname;
+    int                 argno = 0, ptr, asize_idx;
+    hssize_t            asize[16];
+    hssize_t            i;
+    void                *vp = NULL;
+    FILE                *out = H5_debug_g.trace;
     H5_timer_t          event_time;
     static H5_timer_t   first_time = {0.0F, 0.0F, 0.0F};
     static int          current_depth = 0;
@@ -156,8 +155,7 @@ H5_trace(const double *returning, const char *func, const char *type, ...)
     } /* end if */
 
     /* Get time for event */
-    if(HDfabs(first_time.etime) < 0.0000000001F)
-        /* That is == 0.0, but direct comparison between floats is bad */
+    if(H5_DBL_ABS_EQUAL(first_time.etime, H5_DOUBLE(0.0)))
         H5_timer_begin(&first_time);
     if(H5_debug_g.ttimes)
         H5_timer_begin(&event_time);
@@ -206,48 +204,48 @@ H5_trace(const double *returning, const char *func, const char *type, ...)
 
     /* Parse the argument types */
     for(argno = 0; *type; argno++, type += (HDisupper(*type) ? 2 : 1)) {
-	/* Count levels of indirection */
-	for(ptr = 0; '*' == *type; type++)
+        /* Count levels of indirection */
+        for(ptr = 0; '*' == *type; type++)
             ptr++;
-	if('[' == *type) {
-	    if('a' == type[1]) {
-		asize_idx = (int)HDstrtol(type + 2, &rest, 10);
+        if('[' == *type) {
+            if('a' == type[1]) {
+                asize_idx = (int)HDstrtol(type + 2, &rest, 10);
                 HDassert(0 <= asize_idx && asize_idx < (int) NELMTS(asize));
-		HDassert(']'==*rest);
-		type = rest + 1;
-	    } else {
-		rest = (char *)HDstrchr(type, ']');
-		HDassert(rest);
-		type = rest + 1;
-		asize_idx = -1;
-	    }
-	} /* end if */
+                HDassert(']'==*rest);
+                type = rest + 1;
+            } else {
+                rest = (char *)HDstrchr(type, ']');
+                HDassert(rest);
+                type = rest + 1;
+                asize_idx = -1;
+            }
+        } /* end if */
         else
-	    asize_idx = -1;
-
-	/*
-	 * The argument name.  Leave off the `_id' part.  If the argument
-	 * name is the null pointer then don't print the argument or the
-	 * following `='.  This is used for return values.
-	 */
-	argname = va_arg(ap, char *); /*lint !e64 Type mismatch not really occuring */
-	if(argname) {
-	    unsigned n = (unsigned)MAX (0, (int)HDstrlen(argname) - 3); /*lint !e666 Allow expression with side effects */
-
-	    if(!HDstrcmp(argname + n, "_id")) {
-		HDstrncpy(buf, argname, (size_t)MIN((int)sizeof(buf) - 1, n));
-		buf[MIN((int)sizeof(buf) - 1, n)] = '\0';
-		argname = buf;
-	    } /* end if */
-	    fprintf(out, "%s%s=", argno?", ":"", argname);
-	} /* end if */
+            asize_idx = -1;
+
+        /*
+         * The argument name.  Leave off the `_id' part.  If the argument
+         * name is the null pointer then don't print the argument or the
+         * following `='.  This is used for return values.
+         */
+        argname = va_arg(ap, char *); /*lint !e64 Type mismatch not really occuring */
+        if(argname) {
+            unsigned n = (unsigned)MAX (0, (int)HDstrlen(argname) - 3); /*lint !e666 Allow expression with side effects */
+
+            if(!HDstrcmp(argname + n, "_id")) {
+                HDstrncpy(buf, argname, (size_t)MIN((int)sizeof(buf) - 1, n));
+                buf[MIN((int)sizeof(buf) - 1, n)] = '\0';
+                argname = buf;
+            } /* end if */
+                fprintf(out, "%s%s=", argno?", ":"", argname);
+        } /* end if */
         else
-	    argname = "";
+            argname = "";
 
-	/* The value */
-	if(ptr)
+        /* The value */
+        if(ptr)
             vp = va_arg(ap, void *); /*lint !e64 Type mismatch not really occuring */
-	switch(type[0]) {
+        switch(type[0]) {
             case 'a':
                 if(ptr) {
                     if(vp)
@@ -268,10 +266,10 @@ H5_trace(const double *returning, const char *func, const char *type, ...)
                         fprintf(out, "0x%lx", (unsigned long)vp);
                     else
                         fprintf(out, "NULL");
-                } /* end if */
+                    } /* end if */
                 else {
-                    hbool_t bool_var = va_arg(ap, hbool_t); /*lint !e732 Loss of sign not really occuring */
-
+                    /* Can't pass hbool_t to va_arg() */
+                    hbool_t bool_var = (hbool_t)va_arg(ap, int);
                     if(TRUE == bool_var)
                         fprintf(out, "TRUE");
                     else if(!bool_var)
@@ -497,6 +495,52 @@ H5_trace(const double *returning, const char *func, const char *type, ...)
                         } /* end else */
                         break;
 
+                    case 'k':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5D_chunk_index_t idx = (H5D_chunk_index_t)va_arg(ap, int);
+
+                            switch(idx) {
+                                case H5D_CHUNK_IDX_BTREE:
+                                    fprintf(out, "H5D_CHUNK_IDX_BTREE");
+                                    break;
+
+                                case H5D_CHUNK_IDX_NONE:
+                                    fprintf(out, "H5D_CHUNK_IDX_NONE");
+                                    break;
+
+                                case H5D_CHUNK_IDX_FARRAY:
+                                    fprintf(out, "H5D_CHUNK_IDX_FARRAY");
+                                    break;
+
+                                case H5D_CHUNK_IDX_EARRAY:
+                                    fprintf(out, "H5D_CHUNK_IDX_EARRAY");
+                                    break;
+
+                                case H5D_CHUNK_IDX_BT2:
+                                    fprintf(out, "H5D_CHUNK_IDX_BT2");
+                                    break;
+
+                                case H5D_CHUNK_IDX_SINGLE:
+                                    fprintf(out, "H5D_CHUNK_IDX_SINGLE");
+                                    break;
+
+                                case H5D_CHUNK_IDX_NTYPES:
+                                    fprintf(out, "ERROR: H5D_CHUNK_IDX_NTYPES (invalid value)");
+                                    break;
+
+                                default:
+                                    fprintf(out, "UNKNOWN VALUE: %ld", (long)idx);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
                     case 'l':
                         if(ptr) {
                             if(vp)
@@ -524,6 +568,10 @@ H5_trace(const double *returning, const char *func, const char *type, ...)
                                     fprintf(out, "H5D_CHUNKED");
                                     break;
 
+                                case H5D_VIRTUAL:
+                                    fprintf(out, "H5D_VIRTUAL");
+                                    break;
+
                                 case H5D_NLAYOUTS:
                                     fprintf(out, "H5D_NLAYOUTS");
                                     break;
@@ -676,6 +724,36 @@ H5_trace(const double *returning, const char *func, const char *type, ...)
                         } /* end else */
                         break;
 
+                    case 'v':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5D_vds_view_t view = (H5D_vds_view_t)va_arg(ap, int);
+
+                            switch(view) {
+                                case H5D_VDS_ERROR:
+                                    fprintf(out, "H5D_VDS_ERROR");
+                                    break;
+
+                                case H5D_VDS_FIRST_MISSING:
+                                    fprintf(out, "H5D_VDS_FIRST_MISSING");
+                                    break;
+
+                                case H5D_VDS_LAST_AVAILABLE:
+                                    fprintf(out, "H5D_VDS_LAST_AVAILABLE");
+                                    break;
+
+                                default:
+                                    fprintf(out, "%ld", (long)view);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
                     default:
                         fprintf (out, "BADTYPE(D%c)", type[1]);
                         goto error;
@@ -809,6 +887,45 @@ H5_trace(const double *returning, const char *func, const char *type, ...)
                         } /* end else */
                         break;
 
+                    case 'f':
+                        if(ptr) {
+                            if(vp)
+                                fprintf(out, "0x%lx", (unsigned long)vp);
+                            else
+                                fprintf(out, "NULL");
+                        } /* end if */
+                        else {
+                            H5F_file_space_type_t fs_type = (H5F_file_space_type_t)va_arg(ap, int);
+
+                            switch(fs_type) {
+                                case H5F_FILE_SPACE_DEFAULT:
+                                    fprintf(out, "H5F_FILE_SPACE_DEFAULT");
+                                    break;
+
+                                case H5F_FILE_SPACE_ALL_PERSIST:
+                                    fprintf(out, "H5F_FILE_SPACE_ALL_PERSIST");
+                                    break;
+
+                                case H5F_FILE_SPACE_ALL:
+                                    fprintf(out, "H5F_FILE_SPACE_ALL");
+                                    break;
+
+                                case H5F_FILE_SPACE_AGGR_VFD:
+                                    fprintf(out, "H5F_FILE_SPACE_AGGR_VFD");
+                                    break;
+
+                                case H5F_FILE_SPACE_VFD:
+                                    fprintf(out, "H5F_FILE_SPACE_VFD");
+                                    break;
+
+                                case H5F_FILE_SPACE_NTYPES:
+                                default:
+                                    fprintf(out, "%ld", (long)fs_type);
+                                    break;
+                            } /* end switch */
+                        } /* end else */
+                        break;
+
                     case 'm':
                         if(ptr) {
                             if(vp)
@@ -1181,7 +1298,7 @@ H5_trace(const double *returning, const char *func, const char *type, ...)
 
                             case H5I_DATASPACE:
                                 fprintf(out, "%ld (dspace)", (long)obj);
-                                /* Save the rank of simple dataspaces for arrays */
+                                /* Save the rank of simple data spaces for arrays */
                                 /* This may generate recursive call to the library... -QAK */
                                 {
                                     H5S_t *space;
@@ -2309,7 +2426,7 @@ H5_trace(const double *returning, const char *func, const char *type, ...)
                             unsigned long iul = va_arg(ap, unsigned long); /*lint !e732 Loss of sign not really occuring */
 
                             fprintf(out, "%lu", iul);
-                            asize[argno] = iul;
+                            asize[argno] = (hssize_t)iul;
                         } /* end else */
                         break;
 
@@ -2333,7 +2450,7 @@ H5_trace(const double *returning, const char *func, const char *type, ...)
                             unsigned long long iull = va_arg(ap, unsigned long long); /*lint !e732 Loss of sign not really occuring */
 
                             fprintf(out, "%llu", iull);
-                            asize[argno] = iull;
+                            asize[argno] = (hssize_t)iull;
                         } /* end else */
                         break;
 
@@ -2515,7 +2632,7 @@ H5_trace(const double *returning, const char *func, const char *type, ...)
                 else
                     fprintf(out, "BADTYPE(%c)", type[0]);
                 goto error;
-	} /* end switch */
+        } /* end switch */
     } /* end for */
 
     /* Display event time for return */
@@ -2526,10 +2643,10 @@ H5_trace(const double *returning, const char *func, const char *type, ...)
 error:
     va_end(ap);
     if(returning)
-	fprintf(out, ";\n");
+        fprintf(out, ";\n");
     else {
-	last_call_depth = current_depth++;
-	fprintf (out, ")");
+        last_call_depth = current_depth++;
+        fprintf (out, ")");
     } /* end else */
     HDfflush(out);
 
diff --git a/src/H5vers.txt b/src/H5vers.txt
index 18a88d9..07d2c4b 100644
--- a/src/H5vers.txt
+++ b/src/H5vers.txt
@@ -55,12 +55,14 @@ FUNCTION: H5Eprint; ; v10, v18
 FUNCTION: H5Epush; ; v14, v18
 FUNCTION: H5Eset_auto; ; v10, v18
 FUNCTION: H5Ewalk; H5E_walk, H5E_error; v10, v18
+FUNCTION: H5Fget_info; H5F_info; v18, v110
 FUNCTION: H5Gcreate; ; v10, v18
 FUNCTION: H5Gopen; ; v10, v18
 FUNCTION: H5Pget_filter; ; v10, v18
 FUNCTION: H5Pget_filter_by_id; ; v16, v18
 FUNCTION: H5Pinsert; ; v14, v18
 FUNCTION: H5Pregister; ; v14, v18
+FUNCTION: H5Rdereference; ; v10, v110
 FUNCTION: H5Rget_obj_type; ; v16, v18
 FUNCTION: H5Tarray_create; ; v14, v18
 FUNCTION: H5Tcommit; ; v10, v18
diff --git a/src/H5version.h b/src/H5version.h
index 58de2ab..b955a8f 100644
--- a/src/H5version.h
+++ b/src/H5version.h
@@ -21,9 +21,9 @@
 #define _H5version_H
 
 /* Issue error if contradicting macros have been defined. */
-#if defined(H5_USE_16_API) && defined(H5_NO_DEPRECATED_SYMBOLS)
-#error "Can't choose old API versions when deprecated APIs are disabled"
-#endif /* defined(H5_USE_16_API) && defined(H5_NO_DEPRECATED_SYMBOLS) */
+#if (defined(H5_USE_16_API) || defined(H5_USE_18_API)) && defined(H5_NO_DEPRECATED_SYMBOLS)
+  #error "Can't choose old API versions when deprecated APIs are disabled"
+#endif /* (defined(H5_USE_16_API) || defined(H5_USE_18_API)) && defined(H5_NO_DEPRECATED_SYMBOLS) */
 
 
 /* If a particular "global" version of the library's interfaces is chosen,
@@ -33,9 +33,14 @@
  *      API symbol, the individual API version macro takes priority.
  */
 #if defined(H5_USE_16_API_DEFAULT) && !defined(H5_USE_16_API)
-#define H5_USE_16_API 1
+  #define H5_USE_16_API 1
 #endif /* H5_USE_16_API_DEFAULT && !H5_USE_16_API */
 
+#if defined(H5_USE_18_API_DEFAULT) && !defined(H5_USE_18_API)
+  #define H5_USE_18_API 1
+#endif /* H5_USE_18_API_DEFAULT && !H5_USE_18_API */
+
+
 #ifdef H5_USE_16_API
 
 /*************/
@@ -43,87 +48,91 @@
 /*************/
 
 #if !defined(H5Acreate_vers)
-#define H5Acreate_vers 1
+  #define H5Acreate_vers 1
 #endif /* !defined(H5Acreate_vers) */
 
 #if !defined(H5Aiterate_vers)
-#define H5Aiterate_vers 1
+  #define H5Aiterate_vers 1
 #endif /* !defined(H5Aiterate_vers) */
 
 #if !defined(H5Dcreate_vers)
-#define H5Dcreate_vers 1
+  #define H5Dcreate_vers 1
 #endif /* !defined(H5Dcreate_vers) */
 
 #if !defined(H5Dopen_vers)
-#define H5Dopen_vers 1
+  #define H5Dopen_vers 1
 #endif /* !defined(H5Dopen_vers) */
 
 #if !defined(H5Eclear_vers)
-#define H5Eclear_vers 1
+  #define H5Eclear_vers 1
 #endif /* !defined(H5Eclear_vers) */
 
 #if !defined(H5Eget_auto_vers)
-#define H5Eget_auto_vers 1
+  #define H5Eget_auto_vers 1
 #endif /* !defined(H5Eget_auto_vers) */
 
 #if !defined(H5Eprint_vers)
-#define H5Eprint_vers 1
+  #define H5Eprint_vers 1
 #endif /* !defined(H5Eprint_vers) */
 
 #if !defined(H5Epush_vers)
-#define H5Epush_vers 1
+  #define H5Epush_vers 1
 #endif /* !defined(H5Epush_vers) */
 
 #if !defined(H5Eset_auto_vers)
-#define H5Eset_auto_vers 1
+  #define H5Eset_auto_vers 1
 #endif /* !defined(H5Eset_auto_vers) */
 
 #if !defined(H5Ewalk_vers)
-#define H5Ewalk_vers 1
+  #define H5Ewalk_vers 1
 #endif /* !defined(H5Ewalk_vers) */
 
 #if !defined(H5Gcreate_vers)
-#define H5Gcreate_vers 1
+  #define H5Gcreate_vers 1
 #endif /* !defined(H5Gcreate_vers) */
 
 #if !defined(H5Gopen_vers)
-#define H5Gopen_vers 1
+  #define H5Gopen_vers 1
 #endif /* !defined(H5Gopen_vers) */
 
 #if !defined(H5Pget_filter_vers)
-#define H5Pget_filter_vers 1
+  #define H5Pget_filter_vers 1
 #endif /* !defined(H5Pget_filter_vers) */
 
 #if !defined(H5Pget_filter_by_id_vers)
-#define H5Pget_filter_by_id_vers 1
+  #define H5Pget_filter_by_id_vers 1
 #endif /* !defined(H5Pget_filter_by_id_vers) */
 
 #if !defined(H5Pinsert_vers)
-#define H5Pinsert_vers 1
+  #define H5Pinsert_vers 1
 #endif /* !defined(H5Pinsert_vers) */
 
 #if !defined(H5Pregister_vers)
-#define H5Pregister_vers 1
+  #define H5Pregister_vers 1
 #endif /* !defined(H5Pregister_vers) */
 
+#if !defined(H5Rdereference_vers)
+  #define H5Rdereference_vers 1
+#endif /* !defined(H5Rdereference_vers) */
+
 #if !defined(H5Rget_obj_type_vers)
-#define H5Rget_obj_type_vers 1
+  #define H5Rget_obj_type_vers 1
 #endif /* !defined(H5Rget_obj_type_vers) */
 
 #if !defined(H5Tarray_create_vers)
-#define H5Tarray_create_vers 1
+  #define H5Tarray_create_vers 1
 #endif /* !defined(H5Tarray_create_vers) */
 
 #if !defined(H5Tcommit_vers)
-#define H5Tcommit_vers 1
+  #define H5Tcommit_vers 1
 #endif /* !defined(H5Tcommit_vers) */
 
 #if !defined(H5Tget_array_dims_vers)
-#define H5Tget_array_dims_vers 1
+  #define H5Tget_array_dims_vers 1
 #endif /* !defined(H5Tget_array_dims_vers) */
 
 #if !defined(H5Topen_vers)
-#define H5Topen_vers 1
+  #define H5Topen_vers 1
 #endif /* !defined(H5Topen_vers) */
 
 /************/
@@ -131,15 +140,127 @@
 /************/
 
 #if !defined(H5E_auto_t_vers)
-#define H5E_auto_t_vers 1
+  #define H5E_auto_t_vers 1
 #endif /* !defined(H5E_auto_t_vers) */
 
 #if !defined(H5Z_class_t_vers)
-#define H5Z_class_t_vers 1
+  #define H5Z_class_t_vers 1
 #endif /* !defined(H5Z_class_t_vers) */
 
 #endif /* H5_USE_16_API */
 
+#ifdef H5_USE_18_API
+
+/*************/
+/* Functions */
+/*************/
+
+#if !defined(H5Acreate_vers)
+  #define H5Acreate_vers 2
+#endif /* !defined(H5Acreate_vers) */
+
+#if !defined(H5Aiterate_vers)
+  #define H5Aiterate_vers 2
+#endif /* !defined(H5Aiterate_vers) */
+
+#if !defined(H5Dcreate_vers)
+  #define H5Dcreate_vers 2
+#endif /* !defined(H5Dcreate_vers) */
+
+#if !defined(H5Dopen_vers)
+  #define H5Dopen_vers 2
+#endif /* !defined(H5Dopen_vers) */
+
+#if !defined(H5Eclear_vers)
+  #define H5Eclear_vers 2
+#endif /* !defined(H5Eclear_vers) */
+
+#if !defined(H5Eget_auto_vers)
+  #define H5Eget_auto_vers 2
+#endif /* !defined(H5Eget_auto_vers) */
+
+#if !defined(H5Eprint_vers)
+  #define H5Eprint_vers 2
+#endif /* !defined(H5Eprint_vers) */
+
+#if !defined(H5Epush_vers)
+  #define H5Epush_vers 2
+#endif /* !defined(H5Epush_vers) */
+
+#if !defined(H5Eset_auto_vers)
+  #define H5Eset_auto_vers 2
+#endif /* !defined(H5Eset_auto_vers) */
+
+#if !defined(H5Ewalk_vers)
+  #define H5Ewalk_vers 2
+#endif /* !defined(H5Ewalk_vers) */
+
+#if !defined(H5Fget_info_vers)
+  #define H5Fget_info_vers 1
+#endif /* !defined(H5Fget_info_vers) */
+
+#if !defined(H5Gcreate_vers)
+  #define H5Gcreate_vers 2
+#endif /* !defined(H5Gcreate_vers) */
+
+#if !defined(H5Gopen_vers)
+  #define H5Gopen_vers 2
+#endif /* !defined(H5Gopen_vers) */
+
+#if !defined(H5Pget_filter_vers)
+  #define H5Pget_filter_vers 2
+#endif /* !defined(H5Pget_filter_vers) */
+
+#if !defined(H5Pget_filter_by_id_vers)
+  #define H5Pget_filter_by_id_vers 2
+#endif /* !defined(H5Pget_filter_by_id_vers) */
+
+#if !defined(H5Pinsert_vers)
+  #define H5Pinsert_vers 2
+#endif /* !defined(H5Pinsert_vers) */
+
+#if !defined(H5Pregister_vers)
+  #define H5Pregister_vers 2
+#endif /* !defined(H5Pregister_vers) */
+
+#if !defined(H5Rdereference_vers)
+  #define H5Rdereference_vers 1
+#endif /* !defined(H5Rdereference_vers) */
+
+#if !defined(H5Rget_obj_type_vers)
+  #define H5Rget_obj_type_vers 2
+#endif /* !defined(H5Rget_obj_type_vers) */
+
+#if !defined(H5Tarray_create_vers)
+  #define H5Tarray_create_vers 2
+#endif /* !defined(H5Tarray_create_vers) */
+
+#if !defined(H5Tcommit_vers)
+  #define H5Tcommit_vers 2
+#endif /* !defined(H5Tcommit_vers) */
+
+#if !defined(H5Tget_array_dims_vers)
+  #define H5Tget_array_dims_vers 2
+#endif /* !defined(H5Tget_array_dims_vers) */
+
+#if !defined(H5Topen_vers)
+  #define H5Topen_vers 2
+#endif /* !defined(H5Topen_vers) */
+
+/************/
+/* Typedefs */
+/************/
+
+#if !defined(H5E_auto_t_vers)
+  #define H5E_auto_t_vers 2
+#endif /* !defined(H5E_auto_t_vers) */
+
+#if !defined(H5Z_class_t_vers)
+  #define H5Z_class_t_vers 2
+#endif /* !defined(H5Z_class_t_vers) */
+
+#endif /* H5_USE_18_API */
+
 
 /* Choose the correct version of each API symbol, defaulting to the latest
  *      version of each.  The "best" name for API parameters/data structures
@@ -152,240 +273,264 @@
 /*************/
 
 #if !defined(H5Acreate_vers) || H5Acreate_vers == 2
-#ifndef H5Acreate_vers
-#define H5Acreate_vers 2
-#endif /* H5Acreate_vers */
-#define H5Acreate H5Acreate2
+  #ifndef H5Acreate_vers
+    #define H5Acreate_vers 2
+  #endif /* H5Acreate_vers */
+  #define H5Acreate H5Acreate2
 #elif H5Acreate_vers == 1
-#define H5Acreate H5Acreate1
+  #define H5Acreate H5Acreate1
 #else /* H5Acreate_vers */
-#error "H5Acreate_vers set to invalid value"
+  #error "H5Acreate_vers set to invalid value"
 #endif /* H5Acreate_vers */
 
 #if !defined(H5Aiterate_vers) || H5Aiterate_vers == 2
-#ifndef H5Aiterate_vers
-#define H5Aiterate_vers 2
-#endif /* H5Aiterate_vers */
-#define H5Aiterate H5Aiterate2
-#define H5A_operator_t H5A_operator2_t
+  #ifndef H5Aiterate_vers
+    #define H5Aiterate_vers 2
+  #endif /* H5Aiterate_vers */
+  #define H5Aiterate H5Aiterate2
+  #define H5A_operator_t H5A_operator2_t
 #elif H5Aiterate_vers == 1
-#define H5Aiterate H5Aiterate1
-#define H5A_operator_t H5A_operator1_t
+  #define H5Aiterate H5Aiterate1
+  #define H5A_operator_t H5A_operator1_t
 #else /* H5Aiterate_vers */
-#error "H5Aiterate_vers set to invalid value"
+  #error "H5Aiterate_vers set to invalid value"
 #endif /* H5Aiterate_vers */
 
 #if !defined(H5Dcreate_vers) || H5Dcreate_vers == 2
-#ifndef H5Dcreate_vers
-#define H5Dcreate_vers 2
-#endif /* H5Dcreate_vers */
-#define H5Dcreate H5Dcreate2
+  #ifndef H5Dcreate_vers
+    #define H5Dcreate_vers 2
+  #endif /* H5Dcreate_vers */
+  #define H5Dcreate H5Dcreate2
 #elif H5Dcreate_vers == 1
-#define H5Dcreate H5Dcreate1
+  #define H5Dcreate H5Dcreate1
 #else /* H5Dcreate_vers */
-#error "H5Dcreate_vers set to invalid value"
+  #error "H5Dcreate_vers set to invalid value"
 #endif /* H5Dcreate_vers */
 
 #if !defined(H5Dopen_vers) || H5Dopen_vers == 2
-#ifndef H5Dopen_vers
-#define H5Dopen_vers 2
-#endif /* H5Dopen_vers */
-#define H5Dopen H5Dopen2
+  #ifndef H5Dopen_vers
+    #define H5Dopen_vers 2
+  #endif /* H5Dopen_vers */
+  #define H5Dopen H5Dopen2
 #elif H5Dopen_vers == 1
-#define H5Dopen H5Dopen1
+  #define H5Dopen H5Dopen1
 #else /* H5Dopen_vers */
-#error "H5Dopen_vers set to invalid value"
+  #error "H5Dopen_vers set to invalid value"
 #endif /* H5Dopen_vers */
 
 #if !defined(H5Eclear_vers) || H5Eclear_vers == 2
-#ifndef H5Eclear_vers
-#define H5Eclear_vers 2
-#endif /* H5Eclear_vers */
-#define H5Eclear H5Eclear2
+  #ifndef H5Eclear_vers
+    #define H5Eclear_vers 2
+  #endif /* H5Eclear_vers */
+  #define H5Eclear H5Eclear2
 #elif H5Eclear_vers == 1
-#define H5Eclear H5Eclear1
+  #define H5Eclear H5Eclear1
 #else /* H5Eclear_vers */
-#error "H5Eclear_vers set to invalid value"
+  #error "H5Eclear_vers set to invalid value"
 #endif /* H5Eclear_vers */
 
 #if !defined(H5Eget_auto_vers) || H5Eget_auto_vers == 2
-#ifndef H5Eget_auto_vers
-#define H5Eget_auto_vers 2
-#endif /* H5Eget_auto_vers */
-#define H5Eget_auto H5Eget_auto2
+  #ifndef H5Eget_auto_vers
+    #define H5Eget_auto_vers 2
+  #endif /* H5Eget_auto_vers */
+  #define H5Eget_auto H5Eget_auto2
 #elif H5Eget_auto_vers == 1
-#define H5Eget_auto H5Eget_auto1
+  #define H5Eget_auto H5Eget_auto1
 #else /* H5Eget_auto_vers */
-#error "H5Eget_auto_vers set to invalid value"
+  #error "H5Eget_auto_vers set to invalid value"
 #endif /* H5Eget_auto_vers */
 
 #if !defined(H5Eprint_vers) || H5Eprint_vers == 2
-#ifndef H5Eprint_vers
-#define H5Eprint_vers 2
-#endif /* H5Eprint_vers */
-#define H5Eprint H5Eprint2
+  #ifndef H5Eprint_vers
+    #define H5Eprint_vers 2
+  #endif /* H5Eprint_vers */
+  #define H5Eprint H5Eprint2
 #elif H5Eprint_vers == 1
-#define H5Eprint H5Eprint1
+  #define H5Eprint H5Eprint1
 #else /* H5Eprint_vers */
-#error "H5Eprint_vers set to invalid value"
+  #error "H5Eprint_vers set to invalid value"
 #endif /* H5Eprint_vers */
 
 #if !defined(H5Epush_vers) || H5Epush_vers == 2
-#ifndef H5Epush_vers
-#define H5Epush_vers 2
-#endif /* H5Epush_vers */
-#define H5Epush H5Epush2
+  #ifndef H5Epush_vers
+    #define H5Epush_vers 2
+  #endif /* H5Epush_vers */
+  #define H5Epush H5Epush2
 #elif H5Epush_vers == 1
-#define H5Epush H5Epush1
+  #define H5Epush H5Epush1
 #else /* H5Epush_vers */
-#error "H5Epush_vers set to invalid value"
+  #error "H5Epush_vers set to invalid value"
 #endif /* H5Epush_vers */
 
 #if !defined(H5Eset_auto_vers) || H5Eset_auto_vers == 2
-#ifndef H5Eset_auto_vers
-#define H5Eset_auto_vers 2
-#endif /* H5Eset_auto_vers */
-#define H5Eset_auto H5Eset_auto2
+  #ifndef H5Eset_auto_vers
+    #define H5Eset_auto_vers 2
+  #endif /* H5Eset_auto_vers */
+  #define H5Eset_auto H5Eset_auto2
 #elif H5Eset_auto_vers == 1
-#define H5Eset_auto H5Eset_auto1
+  #define H5Eset_auto H5Eset_auto1
 #else /* H5Eset_auto_vers */
-#error "H5Eset_auto_vers set to invalid value"
+  #error "H5Eset_auto_vers set to invalid value"
 #endif /* H5Eset_auto_vers */
 
 #if !defined(H5Ewalk_vers) || H5Ewalk_vers == 2
-#ifndef H5Ewalk_vers
-#define H5Ewalk_vers 2
-#endif /* H5Ewalk_vers */
-#define H5Ewalk H5Ewalk2
-#define H5E_error_t H5E_error2_t
-#define H5E_walk_t H5E_walk2_t
+  #ifndef H5Ewalk_vers
+    #define H5Ewalk_vers 2
+  #endif /* H5Ewalk_vers */
+  #define H5Ewalk H5Ewalk2
+  #define H5E_error_t H5E_error2_t
+  #define H5E_walk_t H5E_walk2_t
 #elif H5Ewalk_vers == 1
-#define H5Ewalk H5Ewalk1
-#define H5E_error_t H5E_error1_t
-#define H5E_walk_t H5E_walk1_t
+  #define H5Ewalk H5Ewalk1
+  #define H5E_error_t H5E_error1_t
+  #define H5E_walk_t H5E_walk1_t
 #else /* H5Ewalk_vers */
-#error "H5Ewalk_vers set to invalid value"
+  #error "H5Ewalk_vers set to invalid value"
 #endif /* H5Ewalk_vers */
 
+#if !defined(H5Fget_info_vers) || H5Fget_info_vers == 2
+  #ifndef H5Fget_info_vers
+    #define H5Fget_info_vers 2
+  #endif /* H5Fget_info_vers */
+  #define H5Fget_info H5Fget_info2
+  #define H5F_info_t H5F_info2_t
+#elif H5Fget_info_vers == 1
+  #define H5Fget_info H5Fget_info1
+  #define H5F_info_t H5F_info1_t
+#else /* H5Fget_info_vers */
+  #error "H5Fget_info_vers set to invalid value"
+#endif /* H5Fget_info_vers */
+
 #if !defined(H5Gcreate_vers) || H5Gcreate_vers == 2
-#ifndef H5Gcreate_vers
-#define H5Gcreate_vers 2
-#endif /* H5Gcreate_vers */
-#define H5Gcreate H5Gcreate2
+  #ifndef H5Gcreate_vers
+    #define H5Gcreate_vers 2
+  #endif /* H5Gcreate_vers */
+  #define H5Gcreate H5Gcreate2
 #elif H5Gcreate_vers == 1
-#define H5Gcreate H5Gcreate1
+  #define H5Gcreate H5Gcreate1
 #else /* H5Gcreate_vers */
-#error "H5Gcreate_vers set to invalid value"
+  #error "H5Gcreate_vers set to invalid value"
 #endif /* H5Gcreate_vers */
 
 #if !defined(H5Gopen_vers) || H5Gopen_vers == 2
-#ifndef H5Gopen_vers
-#define H5Gopen_vers 2
-#endif /* H5Gopen_vers */
-#define H5Gopen H5Gopen2
+  #ifndef H5Gopen_vers
+    #define H5Gopen_vers 2
+  #endif /* H5Gopen_vers */
+  #define H5Gopen H5Gopen2
 #elif H5Gopen_vers == 1
-#define H5Gopen H5Gopen1
+  #define H5Gopen H5Gopen1
 #else /* H5Gopen_vers */
-#error "H5Gopen_vers set to invalid value"
+  #error "H5Gopen_vers set to invalid value"
 #endif /* H5Gopen_vers */
 
 #if !defined(H5Pget_filter_vers) || H5Pget_filter_vers == 2
-#ifndef H5Pget_filter_vers
-#define H5Pget_filter_vers 2
-#endif /* H5Pget_filter_vers */
-#define H5Pget_filter H5Pget_filter2
+  #ifndef H5Pget_filter_vers
+    #define H5Pget_filter_vers 2
+  #endif /* H5Pget_filter_vers */
+  #define H5Pget_filter H5Pget_filter2
 #elif H5Pget_filter_vers == 1
-#define H5Pget_filter H5Pget_filter1
+  #define H5Pget_filter H5Pget_filter1
 #else /* H5Pget_filter_vers */
-#error "H5Pget_filter_vers set to invalid value"
+  #error "H5Pget_filter_vers set to invalid value"
 #endif /* H5Pget_filter_vers */
 
 #if !defined(H5Pget_filter_by_id_vers) || H5Pget_filter_by_id_vers == 2
-#ifndef H5Pget_filter_by_id_vers
-#define H5Pget_filter_by_id_vers 2
-#endif /* H5Pget_filter_by_id_vers */
-#define H5Pget_filter_by_id H5Pget_filter_by_id2
+  #ifndef H5Pget_filter_by_id_vers
+    #define H5Pget_filter_by_id_vers 2
+  #endif /* H5Pget_filter_by_id_vers */
+  #define H5Pget_filter_by_id H5Pget_filter_by_id2
 #elif H5Pget_filter_by_id_vers == 1
-#define H5Pget_filter_by_id H5Pget_filter_by_id1
+  #define H5Pget_filter_by_id H5Pget_filter_by_id1
 #else /* H5Pget_filter_by_id_vers */
-#error "H5Pget_filter_by_id_vers set to invalid value"
+  #error "H5Pget_filter_by_id_vers set to invalid value"
 #endif /* H5Pget_filter_by_id_vers */
 
 #if !defined(H5Pinsert_vers) || H5Pinsert_vers == 2
-#ifndef H5Pinsert_vers
-#define H5Pinsert_vers 2
-#endif /* H5Pinsert_vers */
-#define H5Pinsert H5Pinsert2
+  #ifndef H5Pinsert_vers
+    #define H5Pinsert_vers 2
+  #endif /* H5Pinsert_vers */
+  #define H5Pinsert H5Pinsert2
 #elif H5Pinsert_vers == 1
-#define H5Pinsert H5Pinsert1
+  #define H5Pinsert H5Pinsert1
 #else /* H5Pinsert_vers */
-#error "H5Pinsert_vers set to invalid value"
+  #error "H5Pinsert_vers set to invalid value"
 #endif /* H5Pinsert_vers */
 
 #if !defined(H5Pregister_vers) || H5Pregister_vers == 2
-#ifndef H5Pregister_vers
-#define H5Pregister_vers 2
-#endif /* H5Pregister_vers */
-#define H5Pregister H5Pregister2
+  #ifndef H5Pregister_vers
+    #define H5Pregister_vers 2
+  #endif /* H5Pregister_vers */
+  #define H5Pregister H5Pregister2
 #elif H5Pregister_vers == 1
-#define H5Pregister H5Pregister1
+  #define H5Pregister H5Pregister1
 #else /* H5Pregister_vers */
-#error "H5Pregister_vers set to invalid value"
+  #error "H5Pregister_vers set to invalid value"
 #endif /* H5Pregister_vers */
 
+#if !defined(H5Rdereference_vers) || H5Rdereference_vers == 2
+  #ifndef H5Rdereference_vers
+    #define H5Rdereference_vers 2
+  #endif /* H5Rdereference_vers */
+  #define H5Rdereference H5Rdereference2
+#elif H5Rdereference_vers == 1
+  #define H5Rdereference H5Rdereference1
+#else /* H5Rdereference_vers */
+  #error "H5Rdereference_vers set to invalid value"
+#endif /* H5Rdereference_vers */
+
 #if !defined(H5Rget_obj_type_vers) || H5Rget_obj_type_vers == 2
-#ifndef H5Rget_obj_type_vers
-#define H5Rget_obj_type_vers 2
-#endif /* H5Rget_obj_type_vers */
-#define H5Rget_obj_type H5Rget_obj_type2
+  #ifndef H5Rget_obj_type_vers
+    #define H5Rget_obj_type_vers 2
+  #endif /* H5Rget_obj_type_vers */
+  #define H5Rget_obj_type H5Rget_obj_type2
 #elif H5Rget_obj_type_vers == 1
-#define H5Rget_obj_type H5Rget_obj_type1
+  #define H5Rget_obj_type H5Rget_obj_type1
 #else /* H5Rget_obj_type_vers */
-#error "H5Rget_obj_type_vers set to invalid value"
+  #error "H5Rget_obj_type_vers set to invalid value"
 #endif /* H5Rget_obj_type_vers */
 
 #if !defined(H5Tarray_create_vers) || H5Tarray_create_vers == 2
-#ifndef H5Tarray_create_vers
-#define H5Tarray_create_vers 2
-#endif /* H5Tarray_create_vers */
-#define H5Tarray_create H5Tarray_create2
+  #ifndef H5Tarray_create_vers
+    #define H5Tarray_create_vers 2
+  #endif /* H5Tarray_create_vers */
+  #define H5Tarray_create H5Tarray_create2
 #elif H5Tarray_create_vers == 1
-#define H5Tarray_create H5Tarray_create1
+  #define H5Tarray_create H5Tarray_create1
 #else /* H5Tarray_create_vers */
-#error "H5Tarray_create_vers set to invalid value"
+  #error "H5Tarray_create_vers set to invalid value"
 #endif /* H5Tarray_create_vers */
 
 #if !defined(H5Tcommit_vers) || H5Tcommit_vers == 2
-#ifndef H5Tcommit_vers
-#define H5Tcommit_vers 2
-#endif /* H5Tcommit_vers */
-#define H5Tcommit H5Tcommit2
+  #ifndef H5Tcommit_vers
+    #define H5Tcommit_vers 2
+  #endif /* H5Tcommit_vers */
+  #define H5Tcommit H5Tcommit2
 #elif H5Tcommit_vers == 1
-#define H5Tcommit H5Tcommit1
+  #define H5Tcommit H5Tcommit1
 #else /* H5Tcommit_vers */
-#error "H5Tcommit_vers set to invalid value"
+  #error "H5Tcommit_vers set to invalid value"
 #endif /* H5Tcommit_vers */
 
 #if !defined(H5Tget_array_dims_vers) || H5Tget_array_dims_vers == 2
-#ifndef H5Tget_array_dims_vers
-#define H5Tget_array_dims_vers 2
-#endif /* H5Tget_array_dims_vers */
-#define H5Tget_array_dims H5Tget_array_dims2
+  #ifndef H5Tget_array_dims_vers
+    #define H5Tget_array_dims_vers 2
+  #endif /* H5Tget_array_dims_vers */
+  #define H5Tget_array_dims H5Tget_array_dims2
 #elif H5Tget_array_dims_vers == 1
-#define H5Tget_array_dims H5Tget_array_dims1
+  #define H5Tget_array_dims H5Tget_array_dims1
 #else /* H5Tget_array_dims_vers */
-#error "H5Tget_array_dims_vers set to invalid value"
+  #error "H5Tget_array_dims_vers set to invalid value"
 #endif /* H5Tget_array_dims_vers */
 
 #if !defined(H5Topen_vers) || H5Topen_vers == 2
-#ifndef H5Topen_vers
-#define H5Topen_vers 2
-#endif /* H5Topen_vers */
-#define H5Topen H5Topen2
+  #ifndef H5Topen_vers
+    #define H5Topen_vers 2
+  #endif /* H5Topen_vers */
+  #define H5Topen H5Topen2
 #elif H5Topen_vers == 1
-#define H5Topen H5Topen1
+  #define H5Topen H5Topen1
 #else /* H5Topen_vers */
-#error "H5Topen_vers set to invalid value"
+  #error "H5Topen_vers set to invalid value"
 #endif /* H5Topen_vers */
 
 /************/
@@ -393,26 +538,26 @@
 /************/
 
 #if !defined(H5E_auto_t_vers) || H5E_auto_t_vers == 2
-#ifndef H5E_auto_t_vers
-#define H5E_auto_t_vers 2
-#endif /* H5E_auto_t_vers */
-#define H5E_auto_t H5E_auto2_t
+  #ifndef H5E_auto_t_vers
+    #define H5E_auto_t_vers 2
+  #endif /* H5E_auto_t_vers */
+  #define H5E_auto_t H5E_auto2_t
 #elif H5E_auto_t_vers == 1
-#define H5E_auto_t H5E_auto1_t
+  #define H5E_auto_t H5E_auto1_t
 #else /* H5E_auto_t_vers */
-#error "H5E_auto_t_vers set to invalid value"
+  #error "H5E_auto_t_vers set to invalid value"
 #endif /* H5E_auto_t_vers */
 
 
 #if !defined(H5Z_class_t_vers) || H5Z_class_t_vers == 2
-#ifndef H5Z_class_t_vers
-#define H5Z_class_t_vers 2
-#endif /* H5Z_class_t_vers */
-#define H5Z_class_t H5Z_class2_t
+  #ifndef H5Z_class_t_vers
+    #define H5Z_class_t_vers 2
+  #endif /* H5Z_class_t_vers */
+  #define H5Z_class_t H5Z_class2_t
 #elif H5Z_class_t_vers == 1
-#define H5Z_class_t H5Z_class1_t
+  #define H5Z_class_t H5Z_class1_t
 #else /* H5Z_class_t_vers */
-#error "H5Z_class_t_vers set to invalid value"
+  #error "H5Z_class_t_vers set to invalid value"
 #endif /* H5Z_class_t_vers */
 
 #endif /* H5version_H */
diff --git a/src/H5win32defs.h b/src/H5win32defs.h
index 58e1412..e84def9 100644
--- a/src/H5win32defs.h
+++ b/src/H5win32defs.h
@@ -74,6 +74,7 @@ struct timezone {
         extern "C" {
 #endif /* __cplusplus */
         H5_DLL int Wgettimeofday(struct timeval *tv, struct timezone *tz);
+        H5_DLL int Wflock(int fd, int operation);
         H5_DLL char* Wgetlogin(void);
         H5_DLL int c99_snprintf(char* str, size_t size, const char* format, ...);
         H5_DLL int c99_vsnprintf(char* str, size_t size, const char* format, va_list ap);
@@ -81,15 +82,10 @@ struct timezone {
         }
 #endif /* __cplusplus */
 #define HDgettimeofday(V,Z) Wgettimeofday(V,Z)
+#define HDflock(F,L)        Wflock(F,L)
 #define HDgetlogin()        Wgetlogin()
 #define HDsnprintf          c99_snprintf /*varargs*/
 #define HDvsnprintf         c99_vsnprintf
-#if _MSC_VER >= 1900  // VS 2015
-    // In gcc and in Visual Studio prior to VS 2015 'timezone' is a global
-    // variable declared in time.h. That variable was deprecated and in VS 2015
-    // is removed, with _get_timezone replacing it.
-    #define HDget_timezone(V)    _get_timezone(V);
-#endif
 
 #endif /* H5_HAVE_VISUAL_STUDIO */
 
diff --git a/src/Makefile.am b/src/Makefile.am
index bc94252..7f8babd 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -42,53 +42,63 @@ DISTCLEANFILES=H5pubconf.h
 # library sources
 libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
         H5A.c H5Abtree2.c H5Adense.c H5Adeprec.c H5Aint.c H5Atest.c \
-        H5AC.c H5B.c H5Bcache.c H5Bdbg.c \
+        H5AC.c H5AClog.c \
+        H5B.c H5Bcache.c H5Bdbg.c \
         H5B2.c H5B2cache.c H5B2dbg.c H5B2hdr.c H5B2int.c H5B2stat.c H5B2test.c \
-        H5C.c H5CS.c \
-        H5D.c H5Dbtree.c H5Dchunk.c H5Dcompact.c H5Dcontig.c H5Ddbg.c \
-        H5Ddeprec.c H5Defl.c H5Dfill.c H5Dint.c \
-        H5Dio.c H5Dlayout.c \
-        H5Dmpio.c H5Doh.c H5Dscatgath.c H5Dselect.c H5Dtest.c \
+        H5C.c \
+        H5CS.c \
+        H5D.c H5Dbtree.c H5Dbtree2.c H5Dchunk.c H5Dcompact.c H5Dcontig.c H5Ddbg.c \
+        H5Ddeprec.c H5Dearray.c H5Defl.c H5Dfarray.c H5Dsingle.c H5Dfill.c H5Dint.c \
+        H5Dio.c H5Dlayout.c H5Dnone.c H5Doh.c H5Dscatgath.c \
+        H5Dselect.c H5Dtest.c H5Dvirtual.c \
         H5E.c H5Edeprec.c H5Eint.c \
+        H5EA.c H5EAcache.c H5EAdbg.c H5EAdblkpage.c H5EAdblock.c H5EAhdr.c \
+        H5EAiblock.c H5EAint.c H5EAsblock.c H5EAstat.c H5EAtest.c \
         H5F.c H5Fint.c H5Faccum.c H5Fcwfs.c \
-        H5Fdbg.c H5Fefc.c H5Ffake.c H5Fio.c \
-        H5Fmount.c H5Fmpi.c H5Fquery.c \
+        H5Fdbg.c H5Fdeprec.c H5Fefc.c H5Ffake.c H5Fio.c \
+        H5Fmount.c H5Fquery.c \
         H5Fsfile.c H5Fsuper.c H5Fsuper_cache.c H5Ftest.c \
+        H5FA.c H5FAcache.c H5FAdbg.c H5FAdblock.c H5FAdblkpage.c H5FAhdr.c \
+        H5FAint.c H5FAstat.c H5FAtest.c \
         H5FD.c H5FDcore.c  \
-        H5FDdirect.c H5FDfamily.c H5FDint.c H5FDlog.c H5FDmpi.c H5FDmpio.c \
-        H5FDmulti.c H5FDsec2.c H5FDspace.c H5FDstdio.c \
-        H5FL.c H5FO.c H5FS.c H5FScache.c H5FSdbg.c H5FSsection.c H5FSstat.c H5FStest.c \
+        H5FDfamily.c H5FDint.c H5FDlog.c \
+        H5FDmulti.c H5FDsec2.c H5FDspace.c H5FDstdio.c H5FDtest.c \
+        H5FL.c H5FO.c H5FS.c H5FScache.c H5FSdbg.c H5FSint.c H5FSsection.c \
+        H5FSstat.c H5FStest.c \
         H5G.c H5Gbtree2.c H5Gcache.c \
         H5Gcompact.c H5Gdense.c H5Gdeprec.c H5Gent.c \
         H5Gint.c H5Glink.c \
         H5Gloc.c H5Gname.c H5Gnode.c H5Gobj.c H5Goh.c H5Groot.c H5Gstab.c H5Gtest.c \
         H5Gtraverse.c \
         H5HF.c H5HFbtree2.c H5HFcache.c H5HFdbg.c H5HFdblock.c H5HFdtable.c \
-        H5HFhdr.c H5HFhuge.c H5HFiblock.c H5HFiter.c H5HFman.c H5HFsection.c \
-        H5HFspace.c H5HFstat.c H5HFtest.c H5HFtiny.c \
+        H5HFhdr.c H5HFhuge.c H5HFiblock.c H5HFint.c H5HFiter.c H5HFman.c \
+        H5HFsection.c H5HFspace.c H5HFstat.c H5HFtest.c H5HFtiny.c \
         H5HG.c H5HGcache.c H5HGdbg.c H5HGquery.c \
-        H5HL.c H5HLcache.c H5HLdbg.c H5HLint.c \
+        H5HL.c H5HLcache.c H5HLdbg.c H5HLint.c H5HLprfx.c H5HLdblk.c\
         H5HP.c H5I.c H5Itest.c H5L.c H5Lexternal.c H5lib_settings.c \
         H5MF.c H5MFaggr.c H5MFdbg.c H5MFsection.c \
         H5MM.c H5MP.c H5MPtest.c \
         H5O.c H5Oainfo.c H5Oalloc.c H5Oattr.c \
         H5Oattribute.c H5Obogus.c H5Obtreek.c H5Ocache.c H5Ochunk.c \
         H5Ocont.c H5Ocopy.c H5Odbg.c H5Odrvinfo.c H5Odtype.c H5Oefl.c \
-        H5Ofill.c H5Oginfo.c \
+        H5Ofill.c H5Oflush.c H5Ofsinfo.c H5Oginfo.c \
         H5Olayout.c \
         H5Olinfo.c H5Olink.c H5Omessage.c H5Omtime.c \
-        H5Oname.c H5Onull.c H5Opline.c H5Orefcount.c \
-        H5Osdspace.c H5Oshared.c H5Ostab.c \
-        H5Oshmesg.c H5Otest.c H5Ounknown.c \
+        H5Oname.c H5Onull.c H5Opline.c H5Oproxy.c H5Orefcount.c \
+        H5Osdspace.c H5Oshared.c \
+        H5Oshmesg.c \
+        H5Ostab.c \
+        H5Otest.c H5Ounknown.c \
         H5P.c H5Pacpl.c H5Pdapl.c H5Pdcpl.c \
-        H5Pdeprec.c H5Pdxpl.c H5Pfapl.c H5Pfcpl.c H5Pfmpl.c \
+        H5Pdeprec.c H5Pdxpl.c H5Pencdec.c \
+        H5Pfapl.c H5Pfcpl.c H5Pfmpl.c \
         H5Pgcpl.c H5Pint.c \
         H5Plapl.c H5Plcpl.c H5Pocpl.c H5Pocpypl.c H5Pstrcpl.c H5Ptest.c \
         H5PL.c \
         H5R.c H5Rdeprec.c \
-        H5RC.c \
+        H5UC.c \
         H5RS.c \
-        H5S.c H5Sall.c H5Sdbg.c H5Shyper.c H5Smpio.c H5Snone.c H5Spoint.c \
+        H5S.c H5Sall.c H5Sdbg.c H5Shyper.c H5Snone.c H5Spoint.c \
         H5Sselect.c H5Stest.c \
         H5SL.c \
         H5SM.c H5SMbtree2.c H5SMcache.c H5SMmessage.c H5SMtest.c \
@@ -100,9 +110,18 @@ libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
         H5Topaque.c \
         H5Torder.c \
         H5Tpad.c H5Tprecis.c H5Tstrpad.c H5Tvisit.c H5Tvlen.c H5TS.c H5VM.c H5WB.c H5Z.c  \
-        H5Zdeflate.c H5Zfletcher32.c H5Znbit.c H5Zshuffle.c H5Zszip.c  \
-        H5Zscaleoffset.c H5Ztrans.c
+        H5Zdeflate.c H5Zfletcher32.c H5Znbit.c H5Zshuffle.c \
+        H5Zscaleoffset.c H5Zszip.c H5Ztrans.c
 
+# Only compile parallel sources if necessary
+if BUILD_PARALLEL_CONDITIONAL
+    libhdf5_la_SOURCES += H5ACmpio.c H5Cmpio.c H5Dmpio.c H5Fmpi.c H5FDmpi.c H5FDmpio.c H5Smpio.c
+endif
+
+# Only compile the direct VFD if necessary
+if DIRECT_VFD_CONDITIONAL
+    libhdf5_la_SOURCES += H5FDdirect.c
+endif
 
 # Public headers
 include_HEADERS = hdf5.h H5api_adpt.h H5overflow.h H5pubconf.h H5public.h H5version.h \
@@ -110,7 +129,7 @@ include_HEADERS = hdf5.h H5api_adpt.h H5overflow.h H5pubconf.h H5public.h H5vers
         H5Cpublic.h H5Dpublic.h \
         H5Epubgen.h H5Epublic.h H5Fpublic.h \
         H5FDpublic.h H5FDcore.h H5FDdirect.h \
-	H5FDfamily.h H5FDlog.h H5FDmpi.h H5FDmpio.h \
+        H5FDfamily.h H5FDlog.h H5FDmpi.h H5FDmpio.h \
         H5FDmulti.h H5FDsec2.h  H5FDstdio.h \
         H5Gpublic.h  H5Ipublic.h H5Lpublic.h \
         H5MMpublic.h H5Opublic.h H5Ppublic.h \
diff --git a/src/Makefile.in b/src/Makefile.in
index 4831885..7d66534 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -35,7 +35,17 @@
 
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -98,23 +108,27 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/lt_vers.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(srcdir)/H5config.h.in \
-	$(top_srcdir)/bin/mkinstalldirs $(srcdir)/libhdf5.settings.in \
-	$(top_srcdir)/bin/depcomp $(include_HEADERS) \
-	$(top_srcdir)/bin/test-driver COPYING
 noinst_PROGRAMS = H5detect$(EXEEXT) H5make_libsettings$(EXEEXT)
+
+# Only compile parallel sources if necessary
+ at BUILD_PARALLEL_CONDITIONAL_TRUE@am__append_1 = H5ACmpio.c H5Cmpio.c H5Dmpio.c H5Fmpi.c H5FDmpi.c H5FDmpio.c H5Smpio.c
+
+# Only compile the direct VFD if necessary
+ at DIRECT_VFD_CONDITIONAL_TRUE@am__append_2 = H5FDdirect.c
 TESTS =
 subdir = src
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \
+	$(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = H5config.h $(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES = libhdf5.settings
 CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
@@ -148,54 +162,116 @@ am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(settingsdir)" \
 	"$(DESTDIR)$(includedir)"
 LTLIBRARIES = $(lib_LTLIBRARIES)
 libhdf5_la_LIBADD =
+am__libhdf5_la_SOURCES_DIST = H5.c H5checksum.c H5dbg.c H5system.c \
+	H5timer.c H5trace.c H5A.c H5Abtree2.c H5Adense.c H5Adeprec.c \
+	H5Aint.c H5Atest.c H5AC.c H5AClog.c H5B.c H5Bcache.c H5Bdbg.c \
+	H5B2.c H5B2cache.c H5B2dbg.c H5B2hdr.c H5B2int.c H5B2stat.c \
+	H5B2test.c H5C.c H5CS.c H5D.c H5Dbtree.c H5Dbtree2.c \
+	H5Dchunk.c H5Dcompact.c H5Dcontig.c H5Ddbg.c H5Ddeprec.c \
+	H5Dearray.c H5Defl.c H5Dfarray.c H5Dsingle.c H5Dfill.c \
+	H5Dint.c H5Dio.c H5Dlayout.c H5Dnone.c H5Doh.c H5Dscatgath.c \
+	H5Dselect.c H5Dtest.c H5Dvirtual.c H5E.c H5Edeprec.c H5Eint.c \
+	H5EA.c H5EAcache.c H5EAdbg.c H5EAdblkpage.c H5EAdblock.c \
+	H5EAhdr.c H5EAiblock.c H5EAint.c H5EAsblock.c H5EAstat.c \
+	H5EAtest.c H5F.c H5Fint.c H5Faccum.c H5Fcwfs.c H5Fdbg.c \
+	H5Fdeprec.c H5Fefc.c H5Ffake.c H5Fio.c H5Fmount.c H5Fquery.c \
+	H5Fsfile.c H5Fsuper.c H5Fsuper_cache.c H5Ftest.c H5FA.c \
+	H5FAcache.c H5FAdbg.c H5FAdblock.c H5FAdblkpage.c H5FAhdr.c \
+	H5FAint.c H5FAstat.c H5FAtest.c H5FD.c H5FDcore.c H5FDfamily.c \
+	H5FDint.c H5FDlog.c H5FDmulti.c H5FDsec2.c H5FDspace.c \
+	H5FDstdio.c H5FDtest.c H5FL.c H5FO.c H5FS.c H5FScache.c \
+	H5FSdbg.c H5FSint.c H5FSsection.c H5FSstat.c H5FStest.c H5G.c \
+	H5Gbtree2.c H5Gcache.c H5Gcompact.c H5Gdense.c H5Gdeprec.c \
+	H5Gent.c H5Gint.c H5Glink.c H5Gloc.c H5Gname.c H5Gnode.c \
+	H5Gobj.c H5Goh.c H5Groot.c H5Gstab.c H5Gtest.c H5Gtraverse.c \
+	H5HF.c H5HFbtree2.c H5HFcache.c H5HFdbg.c H5HFdblock.c \
+	H5HFdtable.c H5HFhdr.c H5HFhuge.c H5HFiblock.c H5HFint.c \
+	H5HFiter.c H5HFman.c H5HFsection.c H5HFspace.c H5HFstat.c \
+	H5HFtest.c H5HFtiny.c H5HG.c H5HGcache.c H5HGdbg.c H5HGquery.c \
+	H5HL.c H5HLcache.c H5HLdbg.c H5HLint.c H5HLprfx.c H5HLdblk.c \
+	H5HP.c H5I.c H5Itest.c H5L.c H5Lexternal.c H5lib_settings.c \
+	H5MF.c H5MFaggr.c H5MFdbg.c H5MFsection.c H5MM.c H5MP.c \
+	H5MPtest.c H5O.c H5Oainfo.c H5Oalloc.c H5Oattr.c \
+	H5Oattribute.c H5Obogus.c H5Obtreek.c H5Ocache.c H5Ochunk.c \
+	H5Ocont.c H5Ocopy.c H5Odbg.c H5Odrvinfo.c H5Odtype.c H5Oefl.c \
+	H5Ofill.c H5Oflush.c H5Ofsinfo.c H5Oginfo.c H5Olayout.c \
+	H5Olinfo.c H5Olink.c H5Omessage.c H5Omtime.c H5Oname.c \
+	H5Onull.c H5Opline.c H5Oproxy.c H5Orefcount.c H5Osdspace.c \
+	H5Oshared.c H5Oshmesg.c H5Ostab.c H5Otest.c H5Ounknown.c H5P.c \
+	H5Pacpl.c H5Pdapl.c H5Pdcpl.c H5Pdeprec.c H5Pdxpl.c \
+	H5Pencdec.c H5Pfapl.c H5Pfcpl.c H5Pfmpl.c H5Pgcpl.c H5Pint.c \
+	H5Plapl.c H5Plcpl.c H5Pocpl.c H5Pocpypl.c H5Pstrcpl.c \
+	H5Ptest.c H5PL.c H5R.c H5Rdeprec.c H5UC.c H5RS.c H5S.c \
+	H5Sall.c H5Sdbg.c H5Shyper.c H5Snone.c H5Spoint.c H5Sselect.c \
+	H5Stest.c H5SL.c H5SM.c H5SMbtree2.c H5SMcache.c H5SMmessage.c \
+	H5SMtest.c H5ST.c H5T.c H5Tarray.c H5Tbit.c H5Tcommit.c \
+	H5Tcompound.c H5Tconv.c H5Tcset.c H5Tdbg.c H5Tdeprec.c \
+	H5Tenum.c H5Tfields.c H5Tfixed.c H5Tfloat.c H5Tinit.c \
+	H5Tnative.c H5Toffset.c H5Toh.c H5Topaque.c H5Torder.c \
+	H5Tpad.c H5Tprecis.c H5Tstrpad.c H5Tvisit.c H5Tvlen.c H5TS.c \
+	H5VM.c H5WB.c H5Z.c H5Zdeflate.c H5Zfletcher32.c H5Znbit.c \
+	H5Zshuffle.c H5Zscaleoffset.c H5Zszip.c H5Ztrans.c H5ACmpio.c \
+	H5Cmpio.c H5Dmpio.c H5Fmpi.c H5FDmpi.c H5FDmpio.c H5Smpio.c \
+	H5FDdirect.c
+ at BUILD_PARALLEL_CONDITIONAL_TRUE@am__objects_1 = H5ACmpio.lo \
+ at BUILD_PARALLEL_CONDITIONAL_TRUE@	H5Cmpio.lo H5Dmpio.lo \
+ at BUILD_PARALLEL_CONDITIONAL_TRUE@	H5Fmpi.lo H5FDmpi.lo \
+ at BUILD_PARALLEL_CONDITIONAL_TRUE@	H5FDmpio.lo H5Smpio.lo
+ at DIRECT_VFD_CONDITIONAL_TRUE@am__objects_2 = H5FDdirect.lo
 am_libhdf5_la_OBJECTS = H5.lo H5checksum.lo H5dbg.lo H5system.lo \
 	H5timer.lo H5trace.lo H5A.lo H5Abtree2.lo H5Adense.lo \
-	H5Adeprec.lo H5Aint.lo H5Atest.lo H5AC.lo H5B.lo H5Bcache.lo \
-	H5Bdbg.lo H5B2.lo H5B2cache.lo H5B2dbg.lo H5B2hdr.lo \
-	H5B2int.lo H5B2stat.lo H5B2test.lo H5C.lo H5CS.lo H5D.lo \
-	H5Dbtree.lo H5Dchunk.lo H5Dcompact.lo H5Dcontig.lo H5Ddbg.lo \
-	H5Ddeprec.lo H5Defl.lo H5Dfill.lo H5Dint.lo H5Dio.lo \
-	H5Dlayout.lo H5Dmpio.lo H5Doh.lo H5Dscatgath.lo H5Dselect.lo \
-	H5Dtest.lo H5E.lo H5Edeprec.lo H5Eint.lo H5F.lo H5Fint.lo \
-	H5Faccum.lo H5Fcwfs.lo H5Fdbg.lo H5Fefc.lo H5Ffake.lo H5Fio.lo \
-	H5Fmount.lo H5Fmpi.lo H5Fquery.lo H5Fsfile.lo H5Fsuper.lo \
-	H5Fsuper_cache.lo H5Ftest.lo H5FD.lo H5FDcore.lo H5FDdirect.lo \
-	H5FDfamily.lo H5FDint.lo H5FDlog.lo H5FDmpi.lo H5FDmpio.lo \
-	H5FDmulti.lo H5FDsec2.lo H5FDspace.lo H5FDstdio.lo H5FL.lo \
-	H5FO.lo H5FS.lo H5FScache.lo H5FSdbg.lo H5FSsection.lo \
-	H5FSstat.lo H5FStest.lo H5G.lo H5Gbtree2.lo H5Gcache.lo \
-	H5Gcompact.lo H5Gdense.lo H5Gdeprec.lo H5Gent.lo H5Gint.lo \
-	H5Glink.lo H5Gloc.lo H5Gname.lo H5Gnode.lo H5Gobj.lo H5Goh.lo \
-	H5Groot.lo H5Gstab.lo H5Gtest.lo H5Gtraverse.lo H5HF.lo \
-	H5HFbtree2.lo H5HFcache.lo H5HFdbg.lo H5HFdblock.lo \
-	H5HFdtable.lo H5HFhdr.lo H5HFhuge.lo H5HFiblock.lo H5HFiter.lo \
-	H5HFman.lo H5HFsection.lo H5HFspace.lo H5HFstat.lo H5HFtest.lo \
-	H5HFtiny.lo H5HG.lo H5HGcache.lo H5HGdbg.lo H5HGquery.lo \
-	H5HL.lo H5HLcache.lo H5HLdbg.lo H5HLint.lo H5HP.lo H5I.lo \
-	H5Itest.lo H5L.lo H5Lexternal.lo H5lib_settings.lo H5MF.lo \
-	H5MFaggr.lo H5MFdbg.lo H5MFsection.lo H5MM.lo H5MP.lo \
-	H5MPtest.lo H5O.lo H5Oainfo.lo H5Oalloc.lo H5Oattr.lo \
-	H5Oattribute.lo H5Obogus.lo H5Obtreek.lo H5Ocache.lo \
-	H5Ochunk.lo H5Ocont.lo H5Ocopy.lo H5Odbg.lo H5Odrvinfo.lo \
-	H5Odtype.lo H5Oefl.lo H5Ofill.lo H5Oginfo.lo H5Olayout.lo \
-	H5Olinfo.lo H5Olink.lo H5Omessage.lo H5Omtime.lo H5Oname.lo \
-	H5Onull.lo H5Opline.lo H5Orefcount.lo H5Osdspace.lo \
-	H5Oshared.lo H5Ostab.lo H5Oshmesg.lo H5Otest.lo H5Ounknown.lo \
+	H5Adeprec.lo H5Aint.lo H5Atest.lo H5AC.lo H5AClog.lo H5B.lo \
+	H5Bcache.lo H5Bdbg.lo H5B2.lo H5B2cache.lo H5B2dbg.lo \
+	H5B2hdr.lo H5B2int.lo H5B2stat.lo H5B2test.lo H5C.lo H5CS.lo \
+	H5D.lo H5Dbtree.lo H5Dbtree2.lo H5Dchunk.lo H5Dcompact.lo \
+	H5Dcontig.lo H5Ddbg.lo H5Ddeprec.lo H5Dearray.lo H5Defl.lo \
+	H5Dfarray.lo H5Dsingle.lo H5Dfill.lo H5Dint.lo H5Dio.lo \
+	H5Dlayout.lo H5Dnone.lo H5Doh.lo H5Dscatgath.lo H5Dselect.lo \
+	H5Dtest.lo H5Dvirtual.lo H5E.lo H5Edeprec.lo H5Eint.lo H5EA.lo \
+	H5EAcache.lo H5EAdbg.lo H5EAdblkpage.lo H5EAdblock.lo \
+	H5EAhdr.lo H5EAiblock.lo H5EAint.lo H5EAsblock.lo H5EAstat.lo \
+	H5EAtest.lo H5F.lo H5Fint.lo H5Faccum.lo H5Fcwfs.lo H5Fdbg.lo \
+	H5Fdeprec.lo H5Fefc.lo H5Ffake.lo H5Fio.lo H5Fmount.lo \
+	H5Fquery.lo H5Fsfile.lo H5Fsuper.lo H5Fsuper_cache.lo \
+	H5Ftest.lo H5FA.lo H5FAcache.lo H5FAdbg.lo H5FAdblock.lo \
+	H5FAdblkpage.lo H5FAhdr.lo H5FAint.lo H5FAstat.lo H5FAtest.lo \
+	H5FD.lo H5FDcore.lo H5FDfamily.lo H5FDint.lo H5FDlog.lo \
+	H5FDmulti.lo H5FDsec2.lo H5FDspace.lo H5FDstdio.lo H5FDtest.lo \
+	H5FL.lo H5FO.lo H5FS.lo H5FScache.lo H5FSdbg.lo H5FSint.lo \
+	H5FSsection.lo H5FSstat.lo H5FStest.lo H5G.lo H5Gbtree2.lo \
+	H5Gcache.lo H5Gcompact.lo H5Gdense.lo H5Gdeprec.lo H5Gent.lo \
+	H5Gint.lo H5Glink.lo H5Gloc.lo H5Gname.lo H5Gnode.lo H5Gobj.lo \
+	H5Goh.lo H5Groot.lo H5Gstab.lo H5Gtest.lo H5Gtraverse.lo \
+	H5HF.lo H5HFbtree2.lo H5HFcache.lo H5HFdbg.lo H5HFdblock.lo \
+	H5HFdtable.lo H5HFhdr.lo H5HFhuge.lo H5HFiblock.lo H5HFint.lo \
+	H5HFiter.lo H5HFman.lo H5HFsection.lo H5HFspace.lo H5HFstat.lo \
+	H5HFtest.lo H5HFtiny.lo H5HG.lo H5HGcache.lo H5HGdbg.lo \
+	H5HGquery.lo H5HL.lo H5HLcache.lo H5HLdbg.lo H5HLint.lo \
+	H5HLprfx.lo H5HLdblk.lo H5HP.lo H5I.lo H5Itest.lo H5L.lo \
+	H5Lexternal.lo H5lib_settings.lo H5MF.lo H5MFaggr.lo \
+	H5MFdbg.lo H5MFsection.lo H5MM.lo H5MP.lo H5MPtest.lo H5O.lo \
+	H5Oainfo.lo H5Oalloc.lo H5Oattr.lo H5Oattribute.lo H5Obogus.lo \
+	H5Obtreek.lo H5Ocache.lo H5Ochunk.lo H5Ocont.lo H5Ocopy.lo \
+	H5Odbg.lo H5Odrvinfo.lo H5Odtype.lo H5Oefl.lo H5Ofill.lo \
+	H5Oflush.lo H5Ofsinfo.lo H5Oginfo.lo H5Olayout.lo H5Olinfo.lo \
+	H5Olink.lo H5Omessage.lo H5Omtime.lo H5Oname.lo H5Onull.lo \
+	H5Opline.lo H5Oproxy.lo H5Orefcount.lo H5Osdspace.lo \
+	H5Oshared.lo H5Oshmesg.lo H5Ostab.lo H5Otest.lo H5Ounknown.lo \
 	H5P.lo H5Pacpl.lo H5Pdapl.lo H5Pdcpl.lo H5Pdeprec.lo \
-	H5Pdxpl.lo H5Pfapl.lo H5Pfcpl.lo H5Pfmpl.lo H5Pgcpl.lo \
-	H5Pint.lo H5Plapl.lo H5Plcpl.lo H5Pocpl.lo H5Pocpypl.lo \
-	H5Pstrcpl.lo H5Ptest.lo H5PL.lo H5R.lo H5Rdeprec.lo H5RC.lo \
-	H5RS.lo H5S.lo H5Sall.lo H5Sdbg.lo H5Shyper.lo H5Smpio.lo \
-	H5Snone.lo H5Spoint.lo H5Sselect.lo H5Stest.lo H5SL.lo H5SM.lo \
-	H5SMbtree2.lo H5SMcache.lo H5SMmessage.lo H5SMtest.lo H5ST.lo \
-	H5T.lo H5Tarray.lo H5Tbit.lo H5Tcommit.lo H5Tcompound.lo \
-	H5Tconv.lo H5Tcset.lo H5Tdbg.lo H5Tdeprec.lo H5Tenum.lo \
-	H5Tfields.lo H5Tfixed.lo H5Tfloat.lo H5Tinit.lo H5Tnative.lo \
-	H5Toffset.lo H5Toh.lo H5Topaque.lo H5Torder.lo H5Tpad.lo \
-	H5Tprecis.lo H5Tstrpad.lo H5Tvisit.lo H5Tvlen.lo H5TS.lo \
-	H5VM.lo H5WB.lo H5Z.lo H5Zdeflate.lo H5Zfletcher32.lo \
-	H5Znbit.lo H5Zshuffle.lo H5Zszip.lo H5Zscaleoffset.lo \
-	H5Ztrans.lo
+	H5Pdxpl.lo H5Pencdec.lo H5Pfapl.lo H5Pfcpl.lo H5Pfmpl.lo \
+	H5Pgcpl.lo H5Pint.lo H5Plapl.lo H5Plcpl.lo H5Pocpl.lo \
+	H5Pocpypl.lo H5Pstrcpl.lo H5Ptest.lo H5PL.lo H5R.lo \
+	H5Rdeprec.lo H5UC.lo H5RS.lo H5S.lo H5Sall.lo H5Sdbg.lo \
+	H5Shyper.lo H5Snone.lo H5Spoint.lo H5Sselect.lo H5Stest.lo \
+	H5SL.lo H5SM.lo H5SMbtree2.lo H5SMcache.lo H5SMmessage.lo \
+	H5SMtest.lo H5ST.lo H5T.lo H5Tarray.lo H5Tbit.lo H5Tcommit.lo \
+	H5Tcompound.lo H5Tconv.lo H5Tcset.lo H5Tdbg.lo H5Tdeprec.lo \
+	H5Tenum.lo H5Tfields.lo H5Tfixed.lo H5Tfloat.lo H5Tinit.lo \
+	H5Tnative.lo H5Toffset.lo H5Toh.lo H5Topaque.lo H5Torder.lo \
+	H5Tpad.lo H5Tprecis.lo H5Tstrpad.lo H5Tvisit.lo H5Tvlen.lo \
+	H5TS.lo H5VM.lo H5WB.lo H5Z.lo H5Zdeflate.lo H5Zfletcher32.lo \
+	H5Znbit.lo H5Zshuffle.lo H5Zscaleoffset.lo H5Zszip.lo \
+	H5Ztrans.lo $(am__objects_1) $(am__objects_2)
 libhdf5_la_OBJECTS = $(am_libhdf5_la_OBJECTS)
 AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
@@ -223,7 +299,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -246,7 +322,8 @@ am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
 SOURCES = $(libhdf5_la_SOURCES) H5detect.c H5make_libsettings.c
-DIST_SOURCES = $(libhdf5_la_SOURCES) H5detect.c H5make_libsettings.c
+DIST_SOURCES = $(am__libhdf5_la_SOURCES_DIST) H5detect.c \
+	H5make_libsettings.c
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -447,6 +524,11 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/H5config.h.in $(srcdir)/Makefile.in \
+	$(srcdir)/libhdf5.settings.in $(top_srcdir)/bin/depcomp \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am \
+	$(top_srcdir)/config/lt_vers.am COPYING
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -463,7 +545,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -508,14 +589,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -525,13 +614,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -573,9 +661,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -718,27 +817,9 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2
 # See libtool versioning documentation online.
 # After making changes, run bin/reconfigure to update other configure related
 # files like Makefile.in.
-LT_VERS_INTERFACE = 11
-LT_VERS_REVISION = 0
-LT_VERS_AGE = 1
-LT_CXX_VERS_INTERFACE = 11
-LT_CXX_VERS_REVISION = 0
-LT_CXX_VERS_AGE = 0
-LT_F_VERS_INTERFACE = 10
-LT_F_VERS_REVISION = 2
-LT_F_VERS_AGE = 0
-LT_HL_VERS_INTERFACE = 10
-LT_HL_VERS_REVISION = 2
-LT_HL_VERS_AGE = 0
-LT_HL_CXX_VERS_INTERFACE = 11
-LT_HL_CXX_VERS_REVISION = 0
-LT_HL_CXX_VERS_AGE = 0
-LT_HL_F_VERS_INTERFACE = 10
-LT_HL_F_VERS_REVISION = 2
-LT_HL_F_VERS_AGE = 0
-LT_TOOLS_VERS_INTERFACE = 10
-LT_TOOLS_VERS_REVISION = 2
-LT_TOOLS_VERS_AGE = 0
+LT_VERS_INTERFACE = 100
+LT_VERS_REVISION = 900
+LT_VERS_AGE = 0
 
 # Our main target, the HDF5 library
 lib_LTLIBRARIES = libhdf5.la
@@ -752,69 +833,56 @@ MOSTLYCLEANFILES = H5Tinit.c H5lib_settings.c
 DISTCLEANFILES = H5pubconf.h
 
 # library sources
-libhdf5_la_SOURCES = H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \
-        H5A.c H5Abtree2.c H5Adense.c H5Adeprec.c H5Aint.c H5Atest.c \
-        H5AC.c H5B.c H5Bcache.c H5Bdbg.c \
-        H5B2.c H5B2cache.c H5B2dbg.c H5B2hdr.c H5B2int.c H5B2stat.c H5B2test.c \
-        H5C.c H5CS.c \
-        H5D.c H5Dbtree.c H5Dchunk.c H5Dcompact.c H5Dcontig.c H5Ddbg.c \
-        H5Ddeprec.c H5Defl.c H5Dfill.c H5Dint.c \
-        H5Dio.c H5Dlayout.c \
-        H5Dmpio.c H5Doh.c H5Dscatgath.c H5Dselect.c H5Dtest.c \
-        H5E.c H5Edeprec.c H5Eint.c \
-        H5F.c H5Fint.c H5Faccum.c H5Fcwfs.c \
-        H5Fdbg.c H5Fefc.c H5Ffake.c H5Fio.c \
-        H5Fmount.c H5Fmpi.c H5Fquery.c \
-        H5Fsfile.c H5Fsuper.c H5Fsuper_cache.c H5Ftest.c \
-        H5FD.c H5FDcore.c  \
-        H5FDdirect.c H5FDfamily.c H5FDint.c H5FDlog.c H5FDmpi.c H5FDmpio.c \
-        H5FDmulti.c H5FDsec2.c H5FDspace.c H5FDstdio.c \
-        H5FL.c H5FO.c H5FS.c H5FScache.c H5FSdbg.c H5FSsection.c H5FSstat.c H5FStest.c \
-        H5G.c H5Gbtree2.c H5Gcache.c \
-        H5Gcompact.c H5Gdense.c H5Gdeprec.c H5Gent.c \
-        H5Gint.c H5Glink.c \
-        H5Gloc.c H5Gname.c H5Gnode.c H5Gobj.c H5Goh.c H5Groot.c H5Gstab.c H5Gtest.c \
-        H5Gtraverse.c \
-        H5HF.c H5HFbtree2.c H5HFcache.c H5HFdbg.c H5HFdblock.c H5HFdtable.c \
-        H5HFhdr.c H5HFhuge.c H5HFiblock.c H5HFiter.c H5HFman.c H5HFsection.c \
-        H5HFspace.c H5HFstat.c H5HFtest.c H5HFtiny.c \
-        H5HG.c H5HGcache.c H5HGdbg.c H5HGquery.c \
-        H5HL.c H5HLcache.c H5HLdbg.c H5HLint.c \
-        H5HP.c H5I.c H5Itest.c H5L.c H5Lexternal.c H5lib_settings.c \
-        H5MF.c H5MFaggr.c H5MFdbg.c H5MFsection.c \
-        H5MM.c H5MP.c H5MPtest.c \
-        H5O.c H5Oainfo.c H5Oalloc.c H5Oattr.c \
-        H5Oattribute.c H5Obogus.c H5Obtreek.c H5Ocache.c H5Ochunk.c \
-        H5Ocont.c H5Ocopy.c H5Odbg.c H5Odrvinfo.c H5Odtype.c H5Oefl.c \
-        H5Ofill.c H5Oginfo.c \
-        H5Olayout.c \
-        H5Olinfo.c H5Olink.c H5Omessage.c H5Omtime.c \
-        H5Oname.c H5Onull.c H5Opline.c H5Orefcount.c \
-        H5Osdspace.c H5Oshared.c H5Ostab.c \
-        H5Oshmesg.c H5Otest.c H5Ounknown.c \
-        H5P.c H5Pacpl.c H5Pdapl.c H5Pdcpl.c \
-        H5Pdeprec.c H5Pdxpl.c H5Pfapl.c H5Pfcpl.c H5Pfmpl.c \
-        H5Pgcpl.c H5Pint.c \
-        H5Plapl.c H5Plcpl.c H5Pocpl.c H5Pocpypl.c H5Pstrcpl.c H5Ptest.c \
-        H5PL.c \
-        H5R.c H5Rdeprec.c \
-        H5RC.c \
-        H5RS.c \
-        H5S.c H5Sall.c H5Sdbg.c H5Shyper.c H5Smpio.c H5Snone.c H5Spoint.c \
-        H5Sselect.c H5Stest.c \
-        H5SL.c \
-        H5SM.c H5SMbtree2.c H5SMcache.c H5SMmessage.c H5SMtest.c \
-        H5ST.c \
-        H5T.c H5Tarray.c H5Tbit.c H5Tcommit.c H5Tcompound.c H5Tconv.c \
-        H5Tcset.c H5Tdbg.c H5Tdeprec.c H5Tenum.c H5Tfields.c \
-        H5Tfixed.c \
-        H5Tfloat.c H5Tinit.c H5Tnative.c H5Toffset.c H5Toh.c \
-        H5Topaque.c \
-        H5Torder.c \
-        H5Tpad.c H5Tprecis.c H5Tstrpad.c H5Tvisit.c H5Tvlen.c H5TS.c H5VM.c H5WB.c H5Z.c  \
-        H5Zdeflate.c H5Zfletcher32.c H5Znbit.c H5Zshuffle.c H5Zszip.c  \
-        H5Zscaleoffset.c H5Ztrans.c
-
+libhdf5_la_SOURCES = H5.c H5checksum.c H5dbg.c H5system.c H5timer.c \
+	H5trace.c H5A.c H5Abtree2.c H5Adense.c H5Adeprec.c H5Aint.c \
+	H5Atest.c H5AC.c H5AClog.c H5B.c H5Bcache.c H5Bdbg.c H5B2.c \
+	H5B2cache.c H5B2dbg.c H5B2hdr.c H5B2int.c H5B2stat.c \
+	H5B2test.c H5C.c H5CS.c H5D.c H5Dbtree.c H5Dbtree2.c \
+	H5Dchunk.c H5Dcompact.c H5Dcontig.c H5Ddbg.c H5Ddeprec.c \
+	H5Dearray.c H5Defl.c H5Dfarray.c H5Dsingle.c H5Dfill.c \
+	H5Dint.c H5Dio.c H5Dlayout.c H5Dnone.c H5Doh.c H5Dscatgath.c \
+	H5Dselect.c H5Dtest.c H5Dvirtual.c H5E.c H5Edeprec.c H5Eint.c \
+	H5EA.c H5EAcache.c H5EAdbg.c H5EAdblkpage.c H5EAdblock.c \
+	H5EAhdr.c H5EAiblock.c H5EAint.c H5EAsblock.c H5EAstat.c \
+	H5EAtest.c H5F.c H5Fint.c H5Faccum.c H5Fcwfs.c H5Fdbg.c \
+	H5Fdeprec.c H5Fefc.c H5Ffake.c H5Fio.c H5Fmount.c H5Fquery.c \
+	H5Fsfile.c H5Fsuper.c H5Fsuper_cache.c H5Ftest.c H5FA.c \
+	H5FAcache.c H5FAdbg.c H5FAdblock.c H5FAdblkpage.c H5FAhdr.c \
+	H5FAint.c H5FAstat.c H5FAtest.c H5FD.c H5FDcore.c H5FDfamily.c \
+	H5FDint.c H5FDlog.c H5FDmulti.c H5FDsec2.c H5FDspace.c \
+	H5FDstdio.c H5FDtest.c H5FL.c H5FO.c H5FS.c H5FScache.c \
+	H5FSdbg.c H5FSint.c H5FSsection.c H5FSstat.c H5FStest.c H5G.c \
+	H5Gbtree2.c H5Gcache.c H5Gcompact.c H5Gdense.c H5Gdeprec.c \
+	H5Gent.c H5Gint.c H5Glink.c H5Gloc.c H5Gname.c H5Gnode.c \
+	H5Gobj.c H5Goh.c H5Groot.c H5Gstab.c H5Gtest.c H5Gtraverse.c \
+	H5HF.c H5HFbtree2.c H5HFcache.c H5HFdbg.c H5HFdblock.c \
+	H5HFdtable.c H5HFhdr.c H5HFhuge.c H5HFiblock.c H5HFint.c \
+	H5HFiter.c H5HFman.c H5HFsection.c H5HFspace.c H5HFstat.c \
+	H5HFtest.c H5HFtiny.c H5HG.c H5HGcache.c H5HGdbg.c H5HGquery.c \
+	H5HL.c H5HLcache.c H5HLdbg.c H5HLint.c H5HLprfx.c H5HLdblk.c \
+	H5HP.c H5I.c H5Itest.c H5L.c H5Lexternal.c H5lib_settings.c \
+	H5MF.c H5MFaggr.c H5MFdbg.c H5MFsection.c H5MM.c H5MP.c \
+	H5MPtest.c H5O.c H5Oainfo.c H5Oalloc.c H5Oattr.c \
+	H5Oattribute.c H5Obogus.c H5Obtreek.c H5Ocache.c H5Ochunk.c \
+	H5Ocont.c H5Ocopy.c H5Odbg.c H5Odrvinfo.c H5Odtype.c H5Oefl.c \
+	H5Ofill.c H5Oflush.c H5Ofsinfo.c H5Oginfo.c H5Olayout.c \
+	H5Olinfo.c H5Olink.c H5Omessage.c H5Omtime.c H5Oname.c \
+	H5Onull.c H5Opline.c H5Oproxy.c H5Orefcount.c H5Osdspace.c \
+	H5Oshared.c H5Oshmesg.c H5Ostab.c H5Otest.c H5Ounknown.c H5P.c \
+	H5Pacpl.c H5Pdapl.c H5Pdcpl.c H5Pdeprec.c H5Pdxpl.c \
+	H5Pencdec.c H5Pfapl.c H5Pfcpl.c H5Pfmpl.c H5Pgcpl.c H5Pint.c \
+	H5Plapl.c H5Plcpl.c H5Pocpl.c H5Pocpypl.c H5Pstrcpl.c \
+	H5Ptest.c H5PL.c H5R.c H5Rdeprec.c H5UC.c H5RS.c H5S.c \
+	H5Sall.c H5Sdbg.c H5Shyper.c H5Snone.c H5Spoint.c H5Sselect.c \
+	H5Stest.c H5SL.c H5SM.c H5SMbtree2.c H5SMcache.c H5SMmessage.c \
+	H5SMtest.c H5ST.c H5T.c H5Tarray.c H5Tbit.c H5Tcommit.c \
+	H5Tcompound.c H5Tconv.c H5Tcset.c H5Tdbg.c H5Tdeprec.c \
+	H5Tenum.c H5Tfields.c H5Tfixed.c H5Tfloat.c H5Tinit.c \
+	H5Tnative.c H5Toffset.c H5Toh.c H5Topaque.c H5Torder.c \
+	H5Tpad.c H5Tprecis.c H5Tstrpad.c H5Tvisit.c H5Tvlen.c H5TS.c \
+	H5VM.c H5WB.c H5Z.c H5Zdeflate.c H5Zfletcher32.c H5Znbit.c \
+	H5Zshuffle.c H5Zscaleoffset.c H5Zszip.c H5Ztrans.c \
+	$(am__append_1) $(am__append_2)
 
 # Public headers
 include_HEADERS = hdf5.h H5api_adpt.h H5overflow.h H5pubconf.h H5public.h H5version.h \
@@ -822,7 +890,7 @@ include_HEADERS = hdf5.h H5api_adpt.h H5overflow.h H5pubconf.h H5public.h H5vers
         H5Cpublic.h H5Dpublic.h \
         H5Epubgen.h H5Epublic.h H5Fpublic.h \
         H5FDpublic.h H5FDcore.h H5FDdirect.h \
-	H5FDfamily.h H5FDlog.h H5FDmpi.h H5FDmpio.h \
+        H5FDfamily.h H5FDlog.h H5FDmpi.h H5FDmpio.h \
         H5FDmulti.h H5FDsec2.h  H5FDstdio.h \
         H5Gpublic.h  H5Ipublic.h H5Lpublic.h \
         H5MMpublic.h H5Opublic.h H5Ppublic.h \
@@ -871,7 +939,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign src/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -880,7 +947,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/lt_vers.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/lt_vers.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -972,6 +1039,8 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5A.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5AC.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5AClog.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5ACmpio.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Abtree2.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Adense.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Adeprec.Plo at am__quote@
@@ -989,27 +1058,54 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Bdbg.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5C.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5CS.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Cmpio.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5D.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Dbtree.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Dbtree2.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Dchunk.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Dcompact.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Dcontig.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Ddbg.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Ddeprec.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Dearray.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Defl.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Dfarray.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Dfill.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Dint.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Dio.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Dlayout.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Dmpio.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Dnone.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Doh.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Dscatgath.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Dselect.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Dsingle.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Dtest.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Dvirtual.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5E.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5EA.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5EAcache.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5EAdbg.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5EAdblkpage.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5EAdblock.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5EAhdr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5EAiblock.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5EAint.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5EAsblock.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5EAstat.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5EAtest.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Edeprec.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Eint.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5F.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FA.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FAcache.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FAdbg.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FAdblkpage.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FAdblock.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FAhdr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FAint.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FAstat.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FAtest.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FD.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FDcore.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FDdirect.Plo at am__quote@
@@ -1022,17 +1118,20 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FDsec2.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FDspace.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FDstdio.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FDtest.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FL.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FO.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FS.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FScache.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FSdbg.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FSint.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FSsection.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FSstat.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5FStest.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Faccum.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Fcwfs.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Fdbg.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Fdeprec.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Fefc.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Ffake.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Fint.Plo at am__quote@
@@ -1071,6 +1170,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5HFhdr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5HFhuge.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5HFiblock.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5HFint.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5HFiter.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5HFman.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5HFsection.Plo at am__quote@
@@ -1085,7 +1185,9 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5HL.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5HLcache.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5HLdbg.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5HLdblk.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5HLint.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5HLprfx.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5HP.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5I.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Itest.Plo at am__quote@
@@ -1114,6 +1216,8 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Odtype.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Oefl.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Ofill.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Oflush.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Ofsinfo.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Oginfo.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Olayout.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Olinfo.Plo at am__quote@
@@ -1123,6 +1227,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Oname.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Onull.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Opline.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Oproxy.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Orefcount.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Osdspace.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Oshared.Plo at am__quote@
@@ -1137,6 +1242,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Pdcpl.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Pdeprec.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Pdxpl.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Pencdec.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Pfapl.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Pfcpl.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Pfmpl.Plo at am__quote@
@@ -1149,7 +1255,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Pstrcpl.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Ptest.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5R.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5RC.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5RS.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Rdeprec.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5S.Plo at am__quote@
@@ -1193,6 +1298,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Tstrpad.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Tvisit.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Tvlen.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5UC.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5VM.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5WB.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/H5Z.Plo at am__quote@
@@ -1363,7 +1469,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1644,6 +1750,8 @@ uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES \
 	uninstall-includeHEADERS uninstall-libLTLIBRARIES \
 	uninstall-settingsDATA
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/src/hdf5.h b/src/hdf5.h
index fb41007..7a10507 100644
--- a/src/hdf5.h
+++ b/src/hdf5.h
@@ -42,6 +42,7 @@
 
 /* Predefined file drivers */
 #include "H5FDcore.h"		/* Files stored entirely in memory	*/
+#include "H5FDdirect.h"     	/* Linux direct I/O			*/
 #include "H5FDfamily.h"		/* File families 			*/
 #include "H5FDlog.h"        	/* sec2 driver with I/O logging (for debugging) */
 #include "H5FDmpi.h"            /* MPI-based file drivers		*/
@@ -51,6 +52,5 @@
 #ifdef H5_HAVE_WINDOWS
 #include "H5FDwindows.h"        /* Windows buffered I/O     */
 #endif
-#include "H5FDdirect.h"     	/* Linux direct I/O			*/
 
 #endif
diff --git a/src/libhdf5.settings.in b/src/libhdf5.settings.in
index 01e0403..2355543 100644
--- a/src/libhdf5.settings.in
+++ b/src/libhdf5.settings.in
@@ -25,7 +25,7 @@ Compiling Options:
                     AM_CPPFLAGS: @AM_CPPFLAGS@
                Shared C Library: @enable_shared@
                Static C Library: @enable_static@
-  Statically Linked Executables: @STATIC_EXEC@
+  Statically Linked Executables: @LT_STATIC_EXEC@
                         LDFLAGS: @LDFLAGS@
                      H5_LDFLAGS: @H5_LDFLAGS@
                      AM_LDFLAGS: @AM_LDFLAGS@
@@ -39,7 +39,6 @@ Languages:
 ----------
                         Fortran: @HDF_FORTRAN@
 @BUILD_FORTRAN_CONDITIONAL_TRUE@               Fortran Compiler: @FC_VERSION@
- at BUILD_FORTRAN_CONDITIONAL_TRUE@          Fortran 2003 Compiler: @HAVE_FORTRAN_2003@
 @BUILD_FORTRAN_CONDITIONAL_TRUE@                  Fortran Flags: @FCFLAGS@
 @BUILD_FORTRAN_CONDITIONAL_TRUE@               H5 Fortran Flags: @H5_FCFLAGS@
 @BUILD_FORTRAN_CONDITIONAL_TRUE@               AM Fortran Flags: @AM_FCFLAGS@
diff --git a/test/AtomicWriterReader.txt b/test/AtomicWriterReader.txt
new file mode 100644
index 0000000..dc0a3bd
--- /dev/null
+++ b/test/AtomicWriterReader.txt
@@ -0,0 +1,48 @@
+Atomic Tests Instructions
+=========================
+
+Purpose:
+--------
+This documents how to build and run the Atomic Writer and Reader tests.
+The atomic test is to verify if atomic read-write operation on a system works.
+The two programs are atomic_writer.c and atomic_reader.c.
+atomic_writer.c: is the "write" part of the test; and
+atomic_reader.c: is the "read" part of the test.
+
+Building the Tests
+------------------
+The two test parts are automically built during configure and make process.
+But to build them individually, you can do in test/ directory:
+$ gcc atomic_writer
+$ gcc atomic_reader
+
+Running the Tests
+-----------------
+$ atomic_writer -n <number of integers to write> -i <number of iterations for writer>
+$ atomic_reader -n <number of integers to read> -i <number of iterations for reader>
+
+Note**
+(1) "atomic_data" is the data file used by both the writer/reader in the
+    current directory.
+(2) The value for -n should be the same for both the writer and the reader.
+(3) The values for options n and i should be positive integers.
+(4) For this version, the user has to provide both options -n and -i to run
+    the writer and the reader.
+(5) If the user wants to run the writer for a long time, just provides a
+    large number for -i.
+
+Examples
+--------
+$ ./atomic_writer -n 10000 -i 5
+  Try to atomic write 10000 integers patterns 10000 time, and iterate the whole
+  write process 5 times.
+
+$ ./atomic_reader -n 10000 -i 2
+  Try to atomic read 10000 integers patterns 10000 times, and iterate only once.
+  A summary is posted at the end. If all atomic reads are correct, it will not
+  show any read beyond "0 re-tries", that is all reads have succeeded in the
+  first read attempt.
+
+Remark:
+You usually want the writer to iterate more times than the reader so that
+the writing will not finish before reading is done.
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 43037fc..3a69371 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -51,7 +51,7 @@ if (BUILD_SHARED_LIBS)
     target_link_libraries (${HDF5_TEST_LIBSH_TARGET} "wsock32.lib")
   endif (MINGW)
   target_link_libraries (${HDF5_TEST_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
-  H5_SET_LIB_OPTIONS (${HDF5_TEST_LIBSH_TARGET} ${HDF5_TEST_LIB_NAME} SHARED ${HDF5_PACKAGE_SOVERSION})
+  H5_SET_LIB_OPTIONS (${HDF5_TEST_LIBSH_TARGET} ${HDF5_TEST_LIB_NAME} SHARED)
   set_target_properties (${HDF5_TEST_LIBSH_TARGET} PROPERTIES
       FOLDER libraries/test
       COMPILE_DEFINITIONS "H5_BUILT_AS_DYNAMIC_LIB"
@@ -96,7 +96,9 @@ endif (BUILD_SHARED_LIBS)
     target_link_libraries (${HDF5_TEST_PLUGIN_LIB_TARGET} ${HDF5_TEST_LIB_TARGET})
     H5_SET_LIB_OPTIONS (
         ${HDF5_TEST_PLUGIN_LIB_TARGET} ${HDF5_TEST_PLUGIN_LIB_NAME}
-        SHARED ${HDF5_PACKAGE_SOVERSION}
+        SHARED
+        HDF5_TEST_PLUGIN_LIB_NAME_RELEASE
+        HDF5_TEST_PLUGIN_LIB_NAME_DEBUG
     )
     set_target_properties (${HDF5_TEST_PLUGIN_LIB_TARGET} PROPERTIES FOLDER libraries/TEST_PLUGIN)
 
@@ -125,7 +127,9 @@ endif (BUILD_SHARED_LIBS)
     target_link_libraries (${HDF5_TEST_PLUGIN_LIB_TARGET} ${HDF5_TEST_LIB_TARGET})
     H5_SET_LIB_OPTIONS (
         ${HDF5_TEST_PLUGIN_LIB_TARGET} ${HDF5_TEST_PLUGIN_LIB_NAME}
-        SHARED ${HDF5_PACKAGE_SOVERSION}
+        SHARED
+        HDF5_TEST_PLUGIN_LIB_NAME_RELEASE
+        HDF5_TEST_PLUGIN_LIB_NAME_DEBUG
     )
     set_target_properties (${HDF5_TEST_PLUGIN_LIB_TARGET} PROPERTIES FOLDER libraries/TEST_PLUGIN)
 
@@ -205,16 +209,16 @@ set (H5_TESTS
     ohdr
     stab
     gheap
-    #cache
-    #cache_api
+    cache_logging
+    cork
     pool
-    #hyperslab
     istore
     bittests
     dt_arith
     dtypes
     dsets
     cmpd_dset
+    chunk_info
     filter_fail
     extend
     external
@@ -231,7 +235,7 @@ set (H5_TESTS
     app_ref
     enum
     set_extent
-    #ttsafe
+    space_overflow
     getname
     vfd
     ntypes
@@ -241,15 +245,18 @@ set (H5_TESTS
     cross_read
     freespace
     mf
+    vds
+    farray
+    earray
     btree2
     fheap
-    #error_test
-    #err_compat
     tcheck_version
     testmeta
-    #links_env
     file_image
+    enc_dec_plist
+    enc_dec_plist_cross_platform
     unregister
+    swmr
 )
 
 foreach (test ${H5_TESTS})
@@ -290,6 +297,20 @@ if (BUILD_SHARED_LIBS)
   set_target_properties (cache_api-shared PROPERTIES FOLDER test)
 endif (BUILD_SHARED_LIBS)
 
+#-- Adding test for cache_tagging
+add_executable (cache_tagging ${HDF5_TEST_SOURCE_DIR}/cache_tagging.c ${HDF5_TEST_SOURCE_DIR}/cache_common.c)
+TARGET_NAMING (cache_tagging STATIC)
+TARGET_C_PROPERTIES (cache_tagging STATIC " " " ")
+target_link_libraries (cache_tagging ${HDF5_LIB_TARGET} ${HDF5_TEST_LIB_TARGET})
+set_target_properties (cache_tagging PROPERTIES FOLDER test)
+if (BUILD_SHARED_LIBS)
+  add_executable (cache_tagging-shared ${HDF5_TEST_SOURCE_DIR}/cache_tagging.c ${HDF5_TEST_SOURCE_DIR}/cache_common.c)
+  TARGET_NAMING (cache_tagging-shared SHARED)
+  TARGET_C_PROPERTIES (cache_tagging-shared SHARED " " " ")
+  target_link_libraries (cache_tagging-shared ${HDF5_TEST_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
+  set_target_properties (cache_tagging-shared PROPERTIES FOLDER test)
+endif (BUILD_SHARED_LIBS)
+
 #-- Adding test for hyperslab
 add_executable (hyperslab ${HDF5_TEST_SOURCE_DIR}/hyperslab.c)
 TARGET_NAMING (hyperslab STATIC)
@@ -386,6 +407,21 @@ if (BUILD_SHARED_LIBS)
   set_target_properties (links_env-shared PROPERTIES FOLDER test)
 endif (BUILD_SHARED_LIBS)
 
+#-- Adding test for accum_swmr_reader
+#   This has to be copied to the test directory for execve() to find it
+#   and it can't be renamed (i.e., no <foo>-shared).
+add_executable (accum_swmr_reader ${HDF5_TEST_SOURCE_DIR}/accum_swmr_reader.c)
+TARGET_NAMING (accum_swmr_reader STATIC)
+TARGET_C_PROPERTIES (accum_swmr_reader STATIC " " " ")
+target_link_libraries (accum_swmr_reader ${HDF5_LIB_TARGET} ${HDF5_TEST_LIB_TARGET})
+set_target_properties (accum_swmr_reader PROPERTIES FOLDER test)
+
+#-- Set accum dependencies
+set_target_properties (accum PROPERTIES DEPENDS accum_swmr_reader)
+if (BUILD_SHARED_LIBS)
+  set_target_properties (accum-shared PROPERTIES DEPENDS accum_swmr_reader-shared)
+endif (BUILD_SHARED_LIBS)
+
 #-- Adding test for libinfo
 set (GREP_RUNNER ${PROJECT_BINARY_DIR}/GrepRunner.cmake)
 file (WRITE ${GREP_RUNNER}
diff --git a/test/CMakeTests.cmake b/test/CMakeTests.cmake
index 8126042..fc8fdc3 100644
--- a/test/CMakeTests.cmake
+++ b/test/CMakeTests.cmake
@@ -20,6 +20,7 @@ if (HDF5_TEST_VFD)
       sec2
       stdio
       core
+      core_paged
       split
       multi
       family
@@ -42,6 +43,21 @@ set (HDF5_TEST_FILES
   tnullspace.h5
 )
 
+add_custom_command (
+    TARGET     accum_swmr_reader
+    POST_BUILD
+    COMMAND    ${CMAKE_COMMAND}
+    ARGS       -E copy_if_different "$<TARGET_FILE:accum_swmr_reader>" "${PROJECT_BINARY_DIR}/H5TEST/accum_swmr_reader"
+)
+if (BUILD_SHARED_LIBS)
+  add_custom_command (
+      TARGET     accum_swmr_reader
+      POST_BUILD
+      COMMAND    ${CMAKE_COMMAND}
+      ARGS       -E copy_if_different "$<TARGET_FILE:accum_swmr_reader>" "${PROJECT_BINARY_DIR}/H5TEST-shared/accum_swmr_reader"
+  )
+endif (BUILD_SHARED_LIBS)
+
 foreach (h5_tfile ${HDF5_TEST_FILES})
   set (dest "${PROJECT_BINARY_DIR}/H5TEST/${h5_tfile}")
   add_custom_command (
@@ -136,6 +152,91 @@ if (HDF5_TEST_VFD)
 endif (HDF5_TEST_VFD)
 
 # --------------------------------------------------------------------
+# Copy test files from test/testfiles/plist_files dir to test dir
+# --------------------------------------------------------------------
+set (HDF5_REFERENCE_PLIST_FILES
+    acpl_32be
+    acpl_32le
+    acpl_64be
+    acpl_64le
+    dapl_32be
+    dapl_32le
+    dapl_64be
+    dapl_64le
+    dcpl_32be
+    dcpl_32le
+    dcpl_64be
+    dcpl_64le
+    dxpl_32be
+    dxpl_32le
+    dxpl_64be
+    dxpl_64le
+    fapl_32be
+    fapl_32le
+    fapl_64be
+    fapl_64le
+    fcpl_32be
+    fcpl_32le
+    fcpl_64be
+    fcpl_64le
+    gcpl_32be
+    gcpl_32le
+    gcpl_64be
+    gcpl_64le
+    lapl_32be
+    lapl_32le
+    lapl_64be
+    lapl_64le
+    lcpl_32be
+    lcpl_32le
+    lcpl_64be
+    lcpl_64le
+    ocpl_32be
+    ocpl_32le
+    ocpl_64be
+    ocpl_64le
+    ocpypl_32be
+    ocpypl_32le
+    ocpypl_64be
+    ocpypl_64le
+    strcpl_32be
+    strcpl_32le
+    strcpl_64be
+    strcpl_64le
+)
+
+foreach (plistfile ${HDF5_REFERENCE_PLIST_FILES})
+  set (dest "${PROJECT_BINARY_DIR}/H5TEST/testfiles/plist_files")
+  add_custom_command (
+      TARGET     ${HDF5_TEST_LIB_TARGET}
+      POST_BUILD
+      COMMAND    ${CMAKE_COMMAND}
+      ARGS       -E copy_if_different ${HDF5_TEST_SOURCE_DIR}/testfiles/plist_files/${plistfile} ${dest}/${plistfile}
+  )
+  add_custom_command (
+      TARGET     ${HDF5_TEST_LIB_TARGET}
+      POST_BUILD
+      COMMAND    ${CMAKE_COMMAND}
+      ARGS       -E copy_if_different ${HDF5_TEST_SOURCE_DIR}/testfiles/plist_files/def_${plistfile} ${dest}/def_${plistfile}
+  )
+  if (BUILD_SHARED_LIBS)
+    set (dest "${PROJECT_BINARY_DIR}/H5TEST-shared/testfiles/plist_files")
+    add_custom_command (
+        TARGET     ${HDF5_TEST_LIBSH_TARGET}
+        POST_BUILD
+        COMMAND    ${CMAKE_COMMAND}
+        ARGS       -E copy_if_different ${HDF5_TEST_SOURCE_DIR}/testfiles/plist_files/${plistfile} ${dest}/${plistfile}
+    )
+    add_custom_command (
+        TARGET     ${HDF5_TEST_LIBSH_TARGET}
+        POST_BUILD
+        COMMAND    ${CMAKE_COMMAND}
+        ARGS       -E copy_if_different ${HDF5_TEST_SOURCE_DIR}/testfiles/plist_files/def_${plistfile} ${dest}/def_${plistfile}
+    )
+  endif (BUILD_SHARED_LIBS)
+endforeach (plistfile ${HDF5_REFERENCE_PLIST_FILES})
+
+# --------------------------------------------------------------------
 #-- Copy all the HDF5 files from the test directory into the source directory
 # --------------------------------------------------------------------
 set (HDF5_REFERENCE_TEST_FILES
@@ -143,15 +244,18 @@ set (HDF5_REFERENCE_TEST_FILES
     be_data.h5
     be_extlink1.h5
     be_extlink2.h5
+    btree_idx_1_6.h5
+    btree_idx_1_8.h5
     corrupt_stab_msg.h5
     deflate.h5
     family_v16_00000.h5
     family_v16_00001.h5
     family_v16_00002.h5
     family_v16_00003.h5
+    filespace_1_6.h5
+    filespace_1_8.h5
     file_image_core_test.h5
     fill_old.h5
-    fixed_idx.h5
     filter_error.h5
     group_old.h5
     le_data.h5
@@ -377,6 +481,7 @@ add_test (
         tstint2.h5
         unregister_filter_1.h5
         unregister_filter_2.h5
+        vds_1.h5
     WORKING_DIRECTORY
         ${HDF5_TEST_BINARY_DIR}/H5TEST
 )
@@ -502,34 +607,53 @@ endif (BUILD_SHARED_LIBS)
 ##############################################################################
 
 #-- Adding test for cache
+if (NOT CYGWIN)
+  add_test (
+      NAME H5TEST-clear-cache-objects
+      COMMAND    ${CMAKE_COMMAND}
+          -E remove
+          cache_test.h5
+      WORKING_DIRECTORY
+          ${HDF5_TEST_BINARY_DIR}/H5TEST
+  )
+  add_test (NAME H5TEST-cache COMMAND $<TARGET_FILE:cache>)
+  set_tests_properties (H5TEST-cache PROPERTIES
+      DEPENDS H5TEST-clear-cache-objects
+      ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST;HDF5TestExpress=${HDF_TEST_EXPRESS}"
+      WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST
+  )
+  set_tests_properties (H5TEST-cache PROPERTIES TIMEOUT 2400)
+endif (NOT CYGWIN)
+
+#-- Adding test for cache_api
 add_test (
-    NAME H5TEST-clear-cache-objects
+    NAME H5TEST-clear-cache_api-objects
     COMMAND    ${CMAKE_COMMAND}
         -E remove
-        cache_test.h5
+        cache_api_test.h5
     WORKING_DIRECTORY
         ${HDF5_TEST_BINARY_DIR}/H5TEST
 )
-add_test (NAME H5TEST-cache COMMAND $<TARGET_FILE:cache>)
-set_tests_properties (H5TEST-cache PROPERTIES
-    DEPENDS H5TEST-clear-cache-objects
-    ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST;HDF5TestExpress=${HDF_TEST_EXPRESS}"
+add_test (NAME H5TEST-cache_api COMMAND $<TARGET_FILE:cache_api>)
+set_tests_properties (H5TEST-cache_api PROPERTIES
+    DEPENDS H5TEST-clear-cache_api-objects
+    ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST"
     WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST
 )
-set_tests_properties (H5TEST-cache PROPERTIES TIMEOUT 2400)
 
-#-- Adding test for cache_api
+#-- Adding test for cache_tagging
 add_test (
-    NAME H5TEST-clear-cache_api-objects
+    NAME H5TEST-clear-cache_tagging-objects
     COMMAND    ${CMAKE_COMMAND}
         -E remove
-        cache_api_test.h5
+        tagging_test.h5
+        tagging_ext_test.h5
     WORKING_DIRECTORY
         ${HDF5_TEST_BINARY_DIR}/H5TEST
 )
-add_test (NAME H5TEST-cache_api COMMAND $<TARGET_FILE:cache_api>)
-set_tests_properties (H5TEST-cache_api PROPERTIES
-    DEPENDS H5TEST-clear-cache_api-objects
+add_test (NAME H5TEST-cache_tagging COMMAND $<TARGET_FILE:cache_tagging>)
+set_tests_properties (H5TEST-cache_tagging PROPERTIES
+    DEPENDS H5TEST-clear-cache_tagging-objects
     ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST"
     WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST
 )
@@ -681,6 +805,23 @@ if (BUILD_SHARED_LIBS)
       WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST-shared
   )
 
+  #-- Adding test for cache_tagging
+  add_test (
+      NAME H5TEST-shared-clear-cache_tagging-objects
+      COMMAND    ${CMAKE_COMMAND}
+          -E remove
+          tagging_test.h5
+          tagging_ext_test.h5
+      WORKING_DIRECTORY
+          ${HDF5_TEST_BINARY_DIR}/H5TEST-shared
+  )
+  add_test (NAME H5TEST-shared-cache_tagging COMMAND $<TARGET_FILE:cache_tagging-shared>)
+  set_tests_properties (H5TEST-shared-cache_tagging PROPERTIES
+      DEPENDS H5TEST-shared-clear-cache_tagging-objects
+      ENVIRONMENT "srcdir=${HDF5_TEST_BINARY_DIR}/H5TEST-shared"
+      WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}/H5TEST-shared
+  )
+
   #-- Adding test for ttsafe
   add_test (
       NAME H5TEST-shared-clear-ttsafe-objects
@@ -818,13 +959,14 @@ if (HDF5_TEST_VFD)
 
   set (H5_VFD_TESTS
       testhdf5
-      accum
+#      accum
       lheap
       ohdr
       stab
       gheap
-      cache
+#      cache
       cache_api
+      cache_tagging
       pool
       hyperslab
       istore
@@ -859,6 +1001,8 @@ if (HDF5_TEST_VFD)
       cross_read
       freespace
       mf
+      farray
+      earray
       btree2
       #fheap
       error_test
@@ -869,7 +1013,7 @@ if (HDF5_TEST_VFD)
       unregister
   )
   if (NOT CYGWIN)
-    set (H5_VFD_TESTS ${H5_VFD_TESTS} big)
+    set (H5_VFD_TESTS ${H5_VFD_TESTS} big cache)
   endif (NOT CYGWIN)
 
   MACRO (CHECK_VFD_TEST vfdtest vfdname resultcode)
@@ -1032,18 +1176,18 @@ if (HDF5_TEST_VFD)
     set_tests_properties (VFD-${vfdname}-flush2 PROPERTIES DEPENDS VFD-${vfdname}-flush1)
     set_tests_properties (VFD-${vfdname}-flush1 PROPERTIES TIMEOUT 10)
     set_tests_properties (VFD-${vfdname}-flush2 PROPERTIES TIMEOUT 10)
-    set_tests_properties (VFD-${vfdname}-objcopy PROPERTIES TIMEOUT 1000)
-    set_tests_properties (VFD-${vfdname}-testhdf5 PROPERTIES TIMEOUT 1200)
-    set_tests_properties (VFD-${vfdname}-gheap PROPERTIES TIMEOUT 1200)
-    set_tests_properties (VFD-${vfdname}-istore PROPERTIES TIMEOUT 1200)
+    set_tests_properties (VFD-${vfdname}-istore PROPERTIES TIMEOUT 1800)
+    if (NOT CYGWIN)
+      set_tests_properties (VFD-${vfdname}-cache PROPERTIES TIMEOUT 1800)
+    endif (NOT CYGWIN)
     if (BUILD_SHARED_LIBS)
       set_tests_properties (VFD-${vfdname}-flush2-shared PROPERTIES DEPENDS VFD-${vfdname}-flush1-shared)
       set_tests_properties (VFD-${vfdname}-flush1-shared PROPERTIES TIMEOUT 10)
       set_tests_properties (VFD-${vfdname}-flush2-shared PROPERTIES TIMEOUT 10)
-      set_tests_properties (VFD-${vfdname}-objcopy-shared PROPERTIES TIMEOUT 1000)
-      set_tests_properties (VFD-${vfdname}-testhdf5-shared PROPERTIES TIMEOUT 1200)
-      set_tests_properties (VFD-${vfdname}-gheap-shared PROPERTIES TIMEOUT 1200)
-      set_tests_properties (VFD-${vfdname}-istore-shared PROPERTIES TIMEOUT 1200)
+      set_tests_properties (VFD-${vfdname}-istore-shared PROPERTIES TIMEOUT 1800)
+      if (NOT CYGWIN)
+        set_tests_properties (VFD-${vfdname}-cache-shared PROPERTIES TIMEOUT 1800)
+      endif (NOT CYGWIN)
     endif (BUILD_SHARED_LIBS)
     if (HDF5_TEST_FHEAP_VFD)
       add_test (
diff --git a/test/Makefile.am b/test/Makefile.am
index 08b8b4f..cef7c75 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -23,9 +23,23 @@ include $(top_srcdir)/config/commence.am
 
 AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_builddir)/src
 
-# Test script for error_test and err_compat
-TEST_SCRIPT = testerror.sh testlibinfo.sh testcheck_version.sh testlinks_env.sh
-SCRIPT_DEPEND = error_test$(EXEEXT) err_compat$(EXEEXT) links_env$(EXEEXT)
+# Test scripts--
+#       testerror.sh: err_compat, error_test
+#       testlibinfo.sh:
+#       testcheck_version.sh: tcheck_version
+#       tetlinks_env.sh: links_env
+#       testflushrefresh.sh: flushrefresh
+#       test_usecases.sh: use_append_chunk, use_append_mchunks, use_disable_mdc_flushes
+#       testswmr.sh: swmr*
+#       testvdsswmr.sh: vds_swmr*
+TEST_SCRIPT = testerror.sh testlibinfo.sh testcheck_version.sh testlinks_env.sh \
+    testswmr.sh testvdsswmr.sh testflushrefresh.sh test_usecases.sh
+SCRIPT_DEPEND = error_test$(EXEEXT) err_compat$(EXEEXT) links_env$(EXEEXT) \
+    flushrefresh$(EXEEXT) use_append_chunk$(EXEEXT) use_append_mchunks$(EXEEXT) use_disable_mdc_flushes$(EXEEXT) \
+    swmr_generator$(EXEEXT) swmr_reader$(EXEEXT) swmr_writer$(EXEEXT) \
+    swmr_remove_reader$(EXEEXT) swmr_remove_writer$(EXEEXT) swmr_addrem_writer$(EXEEXT) \
+    swmr_sparse_reader$(EXEEXT) swmr_sparse_writer$(EXEEXT) swmr_start_write$(EXEEXT) \
+    vds_swmr_gen$(EXEEXT) vds_swmr_reader$(EXEEXT) vds_swmr_writer$(EXEEXT)
 if HAVE_SHARED_CONDITIONAL
   TEST_SCRIPT += test_plugin.sh
   SCRIPT_DEPEND += plugin$(EXEEXT)
@@ -37,24 +51,34 @@ check_SCRIPTS = $(TEST_SCRIPT)
 # executed, generally most specific tests to least specific tests.
 # As an exception, long-running tests should occur earlier in the list.
 # This gives them more time to run when tests are executing in parallel.
-# These tests (fheap, btree2) are under development and are not used by
-# the library yet. Move them to the end so that their failure do not block
-# other current library code tests.
-TEST_PROG=testhdf5 lheap ohdr stab gheap cache cache_api \
+TEST_PROG= testhdf5 cache cache_api cache_tagging lheap ohdr stab gheap \
+           farray earray btree2 fheap \
            pool accum hyperslab istore bittests dt_arith \
            dtypes dsets cmpd_dset filter_fail extend external efc objcopy links unlink \
-           big mtime fillval mount flush1 flush2 app_ref enum \
-           set_extent ttsafe \
+           twriteorder big mtime fillval mount flush1 flush2 app_ref enum \
+           set_extent ttsafe enc_dec_plist enc_dec_plist_cross_platform\
            getname vfd ntypes dangle dtransform reserved cross_read \
-           freespace mf btree2 fheap file_image unregister
+           freespace mf vds file_image unregister cache_logging cork swmr
 
-# List programs to be built when testing here. error_test and err_compat are
-# built at the same time as the other tests, but executed by testerror.sh.
+# List programs to be built when testing here.
+# error_test and err_compat are built at the same time as the other tests, but executed by testerror.sh.
 # tcheck_version is used by testcheck_version.sh.
+# accum_swmr_reader is used by accum.c.
+# atomic_writer and atomic_reader are standalone programs.
+# links_env is used by testlinks_env.sh
+# flushrefresh is used by testflushrefresh.sh.
+# use_append_chunk, use_append_mchunks and use_disable_mdc_flushes are used by test_usecases.sh
+# swmr_* files (besides swmr.c) are used by testswmr.sh.
+# vds_swmr_* files are used by testvdsswmr.sh
 # 'make check' doesn't run them directly, so they are not included in TEST_PROG.
 # Also build testmeta, which is used for timings test.  It builds quickly,
 # and this lets automake keep all its test programs in one place.
-check_PROGRAMS=$(TEST_PROG) error_test err_compat tcheck_version testmeta links_env
+check_PROGRAMS=$(TEST_PROG) error_test err_compat tcheck_version \
+    testmeta accum_swmr_reader atomic_writer atomic_reader \
+    links_env flushrefresh use_append_chunk use_append_mchunks use_disable_mdc_flushes \
+    swmr_generator swmr_start_write swmr_reader swmr_writer swmr_remove_reader \
+    swmr_remove_writer swmr_addrem_writer swmr_sparse_reader swmr_sparse_writer \
+    swmr_check_compat_vfd vds_swmr_gen vds_swmr_reader vds_swmr_writer
 if HAVE_SHARED_CONDITIONAL
   check_PROGRAMS+= plugin
 endif
@@ -66,10 +90,10 @@ endif
 # --enable-build-all at configure time.
 # The gen_old_* files can only be compiled with older versions of the library
 # so do not appear in this list.
-BUILD_ALL_PROGS=gen_bad_ohdr gen_bogus gen_cross gen_deflate gen_filters gen_idx \
-    gen_new_array gen_new_fill gen_new_group gen_new_mtime gen_new_super \
-    gen_noencoder gen_nullspace gen_udlinks space_overflow gen_sizes_lheap \
-    gen_file_image
+BUILD_ALL_PROGS=gen_bad_ohdr gen_bogus gen_cross gen_deflate gen_filters gen_idx gen_new_array \
+    gen_new_fill gen_new_group gen_new_mtime gen_new_super gen_noencoder \
+    gen_nullspace gen_udlinks space_overflow gen_filespace gen_specmetaread \
+    gen_sizes_lheap gen_file_image gen_plist
 
 if BUILD_ALL_CONDITIONAL
   noinst_PROGRAMS=$(BUILD_ALL_PROGS)
@@ -79,7 +103,7 @@ if HAVE_SHARED_CONDITIONAL
   # The libh5test library provides common support code for the tests.
   noinst_LTLIBRARIES=libh5test.la
 
-  # The libdynlib1, libdynlib2, and libdynlib3 library for testing plugin module plugin.c.
+  # The libdynlib1 and libdynlib2 library for testing plugin module plugin.c.
   # Build it as shared library if configure is enabled for shared library.
   lib_LTLIBRARIES=libdynlib1.la libdynlib2.la libdynlib3.la
   libdynlib1_la_SOURCES=dynlib1.c
@@ -94,7 +118,7 @@ else
   noinst_LTLIBRARIES=libh5test.la
 endif
 
-libh5test_la_SOURCES=h5test.c testframe.c cache_common.c
+libh5test_la_SOURCES=h5test.c testframe.c cache_common.c swmr_common.c
 
 # Use libhd5test.la to compile all of the tests
 LDADD=libh5test.la $(LIBHDF5)
@@ -126,9 +150,11 @@ flush2.chkexe_: flush1.chkexe_
 # specifying a file prefix or low-level driver.  Changing the file
 # prefix or low-level driver with environment variables will influence
 # the temporary file name in ways that the makefile is not aware of.
-CHECK_CLEANFILES+=accum.h5 cmpd_dset.h5 compact_dataset.h5 dataset.h5 dset_offset.h5 \
+CHECK_CLEANFILES+=accum.h5 cmpd_dset.h5 compact_dataset.h5 dataset.h5 \
+    dset_offset.h5 chunk_fixed.h5 cache_logging.out \
     max_compact_dataset.h5 simple.h5 set_local.h5 random_chunks.h5 \
-    huge_chunks.h5 chunk_cache.h5 big_chunk.h5 chunk_expand.h5 \
+    huge_chunks.h5 chunk_cache.h5 big_chunk.h5 chunk_fast.h5 \
+    chunk_expand.h5 layout_extend.h5 swmr_fail.h5 partial_chunks.h5 \
     copy_dcpl_newfile.h5 extend.h5 istore.h5 extlinks*.h5 frspace.h5 links*.h5 \
     sys_file1 tfile[1-7].h5 th5s[1-4].h5 lheap.h5 fheap.h5 ohdr.h5 \
     stab.h5 extern_[1-3].h5 extern_[1-4][ab].raw gheap[0-4].h5 \
@@ -137,7 +163,7 @@ CHECK_CLEANFILES+=accum.h5 cmpd_dset.h5 compact_dataset.h5 dataset.h5 dset_offse
     stdio.h5 sec2.h5 dtypes[0-9].h5 dtypes1[0].h5 dt_arith[1-2].h5 tattr.h5 \
     tselect.h5 mtime.h5 unlink.h5 unicode.h5 coord.h5 \
     fillval_[0-9].h5 fillval.raw mount_[0-9].h5 testmeta.h5 ttime.h5 \
-    trefer[1-3].h5 tvltypes.h5 tvlstr.h5 tvlstr2.h5 flush.h5         \
+    trefer[1-3].h5 tvltypes.h5 tvlstr.h5 tvlstr2.h5 twriteorder.dat flush.h5 \
     enum1.h5 titerate.h5 ttsafe.h5 tarray1.h5 tgenprop.h5            \
     tmisc[0-9]*.h5 set_extent[1-5].h5 ext[12].bin           \
     getname.h5 getname[1-3].h5 sec2_file.h5 direct_file.h5           \
@@ -145,12 +171,19 @@ CHECK_CLEANFILES+=accum.h5 cmpd_dset.h5 compact_dataset.h5 dataset.h5 dset_offse
     multi_file-[rs].h5 core_file plugin.h5 \
     new_move_[ab].h5 ntypes.h5 dangle.h5 error_test.h5 err_compat.h5 \
     dtransform.h5 test_filters.h5 get_file_name.h5 tstint[1-2].h5    \
-    unlink_chunked.h5 btree2.h5 objcopy_src.h5 objcopy_dst.h5        \
-    objcopy_ext.dat trefer1.h5 trefer2.h5 app_ref.h5 tcheck_version_*.out \
-    tcheck_version_*.err efc[0-5].h5 log_vfd_out.log \
-    new_multi_file_v16-r.h5 new_multi_file_v16-s.h5 \
+    unlink_chunked.h5 btree2.h5 btree2_tmp.h5 objcopy_src.h5 objcopy_dst.h5 \
+    objcopy_ext.dat trefer1.h5 trefer2.h5 app_ref.h5 farray.h5 farray_tmp.h5 \
+    earray.h5 earray_tmp.h5 efc[0-5].h5 log_vfd_out.log              \
+    new_multi_file_v16-r.h5 new_multi_file_v16-s.h5                  \
     split_get_file_image_test-m.h5 split_get_file_image_test-r.h5    \
-    file_image_core_test.h5.copy unregister_filter_1.h5 unregister_filter_2.h5
+    file_image_core_test.h5.copy unregister_filter_1.h5 unregister_filter_2.h5 \
+    vds_virt.h5 vds_src_[0-1].h5 \
+    swmr_data.h5 use_use_append_chunk.h5 use_append_mchunks.h5 use_disable_mdc_flushes.h5     \
+    flushrefresh.h5 flushrefresh_VERIFICATION_START                  \
+    flushrefresh_VERIFICATION_CHECKPOINT1 flushrefresh_VERIFICATION_CHECKPOINT2 \
+    flushrefresh_VERIFICATION_DONE atomic_data accum_swmr_big.h5 ohdr_swmr.h5 \
+    test_swmr*.h5 cache_logging.h5 vds_swmr.h5 vds_swmr_src_*.h5 \
+    earray_hdr_fd.h5
 
 # Sources for testhdf5 executable
 testhdf5_SOURCES=testhdf5.c tarray.c tattr.c tchecksum.c tconfig.c tfile.c \
@@ -158,7 +191,13 @@ testhdf5_SOURCES=testhdf5.c tarray.c tattr.c tchecksum.c tconfig.c tfile.c \
     trefer.c trefstr.c tselect.c tskiplist.c tsohm.c ttime.c ttst.c tunicode.c \
     tvlstr.c tvltypes.c
 
+# Sources for Use Cases
+use_append_chunk_SOURCES=use_append_chunk.c use_common.c
+use_append_mchunks_SOURCES=use_append_mchunks.c use_common.c
+use_disable_mdc_flushes_SOURCES=use_disable_mdc_flushes.c
+
 # Temporary files.
-DISTCLEANFILES=testerror.sh testlibinfo.sh testcheck_version.sh testlinks_env.sh test_plugin.sh
+DISTCLEANFILES=testerror.sh testlibinfo.sh testcheck_version.sh testlinks_env.sh test_plugin.sh \
+    testswmr.sh testvdsswmr.sh test_usecases.sh testflushrefresh.sh
 
 include $(top_srcdir)/config/conclude.am
diff --git a/test/Makefile.in b/test/Makefile.in
index 02ab570..47a4e01 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -33,7 +33,17 @@
 
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -96,19 +106,21 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/testcheck_version.sh.in $(srcdir)/testerror.sh.in \
-	$(srcdir)/H5srcdir_str.h.in $(srcdir)/testlibinfo.sh.in \
-	$(srcdir)/testlinks_env.sh.in $(srcdir)/test_plugin.sh.in \
-	$(top_srcdir)/bin/depcomp $(top_srcdir)/bin/test-driver \
-	COPYING
 @HAVE_SHARED_CONDITIONAL_TRUE at am__append_1 = test_plugin.sh
 @HAVE_SHARED_CONDITIONAL_TRUE at am__append_2 = plugin$(EXEEXT)
 check_PROGRAMS = $(am__EXEEXT_1) error_test$(EXEEXT) \
 	err_compat$(EXEEXT) tcheck_version$(EXEEXT) testmeta$(EXEEXT) \
-	links_env$(EXEEXT) $(am__EXEEXT_2)
+	accum_swmr_reader$(EXEEXT) atomic_writer$(EXEEXT) \
+	atomic_reader$(EXEEXT) links_env$(EXEEXT) \
+	flushrefresh$(EXEEXT) use_append_chunk$(EXEEXT) \
+	use_append_mchunks$(EXEEXT) use_disable_mdc_flushes$(EXEEXT) \
+	swmr_generator$(EXEEXT) swmr_start_write$(EXEEXT) \
+	swmr_reader$(EXEEXT) swmr_writer$(EXEEXT) \
+	swmr_remove_reader$(EXEEXT) swmr_remove_writer$(EXEEXT) \
+	swmr_addrem_writer$(EXEEXT) swmr_sparse_reader$(EXEEXT) \
+	swmr_sparse_writer$(EXEEXT) swmr_check_compat_vfd$(EXEEXT) \
+	vds_swmr_gen$(EXEEXT) vds_swmr_reader$(EXEEXT) \
+	vds_swmr_writer$(EXEEXT) $(am__EXEEXT_2)
 @HAVE_SHARED_CONDITIONAL_TRUE at am__append_3 = plugin
 @BUILD_ALL_CONDITIONAL_TRUE at noinst_PROGRAMS = $(am__EXEEXT_3)
 @DIRECT_VFD_CONDITIONAL_TRUE at am__append_4 = direct
@@ -116,13 +128,20 @@ TESTS = $(am__EXEEXT_1) $(TEST_SCRIPT)
 subdir = test
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
-CONFIG_CLEAN_FILES = testcheck_version.sh testerror.sh H5srcdir_str.h \
-	testlibinfo.sh testlinks_env.sh test_plugin.sh
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
+CONFIG_CLEAN_FILES = testcheck_version.sh testerror.sh \
+	testflushrefresh.sh H5srcdir_str.h testlibinfo.sh \
+	testlinks_env.sh testswmr.sh test_plugin.sh test_usecases.sh \
+	testvdsswmr.sh
 CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
@@ -176,24 +195,29 @@ libdynlib3_la_OBJECTS = $(am_libdynlib3_la_OBJECTS)
 @HAVE_SHARED_CONDITIONAL_TRUE at am_libdynlib3_la_rpath = -rpath \
 @HAVE_SHARED_CONDITIONAL_TRUE@	$(libdir)
 libh5test_la_LIBADD =
-am_libh5test_la_OBJECTS = h5test.lo testframe.lo cache_common.lo
+am_libh5test_la_OBJECTS = h5test.lo testframe.lo cache_common.lo \
+	swmr_common.lo
 libh5test_la_OBJECTS = $(am_libh5test_la_OBJECTS)
 @HAVE_SHARED_CONDITIONAL_FALSE at am_libh5test_la_rpath =
 @HAVE_SHARED_CONDITIONAL_TRUE at am_libh5test_la_rpath =
-am__EXEEXT_1 = testhdf5$(EXEEXT) lheap$(EXEEXT) ohdr$(EXEEXT) \
-	stab$(EXEEXT) gheap$(EXEEXT) cache$(EXEEXT) cache_api$(EXEEXT) \
-	pool$(EXEEXT) accum$(EXEEXT) hyperslab$(EXEEXT) \
-	istore$(EXEEXT) bittests$(EXEEXT) dt_arith$(EXEEXT) \
-	dtypes$(EXEEXT) dsets$(EXEEXT) cmpd_dset$(EXEEXT) \
-	filter_fail$(EXEEXT) extend$(EXEEXT) external$(EXEEXT) \
-	efc$(EXEEXT) objcopy$(EXEEXT) links$(EXEEXT) unlink$(EXEEXT) \
-	big$(EXEEXT) mtime$(EXEEXT) fillval$(EXEEXT) mount$(EXEEXT) \
-	flush1$(EXEEXT) flush2$(EXEEXT) app_ref$(EXEEXT) enum$(EXEEXT) \
-	set_extent$(EXEEXT) ttsafe$(EXEEXT) getname$(EXEEXT) \
+am__EXEEXT_1 = testhdf5$(EXEEXT) cache$(EXEEXT) cache_api$(EXEEXT) \
+	cache_tagging$(EXEEXT) lheap$(EXEEXT) ohdr$(EXEEXT) \
+	stab$(EXEEXT) gheap$(EXEEXT) farray$(EXEEXT) earray$(EXEEXT) \
+	btree2$(EXEEXT) fheap$(EXEEXT) pool$(EXEEXT) accum$(EXEEXT) \
+	hyperslab$(EXEEXT) istore$(EXEEXT) bittests$(EXEEXT) \
+	dt_arith$(EXEEXT) dtypes$(EXEEXT) dsets$(EXEEXT) \
+	cmpd_dset$(EXEEXT) filter_fail$(EXEEXT) extend$(EXEEXT) \
+	external$(EXEEXT) efc$(EXEEXT) objcopy$(EXEEXT) links$(EXEEXT) \
+	unlink$(EXEEXT) twriteorder$(EXEEXT) big$(EXEEXT) \
+	mtime$(EXEEXT) fillval$(EXEEXT) mount$(EXEEXT) flush1$(EXEEXT) \
+	flush2$(EXEEXT) app_ref$(EXEEXT) enum$(EXEEXT) \
+	set_extent$(EXEEXT) ttsafe$(EXEEXT) enc_dec_plist$(EXEEXT) \
+	enc_dec_plist_cross_platform$(EXEEXT) getname$(EXEEXT) \
 	vfd$(EXEEXT) ntypes$(EXEEXT) dangle$(EXEEXT) \
 	dtransform$(EXEEXT) reserved$(EXEEXT) cross_read$(EXEEXT) \
-	freespace$(EXEEXT) mf$(EXEEXT) btree2$(EXEEXT) fheap$(EXEEXT) \
-	file_image$(EXEEXT) unregister$(EXEEXT)
+	freespace$(EXEEXT) mf$(EXEEXT) vds$(EXEEXT) \
+	file_image$(EXEEXT) unregister$(EXEEXT) cache_logging$(EXEEXT) \
+	cork$(EXEEXT) swmr$(EXEEXT)
 @HAVE_SHARED_CONDITIONAL_TRUE at am__EXEEXT_2 = plugin$(EXEEXT)
 am__EXEEXT_3 = gen_bad_ohdr$(EXEEXT) gen_bogus$(EXEEXT) \
 	gen_cross$(EXEEXT) gen_deflate$(EXEEXT) gen_filters$(EXEEXT) \
@@ -201,17 +225,30 @@ am__EXEEXT_3 = gen_bad_ohdr$(EXEEXT) gen_bogus$(EXEEXT) \
 	gen_new_group$(EXEEXT) gen_new_mtime$(EXEEXT) \
 	gen_new_super$(EXEEXT) gen_noencoder$(EXEEXT) \
 	gen_nullspace$(EXEEXT) gen_udlinks$(EXEEXT) \
-	space_overflow$(EXEEXT) gen_sizes_lheap$(EXEEXT) \
-	gen_file_image$(EXEEXT)
+	space_overflow$(EXEEXT) gen_filespace$(EXEEXT) \
+	gen_specmetaread$(EXEEXT) gen_sizes_lheap$(EXEEXT) \
+	gen_file_image$(EXEEXT) gen_plist$(EXEEXT)
 PROGRAMS = $(noinst_PROGRAMS)
 accum_SOURCES = accum.c
 accum_OBJECTS = accum.$(OBJEXT)
 accum_LDADD = $(LDADD)
 accum_DEPENDENCIES = libh5test.la $(LIBHDF5)
+accum_swmr_reader_SOURCES = accum_swmr_reader.c
+accum_swmr_reader_OBJECTS = accum_swmr_reader.$(OBJEXT)
+accum_swmr_reader_LDADD = $(LDADD)
+accum_swmr_reader_DEPENDENCIES = libh5test.la $(LIBHDF5)
 app_ref_SOURCES = app_ref.c
 app_ref_OBJECTS = app_ref.$(OBJEXT)
 app_ref_LDADD = $(LDADD)
 app_ref_DEPENDENCIES = libh5test.la $(LIBHDF5)
+atomic_reader_SOURCES = atomic_reader.c
+atomic_reader_OBJECTS = atomic_reader.$(OBJEXT)
+atomic_reader_LDADD = $(LDADD)
+atomic_reader_DEPENDENCIES = libh5test.la $(LIBHDF5)
+atomic_writer_SOURCES = atomic_writer.c
+atomic_writer_OBJECTS = atomic_writer.$(OBJEXT)
+atomic_writer_LDADD = $(LDADD)
+atomic_writer_DEPENDENCIES = libh5test.la $(LIBHDF5)
 big_SOURCES = big.c
 big_OBJECTS = big.$(OBJEXT)
 big_LDADD = $(LDADD)
@@ -232,10 +269,22 @@ cache_api_SOURCES = cache_api.c
 cache_api_OBJECTS = cache_api.$(OBJEXT)
 cache_api_LDADD = $(LDADD)
 cache_api_DEPENDENCIES = libh5test.la $(LIBHDF5)
+cache_logging_SOURCES = cache_logging.c
+cache_logging_OBJECTS = cache_logging.$(OBJEXT)
+cache_logging_LDADD = $(LDADD)
+cache_logging_DEPENDENCIES = libh5test.la $(LIBHDF5)
+cache_tagging_SOURCES = cache_tagging.c
+cache_tagging_OBJECTS = cache_tagging.$(OBJEXT)
+cache_tagging_LDADD = $(LDADD)
+cache_tagging_DEPENDENCIES = libh5test.la $(LIBHDF5)
 cmpd_dset_SOURCES = cmpd_dset.c
 cmpd_dset_OBJECTS = cmpd_dset.$(OBJEXT)
 cmpd_dset_LDADD = $(LDADD)
 cmpd_dset_DEPENDENCIES = libh5test.la $(LIBHDF5)
+cork_SOURCES = cork.c
+cork_OBJECTS = cork.$(OBJEXT)
+cork_LDADD = $(LDADD)
+cork_DEPENDENCIES = libh5test.la $(LIBHDF5)
 cross_read_SOURCES = cross_read.c
 cross_read_OBJECTS = cross_read.$(OBJEXT)
 cross_read_LDADD = $(LDADD)
@@ -260,10 +309,23 @@ dtypes_SOURCES = dtypes.c
 dtypes_OBJECTS = dtypes.$(OBJEXT)
 dtypes_LDADD = $(LDADD)
 dtypes_DEPENDENCIES = libh5test.la $(LIBHDF5)
+earray_SOURCES = earray.c
+earray_OBJECTS = earray.$(OBJEXT)
+earray_LDADD = $(LDADD)
+earray_DEPENDENCIES = libh5test.la $(LIBHDF5)
 efc_SOURCES = efc.c
 efc_OBJECTS = efc.$(OBJEXT)
 efc_LDADD = $(LDADD)
 efc_DEPENDENCIES = libh5test.la $(LIBHDF5)
+enc_dec_plist_SOURCES = enc_dec_plist.c
+enc_dec_plist_OBJECTS = enc_dec_plist.$(OBJEXT)
+enc_dec_plist_LDADD = $(LDADD)
+enc_dec_plist_DEPENDENCIES = libh5test.la $(LIBHDF5)
+enc_dec_plist_cross_platform_SOURCES = enc_dec_plist_cross_platform.c
+enc_dec_plist_cross_platform_OBJECTS =  \
+	enc_dec_plist_cross_platform.$(OBJEXT)
+enc_dec_plist_cross_platform_LDADD = $(LDADD)
+enc_dec_plist_cross_platform_DEPENDENCIES = libh5test.la $(LIBHDF5)
 enum_SOURCES = enum.c
 enum_OBJECTS = enum.$(OBJEXT)
 enum_LDADD = $(LDADD)
@@ -284,6 +346,10 @@ external_SOURCES = external.c
 external_OBJECTS = external.$(OBJEXT)
 external_LDADD = $(LDADD)
 external_DEPENDENCIES = libh5test.la $(LIBHDF5)
+farray_SOURCES = farray.c
+farray_OBJECTS = farray.$(OBJEXT)
+farray_LDADD = $(LDADD)
+farray_DEPENDENCIES = libh5test.la $(LIBHDF5)
 fheap_SOURCES = fheap.c
 fheap_OBJECTS = fheap.$(OBJEXT)
 fheap_LDADD = $(LDADD)
@@ -308,6 +374,10 @@ flush2_SOURCES = flush2.c
 flush2_OBJECTS = flush2.$(OBJEXT)
 flush2_LDADD = $(LDADD)
 flush2_DEPENDENCIES = libh5test.la $(LIBHDF5)
+flushrefresh_SOURCES = flushrefresh.c
+flushrefresh_OBJECTS = flushrefresh.$(OBJEXT)
+flushrefresh_LDADD = $(LDADD)
+flushrefresh_DEPENDENCIES = libh5test.la $(LIBHDF5)
 freespace_SOURCES = freespace.c
 freespace_OBJECTS = freespace.$(OBJEXT)
 freespace_LDADD = $(LDADD)
@@ -332,6 +402,10 @@ gen_file_image_SOURCES = gen_file_image.c
 gen_file_image_OBJECTS = gen_file_image.$(OBJEXT)
 gen_file_image_LDADD = $(LDADD)
 gen_file_image_DEPENDENCIES = libh5test.la $(LIBHDF5)
+gen_filespace_SOURCES = gen_filespace.c
+gen_filespace_OBJECTS = gen_filespace.$(OBJEXT)
+gen_filespace_LDADD = $(LDADD)
+gen_filespace_DEPENDENCIES = libh5test.la $(LIBHDF5)
 gen_filters_SOURCES = gen_filters.c
 gen_filters_OBJECTS = gen_filters.$(OBJEXT)
 gen_filters_LDADD = $(LDADD)
@@ -368,10 +442,18 @@ gen_nullspace_SOURCES = gen_nullspace.c
 gen_nullspace_OBJECTS = gen_nullspace.$(OBJEXT)
 gen_nullspace_LDADD = $(LDADD)
 gen_nullspace_DEPENDENCIES = libh5test.la $(LIBHDF5)
+gen_plist_SOURCES = gen_plist.c
+gen_plist_OBJECTS = gen_plist.$(OBJEXT)
+gen_plist_LDADD = $(LDADD)
+gen_plist_DEPENDENCIES = libh5test.la $(LIBHDF5)
 gen_sizes_lheap_SOURCES = gen_sizes_lheap.c
 gen_sizes_lheap_OBJECTS = gen_sizes_lheap.$(OBJEXT)
 gen_sizes_lheap_LDADD = $(LDADD)
 gen_sizes_lheap_DEPENDENCIES = libh5test.la $(LIBHDF5)
+gen_specmetaread_SOURCES = gen_specmetaread.c
+gen_specmetaread_OBJECTS = gen_specmetaread.$(OBJEXT)
+gen_specmetaread_LDADD = $(LDADD)
+gen_specmetaread_DEPENDENCIES = libh5test.la $(LIBHDF5)
 gen_udlinks_SOURCES = gen_udlinks.c
 gen_udlinks_OBJECTS = gen_udlinks.$(OBJEXT)
 gen_udlinks_LDADD = $(LDADD)
@@ -452,6 +534,50 @@ stab_SOURCES = stab.c
 stab_OBJECTS = stab.$(OBJEXT)
 stab_LDADD = $(LDADD)
 stab_DEPENDENCIES = libh5test.la $(LIBHDF5)
+swmr_SOURCES = swmr.c
+swmr_OBJECTS = swmr.$(OBJEXT)
+swmr_LDADD = $(LDADD)
+swmr_DEPENDENCIES = libh5test.la $(LIBHDF5)
+swmr_addrem_writer_SOURCES = swmr_addrem_writer.c
+swmr_addrem_writer_OBJECTS = swmr_addrem_writer.$(OBJEXT)
+swmr_addrem_writer_LDADD = $(LDADD)
+swmr_addrem_writer_DEPENDENCIES = libh5test.la $(LIBHDF5)
+swmr_check_compat_vfd_SOURCES = swmr_check_compat_vfd.c
+swmr_check_compat_vfd_OBJECTS = swmr_check_compat_vfd.$(OBJEXT)
+swmr_check_compat_vfd_LDADD = $(LDADD)
+swmr_check_compat_vfd_DEPENDENCIES = libh5test.la $(LIBHDF5)
+swmr_generator_SOURCES = swmr_generator.c
+swmr_generator_OBJECTS = swmr_generator.$(OBJEXT)
+swmr_generator_LDADD = $(LDADD)
+swmr_generator_DEPENDENCIES = libh5test.la $(LIBHDF5)
+swmr_reader_SOURCES = swmr_reader.c
+swmr_reader_OBJECTS = swmr_reader.$(OBJEXT)
+swmr_reader_LDADD = $(LDADD)
+swmr_reader_DEPENDENCIES = libh5test.la $(LIBHDF5)
+swmr_remove_reader_SOURCES = swmr_remove_reader.c
+swmr_remove_reader_OBJECTS = swmr_remove_reader.$(OBJEXT)
+swmr_remove_reader_LDADD = $(LDADD)
+swmr_remove_reader_DEPENDENCIES = libh5test.la $(LIBHDF5)
+swmr_remove_writer_SOURCES = swmr_remove_writer.c
+swmr_remove_writer_OBJECTS = swmr_remove_writer.$(OBJEXT)
+swmr_remove_writer_LDADD = $(LDADD)
+swmr_remove_writer_DEPENDENCIES = libh5test.la $(LIBHDF5)
+swmr_sparse_reader_SOURCES = swmr_sparse_reader.c
+swmr_sparse_reader_OBJECTS = swmr_sparse_reader.$(OBJEXT)
+swmr_sparse_reader_LDADD = $(LDADD)
+swmr_sparse_reader_DEPENDENCIES = libh5test.la $(LIBHDF5)
+swmr_sparse_writer_SOURCES = swmr_sparse_writer.c
+swmr_sparse_writer_OBJECTS = swmr_sparse_writer.$(OBJEXT)
+swmr_sparse_writer_LDADD = $(LDADD)
+swmr_sparse_writer_DEPENDENCIES = libh5test.la $(LIBHDF5)
+swmr_start_write_SOURCES = swmr_start_write.c
+swmr_start_write_OBJECTS = swmr_start_write.$(OBJEXT)
+swmr_start_write_LDADD = $(LDADD)
+swmr_start_write_DEPENDENCIES = libh5test.la $(LIBHDF5)
+swmr_writer_SOURCES = swmr_writer.c
+swmr_writer_OBJECTS = swmr_writer.$(OBJEXT)
+swmr_writer_LDADD = $(LDADD)
+swmr_writer_DEPENDENCIES = libh5test.la $(LIBHDF5)
 tcheck_version_SOURCES = tcheck_version.c
 tcheck_version_OBJECTS = tcheck_version.$(OBJEXT)
 tcheck_version_LDADD = $(LDADD)
@@ -478,6 +604,10 @@ am_ttsafe_OBJECTS = ttsafe.$(OBJEXT) ttsafe_dcreate.$(OBJEXT) \
 ttsafe_OBJECTS = $(am_ttsafe_OBJECTS)
 ttsafe_LDADD = $(LDADD)
 ttsafe_DEPENDENCIES = libh5test.la $(LIBHDF5)
+twriteorder_SOURCES = twriteorder.c
+twriteorder_OBJECTS = twriteorder.$(OBJEXT)
+twriteorder_LDADD = $(LDADD)
+twriteorder_DEPENDENCIES = libh5test.la $(LIBHDF5)
 unlink_SOURCES = unlink.c
 unlink_OBJECTS = unlink.$(OBJEXT)
 unlink_LDADD = $(LDADD)
@@ -486,6 +616,38 @@ unregister_SOURCES = unregister.c
 unregister_OBJECTS = unregister.$(OBJEXT)
 unregister_LDADD = $(LDADD)
 unregister_DEPENDENCIES = libh5test.la $(LIBHDF5)
+am_use_append_chunk_OBJECTS = use_append_chunk.$(OBJEXT) \
+	use_common.$(OBJEXT)
+use_append_chunk_OBJECTS = $(am_use_append_chunk_OBJECTS)
+use_append_chunk_LDADD = $(LDADD)
+use_append_chunk_DEPENDENCIES = libh5test.la $(LIBHDF5)
+am_use_append_mchunks_OBJECTS = use_append_mchunks.$(OBJEXT) \
+	use_common.$(OBJEXT)
+use_append_mchunks_OBJECTS = $(am_use_append_mchunks_OBJECTS)
+use_append_mchunks_LDADD = $(LDADD)
+use_append_mchunks_DEPENDENCIES = libh5test.la $(LIBHDF5)
+am_use_disable_mdc_flushes_OBJECTS =  \
+	use_disable_mdc_flushes.$(OBJEXT)
+use_disable_mdc_flushes_OBJECTS =  \
+	$(am_use_disable_mdc_flushes_OBJECTS)
+use_disable_mdc_flushes_LDADD = $(LDADD)
+use_disable_mdc_flushes_DEPENDENCIES = libh5test.la $(LIBHDF5)
+vds_SOURCES = vds.c
+vds_OBJECTS = vds.$(OBJEXT)
+vds_LDADD = $(LDADD)
+vds_DEPENDENCIES = libh5test.la $(LIBHDF5)
+vds_swmr_gen_SOURCES = vds_swmr_gen.c
+vds_swmr_gen_OBJECTS = vds_swmr_gen.$(OBJEXT)
+vds_swmr_gen_LDADD = $(LDADD)
+vds_swmr_gen_DEPENDENCIES = libh5test.la $(LIBHDF5)
+vds_swmr_reader_SOURCES = vds_swmr_reader.c
+vds_swmr_reader_OBJECTS = vds_swmr_reader.$(OBJEXT)
+vds_swmr_reader_LDADD = $(LDADD)
+vds_swmr_reader_DEPENDENCIES = libh5test.la $(LIBHDF5)
+vds_swmr_writer_SOURCES = vds_swmr_writer.c
+vds_swmr_writer_OBJECTS = vds_swmr_writer.$(OBJEXT)
+vds_swmr_writer_LDADD = $(LDADD)
+vds_swmr_writer_DEPENDENCIES = libh5test.la $(LIBHDF5)
 vfd_SOURCES = vfd.c
 vfd_OBJECTS = vfd.$(OBJEXT)
 vfd_LDADD = $(LDADD)
@@ -502,7 +664,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -526,37 +688,57 @@ am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
 SOURCES = $(libdynlib1_la_SOURCES) $(libdynlib2_la_SOURCES) \
 	$(libdynlib3_la_SOURCES) $(libh5test_la_SOURCES) accum.c \
-	app_ref.c big.c bittests.c btree2.c cache.c cache_api.c \
-	cmpd_dset.c cross_read.c dangle.c dsets.c dt_arith.c \
-	dtransform.c dtypes.c efc.c enum.c err_compat.c error_test.c \
-	extend.c external.c fheap.c file_image.c fillval.c \
-	filter_fail.c flush1.c flush2.c freespace.c gen_bad_ohdr.c \
-	gen_bogus.c gen_cross.c gen_deflate.c gen_file_image.c \
+	accum_swmr_reader.c app_ref.c atomic_reader.c atomic_writer.c \
+	big.c bittests.c btree2.c cache.c cache_api.c cache_logging.c \
+	cache_tagging.c cmpd_dset.c cork.c cross_read.c dangle.c \
+	dsets.c dt_arith.c dtransform.c dtypes.c earray.c efc.c \
+	enc_dec_plist.c enc_dec_plist_cross_platform.c enum.c \
+	err_compat.c error_test.c extend.c external.c farray.c fheap.c \
+	file_image.c fillval.c filter_fail.c flush1.c flush2.c \
+	flushrefresh.c freespace.c gen_bad_ohdr.c gen_bogus.c \
+	gen_cross.c gen_deflate.c gen_file_image.c gen_filespace.c \
 	gen_filters.c gen_idx.c gen_new_array.c gen_new_fill.c \
 	gen_new_group.c gen_new_mtime.c gen_new_super.c \
-	gen_noencoder.c gen_nullspace.c gen_sizes_lheap.c \
-	gen_udlinks.c getname.c gheap.c hyperslab.c istore.c lheap.c \
-	links.c links_env.c mf.c mount.c mtime.c ntypes.c objcopy.c \
-	ohdr.c plugin.c pool.c reserved.c set_extent.c \
-	space_overflow.c stab.c tcheck_version.c $(testhdf5_SOURCES) \
-	testmeta.c $(ttsafe_SOURCES) unlink.c unregister.c vfd.c
+	gen_noencoder.c gen_nullspace.c gen_plist.c gen_sizes_lheap.c \
+	gen_specmetaread.c gen_udlinks.c getname.c gheap.c hyperslab.c \
+	istore.c lheap.c links.c links_env.c mf.c mount.c mtime.c \
+	ntypes.c objcopy.c ohdr.c plugin.c pool.c reserved.c \
+	set_extent.c space_overflow.c stab.c swmr.c \
+	swmr_addrem_writer.c swmr_check_compat_vfd.c swmr_generator.c \
+	swmr_reader.c swmr_remove_reader.c swmr_remove_writer.c \
+	swmr_sparse_reader.c swmr_sparse_writer.c swmr_start_write.c \
+	swmr_writer.c tcheck_version.c $(testhdf5_SOURCES) testmeta.c \
+	$(ttsafe_SOURCES) twriteorder.c unlink.c unregister.c \
+	$(use_append_chunk_SOURCES) $(use_append_mchunks_SOURCES) \
+	$(use_disable_mdc_flushes_SOURCES) vds.c vds_swmr_gen.c \
+	vds_swmr_reader.c vds_swmr_writer.c vfd.c
 DIST_SOURCES = $(am__libdynlib1_la_SOURCES_DIST) \
 	$(am__libdynlib2_la_SOURCES_DIST) \
 	$(am__libdynlib3_la_SOURCES_DIST) $(libh5test_la_SOURCES) \
-	accum.c app_ref.c big.c bittests.c btree2.c cache.c \
-	cache_api.c cmpd_dset.c cross_read.c dangle.c dsets.c \
-	dt_arith.c dtransform.c dtypes.c efc.c enum.c err_compat.c \
-	error_test.c extend.c external.c fheap.c file_image.c \
-	fillval.c filter_fail.c flush1.c flush2.c freespace.c \
-	gen_bad_ohdr.c gen_bogus.c gen_cross.c gen_deflate.c \
-	gen_file_image.c gen_filters.c gen_idx.c gen_new_array.c \
-	gen_new_fill.c gen_new_group.c gen_new_mtime.c gen_new_super.c \
-	gen_noencoder.c gen_nullspace.c gen_sizes_lheap.c \
-	gen_udlinks.c getname.c gheap.c hyperslab.c istore.c lheap.c \
-	links.c links_env.c mf.c mount.c mtime.c ntypes.c objcopy.c \
-	ohdr.c plugin.c pool.c reserved.c set_extent.c \
-	space_overflow.c stab.c tcheck_version.c $(testhdf5_SOURCES) \
-	testmeta.c $(ttsafe_SOURCES) unlink.c unregister.c vfd.c
+	accum.c accum_swmr_reader.c app_ref.c atomic_reader.c \
+	atomic_writer.c big.c bittests.c btree2.c cache.c cache_api.c \
+	cache_logging.c cache_tagging.c cmpd_dset.c cork.c \
+	cross_read.c dangle.c dsets.c dt_arith.c dtransform.c dtypes.c \
+	earray.c efc.c enc_dec_plist.c enc_dec_plist_cross_platform.c \
+	enum.c err_compat.c error_test.c extend.c external.c farray.c \
+	fheap.c file_image.c fillval.c filter_fail.c flush1.c flush2.c \
+	flushrefresh.c freespace.c gen_bad_ohdr.c gen_bogus.c \
+	gen_cross.c gen_deflate.c gen_file_image.c gen_filespace.c \
+	gen_filters.c gen_idx.c gen_new_array.c gen_new_fill.c \
+	gen_new_group.c gen_new_mtime.c gen_new_super.c \
+	gen_noencoder.c gen_nullspace.c gen_plist.c gen_sizes_lheap.c \
+	gen_specmetaread.c gen_udlinks.c getname.c gheap.c hyperslab.c \
+	istore.c lheap.c links.c links_env.c mf.c mount.c mtime.c \
+	ntypes.c objcopy.c ohdr.c plugin.c pool.c reserved.c \
+	set_extent.c space_overflow.c stab.c swmr.c \
+	swmr_addrem_writer.c swmr_check_compat_vfd.c swmr_generator.c \
+	swmr_reader.c swmr_remove_reader.c swmr_remove_writer.c \
+	swmr_sparse_reader.c swmr_sparse_writer.c swmr_start_write.c \
+	swmr_writer.c tcheck_version.c $(testhdf5_SOURCES) testmeta.c \
+	$(ttsafe_SOURCES) twriteorder.c unlink.c unregister.c \
+	$(use_append_chunk_SOURCES) $(use_append_mchunks_SOURCES) \
+	$(use_disable_mdc_flushes_SOURCES) vds.c vds_swmr_gen.c \
+	vds_swmr_reader.c vds_swmr_writer.c vfd.c
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -756,6 +938,14 @@ am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
 TEST_LOGS = $(am__test_logs2:.sh.log=.log)
 SH_LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
 SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/H5srcdir_str.h.in $(srcdir)/Makefile.in \
+	$(srcdir)/test_plugin.sh.in $(srcdir)/test_usecases.sh.in \
+	$(srcdir)/testcheck_version.sh.in $(srcdir)/testerror.sh.in \
+	$(srcdir)/testflushrefresh.sh.in $(srcdir)/testlibinfo.sh.in \
+	$(srcdir)/testlinks_env.sh.in $(srcdir)/testswmr.sh.in \
+	$(srcdir)/testvdsswmr.sh.in $(top_srcdir)/bin/depcomp \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am COPYING
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -773,7 +963,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -818,14 +1007,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -835,13 +1032,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -883,9 +1079,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -1030,8 +1237,10 @@ TRACE = perl $(top_srcdir)/bin/trace
 # the temporary file name in ways that the makefile is not aware of.
 CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 accum.h5 \
 	cmpd_dset.h5 compact_dataset.h5 dataset.h5 dset_offset.h5 \
-	max_compact_dataset.h5 simple.h5 set_local.h5 random_chunks.h5 \
-	huge_chunks.h5 chunk_cache.h5 big_chunk.h5 chunk_expand.h5 \
+	chunk_fixed.h5 cache_logging.out max_compact_dataset.h5 \
+	simple.h5 set_local.h5 random_chunks.h5 huge_chunks.h5 \
+	chunk_cache.h5 big_chunk.h5 chunk_fast.h5 chunk_expand.h5 \
+	layout_extend.h5 swmr_fail.h5 partial_chunks.h5 \
 	copy_dcpl_newfile.h5 extend.h5 istore.h5 extlinks*.h5 \
 	frspace.h5 links*.h5 sys_file1 tfile[1-7].h5 th5s[1-4].h5 \
 	lheap.h5 fheap.h5 ohdr.h5 stab.h5 extern_[1-3].h5 \
@@ -1042,42 +1251,66 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 accum.h5 \
 	tselect.h5 mtime.h5 unlink.h5 unicode.h5 coord.h5 \
 	fillval_[0-9].h5 fillval.raw mount_[0-9].h5 testmeta.h5 \
 	ttime.h5 trefer[1-3].h5 tvltypes.h5 tvlstr.h5 tvlstr2.h5 \
-	flush.h5 enum1.h5 titerate.h5 ttsafe.h5 tarray1.h5 tgenprop.h5 \
-	tmisc[0-9]*.h5 set_extent[1-5].h5 ext[12].bin getname.h5 \
-	getname[1-3].h5 sec2_file.h5 direct_file.h5 \
-	family_file000[0-3][0-9].h5 new_family_v16_000[0-3][0-9].h5 \
-	multi_file-[rs].h5 core_file plugin.h5 new_move_[ab].h5 \
-	ntypes.h5 dangle.h5 error_test.h5 err_compat.h5 dtransform.h5 \
-	test_filters.h5 get_file_name.h5 tstint[1-2].h5 \
-	unlink_chunked.h5 btree2.h5 objcopy_src.h5 objcopy_dst.h5 \
-	objcopy_ext.dat trefer1.h5 trefer2.h5 app_ref.h5 \
-	tcheck_version_*.out tcheck_version_*.err efc[0-5].h5 \
-	log_vfd_out.log new_multi_file_v16-r.h5 \
-	new_multi_file_v16-s.h5 split_get_file_image_test-m.h5 \
-	split_get_file_image_test-r.h5 file_image_core_test.h5.copy \
-	unregister_filter_1.h5 unregister_filter_2.h5
-
-# Test script for error_test and err_compat
+	twriteorder.dat flush.h5 enum1.h5 titerate.h5 ttsafe.h5 \
+	tarray1.h5 tgenprop.h5 tmisc[0-9]*.h5 set_extent[1-5].h5 \
+	ext[12].bin getname.h5 getname[1-3].h5 sec2_file.h5 \
+	direct_file.h5 family_file000[0-3][0-9].h5 \
+	new_family_v16_000[0-3][0-9].h5 multi_file-[rs].h5 core_file \
+	plugin.h5 new_move_[ab].h5 ntypes.h5 dangle.h5 error_test.h5 \
+	err_compat.h5 dtransform.h5 test_filters.h5 get_file_name.h5 \
+	tstint[1-2].h5 unlink_chunked.h5 btree2.h5 btree2_tmp.h5 \
+	objcopy_src.h5 objcopy_dst.h5 objcopy_ext.dat trefer1.h5 \
+	trefer2.h5 app_ref.h5 farray.h5 farray_tmp.h5 earray.h5 \
+	earray_tmp.h5 efc[0-5].h5 log_vfd_out.log \
+	new_multi_file_v16-r.h5 new_multi_file_v16-s.h5 \
+	split_get_file_image_test-m.h5 split_get_file_image_test-r.h5 \
+	file_image_core_test.h5.copy unregister_filter_1.h5 \
+	unregister_filter_2.h5 vds_virt.h5 vds_src_[0-1].h5 \
+	swmr_data.h5 use_use_append_chunk.h5 use_append_mchunks.h5 \
+	use_disable_mdc_flushes.h5 flushrefresh.h5 \
+	flushrefresh_VERIFICATION_START \
+	flushrefresh_VERIFICATION_CHECKPOINT1 \
+	flushrefresh_VERIFICATION_CHECKPOINT2 \
+	flushrefresh_VERIFICATION_DONE atomic_data accum_swmr_big.h5 \
+	ohdr_swmr.h5 test_swmr*.h5 cache_logging.h5 vds_swmr.h5 \
+	vds_swmr_src_*.h5 earray_hdr_fd.h5
+
+# Test scripts--
+#       testerror.sh: err_compat, error_test
+#       testlibinfo.sh:
+#       testcheck_version.sh: tcheck_version
+#       tetlinks_env.sh: links_env
+#       testflushrefresh.sh: flushrefresh
+#       test_usecases.sh: use_append_chunk, use_append_mchunks, use_disable_mdc_flushes
+#       testswmr.sh: swmr*
+#       testvdsswmr.sh: vds_swmr*
 TEST_SCRIPT = testerror.sh testlibinfo.sh testcheck_version.sh \
-	testlinks_env.sh $(am__append_1)
+	testlinks_env.sh testswmr.sh testvdsswmr.sh \
+	testflushrefresh.sh test_usecases.sh $(am__append_1)
 SCRIPT_DEPEND = error_test$(EXEEXT) err_compat$(EXEEXT) \
-	links_env$(EXEEXT) $(am__append_2)
+	links_env$(EXEEXT) flushrefresh$(EXEEXT) \
+	use_append_chunk$(EXEEXT) use_append_mchunks$(EXEEXT) \
+	use_disable_mdc_flushes$(EXEEXT) swmr_generator$(EXEEXT) \
+	swmr_reader$(EXEEXT) swmr_writer$(EXEEXT) \
+	swmr_remove_reader$(EXEEXT) swmr_remove_writer$(EXEEXT) \
+	swmr_addrem_writer$(EXEEXT) swmr_sparse_reader$(EXEEXT) \
+	swmr_sparse_writer$(EXEEXT) swmr_start_write$(EXEEXT) \
+	vds_swmr_gen$(EXEEXT) vds_swmr_reader$(EXEEXT) \
+	vds_swmr_writer$(EXEEXT) $(am__append_2)
 check_SCRIPTS = $(TEST_SCRIPT)
 
 # These are our main targets. They should be listed in the order to be
 # executed, generally most specific tests to least specific tests.
 # As an exception, long-running tests should occur earlier in the list.
 # This gives them more time to run when tests are executing in parallel.
-# These tests (fheap, btree2) are under development and are not used by
-# the library yet. Move them to the end so that their failure do not block
-# other current library code tests.
-TEST_PROG = testhdf5 lheap ohdr stab gheap cache cache_api \
+TEST_PROG = testhdf5 cache cache_api cache_tagging lheap ohdr stab gheap \
+           farray earray btree2 fheap \
            pool accum hyperslab istore bittests dt_arith \
            dtypes dsets cmpd_dset filter_fail extend external efc objcopy links unlink \
-           big mtime fillval mount flush1 flush2 app_ref enum \
-           set_extent ttsafe \
+           twriteorder big mtime fillval mount flush1 flush2 app_ref enum \
+           set_extent ttsafe enc_dec_plist enc_dec_plist_cross_platform\
            getname vfd ntypes dangle dtransform reserved cross_read \
-           freespace mf btree2 fheap file_image unregister
+           freespace mf vds file_image unregister cache_logging cork swmr
 
 
 # These programs generate test files for the tests.  They don't need to be
@@ -1087,10 +1320,10 @@ TEST_PROG = testhdf5 lheap ohdr stab gheap cache cache_api \
 # --enable-build-all at configure time.
 # The gen_old_* files can only be compiled with older versions of the library
 # so do not appear in this list.
-BUILD_ALL_PROGS = gen_bad_ohdr gen_bogus gen_cross gen_deflate gen_filters gen_idx \
-    gen_new_array gen_new_fill gen_new_group gen_new_mtime gen_new_super \
-    gen_noencoder gen_nullspace gen_udlinks space_overflow gen_sizes_lheap \
-    gen_file_image
+BUILD_ALL_PROGS = gen_bad_ohdr gen_bogus gen_cross gen_deflate gen_filters gen_idx gen_new_array \
+    gen_new_fill gen_new_group gen_new_mtime gen_new_super gen_noencoder \
+    gen_nullspace gen_udlinks space_overflow gen_filespace gen_specmetaread \
+    gen_sizes_lheap gen_file_image gen_plist
 
 @HAVE_SHARED_CONDITIONAL_FALSE at noinst_LTLIBRARIES = libh5test.la
 @HAVE_SHARED_CONDITIONAL_TRUE at noinst_LTLIBRARIES = libh5test.la
@@ -1098,7 +1331,7 @@ BUILD_ALL_PROGS = gen_bad_ohdr gen_bogus gen_cross gen_deflate gen_filters gen_i
 @HAVE_SHARED_CONDITIONAL_TRUE at libdynlib1_la_SOURCES = dynlib1.c
 @HAVE_SHARED_CONDITIONAL_TRUE at libdynlib2_la_SOURCES = dynlib2.c
 @HAVE_SHARED_CONDITIONAL_TRUE at libdynlib3_la_SOURCES = dynlib3.c
-libh5test_la_SOURCES = h5test.c testframe.c cache_common.c
+libh5test_la_SOURCES = h5test.c testframe.c cache_common.c swmr_common.c
 
 # Use libhd5test.la to compile all of the tests
 LDADD = libh5test.la $(LIBHDF5)
@@ -1117,8 +1350,15 @@ testhdf5_SOURCES = testhdf5.c tarray.c tattr.c tchecksum.c tconfig.c tfile.c \
     tvlstr.c tvltypes.c
 
 
+# Sources for Use Cases
+use_append_chunk_SOURCES = use_append_chunk.c use_common.c
+use_append_mchunks_SOURCES = use_append_mchunks.c use_common.c
+use_disable_mdc_flushes_SOURCES = use_disable_mdc_flushes.c
+
 # Temporary files.
-DISTCLEANFILES = testerror.sh testlibinfo.sh testcheck_version.sh testlinks_env.sh test_plugin.sh
+DISTCLEANFILES = testerror.sh testlibinfo.sh testcheck_version.sh testlinks_env.sh test_plugin.sh \
+    testswmr.sh testvdsswmr.sh test_usecases.sh testflushrefresh.sh
+
 
 # Automake needs to be taught how to build lib, progs, and tests targets.
 # These will be filled in automatically for the most part (e.g.,
@@ -1155,7 +1395,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign test/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign test/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -1164,7 +1403,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -1178,14 +1417,22 @@ testcheck_version.sh: $(top_builddir)/config.status $(srcdir)/testcheck_version.
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 testerror.sh: $(top_builddir)/config.status $(srcdir)/testerror.sh.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+testflushrefresh.sh: $(top_builddir)/config.status $(srcdir)/testflushrefresh.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 H5srcdir_str.h: $(top_builddir)/config.status $(srcdir)/H5srcdir_str.h.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 testlibinfo.sh: $(top_builddir)/config.status $(srcdir)/testlibinfo.sh.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 testlinks_env.sh: $(top_builddir)/config.status $(srcdir)/testlinks_env.sh.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+testswmr.sh: $(top_builddir)/config.status $(srcdir)/testswmr.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 test_plugin.sh: $(top_builddir)/config.status $(srcdir)/test_plugin.sh.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+test_usecases.sh: $(top_builddir)/config.status $(srcdir)/test_usecases.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+testvdsswmr.sh: $(top_builddir)/config.status $(srcdir)/testvdsswmr.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 
 install-libLTLIBRARIES: $(lib_LTLIBRARIES)
 	@$(NORMAL_INSTALL)
@@ -1267,10 +1514,22 @@ accum$(EXEEXT): $(accum_OBJECTS) $(accum_DEPENDENCIES) $(EXTRA_accum_DEPENDENCIE
 	@rm -f accum$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(accum_OBJECTS) $(accum_LDADD) $(LIBS)
 
+accum_swmr_reader$(EXEEXT): $(accum_swmr_reader_OBJECTS) $(accum_swmr_reader_DEPENDENCIES) $(EXTRA_accum_swmr_reader_DEPENDENCIES) 
+	@rm -f accum_swmr_reader$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(accum_swmr_reader_OBJECTS) $(accum_swmr_reader_LDADD) $(LIBS)
+
 app_ref$(EXEEXT): $(app_ref_OBJECTS) $(app_ref_DEPENDENCIES) $(EXTRA_app_ref_DEPENDENCIES) 
 	@rm -f app_ref$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(app_ref_OBJECTS) $(app_ref_LDADD) $(LIBS)
 
+atomic_reader$(EXEEXT): $(atomic_reader_OBJECTS) $(atomic_reader_DEPENDENCIES) $(EXTRA_atomic_reader_DEPENDENCIES) 
+	@rm -f atomic_reader$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(atomic_reader_OBJECTS) $(atomic_reader_LDADD) $(LIBS)
+
+atomic_writer$(EXEEXT): $(atomic_writer_OBJECTS) $(atomic_writer_DEPENDENCIES) $(EXTRA_atomic_writer_DEPENDENCIES) 
+	@rm -f atomic_writer$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(atomic_writer_OBJECTS) $(atomic_writer_LDADD) $(LIBS)
+
 big$(EXEEXT): $(big_OBJECTS) $(big_DEPENDENCIES) $(EXTRA_big_DEPENDENCIES) 
 	@rm -f big$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(big_OBJECTS) $(big_LDADD) $(LIBS)
@@ -1291,10 +1550,22 @@ cache_api$(EXEEXT): $(cache_api_OBJECTS) $(cache_api_DEPENDENCIES) $(EXTRA_cache
 	@rm -f cache_api$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(cache_api_OBJECTS) $(cache_api_LDADD) $(LIBS)
 
+cache_logging$(EXEEXT): $(cache_logging_OBJECTS) $(cache_logging_DEPENDENCIES) $(EXTRA_cache_logging_DEPENDENCIES) 
+	@rm -f cache_logging$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(cache_logging_OBJECTS) $(cache_logging_LDADD) $(LIBS)
+
+cache_tagging$(EXEEXT): $(cache_tagging_OBJECTS) $(cache_tagging_DEPENDENCIES) $(EXTRA_cache_tagging_DEPENDENCIES) 
+	@rm -f cache_tagging$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(cache_tagging_OBJECTS) $(cache_tagging_LDADD) $(LIBS)
+
 cmpd_dset$(EXEEXT): $(cmpd_dset_OBJECTS) $(cmpd_dset_DEPENDENCIES) $(EXTRA_cmpd_dset_DEPENDENCIES) 
 	@rm -f cmpd_dset$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(cmpd_dset_OBJECTS) $(cmpd_dset_LDADD) $(LIBS)
 
+cork$(EXEEXT): $(cork_OBJECTS) $(cork_DEPENDENCIES) $(EXTRA_cork_DEPENDENCIES) 
+	@rm -f cork$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(cork_OBJECTS) $(cork_LDADD) $(LIBS)
+
 cross_read$(EXEEXT): $(cross_read_OBJECTS) $(cross_read_DEPENDENCIES) $(EXTRA_cross_read_DEPENDENCIES) 
 	@rm -f cross_read$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(cross_read_OBJECTS) $(cross_read_LDADD) $(LIBS)
@@ -1319,10 +1590,22 @@ dtypes$(EXEEXT): $(dtypes_OBJECTS) $(dtypes_DEPENDENCIES) $(EXTRA_dtypes_DEPENDE
 	@rm -f dtypes$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(dtypes_OBJECTS) $(dtypes_LDADD) $(LIBS)
 
+earray$(EXEEXT): $(earray_OBJECTS) $(earray_DEPENDENCIES) $(EXTRA_earray_DEPENDENCIES) 
+	@rm -f earray$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(earray_OBJECTS) $(earray_LDADD) $(LIBS)
+
 efc$(EXEEXT): $(efc_OBJECTS) $(efc_DEPENDENCIES) $(EXTRA_efc_DEPENDENCIES) 
 	@rm -f efc$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(efc_OBJECTS) $(efc_LDADD) $(LIBS)
 
+enc_dec_plist$(EXEEXT): $(enc_dec_plist_OBJECTS) $(enc_dec_plist_DEPENDENCIES) $(EXTRA_enc_dec_plist_DEPENDENCIES) 
+	@rm -f enc_dec_plist$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(enc_dec_plist_OBJECTS) $(enc_dec_plist_LDADD) $(LIBS)
+
+enc_dec_plist_cross_platform$(EXEEXT): $(enc_dec_plist_cross_platform_OBJECTS) $(enc_dec_plist_cross_platform_DEPENDENCIES) $(EXTRA_enc_dec_plist_cross_platform_DEPENDENCIES) 
+	@rm -f enc_dec_plist_cross_platform$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(enc_dec_plist_cross_platform_OBJECTS) $(enc_dec_plist_cross_platform_LDADD) $(LIBS)
+
 enum$(EXEEXT): $(enum_OBJECTS) $(enum_DEPENDENCIES) $(EXTRA_enum_DEPENDENCIES) 
 	@rm -f enum$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(enum_OBJECTS) $(enum_LDADD) $(LIBS)
@@ -1343,6 +1626,10 @@ external$(EXEEXT): $(external_OBJECTS) $(external_DEPENDENCIES) $(EXTRA_external
 	@rm -f external$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(external_OBJECTS) $(external_LDADD) $(LIBS)
 
+farray$(EXEEXT): $(farray_OBJECTS) $(farray_DEPENDENCIES) $(EXTRA_farray_DEPENDENCIES) 
+	@rm -f farray$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(farray_OBJECTS) $(farray_LDADD) $(LIBS)
+
 fheap$(EXEEXT): $(fheap_OBJECTS) $(fheap_DEPENDENCIES) $(EXTRA_fheap_DEPENDENCIES) 
 	@rm -f fheap$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(fheap_OBJECTS) $(fheap_LDADD) $(LIBS)
@@ -1367,6 +1654,10 @@ flush2$(EXEEXT): $(flush2_OBJECTS) $(flush2_DEPENDENCIES) $(EXTRA_flush2_DEPENDE
 	@rm -f flush2$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(flush2_OBJECTS) $(flush2_LDADD) $(LIBS)
 
+flushrefresh$(EXEEXT): $(flushrefresh_OBJECTS) $(flushrefresh_DEPENDENCIES) $(EXTRA_flushrefresh_DEPENDENCIES) 
+	@rm -f flushrefresh$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(flushrefresh_OBJECTS) $(flushrefresh_LDADD) $(LIBS)
+
 freespace$(EXEEXT): $(freespace_OBJECTS) $(freespace_DEPENDENCIES) $(EXTRA_freespace_DEPENDENCIES) 
 	@rm -f freespace$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(freespace_OBJECTS) $(freespace_LDADD) $(LIBS)
@@ -1391,6 +1682,10 @@ gen_file_image$(EXEEXT): $(gen_file_image_OBJECTS) $(gen_file_image_DEPENDENCIES
 	@rm -f gen_file_image$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(gen_file_image_OBJECTS) $(gen_file_image_LDADD) $(LIBS)
 
+gen_filespace$(EXEEXT): $(gen_filespace_OBJECTS) $(gen_filespace_DEPENDENCIES) $(EXTRA_gen_filespace_DEPENDENCIES) 
+	@rm -f gen_filespace$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(gen_filespace_OBJECTS) $(gen_filespace_LDADD) $(LIBS)
+
 gen_filters$(EXEEXT): $(gen_filters_OBJECTS) $(gen_filters_DEPENDENCIES) $(EXTRA_gen_filters_DEPENDENCIES) 
 	@rm -f gen_filters$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(gen_filters_OBJECTS) $(gen_filters_LDADD) $(LIBS)
@@ -1427,10 +1722,18 @@ gen_nullspace$(EXEEXT): $(gen_nullspace_OBJECTS) $(gen_nullspace_DEPENDENCIES) $
 	@rm -f gen_nullspace$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(gen_nullspace_OBJECTS) $(gen_nullspace_LDADD) $(LIBS)
 
+gen_plist$(EXEEXT): $(gen_plist_OBJECTS) $(gen_plist_DEPENDENCIES) $(EXTRA_gen_plist_DEPENDENCIES) 
+	@rm -f gen_plist$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(gen_plist_OBJECTS) $(gen_plist_LDADD) $(LIBS)
+
 gen_sizes_lheap$(EXEEXT): $(gen_sizes_lheap_OBJECTS) $(gen_sizes_lheap_DEPENDENCIES) $(EXTRA_gen_sizes_lheap_DEPENDENCIES) 
 	@rm -f gen_sizes_lheap$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(gen_sizes_lheap_OBJECTS) $(gen_sizes_lheap_LDADD) $(LIBS)
 
+gen_specmetaread$(EXEEXT): $(gen_specmetaread_OBJECTS) $(gen_specmetaread_DEPENDENCIES) $(EXTRA_gen_specmetaread_DEPENDENCIES) 
+	@rm -f gen_specmetaread$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(gen_specmetaread_OBJECTS) $(gen_specmetaread_LDADD) $(LIBS)
+
 gen_udlinks$(EXEEXT): $(gen_udlinks_OBJECTS) $(gen_udlinks_DEPENDENCIES) $(EXTRA_gen_udlinks_DEPENDENCIES) 
 	@rm -f gen_udlinks$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(gen_udlinks_OBJECTS) $(gen_udlinks_LDADD) $(LIBS)
@@ -1511,6 +1814,50 @@ stab$(EXEEXT): $(stab_OBJECTS) $(stab_DEPENDENCIES) $(EXTRA_stab_DEPENDENCIES)
 	@rm -f stab$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(stab_OBJECTS) $(stab_LDADD) $(LIBS)
 
+swmr$(EXEEXT): $(swmr_OBJECTS) $(swmr_DEPENDENCIES) $(EXTRA_swmr_DEPENDENCIES) 
+	@rm -f swmr$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(swmr_OBJECTS) $(swmr_LDADD) $(LIBS)
+
+swmr_addrem_writer$(EXEEXT): $(swmr_addrem_writer_OBJECTS) $(swmr_addrem_writer_DEPENDENCIES) $(EXTRA_swmr_addrem_writer_DEPENDENCIES) 
+	@rm -f swmr_addrem_writer$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(swmr_addrem_writer_OBJECTS) $(swmr_addrem_writer_LDADD) $(LIBS)
+
+swmr_check_compat_vfd$(EXEEXT): $(swmr_check_compat_vfd_OBJECTS) $(swmr_check_compat_vfd_DEPENDENCIES) $(EXTRA_swmr_check_compat_vfd_DEPENDENCIES) 
+	@rm -f swmr_check_compat_vfd$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(swmr_check_compat_vfd_OBJECTS) $(swmr_check_compat_vfd_LDADD) $(LIBS)
+
+swmr_generator$(EXEEXT): $(swmr_generator_OBJECTS) $(swmr_generator_DEPENDENCIES) $(EXTRA_swmr_generator_DEPENDENCIES) 
+	@rm -f swmr_generator$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(swmr_generator_OBJECTS) $(swmr_generator_LDADD) $(LIBS)
+
+swmr_reader$(EXEEXT): $(swmr_reader_OBJECTS) $(swmr_reader_DEPENDENCIES) $(EXTRA_swmr_reader_DEPENDENCIES) 
+	@rm -f swmr_reader$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(swmr_reader_OBJECTS) $(swmr_reader_LDADD) $(LIBS)
+
+swmr_remove_reader$(EXEEXT): $(swmr_remove_reader_OBJECTS) $(swmr_remove_reader_DEPENDENCIES) $(EXTRA_swmr_remove_reader_DEPENDENCIES) 
+	@rm -f swmr_remove_reader$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(swmr_remove_reader_OBJECTS) $(swmr_remove_reader_LDADD) $(LIBS)
+
+swmr_remove_writer$(EXEEXT): $(swmr_remove_writer_OBJECTS) $(swmr_remove_writer_DEPENDENCIES) $(EXTRA_swmr_remove_writer_DEPENDENCIES) 
+	@rm -f swmr_remove_writer$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(swmr_remove_writer_OBJECTS) $(swmr_remove_writer_LDADD) $(LIBS)
+
+swmr_sparse_reader$(EXEEXT): $(swmr_sparse_reader_OBJECTS) $(swmr_sparse_reader_DEPENDENCIES) $(EXTRA_swmr_sparse_reader_DEPENDENCIES) 
+	@rm -f swmr_sparse_reader$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(swmr_sparse_reader_OBJECTS) $(swmr_sparse_reader_LDADD) $(LIBS)
+
+swmr_sparse_writer$(EXEEXT): $(swmr_sparse_writer_OBJECTS) $(swmr_sparse_writer_DEPENDENCIES) $(EXTRA_swmr_sparse_writer_DEPENDENCIES) 
+	@rm -f swmr_sparse_writer$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(swmr_sparse_writer_OBJECTS) $(swmr_sparse_writer_LDADD) $(LIBS)
+
+swmr_start_write$(EXEEXT): $(swmr_start_write_OBJECTS) $(swmr_start_write_DEPENDENCIES) $(EXTRA_swmr_start_write_DEPENDENCIES) 
+	@rm -f swmr_start_write$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(swmr_start_write_OBJECTS) $(swmr_start_write_LDADD) $(LIBS)
+
+swmr_writer$(EXEEXT): $(swmr_writer_OBJECTS) $(swmr_writer_DEPENDENCIES) $(EXTRA_swmr_writer_DEPENDENCIES) 
+	@rm -f swmr_writer$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(swmr_writer_OBJECTS) $(swmr_writer_LDADD) $(LIBS)
+
 tcheck_version$(EXEEXT): $(tcheck_version_OBJECTS) $(tcheck_version_DEPENDENCIES) $(EXTRA_tcheck_version_DEPENDENCIES) 
 	@rm -f tcheck_version$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(tcheck_version_OBJECTS) $(tcheck_version_LDADD) $(LIBS)
@@ -1527,6 +1874,10 @@ ttsafe$(EXEEXT): $(ttsafe_OBJECTS) $(ttsafe_DEPENDENCIES) $(EXTRA_ttsafe_DEPENDE
 	@rm -f ttsafe$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(ttsafe_OBJECTS) $(ttsafe_LDADD) $(LIBS)
 
+twriteorder$(EXEEXT): $(twriteorder_OBJECTS) $(twriteorder_DEPENDENCIES) $(EXTRA_twriteorder_DEPENDENCIES) 
+	@rm -f twriteorder$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(twriteorder_OBJECTS) $(twriteorder_LDADD) $(LIBS)
+
 unlink$(EXEEXT): $(unlink_OBJECTS) $(unlink_DEPENDENCIES) $(EXTRA_unlink_DEPENDENCIES) 
 	@rm -f unlink$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(unlink_OBJECTS) $(unlink_LDADD) $(LIBS)
@@ -1535,6 +1886,34 @@ unregister$(EXEEXT): $(unregister_OBJECTS) $(unregister_DEPENDENCIES) $(EXTRA_un
 	@rm -f unregister$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(unregister_OBJECTS) $(unregister_LDADD) $(LIBS)
 
+use_append_chunk$(EXEEXT): $(use_append_chunk_OBJECTS) $(use_append_chunk_DEPENDENCIES) $(EXTRA_use_append_chunk_DEPENDENCIES) 
+	@rm -f use_append_chunk$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(use_append_chunk_OBJECTS) $(use_append_chunk_LDADD) $(LIBS)
+
+use_append_mchunks$(EXEEXT): $(use_append_mchunks_OBJECTS) $(use_append_mchunks_DEPENDENCIES) $(EXTRA_use_append_mchunks_DEPENDENCIES) 
+	@rm -f use_append_mchunks$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(use_append_mchunks_OBJECTS) $(use_append_mchunks_LDADD) $(LIBS)
+
+use_disable_mdc_flushes$(EXEEXT): $(use_disable_mdc_flushes_OBJECTS) $(use_disable_mdc_flushes_DEPENDENCIES) $(EXTRA_use_disable_mdc_flushes_DEPENDENCIES) 
+	@rm -f use_disable_mdc_flushes$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(use_disable_mdc_flushes_OBJECTS) $(use_disable_mdc_flushes_LDADD) $(LIBS)
+
+vds$(EXEEXT): $(vds_OBJECTS) $(vds_DEPENDENCIES) $(EXTRA_vds_DEPENDENCIES) 
+	@rm -f vds$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(vds_OBJECTS) $(vds_LDADD) $(LIBS)
+
+vds_swmr_gen$(EXEEXT): $(vds_swmr_gen_OBJECTS) $(vds_swmr_gen_DEPENDENCIES) $(EXTRA_vds_swmr_gen_DEPENDENCIES) 
+	@rm -f vds_swmr_gen$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(vds_swmr_gen_OBJECTS) $(vds_swmr_gen_LDADD) $(LIBS)
+
+vds_swmr_reader$(EXEEXT): $(vds_swmr_reader_OBJECTS) $(vds_swmr_reader_DEPENDENCIES) $(EXTRA_vds_swmr_reader_DEPENDENCIES) 
+	@rm -f vds_swmr_reader$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(vds_swmr_reader_OBJECTS) $(vds_swmr_reader_LDADD) $(LIBS)
+
+vds_swmr_writer$(EXEEXT): $(vds_swmr_writer_OBJECTS) $(vds_swmr_writer_DEPENDENCIES) $(EXTRA_vds_swmr_writer_DEPENDENCIES) 
+	@rm -f vds_swmr_writer$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(vds_swmr_writer_OBJECTS) $(vds_swmr_writer_LDADD) $(LIBS)
+
 vfd$(EXEEXT): $(vfd_OBJECTS) $(vfd_DEPENDENCIES) $(EXTRA_vfd_DEPENDENCIES) 
 	@rm -f vfd$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(vfd_OBJECTS) $(vfd_LDADD) $(LIBS)
@@ -1546,14 +1925,20 @@ distclean-compile:
 	-rm -f *.tab.c
 
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/accum.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/accum_swmr_reader.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/app_ref.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/atomic_reader.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/atomic_writer.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/big.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bittests.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/btree2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cache.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cache_api.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cache_common.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cache_logging.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cache_tagging.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cmpd_dset.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cork.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/cross_read.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dangle.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dsets.Po at am__quote@
@@ -1563,24 +1948,30 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dynlib1.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dynlib2.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/dynlib3.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/earray.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/efc.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/enc_dec_plist.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/enc_dec_plist_cross_platform.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/enum.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/err_compat.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/error_test.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/extend.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/external.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/farray.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fheap.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/file_image.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/fillval.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/filter_fail.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/flush1.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/flush2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/flushrefresh.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/freespace.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_bad_ohdr.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_bogus.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_cross.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_deflate.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_file_image.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_filespace.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_filters.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_idx.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_new_array.Po at am__quote@
@@ -1590,7 +1981,9 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_new_super.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_noencoder.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_nullspace.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_plist.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_sizes_lheap.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_specmetaread.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gen_udlinks.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/getname.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/gheap.Po at am__quote@
@@ -1612,6 +2005,18 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/set_extent.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/space_overflow.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/stab.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/swmr.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/swmr_addrem_writer.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/swmr_check_compat_vfd.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/swmr_common.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/swmr_generator.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/swmr_reader.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/swmr_remove_reader.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/swmr_remove_writer.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/swmr_sparse_reader.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/swmr_sparse_writer.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/swmr_start_write.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/swmr_writer.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tarray.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tattr.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tcheck_version.Po at am__quote@
@@ -1645,8 +2050,17 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tunicode.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tvlstr.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/tvltypes.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/twriteorder.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/unlink.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/unregister.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/use_append_chunk.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/use_append_mchunks.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/use_common.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/use_disable_mdc_flushes.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/vds.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/vds_swmr_gen.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/vds_swmr_reader.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/vds_swmr_writer.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/vfd.Po at am__quote@
 
 .c.o:
@@ -1758,7 +2172,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1865,6 +2279,27 @@ testhdf5.log: testhdf5$(EXEEXT)
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
+cache.log: cache$(EXEEXT)
+	@p='cache$(EXEEXT)'; \
+	b='cache'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+cache_api.log: cache_api$(EXEEXT)
+	@p='cache_api$(EXEEXT)'; \
+	b='cache_api'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+cache_tagging.log: cache_tagging$(EXEEXT)
+	@p='cache_tagging$(EXEEXT)'; \
+	b='cache_tagging'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
 lheap.log: lheap$(EXEEXT)
 	@p='lheap$(EXEEXT)'; \
 	b='lheap'; \
@@ -1893,16 +2328,30 @@ gheap.log: gheap$(EXEEXT)
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
-cache.log: cache$(EXEEXT)
-	@p='cache$(EXEEXT)'; \
-	b='cache'; \
+farray.log: farray$(EXEEXT)
+	@p='farray$(EXEEXT)'; \
+	b='farray'; \
 	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
-cache_api.log: cache_api$(EXEEXT)
-	@p='cache_api$(EXEEXT)'; \
-	b='cache_api'; \
+earray.log: earray$(EXEEXT)
+	@p='earray$(EXEEXT)'; \
+	b='earray'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+btree2.log: btree2$(EXEEXT)
+	@p='btree2$(EXEEXT)'; \
+	b='btree2'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+fheap.log: fheap$(EXEEXT)
+	@p='fheap$(EXEEXT)'; \
+	b='fheap'; \
 	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
@@ -2019,6 +2468,13 @@ unlink.log: unlink$(EXEEXT)
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
+twriteorder.log: twriteorder$(EXEEXT)
+	@p='twriteorder$(EXEEXT)'; \
+	b='twriteorder'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
 big.log: big$(EXEEXT)
 	@p='big$(EXEEXT)'; \
 	b='big'; \
@@ -2089,6 +2545,20 @@ ttsafe.log: ttsafe$(EXEEXT)
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
+enc_dec_plist.log: enc_dec_plist$(EXEEXT)
+	@p='enc_dec_plist$(EXEEXT)'; \
+	b='enc_dec_plist'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+enc_dec_plist_cross_platform.log: enc_dec_plist_cross_platform$(EXEEXT)
+	@p='enc_dec_plist_cross_platform$(EXEEXT)'; \
+	b='enc_dec_plist_cross_platform'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
 getname.log: getname$(EXEEXT)
 	@p='getname$(EXEEXT)'; \
 	b='getname'; \
@@ -2152,16 +2622,9 @@ mf.log: mf$(EXEEXT)
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
-btree2.log: btree2$(EXEEXT)
-	@p='btree2$(EXEEXT)'; \
-	b='btree2'; \
-	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
-	--log-file $$b.log --trs-file $$b.trs \
-	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
-	"$$tst" $(AM_TESTS_FD_REDIRECT)
-fheap.log: fheap$(EXEEXT)
-	@p='fheap$(EXEEXT)'; \
-	b='fheap'; \
+vds.log: vds$(EXEEXT)
+	@p='vds$(EXEEXT)'; \
+	b='vds'; \
 	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
@@ -2180,6 +2643,27 @@ unregister.log: unregister$(EXEEXT)
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
+cache_logging.log: cache_logging$(EXEEXT)
+	@p='cache_logging$(EXEEXT)'; \
+	b='cache_logging'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+cork.log: cork$(EXEEXT)
+	@p='cork$(EXEEXT)'; \
+	b='cork'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+swmr.log: swmr$(EXEEXT)
+	@p='swmr$(EXEEXT)'; \
+	b='swmr'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
 .sh.log:
 	@p='$<'; \
 	$(am__set_b); \
@@ -2361,6 +2845,8 @@ uninstall-am: uninstall-libLTLIBRARIES
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am \
 	uninstall-libLTLIBRARIES
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
@@ -2375,7 +2861,7 @@ help:
 
 @HAVE_SHARED_CONDITIONAL_TRUE@  # The libh5test library provides common support code for the tests.
 
- at HAVE_SHARED_CONDITIONAL_TRUE@  # The libdynlib1, libdynlib2, and libdynlib3 library for testing plugin module plugin.c.
+ at HAVE_SHARED_CONDITIONAL_TRUE@  # The libdynlib1 and libdynlib2 library for testing plugin module plugin.c.
 @HAVE_SHARED_CONDITIONAL_TRUE@  # Build it as shared library if configure is enabled for shared library.
 
 @HAVE_SHARED_CONDITIONAL_TRUE at install-exec-hook:
diff --git a/test/POSIX_Order_Write_Test_Report.docx b/test/POSIX_Order_Write_Test_Report.docx
new file mode 100644
index 0000000..cf6d1dc
Binary files /dev/null and b/test/POSIX_Order_Write_Test_Report.docx differ
diff --git a/test/SWMR_POSIX_Order_UG.txt b/test/SWMR_POSIX_Order_UG.txt
new file mode 100644
index 0000000..2771af1
--- /dev/null
+++ b/test/SWMR_POSIX_Order_UG.txt
@@ -0,0 +1,94 @@
+POSIX Write Order Test Instructions
+===================================
+
+Purpose
+-------
+This documents shows the requirments, implementaion design and instructions
+of building and running the POSIX Write Order test.  The name of the
+test is twriteorder and it resides in the test/ directory.
+
+Requirements
+------------
+The test is to verify that the write order is strictly consistent.
+The SWMR feature requires that the order of write is strictly consistent.
+"Strict consistency in computer science is the most stringent consistency
+model.  It says that a read operation has to return the result of the
+latest write operation which occurred on that data item."--
+(http://en.wikipedia.org/wiki/Linearizability#Definition_of_linearizability).
+This is also an alternative form of what POSIX write require that after a
+write operation has returned success, all reads issued afterward should
+get the same data the write has written.
+
+Implementation Design
+---------------------
+The test simulates what SWMR does by writing chained blocks and see if
+they can be read back correctly.
+There is a writer process and a read process.
+The file is divided into 2KB partitions. Then writer writes 1 chained
+block, each of 1KB big, in each partition after the first partition.
+Each chained block has this structure:
+Byte 0-3: offset address of its child block. The last child uses 0 as NULL.
+Byte 4-1023: some artificial data.
+The child block address of Block 1 is NULL (0).
+The child block address of Block 2 is the offset address of Block 1.
+The child block address of Block n is the offset address of Block n-1.
+After all n blocks are written, the offset address of Block n is written
+to the offset 0 of the first partition.
+Therefore, by the time the offset address of Block n is written to this
+position, all n chain-linked blocks have been written.
+
+The other reader processes will try to read the address value at the
+offset 0. The value is initially NULL(0). When it changes to non-zero,
+it signifies the writer process has written all the chain-link blocks
+and they are ready for the reader processes to access.
+
+If the system, in which the writer and reader processes run, the readers
+will always get all chain-linked blocks correctly. If the order of write
+is not maintained, some reader processes may found unexpect block data.
+
+Building the Tests
+------------------
+The name of the test is twriteorder in the test directory. It is added
+to the test suite and is built during the "make" process and is run by
+the test_usecases.sh test. Users may inspect test/test_usecases.sh.in
+to see the examples of testing.
+
+Running the Tests
+-----------------
+twriteorder test accepts the following options:
+$ ./twriteorder -h
+usage: twriteorder [OPTIONS]
+  OPTIONS
+     -h            Print a usage message and exit
+     -l w|r        launch writer or reader only. [default: launch both]
+     -b N          Block size [default: 1024]
+     -p N          Partition size [default: 2048]
+     -n N          Number of linked blocks [default: 512]
+
+More Examples
+-------------
+
+# run test with default parameters and launch both writer and reader
+#processes.
+$ twriteorder
+
+# run test with blocksize of 1000 bytes (default is 1024 bytes).
+$ twriteorder -b 1000
+
+# run test with partition size of 3000 bytes (default is 2048 bytes).
+$ twriteorder -p 3000
+
+# run test with 2000 linked blocks (default is 512 blocks).
+$ twriteorder -n 2000
+
+# Launch only the writer process.
+$ twriteorder -l w
+
+# Launch only the reader process.
+$ twriteorder -l r
+
+Note that if you want to launch the writer and the reader processes
+manually (for example in different machines sharing a common file system),
+you need to start the writer process (-l w) first, and then the reader
+process (-l r).
+
diff --git a/test/SWMR_UseCase_UG.txt b/test/SWMR_UseCase_UG.txt
new file mode 100644
index 0000000..e29944a
--- /dev/null
+++ b/test/SWMR_UseCase_UG.txt
@@ -0,0 +1,223 @@
+1. Title:
+     User Guide for SWMR Use Case Programs
+
+2. Purpose:
+     This is a User Guide of the SWMR Use Case programs. It descibes the use
+    case program and explain how to run them.
+
+2.1. Author and Dates:
+     Version 2: By Albert Cheng (acheng at hdfgroup.org), 2013/06/18.
+     Version 1: By Albert Cheng (acheng at hdfgroup.org), 2013/06/01.
+
+
+%%%%Use Case 1.7%%%%
+   
+3. Use Case [1.7]:
+     Appending a single chunk
+
+3.1. Program name:
+     use_append_chunk
+
+3.2. Description:
+     Appending a single chunk of raw data to a dataset along an unlimited
+     dimension within a pre-created file and reading the new data back.
+
+     It first creates one 3d dataset using chunked storage, each chunk
+     is a (1, chunksize, chunksize) square.  The dataset is (unlimited,
+     chunksize, chunksize). Data type is 2 bytes integer.  It starts out
+     "empty", i.e., first dimension is 0.
+
+     The writer then appends planes, each of (1,chunksize,chunksize)
+     to the dataset. Fills each plan with plane number and then writes
+     it at the nth plane. Increases the plane number and repeats till
+     the end of dataset, when it reaches chunksize long. End product is
+     a chunksize^3 cube.
+
+     The reader is a separated process, running in parallel with
+     the writer.  It reads planes from the dataset.  It expects the
+     dataset is being changed (growing). It checks the unlimited dimension
+     (dimension[0]). When it increases, it will read in the new planes, one
+     by one, and verify the data correctness.  (The nth plan should contain
+     all "n".) When the unlimited dimension grows to the chunksize (it
+     becomes a cube), that is the expected end of data, the reader exits.
+
+3.3. How to run the program:
+     Simplest way is
+     $ use_append_chunk
+
+     It creates a skeleton dataset (0,256,256) of shorts. Then fork off
+     a process, which becomes the reader process to read planes from the
+     dataset, while the original process continues as the writer process
+     to append planes onto the dataset.
+
+     Other possible options:
+
+     1. -z option: different chunksize. Default is 256.
+     $ use_append_chunk -z 1024
+
+     It uses (1,1024,1024) chunks to produce a 1024^3 cube, about 2GB big.
+
+
+     2. -f filename: different dataset file name
+     $ use_append_chunk -f /gpfs/tmp/append_data.h5
+
+     The data file is /gpfs/tmp/append_data.h5. This allows two independent
+     processes in separated compute nodes to access the datafile on the
+     shared /gpfs file system.
+
+
+     3. -l option: launch only the reader or writer process.
+     $ use_append_chunk -f /gpfs/tmp/append_data.h5 -l w   # in node X
+     $ use_append_chunk -f /gpfs/tmp/append_data.h5 -l r   # in node Y
+
+     In node X, launch the writer process, which creates the data file
+     and appends to it.
+     In node Y, launch the read process to read the data file.
+
+     Note that you need to time the read process to start AFTER the write
+     process has created the skeleton data file. Otherwise, the reader
+     will encounter errors such as data file not found.
+
+     4. -n option: number of planes to write/read. Default is same as the
+     chunk size as specified by option -z.
+     $ use_append_chunk -n 1000	# 1000 planes are writtern and read.
+
+     5. -s option: use SWMR file access mode or not. Default is yes.
+     $ use_append_chunk -s 0
+
+     It opens the HDF5 data file without the SWMR access mode (0 means
+     off). This likely will result in error. This option is provided for
+     users to see the effect of the neede SWMR access mode for concurrent
+     access.
+
+3.4. Test Shell Script:
+     The Use Case program is installed in the test/ directory and is
+     compiled as part of the make process. A test script (test_usecases.sh)
+     is installed in the same directory to test the use case programs. The
+     test script is rather basic and is more for demonstrating how to
+     use the program.
+
+
+%%%%Use Case 1.8%%%%
+
+4. Use Case [1.8]:
+     Appending a hyperslab of multiple chunks.
+
+4.1. Program name:
+     use_append_mchunks
+
+4.2. Description:
+     Appending a hyperslab that spans several chunks of a dataset with
+     unlimited dimensions within a pre-created file and reading the new
+     data back.
+
+     It first creates one 3d dataset using chunked storage, each chunk is a (1,
+     chunksize, chunksize) square.  The dataset is (unlimited, 2*chunksize,
+     2*chunksize). Data type is 2 bytes integer. Therefore, each plane
+     consists of 4 chunks.  It starts out "empty", i.e., first dimension is 0.
+
+     The writer then appends planes, each of (1,2*chunksize,2*chunksize)
+     to the dataset. Fills each plan with plane number and then writes
+     it at the nth plane. Increases the plane number and repeats till
+     the end of dataset, when it reaches chunksize long. End product is
+     a (2*chunksize)^3 cube.
+
+     The reader is a separated process, running in parallel with
+     the writer.  It reads planes from the dataset.  It expects the
+     dataset is being changed (growing). It checks the unlimited dimension
+     (dimension[0]). When it increases, it will read in the new planes, one
+     by one, and verify the data correctness.  (The nth plan should contain
+     all "n".) When the unlimited dimension grows to the 2*chunksize (it
+     becomes a cube), that is the expected end of data, the reader exits.
+
+4.3. How to run the program:
+     Simplest way is
+     $ use_append_mchunks
+
+     It creates a skeleton dataset (0,512,512) of shorts. Then fork off
+     a process, which becomes the reader process to read planes from the
+     dataset, while the original process continues as the writer process
+     to append planes onto the dataset.
+
+     Other possible options:
+
+     1. -z option: different chunksize. Default is 256.
+     $ use_append_mchunks -z 512
+
+     It uses (1,512,512) chunks to produce a 1024^3 cube, about 2GB big.
+
+
+     2. -f filename: different dataset file name
+     $ use_append_mchunks -f /gpfs/tmp/append_data.h5
+
+     The data file is /gpfs/tmp/append_data.h5. This allows two independent
+     processes in separated compute nodes to access the datafile on the
+     shared /gpfs file system.
+
+
+     3. -l option: launch only the reader or writer process.
+     $ use_append_mchunks -f /gpfs/tmp/append_data.h5 -l w   # in node X
+     $ use_append_mchunks -f /gpfs/tmp/append_data.h5 -l r   # in node Y
+
+     In node X, launch the writer process, which creates the data file
+     and appends to it.
+     In node Y, launch the read process to read the data file.
+
+     Note that you need to time the read process to start AFTER the write
+     process has created the skeleton data file. Otherwise, the reader
+     will encounter errors such as data file not found.
+
+     4. -n option: number of planes to write/read. Default is same as the
+     chunk size as specified by option -z.
+     $ use_append_mchunks -n 1000	# 1000 planes are writtern and read.
+
+     5. -s option: use SWMR file access mode or not. Default is yes.
+     $ use_append_mchunks -s 0
+
+     It opens the HDF5 data file without the SWMR access mode (0 means
+     off). This likely will result in error. This option is provided for
+     users to see the effect of the neede SWMR access mode for concurrent
+     access.
+
+4.4. Test Shell Script:
+     The Use Case program is installed in the test/ directory and is
+     compiled as part of the make process. A test script (test_usecases.sh)
+     is installed in the same directory to test the use case programs. The
+     test script is rather basic and is more for demonstrating how to
+     use the program.
+
+
+%%%%Use Case 1.9%%%%
+
+5. Use Case [1.9]:
+     Appending n-1 dimensional planes
+
+5.1. Program names:
+     use_append_chunk and use_append_mchunks
+
+5.2. Description:
+     Appending n-1 dimensional planes or regions to a chunked dataset where
+     the data does not fill the chunk.
+
+     This means the chunks have multiple planes and when a plane is written,
+     only one of the planes in each chunk is written. This use case is
+     achieved by extending the previous use cases 1.7 and 1.8 by defining the
+     chunks to have more than 1 plane.  The -y option is implemented for both
+     use_append_chunk and use_append_mchunks.
+
+5.3. How to run the program:
+     Simplest way is
+     $ use_append_mchunks -y 5
+
+     It creates a skeleton dataset (0,512,512), with storage chunks (5,512,512)
+     of shorts. It then proceeds like use case 1.8 by forking off a reader
+     process.  The original process continues as the writer process that
+     writes 1 plane at a time, updating parts of the chunks involved. The
+     reader reads 1 plane at a time, retrieving data from partial chunks.
+
+     The other possible options will work just like the two use cases.
+
+5.4. Test Shell Script:
+     Commands are added with -y options to demonstrate how the two use case
+     programs can be used as for this use case.
+
diff --git a/test/accum.c b/test/accum.c
index 651ba56..751e5df 100644
--- a/test/accum.c
+++ b/test/accum.c
@@ -17,14 +17,21 @@
  */
 #include "h5test.h"
 
-#define H5F_PACKAGE
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
+#define H5FD_FRIEND		/*suppress error about including H5FDpkg	  */
+#define H5FD_TESTING
 #include "H5Fpkg.h"
-#include "H5FDprivate.h"
+#include "H5FDpkg.h"
 #include "H5Iprivate.h"
 
 /* Filename */
 #define FILENAME "accum.h5"
 
+/* The file name is the same as the define in accum_swmr_reader.c */
+#define SWMR_FILENAME "accum_swmr_big.h5"
+/* The reader forked by test_swmr_write_big() */
+#define SWMR_READER "accum_swmr_reader"
+
 /* "big" I/O test values */
 #define BIG_BUF_SIZE (6 * 1024 * 1024)
 
@@ -50,6 +57,7 @@ unsigned test_read_after(const H5F_io_info_t *fio_info);
 unsigned test_free(const H5F_io_info_t *fio_info);
 unsigned test_big(const H5F_io_info_t *fio_info);
 unsigned test_random_write(const H5F_io_info_t *fio_info);
+unsigned test_swmr_write_big(hbool_t newest_format);
 
 /* Helper Function Prototypes */
 void accum_printf(void);
@@ -124,6 +132,10 @@ main(void)
     if(H5Fclose(fid) < 0) TEST_ERROR
     HDremove(FILENAME);
 
+    /* This test uses a different file */
+    nerrors += test_swmr_write_big(TRUE);
+    nerrors += test_swmr_write_big(FALSE);
+
     if(nerrors)
         goto error;
     puts("All metadata accumulator tests passed.");
@@ -164,7 +176,7 @@ test_write_read(const H5F_io_info_t *fio_info)
     /* Allocate buffers */
     write_buf = (int *)HDmalloc(1024 * sizeof(int));
     HDassert(write_buf);
-    read_buf = (int *)HDcalloc(1024, sizeof(int));
+    read_buf = (int *)HDcalloc((size_t)1024, sizeof(int));
     HDassert(read_buf);
 
     /* Fill buffer with data, zero out read buffer */
@@ -175,7 +187,7 @@ test_write_read(const H5F_io_info_t *fio_info)
     /* Write 1KB at Address 0 */
     if(accum_write(0, 1024, write_buf) < 0) FAIL_STACK_ERROR;
     if(accum_read(0, 1024, read_buf) < 0) FAIL_STACK_ERROR;
-    if(HDmemcmp(write_buf, read_buf, 1024) != 0) TEST_ERROR;
+    if(HDmemcmp(write_buf, read_buf, (size_t)1024) != 0) TEST_ERROR;
 
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
 
@@ -220,7 +232,7 @@ test_write_read_nonacc_front(const H5F_io_info_t *fio_info)
     /* Allocate buffers */
     write_buf = (int *)HDmalloc(2048 * sizeof(int));
     HDassert(write_buf);
-    read_buf = (int *)HDcalloc(2048, sizeof(int));
+    read_buf = (int *)HDcalloc((size_t)2048, sizeof(int));
     HDassert(read_buf);
 
     /* Fill buffer with data, zero out read buffer */
@@ -234,7 +246,7 @@ test_write_read_nonacc_front(const H5F_io_info_t *fio_info)
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
     if(accum_write(1024, 1024, write_buf) < 0) FAIL_STACK_ERROR;
     if(accum_read(0, 1024, read_buf) < 0) FAIL_STACK_ERROR;
-    if(HDmemcmp(write_buf, read_buf, 1024) != 0) TEST_ERROR;
+    if(HDmemcmp(write_buf, read_buf, (size_t)1024) != 0) TEST_ERROR;
 
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
 
@@ -279,7 +291,7 @@ test_write_read_nonacc_end(const H5F_io_info_t *fio_info)
     /* Allocate buffers */
     write_buf = (int *)HDmalloc(2048 * sizeof(int));
     HDassert(write_buf);
-    read_buf = (int *)HDcalloc(2048, sizeof(int));
+    read_buf = (int *)HDcalloc((size_t)2048, sizeof(int));
     HDassert(read_buf);
 
     /* Fill buffer with data, zero out read buffer */
@@ -293,7 +305,7 @@ test_write_read_nonacc_end(const H5F_io_info_t *fio_info)
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
     if(accum_write(0, 1024, write_buf) < 0) FAIL_STACK_ERROR;
     if(accum_read(1024, 1024, read_buf) < 0) FAIL_STACK_ERROR;
-    if(HDmemcmp(write_buf, read_buf, 1024) != 0) TEST_ERROR;
+    if(HDmemcmp(write_buf, read_buf, (size_t)1024) != 0) TEST_ERROR;
 
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
 
@@ -525,7 +537,7 @@ test_accum_overlap(const H5F_io_info_t *fio_info)
     /* Allocate buffers */
     wbuf = (int32_t *)HDmalloc(4096 * sizeof(int32_t));
     HDassert(wbuf);
-    rbuf = (int32_t *)HDcalloc(4096, sizeof(int32_t));
+    rbuf = (int32_t *)HDcalloc((size_t)4096, sizeof(int32_t));
     HDassert(rbuf);
 
     /* Case 1: No metadata in accumulator */
@@ -697,7 +709,7 @@ test_accum_overlap_clean(const H5F_io_info_t *fio_info)
     /* Allocate buffers */
     wbuf = (int32_t *)HDmalloc(4096 * sizeof(int32_t));
     HDassert(wbuf);
-    rbuf = (int32_t *)HDcalloc(4096, sizeof(int32_t));
+    rbuf = (int32_t *)HDcalloc((size_t)4096, sizeof(int32_t));
     HDassert(rbuf);
 
     /* Case 1: No metadata in accumulator */
@@ -876,7 +888,7 @@ test_accum_non_overlap_size(const H5F_io_info_t *fio_info)
     /* Allocate buffers */
     wbuf = (int *)HDmalloc(4096 * sizeof(int32_t));
     HDassert(wbuf);
-    rbuf = (int *)HDcalloc(4096, sizeof(int32_t));
+    rbuf = (int *)HDcalloc((size_t)4096, sizeof(int32_t));
     HDassert(rbuf);
 
     /* Case 1: No metadata in accumulator */
@@ -943,7 +955,7 @@ test_accum_overlap_size(const H5F_io_info_t *fio_info)
     /* Allocate buffers */
     wbuf = (int32_t *)HDmalloc(4096 * sizeof(int32_t));
     HDassert(wbuf);
-    rbuf = (int32_t *)HDcalloc(4096, sizeof(int32_t));
+    rbuf = (int32_t *)HDcalloc((size_t)4096, sizeof(int32_t));
     HDassert(rbuf);
 
     /* Case 1: No metadata in accumulator */
@@ -1050,11 +1062,11 @@ test_accum_adjust(const H5F_io_info_t *fio_info)
 
     /* Read back and verify first write */
     if(accum_read((1024 * 1024), (1024 * 1024) - 1, rbuf) < 0) FAIL_STACK_ERROR;
-    if(HDmemcmp(wbuf, rbuf, (1024 * 1024) - 1) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf, rbuf, (size_t)((1024 * 1024) - 1)) != 0) TEST_ERROR;
 
     /* Read back and verify second write */
     if(accum_read((1024 * 1024) - 1024, 1024, rbuf) < 0) FAIL_STACK_ERROR;
-    if(HDmemcmp(wbuf, rbuf, 1024) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf, rbuf, (size_t)1024) != 0) TEST_ERROR;
     
     /* Reset accumulator for next case */
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
@@ -1080,10 +1092,10 @@ test_accum_adjust(const H5F_io_info_t *fio_info)
 
     /* Read back and verify both pieces of data */
     if(accum_read(1048576, 1048575, rbuf) < 0) FAIL_STACK_ERROR;
-    if(HDmemcmp(wbuf, rbuf, 1048576) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf, rbuf, (size_t)1048576) != 0) TEST_ERROR;
 
     if(accum_read(5, 1048571, rbuf) < 0) FAIL_STACK_ERROR;
-    if(HDmemcmp(wbuf, rbuf, 1048571) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf, rbuf, (size_t)1048571) != 0) TEST_ERROR;
 
     /* Reset accumulator for next case */
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
@@ -1118,7 +1130,7 @@ test_accum_adjust(const H5F_io_info_t *fio_info)
     /* Read in the piece we wrote to disk above, and then verify that 
         the data is as expected */
     if(accum_read((1024 * 1024) - 1, 1024, rbuf) < 0) FAIL_STACK_ERROR;
-    if(HDmemcmp(wbuf, rbuf, 1024) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf, rbuf, (size_t)1024) != 0) TEST_ERROR;
 
     /* Reset accumulator for next case */
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
@@ -1158,7 +1170,7 @@ test_accum_adjust(const H5F_io_info_t *fio_info)
     /* Read in the piece we wrote to disk above, and then verify that 
         the data is as expected */
     if(accum_read(1048571, 349523, rbuf) < 0) FAIL_STACK_ERROR;
-    if(HDmemcmp(wbuf, rbuf, 349523) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf, rbuf, (size_t)349523) != 0) TEST_ERROR;
 
     /* Reset accumulator for next case */
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
@@ -1195,7 +1207,7 @@ test_accum_adjust(const H5F_io_info_t *fio_info)
     /* Read in the piece we wrote to disk above, and then verify that 
         the data is as expected */
     if(accum_read((1024 * 1024) - 5, 10, rbuf) < 0) FAIL_STACK_ERROR;
-    if(HDmemcmp(wbuf, rbuf, 10) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf, rbuf, (size_t)10) != 0) TEST_ERROR;
 
     /* Reset accumulator for next case */
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
@@ -1227,7 +1239,7 @@ test_accum_adjust(const H5F_io_info_t *fio_info)
     /* Read in the piece we wrote to disk above, and then verify that 
         the data is as expected */
     if(accum_read(1048571, 349523, rbuf) < 0) FAIL_STACK_ERROR;
-    if(HDmemcmp(wbuf, rbuf, 349523) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf, rbuf, (size_t)349523) != 0) TEST_ERROR;
 
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
 
@@ -1310,7 +1322,7 @@ test_read_after(const H5F_io_info_t *fio_info)
     /* Read in the piece we wrote to disk above, and then verify that 
         the data is as expected */
     if(accum_read(512, 512, rbuf) < 0) FAIL_STACK_ERROR;
-    if(HDmemcmp(wbuf, rbuf, 128) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf, rbuf, (size_t)128) != 0) TEST_ERROR;
 
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
 
@@ -1352,13 +1364,13 @@ test_big(const H5F_io_info_t *fio_info)
     unsigned u;                         /* Local index variable */
 
     /* Allocate space for the write & read buffers */
-    wbuf = (uint8_t *)HDmalloc(BIG_BUF_SIZE);
+    wbuf = (uint8_t *)HDmalloc((size_t)BIG_BUF_SIZE);
     HDassert(wbuf);
-    wbuf2 = (uint8_t *)HDmalloc(BIG_BUF_SIZE);
+    wbuf2 = (uint8_t *)HDmalloc((size_t)BIG_BUF_SIZE);
     HDassert(wbuf2);
-    rbuf = (uint8_t *)HDcalloc(BIG_BUF_SIZE + 1536, 1);
+    rbuf = (uint8_t *)HDcalloc((size_t)(BIG_BUF_SIZE + 1536), (size_t)1);
     HDassert(rbuf);
-    zbuf = (uint8_t *)HDcalloc(BIG_BUF_SIZE + 1536, 1);
+    zbuf = (uint8_t *)HDcalloc((size_t)(BIG_BUF_SIZE + 1536), (size_t)1);
     HDassert(zbuf);
 
     /* Initialize write buffers */
@@ -1376,12 +1388,12 @@ test_big(const H5F_io_info_t *fio_info)
     if(accum_read(0, BIG_BUF_SIZE, rbuf) < 0) FAIL_STACK_ERROR;
 
     /* Verify data read */
-    if(HDmemcmp(wbuf, rbuf, BIG_BUF_SIZE) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf, rbuf, (size_t)BIG_BUF_SIZE) != 0) TEST_ERROR;
 
 
     /* Reset data in file back to zeros & reset the read buffer */
     if(accum_write(0, BIG_BUF_SIZE, zbuf) < 0) FAIL_STACK_ERROR;
-    HDmemset(rbuf, 0, BIG_BUF_SIZE);
+    HDmemset(rbuf, 0, (size_t)BIG_BUF_SIZE);
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
 
 
@@ -1393,14 +1405,14 @@ test_big(const H5F_io_info_t *fio_info)
     if(accum_read(0, BIG_BUF_SIZE, rbuf) < 0) FAIL_STACK_ERROR;
 
     /* Verify data read */
-    if(HDmemcmp(zbuf, rbuf, 1024) != 0) TEST_ERROR;
-    if(HDmemcmp(wbuf, rbuf + 1024, 1024) != 0) TEST_ERROR;
-    if(HDmemcmp(zbuf, rbuf + 2048, (BIG_BUF_SIZE - 2048)) != 0) TEST_ERROR;
+    if(HDmemcmp(zbuf, rbuf, (size_t)1024) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf, rbuf + 1024, (size_t)1024) != 0) TEST_ERROR;
+    if(HDmemcmp(zbuf, rbuf + 2048, (size_t)(BIG_BUF_SIZE - 2048)) != 0) TEST_ERROR;
 
 
     /* Reset data in file back to zeros & reset the read buffer */
     if(accum_write(1024, 1024, zbuf) < 0) FAIL_STACK_ERROR;
-    HDmemset(rbuf, 0, BIG_BUF_SIZE);
+    HDmemset(rbuf, 0, (size_t)BIG_BUF_SIZE);
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
 
 
@@ -1412,13 +1424,13 @@ test_big(const H5F_io_info_t *fio_info)
     if(accum_read(0, BIG_BUF_SIZE, rbuf) < 0) FAIL_STACK_ERROR;
 
     /* Verify data read */
-    if(HDmemcmp(zbuf, rbuf, (BIG_BUF_SIZE - 512)) != 0) TEST_ERROR;
-    if(HDmemcmp(wbuf, rbuf + (BIG_BUF_SIZE - 512), 512) != 0) TEST_ERROR;
+    if(HDmemcmp(zbuf, rbuf, (size_t)(BIG_BUF_SIZE - 512)) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf, rbuf + (BIG_BUF_SIZE - 512), (size_t)512) != 0) TEST_ERROR;
 
 
     /* Reset data in file back to zeros & reset the read buffer */
     if(accum_write(BIG_BUF_SIZE - 512, 1024, zbuf) < 0) FAIL_STACK_ERROR;
-    HDmemset(rbuf, 0, BIG_BUF_SIZE);
+    HDmemset(rbuf, 0, (size_t)BIG_BUF_SIZE);
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
 
 
@@ -1430,13 +1442,13 @@ test_big(const H5F_io_info_t *fio_info)
     if(accum_read(512, BIG_BUF_SIZE, rbuf) < 0) FAIL_STACK_ERROR;
 
     /* Verify data read */
-    if(HDmemcmp(wbuf + 512, rbuf, 512) != 0) TEST_ERROR;
-    if(HDmemcmp(zbuf, rbuf + 512, (BIG_BUF_SIZE - 512)) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf + 512, rbuf, (size_t)512) != 0) TEST_ERROR;
+    if(HDmemcmp(zbuf, rbuf + 512, (size_t)(BIG_BUF_SIZE - 512)) != 0) TEST_ERROR;
 
 
     /* Reset data in file back to zeros & reset the read buffer */
     if(accum_write(0, 1024, zbuf) < 0) FAIL_STACK_ERROR;
-    HDmemset(rbuf, 0, BIG_BUF_SIZE);
+    HDmemset(rbuf, 0, (size_t)BIG_BUF_SIZE);
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
 
 
@@ -1453,12 +1465,12 @@ test_big(const H5F_io_info_t *fio_info)
     if(accum_read(0, BIG_BUF_SIZE, rbuf) < 0) FAIL_STACK_ERROR;
 
     /* Verify data read */
-    if(HDmemcmp(wbuf2, rbuf, BIG_BUF_SIZE) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf2, rbuf, (size_t)BIG_BUF_SIZE) != 0) TEST_ERROR;
 
 
     /* Reset data in file back to zeros & reset the read buffer */
     if(accum_write(0, BIG_BUF_SIZE, zbuf) < 0) FAIL_STACK_ERROR;
-    HDmemset(rbuf, 0, BIG_BUF_SIZE);
+    HDmemset(rbuf, 0, (size_t)BIG_BUF_SIZE);
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
 
 
@@ -1475,13 +1487,13 @@ test_big(const H5F_io_info_t *fio_info)
     if(accum_read(0, BIG_BUF_SIZE + 512, rbuf) < 0) FAIL_STACK_ERROR;
 
     /* Verify data read */
-    if(HDmemcmp(wbuf2, rbuf, BIG_BUF_SIZE) != 0) TEST_ERROR;
-    if(HDmemcmp(wbuf + 512, rbuf + BIG_BUF_SIZE, 512) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf2, rbuf, (size_t)BIG_BUF_SIZE) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf + 512, rbuf + BIG_BUF_SIZE, (size_t)512) != 0) TEST_ERROR;
 
 
     /* Reset data in file back to zeros & reset the read buffer */
     if(accum_write(0, BIG_BUF_SIZE + 512, zbuf) < 0) FAIL_STACK_ERROR;
-    HDmemset(rbuf, 0, BIG_BUF_SIZE + 512);
+    HDmemset(rbuf, 0, (size_t)(BIG_BUF_SIZE + 512));
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
 
 
@@ -1502,14 +1514,14 @@ test_big(const H5F_io_info_t *fio_info)
     if(accum_read(0, BIG_BUF_SIZE + 1024, rbuf) < 0) FAIL_STACK_ERROR;
 
     /* Verify data read */
-    if(HDmemcmp(wbuf2, rbuf, BIG_BUF_SIZE) != 0) TEST_ERROR;
-    if(HDmemcmp(zbuf, rbuf + BIG_BUF_SIZE, 512) != 0) TEST_ERROR;
-    if(HDmemcmp(wbuf, rbuf + BIG_BUF_SIZE + 512, 512) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf2, rbuf, (size_t)BIG_BUF_SIZE) != 0) TEST_ERROR;
+    if(HDmemcmp(zbuf, rbuf + BIG_BUF_SIZE, (size_t)512) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf, rbuf + BIG_BUF_SIZE + 512, (size_t)512) != 0) TEST_ERROR;
 
 
     /* Reset data in file back to zeros & reset the read buffer */
     if(accum_write(0, BIG_BUF_SIZE + 1536, zbuf) < 0) FAIL_STACK_ERROR;
-    HDmemset(rbuf, 0, BIG_BUF_SIZE + 1024);
+    HDmemset(rbuf, 0, (size_t)(BIG_BUF_SIZE + 1024));
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
 
 
@@ -1531,13 +1543,13 @@ test_big(const H5F_io_info_t *fio_info)
     if(accum_read(0, BIG_BUF_SIZE + 1536, rbuf) < 0) FAIL_STACK_ERROR;
 
     /* Verify data read */
-    if(HDmemcmp(zbuf, rbuf, 1536) != 0) TEST_ERROR;
-    if(HDmemcmp(wbuf2, rbuf + 1536, BIG_BUF_SIZE) != 0) TEST_ERROR;
+    if(HDmemcmp(zbuf, rbuf, (size_t)1536) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf2, rbuf + 1536, (size_t)BIG_BUF_SIZE) != 0) TEST_ERROR;
 
 
     /* Reset data in file back to zeros & reset the read buffer */
     if(accum_write(1536, BIG_BUF_SIZE, zbuf) < 0) FAIL_STACK_ERROR;
-    HDmemset(rbuf, 0, BIG_BUF_SIZE + 1536);
+    HDmemset(rbuf, 0, (size_t)(BIG_BUF_SIZE + 1536));
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
 
 
@@ -1558,13 +1570,13 @@ test_big(const H5F_io_info_t *fio_info)
     if(accum_read(0, BIG_BUF_SIZE + 512, rbuf) < 0) FAIL_STACK_ERROR;
 
     /* Verify data read */
-    if(HDmemcmp(zbuf, rbuf, 512) != 0) TEST_ERROR;
-    if(HDmemcmp(wbuf2, rbuf + 512, BIG_BUF_SIZE) != 0) TEST_ERROR;
+    if(HDmemcmp(zbuf, rbuf, (size_t)512) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf2, rbuf + 512, (size_t)BIG_BUF_SIZE) != 0) TEST_ERROR;
 
 
     /* Reset data in file back to zeros & reset the read buffer */
     if(accum_write(512, BIG_BUF_SIZE, zbuf) < 0) FAIL_STACK_ERROR;
-    HDmemset(rbuf, 0, BIG_BUF_SIZE + 512);
+    HDmemset(rbuf, 0, (size_t)(BIG_BUF_SIZE + 512));
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
 
 
@@ -1585,14 +1597,14 @@ test_big(const H5F_io_info_t *fio_info)
     if(accum_read(0, BIG_BUF_SIZE + 1536, rbuf) < 0) FAIL_STACK_ERROR;
 
     /* Verify data read */
-    if(HDmemcmp(wbuf, rbuf, 1024) != 0) TEST_ERROR;
-    if(HDmemcmp(zbuf, rbuf + 1024, 512) != 0) TEST_ERROR;
-    if(HDmemcmp(wbuf2, rbuf + 1536, BIG_BUF_SIZE) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf, rbuf, (size_t)1024) != 0) TEST_ERROR;
+    if(HDmemcmp(zbuf, rbuf + 1024, (size_t)512) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf2, rbuf + 1536, (size_t)BIG_BUF_SIZE) != 0) TEST_ERROR;
 
 
     /* Reset data in file back to zeros & reset the read buffer */
     if(accum_write(0, BIG_BUF_SIZE + 1536, zbuf) < 0) FAIL_STACK_ERROR;
-    HDmemset(rbuf, 0, BIG_BUF_SIZE + 1536);
+    HDmemset(rbuf, 0, (size_t)(BIG_BUF_SIZE + 1536));
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
 
 
@@ -1613,8 +1625,8 @@ test_big(const H5F_io_info_t *fio_info)
     if(accum_read(0, BIG_BUF_SIZE + 512, rbuf) < 0) FAIL_STACK_ERROR;
 
     /* Verify data read */
-    if(HDmemcmp(wbuf, rbuf, 512) != 0) TEST_ERROR;
-    if(HDmemcmp(wbuf2, rbuf + 512, BIG_BUF_SIZE) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf, rbuf, (size_t)512) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf2, rbuf + 512, (size_t)BIG_BUF_SIZE) != 0) TEST_ERROR;
 
 
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
@@ -1666,9 +1678,9 @@ test_random_write(const H5F_io_info_t *fio_info)
     unsigned u;                 /* Local index variable */
 
     /* Allocate space for the write & read buffers */
-    wbuf = (uint8_t *)malloc(RANDOM_BUF_SIZE);
+    wbuf = (uint8_t *)HDmalloc((size_t)RANDOM_BUF_SIZE);
     HDassert(wbuf);
-    rbuf = (uint8_t *)calloc(RANDOM_BUF_SIZE, 1);
+    rbuf = (uint8_t *)HDcalloc((size_t)RANDOM_BUF_SIZE, (size_t)1);
     HDassert(rbuf);
 
     /* Initialize write buffer */
@@ -1686,9 +1698,9 @@ HDfprintf(stderr, "Random # seed was: %u\n", seed);
     HDsrandom(seed);
 
     /* Allocate space for the segment length buffer */
-    off = (size_t *)malloc(MAX_RANDOM_SEGMENTS * sizeof(size_t));
+    off = (size_t *)HDmalloc(MAX_RANDOM_SEGMENTS * sizeof(size_t));
     HDassert(off);
-    len = (size_t *)malloc(MAX_RANDOM_SEGMENTS * sizeof(size_t));
+    len = (size_t *)HDmalloc(MAX_RANDOM_SEGMENTS * sizeof(size_t));
     HDassert(len);
 
     /* Randomly choose lengths of segments */
@@ -1752,7 +1764,7 @@ HDfprintf(stderr, "Random # seed was: %u\n", seed);
     if(accum_read(RANDOM_BASE_OFF, RANDOM_BUF_SIZE, rbuf) < 0) FAIL_STACK_ERROR;
 
     /* Verify data read back in */
-    if(HDmemcmp(wbuf, rbuf, RANDOM_BUF_SIZE) != 0) TEST_ERROR;
+    if(HDmemcmp(wbuf, rbuf, (size_t)RANDOM_BUF_SIZE) != 0) TEST_ERROR;
 
     if(accum_reset(fio_info) < 0) FAIL_STACK_ERROR;
 
@@ -1777,6 +1789,216 @@ error:
     return 1;
 } /* end test_random_write() */
 
+/*-------------------------------------------------------------------------
+ * Function:    test_swmr_write_big
+ * 
+ * Purpose:    	A SWMR test: verifies that writing "large" metadata to a file
+ *		opened with SWMR_WRITE will flush the existing metadata in the 
+ *		accumulator to disk first before writing the "large" metadata
+ *	 	to disk.  
+ *		This test will fork and exec a reader "accum_swmr_reader" which
+ *		opens the same file with SWMR_READ and verifies that the correct
+ *		metadata is read from disk.
+ * 
+ * Return:      Success: 0
+ *              Failure: 1
+ * 
+ * Programmer:  Vailin Choi; April 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+unsigned 
+test_swmr_write_big(hbool_t newest_format)
+{
+    hid_t fid = -1;			    /* File ID */
+    hid_t fapl = -1;			/* File access property list */
+    H5F_t *rf = NULL;			/* File pointer */
+    uint8_t *wbuf2 = NULL, *rbuf = NULL;      /* Buffers for reading & writing */
+    uint8_t wbuf[1024];			/* Buffer for reading & writing */
+    unsigned u;                 /* Local index variable */
+#ifdef H5_HAVE_UNISTD_H
+    pid_t pid;				    /* Process ID */
+#endif /* H5_HAVE_UNISTD_H */
+    int status;				    /* Status returned from child process */
+    H5F_io_info_t fio_info;     /* I/O info for operation */
+    char *new_argv[] = {NULL};
+    char *driver = NULL;        /* VFD string (from env variable) */
+
+    if(newest_format) {
+	    TESTING("SWMR write of large metadata: with latest format");
+    } else {
+	    TESTING("SWMR write of large metadata: with non-latest-format");
+    } /* end if */
+
+#if !(defined(H5_HAVE_FORK) && defined(H5_HAVE_WAITPID))
+
+    SKIPPED();
+    HDputs("    Test skipped due to fork or waitpid not defined.");
+    return 0;
+
+#else /* defined(H5_HAVE_FORK && defined(H5_HAVE_WAITPID) */
+
+    /* Skip this test if SWMR I/O is not supported for the VFD specified
+     * by the environment variable.
+     */
+    driver = HDgetenv("HDF5_DRIVER");
+    if (!H5FD_supports_swmr_test(driver)) {
+        SKIPPED();
+        HDputs("    Test skipped due to VFD not supporting SWMR I/O.");
+        return 0;
+    } /* end if */
+
+    /* File access property list */
+    if((fapl = h5_fileaccess()) < 0)
+        FAIL_STACK_ERROR
+
+    /* Both cases will result in v3 superblock and version 2 object header for SWMR */
+    if(newest_format) { /* latest format */
+        if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+            FAIL_STACK_ERROR
+
+	if((fid = H5Fcreate(SWMR_FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+	    FAIL_STACK_ERROR
+    } else { /* non-latest-format */
+        if((fid = H5Fcreate(SWMR_FILENAME, H5F_ACC_TRUNC|H5F_ACC_SWMR_WRITE, H5P_DEFAULT, fapl)) < 0)
+            FAIL_STACK_ERROR
+    } /* end if */
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the file with SWMR_WRITE */
+    if((fid = H5Fopen(SWMR_FILENAME, H5F_ACC_RDWR | H5F_ACC_SWMR_WRITE, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get H5F_t * to internal file structure */
+    if(NULL == (rf = (H5F_t *)H5I_object(fid))) FAIL_STACK_ERROR
+
+    /* Set up I/O info for operation */
+    fio_info.f = rf;
+    if(NULL == (fio_info.dxpl = (H5P_genplist_t *)H5I_object(H5P_DATASET_XFER_DEFAULT)))
+        FAIL_STACK_ERROR
+
+    /* We'll be writing lots of garbage data, so extend the
+        file a ways. 10MB should do. */
+    if(H5FD_set_eoa(rf->shared->lf, H5FD_MEM_DEFAULT, (haddr_t)(1024*1024*10)) < 0)
+        FAIL_STACK_ERROR
+
+    if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Reset metadata accumulator for the file */
+    if(accum_reset(&fio_info) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Allocate space for the write & read buffers */
+    if((wbuf2 = (uint8_t *)HDmalloc((size_t)BIG_BUF_SIZE)) == NULL)
+	    FAIL_STACK_ERROR;
+    if((rbuf = (uint8_t *)HDmalloc((size_t)BIG_BUF_SIZE)) == NULL)
+	    FAIL_STACK_ERROR;
+
+    /* Initialize wbuf with "0, 1, 2...1024"*/
+    for(u = 0; u < 1024; u++)
+        wbuf[u] = (uint8_t)u;
+
+    /* Write [1024, 1024] bytes with wbuf */
+    if(H5F_block_write(rf, H5FD_MEM_DEFAULT, (haddr_t)1024, (size_t)1024, H5P_DATASET_XFER_DEFAULT, wbuf) < 0)
+	    FAIL_STACK_ERROR;
+    /* Read the data */
+    if(H5F_block_read(rf, H5FD_MEM_DEFAULT, (haddr_t)1024, (size_t)1024, H5P_DATASET_XFER_DEFAULT, rbuf) < 0)
+	    FAIL_STACK_ERROR;
+    /* Verify the data read is correct */
+    if(HDmemcmp(wbuf, rbuf, (size_t)1024) != 0)
+        TEST_ERROR;
+    /* Flush the data to disk */
+    if(accum_reset(&fio_info) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Initialize wbuf with all 1s */
+    for(u = 0; u < 1024; u++)
+        wbuf[u] = (uint8_t)1;
+
+    /* Initialize wbuf2 */
+    for(u = 0; u < BIG_BUF_SIZE; u++)
+        wbuf2[u] = (uint8_t)(u + 1);
+
+    /* Write [1024,1024] with wbuf--all 1s */
+    if(H5F_block_write(rf, H5FD_MEM_DEFAULT, (haddr_t)1024, (size_t)1024, H5P_DATASET_XFER_DEFAULT, wbuf) < 0)
+	    FAIL_STACK_ERROR;
+    /* Read the data */
+    if(H5F_block_read(rf, H5FD_MEM_DEFAULT, (haddr_t)1024, (size_t)1024, H5P_DATASET_XFER_DEFAULT, rbuf) < 0)
+	    FAIL_STACK_ERROR;
+    /* Verify the data read is correct */
+    if(HDmemcmp(wbuf, rbuf, (size_t)1024) != 0)
+        TEST_ERROR;
+    /* The data stays in the accumulator */
+
+    /* Write a large piece of metadata [2048, BIG_BUF_SIZE] with wbuf2 */
+    if(H5F_block_write(rf, H5FD_MEM_DEFAULT, (haddr_t)2048, (size_t)BIG_BUF_SIZE, H5P_DATASET_XFER_DEFAULT, wbuf2) < 0)
+	    FAIL_STACK_ERROR;
+    /* Read the data */
+    if(H5F_block_read(rf, H5FD_MEM_DEFAULT, (haddr_t)2048, (size_t)BIG_BUF_SIZE, H5P_DATASET_XFER_DEFAULT, rbuf) < 0)
+	    FAIL_STACK_ERROR;
+    /* Verify the data read is correct */
+    if(HDmemcmp(wbuf2, rbuf, (size_t)BIG_BUF_SIZE) != 0)
+        TEST_ERROR;
+
+    /* Fork child process to verify that the data at [1024, 2014] does get written to disk */
+    if((pid = HDfork()) < 0) {
+        HDperror("fork");
+        FAIL_STACK_ERROR;
+    } else if(0 == pid) { /* Child process */
+	    /* Run the reader */
+	    status = HDexecv(SWMR_READER, new_argv);
+	    printf("errno from execv = %s\n", strerror(errno));
+        FAIL_STACK_ERROR;
+    } /* end if */
+
+    /* Parent process -- wait for the child process to complete */
+    while(pid != HDwaitpid(pid, &status, 0))
+        /*void*/;
+
+    /* Check if child process terminates normally and its return value */
+    if(WIFEXITED(status) && !WEXITSTATUS(status)) {
+	    /* Flush the accumulator */
+	    if(accum_reset(&fio_info) < 0)
+            FAIL_STACK_ERROR;
+	    /* Close the property list */
+	    if(H5Pclose(fapl) < 0) 
+	        FAIL_STACK_ERROR;
+
+	    /* Close and remove the file */
+	    if(H5Fclose(fid) < 0) 
+	        FAIL_STACK_ERROR;
+	    HDremove(SWMR_FILENAME);
+
+        /* Release memory */
+        if(wbuf2)
+            HDfree(wbuf2);
+        if(rbuf)
+            HDfree(rbuf);
+        PASSED();
+        return 0;
+    } /* end if */
+
+error:
+    /* Closing and remove the file */
+    H5Pclose(fapl);
+    H5Fclose(fid);
+    HDremove(SWMR_FILENAME);
+    /* Release memory */
+    if(wbuf2)
+        HDfree(wbuf2);
+    if(rbuf)
+        HDfree(rbuf);
+
+    return 1;
+
+#endif
+
+} /* end test_swmr_write_big() */
+
 

 /*-------------------------------------------------------------------------
  * Function:    accum_printf
diff --git a/test/accum_swmr_reader.c b/test/accum_swmr_reader.c
new file mode 100644
index 0000000..102845f
--- /dev/null
+++ b/test/accum_swmr_reader.c
@@ -0,0 +1,99 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#include "h5test.h"
+
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
+#define H5FD_FRIEND		/*suppress error about including H5FDpkg	  */
+#define H5FD_TESTING
+
+#include "H5Fpkg.h"
+#include "H5FDpkg.h"
+#include "H5Iprivate.h"
+
+/* Filename: this is the same as the define in accum.c used by test_swmr_write_big() */
+#define SWMR_FILENAME "accum_swmr_big.h5"
+
+

+/*-------------------------------------------------------------------------
+ * Function:    main
+ * 
+ * Purpose:     This is the reader forked/execved by "test_swmr_write_big()" 
+ *		        test in accum.c.  The reader reads at address 1024 from the file
+ *		        and verifies that the metadata in the accumulator at address
+ * 		        1024 does get written to disk.
+ * 
+ * Return:      Success: EXIT_SUCCESS
+ *              Failure: EXIT_FAILURE
+ * 
+ * Programmer:  Vailin Choi; June 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(void)
+{
+    hid_t fid = -1;	        /* File ID */
+    hid_t fapl = -1;        /* file access property list ID */
+    H5F_t *f = NULL;	    /* File pointer */
+    unsigned u;		        /* Local index variable */
+    uint8_t rbuf[1024];	    /* Buffer for reading */
+    uint8_t buf[1024];	    /* Buffer for holding the expected data */
+    char *driver = NULL;    /* VFD string (from env variable) */
+
+    /* Skip this test if SWMR I/O is not supported for the VFD specified
+     * by the environment variable.
+     */
+    driver = HDgetenv("HDF5_DRIVER");
+    if(!H5FD_supports_swmr_test(driver)) {
+        return EXIT_SUCCESS;
+    }
+
+    /* Initialize buffers */
+    for(u = 0; u < 1024; u++) {
+        rbuf[u] = 0;	/* The buffer for reading */
+        buf[u] = 1;	/* The expected data should be all 1s */
+    }
+
+    if((fapl = h5_fileaccess()) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the file with SWMR_READ */
+    if((fid = H5Fopen(SWMR_FILENAME, H5F_ACC_RDONLY | H5F_ACC_SWMR_READ, fapl)) < 0)
+	    FAIL_STACK_ERROR
+
+    /* Get H5F_t * to internal file structure */
+    if(NULL == (f = (H5F_t *)H5I_object(fid))) 
+	    FAIL_STACK_ERROR
+
+    /* Should read in [1024, 2024] with buf data */
+    if(H5F_block_read(f, H5FD_MEM_DEFAULT, (haddr_t)1024, (size_t)1024, H5P_DATASET_XFER_DEFAULT, rbuf) < 0)
+	    FAIL_STACK_ERROR;
+
+    /* Verify the data read is correct */
+    if(HDmemcmp(buf, rbuf, (size_t)1024) != 0) 
+	    TEST_ERROR;
+
+    /* CLose the file */
+    if(H5Pclose(fapl) < 0)
+	    FAIL_STACK_ERROR;
+    if(H5Fclose(fid) < 0)
+	    FAIL_STACK_ERROR;
+
+    return EXIT_SUCCESS;
+
+error: 
+    H5Fclose(fid);
+    return EXIT_FAILURE;
+} /* end main() */
+
diff --git a/test/app_ref.c b/test/app_ref.c
index 3052df7..4b72bcb 100644
--- a/test/app_ref.c
+++ b/test/app_ref.c
@@ -185,6 +185,10 @@ main (void)
 
     PASSED();
 
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
+    /* Clean up any file(s) created */
     h5_reset();
     fapl = H5Pcreate (H5P_FILE_ACCESS);
     h5_cleanup (FILENAME, fapl);
diff --git a/test/atomic_reader.c b/test/atomic_reader.c
new file mode 100644
index 0000000..5d9ea68
--- /dev/null
+++ b/test/atomic_reader.c
@@ -0,0 +1,347 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/*-------------------------------------------------------------------------
+ *
+ * Created:    	atomic_reader.c
+ *
+ * Purpose:     This is the "reader" part of the standalone test to check
+ *              atomic read-write operation on a system.
+ *              a) atomic_reader.c--the reader (this file)
+ *              a) atomic_writer.c--the writer
+ *              c) atomic_data--the name of the data file used by writer and reader
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/***********/
+/* Headers */
+/***********/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+/****************/
+/* Local Macros */
+/****************/
+
+#define FILENAME "atomic_data"
+#define READ_TRIES 20
+#define OPEN_TRIES 50
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static void usage(void);
+int verify(int fd, unsigned int k);
+void print_info(int *info, unsigned int lastr, unsigned iteration);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    usage
+ *
+ * Purpose:     To print the command line options
+ *
+ * Parameters:  None
+ *
+ * Return: 	void
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+usage(void)
+{
+    printf("\n");
+    printf("Usage error!\n");
+    printf("Usage: atomic_reader -n <number of integers to read> -i <number of iterations for reader>\n");
+    printf("       Note**The number of integers for option n has to be positive\n");
+    printf("       Note**The number of integers for option i has to be positive\n");
+    printf("\n");
+} /* usage() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    verify
+ *
+ * Purpose:     To verify that the data read is the pattern expected.
+ *		Each integer read should be the same as the index.
+ *		When a difference is encountered, the remaining integers 
+ *		read should be the same as the previous index.
+ *		For example, the pattern expected should be either:
+ *		a) 01234567....n-1	
+ *		or
+ *		b) if at index 4, a difference is encountered,
+ *		   the remaining integers should be all "3"s as:
+ *			012333333333333
+ *
+ * Parameters:  
+ *	fd--the file descriptor
+ *	k--the number of integers to read
+ *
+ * Return:      
+ *	positive on success
+ *	negative on failure
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+verify(int fd, unsigned int k)
+{
+    unsigned int i;		/* local index variable */
+    ssize_t bytes_read;		/* the number of bytes read */
+    unsigned int *buf = NULL;	/* buffer to hold data read */
+
+    /* Allocate buffer for data read */
+    if((buf = (unsigned int *)malloc(k * sizeof(unsigned int))) == NULL) {
+	printf("READER: error from malloc\n");
+	goto error;
+    }
+
+    /* Position the file at the beginning */
+    if(lseek(fd, (off_t)0, SEEK_SET) < 0) {
+	printf("READER: error from lseek\n");
+	goto error;
+    }
+
+    /* Read the whole file */
+    if((bytes_read = read(fd, buf, (k * sizeof(unsigned int)))) < 0) {
+	printf("READER: error from read\n");
+	goto error;
+    }
+
+    /* Verify the bytes read are correct */
+    if(bytes_read != (ssize_t)(k*sizeof(unsigned int))) {
+	printf("READER: error from bytes read=%lu\n", (unsigned long)bytes_read);
+	goto error;
+    }
+
+    /* Verify data read */
+    for(i=0; i < k; i++)  {
+	if(buf[i] != i)
+	    break;
+    }
+
+    if(i < k) {
+	/* Compare the beginning and ending sentinel values */
+	if(buf[k-1] != (i-1)) {
+	    printf("FAIL IN READER: ...beginning sentinel value=%u, i=%u\n", (i-1), i);
+	    printf("FAIL IN READER: buf[%u]=%u\n", i-1, buf[i-1]);
+	    printf("FAIL IN READER: buf[%u]=%u\n", i, buf[i]);
+	    printf("FAIL IN READER: buf[%u]=%u\n", i+1, buf[i+1]);
+	    printf("FAIL IN READER: ...ending sentinel value=%u\n", buf[k-1]);
+	    goto error;
+	}
+    }
+
+    /* Free the buffer */
+    if(buf) free(buf);
+    return(0);
+
+error:
+    /* Free the buffer */
+    if(buf) free(buf);
+    return(-1);
+} /* verify() */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    print_info
+ *
+ * Purpose:     To print the statistics gathered for re-reads
+ *
+ * Parameters: 
+ *	info--the array storing the statistics for re-reads
+ *	lastr--the last read completed
+ *	iteration--the current iteration
+ *
+ * Return:     	void
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+print_info(int *info, unsigned int lastr, unsigned iteration)
+{
+    unsigned j;	/* local index variable */
+
+    printf("--------statistics for %u reads (iteration %u)--------\n", lastr, iteration);
+
+    for(j = 0; j <= READ_TRIES; j++)
+	printf("# of %u re-tries = %u\n", j, info[j]);
+
+    printf("--------end statistics for %u reads (iteration %u)--------\n", lastr, iteration);
+} /* print_info() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Purpose:     To verify that the data read is the pattern expected.
+ *		(1) Make sure the file opens successfully and the # of bytes read is as expected	
+ *		(2) Iterate the reader with i iterations 
+ *		(3) Read and verify n integers for each iteration
+ *		(4) On verification error, re-read the data at most READ_TRIES
+ *	  	    times to see if correct data can be obtained
+ *		(5) Print out statistics for the number of re-retries for each iteration
+ *
+ * Note:
+ *      (a) The # of integers (via -n option) used by the writer and reader should be the same.
+ *      (b) The data file used by the writer and reader should be the same.
+ *
+ * Future enhancement:
+ *      1) Provide default values for n and i and allow user to run with either 0 or 1 option
+ *      2) Use HDF library HD<system calls> instead of the system calls
+ *      3) Handle large sized buffer (gigabytes) if needed
+ *
+ * Return:      Success:       0
+ *              Failure:       -1
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(int argc, char *argv[])
+{
+    int fd = -1;			/* file descriptor */
+    unsigned int j=0, i=0, m=0;		/* local index variables */
+    int temp;				/* temporary variable */
+    unsigned int iterations = 0;	/* the input for "-i" */
+    unsigned num = 0;			/* the input for "-n" */
+    int opt = 0;			/* option char */
+    int info[READ_TRIES+1];		/* re-tries statistics */
+
+    /* Ensure the expected # of arguments */
+    if(argc != 5) {
+        usage();
+	exit(-1);
+    }
+
+    /* Parse command line options */
+    while((opt = getopt(argc, argv, "n:i:")) != -1) {
+        switch(opt) {
+            case 'n':
+                if((temp = atoi(optarg)) < 0) {
+                    usage();
+		    exit(-1);
+		}
+                num = (unsigned int)temp;
+                break;
+            case 'i':
+                if((temp = atoi(optarg)) < 0) {
+                    usage();
+		    exit(-1);
+		}
+                iterations = (unsigned int)temp;
+                break;
+            default:
+                printf("Invalid option encountered\n");
+                break;
+        }
+    }
+
+    printf("READER: number of integers to read = %u; # of iterations = %d\n", num, iterations);
+
+    printf("\n");
+    for(i = 1; i <= iterations; i++) { /* iteration loop */
+	unsigned opens = OPEN_TRIES;
+
+	printf("READER: *****start iteration %u*****\n", i);
+
+	/* Ensure open and file size are done properly */
+	while(opens--) { /* open loop */
+	    struct stat sinfo;
+
+	    memset(&sinfo, 0, sizeof(sinfo));
+
+	    if((fd = open(FILENAME, O_RDONLY, 0644)) < 0) {
+		printf("READER: error from open--retry open again\n");
+	    } else {
+		printf("READER: open succeed\n");
+
+		if((fstat(fd, &sinfo) == 0) &&
+		   (sinfo.st_size == (off_t)(num * sizeof(unsigned int)))) {
+		    printf("READER: file size is correct--%u\n", (unsigned int)sinfo.st_size);
+		    break;
+		}
+
+		printf("READER: error from fstat or file size of %u is incorrect--retry open again\n", (unsigned int)sinfo.st_size);
+		if(close(fd) < 0) {
+		    printf("READER: error from close\n");
+		    return(-1);
+		}
+		fd = -1;
+	    }
+
+	} /* end while */
+
+	if(fd < 0) {
+	    printf("READER: *****open failure/incorrect file size for all %u tries, continue next iteration*****\n\n", OPEN_TRIES);
+	    continue;
+	}
+
+	memset(info, 0, sizeof(info));
+
+	/* Read and verify data */
+	for(j = 1; j <= num; j++) { /* read loop */
+
+	    printf("READER: doing read %u\n", j);
+	    if(verify(fd, num) < 0) {
+		printf("READER: error from read %u\n", j);
+
+		/* Perform re-read to see if correct data is obtained */
+		for(m = 1; m <= READ_TRIES; m++) { /* re-read loop */
+		    printf("READER: ===============going to do re-read try %u\n", m);
+		    if(verify(fd, num) < 0)
+			printf("READER: ===============error from re-read try %u\n", m);
+		    else {
+			++info[m];
+			printf("READER: ===============SUCCESS from re-read try %u\n", m);
+			break;
+		    }
+		} /* end for */
+
+		if(m > READ_TRIES) {
+		    printf("READER: ===============error from all re-read tries: %u\n", READ_TRIES);
+		    printf("READER:*****ERROR--stop on read %u\n", j);
+		    break;
+		}
+	    } else {
+		++info[0];
+		printf("READER: success from read %u\n", j);
+	    }
+
+	} /* end for */
+
+	/* Print the statistics for re-reads */
+	print_info(info, j-1, i);
+
+	/* Close the file */
+	if(close(fd) < 0) {
+	    printf("READER: error from close\n");
+	    return(-1);
+	}
+
+	printf("READER: *****end iteration %u*****\n\n", i);
+
+    } /* end for */
+
+    return(0);
+}
diff --git a/test/atomic_writer.c b/test/atomic_writer.c
new file mode 100644
index 0000000..9f37ecc
--- /dev/null
+++ b/test/atomic_writer.c
@@ -0,0 +1,230 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:    	atomic_writer.c
+ *
+ * Purpose:   	This is the "writer" part of the standalone test to check 
+ *		atomic read-write operation on a system.
+ *		a) atomic_writer.c--the writer (this file)
+ *		b) atomic_reader.c--the reader
+ *		c) atomic_data--the name of the data file used by writer and reader
+ *		
+ *-------------------------------------------------------------------------
+ */
+
+/***********/
+/* Headers */
+/***********/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
+/****************/
+/* Local Macros */
+/****************/
+
+#define FILENAME "atomic_data"
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static void usage(void);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    usage
+ *
+ * Purpose:     To print information about the command line options
+ *
+ * Parameters: 	None
+ *
+ * Return:   	void
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+usage(void)
+{
+    printf("\n");
+    printf("Usage error!\n");
+    printf("Usage: atomic_writer -n <number of integers to write> -i <number of iterations for writer>\n");
+    printf("       Note**The number of integers for option n has to be positive\n");
+    printf("       Note**The number of integers for option i has to be positive\n");
+    printf("\n");
+} /* usage() */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Purpose: 	To write a series of integers to a file for the reader to verify the data.
+ *		A write is atomic if the whole amount written in one operation is not interleaved 
+ *		with data from any other process.
+ *		(1) Iterate with i iterations
+ *		(2) Write a series of integers (0 to n-1) to the file with this pattern:
+ *		offset 0: 	0000000000000000000000000000000
+ *		offset 1:  	 111111111111111111111111111111
+ *		offset 2:   	  22222222222222222222222222222
+ *		offset 3:    	   3333333333333333333333333333
+ *		...
+ *		...
+ *		offset n-1: 		 		  (n-1)
+ *
+ *		At the end of the writes, the data in the file will be:
+ *		01234567........(n-1)
+ *
+ * Note:
+ *      (a) The # of integers (via -n option) used by the writer and reader should be the same.
+ *      (b) The data file used by the writer and reader should be the same.
+ *
+ * Future enhancement:
+ *      1) Provide default values for n and i and allow user to run with either 0 or 1 option
+ *      2) Use HDF library HD<system calls> instead of the system calls
+ *      3) Handle large sized buffer (gigabytes) if needed
+ *	
+ * Return:      Success:      0
+ *              Failure:      -1
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(int argc, char *argv[])
+{
+    int fd = -1;			/* file descriptor */
+    ssize_t bytes_wrote;		/* the nubmer of bytes written */
+    unsigned int *buf = NULL;		/* buffer to hold written data */
+    unsigned int n, u, i;		/* local index variable */
+    int temp;				/* temporary variable */
+    unsigned int iterations = 0;	/* the input for "-i" */
+    unsigned int num = 0;		/* the input for "-n" */
+    int opt = 0;			/* option char */
+
+    /* Ensure the # of arguments is as expected */
+    if(argc != 5) {
+        usage();
+	exit(-1);
+    }
+
+    /* Parse command line options */
+    while((opt = getopt(argc, argv, "n:i:")) != -1) {
+	switch(opt) {
+	    case 'n':
+		if((temp = atoi(optarg)) < 0) {
+		    usage();
+		    exit(-1);
+		}
+		num = (unsigned int)temp;
+		break;
+	    case 'i':
+		if((temp = atoi(optarg)) < 0) {
+		    usage();
+		    exit(-1);
+		}
+		iterations = (unsigned int)temp;
+		break;
+	    default:
+		printf("Invalid option encountered\n");
+		break;
+	}
+    }
+
+    printf("WRITER: # of integers to write = %u; # of iterations = %d\n", num, iterations);
+
+    /* Remove existing data file if needed */
+    if(remove(FILENAME) < 0) {
+	if(errno == ENOENT)
+	    printf("WRITER: remove %s--%s\n", FILENAME, strerror(errno));
+	else {
+	    printf("WRITER: error from remove: %d--%s\n", errno, strerror(errno));
+	    goto error;
+	}
+    } else
+	printf("WRITER: %s is removed\n", FILENAME);
+
+    /* Create the data file */
+    if((fd = open(FILENAME, O_RDWR|O_TRUNC|O_CREAT, 0664)) < 0) {
+	printf("WRITER: error from open\n");
+	goto error;
+    }
+
+    /* Allocate buffer for holding data to be written */
+    if((buf = (unsigned int *)malloc(num * sizeof(unsigned int))) == NULL) {
+	printf("WRITER: error from malloc\n");
+	if(fd >= 0 && close(fd) < 0)
+	    printf("WRITER: error from close\n");
+	goto error;
+    }
+
+    printf("\n");
+
+    for(i = 1; i <= iterations; i++) { /* iteration loop */
+	printf("WRITER: *****start iteration %u*****\n", i);
+
+	/* Write the series of integers to the file */
+	for(n = 0; n < num; n++)  { /* write loop */
+
+	    /* Set up data to be written */
+	    for(u=0; u < num; u++)
+		buf[u] = n;
+
+	    /* Position the file to the proper location */
+	    if(lseek(fd, (off_t)(n*sizeof(unsigned int)), SEEK_SET) < 0) {
+		printf("WRITER: error from lseek\n");
+		goto error;
+	    }
+    
+	    /* Write the data */
+	    if((bytes_wrote = write(fd, buf, ((num-n) * sizeof(unsigned int)))) < 0) {
+		printf("WRITER: error from write\n");
+		goto error;
+	    }
+
+	    /* Verify the bytes written is correct */
+	    if(bytes_wrote != (ssize_t)((num-n) * sizeof(unsigned int))) {
+		printf("WRITER: error from bytes written\n");
+		goto error;
+	    }
+	} /* end for */
+
+	printf("WRITER: *****end iteration %u*****\n\n", i);
+
+    } /* end for */
+
+    /* Close the file */
+    if(close(fd) < 0) {
+	printf("WRITER: error from close\n");
+	goto error;
+    }
+
+    /* Free the buffer */
+    if(buf) free(buf);
+
+    return(0);
+
+error:
+    return(-1);
+} /* main() */
diff --git a/test/bad_compound.h5 b/test/bad_compound.h5
index 1834a2e..1c96318 100644
Binary files a/test/bad_compound.h5 and b/test/bad_compound.h5 differ
diff --git a/test/be_data.h5 b/test/be_data.h5
index b106417..e6629d3 100644
Binary files a/test/be_data.h5 and b/test/be_data.h5 differ
diff --git a/test/big.c b/test/big.c
index db03c99..7a3fd21 100644
--- a/test/big.c
+++ b/test/big.c
@@ -73,10 +73,10 @@
 
 /* Define Small, Large, Extra Large, Huge File which 
  * corrspond to less than 2GB, 2GB, 4GB, and tens of GB file size.
- * NOFILE stands for "no file" to be tested.
+ * NO_FILE stands for "no file" to be tested.
  */
-typedef enum fsizes_t { SFILE, LFILE, XLFILE, HUGEFILE, NOFILE} fsizes_t;
-fsizes_t file_size= NOFILE;
+typedef enum fsizes_t { SFILE, LFILE, XLFILE, HUGEFILE, NO_FILE} fsizes_t;
+fsizes_t file_size= NO_FILE;
 
 const char *FILENAME[] = {
         "big",
@@ -120,7 +120,7 @@ static hsize_t values_used[WRT_N];
 static hsize_t
 randll(hsize_t limit, int current_index)
 {
-    hsize_t	acc;
+    hsize_t	acc = 0;
     int 	overlap = 1;
     int 	i;
     int 	tries = 0;
@@ -210,7 +210,7 @@ static fsizes_t
 supports_big(void)
 {
     int		fd = -1;
-    fsizes_t    fsize = NOFILE;
+    fsizes_t    fsize = NO_FILE;
 
     if((fd=HDopen("y.h5", O_RDWR|O_TRUNC|O_CREAT, 0666)) < 0)
         goto error;
@@ -377,9 +377,9 @@ writer (char* filename, hid_t fapl, fsizes_t testsize, int wrt_n)
         size2[0] /= 32;
         break;
 
-    case NOFILE:
+    case NO_FILE:
         /* what to do?? */
-        HDfprintf(stdout, "Unexpected file size of NOFILE\n");
+        HDfprintf(stdout, "Unexpected file size of NO_FILE\n");
         goto error;
         break;
 
@@ -599,7 +599,7 @@ test_sec2(hid_t fapl)
     fsizes_t	testsize;
 
     testsize = supports_big();
-    if(testsize == NOFILE) {
+    if(testsize == NO_FILE) {
         HDfprintf(stdout, "Test for sec2 is skipped because file system does not support big files.\n");
         goto quit;
     }
@@ -618,8 +618,8 @@ test_sec2(hid_t fapl)
 quit:
     /* End with normal return code */
     /* Clean up the test file */
-    if(h5_cleanup(FILENAME, fapl))
-        HDremove(DNAME);
+    h5_clean_files(FILENAME, fapl);
+    HDremove(DNAME);
     return 0;
 
 error:
@@ -634,7 +634,7 @@ test_stdio(hid_t fapl)
     fsizes_t	testsize;
 
     testsize = supports_big();
-    if(testsize == NOFILE) {
+    if(testsize == NO_FILE) {
         HDfprintf(stdout, "Test for stdio is skipped because file system does not support big files.\n");
         goto quit;
     }
@@ -655,8 +655,8 @@ test_stdio(hid_t fapl)
 quit:
     /* End with normal return code */
     /* Clean up the test file */
-    if(h5_cleanup(FILENAME, fapl))
-        HDremove(DNAME);
+    h5_clean_files(FILENAME, fapl);
+    HDremove(DNAME);
     HDfflush(stdout);
     return 0;
 
@@ -716,8 +716,8 @@ test_family(hid_t fapl)
 quit:
     /* End with normal return code */
     /* Clean up the test file */
-    if(h5_cleanup(FILENAME, fapl))
-        HDremove(DNAME);
+    h5_clean_files(FILENAME, fapl);
+    HDremove(DNAME);
     return 0;
 
 error:
diff --git a/test/bittests.c b/test/bittests.c
index c527bb8..c4dfe4c 100644
--- a/test/bittests.c
+++ b/test/bittests.c
@@ -21,7 +21,7 @@
  */
 #include "h5test.h"
 
-#define H5T_PACKAGE
+#define H5T_FRIEND		/*suppress error about including H5Tpkg	  */
 #include "H5Tpkg.h"
 
 #define NTESTS	100000
diff --git a/test/btree2.c b/test/btree2.c
index 43d3d13..7a2432c 100644
--- a/test/btree2.c
+++ b/test/btree2.c
@@ -22,7 +22,7 @@
  * This file needs to access private datatypes from the H5B2 package.
  * This file also needs to access the v2 B-tree testing code.
  */
-#define H5B2_PACKAGE
+#define H5B2_FRIEND		/*suppress error about including H5B2pkg	  */
 #define H5B2_TESTING
 #include "H5B2pkg.h"
 
@@ -31,6 +31,7 @@
 
 const char *FILENAME[] = {
     "btree2",
+    "btree2_tmp",
     NULL
 };
 
@@ -107,6 +108,10 @@ create_file(hid_t *file, H5F_t **f, hid_t fapl)
     if(NULL == (*f = (H5F_t *)H5I_object(*file)))
         STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if(H5AC_ignore_tags(*f) < 0)
+        STACK_ERROR
+
     /* Success */
     return(0);
 
@@ -2804,6 +2809,10 @@ HDfprintf(stderr,"curr_time=%lu\n",(unsigned long)curr_time);
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if(H5AC_ignore_tags(f) < 0)
+        STACK_ERROR
+
     /* Create the v2 B-tree & get its address */
     if(create_btree(f, dxpl, cparam, &bt2, &bt2_addr) < 0)
         TEST_ERROR
@@ -2838,6 +2847,10 @@ HDfprintf(stderr,"curr_time=%lu\n",(unsigned long)curr_time);
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if(H5AC_ignore_tags(f) < 0)
+        STACK_ERROR
+
     /* Re-open v2 B-tree */
     if(NULL == (bt2 = H5B2_open(f, dxpl, bt2_addr, f)))
         FAIL_STACK_ERROR
@@ -4894,7 +4907,7 @@ test_remove_level1_collapse(hid_t fapl, const H5B2_create_t *cparam,
 
     /* Check record values in root of B-tree */
     ninfo.depth = 0;
-    ninfo.nrec = INSERT_SPLIT_ROOT_NREC - u;
+    ninfo.nrec = (uint16_t)(INSERT_SPLIT_ROOT_NREC - u);
     record = 31;      /* Middle record in root node */
     if(check_node_info(bt2, dxpl, record, &ninfo) < 0)
         TEST_ERROR
@@ -6363,6 +6376,10 @@ gen_l4_btree2(const char *filename, hid_t fapl, const H5B2_create_t *cparam,
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if(H5AC_ignore_tags(f) < 0)
+        STACK_ERROR
+
     /* Create the v2 B-tree & get its address */
     if(create_btree(f, dxpl, cparam, &bt2, bt2_addr) < 0)
         TEST_ERROR
@@ -6514,6 +6531,10 @@ HDfprintf(stderr, "curr_time = %lu\n", (unsigned long)curr_time);
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if(H5AC_ignore_tags(f) < 0)
+        STACK_ERROR
+
     /* Re-shuffle record #'s */
     for(u = 0; u < INSERT_MANY; u++) {
         hsize_t     temp_rec;               /* Temporary record */
@@ -6605,6 +6626,10 @@ HDfprintf(stderr, "curr_time = %lu\n", (unsigned long)curr_time);
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if(H5AC_ignore_tags(f) < 0)
+        STACK_ERROR
+
     /* Re-open v2 B-tree */
     if(NULL == (bt2 = H5B2_open(f, dxpl, bt2_addr, f)))
         FAIL_STACK_ERROR
@@ -6689,6 +6714,10 @@ HDfprintf(stderr, "curr_time = %lu\n", (unsigned long)curr_time);
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if(H5AC_ignore_tags(f) < 0)
+        STACK_ERROR
+
     /* Re-open v2 B-tree */
     if(NULL == (bt2 = H5B2_open(f, dxpl, bt2_addr, f)))
         FAIL_STACK_ERROR
@@ -6770,6 +6799,10 @@ HDfprintf(stderr, "curr_time = %lu\n", (unsigned long)curr_time);
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if(H5AC_ignore_tags(f) < 0)
+        STACK_ERROR
+
     /* Re-open v2 B-tree */
     if(NULL == (bt2 = H5B2_open(f, dxpl, bt2_addr, f)))
         FAIL_STACK_ERROR
@@ -7116,6 +7149,10 @@ test_delete(hid_t fapl, const H5B2_create_t *cparam)
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if(H5AC_ignore_tags(f) < 0)
+        STACK_ERROR
+
     /* Create the v2 B-tree & get its address */
     if(create_btree(f, dxpl, cparam, &bt2, &bt2_addr) < 0)
         TEST_ERROR
@@ -7156,6 +7193,10 @@ test_delete(hid_t fapl, const H5B2_create_t *cparam)
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if(H5AC_ignore_tags(f) < 0)
+        STACK_ERROR
+
     /* Create the v2 B-tree & get its address */
     if(create_btree(f, dxpl, cparam, &bt2, &bt2_addr) < 0)
         TEST_ERROR
@@ -7209,6 +7250,10 @@ test_delete(hid_t fapl, const H5B2_create_t *cparam)
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if(H5AC_ignore_tags(f) < 0)
+        STACK_ERROR
+
     /* Create the v2 B-tree & get its address */
     if(create_btree(f, dxpl, cparam, &bt2, &bt2_addr) < 0)
         TEST_ERROR
@@ -7262,6 +7307,10 @@ test_delete(hid_t fapl, const H5B2_create_t *cparam)
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if(H5AC_ignore_tags(f) < 0)
+        STACK_ERROR
+
     /* Create the v2 B-tree & get its address */
     if(create_btree(f, dxpl, cparam, &bt2, &bt2_addr) < 0)
         TEST_ERROR
@@ -7545,6 +7594,146 @@ error:
 
 

 /*-------------------------------------------------------------------------
+ * Function:	test_open_twice_diff
+ *
+ * Purpose:	Open a v2 B-tree twice, through different "top" file
+ *              handles, with an intermediate file open that takes the "shared"
+ *              file handle from the first B-tree's file pointer.
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, December 18, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_open_twice_diff(hid_t fapl, const H5B2_create_t *cparam)
+{
+    char	filename[1024];         /* Filename to use */
+    char        filename_tmp[1024];     /* Temporary file name */
+    hid_t	file = -1;              /* File ID */
+    hid_t	file2 = -1;             /* File ID */
+    hid_t	file0 = -1;             /* File ID */
+    hid_t	file00 = -1;            /* File ID */
+    H5F_t	*f = NULL;              /* Internal file object pointer */
+    H5F_t	*f2 = NULL;             /* Internal file object pointer */
+    hid_t       dxpl = H5P_DATASET_XFER_DEFAULT;        /* DXPL to use */
+    H5B2_t      *bt2 = NULL;            /* v2 B-tree wrapper */
+    H5B2_t      *bt2_2 = NULL;          /* Second v2 B-tree wrapper */
+    haddr_t     bt2_addr;               /* Address of B-tree created */
+
+    h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
+
+    /*
+     * Display testing message
+     */
+    TESTING("open B-tree twice, through different file handles");
+
+    /* Create the file to work on */
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if(H5AC_ignore_tags(f) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create the v2 B-tree & get its address */
+    if(create_btree(f, dxpl, cparam, &bt2, &bt2_addr) < 0)
+        TEST_ERROR
+
+    /* Re-open v2 B-tree */
+    if(NULL == (bt2_2 = H5B2_open(f, dxpl, bt2_addr, f)))
+        FAIL_STACK_ERROR
+
+    /* Close the second v2 B-tree wrapper */
+    if(H5B2_close(bt2_2, dxpl) < 0)
+        FAIL_STACK_ERROR
+    bt2_2 = NULL;
+
+    /* Re-open the file */
+    /* (So that there is something holding the file open when the extensible
+     *  array is closed)
+     */
+    if((file0 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the first v2 B-tree wrapper */
+    if(H5B2_close(bt2, dxpl) < 0)
+        FAIL_STACK_ERROR
+    bt2 = NULL;
+
+    /* Close the file */
+    /* (close before second file, to detect error on internal B-tree header's
+     *  shared file information)
+     */
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+    file = -1;
+
+    /* Open a different file */
+    /* (This re-allocates the 'top' file pointer and assigns it a different
+     *  'shared' file pointer, making the file pointer in the fixed array's
+     *  header stale)
+     */
+    h5_fixname(FILENAME[1], fapl, filename_tmp, sizeof(filename_tmp));
+    if((file00 = H5Fcreate(filename_tmp, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Re-open the file with the v2 B-tree array */
+    if((file2 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f2 = (H5F_t *)H5I_object(file2)))
+        FAIL_STACK_ERROR
+
+    /* Open the B-tree through the second file handle */
+    if(NULL == (bt2_2 = H5B2_open(f2, dxpl, bt2_addr, f2)))
+        FAIL_STACK_ERROR
+
+    /* Close the extra file handles */
+    if(H5Fclose(file0) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(file00) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the second v2 B-tree */
+    if(H5B2_close(bt2_2, dxpl) < 0)
+        FAIL_STACK_ERROR
+    bt2_2 = NULL;
+
+    /* Close file */
+    if(H5Fclose(file2) < 0)
+        FAIL_STACK_ERROR
+
+    /* All tests passed */
+    PASSED();
+
+    /* All tests passed */
+    return(0);
+
+error:
+    H5E_BEGIN_TRY {
+        if(bt2)
+            H5B2_close(bt2, dxpl);
+        if(bt2)
+            H5B2_close(bt2_2, dxpl);
+	H5Fclose(file);
+	H5Fclose(file2);
+	H5Fclose(file0);
+	H5Fclose(file00);
+    } H5E_END_TRY;
+    return(1);
+} /* test_open_twice_diff() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	main
  *
  * Purpose:	Test the B-tree v2 code
@@ -7565,7 +7754,7 @@ main(void)
     bt2_test_param_t tparam;            /* Test parameters for v2 B-tree */
     hid_t	fapl = -1;              /* File access property list for data files */
     unsigned	nerrors = 0;            /* Cumulative error count */
-    hbool_t     reopen;                 /* Whether to reopen B-tree during tests */
+    unsigned    reopen;                 /* Whether to reopen B-tree during tests */
     int		ExpressMode;
     const char  *envval = NULL;
 
@@ -7652,6 +7841,9 @@ main(void)
         nerrors += test_modify(fapl, &cparam, &tparam);
     } /* end for */
 
+    /* Test opening B-trees twice */
+    nerrors += test_open_twice_diff(fapl, &cparam);
+
     /* Verify symbol table messages are cached */
     nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
 
diff --git a/test/btree_idx_1_6.h5 b/test/btree_idx_1_6.h5
new file mode 100644
index 0000000..92f939b
Binary files /dev/null and b/test/btree_idx_1_6.h5 differ
diff --git a/test/btree_idx_1_8.h5 b/test/btree_idx_1_8.h5
new file mode 100644
index 0000000..36662b2
Binary files /dev/null and b/test/btree_idx_1_8.h5 differ
diff --git a/test/cache.c b/test/cache.c
index df6d805..3a4a0da 100644
--- a/test/cache.c
+++ b/test/cache.c
@@ -19,7 +19,6 @@
  *		This file contains tests for the cache implemented in
  *		H5C.c
  */
-#include "H5private.h"          /* Put this first, so H5open() isn't invoked in public macros */
 #include "h5test.h"
 #include "H5Iprivate.h"
 #include "H5ACprivate.h"
@@ -35,9 +34,8 @@ struct flush_cache_test_spec
     int			entry_index;
     hbool_t		insert_flag;
     unsigned int	flags;
-    hbool_t		expected_loaded;
-    hbool_t		expected_cleared;
-    hbool_t		expected_flushed;
+    hbool_t		expected_deserialized;
+    hbool_t		expected_serialized;
     hbool_t		expected_destroyed;
 };
 
@@ -51,9 +49,8 @@ struct pe_flush_cache_test_spec
     int			num_pins;
     int			pin_type[MAX_PINS];
     int			pin_idx[MAX_PINS];
-    hbool_t		expected_loaded;
-    hbool_t		expected_cleared;
-    hbool_t		expected_flushed;
+    hbool_t		expected_deserialized;
+    hbool_t		expected_serialized;
     hbool_t		expected_destroyed;
 };
 
@@ -68,9 +65,8 @@ struct fo_flush_entry_check
     hbool_t		is_dirty;
     hbool_t		is_protected;
     hbool_t		is_pinned;
-    hbool_t		expected_loaded;
-    hbool_t		expected_cleared;
-    hbool_t		expected_flushed;
+    hbool_t		expected_deserialized;
+    hbool_t		expected_serialized;
     hbool_t		expected_destroyed;
 };
 
@@ -88,9 +84,8 @@ struct fo_flush_cache_test_spec
     int				pin_idx[MAX_PINS];
     int				num_flush_ops;
     struct flush_op		flush_ops[MAX_FLUSH_OPS];
-    hbool_t			expected_loaded;
-    hbool_t			expected_cleared;
-    hbool_t			expected_flushed;
+    hbool_t			expected_deserialized;
+    hbool_t			expected_serialized;
     hbool_t			expected_destroyed;
 };
 
@@ -105,17 +100,17 @@ struct move_entry_test_spec
 

 /* private function declarations: */
 
-static unsigned smoke_check_1(void);
-static unsigned smoke_check_2(void);
-static unsigned smoke_check_3(void);
-static unsigned smoke_check_4(void);
-static unsigned smoke_check_5(void);
-static unsigned smoke_check_6(void);
-static unsigned smoke_check_7(void);
-static unsigned smoke_check_8(void);
-static unsigned smoke_check_9(void);
-static unsigned smoke_check_10(void);
-static unsigned write_permitted_check(void);
+static unsigned smoke_check_1(int express_test);
+static unsigned smoke_check_2(int express_test);
+static unsigned smoke_check_3(int express_test);
+static unsigned smoke_check_4(int express_test);
+static unsigned smoke_check_5(int express_test);
+static unsigned smoke_check_6(int express_test);
+static unsigned smoke_check_7(int express_test);
+static unsigned smoke_check_8(int express_test);
+static unsigned smoke_check_9(int express_test);
+static unsigned smoke_check_10(int express_test);
+static unsigned write_permitted_check(int express_test);
 static unsigned check_insert_entry(void);
 static unsigned check_flush_cache(void);
 static void check_flush_cache__empty_cache(H5F_t * file_ptr);
@@ -138,22 +133,21 @@ static void check_flush_cache__single_entry_test(H5F_t * file_ptr,
                                                  hbool_t insert_flag,
                                                  unsigned int flags,
                                                  unsigned int flush_flags,
-                                                 hbool_t expected_loaded,
-                                                 hbool_t expected_cleared,
-                                                 hbool_t expected_flushed,
+                                                 hbool_t expected_deserialized,
+                                                 hbool_t expected_serialized,
                                                  hbool_t expected_destroyed);
 static void check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
                                                  int test_num,
                                                  int entry_type,
                                                  int entry_idx,
+                                                 hbool_t unprot_dirty_flag,
 					         hbool_t mark_dirty,
                                                  hbool_t pop_mark_dirty_prot,
                                                  hbool_t pop_mark_dirty_pinned,
                                                  hbool_t unprotect_unpin,
                                                  unsigned int flags,
                                                  unsigned int flush_flags,
-                                                 hbool_t expected_cleared,
-                                                 hbool_t expected_flushed,
+                                                 hbool_t expected_serialized,
                                                  hbool_t expected_destroyed);
 static void check_flush_cache__flush_ops(H5F_t * file_ptr);
 static void check_flush_cache__flush_op_test(H5F_t * file_ptr,
@@ -168,7 +162,6 @@ static void check_flush_cache__flush_op_test(H5F_t * file_ptr,
 					int check_size,
                                         struct fo_flush_entry_check check[]);
 static void check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr);
-static unsigned check_flush_protected_err(void);
 static unsigned check_get_entry_status(void);
 static unsigned check_expunge_entry(void);
 static unsigned check_multiple_read_protect(void);
@@ -178,6 +171,7 @@ static void check_move_entry__run_test(H5F_t * file_ptr, int test_num,
 static unsigned check_pin_protected_entry(void);
 static unsigned check_resize_entry(void);
 static unsigned check_evictions_enabled(void);
+static unsigned check_flush_protected_err(void);
 static unsigned check_destroy_pinned_err(void);
 static unsigned check_destroy_protected_err(void);
 static unsigned check_duplicate_insert_err(void);
@@ -193,12 +187,26 @@ static unsigned check_resize_entry_errs(void);
 static unsigned check_unprotect_ro_dirty_err(void);
 static unsigned check_protect_ro_rw_err(void);
 static unsigned check_check_evictions_enabled_err(void);
-static unsigned check_auto_cache_resize(void);
+static unsigned check_auto_cache_resize(hbool_t cork_ageout);
 static unsigned check_auto_cache_resize_disable(void);
 static unsigned check_auto_cache_resize_epoch_markers(void);
 static unsigned check_auto_cache_resize_input_errs(void);
 static unsigned check_auto_cache_resize_aux_fcns(void);
 static unsigned check_metadata_blizzard_absence(hbool_t fill_via_insertion);
+static unsigned check_flush_deps(void);
+static unsigned check_flush_deps_err(void);
+static unsigned check_flush_deps_order(void);
+static unsigned check_notify_cb(void);
+static unsigned check_metadata_cork(hbool_t fill_via_insertion);
+static unsigned check_entry_deletions_during_scans(void);
+static void cedds__expunge_dirty_entry_in_flush_test(H5F_t * file_ptr);
+static void cedds__H5C_make_space_in_cache(H5F_t * file_ptr);
+static void cedds__H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * file_ptr);
+static void cedds__H5C_flush_invalidate_cache__bucket_scan(H5F_t * file_ptr);
+static unsigned check_stats(void);
+#if H5C_COLLECT_CACHE_STATS
+static void check_stats__smoke_check_1(H5F_t * file_ptr);
+#endif /* H5C_COLLECT_CACHE_STATS */
 
 

 /**************************************************************************/
@@ -219,55 +227,65 @@ static unsigned check_metadata_blizzard_absence(hbool_t fill_via_insertion);
  * Programmer:	John Mainzer
  *              6/16/04
  *
- * Modifications:
- *
- *		JRM -- 1/18/05
- *		Added code to skip this test if the skip_long_tests global
- *		is true.
- *
  *-------------------------------------------------------------------------
  */
 
 static unsigned
-smoke_check_1(void)
+smoke_check_1(int express_test)
 {
-    const char * fcn_name = "smoke_check_1";
     hbool_t show_progress = FALSE;
     int dirty_unprotects = FALSE;
     int dirty_destroys = FALSE;
     hbool_t display_stats = FALSE;
     int32_t lag = 10;
+    int32_t max_index = (10 * 1024) - 1;
     int mile_stone = 1;
     H5F_t * file_ptr = NULL;
 
     TESTING("smoke check #1 -- all clean, ins, dest, ren, 4/2 MB cache");
 
-    if ( skip_long_tests ) {
-        SKIPPED();
-        HDfprintf(stdout, "	Long tests disabled.\n");
-        return 0;  /* <========== note return */
+    switch ( express_test )
+    {
+	case 0:
+	    max_index = (10 * 1024) - 1;
+	    break;
+
+	case 1:
+	    max_index = (1 * 1024) - 1;
+	    break;
+
+	case 2:
+	    max_index = (512) - 1;
+	    break;
+
+	default:
+            SKIPPED();
+            HDfprintf(stdout, "	Long tests disabled.\n");
+	    return 0;  /* <========== note return */
+	    break;
     }
 
     pass = TRUE;
 
     if ( show_progress ) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
     if ( show_progress ) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     file_ptr = setup_cache((size_t)(4 * 1024 * 1024),
                             (size_t)(2 * 1024 * 1024));
 
     if ( show_progress ) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
-    row_major_scan_forward(/* file_ptr              */ file_ptr,
+    row_major_scan_forward(/* file_ptr               */ file_ptr,
+		           /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -283,9 +301,10 @@ smoke_check_1(void)
 
     if ( show_progress ) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
-    row_major_scan_backward(/* file_ptr              */ file_ptr,
+    row_major_scan_backward(/* file_ptr               */ file_ptr,
+                            /* max_index              */ max_index,
                             /* lag                    */ lag,
                             /* verbose                */ FALSE,
                             /* reset_stats            */ TRUE,
@@ -301,9 +320,10 @@ smoke_check_1(void)
 
     if ( show_progress ) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
-    row_major_scan_forward(/* file_ptr              */ file_ptr,
+    row_major_scan_forward(/* file_ptr               */ file_ptr,
+		           /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -319,7 +339,7 @@ smoke_check_1(void)
 
     if ( show_progress ) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush and destroy all entries in the cache: */
 
@@ -330,9 +350,10 @@ smoke_check_1(void)
 
     if ( show_progress ) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
-    col_major_scan_forward(/* file_ptr              */ file_ptr,
+    col_major_scan_forward(/* file_ptr               */ file_ptr,
+		           /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -343,7 +364,7 @@ smoke_check_1(void)
 
     if ( show_progress ) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush all entries in the cache: */
 
@@ -354,9 +375,10 @@ smoke_check_1(void)
 
     if ( show_progress ) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
-    col_major_scan_backward(/* file_ptr              */ file_ptr,
+    col_major_scan_backward(/* file_ptr               */ file_ptr,
+		            /* max_index              */ max_index,
                             /* lag                    */ lag,
                             /* verbose                */ FALSE,
                             /* reset_stats            */ TRUE,
@@ -367,13 +389,13 @@ smoke_check_1(void)
 
     if ( show_progress ) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
     if ( show_progress ) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
@@ -383,7 +405,7 @@ smoke_check_1(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -404,55 +426,65 @@ smoke_check_1(void)
  * Programmer:	John Mainzer
  *              6/24/04
  *
- * Modifications:
- *
- *		JRM -- 1/18/05
- *		Added code to skip this test if the skip_long_tests global
- *		is true.
- *
  *-------------------------------------------------------------------------
  */
 
 static unsigned
-smoke_check_2(void)
+smoke_check_2(int express_test)
 {
-    const char * fcn_name = "smoke_check_2";
     hbool_t show_progress = FALSE;
     int dirty_unprotects = TRUE;
     int dirty_destroys = TRUE;
     hbool_t display_stats = FALSE;
+    int32_t max_index = (10 * 1024) - 1;
     int32_t lag = 10;
     int mile_stone = 1;
     H5F_t * file_ptr = NULL;
 
     TESTING("smoke check #2 -- ~1/2 dirty, ins, dest, ren, 4/2 MB cache");
 
-    if ( skip_long_tests ) {
-        SKIPPED();
-        HDfprintf(stdout, "	Long tests disabled.\n");
-        return 0;  /* <========== note return */
+    switch ( express_test )
+    {
+	case 0:
+	    max_index = (10 * 1024) - 1;
+	    break;
+
+	case 1:
+	    max_index = (1 * 1024) - 1;
+	    break;
+
+	case 2:
+	    max_index = (512) - 1;
+	    break;
+
+	default:
+            SKIPPED();
+            HDfprintf(stdout, "	Long tests disabled.\n");
+	    return 0;  /* <========== note return */
+	    break;
     }
 
     pass = TRUE;
 
     if ( show_progress ) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
     if ( show_progress ) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     file_ptr = setup_cache((size_t)(4 * 1024 * 1024),
                             (size_t)(2 * 1024 * 1024));
 
     if ( show_progress ) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
-    row_major_scan_forward(/* file_ptr              */ file_ptr,
+    row_major_scan_forward(/* file_ptr               */ file_ptr,
+		           /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -468,9 +500,10 @@ smoke_check_2(void)
 
     if ( show_progress ) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
-    row_major_scan_backward(/* file_ptr              */ file_ptr,
+    row_major_scan_backward(/* file_ptr               */ file_ptr,
+                            /* max_index              */ max_index,
                             /* lag                    */ lag,
                             /* verbose                */ FALSE,
                             /* reset_stats            */ TRUE,
@@ -486,9 +519,10 @@ smoke_check_2(void)
 
     if ( show_progress ) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
-    row_major_scan_forward(/* file_ptr              */ file_ptr,
+    row_major_scan_forward(/* file_ptr               */ file_ptr,
+		           /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -504,7 +538,7 @@ smoke_check_2(void)
 
     if ( show_progress ) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush and destroy all entries in the cache: */
 
@@ -515,9 +549,10 @@ smoke_check_2(void)
 
     if ( show_progress ) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
-    col_major_scan_forward(/* file_ptr              */ file_ptr,
+    col_major_scan_forward(/* file_ptr               */ file_ptr,
+		           /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -528,7 +563,7 @@ smoke_check_2(void)
 
     if ( show_progress ) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush all entries in the cache: */
 
@@ -539,9 +574,10 @@ smoke_check_2(void)
 
     if ( show_progress ) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
-    col_major_scan_backward(/* file_ptr              */ file_ptr,
+    col_major_scan_backward(/* file_ptr               */ file_ptr,
+		            /* max_index              */ max_index,
                             /* lag                    */ lag,
                             /* verbose                */ FALSE,
                             /* reset_stats            */ TRUE,
@@ -552,13 +588,13 @@ smoke_check_2(void)
 
     if ( show_progress ) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
     if ( show_progress ) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
@@ -568,7 +604,7 @@ smoke_check_2(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -588,55 +624,65 @@ smoke_check_2(void)
  * Programmer:	John Mainzer
  *              6/16/04
  *
- * Modifications:
- *
- *		JRM -- 1/18/05
- *		Added code to skip this test if the skip_long_tests global
- *		is true.
- *
  *-------------------------------------------------------------------------
  */
 
 static unsigned
-smoke_check_3(void)
+smoke_check_3(int express_test)
 {
-    const char * fcn_name = "smoke_check_3";
     hbool_t show_progress = FALSE;
     int dirty_unprotects = FALSE;
     int dirty_destroys = FALSE;
     hbool_t display_stats = FALSE;
+    int32_t max_index = (10 * 1024) - 1;
     int32_t lag = 10;
     int mile_stone = 1;
     H5F_t * file_ptr = NULL;
 
     TESTING("smoke check #3 -- all clean, ins, dest, ren, 2/1 KB cache");
 
-    if ( skip_long_tests ) {
-        SKIPPED();
-        HDfprintf(stdout, "	Long tests disabled.\n");
-        return 0;  /* <========== note return */
+    switch ( express_test )
+    {
+	case 0:
+	    max_index = (10 * 1024) - 1;
+	    break;
+
+	case 1:
+	    max_index = (1 * 1024) - 1;
+	    break;
+
+	case 2:
+	    max_index = (512) - 1;
+	    break;
+
+	default:
+            SKIPPED();
+            HDfprintf(stdout, "	Long tests disabled.\n");
+	    return 0;  /* <========== note return */
+	    break;
     }
 
     pass = TRUE;
 
     if ( show_progress ) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
     if ( show_progress ) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     file_ptr = setup_cache((size_t)(2 * 1024),
                             (size_t)(1 * 1024));
 
     if ( show_progress ) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
-    row_major_scan_forward(/* file_ptr              */ file_ptr,
+    row_major_scan_forward(/* file_ptr               */ file_ptr,
+		           /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -652,9 +698,10 @@ smoke_check_3(void)
 
     if ( show_progress ) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     row_major_scan_backward(/* file_ptr              */ file_ptr,
+                            /* max_index              */ max_index,
                             /* lag                    */ lag,
                             /* verbose                */ FALSE,
                             /* reset_stats            */ TRUE,
@@ -670,9 +717,10 @@ smoke_check_3(void)
 
     if ( show_progress ) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     row_major_scan_forward(/* file_ptr              */ file_ptr,
+		           /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -688,7 +736,7 @@ smoke_check_3(void)
 
     if ( show_progress ) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush and destroy all entries in the cache: */
 
@@ -699,9 +747,10 @@ smoke_check_3(void)
 
     if ( show_progress ) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     col_major_scan_forward(/* file_ptr              */ file_ptr,
+		           /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -712,7 +761,7 @@ smoke_check_3(void)
 
     if ( show_progress ) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush all entries in the cache: */
 
@@ -723,9 +772,10 @@ smoke_check_3(void)
 
     if ( show_progress ) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     col_major_scan_backward(/* file_ptr              */ file_ptr,
+		            /* max_index              */ max_index,
                             /* lag                    */ lag,
                             /* verbose                */ FALSE,
                             /* reset_stats            */ TRUE,
@@ -736,13 +786,13 @@ smoke_check_3(void)
 
     if ( show_progress ) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
     if ( show_progress ) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
@@ -752,7 +802,7 @@ smoke_check_3(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -773,55 +823,65 @@ smoke_check_3(void)
  * Programmer:	John Mainzer
  *              6/24/04
  *
- * Modifications:
- *
- *		JRM -- 1/18/05
- *		Added code to skip this test if the skip_long_tests global
- *		is true.
- *
  *-------------------------------------------------------------------------
  */
 
 static unsigned
-smoke_check_4(void)
+smoke_check_4(int express_test)
 {
-    const char * fcn_name = "smoke_check_4";
     hbool_t show_progress = FALSE;
     int dirty_unprotects = TRUE;
     int dirty_destroys = TRUE;
     hbool_t display_stats = FALSE;
+    int32_t max_index = (10 * 1024) - 1;
     int32_t lag = 10;
     int mile_stone = 1;
     H5F_t * file_ptr = NULL;
 
     TESTING("smoke check #4 -- ~1/2 dirty, ins, dest, ren, 2/1 KB cache");
 
-    if ( skip_long_tests ) {
-        SKIPPED();
-        HDfprintf(stdout, "	Long tests disabled.\n");
-        return 0;  /* <========== note return */
+    switch ( express_test )
+    {
+	case 0:
+	    max_index = (10 * 1024) - 1;
+	    break;
+
+	case 1:
+	    max_index = (1 * 1024) - 1;
+	    break;
+
+	case 2:
+	    max_index = (512) - 1;
+	    break;
+
+	default:
+            SKIPPED();
+            HDfprintf(stdout, "	Long tests disabled.\n");
+	    return 0;  /* <========== note return */
+	    break;
     }
 
     pass = TRUE;
 
     if ( show_progress ) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
     if ( show_progress ) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     file_ptr = setup_cache((size_t)(2 * 1024),
                             (size_t)(1 * 1024));
 
     if ( show_progress ) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
-    row_major_scan_forward(/* file_ptr              */ file_ptr,
+    row_major_scan_forward(/* file_ptr               */ file_ptr,
+		           /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -837,9 +897,10 @@ smoke_check_4(void)
 
     if ( show_progress ) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
-    row_major_scan_backward(/* file_ptr              */ file_ptr,
+    row_major_scan_backward(/* file_ptr               */ file_ptr,
+                            /* max_index              */ max_index,
                             /* lag                    */ lag,
                             /* verbose                */ FALSE,
                             /* reset_stats            */ TRUE,
@@ -855,9 +916,10 @@ smoke_check_4(void)
 
     if ( show_progress ) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
-    row_major_scan_forward(/* file_ptr              */ file_ptr,
+    row_major_scan_forward(/* file_ptr               */ file_ptr,
+		           /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -873,7 +935,7 @@ smoke_check_4(void)
 
     if ( show_progress ) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush and destroy all entries in the cache: */
 
@@ -884,9 +946,10 @@ smoke_check_4(void)
 
     if ( show_progress ) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
-    col_major_scan_forward(/* file_ptr              */ file_ptr,
+    col_major_scan_forward(/* file_ptr               */ file_ptr,
+		           /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -897,7 +960,7 @@ smoke_check_4(void)
 
     if ( show_progress ) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush all entries in the cache: */
 
@@ -908,9 +971,10 @@ smoke_check_4(void)
 
     if ( show_progress ) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
-    col_major_scan_backward(/* file_ptr              */ file_ptr,
+    col_major_scan_backward(/* file_ptr               */ file_ptr,
+		            /* max_index              */ max_index,
                             /* lag                    */ lag,
                             /* verbose                */ FALSE,
                             /* reset_stats            */ TRUE,
@@ -921,13 +985,13 @@ smoke_check_4(void)
 
     if ( show_progress ) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
     if ( show_progress ) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
@@ -937,7 +1001,7 @@ smoke_check_4(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -958,19 +1022,12 @@ smoke_check_4(void)
  * Programmer:	John Mainzer
  *              10/14/04
  *
- * Modifications:
- *
- *		JRM -- 1/18/05
- *		Added code to skip this test if the skip_long_tests global
- *		is true.
- *
  *-------------------------------------------------------------------------
  */
 
 static unsigned
-smoke_check_5(void)
+smoke_check_5(int express_test)
 {
-    const char * fcn_name = "smoke_check_5";
     herr_t result;
     hbool_t show_progress = FALSE;
     int dirty_unprotects = FALSE;
@@ -1030,31 +1087,38 @@ smoke_check_5(void)
 
     TESTING("smoke check #5 -- all clean, ins, prot, unprot, AR cache 1");
 
-    if ( skip_long_tests ) {
-
-        SKIPPED();
-
-        HDfprintf(stdout, "	Long tests disabled.\n");
+    switch ( express_test )
+    {
+	case 0:
+	    max_index = (10 * 1024) - 1;
+	    break;
 
-        return 0;  /* <========== note return */
-    }
+	case 1:
+	    max_index = (1 * 1024) - 1;
+	    break;
 
-    if ( run_full_test ) {
+	case 2:
+	    max_index = (512) - 1;
+	    break;
 
-        max_index = (10 * 1024) - 1;
+	default:
+            SKIPPED();
+            HDfprintf(stdout, "	Long tests disabled.\n");
+	    return 0;  /* <========== note return */
+	    break;
     }
 
     pass = TRUE;
 
     if ( show_progress ) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
     if ( show_progress ) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     file_ptr = setup_cache((size_t)(2 * 1024),
                             (size_t)(1 * 1024));
@@ -1073,7 +1137,7 @@ smoke_check_5(void)
 
     if ( show_progress ) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_row_major_scan_forward(/* file_ptr              */ file_ptr,
                               /* max_index              */ max_index,
@@ -1085,7 +1149,7 @@ smoke_check_5(void)
 
     if ( show_progress ) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_row_major_scan_backward(/* file_ptr              */ file_ptr,
                                /* max_index              */ max_index,
@@ -1097,7 +1161,7 @@ smoke_check_5(void)
 
     if ( show_progress ) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_row_major_scan_forward(/* file_ptr              */ file_ptr,
                               /* max_index              */ max_index,
@@ -1109,7 +1173,7 @@ smoke_check_5(void)
 
     if ( show_progress ) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush and destroy all entries in the cache: */
 
@@ -1120,7 +1184,7 @@ smoke_check_5(void)
 
     if ( show_progress ) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_col_major_scan_forward(/* file_ptr              */ file_ptr,
                               /* max_index              */ max_index,
@@ -1133,7 +1197,7 @@ smoke_check_5(void)
 
     if ( show_progress ) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush all entries in the cache: */
 
@@ -1144,7 +1208,7 @@ smoke_check_5(void)
 
     if ( show_progress ) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_col_major_scan_backward(/* file_ptr              */ file_ptr,
                                /* max_index              */ max_index,
@@ -1157,13 +1221,13 @@ smoke_check_5(void)
 
     if ( show_progress ) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
     if ( show_progress ) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
@@ -1173,7 +1237,7 @@ smoke_check_5(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -1194,19 +1258,12 @@ smoke_check_5(void)
  * Programmer:	John Mainzer
  *              10/25/04
  *
- * Modifications:
- *
- *		JRM -- 1/18/05
- *		Added code to skip this test if the skip_long_tests global
- *		is true.
- *
  *-------------------------------------------------------------------------
  */
 
 static unsigned
-smoke_check_6(void)
+smoke_check_6(int express_test)
 {
-    const char * fcn_name = "smoke_check_6";
     herr_t result;
     hbool_t show_progress = FALSE;
     int dirty_unprotects = FALSE;
@@ -1268,26 +1325,36 @@ smoke_check_6(void)
 
     pass = TRUE;
 
-    if ( skip_long_tests ) {
-        SKIPPED();
-        HDfprintf(stdout, "	Long tests disabled.\n");
-        return 0;  /* <========== note return */
-    }
+    switch ( express_test )
+    {
+	case 0:
+	    max_index = (10 * 1024) - 1;
+	    break;
 
-    if ( run_full_test ) {
+	case 1:
+	    max_index = (1 * 1024) - 1;
+	    break;
 
-        max_index = (10 * 1024) - 1;
+	case 2:
+	    max_index = (512) - 1;
+	    break;
+
+	default:
+            SKIPPED();
+            HDfprintf(stdout, "	Long tests disabled.\n");
+	    return 0;  /* <========== note return */
+	    break;
     }
 
     if ( show_progress ) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
     if ( show_progress ) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     file_ptr = setup_cache((size_t)(2 * 1024),
                             (size_t)(1 * 1024));
@@ -1306,7 +1373,7 @@ smoke_check_6(void)
 
     if ( show_progress ) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_row_major_scan_forward(/* file_ptr              */ file_ptr,
                               /* max_index              */ max_index,
@@ -1318,7 +1385,7 @@ smoke_check_6(void)
 
     if ( show_progress ) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_row_major_scan_backward(/* file_ptr              */ file_ptr,
                                /* max_index              */ max_index,
@@ -1330,7 +1397,7 @@ smoke_check_6(void)
 
     if ( show_progress ) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_row_major_scan_forward(/* file_ptr              */ file_ptr,
                               /* max_index              */ max_index,
@@ -1342,7 +1409,7 @@ smoke_check_6(void)
 
     if ( show_progress ) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush and destroy all entries in the cache: */
 
@@ -1353,7 +1420,7 @@ smoke_check_6(void)
 
     if ( show_progress ) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_col_major_scan_forward(/* file_ptr              */ file_ptr,
                               /* max_index              */ max_index,
@@ -1366,7 +1433,7 @@ smoke_check_6(void)
 
     if ( show_progress ) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush all entries in the cache: */
 
@@ -1377,7 +1444,7 @@ smoke_check_6(void)
 
     if ( show_progress ) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_col_major_scan_backward(/* file_ptr              */ file_ptr,
                                /* max_index              */ max_index,
@@ -1390,13 +1457,13 @@ smoke_check_6(void)
 
     if ( show_progress ) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
     if ( show_progress ) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
@@ -1406,7 +1473,7 @@ smoke_check_6(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -1427,19 +1494,12 @@ smoke_check_6(void)
  * Programmer:	John Mainzer
  *              12/2/04
  *
- * Modifications:
- *
- *		JRM -- 1/18/05
- *		Added code to skip this test if the skip_long_tests global
- *		is true.
- *
  *-------------------------------------------------------------------------
  */
 
 static unsigned
-smoke_check_7(void)
+smoke_check_7(int express_test)
 {
-    const char * fcn_name = "smoke_check_7";
     herr_t result;
     hbool_t show_progress = FALSE;
     int dirty_unprotects = FALSE;
@@ -1500,28 +1560,38 @@ smoke_check_7(void)
 
     TESTING("smoke check #7 -- all clean, ins, prot, unprot, AR cache 2");
 
-    if ( skip_long_tests ) {
-        SKIPPED();
-        HDfprintf(stdout, "	Long tests disabled.\n");
-        return 0;  /* <========== note return */
-    }
+    switch ( express_test )
+    {
+	case 0:
+	    max_index = (10 * 1024) - 1;
+	    break;
 
-    if ( run_full_test ) {
+	case 1:
+	    max_index = (1 * 1024) - 1;
+	    break;
 
-        max_index = (10 * 1024) - 1;
+	case 2:
+	    max_index = (512) - 1;
+	    break;
+
+	default:
+            SKIPPED();
+            HDfprintf(stdout, "	Long tests disabled.\n");
+	    return 0;  /* <========== note return */
+	    break;
     }
 
     pass = TRUE;
 
     if ( show_progress ) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
     if ( show_progress ) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     file_ptr = setup_cache((size_t)(2 * 1024),
                             (size_t)(1 * 1024));
@@ -1540,7 +1610,7 @@ smoke_check_7(void)
 
     if ( show_progress ) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_row_major_scan_forward(/* file_ptr              */ file_ptr,
                               /* max_index              */ max_index,
@@ -1552,7 +1622,7 @@ smoke_check_7(void)
 
     if ( show_progress ) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_row_major_scan_backward(/* file_ptr              */ file_ptr,
                                /* max_index              */ max_index,
@@ -1564,7 +1634,7 @@ smoke_check_7(void)
 
     if ( show_progress ) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_row_major_scan_forward(/* file_ptr              */ file_ptr,
                               /* max_index              */ max_index,
@@ -1576,7 +1646,7 @@ smoke_check_7(void)
 
     if ( show_progress ) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush and destroy all entries in the cache: */
 
@@ -1587,7 +1657,7 @@ smoke_check_7(void)
 
     if ( show_progress ) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_col_major_scan_forward(/* file_ptr              */ file_ptr,
                               /* max_index              */ max_index,
@@ -1600,7 +1670,7 @@ smoke_check_7(void)
 
     if ( show_progress ) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush all entries in the cache: */
 
@@ -1611,7 +1681,7 @@ smoke_check_7(void)
 
     if ( show_progress ) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_col_major_scan_backward(/* file_ptr              */ file_ptr,
                                /* max_index              */ max_index,
@@ -1624,13 +1694,13 @@ smoke_check_7(void)
 
     if ( show_progress ) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
     if ( show_progress ) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
@@ -1640,7 +1710,7 @@ smoke_check_7(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -1661,19 +1731,12 @@ smoke_check_7(void)
  * Programmer:	John Mainzer
  *              10/25/04
  *
- * Modifications:
- *
- *		JRM -- 1/18/05
- *		Added code to skip this test if the skip_long_tests global
- *		is true.
- *
  *-------------------------------------------------------------------------
  */
 
 static unsigned
-smoke_check_8(void)
+smoke_check_8(int express_test)
 {
-    const char * fcn_name = "smoke_check_8";
     herr_t result;
     hbool_t show_progress = FALSE;
     int dirty_unprotects = FALSE;
@@ -1734,28 +1797,38 @@ smoke_check_8(void)
 
     TESTING("smoke check #8 -- ~1/2 dirty, ins, prot, unprot, AR cache 2");
 
-    if ( skip_long_tests ) {
-        SKIPPED();
-        HDfprintf(stdout, "	Long tests disabled.\n");
-        return 0;  /* <========== note return */
-    }
+    switch ( express_test )
+    {
+	case 0:
+	    max_index = (10 * 1024) - 1;
+	    break;
 
-    if ( run_full_test ) {
+	case 1:
+	    max_index = (1 * 1024) - 1;
+	    break;
 
-        max_index = (10 * 1024) - 1;
+	case 2:
+	    max_index = (512) - 1;
+	    break;
+
+	default:
+            SKIPPED();
+            HDfprintf(stdout, "	Long tests disabled.\n");
+	    return 0;  /* <========== note return */
+	    break;
     }
 
     pass = TRUE;
 
     if ( show_progress ) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
     if ( show_progress ) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024));
     cache_ptr = file_ptr->shared->cache;
@@ -1773,7 +1846,7 @@ smoke_check_8(void)
 
     if ( show_progress ) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_row_major_scan_forward(/* file_ptr              */ file_ptr,
                               /* max_index              */ max_index,
@@ -1785,7 +1858,7 @@ smoke_check_8(void)
 
     if ( show_progress ) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_row_major_scan_backward(/* file_ptr              */ file_ptr,
                                /* max_index              */ max_index,
@@ -1797,7 +1870,7 @@ smoke_check_8(void)
 
     if ( show_progress ) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_row_major_scan_forward(/* file_ptr              */ file_ptr,
                               /* max_index              */ max_index,
@@ -1809,7 +1882,7 @@ smoke_check_8(void)
 
     if ( show_progress ) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush and destroy all entries in the cache: */
 
@@ -1820,7 +1893,7 @@ smoke_check_8(void)
 
     if ( show_progress ) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_col_major_scan_forward(/* file_ptr              */ file_ptr,
                               /* max_index              */ max_index,
@@ -1833,7 +1906,7 @@ smoke_check_8(void)
 
     if ( show_progress ) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush all entries in the cache: */
 
@@ -1844,7 +1917,7 @@ smoke_check_8(void)
 
     if ( show_progress ) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     hl_col_major_scan_backward(/* file_ptr              */ file_ptr,
                                /* max_index              */ max_index,
@@ -1857,13 +1930,13 @@ smoke_check_8(void)
 
     if ( show_progress ) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
     if ( show_progress ) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
@@ -1873,7 +1946,7 @@ smoke_check_8(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -1905,15 +1978,15 @@ smoke_check_8(void)
  */
 
 static unsigned
-smoke_check_9(void)
+smoke_check_9(int express_test)
 {
-    const char * fcn_name = "smoke_check_9";
     herr_t result;
     hbool_t show_progress = FALSE;
     int dirty_unprotects = FALSE;
     int dirty_destroys = FALSE;
     hbool_t display_stats = FALSE;
     hbool_t display_detailed_stats = FALSE;
+    int32_t max_index = (10 * 1024) - 1;
     int32_t lag = 10;
     int mile_stone = 1;
     H5F_t * file_ptr = NULL;
@@ -1921,23 +1994,38 @@ smoke_check_9(void)
 
     TESTING("smoke check #9 -- all clean, ins, dest, ren, 4/2 MB, corked");
 
-    if ( skip_long_tests ) {
-        SKIPPED();
-        HDfprintf(stdout, "	Long tests disabled.\n");
-        return 0;  /* <========== note return */
+    switch ( express_test )
+    {
+	case 0:
+	    max_index = (10 * 1024) - 1;
+	    break;
+
+	case 1:
+	    max_index = (1 * 1024) - 1;
+	    break;
+
+	case 2:
+	    max_index = (512) - 1;
+	    break;
+
+	default:
+            SKIPPED();
+            HDfprintf(stdout, "	Long tests disabled.\n");
+	    return 0;  /* <========== note return */
+	    break;
     }
 
     pass = TRUE;
 
     if ( show_progress ) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
     if ( show_progress ) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     file_ptr = setup_cache((size_t)(4 * 1024 * 1024),
                             (size_t)(2 * 1024 * 1024));
@@ -1947,7 +2035,7 @@ smoke_check_9(void)
 
     if ( show_progress ) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -1962,9 +2050,10 @@ smoke_check_9(void)
 
     if ( show_progress ) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     row_major_scan_forward(/* file_ptr              */ file_ptr,
+		            /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -1982,7 +2071,7 @@ smoke_check_9(void)
 
     if ( show_progress ) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -1997,9 +2086,10 @@ smoke_check_9(void)
 
     if ( show_progress ) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled \n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     row_major_scan_backward(/* file_ptr              */ file_ptr,
+                             /* max_index              */ max_index,
                             /* lag                    */ lag,
                             /* verbose                */ FALSE,
                             /* reset_stats            */ TRUE,
@@ -2015,7 +2105,7 @@ smoke_check_9(void)
 
     if ( show_progress ) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -2030,9 +2120,10 @@ smoke_check_9(void)
 
     if ( show_progress ) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled \n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     row_major_scan_forward(/* file_ptr              */ file_ptr,
+		            /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -2048,7 +2139,7 @@ smoke_check_9(void)
 
     if ( show_progress ) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -2063,7 +2154,7 @@ smoke_check_9(void)
 
     if ( show_progress ) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled \n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush and destroy all entries in the cache: */
 
@@ -2074,7 +2165,7 @@ smoke_check_9(void)
 
     if ( show_progress ) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -2089,9 +2180,10 @@ smoke_check_9(void)
 
     if ( show_progress ) /* 12 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     col_major_scan_forward(/* file_ptr              */ file_ptr,
+		            /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -2102,7 +2194,7 @@ smoke_check_9(void)
 
     if ( show_progress ) /* 13 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush all entries in the cache: */
 
@@ -2113,7 +2205,7 @@ smoke_check_9(void)
 
     if ( show_progress ) /* 14 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -2128,9 +2220,10 @@ smoke_check_9(void)
 
     if ( show_progress ) /* 15 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     col_major_scan_backward(/* file_ptr              */ file_ptr,
+		             /* max_index              */ max_index,
                             /* lag                    */ lag,
                             /* verbose                */ FALSE,
                             /* reset_stats            */ TRUE,
@@ -2141,7 +2234,7 @@ smoke_check_9(void)
 
     if ( show_progress ) /* 16 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -2157,13 +2250,13 @@ smoke_check_9(void)
 
     if ( show_progress ) /* 17 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
     if ( show_progress ) /* 18 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
@@ -2173,7 +2266,7 @@ smoke_check_9(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -2205,15 +2298,15 @@ smoke_check_9(void)
  */
 
 static unsigned
-smoke_check_10(void)
+smoke_check_10(int express_test)
 {
-    const char * fcn_name = "smoke_check_10";
     herr_t result;
     hbool_t show_progress = FALSE;
     int dirty_unprotects = TRUE;
     int dirty_destroys = TRUE;
     hbool_t display_stats = FALSE;
     hbool_t display_detailed_stats = FALSE;
+    int32_t max_index = (10 * 1024) - 1;
     int32_t lag = 10;
     int mile_stone = 1;
     H5F_t * file_ptr = NULL;
@@ -2221,23 +2314,38 @@ smoke_check_10(void)
 
     TESTING("smoke check #10 -- ~1/2 dirty, ins, dest, ren, 4/2 MB, corked");
 
-    if ( skip_long_tests ) {
-        SKIPPED();
-        HDfprintf(stdout, "	Long tests disabled.\n");
-        return 0;  /* <========== note return */
+    switch ( express_test )
+    {
+	case 0:
+	    max_index = (10 * 1024) - 1;
+	    break;
+
+	case 1:
+	    max_index = (1 * 1024) - 1;
+	    break;
+
+	case 2:
+	    max_index = (512) - 1;
+	    break;
+
+	default:
+            SKIPPED();
+            HDfprintf(stdout, "	Long tests disabled.\n");
+	    return 0;  /* <========== note return */
+	    break;
     }
 
     pass = TRUE;
 
     if ( show_progress ) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
     if ( show_progress ) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     file_ptr = setup_cache((size_t)(4 * 1024 * 1024),
                             (size_t)(2 * 1024 * 1024));
@@ -2245,9 +2353,10 @@ smoke_check_10(void)
 
     if ( show_progress ) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     row_major_scan_forward(/* file_ptr              */ file_ptr,
+		            /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -2263,7 +2372,7 @@ smoke_check_10(void)
 
     if ( show_progress ) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -2278,9 +2387,10 @@ smoke_check_10(void)
 
     if ( show_progress ) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     row_major_scan_backward(/* file_ptr              */ file_ptr,
+                             /* max_index              */ max_index,
                             /* lag                    */ lag,
                             /* verbose                */ FALSE,
                             /* reset_stats            */ TRUE,
@@ -2296,7 +2406,7 @@ smoke_check_10(void)
 
     if ( show_progress ) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -2311,9 +2421,10 @@ smoke_check_10(void)
 
     if ( show_progress ) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     row_major_scan_forward(/* file_ptr              */ file_ptr,
+		            /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -2329,7 +2440,7 @@ smoke_check_10(void)
 
     if ( show_progress ) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -2344,7 +2455,7 @@ smoke_check_10(void)
 
     if ( show_progress ) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush and destroy all entries in the cache: */
 
@@ -2355,7 +2466,7 @@ smoke_check_10(void)
 
     if ( show_progress ) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -2370,9 +2481,10 @@ smoke_check_10(void)
 
     if ( show_progress ) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     col_major_scan_forward(/* file_ptr              */ file_ptr,
+		            /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -2383,7 +2495,7 @@ smoke_check_10(void)
 
     if ( show_progress ) /* 12 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -2398,7 +2510,7 @@ smoke_check_10(void)
 
     if ( show_progress ) /* 13 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush all entries in the cache: */
 
@@ -2409,7 +2521,7 @@ smoke_check_10(void)
 
     if ( show_progress ) /* 14 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -2424,9 +2536,10 @@ smoke_check_10(void)
 
     if ( show_progress ) /* 15 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     col_major_scan_backward(/* file_ptr              */ file_ptr,
+		             /* max_index              */ max_index,
                             /* lag                    */ lag,
                             /* verbose                */ FALSE,
                             /* reset_stats            */ TRUE,
@@ -2437,7 +2550,7 @@ smoke_check_10(void)
 
     if ( show_progress ) /* 16 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -2452,13 +2565,13 @@ smoke_check_10(void)
 
     if ( show_progress ) /* 17 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
     if ( show_progress ) /* 18 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
@@ -2468,7 +2581,7 @@ smoke_check_10(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -2494,16 +2607,19 @@ smoke_check_10(void)
  *
  *-------------------------------------------------------------------------
  */
-
 static unsigned
-write_permitted_check(void)
+write_permitted_check(int
+#if !H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
+H5_ATTR_UNUSED
+#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
+express_test)
 {
 
 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
 
-    const char * fcn_name = "write_permitted_check";
     hbool_t show_progress = FALSE;
     hbool_t display_stats = FALSE;
+    int32_t max_index = (10 * 1024) - 1;
     int32_t lag = 10;
     int mile_stone = 1;
     H5F_t * file_ptr = NULL;
@@ -2514,26 +2630,48 @@ write_permitted_check(void)
 
 #if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS
 
+    switch ( express_test )
+    {
+	case 0:
+	    max_index = (10 * 1024) - 1;
+	    break;
+
+	case 1:
+	    max_index = (1 * 1024) - 1;
+	    break;
+
+	case 2:
+	    max_index = (512) - 1;
+	    break;
+
+	default:
+            SKIPPED();
+            HDfprintf(stdout, "	Long tests disabled.\n");
+	    return 0;  /* <========== note return */
+	    break;
+    }
+
     pass = TRUE;
 
     if ( show_progress ) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     reset_entries();
 
     if ( show_progress ) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     file_ptr = setup_cache((size_t)(1 * 1024 * 1024),
                             (size_t)(0));
 
     if ( show_progress ) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     row_major_scan_forward(/* file_ptr              */ file_ptr,
+		            /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -2549,11 +2687,12 @@ write_permitted_check(void)
 
     if ( show_progress ) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     write_permitted = FALSE;
 
     row_major_scan_backward(/* file_ptr              */ file_ptr,
+                             /* max_index              */ max_index,
                             /* lag                    */ lag,
                             /* verbose                */ FALSE,
                             /* reset_stats            */ TRUE,
@@ -2569,11 +2708,12 @@ write_permitted_check(void)
 
     if ( show_progress ) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     write_permitted = TRUE;
 
     row_major_scan_forward(/* file_ptr              */ file_ptr,
+		            /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -2589,7 +2729,7 @@ write_permitted_check(void)
 
     if ( show_progress ) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* flush and destroy all entries in the cache: */
 
@@ -2600,9 +2740,10 @@ write_permitted_check(void)
 
     if ( show_progress ) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     col_major_scan_forward(/* file_ptr              */ file_ptr,
+		            /* max_index              */ max_index,
                            /* lag                    */ lag,
                            /* verbose                */ FALSE,
                            /* reset_stats            */ TRUE,
@@ -2613,11 +2754,12 @@ write_permitted_check(void)
 
     if ( show_progress ) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     write_permitted = FALSE;
 
     col_major_scan_backward(/* file_ptr              */ file_ptr,
+		             /* max_index              */ max_index,
                             /* lag                    */ lag,
                             /* verbose                */ FALSE,
                             /* reset_stats            */ TRUE,
@@ -2630,13 +2772,13 @@ write_permitted_check(void)
 
     if ( show_progress ) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     takedown_cache(file_ptr, display_stats, TRUE);
 
     if ( show_progress ) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     verify_clean();
     verify_unprotected();
@@ -2646,7 +2788,7 @@ write_permitted_check(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
 #else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */
@@ -2686,7 +2828,6 @@ write_permitted_check(void)
 static unsigned
 check_insert_entry(void)
 {
-    const char *               fcn_name = "check_insert_entry";
     int                        entry_type = PICO_ENTRY_TYPE;
     int                        i;
     herr_t                     result;
@@ -2745,7 +2886,7 @@ check_insert_entry(void)
 
 	result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
 			              &in_cache, &is_dirty, &is_protected,
-				      &is_pinned);
+				      &is_pinned, NULL, NULL, NULL);
 
         if ( result < 0 ) {
 
@@ -2952,7 +3093,7 @@ check_insert_entry(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -2979,8 +3120,6 @@ check_insert_entry(void)
 static unsigned
 check_flush_cache(void)
 {
-    const char * fcn_name = "check_flush_cache";
-    hbool_t      show_progress = FALSE;
     H5F_t *      file_ptr = NULL;
 
     TESTING("H5C_flush_cache() functionality");
@@ -2994,11 +3133,6 @@ check_flush_cache(void)
 
     if ( pass ) {
 
-	if ( show_progress ) {
-
-	    HDfprintf(stdout, "%s: reseting entries.\n", fcn_name);
-	}
-
         reset_entries();
 
         file_ptr = setup_cache((size_t)(2 * 1024 * 1024),
@@ -3011,12 +3145,6 @@ check_flush_cache(void)
 
     if ( pass ) {
 
-	if ( show_progress ) {
-
-	    HDfprintf(stdout, "%s: calling check_flush_cache__empty_cache().\n",
-		      fcn_name);
-	}
-
         check_flush_cache__empty_cache(file_ptr);
     }
 
@@ -3026,45 +3154,21 @@ check_flush_cache(void)
 
     if ( pass ) {
 
-	if ( show_progress ) {
-
-	    HDfprintf(stdout, "%s: calling check_flush_cache__single_entry().\n",
-		      fcn_name);
-	}
-
         check_flush_cache__single_entry(file_ptr);
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-
-	    HDfprintf(stdout, "%s: calling check_flush_cache__multi_entry().\n",
-		      fcn_name);
-	}
-
         check_flush_cache__multi_entry(file_ptr);
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-
-	    HDfprintf(stdout, "%s: calling check_flush_cache__flush_ops().\n",
-		      fcn_name);
-	}
-
 	check_flush_cache__flush_ops(file_ptr);
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-
-	    HDfprintf(stdout, "%s: calling takedown_cache().\n",
-		      fcn_name);
-	}
-
         takedown_cache(file_ptr, FALSE, FALSE);
     }
 
@@ -3073,7 +3177,7 @@ check_flush_cache(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -3100,7 +3204,6 @@ check_flush_cache(void)
 static void
 check_flush_cache__empty_cache(H5F_t * file_ptr)
 {
-    /* const char * fcn_name = "check_flush_cache__empty_cache"; */
     H5C_t * cache_ptr = file_ptr->shared->cache;
     herr_t	 result;
 
@@ -3123,8 +3226,7 @@ check_flush_cache__empty_cache(H5F_t * file_ptr)
 
     if ( pass ) {
 
-        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                H5C__NO_FLAGS_SET);
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__NO_FLAGS_SET);
 
         if ( result < 0 ) {
 
@@ -3135,8 +3237,7 @@ check_flush_cache__empty_cache(H5F_t * file_ptr)
 
     if ( pass ) {
 
-        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                                 H5C__FLUSH_INVALIDATE_FLAG);
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__FLUSH_INVALIDATE_FLAG);
 
         if ( result < 0 ) {
 
@@ -3147,8 +3248,7 @@ check_flush_cache__empty_cache(H5F_t * file_ptr)
 
     if ( pass ) {
 
-        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                                 H5C__FLUSH_CLEAR_ONLY_FLAG);
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__FLUSH_CLEAR_ONLY_FLAG);
 
         if ( result < 0 ) {
 
@@ -3160,8 +3260,7 @@ check_flush_cache__empty_cache(H5F_t * file_ptr)
 
     if ( pass ) {
 
-        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                                 H5C__FLUSH_MARKED_ENTRIES_FLAG);
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__FLUSH_MARKED_ENTRIES_FLAG);
 
         if ( result < 0 ) {
 
@@ -3195,7 +3294,6 @@ check_flush_cache__empty_cache(H5F_t * file_ptr)
 static void
 check_flush_cache__multi_entry(H5F_t * file_ptr)
 {
-    /* const char * fcn_name = "check_flush_cache__multi_entry"; */
     H5C_t *cache_ptr = file_ptr->shared->cache;
 
     if ( cache_ptr == NULL ) {
@@ -3223,9 +3321,8 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
             /* entry_index           = */ 100,
             /* insert_flag           = */ FALSE,
             /* flags                 = */ H5C__NO_FLAGS_SET,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ FALSE,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
             /* expected_destroyed    = */ FALSE
           },
           {
@@ -3234,9 +3331,8 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
             /* entry_index           = */ 75,
             /* insert_flag           = */ FALSE,
             /* flags                 = */ H5C__DIRTIED_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ TRUE,
             /* expected_destroyed    = */ FALSE
           },
           {
@@ -3245,9 +3341,8 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
             /* entry_index           = */ 25,
             /* insert_flag           = */ TRUE,
             /* flags                 = */ H5C__NO_FLAGS_SET,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
             /* expected_destroyed    = */ FALSE
           },
           {
@@ -3255,10 +3350,9 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
             /* entry_type            = */ PICO_ENTRY_TYPE,
             /* entry_index           = */ 50,
             /* insert_flag           = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
             /* expected_destroyed    = */ FALSE
           },
           {
@@ -3267,9 +3361,8 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
             /* entry_index           = */ 10,
             /* insert_flag           = */ FALSE,
             /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ FALSE,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
             /* expected_destroyed    = */ FALSE
           },
           {
@@ -3278,9 +3371,8 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
             /* entry_index           = */ 20,
             /* insert_flag           = */ FALSE,
             /* flags                 = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ TRUE,
             /* expected_destroyed    = */ FALSE
           },
           {
@@ -3289,20 +3381,18 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
             /* entry_index           = */ 30,
             /* insert_flag           = */ TRUE,
             /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
             /* expected_destroyed    = */ FALSE
           },
           {
-           /* entry_num             = */ 7,
+            /* entry_num             = */ 7,
             /* entry_type            = */ MONSTER_ENTRY_TYPE,
             /* entry_index           = */ 40,
             /* insert_flag           = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
             /* expected_destroyed    = */ FALSE
           }
         };
@@ -3320,92 +3410,84 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
         struct flush_cache_test_spec spec[8] =
         {
           {
-            /* entry_num          = */ 0,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 100,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 0,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 100,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 1,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 75,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 1,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 75,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 2,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 25,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 2,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 25,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 3,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 50,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 3,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 50,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 4,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 10,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 4,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 10,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 5,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 20,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 5,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 20,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 6,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 30,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 6,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 30,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 7,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 40,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 7,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 40,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           }
         };
 
@@ -3422,92 +3504,84 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
         struct flush_cache_test_spec spec[8] =
         {
           {
-            /* entry_num          = */ 0,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 100,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 0,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 100,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 1,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 75,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 1,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 75,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 2,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 25,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 2,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 25,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 3,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 50,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 3,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 50,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 4,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 10,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 4,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 10,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 5,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 20,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 5,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 20,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 6,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 30,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 6,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 30,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 7,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 40,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 7,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 40,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           }
         };
 
@@ -3524,92 +3598,84 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
         struct flush_cache_test_spec spec[8] =
         {
           {
-            /* entry_num          = */ 0,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 100,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
-          },
-          {
-            /* entry_num          = */ 1,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 75,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 0,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 100,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 2,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 25,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 1,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 75,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 3,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 50,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 2,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 25,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 4,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 10,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 3,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 50,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 5,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 20,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ FALSE
-          },
+            /* entry_num             = */ 4,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 10,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
+          },
           {
-            /* entry_num          = */ 6,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 30,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 5,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 20,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 7,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 40,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 6,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 30,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ FALSE
+          },
+          {
+            /* entry_num             = */ 7,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 40,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ FALSE
           }
         };
 
@@ -3627,92 +3693,84 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
         struct flush_cache_test_spec spec[8] =
         {
           {
-            /* entry_num          = */ 0,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 100,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 0,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 100,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 1,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 75,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 1,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 75,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 2,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 25,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 2,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 25,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 3,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 50,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 3,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 50,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 4,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 10,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 4,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 10,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 5,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 20,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 5,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 20,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 6,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 30,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 6,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 30,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 7,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 40,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 7,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 40,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           }
         };
 
@@ -3730,92 +3788,84 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
         struct flush_cache_test_spec spec[8] =
         {
           {
-            /* entry_num          = */ 0,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 100,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 0,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 100,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 1,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 75,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 1,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 75,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 2,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 25,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 2,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 25,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 3,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 50,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 3,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 50,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 4,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 10,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 4,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 10,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 5,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 20,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 5,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 20,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 6,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 30,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 6,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 30,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 7,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 40,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 7,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 40,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           }
         };
 
@@ -3833,92 +3883,84 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
         struct flush_cache_test_spec spec[8] =
         {
           {
-            /* entry_num          = */ 0,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 100,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 0,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 100,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 1,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 75,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 1,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 75,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 2,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 25,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 2,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 25,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 3,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 50,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 3,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 50,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 4,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 10,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 4,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 10,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 5,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 20,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 5,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 20,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 6,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 30,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 6,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 30,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 7,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 40,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 7,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 40,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           }
         };
 
@@ -3937,92 +3979,84 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
         struct flush_cache_test_spec spec[8] =
         {
           {
-            /* entry_num          = */ 0,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 100,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 0,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 100,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 1,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 75,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 1,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 75,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 2,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 25,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 2,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 25,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 3,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 50,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 3,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 50,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 4,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 10,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 4,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 10,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 5,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 20,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 5,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 20,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 6,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 30,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 6,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 30,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 7,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 40,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 7,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 40,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           }
         };
 
@@ -4043,92 +4077,84 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
         struct flush_cache_test_spec spec[8] =
         {
           {
-            /* entry_num          = */ 0,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 100,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 0,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 100,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 1,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 75,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 1,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 75,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 2,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 25,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 2,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 25,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 3,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 50,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 3,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 50,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 4,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 10,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 4,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 10,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 5,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 20,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 5,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 20,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 6,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 30,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 6,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 30,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 7,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 40,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 7,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 40,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ FALSE
           }
         };
 
@@ -4150,144 +4176,136 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
         struct pe_flush_cache_test_spec spec[8] =
         {
           {
-            /* entry_num          = */ 0,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 100,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-	    /* num_pins           = */ 0,
-	    /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 0,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 100,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+	    /* num_pins              = */ 0,
+	    /* pin_type[MAX_PINS]    = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 1,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 75,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-	    /* num_pins           = */ 1,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-		                        -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 1,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 75,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG,
+	    /* num_pins              = */ 1,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+		                           -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 2,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 25,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-	    /* num_pins           = */ 2,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-		                        PICO_ENTRY_TYPE,
-		                        -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, 75, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 2,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 25,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+	    /* num_pins              = */ 2,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+		                           PICO_ENTRY_TYPE,
+		                           -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, 75, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 3,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 50,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-	    /* num_pins           = */ 3,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-		                        PICO_ENTRY_TYPE,
-					PICO_ENTRY_TYPE,
-		                        -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, 75, 25, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 3,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 50,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+	    /* num_pins              = */ 3,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+		                           PICO_ENTRY_TYPE,
+					   PICO_ENTRY_TYPE,
+		                           -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, 75, 25, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 4,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 10,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 4,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-                                        PICO_ENTRY_TYPE,
-                                        PICO_ENTRY_TYPE,
-					PICO_ENTRY_TYPE,
-					-1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, 75, 25, 50, -1, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 4,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 10,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+	    /* num_pins              = */ 4,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+                                           PICO_ENTRY_TYPE,
+                                           PICO_ENTRY_TYPE,
+					   PICO_ENTRY_TYPE,
+					   -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, 75, 25, 50, -1, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 5,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 20,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 5,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-                                        PICO_ENTRY_TYPE,
-                                        PICO_ENTRY_TYPE,
-					PICO_ENTRY_TYPE,
-					MONSTER_ENTRY_TYPE,
-					-1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, 75, 25, 50, 10, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 5,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 20,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+	    /* num_pins              = */ 5,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+                                           PICO_ENTRY_TYPE,
+                                           PICO_ENTRY_TYPE,
+					   PICO_ENTRY_TYPE,
+					   MONSTER_ENTRY_TYPE,
+					   -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, 75, 25, 50, 10, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 6,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 30,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 6,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-                                        PICO_ENTRY_TYPE,
-                                        PICO_ENTRY_TYPE,
-					PICO_ENTRY_TYPE,
-					MONSTER_ENTRY_TYPE,
-					MONSTER_ENTRY_TYPE,
-					-1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, 75, 25, 50, 10, 20, -1, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 6,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 30,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+	    /* num_pins              = */ 6,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+                                           PICO_ENTRY_TYPE,
+                                           PICO_ENTRY_TYPE,
+					   PICO_ENTRY_TYPE,
+				 	   MONSTER_ENTRY_TYPE,
+					   MONSTER_ENTRY_TYPE,
+					   -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, 75, 25, 50, 10, 20, -1, -1},
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ FALSE
           },
           {
-            /* entry_num          = */ 7,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 40,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 7,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-                                        PICO_ENTRY_TYPE,
-                                        PICO_ENTRY_TYPE,
-					PICO_ENTRY_TYPE,
-					MONSTER_ENTRY_TYPE,
-					MONSTER_ENTRY_TYPE,
-					MONSTER_ENTRY_TYPE,
-					-1},
-	    /* pin_idx[MAX_PINS]  = */ {100, 75, 25, 50, 10, 20, 30, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ FALSE
+            /* entry_num             = */ 7,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 40,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+	    /* num_pins              = */ 7,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+                                           PICO_ENTRY_TYPE,
+                                           PICO_ENTRY_TYPE,
+					   PICO_ENTRY_TYPE,
+					   MONSTER_ENTRY_TYPE,
+					   MONSTER_ENTRY_TYPE,
+					   MONSTER_ENTRY_TYPE,
+					   -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, 75, 25, 50, 10, 20, 30, -1},
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ FALSE
           }
         };
 
@@ -4304,128 +4322,120 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
         struct pe_flush_cache_test_spec spec[8] =
         {
           {
-            /* entry_num          = */ 0,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 100,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-	    /* num_pins           = */ 0,
-	    /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 0,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 100,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+	    /* num_pins              = */ 0,
+	    /* pin_type[MAX_PINS]    = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 1,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 75,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-	    /* num_pins           = */ 1,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-		                        -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 1,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 75,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG,
+	    /* num_pins              = */ 1,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+		                           -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 2,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 25,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-	    /* num_pins           = */ 2,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-		                        PICO_ENTRY_TYPE,
-		                        -1, -1, -1, -1, -1, -1},
+            /* entry_num             = */ 2,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 25,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+	    /* num_pins              = */ 2,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+		                           PICO_ENTRY_TYPE,
+		                           -1, -1, -1, -1, -1, -1},
 	    /* pin_idx[MAX_PINS]  = */ {100, 75, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 3,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 50,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-	    /* num_pins           = */ 3,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-		                        PICO_ENTRY_TYPE,
-					PICO_ENTRY_TYPE,
-		                        -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, 75, 25, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 3,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 50,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+	    /* num_pins              = */ 3,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+		                           PICO_ENTRY_TYPE,
+					   PICO_ENTRY_TYPE,
+		                           -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, 75, 25, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 4,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 10,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 0,
-	    /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 4,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 10,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+	    /* num_pins              = */ 0,
+	    /* pin_type[MAX_PINS]    = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 5,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 20,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 1,
-	    /* pin_type[MAX_PINS] = */ {MONSTER_ENTRY_TYPE,
-					-1, -1, -1, -1 -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {10, -1, -1, -1 -1, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 5,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 20,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+	    /* num_pins              = */ 1,
+	    /* pin_type[MAX_PINS]    = */ {MONSTER_ENTRY_TYPE,
+					   -1, -1, -1, -1 -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {10, -1, -1, -1 -1, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 6,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 30,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 2,
-	    /* pin_type[MAX_PINS] = */ {MONSTER_ENTRY_TYPE,
-					MONSTER_ENTRY_TYPE,
-					-1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {10, 20, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 6,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 30,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+	    /* num_pins              = */ 2,
+	    /* pin_type[MAX_PINS]    = */ {MONSTER_ENTRY_TYPE,
+					   MONSTER_ENTRY_TYPE,
+					   -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {10, 20, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 7,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 40,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 3,
-	    /* pin_type[MAX_PINS] = */ {MONSTER_ENTRY_TYPE,
-					MONSTER_ENTRY_TYPE,
-					MONSTER_ENTRY_TYPE,
-					-1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {10, 20, 30, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 7,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 40,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+	    /* num_pins              = */ 3,
+	    /* pin_type[MAX_PINS]    = */ {MONSTER_ENTRY_TYPE,
+					   MONSTER_ENTRY_TYPE,
+					   MONSTER_ENTRY_TYPE,
+					   -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {10, 20, 30, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           }
         };
 
@@ -4442,119 +4452,111 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
         struct pe_flush_cache_test_spec spec[8] =
         {
           {
-            /* entry_num          = */ 0,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 100,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-	    /* num_pins           = */ 0,
-	    /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 0,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 100,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+	    /* num_pins              = */ 0,
+	    /* pin_type[MAX_PINS]    = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 1,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 75,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-	    /* num_pins           = */ 1,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-		                        -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 1,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 75,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG,
+	    /* num_pins              = */ 1,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+		                           -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 2,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 25,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-	    /* num_pins           = */ 1,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-		                        -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 2,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 25,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+	    /* num_pins              = */ 1,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+		                           -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 3,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 50,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-	    /* num_pins           = */ 1,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-		                        -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 3,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 50,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+	    /* num_pins              = */ 1,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+		                           -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 4,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 10,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 0,
-	    /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 4,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 10,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+	    /* num_pins              = */ 0,
+	    /* pin_type[MAX_PINS]    = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 5,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 20,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 0,
-	    /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 5,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 20,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+	    /* num_pins              = */ 0,
+	    /* pin_type[MAX_PINS]    = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 6,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 30,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 0,
-	    /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 6,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 30,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+	    /* num_pins              = */ 0,
+	    /* pin_type[MAX_PINS]    = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 7,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 40,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 0,
-	    /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 7,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 40,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+	    /* num_pins              = */ 0,
+	    /* pin_type[MAX_PINS]    = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           }
         };
 
@@ -4572,127 +4574,119 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
         struct pe_flush_cache_test_spec spec[8] =
         {
           {
-            /* entry_num          = */ 0,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 100,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-	    /* num_pins           = */ 0,
-	    /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 0,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 100,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+	    /* num_pins              = */ 0,
+	    /* pin_type[MAX_PINS]    = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 1,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 75,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-	    /* num_pins           = */ 1,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-		                        -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 1,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 75,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG,
+	    /* num_pins              = */ 1,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+		                           -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 2,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 25,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-	    /* num_pins           = */ 1,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-		                        -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 2,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 25,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+	    /* num_pins              = */ 1,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+		                           -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 3,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 50,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-	    /* num_pins           = */ 1,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-		                        -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 3,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 50,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+	    /* num_pins              = */ 1,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+		                           -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 4,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 10,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 0,
-	    /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 4,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 10,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+	    /* num_pins              = */ 0,
+	    /* pin_type[MAX_PINS]    = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 5,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 20,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 4,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-                                        PICO_ENTRY_TYPE,
-                                        PICO_ENTRY_TYPE,
-					PICO_ENTRY_TYPE,
-					-1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, 75, 25, 50, -1, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 5,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 20,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG,
+	    /* num_pins              = */ 4,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+                                           PICO_ENTRY_TYPE,
+                                           PICO_ENTRY_TYPE,
+					   PICO_ENTRY_TYPE,
+					   -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, 75, 25, 50, -1, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 6,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 30,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 4,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-                                        PICO_ENTRY_TYPE,
-                                        PICO_ENTRY_TYPE,
-					PICO_ENTRY_TYPE,
-					-1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, 75, 25, 50, -1, -1, -1, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 6,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 30,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+	    /* num_pins              = */ 4,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+                                           PICO_ENTRY_TYPE,
+                                           PICO_ENTRY_TYPE,
+					   PICO_ENTRY_TYPE,
+					   -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, 75, 25, 50, -1, -1, -1, -1},
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 7,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 40,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 0,
-	    /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ FALSE,
-            /* expected_flushed   = */ TRUE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 7,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 40,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+	    /* num_pins              = */ 0,
+	    /* pin_type[MAX_PINS]    = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ TRUE,
+            /* expected_destroyed    = */ TRUE
           }
         };
 
@@ -4711,123 +4705,115 @@ check_flush_cache__multi_entry(H5F_t * file_ptr)
         struct pe_flush_cache_test_spec spec[8] =
         {
           {
-            /* entry_num          = */ 0,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 100,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-	    /* num_pins           = */ 0,
-	    /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {-1, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 0,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 100,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+	    /* num_pins              = */ 0,
+	    /* pin_type[MAX_PINS]    = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {-1, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 1,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 75,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-	    /* num_pins           = */ 1,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-		                        -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 1,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 75,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG,
+	    /* num_pins              = */ 1,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+		                           -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 2,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 25,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__NO_FLAGS_SET,
-	    /* num_pins           = */ 1,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-		                        -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 2,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 25,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+	    /* num_pins              = */ 1,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+		                           -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 3,
-            /* entry_type         = */ PICO_ENTRY_TYPE,
-            /* entry_index        = */ 50,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG,
-	    /* num_pins           = */ 1,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-		                        -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 3,
+            /* entry_type            = */ PICO_ENTRY_TYPE,
+            /* entry_index           = */ 50,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__NO_FLAGS_SET,
+	    /* num_pins              = */ 1,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+		                           -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 4,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 10,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 1,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-		                        -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 4,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 10,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+	    /* num_pins              = */ 1,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+		                           -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 5,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 20,
-            /* insert_flag        = */ FALSE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 1,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-		                        -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ TRUE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 5,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 20,
+            /* insert_flag           = */ FALSE,
+            /* flags                 = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+	    /* num_pins              = */ 1,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+		                           -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ TRUE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 6,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 30,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 1,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-		                        -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 6,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 30,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+	    /* num_pins              = */ 1,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+		                           -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           },
           {
-            /* entry_num          = */ 7,
-            /* entry_type         = */ MONSTER_ENTRY_TYPE,
-            /* entry_index        = */ 40,
-            /* insert_flag        = */ TRUE,
-            /* flags              = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-	    /* num_pins           = */ 1,
-	    /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE,
-		                        -1, -1, -1, -1, -1, -1, -1},
-	    /* pin_idx[MAX_PINS]  = */ {100, -1, -1, -1, -1, -1, -1, -1},
-            /* expected_loaded    = */ FALSE,
-            /* expected_cleared   = */ TRUE,
-            /* expected_flushed   = */ FALSE,
-            /* expected_destroyed = */ TRUE
+            /* entry_num             = */ 7,
+            /* entry_type            = */ MONSTER_ENTRY_TYPE,
+            /* entry_index           = */ 40,
+            /* insert_flag           = */ TRUE,
+            /* flags                 = */ H5C__SET_FLUSH_MARKER_FLAG,
+	    /* num_pins              = */ 1,
+	    /* pin_type[MAX_PINS]    = */ {PICO_ENTRY_TYPE,
+		                           -1, -1, -1, -1, -1, -1, -1},
+	    /* pin_idx[MAX_PINS]     = */ {100, -1, -1, -1, -1, -1, -1, -1},
+            /* expected_deserialized = */ FALSE,
+            /* expected_serialized   = */ FALSE,
+            /* expected_destroyed    = */ TRUE
           }
         };
 
@@ -4862,7 +4848,6 @@ check_flush_cache__multi_entry_test(H5F_t * file_ptr,
                                     int spec_size,
                                     struct flush_cache_test_spec spec[])
 {
-    /* const char *   fcn_name = "check_flush_cache__multi_entry_test"; */
     H5C_t * cache_ptr = file_ptr->shared->cache;
     static char    msg[128];
     herr_t	   result;
@@ -4946,7 +4931,7 @@ check_flush_cache__multi_entry_test(H5F_t * file_ptr,
 
     if ( pass ) {
 
-        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT, flush_flags);
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, flush_flags);
 
         if ( result < 0 ) {
 
@@ -4964,21 +4949,18 @@ check_flush_cache__multi_entry_test(H5F_t * file_ptr,
         base_addr = entries[spec[i].entry_type];
         entry_ptr = &(base_addr[spec[i].entry_index]);
 
-        if ( ( entry_ptr->loaded != spec[i].expected_loaded ) ||
-             ( entry_ptr->cleared != spec[i].expected_cleared ) ||
-             ( entry_ptr->flushed != spec[i].expected_flushed ) ||
+        if ( ( entry_ptr->deserialized != spec[i].expected_deserialized ) ||
+             ( entry_ptr->serialized != spec[i].expected_serialized ) ||
              ( entry_ptr->destroyed != spec[i].expected_destroyed ) ) {
 
 #if 0 /* This is useful debugging code.  Lets keep it around. */
 
             HDfprintf(stdout,
-              "loaded = %d(%d), clrd = %d(%d), flshd = %d(%d), dest = %d(%d)\n",
-              (int)(entry_ptr->loaded),
-              (int)(spec[i].expected_loaded),
-              (int)(entry_ptr->cleared),
-              (int)(spec[i].expected_cleared),
-              (int)(entry_ptr->flushed),
-              (int)(spec[i].expected_flushed),
+              "deslzd = %d(%d), slzd = %d(%d), dest = %d(%d)\n",
+              (int)(entry_ptr->deserialized),
+              (int)(spec[i].expected_deserialized),
+              (int)(entry_ptr->serialized),
+              (int)(spec[i].expected_serialized),
               (int)(entry_ptr->destroyed),
               (int)(spec[i].expected_destroyed));
 
@@ -5023,8 +5005,7 @@ check_flush_cache__multi_entry_test(H5F_t * file_ptr,
     /* clean up the cache to prep for the next test */
     if ( pass ) {
 
-        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                                 H5C__FLUSH_INVALIDATE_FLAG);
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__FLUSH_INVALIDATE_FLAG);
 
         if ( result < 0 ) {
 
@@ -5052,10 +5033,9 @@ check_flush_cache__multi_entry_test(H5F_t * file_ptr,
         base_addr = entries[spec[i].entry_type];
         entry_ptr = &(base_addr[spec[i].entry_index]);
 
-        entry_ptr->loaded    = FALSE;
-        entry_ptr->cleared   = FALSE;
-        entry_ptr->flushed   = FALSE;
-        entry_ptr->destroyed = FALSE;
+        entry_ptr->deserialized = FALSE;
+        entry_ptr->serialized   = FALSE;
+        entry_ptr->destroyed    = FALSE;
 
         i++;
     }
@@ -5087,7 +5067,6 @@ check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr,
                                        int spec_size,
                                        struct pe_flush_cache_test_spec spec[])
 {
-    /* const char *   fcn_name = "check_flush_cache__pe_multi_entry_test"; */
     H5C_t *cache_ptr = file_ptr->shared->cache;
     static char    msg[128];
     herr_t	   result;
@@ -5183,8 +5162,7 @@ check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr,
 
     if ( pass ) {
 
-        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                flush_flags);
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, flush_flags);
 
         if ( result < 0 ) {
 
@@ -5202,21 +5180,18 @@ check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr,
         base_addr = entries[spec[i].entry_type];
         entry_ptr = &(base_addr[spec[i].entry_index]);
 
-        if ( ( entry_ptr->loaded != spec[i].expected_loaded ) ||
-             ( entry_ptr->cleared != spec[i].expected_cleared ) ||
-             ( entry_ptr->flushed != spec[i].expected_flushed ) ||
+        if ( ( entry_ptr->deserialized != spec[i].expected_deserialized ) ||
+             ( entry_ptr->serialized != spec[i].expected_serialized ) ||
              ( entry_ptr->destroyed != spec[i].expected_destroyed ) ) {
 
 #if 0 /* This is useful debugging code.  Lets keep it around. */
 
             HDfprintf(stdout,
-              "loaded = %d(%d), clrd = %d(%d), flshd = %d(%d), dest = %d(%d)\n",
-              (int)(entry_ptr->loaded),
-              (int)(spec[i].expected_loaded),
-              (int)(entry_ptr->cleared),
-              (int)(spec[i].expected_cleared),
-              (int)(entry_ptr->flushed),
-              (int)(spec[i].expected_flushed),
+              "desrlzd = %d(%d), srlzd = %d(%d), dest = %d(%d)\n",
+              (int)(entry_ptr->deserialized),
+              (int)(spec[i].expected_deserialized),
+              (int)(entry_ptr->serialized),
+              (int)(spec[i].expected_serialized),
               (int)(entry_ptr->destroyed),
               (int)(spec[i].expected_destroyed));
 
@@ -5261,8 +5236,7 @@ check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr,
     /* clean up the cache to prep for the next test */
     if ( pass ) {
 
-        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                                 H5C__FLUSH_INVALIDATE_FLAG);
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__FLUSH_INVALIDATE_FLAG);
 
         if ( result < 0 ) {
 
@@ -5290,10 +5264,9 @@ check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr,
         base_addr = entries[spec[i].entry_type];
         entry_ptr = &(base_addr[spec[i].entry_index]);
 
-        entry_ptr->loaded    = FALSE;
-        entry_ptr->cleared   = FALSE;
-        entry_ptr->flushed   = FALSE;
-        entry_ptr->destroyed = FALSE;
+        entry_ptr->deserialized = FALSE;
+        entry_ptr->serialized   = FALSE;
+        entry_ptr->destroyed    = FALSE;
 
         i++;
     }
@@ -5327,7 +5300,6 @@ check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr,
 static void
 check_flush_cache__flush_ops(H5F_t * file_ptr)
 {
-    /* const char *   fcn_name = "check_flush_cache__flush_ops"; */
     H5C_t *cache_ptr = file_ptr->shared->cache;
 
     if ( cache_ptr == NULL ) {
@@ -5370,20 +5342,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
 	  },
           {
@@ -5399,20 +5370,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 1,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__DIRTY,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           }
 	};
@@ -5429,9 +5399,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ FALSE,
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ FALSE
 	  }
 	};
@@ -5480,20 +5449,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
 	  },
           {
@@ -5509,20 +5477,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 1,
 	    /* flush_ops          = */
-	    /*	op_code:		type:		idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	PICO_ENTRY_TYPE,0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,		0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,		0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,		0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,		0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,		0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,		0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,		0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,		0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,		0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:	flag:	size: order_ptr*/
+	    { { FLUSH_OP__DIRTY,	PICO_ENTRY_TYPE,0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           }
 	};
@@ -5539,9 +5506,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ FALSE,
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ FALSE
 	  }
 	};
@@ -5579,7 +5545,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
             /* entry_type         = */ VARIABLE_ENTRY_TYPE,
 	    /* entry_index        = */ 0,
 	    /* insert_flag        = */ FALSE,
-	    /* flags		  = */ H5C__NO_FLAGS_SET,
+	    /* flags		  = */ H5C__DIRTIED_FLAG,
 	    /* resize_flag        = */ TRUE,
 	    /* new_size           = */ VARIABLE_ENTRY_SIZE / 4,
 	    /* num_pins           = */ 0,
@@ -5587,20 +5553,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 1,
 	    /* flush_ops          = */
-	    /*	op_code:		type:			idx:	flag:	size: */
-	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:			idx:	flag:	size: order_ptr:*/
+	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           }
 	};
@@ -5617,9 +5582,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ FALSE,
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ FALSE
 	  }
 	};
@@ -5659,7 +5623,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
             /* entry_type         = */ VARIABLE_ENTRY_TYPE,
 	    /* entry_index        = */ 0,
 	    /* insert_flag        = */ FALSE,
-	    /* flags		  = */ H5C__NO_FLAGS_SET,
+	    /* flags		  = */ H5C__DIRTIED_FLAG,
 	    /* resize_flag        = */ TRUE,
 	    /* new_size           = */ VARIABLE_ENTRY_SIZE / 4,
 	    /* num_pins           = */ 0,
@@ -5667,20 +5631,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 1,
 	    /* flush_ops          = */
-	    /*	op_code:		type:			idx:	flag:	size: */
-	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:			idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           }
 	};
@@ -5697,9 +5660,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ FALSE,
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ FALSE
 	  }
 	};
@@ -5720,11 +5682,17 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
     if ( pass ) /* test #5 & #6 */
     {
 	/* Single entry test verifying that the cache can handle the case in
-	 * which the call back function moves the entry for which it has
-	 * been called.
+	 * which the call back function first resizes and then moves the
+	 * entry for which it has been called.
 	 *
 	 * Run this entry twice, as the first run moves the entry to its
 	 * alternate address, and the second moves it back.
+         *
+         * 10/8/07 -- JRM
+         * Added a resize operation to this test to satisfy the new
+         * requiremnt that any resize of an entry on flush will always
+         * be accompanied by a resize.  Note that as a result, this
+         * test becomes redundant with later tests.
 	 */
         int test_num			= 5; /* and 6 */
 	unsigned int flush_flags	= H5C__NO_FLAGS_SET;
@@ -5732,7 +5700,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	int init_expected_index_len	= 1;
 	size_t init_expected_index_size	= VARIABLE_ENTRY_SIZE;
 	int expected_index_len		= 1;
-	size_t expected_index_size	= VARIABLE_ENTRY_SIZE;
+	size_t expected_index_size	= VARIABLE_ENTRY_SIZE / 2;
 	struct fo_flush_cache_test_spec spec[1] =
 	{
           {
@@ -5746,22 +5714,21 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* num_pins           = */ 0,
 	    /* pin_type           = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
-	    /* num_flush_ops      = */ 1,
+	    /* num_flush_ops      = */ 2,
 	    /* flush_ops          = */
-	    /*	op_code:		type:			idx:	flag:	size: */
-	    { { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:			idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 2,    NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           }
 	};
@@ -5778,9 +5745,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ FALSE,
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ FALSE
 	  }
 	};
@@ -5810,7 +5776,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	 */
 	if ( pass ) {
 
-	    spec[0].flush_ops[0].flag = TRUE;
+	    spec[0].flush_ops[1].flag = TRUE;
 	    test_num = 6;
 
             check_flush_cache__flush_op_test(file_ptr,
@@ -5838,6 +5804,12 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	 *
 	 * Run this entry twice, as the first run moves the entry to its
 	 * alternate address, and the second moves it back.
+         *
+         * 10/8/07 -- JRM
+         * Added a resize operation to this test to satisfy the new
+         * requiremnt that any resize of an entry on flush will always
+         * be accompanied by a resize.  Note that as a result, this
+         * test becomes redundant with later tests.
 	 */
         int test_num			= 7; /* and 8 */
 	unsigned int flush_flags	= H5C__NO_FLAGS_SET;
@@ -5845,7 +5817,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	int init_expected_index_len	= 1;
 	size_t init_expected_index_size	= VARIABLE_ENTRY_SIZE;
 	int expected_index_len		= 1;
-	size_t expected_index_size	= VARIABLE_ENTRY_SIZE;
+	size_t expected_index_size	= VARIABLE_ENTRY_SIZE / 2;
 	struct fo_flush_cache_test_spec spec[1] =
 	{
           {
@@ -5859,22 +5831,21 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* num_pins           = */ 0,
 	    /* pin_type           = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
-	    /* num_flush_ops      = */ 1,
+	    /* num_flush_ops      = */ 2,
 	    /* flush_ops          = */
-	    /*	op_code:		type:			idx:	flag:	size: */
-	    { { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:			idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 2,    NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           }
 	};
@@ -5891,9 +5862,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ FALSE,
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ FALSE
 	  }
 	};
@@ -5928,7 +5898,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    flush_flags = H5C__FLUSH_INVALIDATE_FLAG;
 	    expected_index_len = 0;
 	    expected_index_size	= 0;
-	    spec[0].flush_ops[0].flag = TRUE;
+	    spec[0].flush_ops[1].flag = TRUE;
 	    spec[0].expected_destroyed = TRUE;
 
             check_flush_cache__flush_op_test(file_ptr,
@@ -5968,7 +5938,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
             /* entry_type         = */ VARIABLE_ENTRY_TYPE,
 	    /* entry_index        = */ 0,
 	    /* insert_flag        = */ FALSE,
-	    /* flags		  = */ H5C__NO_FLAGS_SET,
+	    /* flags		  = */ H5C__DIRTIED_FLAG,
 	    /* resize_flag        = */ TRUE,
 	    /* new_size           = */ VARIABLE_ENTRY_SIZE / 2,
 	    /* num_pins           = */ 0,
@@ -5976,20 +5946,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 2,
 	    /* flush_ops          = */
-	    /*	op_code:		type:			idx:	flag:	size: */
-	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:			idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 4, NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           }
 	};
@@ -6006,9 +5975,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ FALSE,
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ FALSE
 	  }
 	};
@@ -6081,7 +6049,7 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
             /* entry_type         = */ VARIABLE_ENTRY_TYPE,
 	    /* entry_index        = */ 0,
 	    /* insert_flag        = */ FALSE,
-	    /* flags		  = */ H5C__NO_FLAGS_SET,
+	    /* flags		  = */ H5C__DIRTIED_FLAG,
 	    /* resize_flag        = */ TRUE,
 	    /* new_size           = */ VARIABLE_ENTRY_SIZE / 2,
 	    /* num_pins           = */ 0,
@@ -6089,20 +6057,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 2,
 	    /* flush_ops          = */
-	    /*	op_code:		type:			idx:	flag:	size: */
-	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:			idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 4,    NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           }
 	};
@@ -6119,9 +6086,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ FALSE,
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ FALSE
 	  }
 	};
@@ -6205,20 +6171,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 2,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	0,	2,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__DIRTY,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__DIRTY,	0,	2,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           }
 	};
@@ -6235,9 +6200,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
 	  },
 	  {
@@ -6250,9 +6214,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
 	  }
 	};
@@ -6304,20 +6267,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 2,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	0,	2,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__DIRTY,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__DIRTY,	0,	2,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           }
 	};
@@ -6334,9 +6296,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
 	  },
 	  {
@@ -6349,9 +6310,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
 	  }
 	};
@@ -6402,20 +6362,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 4,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:			idx:	flag:	size:	order_ptr: */
+	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 4, NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,			0,	FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           }
 	};
@@ -6432,9 +6391,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
 	  },
 	  {
@@ -6447,9 +6405,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
 	  }
 	};
@@ -6500,20 +6457,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 4,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 4, NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           }
 	};
@@ -6530,9 +6486,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
 	  },
 	  {
@@ -6545,9 +6500,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
 	  }
 	};
@@ -6598,20 +6552,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 6,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	2,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 4, NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	0,	NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	0,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	2,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           }
 	};
@@ -6628,9 +6581,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
 	  },
 	  {
@@ -6643,9 +6595,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
 	  }
 	};
@@ -6728,20 +6679,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 6,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	2,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 4, NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	0,	NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	0,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	2,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           }
 	};
@@ -6758,9 +6708,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
 	  },
 	  {
@@ -6773,9 +6722,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
 	  }
 	};
@@ -6870,20 +6818,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 6,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	2,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 4, NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	0,	NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	0,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	2,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
           {
@@ -6899,20 +6846,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 6,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	10,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	10,	FALSE,	0 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	10,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	12,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	12,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	12,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ FALSE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	10,	FALSE,	VARIABLE_ENTRY_SIZE / 4, NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	10,	FALSE,	0,	NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	10,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	12,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	12,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	12,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ FALSE
           },
           {
@@ -6928,20 +6874,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
           {
@@ -6957,20 +6902,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ FALSE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ FALSE
           }
 	};
@@ -6987,9 +6931,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ TRUE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ FALSE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ FALSE
 	  },
 	  {
@@ -7002,9 +6945,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ TRUE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ FALSE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ FALSE
 	  },
 	  {
@@ -7017,9 +6959,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ FALSE,
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ FALSE
 	  },
 	  {
@@ -7032,9 +6973,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ FALSE,
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ FALSE
 	  }
 	};
@@ -7089,20 +7029,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 6,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	2,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 4, NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	0,	NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	0,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	2,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
           {
@@ -7118,20 +7057,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 6,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	10,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	10,	FALSE,	0 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	10,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	12,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	12,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	12,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	10,	FALSE,	VARIABLE_ENTRY_SIZE / 4, NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	10,	FALSE,	0,	NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	10,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	12,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	12,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	12,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
           {
@@ -7147,20 +7085,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
           {
@@ -7176,20 +7113,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ FALSE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ FALSE
           },
           {
@@ -7205,20 +7141,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 1,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	PICO_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__DIRTY,	PICO_ENTRY_TYPE,0,FALSE,0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
           {
@@ -7234,20 +7169,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 1,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	PICO_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__DIRTY,	PICO_ENTRY_TYPE,0,FALSE,0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           }
 	};
@@ -7264,9 +7198,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
 	  },
 	  {
@@ -7279,9 +7212,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
 	  },
 	  {
@@ -7294,9 +7226,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
 	  },
 	  {
@@ -7309,9 +7240,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
 	  }
 	};
@@ -7365,20 +7295,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 6,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	2,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	VARIABLE_ENTRY_SIZE / 4, NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	0,	FALSE,	0,	NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	0,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	2,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	2,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           },
           {
@@ -7394,20 +7323,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 6,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	10,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	10,	FALSE,	0 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	10,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	12,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	12,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	12,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	10,	FALSE,	VARIABLE_ENTRY_SIZE / 4, NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	10,	FALSE,	0,	NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	10,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	12,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	12,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	12,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           },
           {
@@ -7423,20 +7351,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           },
           {
@@ -7452,20 +7379,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ TRUE
           },
           {
@@ -7481,20 +7407,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 1,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	PICO_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__DIRTY,	PICO_ENTRY_TYPE,0,FALSE,0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           },
           {
@@ -7510,20 +7435,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 1,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	PICO_ENTRY_TYPE,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__DIRTY,	PICO_ENTRY_TYPE,0,FALSE,0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           }
 	};
@@ -7540,9 +7464,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
 	  },
 	  {
@@ -7555,9 +7478,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
 	  },
 	  {
@@ -7570,9 +7492,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
 	  },
 	  {
@@ -7585,9 +7506,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
 	  }
 	};
@@ -7637,20 +7557,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
 	  {
@@ -7666,20 +7585,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {100, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 1,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	PICO_ENTRY_TYPE,	100,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__DIRTY,	PICO_ENTRY_TYPE,100,FALSE,0,  NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
 	  {
@@ -7695,20 +7613,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {100, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 1,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	PICO_ENTRY_TYPE,	100,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__DIRTY,	PICO_ENTRY_TYPE,100,FALSE,0,  NULL },
+	      { FLUSH_OP__DIRTY,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           }
 	};
@@ -7725,9 +7642,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ FALSE,
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ FALSE
 	  }
 	};
@@ -7774,20 +7690,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           },
 	  {
@@ -7803,20 +7718,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {100, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 1,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	PICO_ENTRY_TYPE,	100,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__DIRTY,	PICO_ENTRY_TYPE,100,FALSE,0,  NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           },
 	  {
@@ -7832,20 +7746,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {100, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 1,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	PICO_ENTRY_TYPE,	100,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__DIRTY,	PICO_ENTRY_TYPE,100,FALSE,0,  NULL },
+	      { FLUSH_OP__DIRTY,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           }
 	};
@@ -7862,9 +7775,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ FALSE,
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ FALSE
 	  }
 	};
@@ -7981,20 +7893,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
 	  {
@@ -8010,20 +7921,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
 	  {
@@ -8039,20 +7949,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
 	  {
@@ -8068,20 +7977,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 4,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	100,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	200,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	300,	FALSE,	0 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	300,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	100,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	200,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	300,	FALSE,	0,	NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	300,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
 	  {
@@ -8097,20 +8005,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 3,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2100,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	2200,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	2300,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2100,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	2200,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	2300,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
 	  {
@@ -8126,20 +8033,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {1000, 2000, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 3,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	1000,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2000,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	350,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	1000,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2000,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	350,	FALSE,	VARIABLE_ENTRY_SIZE / 4, NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
 	  {
@@ -8155,20 +8061,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {1000, 2000, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 3,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	1000,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2000,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	450,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	1000,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2000,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	450,	FALSE,	VARIABLE_ENTRY_SIZE / 4, NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
 	  {
@@ -8184,20 +8089,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {1000, 2000, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 3,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	1000,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2000,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	650,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	1000,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2000,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	650,	FALSE,	VARIABLE_ENTRY_SIZE / 4, NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
 	  {
@@ -8213,20 +8117,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {1000, 2000, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 3,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	1000,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2000,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	750,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	1000,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2000,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	750,	FALSE,	VARIABLE_ENTRY_SIZE / 4, NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
 	  {
@@ -8242,20 +8145,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 4,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	350,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	450,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	650,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	750,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	350,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	450,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	650,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	750,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           }
 	};
@@ -8272,9 +8174,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
 	  },
 	  {
@@ -8287,9 +8188,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
 	  },
 	  {
@@ -8302,9 +8202,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
 	  }
 
@@ -8428,20 +8327,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           },
 	  {
@@ -8457,20 +8355,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           },
 	  {
@@ -8486,20 +8383,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           },
 	  {
@@ -8515,20 +8411,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 4,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	100,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	200,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	300,	FALSE,	0 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	300,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	100,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	200,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	300,	FALSE,	0,	NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	300,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           },
 	  {
@@ -8544,20 +8439,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 3,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2100,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	2200,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	2300,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2100,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	2200,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	2300,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           },
 	  {
@@ -8573,20 +8467,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {1000, 2000, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 3,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	1000,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2000,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	350,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	1000,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2000,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	350,	FALSE,	VARIABLE_ENTRY_SIZE / 4, NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           },
 	  {
@@ -8602,20 +8495,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {1000, 2000, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 3,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	1000,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2000,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	450,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	1000,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2000,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	450,	FALSE,	VARIABLE_ENTRY_SIZE / 4, NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           },
 	  {
@@ -8631,20 +8523,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {1000, 2000, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 3,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	1000,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2000,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	650,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	1000,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2000,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	650,	FALSE,	VARIABLE_ENTRY_SIZE / 4, NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           },
 	  {
@@ -8660,20 +8551,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {1000, 2000, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 3,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	1000,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2000,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	750,	FALSE,	VARIABLE_ENTRY_SIZE / 4 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	1000,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	2000,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	750,	FALSE,	VARIABLE_ENTRY_SIZE / 4, NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           },
 	  {
@@ -8689,20 +8579,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 4,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	350,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	450,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	650,	FALSE,	0 },
-	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	750,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	350,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	450,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	650,	FALSE,	0,	NULL },
+	      { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	750,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           }
 	};
@@ -8719,9 +8608,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
 	  },
 	  {
@@ -8734,9 +8622,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
 	  },
 	  {
@@ -8749,9 +8636,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
 	  }
 
@@ -8800,20 +8686,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
 	  {
@@ -8829,20 +8714,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {100, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 3,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	100,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	200,	FALSE,	VARIABLE_ENTRY_SIZE },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	200,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	100,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	200,	FALSE,	VARIABLE_ENTRY_SIZE, NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	200,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
 	  {
@@ -8858,20 +8742,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {400, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 3,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	400,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	300,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	300,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	400,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	300,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	300,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
 	  {
@@ -8887,20 +8770,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           },
 	  {
@@ -8916,20 +8798,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {100, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 3,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	100,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	500,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	500,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	100,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	500,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	500,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ FALSE
           }
 	};
@@ -8946,9 +8827,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ FALSE,
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ FALSE
 	  }
 	};
@@ -8998,20 +8878,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           },
 	  {
@@ -9027,20 +8906,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {100, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 3,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	100,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	200,	FALSE,	VARIABLE_ENTRY_SIZE },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	200,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	100,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	200,	FALSE,	VARIABLE_ENTRY_SIZE, NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	200,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           },
 	  {
@@ -9056,20 +8934,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {400, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 3,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	400,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	300,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	300,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	400,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	300,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	300,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           },
 	  {
@@ -9085,20 +8962,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {0, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 0,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:	idx:	flag:	size: order_ptr: */
+	    { { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL },
+	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0,    NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           },
 	  {
@@ -9114,20 +8990,19 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* pin_idx            = */ {100, 0, 0, 0, 0, 0, 0, 0},
 	    /* num_flush_ops      = */ 3,
 	    /* flush_ops          = */
-	    /*	op_code:		type:	idx:	flag:	size: */
-	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	100,	FALSE,	0 },
-	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	500,	FALSE,	VARIABLE_ENTRY_SIZE / 2 },
-	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	500,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 },
-	      { FLUSH_OP__NO_OP,	0,	0,	FALSE,	0 } },
-	    /* expected_loaded    = */ TRUE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ TRUE,
+	    /*	op_code:		type:		idx:		flag:	size:	order_ptr: */
+	    { { FLUSH_OP__DIRTY,	VARIABLE_ENTRY_TYPE,	100,	FALSE,	0,	NULL },
+	      { FLUSH_OP__RESIZE,	VARIABLE_ENTRY_TYPE,	500,	FALSE,	VARIABLE_ENTRY_SIZE / 2, NULL },
+	      { FLUSH_OP__MOVE,		VARIABLE_ENTRY_TYPE,	500,	FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL },
+	      { FLUSH_OP__NO_OP,	0,		0,		FALSE,	0,	NULL } },
+	    /* expected_deserialized = */ TRUE,
+	    /* expected_serialized = */ TRUE,
 	    /* expected_destroyed = */ TRUE
           }
 	};
@@ -9144,9 +9019,8 @@ check_flush_cache__flush_ops(H5F_t * file_ptr)
 	    /* is_dirty	          = */ FALSE,
 	    /* is_protected       = */ FALSE,
 	    /* is_pinned          = */ FALSE,
-	    /* expected_loaded    = */ FALSE,
-	    /* expected_cleared   = */ FALSE,
-	    /* expected_flushed   = */ FALSE,
+	    /* expected_deserialized = */ FALSE,
+	    /* expected_serialized = */ FALSE,
 	    /* expected_destroyed = */ FALSE
 	  }
 	};
@@ -9203,11 +9077,8 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
 				 int check_size,
 				 struct fo_flush_entry_check check[])
 {
-    const char *   fcn_name = "check_flush_cache__flush_op_test";
     H5C_t *       cache_ptr = file_ptr->shared->cache;
     static char    msg[128];
-    hbool_t	   show_progress = FALSE;
-    hbool_t	   verbose = FALSE;
     herr_t	   result;
     int            i;
     int            j;
@@ -9219,12 +9090,6 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
 	      test_num);
 #endif
 
-    if ( show_progress ) {
-
-	HDfprintf(stdout, "%s:%d:%d: running sanity checks on entry(1).\n",
-	          fcn_name, test_num, (int)pass);
-    }
-
     if ( cache_ptr == NULL ) {
 
         pass = FALSE;
@@ -9252,12 +9117,6 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
         failure_mssg = msg;
     }
 
-    if ( show_progress ) {
-
-	HDfprintf(stdout, "%s:%d:%d: running sanity checks on entry(2).\n",
-	          fcn_name, test_num, (int)pass);
-    }
-
     i = 0;
     while ( ( pass ) && ( i < spec_size ) )
     {
@@ -9280,12 +9139,6 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
         i++;
     }
 
-    if ( show_progress ) {
-
-	HDfprintf(stdout, "%s:%d:%d: running sanity checks on entry(3).\n",
-	          fcn_name, test_num, (int)pass);
-    }
-
     i = 0;
     while ( ( pass ) && ( i < check_size ) )
     {
@@ -9305,12 +9158,10 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
 	       ( check[i].is_protected != FALSE ) ) ||
 	     ( ( check[i].is_pinned != TRUE ) &&
 	       ( check[i].is_pinned != FALSE ) ) ||
-	     ( ( check[i].expected_loaded != TRUE ) &&
-	       ( check[i].expected_loaded != FALSE ) ) ||
-	     ( ( check[i].expected_cleared != TRUE ) &&
-	       ( check[i].expected_cleared != FALSE ) ) ||
-	     ( ( check[i].expected_flushed != TRUE ) &&
-	       ( check[i].expected_flushed != FALSE ) ) ||
+	     ( ( check[i].expected_deserialized != TRUE ) &&
+	       ( check[i].expected_deserialized != FALSE ) ) ||
+	     ( ( check[i].expected_serialized != TRUE ) &&
+	       ( check[i].expected_serialized != FALSE ) ) ||
 	     ( ( check[i].expected_destroyed != TRUE ) &&
 	       ( check[i].expected_destroyed != FALSE ) ) ) {
 
@@ -9323,54 +9174,18 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
         i++;
     }
 
-    if ( show_progress ) {
-
-	HDfprintf(stdout, "%s:%d:%d: Setting up the test.\n",
-	          fcn_name, test_num, (int)pass);
-    }
-
     i = 0;
     while ( ( pass ) && ( i < spec_size ) )
     {
         if ( spec[i].insert_flag ) {
 
-	    if ( show_progress ) {
-
-	        HDfprintf(stdout,
-			  "%s:%d: Inserting entry(%d,%d) with flags 0x%x.\n",
-			  fcn_name, test_num,
-			  (int)(spec[i].entry_type),
-			  (int)(spec[i].entry_index),
-			  (unsigned)spec[i].flags);
-	    }
-
             insert_entry(file_ptr, spec[i].entry_type, spec[i].entry_index,
                          spec[i].flags);
 
         } else {
 
-	    if ( show_progress ) {
-
-	        HDfprintf(stdout,
-			  "%s:%d: Protecting entry(%d,%d).\n",
-			  fcn_name, test_num,
-			  (int)(spec[i].entry_type),
-			  (int)(spec[i].entry_index));
-	    }
-
             protect_entry(file_ptr, spec[i].entry_type, spec[i].entry_index);
 
-	    if ( show_progress ) {
-
-	        HDfprintf(stdout,
-		    "%s:%d: Unprotecting entry(%d,%d) with flags 0x%x ns = %d.\n",
-		    fcn_name, test_num,
-		    (int)(spec[i].entry_type),
-		    (int)(spec[i].entry_index),
-		    (unsigned)spec[i].flags,
-		    (int)(spec[i].new_size));
-	    }
-
             if(spec[i].resize_flag)
                 resize_entry(file_ptr, spec[i].entry_type, spec[i].entry_index,
 					     spec[i].new_size, TRUE);
@@ -9396,7 +9211,8 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
 			 spec[i].flush_ops[j].type,
 			 spec[i].flush_ops[j].idx,
 			 spec[i].flush_ops[j].flag,
-			 spec[i].flush_ops[j].size);
+			 spec[i].flush_ops[j].size,
+                         spec[i].flush_ops[j].order_ptr);
 	}
 
         i++;
@@ -9415,16 +9231,9 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
         }
     }
 
-    if ( show_progress ) {
-
-	HDfprintf(stdout, "%s:%d:%d: Running the test.\n",
-		  fcn_name, test_num, (int)pass);
-    }
-
     if ( pass ) {
 
-        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                flush_flags);
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, flush_flags);
 
         if ( result < 0 ) {
 
@@ -9436,11 +9245,6 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
         }
     }
 
-    if ( show_progress ) {
-
-	HDfprintf(stdout, "%s:%d:%d: Checking test results(1).\n",
-		  fcn_name, test_num, (int)pass);
-    }
 
     i = 0;
     while ( ( pass ) && ( i < spec_size ) )
@@ -9448,21 +9252,18 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
         base_addr = entries[spec[i].entry_type];
         entry_ptr = &(base_addr[spec[i].entry_index]);
 
-        if ( ( entry_ptr->loaded != spec[i].expected_loaded ) ||
-             ( entry_ptr->cleared != spec[i].expected_cleared ) ||
-             ( entry_ptr->flushed != spec[i].expected_flushed ) ||
+        if ( ( entry_ptr->deserialized != spec[i].expected_deserialized ) ||
+             ( entry_ptr->serialized != spec[i].expected_serialized ) ||
              ( entry_ptr->destroyed != spec[i].expected_destroyed ) ) {
 
 #if 0 /* This is useful debugging code.  Lets keep it around. */
 
             HDfprintf(stdout,
-              "loaded = %d(%d), clrd = %d(%d), flshd = %d(%d), dest = %d(%d)\n",
-              (int)(entry_ptr->loaded),
-              (int)(spec[i].expected_loaded),
-              (int)(entry_ptr->cleared),
-              (int)(spec[i].expected_cleared),
-              (int)(entry_ptr->flushed),
-              (int)(spec[i].expected_flushed),
+              "desrlzd = %d(%d), srlzd = %d(%d), dest = %d(%d)\n",
+              (int)(entry_ptr->deserialized),
+              (int)(spec[i].expected_deserialized),
+              (int)(entry_ptr->serialized),
+              (int)(spec[i].expected_serialized),
               (int)(entry_ptr->destroyed),
               (int)(spec[i].expected_destroyed));
 
@@ -9479,12 +9280,6 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
         i++;
     }
 
-    if ( show_progress ) {
-
-	HDfprintf(stdout, "%s:%d:%d: Checking test results(2).\n",
-		  fcn_name, test_num, (int)pass);
-    }
-
     if ( pass ) {
 
         i = 0;
@@ -9515,9 +9310,8 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
 		 ( entry_ptr->header.is_protected != check[i].is_protected ) ||
                  ( entry_ptr->is_pinned != check[i].is_pinned ) ||
                  ( entry_ptr->header.is_pinned != check[i].is_pinned ) ||
-		 ( entry_ptr->loaded != check[i].expected_loaded ) ||
-		 ( entry_ptr->cleared != check[i].expected_cleared ) ||
-		 ( entry_ptr->flushed != check[i].expected_flushed ) ||
+		 ( entry_ptr->deserialized != check[i].expected_deserialized ) ||
+		 ( entry_ptr->serialized != check[i].expected_serialized ) ||
 		 ( entry_ptr->destroyed != check[i].expected_destroyed ) ) {
 
 #if 0 /* This is useful debugging code.  Lets keep it around for a while. */
@@ -9572,20 +9366,18 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
 			      (int)(entry_ptr->header.is_pinned),
 			      (int)(check[i].is_pinned));
 		}
-		if ( entry_ptr->loaded != check[i].expected_loaded ) {
-		    HDfprintf(stdout, "entry_ptr->loaded (expected) = %d (%d).\n",
-			      (int)(entry_ptr->loaded),
-			      (int)(check[i].expected_loaded));
+		if ( entry_ptr->deserialized !=
+				check[i].expected_deserialized ) {
+		    HDfprintf(stdout,
+		 	      "entry_ptr->deserialized (expected) = %d (%d).\n",
+			      (int)(entry_ptr->deserialized),
+			      (int)(check[i].expected_deserialized));
 		}
-		if ( entry_ptr->cleared != check[i].expected_cleared ) {
-		    HDfprintf(stdout, "entry_ptr->cleared (expected) = %d (%d).\n",
-			      (int)(entry_ptr->cleared),
-			      (int)(check[i].expected_cleared));
-		}
-		if ( entry_ptr->flushed != check[i].expected_flushed ) {
-		    HDfprintf(stdout, "entry_ptr->flushed (expected) = %d (%d).\n",
-			      (int)(entry_ptr->flushed),
-			      (int)(check[i].expected_flushed));
+		if ( entry_ptr->serialized != check[i].expected_serialized ) {
+		    HDfprintf(stdout,
+			      "entry_ptr->serialized (expected) = %d (%d).\n",
+			      (int)(entry_ptr->serialized),
+			      (int)(check[i].expected_serialized));
 		}
 		if ( entry_ptr->destroyed != check[i].expected_destroyed ) {
 		    HDfprintf(stdout, "entry_ptr->destroyed (expected) = %d (%d).\n",
@@ -9603,12 +9395,6 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
         }
     }
 
-    if ( show_progress ) {
-
-	HDfprintf(stdout, "%s:%d:%d: Checking test results(3).\n",
-		  fcn_name, test_num, (int)pass);
-    }
-
     if ( pass ) {
 
         if ( ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) == 0 )
@@ -9637,17 +9423,9 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
     }
 
     /* clean up the cache to prep for the next test */
-
-    if ( show_progress ) {
-
-	HDfprintf(stdout, "%s:%d:%d: Cleaning up after test(1).\n",
-		  fcn_name, test_num, (int)pass);
-    }
-
     if ( pass ) {
 
-        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                                 H5C__FLUSH_INVALIDATE_FLAG);
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__FLUSH_INVALIDATE_FLAG);
 
         if ( result < 0 ) {
 
@@ -9663,16 +9441,6 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
 		  ( cache_ptr->dirty_index_size != 0 ) ) {
 
             pass = FALSE;
-
-	    if ( verbose ) {
-
-	        HDfprintf(stdout, "%s:%d: il/is/cis/dis = %lld/%lld/%lld/%lld.\n",
-			  fcn_name, test_num,
-			  (long long)(cache_ptr->index_len),
-			  (long long)(cache_ptr->index_size),
-			  (long long)(cache_ptr->clean_index_size),
-			  (long long)(cache_ptr->dirty_index_size));
-	    }
             HDsnprintf(msg, (size_t)128,
             "Unexpected cache len/size/cs/ds after cleanup in flush op test #%d.",
             test_num);
@@ -9681,12 +9449,6 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
         }
     }
 
-    if ( show_progress ) {
-
-	HDfprintf(stdout, "%s:%d:%d: Cleaning up after test(2).\n",
-		  fcn_name, test_num, (int)pass);
-    }
-
     i = 0;
     while ( ( pass ) && ( i < spec_size ) )
     {
@@ -9695,20 +9457,13 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
 
 	entry_ptr->size      = entry_sizes[spec[i].entry_type];
 
-        entry_ptr->loaded    = FALSE;
-        entry_ptr->cleared   = FALSE;
-        entry_ptr->flushed   = FALSE;
-        entry_ptr->destroyed = FALSE;
+        entry_ptr->deserialized = FALSE;
+        entry_ptr->serialized   = FALSE;
+        entry_ptr->destroyed    = FALSE;
 
         i++;
     }
 
-    if ( show_progress ) {
-
-	HDfprintf(stdout, "%s:%d:%d: Cleaning up after test(3).\n",
-		  fcn_name, test_num, (int)pass);
-    }
-
     i = 0;
     while ( ( pass ) && ( i < check_size ) )
     {
@@ -9717,19 +9472,13 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
 
 	entry_ptr->size      = entry_sizes[check[i].entry_type];
 
-        entry_ptr->loaded    = FALSE;
-        entry_ptr->cleared   = FALSE;
-        entry_ptr->flushed   = FALSE;
-        entry_ptr->destroyed = FALSE;
+        entry_ptr->deserialized = FALSE;
+        entry_ptr->serialized   = FALSE;
+        entry_ptr->destroyed    = FALSE;
 
         i++;
     }
 
-    if ( show_progress ) {
-
-	HDfprintf(stdout, "%s:%d:%d: Done.\n", fcn_name, test_num, (int)pass);
-    }
-
     return;
 
 } /* check_flush_cache__flush_op_test() */
@@ -9750,83 +9499,89 @@ check_flush_cache__flush_op_test(H5F_t * file_ptr,
  *
  * Modifications:
  *
+ *		Updated test for minor changes in the behaviour
+ *		of H5C__flush_single_entry().
+ *
+ *					JRM -- 2/16/15
+ *
  *-------------------------------------------------------------------------
  */
 
 static void
 check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 {
-    /* const char *   fcn_name = "check_flush_cache__flush_op_eviction_test"; */
     H5C_t *        cache_ptr = file_ptr->shared->cache;
     int		   i;
-    int		   num_variable_entries = 8;
+    int		   num_variable_entries = 10;
     int		   num_monster_entries = 31;
     int		   num_large_entries = 0;
     herr_t	   result;
     test_entry_t * entry_ptr;
     test_entry_t * base_addr;
-    struct expected_entry_status expected[8 + 31 + 14] =
+    struct expected_entry_status expected[10 + 31 + 14] =
     {
       /* the expected array is used to maintain a table of the expected status of every
        * entry used in this test.  Note that since the function that processes this
        * array only processes as much of it as it is told to, we don't have to
        * worry about maintaining the status of entries that we haven't used yet.
        */
-      /* entry			entry				in	at main                                                       */
-      /* type:			index:	size:			cache:	addr:	dirty:	prot:	pinned:	loaded:	clrd:	flshd:	dest: */
-      { VARIABLE_ENTRY_TYPE,	0,	VARIABLE_ENTRY_SIZE/2,	TRUE,	TRUE,	TRUE,	FALSE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { VARIABLE_ENTRY_TYPE,	1,	VARIABLE_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { VARIABLE_ENTRY_TYPE,	2,	VARIABLE_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { VARIABLE_ENTRY_TYPE,	3,	VARIABLE_ENTRY_SIZE/2,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { VARIABLE_ENTRY_TYPE,	4,	VARIABLE_ENTRY_SIZE/2,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { VARIABLE_ENTRY_TYPE,	5,	VARIABLE_ENTRY_SIZE/2,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { VARIABLE_ENTRY_TYPE,	6,	VARIABLE_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { VARIABLE_ENTRY_TYPE,	7,	VARIABLE_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	0,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	1,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	2,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	3,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	4,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	5,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	6,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	7,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	8,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	9,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	10,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	11,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	12,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	13,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	14,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	15,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	16,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	17,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	18,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	19,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	20,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	21,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	22,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	23,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	24,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	25,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	26,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	27,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	28,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	29,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { MONSTER_ENTRY_TYPE,	30,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { LARGE_ENTRY_TYPE,	0,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { LARGE_ENTRY_TYPE,	1,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { LARGE_ENTRY_TYPE,	2,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { LARGE_ENTRY_TYPE,	3,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { LARGE_ENTRY_TYPE,	4,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { LARGE_ENTRY_TYPE,	5,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { LARGE_ENTRY_TYPE,	6,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { LARGE_ENTRY_TYPE,	7,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { LARGE_ENTRY_TYPE,	8,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { LARGE_ENTRY_TYPE,	9,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { LARGE_ENTRY_TYPE,	10,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { LARGE_ENTRY_TYPE,	11,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { LARGE_ENTRY_TYPE,	12,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE },
-      { LARGE_ENTRY_TYPE,	13,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	FALSE }
+      /* entry			entry				in	at main                                                flush dep flush dep child flush   flush       flush */
+      /* type:			index:	size:			cache:	addr:	dirty:	prot:	pinned:	dsrlzd:	srlzd:	dest:  par type[]: par idx[]: dep npart: dep nchd: dep ndirty chd: order: corked */
+      { VARIABLE_ENTRY_TYPE,	0,	VARIABLE_ENTRY_SIZE/4,	TRUE,	TRUE,	TRUE,	FALSE,	TRUE,	TRUE,	FALSE,	FALSE,  {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { VARIABLE_ENTRY_TYPE,	1,	VARIABLE_ENTRY_SIZE/4,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { VARIABLE_ENTRY_TYPE,	2,	VARIABLE_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { VARIABLE_ENTRY_TYPE,	3,	VARIABLE_ENTRY_SIZE/4,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { VARIABLE_ENTRY_TYPE,	4,	VARIABLE_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { VARIABLE_ENTRY_TYPE,	5,	VARIABLE_ENTRY_SIZE/4,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { VARIABLE_ENTRY_TYPE,	6,	VARIABLE_ENTRY_SIZE/2,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { VARIABLE_ENTRY_TYPE,	7,	VARIABLE_ENTRY_SIZE/2,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { VARIABLE_ENTRY_TYPE,	8,	VARIABLE_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,  {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { VARIABLE_ENTRY_TYPE,	9,	VARIABLE_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	TRUE,	FALSE,	FALSE,  {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	0,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,  {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	1,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	2,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	3,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	4,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	5,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	6,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	7,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	8,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	9,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	10,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	11,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	12,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	13,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	14,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	15,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	16,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	17,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	18,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	19,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	20,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	21,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	22,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	23,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	24,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	25,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	26,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	27,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	28,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	29,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	30,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { LARGE_ENTRY_TYPE,	0,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { LARGE_ENTRY_TYPE,	1,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { LARGE_ENTRY_TYPE,	2,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { LARGE_ENTRY_TYPE,	3,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { LARGE_ENTRY_TYPE,	4,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { LARGE_ENTRY_TYPE,	5,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { LARGE_ENTRY_TYPE,	6,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { LARGE_ENTRY_TYPE,	7,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { LARGE_ENTRY_TYPE,	8,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { LARGE_ENTRY_TYPE,	9,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { LARGE_ENTRY_TYPE,	10,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { LARGE_ENTRY_TYPE,	11,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { LARGE_ENTRY_TYPE,	12,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { LARGE_ENTRY_TYPE,	13,	LARGE_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,	{0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE}
     };
 
     if ( pass ) {
@@ -9883,38 +9638,49 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 
 	protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 0);
 	resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 0,
-                (VARIABLE_ENTRY_SIZE / 2), TRUE);
+                (VARIABLE_ENTRY_SIZE / 4), TRUE);
 	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 0, H5C__DIRTIED_FLAG);
 
 	protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 1);
-	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 1, H5C__NO_FLAGS_SET);
+	resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 1,
+                (VARIABLE_ENTRY_SIZE / 4), TRUE);
+	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 1, H5C__DIRTIED_FLAG);
 
 	protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 2);
 	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 2, H5C__NO_FLAGS_SET);
 
 	protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 3);
 	resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 3,
-                (VARIABLE_ENTRY_SIZE / 2), TRUE);
+                (VARIABLE_ENTRY_SIZE / 4), TRUE);
 	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 3, H5C__DIRTIED_FLAG);
 
 	protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 4);
-	resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 4,
-                (VARIABLE_ENTRY_SIZE / 2), TRUE);
-	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 4, H5C__DIRTIED_FLAG);
+	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 4, H5C__NO_FLAGS_SET);
 
 	protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 5);
 	resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 5,
-                (VARIABLE_ENTRY_SIZE / 2), TRUE);
+                (VARIABLE_ENTRY_SIZE / 4), TRUE);
 	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 5, H5C__DIRTIED_FLAG);
 
 	protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 6);
-	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 6, H5C__NO_FLAGS_SET);
+	resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 6,
+                (VARIABLE_ENTRY_SIZE / 2), TRUE);
+	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 6, H5C__DIRTIED_FLAG);
 
 	protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 7);
-	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 7, H5C__NO_FLAGS_SET);
+	resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 7,
+                (VARIABLE_ENTRY_SIZE / 2), TRUE);
+	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 7, H5C__DIRTIED_FLAG);
 
-	if ( ( cache_ptr->index_len != 8 ) ||
-             ( cache_ptr->index_size != (4 * (VARIABLE_ENTRY_SIZE / 2)) +
+	protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 8);
+	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 8, H5C__NO_FLAGS_SET);
+
+	protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 9);
+	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 9, H5C__NO_FLAGS_SET);
+
+	if ( ( cache_ptr->index_len != 10 ) ||
+             ( cache_ptr->index_size != (4 * (VARIABLE_ENTRY_SIZE / 4)) +
+	                                (2 * (VARIABLE_ENTRY_SIZE / 2)) +
 	                                (4 * VARIABLE_ENTRY_SIZE) ) ) {
 
             pass = FALSE;
@@ -9926,54 +9692,59 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 
 	/* Now set up the pinning relationships:
 	 *
-	 * Briefly, (VET, 0) is pinned by (VET, 1), (VET, 2), and (VET, 3)
-	 *          (VET, 7) is pinned by (VET, 3), and (VET, 5)
+	 * Briefly, (VET, 0) is pinned by (VET, 1), (VET, 3), and (VET, 5)
+	 *          (VET, 9) is pinned by (VET, 5), and (VET, 7)
 	 */
 	create_pinned_entry_dependency(file_ptr, VARIABLE_ENTRY_TYPE, 1,
 			               VARIABLE_ENTRY_TYPE, 0);
-	create_pinned_entry_dependency(file_ptr, VARIABLE_ENTRY_TYPE, 2,
-			               VARIABLE_ENTRY_TYPE, 0);
 	create_pinned_entry_dependency(file_ptr, VARIABLE_ENTRY_TYPE, 3,
 			               VARIABLE_ENTRY_TYPE, 0);
-	create_pinned_entry_dependency(file_ptr, VARIABLE_ENTRY_TYPE, 3,
-			               VARIABLE_ENTRY_TYPE, 7);
 	create_pinned_entry_dependency(file_ptr, VARIABLE_ENTRY_TYPE, 5,
-			               VARIABLE_ENTRY_TYPE, 7);
+			               VARIABLE_ENTRY_TYPE, 0);
+	create_pinned_entry_dependency(file_ptr, VARIABLE_ENTRY_TYPE, 5,
+			               VARIABLE_ENTRY_TYPE, 9);
+	create_pinned_entry_dependency(file_ptr, VARIABLE_ENTRY_TYPE, 7,
+			               VARIABLE_ENTRY_TYPE, 9);
 
 	/* Next, set up the flush operations:
 	 *
 	 * Briefly, (VET, 1) dirties (VET, 0)
 	 *                   resizes (VET, 0) to 3/4 VARIABLE_ENTRY_SIZE
 	 *
-	 *          (VET, 2) dirties (VET, 0)
+	 *          (VET, 3) dirties (VET, 0)
 	 *                   resizes (VET, 0) to VARIABLE_ENTRY_SIZE
 	 *                   moves (VET, 0) to its alternate address
 	 *
-	 *          (VET, 3) dirties (VET, 0)
-	 *                   resizes itself to VARIABLE_ENTRY_SIZE
+	 *          (VET, 5) dirties (VET, 0)
+	 *                   resizes itself to VARIABLE_ENTRY_SIZE / 2
+         *
+         *          (VET, 7) dirties (VET, 9)
 	 *
-	 *          (VET, 7) dirties (VET, 6)
+	 *          (VET, 9) dirties (VET, 8)
 	 */
         add_flush_op(VARIABLE_ENTRY_TYPE, 1, FLUSH_OP__DIRTY,
-                     VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0);
+                     VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0, NULL);
         add_flush_op(VARIABLE_ENTRY_TYPE, 1, FLUSH_OP__RESIZE,
                      VARIABLE_ENTRY_TYPE, 0, TRUE,
-		     3 * VARIABLE_ENTRY_SIZE / 4);
-
-        add_flush_op(VARIABLE_ENTRY_TYPE, 2, FLUSH_OP__DIRTY,
-                     VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0);
-        add_flush_op(VARIABLE_ENTRY_TYPE, 2, FLUSH_OP__RESIZE,
-                     VARIABLE_ENTRY_TYPE, 0, TRUE, VARIABLE_ENTRY_SIZE);
-        add_flush_op(VARIABLE_ENTRY_TYPE, 2, FLUSH_OP__MOVE,
-                     VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0);
+		     3 * VARIABLE_ENTRY_SIZE / 4, NULL);
 
         add_flush_op(VARIABLE_ENTRY_TYPE, 3, FLUSH_OP__DIRTY,
-                     VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0);
+                     VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0, NULL);
         add_flush_op(VARIABLE_ENTRY_TYPE, 3, FLUSH_OP__RESIZE,
-                     VARIABLE_ENTRY_TYPE, 3, TRUE, VARIABLE_ENTRY_SIZE);
+                     VARIABLE_ENTRY_TYPE, 0, TRUE, VARIABLE_ENTRY_SIZE, NULL);
+        add_flush_op(VARIABLE_ENTRY_TYPE, 3, FLUSH_OP__MOVE,
+                     VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0, NULL);
+
+        add_flush_op(VARIABLE_ENTRY_TYPE, 5, FLUSH_OP__DIRTY,
+                     VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0, NULL);
+        add_flush_op(VARIABLE_ENTRY_TYPE, 5, FLUSH_OP__RESIZE,
+                     VARIABLE_ENTRY_TYPE, 5, TRUE, VARIABLE_ENTRY_SIZE / 2, NULL);
 
         add_flush_op(VARIABLE_ENTRY_TYPE, 7, FLUSH_OP__DIRTY,
-                     VARIABLE_ENTRY_TYPE, 6, FALSE, (size_t)0);
+                     VARIABLE_ENTRY_TYPE, 9, FALSE, (size_t)0, NULL);
+
+        add_flush_op(VARIABLE_ENTRY_TYPE, 9, FLUSH_OP__DIRTY,
+                     VARIABLE_ENTRY_TYPE, 8, FALSE, (size_t)0, NULL);
     }
 
     if ( pass ) {
@@ -9984,25 +9755,31 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	 * 		in
 	 * entry:	cache?	size:	dirty?	pinned?	pins:	flush operations:
 	 *
-	 * (VET, 0) 	Y	 5 KB	Y	Y	-	-
+	 * (VET, 0) 	Y	2.5 KB	Y	Y	-	-
 	 *
-	 * (VET, 1)	Y	10 KB	N	N	0	dirty (VET, 0),
+	 * (VET, 1)	Y	2.5 KB	Y	N	0	dirty (VET, 0),
 	 * 							resize (VET, 0) to 7.5 KB
 	 *
-	 * (VET, 2)	Y	10 KB	N	N	0	dirty (VET, 0)
+	 * (VET, 2) 	Y	10 KB	N	N	-	-
+	 *
+	 *
+	 * (VET, 3)	Y	2.5 KB	N	N	0	dirty (VET, 0)
 	 * 							resize (VET, 0) to 10 KB
 	 * 							move (VET, 0) to its alternate address
 	 *
-	 * (VET, 3)	Y	 5 KB	Y	N	0, 7	dirty (VET, 0)
-	 * 							resize (VET, 3) to 10 KB
+	 * (VET, 4) 	Y	10 KB	N	N	-	-
+	 *
+	 *
+	 * (VET, 5)	Y	2.5 KB	Y	N	0, 9	dirty (VET, 0)
+	 * 							resize (VET, 5) to 5 KB
 	 *
-	 * (VET, 4)	Y	 5 KB	Y	N	-	-
+	 * (VET, 6)	Y	 5 KB	Y	N	-	-
 	 *
-	 * (VET, 5)	Y	 5 KB	Y	N	7	-
+	 * (VET, 7)	Y	 5 KB	Y	N	9	dirty (VET, 9)
 	 *
-	 * (VET, 6)	Y	10 KB	N	N	-	-
+	 * (VET, 8)	Y	10 KB	N	N	-	-
 	 *
-	 * (VET, 7)	Y	10 KB	N	Y	-	dirty (VET, 6)
+	 * (VET, 9)	Y	10 KB	N	N	-	dirty (VET, 8)
 	 *
 	 * Recall that in this test bed, flush operations are excuted the
 	 * first time the associated entry is flushed, and are then
@@ -10023,9 +9800,10 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	}
 
 	/* The cache should now be exactly full */
-	if ( ( cache_ptr->index_len != 40 ) ||
+	if ( ( cache_ptr->index_len != 42 ) ||
              ( cache_ptr->index_size != 2 * 1024 * 1024 ) ||
-	     ( cache_ptr->index_size != ((4 * VARIABLE_ENTRY_SIZE / 2) +
+	     ( cache_ptr->index_size != ((4 * VARIABLE_ENTRY_SIZE / 4) +
+					 (2 * VARIABLE_ENTRY_SIZE / 2) +
 	                                 (4 * VARIABLE_ENTRY_SIZE) +
 	                                 (31 * MONSTER_ENTRY_SIZE) +
 					 (1 * LARGE_ENTRY_SIZE)) ) ) {
@@ -10048,7 +9826,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
     if ( pass ) {
 
 	/* Now load a large entry.  This should result in the eviction
-	 * of (VET,1), and the increase in the size of (VET, 0) from .5
+	 * of (VET,2), and the increase in the size of (VET, 0) from .25
 	 * VARIABLE_ENTRY_SIZE to .75 VARIABLE_ENTRY_SIZE.
 	 *
 	 * The following table illustrates the intended state of affairs
@@ -10059,44 +9837,50 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	 *
 	 * (VET, 0) 	Y	7.5 KB	Y	Y	-	-
 	 *
-	 * (VET, 1)	N	10 KB	N	N	-	-
+	 * (VET, 1)	Y	2.5 KB	N	N	-	-
 	 *
-	 * (VET, 2)	Y	10 KB	N	N	0	dirty (VET, 0)
+	 * (VET, 2)	N	10 KB	N	N	-	-
+	 *
+	 * (VET, 3)	Y	2.5 KB	Y	N	0	dirty (VET, 0)
 	 * 							resize (VET, 0) to 10 KB
 	 * 							move (VET, 0) to its alternate address
 	 *
-	 * (VET, 3)	Y	 5 KB	Y	N	0, 7	dirty (VET, 0)
-	 * 							resize (VET, 3) to 10 KB
+	 * (VET, 4)	Y	10 KB	N	N	-	-
 	 *
-	 * (VET, 4)	Y	 5 KB	Y	N	-	-
+	 * (VET, 5)	Y	2.5 KB	Y	N	0, 9	dirty (VET, 0)
+	 * 							resize (VET, 5) to 5 KB
 	 *
-	 * (VET, 5)	Y	 5 KB	Y	N	7	-
+	 * (VET, 6)	Y	 5 KB	Y	N	-	-
 	 *
-	 * (VET, 6)	Y	10 KB	N	N	-	-
+	 * (VET, 7)	Y	 5 KB	Y	N	9	dirty (VET, 9)
 	 *
-	 * (VET, 7)	Y	10 KB	Y	Y	-	dirty (VET, 6)
+	 * (VET, 8)	Y	10 KB	N	N	-	-
+	 *
+	 * (VET, 9)	Y	10 KB	N	Y	-	dirty (VET, 8)
 	 *
 	 * Start by updating the expected table for the expected changes in entry status:
 	 */
-	expected[0].size      = 3 * VARIABLE_ENTRY_SIZE / 4;
-	expected[1].in_cache  = FALSE;
-	expected[1].flushed   = TRUE;
-	expected[1].destroyed = TRUE;
+	expected[0].size       = 3 * VARIABLE_ENTRY_SIZE / 4;
+	expected[1].is_dirty   = FALSE;
+	expected[1].serialized = TRUE;
+	expected[2].in_cache   = FALSE;
+	expected[2].destroyed  = TRUE;
 
         num_large_entries = 2;
 
 	protect_entry(file_ptr, LARGE_ENTRY_TYPE, 1);
 	unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 1, H5C__DIRTIED_FLAG);
 
-	if ( ( cache_ptr->index_len != 40 ) ||
+	if ( ( cache_ptr->index_len != 42 ) ||
              ( cache_ptr->index_size != (2 * 1024 * 1024) -
 	                                (VARIABLE_ENTRY_SIZE) +
-	                                (VARIABLE_ENTRY_SIZE / 4) +
+	                                (VARIABLE_ENTRY_SIZE / 2) +
 	                                (LARGE_ENTRY_SIZE) ) ||
-	     ( cache_ptr->index_size != ((1 * 3 * VARIABLE_ENTRY_SIZE / 4 ) +
-					 (3 * VARIABLE_ENTRY_SIZE / 2 ) +
-					 (3 * VARIABLE_ENTRY_SIZE) +
-					 (31 * MONSTER_ENTRY_SIZE) +
+	     ( cache_ptr->index_size != ((1 * (3 * VARIABLE_ENTRY_SIZE / 4)) +
+					 (3 * VARIABLE_ENTRY_SIZE / 4) +
+					 (2 * VARIABLE_ENTRY_SIZE / 2) +
+	                                 (3 * VARIABLE_ENTRY_SIZE) +
+	                                 (31 * MONSTER_ENTRY_SIZE) +
 					 (2 * LARGE_ENTRY_SIZE)) ) ) {
             pass = FALSE;
 	    failure_mssg = "unexpected size/len in flush op eviction test 3.";
@@ -10112,8 +9896,8 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
     if ( pass ) {
 
 	/* Now load another large entry.  This should result in the eviction
-	 * of (VET, 2), the increase in the size of (VET, 0) from .75
-	 * VARIABLE_ENTRY_SIZE to 1.0 VARIABLE_ENTRY_SIZE, and the moving
+	 * of (VET, 4), the increase in the size of (VET, 0) from .75
+	 * VARIABLE_ENTRY_SIZE to 1.0 VARIABLE_ENTRY_SIZE, and the renaming
 	 * of (VET, 0) to its alternate address.
 	 *
 	 * The following table shows the expected states of the variable
@@ -10124,40 +9908,46 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	 *
 	 * (VET, 0) 	Y	10 KB	Y	Y	-	-
 	 *
-	 * (VET, 1)	N	10 KB	N	N	-	-
+	 * (VET, 1)	Y	2.5 KB	N	N	-	-
 	 *
 	 * (VET, 2)	N	10 KB	N	N	-	-
 	 *
-	 * (VET, 3)	Y	 5 KB	Y	N	0, 7	dirty (VET, 0)
-	 * 							resize (VET, 3) to 10 KB
+	 * (VET, 3)	Y	2.5 KB	N	N	-	-
+	 *
+	 * (VET, 4)	N	10 KB	N	N	-	-
+	 *
+	 * (VET, 5)	Y	2.5 KB	Y	N	0, 9	dirty (VET, 0)
+	 * 							resize (VET, 5) to 5 KB
 	 *
-	 * (VET, 4)	Y	 5 KB	Y	N	-	-
+	 * (VET, 6)	Y	 5 KB	Y	N	-	-
 	 *
-	 * (VET, 5)	Y	 5 KB	Y	N	7	-
+	 * (VET, 7)	Y	 5 KB	Y	N	9	dirty (VET, 9)
 	 *
-	 * (VET, 6)	Y	10 KB	N	N	-	-
+	 * (VET, 8)	Y	10 KB	N	N	-	-
 	 *
-	 * (VET, 7)	Y	10 KB	Y	Y	-	dirty (VET, 6)
+	 * (VET, 9)	Y	10 KB	N	Y	-	dirty (VET, 8)
 	 *
 	 * Start by updating the expected table for the expected changes in entry status:
 	 */
 	expected[0].size         = VARIABLE_ENTRY_SIZE;
 	expected[0].at_main_addr = FALSE;
-	expected[2].in_cache     = FALSE;
-	expected[2].flushed      = TRUE;
-	expected[2].destroyed    = TRUE;
+	expected[3].is_dirty     = FALSE;
+	expected[3].serialized   = TRUE;
+	expected[4].in_cache     = FALSE;
+	expected[4].destroyed    = TRUE;
 
         num_large_entries = 3;
 
 	protect_entry(file_ptr, LARGE_ENTRY_TYPE, 2);
 	unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 2, H5C__DIRTIED_FLAG);
 
-	if ( ( cache_ptr->index_len != 40 ) ||
+	if ( ( cache_ptr->index_len != 42 ) ||
              ( cache_ptr->index_size != (2 * 1024 * 1024) -
 	                                (2 * VARIABLE_ENTRY_SIZE) +
-	                                (VARIABLE_ENTRY_SIZE / 2) +
+	                                (3 * VARIABLE_ENTRY_SIZE / 4) +
 	                                (2 * LARGE_ENTRY_SIZE) ) ||
-	     ( cache_ptr->index_size != ((3 * VARIABLE_ENTRY_SIZE / 2) +
+	     ( cache_ptr->index_size != ((3 * VARIABLE_ENTRY_SIZE / 4) +
+					 (2 * VARIABLE_ENTRY_SIZE / 2) +
 				         (3 * VARIABLE_ENTRY_SIZE) +
 				         (31 * MONSTER_ENTRY_SIZE) +
 				         (3 * LARGE_ENTRY_SIZE)) ) ) {
@@ -10175,13 +9965,14 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 
     if ( pass ) {
 
-	/* load two more large entries.  This should result in (VET, 3) being
-	 * flushed, and increasing its size from 1/2 VARIABLE_ENTRY_SIZE to
+	/* load two more large entries.  This should result in (VET, 5) being
+	 * flushed, and increasing its size from 1/4 VARIABLE_ENTRY_SIZE to
 	 * VARIABLE_ENTRY_SIZE.
 	 *
 	 * As a result of this size increase, the cache will have to look
-	 * for another entry to evict.  After flushing (VET, 4) and (VET, 5),
-	 * it should evict (VET, 6), yielding the needed memory.
+	 * for another entry to evict.  After flushing (VET, 6) and (VET, 7),
+	 * it should evict (VET, 8), yielding the needed memory and dirtying
+         * (VET, 9).
 	 *
 	 * The following table shows the expected states of the variable
 	 * size entries after the test.
@@ -10191,33 +9982,37 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	 *
 	 * (VET, 0) 	Y	10 KB	Y	Y	-	-
 	 *
-	 * (VET, 1)	N	10 KB	N	N	-	-
+	 * (VET, 1)	Y	2.5 KB	N	N	-	-
 	 *
 	 * (VET, 2)	N	10 KB	N	N	-	-
 	 *
-	 * (VET, 3)	Y	10 KB	N	N	0, 7	-
+	 * (VET, 3)	Y	2.5 KB	N	N	-	-
+	 *
+	 * (VET, 4)	N	10 KB	N	N	-	-
 	 *
-	 * (VET, 4)	Y	 5 KB	N	N	-	-
+	 * (VET, 5)	Y	 5 KB	N	N	0, 9	-
 	 *
-	 * (VET, 5)	Y	 5 KB	N	N	7	-
+	 * (VET, 6)	Y	 5 KB	N	N	-	-
 	 *
-	 * (VET, 6)	N	10 KB	N	N	-	-
+	 * (VET, 7)	Y	 5 KB	N	N	9	-
 	 *
-	 * (VET, 7)	Y	10 KB	Y	Y	-	dirty (VET, 6)
+	 * (VET, 8)	N	10 KB	N	N	-	-
+	 *
+	 * (VET, 9)	Y	10 KB	N	Y	-	dirty (VET, 8)
 	 *
 	 * Start by updating the expected table for the expected changes in entry status:
 	 */
 
-	expected[3].size         = VARIABLE_ENTRY_SIZE;
-	expected[3].is_dirty	 = FALSE;
-	expected[3].flushed      = TRUE;
-	expected[4].is_dirty	 = FALSE;
-	expected[4].flushed	 = TRUE;
+	expected[5].size         = VARIABLE_ENTRY_SIZE / 2;
 	expected[5].is_dirty	 = FALSE;
-	expected[5].flushed	 = TRUE;
-	expected[6].in_cache	 = FALSE;
-        expected[6].flushed	 = TRUE;
-        expected[6].destroyed	 = TRUE;
+	expected[5].serialized   = TRUE;
+	expected[6].is_dirty	 = FALSE;
+	expected[6].serialized	 = TRUE;
+	expected[7].is_dirty	 = FALSE;
+	expected[7].serialized	 = TRUE;
+	expected[8].in_cache	 = FALSE;
+        expected[8].destroyed	 = TRUE;
+        expected[9].is_dirty	 = TRUE;
 
         num_large_entries = 5;
 
@@ -10228,13 +10023,15 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 4, H5C__DIRTIED_FLAG);
 
         /* verify cache size */
-	if ( ( cache_ptr->index_len != 41 ) ||
+	if ( ( cache_ptr->index_len != 43 ) ||
              ( cache_ptr->index_size != (2 * 1024 * 1024) -
 	                                (3 * VARIABLE_ENTRY_SIZE) +
-					(1 * VARIABLE_ENTRY_SIZE ) + /* size increases of (VET, 0) & (VET, 3) */
+	                                (1 * VARIABLE_ENTRY_SIZE / 4) +
+	                                (3 * VARIABLE_ENTRY_SIZE / 4) +
 	                                (4 * LARGE_ENTRY_SIZE) ) ||
-	     ( cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE / 2) +
-				         (3 * VARIABLE_ENTRY_SIZE) +
+	     ( cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE / 4) +
+					 (3 * VARIABLE_ENTRY_SIZE / 2) +
+				         (2 * VARIABLE_ENTRY_SIZE) +
 				         (31 * MONSTER_ENTRY_SIZE) +
 				         (5 * LARGE_ENTRY_SIZE)) ) ) {
 
@@ -10255,7 +10052,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	 * cache to bring all the VARIABLE_ENTRY_TYPE entries to the
 	 * end of the LRU list.
 	 *
-	 * Note that we don't have to worry about (VET, 0) and (VET, 7)
+	 * Note that we don't have to worry about (VET, 0) and (VET, 9)
 	 * as they are pinned and thus not in the LRU list to begin with.
 	 */
 	for ( i = 0; i < 31; i++ )
@@ -10271,10 +10068,17 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	}
 
         /* verify cache size */
-	if ( ( cache_ptr->index_len != 41 ) ||
+	if ( ( cache_ptr->index_len != 43 ) ||
              ( cache_ptr->index_size != (2 * 1024 * 1024) -
-	                                (2 * VARIABLE_ENTRY_SIZE) +
-	                                (4 * LARGE_ENTRY_SIZE) ) ) {
+	                                (3 * VARIABLE_ENTRY_SIZE) +
+	                                (1 * VARIABLE_ENTRY_SIZE / 4) +
+	                                (3 * VARIABLE_ENTRY_SIZE / 4) +
+	                                (4 * LARGE_ENTRY_SIZE) ) ||
+	     ( cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE / 4) +
+					 (3 * VARIABLE_ENTRY_SIZE / 2) +
+				         (2 * VARIABLE_ENTRY_SIZE) +
+				         (31 * MONSTER_ENTRY_SIZE) +
+				         (5 * LARGE_ENTRY_SIZE)) ) ) {
 
             pass = FALSE;
 	    failure_mssg = "unexpected size/len in flush op eviction test 6.";
@@ -10290,7 +10094,8 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
     if ( pass ) {
 
 	/* Now load three more large entries.  This should result
-	 * in the eviction of (VET, 3), and the unpinning of (VET, 0)
+	 * in the evictions of (VET, 1), (VET, 3), and (VET, 5), and the
+         * unpinning of (VET, 0)
 	 *
 	 * The following table shows the expected states of the variable
 	 * size entries after the test.
@@ -10300,26 +10105,34 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	 *
 	 * (VET, 0) 	Y	10 KB	Y	N	-	-
 	 *
-	 * (VET, 1)	N	10 KB	N	N	-	-
+	 * (VET, 1)	N	2.5 KB	N	N	-	-
 	 *
 	 * (VET, 2)	N	10 KB	N	N	-	-
 	 *
-	 * (VET, 3)	N	10 KB	N	N	-	-
+	 * (VET, 3)	N	2.5 KB	N	N	-	-
 	 *
-	 * (VET, 4)	Y	 5 KB	N	N	-	-
+	 * (VET, 4)	N	10 KB	N	N	-	-
 	 *
-	 * (VET, 5)	Y	 5 KB	N	N	7	-
+	 * (VET, 5)	N	 5 KB	N	N	-	-
+	 *
+	 * (VET, 6)	Y	 5 KB	N	N	-	-
 	 *
-	 * (VET, 6)	N	10 KB	N	N	-	-
+	 * (VET, 7)	Y	 5 KB	N	N	9	-
 	 *
-	 * (VET, 7)	Y	10 KB	Y	Y	-	dirty (VET, 6)
+	 * (VET, 8)	N	10 KB	N	N	-	-
+	 *
+	 * (VET, 9)	Y	10 KB	N	Y	-	dirty (VET, 8)
 	 *
 	 * Start by updating the expected table for the expected changes in entry status:
 	 */
 
 	expected[0].is_pinned    = FALSE;
+	expected[1].in_cache     = FALSE;
+	expected[1].destroyed    = TRUE;
 	expected[3].in_cache     = FALSE;
 	expected[3].destroyed    = TRUE;
+	expected[5].in_cache     = FALSE;
+	expected[5].destroyed    = TRUE;
 
         num_large_entries = 8;
 
@@ -10332,7 +10145,9 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
         /* verify cache size */
 	if ( ( cache_ptr->index_len != 43 ) ||
              ( cache_ptr->index_size != (2 * 1024 * 1024) -
-	                                (3 * VARIABLE_ENTRY_SIZE) +
+	                                (4 * VARIABLE_ENTRY_SIZE) +
+	                                (1 * VARIABLE_ENTRY_SIZE / 4) +
+	                                (3 * VARIABLE_ENTRY_SIZE / 4) +
 	                                (7 * LARGE_ENTRY_SIZE) ) ||
 	     ( cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE / 2) +
 					 (2 * VARIABLE_ENTRY_SIZE) +
@@ -10352,7 +10167,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 
     if ( pass ) {
 
-	/* load another large entry.  (VET, 4) should be evicted.
+	/* load another large entry.  (VET, 6) should be evicted.
 	 *
 	 * The following table shows the expected states of the variable
 	 * size entries after the test.
@@ -10362,25 +10177,29 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	 *
 	 * (VET, 0) 	Y	10 KB	Y	N	-	-
 	 *
-	 * (VET, 1)	N	10 KB	N	N	-	-
+	 * (VET, 1)	N	2.5 KB	N	N	-	-
 	 *
 	 * (VET, 2)	N	10 KB	N	N	-	-
 	 *
-	 * (VET, 3)	N	10 KB	N	N	-	-
+	 * (VET, 3)	N	2.5 KB	N	N	-	-
+	 *
+	 * (VET, 4)	N	10 KB	N	N	-	-
 	 *
-	 * (VET, 4)	N	 5 KB	N	N	-	-
+	 * (VET, 5)	N	 5 KB	N	N	-	-
+	 *
+	 * (VET, 6)	N	 5 KB	N	N	-	-
 	 *
-	 * (VET, 5)	Y	 5 KB	N	N	7	-
+	 * (VET, 7)	Y	 5 KB	N	N	9	-
 	 *
-	 * (VET, 6)	N	10 KB	N	N	-	-
+	 * (VET, 8)	N	10 KB	N	N	-	-
 	 *
-	 * (VET, 7)	Y	10 KB	Y	Y	-	dirty (VET, 6)
+	 * (VET, 9)	Y	10 KB	N	Y	-	dirty (VET, 8)
 	 *
 	 * Start by updating the expected table for the expected changes in entry status:
 	 */
 
-	expected[4].in_cache     = FALSE;
-	expected[4].destroyed    = TRUE;
+	expected[6].in_cache     = FALSE;
+	expected[6].destroyed    = TRUE;
 
         num_large_entries = 9;
 
@@ -10416,7 +10235,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 
 	/* Load another large entry.
 	 *
-	 * (VET, 5) should be evicted, and (VET, 7) should be unpinned.
+	 * (VET, 7) should be evicted, and (VET, 9) should be unpinned.
 	 *
 	 * The following table shows the expected states of the variable
 	 * size entries after the test.
@@ -10426,26 +10245,30 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	 *
 	 * (VET, 0) 	Y	10 KB	Y	N	-	-
 	 *
-	 * (VET, 1)	N	10 KB	N	N	-	-
+	 * (VET, 1)	N	2.5 KB	N	N	-	-
 	 *
 	 * (VET, 2)	N	10 KB	N	N	-	-
 	 *
-	 * (VET, 3)	N	10 KB	N	N	-	-
+	 * (VET, 3)	N	2.5 KB	N	N	-	-
 	 *
-	 * (VET, 4)	N	 5 KB	N	N	-	-
+	 * (VET, 4)	N	10 KB	N	N	-	-
 	 *
 	 * (VET, 5)	N	 5 KB	N	N	-	-
 	 *
-	 * (VET, 6)	N	10 KB	N	N	-	-
+	 * (VET, 6)	N	 5 KB	N	N	-	-
+	 *
+	 * (VET, 7)	N	 5 KB	N	N	-	-
 	 *
-	 * (VET, 7)	Y	10 KB	Y	N	-	dirty (VET, 6)
+	 * (VET, 8)	N	10 KB	N	N	-	-
+	 *
+	 * (VET, 9)	Y	10 KB	Y	N	-	dirty (VET, 8)
 	 *
 	 * Start by updating the expected table for the expected changes in entry status:
 	 */
 
-	expected[5].in_cache     = FALSE;
-	expected[5].destroyed    = TRUE;
-	expected[7].is_pinned    = FALSE;
+	expected[7].in_cache     = FALSE;
+	expected[7].destroyed    = TRUE;
+	expected[9].is_pinned    = FALSE;
 
         num_large_entries = 10;
 
@@ -10518,20 +10341,66 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 
     if ( pass ) {
 
-	/* load two more large entries.
-	 *
-	 * (VET, 0) should be flushed, but not evicted initially since it is dirty.
-	 *
-	 * (VET, 7) should be evicted, but (VET, 7) has an eviction operation that
-	 * dirties (VET, 6).  Since (VET, 6) is not in the cache, it will be loaded.
-	 * Since this results in no net increase in free space, the cache will
-	 * continue to attempt to create free space.
+	/* load two more large entries.  Things get a bit complicated here,
+	 * so I'll go through the operation step by step.
+         *
+         * Initially, the cache has 4 KB of empty space, so the first entry
+	 * (LET, 10) is loaded via calls to H5C_protect() H5C_unprotect()
+	 * without causing any evictions.
+         *
+         * However, this is not the case for the call of H5C_protect() on
+	 * (LET, 11).
+         *
+         * Before inserting (LET, 11), H5C_protect(LET, 11) must try to
+	 * free up at least 4  KB of space.  To do this, it starts scanning
+	 * up the LRU list to find entries to evict.
+         *
+         * (VET, 0) is at the bottom of the LRU list, and thus is the first
+	 * entry considered.  However, it is dirty, so it flushed to disk,
+         * moved to the top of the LRU list, and marked clean.
+         *
+         * (VET, 9) is the next entry on the bottom of the LRU list. It is
+	 * dirty too, calls its serialize callback function to construct an
+         * on disk image of the entry, and moves it to the top of the LRU 
+         * list after the serialize callback returns.
+         *
+         * However, (VET 9)'s serialize function needs to modify (VET, 8), 
+         * which is currently not in cache.  Thus it calls H5C_protect(VET, 8)
+	 * to gain access to it.  H5C_protect(VET, 8) loads (VET, 8), and
+	 * then attempts to evict entries to make space for it.  While (VET, 9)
+	 * is still at the bottom of the LRU, it is marked flush in progress
+         * and this is skipped.  Thus the next entries on the LRU are (MET, 0) 
+         * thru (MET, 30) and (LET, 0) thru (LET, 10) -- all of which are dirty, 
+         * and are therefore flushed and moved to the head of the LRU list.
+         *
+         * The next entry on the bottom of the LRU list is (VET, 0), which
+	 * is clean, and is therefore evicted to make space for (VET, 8).
+	 * This space is sufficient, so H5C_protect(VET, 8) inserts
+	 * (VET, 8) into the cache's index, marks it as protected, and
+	 * returns to the serialize function for (VET, 9).
+         *
+         * When the serialize function for (VET, 9) is done with (VET, 8), it
+         * calls H5C_unprotect(VET, 8), which markes (VET, 8) as dirty and
+         * unprotected, and places it at the head of the LRU.
+         *
+         * The serialize function for (VET, 9) then returns, and (VET, 9) is
+         * is written to disk, marked clean, and moved to the head of the LRU.
+         *
+         * At this point, the cache is still full (since (VET, 8) took the
+	 * space created by the eviction of (VET, 0)). Thus
+	 * H5C_protect(LET, 11) continues to look for space.  While
+	 * (MET, 0) was the next item on the LRU list when it called the
+	 * serialize function for (VET, 9), the function notices that the
+	 * LRU has been modified, and restarts its search for candidates
+	 * for eviction at the bottom of the LRU.
 	 *
-	 * The cache will then flush all the monster and large entries, but since they
-	 * are all dirty, they will not be evicted.
+	 * (MET, 0) is now at the bottom of the LRU, and is clean.  Thus
+	 * it is evicted.  This makes sufficient space for (LET, 11), so
+	 * H5C_protect(LET, 11) inserts it into the cache, marks it as
+	 * protected, and returns.
 	 *
-	 * Finally, it will reach (VET, 0) again, and evict it on the second pass.
-	 * This finally makes the necessary space.
+	 * H5C_unprotect(LET, 11) marks (LET, 11) as unprotected, and then
+	 * returns as well.
 	 *
 	 * The following table shows the expected states of the variable
 	 * size entries after the test.
@@ -10541,44 +10410,54 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	 *
 	 * (VET, 0) 	N	10 KB	N	N	-	-
 	 *
-	 * (VET, 1)	N	10 KB	N	N	-	-
+	 * (VET, 1)	N	2.5 KB	N	N	-	-
 	 *
 	 * (VET, 2)	N	10 KB	N	N	-	-
 	 *
-	 * (VET, 3)	N	10 KB	N	N	-	-
+	 * (VET, 3)	N	2.5 KB	N	N	-	-
 	 *
-	 * (VET, 4)	N	 5 KB	N	N	-	-
+	 * (VET, 4)	N	10 KB	N	N	-	-
 	 *
 	 * (VET, 5)	N	 5 KB	N	N	-	-
 	 *
-	 * (VET, 6)	Y	10 KB	Y	N	-	-
+	 * (VET, 6)	N	 5 KB	N	N	-	-
 	 *
-	 * (VET, 7)	N	10 KB	N	N	-	-
+	 * (VET, 7)	N	 5 KB	N	N	-	-
 	 *
-	 * Start by updating the expected table for the expected changes in entry status:
+	 * (VET, 8)	Y	10 KB	Y	N	-	-
 	 *
-	 * Note that we reset the loaded, cleared, flushed, and destroyed fields of
-	 * (VET,6) so we can track what is happening.
+	 * (VET, 9)	Y	10 KB	N	N	-	-
+	 *
+	 * Start by updating the expected table for the expected changes in
+	 * entry status:
+	 *
+	 * Note that we reset the loaded, flushed, and destroyed
+	 * fields of (VET,8) so we can track what is happening.
 	 */
 	base_addr = entries[VARIABLE_ENTRY_TYPE];
-	entry_ptr = &(base_addr[6]);
-	entry_ptr->loaded = FALSE;
-	entry_ptr->cleared = FALSE;
-	entry_ptr->flushed = FALSE;
-	entry_ptr->destroyed = FALSE;
+	entry_ptr = &(base_addr[8]);
+	entry_ptr->deserialized = FALSE;
+	entry_ptr->deserialized = FALSE;
+	entry_ptr->destroyed    = FALSE;
 
 	expected[0].in_cache     = FALSE;
 	expected[0].is_dirty     = FALSE;
-	expected[0].flushed      = TRUE;
+	expected[0].serialized   = TRUE;
 	expected[0].destroyed    = TRUE;
-	expected[6].in_cache	 = TRUE;
-	expected[6].is_dirty     = TRUE;
-	expected[6].loaded       = TRUE;
-	expected[6].flushed      = FALSE;
-	expected[6].destroyed    = FALSE;
-	expected[7].in_cache     = FALSE;
-	expected[7].flushed      = TRUE;
-	expected[7].destroyed    = TRUE;
+	expected[8].in_cache	 = TRUE;
+	expected[8].is_dirty     = TRUE;
+	expected[8].deserialized = TRUE;
+	expected[8].serialized   = FALSE;
+	expected[8].destroyed    = FALSE;
+	expected[9].in_cache     = TRUE;
+	expected[9].is_dirty     = FALSE;
+	expected[9].serialized   = TRUE;
+	expected[9].destroyed    = FALSE;
+
+	expected[10].in_cache     = FALSE;
+	expected[10].is_dirty     = FALSE;
+	expected[10].serialized   = TRUE;
+	expected[10].destroyed    = TRUE;
 
         num_large_entries = 12;
 
@@ -10589,8 +10468,8 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	      i < num_variable_entries + num_monster_entries + num_large_entries - 1;
 	      i++ )
 	{
-            expected[i].is_dirty = FALSE;
-	    expected[i].flushed  = TRUE;
+            expected[i].is_dirty   = FALSE;
+	    expected[i].serialized = TRUE;
 	}
 
 	for ( i = 10; i < 12; i++ )
@@ -10602,10 +10481,10 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
         /* verify cache size  */
 	if ( ( cache_ptr->index_len != 44 ) ||
              ( cache_ptr->index_size != (2 * 1024 * 1024) -
-	                                (5 * VARIABLE_ENTRY_SIZE) +
-	                                (11 * LARGE_ENTRY_SIZE) ) ||
-	     ( cache_ptr->index_size != ((1 * VARIABLE_ENTRY_SIZE) +
-					 (31 * MONSTER_ENTRY_SIZE) +
+                                        (2 * VARIABLE_ENTRY_SIZE) -
+                                        (10 * LARGE_ENTRY_SIZE) ) ||
+	     ( cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE) +
+					 (30 * MONSTER_ENTRY_SIZE) +
 					 (12 * LARGE_ENTRY_SIZE)) ) ) {
 
             pass = FALSE;
@@ -10621,11 +10500,22 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 
     if ( pass ) {
 
+        /* protect and unprotect VET 8 to move it to the top of the LRU */
+        protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 8);
+        unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 8, H5C__NO_FLAGS_SET);
+
+
         /* Again, touch all the non VARIABLE_ENTRY_TYPE entries in the
-	 * cache to bring the last remaining VARIABLE_ENTRY_TYPE entry to the
-	 * end of the LRU list.
+	 * cache to evict VET 9 and move VET 8 to the bottom of the LRU.
+         *
+         * Must do this twice to get the desired result.
 	 */
-	for ( i = 0; i < num_monster_entries; i++ )
+
+
+        /* skip MET 0 in first pass so that we evict VET 9 when we 
+         * reload MET 0 
+         */
+	for ( i = 1; i < num_monster_entries; i++ )
 	{
 	    protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
             unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__DIRTIED_FLAG);
@@ -10637,14 +10527,42 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
             unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__DIRTIED_FLAG);
 	}
 
-	/* update the expected array to mark all these entries dirty again. */
-	for ( i = num_variable_entries;
-	      i < num_variable_entries + num_monster_entries + num_large_entries - 1;
-	      i++ )
+	for ( i = 0; i < num_monster_entries; i++ )
 	{
-            expected[i].is_dirty = TRUE;
+	    protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
+            unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__DIRTIED_FLAG);
+	}
+
+	for ( i = 0; i < num_large_entries; i++ )
+	{
+	    protect_entry(file_ptr, LARGE_ENTRY_TYPE, i);
+            unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, H5C__DIRTIED_FLAG);
+	}
+
+	/* update the expected array to mark all these entries dirty again. */
+	for ( i = num_variable_entries;
+	      i < num_variable_entries + num_monster_entries + num_large_entries - 1;
+	      i++ )
+	{
+            expected[i].is_dirty = TRUE;
 	}
 
+        /* update MET 0 to set its in cache flag, and reset the its destroyed flag */
+        expected[10].in_cache     = TRUE;
+
+        /* pass through non variable entries will flush VET 8, and evict VET 9.
+         * Update accordingly.
+         */
+        expected[8].in_cache     = TRUE;
+        expected[8].is_dirty     = TRUE;
+        expected[8].serialized   = FALSE;
+        expected[8].destroyed    = FALSE;
+        expected[9].in_cache     = FALSE;
+        expected[9].is_dirty     = FALSE;
+        expected[9].serialized   = TRUE;
+        expected[9].destroyed    = TRUE;
+
+
         /* verify cache size */
 	if ( ( cache_ptr->index_len != 44 ) ||
              ( cache_ptr->index_size != (2 * 1024 * 1024) -
@@ -10658,6 +10576,12 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	    failure_mssg = "unexpected size/len in flush op eviction test 12.";
 	}
 
+        /* modifications to the H5C__flush_single_entry() function have 
+         * changed the behavior of the cache slightly, causing 
+         * this test to fail.  Comment out for now -- come back and 
+         * fix if all goes well.
+         */
+
 	/* verify entry status */
 	verify_entry_status(cache_ptr,
 			    10,
@@ -10669,10 +10593,11 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 
         /* Load two more large entries.
 	 *
-	 * Since (VET, 6) is dirty, at first this will just cause (VET, 6) to be flushed.
+	 * Since (VET, 8) is dirty, at first this will just cause (VET, 8)
+	 * to be flushed.
 	 *
-	 * But all other entries in the cache are dirty, so the cache will flush them all,
-	 * and then evict (VET, 6) on the second pass.
+	 * But all other entries in the cache are dirty, so the cache will
+	 * flush them all, and then evict (VET, 8) on the second pass.
 	 *
 	 * The following table shows the expected states of the variable
 	 * size entries after the test.
@@ -10682,27 +10607,32 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	 *
 	 * (VET, 0) 	N	10 KB	N	N	-	-
 	 *
-	 * (VET, 1)	N	10 KB	N	N	-	-
+	 * (VET, 1)	N	2.5 KB	N	N	-	-
 	 *
 	 * (VET, 2)	N	10 KB	N	N	-	-
 	 *
-	 * (VET, 3)	N	10 KB	N	N	-	-
+	 * (VET, 3)	N	2.5 KB	N	N	-	-
 	 *
-	 * (VET, 4)	N	 5 KB	N	N	-	-
+	 * (VET, 4)	N	10 KB	N	N	-	-
 	 *
 	 * (VET, 5)	N	 5 KB	N	N	-	-
 	 *
-	 * (VET, 6)	N	10 KB	N	N	-	-
+	 * (VET, 6)	N	 5 KB	N	N	-	-
 	 *
-	 * (VET, 7)	N	10 KB	N	N	-	-
+	 * (VET, 7)	N	 5 KB	N	N	-	-
 	 *
-	 * Start by updating the expected table for the expected changes in entry status:
+	 * (VET, 8)	N	10 KB	N	N	-	-
+	 *
+	 * (VET, 9)	N	10 KB	N	N	-	-
+	 *
+	 * Start by updating the expected table for the expected changes in
+	 * entry status:
 	 */
 
-	expected[6].in_cache	 = FALSE;
-	expected[6].is_dirty     = FALSE;
-	expected[6].flushed      = TRUE;
-	expected[6].destroyed    = TRUE;
+	expected[8].in_cache	 = FALSE;
+	expected[8].is_dirty     = FALSE;
+	expected[8].serialized   = TRUE;
+	expected[8].destroyed    = TRUE;
 
         num_large_entries = 14;
 
@@ -10713,8 +10643,8 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	      i < num_variable_entries + num_monster_entries + num_large_entries - 1;
 	      i++ )
 	{
-            expected[i].is_dirty = FALSE;
-	    expected[i].flushed  = TRUE;
+            expected[i].is_dirty   = FALSE;
+	    expected[i].serialized = TRUE;
 	}
 
 	for ( i = 12; i < 14; i++ )
@@ -10735,6 +10665,12 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	    failure_mssg = "unexpected size/len in flush op eviction test 13.";
 	}
 
+        /* modifications to the H5C__flush_single_entry() function have 
+         * changed the behavior of the cache slightly, causing 
+         * this test to fail.  Comment out for now -- come back and 
+         * fix if all goes well.
+         */
+
 	/* verify entry status */
 	verify_entry_status(cache_ptr,
 			    11,
@@ -10750,8 +10686,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 
     if ( pass ) {
 
-        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                H5C__FLUSH_INVALIDATE_FLAG);
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__FLUSH_INVALIDATE_FLAG);
 
         if ( result < 0 ) {
 
@@ -10781,23 +10716,24 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	if ( ( cache_ptr->insertions[VARIABLE_ENTRY_TYPE] != 0 ) ||
              ( cache_ptr->pinned_insertions[VARIABLE_ENTRY_TYPE] != 0 ) ||
              ( cache_ptr->clears[VARIABLE_ENTRY_TYPE] != 0 ) ||
-             ( cache_ptr->flushes[VARIABLE_ENTRY_TYPE] != 14 ) ||
-             ( cache_ptr->evictions[VARIABLE_ENTRY_TYPE] != 9 ) ||
+             ( cache_ptr->flushes[VARIABLE_ENTRY_TYPE] != 8 ) ||
+             ( cache_ptr->evictions[VARIABLE_ENTRY_TYPE] != 11 ) ||
+             ( cache_ptr->take_ownerships[VARIABLE_ENTRY_TYPE] != 0 ) ||
              ( cache_ptr->moves[VARIABLE_ENTRY_TYPE] != 1 ) ||
              ( cache_ptr->entry_flush_moves[VARIABLE_ENTRY_TYPE] != 0 ) ||
              ( cache_ptr->cache_flush_moves[VARIABLE_ENTRY_TYPE] != 0 ) ||
              ( cache_ptr->pins[VARIABLE_ENTRY_TYPE] != 2 ) ||
              ( cache_ptr->unpins[VARIABLE_ENTRY_TYPE] != 2 ) ||
-             ( cache_ptr->dirty_pins[VARIABLE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->dirty_pins[VARIABLE_ENTRY_TYPE] != 2 ) ||
              ( cache_ptr->pinned_flushes[VARIABLE_ENTRY_TYPE] != 0 ) ||
              ( cache_ptr->pinned_clears[VARIABLE_ENTRY_TYPE] != 0 ) ||
              ( cache_ptr->size_increases[VARIABLE_ENTRY_TYPE] != 3 ) ||
-             ( cache_ptr->size_decreases[VARIABLE_ENTRY_TYPE] != 4 ) ||
+             ( cache_ptr->size_decreases[VARIABLE_ENTRY_TYPE] != 6 ) ||
              ( cache_ptr->entry_flush_size_changes[VARIABLE_ENTRY_TYPE] != 1 ) ||
              ( cache_ptr->cache_flush_size_changes[VARIABLE_ENTRY_TYPE] != 0 ) ) {
 
             pass = FALSE;
-            failure_mssg = "Unexpected variable size entry stats.";
+            failure_mssg = "Unexpected variable size entry stats in check_flush_cache__flush_op_eviction_test().";
         }
     }
 
@@ -10806,8 +10742,9 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	if ( ( cache_ptr->insertions[LARGE_ENTRY_TYPE] != 0 ) ||
              ( cache_ptr->pinned_insertions[LARGE_ENTRY_TYPE] != 0 ) ||
              ( cache_ptr->clears[LARGE_ENTRY_TYPE] != 0 ) ||
-             ( cache_ptr->flushes[LARGE_ENTRY_TYPE] != 38 ) ||
+             ( cache_ptr->flushes[LARGE_ENTRY_TYPE] != 25 ) ||
              ( cache_ptr->evictions[LARGE_ENTRY_TYPE] != 14 ) ||
+             ( cache_ptr->take_ownerships[LARGE_ENTRY_TYPE] != 0 ) ||
              ( cache_ptr->moves[LARGE_ENTRY_TYPE] != 0 ) ||
              ( cache_ptr->entry_flush_moves[LARGE_ENTRY_TYPE] != 0 ) ||
              ( cache_ptr->cache_flush_moves[LARGE_ENTRY_TYPE] != 0 ) ||
@@ -10822,7 +10759,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
              ( cache_ptr->cache_flush_size_changes[LARGE_ENTRY_TYPE] != 0 ) ) {
 
             pass = FALSE;
-            failure_mssg = "Unexpected monster entry stats.";
+            failure_mssg = "Unexpected large entry stats in check_flush_cache__flush_op_eviction_test().";
         }
     }
 
@@ -10831,8 +10768,9 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 	if ( ( cache_ptr->insertions[MONSTER_ENTRY_TYPE] != 0 ) ||
              ( cache_ptr->pinned_insertions[MONSTER_ENTRY_TYPE] != 0 ) ||
              ( cache_ptr->clears[MONSTER_ENTRY_TYPE] != 0 ) ||
-             ( cache_ptr->flushes[MONSTER_ENTRY_TYPE] != 93 ) ||
-             ( cache_ptr->evictions[MONSTER_ENTRY_TYPE] != 31 ) ||
+             ( cache_ptr->flushes[MONSTER_ENTRY_TYPE] != 62 ) ||
+             ( cache_ptr->evictions[MONSTER_ENTRY_TYPE] != 32 ) ||
+             ( cache_ptr->take_ownerships[MONSTER_ENTRY_TYPE] != 0 ) ||
              ( cache_ptr->moves[MONSTER_ENTRY_TYPE] != 0 ) ||
              ( cache_ptr->entry_flush_moves[MONSTER_ENTRY_TYPE] != 0 ) ||
              ( cache_ptr->cache_flush_moves[MONSTER_ENTRY_TYPE] != 0 ) ||
@@ -10847,7 +10785,7 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
              ( cache_ptr->cache_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) ) {
 
             pass = FALSE;
-            failure_mssg = "Unexpected monster entry stats.";
+            failure_mssg = "Unexpected monster entry stats in check_flush_cache__flush_op_eviction_test().";
         }
     }
 #endif /* H5C_COLLECT_CACHE_STATS */
@@ -10888,8 +10826,6 @@ check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr)
 static void
 check_flush_cache__single_entry(H5F_t * file_ptr)
 {
-    const char * fcn_name = "check_flush_cache__single_entry";
-    hbool_t show_progress = FALSE;
     H5C_t * cache_ptr = file_ptr->shared->cache;
 
     if ( cache_ptr == NULL ) {
@@ -10906,1706 +10842,1130 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 1);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 1,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__NO_FLAGS_SET,
-            /* flush_flags          */ H5C__NO_FLAGS_SET,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 1,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 2);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 2,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__DIRTIED_FLAG,
-            /* flush_flags          */ H5C__NO_FLAGS_SET,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 2,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__DIRTIED_FLAG,
+            /* flush_flags           */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 3);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 3,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__NO_FLAGS_SET,
-            /* flush_flags          */ H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 3,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 4);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 4,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__DIRTIED_FLAG,
-            /* flush_flags          */ H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 4,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__DIRTIED_FLAG,
+            /* flush_flags           */ H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 5);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 5,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__NO_FLAGS_SET,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 5,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 6);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 6,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__DIRTIED_FLAG,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 6,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__DIRTIED_FLAG,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 7);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 7,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__NO_FLAGS_SET,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 7,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 8);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 8,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__DIRTIED_FLAG,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 8,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__DIRTIED_FLAG,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 9);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 9,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__NO_FLAGS_SET,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 9,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 10);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 10,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__DIRTIED_FLAG,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 10,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__DIRTIED_FLAG,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 11);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 11,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__NO_FLAGS_SET,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 11,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 12);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 12,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__DIRTIED_FLAG,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 12,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__DIRTIED_FLAG,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 13);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 13,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__NO_FLAGS_SET,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
-                                       H5C__FLUSH_INVALIDATE_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 13,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
+                                        H5C__FLUSH_INVALIDATE_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 14);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 14,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__DIRTIED_FLAG,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
-                                       H5C__FLUSH_INVALIDATE_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 14,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__DIRTIED_FLAG,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
+                                        H5C__FLUSH_INVALIDATE_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 15);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 15,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__NO_FLAGS_SET,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG |
-                                       H5C__FLUSH_MARKED_ENTRIES_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 15,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG |
+                                        H5C__FLUSH_MARKED_ENTRIES_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 16);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 16,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__DIRTIED_FLAG,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG |
-                                       H5C__FLUSH_MARKED_ENTRIES_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 16,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__DIRTIED_FLAG,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG |
+                                        H5C__FLUSH_MARKED_ENTRIES_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 17);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 17,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__NO_FLAGS_SET,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 17,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 18);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 18,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__NO_FLAGS_SET,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 18,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 19);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 19,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 19,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 20);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 20,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 20,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 21);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 21,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 21,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 22);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 22,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 22,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 23);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 23,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 23,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 24);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 24,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 24,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 25);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 25,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 25,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 26);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 26,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 26,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 27);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 27,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 27,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 28);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 28,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 28,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 29);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 29,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
-                                       H5C__FLUSH_INVALIDATE_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 29,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
+                                        H5C__FLUSH_INVALIDATE_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 30);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 30,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
-                                       H5C__FLUSH_INVALIDATE_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 30,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
+                                        H5C__FLUSH_INVALIDATE_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 31);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 31,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG |
-                                       H5C__FLUSH_MARKED_ENTRIES_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 31,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG |
+                                        H5C__FLUSH_MARKED_ENTRIES_FLAG,
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 32);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 32,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ FALSE,
-            /* flags                */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG |
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 32,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ FALSE,
+            /* flags                 */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG |
                                        H5C__FLUSH_CLEAR_ONLY_FLAG |
                                        H5C__FLUSH_MARKED_ENTRIES_FLAG,
-            /* expected_loaded      */ TRUE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ TRUE
+            /* expected_deserialized */ TRUE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 33);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 33,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__NO_FLAGS_SET,
-            /* flush_flags          */ H5C__NO_FLAGS_SET,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 33,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 34);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 34,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__DIRTIED_FLAG,
-            /* flush_flags          */ H5C__NO_FLAGS_SET,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 34,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 35);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 35,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__NO_FLAGS_SET,
-            /* flush_flags          */ H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 35,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 36);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 36,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__DIRTIED_FLAG,
-            /* flush_flags          */ H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 36,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 37);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 37,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__NO_FLAGS_SET,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 37,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 38);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 38,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__DIRTIED_FLAG,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 38,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 39);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 39,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__NO_FLAGS_SET,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 39,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 40);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 40,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__DIRTIED_FLAG,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 40,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 41);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 41,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__NO_FLAGS_SET,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 41,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 42);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 42,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__DIRTIED_FLAG,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 42,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 43);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 43,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__NO_FLAGS_SET,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 43,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 44);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 44,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__DIRTIED_FLAG,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 44,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 45);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 45,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__NO_FLAGS_SET,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
-                                       H5C__FLUSH_INVALIDATE_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 45,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
+                                        H5C__FLUSH_INVALIDATE_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 46);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 46,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__DIRTIED_FLAG,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
-                                       H5C__FLUSH_INVALIDATE_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 46,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
+                                        H5C__FLUSH_INVALIDATE_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 47);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 47,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__NO_FLAGS_SET,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG |
-                                       H5C__FLUSH_MARKED_ENTRIES_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 47,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG |
+                                        H5C__FLUSH_MARKED_ENTRIES_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 48);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 48,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__DIRTIED_FLAG,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG |
-                                       H5C__FLUSH_MARKED_ENTRIES_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 48,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__NO_FLAGS_SET,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG |
+                                        H5C__FLUSH_MARKED_ENTRIES_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 49);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 49,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__NO_FLAGS_SET,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 49,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 50);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 50,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__NO_FLAGS_SET,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 50,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__NO_FLAGS_SET,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 51);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 51,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 51,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 52);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 52,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 52,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 53);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 53,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 53,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 54);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 54,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 54,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 55);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 55,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 55,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 56);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 56,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 56,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 57);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 57,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 57,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 58);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 58,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 58,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 59);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 59,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 59,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 60);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 60,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ FALSE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 60,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ FALSE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 61);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 61,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
-                                       H5C__FLUSH_INVALIDATE_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 61,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
+                                        H5C__FLUSH_INVALIDATE_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 62);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 62,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
-                                       H5C__FLUSH_INVALIDATE_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ FALSE,
-            /* expected_flushed     */ TRUE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 62,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_MARKED_ENTRIES_FLAG |
+                                        H5C__FLUSH_INVALIDATE_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ TRUE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 63);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 63,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG |
-                                       H5C__FLUSH_MARKED_ENTRIES_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 63,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG |
+                                        H5C__FLUSH_MARKED_ENTRIES_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
     if ( pass ) {
 
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: running test %d.\n", fcn_name, 64);
-        }
-
         check_flush_cache__single_entry_test
         (
-            /* file_ptr            */ file_ptr,
-            /* test_num             */ 64,
-            /* entry_type           */ PICO_ENTRY_TYPE,
-            /* entry_idx            */ 0,
-            /* insert_flag          */ TRUE,
-            /* flags                */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG,
-            /* flush_flags          */ H5C__FLUSH_INVALIDATE_FLAG |
-                                       H5C__FLUSH_CLEAR_ONLY_FLAG |
-                                       H5C__FLUSH_MARKED_ENTRIES_FLAG,
-            /* expected_loaded      */ FALSE,
-            /* expected_cleared     */ TRUE,
-            /* expected_flushed     */ FALSE,
-            /* expected_destroyed   */ TRUE
+            /* file_ptr             */ file_ptr,
+            /* test_num              */ 64,
+            /* entry_type            */ PICO_ENTRY_TYPE,
+            /* entry_idx             */ 0,
+            /* insert_flag           */ TRUE,
+            /* flags                 */ H5C__SET_FLUSH_MARKER_FLAG,
+            /* flush_flags           */ H5C__FLUSH_INVALIDATE_FLAG |
+                                        H5C__FLUSH_CLEAR_ONLY_FLAG |
+                                        H5C__FLUSH_MARKED_ENTRIES_FLAG,
+            /* expected_deserialized */ FALSE,
+            /* expected_serialized   */ FALSE,
+            /* expected_destroyed    */ TRUE
         );
-
-	if ( show_progress ) {
-	    HDfprintf(stdout, "%s: pass = %d.\n", fcn_name, (int)pass);
-        }
     }
 
 
@@ -12632,14 +11992,13 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
      * This yields a total of 256 tests.
      *
      * The tests and their expected results are given in the spec table
-     * below.  The values assigned to the expected_cleared, expected_flushed,
+     * below.  The values assigned to the expected_serialized,
      * and expected_destroyed fields are somewhat arcane, so the following
      * overview may be useful.
      *
      * In addition to simply checking to see if the test case runs,
      * we also check to see if the desired operations take place on the
-     * cache entry.  Thus expected_cleared is set to TRUE if we expect
-     * the entry to be flushed, expected_flushed is set to TRUE if we
+     * cache entry.  Thus expected_serialized is set to TRUE if we
      * we expect the entry to be flushed, and expected_destroyed is set
      * to TRUE if we expect the entry to be destroyed.
      *
@@ -12677,300 +12036,295 @@ check_flush_cache__single_entry(H5F_t * file_ptr)
             int 		test_num;
             int			entry_type;
             int			entry_idx;
+            hbool_t		dirty_flag;
             hbool_t		mark_dirty;
             hbool_t		pop_mark_dirty_prot;
             hbool_t		pop_mark_dirty_pinned;
             hbool_t		unprotect_unpin;
             unsigned int	flags;
             unsigned int	flush_flags;
-            hbool_t		expected_cleared;
-            hbool_t		expected_flushed;
+            hbool_t		expected_serialized;
             hbool_t		expected_destroyed;
 	} spec[256] =
-	/*                                    pop    pop
-	 *                         ent        mark   mark
-	 *  test  entry            -ry mark   dirty  dirty  unprot                             flush                                                        expect  expect expect
-         *  num   type             idx dirty  prot   pinned unpin  flags                       flags                                                        clear   flush  destroy
+	/*                                           pop    pop
+	 *                         ent unprot        mark   mark
+	 *  test  entry            -ry dirty  mark   dirty  dirty  unprot                             flush                                                         expect expect
+         *  num   type             idx  flag  dirty  prot   pinned unpin  flags                       flags                                                         srlzd  destroy
 	 */
-	{ {   1,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                           FALSE, FALSE, FALSE },
-	  {   2,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                           FALSE, FALSE, FALSE },
-	  {   3,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {   4,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {   5,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {   6,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {   7,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {   8,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {   9,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  10,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  11,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  12,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  13,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  14,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  15,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  16,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  17,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, H5C__DIRTIED_FLAG,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  18,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, H5C__DIRTIED_FLAG,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  19,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, H5C__DIRTIED_FLAG,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  20,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, H5C__DIRTIED_FLAG,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  21,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, H5C__DIRTIED_FLAG,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  22,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, H5C__DIRTIED_FLAG,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  23,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, H5C__DIRTIED_FLAG,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  24,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, H5C__DIRTIED_FLAG,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  25,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, H5C__DIRTIED_FLAG,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  26,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, H5C__DIRTIED_FLAG,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  27,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, H5C__DIRTIED_FLAG,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  28,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, H5C__DIRTIED_FLAG,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  29,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, H5C__DIRTIED_FLAG,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  30,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, H5C__DIRTIED_FLAG,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  31,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, H5C__DIRTIED_FLAG,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  32,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, H5C__DIRTIED_FLAG,          H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  33,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE, FALSE, FALSE },
-	  {  34,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE, FALSE, FALSE },
-	  {  35,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  36,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  37,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  38,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  39,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  40,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  41,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  42,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  43,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  44,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  45,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  46,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  47,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  48,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  49,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  50,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  51,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  52,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  53,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  54,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  55,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  56,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  57,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  58,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  59,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  60,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  61,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  62,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  63,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  64,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE,  TRUE, FALSE },
-	  {  65,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  66,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  67,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  68,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  69,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  70,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  71,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  72,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  73,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  74,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  75,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  76,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  77,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  78,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  79,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  80,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  81,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  82,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  83,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  84,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  85,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  86,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  87,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  88,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  89,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  90,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  91,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  92,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  93,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  94,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  95,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  96,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  97,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  98,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  {  99,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  { 100,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  { 101,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 102,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 103,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 104,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 105,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  { 106,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  { 107,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  { 108,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE, FALSE },
-	  { 109,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 110,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 111,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 112,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 113,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 114,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 115,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 116,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 117,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 118,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 119,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 120,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 121,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 122,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 123,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 124,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 125,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 126,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 127,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 128,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE,  TRUE, FALSE },
-	  { 129,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE, FALSE },
-	  { 130,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE, FALSE },
-	  { 131,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 132,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 133,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 134,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 135,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 136,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 137,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 138,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 139,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 140,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 141,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 142,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 143,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 144,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 145,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 146,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 147,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 148,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 149,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 150,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 151,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 152,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 153,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 154,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 155,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 156,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 157,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 158,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 159,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 160,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 161,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE, FALSE },
-	  { 162,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE, FALSE },
-	  { 163,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 164,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 165,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 166,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 167,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 168,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 169,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 170,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 171,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 172,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 173,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 174,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 175,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 176,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 177,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 178,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 179,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 180,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 181,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 182,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 183,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 184,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 185,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 186,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 187,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 188,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 189,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 190,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 191,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 192,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                   TRUE, FALSE, FALSE },
-	  { 193,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 194,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 195,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 196,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 197,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 198,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 199,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 200,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 201,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 202,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 203,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 204,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 205,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 206,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 207,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 208,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 209,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 210,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 211,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 212,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 213,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 214,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 215,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 216,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 217,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 218,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 219,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 220,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 221,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 222,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 223,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 224,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, H5C__DIRTIED_FLAG,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 225,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 226,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 227,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 228,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 229,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 230,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 231,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 232,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 233,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 234,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 235,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 236,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE },
-	  { 237,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 238,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 239,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 240,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 241,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 242,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 243,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 244,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 245,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 246,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 247,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 248,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 249,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 250,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 251,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 252,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 253,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 254,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 255,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE },
-	  { 256,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG,  TRUE, FALSE, FALSE } };
+	{ {   1,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                           FALSE, FALSE },
+	  {   2,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                           FALSE, FALSE },
+	  {   3,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {   4,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {   5,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {   6,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {   7,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {   8,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {   9,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  10,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  11,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  12,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  13,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  14,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  15,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  16,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  17,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  18,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  19,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  20,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  21,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  22,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  23,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  24,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  25,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  26,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  27,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  28,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  29,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  30,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  31,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  32,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  33,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE, FALSE },
+	  {  34,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                           FALSE, FALSE },
+	  {  35,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  36,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  37,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  38,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  39,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  40,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  41,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  42,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  43,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  44,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  45,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  46,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  47,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  48,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  49,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  50,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  51,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  52,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  53,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  54,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  55,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  56,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  57,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  58,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  59,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  60,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  61,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  62,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  63,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  64,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET,                                            TRUE, FALSE },
+	  {  65,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  66,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  67,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  68,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  69,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  70,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  71,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  72,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  73,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  74,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  75,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  76,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  77,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  78,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  79,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  80,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  81,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  82,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  83,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  84,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  85,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  86,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  87,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  88,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  89,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  90,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  91,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  92,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  93,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  94,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  95,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  96,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  97,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  98,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  {  99,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  { 100,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  { 101,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 102,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 103,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 104,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 105,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  { 106,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  { 107,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  { 108,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                              FALSE, FALSE },
+	  { 109,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 110,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 111,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 112,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 113,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 114,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 115,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 116,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 117,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 118,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 119,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 120,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 121,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 122,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 123,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 124,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 125,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 126,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 127,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 128,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG,                               TRUE, FALSE },
+	  { 129,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 130,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 131,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 132,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 133,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 134,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 135,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 136,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 137,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 138,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 139,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 140,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 141,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 142,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 143,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 144,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 145,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 146,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 147,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 148,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 149,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 150,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 151,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 152,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 153,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 154,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 155,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 156,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 157,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 158,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 159,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 160,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 161,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 162,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 163,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 164,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 165,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 166,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 167,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 168,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 169,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 170,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 171,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 172,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 173,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 174,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 175,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 176,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 177,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 178,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 179,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 180,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 181,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 182,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 183,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 184,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 185,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 186,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 187,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 188,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 189,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 190,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 191,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 192,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG,                                  FALSE, FALSE },
+	  { 193,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 194,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 195,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 196,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 197,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 198,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 199,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 200,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 201,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 202,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 203,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 204,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 205,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 206,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 207,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 208,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 209,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 210,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 211,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 212,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 213,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 214,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 215,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 216,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 217,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 218,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 219,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 220,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 221,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 222,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 223,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, FALSE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 224,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE, H5C__NO_FLAGS_SET,          H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 225,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 226,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 227,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 228,  PICO_ENTRY_TYPE,  0, FALSE, FALSE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 229,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 230,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 231,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 232,  PICO_ENTRY_TYPE,  0, FALSE, FALSE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 233,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 234,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 235,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 236,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 237,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 238,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 239,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 240,  PICO_ENTRY_TYPE,  0, FALSE,  TRUE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 241,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 242,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 243,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 244,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 245,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 246,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 247,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 248,  PICO_ENTRY_TYPE,  0,  TRUE, FALSE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 249,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 250,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 251,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 252,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE, FALSE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 253,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 254,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE, FALSE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 255,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE },
+	  { 256,  PICO_ENTRY_TYPE,  0,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE } };
 
 	i = 0;
 	while ( ( pass ) && ( i < 256 ) )
 	{
-
-	    if ( show_progress ) {
-	        HDfprintf(stdout, "%s: running pinned test %d.\n", fcn_name, i);
-            }
-
 	    check_flush_cache__pinned_single_entry_test
 	    (
                 /* file_ptr             */ file_ptr,
                 /* test_num              */ spec[i].test_num,
                 /* entry_type            */ spec[i].entry_type,
                 /* entry_idx             */ spec[i].entry_idx,
+                /* dirty_flag            */ spec[i].dirty_flag,
 	        /* mark_dirty            */ spec[i].mark_dirty,
                 /* pop_mark_dirty_prot   */ spec[i].pop_mark_dirty_prot,
                 /* pop_mark_dirty_pinned */ spec[i].pop_mark_dirty_pinned,
 	        /* unprotect_unpin       */ spec[i].unprotect_unpin,
                 /* flags                 */ spec[i].flags,
                 /* flush_flags           */ spec[i].flush_flags,
-                /* expected_cleared      */ spec[i].expected_cleared,
-                /* expected_flushed      */ spec[i].expected_flushed,
+                /* expected_serialized   */ spec[i].expected_serialized,
                 /* expected_destroyed    */ spec[i].expected_destroyed
             );
 	    i++;
@@ -13005,17 +12359,15 @@ check_flush_cache__single_entry_test(H5F_t * file_ptr,
                                      hbool_t insert_flag,
                                      unsigned int flags,
                                      unsigned int flush_flags,
-                                     hbool_t expected_loaded,
-                                     hbool_t expected_cleared,
-                                     hbool_t expected_flushed,
+                                     hbool_t expected_deserialized,
+                                     hbool_t expected_serialized,
                                      hbool_t expected_destroyed)
 {
-    /* const char *   fcn_name = "check_flush_cache__single_entry_test"; */
     H5C_t *        cache_ptr = file_ptr->shared->cache;
     static char    msg[128];
     herr_t	   result;
     test_entry_t * base_addr;
-    test_entry_t * entry_ptr;
+    test_entry_t * entry_ptr = NULL;
 
     if ( cache_ptr == NULL ) {
 
@@ -13063,7 +12415,7 @@ check_flush_cache__single_entry_test(H5F_t * file_ptr,
 
     if ( pass ) {
 
-        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT, flush_flags);
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, flush_flags);
 
         if ( result < 0 ) {
 
@@ -13073,21 +12425,17 @@ check_flush_cache__single_entry_test(H5F_t * file_ptr,
                        flush_flags, test_num);
             failure_mssg = msg;
         }
-        else if ( ( entry_ptr->loaded != expected_loaded ) ||
-                  ( entry_ptr->cleared != expected_cleared ) ||
-                  ( entry_ptr->flushed != expected_flushed ) ||
+        else if ( ( entry_ptr->deserialized != expected_deserialized ) ||
+                  ( entry_ptr->serialized != expected_serialized ) ||
                   ( entry_ptr->destroyed != expected_destroyed ) ) {
-
 #if 0 /* This is useful debugging code -- lets keep it for a while */
 
             HDfprintf(stdout,
-              "loaded = %d(%d), clrd = %d(%d), flshd = %d(%d), dest = %d(%d)\n",
-              (int)(entry_ptr->loaded),
-              (int)expected_loaded,
-              (int)(entry_ptr->cleared),
-              (int)expected_cleared,
-              (int)(entry_ptr->flushed),
-              (int)expected_flushed,
+              "desrlzd = %d(%d), srlzd = %d(%d), dest = %d(%d)\n",
+              (int)(entry_ptr->deserialized),
+              (int)expected_deserialized,
+              (int)(entry_ptr->serialized),
+              (int)expected_serialized,
               (int)(entry_ptr->destroyed),
               (int)expected_destroyed);
 #endif
@@ -13126,8 +12474,7 @@ check_flush_cache__single_entry_test(H5F_t * file_ptr,
     /* clean up the cache to prep for the next test */
     if ( pass ) {
 
-        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                                 H5C__FLUSH_INVALIDATE_FLAG);
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__FLUSH_INVALIDATE_FLAG);
 
         if ( result < 0 ) {
 
@@ -13148,10 +12495,9 @@ check_flush_cache__single_entry_test(H5F_t * file_ptr,
 
         } else {
 
-            entry_ptr->loaded    = FALSE;
-            entry_ptr->cleared   = FALSE;
-            entry_ptr->flushed   = FALSE;
-            entry_ptr->destroyed = FALSE;
+            entry_ptr->deserialized = FALSE;
+            entry_ptr->serialized   = FALSE;
+            entry_ptr->destroyed    = FALSE;
         }
     }
 
@@ -13188,23 +12534,22 @@ check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
                                             int test_num,
                                             int entry_type,
                                             int entry_idx,
+                                            hbool_t unprot_dirty_flag,
 					    hbool_t mark_dirty,
 					    hbool_t pop_mark_dirty_prot,
 					    hbool_t pop_mark_dirty_pinned,
 					    hbool_t unprotect_unpin,
                                             unsigned int flags,
                                             unsigned int flush_flags,
-                                            hbool_t expected_cleared,
-                                            hbool_t expected_flushed,
+                                            hbool_t expected_serialized,
                                             hbool_t expected_destroyed)
 {
-    /* const char *fcn_name = "check_flush_cache__pinned_single_entry_test"; */
     H5C_t *       cache_ptr = file_ptr->shared->cache;
     static char    msg[128];
-    hbool_t        expected_loaded = TRUE;
+    hbool_t        expected_deserialized = TRUE;
     herr_t	   result;
     test_entry_t * base_addr;
-    test_entry_t * entry_ptr;
+    test_entry_t * entry_ptr = NULL;
 
     if ( cache_ptr == NULL ) {
 
@@ -13245,7 +12590,9 @@ check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
 	    mark_entry_dirty(entry_type, entry_idx);
 	}
 
-        unprotect_entry(file_ptr, entry_type, entry_idx, (flags | H5C__PIN_ENTRY_FLAG));
+        unprotect_entry(file_ptr, entry_type, entry_idx,
+                (unprot_dirty_flag ? H5C__DIRTIED_FLAG : H5C__NO_FLAGS_SET) |
+                (flags | H5C__PIN_ENTRY_FLAG));
 
 	if ( mark_dirty ) {
 
@@ -13260,8 +12607,7 @@ check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
 
     if ( pass ) {
 
-        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-            flush_flags);
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, flush_flags);
 
         if ( result < 0 ) {
 
@@ -13271,19 +12617,16 @@ check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
                flush_flags, test_num);
             failure_mssg = msg;
         }
-        else if ( ( entry_ptr->loaded != expected_loaded ) ||
-                  ( entry_ptr->cleared != expected_cleared ) ||
-                  ( entry_ptr->flushed != expected_flushed ) ||
+        else if ( ( entry_ptr->deserialized != expected_deserialized ) ||
+                  ( entry_ptr->serialized != expected_serialized ) ||
                   ( entry_ptr->destroyed != expected_destroyed ) ) {
 #if 0 /* this is useful debugging code -- keep it around */
             HDfprintf(stdout,
-              "loaded = %d(%d), clrd = %d(%d), flshd = %d(%d), dest = %d(%d)\n",
-              (int)(entry_ptr->loaded),
-              (int)expected_loaded,
-              (int)(entry_ptr->cleared),
-              (int)expected_cleared,
-              (int)(entry_ptr->flushed),
-              (int)expected_flushed,
+              "desrlzd = %d(%d), srlzd = %d(%d), dest = %d(%d)\n",
+              (int)(entry_ptr->deserialized),
+              (int)expected_deserialized,
+              (int)(entry_ptr->serialized),
+              (int)expected_serialized,
               (int)(entry_ptr->destroyed),
               (int)expected_destroyed);
 #endif
@@ -13327,7 +12670,8 @@ check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
             protect_entry(file_ptr, entry_type, entry_idx);
 
             unprotect_entry(file_ptr, entry_type, entry_idx,
-                    (flags & H5C__DIRTIED_FLAG) | H5C__UNPIN_ENTRY_FLAG);
+                (unprot_dirty_flag ? H5C__DIRTIED_FLAG : H5C__NO_FLAGS_SET) |
+                 H5C__UNPIN_ENTRY_FLAG);
 
         } else {
 
@@ -13338,8 +12682,7 @@ check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
 
     if ( pass ) {
 
-        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                                 H5C__FLUSH_INVALIDATE_FLAG);
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__FLUSH_INVALIDATE_FLAG);
 
         if ( result < 0 ) {
 
@@ -13360,10 +12703,9 @@ check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
 
         } else {
 
-            entry_ptr->loaded    = FALSE;
-            entry_ptr->cleared   = FALSE;
-            entry_ptr->flushed   = FALSE;
-            entry_ptr->destroyed = FALSE;
+            entry_ptr->deserialized = FALSE;
+            entry_ptr->serialized   = FALSE;
+            entry_ptr->destroyed    = FALSE;
         }
     }
 
@@ -13390,7 +12732,6 @@ check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr,
 static unsigned
 check_get_entry_status(void)
 {
-    const char *  fcn_name = "check_get_entry_status";
     static char   msg[128];
     herr_t        result;
     hbool_t	  in_cache;
@@ -13434,7 +12775,7 @@ check_get_entry_status(void)
          */
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
-                &in_cache, &is_dirty, &is_protected, &is_pinned);
+                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -13462,7 +12803,7 @@ check_get_entry_status(void)
     if ( pass ) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
-                &in_cache, &is_dirty, &is_protected, &is_pinned);
+                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -13488,7 +12829,7 @@ check_get_entry_status(void)
     if ( pass ) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
-                &in_cache, &is_dirty, &is_protected, &is_pinned);
+                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -13514,7 +12855,7 @@ check_get_entry_status(void)
     if ( pass ) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
-                &in_cache, &is_dirty, &is_protected, &is_pinned);
+                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -13540,7 +12881,7 @@ check_get_entry_status(void)
     if ( pass ) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
-                &in_cache, &is_dirty, &is_protected, &is_pinned);
+                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -13566,7 +12907,7 @@ check_get_entry_status(void)
     if ( pass ) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
-                &in_cache, &is_dirty, &is_protected, &is_pinned);
+                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -13593,7 +12934,7 @@ check_get_entry_status(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -13613,7 +12954,6 @@ check_get_entry_status(void)
  *
  * Modifications:
  *
- * 		None.
  *
  *-------------------------------------------------------------------------
  */
@@ -13621,7 +12961,6 @@ check_get_entry_status(void)
 static unsigned
 check_expunge_entry(void)
 {
-    const char *  fcn_name = "check_expunge_entry";
     static char   msg[128];
     herr_t        result;
     hbool_t	  in_cache;
@@ -13656,7 +12995,7 @@ check_expunge_entry(void)
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
                                       &in_cache, &is_dirty, &is_protected,
-				      &is_pinned);
+				      &is_pinned, NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -13671,9 +13010,8 @@ check_expunge_entry(void)
             HDsnprintf(msg, (size_t)128, "Unexpected status 1.");
             failure_mssg = msg;
 
-        } else if ( ( entry_ptr->loaded ) ||
-                    ( entry_ptr->cleared ) ||
-		    ( entry_ptr->flushed ) ||
+        } else if ( ( entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( entry_ptr->destroyed ) ) {
 
             pass = FALSE;
@@ -13698,35 +13036,34 @@ check_expunge_entry(void)
     if ( pass ) {
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
-                &in_cache, &is_dirty, &is_protected, &is_pinned);
+                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, NULL, NULL);
 
-        if ( result < 0 ) {
+	if ( result < 0 ) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
                        "H5C_get_entry_status() reports failure 2.");
             failure_mssg = msg;
 
-        } else if ( !in_cache || is_dirty || is_protected || is_pinned ) {
+	} else if ( !in_cache || is_dirty || is_protected || is_pinned ) {
 
-                pass = FALSE;
-                HDsnprintf(msg, (size_t)128, "Unexpected status 2.");
-                failure_mssg = msg;
+            pass = FALSE;
+            HDsnprintf(msg, (size_t)128, "Unexpected status 2.");
+            failure_mssg = msg;
 
-            } else if ( ( ! entry_ptr->loaded ) ||
-                        ( entry_ptr->cleared ) ||
-                ( entry_ptr->flushed ) ||
-                ( entry_ptr->destroyed ) ) {
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
+		    ( entry_ptr->destroyed ) ) {
 
-                pass = FALSE;
-                HDsnprintf(msg, (size_t)128, "Unexpected entry history 2.");
-                failure_mssg = msg;
+            pass = FALSE;
+            HDsnprintf(msg, (size_t)128, "Unexpected entry history 2.");
+            failure_mssg = msg;
 
-        }
+	}
     }
 
     /* Expunge the entry and then verify that it is no longer in the cache.
-     * Also verify that the entry was loaded, cleared, and destroyed, but
+     * Also verify that the entry was loaded and destroyed, but
      * not flushed.
      */
     if ( pass ) {
@@ -13742,31 +13079,30 @@ check_expunge_entry(void)
          */
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
-                &in_cache, &is_dirty, &is_protected, &is_pinned);
+                &in_cache, &is_dirty, &is_protected, &is_pinned, NULL, NULL, NULL);
 
-        if ( result < 0 ) {
+	if ( result < 0 ) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
                        "H5C_get_entry_status() reports failure 3.");
             failure_mssg = msg;
 
-        } else if ( in_cache ) {
+	} else if ( in_cache ) {
 
-                pass = FALSE;
-                HDsnprintf(msg, (size_t)128, "Unexpected status 3.");
-                failure_mssg = msg;
+            pass = FALSE;
+            HDsnprintf(msg, (size_t)128, "Unexpected status 3.");
+            failure_mssg = msg;
 
-            } else if ( ( ! entry_ptr->loaded ) ||
-                        ( ! entry_ptr->cleared ) ||
-                ( entry_ptr->flushed ) ||
-                ( ! entry_ptr->destroyed ) ) {
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
+		    ( ! entry_ptr->destroyed ) ) {
 
-                pass = FALSE;
-                HDsnprintf(msg, (size_t)128, "Unexpected entry history 3.");
-                failure_mssg = msg;
+            pass = FALSE;
+            HDsnprintf(msg, (size_t)128, "Unexpected entry history 3.");
+            failure_mssg = msg;
 
-        }
+	}
     }
 
     /* now repeat the process with a different entry.  On unprotect
@@ -13784,31 +13120,30 @@ check_expunge_entry(void)
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
                                       &in_cache, &is_dirty, &is_protected,
-				      &is_pinned);
+				      &is_pinned, NULL, NULL, NULL);
 
-        if ( result < 0 ) {
+	if ( result < 0 ) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
                        "H5C_get_entry_status() reports failure 4.");
             failure_mssg = msg;
 
-        } else if ( in_cache ) {
+	} else if ( in_cache ) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected status 4.");
             failure_mssg = msg;
 
-        } else if ( ( entry_ptr->loaded ) ||
-                    ( entry_ptr->cleared ) ||
-		    ( entry_ptr->flushed ) ||
+        } else if ( ( entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( entry_ptr->destroyed ) ) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 4.");
             failure_mssg = msg;
 
-        }
+	}
     }
 
     /* protect the entry to force the cache to load it, and then unprotect
@@ -13827,35 +13162,34 @@ check_expunge_entry(void)
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
                                       &in_cache, &is_dirty, &is_protected,
-				      &is_pinned);
+				      &is_pinned, NULL, NULL, NULL);
 
-        if ( result < 0 ) {
+	if ( result < 0 ) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
                        "H5C_get_entry_status() reports failure 5.");
             failure_mssg = msg;
 
-        } else if ( !in_cache || !is_dirty || is_protected || is_pinned ) {
+	} else if ( !in_cache || !is_dirty || is_protected || is_pinned ) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected status 5.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->loaded ) ||
-                    ( entry_ptr->cleared ) ||
-		    ( entry_ptr->flushed ) ||
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( entry_ptr->destroyed ) ) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 5.");
             failure_mssg = msg;
 
-        }
+	}
     }
 
     /* Expunge the entry and then verify that it is no longer in the cache.
-     * Also verify that the entry was loaded, cleared and destroyed, but not
+     * Also verify that the entry was loaded and destroyed, but not
      * flushed.
      */
     if ( pass ) {
@@ -13872,31 +13206,30 @@ check_expunge_entry(void)
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
                                       &in_cache, &is_dirty, &is_protected,
-				      &is_pinned);
+				      &is_pinned, NULL, NULL, NULL);
 
-        if ( result < 0 ) {
+	if ( result < 0 ) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128,
                        "H5C_get_entry_status() reports failure 6.");
             failure_mssg = msg;
 
-        } else if ( in_cache ) {
+	} else if ( in_cache ) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected status 6.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->loaded ) ||
-                    ( ! entry_ptr->cleared ) ||
-		    ( entry_ptr->flushed ) ||
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( ! entry_ptr->destroyed ) ) {
 
             pass = FALSE;
             HDsnprintf(msg, (size_t)128, "Unexpected entry history 6.");
             failure_mssg = msg;
 
-        }
+	}
     }
 
     if ( pass ) {
@@ -13909,7 +13242,7 @@ check_expunge_entry(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -13937,7 +13270,6 @@ check_expunge_entry(void)
 static unsigned
 check_multiple_read_protect(void)
 {
-    const char * fcn_name = "check_multiple_read_protect()";
     H5F_t * file_ptr = NULL;
 #if H5C_COLLECT_CACHE_STATS
     H5C_t * cache_ptr = NULL;
@@ -14334,7 +13666,7 @@ check_multiple_read_protect(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -14362,7 +13694,6 @@ check_multiple_read_protect(void)
 static unsigned
 check_move_entry(void)
 {
-    const char * fcn_name = "check_move_entry";
     int          i;
     H5F_t *      file_ptr = NULL;
     struct move_entry_test_spec test_specs[4] =
@@ -14403,13 +13734,13 @@ check_move_entry(void)
      *
      * At present, we should do the following tests:
      *
-     * 1) move a clean, unprotected, unpinned entry.
+     * 1) Move a clean, unprotected, unpinned entry.
      *
-     * 2) move a dirty, unprotected, unpinned entry.
+     * 2) Move a dirty, unprotected, unpinned entry.
      *
-     * 3) move a clean, unprotected, pinned entry.
+     * 3) Move a clean, unprotected, pinned entry.
      *
-     * 4) move a dirty, unprotected, pinned entry.
+     * 4) Move a dirty, unprotected, pinned entry.
      *
      * In all cases, the entry should have moved to its
      * new location, and have been marked dirty if it wasn't
@@ -14447,7 +13778,7 @@ check_move_entry(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -14479,7 +13810,6 @@ check_move_entry__run_test(H5F_t * file_ptr,
                              int test_num,
                              struct move_entry_test_spec * spec_ptr)
 {
-    /* const char *   fcn_name = "check_move_entry__run_test"; */
     H5C_t *       cache_ptr = file_ptr->shared->cache;
     static char    msg[128];
     unsigned int   flags = H5C__NO_FLAGS_SET;
@@ -14487,8 +13817,23 @@ check_move_entry__run_test(H5F_t * file_ptr,
     test_entry_t * entry_ptr = NULL;
     H5C_cache_entry_t * test_ptr = NULL;
 
-    assert( cache_ptr );
-    assert( spec_ptr );
+    if ( cache_ptr == NULL ) {
+
+        pass = FALSE;
+        HDsnprintf(msg, (size_t)128,
+                   "cache_ptr NULL on entry to move test #%d.",
+                   test_num);
+        failure_mssg = msg;
+
+    } else if ( spec_ptr == NULL ) {
+
+        pass = FALSE;
+        HDsnprintf(msg, (size_t)128,
+                   "spec_ptr NULL on entry to move test #%d.",
+                   test_num);
+        failure_mssg = msg;
+
+    }
 
     if ( pass ) {
 
@@ -14615,7 +13960,6 @@ check_move_entry__run_test(H5F_t * file_ptr,
 static unsigned
 check_pin_protected_entry(void)
 {
-    const char *  fcn_name = "check_pin_protected_entry";
     static char   msg[128];
     herr_t        result;
     H5F_t *       file_ptr = NULL;
@@ -14690,7 +14034,7 @@ check_pin_protected_entry(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -14715,7 +14059,6 @@ check_pin_protected_entry(void)
 static unsigned
 check_resize_entry(void)
 {
-    const char *   fcn_name = "check_resize_entry";
     static char    msg[128];
     herr_t         result;
     hbool_t	   in_cache;
@@ -14727,7 +14070,7 @@ check_resize_entry(void)
     H5F_t *        file_ptr = NULL;
     H5C_t *        cache_ptr = NULL;
     test_entry_t * base_addr;
-    test_entry_t * entry_ptr;
+    test_entry_t * entry_ptr = NULL;
 
     TESTING("entry resize functionality");
 
@@ -14782,7 +14125,7 @@ check_resize_entry(void)
 
             base_addr = entries[LARGE_ENTRY_TYPE];
             entry_ptr = &(base_addr[0]);
-	    entry_size = LARGE_ENTRY_SIZE;
+            entry_size = LARGE_ENTRY_SIZE;
         }
     }
 
@@ -14825,7 +14168,8 @@ check_resize_entry(void)
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
-				      &is_dirty, &is_protected, &is_pinned);
+				      &is_dirty, &is_protected, &is_pinned,
+                                      NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -14840,9 +14184,8 @@ check_resize_entry(void)
             HDsnprintf(msg, (size_t)128, "Unexpected status 1.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->loaded ) ||
-                    ( entry_ptr->cleared ) ||
-		    ( entry_ptr->flushed ) ||
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( entry_ptr->destroyed ) ) {
 
             pass = FALSE;
@@ -14864,9 +14207,8 @@ check_resize_entry(void)
 
         } else {
 
-            result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                    &(types[LARGE_ENTRY_TYPE]), entry_ptr->addr, (void *)entry_ptr,
-                    H5C__DIRTIED_FLAG);
+            result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT,
+                       entry_ptr->addr, (void *)entry_ptr, H5C__DIRTIED_FLAG);
 
             if ( result < 0 ) {
 
@@ -14904,7 +14246,8 @@ check_resize_entry(void)
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
-				      &is_dirty, &is_protected, &is_pinned);
+				      &is_dirty, &is_protected, &is_pinned,
+                                      NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -14920,9 +14263,8 @@ check_resize_entry(void)
             HDsnprintf(msg, (size_t)128, "Unexpected status 2.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->loaded ) ||
-                    ( entry_ptr->cleared ) ||
-		    ( entry_ptr->flushed ) ||
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( entry_ptr->destroyed ) ) {
 
             pass = FALSE;
@@ -14950,9 +14292,8 @@ check_resize_entry(void)
 
         } else {
 
-            result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                    &(types[LARGE_ENTRY_TYPE]), entry_ptr->addr, (void *)entry_ptr,
-                    H5C__DIRTIED_FLAG);
+            result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT,
+                       entry_ptr->addr, (void *)entry_ptr, H5C__DIRTIED_FLAG);
 
             if ( result < 0 ) {
 
@@ -14990,7 +14331,8 @@ check_resize_entry(void)
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
-				      &is_dirty, &is_protected, &is_pinned);
+				      &is_dirty, &is_protected, &is_pinned,
+                                      NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -15006,9 +14348,8 @@ check_resize_entry(void)
             HDsnprintf(msg, (size_t)128, "Unexpected status 3.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->loaded ) ||
-                    ( entry_ptr->cleared ) ||
-		    ( entry_ptr->flushed ) ||
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( entry_ptr->destroyed ) ) {
 
             pass = FALSE;
@@ -15058,7 +14399,8 @@ check_resize_entry(void)
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
-				      &is_dirty, &is_protected, &is_pinned);
+				      &is_dirty, &is_protected, &is_pinned,
+                                      NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -15074,9 +14416,8 @@ check_resize_entry(void)
             HDsnprintf(msg, (size_t)128, "Unexpected status 4.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->loaded ) ||
-                    ( entry_ptr->cleared ) ||
-		    ( entry_ptr->flushed ) ||
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( entry_ptr->destroyed ) ) {
 
             pass = FALSE;
@@ -15118,7 +14459,8 @@ check_resize_entry(void)
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
-				      &is_dirty, &is_protected, &is_pinned);
+				      &is_dirty, &is_protected, &is_pinned,
+                                      NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -15134,9 +14476,8 @@ check_resize_entry(void)
             HDsnprintf(msg, (size_t)128, "Unexpected status 5.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->loaded ) ||
-                    ( entry_ptr->cleared ) ||
-		    ( entry_ptr->flushed ) ||
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( entry_ptr->destroyed ) ) {
 
             pass = FALSE;
@@ -15159,7 +14500,7 @@ check_resize_entry(void)
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
                                       &in_cache, &is_dirty, &is_protected,
-				      &is_pinned);
+				      &is_pinned, NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -15174,9 +14515,8 @@ check_resize_entry(void)
             HDsnprintf(msg, (size_t)128, "Unexpected status 6.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->loaded ) ||
-                    ( ! entry_ptr->cleared ) ||
-		    ( entry_ptr->flushed ) ||
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( ! entry_ptr->destroyed ) ) {
 
             pass = FALSE;
@@ -15273,7 +14613,8 @@ check_resize_entry(void)
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
-				      &is_dirty, &is_protected, &is_pinned);
+				      &is_dirty, &is_protected, &is_pinned,
+                                      NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -15288,9 +14629,8 @@ check_resize_entry(void)
             HDsnprintf(msg, (size_t)128, "Unexpected status 7.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->loaded ) ||
-                    ( entry_ptr->cleared ) ||
-		    ( entry_ptr->flushed ) ||
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( entry_ptr->destroyed ) ) {
 
             pass = FALSE;
@@ -15312,9 +14652,8 @@ check_resize_entry(void)
 
         } else {
 
-            result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                    &(types[LARGE_ENTRY_TYPE]), entry_ptr->addr, (void *)entry_ptr,
-                    H5C__DIRTIED_FLAG);
+            result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT,
+                       entry_ptr->addr, (void *)entry_ptr, H5C__DIRTIED_FLAG);
 
             if ( result < 0 ) {
 
@@ -15354,7 +14693,8 @@ check_resize_entry(void)
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
-				      &is_dirty, &is_protected, &is_pinned);
+				      &is_dirty, &is_protected, &is_pinned,
+                                      NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -15370,9 +14710,8 @@ check_resize_entry(void)
             HDsnprintf(msg, (size_t)128, "Unexpected status 8.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->loaded ) ||
-                    ( entry_ptr->cleared ) ||
-		    ( entry_ptr->flushed ) ||
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( entry_ptr->destroyed ) ) {
 
             pass = FALSE;
@@ -15400,9 +14739,8 @@ check_resize_entry(void)
 
         } else {
 
-            result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                    &(types[LARGE_ENTRY_TYPE]), entry_ptr->addr, (void *)entry_ptr,
-                    H5C__DIRTIED_FLAG);
+            result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT,
+                       entry_ptr->addr, (void *)entry_ptr, H5C__DIRTIED_FLAG);
 
             if ( result < 0 ) {
 
@@ -15440,7 +14778,8 @@ check_resize_entry(void)
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
-				      &is_dirty, &is_protected, &is_pinned);
+				      &is_dirty, &is_protected, &is_pinned,
+                                      NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -15456,9 +14795,8 @@ check_resize_entry(void)
             HDsnprintf(msg, (size_t)128, "Unexpected status 9.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->loaded ) ||
-                    ( entry_ptr->cleared ) ||
-		    ( entry_ptr->flushed ) ||
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( entry_ptr->destroyed ) ) {
 
             pass = FALSE;
@@ -15510,7 +14848,8 @@ check_resize_entry(void)
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
-				      &is_dirty, &is_protected, &is_pinned);
+				      &is_dirty, &is_protected, &is_pinned,
+                                      NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -15526,9 +14865,8 @@ check_resize_entry(void)
             HDsnprintf(msg, (size_t)128, "Unexpected status 10.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->loaded ) ||
-                    ( entry_ptr->cleared ) ||
-		    ( entry_ptr->flushed ) ||
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( entry_ptr->destroyed ) ) {
 
             pass = FALSE;
@@ -15570,7 +14908,8 @@ check_resize_entry(void)
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
 			              &reported_entry_size, &in_cache,
-				      &is_dirty, &is_protected, &is_pinned);
+				      &is_dirty, &is_protected, &is_pinned,
+                                      NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -15586,9 +14925,8 @@ check_resize_entry(void)
             HDsnprintf(msg, (size_t)128, "Unexpected status 11.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->loaded ) ||
-                    ( entry_ptr->cleared ) ||
-		    ( entry_ptr->flushed ) ||
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( entry_ptr->destroyed ) ) {
 
             pass = FALSE;
@@ -15611,7 +14949,7 @@ check_resize_entry(void)
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size,
                                       &in_cache, &is_dirty, &is_protected,
-				      &is_pinned);
+				      &is_pinned, NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -15626,9 +14964,8 @@ check_resize_entry(void)
             HDsnprintf(msg, (size_t)128, "Unexpected status 12.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->loaded ) ||
-                    ( ! entry_ptr->cleared ) ||
-		    ( entry_ptr->flushed ) ||
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( ! entry_ptr->destroyed ) ) {
 
             pass = FALSE;
@@ -15653,6 +14990,7 @@ check_resize_entry(void)
     }
 
     if ( pass ) {
+
         protect_entry(file_ptr, LARGE_ENTRY_TYPE, 2);
         unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 2, H5C__DELETED_FLAG);
 
@@ -15688,7 +15026,7 @@ check_resize_entry(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -15709,7 +15047,6 @@ check_resize_entry(void)
  *
  * Modifications:
  *
- * 		None.
  *
  *-------------------------------------------------------------------------
  */
@@ -15717,7 +15054,6 @@ check_resize_entry(void)
 static unsigned
 check_evictions_enabled(void)
 {
-    const char *   fcn_name = "check_evictions_enabled";
     static char    msg[128];
     herr_t         result;
     hbool_t	   show_progress = FALSE;
@@ -15771,7 +15107,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* create the cache */
     if ( pass ) {
@@ -15796,7 +15132,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* verify that it is empty */
     if ( pass ) {
@@ -15816,7 +15152,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* verify that H5C_get_evictions_enabled() returns the expected value */
     if ( pass ) {
@@ -15833,7 +15169,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -15848,7 +15184,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* verify that the cache is full */
     if ( pass ) {
@@ -15869,7 +15205,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -15881,7 +15217,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* verify that an entry has been evicted */
     if ( pass ) {
@@ -15901,14 +15237,15 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
         entry_ptr = &(base_addr[0]);
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
-			              NULL, &in_cache, NULL, NULL, NULL);
+			              NULL, &in_cache, NULL, NULL, NULL,
+                                      NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -15923,9 +15260,8 @@ check_evictions_enabled(void)
             HDsnprintf(msg, (size_t)128, "Unexpected status 1.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->loaded ) ||
-                    ( entry_ptr->cleared ) ||
-		    ( ! entry_ptr->flushed ) ||
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( ! entry_ptr->destroyed ) ) {
 
             pass = FALSE;
@@ -15937,7 +15273,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -15948,7 +15284,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 10 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* verify that another entry has been evicted */
     if ( pass ) {
@@ -15968,14 +15304,14 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 11 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
         entry_ptr = &(base_addr[1]);
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
-			              NULL, &in_cache, NULL, NULL, NULL);
+			              NULL, &in_cache, NULL, NULL, NULL, NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -15990,9 +15326,8 @@ check_evictions_enabled(void)
             HDsnprintf(msg, (size_t)128, "Unexpected status 2.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->loaded ) ||
-                    ( entry_ptr->cleared ) ||
-		    ( ! entry_ptr->flushed ) ||
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( ! entry_ptr->destroyed ) ) {
 
             pass = FALSE;
@@ -16004,7 +15339,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 12 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* disable evictions */
     if ( pass ) {
@@ -16021,7 +15356,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 13 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* verify that evictions are disabled */
     if ( pass ) {
@@ -16041,7 +15376,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 14 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -16053,7 +15388,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 15 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* verify that no entry has been evicted */
     if ( pass ) {
@@ -16073,7 +15408,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 16 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -16084,7 +15419,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 17 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* verify that no entry has been evicted */
     if ( pass ) {
@@ -16104,7 +15439,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 18 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* re-enable evictions */
     if ( pass ) {
@@ -16121,7 +15456,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 19 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -16133,7 +15468,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 20 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* verify that no entries have been evicted */
     if ( pass ) {
@@ -16153,7 +15488,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 21 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -16165,7 +15500,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 22 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* verify that the entries have been evicted to bring the
      * cache back down to its normal size.
@@ -16188,14 +15523,14 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 23 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
         entry_ptr = &(base_addr[2]);
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
-			              NULL, &in_cache, NULL, NULL, NULL);
+			              NULL, &in_cache, NULL, NULL, NULL, NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -16210,9 +15545,8 @@ check_evictions_enabled(void)
             HDsnprintf(msg, (size_t)128, "Unexpected status 3.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->loaded ) ||
-                    ( entry_ptr->cleared ) ||
-		    ( ! entry_ptr->flushed ) ||
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( ! entry_ptr->destroyed ) ) {
 
             pass = FALSE;
@@ -16224,14 +15558,14 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 24 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
         entry_ptr = &(base_addr[3]);
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
-			              NULL, &in_cache, NULL, NULL, NULL);
+			              NULL, &in_cache, NULL, NULL, NULL, NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -16246,9 +15580,8 @@ check_evictions_enabled(void)
             HDsnprintf(msg, (size_t)128, "Unexpected status 4.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->loaded ) ||
-                    ( entry_ptr->cleared ) ||
-		    ( ! entry_ptr->flushed ) ||
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    ( entry_ptr->serialized ) ||
 		    ( ! entry_ptr->destroyed ) ) {
 
             pass = FALSE;
@@ -16260,7 +15593,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 25 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* disable evictions again */
     if ( pass ) {
@@ -16277,7 +15610,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 26 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -16291,7 +15624,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 27 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* verify that the cache has grown */
     if ( pass ) {
@@ -16311,7 +15644,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 28 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* re-enable evictions again */
     if ( pass ) {
@@ -16328,7 +15661,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 29 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -16339,7 +15672,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 30 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* verify that the cache has returned to its maximum size */
     if ( pass ) {
@@ -16359,14 +15692,14 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 31 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
         entry_ptr = &(base_addr[4]);
 
         result = H5C_get_entry_status(file_ptr, entry_ptr->addr,
-			              NULL, &in_cache, NULL, NULL, NULL);
+			              NULL, &in_cache, NULL, NULL, NULL, NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
@@ -16381,9 +15714,8 @@ check_evictions_enabled(void)
             HDsnprintf(msg, (size_t)128, "Unexpected status 5.");
             failure_mssg = msg;
 
-        } else if ( ( ! entry_ptr->loaded ) ||
-                    ( entry_ptr->cleared ) ||
-		    ( ! entry_ptr->flushed ) ||
+        } else if ( ( ! entry_ptr->deserialized ) ||
+		    (  entry_ptr->serialized ) ||
 		    ( ! entry_ptr->destroyed ) ) {
 
             pass = FALSE;
@@ -16395,7 +15727,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 32 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* disable evictions one last time before we shut down */
     if ( pass ) {
@@ -16412,7 +15744,7 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 33 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -16421,14 +15753,14 @@ check_evictions_enabled(void)
 
     if ( show_progress ) /* 34 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) { PASSED(); } else { H5_FAILED(); }
 
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -16455,7 +15787,6 @@ check_evictions_enabled(void)
 static unsigned
 check_flush_protected_err(void)
 {
-    const char * fcn_name = "check_flush_protected_err";
     H5F_t * file_ptr = NULL;
 
     TESTING("flush cache with protected entry error");
@@ -16476,8 +15807,7 @@ check_flush_protected_err(void)
 
         protect_entry(file_ptr, 0, 0);
 
-        if ( H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                H5C__NO_FLAGS_SET) >= 0 ) {
+        if ( H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__NO_FLAGS_SET) >= 0 ) {
 
             pass = FALSE;
             failure_mssg = "flush succeeded on cache with protected entry.\n";
@@ -16486,8 +15816,7 @@ check_flush_protected_err(void)
 
             unprotect_entry(file_ptr, 0, 0, H5C__DIRTIED_FLAG);
 
-            if ( H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                    H5C__NO_FLAGS_SET) < 0 ) {
+            if ( H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__NO_FLAGS_SET) < 0 ) {
 
                 pass = FALSE;
                 failure_mssg = "flush failed after unprotect.\n";
@@ -16504,7 +15833,7 @@ check_flush_protected_err(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -16526,6 +15855,7 @@ check_flush_protected_err(void)
  *
  * Modifications:
  *
+ *
  *-------------------------------------------------------------------------
  */
 
@@ -16534,7 +15864,6 @@ extern H5C_t * saved_cache;
 static unsigned
 check_destroy_pinned_err(void)
 {
-    const char * fcn_name = "check_destroy_pinned_err()";
     H5F_t * file_ptr = NULL;
 
     TESTING("destroy cache with permanently pinned entry error");
@@ -16556,7 +15885,7 @@ check_destroy_pinned_err(void)
         protect_entry(file_ptr, 0, 0);
 	unprotect_entry(file_ptr, 0, 0, H5C__PIN_ENTRY_FLAG);
 
-        if ( H5C_dest(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT) >= 0 ) {
+        if ( H5C_dest(file_ptr, H5P_DATASET_XFER_DEFAULT) >= 0 ) {
 
             pass = FALSE;
             failure_mssg = "destroy succeeded on cache with pinned entry.\n";
@@ -16565,7 +15894,7 @@ check_destroy_pinned_err(void)
 
 	    unpin_entry(0, 0);
 
-            if ( H5C_dest(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT) < 0 ) {
+            if ( H5C_dest(file_ptr, H5P_DATASET_XFER_DEFAULT) < 0 ) {
 
                 pass = FALSE;
                 failure_mssg = "destroy failed after unpin.\n";
@@ -16595,7 +15924,7 @@ check_destroy_pinned_err(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -16622,7 +15951,6 @@ check_destroy_pinned_err(void)
 static unsigned
 check_destroy_protected_err(void)
 {
-    const char * fcn_name = "check_destroy_protected_err";
     H5F_t * file_ptr = NULL;
 
     TESTING("destroy cache with protected entry error");
@@ -16643,7 +15971,7 @@ check_destroy_protected_err(void)
 
         protect_entry(file_ptr, 0, 0);
 
-        if ( H5C_dest(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT) >= 0 ) {
+        if ( H5C_dest(file_ptr, H5P_DATASET_XFER_DEFAULT) >= 0 ) {
 
             pass = FALSE;
             failure_mssg = "destroy succeeded on cache with protected entry.\n";
@@ -16652,7 +15980,7 @@ check_destroy_protected_err(void)
 
             unprotect_entry(file_ptr, 0, 0, H5C__DIRTIED_FLAG);
 
-            if ( H5C_dest(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT) < 0 ) {
+            if ( H5C_dest(file_ptr, H5P_DATASET_XFER_DEFAULT) < 0 ) {
 
                 pass = FALSE;
                 failure_mssg = "destroy failed after unprotect.\n";
@@ -16681,7 +16009,7 @@ check_destroy_protected_err(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -16708,7 +16036,6 @@ check_destroy_protected_err(void)
 static unsigned
 check_duplicate_insert_err(void)
 {
-    const char * fcn_name = "check_duplicate_insert_err";
     herr_t result = -1;
     H5F_t * file_ptr = NULL;
     test_entry_t * base_addr;
@@ -16737,8 +16064,9 @@ check_duplicate_insert_err(void)
             base_addr = entries[0];
             entry_ptr = &(base_addr[0]);
 
-            result = H5C_insert_entry(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                    &(types[0]), entry_ptr->addr, (void *)entry_ptr, H5C__NO_FLAGS_SET);
+            result = H5C_insert_entry(file_ptr, H5P_DATASET_XFER_DEFAULT,
+                                      &(types[0]), entry_ptr->addr,
+                                      (void *)entry_ptr, H5C__NO_FLAGS_SET);
 
             if ( result >= 0 ) {
 
@@ -16759,7 +16087,7 @@ check_duplicate_insert_err(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -16786,7 +16114,6 @@ check_duplicate_insert_err(void)
 static unsigned
 check_move_err(void)
 {
-    const char * fcn_name = "check_move_err()";
     herr_t result;
     H5F_t * file_ptr = NULL;
     H5C_t * cache_ptr = NULL;
@@ -16854,7 +16181,7 @@ check_move_err(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -16883,7 +16210,6 @@ check_move_err(void)
 static unsigned
 check_double_pin_err(void)
 {
-    const char * fcn_name = "check_double_pin_err()";
     herr_t result;
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
@@ -16916,9 +16242,8 @@ check_double_pin_err(void)
 
     if ( pass ) {
 
-        result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                &(types[0]), entry_ptr->addr, (void *)entry_ptr,
-                H5C__PIN_ENTRY_FLAG);
+        result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT,
+                    entry_ptr->addr, (void *)entry_ptr, H5C__PIN_ENTRY_FLAG);
 
         if ( result > 0 ) {
 
@@ -16942,7 +16267,7 @@ check_double_pin_err(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -16971,7 +16296,6 @@ check_double_pin_err(void)
 static unsigned
 check_double_unpin_err(void)
 {
-    const char * fcn_name = "check_double_unpin_err()";
     herr_t result;
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
@@ -17002,9 +16326,8 @@ check_double_unpin_err(void)
 
     if ( pass ) {
 
-        result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                &(types[0]), entry_ptr->addr, (void *)entry_ptr,
-                H5C__UNPIN_ENTRY_FLAG);
+        result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT,
+                    entry_ptr->addr, (void *)entry_ptr, H5C__UNPIN_ENTRY_FLAG);
 
         if ( result > 0 ) {
 
@@ -17041,7 +16364,7 @@ check_double_unpin_err(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -17070,7 +16393,6 @@ check_double_unpin_err(void)
 static unsigned
 check_pin_entry_errs(void)
 {
-    const char * fcn_name = "check_pin_entry_errs()";
     herr_t result;
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
@@ -17152,7 +16474,7 @@ check_pin_entry_errs(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -17177,7 +16499,6 @@ check_pin_entry_errs(void)
 static unsigned
 check_double_protect_err(void)
 {
-    const char * fcn_name = "check_double_protect_err()";
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
     H5C_cache_entry_t * cache_entry_ptr;
@@ -17205,8 +16526,9 @@ check_double_protect_err(void)
 
     if ( pass ) {
 
-        cache_entry_ptr = (H5C_cache_entry_t *)H5C_protect(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                &(types[0]), entry_ptr->addr, NULL, H5C__NO_FLAGS_SET);
+        cache_entry_ptr = (H5C_cache_entry_t *)H5C_protect(file_ptr, H5P_DATASET_XFER_DEFAULT,
+			               &(types[0]), entry_ptr->addr,
+				       &entry_ptr->addr, H5C__NO_FLAGS_SET);
 
         if ( cache_entry_ptr != NULL ) {
 
@@ -17230,7 +16552,7 @@ check_double_protect_err(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -17255,7 +16577,6 @@ check_double_protect_err(void)
 static unsigned
 check_double_unprotect_err(void)
 {
-    const char * fcn_name = "check_double_unprotect_err()";
     herr_t result;
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
@@ -17285,9 +16606,8 @@ check_double_unprotect_err(void)
 
     if ( pass ) {
 
-        result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                &(types[0]), entry_ptr->addr, (void *)entry_ptr,
-                H5C__NO_FLAGS_SET);
+        result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT,
+                    entry_ptr->addr, (void *)entry_ptr, H5C__NO_FLAGS_SET);
 
         if ( result > 0 ) {
 
@@ -17307,7 +16627,7 @@ check_double_unprotect_err(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -17335,7 +16655,6 @@ check_double_unprotect_err(void)
 static unsigned
 check_mark_entry_dirty_errs(void)
 {
-    const char * fcn_name = "check_mark_entry_dirty_errs()";
     herr_t result;
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
@@ -17387,7 +16706,7 @@ check_mark_entry_dirty_errs(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -17416,7 +16735,6 @@ check_mark_entry_dirty_errs(void)
 static unsigned
 check_expunge_entry_errs(void)
 {
-    const char * fcn_name = "check_expunge_entry_errs()";
     herr_t result;
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
@@ -17452,7 +16770,7 @@ check_expunge_entry_errs(void)
 
     if ( pass ) {
 
-	result = H5C_expunge_entry(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
+	result = H5C_expunge_entry(file_ptr, H5P_DATASET_XFER_DEFAULT,
                 &(types[0]), entry_ptr->addr, H5C__NO_FLAGS_SET);
 
         if ( result > 0 ) {
@@ -17470,7 +16788,7 @@ check_expunge_entry_errs(void)
 
     if ( pass ) {
 
-	result = H5C_expunge_entry(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
+	result = H5C_expunge_entry(file_ptr, H5P_DATASET_XFER_DEFAULT,
                 &(types[0]), entry_ptr->addr, H5C__NO_FLAGS_SET);
 
         if ( result > 0 ) {
@@ -17488,7 +16806,7 @@ check_expunge_entry_errs(void)
 
     if ( pass ) {
 
-	result = H5C_expunge_entry(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
+	result = H5C_expunge_entry(file_ptr, H5P_DATASET_XFER_DEFAULT,
                 &(types[0]), entry_ptr->addr, H5C__NO_FLAGS_SET);
 
         if ( result < 0 ) {
@@ -17511,7 +16829,7 @@ check_expunge_entry_errs(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -17536,7 +16854,6 @@ check_expunge_entry_errs(void)
 static unsigned
 check_resize_entry_errs(void)
 {
-    const char * fcn_name = "check_resize_entry_errs()";
     herr_t result;
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
@@ -17613,7 +16930,7 @@ check_resize_entry_errs(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -17638,7 +16955,6 @@ check_resize_entry_errs(void)
 static unsigned
 check_unprotect_ro_dirty_err(void)
 {
-    const char * fcn_name = "check_unprotect_ro_dirty_err()";
     herr_t result;
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
@@ -17666,9 +16982,8 @@ check_unprotect_ro_dirty_err(void)
 
     if ( pass ) {
 
-        result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                &(types[0]), entry_ptr->addr, (void *)entry_ptr,
-                H5C__DIRTIED_FLAG);
+        result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT,
+                    entry_ptr->addr, (void *)entry_ptr, H5C__DIRTIED_FLAG);
 
         if ( result >= 0 ) {
 
@@ -17710,9 +17025,8 @@ check_unprotect_ro_dirty_err(void)
 
     if ( pass ) {
 
-        result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                &(types[0]), entry_ptr->addr, (void *)entry_ptr,
-                H5C__DIRTIED_FLAG);
+        result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT,
+                    entry_ptr->addr, (void *)entry_ptr, H5C__DIRTIED_FLAG);
 
         if ( result > 0 ) {
 
@@ -17739,7 +17053,7 @@ check_unprotect_ro_dirty_err(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -17768,7 +17082,6 @@ check_unprotect_ro_dirty_err(void)
 static unsigned
 check_protect_ro_rw_err(void)
 {
-    const char * fcn_name = "check_protect_ro_rw_err()";
     H5F_t * file_ptr = NULL;
     test_entry_t * entry_ptr;
     void * thing_ptr = NULL;
@@ -17797,8 +17110,9 @@ check_protect_ro_rw_err(void)
 
     if ( pass ) {
 
-        thing_ptr = (H5C_cache_entry_t *)H5C_protect(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                &(types[0]), entry_ptr->addr, NULL, H5C__NO_FLAGS_SET);
+        thing_ptr = (H5C_cache_entry_t *)H5C_protect(file_ptr, H5P_DATASET_XFER_DEFAULT,
+			         &(types[0]), entry_ptr->addr,
+				 &entry_ptr->addr, H5C__NO_FLAGS_SET);
 
         if ( thing_ptr != NULL ) {
 
@@ -17822,7 +17136,7 @@ check_protect_ro_rw_err(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -17831,6 +17145,135 @@ check_protect_ro_rw_err(void)
 
 

 /*-------------------------------------------------------------------------
+ * Function:	check_protect_retries()
+ *
+ * Purpose:	To exercise checksum verification retries for an entry with
+ *		a speculative load.
+ *
+ * Return:	
+ *
+ * Programmer:	
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+check_protect_retries(void)
+{
+    H5F_t * file_ptr = NULL;
+    H5C_t *cache_ptr = NULL;
+    test_entry_t *base_addr = NULL;
+    test_entry_t *entry_ptr = NULL;
+    H5C_cache_entry_t * cache_entry_ptr = NULL;
+    int32_t type;
+    int32_t idx;
+
+    TESTING("protect an entry to verify retries");
+
+    pass = TRUE;
+
+    /* Set up the cache */
+    if(pass) {
+
+        reset_entries();
+
+        file_ptr = setup_cache((size_t)(2 * 1024),
+                                (size_t)(1 * 1024));
+
+	/* Set up read attempts for verifying checksum */
+	file_ptr->shared->read_attempts = 10;
+        file_ptr->shared->retries_nbins = 1;
+    }
+
+    /* Test only for this type which has a speculative load */
+    type = VARIABLE_ENTRY_TYPE;
+    idx = 0;
+
+    if(pass) {
+
+	cache_ptr = file_ptr->shared->cache;
+	base_addr = entries[type];
+        entry_ptr = &(base_addr[idx]);
+
+	/* test case (1):
+	 * 	--actual_len is smaller the initial length from get_load_size()
+	 *	--verify_chksum() returns TRUE after max_verify_ct is reached
+	 *
+	 */
+	entry_ptr->actual_len = entry_ptr->size/2;
+        entry_ptr->max_verify_ct = 3;
+        entry_ptr->verify_ct = 0;
+
+	cache_entry_ptr = (H5C_cache_entry_t *)H5C_protect(file_ptr, H5P_DATASET_XFER_DEFAULT,
+                &(types[type]), entry_ptr->addr, &entry_ptr->addr, H5C__READ_ONLY_FLAG);
+
+	if ( ( cache_entry_ptr != (void *)entry_ptr ) ||
+             ( !(entry_ptr->header.is_protected) ) ||
+             ( !(entry_ptr->header.is_read_only) ) ||
+             ( entry_ptr->header.ro_ref_count <= 0 ) ||
+             ( entry_ptr->header.type != &(types[type]) ) ||
+             ( entry_ptr->size != entry_ptr->header.size ) ||
+             ( entry_ptr->addr != entry_ptr->header.addr ) ||
+	     ( entry_ptr->verify_ct != entry_ptr->max_verify_ct ) )  {
+
+            pass = FALSE;
+            failure_mssg = "error from H5C_protect().";
+
+        } else {
+
+            HDassert( ( entry_ptr->cache_ptr == NULL ) ||
+                      ( entry_ptr->cache_ptr == cache_ptr ) );
+
+            entry_ptr->cache_ptr = cache_ptr;
+            entry_ptr->file_ptr = file_ptr;
+            entry_ptr->is_protected = TRUE;
+            entry_ptr->is_read_only = TRUE;
+            entry_ptr->ro_ref_count++;
+        }
+
+        HDassert( ((entry_ptr->header).type)->id == type );
+    }
+
+    if(pass)
+	unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, idx, H5C__NO_FLAGS_SET);
+
+    if(pass) {
+        entry_ptr = &(base_addr[++idx]);
+
+	/* test case (2):
+	 * 	--actual_len is greater the initial length from get_load_size()
+	 *	--verify_chksum() returns FALSE even after all tries is reached
+ 	 * 	  (file_ptr->shared->read_attempts is smaller then max_verify_ct)
+	 */
+	entry_ptr->actual_len = entry_ptr->size*2;
+        entry_ptr->max_verify_ct = 11;
+        entry_ptr->verify_ct = 0;
+
+	cache_entry_ptr = (H5C_cache_entry_t *)H5C_protect(file_ptr, H5P_DATASET_XFER_DEFAULT,
+                &(types[type]), entry_ptr->addr, &entry_ptr->addr, H5C__READ_ONLY_FLAG);
+
+	/* H5C_protect() should fail after all retries fail */
+	if(cache_entry_ptr != NULL)
+	    pass = FALSE;
+    }
+
+
+    takedown_cache(file_ptr, FALSE, FALSE);
+    reset_entries();
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass ) {
+
+        HDfprintf(stdout, "%s: failure_msg = \"%s\".\n",
+                  FUNC, failure_mssg);
+    }
+
+    return (unsigned)!pass;
+
+} /* check_protect_retries() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	check_evictions_enabled_err()
  *
  * Purpose:	Verify that H5C_get_evictions_enabled() and
@@ -17851,7 +17294,6 @@ check_protect_ro_rw_err(void)
 static unsigned
 check_check_evictions_enabled_err(void)
 {
-    const char * fcn_name = "check_evictions_enabled_err()";
     herr_t result;
     hbool_t evictions_enabled;
     H5F_t * file_ptr = NULL;
@@ -17961,7 +17403,7 @@ check_check_evictions_enabled_err(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -17988,6 +17430,9 @@ check_check_evictions_enabled_err(void)
  *              Added a basic set of tests for the flash cache size
  *              increment code.
  *
+ *		Vailin Choi; Feb 2014
+ *		Add the parameter to indicate "corking" the entry or not.
+ *		Suggest to do more thorough testing on this.
  *-------------------------------------------------------------------------
  */
 
@@ -18008,9 +17453,8 @@ static void test_rpt_fcn(H5_ATTR_UNUSED H5C_t * cache_ptr,
 }
 
 static unsigned
-check_auto_cache_resize(void)
+check_auto_cache_resize(hbool_t cork_ageout)
 {
-    const char * fcn_name = "check_auto_cache_resize()";
     hbool_t show_progress = FALSE;
     herr_t result;
     int32_t i;
@@ -18999,6 +18443,8 @@ check_auto_cache_resize(void)
     if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
 
+    if(cork_ageout)
+	cork_entry_type(file_ptr, MEDIUM_ENTRY_TYPE);
     /* fill the cache with 1024 byte entries -- nothing should happen
      * for three epochs while the markers are inserted into the cache
      *
@@ -19342,6 +18788,9 @@ check_auto_cache_resize(void)
 
     if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
+    if(cork_ageout)
+	uncork_entry_type(file_ptr, MEDIUM_ENTRY_TYPE);
+
 
     /* repeat the above test, but with max_decrement enabled to see
      * if that features works as it should.  Note that this will change
@@ -21102,10 +20551,6 @@ check_auto_cache_resize(void)
 
     if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    if ( pass ) {
-
-        takedown_cache(file_ptr, FALSE, FALSE);
-    }
 
     /* now test the flash cache size increment code.  At least at present,
      * there should be no interaction between the regular auto-resize
@@ -21120,18 +20565,18 @@ check_auto_cache_resize(void)
 
     if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
 
-    /* allocate a cache, enable the flash cache size increase code, and
-     * then force the flash size increase code through all its operational
-     * modes.  Verify that all performs as expected.
+    /* Place the cache in a known state via a flush-destroy on the cache
+     * to clear out all entries, and then a reset on all the entries.
+     * Then configure the cache for the flash cache size increase tests,
+     * and force the flash size increase code through all its operational
+     * modes.  Verify that all perform as expected.
      */
 
     if ( pass ) {
 
-        reset_entries();
+        flush_cache(file_ptr, TRUE, FALSE, FALSE);
 
-        file_ptr = setup_cache((size_t)(2 * 1024),
-                                (size_t)(1 * 1024));
-        cache_ptr = file_ptr->shared->cache;
+	reset_entries();
     }
 
     if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
@@ -22187,7 +21632,7 @@ check_auto_cache_resize(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -22218,7 +21663,6 @@ check_auto_cache_resize(void)
 static unsigned
 check_auto_cache_resize_disable(void)
 {
-    const char * fcn_name = "check_auto_cache_resize_disable()";
     hbool_t show_progress = FALSE;
     herr_t result;
     int32_t i;
@@ -23344,6 +22788,7 @@ check_auto_cache_resize_disable(void)
 
         /* flush the cache and destroy all entries so we start from a known point */
         flush_cache(file_ptr, TRUE, FALSE, FALSE);
+
     }
 
     if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
@@ -23570,6 +23015,7 @@ check_auto_cache_resize_disable(void)
 
         /* flush the cache and destroy all entries so we start from a known point */
         flush_cache(file_ptr, TRUE, FALSE, FALSE);
+
     }
 
     if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
@@ -23803,6 +23249,7 @@ check_auto_cache_resize_disable(void)
 
         /* flush the cache and destroy all entries so we start from a known point */
         flush_cache(file_ptr, TRUE, FALSE, FALSE);
+
     }
 
     if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++);
@@ -24914,7 +24361,7 @@ check_auto_cache_resize_disable(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -24941,7 +24388,6 @@ check_auto_cache_resize_disable(void)
 static unsigned
 check_auto_cache_resize_epoch_markers(void)
 {
-    const char * fcn_name = "check_auto_cache_resize_epoch_markers()";
     hbool_t show_progress = FALSE;
     herr_t result;
     int32_t i;
@@ -25619,7 +25065,7 @@ check_auto_cache_resize_epoch_markers(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -25651,7 +25097,6 @@ check_auto_cache_resize_epoch_markers(void)
 static unsigned
 check_auto_cache_resize_input_errs(void)
 {
-    const char * fcn_name = "check_auto_cache_resize_input_errs()";
     herr_t result;
     H5F_t * file_ptr = NULL;
     H5C_t * cache_ptr = NULL;
@@ -28027,7 +27472,7 @@ check_auto_cache_resize_input_errs(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -28059,7 +27504,6 @@ check_auto_cache_resize_input_errs(void)
 static unsigned
 check_auto_cache_resize_aux_fcns(void)
 {
-    const char * fcn_name = "check_auto_cache_resize_aux_fcns()";
     herr_t result;
     int32_t i;
     H5F_t * file_ptr = NULL;
@@ -28179,7 +27623,7 @@ check_auto_cache_resize_aux_fcns(void)
             pass = FALSE;
             failure_mssg = "H5C_get_cache_hit_rate failed.\n";
 
-        } else if ( hit_rate > FP_EPSILON ) {   /* i.e. hit_rate != 0.0 */
+        } else if ( !H5_DBL_ABS_EQUAL(hit_rate, (double)0.0f) ) {   /* i.e. hit_rate != 0.0 */
 
             pass = FALSE;
             failure_mssg =
@@ -28212,7 +27656,7 @@ check_auto_cache_resize_aux_fcns(void)
             pass = FALSE;
             failure_mssg = "H5C_get_cache_hit_rate failed.\n";
 
-        } else if ( hit_rate > FP_EPSILON ) {   /* i.e. hit_rate != 0.0 */
+        } else if ( !H5_DBL_ABS_EQUAL(hit_rate, (double)0.0f) ) {   /* i.e. hit_rate != 0.0 */
 
             pass = FALSE;
             failure_mssg =
@@ -28257,7 +27701,7 @@ check_auto_cache_resize_aux_fcns(void)
             pass = FALSE;
             failure_mssg = "H5C_get_cache_hit_rate failed.\n";
 
-        } else if ( ! DBL_REL_EQUAL(hit_rate, 0.5f, FP_EPSILON) ) { /* i.e. hit_rate != 0.5 */
+        } else if ( ! H5_DBL_ABS_EQUAL(hit_rate, (double)0.5f) ) { /* i.e. hit_rate != 0.5 */
 
             pass = FALSE;
             failure_mssg =
@@ -28340,7 +27784,7 @@ check_auto_cache_resize_aux_fcns(void)
             pass = FALSE;
             failure_mssg = "H5C_get_cache_hit_rate failed.\n";
 
-        } else if ( ! DBL_REL_EQUAL(hit_rate, 0.5F, FP_EPSILON) ) { /* i.e. hit_rate != 0.5 */
+        } else if ( ! H5_DBL_ABS_EQUAL(hit_rate, (double)0.5F) ) { /* i.e. hit_rate != 0.5 */
 
             pass = FALSE;
             failure_mssg =
@@ -28566,7 +28010,7 @@ check_auto_cache_resize_aux_fcns(void)
     if ( ! pass ) {
 
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
     }
 
     return (unsigned)!pass;
@@ -28605,7 +28049,6 @@ check_auto_cache_resize_aux_fcns(void)
 static unsigned
 check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 {
-    const char * fcn_name = "check_metadata_blizzard_absence";
     int entry_type = HUGE_ENTRY_TYPE;
     size_t entry_size = HUGE_ENTRY_SIZE; /* 16 KB */
     H5F_t * file_ptr = NULL;
@@ -28615,172 +28058,174 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
     int32_t entry_idx = 0;
     int32_t i;
 
-    /* Expected loaded status of entries depends on how they get into
-     * the cache. Insertions = not loaded, protect/unprotect = loaded.
+    /* Expected deserialized status of entries depends on how they get into
+     * the cache. Insertions = not deserialized, protect/unprotect = deserialized.
      */
-    hbool_t loaded = (hbool_t)!(fill_via_insertion);
+    hbool_t deserialized = (hbool_t)!(fill_via_insertion);
 
     /* Set up the expected array. This is used to maintain a table of the
      * expected status of every entry used in this test.
      */
     struct expected_entry_status expected[150] =
     {
-      /* entry		entry			in	at main                                                       */
-      /* type:		index:	size:		cache:	addr:	dirty:	prot:	pinned:	loaded: clrd:	flshd:	dest: */
-      { HUGE_ENTRY_TYPE, 0,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 1,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 2,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 3,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 4,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 5,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 6,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 7,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 8,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 9,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 10,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 11,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 12,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 13,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 14,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 15,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 16,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 17,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 18,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 19,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 20,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 21,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 22,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 23,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 24,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 25,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 26,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 27,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 28,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 29,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 30,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 31,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 32,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 33,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 34,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 35,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 36,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 37,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 38,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 39,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 40,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 41,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 42,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 43,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 44,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 45,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 46,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 47,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 48,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 49,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 50,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 51,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 52,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 53,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 54,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 55,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 56,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 57,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 58,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 59,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 60,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 61,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 62,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 63,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 64,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 65,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 66,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 67,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 68,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 69,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 70,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 71,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 72,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 73,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 74,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 75,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 76,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 77,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 78,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 79,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 80,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 81,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 82,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 83,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 84,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 85,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 86,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 87,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 88,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 89,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 90,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 91,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 92,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 93,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 94,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 95,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 96,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 97,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 98,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 99,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 100,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 101,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 102,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 103,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 104,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 105,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 106,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 107,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 108,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 109,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 110,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 111,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 112,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 113,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 114,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 115,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 116,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 117,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 118,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 119,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 120,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 121,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 122,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 123,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 124,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 125,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 126,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 127,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 128,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 129,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 130,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 131,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 132,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 133,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 134,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 135,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 136,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 137,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 138,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 139,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 140,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 141,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 142,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 143,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 144,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 145,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 146,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 147,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 148,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE },
-      { HUGE_ENTRY_TYPE, 149,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE }
+      /* entry		entry			in	at main                                                flush dep flush dep child flush   flush       flush */
+      /* type:		index:	size:		cache:	addr:	dirty:	prot:	pinned:	dsrlzd:	srlzd:	dest:  par type[]: par idx[]: dep npart: dep nchd: dep ndirty chd: order: corked: */
+      { HUGE_ENTRY_TYPE, 0,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 1,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 2,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 3,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 4,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 5,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 6,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 7,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 8,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 9,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 10,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 11,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 12,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 13,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 14,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 15,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 16,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 17,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 18,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 19,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 20,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 21,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 22,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 23,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 24,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 25,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 26,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 27,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 28,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 29,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 30,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 31,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 32,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 33,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 34,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 35,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 36,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 37,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 38,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 39,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 40,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 41,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 42,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 43,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 44,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 45,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 46,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 47,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 48,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 49,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 50,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 51,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 52,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 53,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 54,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 55,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 56,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 57,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 58,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 59,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 60,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 61,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 62,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 63,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 64,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 65,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 66,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 67,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 68,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 69,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 70,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 71,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 72,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 73,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 74,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 75,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 76,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 77,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 78,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 79,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 80,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 81,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 82,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 83,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 84,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 85,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 86,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 87,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 88,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 89,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 90,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 91,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 92,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 93,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 94,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 95,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 96,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 97,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 98,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 99,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 100,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 101,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 102,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 103,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 104,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 105,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 106,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 107,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 108,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 109,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 110,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 111,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 112,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 113,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 114,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 115,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 116,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 117,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 118,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 119,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 120,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 121,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 122,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 123,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 124,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 125,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 126,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 127,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 128,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 129,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 130,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 131,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 132,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 133,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 134,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 135,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 136,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 137,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 138,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 139,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 140,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 141,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 142,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 143,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 144,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 145,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 146,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 147,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 148,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 149,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE}
     };
 
     pass = TRUE;
 
+    reset_entries();
+
     if (fill_via_insertion) {
 
         TESTING("to ensure metadata blizzard absence when inserting");
@@ -28792,7 +28237,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 
     if ( show_progress) /* 0 */
          HDfprintf(stdout, "\n%s: check point %d -- pass %d\n",
-                   fcn_name, checkpoint++, pass);
+                   FUNC, checkpoint++, pass);
 
     if ( pass ) {
 
@@ -28816,7 +28261,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 
     if ( show_progress) /* 1 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
-                   fcn_name, checkpoint++, pass);
+                   FUNC, checkpoint++, pass);
 
     /* ========================================================================
      * ========================================================================
@@ -28869,7 +28314,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
              */
             expected[entry_idx].in_cache = TRUE;
             expected[entry_idx].is_dirty = TRUE;
-            expected[entry_idx].loaded = (unsigned char)loaded;
+            expected[entry_idx].deserialized = (unsigned char)deserialized;
 
             verify_entry_status(cache_ptr, /* H5C_t * cache_ptr */
                                 entry_idx, /* int tag */
@@ -28880,7 +28325,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 
     if ( show_progress) /* 2 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
-                   fcn_name, checkpoint++, pass);
+                   FUNC, checkpoint++, pass);
 
     /* ========================================================================
      * ========================================================================
@@ -28933,13 +28378,13 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
          */
 
         /* entry w/ index 0 has now been flushed and is now clean. */
-	expected[0].flushed   = TRUE;
 	expected[0].is_dirty  = FALSE;
+	expected[0].serialized  = TRUE;
 
         /* entry w/ index 26 is now in the cache and dirty. */
 	expected[26].in_cache = TRUE;
 	expected[26].is_dirty = TRUE;
-	expected[26].loaded   = (unsigned char)loaded;
+	expected[26].deserialized   = (unsigned char)deserialized;
 
         /* verify the status */
         verify_entry_status(cache_ptr, /* H5C_t * cache_ptr */
@@ -28950,7 +28395,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 
     if ( show_progress) /* 3 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
-                   fcn_name, checkpoint++, pass);
+                   FUNC, checkpoint++, pass);
 
     if ( pass ) {
 
@@ -28987,13 +28432,13 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
          */
 
         /* entry w/ index 1 has now been flushed and is now clean. */
-	expected[1].flushed   = TRUE;
 	expected[1].is_dirty  = FALSE;
+	expected[1].serialized  = TRUE;
 
         /* entry w/ index 27 is now in the cache and dirty. */
 	expected[27].in_cache = TRUE;
 	expected[27].is_dirty = TRUE;
-	expected[27].loaded   = (unsigned char)loaded;
+	expected[27].deserialized   = (unsigned char)deserialized;
 
         /* verify the status */
         verify_entry_status(cache_ptr, /* H5C_t * cache_ptr */
@@ -29004,7 +28449,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 
     if ( show_progress) /* 4 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
-                   fcn_name, checkpoint++, pass);
+                   FUNC, checkpoint++, pass);
 
     if ( pass ) {
 
@@ -29033,12 +28478,12 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
              * entry currently getting inserted is now in the cache and
              * dirty.
              */
-            expected[entry_idx - 26].flushed = TRUE;
             expected[entry_idx - 26].is_dirty = FALSE;
+            expected[entry_idx - 26].serialized = TRUE;
 
 	    expected[entry_idx].in_cache = TRUE;
     	    expected[entry_idx].is_dirty = TRUE;
-	    expected[entry_idx].loaded   = (unsigned char)loaded;
+	    expected[entry_idx].deserialized   = (unsigned char)deserialized;
 
             /* verify the status */
             verify_entry_status(cache_ptr, /* H5C_t * cache_ptr */
@@ -29057,7 +28502,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 
     if ( show_progress) /* 5 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
-                   fcn_name, checkpoint++, pass);
+                   FUNC, checkpoint++, pass);
 
     /* ========================================================================
      * ========================================================================
@@ -29113,15 +28558,15 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 	expected[0].destroyed = TRUE;
 
         /* entries w/ indices 24,25 have now been flushed and are clean. */
-	expected[24].flushed  = TRUE;
 	expected[24].is_dirty = FALSE;
-	expected[25].flushed  = TRUE;
+	expected[24].serialized = TRUE;
 	expected[25].is_dirty = FALSE;
+	expected[25].serialized = TRUE;
 
         /* entry w/ index 50 is now in the cache and dirty */
 	expected[50].in_cache = TRUE;
 	expected[50].is_dirty = TRUE;
-	expected[50].loaded   = (unsigned char)loaded;
+	expected[50].deserialized   = (unsigned char)deserialized;
 
         /* verify the status */
         verify_entry_status(cache_ptr, /* H5C_t * cache_ptr */
@@ -29132,7 +28577,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 
     if ( show_progress) /* 6 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
-                   fcn_name, checkpoint++, pass);
+                   FUNC, checkpoint++, pass);
 
 
     if ( pass ) {
@@ -29166,7 +28611,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
             /* This past inserted entry is now in the cache and dirty */
 	    expected[entry_idx].in_cache = TRUE;
     	    expected[entry_idx].is_dirty = TRUE;
-	    expected[entry_idx].loaded   = (unsigned char)loaded;
+	    expected[entry_idx].deserialized   = (unsigned char)deserialized;
 
             /* The entry inserted 50 insertions ago has been evicted */
 	    expected[entry_idx - 50].in_cache  = FALSE;
@@ -29178,8 +28623,8 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
              * 25 insertions ago. */
             if (entry_idx < 75) {
 
-                expected[entry_idx - 25].flushed = TRUE;
                 expected[entry_idx - 25].is_dirty = FALSE;
+                expected[entry_idx - 25].serialized = TRUE;
             }
             /* If the newly inserted entry is among the last
              * 25 insertions in this loop, then the insertion will
@@ -29190,8 +28635,8 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
              * flush-then-evict, it switches to evict-then-flush. */
             else {
 
-                expected[entry_idx - 26].flushed = TRUE;
                 expected[entry_idx - 26].is_dirty = FALSE;
+                expected[entry_idx - 26].serialized = TRUE;
             }
 
             /* Verify this expected status */
@@ -29204,7 +28649,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 
     if ( show_progress) /* 7 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
-                   fcn_name, checkpoint++, pass);
+                   FUNC, checkpoint++, pass);
 
     /* ========================================================================
      * ========================================================================
@@ -29253,8 +28698,8 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
         /* entries w/ indices 74-99 have been flushed. */
         for (i = 74; i < 100; i++) {
 
-            expected[i].flushed = TRUE;
             expected[i].is_dirty = FALSE;
+            expected[i].serialized = TRUE;
         }
         verify_entry_status(cache_ptr, /* H5C_t * cache_ptr */
                             0,         /* int tag */
@@ -29264,7 +28709,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 
     if ( show_progress) /* 8 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
-                   fcn_name, checkpoint++, pass);
+                   FUNC, checkpoint++, pass);
 
     if ( pass ) {
 
@@ -29297,7 +28742,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
             /* This past inserted entry is now in the cache and dirty */
 	    expected[entry_idx].in_cache = TRUE;
     	    expected[entry_idx].is_dirty = TRUE;
-	    expected[entry_idx].loaded   = (unsigned char)loaded;
+	    expected[entry_idx].deserialized   = (unsigned char)deserialized;
 
             /* The entry with ID minus 50 will have been evicted */
 	    expected[entry_idx - 50].in_cache  = FALSE;
@@ -29313,7 +28758,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 
     if ( show_progress) /* 9 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
-                   fcn_name, checkpoint++, pass);
+                   FUNC, checkpoint++, pass);
 
     if ( pass ) {
 
@@ -29347,13 +28792,13 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 	expected[76].destroyed = TRUE;
 
         /* entry w/ index 100 has now been flushed and is now clean. */
-	expected[100].flushed   = TRUE;
 	expected[100].is_dirty  = FALSE;
+	expected[100].serialized   = TRUE;
 
         /* entry w/ index 26 is now in the cache and dirty. */
 	expected[126].in_cache = TRUE;
 	expected[126].is_dirty = TRUE;
-	expected[126].loaded   = (unsigned char)loaded;
+	expected[126].deserialized   = (unsigned char)deserialized;
 
         /* verify the status */
         verify_entry_status(cache_ptr, /* H5C_t * cache_ptr */
@@ -29364,7 +28809,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 
     if ( show_progress) /* 10 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
-                   fcn_name, checkpoint++, pass);
+                   FUNC, checkpoint++, pass);
 
     if ( pass ) {
 
@@ -29391,15 +28836,15 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
             /* This past inserted entry is now in the cache and dirty */
 	    expected[entry_idx].in_cache = TRUE;
     	    expected[entry_idx].is_dirty = TRUE;
-	    expected[entry_idx].loaded   = (unsigned char)loaded;
+	    expected[entry_idx].deserialized   = (unsigned char)deserialized;
 
             /* The entry with ID minus 50 will have been evicted */
 	    expected[entry_idx - 50].in_cache  = FALSE;
 	    expected[entry_idx - 50].destroyed = TRUE;
 
             /* The entry with ID minus 26 will now be clean */
-            expected[entry_idx - 26].flushed = TRUE;
             expected[entry_idx - 26].is_dirty = FALSE;
+            expected[entry_idx - 26].serialized = TRUE;
 
             /* verify the status */
             verify_entry_status(cache_ptr, /* H5C_t * cache_ptr */
@@ -29412,9 +28857,9 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 
     if ( show_progress) /* 11 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
-                   fcn_name, checkpoint++, pass);
+                   FUNC, checkpoint++, pass);
 
-    if ( pass ) {
+    if ( cache_ptr ) {
 
         /* We're done with testing. We can take down the cache. */
         takedown_cache(file_ptr, FALSE, FALSE);
@@ -29423,7 +28868,7 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 
     if ( show_progress) /* 12 */
          HDfprintf(stdout, "%s: check point %d -- pass %d\n",
-                   fcn_name, checkpoint++, pass);
+                   FUNC, checkpoint++, pass);
 
     if ( pass ) { PASSED(); } else { H5_FAILED(); }
 
@@ -29433,82 +28878,7609 @@ check_metadata_blizzard_absence(hbool_t fill_via_insertion)
 
 

 /*-------------------------------------------------------------------------
- * Function:	main
- *
- * Purpose:	Run tests on the cache code contained in H5C.c
- *
- * Return:	Success:
+ * Function:	check_flush_deps()
  *
- *		Failure:
+ * Purpose:	Exercise the flush dependency routines.
  *
- * Programmer:	John Mainzer
- *              6/24/04
+ * Return:	0 on success, non-zero on failure
  *
- * Modifications:
+ * Programmer:	Quincey Koziol
+ *               3/12/09
  *
  *-------------------------------------------------------------------------
  */
 
-int
-main(void)
+static unsigned
+check_flush_deps(void)
 {
-    unsigned nerrs = 0;
+    H5F_t * file_ptr = NULL;            /* File for this test */
+    H5C_t * cache_ptr = NULL;           /* Metadata cache for this test */
+    test_entry_t *base_addr;            /* Base address of entries for test */
+    int entry_type = PICO_ENTRY_TYPE;   /* Use very small entry size (size of entries doesn't matter) */
+    unsigned u;                         /* Local index variable */
+    struct expected_entry_status expected[5] =
+    {
+      /* entry			entry		in	at main                                                        flush dep flush dep child flush   flush       flush */
+      /* type:		index:	size:		cache:	addr:	dirty:	prot:	pinned:	dsrlzd:	srlzd:	dest:  par type[]: par idx[]: dep npart: dep nchd: dep ndirty chd: order: corked */
+      { PICO_ENTRY_TYPE, 0,	PICO_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { PICO_ENTRY_TYPE, 1,	PICO_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { PICO_ENTRY_TYPE, 2,	PICO_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { PICO_ENTRY_TYPE, 3,	PICO_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { PICO_ENTRY_TYPE, 4,	PICO_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE}
+    };
 
-    H5open();
+    TESTING("flush dependencies");
 
-    skip_long_tests = FALSE;
-
-#ifdef NDEBUG
-    run_full_test = TRUE;
-#else /* NDEBUG */
-    run_full_test = FALSE;
-#endif /* NDEBUG */
-
-    nerrs += smoke_check_1();
-    nerrs += smoke_check_2();
-    nerrs += smoke_check_3();
-    nerrs += smoke_check_4();
-    nerrs += smoke_check_5();
-    nerrs += smoke_check_6();
-    nerrs += smoke_check_7();
-    nerrs += smoke_check_8();
-    nerrs += smoke_check_9();
-    nerrs += smoke_check_10();
-
-    nerrs += write_permitted_check();
-    nerrs += check_insert_entry();
-    nerrs += check_flush_cache();
-    nerrs += check_get_entry_status();
-    nerrs += check_expunge_entry();
-    nerrs += check_multiple_read_protect();
-    nerrs += check_move_entry();
-    nerrs += check_pin_protected_entry();
-    nerrs += check_resize_entry();
-    nerrs += check_evictions_enabled();
-    nerrs += check_flush_protected_err();
-    nerrs += check_destroy_pinned_err();
-    nerrs += check_destroy_protected_err();
-    nerrs += check_duplicate_insert_err();
-    nerrs += check_move_err();
-    nerrs += check_double_pin_err();
-    nerrs += check_double_unpin_err();
-    nerrs += check_pin_entry_errs();
-    nerrs += check_double_protect_err();
-    nerrs += check_double_unprotect_err();
-    nerrs += check_mark_entry_dirty_errs();
-    nerrs += check_expunge_entry_errs();
-    nerrs += check_resize_entry_errs();
-    nerrs += check_unprotect_ro_dirty_err();
-    nerrs += check_protect_ro_rw_err();
-    nerrs += check_check_evictions_enabled_err();
-    nerrs += check_auto_cache_resize();
-    nerrs += check_auto_cache_resize_disable();
-    nerrs += check_auto_cache_resize_epoch_markers();
-    nerrs += check_auto_cache_resize_input_errs();
-    nerrs += check_auto_cache_resize_aux_fcns();
-    nerrs += check_metadata_blizzard_absence(TRUE);
+    pass = TRUE;
+
+    /* allocate a cache, build up flush dependency hierarchy and tear it down.
+     * Verify that all performs as expected.
+     */
+
+    reset_entries();
+    file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024));
+    cache_ptr = file_ptr->shared->cache;
+    base_addr = entries[entry_type];
+
+    if ( !pass ) CACHE_ERROR("setup_cache failed")
+
+    /* Insert entries to work with into the cache */
+    for(u = 0; u < 5; u++) {
+        insert_entry(file_ptr, entry_type, (int32_t)u, H5C__NO_FLAGS_SET);
+        if ( !pass ) CACHE_ERROR("insert_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after each insertion
+         */
+        expected[u].in_cache = TRUE;
+        expected[u].is_dirty = TRUE;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)u,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    } /* end for */
+
+/* Test Case #1 - Single flush dependency relationship */
+
+    /* Create flush dependency between entries 0 (child) & 1 (parent) */
+    {
+        hbool_t in_cache, is_flush_dep_parent, is_flush_dep_child;
+        test_entry_t * entry_ptr;
+
+        protect_entry(file_ptr, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        /* Check the parent's entry status */
+	entry_ptr = &(base_addr[1]);
+	if(H5C_get_entry_status(file_ptr, entry_ptr->addr, NULL, &in_cache,
+                NULL, NULL, NULL, NULL, &is_flush_dep_parent, &is_flush_dep_child) < 0)
+            CACHE_ERROR("H5C_get_entry_status() failed")
+        if(!in_cache || is_flush_dep_parent || is_flush_dep_child)
+            CACHE_ERROR("invalid entry status")
+
+        /* Check the child's entry status */
+	entry_ptr = &(base_addr[0]);
+	if(H5C_get_entry_status(file_ptr, entry_ptr->addr, NULL, &in_cache,
+                NULL, NULL, NULL, NULL, &is_flush_dep_parent, &is_flush_dep_child) < 0)
+            CACHE_ERROR("H5C_get_entry_status() failed")
+        if(!in_cache || is_flush_dep_parent || is_flush_dep_child)
+            CACHE_ERROR("invalid entry status")
+
+        create_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Check the parent's entry status */
+	entry_ptr = &(base_addr[1]);
+	if(H5C_get_entry_status(file_ptr, entry_ptr->addr, NULL, &in_cache,
+                NULL, NULL, NULL, NULL, &is_flush_dep_parent, &is_flush_dep_child) < 0)
+            CACHE_ERROR("H5C_get_entry_status() failed")
+        if(!in_cache || !is_flush_dep_parent || is_flush_dep_child)
+            CACHE_ERROR("invalid entry status")
+
+        /* Check the child's entry status */
+	entry_ptr = &(base_addr[0]);
+	if(H5C_get_entry_status(file_ptr, entry_ptr->addr, NULL, &in_cache,
+                NULL, NULL, NULL, NULL, &is_flush_dep_parent, &is_flush_dep_child) < 0)
+            CACHE_ERROR("H5C_get_entry_status() failed")
+        if(!in_cache || is_flush_dep_parent || !is_flush_dep_child)
+            CACHE_ERROR("invalid entry status")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 1;
+        expected[0].flush_dep_npar = 1;
+        expected[1].is_protected = TRUE;
+        expected[1].is_pinned = TRUE;
+        expected[1].flush_dep_nchd = 1;
+        expected[1].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries 0 (child) & 1 (parent) */
+    {
+        destroy_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        1,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].flush_dep_npar = 0;
+        expected[1].is_protected = FALSE;
+        expected[1].is_pinned = FALSE;
+        expected[1].flush_dep_nchd = 0;
+        expected[1].flush_dep_ndirty_chd =0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #2 - Multiple children for one parent flush dependency relationship */
+
+    /* Create flush dependency between entries 0, 1 (children) & 2 (parent) */
+    {
+        protect_entry(file_ptr, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 2;
+        expected[0].flush_dep_npar = 1;
+        expected[1].flush_dep_par_type[0] = entry_type;
+        expected[1].flush_dep_par_idx[0] = 2;
+        expected[1].flush_dep_npar = 1;
+        expected[2].is_protected = TRUE;
+        expected[2].is_pinned = TRUE;
+        expected[2].flush_dep_nchd = 2;
+        expected[2].flush_dep_ndirty_chd = 2;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries 0, 1 (children) & 2 (parent) */
+    {
+        destroy_flush_dependency(entry_type, 2, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        destroy_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        2,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].flush_dep_npar = 0;
+        expected[1].flush_dep_npar = 0;
+        expected[2].is_protected = FALSE;
+        expected[2].is_pinned = FALSE;
+        expected[2].flush_dep_nchd = 0;
+        expected[2].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #3a1 - Single chain of flush dependencies, 4 entries tall
+ *      created from the "bottom up" and destroyed from the "top down"
+ */
+
+    /* Create flush dependency between entries (child) 0->1->2->3 (parent) */
+    {
+        protect_entry(file_ptr, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 1;
+        expected[0].flush_dep_npar = 1;
+        expected[1].is_protected = TRUE;
+        expected[1].is_pinned = TRUE;
+        expected[1].flush_dep_nchd = 1;
+        expected[1].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[1].flush_dep_par_type[0] = entry_type;
+        expected[1].flush_dep_par_idx[0] = 2;
+        expected[1].flush_dep_npar = 1;
+        expected[2].is_protected = TRUE;
+        expected[2].is_pinned = TRUE;
+        expected[2].flush_dep_nchd = 1;
+        expected[2].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 3, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[2].flush_dep_par_type[0] = entry_type;
+        expected[2].flush_dep_par_idx[0] = 3;
+        expected[2].flush_dep_npar = 1;
+        expected[3].is_protected = TRUE;
+        expected[3].is_pinned = TRUE;
+        expected[3].flush_dep_nchd = 1;
+        expected[3].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries, from the "top down" */
+    {
+        destroy_flush_dependency(entry_type, 3, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        3,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[2].flush_dep_npar = 0;
+        expected[3].is_protected = FALSE;
+        expected[3].is_pinned = FALSE;
+        expected[3].flush_dep_nchd = 0;
+        expected[3].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        2,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[1].flush_dep_npar = 0;
+        expected[2].is_protected = FALSE;
+        expected[2].is_pinned = FALSE;
+        expected[2].flush_dep_nchd = 0;
+        expected[2].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        1,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[0].flush_dep_npar = 0;
+        expected[1].is_protected = FALSE;
+        expected[1].is_pinned = FALSE;
+        expected[1].flush_dep_nchd = 0;
+        expected[1].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #3a2 - Single chain of flush dependencies, 4 entries tall
+ *      created from the "bottom up" and destroyed from the "bottom up"
+ */
+
+    /* Create flush dependency between entries (child) 0->1->2->3 (parent) */
+    {
+        protect_entry(file_ptr, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 1;
+        expected[0].flush_dep_npar = 1;
+        expected[1].is_protected = TRUE;
+        expected[1].is_pinned = TRUE;
+        expected[1].flush_dep_nchd = 1;
+        expected[1].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[1].flush_dep_par_type[0] = entry_type;
+        expected[1].flush_dep_par_idx[0] = 2;
+        expected[1].flush_dep_npar = 1;
+        expected[2].is_protected = TRUE;
+        expected[2].is_pinned = TRUE;
+        expected[2].flush_dep_nchd = 1;
+        expected[2].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 3, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[2].flush_dep_par_type[0] = entry_type;
+        expected[2].flush_dep_par_idx[0] = 3;
+        expected[2].flush_dep_npar = 1;
+        expected[3].is_protected = TRUE;
+        expected[3].is_pinned = TRUE;
+        expected[3].flush_dep_nchd = 1;
+        expected[3].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries, from the "bottom up" */
+    {
+        destroy_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        1,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[0].flush_dep_npar = 0;
+        expected[1].is_protected = FALSE;
+        expected[1].is_pinned = FALSE;
+        expected[1].flush_dep_nchd = 0;
+        expected[1].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        2,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[1].flush_dep_npar = 0;
+        expected[2].is_protected = FALSE;
+        expected[2].is_pinned = FALSE;
+        expected[2].flush_dep_nchd = 0;
+        expected[2].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 3, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        3,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[2].flush_dep_npar = 0;
+        expected[3].is_protected = FALSE;
+        expected[3].is_pinned = FALSE;
+        expected[3].flush_dep_nchd = 0;
+        expected[3].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #3b1 - Single chain of flush dependencies, 4 entries tall
+ *      created from the "top down" and destroyed from the "top down"
+ */
+
+    /* Create flush dependency between entries (child) 0->1->2->3 (parent) */
+    {
+        protect_entry(file_ptr, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 3, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[2].flush_dep_par_type[0] = entry_type;
+        expected[2].flush_dep_par_idx[0] = 3;
+        expected[2].flush_dep_npar = 1;
+        expected[3].is_protected = TRUE;
+        expected[3].is_pinned = TRUE;
+        expected[3].flush_dep_nchd = 1;
+        expected[3].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[1].flush_dep_par_type[0] = entry_type;
+        expected[1].flush_dep_par_idx[0] = 2;
+        expected[1].flush_dep_npar = 1;
+        expected[2].is_protected = TRUE;
+        expected[2].is_pinned = TRUE;
+        expected[2].flush_dep_nchd = 1;
+        expected[2].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 1;
+        expected[0].flush_dep_npar = 1;
+        expected[1].is_protected = TRUE;
+        expected[1].is_pinned = TRUE;
+        expected[1].flush_dep_nchd = 1;
+        expected[1].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries, from the "top down" */
+    {
+        destroy_flush_dependency(entry_type, 3, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        3,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[2].flush_dep_npar = 0;
+        expected[3].is_protected = FALSE;
+        expected[3].is_pinned = FALSE;
+        expected[3].flush_dep_nchd = 0;
+        expected[3].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        2,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[1].flush_dep_npar = 0;
+        expected[2].is_protected = FALSE;
+        expected[2].is_pinned = FALSE;
+        expected[2].flush_dep_nchd = 0;
+        expected[2].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        1,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[0].flush_dep_npar = 0;
+        expected[1].is_protected = FALSE;
+        expected[1].is_pinned = FALSE;
+        expected[1].flush_dep_nchd = 0;
+        expected[1].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #3b2 - Single chain of flush dependencies, 4 entries tall
+ *      created from the "top down" and destroyed from the "bottom up"
+ */
+
+    /* Create flush dependency between entries (child) 0->1->2->3 (parent) */
+    {
+        protect_entry(file_ptr, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 3, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[2].flush_dep_par_type[0] = entry_type;
+        expected[2].flush_dep_par_idx[0] = 3;
+        expected[2].flush_dep_npar = 1;
+        expected[3].is_protected = TRUE;
+        expected[3].is_pinned = TRUE;
+        expected[3].flush_dep_nchd = 1;
+        expected[3].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[1].flush_dep_par_type[0] = entry_type;
+        expected[1].flush_dep_par_idx[0] = 2;
+        expected[1].flush_dep_npar = 1;
+        expected[2].is_protected = TRUE;
+        expected[2].is_pinned = TRUE;
+        expected[2].flush_dep_nchd = 1;
+        expected[2].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 1;
+        expected[0].flush_dep_npar = 1;
+        expected[1].is_protected = TRUE;
+        expected[1].is_pinned = TRUE;
+        expected[1].flush_dep_nchd = 1;
+        expected[1].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries, from the "bottom up" */
+    {
+        destroy_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        1,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[0].flush_dep_npar = 0;
+        expected[1].is_protected = FALSE;
+        expected[1].is_pinned = FALSE;
+        expected[1].flush_dep_nchd = 0;
+        expected[1].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        2,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[1].flush_dep_npar = 0;
+        expected[2].is_protected = FALSE;
+        expected[2].is_pinned = FALSE;
+        expected[2].flush_dep_nchd = 0;
+        expected[2].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 3, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        3,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[2].flush_dep_npar = 0;
+        expected[3].is_protected = FALSE;
+        expected[3].is_pinned = FALSE;
+        expected[3].flush_dep_nchd = 0;
+        expected[3].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #4 - Multiple children for a single parent */
+
+    /* Create flush dependency between entries (child) 0,1,2,3->4 (parent) */
+    {
+        protect_entry(file_ptr, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        for(u = 0; u < 4; u++) {
+            create_flush_dependency(entry_type, 4, entry_type, (int32_t)u);
+            if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+            /* Change expected values, and verify the status of the entries
+             * after creating flush dependency
+             */
+            expected[u].flush_dep_par_type[0] = entry_type;
+            expected[u].flush_dep_par_idx[0] = 4;
+            expected[u].flush_dep_npar = 1;
+            expected[4].is_protected = TRUE;
+            expected[4].is_pinned = TRUE;
+            expected[4].flush_dep_nchd++;
+            expected[4].flush_dep_ndirty_chd++;
+
+            /* Verify the status */
+            verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                                (int)0,     /* int tag */
+                                (int)5,     /* int num_entries */
+                                expected);  /* struct expected_entry_staus[] */
+            if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        } /* end for */
+    }
+
+    /* Destroy flush dependency between entries */
+    {
+        for(u = 0; u < 4; u++) {
+            destroy_flush_dependency(entry_type, 4, entry_type, (int32_t)u);
+            if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+            /* Change expected values, and verify the status of the entries
+             * after destroying flush dependency
+             */
+            expected[u].flush_dep_npar = 0;
+            expected[4].flush_dep_nchd--;
+            expected[4].flush_dep_ndirty_chd--;
+
+            /* Check for destroying flush dependency on last entry */
+            if(3 == u) {
+                unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                                entry_type,         /* int32_t type */
+                                4,                  /* int32_t idx */
+                                H5C__NO_FLAGS_SET); /* unsigned int flags */
+                if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+                /* Change expected values, and verify the status of the entries
+                 * after destroying flush dependency
+                 */
+                expected[4].is_protected = FALSE;
+                expected[4].is_pinned = FALSE;
+            } /* end if */
+
+            /* Verify the status */
+            verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                                (int)0,     /* int tag */
+                                (int)5,     /* int num_entries */
+                                expected);  /* struct expected_entry_staus[] */
+            if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        } /* end for */
+    }
+
+/* Test Case #5a - Join two flush dependency chains together, creating a single
+ *      un-forked dependency chain
+ */
+
+    /* Create flush dependency between entries (child) 0->1 and 3->4 (parent)
+     *  then add entry 4 as a child of 0
+     */
+    {
+        protect_entry(file_ptr, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 1;
+        expected[0].flush_dep_npar = 1;
+        expected[1].is_protected = TRUE;
+        expected[1].is_pinned = TRUE;
+        expected[1].flush_dep_nchd = 1;
+        expected[1].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 4, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[3].flush_dep_par_type[0] = entry_type;
+        expected[3].flush_dep_par_idx[0] = 4;
+        expected[3].flush_dep_npar = 1;
+        expected[4].is_protected = TRUE;
+        expected[4].is_pinned = TRUE;
+        expected[4].flush_dep_nchd = 1;
+        expected[4].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 0, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[4].flush_dep_par_type[0] = entry_type;
+        expected[4].flush_dep_par_idx[0] = 0;
+        expected[4].flush_dep_npar = 1;
+        expected[0].is_protected = TRUE;
+        expected[0].is_pinned = TRUE;
+        expected[0].flush_dep_nchd = 1;
+        expected[0].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+    }
+
+    /* Destroy flush dependency between entries, detaching 3->4 from 0 first */
+    {
+        destroy_flush_dependency(entry_type, 0, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        0,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[4].flush_dep_npar = 0;
+        expected[0].is_protected = FALSE;
+        expected[0].is_pinned = FALSE;
+        expected[0].flush_dep_nchd = 0;
+        expected[0].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 4, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        4,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[3].flush_dep_npar = 0;
+        expected[4].is_protected = FALSE;
+        expected[4].is_pinned = FALSE;
+        expected[4].flush_dep_nchd = 0;
+        expected[4].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        1,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[0].flush_dep_npar = 0;
+        expected[1].is_protected = FALSE;
+        expected[1].is_pinned = FALSE;
+        expected[1].flush_dep_nchd = 0;
+        expected[1].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #5b - Join two flush dependency chains together, creating a
+ *      forked dependency chain
+ */
+
+    /* Create flush dependency between entries (child) 0->1->2 and 3->4 (parent)
+     *  then add entry 4 as a child of 1
+     */
+    {
+        protect_entry(file_ptr, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 1;
+        expected[0].flush_dep_npar = 1;
+        expected[1].is_protected = TRUE;
+        expected[1].is_pinned = TRUE;
+        expected[1].flush_dep_nchd = 1;
+        expected[1].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5F_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[1].flush_dep_par_type[0] = entry_type;
+        expected[1].flush_dep_par_idx[0] = 2;
+        expected[1].flush_dep_npar = 1;
+        expected[2].is_protected = TRUE;
+        expected[2].is_pinned = TRUE;
+        expected[2].flush_dep_nchd = 1;
+        expected[2].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 4, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[3].flush_dep_par_type[0] = entry_type;
+        expected[3].flush_dep_par_idx[0] = 4;
+        expected[3].flush_dep_npar = 1;
+        expected[4].is_protected = TRUE;
+        expected[4].is_pinned = TRUE;
+        expected[4].flush_dep_nchd = 1;
+        expected[4].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[4].flush_dep_par_type[0] = entry_type;
+        expected[4].flush_dep_par_idx[0] = 1;
+        expected[4].flush_dep_npar = 1;
+        expected[1].flush_dep_nchd = 2;
+        expected[1].flush_dep_ndirty_chd = 2;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+    }
+
+    /* Destroy flush dependency between entries, detaching 3->4 from 1 first */
+    {
+        destroy_flush_dependency(entry_type, 1, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[4].flush_dep_npar = 0;
+        expected[1].flush_dep_nchd = 1;
+        expected[1].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 4, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        4,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[3].flush_dep_npar = 0;
+        expected[4].is_protected = FALSE;
+        expected[4].is_pinned = FALSE;
+        expected[4].flush_dep_nchd = 0;
+        expected[4].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        2,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[1].flush_dep_npar = 0;
+        expected[2].is_protected = FALSE;
+        expected[2].is_pinned = FALSE;
+        expected[2].flush_dep_nchd = 0;
+        expected[2].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        1,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[0].flush_dep_npar = 0;
+        expected[1].is_protected = FALSE;
+        expected[1].is_pinned = FALSE;
+        expected[1].flush_dep_nchd = 0;
+        expected[1].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #5c - Join two flush dependency chains together, creating a
+ *      forked dependency chain
+ */
+
+    /* Create flush dependency between entries (child) 0->1->2 and 3->4 (parent)
+     *  then add entry 4 as a child of 2
+     */
+    {
+        protect_entry(file_ptr, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 1;
+        expected[0].flush_dep_npar = 1;
+        expected[1].is_protected = TRUE;
+        expected[1].is_pinned = TRUE;
+        expected[1].flush_dep_nchd = 1;
+        expected[1].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[1].flush_dep_par_type[0] = entry_type;
+        expected[1].flush_dep_par_idx[0] = 2;
+        expected[1].flush_dep_npar = 1;
+        expected[2].is_protected = TRUE;
+        expected[2].is_pinned = TRUE;
+        expected[2].flush_dep_nchd = 1;
+        expected[2].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 4, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[3].flush_dep_par_type[0] = entry_type;
+        expected[3].flush_dep_par_idx[0] = 4;
+        expected[3].flush_dep_npar = 1;
+        expected[4].is_protected = TRUE;
+        expected[4].is_pinned = TRUE;
+        expected[4].flush_dep_nchd = 1;
+        expected[4].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[4].flush_dep_par_type[0] = entry_type;
+        expected[4].flush_dep_par_idx[0] = 2;
+        expected[4].flush_dep_npar = 1;
+        expected[2].flush_dep_nchd = 2;
+        expected[2].flush_dep_ndirty_chd = 2;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+    }
+
+    /* Destroy flush dependency between entries, detaching 3->4 from 2 first */
+    {
+        destroy_flush_dependency(entry_type, 2, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[4].flush_dep_npar = 0;
+        expected[2].flush_dep_nchd = 1;
+        expected[2].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 4, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        4,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[3].flush_dep_npar = 0;
+        expected[4].is_protected = FALSE;
+        expected[4].is_pinned = FALSE;
+        expected[4].flush_dep_nchd = 0;
+        expected[4].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        2,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[1].flush_dep_npar = 0;
+        expected[2].is_protected = FALSE;
+        expected[2].is_pinned = FALSE;
+        expected[2].flush_dep_nchd = 0;
+        expected[2].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        1,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[0].flush_dep_npar = 0;
+        expected[1].is_protected = FALSE;
+        expected[1].is_pinned = FALSE;
+        expected[1].flush_dep_nchd = 0;
+        expected[1].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #6a - Make certain that flush dependency relationship with parent
+ *      already pinned works (unpin ater destroying flush dependency)
+ */
+
+    /* Create flush dependency between entries 0 (child) & 1 (parent) */
+    {
+        protect_entry(file_ptr, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        pin_entry(entry_type, 1);
+        if ( !pass ) CACHE_ERROR("pin_entry failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 1;
+        expected[0].flush_dep_npar = 1;
+        expected[1].is_protected = TRUE;
+        expected[1].is_pinned = TRUE;
+        expected[1].flush_dep_nchd = 1;
+        expected[1].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Unpin entry & destroy flush dependency between entries 0 (child) & 1 (parent) */
+    {
+        destroy_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unpin_entry(entry_type, 1);
+        if ( !pass ) CACHE_ERROR("unpin_entry failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        1,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].flush_dep_npar = 0;
+        expected[1].is_protected = FALSE;
+        expected[1].is_pinned = FALSE;
+        expected[1].flush_dep_nchd = 0;
+        expected[1].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #6b - Make certain that flush dependency relationship with parent
+ *      already pinned works (unpin before destroying flush dependency)
+ */
+
+    /* Create flush dependency between entries 0 (child) & 1 (parent) */
+    {
+        protect_entry(file_ptr, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        pin_entry(entry_type, 1);
+        if ( !pass ) CACHE_ERROR("pin_entry failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 1;
+        expected[0].flush_dep_npar = 1;
+        expected[1].is_protected = TRUE;
+        expected[1].is_pinned = TRUE;
+        expected[1].flush_dep_nchd = 1;
+        expected[1].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Unpin entry & destroy flush dependency between entries 0 (child) & 1 (parent) */
+    {
+        unpin_entry(entry_type, 1);
+        if ( !pass ) CACHE_ERROR("unpin_entry failed")
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        1,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].flush_dep_npar = 0;
+        expected[1].is_protected = FALSE;
+        expected[1].is_pinned = FALSE;
+        expected[1].flush_dep_nchd = 0;
+        expected[1].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #7 - Simple multiple parents
+ */
+
+    /* Create flush dependency between entries (child) 0 and 1, 2 (parents)
+     */
+    {
+        protect_entry(file_ptr, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 1;
+        expected[0].flush_dep_npar = 1;
+        expected[1].is_protected = TRUE;
+        expected[1].is_pinned = TRUE;
+        expected[1].flush_dep_nchd = 1;
+        expected[1].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[1] = entry_type;
+        expected[0].flush_dep_par_idx[1] = 2;
+        expected[0].flush_dep_npar = 2;
+        expected[2].is_protected = TRUE;
+        expected[2].is_pinned = TRUE;
+        expected[2].flush_dep_nchd = 1;
+        expected[2].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries */
+    {
+        destroy_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        1,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 2;
+        expected[0].flush_dep_npar = 1;
+        expected[1].is_protected = FALSE;
+        expected[1].is_pinned = FALSE;
+        expected[1].flush_dep_nchd = 0;
+        expected[1].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 2, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        2,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[0].flush_dep_npar = 0;
+        expected[2].is_protected = FALSE;
+        expected[2].is_pinned = FALSE;
+        expected[2].flush_dep_nchd = 0;
+        expected[2].flush_dep_ndirty_chd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+
+done:
+    if(file_ptr)
+        takedown_cache(file_ptr, FALSE, FALSE);
+
+    if ( pass )
+        PASSED()
+    else {
+        H5_FAILED();
+        HDfprintf(stdout, "%s.\n", failure_mssg);
+    } /* end else */
+
+    return (unsigned)!pass;
+} /* check_flush_deps() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	check_flush_deps_err()
+ *
+ * Purpose:	Check  the flush dependency routines for error conditions.
+ *
+ * Return:	0 on success, non-zero on failure
+ *
+ * Programmer:	Quincey Koziol
+ *               3/16/09
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+check_flush_deps_err(void)
+{
+    H5F_t * file_ptr = NULL;            /* File for this test */
+    int entry_type = PICO_ENTRY_TYPE;   /* Use very small entry size (size of entries doesn't matter) */
+    unsigned test_count;                /* Test iteration variable */
+
+    TESTING("flush dependency errors");
+
+    pass = TRUE;
+
+    /* Loop over test cases, check for various errors in configuring flush
+     *  dependencies.  Verify that all performs as expected.
+     */
+    for(test_count = 0; test_count < 7; test_count++) {
+        unsigned u;             /* Local index variable */
+        herr_t result;          /* Generic return value */
+
+        /* Allocate a cache */
+        reset_entries();
+        file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024));
+        if ( !pass ) CACHE_ERROR("setup_cache failed")
+
+        /* Insert entries to work with into the cache */
+        for(u = 0; u < 10; u++) {
+            insert_entry(file_ptr, entry_type, (int32_t)u, H5C__NO_FLAGS_SET);
+            if ( !pass ) CACHE_ERROR("insert_entry failed")
+        } /* end for */
+
+        /* Various test cases */
+        switch(test_count) {
+            /* Verify that parent entry in flush dependency must be protected */
+            case 0:
+                result = H5C_create_flush_dependency(&((entries[entry_type])[0]), &((entries[entry_type])[1]));
+                if( result != FAIL ) CACHE_ERROR("Creating flush dependency with unprotected entry succeeded")
+                break;
+
+            /* Verify that entry can't have flush dependency on itself */
+            case 1:
+                protect_entry(file_ptr, entry_type, 0);
+                if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+                result = H5C_create_flush_dependency(&((entries[entry_type])[0]), &((entries[entry_type])[0]));
+                if( result != FAIL ) CACHE_ERROR("Creating flush dependency with parent == child")
+
+                unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                                entry_type,         /* int32_t type */
+                                0,                  /* int32_t idx */
+                                H5C__NO_FLAGS_SET); /* unsigned int flags */
+                if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+                break;
+
+            /* Verify that parent entry must be protected */
+            case 2:
+                result = H5C_destroy_flush_dependency(&((entries[entry_type])[0]), &((entries[entry_type])[1]));
+                if( result != FAIL ) CACHE_ERROR("Destroying [non-existant] dependency when parent isn't protected")
+                break;
+
+            /* Verify that parent entry has flush dependency */
+            case 3:
+                protect_entry(file_ptr, entry_type, 0);
+                if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+                result = H5C_destroy_flush_dependency(&((entries[entry_type])[0]), &((entries[entry_type])[1]));
+                if( result != FAIL ) CACHE_ERROR("Destroying dependency when parent isn't in relationship")
+
+                unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                                entry_type,         /* int32_t type */
+                                0,                  /* int32_t idx */
+                                H5C__NO_FLAGS_SET); /* unsigned int flags */
+                if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+                break;
+
+            /* Verify that child entry is in flush dependency relationship */
+            case 4:
+                protect_entry(file_ptr, entry_type, 0);
+                if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+                create_flush_dependency(entry_type, 0, entry_type, 1);
+                if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+                result = H5C_destroy_flush_dependency(&((entries[entry_type])[0]), &((entries[entry_type])[2]));
+                if( result != FAIL ) CACHE_ERROR("Destroying dependency when child isn't in relationship")
+
+                destroy_flush_dependency(entry_type, 0, entry_type, 1);
+                if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+                unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                                entry_type,         /* int32_t type */
+                                0,                  /* int32_t idx */
+                                H5C__NO_FLAGS_SET); /* unsigned int flags */
+                if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+                break;
+
+            /* Verify that parent has child as direct descendant */
+            case 5:
+                protect_entry(file_ptr, entry_type, 0);
+                if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+                create_flush_dependency(entry_type, 0, entry_type, 1);
+                if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+                protect_entry(file_ptr, entry_type, 1);
+                if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+                create_flush_dependency(entry_type, 1, entry_type, 2);
+                if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+                protect_entry(file_ptr, entry_type, 3);
+                if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+                create_flush_dependency(entry_type, 3, entry_type, 4);
+                if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+                result = H5C_destroy_flush_dependency(&((entries[entry_type])[0]), &((entries[entry_type])[4]));
+                if( result != FAIL ) CACHE_ERROR("Destroying dependency when child is not a direct descendant has no children at child's height")
+
+                destroy_flush_dependency(entry_type, 0, entry_type, 1);
+                if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+                unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                                entry_type,         /* int32_t type */
+                                0,                  /* int32_t idx */
+                                H5C__NO_FLAGS_SET); /* unsigned int flags */
+                if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+                destroy_flush_dependency(entry_type, 1, entry_type, 2);
+                if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+                unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                                entry_type,         /* int32_t type */
+                                1,                  /* int32_t idx */
+                                H5C__NO_FLAGS_SET); /* unsigned int flags */
+                if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+                destroy_flush_dependency(entry_type, 3, entry_type, 4);
+                if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+                unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                                entry_type,         /* int32_t type */
+                                3,                  /* int32_t idx */
+                                H5C__NO_FLAGS_SET); /* unsigned int flags */
+                if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+                break;
+
+
+            /* Verify that child entry is child of parent */
+            case 6:
+                protect_entry(file_ptr, entry_type, 0);
+                if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+                create_flush_dependency(entry_type, 0, entry_type, 1);
+                if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+                protect_entry(file_ptr, entry_type, 2);
+                if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+                create_flush_dependency(entry_type, 2, entry_type, 3);
+                if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+                result = H5C_destroy_flush_dependency(&((entries[entry_type])[0]), &((entries[entry_type])[3]));
+                if( result != FAIL ) CACHE_ERROR("Destroying dependency when child isn't in relationship")
+
+                destroy_flush_dependency(entry_type, 0, entry_type, 1);
+                if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+                unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                                entry_type,         /* int32_t type */
+                                0,                  /* int32_t idx */
+                                H5C__NO_FLAGS_SET); /* unsigned int flags */
+                if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+                destroy_flush_dependency(entry_type, 2, entry_type, 3);
+                if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+                unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                                entry_type,         /* int32_t type */
+                                2,                  /* int32_t idx */
+                                H5C__NO_FLAGS_SET); /* unsigned int flags */
+                if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+                break;
+
+            default:
+                CACHE_ERROR("Unknown test case!")
+        } /* end switch */
+
+        takedown_cache(file_ptr, FALSE, FALSE);
+        if ( !pass ) CACHE_ERROR("takedown_cache failed")
+        file_ptr = NULL;
+    } /* end for */
+
+
+done:
+    if(file_ptr)
+        takedown_cache(file_ptr, FALSE, FALSE);
+
+    if ( pass )
+        PASSED()
+    else {
+        H5_FAILED();
+        HDfprintf(stdout, "%s.\n", failure_mssg);
+    } /* end else */
+
+    return (unsigned)!pass;
+} /* check_flush_deps_err() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	check_flush_deps_order()
+ *
+ * Purpose:	Verify that the order that entries with flush dependencies
+ *              is correct
+ *
+ * Return:	0 on success, non-zero on failure
+ *
+ * Programmer:	Quincey Koziol
+ *               3/17/09
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+check_flush_deps_order(void)
+{
+    H5F_t * file_ptr = NULL;            /* File for this test */
+    H5C_t * cache_ptr = NULL;           /* Metadata cache for this test */
+    int entry_type = PICO_ENTRY_TYPE;   /* Use very small entry size (size of entries doesn't matter) */
+    unsigned u;                         /* Local index variable */
+    struct expected_entry_status expected[5] =
+    {
+      /* entry			entry		in	at main                                                        flush dep flush dep child flush   flush       flush */
+      /* type:		index:	size:		cache:	addr:	dirty:	prot:	pinned:	dsrlzd:	srlzd:	dest:  par type[]: par idx[]: dep npart: dep nchd: dep ndirty chd: order: corked */
+      { PICO_ENTRY_TYPE, 0,	PICO_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { PICO_ENTRY_TYPE, 1,	PICO_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { PICO_ENTRY_TYPE, 2,	PICO_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { PICO_ENTRY_TYPE, 3,	PICO_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { PICO_ENTRY_TYPE, 4,	PICO_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE}
+    };
+    unsigned flush_order;       /* Index for tracking flush order */
+
+    TESTING("flush dependencies flush order");
+
+    pass = TRUE;
+
+    /* allocate a cache, build up flush dependency hierarchy and tear it down.
+     * Verify that all performs as expected.
+     */
+
+    reset_entries();
+    file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024));
+    cache_ptr = file_ptr->shared->cache;
+
+    if ( !pass ) CACHE_ERROR("setup_cache failed")
+
+    /* Insert entries to work with into the cache */
+    for(u = 0; u < 5; u++) {
+        insert_entry(file_ptr, entry_type, (int32_t)u, H5C__NO_FLAGS_SET);
+        if ( !pass ) CACHE_ERROR("insert_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after each insertion
+         */
+        expected[u].in_cache = TRUE;
+        expected[u].is_dirty = TRUE;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)u,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    } /* end for */
+
+/* Test Case #1a - Single flush dependency relationship, increasing addr order */
+
+    /* Create flush dependency between entries 0 (child) & 1 (parent) */
+    {
+        protect_entry(file_ptr, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 1;
+        expected[0].flush_dep_npar = 1;
+        expected[1].is_protected = TRUE;
+        expected[1].is_pinned = TRUE;
+        expected[1].flush_dep_nchd = 1;
+        expected[1].flush_dep_ndirty_chd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Flush the cache and verify that the entries were flushed in correct order */
+    {
+        herr_t result;                  /* Generic return value */
+
+        add_flush_op(entry_type, 0, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 1, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        1,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Reset index for tracking flush order */
+        flush_order = 0;
+
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__NO_FLAGS_SET);
+        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].is_dirty = FALSE;
+        expected[0].serialized = TRUE;
+        expected[0].flush_order = 0;
+        expected[1].is_dirty = FALSE;
+        expected[1].serialized = TRUE;
+        expected[1].flush_order = 1;
+        expected[1].is_protected = FALSE;
+        expected[1].flush_dep_ndirty_chd =0;
+        expected[2].is_dirty = FALSE;
+        expected[2].serialized = TRUE;
+        expected[3].is_dirty = FALSE;
+        expected[3].serialized = TRUE;
+        expected[4].is_dirty = FALSE;
+        expected[4].serialized = TRUE;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries 0 (child) & 1 (parent) */
+    {
+        destroy_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].flush_dep_npar = 0;
+        expected[1].is_pinned = FALSE;
+        expected[1].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #1b - Single flush dependency relationship, decreasing addr order */
+
+    /* Create flush dependency between entries 0 (child) & 1 (parent) */
+    {
+        protect_entry(file_ptr, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 0, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].is_protected = TRUE;
+        expected[0].is_pinned = TRUE;
+        expected[0].flush_dep_nchd = 1;
+        expected[1].flush_dep_par_type[0] = entry_type;
+        expected[1].flush_dep_par_idx[0] = 0;
+        expected[1].flush_dep_npar = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Flush the cache and verify that the entries were flushed in correct order */
+    {
+        herr_t result;                  /* Generic return value */
+
+        add_flush_op(entry_type, 0, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 1, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        0,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Mark entries 0 & 1 dirty, so they are flushed */
+        dirty_entry(file_ptr, entry_type, 0, TRUE);
+        dirty_entry(file_ptr, entry_type, 1, FALSE);
+        if ( !pass ) CACHE_ERROR("dirty_entry failed")
+
+        /* Reset 'serialized' flag & 'flush_order' value in expected array */
+        expected[0].serialized = FALSE;
+        expected[0].flush_order = -1;
+        expected[1].serialized = FALSE;
+        expected[1].flush_order = -1;
+
+        /* Reset index for tracking flush order */
+        flush_order = 0;
+
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__NO_FLAGS_SET);
+        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].is_dirty = FALSE;
+        expected[0].serialized = TRUE;
+        expected[0].flush_order = 1;
+        expected[0].is_protected = FALSE;
+        expected[1].is_dirty = FALSE;
+        expected[1].serialized = TRUE;
+        expected[1].flush_order = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries 0 (child) & 1 (parent) */
+    {
+        destroy_flush_dependency(entry_type, 0, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].is_pinned = FALSE;
+        expected[0].flush_dep_nchd = 0;
+        expected[1].flush_dep_npar = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #2a - Multiple children for one parent flush dependency relationship
+ *      increasing addr order
+ */
+
+    /* Create flush dependency between entries 0, 1 (children) & 2 (parent) */
+    {
+        protect_entry(file_ptr, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 2;
+        expected[0].flush_dep_npar = 1;
+        expected[1].flush_dep_par_type[0] = entry_type;
+        expected[1].flush_dep_par_idx[0] = 2;
+        expected[1].flush_dep_npar = 1;
+        expected[2].is_protected = TRUE;
+        expected[2].is_pinned = TRUE;
+        expected[2].flush_dep_nchd = 2;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Flush the cache and verify that the entries were flushed in correct order */
+    {
+        herr_t result;                  /* Generic return value */
+
+        add_flush_op(entry_type, 0, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 1, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 2, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        2,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Mark entries 0, 1 & 2 dirty, so they are flushed */
+        dirty_entry(file_ptr, entry_type, 0, FALSE);
+        dirty_entry(file_ptr, entry_type, 1, FALSE);
+        dirty_entry(file_ptr, entry_type, 2, TRUE);
+        if ( !pass ) CACHE_ERROR("dirty_entry failed")
+
+        /* Reset 'serialized' flag & 'flush_order' value in expected array */
+        expected[0].serialized = FALSE;
+        expected[0].flush_order = -1;
+        expected[1].serialized = FALSE;
+        expected[1].flush_order = -1;
+        expected[2].serialized = FALSE;
+        expected[2].flush_order = -1;
+
+        /* Reset index for tracking flush order */
+        flush_order = 0;
+
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__NO_FLAGS_SET);
+        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].is_dirty = FALSE;
+        expected[0].serialized = TRUE;
+        expected[0].flush_order = 0;
+        expected[1].is_dirty = FALSE;
+        expected[1].serialized = TRUE;
+        expected[1].flush_order = 1;
+        expected[2].is_dirty = FALSE;
+        expected[2].serialized = TRUE;
+        expected[2].flush_order = 2;
+        expected[2].is_protected = FALSE;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries 0, 1 (children) & 2 (parent) */
+    {
+        destroy_flush_dependency(entry_type, 2, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        destroy_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].flush_dep_npar = 0;
+        expected[1].flush_dep_npar = 0;
+        expected[2].is_pinned = FALSE;
+        expected[2].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #2b - Multiple children for one parent flush dependency relationship
+ *      decreasing addr order
+ */
+
+    /* Create flush dependency between entries 1, 2 (children) & 0 (parent) */
+    {
+        protect_entry(file_ptr, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 0, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        create_flush_dependency(entry_type, 0, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].is_protected = TRUE;
+        expected[0].is_pinned = TRUE;
+        expected[0].flush_dep_nchd = 2;
+        expected[1].flush_dep_par_type[0] = entry_type;
+        expected[1].flush_dep_par_idx[0] = 0;
+        expected[1].flush_dep_npar = 1;
+        expected[2].flush_dep_par_type[0] = entry_type;
+        expected[2].flush_dep_par_idx[0] = 0;
+        expected[2].flush_dep_npar = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Flush the cache and verify that the entries were flushed in correct order */
+    {
+        herr_t result;                  /* Generic return value */
+
+        add_flush_op(entry_type, 0, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 1, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 2, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        0,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Mark entries 0, 1 & 2 dirty, so they are flushed */
+        dirty_entry(file_ptr, entry_type, 0, TRUE);
+        dirty_entry(file_ptr, entry_type, 1, FALSE);
+        dirty_entry(file_ptr, entry_type, 2, FALSE);
+        if ( !pass ) CACHE_ERROR("dirty_entry failed")
+
+        /* Reset 'serialized' flag & 'flush_order' value in expected array */
+        expected[0].serialized = FALSE;
+        expected[0].flush_order = -1;
+        expected[1].serialized = FALSE;
+        expected[1].flush_order = -1;
+        expected[2].serialized = FALSE;
+        expected[2].flush_order = -1;
+
+        /* Reset index for tracking flush order */
+        flush_order = 0;
+
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__NO_FLAGS_SET);
+        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].is_dirty = FALSE;
+        expected[0].serialized = TRUE;
+        expected[0].flush_order = 2;
+        expected[0].is_protected = FALSE;
+        expected[1].is_dirty = FALSE;
+        expected[1].serialized = TRUE;
+        expected[1].flush_order = 0;
+        expected[2].is_dirty = FALSE;
+        expected[2].serialized = TRUE;
+        expected[2].flush_order = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries 1, 2 (children) & 0 (parent) */
+    {
+        destroy_flush_dependency(entry_type, 0, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        destroy_flush_dependency(entry_type, 0, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].is_pinned = FALSE;
+        expected[0].flush_dep_nchd = 0;
+        expected[1].flush_dep_npar = 0;
+        expected[2].flush_dep_npar = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #3a - Single chain of flush dependencies, 4 entries tall,
+ *      increasing addr order
+ */
+
+    /* Create flush dependency between entries (child) 0->1->2->3 (parent) */
+    {
+        protect_entry(file_ptr, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 1;
+        expected[0].flush_dep_npar = 1;
+        expected[1].is_protected = TRUE;
+        expected[1].is_pinned = TRUE;
+        expected[1].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[1].flush_dep_par_type[0] = entry_type;
+        expected[1].flush_dep_par_idx[0] = 2;
+        expected[1].flush_dep_npar = 1;
+        expected[2].is_protected = TRUE;
+        expected[2].is_pinned = TRUE;
+        expected[2].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 3, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[2].flush_dep_par_type[0] = entry_type;
+        expected[2].flush_dep_par_idx[0] = 3;
+        expected[2].flush_dep_npar = 1;
+        expected[3].is_protected = TRUE;
+        expected[3].is_pinned = TRUE;
+        expected[3].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Flush the cache and verify that the entries were flushed in correct order */
+    {
+        herr_t result;                  /* Generic return value */
+
+        add_flush_op(entry_type, 0, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 1, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 2, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 3, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        1,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        2,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        3,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Mark entries 0-3 dirty, so they are flushed */
+        dirty_entry(file_ptr, entry_type, 0, FALSE);
+        dirty_entry(file_ptr, entry_type, 1, TRUE);
+        dirty_entry(file_ptr, entry_type, 2, TRUE);
+        dirty_entry(file_ptr, entry_type, 3, TRUE);
+        if ( !pass ) CACHE_ERROR("dirty_entry failed")
+
+        /* Reset 'serialized' flag & 'flush_order' value in expected array */
+        expected[0].serialized = FALSE;
+        expected[0].flush_order = -1;
+        expected[1].serialized = FALSE;
+        expected[1].flush_order = -1;
+        expected[2].serialized = FALSE;
+        expected[2].flush_order = -1;
+        expected[3].serialized = FALSE;
+        expected[3].flush_order = -1;
+
+        /* Reset index for tracking flush order */
+        flush_order = 0;
+
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__NO_FLAGS_SET);
+        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].is_dirty = FALSE;
+        expected[0].serialized = TRUE;
+        expected[0].flush_order = 0;
+        expected[1].is_dirty = FALSE;
+        expected[1].serialized = TRUE;
+        expected[1].flush_order = 1;
+        expected[1].is_protected = FALSE;
+        expected[2].is_dirty = FALSE;
+        expected[2].serialized = TRUE;
+        expected[2].flush_order = 2;
+        expected[2].is_protected = FALSE;
+        expected[3].serialized = TRUE;
+        expected[3].flush_order = 3;
+        expected[3].is_protected = FALSE;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries, from the "top down" */
+    {
+        destroy_flush_dependency(entry_type, 3, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[2].flush_dep_npar = 0;
+        expected[3].is_pinned = FALSE;
+        expected[3].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[1].flush_dep_npar = 0;
+        expected[2].is_pinned = FALSE;
+        expected[2].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[0].flush_dep_npar = 0;
+        expected[1].is_pinned = FALSE;
+        expected[1].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #3b - Single chain of flush dependencies, 4 entries tall
+ *      decreasing addr order
+ */
+
+    /* Create flush dependency between entries (child) 0->1->2->3 (parent) */
+    {
+        protect_entry(file_ptr, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 0, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].is_protected = TRUE;
+        expected[0].is_pinned = TRUE;
+        expected[0].flush_dep_nchd = 1;
+        expected[1].flush_dep_par_type[0] = entry_type;
+        expected[1].flush_dep_par_idx[0] = 0;
+        expected[1].flush_dep_npar = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[1].is_protected = TRUE;
+        expected[1].is_pinned = TRUE;
+        expected[1].flush_dep_nchd = 1;
+        expected[2].flush_dep_par_type[0] = entry_type;
+        expected[2].flush_dep_par_idx[0] = 1;
+        expected[2].flush_dep_npar = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[2].is_protected = TRUE;
+        expected[2].is_pinned = TRUE;
+        expected[2].flush_dep_nchd = 1;
+        expected[3].flush_dep_par_type[0] = entry_type;
+        expected[3].flush_dep_par_idx[0] = 2;
+        expected[3].flush_dep_npar = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Flush the cache and verify that the entries were flushed in correct order */
+    {
+        herr_t result;                  /* Generic return value */
+
+        add_flush_op(entry_type, 0, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 1, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 2, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 3, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        0,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        1,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        2,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Mark entries 0-3 dirty, so they are flushed */
+        dirty_entry(file_ptr, entry_type, 0, TRUE);
+        dirty_entry(file_ptr, entry_type, 1, TRUE);
+        dirty_entry(file_ptr, entry_type, 2, TRUE);
+        dirty_entry(file_ptr, entry_type, 3, FALSE);
+        if ( !pass ) CACHE_ERROR("dirty_entry failed")
+
+        /* Reset 'serialized' flag & 'flush_order' value in expected array */
+        expected[0].serialized = FALSE;
+        expected[0].flush_order = -1;
+        expected[1].serialized = FALSE;
+        expected[1].flush_order = -1;
+        expected[2].serialized = FALSE;
+        expected[2].flush_order = -1;
+        expected[3].serialized = FALSE;
+        expected[3].flush_order = -1;
+
+        /* Reset index for tracking flush order */
+        flush_order = 0;
+
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__NO_FLAGS_SET);
+        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].is_dirty = FALSE;
+        expected[0].serialized = TRUE;
+        expected[0].flush_order = 3;
+        expected[0].is_protected = FALSE;
+        expected[1].is_dirty = FALSE;
+        expected[1].serialized = TRUE;
+        expected[1].flush_order = 2;
+        expected[1].is_protected = FALSE;
+        expected[2].is_dirty = FALSE;
+        expected[2].serialized = TRUE;
+        expected[2].flush_order = 1;
+        expected[2].is_protected = FALSE;
+        expected[3].is_dirty = FALSE;
+        expected[3].serialized = TRUE;
+        expected[3].flush_order = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries, from the "bottom up" */
+    {
+        destroy_flush_dependency(entry_type, 2, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[2].is_pinned = FALSE;
+        expected[2].flush_dep_nchd = 0;
+        expected[3].flush_dep_npar = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 1, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[1].is_pinned = FALSE;
+        expected[1].flush_dep_nchd = 0;
+        expected[2].flush_dep_npar = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 0, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[0].is_pinned = FALSE;
+        expected[0].flush_dep_nchd = 0;
+        expected[1].flush_dep_npar = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #4a - Multiple children for a single parent, increasing addr order  */
+
+    /* Create flush dependency between entries (child) 0,1,2,3->4 (parent) */
+    {
+        protect_entry(file_ptr, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        for(u = 0; u < 4; u++) {
+            create_flush_dependency(entry_type, 4, entry_type, (int32_t)u);
+            if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+            /* Change expected values, and verify the status of the entries
+             * after creating flush dependency
+             */
+            expected[u].flush_dep_par_type[0] = entry_type;
+            expected[u].flush_dep_par_idx[0] = 4;
+            expected[u].flush_dep_npar = 1;
+            expected[4].is_protected = TRUE;
+            expected[4].is_pinned = TRUE;
+            expected[4].flush_dep_nchd = u + 1;
+
+            /* Verify the status */
+            verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                                (int)0,     /* int tag */
+                                (int)5,     /* int num_entries */
+                                expected);  /* struct expected_entry_staus[] */
+            if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        } /* end for */
+    }
+
+    /* Flush the cache and verify that the entries were flushed in correct order */
+    {
+        herr_t result;                  /* Generic return value */
+
+        add_flush_op(entry_type, 0, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 1, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 2, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 3, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 4, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        4,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Mark entries 0-4 dirty, so they are flushed */
+        dirty_entry(file_ptr, entry_type, 0, FALSE);
+        dirty_entry(file_ptr, entry_type, 1, FALSE);
+        dirty_entry(file_ptr, entry_type, 2, FALSE);
+        dirty_entry(file_ptr, entry_type, 3, FALSE);
+        dirty_entry(file_ptr, entry_type, 4, TRUE);
+        if ( !pass ) CACHE_ERROR("dirty_entry failed")
+
+        /* Reset 'serialized' flag & 'flush_order' value in expected array */
+        expected[0].serialized = FALSE;
+        expected[0].flush_order = -1;
+        expected[1].serialized = FALSE;
+        expected[1].flush_order = -1;
+        expected[2].serialized = FALSE;
+        expected[2].flush_order = -1;
+        expected[3].serialized = FALSE;
+        expected[3].flush_order = -1;
+        expected[4].serialized = FALSE;
+        expected[4].flush_order = -1;
+
+        /* Reset index for tracking flush order */
+        flush_order = 0;
+
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__NO_FLAGS_SET);
+        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].is_dirty = FALSE;
+        expected[0].serialized = TRUE;
+        expected[0].flush_order = 0;
+        expected[1].is_dirty = FALSE;
+        expected[1].serialized = TRUE;
+        expected[1].flush_order = 1;
+        expected[2].is_dirty = FALSE;
+        expected[2].serialized = TRUE;
+        expected[2].flush_order = 2;
+        expected[3].is_dirty = FALSE;
+        expected[3].serialized = TRUE;
+        expected[3].flush_order = 3;
+        expected[4].is_dirty = FALSE;
+        expected[4].serialized = TRUE;
+        expected[4].flush_order = 4;
+        expected[4].is_protected = FALSE;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries */
+    {
+        for(u = 0; u < 4; u++) {
+            destroy_flush_dependency(entry_type, 4, entry_type, (int32_t)u);
+            if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+            /* Change expected values, and verify the status of the entries
+             * after destroying flush dependency
+             */
+            expected[u].flush_dep_npar = 0;
+            expected[4].flush_dep_nchd = 3 - u;
+
+            /* Check for destroying flush dependency on last entry */
+            if(3 == u) {
+                /* Change expected values, and verify the status of the entries
+                 * after destroying flush dependency
+                 */
+                expected[4].is_pinned = FALSE;
+            } /* end if */
+
+            /* Verify the status */
+            verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                                (int)0,     /* int tag */
+                                (int)5,     /* int num_entries */
+                                expected);  /* struct expected_entry_staus[] */
+            if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        } /* end for */
+    }
+
+/* Test Case #4b - Multiple children for a single parent, decreasing addr order  */
+
+    /* Create flush dependency between entries (child) 0,1,2,3->4 (parent) */
+    {
+        protect_entry(file_ptr, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        for(u = 1; u < 5; u++) {
+            create_flush_dependency(entry_type, 0, entry_type, (int32_t)u);
+            if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+            /* Change expected values, and verify the status of the entries
+             * after creating flush dependency
+             */
+            expected[u].flush_dep_par_type[0] = entry_type;
+            expected[u].flush_dep_par_idx[0] = 0;
+            expected[u].flush_dep_npar = 1;
+            expected[0].is_protected = TRUE;
+            expected[0].is_pinned = TRUE;
+            expected[0].flush_dep_nchd = u;
+
+            /* Verify the status */
+            verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                                (int)0,     /* int tag */
+                                (int)5,     /* int num_entries */
+                                expected);  /* struct expected_entry_staus[] */
+            if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        } /* end for */
+    }
+
+    /* Flush the cache and verify that the entries were flushed in correct order */
+    {
+        herr_t result;                  /* Generic return value */
+
+        add_flush_op(entry_type, 0, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 1, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 2, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 3, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 4, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        0,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Mark entries 0-4 dirty, so they are flushed */
+        dirty_entry(file_ptr, entry_type, 0, TRUE);
+        dirty_entry(file_ptr, entry_type, 1, FALSE);
+        dirty_entry(file_ptr, entry_type, 2, FALSE);
+        dirty_entry(file_ptr, entry_type, 3, FALSE);
+        dirty_entry(file_ptr, entry_type, 4, FALSE);
+        if ( !pass ) CACHE_ERROR("dirty_entry failed")
+
+        /* Reset 'serialized' flag & 'flush_order' value in expected array */
+        expected[0].serialized = FALSE;
+        expected[0].flush_order = -1;
+        expected[1].serialized = FALSE;
+        expected[1].flush_order = -1;
+        expected[2].serialized = FALSE;
+        expected[2].flush_order = -1;
+        expected[3].serialized = FALSE;
+        expected[3].flush_order = -1;
+        expected[4].serialized = FALSE;
+        expected[4].flush_order = -1;
+
+        /* Reset index for tracking flush order */
+        flush_order = 0;
+
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__NO_FLAGS_SET);
+        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].is_dirty = FALSE;
+        expected[0].serialized = TRUE;
+        expected[0].flush_order = 4;
+        expected[0].is_protected = FALSE;
+        expected[1].is_dirty = FALSE;
+        expected[1].serialized = TRUE;
+        expected[1].flush_order = 0;
+        expected[2].is_dirty = FALSE;
+        expected[2].serialized = TRUE;
+        expected[2].flush_order = 1;
+        expected[3].is_dirty = FALSE;
+        expected[3].serialized = TRUE;
+        expected[3].flush_order = 2;
+        expected[4].is_dirty = FALSE;
+        expected[4].serialized = TRUE;
+        expected[4].flush_order = 3;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries */
+    {
+        for(u = 1; u < 5; u++) {
+            destroy_flush_dependency(entry_type, 0, entry_type, (int32_t)u);
+            if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+            /* Change expected values, and verify the status of the entries
+             * after destroying flush dependency
+             */
+            expected[u].flush_dep_npar = 0;
+            expected[0].flush_dep_nchd = 4 - u;
+
+            /* Check for destroying flush dependency on last entry */
+            if(4 == u) {
+                /* Change expected values, and verify the status of the entries
+                 * after destroying flush dependency
+                 */
+                expected[0].is_pinned = FALSE;
+            } /* end if */
+
+            /* Verify the status */
+            verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                                (int)0,     /* int tag */
+                                (int)5,     /* int num_entries */
+                                expected);  /* struct expected_entry_staus[] */
+            if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+        } /* end for */
+    }
+
+/* Test Case #5a - Join two flush dependency chains together, creating a single
+ *      un-forked dependency chain
+ */
+
+    /* Create flush dependency between entries (child) 0->1 and 3->4 (parent)
+     *  then add entry 4 as a child of 0
+     */
+    {
+        protect_entry(file_ptr, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 1;
+        expected[0].flush_dep_npar = 1;
+        expected[1].is_protected = TRUE;
+        expected[1].is_pinned = TRUE;
+        expected[1].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 4, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[3].flush_dep_par_type[0] = entry_type;
+        expected[3].flush_dep_par_idx[0] = 4;
+        expected[3].flush_dep_npar = 1;
+        expected[4].is_protected = TRUE;
+        expected[4].is_pinned = TRUE;
+        expected[4].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 0, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[4].flush_dep_par_type[0] = entry_type;
+        expected[4].flush_dep_par_idx[0] = 0;
+        expected[4].flush_dep_npar = 1;
+        expected[0].is_protected = TRUE;
+        expected[0].is_pinned = TRUE;
+        expected[0].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+    }
+
+    /* Flush the cache and verify that the entries were flushed in correct order */
+    {
+        herr_t result;                  /* Generic return value */
+
+        add_flush_op(entry_type, 0, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 1, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+
+        add_flush_op(entry_type, 3, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 4, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        0,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        1,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        4,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Mark entries 0 & 1, 3 & 4 dirty, so they are flushed */
+        dirty_entry(file_ptr, entry_type, 0, TRUE);
+        dirty_entry(file_ptr, entry_type, 1, TRUE);
+        dirty_entry(file_ptr, entry_type, 3, FALSE);
+        dirty_entry(file_ptr, entry_type, 4, TRUE);
+        if ( !pass ) CACHE_ERROR("dirty_entry failed")
+
+        /* Reset 'serialized' flag & 'flush_order' value in expected array */
+        expected[0].serialized = FALSE;
+        expected[0].flush_order = -1;
+        expected[1].serialized = FALSE;
+        expected[1].flush_order = -1;
+        expected[2].serialized = FALSE;
+        expected[2].flush_order = -1;
+        expected[3].serialized = FALSE;
+        expected[3].flush_order = -1;
+        expected[4].serialized = FALSE;
+        expected[4].flush_order = -1;
+
+        /* Reset index for tracking flush order */
+        flush_order = 0;
+
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__NO_FLAGS_SET);
+        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].is_dirty = FALSE;
+        expected[0].serialized = TRUE;
+        expected[0].flush_order = 2;
+        expected[0].is_protected = FALSE;
+        expected[1].is_dirty = FALSE;
+        expected[1].serialized = TRUE;
+        expected[1].flush_order = 3;
+        expected[1].is_protected = FALSE;
+        expected[2].is_dirty = FALSE;
+        expected[2].serialized = TRUE;
+        expected[3].is_dirty = FALSE;
+        expected[3].serialized = TRUE;
+        expected[3].flush_order = 0;
+        expected[4].is_dirty = FALSE;
+        expected[4].serialized = TRUE;
+        expected[4].flush_order = 1;
+        expected[4].is_protected = FALSE;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries, detaching 3->4 from 0 first */
+    {
+        destroy_flush_dependency(entry_type, 0, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[4].flush_dep_npar = 0;
+        expected[0].is_pinned = FALSE;
+        expected[0].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 4, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[3].flush_dep_npar = 0;
+        expected[4].is_pinned = FALSE;
+        expected[4].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[0].flush_dep_npar = 0;
+        expected[1].is_pinned = FALSE;
+        expected[1].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #5b - Join two flush dependency chains together, creating a
+ *      forked dependency chain
+ */
+
+    /* Create flush dependency between entries (child) 0->1->2 and 3->4 (parent)
+     *  then add entry 4 as a child of 1
+     */
+    {
+        protect_entry(file_ptr, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 1;
+        expected[0].flush_dep_npar = 1;
+        expected[1].is_protected = TRUE;
+        expected[1].is_pinned = TRUE;
+        expected[1].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[1].flush_dep_par_type[0] = entry_type;
+        expected[1].flush_dep_par_idx[0] = 2;
+        expected[1].flush_dep_npar = 1;
+        expected[2].is_protected = TRUE;
+        expected[2].is_pinned = TRUE;
+        expected[2].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 4, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[3].flush_dep_par_type[0] = entry_type;
+        expected[3].flush_dep_par_idx[0] = 4;
+        expected[3].flush_dep_npar = 1;
+        expected[4].is_protected = TRUE;
+        expected[4].is_pinned = TRUE;
+        expected[4].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[4].flush_dep_par_type[0] = entry_type;
+        expected[4].flush_dep_par_idx[0] = 1;
+        expected[4].flush_dep_npar = 1;
+        expected[1].flush_dep_nchd = 2;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+    }
+
+    /* Flush the cache and verify that the entries were flushed in correct order */
+    {
+        herr_t result;                  /* Generic return value */
+
+        add_flush_op(entry_type, 0, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 1, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 2, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 3, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 4, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        1,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        2,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        4,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Mark entries 0-4 dirty, so they are flushed */
+        dirty_entry(file_ptr, entry_type, 0, FALSE);
+        dirty_entry(file_ptr, entry_type, 1, TRUE);
+        dirty_entry(file_ptr, entry_type, 2, TRUE);
+        dirty_entry(file_ptr, entry_type, 3, FALSE);
+        dirty_entry(file_ptr, entry_type, 4, TRUE);
+        if ( !pass ) CACHE_ERROR("dirty_entry failed")
+
+        /* Reset 'serialized' flag & 'flush_order' value in expected array */
+        expected[0].serialized = FALSE;
+        expected[0].flush_order = -1;
+        expected[1].serialized = FALSE;
+        expected[1].flush_order = -1;
+        expected[2].serialized = FALSE;
+        expected[2].flush_order = -1;
+        expected[3].serialized = FALSE;
+        expected[3].flush_order = -1;
+        expected[4].serialized = FALSE;
+        expected[4].flush_order = -1;
+
+        /* Reset index for tracking flush order */
+        flush_order = 0;
+
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__NO_FLAGS_SET);
+        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].is_dirty = FALSE;
+        expected[0].serialized = TRUE;
+        expected[0].flush_order = 0;
+        expected[0].is_protected = FALSE;
+        expected[1].is_dirty = FALSE;
+        expected[1].serialized = TRUE;
+        expected[1].flush_order = 3;
+        expected[1].is_protected = FALSE;
+        expected[2].is_dirty = FALSE;
+        expected[2].serialized = TRUE;
+        expected[2].flush_order = 4;
+        expected[2].is_protected = FALSE;
+        expected[3].is_dirty = FALSE;
+        expected[3].serialized = TRUE;
+        expected[3].flush_order = 1;
+        expected[4].is_dirty = FALSE;
+        expected[4].serialized = TRUE;
+        expected[4].flush_order = 2;
+        expected[4].is_protected = FALSE;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries, detaching 3->4 from 1 first */
+    {
+        destroy_flush_dependency(entry_type, 1, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[4].flush_dep_npar = 0;
+        expected[1].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 4, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[3].flush_dep_npar = 0;
+        expected[4].is_pinned = FALSE;
+        expected[4].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[1].flush_dep_npar = 0;
+        expected[2].is_pinned = FALSE;
+        expected[2].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[0].flush_dep_npar = 0;
+        expected[1].is_pinned = FALSE;
+        expected[1].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #5c - Join two flush dependency chains together, creating a
+ *      forked dependency chain
+ */
+
+    /* Create flush dependency between entries (child) 0->1->2 and 3->4 (parent)
+     *  then add entry 4 as a child of 2
+     */
+    {
+        protect_entry(file_ptr, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 1;
+        expected[0].flush_dep_npar = 1;
+        expected[1].is_protected = TRUE;
+        expected[1].is_pinned = TRUE;
+        expected[1].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[1].flush_dep_par_type[0] = entry_type;
+        expected[1].flush_dep_par_idx[0] = 2;
+        expected[1].flush_dep_npar = 1;
+        expected[2].is_protected = TRUE;
+        expected[2].is_pinned = TRUE;
+        expected[2].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 4, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[3].flush_dep_par_type[0] = entry_type;
+        expected[3].flush_dep_par_idx[0] = 4;
+        expected[3].flush_dep_npar = 1;
+        expected[4].is_protected = TRUE;
+        expected[4].is_pinned = TRUE;
+        expected[4].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[4].flush_dep_par_type[0] = entry_type;
+        expected[4].flush_dep_par_idx[0] = 2;
+        expected[4].flush_dep_npar = 1;
+        expected[2].flush_dep_nchd = 2;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+    }
+
+    /* Flush the cache and verify that the entries were flushed in correct order */
+    {
+        herr_t result;                  /* Generic return value */
+
+        add_flush_op(entry_type, 0, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 1, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 2, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 3, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 4, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        1,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        2,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        4,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Mark entries 0-4 dirty, so they are flushed */
+        dirty_entry(file_ptr, entry_type, 0, FALSE);
+        dirty_entry(file_ptr, entry_type, 1, TRUE);
+        dirty_entry(file_ptr, entry_type, 2, TRUE);
+        dirty_entry(file_ptr, entry_type, 3, FALSE);
+        dirty_entry(file_ptr, entry_type, 4, TRUE);
+        if ( !pass ) CACHE_ERROR("dirty_entry failed")
+
+        /* Reset 'serialized' flag & 'flush_order' value in expected array */
+        expected[0].serialized = FALSE;
+        expected[0].flush_order = -1;
+        expected[1].serialized = FALSE;
+        expected[1].flush_order = -1;
+        expected[2].serialized = FALSE;
+        expected[2].flush_order = -1;
+        expected[3].serialized = FALSE;
+        expected[3].flush_order = -1;
+        expected[4].serialized = FALSE;
+        expected[4].flush_order = -1;
+
+        /* Reset index for tracking flush order */
+        flush_order = 0;
+
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__NO_FLAGS_SET);
+        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].is_dirty = FALSE;
+        expected[0].serialized = TRUE;
+        expected[0].flush_order = 0;
+        expected[0].is_protected = FALSE;
+        expected[1].is_dirty = FALSE;
+        expected[1].serialized = TRUE;
+        expected[1].flush_order = 1;
+        expected[1].is_protected = FALSE;
+        expected[2].is_dirty = FALSE;
+        expected[2].serialized = TRUE;
+        expected[2].flush_order = 4;
+        expected[2].is_protected = FALSE;
+        expected[3].is_dirty = FALSE;
+        expected[3].serialized = TRUE;
+        expected[3].flush_order = 2;
+        expected[4].is_dirty = FALSE;
+        expected[4].serialized = TRUE;
+        expected[4].flush_order = 3;
+        expected[4].is_protected = FALSE;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries, detaching 3->4 from 2 first */
+    {
+        destroy_flush_dependency(entry_type, 2, entry_type, 4);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[4].flush_dep_npar = 0;
+        expected[2].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 4, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[3].flush_dep_npar = 0;
+        expected[4].is_pinned = FALSE;
+        expected[4].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[1].flush_dep_npar = 0;
+        expected[2].is_pinned = FALSE;
+        expected[2].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[0].flush_dep_npar = 0;
+        expected[1].is_pinned = FALSE;
+        expected[1].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #6a - Interlocked multiple parents, increasing addr order
+ */
+
+    /* Create flush dependencies between entries 0-3, with each entry a child
+     * of every entry with a higher number.
+     */
+    {
+        protect_entry(file_ptr, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[0] = entry_type;
+        expected[0].flush_dep_par_idx[0] = 1;
+        expected[0].flush_dep_npar = 1;
+        expected[1].is_protected = TRUE;
+        expected[1].is_pinned = TRUE;
+        expected[1].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[1] = entry_type;
+        expected[0].flush_dep_par_idx[1] = 2;
+        expected[0].flush_dep_npar = 2;
+        expected[2].is_protected = TRUE;
+        expected[2].is_pinned = TRUE;
+        expected[2].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[1].flush_dep_par_type[0] = entry_type;
+        expected[1].flush_dep_par_idx[0] = 2;
+        expected[1].flush_dep_npar = 1;
+        expected[2].flush_dep_nchd = 2;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 3, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[0].flush_dep_par_type[2] = entry_type;
+        expected[0].flush_dep_par_idx[2] = 3;
+        expected[0].flush_dep_npar = 3;
+        expected[3].is_protected = TRUE;
+        expected[3].is_pinned = TRUE;
+        expected[3].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        create_flush_dependency(entry_type, 3, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[1].flush_dep_par_type[1] = entry_type;
+        expected[1].flush_dep_par_idx[1] = 3;
+        expected[1].flush_dep_npar = 2;
+        expected[3].flush_dep_nchd = 2;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        create_flush_dependency(entry_type, 3, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[2].flush_dep_par_type[0] = entry_type;
+        expected[2].flush_dep_par_idx[0] = 3;
+        expected[2].flush_dep_npar = 1;
+        expected[3].flush_dep_nchd = 3;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+    }
+
+    /* Flush the cache and verify that the entries were flushed in correct order */
+    {
+        herr_t result;                  /* Generic return value */
+
+        add_flush_op(entry_type, 0, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 1, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 2, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 3, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        1,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        2,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        3,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Mark entries 0-3 dirty, so they are flushed */
+        dirty_entry(file_ptr, entry_type, 0, FALSE);
+        dirty_entry(file_ptr, entry_type, 1, TRUE);
+        dirty_entry(file_ptr, entry_type, 2, TRUE);
+        dirty_entry(file_ptr, entry_type, 3, FALSE);
+        if ( !pass ) CACHE_ERROR("dirty_entry failed")
+
+        /* Reset 'flushed' flag & 'flush_order' value in expected array */
+        expected[0].serialized = FALSE;
+        expected[0].flush_order = -1;
+        expected[1].serialized = FALSE;
+        expected[1].flush_order = -1;
+        expected[2].serialized = FALSE;
+        expected[2].flush_order = -1;
+        expected[3].serialized = FALSE;
+        expected[3].flush_order = -1;
+
+        /* Reset index for tracking flush order */
+        flush_order = 0;
+
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__NO_FLAGS_SET);
+        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].is_dirty = FALSE;
+        expected[0].serialized = TRUE;
+        expected[0].flush_order = 0;
+        expected[0].is_protected = FALSE;
+        expected[1].is_dirty = FALSE;
+        expected[1].serialized = TRUE;
+        expected[1].flush_order = 1;
+        expected[1].is_protected = FALSE;
+        expected[2].is_dirty = FALSE;
+        expected[2].serialized = TRUE;
+        expected[2].flush_order = 2;
+        expected[2].is_protected = FALSE;
+        expected[3].is_dirty = FALSE;
+        expected[3].serialized = TRUE;
+        expected[3].flush_order = 3;
+        expected[3].is_protected = FALSE;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries, in reverse order */
+    {
+        destroy_flush_dependency(entry_type, 3, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[2].flush_dep_npar = 0;
+        expected[3].flush_dep_nchd = 2;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 3, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[1].flush_dep_npar = 1;
+        expected[3].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 3, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[0].flush_dep_npar = 2;
+        expected[3].is_pinned = FALSE;
+        expected[3].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 2, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[1].flush_dep_npar = 0;
+        expected[2].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 2, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[0].flush_dep_npar = 1;
+        expected[2].is_pinned = FALSE;
+        expected[2].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 1, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[0].flush_dep_npar = 0;
+        expected[1].is_pinned = FALSE;
+        expected[1].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+/* Test Case #6b - Interlocked multiple parents, decreasing addr order
+ */
+
+    /* Create flush dependencies between entries 0-3, with each entry a parent
+     * of every entry with a higher number.
+     */
+    {
+        protect_entry(file_ptr, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 2, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[3].flush_dep_par_type[0] = entry_type;
+        expected[3].flush_dep_par_idx[0] = 2;
+        expected[3].flush_dep_npar = 1;
+        expected[2].is_protected = TRUE;
+        expected[2].is_pinned = TRUE;
+        expected[2].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[3].flush_dep_par_type[1] = entry_type;
+        expected[3].flush_dep_par_idx[1] = 1;
+        expected[3].flush_dep_npar = 2;
+        expected[1].is_protected = TRUE;
+        expected[1].is_pinned = TRUE;
+        expected[1].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        create_flush_dependency(entry_type, 1, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[2].flush_dep_par_type[0] = entry_type;
+        expected[2].flush_dep_par_idx[0] = 1;
+        expected[2].flush_dep_npar = 1;
+        expected[1].flush_dep_nchd = 2;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        protect_entry(file_ptr, entry_type, 0);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        create_flush_dependency(entry_type, 0, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[3].flush_dep_par_type[2] = entry_type;
+        expected[3].flush_dep_par_idx[2] = 0;
+        expected[3].flush_dep_npar = 3;
+        expected[0].is_protected = TRUE;
+        expected[0].is_pinned = TRUE;
+        expected[0].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        create_flush_dependency(entry_type, 0, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[2].flush_dep_par_type[1] = entry_type;
+        expected[2].flush_dep_par_idx[1] = 0;
+        expected[2].flush_dep_npar = 2;
+        expected[0].flush_dep_nchd = 2;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        create_flush_dependency(entry_type, 0, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("create_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after creating flush dependency
+         */
+        expected[1].flush_dep_par_type[0] = entry_type;
+        expected[1].flush_dep_par_idx[0] = 0;
+        expected[1].flush_dep_npar = 1;
+        expected[0].flush_dep_nchd = 3;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+    }
+
+    /* Flush the cache and verify that the entries were flushed in correct order */
+    {
+        herr_t result;                  /* Generic return value */
+
+        add_flush_op(entry_type, 0, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 1, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 2, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+        add_flush_op(entry_type, 3, FLUSH_OP__ORDER,
+                     entry_type, 0, FALSE, (size_t)0, &flush_order);
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        0,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        1,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                        entry_type,         /* int32_t type */
+                        2,                  /* int32_t idx */
+                        H5C__NO_FLAGS_SET); /* unsigned int flags */
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Mark entries 0-3 dirty, so they are flushed */
+        dirty_entry(file_ptr, entry_type, 0, FALSE);
+        dirty_entry(file_ptr, entry_type, 1, TRUE);
+        dirty_entry(file_ptr, entry_type, 2, TRUE);
+        dirty_entry(file_ptr, entry_type, 3, FALSE);
+        if ( !pass ) CACHE_ERROR("dirty_entry failed")
+
+        /* Reset 'flushed' flag & 'flush_order' value in expected array */
+        expected[0].serialized = FALSE;
+        expected[0].flush_order = -1;
+        expected[1].serialized = FALSE;
+        expected[1].flush_order = -1;
+        expected[2].serialized = FALSE;
+        expected[2].flush_order = -1;
+        expected[3].serialized = FALSE;
+        expected[3].flush_order = -1;
+
+        /* Reset index for tracking flush order */
+        flush_order = 0;
+
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__NO_FLAGS_SET);
+        if( result < 0 ) CACHE_ERROR("flushing entries with flush dependendices")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroy flush dependency
+         */
+        expected[0].is_dirty = FALSE;
+        expected[0].serialized = TRUE;
+        expected[0].flush_order = 3;
+        expected[0].is_protected = FALSE;
+        expected[1].is_dirty = FALSE;
+        expected[1].serialized = TRUE;
+        expected[1].flush_order = 2;
+        expected[1].is_protected = FALSE;
+        expected[2].is_dirty = FALSE;
+        expected[2].serialized = TRUE;
+        expected[2].flush_order = 1;
+        expected[2].is_protected = FALSE;
+        expected[3].is_dirty = FALSE;
+        expected[3].serialized = TRUE;
+        expected[3].flush_order = 0;
+        expected[3].is_protected = FALSE;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+    /* Destroy flush dependency between entries, in reverse order */
+    {
+        destroy_flush_dependency(entry_type, 0, entry_type, 1);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[1].flush_dep_npar = 0;
+        expected[0].flush_dep_nchd = 2;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 0, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[2].flush_dep_npar = 1;
+        expected[0].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 0, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[3].flush_dep_npar = 2;
+        expected[0].is_pinned = FALSE;
+        expected[0].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 1, entry_type, 2);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[2].flush_dep_npar = 0;
+        expected[1].flush_dep_nchd = 1;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 1, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[3].flush_dep_npar = 1;
+        expected[1].is_pinned = FALSE;
+        expected[1].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        destroy_flush_dependency(entry_type, 2, entry_type, 3);
+        if ( !pass ) CACHE_ERROR("destroy_flush_dependency failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after destroying flush dependency
+         */
+        expected[3].flush_dep_npar = 0;
+        expected[2].is_pinned = FALSE;
+        expected[2].flush_dep_nchd = 0;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)0,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+    }
+
+
+done:
+    if(file_ptr)
+        takedown_cache(file_ptr, FALSE, FALSE);
+
+    if ( pass )
+        PASSED()
+    else {
+        H5_FAILED();
+        HDfprintf(stdout, "%s.\n", failure_mssg);
+    } /* end else */
+
+    return (unsigned)!pass;
+} /* check_flush_deps_order() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	check_notify_cb()
+ *
+ * Purpose:	Exercise the client 'notify' callback.
+ *
+ * Return:	0 on success, non-zero on failure
+ *
+ * Programmer:	Quincey Koziol
+ *               4/28/09
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+check_notify_cb(void)
+{
+    H5F_t * file_ptr = NULL;            /* File for this test */
+    H5C_t * cache_ptr = NULL;           /* Metadata cache for this test */
+    test_entry_t *base_addr;            /* Base address of entries for test */
+    test_entry_t * entry_ptr;           /* Cache entry to examine/manipulate */
+    int entry_type = NOTIFY_ENTRY_TYPE;   /* Use entry w/notify callback (size of entries doesn't matter) */
+    unsigned u;                         /* Local index variable */
+    struct expected_entry_status expected[5] =
+    {
+      /* entry			entry		   in	 at main                                               flush dep flush dep child flush   flush       flush */
+      /* type:		index:	size:		   cache: addr:	dirty:	prot:	pinned:	dsrlzd:	srlzd:	dest:  par type[]: par idx[]: dep npart: dep nchd: dep ndirty chd: order: corked: */
+      { NOTIFY_ENTRY_TYPE, 0,	NOTIFY_ENTRY_SIZE, FALSE, TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { NOTIFY_ENTRY_TYPE, 1,	NOTIFY_ENTRY_SIZE, FALSE, TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { NOTIFY_ENTRY_TYPE, 2,	NOTIFY_ENTRY_SIZE, FALSE, TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { NOTIFY_ENTRY_TYPE, 3,	NOTIFY_ENTRY_SIZE, FALSE, TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { NOTIFY_ENTRY_TYPE, 4,	NOTIFY_ENTRY_SIZE, FALSE, TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE}
+    };
+
+    TESTING("'notify' callback");
+
+    pass = TRUE;
+
+    /* Allocate a cache, insert & remove entries, triggering 'notify' callback.
+     * Verify that all performs as expected.
+     */
+
+    reset_entries();
+    file_ptr = setup_cache((size_t)(2 * 1024), (size_t)(1 * 1024));
+    if ( !file_ptr ) CACHE_ERROR("setup_cache returned NULL")
+    cache_ptr = file_ptr->shared->cache;
+    base_addr = entries[entry_type];
+
+    if ( !pass ) CACHE_ERROR("setup_cache failed")
+
+    /* Insert entries to work with into the cache */
+    for(u = 0; u < 5; u++) {
+        insert_entry(file_ptr, entry_type, (int32_t)u, H5C__NO_FLAGS_SET);
+        if ( !pass ) CACHE_ERROR("insert_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after each insertion
+         */
+        expected[u].in_cache = TRUE;
+        expected[u].is_dirty = TRUE;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)u,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        /* Check the entry's 'after insert' count */
+	entry_ptr = &(base_addr[u]);
+        if(1 != entry_ptr->notify_after_insert_count)
+            CACHE_ERROR("invalid notify after insert count")
+        if(0 != entry_ptr->notify_before_evict_count)
+            CACHE_ERROR("invalid notify before evict count")
+    } /* end for */
+
+    /* Remove entries from the cache */
+    for(u = 0; u < 5; u++) {
+        expunge_entry(file_ptr, entry_type, (int32_t)u);
+        if ( !pass ) CACHE_ERROR("expunge_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after each expunge
+         */
+        expected[u].in_cache = FALSE;
+        expected[u].is_dirty = TRUE;
+        expected[u].serialized = FALSE;
+        expected[u].destroyed = TRUE;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)u,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        /* Check the entry's 'before evict' count */
+	entry_ptr = &(base_addr[u]);
+        if(1 != entry_ptr->notify_after_insert_count)
+            CACHE_ERROR("invalid notify after insert count")
+        if(1 != entry_ptr->notify_before_evict_count)
+            CACHE_ERROR("invalid notify before evict count")
+    } /* end for */
+
+    /* Protect entries to bring them into the cache */
+    for(u = 0; u < 5; u++) {
+        protect_entry(file_ptr, entry_type, (int32_t)u);
+        if ( !pass ) CACHE_ERROR("protect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after each insertion
+         */
+        expected[u].in_cache = TRUE;
+        expected[u].is_dirty = FALSE;
+        expected[u].is_protected = TRUE;
+        expected[u].deserialized = TRUE;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)u,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        /* Check the entry's 'after insert' count */
+	entry_ptr = &(base_addr[u]);
+        if(2 != entry_ptr->notify_after_insert_count)
+            CACHE_ERROR("invalid notify after insert count")
+        if(1 != entry_ptr->notify_before_evict_count)
+            CACHE_ERROR("invalid notify before evict count")
+    } /* end for */
+
+    /* Unprotect entries, evicting them from the cache */
+    for(u = 0; u < 5; u++) {
+        unprotect_entry(file_ptr, entry_type, (int32_t)u, H5C__DIRTIED_FLAG);
+        if ( !pass ) CACHE_ERROR("unprotect_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after each insertion
+         */
+        expected[u].in_cache = TRUE;
+        expected[u].is_dirty = TRUE;
+        expected[u].is_protected = FALSE;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)u,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        /* Check the entry's 'after insert' count */
+	entry_ptr = &(base_addr[u]);
+        if(2 != entry_ptr->notify_after_insert_count)
+            CACHE_ERROR("invalid notify after insert count")
+        if(1 != entry_ptr->notify_before_evict_count)
+            CACHE_ERROR("invalid notify before evict count")
+    } /* end for */
+
+    /* Remove entries from the cache */
+    for(u = 0; u < 5; u++) {
+        expunge_entry(file_ptr, entry_type, (int32_t)u);
+        if ( !pass ) CACHE_ERROR("expunge_entry failed")
+
+        /* Change expected values, and verify the status of the entries
+         * after each expunge
+         */
+        expected[u].in_cache = FALSE;
+        expected[u].is_dirty = TRUE;
+        expected[u].serialized = FALSE;
+        expected[u].destroyed = TRUE;
+
+        /* Verify the status */
+        verify_entry_status(cache_ptr,  /* H5C_t * cache_ptr */
+                            (int)u,     /* int tag */
+                            (int)5,     /* int num_entries */
+                            expected);  /* struct expected_entry_staus[] */
+        if ( !pass ) CACHE_ERROR("verify_entry_status failed")
+
+        /* Check the entry's 'before evict' count */
+	entry_ptr = &(base_addr[u]);
+        if(2 != entry_ptr->notify_after_insert_count)
+            CACHE_ERROR("invalid notify after insert count")
+        if(2 != entry_ptr->notify_before_evict_count)
+            CACHE_ERROR("invalid notify before evict count")
+    } /* end for */
+
+done:
+    takedown_cache(file_ptr, FALSE, FALSE);
+
+    if ( pass )
+        PASSED()
+    else {
+        H5_FAILED();
+        HDfprintf(stdout, "%s.\n", failure_mssg);
+    } /* end else */
+
+    return (unsigned)!pass;
+} /* check_notify_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	check_metadata_cork
+ *
+ * Purpose:	To verify that dirty corked entries are not evicted from the cache
+ *		but clean corked entries can be evicted from the cache.
+ *		The min_clean_size does not have effect.
+ *		NOTE: This is a modification of check_metadata_blizzard_absence().
+ *
+ * Return:	void
+ *
+ * Programmer:	Vailin Choi
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+check_metadata_cork(hbool_t fill_via_insertion)
+{
+    const char * fcn_name = "check_metadata_cork";
+    int entry_type = HUGE_ENTRY_TYPE;
+    size_t entry_size = HUGE_ENTRY_SIZE; /* 16 KB */
+    H5F_t * file_ptr = NULL;
+    H5C_t * cache_ptr = NULL;
+    hbool_t show_progress = FALSE;
+    int32_t checkpoint = 0;
+    int32_t entry_idx = 0;
+    int32_t i;
+
+    /* Expected deserialized status of entries depends on how they get into
+     * the cache. Insertions = not deserialized, protect/unprotect = deserialized.
+     */
+    hbool_t deserialized = (hbool_t)!(fill_via_insertion);
+
+    /* Set up the expected array. This is used to maintain a table of the
+     * expected status of every entry used in this test.
+     */
+    struct expected_entry_status expected[150] =
+    {
+      /* entry			entry		in	at main                                                flush dep flush dep child flush   flush       flush */
+      /* type:		index:	size:		cache:	addr:	dirty:	prot:	pinned:	dsrlzd:	srlzd:	dest:  par type[]: par idx[]: dep npart: dep nchd: dep ndirty chd: order: corked: */
+      { HUGE_ENTRY_TYPE, 0,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 1,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 2,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 3,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 4,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 5,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 6,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 7,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 8,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 9,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 10,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 11,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 12,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 13,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 14,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 15,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 16,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 17,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 18,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 19,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 20,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 21,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 22,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 23,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 24,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 25,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 26,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 27,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 28,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 29,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 30,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 31,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 32,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 33,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 34,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 35,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 36,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 37,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 38,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 39,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 40,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 41,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 42,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 43,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 44,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 45,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 46,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 47,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 48,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 49,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 50,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 51,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 52,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 53,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 54,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 55,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 56,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 57,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 58,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 59,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 60,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 61,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 62,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 63,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 64,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 65,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 66,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 67,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 68,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 69,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 70,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 71,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 72,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 73,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 74,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 75,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 76,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 77,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 78,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 79,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 80,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 81,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 82,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 83,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 84,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 85,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 86,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 87,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 88,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 89,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 90,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 91,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 92,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 93,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 94,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 95,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 96,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 97,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 98,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 99,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 100,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 101,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 102,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 103,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 104,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 105,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 106,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 107,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 108,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 109,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 110,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 111,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 112,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 113,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 114,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 115,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 116,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 117,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 118,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 119,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 120,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 121,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 122,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 123,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 124,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 125,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 126,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 127,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 128,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 129,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 130,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 131,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 132,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 133,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 134,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 135,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 136,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 137,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 138,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 139,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 140,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 141,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 142,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 143,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 144,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 145,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 146,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 147,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 148,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE},
+      { HUGE_ENTRY_TYPE, 149,	HUGE_ENTRY_SIZE, FALSE,	TRUE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE,	FALSE, {0,0,0,0,0,0,0,0},       {0,0,0,0,0,0,0,0},      0, 0, 0,          -1, FALSE}
+    } ;
+
+    pass = TRUE;
+
+    reset_entries();
+
+    if (fill_via_insertion) {
+
+        TESTING("to ensure cork/uncork metadata when inserting");
+
+    } else {
+
+        TESTING("to ensure cork/uncork metadata on protect/unprotect");
+    }
+
+    if ( show_progress) /* 0 */
+         HDfprintf(stdout, "\n%s: check point %d -- pass %d\n",
+                   fcn_name, checkpoint++, pass);
+
+    if ( pass ) {
+
+        /* Set up the cache.
+         *
+         * The max_cache_size should have room for 50 entries.
+         * The min_clean_size is half of that, or 25 entries.
+         */
+        file_ptr = setup_cache((size_t)(50 * entry_size), /* max_cache_size */
+                                (size_t)(25 * entry_size)); /* min_clean_size */
+
+        if ( file_ptr == NULL) {
+
+            pass = FALSE;
+            failure_mssg = "bad return from cache intialization.\n";
+
+        }
+        else
+            cache_ptr = file_ptr->shared->cache;
+    }
+
+    /* Cork the cache entry type */
+    cork_entry_type(file_ptr, entry_type);
+
+    if ( show_progress) /* 1 */
+         HDfprintf(stdout, "%s: check point %d -- pass %d\n",
+                   fcn_name, checkpoint++, pass);
+
+    /* ========================================================================
+     * ========================================================================
+     *  Phase 1:
+     *
+     *    Inserting dirty corked entries into an empty cache, until the cache
+     *    violates the min_clean_size requirement. 
+     *	  Since entries are all dirty and corked, no entry will get flushed or
+     *	  evicted.
+     *
+     * ========================================================================
+     * ========================================================================
+     */
+
+    if ( pass ) {
+
+        /* Insert 26 entries (indexes 0 through 25) into the cache.  */
+        for (entry_idx = 0; entry_idx < 26; entry_idx++) {
+
+            if (fill_via_insertion) {
+                insert_entry(file_ptr,           /* H5F_t * file_ptr */
+                             entry_type,          /* int32_t type */
+                             entry_idx,            /* int32_t idx */
+                             H5C__NO_FLAGS_SET);  /* unsigned int flags */
+
+            } else {
+                protect_entry(file_ptr,   /* H5F_t * file_ptr */
+                              entry_type,  /* int32_t type */
+                              entry_idx);   /* int32-t idx */
+
+                unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                                entry_type,         /* int32_t type */
+                                entry_idx,           /* int32_t idx */
+                                H5C__DIRTIED_FLAG); /* unsigned int flags */
+            }
+
+            /* Change expected values, and verify the status of the entries
+             * after each insertion
+             */
+            expected[entry_idx].in_cache = TRUE;
+            expected[entry_idx].is_dirty = TRUE;
+            expected[entry_idx].deserialized = (unsigned char)deserialized;
+            expected[entry_idx].is_corked = TRUE;
+
+            verify_entry_status(cache_ptr, /* H5C_t * cache_ptr */
+                                entry_idx, /* int tag */
+                                150,       /* int num_entries */
+                                expected); /* struct expected_entry_staus[] */
+        }
+    }
+
+    if ( show_progress) /* 2 */
+         HDfprintf(stdout, "%s: check point %d -- pass %d\n",
+                   fcn_name, checkpoint++, pass);
+
+    /* ========================================================================
+     * ========================================================================
+     *  Phase 2:
+     *
+     *    Inserting entries into a cache that violates the min_clean_size,
+     *    until the cache is full. 
+     *	  Since entries are all dirty and corked, no entry during this phase 
+     *	  will get flushed or evicted.
+     *
+     * ========================================================================
+     * ========================================================================
+     */
+
+    if ( pass ) {
+
+        /* Insert the 27th entry (index = 26) into the cache.  */
+        if (fill_via_insertion) {
+            insert_entry(file_ptr,           /* H5F_t * file_ptr */
+                         entry_type,          /* int32_t type */
+                         entry_idx++,          /* int32_t idx */
+                         H5C__NO_FLAGS_SET);  /* unsigned int flags */
+        } else {
+            protect_entry(file_ptr,   /* H5F_t * file_ptr */
+                          entry_type,  /* int32_t type */
+                          entry_idx);   /* int32-t idx */
+
+            unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                            entry_type,         /* int32_t type */
+                            entry_idx++,           /* int32_t idx */
+                            H5C__DIRTIED_FLAG); /* unsigned int flags */
+        }
+
+        /* Verify the status of the entries.
+         *
+         * Expected status is that there are 27 entries in the cache, and
+         * all entries remain the same as before since they are all corked
+	 * and dirty
+         */
+
+        /* entry w/ index 26 is now in the cache and dirty. */
+	expected[26].in_cache = TRUE;
+	expected[26].is_dirty = TRUE;
+	expected[26].deserialized = (unsigned char)deserialized;
+	expected[26].is_corked = TRUE;
+
+        /* verify the status */
+        verify_entry_status(cache_ptr, /* H5C_t * cache_ptr */
+                            26,        /* int tag */
+                            150,       /* int num_entries */
+                            expected); /* expected */
+    }
+
+
+    if ( show_progress) /* 3 */
+         HDfprintf(stdout, "%s: check point %d -- pass %d\n",
+                   fcn_name, checkpoint++, pass);
+
+    if ( pass ) {
+
+        /* Insert the 28th entry (index = 27) into the cache.  */
+        if (fill_via_insertion) {
+            insert_entry(file_ptr,           /* H5F_t * file_ptr */
+                         entry_type,          /* int32_t type */
+                         entry_idx++,          /* int32_t idx */
+                         H5C__NO_FLAGS_SET);  /* unsigned int flags */
+        } else {
+            protect_entry(file_ptr,   /* H5F_t * file_ptr */
+                          entry_type,  /* int32_t type */
+                          entry_idx);   /* int32-t idx */
+
+            unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                            entry_type,         /* int32_t type */
+                            entry_idx++,        /* int32_t idx */
+                            H5C__DIRTIED_FLAG); /* unsigned int flags */
+        }
+
+        /* Verify the status of the entries.
+         *
+         * Expected status is that there are 28 entries in the cache, and
+         * all entries are dirty corked entries.
+         *
+         */
+	expected[27].in_cache = TRUE;
+	expected[27].is_dirty = TRUE;
+	expected[27].deserialized = (unsigned char)deserialized;
+	expected[27].is_corked = TRUE;
+
+        /* verify the status */
+        verify_entry_status(cache_ptr, /* H5C_t * cache_ptr */
+                            27,        /* int tag */
+                            150,       /* int num_entries */
+                            expected); /* expected */
+    }
+
+
+    if ( show_progress) /* 4 */
+         HDfprintf(stdout, "%s: check point %d -- pass %d\n",
+                   fcn_name, checkpoint++, pass);
+
+    if ( pass ) {
+
+        /* Fill out the rest of the cache with entries */
+        /* Verify expected status of entries after each insertion */
+        for (entry_idx = entry_idx; entry_idx < 50; entry_idx++) {
+
+            if (fill_via_insertion) {
+                insert_entry(file_ptr,           /* H5F_t * file_ptr */
+                             entry_type,          /* int32_t type */
+                             entry_idx,            /* int32_t idx */
+                             H5C__NO_FLAGS_SET);  /* unsigned int flags */
+            } else {
+                protect_entry(file_ptr,   /* H5F_t * file_ptr */
+                              entry_type,  /* int32_t type */
+                              entry_idx);   /* int32-t idx */
+
+                unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                                entry_type,         /* int32_t type */
+                                entry_idx,           /* int32_t idx */
+                                H5C__DIRTIED_FLAG); /* unsigned int flags */
+            }
+
+            /* 
+	     * Expected status: all entries are dirty corked entries.
+             */
+	    expected[entry_idx].in_cache = TRUE;
+    	    expected[entry_idx].is_dirty = TRUE;
+	    expected[entry_idx].deserialized = (unsigned char)deserialized;
+            expected[entry_idx].is_corked = TRUE;
+
+            /* Verify the status */
+            verify_entry_status(cache_ptr, /* H5C_t * cache_ptr */
+                                entry_idx, /* int tag */
+                                150,       /* int num_entries */
+                                expected); /* expected */
+        }
+
+        /* Verify that the cache is now full */
+        if ( cache_ptr->cache_full != TRUE ) {
+
+            pass = FALSE;
+            failure_mssg = "cache not completely filled.\n";
+        }
+    }
+
+    if ( show_progress) /* 5 */
+         HDfprintf(stdout, "%s: check point %d -- pass %d\n",
+                   fcn_name, checkpoint++, pass);
+
+    /* ========================================================================
+     * ========================================================================
+     *  Phase 3:
+     *    Inserting entries into a cache that is completely full. 
+     *	  No entry is flushed or evicted because all entries are dirty & corked.
+     *
+     * ========================================================================
+     * ========================================================================
+     */
+
+    if ( show_progress) /* 6 */
+         HDfprintf(stdout, "%s: check point %d -- pass %d\n",
+                   fcn_name, checkpoint++, pass);
+
+    if ( pass ) {
+
+        /* Insert 50 more entries (indices 50-99) into the cache.  */
+        for (entry_idx = entry_idx; entry_idx < 100; entry_idx++) {
+
+            if (fill_via_insertion) {
+                insert_entry(file_ptr,           /* H5F_t * file_ptr */
+                             entry_type,          /* int32_t type */
+                             entry_idx,          /* int32_t idx */
+                             H5C__NO_FLAGS_SET);  /* unsigned int flags */
+            } else {
+                protect_entry(file_ptr,   /* H5F_t * file_ptr */
+                              entry_type,  /* int32_t type */
+                              entry_idx);   /* int32-t idx */
+
+                unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                                entry_type,         /* int32_t type */
+                                entry_idx,        /* int32_t idx */
+                                H5C__DIRTIED_FLAG); /* unsigned int flags */
+            }
+
+            /* This past inserted entry is now in the cache: dirty and corked */
+	    expected[entry_idx].in_cache = TRUE;
+    	    expected[entry_idx].is_dirty = TRUE;
+	    expected[entry_idx].deserialized = (unsigned char)deserialized;
+	    expected[entry_idx].is_corked = TRUE;
+
+            /* Verify this expected status */
+            verify_entry_status(cache_ptr, /* H5C_t * cache_ptr */
+                                entry_idx, /* int tag */
+                                150,       /* int num_entries */
+                                expected); /* expected */
+        }
+    }
+
+    if ( show_progress) /* 7 */
+         HDfprintf(stdout, "%s: check point %d -- pass %d\n",
+                   fcn_name, checkpoint++, pass);
+
+
+    /* ========================================================================
+     * ========================================================================
+     *  Phase 4:
+     *
+     *    Flushing the entire cache, and then inserting entries into a cache
+     *    that is completely full, but all clean.
+     *
+     * ========================================================================
+     * ========================================================================
+     */
+
+    if ( pass ) {
+
+        /* Flush the cache.
+         *
+         * We're doing this so we can repeat the above insertions, but
+         * starting from a cache filled with clean entries as opposed
+         * to an empty cache.
+         */
+
+        flush_cache(file_ptr, /* H5F_t * file_ptr */
+                    FALSE,     /* hbool_t destory_entries */
+                    FALSE,     /* hbool_t dump_stats */
+                    FALSE);    /* hbool_t dump_detailed_stats */
+
+        /* Verify that the cache is clean */
+        verify_clean();
+
+        /* Verify the status of the entries.  */
+	/* All entries are flushed, clean but still corked */
+        for (i = 0; i < 100; i++) {
+            expected[i].serialized = TRUE;
+            expected[i].is_dirty = FALSE;
+            expected[i].is_corked = TRUE;
+        }
+        verify_entry_status(cache_ptr, /* H5C_t * cache_ptr */
+                            0,         /* int tag */
+                            150,       /* int num_entries */
+                            expected); /* expected */
+    }
+
+    if ( show_progress) /* 8 */
+         HDfprintf(stdout, "%s: check point %d -- pass %d\n",
+                   fcn_name, checkpoint++, pass);
+
+
+    if ( pass ) {
+
+	/* Will evict 50 clean "corked" entries all at once when inserting the 100th entry */
+	for(i = 0; i < 51; i++) {
+	    expected[i].in_cache  = FALSE;
+	    expected[i].destroyed = TRUE;
+	    expected[i].is_corked = TRUE;
+	}
+
+	/* Insert the 100th entry */
+	if (fill_via_insertion) {
+                insert_entry(file_ptr,          /* H5F_t * file_ptr */
+                             entry_type,        /* int32_t type */
+                             100,            	/* int32_t idx */
+                             H5C__NO_FLAGS_SET);  /* unsigned int flags */
+
+	} else {
+                protect_entry(file_ptr,   /* H5F_t * file_ptr */
+                              entry_type,  /* int32_t type */
+                              100);   /* int32-t idx */
+
+                unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                                entry_type,         /* int32_t type */
+                                100,           /* int32_t idx */
+                                H5C__DIRTIED_FLAG); /* unsigned int flags */
+	}
+
+	/* The 100th inserted entry is now in the cache and dirty */
+	expected[100].in_cache = TRUE;
+	expected[100].is_dirty = TRUE;
+	expected[100].deserialized = (unsigned char)deserialized;
+	expected[100].is_corked = TRUE;
+
+	/* verify the status */
+	verify_entry_status(cache_ptr, /* H5C_t * cache_ptr */
+                                100,   /* int tag */
+                                150,       /* int num_entries */
+                                expected); /* struct expected_entry_staus[] */
+
+    }
+
+    if ( show_progress) /* 9 */
+         HDfprintf(stdout, "%s: check point %d -- pass %d\n",
+                   fcn_name, checkpoint++, pass);
+
+    if ( pass ) {
+
+        /* Insert 25 more corked entries (indexes 101 through 125) into the cache. */
+	/* Clean entry will be evicted one a time */
+        for (entry_idx = 101; entry_idx < 126; entry_idx++) {
+
+            if (fill_via_insertion) {
+                insert_entry(file_ptr,           /* H5F_t * file_ptr */
+                             entry_type,          /* int32_t type */
+                             entry_idx,            	/* int32_t idx */
+                             H5C__NO_FLAGS_SET);  /* unsigned int flags */
+
+            } else {
+                protect_entry(file_ptr,   /* H5F_t * file_ptr */
+                              entry_type,  /* int32_t type */
+                              entry_idx);   /* int32-t idx */
+
+                unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                                entry_type,         /* int32_t type */
+                                entry_idx,           /* int32_t idx */
+                                H5C__DIRTIED_FLAG); /* unsigned int flags */
+            }
+
+            /* The inserted entry is now in the cache and dirty */
+	    expected[entry_idx].in_cache = TRUE;
+    	    expected[entry_idx].is_dirty = TRUE;
+	    expected[entry_idx].deserialized = (unsigned char)deserialized;
+    	    expected[entry_idx].is_corked = TRUE;
+
+	    expected[entry_idx - 50].in_cache  = FALSE;
+	    expected[entry_idx - 50].destroyed = TRUE;
+	    expected[entry_idx - 50].is_corked = TRUE;
+
+            /* verify the status */
+            verify_entry_status(cache_ptr, /* H5C_t * cache_ptr */
+                                entry_idx, /* int tag */
+                                150,       /* int num_entries */
+                                expected); /* struct expected_entry_staus[] */
+	} /* end for */
+
+    }
+
+
+    if ( show_progress) /* 10 */
+         HDfprintf(stdout, "%s: check point %d -- pass %d\n",
+                   fcn_name, checkpoint++, pass);
+
+
+    if ( pass ) {
+
+        /* Insert the 127th entry (index = 126) into the cache. */
+        if (fill_via_insertion) {
+            insert_entry(file_ptr,           	/* H5F_t * file_ptr */
+                         entry_type,          	/* int32_t type */
+                         126,          		/* int32_t idx */
+                         H5C__NO_FLAGS_SET);  	/* unsigned int flags */
+        } else {
+            protect_entry(file_ptr,   	/* H5F_t * file_ptr */
+                          entry_type,  	/* int32_t type */
+                          126);   	/* int32-t idx */
+
+            unprotect_entry(file_ptr,          	/* H5F_t * file_ptr */
+                            entry_type,         /* int32_t type */
+                            126,           	/* int32_t idx */
+                            H5C__DIRTIED_FLAG); /* unsigned int flags */
+        }
+
+        /* Verify the status of the entries.  */
+	expected[126].in_cache = TRUE;
+	expected[126].is_dirty = TRUE;
+	expected[126].deserialized = (unsigned char)deserialized;
+	expected[126].is_corked = TRUE;
+
+	expected[126 - 50].in_cache  = FALSE;
+	expected[126 - 50].destroyed = TRUE;
+	expected[126 - 50].is_corked = TRUE;
+
+        /* verify the status */
+        verify_entry_status(cache_ptr, /* H5C_t * cache_ptr */
+                            126,        /* int tag */
+                            150,       /* int num_entries */
+                            expected); /* expected */
+    }
+
+
+    if ( show_progress) /* 11 */
+         HDfprintf(stdout, "%s: check point %d -- pass %d\n",
+                   fcn_name, checkpoint++, pass);
+
+
+    if ( pass ) {
+
+        /* Insert entries w/ indices 127 through 149 into the cache */
+        for (entry_idx = 127; entry_idx < 150; entry_idx++) {
+
+            if (fill_via_insertion) {
+                insert_entry(file_ptr,           /* H5F_t * file_ptr */
+                             entry_type,          /* int32_t type */
+                             entry_idx,            /* int32_t idx */
+                             H5C__NO_FLAGS_SET);  /* unsigned int flags */
+
+            } else {
+                protect_entry(file_ptr,   /* H5F_t * file_ptr */
+                              entry_type,  /* int32_t type */
+                              entry_idx);   /* int32-t idx */
+
+                unprotect_entry(file_ptr,          /* H5F_t * file_ptr */
+                                entry_type,         /* int32_t type */
+                                entry_idx,           /* int32_t idx */
+                                H5C__DIRTIED_FLAG); /* unsigned int flags */
+            }
+
+            /* This past inserted entry is now in the cache, dirty and corked */
+	    expected[entry_idx].in_cache = TRUE;
+    	    expected[entry_idx].is_dirty = TRUE;
+	    expected[entry_idx].deserialized = (unsigned char)deserialized;
+    	    expected[entry_idx].is_corked = TRUE;
+
+	    /* Entry that is 50 entries away will be evicted since it is clean even though corked */
+	    expected[entry_idx - 50].in_cache  = FALSE;
+	    expected[entry_idx - 50].destroyed = TRUE;
+	    expected[entry_idx - 50].is_corked = TRUE;
+
+            /* verify the status */
+            verify_entry_status(cache_ptr, /* H5C_t * cache_ptr */
+                                entry_idx, /* int tag */
+                                150,       /* int num_entries */
+                                expected); /* struct expected_entry_staus[] */
+        }
+
+    }
+
+    if ( show_progress) /* 12 */
+         HDfprintf(stdout, "%s: check point %d -- pass %d\n",
+                   fcn_name, checkpoint++, pass);
+
+
+    /* We're done with testing. We can take down the cache. */
+    takedown_cache(file_ptr, FALSE, FALSE);
+    reset_entries();
+
+    if ( show_progress) /* 13 */
+         HDfprintf(stdout, "%s: check point %d -- pass %d\n",
+                   fcn_name, checkpoint++, pass);
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    return (unsigned)!pass;
+
+} /* check_metadata_cork() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	check_entry_deletions_during_scans()
+ *
+ * Purpose:	With the addition of the H5C__TAKE_OWNERSHIP_FLAG, it is 
+ *		possible for an entry to be removed from the cache as a 
+ *		side effect of flushing an entry.  
+ *
+ *		For the most part, this doesn't cause problems.  However, 
+ *		during the scans of lists, it is possible that the entry 
+ *		removed will be the next entry in the scan -- which if not 
+ *		detected, will typeically cause the cache to attempt to flush
+ *		an entry that is no longer in the cache, and which may have
+ *		been deleted.
+ *
+ *		This function contans tests for correct handling on this 
+ *		situation.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:	void
+ *
+ * Programmer:	John Mainzer
+ *              4/3/15
+ *
+ * Modifications:
+ *
+ *		None.
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+check_entry_deletions_during_scans(void)
+{
+    H5F_t *      file_ptr = NULL;
+
+    TESTING("entry deletion during list scan detection and adaption");
+
+    pass = TRUE;
+
+    /* allocate a cache, and flush it under various circumstances.
+     * To the extent possible, verify that the desired actions took
+     * place.
+     */
+
+    if ( pass ) {
+
+        reset_entries();
+
+        file_ptr = setup_cache((size_t)(2 * 1024 * 1024),
+                                (size_t)(1 * 1024 * 1024));
+    }
+
+    /* run the tests.  This set of tests is somewhat eclectic, as 
+     * we are trying to test all locations where the deletion of 
+     * an entry from the cache as a side effect of the fluch of 
+     * a different entry could cause problems.
+     */
+
+    if ( pass ) {
+
+        cedds__expunge_dirty_entry_in_flush_test(file_ptr);
+    }
+
+    if ( pass ) {
+
+        cedds__H5C_make_space_in_cache(file_ptr);
+    }
+
+    if ( pass ) {
+
+        cedds__H5C__autoadjust__ageout__evict_aged_out_entries(file_ptr);
+    }
+
+    if ( pass ) {
+
+        cedds__H5C_flush_invalidate_cache__bucket_scan(file_ptr);
+    }
+
+
+
+    takedown_cache(file_ptr, FALSE, FALSE);
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass ) {
+
+        HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+    }
+
+    return (unsigned)!pass;
+
+} /* check_entry_deletions_during_scans() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	cedds__expunge_dirty_entry_in_flush_test()
+ *
+ * Purpose:	Verify that H5C_flush_cache() can handle the removal of 
+ *		a dirty entry from the cache during its scan of the 
+ *		skip list.
+ *
+ *		Do this by setting up a full cache, with the last entry 
+ *		on the LRU being both dirty and having a flush operation 
+ *		that deletes the second to last entry on the LRU.  Then 
+ *		flush the cache, triggering the flush of the last
+ *		item, and thereby the deletion of the second to last item.
+ *
+ *		H5C_flush_cache() should handle this deletion gracefully.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:	void
+ *
+ * Programmer:	John Mainzer
+ *              4/4/15
+ *
+ * Modifications:
+ *
+ *		None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+cedds__expunge_dirty_entry_in_flush_test(H5F_t * file_ptr)
+{
+    H5C_t *        cache_ptr = file_ptr->shared->cache;
+    int		   i;
+    herr_t	   result;
+    struct expected_entry_status expected[36] =
+    {
+      /* the expected array is used to maintain a table of the expected status of every
+       * entry used in this test.  Note that since the function that processes this
+       * array only processes as much of it as it is told to, we don't have to
+       * worry about maintaining the status of entries that we haven't used yet.
+       */
+      /* entry			entry				in	at main                                               	flush dep flush dep child flush   flush       flush */
+      /* type:			index:	size:			cache:	addr:	dirty:	prot:	pinned:	dsrlzd:	srlzd:	dest: 	par type[]: par idx[]: dep npart: dep nchd: dep ndirty chd: order: corked: */
+      { HUGE_ENTRY_TYPE, 	0,	HUGE_ENTRY_SIZE, 	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,  {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { HUGE_ENTRY_TYPE, 	1,	HUGE_ENTRY_SIZE, 	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,  {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { HUGE_ENTRY_TYPE, 	2,	HUGE_ENTRY_SIZE, 	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,  {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { HUGE_ENTRY_TYPE, 	3,	HUGE_ENTRY_SIZE, 	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,  {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE}
+    };
+
+    if ( pass ) {
+
+         if ( cache_ptr == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "cache_ptr NULL on entry to cedds expunge dirty entry in flush test.";
+        }
+        else if ( ( cache_ptr->index_len != 0 ) ||
+                  ( cache_ptr->index_size != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "cache not empty on entry to cedds expunge dirty entry in flush test.";
+        }
+        else if ( ( cache_ptr->max_cache_size != (2 * 1024 * 1024 ) ) ||
+                  ( cache_ptr->min_clean_size != (1 * 1024 * 1024 ) ) ) {
+
+	    pass = FALSE;
+	    failure_mssg =
+	        "unexpected cache config at start of cedds expunge dirty entry in flush test.";
+
+        } else {
+
+            /* set min clean size to zero for this test as it simplifies
+	     * computing the expected cache size after each operation.
+	     */
+
+            cache_ptr->min_clean_size = 0;
+        }
+    }
+
+    if ( pass ) {
+
+	/* The basic idea of this test is to setup the cache such 
+ 	 * that:
+ 	 * 
+	 * 1) the cache contains several dirty entries.
+	 * 
+	 * 2) the first entry on the slist is dirty, and has a flush
+	 *    operation that will remove the second entry on the 
+         *    slist.
+         *
+         * Then load flush the cache.  Cache should handle the 
+	 * removal of the next entry in the slist scan gracefully.
+         */
+
+	/* reset the stats before we start.  If stats are enabled, we will
+	 * check to see if they are as expected at the end.
+	 */
+	H5C_stats__reset(cache_ptr);
+
+
+	/* Load four huge entries into the cache.  Recall that huge entries
+         * are one fourth the size of monster entries (16 KB vs. 64 KB).
+         */
+	for ( i = 0; i < 4; i++ ) {
+
+	    protect_entry(file_ptr, HUGE_ENTRY_TYPE, i);
+	    unprotect_entry(file_ptr, HUGE_ENTRY_TYPE, i, H5C__DIRTIED_FLAG);
+        }
+
+	if ( ( cache_ptr->index_len != 4 ) ||
+             ( cache_ptr->index_size != (4 * HUGE_ENTRY_SIZE) ) ) {
+
+            pass = FALSE;
+
+	    failure_mssg = "unexpected size/len in cedds expunge dirty entry in flush test (1)";
+	}
+    }
+
+    if ( pass ) {
+
+	/* Next, set up the flush operation:
+	 *
+	 *     (HET, 0) expunges (HET, 1)
+	 *
+	 */
+        add_flush_op(HUGE_ENTRY_TYPE, 0, FLUSH_OP__EXPUNGE,
+                     HUGE_ENTRY_TYPE, 1, FALSE, (size_t)0, NULL);
+
+    }
+
+    if ( pass ) {
+
+	/* to summarize, at present the following entries
+	 * are in cache with the following characteristics:
+	 *
+	 * 		in
+	 * entry:	cache?	size:	dirty?	pinned?	pins:	flush operations:
+	 *
+	 * (HET, 0) 	Y	16 KB	Y	N	-	expunge (HET 1)
+	 *
+	 * (HET, 1)	Y	16 KB	Y	N	-	-
+         *
+	 * (HET, 2)	Y	16 KB	Y	N	-	-
+         *
+	 * (HET, 3)	Y	16 KB	Y	N	-	-
+	 *
+	 * Recall that in this test bed, flush operations are excuted the
+	 * first time the associated entry is flushed, and are then
+	 * deleted.
+	 */
+
+	/* verify the expected status of all entries we have loaded to date: */
+	verify_entry_status(cache_ptr, 0, 4, expected);
+    }
+
+    /* flush the cache to run the test.  In the process, clean up after test. */
+
+    if ( pass ) {
+
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__FLUSH_INVALIDATE_FLAG);
+
+        if ( result < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "Cache flush invalidate failed in cedds expunge dirty entry in flush test";
+        }
+        else if ( ( cache_ptr->index_len != 0 ) ||
+                  ( cache_ptr->index_size != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected cache len/size after cedds expunge dirty entry in flush test";
+
+        }
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    /* If we are collecting stats, check to see if we get the expected
+     * values.
+     */
+    if ( pass ) {
+
+	if ( ( cache_ptr->insertions[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_insertions[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->clears[HUGE_ENTRY_TYPE] != 1 ) ||
+             ( cache_ptr->flushes[HUGE_ENTRY_TYPE] != 3 ) ||
+             ( cache_ptr->evictions[HUGE_ENTRY_TYPE] != 4 ) ||
+             ( cache_ptr->take_ownerships[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->moves[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->entry_flush_moves[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->cache_flush_moves[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pins[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->unpins[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->dirty_pins[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_flushes[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_clears[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->size_increases[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->size_decreases[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->entry_flush_size_changes[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->cache_flush_size_changes[HUGE_ENTRY_TYPE] != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected huge size entry stats in cedds__expunge_dirty_entry_in_flush_test().";
+        }
+    }
+
+    if ( pass ) {
+
+	if ( ( cache_ptr->slist_scan_restarts != 1 ) ||
+             ( cache_ptr->LRU_scan_restarts != 0 ) ||
+             ( cache_ptr->hash_bucket_scan_restarts != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "unexpected scan restart stats in cedds__expunge_dirty_entry_in_flush_test().";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( pass ) {
+
+	reset_entries();
+    }
+
+    if ( pass ) {
+
+	/* reset cache min clean size to its expected value */
+        cache_ptr->min_clean_size = (1 * 1024 * 1024);
+    }
+
+    return;
+
+} /* cedds__expunge_dirty_entry_in_flush_test() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	cedds__H5C_make_space_in_cache()
+ *
+ * Purpose:	Verify that H5C_make_space_in_cache() can handle the 
+ *		removal from the cache of the next item in its reverse scan
+ *		of the LRU list.  
+ *
+ *		Do this by setting up a full cache, with the last entry 
+ *		on the LRU being both dirty and having a flush operation 
+ *		that deleted the second to last entry on the LRU.  Then 
+ *		load an additional entry, triggering the flush of the last
+ *		item, and thereby the deletion of the second to last item.
+ *
+ *		H5C_make_space_in_cache() should detect this deletion, and 
+ *		restart its scan of the LRU from the tail, instead of 
+ *		examining the now deleted next item up on the LRU.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:	void
+ *
+ * Programmer:	John Mainzer
+ *              4/4/15
+ *
+ * Modifications:
+ *
+ *		None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+cedds__H5C_make_space_in_cache(H5F_t * file_ptr)
+{
+    H5C_t *        cache_ptr = file_ptr->shared->cache;
+    int		   i;
+    const int	   num_huge_entries = 4;
+    const int	   num_monster_entries = 32;
+    herr_t	   result;
+    struct expected_entry_status expected[36] =
+    {
+      /* the expected array is used to maintain a table of the expected status of every
+       * entry used in this test.  Note that since the function that processes this
+       * array only processes as much of it as it is told to, we don't have to
+       * worry about maintaining the status of entries that we haven't used yet.
+       */
+      /* entry			entry				in	at main                                                flush dep flush dep child flush   flush       flush */
+      /* type:			index:	size:			cache:	addr:	dirty:	prot:	pinned:	dsrlzd:	srlzd:	dest:  par type[]: par idx[]: dep npart: dep nchd: dep ndirty chd: order: corked: */
+      { HUGE_ENTRY_TYPE, 	0,	HUGE_ENTRY_SIZE, 	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { HUGE_ENTRY_TYPE, 	1,	HUGE_ENTRY_SIZE, 	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { HUGE_ENTRY_TYPE, 	2,	HUGE_ENTRY_SIZE, 	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { HUGE_ENTRY_TYPE, 	3,	HUGE_ENTRY_SIZE, 	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	0,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	1,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	2,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	3,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	4,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	5,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	6,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	7,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	8,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	9,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	10,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	11,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	12,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	13,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	14,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	15,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	16,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	17,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	18,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	19,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	20,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	21,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	22,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	23,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	24,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	25,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	26,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	27,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	28,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	29,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	30,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	31,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+    };
+
+    if ( pass ) {
+
+         if ( cache_ptr == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "cache_ptr NULL on entry to cedds for H5C_make_space_in_cache() test.";
+        }
+        else if ( ( cache_ptr->index_len != 0 ) ||
+                  ( cache_ptr->index_size != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "cache not empty at start of flush ops eviction test.";
+        }
+        else if ( ( cache_ptr->max_cache_size != (2 * 1024 * 1024 ) ) ||
+                  ( cache_ptr->min_clean_size != (1 * 1024 * 1024 ) ) ) {
+
+	    pass = FALSE;
+	    failure_mssg =
+	        "unexpected cache config at start of cedds H5C__make_space_in_cache() test.";
+
+        } else {
+
+            /* set min clean size to zero for this test as it simplifies
+	     * computing the expected cache size after each operation.
+	     */
+
+            cache_ptr->min_clean_size = 0;
+        }
+    }
+
+    if ( pass ) {
+
+	/* The basic idea of this test is to setup the cache such 
+ 	 * that:
+ 	 * 
+	 * 1) the cache is full
+	 * 
+	 * 2) the last entry on the LRU is dirty, and has a flush
+	 *    operation that will remove the second to last entry 
+         *    on the LRU from the cache.
+         *
+         * Then load another entry into the cache.  See if 
+	 * H5C__make_space_in_cache() detects the removal of 
+	 * the next item in the scan, and restarts the scan 
+         * from the bottom of the LRU.  Note that the newly 
+         * loaded entry must be large enough to require that
+         * the scan continue after the entry is expunged.
+         */
+
+	/* reset the stats before we start.  If stats are enabled, we will
+	 * check to see if they are as expected at the end.
+	 */
+	H5C_stats__reset(cache_ptr);
+
+
+	/* Load four huge entries into the cache.  Recall that huge entries
+         * are one fourth the size of monster entries (16 KB vs. 64 KB).
+         */
+	for ( i = 0; i < 4; i++ ) {
+
+	    protect_entry(file_ptr, HUGE_ENTRY_TYPE, i);
+	    unprotect_entry(file_ptr, HUGE_ENTRY_TYPE, i, H5C__DIRTIED_FLAG);
+        }
+
+	if ( ( cache_ptr->index_len != 4 ) ||
+             ( cache_ptr->index_size != (4 * HUGE_ENTRY_SIZE) ) ) {
+
+            pass = FALSE;
+
+	    failure_mssg = "unexpected size/len in H5C__make_space_in_cache() test (1)";
+	}
+    }
+
+    if ( pass ) {
+
+	/* Next, set up the flush operation:
+	 *
+	 *     (HET, 0) expunges (HET, 1)
+	 *
+	 */
+        add_flush_op(HUGE_ENTRY_TYPE, 0, FLUSH_OP__EXPUNGE,
+                     HUGE_ENTRY_TYPE, 1, FALSE, (size_t)0, NULL);
+
+    }
+
+    if ( pass ) {
+
+	/* to summarize, at present the following entries
+	 * are in cache with the following characteristics:
+	 *
+	 * 		in
+	 * entry:	cache?	size:	dirty?	pinned?	pins:	flush operations:
+	 *
+	 * (HET, 0) 	Y	16 KB	Y	N	-	expunge (HET 1)
+	 *
+	 * (HET, 1)	Y	16 KB	N	N	-	-
+         *
+	 * (HET, 2)	Y	16 KB	N	N	-	-
+         *
+	 * (HET, 3)	Y	16 KB	N	N	-	-
+	 *
+	 * Recall that in this test bed, flush operations are excuted the
+	 * first time the associated entry is flushed, and are then
+	 * deleted.
+	 */
+
+        /* Now fill up the cache with other, unrelated entries.  Recall
+         * that the cache size is 2 MB and 31 * 64 KB  + 4 * 16 KP == 2 MB.
+         */
+	for ( i = 0; i < 31; i++ )
+	{
+	    protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
+            unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__DIRTIED_FLAG);
+	}
+
+	/* The cache should now be exactly full */
+	if ( ( cache_ptr->index_len != 35 ) ||
+             ( cache_ptr->index_size != 2 * 1024 * 1024 ) ||
+	     ( cache_ptr->index_size != ((4 * HUGE_ENTRY_SIZE) +
+                                         (31 * MONSTER_ENTRY_SIZE)) ) ) {
+
+            pass = FALSE;
+	    failure_mssg = "unexpected size/len in H5C__make_space_in_cache() test (2)";
+
+	} else {
+
+	    /* verify the expected status of all entries we have loaded to date: */
+	    verify_entry_status(cache_ptr, 0, 35, expected);
+	}
+    }
+
+    if ( pass ) {
+
+        /* now load another monster entry.  This should cause 
+ 	 * H5C__make_space_in_cache() to be called.  (HET 0) is dirty, and is at 
+	 * the bottom of the LRU.  * Thus it will be flushed, and moved to the 
+	 * head of the LRU.  However, during the flush, (HET 1) should be expunged 
+	 * from the cache.  Since (MET 1) is the next item in 
+	 * H5C__make_space_in_cache(), must detect its removal from the cache,
+         * and refrain from trying to flush it.
+         *
+         * Since all entries in the cache are dirty, all entries will be flushed,
+         * and HET 0, 2, and 3 will be evicted to make room for the new 
+         * monster entry (MET, 31).
+         *
+         * Verify this.  If H5C_make_space_in_cache() chokes, failure will
+         * be detected in protect_entry().  Thus end the "if ( pass )" clause
+         * there so the error message will not be overwritten.
+         */
+
+        protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 31);
+    }
+
+    if ( pass ) {
+
+        /* if the protect succeeded, unprotect and verify that all is at 
+         * it should be.
+         */
+
+        unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 31, H5C__DIRTIED_FLAG);
+
+	/* The cache should now be exactly full */
+	if ( ( cache_ptr->index_len != 32 ) ||
+             ( cache_ptr->index_size != 2 * 1024 * 1024 ) ||
+	     ( cache_ptr->index_size != (32 * MONSTER_ENTRY_SIZE) ) ) {
+
+            pass = FALSE;
+	    failure_mssg = "unexpected size/len in H5C__make_space_in_cache() test (3)";
+
+	} else {
+
+	    /* modify the expected table to match the new situation, and 
+             * then call verify_entry_status().
+             */
+            for ( i = 0; i < num_huge_entries; i++ )
+            {
+		expected[i].in_cache = FALSE;
+		expected[i].is_dirty = FALSE;
+		expected[i].serialized = TRUE;
+	        expected[i].destroyed = TRUE;
+            }
+
+            /* (HET, 1) was expunged, so touch its entry up accordingly */
+	    expected[1].is_dirty = TRUE;
+	    expected[1].serialized = FALSE;
+
+            for ( i = num_huge_entries; i < num_huge_entries + num_monster_entries - 1; i++ )
+            {
+		expected[i].is_dirty = FALSE;
+		expected[i].serialized = TRUE;
+            }
+
+	    /* verify the expected status of all entries: */
+	    verify_entry_status(cache_ptr, 0, 36, expected);
+        }
+    }
+
+    /* flush the cache and end the test. */
+
+    if ( pass ) {
+
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__FLUSH_INVALIDATE_FLAG);
+
+        if ( result < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "Cache flush invalidate failed after flush op eviction test";
+        }
+        else if ( ( cache_ptr->index_len != 0 ) ||
+                  ( cache_ptr->index_size != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected cache len/size after cleanup of flush op eviction test";
+
+        }
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    /* If we are collecting stats, check to see if we get the expected
+     * values.
+     */
+
+    if ( pass ) {
+
+	if ( ( cache_ptr->insertions[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_insertions[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->clears[HUGE_ENTRY_TYPE] != 1 ) ||
+             ( cache_ptr->flushes[HUGE_ENTRY_TYPE] != 3 ) ||
+             ( cache_ptr->evictions[HUGE_ENTRY_TYPE] != 4 ) ||
+             ( cache_ptr->take_ownerships[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->moves[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->entry_flush_moves[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->cache_flush_moves[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pins[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->unpins[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->dirty_pins[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_flushes[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_clears[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->size_increases[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->size_decreases[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->entry_flush_size_changes[HUGE_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->cache_flush_size_changes[HUGE_ENTRY_TYPE] != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected large entry stats in cedds__H5C_make_space_in_cache().";
+        }
+    }
+
+    if ( pass ) {
+
+	if ( ( cache_ptr->insertions[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_insertions[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->clears[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->flushes[MONSTER_ENTRY_TYPE] != 32 ) ||
+             ( cache_ptr->evictions[MONSTER_ENTRY_TYPE] != 32 ) ||
+             ( cache_ptr->take_ownerships[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->entry_flush_moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->cache_flush_moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pins[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->unpins[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->dirty_pins[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_flushes[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_clears[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->size_increases[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->size_decreases[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->entry_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->cache_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected monster entry stats in cedds__H5C_make_space_in_cache().";
+        }
+    }
+
+    if ( pass ) {
+
+	if ( ( cache_ptr->slist_scan_restarts != 0 ) ||
+             ( cache_ptr->LRU_scan_restarts != 1 ) ||
+             ( cache_ptr->hash_bucket_scan_restarts != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "unexpected scan restart stats in cedds__H5C_make_space_in_cache().";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( pass ) {
+
+	reset_entries();
+    } 
+
+    if ( pass ) {
+
+	/* reset cache min clean size to its expected value */
+        cache_ptr->min_clean_size = (1 * 1024 * 1024);
+    }
+
+    return;
+
+} /* cedds__H5C_make_space_in_cache() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	cedds__H5C__autoadjust__ageout__evict_aged_out_entries()
+ *
+ * Purpose:	Verify that H5C__autoadjust__ageout__evict_aged_out_entries() 
+ *		can handle the removal from the cache of the next item in 
+ *		its reverse scan of the LRU list.  
+ *
+ *		Do this by setting up a full cache, with the last entry 
+ *		on the LRU being both dirty and having a flush operation 
+ *		that deletes the second to last entry on the LRU.  Then 
+ *		access the first item in the LRU repeatedly until the 
+ *		item, and thereby the deletion of the second to last item.
+ *
+ *		H5C_make_space_in_cache() should detect this deletion, and 
+ *		restart its scan of the LRU from the tail, instead of 
+ *		examining the now deleted next item up on the LRU.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:	void
+ *
+ * Programmer:	John Mainzer
+ *              4/4/15
+ *
+ * Modifications:
+ *
+ *		None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+cedds__H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * file_ptr)
+{
+    H5C_t *        cache_ptr = file_ptr->shared->cache;
+    int		   i;
+    herr_t	   result;
+    struct expected_entry_status expected[36] =
+    {
+      /* the expected array is used to maintain a table of the expected status of every
+       * entry used in this test.  Note that since the function that processes this
+       * array only processes as much of it as it is told to, we don't have to
+       * worry about maintaining the status of entries that we haven't used yet.
+       */
+      /* entry			entry				in	at main                                                flush dep flush dep child flush   flush       flush */
+      /* type:			index:	size:			cache:	addr:	dirty:	prot:	pinned:	dsrlzd:	srlzd:	dest:  par type[]: par idx[]: dep npart: dep nchd: dep ndirty chd: order: corked: */
+      { MONSTER_ENTRY_TYPE,	0,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	1,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	2,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},	
+      { MONSTER_ENTRY_TYPE,	3,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	4,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	5,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	6,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	7,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	8,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	9,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	10,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	11,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	12,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	13,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	14,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	15,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	16,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	17,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	18,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	19,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	20,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	21,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	22,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	23,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	24,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	25,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	26,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	27,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	28,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	29,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	30,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	31,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, {-1,-1,-1,-1,-1,-1,-1,-1}, {-1,-1,-1,-1,-1,-1,-1,-1},     0, 0, 0, -1, FALSE},
+    };
+    H5C_auto_size_ctl_t saved_auto_size_ctl;
+    H5C_auto_size_ctl_t test_auto_size_ctl =
+    {
+        /* int32_t     version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
+        /* H5C_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn,
+
+        /* hbool_t     set_initial_size       = */ TRUE,
+        /* size_t      initial_size           = */ (2 * 1024 * 1024),
+
+        /* double      min_clean_fraction     = */ 0.5f,
+
+        /* size_t      max_size               = */ (8 * 1024 * 1024),
+        /* size_t      min_size               = */ (1 * 1024 * 1024),
+
+        /* int64_t     epoch_length           = */ 1000,
+
+
+        /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
+
+        /* double     lower_hr_threshold      = */ 0.75f,
+
+        /* double      increment              = */ 2.0f,
+
+        /* hbool_t     apply_max_increment    = */ TRUE,
+        /* size_t      max_increment          = */ (4 * 1024 * 1024),
+
+        /* enum H5C_cache_flash_incr_mode       */
+	/*                    flash_incr_mode = */ H5C_flash_incr__off,
+	/* double      flash_multiple         = */ 2.0f,
+	/* double      flash_threshold        = */ 0.5f,
+
+
+        /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out,
+
+        /* double      upper_hr_threshold     = */ 0.995f,
+
+        /* double      decrement              = */ 0.5f,
+
+        /* hbool_t     apply_max_decrement    = */ FALSE,
+        /* size_t      max_decrement          = */ (1 * 1024 * 1024),
+
+        /* int32_t     epochs_before_eviction = */ 1,
+
+        /* hbool_t     apply_empty_reserve    = */ TRUE,
+        /* double      empty_reserve          = */ 0.05f
+    };
+
+    if ( pass ) {
+
+         if ( cache_ptr == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "cache_ptr NULL on entry to cedds for H5C__autoadjust__ageout__evict_aged_out_entries() test.";
+        }
+        else if ( ( cache_ptr->index_len != 0 ) ||
+                  ( cache_ptr->index_size != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "cache not empty at start cedds for H5C__autoadjust__ageout__evict_aged_out_entries() test.";
+        }
+        else if ( ( cache_ptr->max_cache_size != (2 * 1024 * 1024 ) ) ||
+                  ( cache_ptr->min_clean_size != (1 * 1024 * 1024 ) ) ) {
+
+	    pass = FALSE;
+	    failure_mssg =
+	        "unexpected cache config at start of cedds H5C__autoadjust__ageout__evict_aged_out_entries() test.";
+
+        } else {
+
+            /* set min clean size to zero for this test as it simplifies
+	     * computing the expected cache size after each operation.
+	     */
+
+            cache_ptr->min_clean_size = 0;
+        }
+    }
+
+    /* save the initial resize configuration so we can restore it later */
+    if ( pass ) {
+
+        saved_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER;
+
+        result = H5C_get_cache_auto_resize_config(cache_ptr,
+                                                  &saved_auto_size_ctl);
+
+        if ( result != SUCCEED ) {
+
+            pass = FALSE;
+            failure_mssg = "H5C_get_cache_auto_resize_config failed.";
+
+        }
+    }
+
+    /* set the resize configuration we will be using in the test */
+    if ( pass ) {
+
+        result = H5C_set_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl);
+
+        if ( result != SUCCEED ) {
+
+            pass = FALSE;
+            failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n";
+        }
+    }
+
+    if ( pass ) {
+
+	/* The basic idea of this test is to setup the cache such 
+ 	 * that:
+ 	 * 
+	 * 1) the cache is full
+	 * 
+	 * 2) the last entry on the LRU is dirty, and has a flush
+	 *    operation that will remove the second to last entry 
+         *    on the LRU from the cache.
+         *
+         * Then access the first item in the LRU until the epoch
+	 * and H5C__autoadjust__ageout__evict_aged_out_entries()
+         * is invoked.  Verify that the function deals with the 
+	 * deletion of the next item in its scan cleanly.
+         */
+
+	/* reset the stats before we start.  If stats are enabled, we will
+	 * check to see if they are as expected at the end.
+	 */
+	H5C_stats__reset(cache_ptr);
+
+
+        /* load the first entry -- mark it dirty */
+	protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
+	unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__DIRTIED_FLAG);
+
+        /* Then load the rest of the entries to fill the cache: 
+         *
+         * Recall that the cache size is 2 MB and 32 * 64 KB == 2 MB.
+         */
+	for ( i = 1; i < 32; i++ )
+	{
+	    protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
+            unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
+	}
+    }
+
+    if ( pass ) {
+
+	/* Next, set up the flush operation:
+	 *
+	 *     (MET, 0) expunges (MET, 1)
+	 *
+	 */
+        add_flush_op(MONSTER_ENTRY_TYPE, 0, FLUSH_OP__EXPUNGE,
+                     MONSTER_ENTRY_TYPE, 1, FALSE, (size_t)0, NULL);
+
+    }
+
+    if ( pass ) {
+
+	/* to summarize, at present the following entries
+	 * are in cache with the following characteristics:
+	 *
+	 * 		in
+	 * entry:	cache?	size:	dirty?	pinned?	pins:	flush operations:
+	 *
+	 * (MET, 0) 	Y	64 KB	Y	N	-	expunge (MET 1)
+	 *
+	 * (MET, 1-31)	Y	64 KB	N	N	-	-
+	 *
+	 * Recall that in this test bed, flush operations are excuted the
+	 * first time the associated entry is flushed, and are then
+	 * deleted.
+	 */
+
+	/* The cache should now be exactly full */
+	if ( ( cache_ptr->index_len != 32 ) ||
+             ( cache_ptr->index_size != 2 * 1024 * 1024 ) ||
+	     ( cache_ptr->index_size != (32 * MONSTER_ENTRY_SIZE) ) ) {
+
+            pass = FALSE;
+	    failure_mssg = "unexpected size/len in H5C__autoadjust__ageout__evict_aged_out_entries() test (1)";
+
+	} else {
+
+	    /* verify the expected status of all entries we have loaded to date: */
+	    verify_entry_status(cache_ptr, 0, 32, expected);
+	}
+    }
+
+    /* protect and unprotect (MET, 31) repeatedly until the end of the first epoch */
+    while ( ( pass ) && ( cache_ptr->cache_accesses > 0 ) ) {
+
+        protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 31);
+        unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 31, H5C__NO_FLAGS_SET);
+    }
+
+    /* at this point, an epoch marker entry should have been inserted into the LRU */
+
+    if ( pass ) {
+
+        /* protect and unprotect (MET, 31) again to get cache_accesses > 0 */
+        protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 31);
+        unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 31, H5C__NO_FLAGS_SET);
+    }
+
+    /* protect and unprotect (MET, 31) repeatedly until the end of the second epoch */
+    while ( ( pass ) && ( cache_ptr->cache_accesses > 0 ) ) {
+
+        protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 31);
+        unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 31, H5C__NO_FLAGS_SET);
+    }
+
+    /* at this point, only (MET, 0) and (MET, 31) should remain in the cache, 
+     * all other entries having been evicted by the ageout adaptive cache 
+     * resizing algorithm. (Since (MET, 0) was dirty, it was flushed and 
+     * moved to the head of the LRU by the ageout algorithm.)
+     */
+
+    if ( pass ) {
+
+	if ( ( cache_ptr->index_len != 2 ) ||
+             ( cache_ptr->index_size != 2 * MONSTER_ENTRY_SIZE ) ) {
+
+            pass = FALSE;
+	    failure_mssg = "unexpected size/len in H5C__autoadjust__ageout__evict_aged_out_entries() test (2)";
+
+	} else {
+
+            /* update the expected table to reflect the expected values at 
+             * this point, and then verify.
+             */
+
+            expected[0].is_dirty = FALSE;
+	    expected[0].serialized = TRUE;
+
+            for ( i = 1; i < 31; i++ )
+            {
+		expected[i].in_cache = FALSE;
+		expected[i].is_dirty = FALSE;
+	        expected[i].destroyed = TRUE;
+            }
+
+	    verify_entry_status(cache_ptr, 0, 32, expected);
+	}
+    }
+
+    /* restore the initial resize configuration */
+    if ( pass ) {
+
+        saved_auto_size_ctl.set_initial_size = TRUE;
+        saved_auto_size_ctl.initial_size     = 2 * 1024 * 1024;
+
+        result = H5C_set_cache_auto_resize_config(cache_ptr, &saved_auto_size_ctl);
+
+        if ( result != SUCCEED ) {
+
+            pass = FALSE;
+            failure_mssg = "H5C_set_cache_auto_resize_config failed 2.\n";
+        }
+    }
+
+    /* flush the cache and end the test. */
+
+    if ( pass ) {
+
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__FLUSH_INVALIDATE_FLAG);
+
+        if ( result < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "Cache flush invalidate failed after flush op eviction test";
+        }
+        else if ( ( cache_ptr->index_len != 0 ) ||
+                  ( cache_ptr->index_size != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected cache len/size after cleanup of flush op eviction test";
+
+        }
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    /* If we are collecting stats, check to see if we get the expected
+     * values.
+     */
+
+    if ( pass ) {
+
+	if ( ( cache_ptr->insertions[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_insertions[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->clears[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->flushes[MONSTER_ENTRY_TYPE] != 1 ) ||
+             ( cache_ptr->evictions[MONSTER_ENTRY_TYPE] != 32 ) ||
+             ( cache_ptr->take_ownerships[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->entry_flush_moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->cache_flush_moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pins[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->unpins[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->dirty_pins[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_flushes[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_clears[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->size_increases[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->size_decreases[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->entry_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->cache_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected monster entry stats in cedds__H5C__autoadjust__ageout__evict_aged_out_entries().";
+        }
+    }
+
+    if ( pass ) {
+
+	if ( ( cache_ptr->slist_scan_restarts != 0 ) ||
+             ( cache_ptr->LRU_scan_restarts != 1 ) ||
+             ( cache_ptr->hash_bucket_scan_restarts != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "unexpected scan restart stats in cedds__H5C__autoadjust__ageout__evict_aged_out_entries().";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( pass ) {
+
+	reset_entries();
+    }
+
+    if ( pass ) {
+
+	/* reset cache min clean size to its expected value */
+        cache_ptr->min_clean_size = (1 * 1024 * 1024);
+    }
+
+    return;
+
+} /* cedds__H5C__autoadjust__ageout__evict_aged_out_entries() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	cedds__H5C_flush_invalidate_cache__bucket_scan()
+ *
+ * Purpose:	Verify that H5C_flush_invalidate_cache() can handle
+ *		the removal from the cache of the next item in 
+ *		its scans of hash buckets.
+ *
+ *		!!!!!!!!!! WARNING !!!!!!!!!!
+ *
+ *		This test may fail to function correctly if the hash 
+ *		table size or hash function is altered.  
+ *
+ *		To setup the test, this function depends on the fact that 
+ *		H5C_flush_invalidate_cache() does alternating scans of the
+ *		slist and the index.  If this changes, the test will likely
+ *		also cease to function correctly.
+ *
+ *		The test relies on a known hash function and hash table 
+ *		size to select a set of test entries that will all hash 
+ *		to the same hash bucket -- call it the test hash bucket.  
+ *		It also relies on known behavior of the cache to place 
+ *		the entries in the test bucket in a known order.
+ *
+ *		To avoid pre-mature flushes of the entries in the 
+ *		test hash bucket, all entries are initially clean,
+ *		with the exception of the first entry which is dirty.
+ *		It avoids premature flushing by being the parent in 
+ *		a flush dependency.  The first entry in the test bucket
+ *		also has a flush op which expunges the second entry --
+ *		setting up the failure.
+ *
+ *		An additional dirty entry is added (which must hash
+ *		to a different bucket, and must have a higher address 
+ *		than at least the first entry in the test hash bucket.
+ *		This entry is the child in a flush dependency with the 
+ *		first entry in the above hash bucket, and contains
+ *		a flush op to destroy this flush dependency. 
+ *
+ *		Since the first entry in the test hash bucket has a lower
+ *		address that the other dirty entry, the scan of the 
+ *		slist encounters it first, and passes over it because 
+ *		it has a flush dependency height of 1.
+ *
+ *		The scan then encounters the second dirty entry and flushes
+ *		it -- causing it to destroy the flush dependency and thus 
+ *		reducing the flush dependency height of the first entry in 
+ *		the test hash bucket to zero.
+ *
+ *		After completing a scan of the slist, 
+ *		H5C_flush_invalidate_cache() then scans the index,
+ *		flushing all entries of flush dependency height zero.
+ *
+ *		This sets up the potential error when the first entry
+ *		in the test hash bucket is flushed -- expunging the 
+ *		second entry as a side effect.  If 
+ *		H5C_flush_invalidate_cache() fails to detect this, 
+ *		it will attempt to continue its scan of the bucket with
+ *		an entry that has been deleted from the cache.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:	void
+ *
+ * Programmer:	John Mainzer
+ *              4/9/15
+ *
+ * Modifications:
+ *
+ *		None.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static void
+cedds__H5C_flush_invalidate_cache__bucket_scan(H5F_t * file_ptr)
+{
+    H5C_t *                    cache_ptr = file_ptr->shared->cache;
+    int		               i;
+    int		               expected_hash_bucket = 0;
+    herr_t	               result;
+    haddr_t                    entry_addr;
+    test_entry_t *             entry_ptr;
+    test_entry_t *             base_addr = NULL;
+    struct H5C_cache_entry_t * scan_ptr;
+    struct expected_entry_status expected[5] =
+    {
+      /* the expected array is used to maintain a table of the expected status of every
+       * entry used in this test.  Note that since the function that processes this
+       * array only processes as much of it as it is told to, we don't have to
+       * worry about maintaining the status of entries that we haven't used yet.
+       */
+      /* entry			entry				in	at main                                                  flush dep flush dep child flush   flush       flush */
+      /* type:			index:	size:			cache:	addr:	dirty:	prot:	pinned:	dsrlzd:	srlzd:	dest:     par type[]: par idx[]: dep npart: dep nchd: dep ndirty chd: order: corked */
+      { MONSTER_ENTRY_TYPE,	 0,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	TRUE,	TRUE,	FALSE,	FALSE,      {-1,0,0,0,0,0,0,0},                 {-1,0,0,0,0,0,0,0}, 0, 1, 1, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,	 8,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,      {-1,0,0,0,0,0,0,0},                 {-1,0,0,0,0,0,0,0}, 0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,     16,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,      {-1,0,0,0,0,0,0,0},                 {-1,0,0,0,0,0,0,0}, 0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,     24,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	FALSE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE,      {-1,0,0,0,0,0,0,0},                 {-1,0,0,0,0,0,0,0}, 0, 0, 0, -1, FALSE},
+      { MONSTER_ENTRY_TYPE,     31,	MONSTER_ENTRY_SIZE,	TRUE,	TRUE,	TRUE,	FALSE,	FALSE,	TRUE,	FALSE,	FALSE, 	    {MONSTER_ENTRY_TYPE,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0},  1, 0, 0, -1, FALSE},
+    };
+
+    if ( pass ) {
+
+         if ( cache_ptr == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "cache_ptr NULL on entry to cedds for H5C__autoadjust__ageout__evict_aged_out_entries() test.";
+        }
+        else if ( ( cache_ptr->index_len != 0 ) ||
+                  ( cache_ptr->index_size != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "cache not empty at start cedds for H5C__autoadjust__ageout__evict_aged_out_entries() test.";
+        }
+        else if ( ( cache_ptr->max_cache_size != (2 * 1024 * 1024 ) ) ||
+                  ( cache_ptr->min_clean_size != (1 * 1024 * 1024 ) ) ) {
+
+	    pass = FALSE;
+	    failure_mssg =
+	        "unexpected cache config at start of cedds H5C__autoadjust__ageout__evict_aged_out_entries() test.";
+
+        } else {
+
+            /* set min clean size to zero for this test as it simplifies
+	     * computing the expected cache size after each operation.
+	     */
+
+            cache_ptr->min_clean_size = 0;
+        }
+    }
+
+
+    if ( pass ) {
+
+	/* reset the stats before we start.  If stats are enabled, we will
+	 * check to see if they are as expected at the end.
+	 */
+
+	H5C_stats__reset(cache_ptr);
+
+
+	/* load one dirty and three clean entries that should hash to the 
+         * same hash bucket.  
+         */
+
+        protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
+        unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__DIRTIED_FLAG);
+
+	for ( i = 8; i <= 24; i += 8 )
+	{
+	    protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
+            unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
+	}
+    }
+
+    if ( pass ) {
+
+        /* verify that the above entries hash to the same bucket */
+        base_addr = entries[MONSTER_ENTRY_TYPE];
+        entry_ptr = &(base_addr[0]);
+        entry_addr = entry_ptr->header.addr;
+
+        HDassert(entry_addr == entry_ptr->addr);
+
+        expected_hash_bucket = H5C__HASH_FCN(entry_addr);
+
+        for ( i = 8; i <= 24; i += 8 ) {
+        
+            entry_ptr = &(base_addr[i]);
+            entry_addr = entry_ptr->header.addr;
+
+            if ( expected_hash_bucket != H5C__HASH_FCN(entry_addr) ) {
+
+                pass = FALSE;
+                failure_mssg = "Test entries don't map to same bucket -- hash table size or hash fcn change?";
+            }
+        }
+    }
+
+    if ( pass ) {
+
+       /* setup the expunge flush operation:
+	 *
+	 *     (MET, 0) expunges (MET, 8)
+	 *
+	 */
+        add_flush_op(MONSTER_ENTRY_TYPE, 0, FLUSH_OP__EXPUNGE,
+                     MONSTER_ENTRY_TYPE, 8, FALSE, (size_t)0, NULL);
+    }
+
+    if ( pass ) {
+
+        /* load the entry that will have a flush dependencey with (MET, 0),
+         * thus preventing it from being flushed on the first pass through
+         * the skip list. 
+         */
+
+	protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 31);
+	unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 31, H5C__DIRTIED_FLAG);
+    }
+
+    if ( pass ) {
+
+        /* verify that the dirty entry doesn't map to the same 
+         * hash bucket as the clean entries.
+         */
+
+        entry_ptr = &(base_addr[31]);
+        entry_addr = entry_ptr->header.addr;
+
+        if ( expected_hash_bucket == H5C__HASH_FCN(entry_addr) ) {
+
+            pass = FALSE;
+            failure_mssg = "Dirty entry maps to same hash bucket as clean entries?!?!";
+        }
+    }
+
+    if ( pass ) {
+
+	/* Next, create the flush dependency requiring (MET, 31) to 
+         * be flushed prior to (MET, 0).
+	 */
+
+        protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0);
+        create_flush_dependency(MONSTER_ENTRY_TYPE, 0, MONSTER_ENTRY_TYPE, 31);
+        unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, H5C__DIRTIED_FLAG);
+
+    }
+
+    if ( pass ) {
+
+        /* Then, setup the flush operation to take down the flush 
+         * dependency when (MET, 31) is flushed.
+	 *
+	 *     (MET, 31) destroys flush dependency with (MET, 8)
+	 *
+         */
+        add_flush_op(MONSTER_ENTRY_TYPE, 31, FLUSH_OP__DEST_FLUSH_DEP,
+                     MONSTER_ENTRY_TYPE, 0, FALSE, (size_t)0, NULL);
+
+    }
+
+    if ( pass ) {
+
+	/* verify the expected status of all entries we have loaded to date: */
+        verify_entry_status(cache_ptr, 0, 5, expected);
+    }
+
+    if ( pass ) {
+
+        /* now do some protect / unprotect cycles to force the 
+         * entries into the desired order in the hash bucket.
+         * Recall that entries are moved to the head of the 
+         * hash bucket list on lookup.
+         */
+
+	for ( i = 24; i >= 0; i -= 8 )
+	{
+	    protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
+            unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
+	}
+    }
+
+    if ( pass ) {
+
+        /* scan the hash bucket to verify that the expected entries appear
+         * in the expected order.
+         */
+        scan_ptr = cache_ptr->index[expected_hash_bucket];
+
+        i = 0;
+
+        while ( ( pass ) && ( i <= 24 ) )
+	{
+            entry_ptr = &(base_addr[i]);
+
+            if ( scan_ptr == NULL ) {
+
+                pass = FALSE;
+                failure_mssg = "premature end of hash bucket list?!?!";
+
+            } else if ( ( scan_ptr == NULL ) ||
+                        ( scan_ptr != &(entry_ptr->header) ) ) {
+
+                pass = FALSE;
+                failure_mssg = "bad test hash bucket setup?!?!";
+            }
+
+            if ( pass ) {
+
+                scan_ptr = scan_ptr->ht_next;
+                i += 8;
+            }
+	}
+    }
+
+
+    /* test setup complete -- flush the cache to run and end the test. */
+
+    if ( pass ) {
+
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__FLUSH_INVALIDATE_FLAG);
+
+        if ( result < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "Cache flush invalidate failed after flush op eviction test";
+        }
+        else if ( ( cache_ptr->index_len != 0 ) ||
+                  ( cache_ptr->index_size != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected cache len/size after cleanup of flush op eviction test";
+
+        }
+    }
+
+#if H5C_COLLECT_CACHE_STATS
+    /* If we are collecting stats, check to see if we get the expected
+     * values.
+     */
+
+    if ( pass ) {
+
+	if ( ( cache_ptr->insertions[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_insertions[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->clears[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->flushes[MONSTER_ENTRY_TYPE] != 2 ) ||
+             ( cache_ptr->evictions[MONSTER_ENTRY_TYPE] != 5 ) ||
+             ( cache_ptr->take_ownerships[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->entry_flush_moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->cache_flush_moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pins[MONSTER_ENTRY_TYPE] != 1 ) ||
+             ( cache_ptr->unpins[MONSTER_ENTRY_TYPE] != 1 ) ||
+             ( cache_ptr->dirty_pins[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_flushes[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_clears[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->size_increases[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->size_decreases[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->entry_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->cache_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected monster entry stats in cedds__H5C_flush_invalidate_cache__bucket_scan().";
+        }
+    }
+
+    if ( pass ) {
+
+	if ( ( cache_ptr->slist_scan_restarts != 0 ) ||
+             ( cache_ptr->LRU_scan_restarts != 0 ) ||
+             ( cache_ptr->hash_bucket_scan_restarts != 1 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "unexpected scan restart stats in cedds__H5C_flush_invalidate_cache__bucket_scan().";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    if ( pass ) {
+
+	reset_entries();
+    }
+
+    if ( pass ) {
+
+	/* reset cache min clean size to its expected value */
+        cache_ptr->min_clean_size = (1 * 1024 * 1024);
+    }
+
+    return;
+
+} /* cedds__H5C_flush_invalidate_cache__bucket_scan() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	check_stats()
+ *
+ * Purpose:	If stats are enabled, conduct tests to verify correct 
+ *		functioning of the cache statistics collection code.
+ *
+ *		Skip the test if stats are not enabled.
+ *
+ *		At present this test is a shell -- fill it out at time
+ *		permits.
+ *
+ * Return:	void
+ *
+ * Programmer:	John Mainzer
+ *              4/12/15
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static unsigned
+check_stats(void)
+{
+
+#if H5C_COLLECT_CACHE_STATS
+
+    H5F_t * file_ptr = NULL;
+
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    TESTING("metadata cache statistics collection");
+
+#if H5C_COLLECT_CACHE_STATS
+
+    pass = TRUE;
+
+    reset_entries();
+
+    file_ptr = setup_cache((size_t)(2 * 1024 * 1024),
+                           (size_t)(1 * 1024 * 1024));
+
+    if ( pass ) {
+
+        check_stats__smoke_check_1(file_ptr);
+    }
+
+
+
+    if ( pass ) {
+
+        takedown_cache(file_ptr, FALSE, FALSE);
+    }
+
+    if ( pass ) { PASSED(); } else { H5_FAILED(); }
+
+    if ( ! pass ) {
+
+        HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n",
+                  FUNC, failure_mssg);
+    }
+
+#else /* H5C_COLLECT_CACHE_STATS */
+
+    SKIPPED();
+
+    HDfprintf(stdout, "	Statistics collection disabled.\n");
+
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+    return (unsigned)!pass;
+
+} /* check_stats() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	check_stats__smoke_check_1()
+ *
+ * Purpose:	Test to see if the statistics collection code is working 
+ *		more or less as expected.  Do this by performing a number 
+ *		of operations in the cache, and checking to verify that 
+ *		they result in the expected statistics.
+ *
+ *		Note that this function is not intended to be a full test
+ *		of the statistics collection facility -- only a cursory 
+ *		check that will serve as a place holder until more complete
+ *		tests are implemented.
+ *
+ *              Do nothing if pass is FALSE on entry.
+ *
+ * Return:	void
+ *
+ * Programmer:	John Mainzer
+ *              4/22/15
+ *
+ * Modifications:
+ *
+ *		None.
+ *
+ *-------------------------------------------------------------------------
+ */
+#if H5C_COLLECT_CACHE_STATS
+static void
+check_stats__smoke_check_1(H5F_t * file_ptr)
+{
+    H5C_t *        cache_ptr = file_ptr->shared->cache;
+    int		   i;
+    herr_t	   result;
+
+    if ( pass ) {
+
+         if ( cache_ptr == NULL ) {
+
+            pass = FALSE;
+            failure_mssg = "cache_ptr NULL on entry to check_stats__smoke_check_1().";
+        }
+        else if ( ( cache_ptr->index_len != 0 ) ||
+                  ( cache_ptr->index_size != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "cache not empty on entry to check_stats__smoke_check_1().";
+        }
+        else if ( ( cache_ptr->max_cache_size != (2 * 1024 * 1024 ) ) ||
+                  ( cache_ptr->min_clean_size != (1 * 1024 * 1024 ) ) ) {
+
+	    pass = FALSE;
+	    failure_mssg =
+	        "unexpected cache config at start of check_stats__smoke_check_1().";
+
+        } else {
+
+            /* set min clean size to zero for this test as it simplifies
+	     * computing the expected cache size after each operation.
+	     */
+
+            cache_ptr->min_clean_size = 0;
+        }
+    }
+
+    if ( pass ) {
+
+        /* first fill the cache with monster entryies via insertion */
+
+        for ( i = 0; i < 32; i++ )
+
+            insert_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
+    }
+
+    if ( pass ) {
+
+        if ( ( cache_ptr->hits[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->misses[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->write_protects[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->read_protects[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->max_read_protects[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->insertions[MONSTER_ENTRY_TYPE] != 32 ) ||
+             ( cache_ptr->pinned_insertions[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->clears[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->flushes[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->evictions[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->take_ownerships[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->entry_flush_moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->cache_flush_moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pins[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->unpins[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->dirty_pins[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_flushes[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_clears[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->size_increases[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->size_decreases[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->entry_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->cache_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected monster size entry stats in check_stats__smoke_check_1(1).";
+        }
+    }
+
+    if ( pass ) {
+
+        if ( ( cache_ptr->total_ht_insertions != 32 ) ||
+             ( cache_ptr->total_ht_deletions != 0 ) ||
+             ( cache_ptr->successful_ht_searches != 0 ) ||
+             ( cache_ptr->total_successful_ht_search_depth != 0 ) ||
+             ( cache_ptr->failed_ht_searches != 32 ) ||
+             ( cache_ptr->total_failed_ht_search_depth != 48 ) ||
+             ( cache_ptr->max_index_len != 32 ) ||
+             ( cache_ptr->max_index_size != 2 * 1024 * 1024 ) ||
+             ( cache_ptr->max_clean_index_size != 0 ) ||
+             ( cache_ptr->max_dirty_index_size != 2 * 1024 * 1024 ) ||
+             ( cache_ptr->max_slist_len != 32 ) ||
+             ( cache_ptr->max_slist_size != 2 * 1024 * 1024 ) ||
+             ( cache_ptr->max_pl_len != 0 ) ||
+             ( cache_ptr->max_pl_size != 0 ) ||
+             ( cache_ptr->max_pel_len != 0 ) ||
+             ( cache_ptr->max_pel_size != 0 ) ||
+             ( cache_ptr->calls_to_msic != 0 ) ||
+             ( cache_ptr->total_entries_skipped_in_msic != 0 ) ||
+             ( cache_ptr->total_entries_scanned_in_msic != 0 ) ||
+             ( cache_ptr->max_entries_skipped_in_msic != 0 ) ||
+             ( cache_ptr->max_entries_scanned_in_msic != 0 ) ||
+             ( cache_ptr->entries_scanned_to_make_space != 0 ) ||
+             ( cache_ptr->slist_scan_restarts != 0 ) ||
+             ( cache_ptr->LRU_scan_restarts != 0 ) ||
+             ( cache_ptr->hash_bucket_scan_restarts != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected cache stats in check_stats__smoke_check_1(1).";
+        }
+    }
+
+#if H5C_COLLECT_CACHE_ENTRY_STATS
+    if ( pass ) {
+
+        /* Note that most entry level stats are only updated on entry eviction */
+
+        if ( ( cache_ptr->max_accesses[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->min_accesses[MONSTER_ENTRY_TYPE] != 1000000 ) || /* initial value */
+             ( cache_ptr->max_clears[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->max_flushes[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->max_size[MONSTER_ENTRY_TYPE] != 64 * 1024 ) ||
+             ( cache_ptr->max_pins[MONSTER_ENTRY_TYPE] != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected monster entry level stats in check_stats__smoke_check_1(1).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+
+    if ( pass ) {
+
+        /* protect and unprotect each entry once. Note 
+         * that all entries are already dirty, as they
+         * entered the cache via insertion
+         */
+
+        for ( i = 0; i < 32; i++ )
+        {
+	    protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i);
+	    unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, H5C__NO_FLAGS_SET);
+        }
+    }
+
+    if ( pass ) {
+
+        if ( ( cache_ptr->hits[MONSTER_ENTRY_TYPE] != 32 ) ||
+             ( cache_ptr->misses[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->write_protects[MONSTER_ENTRY_TYPE] != 32 ) ||
+             ( cache_ptr->read_protects[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->max_read_protects[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->insertions[MONSTER_ENTRY_TYPE] != 32 ) ||
+             ( cache_ptr->pinned_insertions[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->clears[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->flushes[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->evictions[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->take_ownerships[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->entry_flush_moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->cache_flush_moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pins[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->unpins[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->dirty_pins[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_flushes[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_clears[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->size_increases[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->size_decreases[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->entry_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->cache_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected monster size entry stats in check_stats__smoke_check_1(2).";
+        }
+    }
+
+    if ( pass ) {
+
+        if ( ( cache_ptr->total_ht_insertions != 32 ) ||
+             ( cache_ptr->total_ht_deletions != 0 ) ||
+             ( cache_ptr->successful_ht_searches != 32 ) ||
+             ( cache_ptr->total_successful_ht_search_depth != 96 ) ||
+             ( cache_ptr->failed_ht_searches != 32 ) ||
+             ( cache_ptr->total_failed_ht_search_depth != 48 ) ||
+             ( cache_ptr->max_index_len != 32 ) ||
+             ( cache_ptr->max_index_size != 2 * 1024 * 1024 ) ||
+             ( cache_ptr->max_clean_index_size != 0 ) ||
+             ( cache_ptr->max_dirty_index_size != 2 * 1024 * 1024 ) ||
+             ( cache_ptr->max_slist_len != 32 ) ||
+             ( cache_ptr->max_slist_size != 2 * 1024 * 1024 ) ||
+             ( cache_ptr->max_pl_len != 1 ) ||
+             ( cache_ptr->max_pl_size != 64 * 1024 ) ||
+             ( cache_ptr->max_pel_len != 0 ) ||
+             ( cache_ptr->max_pel_size != 0 ) ||
+             ( cache_ptr->calls_to_msic != 0 ) ||
+             ( cache_ptr->total_entries_skipped_in_msic != 0 ) ||
+             ( cache_ptr->total_entries_scanned_in_msic != 0 ) ||
+             ( cache_ptr->max_entries_skipped_in_msic != 0 ) ||
+             ( cache_ptr->max_entries_scanned_in_msic != 0 ) ||
+             ( cache_ptr->entries_scanned_to_make_space != 0 ) ||
+             ( cache_ptr->slist_scan_restarts != 0 ) ||
+             ( cache_ptr->LRU_scan_restarts != 0 ) ||
+             ( cache_ptr->hash_bucket_scan_restarts != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected cache stats in check_stats__smoke_check_1(2).";
+        }
+    }
+
+#if H5C_COLLECT_CACHE_ENTRY_STATS
+    if ( pass ) {
+
+        /* Note that most entry level stats are only updated on entry eviction */
+
+        if ( ( cache_ptr->max_accesses[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->min_accesses[MONSTER_ENTRY_TYPE] != 1000000 ) || /* initial value */
+             ( cache_ptr->max_clears[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->max_flushes[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->max_size[MONSTER_ENTRY_TYPE] != 64 * 1024 ) ||
+             ( cache_ptr->max_pins[MONSTER_ENTRY_TYPE] != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected monster entry level stats in check_stats__smoke_check_1(2).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+
+    if ( pass ) {
+
+        /* protect and unprotect an entry that is not currently
+         * in the cache.  Since the cache is full and all entries
+         * are dirty, this will force a flush of each entry, and 
+         * the eviction of (MET, 0).
+         */
+        protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 32);
+        unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 32, H5C__DIRTIED_FLAG);
+    }
+
+    if ( pass ) {
+
+        if ( ( cache_ptr->hits[MONSTER_ENTRY_TYPE] != 32 ) ||
+             ( cache_ptr->misses[MONSTER_ENTRY_TYPE] != 1 ) ||
+             ( cache_ptr->write_protects[MONSTER_ENTRY_TYPE] != 33 ) ||
+             ( cache_ptr->read_protects[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->max_read_protects[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->insertions[MONSTER_ENTRY_TYPE] != 32 ) ||
+             ( cache_ptr->pinned_insertions[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->clears[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->flushes[MONSTER_ENTRY_TYPE] != 32 ) ||
+             ( cache_ptr->evictions[MONSTER_ENTRY_TYPE] != 1 ) ||
+             ( cache_ptr->take_ownerships[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->entry_flush_moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->cache_flush_moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pins[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->unpins[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->dirty_pins[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_flushes[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_clears[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->size_increases[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->size_decreases[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->entry_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->cache_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected monster size entry stats in check_stats__smoke_check_1(3).";
+        }
+    }
+
+    if ( pass ) {
+
+        if ( ( cache_ptr->total_ht_insertions != 33 ) ||
+             ( cache_ptr->total_ht_deletions != 1 ) ||
+             ( cache_ptr->successful_ht_searches != 32 ) ||
+             ( cache_ptr->total_successful_ht_search_depth != 96 ) ||
+             ( cache_ptr->failed_ht_searches != 33 ) ||
+             ( cache_ptr->total_failed_ht_search_depth != 52 ) ||
+             ( cache_ptr->max_index_len != 32 ) ||
+             ( cache_ptr->max_index_size != 2 * 1024 * 1024 ) ||
+             ( cache_ptr->max_clean_index_size != 2 * 1024 * 1024 ) ||
+             ( cache_ptr->max_dirty_index_size != 2 * 1024 * 1024 ) ||
+             ( cache_ptr->max_slist_len != 32 ) ||
+             ( cache_ptr->max_slist_size != 2 * 1024 * 1024 ) ||
+             ( cache_ptr->max_pl_len != 1 ) ||
+             ( cache_ptr->max_pl_size != 64 * 1024 ) ||
+             ( cache_ptr->max_pel_len != 0 ) ||
+             ( cache_ptr->max_pel_size != 0 ) ||
+             ( cache_ptr->calls_to_msic != 1 ) ||
+             ( cache_ptr->total_entries_skipped_in_msic != 0 ) ||
+             ( cache_ptr->total_entries_scanned_in_msic != 33 ) ||
+             ( cache_ptr->max_entries_skipped_in_msic != 0 ) ||
+             ( cache_ptr->max_entries_scanned_in_msic != 33 ) ||
+             ( cache_ptr->entries_scanned_to_make_space != 33 ) ||
+             ( cache_ptr->slist_scan_restarts != 0 ) ||
+             ( cache_ptr->LRU_scan_restarts != 0 ) ||
+             ( cache_ptr->hash_bucket_scan_restarts != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected cache stats in check_stats__smoke_check_1(3).";
+        }
+    }
+
+#if H5C_COLLECT_CACHE_ENTRY_STATS
+    if ( pass ) {
+
+        /* Note that most entry level stats are only updated on entry eviction */
+
+        if ( ( cache_ptr->max_accesses[MONSTER_ENTRY_TYPE] != 1 ) ||
+             ( cache_ptr->min_accesses[MONSTER_ENTRY_TYPE] != 1 ) ||
+             ( cache_ptr->max_clears[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->max_flushes[MONSTER_ENTRY_TYPE] != 1 ) ||
+             ( cache_ptr->max_size[MONSTER_ENTRY_TYPE] != 64 * 1024 ) ||
+             ( cache_ptr->max_pins[MONSTER_ENTRY_TYPE] != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected monster entry level stats in check_stats__smoke_check_1(3).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+
+    if ( pass ) {
+
+        /* protect and unprotect dirty (MET, 1), and then flush destroy
+         * the cache.
+         */
+        protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 1);
+        unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 1, H5C__DIRTIED_FLAG);
+    }
+
+    /* flush the cache to end the test and collect all entry stats */
+
+    if ( pass ) {
+
+        result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__FLUSH_INVALIDATE_FLAG);
+
+        if ( result < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "Cache flush invalidate failed in check_stats__smoke_check_1()";
+        }
+        else if ( ( cache_ptr->index_len != 0 ) ||
+                  ( cache_ptr->index_size != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected cache len/size after check_stats__smoke_check_1()";
+
+        }
+    }
+
+    if ( pass ) {
+
+        if ( ( cache_ptr->hits[MONSTER_ENTRY_TYPE] != 33 ) ||
+             ( cache_ptr->misses[MONSTER_ENTRY_TYPE] != 1 ) ||
+             ( cache_ptr->write_protects[MONSTER_ENTRY_TYPE] != 34 ) ||
+             ( cache_ptr->read_protects[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->max_read_protects[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->insertions[MONSTER_ENTRY_TYPE] != 32 ) ||
+             ( cache_ptr->pinned_insertions[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->clears[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->flushes[MONSTER_ENTRY_TYPE] != 34 ) ||
+             ( cache_ptr->evictions[MONSTER_ENTRY_TYPE] != 33 ) ||
+             ( cache_ptr->take_ownerships[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->entry_flush_moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->cache_flush_moves[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pins[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->unpins[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->dirty_pins[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_flushes[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->pinned_clears[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->size_increases[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->size_decreases[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->entry_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->cache_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected monster size entry stats in check_stats__smoke_check_1(4).";
+        }
+    }
+
+    if ( pass ) {
+
+        if ( ( cache_ptr->total_ht_insertions != 33 ) ||
+             ( cache_ptr->total_ht_deletions != 33 ) ||
+             ( cache_ptr->successful_ht_searches != 33 ) ||
+             ( cache_ptr->total_successful_ht_search_depth != 99 ) ||
+             ( cache_ptr->failed_ht_searches != 33 ) ||
+             ( cache_ptr->total_failed_ht_search_depth != 52 ) ||
+             ( cache_ptr->max_index_len != 32 ) ||
+             ( cache_ptr->max_index_size != 2 * 1024 * 1024 ) ||
+             ( cache_ptr->max_clean_index_size != 2 * 1024 * 1024 ) ||
+             ( cache_ptr->max_dirty_index_size != 2 * 1024 * 1024 ) ||
+             ( cache_ptr->max_slist_len != 32 ) ||
+             ( cache_ptr->max_slist_size != 2 * 1024 * 1024 ) ||
+             ( cache_ptr->max_pl_len != 1 ) ||
+             ( cache_ptr->max_pl_size != 64 * 1024 ) ||
+             ( cache_ptr->max_pel_len != 0 ) ||
+             ( cache_ptr->max_pel_size != 0 ) ||
+             ( cache_ptr->calls_to_msic != 1 ) ||
+             ( cache_ptr->total_entries_skipped_in_msic != 0 ) ||
+             ( cache_ptr->total_entries_scanned_in_msic != 33 ) ||
+             ( cache_ptr->max_entries_skipped_in_msic != 0 ) ||
+             ( cache_ptr->max_entries_scanned_in_msic != 33 ) ||
+             ( cache_ptr->entries_scanned_to_make_space != 33 ) ||
+             ( cache_ptr->slist_scan_restarts != 0 ) ||
+             ( cache_ptr->LRU_scan_restarts != 0 ) ||
+             ( cache_ptr->hash_bucket_scan_restarts != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected cache stats in check_stats__smoke_check_1(4).";
+        }
+    }
+
+#if H5C_COLLECT_CACHE_ENTRY_STATS
+    if ( pass ) {
+
+        /* Note that most entry level stats are only updated on entry eviction */
+
+        if ( ( cache_ptr->max_accesses[MONSTER_ENTRY_TYPE] != 2 ) ||
+             ( cache_ptr->min_accesses[MONSTER_ENTRY_TYPE] != 1 ) ||
+             ( cache_ptr->max_clears[MONSTER_ENTRY_TYPE] != 0 ) ||
+             ( cache_ptr->max_flushes[MONSTER_ENTRY_TYPE] != 2 ) ||
+             ( cache_ptr->max_size[MONSTER_ENTRY_TYPE] != 64 * 1024 ) ||
+             ( cache_ptr->max_pins[MONSTER_ENTRY_TYPE] != 0 ) ) {
+
+            pass = FALSE;
+            failure_mssg = "Unexpected monster entry level stats in check_stats__smoke_check_1(4).";
+        }
+    }
+#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */
+
+    if ( pass ) {
+
+	reset_entries();
+    }
+
+    if ( pass ) {
+
+	/* reset cache min clean size to its expected value */
+        cache_ptr->min_clean_size = (1 * 1024 * 1024);
+    }
+
+    return;
+
+} /* check_stats__smoke_check_1() */
+
+#endif /* H5C_COLLECT_CACHE_STATS */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	main
+ *
+ * Purpose:	Run tests on the cache code contained in H5C.c
+ *
+ * Return:	Success:
+ *
+ *		Failure:
+ *
+ * Programmer:	John Mainzer
+ *              6/24/04
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int
+main(void)
+{
+    unsigned nerrs = 0;
+    int express_test;
+
+    H5open();
+
+    express_test = GetTestExpress();
+
+    printf("=========================================\n");
+    printf("Internal cache tests\n");
+    printf("        express_test = %d\n", express_test);
+    printf("=========================================\n");
+
+    nerrs += smoke_check_1(express_test);
+    nerrs += smoke_check_2(express_test);
+    nerrs += smoke_check_3(express_test);
+    nerrs += smoke_check_4(express_test);
+    nerrs += smoke_check_5(express_test);
+    nerrs += smoke_check_6(express_test);
+    nerrs += smoke_check_7(express_test);
+    nerrs += smoke_check_8(express_test);
+    nerrs += smoke_check_9(express_test);
+    nerrs += smoke_check_10(express_test);
+
+    nerrs += write_permitted_check(express_test);
+
+    nerrs += check_insert_entry();
+    nerrs += check_flush_cache();
+    nerrs += check_get_entry_status();
+    nerrs += check_expunge_entry();
+    nerrs += check_multiple_read_protect();
+    nerrs += check_move_entry();
+    nerrs += check_pin_protected_entry();
+    nerrs += check_resize_entry();
+    nerrs += check_evictions_enabled();
+    nerrs += check_flush_protected_err();
+    nerrs += check_destroy_pinned_err();
+    nerrs += check_destroy_protected_err();
+    nerrs += check_duplicate_insert_err();
+    nerrs += check_move_err();
+    nerrs += check_double_pin_err();
+    nerrs += check_double_unpin_err();
+    nerrs += check_pin_entry_errs();
+    nerrs += check_double_protect_err();
+    nerrs += check_double_unprotect_err();
+    nerrs += check_mark_entry_dirty_errs();
+    nerrs += check_expunge_entry_errs();
+    nerrs += check_resize_entry_errs();
+    nerrs += check_unprotect_ro_dirty_err();
+    nerrs += check_protect_ro_rw_err();
+    nerrs += check_protect_retries();
+    nerrs += check_check_evictions_enabled_err();
+    nerrs += check_auto_cache_resize(FALSE);
+    nerrs += check_auto_cache_resize(TRUE);
+    nerrs += check_auto_cache_resize_disable();
+    nerrs += check_auto_cache_resize_epoch_markers();
+    nerrs += check_auto_cache_resize_input_errs();
+    nerrs += check_auto_cache_resize_aux_fcns();
+    nerrs += check_metadata_blizzard_absence(TRUE);
     nerrs += check_metadata_blizzard_absence(FALSE);
+    nerrs += check_flush_deps();
+    nerrs += check_flush_deps_err();
+    nerrs += check_flush_deps_order();
+    nerrs += check_notify_cb();
+    nerrs += check_metadata_cork(TRUE);
+    nerrs += check_metadata_cork(FALSE);
+    nerrs += check_entry_deletions_during_scans(); /* OK NOW */
+    nerrs += check_stats();
 
     return(nerrs > 0);
-}
+} /* main() */
 
diff --git a/test/cache_api.c b/test/cache_api.c
index 8f556be..bebb828 100644
--- a/test/cache_api.c
+++ b/test/cache_api.c
@@ -25,6 +25,9 @@
 #include "H5ACprivate.h"
 #include "cache_common.h"
 
+/* extern declarations */
+
+extern const char *FILENAME[];
 
 /* global variable declarations: */
 
@@ -32,15 +35,15 @@
 
 /* private function declarations: */
 
-static void check_fapl_mdc_api_calls(void);
+static unsigned check_fapl_mdc_api_calls(void);
 
-static void check_file_mdc_api_calls(void);
+static unsigned check_file_mdc_api_calls(void);
 
-static void mdc_api_call_smoke_check(int express_test);
+static unsigned mdc_api_call_smoke_check(int express_test);
 
-static void check_fapl_mdc_api_errs(void);
+static unsigned check_fapl_mdc_api_errs(void);
 
-static void check_file_mdc_api_errs(void);
+static unsigned check_file_mdc_api_errs(void);
 
 

 /**************************************************************************/
@@ -67,10 +70,9 @@ static void check_file_mdc_api_errs(void);
  *
  *-------------------------------------------------------------------------
  */
-static void
+static unsigned
 check_fapl_mdc_api_calls(void)
 {
-    const char * fcn_name = "check_fapl_mdc_api_calls()";
     char filename[512];
     herr_t result;
     hid_t fapl_id = -1;
@@ -487,7 +489,9 @@ check_fapl_mdc_api_calls(void)
 
     if ( ! pass )
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
+
+    return !pass;
 
 } /* check_fapl_mdc_api_calls() */
 
@@ -516,10 +520,9 @@ check_fapl_mdc_api_calls(void)
  *-------------------------------------------------------------------------
  */
 
-static void
+static unsigned
 check_file_mdc_api_calls(void)
 {
-    const char * fcn_name = "check_file_mdc_api_calls()";
     char filename[512];
     hid_t file_id = -1;
     size_t max_size;
@@ -773,7 +776,7 @@ check_file_mdc_api_calls(void)
             pass = FALSE;
             failure_mssg = "H5Fget_mdc_hit_rate() failed 1.\n";
 
-        } else if ( hit_rate != 0.0f ) {
+        } else if ( !H5_DBL_ABS_EQUAL(hit_rate, (double)0.0f) ) {
 
             pass = FALSE;
             failure_mssg =
@@ -837,7 +840,9 @@ check_file_mdc_api_calls(void)
 
     if ( ! pass )
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
+
+    return !pass;
 
 } /* check_file_mdc_api_calls() */
 
@@ -865,10 +870,9 @@ check_file_mdc_api_calls(void)
 #define NUM_DSETS               6
 #define NUM_RANDOM_ACCESSES     200000
 
-static void
+static unsigned
 mdc_api_call_smoke_check(int express_test)
 {
-    const char * fcn_name = "mdc_api_call_smoke_check()";
     char filename[512];
     hbool_t valid_chunk;
     hbool_t dump_hit_rate = FALSE;
@@ -880,7 +884,7 @@ mdc_api_call_smoke_check(int express_test)
     hid_t filespace_ids[NUM_DSETS];
     hid_t memspace_id = -1;
     hid_t dataset_ids[NUM_DSETS];
-    hid_t properties;
+    hid_t properties = -1;
     char dset_name[64];
     int i, j, k, l, m, n;
     herr_t status;
@@ -1004,7 +1008,7 @@ mdc_api_call_smoke_check(int express_test)
 
         HDfprintf(stdout, "     Long tests disabled.\n");
 
-        return;
+        return 0;
     }
 
     pass = TRUE;
@@ -1105,7 +1109,7 @@ mdc_api_call_smoke_check(int express_test)
 
                 sprintf(dset_name, "/dset%03d", i);
                 dataset_ids[i] = H5Dcreate2(file_id, dset_name, H5T_STD_I32BE,
-                                           dataspace_id, H5P_DEFAULT, properties, H5P_DEFAULT);
+				            dataspace_id, H5P_DEFAULT, properties, H5P_DEFAULT);
 
                 if ( dataset_ids[i] < 0 ) {
 
@@ -1183,8 +1187,8 @@ mdc_api_call_smoke_check(int express_test)
                 }
 
                 /* select on disk hyperslab */
-                offset[0] = i; /*offset of hyperslab in file*/
-                offset[1] = j;
+                offset[0] = (hsize_t)i; /*offset of hyperslab in file*/
+                offset[1] = (hsize_t)j;
                 a_size[0] = CHUNK_SIZE;   /*size of hyperslab*/
                 a_size[1] = CHUNK_SIZE;
                 status = H5Sselect_hyperslab(filespace_ids[m], H5S_SELECT_SET,
@@ -1254,8 +1258,8 @@ mdc_api_call_smoke_check(int express_test)
         j = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE;
 
         /* select on disk hyperslab */
-        offset[0] = i; /*offset of hyperslab in file*/
-        offset[1] = j;
+        offset[0] = (hsize_t)i; /*offset of hyperslab in file*/
+        offset[1] = (hsize_t)j;
         a_size[0] = CHUNK_SIZE;   /*size of hyperslab*/
         a_size[1] = CHUNK_SIZE;
         status = H5Sselect_hyperslab(filespace_ids[m], H5S_SELECT_SET,
@@ -1329,9 +1333,9 @@ mdc_api_call_smoke_check(int express_test)
         }
 
         n++;
-
     }
 
+
     /* close the file spaces we are done with */
     i = 1;
     while ( ( pass ) && ( i < NUM_DSETS ) )
@@ -1379,8 +1383,8 @@ mdc_api_call_smoke_check(int express_test)
         j = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE;
 
         /* select on disk hyperslab */
-        offset[0] = i; /*offset of hyperslab in file*/
-        offset[1] = j;
+        offset[0] = (hsize_t)i; /*offset of hyperslab in file*/
+        offset[1] = (hsize_t)j;
         a_size[0] = CHUNK_SIZE;   /*size of hyperslab*/
         a_size[1] = CHUNK_SIZE;
         status = H5Sselect_hyperslab(filespace_ids[m], H5S_SELECT_SET,
@@ -1450,7 +1454,6 @@ mdc_api_call_smoke_check(int express_test)
         }
 
         n++;
-
     }
 
     /* close file space 0 */
@@ -1513,7 +1516,9 @@ mdc_api_call_smoke_check(int express_test)
 
     if ( ! pass )
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
+
+    return !pass;
 
 } /* mdc_api_call_smoke_check() */
 
@@ -1521,9 +1526,11 @@ mdc_api_call_smoke_check(int express_test)
 
 /* The following array of invalid external MDC cache configurations is
  * used to test error rejection in the MDC related API calls.
+ *
+ * Note: It is assumed that boolean parameters are only set to TRUE/FALSE.
  */
 
-#define NUM_INVALID_CONFIGS	42
+#define NUM_INVALID_CONFIGS	36
 
 H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 {
@@ -1563,112 +1570,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 1 -- bad rpt_fcn_enabled */
-    /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
-    /* hbool_t     rpt_fcn_enabled        = */ (hbool_t)-1,
-    /* hbool_t     open_trace_file        = */ FALSE,
-    /* hbool_t     close_trace_file       = */ FALSE,
-    /* char        trace_file_name[]      = */ "",
-    /* hbool_t     evictions_enabled      = */ TRUE,
-    /* hbool_t     set_initial_size       = */ TRUE,
-    /* size_t      initial_size           = */ (1 * 1024 * 1024),
-    /* double      min_clean_fraction     = */ 0.25f,
-    /* size_t      max_size               = */ (16 * 1024 * 1024),
-    /* size_t      min_size               = */ ( 1 * 1024 * 1024),
-    /* long int    epoch_length           = */ 50000,
-    /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
-    /* double      lower_hr_threshold     = */ 0.9f,
-    /* double      increment              = */ 2.0f,
-    /* hbool_t     apply_max_increment    = */ TRUE,
-    /* size_t      max_increment          = */ (4 * 1024 * 1024),
-    /* enum H5C_cache_flash_incr_mode       */
-    /*                    flash_incr_mode = */ H5C_flash_incr__off,
-    /* double      flash_multiple         = */ 2.0f,
-    /* double      flash_threshold        = */ 0.5f,
-    /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
-    /* double      upper_hr_threshold     = */ 0.999f,
-    /* double      decrement              = */ 0.9f,
-    /* hbool_t     apply_max_decrement    = */ TRUE,
-    /* size_t      max_decrement          = */ (1 * 1024 * 1024),
-    /* int         epochs_before_eviction = */ 3,
-    /* hbool_t     apply_empty_reserve    = */ TRUE,
-    /* double      empty_reserve          = */ 0.1f,
-    /* int         dirty_bytes_threshold  = */ (256 * 1024),
-    /* int	  metadata_write_strategy = */
-				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
-  },
-  {
-    /* 2 -- bad open_trace_file */
-    /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
-    /* hbool_t     rpt_fcn_enabled        = */ FALSE,
-    /* hbool_t     open_trace_file        = */ (hbool_t)-1,
-    /* hbool_t     close_trace_file       = */ FALSE,
-    /* char        trace_file_name[]      = */ "",
-    /* hbool_t     evictions_enabled      = */ TRUE,
-    /* hbool_t     set_initial_size       = */ TRUE,
-    /* size_t      initial_size           = */ (1 * 1024 * 1024),
-    /* double      min_clean_fraction     = */ 0.25f,
-    /* size_t      max_size               = */ (16 * 1024 * 1024),
-    /* size_t      min_size               = */ ( 1 * 1024 * 1024),
-    /* long int    epoch_length           = */ 50000,
-    /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
-    /* double      lower_hr_threshold     = */ 0.9f,
-    /* double      increment              = */ 2.0f,
-    /* hbool_t     apply_max_increment    = */ TRUE,
-    /* size_t      max_increment          = */ (4 * 1024 * 1024),
-    /* enum H5C_cache_flash_incr_mode       */
-    /*                    flash_incr_mode = */ H5C_flash_incr__off,
-    /* double      flash_multiple         = */ 2.0f,
-    /* double      flash_threshold        = */ 0.5f,
-    /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
-    /* double      upper_hr_threshold     = */ 0.999f,
-    /* double      decrement              = */ 0.9f,
-    /* hbool_t     apply_max_decrement    = */ TRUE,
-    /* size_t      max_decrement          = */ (1 * 1024 * 1024),
-    /* int         epochs_before_eviction = */ 3,
-    /* hbool_t     apply_empty_reserve    = */ TRUE,
-    /* double      empty_reserve          = */ 0.1f,
-    /* int         dirty_bytes_threshold  = */ (256 * 1024),
-    /* int	  metadata_write_strategy = */
-				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
-  },
-  {
-    /* 3 -- bad close_trace_file */
-    /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
-    /* hbool_t     rpt_fcn_enabled        = */ FALSE,
-    /* hbool_t     open_trace_file        = */ FALSE,
-    /* hbool_t     close_trace_file       = */ (hbool_t)-1,
-    /* char        trace_file_name[]      = */ "",
-    /* hbool_t     evictions_enabled      = */ TRUE,
-    /* hbool_t     set_initial_size       = */ TRUE,
-    /* size_t      initial_size           = */ (1 * 1024 * 1024),
-    /* double      min_clean_fraction     = */ 0.25f,
-    /* size_t      max_size               = */ (16 * 1024 * 1024),
-    /* size_t      min_size               = */ ( 1 * 1024 * 1024),
-    /* long int    epoch_length           = */ 50000,
-    /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
-    /* double      lower_hr_threshold     = */ 0.9f,
-    /* double      increment              = */ 2.0f,
-    /* hbool_t     apply_max_increment    = */ TRUE,
-    /* size_t      max_increment          = */ (4 * 1024 * 1024),
-    /* enum H5C_cache_flash_incr_mode       */
-    /*                    flash_incr_mode = */ H5C_flash_incr__off,
-    /* double      flash_multiple         = */ 2.0f,
-    /* double      flash_threshold        = */ 0.5f,
-    /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
-    /* double      upper_hr_threshold     = */ 0.999f,
-    /* double      decrement              = */ 0.9f,
-    /* hbool_t     apply_max_decrement    = */ TRUE,
-    /* size_t      max_decrement          = */ (1 * 1024 * 1024),
-    /* int         epochs_before_eviction = */ 3,
-    /* hbool_t     apply_empty_reserve    = */ TRUE,
-    /* double      empty_reserve          = */ 0.1f,
-    /* int         dirty_bytes_threshold  = */ (256 * 1024),
-    /* int	  metadata_write_strategy = */
-				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
-  },
-  {
-    /* 4 -- open_trace_file == TRUE and empty trace_file_name */
+    /* 1 -- open_trace_file == TRUE and empty trace_file_name */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ TRUE,
@@ -1703,42 +1605,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 5 -- bad set_initial_size */
-    /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
-    /* hbool_t     rpt_fcn_enabled        = */ FALSE,
-    /* hbool_t     open_trace_file        = */ FALSE,
-    /* hbool_t     close_trace_file       = */ FALSE,
-    /* char        trace_file_name[]      = */ "",
-    /* hbool_t     evictions_enabled      = */ TRUE,
-    /* hbool_t     set_initial_size       = */ 2,
-    /* size_t      initial_size           = */ (1 * 1024 * 1024),
-    /* double      min_clean_fraction     = */ 0.25f,
-    /* size_t      max_size               = */ (16 * 1024 * 1024),
-    /* size_t      min_size               = */ ( 1 * 1024 * 1024),
-    /* long int    epoch_length           = */ 50000,
-    /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
-    /* double      lower_hr_threshold     = */ 0.9f,
-    /* double      increment              = */ 2.0f,
-    /* hbool_t     apply_max_increment    = */ TRUE,
-    /* size_t      max_increment          = */ (4 * 1024 * 1024),
-    /* enum H5C_cache_flash_incr_mode       */
-    /*                    flash_incr_mode = */ H5C_flash_incr__off,
-    /* double      flash_multiple         = */ 2.0f,
-    /* double      flash_threshold        = */ 0.5f,
-    /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
-    /* double      upper_hr_threshold     = */ 0.999f,
-    /* double      decrement              = */ 0.9f,
-    /* hbool_t     apply_max_decrement    = */ TRUE,
-    /* size_t      max_decrement          = */ (1 * 1024 * 1024),
-    /* int         epochs_before_eviction = */ 3,
-    /* hbool_t     apply_empty_reserve    = */ TRUE,
-    /* double      empty_reserve          = */ 0.1f,
-    /* int         dirty_bytes_threshold  = */ (256 * 1024),
-    /* int	  metadata_write_strategy = */
-				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
-  },
-  {
-    /* 6 -- max_size too big */
+    /* 2 -- max_size too big */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -1773,7 +1640,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 7 -- min_size too small */
+    /* 3 -- min_size too small */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -1808,7 +1675,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 8 -- min_size > max_size */
+    /* 4 -- min_size > max_size */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -1843,7 +1710,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 9 -- initial size out of range (too big) */
+    /* 5 -- initial size out of range (too big) */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -1878,7 +1745,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 10 -- initial_size out of range (too small) */
+    /* 6 -- initial_size out of range (too small) */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -1913,7 +1780,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 11 -- min_clean_fraction too big */
+    /* 7 -- min_clean_fraction too big */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -1948,7 +1815,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 12 -- min_clean_fraction too small */
+    /* 8 -- min_clean_fraction too small */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -1983,7 +1850,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 13 -- epoch_length too small */
+    /* 9 -- epoch_length too small */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2018,7 +1885,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 14 -- epoch_length too big */
+    /* 10 -- epoch_length too big */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2053,7 +1920,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 15 -- invalid incr_mode */
+    /* 11 -- invalid incr_mode */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2088,7 +1955,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 16 -- lower_hr_threshold too small */
+    /* 12 -- lower_hr_threshold too small */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2123,7 +1990,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 17 -- lower_hr_threshold too big */
+    /* 13 -- lower_hr_threshold too big */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2158,7 +2025,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 18 -- increment too small */
+    /* 14 -- increment too small */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2193,42 +2060,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 19 -- bad apply_max_increment */
-    /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
-    /* hbool_t     rpt_fcn_enabled        = */ FALSE,
-    /* hbool_t     open_trace_file        = */ FALSE,
-    /* hbool_t     close_trace_file       = */ FALSE,
-    /* char        trace_file_name[]      = */ "",
-    /* hbool_t     evictions_enabled      = */ TRUE,
-    /* hbool_t     set_initial_size       = */ TRUE,
-    /* size_t      initial_size           = */ (1 * 1024 * 1024),
-    /* double      min_clean_fraction     = */ 0.25f,
-    /* size_t      max_size               = */ (16 * 1024 * 1024),
-    /* size_t      min_size               = */ ( 1 * 1024 * 1024),
-    /* long int    epoch_length           = */ 50000,
-    /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
-    /* double      lower_hr_threshold     = */ 0.9f,
-    /* double      increment              = */ 2.0f,
-    /* hbool_t     apply_max_increment    = */ (hbool_t)-1,
-    /* size_t      max_increment          = */ (4 * 1024 * 1024),
-    /* enum H5C_cache_flash_incr_mode       */
-    /*                    flash_incr_mode = */ H5C_flash_incr__off,
-    /* double      flash_multiple         = */ 2.0f,
-    /* double      flash_threshold        = */ 0.5f,
-    /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
-    /* double      upper_hr_threshold     = */ 0.999f,
-    /* double      decrement              = */ 0.9f,
-    /* hbool_t     apply_max_decrement    = */ TRUE,
-    /* size_t      max_decrement          = */ (1 * 1024 * 1024),
-    /* int         epochs_before_eviction = */ 3,
-    /* hbool_t     apply_empty_reserve    = */ TRUE,
-    /* double      empty_reserve          = */ 0.1f,
-    /* int         dirty_bytes_threshold  = */ (256 * 1024),
-    /* int	  metadata_write_strategy = */
-				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
-  },
-  {
-    /* 20 -- invalid flash_incr_mode */
+    /* 15 -- invalid flash_incr_mode */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2263,7 +2095,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 21 -- flash_multiple too small */
+    /* 16 -- flash_multiple too small */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2298,7 +2130,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 22 -- flash_multiple too big */
+    /* 17 -- flash_multiple too big */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2333,7 +2165,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 23 -- flash_threshold too small */
+    /* 18 -- flash_threshold too small */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2368,7 +2200,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 24 -- flash_threshold too big */
+    /* 19 -- flash_threshold too big */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2403,7 +2235,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 25 -- bad decr_mode */
+    /* 20 -- bad decr_mode */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2438,7 +2270,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 26 -- upper_hr_threshold too big */
+    /* 21 -- upper_hr_threshold too big */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2473,7 +2305,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 27 -- decrement too small */
+    /* 22 -- decrement too small */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2508,7 +2340,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 28 -- decrement too big */
+    /* 23 -- decrement too big */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2543,7 +2375,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 29 -- epochs_before_eviction too small */
+    /* 24 -- epochs_before_eviction too small */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2578,7 +2410,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 30 -- epochs_before_eviction too big */
+    /* 25 -- epochs_before_eviction too big */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2613,42 +2445,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 31 -- invalid apply_empty_reserve */
-    /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
-    /* hbool_t     rpt_fcn_enabled        = */ FALSE,
-    /* hbool_t     open_trace_file        = */ FALSE,
-    /* hbool_t     close_trace_file       = */ FALSE,
-    /* char        trace_file_name[]      = */ "",
-    /* hbool_t     evictions_enabled      = */ TRUE,
-    /* hbool_t     set_initial_size       = */ TRUE,
-    /* size_t      initial_size           = */ (1 * 1024 * 1024),
-    /* double      min_clean_fraction     = */ 0.25f,
-    /* size_t      max_size               = */ (16 * 1024 * 1024),
-    /* size_t      min_size               = */ ( 1 * 1024 * 1024),
-    /* long int    epoch_length           = */ 50000,
-    /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold,
-    /* double      lower_hr_threshold     = */ 0.9f,
-    /* double      increment              = */ 2.0f,
-    /* hbool_t     apply_max_increment    = */ TRUE,
-    /* size_t      max_increment          = */ (4 * 1024 * 1024),
-    /* enum H5C_cache_flash_incr_mode       */
-    /*                    flash_incr_mode = */ H5C_flash_incr__off,
-    /* double      flash_multiple         = */ 2.0f,
-    /* double      flash_threshold        = */ 0.5f,
-    /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold,
-    /* double      upper_hr_threshold     = */ 0.999f,
-    /* double      decrement              = */ 0.9f,
-    /* hbool_t     apply_max_decrement    = */ TRUE,
-    /* size_t      max_decrement          = */ (1 * 1024 * 1024),
-    /* int         epochs_before_eviction = */ 3,
-    /* hbool_t     apply_empty_reserve    = */ 2,
-    /* double      empty_reserve          = */ 0.1f,
-    /* int         dirty_bytes_threshold  = */ (256 * 1024),
-    /* int	  metadata_write_strategy = */
-				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
-  },
-  {
-    /* 32 -- empty_reserve too small */
+    /* 26 -- empty_reserve too small */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2683,7 +2480,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 33 -- empty_reserve too big */
+    /* 27 -- empty_reserve too big */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2718,7 +2515,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 34 -- upper_hr_threshold too small */
+    /* 28 -- upper_hr_threshold too small */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2753,7 +2550,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 35 -- upper_hr_threshold too big */
+    /* 29 -- upper_hr_threshold too big */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2788,7 +2585,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 36 -- upper_hr_threshold <= lower_hr_threshold */
+    /* 30 -- upper_hr_threshold <= lower_hr_threshold */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2823,7 +2620,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 37 -- dirty_bytes_threshold too small */
+    /* 31 -- dirty_bytes_threshold too small */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2858,7 +2655,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 38 -- dirty_bytes_threshold too big */
+    /* 32 -- dirty_bytes_threshold too big */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2893,7 +2690,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 39 -- attempt to disable evictions when auto incr enabled */
+    /* 33 -- attempt to disable evictions when auto incr enabled */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2928,7 +2725,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 40 -- attempt to disable evictions when auto decr enabled */
+    /* 34 -- attempt to disable evictions when auto decr enabled */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -2963,7 +2760,7 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
 				      H5AC__DEFAULT_METADATA_WRITE_STRATEGY
   },
   {
-    /* 41 -- unknown metadata write strategy */
+    /* 35 -- unknown metadata write strategy */
     /* int         version                = */ H5C__CURR_AUTO_SIZE_CTL_VER,
     /* hbool_t     rpt_fcn_enabled        = */ FALSE,
     /* hbool_t     open_trace_file        = */ FALSE,
@@ -3015,10 +2812,9 @@ H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] =
  *-------------------------------------------------------------------------
  */
 
-static void
+static unsigned
 check_fapl_mdc_api_errs(void)
 {
-    const char * fcn_name = "check_fapl_mdc_api_errs()";
     static char msg[128];
     int i;
     herr_t result;
@@ -3065,7 +2861,7 @@ check_fapl_mdc_api_errs(void)
 
     scratch.version = H5C__CURR_AUTO_SIZE_CTL_VER;
     if ( ( pass ) &&
-         ( ( H5Pget_mdc_config(fapl_id, &scratch) < 0 ) ||
+         ( ( H5Pget_mdc_config(fapl_id, &scratch) < 0) ||
            ( !CACHE_CONFIGS_EQUAL(default_config, scratch, TRUE, TRUE) ) ) ) {
 
         pass = FALSE;
@@ -3165,7 +2961,9 @@ check_fapl_mdc_api_errs(void)
 
     if ( ! pass )
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
+
+    return !pass;
 
 } /* check_fapl_mdc_api_errs() */
 
@@ -3186,10 +2984,9 @@ check_fapl_mdc_api_errs(void)
  *-------------------------------------------------------------------------
  */
 
-static void
+static unsigned
 check_file_mdc_api_errs(void)
 {
-    const char * fcn_name = "check_file_mdc_api_errs()";
     char filename[512];
     static char msg[128];
     hbool_t show_progress = FALSE;
@@ -3217,7 +3014,7 @@ check_file_mdc_api_errs(void)
 
 	if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: calling h5_fixname().\n", fcn_name);
+	    HDfprintf(stdout, "%s: calling h5_fixname().\n", FUNC);
 	}
 
         if ( h5_fixname(FILENAME[1], H5P_DEFAULT, filename, sizeof(filename))
@@ -3232,7 +3029,7 @@ check_file_mdc_api_errs(void)
 
 	if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: calling H5Fcreate().\n", fcn_name);
+	    HDfprintf(stdout, "%s: calling H5Fcreate().\n", FUNC);
 	}
 
         file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
@@ -3254,7 +3051,7 @@ check_file_mdc_api_errs(void)
 
 	if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: testing H5Fget_mdc_config() 1.\n", fcn_name);
+	    HDfprintf(stdout, "%s: testing H5Fget_mdc_config() 1.\n", FUNC);
 	}
 
         H5E_BEGIN_TRY {
@@ -3272,7 +3069,7 @@ check_file_mdc_api_errs(void)
 
 	if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: testing H5Fget_mdc_config() 2.\n", fcn_name);
+	    HDfprintf(stdout, "%s: testing H5Fget_mdc_config() 2.\n", FUNC);
 	}
 
         H5E_BEGIN_TRY {
@@ -3291,7 +3088,7 @@ check_file_mdc_api_errs(void)
 
 	if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: testing H5Fget_mdc_config() 3.\n", fcn_name);
+	    HDfprintf(stdout, "%s: testing H5Fget_mdc_config() 3.\n", FUNC);
 	}
 
         H5E_BEGIN_TRY {
@@ -3313,7 +3110,7 @@ check_file_mdc_api_errs(void)
 
 	if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: testing H5Fset_mdc_config() 1.\n", fcn_name);
+	    HDfprintf(stdout, "%s: testing H5Fset_mdc_config() 1.\n", FUNC);
 	}
 
         H5E_BEGIN_TRY {
@@ -3331,7 +3128,7 @@ check_file_mdc_api_errs(void)
 
 	if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: testing H5Fset_mdc_config() 2.\n", fcn_name);
+	    HDfprintf(stdout, "%s: testing H5Fset_mdc_config() 2.\n", FUNC);
 	}
 
         H5E_BEGIN_TRY {
@@ -3352,7 +3149,7 @@ check_file_mdc_api_errs(void)
 
 	    HDfprintf(stdout,
 		    "%s: testing H5Fset_mdc_config() with invalid config %d.\n",
-		    fcn_name, i);
+		    FUNC, i);
 	}
 
         H5E_BEGIN_TRY {
@@ -3381,7 +3178,7 @@ check_file_mdc_api_errs(void)
 	if ( show_progress ) {
 
 	    HDfprintf(stdout, "%s: testing H5Fget_mdc_hit_rate() 1.\n",
-		      fcn_name);
+		      FUNC);
 	}
 
         H5E_BEGIN_TRY {
@@ -3400,7 +3197,7 @@ check_file_mdc_api_errs(void)
 	if ( show_progress ) {
 
 	    HDfprintf(stdout, "%s: testing H5Fget_mdc_hit_rate() 2.\n",
-		      fcn_name);
+		      FUNC);
 	}
 
         H5E_BEGIN_TRY {
@@ -3421,7 +3218,7 @@ check_file_mdc_api_errs(void)
 	if ( show_progress ) {
 
 	    HDfprintf(stdout, "%s: testing H5Freset_mdc_hit_rate_stats().\n",
-		      fcn_name);
+		      FUNC);
 	}
 
         H5E_BEGIN_TRY {
@@ -3442,7 +3239,7 @@ check_file_mdc_api_errs(void)
 
 	if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: testing H5Fget_mdc_size() 1.\n", fcn_name);
+	    HDfprintf(stdout, "%s: testing H5Fget_mdc_size() 1.\n", FUNC);
 	}
 
         H5E_BEGIN_TRY {
@@ -3461,7 +3258,7 @@ check_file_mdc_api_errs(void)
 
 	if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: testing H5Fget_mdc_size() 2.\n", fcn_name);
+	    HDfprintf(stdout, "%s: testing H5Fget_mdc_size() 2.\n", FUNC);
 	}
 
         if ( ( H5Fget_mdc_size(file_id, &max_size, NULL, NULL, NULL) < 0 ) ||
@@ -3483,7 +3280,7 @@ check_file_mdc_api_errs(void)
 
 	if ( show_progress ) {
 
-	    HDfprintf(stdout, "%s: cleaning up from tests.\n", fcn_name);
+	    HDfprintf(stdout, "%s: cleaning up from tests.\n", FUNC);
 	}
 
         if ( H5Fclose(file_id) < 0  ) {
@@ -3502,7 +3299,9 @@ check_file_mdc_api_errs(void)
 
     if ( ! pass )
         HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n",
-                  fcn_name, failure_mssg);
+                  FUNC, failure_mssg);
+
+    return !pass;
 
 } /* check_file_mdc_api_errs() */
 
@@ -3527,28 +3326,35 @@ check_file_mdc_api_errs(void)
 int
 main(void)
 {
+    unsigned nerrs = 0;
     int express_test;
 
     H5open();
 
     express_test = GetTestExpress();
 
+    printf("===================================\n");
+    printf("Cache API tests\n");
+    printf("        express_test = %d\n", express_test);
+    printf("===================================\n");
+
+
 #if 1
-    check_fapl_mdc_api_calls();
+    nerrs += check_fapl_mdc_api_calls();
 #endif
 #if 1
-    check_file_mdc_api_calls();
+    nerrs += check_file_mdc_api_calls();
 #endif
 #if 1
-    mdc_api_call_smoke_check(express_test);
+    nerrs += mdc_api_call_smoke_check(express_test);
 #endif
 #if 1
-    check_fapl_mdc_api_errs();
+    nerrs += check_fapl_mdc_api_errs();
 #endif
 #if 1
-    check_file_mdc_api_errs();
+    nerrs += check_file_mdc_api_errs();
 #endif
 
-    return(0);
+    return( nerrs > 0 );
 
 } /* main() */
diff --git a/test/cache_common.c b/test/cache_common.c
index 5fe68db..0433f1c 100644
--- a/test/cache_common.c
+++ b/test/cache_common.c
@@ -19,11 +19,12 @@
  *		This file contains common code for tests of the cache
  *		implemented in H5C.c
  */
-#include "H5private.h"          /* Put this first, so H5open() isn't invoked in public macros */
 #include "h5test.h"
 #include "H5Cprivate.h"
+#include "H5ACprivate.h"
 #include "H5Iprivate.h"
 #include "H5MFprivate.h"
+#include "H5MMprivate.h"
 #include "cache_common.h"
 
 
@@ -58,8 +59,6 @@ haddr_t saved_actual_base_addr = HADDR_UNDEF;   /* Store the address of the
 
 hbool_t write_permitted = TRUE;
 hbool_t pass = TRUE; /* set to false on error */
-hbool_t skip_long_tests = TRUE;
-hbool_t run_full_test = TRUE;
 hbool_t try_core_file_driver = FALSE;
 hbool_t core_file_driver_failed = FALSE;
 const char *failure_mssg = NULL;
@@ -74,75 +73,177 @@ static test_entry_t large_entries[NUM_LARGE_ENTRIES], orig_large_entries[NUM_LAR
 static test_entry_t huge_entries[NUM_HUGE_ENTRIES], orig_huge_entries[NUM_HUGE_ENTRIES];
 static test_entry_t monster_entries[NUM_MONSTER_ENTRIES], orig_monster_entries[NUM_MONSTER_ENTRIES];
 static test_entry_t variable_entries[NUM_VARIABLE_ENTRIES], orig_variable_entries[NUM_VARIABLE_ENTRIES];
+static test_entry_t notify_entries[NUM_NOTIFY_ENTRIES], orig_notify_entries[NUM_NOTIFY_ENTRIES];
 
 hbool_t orig_entry_arrays_init = FALSE;
 
-static herr_t pico_clear(H5F_t * f, void *  thing, hbool_t dest);
-static herr_t nano_clear(H5F_t * f, void *  thing, hbool_t dest);
-static herr_t micro_clear(H5F_t * f, void *  thing, hbool_t dest);
-static herr_t tiny_clear(H5F_t * f, void *  thing, hbool_t dest);
-static herr_t small_clear(H5F_t * f, void *  thing, hbool_t dest);
-static herr_t medium_clear(H5F_t * f, void *  thing, hbool_t dest);
-static herr_t large_clear(H5F_t * f, void *  thing, hbool_t dest);
-static herr_t huge_clear(H5F_t * f, void *  thing, hbool_t dest);
-static herr_t monster_clear(H5F_t * f, void *  thing, hbool_t dest);
-static herr_t variable_clear(H5F_t * f, void *  thing, hbool_t dest);
-
-static herr_t pico_dest(H5F_t * f, void * thing);
-static herr_t nano_dest(H5F_t * f, void * thing);
-static herr_t micro_dest(H5F_t * f, void * thing);
-static herr_t tiny_dest(H5F_t * f, void * thing);
-static herr_t small_dest(H5F_t * f, void * thing);
-static herr_t medium_dest(H5F_t * f, void * thing);
-static herr_t large_dest(H5F_t * f, void * thing);
-static herr_t huge_dest(H5F_t * f, void *  thing);
-static herr_t monster_dest(H5F_t * f, void *  thing);
-static herr_t variable_dest(H5F_t * f, void *  thing);
-
-static herr_t pico_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest,
-                  haddr_t addr, void *thing, unsigned * flags_ptr);
-static herr_t nano_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest,
-                  haddr_t addr, void *thing, unsigned * flags_ptr);
-static herr_t micro_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest,
-                   haddr_t addr, void *thing, unsigned * flags_ptr);
-static herr_t tiny_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest,
-                  haddr_t addr, void *thing, unsigned * flags_ptr);
-static herr_t small_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest,
-                   haddr_t addr, void *thing, unsigned * flags_ptr);
-static herr_t medium_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest,
-                    haddr_t addr, void *thing, unsigned * flags_ptr);
-static herr_t large_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest,
-                   haddr_t addr, void *thing, unsigned * flags_ptr);
-static herr_t huge_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest,
-                  haddr_t addr, void *thing, unsigned * flags_ptr);
-static herr_t monster_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest,
-                     haddr_t addr, void *thing, unsigned * flags_ptr);
-static herr_t variable_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest,
-                      haddr_t addr, void *thing, unsigned * flags_ptr);
-
-static void * pico_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static void * nano_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static void * micro_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static void * tiny_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static void * small_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static void * medium_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static void * large_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static void * huge_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static void * monster_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static void * variable_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-
-static herr_t pico_size(H5F_t * f, void * thing, size_t * size_ptr);
-static herr_t nano_size(H5F_t * f, void * thing, size_t * size_ptr);
-static herr_t micro_size(H5F_t * f, void * thing, size_t * size_ptr);
-static herr_t tiny_size(H5F_t * f, void * thing, size_t * size_ptr);
-static herr_t small_size(H5F_t * f, void * thing, size_t * size_ptr);
-static herr_t medium_size(H5F_t * f, void * thing, size_t * size_ptr);
-static herr_t large_size(H5F_t * f, void * thing, size_t * size_ptr);
-static herr_t huge_size(H5F_t * f, void * thing, size_t * size_ptr);
-static herr_t monster_size(H5F_t * f, void * thing, size_t * size_ptr);
-static herr_t variable_size(H5F_t * f, void * thing, size_t * size_ptr);
-
-test_entry_t * entries[NUMBER_OF_ENTRY_TYPES] =
+static herr_t pico_get_load_size(const void *image_ptr, void *udata_ptr, 
+    size_t *image_len_ptr, size_t *actual_len);
+static herr_t nano_get_load_size(const void *image_ptr, void *udata_ptr,
+    size_t *image_len_ptr, size_t *actual_len);
+static herr_t micro_get_load_size(const void *image_ptr, void *udata_ptr, 
+    size_t *image_len_ptr, size_t *actual_len);
+static herr_t tiny_get_load_size(const void *image_ptr, void *udata_ptr, 
+    size_t *image_len_ptr, size_t *actual_len);
+static herr_t small_get_load_size(const void *image_ptr, void *udata_ptr,
+    size_t *image_len_ptr, size_t *actual_len);
+static herr_t medium_get_load_size(const void *image_ptr, void *udata_ptr,
+    size_t *image_len_ptr, size_t *actual_len);
+static herr_t large_get_load_size(const void *image_ptr, void *udata_ptr,
+    size_t *image_len_ptr, size_t *actual_len);
+static herr_t huge_get_load_size(const void *image_ptr, void *udata_ptr,
+    size_t *image_len_ptr, size_t *actual_len);
+static herr_t monster_get_load_size(const void *image_ptr, void *udata_ptr, 
+    size_t *image_len_ptr, size_t *actual_len);
+static herr_t variable_get_load_size(const void *image_ptr, void *udata_ptr,
+    size_t *image_len_ptr, size_t *actual_len);
+static herr_t notify_get_load_size(const void *image_ptr, void *udata_ptr,
+    size_t *image_len_ptr, size_t *actual_len);
+
+static htri_t variable_verify_chksum(const void *image_ptr, size_t len, void *udata_ptr);
+
+static void *pico_deserialize(const void *image_ptr, size_t len, void *udata_ptr,
+    hbool_t *dirty_ptr);
+static void *nano_deserialize(const void *image_ptr, size_t len, void *udata_ptr,
+    hbool_t *dirty_ptr);
+static void *micro_deserialize(const void *image_ptr, size_t len, void *udata_ptr,
+    hbool_t *dirty_ptr);
+static void *tiny_deserialize(const void *image_ptr, size_t len, void *udata_ptr,
+    hbool_t *dirty_ptr);
+static void *small_deserialize(const void *image_ptr, size_t len, void *udata_ptr,
+    hbool_t *dirty_ptr);
+static void *medium_deserialize(const void *image_ptr, size_t len, void *udata_ptr,
+    hbool_t *dirty_ptr);
+static void *large_deserialize(const void *image_ptr, size_t len, void *udata_ptr,
+    hbool_t *dirty_ptr);
+static void *huge_deserialize(const void *image_ptr, size_t len, void *udata_ptr,
+    hbool_t *dirty_ptr);
+static void *monster_deserialize(const void *image_ptr, size_t len, void *udata_ptr,
+    hbool_t *dirty_ptr);
+static void *variable_deserialize(const void *image_ptr, size_t len, void *udata_ptr,
+    hbool_t *dirty_ptr);
+static void *notify_deserialize(const void *image_ptr, size_t len, void *udata_ptr,
+    hbool_t *dirty_ptr);
+
+static herr_t pico_image_len(void *thing, size_t *image_len_ptr, 
+    hbool_t *compressed_ptr, size_t * compressed_len_ptr);
+static herr_t nano_image_len(void *thing, size_t *image_len_ptr,
+    hbool_t *compressed_ptr, size_t * compressed_len_ptr);
+static herr_t micro_image_len(void *thing, size_t *image_len_ptr,
+    hbool_t *compressed_ptr, size_t * compressed_len_ptr);
+static herr_t tiny_image_len(void *thing, size_t *image_len_ptr,
+    hbool_t *compressed_ptr, size_t * compressed_len_ptr);
+static herr_t small_image_len(void *thing, size_t *image_len_ptr,
+    hbool_t *compressed_ptr, size_t * compressed_len_ptr);
+static herr_t medium_image_len(void *thing, size_t *image_len_ptr,
+    hbool_t *compressed_ptr, size_t * compressed_len_ptr);
+static herr_t large_image_len(void *thing, size_t *image_len_ptr,
+    hbool_t *compressed_ptr, size_t * compressed_len_ptr);
+static herr_t huge_image_len(void *thing, size_t *image_len_ptr,
+    hbool_t *compressed_ptr, size_t * compressed_len_ptr);
+static herr_t monster_image_len(void *thing, size_t *image_len_ptr,
+    hbool_t *compressed_ptr, size_t * compressed_len_ptr);
+static herr_t variable_image_len(void *thing, size_t *image_len_ptr,
+    hbool_t *compressed_ptr, size_t * compressed_len_ptr);
+static herr_t notify_image_len(void *thing, size_t *image_len_ptr,
+    hbool_t *compressed_ptr, size_t * compressed_len_ptr);
+
+static herr_t pico_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *thing,
+    haddr_t addr, size_t len, size_t compressed_len, haddr_t *new_addr_ptr, 
+    size_t *new_len_ptr, size_t *new_compressed_len_ptr, unsigned *flags_ptr);
+static herr_t nano_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *thing,
+    haddr_t addr, size_t len, size_t compressed_len, haddr_t *new_addr_ptr, 
+    size_t *new_len_ptr, size_t *new_compressed_len_ptr, unsigned *flags_ptr);
+static herr_t micro_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *thing,
+    haddr_t addr, size_t len, size_t compressed_len, haddr_t *new_addr_ptr, 
+    size_t *new_len_ptr, size_t *new_compressed_len_ptr, unsigned *flags_ptr);
+static herr_t tiny_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *thing,
+    haddr_t addr, size_t len, size_t compressed_len, haddr_t *new_addr_ptr, 
+    size_t *new_len_ptr, size_t *new_compressed_len_ptr, unsigned *flags_ptr);
+static herr_t small_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *thing,
+    haddr_t addr, size_t len, size_t compressed_len, haddr_t *new_addr_ptr, 
+    size_t *new_len_ptr, size_t *new_compressed_len_ptr, unsigned *flags_ptr);
+static herr_t medium_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *thing,
+    haddr_t addr, size_t len, size_t compressed_len, haddr_t *new_addr_ptr, 
+    size_t *new_len_ptr, size_t *new_compressed_len_ptr, unsigned *flags_ptr);
+static herr_t large_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *thing,
+    haddr_t addr, size_t len, size_t compressed_len, haddr_t *new_addr_ptr, 
+    size_t *new_len_ptr, size_t *new_compressed_len_ptr, unsigned *flags_ptr);
+static herr_t huge_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *thing,
+    haddr_t addr, size_t len, size_t compressed_len, haddr_t *new_addr_ptr, 
+    size_t *new_len_ptr, size_t *new_compressed_len_ptr, unsigned *flags_ptr);
+static herr_t monster_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *thing,
+    haddr_t addr, size_t len, size_t compressed_len, haddr_t *new_addr_ptr, 
+    size_t *new_len_ptr, size_t *new_compressed_len_ptr, unsigned *flags_ptr);
+static herr_t variable_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *thing,
+    haddr_t addr, size_t len, size_t compressed_len, haddr_t *new_addr_ptr, 
+    size_t *new_len_ptr, size_t *new_compressed_len_ptr, unsigned *flags_ptr);
+static herr_t notify_pre_serialize(const H5F_t *f, hid_t dxpl_id, void *thing,
+    haddr_t addr, size_t len, size_t compressed_len, haddr_t *new_addr_ptr, 
+    size_t *new_len_ptr, size_t *new_compressed_len_ptr, unsigned *flags_ptr);
+
+static herr_t pico_serialize(const H5F_t *f, void *image_ptr,
+    size_t len, void *thing);
+static herr_t nano_serialize(const H5F_t *f, void *image_ptr,
+    size_t len,  void *thing);
+static herr_t micro_serialize(const H5F_t *f, void *image_ptr,
+    size_t len, void *thing);
+static herr_t tiny_serialize(const H5F_t *f, void *image_ptr,
+    size_t len, void *thing);
+static herr_t small_serialize(const H5F_t *f, void *image_ptr,
+    size_t len, void *thing);
+static herr_t medium_serialize(const H5F_t *f, void *image_ptr,
+    size_t len, void *thing);
+static herr_t large_serialize(const H5F_t *f, void *image_ptr,
+    size_t len, void *thing);
+static herr_t huge_serialize(const H5F_t *f, void *image_ptr,
+    size_t len, void *thing);
+static herr_t monster_serialize(const H5F_t *f, void *image_ptr,
+    size_t len, void *thing);
+static herr_t variable_serialize(const H5F_t *f, void *image_ptr,
+    size_t len, void *thing);
+static herr_t notify_serialize(const H5F_t *f, void *image_ptr,
+    size_t len, void *thing);
+
+static herr_t pico_free_icr(void *thing);
+static herr_t nano_free_icr(void *thing);
+static herr_t micro_free_icr(void *thing);
+static herr_t tiny_free_icr(void *thing);
+static herr_t small_free_icr(void *thing);
+static herr_t medium_free_icr(void *thing);
+static herr_t large_free_icr(void *thing);
+static herr_t huge_free_icr(void *thing);
+static herr_t monster_free_icr(void *thing);
+static herr_t variable_free_icr(void *thing);
+static herr_t notify_free_icr(void *thing);
+
+
+static herr_t notify_notify(H5C_notify_action_t action, void *thing);
+
+static void mark_flush_dep_dirty(test_entry_t * entry_ptr);
+static void mark_flush_dep_clean(test_entry_t * entry_ptr);
+
+/* Generic callback routines */
+static herr_t get_load_size(const void *image_ptr, void *udata_ptr, size_t *image_len_ptr,
+    size_t *actual_len_ptr, int32_t entry_type);
+static void *deserialize(const void *image_ptr, size_t len, void *udata_ptr,
+    hbool_t *dirty_ptr, int32_t entry_type);
+static herr_t image_len(void *thing, size_t *image_len_ptr, int32_t entry_type);
+static herr_t pre_serialize(const H5F_t *f, hid_t dxpl_id, void *thing,
+    haddr_t addr, size_t len, haddr_t *new_addr_ptr, size_t *new_len_ptr, 
+    unsigned *flags_ptr);
+static herr_t serialize(const H5F_t *f, void *image_ptr, size_t len, 
+    void *thing);
+static herr_t notify(H5C_notify_action_t action, void *thing, int32_t 
+    entry_type);
+static herr_t free_icr(test_entry_t *entry, int32_t entry_type);
+
+/* Local routines */
+static void execute_flush_op(H5F_t *file_ptr, struct test_entry_t *entry_ptr,
+    struct flush_op *op_ptr, unsigned *flags_ptr);
+
+
+test_entry_t *entries[NUMBER_OF_ENTRY_TYPES] =
 {
     pico_entries,
     nano_entries,
@@ -153,10 +254,11 @@ test_entry_t * entries[NUMBER_OF_ENTRY_TYPES] =
     large_entries,
     huge_entries,
     monster_entries,
-    variable_entries
+    variable_entries,
+    notify_entries
 };
 
-test_entry_t * orig_entries[NUMBER_OF_ENTRY_TYPES] =
+test_entry_t *orig_entries[NUMBER_OF_ENTRY_TYPES] =
 {
     orig_pico_entries,
     orig_nano_entries,
@@ -167,7 +269,8 @@ test_entry_t * orig_entries[NUMBER_OF_ENTRY_TYPES] =
     orig_large_entries,
     orig_huge_entries,
     orig_monster_entries,
-    orig_variable_entries
+    orig_variable_entries,
+    orig_notify_entries
 };
 
 const int32_t max_indices[NUMBER_OF_ENTRY_TYPES] =
@@ -181,7 +284,8 @@ const int32_t max_indices[NUMBER_OF_ENTRY_TYPES] =
     NUM_LARGE_ENTRIES - 1,
     NUM_HUGE_ENTRIES - 1,
     NUM_MONSTER_ENTRIES - 1,
-    NUM_VARIABLE_ENTRIES - 1
+    NUM_VARIABLE_ENTRIES - 1,
+    NUM_NOTIFY_ENTRIES - 1
 };
 
 const size_t entry_sizes[NUMBER_OF_ENTRY_TYPES] =
@@ -195,7 +299,8 @@ const size_t entry_sizes[NUMBER_OF_ENTRY_TYPES] =
     LARGE_ENTRY_SIZE,
     HUGE_ENTRY_SIZE,
     MONSTER_ENTRY_SIZE,
-    VARIABLE_ENTRY_SIZE
+    VARIABLE_ENTRY_SIZE,
+    NOTIFY_ENTRY_SIZE
 };
 
 const haddr_t base_addrs[NUMBER_OF_ENTRY_TYPES] =
@@ -209,7 +314,8 @@ const haddr_t base_addrs[NUMBER_OF_ENTRY_TYPES] =
     LARGE_BASE_ADDR,
     HUGE_BASE_ADDR,
     MONSTER_BASE_ADDR,
-    VARIABLE_BASE_ADDR
+    VARIABLE_BASE_ADDR,
+    NOTIFY_BASE_ADDR
 };
 
 const haddr_t alt_base_addrs[NUMBER_OF_ENTRY_TYPES] =
@@ -223,10 +329,11 @@ const haddr_t alt_base_addrs[NUMBER_OF_ENTRY_TYPES] =
     LARGE_ALT_BASE_ADDR,
     HUGE_ALT_BASE_ADDR,
     MONSTER_ALT_BASE_ADDR,
-    VARIABLE_ALT_BASE_ADDR
+    VARIABLE_ALT_BASE_ADDR,
+    NOTIFY_ALT_BASE_ADDR
 };
 
-const char * entry_type_names[NUMBER_OF_ENTRY_TYPES] =
+const char *entry_type_names[NUMBER_OF_ENTRY_TYPES] =
 {
     "pico entries -- 1 B",
     "nano entries -- 4 B",
@@ -237,7 +344,8 @@ const char * entry_type_names[NUMBER_OF_ENTRY_TYPES] =
     "large entries -- 4 KB",
     "huge entries -- 16 KB",
     "monster entries -- 64 KB",
-    "variable entries -- 1B - 10KB"
+    "variable entries -- 1B - 10KB",
+    "notify entries -- 1B"
 };
 
 

@@ -247,99 +355,183 @@ const H5C_class_t types[NUMBER_OF_ENTRY_TYPES] =
 {
   {
     PICO_ENTRY_TYPE,
-    (H5C_load_func_t)pico_load,
-    (H5C_flush_func_t)pico_flush,
-    (H5C_dest_func_t)pico_dest,
-    (H5C_clear_func_t)pico_clear,
-    (H5C_size_func_t)pico_size
+    "pico_entry",
+    H5FD_MEM_DEFAULT,
+    H5C__CLASS_NO_FLAGS_SET,
+    (H5C_get_load_size_func_t)pico_get_load_size,
+    (H5C_verify_chksum_func_t)NULL,
+    (H5C_deserialize_func_t)pico_deserialize,
+    (H5C_image_len_func_t)pico_image_len,
+    (H5AC_pre_serialize_func_t)pico_pre_serialize,
+    (H5C_serialize_func_t)pico_serialize,
+    (H5C_notify_func_t)NULL,
+    (H5C_free_icr_func_t)pico_free_icr,
+    (H5C_clear_func_t)NULL,
+    (H5C_get_fsf_size_t)NULL,
   },
   {
     NANO_ENTRY_TYPE,
-    (H5C_load_func_t)nano_load,
-    (H5C_flush_func_t)nano_flush,
-    (H5C_dest_func_t)nano_dest,
-    (H5C_clear_func_t)nano_clear,
-    (H5C_size_func_t)nano_size
+    "nano_entry",
+    H5FD_MEM_DEFAULT,
+    H5C__CLASS_NO_FLAGS_SET,
+    (H5C_get_load_size_func_t)nano_get_load_size,
+    (H5C_verify_chksum_func_t)NULL,
+    (H5C_deserialize_func_t)nano_deserialize,
+    (H5C_image_len_func_t)nano_image_len,
+    (H5AC_pre_serialize_func_t)nano_pre_serialize,
+    (H5C_serialize_func_t)nano_serialize,
+    (H5C_notify_func_t)NULL,
+    (H5C_free_icr_func_t)nano_free_icr,
+    (H5C_clear_func_t)NULL,
+    (H5C_get_fsf_size_t)NULL,
   },
   {
     MICRO_ENTRY_TYPE,
-    (H5C_load_func_t)micro_load,
-    (H5C_flush_func_t)micro_flush,
-    (H5C_dest_func_t)micro_dest,
-    (H5C_clear_func_t)micro_clear,
-    (H5C_size_func_t)micro_size
+    "micro_entry",
+    H5FD_MEM_DEFAULT,
+    H5C__CLASS_NO_FLAGS_SET,
+    (H5C_get_load_size_func_t)micro_get_load_size,
+    (H5C_verify_chksum_func_t)NULL,
+    (H5C_deserialize_func_t)micro_deserialize,
+    (H5C_image_len_func_t)micro_image_len,
+    (H5AC_pre_serialize_func_t)micro_pre_serialize,
+    (H5C_serialize_func_t)micro_serialize,
+    (H5C_notify_func_t)NULL,
+    (H5C_free_icr_func_t)micro_free_icr,
+    (H5C_clear_func_t)NULL,
+    (H5C_get_fsf_size_t)NULL,
   },
   {
     TINY_ENTRY_TYPE,
-    (H5C_load_func_t)tiny_load,
-    (H5C_flush_func_t)tiny_flush,
-    (H5C_dest_func_t)tiny_dest,
-    (H5C_clear_func_t)tiny_clear,
-    (H5C_size_func_t)tiny_size
+    "tiny_entry",
+    H5FD_MEM_DEFAULT,
+    H5C__CLASS_NO_FLAGS_SET,
+    (H5C_get_load_size_func_t)tiny_get_load_size,
+    (H5C_verify_chksum_func_t)NULL,
+    (H5C_deserialize_func_t)tiny_deserialize,
+    (H5C_image_len_func_t)tiny_image_len,
+    (H5AC_pre_serialize_func_t)tiny_pre_serialize,
+    (H5C_serialize_func_t)tiny_serialize,
+    (H5C_notify_func_t)NULL,
+    (H5C_free_icr_func_t)tiny_free_icr,
+    (H5C_clear_func_t)NULL,
+    (H5C_get_fsf_size_t)NULL,
   },
   {
     SMALL_ENTRY_TYPE,
-    (H5C_load_func_t)small_load,
-    (H5C_flush_func_t)small_flush,
-    (H5C_dest_func_t)small_dest,
-    (H5C_clear_func_t)small_clear,
-    (H5C_size_func_t)small_size
+    "small_entry",
+    H5FD_MEM_DEFAULT,
+    H5C__CLASS_NO_FLAGS_SET,
+    (H5C_get_load_size_func_t)small_get_load_size,
+    (H5C_verify_chksum_func_t)NULL,
+    (H5C_deserialize_func_t)small_deserialize,
+    (H5C_image_len_func_t)small_image_len,
+    (H5AC_pre_serialize_func_t)small_pre_serialize,
+    (H5C_serialize_func_t)small_serialize,
+    (H5C_notify_func_t)NULL,
+    (H5C_free_icr_func_t)small_free_icr,
+    (H5C_clear_func_t)NULL,
+    (H5C_get_fsf_size_t)NULL,
   },
   {
     MEDIUM_ENTRY_TYPE,
-    (H5C_load_func_t)medium_load,
-    (H5C_flush_func_t)medium_flush,
-    (H5C_dest_func_t)medium_dest,
-    (H5C_clear_func_t)medium_clear,
-    (H5C_size_func_t)medium_size
+    "medium_entry",
+    H5FD_MEM_DEFAULT,
+    H5C__CLASS_NO_FLAGS_SET,
+    (H5C_get_load_size_func_t)medium_get_load_size,
+    (H5C_verify_chksum_func_t)NULL,
+    (H5C_deserialize_func_t)medium_deserialize,
+    (H5C_image_len_func_t)medium_image_len,
+    (H5AC_pre_serialize_func_t)medium_pre_serialize,
+    (H5C_serialize_func_t)medium_serialize,
+    (H5C_notify_func_t)NULL,
+    (H5C_free_icr_func_t)medium_free_icr,
+    (H5C_clear_func_t)NULL,
+    (H5C_get_fsf_size_t)NULL,
   },
   {
     LARGE_ENTRY_TYPE,
-    (H5C_load_func_t)large_load,
-    (H5C_flush_func_t)large_flush,
-    (H5C_dest_func_t)large_dest,
-    (H5C_clear_func_t)large_clear,
-    (H5C_size_func_t)large_size
+    "large_entry",
+    H5FD_MEM_DEFAULT,
+    H5C__CLASS_NO_FLAGS_SET,
+    (H5C_get_load_size_func_t)large_get_load_size,
+    (H5C_verify_chksum_func_t)NULL,
+    (H5C_deserialize_func_t)large_deserialize,
+    (H5C_image_len_func_t)large_image_len,
+    (H5AC_pre_serialize_func_t)large_pre_serialize,
+    (H5C_serialize_func_t)large_serialize,
+    (H5C_notify_func_t)NULL,
+    (H5C_free_icr_func_t)large_free_icr,
+    (H5C_clear_func_t)NULL,
+    (H5C_get_fsf_size_t)NULL,
   },
   {
     HUGE_ENTRY_TYPE,
-    (H5C_load_func_t)huge_load,
-    (H5C_flush_func_t)huge_flush,
-    (H5C_dest_func_t)huge_dest,
-    (H5C_clear_func_t)huge_clear,
-    (H5C_size_func_t)huge_size
+    "huge_entry",
+    H5FD_MEM_DEFAULT,
+    H5C__CLASS_NO_FLAGS_SET,
+    (H5C_get_load_size_func_t)huge_get_load_size,
+    (H5C_verify_chksum_func_t)NULL,
+    (H5C_deserialize_func_t)huge_deserialize,
+    (H5C_image_len_func_t)huge_image_len,
+    (H5AC_pre_serialize_func_t)huge_pre_serialize,
+    (H5C_serialize_func_t)huge_serialize,
+    (H5C_notify_func_t)NULL,
+    (H5C_free_icr_func_t)huge_free_icr,
+    (H5C_clear_func_t)NULL,
+    (H5C_get_fsf_size_t)NULL,
   },
   {
     MONSTER_ENTRY_TYPE,
-    (H5C_load_func_t)monster_load,
-    (H5C_flush_func_t)monster_flush,
-    (H5C_dest_func_t)monster_dest,
-    (H5C_clear_func_t)monster_clear,
-    (H5C_size_func_t)monster_size
+    "monster_entry",
+    H5FD_MEM_DEFAULT,
+    H5C__CLASS_NO_FLAGS_SET,
+    (H5C_get_load_size_func_t)monster_get_load_size,
+    (H5C_verify_chksum_func_t)NULL,
+    (H5C_deserialize_func_t)monster_deserialize,
+    (H5C_image_len_func_t)monster_image_len,
+    (H5AC_pre_serialize_func_t)monster_pre_serialize,
+    (H5C_serialize_func_t)monster_serialize,
+    (H5C_notify_func_t)NULL,
+    (H5C_free_icr_func_t)monster_free_icr,
+    (H5C_clear_func_t)NULL,
+    (H5C_get_fsf_size_t)NULL,
   },
   {
     VARIABLE_ENTRY_TYPE,
-    (H5C_load_func_t)variable_load,
-    (H5C_flush_func_t)variable_flush,
-    (H5C_dest_func_t)variable_dest,
-    (H5C_clear_func_t)variable_clear,
-    (H5C_size_func_t)variable_size
+    "variable_entry",
+    H5FD_MEM_DEFAULT,
+    H5C__CLASS_SPECULATIVE_LOAD_FLAG,
+    (H5C_get_load_size_func_t)variable_get_load_size,
+    (H5C_verify_chksum_func_t)variable_verify_chksum,
+    (H5C_deserialize_func_t)variable_deserialize,
+    (H5C_image_len_func_t)variable_image_len,
+    (H5AC_pre_serialize_func_t)variable_pre_serialize,
+    (H5C_serialize_func_t)variable_serialize,
+    (H5C_notify_func_t)NULL,
+    (H5C_free_icr_func_t)variable_free_icr,
+    (H5C_clear_func_t)NULL,
+    (H5C_get_fsf_size_t)NULL,
+  },
+  {
+    NOTIFY_ENTRY_TYPE,
+    "notify_entry",
+    H5FD_MEM_DEFAULT,
+    H5C__CLASS_NO_FLAGS_SET,
+    (H5C_get_load_size_func_t)notify_get_load_size,
+    (H5C_verify_chksum_func_t)NULL,
+    (H5C_deserialize_func_t)notify_deserialize,
+    (H5C_image_len_func_t)notify_image_len,
+    (H5AC_pre_serialize_func_t)notify_pre_serialize,
+    (H5C_serialize_func_t)notify_serialize,
+    (H5C_notify_func_t)notify_notify,
+    (H5C_free_icr_func_t)notify_free_icr,
+    (H5C_clear_func_t)NULL,
+    (H5C_get_fsf_size_t)NULL,
   }
 };
 
-static herr_t clear(H5F_t * f, void * thing, hbool_t dest);
-static herr_t destroy(H5F_t * f, void * thing);
-static herr_t flush(H5F_t *f, hid_t dxpl_id, hbool_t dest,
-                    haddr_t addr, void *thing, unsigned H5_ATTR_UNUSED * flags_ptr);
-static void * load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata);
-static herr_t size(H5F_t * f, void * thing, size_t * size_ptr);
-static void execute_flush_op(H5F_t *file_ptr, struct test_entry_t *entry_ptr,
-    struct flush_op *op_ptr, unsigned *flags_ptr);
-
-
-
-

-/* address translation funtions: */
+/* address translation functions: */
 
 

 /*-------------------------------------------------------------------------
@@ -357,8 +549,8 @@ static void execute_flush_op(H5F_t *file_ptr, struct test_entry_t *entry_ptr,
  */
 void
 addr_to_type_and_index(haddr_t addr,
-                       int32_t * type_ptr,
-                       int32_t * index_ptr)
+                       int32_t *type_ptr,
+                       int32_t *index_ptr)
 {
     int i;
     int32_t type;
@@ -417,52 +609,8 @@ addr_to_type_and_index(haddr_t addr,
 
 } /* addr_to_type_and_index() */
 
-

-#if 0 /* This function has never been used, but we may want it
-       * some time.  Lets keep it for now.
-       */
-/*-------------------------------------------------------------------------
- * Function:	type_and_index_to_addr
- *
- * Purpose:	Given a type and index of an entry, compute the associated
- *		addr and return that value.
- *
- * Return:	computed addr
- *
- * Programmer:	John Mainzer
- *              6/10/04
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-haddr_t
-type_and_index_to_addr(int32_t type,
-                       int32_t idx)
-{
-    haddr_t addr;
-
-    HDassert( ( type >= 0 ) && ( type < NUMBER_OF_ENTRY_TYPES ) );
-    HDassert( ( idx >= 0 ) && ( idx <= max_indices[type] ) );
-
-    addr = base_addrs[type] + (((haddr_t)idx) * entry_sizes[type]);
-
-    HDassert( addr == (entries[type])[idx].addr );
-
-    if ( (entries[type])[idx].at_main_addr ) {
 
-        HDassert( addr == (entries[type])[idx].main_addr );
-
-    } else {
-
-        HDassert( addr == (entries[type])[idx].alt_addr );
-    }
-
-    return(addr);
-
-} /* type_and_index_to_addr() */
-
-#endif
+/* Call back functions: */
 
 

 /*-------------------------------------------------------------------------
@@ -484,709 +632,1145 @@ type_and_index_to_addr(int32_t type,
  *
  *-------------------------------------------------------------------------
  */
-
-herr_t
-check_write_permitted(const H5F_t H5_ATTR_UNUSED *f,
-                      hid_t H5_ATTR_UNUSED dxpl_id,
-                      hbool_t *write_permitted_ptr)
+static herr_t
+check_write_permitted(const H5F_t H5_ATTR_UNUSED *f, hbool_t *write_permitted_ptr)
 {
-
     HDassert( write_permitted_ptr );
+
     *write_permitted_ptr = write_permitted;
 
     return(SUCCEED);
-
 } /* check_write_permitted() */
 
 

 /*-------------------------------------------------------------------------
- * Function:	clear & friends
+ * Function:	get_load_size & friends
  *
- * Purpose:	clear the entry.  The helper functions verify that the
- *		correct version of clear is being called, and then call
- *		clear proper.
+ * Purpose:	Query the image size for loading an entry.  The helper
+ *              functions funnel into get_load_size proper.
  *
  * Return:	SUCCEED
  *
- * Programmer:	John Mainzer
- *              6/10/04
+ * Programmer:	Quincey Koziol
+ *              5/18/10
  *
  *-------------------------------------------------------------------------
  */
+static herr_t
+get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len, int32_t entry_type)
+{
+    test_entry_t *entry;
+    test_entry_t *base_addr;
+    haddr_t addr = *(const haddr_t *)udata;
+    int32_t type;
+    int32_t idx;
 
-herr_t
-clear(H5F_t * f,
-      void *  thing,
-      hbool_t dest)
+    addr_to_type_and_index(addr, &type, &idx);
+
+    base_addr = entries[type];
+    entry = &(base_addr[idx]);
+
+    HDassert(entry->type >= 0);
+    HDassert(entry->type == type);
+    HDassert(entry->type == entry_type);
+    HDassert(entry->type < NUMBER_OF_ENTRY_TYPES);
+    HDassert(entry->index == idx);
+    HDassert(entry->index >= 0);
+    HDassert(entry->index <= max_indices[type]);
+    HDassert(entry == entry->self);
+    HDassert(entry->addr == addr);
+
+    if(image == NULL)
+	*image_length = entry->size;
+    else {
+	/* Simulate SPECULATIVE read with a specified actual_len */
+	if(type == VARIABLE_ENTRY_TYPE && entry->actual_len) {
+	    *actual_len = entry->actual_len;
+	    entry->size = entry->actual_len;
+	} else
+	    *actual_len = entry->size;
+    }
+
+    return(SUCCEED);
+} /* get_load_size() */
+
+static herr_t
+pico_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
 {
-    test_entry_t * entry_ptr;
-    test_entry_t * base_addr;
+    return get_load_size(image, udata, image_length, actual_len, PICO_ENTRY_TYPE);
+}
 
-    HDassert( thing );
+static herr_t
+nano_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+{
+    return get_load_size(image, udata, image_length, actual_len, NANO_ENTRY_TYPE);
+}
 
-    entry_ptr = (test_entry_t *)thing;
-    base_addr = entries[entry_ptr->type];
+static herr_t
+micro_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+{
+    return get_load_size(image, udata, image_length, actual_len, MICRO_ENTRY_TYPE);
+}
 
-    HDassert( entry_ptr->index >= 0 );
-    HDassert( entry_ptr->index <= max_indices[entry_ptr->type] );
-    HDassert( entry_ptr == &(base_addr[entry_ptr->index]) );
-    HDassert( entry_ptr == entry_ptr->self );
-    HDassert( entry_ptr->header.addr == entry_ptr->addr );
-    HDassert( entry_ptr->header.size == entry_ptr->size );
-    HDassert( ( entry_ptr->type == VARIABLE_ENTRY_TYPE ) ||
-	      ( entry_ptr->size == entry_sizes[entry_ptr->type] ) );
+static herr_t
+tiny_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+{
+    return get_load_size(image, udata, image_length, actual_len, TINY_ENTRY_TYPE);
+}
+
+static herr_t
+small_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+{
+    return get_load_size(image, udata, image_length, actual_len, SMALL_ENTRY_TYPE);
+}
+
+static herr_t
+medium_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+{
+    return get_load_size(image, udata, image_length, actual_len, MEDIUM_ENTRY_TYPE);
+}
+
+static herr_t
+large_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+{
+    return get_load_size(image, udata, image_length, actual_len, LARGE_ENTRY_TYPE);
+}
+
+static herr_t
+huge_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+{
+    return get_load_size(image, udata, image_length, actual_len, HUGE_ENTRY_TYPE);
+}
 
-    entry_ptr->header.is_dirty = FALSE;
-    entry_ptr->is_dirty = FALSE;
+static herr_t
+monster_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+{
+    return get_load_size(image, udata, image_length, actual_len, MONSTER_ENTRY_TYPE);
+}
+
+static herr_t
+variable_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+{
+    return get_load_size(image, udata, image_length, actual_len, VARIABLE_ENTRY_TYPE);
+}
+
+static herr_t
+notify_get_load_size(const void *image, void *udata, size_t *image_length, size_t *actual_len)
+{
+    return get_load_size(image, udata, image_length, actual_len, NOTIFY_ENTRY_TYPE);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	verify_chksum & friends 
+ *		(only done for VARIABLE_ENTRY_TYPE which has a speculative read)
+ *
+ * Purpose:	Simulate checksum verification:
+ *		  --check is ok only after 'max_verify_ct' is reached
+ *		  --otherwise check is not ok
+ *
+ * Return:	TRUE: checksum is ok
+ *		FALSE: checksum is not ok
+ *
+ * Programmer:	
+ *
+ *-------------------------------------------------------------------------
+ */
+
+static htri_t
+verify_chksum(const void H5_ATTR_UNUSED *image, size_t H5_ATTR_UNUSED len, void *udata, int32_t entry_type)
+{
+    test_entry_t *entry;
+    test_entry_t *base_addr;
+    haddr_t addr = *(const haddr_t *)udata;
+    int32_t type;
+    int32_t idx;
+
+    addr_to_type_and_index(addr, &type, &idx);
+
+    base_addr = entries[type];
+    entry = &(base_addr[idx]);
+
+    HDassert(entry->type >= 0);
+    HDassert(entry->type == type);
+    HDassert(entry->type == entry_type);
+    HDassert(entry->type < NUMBER_OF_ENTRY_TYPES);
+    HDassert(type == VARIABLE_ENTRY_TYPE);
+    HDassert(entry->index == idx);
+    HDassert(entry->index >= 0);
+    HDassert(entry->index <= max_indices[type]);
+    HDassert(entry == entry->self);
+    HDassert(entry->addr == addr);
+
+    if(++entry->verify_ct >= entry->max_verify_ct)
+	return(TRUE);
+    else 
+	return(FALSE);
+
+} /* verify_chksum() */
+
+static htri_t
+variable_verify_chksum(const void *image, size_t len, void *udata)
+{
+    return verify_chksum(image, len, udata, VARIABLE_ENTRY_TYPE);
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:	deserialize & friends
+ *
+ * Purpose:	deserialize the entry.  The helper functions verify that the
+ *		correct version of deserialize is being called, and then call
+ *		deserialize proper.
+ *
+ * Return:	void * (pointer to the in core representation of the entry)
+ *
+ * Programmer:	John Mainzer
+ *              9/20/07
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+deserialize(const void *image, size_t len, void *udata, hbool_t *dirty,
+    int32_t entry_type)
+{
+    test_entry_t *entry;
+    test_entry_t *base_addr;
+    haddr_t addr = *(haddr_t *)udata;
+    int32_t type;
+    int32_t idx;
 
-    entry_ptr->cleared = TRUE;
+    addr_to_type_and_index(addr, &type, &idx);
 
-    if ( dest ) {
+    base_addr = entries[type];
+    entry = &(base_addr[idx]);
+
+    HDassert(entry->type >= 0);
+    HDassert(entry->type == type);
+    HDassert(entry->type == entry_type);
+    HDassert(entry->type < NUMBER_OF_ENTRY_TYPES);
+    HDassert(entry->index == idx);
+    HDassert(entry->index >= 0);
+    HDassert(entry->index <= max_indices[type]);
+    HDassert(entry == entry->self);
+    HDassert(entry->addr == addr);
+    HDassert(entry->size == len);
+    HDassert((entry->type == VARIABLE_ENTRY_TYPE) || (entry->size == entry_sizes[type]));
+    HDassert(dirty != NULL);
+    HDassert( entry->flush_dep_npar == 0 );
+    HDassert( entry->flush_dep_nchd == 0 );
 
-        destroy(f, thing);
+#if 1 /* JRM */
+    if ( ! ( ( entry->type == VARIABLE_ENTRY_TYPE ) ||
+             ( entry->size == entry_sizes[type] ) ) ) {
 
+        HDfprintf(stdout, "entry type/index/size = %d/%d/%ld\n",
+                  (int)(entry->type),
+                  (int)(entry->index),
+                  (long)(entry->size));
     }
+#endif /* JRM */
 
-    return(SUCCEED);
+    /* for now *dirty will always be FALSE */
+    *dirty = FALSE;
+
+    /* verify that the image contains the expected data. */
+    HDassert(image != NULL);
+    if((entry->at_main_addr && entry->written_to_main_addr) ||
+            (!entry->at_main_addr && entry->written_to_alt_addr)) {
+        if((type == PICO_ENTRY_TYPE) || (type == VARIABLE_ENTRY_TYPE) ||
+           (type == NOTIFY_ENTRY_TYPE)) {
+            if((*((const char *)image)) != (char)(idx & 0xFF)) {
+                HDfprintf(stdout, "type = %d, idx = %d, addr = 0x%lx.\n",
+                          type, idx, (long)addr);
+                HDfprintf(stdout, "*image = 0x%x\n",
+                          (int)(*((const char *)image)));
+                HDfprintf(stdout, "expected *image = 0x%x\n",
+                          (int)(idx & 0xFF));
+            } /* end if */
+  	    HDassert((*((const char *)image)) == (char)(idx & 0xFF));
+        } /* end if */
+        else {
+            if((*(((const char *)image) + 2)) != (char)(idx & 0xFF)) {
+                HDfprintf(stdout, "type = %d, idx = %d, addr = 0x%lx.\n",
+                          type, idx, (long)addr);
+                HDfprintf(stdout, "*image = 0x%x 0x%x 0x%x\n",
+                          (int)(*((const char *)image)),
+                          (int)(*(((const char *)image) + 1)),
+                          (int)(*(((const char *)image) + 2)));
+                HDfprintf(stdout, "expected *image = 0x%x\n",
+                          (int)(idx & 0xFF),
+                          (int)((idx & 0xFF00) >> 8));
+            } /* end if */
+	    HDassert((*((const char *)image)) == (char)(type & 0xFF));
+	    HDassert((*(((const char *)image) + 1)) == (char)((idx & 0xFF00) >> 8));
+	    HDassert((*(((const char *)image) + 2)) == (char)(idx & 0xFF));
+        } /* end else */
+    } /* end if */
 
-} /* clear() */
+    entry->deserialized = TRUE;
+    entry->header.is_dirty = FALSE;
+    entry->is_dirty = FALSE;
+    (entry->deserializes)++;
 
-herr_t
-pico_clear(H5F_t * f, void *  thing, hbool_t dest)
+    return((void *)entry);
+} /* deserialize() */
+
+void *
+pico_deserialize(const void *image, size_t len, void *udata, hbool_t *dirty)
 {
-    HDassert ( ((test_entry_t *)thing)->type == PICO_ENTRY_TYPE );
-    return(clear(f, thing, dest));
+    return deserialize(image, len, udata, dirty, PICO_ENTRY_TYPE);
 }
 
-herr_t
-nano_clear(H5F_t * f, void *  thing, hbool_t dest)
+void *
+nano_deserialize(const void *image, size_t len, void *udata, hbool_t *dirty)
 {
-    HDassert ( ((test_entry_t *)thing)->type == NANO_ENTRY_TYPE );
-    return(clear(f, thing, dest));
+    return deserialize(image, len, udata, dirty, NANO_ENTRY_TYPE);
 }
 
-herr_t
-micro_clear(H5F_t * f, void *  thing, hbool_t dest)
+void *
+micro_deserialize(const void *image, size_t len, void *udata, hbool_t *dirty)
 {
-    HDassert ( ((test_entry_t *)thing)->type == MICRO_ENTRY_TYPE );
-    return(clear(f, thing, dest));
+    return deserialize(image, len, udata, dirty, MICRO_ENTRY_TYPE);
 }
 
-herr_t
-tiny_clear(H5F_t * f, void *  thing, hbool_t dest)
+void *
+tiny_deserialize(const void *image, size_t len, void *udata, hbool_t *dirty)
 {
-    HDassert ( ((test_entry_t *)thing)->type == TINY_ENTRY_TYPE );
-    return(clear(f, thing, dest));
+    return deserialize(image, len, udata, dirty, TINY_ENTRY_TYPE);
 }
 
-herr_t
-small_clear(H5F_t * f, void *  thing, hbool_t dest)
+void *
+small_deserialize(const void *image, size_t len, void *udata, hbool_t *dirty)
 {
-    HDassert ( ((test_entry_t *)thing)->type == SMALL_ENTRY_TYPE );
-    return(clear(f, thing, dest));
+    return deserialize(image, len, udata, dirty, SMALL_ENTRY_TYPE);
 }
 
-herr_t
-medium_clear(H5F_t * f, void *  thing, hbool_t dest)
+void *
+medium_deserialize(const void *image, size_t len, void *udata, hbool_t *dirty)
 {
-    HDassert ( ((test_entry_t *)thing)->type == MEDIUM_ENTRY_TYPE );
-    return(clear(f, thing, dest));
+    return deserialize(image, len, udata, dirty, MEDIUM_ENTRY_TYPE);
 }
 
-herr_t
-large_clear(H5F_t * f, void *  thing, hbool_t dest)
+void *
+large_deserialize(const void *image, size_t len, void *udata, hbool_t *dirty)
 {
-    HDassert ( ((test_entry_t *)thing)->type == LARGE_ENTRY_TYPE );
-    return(clear(f, thing, dest));
+    return deserialize(image, len, udata, dirty, LARGE_ENTRY_TYPE);
 }
 
-herr_t
-huge_clear(H5F_t * f, void *  thing, hbool_t dest)
+void *
+huge_deserialize(const void *image, size_t len, void *udata, hbool_t *dirty)
 {
-    HDassert ( ((test_entry_t *)thing)->type == HUGE_ENTRY_TYPE );
-    return(clear(f, thing, dest));
+    return deserialize(image, len, udata, dirty, HUGE_ENTRY_TYPE);
 }
 
-herr_t
-monster_clear(H5F_t * f, void *  thing, hbool_t dest)
+void *
+monster_deserialize(const void *image, size_t len, void *udata, hbool_t *dirty)
 {
-    HDassert ( ((test_entry_t *)thing)->type == MONSTER_ENTRY_TYPE );
-    return(clear(f, thing, dest));
+    return deserialize(image, len, udata, dirty, MONSTER_ENTRY_TYPE);
 }
 
-herr_t
-variable_clear(H5F_t * f, void *  thing, hbool_t dest)
+void *
+variable_deserialize(const void *image, size_t len, void *udata, hbool_t *dirty)
 {
-    HDassert ( ((test_entry_t *)thing)->type == VARIABLE_ENTRY_TYPE );
-    return(clear(f, thing, dest));
+    return deserialize(image, len, udata, dirty, VARIABLE_ENTRY_TYPE);
 }
 
+void *
+notify_deserialize(const void *image, size_t len, void *udata, hbool_t *dirty)
+{
+    return deserialize(image, len, udata, dirty, NOTIFY_ENTRY_TYPE);
+}
 
 

 /*-------------------------------------------------------------------------
- * Function:	dest & friends
+ * Function:	image_len & friends
  *
- * Purpose:	Destroy the entry.  The helper functions verify that the
- *		correct version of dest is being called, and then call
- *		dest proper.
+ * Purpose:	Return the real (and possibly reduced) length of the image.
+ * 		The helper functions verify that the correct version of
+ * 		deserialize is being called, and then call deserialize
+ * 		proper.
  *
  * Return:	SUCCEED
  *
  * Programmer:	John Mainzer
- *              6/10/04
+ *              9/19/07
  *
  *-------------------------------------------------------------------------
  */
-
 herr_t
-destroy(H5F_t H5_ATTR_UNUSED * f,
-        void *         thing)
+image_len(void *thing, size_t *image_length, int32_t entry_type)
 {
-    int i;
-    test_entry_t * entry_ptr;
-    test_entry_t * base_addr;
-    test_entry_t * pinned_entry_ptr;
-    test_entry_t * pinned_base_addr;
+    test_entry_t *entry;
+    test_entry_t *base_addr;
+    int32_t type;
+    int32_t idx;
 
-    HDassert( thing );
+    HDassert(thing);
+    HDassert(image_length);
 
-    entry_ptr = (test_entry_t *)thing;
-    base_addr = entries[entry_ptr->type];
+    entry = (test_entry_t *)thing;
 
-    HDassert( entry_ptr->index >= 0 );
-    HDassert( entry_ptr->index <= max_indices[entry_ptr->type] );
-    HDassert( entry_ptr == &(base_addr[entry_ptr->index]) );
-    HDassert( entry_ptr == entry_ptr->self );
-    HDassert( entry_ptr->cache_ptr != NULL );
-    HDassert( entry_ptr->cache_ptr->magic == H5C__H5C_T_MAGIC );
-    HDassert( ( entry_ptr->header.destroy_in_progress ) ||
-              ( entry_ptr->header.addr == entry_ptr->addr ) );
-    HDassert( entry_ptr->header.size == entry_ptr->size );
-    HDassert( ( entry_ptr->type == VARIABLE_ENTRY_TYPE ) ||
-	      ( entry_ptr->size == entry_sizes[entry_ptr->type] ) );
+    HDassert(entry->self == entry);
 
-    HDassert( !(entry_ptr->is_dirty) );
-    HDassert( !(entry_ptr->header.is_dirty) );
+    type = entry->type;
+    idx = entry->index;
 
-    if ( entry_ptr->num_pins > 0 ) {
+    HDassert((type >= 0) && (type < NUMBER_OF_ENTRY_TYPES));
+    HDassert(type == entry_type);
+    HDassert((idx >= 0) && (idx <= max_indices[type]));
 
-	for ( i = 0; i < entry_ptr->num_pins; i++ )
-        {
-	    pinned_base_addr = entries[entry_ptr->pin_type[i]];
-	    pinned_entry_ptr = &(pinned_base_addr[entry_ptr->pin_idx[i]]);
-
-	    HDassert( 0 <= pinned_entry_ptr->type );
-            HDassert( pinned_entry_ptr->type < NUMBER_OF_ENTRY_TYPES );
-	    HDassert( pinned_entry_ptr->type == entry_ptr->pin_type[i] );
-	    HDassert( pinned_entry_ptr->index >= 0 );
-	    HDassert( pinned_entry_ptr->index <=
-		      max_indices[pinned_entry_ptr->type] );
-	    HDassert( pinned_entry_ptr->index == entry_ptr->pin_idx[i] );
-	    HDassert( pinned_entry_ptr == pinned_entry_ptr->self );
-	    HDassert( pinned_entry_ptr->header.is_pinned );
-	    HDassert( pinned_entry_ptr->is_pinned );
-	    HDassert( pinned_entry_ptr->pinning_ref_count > 0 );
-
-	    pinned_entry_ptr->pinning_ref_count--;
-
-	    if ( pinned_entry_ptr->pinning_ref_count <= 0 ) {
-
-		unpin_entry(pinned_entry_ptr->type,
-			    pinned_entry_ptr->index);
-	    }
+    base_addr = entries[type];
+    HDassert(entry == &(base_addr[idx]));
 
-	    entry_ptr->pin_type[i] = -1;
-	    entry_ptr->pin_idx[i] = -1;
-	}
-	entry_ptr->num_pins = 0;
-    }
+    if(type != VARIABLE_ENTRY_TYPE)
+	HDassert(entry->size == entry_sizes[type]);
+    else {
+	HDassert(entry->size <= entry_sizes[type]);
+	HDassert(entry->size > 0);
+    } /* end else */
 
-    entry_ptr->destroyed = TRUE;
-    entry_ptr->cache_ptr = NULL;
+    *image_length = entry->size;
 
     return(SUCCEED);
+} /* image_len() */
 
-} /* dest() */
+herr_t
+pico_image_len(void *thing, size_t *image_length, 
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
+{
+    return image_len(thing, image_length, PICO_ENTRY_TYPE);
+}
 
 herr_t
-pico_dest(H5F_t * f, void * thing)
+nano_image_len(void *thing, size_t *image_length,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == PICO_ENTRY_TYPE );
-    return(destroy(f, thing));
+    return image_len(thing, image_length, NANO_ENTRY_TYPE);
 }
 
 herr_t
-nano_dest(H5F_t * f, void * thing)
+micro_image_len(void *thing, size_t *image_length,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == NANO_ENTRY_TYPE );
-    return(destroy(f, thing));
+    return image_len(thing, image_length, MICRO_ENTRY_TYPE);
 }
 
 herr_t
-micro_dest(H5F_t * f, void * thing)
+tiny_image_len(void *thing, size_t *image_length,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == MICRO_ENTRY_TYPE );
-    return(destroy(f, thing));
+    return image_len(thing, image_length, TINY_ENTRY_TYPE);
 }
 
 herr_t
-tiny_dest(H5F_t * f, void * thing)
+small_image_len(void *thing, size_t *image_length,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == TINY_ENTRY_TYPE );
-    return(destroy(f, thing));
+    return image_len(thing, image_length, SMALL_ENTRY_TYPE);
 }
 
 herr_t
-small_dest(H5F_t * f, void * thing)
+medium_image_len(void *thing, size_t *image_length,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == SMALL_ENTRY_TYPE );
-    return(destroy(f, thing));
+    return image_len(thing, image_length, MEDIUM_ENTRY_TYPE);
 }
 
 herr_t
-medium_dest(H5F_t * f, void * thing)
+large_image_len(void *thing, size_t *image_length,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == MEDIUM_ENTRY_TYPE );
-    return(destroy(f, thing));
+    return image_len(thing, image_length, LARGE_ENTRY_TYPE);
 }
 
 herr_t
-large_dest(H5F_t * f, void * thing)
+huge_image_len(void *thing, size_t *image_length,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == LARGE_ENTRY_TYPE );
-    return(destroy(f, thing));
+    return image_len(thing, image_length, HUGE_ENTRY_TYPE);
 }
 
 herr_t
-huge_dest(H5F_t * f, void *  thing)
+monster_image_len(void *thing, size_t *image_length,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == HUGE_ENTRY_TYPE );
-    return(destroy(f, thing));
+    return image_len(thing, image_length, MONSTER_ENTRY_TYPE);
 }
 
 herr_t
-monster_dest(H5F_t * f, void *  thing)
+variable_image_len(void *thing, size_t *image_length,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == MONSTER_ENTRY_TYPE );
-    return(destroy(f, thing));
+    return image_len(thing, image_length, VARIABLE_ENTRY_TYPE);
 }
 
 herr_t
-variable_dest(H5F_t * f, void *  thing)
+notify_image_len(void *thing, size_t *image_length,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == VARIABLE_ENTRY_TYPE );
-    return(destroy(f, thing));
+    return image_len(thing, image_length, NOTIFY_ENTRY_TYPE);
 }
 
 

 /*-------------------------------------------------------------------------
- * Function:	flush & friends
+ * Function:	pre_serialize & friends
  *
- * Purpose:	flush the entry and mark it as clean.  The helper functions
- *              verify that the correct version of flush is being called,
- *		and then call flush proper.
+ * Purpose:	Pre_serialize the supplied entry.  For now this consistes of
+ * 		executing any flush operations and loading the appropriate 
+ *		values into *new_addr_ptr, *new_len_ptr, and *flags_ptr.
  *
- * Return:	SUCCEED
+ * 		The helper functions verify that the correct version of
+ * 		serialize is being called, and then call serialize
+ * 		proper.
+ *
+ * Return:	SUCCEED if successful, FAIL otherwise.
  *
  * Programmer:	John Mainzer
- *              6/10/04
+ *              8/07/14
  *
  *-------------------------------------------------------------------------
  */
-
 herr_t
-flush(H5F_t *f,
-      hid_t H5_ATTR_UNUSED dxpl_id,
-      hbool_t dest,
-      haddr_t
-#ifdef NDEBUG
-          H5_ATTR_UNUSED
-#endif /* NDEBUG */
-          addr,
-      void *thing,
-      unsigned * flags_ptr)
+pre_serialize(const H5F_t *f,
+              hid_t H5_ATTR_UNUSED dxpl_id,
+              void *thing,
+              haddr_t addr,
+              size_t len,
+              haddr_t *new_addr_ptr,
+              size_t *new_len_ptr,
+              unsigned *flags_ptr)
 {
-    int i;
-    test_entry_t * entry_ptr;
-    test_entry_t * base_addr;
+    test_entry_t *entry;
+    test_entry_t *base_addr;
+    int32_t type;
+    int32_t idx;
+    int32_t i;
 
-    HDassert( thing );
+    HDassert(f);
+    HDassert(thing);
+    HDassert(flags_ptr);
 
-    entry_ptr = (test_entry_t *)thing;
-    base_addr = entries[entry_ptr->type];
+    *flags_ptr = H5C__SERIALIZE_NO_FLAGS_SET;
 
-    HDassert( entry_ptr->index >= 0 );
-    HDassert( entry_ptr->index <= max_indices[entry_ptr->type] );
-    HDassert( entry_ptr == &(base_addr[entry_ptr->index]) );
-    HDassert( entry_ptr == entry_ptr->self );
-    HDassert( entry_ptr->header.addr == entry_ptr->addr );
-    HDassert( entry_ptr->addr == addr );
-    HDassert( entry_ptr->header.size == entry_ptr->size );
-    HDassert( ( entry_ptr->type == VARIABLE_ENTRY_TYPE ) ||
-	      ( entry_ptr->size == entry_sizes[entry_ptr->type] ) );
-    HDassert( entry_ptr->header.is_dirty == entry_ptr->is_dirty );
-    HDassert( entry_ptr->cache_ptr != NULL );
-    HDassert( entry_ptr->cache_ptr->magic == H5C__H5C_T_MAGIC );
-    HDassert( entry_ptr->num_flush_ops >= 0 );
-    HDassert( entry_ptr->num_flush_ops < MAX_FLUSH_OPS );
-
-    if ( entry_ptr->num_flush_ops > 0 ) {
-
-        for ( i = 0; i < entry_ptr->num_flush_ops; i++ )
-	{
-            execute_flush_op(f,
-			     entry_ptr,
-			     &((entry_ptr->flush_ops)[i]),
-			     flags_ptr);
-	}
-	entry_ptr->num_flush_ops = 0;
-	entry_ptr->flush_op_self_resize_in_progress = FALSE;
-    }
+    HDassert(new_addr_ptr);
+    HDassert(new_len_ptr);
 
-    entry_ptr->flushed = TRUE;
+    entry = (test_entry_t *)thing;
 
-    if ( ( ! write_permitted ) && ( entry_ptr->is_dirty ) ) {
+    HDassert(entry->self == entry);
+    HDassert(entry->addr == addr);
+    HDassert(entry->size == len);
 
-        pass = FALSE;
-        failure_mssg = "called flush when write_permitted is FALSE.";
-    }
+    /* shouldn't serialize the entry unless it is dirty */
+    HDassert(entry->is_dirty);
 
-    if ( entry_ptr->is_dirty ) {
+    type = entry->type;
+    idx = entry->index;
 
-        (entry_ptr->writes)++;
-        entry_ptr->is_dirty = FALSE;
-        entry_ptr->header.is_dirty = FALSE;
-    }
+    HDassert((type >= 0) && (type < NUMBER_OF_ENTRY_TYPES));
+    HDassert((idx >= 0) && (idx <= max_indices[type]));
+
+    base_addr = entries[type];
 
-    if ( dest ) {
+    HDassert(entry == &(base_addr[idx]));
+    HDassert(entry->num_flush_ops >= 0);
+    HDassert(entry->num_flush_ops < MAX_FLUSH_OPS);
 
-        destroy(f, thing);
+    if(entry->num_flush_ops > 0) {
+        for(i = 0; i < entry->num_flush_ops; i++ ) {
+            HDassert(entry->file_ptr);
 
-    }
+            execute_flush_op(entry->file_ptr, entry,
+                    &((entry->flush_ops)[i]), flags_ptr);
+        } /* end for */
+        entry->num_flush_ops = 0;
+        entry->flush_op_self_resize_in_progress = FALSE;
+
+        /* This looks wrong, but it isn't -- *flags_ptr will be modified
+         * by execute_flush_op() only if the target is this entry --
+         * and the flags set will accumulate over the set of calls in
+         * the for loop.
+         */
+        if(pass && (((*flags_ptr) & H5C__SERIALIZE_RESIZED_FLAG) != 0)) {
+
+            /* set *new_len_ptr to the new length. */
+
+            HDassert(entry->type == VARIABLE_ENTRY_TYPE);
+            HDassert(entry->size > 0);
+            HDassert(entry->size <= VARIABLE_ENTRY_SIZE);
+
+            *new_len_ptr = entry->size;
+        } /* end if */
+
+        if(((*flags_ptr) & H5C__SERIALIZE_MOVED_FLAG) != 0) {
+
+            HDassert(((*flags_ptr) | H5C__SERIALIZE_RESIZED_FLAG) != 0);
+
+            /* place the new address in *new_addr */
+            *new_addr_ptr = entry->addr;
+        } /* end if */
+    } /* end if */
 
     return(SUCCEED);
 
-} /* flush() */
+} /* pre_serialize() */
+
+herr_t
+pico_pre_serialize(const H5F_t *f,
+                   hid_t dxpl_id,
+                   void *thing,
+                   haddr_t addr,
+                   size_t len,
+                   size_t H5_ATTR_UNUSED compressed_len,
+                   haddr_t *new_addr_ptr,
+                   size_t *new_len_ptr,
+                   size_t H5_ATTR_UNUSED *new_compressed_len_ptr,
+                   unsigned *flags_ptr)
+{
+    return pre_serialize(f, dxpl_id, thing, addr, len, 
+                         new_addr_ptr, new_len_ptr, flags_ptr);
+}
 
 herr_t
-pico_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest, haddr_t addr,
-           void *thing, unsigned * flags_ptr)
+nano_pre_serialize(const H5F_t *f,
+                   hid_t dxpl_id,
+                   void *thing,
+                   haddr_t addr,
+                   size_t len,
+                   size_t H5_ATTR_UNUSED compressed_len,
+                   haddr_t *new_addr_ptr,
+                   size_t *new_len_ptr,
+                   size_t H5_ATTR_UNUSED *new_compressed_len_ptr,
+                   unsigned *flags_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == PICO_ENTRY_TYPE );
-    return(flush(f, dxpl_id, dest, addr, thing, flags_ptr));
+    return pre_serialize(f, dxpl_id, thing, addr, len, 
+                         new_addr_ptr, new_len_ptr, flags_ptr);
 }
 
 herr_t
-nano_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest, haddr_t addr,
-	   void *thing, unsigned * flags_ptr)
+micro_pre_serialize(const H5F_t *f,
+                    hid_t dxpl_id,
+                    void *thing,
+                    haddr_t addr,
+                    size_t len,
+                    size_t H5_ATTR_UNUSED compressed_len,
+                    haddr_t *new_addr_ptr,
+                    size_t *new_len_ptr,
+                    size_t H5_ATTR_UNUSED *new_compressed_len_ptr,
+                    unsigned *flags_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == NANO_ENTRY_TYPE );
-    return(flush(f, dxpl_id, dest, addr, thing, flags_ptr));
+    return pre_serialize(f, dxpl_id, thing, addr, len, 
+                         new_addr_ptr, new_len_ptr, flags_ptr);
 }
 
 herr_t
-micro_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest, haddr_t addr,
-            void *thing, unsigned * flags_ptr)
+tiny_pre_serialize(const H5F_t *f,
+                   hid_t dxpl_id,
+                   void *thing,
+                   haddr_t addr,
+                   size_t len,
+                   size_t H5_ATTR_UNUSED compressed_len,
+                   haddr_t *new_addr_ptr,
+                   size_t *new_len_ptr,
+                   size_t H5_ATTR_UNUSED *new_compressed_len_ptr,
+                   unsigned *flags_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == MICRO_ENTRY_TYPE );
-    return(flush(f, dxpl_id, dest, addr, thing, flags_ptr));
+    return pre_serialize(f, dxpl_id, thing, addr, len, 
+                         new_addr_ptr, new_len_ptr, flags_ptr);
 }
 
 herr_t
-tiny_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest, haddr_t addr,
-           void *thing, unsigned * flags_ptr)
+small_pre_serialize(const H5F_t *f,
+                    hid_t dxpl_id,
+                    void *thing,
+                    haddr_t addr,
+                    size_t len,
+                    size_t H5_ATTR_UNUSED compressed_len,
+                    haddr_t *new_addr_ptr,
+                    size_t *new_len_ptr,
+                    size_t H5_ATTR_UNUSED *new_compressed_len_ptr,
+                    unsigned *flags_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == TINY_ENTRY_TYPE );
-    return(flush(f, dxpl_id, dest, addr, thing, flags_ptr));
+    return pre_serialize(f, dxpl_id, thing, addr, len, 
+                         new_addr_ptr, new_len_ptr, flags_ptr);
 }
 
 herr_t
-small_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest, haddr_t addr,
-            void *thing, unsigned * flags_ptr)
+medium_pre_serialize(const H5F_t *f,
+                     hid_t dxpl_id,
+                     void *thing,
+                     haddr_t addr,
+                     size_t len,
+                     size_t H5_ATTR_UNUSED compressed_len,
+                     haddr_t *new_addr_ptr,
+                     size_t *new_len_ptr,
+                     size_t H5_ATTR_UNUSED *new_compressed_len_ptr,
+                     unsigned *flags_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == SMALL_ENTRY_TYPE );
-    return(flush(f, dxpl_id, dest, addr, thing, flags_ptr));
+    return pre_serialize(f, dxpl_id, thing, addr, len, 
+                         new_addr_ptr, new_len_ptr, flags_ptr);
 }
 
 herr_t
-medium_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest, haddr_t addr,
-             void *thing, unsigned * flags_ptr)
+large_pre_serialize(const H5F_t *f,
+                    hid_t dxpl_id,
+                    void *thing,
+                    haddr_t addr,
+                    size_t len,
+                    size_t H5_ATTR_UNUSED compressed_len,
+                    haddr_t *new_addr_ptr,
+                    size_t *new_len_ptr,
+                    size_t H5_ATTR_UNUSED *new_compressed_len_ptr,
+                    unsigned *flags_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == MEDIUM_ENTRY_TYPE );
-    return(flush(f, dxpl_id, dest, addr, thing, flags_ptr));
+    return pre_serialize(f, dxpl_id, thing, addr, len, 
+                         new_addr_ptr, new_len_ptr, flags_ptr);
 }
 
 herr_t
-large_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest, haddr_t addr,
-            void *thing, unsigned * flags_ptr)
+huge_pre_serialize(const H5F_t *f,
+                   hid_t dxpl_id,
+                   void *thing,
+                   haddr_t addr,
+                   size_t len,
+                   size_t H5_ATTR_UNUSED compressed_len,
+                   haddr_t *new_addr_ptr,
+                   size_t *new_len_ptr,
+                   size_t H5_ATTR_UNUSED *new_compressed_len_ptr,
+                   unsigned *flags_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == LARGE_ENTRY_TYPE );
-    return(flush(f, dxpl_id, dest, addr, thing, flags_ptr));
+    return pre_serialize(f, dxpl_id, thing, addr, len, 
+                         new_addr_ptr, new_len_ptr, flags_ptr);
 }
 
 herr_t
-huge_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest, haddr_t addr,
-           void *thing, unsigned * flags_ptr)
+monster_pre_serialize(const H5F_t *f,
+                      hid_t dxpl_id,
+                      void *thing,
+                      haddr_t addr,
+                      size_t len,
+                      size_t H5_ATTR_UNUSED compressed_len,
+                      haddr_t *new_addr_ptr,
+                      size_t *new_len_ptr,
+                      size_t H5_ATTR_UNUSED *new_compressed_len_ptr,
+                      unsigned *flags_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == HUGE_ENTRY_TYPE );
-    return(flush(f, dxpl_id, dest, addr, thing, flags_ptr));
+    return pre_serialize(f, dxpl_id, thing, addr, len, 
+                         new_addr_ptr, new_len_ptr, flags_ptr);
 }
 
 herr_t
-monster_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest, haddr_t addr,
-	      void *thing, unsigned * flags_ptr)
+variable_pre_serialize(const H5F_t *f,
+                       hid_t dxpl_id,
+                       void *thing,
+                       haddr_t addr,
+                       size_t len,
+                       size_t H5_ATTR_UNUSED compressed_len,
+                       haddr_t *new_addr_ptr,
+                       size_t *new_len_ptr,
+                       size_t H5_ATTR_UNUSED *new_compressed_len_ptr,
+                       unsigned *flags_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == MONSTER_ENTRY_TYPE );
-    return(flush(f, dxpl_id, dest, addr, thing, flags_ptr));
+    return pre_serialize(f, dxpl_id, thing, addr, len, 
+                         new_addr_ptr, new_len_ptr, flags_ptr);
 }
 
 herr_t
-variable_flush(H5F_t *f, hid_t dxpl_id, hbool_t dest, haddr_t addr,
-	       void *thing, unsigned * flags_ptr)
+notify_pre_serialize(const H5F_t *f,
+                     hid_t dxpl_id,
+                     void *thing,
+                     haddr_t addr,
+                     size_t len,
+                     size_t H5_ATTR_UNUSED compressed_len,
+                     haddr_t *new_addr_ptr,
+                     size_t *new_len_ptr,
+                     size_t H5_ATTR_UNUSED *new_compressed_len_ptr,
+                     unsigned *flags_ptr)
 {
-    HDassert ( ((test_entry_t *)thing)->type == VARIABLE_ENTRY_TYPE );
-    return(flush(f, dxpl_id, dest, addr, thing, flags_ptr));
+    return pre_serialize(f, dxpl_id, thing, addr, len, 
+                         new_addr_ptr, new_len_ptr, flags_ptr);
 }
 
 
 

 /*-------------------------------------------------------------------------
- * Function:	load & friends
+ * Function:	serialize & friends
  *
- * Purpose:	"load" the requested entry and mark it as clean.  The
- *		helper functions verify that the correct version of load
- *		 is being called, and then call load proper.
+ * Purpose:	Serialize the supplied entry.  For now this consistes of
+ * 		loading the type and index of the entry into the first
+ * 		three bytes of the image (if it is long enough -- if not
+ * 		just load the low order byte of the index into the first
+ * 		byte of the image).
  *
- * Return:	SUCCEED
+ * 		The helper functions verify that the correct version of
+ * 		serialize is being called, and then call serialize
+ * 		proper.
+ *
+ * Return:	SUCCEED if successful, FAIL otherwise.
  *
  * Programmer:	John Mainzer
- *              6/10/04
+ *              9/19/07
  *
  *-------------------------------------------------------------------------
  */
-
-void *
-load(H5F_t H5_ATTR_UNUSED *f,
-     hid_t H5_ATTR_UNUSED dxpl_id,
-     haddr_t addr,
-     void H5_ATTR_UNUSED *udata)
+herr_t
+serialize(const H5F_t H5_ATTR_UNUSED *f, void *image_ptr, size_t len, void *thing)
 {
+    test_entry_t *entry;
+    test_entry_t *base_addr;
     int32_t type;
     int32_t idx;
-    test_entry_t * entry_ptr;
-    test_entry_t * base_addr;
 
-    addr_to_type_and_index(addr, &type, &idx);
+    HDassert(image_ptr);
+    HDassert(thing);
+
+    entry = (test_entry_t *)thing;
+
+    HDassert(entry->self == entry);
+    HDassert(entry->size == len);
+
+    /* shouldn't serialize the entry unless it is dirty */
+    HDassert(entry->is_dirty);
+
+    type = entry->type;
+    idx = entry->index;
+
+    HDassert((type >= 0) && (type < NUMBER_OF_ENTRY_TYPES));
+    HDassert((idx >= 0) && (idx <= max_indices[type]));
 
     base_addr = entries[type];
-    entry_ptr = &(base_addr[idx]);
 
-    HDassert( entry_ptr->type == type );
-    HDassert( entry_ptr->type >= 0 );
-    HDassert( entry_ptr->type < NUMBER_OF_ENTRY_TYPES );
-    HDassert( entry_ptr->index == idx );
-    HDassert( entry_ptr->index >= 0 );
-    HDassert( entry_ptr->index <= max_indices[type] );
-    HDassert( entry_ptr == entry_ptr->self );
-    HDassert( entry_ptr->addr == addr );
-#if 1 /* JRM */
-    if ( ! ( ( entry_ptr->type == VARIABLE_ENTRY_TYPE ) ||
-             ( entry_ptr->size == entry_sizes[type] ) ) ) {
+    HDassert(entry == &(base_addr[idx]));
+    HDassert(entry->num_flush_ops >= 0);
+    HDassert(entry->num_flush_ops < MAX_FLUSH_OPS);
 
-        HDfprintf(stdout, "entry type/index/size = %d/%d/%ld\n",
-                  (int)(entry_ptr->type),
-                  (int)(entry_ptr->index),
-                  (long)(entry_ptr->size));
-    }
-#endif /* JRM */
-    HDassert( ( entry_ptr->type == VARIABLE_ENTRY_TYPE ) ||
-	      ( entry_ptr->size == entry_sizes[type] ) );
+    /* null out the image to avoid spurious failures */
+    HDmemset(image_ptr, 0, len);
+
+    if((type == PICO_ENTRY_TYPE) || (type == VARIABLE_ENTRY_TYPE) ||
+       (type == NOTIFY_ENTRY_TYPE )) {
+	HDassert(entry->size >= PICO_ENTRY_SIZE);
+	*((char *)image_ptr) = (char)((entry->index) & 0xFF);
+    } /* end if */
+    else {
+	HDassert(entry->size >= NANO_ENTRY_SIZE);
+	*((char *)image_ptr) = (char)((entry->type) & 0xFF);
+	*(((char *)image_ptr) + 1) = (char)(((entry->index) & 0xFF00) >> 8);
+	*(((char *)image_ptr) + 2) = (char)((entry->index) & 0xFF);
+    } /* end else */
 
-    entry_ptr->loaded = TRUE;
+    /* We no longer do the actual write through an callback -- this is
+     * as close to that callback as we will get.  Hence mark the entry
+     * clean here.  If all goes well, it will be flushed shortly.
+     */
+    entry->is_dirty = FALSE;
 
-    entry_ptr->header.is_dirty = FALSE;
-    entry_ptr->is_dirty = FALSE;
+    if(entry->flush_dep_npar > 0) {
+	HDassert(entry->flush_dep_ndirty_chd == 0);
+        mark_flush_dep_clean(entry);
+    } /* end if */
 
-    (entry_ptr->reads)++;
+    /* since the entry is about to be written to disk, we can mark it
+     * as initialized.
+     */
+    if(entry->at_main_addr)
+	entry->written_to_main_addr = TRUE;
+    else
+	entry->written_to_alt_addr = TRUE;
 
-    return(entry_ptr);
+    /* do book keeping */
+    (entry->serializes)++;
+    entry->serialized = TRUE;
 
-} /* load() */
+    return(SUCCEED);
+} /* serialize() */
 
-void *
-pico_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata)
+herr_t
+pico_serialize(const H5F_t H5_ATTR_UNUSED *f, void *image_ptr, size_t len, void *thing)
 {
-    return(load(f, dxpl_id, addr, udata));
+    return serialize(f, image_ptr, len, thing);
 }
 
-void *
-nano_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata)
+herr_t
+nano_serialize(const H5F_t H5_ATTR_UNUSED *f, void *image_ptr, size_t len, void *thing)
 {
-    return(load(f, dxpl_id, addr, udata));
+    return serialize(f, image_ptr, len, thing);
 }
 
-void *
-micro_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata)
+herr_t
+micro_serialize(const H5F_t H5_ATTR_UNUSED *f, void *image_ptr, size_t len, void *thing)
 {
-    return(load(f, dxpl_id, addr, udata));
+    return serialize(f, image_ptr, len, thing);
 }
 
-void *
-tiny_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata)
+herr_t
+tiny_serialize(const H5F_t H5_ATTR_UNUSED *f, void *image_ptr, size_t len, void *thing)
 {
-    return(load(f, dxpl_id, addr, udata));
+    return serialize(f, image_ptr, len, thing);
 }
 
-void *
-small_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata)
+herr_t
+small_serialize(const H5F_t H5_ATTR_UNUSED *f, void *image_ptr, size_t len, void *thing)
 {
-    return(load(f, dxpl_id, addr, udata));
+    return serialize(f, image_ptr, len, thing);
 }
 
-void *
-medium_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata)
+herr_t
+medium_serialize(const H5F_t H5_ATTR_UNUSED *f, void *image_ptr, size_t len, 
+    void *thing)
 {
-    return(load(f, dxpl_id, addr, udata));
+    return serialize(f, image_ptr, len, thing);
 }
 
-void *
-large_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata)
+herr_t
+large_serialize(const H5F_t H5_ATTR_UNUSED *f, void *image_ptr, size_t len, void *thing)
 {
-    return(load(f, dxpl_id, addr, udata));
+    return serialize(f, image_ptr, len, thing);
 }
 
-void *
-huge_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata)
+herr_t
+huge_serialize(const H5F_t H5_ATTR_UNUSED *f, void *image_ptr, size_t len, void *thing)
 {
-    return(load(f, dxpl_id, addr, udata));
+    return serialize(f, image_ptr, len, thing);
 }
 
-void *
-monster_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata)
+herr_t
+monster_serialize(const H5F_t H5_ATTR_UNUSED *f, void *image_ptr, size_t len, 
+    void *thing)
 {
-    return(load(f, dxpl_id, addr, udata));
+    return serialize(f, image_ptr, len, thing);
 }
 
-void *
-variable_load(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *udata)
+herr_t
+variable_serialize(const H5F_t H5_ATTR_UNUSED *f, void *image_ptr, size_t len, 
+    void *thing)
+{
+    return serialize(f, image_ptr, len, thing);
+}
+
+herr_t
+notify_serialize(const H5F_t H5_ATTR_UNUSED *f, void *image_ptr, size_t len, 
+    void *thing)
 {
-    return(load(f, dxpl_id, addr, udata));
+    return serialize(f, image_ptr, len, thing);
 }
 
 

 /*-------------------------------------------------------------------------
- * Function:	size & friends
+ * Function:	notify & friends
  *
- * Purpose:	Get the size of the specified entry.  The helper functions
- *		verify that the correct version of size is being called,
- *		and then call size proper.
+ * Purpose:	Record notifications of cache events for the entry.
+ *              The helper functions verify that the correct version of notify
+ *              is being called, and then call notify proper.
  *
  * Return:	SUCCEED
  *
- * Programmer:	John Mainzer
- *              6/10/04
+ * Programmer:	Quincey Koziol
+ *              4/28/09
  *
  *-------------------------------------------------------------------------
  */
-
-herr_t
-size(H5F_t H5_ATTR_UNUSED *  f,
-     void *   thing,
-     size_t * size_ptr)
+static herr_t
+notify(H5C_notify_action_t action, void *thing, int32_t entry_type)
 {
-    test_entry_t * entry_ptr;
-    test_entry_t * base_addr;
+    test_entry_t *entry;
+    test_entry_t *base_addr;
 
-    HDassert( size_ptr );
-    HDassert( thing );
+    HDassert(thing);
 
-    entry_ptr = (test_entry_t *)thing;
-    base_addr = entries[entry_ptr->type];
+    entry = (test_entry_t *)thing;
+    base_addr = entries[entry->type];
 
-    HDassert( entry_ptr->index >= 0 );
-    HDassert( entry_ptr->index <= max_indices[entry_ptr->type] );
-    HDassert( entry_ptr == &(base_addr[entry_ptr->index]) );
-    HDassert( entry_ptr == entry_ptr->self );
-    HDassert( entry_ptr->header.addr == entry_ptr->addr );
-    HDassert( ( entry_ptr->type == VARIABLE_ENTRY_TYPE ) || \
-              ( entry_ptr->size == entry_sizes[entry_ptr->type] ) );
+    HDassert(entry->index >= 0);
+    HDassert(entry->index <= max_indices[entry->type]);
+    HDassert((entry->type >= 0) && (entry->type < NUMBER_OF_ENTRY_TYPES));
+    HDassert(entry->type == entry_type);
+    HDassert(entry == &(base_addr[entry->index]));
+    HDassert(entry == entry->self);
+    HDassert(entry->header.addr == entry->addr);
+    HDassert((entry->type == VARIABLE_ENTRY_TYPE) || \
+              (entry->size == entry_sizes[entry->type]));
+
+    /* Increment count for appropriate action */
+    switch(action) {
+        case H5C_NOTIFY_ACTION_AFTER_INSERT:	/* Entry has been added */
+        case H5C_NOTIFY_ACTION_AFTER_LOAD:	/* to the cache.        */
+            entry->notify_after_insert_count++;
+            break;
+
+        case H5C_NOTIFY_ACTION_AFTER_FLUSH:
+	    /* do nothing */
+	    break;
 
-    *size_ptr = entry_ptr->size;
+        case H5C_NOTIFY_ACTION_BEFORE_EVICT:      /* Entry is about to be evicted from cache */
+            entry->notify_before_evict_count++;
+            break;
+
+        default:
+            HDassert(0 && "Unknown notify action!?!");
+    } /* end switch */
 
     return(SUCCEED);
+} /* notify() */
 
-} /* size() */
+herr_t
+notify_notify(H5C_notify_action_t action, void *thing)
+{
+    return(notify(action, thing, NOTIFY_ENTRY_TYPE));
+}
 
+

+/*-------------------------------------------------------------------------
+ * Function:	free_icr & friends
+ *
+ * Purpose:	Nominally, this callback is supposed to free the
+ * 		in core representation of the entry.
+ *
+ * 		In the context of this test bed, we use it to do
+ * 		do all the processing we used to do on a destroy.
+ * 		In particular, we use it to release all the pins
+ * 		that this entry may have on other entries.
+ *
+ * 		The helper functions verify that the correct version of
+ * 		serialize is being called, and then call free_icr
+ * 		proper.
+ *
+ * Return:	SUCCEED
+ *
+ * Programmer:	John Mainzer
+ *              9/19/07
+ *
+ *-------------------------------------------------------------------------
+ */
 herr_t
-pico_size(H5F_t * f, void * thing, size_t * size_ptr)
+free_icr(test_entry_t *entry, int32_t entry_type)
 {
-    HDassert ( ((test_entry_t *)thing)->type == PICO_ENTRY_TYPE );
-    return(size(f, thing, size_ptr));
+    test_entry_t *base_addr;
+
+    HDassert(entry);
+
+    base_addr = entries[entry->type];
+
+    HDassert(entry->type == entry_type);
+    HDassert(entry->index >= 0);
+    HDassert(entry->index <= max_indices[entry->type]);
+    HDassert(entry == &(base_addr[entry->index]));
+    HDassert(entry == entry->self);
+    HDassert(entry->cache_ptr != NULL);
+    HDassert(entry->cache_ptr->magic == H5C__H5C_T_MAGIC);
+    HDassert((entry->header.destroy_in_progress) ||
+              (entry->header.addr == entry->addr));
+    HDassert(entry->header.size == entry->size);
+    HDassert((entry->type == VARIABLE_ENTRY_TYPE) ||
+	      (entry->size == entry_sizes[entry->type]));
+
+    if(entry->num_pins > 0) {
+        int i;
+
+	for(i = 0; i < entry->num_pins; i++) {
+            test_entry_t *pinned_entry;
+            test_entry_t *pinned_base_addr;
+
+	    pinned_base_addr = entries[entry->pin_type[i]];
+	    pinned_entry = &(pinned_base_addr[entry->pin_idx[i]]);
+
+	    HDassert(0 <= pinned_entry->type);
+            HDassert(pinned_entry->type < NUMBER_OF_ENTRY_TYPES);
+	    HDassert(pinned_entry->type == entry->pin_type[i]);
+	    HDassert(pinned_entry->index >= 0);
+	    HDassert(pinned_entry->index <= max_indices[pinned_entry->type]);
+	    HDassert(pinned_entry->index == entry->pin_idx[i]);
+	    HDassert(pinned_entry == pinned_entry->self);
+	    HDassert(pinned_entry->header.is_pinned);
+	    HDassert(pinned_entry->is_pinned);
+	    HDassert(pinned_entry->pinning_ref_count > 0);
+
+	    pinned_entry->pinning_ref_count--;
+
+	    if(pinned_entry->pinning_ref_count <= 0) {
+                HDassert(pinned_entry->file_ptr);
+
+		unpin_entry(pinned_entry->type, pinned_entry->index);
+	    } /* end if */
+
+	    entry->pin_type[i] = -1;
+	    entry->pin_idx[i] = -1;
+	} /* end if */
+	entry->num_pins = 0;
+    } /* end if */
+
+    entry->destroyed = TRUE;
+    entry->cache_ptr = NULL;
+
+    return(SUCCEED);
+} /* free_icr() */
+
+herr_t
+pico_free_icr(void *thing)
+{
+    return free_icr((test_entry_t *)thing, PICO_ENTRY_TYPE);
 }
 
 herr_t
-nano_size(H5F_t * f, void * thing, size_t * size_ptr)
+nano_free_icr(void *thing)
 {
-    HDassert ( ((test_entry_t *)thing)->type == NANO_ENTRY_TYPE );
-    return(size(f, thing, size_ptr));
+    return free_icr((test_entry_t *)thing, NANO_ENTRY_TYPE);
 }
 
 herr_t
-micro_size(H5F_t * f, void * thing, size_t * size_ptr)
+micro_free_icr(void *thing)
 {
-    HDassert ( ((test_entry_t *)thing)->type == MICRO_ENTRY_TYPE );
-    return(size(f, thing, size_ptr));
+    return free_icr((test_entry_t *)thing, MICRO_ENTRY_TYPE);
 }
 
 herr_t
-tiny_size(H5F_t * f, void * thing, size_t * size_ptr)
+tiny_free_icr(void *thing)
 {
-    HDassert ( ((test_entry_t *)thing)->type == TINY_ENTRY_TYPE );
-    return(size(f, thing, size_ptr));
+    return free_icr((test_entry_t *)thing, TINY_ENTRY_TYPE);
 }
 
 herr_t
-small_size(H5F_t * f, void * thing, size_t * size_ptr)
+small_free_icr(void *thing)
 {
-    HDassert ( ((test_entry_t *)thing)->type == SMALL_ENTRY_TYPE );
-    return(size(f, thing, size_ptr));
+    return free_icr((test_entry_t *)thing, SMALL_ENTRY_TYPE);
 }
 
 herr_t
-medium_size(H5F_t * f, void * thing, size_t * size_ptr)
+medium_free_icr(void *thing)
 {
-    HDassert ( ((test_entry_t *)thing)->type == MEDIUM_ENTRY_TYPE );
-    return(size(f, thing, size_ptr));
+    return free_icr((test_entry_t *)thing, MEDIUM_ENTRY_TYPE);
 }
 
 herr_t
-large_size(H5F_t * f, void * thing, size_t * size_ptr)
+large_free_icr(void *thing)
 {
-    HDassert ( ((test_entry_t *)thing)->type == LARGE_ENTRY_TYPE );
-    return(size(f, thing, size_ptr));
+    return free_icr((test_entry_t *)thing, LARGE_ENTRY_TYPE);
 }
 
 herr_t
-huge_size(H5F_t * f, void * thing, size_t * size_ptr)
+huge_free_icr(void *thing)
 {
-    HDassert ( ((test_entry_t *)thing)->type == HUGE_ENTRY_TYPE );
-    return(size(f, thing, size_ptr));
+    return free_icr((test_entry_t *)thing, HUGE_ENTRY_TYPE);
 }
 
 herr_t
-monster_size(H5F_t * f, void * thing, size_t * size_ptr)
+monster_free_icr(void *thing)
 {
-    HDassert ( ((test_entry_t *)thing)->type == MONSTER_ENTRY_TYPE );
-    return(size(f, thing, size_ptr));
+    return free_icr((test_entry_t *)thing, MONSTER_ENTRY_TYPE);
 }
 
 herr_t
-variable_size(H5F_t * f, void * thing, size_t * size_ptr)
+variable_free_icr(void *thing)
 {
-    HDassert ( ((test_entry_t *)thing)->type == VARIABLE_ENTRY_TYPE );
-    return(size(f, thing, size_ptr));
+    return free_icr((test_entry_t *)thing, VARIABLE_ENTRY_TYPE);
 }
 
+herr_t
+notify_free_icr(void *thing)
+{
+    return free_icr((test_entry_t *)thing, NOTIFY_ENTRY_TYPE);
+}
 
 

 /**************************************************************************/
@@ -1218,7 +1802,8 @@ add_flush_op(int target_type,
 	     int type,
 	     int idx,
 	     hbool_t flag,
-	     size_t new_size)
+	     size_t new_size,
+             unsigned * order_ptr)
 {
     int i;
     test_entry_t * target_base_addr;
@@ -1251,6 +1836,7 @@ add_flush_op(int target_type,
 	(target_entry_ptr->flush_ops)[i].idx = idx;
 	(target_entry_ptr->flush_ops)[i].flag = flag;
 	(target_entry_ptr->flush_ops)[i].size = new_size;
+	(target_entry_ptr->flush_ops)[i].order_ptr = order_ptr;
 
     }
 
@@ -1487,17 +2073,10 @@ execute_flush_op(H5F_t * file_ptr,
 		    HDassert( op_ptr->size <= VARIABLE_ENTRY_SIZE );
 
                     entry_ptr->size = op_ptr->size;
-		    (*flags_ptr) |= H5C_CALLBACK__SIZE_CHANGED_FLAG;
-		    entry_ptr->flush_op_self_resize_in_progress = TRUE;
 
-		    /* if the entry is in the process of being destroyed,
-		     * set the header size to match the entry size so as
-		     * to avoid a spurious failure in the destroy callback.
-		     */
-		    if ( entry_ptr->header.destroy_in_progress ) {
+		    (*flags_ptr) |= H5C__SERIALIZE_RESIZED_FLAG;
 
-			entry_ptr->header.size = entry_ptr->size;
-		    }
+		    entry_ptr->flush_op_self_resize_in_progress = TRUE;
 
 		} else {
 
@@ -1509,10 +2088,64 @@ execute_flush_op(H5F_t * file_ptr,
 		break;
 
 	    case FLUSH_OP__MOVE:
-		move_entry(cache_ptr, op_ptr->type, op_ptr->idx,
-			     op_ptr->flag);
+		if((entry_ptr->type == op_ptr->type) &&
+                        (entry_ptr->index == op_ptr->idx)) {
+
+                    /* the flush operation is acting on the entry to
+		     * which it is attached.  Handle this here:
+		     */
+
+		    HDassert(((*flags_ptr) & H5C__SERIALIZE_RESIZED_FLAG) != 0);
+                    (*flags_ptr) |= H5C__SERIALIZE_MOVED_FLAG;
+
+		    if(op_ptr->flag) {
+                        HDassert(entry_ptr->addr == entry_ptr->alt_addr);
+                        entry_ptr->addr = entry_ptr->main_addr;
+                        entry_ptr->at_main_addr = TRUE;
+                    } /* end if */
+                    else {
+                        HDassert(entry_ptr->addr == entry_ptr->main_addr);
+                        entry_ptr->addr = entry_ptr->alt_addr;
+                        entry_ptr->at_main_addr = FALSE;
+                    } /* end else */
+		} /* end if */
+                else
+		    move_entry(cache_ptr, op_ptr->type, op_ptr->idx, op_ptr->flag);
+		break;
+
+	    case FLUSH_OP__ORDER:
+                HDassert( op_ptr->order_ptr );
+                entry_ptr->flush_order = *op_ptr->order_ptr;
+                (*op_ptr->order_ptr)++;
+		break;
+
+	    case FLUSH_OP__EXPUNGE:
+		/* the expunge flush op exists to allow us to simulate the 
+		 * case in which an entry is removed from the cashe as the 
+ 		 * the result of the flush of a second entry.  At present,
+		 * this can only happen via the take ownership flag, but 
+		 * we will make this test feature more general to as to make
+		 * tests easier to write.
+		 *
+		 * When this operation is executed, the target entry is 
+		 * removed from the cache without being flushed if dirty
+		 * via the expunge_entry() test function (which calls 
+ 		 * H5C_expunge_entry()).  Note that this flush operation 
+		 * must always be executed on an entry other than the 
+		 * entry being flushed.
+		 */
+		HDassert( ( entry_ptr->type != op_ptr->type ) ||
+                          ( entry_ptr->index != op_ptr->idx ) );
+		expunge_entry(file_ptr, op_ptr->type, op_ptr->idx);
 		break;
 
+	    case FLUSH_OP__DEST_FLUSH_DEP:
+		HDassert( ( entry_ptr->type != op_ptr->type ) ||
+                          ( entry_ptr->index != op_ptr->idx ) );
+		destroy_flush_dependency(op_ptr->type, op_ptr->idx,
+                                         entry_ptr->type, entry_ptr->index);
+                break;
+
 	    default:
                 pass = FALSE;
                 failure_mssg = "Undefined flush op code.";
@@ -1577,7 +2210,7 @@ entry_in_cache(H5C_t * cache_ptr,
 /*-------------------------------------------------------------------------
  * Function:	reset_entries
  *
- * Purpose:	reset the contents of the entries arrays to know values.
+ * Purpose:	reset the contents of the entries arrays to known values.
  *
  * Return:	void
  *
@@ -1606,8 +2239,8 @@ reset_entries(void)
         {
             int j;
 
-            max_index = max_indices[i];
             entry_size = entry_sizes[i];
+            max_index = max_indices[i];
             base_addr = entries[i];
             orig_base_addr = orig_entries[i];
 
@@ -1638,6 +2271,8 @@ reset_entries(void)
 
                 base_addr[j].self = &(base_addr[j]);
                 base_addr[j].cache_ptr = NULL;
+                base_addr[j].written_to_main_addr = FALSE;
+                base_addr[j].written_to_alt_addr = FALSE;
                 base_addr[j].addr = addr;
                 base_addr[j].at_main_addr = TRUE;
                 base_addr[j].main_addr = addr;
@@ -1645,13 +2280,15 @@ reset_entries(void)
                 base_addr[j].size = entry_size;
                 base_addr[j].type = i;
                 base_addr[j].index = j;
-                base_addr[j].reads = 0;
-                base_addr[j].writes = 0;
+                base_addr[j].serializes = 0;
+                base_addr[j].deserializes = 0;
                 base_addr[j].is_dirty = FALSE;
                 base_addr[j].is_protected = FALSE;
                 base_addr[j].is_read_only = FALSE;
                 base_addr[j].ro_ref_count = FALSE;
 
+                base_addr[j].is_corked = FALSE;
+
                 base_addr[j].is_pinned = FALSE;
                 base_addr[j].pinning_ref_count = 0;
                 base_addr[j].num_pins = 0;
@@ -1672,10 +2309,25 @@ reset_entries(void)
                 }
                 base_addr[j].flush_op_self_resize_in_progress = FALSE;
 
-                base_addr[j].loaded = FALSE;
-                base_addr[j].cleared = FALSE;
-                base_addr[j].flushed = FALSE;
+                base_addr[j].deserialized = FALSE;
+                base_addr[j].serialized = FALSE;
                 base_addr[j].destroyed = FALSE;
+                base_addr[j].expunged = FALSE;
+
+                base_addr[j].flush_dep_npar = 0;
+                base_addr[j].flush_dep_nchd = 0;
+                base_addr[j].flush_dep_ndirty_chd = 0;
+                base_addr[j].pinned_from_client = FALSE;
+                base_addr[j].pinned_from_cache = FALSE;
+
+                base_addr[j].flush_order = 0;
+
+                base_addr[j].notify_after_insert_count = 0;
+                base_addr[j].notify_before_evict_count = 0;
+
+                base_addr[j].actual_len = 0;
+                base_addr[j].max_verify_ct = 0;
+                base_addr[j].verify_ct = 0;
 
                 addr += (haddr_t)entry_size;
                 alt_addr += (haddr_t)entry_size;
@@ -1768,11 +2420,16 @@ resize_entry(H5F_t * file_ptr,
                     failure_mssg = "entry to be resized is not pinned or protected.";
 
                 } else {
+                    hbool_t was_dirty = entry_ptr->is_dirty;
 
                     entry_ptr->size = new_size;
 
                     result = H5C_resize_entry((void *)entry_ptr, new_size);
                     entry_ptr->is_dirty = TRUE;
+                    if(entry_ptr->flush_dep_npar > 0
+                            && entry_ptr->flush_dep_ndirty_chd == 0
+                            && !was_dirty)
+                        mark_flush_dep_dirty(entry_ptr);
 
                     if ( result != SUCCEED ) {
 
@@ -1880,27 +2537,35 @@ verify_entry_status(H5C_t * cache_ptr,
 		    struct expected_entry_status expected[])
 {
     static char    msg[256];
-    hbool_t        in_cache = FALSE; /* will set to TRUE if necessary */
     int            i;
-    test_entry_t * entry_ptr;
-    test_entry_t * base_addr;
 
     i = 0;
     while ( ( pass ) && ( i < num_entries ) )
     {
-        base_addr = entries[expected[i].entry_type];
-	entry_ptr = &(base_addr[expected[i].entry_index]);
+        test_entry_t  * base_addr = entries[expected[i].entry_type];
+        test_entry_t  * entry_ptr = &(base_addr[expected[i].entry_index]);
+        hbool_t         in_cache = FALSE; /* will set to TRUE if necessary */
+        unsigned        u;              /* Local index variable */
 
 	if ( ( ! expected[i].in_cache ) &&
-	     ( ( expected[i].is_dirty ) ||
-	       ( expected[i].is_protected ) ||
-	       ( expected[i].is_pinned ) ) ) {
+             ( ( expected[i].is_protected ) || ( expected[i].is_pinned ) ) ) {
 
 	    pass = FALSE;
 	    sprintf(msg, "%d: Contradictory data in expected[%d].\n", tag, i);
 	    failure_mssg = msg;
 	}
 
+        if ( ( ! expected[i].in_cache ) &&
+             ( expected[i].is_dirty ) &&
+             ( ! entry_ptr->expunged ) ) {
+
+	    pass = FALSE;
+	    sprintf(msg, 
+                  "%d: expected[%d] specs non-expunged, dirty, non-resident.\n",
+                   tag, i);
+	    failure_mssg = msg;
+        }
+
         if ( pass ) {
 
 	    in_cache = entry_in_cache(cache_ptr, expected[i].entry_type,
@@ -1926,7 +2591,7 @@ verify_entry_status(H5C_t * cache_ptr,
 
 	        pass = FALSE;
 	        sprintf(msg,
-                        "%d entry (%d, %d) size actualexpected = %ld/%ld.\n",
+                        "%d entry (%d, %d) size actual/expected = %ld/%ld.\n",
 			tag,
 	                (int)expected[i].entry_type,
 		        (int)expected[i].entry_index,
@@ -2048,6 +2713,22 @@ verify_entry_status(H5C_t * cache_ptr,
 	    }
 	}
 
+	if ( pass ) {
+
+	    if ( entry_ptr->is_corked != expected[i].is_corked) {
+
+	        pass = FALSE;
+	        sprintf(msg,
+                      "%d entry (%d, %d) is_corked actual/expected = %d/%d.\n",
+		      tag,
+		      (int)expected[i].entry_type,
+		      (int)expected[i].entry_index,
+		      (int)(entry_ptr->is_corked),
+		      (int)expected[i].is_corked);
+	        failure_mssg = msg;
+	    }
+	}
+
 	if ( ( pass ) && ( in_cache ) ) {
 
 	    if ( entry_ptr->header.is_pinned != expected[i].is_pinned ) {
@@ -2066,29 +2747,161 @@ verify_entry_status(H5C_t * cache_ptr,
 
 	if ( pass ) {
 
-            if ( ( entry_ptr->loaded != expected[i].loaded ) ||
-	         ( entry_ptr->cleared != expected[i].cleared ) ||
-	         ( entry_ptr->flushed != expected[i].flushed ) ||
+            if ( ( entry_ptr->deserialized != expected[i].deserialized ) ||
+	         ( entry_ptr->serialized != expected[i].serialized ) ||
 	         ( entry_ptr->destroyed != expected[i].destroyed ) ) {
 
 	        pass = FALSE;
                 sprintf(msg,
-                        "%d entry (%d,%d) loaded = %d(%d), clrd = %d(%d), flshd = %d(%d), dest = %d(%d)\n",
+                        "%d entry (%d,%d) deserialized = %d(%d), serialized = %d(%d), dest = %d(%d)\n",
 			tag,
 		        (int)expected[i].entry_type,
 		        (int)expected[i].entry_index,
-		        (int)(entry_ptr->loaded),
-		        (int)(expected[i].loaded),
-		        (int)(entry_ptr->cleared),
-		        (int)(expected[i].cleared),
-		        (int)(entry_ptr->flushed),
-		        (int)(expected[i].flushed),
+		        (int)(entry_ptr->deserialized),
+		        (int)(expected[i].deserialized),
+		        (int)(entry_ptr->serialized),
+		        (int)(expected[i].serialized),
 		        (int)(entry_ptr->destroyed),
 		        (int)(expected[i].destroyed));
                 failure_mssg = msg;
             }
         }
-	i++;
+
+        /* Check flush dependency fields */
+
+        /* # of flush dependency parents */
+        if ( pass ) {
+            if ( entry_ptr->flush_dep_npar != expected[i].flush_dep_npar ) {
+                pass = FALSE;
+                sprintf(msg,
+                      "%d entry (%d, %d) flush_dep_npar actual/expected = %u/%u.\n",
+                      tag,
+                      expected[i].entry_type,
+                      expected[i].entry_index,
+                      entry_ptr->flush_dep_npar,
+                      expected[i].flush_dep_npar);
+                failure_mssg = msg;
+            } /* end if */
+        } /* end if */
+        if ( ( pass ) && ( in_cache ) ) {
+            if ( entry_ptr->header.flush_dep_nparents != expected[i].flush_dep_npar ) {
+                pass = FALSE;
+                sprintf(msg,
+                      "%d entry (%d, %d) header flush_dep_nparents actual/expected = %u/%u.\n",
+                      tag,
+                      expected[i].entry_type,
+                      expected[i].entry_index,
+                      entry_ptr->header.flush_dep_nparents,
+                      expected[i].flush_dep_npar);
+                failure_mssg = msg;
+            } /* end if */
+        } /* end if */
+
+        /* Flush dependency parent type & index.  Note this algorithm assumes
+         * that the parents in both arrays are in the same order. */
+        if ( pass ) {
+            for ( u = 0; u < entry_ptr->flush_dep_npar; u++ ) {
+                if ( entry_ptr->flush_dep_par_type[u] != expected[i].flush_dep_par_type[u] ) {
+                    pass = FALSE;
+                    sprintf(msg,
+                          "%d entry (%d, %d) flush_dep_par_type[%u] actual/expected = %d/%d.\n",
+                          tag,
+                          expected[i].entry_type,
+                          expected[i].entry_index,
+                          u,
+                          entry_ptr->flush_dep_par_type[u],
+                          expected[i].flush_dep_par_type[u]);
+                    failure_mssg = msg;
+                } /* end if */
+            } /* end for */
+        } /* end if */
+        if ( pass ) {
+            for ( u = 0; u < entry_ptr->flush_dep_npar; u++ ) {
+                if ( entry_ptr->flush_dep_par_idx[u] != expected[i].flush_dep_par_idx[u] ) {
+                    pass = FALSE;
+                    sprintf(msg,
+                          "%d entry (%d, %d) flush_dep_par_idx[%u] actual/expected = %d/%d.\n",
+                          tag,
+                          expected[i].entry_type,
+                          expected[i].entry_index,
+                          u,
+                          entry_ptr->flush_dep_par_idx[u],
+                          expected[i].flush_dep_par_idx[u]);
+                    failure_mssg = msg;
+                } /* end if */
+            } /* end for */
+        } /* end if */
+
+        /* # of flush dependency children and dirty children */
+        if ( pass ) {
+            if ( entry_ptr->flush_dep_nchd != expected[i].flush_dep_nchd ) {
+                pass = FALSE;
+                sprintf(msg,
+                      "%d entry (%d, %d) flush_dep_nchd actual/expected = %u/%u.\n",
+                      tag,
+                      expected[i].entry_type,
+                      expected[i].entry_index,
+                      entry_ptr->flush_dep_nchd,
+                      expected[i].flush_dep_nchd);
+                failure_mssg = msg;
+            } /* end if */
+        } /* end if */
+        if ( ( pass ) && ( in_cache ) ) {
+            if ( entry_ptr->header.flush_dep_nchildren != expected[i].flush_dep_nchd ) {
+                pass = FALSE;
+                sprintf(msg,
+                      "%d entry (%d, %d) header flush_dep_nchildren actual/expected = %u/%u.\n",
+                      tag,
+                      expected[i].entry_type,
+                      expected[i].entry_index,
+                      entry_ptr->header.flush_dep_nchildren,
+                      expected[i].flush_dep_nchd);
+                failure_mssg = msg;
+            } /* end if */
+        } /* end if */
+        if ( pass ) {
+            if ( entry_ptr->flush_dep_ndirty_chd != expected[i].flush_dep_ndirty_chd ) {
+                pass = FALSE;
+                sprintf(msg,
+                      "%d entry (%d, %d) flush_dep_ndirty_chd actual/expected = %u/%u.\n",
+                      tag,
+                      expected[i].entry_type,
+                      expected[i].entry_index,
+                      entry_ptr->flush_dep_ndirty_chd,
+                      expected[i].flush_dep_ndirty_chd);
+                failure_mssg = msg;
+            } /* end if */
+        } /* end if */
+        if ( ( pass ) && ( in_cache ) ) {
+            if ( entry_ptr->header.flush_dep_ndirty_children != expected[i].flush_dep_ndirty_chd ) {
+                pass = FALSE;
+                sprintf(msg,
+                      "%d entry (%d, %d) header flush_dep_ndirty_children actual/expected = %u/%u.\n",
+                      tag,
+                      expected[i].entry_type,
+                      expected[i].entry_index,
+                      entry_ptr->header.flush_dep_ndirty_children,
+                      expected[i].flush_dep_ndirty_chd);
+                failure_mssg = msg;
+            } /* end if */
+        } /* end if */
+
+        /* Flush dependency flush order */
+        if ( pass ) {
+            if ( expected[i].flush_order >= 0 && entry_ptr->flush_order != (unsigned)expected[i].flush_order ) {
+                pass = FALSE;
+                sprintf(msg,
+                      "%d entry (%d, %d) flush_order actual/expected = %u/%d.\n",
+                      tag,
+                      expected[i].entry_type,
+                      expected[i].entry_index,
+                      entry_ptr->flush_order,
+                      expected[i].flush_order);
+                failure_mssg = msg;
+            } /* end if */
+        } /* end if */
+
+        i++;
     } /* while */
 
     return;
@@ -2156,26 +2969,42 @@ verify_unprotected(void)
 } /* verify_unprotected() */
 
 

-/*-------------------------------------------------------------------------
- * Function:	setup_cache()
+/*****************************************************************************
  *
- * Purpose:	Allocate a cache of the desired size and configure it for
- *		use in the test bed.  Return a pointer to the new cache
- *		structure.
+ * Function:    setup_cache()
  *
- * Return:	Pointer to new cache, or NULL on failure.
+ * Purpose:     Open an HDF file.  This will allocate an instance and
+ * 		initialize an associated instance of H5C_t.  However,
+ * 		we want to test an instance of H5C_t, so allocate and
+ * 		initialize one with the file ID returned by the call to
+ * 		H5Fcreate().  Return a pointer to this instance of H5C_t.
  *
- * Programmer:	John Mainzer
- *              6/11/04
+ *		Observe that we open a HDF file because the cache now
+ *		writes directly to file, and we need the file I/O facilities
+ *		associated with the file.
  *
- *-------------------------------------------------------------------------
- */
+ *		To avoid tripping on error check code, must allocate enough
+ *		space in the file to hold all the test entries and their
+ *		alternates.  This is a little sticky, as the addresses of
+ *		all the test entries are determined at compile time.
+ *
+ *		Deal with this by choosing BASE_ADDR large enough that
+ *		the base address of the allocate space will be less than
+ *		or equal to BASE_ADDR, and then requesting an extra BASE_ADDR
+ *		bytes, so we don't have to wory about exceeding the allocation.
+ *
+ * Return:      Success:        Ptr to H5C_t
+ *
+ *              Failure:        NULL
+ *
+ * Programmer:  JRM -- 9/13/07
+ *
+ *****************************************************************************/
 
 H5F_t *
 setup_cache(size_t max_cache_size,
             size_t min_clean_size)
 {
-    const char * fcn_name = "setup_cache()";
     char filename[512];
     hbool_t show_progress = FALSE;
     hbool_t verbose = TRUE;
@@ -2189,7 +3018,7 @@ setup_cache(size_t max_cache_size,
 
     if ( show_progress ) /* 1 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     saved_fid = -1;
 
@@ -2206,7 +3035,7 @@ setup_cache(size_t max_cache_size,
 
     if ( show_progress ) /* 2 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( ( pass ) && ( try_core_file_driver ) ) {
 
@@ -2228,7 +3057,7 @@ setup_cache(size_t max_cache_size,
 	    core_file_driver_failed = TRUE;
 
             if ( verbose ) {
-                HDfprintf(stdout, "%s: H5Fcreate() with CFD failed.\n", fcn_name);
+                HDfprintf(stdout, "%s: H5Fcreate() with CFD failed.\n", FUNC);
             }
 
         } else {
@@ -2239,7 +3068,7 @@ setup_cache(size_t max_cache_size,
 
     if ( show_progress ) /* 3 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     /* if we either aren't using the core file driver, or a create
      * with the core file driver failed, try again with a regular file.
@@ -2257,14 +3086,14 @@ setup_cache(size_t max_cache_size,
             failure_mssg = "H5Fcreate() failed.";
 
             if ( verbose ) {
-                HDfprintf(stdout, "%s: H5Fcreate() failed.\n", fcn_name);
+                HDfprintf(stdout, "%s: H5Fcreate() failed.\n", FUNC);
             }
         }
     }
 
     if ( show_progress ) /* 4 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -2278,7 +3107,7 @@ setup_cache(size_t max_cache_size,
             failure_mssg = "H5Fflush() failed.";
 
             if ( verbose ) {
-                HDfprintf(stdout, "%s: H5Fflush() failed.\n", fcn_name);
+                HDfprintf(stdout, "%s: H5Fflush() failed.\n", FUNC);
             }
 
         } else {
@@ -2291,7 +3120,7 @@ setup_cache(size_t max_cache_size,
                 failure_mssg = "Can't get file_ptr.";
 
                 if ( verbose ) {
-                    HDfprintf(stdout, "%s: H5Fflush() failed.\n", fcn_name);
+                    HDfprintf(stdout, "%s: H5Fflush() failed.\n", FUNC);
                 }
 	    }
         }
@@ -2299,7 +3128,7 @@ setup_cache(size_t max_cache_size,
 
     if ( show_progress ) /* 5 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -2351,7 +3180,7 @@ setup_cache(size_t max_cache_size,
 
     if ( show_progress ) /* 6 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
@@ -2361,7 +3190,7 @@ setup_cache(size_t max_cache_size,
             failure_mssg = "H5C_create() failed.";
 
             if ( verbose ) {
-                 HDfprintf(stdout, "%s: H5C_create() failed.\n", fcn_name);
+                 HDfprintf(stdout, "%s: H5C_create() failed.\n", FUNC);
             }
 
         } else if ( cache_ptr->magic != H5C__H5C_T_MAGIC ) {
@@ -2370,18 +3199,18 @@ setup_cache(size_t max_cache_size,
 	    failure_mssg = "Bad cache_ptr magic.";
 
             if ( verbose ) {
-                HDfprintf(stdout, "%s: Bad cache_ptr magic.\n", fcn_name);
+                HDfprintf(stdout, "%s: Bad cache_ptr magic.\n", FUNC);
             }
 	}
     }
 
     if ( show_progress ) /* 7 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) { /* allocate space for test entries */
 
-        actual_base_addr = H5MF_alloc(file_ptr, H5FD_MEM_DEFAULT, H5P_DEFAULT,
+        actual_base_addr = H5MF_alloc(file_ptr, H5FD_MEM_DEFAULT, H5P_DATASET_XFER_DEFAULT,
 			              (hsize_t)(ADDR_SPACE_SIZE + BASE_ADDR));
 
 	if ( actual_base_addr == HADDR_UNDEF ) {
@@ -2390,7 +3219,7 @@ setup_cache(size_t max_cache_size,
 	    failure_mssg = "H5MF_alloc() failed.";
 
 	    if ( verbose ) {
-                HDfprintf(stdout, "%s: H5MF_alloc() failed.\n", fcn_name);
+                HDfprintf(stdout, "%s: H5MF_alloc() failed.\n", FUNC);
             }
 
 	} else if ( actual_base_addr > BASE_ADDR ) {
@@ -2404,7 +3233,7 @@ setup_cache(size_t max_cache_size,
 
 	    if ( verbose ) {
                 HDfprintf(stdout, "%s: actual_base_addr > BASE_ADDR.\n",
-			  fcn_name);
+			  FUNC);
             }
         }
 
@@ -2413,18 +3242,20 @@ setup_cache(size_t max_cache_size,
 
     if ( show_progress ) /* 8 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     if ( pass ) {
 
-        H5C_stats__reset(cache_ptr);
+        /* Need to set this else all cache tests will fail */
+        cache_ptr->ignore_tags = TRUE;
 
+        H5C_stats__reset(cache_ptr);
         ret_val = file_ptr;
     }
 
     if ( show_progress ) /* 9 */
         HDfprintf(stdout, "%s() - %0d -- pass = %d\n",
-                  fcn_name, mile_stone++, (int)pass);
+                  FUNC, mile_stone++, (int)pass);
 
     return(ret_val);
 } /* setup_cache() */
@@ -2433,8 +3264,11 @@ setup_cache(size_t max_cache_size,
 /*-------------------------------------------------------------------------
  * Function:	takedown_cache()
  *
- * Purpose:	Flush the specified cache and disable it.  If requested,
- *		dump stats first.  If pass is FALSE, do nothing.
+ * Purpose:	Flush the specified cache and destroy it.  If requested,
+ *		dump stats first.  Then close and delete the associate
+ *		file.
+ *
+ *		If pass is FALSE, do nothing.
  *
  * Return:	void
  *
@@ -2461,7 +3295,7 @@ takedown_cache(H5F_t * file_ptr,
 
         flush_cache(file_ptr, TRUE, FALSE, FALSE);
 
-        H5C_dest(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT);
+        H5C_dest(file_ptr, H5P_DATASET_XFER_DEFAULT);
 
 	if ( saved_cache != NULL ) {
 
@@ -2486,7 +3320,7 @@ takedown_cache(H5F_t * file_ptr,
                 HDassert ( file_ptr );
             }
 
-            H5MF_xfree(file_ptr, H5FD_MEM_DEFAULT, H5P_DEFAULT, saved_actual_base_addr,
+            H5MF_xfree(file_ptr, H5FD_MEM_DEFAULT, H5P_DATASET_XFER_DEFAULT, saved_actual_base_addr,
                                           (hsize_t)(ADDR_SPACE_SIZE + BASE_ADDR));
             saved_actual_base_addr = HADDR_UNDEF;
         }
@@ -2536,6 +3370,11 @@ takedown_cache(H5F_t * file_ptr,
  * Programmer:	John Mainzer
  *              7/6/06
  *
+ * Changes:	Added code to set entry_ptr->expunged to TRUE if 
+ *		H5C_expunge_entry() returns without error.
+ *
+ *					JRM -- 8/21/14
+ *
  *-------------------------------------------------------------------------
  */
 
@@ -2544,7 +3383,6 @@ expunge_entry(H5F_t * file_ptr,
               int32_t type,
               int32_t idx)
 {
-    /* const char * fcn_name = "expunge_entry()"; */
     herr_t result;
     test_entry_t * base_addr;
     test_entry_t * entry_ptr;
@@ -2571,7 +3409,7 @@ expunge_entry(H5F_t * file_ptr,
         HDassert( ! ( entry_ptr->header.is_pinned ) );
 	HDassert( ! ( entry_ptr->is_pinned ) );
 
-        result = H5C_expunge_entry(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
+        result = H5C_expunge_entry(file_ptr, H5P_DATASET_XFER_DEFAULT,
                 &(types[type]), entry_ptr->addr, H5C__NO_FLAGS_SET);
 
         if ( result < 0 ) {
@@ -2579,6 +3417,9 @@ expunge_entry(H5F_t * file_ptr,
             pass = FALSE;
             failure_mssg = "error in H5C_expunge_entry().";
 
+        } else {
+
+	    entry_ptr->expunged = TRUE;
         }
     }
 
@@ -2607,38 +3448,30 @@ flush_cache(H5F_t * file_ptr,
             hbool_t dump_stats,
             hbool_t dump_detailed_stats)
 {
-    const char * fcn_name = "flush_cache()";
     hbool_t verbose = FALSE;
 
     verify_unprotected();
 
     if(pass) {
-        H5C_t * cache_ptr = NULL;
+        H5C_t * cache_ptr;
         herr_t result = 0;
 
         HDassert(file_ptr);
 
         cache_ptr = file_ptr->shared->cache;
 
-        if(destroy_entries) {
-
+        if(destroy_entries)
             result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT,
-                    H5P_DATASET_XFER_DEFAULT, H5C__FLUSH_INVALIDATE_FLAG);
-
-        }
-        else {
+                                     H5C__FLUSH_INVALIDATE_FLAG);
 
+        else
             result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT,
-                    H5P_DATASET_XFER_DEFAULT, H5C__NO_FLAGS_SET);
-        }
-
-        if(dump_stats) {
+                                     H5C__NO_FLAGS_SET);
 
+        if(dump_stats)
             H5C_stats(cache_ptr, "test cache", dump_detailed_stats);
-        }
 
         if(result < 0) {
-
             pass = FALSE;
             failure_mssg = "error in H5C_flush_cache().";
         }
@@ -2647,23 +3480,101 @@ flush_cache(H5F_t * file_ptr,
                 || (cache_ptr->clean_index_size != 0)
                 || (cache_ptr->dirty_index_size != 0))) {
 
-            if(verbose) {
-                HDfprintf(stdout,
-                        "%s: unexpected il/is/cis/dis = %lld/%lld/%lld/%lld.\n",
-                        fcn_name,
-                        (long long)(cache_ptr->index_len),
-                        (long long)(cache_ptr->index_size),
-                        (long long)(cache_ptr->clean_index_size),
-                        (long long)(cache_ptr->dirty_index_size));
-            }
+            if(verbose) {
+                HDfprintf(stdout,
+                        "%s: unexpected il/is/cis/dis = %lld/%lld/%lld/%lld.\n",
+                        FUNC,
+                        (long long)(cache_ptr->index_len),
+                        (long long)(cache_ptr->index_size),
+                        (long long)(cache_ptr->clean_index_size),
+                        (long long)(cache_ptr->dirty_index_size));
+            }
+            pass = FALSE;
+            failure_mssg = "non zero index len/sizes after H5C_flush_cache() with invalidate.";
+        }
+    }
+
+    return;
+
+} /* flush_cache() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	cork_entry_type()
+ *
+ * Purpose:	To "cork" an object:
+ *		--insert the base address of an entry type into
+ *		  the cache's list of corked object addresses
+ *
+ * Return:	void
+ *
+ * Programmer:	Vailin Choi; Jan 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+cork_entry_type(H5F_t * file_ptr, int32_t type)
+{
+    H5C_t * cache_ptr;
+    haddr_t baddrs;
+    herr_t result;
+
+    if(pass) {
+        cache_ptr = file_ptr->shared->cache;
+
+        HDassert( cache_ptr );
+        HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) );
+
+        baddrs = base_addrs[type];
+
+	result = H5C_cork(cache_ptr, baddrs, H5C__SET_CORK, NULL);
+        if(result < 0) {
+
+            pass = FALSE;
+            failure_mssg = "error in H5C_cork().";
+        }
+    }
+    return;
+} /* cork_entry_type() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	uncork_entry_type()
+ *
+ * Purpose:	To "uncork" an object:
+ *		--insert the base address of an entry type into
+ *		  the cache's list of corked object addresses
+ *
+ * Return:	void
+ *
+ * Programmer:	Vailin Choi; Jan 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+uncork_entry_type(H5F_t * file_ptr, int32_t type)
+{
+    H5C_t * cache_ptr;
+    haddr_t baddrs;
+    herr_t result;
+
+    if(pass) {
+        cache_ptr = file_ptr->shared->cache;
+
+        HDassert( cache_ptr );
+        HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) );
+
+        baddrs = base_addrs[type];
+
+	result = H5C_cork(cache_ptr, baddrs, H5C__UNCORK, NULL);
+        if(result < 0) {
+
             pass = FALSE;
-            failure_mssg = "non zero index len/sizes after H5C_flush_cache() with invalidate.";
+            failure_mssg = "error in H5C_cork().";
         }
     }
-
     return;
-
-} /* flush_cache() */
+} /* uncork_entry_type() */
 
 

 /*-------------------------------------------------------------------------
@@ -2689,9 +3600,11 @@ insert_entry(H5F_t * file_ptr,
 {
     H5C_t * cache_ptr;
     herr_t result;
+    hid_t xfer = H5AC_ind_dxpl_id;
     hbool_t insert_pinned;
     test_entry_t * base_addr;
     test_entry_t * entry_ptr;
+    haddr_t baddrs;
 
     if ( pass ) {
 
@@ -2703,18 +3616,28 @@ insert_entry(H5F_t * file_ptr,
 
         base_addr = entries[type];
         entry_ptr = &(base_addr[idx]);
+	baddrs = base_addrs[type];
 
         HDassert( entry_ptr->index == idx );
         HDassert( entry_ptr->type == type );
         HDassert( entry_ptr == entry_ptr->self );
         HDassert( !(entry_ptr->is_protected) );
+        HDassert( entry_ptr->flush_dep_npar == 0 );
+        HDassert( entry_ptr->flush_dep_nchd == 0 );
 
-	insert_pinned = ((flags & H5C__PIN_ENTRY_FLAG) != 0 );
+	insert_pinned = (hbool_t)((flags & H5C__PIN_ENTRY_FLAG) != 0 );
 
 	entry_ptr->is_dirty = TRUE;
 
-        result = H5C_insert_entry(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                &(types[type]), entry_ptr->addr, (void *)entry_ptr, flags);
+	/* Set the base address of the entry type into the property list as tag */
+	/* Use to cork entries for the object */
+	if(H5AC_tag(xfer, baddrs, NULL) < 0) {
+	    pass = FALSE;
+	    failure_mssg = "error in H5P_set().";
+	}
+
+        result = H5C_insert_entry(file_ptr, xfer,
+	        &(types[type]), entry_ptr->addr, (void *)entry_ptr, flags);
 
         if ( ( result < 0 ) ||
              ( entry_ptr->header.is_protected ) ||
@@ -2741,21 +3664,21 @@ insert_entry(H5F_t * file_ptr,
                        (int)(entry_ptr->addr != entry_ptr->header.addr));
 #endif
         }
-	HDassert( entry_ptr->cache_ptr == NULL );
+	HDassert(entry_ptr->cache_ptr == NULL);
 
+        entry_ptr->file_ptr = file_ptr;
         entry_ptr->cache_ptr = cache_ptr;
 
-	if ( insert_pinned ) {
-
-	    HDassert( entry_ptr->header.is_pinned );
-	    entry_ptr->is_pinned = TRUE;
-
-	} else {
+	if(insert_pinned)
+	    HDassert(entry_ptr->header.is_pinned);
+	else
+	    HDassert(!(entry_ptr->header.is_pinned));
+        entry_ptr->is_pinned = insert_pinned;
+        entry_ptr->pinned_from_client = insert_pinned;
 
-	    HDassert( ! ( entry_ptr->header.is_pinned ) );
-	    entry_ptr->is_pinned = FALSE;
+	if(entry_ptr->header.is_corked)
+	    entry_ptr->is_corked = TRUE;
 
-	}
         HDassert( entry_ptr->header.is_dirty );
         HDassert( ((entry_ptr->header).type)->id == type );
     }
@@ -2787,6 +3710,7 @@ mark_entry_dirty(int32_t type,
     herr_t result;
     test_entry_t * base_addr;
     test_entry_t * entry_ptr;
+    hbool_t was_dirty;
 
     if ( pass ) {
 
@@ -2802,7 +3726,12 @@ mark_entry_dirty(int32_t type,
         HDassert( entry_ptr->header.is_protected ||
 		  entry_ptr->header.is_pinned );
 
+        was_dirty = entry_ptr->is_dirty;
 	entry_ptr->is_dirty = TRUE;
+        if(entry_ptr->flush_dep_npar > 0
+                && entry_ptr->flush_dep_ndirty_chd == 0
+                && !was_dirty)
+            mark_flush_dep_dirty(entry_ptr);
 
         result = H5C_mark_entry_dirty((void *)entry_ptr);
 
@@ -2895,8 +3824,13 @@ move_entry(H5C_t * cache_ptr,
         }
 
         if ( ! done ) {
+            hbool_t was_dirty = entry_ptr->is_dirty;
 
             entry_ptr->is_dirty = TRUE;
+            if(entry_ptr->flush_dep_npar > 0
+                        && entry_ptr->flush_dep_ndirty_chd == 0
+                        && !was_dirty)
+                    mark_flush_dep_dirty(entry_ptr);
 
             result = H5C_move_entry(cache_ptr, &(types[type]),
                                        old_addr, new_addr);
@@ -2952,6 +3886,8 @@ protect_entry(H5F_t * file_ptr,
     H5C_t * cache_ptr;
     test_entry_t * base_addr;
     test_entry_t * entry_ptr;
+    haddr_t baddrs;
+    hid_t xfer = H5AC_ind_dxpl_id;
     H5C_cache_entry_t * cache_entry_ptr;
 
     if ( pass ) {
@@ -2964,14 +3900,23 @@ protect_entry(H5F_t * file_ptr,
 
         base_addr = entries[type];
         entry_ptr = &(base_addr[idx]);
+	baddrs = base_addrs[type];
 
         HDassert( entry_ptr->index == idx );
         HDassert( entry_ptr->type == type );
         HDassert( entry_ptr == entry_ptr->self );
         HDassert( !(entry_ptr->is_protected) );
 
-        cache_entry_ptr = (H5C_cache_entry_t *)H5C_protect(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                &(types[type]), entry_ptr->addr, NULL, H5C__NO_FLAGS_SET);
+	/* Set the base address of the entry type into the property list as tag */
+	/* Use to cork entries for the object */
+	if(H5AC_tag(xfer, baddrs, NULL) < 0) {
+	    pass = FALSE;
+	    failure_mssg = "error in H5P_set().";
+	}
+
+        cache_entry_ptr = (H5C_cache_entry_t *)H5C_protect(file_ptr, xfer,
+                &(types[type]), entry_ptr->addr, &entry_ptr->addr, 
+                H5C__NO_FLAGS_SET);
 
         if ( ( cache_entry_ptr != (void *)entry_ptr ) ||
              ( !(entry_ptr->header.is_protected) ) ||
@@ -3000,6 +3945,10 @@ protect_entry(H5F_t * file_ptr,
             HDfprintf(stdout,
                       "entry_ptr->addr = %d, entry_ptr->header.addr = %d\n",
                       (int)(entry_ptr->addr), (int)(entry_ptr->header.addr));
+	    HDfprintf(stdout, 
+                   "entry_ptr->verify_ct = %d, entry_ptr->max_verify_ct = %d\n",
+		   entry_ptr->verify_ct, entry_ptr->max_verify_ct);
+	    H5Eprint2(H5E_DEFAULT, stdout);
 #endif
             pass = FALSE;
             failure_mssg = "error in H5C_protect().";
@@ -3010,10 +3959,14 @@ protect_entry(H5F_t * file_ptr,
 		      ( entry_ptr->cache_ptr == cache_ptr ) );
 
 	    entry_ptr->cache_ptr = cache_ptr;
+	    entry_ptr->file_ptr = file_ptr;
             entry_ptr->is_protected = TRUE;
 
         }
 
+	if(entry_ptr->header.is_corked)
+	    entry_ptr->is_corked = TRUE;
+
         HDassert( ((entry_ptr->header).type)->id == type );
     }
 
@@ -3066,8 +4019,8 @@ protect_entry_ro(H5F_t * file_ptr,
 		  ( ( entry_ptr->is_read_only ) &&
 		    ( entry_ptr->ro_ref_count > 0 ) ) );
 
-        cache_entry_ptr = (H5C_cache_entry_t *)H5C_protect(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                &(types[type]), entry_ptr->addr, NULL, H5C__READ_ONLY_FLAG);
+        cache_entry_ptr = (H5C_cache_entry_t *)H5C_protect(file_ptr, H5P_DATASET_XFER_DEFAULT,
+                &(types[type]), entry_ptr->addr, &entry_ptr->addr, H5C__READ_ONLY_FLAG);
 
         if ( ( cache_entry_ptr != (void *)entry_ptr ) ||
              ( !(entry_ptr->header.is_protected) ) ||
@@ -3086,6 +4039,7 @@ protect_entry_ro(H5F_t * file_ptr,
 		      ( entry_ptr->cache_ptr == cache_ptr ) );
 
 	    entry_ptr->cache_ptr = cache_ptr;
+	    entry_ptr->file_ptr = file_ptr;
             entry_ptr->is_protected = TRUE;
 	    entry_ptr->is_read_only = TRUE;
 	    entry_ptr->ro_ref_count++;
@@ -3100,6 +4054,67 @@ protect_entry_ro(H5F_t * file_ptr,
 
 

 /*-------------------------------------------------------------------------
+ * Function:	pin_entry()
+ *
+ * Purpose:	Pin the entry indicated by the type and index.
+ *
+ *		Do nothing if pass is FALSE on entry.
+ *
+ * Return:	void
+ *
+ * Programmer:	Quincey Koziol
+ *              3/17/09
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void
+pin_entry(int32_t type,
+              int32_t idx)
+{
+    HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) );
+    HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) );
+
+    if ( pass ) {
+        test_entry_t * base_addr;
+        test_entry_t * entry_ptr;
+        herr_t result;
+
+        base_addr = entries[type];
+        entry_ptr = &(base_addr[idx]);
+
+        HDassert( entry_ptr->index == idx );
+        HDassert( entry_ptr->type == type );
+        HDassert( entry_ptr == entry_ptr->self );
+        HDassert( entry_ptr->is_protected );
+        HDassert( !(entry_ptr->pinned_from_client) );
+
+	result = H5C_pin_protected_entry((void *)entry_ptr);
+
+	if ( result < 0 ) {
+
+            pass = FALSE;
+            failure_mssg = "H5C_pin_protected_entry() reports failure.";
+
+	} else if ( ! ( entry_ptr->header.is_pinned ) ) {
+
+            pass = FALSE;
+            failure_mssg = "entry not pinned when it should be.";
+
+	} else {
+
+            entry_ptr->pinned_from_client = TRUE;
+	    entry_ptr->is_pinned = TRUE;
+
+	}
+    } /* end if */
+
+    return;
+
+} /* pin_entry() */
+
+

+/*-------------------------------------------------------------------------
  * Function:	unpin_entry()
  *
  * Purpose:	Unpin the entry indicated by the type and index.
@@ -3132,14 +4147,16 @@ unpin_entry(int32_t type,
         HDassert( entry_ptr->index == idx );
         HDassert( entry_ptr->type == type );
         HDassert( entry_ptr == entry_ptr->self );
-        HDassert( ! (entry_ptr->header.is_protected) );
         HDassert( entry_ptr->header.is_pinned );
+        HDassert( entry_ptr->header.pinned_from_client );
 	HDassert( entry_ptr->is_pinned );
+	HDassert( entry_ptr->pinned_from_client );
 
         result = H5C_unpin_entry(entry_ptr);
 
         if ( ( result < 0 ) ||
-             ( entry_ptr->header.is_pinned ) ||
+             ( entry_ptr->header.pinned_from_client ) ||
+             ( entry_ptr->header.is_pinned && !entry_ptr->header.pinned_from_cache ) ||
              ( entry_ptr->header.type != &(types[type]) ) ||
              ( entry_ptr->size != entry_ptr->header.size ) ||
              ( entry_ptr->addr != entry_ptr->header.addr ) ) {
@@ -3149,7 +4166,9 @@ unpin_entry(int32_t type,
 
         }
 
-	entry_ptr->is_pinned = FALSE;
+        entry_ptr->pinned_from_client = FALSE;
+
+	entry_ptr->is_pinned = entry_ptr->pinned_from_cache;
 
         HDassert( ((entry_ptr->header).type)->id == type );
 
@@ -3200,18 +4219,25 @@ unprotect_entry(H5F_t * file_ptr,
         HDassert( entry_ptr->header.is_protected );
         HDassert( entry_ptr->is_protected );
 
-	pin_flag_set = ((flags & H5C__PIN_ENTRY_FLAG) != 0 );
-	unpin_flag_set = ((flags & H5C__UNPIN_ENTRY_FLAG) != 0 );
+	pin_flag_set = (hbool_t)((flags & H5C__PIN_ENTRY_FLAG) != 0);
+	unpin_flag_set = (hbool_t)((flags & H5C__UNPIN_ENTRY_FLAG) != 0);
 
 	HDassert ( ! ( pin_flag_set && unpin_flag_set ) );
 	HDassert ( ( ! pin_flag_set ) || ( ! (entry_ptr->is_pinned) ) );
 	HDassert ( ( ! unpin_flag_set ) || ( entry_ptr->is_pinned ) );
 
-        if(flags & H5C__DIRTIED_FLAG)
+        if(flags & H5C__DIRTIED_FLAG) {
+            hbool_t was_dirty = entry_ptr->is_dirty;
+
             entry_ptr->is_dirty = TRUE;
+            if(entry_ptr->flush_dep_npar > 0
+                    && entry_ptr->flush_dep_ndirty_chd == 0
+                    && !was_dirty)
+                mark_flush_dep_dirty(entry_ptr);
+        } /* end if */
 
-        result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, H5P_DATASET_XFER_DEFAULT,
-                &(types[type]), entry_ptr->addr, (void *)entry_ptr, flags);
+        result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT,
+                    entry_ptr->addr, (void *)entry_ptr, flags);
 
         if ( ( result < 0 ) ||
              ( ( entry_ptr->header.is_protected ) &&
@@ -3245,13 +4271,15 @@ unprotect_entry(H5F_t * file_ptr,
 
 	    if ( pin_flag_set ) {
 
-	        HDassert ( entry_ptr->header.is_pinned );
+	        HDassert(entry_ptr->header.is_pinned);
+		entry_ptr->pinned_from_client = TRUE;
 		entry_ptr->is_pinned = TRUE;
 
 	    } else if ( unpin_flag_set ) {
 
-	        HDassert ( ! ( entry_ptr->header.is_pinned ) );
-		entry_ptr->is_pinned = FALSE;
+	        HDassert(entry_ptr->header.is_pinned == entry_ptr->header.pinned_from_cache);
+		entry_ptr->pinned_from_client = FALSE;
+		entry_ptr->is_pinned = entry_ptr->pinned_from_cache;
 
             }
         }
@@ -3292,6 +4320,7 @@ unprotect_entry(H5F_t * file_ptr,
 
 void
 row_major_scan_forward(H5F_t * file_ptr,
+                       int32_t max_index,
                        int32_t lag,
                        hbool_t verbose,
                        hbool_t reset_stats,
@@ -3305,13 +4334,13 @@ row_major_scan_forward(H5F_t * file_ptr,
                        int dirty_destroys,
                        int dirty_unprotects)
 {
-    const char * fcn_name = "row_major_scan_forward";
-    H5C_t * cache_ptr;
+    H5C_t * cache_ptr = NULL;
     int32_t type = 0;
     int32_t idx;
+    int32_t local_max_index;
 
     if ( verbose )
-        HDfprintf(stdout, "%s(): entering.\n", fcn_name);
+        HDfprintf(stdout, "%s(): entering.\n", FUNC);
 
     if ( pass ) {
 
@@ -3331,208 +4360,283 @@ row_major_scan_forward(H5F_t * file_ptr,
     {
         idx = -lag;
 
-        while ( ( pass ) && ( idx <= (max_indices[type] + lag) ) )
+        local_max_index = MIN(max_index, max_indices[type]);
+
+        while ( ( pass ) && ( idx <= (local_max_index + lag) ) )
         {
+            int32_t tmp_idx;
+
 	    if ( verbose ) {
 
                 HDfprintf(stdout, "%d:%d: ", type, idx);
 	    }
 
-            if ( ( pass ) && ( do_inserts ) && ( (idx + lag) >= 0 ) &&
-                 ( (idx + lag) <= max_indices[type] ) &&
-                 ( ((idx + lag) % 2) == 0 ) &&
-                 ( ! entry_in_cache(cache_ptr, type, (idx + lag)) ) ) {
+            tmp_idx = idx + lag;
+            if ( ( pass ) && ( do_inserts ) && ( tmp_idx >= 0 ) &&
+                 ( tmp_idx <= local_max_index ) &&
+                 ( (tmp_idx % 2) == 0 ) &&
+                 ( ! entry_in_cache(cache_ptr, type, tmp_idx) ) ) {
 
                 if ( verbose )
-                    HDfprintf(stdout, "(i, %d, %d) ", type, (idx + lag));
+                    HDfprintf(stdout, "1(i, %d, %d) ", type, tmp_idx);
 
-                insert_entry(file_ptr, type, (idx + lag), H5C__NO_FLAGS_SET);
-            }
+                insert_entry(file_ptr, type, tmp_idx, H5C__NO_FLAGS_SET);
 
+		HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
+            }
 
-            if ( ( pass ) && ( (idx + lag - 1) >= 0 ) &&
-                 ( (idx + lag - 1) <= max_indices[type] ) &&
-                 ( ( (idx + lag - 1) % 3 ) == 0 ) ) {
+            tmp_idx--;
+            if ( ( pass ) && ( tmp_idx >= 0 ) &&
+                 ( tmp_idx <= local_max_index ) &&
+                 ( ( tmp_idx % 3 ) == 0 ) ) {
 
                 if ( verbose )
-                    HDfprintf(stdout, "(p, %d, %d) ", type, (idx + lag - 1));
+                    HDfprintf(stdout, "2(p, %d, %d) ", type, tmp_idx);
+
+                protect_entry(file_ptr, type, tmp_idx);
 
-                protect_entry(file_ptr, type, (idx + lag - 1));
+		HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
             }
 
-            if ( ( pass ) && ( (idx + lag - 2) >= 0 ) &&
-                 ( (idx + lag - 2) <= max_indices[type] ) &&
-                 ( ( (idx + lag - 2) % 3 ) == 0 ) ) {
+            tmp_idx--;
+            if ( ( pass ) && ( tmp_idx >= 0 ) &&
+                 ( tmp_idx <= local_max_index ) &&
+                 ( ( tmp_idx % 3 ) == 0 ) ) {
 
                 if ( verbose )
-                    HDfprintf(stdout, "(u, %d, %d) ", type, (idx + lag - 2));
+                    HDfprintf(stdout, "3(u, %d, %d) ", type, tmp_idx);
 
-                unprotect_entry(file_ptr, type, idx+lag-2, H5C__NO_FLAGS_SET);
+                unprotect_entry(file_ptr, type, tmp_idx, H5C__NO_FLAGS_SET);
+
+		HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
             }
 
+            /* (don't decrement tmp_idx) */
+            if ( ( pass ) && ( do_moves ) && ( tmp_idx >= 0 ) &&
+                 ( tmp_idx <= local_max_index ) &&
+                 ( ( tmp_idx % 3 ) == 0 ) ) {
+
+                if ( verbose )
+                    HDfprintf(stdout, "4(r, %d, %d, %d) ",
+			      type, tmp_idx, (int)move_to_main_addr);
 
-            if ( ( pass ) && ( do_moves ) && ( (idx + lag - 2) >= 0 ) &&
-                 ( (idx + lag - 2) <= max_indices[type] ) &&
-                 ( ( (idx + lag - 2) % 3 ) == 0 ) ) {
+                move_entry(cache_ptr, type, tmp_idx, move_to_main_addr);
 
-                move_entry(cache_ptr, type, (idx + lag - 2),
-                             move_to_main_addr);
+		HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
             }
 
-
-            if ( ( pass ) && ( (idx + lag - 3) >= 0 ) &&
-                 ( (idx + lag - 3) <= max_indices[type] ) &&
-                 ( ( (idx + lag - 3) % 5 ) == 0 ) ) {
+            tmp_idx--;
+            if ( ( pass ) && ( tmp_idx >= 0 ) &&
+                 ( tmp_idx <= local_max_index ) &&
+                 ( ( tmp_idx % 5 ) == 0 ) ) {
 
                 if ( verbose )
-                    HDfprintf(stdout, "(p, %d, %d) ", type, (idx + lag - 3));
+                    HDfprintf(stdout, "5(p, %d, %d) ", type, tmp_idx);
 
-                protect_entry(file_ptr, type, (idx + lag - 3));
+                protect_entry(file_ptr, type, tmp_idx);
+
+		HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
             }
 
-            if ( ( pass ) && ( (idx + lag - 5) >= 0 ) &&
-                 ( (idx + lag - 5) <= max_indices[type] ) &&
-                 ( ( (idx + lag - 5) % 5 ) == 0 ) ) {
+            tmp_idx -= 2;
+            if ( ( pass ) && ( tmp_idx >= 0 ) &&
+                 ( tmp_idx <= local_max_index ) &&
+                 ( ( tmp_idx % 5 ) == 0 ) ) {
 
                 if ( verbose )
-                    HDfprintf(stdout, "(u, %d, %d) ", type, (idx + lag - 5));
+                    HDfprintf(stdout, "6(u, %d, %d) ", type, tmp_idx);
+
+                unprotect_entry(file_ptr, type, tmp_idx, H5C__NO_FLAGS_SET);
 
-                unprotect_entry(file_ptr, type, idx+lag-5, H5C__NO_FLAGS_SET);
+		HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
             }
 
 	    if ( do_mult_ro_protects )
 	    {
-		if ( ( pass ) && ( (idx + lag - 5) >= 0 ) &&
-		     ( (idx + lag - 5) < max_indices[type] ) &&
-		     ( (idx + lag - 5) % 9 == 0 ) ) {
+                /* (don't decrement tmp_idx) */
+		if ( ( pass ) && ( tmp_idx >= 0 ) &&
+		     ( tmp_idx < local_max_index ) &&
+		     ( tmp_idx % 9 == 0 ) ) {
 
                     if ( verbose )
-                        HDfprintf(stdout, "(p-ro, %d, %d) ", type,
-				  (idx + lag - 5));
+                        HDfprintf(stdout, "7(p-ro, %d, %d) ", type, tmp_idx);
 
-		    protect_entry_ro(file_ptr, type, (idx + lag - 5));
+		    protect_entry_ro(file_ptr, type, tmp_idx);
+
+ 		    HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
 		}
 
-		if ( ( pass ) && ( (idx + lag - 6) >= 0 ) &&
-		     ( (idx + lag - 6) < max_indices[type] ) &&
-		     ( (idx + lag - 6) % 11 == 0 ) ) {
+                tmp_idx--;
+		if ( ( pass ) && ( tmp_idx >= 0 ) &&
+		     ( tmp_idx < local_max_index ) &&
+		     ( tmp_idx % 11 == 0 ) ) {
 
                     if ( verbose )
-                        HDfprintf(stdout, "(p-ro, %d, %d) ", type,
-				  (idx + lag - 6));
+                        HDfprintf(stdout, "8(p-ro, %d, %d) ", type, tmp_idx);
+
+		    protect_entry_ro(file_ptr, type, tmp_idx);
 
-		    protect_entry_ro(file_ptr, type, (idx + lag - 6));
+ 		    HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
 		}
 
-		if ( ( pass ) && ( (idx + lag - 7) >= 0 ) &&
-		     ( (idx + lag - 7) < max_indices[type] ) &&
-		     ( (idx + lag - 7) % 13 == 0 ) ) {
+                tmp_idx--;
+		if ( ( pass ) && ( tmp_idx >= 0 ) &&
+		     ( tmp_idx < local_max_index ) &&
+		     ( tmp_idx % 13 == 0 ) ) {
 
                     if ( verbose )
-                        HDfprintf(stdout, "(p-ro, %d, %d) ", type,
-				  (idx + lag - 7));
+                        HDfprintf(stdout, "9(p-ro, %d, %d) ", type, tmp_idx);
 
-		    protect_entry_ro(file_ptr, type, (idx + lag - 7));
+		    protect_entry_ro(file_ptr, type, tmp_idx);
+
+ 		    HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
 		}
 
-		if ( ( pass ) && ( (idx + lag - 7) >= 0 ) &&
-		     ( (idx + lag - 7) < max_indices[type] ) &&
-		     ( (idx + lag - 7) % 9 == 0 ) ) {
+                /* (don't decrement tmp_idx) */
+		if ( ( pass ) && ( tmp_idx >= 0 ) &&
+		     ( tmp_idx < local_max_index ) &&
+		     ( tmp_idx % 9 == 0 ) ) {
 
                     if ( verbose )
-                        HDfprintf(stdout, "(u-ro, %d, %d) ", type,
-				  (idx + lag - 7));
+                        HDfprintf(stdout, "10(u-ro, %d, %d) ", type, tmp_idx);
+
+		    unprotect_entry(file_ptr, type, tmp_idx, H5C__NO_FLAGS_SET);
 
-		    unprotect_entry(file_ptr, type, (idx + lag - 7), H5C__NO_FLAGS_SET);
+ 		    HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
 		}
 
-		if ( ( pass ) && ( (idx + lag - 8) >= 0 ) &&
-		     ( (idx + lag - 8) < max_indices[type] ) &&
-		     ( (idx + lag - 8) % 11 == 0 ) ) {
+                tmp_idx--;
+		if ( ( pass ) && ( tmp_idx >= 0 ) &&
+		     ( tmp_idx < local_max_index ) &&
+		     ( tmp_idx % 11 == 0 ) ) {
 
                     if ( verbose )
-                        HDfprintf(stdout, "(u-ro, %d, %d) ", type,
-				  (idx + lag - 8));
+                        HDfprintf(stdout, "11(u-ro, %d, %d) ", type, tmp_idx);
 
-		    unprotect_entry(file_ptr, type, (idx + lag - 8), H5C__NO_FLAGS_SET);
+		    unprotect_entry(file_ptr, type, tmp_idx, H5C__NO_FLAGS_SET);
+
+ 		    HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
 		}
 
-		if ( ( pass ) && ( (idx + lag - 9) >= 0 ) &&
-		     ( (idx + lag - 9) < max_indices[type] ) &&
-		     ( (idx + lag - 9) % 13 == 0 ) ) {
+                tmp_idx--;
+		if ( ( pass ) && ( tmp_idx >= 0 ) &&
+		     ( tmp_idx < local_max_index ) &&
+		     ( tmp_idx % 13 == 0 ) ) {
 
                     if ( verbose )
-                        HDfprintf(stdout, "(u-ro, %d, %d) ", type,
-				  (idx + lag - 9));
+                        HDfprintf(stdout, "12(u-ro, %d, %d) ", type, tmp_idx);
+
+		    unprotect_entry(file_ptr, type, tmp_idx, H5C__NO_FLAGS_SET);
 
-		    unprotect_entry(file_ptr, type, (idx + lag - 9), H5C__NO_FLAGS_SET);
+ 		    HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
 		}
 	    } /* if ( do_mult_ro_protects ) */
 
-            if ( ( pass ) && ( idx >= 0 ) && ( idx <= max_indices[type] ) ) {
+            if ( ( pass ) && ( idx >= 0 ) && ( idx <= local_max_index ) ) {
 
                 if ( verbose )
-                    HDfprintf(stdout, "(p, %d, %d) ", type, idx);
+                    HDfprintf(stdout, "13(p, %d, %d) ", type, idx);
 
                 protect_entry(file_ptr, type, idx);
+
+		HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
             }
 
-            if ( ( pass ) && ( (idx - lag + 2) >= 0 ) &&
-                 ( (idx - lag + 2) <= max_indices[type] ) &&
-                 ( ( (idx - lag + 2) % 7 ) == 0 ) ) {
+            tmp_idx = idx - lag + 2;
+            if ( ( pass ) && ( tmp_idx >= 0 ) &&
+                 ( tmp_idx <= local_max_index ) &&
+                 ( ( tmp_idx % 7 ) == 0 ) ) {
 
                 if ( verbose )
-                    HDfprintf(stdout, "(u, %d, %d) ", type, (idx - lag + 2));
+                    HDfprintf(stdout, "14(u, %d, %d) ", type, tmp_idx);
 
-                unprotect_entry(file_ptr, type, idx-lag+2, H5C__NO_FLAGS_SET);
+                unprotect_entry(file_ptr, type, tmp_idx, H5C__NO_FLAGS_SET);
+
+		HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
             }
 
-            if ( ( pass ) && ( (idx - lag + 1) >= 0 ) &&
-                 ( (idx - lag + 1) <= max_indices[type] ) &&
-                 ( ( (idx - lag + 1) % 7 ) == 0 ) ) {
+            tmp_idx--;
+            if ( ( pass ) && ( tmp_idx >= 0 ) &&
+                 ( tmp_idx <= local_max_index ) &&
+                 ( ( tmp_idx % 7 ) == 0 ) ) {
 
                 if ( verbose )
-                    HDfprintf(stdout, "(p, %d, %d) ", type, (idx - lag + 1));
+                    HDfprintf(stdout, "15(p, %d, %d) ", type, tmp_idx);
+
+                protect_entry(file_ptr, type, tmp_idx);
 
-                protect_entry(file_ptr, type, (idx - lag + 1));
+		HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
             }
 
 
             if ( do_destroys ) {
 
-                if ( ( pass ) && ( (idx - lag) >= 0 ) &&
-                     ( ( idx - lag) <= max_indices[type] ) ) {
+                tmp_idx = idx - lag;
+                if ( ( pass ) && ( tmp_idx >= 0 ) &&
+                     ( tmp_idx <= local_max_index ) ) {
 
-                    switch ( (idx - lag) %4 ) {
+                    switch ( tmp_idx %4 ) {
 
                         case 0: /* we just did an insert */
-                            unprotect_entry(file_ptr, type, idx - lag, H5C__NO_FLAGS_SET);
+
+                            if ( verbose )
+                                HDfprintf(stdout, "16(u, %d, %d) ", type, tmp_idx);
+
+                            unprotect_entry(file_ptr, type, tmp_idx, H5C__NO_FLAGS_SET);
+
+			    HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
                             break;
 
                         case 1:
-                            if ( (entries[type])[idx-lag].is_dirty ) {
+                            if ( (entries[type])[tmp_idx].is_dirty ) {
+
+                                if ( verbose )
+                                    HDfprintf(stdout, "17(u, %d, %d) ", type, tmp_idx);
 
-                                unprotect_entry(file_ptr, type, idx - lag, H5C__NO_FLAGS_SET);
+                                unprotect_entry(file_ptr, type, tmp_idx, H5C__NO_FLAGS_SET);
+
+				HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
                             } else {
 
-                                unprotect_entry(file_ptr, type, idx - lag,
+                                if ( verbose )
+                                    HDfprintf(stdout, "18(u, %d, %d) ", type, tmp_idx);
+
+                                unprotect_entry(file_ptr, type, tmp_idx,
                                         (dirty_unprotects ? H5C__DIRTIED_FLAG : H5C__NO_FLAGS_SET));
+
+				HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
                             }
                             break;
 
-                        case 2: /* we just did an insrt */
-                            unprotect_entry(file_ptr, type, idx - lag, H5C__DELETED_FLAG);
+                        case 2: /* we just did an insert */
+
+                            if ( verbose )
+                                HDfprintf(stdout, "19(u-del, %d, %d) ", type, tmp_idx);
+
+                            unprotect_entry(file_ptr, type, tmp_idx, H5C__DELETED_FLAG);
+
+			    HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
                             break;
 
                         case 3:
-                            if ( (entries[type])[idx-lag].is_dirty ) {
+                            if ( (entries[type])[tmp_idx].is_dirty ) {
 
-                                unprotect_entry(file_ptr, type, idx - lag, H5C__DELETED_FLAG);
+                                if ( verbose )
+                                    HDfprintf(stdout, "20(u-del, %d, %d) ", type, tmp_idx);
+
+                                unprotect_entry(file_ptr, type, tmp_idx, H5C__DELETED_FLAG);
+
+			        HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
                             } else {
 
-                                unprotect_entry(file_ptr, type, idx - lag,
+                                if ( verbose )
+                                    HDfprintf(stdout, "21(u-del, %d, %d) ", type, tmp_idx);
+
+                                unprotect_entry(file_ptr, type, tmp_idx,
                                         (dirty_destroys ? H5C__DIRTIED_FLAG : H5C__NO_FLAGS_SET)
                                         | H5C__DELETED_FLAG);
+
+			        HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
                             }
                             break;
 
@@ -3544,14 +4648,17 @@ row_major_scan_forward(H5F_t * file_ptr,
 
             } else {
 
-                if ( ( pass ) && ( (idx - lag) >= 0 ) &&
-                     ( ( idx - lag) <= max_indices[type] ) ) {
+                tmp_idx = idx - lag;
+                if ( ( pass ) && ( tmp_idx >= 0 ) &&
+                     ( tmp_idx <= local_max_index ) ) {
 
                     if ( verbose )
-                        HDfprintf(stdout, "(u, %d, %d) ", type, (idx - lag));
+                        HDfprintf(stdout, "22(u, %d, %d) ", type, tmp_idx);
 
-                    unprotect_entry(file_ptr, type, idx - lag,
+                    unprotect_entry(file_ptr, type, tmp_idx,
                             (dirty_unprotects ? H5C__DIRTIED_FLAG : H5C__NO_FLAGS_SET));
+
+		    HDassert(cache_ptr->slist_size == cache_ptr->dirty_index_size);
                 }
             }
 
@@ -3597,8 +4704,7 @@ hl_row_major_scan_forward(H5F_t * file_ptr,
                           hbool_t display_detailed_stats,
                           hbool_t do_inserts)
 {
-    const char * fcn_name = "hl_row_major_scan_forward";
-    H5C_t * cache_ptr;
+    H5C_t * cache_ptr = NULL;
     int32_t type = 0;
     int32_t idx;
     int32_t i;
@@ -3606,7 +4712,7 @@ hl_row_major_scan_forward(H5F_t * file_ptr,
     int32_t local_max_index;
 
     if ( verbose )
-        HDfprintf(stdout, "%s(): entering.\n", fcn_name);
+        HDfprintf(stdout, "%s(): entering.\n", FUNC);
 
     if ( pass ) {
 
@@ -3696,6 +4802,7 @@ hl_row_major_scan_forward(H5F_t * file_ptr,
 
 void
 row_major_scan_backward(H5F_t * file_ptr,
+                        int32_t max_index,
                         int32_t lag,
                         hbool_t verbose,
                         hbool_t reset_stats,
@@ -3709,13 +4816,13 @@ row_major_scan_backward(H5F_t * file_ptr,
                         int dirty_destroys,
                         int dirty_unprotects)
 {
-    const char * fcn_name = "row_major_scan_backward";
-    H5C_t * cache_ptr;
+    H5C_t * cache_ptr = NULL;
     int32_t type = NUMBER_OF_ENTRY_TYPES - 1;
     int32_t idx;
+    int32_t local_max_index;
 
     if ( verbose )
-        HDfprintf(stdout, "%s(): Entering.\n", fcn_name);
+        HDfprintf(stdout, "%s(): Entering.\n", FUNC);
 
     if ( pass ) {
 
@@ -3732,142 +4839,152 @@ row_major_scan_backward(H5F_t * file_ptr,
 
     while ( ( pass ) && ( type >= 0 ) )
     {
-        idx = max_indices[type] + lag;
+        local_max_index = MIN(max_index, max_indices[type]);
+
+        idx = local_max_index + lag;
 
         while ( ( pass ) && ( idx >= -lag ) )
         {
-            if ( ( pass ) && ( do_inserts ) && ( (idx - lag) >= 0 ) &&
-                 ( (idx - lag) <= max_indices[type] ) &&
-                 ( ((idx - lag) % 2) == 1 ) &&
-                 ( ! entry_in_cache(cache_ptr, type, (idx - lag)) ) ) {
+            int32_t tmp_idx;
+
+            tmp_idx = idx - lag;
+            if ( ( pass ) && ( do_inserts ) && ( tmp_idx >= 0 ) &&
+                 ( tmp_idx <= local_max_index ) &&
+                 ( (tmp_idx % 2) == 1 ) &&
+                 ( ! entry_in_cache(cache_ptr, type, tmp_idx) ) ) {
 
                 if ( verbose )
-                    HDfprintf(stdout, "(i, %d, %d) ", type, (idx - lag));
+                    HDfprintf(stdout, "(i, %d, %d) ", type, tmp_idx);
 
-                insert_entry(file_ptr, type, (idx - lag), H5C__NO_FLAGS_SET);
+                insert_entry(file_ptr, type, tmp_idx, H5C__NO_FLAGS_SET);
             }
 
-
-            if ( ( pass ) && ( (idx - lag + 1) >= 0 ) &&
-                 ( (idx - lag + 1) <= max_indices[type] ) &&
-                 ( ( (idx - lag + 1) % 3 ) == 0 ) ) {
+            tmp_idx++;
+            if ( ( pass ) && ( tmp_idx >= 0 ) &&
+                 ( tmp_idx <= local_max_index ) &&
+                 ( ( tmp_idx % 3 ) == 0 ) ) {
 
                 if ( verbose )
-                    HDfprintf(stdout, "(p, %d, %d) ", type, (idx - lag + 1));
+                    HDfprintf(stdout, "(p, %d, %d) ", type, tmp_idx);
 
-                protect_entry(file_ptr, type, (idx - lag + 1));
+                protect_entry(file_ptr, type, tmp_idx);
             }
 
-            if ( ( pass ) && ( (idx - lag + 2) >= 0 ) &&
-                 ( (idx - lag + 2) <= max_indices[type] ) &&
-                 ( ( (idx - lag + 2) % 3 ) == 0 ) ) {
+            tmp_idx++;
+            if ( ( pass ) && ( tmp_idx >= 0 ) &&
+                 ( tmp_idx <= local_max_index ) &&
+                 ( ( tmp_idx % 3 ) == 0 ) ) {
 
                 if ( verbose )
-                    HDfprintf(stdout, "(u, %d, %d) ", type, (idx - lag + 2));
+                    HDfprintf(stdout, "(u, %d, %d) ", type, tmp_idx);
 
-                unprotect_entry(file_ptr, type, idx-lag+2, H5C__NO_FLAGS_SET);
+                unprotect_entry(file_ptr, type, tmp_idx, H5C__NO_FLAGS_SET);
             }
 
+            /* (don't increment tmp_idx) */
+            if ( ( pass ) && ( do_moves ) && ( tmp_idx >= 0 ) &&
+                 ( tmp_idx <= local_max_index ) &&
+                 ( ( tmp_idx % 3 ) == 0 ) ) {
 
-            if ( ( pass ) && ( do_moves ) && ( (idx - lag + 2) >= 0 ) &&
-                 ( (idx - lag + 2) <= max_indices[type] ) &&
-                 ( ( (idx - lag + 2) % 3 ) == 0 ) ) {
+                if ( verbose )
+                    HDfprintf(stdout, "(r, %d, %d, %d) ",
+			      type, tmp_idx, (int)move_to_main_addr);
 
-                move_entry(cache_ptr, type, (idx - lag + 2),
-                             move_to_main_addr);
+                move_entry(cache_ptr, type, tmp_idx, move_to_main_addr);
             }
 
-
-            if ( ( pass ) && ( (idx - lag + 3) >= 0 ) &&
-                 ( (idx - lag + 3) <= max_indices[type] ) &&
-                 ( ( (idx - lag + 3) % 5 ) == 0 ) ) {
+            tmp_idx++;
+            if ( ( pass ) && ( tmp_idx >= 0 ) &&
+                 ( tmp_idx <= local_max_index ) &&
+                 ( ( tmp_idx % 5 ) == 0 ) ) {
 
                 if ( verbose )
-                    HDfprintf(stdout, "(p, %d, %d) ", type, (idx - lag + 3));
+                    HDfprintf(stdout, "(p, %d, %d) ", type, tmp_idx);
 
                 protect_entry(file_ptr, type, (idx - lag + 3));
             }
 
-            if ( ( pass ) && ( (idx - lag + 5) >= 0 ) &&
-                 ( (idx - lag + 5) <= max_indices[type] ) &&
-                 ( ( (idx - lag + 5) % 5 ) == 0 ) ) {
+            tmp_idx += 2;
+            if ( ( pass ) && ( tmp_idx >= 0 ) &&
+                 ( tmp_idx <= local_max_index ) &&
+                 ( ( tmp_idx % 5 ) == 0 ) ) {
 
                 if ( verbose )
-                    HDfprintf(stdout, "(u, %d, %d) ", type, (idx - lag + 5));
+                    HDfprintf(stdout, "(u, %d, %d) ", type, tmp_idx);
 
-                unprotect_entry(file_ptr, type, idx-lag+5, H5C__NO_FLAGS_SET);
+                unprotect_entry(file_ptr, type, tmp_idx, H5C__NO_FLAGS_SET);
             }
 
+            /* (don't increment tmp_idx) */
 	    if ( do_mult_ro_protects )
 	    {
-		if ( ( pass ) && ( (idx - lag + 5) >= 0 ) &&
-		     ( (idx - lag + 5) < max_indices[type] ) &&
-		     ( (idx - lag + 5) % 9 == 0 ) ) {
+		if ( ( pass ) && ( tmp_idx >= 0 ) &&
+		     ( tmp_idx < local_max_index ) &&
+		     ( tmp_idx % 9 == 0 ) ) {
 
                     if ( verbose )
-                        HDfprintf(stdout, "(p-ro, %d, %d) ", type,
-				  (idx - lag + 5));
+                        HDfprintf(stdout, "(p-ro, %d, %d) ", type, tmp_idx);
 
-		    protect_entry_ro(file_ptr, type, (idx - lag + 5));
+		    protect_entry_ro(file_ptr, type, tmp_idx);
 		}
 
-		if ( ( pass ) && ( (idx - lag + 6) >= 0 ) &&
-		     ( (idx - lag + 6) < max_indices[type] ) &&
-		     ( (idx - lag + 6) % 11 == 0 ) ) {
+                tmp_idx++;
+		if ( ( pass ) && ( tmp_idx >= 0 ) &&
+		     ( tmp_idx < local_max_index ) &&
+		     ( tmp_idx % 11 == 0 ) ) {
 
                     if ( verbose )
-                        HDfprintf(stdout, "(p-ro, %d, %d) ", type,
-				  (idx - lag + 6));
+                        HDfprintf(stdout, "(p-ro, %d, %d) ", type, tmp_idx);
 
-		    protect_entry_ro(file_ptr, type, (idx - lag + 6));
+		    protect_entry_ro(file_ptr, type, tmp_idx);
 		}
 
-		if ( ( pass ) && ( (idx - lag + 7) >= 0 ) &&
-		     ( (idx - lag + 7) < max_indices[type] ) &&
-		     ( (idx - lag + 7) % 13 == 0 ) ) {
+                tmp_idx++;
+		if ( ( pass ) && ( tmp_idx >= 0 ) &&
+		     ( tmp_idx < local_max_index ) &&
+		     ( tmp_idx % 13 == 0 ) ) {
 
                     if ( verbose )
-                        HDfprintf(stdout, "(p-ro, %d, %d) ", type,
-				  (idx - lag + 7));
+                        HDfprintf(stdout, "(p-ro, %d, %d) ", type, tmp_idx);
 
-		    protect_entry_ro(file_ptr, type, (idx - lag + 7));
+		    protect_entry_ro(file_ptr, type, tmp_idx);
 		}
 
-		if ( ( pass ) && ( (idx - lag + 7) >= 0 ) &&
-		     ( (idx - lag + 7) < max_indices[type] ) &&
-		     ( (idx - lag + 7) % 9 == 0 ) ) {
+                /* (don't increment tmp_idx) */
+		if ( ( pass ) && ( tmp_idx >= 0 ) &&
+		     ( tmp_idx < local_max_index ) &&
+		     ( tmp_idx % 9 == 0 ) ) {
 
                     if ( verbose )
-                        HDfprintf(stdout, "(u-ro, %d, %d) ", type,
-				  (idx - lag + 7));
+                        HDfprintf(stdout, "(u-ro, %d, %d) ", type, tmp_idx);
 
-		    unprotect_entry(file_ptr, type, (idx - lag + 7), H5C__NO_FLAGS_SET);
+		    unprotect_entry(file_ptr, type, tmp_idx, H5C__NO_FLAGS_SET);
 		}
 
-		if ( ( pass ) && ( (idx - lag + 8) >= 0 ) &&
-		     ( (idx - lag + 8) < max_indices[type] ) &&
-		     ( (idx - lag + 8) % 11 == 0 ) ) {
+                tmp_idx++;
+		if ( ( pass ) && ( tmp_idx >= 0 ) &&
+		     ( tmp_idx < local_max_index ) &&
+		     ( tmp_idx % 11 == 0 ) ) {
 
                     if ( verbose )
-                        HDfprintf(stdout, "(u-ro, %d, %d) ", type,
-				  (idx - lag + 8));
+                        HDfprintf(stdout, "(u-ro, %d, %d) ", type, tmp_idx);
 
-		    unprotect_entry(file_ptr, type, (idx - lag + 8), H5C__NO_FLAGS_SET);
+		    unprotect_entry(file_ptr, type, tmp_idx, H5C__NO_FLAGS_SET);
 		}
 
-		if ( ( pass ) && ( (idx - lag + 9) >= 0 ) &&
-		     ( (idx - lag + 9) < max_indices[type] ) &&
-		     ( (idx - lag + 9) % 13 == 0 ) ) {
+                tmp_idx++;
+		if ( ( pass ) && ( tmp_idx >= 0 ) &&
+		     ( tmp_idx < local_max_index ) &&
+		     ( tmp_idx % 13 == 0 ) ) {
 
                     if ( verbose )
-                        HDfprintf(stdout, "(u-ro, %d, %d) ", type,
-				  (idx - lag + 9));
+                        HDfprintf(stdout, "(u-ro, %d, %d) ", type, tmp_idx);
 
-		    unprotect_entry(file_ptr, type, (idx - lag + 9), H5C__NO_FLAGS_SET);
+		    unprotect_entry(file_ptr, type, tmp_idx, H5C__NO_FLAGS_SET);
 		}
 	    } /* if ( do_mult_ro_protects ) */
 
-            if ( ( pass ) && ( idx >= 0 ) && ( idx <= max_indices[type] ) ) {
+            if ( ( pass ) && ( idx >= 0 ) && ( idx <= local_max_index ) ) {
 
                 if ( verbose )
                     HDfprintf(stdout, "(p, %d, %d) ", type, idx);
@@ -3875,34 +4992,35 @@ row_major_scan_backward(H5F_t * file_ptr,
                 protect_entry(file_ptr, type, idx);
             }
 
-
-            if ( ( pass ) && ( (idx + lag - 2) >= 0 ) &&
-                 ( (idx + lag - 2) <= max_indices[type] ) &&
-                 ( ( (idx + lag - 2) % 7 ) == 0 ) ) {
+            tmp_idx = idx + lag - 2;
+            if ( ( pass ) && ( tmp_idx >= 0 ) &&
+                 ( tmp_idx <= local_max_index ) &&
+                 ( ( tmp_idx % 7 ) == 0 ) ) {
 
                 if ( verbose )
-                    HDfprintf(stdout, "(u, %d, %d) ", type, (idx + lag - 2));
+                    HDfprintf(stdout, "(u, %d, %d) ", type, tmp_idx);
 
-                unprotect_entry(file_ptr, type, idx+lag-2, H5C__NO_FLAGS_SET);
+                unprotect_entry(file_ptr, type, tmp_idx, H5C__NO_FLAGS_SET);
             }
 
-            if ( ( pass ) && ( (idx + lag - 1) >= 0 ) &&
-                 ( (idx + lag - 1) <= max_indices[type] ) &&
-                 ( ( (idx + lag - 1) % 7 ) == 0 ) ) {
+            tmp_idx++;
+            if ( ( pass ) && ( tmp_idx >= 0 ) &&
+                 ( tmp_idx <= local_max_index ) &&
+                 ( ( tmp_idx % 7 ) == 0 ) ) {
 
                 if ( verbose )
-                    HDfprintf(stdout, "(p, %d, %d) ", type, (idx + lag - 1));
+                    HDfprintf(stdout, "(p, %d, %d) ", type, tmp_idx);
 
-                protect_entry(file_ptr, type, (idx + lag - 1));
+                protect_entry(file_ptr, type, tmp_idx);
             }
 
 
             if ( do_destroys ) {
 
                 if ( ( pass ) && ( (idx + lag) >= 0 ) &&
-                     ( ( idx + lag) <= max_indices[type] ) ) {
+                     ( ( idx + lag) <= local_max_index ) ) {
 
-                    switch ( (idx + lag) %4 ) {
+                    switch ( (idx + lag) % 4 ) {
 
                         case 0:
                             if ( (entries[type])[idx+lag].is_dirty ) {
@@ -3931,7 +5049,7 @@ row_major_scan_backward(H5F_t * file_ptr,
                             }
                             break;
 
-                        case 3: /* we just did an insrt */
+                        case 3: /* we just did an insert */
                             unprotect_entry(file_ptr, type, idx + lag, H5C__DELETED_FLAG);
                             break;
 
@@ -3943,7 +5061,7 @@ row_major_scan_backward(H5F_t * file_ptr,
             } else {
 
                 if ( ( pass ) && ( (idx + lag) >= 0 ) &&
-                     ( ( idx + lag) <= max_indices[type] ) ) {
+                     ( ( idx + lag) <= local_max_index ) ) {
 
                     if ( verbose )
                         HDfprintf(stdout, "(u, %d, %d) ", type, (idx + lag));
@@ -3995,8 +5113,7 @@ hl_row_major_scan_backward(H5F_t * file_ptr,
                            hbool_t display_detailed_stats,
                            hbool_t do_inserts)
 {
-    const char * fcn_name = "hl_row_major_scan_backward";
-    H5C_t * cache_ptr;
+    H5C_t * cache_ptr = NULL;
     int32_t type = NUMBER_OF_ENTRY_TYPES - 1;
     int32_t idx;
     int32_t i;
@@ -4004,7 +5121,7 @@ hl_row_major_scan_backward(H5F_t * file_ptr,
     int32_t local_max_index;
 
     if ( verbose )
-        HDfprintf(stdout, "%s(): entering.\n", fcn_name);
+        HDfprintf(stdout, "%s(): entering.\n", FUNC);
 
     if ( pass ) {
 
@@ -4094,6 +5211,7 @@ hl_row_major_scan_backward(H5F_t * file_ptr,
 
 void
 col_major_scan_forward(H5F_t * file_ptr,
+		       int32_t max_index,
                        int32_t lag,
                        hbool_t verbose,
                        hbool_t reset_stats,
@@ -4102,18 +5220,22 @@ col_major_scan_forward(H5F_t * file_ptr,
                        hbool_t do_inserts,
                        int dirty_unprotects)
 {
-    const char * fcn_name = "col_major_scan_forward()";
-    H5C_t * cache_ptr;
+    H5C_t * cache_ptr = NULL;
     int32_t type = 0;
     int32_t idx;
+    int32_t local_max_index[NUMBER_OF_ENTRY_TYPES];
 
     if ( verbose )
-        HDfprintf(stdout, "%s: entering.\n", fcn_name);
+        HDfprintf(stdout, "%s: entering.\n", FUNC);
 
     if ( pass ) {
+        int i;
 
         cache_ptr = file_ptr->shared->cache;
 
+        for ( i = 0; i < NUMBER_OF_ENTRY_TYPES; i++ )
+            local_max_index[i] = MIN(max_index, max_indices[i]);
+
         HDassert( lag > 5 );
 
         if ( reset_stats ) {
@@ -4131,7 +5253,7 @@ col_major_scan_forward(H5F_t * file_ptr,
         while ( ( pass ) && ( type < NUMBER_OF_ENTRY_TYPES ) )
         {
             if ( ( pass ) && ( do_inserts ) && ( (idx + lag) >= 0 ) &&
-                 ( (idx + lag) <= max_indices[type] ) &&
+                 ( (idx + lag) <= local_max_index[type] ) &&
                  ( ((idx + lag) % 3) == 0 ) &&
                  ( ! entry_in_cache(cache_ptr, type, (idx + lag)) ) ) {
 
@@ -4141,7 +5263,9 @@ col_major_scan_forward(H5F_t * file_ptr,
                 insert_entry(file_ptr, type, (idx + lag), H5C__NO_FLAGS_SET);
             }
 
-            if ( ( pass ) && ( idx >= 0 ) && ( idx <= max_indices[type] ) ) {
+            if ( ( pass ) &&
+                 ( idx >= 0 ) &&
+                 ( idx <= local_max_index[type] ) ) {
 
                 if ( verbose )
                     HDfprintf(stdout, "(p, %d, %d) ", type, idx);
@@ -4150,7 +5274,7 @@ col_major_scan_forward(H5F_t * file_ptr,
             }
 
             if ( ( pass ) && ( (idx - lag) >= 0 ) &&
-                 ( (idx - lag) <= max_indices[type] ) ) {
+                 ( (idx - lag) <= local_max_index[type] ) ) {
 
                 if ( verbose )
                     HDfprintf(stdout, "(u, %d, %d) ", type, (idx - lag));
@@ -4203,8 +5327,7 @@ hl_col_major_scan_forward(H5F_t * file_ptr,
                           hbool_t do_inserts,
                           int dirty_unprotects)
 {
-    const char * fcn_name = "hl_col_major_scan_forward()";
-    H5C_t * cache_ptr;
+    H5C_t * cache_ptr = NULL;
     int32_t type = 0;
     int32_t idx;
     int32_t lag = 200;
@@ -4212,7 +5335,7 @@ hl_col_major_scan_forward(H5F_t * file_ptr,
     int32_t local_max_index;
 
     if ( verbose )
-        HDfprintf(stdout, "%s: entering.\n", fcn_name);
+        HDfprintf(stdout, "%s: entering.\n", FUNC);
 
     if ( pass ) {
 
@@ -4264,7 +5387,7 @@ hl_col_major_scan_forward(H5F_t * file_ptr,
                 }
 
                 if ( ( pass ) && ( i >= 0 ) &&
-                     ( i <= max_indices[type] ) ) {
+                     ( i <= local_max_index ) ) {
 
                     if ( verbose )
                         HDfprintf(stdout, "(u, %d, %d) ", type, i);
@@ -4312,6 +5435,7 @@ hl_col_major_scan_forward(H5F_t * file_ptr,
 
 void
 col_major_scan_backward(H5F_t * file_ptr,
+		        int32_t max_index,
                         int32_t lag,
                         hbool_t verbose,
                         hbool_t reset_stats,
@@ -4320,21 +5444,25 @@ col_major_scan_backward(H5F_t * file_ptr,
                         hbool_t do_inserts,
                         int dirty_unprotects)
 {
-    const char * fcn_name = "col_major_scan_backward()";
-    H5C_t * cache_ptr;
+    H5C_t * cache_ptr = NULL;
     int mile_stone = 1;
     int32_t type;
     int32_t idx;
+    int32_t local_max_index[NUMBER_OF_ENTRY_TYPES];
 
     if ( verbose )
-        HDfprintf(stdout, "%s: entering.\n", fcn_name);
+        HDfprintf(stdout, "%s: entering.\n", FUNC);
 
     if ( pass ) {
+        int i;
 
         cache_ptr = file_ptr->shared->cache;
 
         HDassert( cache_ptr != NULL );
 
+        for ( i = 0; i < NUMBER_OF_ENTRY_TYPES; i++ )
+            local_max_index[i] = MIN(max_index, max_indices[i]);
+
         HDassert( lag > 5 );
 
         if ( reset_stats ) {
@@ -4343,10 +5471,10 @@ col_major_scan_backward(H5F_t * file_ptr,
         }
     }
 
-    idx = MAX_ENTRIES + lag;
+    idx = local_max_index[NUMBER_OF_ENTRY_TYPES - 1] + lag;
 
     if ( verbose ) /* 1 */
-        HDfprintf(stdout, "%s: point %d.\n", fcn_name, mile_stone++);
+        HDfprintf(stdout, "%s: point %d.\n", FUNC, mile_stone++);
 
 
     while ( ( pass ) && ( (idx + lag) >= 0 ) )
@@ -4356,7 +5484,7 @@ col_major_scan_backward(H5F_t * file_ptr,
         while ( ( pass ) && ( type >= 0 ) )
         {
             if ( ( pass ) && ( do_inserts) && ( (idx - lag) >= 0 ) &&
-                 ( (idx - lag) <= max_indices[type] ) &&
+                 ( (idx - lag) <= local_max_index[type] ) &&
                  ( ((idx - lag) % 3) == 0 ) &&
                  ( ! entry_in_cache(cache_ptr, type, (idx - lag)) ) ) {
 
@@ -4366,7 +5494,9 @@ col_major_scan_backward(H5F_t * file_ptr,
                 insert_entry(file_ptr, type, (idx - lag), H5C__NO_FLAGS_SET);
             }
 
-            if ( ( pass ) && ( idx >= 0 ) && ( idx <= max_indices[type] ) ) {
+            if ( ( pass ) &&
+		 ( idx >= 0 ) &&
+		 ( idx <= local_max_index[type] ) ) {
 
                 if ( verbose )
                     HDfprintf(stdout, "(p, %d, %d) ", type, idx);
@@ -4375,7 +5505,7 @@ col_major_scan_backward(H5F_t * file_ptr,
             }
 
             if ( ( pass ) && ( (idx + lag) >= 0 ) &&
-                 ( (idx + lag) <= max_indices[type] ) ) {
+                 ( (idx + lag) <= local_max_index[type] ) ) {
 
                 if ( verbose )
                     HDfprintf(stdout, "(u, %d, %d) ", type, (idx + lag));
@@ -4394,7 +5524,7 @@ col_major_scan_backward(H5F_t * file_ptr,
     }
 
     if ( verbose ) /* 2 */
-        HDfprintf(stdout, "%s: point %d.\n", fcn_name, mile_stone++);
+        HDfprintf(stdout, "%s: point %d.\n", FUNC, mile_stone++);
 
     if ( ( pass ) && ( display_stats ) ) {
 
@@ -4402,7 +5532,7 @@ col_major_scan_backward(H5F_t * file_ptr,
     }
 
     if ( verbose )
-        HDfprintf(stdout, "%s: exiting.\n", fcn_name);
+        HDfprintf(stdout, "%s: exiting.\n", FUNC);
 
     return;
 
@@ -4434,16 +5564,15 @@ hl_col_major_scan_backward(H5F_t * file_ptr,
                            hbool_t do_inserts,
                            int dirty_unprotects)
 {
-    const char * fcn_name = "hl_col_major_scan_backward()";
-    H5C_t * cache_ptr;
+    H5C_t * cache_ptr = NULL;
     int32_t type = 0;
-    int32_t idx;
+    int32_t idx = -1;
     int32_t lag = 50;
     int32_t i;
-    int32_t local_max_index;
+    int32_t local_max_index = -1;
 
     if ( verbose )
-        HDfprintf(stdout, "%s: entering.\n", fcn_name);
+        HDfprintf(stdout, "%s: entering.\n", FUNC);
 
     if ( pass ) {
 
@@ -4525,6 +5654,289 @@ hl_col_major_scan_backward(H5F_t * file_ptr,
 } /* hl_col_major_scan_backward() */
 
 

+/*-------------------------------------------------------------------------
+ * Function:	create_flush_dependency()
+ *
+ * Purpose:	Create a 'flush dependency' between two entries.
+ *
+ *		Do nothing if pass is false.
+ *
+ * Return:	void
+ *
+ * Programmer:	Quincey Koziol
+ *              3/16/09
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void
+create_flush_dependency(int32_t par_type,
+             int32_t par_idx,
+             int32_t chd_type,
+             int32_t chd_idx)
+{
+    HDassert( ( 0 <= par_type ) && ( par_type < NUMBER_OF_ENTRY_TYPES ) );
+    HDassert( ( 0 <= par_idx ) && ( par_idx <= max_indices[par_type] ) );
+    HDassert( ( 0 <= chd_type ) && ( chd_type < NUMBER_OF_ENTRY_TYPES ) );
+    HDassert( ( 0 <= chd_idx ) && ( chd_idx <= max_indices[chd_type] ) );
+
+    if ( pass ) {
+        test_entry_t * par_base_addr;   /* Base entry of parent's entry array */
+        test_entry_t * par_entry_ptr;   /* Parent entry */
+        test_entry_t * chd_base_addr;   /* Base entry of child's entry array */
+        test_entry_t * chd_entry_ptr;   /* Child entry */
+        hbool_t par_is_pinned;          /* Whether parent is already pinned */
+        herr_t result;                  /* API routine status */
+
+        /* Get parent entry */
+        par_base_addr = entries[par_type];
+        par_entry_ptr = &(par_base_addr[par_idx]);
+        par_is_pinned = par_entry_ptr->header.is_pinned;
+
+        /* Sanity check parent entry */
+        HDassert( par_entry_ptr->index == par_idx );
+        HDassert( par_entry_ptr->type == par_type );
+        HDassert( par_entry_ptr->header.is_protected );
+        HDassert( par_entry_ptr == par_entry_ptr->self );
+
+        /* Get parent entry */
+        chd_base_addr = entries[chd_type];
+        chd_entry_ptr = &(chd_base_addr[chd_idx]);
+
+        /* Sanity check child entry */
+        HDassert( chd_entry_ptr->index == chd_idx );
+        HDassert( chd_entry_ptr->type == chd_type );
+        HDassert( chd_entry_ptr == chd_entry_ptr->self );
+
+        result = H5C_create_flush_dependency(par_entry_ptr, chd_entry_ptr);
+
+        if ( ( result < 0 ) ||
+             ( !par_entry_ptr->header.is_pinned ) ||
+             ( !(par_entry_ptr->header.flush_dep_nchildren > 0) ) ) {
+
+            pass = FALSE;
+            failure_mssg = "error in H5C_create_flush_dependency().";
+        } /* end if */
+
+        /* Update information about entries */
+        HDassert( chd_entry_ptr->flush_dep_npar < MAX_FLUSH_DEP_PARS );
+        chd_entry_ptr->flush_dep_par_type[chd_entry_ptr->flush_dep_npar] = par_type;
+        chd_entry_ptr->flush_dep_par_idx[chd_entry_ptr->flush_dep_npar] = par_idx;
+        chd_entry_ptr->flush_dep_npar++;
+        par_entry_ptr->flush_dep_nchd++;
+        if(chd_entry_ptr->is_dirty || chd_entry_ptr->flush_dep_ndirty_chd > 0) {
+            HDassert(par_entry_ptr->flush_dep_ndirty_chd < par_entry_ptr->flush_dep_nchd);
+            par_entry_ptr->flush_dep_ndirty_chd++;
+            if(!par_entry_ptr->is_dirty
+                    && par_entry_ptr->flush_dep_ndirty_chd == 1)
+                mark_flush_dep_dirty(par_entry_ptr);
+        } /* end if */
+        par_entry_ptr->pinned_from_cache = TRUE;
+        if( !par_is_pinned )
+            par_entry_ptr->is_pinned = TRUE;
+    } /* end if */
+
+    return;
+
+} /* create_flush_dependency() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	destroy_flush_dependency()
+ *
+ * Purpose:	Destroy a 'flush dependency' between two entries.
+ *
+ *		Do nothing if pass is false.
+ *
+ * Return:	void
+ *
+ * Programmer:	Quincey Koziol
+ *              3/16/09
+ *
+ *-------------------------------------------------------------------------
+ */
+
+void
+destroy_flush_dependency(int32_t par_type,
+             int32_t par_idx,
+             int32_t chd_type,
+             int32_t chd_idx)
+{
+    HDassert( ( 0 <= par_type ) && ( par_type < NUMBER_OF_ENTRY_TYPES ) );
+    HDassert( ( 0 <= par_idx ) && ( par_idx <= max_indices[par_type] ) );
+    HDassert( ( 0 <= chd_type ) && ( chd_type < NUMBER_OF_ENTRY_TYPES ) );
+    HDassert( ( 0 <= chd_idx ) && ( chd_idx <= max_indices[chd_type] ) );
+
+    if ( pass ) {
+        test_entry_t * par_base_addr;   /* Base entry of parent's entry array */
+        test_entry_t * par_entry_ptr;   /* Parent entry */
+        test_entry_t * chd_base_addr;   /* Base entry of child's entry array */
+        test_entry_t * chd_entry_ptr;   /* Child entry */
+        unsigned i;                     /* Local index variable */
+
+        /* Get parent entry */
+        par_base_addr = entries[par_type];
+        par_entry_ptr = &(par_base_addr[par_idx]);
+
+        /* Sanity check parent entry */
+        HDassert( par_entry_ptr->is_pinned );
+        HDassert( par_entry_ptr->pinned_from_cache );
+        HDassert( par_entry_ptr->flush_dep_nchd > 0 );
+        HDassert( par_entry_ptr == par_entry_ptr->self );
+
+        /* Get parent entry */
+        chd_base_addr = entries[chd_type];
+        chd_entry_ptr = &(chd_base_addr[chd_idx]);
+
+        /* Sanity check child entry */
+        HDassert( chd_entry_ptr->index == chd_idx );
+        HDassert( chd_entry_ptr->type == chd_type );
+        HDassert( chd_entry_ptr->flush_dep_npar > 0 );
+        HDassert( chd_entry_ptr == chd_entry_ptr->self );
+
+        if ( H5C_destroy_flush_dependency(par_entry_ptr, chd_entry_ptr) < 0 ) {
+            pass = FALSE;
+            failure_mssg = "error in H5C_destroy_flush_dependency().";
+        } /* end if */
+
+        /* Update information about entries */
+        for(i=0; i<chd_entry_ptr->flush_dep_npar; i++)
+            if(chd_entry_ptr->flush_dep_par_type[i] == par_type
+                    && chd_entry_ptr->flush_dep_par_idx[i] == par_idx)
+                break;
+        HDassert(i < chd_entry_ptr->flush_dep_npar);
+        if(i < chd_entry_ptr->flush_dep_npar - 1)
+            HDmemmove(&chd_entry_ptr->flush_dep_par_type[i],
+                    &chd_entry_ptr->flush_dep_par_type[i+1],
+                    (chd_entry_ptr->flush_dep_npar - i - 1)
+                    * sizeof(chd_entry_ptr->flush_dep_par_type[0]));
+        if(i < chd_entry_ptr->flush_dep_npar - 1)
+            HDmemmove(&chd_entry_ptr->flush_dep_par_idx[i],
+                    &chd_entry_ptr->flush_dep_par_idx[i+1],
+                    (chd_entry_ptr->flush_dep_npar - i - 1)
+                    * sizeof(chd_entry_ptr->flush_dep_par_idx[0]));
+        chd_entry_ptr->flush_dep_npar--;
+        par_entry_ptr->flush_dep_nchd--;
+        if(par_entry_ptr->flush_dep_nchd == 0) {
+            par_entry_ptr->pinned_from_cache = FALSE;
+            par_entry_ptr->is_pinned = par_entry_ptr->pinned_from_client;
+        } /* end if */
+        if(chd_entry_ptr->is_dirty || chd_entry_ptr->flush_dep_ndirty_chd > 0) {
+            HDassert(par_entry_ptr->flush_dep_ndirty_chd > 0);
+            par_entry_ptr->flush_dep_ndirty_chd--;
+            if(!par_entry_ptr->is_dirty
+                    && par_entry_ptr->flush_dep_ndirty_chd == 0)
+                mark_flush_dep_clean(par_entry_ptr);
+        } /* end if */
+    } /* end if */
+
+    return;
+
+} /* destroy_flush_dependency() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    mark_flush_dep_dirty()
+ *
+ * Purpose:     Recursively propagate the flush_dep_ndirty_children flag
+ *              up the dependency chain in response to entry either
+ *              becoming dirty or having its flush_dep_ndirty_children
+ *              increased from 0.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              12/4/12
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+mark_flush_dep_dirty(test_entry_t * entry_ptr)
+{
+    test_entry_t * par_base_addr;       /* Base entry of parent's entry array */
+    test_entry_t * par_entry_ptr;       /* Parent entry */
+    unsigned i;                         /* Local index variable */
+
+    /* Sanity checks */
+    HDassert(entry_ptr);
+    HDassert((entry_ptr->is_dirty && entry_ptr->flush_dep_ndirty_chd == 0)
+            || (!entry_ptr->is_dirty && entry_ptr->flush_dep_ndirty_chd == 1));
+
+    /* Iterate over the parent entries */
+    if(entry_ptr->flush_dep_npar) {
+        for(i=0; i<entry_ptr->flush_dep_npar; i++) {
+            /* Get parent entry */
+            par_base_addr = entries[entry_ptr->flush_dep_par_type[i]];
+            par_entry_ptr = &(par_base_addr[entry_ptr->flush_dep_par_idx[i]]);
+
+            /* Sanity check */
+            HDassert(par_entry_ptr->flush_dep_ndirty_chd
+                    < par_entry_ptr->flush_dep_nchd);
+
+            /* Adjust the parent's number of dirty children */
+            par_entry_ptr->flush_dep_ndirty_chd++;
+
+            /* Propagate the flush dep dirty flag up the chain if necessary */
+            if(!par_entry_ptr->is_dirty
+                    && par_entry_ptr->flush_dep_ndirty_chd == 1)
+                mark_flush_dep_dirty(par_entry_ptr);
+        } /* end for */
+    } /* end if */
+
+    return;
+} /* mark_flush_dep_dirty() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    mark_flush_dep_clean()
+ *
+ * Purpose:     Recursively propagate the flush_dep_ndirty_children flag
+ *              up the dependency chain in response to entry either
+ *              becoming clean or having its flush_dep_ndirty_children
+ *              reduced to 0.
+ *
+ * Return:      Non-negative on success/Negative on failure
+ *
+ * Programmer:  Neil Fortner
+ *              12/4/12
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+mark_flush_dep_clean(test_entry_t * entry_ptr)
+{
+    test_entry_t * par_base_addr;       /* Base entry of parent's entry array */
+    test_entry_t * par_entry_ptr;       /* Parent entry */
+    unsigned i;                         /* Local index variable */
+
+    /* Sanity checks */
+    HDassert(entry_ptr);
+    HDassert(!entry_ptr->is_dirty && entry_ptr->flush_dep_ndirty_chd == 0);
+
+    /* Iterate over the parent entries */
+    if(entry_ptr->flush_dep_npar) {
+        for(i=0; i<entry_ptr->flush_dep_npar; i++) {
+            /* Get parent entry */
+            par_base_addr = entries[entry_ptr->flush_dep_par_type[i]];
+            par_entry_ptr = &(par_base_addr[entry_ptr->flush_dep_par_idx[i]]);
+
+            /* Sanity check */
+            HDassert(par_entry_ptr->flush_dep_ndirty_chd > 0);
+
+            /* Adjust the parent's number of dirty children */
+            par_entry_ptr->flush_dep_ndirty_chd--;
+
+            /* Propagate the flush dep dirty flag up the chain if necessary */
+            if(!par_entry_ptr->is_dirty
+                    && par_entry_ptr->flush_dep_ndirty_chd == 0)
+                mark_flush_dep_clean(par_entry_ptr);
+        } /* end for */
+    } /* end if */
+
+    return;
+} /* mark_flush_dep_clean() */
+
+

 /*** H5AC level utility functions ***/
 
 

@@ -4561,7 +5973,6 @@ check_and_validate_cache_hit_rate(hid_t file_id,
                                   int64_t min_accesses,
                                   double min_hit_rate)
 {
-    /* const char * fcn_name = "check_and_validate_cache_hit_rate()"; */
     herr_t result;
     int64_t cache_hits = 0;
     int64_t cache_accesses = 0;
@@ -4619,7 +6030,7 @@ check_and_validate_cache_hit_rate(hid_t file_id,
             pass = FALSE;
             failure_mssg = "H5Fget_mdc_hit_rate() failed.";
 
-        } else if ( ! DBL_REL_EQUAL(hit_rate, expected_hit_rate, 0.00001F) ) {
+        } else if ( ! H5_DBL_ABS_EQUAL(hit_rate, expected_hit_rate) ) {
 
             pass = FALSE;
             failure_mssg = "unexpected hit rate.";
@@ -4695,7 +6106,6 @@ check_and_validate_cache_size(hid_t file_id,
                               int32_t * cur_num_entries_ptr,
                               hbool_t dump_data)
 {
-    /* const char * fcn_name = "check_and_validate_cache_size()"; */
     herr_t result;
     size_t expected_max_size;
     size_t max_size;
@@ -4813,7 +6223,7 @@ resize_configs_are_equal(const H5C_auto_size_ctl_t *a,
         return(FALSE);
     else if(compare_init && (a->initial_size != b->initial_size))
         return(FALSE);
-    else if(HDfabs(a->min_clean_fraction - b->min_clean_fraction) > FP_EPSILON)
+    else if(!H5_DBL_ABS_EQUAL(a->min_clean_fraction, b->min_clean_fraction))
         return(FALSE);
     else if(a->max_size != b->max_size)
         return(FALSE);
@@ -4823,9 +6233,9 @@ resize_configs_are_equal(const H5C_auto_size_ctl_t *a,
         return(FALSE);
     else if(a->incr_mode != b->incr_mode)
         return(FALSE);
-    else if(HDfabs(a->lower_hr_threshold - b->lower_hr_threshold) > FP_EPSILON)
+    else if(!H5_DBL_ABS_EQUAL(a->lower_hr_threshold, b->lower_hr_threshold))
         return(FALSE);
-    else if(HDfabs(a->increment - b->increment) > FP_EPSILON)
+    else if(!H5_DBL_ABS_EQUAL(a->increment, b->increment))
         return(FALSE);
     else if(a->apply_max_increment != b->apply_max_increment)
         return(FALSE);
@@ -4833,15 +6243,15 @@ resize_configs_are_equal(const H5C_auto_size_ctl_t *a,
         return(FALSE);
     else if(a->flash_incr_mode != b->flash_incr_mode)
         return(FALSE);
-    else if(HDfabs(a->flash_multiple - b->flash_multiple) > FP_EPSILON)
+    else if(!H5_DBL_ABS_EQUAL(a->flash_multiple, b->flash_multiple))
         return(FALSE);
-    else if(HDfabs(a->flash_threshold - b->flash_threshold) > FP_EPSILON)
+    else if(!H5_DBL_ABS_EQUAL(a->flash_threshold, b->flash_threshold))
         return(FALSE);
     else if(a->decr_mode != b->decr_mode)
         return(FALSE);
-    else if(HDfabs(a->upper_hr_threshold - b->upper_hr_threshold) > FP_EPSILON)
+    else if(!H5_DBL_ABS_EQUAL(a->upper_hr_threshold, b->upper_hr_threshold))
         return(FALSE);
-    else if(HDfabs(a->decrement - b->decrement) > FP_EPSILON)
+    else if(!H5_DBL_ABS_EQUAL(a->decrement, b->decrement))
         return(FALSE);
     else if(a->apply_max_decrement != b->apply_max_decrement)
         return(FALSE);
@@ -4851,7 +6261,7 @@ resize_configs_are_equal(const H5C_auto_size_ctl_t *a,
         return(FALSE);
     else if(a->apply_empty_reserve != b->apply_empty_reserve)
         return(FALSE);
-    else if(HDfabs(a->empty_reserve - b->empty_reserve) > FP_EPSILON)
+    else if(!H5_DBL_ABS_EQUAL(a->empty_reserve, b->empty_reserve))
         return(FALSE);
     return(TRUE);
 }
@@ -4882,7 +6292,6 @@ validate_mdc_config(hid_t file_id,
                     hbool_t compare_init,
                     int test_num)
 {
-    /* const char * fcn_name = "validate_mdc_config()"; */
     static char msg[256];
     H5F_t * file_ptr = NULL;
     H5C_t * cache_ptr = NULL;
@@ -4976,3 +6385,73 @@ validate_mdc_config(hid_t file_id,
 
 } /* validate_mdc_config() */
 
+

+#if 0 /* debugging functions -- normally commented out */
+/*-------------------------------------------------------------------------
+ * Function:    dump_LRU
+ *
+ * Purpose:     Display a summarize list of the contents of the LRU 
+ *              from head to tail.
+ *
+ * Return:      void
+ *
+ * Programmer:  John Mainzer
+ *              2/16/15
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+dump_LRU(H5F_t * file_ptr)
+{
+    const char * hdr_0 =
+        " Entry  Entry   Entry       Entry         Entry               \n";
+    const char * hdr_1 =
+        " Num:   Dirty:  Size:       Addr:         Type:               \n";
+    const char * hdr_2 =
+        "==============================================================\n";
+    int i = 0;
+    H5C_cache_entry_t * entry_ptr = NULL;
+    H5C_t *cache_ptr = file_ptr->shared->cache;
+
+    HDassert(cache_ptr);
+    HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC);
+
+    entry_ptr = cache_ptr->LRU_head_ptr;
+
+    HDfprintf(stdout, 
+              "\n\nIndex len/size/clean size/dirty size = %d/%lld/%lld/%lld\n",
+              cache_ptr->index_len, (long long)(cache_ptr->index_size),
+              (long long)(cache_ptr->clean_index_size),
+              (long long)(cache_ptr->dirty_index_size));
+    HDfprintf(stdout, "\nLRU len/size = %d/%lld.\n\n",
+              cache_ptr->LRU_list_len, (long long)(cache_ptr->LRU_list_size));
+
+    if ( entry_ptr != NULL )
+    {
+        HDfprintf(stdout, "%s%s%s", hdr_0, hdr_1, hdr_2);
+    }
+
+    while ( entry_ptr != NULL )
+    {
+        HDfprintf(stdout, 
+                  "  %3d     %d     %10lld  0x%010llx  %s(%d)\n",
+                  i, 
+                  (int)(entry_ptr->is_dirty), 
+                  (long long)(entry_ptr->size),
+                  (long long)(entry_ptr->addr),
+                  entry_ptr->type->name,
+                  entry_ptr->type->id);
+        i++;
+        entry_ptr = entry_ptr->next;
+    } 
+
+    if ( cache_ptr->LRU_list_len > 0 )
+    {
+        HDfprintf(stdout, "%s\n", hdr_2);
+    }
+
+    return;
+
+} /* dump_LRU() */
+
+#endif /* debugging functions -- normally commented out */
diff --git a/test/cache_common.h b/test/cache_common.h
index a638ad7..3f08081 100644
--- a/test/cache_common.h
+++ b/test/cache_common.h
@@ -22,8 +22,8 @@
 #ifndef _CACHE_COMMON_H
 #define _CACHE_COMMON_H
 
-#define H5C_PACKAGE             /*suppress error about including H5Cpkg   */
-#define H5F_PACKAGE             /*suppress error about including H5Fpkg   */
+#define H5C_FRIEND		/*suppress error about including H5Cpkg   */
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
 
 /* Include library header files */
 #include "H5ACprivate.h"
@@ -34,6 +34,9 @@
 /* Include test header files */
 #include "h5test.h"
 
+/* Macro to make error reporting easier */
+#define CACHE_ERROR(s)      {failure_mssg = "Line #" H5_TOSTRING(__LINE__) ": " s ; pass = FALSE; goto done;}
+
 #define NO_CHANGE       	-1
 
 /* with apologies for the abuse of terminology... */
@@ -48,8 +51,9 @@
 #define HUGE_ENTRY_TYPE		7
 #define MONSTER_ENTRY_TYPE	8
 #define VARIABLE_ENTRY_TYPE	9
+#define NOTIFY_ENTRY_TYPE	10
 
-#define NUMBER_OF_ENTRY_TYPES   10
+#define NUMBER_OF_ENTRY_TYPES   11
 
 #define PICO_ENTRY_SIZE		(size_t)1
 #define NANO_ENTRY_SIZE		(size_t)4
@@ -61,6 +65,7 @@
 #define HUGE_ENTRY_SIZE		(size_t)(16 * 1024)
 #define MONSTER_ENTRY_SIZE	(size_t)(64 * 1024)
 #define VARIABLE_ENTRY_SIZE	(size_t)(10 * 1024)
+#define NOTIFY_ENTRY_SIZE	(size_t)1
 
 #define NUM_PICO_ENTRIES	(10 * 1024)
 #define NUM_NANO_ENTRIES	(10 * 1024)
@@ -72,6 +77,7 @@
 #define NUM_HUGE_ENTRIES	(10 * 1024)
 #define NUM_MONSTER_ENTRIES	(10 * 1024)
 #define NUM_VARIABLE_ENTRIES	(10 * 1024)
+#define NUM_NOTIFY_ENTRIES	(10 * 1024)
 
 #define MAX_ENTRIES		(10 * 1024)
 
@@ -99,9 +105,11 @@
                                       (HUGE_ENTRY_SIZE * NUM_HUGE_ENTRIES))
 #define VARIABLE_BASE_ADDR	(haddr_t)(MONSTER_BASE_ADDR + \
 				     (MONSTER_ENTRY_SIZE * NUM_MONSTER_ENTRIES))
+#define NOTIFY_BASE_ADDR	(haddr_t)(VARIABLE_BASE_ADDR + \
+				     (VARIABLE_ENTRY_SIZE * NUM_VARIABLE_ENTRIES))
 
-#define PICO_ALT_BASE_ADDR	(haddr_t)(VARIABLE_BASE_ADDR + \
-			           (VARIABLE_ENTRY_SIZE * NUM_VARIABLE_ENTRIES))
+#define PICO_ALT_BASE_ADDR	(haddr_t)(NOTIFY_BASE_ADDR + \
+			           (NOTIFY_ENTRY_SIZE * NUM_NOTIFY_ENTRIES))
 #define NANO_ALT_BASE_ADDR	(haddr_t)(PICO_ALT_BASE_ADDR + \
                                       (PICO_ENTRY_SIZE * NUM_PICO_ENTRIES))
 #define MICRO_ALT_BASE_ADDR	(haddr_t)(NANO_ALT_BASE_ADDR + \
@@ -120,25 +128,33 @@
                                       (HUGE_ENTRY_SIZE * NUM_HUGE_ENTRIES))
 #define VARIABLE_ALT_BASE_ADDR	(haddr_t)(MONSTER_ALT_BASE_ADDR + \
                                      (MONSTER_ENTRY_SIZE * NUM_MONSTER_ENTRIES))
-#define MAX_ADDR		(haddr_t)(VARIABLE_ALT_BASE_ADDR + \
-				   (VARIABLE_ENTRY_SIZE * NUM_VARIABLE_ENTRIES))
+#define NOTIFY_ALT_BASE_ADDR	(haddr_t)(VARIABLE_ALT_BASE_ADDR + \
+                                     (VARIABLE_ENTRY_SIZE * NUM_VARIABLE_ENTRIES))
+#define MAX_ADDR		(haddr_t)(NOTIFY_ALT_BASE_ADDR + \
+				   (NOTIFY_ENTRY_SIZE * NUM_NOTIFY_ENTRIES))
 #define ADDR_SPACE_SIZE		(haddr_t)(MAX_ADDR - BASE_ADDR)
 
 #define MAX_PINS	8	/* Maximum number of entries that can be
 				 * directly pinned by a single entry.
 				 */
 
-#define FLUSH_OP__NO_OP		0
-#define FLUSH_OP__DIRTY		1
-#define FLUSH_OP__RESIZE	2
-#define FLUSH_OP__MOVE		3
-#define FLUSH_OP__MAX_OP	3
+#define FLUSH_OP__NO_OP			0
+#define FLUSH_OP__DIRTY			1
+#define FLUSH_OP__RESIZE		2
+#define FLUSH_OP__MOVE			3
+#define FLUSH_OP__ORDER			4
+#define FLUSH_OP__EXPUNGE		5
+#define FLUSH_OP__DEST_FLUSH_DEP	6
+#define FLUSH_OP__MAX_OP		6
 
 #define MAX_FLUSH_OPS		10	/* Maximum number of flush operations
 					 * that can be associated with a
 					 * cache entry.
 					 */
 
+#define MAX_FLUSH_DEP_PARS      8       /* Maximum number of flush dependency
+                                         * parents in the test */
+
 typedef struct flush_op
 {
     int			op_code;	/* integer op code indicating the
@@ -149,6 +165,7 @@ typedef struct flush_op
 					 *   FLUSH_OP__DIRTY
 					 *   FLUSH_OP__RESIZE
 					 *   FLUSH_OP__MOVE
+					 *   FLUSH_OP__ORDER
 					 */
     int			type;		/* type code of the cache entry that
 					 * is the target of the operation.
@@ -188,6 +205,10 @@ typedef struct flush_op
 					 * FLUSH_OP__MOVE operation.
 					 * Unused elsewhere.
 					 */
+    unsigned          * order_ptr;      /* Pointer to outside counter for
+                                         * recording the order of entries
+                                         * flushed.
+                                         */
 } flush_op;
 
 typedef struct test_entry_t
@@ -198,10 +219,32 @@ typedef struct test_entry_t
     struct test_entry_t * self; 	/* pointer to this entry -- used for
 					 * sanity checking.
                                          */
+    H5F_t               * file_ptr;     /* pointer to the file in which the
+                                         * entry resides, or NULL if the entry
+                                         * is not in a file.
+                                         */
     H5C_t               * cache_ptr;	/* pointer to the cache in which
 					 * the entry resides, or NULL if the
 					 * entry is not in cache.
 					 */
+    hbool_t		  written_to_main_addr;
+    					/* Flag indicating whether an image
+					 * of the entry has been written to
+					 * its main address.  Since we no
+					 * longer have a flush callback, we
+					 * set this field to true whenever the
+					 * entry is serialized while at its
+					 * main address.
+					 */
+    hbool_t		  written_to_alt_addr;
+                                        /* Flag indicating whether an image
+					 * of the entry has been written to
+					 * its alternate address.  Since we no
+					 * longer have a flush callback, we
+					 * set this field to true whenever the
+					 * entry is serialized while at its
+					 * alternate address.
+					 */
     haddr_t		  addr;         /* where the cache thinks this entry
                                          * is located
                                          */
@@ -223,11 +266,11 @@ typedef struct test_entry_t
                                          */
     int32_t		  index;	/* index in its entry array
                                          */
-    int32_t		  reads;	/* number of times this entry has
-					 * been loaded.
+    int32_t		  serializes;	/* number of times this entry has
+					 * been serialized.
                                          */
-    int32_t		  writes;	/* number of times this entry has
-                                         * been written
+    int32_t		  deserializes;	/* number of times this entry has
+                                         * been deserialized
                                          */
     hbool_t		  is_dirty;	/* entry has been modified since
                                          * last write
@@ -244,6 +287,8 @@ typedef struct test_entry_t
     hbool_t		  is_pinned;	/* entry is currently pinned in
 					 * the cache.
                                          */
+    haddr_t		  tag;          /* the base_addr as tag for corking entries */
+    hbool_t		  is_corked;	/* entry is currently corked or not */
     int			  pinning_ref_count; /* Number of entries that
 					 * pin this entry in the cache.
 					 * When this count drops to zero,
@@ -286,18 +331,32 @@ typedef struct test_entry_t
 					 * checking code that would otherwise
 					 * cause a false test failure.
 					 */
-    hbool_t		  loaded;       /* entry has been loaded since the
-                                         * last time it was reset.
+    hbool_t		  deserialized; /* entry has been deserialized since
+					 * the last time it was reset.
                                          */
-    hbool_t		  cleared;      /* entry has been cleared since the
+    hbool_t		  serialized;   /* entry has been serialized since the
                                          * last time it was reset.
                                          */
-    hbool_t		  flushed;      /* entry has been flushed since the
+    hbool_t               destroyed;    /* entry has been destroyed since the
                                          * last time it was reset.
                                          */
-    hbool_t               destroyed;    /* entry has been destroyed since the
+    hbool_t 		  expunged;     /* entry has been expunged since the 
                                          * last time it was reset.
                                          */
+    int                 flush_dep_par_type[MAX_FLUSH_DEP_PARS]; /* Entry types of flush dependency parents */
+    int                 flush_dep_par_idx[MAX_FLUSH_DEP_PARS]; /* Indices of flush dependency parents */
+    unsigned            flush_dep_npar; /* Number of flush dependency parents */
+    unsigned            flush_dep_nchd; /* Number of flush dependency children */
+    unsigned            flush_dep_ndirty_chd; /* Number of dirty flush dependency children (including granchildren, etc.) */
+    hbool_t		pinned_from_client;	/* entry was pinned by client call */
+    hbool_t		pinned_from_cache;	/* entry was pinned by cache internally */
+    unsigned            flush_order;    /* Order that entry was flushed in */
+
+    unsigned              notify_after_insert_count;    /* Count of times that entry was inserted in cache */
+    unsigned              notify_before_evict_count;    /* Count of times that entry was removed in cache */
+    unsigned		actual_len;	/* Simulate the entry's actual size for a speculative load */
+    unsigned		max_verify_ct;  /* Maximum # of times to verify an entry's checksum */
+    unsigned		verify_ct;	/* Count the # of checksum verification for an entry */
 } test_entry_t;
 
 /* The following are cut down test versions of the hash table manipulation
@@ -307,7 +366,6 @@ typedef struct test_entry_t
  */
 
 #define H5C__HASH_MASK          ((size_t)(H5C__HASH_TABLE_LEN - 1) << 3)
-#define H5C__HASH_FCN(x)        (int)(((x) & H5C__HASH_MASK) >> 3)
 
 #define H5C_TEST__PRE_HT_SEARCH_SC(cache_ptr, Addr)          \
 if ( ( (cache_ptr) == NULL ) ||                              \
@@ -381,6 +439,7 @@ if ( ( (cache_ptr) == NULL ) ||                                        \
     }                                                                   \
 }
 
+
 /* Macros used in H5AC level tests */
 
 #define CACHE_CONFIGS_EQUAL(a, b, cmp_set_init, cmp_init_size)        \
@@ -395,26 +454,26 @@ if ( ( (cache_ptr) == NULL ) ||                                        \
       ( (a).set_initial_size      == (b).set_initial_size ) ) &&      \
     ( ( ! cmp_init_size ) ||                                          \
       ( (a).initial_size          == (b).initial_size ) ) &&          \
-    ( (a).min_clean_fraction      == (b).min_clean_fraction ) &&      \
+    ( H5_DBL_ABS_EQUAL((a).min_clean_fraction, (b).min_clean_fraction) ) && \
     ( (a).max_size                == (b).max_size ) &&                \
     ( (a).min_size                == (b).min_size ) &&                \
     ( (a).epoch_length            == (b).epoch_length ) &&            \
     ( (a).incr_mode               == (b).incr_mode ) &&               \
-    ( (a).lower_hr_threshold      == (b).lower_hr_threshold ) &&      \
-    ( (a).increment               == (b).increment ) &&               \
+    ( H5_DBL_ABS_EQUAL((a).lower_hr_threshold, (b).lower_hr_threshold) ) && \
+    ( H5_DBL_ABS_EQUAL((a).increment, (b).increment) ) &&      \
     ( (a).apply_max_increment     == (b).apply_max_increment ) &&     \
     ( (a).max_increment           == (b).max_increment ) &&           \
     ( (a).flash_incr_mode         == (b).flash_incr_mode ) &&         \
-    ( (a).flash_multiple          == (b).flash_multiple ) &&          \
-    ( (a).flash_threshold         == (b).flash_threshold ) &&         \
+    ( H5_DBL_ABS_EQUAL((a).flash_multiple, (b).flash_multiple) ) && \
+    ( H5_DBL_ABS_EQUAL((a).flash_threshold, (b).flash_threshold) ) && \
     ( (a).decr_mode               == (b).decr_mode ) &&               \
-    ( (a).upper_hr_threshold      == (b).upper_hr_threshold ) &&      \
-    ( (a).decrement               == (b).decrement ) &&               \
+    ( H5_DBL_ABS_EQUAL((a).upper_hr_threshold, (b).upper_hr_threshold) ) && \
+    ( H5_DBL_ABS_EQUAL((a).decrement, (b).decrement) ) &&      \
     ( (a).apply_max_decrement     == (b).apply_max_decrement ) &&     \
     ( (a).max_decrement           == (b).max_decrement ) &&           \
     ( (a).epochs_before_eviction  == (b).epochs_before_eviction ) &&  \
     ( (a).apply_empty_reserve     == (b).apply_empty_reserve ) &&     \
-    ( (a).empty_reserve           == (b).empty_reserve ) &&           \
+    ( H5_DBL_ABS_EQUAL((a).empty_reserve, (b).empty_reserve) ) && \
     ( (a).dirty_bytes_threshold   == (b).dirty_bytes_threshold ) &&   \
     ( (a).metadata_write_strategy == (b).metadata_write_strategy ) )
 
@@ -441,9 +500,6 @@ if ( ( (cache_ptr) == NULL ) ||                                        \
     (i).flash_threshold        = (e).flash_threshold;               \
     (i).decr_mode              = (e).decr_mode;                     \
     (i).upper_hr_threshold     = (e).upper_hr_threshold;            \
-    (i).flash_incr_mode        = (e).flash_incr_mode;               \
-    (i).flash_multiple         = (e).flash_multiple;                \
-    (i).flash_threshold        = (e).flash_threshold;               \
     (i).decrement              = (e).decrement;                     \
     (i).apply_max_decrement    = (e).apply_max_decrement;           \
     (i).max_decrement          = (e).max_decrement;                 \
@@ -452,9 +508,6 @@ if ( ( (cache_ptr) == NULL ) ||                                        \
     (i).empty_reserve          = (e).empty_reserve;                 \
 }
 
-/* Epsilon for floating-point comparisons */
-#define FP_EPSILON 0.000001f
-
 

 /* misc type definitions */
 
@@ -463,15 +516,21 @@ struct expected_entry_status
     int			entry_type;
     int                 entry_index;
     size_t              size;
-    unsigned char	in_cache;
-    unsigned char       at_main_addr;
-    unsigned char	is_dirty;
-    unsigned char	is_protected;
-    unsigned char	is_pinned;
-    unsigned char	loaded;
-    unsigned char	cleared;
-    unsigned char	flushed;
-    unsigned char	destroyed;
+    hbool_t		in_cache;
+    hbool_t             at_main_addr;
+    hbool_t		is_dirty;
+    hbool_t		is_protected;
+    hbool_t		is_pinned;
+    hbool_t		deserialized;
+    hbool_t		serialized;
+    hbool_t		destroyed;
+    int                 flush_dep_par_type[MAX_FLUSH_DEP_PARS]; /* Entry types of flush dependency parents */
+    int                 flush_dep_par_idx[MAX_FLUSH_DEP_PARS]; /* Indices of flush dependency parents */
+    unsigned            flush_dep_npar; /* Number of flush dependency parents */
+    unsigned            flush_dep_nchd; /* Number of flush dependency children */
+    unsigned            flush_dep_ndirty_chd; /* Number of dirty flush dependency children */
+    int                 flush_order;    /* flush order of entry */
+    unsigned char	is_corked;	/* cork status of entry */
 };
 
 
@@ -479,12 +538,9 @@ struct expected_entry_status
 

 /* global variable externs: */
 
-extern const char *FILENAME[3];
-
+extern haddr_t saved_actual_base_addr;
 extern hbool_t write_permitted;
 extern hbool_t pass; /* set to false on error */
-extern hbool_t skip_long_tests;
-extern hbool_t run_full_test;
 extern const char *failure_mssg;
 
 extern test_entry_t * entries[NUMBER_OF_ENTRY_TYPES];
@@ -494,13 +550,6 @@ extern const haddr_t base_addrs[NUMBER_OF_ENTRY_TYPES];
 extern const haddr_t alt_base_addrs[NUMBER_OF_ENTRY_TYPES];
 extern const char * entry_type_names[NUMBER_OF_ENTRY_TYPES];
 
-

-/* call back function declarations: */
-
-herr_t check_write_permitted(const H5F_t * f,
-                             hid_t dxpl_id,
-                             hbool_t * write_permitted_ptr);
-
 /* callback table extern */
 
 extern const H5C_class_t types[NUMBER_OF_ENTRY_TYPES];
@@ -514,7 +563,8 @@ void add_flush_op(int target_type,
                   int type,
                   int idx,
                   hbool_t flag,
-                  size_t size);
+                  size_t size,
+                  unsigned * order);
 
 
 void addr_to_type_and_index(haddr_t addr,
@@ -556,6 +606,9 @@ void protect_entry_ro(H5F_t * file_ptr,
                       int32_t type,
                       int32_t idx);
 
+void pin_entry(int32_t type,
+                 int32_t idx);
+
 hbool_t entry_in_cache(H5C_t * cache_ptr,
                        int32_t type,
                        int32_t idx);
@@ -568,6 +621,11 @@ void create_pinned_entry_dependency(H5F_t * file_ptr,
 
 void reset_entries(void);
 
+void cork_entry_type(H5F_t * file_ptr, int32_t type);
+void uncork_entry_type(H5F_t * file_ptr, int32_t type);
+
+
+
 void resize_entry(H5F_t * file_ptr,
                   int32_t type,
                   int32_t idx,
@@ -577,6 +635,7 @@ void resize_entry(H5F_t * file_ptr,
 H5F_t *setup_cache(size_t max_cache_size, size_t min_clean_size);
 
 void row_major_scan_forward(H5F_t * file_ptr,
+                            int32_t max_index,
                             int32_t lag,
                             hbool_t verbose,
                             hbool_t reset_stats,
@@ -599,6 +658,7 @@ void hl_row_major_scan_forward(H5F_t * file_ptr,
                                hbool_t do_inserts);
 
 void row_major_scan_backward(H5F_t * file_ptr,
+                             int32_t max_index,
                              int32_t lag,
                              hbool_t verbose,
                              hbool_t reset_stats,
@@ -621,6 +681,7 @@ void hl_row_major_scan_backward(H5F_t * file_ptr,
                                 hbool_t do_inserts);
 
 void col_major_scan_forward(H5F_t * file_ptr,
+                            int32_t max_index,
                             int32_t lag,
                             hbool_t verbose,
                             hbool_t reset_stats,
@@ -639,6 +700,7 @@ void hl_col_major_scan_forward(H5F_t * file_ptr,
                                int dirty_unprotects);
 
 void col_major_scan_backward(H5F_t * file_ptr,
+                             int32_t max_index,
                              int32_t lag,
                              hbool_t verbose,
                              hbool_t reset_stats,
@@ -682,8 +744,21 @@ void verify_entry_status(H5C_t * cache_ptr,
 
 void verify_unprotected(void);
 
+void create_flush_dependency(int32_t parent_type,
+             int32_t parent_idx,
+             int32_t child_type,
+             int32_t child_idx);
+
+void destroy_flush_dependency(int32_t parent_type,
+             int32_t parent_idx,
+             int32_t child_type,
+             int32_t child_idx);
+
 /*** H5AC level utility functions ***/
 
+hbool_t resize_configs_are_equal(const H5C_auto_size_ctl_t *a,
+    const H5C_auto_size_ctl_t *b, hbool_t compare_init);
+
 void check_and_validate_cache_hit_rate(hid_t file_id,
                                        double * hit_rate_ptr,
                                        hbool_t dump_data,
@@ -702,5 +777,10 @@ void validate_mdc_config(hid_t file_id,
                          hbool_t compare_init,
                          int test_num);
 
+/** Debugging functions -- normally commented out ***/
+#if 0
+void dump_LRU(H5F_t * file_ptr);
+#endif 
+
 #endif /* _CACHE_COMMON_H */
 
diff --git a/test/cache_logging.c b/test/cache_logging.c
new file mode 100644
index 0000000..a5e399c
--- /dev/null
+++ b/test/cache_logging.c
@@ -0,0 +1,176 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Purpose: Tests the metadata cache logging framework */
+
+#include "h5test.h"
+
+#define LOG_LOCATION "cache_logging.out"
+#define FILE_NAME    "cache_logging"
+
+#define N_GROUPS 100
+
+/*-------------------------------------------------------------------------
+ * Function:    test_logging_api
+ *
+ * Purpose:     Tests the API calls that affect mdc logging
+ *
+ * Return:      Success:        0
+ *              Failure:        -1
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+test_logging_api(void)
+{
+    hid_t       fapl = -1;
+    hbool_t     is_enabled;
+    hbool_t     is_enabled_out;
+    hbool_t     start_on_access;
+    hbool_t     start_on_access_out;
+    char        *location = NULL;
+    size_t      size;
+
+    hid_t       fid;
+    hid_t       gid;
+    hbool_t     is_currently_logging;
+    char        group_name[8];
+    char        filename[1024];
+    int         i;
+
+    TESTING("metadata cache log api calls");
+
+    fapl = h5_fileaccess();
+    h5_fixname(FILE_NAME, fapl, filename, sizeof filename);
+
+    /* Set up metadata cache logging */
+    is_enabled = TRUE;
+    start_on_access = FALSE;
+    if(H5Pset_mdc_log_options(fapl, is_enabled, LOG_LOCATION, start_on_access) < 0)
+        TEST_ERROR;
+
+    /* Check to make sure that the property list getter returns the correct
+     * location string buffer size;
+     */
+    is_enabled_out = FALSE;
+    start_on_access_out = TRUE;
+    location = NULL;
+    size = 999;
+    if(H5Pget_mdc_log_options(fapl, &is_enabled_out, location, &size, 
+                              &start_on_access_out) < 0)
+        TEST_ERROR;
+    if(size != strlen(LOG_LOCATION) + 1)
+        TEST_ERROR;
+
+    /* Check to make sure that the property list getter works */
+    if(NULL == (location = (char *)HDcalloc(size, sizeof(char))))
+        TEST_ERROR;
+    if(H5Pget_mdc_log_options(fapl, &is_enabled_out, location, &size, 
+                              &start_on_access_out) < 0)
+        TEST_ERROR;
+    if((is_enabled != is_enabled_out)
+        || (start_on_access != start_on_access_out)
+        || HDstrcmp(LOG_LOCATION, location))
+        TEST_ERROR;
+
+    /* Create a file */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        TEST_ERROR;
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR;
+    if(H5Pclose(fapl) < 0)
+        TEST_ERROR;
+
+
+    /* Check to see if the logging flags were set correctly */
+    is_enabled = FALSE;
+    is_currently_logging = TRUE;
+    if((H5Fget_mdc_logging_status(fid, &is_enabled, &is_currently_logging) < 0)
+       || (is_enabled != TRUE)
+       || (is_currently_logging != FALSE))
+        TEST_ERROR;
+
+    /* Turn on logging and check flags */
+    if(H5Fstart_mdc_logging(fid) < 0)
+        TEST_ERROR;
+    is_enabled = FALSE;
+    is_currently_logging = FALSE;
+    if((H5Fget_mdc_logging_status(fid, &is_enabled, &is_currently_logging) < 0)
+       || (is_enabled != TRUE)
+       || (is_currently_logging != TRUE))
+        TEST_ERROR;
+
+    /* Perform some manipulations */
+    for(i = 0; i < N_GROUPS; i++) {
+        HDmemset(group_name, 0, 8);
+        HDsnprintf(group_name, 8, "%d", i);
+        if((gid = H5Gcreate2(fid, group_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            TEST_ERROR;
+        if(H5Gclose(gid) < 0)
+            TEST_ERROR;
+    }
+
+    /* Turn off logging and check flags */
+    if(H5Fstop_mdc_logging(fid) < 0)
+        TEST_ERROR;
+    is_enabled = FALSE;
+    is_currently_logging = TRUE;
+    if((H5Fget_mdc_logging_status(fid, &is_enabled, &is_currently_logging) < 0)
+       || (is_enabled != TRUE)
+       || (is_currently_logging != FALSE))
+        TEST_ERROR;
+
+    /* Clean up */
+    if(H5Fclose(fid) < 0)
+        TEST_ERROR;
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+ } /* test_logging_api() */
+
+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Purpose:     Test basic cache logging operations
+ *
+ * Return:      Success:        zero
+ *              Failure:        non-zero
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(void)
+{
+    int nerrors = 0;
+
+    /* Reset library */
+    h5_reset();
+
+    printf("Testing basic metadata cache logging functionality.\n");
+
+    nerrors += test_logging_api();
+
+    if(nerrors) {
+        printf("***** %d Metadata cache logging TEST%s FAILED! *****\n",
+               nerrors, nerrors > 1 ? "S" : "");
+        return 1;
+    }
+
+    printf("All Metadata Cache Logging tests passed.\n");
+    return 0;
+}
+
diff --git a/test/cache_tagging.c b/test/cache_tagging.c
new file mode 100644
index 0000000..470f7a1
--- /dev/null
+++ b/test/cache_tagging.c
@@ -0,0 +1,4017 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Mike McGreevy
+ *              January 25, 2010
+ *
+ *              This file contains tests for metadata tagging.
+ */
+#include "hdf5.h"
+#include "testhdf5.h"
+#include "h5test.h"
+#include "H5Iprivate.h"
+#include "H5ACprivate.h"
+#include "H5ACpublic.h"
+#include "cache_common.h"
+#include "H5HLprivate.h"
+
+/* ============ */
+/* Test Defines */
+/* ============ */
+
+#define FILENAME "tagging_test.h5"
+#define FILENAME2 "tagging_ext_test.h5"
+#define GROUPNAME "Group"
+#define GROUPNAMEPATH "/Group"
+#define GROUPNAMECOPY "GroupCopy"
+#define ATTRNAME "Attribute 1"
+#define ATTRNAME3 "Attribute 3"
+#define DATASETNAME "Dataset"
+#define DATASETNAME2 "Dataset2"
+#define LINKNAME "Link"
+#define RANK 2
+#define DIMS 32
+
+#define MULTIGROUPS 10
+
+#define TEST_DEFAULT 0
+#define TEST_SHMESG 1
+#define NUM_TEST_TYPES 2
+    
+/* ===================== */
+/* Function Declarations */
+/* ===================== */
+
+/* Helper Functions */
+static void print_entry_type_to_screen(int id);
+static int print_index(hid_t fid);
+static int verify_no_unknown_tags(hid_t fid);
+static int mark_all_entries_investigated(hid_t fid);
+static int verify_tag(hid_t fid, int id, haddr_t tag);
+static int get_new_object_header_tag(hid_t fid, haddr_t *tag);
+/* Tests */
+static unsigned check_file_creation_tags(hid_t fcpl_id, int type);
+static unsigned check_file_open_tags(hid_t fcpl, int type);
+static unsigned check_group_creation_tags(hid_t fcpl, int type);
+static unsigned check_multi_group_creation_tags(hid_t fcpl, int type);
+static unsigned check_group_open_tags(hid_t fcpl, int type);
+static unsigned check_attribute_creation_tags(hid_t fcpl, int type);
+static unsigned check_attribute_open_tags(hid_t fcpl, int type);
+static unsigned check_attribute_write_tags(hid_t fcpl, int type);
+static unsigned check_attribute_delete_tags(hid_t fcpl, int type);
+static unsigned check_attribute_rename_tags(hid_t fcpl, int type);
+static unsigned check_dataset_creation_tags(hid_t fcpl, int type);
+static unsigned check_dataset_creation_earlyalloc_tags(hid_t fcpl, int type);
+static unsigned check_dataset_open_tags(hid_t fcpl, int type);
+static unsigned check_dataset_write_tags(hid_t fcpl, int type);
+static unsigned check_dataset_read_tags(hid_t fcpl, int type);
+static unsigned check_dataset_size_retrieval(hid_t fcpl, int type);
+static unsigned check_dataset_extend_tags(hid_t fcpl, int type);
+static unsigned check_object_info_tags(hid_t fcpl, int type);
+static unsigned check_link_removal_tags(hid_t fcpl, int type);
+static unsigned check_link_getname_tags(hid_t fcpl, int type);
+static unsigned check_external_link_creation_tags(hid_t fcpl, int type);
+static unsigned check_external_link_open_tags(hid_t fcpl, int type);
+static unsigned check_object_copy_tags(hid_t fcpl, int type);
+
+static unsigned check_dense_attribute_tags(void);
+static unsigned check_link_iteration_tags(void);
+static unsigned check_invalid_tag_application(void);
+
+
+/* ================ */
+/* Helper Functions */
+/* ================ */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    print_entry_type_to_screen
+ *
+ * Purpose:     DEBUG CODE (for when verbose is set).
+ *
+ *              Prints type of entry to stdout.
+ *
+ * Return:      void
+ *
+ * Programmer:  Mike McGreevy
+ *              September 3, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+print_entry_type_to_screen(int id)
+{
+    HDfprintf(stdout, "Type = ");
+    
+    switch (id) {
+    
+        case H5AC_BT_ID:
+            HDfprintf(stdout, "v1 B-tree Node");
+            break;
+        case H5AC_SNODE_ID: 
+            HDfprintf(stdout, "Symbol Table Node");
+            break;
+        case H5AC_LHEAP_PRFX_ID:
+            HDfprintf(stdout, "Local Heap Prefix");
+            break;
+        case H5AC_LHEAP_DBLK_ID:
+            HDfprintf(stdout, "Local Heap Data Block");
+            break;
+        case H5AC_GHEAP_ID:
+            HDfprintf(stdout, "Global Heap");
+            break;
+        case H5AC_OHDR_ID:
+            HDfprintf(stdout, "Object Header");
+            break;
+        case H5AC_OHDR_CHK_ID:
+            HDfprintf(stdout, "Object Header Chunk");
+            break;
+        case H5AC_BT2_HDR_ID:
+            HDfprintf(stdout, "v2 B-tree Header");
+            break;
+        case H5AC_BT2_INT_ID:
+            HDfprintf(stdout, "v2 B-tree Internal Node");
+            break;
+        case H5AC_BT2_LEAF_ID:
+            HDfprintf(stdout, "v2 B-tree Leaf Node");
+            break;
+        case H5AC_FHEAP_HDR_ID:
+            HDfprintf(stdout, "Fractal Heap Header");
+            break;
+        case H5AC_FHEAP_DBLOCK_ID:
+            HDfprintf(stdout, "Fractal Heap Direct Block");
+            break;
+        case H5AC_FHEAP_IBLOCK_ID:
+            HDfprintf(stdout, "Fractal Heap Indirect Block");
+            break;
+        case H5AC_FSPACE_HDR_ID:
+            HDfprintf(stdout, "Free Space Header");
+            break;
+        case H5AC_FSPACE_SINFO_ID:
+            HDfprintf(stdout, "Free Space Section");
+            break;
+        case H5AC_SOHM_TABLE_ID:
+            HDfprintf(stdout, "Shared Object Header Message Master Table");
+            break;
+        case H5AC_SOHM_LIST_ID:
+            HDfprintf(stdout, "Shared Message Index Stored As A List");
+            break;
+        case H5AC_EARRAY_HDR_ID:
+            HDfprintf(stdout, "Extensible Array Header");
+            break;
+        case H5AC_EARRAY_IBLOCK_ID:
+            HDfprintf(stdout, "Extensible Array Index Block");
+            break;
+        case H5AC_EARRAY_SBLOCK_ID:
+            HDfprintf(stdout, "Extensible Array Super Block");
+            break;
+        case H5AC_EARRAY_DBLOCK_ID:
+            HDfprintf(stdout, "Extensible Array Data Block");
+            break;
+        case H5AC_EARRAY_DBLK_PAGE_ID:
+            HDfprintf(stdout, "Extensible Array Data Block Page");
+            break;
+        case H5AC_FARRAY_HDR_ID:
+            HDfprintf(stdout, "Fixed Array Header");
+            break;
+        case H5AC_FARRAY_DBLOCK_ID:
+            HDfprintf(stdout, "Fixed Array Data Block");
+            break;
+        case H5AC_FARRAY_DBLK_PAGE_ID:
+            HDfprintf(stdout, "Fixed Array Data Block Page");
+            break;
+        case H5AC_SUPERBLOCK_ID:
+            HDfprintf(stdout, "File Superblock");
+            break;
+        case H5AC_DRVRINFO_ID:
+            HDfprintf(stdout, "Driver Info Block");
+            break;
+        case H5AC_TEST_ID:
+            HDfprintf(stdout, "Test Entry");
+            break;
+        case H5AC_NTYPES:
+            HDfprintf(stdout, "BADNESS: Number of Types");
+            break;
+        default:
+            HDfprintf(stdout, "BADNESS: *Unknown*");
+            break;
+
+    } /* end switch */
+
+    HDfprintf(stdout, " (%d)", id);
+
+} /* print_entry_type_to_screen */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    print_index()
+ *
+ * Purpose:     DEBUG CODE (for when verbose is set).
+ *
+ *              Prints cache index to screen, including address of entries,
+ *              tag values of entries, and entry types.
+ *
+ * Return:      void
+ *
+ * Programmer:  Mike McGreevy
+ *              January 25, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static int print_index(hid_t fid) {
+
+    H5F_t * f = NULL;         /* File Pointer */
+    H5C_t * cache_ptr = NULL; /* Cache Pointer */
+    int i = 0; /* Iterator */
+    H5C_cache_entry_t *next_entry_ptr = NULL; /* entry pointer */
+
+    /* Get Internal File / Cache Pointers */
+    if ( NULL == (f = (H5F_t *)H5I_object(fid)) ) TEST_ERROR;
+    cache_ptr = f->shared->cache;
+
+    /* Initial (debugging) loop */
+    printf("CACHE SNAPSHOT:\n");
+    for (i = 0; i < H5C__HASH_TABLE_LEN; i++) {
+        next_entry_ptr = cache_ptr->index[i];
+
+        while (next_entry_ptr != NULL) {
+            printf("Addr = %u, ", (unsigned int)next_entry_ptr->addr);
+            printf("Tag = %u, ", (unsigned int)next_entry_ptr->tag);
+            printf("Dirty = %d, ", (int)next_entry_ptr->is_dirty);
+            printf("Protected = %d, ", (int)next_entry_ptr->is_protected);
+            print_entry_type_to_screen(next_entry_ptr->type->id);
+            printf("\n");
+            next_entry_ptr = next_entry_ptr->ht_next;
+        } /* end if */
+
+    } /* end for */
+    printf("\n");
+
+    return 0;
+    
+error:
+
+    return -1;
+
+} /* print_index */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    verify_no_unknown_tags()
+ *
+ * Purpose:     Verifies that all tags in the provided cache are set to the
+ *              H5AC__IGNORE_TAG. Other verification functions in this test
+ *              file set entry tag values to ignore after checking them, so 
+ *              this is handy to verify that tests have checked all entries
+ *              in the cache.
+ *
+ * Return:      0 on Success, -1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              January 25, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int verify_no_unknown_tags(hid_t fid)
+{
+
+    H5F_t * f = NULL;         /* File Pointer */
+    H5C_t * cache_ptr = NULL; /* Cache Pointer */
+    int i = 0; /* Iterator */
+    H5C_cache_entry_t *next_entry_ptr = NULL; /* entry pointer */
+
+    /* Get Internal File / Cache Pointers */
+    if ( NULL == (f = (H5F_t *)H5I_object(fid)) ) TEST_ERROR;
+    cache_ptr = f->shared->cache;
+
+    for (i = 0; i < H5C__HASH_TABLE_LEN; i++) {
+
+        next_entry_ptr = cache_ptr->index[i];
+
+        while (next_entry_ptr != NULL) {
+
+            if ( next_entry_ptr->tag != H5AC__IGNORE_TAG ) TEST_ERROR;
+
+            next_entry_ptr = next_entry_ptr->ht_next;
+
+        } /* end if */
+
+    } /* for */
+
+    return 0;
+
+error:
+    return -1;
+} /* verify_no_unknown_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    mark_all_entries_investigated()
+ *
+ * Purpose:     Marks all entries in the cache with the tag H5AC__IGNORE_TAG,
+ *              which is a convention in this test file that indicates that
+ *              a tag has been checked and is valid. This may come in handy
+ *              for tests that have a lot of setup that has been checked
+ *              for correctness elsewhere, so should save time in not having
+ *              to check the same sort of tag application in many places.
+ *
+ * Return:      0 on Success, -1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              February 3, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int mark_all_entries_investigated(hid_t fid)
+{
+
+    H5F_t * f = NULL;         /* File Pointer */
+    H5C_t * cache_ptr = NULL; /* Cache Pointer */
+    int i = 0; /* Iterator */
+    H5C_cache_entry_t *next_entry_ptr = NULL; /* entry pointer */
+
+    /* Get Internal File / Cache Pointers */
+    if ( NULL == (f = (H5F_t *)H5I_object(fid)) ) TEST_ERROR;
+    cache_ptr = f->shared->cache;
+
+    for (i = 0; i < H5C__HASH_TABLE_LEN; i++) {
+
+        next_entry_ptr = cache_ptr->index[i];
+
+        while (next_entry_ptr != NULL) {
+
+            if ( next_entry_ptr->tag != H5AC__IGNORE_TAG ) {
+
+                    next_entry_ptr->tag = H5AC__IGNORE_TAG;
+
+            } /* end if */
+
+            next_entry_ptr = next_entry_ptr->ht_next;
+
+        } /* end if */
+
+    } /* for */
+
+    return 0;
+
+error:
+    return -1;
+
+} /* mark_all_entries_investigated */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    verify_tag()
+ *
+ * Purpose:     Asserts that there is an entry in the specified cache with
+ *              the provided entry id and provided tag. The function will
+ *              fail if this is not the case. If found, this function will 
+ *              set the entry's tag value to ignore, so future verification 
+ *              attemps can skip over this entry, knowing it has already been 
+ *              checked.
+ *
+ * Return:      0 on Success, -1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              January 25, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int verify_tag(hid_t fid, int id, haddr_t tag)
+{
+    int i = 0;                           /* Iterator */
+    int found = FALSE;                   /* If Entry Found */
+    H5F_t * f = NULL;         /* File Pointer */
+    H5C_t * cache_ptr = NULL; /* Cache Pointer */
+    H5C_cache_entry_t *next_entry_ptr = NULL; /* entry pointer */
+
+    /* Get Internal File / Cache Pointers */
+    if ( NULL == (f = (H5F_t *)H5I_object(fid)) ) TEST_ERROR;
+    cache_ptr = f->shared->cache;
+
+    for (i = 0; i < H5C__HASH_TABLE_LEN; i++) {
+
+        next_entry_ptr = cache_ptr->index[i];
+
+        while (next_entry_ptr != NULL) {
+
+            if ( (next_entry_ptr->type->id == id) && (next_entry_ptr->tag != H5AC__IGNORE_TAG) ) {
+                
+                if (!found) {
+
+                    if (next_entry_ptr->tag != tag) TEST_ERROR;
+
+                    /* note that we've found the entry */
+                    found = TRUE;
+
+                    /* Ignore this tag now that we've verified it was initially tagged correctly. */
+                    next_entry_ptr->tag = H5AC__IGNORE_TAG;
+
+                }
+    
+            } /* end if */
+
+            next_entry_ptr = next_entry_ptr->ht_next;
+
+        } /* end if */
+
+    } /* for */
+
+    if (found == FALSE) 
+        TEST_ERROR;
+    
+    return 0;
+
+error:
+    return -1;
+} /* verify_tag */
+
+static int evict_entries(hid_t fid)
+{
+
+    H5F_t * f = NULL;         /* File Pointer */
+
+    /* Get Internal File / Cache Pointers */
+    if ( NULL == (f = (H5F_t *)H5I_object(fid)) ) TEST_ERROR;
+
+    /* Mark all entries investigated */
+    mark_all_entries_investigated(fid);
+
+    /* Evict all we can from the cache to examine full tag creation tree */
+        /* This function will likely return failure since the root group
+         * is still protected. Thus, don't check its return value. */
+    H5C_flush_cache(f, H5P_DEFAULT, H5C__FLUSH_INVALIDATE_FLAG);
+
+    return 0;
+
+error:
+
+    return -1;
+
+} /* evict entries */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    get_new_object_header_tag()
+ *
+ * Purpose:     This function retrieves the tag associated with the latest
+ *              uninvestigated object header it finds in the provided cache
+ *              and returns it in *tag. It sets the object header's entry
+ *              tag value to ignore, so future searches won't find it.
+ *
+ * Return:      0 on Success; 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              January 25, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int get_new_object_header_tag(hid_t fid, haddr_t *tag)
+{
+    H5F_t * f = NULL;         /* File Pointer */
+    H5C_t * cache_ptr = NULL; /* Cache Pointer */
+    int i = 0;                              /* Iterator */
+    H5C_cache_entry_t * next_entry_ptr = NULL;   /* Entry Pointer */
+    int found = FALSE;                      /* If entry is found */
+
+    /* Get Internal File / Cache Pointers */
+    if ( NULL == (f = (H5F_t *)H5I_object(fid)) ) TEST_ERROR;
+    cache_ptr = f->shared->cache;
+
+    for (i = 0; i < H5C__HASH_TABLE_LEN; i++) {
+        
+        next_entry_ptr = cache_ptr->index[i];
+
+        while (next_entry_ptr != NULL) {
+
+            if ( (next_entry_ptr->tag != H5AC__IGNORE_TAG) && (next_entry_ptr->type->id == H5AC_OHDR_ID) ) {
+
+                *tag = next_entry_ptr->tag;
+                next_entry_ptr->tag = H5AC__IGNORE_TAG;
+                found = TRUE;
+                break;
+
+            } /* end if */
+
+            next_entry_ptr = next_entry_ptr->ht_next;
+
+        } /* end if */
+
+        if (found) break;
+
+    } /* end for */
+
+    if (found == FALSE) TEST_ERROR;
+    
+    return 0;
+
+error:
+    return -1;
+} /* get_new_object_header_tag */
+
+/* ============== */
+/* Test Functions */
+/* ============== */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_file_creation_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during file creation.
+ *
+ * Return:      0 on Success; 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              January 25, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_file_creation_tags(hid_t fcpl_id, int type)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;             /* File Identifier */
+    int verbose = FALSE;        /* verbose test outout */
+    haddr_t root_tag = 0;
+    haddr_t sbe_tag = 0;
+
+    /* Testing Macro */
+    TESTING("tag application during file creation");
+
+    /* Create a test file with provided fcpl_t */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* if verbose, print cache index to screen before verification . */
+    if ( verbose ) print_index(fid);
+
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+
+        /* determine tag value of superblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+        /* verify object header chunk belonging to superblock extension */
+        if ( verify_tag(fid, H5AC_OHDR_CHK_ID, sbe_tag) < 0 ) TEST_ERROR;
+
+        /* verify sohm master table with sohm tag */
+        if ( verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+
+    }  /* end if */
+
+    /* verify there is a superblock entry with superblock tag */
+    if ( verify_tag(fid, H5AC_SUPERBLOCK_ID, H5AC__SUPERBLOCK_TAG) < 0 ) TEST_ERROR;
+
+    /* verify local heap prefix belonging to root group */
+    if ( verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0 ) TEST_ERROR;
+
+    /* verify b-tree node belonging to root group */
+    if ( verify_tag(fid, H5AC_BT_ID, root_tag) < 0 ) TEST_ERROR;
+
+    /* verify no other cache entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* Close the file */
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+
+} /* check_file_creation_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_file_open_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during file open.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              January 25, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_file_open_tags(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;          /* File Identifier */
+    int verbose = FALSE;     /* verbose file outout */
+    haddr_t root_tag;       /* Root Group Tag */
+    haddr_t sbe_tag;        /* Sblock Extension Tag */
+
+    /* Testing Macro */
+    TESTING("tag application during file open");
+
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    /* Create a test file with provided fcpl_t */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+    
+    /* Close the file */
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* =================== */
+    /* TEST: Open The File */
+    /* =================== */
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen before verification . */
+    if ( verbose ) print_index(fid);
+
+    /* verify there is a superblock entry with superblock tag. */
+    if ( verify_tag(fid, H5AC_SUPERBLOCK_ID, H5AC__SUPERBLOCK_TAG) < 0 ) TEST_ERROR;
+
+    /* Verify test-type-dependent tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* verify there is an object header belonging to the root group. */
+        if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+
+        /* verify there is a superblock extension object header. */
+        if ( verify_tag(fid, H5AC_OHDR_ID, sbe_tag) < 0 ) TEST_ERROR;
+
+        /* verify sohm master table with sohm tag */
+        if ( verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+
+        /* verify object header chunk belonging to superblock extension */
+        if ( verify_tag(fid, H5AC_OHDR_CHK_ID, sbe_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* ========== */
+    /* Close file */
+    /* ========== */
+
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_file_open_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_group_creation_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during group creation.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              January 27, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_group_creation_tags(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;          /* File Identifier */
+    hid_t gid = -1;          /* Group Identifier */
+    int verbose = FALSE;     /* verbose file outout */
+    haddr_t root_tag = HADDR_UNDEF;   /* Root Group Tag */
+    haddr_t g_tag;          /* Group Tag */
+    haddr_t sbe_tag;        /* Sblock Extension Tag */
+
+    /* Testing Macro */
+    TESTING("tag application during group creation");
+    
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    /* Create a test file with provided fcpl_t */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Close and Reopen the file */
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* ==================== */
+    /* TEST: Create a Group */
+    /* ==================== */
+
+    if ( (gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+ 
+    /* Verify root group's tagged metadata */
+    if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT_ID, root_tag) < 0 ) TEST_ERROR;
+
+    /* Verify new group's tagged metadata */
+    if ( get_new_object_header_tag(fid, &g_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT_ID, g_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_LHEAP_PRFX_ID, g_tag) < 0 ) TEST_ERROR;
+
+    /* verify no other cache entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Gclose(gid) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_group_creation_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_multi_group_creation_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during multiple group creation.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              March 2, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_multi_group_creation_tags(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;          /* File Identifier */
+    hid_t gid = -1;          /* Group Identifier */
+    int verbose = FALSE;     /* verbose file outout */
+    char gname[10];          /* group name buffer */
+    int i = 0;               /* iterator */
+    hid_t fapl = -1;         /* File access prop list */
+    haddr_t g_tag = 0;      /* Group tag value */
+    haddr_t root_tag = 0;   /* Root group tag value */
+    haddr_t sbe_tag = 0;   /* Root group tag value */
+
+    /* Testing Macro */
+    TESTING("tag application during multiple group creation");
+
+    /* Create Fapl */
+    if ( (fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0 ) TEST_ERROR;
+
+    /* Set latest version of library */
+    if ( H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0 ) TEST_ERROR;
+
+    /* =========== */
+    /* Create File */
+    /* =========== */
+
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Clear Metadata Tags (don't care about them for this test */
+    mark_all_entries_investigated(fid);
+
+    /* ============ */
+    /* Create Group */
+    /* ============ */
+
+    for (i = 0; i < MULTIGROUPS; i++) {
+
+        sprintf(gname, "%d", i);
+        if ( (gid = H5Gcreate2(fid, gname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+        if ( H5Gclose(gid) < 0 ) TEST_ERROR;
+
+    } /* end for */
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+
+    /* Verify there is an object header for each group */
+    for (i = 0; i < MULTIGROUPS; i++) {
+
+        if ( get_new_object_header_tag(fid, &g_tag) < 0 ) TEST_ERROR;
+
+    } /* end for */
+
+    /* Verify free space header and section info */
+    if ( verify_tag(fid, H5AC_FSPACE_SINFO_ID, H5AC__FREESPACE_TAG) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_FSPACE_HDR_ID, H5AC__FREESPACE_TAG) < 0 ) TEST_ERROR;
+
+    /* verify fractal heap header belonging to root group */
+    if ( verify_tag(fid, H5AC_FHEAP_HDR_ID, root_tag) < 0 ) TEST_ERROR;
+
+    /* verify fractal heap direct block belonging to root group */
+    if ( verify_tag(fid, H5AC_FHEAP_DBLOCK_ID, root_tag) < 0 ) TEST_ERROR;
+
+    /* verify btree header and leaf node belonging to root group */
+    if ( verify_tag(fid, H5AC_BT2_HDR_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT2_LEAF_ID, root_tag) < 0 ) TEST_ERROR;
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_multi_group_creation_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_link_iteration_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during iteration over links in a group.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              March 2, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_link_iteration_tags(void)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;          /* File Identifier */
+    hid_t sid = -1;          /* Group Identifier */
+    hid_t did = -1;          /* Group Identifier */
+    int verbose = FALSE;     /* verbose file outout */
+    int i = 0;               /* iterator */
+    haddr_t root_tag = 0;   /* Root Group Tag Value */
+    char dsetname[500];      /* Name of dataset */
+    H5G_info_t ginfo;        /* Group Info Struct */
+    hid_t root_group = -1;   /* Root Group Identifier */
+
+    /* Testing Macro */
+    TESTING("tag application during iteration over links in a group");
+
+    /* =========== */
+    /* Create File */
+    /* =========== */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Get root group tag */
+    if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    /* Create dataspace */
+    if ( (sid = H5Screate(H5S_SCALAR)) < 0 ) TEST_ERROR;
+
+    /* Create many datasets in root group */
+    for (i=0;i<500;i++) {
+
+        sprintf(dsetname, "Dset %d", i);
+        if ( (did = H5Dcreate2(fid, dsetname, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+        if ( H5Dclose(did) < 0 ) TEST_ERROR;
+    }
+
+    /* Close and Reopen the file (to clear cache) */
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* determine tag value of root group's object header */
+    if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    /* clear remaining metadata tags */
+    mark_all_entries_investigated(fid);
+
+    /* ================================ */
+    /* Iterate over links in root group */
+    /* ================================ */
+
+    /* Open root group */
+    if ( (root_group = H5Gopen2(fid, "/", H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Get root group info (will iterate over all links in group) */
+    if ( H5Gget_info(root_group, &ginfo) < 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+
+    /* Verify 112 symbol table nodes belonging to the root group */
+    for (i = 0; i < 112; i++) {
+        if ( verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0 ) TEST_ERROR;
+    }
+
+    /* Verify 9 b-tree nodes belonging to the root group */
+    for (i = 0; i < 9; i++) {
+        if ( verify_tag(fid, H5AC_BT_ID, root_tag) < 0 ) TEST_ERROR;
+    }
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Sclose(sid) < 0 ) TEST_ERROR;
+    if ( H5Gclose(root_group) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_link_iteration_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_dense_attribute_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during various dense attribute manipulations.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              March 2, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_dense_attribute_tags(void)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;          /* File Identifier */
+    hid_t aid = -1;          /* File Identifier */
+    hid_t sid = -1;          /* Group Identifier */
+    hid_t did = -1;          /* Group Identifier */
+    hid_t dcpl = -1;         /* Group Identifier */
+    int verbose = FALSE;     /* verbose file outout */
+    int i = 0;               /* iterator */
+    hid_t fapl = -1;         /* File access property list */
+    haddr_t d_tag = 0;      /* Dataset tag value */
+    haddr_t root_tag = 0;   /* Root group tag value */
+    char attrname[500];      /* Name of attribute */
+
+    /* Testing Macro */
+    TESTING("tag application during dense attribute manipulation");
+
+    /* Create Fapl */
+    if ( (fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0 ) TEST_ERROR;
+    if ( H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0 ) TEST_ERROR;
+
+    /* Create Dcpl */
+    if ( (dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0 ) TEST_ERROR;
+
+    /* =========== */
+    /* Create File */
+    /* =========== */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0 ) TEST_ERROR;
+
+    /* Get root group tag */
+    if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    /* Create dataspace */
+    if ( (sid = H5Screate(H5S_SCALAR)) < 0 ) TEST_ERROR;
+
+    /* Create dataset */
+    if ( (did = H5Dcreate2(fid, DATASETNAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if ( H5Pclose(dcpl) < 0 ) TEST_ERROR;
+    
+    /* get dataset object header */
+    if ( get_new_object_header_tag(fid, &d_tag) < 0 ) TEST_ERROR;
+    
+    /* Clear Metadata Tags (don't care about them for this test */
+    mark_all_entries_investigated(fid);
+
+    /* ================================================ */
+    /* Create Many attributes, triggering dense storage */
+    /* ================================================ */
+
+    for (i=0;i<50;i++) {
+
+        sprintf(attrname, "attr %d", i);
+        if ( (aid = H5Acreate2(did, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+        if ( H5Awrite(aid, H5T_NATIVE_UINT, &i) < 0 ) TEST_ERROR;
+        if ( H5Aclose(aid) < 0 ) TEST_ERROR;
+
+    } /* end for */
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+
+    /* Verify free space header and section info */
+    if ( verify_tag(fid, H5AC_FSPACE_SINFO_ID, H5AC__FREESPACE_TAG) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_FSPACE_HDR_ID, H5AC__FREESPACE_TAG) < 0 ) TEST_ERROR;
+
+    /* verify fractal heap header belonging to dataset */
+    if ( verify_tag(fid, H5AC_FHEAP_HDR_ID, d_tag) < 0 ) TEST_ERROR;
+
+    /* verify fractal heap direct block belonging to root group */
+    if ( verify_tag(fid, H5AC_FHEAP_DBLOCK_ID, d_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_FHEAP_DBLOCK_ID, d_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_FHEAP_IBLOCK_ID, d_tag) < 0 ) TEST_ERROR;
+
+    /* verify btree header and leaf node belonging to dataset */
+    if ( verify_tag(fid, H5AC_BT2_HDR_ID, d_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT2_LEAF_ID, d_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT2_LEAF_ID, d_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT2_INT_ID, d_tag) < 0 ) TEST_ERROR;
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Dclose(did) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ======================= */
+    /* Reopen file and dataset */
+    /* ======================= */
+
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if ( (did = H5Dopen2(fid, DATASETNAME, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Clear Metadata Tags (don't care about them for this test */
+    mark_all_entries_investigated(fid);
+
+    /* ======================= */
+    /* Open attribute by index */
+    /* ======================= */
+
+    if ( (aid = H5Aopen_by_idx(did, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)4, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+
+    /* verify fractal heap header belonging to dataset */
+    if ( verify_tag(fid, H5AC_FHEAP_HDR_ID, d_tag) < 0 ) TEST_ERROR;
+
+    /* verify fractal heap direct block belonging to root group */
+    if ( verify_tag(fid, H5AC_FHEAP_DBLOCK_ID, d_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_FHEAP_DBLOCK_ID, d_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_FHEAP_IBLOCK_ID, d_tag) < 0 ) TEST_ERROR;
+
+    /* verify btree header and leaf node belonging to dataset */
+    if ( verify_tag(fid, H5AC_BT2_HDR_ID, d_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT2_LEAF_ID, d_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT2_LEAF_ID, d_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT2_INT_ID, d_tag) < 0 ) TEST_ERROR;
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Aclose(aid) < 0 ) TEST_ERROR;
+    if ( H5Dclose(did) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_dense_attribute_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_group_open_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during group open.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              January 27, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_group_open_tags(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;          /* File Identifier */
+    hid_t gid = -1;          /* Group Identifier */
+    int verbose = FALSE;     /* verbose file output */
+    haddr_t root_tag = HADDR_UNDEF;
+    haddr_t sbe_tag;
+    haddr_t g_tag;
+
+    /* Testing Macro */
+    TESTING("tag application during group open");
+ 
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    /* Create a test file with provided fcpl_t */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Create group */
+    if ( (gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve group tag */
+    if ( get_new_object_header_tag(fid, &g_tag) < 0 ) TEST_ERROR;
+
+    /* Close Group */
+    if (H5Gclose(gid) < 0) TEST_ERROR;
+
+    /* Close and Reopen the file */
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* ================ */
+    /* TEST: Open Group */
+    /* ================ */
+
+    if ( (gid = H5Gopen2(fid, GROUPNAME, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+
+    /* Verify root group metadata */
+    if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT_ID, root_tag) < 0 ) TEST_ERROR;
+
+    /* Verify opened group metadata */
+    if ( verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0 ) TEST_ERROR;
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Gclose(gid) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_group_open_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_attribute_creation_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during attribute creation.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              February 24, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_attribute_creation_tags(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;          /* File Identifier */
+    hid_t aid = -1;          /* Attribute Identifier */
+    hid_t gid = -1;          /* Group Identifier */
+    hid_t sid = -1;          /* Dataspace Identifier */
+    int verbose = FALSE;     /* verbose file outout */
+    haddr_t root_tag = 0;   /* Root group tag */
+    haddr_t sbe_tag = 0;
+    haddr_t g_tag = 0;
+    hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
+
+    /* Testing Macro */
+    TESTING("tag application during attribute creation");
+
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    /* Create a test file with provided fcpl_t */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Create group */
+    if ( (gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve group tag */
+    if ( get_new_object_header_tag(fid, &g_tag) < 0 ) TEST_ERROR;
+
+    /* Close and Reopen the file and group */
+    if ( H5Gclose(gid) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if ( (gid = H5Gopen2(fid, GROUPNAME, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* ========================= */
+    /* Create Attribute on Group */
+    /* ========================= */
+
+    if ( (sid = H5Screate_simple(2, dims1, maxdims)) < 0 ) TEST_ERROR;
+
+    if ( (aid = H5Acreate2(gid, ATTRNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+
+    /* verify object header belonging to group */
+    if ( verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0 ) TEST_ERROR;
+
+    /* verify object header chunk belonging to group */
+    if ( verify_tag(fid, H5AC_OHDR_CHK_ID, g_tag) < 0 ) TEST_ERROR;
+
+    if ( type == TEST_SHMESG ) {
+
+        /* verify (another) object header chunk belonging to group */
+        if ( verify_tag(fid, H5AC_OHDR_CHK_ID, g_tag) < 0 ) TEST_ERROR;
+
+        /* verify shared message index tagged with sohm */
+        if ( verify_tag(fid, H5AC_SOHM_LIST_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+        if ( verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+        
+        /* verify fractal heap header belonging to group */
+        if ( verify_tag(fid, H5AC_FHEAP_HDR_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+
+        /* verify fractal heap direct block belonging to group */
+        if ( verify_tag(fid, H5AC_FHEAP_DBLOCK_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+
+        /* Verify free space header and free space section */
+        if ( verify_tag(fid, H5AC_FSPACE_HDR_ID, H5AC__FREESPACE_TAG) < 0 ) TEST_ERROR;
+        if ( verify_tag(fid, H5AC_FSPACE_SINFO_ID, H5AC__FREESPACE_TAG) < 0 ) TEST_ERROR;
+
+        /* verify btree header and leaf node belonging to group */
+        if ( verify_tag(fid, H5AC_BT2_HDR_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+        if ( verify_tag(fid, H5AC_BT2_LEAF_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+    
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Aclose(aid) < 0 ) TEST_ERROR;
+    if ( H5Gclose(gid) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_attribute_creation_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_attribute_open_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during attribute open.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              February 24, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_attribute_open_tags(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;          /* File Identifier */
+    hid_t aid = -1;          /* Attribute Identifier */
+    hid_t gid = -1;          /* Group Identifier */
+    hid_t sid = -1;          /* Dataspace Identifier */
+    int verbose = FALSE;     /* verbose file outout */
+    haddr_t root_tag = 0;
+    haddr_t sbe_tag = 0;
+    haddr_t g_tag = 0;
+    hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
+
+    /* Testing Macro */
+    TESTING("tag application during attribute open");
+
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    /* Create a test file with provided fcpl_t */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Create group */
+    if ( (gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve group tag */
+    if ( get_new_object_header_tag(fid, &g_tag) < 0 ) TEST_ERROR;
+
+    /* Create attribute dataspace */
+    if ( (sid = H5Screate_simple(2, dims1, maxdims)) < 0 ) TEST_ERROR;
+
+    /* Create attribute on group */
+    if ( (aid = H5Acreate2(gid, ATTRNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Close attribute */
+    if ( H5Aclose(aid) < 0 ) TEST_ERROR;
+
+    /* Close and Reopen the file and group */
+    if ( H5Gclose(gid) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if ( (gid = H5Gopen2(fid, GROUPNAME, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* ========================= */
+    /* Open Attribute of Group */
+    /* ========================= */
+
+    if ( (aid = H5Aopen(gid, ATTRNAME, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+
+    /* verify object header belonging to group */
+    if ( verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0 ) TEST_ERROR;
+
+    /* verify object header chunk belonging to group */
+    if ( verify_tag(fid, H5AC_OHDR_CHK_ID, g_tag) < 0 ) TEST_ERROR;
+   
+    if ( type == TEST_SHMESG ) {
+
+        /* verify (another) object header chunk belonging to group */
+        if ( verify_tag(fid, H5AC_OHDR_CHK_ID, g_tag) < 0 ) TEST_ERROR;
+
+        /* verify shared header message master table */
+        if ( verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+
+        /* verify fractal heap header belonging to group */
+        if ( verify_tag(fid, H5AC_FHEAP_HDR_ID, g_tag) < 0 ) TEST_ERROR;
+
+        /* verify fractal heap direct block belonging to group */
+        if ( verify_tag(fid, H5AC_FHEAP_DBLOCK_ID, g_tag) < 0 ) TEST_ERROR;
+
+        /* verify btree header and leaf node belonging to group */
+        if ( verify_tag(fid, H5AC_BT2_HDR_ID, g_tag) < 0 ) TEST_ERROR;
+        if ( verify_tag(fid, H5AC_BT2_LEAF_ID, g_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Aclose(aid) < 0 ) TEST_ERROR;
+    if ( H5Gclose(gid) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_attribute_open_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_attribute_rename_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during attribute renaming.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              March 3, 2010
+ *
+ * Modifications:
+ *	Vailin Choi; July 2012
+ *	Add verify_tag() calls because H5FD_FLMAP_DICHOTOMY is now the default free-list mapping.
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_attribute_rename_tags(hid_t fcpl, int type)
+{
+    /* Variable declarations */
+    hid_t fid = -1;                         /* File Identifier */
+    hid_t gid = -1;                         /* Group Identifier */
+    hid_t aid = -1;                         /* Attribute Identifier */
+    hid_t sid = -1;                         /* Dataset Identifier */
+    int verbose = FALSE;                    /* verbose file outout */
+    int data[DIMS][DIMS];                   /* data buffer */
+    int i,j,k = 0;                           /* iterators */
+    haddr_t root_tag = 0;
+    haddr_t sbe_tag = 0;
+    haddr_t g_tag = 0;
+    hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
+
+    /* Testing Macro */
+    TESTING("tag application during attribute renaming");
+
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    /* Create a test file with provided fcpl_t */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Create group */
+    if ( (gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve group tag */
+    if ( get_new_object_header_tag(fid, &g_tag) < 0 ) TEST_ERROR;
+
+    /* Set up attribute dataspace */
+    if ( (sid = H5Screate_simple(2, dims1, maxdims)) < 0 ) TEST_ERROR;
+
+    /* Create attribute */
+    if ( (aid = H5Acreate2(gid, ATTRNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+ 
+    /* fill out data buffer */
+    for(i=0;i<DIMS;i++) {
+        for(j=0;j<DIMS;j++) {
+
+            data[i][j] = k++;
+        } /* end for */
+    } /* end for */
+
+    /* Write to attribute */
+    if ( H5Awrite(aid, H5T_NATIVE_INT, data) < 0 ) TEST_ERROR;
+
+    /* Close Attribute */
+    if ( H5Aclose(aid) < 0 ) TEST_ERROR;
+
+    /* Close and Reopen the file and group */
+    if ( H5Gclose(gid) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if ( (gid = H5Gopen2(fid, GROUPNAME, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* ========================= */
+    /* Rename Attribute of Group */
+    /* ========================= */
+
+    if ( H5Arename_by_name(fid, GROUPNAME, ATTRNAME, ATTRNAME3, H5P_DEFAULT) < 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+
+    /* Verify root group metadata */
+    if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT_ID, root_tag) < 0 ) TEST_ERROR;
+
+    /* verify object header belonging to group */
+    if ( verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0 ) TEST_ERROR;
+
+    /* verify object header chunk belonging to group */
+    if ( verify_tag(fid, H5AC_OHDR_CHK_ID, g_tag) < 0 ) TEST_ERROR;
+
+    if ( type == TEST_SHMESG ) {
+
+        /* verify (another) object header chunk belonging to group */
+        if ( verify_tag(fid, H5AC_OHDR_CHK_ID, g_tag) < 0 ) TEST_ERROR;
+
+        /* verify shared header message master table */
+        if ( verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+
+        /* verify fractal heap header belonging to group */
+        if ( verify_tag(fid, H5AC_FHEAP_HDR_ID, g_tag) < 0 ) TEST_ERROR;
+
+        /* verify fractal heap direct block belonging to group */
+        if ( verify_tag(fid, H5AC_FHEAP_DBLOCK_ID, g_tag) < 0 ) TEST_ERROR;
+
+        /* verify shared header message stored as a list */
+        if ( verify_tag(fid, H5AC_SOHM_LIST_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+
+        /* 
+	 * 3 calls to verify_tag() for verifying free space: 
+	 *   one freespace header tag for H5FD_MEM_DRAW manager, 
+	 *   one freespace header tag for H5FD_MEM_SUPER manager 
+         */
+        if ( verify_tag(fid, H5AC_FSPACE_HDR_ID, H5AC__FREESPACE_TAG) < 0 ) TEST_ERROR;
+        if ( verify_tag(fid, H5AC_FSPACE_HDR_ID, H5AC__FREESPACE_TAG) < 0 ) TEST_ERROR;
+
+        /* verify btree header and leaf node belonging to group */
+        if ( verify_tag(fid, H5AC_BT2_HDR_ID, g_tag) < 0 ) TEST_ERROR;
+        if ( verify_tag(fid, H5AC_BT2_LEAF_ID, g_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Gclose(gid) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_attribute_rename_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_attribute_delete_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during attribute deletion.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              March 3, 2010
+ *
+ * Modifications:
+ *	Vailin Choi; July 2012
+ *	Add verify_tag() call because H5FD_FLMAP_DICHOTOMY is now the default free-list mapping.
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_attribute_delete_tags(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;                         /* File Identifier */
+    hid_t gid = -1;                         /* Group Identifier */
+    hid_t aid = -1;                         /* Attribute Identifier */
+    hid_t sid = -1;                         /* Dataset Identifier */
+    int verbose = FALSE;                    /* verbose file outout */
+    int data[DIMS][DIMS];                   /* data buffer */
+    int i,j,k = 0;                           /* iterators */
+    haddr_t root_tag = 0;
+    haddr_t sbe_tag = 0;
+    haddr_t g_tag = 0;
+    hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
+
+    /* Testing Macro */
+    TESTING("tag application during attribute delete");
+
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    /* Create a test file with provided fcpl_t */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Create group */
+    if ( (gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve group tag */
+    if ( get_new_object_header_tag(fid, &g_tag) < 0 ) TEST_ERROR;
+
+    /* Set up attribute dataspace */
+    if ( (sid = H5Screate_simple(2, dims1, maxdims)) < 0 ) TEST_ERROR;
+
+    /* Create attribute */
+    if ( (aid = H5Acreate2(gid, ATTRNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+ 
+    /* fill out data buffer */
+    for(i=0;i<DIMS;i++) {
+        for(j=0;j<DIMS;j++) {
+
+            data[i][j] = k++;
+        } /* end for */
+    } /* end for */
+
+    /* Write to attribute */
+    if ( (H5Awrite(aid, H5T_NATIVE_INT, data)) < 0 ) TEST_ERROR;
+
+    /* Close Attribute */
+    if ( H5Aclose(aid) < 0 ) TEST_ERROR;
+
+    /* Close and Reopen the file and group */
+    if ( H5Gclose(gid) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if ( (gid = H5Gopen2(fid, GROUPNAME, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* ========================= */
+    /* Delete Attribute of Group */
+    /* ========================= */
+
+    if ( (H5Adelete(gid, ATTRNAME)) < 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+
+    /* verify object header belonging to group */
+    if ( verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0 ) TEST_ERROR;
+   
+    if ( type == TEST_SHMESG ) {
+
+        /* verify shared header message master table */
+        if ( verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+
+        /* 
+	 * 2 calls to verify_tag() for verifying free space: 
+	 *   one freespace header tag for H5FD_MEM_DRAW manager,
+	 *   one freespace header tag for H5FD_MEM_SUPER manager 
+	 */
+        if ( verify_tag(fid, H5AC_FSPACE_HDR_ID, H5AC__FREESPACE_TAG) < 0 ) TEST_ERROR;
+        if ( verify_tag(fid, H5AC_FSPACE_HDR_ID, H5AC__FREESPACE_TAG) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Gclose(gid) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_attribute_delete_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_dataset_creation_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during dataset creation.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              February 10, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_dataset_creation_tags(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;                         /* File Identifier */
+    hid_t did = -1;                         /* Dataset Identifier */
+    hid_t sid = -1;                         /* Dataspace Identifier */
+    int verbose = FALSE;                    /* verbose file outout */
+    hid_t dcpl = -1;                        /* dataset creation pl */
+    hsize_t cdims[2] = {1,1};               /* chunk dimensions */
+    int fillval = 0;
+    haddr_t root_tag = 0;
+    haddr_t sbe_tag = 0;
+    haddr_t d_tag = 0;
+    hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
+
+    /* Testing Macro */
+    TESTING("tag application during dataset creation");
+
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Close and Reopen the file */
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* ============================ */
+    /* Create Dataset in Root Group */
+    /* ============================ */
+ 
+    /* Set up creation property list */
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+    
+    /* Enable chunking */
+    if ( H5Pset_chunk(dcpl, RANK, cdims) < 0 ) TEST_ERROR;
+
+    /* Set up a fill value */
+    if ( H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0 ) TEST_ERROR;
+
+    /* Set up dataset dataspace */
+    if ( (sid = H5Screate_simple(2, dims1, maxdims)) < 0 ) TEST_ERROR;
+
+    /* Create Dataset */
+    if (( did = H5Dcreate2(fid, DATASETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if ( H5Pclose(dcpl) < 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+
+    /* Verify root group metadata */
+    if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT_ID, root_tag) < 0 ) TEST_ERROR;
+
+    /* Get dataset's object header address */
+    if ( get_new_object_header_tag(fid, &d_tag) < 0 ) TEST_ERROR;
+
+    if ( type == TEST_SHMESG ) {
+
+        /* verify shared header message master table */
+        if ( verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+
+        /* Verify dataset's tagged metadata */
+        if ( verify_tag(fid, H5AC_FHEAP_HDR_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+        
+        /* Verify shared object header message tags */
+        if ( verify_tag(fid, H5AC_SOHM_LIST_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Dclose(did) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_dataset_creation_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_dataset_creation_earlyalloc_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during dataset creation.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              March 1, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_dataset_creation_earlyalloc_tags(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;                         /* File Identifier */
+    hid_t did = -1;                         /* Dataset Identifier */
+    hid_t sid = -1;                         /* Dataspace Identifier */
+    int verbose = FALSE;                    /* verbose file outout */
+    hid_t dcpl = -1;                        /* dataset creation pl */
+    hsize_t cdims[2] = {1,1};               /* chunk dimensions */
+    int fillval = 0;
+    haddr_t root_tag = 0;
+    haddr_t sbe_tag = 0;
+    haddr_t d_tag = 0;
+    hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
+    int i = 0;           /* iterator */
+
+    /* Testing Macro */
+    TESTING("tag application during dataset creation with early allocation");
+
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Close and Reopen the file */
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* ============================ */
+    /* Create Dataset in Root Group */
+    /* ============================ */
+
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+
+    if ( H5Pset_chunk(dcpl, RANK, cdims) < 0 ) TEST_ERROR;
+
+    if ( H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0 ) TEST_ERROR;
+
+    /* Set early allocation time */
+    if ( H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY) < 0 ) TEST_ERROR;
+
+    /* Set up dataset dataspace */
+    if ( (sid = H5Screate_simple(2, dims1, maxdims)) < 0 ) TEST_ERROR;
+
+    if (( did = H5Dcreate2(fid, DATASETNAME2, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if ( H5Pclose(dcpl) < 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+
+    /* Verify root group metadata */
+    if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT_ID, root_tag) < 0 ) TEST_ERROR;
+
+    /* Get dataset's object header address */
+    if ( get_new_object_header_tag(fid, &d_tag) < 0 ) TEST_ERROR;
+
+    if ( type == TEST_SHMESG ) {
+
+        /* verify shared header message master table */
+        if ( verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+
+        /* Verify dataset's tagged metadata */
+        if ( verify_tag(fid, H5AC_FHEAP_HDR_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+        
+        /* Verify shared object header message tags */
+        if ( verify_tag(fid, H5AC_SOHM_LIST_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Verify 19 b-tree nodes belonging to dataset  */
+    for (i=0; i<19; i++)
+        if ( verify_tag(fid, H5AC_BT_ID, d_tag) < 0 ) TEST_ERROR;
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Dclose(did) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_dataset_creation_earlyalloc_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_dataset_open_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during dataset open.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              February 10, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_dataset_open_tags(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;                         /* File Identifier */
+    hid_t did = -1;                         /* Dataset Identifier */
+    hid_t sid = -1;                         /* Dataspace Identifier */
+    int verbose = FALSE;                    /* verbose file outout */
+    hid_t dcpl = -1;                        /* dataset creation pl */
+    hsize_t cdims[2] = {1,1};               /* chunk dimensions */
+    int fillval = 0;
+    haddr_t root_tag = 0;
+    haddr_t sbe_tag = 0;
+    haddr_t d_tag = 0;
+    hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
+
+    /* Testing Macro */
+    TESTING("tag application during dataset open");
+
+    /* ========= */
+    /* Open File */
+    /* ========= */
+
+    /* Create file */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Set up creation property list */
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+    
+    /* Enable chunking */
+    if ( H5Pset_chunk(dcpl, RANK, cdims) < 0 ) TEST_ERROR;
+
+    /* Set up a fill value */
+    if ( H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0 ) TEST_ERROR;
+
+    /* Set up dataset dataspace */
+    if ( (sid = H5Screate_simple(2, dims1, maxdims)) < 0 ) TEST_ERROR;
+
+    /* Create Dataset */
+    if (( did = H5Dcreate2(fid, DATASETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if ( H5Pclose(dcpl) < 0 ) TEST_ERROR;
+
+    /* Retrieve tag associated with this dataset */
+    if ( get_new_object_header_tag(fid, &d_tag) < 0 ) TEST_ERROR;
+
+    /* Close Dataset */
+    if (H5Dclose(did) < 0 ) TEST_ERROR;
+
+    /* Close and Reopen the file */
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* ========================== */
+    /* Open Dataset in Root Group */
+    /* ========================== */
+ 
+    if (( did = H5Dopen2(fid, DATASETNAME, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+
+    /* Verify root group metadata */
+    if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT_ID, root_tag) < 0 ) TEST_ERROR;
+
+    /* Verify dataset's object header */
+    if ( verify_tag(fid, H5AC_OHDR_ID, d_tag) < 0 ) TEST_ERROR;
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Dclose(did) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_dataset_open_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_dataset_write_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during dataset write.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              February 10, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_dataset_write_tags(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;                         /* File Identifier */
+    hid_t did = -1;                         /* Dataset Identifier */
+    hid_t sid = -1;                         /* Dataspace Identifier */
+    int verbose = FALSE;                    /* verbose file outout */
+    hid_t dcpl = -1;                        /* dataset creation pl */
+    hsize_t cdims[2] = {1,1};               /* chunk dimensions */
+    int fillval = 0;
+    haddr_t root_tag = 0;
+    haddr_t sbe_tag = 0;
+    haddr_t d_tag = 0;
+    hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
+    int i,j,k = 0;           /* iterators */
+    int data[DIMS][DIMS];
+
+    /* Testing Macro */
+    TESTING("tag application during dataset write");
+
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    /* Create file */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Set up creation property list */
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+    
+    /* Enable chunking */
+    if ( H5Pset_chunk(dcpl, RANK, cdims) < 0 ) TEST_ERROR;
+
+    /* Set up a fill value */
+    if ( H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0 ) TEST_ERROR;
+
+    /* Set up dataset dataspace */
+    if ( (sid = H5Screate_simple(2, dims1, maxdims)) < 0 ) TEST_ERROR;
+
+    /* Create Dataset */
+    if (( did = H5Dcreate2(fid, DATASETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if ( H5Pclose(dcpl) < 0 ) TEST_ERROR;
+
+    /* Retrieve tag associated with this dataset */
+    if ( get_new_object_header_tag(fid, &d_tag) < 0 ) TEST_ERROR;
+
+    /* Close and Reopen the file and dataset */
+    if ( H5Dclose(did) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if (( did = H5Dopen2(fid, DATASETNAME, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* ============================== */
+    /* Write to Dataset in Root Group */
+    /* ============================== */
+
+    /* fill out data buffer */
+    for(i=0;i<DIMS;i++) {
+        for(j=0;j<DIMS;j++) {
+
+            data[i][j] = k++;
+        } /* end for */
+    } /* end for */
+
+    /* Write to dataset */
+    if( (H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data)) < 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+ 
+    /* Verify 10 b-tree nodes belonging to dataset  */
+    for (i=0; i<10; i++)
+        if ( verify_tag(fid, H5AC_BT_ID, d_tag) < 0 ) TEST_ERROR;
+
+    /* Verify object header for dataset */
+    if ( verify_tag(fid, H5AC_OHDR_ID, d_tag) < 0 ) TEST_ERROR;
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Dclose(did) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_dataset_write_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_attribute_write_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during attribute write.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              March 3, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_attribute_write_tags(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;                         /* File Identifier */
+    hid_t gid = -1;                         /* Group Identifier */
+    hid_t aid = -1;                         /* Attribute Identifier */
+    hid_t sid = -1;                         /* Dataset Identifier */
+    int verbose = FALSE;                    /* verbose file outout */
+    int data[DIMS][DIMS];                   /* data buffer */
+    int i,j,k = 0;                           /* iterators */
+    haddr_t root_tag = 0;
+    haddr_t sbe_tag = 0;
+    haddr_t g_tag = 0;
+    hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
+
+    /* Testing Macro */
+    TESTING("tag application during attribute write");
+
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    /* Create a test file with provided fcpl_t */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Create group */
+    if ( (gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve group tag */
+    if ( get_new_object_header_tag(fid, &g_tag) < 0 ) TEST_ERROR;
+
+    /* Create attribute dataspace */
+    if ( (sid = H5Screate_simple(2, dims1, maxdims)) < 0 ) TEST_ERROR;
+
+    /* Create attribute on group */
+    if ( (aid = H5Acreate2(gid, ATTRNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Close and Reopen the file, group, and attribute */
+    if ( H5Aclose(aid) < 0 ) TEST_ERROR;
+    if ( H5Gclose(gid) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if ( (gid = H5Gopen2(fid, GROUPNAME, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if ( (aid = H5Aopen(gid, ATTRNAME, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Write to Attribute in Group */
+    /* =========================== */
+
+    /* fill out data buffer */
+    for(i=0;i<DIMS;i++) {
+        for(j=0;j<DIMS;j++) {
+
+            data[i][j] = k++;
+        } /* end for */
+    } /* end for */
+
+    /* Write attribute */
+    if ( (H5Awrite(aid, H5T_NATIVE_INT, data)) < 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+ 
+    /* Verify object header of group */
+    if ( verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0 ) TEST_ERROR;
+
+    /* verify object header chunk belonging to group */
+    if ( verify_tag(fid, H5AC_OHDR_CHK_ID, g_tag) < 0 ) TEST_ERROR;
+
+    if ( type == TEST_SHMESG ) {
+
+        /* verify (another) object header chunk belonging to group */
+        if ( verify_tag(fid, H5AC_OHDR_CHK_ID, g_tag) < 0 ) TEST_ERROR;
+
+        /* verify shared header message master table and list */
+        if ( verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+
+        /* verify fractal heap header belonging to group */
+        if ( verify_tag(fid, H5AC_FHEAP_HDR_ID, g_tag) < 0 ) TEST_ERROR;
+
+        /* verify fractal heap direct block belonging to group */
+        if ( verify_tag(fid, H5AC_FHEAP_DBLOCK_ID, g_tag) < 0 ) TEST_ERROR;
+
+        /* Verify SOHM list */
+        if ( verify_tag(fid, H5AC_SOHM_LIST_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+
+        /* verify btree header and leaf node belonging to group */
+        if ( verify_tag(fid, H5AC_BT2_HDR_ID, g_tag) < 0 ) TEST_ERROR;
+        if ( verify_tag(fid, H5AC_BT2_LEAF_ID, g_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Aclose(aid) < 0 ) TEST_ERROR;
+    if ( H5Gclose(gid) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_attribute_write_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_dataset_read_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during dataset read.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              February 10, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_dataset_read_tags(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;                         /* File Identifier */
+    hid_t did = -1;                         /* Dataset Identifier */
+    hid_t sid = -1;                         /* Dataspace Identifier */
+    int verbose = FALSE;                    /* verbose file outout */
+    hid_t dcpl = -1;                        /* dataset creation pl */
+    hsize_t cdims[2] = {1,1};               /* chunk dimensions */
+    int fillval = 0;
+    haddr_t root_tag = 0;
+    haddr_t sbe_tag = 0;
+    haddr_t d_tag = 0;
+    hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
+    int i,j,k = 0;           /* iterators */
+    int data[DIMS][DIMS];
+
+    /* Testing Macro */
+    TESTING("tag application during dataset read");
+
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    /* Create file */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Set up creation property list */
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+    
+    /* Enable chunking */
+    if ( H5Pset_chunk(dcpl, RANK, cdims) < 0 ) TEST_ERROR;
+
+    /* Set up a fill value */
+    if ( H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0 ) TEST_ERROR;
+
+    /* Set up dataset dataspace */
+    if ( (sid = H5Screate_simple(2, dims1, maxdims)) < 0 ) TEST_ERROR;
+
+    /* Create Dataset */
+    if (( did = H5Dcreate2(fid, DATASETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if ( H5Pclose(dcpl) < 0 ) TEST_ERROR;
+
+    /* Retrieve tag associated with this dataset */
+    if ( get_new_object_header_tag(fid, &d_tag) < 0 ) TEST_ERROR;
+
+    /* fill out data buffer */
+    for(i=0;i<DIMS;i++) {
+        for(j=0;j<DIMS;j++) {
+
+            data[i][j] = k++;
+        } /* end for */
+    } /* end for */
+
+    /* Write to dataset */
+    if( (H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data)) < 0 ) TEST_ERROR;
+
+    /* Close and Reopen the file and dataset */
+    if ( H5Dclose(did) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if (( did = H5Dopen2(fid, DATASETNAME, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* ===================================== */
+    /* TEST: Read from Dataset in Root Group */
+    /* ===================================== */
+
+    if( (H5Dread(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data)) < 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+ 
+    /* Verify 19 b-tree nodes belonging to dataset  */
+    for (i=0; i<19; i++)
+        if ( verify_tag(fid, H5AC_BT_ID, d_tag) < 0 ) TEST_ERROR;
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Dclose(did) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_dataset_read_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_dataset_size_retrieval
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during dataset size retrieval.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              February 24, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_dataset_size_retrieval(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;                         /* File Identifier */
+    hid_t did = -1;                         /* Dataset Identifier */
+    hid_t sid = -1;                         /* Dataspace Identifier */
+    int verbose = FALSE;                    /* verbose file outout */
+    hid_t dcpl = -1;                        /* dataset creation pl */
+    hsize_t cdims[2] = {1,1};               /* chunk dimensions */
+    int fillval = 0;
+    haddr_t root_tag = 0;
+    haddr_t sbe_tag = 0;
+    haddr_t d_tag = 0;
+    hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
+    int i,j,k = 0;           /* iterators */
+    int data[DIMS][DIMS];
+    hsize_t dsize = 0;
+
+    /* Testing Macro */
+    TESTING("tag application during dataset storage size retrieval");
+
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    /* Create file */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Set up creation property list */
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+    
+    /* Enable chunking */
+    if ( H5Pset_chunk(dcpl, RANK, cdims) < 0 ) TEST_ERROR;
+
+    /* Set up a fill value */
+    if ( H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0 ) TEST_ERROR;
+
+    /* Set up dataset dataspace */
+    if ( (sid = H5Screate_simple(2, dims1, maxdims)) < 0 ) TEST_ERROR;
+
+    /* Create Dataset */
+    if (( did = H5Dcreate2(fid, DATASETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if ( H5Pclose(dcpl) < 0 ) TEST_ERROR;
+
+    /* Retrieve tag associated with this dataset */
+    if ( get_new_object_header_tag(fid, &d_tag) < 0 ) TEST_ERROR;
+
+    /* fill out data buffer */
+    for(i=0;i<DIMS;i++) {
+        for(j=0;j<DIMS;j++) {
+
+            data[i][j] = k++;
+        } /* end for */
+    } /* end for */
+
+    /* Write to dataset */
+    if( (H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data)) < 0 ) TEST_ERROR;
+
+    /* Close and Reopen the file and dataset */
+    if ( H5Dclose(did) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if (( did = H5Dopen2(fid, DATASETNAME, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================= */
+    /* Get storage size of dataset in Root Group */
+    /* ========================================= */
+
+    if ( (dsize = H5Dget_storage_size(did)) == 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+
+    /* Verify 19 b-tree nodes belonging to dataset  */
+    for (i=0; i<19; i++)
+        if ( verify_tag(fid, H5AC_BT_ID, d_tag) < 0 ) TEST_ERROR;
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Dclose(did) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_dataset_size_retrieval */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_dataset_extend_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during dataset extension.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              February 24, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_dataset_extend_tags(hid_t fcpl, int type)
+{
+
+    /* Variable Declarations */
+    hid_t fid = -1;                         /* File Identifier */
+    hid_t did = -1;                         /* Dataset Identifier */
+    hid_t sid = -1;                         /* Dataspace Identifier */
+    int verbose = FALSE;                    /* verbose file outout */
+    hid_t dcpl = -1;                        /* dataset creation pl */
+    hsize_t cdims[2] = {1,1};               /* chunk dimensions */
+    int fillval = 0;
+    haddr_t root_tag = 0;
+    haddr_t sbe_tag = 0;
+    haddr_t d_tag = 0;
+    hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
+    int i,j,k = 0;           /* iterators */
+    int data[DIMS][DIMS];
+    hsize_t newdims[2] = {DIMS*2, DIMS};  /* dimensions */
+
+    /* Testing Macro */
+    TESTING("tag application during dataset extend");
+
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    /* Create file */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Set up creation property list */
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+    
+    /* Enable chunking */
+    if ( H5Pset_chunk(dcpl, RANK, cdims) < 0 ) TEST_ERROR;
+
+    /* Set up a fill value */
+    if ( H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0 ) TEST_ERROR;
+
+    /* Set up dataset dataspace */
+    if ( (sid = H5Screate_simple(2, dims1, maxdims)) < 0 ) TEST_ERROR;
+
+    /* Create Dataset */
+    if (( did = H5Dcreate2(fid, DATASETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if ( H5Pclose(dcpl) < 0 ) TEST_ERROR;
+
+    /* Retrieve tag associated with this dataset */
+    if ( get_new_object_header_tag(fid, &d_tag) < 0 ) TEST_ERROR;
+
+    /* fill out data buffer */
+    for(i=0;i<DIMS;i++) {
+        for(j=0;j<DIMS;j++) {
+
+            data[i][j] = k++;
+        } /* end for */
+    } /* end for */
+
+    /* Write to dataset */
+    if( (H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data)) < 0 ) TEST_ERROR;
+
+    /* Close and Reopen the file and dataset */
+    if ( H5Dclose(did) < 0 ) TEST_ERROR;
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if (( did = H5Dopen2(fid, DATASETNAME, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* ================== */
+    /* Set Dataset extent */
+    /* ================== */
+
+    if ( H5Dset_extent(did, newdims) < 0 ) TEST_ERROR;
+
+    if ( H5Dclose(did) < 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+
+    /* Verify root group metadata */
+    if ( verify_tag(fid, H5AC_OHDR_ID, d_tag) < 0 ) TEST_ERROR;
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_dataset_extend_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_object_info_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during object information retrieval.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              March 1, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_object_info_tags(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;          /* File Identifier */
+    hid_t gid = -1;          /* Group Identifier */
+    int verbose = FALSE;     /* verbose file output */
+    haddr_t root_tag = HADDR_UNDEF;
+    haddr_t sbe_tag;
+    haddr_t g_tag;
+    H5O_info_t oinfo;                       /* Object info struct */    
+
+    /* Testing Macro */
+    TESTING("tag application during object info retrieval");
+
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    /* Create a test file with provided fcpl_t */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Create group */
+    if ( (gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve group tag */
+    if ( get_new_object_header_tag(fid, &g_tag) < 0 ) TEST_ERROR;
+
+    /* Close Group */
+    if (H5Gclose(gid) < 0) TEST_ERROR;
+
+    /* Close and Reopen the file */
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* ===================================== */
+    /* Get information on an object by name  */
+    /* ===================================== */
+
+    if ( H5Oget_info_by_name(fid, GROUPNAME, &oinfo, H5P_DEFAULT) < 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+
+    /* Verify root group's tagged metadata */
+    if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT_ID, root_tag) < 0 ) TEST_ERROR;
+
+    /* Verify dataset's tagged metadata */
+    if ( verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT_ID, g_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_LHEAP_PRFX_ID, g_tag) < 0 ) TEST_ERROR;
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_object_info_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_object_copy_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during object copy.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              March 3, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_object_copy_tags(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;                         /* File Identifier */
+    hid_t gid = -1;                         /* Group Identifier */
+    int verbose = FALSE;     /* verbose file output */
+    haddr_t root_tag = HADDR_UNDEF;
+    haddr_t sbe_tag;
+    haddr_t g_tag;
+    haddr_t copy_tag;
+
+    /* Testing Macro */
+    TESTING("tag application during object copy");
+
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    /* Create a test file with provided fcpl_t */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Create group */
+    if ( (gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve group tag */
+    if ( get_new_object_header_tag(fid, &g_tag) < 0 ) TEST_ERROR;
+
+    /* Close Group */
+    if (H5Gclose(gid) < 0) TEST_ERROR;
+
+    /* Close and Reopen the file */
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* =========== */
+    /* Copy Group */
+    /* =========== */
+
+    H5Ocopy(fid, GROUPNAME, fid, GROUPNAMECOPY, H5P_DEFAULT, H5P_DEFAULT);
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+
+    /* Verify root group's tagged metadata */
+    if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT_ID, root_tag) < 0 ) TEST_ERROR;
+
+    /* Verify dataset's tagged metadata */
+    if ( verify_tag(fid, H5AC_OHDR_ID, g_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT_ID, g_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_LHEAP_PRFX_ID, g_tag) < 0 ) TEST_ERROR;
+
+    /* Verify copied dataset's tagged metadata */
+    if ( get_new_object_header_tag(fid, &copy_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT_ID, copy_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_LHEAP_PRFX_ID, copy_tag) < 0 ) TEST_ERROR;
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_object_copy_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_link_removal_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during link removal.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              March 1, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_link_removal_tags(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;                         /* File Identifier */
+    hid_t did = -1;                         /* Dataset Identifier */
+    hid_t sid = -1;                         /* Dataspace Identifier */
+    hid_t gid = -1;                         /* Dataspace Identifier */
+    int verbose = FALSE;                    /* verbose file outout */
+    hid_t dcpl = -1;                        /* dataset creation pl */
+    hsize_t cdims[2] = {1,1};               /* chunk dimensions */
+    int fillval = 0;
+    haddr_t root_tag = 0;
+    haddr_t sbe_tag = 0;
+    haddr_t d_tag = 0;
+    haddr_t g_tag = 0;
+    hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
+    int i,j,k = 0;           /* iterators */
+    int data[DIMS][DIMS];
+
+    /* Testing Macro */
+    TESTING("tag application during link removal");
+
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    /* Create file */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Create group */
+    if ( (gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve group tag */
+    if ( get_new_object_header_tag(fid, &g_tag) < 0 ) TEST_ERROR;
+
+    /* Close Group */
+    if (H5Gclose(gid) < 0) TEST_ERROR;
+
+    /* Set up creation property list */
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+    
+    /* Enable chunking */
+    if ( H5Pset_chunk(dcpl, RANK, cdims) < 0 ) TEST_ERROR;
+
+    /* Set up a fill value */
+    if ( H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0 ) TEST_ERROR;
+
+    /* Set up dataset dataspace */
+    if ( (sid = H5Screate_simple(2, dims1, maxdims)) < 0 ) TEST_ERROR;
+
+    /* Create Dataset */
+    if (( did = H5Dcreate2(fid, DATASETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if ( H5Pclose(dcpl) < 0 ) TEST_ERROR;
+
+    /* Retrieve tag associated with this dataset */
+    if ( get_new_object_header_tag(fid, &d_tag) < 0 ) TEST_ERROR;
+
+    /* fill out data buffer */
+    for(i=0;i<DIMS;i++) {
+        for(j=0;j<DIMS;j++) {
+
+            data[i][j] = k++;
+        } /* end for */
+    } /* end for */
+
+    /* Write to dataset */
+    if( (H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data)) < 0 ) TEST_ERROR;
+
+    /* Close Dataset */
+    if ( H5Dclose(did) < 0 ) TEST_ERROR;
+
+    /* Close and Reopen the file and dataset */
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* ================================ */
+    /* Remove link to group and dataset */
+    /* ================================ */
+
+    if ( (H5Ldelete(fid, GROUPNAME, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    if ( (H5Ldelete(fid, DATASETNAME, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+
+    /* Verify root group's tagged metadata */
+    if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT_ID, root_tag) < 0 ) TEST_ERROR;
+
+    if ( type == TEST_SHMESG ) {
+
+        /* verify shared header message master table */
+        if ( verify_tag(fid, H5AC_SOHM_TABLE_ID, H5AC__SOHM_TAG) < 0 ) TEST_ERROR;
+
+    } /* end if */
+    
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_link_removal_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_link_getname_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during link name retrieval.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              March 2, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_link_getname_tags(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    char name[500];
+    hid_t fid = -1;                         /* File Identifier */
+    hid_t did = -1;                         /* Dataset Identifier */
+    hid_t sid = -1;                         /* Dataspace Identifier */
+    hid_t gid = -1;                         /* Dataspace Identifier */
+    int verbose = FALSE;                    /* verbose file outout */
+    hid_t dcpl = -1;                        /* dataset creation pl */
+    hsize_t cdims[2] = {1,1};               /* chunk dimensions */
+    int fillval = 0;
+    haddr_t root_tag = 0;
+    haddr_t sbe_tag = 0;
+    haddr_t d_tag = 0;
+    haddr_t g_tag = 0;
+    hsize_t dims1[2] = {DIMS, DIMS}; /* dimensions */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* dimensions */
+    int i,j,k = 0;           /* iterators */
+    int data[DIMS][DIMS];
+
+    /* Testing Macro */
+    TESTING("tag application during link name retrieval");
+
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    /* Create file */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Create group */
+    if ( (gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve group tag */
+    if ( get_new_object_header_tag(fid, &g_tag) < 0 ) TEST_ERROR;
+
+    /* Close Group */
+    if (H5Gclose(gid) < 0) TEST_ERROR;
+
+    /* Set up creation property list */
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+    
+    /* Enable chunking */
+    if ( H5Pset_chunk(dcpl, RANK, cdims) < 0 ) TEST_ERROR;
+
+    /* Set up a fill value */
+    if ( H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0 ) TEST_ERROR;
+
+    /* Set up dataset dataspace */
+    if ( (sid = H5Screate_simple(2, dims1, maxdims)) < 0 ) TEST_ERROR;
+
+    /* Create Dataset */
+    if (( did = H5Dcreate2(fid, DATASETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if ( H5Pclose(dcpl) < 0 ) TEST_ERROR;
+
+    /* Retrieve tag associated with this dataset */
+    if ( get_new_object_header_tag(fid, &d_tag) < 0 ) TEST_ERROR;
+
+    /* fill out data buffer */
+    for(i=0;i<DIMS;i++) {
+        for(j=0;j<DIMS;j++) {
+
+            data[i][j] = k++;
+        } /* end for */
+    } /* end for */
+
+    /* Write to dataset */
+    if( (H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data)) < 0 ) TEST_ERROR;
+
+    /* Close Dataset */
+    if ( H5Dclose(did) < 0 ) TEST_ERROR;
+
+    /* Close and Reopen the file and dataset */
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Get name by index location. */
+    /* =========================== */
+
+    H5Lget_name_by_idx(fid, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)1, name, (size_t)500, H5P_DEFAULT);
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+
+    /* Verify root group's tagged metadata */
+    if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_SNODE_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT_ID, root_tag) < 0 ) TEST_ERROR;
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_link_getname_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_external_link_creation_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during external link creation.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              February 24, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_external_link_creation_tags(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;                         /* File Identifier */
+    hid_t fid2 = -1;                         /* File Identifier */
+    hid_t gid = -1;                         /* Dataspace Identifier */
+    int verbose = FALSE;                    /* verbose file outout */
+    haddr_t root_tag = 0;
+    haddr_t sbe_tag = 0;
+
+    /* Testing Macro */
+    TESTING("tag application during external link creation");
+
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    /* Create a test file with provided fcpl_t */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Close and Reopen the file */
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* Create a second file */
+    if ( (fid2 = H5Fcreate(FILENAME2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Create group in second file */
+    if ( (gid = H5Gcreate2(fid2, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Close out second file */
+    if ( (H5Gclose(gid)) < 0 ) TEST_ERROR;
+    if ( (H5Fclose(fid2)) < 0 ) TEST_ERROR;
+
+    /* ==================== */
+    /* Create External Link */
+    /* ==================== */
+    
+    if (H5Lcreate_external(FILENAME2, GROUPNAMEPATH, fid, LINKNAME, H5P_DEFAULT, H5P_DEFAULT) < 0 ) TEST_ERROR;
+
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+ 
+    /* Verify root group metadata */
+    if ( verify_tag(fid, H5AC_OHDR_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_OHDR_CHK_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_LHEAP_PRFX_ID, root_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_BT_ID, root_tag) < 0 ) TEST_ERROR;
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_external_link_creation_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_external_link_open_tags
+ *
+ * Purpose:     This function verifies the correct application of tags
+ *              during external link open.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              February 24, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned 
+check_external_link_open_tags(hid_t fcpl, int type)
+{
+    /* Variable Declarations */
+    haddr_t link_tag = 0;                  /* link tag */
+    hid_t fid = -1;                         /* File Identifier */
+    hid_t fid2 = -1;                        /* File Identifier */
+    hid_t gid = -1;                         /* Dataspace Identifier */
+    hid_t xid = -1;                         /* Dataspace Identifier */
+    int verbose = FALSE;                    /* verbose file outout */
+    haddr_t root_tag = 0;
+    haddr_t sbe_tag = 0;
+
+    /* Testing Macro */
+    TESTING("tag application during external link open");
+
+    /* ===== */
+    /* Setup */
+    /* ===== */
+
+    /* Create a test file with provided fcpl_t */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Retrieve various tags */
+    if ( type == TEST_DEFAULT ) {
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } else if ( type == TEST_SHMESG ) {
+        
+        /* determine tag value of sblock extension object header */
+        if ( get_new_object_header_tag(fid, &sbe_tag) < 0 ) TEST_ERROR;
+
+        /* determine tag value of root group's object header */
+        if ( get_new_object_header_tag(fid, &root_tag) < 0 ) TEST_ERROR;
+
+    } /* end if */
+
+    /* Create a second file */
+    if ( (fid2 = H5Fcreate(FILENAME2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Create group in second file */
+    if ( (gid = H5Gcreate2(fid2, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Close out second file */
+    if ( (H5Gclose(gid)) < 0 ) TEST_ERROR;
+    if ( (H5Fclose(fid2)) < 0 ) TEST_ERROR;
+
+    /* Create external link to second file */
+    if ( H5Lcreate_external(FILENAME2, GROUPNAMEPATH, fid, LINKNAME, H5P_DEFAULT, H5P_DEFAULT) < 0 ) TEST_ERROR;
+
+    /* Close and Reopen the file */
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+    if ( (fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Evict as much as we can from the cache so we can track full tag path */
+    if ( evict_entries(fid) < 0 ) TEST_ERROR;
+
+    /* ================== */
+    /* Open External Link */
+    /* ================== */
+  
+    if ( (xid = H5Gopen2(fid, LINKNAME, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if ( (H5Gclose(xid)) < 0 ) TEST_ERROR;
+  
+    /* =================================== */
+    /* Verification of Metadata Tag Values */
+    /* =================================== */
+
+    /* if verbose, print cache index to screen for visual verification */
+    if ( verbose ) print_index(fid);
+
+    /* determine tag value of linked group's object header */
+    if ( get_new_object_header_tag(fid, &link_tag) < 0 ) TEST_ERROR;
+    if ( verify_tag(fid, H5AC_OHDR_CHK_ID, link_tag) < 0 ) TEST_ERROR;
+
+    /* verify no other entries present */
+    if ( verify_no_unknown_tags(fid) < 0 ) TEST_ERROR;
+
+    /* =========================== */
+    /* Close open objects and file */
+    /* =========================== */
+
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* ========================================== */
+    /* Finished Test. Print status and return. */
+    /* ========================================== */
+
+    PASSED();
+    return 0;
+
+error:
+    return 1;
+} /* check_external_link_open_tags */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_invalid_tag_application
+ *
+ * Purpose:     This function verifies that an error occurs if a tag
+ *              has not been set up during a protect or set of 
+ *              a new piece of metadata.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              May 27, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+check_invalid_tag_application(void)
+{
+    /* Variables */
+    H5F_t * f = NULL;
+    hid_t fid, dxpl_id = -1;
+    haddr_t addr;
+    H5HL_t * lheap = NULL;
+
+    /* Testing Macro */
+    TESTING("failure on invalid tag application");
+    
+    #if H5C_DO_TAGGING_SANITY_CHECKS
+    /* Create a test file */
+    if ( (fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Get internal file pointer*/
+    if ( NULL == (f = (H5F_t *)H5I_object(fid)) ) TEST_ERROR;
+
+    /* Create dxpl */
+    if ( (dxpl_id = H5Pcreate(H5P_DATASET_XFER)) < 0) TEST_ERROR;
+
+    /* Call H5HL_create, an internal function that calls H5AC_insert_entry without setting up a tag */
+    /* Ensure this returns FAILURE, as a tag has not been set up. */
+    if ( H5HL_create(f, H5AC_ind_dxpl_id, (size_t)1024, &addr) >= 0) TEST_ERROR;
+
+    /* Now set up a tag in the dxpl */
+    if ( H5AC_tag(H5AC_ind_dxpl_id, (haddr_t)25, NULL) < 0) TEST_ERROR;
+
+    /* Verify the same call to H5HL_create now works as intended, with a tag set up. */
+    if ( H5HL_create(f, H5AC_ind_dxpl_id, (size_t)1024, &addr) < 0) TEST_ERROR;
+
+    /* Reset dxpl to use invalid tag. */
+    if ( H5AC_tag(H5AC_ind_dxpl_id, H5AC__INVALID_TAG, NULL) < 0) TEST_ERROR;
+
+    /* Call H5HL_protect to protect the local heap created above. */
+    /* This should fail as no tag is set up during the protect call */
+    if (( lheap = H5HL_protect(f, H5AC_ind_dxpl_id, addr, H5AC__NO_FLAGS_SET)) != NULL ) TEST_ERROR;
+
+    /* Again, set up a valid tag in the DXPL */
+    if ( H5AC_tag(H5AC_ind_dxpl_id, (haddr_t)25, NULL) < 0) TEST_ERROR;
+
+    /* Call H5HL_protect again to protect the local heap. This should succeed. */
+    if (( lheap = H5HL_protect(f, H5AC_ind_dxpl_id, addr, H5AC__NO_FLAGS_SET)) == NULL ) TEST_ERROR;
+
+    /* Now unprotect the heap, as we're done with the test. */
+    if ( H5HL_unprotect(lheap) < 0 ) TEST_ERROR;
+
+    /* Close open objects and file */
+    if ( H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* Finished Test. Print status and return. */
+    PASSED();
+    #else
+    SKIPPED();
+    printf("    test skipped because sanity checking on tag value is disabled.\n");
+    #endif
+
+    return 0;
+
+error:
+    return 1;
+} /* check_invalid_tag_application */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Purpose:     Run tests on library's ability to tag metadata entries.
+ *
+ * Return:      Success:
+ *
+ *              Failure:
+ *
+ * Programmer:  Mike McGreevy
+ *              January 15, 2009
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+
+int 
+main(void) 
+{
+    /* Variable Declarations */
+    hid_t fcpl_default = -1;        /* file creation prop list */
+    hid_t fcpl_shmesg_all = -1;     /* file creation prop list */
+    hid_t fcpl = -1;                /* file creation prop list */
+    unsigned nerrs = 0;         /* Error Encountered */
+    int test_type = 0;          /* test type iterator */
+    
+    /* Open the HDF5 Library */
+    H5open();
+ 
+    /* ========== */   
+    /* Test Setup */
+    /* ========== */   
+
+    /* Create a standard file creation property list */
+    fcpl_default = H5Pcreate(H5P_FILE_CREATE);
+
+    /* Create an fcpl with shared messages and file space managment enabled */
+    fcpl_shmesg_all = H5Pcreate(H5P_FILE_CREATE);
+    H5Pset_shared_mesg_nindexes(fcpl_shmesg_all, 1);
+    H5Pset_shared_mesg_index(fcpl_shmesg_all, 0, H5O_SHMESG_ALL_FLAG, 20);
+    H5Pset_file_space(fcpl_shmesg_all, H5F_FILE_SPACE_ALL_PERSIST, (hsize_t)0);
+
+    /* ========= */
+    /* Run Tests */
+    /* ========= */
+
+    for (test_type=0; test_type<NUM_TEST_TYPES; test_type++) {
+    
+        /* Run tests on each fcpl set up above. */
+        if (test_type == TEST_DEFAULT) {
+
+            if (!nerrs) printf("Testing standard tag application cases w/ default fcpl:\n");
+            fcpl = fcpl_default;
+        
+        } else if (test_type == TEST_SHMESG) {
+
+            if (!nerrs) printf("Testing standard tag application cases w/ shared messages:\n");
+            fcpl = fcpl_shmesg_all;
+
+        } else {
+            TEST_ERROR;
+        }
+
+        /* Check tag application under different circumstances */
+        if (!nerrs) nerrs += check_file_creation_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_file_open_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_group_creation_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_multi_group_creation_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_group_open_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_attribute_creation_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_attribute_open_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_attribute_write_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_attribute_delete_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_attribute_rename_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_dataset_creation_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_dataset_creation_earlyalloc_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_dataset_open_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_dataset_write_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_dataset_read_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_dataset_size_retrieval(fcpl, test_type);
+        if (!nerrs && (test_type == TEST_DEFAULT)) nerrs += check_dataset_extend_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_object_info_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_link_removal_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_link_getname_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_external_link_creation_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_external_link_open_tags(fcpl, test_type);
+        if (!nerrs) nerrs += check_object_copy_tags(fcpl, test_type);
+
+    } /* end for */
+    
+    if (!nerrs) printf("Testing other specific tag application cases:\n");
+    if (!nerrs) nerrs += check_dense_attribute_tags();
+    if (!nerrs) nerrs += check_link_iteration_tags();
+    if (!nerrs) nerrs += check_invalid_tag_application();
+
+    /* Delete test files */
+    HDremove(FILENAME);
+    HDremove(FILENAME2);
+
+    /* Return Errors */
+    return(nerrs > 0);
+
+error:
+    /* Return with Error */
+    return(1);
+
+} /* main */
diff --git a/test/chunk_info.c b/test/chunk_info.c
new file mode 100644
index 0000000..68bf774
--- /dev/null
+++ b/test/chunk_info.c
@@ -0,0 +1,153 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Pedro Vicente <pvn at hdfgroup.edu>
+ *              April 7, 2008
+ *
+ * Purpose:     Tests the H5Dget_chunk_info API function
+ *              This program writes a 4x4 dataset by iterating on 2x2 chunks
+ *               at a time
+ */
+
+
+#include "hdf5.h"
+#include "h5test.h"
+
+#define PRINT_DATA
+#define H5FILE_NAME "chunk_info.h5"
+#define DATASETNAME "2d"
+#define RANK         2
+
+
+int main( void )
+{
+
+    hid_t   fid;      /* file ID */
+    hid_t   did;      /* dataset ID */
+    hid_t   f_sid;    /* file space ID */
+    hid_t   m_sid;    /* memory space ID */
+    hid_t   pid;      /* property list ID */
+    hsize_t start[2]; /* chunk location to start writing */
+    hsize_t dims[2]  = { 4, 4};
+    hsize_t chunk_dims[2] = { 2, 2 };
+    int     chunk_data[2][2] = { {1, 1}, {1, 1} };
+    int     buf[4][4];
+    int     fillvalue = 0;
+    int     i, j, ii, jj;
+
+    /* create a new file using default properties. */
+    if ((fid = H5Fcreate(H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+    /* create the file space */
+    if ((f_sid = H5Screate_simple(RANK, dims, dims)) < 0) TEST_ERROR;
+    /* create the memory space with chunk dimensions */
+    if ((m_sid = H5Screate_simple(RANK, chunk_dims, chunk_dims)) < 0) TEST_ERROR;
+    start[0] = 0;
+    start[1] = 0;
+    if (H5Sselect_hyperslab(m_sid, H5S_SELECT_SET, start, NULL, chunk_dims, NULL) < 0) TEST_ERROR;
+
+    TESTING("chunk info");
+
+   /*-------------------------------------------------------------------------
+    * create a dataset
+    *-------------------------------------------------------------------------
+    */
+
+    /* modify dataset creation properties, i.e. enable chunking. */
+    if ((pid = H5Pcreate (H5P_DATASET_CREATE)) < 0) TEST_ERROR;
+    if (H5Pset_chunk(pid, RANK, chunk_dims) < 0) TEST_ERROR;
+    if (H5Pset_fill_value(pid, H5T_NATIVE_INT, &fillvalue) < 0) TEST_ERROR;
+
+    /* create a new dataset */
+    if((did = H5Dcreate2(fid , DATASETNAME, H5T_NATIVE_INT, f_sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+
+   /*-------------------------------------------------------------------------
+    * write the dataset in 2x2 chunks
+    *-------------------------------------------------------------------------
+    */
+
+    /* iterate in dim 0 */
+    for (j = 0; j < chunk_dims[0]; j++)
+    {
+
+        /* reset start in dim 1 */
+        start[1] = 0;
+
+        /* iterate in dim 1 */
+        for (i = 0; i < chunk_dims[1]; i++)
+        {
+
+            /* select file hyperslab to save a 2x2 chunk */
+            if (H5Sselect_hyperslab(f_sid, H5S_SELECT_SET, start, NULL, chunk_dims, NULL) < 0) TEST_ERROR;
+
+            /* write the data to the hyperslab. */
+            if (H5Dwrite(did, H5T_NATIVE_INT, m_sid, f_sid, H5P_DEFAULT, chunk_data) < 0) TEST_ERROR;
+
+            /* read back and display complete dataset 4x4 */
+            if (H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) TEST_ERROR;
+
+
+#if defined (PRINT_DATA)
+            printf("\n");
+            printf("dataset: \n");
+            for (jj = 0; jj < dims[0]; jj++) {
+                for (ii = 0; ii < dims[1]; ii++) printf("%d ", buf[jj][ii]);
+                printf("\n");
+            }
+#endif
+
+
+            /* increment start in dim 1 */
+            start[1] += 2;
+
+
+        }
+
+        /* increment start in dim 0 */
+        start[0] += 2;
+    }
+
+
+
+   /*-------------------------------------------------------------------------
+    * close
+    *-------------------------------------------------------------------------
+    */
+
+    if (H5Dclose(did) < 0) TEST_ERROR
+    if (H5Sclose(f_sid) < 0) TEST_ERROR
+    if (H5Sclose(m_sid) < 0) TEST_ERROR
+    if (H5Pclose(pid) < 0) TEST_ERROR
+    if (H5Fclose(fid) < 0) TEST_ERROR
+
+    PASSED();
+
+    puts("All chunk info tests passed.");
+    return 0;
+
+
+error:
+    H5Dclose( did );
+    H5Sclose( f_sid );
+    H5Sclose( m_sid );
+    H5Pclose( pid  );
+    H5Fclose( fid );
+    H5_FAILED();
+    return 1;
+}
+
+
+
diff --git a/test/cmpd_dset.c b/test/cmpd_dset.c
index a782fb0..22bf3a2 100644
--- a/test/cmpd_dset.c
+++ b/test/cmpd_dset.c
@@ -21,7 +21,7 @@
 /* See H5private.h for how to include headers */
 #undef NDEBUG
 
-#define H5T_PACKAGE
+#define H5T_FRIEND		/*suppress error about including H5Tpkg	  */
 #include "H5Tpkg.h"		/*to turn off hardware conversions*/
 #include "H5Iprivate.h"
 
@@ -1285,33 +1285,33 @@ compare_data(void *src_data, void *dst_data, hbool_t src_subset)
 	    s_ptr->c[3] != d_ptr->c[3] ||
 	    s_ptr->d    != d_ptr->d    ||
 	    s_ptr->e    != d_ptr->e    ||
-            !FLT_ABS_EQUAL(s_ptr->f, d_ptr->f) ||
-            !FLT_ABS_EQUAL(s_ptr->g, d_ptr->g) ||
-            !FLT_ABS_EQUAL(s_ptr->h[0], d_ptr->h[0]) ||
-            !FLT_ABS_EQUAL(s_ptr->h[1], d_ptr->h[1]) ||
-            !FLT_ABS_EQUAL(s_ptr->i, d_ptr->i) ||
-            !FLT_ABS_EQUAL(s_ptr->j, d_ptr->j) ||
-            !DBL_ABS_EQUAL(s_ptr->k, d_ptr->k) ||
-            !DBL_ABS_EQUAL(s_ptr->l, d_ptr->l) ||
-            !DBL_ABS_EQUAL(s_ptr->m, d_ptr->m) ||
-            !DBL_ABS_EQUAL(s_ptr->n, d_ptr->n) ) {
+            !H5_FLT_ABS_EQUAL(s_ptr->f, d_ptr->f) ||
+            !H5_FLT_ABS_EQUAL(s_ptr->g, d_ptr->g) ||
+            !H5_FLT_ABS_EQUAL(s_ptr->h[0], d_ptr->h[0]) ||
+            !H5_FLT_ABS_EQUAL(s_ptr->h[1], d_ptr->h[1]) ||
+            !H5_FLT_ABS_EQUAL(s_ptr->i, d_ptr->i) ||
+            !H5_FLT_ABS_EQUAL(s_ptr->j, d_ptr->j) ||
+            !H5_DBL_ABS_EQUAL(s_ptr->k, d_ptr->k) ||
+            !H5_DBL_ABS_EQUAL(s_ptr->l, d_ptr->l) ||
+            !H5_DBL_ABS_EQUAL(s_ptr->m, d_ptr->m) ||
+            !H5_DBL_ABS_EQUAL(s_ptr->n, d_ptr->n) ) {
 
 	    H5_FAILED();
 	    printf("    i=%d\n", i);
 	    printf("    src={a=%d, b=%d, c=[%d,%d,%d,%d,%d,%d,%d,%d], d=%d, e=%d, f=%f, g=%f, h=[%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f], i=%f, j=%f, k=%f, l=%f, m=%f, n=%f}\n",
 		   s_ptr->a, s_ptr->b, s_ptr->c[0], s_ptr->c[1], s_ptr->c[2],
 		   s_ptr->c[3], s_ptr->c[4], s_ptr->c[5], s_ptr->c[6], s_ptr->c[7],
-                   s_ptr->d, s_ptr->e, s_ptr->f, s_ptr->g,s_ptr->h[0],s_ptr->h[1],s_ptr->h[2],
-                   s_ptr->h[3],s_ptr->h[4],s_ptr->h[5],s_ptr->h[6],s_ptr->h[7],s_ptr->h[8],
-                   s_ptr->h[9],s_ptr->h[10],s_ptr->h[11],s_ptr->h[12],s_ptr->h[13],s_ptr->h[14],
-                   s_ptr->h[15], s_ptr->i,s_ptr->j,s_ptr->k,s_ptr->l,s_ptr->m,s_ptr->n);
+                   s_ptr->d, s_ptr->e, (double)s_ptr->f, (double)s_ptr->g,(double)s_ptr->h[0],(double)s_ptr->h[1],(double)s_ptr->h[2],
+                   (double)s_ptr->h[3],(double)s_ptr->h[4],(double)s_ptr->h[5],(double)s_ptr->h[6],(double)s_ptr->h[7],(double)s_ptr->h[8],
+                   (double)s_ptr->h[9],(double)s_ptr->h[10],(double)s_ptr->h[11],(double)s_ptr->h[12],(double)s_ptr->h[13],(double)s_ptr->h[14],
+                   (double)s_ptr->h[15], (double)s_ptr->i,(double)s_ptr->j,s_ptr->k,s_ptr->l,s_ptr->m,s_ptr->n);
 	    printf("    dst={a=%d, b=%d, c=[%d,%d,%d,%d,%d,%d,%d,%d], d=%d, e=%d, f=%f, g=%f, h=[%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f], i=%f, j=%f, k=%f, l=%f, m=%f, n=%f}\n",
 		   d_ptr->a, d_ptr->b, d_ptr->c[0], d_ptr->c[1], d_ptr->c[2],
 		   d_ptr->c[3], d_ptr->c[4], d_ptr->c[5], d_ptr->c[6], d_ptr->c[7],
-                   d_ptr->d, d_ptr->e, d_ptr->f, d_ptr->g,d_ptr->h[0],d_ptr->h[1],d_ptr->h[2],
-                   d_ptr->h[3],d_ptr->h[4],d_ptr->h[5],d_ptr->h[6],d_ptr->h[7],d_ptr->h[8],
-                   d_ptr->h[9],d_ptr->h[10],d_ptr->h[11],d_ptr->h[12],d_ptr->h[13],
-                   d_ptr->h[14], d_ptr->h[15], d_ptr->i,d_ptr->j,d_ptr->k,d_ptr->l,
+                   d_ptr->d, d_ptr->e, (double)d_ptr->f, (double)d_ptr->g,(double)d_ptr->h[0],(double)d_ptr->h[1],(double)d_ptr->h[2],
+                   (double)d_ptr->h[3],(double)d_ptr->h[4],(double)d_ptr->h[5],(double)d_ptr->h[6],(double)d_ptr->h[7],(double)d_ptr->h[8],
+                   (double)d_ptr->h[9],(double)d_ptr->h[10],(double)d_ptr->h[11],(double)d_ptr->h[12],(double)d_ptr->h[13],
+                   (double)d_ptr->h[14],(double)d_ptr->h[15],(double)d_ptr->i,(double)d_ptr->j,d_ptr->k,d_ptr->l,
                    d_ptr->m,d_ptr->n);
 	    goto error;
 	}
diff --git a/test/cork.c b/test/cork.c
new file mode 100644
index 0000000..6478723
--- /dev/null
+++ b/test/cork.c
@@ -0,0 +1,2191 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Vailin Choi
+ *              Feb 20, 2014
+ *
+ * This file contains tests for:
+ *  H5Odisable_mdc_flushes()
+ *  H5Oenable_mdc_flushes()
+ *  H5Oare_mdc_flushes_disabled()
+ */
+#include "hdf5.h"
+#include "testhdf5.h"
+#include "h5test.h"
+#include "H5Iprivate.h"
+#include "H5ACprivate.h"
+#include "H5ACpublic.h"
+#include "cache_common.h"
+#include "H5HLprivate.h"
+
+/* ============ */
+/* Test Defines */
+/* ============ */
+
+#define FILENAME    "test_cork.h5"
+#define ATTR        "ATTR"
+#define DSET        "DSET"
+#define DSET_BT1    "DSET_BT1"
+#define DSET_COMPACT    "DSET_COMPACT"
+#define DSET_CONTIG     "DSET_CONTIG"
+#define DSET_EA     "DSET_EA"
+#define DSET_BT2    "DSET_BT2"
+#define DSET_FA     "DSET_FA"
+#define DSET_NONE   "DSET_NONE"
+#define GRP         "GRP"
+#define GRP2        "GRP2"
+#define GRP3        "GRP3"
+#define DT      "DT"
+#define DT2         "DT2"
+#define DT3         "DT3"
+#define GRP_ATTR    "GRP_ATTR"
+#define DSET_ATTR   "DSET_ATTR"
+#define DT_ATTR     "DT_ATTR"
+
+#define RANK    2
+#define DIM0    5
+#define DIM1    10
+#define DIMS0   50
+#define DIMS1   100
+
+
+/* ===================== */
+/* Function Declarations */
+/* ===================== */
+
+/* Helper Functions */
+static void print_entry_type_to_screen(int id);
+static int print_index(hid_t fid);
+static int verify_cork_tag(hid_t fid, haddr_t tag, hbool_t status);
+
+/* Tests */
+static int test_objs_cork(hbool_t new_format);
+static int test_dset_cork(hbool_t new_format);
+static int verify_old_dset_cork(void);
+static int verify_obj_dset_cork(hbool_t swmr);
+static int verify_dset_cork(hbool_t swmr, hbool_t new_format);
+static int verify_group_cork(hbool_t swmr);
+static int verify_named_cork(hbool_t swmr);
+static int verify_multiple_cork(hbool_t swmr);
+
+/* ================ */
+/* Helper Functions */
+/* ================ */
+
+

+/*-------------------------------------------------------------------------
+ *
+ * Function:    print_entry_type_to_screen
+ *      (copied from cache_tagging.c)
+ *
+ * Purpose:     DEBUG CODE (for when verbose is set).
+ *
+ *              Prints type of entry to stdout.
+ *
+ * Return:      void
+ *
+ * Programmer:  Mike McGreevy
+ *              September 3, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+print_entry_type_to_screen(int id)
+{
+    printf("Type = ");
+    
+    switch (id) {
+    
+        case 0:
+            printf("B-tree Node");
+            break;
+        case 1: 
+            printf("Symbol Table Node");
+            break;
+        case 2:
+            printf("Local Heap Prefix");
+            break;
+        case 3:
+            printf("Local Heap Data Block");
+            break;
+        case 4:
+            printf("Global Heap");
+            break;
+        case 5:
+            printf("Object Header");
+            break;
+        case 6:
+            printf("Object Header Chunk");
+            break;
+        case 7:
+            printf("v2 B-tree Header");
+            break;
+        case 8:
+            printf("v2 B-tree Internal Node");
+            break;
+        case 9:
+            printf("v2 B-tree Leaf Node");
+            break;
+        case 10:
+            printf("Fractal Heap Header");
+            break;
+        case 11:
+            printf("Fractal Heap Direct Block");
+            break;
+        case 12:
+            printf("Fractal Heap Indirect Block");
+            break;
+        case 13:
+            printf("Free Space Header");
+            break;
+        case 14:
+            printf("Free Space Section");
+            break;
+        case 15:
+            printf("Shared Object Header Message Master Table");
+            break;
+        case 16:
+            printf("Shared Message Index Stored As A List");
+            break;
+        case 17:
+            printf("Extensible Array Header");
+            break;
+        case 18:
+            printf("Extensible Array Index Block");
+            break;
+        case 19:
+            printf("Extensible Array Super Block");
+            break;
+        case 20:
+            printf("Extensible Array Data Block");
+            break;
+        case 21:
+            printf("Extensible Array Data Block Page");
+            break;
+        case 22:
+            printf("Chunk Proxy");
+            break;
+        case 23:
+            printf("Fixed Array Header");
+            break;
+        case 24:
+            printf("Fixed Array Data Block");
+            break;
+        case 25:
+            printf("Fixed Array Data Block Page");
+            break;
+        case 26:
+            printf("File Superblock");
+            break;
+        case 27:
+            printf("Test Entry");
+            break;
+        case 28:
+            printf("Number of Types");
+            break;
+        default:
+            printf("*Unknown*");
+            break;
+
+    } /* end switch */
+
+} /* print_entry_type_to_screen */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    print_index()
+ *
+ * Purpose:     DEBUG CODE (for when verbose is set).
+ *      (copied from cache_tagging.c)
+ *
+ *              Prints cache index to screen, including address of entries,
+ *              tag values of entries, and entry types.
+ *
+ * Return:      void
+ *
+ * Programmer:  Mike McGreevy
+ *              January 25, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int print_index(hid_t fid) {
+
+    H5F_t * f = NULL;         /* File Pointer */
+    H5C_t * cache_ptr = NULL; /* Cache Pointer */
+    int i = 0; /* Iterator */
+    H5C_cache_entry_t *next_entry_ptr = NULL; /* entry pointer */
+
+    /* Get Internal File / Cache Pointers */
+    if ( NULL == (f = (H5F_t *)H5I_object(fid)) ) TEST_ERROR;
+    cache_ptr = f->shared->cache;
+
+    /* Initial (debugging) loop */
+    printf("CACHE SNAPSHOT:\n");
+    for (i = 0; i < H5C__HASH_TABLE_LEN; i++) {
+        next_entry_ptr = cache_ptr->index[i];
+
+        while (next_entry_ptr != NULL) {
+            printf("Addr = %u, ", (unsigned int)next_entry_ptr->addr);
+            printf("Tag = %u, ", (unsigned int)next_entry_ptr->tag);
+            printf("Dirty = %d, ", (int)next_entry_ptr->is_dirty);
+            printf("Protected = %d, ", (int)next_entry_ptr->is_protected);
+            printf("Pinned = %d, ", (int)next_entry_ptr->is_pinned);
+            printf("Corked = %d, ", (int)next_entry_ptr->is_corked);
+            print_entry_type_to_screen(next_entry_ptr->type->id);
+            printf("\n");
+            next_entry_ptr = next_entry_ptr->ht_next;
+        } /* end if */
+
+    } /* end for */
+    printf("\n");
+
+    return 0;
+    
+error:
+
+    return -1;
+
+} /* print_index */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    verify_cork_tag()
+ *
+ * Purpose:     This routine verifies that all cache entries associated with
+ *      the object tag are marked with the desired "cork" status.
+ *
+ * Return:      0 on Success, -1 on Failure
+ *
+ * Programmer:  Vailin Choi; Feb 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static int 
+verify_cork_tag(hid_t fid, haddr_t tag, hbool_t status)
+{
+    int i = 0;                           /* Iterator */
+    H5F_t * f = NULL;         /* File Pointer */
+    H5C_t * cache_ptr = NULL; /* Cache Pointer */
+    H5C_cache_entry_t *next_entry_ptr = NULL; /* entry pointer */
+
+    /* Get Internal File / Cache Pointers */
+    if ( NULL == (f = (H5F_t *)H5I_object(fid)) ) TEST_ERROR;
+    cache_ptr = f->shared->cache;
+
+    for (i = 0; i < H5C__HASH_TABLE_LEN; i++) {
+
+        next_entry_ptr = cache_ptr->index[i];
+
+        while (next_entry_ptr != NULL) {
+
+            if (next_entry_ptr->tag == tag && next_entry_ptr->is_corked != status)
+        TEST_ERROR;
+
+            next_entry_ptr = next_entry_ptr->ht_next;
+
+        } /* end if */
+
+    } /* for */
+
+    return 0;
+
+error:
+    return -1;
+} /* verify_cork_tag */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    verify_old_dset_cork
+ *
+ * Purpose:     This function verifies corking operation for datasets
+ *      created with old library format.  Cache entries associated with the
+ *      object tag are checked for the correct cork status.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Vailin Choi; Feb 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+verify_old_dset_cork(void)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;                     /* File ID */
+    hid_t did = -1, did2 = -1, did3 = -1;   /* Dataset IDs */
+    hid_t dcpl = -1, dcpl2 = -1, dcpl3 = -1;     /* Dataset creation property lists */
+    hid_t sid = -1, sid2 = -1, sid3 = -1;   /* Dataspace IDs */
+    hsize_t dims[2] = {100, 20};        /* Dataset dimension sizes */
+    hsize_t max_dims[2] = {100, H5S_UNLIMITED}; /* Dataset maximum dimension sizes */
+    hsize_t chunk_dims[2] = {2, 5};     /* Dataset chunked dimension sizes */
+    int buf[100][20];               /* Data buffer */
+    int i = 0, j = 0;               /* Local index variable */
+    H5O_info_t oinfo, oinfo2, oinfo3;       /* Object metadata information */
+    hsize_t dims2[2] = {8, 16};         /* Dataset dimension sizes */
+
+    /* Testing Macro */
+    TESTING("cork status for datasets with old format");
+
+    /* Create the file */
+    if((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) 
+    TEST_ERROR;
+
+    /* Create dcpl */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set to use chunked dataset */
+    if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0) FAIL_STACK_ERROR
+
+    /* Create chunked dataset with v1-btree indexing: DSET_BT1 */
+    if((sid = H5Screate_simple(2, dims, max_dims)) < 0) 
+    TEST_ERROR;
+    if((did = H5Dcreate2(fid, DSET_BT1, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0 ) 
+    TEST_ERROR;
+    
+    /* Get dataset object header address: DSET_BT1 */
+    if(H5Oget_info(did, &oinfo) < 0 ) TEST_ERROR;
+    
+    /* Cork the dataset: DSET_BT1 */
+    if(H5Odisable_mdc_flushes(did) < 0 ) TEST_ERROR;
+
+    /* Verify cork status */
+    if(verify_cork_tag(fid, oinfo.addr, TRUE) < 0 ) 
+    TEST_ERROR;
+
+    /* Initialize data buffer */
+    for(i = 0; i < (int)dims[0]; i++) {
+        for(j = 0; j < (int)dims[1]; j++) {
+            buf[i][j] = (i + 1) * (j + 1);
+        }
+    }
+
+    /* Write to the dataset: DSET_BT1 */
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+        TEST_ERROR;
+
+    /* Verify the cork status for DSET_BT1 */
+    if(verify_cork_tag(fid, oinfo.addr, TRUE) < 0 ) 
+    TEST_ERROR;
+
+    /* Create compact dataset: DSET_COMPACT */
+    if((sid2 = H5Screate_simple(2, dims2, NULL)) < 0)
+        FAIL_STACK_ERROR
+    if((dcpl2 = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_layout(dcpl2, H5D_COMPACT) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_alloc_time(dcpl2, H5D_ALLOC_TIME_EARLY) < 0)
+        FAIL_STACK_ERROR
+    if((did2 = H5Dcreate2(fid, DSET_COMPACT, H5T_NATIVE_INT, sid2, H5P_DEFAULT, dcpl2, H5P_DEFAULT)) < 0) 
+        FAIL_STACK_ERROR
+
+    /* Get dataset object address */
+    if(H5Oget_info(did2, &oinfo2) < 0 ) TEST_ERROR;
+    
+    /* Cork the dataset: DSET_COMPACT */
+    if(H5Odisable_mdc_flushes(did2) < 0 ) TEST_ERROR;
+
+    /* Verify cork status */
+    if(verify_cork_tag(fid, oinfo2.addr, TRUE) < 0 ) 
+    TEST_ERROR;
+
+    /* Closing */
+    if(H5Dclose(did) < 0 ) TEST_ERROR;
+    if(H5Sclose(sid) < 0 ) TEST_ERROR;
+    if(H5Pclose(dcpl) < 0 ) TEST_ERROR;
+
+    if(H5Dclose(did2) < 0 ) TEST_ERROR;
+    if(H5Sclose(sid2) < 0 ) TEST_ERROR;
+    if(H5Pclose(dcpl2) < 0 ) TEST_ERROR;
+
+    if(H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* Reopen the file */
+    if((fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Initialize data buffer */
+    for(i = 0; i < (int)dims[0]; i++) {
+        for(j = 0; j < (int)dims[1]; j++) {
+            buf[i][j] = (i + 1) * (j + 1);
+        }
+    }
+
+    /* Open and write to the dataset: DSET_BT1 */
+    if((did = H5Dopen2(fid, DSET_BT1, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+
+    /* Create contiguous dataset: DSET_CONTIG */
+    if((sid3 = H5Screate_simple(2, dims2, NULL)) < 0)
+        FAIL_STACK_ERROR
+    if((dcpl3 = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_layout(dcpl3, H5D_CONTIGUOUS) < 0)
+        FAIL_STACK_ERROR
+    if((did3 = H5Dcreate2(fid, DSET_CONTIG, H5T_NATIVE_INT, sid3, H5P_DEFAULT, dcpl3, H5P_DEFAULT)) < 0) 
+        FAIL_STACK_ERROR
+
+    /* Get dataset object address: DSET_CONTIG */
+    if(H5Oget_info(did3, &oinfo3) < 0 ) TEST_ERROR;
+
+    /* Cork the dataset: DSET_CONTIG */
+    if(H5Odisable_mdc_flushes(did3) < 0 ) TEST_ERROR;
+
+    /* Verify the cork status for DSET_CONTIG */
+    if(verify_cork_tag(fid, oinfo3.addr, TRUE) < 0 ) 
+    TEST_ERROR;
+
+    /* Verify the cork status for DSET_BT1 */
+    if(verify_cork_tag(fid, oinfo.addr, FALSE) < 0 ) 
+    TEST_ERROR;
+
+    /* Un-cork the dataset: DSET_CONTIG */
+    if(H5Oenable_mdc_flushes(did3) < 0 ) TEST_ERROR;
+
+    /* Verify the cork status for DSET_CONTIG */
+    if(verify_cork_tag(fid, oinfo3.addr, FALSE) < 0 ) 
+    TEST_ERROR;
+
+    /* Closing */
+    if(H5Dclose(did3) < 0 ) TEST_ERROR;
+    if(H5Pclose(dcpl3) < 0 ) TEST_ERROR;
+    if(H5Dclose(did) < 0 ) TEST_ERROR;
+    if(H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Sclose(sid);
+        H5Sclose(sid2);
+        H5Sclose(sid3);
+        H5Dclose(did);
+        H5Dclose(did2);
+        H5Dclose(did3);
+        H5Pclose(dcpl);
+        H5Pclose(dcpl2);
+        H5Pclose(dcpl3);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    return 1;
+} /* verify_old_dset_cork */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    verify_obj_dset_cork
+ *
+ * Purpose:     This function verifies corking operations for dataset objects.
+ *      Cache entries associated with the object tag are checked
+ *              for the correct cork status.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Vailin Choi; Feb 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+verify_obj_dset_cork(hbool_t swmr)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;     /* File ID */
+    hid_t fapl = -1;            /* File access property list */
+    hid_t aid = -1;             /* Attribute ID */
+    hid_t sid = -1, sid2 = -1;  /* Dataspace IDs */
+    hid_t did = -1, did2 = -1;  /* Dataset IDs */
+    hid_t oid = -1;             /* Object ID */
+    hid_t dcpl2;            /* Dataset creation property list */
+    int i = 0;                  /* Local index variable */
+    hsize_t dim[1] = {100}; /* Dataset dimension size */
+    hsize_t chunk_dim[1] = {7}; /* Dataset chunk dimension size */
+    H5O_info_t oinfo, oinfo2;   /* Object metadata information */
+    char attrname[500];         /* Name of attribute */
+    unsigned flags;     /* File access flags */
+
+    if(swmr) {
+        TESTING("cork status for dataset objects with attributes (SWMR)");
+    } else {
+        TESTING("cork status for dataset objects with attributes");
+    }
+
+    /* Create fapl */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0 ) 
+        TEST_ERROR;
+    /* Set to use latest format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0 ) 
+        TEST_ERROR;
+
+    /* Create the file with/without SWMR access */
+    flags = H5F_ACC_TRUNC;
+    if(swmr)
+        flags |= H5F_ACC_SWMR_WRITE;
+    if((fid = H5Fcreate(FILENAME, flags, H5P_DEFAULT, fapl)) < 0 ) 
+        TEST_ERROR;
+
+    /* Create dataspace */
+    if((sid = H5Screate(H5S_SCALAR)) < 0 )
+        TEST_ERROR;
+
+    /* Create dataset: DSET */
+    if((did = H5Dcreate2(fid, DSET, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) 
+        TEST_ERROR;
+
+    /* Get dataset object header address */
+    if(H5Oget_info(did, &oinfo) < 0 )
+        TEST_ERROR;
+    
+    /* Verify cork status of the dataset: DSET */
+    if(verify_cork_tag(fid, oinfo.addr, FALSE) < 0 ) 
+        TEST_ERROR;
+    
+    /* Cork the dataset: DSET */
+    if(H5Odisable_mdc_flushes(did) < 0 )
+        TEST_ERROR;
+
+    /* Attach and write to an attribute to the dataset: DSET */
+    if((aid = H5Acreate2(did, ATTR, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) 
+        TEST_ERROR;
+
+    /* Verify cork status of the dataset: DSET */
+    if(verify_cork_tag(fid, oinfo.addr, TRUE) < 0 ) 
+        TEST_ERROR;
+
+    /* Close the attribute */
+    if(H5Aclose(aid) < 0) 
+        TEST_ERROR;
+
+    /* Verify cork status of the dataset: DSET */
+    if(verify_cork_tag(fid, oinfo.addr, TRUE) < 0 ) 
+        TEST_ERROR;
+    
+    /* Create dcpl */
+    if((dcpl2 = H5Pcreate(H5P_DATASET_CREATE)) < 0 )
+        TEST_ERROR;
+    /* Set to early allocation for dataset space */
+    if(H5Pset_alloc_time(dcpl2, H5D_ALLOC_TIME_EARLY) < 0) 
+        TEST_ERROR
+
+    /* Create chunked dataset with implicit indexing: DSET_NONE */
+    if(H5Pset_chunk(dcpl2, 1, chunk_dim) < 0)
+        FAIL_STACK_ERROR
+    if((sid2 = H5Screate_simple(1, dim, NULL)) < 0) 
+        TEST_ERROR;
+    if((did2 = H5Dcreate2(fid, DSET_NONE, H5T_NATIVE_INT, sid2, H5P_DEFAULT, dcpl2, H5P_DEFAULT)) < 0 ) 
+        TEST_ERROR;
+
+    /* Get dataset object header address */
+    if(H5Oget_info(did2, &oinfo2) < 0 )
+        TEST_ERROR;
+
+    /* Cork the dataset: DSET_NONE */
+    if(H5Odisable_mdc_flushes(did2) < 0 )
+        TEST_ERROR;
+
+    /* Attach 8 attributes to the dataset */
+    for(i = 0;i < 8; i++) {
+        sprintf(attrname, "attr %d", i);
+        if((aid = H5Acreate2(did2, attrname, H5T_NATIVE_UINT, sid2, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) 
+            TEST_ERROR;
+        if(H5Awrite(aid, H5T_NATIVE_UINT, &i) < 0 )
+            TEST_ERROR;
+        if(H5Aclose(aid) < 0 )
+            TEST_ERROR;
+    } /* end for */
+
+    /* Verify cork status of the dataset: DSET_NONE */
+    if(verify_cork_tag(fid, oinfo2.addr, TRUE) < 0) 
+        TEST_ERROR
+
+    /* Closing */
+    if(H5Oclose(did) < 0 ) TEST_ERROR;
+    if(H5Oclose(did2) < 0 ) TEST_ERROR;
+    if(H5Sclose(sid) < 0 ) TEST_ERROR;
+    if(H5Sclose(sid2) < 0 ) TEST_ERROR;
+    if(H5Pclose(dcpl2) < 0 ) TEST_ERROR;
+    if(H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* Re-open the file */
+    flags = H5F_ACC_RDWR;
+    if(swmr)
+        flags |= H5F_ACC_SWMR_WRITE;
+    if((fid = H5Fopen(FILENAME, flags, fapl)) < 0) 
+        TEST_ERROR;
+
+    /* Open the dataset object: DSET_NONE */
+    if((oid = H5Oopen(fid, DSET_NONE, H5P_DEFAULT)) < 0) 
+        TEST_ERROR;
+
+    /* Verify cork status of the dataset: DSET */
+    if(verify_cork_tag(fid, oinfo2.addr, FALSE) < 0 ) 
+        TEST_ERROR;
+
+    /* Open the attribute attached to the dataset object: DSET_NONE */
+    if((aid = H5Aopen_by_idx(oid, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)4, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) 
+        TEST_ERROR;
+
+    /* Cork the dataset: DSET_NONE */
+    if(H5Odisable_mdc_flushes(oid) < 0) TEST_ERROR
+
+    /* Verify cork status of the dataset: DSET_NONE */
+    if(verify_cork_tag(fid, oinfo2.addr, TRUE) < 0 ) 
+        TEST_ERROR;
+
+    /* Close the attribute */
+    if(H5Aclose(aid) < 0 ) TEST_ERROR;
+
+    /* Verify cork status of the dataset: DSET */
+    if(verify_cork_tag(fid, oinfo.addr, TRUE) < 0 ) 
+        TEST_ERROR;
+
+    /* Closing */
+    if(H5Oclose(oid) < 0 ) TEST_ERROR;
+    if(H5Pclose(fapl) < 0 ) TEST_ERROR;
+    if(H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Aclose(aid);
+        H5Sclose(sid);
+        H5Sclose(sid2);
+        H5Dclose(did);
+        H5Dclose(did2);
+        H5Oclose(oid);
+        H5Pclose(dcpl2);
+        H5Pclose(fapl);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    return 1;
+} /* verify_obj_dset_cork */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    verify_dset_cork
+ *
+ * Purpose:     This function verifies corking operations for chunked datasets
+ *      with different indexing types.
+ *      Cache entries associated with the object tag are checked
+ *              for the correct cork status.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Vailin Choi; Feb 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+verify_dset_cork(hbool_t swmr, hbool_t new_format)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;                     /* File ID */
+    hid_t fapl = -1;                    /* File access property list */
+    hid_t did = -1, did2 = -1, did3 = -1;   /* Dataset IDs */
+    hid_t dcpl = -1;                    /* Dataset creation property list */
+    hid_t sid = -1, sid2 = -1, sid3 = -1;   /* Dataspace IDs */
+    hsize_t dims[2] = {100, 20};        /* Dataset dimension sizes */
+    hsize_t max_dims[2] = {100, H5S_UNLIMITED}; /* Dataset maximum dimension sizes */
+    hsize_t chunk_dims[2] = {2, 5};     /* Dataset chunked dimension sizes */
+    int buf[100][20]; int i = 0, j = 0;         /* Data buffer */
+    H5O_info_t oinfo, oinfo2, oinfo3;       /* Object metadata information */
+    unsigned flags;             /* File access flags */
+
+    /* Testing Macro */
+    if(swmr) {
+        if(new_format) {
+            TESTING("cork status for chunked datasets with different indexing types (SWMR & latest)");
+        } else {
+            TESTING("cork status for chunked datasets with different indexing types (SWMR & non-latest)");
+        } /* end if */
+    } else {
+        TESTING("cork status for chunked datasets with different indexing types (non-SWMR)");
+    } /* end if */
+
+    /* Create fapl */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0 ) 
+        TEST_ERROR;
+    if(new_format) {
+        /* Set to use latest format */
+        if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0 ) 
+            TEST_ERROR;
+    } /* end if */
+
+    /* Create the file */
+    flags = H5F_ACC_TRUNC;
+    if(swmr)
+        flags |= H5F_ACC_SWMR_WRITE;
+    if((fid = H5Fcreate(FILENAME, flags, H5P_DEFAULT, fapl)) < 0 ) 
+        TEST_ERROR;
+
+    /* Create dcpl */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set to use chunked dataset */
+    if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0) FAIL_STACK_ERROR
+
+    /* Create chunked dataset with extensive array indexing: DSET_EA */
+    if((sid = H5Screate_simple(2, dims, max_dims)) < 0) 
+        TEST_ERROR;
+    if((did = H5Dcreate2(fid, DSET_EA, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0 ) 
+        TEST_ERROR;
+    
+    /* Get dataset object header address: DSET_EA */
+    if(H5Oget_info(did, &oinfo) < 0 ) TEST_ERROR;
+    
+    /* Cork the dataset: DSET_EA */
+    if(H5Odisable_mdc_flushes(did) < 0 ) TEST_ERROR;
+
+    /* Verify cork status */
+    if(verify_cork_tag(fid, oinfo.addr, TRUE) < 0 ) 
+        TEST_ERROR;
+
+    /* Create chunked dataset with fixed array indexing: DSET_FA */
+    if((sid2 = H5Screate_simple(2, dims, NULL)) < 0) 
+        TEST_ERROR;
+    if((did2 = H5Dcreate2(fid, DSET_FA, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) 
+        TEST_ERROR;
+
+    /* Get dataset object header address: DSET_FA */
+    if(H5Oget_info(did2, &oinfo2) < 0 ) 
+        TEST_ERROR;
+    
+    /* Cork the dataset: DSET_FA */
+    if(H5Odisable_mdc_flushes(did2) < 0 ) TEST_ERROR;
+
+    /* Uncork the dataset: DSET_EA */
+    if(H5Oenable_mdc_flushes(did) < 0 ) TEST_ERROR;
+
+    /* Verify the cork status for DSET_FA */
+    if(verify_cork_tag(fid, oinfo2.addr, TRUE) < 0 ) 
+        TEST_ERROR;
+
+    /* Verify the cork status for DSET_EA */
+    if(verify_cork_tag(fid, oinfo.addr, FALSE) < 0 ) 
+        TEST_ERROR;
+
+    /* Create chunked dataset with v2-Btree indexing */
+    max_dims[0] = H5S_UNLIMITED;
+    if((sid3 = H5Screate_simple(2, dims, max_dims)) < 0) 
+        TEST_ERROR;
+    if((did3 = H5Dcreate2(fid, DSET_BT2, H5T_NATIVE_INT, sid3, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0 ) 
+        TEST_ERROR;
+
+    /* Get dataset object header address: DSET_BT2 */
+    if(H5Oget_info(did3, &oinfo3) < 0 ) 
+        TEST_ERROR;
+
+    /* Cork the dataset: DSET_BT2 */
+    if(H5Odisable_mdc_flushes(did3) < 0 ) TEST_ERROR;
+
+    /* Verify the cork status for DSET_BT2 */
+    if(verify_cork_tag(fid, oinfo3.addr, TRUE) < 0 ) 
+        TEST_ERROR;
+
+    /* Closing */
+    if(H5Dclose(did3) < 0 ) TEST_ERROR;
+    if(H5Sclose(sid3) < 0 ) TEST_ERROR;
+
+    if(H5Dclose(did2) < 0 ) TEST_ERROR;
+    if(H5Sclose(sid2) < 0 ) TEST_ERROR;
+
+    if(H5Dclose(did) < 0 ) TEST_ERROR;
+    if(H5Sclose(sid) < 0 ) TEST_ERROR;
+
+    if(H5Pclose(dcpl) < 0 ) TEST_ERROR;
+    if(H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* Reopen the file */
+    flags = H5F_ACC_RDWR;
+    if(swmr)
+        flags |= H5F_ACC_SWMR_WRITE;
+    if((fid = H5Fopen(FILENAME, flags, fapl)) < 0 ) TEST_ERROR;
+
+    /* Initialize data buffer */
+    for(i = 0; i < (int)dims[0]; i++) {
+        for(j = 0; j < (int)dims[1]; j++) {
+            buf[i][j] = (i + 1) * (j + 1);
+        } /* end for */
+    } /* end for */
+
+    /* Open and write to the dataset: DSET_EA */
+    if((did = H5Dopen2(fid, DSET_EA, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+        TEST_ERROR;
+
+    /* Verify the cork status for DSET_EA */
+    if(verify_cork_tag(fid, oinfo.addr, FALSE) < 0 ) 
+        TEST_ERROR;
+
+    /* Open and write to the dataset: DSET_FA */
+    if((did2 = H5Dopen2(fid, DSET_FA, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if(H5Dwrite(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+        TEST_ERROR;
+
+    /* Cork the dataset: DSET_FA */
+    if(H5Odisable_mdc_flushes(did2) < 0 ) TEST_ERROR;
+
+    /* Verify the cork status for DSET_FA */
+    if(verify_cork_tag(fid, oinfo2.addr, TRUE) < 0 ) 
+        TEST_ERROR;
+
+    /* Open and write to the dataset: DSET_BT2 */
+    if((did3 = H5Dopen2(fid, DSET_BT2, H5P_DEFAULT)) < 0 ) TEST_ERROR;
+    if(H5Dwrite(did3, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+        TEST_ERROR;
+
+    /* Verify the cork status for DSET_BT2 */
+    if(verify_cork_tag(fid, oinfo3.addr, FALSE) < 0 ) 
+        TEST_ERROR;
+
+    /* Cork the dataset: DSET_BT2 */
+    if(H5Odisable_mdc_flushes(did3) < 0 ) TEST_ERROR;
+
+    /* Verify the cork status for DSET_BT2 */
+    if(verify_cork_tag(fid, oinfo3.addr, TRUE) < 0 ) 
+        TEST_ERROR;
+
+    /* Closing */
+    if(H5Dclose(did) < 0 ) TEST_ERROR;
+    if(H5Dclose(did2) < 0 ) TEST_ERROR;
+    if(H5Dclose(did3) < 0 ) TEST_ERROR;
+    if(H5Pclose(fapl) < 0 ) TEST_ERROR;
+    if(H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Sclose(sid);
+        H5Sclose(sid2);
+        H5Sclose(sid3);
+        H5Dclose(did);
+        H5Dclose(did2);
+        H5Dclose(did3);
+        H5Pclose(dcpl);
+        H5Pclose(fapl);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    return 1;
+} /* verify_dset_cork */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    verify_group_cork
+ *
+ * Purpose:     This function verifies corking operations for groups.
+ *      Cache entries associated with the object tag are checked
+ *              for the correct cork status.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Vailin Choi; Feb 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+verify_group_cork(hbool_t swmr)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;                     /* File ID */
+    hid_t fapl = -1;                    /* File access property list */
+    hid_t gid = -1, gid2 = -1, gid3 = -1;   /* Group IDs */
+    H5O_info_t oinfo, oinfo2, oinfo3;       /* Object metadata information */
+    hid_t aid;                  /* Attribute ID */
+    hid_t sid;                  /* Dataspace ID */
+    char attrname[500];                 /* Name of attribute */
+    unsigned flags;             /* File access flags */
+    int i = 0;                          /* Local index variable */
+
+    /* Testing Macro */
+    if(swmr) {
+    TESTING("cork status for groups (SWMR)");
+    } else {
+    TESTING("cork status for groups");
+    }
+
+    /* Create fapl */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0 ) 
+    TEST_ERROR;
+    /* Set to use latest format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0 ) 
+    TEST_ERROR;
+
+    /* Create the file */
+    flags = H5F_ACC_TRUNC;
+    if(swmr)
+    flags |= H5F_ACC_SWMR_WRITE;
+    if((fid = H5Fcreate(FILENAME, flags, H5P_DEFAULT, fapl)) < 0 ) 
+    TEST_ERROR;
+
+    /* Create 3 groups */
+    if((gid = H5Gcreate2(fid, GRP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) 
+    TEST_ERROR;
+    if((gid2 = H5Gcreate2(gid, GRP2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) 
+    TEST_ERROR;
+    if((gid3 = H5Gcreate2(gid2, GRP3, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) 
+    TEST_ERROR;
+
+    /* Cork the second group: GRP2 */
+    if(H5Odisable_mdc_flushes(gid2) < 0) TEST_ERROR
+
+    /* Get group object header addresses */
+    if(H5Oget_info(gid, &oinfo) < 0) TEST_ERROR;
+    if(H5Oget_info(gid2, &oinfo2) < 0) TEST_ERROR;
+    if(H5Oget_info(gid3, &oinfo3) < 0) TEST_ERROR;
+
+    /* Verify cork status of the groups */
+    if(verify_cork_tag(fid, oinfo.addr, FALSE) < 0) 
+    TEST_ERROR;
+    if(verify_cork_tag(fid, oinfo2.addr, TRUE) < 0) 
+    TEST_ERROR;
+    if(verify_cork_tag(fid, oinfo3.addr, FALSE) < 0) 
+    TEST_ERROR;
+    
+    /* Close the second group: GRP2 */
+    if(H5Gclose(gid2) < 0 ) TEST_ERROR;
+
+    /* Re-open the second group: GRP2 */
+    if((gid2 = H5Gopen2(gid, GRP2, H5P_DEFAULT)) < 0) 
+    FAIL_STACK_ERROR
+
+    /* Verify cork status of the second group: GRP2 */
+    if(verify_cork_tag(fid, oinfo2.addr, FALSE) < 0) 
+    TEST_ERROR;
+
+    /* Closing */
+    if(H5Gclose(gid) < 0 ) TEST_ERROR;
+    if(H5Gclose(gid2) < 0 ) TEST_ERROR;
+    if(H5Gclose(gid3) < 0 ) TEST_ERROR;
+    if(H5Fclose(fid) < 0 ) TEST_ERROR;
+
+    /* Re-open the file and the three groups */
+    flags = H5F_ACC_RDWR;
+    if(swmr)
+    flags |= H5F_ACC_SWMR_WRITE;
+    if((fid = H5Fopen(FILENAME, flags, fapl)) < 0 ) 
+    FAIL_STACK_ERROR
+    if((gid = H5Gopen2(fid, GRP, H5P_DEFAULT)) < 0) 
+    FAIL_STACK_ERROR
+    if((gid2 = H5Gopen2(gid, GRP2, H5P_DEFAULT)) < 0) 
+    FAIL_STACK_ERROR
+    if((gid3 = H5Gopen2(gid2, GRP3, H5P_DEFAULT)) < 0) 
+    FAIL_STACK_ERROR
+
+    /* Create dataspace */
+    if((sid = H5Screate(H5S_SCALAR)) < 0 ) TEST_ERROR;
+
+    /* Attach 8 attributes to the third group: GRP3 */
+    for(i = 0;i < 8; i++) {
+        sprintf(attrname, "attr %d", i);
+        if((aid = H5Acreate2(gid3, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) 
+        TEST_ERROR;
+        if(H5Awrite(aid, H5T_NATIVE_UINT, &i) < 0)
+        TEST_ERROR;
+    /* Cork the third group while attaching attributes */
+    if(i == 3) {
+        if(H5Odisable_mdc_flushes(gid3) < 0) TEST_ERROR
+        if(verify_cork_tag(fid, oinfo3.addr, TRUE) < 0) 
+        TEST_ERROR;
+    }
+        if(H5Aclose(aid) < 0 ) TEST_ERROR;
+    } /* end for */
+
+    /* Verify cork status of the third group: GRP3 */
+    if(verify_cork_tag(fid, oinfo3.addr, TRUE) < 0) 
+    TEST_ERROR;
+
+    /* Closing */
+    if(H5Gclose(gid) < 0) TEST_ERROR;
+    if(H5Gclose(gid2) < 0) TEST_ERROR;
+    if(H5Gclose(gid3) < 0) TEST_ERROR;
+    if(H5Sclose(sid) < 0) TEST_ERROR;
+    if(H5Pclose(fapl) < 0) TEST_ERROR;
+    if(H5Fclose(fid) < 0) TEST_ERROR;
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+    H5Gclose(gid);
+    H5Gclose(gid2);
+    H5Gclose(gid3);
+    H5Sclose(sid);
+        H5Pclose(fapl);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    return 1;
+} /* verify_group_cork */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    verify_named_cork
+ *
+ * Purpose:     This function verifies corking operations for named datatypes.
+ *      Cache entries associated with the object tag are checked
+ *              for the correct cork status.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Vailin Choi; Feb 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+verify_named_cork(hbool_t swmr)
+{
+    /* Variable Declarations */
+    hid_t fid = -1;                     /* File ID */
+    hid_t fapl = -1;                    /* File access property list */
+    hid_t tid = -1, tid2 = -1, tid3 = -1;   /* Datatype IDs */
+    hid_t gid = -1, gid2 = -1;          /* Group IDs */
+    H5O_info_t oinfo, oinfo2, oinfo3, oinfo4;   /* Object metadata information */
+    hid_t aid = -1;             /* Attribute ID */
+    hid_t sid;                  /* Dataspace ID */
+    hid_t did;                  /* Dataset ID */
+    char attrname[500];                 /* Name of attribute */
+    unsigned flags;             /* File access flags */
+    int i = 0;                          /* Local index variable */
+
+    /* Testing Macro */
+    if(swmr) {
+    TESTING("cork status for named datatypes (SWMR)");
+    } else {
+    TESTING("cork status for named datatypes");
+    }
+
+    /* Create fapl */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0 ) 
+    TEST_ERROR;
+    /* Set to use latest format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0 ) 
+    TEST_ERROR;
+
+    /* Create the file */
+    flags = H5F_ACC_TRUNC;
+    if(swmr)
+    flags |= H5F_ACC_SWMR_WRITE;
+    if((fid = H5Fcreate(FILENAME, flags, H5P_DEFAULT, fapl)) < 0 ) 
+    TEST_ERROR;
+
+    /* Create 3 copies of datatypes */
+    if((tid = H5Tcopy(H5T_NATIVE_INT)) < 0) TEST_ERROR;
+    if((tid2 = H5Tcopy(H5T_NATIVE_LONG)) < 0) TEST_ERROR;
+    if((tid3 = H5Tcopy(H5T_NATIVE_CHAR)) < 0) TEST_ERROR;
+
+    /* Commit datatype /DT */
+    if(H5Tcommit2(fid, DT, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0) 
+    TEST_ERROR;
+
+    /* Create /GRP */
+    if((gid = H5Gcreate2(fid, GRP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) 
+    TEST_ERROR;
+    /* Commit datatype /GRP/DT2 */
+    if(H5Tcommit2(gid, DT2, tid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0) 
+    TEST_ERROR;
+
+    /* Create /GRP/GRP2 */
+    if((gid2 = H5Gcreate2(gid, GRP2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) 
+    TEST_ERROR;
+    /* Commit datatype /GRP/GRP2/DT3 */
+    if(H5Tcommit2(gid2, DT3, tid3, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0) 
+    TEST_ERROR;
+
+    /* Cork 2 named datatypes: /DT and /GRP/GRP2/DT3 */
+    if(H5Odisable_mdc_flushes(tid) < 0) TEST_ERROR
+    if(H5Odisable_mdc_flushes(tid3) < 0) TEST_ERROR
+
+    /* Get named datatype object header addresses */
+    if(H5Oget_info(tid, &oinfo) < 0) TEST_ERROR;
+    if(H5Oget_info(tid2, &oinfo2) < 0) TEST_ERROR;
+    if(H5Oget_info(tid3, &oinfo3) < 0) TEST_ERROR;
+
+    /* Verify cork status of the named datatypes */
+    if(verify_cork_tag(fid, oinfo.addr, TRUE) < 0) 
+    TEST_ERROR;
+    if(verify_cork_tag(fid, oinfo2.addr, FALSE) < 0) 
+    TEST_ERROR;
+    if(verify_cork_tag(fid, oinfo3.addr, TRUE) < 0) 
+    TEST_ERROR;
+
+    /* Close the datatypes */
+    if(H5Tclose(tid) < 0 ) TEST_ERROR;
+    if(H5Tclose(tid2) < 0 ) TEST_ERROR;
+    if(H5Tclose(tid3) < 0 ) TEST_ERROR;
+
+    /* Re-open the named datatypes */
+    if((tid = H5Topen2(fid, DT, H5P_DEFAULT)) < 0) 
+    FAIL_STACK_ERROR
+    if((tid2 = H5Topen2(gid, DT2, H5P_DEFAULT)) < 0) 
+    FAIL_STACK_ERROR
+    if((tid3 = H5Topen2(gid2, DT3, H5P_DEFAULT)) < 0) 
+    FAIL_STACK_ERROR
+
+    /* Verify cork status of the named datatypes */
+    if(verify_cork_tag(fid, oinfo.addr, FALSE) < 0) 
+    TEST_ERROR;
+    if(verify_cork_tag(fid, oinfo2.addr, FALSE) < 0) 
+    TEST_ERROR;
+    if(verify_cork_tag(fid, oinfo3.addr, FALSE) < 0) 
+    TEST_ERROR;
+
+    /* Closing */
+    if(H5Tclose(tid) < 0 ) TEST_ERROR;
+    if(H5Tclose(tid2) < 0 ) TEST_ERROR;
+    if(H5Tclose(tid3) < 0 ) TEST_ERROR;
+    if(H5Gclose(gid) < 0 ) TEST_ERROR;
+    if(H5Gclose(gid2) < 0 ) TEST_ERROR;
+    if(H5Fclose(fid) < 0 ) TEST_ERROR;
+
+
+    /* Re-open the file and the three groups */
+    flags = H5F_ACC_RDWR;
+    if(swmr)
+    flags |= H5F_ACC_SWMR_WRITE;
+    if((fid = H5Fopen(FILENAME, flags, fapl)) < 0 ) 
+    FAIL_STACK_ERROR
+    if((gid = H5Gopen2(fid, GRP, H5P_DEFAULT)) < 0) 
+    FAIL_STACK_ERROR
+    if((gid2 = H5Gopen2(gid, GRP2, H5P_DEFAULT)) < 0) 
+    FAIL_STACK_ERROR
+
+    /* Re-open the named datatypes */
+    if((tid = H5Topen2(fid, DT, H5P_DEFAULT)) < 0) 
+    FAIL_STACK_ERROR
+    if((tid2 = H5Topen2(gid, DT2, H5P_DEFAULT)) < 0) 
+    FAIL_STACK_ERROR
+    if((tid3 = H5Topen2(gid2, DT3, H5P_DEFAULT)) < 0) 
+    FAIL_STACK_ERROR
+
+    /* Cork the datatype: DT2 */
+    if(H5Odisable_mdc_flushes(tid2) < 0) TEST_ERROR
+
+    /* Create dataspace */
+    if((sid = H5Screate(H5S_SCALAR)) < 0 ) TEST_ERROR;
+
+    /* Attach 8 attributes to datatype: DT3 */
+    for(i = 0;i < 8; i++) {
+        sprintf(attrname, "attr %d", i);
+        if((aid = H5Acreate2(tid3, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0 ) 
+        TEST_ERROR;
+        if(H5Awrite(aid, H5T_NATIVE_UINT, &i) < 0)
+        TEST_ERROR;
+    /* Cork the datatype while attaching attributes */
+    if(i == 3) {
+        if(H5Odisable_mdc_flushes(tid3) < 0) TEST_ERROR
+        if(verify_cork_tag(fid, oinfo3.addr, TRUE) < 0) 
+        TEST_ERROR;
+    }
+        if(H5Aclose(aid) < 0 ) TEST_ERROR;
+    } /* end for */
+
+    /* Create a dataset with named datatype: DT */
+    if((did = H5Dcreate2(fid, DSET, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) 
+        FAIL_STACK_ERROR
+
+    /* Get dataset object header address */
+    if(H5Oget_info(did, &oinfo4) < 0) TEST_ERROR;
+
+    /* Cork the dataset: DSET */
+    if(H5Odisable_mdc_flushes(did) < 0) TEST_ERROR
+
+    /* Verify cork status of the datatype: DT */
+    if(verify_cork_tag(fid, oinfo.addr, FALSE) < 0) 
+    TEST_ERROR;
+    /* Verify cork status of the datatype: DT2 */
+    if(verify_cork_tag(fid, oinfo2.addr, TRUE) < 0) 
+    TEST_ERROR;
+    /* Verify cork status of the datatype: DT3 */
+    if(verify_cork_tag(fid, oinfo3.addr, TRUE) < 0) 
+    TEST_ERROR;
+
+    /* Un-cork the datatype: DT3 */
+    if(H5Oenable_mdc_flushes(tid3) < 0) TEST_ERROR
+    /* Verify cork status of the datatype: DT3 */
+    if(verify_cork_tag(fid, oinfo3.addr, FALSE) < 0) 
+    TEST_ERROR;
+
+    /* Cork the datatype: DT */
+    if(H5Odisable_mdc_flushes(tid) < 0) TEST_ERROR
+
+    /* Verify cork status of the datatype: DT */
+    if(verify_cork_tag(fid, oinfo.addr, TRUE) < 0) 
+    TEST_ERROR;
+    /* Verify cork status of the datatype: DT2 */
+    if(verify_cork_tag(fid, oinfo2.addr, TRUE) < 0) 
+    TEST_ERROR;
+
+    /* Verify cork status of the dataset: DSET */
+    if(verify_cork_tag(fid, oinfo4.addr, TRUE) < 0) 
+    TEST_ERROR;
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+    /* Verify cork status of the datatype: DT */
+    if(verify_cork_tag(fid, oinfo.addr, TRUE) < 0) 
+    TEST_ERROR;
+
+    /* Verify cork status of the dataset: DSET */
+    if(verify_cork_tag(fid, oinfo4.addr, FALSE) < 0) 
+    TEST_ERROR;
+
+    /* Closing */
+    if(H5Tclose(tid) < 0 ) TEST_ERROR;
+    if(H5Tclose(tid2) < 0 ) TEST_ERROR;
+    if(H5Tclose(tid3) < 0 ) TEST_ERROR;
+    if(H5Gclose(gid) < 0 ) TEST_ERROR;
+    if(H5Gclose(gid2) < 0 ) TEST_ERROR;
+    if(H5Sclose(sid) < 0 ) TEST_ERROR;
+    if(H5Fclose(fid) < 0 ) TEST_ERROR;
+    if(H5Pclose(fapl) < 0) TEST_ERROR;
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+    H5Tclose(tid);
+    H5Tclose(tid2);
+    H5Tclose(tid3);
+    H5Gclose(gid);
+    H5Gclose(gid2);
+    H5Dclose(did);
+        H5Pclose(fapl);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    return 1;
+} /* verify_named_cork */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    verify_multiple_cork
+ *
+ * Purpose:     This function verifies corking operations when there are
+ *      multiple opens of files, objects, attributes.
+ *      (based on test_attr_bug5() in tattr.c)
+ *      Cache entries associated with the object tag are checked
+ *              for the correct cork status.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Vailin Choi; Feb 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+verify_multiple_cork(hbool_t swmr)
+{
+    /* Variable Declarations */
+    hid_t fid1 = -1, fid2 = -1;     /* File ID */
+    hid_t fapl = -1;                /* File access property list */
+    hid_t tid1 = -1, tid2 = -1;     /* Datatype IDs */
+    hid_t gid1 = -1, gid2 = -1;     /* Group IDs */
+    hid_t did1 = -1, did2 = -1;     /* Dataset ID */
+    hid_t aidg1 = -1, aidg2 = -1;   /* Attribute ID */
+    hid_t aidd1 = -1, aidd2 = -1;   /* Attribute ID */
+    hid_t aidt1 = -1, aidt2 = -1;   /* Attribute ID */
+    hid_t sid = -1;         /* Dataspace ID */
+    H5O_info_t oinfo1, oinfo2, oinfo3;  /* Object metadata information */
+    hsize_t dim[1] = {5};       /* Dimension sizes */
+    unsigned flags;         /* File access flags */
+    hbool_t corked;         /* Cork status */
+    herr_t ret;                     /* Return value */
+
+    /* Testing Macro */
+    if(swmr) {
+    TESTING("cork status for multiple opens (SWMR)");
+    } else {
+    TESTING("cork status for multiple opens");
+    }
+
+    /* Create fapl */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0 ) 
+    TEST_ERROR
+    /* Set to use latest format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0 ) 
+    TEST_ERROR
+
+    /* Create the file */
+    flags = H5F_ACC_TRUNC;
+    if(swmr)
+    flags |= H5F_ACC_SWMR_WRITE;
+    if((fid1 = H5Fcreate(FILENAME, flags, H5P_DEFAULT, fapl)) < 0 ) 
+    TEST_ERROR
+
+    /* Open root group */
+    if((gid1 = H5Gopen2(fid1, "/", H5P_DEFAULT)) < 0)
+    TEST_ERROR
+
+    /* Create and commit datatype */
+    if((tid1 = H5Tcopy(H5T_STD_I32LE)) < 0)
+    TEST_ERROR
+    if(H5Tcommit2(fid1, DT, tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0)
+    TEST_ERROR
+
+    /* Create dataset */
+    if((sid = H5Screate_simple(1, dim, NULL)) < 0)
+    TEST_ERROR
+    if((did1 = H5Dcreate2(fid1, DSET, tid1, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+    TEST_ERROR
+
+    /* Create attribute on root group */
+    if((aidg1 = H5Acreate2(gid1, GRP_ATTR, tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+    TEST_ERROR
+
+    /* Create attribute on dataset */
+    if((aidd1 = H5Acreate2(did1, DSET_ATTR, tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+    TEST_ERROR
+
+    /* Create attribute on datatype */
+    if((aidt1 = H5Acreate2(tid1, DT_ATTR, tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+    TEST_ERROR
+
+    /* Closing */
+    if(H5Aclose(aidt1) < 0) TEST_ERROR
+    if(H5Aclose(aidd1) < 0) TEST_ERROR
+    if(H5Aclose(aidg1) < 0) TEST_ERROR
+    if(H5Dclose(did1) < 0) TEST_ERROR
+    if(H5Tclose(tid1) < 0) TEST_ERROR
+    if(H5Gclose(gid1) < 0) TEST_ERROR
+    if(H5Fclose(fid1) < 0) TEST_ERROR
+    if(H5Sclose(sid) < 0) TEST_ERROR
+
+    /* Open the file twice: fid1, fid2 */
+    flags = H5F_ACC_RDWR;
+    if(swmr)
+    flags |= H5F_ACC_SWMR_WRITE;
+    if((fid1 = H5Fopen(FILENAME, flags, fapl)) < 0)
+    TEST_ERROR
+    if((fid2 = H5Fopen(FILENAME, flags, fapl)) < 0)
+    TEST_ERROR
+
+    /* Open the root group twice: gid1, gid2 */
+    if((gid1 = H5Gopen2(fid1, "/", H5P_DEFAULT)) < 0)
+    TEST_ERROR
+    if((gid2 = H5Gopen2(fid2, "/", H5P_DEFAULT)) < 0)
+    TEST_ERROR
+
+    /* Open the root group attribute twice: aidg1, aidg2 */
+    if((aidg1 = H5Aopen(gid1, GRP_ATTR, H5P_DEFAULT)) < 0)
+    TEST_ERROR
+    if((aidg2 = H5Aopen(gid2, GRP_ATTR, H5P_DEFAULT)) < 0)
+    TEST_ERROR
+
+    /* Cork the group: gid2 */
+    if(H5Odisable_mdc_flushes(gid2) < 0)
+    TEST_ERROR
+
+    /* Verify cork status of the group: gid2 */
+    if(H5Oget_info(gid2, &oinfo1) < 0) TEST_ERROR;
+    if(verify_cork_tag(fid2, oinfo1.addr, TRUE) < 0) 
+    TEST_ERROR
+
+    /* Check cork status of the group: gid1 */
+    if(H5Oare_mdc_flushes_disabled(gid1, &corked) < 0)
+    TEST_ERROR;
+    if(!corked) TEST_ERROR
+
+    /* Open the dataset twice: did1, did2 */
+    if((did1 = H5Dopen2(fid1, DSET, H5P_DEFAULT)) < 0)
+    TEST_ERROR
+    if((did2 = H5Dopen2(fid2, DSET, H5P_DEFAULT)) < 0)
+    TEST_ERROR
+
+    /* Open the dataset attribute twice: aidd1, aidd2 */
+    if((aidd1 = H5Aopen(did1, DSET_ATTR, H5P_DEFAULT)) < 0)
+    TEST_ERROR
+    if((aidd2 = H5Aopen(did2, DSET_ATTR, H5P_DEFAULT)) < 0)
+    TEST_ERROR
+
+    /* Cork the dataset: did1 */
+    if(H5Odisable_mdc_flushes(did1) < 0)
+    TEST_ERROR
+
+    /* Verify cork status of the dataset: did1 */
+    if(H5Oget_info(did1, &oinfo2) < 0) TEST_ERROR;
+    if(verify_cork_tag(fid1, oinfo2.addr, TRUE) < 0) 
+    TEST_ERROR
+
+    /* Check cork status of the dataset: did2 */
+    if(H5Oare_mdc_flushes_disabled(did2, &corked) < 0)
+    TEST_ERROR;
+    if(!corked) TEST_ERROR
+
+    /* Open the datatype twice: tid1, tid2 */
+    if((tid1 = H5Topen2(fid1, DT, H5P_DEFAULT)) < 0)
+    TEST_ERROR
+    if((tid2 = H5Topen2(fid2, DT, H5P_DEFAULT)) < 0)
+    TEST_ERROR
+
+    /* Open the datatype attribute twice: aidt1, aidt2 */
+    if((aidt1 = H5Aopen(tid1, DT_ATTR, H5P_DEFAULT)) < 0)
+    TEST_ERROR
+    if((aidt2 = H5Aopen(tid2, DT_ATTR, H5P_DEFAULT)) < 0)
+    TEST_ERROR
+
+    /* Cork the datatype: tid2 */
+    if(H5Odisable_mdc_flushes(tid2) < 0)
+    TEST_ERROR
+
+    /* Verify cork status of the datatype: tid2 */
+    if(H5Oget_info(tid2, &oinfo3) < 0) TEST_ERROR;
+    if(verify_cork_tag(fid2, oinfo3.addr, TRUE) < 0) 
+    TEST_ERROR;
+
+    /* Check cork status of the datatype: tid1 */
+    if(H5Oare_mdc_flushes_disabled(tid1, &corked) < 0)
+    TEST_ERROR;
+    if(!corked) TEST_ERROR
+
+    /* Uncork the group: gid1 */
+    if(H5Oenable_mdc_flushes(gid1) < 0)
+    TEST_ERROR
+
+    /* Verify cork status of the group: gid1 */
+    if(H5Oget_info(gid1, &oinfo1) < 0) TEST_ERROR;
+    if(verify_cork_tag(fid1, oinfo1.addr, FALSE) < 0) 
+    TEST_ERROR
+
+    /* Check cork status of the group: gid2 */
+    if(H5Oare_mdc_flushes_disabled(gid2, &corked) < 0)
+    TEST_ERROR;
+    if(corked) TEST_ERROR
+
+    /* Close the group: gid2 */
+    if(H5Gclose(gid2) < 0) TEST_ERROR
+
+    /* Check cork status of the group: gid1 */
+    if(H5Oare_mdc_flushes_disabled(gid1, &corked) < 0)
+    TEST_ERROR;
+    if(corked) TEST_ERROR
+
+    /* Verify cork status of the group: gid1 */
+    if(verify_cork_tag(fid1, oinfo1.addr, FALSE) < 0) 
+    TEST_ERROR
+
+    /* Close the group: gid1 */
+    if(H5Gclose(gid1) < 0) TEST_ERROR
+
+    /* Uncork the dataset: gid2 */
+    if(H5Oenable_mdc_flushes(did2) < 0)
+    TEST_ERROR
+
+    /* Verify cork status of the dataset: did2 */
+    if(H5Oget_info(did2, &oinfo2) < 0) TEST_ERROR;
+    if(verify_cork_tag(fid2, oinfo2.addr, FALSE) < 0) 
+    TEST_ERROR
+
+    /* Check cork status of the dataset: did1 */
+    if(H5Oare_mdc_flushes_disabled(did1, &corked) < 0)
+    TEST_ERROR;
+    if(corked) TEST_ERROR
+
+    /* Close the dataset: did2 */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* Check cork status of the dataset: did1 */
+    if(H5Oare_mdc_flushes_disabled(did1, &corked) < 0)
+    TEST_ERROR;
+    if(corked) TEST_ERROR
+
+    /* Verify cork status of the dataset: did1 */
+    if(verify_cork_tag(fid1, oinfo2.addr, FALSE) < 0) 
+    TEST_ERROR
+
+    /* Close the dataset: did1 */
+    if(H5Dclose(did1) < 0) TEST_ERROR
+
+    /* Check cork status of the datatype: tid1 */
+    if(H5Oare_mdc_flushes_disabled(tid1, &corked) < 0)
+    TEST_ERROR;
+    if(!corked) TEST_ERROR
+
+    /* Close datatype: tid1 */
+    if(H5Tclose(tid1) < 0) TEST_ERROR
+
+    /* Check cork status of the datatype: tid2 */
+    if(H5Oare_mdc_flushes_disabled(tid2, &corked) < 0)
+    TEST_ERROR;
+    if(!corked) TEST_ERROR
+
+    /* Close datatype: tid2 */
+    if(H5Tclose(tid2) < 0) TEST_ERROR
+
+    /* Should fail to cork the attribute: aidg2; not an object */
+    H5E_BEGIN_TRY {
+    ret = H5Odisable_mdc_flushes(aidg2);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Should fail to uncork the attribute: aidd1; not an object */
+    H5E_BEGIN_TRY {
+    ret = H5Odisable_mdc_flushes(aidd1);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Should fail to check cork status of the attribute: aidt2; not an object */
+    H5E_BEGIN_TRY {
+    ret = H5Oare_mdc_flushes_disabled(aidt2, &corked);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Close all attributes */
+    if(H5Aclose(aidg1) < 0) TEST_ERROR
+    if(H5Aclose(aidg2) < 0) TEST_ERROR
+    if(H5Aclose(aidd1) < 0) TEST_ERROR
+    if(H5Aclose(aidd2) < 0) TEST_ERROR
+    if(H5Aclose(aidt1) < 0) TEST_ERROR
+    if(H5Aclose(aidt2) < 0) TEST_ERROR
+
+    /* Should fail to cork the file: fid1; not an object */
+    H5E_BEGIN_TRY {
+    ret = H5Oare_mdc_flushes_disabled(fid1, &corked);
+    ret = H5Odisable_mdc_flushes(fid1);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Should fail to uncork the file: fid2; not an object */
+    H5E_BEGIN_TRY {
+    ret = H5Oenable_mdc_flushes(fid2);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Closing */
+    if(H5Pclose(fapl) < 0) TEST_ERROR
+    if(H5Fclose(fid1) < 0) TEST_ERROR
+    if(H5Fclose(fid2) < 0) TEST_ERROR
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+    H5Tclose(tid1);
+    H5Tclose(tid2);
+    H5Gclose(gid1);
+    H5Gclose(gid2);
+    H5Dclose(did1);
+    H5Dclose(did2);
+    H5Aclose(aidg1);
+    H5Aclose(aidg2);
+    H5Aclose(aidd1);
+    H5Aclose(aidt1);
+    H5Aclose(aidt2);
+    H5Aclose(aidd2);
+        H5Pclose(fapl);
+        H5Fclose(fid1);
+        H5Fclose(fid1);
+    } H5E_END_TRY;
+    return 1;
+} /* verify_multiple_cork */
+
+/*-------------------------------------------------------------------------
+ * Function:    test_objs_cork
+ *
+ * Purpose:     This function verifies H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled public 
+ *      routines are working as specified.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Vailin Choi; Feb 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_objs_cork(hbool_t new_format)
+{
+    hid_t       fid;                    /* HDF5 File ID */
+    hid_t       fapl;                   /* File access property list */
+    hid_t       gid, did, tid;      /* Object IDs */
+    hid_t   sid;            /* Dataspace ID */
+    hid_t   aid;            /* Attribute ID */
+    hsize_t     dims[RANK];     /* Dataset dimension sizes */
+    hbool_t     corked;         /* Cork status of an object */
+    herr_t      ret;                    /* Return value */
+
+    /* Testing Macro */
+    if(new_format) {
+        TESTING("H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled (new library format)");
+    } else {
+        TESTING("H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled (old library format)");
+    } /* end if */
+
+    /* Create fapl */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0 ) 
+        TEST_ERROR;
+
+    /* Set to use latest format */
+    if(new_format) {
+        if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0 ) 
+            TEST_ERROR;
+    } /* end if */
+
+    /* Create an HDF5 file */
+    if((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create group */
+    if((gid = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Check cork status of the group: not corked */
+    if(H5Oare_mdc_flushes_disabled(gid, &corked) < 0)
+        TEST_ERROR
+    if(corked) TEST_ERROR
+
+    /* Cork the group: an object */
+    if(H5Odisable_mdc_flushes(gid) < 0)
+        TEST_ERROR
+
+    /* Check cork status of the group: corked */
+    if(H5Oare_mdc_flushes_disabled(gid, &corked) < 0)
+        TEST_ERROR
+    if(!corked) TEST_ERROR
+
+    /* Close the group */
+    if(H5Gclose(gid) < 0)
+        TEST_ERROR
+
+    /* Create a transient copy of a native type */
+    if((tid = H5Tcopy(H5T_NATIVE_INT)) < 0)
+        TEST_ERROR
+
+    /* Should fail to cork the datatype: not an object */
+    H5E_BEGIN_TRY {
+        ret = H5Odisable_mdc_flushes(tid);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Create a named datatype */
+    if(H5Tcommit2(fid, "group/datatype", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0)
+        TEST_ERROR
+
+    /* Check cork status of the named datatype: not corked */
+    if(H5Oare_mdc_flushes_disabled(tid, &corked) < 0)
+        TEST_ERROR
+    if(corked) TEST_ERROR
+
+    /* Cork the named datatype: an object */
+    if(H5Odisable_mdc_flushes(tid) < 0)
+        TEST_ERROR
+
+    /* Check cork status of the named datatype: corked */
+    if(H5Oare_mdc_flushes_disabled(tid, &corked) < 0)
+        TEST_ERROR
+    if(!corked) TEST_ERROR
+
+    /* Close the named datatype */
+    if(H5Tclose(tid) < 0)
+        TEST_ERROR
+
+    /* Create dataspace */
+    dims[0] = DIM0;
+    dims[1] = DIM1;
+    if((sid = H5Screate_simple(RANK, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Should fail to uncork the dataspace: not an object */
+    H5E_BEGIN_TRY {
+        ret = H5Oenable_mdc_flushes(sid);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Create dataset. */
+    if((did = H5Dcreate2(fid, "dataset", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Create attribute on the dataset */
+    if((aid = H5Acreate2(did, "attr", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Should fail to check cork status of the attribute: not an object */
+    H5E_BEGIN_TRY {
+        ret = H5Oare_mdc_flushes_disabled(aid, &corked);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Check cork status of the dataset: not corked */
+    if(H5Oare_mdc_flushes_disabled(did, &corked) < 0)
+        TEST_ERROR
+    if(corked) TEST_ERROR
+
+    /* Cork the dataset: an object */
+    if(H5Odisable_mdc_flushes(did) < 0)
+        TEST_ERROR
+
+    /* Check cork status of the dataset: corked */
+    if(H5Oare_mdc_flushes_disabled(did, &corked) < 0)
+        TEST_ERROR
+    if(!corked) TEST_ERROR
+
+    /* Close the dataset and dataspace */
+    if(H5Dclose(did) < 0)
+        TEST_ERROR
+
+    /* Open the group */
+    if((gid = H5Oopen(fid, "group", H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Check cork status of the group */
+    if(H5Oare_mdc_flushes_disabled(gid, &corked) < 0)
+        TEST_ERROR
+    if(corked) TEST_ERROR
+
+    /* Cork the group */
+    if(H5Odisable_mdc_flushes(gid) < 0)
+        TEST_ERROR
+
+    /* Should fail to cork the group again */
+    H5E_BEGIN_TRY {
+        ret = H5Odisable_mdc_flushes(gid);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Check cork status of the group */
+    if(H5Oare_mdc_flushes_disabled(gid, &corked) < 0)
+        TEST_ERROR
+    if(!corked) TEST_ERROR
+
+    /* Open the named datatype */
+    if((tid = H5Oopen(fid, "group/datatype", H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Check cork status of the named datatype */
+    if(H5Oare_mdc_flushes_disabled(tid, &corked) < 0)
+        TEST_ERROR
+    if(corked) TEST_ERROR
+
+    /* Should fail to un-cork the named datatype that is not corked yet */
+    H5E_BEGIN_TRY {
+        ret = H5Oenable_mdc_flushes(tid);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+    
+    /* Cork the named datatype */
+    if(H5Odisable_mdc_flushes(tid) < 0)
+        TEST_ERROR
+
+    /* Check cork status of the named datatype */
+    if(H5Oare_mdc_flushes_disabled(tid, &corked) < 0)
+        TEST_ERROR
+    if(!corked) TEST_ERROR
+
+    /* Open the dataset */
+    if((did = H5Oopen(fid, "/dataset", H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Check cork status of the dataset */
+    if(H5Oare_mdc_flushes_disabled(did, &corked) < 0)
+        TEST_ERROR
+    if(corked) TEST_ERROR
+
+    /* Cork the dataset */
+    if(H5Odisable_mdc_flushes(did) < 0)
+        TEST_ERROR
+
+    /* Check cork status of dataset */
+    if(H5Oare_mdc_flushes_disabled(did, &corked) < 0)
+        TEST_ERROR
+    if(!corked) TEST_ERROR
+
+    /* Un-cork the dataset */
+    if(H5Oenable_mdc_flushes(did) < 0)
+        TEST_ERROR
+
+    /* Check cork status of the dataset */
+    if(H5Oare_mdc_flushes_disabled(did, &corked) < 0)
+        TEST_ERROR
+    if(corked) TEST_ERROR
+
+    /* Closing */
+    if(H5Tclose(tid) < 0) TEST_ERROR
+    if(H5Gclose(gid) < 0) TEST_ERROR
+    if(H5Dclose(did) < 0) TEST_ERROR
+    if(H5Sclose(sid) < 0) TEST_ERROR
+    if(H5Aclose(aid) < 0) TEST_ERROR
+    if(H5Pclose(fapl) < 0) TEST_ERROR
+    if(H5Fclose(fid) < 0) TEST_ERROR
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Sclose(sid);
+    H5Aclose(aid);
+        H5Dclose(did);
+        H5Gclose(gid);
+        H5Tclose(tid);
+        H5Pclose(fapl);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    return 1;
+
+} /* test_objs_cork() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    test_dset_cork
+ *
+ * Purpose:     This function verifies H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled are
+ *      working as specified when manipulating datasets.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Vailin Choi; Feb 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_dset_cork(hbool_t new_format)
+{
+    hid_t       fid;                            /* File ID */
+    hid_t       fapl;                           /* File access property list */
+    hid_t       gid;                /* Groupd ID */
+    hid_t   did1, did2;         /* Dataset IDs */
+    hid_t   tid1, tid2;             /* Datatype IDs */
+    hid_t   sid;                /* Dataspace ID */
+    hid_t   dcpl;               /* Dataset creation property list */
+    hsize_t     dims[RANK];                 /* Dataset dimensions */
+    hsize_t     maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED};    /* Maximum dataset dimensions */
+    hsize_t     cdims[RANK] = {2,2};                /* Chunk dimensions */
+    int     fillval = 0;            /* Fill value */
+    int     i, j, k = 0;            /* Local index variables */
+    int     data[DIMS0][DIMS1];     /* Data buffer */
+    int     rbuf[DIMS0][DIMS1];     /* Data buffer */
+    hbool_t     corked;             /* Cork status of an object */
+
+    /* Testing Macro */
+    if(new_format) {
+        TESTING("H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled on datasets (new library format)");
+    } else {
+        TESTING("H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled on datasets (old library format)");
+    } /* end if */
+
+    /* Create fapl */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) 
+        TEST_ERROR;
+
+    /* Set to use latest format */
+    if(new_format) {
+        if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0 ) 
+            TEST_ERROR;
+    } /* end if */
+
+    /* Create a new HDF5 file */
+    if((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create a group */
+    if((gid = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Commit the datatype with the group */
+    if((tid1 = H5Tcopy(H5T_NATIVE_INT)) < 0)
+        TEST_ERROR
+    if(H5Tcommit2(gid, "datatype", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0)
+        TEST_ERROR
+
+    /* Cork the named datatype */
+    if(H5Odisable_mdc_flushes(tid1) < 0)
+        TEST_ERROR
+
+    /* Set up dataset creation property list */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        TEST_ERROR
+    
+    /* Enable chunking */
+    if(H5Pset_chunk(dcpl, RANK, cdims) < 0)
+        TEST_ERROR
+
+    /* Set up a fill value */
+    if(H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0)
+        TEST_ERROR
+
+    /* Create dataspace */
+    dims[0] = DIMS0;
+    dims[1] = DIMS1;
+    if((sid = H5Screate_simple(RANK, dims, maxdims)) < 0)
+        TEST_ERROR
+
+    /* Create the dataset inside the group with the named datatype */
+    if((did1 = H5Dcreate2(gid, "dataset", tid1, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Check cork status of the named datatype */
+    if(H5Oare_mdc_flushes_disabled(tid1, &corked) < 0)
+        TEST_ERROR
+    if(!corked) TEST_ERROR
+
+    /* Cork the dataset */
+    if(H5Odisable_mdc_flushes(did1) < 0)
+        TEST_ERROR
+
+    /* Check cork status of the dataset */
+    if(H5Oare_mdc_flushes_disabled(did1, &corked) < 0)
+        TEST_ERROR
+    if(!corked) TEST_ERROR
+
+    /* Check cork status of the group */
+    if(H5Oare_mdc_flushes_disabled(gid, &corked) < 0)
+        TEST_ERROR
+    if(corked) TEST_ERROR
+
+    /* Initialize the buffer */
+    for(i = 0; i < DIMS0;i++)
+        for(j = 0;j < DIMS1;j++)
+            data[i][j] = k++;
+
+    /* Write to the dataset */
+    if(H5Dwrite(did1, tid1, sid, sid, H5P_DEFAULT, data) < 0)
+        TEST_ERROR
+
+    /* Flush the dataset */
+    if(H5Oflush(did1) < 0)
+        TEST_ERROR
+
+    /* Check cork status of the dataset */
+    if(H5Oare_mdc_flushes_disabled(did1, &corked) < 0)
+        TEST_ERROR
+    if(!corked) TEST_ERROR
+
+    /* Check cork status of the named datatype */
+    if(H5Oare_mdc_flushes_disabled(tid1, &corked) < 0)
+        TEST_ERROR
+    if(!corked) TEST_ERROR
+
+    /* Close the dataset */
+    if(H5Dclose(did1) < 0)
+        TEST_ERROR
+
+    /* Open the dataset again */
+    if((did1 = H5Dopen2(gid, "dataset", H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Check cork status of dataset */
+    if(H5Oare_mdc_flushes_disabled(did1, &corked) < 0)
+        TEST_ERROR
+    if(corked) TEST_ERROR
+
+    /* Read from the dataset */
+    if(H5Dread(did1, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+        TEST_ERROR
+
+    /* Cork the dataset */
+    if(H5Odisable_mdc_flushes(did1) < 0)
+        TEST_ERROR
+
+    /* Delete the dataset */
+    if(H5Ldelete(gid, "dataset", H5P_DEFAULT) < 0)
+        TEST_ERROR
+
+    /* Check cork status of the dataset */
+    if(H5Oare_mdc_flushes_disabled(did1, &corked) < 0)
+        TEST_ERROR
+    if(!corked) TEST_ERROR
+
+    /* Close the dataset */
+    if(H5Oclose(did1) < 0) TEST_ERROR
+
+    /* Create the dataset again */
+    if((did1 = H5Dcreate2(gid, "dataset", tid1, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Cork the dataset */
+    if(H5Odisable_mdc_flushes(did1) < 0)
+        TEST_ERROR
+
+    /* Write to the dataset */
+    if(H5Dwrite(did1, tid1, sid, sid, H5P_DEFAULT, data) < 0)
+        TEST_ERROR
+
+    /* Refresh the dataset */
+    if(H5Drefresh(did1) < 0)
+        TEST_ERROR
+
+    /* Check cork status of the dataset */
+    if(H5Oare_mdc_flushes_disabled(did1, &corked) < 0)
+        TEST_ERROR
+    if(!corked) TEST_ERROR
+    
+    /* Close the dataset */
+    if(H5Dclose(did1) < 0) TEST_ERROR
+
+    /* First open of the dataset */
+    if((did1 = H5Dopen2(gid, "dataset", H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Second open of the dataset */
+    if((did2 = H5Dopen2(gid, "dataset", H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Cork the first opened dataset */
+    if(H5Odisable_mdc_flushes(did1) < 0)
+        TEST_ERROR
+
+    /* Check cork status of the first opened dataset */
+    if(H5Oare_mdc_flushes_disabled(did1, &corked) < 0)
+        TEST_ERROR
+    if(!corked) TEST_ERROR
+
+    /* Check cork status of the second opened dataset */
+    if(H5Oare_mdc_flushes_disabled(did2, &corked) < 0)
+        TEST_ERROR
+    if(!corked) TEST_ERROR
+
+    /* Close the second opened dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* Check cork status of the first opened dataset */
+    if(H5Oare_mdc_flushes_disabled(did1, &corked) < 0)
+        TEST_ERROR
+    if(!corked) TEST_ERROR
+
+    /* Close the first opened dastaset */
+    if(H5Dclose(did1) < 0) TEST_ERROR
+
+    /* Check cork status of the named datatype */
+    if(H5Oare_mdc_flushes_disabled(tid1, &corked) < 0)
+        TEST_ERROR
+    if(!corked) TEST_ERROR
+
+    /* Second open of the named datatype */
+    if((tid2 = H5Topen2(gid, "datatype", H5P_DEFAULT)) < 0) 
+        TEST_ERROR
+
+    /* Check cork status of the second opened named datatype */
+    if(H5Oare_mdc_flushes_disabled(tid2, &corked) < 0)
+        TEST_ERROR
+    if(!corked) TEST_ERROR
+
+    /* Uncork the second opened named datatype */
+    if(H5Oenable_mdc_flushes(tid2) < 0)
+        TEST_ERROR
+
+    /* Check cork status of the second opened named datatype */
+    if(H5Oare_mdc_flushes_disabled(tid2, &corked) < 0)
+        TEST_ERROR
+    if(corked) TEST_ERROR
+
+    /* Check cork status of the first opened named datatype */
+    if(H5Oare_mdc_flushes_disabled(tid1, &corked) < 0)
+        TEST_ERROR
+    if(corked) TEST_ERROR
+
+    /* Close the first opened datatype */
+    if(H5Tclose(tid1) < 0) TEST_ERROR
+
+    /* Close the second opened datatype */
+    if(H5Tclose(tid2) < 0) TEST_ERROR
+
+    /* Check cork status of the group */
+    if(H5Oare_mdc_flushes_disabled(gid, &corked) < 0)
+        TEST_ERROR
+    if(corked) TEST_ERROR
+
+    /* Closing */
+    if(H5Gclose(gid) < 0) TEST_ERROR
+    if(H5Sclose(sid) < 0) TEST_ERROR
+    if(H5Pclose(fapl) < 0) TEST_ERROR
+    if(H5Fclose(fid) < 0) TEST_ERROR
+    if(H5Pclose(dcpl) < 0) TEST_ERROR
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Sclose(sid);
+        H5Dclose(did1);
+        H5Dclose(did2);
+        H5Tclose(tid1);
+        H5Tclose(tid2);
+        H5Pclose(dcpl);
+        H5Gclose(gid);
+        H5Pclose(fapl);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    return 1;
+
+} /* test_dset_cork() */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Purpose:     Run tests to verify the library's corking operations.
+ *
+ * Return:      Success:
+ *
+ *              Failure:
+ *
+ * Programmer:  Vailin Choi; Feb 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+int 
+main(void) 
+{
+    unsigned nerrs = 0;         /* Error Encountered */
+    
+    /* Test for dataset created with old library format */
+    nerrs += verify_old_dset_cork();
+
+    /* Tests with new/old library format */
+    /* This is the test moved from th5o.c: test_h5o_cork() */
+    nerrs += test_objs_cork(TRUE);
+    nerrs += test_objs_cork(FALSE);
+    /* This is the test moved from th5o.c: test_h5o_cork_dataset() */
+    nerrs += test_dset_cork(TRUE);
+    nerrs += test_dset_cork(FALSE);
+
+    /* Tests with/without SWMR access */
+    nerrs += verify_obj_dset_cork(TRUE);
+    nerrs += verify_obj_dset_cork(FALSE);
+    nerrs += verify_obj_dset_cork(TRUE);
+    nerrs += verify_dset_cork(TRUE, TRUE); 
+    nerrs += verify_dset_cork(FALSE, TRUE); 
+    nerrs += verify_dset_cork(TRUE, FALSE); 
+    nerrs += verify_group_cork(TRUE); 
+    nerrs += verify_group_cork(FALSE); 
+    nerrs += verify_named_cork(TRUE); 
+    nerrs += verify_named_cork(FALSE); 
+    nerrs += verify_multiple_cork(TRUE);
+    nerrs += verify_multiple_cork(FALSE);
+
+    /* Delete test files */
+    HDremove(FILENAME);
+
+    /* Return Errors */
+    return(nerrs > 0);
+
+} /* main */
+
diff --git a/test/corrupt_stab_msg.h5 b/test/corrupt_stab_msg.h5
index 4fa287c..a00616d 100644
Binary files a/test/corrupt_stab_msg.h5 and b/test/corrupt_stab_msg.h5 differ
diff --git a/test/cross_read.c b/test/cross_read.c
index 35dd2ce..b2fae89 100644
--- a/test/cross_read.c
+++ b/test/cross_read.c
@@ -126,7 +126,7 @@ static int check_data(const char *dsetname, hid_t fid, hbool_t floating_number)
 	/* Check results */
 	for (j=0; j<(NX+1); j++) {
 	    for (i=0; i<NY; i++) {
-		if (!DBL_REL_EQUAL(data_out[j][i], data_in[j][i], 0.001F)) {
+		if (!H5_DBL_REL_EQUAL(data_out[j][i], data_in[j][i], 0.001F)) {
 		    if (!nerrors++) {
 			H5_FAILED();
 			printf("element [%d][%d] is %g but should have been %g\n",
diff --git a/test/dangle.c b/test/dangle.c
index 2f8a67e..4c8ce6b 100644
--- a/test/dangle.c
+++ b/test/dangle.c
@@ -513,6 +513,132 @@ error:
 
 

 /*-------------------------------------------------------------------------
+ * Function:	test_dangle_force
+ *
+ * Purpose:	Shut down all danging IDs with generic file & ID routines,
+ *              instead of letting library shut then down.
+ *
+ * Return:	Success:	zero
+ *		Failure:	non-zero
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, October 29, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_dangle_force(void)
+{
+    char	filename[1024];
+    hid_t fid;  /* File ID */
+    hid_t gid, gid2;  /* Group IDs */
+    hid_t dsid, dsid2; /* Dataset IDs */
+    hid_t sid;  /* Dataspace ID */
+    hid_t aid, aid2;  /* Attribute IDs */
+    hid_t tid, tid2;  /* Named datatype IDs */
+    ssize_t count;  /* Count of open objects */
+    hid_t *objs = NULL;    /* Pointer to list of open objects */
+    size_t u;   /* Local index variable */
+
+    TESTING("force dangling IDs to close, from API routines");
+
+    h5_fixname(FILENAME[0], H5P_DEFAULT, filename, sizeof filename);
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create a dataspace for the dataset & attribute to use */
+    if((sid = H5Screate(H5S_SCALAR)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create a dataset */
+    if((dsid = H5Dcreate2(fid, DSETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Re-open the dataset */
+    if((dsid2 = H5Dopen2(fid, DSETNAME, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create an attribute on the dataset */
+    if((aid = H5Acreate2(dsid, ATTRNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Re-open the attribute */
+    if((aid2 = H5Aopen(dsid, ATTRNAME, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the dataspace ID */
+    if(H5Sclose(sid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open a group ID */
+    if((gid = H5Gopen2(fid, "/", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open group again */
+    if((gid2 = H5Gopen2(fid, "/", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create a named datatype */
+    if((tid = H5Tcopy(H5T_NATIVE_INT)) < 0)
+        FAIL_STACK_ERROR
+    if(H5Tcommit2(fid, TYPENAME, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0)
+        FAIL_STACK_ERROR
+
+    /* Re-open the named datatype */
+    if((tid2 = H5Topen2(fid, TYPENAME, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Increment the ref count on all the "second" objects */
+    if(H5Iinc_ref(dsid2) < 0)
+        FAIL_STACK_ERROR
+    if(H5Iinc_ref(aid2) < 0)
+        FAIL_STACK_ERROR
+    if(H5Iinc_ref(gid2) < 0)
+        FAIL_STACK_ERROR
+    if(H5Iinc_ref(aid2) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get the number of open objects */
+    if((count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_ALL)) < 0)
+        FAIL_STACK_ERROR
+    if(0 == count)
+        TEST_ERROR;
+
+    /* Allocate the array of object IDs */
+    objs = (hid_t*)HDmalloc(sizeof(hid_t) * (size_t)count);
+
+    /* Get the list of open IDs */
+    if(H5Fget_obj_ids((hid_t)H5F_OBJ_ALL, H5F_OBJ_ALL, (size_t)count, objs) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close all open IDs */
+    for(u = 0; u < (size_t)count; u++)
+        while(H5Iget_type(objs[u]) != H5I_BADID && H5Iget_ref(objs[u]) > 0)
+            H5Idec_ref(objs[u]);
+
+    /* Get the number of open objects */
+    if((count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_ALL)) < 0)
+        FAIL_STACK_ERROR
+    if(0 != count)
+        TEST_ERROR;
+
+    /* Clean up temporary file */
+    HDremove(filename);
+
+    /* Release object ID array */
+    HDfree(objs);
+ 
+    PASSED();
+    return 0;
+
+error:
+    if(objs)
+        HDfree(objs);
+    return 1;
+}
+
+

+/*-------------------------------------------------------------------------
  * Function:	main
  *
  * Purpose:	Executes dangling ID tests
@@ -556,6 +682,9 @@ main(void)
     nerrors += test_dangle_datatype2(H5F_CLOSE_STRONG);
     nerrors += test_dangle_attribute(H5F_CLOSE_STRONG);
 
+    /* Close open IDs "the hard way" */
+    nerrors += test_dangle_force();
+
     /* Check for errors */
     if (nerrors)
         goto error;
diff --git a/test/deflate.h5 b/test/deflate.h5
index 2f62e25..e33af4f 100644
Binary files a/test/deflate.h5 and b/test/deflate.h5 differ
diff --git a/test/dsets.c b/test/dsets.c
index e523680..4b7123d 100644
--- a/test/dsets.c
+++ b/test/dsets.c
@@ -20,37 +20,52 @@
  * Purpose:	Tests the dataset interface (H5D)
  */
 
+#define H5D_FRIEND		/*suppress error about including H5FDpkg	  */
+#define H5D_TESTING
+
+#define H5FD_FRIEND		/*suppress error about including H5FDpkg	  */
+#define H5FD_TESTING
+
+#define H5Z_FRIEND		/*suppress error about including H5FDpkg	  */
+
 #include <stdlib.h>
 #include <time.h>
 
 #include "h5test.h"
 #include "H5srcdir.h"
+#include "H5Dpkg.h"
+#include "H5FDpkg.h"
+#include "H5VMprivate.h"
+
+#include "H5Zpkg.h"
 #ifdef H5_HAVE_SZLIB_H
 #   include "szlib.h"
 #endif
 
-/*
- * This file needs to access private datatypes from the H5Z package.
- */
-#define H5Z_PACKAGE
-#include "H5Zpkg.h"
-
 
 const char *FILENAME[] = {
-    "dataset",
-    "compact_dataset",
-    "dset_offset",
-    "max_compact_dataset",
-    "simple",
-    "set_local",
-    "random_chunks",
-    "huge_chunks",
-    "chunk_cache",
-    "big_chunk",
-    "chunk_expand",
-    "copy_dcpl_newfile",
-    "layout_extend",
-    "zero_chunk",
+    "dataset", 		/* 0 */
+    "compact_dataset",	/* 1 */
+    "dset_offset",	/* 2 */
+    "max_compact_dataset",	/* 3 */
+    "simple",		/* 4 */
+    "set_local",	/* 5 */
+    "random_chunks",	/* 6 */
+    "huge_chunks",	/* 7 */
+    "chunk_cache",	/* 8 */
+    "big_chunk",	/* 9 */
+    "chunk_fast",	/* 10 */
+    "chunk_expand",	/* 11 */
+    "chunk_fixed",	/* 12 */
+    "copy_dcpl_newfile",/* 13 */
+    "partial_chunks",   /* 14 */
+    "layout_extend",    /* 15 */
+    "zero_chunk",	/* 16 */
+    "chunk_single",     /* 17 */
+    "swmr_non_latest",  /* 18 */
+    "earray_hdr_fd",    /* 19 */
+    "farray_hdr_fd",    /* 20 */
+    "bt2_hdr_fd",    /* 21 */
     NULL
 };
 #define FILENAME_BUF_SIZE       1024
@@ -117,6 +132,22 @@ const char *FILENAME[] = {
 #define DSET_DEPREC_NAME_COMPACT	"deprecated_compact"
 #define DSET_DEPREC_NAME_FILTER         "deprecated_filter"
 
+/* Dataset names for testing Fixed Array Indexing */
+#define DSET_FIXED_MAX		"DSET_FIXED_MAX"
+#define DSET_FIXED_NOMAX	"DSET_FIXED_NOMAX"
+#define DSET_FIXED_BIG		"DSET_FIXED_BIG"
+#define POINTS 			72
+#define POINTS_BIG 		2500
+
+/* Dataset names used for testing header flush dependencies */
+#define DSET_EARRAY_HDR_FD  "earray_hdr_fd"
+#define DSET_FARRAY_HDR_FD  "farray_hdr_fd"
+#define DSET_BT2_HDR_FD  "bt2_hdr_fd"
+
+/* Dataset names for testing Implicit Indexing */
+#define DSET_SINGLE_MAX         "DSET_SINGLE_MAX"
+#define DSET_SINGLE_NOMAX       "DSET_SINGLE_NOMAX"
+
 #define USER_BLOCK              1024
 #define SIXTY_FOUR_KB           65536
 
@@ -128,6 +159,7 @@ const char *FILENAME[] = {
 #define H5Z_FILTER_DEPREC       309
 #define H5Z_FILTER_EXPAND	310
 #define H5Z_FILTER_CAN_APPLY_TEST2	311
+#define H5Z_FILTER_COUNT        312
 
 /* Flags for testing filters */
 #define DISABLE_FLETCHER32      0
@@ -165,9 +197,11 @@ const char *FILENAME[] = {
 
 /* Names for zero-dim test */
 #define ZERODIM_DATASET "zerodim"
+#define ZERODIM_DATASET2 "zerodim2"
 
 /* Parameters for zero-dim test */
 #define MISSING_CHUNK_DATASET   "missing_chunk"
+#define MISSING_CHUNK_DATASET2  "missing_chunk2"
 #define MISSING_CHUNK_DIM       100
 
 /* Names for random chunks test */
@@ -192,20 +226,37 @@ const char *FILENAME[] = {
 /* Parameters for testing bypassing chunk cache */
 #define BYPASS_DATASET1          "Dset1"
 #define BYPASS_DATASET2          "Dset2"
+
+#define T_BYPASS_DATASET1          "T_Dset1"
+#define T_BYPASS_DATASET2          "T_Dset2"
+
 #define BYPASS_DIM               1000
 #define BYPASS_CHUNK_DIM         500
 #define BYPASS_FILL_VALUE        7
 
-/* Declarations for test_idx_compatible() */
-#define	FIXED_IDX_FILE	"fixed_idx.h5"
-#define DSET            "dset"
-#define DSET_FILTER     "dset_filter"
-
+/* Parameters for testing extensible array chunk indices */
+#define EARRAY_MAX_RANK         3
+#define EARRAY_DSET_DIM         15
+#define EARRAY_CHUNK_DIM        3
+#define EARRAY_EXTEND_INCR      15
+#define EARRAY_MAX_EXTEND       75
+ 
 /* Shared global arrays */
 #define DSET_DIM1       100
 #define DSET_DIM2       200
 int	points[DSET_DIM1][DSET_DIM2], check[DSET_DIM1][DSET_DIM2];
 double	points_dbl[DSET_DIM1][DSET_DIM2], check_dbl[DSET_DIM1][DSET_DIM2];
+size_t  count_nbytes_read = 0;
+size_t  count_nbytes_written = 0;
+
+/* Declarations for test_idx_compatible() */
+#define DSET            "dset"
+#define DSET_FILTER     "dset_filter"
+const char *OLD_FILENAME[] = {  /* Files created under 1.6 branch and 1.8 branch */
+    "btree_idx_1_6.h5", /* 1.6 HDF5 file */
+    "btree_idx_1_8.h5"  /* 1.8 HDF5 file */
+};
+
 
 /* Local prototypes for filter functions */
 static size_t filter_bogus(unsigned int flags, size_t cd_nelmts,
@@ -220,6 +271,49 @@ static size_t filter_corrupt(unsigned int flags, size_t cd_nelmts,
     const unsigned int *cd_values, size_t nbytes, size_t *buf_size, void **buf);
 static size_t filter_expand(unsigned int flags, size_t cd_nelmts,
     const unsigned int *cd_values, size_t nbytes, size_t *buf_size, void **buf);
+static size_t filter_count(unsigned int flags, size_t cd_nelmts,
+    const unsigned int *cd_values, size_t nbytes, size_t *buf_size, void **buf);
+
+/* This message derives from H5Z */
+const H5Z_class2_t H5Z_COUNT[1] = {{
+    H5Z_CLASS_T_VERS,       /* H5Z_class_t version */
+    H5Z_FILTER_COUNT,           /* Filter id number             */
+    1, 1,               /* Encoding and decoding enabled */
+    "count",                    /* Filter name for debugging    */
+    NULL,                       /* The "can apply" callback     */
+    NULL,                       /* The "set local" callback     */
+    filter_count,               /* The actual filter function   */
+}};
+
+

+/*-------------------------------------------------------------------------
+ * Function:    filter_count
+ *
+ * Purpose:     This filter counts the number of bytes read and written,
+ *              incrementing count_nbytes_read or count_nbytes_written as
+ *              appropriate.
+ *
+ * Return:      Success:        Data chunk size
+ *
+ *              Failure:        0
+ *
+ * Programmer:  Neil Fortner
+ *              Wednesday, March 17, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static size_t
+filter_count(unsigned int flags, size_t H5_ATTR_UNUSED cd_nelmts,
+      const unsigned int H5_ATTR_UNUSED *cd_values, size_t nbytes,
+      size_t H5_ATTR_UNUSED *buf_size, void H5_ATTR_UNUSED **buf)
+{
+    if(flags & H5Z_FLAG_REVERSE)
+        count_nbytes_read += nbytes;
+    else
+        count_nbytes_written += nbytes;
+
+    return nbytes;
+}
 
 

 /*-------------------------------------------------------------------------
@@ -393,14 +487,14 @@ test_create(hid_t file)
 static herr_t
 test_simple_io(const char *env_h5_drvr, hid_t fapl)
 {
-    char                filename[FILENAME_BUF_SIZE];
-    hid_t		file, dataset, space, xfer;
-    int			i, j, n;
-    hsize_t		dims[2];
-    void		*tconv_buf = NULL;
-    int                 f;
-    haddr_t             offset;
-    int                 rdata[DSET_DIM1][DSET_DIM2];
+    char        filename[FILENAME_BUF_SIZE];
+    hid_t       file = -1, dataset = -1, space = -1, xfer = -1;
+    int         i, j, n;
+    hsize_t     dims[2];
+    void        *tconv_buf = NULL;
+    int         f = -1;
+    haddr_t     offset;
+    int         rdata[DSET_DIM1][DSET_DIM2];
 
     TESTING("simple I/O");
 
@@ -430,6 +524,8 @@ test_simple_io(const char *env_h5_drvr, hid_t fapl)
         /* Create the dataset */
         if((dataset = H5Dcreate2(file, DSET_SIMPLE_IO_NAME, H5T_NATIVE_INT, space,
                                  H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) goto error;
+        if(H5Sclose(space) < 0) TEST_ERROR
+        space = -1;
 
         /* Test dataset address.  Should be undefined. */
         if(H5Dget_offset(dataset) != HADDR_UNDEF) goto error;
@@ -460,12 +556,16 @@ test_simple_io(const char *env_h5_drvr, hid_t fapl)
         }
 
         if(H5Pclose (xfer) < 0) goto error;
+            xfer = -1;
         if(H5Dclose(dataset) < 0) goto error;
+            dataset = -1;
         if(H5Fclose(file) < 0) goto error;
+            file = -1;
 
         f = HDopen(filename, O_RDONLY, 0);
         HDlseek(f, (off_t)offset, SEEK_SET);
-        HDread(f, rdata, sizeof(int)*DSET_DIM1*DSET_DIM2);
+        if(HDread(f, rdata, sizeof(int)*DSET_DIM1*DSET_DIM2) < 0)
+            goto error;
 
         /* Check that the values read are the same as the values written */
         for(i = 0; i < DSET_DIM1; i++) {
@@ -480,8 +580,9 @@ test_simple_io(const char *env_h5_drvr, hid_t fapl)
         }
 
         HDclose(f);
+        f = -1;
 
-        HDfree (tconv_buf);
+        HDfree(tconv_buf);
         PASSED();
     } /* end if */
     else {
@@ -492,6 +593,18 @@ test_simple_io(const char *env_h5_drvr, hid_t fapl)
     return 0;
 
 error:
+    if(space > 0)
+        if(H5Sclose(space) < 0) TEST_ERROR
+    if(xfer > 0)
+        if(H5Pclose(xfer) < 0) TEST_ERROR
+    if(dataset > 0)
+        if(H5Dclose(dataset) < 0) TEST_ERROR
+    if(file > 0)
+        if(H5Fclose(file) < 0) TEST_ERROR
+    if(f > 0)
+        HDclose(f);
+    if(tconv_buf)
+        HDfree(tconv_buf);
     return -1;
 }
 
@@ -514,10 +627,10 @@ static herr_t
 test_userblock_offset(const char *env_h5_drvr, hid_t fapl)
 {
     char                filename[FILENAME_BUF_SIZE];
-    hid_t		file, fcpl, dataset, space;
+    hid_t		file = -1, fcpl = -1, dataset = -1, space = -1;
     int			i, j;
     hsize_t		dims[2];
-    int                   f;
+    int                 f = -1;
     haddr_t             offset;
     int                 rdata[DSET_DIM1][DSET_DIM2];
 
@@ -532,6 +645,8 @@ test_userblock_offset(const char *env_h5_drvr, hid_t fapl)
 
         if((file=H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
             goto error;
+        if(H5Pclose(fcpl) < 0) TEST_ERROR
+        fcpl = -1;
 
         /* Create the data space */
         dims[0] = DSET_DIM1;
@@ -541,6 +656,8 @@ test_userblock_offset(const char *env_h5_drvr, hid_t fapl)
         /* Create the dataset */
         if((dataset = H5Dcreate2(file, DSET_USERBLOCK_IO_NAME, H5T_NATIVE_INT, space,
                                  H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) goto error;
+        if(H5Sclose(space) < 0) TEST_ERROR
+        space = -1;
 
         /* Write the data to the dataset */
         if(H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, points) < 0)
@@ -552,7 +669,9 @@ test_userblock_offset(const char *env_h5_drvr, hid_t fapl)
         if((offset = H5Dget_offset(dataset)) == HADDR_UNDEF) goto error;
 
         if(H5Dclose(dataset) < 0) goto error;
+        dataset = -1;
         if(H5Fclose(file) < 0) goto error;
+        file = -1;
 
         f = HDopen(filename, O_RDONLY, 0);
         HDlseek(f, (off_t)offset, SEEK_SET);
@@ -571,6 +690,7 @@ test_userblock_offset(const char *env_h5_drvr, hid_t fapl)
         }
 
         HDclose(f);
+        f = -1;
 
         PASSED();
     } /* end if */
@@ -582,6 +702,16 @@ test_userblock_offset(const char *env_h5_drvr, hid_t fapl)
     return 0;
 
 error:
+    if(space > 0)
+        if(H5Sclose(space) < 0) TEST_ERROR
+    if(fcpl > 0)
+        if(H5Pclose(fcpl) < 0) TEST_ERROR
+    if(dataset > 0)
+        if(H5Dclose(dataset) < 0) TEST_ERROR
+    if(file > 0)
+        if(H5Fclose(file) < 0) TEST_ERROR
+    if(f > 0)
+        HDclose(f);
     return -1;
 }
 
@@ -877,7 +1007,7 @@ test_layout_extend(hid_t fapl)
     TESTING("extendible dataset with various layout");
 
     /* Create a file */
-    h5_fixname(FILENAME[12], fapl, filename, sizeof filename);
+    h5_fixname(FILENAME[15], fapl, filename, sizeof filename);
     if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
         FAIL_STACK_ERROR
 
@@ -1022,15 +1152,15 @@ test_conv_buffer(hid_t fid)
 
     /* Populate the data members */
     for(j = 0; j < DIM1; j++)
-	for(k = 0; k < DIM2; k++)
-	    for(l = 0; l < DIM3; l++)
-		cf->a[j][k][l] = 10*(j+1) + l + k;
+        for(k = 0; k < DIM2; k++)
+            for(l = 0; l < DIM3; l++)
+                cf->a[j][k][l] = 10*(j+1) + l + k;
 
     for(j = 0; j < DIM2; j++)
-	cf->b[j] = (float)(100.0f*(j+1) + 0.01f*j);
+        cf->b[j] = 100.0f * (float)(j+1) + 0.01f * (float)j;
 
     for(j = 0; j < DIM3; j++)
-	cf->c[j] = 100.0f*(j+1) + 0.02f*j;
+        cf->c[j] = 100.0f * (float)(j+1) + 0.02f * (float)j;
 
 
   /* Create data space */
@@ -1107,7 +1237,7 @@ test_conv_buffer(hid_t fid)
   HDfree(cf);
   HDfree(cfrR);
   puts(" PASSED");
-  return(0);
+  return 0;
 
 error:
   return -1;
@@ -2359,8 +2489,7 @@ test_missing_filter(hid_t file)
     hsize_t     dset_size;      /* Dataset size */
     size_t      i,j;            /* Local index variables */
     herr_t      ret;            /* Generic return value */
-    char testfile[512]="";      /* Buffer to hold name of existing test file */
-    char *srcdir = HDgetenv("srcdir");    /* The source directory, if we are using the --srcdir configure option */
+    const char *testfile = H5_get_srcdir_filename(FILE_DEFLATE_NAME); /* Corrected test file name */
 
     TESTING("dataset access with missing filter");
 
@@ -2506,13 +2635,6 @@ test_missing_filter(hid_t file)
 
     /* Try reading existing dataset with deflate filter */
 
-    /* Compose the name of the file to open, using the srcdir, if appropriate */
-    if(srcdir && ((HDstrlen(srcdir) + HDstrlen(FILE_DEFLATE_NAME) + 1) < sizeof(testfile))){
-	HDstrcpy(testfile, srcdir);
-	HDstrcat(testfile, "/");
-    }
-    HDstrcat(testfile, FILE_DEFLATE_NAME);
-
     /* Open existing file */
     if((fid = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0) {
         H5_FAILED();
@@ -2705,7 +2827,8 @@ test_nbit_int(hid_t file)
     int                 new_data[2][5];
     unsigned int        mask;
     size_t              precision, offset;
-    size_t             i, j;
+    double              power;
+    size_t              i, j;
 
     puts("Testing nbit filter");
     TESTING("    nbit int (setup)");
@@ -2738,8 +2861,8 @@ test_nbit_int(hid_t file)
     /* Initialize data, assuming size of long long >= size of int */
     for(i= 0;i< (size_t)size[0]; i++)
       for(j = 0; j < (size_t)size[1]; j++) {
-        orig_data[i][j] = (int)(((long long)HDrandom() %
-                           (long long)HDpow(2.0f, (double)(precision - 1))) << offset);
+        power = HDpow(2.0f, (double)(precision - 1));
+        orig_data[i][j] = (int)(((long long)HDrandom() % (long long)power) << offset);
 
         /* even-numbered values are negtive */
         if((i*size[1]+j+1)%2 == 0)
@@ -3065,7 +3188,8 @@ test_nbit_array(hid_t file)
     unsigned int        orig_data[2][5][3][2];
     unsigned int        new_data[2][5][3][2];
     size_t              precision, offset;
-    size_t             i, j, m, n;
+    double              power;
+    size_t              i, j, m, n;
 
     TESTING("    nbit array (setup)");
 
@@ -3104,9 +3228,11 @@ test_nbit_array(hid_t file)
     for(i= 0;i< (size_t)size[0]; i++)
       for(j = 0; j < (size_t)size[1]; j++)
         for(m = 0; m < (size_t)adims[0]; m++)
-          for(n = 0; n < (size_t)adims[1]; n++)
+          for(n = 0; n < (size_t)adims[1]; n++) {
+            power = HDpow(2.0F, (double)precision);
             orig_data[i][j][m][n] = (unsigned int)(((long long)HDrandom() %
-                                     (long long)HDpow(2.0F, (double)precision)) << offset);
+                                     (long long)power) << offset);
+          } /* end for */
     PASSED();
 
     /*----------------------------------------------------------------------
@@ -3205,7 +3331,8 @@ test_nbit_compound(hid_t file)
     atomic              orig_data[2][5];
     atomic              new_data[2][5];
     unsigned int        i_mask, s_mask, c_mask;
-    size_t             i, j;
+    double              power;
+    size_t              i, j;
 
 
     TESTING("    nbit compound (setup)");
@@ -3264,12 +3391,12 @@ test_nbit_compound(hid_t file)
     /* Initialize data, assuming size of long long >= size of member datatypes */
     for(i= 0;i< (size_t)size[0]; i++)
       for(j = 0; j < (size_t)size[1]; j++) {
-        orig_data[i][j].i = (int)(((long long)HDrandom() %
-                             (long long)HDpow(2.0F, (double)(precision[0]-1))) << offset[0]);
-        orig_data[i][j].c = (char)(((long long)HDrandom() %
-                             (long long)HDpow(2.0F, (double)(precision[1]-1))) << offset[1]);
-        orig_data[i][j].s = (short)(((long long)HDrandom() %
-                             (long long)HDpow(2.0F, (double)(precision[2]-1))) << offset[2]);
+        power = HDpow(2.0F, (double)(precision[0]-1));
+        orig_data[i][j].i = (int)(((long long)HDrandom() % (long long)power) << offset[0]);
+        power = HDpow(2.0F, (double)(precision[1]-1));
+        orig_data[i][j].c = (char)(((long long)HDrandom() % (long long)power) << offset[1]);
+        power = HDpow(2.0F, (double)(precision[2]-1));
+        orig_data[i][j].s = (short)(((long long)HDrandom() % (long long)power) << offset[2]);
         orig_data[i][j].f = float_val[i][j];
 
         /* some even-numbered integer values are negtive */
@@ -3399,7 +3526,8 @@ test_nbit_compound_2(hid_t file)
     complex             orig_data[2][5];
     complex             new_data[2][5];
     unsigned int        i_mask, s_mask, c_mask, b_mask;
-    size_t             i, j, m, n, b_failed, d_failed;
+    double              power;
+    size_t              i, j, m, n, b_failed, d_failed;
 
 
     TESTING("    nbit compound complex (setup)");
@@ -3490,33 +3618,34 @@ test_nbit_compound_2(hid_t file)
     /* Initialize data, assuming size of long long >= size of member datatypes */
     for(i= 0;i< (size_t)size[0]; i++)
       for(j = 0; j < (size_t)size[1]; j++) {
-        orig_data[i][j].a.i = (int)(((long long)HDrandom() %
-                               (long long)HDpow(2.0F, (double)(precision[0]-1))) << offset[0]);
-        orig_data[i][j].a.c = (char)(((long long)HDrandom() %
-                               (long long)HDpow(2.0F, (double)(precision[1]-1))) << offset[1]);
-        orig_data[i][j].a.s = (short)(-((long long)HDrandom() %
-                               (long long)HDpow(2.0F, (double)(precision[2]-1))) << offset[2]);
+        power = HDpow(2.0F, (double)(precision[0]-1));
+        orig_data[i][j].a.i = (int)(((long long)HDrandom() % (long long)power) << offset[0]);
+        power = HDpow(2.0F, (double)(precision[1]-1));
+        orig_data[i][j].a.c = (char)(((long long)HDrandom() % (long long)power) << offset[1]);
+        power = HDpow(2.0F, (double)(precision[2]-1));
+        orig_data[i][j].a.s = (short)(-((long long)HDrandom() % (long long)power) << offset[2]);
         orig_data[i][j].a.f = float_val[i][j];
 
-        orig_data[i][j].v = (unsigned int)(((long long)HDrandom() %
-                             (long long)HDpow(2.0F, (double)precision[3])) << offset[3]);
+        power = HDpow(2.0F, (double)precision[3]);
+        orig_data[i][j].v = (unsigned int)(((long long)HDrandom() % (long long)power) << offset[3]);
 
         for(m = 0; m < (size_t)array_dims[0]; m++)
-          for(n = 0; n < (size_t)array_dims[1]; n++)
-            orig_data[i][j].b[m][n] = (char)(((long long)HDrandom() %
-                                       (long long)HDpow(2.0F, (double)(precision[4]-1))) << offset[4]);
+          for(n = 0; n < (size_t)array_dims[1]; n++) {
+            power = HDpow(2.0F, (double)(precision[4]-1));
+            orig_data[i][j].b[m][n] = (char)(((long long)HDrandom() % (long long)power) << offset[4]);
+          } /* end for */
 
         for(m = 0; m < (size_t)array_dims[0]; m++)
           for(n = 0; n < (size_t)array_dims[1]; n++) {
-            orig_data[i][j].d[m][n].i = (int)(-((long long)HDrandom() %
-                                         (long long)HDpow(2.0F, (double)(precision[0]-1))) << offset[0]);
-            orig_data[i][j].d[m][n].c = (char)(((long long)HDrandom() %
-                                         (long long)HDpow(2.0F, (double)(precision[1]-1))) << offset[1]);
-            orig_data[i][j].d[m][n].s = (short)(((long long)HDrandom() %
-                                         (long long)HDpow(2.0F, (double)(precision[2]-1))) << offset[2]);
+            power = HDpow(2.0F, (double)(precision[0]-1));
+            orig_data[i][j].d[m][n].i = (int)(-((long long)HDrandom() % (long long)power) << offset[0]);
+            power = HDpow(2.0F, (double)(precision[1]-1));
+            orig_data[i][j].d[m][n].c = (char)(((long long)HDrandom() % (long long)power) << offset[1]);
+            power = HDpow(2.0F, (double)(precision[2]-1));
+            orig_data[i][j].d[m][n].s = (short)(((long long)HDrandom() % (long long)power) << offset[2]);
             orig_data[i][j].d[m][n].f = float_val[i][j];
-          }
-      }
+          } /* end for */
+      } /* end for */
 
     PASSED();
 
@@ -3661,7 +3790,8 @@ test_nbit_compound_3(hid_t file)
     const hsize_t       chunk_size[1] = {5};
     atomic              orig_data[5];
     atomic              new_data[5];
-    size_t             i, k, j;
+    double              power;
+    size_t              i, k, j;
 
 
     TESTING("    nbit compound with no-op type (setup)");
@@ -3708,8 +3838,9 @@ test_nbit_compound_3(hid_t file)
 
     /* Initialize data */
     for(i = 0; i < (size_t)size[0]; i++) {
+        power = HDpow(2.0F, 17.0F - 1.0F);
         HDmemset(&orig_data[i], 0, sizeof(orig_data[i]));
-        orig_data[i].i = HDrandom() % (long)HDpow(2.0F, 17.0F - 1.0F);
+        orig_data[i].i = HDrandom() % (long)power;
         HDstrcpy(orig_data[i].str, "fixed-length C string");
         orig_data[i].vl_str = HDstrdup("variable-length C string");
 
@@ -3828,6 +3959,7 @@ test_nbit_int_size(hid_t file)
     hsize_t dims[2], chunk_size[2];
     hsize_t dset_size = 0;
     int     orig_data[DSET_DIM1][DSET_DIM2];
+    double  power;
     int     i, j;
     size_t  precision, offset;
 
@@ -3878,8 +4010,10 @@ test_nbit_int_size(hid_t file)
    * corresponding to the memory datatype's precision and offset.
    */
    for (i=0; i < DSET_DIM1; i++)
-       for (j=0; j < DSET_DIM2; j++)
-           orig_data[i][j] = rand() % (int)pow((double)2, (double)(precision-1)) << offset;
+       for (j=0; j < DSET_DIM2; j++) {
+           power = HDpow(2.0F, (double)(precision-1));
+           orig_data[i][j] = HDrandom() % (int)power << offset;
+       } /* end for */
 
 
    /* Describe the dataspace. */
@@ -5832,7 +5966,7 @@ test_set_local(hid_t fapl)
 	for(j=0; j<dims[1]; j++) {
 	    /* If the difference between two values is greater than 0.001%, they're
              * considered not equal. */
-            if(!DBL_REL_EQUAL(points_dbl[i][j],check_dbl[i][j],0.00001F)) {
+            if(!H5_DBL_REL_EQUAL(points_dbl[i][j],check_dbl[i][j],0.00001F)) {
 		H5_FAILED();
 		printf("    Line %d: Read different values than written.\n",__LINE__);
 		printf("    At index %lu,%lu\n", (unsigned long)(i), (unsigned long)(j));
@@ -6035,7 +6169,7 @@ test_copy_dcpl(hid_t file, hid_t fapl)
 
     /* Create a second file and create 2 datasets with the copies of the DCPLs in the first
      * file.  Test whether the copies of DCPLs work. */
-    h5_fixname(FILENAME[11], fapl, filename, sizeof filename);
+    h5_fixname(FILENAME[13], fapl, filename, sizeof filename);
     if((new_file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
         TEST_ERROR
 
@@ -6381,15 +6515,28 @@ static herr_t
 test_zero_dims(hid_t file)
 {
     hid_t       s = -1, d = -1, dcpl = -1;
-    hsize_t     dsize = 0, dmax = H5S_UNLIMITED, csize = 5;
+    hid_t       s2 = -1, d2 = -1, dcpl2 = -1;
+    hsize_t     dzero = 0, dmax = H5S_UNLIMITED, csize = 5;
+    hsize_t     dzero2[2] = {0, 0};
+    hsize_t 	dmax2[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; 
+    hsize_t	csize2[2] = {5, 5};
+    hid_t	fapl;		/* File access property list */
+    H5D_chunk_index_t idx_type; /* Dataset chunk index type */
+    H5F_libver_t low;           /* File format low bound */
     herr_t      ret;
 
     TESTING("I/O on datasets with zero-sized dims");
 
+    /* Get the file's file access property list */
+    if((fapl = H5Fget_access_plist(file)) < 0) FAIL_STACK_ERROR
+
+    /* Get library format */
+    if(H5Pget_libver_bounds(fapl, &low, NULL) < 0) FAIL_STACK_ERROR
+
     /* 
      * One-dimensional dataset 
      */
-    if((s = H5Screate_simple(1, &dsize, &dmax)) < 0) FAIL_STACK_ERROR
+    if((s = H5Screate_simple(1, &dzero, &dmax)) < 0) FAIL_STACK_ERROR
 
     /* Try creating chunked dataset with undefined chunk dimensions */
     if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR
@@ -6405,7 +6552,7 @@ test_zero_dims(hid_t file)
 
     /* Try creating chunked dataset with zero-sized chunk dimensions */
     H5E_BEGIN_TRY {
-        ret = H5Pset_chunk(dcpl, 1, &dsize);
+        ret = H5Pset_chunk(dcpl, 1, &dzero);
     } H5E_END_TRY;
     if(ret > 0)
         FAIL_PUTS_ERROR("set zero-sized chunk dimensions")
@@ -6417,6 +6564,16 @@ test_zero_dims(hid_t file)
     if(H5Pset_chunk(dcpl, 1, &csize) < 0) FAIL_STACK_ERROR
     if((d = H5Dcreate2(file, ZERODIM_DATASET, H5T_NATIVE_INT, s, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
 
+    /* Get the chunk index type */
+    if(H5D__layout_idx_type_test(d, &idx_type) < 0) FAIL_STACK_ERROR
+
+    /* Verify index type */
+    if(low == H5F_LIBVER_LATEST) {
+	if(idx_type != H5D_CHUNK_IDX_EARRAY)
+	    FAIL_PUTS_ERROR("should be using extensible array as index");
+    } else if(idx_type != H5D_CHUNK_IDX_BTREE)
+	FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+
     /* Various no-op writes */
     if(H5Dwrite(d, H5T_NATIVE_INT, s, s, H5P_DEFAULT, (void*)911) < 0) FAIL_STACK_ERROR
     if(H5Dwrite(d, H5T_NATIVE_INT, s, s, H5P_DEFAULT, NULL) < 0) FAIL_STACK_ERROR
@@ -6433,6 +6590,56 @@ test_zero_dims(hid_t file)
     if(H5Pclose(dcpl) < 0) FAIL_STACK_ERROR
     if(H5Sclose(s) < 0) FAIL_STACK_ERROR
 
+    /* 
+     * Two-dimensional dataset 
+     */
+    if((s2 = H5Screate_simple(2, dzero2, dmax2)) < 0) FAIL_STACK_ERROR
+
+    /* Try creating chunked dataset with undefined chunk dimensions */
+    if((dcpl2 = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR
+    if(H5Pset_layout(dcpl2, H5D_CHUNKED) < 0) FAIL_STACK_ERROR
+
+    H5E_BEGIN_TRY {
+        d2 = H5Dcreate2(file, ZERODIM_DATASET2, H5T_NATIVE_INT, s2, H5P_DEFAULT, dcpl2, H5P_DEFAULT);
+    } H5E_END_TRY;
+    if(d2 > 0) {
+        H5Dclose(d2);
+        FAIL_PUTS_ERROR("created dataset with undefined chunk dimensions")
+    } /* end if */
+
+    /* Try creating chunked dataset with zero-sized chunk dimensions */
+    H5E_BEGIN_TRY {
+        ret = H5Pset_chunk(dcpl2, 2, dzero2);
+    } H5E_END_TRY;
+    if(ret > 0)
+        FAIL_PUTS_ERROR("set zero-sized chunk dimensions")
+
+    if(H5Pclose(dcpl2) < 0) FAIL_STACK_ERROR
+
+    /* Write to the zero-sized extendible dataset */
+    if((dcpl2 = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR
+    if(H5Pset_chunk(dcpl2, 2, csize2) < 0) FAIL_STACK_ERROR
+
+    /* Create the dataset */
+    if((d2 = H5Dcreate2(file, ZERODIM_DATASET2, H5T_NATIVE_INT, s2, H5P_DEFAULT, dcpl2, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+
+    /* Get the chunk index type */
+    if(H5D__layout_idx_type_test(d2, &idx_type) < 0) FAIL_STACK_ERROR
+
+    /* Verify index type */
+    if(low == H5F_LIBVER_LATEST) {
+	if(idx_type != H5D_CHUNK_IDX_BT2)
+	    FAIL_PUTS_ERROR("should be using v2 B-tree as index");
+    } else if(idx_type != H5D_CHUNK_IDX_BTREE)
+	FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+
+    /* Just a no-op */
+    if(H5Dwrite(d2, H5T_NATIVE_INT, s2, s2, H5P_DEFAULT, (void*)911) < 0) FAIL_STACK_ERROR
+
+    if(H5Dclose(d2) < 0) FAIL_STACK_ERROR
+    if(H5Pclose(dcpl2) < 0) FAIL_STACK_ERROR
+    if(H5Sclose(s2) < 0) FAIL_STACK_ERROR
+
     PASSED();
     return 0;
 
@@ -6441,6 +6648,10 @@ error:
         H5Pclose(dcpl);
         H5Dclose(d);
         H5Sclose(s);
+
+        H5Pclose(dcpl2);
+        H5Dclose(d2);
+        H5Sclose(s2);
     } H5E_END_TRY;
     return -1;
 } /* end test_zero_dims() */
@@ -6464,39 +6675,89 @@ error:
 static herr_t
 test_missing_chunk(hid_t file)
 {
-    hid_t       s = -1, d = -1, dcpl = -1;
-    hsize_t	hs_start[1];
-    hsize_t	hs_stride[1],
-                hs_count[1],
-                hs_block[1];
+    hid_t       d = -1, did2 = -1;		/* Dataset IDs */
+    hid_t	dcpl = -1, dcpl2 = -1;		/* Dataset creation property IDs */
+    hid_t       s = -1, sid2 = -1; 		/* Dataspace ID */
+    hsize_t	hs_start[1], hs_stride[1], hs_count[1], hs_block[1];	/* Hyperslab setting */
+    hsize_t	hs_start2[2], hs_stride2[2], hs_count2[2], hs_block2[2];/* Hyperslab setting */
+
+    /* Buffers for reading/writing dataset */
     int         wdata[MISSING_CHUNK_DIM],
                 rdata[MISSING_CHUNK_DIM];
+    int         wdata2[MISSING_CHUNK_DIM][MISSING_CHUNK_DIM],
+                rdata2[MISSING_CHUNK_DIM][MISSING_CHUNK_DIM];
+
+    /* Setting for 1-D dataset */
     hsize_t     dsize=100, dmax=H5S_UNLIMITED;
     hsize_t	csize=5;
-    size_t      u;
+
+    /* Setting for 2-D dataset */
+    hsize_t     dsize2[2] = {100, 100}, dmax2[2] = {H5S_UNLIMITED, H5S_UNLIMITED};
+    hsize_t	csize2[2] = {5, 5};
+    size_t      u, i, j;	/* Local Index variable */
+
+    hid_t	fapl;		/* File access property list */
+    H5F_libver_t low;          	/* File format low bound */
+    H5D_chunk_index_t idx_type, idx_type2; 	/* Dataset chunk index types */
 
     TESTING("Read dataset with unwritten chunk & undefined fill value");
 
+    /* Get the file's file access property list */
+    if((fapl = H5Fget_access_plist(file)) < 0) TEST_ERROR;
+
+    /* Get library format */
+    if(H5Pget_libver_bounds(fapl, &low, NULL) < 0) TEST_ERROR;
+
     /* Initialize data for 1-D dataset */
     for(u = 0; u < MISSING_CHUNK_DIM; u++) {
         wdata[u] = (int)u;
         rdata[u] = 911;
     } /* end for */
 
+    /* Initialize data for 2-D dataset */
+    for(i = 0; i < MISSING_CHUNK_DIM; i++) {
+	for(j = 0; j < MISSING_CHUNK_DIM; j++) {
+	    wdata2[i][j] = (int)j + (i * MISSING_CHUNK_DIM);
+	    rdata2[i][j] = 911;
+	}
+    } /* end for */
+
     /* Create dataspace */
     if((s = H5Screate_simple(1, &dsize, &dmax)) < 0) TEST_ERROR;
+    if((sid2 = H5Screate_simple(2, dsize2, dmax2)) < 0) TEST_ERROR;
 
     /* Create dataset creation property list */
     if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR;
+    if((dcpl2 = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR;
 
     /* Set to chunked */
     if(H5Pset_chunk(dcpl, 1, &csize) < 0) TEST_ERROR;
+    if(H5Pset_chunk(dcpl2, 2, csize2) < 0) TEST_ERROR;
 
     /* Undefine fill value */
     if(H5Pset_fill_value(dcpl, H5T_NATIVE_INT, NULL) < 0) TEST_ERROR;
+    if(H5Pset_fill_value(dcpl2, H5T_NATIVE_INT, NULL) < 0) TEST_ERROR;
 
-    /* Create dataset */
+    /* Create the 1-D & 2-D datasets */
     if((d = H5Dcreate2(file, MISSING_CHUNK_DATASET, H5T_NATIVE_INT, s, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) TEST_ERROR;
+    if((did2 = H5Dcreate2(file, MISSING_CHUNK_DATASET2, H5T_NATIVE_INT, sid2, H5P_DEFAULT, dcpl2, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Get the chunk index types */
+    if(H5D__layout_idx_type_test(d, &idx_type) < 0) TEST_ERROR;
+    if(H5D__layout_idx_type_test(did2, &idx_type2) < 0) TEST_ERROR;
+
+    /* Verify index type */
+    if(low == H5F_LIBVER_LATEST) {
+        if(idx_type != H5D_CHUNK_IDX_EARRAY)
+            FAIL_PUTS_ERROR("should be using Extensible Array as index");
+        if(idx_type2 != H5D_CHUNK_IDX_BT2)
+            FAIL_PUTS_ERROR("should be using v2 B-tree as index");
+    } else { 
+	if(idx_type != H5D_CHUNK_IDX_BTREE)
+	    FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+	if(idx_type2 != H5D_CHUNK_IDX_BTREE)
+	    FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+    }
 
     /* Select elements in every other chunk for 1-D dataset */
     hs_start[0]=0;
@@ -6506,13 +6767,23 @@ test_missing_chunk(hid_t file)
     if(H5Sselect_hyperslab(s, H5S_SELECT_SET, hs_start, hs_stride, hs_count,
 			    hs_block) < 0) TEST_ERROR;
 
-    /* Write selected data */
+    /* Select elements in every other chunk for 2-D dataset */
+    hs_start2[0] = hs_start2[1] = 0;
+    hs_stride2[0] = hs_stride2[1] = 10;
+    hs_count2[0] = hs_count2[1] = 10;
+    hs_block2[0] = hs_block2[1] = 5;
+    if(H5Sselect_hyperslab(sid2, H5S_SELECT_SET, hs_start2, hs_stride2, hs_count2,
+			    hs_block2) < 0) TEST_ERROR;
+
+    /* Write selected data to the datasets */
     if(H5Dwrite(d, H5T_NATIVE_INT, s, s, H5P_DEFAULT, wdata) < 0) TEST_ERROR;
+    if(H5Dwrite(did2, H5T_NATIVE_INT, sid2, sid2, H5P_DEFAULT, wdata2) < 0) TEST_ERROR;
 
-    /* Read all data */
+    /* Read all data from the datasets */
     if(H5Dread(d, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata) < 0) TEST_ERROR;
+    if(H5Dread(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata2) < 0) TEST_ERROR;
 
-    /* Validata values read */
+    /* Validata values read for the 1-D dataset */
     for(u=0; u<MISSING_CHUNK_DIM; u++) {
         if((u%10)>=5) {
             if(rdata[u]!=911) {
@@ -6528,10 +6799,34 @@ test_missing_chunk(hid_t file)
         } /* end else */
     } /* end for */
 
+    /* Validata values read for the 2-D dataset */
+    for(i = 0; i < MISSING_CHUNK_DIM; i++) {
+	for(j = 0; j < MISSING_CHUNK_DIM; j++) {
+
+	    if((i % 10) >= 5 || (j % 10) >= 5) {
+		if(rdata2[i][j] != 911) {
+		    printf("    Line %d: Incorrect value, rdata2[%u][%u] = %d\n",
+			__LINE__,(unsigned)i, (unsigned)j, rdata2[i][j]);
+		    TEST_ERROR;
+		} /* end if */
+	    } /* end if */
+	    else {
+		if(rdata2[i][j] != wdata2[i][j]) {
+		    printf("    Line %d: Incorrect value, wdata2[%u][%u] = %d, rdata2[%u][%u] = %d\n",
+			__LINE__,(unsigned)i, (unsigned)j, wdata2[i][j],(unsigned)i, (unsigned)j, rdata2[i][j]);
+		    TEST_ERROR;
+		} /* end if */
+	    } /* end else */
+	} /* end for */
+    } /* end for */
+
     /* Close everything */
     if(H5Pclose(dcpl) < 0) TEST_ERROR;
+    if(H5Pclose(dcpl2) < 0) TEST_ERROR;
     if(H5Sclose(s) < 0) TEST_ERROR;
+    if(H5Sclose(sid2) < 0) TEST_ERROR;
     if(H5Dclose(d) < 0) TEST_ERROR;
+    if(H5Dclose(did2) < 0) TEST_ERROR;
 
     PASSED();
     return 0;
@@ -6539,19 +6834,20 @@ test_missing_chunk(hid_t file)
 error:
     H5E_BEGIN_TRY {
         H5Pclose(dcpl);
+        H5Pclose(dcpl2);
         H5Dclose(d);
+        H5Dclose(did2);
         H5Sclose(s);
+        H5Sclose(sid2);
     } H5E_END_TRY;
     return -1;
 } /* end test_missing_chunk() */
 
 

 /*-------------------------------------------------------------------------
- * Function: test_random_chunks
+ * Function: test_random_chunks_real
  *
- * Purpose: Tests that write/read on randomly selected chunks in 2 datasets.
- *              One dataset has fixed dimensions, and the other has unlimited
- *              dimensions which are extended before write/read operations.
+ * Purpose: Tests that write/read on randomly selected chunks 
  *
  *
  * Return: Success: 0
@@ -6563,7 +6859,7 @@ error:
  *-------------------------------------------------------------------------
  */
 static herr_t
-test_random_chunks(hid_t fapl)
+test_random_chunks_real(const char *testname, hbool_t early_alloc, hid_t fapl)
 {
     char        filename[FILENAME_BUF_SIZE];
     hid_t       s=-1, m=-1, d=-1, dcpl=-1, file=-1;
@@ -6572,18 +6868,23 @@ test_random_chunks(hid_t fapl)
                 check2[20][20];
     hsize_t     coord[NPOINTS][2];
     hsize_t     dsize[2]={100,100}, dmax[2]={H5S_UNLIMITED, H5S_UNLIMITED}, csize[2]={10,10}, nsize[2]={200,200};
+    hsize_t	fixed_dmax[2] = {1000, 1000};
     hsize_t     msize[1]={NPOINTS};
     const char  dname[]="dataset";
     int         chunk_row, chunk_col;
     size_t      i, j;
+    H5D_chunk_index_t idx_type; /* Dataset chunk index type */
+    H5F_libver_t low;           /* File format low bound */
 
 
-    TESTING("Write/read on randomly selected chunks");
+    TESTING(testname);
 
     assert(NPOINTS < 100);
 
     h5_fixname(FILENAME[6], fapl, filename, sizeof filename);
 
+    if(H5Pget_libver_bounds(fapl, &low, NULL) < 0) TEST_ERROR;
+
     /* Create file for first test */
     if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR;
 
@@ -6596,8 +6897,9 @@ test_random_chunks(hid_t fapl)
     /* Set chunked layout */
     if(H5Pset_chunk(dcpl, 2, csize) < 0) TEST_ERROR;
 
-    /* Set early allocation time */
-    if(H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY) < 0) TEST_ERROR;
+    /* Set early allocation time for one dataset; the other dataset is using default alloc time */
+    if(early_alloc)
+        if(H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY) < 0) TEST_ERROR;
 
     /* Create dataset */
     if((d = H5Dcreate2(file, dname, H5T_NATIVE_INT, s, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) TEST_ERROR;
@@ -6635,12 +6937,28 @@ test_random_chunks(hid_t fapl)
     if(H5Dclose(d) < 0) TEST_ERROR;
     if(H5Fclose(file) < 0) TEST_ERROR;
 
-    /* Open file again */
+    /* Open first file again */
     if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) TEST_ERROR;
 
     /* Open dataset */
     if((d = H5Dopen2(file, dname, H5P_DEFAULT)) < 0) TEST_ERROR;
 
+    /* Get the chunk index type */
+    if(H5D__layout_idx_type_test(d, &idx_type) < 0) TEST_ERROR;
+
+    /* Verify index type */
+    if(low == H5F_LIBVER_LATEST) {
+        if(early_alloc) {
+            if(idx_type != H5D_CHUNK_IDX_NONE)
+                FAIL_PUTS_ERROR("should be using Non-Index as index");
+        } /* end if */
+        else {
+            if(idx_type != H5D_CHUNK_IDX_FARRAY)
+                FAIL_PUTS_ERROR("should be using Fixed Array as index");
+        } /* end else */
+    } else if(idx_type != H5D_CHUNK_IDX_BTREE) 
+	FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+
     /* Get dataset dataspace */
     if((s = H5Dget_space(d)) < 0) TEST_ERROR;
 
@@ -6668,11 +6986,117 @@ test_random_chunks(hid_t fapl)
     if(H5Fclose(file) < 0) TEST_ERROR;
 
 
-    /* Create file for second test */
+    /* Create second file */
     if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR;
 
     /* Create dataspace with unlimited maximum dimensions */
-    if((s = H5Screate_simple(2, dsize, dmax)) < 0) TEST_ERROR;
+    if(early_alloc) {
+	if((s = H5Screate_simple(2, dsize, fixed_dmax)) < 0) TEST_ERROR;
+    } else
+	if((s = H5Screate_simple(2, dsize, dmax)) < 0) TEST_ERROR;
+
+    /* Create dataset creation property list */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR;
+
+    /* Set chunked layout */
+    if(H5Pset_chunk(dcpl, 2, csize) < 0) TEST_ERROR;
+
+    /* Set early allocation time for one dataset; the other dataset is using default alloc time */
+    if(early_alloc)
+        if(H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY) < 0) TEST_ERROR;
+
+    /* Create dataset */
+    if((d = H5Dcreate2(file, dname, H5T_NATIVE_INT, s, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Get the chunk index type */
+    if(H5D__layout_idx_type_test(d, &idx_type) < 0) TEST_ERROR;
+
+    /* Verify index type */
+    if(low == H5F_LIBVER_LATEST) {
+	if(early_alloc) {
+	    if(idx_type != H5D_CHUNK_IDX_NONE)
+		FAIL_PUTS_ERROR("should be using implicit indexing");
+	} else if(idx_type != H5D_CHUNK_IDX_BT2)
+	    FAIL_PUTS_ERROR("should be using v2 B-tree as index");
+    } else if(idx_type != H5D_CHUNK_IDX_BTREE) 
+	FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+
+    /* Extend both dimensions of the dataset */
+    if(H5Dset_extent(d, nsize) < 0) TEST_ERROR;
+
+    /* Reset the dataset dataspace to new dimensions */
+    if(H5Sset_extent_simple(s, 2, nsize, dmax) < 0) TEST_ERROR;
+
+    /* Initialize check buffer for repeated coordinates */
+    for(i = 0; i < nsize[0]/csize[0]; i++)
+        for(j = 0; j < nsize[1] / csize[1]; j++)
+            check2[i][j] = 0;
+
+    /* Generate random point coordinates. Only one point is selected per chunk */
+    for(i = 0; i < NPOINTS; i++){
+        do {
+            chunk_row = (int)HDrandom() % (int)(nsize[0] / csize[0]);
+            chunk_col = (int)HDrandom() % (int)(nsize[1] / csize[1]);
+        } while (check2[chunk_row][chunk_col]);
+
+        wbuf[i] = check2[chunk_row][chunk_col] = chunk_row + chunk_col + 1;
+        coord[i][0] = (hsize_t)chunk_row * csize[0];
+        coord[i][1] = (hsize_t)chunk_col * csize[1];
+    }
+
+    /* Create dataspace for write buffer */
+    if((m = H5Screate_simple(1, msize, NULL)) < 0) TEST_ERROR;
+
+    /* Select the random points for writing */
+    if(H5Sselect_elements(s, H5S_SELECT_SET, (size_t)NPOINTS, (const hsize_t *)coord) < 0) TEST_ERROR;
+
+    /* Write into dataset */
+    if(H5Dwrite(d, H5T_NATIVE_INT, m, s, H5P_DEFAULT, wbuf) < 0) TEST_ERROR;
+
+    /* Close resources */
+    if(H5Sclose(s) < 0) TEST_ERROR;
+    if(H5Sclose(m) < 0) TEST_ERROR;
+    if(H5Pclose(dcpl) < 0) TEST_ERROR;
+    if(H5Dclose(d) < 0) TEST_ERROR;
+    if(H5Fclose(file) < 0) TEST_ERROR;
+
+    /* Open second file again */
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) TEST_ERROR;
+
+    /* Open dataset */
+    if((d = H5Dopen2(file, dname, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Get dataset dataspace */
+    if((s = H5Dget_space(d)) < 0) TEST_ERROR;
+
+    /* Create dataspace for read buffer */
+    if((m = H5Screate_simple(1, msize, NULL)) < 0) TEST_ERROR;
+
+    /* Select the random points for reading */
+    if(H5Sselect_elements (s, H5S_SELECT_SET, (size_t)NPOINTS, (const hsize_t *)coord) < 0) TEST_ERROR;
+
+    /* Read from dataset */
+    if(H5Dread(d, H5T_NATIVE_INT, m, s, H5P_DEFAULT, rbuf) < 0) TEST_ERROR;
+
+    /* Verify that written and read data are the same */
+    for(i = 0; i < NPOINTS; i++)
+        if(rbuf[i] != wbuf[i]){
+            printf("    Line %d: Incorrect value, wbuf[%u]=%d, rbuf[%u]=%d\n",__LINE__,(unsigned)i,wbuf[i],(unsigned)i,rbuf[i]);
+                TEST_ERROR;
+        } /* end if */
+
+    /* Close resources */
+    if(H5Sclose(s) < 0) TEST_ERROR;
+    if(H5Sclose(m) < 0) TEST_ERROR;
+    if(H5Dclose(d) < 0) TEST_ERROR;
+    if(H5Fclose(file) < 0) TEST_ERROR;
+
+
+    /* Create third file */
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR;
+
+    /* Create dataspace with fixed maximum dimensions */
+    if((s = H5Screate_simple(2, dsize, fixed_dmax)) < 0) TEST_ERROR;
 
     /* Create dataset creation property list */
     if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR;
@@ -6680,12 +7104,29 @@ test_random_chunks(hid_t fapl)
     /* Set chunked layout */
     if(H5Pset_chunk(dcpl, 2, csize) < 0) TEST_ERROR;
 
-    /* Set allocation time to early */
-    if(H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY) < 0) TEST_ERROR;
+    /* Set early allocation time for one dataset; the other dataset is using default alloc time */
+    if(early_alloc)
+        if(H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY) < 0) TEST_ERROR;
 
     /* Create dataset */
     if((d = H5Dcreate2(file, dname, H5T_NATIVE_INT, s, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) TEST_ERROR;
 
+    /* Get the chunk index type */
+    if(H5D__layout_idx_type_test(d, &idx_type) < 0) TEST_ERROR;
+
+    /* Verify index type */
+    if(low == H5F_LIBVER_LATEST) {
+        if(early_alloc) {
+            if(idx_type != H5D_CHUNK_IDX_NONE)
+                FAIL_PUTS_ERROR("should be using Non-Index as index");
+        } /* end if */
+        else {
+            if(idx_type != H5D_CHUNK_IDX_FARRAY)
+                FAIL_PUTS_ERROR("should be using Fixed Array as index");
+        } /* end else */
+    } else if(idx_type != H5D_CHUNK_IDX_BTREE) 
+	FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+
     /* Extend both dimensions of the dataset */
     if(H5Dset_extent(d, nsize) < 0) TEST_ERROR;
 
@@ -6725,7 +7166,7 @@ test_random_chunks(hid_t fapl)
     if(H5Dclose(d) < 0) TEST_ERROR;
     if(H5Fclose(file) < 0) TEST_ERROR;
 
-    /* Open file again */
+    /* Open third file again */
     if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) TEST_ERROR;
 
     /* Open dataset */
@@ -6768,6 +7209,43 @@ error:
         H5Fclose(file);
     } H5E_END_TRY;
     return -1;
+} /* end test_random_chunks_real() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: test_random_chunks
+ *
+ * Purpose: Tests that write/read on randomly selected chunks 
+ *          First file:
+ *              One dataset has fixed dimensions without max. dims & H5D_ALLOC_TIME_EARLY
+ *              One dataset has fixed dimensions without max. dims & default alloc time
+ * 	    Second file:
+ *		One extendible dataset with unlimited max. dims & H5D_ALLOC_TIME_EARLY
+ *		One extendible dataset with unlimited max. dims & default alloc time
+ *	    third file:
+ *		one extendible dataset with fixed max. dims & H5D_ALLOC_TIME_EARLY
+ *		one extendible dataset with fixed max. dims & default alloc time
+ *
+ *          All the datasets in second & third files are extended before write/read operations
+ *
+ *
+ * Return: Success: 0
+ *  Failure: -1
+ *
+ * Programmer: Christian Chilan
+ *             Monday, March 26, 2007
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+test_random_chunks(hid_t fapl)
+{
+    int         nerrors = 0;    /* Errors in sub-tests */
+
+    nerrors += test_random_chunks_real("Write/read on randomly selected chunks w/non-implicit index", FALSE, fapl);
+    nerrors += test_random_chunks_real("Write/read on randomly selected chunks w/implicit index", TRUE, fapl);
+
+    return nerrors;;
 } /* end test_random_chunks() */
 
 #ifndef H5_NO_DEPRECATED_SYMBOLS
@@ -7140,7 +7618,7 @@ test_chunk_cache(hid_t fapl)
      */
     if (H5Pget_cache(fapl_def, NULL, &nslots_1, &nbytes_1, &w0_1) < 0) FAIL_STACK_ERROR
     if (H5Pget_chunk_cache(dapl1, &nslots_4, &nbytes_4, &w0_4) < 0) FAIL_STACK_ERROR
-    if ((nslots_1 != nslots_4) || (nbytes_1 != nbytes_4) || !DBL_ABS_EQUAL(w0_1, w0_4))
+    if ((nslots_1 != nslots_4) || (nbytes_1 != nbytes_4) || !H5_DBL_ABS_EQUAL(w0_1, w0_4))
         FAIL_PUTS_ERROR("    Cache values from default dapl do not match those from fapl.")
 
     /* Set a lapl property on dapl1 (to verify inheritance) */
@@ -7181,7 +7659,7 @@ test_chunk_cache(hid_t fapl)
     /* Retrieve dapl from dataset, verfiy cache values are the same as on fapl_local */
     if ((dapl2 = H5Dget_access_plist(dsid)) < 0) FAIL_STACK_ERROR
     if (H5Pget_chunk_cache(dapl2, &nslots_4, &nbytes_4, &w0_4) < 0) FAIL_STACK_ERROR
-    if ((nslots_2 != nslots_4) || (nbytes_2 != nbytes_4) || !DBL_ABS_EQUAL(w0_2, w0_4))
+    if ((nslots_2 != nslots_4) || (nbytes_2 != nbytes_4) || !H5_DBL_ABS_EQUAL(w0_2, w0_4))
         FAIL_PUTS_ERROR("    Cache values from retrieved dapl do not match those from fapl.")
     if (H5Pclose(dapl2) < 0) FAIL_STACK_ERROR
 
@@ -7203,7 +7681,7 @@ test_chunk_cache(hid_t fapl)
      */
     if ((dapl2 = H5Dget_access_plist(dsid)) < 0) FAIL_STACK_ERROR
     if (H5Pget_chunk_cache(dapl2, &nslots_4, &nbytes_4, &w0_4) < 0) FAIL_STACK_ERROR
-    if ((nslots_3 != nslots_4) || (nbytes_2 != nbytes_4) || !DBL_ABS_EQUAL(w0_3, w0_4))
+    if ((nslots_3 != nslots_4) || (nbytes_2 != nbytes_4) || !H5_DBL_ABS_EQUAL(w0_3, w0_4))
         FAIL_PUTS_ERROR("    Cache values from retrieved dapl do not match those from dapl1.")
     if (H5Pclose(dapl2) < 0) FAIL_STACK_ERROR
 
@@ -7214,7 +7692,7 @@ test_chunk_cache(hid_t fapl)
     /* Retrieve dapl from dataset, verfiy cache values are the same on fapl_local */
     if ((dapl2 = H5Dget_access_plist(dsid)) < 0) FAIL_STACK_ERROR
     if (H5Pget_chunk_cache(dapl2, &nslots_4, &nbytes_4, &w0_4) < 0) FAIL_STACK_ERROR
-    if ((nslots_2 != nslots_4) || (nbytes_2 != nbytes_4) || !DBL_ABS_EQUAL(w0_2, w0_4))
+    if ((nslots_2 != nslots_4) || (nbytes_2 != nbytes_4) || !H5_DBL_ABS_EQUAL(w0_2, w0_4))
         FAIL_PUTS_ERROR("    Cache values from retrieved dapl do not match those from fapl.")
     if (H5Pclose(dapl2) < 0) FAIL_STACK_ERROR
 
@@ -7224,7 +7702,7 @@ test_chunk_cache(hid_t fapl)
         FAIL_STACK_ERROR
     if ((dapl2 = H5Dget_access_plist(dsid)) < 0) FAIL_STACK_ERROR
     if (H5Pget_chunk_cache(dapl2, &nslots_4, &nbytes_4, &w0_4) < 0) FAIL_STACK_ERROR
-    if ((nslots_2 != nslots_4) || (nbytes_2 != nbytes_4) || !DBL_ABS_EQUAL(w0_2, w0_4))
+    if ((nslots_2 != nslots_4) || (nbytes_2 != nbytes_4) || !H5_DBL_ABS_EQUAL(w0_2, w0_4))
         FAIL_PUTS_ERROR("    Cache values from retrieved dapl do not match those from fapl.")
     /* Don't close dapl2, we will use it in the next section */
 
@@ -7244,7 +7722,7 @@ test_chunk_cache(hid_t fapl)
     if (H5Pclose(dapl2) < 0) FAIL_STACK_ERROR /* Close dapl2, to avoid id leak */
     if ((dapl2 = H5Dget_access_plist(dsid)) < 0) FAIL_STACK_ERROR
     if (H5Pget_chunk_cache(dapl2, &nslots_4, &nbytes_4, &w0_4) < 0) FAIL_STACK_ERROR
-    if ((nslots_2 != nslots_4) || (nbytes_2 != nbytes_4) || !DBL_ABS_EQUAL(w0_2, w0_4))
+    if ((nslots_2 != nslots_4) || (nbytes_2 != nbytes_4) || !H5_DBL_ABS_EQUAL(w0_2, w0_4))
         FAIL_PUTS_ERROR("    Cache values from retrieved dapl do not match those from dapl2.")
 
     /* Test H5D_CHUNK_CACHE_NSLOTS_DEFAULT and H5D_CHUNK_CACHE_W0_DEFAULT */
@@ -7257,7 +7735,7 @@ test_chunk_cache(hid_t fapl)
     if (H5Pclose(dapl2) < 0) FAIL_STACK_ERROR /* Close dapl2, to avoid id leak */
     if ((dapl2 = H5Dget_access_plist(dsid)) < 0) FAIL_STACK_ERROR
     if (H5Pget_chunk_cache(dapl2, &nslots_4, &nbytes_4, &w0_4) < 0) FAIL_STACK_ERROR
-    if ((nslots_3 != nslots_4) || (nbytes_2 != nbytes_4) || !DBL_ABS_EQUAL(w0_3, w0_4))
+    if ((nslots_3 != nslots_4) || (nbytes_2 != nbytes_4) || !H5_DBL_ABS_EQUAL(w0_3, w0_4))
         FAIL_PUTS_ERROR("    Cache values from retrieved dapl do not match those expected.")
     if (H5Pclose(dapl2) < 0) FAIL_STACK_ERROR
 
@@ -7267,14 +7745,14 @@ test_chunk_cache(hid_t fapl)
     if ((dsid = H5Oopen(fid, "dset", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
     if ((dapl2 = H5Dget_access_plist(dsid)) < 0) FAIL_STACK_ERROR
     if (H5Pget_chunk_cache(dapl2, &nslots_4, &nbytes_4, &w0_4) < 0) FAIL_STACK_ERROR
-    if ((nslots_3 != nslots_4) || (nbytes_3 != nbytes_4) || !DBL_ABS_EQUAL(w0_3, w0_4))
+    if ((nslots_3 != nslots_4) || (nbytes_3 != nbytes_4) || !H5_DBL_ABS_EQUAL(w0_3, w0_4))
         FAIL_PUTS_ERROR("    Cache values from retrieved dapl do not match those from fapl.")
     if (H5Pclose(dapl2) < 0) FAIL_STACK_ERROR
 
     /* Verify functionality of H5Pcopy with a dapl */
     if ((dapl2 = H5Pcopy(dapl1)) < 0) FAIL_STACK_ERROR
     if (H5Pget_chunk_cache(dapl2, &nslots_4, &nbytes_4, &w0_4) < 0) FAIL_STACK_ERROR
-    if ((nslots_3 != nslots_4) || (nbytes_1 != nbytes_4) || !DBL_ABS_EQUAL(w0_3, w0_4))
+    if ((nslots_3 != nslots_4) || (nbytes_1 != nbytes_4) || !H5_DBL_ABS_EQUAL(w0_3, w0_4))
         FAIL_PUTS_ERROR("    Cache values from dapl2 do not match those from dapl1.")
 
     /* Close */
@@ -7327,23 +7805,36 @@ static herr_t
 test_big_chunks_bypass_cache(hid_t fapl)
 {
     char        filename[FILENAME_BUF_SIZE];
-    hid_t       fid = -1;       /* File ID */
-    hid_t       fapl_local = -1; /* File access property list ID */
-    hid_t       dcpl = -1;      /* Dataset creation property list ID */
-    hid_t       sid = -1;       /* Dataspace ID */
-    hid_t       dsid = -1;      /* Dataset ID */
-    hsize_t     dim, chunk_dim; /* Dataset and chunk dimensions */
-    size_t      rdcc_nelmts, rdcc_nbytes;
-    int         fvalue = BYPASS_FILL_VALUE;
-    hsize_t     count, stride, offset, block;
+    hid_t       fid = -1;       	/* File ID */
+    hid_t       fapl_local = -1; 	/* File access property list ID */
+    hid_t       dcpl = -1, t_dcpl = -1;	/* Dataset creation property list ID */
+    hid_t       sid = -1, t_sid = -1; 	/* Dataspace ID */
+    hid_t	mid; 			/* Memory space ID */
+    hid_t       dsid = -1, t_dsid = -1;	/* Dataset ID */
+    hsize_t     dim, chunk_dim; 	/* Dataset and chunk dimensions */
+    hsize_t     t_dim[2], t_max[2], t_chunk_dim[2]; /* Dataset and chunk dimensions */
+    size_t      rdcc_nelmts, rdcc_nbytes;	/* Chunk cache parameters */
+    int         fvalue = BYPASS_FILL_VALUE;	/* Fill value */
+    hsize_t     count, stride, offset, block;	/* Setting for hyperslab (1-D) */
+    hsize_t     t_count[2], t_stride[2], t_offset[2], t_block[2];  /* Setting for hyperslab (2-D) */
+		/* Buffer for reading and writing data (1-D) */
     static int  wdata[BYPASS_CHUNK_DIM/2], rdata1[BYPASS_DIM],
-                rdata2[BYPASS_CHUNK_DIM/2];
-    int         i, j;
+                rdata2[BYPASS_CHUNK_DIM/2];	
+		/* Buffer for reading and writing data (2-D) */
+    static int  t_wdata[BYPASS_CHUNK_DIM/2][BYPASS_CHUNK_DIM/2], t_rdata1[BYPASS_DIM][BYPASS_DIM],
+                t_rdata2[BYPASS_CHUNK_DIM/2][BYPASS_CHUNK_DIM/2];
+    int         i, j;		/* Local index variables */
+    H5F_libver_t low;           /* File format low bound */
+    H5D_chunk_index_t idx_type, t_idx_type;      /* Dataset chunk index types */
+
 
     TESTING("big chunks bypassing the cache");
 
     h5_fixname(FILENAME[9], fapl, filename, sizeof filename);
 
+     /* Check if we are using the latest version of the format */
+    if(H5Pget_libver_bounds(fapl, &low, NULL) < 0) FAIL_STACK_ERROR
+
     /* Copy fapl passed to this function (as we will be modifying it) */
     if((fapl_local = H5Pcopy(fapl)) < 0) FAIL_STACK_ERROR
 
@@ -7355,52 +7846,101 @@ test_big_chunks_bypass_cache(hid_t fapl)
     /* Create file */
     if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_local)) < 0) FAIL_STACK_ERROR
 
-    /* Create 1-D dataspace */
-    dim = BYPASS_DIM;
+    /* Create 1-D & 2-D dataspace */
+    dim = t_dim[0] = t_dim[1] = BYPASS_DIM;
+    t_max[0] = t_max[1] = H5S_UNLIMITED;
     if((sid = H5Screate_simple(1, &dim, NULL)) < 0) FAIL_STACK_ERROR
+    if((t_sid = H5Screate_simple(2, t_dim, t_max)) < 0) FAIL_STACK_ERROR
 
-    /* Create dataset creation property list */
+    /* Create 1-D & 2-D dataset creation property list */
     if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR
+    if((t_dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR
 
-    /* Define chunk size.  There will be only 2 chunks in the dataset. */
-    chunk_dim = BYPASS_CHUNK_DIM;
+    /* Define chunk size. */
+    /* There will be 2 chunks in 1-D dataset & 4 chunks in the 2-D dataset */
+    chunk_dim = t_chunk_dim[0] = t_chunk_dim[1] = BYPASS_CHUNK_DIM;
     if(H5Pset_chunk(dcpl, 1, &chunk_dim) < 0) FAIL_STACK_ERROR
+    if(H5Pset_chunk(t_dcpl, 2, t_chunk_dim) < 0) FAIL_STACK_ERROR
 
     /* Define fill value, fill time, and chunk allocation time */
     if(H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fvalue) < 0) FAIL_STACK_ERROR
+    if(H5Pset_fill_value(t_dcpl, H5T_NATIVE_INT, &fvalue) < 0) FAIL_STACK_ERROR
+
     if(H5Pset_fill_time(dcpl, H5D_FILL_TIME_IFSET) < 0) FAIL_STACK_ERROR
+    if(H5Pset_fill_time(t_dcpl, H5D_FILL_TIME_IFSET) < 0) FAIL_STACK_ERROR
+
     if(H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_INCR) < 0) FAIL_STACK_ERROR
+    if(H5Pset_alloc_time(t_dcpl, H5D_ALLOC_TIME_INCR) < 0) FAIL_STACK_ERROR
 
     /* Create the first 1-D dataset */
     if((dsid = H5Dcreate2(fid, BYPASS_DATASET1, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
         FAIL_STACK_ERROR
 
+    /* Create the first 2-D dataset */
+    if((t_dsid = H5Dcreate2(fid, T_BYPASS_DATASET1, H5T_NATIVE_INT, t_sid, H5P_DEFAULT, t_dcpl, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get the chunk index types for 1-D and 2-d datasets */
+    if(H5D__layout_idx_type_test(dsid, &idx_type) < 0) FAIL_STACK_ERROR
+    if(H5D__layout_idx_type_test(t_dsid, &t_idx_type) < 0) FAIL_STACK_ERROR
+
+    /* Chunk index type expected depends on whether we are using the latest version of the format */
+    if(low == H5F_LIBVER_LATEST) {
+	/* Verify index type */
+	if(idx_type != H5D_CHUNK_IDX_FARRAY) FAIL_PUTS_ERROR("should be using Fixed Array as index");
+	if(t_idx_type != H5D_CHUNK_IDX_BT2) FAIL_PUTS_ERROR("should be using v2 B-tree as index");
+    } else {
+	/* Verify index type */
+	if(idx_type != H5D_CHUNK_IDX_BTREE) FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+	if(t_idx_type != H5D_CHUNK_IDX_BTREE) FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+    } /* end else */
+
     /* Select first chunk to write the data */
-    offset = 0;
-    count = 1;
-    stride = 1;
-    block = BYPASS_CHUNK_DIM / 2;
+    offset = t_offset[0] = t_offset[1] = 0;
+    count = t_count[0] = t_count[1] = 1;
+    stride = t_stride[0] = t_stride[1] = 1;
+    block = t_block[0] = t_block[1] = BYPASS_CHUNK_DIM / 2;
     if(H5Sselect_hyperslab(sid, H5S_SELECT_SET, &offset, &stride, &count, &block) < 0)
         FAIL_STACK_ERROR
 
-    /* Initialize data to write */
+    if(H5Sselect_hyperslab(t_sid, H5S_SELECT_SET, t_offset, t_stride, t_count, t_block) < 0)
+        FAIL_STACK_ERROR
+
+    /* Initialize data to write for 1-D dataset */
     for(i = 0; i < BYPASS_CHUNK_DIM / 2; i++)
         wdata[i] = i;
 
+    /* Initialize data to write for 2-D dataset */
+    for(i = 0; i < BYPASS_CHUNK_DIM / 2; i++)
+	for(j = 0; j < BYPASS_CHUNK_DIM / 2; j++)
+	    t_wdata[i][j] = j;
+
+    /* Set up memory space for the 2-D dataset */
+    mid = H5Screate_simple(2, t_block, NULL);
+
+    /* Write to the first 1-D & 2-D datasets */
     /* This write should go through the cache because fill value is used. */
     if(H5Dwrite(dsid, H5T_NATIVE_INT, H5S_ALL, sid, H5P_DEFAULT, wdata) < 0)
         FAIL_STACK_ERROR
+    if(H5Dwrite(t_dsid, H5T_NATIVE_INT, mid, t_sid, H5P_DEFAULT, t_wdata) < 0)
+        FAIL_STACK_ERROR
 
+    /* Close the first 1-D & 2-D datasets */
     if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+    if(H5Dclose(t_dsid) < 0) FAIL_STACK_ERROR
 
-    /* Reopen the dataset */
+    /* Reopen the first 1-D & 2-D datasets */
     if((dsid = H5Dopen2(fid, BYPASS_DATASET1, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+    if((t_dsid = H5Dopen2(fid, T_BYPASS_DATASET1, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
 
     /* Reads both 2 chunks.  Reading the second chunk should bypass the cache because the
      * chunk is bigger than the cache size and it isn't allocated on disk. */
     if(H5Dread(dsid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata1) < 0)
         FAIL_STACK_ERROR
+    if(H5Dread(t_dsid, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, t_rdata1) < 0)
+        FAIL_STACK_ERROR
 
+    /* Verify data for the first 1-D dataset */
     for(i = 0; i < BYPASS_CHUNK_DIM / 2; i++)
         if(rdata1[i] != i) {
             printf("    Read different values than written in the 1st chunk.\n");
@@ -7415,41 +7955,88 @@ test_big_chunks_bypass_cache(hid_t fapl)
             TEST_ERROR
         } /* end if */
 
-    /* Close the first dataset */
+    /* Verify data for the first 2-D dataset */
+    for(i = 0; i < BYPASS_CHUNK_DIM / 2; i++)
+	for(j = 0; j < BYPASS_CHUNK_DIM / 2; j++)
+	    if(t_rdata1[i][j] != j) {
+		printf("    Read different values than written in the 1st chunk.\n");
+		printf("    At line %d and index (%d, %d), t_rdata1 = %d. It should be %d.\n", 
+		    __LINE__, i, j, t_rdata1[i][j], j);
+		TEST_ERROR
+	    } /* end if */
+
+    for(i = BYPASS_CHUNK_DIM / 2; i < BYPASS_DIM; i++)
+	for(j = BYPASS_CHUNK_DIM / 2; j < BYPASS_DIM; j++)
+	    if(t_rdata1[i][j] != fvalue) {
+		printf("    Read different values than written in the 2nd chunk.\n");
+		printf("    At line %d and index (%d, %d), t_rdata1 = %d. It should be %d.\n", 
+		    __LINE__, i, j, t_rdata1[i][j], fvalue);
+            TEST_ERROR
+	    } /* end if */
+
+    /* Close the first 1-D & 2-D datasets */
     if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+    if(H5Dclose(t_dsid) < 0) FAIL_STACK_ERROR
 
     /* Create a second dataset without fill value.  This time, both write
      * and read should bypass the cache because the chunk is bigger than the
      * cache size and it's not allocated on disk. */
     if(H5Pset_fill_time(dcpl, H5D_FILL_TIME_NEVER) < 0) FAIL_STACK_ERROR
+    if(H5Pset_fill_time(t_dcpl, H5D_FILL_TIME_NEVER) < 0) FAIL_STACK_ERROR
 
+    /* Create a second 1-D & 2-D dataset */
     if((dsid = H5Dcreate2(fid, BYPASS_DATASET2, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
         FAIL_STACK_ERROR
+    if((t_dsid = H5Dcreate2(fid, T_BYPASS_DATASET2, H5T_NATIVE_INT, t_sid, H5P_DEFAULT, t_dcpl, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
 
+    /* Write to the second 1-D & 2-D dataset */
     if(H5Dwrite(dsid, H5T_NATIVE_INT, H5S_ALL, sid, H5P_DEFAULT, wdata) < 0)
         FAIL_STACK_ERROR
+    if(H5Dwrite(t_dsid, H5T_NATIVE_INT, mid, t_sid, H5P_DEFAULT, t_wdata) < 0)
+        FAIL_STACK_ERROR
 
+    /* Close the second 1-D & 2-D dataset */
     if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+    if(H5Dclose(t_dsid) < 0) FAIL_STACK_ERROR
 
-    /* Reopen the dataset */
+    /* Reopen the second 1-d dataset and 2-d dataset */
     if((dsid = H5Dopen2(fid, BYPASS_DATASET2, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+    if((t_dsid = H5Dopen2(fid, T_BYPASS_DATASET2, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
 
     /* Read back only the part that was written to the file.  Reading the
      * half chunk should bypass the cache because the chunk is bigger than
      * the cache size. */
     if(H5Dread(dsid, H5T_NATIVE_INT, H5S_ALL, sid, H5P_DEFAULT, rdata2) < 0)
+	FAIL_STACK_ERROR
+    if(H5Dread(t_dsid, H5T_NATIVE_INT, mid, t_sid, H5P_DEFAULT, t_rdata2) < 0)
+	FAIL_STACK_ERROR
 
+    /* Verify data for the second 1-D dataset */
     for(i = 0; i < BYPASS_CHUNK_DIM / 2; i++)
-        if(rdata2[i] != i) {
+	if(rdata2[i] != i) {
             printf("    Read different values than written in the chunk.\n");
             printf("    At line %d and index %d, rdata2 = %d. It should be %d.\n", __LINE__, i, rdata2[i], i);
             TEST_ERROR
         } /* end if */
 
+    /* Verify data for the second 2-D dataset */
+    for(i = 0; i < BYPASS_CHUNK_DIM / 2; i++)
+	for(j = 0; j < BYPASS_CHUNK_DIM / 2; j++)
+	    if(t_rdata2[i][j] != j) {
+		printf("    Read different values than written in the chunk.\n");
+		printf("    At line %d and index (%d, %d), t_rdata2 = %d. It should be %d.\n", 
+		    __LINE__, i, j, t_rdata2[i][j], j);
+		TEST_ERROR
+	    } /* end if */
+
     /* Close IDs */
     if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+    if(H5Sclose(t_sid) < 0) FAIL_STACK_ERROR
     if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+    if(H5Dclose(t_dsid) < 0) FAIL_STACK_ERROR
     if(H5Pclose(dcpl) < 0) FAIL_STACK_ERROR
+    if(H5Pclose(t_dcpl) < 0) FAIL_STACK_ERROR
     if(H5Pclose(fapl_local) < 0) FAIL_STACK_ERROR
     if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
 
@@ -7459,14 +8046,596 @@ test_big_chunks_bypass_cache(hid_t fapl)
 error:
     H5E_BEGIN_TRY {
         H5Pclose(dcpl);
+        H5Pclose(t_dcpl);
         H5Pclose(fapl_local);
         H5Dclose(dsid);
+        H5Dclose(t_dsid);
         H5Sclose(sid);
+        H5Sclose(t_sid);
         H5Fclose(fid);
     } H5E_END_TRY;
     return -1;
 } /* end test_big_chunks_bypass_cache() */
 
+

+/*-------------------------------------------------------------------------
+ * Function: test_chunk_fast
+ *
+ * Purpose: Tests support for extensible arrays as chunk index.
+ *
+ * Return:      Success: 0
+ *              Failure: -1
+ *
+ * Programmer:  Quincey Koziol
+ *              Tuesday, February  3, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+test_chunk_fast(const char *env_h5_driver, hid_t fapl)
+{
+    char        filename[FILENAME_BUF_SIZE];
+    hid_t       fid = -1;       /* File ID */
+    hid_t       my_fapl = -1;   /* File access property list ID */
+    hid_t       dcpl = -1;      /* Dataset creation property list ID */
+    hid_t       sid = -1;       /* Dataspace ID */
+    hid_t       scalar_sid = -1;/* Scalar dataspace ID */
+    hid_t       dsid = -1;      /* Dataset ID */
+    hsize_t     fill;           /* Temporary value, for filling arrays */
+    hsize_t     hs_size[EARRAY_MAX_RANK];   /* Hyperslab size */
+    hsize_t     chunk_dim[EARRAY_MAX_RANK]; /* Chunk dimensions */
+    H5F_libver_t low;           /* File format low bound */
+    unsigned    swmr;           /* Whether file should be written with SWMR access enabled */
+
+    TESTING("datasets w/extensible array as chunk index");
+
+    h5_fixname(FILENAME[10], fapl, filename, sizeof filename);
+
+    /* Copy the file access property list */
+    if((my_fapl = H5Pcopy(fapl)) < 0) FAIL_STACK_ERROR
+
+    /* Turn on the chunk cache again */
+    {
+        int mdc_nelmts;             /* # of elements in metadata cache */
+        size_t rdcc_nelmts;         /* # of chunks in chunk cache */
+        size_t rdcc_nbytes;         /* # of bytes in chunk cache */
+        double rdcc_w0;             /* write-ratio for chunk cache */
+
+        if(H5Pget_cache(my_fapl, &mdc_nelmts, &rdcc_nelmts, &rdcc_nbytes, &rdcc_w0) < 0) FAIL_STACK_ERROR
+        rdcc_nbytes = 1048576;
+        if(H5Pset_cache(my_fapl, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0) < 0) FAIL_STACK_ERROR
+    } /* end block */
+
+    /* Check if we are using the latest version of the format */
+    if(H5Pget_libver_bounds(my_fapl, &low, NULL) < 0) FAIL_STACK_ERROR
+
+    /* Create scalar dataspace */
+    if((scalar_sid = H5Screate(H5S_SCALAR)) < 0) FAIL_STACK_ERROR
+
+    /* Initialize chunk dimensions */
+    fill = EARRAY_CHUNK_DIM;
+    H5VM_array_fill(chunk_dim, &fill, sizeof(fill), EARRAY_MAX_RANK);
+
+    /* Initialize hyperslab size */
+    fill = 1;
+    H5VM_array_fill(hs_size, &fill, sizeof(fill), EARRAY_MAX_RANK);
+
+    /* Loop over using SWMR access to write */
+    for(swmr = 0; swmr <= 1; swmr++) {
+	int     compress;       /* Whether chunks should be compressed */
+
+        /* SWMR is now supported with/without latest format:  */
+	/* (1) write+latest-format (2) SWMR-write+non-latest-format */
+
+        /* Skip this iteration if SWMR I/O is not supported for the VFD specified
+         * by the environment variable.
+         */
+        if(!H5FD_supports_swmr_test(env_h5_driver)) {
+            continue;
+        }
+
+#ifdef H5_HAVE_FILTER_DEFLATE
+        /* Loop over compressing chunks */
+        for(compress = 0; compress <= 1; compress++)
+#else
+	/* Loop over without compression */
+        for(compress = 0; compress <= 0; compress++)
+#endif /* H5_HAVE_FILTER_DEFLATE */
+	{
+            H5D_alloc_time_t alloc_time;        /* Storage allocation time */
+
+            /* Loop over storage allocation time */
+            for(alloc_time = H5D_ALLOC_TIME_EARLY; alloc_time <= H5D_ALLOC_TIME_INCR; alloc_time++) {
+                unsigned ndims;          /* Current # of dims to test */
+
+                /* Loop over dataspace ranks to test */
+                for(ndims = 1; ndims < (EARRAY_MAX_RANK + 1); ndims++) {
+                    unsigned unlim_dim;
+
+                    /* Create dataset creation property list */
+                    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR
+
+                    /* Set chunking & chunk dims */
+                    if(H5Pset_chunk(dcpl, (int)ndims, chunk_dim) < 0) FAIL_STACK_ERROR
+
+#ifdef H5_HAVE_FILTER_DEFLATE
+                    /* Check if we should compress the chunks */
+                    if(compress)
+                        if(H5Pset_deflate(dcpl, 9) < 0) FAIL_STACK_ERROR
+#endif /* H5_HAVE_FILTER_DEFLATE */
+
+                    /* Set fill time */
+                    if(H5Pset_fill_time(dcpl, H5D_FILL_TIME_ALLOC) < 0) FAIL_STACK_ERROR
+
+                    /* Set allocation time */
+                    if(H5Pset_alloc_time(dcpl, alloc_time) < 0) FAIL_STACK_ERROR
+
+                    /* Loop over which dimension is unlimited */
+                    for(unlim_dim = 0; unlim_dim < ndims; unlim_dim++) {
+                        H5D_chunk_index_t idx_type; /* Dataset chunk index type */
+                        hsize_t dim[EARRAY_MAX_RANK], max_dim[EARRAY_MAX_RANK]; /* Dataset dimensions */
+                        hsize_t swizzled_dim[EARRAY_MAX_RANK];      /* Dimensions, with unlimited dimension moved to rank 0 */
+                        hsize_t down[EARRAY_MAX_RANK];      /* 'down' sizes, for computing array index */
+                        hsize_t hs_offset[EARRAY_MAX_RANK];      /* Hyperslab offset */
+                        hssize_t snpoints;      /* # of points in dataspace extent (signed) */
+                        hsize_t npoints;        /* # of points in dataspace extent */
+                        unsigned write_elem, read_elem;  /* Element written/read */
+                        hsize_t u;             /* Local index variable */
+
+                        /* Create file */
+                        if((fid = H5Fcreate(filename, H5F_ACC_TRUNC | (swmr ? H5F_ACC_SWMR_WRITE : 0), H5P_DEFAULT, my_fapl)) < 0) FAIL_STACK_ERROR
+
+                        /* Create n-D dataspace */
+                        fill = EARRAY_DSET_DIM;
+                        H5VM_array_fill(dim, &fill, sizeof(fill), EARRAY_MAX_RANK);
+                        fill = EARRAY_DSET_DIM;
+                        H5VM_array_fill(max_dim, &fill, sizeof(fill), EARRAY_MAX_RANK);
+                        max_dim[unlim_dim] = H5S_UNLIMITED;
+                        fill = EARRAY_DSET_DIM;
+                        H5VM_array_fill(swizzled_dim, &fill, sizeof(fill), EARRAY_MAX_RANK);
+                        if((sid = H5Screate_simple((int)ndims, dim, max_dim)) < 0) FAIL_STACK_ERROR
+
+                        /* Get the number of points in the dataspace */
+                        if((snpoints = H5Sget_simple_extent_npoints(sid)) < 0) FAIL_STACK_ERROR
+                        npoints = (hsize_t)snpoints;
+
+                        /* Compute the "down" dimension values */
+                        if(H5VM_array_down(ndims, dim, down) < 0) FAIL_STACK_ERROR
+
+                        /* Create chunked dataset */
+                        if((dsid = H5Dcreate2(fid, "dset", H5T_NATIVE_UINT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+                            FAIL_STACK_ERROR
+
+                        /* Get the chunk index type */
+                        if(H5D__layout_idx_type_test(dsid, &idx_type) < 0) FAIL_STACK_ERROR
+
+                        /* Chunk index type expected depends on whether we are using the latest version of the format */
+                        if(low == H5F_LIBVER_LATEST || swmr) {
+                            /* Verify index type */
+                            if(idx_type != H5D_CHUNK_IDX_EARRAY) FAIL_PUTS_ERROR("should be using extensible array as index");
+                        } /* end if */
+                        else {
+                            /* Verify index type */
+                            if(idx_type != H5D_CHUNK_IDX_BTREE) FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+                        } /* end else */
+
+                        /* Fill existing elements */
+                        for(u = 0; u < npoints; u++) {
+                            /* Compute the coordinate from the linear offset */
+                            if(H5VM_array_calc_pre(u, ndims, down, hs_offset) < 0) FAIL_STACK_ERROR
+
+                            /* Un-swizzle hyperslab offset in same way as swizzled dimensions */
+                            H5VM_unswizzle_coords(hsize_t, hs_offset, unlim_dim);
+
+                            /* Select a single element in the dataset */
+                            if(H5Sselect_hyperslab(sid, H5S_SELECT_SET, hs_offset, NULL, hs_size, NULL) < 0) FAIL_STACK_ERROR
+
+                            /* Read (unwritten) element from dataset */
+                            read_elem = 1;
+                            if(H5Dread(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &read_elem) < 0) FAIL_STACK_ERROR
+
+                            /* Verify unwritten element is fill value (0) */
+                            if(read_elem != 0) FAIL_PUTS_ERROR("invalid unwritten element read");
+
+                            /* Write element to dataset */
+                            write_elem = (unsigned)u;
+                            if(H5Dwrite(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &write_elem) < 0) FAIL_STACK_ERROR
+
+                            /* Read element from dataset */
+                            read_elem = write_elem + 1;
+                            if(H5Dread(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &read_elem) < 0) FAIL_STACK_ERROR
+
+                            /* Verify written element is read in */
+                            if(read_elem != write_elem) FAIL_PUTS_ERROR("invalid written element read");
+                        } /* end for */
+
+                        /* Incrementally extend dataset and verify write/reads */
+                        while(dim[unlim_dim] < EARRAY_MAX_EXTEND) {
+                            hssize_t snew_npoints;      /* # of points in dataspace extent (signed) */
+                            hsize_t new_npoints;        /* # of points in dataspace extent */
+
+                            /* Extend dataset */
+                            dim[unlim_dim] += EARRAY_EXTEND_INCR;
+                            swizzled_dim[0] += EARRAY_EXTEND_INCR;
+                            if(H5Dset_extent(dsid, dim) < 0) FAIL_STACK_ERROR
+
+                            /* Close old dataspace */
+                            if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+
+                            /* Get dataspace for dataset now */
+                            if((sid = H5Dget_space(dsid)) < 0) FAIL_STACK_ERROR
+
+                            /* Get the new number of points in the dataspace */
+                            if((snew_npoints = H5Sget_simple_extent_npoints(sid)) < 0) FAIL_STACK_ERROR
+                            new_npoints = (hsize_t)snew_npoints;
+
+                            /* Fill new elements */
+                            for(u = npoints; u < new_npoints; u++) {
+                                /* Compute the coordinate from the linear offset */
+                                if(H5VM_array_calc(u, ndims, swizzled_dim, hs_offset) < 0) FAIL_STACK_ERROR
+
+                                /* Un-swizzle hyperslab offset in same way as swizzled dimensions */
+                                H5VM_unswizzle_coords(hsize_t, hs_offset, unlim_dim);
+
+                                /* Select a single element in the dataset */
+                                if(H5Sselect_hyperslab(sid, H5S_SELECT_SET, hs_offset, NULL, hs_size, NULL) < 0) FAIL_STACK_ERROR
+
+                                /* Read (unwritten) element from dataset */
+                                read_elem = 1;
+                                if(H5Dread(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &read_elem) < 0) FAIL_STACK_ERROR
+
+                                /* Verify unwritten element is fill value (0) */
+                                if(read_elem != 0) FAIL_PUTS_ERROR("invalid unwritten element read");
+
+                                /* Write element to dataset */
+                                write_elem = (unsigned)u;
+                                if(H5Dwrite(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &write_elem) < 0) FAIL_STACK_ERROR
+
+                                /* Read element from dataset */
+                                read_elem = write_elem + 1;
+                                if(H5Dread(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &read_elem) < 0) FAIL_STACK_ERROR
+
+                                /* Verify written element is read in */
+                                if(read_elem != write_elem) FAIL_PUTS_ERROR("invalid written element read");
+                            } /* end for */
+
+                            /* Update the number of points in the dataspace */
+                            npoints = new_npoints;
+                        } /* end while */
+
+                        /* Close everything */
+                        if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+                        if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+                        if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
+
+
+                        /* Re-open file & dataset */
+                        if((fid = H5Fopen(filename, H5F_ACC_RDONLY | (swmr ? H5F_ACC_SWMR_READ : 0), my_fapl)) < 0) FAIL_STACK_ERROR
+
+                        /* Open dataset */
+                        if((dsid = H5Dopen2(fid, "dset", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+
+                        /* Get the chunk index type */
+                        if(H5D__layout_idx_type_test(dsid, &idx_type) < 0) FAIL_STACK_ERROR
+
+                        /* Chunk index tyepe expected depends on whether we are using the latest version of the format */
+                        if(low == H5F_LIBVER_LATEST || swmr) {
+                            /* Verify index type */
+                            if(idx_type != H5D_CHUNK_IDX_EARRAY) FAIL_PUTS_ERROR("should be using extensible array as index");
+                        } /* end if */
+                        else {
+                            /* Verify index type */
+                            if(idx_type != H5D_CHUNK_IDX_BTREE) FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+                        } /* end else */
+
+                        /* Get dataspace for dataset now */
+                        if((sid = H5Dget_space(dsid)) < 0) FAIL_STACK_ERROR
+
+                        /* Get the number of points in the dataspace */
+                        if((snpoints = H5Sget_simple_extent_npoints(sid)) < 0) FAIL_STACK_ERROR
+                        npoints = (hsize_t)snpoints;
+
+                        /* Get the current dimensions into swizzled_dim array */
+                        if(H5Sget_simple_extent_dims(sid, swizzled_dim, NULL) < 0) FAIL_STACK_ERROR
+
+                        /* Generate the swizzled dimensions */
+                        H5VM_swizzle_coords(hsize_t, swizzled_dim, unlim_dim);
+
+                        /* Compute the "down" dimension values */
+                        if(H5VM_array_down(ndims, swizzled_dim, down) < 0) FAIL_STACK_ERROR
+
+                        /* Read elements */
+                        for(u = 0; u < npoints; u++) {
+                            /* Compute the coordinate from the linear offset */
+                            if(H5VM_array_calc_pre(u, ndims, down, hs_offset) < 0) FAIL_STACK_ERROR
+
+                            /* Unswizzle hyperslab offset in same way as swizzled dimensions */
+                            H5VM_unswizzle_coords(hsize_t, hs_offset, unlim_dim);
+
+                            /* Select a single element in the dataset */
+                            if(H5Sselect_hyperslab(sid, H5S_SELECT_SET, hs_offset, NULL, hs_size, NULL) < 0) FAIL_STACK_ERROR
+
+                            /* Read written element from dataset */
+                            read_elem = (unsigned)(u + 1);
+                            if(H5Dread(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &read_elem) < 0) FAIL_STACK_ERROR
+
+                            /* Verify written element is correct */
+                            if(read_elem != u) FAIL_PUTS_ERROR("invalid element read");
+                        } /* end for */
+
+                        /* Close everything */
+                        if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+                        if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+                        if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
+
+
+                        /* Re-open file */
+                        if((fid = H5Fopen(filename, H5F_ACC_RDWR, my_fapl)) < 0) FAIL_STACK_ERROR
+
+                        /* Delete dataset */
+                        if(H5Ldelete(fid, "dset", H5P_DEFAULT) < 0) FAIL_STACK_ERROR
+
+                        /* Close everything */
+                        if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
+                    } /* end for */
+
+                    /* Close everything */
+                    if(H5Pclose(dcpl) < 0) FAIL_STACK_ERROR
+                } /* end for */
+            } /* end for */
+        } /* end for */
+    } /* end for */
+
+    /* Close everything */
+    if(H5Sclose(scalar_sid) < 0) FAIL_STACK_ERROR
+    if(H5Pclose(my_fapl) < 0) FAIL_STACK_ERROR
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Dclose(dsid);
+        H5Sclose(sid);
+        H5Sclose(scalar_sid);
+        H5Fclose(fid);
+        H5Pclose(my_fapl);
+    } H5E_END_TRY;
+    return -1;
+} /* end test_chunk_fast() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: test_reopen_chunk_fast
+ *
+ * Purpose:  To verify a bug in extensible arrays as chunk index.
+ *		When the dataset is closed in H5D_close(), the pointer
+ *		to the extensible array struct in the layout message
+ *		is copied via H5D_flush_real() before H5D_chunk_dest().
+ *		This causes an abort from "Assertion `ea->hdr' failed."
+ *		later when the dataset is re-opened and read.
+ *
+ * Return:      Success: 0
+ *              Failure: -1
+ *
+ * Programmer:  Vailin Choi
+ *              April 13, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+test_reopen_chunk_fast(hid_t fapl)
+{
+    char        filename[FILENAME_BUF_SIZE];
+    hid_t       fid = -1;       /* File ID */
+    hid_t       dcpl = -1;      /* Dataset creation property list ID */
+    hid_t       sid = -1;       /* Dataspace ID */
+    hid_t       scalar_sid = -1;/* Scalar dataspace ID */
+    hid_t       dsid = -1;      /* Dataset ID */
+    hsize_t     dim, max_dim, chunk_dim; /* Dataset and chunk dimensions */
+    hsize_t	hs_offset;      /* Hyperslab offset */
+    hsize_t	hs_size;        /* Hyperslab size */
+    H5D_alloc_time_t alloc_time;        /* Storage allocation time */
+    unsigned    write_elem, read_elem;  /* Element written/read */
+    unsigned    u;              /* Local index variable */
+
+    TESTING("datasets w/extensible array open/reopen with read/write");
+
+    h5_fixname(FILENAME[10], fapl, filename, sizeof filename);
+
+    /* Loop over storage allocation time */
+    for(alloc_time = H5D_ALLOC_TIME_EARLY; alloc_time <= H5D_ALLOC_TIME_INCR; alloc_time++) {
+	/* Create file */
+	if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) FAIL_STACK_ERROR
+
+	/* Create dataset creation property list */
+	if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR
+
+	/* Set chunking */
+	chunk_dim = 10;
+	if(H5Pset_chunk(dcpl, 1, &chunk_dim) < 0) FAIL_STACK_ERROR
+
+	/* Set fill time */
+	if(H5Pset_fill_time(dcpl, H5D_FILL_TIME_ALLOC) < 0) FAIL_STACK_ERROR
+
+	/* Set allocation time */
+	if(H5Pset_alloc_time(dcpl, alloc_time) < 0) FAIL_STACK_ERROR
+
+	/* Create scalar dataspace */
+	if((scalar_sid = H5Screate(H5S_SCALAR)) < 0) FAIL_STACK_ERROR
+
+	/* Create 1-D dataspace */
+	dim = 100;
+	max_dim = H5S_UNLIMITED;
+	if((sid = H5Screate_simple(1, &dim, &max_dim)) < 0) FAIL_STACK_ERROR
+
+	/* Create chunked dataset */
+	if((dsid = H5Dcreate2(fid, "dset", H5T_NATIVE_UINT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	    FAIL_STACK_ERROR
+
+	/* Fill existing elements */
+	hs_size = 1;
+	for(u = 0; u < 100; u++) {
+	    /* Select a single element in the dataset */
+	    hs_offset = u;
+	    if(H5Sselect_hyperslab(sid, H5S_SELECT_SET, &hs_offset, NULL, &hs_size, NULL) < 0) 
+		FAIL_STACK_ERROR
+	    /* Write element to dataset */
+	    write_elem = u;
+	    if(H5Dwrite(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &write_elem) < 0) 
+		FAIL_STACK_ERROR
+	} /* end for */
+
+	/* Close everything */
+	if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+
+	/* Reopen the dataset */
+	if((dsid = H5Dopen2(fid, "dset", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+	    hs_size = 1;
+
+	/* Read from dataset */
+	for(u = 0; u < 100; u++) {
+	    /* Select a single element in the dataset */
+	    hs_offset = u;
+	    if(H5Sselect_hyperslab(sid, H5S_SELECT_SET, &hs_offset, NULL, &hs_size, NULL) < 0) 
+		FAIL_STACK_ERROR
+
+	    /* Read element from dataset */
+	    if(H5Dread(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &read_elem) < 0) 
+		FAIL_STACK_ERROR
+	} /* end for */
+
+	if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+	if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+	if(H5Sclose(scalar_sid) < 0) FAIL_STACK_ERROR
+	if(H5Pclose(dcpl) < 0) FAIL_STACK_ERROR
+	if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
+
+    } /* end for */
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Dclose(dsid);
+        H5Sclose(sid);
+        H5Sclose(scalar_sid);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    return -1;
+} /* end test_reopen_chunk_fast() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: test_chunk_fast_bug1
+ *
+ * Purpose:     Test extensible arrays where the first dimension in the
+ *              chunk size is the same as the second dimension in the
+ *              dataset size.  This helps to confirm that all dimensions
+ *              are being "swizzled" correctly in the earray chunk index
+ *              code.
+ *
+ * Return:      Success: 0
+ *              Failure: -1
+ *
+ * Programmer:  Neil Fortner
+ *              March 22, 2012
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+test_chunk_fast_bug1(hid_t fapl)
+{
+    char        filename[FILENAME_BUF_SIZE];
+    hid_t       fid = -1;       /* File ID */
+    hid_t       dcpl = -1;      /* Dataset creation property list ID */
+    hid_t       sid = -1;       /* Dataspace ID */
+    hid_t       dsid = -1;      /* Dataset ID */
+    hsize_t     dim[2], max_dim[2], chunk_dim[2]; /* Dataset and chunk dimensions */
+    H5D_alloc_time_t alloc_time;        /* Storage allocation time */
+    static unsigned wbuf[40][20], rbuf[40][20];  /* Element written/read */
+    unsigned    i, j;            /* Local index variables */
+
+    TESTING("datasets w/extensible array chunk indexing bug");
+
+    h5_fixname(FILENAME[10], fapl, filename, sizeof filename);
+
+    /* Initialize write buffer */
+    for(i=0; i<40; i++)
+        for(j=0; j<20; j++)
+            wbuf[i][j] = (i * 20) + j;
+
+    /* Create 2-D dataspace */
+    dim[0] = 40;
+    dim[1] = 20;
+    max_dim[0] = 40;
+    max_dim[1] = H5S_UNLIMITED;
+    if((sid = H5Screate_simple(2, dim, max_dim)) < 0) FAIL_STACK_ERROR
+
+    /* Loop over storage allocation time */
+    for(alloc_time = H5D_ALLOC_TIME_EARLY; alloc_time <= H5D_ALLOC_TIME_INCR; alloc_time++) {
+        /* Create file */
+        if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) FAIL_STACK_ERROR
+
+        /* Create dataset creation property list */
+        if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR
+
+        /* Set chunking */
+        chunk_dim[0] = 20;
+        chunk_dim[1] = 10;
+        if(H5Pset_chunk(dcpl, 2, chunk_dim) < 0) FAIL_STACK_ERROR
+
+        /* Set allocation time */
+        if(H5Pset_alloc_time(dcpl, alloc_time) < 0) FAIL_STACK_ERROR
+
+        /* Create chunked dataset */
+        if((dsid = H5Dcreate2(fid, "dset", H5T_NATIVE_UINT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Write buffer to dataset */
+        if(H5Dwrite(dsid, H5T_NATIVE_UINT, sid, sid, H5P_DEFAULT, &wbuf) < 0)
+            FAIL_STACK_ERROR
+
+        /* Close everything */
+        if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+
+        /* Reopen the dataset */
+        if((dsid = H5Dopen2(fid, "dset", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+
+        /* Read from dataset */
+        if(H5Dread(dsid, H5T_NATIVE_UINT, sid, sid, H5P_DEFAULT, &rbuf) < 0)
+            FAIL_STACK_ERROR
+
+        /* Verify read data */
+        for(i=0; i<40; i++)
+            for(j=0; j<20; j++)
+                if(wbuf[i][j] != rbuf[i][j])
+                    FAIL_PUTS_ERROR("invalid element read");
+
+        if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+        if(H5Pclose(dcpl) < 0) FAIL_STACK_ERROR
+        if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
+
+    } /* end for */
+
+    if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Dclose(dsid);
+        H5Sclose(sid);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    return -1;
+} /* end test_chunk_fast_bug1() */
+
 /* This message derives from H5Z */
 const H5Z_class2_t H5Z_EXPAND[1] = {{
     H5Z_CLASS_T_VERS,           /* H5Z_class_t version */
@@ -7549,28 +8718,33 @@ static herr_t
 test_chunk_expand(hid_t fapl)
 {
     char        filename[FILENAME_BUF_SIZE];
-    hid_t       fid = -1;       /* File ID */
-    hid_t       dcpl = -1;      /* Dataset creation property list ID */
-    hid_t       sid = -1;       /* Dataspace ID */
-    hid_t       scalar_sid = -1;/* Scalar dataspace ID */
-    hid_t       dsid = -1;      /* Dataset ID */
-    hsize_t     dim, max_dim, chunk_dim; /* Dataset and chunk dimensions */
-    hsize_t	hs_offset;      /* Hyperslab offset */
-    hsize_t	hs_size;        /* Hyperslab size */
-    H5D_alloc_time_t alloc_time;        /* Storage allocation time */
-    unsigned    write_elem, read_elem;  /* Element written/read */
-    unsigned    u;              /* Local index variable */
-    size_t      size;           /* Size of type */
-    herr_t      status;         /* Generic return value */
+    hid_t       fid = -1;       		/* File ID */
+    hid_t       dcpl = -1, dcpl2 = -1;      	/* Dataset creation property list ID */
+    hid_t       sid = -1, sid2 = -1;       	/* Dataspace ID */
+    hid_t       scalar_sid = -1;		/* Scalar dataspace ID */
+    hid_t       dsid = -1, dsid2 = -1;      	/* Dataset ID */
+    hsize_t     dim, max_dim, chunk_dim; 	/* Dataset and chunk dimensions */
+    hsize_t     dim2[2], max_dim2[2], chunk_dim2[2]; 	/* Dataset and chunk dimensions */
+    H5D_chunk_index_t idx_type, idx_type2; 	/* Dataset chunk index type */
+    H5F_libver_t low, high;     		/* File format bounds */
+    hsize_t	hs_offset, hs_offset2[2];      	/* Hyperslab offset */
+    hsize_t	hs_size, hs_size2[2];        	/* Hyperslab size */
+    H5D_alloc_time_t alloc_time;        	/* Storage allocation time */
+    unsigned    write_elem, read_elem;  	/* Element written/read */
+    unsigned    write_elem2, read_elem2;  	/* Element written/read */
+    unsigned    u;              		/* Local index variable */
+    herr_t      status;         		/* Generic return value */
 
     TESTING("filter expanding chunks too much");
 
-    h5_fixname(FILENAME[10], fapl, filename, sizeof filename);
+    h5_fixname(FILENAME[11], fapl, filename, sizeof filename);
+
+    /* Check if we are using the latest version of the format */
+    if(H5Pget_libver_bounds(fapl, &low, &high) < 0) FAIL_STACK_ERROR
 
-    size = sizeof(size_t);
-    if(size <= 4) {
+    if(sizeof(size_t) <= 4 && low != H5F_LIBVER_LATEST) {
 	SKIPPED();
-	puts("    Current machine can't test for error");
+	puts("    Current machine can't test for error w/old file format");
     } /* end if */
     else {
         /* Register "expansion" filter */
@@ -7580,35 +8754,42 @@ test_chunk_expand(hid_t fapl)
         if(TRUE != H5Zfilter_avail(H5Z_FILTER_EXPAND)) FAIL_STACK_ERROR
 
         /* Loop over storage allocation time */
-        for(alloc_time = H5D_ALLOC_TIME_EARLY; alloc_time <= H5D_ALLOC_TIME_INCR; alloc_time++) {
+        for(alloc_time = H5D_ALLOC_TIME_EARLY; alloc_time <= H5D_ALLOC_TIME_INCR; H5_INC_ENUM(H5D_alloc_time_t, alloc_time)) {
+
             /* Create file */
             if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) FAIL_STACK_ERROR
 
             /* Create dataset creation property list */
             if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR
+            if((dcpl2 = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR
 
             /* Set chunking */
-            chunk_dim = 10;
+            chunk_dim = chunk_dim2[0] = chunk_dim2[1] = 10;
             if(H5Pset_chunk(dcpl, 1, &chunk_dim) < 0) FAIL_STACK_ERROR
+            if(H5Pset_chunk(dcpl2, 2, chunk_dim2) < 0) FAIL_STACK_ERROR
 
             /* Set fill time */
             if(H5Pset_fill_time(dcpl, H5D_FILL_TIME_ALLOC) < 0) FAIL_STACK_ERROR
+            if(H5Pset_fill_time(dcpl2, H5D_FILL_TIME_ALLOC) < 0) FAIL_STACK_ERROR
 
             /* Set allocation time */
             if(H5Pset_alloc_time(dcpl, alloc_time) < 0) FAIL_STACK_ERROR
+            if(H5Pset_alloc_time(dcpl2, alloc_time) < 0) FAIL_STACK_ERROR
 
             /* Set "expand" filter */
             if(H5Pset_filter(dcpl, H5Z_FILTER_EXPAND, 0, (size_t)0, NULL) < 0) FAIL_STACK_ERROR
+            if(H5Pset_filter(dcpl2, H5Z_FILTER_EXPAND, 0, (size_t)0, NULL) < 0) FAIL_STACK_ERROR
 
             /* Create scalar dataspace */
             if((scalar_sid = H5Screate(H5S_SCALAR)) < 0) FAIL_STACK_ERROR
 
-            /* Create 1-D dataspace */
-            dim = 100;
-            max_dim = H5S_UNLIMITED;
+            /* Create 1-D and 2-D dataspace */
+            dim = dim2[0] = dim2[1] = 100;
+            max_dim = max_dim2[0] = max_dim2[1]  = H5S_UNLIMITED;
             if((sid = H5Screate_simple(1, &dim, &max_dim)) < 0) FAIL_STACK_ERROR
+            if((sid2 = H5Screate_simple(2, dim2, max_dim2)) < 0) FAIL_STACK_ERROR
 
-            /* Create chunked dataset */
+            /* Create 1-D & 2-D chunked datasets */
             if(H5D_ALLOC_TIME_EARLY == alloc_time) {
                 /* Make the expansion factor large enough to cause failure right away */
                 filter_expand_factor_g = 8;
@@ -7617,176 +8798,272 @@ test_chunk_expand(hid_t fapl)
                     dsid = H5Dcreate2(fid, "dset", H5T_NATIVE_UINT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT);
                 } H5E_END_TRY;
                 if(dsid >= 0) FAIL_PUTS_ERROR("should fail to create dataset when allocation time is early");
+
+                H5E_BEGIN_TRY {
+                    dsid2 = H5Dcreate2(fid, "dset2", H5T_NATIVE_UINT, sid2, H5P_DEFAULT, dcpl2, H5P_DEFAULT);
+                } H5E_END_TRY;
+                if(dsid2 >= 0) FAIL_PUTS_ERROR("should fail to create dataset when allocation time is early");
+
             } /* end if */
             else {
                 if((dsid = H5Dcreate2(fid, "dset", H5T_NATIVE_UINT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
                     FAIL_STACK_ERROR
 
-                /* Fill elements */
-                hs_size = 1;
-                for(u = 0; u < 100; u++) {
-                    /* Select a single element in the dataset */
-                    hs_offset = u;
+                if((dsid2 = H5Dcreate2(fid, "dset2", H5T_NATIVE_UINT, sid2, H5P_DEFAULT, dcpl2, H5P_DEFAULT)) < 0)
+                    FAIL_STACK_ERROR
+
+                /* Get the chunk index type */
+                if(H5D__layout_idx_type_test(dsid, &idx_type) < 0) FAIL_STACK_ERROR
+                if(H5D__layout_idx_type_test(dsid2, &idx_type2) < 0) FAIL_STACK_ERROR
+
+                /* Chunk index type expected depends on whether we are using the latest version of the format */
+                if(low == H5F_LIBVER_LATEST) {
+                    /* Verify index type */
+                    if(idx_type != H5D_CHUNK_IDX_EARRAY) FAIL_PUTS_ERROR("should be using extensible array as index");
+                    if(idx_type2 != H5D_CHUNK_IDX_BT2) FAIL_PUTS_ERROR("should be using v2 B-tree as index");
+                } /* end if */
+                else {
+                    /* Verify index type */
+                    if(idx_type != H5D_CHUNK_IDX_BTREE) FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+                    if(idx_type2 != H5D_CHUNK_IDX_BTREE) FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+                } /* end else */
+
+                /* Fill elements */
+                hs_size = hs_size2[0] = hs_size2[1] = 1;
+                for(u = 0; u < 100; u++) {
+
+                    hs_offset = hs_offset2[0] = hs_offset2[1] = u;
+
+                    /* Select a single element in the 1-D dataset */
                     if(H5Sselect_hyperslab(sid, H5S_SELECT_SET, &hs_offset, NULL, &hs_size, NULL) < 0) FAIL_STACK_ERROR
 
+                    /* Select a single element in the 2-D dataset; NOT every element is selected */
+                    if(H5Sselect_hyperslab(sid2, H5S_SELECT_SET, hs_offset2, NULL, hs_size2, NULL) < 0) FAIL_STACK_ERROR
+
                     /* Read (unwritten) element from dataset */
-                    read_elem = 1;
+                    read_elem = read_elem2 = 1;
                     if(H5Dread(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &read_elem) < 0) FAIL_STACK_ERROR
+                    if(H5Dread(dsid2, H5T_NATIVE_UINT, scalar_sid, sid2, H5P_DEFAULT, &read_elem2) < 0) FAIL_STACK_ERROR
 
                     /* Verify unwritten element is fill value (0) */
                     if(read_elem != 0) FAIL_PUTS_ERROR("invalid unwritten element read");
+                    if(read_elem2 != 0) FAIL_PUTS_ERROR("invalid unwritten element read");
 
                     /* Don't expand chunks yet */
                     filter_expand_factor_g = 0;
 
-                    /* Write element to dataset */
-                    write_elem = u;
+                    /* Write element to the datasets */
+                    write_elem = write_elem2 = u;
                     if(H5Dwrite(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &write_elem) < 0) FAIL_STACK_ERROR
+                    if(H5Dwrite(dsid2, H5T_NATIVE_UINT, scalar_sid, sid2, H5P_DEFAULT, &write_elem2) < 0) FAIL_STACK_ERROR
 
-                    /* Read element from dataset */
+                    /* Read element from the datasets */
                     read_elem = write_elem + 1;
+                    read_elem2 = write_elem2 + 1;
                     if(H5Dread(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &read_elem) < 0) FAIL_STACK_ERROR
+                    if(H5Dread(dsid2, H5T_NATIVE_UINT, scalar_sid, sid2, H5P_DEFAULT, &read_elem2) < 0) FAIL_STACK_ERROR
 
                     /* Verify written element is read in */
                     if(read_elem != write_elem) FAIL_PUTS_ERROR("invalid written element read");
+                    if(read_elem2 != write_elem2) FAIL_PUTS_ERROR("invalid written element read");
 
                     /* Expand chunks now */
                     filter_expand_factor_g = 8;
 
-                    /* Write element to dataset */
-                    write_elem = u;
+                    /* Write element to the datasets */
+                    write_elem = write_elem2 = u;
                     H5E_BEGIN_TRY {
                         status = H5Dwrite(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &write_elem);
                     } H5E_END_TRY;
                     if(status >= 0) FAIL_PUTS_ERROR("should fail to write to dataset when allocation time is not early");
+
+                    H5E_BEGIN_TRY {
+                        status = H5Dwrite(dsid2, H5T_NATIVE_UINT, scalar_sid, sid2, H5P_DEFAULT, &write_elem2);
+                    } H5E_END_TRY;
+                    if(status >= 0) FAIL_PUTS_ERROR("should fail to write to dataset when allocation time is not early");
                 } /* end for */
 
                 /* Incrementally extend dataset and verify write/reads */
                 while(dim < 1000) {
-                    /* Extend dataset */
+                    /* Extend the datasets */
                     dim += 100;
+                    dim2[0] += 100;
+                    dim2[1] += 100;
                     if(H5Dset_extent(dsid, &dim) < 0) FAIL_STACK_ERROR
+                    if(H5Dset_extent(dsid2, dim2) < 0) FAIL_STACK_ERROR
 
                     /* Close old dataspace */
                     if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+                    if(H5Sclose(sid2) < 0) FAIL_STACK_ERROR
 
-                    /* Get dataspace for dataset now */
+                    /* Get dataspace for the datasets now */
                     if((sid = H5Dget_space(dsid)) < 0) FAIL_STACK_ERROR
+                    if((sid2 = H5Dget_space(dsid2)) < 0) FAIL_STACK_ERROR
 
                     /* Fill new elements */
-                    hs_size = 1;
+                    hs_size = hs_size2[0] = hs_size2[1] = 1;
                     for(u = 0; u < 100; u++) {
-                        /* Select a single element in the dataset */
+                        /* Select a single element in the datasets */
                         hs_offset = (dim + u) - 100;
+                        hs_offset2[0] = (dim2[0] + u) - 100;
+                        hs_offset2[1] = (dim2[1] + u) - 100;
                         if(H5Sselect_hyperslab(sid, H5S_SELECT_SET, &hs_offset, NULL, &hs_size, NULL) < 0) FAIL_STACK_ERROR
+                        if(H5Sselect_hyperslab(sid2, H5S_SELECT_SET, hs_offset2, NULL, hs_size2, NULL) < 0) FAIL_STACK_ERROR
 
-                        /* Read (unwritten) element from dataset */
-                        read_elem = 1;
+                        /* Read (unwritten) element from the datasets */
+                        read_elem = read_elem2 = 1;
                         if(H5Dread(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &read_elem) < 0) FAIL_STACK_ERROR
+                        if(H5Dread(dsid2, H5T_NATIVE_UINT, scalar_sid, sid2, H5P_DEFAULT, &read_elem2) < 0) FAIL_STACK_ERROR
 
                         /* Verify unwritten element is fill value (0) */
                         if(read_elem != 0) FAIL_PUTS_ERROR("invalid unwritten element read");
+                        if(read_elem2 != 0) FAIL_PUTS_ERROR("invalid unwritten element read");
 
                         /* Don't expand chunks yet */
                         filter_expand_factor_g = 0;
 
-                        /* Write element to dataset */
-                        write_elem = u;
+                        /* Write element to the datasets */
+                        write_elem = write_elem2 = u;
                         if(H5Dwrite(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &write_elem) < 0) FAIL_STACK_ERROR
+                        if(H5Dwrite(dsid2, H5T_NATIVE_UINT, scalar_sid, sid2, H5P_DEFAULT, &write_elem2) < 0) FAIL_STACK_ERROR
 
-                        /* Read element from dataset */
+                        /* Read element from the datasets */
                         read_elem = write_elem + 1;
+                        read_elem2 = write_elem2 + 1;
                         if(H5Dread(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &read_elem) < 0) FAIL_STACK_ERROR
+                        if(H5Dread(dsid2, H5T_NATIVE_UINT, scalar_sid, sid2, H5P_DEFAULT, &read_elem2) < 0) FAIL_STACK_ERROR
 
                         /* Verify written element is read in */
                         if(read_elem != write_elem) FAIL_PUTS_ERROR("invalid written element read");
+                        if(read_elem2 != write_elem2) FAIL_PUTS_ERROR("invalid written element read");
 
                         /* Expand chunks now */
                         filter_expand_factor_g = 8;
 
-                        /* Write element to dataset */
-                        write_elem = u;
+                        /* Write element to the datasets */
+                        write_elem = write_elem2 = u;
                         H5E_BEGIN_TRY {
                             status = H5Dwrite(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &write_elem);
                         } H5E_END_TRY;
                         if(status >= 0) FAIL_PUTS_ERROR("should fail to write to dataset when allocation time is not early");
+
+                        H5E_BEGIN_TRY {
+                            status = H5Dwrite(dsid2, H5T_NATIVE_UINT, scalar_sid, sid2, H5P_DEFAULT, &write_elem2);
+                        } H5E_END_TRY;
+                        if(status >= 0) FAIL_PUTS_ERROR("should fail to write to dataset when allocation time is not early");
                     } /* end for */
                 } /* end while */
 
-                /* Close dataset */
+                /* Close the datasets */
                 if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+                if(H5Dclose(dsid2) < 0) FAIL_STACK_ERROR
             } /* end else */
 
             /* Close everything */
             if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+            if(H5Sclose(sid2) < 0) FAIL_STACK_ERROR
             if(H5Sclose(scalar_sid) < 0) FAIL_STACK_ERROR
             if(H5Pclose(dcpl) < 0) FAIL_STACK_ERROR
+            if(H5Pclose(dcpl2) < 0) FAIL_STACK_ERROR
             if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
 
             /* If the dataset was created, do some extra testing */
             if(H5D_ALLOC_TIME_EARLY != alloc_time) {
-                /* Re-open file & dataset */
+                /* Re-open file & datasets */
                 if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
 
-                /* Open dataset */
+                /* Open the datasets */
                 if((dsid = H5Dopen2(fid, "dset", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+                if((dsid2 = H5Dopen2(fid, "dset2", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+
+                /* Get the chunk index type for the two datasets */
+                if(H5D__layout_idx_type_test(dsid, &idx_type) < 0) FAIL_STACK_ERROR
+                if(H5D__layout_idx_type_test(dsid2, &idx_type2) < 0) FAIL_STACK_ERROR
+
+                /* Chunk index type expected depends on whether we are using the latest version of the format */
+                if(low == H5F_LIBVER_LATEST) {
+                    /* Verify index type */
+                    if(idx_type != H5D_CHUNK_IDX_EARRAY) FAIL_PUTS_ERROR("should be using extensible array as index");
+                    if(idx_type2 != H5D_CHUNK_IDX_BT2) FAIL_PUTS_ERROR("should be using v2 B-tree as index");
+                } /* end if */
+                else {
+                    /* Verify index type */
+                    if(idx_type != H5D_CHUNK_IDX_BTREE) FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+                    if(idx_type2 != H5D_CHUNK_IDX_BTREE) FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+                } /* end else */
 
                 /* Create scalar dataspace */
                 if((scalar_sid = H5Screate(H5S_SCALAR)) < 0) FAIL_STACK_ERROR
 
-                /* Get dataspace for dataset now */
+                /* Get dataspace for the datasets now */
                 if((sid = H5Dget_space(dsid)) < 0) FAIL_STACK_ERROR
+                if((sid2 = H5Dget_space(dsid2)) < 0) FAIL_STACK_ERROR
 
                 /* Read elements */
-                hs_size = 1;
+                hs_size = hs_size2[0] = hs_size2[1] = 1;
                 for(u = 0; u < 1000; u++) {
-                    /* Select a single element in the dataset */
-                    hs_offset = u;
+                    /* Select a single element in the datasets */
+                    hs_offset = hs_offset2[0] = hs_offset2[1] = u;
                     if(H5Sselect_hyperslab(sid, H5S_SELECT_SET, &hs_offset, NULL, &hs_size, NULL) < 0) FAIL_STACK_ERROR
+                    if(H5Sselect_hyperslab(sid2, H5S_SELECT_SET, hs_offset2, NULL, hs_size2, NULL) < 0) FAIL_STACK_ERROR
 
-                    /* Read element from dataset */
-                    read_elem = u + 1;
+                    /* Read element from the datasets */
+                    read_elem = read_elem2 = u + 1;
                     if(H5Dread(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &read_elem) < 0) FAIL_STACK_ERROR
+                    if(H5Dread(dsid2, H5T_NATIVE_UINT, scalar_sid, sid2, H5P_DEFAULT, &read_elem2) < 0) FAIL_STACK_ERROR
 
                     /* Verify unwritten element is proper value */
                     if(read_elem != (u % 100)) FAIL_PUTS_ERROR("invalid element read");
+                    if(read_elem2 != (u % 100)) FAIL_PUTS_ERROR("invalid element read");
 
                     /* Don't expand chunks yet */
                     filter_expand_factor_g = 0;
 
-                    /* Write element to dataset */
-                    write_elem = u % 100;
+                    /* Write element to the datasets */
+                    write_elem = write_elem2 = u % 100;
                     if(H5Dwrite(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &write_elem) < 0) FAIL_STACK_ERROR
+                    if(H5Dwrite(dsid2, H5T_NATIVE_UINT, scalar_sid, sid2, H5P_DEFAULT, &write_elem2) < 0) FAIL_STACK_ERROR
 
-                    /* Read element from dataset */
+                    /* Read element from the datasets */
                     read_elem = write_elem + 1;
+                    read_elem2 = write_elem2 + 1;
                     if(H5Dread(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &read_elem) < 0) FAIL_STACK_ERROR
+                    if(H5Dread(dsid2, H5T_NATIVE_UINT, scalar_sid, sid2, H5P_DEFAULT, &read_elem2) < 0) FAIL_STACK_ERROR
 
                     /* Verify written element is read in */
                     if(read_elem != write_elem) FAIL_PUTS_ERROR("invalid written element read");
+                    if(read_elem2 != write_elem2) FAIL_PUTS_ERROR("invalid written element read");
 
                     /* Expand chunks now */
                     filter_expand_factor_g = 8;
 
-                    /* Write element to dataset */
-                    write_elem = u % 100;
+                    /* Write element to the datasets */
+                    write_elem = write_elem2 = u % 100;
                     H5E_BEGIN_TRY {
                         status = H5Dwrite(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &write_elem);
                     } H5E_END_TRY;
                     if(status >= 0) FAIL_PUTS_ERROR("should fail to write to dataset when allocation time is not early");
+
+                    H5E_BEGIN_TRY {
+                        status = H5Dwrite(dsid2, H5T_NATIVE_UINT, scalar_sid, sid2, H5P_DEFAULT, &write_elem2);
+                    } H5E_END_TRY;
+                    if(status >= 0) FAIL_PUTS_ERROR("should fail to write to dataset when allocation time is not early");
                 } /* end for */
 
                 /* Close everything */
                 if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+                if(H5Sclose(sid2) < 0) FAIL_STACK_ERROR
                 if(H5Sclose(scalar_sid) < 0) FAIL_STACK_ERROR
                 if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+                if(H5Dclose(dsid2) < 0) FAIL_STACK_ERROR
                 if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
 
                 /* Re-open file */
                 if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
 
-                /* Delete dataset */
+                /* Delete the datasets */
                 if(H5Ldelete(fid, "dset", H5P_DEFAULT) < 0) FAIL_STACK_ERROR
+                if(H5Ldelete(fid, "dset2", H5P_DEFAULT) < 0) FAIL_STACK_ERROR
 
                 /* Close everything */
                 if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
@@ -7807,8 +9084,11 @@ test_chunk_expand(hid_t fapl)
 error:
     H5E_BEGIN_TRY {
         H5Pclose(dcpl);
+        H5Pclose(dcpl2);
         H5Dclose(dsid);
+        H5Dclose(dsid2);
         H5Sclose(sid);
+        H5Sclose(sid2);
         H5Sclose(scalar_sid);
         H5Fclose(fid);
     } H5E_END_TRY;
@@ -7817,106 +9097,396 @@ error:
 
 

 /*-------------------------------------------------------------------------
- * Function: test_large_chunk_shrink
- *
- * Purpose: Tests support for shrinking a chunk larger than 1 MB by a
- *              size greater than 1 MB.
+ * Function: test_fixed_array
+ *
+ * Purpose: Tests support for Fixed Array and Implicit Indexing 
+ *
+ *	Create the following 3 datasets:
+ *	1) extendible chunked dataset with fixed max. dims
+ *	2) extendible chunked dataset with NULL max. dims
+ *	3) extendible chunked dataset with same max. dims 
+ *         (Note that the third dataset is created with bigger size for curr & max. dims 
+ *	    so that Fixed Array Indexing with paging is exercised)
+ *
+ *      Repeat the following test with/without compression filter
+ *              Repeat the following test with H5D_ALLOC_TIME_EARLY/H5D_ALLOC_TIME_LATE/H5D_ALLOC_TIME_INCR
+ *                      For the old format, 
+ *				verify that v1 btree indexing type is used for 
+ *				    all 3 datasets with all settings
+ *                      For the new format:
+ *				Verify that Implicit Index type is used for
+ *				    #1, #2, #3 datasets when ALLOC_TIME_EARLY and compression are true
+ *				Verify Fixed Array indexing type is used for
+ *				    #1, #2, #3 datasets with all other settings
  *
  * Return:      Success: 0
  *              Failure: -1
  *
- * Programmer:  Neil Fortner
- *              Monday, November 31, 2011
+ * Programmer:  Vailin Choi; 2009
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-test_large_chunk_shrink(hid_t fapl)
+test_fixed_array(hid_t fapl)
 {
-    char        filename[FILENAME_BUF_SIZE];
+    char        filename[FILENAME_BUF_SIZE];	/* File name */
     hid_t       fid = -1;       /* File ID */
     hid_t       dcpl = -1;      /* Dataset creation property list ID */
-    hid_t       sid = -1;       /* Dataspace ID */
-    hid_t       scalar_sid = -1;/* Scalar dataspace ID */
-    hid_t       dsid = -1;      /* Dataset ID */
-    hsize_t     dim, max_dim, chunk_dim; /* Dataset and chunk dimensions */
-    hsize_t     hs_offset;      /* Hyperslab offset */
-    hsize_t     hs_size;        /* Hyperslab size */
-    unsigned    write_elem, read_elem;  /* Element written/read */
 
-    TESTING("shrinking large chunk");
+    hid_t       sid = -1;       /* Dataspace ID for dataset with fixed dimensions */
+    hid_t       sid_big = -1;   /* Dataspate ID for big dataset */
+    hid_t       sid_max = -1;   /* Dataspace ID for dataset with maximum dimensions set */
 
-    h5_fixname(FILENAME[10], fapl, filename, sizeof filename);
+    hid_t       dsid = -1;      /* Dataset ID for dataset with fixed dimensions */
+    hid_t	dsid_big = -1;	/* Dataset ID for big dataset with fixed dimensions */
+    hid_t	dsid_max = -1;	/* Dataset ID for dataset with maximum dimensions set */
 
-    /* Create file */
-    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) FAIL_STACK_ERROR
+    hsize_t     dim2[2] = {48, 18};   		/* Dataset dimensions */
+    hsize_t     dim2_big[2] = {500, 60};  	/* Big dataset dimensions */
+    hsize_t     dim2_max[2] = {120, 50};  	/* Maximum dataset dimensions */
 
-    /* Create dataset creation property list */
-    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR
+    hid_t       mem_id;      	/* Memory space ID */
+    hid_t       big_mem_id;   	/* Memory space ID for big dataset */
 
-    /* Set 2 MB chunk size */
-    chunk_dim = 2 * 1024 * 1024 / sizeof(unsigned);
-    if(H5Pset_chunk(dcpl, 1, &chunk_dim) < 0) FAIL_STACK_ERROR
+    hsize_t     msize[1] = {POINTS};    	/* Size of memory space */
+    hsize_t     msize_big[1] = {POINTS_BIG};    /* Size of memory space for big dataset */
 
-    /* Create scalar dataspace */
-    if((scalar_sid = H5Screate(H5S_SCALAR)) < 0) FAIL_STACK_ERROR
+    int         wbuf[POINTS];           /* write buffer */
+    int         wbuf_big[POINTS_BIG];  	/* write buffer for big dataset */
+    int         rbuf[POINTS];          	/* read buffer */
+    int         rbuf_big[POINTS_BIG];  	/* read buffer for big dataset */
 
-    /* Create 1-D dataspace */
-    dim = 2 * 1024 * 1024 / sizeof(unsigned);
-    max_dim = H5S_UNLIMITED;
-    if((sid = H5Screate_simple(1, &dim, &max_dim)) < 0) FAIL_STACK_ERROR
+    hsize_t     chunk_dim2[2] = {4, 3}; /* Chunk dimensions */
+    int         chunks[12][6];          /* # of chunks for dataset dimensions */
+    int         chunks_big[125][20];    /* # of chunks for big dataset dimensions */
+    int         chunk_row;              /* chunk row index */
+    int         chunk_col;              /* chunk column index */
 
-    /* Create 2 MB chunked dataset */
-    if((dsid = H5Dcreate2(fid, "dset", H5T_NATIVE_UINT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
-        FAIL_STACK_ERROR
+    hsize_t     coord[POINTS][2];       	/* datdaset coordinates */
+    hsize_t     coord_big[POINTS_BIG][2];       /* big dataset coordinates */
 
-    /* Select last element in the dataset */
-    hs_offset = dim - 1;
-    hs_size = 1;
-    if(H5Sselect_hyperslab(sid, H5S_SELECT_SET, &hs_offset, NULL, &hs_size, NULL) < 0) FAIL_STACK_ERROR
+    H5D_chunk_index_t idx_type; 	/* Dataset chunk index type */
+    H5F_libver_t low, high;     	/* File format bounds */
+    H5D_alloc_time_t alloc_time;        /* Storage allocation time */
 
-    /* Read (unwritten) element from dataset */
-    read_elem = 1;
-    if(H5Dread(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &read_elem) < 0) FAIL_STACK_ERROR
+#ifdef H5_HAVE_FILTER_DEFLATE
+    unsigned    compress;       	/* Whether chunks should be compressed */
+#endif /* H5_HAVE_FILTER_DEFLATE */
 
-    /* Verify unwritten element is fill value (0) */
-    if(read_elem != 0) FAIL_PUTS_ERROR("invalid unwritten element read");
+    h5_stat_size_t       empty_size;  	/* Size of an empty file */
+    h5_stat_size_t       file_size;  	/* Size of each file created */
 
-    /* Write element to dataset */
-    write_elem = 2;
-    if(H5Dwrite(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &write_elem) < 0) FAIL_STACK_ERROR
+    size_t      i, j;           	/* local index variables */
+    herr_t      ret;            	/* Generic return value */
 
-    /* Read element from dataset */
-    read_elem = write_elem + 1;
-    if(H5Dread(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &read_elem) < 0) FAIL_STACK_ERROR
+    TESTING("datasets w/fixed array as chunk index");
 
-    /* Verify written element is read in */
-    if(read_elem != write_elem) FAIL_PUTS_ERROR("invalid written element read");
+    h5_fixname(FILENAME[12], fapl, filename, sizeof filename);
 
-    /* Shrink dataset to 512 KB */
-    dim = 512 * 1024 / sizeof(unsigned);
-    if(H5Dset_extent(dsid, &dim) < 0) FAIL_STACK_ERROR
+    /* Check if we are using the latest version of the format */
+    if(H5Pget_libver_bounds(fapl, &low, &high) < 0) FAIL_STACK_ERROR
 
-    /* Expand dataset back to 2MB */
-    dim = 2 * 1024 * 1024 / sizeof(unsigned);
-    if(H5Dset_extent(dsid, &dim) < 0) FAIL_STACK_ERROR
+    /* Create and close the file to get the file size */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        STACK_ERROR
+    if(H5Fclose(fid) < 0)
+        STACK_ERROR
 
-    /* Read element from dataset */
-    read_elem = 1;
-    if(H5Dread(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &read_elem) < 0) FAIL_STACK_ERROR
+    /* Get the size of the empty file */
+    if((empty_size = h5_get_file_size(filename, fapl)) < 0)
+        TEST_ERROR
 
-    /* Verify element is now 0 */
-    if(read_elem != 0) FAIL_PUTS_ERROR("invalid element read");
+#ifdef H5_HAVE_FILTER_DEFLATE
+    /* Loop over compressing chunks */
+    for(compress = FALSE; compress <= TRUE; compress++) {
+#endif /* H5_HAVE_FILTER_DEFLATE */
 
-    /* Close everything */
-    if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
-    if(H5Sclose(scalar_sid) < 0) FAIL_STACK_ERROR
-    if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
-    if(H5Pclose(dcpl) < 0) FAIL_STACK_ERROR
-    if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
+        /* Loop over storage allocation time */
+        for(alloc_time = H5D_ALLOC_TIME_EARLY; alloc_time <= H5D_ALLOC_TIME_INCR; alloc_time++) {
+            /* Create file */
+            if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) FAIL_STACK_ERROR
 
-    PASSED();
+            /* Create dataset creation property list */
+            if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR
+
+            /* Set chunking */
+	    if((ret = H5Pset_chunk(dcpl, 2, chunk_dim2)) < 0)
+		FAIL_PUTS_ERROR("    Problem with setting chunk.")
+
+#ifdef H5_HAVE_FILTER_DEFLATE
+            /* Check if we should compress the chunks */
+            if(compress)
+                if(H5Pset_deflate(dcpl, 9) < 0) FAIL_STACK_ERROR
+#endif /* H5_HAVE_FILTER_DEFLATE */
+
+            /* Set fill time */
+            if(H5Pset_fill_time(dcpl, H5D_FILL_TIME_ALLOC) < 0) FAIL_STACK_ERROR
+
+            /* Set allocation time */
+            if(H5Pset_alloc_time(dcpl, alloc_time) < 0) FAIL_STACK_ERROR
+
+	    /* Initialization of chunk array for repeated coordinates */
+	    for(i = 0; i < dim2[0]/chunk_dim2[0]; i++)
+		for(j = 0; j < dim2[1]/chunk_dim2[1]; j++)
+		    chunks[i][j] = 0;
+
+	    /* Generate random point coordinates. Only one point is selected per chunk */
+	    for(i = 0; i < POINTS; i++){
+		do {
+		    chunk_row = (int)HDrandom () % (int)(dim2[0]/chunk_dim2[0]);
+		    chunk_col = (int)HDrandom () % (int)(dim2[1]/chunk_dim2[1]);
+		} while (chunks[chunk_row][chunk_col]);
+
+		wbuf[i] = chunks[chunk_row][chunk_col] = chunk_row+chunk_col+1;
+		coord[i][0] = (hsize_t)chunk_row * chunk_dim2[0];
+		coord[i][1] = (hsize_t)chunk_col * chunk_dim2[1];
+	    } /* end for */
+
+	    /* Create first dataset with cur and max dimensions */
+	    if((sid_max = H5Screate_simple(2, dim2, dim2_max)) < 0) FAIL_STACK_ERROR
+	    dsid_max = H5Dcreate2(fid, DSET_FIXED_MAX, H5T_NATIVE_INT, sid_max, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+	    if(dsid_max < 0)
+		FAIL_PUTS_ERROR("    Creating Chunked Dataset with maximum dimensions.")
+
+	    /* Get the chunk index type */
+	    if(H5D__layout_idx_type_test(dsid_max, &idx_type) < 0) FAIL_STACK_ERROR
+
+	    /* Chunk index type depends on whether we are using the latest version of the format */
+	    if(low == H5F_LIBVER_LATEST) {
+		if(alloc_time == H5D_ALLOC_TIME_EARLY
+#ifdef H5_HAVE_FILTER_DEFLATE
+			&& !compress
+#endif /* H5_HAVE_FILTER_DEFLATE */
+		    ) {
+		    if(idx_type != H5D_CHUNK_IDX_NONE)
+			FAIL_PUTS_ERROR("should be using Non Index as index");
+		} else if (idx_type != H5D_CHUNK_IDX_FARRAY)
+		    FAIL_PUTS_ERROR("should be using Fixed Array as index");
+	    } /* end if */
+	    else {
+		if(idx_type != H5D_CHUNK_IDX_BTREE)
+		    FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+	    } /* end else */
+
+	    /* Create dataspace for write buffer */
+	    if((mem_id = H5Screate_simple(1, msize, NULL)) < 0) TEST_ERROR;
+
+	    /* Select the random points for writing */
+	    if(H5Sselect_elements(sid_max, H5S_SELECT_SET, POINTS, (const hsize_t *)coord) < 0) 
+		TEST_ERROR;
+
+	    /* Write into dataset */
+	    if(H5Dwrite(dsid_max, H5T_NATIVE_INT, mem_id, sid_max, H5P_DEFAULT, wbuf) < 0) TEST_ERROR;
+
+	    /* Closing */
+	    if(H5Dclose(dsid_max) < 0) FAIL_STACK_ERROR
+	    if(H5Sclose(sid_max) < 0) FAIL_STACK_ERROR
+    	    if(H5Sclose(mem_id) < 0) FAIL_STACK_ERROR
+
+
+	    /* Create second dataset with curr dim but NULL max dim */
+	    if((sid = H5Screate_simple(2, dim2, NULL)) < 0) FAIL_STACK_ERROR
+	    dsid = H5Dcreate2(fid, DSET_FIXED_NOMAX, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+	    if(dsid < 0)
+		FAIL_PUTS_ERROR("    Creating Chunked Dataset.")
+
+	    /* Get the chunk index type */
+	    if(H5D__layout_idx_type_test(dsid, &idx_type) < 0) FAIL_STACK_ERROR
+
+	    /* Chunk index type depends on whether we are using the latest version of the format */
+	    if(low == H5F_LIBVER_LATEST) {
+		if(alloc_time == H5D_ALLOC_TIME_EARLY
+#ifdef H5_HAVE_FILTER_DEFLATE
+			&& !compress
+#endif /* H5_HAVE_FILTER_DEFLATE */
+		    ) {
+		    if(idx_type != H5D_CHUNK_IDX_NONE)
+			FAIL_PUTS_ERROR("should be using Non Index as index");
+		} else if(idx_type != H5D_CHUNK_IDX_FARRAY)
+		    FAIL_PUTS_ERROR("should be using Fixed Array as index");
+	    } else {
+		if(idx_type != H5D_CHUNK_IDX_BTREE)
+		    FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+	    } /* end else */
+
+	    /* Create dataspace for write buffer */
+	    if((mem_id = H5Screate_simple(1, msize, NULL)) < 0) TEST_ERROR;
+
+	    /* Select the random points for writing */
+	    if(H5Sselect_elements(sid, H5S_SELECT_SET, POINTS, (const hsize_t *)coord) < 0) 
+		TEST_ERROR;
+
+	    /* Write into dataset */
+	    if(H5Dwrite(dsid, H5T_NATIVE_INT, mem_id, sid, H5P_DEFAULT, wbuf) < 0) TEST_ERROR;
+
+	    /* Closing */
+	    if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+	    if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+    	    if(H5Sclose(mem_id) < 0) FAIL_STACK_ERROR
+
+	    /* Create the third dataset with bigger size and both curr & max dimensions are the same */
+	    if((sid_big = H5Screate_simple(2, dim2_big, dim2_big)) < 0) FAIL_STACK_ERROR
+	    dsid_big = H5Dcreate2(fid, DSET_FIXED_BIG, H5T_NATIVE_INT, sid_big, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+	    if(dsid_big < 0)
+		FAIL_PUTS_ERROR("    Creating Big Chunked Dataset.")
+
+	    /* Get the chunk index type */
+	    if(H5D__layout_idx_type_test(dsid_big, &idx_type) < 0) FAIL_STACK_ERROR
+
+	    /* Chunk index type depends on whether we are using the latest version of the format */
+	    if(low == H5F_LIBVER_LATEST) {
+		if(alloc_time == H5D_ALLOC_TIME_EARLY
+#ifdef H5_HAVE_FILTER_DEFLATE
+			&& !compress
+#endif /* H5_HAVE_FILTER_DEFLATE */
+		    ) {
+		    if(idx_type != H5D_CHUNK_IDX_NONE)
+			FAIL_PUTS_ERROR("should be using Non Index as index");
+		} else if(idx_type != H5D_CHUNK_IDX_FARRAY)
+		    FAIL_PUTS_ERROR("should be using Fixed Array as index");
+	    } /* end if */
+	    else {
+		if(idx_type != H5D_CHUNK_IDX_BTREE)
+		    FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+	    } /* end else */
+
+	    /* Initialization of chunk array for repeated coordinates */
+	    for(i = 0; i < dim2_big[0]/chunk_dim2[0]; i++)
+		for(j = 0; j < dim2_big[1]/chunk_dim2[1]; j++)
+		    chunks_big[i][j] = 0;
+
+	    /* Generate random point coordinates. Only one point is selected per chunk */
+	    for(i = 0; i < POINTS_BIG; i++){
+		do {
+		    chunk_row = (int)HDrandom () % (int)(dim2_big[0]/chunk_dim2[0]);
+		    chunk_col = (int)HDrandom () % (int)(dim2_big[1]/chunk_dim2[1]);
+		} while (chunks_big[chunk_row][chunk_col]);
+
+		wbuf_big[i] = chunks_big[chunk_row][chunk_col] = chunk_row+chunk_col+1;
+		coord_big[i][0] = (hsize_t)chunk_row * chunk_dim2[0];
+		coord_big[i][1] = (hsize_t)chunk_col * chunk_dim2[1];
+	    } /* end for */
+
+	    /* Create dataspace for write buffer */
+	    if((big_mem_id = H5Screate_simple(1, msize_big, NULL)) < 0) TEST_ERROR;
+
+	    /* Select the random points for writing */
+	    if(H5Sselect_elements(sid_big, H5S_SELECT_SET, POINTS_BIG, (const hsize_t *)coord_big) < 0) 
+		TEST_ERROR;
+
+	    /* Write into dataset */
+	    if(H5Dwrite(dsid_big, H5T_NATIVE_INT, big_mem_id, sid_big, H5P_DEFAULT, wbuf_big) < 0) TEST_ERROR;
+
+	    /* Closing */
+	    if(H5Dclose(dsid_big) < 0) FAIL_STACK_ERROR
+	    if(H5Sclose(sid_big) < 0) FAIL_STACK_ERROR
+    	    if(H5Sclose(big_mem_id) < 0) FAIL_STACK_ERROR
+    	    if(H5Pclose(dcpl) < 0) FAIL_STACK_ERROR
+
+	    /* Open the first dataset */
+	    if((dsid = H5Dopen2(fid, DSET_FIXED_MAX, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+	    /* Get dataset dataspace */
+	    if((sid = H5Dget_space(dsid)) < 0) TEST_ERROR;
+
+	    /* Create dataspace for read buffer */
+	    if((mem_id = H5Screate_simple(1, msize, NULL)) < 0) TEST_ERROR;
+
+	    /* Select the random points for reading */
+	    if(H5Sselect_elements (sid, H5S_SELECT_SET, POINTS, (const hsize_t *)coord) < 0) TEST_ERROR;
+
+	    /* Read from dataset */
+	    if(H5Dread(dsid, H5T_NATIVE_INT, mem_id, sid, H5P_DEFAULT, rbuf) < 0) TEST_ERROR;
+
+	    /* Verify that written and read data are the same */
+	    for(i = 0; i < POINTS; i++)
+		if(rbuf[i] != wbuf[i]){
+		    printf("    Line %d: Incorrect value, wbuf[%u]=%d, rbuf[%u]=%d\n",
+			__LINE__,(unsigned)i,wbuf[i],(unsigned)i,rbuf[i]);
+		    TEST_ERROR;
+		} /* end if */
+
+	    /* Closing */
+	    if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+            if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+            if(H5Sclose(mem_id) < 0) FAIL_STACK_ERROR
+
+	    /* Open the second dataset */
+	    if((dsid = H5Dopen2(fid, DSET_FIXED_NOMAX, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+	    /* Get dataset dataspace */
+	    if((sid = H5Dget_space(dsid)) < 0) TEST_ERROR;
+
+	    /* Create dataspace for read buffer */
+	    if((mem_id = H5Screate_simple(1, msize, NULL)) < 0) TEST_ERROR;
+
+	    /* Select the random points for reading */
+	    if(H5Sselect_elements (sid, H5S_SELECT_SET, POINTS, (const hsize_t *)coord) < 0) TEST_ERROR;
+
+	    /* Read from dataset */
+	    if(H5Dread(dsid, H5T_NATIVE_INT, mem_id, sid, H5P_DEFAULT, rbuf) < 0) TEST_ERROR;
+
+	    /* Verify that written and read data are the same */
+	    for(i = 0; i < POINTS; i++)
+		if(rbuf[i] != wbuf[i]){
+		    printf("    Line %d: Incorrect value, wbuf[%u]=%d, rbuf[%u]=%d\n",
+			__LINE__,(unsigned)i,wbuf[i],(unsigned)i,rbuf[i]);
+		    TEST_ERROR;
+		} /* end if */
+
+	    /* Closing */
+	    if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+            if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+            if(H5Sclose(mem_id) < 0) FAIL_STACK_ERROR
+
+	    /* Open the third dataset */
+	    if((dsid_big = H5Dopen2(fid, DSET_FIXED_BIG, H5P_DEFAULT)) < 0) TEST_ERROR; 
+	    /* Get dataset dataspace */
+	    if((sid_big = H5Dget_space(dsid_big)) < 0) TEST_ERROR;
+
+	    /* Create dataspace for read buffer */
+	    if((big_mem_id = H5Screate_simple(1, msize_big, NULL)) < 0) TEST_ERROR;
+
+	    /* Select the random points for reading */
+	    if(H5Sselect_elements (sid_big, H5S_SELECT_SET, POINTS_BIG, (const hsize_t *)coord_big) < 0) TEST_ERROR;
+	    /* Read from dataset */
+	    if(H5Dread(dsid_big, H5T_NATIVE_INT, big_mem_id, sid_big, H5P_DEFAULT, rbuf_big) < 0) TEST_ERROR;
+
+	    /* Verify that written and read data are the same */
+	    for(i = 0; i < POINTS_BIG; i++)
+		if(rbuf_big[i] != wbuf_big[i]){
+		    printf("    Line %d: Incorrect value, wbuf_bif[%u]=%d, rbuf_big[%u]=%d\n",
+			__LINE__,(unsigned)i,wbuf_big[i],(unsigned)i,rbuf_big[i]);
+		    TEST_ERROR;
+		} /* end if */
+
+	    /* Closing */
+	    if(H5Dclose(dsid_big) < 0) FAIL_STACK_ERROR
+            if(H5Sclose(sid_big) < 0) FAIL_STACK_ERROR
+            if(H5Sclose(big_mem_id) < 0) FAIL_STACK_ERROR
+
+            /* Delete datasets */
+            if(H5Ldelete(fid, DSET_FIXED_BIG, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
+            if(H5Ldelete(fid, DSET_FIXED_NOMAX, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
+            if(H5Ldelete(fid, DSET_FIXED_MAX, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
+
+            /* Close everything */
+            if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
+
+	     /* Get the size of the file */
+	    if((file_size = h5_get_file_size(filename, fapl)) < 0)
+		TEST_ERROR
+
+	    /* Verify the file is correct size */
+	    if(file_size != empty_size)
+		TEST_ERROR
+
+        } /* end for */
+#ifdef H5_HAVE_FILTER_DEFLATE
+    } /* end for */
+#endif /* H5_HAVE_FILTER_DEFLATE */
 
+    PASSED();
     return 0;
 
 error:
@@ -7924,107 +9494,617 @@ error:
         H5Pclose(dcpl);
         H5Dclose(dsid);
         H5Sclose(sid);
-        H5Sclose(scalar_sid);
+        H5Sclose(mem_id);
         H5Fclose(fid);
     } H5E_END_TRY;
     return -1;
-} /* end test_large_chunk_shrink() */
+} /* end test_fixed_array() */
 
 

 /*-------------------------------------------------------------------------
+ * Function: test_single_chunk
+ *
+ * Purpose: Tests support for Single Chunk indexing type
+ *
+ *	Create the following 2 datasets:
+ *	1) chunked dataset with NULL max dims and cur_dims = chunk_dims
+ *	2) chunked dataset with cur_dims = max_dims = chunk_dims
+ *
+ *      Repeat the following test with/without compression filter
+ *              Repeat the following test with H5D_ALLOC_TIME_EARLY/H5D_ALLOC_TIME_LATE/H5D_ALLOC_TIME_INCR
+ *                      For the old format, 
+ *			  verify that v1 btree indexing type is used for 
+ *			    all datasets with all settings
+ *                      For the new format:
+ *			  Verify that Single Chunk indexing type is used for
+ *			    all datasets with all settings
+ *
+ * Return:      Success: 0
+ *              Failure: -1
  *
- *  test_idx_compatible():
- *	Verify that the 1.8 branch cannot read datasets that use
- *	Fixed Array indexing method.
+ * Programmer:  Vailin Choi; July 2011
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-test_idx_compatible(void)
+test_single_chunk(hid_t fapl)
 {
-    hid_t	fid = -1;	/* File id */
-    hid_t       did = -1;	/* Dataset id */
-    char  	*srcdir = HDgetenv("srcdir"); /* where the src code is located */
-    char        filename[FILENAME_BUF_SIZE] = "";  /* old test file name */
+    char        filename[FILENAME_BUF_SIZE];	/* File name */
+    hid_t       fid = -1;       /* File ID */
+    hid_t       dcpl = -1;      /* Dataset creation property list ID */
+    hid_t       t_dcpl = -1;      /* Dataset creation property list ID */
+
+    hid_t       sid = -1, sid_max = -1;       	/* Dataspace ID for dataset with fixed dimensions */
+    hid_t       did = -1, did_max = -1;      	/* Dataset ID for dataset with fixed dimensions */
+    hsize_t     dim2[2] = {DSET_DIM1, DSET_DIM2};   	/* Dataset dimensions */
+    hsize_t     t_dim2[2] = {50, 100};   	/* Dataset dimensions */
+    int         wbuf[DSET_DIM1*DSET_DIM2];           	/* write buffer */
+    int         t_wbuf[50*100];           	/* write buffer */
+    int         rbuf[DSET_DIM1*DSET_DIM2];          	/* read buffer */
+    int         t_rbuf[50*100];          	/* read buffer */
+
+    H5D_chunk_index_t idx_type; 	/* Dataset chunk index type */
+    H5F_libver_t low, high;     	/* File format bounds */
+    H5D_alloc_time_t alloc_time;        /* Storage allocation time */
 
-    /* Output message about test being performed */
-    TESTING("Compatibility for datasets that use Fixed Array indexing\n");
+#ifdef H5_HAVE_FILTER_DEFLATE
+    unsigned    compress;       	/* Whether chunks should be compressed */
+#endif /* H5_HAVE_FILTER_DEFLATE */
 
-    /* Generate correct name for test file by prepending the source path */
-    if(srcdir && ((HDstrlen(srcdir) + HDstrlen(FIXED_IDX_FILE) + 1) < sizeof(filename))) {
-	HDstrcpy(filename, srcdir);
-	HDstrcat(filename, "/");
-    }
-    HDstrcat(filename, FIXED_IDX_FILE);
+    size_t      n, i;           	/* local index variables */
+    herr_t      ret;            	/* Generic return value */
+    h5_stat_size_t       empty_size;    /* Size of an empty file */
+    h5_stat_size_t       file_size;     /* Size of each file created */
 
-    /* Open the file */
-    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
-	FAIL_STACK_ERROR
+    TESTING("datasets w/Single Chunk indexing");
 
-    /* Should not able to read the dataset w/o filter that use Fixed Array indexing */
-    H5E_BEGIN_TRY {
-	if((did = H5Dopen2(fid, DSET, H5P_DEFAULT)) != FAIL)
-	    TEST_ERROR
-    } H5E_END_TRY;
+    h5_fixname(FILENAME[17], fapl, filename, sizeof filename);
 
-    /* Should not able to read the dataset w/ filter that use Fixed Array indexing */
-    H5E_BEGIN_TRY {
-	if((did = H5Dopen2(fid, DSET_FILTER, H5P_DEFAULT)) != FAIL)
-	    TEST_ERROR
-    } H5E_END_TRY;
+    /* Check if we are using the latest version of the format */
+    if(H5Pget_libver_bounds(fapl, &low, &high) < 0) FAIL_STACK_ERROR
 
+    /* Create and close the file to get the file size */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        STACK_ERROR
     if(H5Fclose(fid) < 0)
-	FAIL_STACK_ERROR
+        STACK_ERROR
+
+    /* Get the size of the empty file */
+    if((empty_size = h5_get_file_size(filename, fapl)) < 0)
+        TEST_ERROR
+
+    for(i = n = 0; i < (DSET_DIM1 * DSET_DIM2); i++)
+	wbuf[i] = n++;
+
+    for(i = n = 0; i < (50* 100); i++)
+	t_wbuf[i] = n++;
+
+#ifdef H5_HAVE_FILTER_DEFLATE
+    /* Loop over compressing chunks */
+    for(compress = FALSE; compress <= TRUE; compress++) {
+#endif /* H5_HAVE_FILTER_DEFLATE */
+
+        /* Loop over storage allocation time */
+        for(alloc_time = H5D_ALLOC_TIME_EARLY; alloc_time <= H5D_ALLOC_TIME_INCR; alloc_time++) {
+            /* Create file */
+            if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) FAIL_STACK_ERROR
+
+            /* Create dataset creation property list */
+            if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR
+            if((t_dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR
+
+            /* Set chunking */
+	    if((ret = H5Pset_chunk(dcpl, 2, dim2)) < 0)
+		FAIL_PUTS_ERROR("    Problem with setting chunk.")
+
+	    if((ret = H5Pset_chunk(t_dcpl, 2, t_dim2)) < 0)
+		FAIL_PUTS_ERROR("    Problem with setting chunk.")
+
+#ifdef H5_HAVE_FILTER_DEFLATE
+            /* Check if we should compress the chunks */
+            if(compress) {
+                if(H5Pset_deflate(dcpl, 9) < 0) FAIL_STACK_ERROR
+                if(H5Pset_deflate(t_dcpl, 9) < 0) FAIL_STACK_ERROR
+	    }
+#endif /* H5_HAVE_FILTER_DEFLATE */
+
+            /* Set fill time */
+            if(H5Pset_fill_time(dcpl, H5D_FILL_TIME_ALLOC) < 0) FAIL_STACK_ERROR
+            if(H5Pset_fill_time(t_dcpl, H5D_FILL_TIME_ALLOC) < 0) FAIL_STACK_ERROR
+
+            /* Set allocation time */
+            if(H5Pset_alloc_time(dcpl, alloc_time) < 0) FAIL_STACK_ERROR
+            if(H5Pset_alloc_time(t_dcpl, alloc_time) < 0) FAIL_STACK_ERROR
+
+	    /* Create first dataset with cur and max dimensions */
+	    if((sid_max = H5Screate_simple(2, dim2, dim2)) < 0) FAIL_STACK_ERROR
+	    did_max = H5Dcreate2(fid, DSET_SINGLE_MAX, H5T_NATIVE_INT, sid_max, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+	    if(did_max < 0)
+		FAIL_PUTS_ERROR("    Creating Chunked Dataset with maximum dimensions.")
+
+	    /* Get the chunk index type */
+	    if(H5D__layout_idx_type_test(did_max, &idx_type) < 0) FAIL_STACK_ERROR
+
+	    /* Chunk index type depends on whether we are using the latest version of the format */
+	    if(low == H5F_LIBVER_LATEST) {
+		if(idx_type != H5D_CHUNK_IDX_SINGLE)
+		    FAIL_PUTS_ERROR("should be using Single Chunk indexing");
+	    } /* end if */
+	    else {
+		if(idx_type != H5D_CHUNK_IDX_BTREE)
+		    FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+	    } /* end else */
+
+	    /* Write into dataset */
+	    if(H5Dwrite(did_max, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf) < 0) TEST_ERROR;
+
+	    /* Closing */
+	    if(H5Dclose(did_max) < 0) FAIL_STACK_ERROR
+	    if(H5Sclose(sid_max) < 0) FAIL_STACK_ERROR
+
+	    /* Create second dataset with curr dim but NULL max dim */
+	    if((sid = H5Screate_simple(2, t_dim2, NULL)) < 0) FAIL_STACK_ERROR
+	    did = H5Dcreate2(fid, DSET_SINGLE_NOMAX, H5T_NATIVE_INT, sid, H5P_DEFAULT, t_dcpl, H5P_DEFAULT);
+	    if(did < 0)
+		FAIL_PUTS_ERROR("    Creating Chunked Dataset.")
+
+	    /* Get the chunk index type */
+	    if(H5D__layout_idx_type_test(did, &idx_type) < 0) FAIL_STACK_ERROR
+
+	    /* Chunk index type depends on whether we are using the latest version of the format */
+	    if(low == H5F_LIBVER_LATEST) {
+		if(idx_type != H5D_CHUNK_IDX_SINGLE)
+		    FAIL_PUTS_ERROR("should be using Single Chunk indexing");
+	    } else {
+		if(idx_type != H5D_CHUNK_IDX_BTREE)
+		    FAIL_PUTS_ERROR("should be using v1 B-tree as index");
+	    } /* end else */
+
+	    /* Write into dataset */
+	    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, sid, H5P_DEFAULT, t_wbuf) < 0) TEST_ERROR;
+
+	    /* Closing */
+	    if(H5Dclose(did) < 0) FAIL_STACK_ERROR
+	    if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+
+	    /* Open the first dataset */
+	    if((did_max = H5Dopen2(fid, DSET_SINGLE_MAX, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+	    /* Read from dataset */
+	    if(H5Dread(did_max, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0) TEST_ERROR;
+
+	    /* Verify that written and read data are the same */
+	    for(i = 0; i < (DSET_DIM1 * DSET_DIM2); i++)
+		if(rbuf[i] != wbuf[i]){
+		    printf("    Line %d: Incorrect value, wbuf[%u]=%d, rbuf[%u]=%d\n",
+			__LINE__,(unsigned)i,wbuf[i],(unsigned)i,rbuf[i]);
+		    TEST_ERROR;
+		} /* end if */
+
+	    /* Closing */
+	    if(H5Dclose(did_max) < 0) FAIL_STACK_ERROR
+
+	    /* Open the second dataset */
+	    if((did = H5Dopen2(fid, DSET_SINGLE_NOMAX, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+	    HDmemset(rbuf, 0, sizeof(rbuf));
+
+	    /* Read from dataset */
+	    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, t_rbuf) < 0) TEST_ERROR;
+
+	    /* Verify that written and read data are the same */
+	    for(i = 0; i < (50* 100); i++)
+		if(t_rbuf[i] != t_wbuf[i]){
+		    printf("    Line %d: Incorrect value, t_wbuf[%u]=%d, t_rbuf[%u]=%d\n",
+			__LINE__,(unsigned)i,t_wbuf[i],(unsigned)i,t_rbuf[i]);
+		    TEST_ERROR;
+		} /* end if */
+
+	    /* Closing */
+	    if(H5Dclose(did) < 0) FAIL_STACK_ERROR
+
+	    /* Delete datasets */
+            if(H5Ldelete(fid, DSET_SINGLE_NOMAX, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
+            if(H5Ldelete(fid, DSET_SINGLE_MAX, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
+
+            /* Close everything */
+            if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
+
+             /* Get the size of the file */
+            if((file_size = h5_get_file_size(filename, fapl)) < 0)
+                TEST_ERROR
+
+            /* Verify the file is correct size */
+            if(file_size != empty_size)
+                TEST_ERROR
+
+        } /* end for */
+#ifdef H5_HAVE_FILTER_DEFLATE
+    } /* end for */
+#endif /* H5_HAVE_FILTER_DEFLATE */
 
     PASSED();
     return 0;
 
 error:
     H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Pclose(t_dcpl);
         H5Dclose(did);
-	H5Fclose(fid);
+        H5Dclose(did_max);
+        H5Sclose(sid);
+        H5Sclose(sid_max);
+        H5Fclose(fid);
     } H5E_END_TRY;
     return -1;
-} /* test_idx_compatible */
+} /* end test_single_chunk() */
 
 

 /*-------------------------------------------------------------------------
- * Function: test_zero_dim_dset
- *
- * Purpose:     Tests support for reading a 1D chunled dataset with 
- *              dimension size = 0.
  *
- * Return:      Success: 0
- *              Failure: -1
+ *  test_idx_compatible(): 
+ *	Verify that the library can read datasets created with
+ *	1.6/1.8 library that use the B-tree indexing method.
  *
- * Programmer:  Mohamad Chaarawi
- *              Wednesdat, July 9, 2014
+ *  Programmer: Vailin Choi; 26th August, 2009
  *
  *-------------------------------------------------------------------------
  */
-static herr_t
-test_zero_dim_dset(hid_t fapl)
+static herr_t 
+test_idx_compatible(void)
 {
-    char        filename[FILENAME_BUF_SIZE];
-    hid_t       fid = -1;       /* File ID */
-    hid_t       dcpl = -1;      /* Dataset creation property list ID */
-    hid_t       sid = -1;       /* Dataspace ID */
-    hid_t       dsid = -1;      /* Dataset ID */
-    hsize_t     dim, chunk_dim; /* Dataset and chunk dimensions */
-    int         data[1];
+    hid_t	fid = -1;		/* File id */
+    hid_t       did = -1;		/* Dataset id */
+    const char  *filename = NULL;  /* old test file name */
+    unsigned    j;              /* Local index variable */
+    H5D_chunk_index_t idx_type; /* Chunked dataset index type */
 
-    TESTING("shrinking large chunk");
+    /* Output message about test being performed */
+    TESTING("compatibility for 1.6/1.8 datasets that use B-tree indexing");
 
-    h5_fixname(FILENAME[13], fapl, filename, sizeof filename);
+    for(j = 0; j < NELMTS(OLD_FILENAME); j++) {
 
-    /* Create file */
-    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) FAIL_STACK_ERROR
+	/* Generate correct name for test file by prepending the source path */
+	filename = H5_get_srcdir_filename(OLD_FILENAME[j]);
 
-    /* Create dataset creation property list */
-    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR
+	/* Open the file */
+	if((fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+	    TEST_ERROR
 
-    /* Set 1 chunk size */
-    chunk_dim = 1;
+	/* Should be able to read the dataset w/o filter created under 1.8/1.6 */
+	if((did = H5Dopen2(fid, DSET, H5P_DEFAULT)) < 0)
+	    TEST_ERROR
+
+	/* Get the chunk index type */
+	if(H5D__layout_idx_type_test(did, &idx_type) < 0) FAIL_STACK_ERROR
+
+	/* Verify index type */
+	if(idx_type != H5D_CHUNK_IDX_BTREE) 
+	    FAIL_PUTS_ERROR("should be using v1 B-tree as index")
+
+	if(H5Dclose(did) < 0) FAIL_STACK_ERROR
+
+	/* Should be able to read the dataset w/ filter created under 1.8/1.6 */
+	if((did = H5Dopen2(fid, DSET_FILTER, H5P_DEFAULT)) < 0)
+	    TEST_ERROR
+
+	/* Get the chunk index type */
+	if(H5D__layout_idx_type_test(did, &idx_type) < 0) FAIL_STACK_ERROR
+
+	/* Verify index type */
+	if(idx_type != H5D_CHUNK_IDX_BTREE) 
+	    FAIL_PUTS_ERROR("should be using v1 B-tree as index")
+
+	if(H5Dclose(did) < 0) FAIL_STACK_ERROR
+
+	/* Close the file */
+	if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
+    }
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Dclose(did);
+	H5Fclose(fid);
+    } H5E_END_TRY;
+    return -1;
+} /* test_idx_compatible */
+
+/*-------------------------------------------------------------------------
+ *
+ *  test_unfiltered_edge_chunks():
+ *      Tests that partial edge chunks aren't filtered when the
+ *      H5D_CHUNK_FILTER_PARTIAL_CHUNKS option is set.
+ *
+ *  Programmer: Neil Fortner; 17th March, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+test_unfiltered_edge_chunks(hid_t fapl)
+{
+    hid_t       fid = -1;            /* File id */
+    hid_t       did = -1;            /* Dataset id */
+    hid_t       sid = -1;            /* Dataspace id */
+    hid_t       dcpl = -1;           /* DCPL id */
+    hsize_t     dim[2] = {4, 3}; /* Dataset dimensions */
+    hsize_t     cdim[2] = {2, 2}; /* Chunk dimension */
+    char        wbuf[4][3];     /* Write buffer */
+    char        rbuf[4][3];     /* Read buffer */
+    char        filename[FILENAME_BUF_SIZE] = "";  /* old test file name */
+    unsigned    opts;           /* Chunk options */
+    unsigned    i, j;           /* Local index variables */
+
+    /* Output message about test being performed */
+    TESTING("disabled partial chunk filters");
+
+    h5_fixname(FILENAME[14], fapl, filename, sizeof filename);
+
+    /* Create the file */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Register byte-counting filter */
+    if(H5Zregister(H5Z_COUNT) < 0)
+        TEST_ERROR
+
+    /* Create dataspace */
+    if((sid = H5Screate_simple(2, dim, NULL)) < 0)
+        TEST_ERROR
+
+    /* Create DCPL */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        TEST_ERROR
+
+    /* Set chunk dimensions */
+    if(H5Pset_chunk(dcpl, 2, cdim) < 0)
+        TEST_ERROR
+
+    /* Add "count" filter */
+    if(H5Pset_filter(dcpl, H5Z_FILTER_COUNT, 0u, (size_t)0, NULL) < 0)
+        TEST_ERROR
+
+    /* Disable filters on partial chunks */
+    if(H5Pget_chunk_opts(dcpl, &opts) < 0)
+        TEST_ERROR
+    opts |= H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS;
+    if(H5Pset_chunk_opts(dcpl, opts) < 0)
+        TEST_ERROR
+
+    /* Initialize write buffer */
+    for(i=0; i<dim[0]; i++)
+        for(j=0; j<dim[1]; j++)
+            wbuf[i][j] = (char)(2 * i) - (char)j;
+
+    /* Reset byte counts */
+    count_nbytes_read = (size_t)0;
+    count_nbytes_written = (size_t)0;
+
+    /* Create dataset */
+    if((did = H5Dcreate2(fid, DSET_CHUNKED_NAME, H5T_NATIVE_CHAR, sid,
+            H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Nothing should have been written, as we are not using early allocation */
+    if(count_nbytes_read != (size_t)0)
+        TEST_ERROR
+    if(count_nbytes_written != (size_t)0)
+        TEST_ERROR
+
+    /* Write data */
+    if(H5Dwrite(did, H5T_NATIVE_CHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf) < 0)
+        TEST_ERROR
+
+    /* Close dataset */
+    if(H5Dclose(did) < 0)
+        TEST_ERROR
+
+    /* Make sure only 2 of the 4 chunks were written through the filter (4 bytes
+     * each) */
+    if(count_nbytes_read != (size_t)0)
+        TEST_ERROR
+    if(count_nbytes_written != (size_t)(2 * cdim[0] * cdim[1]))
+        TEST_ERROR
+
+    /* Reopen the dataset */
+    if((did = H5Dopen2(fid, DSET_CHUNKED_NAME, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Read the dataset */
+    if(H5Dread(did, H5T_NATIVE_CHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+        TEST_ERROR
+
+    /* Verify that data read == data written */
+    for(i=0; i<dim[0]; i++)
+        for(j=0; j<dim[1]; j++)
+            if(rbuf[i][j] != wbuf[i][j])
+                TEST_ERROR
+
+    /* Make sure only 2 of the 4 chunks were read through the filter (4 bytes
+     * each) */
+    if(count_nbytes_read != (size_t)(2 * cdim[0] * cdim[1]))
+        TEST_ERROR
+    if(count_nbytes_written != (size_t)(2 * cdim[0] * cdim[1]))
+        TEST_ERROR
+
+    /* Close IDs */
+    if(H5Dclose(did) < 0)
+        TEST_ERROR
+    if(H5Pclose(dcpl) < 0)
+        TEST_ERROR
+    if(H5Sclose(sid) < 0)
+        TEST_ERROR
+    if(H5Fclose(fid) < 0)
+        TEST_ERROR
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Dclose(did);
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    return -1;
+} /* test_unfiltered_edge_chunks */
+
+

+/*-------------------------------------------------------------------------
+ * Function: test_large_chunk_shrink
+ *
+ * Purpose: Tests support for shrinking a chunk larger than 1 MB by a
+ *              size greater than 1 MB.
+ *
+ * Return:      Success: 0
+ *              Failure: -1
+ *
+ * Programmer:  Neil Fortner
+ *              Monday, November 31, 2011
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+test_large_chunk_shrink(hid_t fapl)
+{
+    char        filename[FILENAME_BUF_SIZE];
+    hid_t       fid = -1;       /* File ID */
+    hid_t       dcpl = -1;      /* Dataset creation property list ID */
+    hid_t       sid = -1;       /* Dataspace ID */
+    hid_t       scalar_sid = -1;/* Scalar dataspace ID */
+    hid_t       dsid = -1;      /* Dataset ID */
+    hsize_t     dim, max_dim, chunk_dim; /* Dataset and chunk dimensions */
+    hsize_t     hs_offset;      /* Hyperslab offset */
+    hsize_t     hs_size;        /* Hyperslab size */
+    unsigned    write_elem, read_elem;  /* Element written/read */
+
+    TESTING("shrinking large chunk");
+
+    h5_fixname(FILENAME[10], fapl, filename, sizeof filename);
+
+    /* Create file */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) FAIL_STACK_ERROR
+
+    /* Create dataset creation property list */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR
+
+    /* Set 2 MB chunk size */
+    chunk_dim = 2 * 1024 * 1024 / sizeof(unsigned);
+    if(H5Pset_chunk(dcpl, 1, &chunk_dim) < 0) FAIL_STACK_ERROR
+
+    /* Create scalar dataspace */
+    if((scalar_sid = H5Screate(H5S_SCALAR)) < 0) FAIL_STACK_ERROR
+
+    /* Create 1-D dataspace */
+    dim = 2 * 1024 * 1024 / sizeof(unsigned);
+    max_dim = H5S_UNLIMITED;
+    if((sid = H5Screate_simple(1, &dim, &max_dim)) < 0) FAIL_STACK_ERROR
+
+    /* Create 2 MB chunked dataset */
+    if((dsid = H5Dcreate2(fid, "dset", H5T_NATIVE_UINT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Select last element in the dataset */
+    hs_offset = dim - 1;
+    hs_size = 1;
+    if(H5Sselect_hyperslab(sid, H5S_SELECT_SET, &hs_offset, NULL, &hs_size, NULL) < 0) FAIL_STACK_ERROR
+
+    /* Read (unwritten) element from dataset */
+    read_elem = 1;
+    if(H5Dread(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &read_elem) < 0) FAIL_STACK_ERROR
+
+    /* Verify unwritten element is fill value (0) */
+    if(read_elem != 0) FAIL_PUTS_ERROR("invalid unwritten element read");
+
+    /* Write element to dataset */
+    write_elem = 2;
+    if(H5Dwrite(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &write_elem) < 0) FAIL_STACK_ERROR
+
+    /* Read element from dataset */
+    read_elem = write_elem + 1;
+    if(H5Dread(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &read_elem) < 0) FAIL_STACK_ERROR
+
+    /* Verify written element is read in */
+    if(read_elem != write_elem) FAIL_PUTS_ERROR("invalid written element read");
+
+    /* Shrink dataset to 512 KB */
+    dim = 512 * 1024 / sizeof(unsigned);
+    if(H5Dset_extent(dsid, &dim) < 0) FAIL_STACK_ERROR
+
+    /* Expand dataset back to 2MB */
+    dim = 2 * 1024 * 1024 / sizeof(unsigned);
+    if(H5Dset_extent(dsid, &dim) < 0) FAIL_STACK_ERROR
+
+    /* Read element from dataset */
+    read_elem = 1;
+    if(H5Dread(dsid, H5T_NATIVE_UINT, scalar_sid, sid, H5P_DEFAULT, &read_elem) < 0) FAIL_STACK_ERROR
+
+    /* Verify element is now 0 */
+    if(read_elem != 0) FAIL_PUTS_ERROR("invalid element read");
+
+    /* Close everything */
+    if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+    if(H5Sclose(scalar_sid) < 0) FAIL_STACK_ERROR
+    if(H5Dclose(dsid) < 0) FAIL_STACK_ERROR
+    if(H5Pclose(dcpl) < 0) FAIL_STACK_ERROR
+    if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Dclose(dsid);
+        H5Sclose(sid);
+        H5Sclose(scalar_sid);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    return -1;
+} /* end test_large_chunk_shrink() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: test_zero_dim_dset
+ *
+ * Purpose:     Tests support for reading a 1D chunled dataset with 
+ *              dimension size = 0.
+ *
+ * Return:      Success: 0
+ *              Failure: -1
+ *
+ * Programmer:  Mohamad Chaarawi
+ *              Wednesdat, July 9, 2014
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+test_zero_dim_dset(hid_t fapl)
+{
+    char        filename[FILENAME_BUF_SIZE];
+    hid_t       fid = -1;       /* File ID */
+    hid_t       dcpl = -1;      /* Dataset creation property list ID */
+    hid_t       sid = -1;       /* Dataspace ID */
+    hid_t       dsid = -1;      /* Dataset ID */
+    hsize_t     dim, chunk_dim; /* Dataset and chunk dimensions */
+    int         data[1];
+
+    TESTING("shrinking large chunk");
+
+    h5_fixname(FILENAME[16], fapl, filename, sizeof filename);
+
+    /* Create file */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) FAIL_STACK_ERROR
+
+    /* Create dataset creation property list */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR
+
+    /* Set 1 chunk size */
+    chunk_dim = 1;
     if(H5Pset_chunk(dcpl, 1, &chunk_dim) < 0) FAIL_STACK_ERROR
 
     /* Create 1D dataspace with 0 dim size */
@@ -8063,6 +10143,609 @@ error:
 
 

 /*-------------------------------------------------------------------------
+ * Function: test_swmr_non_latest
+ *
+ * Purpose: Checks that a file created with either:
+ *		(a) SWMR-write + non-latest-format
+ *		(b) write + latest format
+ *	    will generate datset with latest chunk indexing type.
+ *
+ * Return:      Success: 0
+ *              Failure: -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+test_swmr_non_latest(const char *env_h5_driver, hid_t fapl)
+{
+    char        filename[FILENAME_BUF_SIZE];
+    hid_t       fid = -1;       		/* File ID */
+    hid_t       gid = -1;       		/* Group ID */
+    hid_t       dcpl = -1;      		/* Dataset creation property list ID */
+    hid_t       sid = -1;       		/* Dataspace ID */
+    hid_t       did = -1;       		/* Dataset ID */
+    hsize_t     dim[1], dims2[2];        	/* Size of dataset */
+    hsize_t     max_dim[1], max_dims2[2];    	/* Maximum size of dataset */
+    hsize_t     chunk_dim[1], chunk_dims2[2];  	/* Chunk dimensions */
+    H5D_chunk_index_t idx_type; 		/* Chunk index type */
+    int         data;      			/* Data to be written to the dataset */
+    H5F_libver_t low;           		/* File format low bound */
+
+    TESTING("File created with write+latest-format/SWMR-write+non-latest-format: dataset with latest chunk index");
+
+    /* Skip this test if SWMR I/O is not supported for the VFD specified
+     * by the environment variable.
+     */
+    if(!H5FD_supports_swmr_test(env_h5_driver)) {
+        SKIPPED();
+        HDputs("    Test skipped due to VFD not supporting SWMR I/O.");
+        return 0;
+    }
+
+    /* Check if we are using the latest version of the format */
+    if(H5Pget_libver_bounds(fapl, &low, NULL) < 0) 
+	FAIL_STACK_ERROR
+
+    h5_fixname(FILENAME[18], fapl, filename, sizeof filename);
+
+    if(low == H5F_LIBVER_LATEST) {
+	/* Create file with write+latest-format */
+	if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) 
+	    FAIL_STACK_ERROR
+    } else {
+	/* Create file with SWMR-write+non-latest-format */
+	if((fid = H5Fcreate(filename, H5F_ACC_TRUNC|H5F_ACC_SWMR_WRITE, H5P_DEFAULT, fapl)) < 0) 
+	    FAIL_STACK_ERROR
+    }
+
+    /* Create a chunked dataset: this will use extensible array chunk indexing */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) 
+	FAIL_STACK_ERROR
+
+    chunk_dim[0] = 6;
+    if(H5Pset_chunk(dcpl, 1, chunk_dim) < 0) 
+	FAIL_STACK_ERROR
+
+    dim[0] = 1;
+    max_dim[0] = H5S_UNLIMITED;
+    if((sid = H5Screate_simple(1, dim, max_dim)) < 0) 
+	FAIL_STACK_ERROR
+
+    if((did = H5Dcreate2(fid, DSET_CHUNKED_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) 
+	FAIL_STACK_ERROR
+
+    /* Write to the dataset */
+    data = 100;
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &data) < 0)
+	FAIL_STACK_ERROR
+
+    /* Verify the dataset's indexing type */
+    if(H5D__layout_idx_type_test(did, &idx_type) < 0) 
+	FAIL_STACK_ERROR
+    if(idx_type != H5D_CHUNK_IDX_EARRAY) 
+        FAIL_PUTS_ERROR("created dataset not indexed by extensible array")
+
+    /* Closing */
+    if(H5Dclose(did) < 0) FAIL_STACK_ERROR
+    if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+    if(H5Pclose(dcpl) < 0) FAIL_STACK_ERROR
+    if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
+
+    /* Open the file again */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) 
+	FAIL_STACK_ERROR
+
+    /* Open the dataset in the file */
+    if((did = H5Dopen2(fid, DSET_CHUNKED_NAME, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Verify the dataset's indexing type */
+    if(H5D__layout_idx_type_test(did, &idx_type) < 0) 
+	FAIL_STACK_ERROR
+    if(idx_type != H5D_CHUNK_IDX_EARRAY) 
+        FAIL_PUTS_ERROR("created dataset not indexed by extensible array")
+
+    /* Read from the dataset and verify data read is correct */
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &data) < 0)
+	FAIL_STACK_ERROR
+    if(data != 100)
+	FAIL_STACK_ERROR
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0) FAIL_STACK_ERROR
+
+    /* Create a group in the file */
+    if((gid = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Create a chunked dataset in the group: this will use v2 B-tree chunk indexing */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) 
+	FAIL_STACK_ERROR
+
+    chunk_dims2[0] = chunk_dims2[1] = 10;
+    if(H5Pset_chunk(dcpl, 2, chunk_dims2) < 0) 
+	FAIL_STACK_ERROR
+
+    dims2[0] = dims2[1] = 1;
+    max_dims2[0] = max_dims2[1] = H5S_UNLIMITED;
+    if((sid = H5Screate_simple(2, dims2, max_dims2)) < 0) 
+	FAIL_STACK_ERROR
+
+    if((did = H5Dcreate2(gid, DSET_CHUNKED_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) 
+	FAIL_STACK_ERROR
+
+    /* Verify the dataset's indexing type */
+    if(H5D__layout_idx_type_test(did, &idx_type) < 0) 
+	FAIL_STACK_ERROR
+    if(idx_type != H5D_CHUNK_IDX_BT2) 
+        FAIL_PUTS_ERROR("created dataset not indexed by v2 B-tree")
+
+    /* Closing */
+    if(H5Dclose(did) < 0) FAIL_STACK_ERROR
+    if(H5Sclose(sid) < 0) FAIL_STACK_ERROR
+    if(H5Gclose(gid) < 0) FAIL_STACK_ERROR
+    if(H5Pclose(dcpl) < 0) FAIL_STACK_ERROR
+    if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
+
+    /* Open the file again */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0) FAIL_STACK_ERROR
+
+    /* Open the group */
+    if((gid = H5Gopen2(fid, "group", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+
+    /* Open the dataset in the group */
+    if((did = H5Dopen2(gid, DSET_CHUNKED_NAME, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Verify the dataset's indexing type */
+    if(H5D__layout_idx_type_test(did, &idx_type) < 0) 
+	FAIL_STACK_ERROR
+    if(idx_type != H5D_CHUNK_IDX_BT2) 
+        FAIL_PUTS_ERROR("created dataset not indexed by v2 B-tree")
+
+    /* Closing */
+    if(H5Dclose(did) < 0) FAIL_STACK_ERROR
+    if(H5Gclose(gid) < 0) FAIL_STACK_ERROR
+    if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
+
+
+    /* Reopen the file with SWMR-write */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR | H5F_ACC_SWMR_WRITE, fapl)) < 0) FAIL_STACK_ERROR
+
+    /* Open the dataset in the file */
+    if((did = H5Dopen2(fid, DSET_CHUNKED_NAME, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Verify the dataset's indexing type */
+    if(H5D__layout_idx_type_test(did, &idx_type) < 0) 
+	FAIL_STACK_ERROR
+    if(idx_type != H5D_CHUNK_IDX_EARRAY) 
+        FAIL_PUTS_ERROR("created dataset not indexed by extensible array")
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0) FAIL_STACK_ERROR
+
+    /* Open the group */
+    if((gid = H5Gopen2(fid, "group", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+
+    /* Open the dataset in the group */
+    if((did = H5Dopen2(gid, DSET_CHUNKED_NAME, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Verify the dataset's indexing type */
+    if(H5D__layout_idx_type_test(did, &idx_type) < 0) 
+	FAIL_STACK_ERROR
+    if(idx_type != H5D_CHUNK_IDX_BT2) 
+        FAIL_PUTS_ERROR("created dataset not indexed by v2 B-tree")
+
+    /* Write to the dataset in the group */
+    data = 99;
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &data) < 0)
+	FAIL_STACK_ERROR
+
+    /* Closing */
+    if(H5Dclose(did) < 0) FAIL_STACK_ERROR
+    if(H5Gclose(gid) < 0) FAIL_STACK_ERROR
+    if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
+
+    /* Open the file again with SWMR read access */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY | H5F_ACC_SWMR_READ, fapl)) < 0) 
+	FAIL_STACK_ERROR
+
+    if((gid = H5Gopen2(fid, "group", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+
+    /* Open the dataset */
+    if((did = H5Dopen2(gid, DSET_CHUNKED_NAME, H5P_DEFAULT)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Read from the dataset and verify data read is correct */
+    data = 0;
+    if(H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &data) < 0)
+	FAIL_STACK_ERROR
+    if(data != 99) FAIL_STACK_ERROR
+
+    /* Closing */
+    if(H5Dclose(did) < 0) FAIL_STACK_ERROR
+    if(H5Gclose(gid) < 0) FAIL_STACK_ERROR
+    if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Dclose(did);
+        H5Sclose(sid);
+        H5Gclose(gid);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+    return -1;
+} /* test_swmr_non_latest() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: test_earray_hdr_fd
+ *
+ * Purpose: Tests that extensible array header flush dependencies
+ *          are created and torn down correctly when used as a
+ *          chunk index.
+ *
+ * Return:      Success: 0
+ *              Failure: -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+test_earray_hdr_fd(const char *env_h5_driver, hid_t fapl)
+{
+    char        filename[FILENAME_BUF_SIZE];
+    hid_t fid = -1;
+    hid_t sid = -1;
+    hid_t did = -1;
+    hid_t tid = -1;
+    hid_t dcpl = -1;
+    hid_t msid = -1;
+    H5D_chunk_index_t idx_type;
+    const hsize_t shape[1] = { 8 };
+    const hsize_t maxshape[1] = { H5S_UNLIMITED };
+    const hsize_t chunk[1] = { 8 };
+    const int buffer[8] = {0, 1, 2, 3, 4, 5, 6, 7};
+    H5O_info_t info;
+
+    TESTING("Extensible array chunk index header flush dependencies handled correctly");
+
+    /* Skip this test if SWMR I/O is not supported for the VFD specified
+     * by the environment variable.
+     */
+    if(!H5FD_supports_swmr_test(env_h5_driver)) {
+        SKIPPED();
+        HDputs("    Test skipped due to VFD not supporting SWMR I/O.");
+        return 0;
+    } /* end if */
+
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR;
+
+    h5_fixname(FILENAME[19], fapl, filename, sizeof(filename));
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Create a dataset with one unlimited dimension */
+    if((sid = H5Screate_simple(1, shape, maxshape)) < 0)
+        FAIL_STACK_ERROR;
+    if((tid = H5Tcopy(H5T_NATIVE_INT32)) < 0)
+        FAIL_STACK_ERROR;
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pset_chunk(dcpl, 1, chunk) < 0)
+        FAIL_STACK_ERROR;
+    if((did = H5Dcreate2(fid, DSET_EARRAY_HDR_FD, tid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT )) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Verify the chunk index type */
+    if(H5D__layout_idx_type_test(did, &idx_type) < 0) 
+        FAIL_STACK_ERROR;
+    if(idx_type != H5D_CHUNK_IDX_EARRAY)
+        FAIL_PUTS_ERROR("should be using extensible array as index");
+
+    if(H5Dclose(did) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(dcpl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Tclose(tid) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Sclose(sid) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5Fstart_swmr_write(fid) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Write data to the dataset */
+    if((did = H5Dopen2(fid, DSET_EARRAY_HDR_FD, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+    if((tid = H5Dget_type(did)) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buffer) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Tclose(tid) < 0)
+        FAIL_STACK_ERROR;
+
+    /* The second call triggered a bug in the library (JIRA issue: SWMR-95) */
+    if(H5Oget_info_by_name(fid, DSET_EARRAY_HDR_FD, &info, H5P_DEFAULT) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Oget_info_by_name(fid, DSET_EARRAY_HDR_FD, &info, H5P_DEFAULT) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Fclose(fid) < 0)
+        TEST_ERROR;
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+        H5Fclose(fid);
+        H5Dclose(did);
+        H5Pclose(dcpl);
+        H5Tclose(tid);
+        H5Sclose(sid);
+        H5Sclose(msid);
+    } H5E_END_TRY;
+    return -1;
+} /* test_earray_hdr_fd() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: test_farray_hdr_fd
+ *
+ * Purpose: Tests that fixed array header flush dependencies
+ *          are created and torn down correctly when used as a
+ *          chunk index.
+ *
+ * Return:      Success: 0
+ *              Failure: -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+test_farray_hdr_fd(const char *env_h5_driver, hid_t fapl)
+{
+    char        filename[FILENAME_BUF_SIZE];
+    hid_t fid = -1;
+    hid_t sid = -1;
+    hid_t did = -1;
+    hid_t tid = -1;
+    hid_t dcpl = -1;
+    hid_t msid = -1;
+    H5D_chunk_index_t idx_type;
+    const hsize_t shape[1] = { 8 };
+    const hsize_t maxshape[1] = { 64 };
+    const hsize_t chunk[1] = { 8 };
+    const int buffer[8] = {0, 1, 2, 3, 4, 5, 6, 7};
+    H5O_info_t info;
+
+    TESTING("Fixed array chunk index header flush dependencies handled correctly");
+
+    /* Skip this test if SWMR I/O is not supported for the VFD specified
+     * by the environment variable.
+     */
+    if(!H5FD_supports_swmr_test(env_h5_driver)) {
+        SKIPPED();
+        HDputs("    Test skipped due to VFD not supporting SWMR I/O.");
+        return 0;
+    } /* end if */
+
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR;
+
+    h5_fixname(FILENAME[20], fapl, filename, sizeof(filename));
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Create a chunked dataset with fixed dimensions */
+    if((sid = H5Screate_simple(1, shape, maxshape)) < 0)
+        FAIL_STACK_ERROR;
+    if((tid = H5Tcopy(H5T_NATIVE_INT32)) < 0)
+        FAIL_STACK_ERROR;
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pset_chunk(dcpl, 1, chunk) < 0)
+        FAIL_STACK_ERROR;
+    if((did = H5Dcreate2(fid, DSET_FARRAY_HDR_FD, tid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT )) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Verify the chunk index type */
+    if(H5D__layout_idx_type_test(did, &idx_type) < 0) 
+        FAIL_STACK_ERROR;
+    if(idx_type != H5D_CHUNK_IDX_FARRAY)
+        FAIL_PUTS_ERROR("should be using fixed array as index");
+
+    if(H5Dclose(did) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(dcpl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Tclose(tid) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Sclose(sid) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5Fstart_swmr_write(fid) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Write data to the dataset */
+    if((did = H5Dopen2(fid, DSET_FARRAY_HDR_FD, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+    if((tid = H5Dget_type(did)) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buffer) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Tclose(tid) < 0)
+        FAIL_STACK_ERROR;
+
+    /* The second call triggered a bug in the library (JIRA issue: SWMR-95) */
+    if(H5Oget_info_by_name(fid, DSET_FARRAY_HDR_FD, &info, H5P_DEFAULT) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Oget_info_by_name(fid, DSET_FARRAY_HDR_FD, &info, H5P_DEFAULT) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Fclose(fid) < 0)
+        TEST_ERROR;
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+        H5Fclose(fid);
+        H5Dclose(did);
+        H5Pclose(dcpl);
+        H5Tclose(tid);
+        H5Sclose(sid);
+        H5Sclose(msid);
+    } H5E_END_TRY;
+    return -1;
+} /* test_farray_hdr_fd() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: test_bt2_hdr_fd
+ *
+ * Purpose: Tests that version 2 B-tree header flush dependencies
+ *          are created and torn down correctly when used as a
+ *          chunk index.
+ *
+ * Return:      Success: 0
+ *              Failure: -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+test_bt2_hdr_fd(const char *env_h5_driver, hid_t fapl)
+{
+    char        filename[FILENAME_BUF_SIZE];
+    hid_t fid = -1;
+    hid_t sid = -1;
+    hid_t did = -1;
+    hid_t tid = -1;
+    hid_t dcpl = -1;
+    hid_t msid = -1;
+    H5D_chunk_index_t idx_type;
+    const hsize_t shape[2] = { 8, 8 };
+    const hsize_t maxshape[2] = { H5S_UNLIMITED, H5S_UNLIMITED };
+    const hsize_t chunk[2] = { 8, 8 };
+    const int buffer[8] = {0, 1, 2, 3, 4, 5, 6, 7};
+    H5O_info_t info;
+
+    TESTING("Version 2 B-tree chunk index header flush dependencies handled correctly");
+
+    /* Skip this test if SWMR I/O is not supported for the VFD specified
+     * by the environment variable.
+     */
+    if(!H5FD_supports_swmr_test(env_h5_driver)) {
+        SKIPPED();
+        HDputs("    Test skipped due to VFD not supporting SWMR I/O.");
+        return 0;
+    } /* end if */
+
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR;
+
+    h5_fixname(FILENAME[21], fapl, filename, sizeof(filename));
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Create a chunked dataset with fixed dimensions */
+    if((sid = H5Screate_simple(2, shape, maxshape)) < 0)
+        FAIL_STACK_ERROR;
+    if((tid = H5Tcopy(H5T_NATIVE_INT32)) < 0)
+        FAIL_STACK_ERROR;
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pset_chunk(dcpl, 2, chunk) < 0)
+        FAIL_STACK_ERROR;
+    if((did = H5Dcreate2(fid, DSET_BT2_HDR_FD, tid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT )) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Verify the chunk index type */
+    if(H5D__layout_idx_type_test(did, &idx_type) < 0) 
+        FAIL_STACK_ERROR;
+    if(idx_type != H5D_CHUNK_IDX_BT2)
+        FAIL_PUTS_ERROR("should be using fixed array as index");
+
+    if(H5Dclose(did) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(dcpl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Tclose(tid) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Sclose(sid) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5Fstart_swmr_write(fid) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Write data to the dataset */
+    if((did = H5Dopen2(fid, DSET_BT2_HDR_FD, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+    if((tid = H5Dget_type(did)) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buffer) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Tclose(tid) < 0)
+        FAIL_STACK_ERROR;
+
+    /* The second call triggered a bug in the library (JIRA issue: SWMR-95) */
+    if(H5Oget_info_by_name(fid, DSET_BT2_HDR_FD, &info, H5P_DEFAULT) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Oget_info_by_name(fid, DSET_BT2_HDR_FD, &info, H5P_DEFAULT) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Fclose(fid) < 0)
+        TEST_ERROR;
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+        H5Fclose(fid);
+        H5Dclose(did);
+        H5Pclose(dcpl);
+        H5Tclose(tid);
+        H5Sclose(sid);
+        H5Sclose(msid);
+    } H5E_END_TRY;
+    return -1;
+} /* test_bt2_hdr_fd() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    test_scatter
  *
  * Purpose:     Tests H5Dscatter with a variety of different selections
@@ -9103,7 +11786,7 @@ main(void)
 {
     char		filename[FILENAME_BUF_SIZE];
     hid_t		file, grp, fapl, fapl2;
-    hbool_t new_format;
+    unsigned new_format;
     int mdc_nelmts;
     size_t rdcc_nelmts;
     size_t rdcc_nbytes;
@@ -9114,7 +11797,7 @@ main(void)
     /* Don't run this test using certain file drivers */
     envval = HDgetenv("HDF5_DRIVER");
     if(envval == NULL)
-        envval = "nomatch";
+        envval = "sec2";
 
     /* Set the random # seed */
     HDsrandom((unsigned)HDtime(NULL));
@@ -9168,38 +11851,38 @@ main(void)
         nerrors += (test_simple_io(envval, my_fapl) < 0		? 1 : 0);
         nerrors += (test_compact_io(my_fapl) < 0  		? 1 : 0);
         nerrors += (test_max_compact(my_fapl) < 0  		? 1 : 0);
-        nerrors += (test_conv_buffer(file) < 0		? 1 : 0);
+        nerrors += (test_conv_buffer(file) < 0		        ? 1 : 0);
         nerrors += (test_tconv(file) < 0			? 1 : 0);
         nerrors += (test_filters(file, my_fapl) < 0		? 1 : 0);
         nerrors += (test_onebyte_shuffle(file) < 0 		? 1 : 0);
-        nerrors += (test_nbit_int(file) < 0 		? 1 : 0);
-        nerrors += (test_nbit_float(file) < 0         	? 1 : 0);
-        nerrors += (test_nbit_double(file) < 0         	? 1 : 0);
-        nerrors += (test_nbit_array(file) < 0 		? 1 : 0);
+        nerrors += (test_nbit_int(file) < 0 		        ? 1 : 0);
+        nerrors += (test_nbit_float(file) < 0         	        ? 1 : 0);
+        nerrors += (test_nbit_double(file) < 0         	        ? 1 : 0);
+        nerrors += (test_nbit_array(file) < 0 		        ? 1 : 0);
         nerrors += (test_nbit_compound(file) < 0 		? 1 : 0);
         nerrors += (test_nbit_compound_2(file) < 0 		? 1 : 0);
         nerrors += (test_nbit_compound_3(file) < 0 		? 1 : 0);
         nerrors += (test_nbit_int_size(file) < 0 		? 1 : 0);
         nerrors += (test_nbit_flt_size(file) < 0 		? 1 : 0);
         nerrors += (test_scaleoffset_int(file) < 0 		? 1 : 0);
-        nerrors += (test_scaleoffset_int_2(file) < 0 	? 1 : 0);
-        nerrors += (test_scaleoffset_float(file) < 0 	? 1 : 0);
-        nerrors += (test_scaleoffset_float_2(file) < 0 	? 1 : 0);
-        nerrors += (test_scaleoffset_double(file) < 0 	? 1 : 0);
+        nerrors += (test_scaleoffset_int_2(file) < 0 	        ? 1 : 0);
+        nerrors += (test_scaleoffset_float(file) < 0 	        ? 1 : 0);
+        nerrors += (test_scaleoffset_float_2(file) < 0 	        ? 1 : 0);
+        nerrors += (test_scaleoffset_double(file) < 0 	        ? 1 : 0);
         nerrors += (test_scaleoffset_double_2(file) < 0 	? 1 : 0);
-        nerrors += (test_multiopen (file) < 0		? 1 : 0);
-        nerrors += (test_types(file) < 0       		? 1 : 0);
-        nerrors += (test_userblock_offset(envval, my_fapl) < 0     	? 1 : 0);
+        nerrors += (test_multiopen (file) < 0		        ? 1 : 0);
+        nerrors += (test_types(file) < 0       		        ? 1 : 0);
+        nerrors += (test_userblock_offset(envval, my_fapl) < 0  ? 1 : 0);
         nerrors += (test_missing_filter(file) < 0		? 1 : 0);
-        nerrors += (test_can_apply(file) < 0		? 1 : 0);
-        nerrors += (test_can_apply2(file) < 0		? 1 : 0);
-        nerrors += (test_set_local(my_fapl) < 0		? 1 : 0);
+        nerrors += (test_can_apply(file) < 0		        ? 1 : 0);
+        nerrors += (test_can_apply2(file) < 0		        ? 1 : 0);
+        nerrors += (test_set_local(my_fapl) < 0		        ? 1 : 0);
         nerrors += (test_can_apply_szip(file) < 0		? 1 : 0);
-        nerrors += (test_compare_dcpl(file) < 0		? 1 : 0);
-        nerrors += (test_copy_dcpl(file, my_fapl) < 0	? 1 : 0);
+        nerrors += (test_compare_dcpl(file) < 0		        ? 1 : 0);
+        nerrors += (test_copy_dcpl(file, my_fapl) < 0	        ? 1 : 0);
         nerrors += (test_filter_delete(file) < 0		? 1 : 0);
-        nerrors += (test_filters_endianess() < 0	? 1 : 0);
-        nerrors += (test_zero_dims(file) < 0		? 1 : 0);
+        nerrors += (test_filters_endianess() < 0	        ? 1 : 0);
+        nerrors += (test_zero_dims(file) < 0		        ? 1 : 0);
         nerrors += (test_missing_chunk(file) < 0		? 1 : 0);
         nerrors += (test_random_chunks(my_fapl) < 0		? 1 : 0);
 #ifndef H5_NO_DEPRECATED_SYMBOLS
@@ -9208,11 +11891,21 @@ main(void)
         nerrors += (test_huge_chunks(my_fapl) < 0		? 1 : 0);
         nerrors += (test_chunk_cache(my_fapl) < 0		? 1 : 0);
         nerrors += (test_big_chunks_bypass_cache(my_fapl) < 0   ? 1 : 0);
+        nerrors += (test_chunk_fast(envval, my_fapl) < 0	? 1 : 0);
+        nerrors += (test_reopen_chunk_fast(my_fapl) < 0		? 1 : 0);
+        nerrors += (test_chunk_fast_bug1(my_fapl) < 0           ? 1 : 0);
         nerrors += (test_chunk_expand(my_fapl) < 0		? 1 : 0);
-	nerrors += (test_idx_compatible() < 0  			? 1 : 0);
-	nerrors += (test_layout_extend(my_fapl) < 0		? 1 : 0);
-	nerrors += (test_large_chunk_shrink(my_fapl) < 0        ? 1 : 0);
-	nerrors += (test_zero_dim_dset(my_fapl) < 0             ? 1 : 0);
+        nerrors += (test_layout_extend(my_fapl) < 0		? 1 : 0);
+        nerrors += (test_fixed_array(my_fapl) < 0		? 1 : 0);
+        nerrors += (test_idx_compatible() < 0			? 1 : 0);
+        nerrors += (test_unfiltered_edge_chunks(my_fapl) < 0    ? 1 : 0);
+        nerrors += (test_single_chunk(my_fapl) < 0              ? 1 : 0);	
+        nerrors += (test_large_chunk_shrink(my_fapl) < 0        ? 1 : 0);
+        nerrors += (test_zero_dim_dset(my_fapl) < 0             ? 1 : 0);
+        nerrors += (test_swmr_non_latest(envval, my_fapl) < 0   ? 1 : 0);
+        nerrors += (test_earray_hdr_fd(envval, my_fapl) < 0     ? 1 : 0);
+        nerrors += (test_farray_hdr_fd(envval, my_fapl) < 0     ? 1 : 0);
+        nerrors += (test_bt2_hdr_fd(envval, my_fapl) < 0        ? 1 : 0);
 
         if(H5Fclose(file) < 0)
             goto error;
diff --git a/test/dt_arith.c b/test/dt_arith.c
index 4337690..76ad0f3 100644
--- a/test/dt_arith.c
+++ b/test/dt_arith.c
@@ -45,7 +45,7 @@
 
 /* Alignment test stuff */
 #ifdef TEST_ALIGNMENT
-#define H5T_PACKAGE
+#define H5T_FRIEND		/*suppress error about including H5Tpkg	  */
 #include "H5Tpkg.h"
 #endif
 #define SET_ALIGNMENT(TYPE,VAL) \
@@ -532,7 +532,7 @@ some_dummy_func(float x)
 {
     char	s[128];
 
-    HDsnprintf(s, sizeof(s), "%g", x);
+    HDsnprintf(s, sizeof(s), "%g", (double)x);
 }
 
 

@@ -624,7 +624,7 @@ test_hard_query(void)
         H5_FAILED();
         printf("Can't query conversion function\n");
         goto error;
-    } /* end if */
+    }
 
     /* Unregister the hard conversion from int to float.  Verify the conversion
      * is a soft conversion. */
@@ -633,7 +633,7 @@ test_hard_query(void)
         H5_FAILED();
         printf("Can't query conversion function\n");
         goto error;
-    } /* end if */
+    }
 
     /* Register the hard conversion from int to float.  Verify the conversion
      * is a hard conversion. */
@@ -642,17 +642,24 @@ test_hard_query(void)
         H5_FAILED();
         printf("Can't query conversion function\n");
         goto error;
-    } /* end if */
+    }
 
     PASSED();
+
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
 
     return 0;
 
- error:
+error:
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
     return 1;
-} /*  end test_hard_query() */
+}
 
 

 /*-------------------------------------------------------------------------
@@ -826,7 +833,7 @@ static int test_particular_fp_integer(void)
             printf(" %02x", saved_buf2[ENDIAN(src_size2, j, endian)]);
 
         HDmemcpy(&x, saved_buf2, src_size2);
-        printf(" %29.20e\n", x);
+        printf(" %29.20e\n", (double)x);
 
         printf("        dst = ");
         for (j=0; j<dst_size2; j++)
@@ -871,7 +878,11 @@ error:
     if(saved_buf2)
         HDfree(saved_buf2);
 
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5(); /*print statistics*/
+
     return MAX((int)fails_this_test, 1);
 }
 
@@ -1290,6 +1301,10 @@ test_derived_flt(void)
     } /* end if */
 
     PASSED();
+
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();	/*print statistics*/
 
     return 0;
@@ -1305,7 +1320,12 @@ test_derived_flt(void)
         H5Pclose (dxpl_id);
         H5Fclose (file);
     } H5E_END_TRY;
+
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5(); /*print statistics*/
+
     return MAX((int)fails_this_test, 1);
 }
 
@@ -1592,6 +1612,10 @@ test_derived_integer(void)
     HDfree(saved_buf);
 
     PASSED();
+
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();	/*print statistics*/
 
     return 0;
@@ -1606,7 +1630,12 @@ test_derived_integer(void)
         H5Pclose (dxpl_id);
         H5Fclose (file);
     } H5E_END_TRY;
+
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5(); /*print statistics*/
+
     return MAX((int)fails_this_test, 1);
 }
 
@@ -2601,7 +2630,12 @@ done:
     if (saved) aligned_free(saved);
     if (aligned) HDfree(aligned);
     HDfflush(stdout);
+
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();	/*print statistics*/
+
     return (int)fails_all_tests;
 
 error:
@@ -2609,7 +2643,12 @@ error:
     if (saved) aligned_free(saved);
     if (aligned) HDfree(aligned);
     HDfflush(stdout);
+
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();	/*print statistics*/
+
     return MAX((int)fails_all_tests, 1);
 }
 
@@ -2714,7 +2753,7 @@ my_isnan(dtype_t type, void *val)
 	    float x;
 
 	    HDmemcpy(&x, val, sizeof(float));
-	    HDsnprintf(s, sizeof(s), "%g", x);
+	    HDsnprintf(s, sizeof(s), "%g", (double)x);
 	} else if (FLT_DOUBLE==type) {
 	    double x;
 
@@ -2820,7 +2859,7 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst)
 #endif
     unsigned char	*hw=NULL;		/*ptr to hardware-conv'd*/
     int			underflow;		/*underflow occurred	*/
-    int			overflow;		/*overflow occurred	*/
+    int			overflow = 0;	/*overflow occurred	*/
     int 		uflow=0;		/*underflow debug counters*/
     size_t		j, k;			/*counters		*/
     int			sendian;		/* source type endianess */
@@ -3232,7 +3271,7 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst)
         if (FLT_FLOAT==src_type) {
             float x;
             HDmemcpy(&x, &saved[j*src_size], sizeof(float));
-            printf(" %29.20e\n", x);
+            printf(" %29.20e\n", (double)x);
         } else if (FLT_DOUBLE==src_type) {
             double x;
             HDmemcpy(&x, &saved[j*src_size], sizeof(double));
@@ -3252,7 +3291,7 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst)
         if (FLT_FLOAT==dst_type) {
             float x;
             HDmemcpy(&x, &buf[j*dst_size], sizeof(float));
-            printf(" %29.20e\n", x);
+            printf(" %29.20e\n", (double)x);
         } else if (FLT_DOUBLE==dst_type) {
             double x;
             HDmemcpy(&x, &buf[j*dst_size], sizeof(double));
@@ -3270,7 +3309,7 @@ test_conv_flt_1 (const char *name, int run_test, hid_t src, hid_t dst)
             printf(" %02x", hw[ENDIAN(dst_size,k,dendian)]);
         printf("%*s", (int)(3*MAX(0, (ssize_t)src_size-(ssize_t)dst_size)), "");
         if (FLT_FLOAT==dst_type)
-            printf(" %29.20e\n", hw_f);
+            printf(" %29.20e\n", (double)hw_f);
         else if (FLT_DOUBLE==dst_type)
             printf(" %29.20e\n", hw_d);
 #if H5_SIZEOF_LONG_DOUBLE!=H5_SIZEOF_DOUBLE
@@ -3307,6 +3346,9 @@ done:
     HDassert(0 && "Should not reach this point!");
     return 1;
 #else
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
 
     /* If the source is normalized values, treat the failures as error;
@@ -3330,7 +3372,11 @@ error:
     HDassert(0 && "Should not reach this point!");
     return 1;
 #else
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
+
     if(run_test==TEST_NOOP || run_test==TEST_NORMAL)
         return MAX((int)fails_all_tests, 1);
     else if(run_test==TEST_DENORM || run_test==TEST_SPECIAL)
@@ -4299,8 +4345,6 @@ test_conv_int_fp(const char *name, int run_test, hid_t src, hid_t dst)
                 H5_WARNING();
             }
         }
-
- printing:
         printf("    elmt %u: \n", (unsigned)j);
 
         printf("        src = ");
@@ -4350,7 +4394,7 @@ test_conv_int_fp(const char *name, int run_test, hid_t src, hid_t dst)
                 break;
             case FLT_FLOAT:
                 HDmemcpy(aligned, saved+j*sizeof(float), sizeof(float));
-                printf(" %29f\n", *((float*)aligned));
+                printf(" %29f\n", (double)*((float*)aligned));
                 break;
             case FLT_DOUBLE:
                 HDmemcpy(aligned, saved+j*sizeof(double), sizeof(double));
@@ -4415,7 +4459,7 @@ test_conv_int_fp(const char *name, int run_test, hid_t src, hid_t dst)
                 break;
             case FLT_FLOAT:
                 HDmemcpy(aligned, buf+j*sizeof(float), sizeof(float));
-                printf(" %29f\n", *((float*)aligned));
+                printf(" %29f\n", (double)*((float*)aligned));
                 break;
             case FLT_DOUBLE:
                 HDmemcpy(aligned, buf+j*sizeof(double), sizeof(double));
@@ -4469,7 +4513,7 @@ test_conv_int_fp(const char *name, int run_test, hid_t src, hid_t dst)
                 printf(" %29"H5_PRINTF_LL_WIDTH"u\n", *((unsigned long long*)hw));
                 break;
             case FLT_FLOAT:
-                printf(" %29f\n", *((float*)hw));
+                printf(" %29f\n", (double)*((float*)hw));
                 break;
             case FLT_DOUBLE:
                 printf(" %29f\n", *((double*)hw));
@@ -4506,6 +4550,9 @@ test_conv_int_fp(const char *name, int run_test, hid_t src, hid_t dst)
     if (saved) aligned_free(saved);
     if (aligned) HDfree(aligned);
     HDfflush(stdout);
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();	/*print statistics*/
 
     /* If the source is normalized floating values, treat the failures as error;
@@ -4520,6 +4567,10 @@ test_conv_int_fp(const char *name, int run_test, hid_t src, hid_t dst)
     if (saved) aligned_free(saved);
     if (aligned) HDfree(aligned);
     HDfflush(stdout);
+
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();	/*print statistics*/
 
     if(run_test==TEST_NORMAL)
@@ -5003,15 +5054,15 @@ run_fp_int_conv(const char *name)
         nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_FLOAT, H5T_NATIVE_UINT);
         nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_DOUBLE, H5T_NATIVE_UINT);
 
-#if H5_SIZEOF_LONG != H5_SIZEOF_INT
+#if H5_SIZEOF_LONG!=H5_SIZEOF_INT
         nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_FLOAT, H5T_NATIVE_LONG);
         nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_DOUBLE, H5T_NATIVE_LONG);
 
         nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_FLOAT, H5T_NATIVE_ULONG);
         nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_DOUBLE, H5T_NATIVE_ULONG);
-#endif /* H5_SIZEOF_LONG != H5_SIZEOF_INT */
+#endif
 
-#if H5_SIZEOF_LONG_LONG != H5_SIZEOF_LONG
+#if H5_SIZEOF_LONG_LONG!=H5_SIZEOF_LONG
         if(!strcmp(name, "hw")) { /* Hardware conversion */
             nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_FLOAT, H5T_NATIVE_LLONG);
             nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_DOUBLE, H5T_NATIVE_LLONG);
@@ -5021,20 +5072,20 @@ run_fp_int_conv(const char *name)
         }
         nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_FLOAT, H5T_NATIVE_ULLONG);
         nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_DOUBLE, H5T_NATIVE_ULLONG);
-#endif /* H5_SIZEOF_LONG_LONG != H5_SIZEOF_LONG */
+#endif
 
-#if H5_SIZEOF_LONG_DOUBLE != H5_SIZEOF_DOUBLE
+#if H5_SIZEOF_LONG_DOUBLE!=H5_SIZEOF_DOUBLE
         nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_LDOUBLE, H5T_NATIVE_SCHAR);
         nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_LDOUBLE, H5T_NATIVE_UCHAR);
         nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_LDOUBLE, H5T_NATIVE_SHORT);
         nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_LDOUBLE, H5T_NATIVE_USHORT);
         nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_LDOUBLE, H5T_NATIVE_INT);
         nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_LDOUBLE, H5T_NATIVE_UINT);
-#if H5_SIZEOF_LONG != H5_SIZEOF_INT && H5_SIZEOF_LONG_DOUBLE != 0
+#if H5_SIZEOF_LONG!=H5_SIZEOF_INT && H5_SIZEOF_LONG_DOUBLE!=0
 #ifndef H5_LDOUBLE_TO_LONG_SPECIAL
         nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_LDOUBLE, H5T_NATIVE_LONG);
         nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_LDOUBLE, H5T_NATIVE_ULONG);
-#else /* H5_LDOUBLE_TO_LONG_SPECIAL */
+#else
         {
             char		str[256];		/*string		*/
 
@@ -5042,17 +5093,16 @@ run_fp_int_conv(const char *name)
                     name, "long double", "(unsigned) long");
             printf("%-70s", str);
             SKIPPED();
-#if H5_SIZEOF_LONG_DOUBLE != 0
+#if H5_SIZEOF_LONG_DOUBLE!=0
             HDputs("    Test skipped due to the special algorithm of hardware conversion.");
-#else /* H5_SIZEOF_LONG_DOUBLE */
+#else
             HDputs("    Test skipped due to disabled long double.");
-#endif /* H5_SIZEOF_LONG_DOUBLE */
+#endif
         }
-#endif /* H5_LDOUBLE_TO_LONG_SPECIAL */
-
-#endif /*H5_SIZEOF_LONG != H5_SIZEOF_INT && H5_SIZEOF_LONG_DOUBLE != 0 */
+#endif
+#endif /*H5_SIZEOF_LONG!=H5_SIZEOF_INT && H5_SIZEOF_LONG_DOUBLE!=0 */
 
-#if H5_SIZEOF_LONG_LONG != H5_SIZEOF_LONG && H5_SIZEOF_LONG_DOUBLE != 0
+#if H5_SIZEOF_LONG_LONG!=H5_SIZEOF_LONG && H5_SIZEOF_LONG_DOUBLE!=0
 #ifdef H5_LDOUBLE_TO_LLONG_ACCURATE
         nerrors += test_conv_int_fp(name, test_values, H5T_NATIVE_LDOUBLE, H5T_NATIVE_LLONG);
 #else /*H5_LDOUBLE_TO_LLONG_ACCURATE*/
@@ -5063,11 +5113,11 @@ run_fp_int_conv(const char *name)
                     name, "long double", "long long");
             printf("%-70s", str);
             SKIPPED();
-#if H5_SIZEOF_LONG_DOUBLE != 0
+#if H5_SIZEOF_LONG_DOUBLE!=0
             HDputs("    Test skipped due to hardware conversion error.");
-#else /* H5_SIZEOF_LONG_DOUBLE != 0 */
+#else
             HDputs("    Test skipped due to disabled long double.");
-#endif /* H5_SIZEOF_LONG_DOUBLE != 0 */
+#endif
         }
 #endif /*H5_LDOUBLE_TO_LLONG_ACCURATE*/
 #if defined(H5_LDOUBLE_TO_LLONG_ACCURATE)
@@ -5080,20 +5130,19 @@ run_fp_int_conv(const char *name)
                     name, "long double", "unsigned long long");
             printf("%-70s", str);
             SKIPPED();
-#if H5_SIZEOF_LONG_DOUBLE != 0
+#if H5_SIZEOF_LONG_DOUBLE!=0
             HDputs("    Test skipped due to hardware conversion error.");
-#else /* H5_SIZEOF_LONG_DOUBLE != 0 */
+#else
             HDputs("    Test skipped due to disabled long double.");
-#endif /* H5_SIZEOF_LONG_DOUBLE !=0 */
+#endif
         }
 #endif /*H5_LDOUBLE_TO_LLONG_ACCURATE*/
-
-#endif /* H5_SIZEOF_LONG_LONG != H5_SIZEOF_LONG && H5_SIZEOF_LONG_DOUBLE != 0 */
-#endif /* H5_SIZEOF_LONG_DOUBLE != H5_SIZEOF_DOUBLE */
+#endif
+#endif
     } /* end for */
 
     return nerrors;
-} /* end run_fp_int_conv() */
+}
 
 

 /*-------------------------------------------------------------------------
@@ -5168,6 +5217,10 @@ main(void)
      *----------------------------------------------------------------------
      */
     without_hardware_g = TRUE;
+
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
 
     /* Test software floating-point conversion functions */
@@ -5183,8 +5236,14 @@ main(void)
     /* Test software integer-float conversion functions */
     nerrors += run_int_fp_conv("soft");
 
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
 
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     if (nerrors) {
         printf("***** %lu FAILURE%s! *****\n",
                nerrors, 1==nerrors?"":"S");
diff --git a/test/dtransform.c b/test/dtransform.c
index 4adbaf5..2769771 100644
--- a/test/dtransform.c
+++ b/test/dtransform.c
@@ -467,7 +467,7 @@ test_poly(const hid_t dxpl_id_polynomial)
     for(row = 0; row < ROWS; row++)
         for(col = 0; col < COLS; col++) {
             windchillC = (int) ((5.0f / 9.0f) * (windchillFfloat[row][col] - 32));
-            polyflres[row][col] = (float) ((2.0f + windchillC) * ((windchillC - 8.0f) / 2.0f));
+            polyflres[row][col] = ((2.0f + (float)windchillC) * (((float)windchillC - 8.0f) / 2.0f));
         }
 
     TESTING("data transform, polynomial transform (int->float)")
diff --git a/test/dtypes.c b/test/dtypes.c
index 7c2ad7b..326294f 100644
--- a/test/dtypes.c
+++ b/test/dtypes.c
@@ -47,7 +47,7 @@
 
 /* Alignment test stuff */
 #ifdef TEST_ALIGNMENT
-#define H5T_PACKAGE
+#define H5T_FRIEND		/*suppress error about including H5Tpkg	  */
 #include "H5Tpkg.h"
 #endif
 #define SET_ALIGNMENT(TYPE,VAL) \
@@ -769,11 +769,20 @@ test_compound_2(void)
     CHECK_NMEMBS(nmembs , st, dt)
 
     PASSED();
+
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
+
     return 0;
 
- error:
+error:
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
+
     return 1;
 }
 
@@ -888,11 +897,19 @@ test_compound_3(void)
     CHECK_NMEMBS(nmembs, st, dt)
 
     PASSED();
+
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
     return 0;
 
- error:
+error:
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
+
     return 1;
 }
 
@@ -1015,11 +1032,19 @@ test_compound_4(void)
     CHECK_NMEMBS(nmembs, st, dt)
 
     PASSED();
+
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
     return 0;
 
- error:
+error:
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
+
     return 1;
 }
 
@@ -1226,11 +1251,19 @@ test_compound_6(void)
     CHECK_NMEMBS(nmembs, st, dt)
 
     PASSED();
+
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
     return 0;
 
- error:
+error:
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
+
     return 1;
 }
 
@@ -1365,11 +1398,19 @@ test_compound_7(void)
     } /* end if */
 
     PASSED();
+
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
     return 0;
 
- error:
+error:
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
+
     return 1;
 }
 
@@ -4229,6 +4270,10 @@ test_conv_str_1(void)
     HDfree(buf);
 
     PASSED();
+
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
     return 0;
 
@@ -4241,7 +4286,11 @@ error:
     if(buf)
         HDfree(buf);
 
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
+
     return 1;
 }
 
@@ -4304,7 +4353,11 @@ error:
     if(buf)
         HDfree(buf);
 
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
+
     return ret_value;
 }
 
@@ -4418,7 +4471,11 @@ error:
     if(tag)
         H5free_memory(tag); /* Technically allocated by API call */
 
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
+
     return ret_value;  /* Number of errors */
 }
 
@@ -4490,7 +4547,11 @@ error:
     if(buf)
         HDfree(buf);
 
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
+
     return ret_value;
 }
 
@@ -4657,13 +4718,22 @@ test_conv_bitfield(void)
     H5Tclose(st);
     H5Tclose(dt);
     PASSED();
+
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
     return 0;
 
- error:
+error:
     H5Tclose(st);
     H5Tclose(dt);
+
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
+
     return 1;
 }
 
@@ -4781,14 +4851,18 @@ test_bitfield_funcs(void)
 
     retval = 0;
 
- error:
-
+error:
     if (retval == -1) retval = 1;
     H5free_memory(tag);
     H5Tclose(ntype);
     H5Tclose(type);
     if (retval == 0) PASSED();
+
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     reset_hdf5();
+
     return retval;
 }
 
@@ -6532,135 +6606,6 @@ error:
     return 1;
 } /* end test_named_indirect_reopen() */
 
-/*-------------------------------------------------------------------------
- * Function:	test_named_indirect_reopen_file
- *
- * Purpose:	Tests that a named compound datatype that refers to a named
- *          string datatype can be reopened indirectly through H5Dget_type,
- *          and shows the correct H5Tcommitted() state, including after the
- *          file has been closed and reopened.
- *
- * Return:	Success:	0
- *
- *		Failure:	number of errors
- *
- * Programmer:	Mark Hodson
- *              Tuesday, March 17, 2015
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
-static int
-test_named_indirect_reopen_file(hid_t fapl)
-{
-    hid_t file=-1, space=-1, cmptype=-1, reopened_cmptype=-1, strtype=-1, reopened_strtype=-1, dset=-1;
-    static hsize_t dims[1] = {3};
-    size_t strtype_size, cmptype_size;
-    char filename[1024];
-
-    TESTING("indirectly reopening recursively committed datatypes including file reopening");
-
-    /* PREPARATION */
-
-    /* Create file, dataspace */
-    h5_fixname(FILENAME[1], fapl, filename, sizeof filename);
-    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
-    if((space = H5Screate_simple(1, dims, dims)) < 0) TEST_ERROR
-
-    /* Create string type */
-    if((strtype = H5Tcopy(H5T_C_S1)) < 0) TEST_ERROR
-    if(H5Tset_size(strtype, H5T_VARIABLE) < 0) TEST_ERROR
-
-    /* Get size of string type */
-    if((strtype_size = H5Tget_size(strtype)) == 0) TEST_ERROR
-
-    /* Commit compound type and verify the size doesn't change */
-    if(H5Tcommit2(file, "str_type", strtype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
-    if(strtype_size != H5Tget_size(strtype)) TEST_ERROR
-
-    /* Create compound type */
-    if((cmptype = H5Tcreate(H5T_COMPOUND, sizeof(char *))) < 0) TEST_ERROR
-    if(H5Tinsert(cmptype, "vlstr", (size_t)0, strtype) < 0) TEST_ERROR
-
-    /* Get size of compound type */
-    if((cmptype_size = H5Tget_size(cmptype)) == 0) TEST_ERROR
-
-    /* Commit compound type and verify the size doesn't change */
-    if(H5Tcommit2(file, "cmp_type", cmptype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
-    if(cmptype_size != H5Tget_size(cmptype)) TEST_ERROR
-
-    /* Create dataset with compound type */
-    if((dset = H5Dcreate2(file, "cmp_dset", cmptype, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
-
-    /* Close original types */
-    if(H5Tclose(strtype) < 0) TEST_ERROR
-    if(H5Tclose(cmptype) < 0) TEST_ERROR
-
-    /* CHECK DATA TYPES WHILE STILL HOLDING THE FILE OPEN */
-
-    /* Indirectly reopen compound type, verify that they report as committed, and the size doesn't change */
-    if((reopened_cmptype = H5Dget_type(dset)) < 0) TEST_ERROR
-    if(cmptype_size != H5Tget_size(reopened_cmptype)) TEST_ERROR
-    if(H5Tcommitted(reopened_cmptype) != 1) TEST_ERROR
-
-    /* Indirectly reopen string type, verify that they report as committed, and the size doesn't change */
-    if((reopened_strtype = H5Tget_member_type(reopened_cmptype, 0)) < 0) TEST_ERROR
-    if(strtype_size != H5Tget_size(reopened_strtype)) TEST_ERROR
-    if(H5Tcommitted(reopened_strtype) != 1) TEST_ERROR 
-
-    /* Close types and dataset */
-    if(H5Tclose(reopened_strtype) < 0) TEST_ERROR
-    if(H5Tclose(reopened_cmptype) < 0) TEST_ERROR
-    if(H5Dclose(dset) < 0) TEST_ERROR
-
-    /* CHECK DATA TYPES AFTER REOPENING THE SAME FILE */
-
-    /* Close file */
-     if(H5Fclose(file) < 0) TEST_ERROR
-
-    /* Reopen file */
-    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) TEST_ERROR
-
-    /* Reopen dataset */
-    if((dset = H5Dopen2(file, "cmp_dset", H5P_DEFAULT)) < 0) TEST_ERROR
-
-    /* Indirectly reopen compound type, verify that they report as committed, and the size doesn't change */
-    if((reopened_cmptype = H5Dget_type(dset)) < 0) TEST_ERROR
-    if(cmptype_size != H5Tget_size(reopened_cmptype)) TEST_ERROR
-    if(H5Tcommitted(reopened_cmptype) != 1) TEST_ERROR
-
-    /* Indirectly reopen string type, verify that they report as committed, and the size doesn't change */
-    if((reopened_strtype = H5Tget_member_type(reopened_cmptype, 0)) < 0) TEST_ERROR
-    if(strtype_size != H5Tget_size(reopened_strtype)) TEST_ERROR
-    /*if(H5Tcommitted(reopened_strtype) != 1) TEST_ERROR */
-
-    /* Close types and dataset */
-    if(H5Tclose(reopened_strtype) < 0) TEST_ERROR
-    if(H5Tclose(reopened_cmptype) < 0) TEST_ERROR
-    if(H5Dclose(dset) < 0) TEST_ERROR
-
-    /* DONE */
-
-    /* Close file and dataspace */
-    if(H5Sclose(space) < 0) TEST_ERROR
-    if(H5Fclose(file) < 0) TEST_ERROR
-    PASSED();
-    return 0;
-
-error:
-    H5E_BEGIN_TRY {
-	H5Tclose(cmptype);
-	H5Tclose(strtype);
-	H5Tclose(reopened_cmptype);
-        H5Tclose(reopened_strtype);
-	H5Sclose(space);
-	H5Dclose(dset);
-	H5Fclose(file);
-    } H5E_END_TRY;
-    return 1;
-} /* end test_named_indirect_reopen() */
-
 static void create_del_obj_named_test_file(const char *filename, hid_t fapl,
     hbool_t new_format)
 {
@@ -6783,7 +6728,7 @@ test_delete_obj_named(hid_t fapl)
     hid_t attr = -1;            /* Attribute ID */
     hid_t dset = -1;            /* Dataset ID */
     hid_t fapl2 = -1;           /* File access property list ID */
-    hbool_t new_format;         /* Whether to use old or new format */
+    unsigned new_format;        /* Whether to use old or new format */
     char filename[1024], filename2[1024];
 
     TESTING("deleting objects that use named datatypes");
@@ -6878,7 +6823,7 @@ test_delete_obj_named_fileid(hid_t fapl)
     hid_t attr = -1;            /* Attribute ID */
     hid_t dset = -1;            /* Dataset ID */
     hid_t fapl2 = -1;           /* File access property list ID */
-    hbool_t new_format;         /* Whether to use old or new format */
+    unsigned new_format;        /* Whether to use old or new format */
     char filename[1024], filename2[1024];
 
     TESTING("deleting objects that use named datatypes");
@@ -7415,7 +7360,6 @@ main(void)
     nerrors += test_latest();
     nerrors += test_int_float_except();
     nerrors += test_named_indirect_reopen(fapl);
-    nerrors += test_named_indirect_reopen_file(fapl);
     nerrors += test_delete_obj_named(fapl);
     nerrors += test_delete_obj_named_fileid(fapl);
     nerrors += test_set_order_compound(fapl);
@@ -7423,8 +7367,10 @@ main(void)
 #ifndef H5_NO_DEPRECATED_SYMBOLS
     nerrors += test_deprec(fapl);
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
+
     h5_cleanup(FILENAME, fapl); /*must happen before first reset*/
     reset_hdf5();
+
     nerrors += test_conv_str_1();
     nerrors += test_conv_str_2();
     nerrors += test_conv_str_3();
@@ -7452,6 +7398,7 @@ main(void)
     nerrors += test_opaque();
     nerrors += test_set_order();
     nerrors += test_utf_ascii_conv();
+
     if(nerrors) {
         printf("***** %lu FAILURE%s! *****\n",
                nerrors, 1==nerrors?"":"S");
diff --git a/test/earray.c b/test/earray.c
new file mode 100644
index 0000000..1753104
--- /dev/null
+++ b/test/earray.c
@@ -0,0 +1,2902 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Programmer:  Quincey Koziol <koziol at hdfgroup.org>
+ *              Tuesday, June 17, 2008
+ */
+#include "h5test.h"
+
+/*
+ * This file needs to access private datatypes from the H5EA package.
+ * This file also needs to access the extensible array testing code.
+ */
+#define H5EA_FRIEND		/*suppress error about including H5EApkg	  */
+#define H5EA_TESTING
+#include "H5EApkg.h"		/* Extensible Arrays			*/
+
+/* Other private headers that this test requires */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+
+
+/* Local macros */
+
+/* Max. testfile name length */
+#define EARRAY_FILENAME_LEN     1024
+
+/* Extensible array creation values */
+#define ELMT_SIZE               sizeof(uint64_t)
+#define MAX_NELMTS_BITS         32                      /* i.e. 4 giga-elements */
+#define IDX_BLK_ELMTS           4
+#define SUP_BLK_MIN_DATA_PTRS   4
+#define DATA_BLK_MIN_ELMTS      16
+#define MAX_DBLOCK_PAGE_NELMTS_BITS     10              /* i.e. 1024 elements per data block page */
+
+/* Convenience macros for computing earray state */
+#define EA_HDR_SIZE             72                      /* (hard-coded, current size) */
+#define EA_IBLOCK_SIZE          298                     /* (hard-coded, current size) */
+#define EA_NELMTS(cparam, tparam, idx, sblk_idx)                \
+        (hsize_t)(cparam->idx_blk_elmts +                       \
+                tparam->sblk_info[sblk_idx].start_idx +         \
+                ((1 + ((idx - (cparam->idx_blk_elmts + tparam->sblk_info[sblk_idx].start_idx)) / tparam->sblk_info[sblk_idx].dblk_nelmts)) \
+                    * tparam->sblk_info[sblk_idx].dblk_nelmts))
+#define EA_NDATA_BLKS(cparam, tparam, idx, sblk_idx)            \
+        (1 + tparam->sblk_info[sblk_idx].start_dblk +           \
+                ((idx - (cparam->idx_blk_elmts + tparam->sblk_info[sblk_idx].start_idx)) / tparam->sblk_info[sblk_idx].dblk_nelmts))
+
+/* Iterator parameter values */
+#define EA_RND2_SCALE           100
+#define EA_CYC_COUNT            4
+
+/* Local typedefs */
+
+/* Types of tests to perform */
+typedef enum {
+    EARRAY_TEST_NORMAL,         /* "Normal" test, with no testing parameters set */
+    EARRAY_TEST_REOPEN,         /* Set the reopen_array flag */
+    EARRAY_TEST_NTESTS          /* The number of test types, must be last */
+} earray_test_type_t;
+
+/* Types of iteration to perform */
+typedef enum {
+    EARRAY_ITER_FW,             /* "Forward" iteration */
+    EARRAY_ITER_RV,             /* "Reverse" iteration */
+    EARRAY_ITER_RND,            /* "Random" iteration */
+    EARRAY_ITER_CYC,            /* "Cyclic" iteration */
+    EARRAY_ITER_RND2,           /* "Random #2" iteration */
+    EARRAY_ITER_NITERS          /* The number of iteration types, must be last */
+} earray_iter_type_t;
+
+/* Orders to operate on entries */
+typedef enum {
+    EARRAY_DIR_FORWARD,          /* Insert objects from 0 -> nobjs */
+    EARRAY_DIR_RANDOM,           /* Insert objects randomly from 0 - nobjs */
+    EARRAY_DIR_CYCLIC,           /* Insert every n'th object cyclicly: 0, n, 2n, 3n, ..., nobjs/n, 1+nobjs/n, 1+n+nobjs/n, 1+2n+nobjs/n, ..., nobjs */
+    EARRAY_DIR_REVERSE,          /* Insert objects from nobjs -> 0 */
+    EARRAY_DIR_INWARD,           /* Insert objects from outside to in: 0, nobjs, 1, nobjs-1, 2, nobjs-2, ..., nobjs/2 */
+    EARRAY_DIR_OUTWARD,          /* Insert objects from inside to out: nobjs/2, (nobjs/2)-1, (nobjs/2)+1, ..., 0, nobjs */
+    EARRAY_DIR_NDIRS             /* The number of different insertion orders, must be last */
+} earray_test_dir_t;
+
+/* Whether to compress data blocks */
+typedef enum {
+    EARRAY_TEST_NO_COMPRESS,    /* Don't compress data blocks */
+    EARRAY_TEST_COMPRESS,       /* Compress data blocks */
+    EARRAY_TEST_COMP_N          /* The number of different ways to test compressing array blocks, must be last */
+} earray_test_comp_t;
+
+/* Extensible array state information */
+typedef struct earray_state_t {
+    hsize_t hdr_size;           /* Size of header */
+    hsize_t nindex_blks;        /* # of index blocks */
+    hsize_t index_blk_size;     /* Size of index blocks */
+    hsize_t nsuper_blks;        /* # of super blocks */
+    hsize_t super_blk_size;     /* Size of super blocks */
+    hsize_t ndata_blks;         /* # of data blocks */
+    hsize_t data_blk_size;      /* Size of data blocks */
+    hsize_t max_idx_set;        /* Highest element index stored (+1 - i.e. if element 0 has been set, this value with be '1', if no elements have been stored, this value will be '0') */
+    hsize_t nelmts;             /* # of elements "realized" */
+} earray_state_t;
+
+/* Forward decl. */
+typedef struct earray_test_param_t earray_test_param_t;
+
+/* Extensible array iterator class */
+typedef struct earray_iter_t {
+    void *(*init)(const H5EA_create_t *cparam, const earray_test_param_t *tparam,
+        hsize_t cnt);           /* Initialize/allocate iterator private info */
+    hssize_t (*next)(void *info);       /* Get the next element to test */
+    hssize_t (*max_elem)(const void *info);  /* Get the max. element set */
+    int (*state)(void *_eiter, const H5EA_create_t *cparam,
+            const earray_test_param_t *tparam, earray_state_t *state, hsize_t idx);  /* Get the state of the extensible array */
+    herr_t (*term)(void *info); /* Shutdown/free iterator private info */
+} earray_iter_t;
+
+/* Testing parameters */
+struct earray_test_param_t {
+    earray_test_type_t reopen_array;    /* Whether to re-open the array during the test */
+    earray_test_comp_t comp;            /* Whether to compress the blocks or not */
+    const earray_iter_t *eiter;         /* Iterator to use for this test */
+
+    /* Super block information */
+    size_t nsblks;                      /* Number of superblocks needed for array */
+    H5EA_sblk_info_t *sblk_info;        /* Array of information for each super block */
+};
+
+/* Flush depend test context */
+typedef struct earray_flush_depend_ctx_t {
+    hbool_t base_obj;                   /* Flag to indicate that base object has been flushed */
+    hbool_t idx0_obj;                   /* Flag to indicate that index 0's object has been flushed */
+    hbool_t idx0_elem;                  /* Flag to indicate that index 0's element has been flushed */
+    hbool_t idx1_obj;                   /* Flag to indicate that index 1's object has been flushed */
+    hbool_t idx1_elem;                  /* Flag to indicate that index 1's element has been flushed */
+    hbool_t idx10000_obj;               /* Flag to indicate that index 10000's object has been flushed */
+    hbool_t idx10000_elem;              /* Flag to indicate that index 10000's element has been flushed */
+} earray_flush_depend_ctx_t;
+
+/* Extensible array test cache object */
+typedef struct earray_test_t {
+    /* Information for H5AC cache functions, _must_ be first field in structure */
+    H5AC_info_t cache_info;
+
+    /* Entry information */
+    uint64_t idx;                       /* Index that entry corresponds to */
+    earray_flush_depend_ctx_t *fd_info; /* Context information for flush depend test */
+} earray_test_t;
+
+
+/* Local prototypes */
+
+/* Metadata cache (H5AC) callbacks */
+
+static herr_t earray_cache_test_get_load_size(const void *udata_ptr,
+                                              size_t *image_len_ptr);
+
+static void *earray_cache_test_deserialize(const void *image_ptr,
+                                           size_t len,
+                                           void *udata_ptr,
+                                           hbool_t *dirty_ptr);
+
+static herr_t earray_cache_test_image_len(const void *thing,
+                                          size_t *image_len_ptr,
+                                          hbool_t *compressed_ptr,
+                                          size_t * compressed_len_ptr);
+
+static herr_t earray_cache_test_serialize(const H5F_t *f,
+                                          void *image_ptr,
+                                          size_t len,
+                                          void *thing);
+
+static herr_t earray_cache_test_free_icr(void *thing);
+
+
+/* Local variables */
+const char *FILENAME[] = {
+    "earray",
+    "earray_tmp",
+    NULL
+};
+
+/* Filename to use for all tests */
+char filename_g[EARRAY_FILENAME_LEN];
+
+/* Empty file size */
+h5_stat_size_t empty_size_g;
+
+/* H5EA test object inherits cache-like properties from H5AC */
+const H5AC_class_t H5AC_EARRAY_TEST[1] = {{
+    /* id            */ H5AC_TEST_ID,
+    /* name          */ "earray test",
+    /* mem_type      */ H5FD_MEM_DEFAULT,
+    /* flags         */ H5AC__CLASS_NO_IO_FLAG,
+    /* get_load_size */ (H5AC_get_load_size_func_t)earray_cache_test_get_load_size,
+    /* varify_chksum */ (H5AC_verify_chksum_func_t)NULL,
+    /* deserialize   */ (H5AC_deserialize_func_t)earray_cache_test_deserialize,
+    /* image_len     */ (H5AC_image_len_func_t)earray_cache_test_image_len,
+    /* pre_serialize */ (H5AC_pre_serialize_func_t)NULL,
+    /* serialize     */ (H5AC_serialize_func_t)earray_cache_test_serialize,
+    /* notify        */ (H5AC_notify_func_t)NULL,
+    /* free_icr      */ (H5AC_free_icr_func_t)earray_cache_test_free_icr,
+    /* clear         */ NULL,
+    /* fsf_size      */ NULL,
+}};
+
+

+/*-------------------------------------------------------------------------
+ * Function:	init_cparam
+ *
+ * Purpose:	Initialize array creation parameter structure
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August 21, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+init_cparam(H5EA_create_t *cparam)
+{
+    /* Wipe out background */
+    HDmemset(cparam, 0, sizeof(*cparam));
+
+    /* General parameters */
+    cparam->cls = H5EA_CLS_TEST;
+    cparam->raw_elmt_size = ELMT_SIZE;
+    cparam->max_nelmts_bits = MAX_NELMTS_BITS;
+    cparam->idx_blk_elmts = IDX_BLK_ELMTS;
+    cparam->sup_blk_min_data_ptrs = SUP_BLK_MIN_DATA_PTRS;
+    cparam->data_blk_min_elmts = DATA_BLK_MIN_ELMTS;
+    cparam->max_dblk_page_nelmts_bits = MAX_DBLOCK_PAGE_NELMTS_BITS;
+
+    return(0);
+} /* init_cparam() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	init_tparam
+ *
+ * Purpose:	Initialize array testing parameter structure
+ *
+ * Note:	This initialization is the same as that in H5EA_hdr_init()
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, September 25, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+init_tparam(earray_test_param_t *tparam, const H5EA_create_t *cparam)
+{
+    hsize_t start_idx;          /* First element index for each super block */
+    hsize_t start_dblk;         /* First data block index for each super block */
+    size_t u;                   /* Local index variable */
+
+    /* Wipe out background */
+    HDmemset(tparam, 0, sizeof(*tparam));
+
+    /* Compute general information */
+    tparam->nsblks = 1 + (cparam->max_nelmts_bits - H5VM_log2_of2(cparam->data_blk_min_elmts));
+
+    /* Allocate information for each super block */
+    tparam->sblk_info = (H5EA_sblk_info_t *)HDmalloc(sizeof(H5EA_sblk_info_t) * tparam->nsblks);
+    HDassert(tparam->sblk_info);
+
+    /* Compute information about each super block */
+    start_idx = 0;
+    start_dblk = 0;
+    for(u = 0; u < tparam->nsblks; u++) {
+        tparam->sblk_info[u].ndblks = (size_t)H5_EXP2(u / 2);
+        tparam->sblk_info[u].dblk_nelmts = (size_t)H5_EXP2((u + 1) / 2) * cparam->data_blk_min_elmts;
+        tparam->sblk_info[u].start_idx = start_idx;
+        tparam->sblk_info[u].start_dblk = start_dblk;
+
+        /* Advance starting indices for next super block */
+        start_idx += (hsize_t)tparam->sblk_info[u].ndblks * (hsize_t)tparam->sblk_info[u].dblk_nelmts;
+        start_dblk += (hsize_t)tparam->sblk_info[u].ndblks;
+    } /* end for */
+
+    return(0);
+} /* init_tparam() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	finish_tparam
+ *
+ * Purpose:	Close down array testing parameter structure
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, September 25, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+finish_tparam(earray_test_param_t *tparam)
+{
+    /* Release super block information */
+    HDfree(tparam->sblk_info);
+    tparam->sblk_info = NULL;
+
+    return(0);
+} /* finish_tparam() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	create_file
+ *
+ * Purpose:	Create file and retrieve pointer to internal file object
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August 28, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+create_file(unsigned flags, hid_t fapl, hid_t *file, H5F_t **f)
+{
+    /* Create the file to work on */
+    if((*file = H5Fcreate(filename_g, flags, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (*f = (H5F_t *)H5I_object(*file)))
+        FAIL_STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if(H5AC_ignore_tags(*f) < 0)
+        FAIL_STACK_ERROR
+
+    /* Success */
+    return(0);
+
+error:
+    return(-1);
+} /* create_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	check_stats
+ *
+ * Purpose:	Verify stats for an extensible array
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August 21, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+check_stats(const H5EA_t *ea, const earray_state_t *state)
+{
+    H5EA_stat_t earray_stats;           /* Statistics about the array */
+
+    /* Get statistics for extensible array and verify they are correct */
+    if(H5EA_get_stats(ea, &earray_stats) < 0)
+        FAIL_STACK_ERROR
+
+    /* Compare information */
+    if(earray_stats.stored.max_idx_set != state->max_idx_set) {
+        HDfprintf(stdout, "earray_stats.stored.max_idx_set = %Hu, state->max_idx_set = %Hu\n", earray_stats.stored.max_idx_set, state->max_idx_set);
+        TEST_ERROR
+    } /* end if */
+    if(earray_stats.stored.nelmts != state->nelmts) {
+        HDfprintf(stdout, "earray_stats.stored.nelmts = %Hu, state->nelmts = %Hu\n", earray_stats.stored.nelmts, state->nelmts);
+        TEST_ERROR
+    } /* end if */
+    if(earray_stats.computed.hdr_size != state->hdr_size) {
+        HDfprintf(stdout, "earray_stats.computed.hdr_size = %Hu, state->hdr_size = %Hu\n", earray_stats.computed.hdr_size, state->hdr_size);
+        TEST_ERROR
+    } /* end if */
+    if(earray_stats.computed.nindex_blks != state->nindex_blks) {
+        HDfprintf(stdout, "earray_stats.computed.nindex_blks = %Hu, state->nindex_blks = %Hu\n", earray_stats.computed.nindex_blks, state->nindex_blks);
+        TEST_ERROR
+    } /* end if */
+    if(earray_stats.computed.index_blk_size != state->index_blk_size) {
+        HDfprintf(stdout, "earray_stats.computed.index_blk_size = %Hu, state->index_blk_size = %Hu\n", earray_stats.computed.index_blk_size, state->index_blk_size);
+        TEST_ERROR
+    } /* end if */
+    if(earray_stats.stored.ndata_blks != state->ndata_blks) {
+        HDfprintf(stdout, "earray_stats.stored.ndata_blks = %Hu, state->ndata_blks = %Hu\n", earray_stats.stored.ndata_blks, state->ndata_blks);
+        TEST_ERROR
+    } /* end if */
+/* Don't compare this currently, it's very hard to compute */
+#ifdef NOT_YET
+    if(earray_stats.stored.data_blk_size != state->data_blk_size) {
+        HDfprintf(stdout, "earray_stats.stored.data_blk_size = %Hu, state->data_blk_size = %Hu\n", earray_stats.stored.data_blk_size, state->data_blk_size);
+        TEST_ERROR
+    } /* end if */
+#endif /* NOT_YET */
+    if(earray_stats.stored.nsuper_blks != state->nsuper_blks) {
+        HDfprintf(stdout, "earray_stats.stored.nsuper_blks = %Hu, state->nsuper_blks = %Hu\n", earray_stats.stored.nsuper_blks, state->nsuper_blks);
+        TEST_ERROR
+    } /* end if */
+/* Don't compare this currently, it's very hard to compute */
+#ifdef NOT_YET
+    if(earray_stats.stored.super_blk_size != state->super_blk_size) {
+        HDfprintf(stdout, "earray_stats.stored.super_blk_size = %Hu, state->super_blk_size = %Hu\n", earray_stats.stored.super_blk_size, state->super_blk_size);
+        TEST_ERROR
+    } /* end if */
+#endif /* NOT_YET */
+#ifdef QAK
+HDfprintf(stderr, "nelmts = %Hu, total EA size = %Hu\n", earray_stats.stored.nelmts,
+        (earray_stats.computed.hdr_size + earray_stats.computed.index_blk_size + earray_stats.stored.super_blk_size + earray_stats.stored.data_blk_size));
+#endif /* QAK */
+
+    /* All tests passed */
+    return(0);
+
+error:
+    return(-1);
+} /* check_stats() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	reopen_file
+ *
+ * Purpose:	Perform common "re-open" operations on file & array for testing
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August 28, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+reopen_file(hid_t *file, H5F_t **f, hid_t fapl, hid_t dxpl,
+    H5EA_t **ea, haddr_t ea_addr, const earray_test_param_t *tparam)
+{
+    /* Check for closing & re-opening the array */
+    /* (actually will close & re-open the file as well) */
+    if(tparam->reopen_array) {
+        /* Close array, if given */
+        if(ea && *ea) {
+            if(H5EA_close(*ea, dxpl) < 0)
+                FAIL_STACK_ERROR
+            *ea = NULL;
+        } /* end if */
+
+        /* Close file */
+        if(*file) {
+            if(H5Fclose(*file) < 0)
+                FAIL_STACK_ERROR
+            *file = (-1);
+            *f = NULL;
+        } /* end if */
+
+        /* Re-open the file */
+        if((*file = H5Fopen(filename_g, H5F_ACC_RDWR, fapl)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Get a pointer to the internal file object */
+        if(NULL == (*f = (H5F_t *)H5I_object(*file)))
+            FAIL_STACK_ERROR
+
+        /* Ignore metadata tags in the file's cache */
+        if(H5AC_ignore_tags(*f) < 0)
+            FAIL_STACK_ERROR
+
+        /* Re-open array, if given */
+        if(ea)
+            if(NULL == (*ea = H5EA_open(*f, dxpl, ea_addr, NULL)))
+                FAIL_STACK_ERROR
+    } /* end if */
+
+    /* Success */
+    return(0);
+
+error:
+    return(-1);
+} /* reopen_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	create_array
+ *
+ * Purpose:	Create an extensible array and perform initial checks
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August 28, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+create_array(H5F_t *f, hid_t dxpl, const H5EA_create_t *cparam,
+    H5EA_t **ea, haddr_t *ea_addr, H5EA__ctx_cb_t *cb)
+{
+    hsize_t     nelmts;                 /* Number of elements in array */
+    earray_state_t state;               /* State of extensible array */
+
+    /* Create array */
+    if(NULL == (*ea = H5EA_create(f, dxpl, cparam, cb)))
+        FAIL_STACK_ERROR
+
+    /* Check status of array */
+    nelmts = (hsize_t)ULLONG_MAX;
+    if(H5EA_get_nelmts(*ea, &nelmts) < 0)
+        FAIL_STACK_ERROR
+    if(nelmts > 0)
+        TEST_ERROR
+    if(H5EA_get_addr(*ea, ea_addr) < 0)
+        FAIL_STACK_ERROR
+    if(!H5F_addr_defined(*ea_addr))
+        TEST_ERROR
+    HDmemset(&state, 0, sizeof(state));
+    state.hdr_size = EA_HDR_SIZE;
+    if(check_stats(*ea, &state))
+        TEST_ERROR
+
+    /* Success */
+    return(0);
+
+error:
+    return(-1);
+} /* create_array() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	verify_cparam
+ *
+ * Purpose:	Verify creation parameters are correct
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August 28, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+verify_cparam(const H5EA_t *ea, const H5EA_create_t *cparam)
+{
+    H5EA_create_t test_cparam;          /* Creation parameters for array */
+
+    /* Retrieve creation parameters */
+    HDmemset(&test_cparam, 0, sizeof(H5EA_create_t));
+    if(H5EA_get_cparam_test(ea, &test_cparam) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify creation parameters */
+    if(H5EA_cmp_cparam_test(cparam, &test_cparam))
+        TEST_ERROR
+
+    /* Success */
+    return(0);
+
+error:
+    return(-1);
+} /* verify_cparam() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	finish
+ *
+ * Purpose:	Close array, delete array, close file and verify that file
+ *              is empty size
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August 28, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+finish(hid_t file, hid_t fapl, H5F_t *f, H5EA_t *ea, haddr_t ea_addr)
+{
+    h5_stat_size_t file_size;           /* File size, after deleting array */
+
+    /* Close the extensible array */
+    if(H5EA_close(ea, H5P_DATASET_XFER_DEFAULT) < 0)
+        FAIL_STACK_ERROR
+
+#ifdef QAK
+HDfprintf(stderr, "ea_addr = %a\n", ea_addr);
+H5Fflush(file, H5F_SCOPE_GLOBAL);
+HDsystem("cp earray.h5 earray.h5.save");
+#endif /* QAK */
+
+    /* Delete array */
+    if(H5EA_delete(f, H5P_DATASET_XFER_DEFAULT, ea_addr, NULL) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+
+    /* Get the size of the file */
+    if((file_size = h5_get_file_size(filename_g, fapl)) < 0)
+        TEST_ERROR
+
+    /* Verify the file is correct size */
+    if(file_size != empty_size_g)
+        TEST_ERROR
+
+    /* Success */
+    return(0);
+
+error:
+    return(-1);
+} /* finish() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    earray_cache_test_get_load_size()
+ *
+ * Purpose: place holder function -- should never be called
+ *
+ *
+ *      A generic discussion of metadata cache callbacks of this type
+ *      may be found in H5Cprivate.h:
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              8/2/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+earray_cache_test_get_load_size(const void *udata_ptr, size_t *image_len_ptr)
+{
+    HDassert(udata_ptr);
+    HDassert(image_len_ptr);
+
+    /* Should never be called */
+    HDassert(0 && "Can't be called!");
+
+    *image_len_ptr = 0;
+
+    return(SUCCEED);
+
+} /* end earray_cache_test_get_load_size() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    earray_cache_test_deserialize
+ *
+ * Purpose: place holder function -- should never be called.
+ *
+ *
+ *      A generic discussion of metadata cache callbacks of this type
+ *      may be found in H5Cprivate.h:
+ *
+ * Return:      Success:        Pointer to in core representation
+ *              Failure:        NULL
+ *
+ * Programmer:  John Mainzer
+ *              8/2/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+earray_cache_test_deserialize(const void *image_ptr,
+                              size_t len,
+                              void *udata_ptr,
+                              hbool_t *dirty_ptr)
+{
+    HDassert(image_ptr);
+    HDassert(len > 0 );
+    HDassert(udata_ptr);
+    HDassert(dirty_ptr);
+
+
+    /* Should never be called */
+    HDassert(0 && "Can't be called!");
+
+    return(NULL);
+
+} /* end earray_cache_test_deserialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    earray_cache_test_image_len
+ *
+ * Purpose: test code place holder function -- just set *image_len_ptr to 
+ *	one.
+ *
+ *
+ *      A generic discussion of metadata cache callbacks of this type
+ *      may be found in H5Cprivate.h:
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              8/2/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+earray_cache_test_image_len(const void *thing, size_t *image_len_ptr,
+    hbool_t H5_ATTR_UNUSED * compressed_ptr, size_t H5_ATTR_UNUSED * compressed_len_ptr)
+{
+
+    HDassert(thing);
+    HDassert(image_len_ptr);
+
+    /* Set size value */
+    /* (hard-code to 1) */
+    *image_len_ptr = 1;
+
+    return(SUCCEED);
+
+} /* end earray_cache_test_image_len() */
+
+
+/********************************/
+/* no H5O_cache_pre_serialize() */
+/********************************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:    earray_cache_test_serialize
+ *
+ * Purpose: Validate the contents of the instance of earray_test_t.
+ *
+ *
+ *      A generic discussion of metadata cache callbacks of this type
+ *      may be found in H5Cprivate.h:
+ *
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              8/2/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+earray_cache_test_serialize(const H5F_t *f,
+                            void *image_ptr,
+                            H5_ATTR_UNUSED size_t len,
+                            void *thing)
+{
+    earray_test_t *test = NULL;
+
+    HDassert(f);
+    HDassert(image_ptr);
+    HDassert(thing);
+
+    test = (earray_test_t *)thing;
+
+    HDassert(test);
+    HDassert(test->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_MAGIC);
+    HDassert((const H5AC_class_t *)(test->cache_info.type) == 
+             &(H5AC_EARRAY_TEST[0]));
+
+    /* Check for out of order flush */
+    if(test->fd_info->base_obj)
+        TEST_ERROR
+
+    /* Check which index this entry corresponds to */
+    if((uint64_t)0 == test->idx) {
+        /* Check for out of order flush */
+        if(test->fd_info->idx0_obj || test->fd_info->idx0_elem)
+            TEST_ERROR
+
+        /* Set flag for object flush */
+        test->fd_info->idx0_obj = TRUE;
+    } /* end if */
+    else if((uint64_t)1 == test->idx) {
+        /* Check for out of order flush */
+        if(test->fd_info->idx1_obj || test->fd_info->idx1_elem)
+            TEST_ERROR
+
+        /* Set flag for object flush */
+        test->fd_info->idx1_obj = TRUE;
+    } /* end if */
+    else if((uint64_t)10000 == test->idx) {
+        /* Check for out of order flush */
+        if(test->fd_info->idx10000_obj || test->fd_info->idx10000_elem)
+            TEST_ERROR
+
+        /* Set flag for object flush */
+        test->fd_info->idx10000_obj = TRUE;
+    } /* end if */
+    else if((uint64_t)-1 == test->idx) {
+        /* Set flag for object flush */
+        test->fd_info->base_obj = TRUE;
+    } /* end if */
+
+    return(SUCCEED);
+
+error:
+
+    return(FAIL);
+
+} /* end earray_cache_test_serialize() */
+
+
+/******************************************/
+/* no earray_cache_test_notify() function */
+/******************************************/
+
+

+/*-------------------------------------------------------------------------
+ * Function:    earray_cache_test_free_icr
+ *
+ * Purpose: Destroy an extensible array test object in memory.
+ *
+ *
+ *      A generic discussion of metadata cache callbacks of this type
+ *      may be found in H5Cprivate.h:
+ *
+ *
+ * Return:      Success:        SUCCEED
+ *              Failure:        FAIL
+ *
+ * Programmer:  John Mainzer
+ *              8/2/14
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+earray_cache_test_free_icr(void *thing)
+{
+    earray_test_t *test = NULL;
+
+    HDassert(thing);
+
+    test = (earray_test_t *)thing;
+
+    HDassert(test);
+
+    /* the metadata cache sets cache_info.magic to
+     * H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC before calling the
+     * free_icr routine.  Hence the following assert:
+     */
+
+    HDassert(test->cache_info.magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC);
+    HDassert((const H5AC_class_t *)(test->cache_info.type) == 
+             &(H5AC_EARRAY_TEST[0]));
+
+    /* Free the shared info itself */
+    HDfree(test);
+
+    return(SUCCEED);
+
+} /* end earray_cache_test_free_icr() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	test_create
+ *
+ * Purpose:	Test creating extensible array
+ *
+ * Return:	Success: 0
+ *		Failure: 1
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August  7, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_create(hid_t fapl, H5EA_create_t *cparam, earray_test_param_t H5_ATTR_UNUSED *tparam)
+{
+    hid_t	file = -1;              /* File ID */
+    H5F_t	*f = NULL;              /* Internal file object pointer */
+    H5EA_t      *ea = NULL;             /* Extensible array wrapper */
+    haddr_t     ea_addr = HADDR_UNDEF;  /* Array address in file */
+
+    /* Create file & retrieve pointer to internal file object */
+    if(create_file(H5F_ACC_TRUNC, fapl, &file, &f) < 0)
+        TEST_ERROR
+
+    /*
+     * Display testing message
+     */
+    TESTING("invalid extensible array creation parameters");
+
+#ifndef NDEBUG
+{
+    H5EA_create_t test_cparam;          /* Creation parameters for array */
+
+    /* Set invalid element size */
+    HDmemcpy(&test_cparam, cparam, sizeof(test_cparam));
+    test_cparam.raw_elmt_size = 0;
+    H5E_BEGIN_TRY {
+        ea = H5EA_create(f, H5P_DATASET_XFER_DEFAULT, &test_cparam, NULL);
+    } H5E_END_TRY;
+    if(ea) {
+        /* Close opened extensible array */
+        H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
+        ea = NULL;
+
+        /* Indicate error */
+        TEST_ERROR
+    } /* end if */
+
+    /* Set invalid max. # of elements bits */
+    HDmemcpy(&test_cparam, cparam, sizeof(test_cparam));
+    test_cparam.max_nelmts_bits = 0;
+    H5E_BEGIN_TRY {
+        ea = H5EA_create(f, H5P_DATASET_XFER_DEFAULT, &test_cparam, NULL);
+    } H5E_END_TRY;
+    if(ea) {
+        /* Close opened extensible array */
+        H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
+        ea = NULL;
+
+        /* Indicate error */
+        TEST_ERROR
+    } /* end if */
+
+    HDmemcpy(&test_cparam, cparam, sizeof(test_cparam));
+    test_cparam.max_nelmts_bits = 65;
+    H5E_BEGIN_TRY {
+        ea = H5EA_create(f, H5P_DATASET_XFER_DEFAULT, &test_cparam, NULL);
+    } H5E_END_TRY;
+    if(ea) {
+        /* Close opened extensible array */
+        H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
+        ea = NULL;
+
+        /* Indicate error */
+        TEST_ERROR
+    } /* end if */
+
+    /* Set invalid min. # of data block pointers in super blocks */
+    HDmemcpy(&test_cparam, cparam, sizeof(test_cparam));
+    test_cparam.sup_blk_min_data_ptrs = 0;
+    H5E_BEGIN_TRY {
+        ea = H5EA_create(f, H5P_DATASET_XFER_DEFAULT, &test_cparam, NULL);
+    } H5E_END_TRY;
+    if(ea) {
+        /* Close opened extensible array */
+        H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
+        ea = NULL;
+
+        /* Indicate error */
+        TEST_ERROR
+    } /* end if */
+    HDmemcpy(&test_cparam, cparam, sizeof(test_cparam));
+    test_cparam.sup_blk_min_data_ptrs = 1;
+    H5E_BEGIN_TRY {
+        ea = H5EA_create(f, H5P_DATASET_XFER_DEFAULT, &test_cparam, NULL);
+    } H5E_END_TRY;
+    if(ea) {
+        /* Close opened extensible array */
+        H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
+        ea = NULL;
+
+        /* Indicate error */
+        TEST_ERROR
+    } /* end if */
+    HDmemcpy(&test_cparam, cparam, sizeof(test_cparam));
+    test_cparam.sup_blk_min_data_ptrs = 6;
+    H5E_BEGIN_TRY {
+        ea = H5EA_create(f, H5P_DATASET_XFER_DEFAULT, &test_cparam, NULL);
+    } H5E_END_TRY;
+    if(ea) {
+        /* Close opened extensible array */
+        H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
+        ea = NULL;
+
+        /* Indicate error */
+        TEST_ERROR
+    } /* end if */
+
+    /* Set invalid min. # of elements per data block */
+    HDmemcpy(&test_cparam, cparam, sizeof(test_cparam));
+    test_cparam.data_blk_min_elmts = 0;
+    H5E_BEGIN_TRY {
+        ea = H5EA_create(f, H5P_DATASET_XFER_DEFAULT, &test_cparam, NULL);
+    } H5E_END_TRY;
+    if(ea) {
+        /* Close opened extensible array */
+        H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
+        ea = NULL;
+
+        /* Indicate error */
+        TEST_ERROR
+    } /* end if */
+
+    /* Set invalid max. # of elements per data block page bits */
+    if(test_cparam.idx_blk_elmts > 0) {
+        HDmemcpy(&test_cparam, cparam, sizeof(test_cparam));
+        test_cparam.max_dblk_page_nelmts_bits = (uint8_t)(H5VM_log2_gen((uint64_t)test_cparam.idx_blk_elmts) - 1);
+        H5E_BEGIN_TRY {
+            ea = H5EA_create(f, H5P_DATASET_XFER_DEFAULT, &test_cparam, NULL);
+        } H5E_END_TRY;
+        if(ea) {
+            /* Close opened extensible array */
+            H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
+            ea = NULL;
+
+            /* Indicate error */
+            TEST_ERROR
+        } /* end if */
+    } /* end if */
+    HDmemcpy(&test_cparam, cparam, sizeof(test_cparam));
+    test_cparam.max_dblk_page_nelmts_bits = 4;  /* corresponds to 16 elements in data block page, which is less than the 64 elements for the default settings */
+    H5E_BEGIN_TRY {
+        ea = H5EA_create(f, H5P_DATASET_XFER_DEFAULT, &test_cparam, NULL);
+    } H5E_END_TRY;
+    if(ea) {
+        /* Close opened extensible array */
+        H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
+        ea = NULL;
+
+        /* Indicate error */
+        TEST_ERROR
+    } /* end if */
+    HDmemcpy(&test_cparam, cparam, sizeof(test_cparam));
+    test_cparam.max_dblk_page_nelmts_bits = (uint8_t)(test_cparam.max_nelmts_bits + 1);
+    H5E_BEGIN_TRY {
+        ea = H5EA_create(f, H5P_DATASET_XFER_DEFAULT, &test_cparam, NULL);
+    } H5E_END_TRY;
+    if(ea) {
+        /* Close opened extensible array */
+        H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
+        ea = NULL;
+
+        /* Indicate error */
+        TEST_ERROR
+    } /* end if */
+
+    PASSED()
+}
+#else /* NDEBUG */
+    SKIPPED();
+    puts("    Not tested when assertions are disabled");
+#endif /* NDEBUG */
+
+    /*
+     * Display testing message
+     */
+    TESTING("extensible array creation");
+
+    /* Create array */
+    if(create_array(f, H5P_DATASET_XFER_DEFAULT, cparam, &ea, &ea_addr, NULL) < 0)
+        TEST_ERROR
+
+    PASSED()
+
+    /* Verify the creation parameters */
+    TESTING("verify array creation parameters");
+
+    /* Verify the creation parameters */
+    if(verify_cparam(ea, cparam) < 0)
+        TEST_ERROR
+
+    /* Close array, delete array, close file & verify file is empty */
+    if(finish(file, fapl, f, ea, ea_addr) < 0)
+        TEST_ERROR
+
+    /* All tests passed */
+    PASSED()
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        if(ea)
+            H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
+	H5Fclose(file);
+    } H5E_END_TRY;
+
+    return 1;
+} /* end test_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	test_reopen
+ *
+ * Purpose:	Create & reopen an extensible array
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August 28, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_reopen(hid_t fapl, H5EA_create_t *cparam, earray_test_param_t *tparam)
+{
+    hid_t	file = -1;              /* File ID */
+    H5F_t	*f = NULL;              /* Internal file object pointer */
+    H5EA_t      *ea = NULL;             /* Extensible array wrapper */
+    haddr_t     ea_addr = HADDR_UNDEF;  /* Array address in file */
+
+    /* Create file & retrieve pointer to internal file object */
+    if(create_file(H5F_ACC_TRUNC, fapl, &file, &f) < 0)
+        TEST_ERROR
+
+    /*
+     * Display testing message
+     */
+    TESTING("create, close & reopen extensible array");
+
+    /* Create array */
+    if(create_array(f, H5P_DATASET_XFER_DEFAULT, cparam, &ea, &ea_addr, NULL) < 0)
+        TEST_ERROR
+
+    /* Close the extensible array */
+    if(H5EA_close(ea, H5P_DATASET_XFER_DEFAULT) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check for closing & re-opening the file */
+    if(reopen_file(&file, &f, fapl, H5P_DATASET_XFER_DEFAULT, NULL, HADDR_UNDEF, tparam) < 0)
+        TEST_ERROR
+
+    /* Re-open the array */
+    if(NULL == (ea = H5EA_open(f, H5P_DATASET_XFER_DEFAULT, ea_addr, NULL)))
+        FAIL_STACK_ERROR
+
+    /* Verify the creation parameters */
+    if(verify_cparam(ea, cparam) < 0)
+        TEST_ERROR
+
+    /* Close array, delete array, close file & verify file is empty */
+    if(finish(file, fapl, f, ea, ea_addr) < 0)
+        TEST_ERROR
+
+    /* All tests passed */
+    PASSED()
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        if(ea)
+            H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
+	H5Fclose(file);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_reopen() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	test_open_twice
+ *
+ * Purpose:	Open an extensible array twice
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August 28, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_open_twice(hid_t fapl, H5EA_create_t *cparam, earray_test_param_t *tparam)
+{
+    hid_t	file = -1;              /* File ID */
+    hid_t	file2 = -1;             /* File ID */
+    H5F_t	*f = NULL;              /* Internal file object pointer */
+    H5F_t	*f2 = NULL;             /* Internal file object pointer */
+    H5EA_t      *ea = NULL;             /* Extensible array wrapper */
+    H5EA_t      *ea2 = NULL;            /* Extensible array wrapper */
+    haddr_t     ea_addr = HADDR_UNDEF;  /* Array address in file */
+
+    /* Create file & retrieve pointer to internal file object */
+    if(create_file(H5F_ACC_TRUNC, fapl, &file, &f) < 0)
+        TEST_ERROR
+
+    /*
+     * Display testing message
+     */
+    TESTING("open extensible array twice");
+
+    /* Create array */
+    if(create_array(f, H5P_DATASET_XFER_DEFAULT, cparam, &ea, &ea_addr, NULL) < 0)
+        TEST_ERROR
+
+    /* Open the array again, through the first file handle */
+    if(NULL == (ea2 = H5EA_open(f, H5P_DATASET_XFER_DEFAULT, ea_addr, NULL)))
+        FAIL_STACK_ERROR
+
+    /* Verify the creation parameters */
+    if(verify_cparam(ea, cparam) < 0)
+        TEST_ERROR
+    if(verify_cparam(ea2, cparam) < 0)
+        TEST_ERROR
+
+    /* Close the second extensible array wrapper */
+    if(H5EA_close(ea2, H5P_DATASET_XFER_DEFAULT) < 0)
+        FAIL_STACK_ERROR
+    ea2 = NULL;
+
+    /* Check for closing & re-opening the file */
+    if(reopen_file(&file, &f, fapl, H5P_DATASET_XFER_DEFAULT, &ea, ea_addr, tparam) < 0)
+        TEST_ERROR
+
+    /* Re-open the file */
+    if((file2 = H5Freopen(file)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f2 = (H5F_t *)H5I_object(file2)))
+        FAIL_STACK_ERROR
+
+    /* Open the extensible array through the second file handle */
+    if(NULL == (ea2 = H5EA_open(f2, H5P_DATASET_XFER_DEFAULT, ea_addr, NULL)))
+        FAIL_STACK_ERROR
+
+    /* Verify the creation parameters */
+    if(verify_cparam(ea, cparam) < 0)
+        TEST_ERROR
+
+    /* Close the first extensible array wrapper */
+    if(H5EA_close(ea, H5P_DATASET_XFER_DEFAULT) < 0)
+        FAIL_STACK_ERROR
+    ea = NULL;
+
+    /* Close the first file */
+    /* (close before second file, to detect error on internal array header's
+     *  shared file information)
+     */
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close array, delete array, close file & verify file is empty */
+    if(finish(file2, fapl, f2, ea2, ea_addr) < 0)
+        TEST_ERROR
+
+    /* All tests passed */
+    PASSED()
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        if(ea)
+            H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
+        if(ea2)
+            H5EA_close(ea2, H5P_DATASET_XFER_DEFAULT);
+	H5Fclose(file);
+	H5Fclose(file2);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_open_twice() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	test_open_twice_diff
+ *
+ * Purpose:	Open an extensible array twice, through different "top" file
+ *              handles, with an intermediate file open that takes the "shared"
+ *              file handle from the first extensible array's file pointer.
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, December 18, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_open_twice_diff(hid_t fapl, H5EA_create_t *cparam, earray_test_param_t *tparam)
+{
+    char        filename_tmp[EARRAY_FILENAME_LEN];      /* Temporary file name */
+    hid_t	file = -1;              /* File ID */
+    hid_t	file2 = -1;             /* File ID */
+    hid_t	file0 = -1;             /* File ID */
+    hid_t	file00 = -1;            /* File ID */
+    H5F_t	*f = NULL;              /* Internal file object pointer */
+    H5F_t	*f2 = NULL;             /* Internal file object pointer */
+    H5EA_t      *ea = NULL;             /* Extensible array wrapper */
+    H5EA_t      *ea2 = NULL;            /* Extensible array wrapper */
+    haddr_t     ea_addr = HADDR_UNDEF;  /* Array address in file */
+
+    /* Create file & retrieve pointer to internal file object */
+    if(create_file(H5F_ACC_TRUNC, fapl, &file, &f) < 0)
+        TEST_ERROR
+
+    /*
+     * Display testing message
+     */
+    TESTING("open extensible array twice, through different file handles");
+
+    /* Create array */
+    if(create_array(f, H5P_DATASET_XFER_DEFAULT, cparam, &ea, &ea_addr, NULL) < 0)
+        TEST_ERROR
+
+    /* Open the array again, through the first file handle */
+    if(NULL == (ea2 = H5EA_open(f, H5P_DATASET_XFER_DEFAULT, ea_addr, NULL)))
+        FAIL_STACK_ERROR
+
+    /* Verify the creation parameters */
+    if(verify_cparam(ea, cparam) < 0)
+        TEST_ERROR
+    if(verify_cparam(ea2, cparam) < 0)
+        TEST_ERROR
+
+    /* Close the second extensible array wrapper */
+    if(H5EA_close(ea2, H5P_DATASET_XFER_DEFAULT) < 0)
+        FAIL_STACK_ERROR
+    ea2 = NULL;
+
+    /* Re-open the file */
+    /* (So that there is something holding the file open when the extensible
+     *  array is closed)
+     */
+    if((file0 = H5Fopen(filename_g, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check for closing & re-opening the file */
+    if(reopen_file(&file, &f, fapl, H5P_DATASET_XFER_DEFAULT, &ea, ea_addr, tparam) < 0)
+        TEST_ERROR
+
+    /* Verify the creation parameters */
+    if(verify_cparam(ea, cparam) < 0)
+        TEST_ERROR
+
+    /* Close the first extensible array wrapper */
+    if(H5EA_close(ea, H5P_DATASET_XFER_DEFAULT) < 0)
+        FAIL_STACK_ERROR
+    ea = NULL;
+
+    /* Close the first file */
+    /* (close before second file, to detect error on internal array header's
+     *  shared file information)
+     */
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+    file = -1;
+
+    /* Open a different file */
+    /* (This re-allocates the 'top' file pointer and assigns it a different
+     *  'shared' file pointer, making the file pointer in the extensible array's
+     *  header stale)
+     */
+    h5_fixname(FILENAME[1], fapl, filename_tmp, sizeof(filename_tmp));
+    if((file00 = H5Fcreate(filename_tmp, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+
+    /* Re-open the file with the extensible array */
+    if((file2 = H5Fopen(filename_g, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f2 = (H5F_t *)H5I_object(file2)))
+        FAIL_STACK_ERROR
+
+    /* Open the extensible array through the second file handle */
+    if(NULL == (ea2 = H5EA_open(f2, H5P_DATASET_XFER_DEFAULT, ea_addr, NULL)))
+        FAIL_STACK_ERROR
+
+    /* Verify the creation parameters */
+    if(verify_cparam(ea2, cparam) < 0)
+        TEST_ERROR
+
+    /* Close the extra file handles */
+    if(H5Fclose(file0) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(file00) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close array, delete array, close file & verify file is empty */
+    if(finish(file2, fapl, f2, ea2, ea_addr) < 0)
+        TEST_ERROR
+
+    /* All tests passed */
+    PASSED()
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        if(ea)
+            H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
+        if(ea2)
+            H5EA_close(ea2, H5P_DATASET_XFER_DEFAULT);
+	H5Fclose(file);
+	H5Fclose(file2);
+	H5Fclose(file0);
+	H5Fclose(file00);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_open_twice_diff() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	test_delete_open
+ *
+ * Purpose:	Delete opened extensible array (& open deleted array)
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, August 28, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_delete_open(hid_t fapl, H5EA_create_t *cparam, earray_test_param_t *tparam)
+{
+    hid_t	file = -1;              /* File ID */
+    H5F_t	*f = NULL;              /* Internal file object pointer */
+    H5EA_t      *ea = NULL;             /* Extensible array wrapper */
+    H5EA_t      *ea2 = NULL;            /* Extensible array wrapper */
+    haddr_t     ea_addr = HADDR_UNDEF;  /* Array address in file */
+    h5_stat_size_t file_size;           /* File size, after deleting array */
+
+    /* Create file & retrieve pointer to internal file object */
+    if(create_file(H5F_ACC_TRUNC, fapl, &file, &f) < 0)
+        TEST_ERROR
+
+    /*
+     * Display testing message
+     */
+    TESTING("deleting open extensible array");
+
+    /* Create array */
+    if(create_array(f, H5P_DATASET_XFER_DEFAULT, cparam, &ea, &ea_addr, NULL) < 0)
+        TEST_ERROR
+
+    /* Open the array again */
+    if(NULL == (ea2 = H5EA_open(f, H5P_DATASET_XFER_DEFAULT, ea_addr, NULL)))
+        FAIL_STACK_ERROR
+
+    /* Request that the array be deleted */
+    if(H5EA_delete(f, H5P_DATASET_XFER_DEFAULT, ea_addr, NULL) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify the creation parameters */
+    if(verify_cparam(ea, cparam) < 0)
+        TEST_ERROR
+    if(verify_cparam(ea2, cparam) < 0)
+        TEST_ERROR
+
+    /* Close the second extensible array wrapper */
+    if(H5EA_close(ea2, H5P_DATASET_XFER_DEFAULT) < 0)
+        FAIL_STACK_ERROR
+    ea2 = NULL;
+
+    /* Try re-opening the array again (should fail, as array will be deleted) */
+    H5E_BEGIN_TRY {
+        ea2 = H5EA_open(f, H5P_DATASET_XFER_DEFAULT, ea_addr, NULL);
+    } H5E_END_TRY;
+    if(ea2) {
+        /* Close opened array */
+        H5EA_close(ea2, H5P_DATASET_XFER_DEFAULT);
+
+        /* Indicate error */
+        TEST_ERROR
+    } /* end if */
+
+    /* Close the first extensible array wrapper */
+    if(H5EA_close(ea, H5P_DATASET_XFER_DEFAULT) < 0)
+        FAIL_STACK_ERROR
+    ea = NULL;
+
+    /* Check for closing & re-opening the file */
+    if(reopen_file(&file, &f, fapl, H5P_DATASET_XFER_DEFAULT, NULL, HADDR_UNDEF, tparam) < 0)
+        TEST_ERROR
+
+    /* Try re-opening the array again (should fail, as array is now deleted) */
+    H5E_BEGIN_TRY {
+        ea = H5EA_open(f, H5P_DATASET_XFER_DEFAULT, ea_addr, NULL);
+    } H5E_END_TRY;
+    if(ea) {
+        /* Close opened array */
+        H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
+
+        /* Indicate error */
+        TEST_ERROR
+    } /* end if */
+
+    /* Close the file */
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get the size of the file */
+    if((file_size = h5_get_file_size(filename_g, fapl)) < 0)
+        TEST_ERROR
+
+    /* Verify the file is correct size */
+    if(file_size != empty_size_g)
+        TEST_ERROR
+
+    /* All tests passed */
+    PASSED()
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        if(ea)
+            H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
+        if(ea2)
+            H5EA_close(ea2, H5P_DATASET_XFER_DEFAULT);
+	H5Fclose(file);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_delete_open() */
+
+/* Extensible array iterator info for forward iteration */
+typedef struct eiter_fw_t {
+    hsize_t idx;        /* Index of next array location */
+    unsigned base_sblk_idx;       /* Starting index for actual superblocks */
+} eiter_fw_t;
+
+

+/*-------------------------------------------------------------------------
+ * Function:	eiter_fw_init
+ *
+ * Purpose:	Initialize element interator (forward iteration)
+ *
+ * Return:	Success:	Pointer to iteration status object
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, October  2, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+eiter_fw_init(const H5EA_create_t H5_ATTR_UNUSED *cparam, const earray_test_param_t H5_ATTR_UNUSED *tparam,
+    hsize_t H5_ATTR_UNUSED cnt)
+{
+    eiter_fw_t *eiter;          /* Forward element iteration object */
+
+    /* Allocate space for the element iteration object */
+    eiter = (eiter_fw_t *)HDmalloc(sizeof(eiter_fw_t));
+    HDassert(eiter);
+
+    /* Initialize the element iteration object */
+    eiter->idx = 0;
+    eiter->base_sblk_idx = UINT_MAX;
+
+    /* Return iteration object */
+    return(eiter);
+} /* end eiter_fw_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	eiter_fw_next
+ *
+ * Purpose:	Get next element index (forward iteration)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November  4, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static hssize_t
+eiter_fw_next(void *_eiter)
+{
+    eiter_fw_t *eiter = (eiter_fw_t *)_eiter;
+    hssize_t ret_val;
+
+    /* Sanity check */
+    HDassert(eiter);
+
+    /* Get the next array index to test */
+    ret_val = (hssize_t)eiter->idx++;
+
+    return(ret_val);
+} /* end eiter_fw_next() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	eiter_fw_max
+ *
+ * Purpose:	Get max. element index (forward iteration)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November  4, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_ATTR_PURE hssize_t
+eiter_fw_max(const void *_eiter)
+{
+    const eiter_fw_t *eiter = (const eiter_fw_t *)_eiter;
+
+    /* Sanity check */
+    HDassert(eiter);
+
+    /* Return the max. array index used */
+    return((hssize_t)(eiter->idx - 1));
+} /* end eiter_fw_max() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:	eiter_fw_state
+ *
+ * Purpose:	Get extensible array state (forward iteration)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November  4, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+eiter_fw_state(void *_eiter, const H5EA_create_t *cparam,
+    const earray_test_param_t *tparam, earray_state_t *state, hsize_t idx)
+{
+    eiter_fw_t *eiter = (eiter_fw_t *)_eiter;
+
+    /* Sanity check */
+    HDassert(eiter);
+    HDassert(cparam);
+    HDassert(tparam);
+    HDassert(state);
+
+    /* Compute the state of the extensible array */
+    state->hdr_size = EA_HDR_SIZE;
+    state->nindex_blks = 1;
+    state->index_blk_size = EA_IBLOCK_SIZE;
+    state->max_idx_set = idx + 1;
+    if(idx < cparam->idx_blk_elmts) {
+        state->nelmts = (hsize_t)cparam->idx_blk_elmts;
+        state->nsuper_blks = state->ndata_blks = (hsize_t)0;
+        state->super_blk_size = state->data_blk_size = (hsize_t)0;
+    } /* end if */
+    else {
+        unsigned sblk_idx;      /* Which superblock does this index fall in? */
+
+        /* Compute super block index for element index */
+        /* (same eqn. as in H5EA__dblock_sblk_idx()) */
+        sblk_idx = H5VM_log2_gen((uint64_t)(((idx - cparam->idx_blk_elmts) / cparam->data_blk_min_elmts) + 1));
+#ifdef QAK
+HDfprintf(stderr, "idx = %Hu, tparam->sblk_info[%u] = {%Zu, %Zu, %Hu, %Hu}\n", idx, sblk_idx, tparam->sblk_info[sblk_idx].ndblks, tparam->sblk_info[sblk_idx].dblk_nelmts, tparam->sblk_info[sblk_idx].start_idx, tparam->sblk_info[sblk_idx].start_dblk);
+#endif /* QAK */
+
+        state->nelmts = EA_NELMTS(cparam, tparam, idx, sblk_idx);
+#ifdef QAK
+HDfprintf(stderr, "state->nelmts = %Hu\n", state->nelmts);
+#endif /* QAK */
+
+        state->ndata_blks = EA_NDATA_BLKS(cparam, tparam, idx, sblk_idx);
+#ifdef QAK
+HDfprintf(stderr, "state->ndata_blks = %Hu\n", state->ndata_blks);
+#endif /* QAK */
+
+        /* Check if we have any super blocks yet */
+        if(tparam->sblk_info[sblk_idx].ndblks >= cparam->sup_blk_min_data_ptrs) {
+            /* Check if this is the first superblock */
+            if(sblk_idx < eiter->base_sblk_idx)
+                eiter->base_sblk_idx = sblk_idx;
+
+            state->nsuper_blks = (sblk_idx - eiter->base_sblk_idx) + 1;
+#ifdef QAK
+HDfprintf(stderr, "state->nsuper_blks = %Hu\n", state->nsuper_blks);
+#endif /* QAK */
+        } /* end if */
+        else
+            state->nsuper_blks = 0;
+    } /* end else */
+
+    return(0);
+} /* end eiter_fw_state() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	eiter_fw_term
+ *
+ * Purpose:	Shut down element interator (forward iteration)
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, October  2, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+eiter_fw_term(void *eiter)
+{
+    /* Sanity check */
+    HDassert(eiter);
+
+    /* Free iteration object */
+    HDfree(eiter);
+
+    return(0);
+} /* end eiter_fw_term() */
+
+/* Extensible array iterator class for forward iteration */
+static const earray_iter_t ea_iter_fw = {
+    eiter_fw_init,              /* Iterator init */
+    eiter_fw_next,              /* Next array index */
+    eiter_fw_max,               /* Max. array index */
+    eiter_fw_state,             /* State of the extensible array */
+    eiter_fw_term               /* Iterator term */
+};
+
+/* Extensible array iterator info for reverse iteration */
+typedef struct eiter_rv_t {
+    hsize_t idx;                        /* Index of next array location */
+    hsize_t max;                        /* Index of max. array location */
+    hsize_t max_sblk_idx;               /* Which superblock does the max. array location fall in? */
+    hsize_t max_nelmts;                 /* Max. # of elements for array */
+    hsize_t max_ndata_blks;             /* Max. # of data blocks for array */
+    hsize_t idx_blk_nsblks;             /* Number of superblocks directly pointed to in the index block */
+} eiter_rv_t;
+
+

+/*-------------------------------------------------------------------------
+ * Function:	eiter_rv_init
+ *
+ * Purpose:	Initialize element interator (reverse iteration)
+ *
+ * Return:	Success:	Pointer to iteration status object
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November  4, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+eiter_rv_init(const H5EA_create_t *cparam, const earray_test_param_t *tparam,
+    hsize_t cnt)
+{
+    eiter_rv_t *eiter;          /* Reverse element iteration object */
+
+    /* Allocate space for the element iteration object */
+    eiter = (eiter_rv_t *)HDmalloc(sizeof(eiter_rv_t));
+    HDassert(eiter);
+
+    /* Initialize reverse iteration info */
+    eiter->idx = cnt - 1;
+    eiter->max = cnt - 1;
+    if(cnt > cparam->idx_blk_elmts) {
+        eiter->max_sblk_idx = H5VM_log2_gen((uint64_t)(((eiter->max - cparam->idx_blk_elmts) / cparam->data_blk_min_elmts) + 1));
+        eiter->max_nelmts = EA_NELMTS(cparam, tparam, eiter->max, eiter->max_sblk_idx);
+        eiter->max_ndata_blks = EA_NDATA_BLKS(cparam, tparam, eiter->max, eiter->max_sblk_idx);
+        eiter->idx_blk_nsblks = 2 * H5VM_log2_of2((uint32_t)cparam->sup_blk_min_data_ptrs);
+    } /* end if */
+    else {
+        eiter->max_sblk_idx = (hsize_t)0;
+        eiter->max_nelmts = (hsize_t)0;
+        eiter->max_ndata_blks = (hsize_t)0;
+        eiter->idx_blk_nsblks = (hsize_t)0;
+    } /* end else */
+
+    /* Return iteration object */
+    return(eiter);
+} /* end eiter_rv_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	eiter_rv_next
+ *
+ * Purpose:	Get next element index (reverse iteration)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November  4, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static hssize_t
+eiter_rv_next(void *_eiter)
+{
+    eiter_rv_t *eiter = (eiter_rv_t *)_eiter;
+    hssize_t ret_val;
+
+    /* Sanity check */
+    HDassert(eiter);
+
+    /* Get the next array index to test */
+    ret_val = (hssize_t)eiter->idx--;
+
+    return(ret_val);
+} /* end eiter_rv_next() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	eiter_rv_max
+ *
+ * Purpose:	Get max. element index (reverse iteration)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November  4, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_ATTR_PURE hssize_t
+eiter_rv_max(const void *_eiter)
+{
+    const eiter_rv_t *eiter = (const eiter_rv_t *)_eiter;
+
+    /* Sanity check */
+    HDassert(eiter);
+
+    /* Return the max. array index used */
+    return((hssize_t)eiter->max);
+} /* end eiter_rv_max() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	eiter_rv_state
+ *
+ * Purpose:	Get extensible array state (reverse iteration)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November  4, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+eiter_rv_state(void *_eiter, const H5EA_create_t *cparam,
+    const earray_test_param_t *tparam, earray_state_t *state, hsize_t idx)
+{
+    eiter_rv_t *eiter = (eiter_rv_t *)_eiter;
+
+    /* Sanity check */
+    HDassert(eiter);
+    HDassert(cparam);
+    HDassert(tparam);
+    HDassert(state);
+
+    /* Compute the state of the extensible array */
+    state->hdr_size = EA_HDR_SIZE;
+    state->nindex_blks = 1;
+    state->index_blk_size = EA_IBLOCK_SIZE;
+    state->max_idx_set = eiter->max + 1;
+    if(eiter->max < cparam->idx_blk_elmts) {
+        state->nelmts = (hsize_t)cparam->idx_blk_elmts;
+        state->nsuper_blks = state->ndata_blks = (hsize_t)0;
+    } /* end if */
+    else {
+        hsize_t idx_nelmts;     /* # of elements for array index */
+        hsize_t idx_ndata_blks; /* # of data blocks for array index */
+        hsize_t loc_idx = 0;    /* Local index, for computing an offset in next lower data block */
+        unsigned idx_sblk_idx;  /* Which superblock does this index fall in? */
+        unsigned loc_sblk_idx = 0;  /* Which superblock does the local index fall in? */
+
+        /* Compute super block index for element index */
+        /* (same eqn. as in H5EA__dblock_sblk_idx()) */
+        if(idx < cparam->idx_blk_elmts + cparam->data_blk_min_elmts)
+            idx_sblk_idx = 0;
+        else {
+            hsize_t tmp_idx;    /* Temporary index in superblock */
+            hsize_t dblk_idx;   /* Index of data block within superblock */
+
+            idx_sblk_idx = H5VM_log2_gen((uint64_t)(((idx - cparam->idx_blk_elmts) / cparam->data_blk_min_elmts) + 1));
+            tmp_idx = idx - (cparam->idx_blk_elmts + tparam->sblk_info[idx_sblk_idx].start_idx);
+            dblk_idx = tmp_idx / tparam->sblk_info[idx_sblk_idx].dblk_nelmts;
+            if(dblk_idx > 0)
+                loc_idx = idx - tparam->sblk_info[idx_sblk_idx].dblk_nelmts;
+            else
+                loc_idx = cparam->idx_blk_elmts + tparam->sblk_info[idx_sblk_idx].start_idx - 1;
+            loc_sblk_idx = H5VM_log2_gen((uint64_t)(((loc_idx - cparam->idx_blk_elmts) / cparam->data_blk_min_elmts) + 1));
+        } /* end else */
+#ifdef QAK
+HDfprintf(stderr, "idx = %Hu, loc_idx = %Hu, eiter->max_sblk_idx = %u, idx_sblk_idx = %u, loc_sblk_idx = %u\n", idx, loc_idx, eiter->max_sblk_idx, idx_sblk_idx, loc_sblk_idx);
+HDfprintf(stderr, "tparam->sblk_info[%u] = {%Zu, %Zu, %Hu, %Hu}\n", idx_sblk_idx, tparam->sblk_info[idx_sblk_idx].ndblks, tparam->sblk_info[idx_sblk_idx].dblk_nelmts, tparam->sblk_info[idx_sblk_idx].start_idx, tparam->sblk_info[idx_sblk_idx].start_dblk);
+HDfprintf(stderr, "tparam->sblk_info[%u] = {%Zu, %Zu, %Hu, %Hu}\n", eiter->max_sblk_idx, tparam->sblk_info[eiter->max_sblk_idx].ndblks, tparam->sblk_info[eiter->max_sblk_idx].dblk_nelmts, tparam->sblk_info[eiter->max_sblk_idx].start_idx, tparam->sblk_info[eiter->max_sblk_idx].start_dblk);
+#endif /* QAK */
+
+        if(idx < cparam->idx_blk_elmts + cparam->data_blk_min_elmts)
+            idx_nelmts = (hsize_t)cparam->idx_blk_elmts;
+        else
+            idx_nelmts = EA_NELMTS(cparam, tparam, loc_idx, loc_sblk_idx);
+        state->nelmts = (eiter->max_nelmts - idx_nelmts) + cparam->idx_blk_elmts;
+#ifdef QAK
+HDfprintf(stderr, "eiter->max_nelmts = %Hu, idx_nelmts = %Hu, state->nelmts = %Hu\n", eiter->max_nelmts, idx_nelmts, state->nelmts);
+#endif /* QAK */
+
+        if(idx < cparam->idx_blk_elmts + cparam->data_blk_min_elmts)
+            idx_ndata_blks = 0;
+        else
+            idx_ndata_blks = EA_NDATA_BLKS(cparam, tparam, loc_idx, loc_sblk_idx);
+        state->ndata_blks = eiter->max_ndata_blks - idx_ndata_blks;
+#ifdef QAK
+HDfprintf(stderr, "eiter->max_ndata_blks = %Hu, idx_ndata_blks = %Hu, state->ndata_blks = %Hu\n", eiter->max_ndata_blks, idx_ndata_blks, state->ndata_blks);
+#endif /* QAK */
+
+        /* Check if we have any super blocks yet */
+        if(tparam->sblk_info[eiter->max_sblk_idx].ndblks >= cparam->sup_blk_min_data_ptrs) {
+            if(idx_sblk_idx > eiter->idx_blk_nsblks)
+                state->nsuper_blks = (eiter->max_sblk_idx - idx_sblk_idx) + 1;
+            else
+                state->nsuper_blks = (eiter->max_sblk_idx - eiter->idx_blk_nsblks) + 1;
+#ifdef QAK
+HDfprintf(stderr, "eiter->idx_blk_nsblks = %Hu, state->nsuper_blks = %Hu\n", eiter->idx_blk_nsblks, state->nsuper_blks);
+#endif /* QAK */
+        } /* end if */
+    } /* end else */
+
+    return(0);
+} /* end eiter_rv_state() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	eiter_rv_term
+ *
+ * Purpose:	Shut down element interator (reverse iteration)
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November  4, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+eiter_rv_term(void *eiter)
+{
+    /* Sanity check */
+    HDassert(eiter);
+
+    /* Free iteration object */
+    HDfree(eiter);
+
+    return(0);
+} /* end eiter_rv_term() */
+
+/* Extensible array iterator class for reverse iteration */
+static const earray_iter_t ea_iter_rv = {
+    eiter_rv_init,              /* Iterator init */
+    eiter_rv_next,              /* Next array index */
+    eiter_rv_max,               /* Max. array index written */
+    eiter_rv_state,             /* State of the extensible array */
+    eiter_rv_term               /* Iterator term */
+};
+
+/* Extensible array iterator info for random iteration */
+typedef struct eiter_rnd_t {
+    hsize_t max;                /* Max. array index used */
+    hsize_t pos;                /* Position in shuffled array */
+    hsize_t *idx;               /* Array of shuffled indices */
+} eiter_rnd_t;
+
+

+/*-------------------------------------------------------------------------
+ * Function:	eiter_rnd_init
+ *
+ * Purpose:	Initialize element interator (random iteration)
+ *
+ * Return:	Success:	Pointer to iteration status object
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November  6, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+eiter_rnd_init(const H5EA_create_t H5_ATTR_UNUSED *cparam, const earray_test_param_t H5_ATTR_UNUSED *tparam,
+    hsize_t cnt)
+{
+    eiter_rnd_t *eiter;         /* Random element iteration object */
+    size_t u;                   /* Local index variable */
+
+    /* Allocate space for the element iteration object */
+    eiter = (eiter_rnd_t *)HDmalloc(sizeof(eiter_rnd_t));
+    HDassert(eiter);
+
+    /* Allocate space for the array of shuffled indices */
+    eiter->idx = (hsize_t *)HDmalloc(sizeof(hsize_t) * (size_t)cnt);
+    HDassert(eiter->idx);
+
+    /* Initialize reverse iteration info */
+    eiter->max = 0;
+    eiter->pos = 0;
+    for(u = 0; u < (size_t)cnt; u++)
+        eiter->idx[u] = (hsize_t)u;
+
+    /* Randomly shuffle array indices */
+    if(cnt > 1) {
+        for(u = 0; u < (size_t)cnt; u++) {
+            size_t swap_idx;            /* Location to swap with when shuffling */
+            hsize_t temp_idx;           /* Temporary index */
+
+            swap_idx = ((size_t)HDrandom() % ((size_t)cnt - u)) + u;
+            temp_idx = eiter->idx[u];
+            eiter->idx[u] = eiter->idx[swap_idx];
+            eiter->idx[swap_idx] = temp_idx;
+        } /* end for */
+    } /* end if */
+
+    /* Return iteration object */
+    return(eiter);
+} /* end eiter_rnd_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	eiter_rnd_next
+ *
+ * Purpose:	Get next element index (random iteration)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November  6, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static hssize_t
+eiter_rnd_next(void *_eiter)
+{
+    eiter_rnd_t *eiter = (eiter_rnd_t *)_eiter;
+    hssize_t ret_val;
+
+    /* Sanity check */
+    HDassert(eiter);
+
+    /* Get the next array index to test */
+    ret_val = (hssize_t)eiter->idx[eiter->pos];
+    eiter->pos++;
+
+    /* Check for new max. value */
+    if((hsize_t)ret_val > eiter->max)
+        eiter->max = (hsize_t)ret_val;
+
+    return(ret_val);
+} /* end eiter_rnd_next() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	eiter_rnd_max
+ *
+ * Purpose:	Get max. element index (random iteration)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November  6, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_ATTR_PURE hssize_t
+eiter_rnd_max(const void *_eiter)
+{
+    const eiter_rnd_t *eiter = (const eiter_rnd_t *)_eiter;
+
+    /* Sanity check */
+    HDassert(eiter);
+
+    /* Return the max. array index used */
+    return((hssize_t)eiter->max);
+} /* end eiter_rnd_max() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	eiter_rnd_term
+ *
+ * Purpose:	Shut down element interator (random iteration)
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November  6, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+eiter_rnd_term(void *_eiter)
+{
+    eiter_rnd_t *eiter = (eiter_rnd_t *)_eiter;
+
+    /* Sanity check */
+    HDassert(eiter);
+    HDassert(eiter->idx);
+
+    /* Free shuffled index array */
+    HDfree(eiter->idx);
+
+    /* Free iteration object */
+    HDfree(eiter);
+
+    return(0);
+} /* end eiter_rnd_term() */
+
+/* Extensible array iterator class for random iteration */
+static const earray_iter_t ea_iter_rnd = {
+    eiter_rnd_init,             /* Iterator init */
+    eiter_rnd_next,             /* Next array index */
+    eiter_rnd_max,              /* Max. array index written */
+    NULL,                       /* State of the extensible array */
+    eiter_rnd_term              /* Iterator term */
+};
+
+

+/*-------------------------------------------------------------------------
+ * Function:	eiter_rnd2_init
+ *
+ * Purpose:	Initialize element interator (random #2 iteration)
+ *
+ * Return:	Success:	Pointer to iteration status object
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, November 11, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+eiter_rnd2_init(const H5EA_create_t H5_ATTR_UNUSED *cparam, const earray_test_param_t H5_ATTR_UNUSED *tparam,
+    hsize_t cnt)
+{
+    eiter_rnd_t *eiter;        /* Random element iteration object */
+    size_t u;                  /* Local index variable */
+
+    /* Allocate space for the element iteration object */
+    eiter = (eiter_rnd_t *)HDmalloc(sizeof(eiter_rnd_t));
+    HDassert(eiter);
+
+    /* Allocate space for the array of shuffled indices */
+    eiter->idx = (hsize_t *)HDmalloc(sizeof(hsize_t) * (size_t)cnt);
+    HDassert(eiter->idx);
+
+    /* Initialize reverse iteration info */
+    eiter->max = 0;
+    eiter->pos = 0;
+
+    /* Randomly shuffle array indices */
+    if(cnt > 1) {
+        hsize_t *tmp_idx;           /* Temporary index array */
+        hsize_t sparse_cnt = (hsize_t)(cnt * EA_RND2_SCALE);         /* Sparse range to choose from */
+
+        /* Allocate temporary index array */
+        tmp_idx = (hsize_t *)HDmalloc(sizeof(hsize_t) * (size_t)sparse_cnt);
+        HDassert(tmp_idx);
+
+        /* Initialize temporary index array, for shuffling */
+        for(u = 0; u < (size_t)sparse_cnt; u++)
+            tmp_idx[u] = (hsize_t)u;
+
+        /* Shuffle index elements & store in final array */
+        for(u = 0; u < (size_t)cnt; u++) {
+            size_t swap_idx;            /* Location to swap with when shuffling */
+
+            swap_idx = ((size_t)HDrandom() % ((size_t)sparse_cnt - u)) + u;
+            eiter->idx[u] = tmp_idx[swap_idx];
+            tmp_idx[swap_idx] = tmp_idx[u];
+        } /* end for */
+
+        /* Release temporary array */
+        HDfree(tmp_idx);
+    } /* end if */
+    else {
+        for(u = 0; u < (size_t)cnt; u++)
+            eiter->idx[u] = (hsize_t)u;
+    } /* end else */
+
+    /* Return iteration object */
+    return(eiter);
+} /* end eiter_rnd2_init() */
+
+/* Extensible array iterator class for random iteration */
+static const earray_iter_t ea_iter_rnd2 = {
+    eiter_rnd2_init,            /* Iterator init */
+    eiter_rnd_next,             /* Next array index */
+    eiter_rnd_max,              /* Max. array index written */
+    NULL,                       /* State of the extensible array */
+    eiter_rnd_term              /* Iterator term */
+};
+
+/* Extensible array iterator info for cyclic iteration */
+typedef struct eiter_cyc_t {
+    hsize_t max;                /* Max. array index used */
+    hsize_t pos;                /* Position in shuffled array */
+    hsize_t cnt;                /* # of elements to store */
+    hsize_t cyc;                /* Cycle of elements to choose from */
+} eiter_cyc_t;
+
+

+/*-------------------------------------------------------------------------
+ * Function:	eiter_cyc_init
+ *
+ * Purpose:	Initialize element interator (cyclic iteration)
+ *
+ * Return:	Success:	Pointer to iteration status object
+ *		Failure:	NULL
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November 11, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+eiter_cyc_init(const H5EA_create_t H5_ATTR_UNUSED *cparam, const earray_test_param_t H5_ATTR_UNUSED *tparam,
+    hsize_t cnt)
+{
+    eiter_cyc_t *eiter;         /* Cyclic element iteration object */
+
+    /* Allocate space for the element iteration object */
+    eiter = (eiter_cyc_t *)HDmalloc(sizeof(eiter_cyc_t));
+    HDassert(eiter);
+
+    /* Initialize reverse iteration info */
+    eiter->max = 0;
+    eiter->pos = 0;
+    eiter->cnt = cnt;
+    eiter->cyc = 0;
+
+    /* Return iteration object */
+    return(eiter);
+} /* end eiter_cyc_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	eiter_cyc_next
+ *
+ * Purpose:	Get next element index (cyclic iteration)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November 11, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static hssize_t
+eiter_cyc_next(void *_eiter)
+{
+    eiter_cyc_t *eiter = (eiter_cyc_t *)_eiter;
+    hssize_t ret_val;
+
+    /* Sanity check */
+    HDassert(eiter);
+
+    /* Get the next array index to test */
+    ret_val = (hssize_t)eiter->pos;
+    eiter->pos += EA_CYC_COUNT;
+    if(eiter->pos >= eiter->cnt)
+        eiter->pos = ++eiter->cyc;
+
+    /* Check for new max. value */
+    if((hsize_t)ret_val > eiter->max)
+        eiter->max = (hsize_t)ret_val;
+
+    return(ret_val);
+} /* end eiter_cyc_next() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	eiter_cyc_max
+ *
+ * Purpose:	Get max. element index (cyclic iteration)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November 11, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static H5_ATTR_PURE hssize_t
+eiter_cyc_max(const void *_eiter)
+{
+    const eiter_cyc_t *eiter = (const eiter_cyc_t *)_eiter;
+
+    /* Sanity check */
+    HDassert(eiter);
+
+    /* Return the max. array index used */
+    return((hssize_t)eiter->max);
+} /* end eiter_cyc_max() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	eiter_cyc_term
+ *
+ * Purpose:	Shut down element interator (cyclic iteration)
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November 11, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+eiter_cyc_term(void *_eiter)
+{
+    eiter_cyc_t *eiter = (eiter_cyc_t *)_eiter;
+
+    /* Sanity check */
+    HDassert(eiter);
+
+    /* Free iteration object */
+    HDfree(eiter);
+
+    return(0);
+} /* end eiter_cyc_term() */
+
+/* Extensible array iterator class for cyclic iteration */
+static const earray_iter_t ea_iter_cyc = {
+    eiter_cyc_init,             /* Iterator init */
+    eiter_cyc_next,             /* Next array index */
+    eiter_cyc_max,              /* Max. array index written */
+    NULL,                       /* State of the extensible array */
+    eiter_cyc_term              /* Iterator term */
+};
+
+

+/*-------------------------------------------------------------------------
+ * Function:	test_set_elmts
+ *
+ * Purpose:	Set all elements from 0 through 'nelmts' in extensible array
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:	Quincey Koziol
+ *              Thursday, September 22, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_set_elmts(hid_t fapl, H5EA_create_t *cparam, earray_test_param_t *tparam,
+    hsize_t nelmts, const char *test_str)
+{
+    hid_t	file = -1;              /* File ID */
+    H5F_t	*f = NULL;              /* Internal file object pointer */
+    H5EA_t      *ea = NULL;             /* Extensible array wrapper */
+    void        *eiter_info;            /* Extensible array iterator info */
+    earray_state_t state;               /* State of extensible array */
+    uint64_t    welmt;                  /* Element to write */
+    uint64_t    relmt;                  /* Element to read */
+    hsize_t     nelmts_written;         /* Highest element written in array */
+    hsize_t     cnt;                    /* Count of array indices */
+    hssize_t    smax;                   /* Index value of max. element set */
+    hsize_t     max;                    /* Index value of max. element set */
+    hssize_t    sidx;                   /* Index value of first element of first data block */
+    hsize_t     idx;                    /* Index value of first element of first data block */
+    haddr_t     ea_addr = HADDR_UNDEF;  /* Array address in file */
+
+    /*
+     * Display testing message
+     */
+    TESTING(test_str);
+
+    /* Create file & retrieve pointer to internal file object */
+    if(create_file(H5F_ACC_TRUNC, fapl, &file, &f) < 0)
+        TEST_ERROR
+
+    /* Create array */
+    if(create_array(f, H5P_DATASET_XFER_DEFAULT, cparam, &ea, &ea_addr, NULL) < 0)
+        TEST_ERROR
+
+    /* Verify the creation parameters */
+    if(verify_cparam(ea, cparam) < 0)
+        TEST_ERROR
+
+    /* Check for closing & re-opening the file */
+    if(reopen_file(&file, &f, fapl, H5P_DATASET_XFER_DEFAULT, &ea, ea_addr, tparam) < 0)
+        TEST_ERROR
+
+    /* Verify high-water # of elements written */
+    nelmts_written = (hsize_t)ULLONG_MAX;
+    if(H5EA_get_nelmts(ea, &nelmts_written) < 0)
+        FAIL_STACK_ERROR
+    if(nelmts_written != 0)
+        TEST_ERROR
+
+    /* Verify array state */
+    HDmemset(&state, 0, sizeof(state));
+    state.hdr_size = EA_HDR_SIZE;
+    if(check_stats(ea, &state))
+        TEST_ERROR
+
+    /* Get all elements from empty array */
+
+    /* Initialize iterator */
+    if(NULL == (eiter_info = tparam->eiter->init(cparam, tparam, nelmts)))
+        TEST_ERROR
+
+    /* Get elements of array */
+    for(cnt = 0; cnt < nelmts; cnt++) {
+        /* Get the array index */
+        if((sidx = tparam->eiter->next(eiter_info)) < 0)
+            TEST_ERROR
+        idx = (hsize_t)sidx;
+
+        /* Retrieve element of array (not set yet) */
+        relmt = (uint64_t)0;
+        if(H5EA_get(ea, H5P_DATASET_XFER_DEFAULT, idx, &relmt) < 0)
+            FAIL_STACK_ERROR
+
+        /* Verify element is fill value for array */
+        if(relmt != H5EA_TEST_FILL)
+            TEST_ERROR
+    } /* end for */
+
+    /* Shutdown iterator */
+    if(tparam->eiter->term(eiter_info) < 0)
+        TEST_ERROR
+
+
+    /* Set (& get) all elements from empty array */
+
+    /* Initialize iterator */
+    if(NULL == (eiter_info = tparam->eiter->init(cparam, tparam, nelmts)))
+        TEST_ERROR
+
+    /* Set elements of array */
+    for(cnt = 0; cnt < nelmts; cnt++) {
+        /* Get the array index */
+        if((sidx = tparam->eiter->next(eiter_info)) < 0)
+            TEST_ERROR
+        idx = (hsize_t)sidx;
+
+        /* Retrieve element of array (not set yet) */
+        relmt = (uint64_t)0;
+        if(H5EA_get(ea, H5P_DATASET_XFER_DEFAULT, idx, &relmt) < 0)
+            FAIL_STACK_ERROR
+
+        /* Verify element is fill value for array */
+        if(relmt != H5EA_TEST_FILL)
+            TEST_ERROR
+
+        /* Set element of array */
+        welmt = (uint64_t)7 + idx;
+        if(H5EA_set(ea, H5P_DATASET_XFER_DEFAULT, idx, &welmt) < 0)
+            FAIL_STACK_ERROR
+
+        /* Get the max. array index */
+        if((smax = tparam->eiter->max_elem(eiter_info)) < 0)
+            TEST_ERROR
+        max = (hsize_t)smax;
+
+        /* Verify high-water # of elements written */
+        nelmts_written = (hsize_t)ULLONG_MAX;
+        if(H5EA_get_nelmts(ea, &nelmts_written) < 0)
+            FAIL_STACK_ERROR
+        if(nelmts_written != (max + 1))
+            TEST_ERROR
+
+        /* Check if array state is available */
+        if(tparam->eiter->state) {
+            /* Get the extensible array state */
+            if(tparam->eiter->state(eiter_info, cparam, tparam, &state, idx) < 0)
+                TEST_ERROR
+
+            /* Verify array state */
+            if(check_stats(ea, &state))
+                TEST_ERROR
+        } /* end if */
+
+        /* Retrieve element of array (set now) */
+        relmt = (uint64_t)0;
+        if(H5EA_get(ea, H5P_DATASET_XFER_DEFAULT, idx, &relmt) < 0)
+            FAIL_STACK_ERROR
+
+        /* Verify element is value written */
+        if(relmt != welmt)
+            TEST_ERROR
+    } /* end for */
+
+    /* Shutdown iterator */
+    if(tparam->eiter->term(eiter_info) < 0)
+        TEST_ERROR
+
+    /* Close array, delete array, close file & verify file is empty */
+    if(finish(file, fapl, f, ea, ea_addr) < 0)
+        TEST_ERROR
+
+    /* All tests passed */
+    PASSED()
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        if(ea)
+            H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
+	H5Fclose(file);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_set_elmts() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	test_skip_elmts
+ *
+ * Purpose:	Skip some elements when writing element
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, November 11, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_skip_elmts(hid_t fapl, H5EA_create_t *cparam, earray_test_param_t *tparam,
+    hsize_t skip_elmts, const char *test_str)
+{
+    hid_t	file = -1;              /* File ID */
+    H5F_t	*f = NULL;              /* Internal file object pointer */
+    H5EA_t      *ea = NULL;             /* Extensible array wrapper */
+    earray_state_t state;               /* State of extensible array */
+    uint64_t    welmt;                  /* Element to write */
+    uint64_t    relmt;                  /* Element to read */
+    hsize_t     nelmts_written;         /* Highest element written in array */
+    hsize_t     idx;                    /* Index value of element to get */
+    hsize_t     cnt;                    /* Count of array indices */
+    haddr_t     ea_addr = HADDR_UNDEF;  /* Array address in file */
+
+    /*
+     * Display testing message
+     */
+    TESTING(test_str);
+
+    /* Create file & retrieve pointer to internal file object */
+    if(create_file(H5F_ACC_TRUNC, fapl, &file, &f) < 0)
+        TEST_ERROR
+
+    /* Create array */
+    if(create_array(f, H5P_DATASET_XFER_DEFAULT, cparam, &ea, &ea_addr, NULL) < 0)
+        TEST_ERROR
+
+    /* Verify the creation parameters */
+    if(verify_cparam(ea, cparam) < 0)
+        TEST_ERROR
+
+    /* Check for closing & re-opening the file */
+    if(reopen_file(&file, &f, fapl, H5P_DATASET_XFER_DEFAULT, &ea, ea_addr, tparam) < 0)
+        TEST_ERROR
+
+    /* Verify high-water # of elements written */
+    nelmts_written = (hsize_t)ULLONG_MAX;
+    if(H5EA_get_nelmts(ea, &nelmts_written) < 0)
+        FAIL_STACK_ERROR
+    if(nelmts_written != 0)
+        TEST_ERROR
+
+    /* Verify array state */
+    HDmemset(&state, 0, sizeof(state));
+    state.hdr_size = EA_HDR_SIZE;
+    if(check_stats(ea, &state))
+        TEST_ERROR
+
+    /* Set (& get) element after skipping elements */
+    idx = skip_elmts;
+
+    /* Retrieve element of array (not set yet) */
+    relmt = (uint64_t)0;
+    if(H5EA_get(ea, H5P_DATASET_XFER_DEFAULT, idx, &relmt) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify element is fill value for array */
+    if(relmt != H5EA_TEST_FILL)
+        TEST_ERROR
+
+    /* Set element of array */
+    welmt = (uint64_t)7 + idx;
+    if(H5EA_set(ea, H5P_DATASET_XFER_DEFAULT, idx, &welmt) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify high-water # of elements written */
+    nelmts_written = (hsize_t)ULLONG_MAX;
+    if(H5EA_get_nelmts(ea, &nelmts_written) < 0)
+        FAIL_STACK_ERROR
+    if(nelmts_written != (idx + 1))
+        TEST_ERROR
+
+    /* Set array state */
+    HDmemset(&state, 0, sizeof(state));
+    state.hdr_size = EA_HDR_SIZE;
+    state.nindex_blks = 1;
+    state.index_blk_size = EA_IBLOCK_SIZE;
+    state.max_idx_set = idx + 1;
+    if(1 == skip_elmts) {
+        state.nelmts = (hsize_t)cparam->idx_blk_elmts;
+        state.nsuper_blks = state.ndata_blks = (hsize_t)0;
+    } /* end if */
+    else if(cparam->idx_blk_elmts == skip_elmts) {
+        state.nelmts = (hsize_t)cparam->idx_blk_elmts + cparam->data_blk_min_elmts;
+        state.ndata_blks = (hsize_t)1;
+        state.nsuper_blks = (hsize_t)0;
+    } /* end if */
+    else {
+        unsigned sblk_idx;      /* Which superblock does this index fall in? */
+
+        /* Compute super block index for element index */
+        /* (same eqn. as in H5EA__dblock_sblk_idx()) */
+        sblk_idx = H5VM_log2_gen((uint64_t)(((idx - cparam->idx_blk_elmts) / cparam->data_blk_min_elmts) + 1));
+        state.nelmts = (hsize_t)cparam->idx_blk_elmts + tparam->sblk_info[sblk_idx].dblk_nelmts;
+        state.ndata_blks = (hsize_t)1;
+        state.nsuper_blks = (hsize_t)1;
+    } /* end if */
+
+    /* Verify array state */
+    if(check_stats(ea, &state))
+        TEST_ERROR
+
+    /* Retrieve element of array (set now) */
+    relmt = (uint64_t)0;
+    if(H5EA_get(ea, H5P_DATASET_XFER_DEFAULT, idx, &relmt) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify element is value written */
+    if(relmt != welmt)
+        TEST_ERROR
+
+    /* Get unset elements of array */
+    for(cnt = 0; cnt < skip_elmts; cnt++) {
+        /* Retrieve element of array (not set yet) */
+        relmt = (uint64_t)0;
+        if(H5EA_get(ea, H5P_DATASET_XFER_DEFAULT, cnt, &relmt) < 0)
+            FAIL_STACK_ERROR
+
+        /* Verify element is fill value for array */
+        if(relmt != H5EA_TEST_FILL)
+            TEST_ERROR
+    } /* end for */
+
+    /* Close array, delete array, close file & verify file is empty */
+    if(finish(file, fapl, f, ea, ea_addr) < 0)
+        TEST_ERROR
+
+    /* All tests passed */
+    PASSED()
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        if(ea)
+            H5EA_close(ea, H5P_DATASET_XFER_DEFAULT);
+	H5Fclose(file);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_skip_elmts() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	main
+ *
+ * Purpose:	Test the extensible array code
+ *
+ * Return:	Success: 0
+ *		Failure: 1
+ *
+ * Programmer:	Quincey Koziol
+ *              Tuesday, June 17, 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(void)
+{
+    H5EA_create_t cparam;               /* Creation parameters for extensible array */
+    earray_test_param_t tparam;         /* Testing parameters */
+    earray_test_type_t curr_test;       /* Current test being worked on */
+    earray_iter_type_t curr_iter;       /* Current iteration type being worked on */
+    hid_t	fapl = -1;              /* File access property list for data files */
+    unsigned	nerrors = 0;            /* Cumulative error count */
+    time_t      curr_time;              /* Current time, for seeding random number generator */
+    int		ExpressMode;            /* Test express value */
+    const char  *env_h5_drvr;      /* File Driver value from environment */
+
+    env_h5_drvr = HDgetenv("HDF5_DRIVER");
+    if(env_h5_drvr == NULL)
+        env_h5_drvr = "nomatch";
+
+    /* Reset library */
+    h5_reset();
+    fapl = h5_fileaccess();
+    ExpressMode = GetTestExpress();
+    if(ExpressMode > 1)
+	printf("***Express test mode on.  Some tests may be skipped\n");
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl, filename_g, sizeof(filename_g));
+
+    /* Seed random #'s */
+    curr_time = HDtime(NULL);
+    HDsrandom((unsigned)curr_time);
+
+    /* Create an empty file to retrieve size */
+    {
+        hid_t	file;              /* File ID */
+
+        if((file = H5Fcreate(filename_g, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Close file */
+        if(H5Fclose(file) < 0)
+            FAIL_STACK_ERROR
+
+        /* Get the size of a file w/no array */
+        if((empty_size_g = h5_get_file_size(filename_g, fapl)) < 0)
+            TEST_ERROR
+    }
+
+
+    /* Initialize extensible array creation parameters */
+    init_cparam(&cparam);
+
+    /* Iterate over the testing parameters */
+    for(curr_test = EARRAY_TEST_NORMAL; curr_test < EARRAY_TEST_NTESTS; H5_INC_ENUM(earray_test_type_t, curr_test)) {
+
+        /* Initialize the testing parameters */
+        init_tparam(&tparam, &cparam);
+
+        /* Set appropriate testing parameters for each test */
+        switch(curr_test) {
+            /* "Normal" testing parameters */
+            case EARRAY_TEST_NORMAL:
+                puts("Testing with normal parameters");
+                break;
+
+            /* "Re-open array" testing parameters */
+            case EARRAY_TEST_REOPEN:
+                puts("Testing with reopen array flag set");
+                tparam.reopen_array = EARRAY_TEST_REOPEN;
+                break;
+
+            /* An unknown test? */
+            case EARRAY_TEST_NTESTS:
+            default:
+                goto error;
+        } /* end switch */
+
+        /* Basic capability tests */
+        nerrors += test_create(fapl, &cparam, &tparam);
+        nerrors += test_reopen(fapl, &cparam, &tparam);
+        nerrors += test_open_twice(fapl, &cparam, &tparam);
+        nerrors += test_open_twice_diff(fapl, &cparam, &tparam);
+        nerrors += test_delete_open(fapl, &cparam, &tparam);
+	/* 
+         *	nerrors += test_flush_depend(env_h5_drvr, fapl, &cparam, &tparam);
+	 * The test test_flush_depend() was removed with this checkin because chunk proxy for SWMR handling is
+	 * no longer used: chunk allocation is moved up to the chunk layer, data is written to the chunk before
+	 * inserting the chunk address into the index structure.
+	 * New tests will be written in the future to verify dependency within the index data structures and 
+	 * with the object header.
+	 */
+
+        /* Iterate over the type of capacity tests */
+        for(curr_iter = EARRAY_ITER_FW; curr_iter < EARRAY_ITER_NITERS; H5_INC_ENUM(earray_iter_type_t, curr_iter)) {
+            hsize_t sblk;               /* Super block index */
+            hsize_t dblk;               /* Data block index */
+            hsize_t nelmts;             /* # of elements to test */
+            char test_str[128];         /* String for describing test */
+            hsize_t ndblks;             /* # of data blocks tested */
+
+            /* Set appropriate parameters for each type of iteration */
+            switch(curr_iter) {
+                /* "Forward" testing parameters */
+                case EARRAY_ITER_FW:
+                    puts("Testing with forward iteration");
+                    tparam.eiter = &ea_iter_fw;
+                    break;
+
+                /* "Reverse" testing parameters */
+                case EARRAY_ITER_RV:
+                    puts("Testing with reverse iteration");
+                    tparam.eiter = &ea_iter_rv;
+                    break;
+
+                /* "Random" testing parameters */
+                case EARRAY_ITER_RND:
+                    puts("Testing with random iteration");
+                    tparam.eiter = &ea_iter_rnd;
+                    break;
+
+                /* "Random #2" testing parameters */
+                case EARRAY_ITER_RND2:
+                    puts("Testing with random #2 iteration");
+                    tparam.eiter = &ea_iter_rnd2;
+                    break;
+
+                /* "Cyclic" testing parameters */
+                case EARRAY_ITER_CYC:
+                    puts("Testing with cyclic iteration");
+                    tparam.eiter = &ea_iter_cyc;
+                    break;
+
+                /* An unknown iteration? */
+                case EARRAY_ITER_NITERS:
+                default:
+                    goto error;
+            } /* end switch */
+
+            /* Basic capacity tests */
+            nerrors += test_set_elmts(fapl, &cparam, &tparam, (hsize_t)1, "setting first element of array");
+            nerrors += test_set_elmts(fapl, &cparam, &tparam, (hsize_t)cparam.idx_blk_elmts, "setting index block elements of array");
+
+            /* Super Block capacity tests */
+            ndblks = 0;
+            for(sblk = 0; sblk < 9; sblk++) {
+                for(dblk = 0; dblk < tparam.sblk_info[sblk].ndblks; dblk ++) {
+                    /* Test first element in data block */
+                    nelmts = (hsize_t)((hsize_t)1 + cparam.idx_blk_elmts +
+                        tparam.sblk_info[sblk].start_idx +
+                        (tparam.sblk_info[sblk].dblk_nelmts * dblk));
+                    sprintf(test_str, "setting first element of array's data block #%llu", (unsigned long long)ndblks);
+                    nerrors += test_set_elmts(fapl, &cparam, &tparam, nelmts, test_str);
+
+                    /* Test all elements in data block */
+                    nelmts = (hsize_t)(cparam.idx_blk_elmts +
+                        tparam.sblk_info[sblk].start_idx +
+                        (tparam.sblk_info[sblk].dblk_nelmts * (dblk + 1)));
+                    sprintf(test_str, "setting all elements of array's data block #%llu", (unsigned long long)ndblks);
+                    nerrors += test_set_elmts(fapl, &cparam, &tparam, nelmts, test_str);
+
+                    /* Increment data block being tested */
+                    ndblks++;
+                } /* end for */
+            } /* end for */
+        } /* end for */
+
+        /* Check skipping elements */
+        nerrors += test_skip_elmts(fapl, &cparam, &tparam, (hsize_t)1, "skipping 1st element");
+        nerrors += test_skip_elmts(fapl, &cparam, &tparam, (hsize_t)cparam.idx_blk_elmts, "skipping index block elements");
+        nerrors += test_skip_elmts(fapl, &cparam, &tparam, (hsize_t)(cparam.idx_blk_elmts + (15 * cparam.data_blk_min_elmts) + 1), "skipping index block & data block elements");
+        nerrors += test_skip_elmts(fapl, &cparam, &tparam, (hsize_t)(cparam.idx_blk_elmts + (31 * cparam.data_blk_min_elmts) + 1), "skipping 1st super block elements");
+        nerrors += test_skip_elmts(fapl, &cparam, &tparam, (hsize_t)(cparam.idx_blk_elmts + (63 * cparam.data_blk_min_elmts) + 1), "skipping 2nd super block elements");
+        nerrors += test_skip_elmts(fapl, &cparam, &tparam, (hsize_t)(cparam.idx_blk_elmts + (127 * cparam.data_blk_min_elmts) + 1), "skipping 3rd super block elements");
+        nerrors += test_skip_elmts(fapl, &cparam, &tparam, (hsize_t)(cparam.idx_blk_elmts + (255 * cparam.data_blk_min_elmts) + 1), "skipping 4th super block elements");
+
+        /* Close down testing parameters */
+        finish_tparam(&tparam);
+    } /* end for */
+
+    /* Verify symbol table messages are cached */
+    nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
+
+    if(nerrors)
+        goto error;
+    puts("All extensible array tests passed.");
+
+    /* Clean up file used */
+    h5_cleanup(FILENAME, fapl);
+
+    return 0;
+
+error:
+    puts("*** TESTS FAILED ***");
+
+    H5E_BEGIN_TRY {
+	H5Pclose(fapl);
+    } H5E_END_TRY;
+
+    return 1;
+} /* end main() */
+
diff --git a/test/efc.c b/test/efc.c
index ff4f738..a8d77e0 100644
--- a/test/efc.c
+++ b/test/efc.c
@@ -18,7 +18,7 @@
 
 #include "h5test.h"
 
-#define H5F_PACKAGE
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
 #include "H5Fpkg.h"
 #include "H5Iprivate.h"
 
@@ -3200,7 +3200,7 @@ main(void)
 
     puts("All external file cache tests passed.");
 
-    h5_cleanup(FILENAME, fapl_id);
+    h5_clean_files(FILENAME, fapl_id);
 
     return 0;
 
diff --git a/test/enc_dec_plist.c b/test/enc_dec_plist.c
new file mode 100644
index 0000000..4f0147e
--- /dev/null
+++ b/test/enc_dec_plist.c
@@ -0,0 +1,580 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Serial tests for encoding/decoding plists
+ */
+
+#include "h5test.h"
+#include "H5ACprivate.h"
+#include "H5Pprivate.h"
+
+static int
+test_encode_decode(hid_t orig_pl)
+{
+    hid_t pl = (-1);	       	/* Decoded property list */
+    void *temp_buf = NULL;      /* Pointer to encoding buffer */
+    size_t temp_size = 0;       /* Size of encoding buffer */
+
+    /* first call to encode returns only the size of the buffer needed */
+    if(H5Pencode(orig_pl, NULL, &temp_size) < 0)
+        STACK_ERROR
+
+    if(NULL == (temp_buf = (void *)HDmalloc(temp_size)))
+        TEST_ERROR
+
+    if(H5Pencode(orig_pl, temp_buf, &temp_size) < 0)
+        STACK_ERROR
+
+    if((pl = H5Pdecode(temp_buf)) < 0)
+        STACK_ERROR
+
+    if(!H5Pequal(orig_pl, pl))
+        PUTS_ERROR("encoding-decoding cycle failed\n")
+
+    if((H5Pclose(pl)) < 0)
+        STACK_ERROR
+
+    HDfree(temp_buf);
+
+    /* Success */
+    return(0);
+
+error:
+    if(pl > 0)
+        H5Pclose(pl);
+    if(temp_buf)
+        HDfree(temp_buf);
+
+    return(-1);
+} /* end test_encode_decode() */
+
+int
+main(void)
+{
+    hid_t dcpl;	       	/* dataset create prop. list */
+    hid_t dapl;	       	/* dataset access prop. list */
+    hid_t dxpl;	       	/* dataset xfer prop. list */
+    hid_t gcpl;	       	/* group create prop. list */
+    hid_t ocpypl;	/* object copy prop. list */
+    hid_t ocpl;	        /* object create prop. list */
+    hid_t lcpl;	       	/* link create prop. list */
+    hid_t lapl;	       	/* link access prop. list */
+    hid_t fapl;	       	/* file access prop. list */
+    hid_t fcpl;	       	/* file create prop. list */
+    hid_t strcpl;	/* string create prop. list */
+    hid_t acpl;	       	/* attribute create prop. list */
+
+    hsize_t chunk_size[2] = {16384, 4};	/* chunk size */ 
+    double fill = 2.7f;         /* Fill value */
+    hsize_t max_size[1];        /* data space maximum size */
+    size_t nslots = 521 * 2;
+    size_t nbytes = 1048576 * 10;
+    double w0 = 0.5f;
+    unsigned max_compact;
+    unsigned min_dense;
+    const char* c_to_f = "x+32";
+    H5AC_cache_config_t my_cache_config = {
+        H5AC__CURR_CACHE_CONFIG_VERSION,
+        TRUE,
+        FALSE,
+        FALSE,
+        "temp",
+        TRUE,
+        FALSE,
+        ( 2 * 2048 * 1024),
+        0.3f,
+        (64 * 1024 * 1024),
+        (4 * 1024 * 1024),
+        60000,
+        H5C_incr__threshold,
+        0.8f,
+        3.0f,
+        TRUE,
+        (8 * 1024 * 1024),
+        H5C_flash_incr__add_space,
+        2.0f,
+        0.25f,
+        H5C_decr__age_out_with_threshold,
+        0.997f,
+        0.8f,
+        TRUE,
+        (3 * 1024 * 1024),
+        3,
+        FALSE,
+        0.2f,
+        (256 * 2048),
+        H5AC__DEFAULT_METADATA_WRITE_STRATEGY};
+
+    if(VERBOSE_MED)
+	printf("Encode/Decode DCPLs\n");
+
+    /******* ENCODE/DECODE DCPLS *****/
+    TESTING("Default DCPL Encoding/Decoding");
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding default property list */
+    if(test_encode_decode(dcpl) < 0)
+        FAIL_PUTS_ERROR("Default DCPL encoding/decoding failed\n")
+
+    PASSED();
+
+    TESTING("DCPL Encoding/Decoding");
+
+    if((H5Pset_chunk(dcpl, 2, chunk_size)) < 0)
+        FAIL_STACK_ERROR
+
+    if((H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_LATE)) < 0)
+        FAIL_STACK_ERROR
+
+    if((H5Pset_fill_value(dcpl, H5T_NATIVE_DOUBLE, &fill)) < 0)
+        FAIL_STACK_ERROR
+
+    max_size[0] = 100;
+    if((H5Pset_external(dcpl, "ext1.data", (off_t)0, 
+                         (hsize_t)(max_size[0] * sizeof(int)/4))) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_external(dcpl, "ext2.data", (off_t)0, 
+                         (hsize_t)(max_size[0] * sizeof(int)/4))) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_external(dcpl, "ext3.data", (off_t)0, 
+                         (hsize_t)(max_size[0] * sizeof(int)/4))) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_external(dcpl, "ext4.data", (off_t)0, 
+                         (hsize_t)(max_size[0] * sizeof(int)/4))) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding property list */
+    if(test_encode_decode(dcpl) < 0)
+        FAIL_PUTS_ERROR("DCPL encoding/decoding failed\n")
+        
+    /* release resource */
+    if((H5Pclose(dcpl)) < 0)
+         FAIL_STACK_ERROR
+
+    PASSED();
+
+
+    /******* ENCODE/DECODE DAPLS *****/
+    TESTING("Default DAPL Encoding/Decoding");
+    if((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding default property list */
+    if(test_encode_decode(dapl) < 0)
+        FAIL_PUTS_ERROR("Default DAPL encoding/decoding failed\n")
+
+    PASSED();
+
+    TESTING("DAPL Encoding/Decoding");
+
+    if((H5Pset_chunk_cache(dapl, nslots, nbytes, w0)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding property list */
+    if(test_encode_decode(dapl) < 0)
+        FAIL_PUTS_ERROR("DAPL encoding/decoding failed\n")
+        
+    /* release resource */
+    if((H5Pclose(dapl)) < 0)
+         FAIL_STACK_ERROR
+
+    PASSED();
+
+
+    /******* ENCODE/DECODE OCPLS *****/
+    TESTING("Default OCPL Encoding/Decoding");
+    if((ocpl = H5Pcreate(H5P_OBJECT_CREATE)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding default property list */
+    if(test_encode_decode(ocpl) < 0)
+        FAIL_PUTS_ERROR("Default OCPL encoding/decoding failed\n")
+
+    PASSED();
+
+    TESTING("OCPL Encoding/Decoding");
+
+    if((H5Pset_attr_creation_order(ocpl, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED))) < 0)
+         FAIL_STACK_ERROR
+
+    if((H5Pset_attr_phase_change (ocpl, 110, 105)) < 0)
+         FAIL_STACK_ERROR
+
+    if((H5Pset_filter (ocpl, H5Z_FILTER_FLETCHER32, 0, (size_t)0, NULL)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding property list */
+    if(test_encode_decode(ocpl) < 0)
+        FAIL_PUTS_ERROR("OCPL encoding/decoding failed\n")
+        
+    /* release resource */
+    if((H5Pclose(ocpl)) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED();
+
+
+    /******* ENCODE/DECODE DXPLS *****/
+    TESTING("Default DXPL Encoding/Decoding");
+    if((dxpl = H5Pcreate(H5P_DATASET_XFER)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding default property list */
+    if(test_encode_decode(dxpl) < 0)
+        FAIL_PUTS_ERROR("Default DXPL encoding/decoding failed\n")
+
+    PASSED();
+
+    TESTING("DXPL Encoding/Decoding");
+
+    if((H5Pset_btree_ratios(dxpl, 0.2f, 0.6f, 0.2f)) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_hyper_vector_size(dxpl, 5)) < 0)
+        FAIL_STACK_ERROR
+#ifdef H5_HAVE_PARALLEL
+    if((H5Pset_dxpl_mpio(dxpl, H5FD_MPIO_COLLECTIVE)) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_dxpl_mpio_collective_opt(dxpl, H5FD_MPIO_INDIVIDUAL_IO)) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_dxpl_mpio_chunk_opt(dxpl, H5FD_MPIO_CHUNK_MULTI_IO)) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_dxpl_mpio_chunk_opt_ratio(dxpl, 30)) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_dxpl_mpio_chunk_opt_num(dxpl, 40)) < 0)
+        FAIL_STACK_ERROR
+#endif/* H5_HAVE_PARALLEL */
+    if((H5Pset_edc_check(dxpl, H5Z_DISABLE_EDC)) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_data_transform(dxpl, c_to_f)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding property list */
+    if(test_encode_decode(dxpl) < 0)
+        FAIL_PUTS_ERROR("DXPL encoding/decoding failed\n")
+        
+    /* release resource */
+    if((H5Pclose(dxpl)) < 0)
+         FAIL_STACK_ERROR
+
+    PASSED();
+
+
+    /******* ENCODE/DECODE GCPLS *****/
+    TESTING("Default GCPL Encoding/Decoding");
+    if((gcpl = H5Pcreate(H5P_GROUP_CREATE)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding default property list */
+    if(test_encode_decode(gcpl) < 0)
+        FAIL_PUTS_ERROR("Default GCPL encoding/decoding failed\n")
+
+    PASSED();
+
+    TESTING("GCPL Encoding/Decoding");
+
+    if((H5Pset_local_heap_size_hint(gcpl, 256)) < 0)
+         FAIL_STACK_ERROR
+
+    if((H5Pset_link_phase_change(gcpl, 2, 2)) < 0)
+         FAIL_STACK_ERROR
+
+    /* Query the group creation properties */
+    if((H5Pget_link_phase_change(gcpl, &max_compact, &min_dense)) < 0)
+         FAIL_STACK_ERROR
+
+    if((H5Pset_est_link_info(gcpl, 3, 9)) < 0)
+         FAIL_STACK_ERROR
+
+    if((H5Pset_link_creation_order(gcpl, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED))) < 0)
+         FAIL_STACK_ERROR
+
+    /* Test encoding & decoding property list */
+    if(test_encode_decode(gcpl) < 0)
+        FAIL_PUTS_ERROR("GCPL encoding/decoding failed\n")
+        
+    /* release resource */
+    if((H5Pclose(gcpl)) < 0)
+         FAIL_STACK_ERROR
+
+    PASSED();
+
+
+    /******* ENCODE/DECODE LCPLS *****/
+    TESTING("Default LCPL Encoding/Decoding");
+    if((lcpl = H5Pcreate(H5P_LINK_CREATE)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding default property list */
+    if(test_encode_decode(lcpl) < 0)
+        FAIL_PUTS_ERROR("Default LCPL encoding/decoding failed\n")
+
+    PASSED();
+
+    TESTING("LCPL Encoding/Decoding");
+
+    if((H5Pset_create_intermediate_group(lcpl, TRUE)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding property list */
+    if(test_encode_decode(lcpl) < 0)
+        FAIL_PUTS_ERROR("LCPL encoding/decoding failed\n")
+        
+    /* release resource */
+    if((H5Pclose(lcpl)) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED();
+
+
+    /******* ENCODE/DECODE LAPLS *****/
+    TESTING("Default LAPL Encoding/Decoding");
+    if((lapl = H5Pcreate(H5P_LINK_ACCESS)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding default property list */
+    if(test_encode_decode(lapl) < 0)
+        FAIL_PUTS_ERROR("Default LAPL encoding/decoding failed\n")
+
+    PASSED();
+
+    TESTING("LAPL Encoding/Decoding");
+
+    if((H5Pset_nlinks(lapl, (size_t)134)) < 0)
+        FAIL_STACK_ERROR
+
+    if((H5Pset_elink_acc_flags(lapl, H5F_ACC_RDONLY)) < 0)
+        FAIL_STACK_ERROR
+
+    if((H5Pset_elink_prefix(lapl, "/tmpasodiasod")) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create FAPL for the elink FAPL */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_alignment(fapl, 2, 1024)) < 0)
+        FAIL_STACK_ERROR
+
+    if((H5Pset_elink_fapl(lapl, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the elink's FAPL */
+    if((H5Pclose(fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding property list */
+    if(test_encode_decode(lapl) < 0)
+        FAIL_PUTS_ERROR("LAPL encoding/decoding failed\n")
+        
+    /* release resource */
+    if((H5Pclose(lapl)) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED();
+
+
+    /******* ENCODE/DECODE OCPYPLS *****/
+    TESTING("Default OCPYPL Encoding/Decoding");
+    if((ocpypl = H5Pcreate(H5P_OBJECT_COPY)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding default property list */
+    if(test_encode_decode(ocpypl) < 0)
+        FAIL_PUTS_ERROR("Default OCPYPL encoding/decoding failed\n")
+
+    PASSED();
+
+    TESTING("OCPYPL Encoding/Decoding");
+
+    if((H5Pset_copy_object(ocpypl, H5O_COPY_EXPAND_EXT_LINK_FLAG)) < 0)
+        FAIL_STACK_ERROR
+
+    if((H5Padd_merge_committed_dtype_path(ocpypl, "foo")) < 0)
+        FAIL_STACK_ERROR
+    if((H5Padd_merge_committed_dtype_path(ocpypl, "bar")) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding property list */
+    if(test_encode_decode(ocpypl) < 0)
+        FAIL_PUTS_ERROR("OCPYPL encoding/decoding failed\n")
+        
+    /* release resource */
+    if((H5Pclose(ocpypl)) < 0)
+         FAIL_STACK_ERROR
+
+    PASSED();
+
+
+    /******* ENCODE/DECODE FAPLS *****/
+    TESTING("Default FAPL Encoding/Decoding");
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding default property list */
+    if(test_encode_decode(fapl) < 0)
+        FAIL_PUTS_ERROR("Default FAPL encoding/decoding failed\n")
+
+    PASSED();
+
+    TESTING("FAPL Encoding/Decoding");
+
+    if((H5Pset_family_offset(fapl, 1024)) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_meta_block_size(fapl, 2098452)) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_sieve_buf_size(fapl, 1048576)) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_alignment(fapl, 2, 1024)) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_cache(fapl, 1024, 128, 10485760, 0.3f)) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_elink_file_cache_size(fapl, 10485760)) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_gc_references(fapl, 1)) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_small_data_block_size(fapl, 2048)) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST)) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_fclose_degree(fapl, H5F_CLOSE_WEAK)) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_multi_type(fapl, H5FD_MEM_GHEAP)) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_mdc_config(fapl, &my_cache_config)) < 0)
+        FAIL_STACK_ERROR
+    if((H5Pset_core_write_tracking(fapl, TRUE, 1024 * 1024)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding property list */
+    if(test_encode_decode(fapl) < 0)
+        FAIL_PUTS_ERROR("FAPL encoding/decoding failed\n")
+        
+    /* release resource */
+    if((H5Pclose(fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED();
+
+
+    /******* ENCODE/DECODE FCPLS *****/
+    TESTING("Default FCPL Encoding/Decoding");
+
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding default property list */
+    if(test_encode_decode(fcpl) < 0)
+        FAIL_PUTS_ERROR("Default FCPL encoding/decoding failed\n")
+
+    PASSED();
+
+    TESTING("FCPL Encoding/Decoding");
+
+    if((H5Pset_userblock(fcpl, 1024) < 0))
+         FAIL_STACK_ERROR
+
+    if((H5Pset_istore_k(fcpl, 3) < 0))
+         FAIL_STACK_ERROR
+
+    if((H5Pset_sym_k(fcpl, 4, 5) < 0))
+         FAIL_STACK_ERROR
+
+    if((H5Pset_shared_mesg_nindexes(fcpl, 8) < 0))
+         FAIL_STACK_ERROR
+
+    if((H5Pset_shared_mesg_index(fcpl, 1,  H5O_SHMESG_SDSPACE_FLAG, 32) < 0))
+         FAIL_STACK_ERROR
+
+   if((H5Pset_shared_mesg_phase_change(fcpl, 60, 20) < 0))
+         FAIL_STACK_ERROR
+
+    if((H5Pset_sizes(fcpl, 8, 4) < 0))
+         FAIL_STACK_ERROR
+
+    /* Test encoding & decoding property list */
+    if(test_encode_decode(fcpl) < 0)
+        FAIL_PUTS_ERROR("FCPL encoding/decoding failed\n")
+        
+    /* release resource */
+    if((H5Pclose(fcpl)) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED();
+
+
+    /******* ENCODE/DECODE STRCPLS *****/
+    TESTING("Default STRCPL Encoding/Decoding");
+
+    if((strcpl = H5Pcreate(H5P_STRING_CREATE)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding default property list */
+    if(test_encode_decode(strcpl) < 0)
+        FAIL_PUTS_ERROR("Default STRCPL encoding/decoding failed\n")
+
+    PASSED();
+
+    TESTING("STRCPL Encoding/Decoding");
+
+    if((H5Pset_char_encoding(strcpl, H5T_CSET_UTF8) < 0))
+         FAIL_STACK_ERROR
+
+    /* Test encoding & decoding property list */
+    if(test_encode_decode(strcpl) < 0)
+        FAIL_PUTS_ERROR("STRCPL encoding/decoding failed\n")
+        
+    /* release resource */
+    if((H5Pclose(strcpl)) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED();
+
+
+    /******* ENCODE/DECODE ACPLS *****/
+    TESTING("Default ACPL Encoding/Decoding");
+
+    if((acpl = H5Pcreate(H5P_ATTRIBUTE_CREATE)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test encoding & decoding default property list */
+    if(test_encode_decode(acpl) < 0)
+        FAIL_PUTS_ERROR("Default ACPL encoding/decoding failed\n")
+
+    PASSED();
+
+    TESTING("ACPL Encoding/Decoding");
+
+    if((H5Pset_char_encoding(acpl, H5T_CSET_UTF8) < 0))
+         FAIL_STACK_ERROR
+
+    /* Test encoding & decoding property list */
+    if(test_encode_decode(acpl) < 0)
+        FAIL_PUTS_ERROR("ACPL encoding/decoding failed\n")
+        
+    /* release resource */
+    if((H5Pclose(acpl)) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED();
+
+
+    return 0;
+
+error:
+    printf("***** Plist Encode/Decode tests FAILED! *****\n");
+    return 1;
+}
+
diff --git a/test/enc_dec_plist_cross_platform.c b/test/enc_dec_plist_cross_platform.c
new file mode 100644
index 0000000..a5d5552
--- /dev/null
+++ b/test/enc_dec_plist_cross_platform.c
@@ -0,0 +1,235 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Serial tests for encoding/decoding plists
+ */
+
+#include "h5test.h"
+#include "H5srcdir.h"
+
+#define CONFIG_LE   0x01
+#define CONFIG_64   0x02
+#define NCONFIG     0x04
+
+static int test_plists(const char *filename_prefix);
+
+int
+main(void)
+{
+    if(VERBOSE_MED)
+	printf("Encode/Decode property list endianess\n");
+
+    /******* ENCODE/DECODE DCPLS *****/
+    TESTING("Default DCPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/def_dcpl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+    TESTING("DCPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/dcpl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+
+    /******* ENCODE/DECODE DAPLS *****/
+    TESTING("Default DAPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/def_dapl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+    TESTING("DAPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/dapl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+
+    /******* ENCODE/DECODE DXPLS *****/
+    TESTING("Default DXPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/def_dxpl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+    TESTING("DXPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/dxpl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+
+    /******* ENCODE/DECODE GCPLS *****/
+    TESTING("Default GCPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/def_gcpl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+    TESTING("GCPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/gcpl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+
+    /******* ENCODE/DECODE LCPLS *****/
+    TESTING("Default LCPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/def_lcpl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+    TESTING("LCPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/lcpl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+
+    /******* ENCODE/DECODE LAPLS *****/
+    TESTING("Default LAPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/def_lapl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+    TESTING("LAPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/lapl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+
+    /******* ENCODE/DECODE OCPLS *****/
+    TESTING("Default OCPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/def_ocpl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+    TESTING("OCPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/ocpl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+
+    /******* ENCODE/DECODE OCPYPLS *****/
+    TESTING("Default OCPYPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/def_ocpypl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+    TESTING("OCPYPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/ocpypl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+
+    /******* ENCODE/DECODE FCPLS *****/
+    TESTING("Default FCPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/def_fcpl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+    TESTING("FCPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/fcpl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+
+    /******* ENCODE/DECODE FAPLS *****/
+    TESTING("Default FAPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/def_fapl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+    TESTING("FAPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/fapl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+
+    /******* ENCODE/DECODE STRCPLS *****/
+    TESTING("Default STRCPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/def_strcpl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+    TESTING("STRCPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/strcpl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+
+    /******* ENCODE/DECODE ACPLS *****/
+    TESTING("Default ACPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/def_acpl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+    TESTING("ACPL Encoding/Decoding");
+    if(test_plists("testfiles/plist_files/acpl_") < 0)
+        FAIL_STACK_ERROR
+    PASSED();
+
+    return 0;
+
+error:
+    return 1;
+}
+
+static int
+test_plists(const char *filename_prefix) 
+{
+    unsigned config_1, config_2;
+    int fd_1, fd_2;
+    size_t size_1 = 0, size_2 = 0;
+    void *buf_1 = NULL, *buf_2 = NULL;
+    hid_t plist_1, plist_2;
+    char filename[1024];
+    const char *testfile;
+
+    /* Iterate over all combinations of configurations */
+    for(config_1 = 0; config_1 < (NCONFIG - 1); config_1++)
+        for(config_2 = config_1 + 1; config_2 < NCONFIG; config_2++) {
+            /* Generate filename for file 1 */
+            if(HDsnprintf(filename, sizeof(filename), "%s%s%s", filename_prefix,
+                    config_1 & CONFIG_64 ? "64" : "32",
+                    config_1 & CONFIG_LE ? "le" : "be") < 0)
+                TEST_ERROR
+
+            /* Read file 1 */
+            testfile = H5_get_srcdir_filename(filename);
+            if((fd_1 = HDopen(testfile, O_RDONLY, 0666)) < 0)
+                TEST_ERROR
+            size_1 = (size_t)HDlseek(fd_1, (HDoff_t)0, SEEK_END);
+            HDlseek(fd_1, (HDoff_t)0, SEEK_SET);
+            buf_1 = (void *)HDmalloc(size_1);
+            if(HDread(fd_1, buf_1, size_1) < 0)
+                TEST_ERROR
+            HDclose(fd_1);
+
+            /* Generate filename for file 2 */
+            if(HDsnprintf(filename, sizeof(filename), "%s%s%s", filename_prefix,
+                    config_2 & CONFIG_64 ? "64" : "32",
+                    config_2 & CONFIG_LE ? "le" : "be") < 0)
+                TEST_ERROR
+
+            /* Read file 1 */
+            testfile = H5_get_srcdir_filename(filename);
+            if((fd_2 = HDopen(testfile, O_RDONLY, 0666)) < 0)
+                TEST_ERROR
+            size_2 = (size_t)HDlseek(fd_2, (HDoff_t)0, SEEK_END);
+            HDlseek(fd_2, (HDoff_t)0, SEEK_SET);
+            buf_2 = (void *)HDmalloc(size_2);
+            if(HDread(fd_2, buf_2, size_2) < 0)
+                TEST_ERROR
+            HDclose(fd_2);
+
+            /* Decode property lists */
+            if((plist_1 = H5Pdecode(buf_1)) < 0)
+                FAIL_STACK_ERROR
+            if((plist_2 = H5Pdecode(buf_2)) < 0)
+                FAIL_STACK_ERROR
+
+            /* Compare decoded property lists */
+            if(!H5Pequal(plist_1, plist_2))
+                FAIL_PUTS_ERROR("PLIST encoding/decoding comparison failed\n")
+
+            /* Close */
+            if((H5Pclose(plist_1)) < 0)
+                FAIL_STACK_ERROR
+            if((H5Pclose(plist_2)) < 0)
+                FAIL_STACK_ERROR
+
+            HDfree(buf_1);
+            HDfree(buf_2);
+        } /* end for */
+
+    return 1;
+
+error:
+    printf("***** Plist Encode/Decode tests FAILED! *****\n");
+    return -1;
+}
+
diff --git a/test/err_compat.c b/test/err_compat.c
index 576433e..7779ddc 100644
--- a/test/err_compat.c
+++ b/test/err_compat.c
@@ -500,7 +500,7 @@ main(void)
     }
 
     if(H5Fclose(file) < 0) TEST_ERROR ;
-    h5_cleanup(FILENAME, fapl);
+    h5_clean_files(FILENAME, fapl);
 
     printf("All error API tests passed.\n");
     return 0;
@@ -510,3 +510,4 @@ main(void)
     return 1;
 }
 #endif /* H5_NO_DEPRECATED_SYMBOLS */
+
diff --git a/test/error_test.c b/test/error_test.c
index e712d86..4e4c0ef 100644
--- a/test/error_test.c
+++ b/test/error_test.c
@@ -756,7 +756,7 @@ main(void)
     if(test_filter_error(filename) < 0)
         TEST_ERROR;
 
-    h5_cleanup(FILENAME, fapl);
+    h5_clean_files(FILENAME, fapl);
 
     HDfprintf(stderr, "\nAll error API tests passed.\n");
     return 0;
diff --git a/test/external.c b/test/external.c
index 7e535c3..cbc9fc6 100644
--- a/test/external.c
+++ b/test/external.c
@@ -850,8 +850,7 @@ test_4 (hid_t fapl)
     hid_t xid = -1;
     hid_t xid2 = -1;
     char  filename[1024];		/*file name			*/
-    char  pathname[1024];
-    char *srcdir = getenv("srcdir"); /*where the src code is located*/
+    const char *pathname = H5_get_srcdir_filename(LINKED_FILE); /* Corrected test file name */
 
     TESTING("opening external link twice");
 
@@ -870,14 +869,6 @@ test_4 (hid_t fapl)
     if((gid = H5Gopen2(fid, "/", H5P_DEFAULT)) < 0)
         goto error;
 
-    pathname[0] = '\0';
-    /* Generate correct name for test file by prepending the source path */
-    if(srcdir && ((HDstrlen(srcdir) + HDstrlen(LINKED_FILE) + 1) < sizeof(pathname))) {
-        HDstrcpy(pathname, srcdir);
-        HDstrcat(pathname, "/");
-    }
-    HDstrcat(pathname, LINKED_FILE);
-
     /* Create an external link to an existing file*/
     if(H5Lcreate_external(pathname, "/group", gid, " link", H5P_DEFAULT, H5P_DEFAULT) < 0)
         goto error;
diff --git a/test/family_v16_00000.h5 b/test/family_v16_00000.h5
index ac75ea9..aaa3dad 100644
Binary files a/test/family_v16_00000.h5 and b/test/family_v16_00000.h5 differ
diff --git a/test/farray.c b/test/farray.c
new file mode 100644
index 0000000..50a9856
--- /dev/null
+++ b/test/farray.c
@@ -0,0 +1,1811 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This file is modified based on earray.c.
+ */
+#include "h5test.h"
+
+/*
+ * This file needs to access private datatypes from the H5FA package.
+ * This file also needs to access the fixed array testing code.
+ */
+#define H5FA_FRIEND		/*suppress error about including H5FApkg	  */
+#define H5FA_TESTING
+#include "H5FApkg.h"		/* Fixed Arrays			*/
+
+/* Other private headers that this test requires */
+#include "H5Iprivate.h"		/* IDs			  		*/
+#include "H5VMprivate.h"		/* Vectors and arrays 			*/
+
+
+/* Local macros */
+
+/* Max. testfile name length */
+#define FARRAY_FILENAME_LEN     1024
+
+/* Fixed array creation values */
+#define ELMT_SIZE      	sizeof(uint64_t)
+#define MAX_DBLOCK_PAGE_NELMTS_BITS     10      /* 2^10 = 1024 elements per data block page */
+
+/* Testing # of elements in the Fixed Array */
+#define TEST_NELMTS 	20000
+
+/* Convenience macros for computing earray state */
+#define FA_HDR_SIZE   	28   	/* hard-coded */
+#define DBLOCK_PREFIX   18	/* hard-coded */
+
+/* 4 giga-elements: max chunk size */
+#define MAX_NELMTS 	((unsigned long long)4*1024*1024*1024) /* 4 giga-elements */
+
+/* Iterator parameter values */
+#define FA_CYC_COUNT            4
+
+
+/* Local typedefs */
+
+/* Types of tests to perform */
+typedef enum {
+    FARRAY_TEST_NORMAL,         /* "Normal" test, with no testing parameters set */
+    FARRAY_TEST_REOPEN,         /* Set the reopen_array flag */
+    FARRAY_TEST_NTESTS          /* The number of test types, must be last */
+} farray_test_type_t;
+
+/* Types of iteration to perform */
+typedef enum {
+    FARRAY_ITER_FW,             /* "Forward" iteration */
+    FARRAY_ITER_RV,             /* "Reverse" iteration */
+    FARRAY_ITER_RND,            /* "Random" iteration */
+    FARRAY_ITER_CYC,            /* "Cyclic" iteration */
+    FARRAY_ITER_NITERS          /* The number of iteration types, must be last */
+} farray_iter_type_t;
+
+
+/* Fixed array state information */
+typedef struct farray_state_t {
+    hsize_t hdr_size;           /* Size of header */
+    hsize_t dblk_size;          /* Size of data block */
+    hsize_t nelmts;             /* # of elements */
+} farray_state_t;
+
+/* Forward decl. */
+typedef struct farray_test_param_t farray_test_param_t;
+
+/* Fixed array iterator class */
+typedef struct farray_iter_t {
+    void *(*init)(const H5FA_create_t *cparam, const farray_test_param_t *tparam,
+        hsize_t cnt);           /* Initialize/allocate iterator private info */
+    hssize_t (*next)(void *info);       /* Get the next element to test */
+    herr_t (*term)(void *info); /* Shutdown/free iterator private info */
+} farray_iter_t;
+
+
+/* Testing parameters */
+struct farray_test_param_t {
+    farray_test_type_t reopen_array;    /* Whether to re-open the array during the test */
+    hsize_t	nelmts;			/* # of elements to set for the fixed array */
+    const farray_iter_t *fiter;         /* Iterator to use for this test */
+};
+
+/* Local variables */
+const char *FILENAME[] = {
+    "farray",
+    "farray_tmp",
+    NULL
+};
+
+/* Filename to use for all tests */
+char filename_g[FARRAY_FILENAME_LEN];
+
+/* Empty file size */
+h5_stat_size_t empty_size_g;
+
+

+/*-------------------------------------------------------------------------
+ * Function:	init_cparam
+ *
+ * Purpose:	Initialize array creation parameter structure
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+init_cparam(H5FA_create_t *cparam, farray_test_param_t *tparam)
+{
+    /* Wipe out background */
+    HDmemset(cparam, 0, sizeof(*cparam));
+
+    cparam->cls = H5FA_CLS_TEST;
+    cparam->raw_elmt_size = ELMT_SIZE;
+    cparam->max_dblk_page_nelmts_bits = MAX_DBLOCK_PAGE_NELMTS_BITS;
+    cparam->nelmts = tparam->nelmts;
+
+    return(0);
+} /* init_cparam() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	create_file
+ *
+ * Purpose:	Create file and retrieve pointer to internal file object
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+create_file(hid_t fapl, hid_t *file, H5F_t **f)
+{
+    /* Create the file to work on */
+    if((*file = H5Fcreate(filename_g, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (*f = (H5F_t *)H5I_object(*file)))
+        FAIL_STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if(H5AC_ignore_tags(*f) < 0)
+        FAIL_STACK_ERROR
+
+    /* Success */
+    return(0);
+
+error:
+    return(-1);
+} /* create_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	check_stats
+ *
+ * Purpose:	Verify stats for a fixed array
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+check_stats(const H5FA_t *fa, const farray_state_t *state)
+{
+    H5FA_stat_t farray_stats;           /* Statistics about the array */
+
+    /* Get statistics for fixed array and verify they are correct */
+    if(H5FA_get_stats(fa, &farray_stats) < 0)
+        FAIL_STACK_ERROR
+
+    /* Compare information */
+    if(farray_stats.hdr_size != state->hdr_size) {
+        HDfprintf(stdout, "farray_stats.hdr_size = %Hu, state->hdr_size = %Hu\n",
+	    farray_stats.hdr_size, state->hdr_size);
+        TEST_ERROR
+    } /* end if */
+
+    if(farray_stats.dblk_size != state->dblk_size) {
+        HDfprintf(stdout, "farray_stats.dblk_size = %Hu, state->dblk_size = %Hu\n",
+	    farray_stats.dblk_size, state->dblk_size);
+        TEST_ERROR
+    } /* end if */
+
+    if(farray_stats.nelmts != state->nelmts) {
+        HDfprintf(stdout, "farray_stats.nelmts = %Hu, state->nelmts = %Hu\n",
+	    farray_stats.nelmts, state->nelmts);
+        TEST_ERROR
+    } /* end if */
+
+    /* All tests passed */
+    return(0);
+
+error:
+    return(-1);
+} /* check_stats() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	set_fa_state
+ *
+ * Purpose:	Set the state of the Fixed Array
+ *
+ * Return:	does not fail
+ *
+ * Programmer:	Vailin Choi; 5th August, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+set_fa_state(const H5FA_create_t *cparam, farray_state_t *state)
+{
+    size_t dblk_page_nelmts;			/* # of elements per page */
+
+    /* Sanity check */
+    HDassert(cparam);
+    HDassert(state);
+
+    /* Compute the state of the fixed array */
+    state->hdr_size = FA_HDR_SIZE;
+    state->nelmts = cparam->nelmts;
+
+    dblk_page_nelmts = (size_t)1 << cparam->max_dblk_page_nelmts_bits;
+    if(state->nelmts > dblk_page_nelmts) {
+	size_t npages = (size_t)(((state->nelmts + dblk_page_nelmts) - 1) / dblk_page_nelmts);
+	size_t dblk_page_init_size = (npages + 7) / 8;
+	hsize_t checksum_size = npages * 4;
+
+	state->dblk_size = DBLOCK_PREFIX + dblk_page_init_size + checksum_size +
+			    state->nelmts * cparam->raw_elmt_size;
+    } else
+	state->dblk_size = DBLOCK_PREFIX + state->nelmts * cparam->raw_elmt_size;
+
+    return(0);
+} /* end set_fa_state() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	reopen_file
+ *
+ * Purpose:	Perform common "re-open" operations on file & array for testing
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+reopen_file(hid_t *file, H5F_t **f, hid_t fapl, hid_t dxpl,
+    H5FA_t **fa, haddr_t fa_addr, const farray_test_param_t *tparam)
+{
+    /* Check for closing & re-opening the array */
+    /* (actually will close & re-open the file as well) */
+    if(tparam->reopen_array) {
+        /* Close array, if given */
+        if(fa && *fa) {
+            if(H5FA_close(*fa, dxpl) < 0)
+                FAIL_STACK_ERROR
+            *fa = NULL;
+        } /* end if */
+
+        /* Close file */
+        if(*file) {
+            if(H5Fclose(*file) < 0)
+                FAIL_STACK_ERROR
+            *file = (-1);
+            *f = NULL;
+        } /* end if */
+
+        /* Re-open the file */
+        if((*file = H5Fopen(filename_g, H5F_ACC_RDWR, fapl)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Get a pointer to the internal file object */
+        if(NULL == (*f = (H5F_t *)H5I_object(*file)))
+            FAIL_STACK_ERROR
+
+        /* Ignore metadata tags in the file's cache */
+        if(H5AC_ignore_tags(*f) < 0)
+            FAIL_STACK_ERROR
+
+        /* Re-open array, if given */
+        if(fa)
+            if(NULL == (*fa = H5FA_open(*f, dxpl, fa_addr, NULL)))
+                FAIL_STACK_ERROR
+    } /* end if */
+
+    /* Success */
+    return(0);
+
+error:
+    return(-1);
+} /* reopen_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	create_array
+ *
+ * Purpose:	Create a fixed array and perform initial checks
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+create_array(H5F_t *f, hid_t dxpl, const H5FA_create_t *cparam,
+    H5FA_t **fa, haddr_t *fa_addr)
+{
+    farray_state_t state;               /* State of extensible array */
+
+    /* Create array */
+    if(NULL == (*fa = H5FA_create(f, dxpl, cparam, NULL)))
+        FAIL_STACK_ERROR
+
+    /* Check status of array */
+    if(H5FA_get_addr(*fa, fa_addr) < 0)
+        FAIL_STACK_ERROR
+    if(!H5F_addr_defined(*fa_addr))
+        TEST_ERROR
+    HDmemset(&state, 0, sizeof(state));
+    state.hdr_size = FA_HDR_SIZE;
+    state.nelmts = cparam->nelmts;
+    if(check_stats(*fa, &state))
+        TEST_ERROR
+
+    /* Success */
+    return(0);
+
+error:
+    return(-1);
+} /* create_array() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	verify_cparam
+ *
+ * Purpose:	Verify creation parameters are correct
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+verify_cparam(const H5FA_t *fa, const H5FA_create_t *cparam)
+{
+    H5FA_create_t test_cparam;          /* Creation parameters for array */
+
+    /* Retrieve creation parameters */
+    HDmemset(&test_cparam, 0, sizeof(H5FA_create_t));
+    if(H5FA_get_cparam_test(fa, &test_cparam) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify creation parameters */
+    if(H5FA_cmp_cparam_test(cparam, &test_cparam))
+        TEST_ERROR
+
+    /* Success */
+    return(0);
+
+error:
+    return(-1);
+} /* verify_cparam() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	finish
+ *
+ * Purpose:	Close array, delete array, close file and verify that file
+ *              is empty size
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+finish(hid_t file, hid_t fapl, H5F_t *f, H5FA_t *fa, haddr_t fa_addr)
+{
+    h5_stat_size_t file_size;           /* File size, after deleting array */
+
+    /* Close the fixed array */
+    if(H5FA_close(fa, H5P_DATASET_XFER_DEFAULT) < 0)
+        FAIL_STACK_ERROR
+
+    /* Delete array */
+    if(H5FA_delete(f, H5P_DATASET_XFER_DEFAULT, fa_addr, NULL) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get the size of the file */
+    if((file_size = h5_get_file_size(filename_g, fapl)) < 0)
+        TEST_ERROR
+
+    /* Verify the file is correct size */
+    if(file_size != empty_size_g)
+        TEST_ERROR
+
+    /* Success */
+    return(0);
+
+error:
+    return(-1);
+} /* finish() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	test_create
+ *
+ * Purpose:	Test creating fixed array
+ *
+ * Return:	Success: 0
+ *		Failure: 1
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_create(hid_t fapl, H5FA_create_t *cparam, farray_test_param_t H5_ATTR_UNUSED *tparam)
+{
+    hid_t	file = -1;              /* File ID */
+    H5F_t	*f = NULL;              /* Internal file object pointer */
+    H5FA_t      *fa = NULL;             /* Fixed array wrapper */
+    haddr_t     fa_addr = HADDR_UNDEF;  /* Array address in file */
+
+    /* Create file & retrieve pointer to internal file object */
+    if(create_file(fapl, &file, &f) < 0)
+        TEST_ERROR
+
+    /*
+     * Display testing message
+     */
+    TESTING("invalid fixed array creation parameters");
+
+#ifndef NDEBUG
+{
+    H5FA_create_t test_cparam;          /* Creation parameters for array */
+
+    /* Set invalid element size */
+    HDmemcpy(&test_cparam, cparam, sizeof(test_cparam));
+    test_cparam.raw_elmt_size = 0;
+    H5E_BEGIN_TRY {
+        fa = H5FA_create(f, H5P_DATASET_XFER_DEFAULT, &test_cparam, NULL);
+    } H5E_END_TRY;
+    if(fa) {
+        /* Close opened fixed array */
+        H5FA_close(fa, H5P_DATASET_XFER_DEFAULT);
+        fa = NULL;
+
+        /* Indicate error */
+        TEST_ERROR
+    } /* end if */
+
+    /* Set invalid max. # of elements bits */
+    HDmemcpy(&test_cparam, cparam, sizeof(test_cparam));
+    test_cparam.max_dblk_page_nelmts_bits = 0;
+    H5E_BEGIN_TRY {
+        fa = H5FA_create(f, H5P_DATASET_XFER_DEFAULT, &test_cparam, NULL);
+    } H5E_END_TRY;
+    if(fa) {
+        /* Close opened fixed array */
+        H5FA_close(fa, H5P_DATASET_XFER_DEFAULT);
+        fa = NULL;
+
+        /* Indicate error */
+        TEST_ERROR
+    } /* end if */
+
+    /* Set invalid max. # of elements */
+    HDmemcpy(&test_cparam, cparam, sizeof(test_cparam));
+    test_cparam.nelmts = 0;
+    H5E_BEGIN_TRY {
+        fa = H5FA_create(f, H5P_DATASET_XFER_DEFAULT, &test_cparam, NULL);
+    } H5E_END_TRY;
+    if(fa) {
+        /* Close opened fixed array */
+        H5FA_close(fa, H5P_DATASET_XFER_DEFAULT);
+        fa = NULL;
+
+        /* Indicate error */
+        TEST_ERROR
+    } /* end if */
+
+    PASSED()
+}
+#else /* NDEBUG */
+    SKIPPED();
+    puts("    Not tested when assertions are disabled");
+#endif /* NDEBUG */
+
+    /*
+     * Display testing message
+     */
+    TESTING("fixed array creation");
+
+    /* Create array */
+    if(create_array(f, H5P_DATASET_XFER_DEFAULT, cparam, &fa, &fa_addr) < 0)
+        TEST_ERROR
+
+    PASSED()
+
+    /* Verify the creation parameters */
+    TESTING("verify array creation parameters");
+
+    /* Verify the creation parameters */
+    if(verify_cparam(fa, cparam) < 0)
+        TEST_ERROR
+
+    /* Close array, delete array, close file & verify file is empty */
+    if(finish(file, fapl, f, fa, fa_addr) < 0)
+        TEST_ERROR
+
+    /* All tests passed */
+    PASSED()
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        if(fa)
+            H5FA_close(fa, H5P_DATASET_XFER_DEFAULT);
+	H5Fclose(file);
+    } H5E_END_TRY;
+
+    return 1;
+} /* end test_create() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	test_reopen
+ *
+ * Purpose:	Create & reopen a fixed array
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_reopen(hid_t fapl, H5FA_create_t *cparam, farray_test_param_t *tparam)
+{
+    hid_t	file = -1;              /* File ID */
+    H5F_t	*f = NULL;              /* Internal file object pointer */
+    H5FA_t      *fa = NULL;             /* Fixed array wrapper */
+    haddr_t     fa_addr = HADDR_UNDEF;  /* Array address in file */
+
+    /* Create file & retrieve pointer to internal file object */
+    if(create_file(fapl, &file, &f) < 0)
+        TEST_ERROR
+
+    /*
+     * Display testing message
+     */
+    TESTING("create, close & reopen fixed array");
+
+    /* Create array */
+    if(create_array(f, H5P_DATASET_XFER_DEFAULT, cparam, &fa, &fa_addr) < 0)
+        TEST_ERROR
+
+    /* Close the fixed array */
+    if(H5FA_close(fa, H5P_DATASET_XFER_DEFAULT) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check for closing & re-opening the file */
+    if(reopen_file(&file, &f, fapl, H5P_DATASET_XFER_DEFAULT, NULL, HADDR_UNDEF, tparam) < 0)
+        TEST_ERROR
+
+    /* Re-open the array */
+    if(NULL == (fa = H5FA_open(f, H5P_DATASET_XFER_DEFAULT, fa_addr, NULL)))
+        FAIL_STACK_ERROR
+
+    /* Verify the creation parameters */
+    if(verify_cparam(fa, cparam) < 0)
+        TEST_ERROR
+
+    /* Close array, delete array, close file & verify file is empty */
+    if(finish(file, fapl, f, fa, fa_addr) < 0)
+        TEST_ERROR
+
+    /* All tests passed */
+    PASSED()
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        if(fa)
+            H5FA_close(fa, H5P_DATASET_XFER_DEFAULT);
+	H5Fclose(file);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_reopen() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	test_open_twice
+ *
+ * Purpose:	Open an extensible array twice
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_open_twice(hid_t fapl, H5FA_create_t *cparam, farray_test_param_t *tparam)
+{
+    hid_t	file = -1;              /* File ID */
+    hid_t	file2 = -1;             /* File ID */
+    H5F_t	*f = NULL;              /* Internal file object pointer */
+    H5F_t	*f2 = NULL;             /* Internal file object pointer */
+    H5FA_t      *fa = NULL;             /* Fixed array wrapper */
+    H5FA_t      *fa2 = NULL;            /* Fixed array wrapper */
+    haddr_t     fa_addr = HADDR_UNDEF;  /* Array address in file */
+
+    /* Create file & retrieve pointer to internal file object */
+    if(create_file(fapl, &file, &f) < 0)
+        TEST_ERROR
+
+    /*
+     * Display testing message
+     */
+    TESTING("open fixed array twice");
+
+    /* Create array */
+    if(create_array(f, H5P_DATASET_XFER_DEFAULT, cparam, &fa, &fa_addr) < 0)
+        TEST_ERROR
+
+    /* Open the array again, through the first file handle */
+    if(NULL == (fa2 = H5FA_open(f, H5P_DATASET_XFER_DEFAULT, fa_addr, NULL)))
+        FAIL_STACK_ERROR
+
+    /* Verify the creation parameters */
+    if(verify_cparam(fa, cparam) < 0)
+        TEST_ERROR
+    if(verify_cparam(fa2, cparam) < 0)
+        TEST_ERROR
+
+    /* Close the second fixed array wrapper */
+    if(H5FA_close(fa2, H5P_DATASET_XFER_DEFAULT) < 0)
+        FAIL_STACK_ERROR
+    fa2 = NULL;
+
+    /* Check for closing & re-opening the file */
+    if(reopen_file(&file, &f, fapl, H5P_DATASET_XFER_DEFAULT, &fa, fa_addr, tparam) < 0)
+        TEST_ERROR
+
+    /* Re-open the file */
+    if((file2 = H5Freopen(file)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f2 = (H5F_t *)H5I_object(file2)))
+        FAIL_STACK_ERROR
+
+    /* Open the fixed array through the second file handle */
+    if(NULL == (fa2 = H5FA_open(f2, H5P_DATASET_XFER_DEFAULT, fa_addr, NULL)))
+        FAIL_STACK_ERROR
+
+    /* Verify the creation parameters */
+    if(verify_cparam(fa, cparam) < 0)
+        TEST_ERROR
+
+    /* Close the first extensible array wrapper */
+    if(H5FA_close(fa, H5P_DATASET_XFER_DEFAULT) < 0)
+        FAIL_STACK_ERROR
+    fa = NULL;
+
+    /* Close the first file */
+    /* (close before second file, to detect error on internal array header's
+     *  shared file information)
+     */
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close array, delete array, close file & verify file is empty */
+    if(finish(file2, fapl, f2, fa2, fa_addr) < 0)
+        TEST_ERROR
+
+    /* All tests passed */
+    PASSED()
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        if(fa)
+            H5FA_close(fa, H5P_DATASET_XFER_DEFAULT);
+        if(fa2)
+            H5FA_close(fa2, H5P_DATASET_XFER_DEFAULT);
+	H5Fclose(file);
+	H5Fclose(file2);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_open_twice() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	test_open_twice_diff
+ *
+ * Purpose:	Open a fixed array twice, through different "top" file
+ *              handles, with an intermediate file open that takes the "shared"
+ *              file handle from the first fixed array's file pointer.
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:	Quincey Koziol
+ *              Friday, December 18, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_open_twice_diff(hid_t fapl, H5FA_create_t *cparam, farray_test_param_t *tparam)
+{
+    char        filename_tmp[FARRAY_FILENAME_LEN];      /* Temporary file name */
+    hid_t	file = -1;              /* File ID */
+    hid_t	file2 = -1;             /* File ID */
+    hid_t	file0 = -1;             /* File ID */
+    hid_t	file00 = -1;            /* File ID */
+    H5F_t	*f = NULL;              /* Internal file object pointer */
+    H5F_t	*f2 = NULL;             /* Internal file object pointer */
+    H5FA_t      *fa = NULL;             /* Fixed array wrapper */
+    H5FA_t      *fa2 = NULL;            /* Fixed array wrapper */
+    haddr_t     fa_addr = HADDR_UNDEF;  /* Array address in file */
+
+    /*
+     * Display testing message
+     */
+    TESTING("open fixed array twice, through different file handles");
+
+    /* Create file & retrieve pointer to internal file object */
+    if(create_file(fapl, &file, &f) < 0)
+        TEST_ERROR
+
+    /* Create array */
+    if(create_array(f, H5P_DATASET_XFER_DEFAULT, cparam, &fa, &fa_addr) < 0)
+        TEST_ERROR
+
+    /* Open the array again, through the first file handle */
+    if(NULL == (fa2 = H5FA_open(f, H5P_DATASET_XFER_DEFAULT, fa_addr, NULL)))
+        FAIL_STACK_ERROR
+
+    /* Verify the creation parameters */
+    if(verify_cparam(fa, cparam) < 0)
+        TEST_ERROR
+    if(verify_cparam(fa2, cparam) < 0)
+        TEST_ERROR
+
+    /* Close the second fixed array wrapper */
+    if(H5FA_close(fa2, H5P_DATASET_XFER_DEFAULT) < 0)
+        FAIL_STACK_ERROR
+    fa2 = NULL;
+
+    /* Re-open the file */
+    /* (So that there is something holding the file open when the extensible
+     *  array is closed)
+     */
+    if((file0 = H5Fopen(filename_g, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check for closing & re-opening the file */
+    if(reopen_file(&file, &f, fapl, H5P_DATASET_XFER_DEFAULT, &fa, fa_addr, tparam) < 0)
+        TEST_ERROR
+
+    /* Close the first fixed array wrapper */
+    if(H5FA_close(fa, H5P_DATASET_XFER_DEFAULT) < 0)
+        FAIL_STACK_ERROR
+    fa = NULL;
+
+    /* Close the first file */
+    /* (close before second file, to detect error on internal array header's
+     *  shared file information)
+     */
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+    file = -1;
+
+    /* Open a different file */
+    /* (This re-allocates the 'top' file pointer and assigns it a different
+     *  'shared' file pointer, making the file pointer in the fixed array's
+     *  header stale)
+     */
+    h5_fixname(FILENAME[1], fapl, filename_tmp, sizeof(filename_tmp));
+    if((file00 = H5Fcreate(filename_tmp, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+
+    /* Re-open the file with the fixed array */
+    if((file2 = H5Fopen(filename_g, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f2 = (H5F_t *)H5I_object(file2)))
+        FAIL_STACK_ERROR
+
+    /* Open the fixed array through the second file handle */
+    if(NULL == (fa2 = H5FA_open(f2, H5P_DATASET_XFER_DEFAULT, fa_addr, NULL)))
+        FAIL_STACK_ERROR
+
+    /* Verify the creation parameters */
+    if(verify_cparam(fa2, cparam) < 0)
+        TEST_ERROR
+
+    /* Close the extra file handles */
+    if(H5Fclose(file0) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(file00) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close array, delete array, close file & verify file is empty */
+    if(finish(file2, fapl, f2, fa2, fa_addr) < 0)
+        TEST_ERROR
+
+    /* All tests passed */
+    PASSED()
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        if(fa)
+            H5FA_close(fa, H5P_DATASET_XFER_DEFAULT);
+        if(fa2)
+            H5FA_close(fa2, H5P_DATASET_XFER_DEFAULT);
+	H5Fclose(file);
+	H5Fclose(file2);
+	H5Fclose(file0);
+	H5Fclose(file00);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_open_twice_diff() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	test_delete_open
+ *
+ * Purpose:	Delete opened fixed array (& open deleted array)
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_delete_open(hid_t fapl, H5FA_create_t *cparam, farray_test_param_t *tparam)
+{
+    hid_t	file = -1;              /* File ID */
+    H5F_t	*f = NULL;              /* Internal file object pointer */
+    H5FA_t      *fa = NULL;             /* Fixed array wrapper */
+    H5FA_t      *fa2 = NULL;            /* Fixed array wrapper */
+    haddr_t     fa_addr = HADDR_UNDEF;  /* Array address in file */
+    h5_stat_size_t file_size;           /* File size, after deleting array */
+
+    /* Create file & retrieve pointer to internal file object */
+    if(create_file(fapl, &file, &f) < 0)
+        TEST_ERROR
+
+    /*
+     * Display testing message
+     */
+    TESTING("deleting open fixed array");
+
+    /* Create array */
+    if(create_array(f, H5P_DATASET_XFER_DEFAULT, cparam, &fa, &fa_addr) < 0)
+        TEST_ERROR
+
+    /* Open the array again */
+    if(NULL == (fa2 = H5FA_open(f, H5P_DATASET_XFER_DEFAULT, fa_addr, NULL)))
+        FAIL_STACK_ERROR
+
+    /* Request that the array be deleted */
+    if(H5FA_delete(f, H5P_DATASET_XFER_DEFAULT, fa_addr, NULL) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify the creation parameters */
+    if(verify_cparam(fa, cparam) < 0)
+        TEST_ERROR
+    if(verify_cparam(fa2, cparam) < 0)
+        TEST_ERROR
+
+    /* Close the second fixed array wrapper */
+    if(H5FA_close(fa2, H5P_DATASET_XFER_DEFAULT) < 0)
+        FAIL_STACK_ERROR
+    fa2 = NULL;
+
+    /* Try re-opening the array again (should fail, as array will be deleted) */
+    H5E_BEGIN_TRY {
+        fa2 = H5FA_open(f, H5P_DATASET_XFER_DEFAULT, fa_addr, NULL);
+    } H5E_END_TRY;
+    if(fa2) {
+        /* Close opened array */
+        H5FA_close(fa2, H5P_DATASET_XFER_DEFAULT);
+
+        /* Indicate error */
+        TEST_ERROR
+    } /* end if */
+
+    /* Close the first fixed array wrapper */
+    if(H5FA_close(fa, H5P_DATASET_XFER_DEFAULT) < 0)
+        FAIL_STACK_ERROR
+    fa = NULL;
+
+    /* Check for closing & re-opening the file */
+    if(reopen_file(&file, &f, fapl, H5P_DATASET_XFER_DEFAULT, NULL, HADDR_UNDEF, tparam) < 0)
+        TEST_ERROR
+
+    /* Try re-opening the array again (should fail, as array is now deleted) */
+    H5E_BEGIN_TRY {
+        fa = H5FA_open(f, H5P_DATASET_XFER_DEFAULT, fa_addr, NULL);
+    } H5E_END_TRY;
+    if(fa) {
+        /* Close opened array */
+        H5FA_close(fa, H5P_DATASET_XFER_DEFAULT);
+
+        /* Indicate error */
+        TEST_ERROR
+    } /* end if */
+
+    /* Close the file */
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get the size of the file */
+    if((file_size = h5_get_file_size(filename_g, fapl)) < 0)
+        TEST_ERROR
+
+    /* Verify the file is correct size */
+    if(file_size != empty_size_g)
+        TEST_ERROR
+
+    /* All tests passed */
+    PASSED()
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        if(fa)
+            H5FA_close(fa, H5P_DATASET_XFER_DEFAULT);
+        if(fa2)
+            H5FA_close(fa2, H5P_DATASET_XFER_DEFAULT);
+	H5Fclose(file);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_delete_open() */
+
+/* Fixed array iterator info for forward iteration */
+typedef struct fiter_fw_t {
+    hsize_t idx;        /* Index of next array location */
+} fiter_fw_t;
+
+

+/*-------------------------------------------------------------------------
+ * Function:	fiter_fw_init
+ *
+ * Purpose:	Initialize element interator (forward iteration)
+ *
+ * Return:	Success:	Pointer to iteration status object
+ *		Failure:	NULL
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+fiter_fw_init(const H5FA_create_t H5_ATTR_UNUSED *cparam, const farray_test_param_t H5_ATTR_UNUSED *tparam,
+    hsize_t H5_ATTR_UNUSED cnt)
+{
+    fiter_fw_t *fiter;          /* Forward element iteration object */
+
+    /* Allocate space for the element iteration object */
+    fiter = (fiter_fw_t *)HDmalloc(sizeof(fiter_fw_t));
+    HDassert(fiter);
+
+    /* Initialize the element iteration object */
+    fiter->idx = 0;
+
+    /* Return iteration object */
+    return(fiter);
+} /* end fiter_fw_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	fiter_fw_next
+ *
+ * Purpose:	Get next element index (forward iteration)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ *-------------------------------------------------------------------------
+ */
+static hssize_t
+fiter_fw_next(void *_fiter)
+{
+    fiter_fw_t *fiter = (fiter_fw_t *)_fiter;
+    hssize_t ret_val;
+
+    /* Sanity check */
+    HDassert(fiter);
+
+    /* Get the next array index to test */
+    ret_val = (hssize_t)fiter->idx++;
+
+    return(ret_val);
+} /* end fiter_fw_next() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	fiter_term
+ *
+ * Purpose:	Shut down element interator (simple iterators)
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+fiter_term(void *fiter)
+{
+    /* Sanity check */
+    HDassert(fiter);
+
+    /* Free iteration object */
+    HDfree(fiter);
+
+    return(0);
+} /* end fiter_term() */
+
+/* Fixed array iterator class for forward iteration */
+static const farray_iter_t fa_iter_fw = {
+    fiter_fw_init,              /* Iterator init */
+    fiter_fw_next,              /* Next array index */
+    fiter_term               	/* Iterator term */
+};
+
+/* Fixed array iterator info for reverse iteration */
+typedef struct fiter_rv_t {
+    hsize_t idx;                        /* Index of next array location */
+} fiter_rv_t;
+
+

+/*-------------------------------------------------------------------------
+ * Function:	fiter_rv_init
+ *
+ * Purpose:	Initialize element interator (reverse iteration)
+ *
+ * Return:	Success:	Pointer to iteration status object
+ *		Failure:	NULL
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+fiter_rv_init(const H5FA_create_t *cparam, const farray_test_param_t H5_ATTR_UNUSED *tparam,
+    hsize_t H5_ATTR_UNUSED cnt)
+{
+    fiter_rv_t *fiter;          /* Reverse element iteration object */
+
+    /* Allocate space for the element iteration object */
+    fiter = (fiter_rv_t *)HDmalloc(sizeof(fiter_rv_t));
+    HDassert(fiter);
+
+    /* Initialize reverse iteration info */
+    fiter->idx = cparam->nelmts - 1;
+
+    /* Return iteration object */
+    return(fiter);
+} /* end fiter_rv_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	fiter_rv_next
+ *
+ * Purpose:	Get next element index (reverse iteration)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ *-------------------------------------------------------------------------
+ */
+static hssize_t
+fiter_rv_next(void *_fiter)
+{
+    fiter_rv_t *fiter = (fiter_rv_t *)_fiter;
+    hssize_t ret_val;
+
+    /* Sanity check */
+    HDassert(fiter);
+
+    /* Get the next array index to test */
+    ret_val = (hssize_t)fiter->idx--;
+
+    return(ret_val);
+} /* end fiter_rv_next() */
+
+/* Fixed array iterator class for reverse iteration */
+static const farray_iter_t fa_iter_rv = {
+    fiter_rv_init,              /* Iterator init */
+    fiter_rv_next,              /* Next array index */
+    fiter_term               	/* Iterator term */
+};
+
+/* Fixed array iterator info for random iteration */
+typedef struct fiter_rnd_t {
+    hsize_t pos;                /* Position in shuffled array */
+    hsize_t *idx;               /* Array of shuffled indices */
+} fiter_rnd_t;
+
+

+/*-------------------------------------------------------------------------
+ * Function:	fiter_rnd_init
+ *
+ * Purpose:	Initialize element interator (random iteration)
+ *
+ * Return:	Success:	Pointer to iteration status object
+ *		Failure:	NULL
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+fiter_rnd_init(const H5FA_create_t H5_ATTR_UNUSED *cparam, const farray_test_param_t H5_ATTR_UNUSED *tparam,
+    hsize_t cnt)
+{
+    fiter_rnd_t *fiter;         /* Random element iteration object */
+    size_t u;                   /* Local index variable */
+
+    /* Allocate space for the element iteration object */
+    fiter = (fiter_rnd_t *)HDmalloc(sizeof(fiter_rnd_t));
+    HDassert(fiter);
+
+    /* Allocate space for the array of shuffled indices */
+    fiter->idx = (hsize_t *)HDmalloc(sizeof(hsize_t) * (size_t)cnt);
+    HDassert(fiter->idx);
+
+    /* Initialize reverse iteration info */
+    fiter->pos = 0;
+    for(u = 0; u < (size_t)cnt; u++)
+        fiter->idx[u] = (hsize_t)u;
+
+    /* Randomly shuffle array indices */
+    if(cnt > 1) {
+        for(u = 0; u < (size_t)cnt; u++) {
+            size_t swap_idx;            /* Location to swap with when shuffling */
+            hsize_t temp_idx;           /* Temporary index */
+
+            swap_idx = ((size_t)HDrandom() % ((size_t)cnt - u)) + u;
+            temp_idx = fiter->idx[u];
+            fiter->idx[u] = fiter->idx[swap_idx];
+            fiter->idx[swap_idx] = temp_idx;
+        } /* end for */
+    } /* end if */
+
+    /* Return iteration object */
+    return(fiter);
+} /* end fiter_rnd_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	fiter_rnd_next
+ *
+ * Purpose:	Get next element index (random iteration)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ *-------------------------------------------------------------------------
+ */
+static hssize_t
+fiter_rnd_next(void *_fiter)
+{
+    fiter_rnd_t *fiter = (fiter_rnd_t *)_fiter;
+    hssize_t ret_val;
+
+    /* Sanity check */
+    HDassert(fiter);
+
+    /* Get the next array index to test */
+    ret_val = (hssize_t)fiter->idx[fiter->pos];
+    fiter->pos++;
+
+    return(ret_val);
+} /* end fiter_rnd_next() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	fiter_rnd_term
+ *
+ * Purpose:	Shut down element interator (random iteration)
+ *
+ * Return:	Success:	0
+ *		Failure:	-1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+fiter_rnd_term(void *_fiter)
+{
+    fiter_rnd_t *fiter = (fiter_rnd_t *)_fiter;
+
+    /* Sanity check */
+    HDassert(fiter);
+    HDassert(fiter->idx);
+
+    /* Free shuffled index array */
+    HDfree(fiter->idx);
+
+    /* Free iteration object */
+    HDfree(fiter);
+
+    return(0);
+} /* end fiter_rnd_term() */
+
+/* Fixed array iterator class for random iteration */
+static const farray_iter_t fa_iter_rnd = {
+    fiter_rnd_init,             /* Iterator init */
+    fiter_rnd_next,             /* Next array index */
+    fiter_rnd_term              /* Iterator term */
+};
+
+/* Fixed array iterator info for cyclic iteration */
+typedef struct fiter_cyc_t {
+    hsize_t pos;                /* Position in shuffled array */
+    hsize_t cnt;                /* # of elements to store */
+    hsize_t cyc;                /* Cycle of elements to choose from */
+} fiter_cyc_t;
+
+

+/*-------------------------------------------------------------------------
+ * Function:	fiter_cyc_init
+ *
+ * Purpose:	Initialize element interator (cyclic iteration)
+ *
+ * Return:	Success:	Pointer to iteration status object
+ *		Failure:	NULL
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+fiter_cyc_init(const H5FA_create_t H5_ATTR_UNUSED *cparam, const farray_test_param_t H5_ATTR_UNUSED *tparam,
+    hsize_t cnt)
+{
+    fiter_cyc_t *fiter;         /* Cyclic element iteration object */
+
+    /* Allocate space for the element iteration object */
+    fiter = (fiter_cyc_t *)HDmalloc(sizeof(fiter_cyc_t));
+    HDassert(fiter);
+
+    /* Initialize reverse iteration info */
+    fiter->pos = 0;
+    fiter->cnt = cnt;
+    fiter->cyc = 0;
+
+    /* Return iteration object */
+    return(fiter);
+} /* end fiter_cyc_init() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	fiter_cyc_next
+ *
+ * Purpose:	Get next element index (cyclic iteration)
+ *
+ * Return:	Success:	Non-negative
+ *		Failure:	Negative
+ *
+ *-------------------------------------------------------------------------
+ */
+static hssize_t
+fiter_cyc_next(void *_fiter)
+{
+    fiter_cyc_t *fiter = (fiter_cyc_t *)_fiter;
+    hssize_t ret_val;
+
+    /* Sanity check */
+    HDassert(fiter);
+
+    /* Get the next array index to test */
+    ret_val = (hssize_t)fiter->pos;
+    fiter->pos += FA_CYC_COUNT;
+    if(fiter->pos >= fiter->cnt)
+        fiter->pos = ++fiter->cyc;
+
+    return(ret_val);
+} /* end fiter_cyc_next() */
+
+
+/* Fixed array iterator class for cyclic iteration */
+static const farray_iter_t fa_iter_cyc = {
+    fiter_cyc_init,             /* Iterator init */
+    fiter_cyc_next,             /* Next array index */
+    fiter_term              	/* Iterator term */
+};
+
+

+/*-------------------------------------------------------------------------
+ * Function:	check_elmt
+ *
+ * Purpose:	Check whether _relmt is the same as in _welmt
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:  Vailin Choi; 6th August, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+check_elmt(void *_relmt, void *_welmt)
+{
+    uint64_t *relmt = (uint64_t *)_relmt;
+    uint64_t *welmt = (uint64_t *)_welmt;
+
+    if(welmt == NULL) { /* check for fill value */
+        if(*relmt != H5FA_TEST_FILL)
+            TEST_ERROR
+    } /* end if */
+    else {
+        if(*relmt != *welmt)
+            TEST_ERROR
+    } /* end else */
+
+    return(0);
+
+error:
+    return(-1);
+} /* end check_elmt() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	test_set_elmts
+ *
+ * Purpose:	Set all elements from 0 to ('nelmts' - 1) in fixed array
+ *		("nelmts" is the # of elements to be set in the fixed array)
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_set_elmts(hid_t fapl, H5FA_create_t *cparam, farray_test_param_t *tparam,
+    hsize_t nelmts, const char *test_str)
+{
+    hid_t	file = -1;              /* File ID */
+    H5F_t	*f = NULL;              /* Internal file object pointer */
+    H5FA_t      *fa = NULL;             /* Fixed array wrapper */
+    void        *fiter_info;            /* Fixed array iterator info */
+    farray_state_t state;               /* State of fixed array */
+    uint64_t    welmt;                  /* Element to write */
+    uint64_t    relmt;                  /* Element to read */
+    hsize_t     cnt;                    /* Count of array indices */
+    hssize_t    sidx;                   /* Index value of next element in the fixed array */
+    hsize_t     idx;                    /* Index value of next element in the fixed array */
+    hsize_t	fa_nelmts;		/* # of elements in fixed array */
+    haddr_t     fa_addr = HADDR_UNDEF;  /* Array address in file */
+
+    HDassert(nelmts);
+    /*
+     * Display testing message
+     */
+    TESTING(test_str);
+
+    /* Create file & retrieve pointer to internal file object */
+    if(create_file(fapl, &file, &f) < 0)
+        TEST_ERROR
+
+    /* Create array */
+    if(create_array(f, H5P_DATASET_XFER_DEFAULT, cparam, &fa, &fa_addr) < 0)
+        TEST_ERROR
+
+    /* Verify the creation parameters */
+    if(verify_cparam(fa, cparam) < 0)
+        TEST_ERROR
+
+    /* Check for closing & re-opening the file */
+    if(reopen_file(&file, &f, fapl, H5P_DATASET_XFER_DEFAULT, &fa, fa_addr, tparam) < 0)
+        TEST_ERROR
+
+    if(H5FA_get_nelmts(fa, &fa_nelmts) < 0)
+        FAIL_STACK_ERROR
+
+    if(nelmts > fa_nelmts)
+        TEST_ERROR
+
+    /* Verify array state */
+    HDmemset(&state, 0, sizeof(state));
+    state.hdr_size = FA_HDR_SIZE;
+    state.nelmts = cparam->nelmts;
+    state.dblk_size = 0;
+    if(check_stats(fa, &state))
+        TEST_ERROR
+
+    /* Get all elements from empty array */
+
+    /* Initialize iterator */
+    if(NULL == (fiter_info = tparam->fiter->init(cparam, tparam, nelmts)))
+        TEST_ERROR
+
+    /* Get elements of array */
+    for(cnt = 0; cnt < nelmts; cnt++) {
+        /* Get the array index */
+        if((sidx = tparam->fiter->next(fiter_info)) < 0)
+            TEST_ERROR
+	idx = (hsize_t)sidx;
+
+        /* Retrieve element of array (not set yet) */
+        relmt = (uint64_t)0;
+        if(H5FA_get(fa, H5P_DATASET_XFER_DEFAULT, idx, &relmt) < 0)
+            FAIL_STACK_ERROR
+
+        /* Verify that the retrieved is correct */
+        if(check_elmt(&relmt, NULL))
+            TEST_ERROR
+    } /* end for */
+
+    /* Shutdown iterator */
+    if(tparam->fiter->term(fiter_info) < 0)
+        TEST_ERROR
+
+
+    /* Set (& get) all elements from empty array */
+
+    /* Initialize iterator */
+    if(NULL == (fiter_info = tparam->fiter->init(cparam, tparam, nelmts)))
+        TEST_ERROR
+
+    /* Set elements of array */
+    for(cnt = 0; cnt < nelmts; cnt++) {
+        /* Get the array index */
+        if((sidx = tparam->fiter->next(fiter_info)) < 0)
+            TEST_ERROR
+	idx = (hsize_t)sidx;
+
+        relmt = (uint64_t)0;
+        if(H5FA_get(fa, H5P_DATASET_XFER_DEFAULT, idx, &relmt) < 0)
+            FAIL_STACK_ERROR
+
+        /* Verify that the retrieved element is correct */
+        if(check_elmt(&relmt, NULL))
+            TEST_ERROR
+
+        /* Set element of array */
+        welmt = (uint64_t)7 + idx;
+        if(H5FA_set(fa, H5P_DATASET_XFER_DEFAULT, idx, &welmt) < 0)
+            FAIL_STACK_ERROR
+
+        /* Retrieve element of array (set now) */
+        relmt = (uint64_t)0;
+        if(H5FA_get(fa, H5P_DATASET_XFER_DEFAULT, idx, &relmt) < 0)
+            FAIL_STACK_ERROR
+
+        /* Verify that the retrieved element is correct */
+        if(check_elmt(&relmt, &welmt))
+            TEST_ERROR
+    } /* end for */
+
+    /* Verify array state */
+    HDmemset(&state, 0, sizeof(state));
+    set_fa_state(cparam, &state);
+    if(check_stats(fa, &state))
+        TEST_ERROR
+
+    /* Shutdown iterator */
+    if(tparam->fiter->term(fiter_info) < 0)
+        TEST_ERROR
+
+    /* Close array, delete array, close file & verify file is empty */
+    if(finish(file, fapl, f, fa, fa_addr) < 0)
+        TEST_ERROR
+
+    /* All tests passed */
+    PASSED()
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        if(fa)
+            H5FA_close(fa, H5P_DATASET_XFER_DEFAULT);
+	H5Fclose(file);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_set_elmts() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	test_skip_elmts
+ *
+ * Purpose:	Set the element "skip_elmts" in the fixed array
+ *		("skip_elmts" is the index of the fixed array to be set.)
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ *-------------------------------------------------------------------------
+ */
+static unsigned
+test_skip_elmts(hid_t fapl, H5FA_create_t *cparam, farray_test_param_t *tparam,
+    hsize_t skip_elmts, hbool_t check_rest, const char *test_str)
+{
+    hid_t	file = -1;              /* File ID */
+    H5F_t	*f = NULL;              /* Internal file object pointer */
+    H5FA_t      *fa = NULL;             /* Extensible array wrapper */
+    farray_state_t state;               /* State of extensible array */
+    uint64_t    welmt;                  /* Element to write */
+    uint64_t    relmt;                  /* Element to read */
+    hsize_t     idx;                    /* Index value of element to get */
+    hsize_t     cnt;                    /* Count of array indices */
+    hsize_t	fa_nelmts;		/* # of elements in fixed array */
+    haddr_t     fa_addr = HADDR_UNDEF;  /* Array address in file */
+
+    /*
+     * Display testing message
+     */
+    TESTING(test_str);
+
+    /* Create file & retrieve pointer to internal file object */
+    if(create_file(fapl, &file, &f) < 0)
+        TEST_ERROR
+
+    /* Create array */
+    if(create_array(f, H5P_DATASET_XFER_DEFAULT, cparam, &fa, &fa_addr) < 0)
+        TEST_ERROR
+
+    /* Verify the creation parameters */
+    if(verify_cparam(fa, cparam) < 0)
+        TEST_ERROR
+
+    /* Check for closing & re-opening the file */
+    if(reopen_file(&file, &f, fapl, H5P_DATASET_XFER_DEFAULT, &fa, fa_addr, tparam) < 0)
+        TEST_ERROR
+
+    if(H5FA_get_nelmts(fa, &fa_nelmts) < 0)
+        FAIL_STACK_ERROR
+
+    if(skip_elmts >= fa_nelmts)
+        TEST_ERROR
+
+    /* Verify array state */
+    HDmemset(&state, 0, sizeof(state));
+    state.hdr_size = FA_HDR_SIZE;
+    state.nelmts = cparam->nelmts;
+    state.dblk_size = 0;
+    if(check_stats(fa, &state))
+        TEST_ERROR
+
+    /* Set (& get) element after skipping elements */
+    idx = skip_elmts;
+
+    /* Retrieve element of array (not set yet) */
+    relmt = (uint64_t)0;
+    if(H5FA_get(fa, H5P_DATASET_XFER_DEFAULT, idx, &relmt) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify that the retrieved is correct */
+    if(check_elmt(&relmt, NULL))
+        TEST_ERROR
+
+    /* Set element of array */
+    welmt = (uint64_t)7 + idx;
+    if(H5FA_set(fa, H5P_DATASET_XFER_DEFAULT, idx, &welmt) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify array state */
+    HDmemset(&state, 0, sizeof(state));
+    set_fa_state(cparam, &state);
+    if(check_stats(fa, &state))
+        TEST_ERROR
+
+    /* Retrieve element of array (set now) */
+    relmt = (uint64_t)0;
+    if(H5FA_get(fa, H5P_DATASET_XFER_DEFAULT, idx, &relmt) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify that the retrieved is correct */
+    if(check_elmt(&relmt, &welmt))
+        TEST_ERROR
+
+    if(check_rest) {
+        /* Get unset elements of array */
+        for(cnt = 0; cnt < skip_elmts; cnt++) {
+            /* Retrieve element of array (not set yet) */
+            relmt = (uint64_t)0;
+            if(H5FA_get(fa, H5P_DATASET_XFER_DEFAULT, cnt, &relmt) < 0)
+                FAIL_STACK_ERROR
+
+            /* Verify that the retrieved is correct */
+            if(check_elmt(&relmt, NULL))
+                TEST_ERROR
+        } /* end for */
+    } /* end if */
+
+    /* Close array, delete array, close file & verify file is empty */
+    if(finish(file, fapl, f, fa, fa_addr) < 0)
+        TEST_ERROR
+
+    /* All tests passed */
+    PASSED()
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        if(fa)
+            H5FA_close(fa, H5P_DATASET_XFER_DEFAULT);
+	H5Fclose(file);
+    } H5E_END_TRY;
+
+    return 1;
+} /* test_skip_elmts() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	main
+ *
+ * Purpose:	Test the fixed array code
+ *
+ * Return:	Success: 0
+ *		Failure: 1
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(void)
+{
+    H5FA_create_t cparam;               /* Creation parameters for fixed array */
+    farray_test_param_t tparam;         /* Testing parameters */
+    farray_test_type_t curr_test;       /* Current test being worked on */
+    farray_iter_type_t curr_iter;       /* Current iteration type being worked on */
+    hid_t	fapl = -1;              /* File access property list for data files */
+    unsigned	nerrors = 0;            /* Cumulative error count */
+    time_t      curr_time;              /* Current time, for seeding random number generator */
+    int		ExpressMode;            /* Test express value */
+
+    /* Reset library */
+    h5_reset();
+    fapl = h5_fileaccess();
+    ExpressMode = GetTestExpress();
+    if(ExpressMode > 1)
+	printf("***Express test mode on.  Some tests may be skipped\n");
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl, filename_g, sizeof(filename_g));
+
+    /* Seed random #'s */
+    curr_time = HDtime(NULL);
+    HDsrandom((unsigned)curr_time);
+
+    /* Create an empty file to retrieve size */
+    {
+        hid_t	file;              /* File ID */
+
+        if((file = H5Fcreate(filename_g, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Close file */
+        if(H5Fclose(file) < 0)
+            FAIL_STACK_ERROR
+
+        /* Get the size of a file w/no array */
+        if((empty_size_g = h5_get_file_size(filename_g, fapl)) < 0)
+            TEST_ERROR
+    }
+
+    /* Iterate over the testing parameters */
+    for(curr_test = FARRAY_TEST_NORMAL; curr_test < FARRAY_TEST_NTESTS; H5_INC_ENUM(farray_test_type_t, curr_test)) {
+
+        /* Initialize the testing parameters */
+        HDmemset(&tparam, 0, sizeof(tparam));
+        tparam.nelmts = TEST_NELMTS;
+
+        /* Set appropriate testing parameters for each test */
+        switch(curr_test) {
+            /* "Normal" testing parameters */
+            case FARRAY_TEST_NORMAL:
+                puts("Testing with NORMAL PARAMETERS");
+                break;
+
+            /* "Re-open array" testing parameters */
+            case FARRAY_TEST_REOPEN:
+                puts("Testing with reopen array flag set");
+                tparam.reopen_array = FARRAY_TEST_REOPEN;
+                break;
+
+            /* An unknown test? */
+            case FARRAY_TEST_NTESTS:
+            default:
+                goto error;
+        } /* end switch */
+
+	/* Initialize fixed array creation parameters */
+	init_cparam(&cparam, &tparam);
+
+        /* Basic capability tests */
+        nerrors += test_create(fapl, &cparam, &tparam);
+        nerrors += test_reopen(fapl, &cparam, &tparam);
+        nerrors += test_open_twice(fapl, &cparam, &tparam);
+        nerrors += test_open_twice_diff(fapl, &cparam, &tparam);
+        nerrors += test_delete_open(fapl, &cparam, &tparam);
+
+	/* Iterate over the type of capacity tests */
+	for(curr_iter = FARRAY_ITER_FW; curr_iter < FARRAY_ITER_NITERS; H5_INC_ENUM(farray_iter_type_t, curr_iter)) {
+
+            /* Set appropriate parameters for each type of iteration */
+            switch(curr_iter) {
+                /* "Forward" testing parameters */
+                case FARRAY_ITER_FW:
+                    puts("Testing with forward iteration");
+                    tparam.fiter = &fa_iter_fw;
+                    break;
+
+                /* "Reverse" testing parameters */
+                case FARRAY_ITER_RV:
+                    puts("Testing with reverse iteration");
+                    tparam.fiter = &fa_iter_rv;
+                    break;
+
+                /* "Random" testing parameters */
+                case FARRAY_ITER_RND:
+                    puts("Testing with random iteration");
+                    tparam.fiter = &fa_iter_rnd;
+                    break;
+
+                /* "Cyclic" testing parameters */
+                case FARRAY_ITER_CYC:
+                    puts("Testing with cyclic iteration");
+                    tparam.fiter = &fa_iter_cyc;
+                    break;
+
+                /* An unknown iteration? */
+                case FARRAY_ITER_NITERS:
+                default:
+                    goto error;
+            } /* end switch */
+
+            /* Basic capacity tests */
+            nerrors += test_set_elmts(fapl, &cparam, &tparam, (hsize_t)1, "setting 1 element of the array");
+            nerrors += test_set_elmts(fapl, &cparam, &tparam, (hsize_t)(tparam.nelmts/2), "setting half of the array's elements ");
+            nerrors += test_set_elmts(fapl, &cparam, &tparam, (hsize_t)tparam.nelmts, "setting all the array elements");
+        } /* end for */
+
+	/* Check skipping elements */
+        nerrors += test_skip_elmts(fapl, &cparam, &tparam, (hsize_t)1, TRUE, "skipping to first element");
+        nerrors += test_skip_elmts(fapl, &cparam, &tparam, ((hsize_t)1 << cparam.max_dblk_page_nelmts_bits), TRUE, "skipping to first element in data block page");
+        nerrors += test_skip_elmts(fapl, &cparam, &tparam, (hsize_t)(tparam.nelmts - 1), TRUE, "skipping to last element");
+
+	/* Create Fixed Array of MAX_NELMTS elements */
+	/*
+	 * MAX_NELMTS succeeds on jam and smirom.
+	 * The value was adjusted for linew due to the following:
+	    Linew failed with "H5FD_sec2_truncate(): unable to extend file properly"
+	    Linew failed with "H5FD_sec2_truncate(): File too large"
+	 */
+        tparam.nelmts = MAX_NELMTS/17;
+	init_cparam(&cparam, &tparam);
+
+	/* Set the last element in the Fixed Array */
+        nerrors += test_skip_elmts(fapl, &cparam, &tparam, (hsize_t)(tparam.nelmts - 1), FALSE, "skipping to last element");
+    } /* end for */
+
+    /* Verify symbol table messages are cached */
+    nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
+
+    if(nerrors)
+        goto error;
+    puts("All fixed array tests passed.");
+
+    /* Clean up file used */
+    h5_cleanup(FILENAME, fapl);
+
+    return 0;
+
+error:
+    puts("*** TESTS FAILED ***");
+
+    H5E_BEGIN_TRY {
+	H5Pclose(fapl);
+    } H5E_END_TRY;
+
+    return 1;
+} /* end main() */
+
diff --git a/test/fheap.c b/test/fheap.c
index 4365324..25784a9 100644
--- a/test/fheap.c
+++ b/test/fheap.c
@@ -22,12 +22,12 @@
  * This file needs to access private datatypes from the H5HF package.
  * This file also needs to access the fractal heap testing code.
  */
-#define H5HF_PACKAGE
+#define H5HF_FRIEND		/*suppress error about including H5HFpkg	  */
 #define H5HF_TESTING
 #include "H5HFpkg.h"		/* Fractal heaps			*/
 
 /* Other private headers that this test requires */
-#include "H5Iprivate.h"
+#include "H5Iprivate.h"		/* IDs			  		*/
 #include "H5MMprivate.h"	/* Memory management			*/
 #include "H5VMprivate.h"		/* Vectors and arrays 			*/
 
@@ -125,7 +125,7 @@ typedef struct fheap_test_param_t {
     fheap_test_del_drain_t drain_half;  /* Whether to drain half of the objects & refill, when deleting objects */
     fheap_test_fill_t fill;             /* How to "bulk" fill heap blocks */
     size_t actual_id_len;               /* The actual length of heap IDs for a test */
-    fheap_test_comp_t comp;             /* Whether to compressed the blocks or not */
+    fheap_test_comp_t comp;             /* Whether to compress the blocks or not */
 } fheap_test_param_t;
 
 /* Heap state information */
@@ -543,7 +543,7 @@ begin_test(fheap_test_param_t *tparam, const char *base_desc,
      */
     del_str = get_del_string(tparam);
     HDassert(del_str);
-    test_desc = H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc));
+    test_desc = (char *)H5MM_malloc(HDstrlen(del_str) + HDstrlen(base_desc));
     sprintf(test_desc, base_desc, del_str);
     TESTING(test_desc);
     H5MM_xfree(del_str);
@@ -584,17 +584,24 @@ reopen_file(hid_t *file, H5F_t **f, const char *filename, hid_t fapl, hid_t dxpl
         /* Close heap */
         if(H5HF_close(*fh, dxpl) < 0)
             FAIL_STACK_ERROR
+        *fh = NULL;
 
         /* Close file */
         if(H5Fclose(*file) < 0)
             FAIL_STACK_ERROR
+        *file = (-1);
+        *f = NULL;
 
         /* Re-open the file */
         if((*file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
             FAIL_STACK_ERROR
 
         /* Get a pointer to the internal file object */
-        if(NULL == (*f = H5I_object(*file)))
+        if(NULL == (*f = (H5F_t *)H5I_object(*file)))
+            FAIL_STACK_ERROR
+
+        /* Ignore metadata tags in the file's cache */
+        if (H5AC_ignore_tags(*f) < 0)
             FAIL_STACK_ERROR
 
         /* Re-open heap */
@@ -641,7 +648,11 @@ open_heap(char *filename, hid_t fapl, hid_t dxpl, const H5HF_create_t *cparam,
     /* Check for deleting the entire heap */
     if(tparam->del_dir != FHEAP_DEL_HEAP) {
         /* Get a pointer to the internal file object */
-        if(NULL == (*f = H5I_object(*file)))
+        if(NULL == (*f = (H5F_t *)H5I_object(*file)))
+            FAIL_STACK_ERROR
+
+        /* Ignore metadata tags in the file's cache */
+        if (H5AC_ignore_tags(*f) < 0)
             FAIL_STACK_ERROR
 
         /* Create absolute heap */
@@ -679,7 +690,11 @@ open_heap(char *filename, hid_t fapl, hid_t dxpl, const H5HF_create_t *cparam,
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (*f = H5I_object(*file)))
+    if(NULL == (*f = (H5F_t *)H5I_object(*file)))
+        FAIL_STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(*f) < 0)
         FAIL_STACK_ERROR
 
     /* Check for deleting the entire heap */
@@ -1064,11 +1079,11 @@ fill_heap(H5HF_t *fh, hid_t dxpl, unsigned block_row, size_t obj_size,
         /* Check for needing to increase size of heap ID array */
         if(num_ids > shared_alloc_ids_g) {
             shared_alloc_ids_g = MAX(1024, (shared_alloc_ids_g * 2));
-            if(NULL == (shared_ids_g = H5MM_realloc(shared_ids_g, id_len * shared_alloc_ids_g)))
+            if(NULL == (shared_ids_g = (unsigned char *)H5MM_realloc(shared_ids_g, id_len * shared_alloc_ids_g)))
                 TEST_ERROR
-            if(NULL == (shared_lens_g = H5MM_realloc(shared_lens_g, sizeof(size_t) * shared_alloc_ids_g)))
+            if(NULL == (shared_lens_g = (size_t *)H5MM_realloc(shared_lens_g, sizeof(size_t) * shared_alloc_ids_g)))
                 TEST_ERROR
-            if(NULL == (shared_offs_g = H5MM_realloc(shared_offs_g, sizeof(size_t) * shared_alloc_ids_g)))
+            if(NULL == (shared_offs_g = (size_t *)H5MM_realloc(shared_offs_g, sizeof(size_t) * shared_alloc_ids_g)))
                 TEST_ERROR
             curr_id_ptr = &shared_ids_g[(num_ids - 1) * id_len];
             curr_len_ptr = &shared_lens_g[(num_ids - 1)];
@@ -1115,11 +1130,11 @@ fill_heap(H5HF_t *fh, hid_t dxpl, unsigned block_row, size_t obj_size,
         /* Check for needing to increase size of heap ID array */
         if(num_ids > shared_alloc_ids_g) {
             shared_alloc_ids_g = MAX(1024, (shared_alloc_ids_g * 2));
-            if(NULL == (shared_ids_g = H5MM_realloc(shared_ids_g, id_len * shared_alloc_ids_g)))
+            if(NULL == (shared_ids_g = (unsigned char *)H5MM_realloc(shared_ids_g, id_len * shared_alloc_ids_g)))
                 TEST_ERROR
-            if(NULL == (shared_lens_g = H5MM_realloc(shared_lens_g, sizeof(size_t) * shared_alloc_ids_g)))
+            if(NULL == (shared_lens_g = (size_t *)H5MM_realloc(shared_lens_g, sizeof(size_t) * shared_alloc_ids_g)))
                 TEST_ERROR
-            if(NULL == (shared_offs_g = H5MM_realloc(shared_offs_g, sizeof(size_t) * shared_alloc_ids_g)))
+            if(NULL == (shared_offs_g = (size_t *)H5MM_realloc(shared_offs_g, sizeof(size_t) * shared_alloc_ids_g)))
                 TEST_ERROR
             curr_id_ptr = &shared_ids_g[(num_ids - 1) * id_len];
             curr_len_ptr = &shared_lens_g[(num_ids - 1)];
@@ -1171,11 +1186,11 @@ fill_heap(H5HF_t *fh, hid_t dxpl, unsigned block_row, size_t obj_size,
         /* Check for needing to increase size of heap ID array */
         if(keep_ids->num_ids + num_ids > keep_ids->alloc_ids) {
             keep_ids->alloc_ids = MAX(1024, (keep_ids->alloc_ids * 2));
-            if(NULL == (keep_ids->ids = H5MM_realloc(keep_ids->ids, id_len * keep_ids->alloc_ids)))
+            if(NULL == (keep_ids->ids = (unsigned char *)H5MM_realloc(keep_ids->ids, id_len * keep_ids->alloc_ids)))
                 TEST_ERROR
-            if(NULL == (keep_ids->lens = H5MM_realloc(keep_ids->lens, sizeof(size_t) * keep_ids->alloc_ids)))
+            if(NULL == (keep_ids->lens = (size_t *)H5MM_realloc(keep_ids->lens, sizeof(size_t) * keep_ids->alloc_ids)))
                 TEST_ERROR
-            if(NULL == (keep_ids->offs = H5MM_realloc(keep_ids->offs, sizeof(size_t) * keep_ids->alloc_ids)))
+            if(NULL == (keep_ids->offs = (size_t *)H5MM_realloc(keep_ids->offs, sizeof(size_t) * keep_ids->alloc_ids)))
                 TEST_ERROR
         } /* end if */
 
@@ -1804,7 +1819,6 @@ error:
  * Purpose:	Create fractal heap
  *
  * Return:	Success:	0
- *
  *		Failure:	1
  *
  * Programmer:	Quincey Koziol
@@ -1812,7 +1826,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_create(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UNUSED *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -1846,7 +1860,11 @@ test_create(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UNUSED
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         FAIL_STACK_ERROR
 
     /*
@@ -1918,7 +1936,6 @@ error:
  * Purpose:	Create & reopen a fractal heap
  *
  * Return:	Success:	0
- *
  *		Failure:	1
  *
  * Programmer:	Quincey Koziol
@@ -1926,7 +1943,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_reopen(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UNUSED *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -1935,6 +1952,8 @@ test_reopen(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UNUSED
     H5HF_create_t test_cparam;          /* Creation parameters for heap */
     H5HF_t      *fh = NULL;             /* Fractal heap wrapper */
     haddr_t     fh_addr;                /* Address of fractal heap */
+    h5_stat_size_t       empty_size;             /* File size, w/o heap */
+    h5_stat_size_t       file_size;              /* File size, after deleting heap */
     size_t      id_len;                 /* Size of fractal heap IDs */
     fheap_heap_state_t state;           /* State of fractal heap */
 
@@ -1945,12 +1964,28 @@ test_reopen(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UNUSED
     if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
         TEST_ERROR
 
+    /* Close file */
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get the size of a file w/empty heap*/
+    if((empty_size = h5_get_file_size(filename, fapl)) < 0)
+        TEST_ERROR
+
+    /* Re-open the file */
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
         STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
+        FAIL_STACK_ERROR
+
     /*
-     * Test fractal heap creation
+     * Display testing message
      */
 
     TESTING("create, close & reopen fractal heap");
@@ -1974,11 +2009,31 @@ test_reopen(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UNUSED
     if(H5HF_close(fh, H5P_DATASET_XFER_DEFAULT) < 0)
         FAIL_STACK_ERROR
 
+    /* Check for closing & re-opening the file */
+    if(tparam->reopen_heap) {
+        /* Close file */
+        if(H5Fclose(file) < 0)
+            FAIL_STACK_ERROR
+
+        /* Re-open the file */
+        if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Get a pointer to the internal file object */
+        if(NULL == (f = (H5F_t *)H5I_object(file)))
+            FAIL_STACK_ERROR
+
+        /* Ignore metadata tags in the file's cache */
+        if (H5AC_ignore_tags(f) < 0)
+            FAIL_STACK_ERROR
+
+    } /* end if */
+
     /* Re-open the heap */
     if(NULL == (fh = H5HF_open(f, H5P_DATASET_XFER_DEFAULT, fh_addr)))
         FAIL_STACK_ERROR
 
-    /* Query the type of address mapping */
+    /* Query the creation parameters */
     HDmemset(&test_cparam, 0, sizeof(H5HF_create_t));
     if(H5HF_get_cparam_test(fh, &test_cparam) < 0)
         FAIL_STACK_ERROR
@@ -1990,10 +2045,22 @@ test_reopen(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UNUSED
         FAIL_STACK_ERROR
     fh = NULL;
 
+    /* Delete heap */
+    if(H5HF_delete(f, H5P_DATASET_XFER_DEFAULT, fh_addr) < 0)
+        FAIL_STACK_ERROR
+
     /* Close the file */
     if(H5Fclose(file) < 0)
         FAIL_STACK_ERROR
 
+    /* Get the size of the file */
+    if((file_size = h5_get_file_size(filename, fapl)) < 0)
+        TEST_ERROR
+
+    /* Verify the file is correct size */
+    if(file_size != empty_size)
+        TEST_ERROR
+
     /* All tests passed */
     PASSED()
 
@@ -2022,7 +2089,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_open_twice(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UNUSED *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -2034,6 +2101,8 @@ test_open_twice(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UN
     H5HF_t      *fh = NULL;             /* Fractal heap wrapper */
     H5HF_t      *fh2 = NULL;            /* 2nd fractal heap wrapper */
     haddr_t     fh_addr;                /* Address of fractal heap */
+    h5_stat_size_t       empty_size;             /* File size, w/o heap */
+    h5_stat_size_t       file_size;              /* File size, after deleting heap */
     size_t      id_len;                 /* Size of fractal heap IDs */
     fheap_heap_state_t state;           /* State of fractal heap */
 
@@ -2044,22 +2113,29 @@ test_open_twice(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UN
     if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
         TEST_ERROR
 
-    /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
-        STACK_ERROR
+    /* Close file */
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get the size of a file w/empty heap*/
+    if((empty_size = h5_get_file_size(filename, fapl)) < 0)
+        TEST_ERROR
 
     /* Re-open the file */
-    if((file2 = H5Freopen(file)) < 0)
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f2 = H5I_object(file2)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         FAIL_STACK_ERROR
 
     /*
-     * Test fractal heap creation
+     * Display testing message
      */
-
     TESTING("open fractal heap twice");
 
     /* Create heap */
@@ -2077,11 +2153,11 @@ test_open_twice(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UN
     if(check_stats(fh, &state))
         TEST_ERROR
 
-    /* Open the heap again */
+    /* Open the heap again, through the first file handle */
     if(NULL == (fh2 = H5HF_open(f, H5P_DATASET_XFER_DEFAULT, fh_addr)))
         FAIL_STACK_ERROR
 
-    /* Query the type of address mapping */
+    /* Verify the creation parameters */
     HDmemset(&test_cparam, 0, sizeof(H5HF_create_t));
     if(H5HF_get_cparam_test(fh2, &test_cparam) < 0)
         FAIL_STACK_ERROR
@@ -2093,11 +2169,27 @@ test_open_twice(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UN
         FAIL_STACK_ERROR
     fh2 = NULL;
 
+    /* Check for closing & re-opening the heap & file */
+    if(reopen_file(&file, &f, filename, fapl, H5P_DATASET_XFER_DEFAULT, &fh, fh_addr, tparam) < 0)
+        TEST_ERROR
+
+    /* Re-open the file */
+    if((file2 = H5Freopen(file)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f2 = (H5F_t *)H5I_object(file2)))
+        FAIL_STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f2) < 0)
+        FAIL_STACK_ERROR
+
     /* Open the fractal heap through the second file handle */
     if(NULL == (fh2 = H5HF_open(f2, H5P_DATASET_XFER_DEFAULT, fh_addr)))
         FAIL_STACK_ERROR
 
-    /* Query the type of address mapping */
+    /* Verify the creation parameters */
     HDmemset(&test_cparam, 0, sizeof(H5HF_create_t));
     if(H5HF_get_cparam_test(fh2, &test_cparam) < 0)
         FAIL_STACK_ERROR
@@ -2121,10 +2213,22 @@ test_open_twice(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UN
         FAIL_STACK_ERROR
     fh2 = NULL;
 
+    /* Delete heap */
+    if(H5HF_delete(f2, H5P_DATASET_XFER_DEFAULT, fh_addr) < 0)
+        FAIL_STACK_ERROR
+
     /* Close the second file */
     if(H5Fclose(file2) < 0)
         FAIL_STACK_ERROR
 
+    /* Get the size of the file */
+    if((file_size = h5_get_file_size(filename, fapl)) < 0)
+        TEST_ERROR
+
+    /* Verify the file is correct size */
+    if(file_size != empty_size)
+        TEST_ERROR
+
     /* All tests passed */
     PASSED()
 
@@ -2139,6 +2243,7 @@ error:
 	H5Fclose(file);
 	H5Fclose(file2);
     } H5E_END_TRY;
+
     return(1);
 } /* test_open_twice() */
 
@@ -2156,7 +2261,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_delete_open(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_UNUSED *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -2191,9 +2296,13 @@ test_delete_open(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_U
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
         STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
+        FAIL_STACK_ERROR
+
     /* Display test banner */
     TESTING("deleting open fractal heap");
 
@@ -2220,7 +2329,7 @@ test_delete_open(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_U
     if(H5HF_delete(f, H5P_DATASET_XFER_DEFAULT, fh_addr) < 0)
         FAIL_STACK_ERROR
 
-    /* Query the type of address mapping */
+    /* Verify the creation parameters */
     HDmemset(&test_cparam, 0, sizeof(H5HF_create_t));
     if(H5HF_get_cparam_test(fh2, &test_cparam) < 0)
         FAIL_STACK_ERROR
@@ -2249,7 +2358,26 @@ test_delete_open(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_U
         FAIL_STACK_ERROR
     fh = NULL;
 
-#ifdef QAK
+    /* Check for closing & re-opening the file */
+    if(tparam->reopen_heap) {
+        /* Close file */
+        if(H5Fclose(file) < 0)
+            FAIL_STACK_ERROR
+
+        /* Re-open the file */
+        if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Get a pointer to the internal file object */
+        if(NULL == (f = (H5F_t *)H5I_object(file)))
+            FAIL_STACK_ERROR
+
+        /* Ignore metadata tags in the file's cache */
+        if (H5AC_ignore_tags(f) < 0)
+            FAIL_STACK_ERROR
+
+    } /* end if */
+
     /* Try re-opening the heap again (should fail, as heap is now deleted) */
     H5E_BEGIN_TRY {
         fh = H5HF_open(f, H5P_DATASET_XFER_DEFAULT, fh_addr);
@@ -2261,7 +2389,6 @@ test_delete_open(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t H5_ATTR_U
         /* Indicate error */
         TEST_ERROR
     } /* end if */
-#endif /* QAK */
 
     /* Close the file */
     if(H5Fclose(file) < 0)
@@ -2305,7 +2432,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_id_limits(hid_t fapl, H5HF_create_t *cparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -2328,7 +2455,11 @@ test_id_limits(hid_t fapl, H5HF_create_t *cparam)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         FAIL_STACK_ERROR
 
     /* Display testing message */
@@ -2646,7 +2777,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_filtered_create(hid_t fapl, H5HF_create_t *cparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -2667,7 +2798,11 @@ test_filtered_create(hid_t fapl, H5HF_create_t *cparam)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         FAIL_STACK_ERROR
 
     /* Display testing message */
@@ -2706,7 +2841,11 @@ test_filtered_create(hid_t fapl, H5HF_create_t *cparam)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         FAIL_STACK_ERROR
 
     /* Re-open the heap */
@@ -2761,7 +2900,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_size(hid_t fapl, H5HF_create_t *cparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -2782,7 +2921,11 @@ test_size(hid_t fapl, H5HF_create_t *cparam)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         FAIL_STACK_ERROR
 
     /* Display testing message */
@@ -2832,7 +2975,11 @@ test_size(hid_t fapl, H5HF_create_t *cparam)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         FAIL_STACK_ERROR
 
     /* Re-open the heap */
@@ -2920,6 +3067,10 @@ test_reopen_hdr(hid_t fapl, H5HF_create_t *cparam)
     if(NULL == (f = (H5F_t *)H5I_object(file1)))
         FAIL_STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
+        FAIL_STACK_ERROR
+
     /* Display testing message */
     TESTING("reopening header through different file")
 
@@ -2960,6 +3111,10 @@ test_reopen_hdr(hid_t fapl, H5HF_create_t *cparam)
     if(NULL == (f = (H5F_t *)H5I_object(file1)))
         FAIL_STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
+        FAIL_STACK_ERROR
+
     /* Open the heap */
     if(NULL == (fh = H5HF_open(f, dxpl, fh_addr)))
         FAIL_STACK_ERROR
@@ -3026,7 +3181,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_insert_weird(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -3048,7 +3203,11 @@ test_man_insert_weird(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpa
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         FAIL_STACK_ERROR
 
     /* Create absolute heap */
@@ -3134,7 +3293,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_insert_first(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -3154,7 +3313,11 @@ test_man_insert_first(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpa
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         FAIL_STACK_ERROR
 
     /* Create absolute heap */
@@ -3231,7 +3394,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_insert_second(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -3251,7 +3414,11 @@ test_man_insert_second(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tp
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -3323,7 +3490,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_insert_root_mult(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -3344,7 +3511,11 @@ test_man_insert_root_mult(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -3418,7 +3589,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_insert_force_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -3439,7 +3610,11 @@ test_man_insert_force_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_par
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -3520,7 +3695,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_insert_fill_second(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -3541,7 +3716,11 @@ test_man_insert_fill_second(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -3623,7 +3802,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_insert_third_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -3644,7 +3823,11 @@ test_man_insert_third_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -3730,7 +3913,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_first_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -3751,7 +3934,11 @@ test_man_fill_first_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *t
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -3822,7 +4009,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_start_second_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -3843,7 +4030,11 @@ test_man_start_second_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -3921,7 +4112,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_second_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -3942,7 +4133,11 @@ test_man_fill_second_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -4018,7 +4213,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_start_third_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -4039,7 +4234,11 @@ test_man_start_third_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -4124,7 +4323,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_fourth_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -4146,7 +4345,11 @@ test_man_fill_fourth_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -4218,7 +4421,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_all_root_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -4239,7 +4442,11 @@ test_man_fill_all_root_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_para
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -4310,7 +4517,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_first_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -4331,7 +4538,11 @@ test_man_first_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -4408,7 +4619,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_second_direct_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -4429,7 +4640,11 @@ test_man_second_direct_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fhe
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -4514,7 +4729,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_first_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -4535,7 +4750,11 @@ test_man_fill_first_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -4613,7 +4832,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_second_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -4634,7 +4853,11 @@ test_man_second_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -4720,7 +4943,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_second_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -4741,7 +4964,11 @@ test_man_fill_second_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -4824,7 +5051,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -4845,7 +5072,7 @@ test_man_fill_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fheap_te
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
         STACK_ERROR
 
     /* Create absolute heap */
@@ -4922,7 +5149,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_start_2nd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -4943,7 +5170,11 @@ test_man_start_2nd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -5027,7 +5258,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_recursive_indirect_two_deep(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -5048,7 +5279,11 @@ test_man_recursive_indirect_two_deep(hid_t fapl, H5HF_create_t *cparam, fheap_te
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -5126,7 +5361,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_start_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -5147,7 +5382,11 @@ test_man_start_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -5232,7 +5471,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_first_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -5253,7 +5492,11 @@ test_man_fill_first_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fh
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -5339,7 +5582,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_3rd_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -5360,7 +5603,11 @@ test_man_fill_3rd_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fhea
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -5442,7 +5689,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_all_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -5463,7 +5710,11 @@ test_man_fill_all_3rd_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fhea
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -5546,7 +5797,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_start_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -5567,7 +5818,11 @@ test_man_start_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -5657,7 +5912,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_first_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -5678,7 +5933,11 @@ test_man_fill_first_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fh
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -5773,7 +6032,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_4th_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -5794,7 +6053,11 @@ test_man_fill_4th_recursive_indirect_row(hid_t fapl, H5HF_create_t *cparam, fhea
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -5881,7 +6144,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_all_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -5902,7 +6165,11 @@ test_man_fill_all_4th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fhea
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -5992,7 +6259,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_start_5th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -6013,7 +6280,11 @@ test_man_start_5th_recursive_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_t
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -6117,7 +6388,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_remove_bogus(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -6143,7 +6414,11 @@ test_man_remove_bogus(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpa
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -6184,7 +6459,7 @@ HDfprintf(stderr, "Random # seed was: %lu\n", seed);
     /* Set heap ID to random (non-null) value */
     heap_id[0] = H5HF_ID_VERS_CURR | H5HF_ID_TYPE_MAN;
     for(u = 1; u < HEAP_ID_LEN; u++)
-        heap_id[u] = HDrandom() + 1;
+        heap_id[u] = (unsigned char)(HDrandom() + 1);
 
     /* Try removing bogus heap ID from empty heap */
     H5E_BEGIN_TRY {
@@ -6206,7 +6481,7 @@ HDfprintf(stderr, "Random # seed was: %lu\n", seed);
         /* Set heap ID to random (non-null) value */
         heap_id[0] = H5HF_ID_VERS_CURR | H5HF_ID_TYPE_MAN;
         for(u = 1; u < HEAP_ID_LEN; u++)
-            heap_id[u] = HDrandom() + 1;
+            heap_id[u] = (unsigned char)(HDrandom() + 1);
 
         /* Get offset of random heap ID */
         if(H5HF_get_id_off_test(fh, heap_id, &obj_off) < 0)
@@ -6267,7 +6542,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_remove_one(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -6292,7 +6567,11 @@ test_man_remove_one(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpara
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -6329,9 +6608,13 @@ test_man_remove_one(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpara
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
+        STACK_ERROR
+
     /* Re-open heap */
     if(NULL == (fh = H5HF_open(f, dxpl, fh_addr)))
         FAIL_STACK_ERROR
@@ -6343,7 +6626,7 @@ test_man_remove_one(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpara
 
     /* Initialize the buffer for objects to insert */
     for(u = 0; u < sizeof(obj); u++)
-        obj[u] = u;
+        obj[u] = (unsigned char)u;
 
     /* Insert object into heap */
     if(H5HF_insert(fh, dxpl, sizeof(obj), obj, &heap_id) < 0)
@@ -6422,7 +6705,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_remove_two(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -6448,7 +6731,11 @@ test_man_remove_two(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpara
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -6485,9 +6772,13 @@ test_man_remove_two(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpara
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
+        STACK_ERROR
+
     /* Re-open heap */
     if(NULL == (fh = H5HF_open(f, dxpl, fh_addr)))
         FAIL_STACK_ERROR
@@ -6499,7 +6790,7 @@ test_man_remove_two(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpara
 
     /* Initialize the buffer for objects to insert */
     for(u = 0; u < sizeof(obj); u++)
-        obj[u] = u;
+        obj[u] = (unsigned char)u;
 
     /* Insert first object into heap */
     if(H5HF_insert(fh, dxpl, sizeof(obj), obj, &heap_id1) < 0)
@@ -6607,7 +6898,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_remove_one_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -6633,7 +6924,11 @@ test_man_remove_one_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -6670,9 +6965,13 @@ test_man_remove_one_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
+        STACK_ERROR
+
     /* Re-open heap */
     if(NULL == (fh = H5HF_open(f, dxpl, fh_addr)))
         FAIL_STACK_ERROR
@@ -6767,7 +7066,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_remove_two_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -6794,7 +7093,11 @@ test_man_remove_two_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -6831,9 +7134,13 @@ test_man_remove_two_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
+        STACK_ERROR
+
     /* Re-open heap */
     if(NULL == (fh = H5HF_open(f, dxpl, fh_addr)))
         FAIL_STACK_ERROR
@@ -7002,7 +7309,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_remove_three_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -7030,7 +7337,11 @@ test_man_remove_three_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param
         TEST_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         STACK_ERROR
 
     /* Create absolute heap */
@@ -7067,9 +7378,13 @@ test_man_remove_three_larger(hid_t fapl, H5HF_create_t *cparam, fheap_test_param
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
+        STACK_ERROR
+
     /* Re-open heap */
     if(NULL == (fh = H5HF_open(f, dxpl, fh_addr)))
         FAIL_STACK_ERROR
@@ -7324,6 +7639,10 @@ test_man_incr_insert_remove(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if(H5AC_ignore_tags(f) < 0)
+        STACK_ERROR
+
     /* Create absolute heap */
     if(NULL == (fh = H5HF_create(f, dxpl, cparam)))
         FAIL_STACK_ERROR
@@ -7406,7 +7725,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_remove_root_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -7480,7 +7799,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_remove_two_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -7569,7 +7888,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_remove_first_row(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -7640,7 +7959,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_remove_first_two_rows(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -7713,7 +8032,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_remove_first_four_rows(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -7790,7 +8109,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_remove_all_root_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -7861,7 +8180,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_remove_2nd_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -7936,7 +8255,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_remove_3rd_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -8020,7 +8339,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_skip_start_block(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -8098,7 +8417,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_skip_start_block_add_back(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -8197,7 +8516,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_skip_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -8307,7 +8626,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_skip_2nd_block(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -8404,7 +8723,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -8549,7 +8868,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_one_partial_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -8715,7 +9034,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_row_skip_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -8842,7 +9161,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_skip_direct_skip_indirect_two_rows_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -8969,7 +9288,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_direct_skip_indirect_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -9093,7 +9412,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_direct_skip_2nd_indirect_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -9222,7 +9541,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_2nd_direct_less_one_wrap_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -9368,7 +9687,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_direct_skip_2nd_indirect_skip_2nd_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -9538,7 +9857,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_direct_skip_indirect_two_rows_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -9692,7 +10011,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_direct_skip_indirect_two_rows_skip_indirect_row_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -9872,7 +10191,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_2nd_direct_skip_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -10001,7 +10320,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_2nd_direct_skip_2nd_indirect_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -10139,7 +10458,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_2nd_direct_fill_direct_skip_3rd_indirect_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -10291,7 +10610,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_2nd_direct_fill_direct_skip2_3rd_indirect_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -10454,7 +10773,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_3rd_direct_less_one_fill_direct_wrap_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -10617,7 +10936,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_1st_row_3rd_direct_fill_2nd_direct_less_one_wrap_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -10784,7 +11103,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_3rd_direct_fill_direct_skip_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -10946,7 +11265,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -11126,7 +11445,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_two_rows_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -11341,7 +11660,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_3rd_direct_fill_2nd_direct_fill_direct_skip_3rd_indirect_wrap_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -11538,7 +11857,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_fill_4th_direct_less_one_fill_2nd_direct_fill_direct_skip_3rd_indirect_wrap_start_block_add_skipped(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -11766,7 +12085,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_frag_simple(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -11898,7 +12217,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_frag_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -12070,7 +12389,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_frag_2nd_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -12184,7 +12503,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_man_frag_3rd_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -12299,7 +12618,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_huge_insert_one(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -12328,7 +12647,7 @@ test_huge_insert_one(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar
         TEST_ERROR
 
     /* Allocate heap ID(s) */
-    if(NULL == (heap_id = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
 
     /* Make certain that 'huge' object's heap IDs are correct size */
@@ -12452,7 +12771,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_huge_insert_two(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -12482,9 +12801,9 @@ test_huge_insert_two(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar
         TEST_ERROR
 
     /* Allocate heap ID(s) */
-    if(NULL == (heap_id = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
-    if(NULL == (heap_id2 = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id2 = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
 
     /* Make certain that 'huge' object's heap IDs are correct size */
@@ -12685,7 +13004,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_huge_insert_three(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -12716,11 +13035,11 @@ test_huge_insert_three(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tp
         TEST_ERROR
 
     /* Allocate heap ID(s) */
-    if(NULL == (heap_id = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
-    if(NULL == (heap_id2 = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id2 = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
-    if(NULL == (heap_id3 = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id3 = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
 
     /* Make certain that 'huge' object's heap IDs are correct size */
@@ -12993,7 +13312,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_huge_insert_mix(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -13026,15 +13345,15 @@ test_huge_insert_mix(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar
         TEST_ERROR
 
     /* Allocate heap ID(s) */
-    if(NULL == (heap_id = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
-    if(NULL == (heap_id2 = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id2 = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
-    if(NULL == (heap_id3 = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id3 = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
-    if(NULL == (heap_id4 = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id4 = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
-    if(NULL == (heap_id5 = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id5 = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
 
     /* Make certain that 'huge' object's heap IDs are correct size */
@@ -13419,7 +13738,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_filtered_huge(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -13467,7 +13786,7 @@ test_filtered_huge(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam
 
 
     /* Allocate heap ID(s) */
-    if(NULL == (heap_id = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
 
     /* Make certain that 'huge' object's heap IDs are correct form */
@@ -13520,9 +13839,13 @@ test_filtered_huge(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
+        STACK_ERROR
+
     /* Re-open the heap */
     if(NULL == (fh = H5HF_open(f, H5P_DATASET_XFER_DEFAULT, fh_addr)))
         FAIL_STACK_ERROR
@@ -13631,7 +13954,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_tiny_insert_one(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -13660,7 +13983,7 @@ test_tiny_insert_one(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar
         TEST_ERROR
 
     /* Allocate heap ID(s) */
-    if(NULL == (heap_id = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
 
     /* Make certain that 'tiny' object's heap IDs are correct size */
@@ -13784,7 +14107,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_tiny_insert_two(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -13814,9 +14137,9 @@ test_tiny_insert_two(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar
         TEST_ERROR
 
     /* Allocate heap ID(s) */
-    if(NULL == (heap_id = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
-    if(NULL == (heap_id2 = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id2 = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
 
     /* Make certain that 'tiny' object's heap IDs are correct size */
@@ -14018,7 +14341,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_tiny_insert_mix(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -14053,19 +14376,19 @@ test_tiny_insert_mix(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tpar
         TEST_ERROR
 
     /* Allocate heap ID(s) */
-    if(NULL == (heap_id = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
-    if(NULL == (heap_id2 = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id2 = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
-    if(NULL == (heap_id3 = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id3 = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
-    if(NULL == (heap_id4 = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id4 = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
-    if(NULL == (heap_id5 = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id5 = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
-    if(NULL == (heap_id6 = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id6 = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
-    if(NULL == (heap_id7 = H5MM_malloc(tparam->actual_id_len)))
+    if(NULL == (heap_id7 = (unsigned char *)H5MM_malloc(tparam->actual_id_len)))
         TEST_ERROR
 
     /* Make certain that 'tiny' object's heap IDs are correct size */
@@ -14629,7 +14952,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_filtered_man_root_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -14696,7 +15019,11 @@ test_filtered_man_root_direct(hid_t fapl, H5HF_create_t *cparam, fheap_test_para
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         FAIL_STACK_ERROR
 
     /* Re-open the heap */
@@ -14801,7 +15128,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_filtered_man_root_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -14878,7 +15205,11 @@ test_filtered_man_root_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_pa
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         FAIL_STACK_ERROR
 
     /* Re-open the heap */
@@ -14938,7 +15269,11 @@ test_filtered_man_root_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_pa
                 FAIL_STACK_ERROR
 
             /* Get a pointer to the internal file object */
-            if(NULL == (f = H5I_object(file)))
+            if(NULL == (f = (H5F_t *)H5I_object(file)))
+                FAIL_STACK_ERROR
+
+            /* Ignore metadata tags in the file's cache */
+            if (H5AC_ignore_tags(f) < 0)
                 FAIL_STACK_ERROR
 
             /* Re-open the heap */
@@ -14970,7 +15305,11 @@ test_filtered_man_root_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_pa
                 FAIL_STACK_ERROR
 
             /* Get a pointer to the internal file object */
-            if(NULL == (f = H5I_object(file)))
+            if(NULL == (f = (H5F_t *)H5I_object(file)))
+                FAIL_STACK_ERROR
+
+            /* Ignore metadata tags in the file's cache */
+            if (H5AC_ignore_tags(f) < 0)
                 FAIL_STACK_ERROR
 
             /* Re-open the heap */
@@ -15003,7 +15342,11 @@ test_filtered_man_root_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_pa
                 FAIL_STACK_ERROR
 
             /* Get a pointer to the internal file object */
-            if(NULL == (f = H5I_object(file)))
+            if(NULL == (f = (H5F_t *)H5I_object(file)))
+                FAIL_STACK_ERROR
+
+            /* Ignore metadata tags in the file's cache */
+            if (H5AC_ignore_tags(f) < 0)
                 FAIL_STACK_ERROR
 
             /* Re-open the heap */
@@ -15035,7 +15378,11 @@ test_filtered_man_root_indirect(hid_t fapl, H5HF_create_t *cparam, fheap_test_pa
                 FAIL_STACK_ERROR
 
             /* Get a pointer to the internal file object */
-            if(NULL == (f = H5I_object(file)))
+            if(NULL == (f = (H5F_t *)H5I_object(file)))
+                FAIL_STACK_ERROR
+
+            /* Ignore metadata tags in the file's cache */
+            if (H5AC_ignore_tags(f) < 0)
                 FAIL_STACK_ERROR
 
             /* Re-open the heap */
@@ -15116,7 +15463,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_random(hsize_t size_limit, hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -15320,7 +15667,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_random_pow2(hsize_t size_limit, hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -15546,7 +15893,7 @@ static size_t test_write_filter(unsigned int H5_ATTR_UNUSED flags, size_t H5_ATT
     return nbytes;
 } /* end link_filter_filter */
 
-static int
+static unsigned
 test_write(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -15675,14 +16022,18 @@ test_write(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
 
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
+        FAIL_STACK_ERROR
+
     /* Re-open the heap */
     if(NULL == (fh = H5HF_open(f, H5P_DATASET_XFER_DEFAULT, fh_addr)))
         FAIL_STACK_ERROR
 
     /* Initialize data to overwrite with */
-    rewrite_obj = H5MM_malloc(shared_obj_size_g);
+    rewrite_obj = (unsigned char *)H5MM_malloc(shared_obj_size_g);
     for(u = 0; u < shared_obj_size_g; u++)
-        rewrite_obj[u] = shared_wobj_g[u] * 2;
+        rewrite_obj[u] = (unsigned char)(shared_wobj_g[u] * 2);
 
     /* Insert different sized objects, but stay out of "tiny" and "huge" zones */
     obj_size = 20;
@@ -15735,7 +16086,11 @@ test_write(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         FAIL_STACK_ERROR
 
     /* Re-open the heap */
@@ -15815,7 +16170,7 @@ error:
  *
  *-------------------------------------------------------------------------
  */
-static int
+static unsigned
 test_bug1(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
 {
     hid_t	file = -1;              /* File ID */
@@ -15896,7 +16251,11 @@ test_bug1(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         FAIL_STACK_ERROR
 
     /* Re-open the heap */
@@ -15922,7 +16281,11 @@ test_bug1(hid_t fapl, H5HF_create_t *cparam, fheap_test_param_t *tparam)
         FAIL_STACK_ERROR
 
     /* Get a pointer to the internal file object */
-    if(NULL == (f = H5I_object(file)))
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Ignore metadata tags in the file's cache */
+    if (H5AC_ignore_tags(f) < 0)
         FAIL_STACK_ERROR
 
     /* Re-open the heap */
@@ -16008,8 +16371,8 @@ main(void)
 
     /* Allocate space for the shared objects */
     shared_obj_size_g = large_cparam.max_man_size + 256;
-    shared_wobj_g = H5MM_malloc(shared_obj_size_g);
-    shared_robj_g = H5MM_malloc(shared_obj_size_g);
+    shared_wobj_g = (unsigned char *)H5MM_malloc(shared_obj_size_g);
+    shared_robj_g = (unsigned char *)H5MM_malloc(shared_obj_size_g);
 
     /* Initialize the shared write buffer for objects */
     for(u = 0; u < shared_obj_size_g; u++)
@@ -16017,7 +16380,7 @@ main(void)
 
     /* Iterate over the testing parameters */
 #ifndef QAK
-    for(curr_test = FHEAP_TEST_NORMAL; curr_test < FHEAP_TEST_NTESTS; curr_test++) {
+    for(curr_test = FHEAP_TEST_NORMAL; curr_test < FHEAP_TEST_NTESTS; H5_INC_ENUM(fheap_test_type_t, curr_test)) {
 #else /* QAK */
 HDfprintf(stderr, "Uncomment test loop!\n");
 curr_test = FHEAP_TEST_NORMAL;
@@ -16067,7 +16430,7 @@ HDfprintf(stderr, "Uncomment tests!\n");
 
 #ifndef QAK2
         /* Filling with different sized objects */
-        for(fill = FHEAP_TEST_FILL_LARGE; fill < FHEAP_TEST_FILL_N; fill++) {
+        for(fill = FHEAP_TEST_FILL_LARGE; fill < FHEAP_TEST_FILL_N; H5_INC_ENUM(fheap_test_fill_t, fill)) {
 #else /* QAK2 */
 HDfprintf(stderr, "Uncomment test loop!\n");
 fill = FHEAP_TEST_FILL_LARGE;
@@ -16179,9 +16542,9 @@ HDfprintf(stderr, "Uncomment tests!\n");
             fheap_test_del_drain_t drain_half;   /* Deletion draining */
 
             /* More complex removal patterns */
-            for(del_dir = FHEAP_DEL_FORWARD; del_dir < FHEAP_DEL_NDIRS; del_dir++) {
+            for(del_dir = FHEAP_DEL_FORWARD; del_dir < FHEAP_DEL_NDIRS; H5_INC_ENUM(fheap_test_del_dir_t, del_dir)) {
                 tparam.del_dir = del_dir;
-                for(drain_half = FHEAP_DEL_DRAIN_ALL; drain_half < FHEAP_DEL_DRAIN_N; drain_half++) {
+                for(drain_half = FHEAP_DEL_DRAIN_ALL; drain_half < FHEAP_DEL_DRAIN_N; H5_INC_ENUM(fheap_test_del_drain_t, drain_half)) {
                     tparam.drain_half = drain_half;
 #else /* QAK2 */
 HDfprintf(stderr, "Uncomment test loops!\n");
@@ -16290,7 +16653,7 @@ HDfprintf(stderr, "Uncomment tests!\n");
         /* Test "normal" & "direct" storage of 'huge' & 'tiny' heap IDs */
         for(id_len = 0; id_len < 3; id_len++) {
             /* Set the ID length for this test */
-            small_cparam.id_len = id_len;
+            small_cparam.id_len = (uint16_t)id_len;
 
             /* Print information about each test */
             switch(id_len) {
@@ -16320,7 +16683,7 @@ HDfprintf(stderr, "Uncomment tests!\n");
             } /* end switch */
 
             /* Try several different methods of deleting objects */
-            for(del_dir = FHEAP_DEL_FORWARD; del_dir < FHEAP_DEL_NDIRS; del_dir++) {
+            for(del_dir = FHEAP_DEL_FORWARD; del_dir < FHEAP_DEL_NDIRS; H5_INC_ENUM(fheap_test_del_dir_t, del_dir)) {
                 tparam.del_dir = del_dir;
 
                 /* Test 'huge' object insert & delete */
@@ -16363,7 +16726,7 @@ HDfprintf(stderr, "Uncomment tests!\n");
         {
         fheap_test_del_dir_t del_dir;   /* Deletion direction */
 
-        for(del_dir = FHEAP_DEL_FORWARD; del_dir < FHEAP_DEL_NDIRS; del_dir++) {
+        for(del_dir = FHEAP_DEL_FORWARD; del_dir < FHEAP_DEL_NDIRS; H5_INC_ENUM(fheap_test_del_dir_t, del_dir)) {
             tparam.del_dir = del_dir;
 
             /* Controlled tests */
diff --git a/test/file_image.c b/test/file_image.c
index b1b9d47..52d0b28 100644
--- a/test/file_image.c
+++ b/test/file_image.c
@@ -41,6 +41,8 @@
 
 #define FAMILY_SIZE (2 * 1024)
 
+#define USERBLOCK_SIZE 512
+
 const char *FILENAME[] = {
     "file_image_core_test",
     NULL
@@ -549,7 +551,7 @@ test_core(void)
     VERIFY(fapl >= 0, "fapl creation failed");
 
     /* Set up the core VFD */
-    ret = H5Pset_fapl_core(fapl, 0, 0);
+    ret = H5Pset_fapl_core(fapl, (size_t)0, 0);
     VERIFY(ret >= 0, "setting core driver in fapl failed");
 
     tmp = h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
@@ -643,7 +645,7 @@ test_core(void)
     if(H5Fclose(file) < 0) FAIL_STACK_ERROR
 
     /* Release resources */
-    h5_cleanup(FILENAME, fapl); 
+    h5_clean_files(FILENAME, fapl); 
     HDfree(udata);
     HDfree(file_image);
     HDremove(copied_filename);
@@ -665,12 +667,17 @@ error:
  * Programmer:  John Mainzer
  *              Tuesday, November 15, 2011
  *
+ * Modifications:
+ *      Vailin Choi; July 2013
+ *      Add the creation of user block to the file as indicated by the parameter "user".
+ *
  ******************************************************************************
  */
 static int
 test_get_file_image(const char * test_banner,
                     const int file_name_num,
-                    hid_t fapl)
+		    hid_t fapl,
+                    hbool_t user)
 {
     char file_name[1024] = "\0";
     void * insertion_ptr = NULL;
@@ -694,6 +701,8 @@ test_get_file_image(const char * test_banner,
     ssize_t image_size;
     ssize_t file_size;
     h5_stat_t stat_buf;
+    hid_t fcpl = -1;
+    herr_t ret;
 
     TESTING(test_banner);
 
@@ -708,8 +717,15 @@ test_get_file_image(const char * test_banner,
     h5_fixname(FILENAME2[file_name_num], fapl, file_name, sizeof(file_name));
     VERIFY(HDstrlen(file_name)>0, "h5_fixname failed");
 
+    fcpl = H5Pcreate(H5P_FILE_CREATE);
+    VERIFY(fcpl >= 0, "H5Pcreate");
+    if(user) {
+        ret = H5Pset_userblock(fcpl, (hsize_t)USERBLOCK_SIZE);
+        VERIFY(ret >=0, "H5Pset_userblock");
+    }
+
     /* create the file */
-    file_id = H5Fcreate(file_name, 0, H5P_DEFAULT, fapl);
+    file_id = H5Fcreate(file_name, 0, fcpl, fapl);
     VERIFY(file_id >= 0, "H5Fcreate() failed.");
 
     /* Set up data space for new new data set */
@@ -761,11 +777,15 @@ test_get_file_image(const char * test_banner,
         ssize_t member_size;
         ssize_t size_remaining;
 
+	/*
+         * Modifications need to be made to accommodate userblock when
+         * H5Fget_file_image() works for family driver
+         */
         i = 0;
         file_size = 0;
 
         do {
-            HDsnprintf(member_file_name, 1024, file_name, i);
+            HDsnprintf(member_file_name, (size_t)1024, file_name, i);
 
             /* get the size of the member file */
             result = HDstat(member_file_name, &stat_buf);
@@ -829,6 +849,10 @@ test_get_file_image(const char * test_banner,
          * the remainder of the file is all '\0's.
          */
         file_size = (ssize_t)stat_buf.st_size;
+	if(user) {
+            VERIFY(file_size > USERBLOCK_SIZE, "file size !> userblock size.");
+            file_size -= USERBLOCK_SIZE;
+        }
 
     /* with latest mods to truncate call in core file drive, 
          * file size should match image size 
@@ -843,6 +867,12 @@ test_get_file_image(const char * test_banner,
         fd = HDopen(file_name, O_RDONLY, 0666);
         VERIFY(fd >= 0, "HDopen() failed.");
 
+	if(user) {
+            /* Position at userblock */
+            ret = HDlseek(fd, (off_t)USERBLOCK_SIZE, SEEK_SET);
+            VERIFY(ret >= 0, "HDlseek() failed.");
+        }
+
         /* read the test file from disk into the buffer */
         bytes_read = HDread(fd, file_image_ptr, (size_t)file_size);
         VERIFY(bytes_read == file_size, "HDread() failed.");
@@ -890,8 +920,7 @@ test_get_file_image(const char * test_banner,
     VERIFY(err == SUCCEED, "H5Pclose(core_fapl_id) failed.");
 
     /* tidy up */
-    result = h5_cleanup(FILENAME2, fapl);
-    VERIFY(result != 0, "h5_cleanup() failed.");
+    h5_clean_files(FILENAME2, fapl);
 
     /* discard the image buffer if it exists */
     if(image_ptr != NULL) 
@@ -931,7 +960,6 @@ test_get_file_image_error_rejection(void)
     void * image_ptr = NULL;
     int data[100];
     int i;
-    int result;
     hid_t fapl_id = -1;
     hid_t file_id = -1;
     hid_t dset_id = -1;
@@ -1039,8 +1067,7 @@ test_get_file_image_error_rejection(void)
     VERIFY(err == SUCCEED, "H5Fclose(file_id) failed.");
 
     /* tidy up */
-    result = h5_cleanup(FILENAME2, fapl_id);
-    VERIFY(result != 0, "h5_cleanup(1) failed.");
+    h5_clean_files(FILENAME2, fapl_id);
 
     /* discard the image buffer if it exists */
     if(image_ptr != NULL) 
@@ -1145,8 +1172,7 @@ test_get_file_image_error_rejection(void)
     VERIFY(err == SUCCEED, "H5Fclose(2) failed.");
 
     /* tidy up */
-    result = h5_cleanup(FILENAME2, fapl_id);
-    VERIFY(result != 0, "h5_cleanup(2 failed.");
+    h5_clean_files(FILENAME2, fapl_id);
 
     /************************** Test #3 **********************************/
     /* set up a split file driver test file, and try to get its image 
@@ -1208,8 +1234,7 @@ test_get_file_image_error_rejection(void)
     VERIFY(err == SUCCEED, "H5Fclose(2) failed.");
 
     /* tidy up */
-    result = h5_cleanup(FILENAME2, fapl_id);
-    VERIFY(result != 0, "h5_cleanup(2 failed.");
+    h5_clean_files(FILENAME2, fapl_id);
 
     /************************** Test #4 **********************************/
     /* set up a family file driver test file, and try to get its image 
@@ -1269,8 +1294,7 @@ test_get_file_image_error_rejection(void)
     VERIFY(err == SUCCEED, "H5Fclose(2) failed.");
 
     /* tidy up */
-    result = h5_cleanup(FILENAME2, fapl_id);
-    VERIFY(result != 0, "h5_cleanup(2 failed.");
+    h5_clean_files(FILENAME2, fapl_id);
     
     PASSED();
 
@@ -1278,13 +1302,18 @@ test_get_file_image_error_rejection(void)
 
 error:
     return 1;
-}
+} /* test_get_file_image_error_rejection() */
 
+/*
+ * Modifications:
+ *     Add testing for file image with or without user block in the file.
+ */
 int
 main(void)
 {
     int errors = 0;
     hid_t fapl;
+    unsigned user;
 
     h5_reset();
 
@@ -1294,29 +1323,34 @@ main(void)
     errors += test_callbacks();
     errors += test_core();
 
-    /* test H5Fget_file_image() with sec2 driver */
-    fapl = H5Pcreate(H5P_FILE_ACCESS);
-    if(H5Pset_fapl_sec2(fapl) < 0)
-        errors++;
-    else
-        errors += test_get_file_image("H5Fget_file_image() with sec2 driver",
-                                      0, fapl);
-
-    /* test H5Fget_file_image() with stdio driver */
-    fapl = H5Pcreate(H5P_FILE_ACCESS);
-    if(H5Pset_fapl_stdio(fapl) < 0)
-        errors++;
-    else
-        errors += test_get_file_image("H5Fget_file_image() with stdio driver",
-                                      1, fapl);
-
-    /* test H5Fget_file_image() with core driver */
-    fapl = H5Pcreate(H5P_FILE_ACCESS);
-    if(H5Pset_fapl_core(fapl, (size_t)(64 *1024), TRUE) < 0)
-        errors++;
-    else
-        errors += test_get_file_image("H5Fget_file_image() with core driver",
-                                      2, fapl);
+    /* Perform tests with/without user block */
+    for(user = FALSE; user <= TRUE; user++) {
+
+	/* test H5Fget_file_image() with sec2 driver */
+	fapl = H5Pcreate(H5P_FILE_ACCESS);
+	if(H5Pset_fapl_sec2(fapl) < 0)
+	    errors++;
+	else
+	    errors += test_get_file_image("H5Fget_file_image() with sec2 driver",
+                                      0, fapl, user);
+
+	/* test H5Fget_file_image() with stdio driver */
+	fapl = H5Pcreate(H5P_FILE_ACCESS);
+	if(H5Pset_fapl_stdio(fapl) < 0)
+	    errors++;
+	else
+	    errors += test_get_file_image("H5Fget_file_image() with stdio driver",
+                                      1, fapl, user);
+
+	/* test H5Fget_file_image() with core driver */
+	fapl = H5Pcreate(H5P_FILE_ACCESS);
+	if(H5Pset_fapl_core(fapl, (size_t)(64 *1024), TRUE) < 0)
+	    errors++;
+	else
+	    errors += test_get_file_image("H5Fget_file_image() with core driver",
+                                      2, fapl, user);
+
+     } /* end for */
 
 #if 0
     /* at present, H5Fget_file_image() rejects files opened with the 
@@ -1340,6 +1374,8 @@ main(void)
 
     errors += test_get_file_image_error_rejection();
 
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
 
     if(errors) { 
         printf("***** %d File Image TEST%s FAILED! *****\n", 
diff --git a/test/filespace_1_6.h5 b/test/filespace_1_6.h5
new file mode 100644
index 0000000..c8aa9df
Binary files /dev/null and b/test/filespace_1_6.h5 differ
diff --git a/test/filespace_1_8.h5 b/test/filespace_1_8.h5
new file mode 100644
index 0000000..85138b0
Binary files /dev/null and b/test/filespace_1_8.h5 differ
diff --git a/test/fill_old.h5 b/test/fill_old.h5
index e77f519..4dd7740 100644
Binary files a/test/fill_old.h5 and b/test/fill_old.h5 differ
diff --git a/test/fillval.c b/test/fillval.c
index 1c90963..1ea2ae6 100644
--- a/test/fillval.c
+++ b/test/fillval.c
@@ -627,7 +627,7 @@ test_create(hid_t fapl, const char *base_name, H5D_layout_t layout)
            H5_FAILED();
            puts("    Got wrong fill value");
            printf("    Got rd_c.a=%f, rd_c.y=%f and rd_c.x=%d, rd_c.z=%c\n",
-                  rd_c.a, rd_c.y, rd_c.x, rd_c.z);
+                  (double)rd_c.a, rd_c.y, rd_c.x, rd_c.z);
         }
         if(H5Dclose(dset9) < 0) goto error;
         if(H5Pclose(dcpl) < 0) goto error;
@@ -700,7 +700,7 @@ test_create(hid_t fapl, const char *base_name, H5D_layout_t layout)
         H5_FAILED();
         puts("    Got wrong fill value");
         printf("    Got rd_c.a=%f, rd_c.y=%f and rd_c.x=%d, rd_c.z=%c\n",
-		rd_c.a, rd_c.y, rd_c.x, rd_c.z);
+		(double)rd_c.a, rd_c.y, rd_c.x, rd_c.z);
     }
     if(H5Dclose(dset8) < 0) goto error;
     if(H5Pclose(dcpl) < 0) goto error;
@@ -820,8 +820,8 @@ test_rdwr_cases(hid_t file, hid_t dcpl, const char *dname, void *_fillval,
                        "Fill value: %f, %d, %f, %c\n",
                        hs_offset[0], hs_offset[1],
                        hs_offset[2], hs_offset[3],
-                       hs_offset[4], rd_c.a, rd_c.x, rd_c.y, rd_c.z,
-			fill_c.a, fill_c.x, fill_c.y, fill_c.z);
+                       hs_offset[4], (double)rd_c.a, rd_c.x, rd_c.y, rd_c.z,
+			(double)fill_c.a, fill_c.x, fill_c.y, fill_c.z);
                 goto error;
             }
         }
@@ -845,7 +845,7 @@ test_rdwr_cases(hid_t file, hid_t dcpl, const char *dname, void *_fillval,
     if(datatype==H5T_INTEGER) {
         /*check for overflow*/
         HDassert((nelmts * sizeof(int)) == (hsize_t)((size_t)(nelmts * sizeof(int))));
-        buf = HDmalloc((size_t)(nelmts * sizeof(int)));
+        buf = (int *)HDmalloc((size_t)(nelmts * sizeof(int)));
 
         if(H5Dread(dset1, H5T_NATIVE_INT, mspace, fspace, H5P_DEFAULT, buf) < 0)
             goto error;
@@ -888,8 +888,8 @@ test_rdwr_cases(hid_t file, hid_t dcpl, const char *dname, void *_fillval,
                             hs_offset[0], hs_offset[1],
                             hs_offset[2], hs_offset[3],
                             hs_offset[4],
-                            buf_c[u].a, buf_c[u].x, buf_c[u].y, buf_c[u].z,
-                            fill_c.a, fill_c.x, fill_c.y, fill_c.z);
+                            (double)buf_c[u].a, buf_c[u].x, buf_c[u].y, buf_c[u].z,
+                            (double)fill_c.a, fill_c.x, fill_c.y, fill_c.z);
                     goto error;
                 } /* end if */
             } /* end for */
@@ -1002,7 +1002,7 @@ test_rdwr_cases(hid_t file, hid_t dcpl, const char *dname, void *_fillval,
                            (long)hs_offset[0], (long)hs_offset[1],
                            (long)hs_offset[2], (long)hs_offset[3],
                            (long)hs_offset[4],
-			   rd_c.a, rd_c.x, rd_c.y, rd_c.z, should_be_c.a,
+			   (double)rd_c.a, rd_c.x, rd_c.y, rd_c.z, (double)should_be_c.a,
 		           should_be_c.x,should_be_c.y,should_be_c.z);
                     goto error;
  		}
@@ -1021,7 +1021,7 @@ test_rdwr_cases(hid_t file, hid_t dcpl, const char *dname, void *_fillval,
                            (long)hs_offset[0], (long)hs_offset[1],
                            (long)hs_offset[2], (long)hs_offset[3],
                            (long)hs_offset[4],
-                           rd_c.a, rd_c.x, rd_c.y, rd_c.z, should_be_c.a,
+                           (double)rd_c.a, rd_c.x, rd_c.y, rd_c.z, (double)should_be_c.a,
                            should_be_c.x,should_be_c.y,should_be_c.z);
                     goto error;
                 }
@@ -1978,19 +1978,10 @@ test_compatible(void)
     hsize_t    dims[2], one[2]={1,1};
     hsize_t   hs_offset[2]={3,4};
     H5D_fill_value_t status;
-    char       *srcdir = getenv("srcdir"); /*where the src code is located*/
-    char       testfile[512]="";  /* test file name */
+    const char *testfile = H5_get_srcdir_filename(FILE_COMPATIBLE); /* Corrected test file name */
 
     TESTING("contiguous dataset compatibility with v. 1.4");
 
-  /* Generate correct name for test file by prepending the source path */
-  if(srcdir && ((strlen(srcdir) + strlen(FILE_COMPATIBLE) + 1) <
-     sizeof(testfile))) {
-     HDstrcpy(testfile, srcdir);
-     HDstrcat(testfile, "/");
-  }
-  HDstrcat(testfile, FILE_COMPATIBLE);
-
   if((file = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0) {
       printf("    Could not open file %s. Try set $srcdir to point at the "
               "source directory of test\n", testfile);
@@ -2377,7 +2368,7 @@ main(int argc, char *argv[])
 {
     int	nerrors=0, argno, test_contig=1, test_chunk=1, test_compact=1;
     hid_t	fapl = (-1), fapl2 = (-1);    /* File access property lists */
-    hbool_t new_format;     /* Whether to use the new format or not */
+    unsigned new_format;     /* Whether to use the new format or not */
 
     if(argc >= 2) {
         test_contig = test_chunk = test_compact = 0;
diff --git a/test/fixed_idx.h5 b/test/fixed_idx.h5
deleted file mode 100644
index b9971b2..0000000
Binary files a/test/fixed_idx.h5 and /dev/null differ
diff --git a/test/flush2.c b/test/flush2.c
index c6e4c3a..ddb1c59 100644
--- a/test/flush2.c
+++ b/test/flush2.c
@@ -17,13 +17,18 @@
  * Programmer:  Robb Matzke <matzke at llnl.gov>
  *              Friday, October 23, 1998
  *
- * Purpose:  This is the second half of a two-part test that makes sure
- *    that a file can be read after an application crashes as long
- *    as the file was flushed first.  This half tries to read the
- *    file created by the first half.
+ * Purpose:	This is the second half of a two-part test that makes sure
+ *		that a file can be read after an application crashes as long
+ *		as the file was flushed first.  This half tries to read the
+ *		file created by the first half.
  */
 #include "h5test.h"
 
+/* Make this private property (defined in H5Fprivate.h) available */
+/* This is used in the helper routine clear_status_flags() */
+#define H5F_ACS_CLEAR_STATUS_FLAGS_NAME            "clear_status_flags"
+
+
 const char *FILENAME[] = {
     "flush",
     "noflush",
@@ -31,19 +36,19 @@ const char *FILENAME[] = {
     NULL
 };
 
-static double  the_data[100][100];
+static double	the_data[100][100];
 
 /*-------------------------------------------------------------------------
- * Function:  check_dset
+ * Function:	check_dset
  *
- * Purpose:  Part 2 of a two-part H5Fflush() test, checks if the data in a dataset
- *     is what it is supposed to be.
+ * Purpose:	Part 2 of a two-part H5Fflush() test, checks if the data in a dataset
+ * 		is what it is supposed to be.
  *
- * Return:  Success:  0
+ * Return:	Success:	0
  *
- *    Failure:  1
+ *		Failure:	1
  *
- * Programmer:  Leon Arber
+ * Programmer:	Leon Arber
  *              Oct. 4, 2006.
  *
  *-------------------------------------------------------------------------
@@ -51,10 +56,10 @@ static double  the_data[100][100];
 static int
 check_dset(hid_t file, const char* name)
 {
-    hid_t  space, dset;
-    hsize_t  ds_size[2] = {100, 100};
-    double  error;
-    size_t  i, j;
+    hid_t	space, dset;
+    hsize_t	ds_size[2] = {100, 100};
+    double	error;
+    size_t	i, j;
 
     /* Open the dataset */
     if((dset = H5Dopen2(file, name, H5P_DEFAULT)) < 0) goto error;
@@ -63,27 +68,26 @@ check_dset(hid_t file, const char* name)
     assert(100 == ds_size[0] && 100 == ds_size[1]);
 
     /* Read some data */
-    if(H5Dread(dset, H5T_NATIVE_DOUBLE, space, space, H5P_DEFAULT, the_data) < 0)
-        goto error;
+    if(H5Dread(dset, H5T_NATIVE_DOUBLE, space, space, H5P_DEFAULT,
+		the_data) < 0) goto error;
     for(i = 0; i < (size_t)ds_size[0]; i++)
-        for(j = 0; j < (size_t)ds_size[1]; j++) {
-            /*
-             * The extra cast in the following statement is a bug workaround
-             * for the Win32 version 5.0 compiler.
-             * 1998-11-06 ptl
-             */
-            error = fabs(the_data[i][j] - (double)(hssize_t)i / ((hssize_t)j + 1));
-            if(error > 0.0001F) {
-                H5_FAILED();
-                printf("    dset[%lu][%lu] = %g\n",
-                    (unsigned long)i, (unsigned long)j, the_data[i][j]);
-                printf("    should be %g\n",
-                    (double)(hssize_t)i/(hssize_t)(j+1));
-                goto error;
-            } /* end if */
-        } /* end for */
-    if(H5Dclose(dset) < 0)
-        goto error;
+	for(j = 0; j < (size_t)ds_size[1]; j++) {
+	    /*
+	     * The extra cast in the following statement is a bug workaround
+	     * for the Win32 version 5.0 compiler.
+	     * 1998-11-06 ptl
+	     */
+	    error = fabs(the_data[i][j] - (double)(hssize_t)i / ((hssize_t)j + 1));
+	    if(error > 0.0001F) {
+		    H5_FAILED();
+		    printf("    dset[%lu][%lu] = %g\n",
+			    (unsigned long)i, (unsigned long)j, the_data[i][j]);
+		    printf("    should be %g\n",
+			    (double)(hssize_t)i/(hssize_t)(j+1));
+		    goto error;
+	    }
+	}
+    if(H5Dclose(dset) < 0) goto error;
     return 0;
 
 error:
@@ -92,15 +96,15 @@ error:
 
 

 /*-------------------------------------------------------------------------
- * Function:  check_file
+ * Function:	check_file
  *
- * Purpose:  Part 2 of a two-part H5Fflush() test.
+ * Purpose:	Part 2 of a two-part H5Fflush() test.
  *
- * Return:  Success:  0
+ * Return:	Success:	0
  *
- *    Failure:  1
+ *		Failure:	1
  *
- * Programmer:  Leon Arber
+ * Programmer:	Leon Arber
  *              Sept. 26, 2006.
  *
  *-------------------------------------------------------------------------
@@ -108,9 +112,9 @@ error:
 static int
 check_file(char* filename, hid_t fapl, int flag)
 {
-    hid_t  file, groups, grp;
-    char  name[1024];
-    int    i;
+    hid_t	file = -1, groups = -1;
+    char	name[1024];
+    int		i;
 
     if((file = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0) goto error;
     if(check_dset(file, "dset")) goto error;
@@ -118,9 +122,10 @@ check_file(char* filename, hid_t fapl, int flag)
     /* Open some groups */
     if((groups = H5Gopen2(file, "some_groups", H5P_DEFAULT)) < 0) goto error;
     for(i = 0; i < 100; i++) {
-  sprintf(name, "grp%02u", (unsigned)i);
-  if((grp = H5Gopen2(groups, name, H5P_DEFAULT)) < 0) goto error;
-  if(H5Gclose(grp) < 0) goto error;
+        hid_t	grp;
+	sprintf(name, "grp%02u", (unsigned)i);
+	if((grp = H5Gopen2(groups, name, H5P_DEFAULT)) < 0) goto error;
+	if(H5Gclose(grp) < 0) goto error;
     } /* end for */
 
     /* Check to see if that last added dataset in the third file is accessible
@@ -133,25 +138,77 @@ check_file(char* filename, hid_t fapl, int flag)
     return 0;
 
 error:
+    H5E_BEGIN_TRY {
+        H5Gclose(groups);
+        H5Fclose(file);
+    } H5E_END_TRY;
+
     return 1;
 } /* end check_file() */
 
+/*-------------------------------------------------------------------------
+ * Function:	clear_status_flags
+ *
+ * Purpose:	To clear the status_flags in the superblock of the file.
+ * 		It is smilar to the tool "h5clear".
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:	Vailin Choi
+ *              July 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+clear_status_flags(char *name, hid_t fapl)
+{
+    hid_t new_fapl = -1;
+    hid_t fid = -1;
+    hbool_t clear = TRUE;
+
+    /* Get a copy of fapl */
+    if((new_fapl = H5Pcopy(fapl)) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Set this private property */
+    if(H5Pset(new_fapl, H5F_ACS_CLEAR_STATUS_FLAGS_NAME, &clear) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Has to open rw */
+    if((fid = H5Fopen(name, H5F_ACC_RDWR, new_fapl)) < 0)
+	FAIL_STACK_ERROR;
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+	FAIL_STACK_ERROR;
+
+    /* CLose the property list */
+    if(H5Pclose(new_fapl) < 0)
+	FAIL_STACK_ERROR;
+
+    return 0;
+
+error:
+    return 1;
+} /* clear_status_flags() */
+
 

 /*-------------------------------------------------------------------------
- * Function:  main
+ * Function:	main
  *
- * Purpose:  Part 2 of a two-part H5Fflush() test.
+ * Purpose:	Part 2 of a two-part H5Fflush() test.
  *
- * Return:  Success:  0
+ * Return:	Success:	0
  *
- *    Failure:  1
+ *		Failure:	1
  *
- * Programmer:  Robb Matzke
+ * Programmer:	Robb Matzke
  *              Friday, October 23, 1998
  *
  * Modifications:
- *     Leon Arber
- *     Sept. 26, 2006, expand to check for case where the was file not flushed.
+ * 		Leon Arber
+ * 		Sept. 26, 2006, expand to check for case where the was file not flushed.
  *
  *-------------------------------------------------------------------------
  */
@@ -160,7 +217,7 @@ main(void)
 {
     hid_t fapl;
     H5E_auto2_t func;
-    char  name[1024];
+    char	name[1024];
 
     h5_reset();
     fapl = h5_fileaccess();
@@ -168,6 +225,13 @@ main(void)
 
     /* Check the case where the file was flushed */
     h5_fixname(FILENAME[0], fapl, name, sizeof name);
+
+    /* Clear the status_flags of the file which is flushed and exited in flush1.c */
+    if(clear_status_flags(name, fapl) < 0) {
+        H5_FAILED()
+        goto error;
+    }
+
     if(check_file(name, fapl, FALSE)) {
         H5_FAILED()
         goto error;
@@ -183,16 +247,17 @@ main(void)
     H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
 
     h5_fixname(FILENAME[1], fapl, name, sizeof name);
+    /* No need to clear the status_flags because this file is not flushed in flush1.c */
+    /* H5Fopen() in check_file() will just return error */
     if(check_file(name, fapl, FALSE))
         PASSED()
-    else
-    {
+    else {
 #if defined H5_HAVE_WIN32_API && !defined (hdf5_EXPORTS)
-    SKIPPED();
-    puts("   DLL will flush the file even when calling _exit, skip this test temporarily");
+        SKIPPED();
+        puts("   DLL will flush the file even when calling _exit, skip this test temporarily");
 #else
-    H5_FAILED()
-    goto error;
+        H5_FAILED()
+        goto error;
 #endif
     }
     H5Eset_auto2(H5E_DEFAULT, func, NULL);
@@ -204,19 +269,25 @@ main(void)
     H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
 
     h5_fixname(FILENAME[2], fapl, name, sizeof name);
+
+    /* Clear the status_flags of the file which is flushed and exited in flush1.c */
+    if(clear_status_flags(name, fapl) < 0) {
+        H5_FAILED()
+        goto error;
+    }
+
     if(check_file(name, fapl, TRUE))
         PASSED()
-    else
-    {
+    else {
 #if defined H5_HAVE_WIN32_API && !defined (hdf5_EXPORTS)
-    SKIPPED();
-    puts("   DLL will flush the file even when calling _exit, skip this test temporarily");
+        SKIPPED();
+        puts("   DLL will flush the file even when calling _exit, skip this test temporarily");
 #else
-    H5_FAILED()
-    goto error;
+        H5_FAILED()
+        goto error;
 #endif
-
     }
+
     H5Eset_auto2(H5E_DEFAULT, func, NULL);
 
     h5_cleanup(FILENAME, fapl);
diff --git a/test/flushrefresh.c b/test/flushrefresh.c
new file mode 100644
index 0000000..0fc6e2f
--- /dev/null
+++ b/test/flushrefresh.c
@@ -0,0 +1,1279 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer: Mike McGreevy
+ *             June 30, 2010
+ *
+ * Purpose: This test file contains routines used to test flushing and 
+ *          refreshing individual objects' metadata from the cache. 
+ *          
+ *          Note: This file should NOT be run manually. Instead, invoke it 
+ *          via its associated test script, testflushrefresh.sh
+ *
+ */
+
+/* ======== */
+/* Includes */
+/* ======== */
+
+#include "testhdf5.h"
+
+/* ======= */
+/* Defines */
+/* ======= */
+
+/* Name of Test File */
+#define FILENAME "flushrefresh.h5"
+
+/* Names of Signal Files */
+#define SIGNAL_TO_SCRIPT "flushrefresh_VERIFICATION_START"
+#define SIGNAL_BETWEEN_PROCESSES_1 "flushrefresh_VERIFICATION_CHECKPOINT1"
+#define SIGNAL_BETWEEN_PROCESSES_2 "flushrefresh_VERIFICATION_CHECKPOINT2"
+#define SIGNAL_FROM_SCRIPT "flushrefresh_VERIFICATION_DONE"
+
+/* Signal Timeout Length in Secs */
+#define SIGNAL_TIMEOUT 300
+
+/* Paths to Various Objects in the Testfile */
+#define RG "/"
+#define D1 "/Dataset1"
+#define D2 "/Group1/Dataset2"
+#define D3 "/Group3/Dataset3"
+#define G1 "/Group1"
+#define G2 "/Group1/Group2"
+#define G3 "/Group3"
+#define T1 "/CommittedDatatype1"
+#define T2 "/Group1/Group2/CommittedDatatype2"
+#define T3 "/Group3/CommittedDatatype3"
+
+/* Flushed States */
+#define FLUSHED "FLUSHED"
+#define NOT_FLUSHED "NOT_FLUSHED"
+
+/* Error Handling */
+/* For errors occuring in the main process, use the standard TEST_ERROR macro.
+   For errors occurring in the spawned process (from the test script), use
+   the PROCESS_ERROR macro, which will send a signal to the main process so the
+   main process can propogate errors correctly. */
+FILE * errorfile;
+#define ERRFILE "flushrefresh_ERROR"
+#define PROCESS_ERROR                                            \
+    { errorfile = fopen(ERRFILE, "w+");                          \
+      HDfprintf(errorfile, "Error occurred in flushrefresh.\n"); \
+      HDfflush(errorfile);                                       \
+      HDfclose(errorfile);                                       \
+      TEST_ERROR;                                                \
+    }
+
+#define CLEANUP_FILES                       \
+    {                                       \
+      HDremove(ERRFILE);                    \
+      HDremove(FILENAME);                   \
+      HDremove(SIGNAL_TO_SCRIPT);           \
+      HDremove(SIGNAL_BETWEEN_PROCESSES_1); \
+      HDremove(SIGNAL_BETWEEN_PROCESSES_2); \
+      HDremove(SIGNAL_FROM_SCRIPT);         \
+    }                                       \
+
+/* ===================== */
+/* Function Declarations */
+/* ===================== */
+
+/* Main */
+int main(int argc, const char *argv[]);
+
+/* Flush Test Framework */
+herr_t test_flush(void);
+herr_t flush_verification(const char * obj_pathname, const char * expected);
+herr_t run_flush_verification_process(const char * obj_pathname, const char * expected);
+
+/* Refresh Test Framework */
+herr_t test_refresh(void);
+herr_t refresh_verification(const char * obj_pathname);
+herr_t start_refresh_verification_process(const char * obj_pathname);
+herr_t end_refresh_verification_process(void);
+
+/* Other Helper Functions */
+herr_t check_for_errors(void);
+herr_t end_verification(void);
+herr_t wait_for_signal(const char * waitfor);
+void send_signal(const char * send, const char * arg1, const char * arg2);
+
+/* ========= */
+/* Functions */
+/* ========= */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Purpose:     This function coordinates the test of flush/refresh
+ *              functionality verification. It accepts either one, two or 
+ *              no command line parameters. The main test routine runs
+ *              with no command line parameters specified, while verification
+ *              routines run with one or two command line parameters.
+ * 
+ *              Note: This program should not be run manually, as the 
+ *              test is controlled by the testflushrefresh.sh script. Running
+ *              the flushrefresh program manually will result in failure, as
+ *              it will time out waiting for a signal from the test script
+ *              which will never come.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              July 1, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int main(int argc, const char *argv[]) 
+{
+    /* Variables */
+    const char *envval = NULL;
+
+    /* Initialize library */
+    if(H5open() < 0)
+        TEST_ERROR;
+
+    /* Parse command line options */
+    if (argc == 1) {
+
+        /* No arguments supplied. Run main test routines if 
+         * using sec2 or stdio driver, otherwise don't run 
+         * anything. */
+
+        /* Determine driver being used */
+        envval = HDgetenv("HDF5_DRIVER");
+        if(envval == NULL)
+            envval = "";
+
+        if (!HDstrcmp(envval, "sec2") || !HDstrcmp(envval, "stdio") || !HDstrcmp(envval, "")) {
+
+            if (test_flush() != SUCCEED) TEST_ERROR;
+            if (test_refresh() != SUCCEED) TEST_ERROR;
+
+        } /* end if */
+
+        else {
+            
+            HDfprintf(stdout, "Skipping all flush/refresh tests (only run with sec2 or stdio file drivers).\n");
+            
+            /* Test script is expecting some signals, so send them out to end it. */
+            if (end_verification() < 0) TEST_ERROR;
+            if (end_verification() < 0) TEST_ERROR;
+
+        } /* end else */
+
+    } else if (argc == 3) {
+
+        /* Two arguments supplied. Pass them to flush verification routine. */
+
+        if (flush_verification(argv[1], argv[2]) != 0) PROCESS_ERROR;
+
+    } else if (argc == 2) {
+
+        /* One argument supplied. Pass it to refresh verification routine. */
+
+        if (refresh_verification(argv[1]) != 0) PROCESS_ERROR;
+    
+    } else {
+
+        /* Illegal number of arguments supplied. Error. */
+
+        HDfprintf(stderr, "Error. %d is an Invalid number of arguments to main().\n", argc);
+        PROCESS_ERROR
+
+    } /* end if */
+
+    return SUCCEED;
+
+error:
+        
+    /* Return */
+    return FAIL;
+
+} /* main */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    test_flush
+ *
+ * Purpose:     This function tests flushing individual objects' metadata
+ *              from the metadata cache.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              July 1, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t test_flush(void) 
+{
+    /**************************************************************************
+     *
+     * Test Description:
+     *
+     * This test will build an HDF5 file with several objects in a varying 
+     * hierarchical layout. It will then attempt to flush the objects
+     * in the file one by one, individually, using the four H5*flush
+     * routines (D,G,T, and O). After each call to either create or flush an 
+     * object, a series of verifications will occur on each object in the file.
+     *
+     * Each verification consists of spawning off a new process and determining
+     * if the object can be opened and its information retreived in said 
+     * alternate process. It reports the results, which are compared to an 
+     * expected value (either that the object can be found on disk, or that it
+     * cannot).
+     *
+     * Note that to spawn a verification, this program sends a signal (by creating
+     * a file on disk) to the test script controlling it, indicating how to 
+     * run the verification.
+     * 
+     * Implementation is funky, but basically, an example: 
+     *
+     * Step 1. Dataset is created.
+     * Step 2. Verify that dataset can't be opened by separate process, as
+     *         it should not have been flushed to disk yet.
+     * Step 3. Group is created.
+     * Step 4. Verify that group can't be opened by separate process.
+     * Step 5. H5Gflush is called on the group.
+     * Step 6. Verify that group CAN be opened, but dataset still has
+     *         yet to hit disk, and CANNOT be opened. Success! Only the group 
+     *         was flushed.
+     *
+     **************************************************************************/
+
+    /**************************************************************************
+      * Generated Test File will look like this:
+      * 
+      * GROUP "/"
+      *   DATASET "Dataset1"
+      *   GROUP "Group1" {
+      *     DATASET "Dataset2"
+      *     GROUP "Group2" {
+      *       DATATYPE "CommittedDatatype3"
+      *     }
+      *   }
+      *   GROUP "Group3" {
+      *     DATASET "Dataset3"
+      *     DATATYPE "CommittedDatatype2"
+      *   }
+      *   DATATYPE "CommittedDatatype1"
+     **************************************************************************/
+
+    /* Variables */
+    hid_t fid,gid,gid2,gid3,sid,tid1,tid2,tid3,did,did2,did3,rid,fapl,status = 0;
+    hsize_t dims[2] = {3,5};
+
+    /* Testing Message */
+    HDfprintf(stdout, "Testing individual object flush behavior:\n");
+
+    /* Cleanup any old error or signal files */
+    CLEANUP_FILES;
+    
+    /* ================ */
+    /* CREATE TEST FILE */
+    /* ================ */
+
+    /* Create file, open root group - have to use latest file format for SWMR */
+    if ((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) TEST_ERROR;
+    if (H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0) TEST_ERROR; 
+    if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC|H5F_ACC_SWMR_WRITE, H5P_DEFAULT, fapl)) < 0) TEST_ERROR;
+    if ((rid = H5Gopen2(fid, "/", H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Create data space and types */
+    if ((sid = H5Screate_simple(2, dims, dims)) < 0) TEST_ERROR;
+    if ((tid1 = H5Tcopy(H5T_NATIVE_INT)) < 0) TEST_ERROR;
+    if ((tid2 = H5Tcopy(H5T_NATIVE_CHAR)) < 0) TEST_ERROR;
+    if ((tid3 = H5Tcopy(H5T_NATIVE_LONG)) < 0) TEST_ERROR;
+
+    /* Create Group1 */
+    if ((gid = H5Gcreate2(fid, "Group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Create Group2 */
+    if ((gid2 = H5Gcreate2(gid, "Group2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Create Group3 */
+    if ((gid3 = H5Gcreate2(fid, "Group3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Create Dataset1 */
+    if ((did = H5Dcreate2(fid, "Dataset1", tid1, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Create Dataset2 */
+    if ((did2 = H5Dcreate2(gid, "Dataset2", tid3, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Create Dataset3 */
+    if ((did3 = H5Dcreate2(gid3, "Dataset3", tid2, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Create CommittedDatatype1 */
+    if ((status = H5Tcommit2(fid, "CommittedDatatype1", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Create CommittedDatatype2 */
+    if ((status = H5Tcommit2(gid2, "CommittedDatatype2", tid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Create CommittedDatatype3 */
+    if ((status = H5Tcommit2(gid3, "CommittedDatatype3", tid3, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* ============ */
+    /* FLUSH GROUPS */
+    /* ============ */
+
+    /* Test */
+    TESTING("to ensure H5Gflush correctly flushes single groups");
+
+    /* First, let's verify that nothing is currently flushed. */
+    if (run_flush_verification_process(RG, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G1, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G2, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G3, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D1, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D2, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D3, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T1, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T2, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR;
+
+    /* Then, flush the root group and verify it's the only thing on disk */
+    if ((status = H5Gflush(rid)) < 0) TEST_ERROR;
+    if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G1, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G2, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G3, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D1, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D2, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D3, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T1, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T2, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR;
+
+    /* Flush Group1 and Verify it is recently flushed, and nothing 
+     * else has changed. */
+    if ((status = H5Gflush(gid)) < 0) TEST_ERROR;
+    if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G2, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G3, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D1, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D2, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D3, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T1, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T2, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR;
+
+    /* Flush Group2 and Verify it is recently flushed, and nothing 
+     * else has changed. */
+    if ((status = H5Gflush(gid2)) < 0) TEST_ERROR;
+    if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G2, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G3, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D1, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D2, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D3, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T1, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T2, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR;
+
+    PASSED();
+
+    /* ============== */
+    /* FLUSH DATASETS */
+    /* ============== */
+
+    /* Test */
+    TESTING("to ensure H5Dflush correctly flushes single datasets");
+
+    /* Flush Dataset1 and verify it's the only thing that hits disk. */
+    if ((status = H5Dflush(did)) < 0) TEST_ERROR;
+    if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G2, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G3, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D2, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D3, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T1, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T2, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR;
+
+    /* Flush Dataset2 and verify it's the only thing that hits disk. */
+    if ((status = H5Dflush(did2)) < 0) TEST_ERROR;
+    if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G2, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G3, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D2, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D3, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T1, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T2, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR;
+
+    PASSED();
+
+    /* =============== */
+    /* FLUSH DATATYPES */
+    /* =============== */
+
+    /* Test */
+    TESTING("to ensure H5Tflush correctly flushes single datatypes");
+
+    /* Flush Datatype 1 and verify it's the only thing that hits disk. */
+    if ((status = H5Tflush(tid1)) < 0) TEST_ERROR;
+    if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G2, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G3, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D2, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D3, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T2, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR;
+
+    /* Flush Datatype 2 and verify it's the only thing that hits disk. */
+    if ((status = H5Tflush(tid2)) < 0) TEST_ERROR;
+    if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G2, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G3, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D2, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D3, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T2, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR;
+
+    PASSED();
+    
+    /* ============= */
+    /* FLUSH OBJECTS */
+    /* ============= */
+
+    /* Test */
+    TESTING("to ensure H5Oflush correctly flushes single objects");
+
+    /* Flush Group3 and verify it's the only thing that hits disk. */
+    if ((status = H5Oflush(gid3)) < 0) TEST_ERROR;
+    if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G2, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G3, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D2, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D3, NOT_FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T2, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR;
+
+    /* Flush Dataset3 and verify it's the only thing that hits disk. */
+    if ((status = H5Oflush(did3)) < 0) TEST_ERROR;
+    if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G2, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G3, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D2, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D3, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T2, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T3, NOT_FLUSHED) != 0) TEST_ERROR;
+
+    /* Flush CommittedDatatype3 and verify it's the only thing that hits disk. */
+    if ((status = H5Oflush(tid3)) < 0) TEST_ERROR;
+    if (run_flush_verification_process(RG, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G2, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(G3, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D2, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(D3, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T1, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T2, FLUSHED) != 0) TEST_ERROR;
+    if (run_flush_verification_process(T3, FLUSHED) != 0) TEST_ERROR;
+
+    PASSED();
+
+    /* ================== */
+    /* Cleanup and Return */  
+    /* ================== */
+    if (H5Pclose(fapl) < 0) TEST_ERROR;
+    if (H5Gclose(gid) < 0) TEST_ERROR;
+    if (H5Gclose(gid2) < 0) TEST_ERROR;
+    if (H5Dclose(did) < 0) TEST_ERROR;
+    if (H5Dclose(did2) < 0) TEST_ERROR;
+    if (H5Gclose(rid) < 0) TEST_ERROR;
+    if (H5Fclose(fid) < 0) TEST_ERROR;
+
+    /* Delete test file */
+    HDremove(FILENAME);
+
+    if (end_verification() < 0) TEST_ERROR;
+
+    return SUCCEED;
+
+error:
+    return FAIL;
+
+} /* end test_flush */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    test_refresh
+ *
+ * Purpose:     This function tests refresh (evict/reload) of individual 
+ *              objects' metadata from the metadata cache.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              August 17, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t test_refresh(void) 
+{
+    /**************************************************************************
+     *
+     * Test Description:
+     *
+     * This test will build an HDF5 file with several objects in a varying 
+     * hierarchical layout. It will then flush the entire file to disk. Then,
+     * an attribute will be added to each object in the file.
+     * 
+     * One by one, this process will flush each object to disk, individually.
+     * It will also be coordinating with another process, which will open
+     * the object before it is flushed by this process, and then refresh the
+     * object after it's been flushed, comparing the before and after object
+     * information to ensure that they are as expected. (i.e., most notably,
+     * that an attribute has been added, and is only visible after a 
+     * successful call to a H5*refresh function).
+     * 
+     * As with the flush case, the implemention is a bit tricky as it's 
+     * dealing with signals going back and forth between the two processes
+     * to ensure the timing is correct, but basically, an example: 
+     *
+     * Step 1. Dataset is created.
+     * Step 2. Dataset is flushed.
+     * Step 3. Attribute on Dataset is created.
+     * Step 4. Another process opens the dataset and verifies that it does
+     *         not see an attribute (as the attribute hasn't been flushed yet).
+     * Step 5. This process flushes the dataset again (with Attribute attached).
+     * Step 6. The other process calls H5Drefresh, which should evict/reload
+     *         the object's metadata, and thus pick up the attribute that's
+     *         attached to it. Most other before/after object information is 
+     *         compared for sanity as well.
+     * Step 7. Rinse and Repeat for each object in the file.
+     *
+     **************************************************************************/
+
+    /**************************************************************************
+      * Generated Test File will look like this:
+      * 
+      * GROUP "/"
+      *   DATASET "Dataset1"
+      *   GROUP "Group1" {
+      *     DATASET "Dataset2"
+      *     GROUP "Group2" {
+      *       DATATYPE "CommittedDatatype3"
+      *     }
+      *   }
+      *   GROUP "Group3" {
+      *     DATASET "Dataset3"
+      *     DATATYPE "CommittedDatatype2"
+      *   }
+      *   DATATYPE "CommittedDatatype1"
+     **************************************************************************/
+
+    /* Variables */
+    hid_t aid,fid,sid,tid1,did,dcpl,fapl = 0;
+    hid_t gid,gid2,gid3,tid2,tid3,did2,did3;
+    herr_t status = 0;
+    hsize_t dims[2] = {50,50};
+    hsize_t cdims[2] = {1,1};
+    int fillval = 2;
+
+    /* Testing Message */
+    HDfprintf(stdout, "Testing individual object refresh behavior:\n");
+
+    /* Cleanup any old error or signal files */
+    CLEANUP_FILES;
+
+    /* ================ */
+    /* CREATE TEST FILE */
+    /* ================ */
+
+    /* Create File */
+    if ((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) TEST_ERROR;
+    if (H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0) TEST_ERROR;
+    if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC|H5F_ACC_SWMR_WRITE, H5P_DEFAULT, fapl)) < 0) TEST_ERROR;
+
+    /* Create data space and types */
+    if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR;
+    if ( H5Pset_chunk(dcpl, 2, cdims) < 0 ) TEST_ERROR;
+    if ( H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fillval) < 0 ) TEST_ERROR;
+    if ((sid = H5Screate_simple(2, dims, dims)) < 0) TEST_ERROR;
+    if ((tid1 = H5Tcopy(H5T_NATIVE_INT)) < 0) TEST_ERROR;
+    if ((tid2 = H5Tcopy(H5T_NATIVE_CHAR)) < 0) TEST_ERROR;
+    if ((tid3 = H5Tcopy(H5T_NATIVE_LONG)) < 0) TEST_ERROR;
+
+    /* Create Group1 */
+    if ((gid = H5Gcreate2(fid, "Group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Create Group2 */
+    if ((gid2 = H5Gcreate2(gid, "Group2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Create Group3 */
+    if ((gid3 = H5Gcreate2(fid, "Group3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Create Dataset1 */
+    if ((did = H5Dcreate2(fid, "Dataset1", tid1, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Create Dataset2 */
+    if ((did2 = H5Dcreate2(gid, "Dataset2", tid3, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Create Dataset3 */
+    if ((did3 = H5Dcreate2(gid3, "Dataset3", tid2, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Create CommittedDatatype1 */
+    if ((status = H5Tcommit2(fid, "CommittedDatatype1", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Create CommittedDatatype2 */
+    if ((status = H5Tcommit2(gid2, "CommittedDatatype2", tid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Create CommittedDatatype3 */
+    if ((status = H5Tcommit2(gid3, "CommittedDatatype3", tid3, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+
+    /* Flush File to Disk */
+    if (H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0) TEST_ERROR;
+
+    /* Create an attribute on each object. These will not immediately hit disk, 
+        and thus be unavailable to another process until this process flushes
+        the object and the other process refreshes from disk. */
+    if ((aid = H5Acreate2(did, "Attribute", tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+    if (H5Aclose(aid) < 0) TEST_ERROR;
+    if ((aid = H5Acreate2(did2, "Attribute", tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+    if (H5Aclose(aid) < 0) TEST_ERROR;
+    if ((aid = H5Acreate2(did3, "Attribute", tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+    if (H5Aclose(aid) < 0) TEST_ERROR;
+    if ((aid = H5Acreate2(gid, "Attribute", tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+    if (H5Aclose(aid) < 0) TEST_ERROR;
+    if ((aid = H5Acreate2(gid2, "Attribute", tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+    if (H5Aclose(aid) < 0) TEST_ERROR;
+    if ((aid = H5Acreate2(gid3, "Attribute", tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+    if (H5Aclose(aid) < 0) TEST_ERROR;
+    if ((aid = H5Acreate2(tid1, "Attribute", tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+    if (H5Aclose(aid) < 0) TEST_ERROR;
+    if ((aid = H5Acreate2(tid2, "Attribute", tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+    if (H5Aclose(aid) < 0) TEST_ERROR;
+    if ((aid = H5Acreate2(tid3, "Attribute", tid1, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR;
+    if (H5Aclose(aid) < 0) TEST_ERROR;
+
+    /* ================ */
+    /* Refresh Datasets */
+    /* ================ */
+
+    TESTING("to ensure that H5Drefresh correctly refreshes single datasets");
+
+    /* Verify First Dataset can be refreshed with H5Drefresh */
+    if (start_refresh_verification_process(D1) != 0) TEST_ERROR;
+    if (H5Oflush(did) < 0) TEST_ERROR;
+    if (end_refresh_verification_process() != 0) TEST_ERROR;
+
+    /* Verify Second Dataset can be refreshed with H5Drefresh */
+    if (start_refresh_verification_process(D2) != 0) TEST_ERROR;
+    if (H5Oflush(did2) < 0) TEST_ERROR;
+    if (end_refresh_verification_process() != 0) TEST_ERROR;
+
+    PASSED();
+
+    /* ============== */
+    /* Refresh Groups */
+    /* ============== */
+
+    TESTING("to ensure that H5Grefresh correctly refreshes single groups");
+
+    /* Verify First Group can be refreshed with H5Grefresh */
+    if (start_refresh_verification_process(G1) != 0) TEST_ERROR;
+    if (H5Oflush(gid) < 0) TEST_ERROR;
+    if (end_refresh_verification_process() != 0) TEST_ERROR;
+
+    /* Verify Second Group can be refreshed with H5Grefresh */
+    if (start_refresh_verification_process(G2) != 0) TEST_ERROR;
+    if (H5Oflush(gid2) < 0) TEST_ERROR;
+    if (end_refresh_verification_process() != 0) TEST_ERROR;
+
+    PASSED();
+
+    /* ================= */
+    /* Refresh Datatypes */
+    /* ================= */
+
+    TESTING("to ensure that H5Trefresh correctly refreshes single datatypes");
+
+    /* Verify First Committed Datatype can be refreshed with H5Trefresh */
+    if (start_refresh_verification_process(T1) != 0) TEST_ERROR;
+    if (H5Oflush(tid1) < 0) TEST_ERROR;
+    if (end_refresh_verification_process() != 0) TEST_ERROR;
+
+    /* Verify Second Committed Datatype can be refreshed with H5Trefresh */
+    if (start_refresh_verification_process(T2) != 0) TEST_ERROR;
+    if (H5Oflush(tid2) < 0) TEST_ERROR;
+    if (end_refresh_verification_process() != 0) TEST_ERROR;
+
+    PASSED();
+
+    /* =============== */
+    /* Refresh Objects */
+    /* =============== */
+
+    TESTING("to ensure that H5Orefresh correctly refreshes single objects");
+
+    /* Verify Third Dataset can be refreshed with H5Orefresh */
+    if (start_refresh_verification_process(D3) != 0) TEST_ERROR;
+    if (H5Oflush(did3) < 0) TEST_ERROR;
+    if (end_refresh_verification_process() != 0) TEST_ERROR;
+
+    /* Verify Third Group can be refreshed with H5Orefresh */
+    if (start_refresh_verification_process(G3) != 0) TEST_ERROR;
+    if (H5Oflush(gid3) < 0) TEST_ERROR;
+    if (end_refresh_verification_process() != 0) TEST_ERROR;
+
+    /* Verify Third Committed Datatype can be refreshed with H5Orefresh */
+    if (start_refresh_verification_process(T3) != 0) TEST_ERROR;
+    if (H5Oflush(tid3) < 0) TEST_ERROR;
+    if (end_refresh_verification_process() != 0) TEST_ERROR;
+
+    PASSED();
+
+    /* ================== */
+    /* Cleanup and Return */  
+    /* ================== */
+
+    /* Close Stuff */
+    if (H5Pclose(fapl) < 0) TEST_ERROR;
+    if (H5Pclose(dcpl) < 0) TEST_ERROR;
+    if (H5Tclose(tid1) < 0) TEST_ERROR;
+    if (H5Tclose(tid2) < 0) TEST_ERROR;
+    if (H5Tclose(tid3) < 0) TEST_ERROR;
+    if (H5Dclose(did) < 0) TEST_ERROR;
+    if (H5Dclose(did2) < 0) TEST_ERROR;
+    if (H5Dclose(did3) < 0) TEST_ERROR;
+    if (H5Gclose(gid) < 0) TEST_ERROR;
+    if (H5Gclose(gid2) < 0) TEST_ERROR;
+    if (H5Gclose(gid3) < 0) TEST_ERROR;
+    if (H5Sclose(sid) < 0) TEST_ERROR;
+    if (H5Fclose(fid) < 0) TEST_ERROR;
+
+    /* Delete Test File */
+    HDremove(FILENAME);
+
+    if (end_verification() < 0) TEST_ERROR;
+
+    return SUCCEED;
+
+error:
+    /* Return */
+    return FAIL;
+
+} /* test_refresh() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    run_flush_verification_process
+ *
+ * Purpose:     This function is used to communicate with the test script
+ *              in order to spawn off a process to verify that a flush
+ *              of an individual object was successful. 
+ * 
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              July 16, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t run_flush_verification_process(const char * obj_pathname, const char * expected) 
+{
+    /* Send Signal to SCRIPT indicating that it should kick off a verification process. */
+    send_signal(SIGNAL_TO_SCRIPT, obj_pathname, expected);
+
+    /* Wait for Signal from SCRIPT indicating that verification process has completed. */
+    if (wait_for_signal(SIGNAL_FROM_SCRIPT) < 0) TEST_ERROR;
+
+    /* Check to see if any errors occurred */
+    if (check_for_errors() < 0) TEST_ERROR;
+
+    /* Return */
+    return SUCCEED;
+
+error:
+    return FAIL;
+
+} /* run_flush_verification_process */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    flush_verification
+ *
+ * Purpose:     This function tries to open target object in the test file.
+ *              It compares the success of the open function to the expected 
+ *              value, and succeeds if they are equal and fails if they differ.
+ *
+ *              Note that full path to the object must be provided as the 
+ *              obj_pathname argument.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              July 16, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t flush_verification(const char * obj_pathname, const char * expected) 
+{
+    /* Variables */
+    hid_t oid = -1, fid = -1;
+    herr_t status = 0;
+    H5O_info_t oinfo;
+
+    /* Try to open the testfile and then obj_pathname within the file */
+    H5E_BEGIN_TRY {
+        fid = H5Fopen(FILENAME, H5F_ACC_SWMR_READ, H5P_DEFAULT);
+        oid = H5Oopen(fid, obj_pathname, H5P_DEFAULT);
+        status = H5Oget_info(oid, &oinfo);
+    } H5E_END_TRY;
+
+    /* Compare to expected result */
+    if (strcmp(expected, FLUSHED) == 0) {
+        if ((oid < 0) || (status < 0)) {
+            HDfprintf(stderr, "Error! %s should be on disk, but was NOT!\n", obj_pathname);
+            PROCESS_ERROR;
+        } /* end if */
+    } else if (strcmp(expected, NOT_FLUSHED) == 0) {
+        if ((oid > 0) || (status > 0)) {
+            HDfprintf(stderr, "Error! %s not expected to be flushed, but it was found on disk!\n", obj_pathname);
+            PROCESS_ERROR;
+        } /* end if */
+    } else {
+        HDfprintf(stderr, "Error! Bad verification parameters. %s is an invalid expected outcome.\n", expected);
+        PROCESS_ERROR;
+    } /* end if */
+
+    /* Cleanup */
+    H5E_BEGIN_TRY {
+        H5Oclose(oid);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+
+    return SUCCEED;
+
+error:
+    return FAIL;
+
+} /* flush_verification */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    start_refresh_verification_process
+ *
+ * Purpose:     This function is used to communicate with the test script
+ *              in order to spawn off a process which will test the
+ *              H5*refresh routine.
+ * 
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              July 16, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t start_refresh_verification_process(const char * obj_pathname) 
+{
+    /* Send Signal to SCRIPT indicating that it should kick off a refresh 
+       verification process */
+    send_signal(SIGNAL_TO_SCRIPT, obj_pathname, NULL);
+    
+    /* Wait for Signal from VERIFICATION PROCESS indicating that it's opened the
+       target object and ready for MAIN PROCESS to modify it */
+    if (wait_for_signal(SIGNAL_BETWEEN_PROCESSES_1) < 0) TEST_ERROR;
+
+    /* Check to see if any errors occurred */
+    if (check_for_errors() < 0) TEST_ERROR;
+
+    /* Return */
+    return SUCCEED;
+
+error:
+    return FAIL;
+
+} /* start_refresh_verification_process */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    end_refresh_verification_process
+ *
+ * Purpose:     This function is used to communicate with the verification
+ *              process spawned by the start_refresh_verification_process 
+ *              function. It gives it the go-ahead to call H5*refresh
+ *              on an object and conlcude the refresh verification.
+ * 
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              July 16, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t end_refresh_verification_process(void) 
+{
+    /* Send Signal to REFRESH VERIFICATION PROCESS indicating that the object
+        has been modified and it should now attempt to refresh its metadata,
+        and verify the results. */
+    send_signal(SIGNAL_BETWEEN_PROCESSES_2, NULL, NULL);
+
+    /* Wait for Signal from SCRIPT indicating that the refresh verification
+        process has completed. */
+    if (wait_for_signal(SIGNAL_FROM_SCRIPT) < 0) TEST_ERROR;
+
+    /* Check to see if any errors occurred */
+    if (check_for_errors() < 0) TEST_ERROR;
+
+    /* Return */
+
+    return SUCCEED;
+
+error:
+    return FAIL;
+
+} /* end_refresh_verification_process */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    refresh_verification
+ *
+ * Purpose:     This function opens the specified object, and checks to see
+ *              that is does not have any attributes on it. It then sends
+ *              a signal to the main process, which will flush the object
+ *              (putting an attribute on the object on disk). This function
+ *              will then refresh the object, and verify that it has picked
+ *              up the new metadata reflective of the added attribute.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              July 16, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t refresh_verification(const char * obj_pathname) 
+{
+    /* Variables */
+    hid_t oid,fid,status = 0;
+    H5O_info_t flushed_oinfo;
+    H5O_info_t refreshed_oinfo;
+    
+    /* Open Object */
+    if ((fid = H5Fopen(FILENAME, H5F_ACC_SWMR_READ, H5P_DEFAULT)) < 0) PROCESS_ERROR;
+    if ((oid = H5Oopen(fid, obj_pathname, H5P_DEFAULT)) < 0) PROCESS_ERROR;
+
+    /* Get Object info */
+    if ((status = H5Oget_info(oid, &flushed_oinfo)) < 0) PROCESS_ERROR;
+    
+    /* Make sure there are no attributes on the object. This is just a sanity
+        check to ensure we didn't erroneously flush the attribute before
+        starting the verification. */
+    if (flushed_oinfo.num_attrs != 0) PROCESS_ERROR;
+
+    /* Send Signal to MAIN PROCESS indicating that it can go ahead and modify the 
+        object. */
+    send_signal(SIGNAL_BETWEEN_PROCESSES_1, NULL, NULL);
+
+    /* Wait for Signal from MAIN PROCESS indicating that it's modified the 
+        object and we can run verification now. */
+    if (wait_for_signal(SIGNAL_BETWEEN_PROCESSES_2) < 0) PROCESS_ERROR;
+
+    /* Get object info again. This will NOT reflect what's on disk, only what's 
+       in the cache. Thus, all values will be unchanged from above, despite 
+       newer information being on disk. */
+    if ((status = H5Oget_info(oid, &refreshed_oinfo)) < 0) PROCESS_ERROR;
+
+    /* Verify that before doing a refresh, getting the object info returns stale
+       information. (i.e., unchanged from above, despite new info on disk). */
+    if (flushed_oinfo.addr != refreshed_oinfo.addr) PROCESS_ERROR;
+    if (flushed_oinfo.type != refreshed_oinfo.type) PROCESS_ERROR;
+    if (flushed_oinfo.hdr.version != refreshed_oinfo.hdr.version) PROCESS_ERROR;
+    if (flushed_oinfo.hdr.flags != refreshed_oinfo.hdr.flags) PROCESS_ERROR;
+    if (flushed_oinfo.num_attrs != refreshed_oinfo.num_attrs) PROCESS_ERROR;
+    if (flushed_oinfo.hdr.nmesgs != refreshed_oinfo.hdr.nmesgs) PROCESS_ERROR;
+    if (flushed_oinfo.hdr.nchunks != refreshed_oinfo.hdr.nchunks) PROCESS_ERROR;
+    if (flushed_oinfo.hdr.space.total != refreshed_oinfo.hdr.space.total) PROCESS_ERROR;
+
+    /* Refresh object */
+    /* The H5*refresh function called depends on which object we are trying
+     * to refresh. (MIKE: add desired refresh call as parameter so adding new
+     * test cases is easy). */
+    if ((strcmp(obj_pathname, D1) == 0) || 
+        (strcmp(obj_pathname, D2) == 0)) {
+        if (H5Drefresh(oid) < 0) PROCESS_ERROR;
+    } /* end if */
+    else if ((strcmp(obj_pathname, G1) == 0) || 
+        (strcmp(obj_pathname, G2) == 0)) {
+        if (H5Grefresh(oid) < 0) PROCESS_ERROR;
+    } /* end if */
+    else if ((strcmp(obj_pathname, T1) == 0) || 
+        (strcmp(obj_pathname, T2) == 0)) {
+        if (H5Trefresh(oid) < 0) PROCESS_ERROR;
+    } /* end if */
+    else if ((strcmp(obj_pathname, D3) == 0) || 
+        (strcmp(obj_pathname, G3) == 0) ||
+        (strcmp(obj_pathname, T3) == 0)) {
+        if (H5Orefresh(oid) < 0) PROCESS_ERROR;
+    } /* end if */
+    else {
+        HDfprintf(stdout, "Error. %s is an unrecognized object.\n", obj_pathname);
+        PROCESS_ERROR;
+    } /* end else */
+
+    /* Get object info. This should now accurately reflect the refreshed object on disk. */
+    if ((status = H5Oget_info(oid, &refreshed_oinfo)) < 0) PROCESS_ERROR;
+    
+    /* Confirm following attributes are the same: */
+    if (flushed_oinfo.addr != refreshed_oinfo.addr) PROCESS_ERROR;
+    if (flushed_oinfo.type != refreshed_oinfo.type) PROCESS_ERROR;
+    if (flushed_oinfo.hdr.version != refreshed_oinfo.hdr.version) PROCESS_ERROR;
+    if (flushed_oinfo.hdr.flags != refreshed_oinfo.hdr.flags) PROCESS_ERROR;
+
+    /* Confirm following attributes are different */
+    if (flushed_oinfo.num_attrs == refreshed_oinfo.num_attrs) PROCESS_ERROR;
+    if (flushed_oinfo.hdr.nmesgs == refreshed_oinfo.hdr.nmesgs) PROCESS_ERROR;
+    if (flushed_oinfo.hdr.nchunks == refreshed_oinfo.hdr.nchunks) PROCESS_ERROR;
+    if (flushed_oinfo.hdr.space.total == refreshed_oinfo.hdr.space.total) PROCESS_ERROR;
+
+    /* Close objects */
+    if (H5Oclose(oid) < 0) PROCESS_ERROR;
+    if (H5Fclose(fid) < 0) PROCESS_ERROR;
+
+    /* Return */
+    return SUCCEED;
+
+error:
+
+    return FAIL;
+
+} /* refresh_verification */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_for_errors()
+ *
+ * Purpose:     This function checks the status of external verification
+ *              processes to see if they've succeeded. It checks for the
+ *              existance of flushrefresh_ERROR file. If present, that indicates
+ *              an external verification process has failed, and this function
+ *              thus fails as well. If not present, then nothing else has 
+ *              failed, and this function succeeds.
+ *
+ * Return:      0 on Success, 1 on Failure
+ *
+ * Programmer:  Mike McGreevy
+ *              July 1, 2010
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t check_for_errors(void) 
+{
+    FILE * file;
+
+    if ((file = fopen(ERRFILE, "r")))
+    {
+        HDfclose(file);
+        HDremove(ERRFILE);
+        return FAIL;
+    }
+
+    return SUCCEED;
+
+} /* check_for_errors */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    end_verification
+ * 
+ * Purpose:     Tells test script that verification routines are completed and 
+ *              that the test can wrap up. 
+ *
+ * Return:      void
+ *
+ * Programmer:  Mike McGreevy
+ *              July 16, 2010
+ * 
+ * Modifications:
+ * 
+ *-------------------------------------------------------------------------
+ */
+herr_t end_verification(void) 
+{
+    /* Send Signal to SCRIPT to indicate that we're done with verification. */
+    send_signal(SIGNAL_TO_SCRIPT, "VERIFICATION_DONE", "VERIFICATION_DONE");
+    
+    /* Wait for Signal from SCRIPT indicating that we can continue. */
+    if (wait_for_signal(SIGNAL_FROM_SCRIPT) < 0) TEST_ERROR;
+
+    return SUCCEED;
+
+error:
+    return FAIL;
+
+} /* end_verification */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    send_signal
+ * 
+ * Purpose:     Sends the specified signal.
+ * 
+ *              In terms of this test framework, a signal consists of a file
+ *              on disk. Since there are multiple processes that need to 
+ *              communicate with each other, they do so by writing and
+ *              reading signal files on disk, the names and contents of 
+ *              which are used to inform a process about when it can
+ *              proceed and what it should do next.
+ * 
+ *              This function writes a signal file. The first argument is
+ *              the name of the signal file, and the second and third
+ *              arguments are the contents of the first two lines of the
+ *              signal file. The last two arguments may be NULL.
+ *
+ * Return:      void
+ *
+ * Programmer:  Mike McGreevy
+ *              August 18, 2010
+ * 
+ * Modifications:
+ * 
+ *-------------------------------------------------------------------------
+ */
+void send_signal(const char * send, const char * arg1, const char * arg2)
+{
+
+    FILE *signalfile = NULL;
+
+    /* Create signal file (which will send signal to some other process) */
+    signalfile = fopen(send, "w+");
+
+    /* Write messages to signal file, if provided */
+    if (arg2 != NULL) {
+        HDassert(arg1);
+        HDfprintf(signalfile, "%s\n%s\n", arg1, arg2);
+    } /* end if */
+    else if (arg1 != NULL) {
+        HDassert(arg2 == NULL);
+        HDfprintf(signalfile, "%s\n", arg1);
+    } /* end if */ 
+    else {
+        HDassert(arg1 == NULL);
+        HDassert(arg2 == NULL);
+    }/* end else */
+
+    HDfflush(signalfile);
+    HDfclose(signalfile);
+
+} /* send_signal */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    wait_for_signal
+ * 
+ * Purpose:     Waits for the specified signal.
+ * 
+ *              In terms of this test framework, a signal consists of a file
+ *              on disk. Since there are multiple processes that need to 
+ *              communicate with each other, they do so by writing and
+ *              reading signal files on disk, the names and contents of 
+ *              which are used to inform a process about when it can
+ *              proceed and what it should do next.
+ * 
+ *              This function continuously attempts to read the specified
+ *              signal file from disk, and only continues once it has
+ *              successfully done so (i.e., only after another process has
+ *              called the "send_signal" function to write the signal file).
+ *              This functon will then immediately remove the file (i.e., 
+ *              to indicate that it has been received and can be reused), 
+ *              and then exits, allowing the calling function to continue.
+ *
+ * Return:      void
+ *
+ * Programmer:  Mike McGreevy
+ *              August 18, 2010
+ * 
+ * Modifications:
+ * 
+ *-------------------------------------------------------------------------
+ */
+herr_t wait_for_signal(const char * waitfor) 
+{
+    FILE *returnfile;
+    time_t t0,t1;
+
+    /* Start timer. If this function runs for too long (i.e., 
+        expected signal is never received), it will
+        return failure */
+    time(&t0);
+
+    /* Wait for return signal from some other process */
+    while ((returnfile = fopen(waitfor, "r")) == NULL) {
+
+        /* make note of current time. */
+        time(&t1);
+
+        /* If we've been waiting for a signal for too long, then
+            it was likely never sent and we should fail rather
+            than loop infinitely */
+        if (difftime(t1,t0) > SIGNAL_TIMEOUT) {
+            HDfprintf(stdout, "Error communicating between processes. Make sure test script is running.\n");
+            TEST_ERROR;
+        } /* end if */
+
+    } /* end while */
+
+    HDfclose(returnfile);
+    HDunlink(waitfor);
+
+    return SUCCEED;
+
+error:
+    return FAIL;
+
+} /* wait_for_signal */
diff --git a/test/freespace.c b/test/freespace.c
index 1338ae7..1b87974 100644
--- a/test/freespace.c
+++ b/test/freespace.c
@@ -17,13 +17,13 @@
  */
 #include "h5test.h"
 
-#define H5FS_PACKAGE
+#define H5FS_FRIEND		/*suppress error about including H5FSpkg	  */
 #define H5FS_TESTING
 #include "H5FSpkg.h"		/* Free space manager */
 
 
 /* Other private headers that this test requires */
-#define H5F_PACKAGE
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
 #include "H5Fpkg.h"
 #include "H5Iprivate.h"
 #include "H5VMprivate.h"
@@ -2841,6 +2841,8 @@ main(void)
     if(env_h5_drvr == NULL)
         env_h5_drvr = "nomatch";
 
+    h5_reset();
+
     fapl = h5_fileaccess();
 
     /* make sure alignment is not set for tests to succeed */
diff --git a/test/gen_bogus.c b/test/gen_bogus.c
index df1e81f..e9ce686 100644
--- a/test/gen_bogus.c
+++ b/test/gen_bogus.c
@@ -61,7 +61,7 @@ int main(void)
     if((did = H5Dcreate2(fid, "/Dataset1", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) goto error;
     if(H5Dclose(did) < 0) goto error;
 
-    /* Set "fail if unknown" message flag for bogus message */
+    /* Set "fail if unknown and open for write" message flag for bogus message */
     bogus_flags = H5O_MSG_FLAG_FAIL_IF_UNKNOWN_AND_OPEN_FOR_WRITE;
     if(H5Pset(dcpl, H5O_BOGUS_MSG_FLAGS_NAME, &bogus_flags) < 0) goto error;
 
@@ -69,12 +69,20 @@ int main(void)
     if((did = H5Dcreate2(fid, "/Dataset2", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) goto error;
     if(H5Dclose(did) < 0) goto error;
 
+    /* Set "fail if unknown always" message flag for bogus message */
+    bogus_flags = H5O_MSG_FLAG_FAIL_IF_UNKNOWN_ALWAYS;
+    if(H5Pset(dcpl, H5O_BOGUS_MSG_FLAGS_NAME, &bogus_flags) < 0) goto error;
+
+    /* Create third dataset, with "fail if unknown always" message flag */
+    if((did = H5Dcreate2(fid, "/Dataset3", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) goto error;
+    if(H5Dclose(did) < 0) goto error;
+
     /* Set "mark if unknown" message flag for bogus message */
     bogus_flags = H5O_MSG_FLAG_MARK_IF_UNKNOWN;
     if(H5Pset(dcpl, H5O_BOGUS_MSG_FLAGS_NAME, &bogus_flags) < 0) goto error;
 
-    /* Create second dataset, with "mark if unknown" message flag */
-    if((did = H5Dcreate2(fid, "/Dataset3", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) goto error;
+    /* Create fourth dataset, with "mark if unknown" message flag */
+    if((did = H5Dcreate2(fid, "/Dataset4", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) goto error;
     if(H5Dclose(did) < 0) goto error;
 
     /* Close dataset creation property list */
diff --git a/test/gen_cross.c b/test/gen_cross.c
index 2d4b788..816064d 100644
--- a/test/gen_cross.c
+++ b/test/gen_cross.c
@@ -100,9 +100,9 @@ int create_nbit_dsets_float(hid_t fid, hid_t fsid, hid_t msid);
 int
 create_normal_dset(hid_t fid, hid_t fsid, hid_t msid)
 {
-    hid_t       dataset;         /* file and dataset handles */
-    hid_t       dcpl;
-    float       data[NX][NY];          /* data to write */
+    hid_t       dataset         = -1;   /* file and dataset handles */
+    hid_t       dcpl            = -1;
+    float       data[NX][NY];           /* data to write */
     float       fillvalue = -2.2f;
     int         i, j;
 
@@ -207,9 +207,9 @@ error:
 int
 create_scale_offset_dsets_float(hid_t fid, hid_t fsid, hid_t msid)
 {
-    hid_t       dataset;         /* dataset handles */
-    hid_t       dcpl;
-    float       data[NX][NY];          /* data to write */
+    hid_t       dataset             = -1;   /* dataset handles */
+    hid_t       dcpl                = -1;
+    float       data[NX][NY];               /* data to write */
     float       fillvalue = -2.2f;
     hsize_t     chunk[RANK] = {CHUNK0, CHUNK1};
     int         i, j;
@@ -298,9 +298,9 @@ error:
 int
 create_scale_offset_dsets_double(hid_t fid, hid_t fsid, hid_t msid)
 {
-    hid_t       dataset;         /* dataset handles */
-    hid_t       dcpl;
-    double      data[NX][NY];          /* data to write */
+    hid_t       dataset         = -1;   /* dataset handles */
+    hid_t       dcpl            = -1;
+    double      data[NX][NY];           /* data to write */
     double      fillvalue = -2.2f;
     hsize_t     chunk[RANK] = {CHUNK0, CHUNK1};
     int         i, j;
@@ -389,9 +389,9 @@ error:
 int
 create_scale_offset_dsets_char(hid_t fid, hid_t fsid, hid_t msid)
 {
-    hid_t       dataset;         /* dataset handles */
-    hid_t       dcpl;
-    char        data[NX][NY];          /* data to write */
+    hid_t       dataset         = -1;   /* dataset handles */
+    hid_t       dcpl            = -1;
+    char        data[NX][NY];           /* data to write */
     char        fillvalue = -2;
     hsize_t     chunk[RANK] = {CHUNK0, CHUNK1};
     int         i, j;
@@ -488,9 +488,9 @@ error:
 int
 create_scale_offset_dsets_short(hid_t fid, hid_t fsid, hid_t msid)
 {
-    hid_t       dataset;         /* dataset handles */
-    hid_t       dcpl;
-    short       data[NX][NY];          /* data to write */
+    hid_t       dataset         = -1;   /* dataset handles */
+    hid_t       dcpl            = -1;
+    short       data[NX][NY];           /* data to write */
     short       fillvalue = -2;
     hsize_t     chunk[RANK] = {CHUNK0, CHUNK1};
     int         i, j;
@@ -587,9 +587,9 @@ error:
 int
 create_scale_offset_dsets_int(hid_t fid, hid_t fsid, hid_t msid)
 {
-    hid_t       dataset;         /* dataset handles */
-    hid_t       dcpl;
-    int         data[NX][NY];          /* data to write */
+    hid_t       dataset         = -1;   /* dataset handles */
+    hid_t       dcpl            = -1;
+    int         data[NX][NY];           /* data to write */
     int         fillvalue = -2;
     hsize_t     chunk[RANK] = {CHUNK0, CHUNK1};
     int         i, j;
@@ -687,9 +687,9 @@ error:
 int
 create_scale_offset_dsets_long_long(hid_t fid, hid_t fsid, hid_t msid)
 {
-    hid_t       dataset;         /* dataset handles */
-    hid_t       dcpl;
-    long long   data[NX][NY];          /* data to write */
+    hid_t       dataset         = -1;   /* dataset handles */
+    hid_t       dcpl            = -1;
+    long long   data[NX][NY];           /* data to write */
     long long   fillvalue = -2;
     hsize_t     chunk[RANK] = {CHUNK0, CHUNK1};
     int         i, j;
@@ -786,9 +786,9 @@ error:
 int
 create_fletcher_dsets_float(hid_t fid, hid_t fsid, hid_t msid)
 {
-    hid_t       dataset;         /* dataset handles */
-    hid_t       dcpl;
-    float       data[NX][NY];          /* data to write */
+    hid_t       dataset         = -1;   /* dataset handles */
+    hid_t       dcpl            = -1;
+    float       data[NX][NY];           /* data to write */
     float       fillvalue = -2.2f;
     hsize_t     chunk[RANK] = {CHUNK0, CHUNK1};
     int         i, j;
@@ -878,9 +878,9 @@ int
 create_deflate_dsets_float(hid_t fid, hid_t fsid, hid_t msid)
 {
 #ifdef H5_HAVE_FILTER_DEFLATE
-    hid_t       dataset;         /* dataset handles */
-    hid_t       dcpl;
-    float       data[NX][NY];          /* data to write */
+    hid_t       dataset         = -1;   /* dataset handles */
+    hid_t       dcpl            = -1;
+    float       data[NX][NY];           /* data to write */
     float       fillvalue = -2.2f;
     hsize_t     chunk[RANK] = {CHUNK0, CHUNK1};
     int         i, j;
@@ -1070,9 +1070,9 @@ error:
 int
 create_shuffle_dsets_float(hid_t fid, hid_t fsid, hid_t msid)
 {
-    hid_t       dataset;         /* dataset handles */
-    hid_t       dcpl;
-    float       data[NX][NY];          /* data to write */
+    hid_t       dataset         = -1;   /* dataset handles */
+    hid_t       dcpl            = -1;
+    float       data[NX][NY];           /* data to write */
     float       fillvalue = -2.2f;
     hsize_t     chunk[RANK] = {CHUNK0, CHUNK1};
     int         i, j;
@@ -1161,11 +1161,11 @@ error:
 int
 create_nbit_dsets_float(hid_t fid, hid_t fsid, hid_t msid)
 {
-    hid_t       dataset;         /* dataset handles */
-    hid_t       datatype;
-    hid_t       dcpl;
+    hid_t       dataset         = -1;   /* dataset handles */
+    hid_t       datatype        = -1;
+    hid_t       dcpl            = -1;
     size_t      precision, offset;
-    float       data[NX][NY];          /* data to write */
+    float       data[NX][NY];           /* data to write */
     float       fillvalue = -2.2f;
     hsize_t     chunk[RANK] = {CHUNK0, CHUNK1};
     int         i, j;
diff --git a/test/gen_filespace.c b/test/gen_filespace.c
new file mode 100644
index 0000000..e0c42e8
--- /dev/null
+++ b/test/gen_filespace.c
@@ -0,0 +1,82 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "hdf5.h"
+
+#define NELMTS(X)    	(sizeof(X)/sizeof(X[0]))	/* # of elements */
+#define TEST_THRESHOLD2	2             			/* Free space section threshold */
+
+const char *FILENAMES[] = {
+    "filespace_persist.h5",	/* H5F_FILE_SPACE_ALL_PERSIST */
+    "filespace_default.h5",	/* H5F_FILE_SPACE_ALL */
+    "filespace_aggr_vfd.h5",	/* H5F_FILE_SPACE_AGGR_VFD */
+    "filespace_vfd.h5",		/* H5F_FILE_SPACE_VFD */
+    "filespace_threshold.h5"	/* H5F_FILE_SPACE_ALL, non-default threshold */
+};
+
+#define DATASET		"dset"
+#define NUM_ELMTS	100
+
+/*
+ * Compile and run this program in file-space branch to generate
+ * HDF5 files with different kinds of file space strategies
+ * Move the HDF5 files to the 1.6 and 1.8 branch for compatibility
+ * testing:test_filespace_compatible() will use the files
+ */
+static void gen_file(void)
+{
+    hid_t   	fid;
+    hid_t   	fcpl;
+    hid_t       dataset, space;
+    hsize_t     dim[1];
+    int         data[NUM_ELMTS];
+    size_t      j;			/* Local index variable */
+    int         i;			/* Local index variable */
+    H5F_file_space_type_t fs_type;	/* File space handling strategy */
+
+    for(j = 0, fs_type = H5F_FILE_SPACE_ALL_PERSIST; j < NELMTS(FILENAMES); j++, fs_type = (H5F_file_space_type_t)(fs_type + 1)) {
+	/* Get a copy of the default file creation property */
+	fcpl = H5Pcreate(H5P_FILE_CREATE);
+
+	if(fs_type == H5F_FILE_SPACE_NTYPES) /* last file */
+	    /* Set default strategy but non-default threshold */
+	    H5Pset_file_space(fcpl, H5F_FILE_SPACE_ALL, (hsize_t)TEST_THRESHOLD2);
+	else
+	    /* Set specified file space strategy and free space section threshold */
+	    H5Pset_file_space(fcpl, fs_type, (hsize_t)0);
+
+	/* Create the file with the file space info */
+	fid = H5Fcreate(FILENAMES[j], H5F_ACC_TRUNC, fcpl, H5P_DEFAULT);
+
+	dim[0] = NUM_ELMTS;
+	space = H5Screate_simple(1, dim, NULL);
+	dataset = H5Dcreate2(fid, DATASET, H5T_NATIVE_INT, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+	for(i = 0; i < NUM_ELMTS; i++)
+	    data[i] = i;
+
+	H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
+	H5Dclose(dataset);
+	H5Sclose(space);
+	H5Fclose(fid);
+    }
+}
+
+int main(void)
+{
+    gen_file();
+
+    return 0;
+}
diff --git a/test/gen_idx.c b/test/gen_idx.c
index 0513e1b..8c24198 100644
--- a/test/gen_idx.c
+++ b/test/gen_idx.c
@@ -15,19 +15,19 @@
 
 /*
  * Purpose:     This program is run to generate an HDF5 data file with datasets
- *              that use the B-tree indexing method.
+ *              that use Fixed Array indexing method.
  *
  *              To test compatibility, compile and run this program
- *              which will generate a file called "btree_idx_1_8.h5".
- *              Move it to the test directory in the current branch.
+ *              which will generate a file called "fixed_idx.h5".
+ *              Move it to the test directory in the HDF5 v1.6/1.8 source tree.
  *              The test: test_idx_compatible() in dsets.c will read it.
  */
 #include <assert.h>
 #include "hdf5.h"
 
 const char *FILENAME[1] = {
-    "btree_idx_1_8.h5"	/* file with datasets that use B-tree indexing method */
-};
+    "fixed_idx.h5"	/* file with datasets that use Fixed Array indexing method */
+}; 
 
 #define DSET		"dset"
 #define DSET_FILTER	"dset_filter"
@@ -35,7 +35,7 @@ const char *FILENAME[1] = {
 /*
  * Function: gen_idx_file
  *
- * Purpose: Create a file with datasets that use B-tree indexing:
+ * Purpose: Create a file with datasets that use Fixed Array indexing:
  *   	one dataset: fixed dimension, chunked layout, w/o filters
  *     	one dataset: fixed dimension, chunked layout, w/ filters
  *
@@ -46,7 +46,7 @@ static void gen_idx_file(void)
     hid_t	fid;	            /* file id */
     hid_t   	sid;	            /* space id */
     hid_t	dcpl;	    	    /* dataset creation property id */
-    hid_t	did, did2; 	    	    /* dataset id */
+    hid_t	did, did2;    	    /* dataset id */
     hsize_t 	dims[1] = {10};     /* dataset dimension */
     hsize_t 	c_dims[1] = {2};    /* chunk dimension */
     herr_t  	status;             /* return status */
@@ -82,7 +82,7 @@ static void gen_idx_file(void)
     /* Create a 1D dataset */
     did  = H5Dcreate2(fid, DSET, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT);
     assert(did >= 0);
-
+    
     /* Write to the dataset */
     status = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
     assert(status >= 0);
@@ -95,16 +95,16 @@ static void gen_idx_file(void)
     /* Create and write the dataset */
     did2  = H5Dcreate2(fid, DSET_FILTER, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT);
     assert(did2 >= 0);
+
     status = H5Dwrite(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
     assert(status >= 0);
 
     /* Close the dataset */
     status = H5Dclose(did2);
     assert(status >= 0);
-
 #endif
 
-    /* Closing */
+    /* closing */
     status = H5Dclose(did);
     assert(status >= 0);
     status = H5Sclose(sid);
@@ -115,7 +115,6 @@ static void gen_idx_file(void)
     assert(status >= 0);
     status = H5Fclose(fid);
     assert(status >= 0);
-
 } /* gen_idx_file() */
 
 int main(void)
@@ -124,3 +123,4 @@ int main(void)
 
     return 0;
 }
+
diff --git a/test/gen_plist.c b/test/gen_plist.c
new file mode 100644
index 0000000..ae49d81
--- /dev/null
+++ b/test/gen_plist.c
@@ -0,0 +1,482 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * generate plist file
+ */
+
+#include <assert.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include "H5private.h"
+#include "hdf5.h"
+
+static int encode_plist(hid_t plist_id, int little_endian, int word_length, const char *filename_prefix);
+
+int
+main(void)
+{
+    hid_t dcpl1;	       	/* dataset create prop. list */
+    hid_t dapl1;	       	/* dataset access prop. list */
+    hid_t dxpl1;	       	/* dataset xfer prop. list */
+    hid_t gcpl1;	       	/* group create prop. list */
+    hid_t ocpypl1;		    /* object copy prop. list */
+    hid_t ocpl1;	        /* object create prop. list */
+    hid_t lcpl1;	       	/* link create prop. list */
+    hid_t lapl1;	       	/* link access prop. list */
+    hid_t fapl1;	       	/* file access prop. list */
+    hid_t fcpl1;	       	/* file create prop. list */
+    hid_t strcpl1;	       	/* string create prop. list */
+    hid_t acpl1;	       	/* attribute create prop. list */
+
+    herr_t ret = 0;
+    hsize_t chunk_size = 16384;	/* chunk size */ 
+    int fill = 2;            /* Fill value */
+    hsize_t max_size[1];        /* data space maximum size */
+    size_t nslots = 521 * 2;
+    size_t nbytes = 1048576 * 10;
+    double w0 = 0.5f;
+    unsigned max_compact;
+    unsigned min_dense;
+    const char* c_to_f = "x+32";
+    int little_endian;
+    int word_length;
+    H5AC_cache_config_t my_cache_config = {
+        H5AC__CURR_CACHE_CONFIG_VERSION,
+        1 /*TRUE*/,
+        0 /*FALSE*/,
+        0 /*FALSE*/,
+        "temp",
+        1 /*TRUE*/,
+        0 /*FALSE*/,
+        ( 2 * 2048 * 1024),
+        0.3f,
+        (64 * 1024 * 1024),
+        (4 * 1024 * 1024),
+        60000,
+        H5C_incr__threshold,
+        0.8f,
+        3.0f,
+        1 /*TRUE*/,
+        (8 * 1024 * 1024),
+        H5C_flash_incr__add_space,
+        2.0f,
+        0.25f,
+        H5C_decr__age_out_with_threshold,
+        0.997f,
+        0.8f,
+        1 /*TRUE*/,
+        (3 * 1024 * 1024),
+        3,
+        0 /*FALSE*/,
+        0.2f,
+        (256 * 2048),
+        H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY};
+
+    /* check endianess */
+    {
+        short int word = 0x0000;
+        char *byte = (char *) &word;
+
+        if(byte[0] == 1)
+            /* little endian */
+            little_endian = 1;
+        else
+            /* big endian */
+            little_endian = 0;
+    }
+
+    /* check word length */
+    {
+        word_length = 8 * sizeof(void *);
+    }
+
+    /* Explicitly initialize the library, since we are including the private header file */
+    H5open();
+
+    /******* ENCODE/DECODE DCPLS *****/
+    if((dcpl1 = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        assert(dcpl1 > 0);
+
+    if((ret = encode_plist(dcpl1, little_endian, word_length, "testfiles/plist_files/def_dcpl_")) < 0)
+        assert(ret > 0);
+
+    if((ret = H5Pset_chunk(dcpl1, 1, &chunk_size)) < 0)
+        assert(ret > 0);
+
+    if((ret = H5Pset_alloc_time(dcpl1, H5D_ALLOC_TIME_LATE)) < 0)
+        assert(ret > 0);
+
+    ret = H5Tconvert(H5T_NATIVE_INT, H5T_STD_I32BE, (size_t)1, &fill, NULL, H5P_DEFAULT);
+    assert(ret >= 0);
+    if((ret = H5Pset_fill_value(dcpl1, H5T_STD_I32BE, &fill)) < 0)
+        assert(ret > 0);
+
+    max_size[0] = 100;
+    if((ret = H5Pset_external(dcpl1, "ext1.data", (off_t)0, 
+                         (hsize_t)(max_size[0] * sizeof(int)/4))) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_external(dcpl1, "ext2.data", (off_t)0, 
+                         (hsize_t)(max_size[0] * sizeof(int)/4))) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_external(dcpl1, "ext3.data", (off_t)0, 
+                         (hsize_t)(max_size[0] * sizeof(int)/4))) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_external(dcpl1, "ext4.data", (off_t)0, 
+                         (hsize_t)(max_size[0] * sizeof(int)/4))) < 0)
+        assert(ret > 0);
+
+    if((ret = encode_plist(dcpl1, little_endian, word_length, "testfiles/plist_files/dcpl_")) < 0)
+        assert(ret > 0);
+        
+    /* release resource */
+    if((ret = H5Pclose(dcpl1)) < 0)
+         assert(ret > 0);
+
+
+    /******* ENCODE/DECODE DAPLS *****/
+    if((dapl1 = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
+        assert(dapl1 > 0);
+
+    if((ret = encode_plist(dapl1, little_endian, word_length, "testfiles/plist_files/def_dapl_")) < 0)
+        assert(ret > 0);
+        
+    if((ret = H5Pset_chunk_cache(dapl1, nslots, nbytes, w0)) < 0)
+        assert(ret > 0);
+
+    if((ret = encode_plist(dapl1, little_endian, word_length, "testfiles/plist_files/dapl_")) < 0)
+        assert(ret > 0);
+        
+    /* release resource */
+    if((ret = H5Pclose(dapl1)) < 0)
+         assert(ret > 0);
+
+    /******* ENCODE/DECODE DXPLS *****/
+    if((dxpl1 = H5Pcreate(H5P_DATASET_XFER)) < 0)
+        assert(dxpl1 > 0);
+
+    if((ret = encode_plist(dxpl1, little_endian, word_length, "testfiles/plist_files/def_dxpl_")) < 0)
+        assert(ret > 0);
+
+    if((ret = H5Pset_btree_ratios(dxpl1, 0.2f, 0.6f, 0.2f)) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_hyper_vector_size(dxpl1, 5)) < 0)
+        assert(ret > 0);
+#ifdef H5_HAVE_PARALLEL
+    if((ret = H5Pset_dxpl_mpio(dxpl1, H5FD_MPIO_COLLECTIVE)) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_dxpl_mpio_collective_opt(dxpl1, H5FD_MPIO_INDIVIDUAL_IO)) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_dxpl_mpio_chunk_opt(dxpl1, H5FD_MPIO_CHUNK_MULTI_IO)) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_dxpl_mpio_chunk_opt_ratio(dxpl1, 30)) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_dxpl_mpio_chunk_opt_num(dxpl1, 40)) < 0)
+        assert(ret > 0);
+#endif/* H5_HAVE_PARALLEL */
+    if((ret = H5Pset_edc_check(dxpl1, H5Z_DISABLE_EDC)) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_data_transform(dxpl1, c_to_f)) < 0)
+        assert(ret > 0);
+
+    if((ret = encode_plist(dxpl1, little_endian, word_length, "testfiles/plist_files/dxpl_")) < 0)
+        assert(ret > 0);
+        
+    /* release resource */
+    if((ret = H5Pclose(dxpl1)) < 0)
+         assert(ret > 0);
+
+
+    /******* ENCODE/DECODE GCPLS *****/
+    if((gcpl1 = H5Pcreate(H5P_GROUP_CREATE)) < 0)
+        assert(gcpl1 > 0);
+
+    if((ret = encode_plist(gcpl1, little_endian, word_length, "testfiles/plist_files/def_gcpl_")) < 0)
+        assert(ret > 0);
+
+    if((ret = H5Pset_local_heap_size_hint(gcpl1, 256)) < 0)
+         assert(ret > 0);
+
+    if((ret = H5Pset_link_phase_change(gcpl1, 2, 2)) < 0)
+         assert(ret > 0);
+
+    /* Query the group creation properties */
+    if((ret = H5Pget_link_phase_change(gcpl1, &max_compact, &min_dense)) < 0)
+         assert(ret > 0);
+
+    if((ret = H5Pset_est_link_info(gcpl1, 3, 9)) < 0)
+         assert(ret > 0);
+
+    if((ret = H5Pset_link_creation_order(gcpl1, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED))) < 0)
+         assert(ret > 0);
+
+    if((ret = encode_plist(gcpl1, little_endian, word_length, "testfiles/plist_files/gcpl_")) < 0)
+        assert(ret > 0);
+        
+    /* release resource */
+    if((ret = H5Pclose(gcpl1)) < 0)
+         assert(ret > 0);
+
+    /******* ENCODE/DECODE LCPLS *****/
+    if((lcpl1 = H5Pcreate(H5P_LINK_CREATE)) < 0)
+        assert(lcpl1 > 0);
+
+    if((ret = encode_plist(lcpl1, little_endian, word_length, "testfiles/plist_files/def_lcpl_")) < 0)
+        assert(ret > 0);
+
+    if((ret = H5Pset_create_intermediate_group(lcpl1, 1 /*TRUE*/)) < 0)
+        assert(ret > 0);
+
+    if((ret = encode_plist(lcpl1, little_endian, word_length, "testfiles/plist_files/lcpl_")) < 0)
+        assert(ret > 0);
+        
+    /* release resource */
+    if((ret = H5Pclose(lcpl1)) < 0)
+        assert(ret > 0);
+
+    /******* ENCODE/DECODE OCPYLS *****/
+    if((ocpypl1 = H5Pcreate(H5P_OBJECT_COPY)) < 0)
+        assert(ocpypl1 > 0);
+
+    if((ret = encode_plist(ocpypl1, little_endian, word_length, "testfiles/plist_files/def_ocpypl_")) < 0)
+        assert(ret > 0);
+
+    ret = H5Pset_copy_object(ocpypl1, H5O_COPY_EXPAND_EXT_LINK_FLAG);
+    assert(ret >= 0);
+
+    ret = H5Padd_merge_committed_dtype_path(ocpypl1, "foo");
+    assert(ret >= 0);
+
+    ret = H5Padd_merge_committed_dtype_path(ocpypl1, "bar");
+    assert(ret >= 0);
+
+    if((ret = encode_plist(ocpypl1, little_endian, word_length, "testfiles/plist_files/ocpypl_")) < 0)
+        assert(ret > 0);
+        
+    /* release resource */
+    if((ret = H5Pclose(ocpypl1)) < 0)
+         assert(ret > 0);
+
+    /******* ENCODE/DECODE OCPLS *****/
+    if((ocpl1 = H5Pcreate(H5P_OBJECT_CREATE)) < 0)
+        assert(ocpl1 > 0);
+
+    if((ret = encode_plist(ocpl1, little_endian, word_length, "testfiles/plist_files/def_ocpl_")) < 0)
+        assert(ret > 0);
+
+    if((ret = H5Pset_attr_creation_order(ocpl1, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED))) < 0)
+         assert(ret > 0);
+
+    if((ret = H5Pset_attr_phase_change (ocpl1, 110, 105)) < 0)
+         assert(ret > 0);
+
+    if((ret = H5Pset_filter (ocpl1, H5Z_FILTER_FLETCHER32, 0, (size_t)0, NULL)) < 0)
+        assert(ret > 0);
+
+    if((ret = encode_plist(ocpl1, little_endian, word_length, "testfiles/plist_files/ocpl_")) < 0)
+        assert(ret > 0);
+
+    /* release resource */
+    if((ret = H5Pclose(ocpl1)) < 0)
+        assert(ret > 0);
+
+    /******* ENCODE/DECODE LAPLS *****/
+    if((lapl1 = H5Pcreate(H5P_LINK_ACCESS)) < 0)
+        assert(lapl1 > 0);
+
+    if((ret = encode_plist(lapl1, little_endian, word_length, "testfiles/plist_files/def_lapl_")) < 0)
+        assert(ret > 0);
+
+    if((ret = H5Pset_nlinks(lapl1, (size_t)134)) < 0)
+        assert(ret > 0);
+
+    if((ret = H5Pset_elink_acc_flags(lapl1, H5F_ACC_RDONLY)) < 0)
+        assert(ret > 0);
+
+    if((ret = H5Pset_elink_prefix(lapl1, "/tmpasodiasod")) < 0)
+        assert(ret > 0);
+
+    /* Create FAPL for the elink FAPL */
+    if((fapl1 = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        assert(fapl1 > 0);
+    if((ret = H5Pset_alignment(fapl1, 2, 1024)) < 0)
+        assert(ret > 0);
+
+    if((ret = H5Pset_elink_fapl(lapl1, fapl1)) < 0)
+        assert(ret > 0);
+
+    /* Close the elink's FAPL */
+    if((ret = H5Pclose(fapl1)) < 0)
+        assert(ret > 0);
+
+    if((ret = encode_plist(lapl1, little_endian, word_length, "testfiles/plist_files/lapl_")) < 0)
+        assert(ret > 0);
+
+    /* release resource */
+    if((ret = H5Pclose(lapl1)) < 0)
+        assert(ret > 0);
+
+    /******* ENCODE/DECODE FAPLS *****/
+    if((fapl1 = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        assert(fapl1 > 0);
+
+    if((ret = encode_plist(fapl1, little_endian, word_length, "testfiles/plist_files/def_fapl_")) < 0)
+        assert(ret > 0);
+
+    if((ret = H5Pset_family_offset(fapl1, 1024)) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_meta_block_size(fapl1, 2098452)) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_sieve_buf_size(fapl1, 1048576)) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_alignment(fapl1, 2, 1024)) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_cache(fapl1, 1024, 128, 10485760, 0.3f)) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_elink_file_cache_size(fapl1, 10485760)) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_gc_references(fapl1, 1)) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_small_data_block_size(fapl1, 2048)) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_libver_bounds(fapl1, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST)) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_fclose_degree(fapl1, H5F_CLOSE_WEAK)) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_multi_type(fapl1, H5FD_MEM_GHEAP)) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_mdc_config(fapl1, &my_cache_config)) < 0)
+        assert(ret > 0);
+    if((ret = H5Pset_core_write_tracking(fapl1, TRUE, (size_t)(1024 * 1024))) < 0)
+        assert(ret > 0);
+
+    if((ret = encode_plist(fapl1, little_endian, word_length, "testfiles/plist_files/fapl_")) < 0)
+        assert(ret > 0);
+
+    /* release resource */
+    if((ret = H5Pclose(fapl1)) < 0)
+        assert(ret > 0);
+
+    /******* ENCODE/DECODE FCPLS *****/
+    if((fcpl1 = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        assert(fcpl1 > 0);
+
+    if((ret = encode_plist(fcpl1, little_endian, word_length, "testfiles/plist_files/def_fcpl_")) < 0)
+        assert(ret > 0);
+
+    if((ret = H5Pset_userblock(fcpl1, 1024) < 0))
+         assert(ret > 0);
+
+    if((ret = H5Pset_istore_k(fcpl1, 3) < 0))
+         assert(ret > 0);
+
+    if((ret = H5Pset_sym_k(fcpl1, 4, 5) < 0))
+         assert(ret > 0);
+
+    if((ret = H5Pset_shared_mesg_nindexes(fcpl1, 8) < 0))
+         assert(ret > 0);
+
+    if((ret = H5Pset_shared_mesg_index(fcpl1, 1,  H5O_SHMESG_SDSPACE_FLAG, 32) < 0))
+         assert(ret > 0);
+
+   if((ret = H5Pset_shared_mesg_phase_change(fcpl1, 60, 20) < 0))
+         assert(ret > 0);
+
+    if((ret = H5Pset_sizes(fcpl1, 8, 4) < 0))
+         assert(ret > 0);
+
+    if((ret = encode_plist(fcpl1, little_endian, word_length, "testfiles/plist_files/fcpl_")) < 0)
+        assert(ret > 0);
+
+    /* release resource */
+    if((ret = H5Pclose(fcpl1)) < 0)
+        assert(ret > 0);
+
+    /******* ENCODE/DECODE STRCPLS *****/
+    strcpl1 = H5Pcreate(H5P_STRING_CREATE);
+    assert(strcpl1 > 0);
+
+    ret = encode_plist(strcpl1, little_endian, word_length, "testfiles/plist_files/def_strcpl_");
+    assert(ret > 0);
+
+    ret = H5Pset_char_encoding(strcpl1, H5T_CSET_UTF8);
+    assert(ret >= 0);
+
+    ret = encode_plist(strcpl1, little_endian, word_length, "testfiles/plist_files/strcpl_");
+    assert(ret > 0);
+
+    /* release resource */
+    ret = H5Pclose(strcpl1);
+    assert(ret >= 0);
+
+    /******* ENCODE/DECODE ACPLS *****/
+    acpl1 = H5Pcreate(H5P_ATTRIBUTE_CREATE);
+    assert(acpl1 > 0);
+
+    ret = encode_plist(acpl1, little_endian, word_length, "testfiles/plist_files/def_acpl_");
+    assert(ret > 0);
+
+    ret = H5Pset_char_encoding(acpl1, H5T_CSET_UTF8);
+    assert(ret >= 0);
+
+    ret = encode_plist(acpl1, little_endian, word_length, "testfiles/plist_files/acpl_");
+    assert(ret > 0);
+
+    /* release resource */
+    ret = H5Pclose(acpl1);
+    assert(ret >= 0);
+
+    return 0;
+}
+
+static int
+encode_plist(hid_t plist_id, int little_endian, int word_length, const char *filename_prefix)
+{
+    int fd = 0; /* file descriptor */
+    herr_t ret = 0;
+    void *temp_buf = NULL;
+    size_t temp_size = 0;
+    ssize_t write_size;
+    char filename[1024];
+
+    /* Generate filename */
+    if((ret = HDsnprintf(filename, sizeof(filename), "%s%d%s", filename_prefix, word_length, little_endian ? "le" : "be")) < 0)
+        assert(ret > 0);
+
+    /* first call to encode returns only the size of the buffer needed */
+    if((ret = H5Pencode(plist_id, NULL, &temp_size)) < 0)
+        assert(ret > 0);
+
+    temp_buf = (void *)HDmalloc(temp_size);
+    assert(temp_buf);
+
+    if((ret = H5Pencode(plist_id, temp_buf, &temp_size)) < 0)
+        assert(ret > 0);
+
+    fd = HDopen(filename, O_RDWR | O_CREAT | O_TRUNC, 0666);
+    assert(fd > 0);
+
+    write_size = HDwrite(fd, temp_buf, temp_size);
+    assert(write_size == (ssize_t)temp_size);
+
+    HDclose(fd);
+    
+    HDfree(temp_buf);
+
+    return 1;
+}
+
diff --git a/test/gen_specmetaread.c b/test/gen_specmetaread.c
new file mode 100644
index 0000000..f489119
--- /dev/null
+++ b/test/gen_specmetaread.c
@@ -0,0 +1,96 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Quincey Koziol <koziol at hdfgroup.org>
+ *              Thursday, October  8, 2009
+ *
+ * Purpose:	Create a file with a dataset who's raw data immediately follows
+ *      its object header, so that when the dataset is unlinked from its parent
+ *      group, a speculative read of the object header would get the raw data
+ *      into the metadata accumulator, "polluting" it.
+ *		To build the test file, this program MUST be compiled and linked with
+ *      the library on the trunk as of when this file is checked in.
+ */
+
+#include "hdf5.h"
+#include <assert.h>
+
+#define FILENAME        "specmetaread.h5"
+#define DIM             10
+
+int
+main(void)
+{
+    hid_t	fid;
+    hid_t	fapl;
+    hid_t       did;
+    hid_t 	space;
+    hsize_t     dim[1] = {DIM};
+    unsigned    data[DIM];
+    unsigned    u;
+    herr_t      ret;         /* Generic return value */
+
+    /* Initialize the data */
+    for(u = 0; u < DIM; u++)
+	data[u] = u;
+
+    /* Create a FAPL with the metadata and small data aggregators turned off */
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+    assert(fapl > 0);
+    ret = H5Pset_meta_block_size(fapl, (hsize_t)0);
+    assert(ret >= 0);
+    ret = H5Pset_small_data_block_size(fapl, (hsize_t)0);
+    assert(ret >= 0);
+
+    /* Create file */
+    fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
+    assert(fid > 0);
+
+    /* Close FAPL */
+    ret = H5Pclose(fapl);
+    assert(ret >= 0);
+
+    /* Create dataspace */
+    space = H5Screate_simple(1, dim, NULL);
+    assert(space > 0);
+
+    /* Create dataset #1 */
+    did = H5Dcreate2(fid, "dset1", H5T_NATIVE_UINT, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    assert(did > 0);
+    ret = H5Dwrite(did, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
+    assert(ret >= 0);
+    ret = H5Dclose(did);
+    assert(ret >= 0);
+
+    /* Create dataset #2 */
+    did = H5Dcreate2(fid, "dset2", H5T_NATIVE_UINT, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+    assert(did > 0);
+    ret = H5Dwrite(did, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data);
+    assert(ret >= 0);
+    ret = H5Dclose(did);
+    assert(ret >= 0);
+
+    /* Close dataspace */
+    ret = H5Sclose(space);
+    assert(ret >= 0);
+
+    /* Close file */
+    ret = H5Fclose(fid);
+    assert(ret >= 0);
+
+    return 0;
+}
+
diff --git a/test/gen_udlinks.c b/test/gen_udlinks.c
index a1312d2..fc044da 100644
--- a/test/gen_udlinks.c
+++ b/test/gen_udlinks.c
@@ -57,6 +57,10 @@ main (void)
       strcpy(filename1, NAME_BE_1);
       strcpy(filename2, NAME_BE_2);
       break;
+    case H5T_ORDER_ERROR:
+    case H5T_ORDER_VAX:
+    case H5T_ORDER_MIXED:
+    case H5T_ORDER_NONE:
     default:
       goto error;
   }
diff --git a/test/getname.c b/test/getname.c
index c151bda..2700b49 100644
--- a/test/getname.c
+++ b/test/getname.c
@@ -20,8 +20,8 @@
  * Purpose:     Tests the "ID to name" functionality
  */
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
-#define H5I_PACKAGE		/*suppress error about including H5Ipkg	  */
+#define H5G_FRIEND		/*suppress error about including H5Gpkg	  */
+#define H5I_FRIEND		/*suppress error about including H5Ipkg	  */
 
 /* Define these macros to indicate that the testing APIs should be available */
 #define H5G_TESTING
@@ -2573,19 +2573,27 @@ test_obj_ref(hid_t fapl)
         FAIL_STACK_ERROR
 
     TESTING("getting path to normal dataset in root group");
-    if((dataset2 = H5Rdereference(dataset, H5R_OBJECT, &wbuf[0])) < 0) FAIL_STACK_ERROR
+    if((dataset2 = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &wbuf[0])) < 0) FAIL_STACK_ERROR
     *buf = '\0';
     i = H5Iget_name(dataset2, (char*)buf, sizeof(buf));
     if(H5Dclose(dataset2) < 0) FAIL_STACK_ERROR
     if(!((HDstrcmp(buf, "/Dataset3") == 0) &&(i == 9))) TEST_ERROR
     *buf = '\0';
+
+    /* Check H5Rget_name returns the correct length of the name when name is NULL */
+    i = H5Rget_name(dataset, H5R_OBJECT, &wbuf[0], NULL, 0);
+    if(i != 9) TEST_ERROR
+    /* Make sure size parameter is ignored */
+    i = H5Rget_name(dataset, H5R_OBJECT, &wbuf[0], NULL, 200);
+    if(i != 9) TEST_ERROR
+    
     i = H5Rget_name(dataset, H5R_OBJECT, &wbuf[0], (char*)buf, sizeof(buf));
     if(!((HDstrcmp(buf, "/Dataset3") == 0) &&(i == 9))) TEST_ERROR
     PASSED()
 
     HDmemset(buf, 0, sizeof(buf));
     TESTING("getting path to dataset in /Group1");
-    if((dataset2 = H5Rdereference(dataset, H5R_OBJECT, &wbuf[1])) < 0) FAIL_STACK_ERROR
+    if((dataset2 = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &wbuf[1])) < 0) FAIL_STACK_ERROR
     *buf = '\0';
     i = H5Iget_name(dataset2, (char*)buf, sizeof(buf));
     if(H5Dclose(dataset2) < 0) FAIL_STACK_ERROR
@@ -2597,7 +2605,7 @@ test_obj_ref(hid_t fapl)
 
     HDmemset(buf, 0, sizeof(buf));
     TESTING("getting path to /Group1");
-    if((group = H5Rdereference(dataset, H5R_OBJECT, &wbuf[2])) < 0) FAIL_STACK_ERROR
+    if((group = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &wbuf[2])) < 0) FAIL_STACK_ERROR
     *buf = '\0';
     i = H5Iget_name(group, (char*)buf, sizeof(buf));
     if(H5Gclose(group) < 0) FAIL_STACK_ERROR
@@ -2609,7 +2617,7 @@ test_obj_ref(hid_t fapl)
 
     HDmemset(buf, 0, sizeof(buf));
     TESTING("getting path to datatype in /Group1");
-    if((tid1 = H5Rdereference(dataset, H5R_OBJECT, &wbuf[3])) < 0) FAIL_STACK_ERROR
+    if((tid1 = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &wbuf[3])) < 0) FAIL_STACK_ERROR
     *buf = '\0';
     i = H5Iget_name(tid1, (char*)buf, sizeof(buf));
     if(H5Tclose(tid1) < 0) FAIL_STACK_ERROR
@@ -2621,7 +2629,7 @@ test_obj_ref(hid_t fapl)
 
     HDmemset(buf, 0, sizeof(buf));
     TESTING("getting path to dataset in nested group");
-    if((dataset2 = H5Rdereference(dataset, H5R_OBJECT, &wbuf[4])) < 0) FAIL_STACK_ERROR
+    if((dataset2 = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &wbuf[4])) < 0) FAIL_STACK_ERROR
     *buf = '\0';
     i = H5Iget_name(dataset2, (char*)buf, sizeof(buf));
     if(H5Dclose(dataset2) < 0) FAIL_STACK_ERROR
@@ -2633,7 +2641,7 @@ test_obj_ref(hid_t fapl)
 
     HDmemset(buf, 0, sizeof(buf));
     TESTING("getting path to nested group");
-    if((group = H5Rdereference(dataset, H5R_OBJECT, &wbuf[5])) < 0) FAIL_STACK_ERROR
+    if((group = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &wbuf[5])) < 0) FAIL_STACK_ERROR
     *buf = '\0';
     i = H5Iget_name(group, (char*)buf, sizeof(buf));
     if(H5Gclose(group) < 0) FAIL_STACK_ERROR
@@ -2645,7 +2653,7 @@ test_obj_ref(hid_t fapl)
 
     HDmemset(buf, 0, sizeof(buf));
     TESTING("getting path to dataset created via hard link");
-    if((dataset2 = H5Rdereference(dataset, H5R_OBJECT, &wbuf[6])) < 0) FAIL_STACK_ERROR
+    if((dataset2 = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &wbuf[6])) < 0) FAIL_STACK_ERROR
     *buf = '\0';
     i = H5Iget_name(dataset2, (char*)buf, sizeof(buf));
     if(H5Dclose(dataset2) < 0) FAIL_STACK_ERROR
@@ -2657,7 +2665,7 @@ test_obj_ref(hid_t fapl)
 
     HDmemset(buf, 0, sizeof(buf));
     TESTING("getting path to root group");
-    if((group = H5Rdereference(dataset, H5R_OBJECT, &wbuf[7])) < 0) FAIL_STACK_ERROR
+    if((group = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &wbuf[7])) < 0) FAIL_STACK_ERROR
     *buf = '\0';
     i = H5Iget_name(group, (char*)buf, sizeof(buf));
     if(H5Gclose(group) < 0) FAIL_STACK_ERROR
@@ -2672,7 +2680,7 @@ test_obj_ref(hid_t fapl)
         FAIL_STACK_ERROR
 
     TESTING("getting path to dataset hidden by a mounted file");
-    if((dataset2 = H5Rdereference(dataset, H5R_OBJECT, &wbuf[4])) < 0) FAIL_STACK_ERROR
+    if((dataset2 = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &wbuf[4])) < 0) FAIL_STACK_ERROR
     *buf = '\0';
     i = H5Iget_name(dataset2, (char*)buf, sizeof(buf));
     if(H5Dclose(dataset2) < 0) FAIL_STACK_ERROR
@@ -2683,7 +2691,7 @@ test_obj_ref(hid_t fapl)
     PASSED()
 
     /* Now we try unlinking dataset2 from the file and searching for it.  It shouldn't be found */
-    if((dataset2 = H5Rdereference(dataset, H5R_OBJECT, &wbuf[1])) < 0)
+    if((dataset2 = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &wbuf[1])) < 0)
         FAIL_STACK_ERROR
     if(H5Ldelete(fid1, "/Group1/Dataset2", H5P_DEFAULT) < 0)
         FAIL_STACK_ERROR
@@ -2816,14 +2824,19 @@ test_reg_ref(hid_t fapl)
     /* Get name of the dataset the first region reference points to using H5Rget_name */
     TESTING("H5Rget_name to get name from region reference(hyperslab)");
     *buf1 = '\0';
-    name_size1 = H5Rget_name(dsetr_id, H5R_DATASET_REGION, &ref_out[0], (char*)buf1, NAME_BUF_SIZE);
+
+    /* Check H5Rget_name returns the correct length of the name when name is NULL */
+    name_size1 = H5Rget_name(dsetr_id, H5R_DATASET_REGION, &ref_out[0], NULL, 0);
+    if(name_size1 != 7) TEST_ERROR
+
+    name_size1 = H5Rget_name(dsetr_id, H5R_DATASET_REGION, &ref_out[0], (char*)buf1, NAME_BUF_SIZE );
     if(!((HDstrcmp(buf1, "/MATRIX") == 0) &&(name_size1 == 7))) TEST_ERROR
     PASSED()
 
     TESTING("H5Iget_name to get name from region reference(hyperslab)");
 
     /* Dereference the first reference */
-    dsetv_id = H5Rdereference(dsetr_id, H5R_DATASET_REGION, &ref_out[0]);
+    dsetv_id = H5Rdereference2(dsetr_id, H5P_DEFAULT, H5R_DATASET_REGION, &ref_out[0]);
 
     /* Get name of the dataset the first region reference points using H5Iget_name */
     *buf2 = '\0';
@@ -2844,7 +2857,7 @@ test_reg_ref(hid_t fapl)
     TESTING("H5Iget_name to get name from region reference(pnt selec)");
 
     /* Dereference the second reference */
-    if((dsetv_id = H5Rdereference(dsetr_id, H5R_DATASET_REGION, &ref_out[1])) < 0) TEST_ERROR
+    if((dsetv_id = H5Rdereference2(dsetr_id, H5P_DEFAULT, H5R_DATASET_REGION, &ref_out[1])) < 0) TEST_ERROR
 
     /* Get name of the dataset the first region reference points using H5Iget_name */
     *buf2 = '\0';
diff --git a/test/group_old.h5 b/test/group_old.h5
index 58f66f8..2440103 100644
Binary files a/test/group_old.h5 and b/test/group_old.h5 differ
diff --git a/test/h5test.c b/test/h5test.c
index 4d841f1..cbe067f 100644
--- a/test/h5test.c
+++ b/test/h5test.c
@@ -28,7 +28,7 @@
 #include "H5srcdir.h"
 
 /* Necessary for h5_verify_cached_stabs() */
-#define H5G_PACKAGE
+#define H5G_FRIEND		/*suppress error about including H5Gpkg	  */
 #define H5G_TESTING
 #include "H5Gpkg.h"
 
@@ -91,9 +91,12 @@ MPI_Info    h5_io_info_g=MPI_INFO_NULL;/* MPI INFO object for IO */
  */
 static const char *multi_letters = "msbrglo";
 
+/* Previous error reporting function */
+static H5E_auto2_t err_func = NULL;
+
 static herr_t h5_errors(hid_t estack, void *client_data);
 static char * h5_fixname_real(const char *base_name, hid_t fapl, const char *suffix, 
-                              char *fullname, size_t size);
+                              char *fullname, size_t size, hbool_t nest_printf);
 
 

 /*-------------------------------------------------------------------------
@@ -120,77 +123,127 @@ h5_errors(hid_t estack, void H5_ATTR_UNUSED *client_data)
     return 0;
 }
 
-
+

 /*-------------------------------------------------------------------------
- * Function:  h5_cleanup
+ * Function:  h5_clean_files
  *
- * Purpose:  Cleanup temporary test files.
+ * Purpose:  Cleanup temporary test files (always).
  *    base_name contains the list of test file names.
- *    The file access property list is also closed.
  *
- * Return:  Non-zero if cleanup actions were performed; zero otherwise.
+ * Return:  void
  *
- * Programmer:  Albert Cheng
- *              May 28, 1998
+ * Programmer:  Neil Fortner
+ *              June 1, 2015
  *
  *-------------------------------------------------------------------------
  */
-int
-h5_cleanup(const char *base_name[], hid_t fapl)
+void
+h5_clean_files(const char *base_name[], hid_t fapl)
 {
-    int    retval = 0;
+    int i;
 
-    if(GetTestCleanup()) {
-        int i;
+    for(i = 0; base_name[i]; i++) {
+        char filename[1024];
+        char temp[2048];
+        hid_t driver;
 
-        for(i = 0; base_name[i]; i++) {
-            char filename[1024];
-            char temp[2048];
-            hid_t driver;
+        if(NULL == h5_fixname(base_name[i], fapl, filename, sizeof(filename)))
+            continue;
 
-            if(NULL == h5_fixname(base_name[i], fapl, filename, sizeof(filename)))
-                continue;
+        driver = H5Pget_driver(fapl);
 
-            driver = H5Pget_driver(fapl);
+        if(driver == H5FD_FAMILY) {
+            int j;
 
-            if(driver == H5FD_FAMILY) {
-                int j;
+            for(j = 0; /*void*/; j++) {
+                HDsnprintf(temp, sizeof temp, filename, j);
 
-                for(j = 0; /*void*/; j++) {
-                    HDsnprintf(temp, sizeof temp, filename, j);
+                if(HDaccess(temp, F_OK) < 0)
+                    break;
 
-                    if(HDaccess(temp, F_OK) < 0)
-                        break;
+                HDremove(temp);
+            } /* end for */
+        } else if(driver == H5FD_CORE) {
+            hbool_t backing;        /* Whether the core file has backing store */
 
-                    HDremove(temp);
-                } /* end for */
-            } else if(driver == H5FD_CORE) {
-                hbool_t backing;        /* Whether the core file has backing store */
+            H5Pget_fapl_core(fapl, NULL, &backing);
 
-                H5Pget_fapl_core(fapl, NULL, &backing);
+            /* If the file was stored to disk with bacing store, remove it */
+            if(backing)
+                HDremove(filename);
+        } else if (driver == H5FD_MULTI) {
+            H5FD_mem_t mt;
 
-                /* If the file was stored to disk with bacing store, remove it */
-                if(backing)
-                    HDremove(filename);
-            } else if (driver == H5FD_MULTI) {
-                H5FD_mem_t mt;
+            HDassert(HDstrlen(multi_letters)==H5FD_MEM_NTYPES);
 
-                HDassert(HDstrlen(multi_letters)==H5FD_MEM_NTYPES);
+            for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t,mt)) {
+                HDsnprintf(temp, sizeof temp, "%s-%c.h5", filename, multi_letters[mt]);
+                HDremove(temp); /*don't care if it fails*/
+            } /* end for */
+        } else {
+            HDremove(filename);
+        }
+    } /* end for */
 
-                for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t,mt)) {
-                    HDsnprintf(temp, sizeof temp, "%s-%c.h5", filename, multi_letters[mt]);
-                    HDremove(temp); /*don't care if it fails*/
-                } /* end for */
-            } else {
-                HDremove(filename);
-            }
-        } /* end for */
+    /* Close the FAPL used to access the file */
+    H5Pclose(fapl);
+
+    return;
+} /* end h5_clean_files() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:  h5_cleanup
+ *
+ * Purpose:  Cleanup temporary test files.
+ *    base_name contains the list of test file names.
+ *    The file access property list is also closed.
+ *
+ * Return:  Non-zero if cleanup actions were performed; zero otherwise.
+ *
+ * Programmer:  Albert Cheng
+ *              May 28, 1998
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+h5_cleanup(const char *base_name[], hid_t fapl)
+{
+    int    retval = 0;
+
+    if(GetTestCleanup()) {
+        /* Clean up files in base_name, and the FAPL */
+        h5_clean_files(base_name, fapl);
 
         retval = 1;
     } /* end if */
 
-    H5Pclose(fapl);
+    /* Restore the original error reporting routine */
+    h5_restore_err();
+
     return retval;
+} /* end h5_cleanup() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    h5_restore_err
+ *
+ * Purpose:     Restore the default error handler.
+ *
+ * Return:      N/A
+ *
+ * Programmer:  Quincey Koziol
+ *              Sept 10, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+void
+h5_restore_err(void)
+{
+    /* Restore the original error reporting routine */
+    HDassert(err_func != NULL);
+    H5Eset_auto2(H5E_DEFAULT, err_func, NULL);
+    err_func = NULL;
 }
 
 

@@ -212,6 +265,10 @@ h5_reset(void)
     HDfflush(stdout);
     HDfflush(stderr);
     H5close();
+
+    /* Save current error stack reporting routine and redirect to our local one */
+    HDassert(err_func == NULL);
+    H5Eget_auto2(H5E_DEFAULT, &err_func, NULL);
     H5Eset_auto2(H5E_DEFAULT, h5_errors, NULL);
 
 /*
@@ -233,12 +290,12 @@ h5_reset(void)
      */
     sprintf(filename, "/tmp/h5emit-%05d.h5", HDgetpid());
     H5E_BEGIN_TRY {
-  hid_t file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT,
-             H5P_DEFAULT);
-  hid_t grp = H5Gcreate2(file, "emit", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
-  H5Gclose(grp);
-  H5Fclose(file);
-  HDunlink(filename);
+        hid_t file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT,
+                 H5P_DEFAULT);
+        hid_t grp = H5Gcreate2(file, "emit", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+        H5Gclose(grp);
+        H5Fclose(file);
+        HDunlink(filename);
     } H5E_END_TRY;
 }
 #endif /* OLD_WAY */
@@ -270,7 +327,7 @@ h5_reset(void)
 char *
 h5_fixname(const char *base_name, hid_t fapl, char *fullname, size_t size)
 {
-    return (h5_fixname_real(base_name, fapl, ".h5", fullname, size));
+    return (h5_fixname_real(base_name, fapl, ".h5", fullname, size, FALSE));
 }
 
 

@@ -290,7 +347,33 @@ h5_fixname(const char *base_name, hid_t fapl, char *fullname, size_t size)
 char *
 h5_fixname_no_suffix(const char *base_name, hid_t fapl, char *fullname, size_t size)
 {
-    return (h5_fixname_real(base_name, fapl, NULL, fullname, size));
+    return (h5_fixname_real(base_name, fapl, NULL, fullname, size, FALSE));
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:  h5_fixname_printf
+ *
+ * Purpose:  Same as h5_fixname but returns a filename that can be passed
+ *    through a printf-style function once before being passed to the file
+ *    driver.  Basically, replaces all % characters used by the file
+ *    driver with %%.
+ *
+ * Return:  Success:  The FULLNAME pointer.
+ *
+ *    Failure:  NULL if BASENAME or FULLNAME is the null
+ *        pointer or if FULLNAME isn't large enough for
+ *        the result.
+ *
+ * Programmer:  Neil Fortner
+ *              Wednesday, July 15, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+char *
+h5_fixname_printf(const char *base_name, hid_t fapl, char *fullname, size_t size)
+{
+    return (h5_fixname_real(base_name, fapl, ".h5", fullname, size, TRUE));
 }
 
 

@@ -318,7 +401,7 @@ h5_fixname_no_suffix(const char *base_name, hid_t fapl, char *fullname, size_t s
  */
 static char *
 h5_fixname_real(const char *base_name, hid_t fapl, const char *_suffix, 
-                char *fullname, size_t size)
+                char *fullname, size_t size, hbool_t nest_printf)
 {
     const char     *prefix = NULL;
     char           *ptr, last = '\0';
@@ -339,7 +422,7 @@ h5_fixname_real(const char *base_name, hid_t fapl, const char *_suffix,
 
         if(suffix) {
             if(H5FD_FAMILY == driver)
-                suffix = "%05d.h5";
+                suffix = nest_printf ? "%%05d.h5" : "%05d.h5";
             else if (H5FD_MULTI == driver)
                 suffix = NULL;
         }
@@ -590,7 +673,7 @@ h5_fileaccess(void)
     } else if (!HDstrcmp(name, "core_paged")) {
         /* In-memory driver with write tracking and paging on */
         if (H5Pset_fapl_core(fapl, (size_t)1, TRUE)<0) return -1;
-        if (H5Pset_core_write_tracking(fapl, TRUE, (size_t)524288)<0) return -1;
+        if (H5Pset_core_write_tracking(fapl, TRUE, (size_t)4096)<0) return -1;
      } else if (!HDstrcmp(name, "split")) {
         /* Split meta data and raw data each using default driver */
         if (H5Pset_fapl_split(fapl,
@@ -1180,8 +1263,6 @@ getenv_all(MPI_Comm comm, int root, const char* name)
  * Programmer:  Larry Knox
  *              Monday, October 13, 2009
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 int
@@ -1193,20 +1274,22 @@ h5_make_local_copy(const char *origfilename, const char *local_copy_name)
     const char *filename = H5_get_srcdir_filename(origfilename);;       /* Get the test file name to copy */
 
     /* Copy old file into temporary file */
-    if((fd_old = HDopen(filename, O_RDONLY, 0666)) < 0) return -1;
-    if((fd_new = HDopen(local_copy_name, O_RDWR|O_CREAT|O_TRUNC, 0666))
-        < 0) return -1;
+    if((fd_old = HDopen(filename, O_RDONLY, 0666)) < 0)
+        return -1;
+    if((fd_new = HDopen(local_copy_name, O_RDWR|O_CREAT|O_TRUNC, 0666)) < 0)
+        return -1;
 
     /* Copy data */
     while((nread = HDread(fd_old, buf, (size_t)READ_BUF_SIZE)) > 0)
-        HDwrite(fd_new, buf, (size_t)nread);
+        if(HDwrite(fd_new, buf, (size_t)nread) < 0)
+            return -1;
 
     /* Close files */
     if(HDclose(fd_old) < 0) return -1;
     if(HDclose(fd_new) < 0) return -1;
 
     return 0;
-}
+} /* end h5_make_local_copy() */
 
 

 /*-------------------------------------------------------------------------
@@ -1296,3 +1379,56 @@ error:
     return -1;
 }
 
+/*
+ * To send a message by creating the file.
+ * This is a helper routine used in:
+ *	1) tfile.c: test_file_lock_concur() and test_file_lock_swmr_concur()
+ *	2) use_common.c
+ *	3) swmr_addrme_writer.c, swmr_remove_writer.c, swmr_sparse_writer.c, swmr_writer.c
+ */
+void
+h5_send_message(const char *file)
+{
+    FILE *id;
+
+    id = HDfopen(file, "w+");
+    HDfclose(id);
+} /* h5_send_message() */
+
+/*
+ * Repeatedly check for the message file.
+ * It will stop when the file exists or exceeds the timeout limit.
+ * This is a helper routine used in:
+ *	1) tfile.c: test_file_lock_concur() and test_file_lock_swmr_concur()
+ *	2) use_common.c
+ */
+int
+h5_wait_message(const char *file)
+{
+    FILE *id;           /* File pointer */
+    time_t t0, t1;      /* Time info */
+
+    /* Start timer */
+    HDtime(&t0);
+
+    /* Repeatedly check whether the file exists */
+    while((id = HDfopen(file, "r")) == NULL) {
+        /* Get current time */
+        HDtime(&t1);
+        /*
+         * Determine time difference--
+         *   if waiting too long for the message, then it is
+         *   unlikely the message will get sent, then fail rather
+         *   than loop forever.
+         */
+        if(HDdifftime(t1, t0) > MESSAGE_TIMEOUT)
+            goto done;
+    }
+
+    if(id != NULL) HDfclose(id);
+    HDunlink(file);
+    return(1);
+
+done:
+    return(-1);
+} /* h5_wait_message() */
diff --git a/test/h5test.h b/test/h5test.h
index 19524a9..a91da5d 100644
--- a/test/h5test.h
+++ b/test/h5test.h
@@ -61,18 +61,18 @@
 /* Should be used internally by the libtest.a only. */
 #define HDGetTestVerbosity() (TestVerbosity)
 
-#define VERBOSE_NONE	(HDGetTestVerbosity()==VERBO_NONE)
-#define VERBOSE_DEF	(HDGetTestVerbosity()>=VERBO_DEF)
-#define VERBOSE_LO	(HDGetTestVerbosity()>=VERBO_LO)
-#define VERBOSE_MED	(HDGetTestVerbosity()>=VERBO_MED)
-#define VERBOSE_HI	(HDGetTestVerbosity()>=VERBO_HI)
+#define VERBOSE_NONE  (HDGetTestVerbosity()==VERBO_NONE)
+#define VERBOSE_DEF  (HDGetTestVerbosity()>=VERBO_DEF)
+#define VERBOSE_LO  (HDGetTestVerbosity()>=VERBO_LO)
+#define VERBOSE_MED  (HDGetTestVerbosity()>=VERBO_MED)
+#define VERBOSE_HI  (HDGetTestVerbosity()>=VERBO_HI)
 
 /*
  * Test controls definitions.
  */
-#define SKIPTEST	1	/* Skip this test */
-#define ONLYTEST	2	/* Do only this test */
-#define BEGINTEST	3	/* Skip all tests before this test */
+#define SKIPTEST  1  /* Skip this test */
+#define ONLYTEST  2  /* Do only this test */
+#define BEGINTEST  3  /* Skip all tests before this test */
 
 /*
  * This contains the filename prefix specificied as command line option for
@@ -86,8 +86,8 @@ H5TEST_DLLVAR MPI_Info h5_io_info_g;         /* MPI INFO object for IO */
 /*
  * Print the current location on the standard output stream.
  */
-#define AT()     printf ("   at %s:%d in %s()...\n",	    \
-				__FILE__, __LINE__, FUNC);
+#define AT()     printf ("   at %s:%d in %s()...\n",        \
+        __FILE__, __LINE__, FUNC);
 
 /*
  * The name of the test is printed by saying TESTING("something") which will
@@ -98,12 +98,13 @@ H5TEST_DLLVAR MPI_Info h5_io_info_g;         /* MPI INFO object for IO */
  * spaces.  If the h5_errors() is used for automatic error handling then
  * the H5_FAILED() macro is invoked automatically when an API function fails.
  */
-#define TESTING(WHAT)	{printf("Testing %-62s",WHAT); fflush(stdout);}
-#define TESTING_2(WHAT)	{printf(" Testing %-62s",WHAT); fflush(stdout);}
-#define PASSED()	{puts(" PASSED");fflush(stdout);}
-#define H5_FAILED()	{puts("*FAILED*");fflush(stdout);}
-#define H5_WARNING()	{puts("*WARNING*");fflush(stdout);}
-#define SKIPPED()	{puts(" -SKIP-");fflush(stdout);}
+#define TESTING(WHAT)  {printf("Testing %-62s",WHAT); fflush(stdout);}
+#define TESTING_2(WHAT)  {printf(" Testing %-62s",WHAT); fflush(stdout);}
+#define PASSED()  {puts(" PASSED");fflush(stdout);}
+#define H5_FAILED()  {puts("*FAILED*");fflush(stdout);}
+#define H5_WARNING()  {puts("*WARNING*");fflush(stdout);}
+#define SKIPPED()  {puts(" -SKIP-");fflush(stdout);}
+#define PUTS_ERROR(s)   {puts(s); AT(); goto error;}
 #define TEST_ERROR      {H5_FAILED(); AT(); goto error;}
 #define STACK_ERROR     {H5Eprint2(H5E_DEFAULT, stdout); goto error;}
 #define FAIL_STACK_ERROR {H5_FAILED(); AT(); H5Eprint2(H5E_DEFAULT, stdout); \
@@ -113,40 +114,28 @@ H5TEST_DLLVAR MPI_Info h5_io_info_g;         /* MPI INFO object for IO */
 /*
  * Alarm definitions to wait up (terminate) a test that runs too long.
  */
-#define H5_ALARM_SEC	1200	/* default is 20 minutes */
-#define ALARM_ON	TestAlarmOn()
-#define ALARM_OFF	HDalarm(0)
+#define H5_ALARM_SEC  1200  /* default is 20 minutes */
+#define ALARM_ON  TestAlarmOn()
+#define ALARM_OFF  HDalarm(0)
 
-/*
- * The methods to compare the equality of floating-point values:
- *    1. XXX_ABS_EQUAL - check if the difference is smaller than the
- *       Epsilon value.  The Epsilon values, FLT_EPSILON, DBL_EPSILON,
- *       and LDBL_EPSILON, are defined by compiler in float.h.
- *    2. XXX_REL_EQUAL - check if the relative difference is smaller than a
- *       predefined value M.  See if two values are relatively equal.
- *       It's the test's responsibility not to pass in the value 0, which
- *       may cause the equation to fail.
- */
-#define FLT_ABS_EQUAL(X,Y)	((float)fabs(X-Y)<FLT_EPSILON)
-#define DBL_ABS_EQUAL(X,Y)	(fabs(X-Y)<DBL_EPSILON)
-#define LDBL_ABS_EQUAL(X,Y)	(fabsl(X-Y)<LDBL_EPSILON)
-
-#define FLT_REL_EQUAL(X,Y,M)    (fabsf((Y-X)/X<M)
-#define DBL_REL_EQUAL(X,Y,M)    (fabs((Y-X)/X)<M)
-#define LDBL_REL_EQUAL(X,Y,M)    (fabsl((Y-X)/X)<M)
+/* The # of seconds to wait for the message file--used by h5_wait_message() */
+#define MESSAGE_TIMEOUT         300             /* Timeout in seconds */
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 /* Generally useful testing routines */
+H5TEST_DLL void h5_clean_files(const char *base_name[], hid_t fapl);
 H5TEST_DLL int h5_cleanup(const char *base_name[], hid_t fapl);
 H5TEST_DLL char *h5_fixname(const char *base_name, hid_t fapl, char *fullname, size_t size);
 H5TEST_DLL char *h5_fixname_no_suffix(const char *base_name, hid_t fapl, char *fullname, size_t size);
+H5TEST_DLL char *h5_fixname_printf(const char *base_name, hid_t fapl, char *fullname, size_t size);
 H5TEST_DLL hid_t h5_fileaccess(void);
 H5TEST_DLL void h5_no_hwconv(void);
 H5TEST_DLL const char *h5_rmprefix(const char *filename);
 H5TEST_DLL void h5_reset(void);
+H5TEST_DLL void h5_restore_err(void);
 H5TEST_DLL void h5_show_hostname(void);
 H5TEST_DLL h5_stat_size_t h5_get_file_size(const char *filename, hid_t fapl);
 H5TEST_DLL int print_func(const char *format, ...);
@@ -156,8 +145,8 @@ H5TEST_DLL herr_t h5_verify_cached_stabs(const char *base_name[], hid_t fapl);
 /* Routines for operating on the list of tests (for the "all in one" tests) */
 H5TEST_DLL void TestUsage(void);
 H5TEST_DLL void AddTest(const char *TheName, void (*TheCall) (void),
-	     void (*Cleanup) (void), const char *TheDescr,
-	     const void *Parameters);
+       void (*Cleanup) (void), const char *TheDescr,
+       const void *Parameters);
 H5TEST_DLL void TestInfo(const char *ProgName);
 H5TEST_DLL void TestParseCmdLine(int argc, char *argv[]);
 H5TEST_DLL void PerformTests(void);
@@ -179,8 +168,6 @@ H5TEST_DLL int  TestErrPrintf(const char *format, ...) H5_ATTR_FORMAT(printf, 1,
 H5TEST_DLL void SetTest(const char *testname, int action);
 H5TEST_DLL void TestAlarmOn(void);
 H5TEST_DLL void TestAlarmOff(void);
-H5TEST_DLL void PrintErrorStackOn(void);
-H5TEST_DLL void PrintErrorStackOff(void);
 
 #ifdef H5_HAVE_FILTER_SZIP
 H5TEST_DLL int h5_szip_can_encode(void);
@@ -195,6 +182,9 @@ H5TEST_DLL char* getenv_all(MPI_Comm comm, int root, const char* name);
 /* Extern global variables */
 H5TEST_DLLVAR int TestVerbosity;
 
+H5TEST_DLL void h5_send_message(const char *file);
+H5TEST_DLL int h5_wait_message(const char *file);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/test/hyperslab.c b/test/hyperslab.c
index 9bc085c..2cf47b1 100644
--- a/test/hyperslab.c
+++ b/test/hyperslab.c
@@ -644,7 +644,7 @@ test_multifill(size_t nx)
     for(i = 0; i < nx; i++) {
         if(dst[i].left != 3333333)
             sprintf(s, "bad dst[%lu].left", (unsigned long)i);
-        else if(!DBL_ABS_EQUAL(dst[i].mid, fill.mid))
+        else if(!H5_DBL_ABS_EQUAL(dst[i].mid, fill.mid))
             /* Check if two DOUBLE values are equal.  If their difference
              * is smaller than the EPSILON value for double, they are
              * considered equal. See the definition in h5test.h.
diff --git a/test/istore.c b/test/istore.c
index d088fe8..ec7542a 100644
--- a/test/istore.c
+++ b/test/istore.c
@@ -19,7 +19,7 @@
  * Purpose:	Tests various aspects of indexed raw data storage.
  */
 
-#define H5F_PACKAGE		/*suppress error about including H5Fpkg	  */
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
 
 #include "h5test.h"
 #include "H5private.h"
diff --git a/test/le_data.h5 b/test/le_data.h5
index b4d7827..e79ab47 100644
Binary files a/test/le_data.h5 and b/test/le_data.h5 differ
diff --git a/test/lheap.c b/test/lheap.c
index 81ccc77..60b29f3 100644
--- a/test/lheap.c
+++ b/test/lheap.c
@@ -36,36 +36,34 @@ const char *FILENAME[] = {
 
 

 /*-------------------------------------------------------------------------
- * Function:	main
+ * Function:    main
  *
- * Purpose:	Create a file, create a local heap, write data into the local
- *		heap, close the file, open the file, read data out of the
- *		local heap, close the file.
+ * Purpose:     Create a file, create a local heap, write data into the local
+ *              heap, close the file, open the file, read data out of the
+ *              local heap, close the file.
  *
- * Return:	Success:	zero
+ * Return:      Success:    zero
  *
- *		Failure:	non-zero
+ *              Failure:    non-zero
  *
- * Programmer:	Robb Matzke
+ * Programmer:  Robb Matzke
  *              Tuesday, November 24, 1998
  *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 int
 main(void)
 {
-    hid_t	fapl=H5P_DEFAULT;	/*file access properties	*/
-    hid_t	file=-1;		/*hdf5 file 			*/
-    H5F_t	*f=NULL;		/*hdf5 file pointer		*/
-    char	filename[1024];		/*file name			*/
-    haddr_t	heap_addr;		/*local heap address		*/
-    H5HL_t      *heap = NULL;           /*local heap			*/
-    size_t	obj[NOBJS];		/*offsets within the heap	*/
-    int		i, j;			/*miscellaneous counters	*/
-    char	buf[1024];		/*the value to store		*/
-    const char	*s;			/*value to read			*/
+    hid_t       fapl = H5P_DEFAULT; /* file access properties   */
+    hid_t       file = -1;          /* hdf5 file                */
+    H5F_t       *f = NULL;          /* hdf5 file pointer        */
+    char        filename[1024];     /* file name                */
+    haddr_t     heap_addr;          /* local heap address       */
+    H5HL_t      *heap = NULL;       /* local heap               */
+    size_t      obj[NOBJS];         /* offsets within the heap  */
+    int         i, j;               /* miscellaneous counters   */
+    char        buf[1024];          /* the value to store       */
+    const char  *s;                 /* value to read            */
 
     /* Reset library */
     h5_reset();
@@ -77,19 +75,24 @@ main(void)
      */
     TESTING("local heap write");
     h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
-    if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0)
-	goto error;
+    if(FAIL == (file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)))
+        goto error;
     if(NULL == (f = (H5F_t *)H5I_object(file))) {
-	H5_FAILED();
-	H5Eprint2(H5E_DEFAULT, stdout);
-	goto error;
+        H5_FAILED();
+        H5Eprint2(H5E_DEFAULT, stdout);
+        goto error;
     }
-    if(H5HL_create(f, H5P_DATASET_XFER_DEFAULT, (size_t)0, &heap_addr/*out*/) < 0) {
-	H5_FAILED();
-	H5Eprint2(H5E_DEFAULT, stdout);
-	goto error;
+    if(FAIL == H5AC_ignore_tags(f)) {
+        H5_FAILED();
+        H5Eprint2(H5E_DEFAULT, stdout);
+        goto error;
+    }
+    if(FAIL == H5HL_create(f, H5P_DATASET_XFER_DEFAULT, (size_t)0, &heap_addr/*out*/)) {
+        H5_FAILED();
+        H5Eprint2(H5E_DEFAULT, stdout);
+        goto error;
     }
-    if (NULL == (heap = H5HL_protect(f, H5P_DATASET_XFER_DEFAULT, heap_addr, H5AC_WRITE))) {
+    if (NULL == (heap = H5HL_protect(f, H5P_DATASET_XFER_DEFAULT, heap_addr, H5AC__NO_FLAGS_SET))) {
         H5_FAILED();
         H5Eprint2(H5E_DEFAULT, stdout);
         goto error;
@@ -101,18 +104,19 @@ main(void)
         if(j > 4)
             buf[j] = '\0';
 
-        if((size_t)(-1) == (obj[i] = H5HL_insert(f, H5P_DATASET_XFER_DEFAULT, heap, strlen(buf) + 1, buf))) {
-	    H5_FAILED();
-	    H5Eprint2(H5E_DEFAULT, stdout);
-	    goto error;
-	}
+        if(UFAIL == (obj[i] = H5HL_insert(f, H5P_DATASET_XFER_DEFAULT, heap, strlen(buf) + 1, buf))) {
+            H5_FAILED();
+            H5Eprint2(H5E_DEFAULT, stdout);
+            goto error;
+        }
     }
-    if(H5HL_unprotect(heap) < 0) {
+    if(FAIL == H5HL_unprotect(heap)) {
         H5_FAILED();
         H5Eprint2(H5E_DEFAULT, stdout);
         goto error;
     }
-    if (H5Fclose(file)<0) goto error;
+    if (FAIL == H5Fclose(file))
+        goto error;
     PASSED();
 
     /*
@@ -121,12 +125,18 @@ main(void)
 
     TESTING("local heap read");
     h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
-    if((file = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0) goto error;
+    if(FAIL == (file = H5Fopen(filename, H5F_ACC_RDONLY, fapl)))
+        goto error;
     if(NULL == (f = (H5F_t *)H5I_object(file))) {
         H5_FAILED();
         H5Eprint2(H5E_DEFAULT, stdout);
         goto error;
     }
+    if (FAIL == H5AC_ignore_tags(f)) {
+        H5_FAILED();
+        H5Eprint2(H5E_DEFAULT, stdout);
+        goto error;
+    }
     for(i = 0; i < NOBJS; i++) {
         sprintf(buf, "%03d-", i);
         for(j = 4; j < i; j++)
@@ -134,7 +144,7 @@ main(void)
         if(j > 4)
             buf[j] = '\0';
 
-        if (NULL == (heap = H5HL_protect(f, H5P_DATASET_XFER_DEFAULT, heap_addr, H5AC_READ))) {
+        if (NULL == (heap = H5HL_protect(f, H5P_DATASET_XFER_DEFAULT, heap_addr, H5AC__READ_ONLY_FLAG))) {
             H5_FAILED();
             H5Eprint2(H5E_DEFAULT, stdout);
             goto error;
@@ -154,14 +164,15 @@ main(void)
             goto error;
         }
 
-        if(H5HL_unprotect(heap) < 0) {
+        if(FAIL == H5HL_unprotect(heap)) {
             H5_FAILED();
             H5Eprint2(H5E_DEFAULT, stdout);
             goto error;
         }
     }
 
-    if (H5Fclose(file)<0) goto error;
+    if (FAIL == H5Fclose(file))
+        goto error;
     PASSED();
 
     /* Check opening existing file non-default sizes of lengths and addresses */
@@ -173,8 +184,10 @@ main(void)
         if(file >= 0){
             if((dset = H5Dopen2(file, "/Dataset1", H5P_DEFAULT)) < 0)
                 TEST_ERROR
-            if(H5Dclose(dset) < 0) TEST_ERROR
-            if(H5Fclose(file) < 0) TEST_ERROR
+            if(H5Dclose(dset) < 0)
+                TEST_ERROR
+            if(H5Fclose(file) < 0)
+                TEST_ERROR
         }
         else {
             H5_FAILED();
@@ -196,7 +209,7 @@ main(void)
  error:
     puts("*** TESTS FAILED ***");
     H5E_BEGIN_TRY {
-	H5Fclose(file);
+        H5Fclose(file);
     } H5E_END_TRY;
     return 1;
 }
diff --git a/test/links.c b/test/links.c
index b5d7316..7e63bfa 100644
--- a/test/links.c
+++ b/test/links.c
@@ -24,14 +24,18 @@
  * This file needs to access private information from the H5G package.
  * This file also needs to access the group testing code.
  */
-#define H5G_PACKAGE
+#define H5G_FRIEND		/*suppress error about including H5Gpkg	  */
 #define H5G_TESTING
 
+#define H5FD_FRIEND		/*suppress error about including H5FDpkg	  */
+#define H5FD_TESTING
+
 #include "h5test.h"
 #include "H5srcdir.h"
-#include "H5Gpkg.h"		/* Groups 				*/
-#include "H5Iprivate.h"		/* IDs			  		*/
-#include "H5Lprivate.h"         /* Links                                */
+#include "H5FDpkg.h"        /* File drivers         */
+#include "H5Gpkg.h"		    /* Groups 				*/
+#include "H5Iprivate.h"		/* IDs                  */
+#include "H5Lprivate.h"     /* Links                */
 
 /* File for external link test.  Created with gen_udlinks.c */
 #define LINKED_FILE  "be_extlink2.h5"
@@ -3848,7 +3852,6 @@ external_set_elink_fapl3(hbool_t new_format)
 {
     hid_t       core_fapl = -1, stdio_fapl = -1;
     hid_t	lapl_id = -1, new_lapl_id = -1, l_fapl = -1, out_fapl;
-    int   	ret;
 
     if(new_format)
         TESTING("H5Pset/get_fapl() (w/new group format)")
@@ -3883,11 +3886,8 @@ external_set_elink_fapl3(hbool_t new_format)
     if(H5Pget(lapl_id, "external link fapl", &out_fapl) < 0) TEST_ERROR
     if(H5Pclose(lapl_id) < 0) TEST_ERROR
 
-    /* Try closing out_fapl should fail since H5Pclose(lapl_id) should also close its fapl */
-    H5E_BEGIN_TRY {
-        ret = H5Pclose(out_fapl);
-    } H5E_END_TRY;
-    if(ret != FAIL) TEST_ERROR
+    /* Try closing out_fapl, should succeed since H5Pget() should clone its fapl */
+    if(H5Pclose(out_fapl) < 0) TEST_ERROR
 
     /* Verify that the driver for the copied link's fapl is the "core" driver */
     if((l_fapl = H5Pget_elink_fapl(new_lapl_id)) < 0) TEST_ERROR
@@ -3897,11 +3897,8 @@ external_set_elink_fapl3(hbool_t new_format)
     if(H5Pget(new_lapl_id, "external link fapl", &out_fapl) < 0) TEST_ERROR
     if(H5Premove(new_lapl_id, "external link fapl") < 0) TEST_ERROR
 
-    /* Try closing out_fapl should fail since the property is removed from new_lapl_id */
-    H5E_BEGIN_TRY {
-        ret = H5Pclose(out_fapl);
-    } H5E_END_TRY;
-    if(ret != FAIL) TEST_ERROR
+    /* Try closing out_fapl, should succeed since H5Pget() should clone its fapl */
+    if(H5Pclose(out_fapl) < 0) TEST_ERROR
 
     if(H5Pclose(l_fapl) < 0) TEST_ERROR
     if(H5Pclose(new_lapl_id) < 0) TEST_ERROR
@@ -3913,11 +3910,11 @@ external_set_elink_fapl3(hbool_t new_format)
 
  error:
     H5E_BEGIN_TRY {
-	H5Pclose(l_fapl);
-	H5Pclose(lapl_id);
-	H5Pclose(new_lapl_id);
-	H5Pclose(core_fapl);
-	H5Pclose(stdio_fapl);
+        H5Pclose(l_fapl);
+        H5Pclose(lapl_id);
+        H5Pclose(new_lapl_id);
+        H5Pclose(core_fapl);
+        H5Pclose(stdio_fapl);
     } H5E_END_TRY;
     return -1;
 } /* end external_set_elink_fapl3() */
@@ -3939,13 +3936,15 @@ external_set_elink_fapl3(hbool_t new_format)
  *-------------------------------------------------------------------------
  */
 static int
-external_set_elink_acc_flags(hid_t fapl, hbool_t new_format)
+external_set_elink_acc_flags(const char H5_ATTR_UNUSED *env_h5_drvr,
+    hid_t fapl, hbool_t new_format)
 {
     hid_t       file1 = -1, file2 = -1, group = -1, subgroup = -1, gapl = -1;
     char        filename1[NAME_BUF_SIZE],
                 filename2[NAME_BUF_SIZE];
     herr_t      ret;
     unsigned    flags;
+    char        *driver = NULL;        /* VFD string (from env variable) */
 
     if(new_format)
         TESTING("H5Pset/get_elink_acc_flags() (w/new group format)")
@@ -3998,6 +3997,15 @@ external_set_elink_acc_flags(hid_t fapl, hbool_t new_format)
     } H5E_END_TRY;
     if(subgroup != FAIL) TEST_ERROR
 
+    /* Attempt to set SWMR flags on gapl.
+     * This is just a smoke check of the flags. The actual external link
+     * functionality is tested in the SWMR tests.
+     */
+    /* Set SWMR reader flags on gapl */
+    if(H5Pset_elink_acc_flags(gapl, H5F_ACC_RDONLY | H5F_ACC_SWMR_READ) < 0) TEST_ERROR
+    /* Set SWMR writer flags on gapl */
+    if(H5Pset_elink_acc_flags(gapl, H5F_ACC_RDWR | H5F_ACC_SWMR_WRITE) < 0) TEST_ERROR
+
     /* Attempt to set invalid flags on gapl */
     H5E_BEGIN_TRY {
         ret = H5Pset_elink_acc_flags(gapl, H5F_ACC_TRUNC);
@@ -4011,10 +4019,95 @@ external_set_elink_acc_flags(hid_t fapl, hbool_t new_format)
         ret = H5Pset_elink_acc_flags(gapl, H5F_ACC_CREAT);
     } H5E_END_TRY;
     if(ret != FAIL) TEST_ERROR
+    /* SWMR reader with write access */
+    H5E_BEGIN_TRY {
+        ret = H5Pset_elink_acc_flags(gapl, H5F_ACC_RDWR | H5F_ACC_SWMR_READ);
+    } H5E_END_TRY;
+    if(ret != FAIL) TEST_ERROR
+    /* SWMR writer with read-only access */
+    H5E_BEGIN_TRY {
+        ret = H5Pset_elink_acc_flags(gapl, H5F_ACC_RDONLY | H5F_ACC_SWMR_WRITE);
+    } H5E_END_TRY;
+    if(ret != FAIL) TEST_ERROR
 
     /* Close file1 */
     if(H5Fclose(file1) < 0) TEST_ERROR
 
+    /* Only run this part with VFDs that support SWMR */
+    driver = HDgetenv("HDF5_DRIVER");
+    if(H5FD_supports_swmr_test(driver)) {
+
+        /* Reopen file1, with read-write and SWMR-write access */
+        /* Only supported under the latest file format */
+        if(new_format) {
+            if((file1 = H5Fopen(filename1, H5F_ACC_RDWR | H5F_ACC_SWMR_WRITE, fapl)) < 0) FAIL_STACK_ERROR
+
+            /* Open a group through the external link using default gapl */
+            if((group = H5Gopen2(file1, "/ext_link/group", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+
+            /* Verify that the correct parameters have been set on file2 */
+            if((file2 = H5Iget_file_id(group)) < 0) FAIL_STACK_ERROR
+            if(H5Fget_intent(file2, &flags) < 0) FAIL_STACK_ERROR
+            if(flags != (H5F_ACC_RDWR | H5F_ACC_SWMR_WRITE)) TEST_ERROR
+
+            /* Close file2 and group */
+            if(H5Gclose(group) < 0) FAIL_STACK_ERROR
+            if(H5Fclose(file2) < 0) FAIL_STACK_ERROR
+
+            /* Set elink access flags on gapl to be H5F_ACC_RDWR (dropping SWMR_WRITE) */
+            if(H5Pset_elink_acc_flags(gapl, H5F_ACC_RDWR) < 0) FAIL_STACK_ERROR
+
+            /* Open a group through the external link using gapl */
+            if((group = H5Gopen2(file1, "/ext_link/group", gapl)) < 0) FAIL_STACK_ERROR
+
+            /* Verify that the correct parameters have been set on file2 */
+            if((file2 = H5Iget_file_id(group)) < 0) FAIL_STACK_ERROR
+            if(H5Fget_intent(file2, &flags) < 0) FAIL_STACK_ERROR
+            if(flags != H5F_ACC_RDWR) TEST_ERROR
+
+            /* Close file2 and group */
+            if(H5Gclose(group) < 0) FAIL_STACK_ERROR
+            if(H5Fclose(file2) < 0) FAIL_STACK_ERROR
+
+            /* Close file1 */
+            if(H5Fclose(file1) < 0) TEST_ERROR
+        }
+
+        /* Reopen file1, with read-only and SWMR-read access */
+        if((file1 = H5Fopen(filename1, H5F_ACC_RDONLY | H5F_ACC_SWMR_READ, fapl)) < 0) FAIL_STACK_ERROR
+
+        /* Open a group through the external link using default gapl */
+        if((group = H5Gopen2(file1, "/ext_link/group", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
+
+        /* Verify that the correct parameters have been set on file2 */
+        if((file2 = H5Iget_file_id(group)) < 0) FAIL_STACK_ERROR
+        if(H5Fget_intent(file2, &flags) < 0) FAIL_STACK_ERROR
+        if(flags != (H5F_ACC_RDONLY | H5F_ACC_SWMR_READ)) TEST_ERROR
+
+        /* Close file2 and group */
+        if(H5Gclose(group) < 0) FAIL_STACK_ERROR
+        if(H5Fclose(file2) < 0) FAIL_STACK_ERROR
+
+        /* Set elink access flags on gapl to be H5F_ACC_RDWR (dropping SWMR_WRITE) */
+        if(H5Pset_elink_acc_flags(gapl, H5F_ACC_RDONLY) < 0) FAIL_STACK_ERROR
+
+        /* Open a group through the external link using gapl */
+        if((group = H5Gopen2(file1, "/ext_link/group", gapl)) < 0) FAIL_STACK_ERROR
+
+        /* Verify that the correct parameters have been set on file2 */
+        if((file2 = H5Iget_file_id(group)) < 0) FAIL_STACK_ERROR
+        if(H5Fget_intent(file2, &flags) < 0) FAIL_STACK_ERROR
+        if(flags != H5F_ACC_RDONLY) TEST_ERROR
+
+        /* Close file2 and group */
+        if(H5Gclose(group) < 0) FAIL_STACK_ERROR
+        if(H5Fclose(file2) < 0) FAIL_STACK_ERROR
+
+        /* Close file1 */
+        if(H5Fclose(file1) < 0) TEST_ERROR
+    } /* end if */
+
+
     /* Verify that H5Fcreate and H5Fopen reject H5F_ACC_DEFAULT */
     H5E_BEGIN_TRY {
         file1 = H5Fcreate(filename1, H5F_ACC_DEFAULT, H5P_DEFAULT, fapl);
@@ -6169,34 +6262,19 @@ external_link_endian(hbool_t new_format)
     hid_t	fid = (-1);     		/* File ID */
     hid_t	gid = (-1), gid2 = (-1);	/* Group IDs */
     hid_t       lapl_id = (-1);                 /* Prop List ID */
-    char      * srcdir = getenv("srcdir");      /* The source directory */
-    char        pathbuf[NAME_BUF_SIZE];         /* Path to the files */
-    char        namebuf[NAME_BUF_SIZE];
+    const char  *pathbuf = H5_get_srcdir();     /* Path to the files */
+    const char  *namebuf;
 
     if(new_format)
         TESTING("endianness of external links (w/new group format)")
     else
         TESTING("endianness of external links")
 
-    /*
-     * Create the name of the file to open (in case we are using the --srcdir
-     * option and the file is in a different directory from this test).
-     */
-    if (srcdir && ((HDstrlen(srcdir) + 2) < sizeof(pathbuf)) )
-    {
-        HDstrcpy(pathbuf, srcdir);
-        HDstrcat(pathbuf, "/");
-    }
-    else
-        HDstrcpy(pathbuf, "");
-
     /* Create a link access property list with the path to the srcdir */
     if((lapl_id = H5Pcreate(H5P_LINK_ACCESS)) < 0) TEST_ERROR
     if(H5Pset_elink_prefix(lapl_id, pathbuf) < 0) TEST_ERROR
 
-    if(HDstrlen(pathbuf) + HDstrlen(LE_FILENAME) >= sizeof(namebuf)) TEST_ERROR
-    HDstrcpy(namebuf, pathbuf);
-    HDstrcat(namebuf, LE_FILENAME);
+    namebuf = H5_get_srcdir_filename(LE_FILENAME); /* Corrected test file name */
 
     /* Test LE file; try to open a group through the external link */
     if((fid = H5Fopen(namebuf, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0) TEST_ERROR
@@ -6210,9 +6288,7 @@ external_link_endian(hbool_t new_format)
     if(H5Gclose(gid) < 0) TEST_ERROR
     if(H5Fclose(fid) < 0) TEST_ERROR
 
-    if(HDstrlen(pathbuf) + HDstrlen(BE_FILENAME) >= sizeof(namebuf)) TEST_ERROR
-    HDstrcpy(namebuf, pathbuf);
-    HDstrcat(namebuf, BE_FILENAME);
+    namebuf = H5_get_srcdir_filename(BE_FILENAME); /* Corrected test file name */
 
     /* Test BE file; try to open a group through the external link */
     if((fid = H5Fopen(namebuf, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0) TEST_ERROR
@@ -6257,7 +6333,7 @@ error:
 static int
 external_link_strong(hid_t fapl, hbool_t new_format)
 {
-    hid_t       my_fapl;                        /* File access property list */
+    hid_t       my_fapl = (-1);                 /* File access property list */
     hid_t       fid1 = (-1), fid2 = (-1);       /* File ID */
     hid_t       gid1 = (-1), gid2 = (-1);       /* Group IDs */
     char        objname[NAME_BUF_SIZE];         /* Object name */
@@ -6306,11 +6382,15 @@ external_link_strong(hid_t fapl, hbool_t new_format)
     if(H5Gclose(gid2) < 0) TEST_ERROR
     if(H5Fclose(fid2) < 0) TEST_ERROR
 
+    /* Close fapl */
+    if(H5Pclose(my_fapl) < 0) TEST_ERROR
+
     PASSED();
     return 0;
 
 error:
     H5E_BEGIN_TRY {
+        H5Pclose(my_fapl);
         H5Gclose(fapl);
         H5Gclose(gid2);
         H5Gclose(gid1);
@@ -8915,8 +8995,7 @@ build_visit_file(hid_t fapl)
     hid_t did = (-1);                   /* Dataset ID */
     hid_t tid = (-1);                   /* Datatype ID */
     char filename[NAME_BUF_SIZE];
-    char pathname[1024];                /* Path of external link file */
-    char *srcdir = getenv("srcdir");    /* where the src code is located */
+    const char *pathname = H5_get_srcdir_filename(LINKED_FILE); /* Corrected test file name */
 
     h5_fixname(FILENAME[9], fapl, filename, sizeof filename);
 
@@ -8952,14 +9031,6 @@ build_visit_file(hid_t fapl)
     if(H5Lcreate_hard(fid, "/", fid, "/Group1/Group2/hard_zero", H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
 
     /* Create external link to existing file */
-    pathname[0] = '\0';
-    /* Generate correct name for test file by prepending the source path */
-    if(srcdir && ((HDstrlen(srcdir) + HDstrlen(LINKED_FILE) + 1) < sizeof(pathname))) {
-        HDstrcpy(pathname, srcdir);
-        HDstrcat(pathname, "/");
-    }
-    HDstrcat(pathname, LINKED_FILE);
-
     if(H5Lcreate_external(pathname, "/group", fid, "/ext_one", H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
 
     /* Create dangling external link to non-existent file */
@@ -10723,7 +10794,7 @@ corder_delete(hid_t fapl)
     unsigned    min_dense;              /* Minimum # of links to store in group "densely" */
     hsize_t     name_count;             /* # of records in name index */
     hsize_t     corder_count;           /* # of records in creation order index */
-    hbool_t     reopen_file;            /* Whether to re-open the file before deleting group */
+    unsigned    reopen_file;            /* Whether to re-open the file before deleting group */
     h5_stat_size_t       empty_size;             /* Size of empty file */
     h5_stat_size_t       file_size;              /* Size of file after operating on it */
     char        objname[NAME_BUF_SIZE]; /* Object name */
@@ -11004,8 +11075,8 @@ link_info_by_idx(hid_t fapl)
     hid_t	file_id = (-1); 	/* File ID */
     hid_t	group_id = (-1);	/* Group ID */
     hid_t       gcpl_id = (-1); 	/* Group creation property list ID */
-    hbool_t     hard_link;              /* Create hard or soft link? */
-    hbool_t     use_index;              /* Use index on creation order values */
+    unsigned    hard_link;              /* Create hard or soft link? */
+    unsigned    use_index;              /* Use index on creation order values */
     unsigned    max_compact;            /* Maximum # of links to store in group compactly */
     unsigned    min_dense;              /* Minimum # of links to store in group "densely" */
     H5L_info_t  linfo;                  /* Link info struct */
@@ -11187,7 +11258,7 @@ link_info_by_idx_old(hid_t fapl)
 {
     hid_t	file_id = (-1); 	/* File ID */
     hid_t	group_id = (-1), group_id2 = (-1);	/* Group IDs */
-    hbool_t     hard_link;              /* Create hard or soft link? */
+    unsigned    hard_link;              /* Create hard or soft link? */
     H5L_info_t  linfo;                  /* Link info struct */
     char        objname[NAME_BUF_SIZE]; /* Object name */
     char        valname[NAME_BUF_SIZE]; /* Link value name */
@@ -11356,7 +11427,7 @@ delete_by_idx(hid_t fapl)
     hid_t       gcpl_id = (-1); 	/* Group creation property list ID */
     H5_index_t idx_type;               /* Type of index to operate on */
     H5_iter_order_t order;              /* Order within in the index */
-    hbool_t     use_index;              /* Use index on creation order values */
+    unsigned    use_index;              /* Use index on creation order values */
     unsigned    max_compact;            /* Maximum # of links to store in group compactly */
     unsigned    min_dense;              /* Minimum # of links to store in group "densely" */
     H5L_info_t  linfo;                  /* Link info struct */
@@ -12189,7 +12260,7 @@ link_iterate(hid_t fapl)
     hid_t       gcpl_id = (-1); 	/* Group creation property list ID */
     H5_index_t idx_type;               /* Type of index to operate on */
     H5_iter_order_t order;              /* Order within in the index */
-    hbool_t     use_index;              /* Use index on creation order values */
+    unsigned    use_index;              /* Use index on creation order values */
     unsigned    max_compact;            /* Maximum # of links to store in group compactly */
     unsigned    min_dense;              /* Minimum # of links to store in group "densely" */
     char        objname[NAME_BUF_SIZE]; /* Object name */
@@ -12875,7 +12946,7 @@ open_by_idx(hid_t fapl)
     hid_t       gcpl_id = (-1); 	/* Group creation property list ID */
     H5_index_t idx_type;               /* Type of index to operate on */
     H5_iter_order_t order;              /* Order within in the index */
-    hbool_t     use_index;              /* Use index on creation order values */
+    unsigned    use_index;              /* Use index on creation order values */
     unsigned    max_compact;            /* Maximum # of links to store in group compactly */
     unsigned    min_dense;              /* Minimum # of links to store in group "densely" */
     H5O_info_t  oi;                     /* Buffer for querying object's info */
@@ -12884,7 +12955,7 @@ open_by_idx(hid_t fapl)
     char        valname[NAME_BUF_SIZE]; /* Link value */
     haddr_t     *objno = NULL;          /* Addresses of the objects created */
     unsigned    u;                      /* Local index variable */
-    herr_t      ret;                    /* Generic return value */
+    hid_t       ret;                    /* Generic return value */
 
     /* Create group creation property list */
     if((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0) TEST_ERROR
@@ -13109,7 +13180,7 @@ open_by_idx_old(hid_t fapl)
     char        valname[NAME_BUF_SIZE]; /* Link value */
     haddr_t     objno[CORDER_NLINKS];   /* Addresses of the objects created */
     unsigned    u;                      /* Local index variable */
-    herr_t      ret;                    /* Generic return value */
+    hid_t       ret;                    /* Generic return value */
 
     /* Create file to mount */
     h5_fixname(FILENAME[1], fapl, filename, sizeof filename);
@@ -13311,7 +13382,7 @@ object_info(hid_t fapl)
     hid_t       space_id = (-1);        /* Dataspace ID (for attributes) */
     H5_index_t idx_type;               /* Type of index to operate on */
     H5_iter_order_t order;              /* Order within in the index */
-    hbool_t     use_index;              /* Use index on creation order values */
+    unsigned    use_index;              /* Use index on creation order values */
     unsigned    max_compact;            /* Maximum # of links to store in group compactly */
     unsigned    min_dense;              /* Minimum # of links to store in group "densely" */
     H5O_info_t  oinfo;                  /* Buffer for querying object's info */
@@ -13707,7 +13778,7 @@ group_info(hid_t fapl)
     hid_t       gcpl_id = (-1); 	/* Group creation property list ID */
     H5_index_t idx_type;               /* Type of index to operate on */
     H5_iter_order_t order;              /* Order within in the index */
-    hbool_t     use_index;              /* Use index on creation order values */
+    unsigned    use_index;              /* Use index on creation order values */
     unsigned    max_compact;            /* Maximum # of links to store in group compactly */
     unsigned    min_dense;              /* Minimum # of links to store in group "densely" */
     H5G_info_t  grp_info;               /* Buffer for querying object's info */
@@ -14518,8 +14589,8 @@ main(void)
 {
     hid_t	fapl, fapl2;    /* File access property lists */
     int	nerrors = 0;
-    hbool_t new_format;     /* Whether to use the new format or not */
-    hbool_t efc;            /* Whether to use the external file cache */
+    unsigned new_format;    /* Whether to use the new format or not */
+    unsigned efc;           /* Whether to use the external file cache */
     const char  *env_h5_drvr;      /* File Driver value from environment */
 
     env_h5_drvr = HDgetenv("HDF5_DRIVER");
@@ -14573,7 +14644,7 @@ main(void)
 
         /* This test cannot run with the EFC because the EFC cannot currently
          * reopen a cached file with a different intent */
-        nerrors += external_set_elink_acc_flags(my_fapl, new_format) < 0 ? 1 : 0;
+        nerrors += external_set_elink_acc_flags(env_h5_drvr, my_fapl, new_format) < 0 ? 1 : 0;
 
         /* Try external link tests both with and without the external file cache
          */
diff --git a/test/links_env.c b/test/links_env.c
index 6e47667..b3fec38 100644
--- a/test/links_env.c
+++ b/test/links_env.c
@@ -17,7 +17,7 @@
  * Purpose:	Tests hard, soft (symbolic) & external links.
  */
 
-#define H5G_PACKAGE
+#define H5G_FRIEND		/*suppress error about including H5Gpkg	  */
 #define H5G_TESTING
 
 #include "h5test.h"
diff --git a/test/mergemsg.h5 b/test/mergemsg.h5
index 3a9e352..55c3135 100644
Binary files a/test/mergemsg.h5 and b/test/mergemsg.h5 differ
diff --git a/test/mf.c b/test/mf.c
index b037fc9..6b5cfac 100644
--- a/test/mf.c
+++ b/test/mf.c
@@ -19,17 +19,18 @@
  *	test_mf_fs_*() 	  tests for file memory that interact with the free-space manager
  *	test_mf_aggr_*()  tests for file memory that interact with the aggregators
  *	test_mf_align_*() tests for file memory with alignment setting
+ *	test_filespace_*() tests for file space management
  */
 
 #include "h5test.h"
 
-#define H5MF_PACKAGE
+#define H5MF_FRIEND		/*suppress error about including H5MFpkg	  */
 #include "H5MFpkg.h"
 
-#define H5FS_PACKAGE
+#define H5FS_FRIEND		/*suppress error about including H5FSpkg	  */
 #include "H5FSpkg.h"
 
-#define H5F_PACKAGE
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
 #define H5F_TESTING
 #include "H5Fpkg.h"
 
@@ -39,7 +40,14 @@
 
 #define FILENAME_LEN		1024
 
+#define TEST_BLOCK_SIZE1	1
+#define TEST_BLOCK_SIZE2	2
+#define TEST_BLOCK_SIZE3	3
+#define TEST_BLOCK_SIZE4	4
 #define TEST_BLOCK_SIZE5	5
+#define TEST_BLOCK_SIZE6	6
+#define TEST_BLOCK_SIZE7	7
+#define TEST_BLOCK_SIZE8	8
 #define TEST_BLOCK_SIZE20	20
 #define TEST_BLOCK_SIZE30	30
 #define TEST_BLOCK_SIZE40	40
@@ -60,6 +68,12 @@
 #define TEST_ALIGN1024		1024
 #define TEST_ALIGN4096		4096
 
+#define TEST_THRESHOLD10	10
+#define TEST_THRESHOLD3		3
+
+#define CORE_INCREMENT  1024
+#define FAMILY_SIZE     1024
+
 const char *FILENAME[] = {
     "mf",
     NULL
@@ -105,6 +119,11 @@ static unsigned test_mf_align_alloc3(const char *env_h5_drvr, hid_t fapl, hid_t
 static unsigned test_mf_align_alloc4(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl);
 static unsigned test_mf_align_alloc5(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl);
 static unsigned test_mf_align_alloc6(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl);
+static unsigned test_mf_fs_persist(hid_t fapl_new, hid_t fcpl);
+static unsigned test_mf_fs_gone(hid_t fapl_new, hid_t fcpl);
+static unsigned test_mf_fs_split(hid_t fapl_new, hid_t fcpl);
+static unsigned test_mf_fs_multi(hid_t fapl, hid_t fcpl);
+static unsigned test_mf_fs_drivers(hid_t fapl);
 
 /*
  * Verify statistics for the free-space manager
@@ -312,9 +331,9 @@ test_mf_eoa_shrink(const char *env_h5_drvr, hid_t fapl)
     hid_t		fapl_new = -1;		/* copy of fapl */
     char		filename[FILENAME_LEN]; /* Filename to use */
     H5F_t		*f = NULL;              /* Internal file object pointer */
-    h5_stat_size_t      file_size, new_file_size; /* file size */
+    h5_stat_size_t      file_size = 0, new_file_size; /* file size */
     H5FD_mem_t 		type;
-    haddr_t		addr;
+    haddr_t		addr = 0;
     haddr_t 		ma_addr=HADDR_UNDEF, new_ma_addr=HADDR_UNDEF;
     hsize_t 		ma_size=0, new_ma_size=0;
     hbool_t             contig_addr_vfd;        /* Whether VFD used has a contigous address space */
@@ -3217,7 +3236,7 @@ test_mf_aggr_extend(const char *env_h5_drvr, hid_t fapl)
     hid_t		file = -1;              /* File ID */
     char		filename[FILENAME_LEN]; /* Filename to use */
     H5F_t		*f = NULL;              /* Internal file object pointer */
-    h5_stat_size_t      empty_size, file_size;
+    h5_stat_size_t      empty_size = 0, file_size;
     H5FD_mem_t 		type, stype;
     haddr_t		new_addr, addr, saddr;
     haddr_t 		ma_addr=HADDR_UNDEF, new_ma_addr=HADDR_UNDEF, sdata_addr=HADDR_UNDEF;
@@ -3509,7 +3528,7 @@ test_mf_aggr_absorb(const char *env_h5_drvr, hid_t fapl)
     hid_t		file = -1;              /* File ID */
     char		filename[FILENAME_LEN]; /* Filename to use */
     H5F_t		*f = NULL;              /* Internal file object pointer */
-    h5_stat_size_t      empty_size, file_size;
+    h5_stat_size_t      empty_size = 0, file_size;
     H5FD_mem_t 		type, stype;
     haddr_t		addr1, addr2, addr3, saddr1;
     haddr_t 		ma_addr=HADDR_UNDEF, new_ma_addr=HADDR_UNDEF;
@@ -3745,7 +3764,7 @@ static unsigned
 test_mf_align_eoa(const char *env_h5_drvr, hid_t fapl, hid_t new_fapl)
 {
     hid_t		file = -1;              /* File ID */
-    hid_t		fapl1;
+    hid_t		fapl1 = -1;
     char		filename[FILENAME_LEN]; /* Filename to use */
     H5F_t		*f = NULL;              /* Internal file object pointer */
     h5_stat_size_t      file_size, new_file_size;
@@ -5974,90 +5993,124 @@ error:
     return(1);
 } /* test_mf_align_alloc6() */
 
+
 /*
- * To verify that file space is allocated from the corresponding free-space manager
- * because H5FD_FLMAP_DICHOTOMY is used as the default free-list mapping.
- *
- * (1) Allocate the first block (size 30) of type H5FD_MEM_SUPER
- * (2) Allocate the second block (size 50) of type H5FD_MEM_SUPER
- *
- * (3) Allocate the first block (size 30) of type H5FD_MEM_DRAW
- *
- * (4) Free the first block (size 30) of type H5FD_MEM_SUPER
- *
- * (5) Allocate the second block (size 30) of type H5FD_MEM_DRAW
- * (6) Verify that this second block is not the freed block from (3)
- *
- * (7) Allocate the second block (size 30) of type H5FD_MEM_DRAW
- * (8) Free the first block (size 30) of type H5FD_MEM_DRAW
- *
- * (9) Allocate the third block (size 30) of type H5FD_MEM_SUPER
- * (10) Verify that this third block is not freed block from (8)
+ * Verify that the file's free-space manager persists where there are free sections in the manager
  */
 static unsigned
-test_dichotomy(const char *env_h5_drvr, hid_t fapl)
+test_mf_fs_persist(hid_t fapl_new, hid_t fcpl)
 {
-    hid_t		file = -1;              /* File ID */
-    char		filename[FILENAME_LEN]; /* Filename to use */
-    H5F_t		*f = NULL;              /* Internal file object pointer */
-    H5FD_mem_t 		type, stype;
-    haddr_t		addr1, addr3, saddr1, saddr2;
-    hbool_t             contig_addr_vfd;        /* Whether VFD used has a contigous address space */
+    hid_t	file = -1;              /* File ID */
+    char	filename[FILENAME_LEN]; /* Filename to use */
+    H5F_t	*f = NULL;              /* Internal file object pointer */
+    H5FD_mem_t 	type;			/* File allocation type */
+    H5FS_stat_t	fs_stat;             	/* Information for free-space manager */
+    haddr_t	addr1, addr2, addr3, addr4, addr5, addr6; /* File address for H5FD_MEM_SUPER */
+    haddr_t	tmp_addr;		/* Temporary variable for address */
 
-    TESTING("Allocation from raw or metadata free-space manager");
+    TESTING("file's free-space manager is persistent");
 
-    /* Skip test when using VFDs that don't use the metadata aggregator */
-    contig_addr_vfd = (hbool_t)(HDstrcmp(env_h5_drvr, "split") && HDstrcmp(env_h5_drvr, "multi"));
-    if(contig_addr_vfd) {
-        /* Set the filename to use for this test (dependent on fapl) */
-        h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl_new, filename, sizeof(filename));
 
-        /* Create the file to work on */
-        if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
-            FAIL_STACK_ERROR
+    /* Create the file to work on */
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl_new)) < 0)
+        FAIL_STACK_ERROR
 
-        /* Get a pointer to the internal file object */
-        if(NULL == (f = (H5F_t *)H5I_object(file)))
-            FAIL_STACK_ERROR
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
 
-        /* Allocate the first block of type H5FD_MEM_SUPER */
-        type = H5FD_MEM_SUPER;
-        addr1 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE30);
+    /* Allocate 6 blocks */
+    type = H5FD_MEM_SUPER;
+    if(HADDR_UNDEF == (addr1 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE1)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr2 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE2)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE3)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr4 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE4)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr5 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE5)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr6 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE6)))
+	FAIL_STACK_ERROR
 
-        /* Allocate the second block of type H5FD_MEM_SUPER */
-        H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE50);
+    /* Put block #1, #3, #5 to H5FD_MEM_SUPER free-space manager */
+    if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr1, (hsize_t)TEST_BLOCK_SIZE1) < 0)
+	FAIL_STACK_ERROR
+    if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
+	FAIL_STACK_ERROR
+    if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr5, (hsize_t)TEST_BLOCK_SIZE5) < 0)
+	FAIL_STACK_ERROR
 
-        /* Allocate the first block of type H5FD_MEM_DRAW */
-        stype = H5FD_MEM_DRAW;
-        saddr1 = H5MF_alloc(f, stype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE30);
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
 
-	/* Free the first block of type H5FD_MEM_SUPER */
-        H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr1, (hsize_t)TEST_BLOCK_SIZE30);
+    /* Re-open the file */
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_new)) < 0)
+        FAIL_STACK_ERROR
 
-        /* Allocate the second block of type H5FD_MEM_DRAW */
-        saddr2 = H5MF_alloc(f, stype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE30);
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
 
-	/* Verify that saddr1 is not addr1 */
-	if(saddr2 == addr1) TEST_ERROR
+    /* Verify that H5FD_MEM_SUPER free-space manager is there */
+    if(!H5F_addr_defined(f->shared->fs_addr[type]))
+        TEST_ERROR
 
-	/* Free the first block of type H5FD_MEM_DRAW */
-        H5MF_xfree(f, stype, H5P_DATASET_XFER_DEFAULT, saddr1, (hsize_t)TEST_BLOCK_SIZE30);
+    /* Start up H5FD_MEM_SUPER free-space manager */
+    if(H5MF_alloc_open(f, H5P_DATASET_XFER_DEFAULT, type) < 0)
+        FAIL_STACK_ERROR
 
-        /* Allocate the third block of type H5FD_MEM_SUPER */
-        addr3 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE30);
+    /* Get info for free-space manager */
+    if(H5FS_stat_info(f, f->shared->fs_man[type], &fs_stat) < 0)
+        FAIL_STACK_ERROR
 
-	/* Verify that addr3 is not saddr1 */
-	if(addr3 == saddr1) TEST_ERROR
+    /* Verify free-space info */
+    if(fs_stat.tot_space < (TEST_BLOCK_SIZE1+TEST_BLOCK_SIZE3+TEST_BLOCK_SIZE5))
+	TEST_ERROR
 
-        if(H5Fclose(file) < 0)
-            FAIL_STACK_ERROR
+    if(fs_stat.serial_sect_count < 3)
+	TEST_ERROR
 
-        PASSED()
-    } /* end if */
-    else {
-	SKIPPED();
-	puts("    Current VFD doesn't support metadata aggregator");
-    } /* end else */
+    /* Retrieve block #3 from H5FD_MEM_SUPER free-space manager */
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE3)))
+	FAIL_STACK_ERROR
+    if(tmp_addr != addr3)
+	TEST_ERROR
+
+    /* Retrieve block #1 from H5FD_MEM_SUPER free-space manager */
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE1)))
+	FAIL_STACK_ERROR
+    if(tmp_addr != addr1)
+	TEST_ERROR
+
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    /* Re-open the file */
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_new)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Verify that H5FD_MEM_SUPER free-space manager is there */
+    if(!H5F_addr_defined(f->shared->fs_addr[type]))
+        TEST_ERROR
+
+    /* Retrieve block #5 from H5FD_MEM_SUPER free-space manager */
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE5)))
+	FAIL_STACK_ERROR
+    if(tmp_addr != addr5)
+        TEST_ERROR
+
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED()
 
     return(0);
 
@@ -6066,108 +6119,1438 @@ error:
 	H5Fclose(file);
     } H5E_END_TRY;
     return(1);
-} /* test_dichotomy() */
+} /* test_mf_fs_persist() */
 
-int
-main(void)
+/*
+ * Verify that the free-space manager goes away
+ */
+static unsigned
+test_mf_fs_gone(hid_t fapl_new, hid_t fcpl)
 {
-    hid_t       fapl = -1;	   /* File access property list for data files */
-    hid_t       new_fapl = -1;	   /* File access property list for alignment & aggr setting */
-    unsigned    nerrors = 0;       /* Cumulative error count */
-    test_type_t	curr_test;	   /* Current test being worked on */
-    const char  *env_h5_drvr;      /* File Driver value from environment */
+    hid_t	file = -1;              /* File ID */
+    char	filename[FILENAME_LEN]; /* Filename to use */
+    H5F_t	*f = NULL;              /* Internal file object pointer */
+    H5FD_mem_t 	type;			/* File allocation type */
+    H5FS_stat_t fs_stat;             	/* Information for free-space manager */
+    haddr_t	addr1, addr2, addr3, addr4; 	/* File address for H5FD_MEM_SUPER */
 
-    /* Get the VFD to use */
-    env_h5_drvr = HDgetenv("HDF5_DRIVER");
-    if(env_h5_drvr == NULL)
-        env_h5_drvr = "nomatch";
+    TESTING("file's free-space manager is going away");
 
-    fapl = h5_fileaccess();
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl_new, filename, sizeof(filename));
 
-    /* Make a copy of the FAPL before adjusting the alignment */
-    if((new_fapl = H5Pcopy(fapl)) < 0) TEST_ERROR
+    /* Create the file to work on */
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl_new)) < 0)
+        FAIL_STACK_ERROR
 
-    /* alignment is not set for the following tests */
-    if(H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)1) < 0)
-	TEST_ERROR
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
 
-    /* meta/small data is set to 2048 for the following tests */
-    if(H5Pset_meta_block_size(fapl, (hsize_t)TEST_BLOCK_SIZE2048) < 0)
-	TEST_ERROR
-    if(H5Pset_small_data_block_size(fapl, (hsize_t)TEST_BLOCK_SIZE2048) < 0)
-	TEST_ERROR
+    /* Allocate 4 blocks */
+    type = H5FD_MEM_SUPER;
+    if(HADDR_UNDEF == (addr1 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE1)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr2 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE2)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE3)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr4 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE4)))
+	FAIL_STACK_ERROR
 
-    /* interaction with file allocation */
-    nerrors += test_mf_eoa(env_h5_drvr, fapl);
-    nerrors += test_mf_eoa_shrink(env_h5_drvr, fapl);
-    nerrors += test_mf_eoa_extend(env_h5_drvr, fapl);
+    /* Put block #1, #3 to H5FD_MEM_SUPER free-space manager */
+    if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr1, (hsize_t)TEST_BLOCK_SIZE1) < 0)
+	FAIL_STACK_ERROR
+    if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
+	FAIL_STACK_ERROR
 
-    /* interaction with temporary file space allocation */
-    nerrors += test_mf_tmp(env_h5_drvr, fapl);
+    /* Retrieve block #1, #3 from H5FD_MEM_SUPER free-space manager */
+    if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE3)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr1 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE1)))
+	FAIL_STACK_ERROR
 
-    /* interaction with free-space manager */
-    nerrors += test_mf_fs_start(fapl);
-    nerrors += test_mf_fs_alloc_free(fapl);
-    nerrors += test_mf_fs_extend(fapl);
-    nerrors += test_mf_fs_absorb(env_h5_drvr, fapl);
-    nerrors += test_dichotomy(env_h5_drvr, new_fapl);
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
 
-    /* interaction with meta/sdata aggregator */
-    nerrors += test_mf_aggr_alloc1(env_h5_drvr, fapl);
-    nerrors += test_mf_aggr_alloc2(env_h5_drvr, fapl);
-    nerrors += test_mf_aggr_alloc3(env_h5_drvr, fapl);
-    nerrors += test_mf_aggr_alloc4(env_h5_drvr, fapl);
-    nerrors += test_mf_aggr_alloc5(env_h5_drvr, fapl);
-    nerrors += test_mf_aggr_alloc6(env_h5_drvr, fapl);
-    nerrors += test_mf_aggr_alloc7(env_h5_drvr, fapl);
-    nerrors += test_mf_aggr_extend(env_h5_drvr, fapl);
-    nerrors += test_mf_aggr_absorb(env_h5_drvr, fapl);
+    /* Re-open the file */
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_new)) < 0)
+        FAIL_STACK_ERROR
 
-    /* Tests for alignment */
-    for(curr_test = TEST_NORMAL; curr_test < TEST_NTESTS; H5_INC_ENUM(test_type_t, curr_test)) {
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
 
-	switch(curr_test) {
-            case TEST_NORMAL: /* set alignment = 1024 */
-		if(H5Pset_alignment(new_fapl, (hsize_t)0, (hsize_t)TEST_ALIGN1024) < 0)
-		    TEST_ERROR
-                break;
+    /* Verify that the H5FD_MEM_SUPER free-space manager is not there */
+    if(H5F_addr_defined(f->shared->fs_addr[type]))
+        TEST_ERROR
 
-            case TEST_AGGR_SMALL: /* set alignment = 4096 */
-		if(H5Pset_alignment(new_fapl, (hsize_t)0, (hsize_t)TEST_ALIGN4096) < 0)
-		    TEST_ERROR
-                break;
+    /* Put block #3 to H5FD_MEM_SUPER free-space manager */
+    if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
+        FAIL_STACK_ERROR
 
-            case TEST_NTESTS:
-            default:
-                TEST_ERROR;
-		break;
-	} /* end switch */
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
 
-	nerrors += test_mf_align_eoa(env_h5_drvr, fapl, new_fapl);
-	nerrors += test_mf_align_fs(env_h5_drvr, fapl, new_fapl);
-	nerrors += test_mf_align_alloc1(env_h5_drvr, fapl, new_fapl);
-	nerrors += test_mf_align_alloc2(env_h5_drvr, fapl, new_fapl);
-	nerrors += test_mf_align_alloc3(env_h5_drvr, fapl, new_fapl);
-	nerrors += test_mf_align_alloc4(env_h5_drvr, fapl, new_fapl);
-	nerrors += test_mf_align_alloc5(env_h5_drvr, fapl, new_fapl);
-	nerrors += test_mf_align_alloc6(env_h5_drvr, fapl, new_fapl);
-    } /* end if */
+    /* Re-open the file */
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_new)) < 0)
+        FAIL_STACK_ERROR
 
-    if(H5Pclose(new_fapl) < 0)
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
-    h5_cleanup(FILENAME, fapl);
 
-    if(nerrors)
-        goto error;
-    puts("All free-space manager tests for file memory passed.");
+    /* Verify that H5FD_MEM_SUPER free-space manager is there */
+    if(!H5F_addr_defined(f->shared->fs_addr[type]))
+        TEST_ERROR
 
-    return(0);
+    /* Start up H5FD_MEM_SUPER free-space manager */
+    if(H5MF_alloc_open(f, H5P_DATASET_XFER_DEFAULT, type) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get info for H5FD_MEM_SUPER free-space manager */
+    if(H5FS_stat_info(f, f->shared->fs_man[type], &fs_stat) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify free-space info */
+    if(!H5F_addr_defined(fs_stat.addr) || !H5F_addr_defined(fs_stat.sect_addr))
+        TEST_ERROR
+    if(fs_stat.tot_space < TEST_BLOCK_SIZE3)
+	TEST_ERROR
+
+    /* Put block #4 to H5FD_MEM_SUPER free-space manager */
+    if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr4, (hsize_t)TEST_BLOCK_SIZE4) < 0)
+        FAIL_STACK_ERROR
+
+    /* The H5FD_MEM_SUPER free-space manager will go away at H5MF_close() */
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    /* Re-open the file */
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_new)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Verify that the H5FD_MEM_SUPER free-space manager is not there */
+    if(H5F_addr_defined(f->shared->fs_addr[type]))
+        TEST_ERROR
+
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED()
+
+    return(0);
+
+error:
+    H5E_BEGIN_TRY {
+	H5Fclose(file);
+    } H5E_END_TRY;
+    return(1);
+} /* test_mf_fs_gone() */
+
+
+/*
+ * Verify that the file's free-space manager(s) are persistent for a split-file
+ */
+static unsigned
+test_mf_fs_split(hid_t fapl_new, hid_t fcpl)
+{
+    hid_t	file = -1;              	/* File ID */
+    char	filename[FILENAME_LEN]; 	/* Filename to use */
+    H5F_t	*f = NULL;              	/* Internal file object pointer */
+    H5FD_mem_t 	type, stype, btype;		/* File allocation type */
+    H5FS_stat_t fs_stat;             		/* Information for free-space manager */
+    haddr_t	addr1, addr2, addr3, addr4;	/* File address for H5FD_MEM_SUPER */
+    haddr_t	saddr1, saddr2, saddr3, saddr4;	/* File address for H5FD_MEM_DRAW */
+    haddr_t	baddr5, baddr6, baddr7, baddr8;	/* File address for H5FD_MEM_BTREE */
+    haddr_t	tmp_addr;			/* temporary variable for address */
+
+    TESTING("file's free-space managers are persistent for split-file");
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl_new, filename, sizeof(filename));
+
+    /* Create the file to work on */
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl_new)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Allocate 4 blocks of type H5FD_MEM_SUPER */
+    type = H5FD_MEM_SUPER;
+    if(HADDR_UNDEF == (addr1 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE1)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr2 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE2)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE3)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr4 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE4)))
+	FAIL_STACK_ERROR
+
+    /* Put block #1, #3 into H5FD_MEM_SUPER free-space manager */
+    if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr1, (hsize_t)TEST_BLOCK_SIZE1) < 0)
+	FAIL_STACK_ERROR
+    if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
+	FAIL_STACK_ERROR
+
+    /* Allocate 4 blocks of type H5FD_MEM_DRAW */
+    stype = H5FD_MEM_DRAW;
+    if(HADDR_UNDEF == (saddr1 = H5MF_alloc(f, stype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE1)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (saddr2 = H5MF_alloc(f, stype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE2)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (saddr3 = H5MF_alloc(f, stype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE3)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (saddr4 = H5MF_alloc(f, stype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE4)))
+	FAIL_STACK_ERROR
+
+    /* Put block #1, #3 into H5FD_MEM_DRAW free-space manager */
+    if(H5MF_xfree(f, stype, H5P_DATASET_XFER_DEFAULT, saddr1, (hsize_t)TEST_BLOCK_SIZE1) < 0)
+	FAIL_STACK_ERROR
+    if(H5MF_xfree(f, stype, H5P_DATASET_XFER_DEFAULT, saddr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
+	FAIL_STACK_ERROR
+
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    /* Re-open the file */
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_new)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Verify that the H5FD_MEM_SUPER free-space manager is there */
+    if(!H5F_addr_defined(f->shared->fs_addr[type]))
+        TEST_ERROR
+
+    /* Start up H5FD_MEM_SUPER free-space manager */
+    if(H5MF_alloc_open(f, H5P_DATASET_XFER_DEFAULT, type) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get free-space info */
+    if(H5FS_stat_info(f, f->shared->fs_man[type], &fs_stat) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify free-space info */
+    if(fs_stat.tot_space < (TEST_BLOCK_SIZE1+TEST_BLOCK_SIZE3))
+	TEST_ERROR
+    if(fs_stat.serial_sect_count < 2)
+	TEST_ERROR
+
+    /* Retrieve block #1 from H5FD_MEM_SUPER free-space manager; block #2 still in free-space */
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE1)))
+	FAIL_STACK_ERROR
+    if(tmp_addr != addr1)
+	TEST_ERROR
+
+    /* Verify that the free-space manager for H5FD_MEM_DRAW is there */
+    if(!H5F_addr_defined(f->shared->fs_addr[stype]))
+        TEST_ERROR
+
+    /* Start up H5FD_MEM_DRAW free-space manager */
+    if(H5MF_alloc_open(f, H5P_DATASET_XFER_DEFAULT, stype) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get free-space info */
+    if(H5FS_stat_info(f, f->shared->fs_man[stype], &fs_stat) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify free-space info */
+    if(fs_stat.tot_space < (TEST_BLOCK_SIZE1+TEST_BLOCK_SIZE3))
+	TEST_ERROR
+    if(fs_stat.serial_sect_count < 2)
+	TEST_ERROR
+
+    /* Retrieve blocks #1 from H5FD_MEM_DRAW free-space manager */
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, stype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE1)))
+	FAIL_STACK_ERROR
+    if(tmp_addr != saddr1)
+	TEST_ERROR
+
+    /* Retrieve blocks #3 from H5FD_MEM_DRAW free-space manager */
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, stype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE3)))
+	FAIL_STACK_ERROR
+    if(tmp_addr != saddr3)
+	TEST_ERROR
+    /* H5FD_MEM_DRAW free-space manager is going away at closing */
+    /* works for this one because the freeing of sect_addr is to H5FD_MEM_SUPER fs, not against itself */
+
+    /* Allocate 4 blocks of type H5FD_MEM_BTREE */
+    btype = H5FD_MEM_BTREE;
+    if(HADDR_UNDEF == (baddr5 = H5MF_alloc(f, btype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE5)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (baddr6 = H5MF_alloc(f, btype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE6)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (baddr7 = H5MF_alloc(f, btype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE7)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (baddr8 = H5MF_alloc(f, btype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE8)))
+	FAIL_STACK_ERROR
+
+    /* Put block #5 & #7 into H5FD_MEM_BTREE free-space manager */
+    if(H5MF_xfree(f, btype, H5P_DATASET_XFER_DEFAULT, baddr5, (hsize_t)TEST_BLOCK_SIZE5) < 0)
+	FAIL_STACK_ERROR
+    if(H5MF_xfree(f, btype, H5P_DATASET_XFER_DEFAULT, baddr7, (hsize_t)TEST_BLOCK_SIZE7) < 0)
+	FAIL_STACK_ERROR
+
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    /* Re-open the file */
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_new)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Verify that the free-space manager for H5FD_MEM_DRAW is not there */
+    if(H5F_addr_defined(f->shared->fs_addr[stype]))
+        TEST_ERROR
+
+    /* Verify that the free-space manager for H5FD_MEM_SUPER is there */
+    if(!H5F_addr_defined(f->shared->fs_addr[type]))
+        TEST_ERROR
+
+    /* Start up H5FD_MEM_SUPER free-space manager */
+    if(H5MF_alloc_open(f, H5P_DATASET_XFER_DEFAULT, type) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get free-space info */
+    if(H5FS_stat_info(f, f->shared->fs_man[type], &fs_stat) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify free-space info */
+    if(fs_stat.tot_space < (TEST_BLOCK_SIZE3+TEST_BLOCK_SIZE5+TEST_BLOCK_SIZE7))
+	TEST_ERROR
+
+    /* Retrieve block #3 from H5FD_MEM_SUPER free-space manager */
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE3)))
+	FAIL_STACK_ERROR
+    if(tmp_addr != addr3)
+	TEST_ERROR
+
+    /* Retrieve block #7 from H5FD_MEM_BTREE free-space manager */
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, btype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE7)))
+	FAIL_STACK_ERROR
+    if(tmp_addr != baddr7)
+	TEST_ERROR
+
+    /* There should still be block #5 of H5FD_MEM_BTREE in H5FD_MEM_BTREE free-space manager */
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    /* Re-open the file */
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_new)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Verify that the H5FD_MEM_SUPER free-space manager is there */
+    if(!H5F_addr_defined(f->shared->fs_addr[type]))
+	TEST_ERROR
+
+    /* Start up H5FD_MEM_SUPER free-space manager */
+    if(H5MF_alloc_open(f, H5P_DATASET_XFER_DEFAULT, type) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get free-space info */
+    if(H5FS_stat_info(f, f->shared->fs_man[type], &fs_stat) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify free-space info */
+    if(fs_stat.tot_space < TEST_BLOCK_SIZE5)
+	TEST_ERROR
+
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED()
+
+    return(0);
+
+error:
+    H5E_BEGIN_TRY {
+	H5Fclose(file);
+    } H5E_END_TRY;
+    return(1);
+} /* test_mf_fs_split() */
+
+/*
+ * Verify that the file's free-space manager(s) are persistent for a multi-file
+ */
+static unsigned
+test_mf_fs_multi(hid_t fapl_new, hid_t fcpl)
+{
+    hid_t	file = -1;              	/* File ID */
+    char	filename[FILENAME_LEN]; 	/* Filename to use */
+    H5F_t	*f = NULL;              	/* Internal file object pointer */
+    H5FD_mem_t 	type, stype, btype, gtype;	/* File allocation type */
+    H5FS_stat_t fs_stat;             		/* Information for free-space manager */
+    haddr_t	addr1, addr2, addr3, addr4;	/* File allocation type */
+    haddr_t	saddr1, saddr2, saddr3, saddr4;	/* File address for H5FD_MEM_SUPER */
+    haddr_t	baddr1, baddr2, baddr3, baddr4;	/* File address for H5FD_MEM_DRAW */
+    haddr_t	gaddr1, gaddr2;			/* File address for H5FD_MEM_GHEAP */
+    haddr_t	tmp_addr;			/* Temporary variable for address */
+    H5FS_section_info_t *node;			/* Free space section node */
+    htri_t    	node_found = FALSE;		/* Indicate section is in free-space */
+
+    TESTING("file's free-space managers are persistent for multi-file");
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl_new, filename, sizeof(filename));
+
+    /* Create the file to work on */
+    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl_new)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Allocate 4 blocks of type H5FD_MEM_SUPER */
+    type = H5FD_MEM_SUPER;
+    if(HADDR_UNDEF == (addr1 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE1)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr2 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE2)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE3)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (addr4 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE4)))
+	FAIL_STACK_ERROR
+
+    /* Put block #1, #3 into H5FD_MEM_SUPER free-space manager */
+    if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr1, (hsize_t)TEST_BLOCK_SIZE1) < 0)
+	FAIL_STACK_ERROR
+    if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
+	FAIL_STACK_ERROR
+
+    /* Allocate 4 blocks of type H5FD_MEM_DRAW */
+    stype = H5FD_MEM_DRAW;
+    if(HADDR_UNDEF == (saddr1 = H5MF_alloc(f, stype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE1)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (saddr2 = H5MF_alloc(f, stype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE2)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (saddr3 = H5MF_alloc(f, stype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE3)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (saddr4 = H5MF_alloc(f, stype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE4)))
+	FAIL_STACK_ERROR
+
+    /* Put block #1, #3 into H5FD_MEM_DRAW free-space manager */
+    if(H5MF_xfree(f, stype, H5P_DATASET_XFER_DEFAULT, saddr1, (hsize_t)TEST_BLOCK_SIZE1) < 0)
+	FAIL_STACK_ERROR
+    if(H5MF_xfree(f, stype, H5P_DATASET_XFER_DEFAULT, saddr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
+	FAIL_STACK_ERROR
+
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    /* Re-open the file */
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_new)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Verify that the H5FD_MEM_SUPER free-space manager is there */
+    if(!H5F_addr_defined(f->shared->fs_addr[type]))
+        TEST_ERROR
+
+    /* Start up H5FD_MEM_SUPER free-space manager */
+    if(H5MF_alloc_open(f, H5P_DATASET_XFER_DEFAULT, type) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get free-space info */
+    if(H5FS_stat_info(f, f->shared->fs_man[type], &fs_stat) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify free-space info */
+    if(fs_stat.tot_space < (TEST_BLOCK_SIZE1+TEST_BLOCK_SIZE3))
+	TEST_ERROR
+    if(fs_stat.serial_sect_count < 2)
+	TEST_ERROR
+
+    /* Retrieve block #1 from H5FD_MEM_SUPER free-space manager; block #2 still in free-space */
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE1)))
+	FAIL_STACK_ERROR
+    if(tmp_addr != addr1)
+	TEST_ERROR
+
+    /* Verify that the free-space manager for H5FD_MEM_DRAW is there */
+    if(!H5F_addr_defined(f->shared->fs_addr[stype]))
+        TEST_ERROR
+
+    /* Start up H5FD_MEM_DRAW free-space manager */
+    if(H5MF_alloc_open(f, H5P_DATASET_XFER_DEFAULT, stype) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get free-space info */
+    if(H5FS_stat_info(f, f->shared->fs_man[stype], &fs_stat) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify free-space info */
+    if(fs_stat.tot_space < (TEST_BLOCK_SIZE1+TEST_BLOCK_SIZE3))
+	TEST_ERROR
+    if(fs_stat.serial_sect_count < 2)
+	TEST_ERROR
+
+    /* Retrieve blocks #1 from H5FD_MEM_DRAW free-space manager */
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, stype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE1)))
+	FAIL_STACK_ERROR
+    if(tmp_addr != saddr1)
+	TEST_ERROR
+
+    /* Retrieve blocks #3 from H5FD_MEM_DRAW free-space manager */
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, stype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE3)))
+	FAIL_STACK_ERROR
+    if(tmp_addr != saddr3)
+	TEST_ERROR
+
+    /* Allocate 4 blocks of type H5FD_MEM_BTREE */
+    btype = H5FD_MEM_BTREE;
+    if(HADDR_UNDEF == (baddr1 = H5MF_alloc(f, btype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE1)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (baddr2 = H5MF_alloc(f, btype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE2)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (baddr3 = H5MF_alloc(f, btype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE3)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (baddr4 = H5MF_alloc(f, btype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE4)))
+	FAIL_STACK_ERROR
+
+    /* Put block #1 & #3 into H5FD_MEM_BTREE free-space manager */
+    if(H5MF_xfree(f, btype, H5P_DATASET_XFER_DEFAULT, baddr1, (hsize_t)TEST_BLOCK_SIZE1) < 0)
+	FAIL_STACK_ERROR
+    if(H5MF_xfree(f, btype, H5P_DATASET_XFER_DEFAULT, baddr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
+	FAIL_STACK_ERROR
+
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    /* Re-open the file */
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_new)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* Verify that the free-space manager for H5FD_MEM_SUPER is there */
+    if(!H5F_addr_defined(f->shared->fs_addr[type]))
+        TEST_ERROR
+
+    /* Start up H5FD_MEM_SUPER free-space manager */
+    if(H5MF_alloc_open(f, H5P_DATASET_XFER_DEFAULT, type) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get free-space info */
+    if(H5FS_stat_info(f, f->shared->fs_man[type], &fs_stat) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify free-space info */
+    if(fs_stat.tot_space < TEST_BLOCK_SIZE3)
+	TEST_ERROR
+
+    /* Retrieve block #3 from H5FD_MEM_SUPER free-space manager */
+    if(HADDR_UNDEF == (tmp_addr = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE3)))
+	FAIL_STACK_ERROR
+    if(tmp_addr != addr3)
+	TEST_ERROR
+
+    /* Verify that the free-space manager for H5FD_MEM_DRAW is not there */
+    if(H5F_addr_defined(f->shared->fs_addr[stype]))
+        TEST_ERROR
+
+    /* Verify that the free-space manager for H5FD_MEM_BTREE is there */
+    if(!H5F_addr_defined(f->shared->fs_addr[btype]))
+        TEST_ERROR
+
+    /* Start up H5FD_MEM_BTREE free-space manager */
+    if(H5MF_alloc_open(f, H5P_DATASET_XFER_DEFAULT, btype) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get free-space info */
+    if(H5FS_stat_info(f, f->shared->fs_man[btype], &fs_stat) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify free-space info */
+    if(fs_stat.tot_space < (TEST_BLOCK_SIZE1+TEST_BLOCK_SIZE3))
+	TEST_ERROR
+    if(fs_stat.serial_sect_count < 2)
+	TEST_ERROR
+
+    /* Allocate 2 blocks of type H5FD_MEM_GHEAP */
+    gtype = H5FD_MEM_GHEAP;
+    if(HADDR_UNDEF == (gaddr2 = H5MF_alloc(f, gtype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE2)))
+	FAIL_STACK_ERROR
+    if(HADDR_UNDEF == (gaddr1 = H5MF_alloc(f, gtype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE1)))
+	FAIL_STACK_ERROR
+
+    /* Put block #2 into H5FD_MEM_GHEAP free-space manager */
+    if(H5MF_xfree(f, gtype, H5P_DATASET_XFER_DEFAULT, gaddr2, (hsize_t)TEST_BLOCK_SIZE2) < 0)
+	FAIL_STACK_ERROR
+
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    /* Re-open the file */
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_new)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(file)))
+        FAIL_STACK_ERROR
+
+    /* If H5FD_MEM_SUPER is there, should not find block #1 & #3 */
+    if(H5F_addr_defined(f->shared->fs_addr[type])) {
+	/* Start up H5FD_MEM_SUPER free-space manager */
+	if(H5MF_alloc_open(f, H5P_DATASET_XFER_DEFAULT, type) < 0)
+	    FAIL_STACK_ERROR
+
+	if((node_found = H5FS_sect_find(f, H5P_DATASET_XFER_DEFAULT, f->shared->fs_man[type],
+		(hsize_t)TEST_BLOCK_SIZE1, (H5FS_section_info_t **)&node)) < 0)
+	    FAIL_STACK_ERROR
+	if(node_found) TEST_ERROR
+
+	if((node_found = H5FS_sect_find(f, H5P_DATASET_XFER_DEFAULT, f->shared->fs_man[type],
+		(hsize_t)TEST_BLOCK_SIZE3, (H5FS_section_info_t **)&node)) < 0)
+	    FAIL_STACK_ERROR
+	if(node_found) TEST_ERROR
+    }
+
+    /* Verify that the H5FD_MEM_GHEAP free-space manager is there */
+    if(!H5F_addr_defined(f->shared->fs_addr[gtype]))
+	TEST_ERROR
+
+    /* Start up H5FD_MEM_GHEAP free-space manager */
+    if(H5MF_alloc_open(f, H5P_DATASET_XFER_DEFAULT, gtype) < 0)
+	FAIL_STACK_ERROR
+
+    /* Get free-space info */
+    if(H5FS_stat_info(f, f->shared->fs_man[gtype], &fs_stat) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify free-space info */
+    if(fs_stat.tot_space < TEST_BLOCK_SIZE2)
+	TEST_ERROR
+
+    if(H5Fclose(file) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED()
+
+    return(0);
+
+error:
+    H5E_BEGIN_TRY {
+	H5Fclose(file);
+    } H5E_END_TRY;
+    return(1);
+} /* test_mf_fs_multi() */
+
+#define MULTI_SETUP(memb_map, memb_fapl, memb_name, memb_addr, sv)	{	\
+    H5FD_mem_t mt;								\
+    HDmemset(memb_map, 0,  sizeof memb_map);					\
+    HDmemset(memb_fapl, 0, sizeof memb_fapl);					\
+    HDmemset(memb_name, 0, sizeof memb_name);					\
+    HDmemset(memb_addr, 0, sizeof memb_addr);					\
+    HDmemset(sv, 0, sizeof sv);							\
+    for(mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; H5_INC_ENUM(H5FD_mem_t, mt)) { \
+	memb_map[mt] = H5FD_MEM_SUPER;						\
+	memb_fapl[mt] = H5P_DEFAULT;						\
+    }										\
+    memb_map[H5FD_MEM_BTREE] = H5FD_MEM_BTREE;					\
+    memb_map[H5FD_MEM_DRAW] = H5FD_MEM_DRAW;					\
+    memb_map[H5FD_MEM_GHEAP] = H5FD_MEM_GHEAP;					\
+    memb_map[H5FD_MEM_LHEAP] = H5FD_MEM_LHEAP;					\
+    sprintf(sv[H5FD_MEM_SUPER], "%%s-%c.h5", 's');				\
+    memb_name[H5FD_MEM_SUPER] = sv[H5FD_MEM_SUPER];				\
+    memb_addr[H5FD_MEM_SUPER] = 0;						\
+    sprintf(sv[H5FD_MEM_BTREE],  "%%s-%c.h5", 'b');				\
+    memb_name[H5FD_MEM_BTREE] = sv[H5FD_MEM_BTREE];				\
+    memb_addr[H5FD_MEM_BTREE] = HADDR_MAX/6;					\
+    sprintf(sv[H5FD_MEM_DRAW], "%%s-%c.h5", 'r');				\
+    memb_name[H5FD_MEM_DRAW] = sv[H5FD_MEM_DRAW];				\
+    memb_addr[H5FD_MEM_DRAW] = HADDR_MAX/3;					\
+    sprintf(sv[H5FD_MEM_GHEAP], "%%s-%c.h5", 'g');				\
+    memb_name[H5FD_MEM_GHEAP] = sv[H5FD_MEM_GHEAP];				\
+    memb_addr[H5FD_MEM_GHEAP] = HADDR_MAX/2;					\
+    sprintf(sv[H5FD_MEM_LHEAP], "%%s-%c.h5", 'l');				\
+    memb_name[H5FD_MEM_LHEAP] = sv[H5FD_MEM_LHEAP];				\
+    memb_addr[H5FD_MEM_LHEAP] = HADDR_MAX*2/3;					\
+    sprintf(sv[H5FD_MEM_OHDR], "%%s-%c.h5", 'o');				\
+    memb_name[H5FD_MEM_OHDR] = sv[H5FD_MEM_OHDR];				\
+    memb_addr[H5FD_MEM_OHDR] = HADDR_MAX*5/6;					\
+}
+
+/*
+ * Tests to verify that file's free-space managers are persistent or going away
+ * for different drivers.
+ */
+static unsigned
+test_mf_fs_drivers(hid_t fapl)
+{
+    hid_t	fcpl = -1;	/* file creation property list */
+    hid_t	fapl_new = -1;	/* copy of file access property list */
+    hid_t	fapl2 = -1;	/* copy of file access property list */
+    unsigned	new_format;	/* To use new library format or not */
+    unsigned 	ret = 0;	/* return value */
+
+    H5FD_mem_t	memb_map[H5FD_MEM_NTYPES];	/* Memory usage map */
+    hid_t	memb_fapl[H5FD_MEM_NTYPES];	/* Member access properties */
+    char        sv[H5FD_MEM_NTYPES][64];	/* Name generators */
+    const	char *memb_name[H5FD_MEM_NTYPES];	/* Name generators */
+    haddr_t	memb_addr[H5FD_MEM_NTYPES];	/* Member starting address */
+
+    /* Create a non-standard file-creation template */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_file_space(fcpl, H5F_FILE_SPACE_ALL_PERSIST, (hsize_t)0) < 0)
+	TEST_ERROR
+
+    /* Copy the file access property list */
+    if((fapl2 = H5Pcopy(fapl)) < 0) TEST_ERROR
+
+    /* Set the "use the latest version of the format" bounds for creating objects in the file */
+    if(H5Pset_libver_bounds(fapl2, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+	TEST_ERROR
+
+    /* Test with old and new format */
+    for(new_format = FALSE; new_format <= TRUE; new_format++) {
+
+	if(new_format)
+	    HDputs("Testing the following tests for free-space managers with new library format...");
+	else
+	    HDputs("Testing the following tests for free-space managers with old library format...");
+
+	/* SEC2 */
+	HDputs("Testing free-space manager(s) with sec2 driver");
+
+	if((fapl_new = H5Pcopy(new_format ? fapl2 : fapl)) < 0) TEST_ERROR
+
+	if(H5Pset_fapl_sec2(fapl_new) < 0)
+	    FAIL_STACK_ERROR
+
+	ret += test_mf_fs_gone(fapl_new, fcpl);
+	ret += test_mf_fs_persist(fapl_new, fcpl);
+
+	h5_clean_files(FILENAME, fapl_new);
+
+
+	/* STDIO */
+	HDputs("Testing free-space managers with stdio driver");
+
+	if((fapl_new = H5Pcopy(new_format?fapl2:fapl)) < 0)
+	    FAIL_STACK_ERROR
+	if(H5Pset_fapl_stdio(fapl_new) < 0)
+	    FAIL_STACK_ERROR
+
+	ret += test_mf_fs_gone(fapl_new, fcpl);
+	ret += test_mf_fs_persist(fapl_new, fcpl);
+
+	h5_clean_files(FILENAME, fapl_new);
+
+	/* CORE */
+	HDputs("Testing free-space managers with core driver");
+
+	/* create fapl to be a "core" file */
+	if((fapl_new = H5Pcopy(new_format?fapl2:fapl)) < 0)
+	    FAIL_STACK_ERROR
+	if(H5Pset_fapl_core(fapl_new, (size_t)CORE_INCREMENT, TRUE) < 0)
+	    FAIL_STACK_ERROR
+
+	ret += test_mf_fs_gone(fapl_new, fcpl);
+	ret += test_mf_fs_persist(fapl_new, fcpl);
+
+	h5_clean_files(FILENAME, fapl_new);
+
+	/* FAMILY */
+	HDputs("Testing free-space managers with family driver");
+
+	if((fapl_new = H5Pcopy(new_format?fapl2:fapl)) < 0)
+	    FAIL_STACK_ERROR
+	if(H5Pset_fapl_family(fapl_new, (hsize_t)FAMILY_SIZE, H5P_DEFAULT) < 0)
+	    FAIL_STACK_ERROR
+
+	ret += test_mf_fs_persist(fapl_new, fcpl);
+
+	h5_clean_files(FILENAME, fapl_new);
+
+	/* SPLIT */
+	HDputs("Testing free-space managers with split driver");
+
+	if((fapl_new = H5Pcopy(new_format?fapl2:fapl)) < 0)
+	    FAIL_STACK_ERROR
+	if(H5Pset_fapl_split(fapl_new, "-m.h5", H5P_DEFAULT, "-r.h5", H5P_DEFAULT)<0)
+	    FAIL_STACK_ERROR
+
+	ret += test_mf_fs_persist(fapl_new, fcpl);
+	ret += test_mf_fs_split(fapl_new, fcpl);
+
+	h5_clean_files(FILENAME, fapl_new);
+
+	/* MULTI */
+	HDputs("Testing free-space managers with multi driver");
+
+	MULTI_SETUP(memb_map, memb_fapl, memb_name, memb_addr, sv)
+
+	if((fapl_new = H5Pcopy(new_format?fapl2:fapl)) < 0)
+	    FAIL_STACK_ERROR
+	if(H5Pset_fapl_multi(fapl_new, memb_map, memb_fapl, memb_name, memb_addr, TRUE) < 0)
+	    TEST_ERROR;
+
+	ret += test_mf_fs_multi(fapl_new, fcpl);
+
+	h5_clean_files(FILENAME, fapl_new);
+
+    } /* end for new_format */
+
+    if(H5Pclose(fcpl) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pclose(fapl2) < 0)
+        FAIL_STACK_ERROR
+
+    return(ret);
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fcpl);
+        H5Pclose(fapl2);
+        H5Pclose(fapl_new);
+    } H5E_END_TRY;
+    return(1);
+} /* test_mf_fs_drivers() */
+
+
+/*
+ * Verify that file space management performs according to the
+ * file space strategy and free space threshold as specified.
+ */
+static unsigned
+test_filespace_strategy_threshold(hid_t fapl_new)
+{
+    hid_t	file = -1;              /* File ID */
+    hid_t	fcpl = -1;		/* File creation property list template */
+    char	filename[FILENAME_LEN]; /* Filename to use */
+    H5F_t	*f = NULL;              /* Internal file object pointer */
+    H5FD_mem_t 	type;			/* File allocation type */
+    haddr_t	addr1, addr2, addr3, addr4, addr5, addr6; /* File address for H5FD_MEM_SUPER */
+    haddr_t	tmp_addr;		/* Temporary variable for address */
+    H5F_file_space_type_t fs_type;	/* File space handling strategy */
+    hsize_t	fs_threshold;		/* Free space section threshold */
+    hsize_t tot_space, saved_tot_space; /* Total amount of free space */
+    hsize_t tot_sect_count, saved_tot_sect_count;	/* # of free-space sections */
+
+    TESTING("file space strategy and threshold");
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl_new, filename, sizeof(filename));
+
+    for(fs_threshold = 0; fs_threshold <= TEST_THRESHOLD10; fs_threshold++) {
+
+	for(fs_type = H5F_FILE_SPACE_ALL_PERSIST; fs_type < H5F_FILE_SPACE_NTYPES; H5_INC_ENUM(H5F_file_space_type_t, fs_type)) {
+
+	    /* Create file-creation template */
+	    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+		FAIL_STACK_ERROR
+
+	    /* Set default file space information */
+	    if(H5Pset_file_space(fcpl, fs_type, fs_threshold) < 0)
+		FAIL_STACK_ERROR
+
+	    /* Create the file to work on */
+	    if((file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl_new)) < 0)
+		FAIL_STACK_ERROR
+
+	    /* Get a pointer to the internal file object */
+	    if(NULL == (f = (H5F_t *)H5I_object(file)))
+		FAIL_STACK_ERROR
+
+	    /* Allocate 6 blocks */
+	    type = H5FD_MEM_SUPER;
+	    if(HADDR_UNDEF == (addr1 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE1)))
+		FAIL_STACK_ERROR
+	    if(HADDR_UNDEF == (addr2 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE2)))
+		FAIL_STACK_ERROR
+	    if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE3)))
+		FAIL_STACK_ERROR
+	    if(HADDR_UNDEF == (addr4 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE4)))
+		FAIL_STACK_ERROR
+	    if(HADDR_UNDEF == (addr5 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE5)))
+		FAIL_STACK_ERROR
+	    if(HADDR_UNDEF == (addr6 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE6)))
+		FAIL_STACK_ERROR
+
+	    /* Put block #1, #3, #5 to H5FD_MEM_SUPER free-space manager */
+	    if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr1, (hsize_t)TEST_BLOCK_SIZE1) < 0)
+		FAIL_STACK_ERROR
+	    if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
+		FAIL_STACK_ERROR
+	    if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr5, (hsize_t)TEST_BLOCK_SIZE5) < 0)
+		FAIL_STACK_ERROR
+
+	    /* Retrieve the total amount of free space and # of free-space sections */
+	    if(f->shared->fs_man[type] &&
+		H5FS_sect_stats(f->shared->fs_man[type], &saved_tot_space, &saved_tot_sect_count) < 0)
+		    FAIL_STACK_ERROR
+
+	    /* H5F_FILE_SPACE_AGGR_VFD and H5F_FILE_SPACE_VFD: should not have free-space manager */
+	    if(fs_type > H5F_FILE_SPACE_ALL && f->shared->fs_man[type])
+		TEST_ERROR
+
+	    /* Close the file */
+	    if(H5Fclose(file) < 0)
+		FAIL_STACK_ERROR
+
+	    /* Re-open the file */
+	    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_new)) < 0)
+		FAIL_STACK_ERROR
+
+	    /* Get a pointer to the internal file object */
+	    if(NULL == (f = (H5F_t *)H5I_object(file)))
+		FAIL_STACK_ERROR
+
+	    switch(fs_type) {
+		case H5F_FILE_SPACE_ALL_PERSIST:
+		    if(fs_threshold <= TEST_BLOCK_SIZE5) {
+			if(!H5F_addr_defined(f->shared->fs_addr[type]))
+			    TEST_ERROR
+
+			/* Open the free-space manager */
+			if(H5MF_alloc_open(f, H5P_DATASET_XFER_DEFAULT, type) < 0)
+			    FAIL_STACK_ERROR
+
+			/* Retrieve the total amount of free space and # of free-space sections */
+			if(H5FS_sect_stats(f->shared->fs_man[type], &tot_space, &tot_sect_count) < 0)
+			    FAIL_STACK_ERROR
+
+			/* Verify that tot_space should be >= saved_tot_space */
+			/* Verify that tot_sect_count should be >= saved_tot_sect_count */
+			if(tot_space < saved_tot_space || tot_sect_count < saved_tot_sect_count)
+			    TEST_ERROR
+
+			/* Retrieve block #5 from H5FD_MEM_SUPER free-space manager */
+			if(HADDR_UNDEF ==
+			        (tmp_addr = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE5)))
+			    FAIL_STACK_ERROR
+
+			/* Should be the same as before */
+			if(tmp_addr != addr5)
+			    TEST_ERROR
+		    } else if(H5F_addr_defined(f->shared->fs_addr[type]))
+			    TEST_ERROR
+		    break;
+
+		case H5F_FILE_SPACE_ALL:
+		case H5F_FILE_SPACE_AGGR_VFD:
+		case H5F_FILE_SPACE_VFD:
+		    if(H5F_addr_defined(f->shared->fs_addr[type]))
+			TEST_ERROR
+		    break;
+
+		case H5F_FILE_SPACE_DEFAULT:
+		case H5F_FILE_SPACE_NTYPES:
+		default:
+                    TEST_ERROR
+		    break;
+	    } /* end switch */
+
+	    /* Closing */
+	    if(H5Fclose(file) < 0)
+		FAIL_STACK_ERROR
+	    if(H5Pclose(fcpl) < 0)
+		FAIL_STACK_ERROR
+
+	} /* end for fs_type */
+    } /* end for fs_threshold */
+
+    PASSED()
+
+    return(0);
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fcpl);
+	H5Fclose(file);
+    } H5E_END_TRY;
+    return(1);
+} /* test_filespace_strategy_threshold() */
+
+/*
+ * Verify section is merged/shrunk away for
+ * H5F_FILE_SPACE_ALL_PERSIST and H5F_FILE_SPACE_ALL strategy.
+ */
+static unsigned
+test_filespace_gone(hid_t fapl_new)
+{
+    hid_t	file = -1;              /* File ID */
+    hid_t	fcpl = -1;		/* File creation propertly list template */
+    char	filename[FILENAME_LEN]; /* Filename to use */
+    H5F_t	*f = NULL;              /* Internal file object pointer */
+    H5FD_mem_t 	type;			/* File allocation type */
+    haddr_t	addr1, addr2, addr3, addr4, addr5, addr6; /* File address for H5FD_MEM_SUPER */
+    H5F_file_space_type_t fs_type;	/* File space handling strategy */
+    hsize_t	fs_threshold;		/* Free space section threshold */
+    frspace_state_t 	state;		/* State of free space manager */
+
+    TESTING("file space merge/shrink for section size < threshold");
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl_new, filename, sizeof(filename));
+
+    /* Set free-space threshold */
+    fs_threshold = TEST_THRESHOLD3;
+
+    for(fs_type = H5F_FILE_SPACE_ALL_PERSIST; fs_type <= H5F_FILE_SPACE_ALL; H5_INC_ENUM(H5F_file_space_type_t, fs_type)) {
+	/* Create file-creation template */
+	if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+	    FAIL_STACK_ERROR
+
+	/* Set default file space information */
+	if(H5Pset_file_space(fcpl, fs_type, fs_threshold) < 0)
+	    FAIL_STACK_ERROR
+
+	/* Create the file to work on */
+	if((file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl_new)) < 0)
+	    FAIL_STACK_ERROR
+
+	/* Get a pointer to the internal file object */
+	if(NULL == (f = (H5F_t *)H5I_object(file)))
+	    FAIL_STACK_ERROR
+
+	/* Allocate 6 blocks */
+	type = H5FD_MEM_SUPER;
+	if(HADDR_UNDEF == (addr1 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE1)))
+	    FAIL_STACK_ERROR
+	if(HADDR_UNDEF == (addr2 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE2)))
+	    FAIL_STACK_ERROR
+	if(HADDR_UNDEF == (addr3 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE3)))
+	    FAIL_STACK_ERROR
+	if(HADDR_UNDEF == (addr4 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE4)))
+	    FAIL_STACK_ERROR
+	if(HADDR_UNDEF == (addr5 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE5)))
+	    FAIL_STACK_ERROR
+	if(HADDR_UNDEF == (addr6 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE6)))
+	    FAIL_STACK_ERROR
+
+	/* Put block #3, #5 to H5FD_MEM_SUPER free-space manager */
+	if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr3, (hsize_t)TEST_BLOCK_SIZE3) < 0)
+	    FAIL_STACK_ERROR
+	if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr5, (hsize_t)TEST_BLOCK_SIZE5) < 0)
+	    FAIL_STACK_ERROR
+
+	HDmemset(&state, 0, sizeof(frspace_state_t));
+	state.tot_space += TEST_BLOCK_SIZE3 + TEST_BLOCK_SIZE5;
+	state.tot_sect_count += 2;
+	state.serial_sect_count += 2;
+
+	if(check_stats(f, f->shared->fs_man[type], &state))
+	    TEST_ERROR
+
+	/* section #2 is less than threshold but is merged into section #3 */
+	if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr2, (hsize_t)TEST_BLOCK_SIZE2) < 0)
+	    FAIL_STACK_ERROR
+
+	state.tot_space += TEST_BLOCK_SIZE2;
+	if(check_stats(f, f->shared->fs_man[type], &state))
+	    TEST_ERROR
+
+	if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr4, (hsize_t)TEST_BLOCK_SIZE4) < 0)
+	    FAIL_STACK_ERROR
+
+	if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr6, (hsize_t)TEST_BLOCK_SIZE6) < 0)
+	    FAIL_STACK_ERROR
+
+	/* all sections should be shrunk away except section #1 */
+	HDmemset(&state, 0, sizeof(frspace_state_t));
+	if(check_stats(f, f->shared->fs_man[type], &state))
+	    TEST_ERROR
+
+	/* section #1 is less than threshold but is shrunk away */
+	if(H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr1, (hsize_t)TEST_BLOCK_SIZE1) < 0)
+	    FAIL_STACK_ERROR
+
+	/* free-space manager should be empty */
+	HDmemset(&state, 0, sizeof(frspace_state_t));
+	if(check_stats(f, f->shared->fs_man[type], &state))
+	    TEST_ERROR
+
+	if(H5Fclose(file) < 0)
+	    FAIL_STACK_ERROR
+
+	/* Re-open the file */
+	if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl_new)) < 0)
+	    FAIL_STACK_ERROR
+
+	/* Get a pointer to the internal file object */
+	if(NULL == (f = (H5F_t *)H5I_object(file)))
+	    FAIL_STACK_ERROR
+
+	/* free-space manager should be empty */
+	if(H5F_addr_defined(f->shared->fs_addr[type]))
+	    TEST_ERROR
+
+	if(H5Fclose(file) < 0)
+	    FAIL_STACK_ERROR
+
+	if(H5Pclose(fcpl) < 0)
+	    FAIL_STACK_ERROR
+
+    } /* end for fs_type */
+
+    PASSED()
+
+    return(0);
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fcpl);
+	H5Fclose(file);
+    } H5E_END_TRY;
+    return(1);
+} /* test_filespace_gone() */
+
+/*
+ * Tests to verify file space management for different drivers.
+ */
+static unsigned
+test_filespace_drivers(hid_t fapl)
+{
+    hid_t	fapl_new = -1;		/* copy of file access property list */
+    hid_t	fapl2 = -1;		/* copy of file access property list */
+    unsigned	new_format;		/* Using library new format or not */
+    unsigned 	ret = 0;		/* return value */
+
+    H5FD_mem_t	memb_map[H5FD_MEM_NTYPES];	/* Memory usage map */
+    hid_t	memb_fapl[H5FD_MEM_NTYPES];	/* Member access properties */
+    char        sv[H5FD_MEM_NTYPES][64];	/* Name generators */
+    const	char *memb_name[H5FD_MEM_NTYPES];	/* Name generators */
+    haddr_t	memb_addr[H5FD_MEM_NTYPES];	/* Member starting address */
+
+    /* Copy the file access property list */
+    if((fapl2 = H5Pcopy(fapl)) < 0) TEST_ERROR
+
+    /* Set the "use the latest version of the format" bounds for creating objects in the file */
+    if(H5Pset_libver_bounds(fapl2, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+	TEST_ERROR
+
+    /* Test with old and new format */
+    for(new_format = FALSE; new_format <= TRUE; new_format++) {
+
+	if(new_format)
+	    HDputs("Testing the following tests for file space management with new library format...");
+	else
+	    HDputs("Testing the following tests for file space management with old library format...");
+
+	/* SEC2 */
+	HDputs("Testing file space management with sec2 driver");
+
+	if((fapl_new = H5Pcopy(new_format?fapl2:fapl)) < 0)
+	    FAIL_STACK_ERROR
+	if(H5Pset_fapl_sec2(fapl_new) < 0)
+	    FAIL_STACK_ERROR
+
+	ret += test_filespace_strategy_threshold(fapl_new);
+	ret += test_filespace_gone(fapl_new);
+
+	h5_clean_files(FILENAME, fapl_new);
+
+	/* STDIO */
+	HDputs("Testing file space management with stdio driver");
+
+	if((fapl_new = H5Pcopy(new_format?fapl2:fapl)) < 0)
+	    FAIL_STACK_ERROR
+	if(H5Pset_fapl_stdio(fapl_new) < 0)
+	    FAIL_STACK_ERROR
+
+	ret += test_filespace_strategy_threshold(fapl_new);
+	ret += test_filespace_gone(fapl_new);
+
+	h5_clean_files(FILENAME, fapl_new);
+
+	/* CORE */
+	HDputs("Testing file space management with core driver");
+
+	/* create fapl to be a "core" file */
+	if((fapl_new = H5Pcopy(new_format?fapl2:fapl)) < 0)
+	    FAIL_STACK_ERROR
+	if(H5Pset_fapl_core(fapl_new, (size_t)CORE_INCREMENT, TRUE) < 0)
+	    FAIL_STACK_ERROR
+
+	ret += test_filespace_strategy_threshold(fapl_new);
+	ret += test_filespace_gone(fapl_new);
+
+	h5_clean_files(FILENAME, fapl_new);
+
+	/* FAMILY */
+	HDputs("Testing file space managers with family driver");
+
+	if((fapl_new = H5Pcopy(new_format?fapl2:fapl)) < 0)
+	    FAIL_STACK_ERROR
+	if(H5Pset_fapl_family(fapl_new, (hsize_t)FAMILY_SIZE, H5P_DEFAULT) < 0)
+	    FAIL_STACK_ERROR
+
+	ret += test_filespace_strategy_threshold(fapl_new);
+	ret += test_filespace_gone(fapl_new);
+
+	h5_clean_files(FILENAME, fapl_new);
+
+
+	/* SPLIT */
+	HDputs("Testing file space managers with split driver");
+
+	if((fapl_new = H5Pcopy(new_format?fapl2:fapl)) < 0)
+	    FAIL_STACK_ERROR
+	if(H5Pset_fapl_split(fapl_new, "-m.h5", H5P_DEFAULT, "-r.h5", H5P_DEFAULT)<0)
+	    FAIL_STACK_ERROR
+
+	ret += test_filespace_strategy_threshold(fapl_new);
+	ret += test_filespace_gone(fapl_new);
+
+	h5_clean_files(FILENAME, fapl_new);
+
+	/* MULTI */
+	HDputs("Testing file space managers with multi driver");
+
+	MULTI_SETUP(memb_map, memb_fapl, memb_name, memb_addr, sv)
+
+	if((fapl_new = H5Pcopy(new_format?fapl2:fapl)) < 0)
+	    TEST_ERROR
+	if(H5Pset_fapl_multi(fapl_new, memb_map, memb_fapl, memb_name, memb_addr, TRUE) < 0)
+	    TEST_ERROR;
+
+	ret += test_filespace_strategy_threshold(fapl_new);
+	ret += test_filespace_gone(fapl_new);
+
+	h5_clean_files(FILENAME, fapl_new);
+
+    } /* end for new_format */
+
+    if (H5Pclose(fapl2) < 0)
+        FAIL_STACK_ERROR
+
+    return(ret);
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl_new);
+        H5Pclose(fapl2);
+    } H5E_END_TRY;
+    return(1);
+} /* test_filespace_drivers() */
+
+/*
+ * To verify that file space is allocated from the corresponding free-space manager
+ * because H5FD_FLMAP_DICHOTOMY is used as the default free-list mapping.
+ *
+ * (1) Allocate the first block (size 30) of type H5FD_MEM_SUPER
+ * (2) Allocate the second block (size 50) of type H5FD_MEM_SUPER
+ *
+ * (3) Allocate the first block (size 30) of type H5FD_MEM_DRAW
+ *
+ * (4) Free the first block (size 30) of type H5FD_MEM_SUPER
+ *
+ * (5) Allocate the second block (size 30) of type H5FD_MEM_DRAW
+ * (6) Verify that this second block is not the freed block from (3)
+ *
+ * (7) Allocate the second block (size 30) of type H5FD_MEM_DRAW
+ * (8) Free the first block (size 30) of type H5FD_MEM_DRAW
+ *
+ * (9) Allocate the third block (size 30) of type H5FD_MEM_SUPER
+ * (10) Verify that this third block is not freed block from (8)
+ */
+static unsigned
+test_dichotomy(const char *env_h5_drvr, hid_t fapl)
+{
+    hid_t		file = -1;              /* File ID */
+    char		filename[FILENAME_LEN]; /* Filename to use */
+    H5F_t		*f = NULL;              /* Internal file object pointer */
+    H5FD_mem_t 		type, stype;
+    haddr_t		addr1, addr3, saddr1, saddr2;
+    hbool_t             contig_addr_vfd;        /* Whether VFD used has a contigous address space */
+
+    TESTING("Allocation from raw or metadata free-space manager");
+
+    /* Skip test when using VFDs that don't use the metadata aggregator */
+    contig_addr_vfd = (hbool_t)(HDstrcmp(env_h5_drvr, "split") && HDstrcmp(env_h5_drvr, "multi"));
+    if(contig_addr_vfd) {
+        /* Set the filename to use for this test (dependent on fapl) */
+        h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
+
+        /* Create the file to work on */
+        if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Get a pointer to the internal file object */
+        if(NULL == (f = (H5F_t *)H5I_object(file)))
+            FAIL_STACK_ERROR
+
+        /* Allocate the first block of type H5FD_MEM_SUPER */
+        type = H5FD_MEM_SUPER;
+        addr1 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE30);
+
+        /* Allocate the second block of type H5FD_MEM_SUPER */
+        H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE50);
+
+        /* Allocate the first block of type H5FD_MEM_DRAW */
+        stype = H5FD_MEM_DRAW;
+        saddr1 = H5MF_alloc(f, stype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE30);
+
+	/* Free the first block of type H5FD_MEM_SUPER */
+        H5MF_xfree(f, type, H5P_DATASET_XFER_DEFAULT, addr1, (hsize_t)TEST_BLOCK_SIZE30);
+
+        /* Allocate the second block of type H5FD_MEM_DRAW */
+        saddr2 = H5MF_alloc(f, stype, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE30);
+
+	/* Verify that saddr1 is not addr1 */
+	if(saddr2 == addr1) TEST_ERROR
+
+	/* Free the first block of type H5FD_MEM_DRAW */
+        H5MF_xfree(f, stype, H5P_DATASET_XFER_DEFAULT, saddr1, (hsize_t)TEST_BLOCK_SIZE30);
+
+        /* Allocate the third block of type H5FD_MEM_SUPER */
+        addr3 = H5MF_alloc(f, type, H5P_DATASET_XFER_DEFAULT, (hsize_t)TEST_BLOCK_SIZE30);
+
+	/* Verify that addr3 is not saddr1 */
+	if(addr3 == saddr1) TEST_ERROR
+
+        if(H5Fclose(file) < 0)
+            FAIL_STACK_ERROR
+
+        PASSED()
+    } /* end if */
+    else {
+	SKIPPED();
+	puts("    Current VFD doesn't support metadata aggregator");
+    } /* end else */
+
+    return(0);
+
+error:
+    H5E_BEGIN_TRY {
+	H5Fclose(file);
+    } H5E_END_TRY;
+    return(1);
+} /* test_dichotomy() */
+
+int
+main(void)
+{
+    hid_t       fapl = -1;	   /* File access property list for data files */
+    hid_t       new_fapl = -1;	   /* File access property list for alignment & aggr setting */
+    unsigned    nerrors = 0;       /* Cumulative error count */
+    test_type_t	curr_test;	   /* Current test being worked on */
+    const char  *env_h5_drvr;      /* File Driver value from environment */
+
+    /* Get the VFD to use */
+    env_h5_drvr = HDgetenv("HDF5_DRIVER");
+    if(env_h5_drvr == NULL)
+        env_h5_drvr = "nomatch";
+
+    h5_reset();
+
+    fapl = h5_fileaccess();
+
+    /* Make a copy of the FAPL before adjusting the alignment */
+    if((new_fapl = H5Pcopy(fapl)) < 0) TEST_ERROR
+
+    /* alignment is not set for the following tests */
+    if(H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)1) < 0)
+	TEST_ERROR
+
+    /* meta/small data is set to 2048 for the following tests */
+    if(H5Pset_meta_block_size(fapl, (hsize_t)TEST_BLOCK_SIZE2048) < 0)
+	TEST_ERROR
+    if(H5Pset_small_data_block_size(fapl, (hsize_t)TEST_BLOCK_SIZE2048) < 0)
+	TEST_ERROR
+
+    /* interaction with file allocation */
+    nerrors += test_mf_eoa(env_h5_drvr, fapl);
+    nerrors += test_mf_eoa_shrink(env_h5_drvr, fapl);
+    nerrors += test_mf_eoa_extend(env_h5_drvr, fapl);
+
+    /* interaction with temporary file space allocation */
+    nerrors += test_mf_tmp(env_h5_drvr, fapl);
+
+    /* interaction with free-space manager */
+    nerrors += test_mf_fs_start(fapl);
+    nerrors += test_mf_fs_alloc_free(fapl);
+    nerrors += test_mf_fs_extend(fapl);
+    nerrors += test_mf_fs_absorb(env_h5_drvr, fapl);
+    nerrors += test_dichotomy(env_h5_drvr, new_fapl);
+
+    /* interaction with meta/sdata aggregator */
+    nerrors += test_mf_aggr_alloc1(env_h5_drvr, fapl);
+    nerrors += test_mf_aggr_alloc2(env_h5_drvr, fapl);
+    nerrors += test_mf_aggr_alloc3(env_h5_drvr, fapl);
+    nerrors += test_mf_aggr_alloc4(env_h5_drvr, fapl);
+    nerrors += test_mf_aggr_alloc5(env_h5_drvr, fapl);
+    nerrors += test_mf_aggr_alloc6(env_h5_drvr, fapl);
+    nerrors += test_mf_aggr_alloc7(env_h5_drvr, fapl);
+    nerrors += test_mf_aggr_extend(env_h5_drvr, fapl);
+    nerrors += test_mf_aggr_absorb(env_h5_drvr, fapl);
+
+    /* Tests for alignment */
+    for(curr_test = TEST_NORMAL; curr_test < TEST_NTESTS; H5_INC_ENUM(test_type_t, curr_test)) {
+
+	switch(curr_test) {
+            case TEST_NORMAL: /* set alignment = 1024 */
+		if(H5Pset_alignment(new_fapl, (hsize_t)0, (hsize_t)TEST_ALIGN1024) < 0)
+		    TEST_ERROR
+                break;
+
+            case TEST_AGGR_SMALL: /* set alignment = 4096 */
+		if(H5Pset_alignment(new_fapl, (hsize_t)0, (hsize_t)TEST_ALIGN4096) < 0)
+		    TEST_ERROR
+                break;
+
+            case TEST_NTESTS:
+            default:
+                TEST_ERROR;
+		break;
+	} /* end switch */
+
+	nerrors += test_mf_align_eoa(env_h5_drvr, fapl, new_fapl);
+	nerrors += test_mf_align_fs(env_h5_drvr, fapl, new_fapl);
+	nerrors += test_mf_align_alloc1(env_h5_drvr, fapl, new_fapl);
+	nerrors += test_mf_align_alloc2(env_h5_drvr, fapl, new_fapl);
+	nerrors += test_mf_align_alloc3(env_h5_drvr, fapl, new_fapl);
+	nerrors += test_mf_align_alloc4(env_h5_drvr, fapl, new_fapl);
+	nerrors += test_mf_align_alloc5(env_h5_drvr, fapl, new_fapl);
+	nerrors += test_mf_align_alloc6(env_h5_drvr, fapl, new_fapl);
+    } /* end if */
+
+    /* tests to verify that file's free-space managers are persistent */
+    nerrors += test_mf_fs_drivers(fapl);
+
+    /* tests for file space management */
+    nerrors += test_filespace_drivers(fapl);
+
+    if(H5Pclose(new_fapl) < 0)
+        FAIL_STACK_ERROR
+    h5_cleanup(FILENAME, fapl);
+
+    if(nerrors)
+        goto error;
+    puts("All free-space manager tests for file memory passed.");
+
+    return(0);
+
+error:
+    puts("*** TESTS FAILED ***");
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+        H5Pclose(new_fapl);
+    } H5E_END_TRY;
+    return(1);
+} /* main() */
 
-error:
-    puts("*** TESTS FAILED ***");
-    H5E_BEGIN_TRY {
-        H5Pclose(fapl);
-        H5Pclose(new_fapl);
-    } H5E_END_TRY;
-    return(1);
-} /* main() */
diff --git a/test/mtime.c b/test/mtime.c
index f6296fc..0c0c923 100644
--- a/test/mtime.c
+++ b/test/mtime.c
@@ -132,14 +132,8 @@ main(void)
     TESTING("accessing old modification time messages");
 
     {
-        char testfile[512]="";
-        char *srcdir = HDgetenv("srcdir");
+        const char *testfile = H5_get_srcdir_filename(TESTFILE1); /* Corrected test file name */
 
-        if(srcdir && ((HDstrlen(srcdir) + strlen(TESTFILE1) + 1) < sizeof(testfile))){
-            HDstrcpy(testfile, srcdir);
-            HDstrcat(testfile, "/");
-        }
-        HDstrcat(testfile, TESTFILE1);
         file = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT);
         if(file >= 0){
             if(H5Oget_info_by_name(file, "/Dataset1", &oi1, H5P_DEFAULT) < 0)
@@ -168,14 +162,8 @@ main(void)
     TESTING("accessing new modification time messages");
 
     {
-        char testfile[512]="";
-        char *srcdir = HDgetenv("srcdir");
+        const char *testfile = H5_get_srcdir_filename(TESTFILE2); /* Corrected test file name */
 
-        if(srcdir && ((HDstrlen(srcdir) + strlen(TESTFILE2) + 1) < sizeof(testfile))){
-            HDstrcpy(testfile, srcdir);
-            HDstrcat(testfile, "/");
-        }
-        HDstrcat(testfile, TESTFILE2);
         file = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT);
         if(file >= 0){
             if(H5Oget_info_by_name(file, "/Dataset1", &oi2, H5P_DEFAULT) < 0)
diff --git a/test/multi_file_v16-s.h5 b/test/multi_file_v16-s.h5
index e990e95..2d4de48 100644
Binary files a/test/multi_file_v16-s.h5 and b/test/multi_file_v16-s.h5 differ
diff --git a/test/noencoder.h5 b/test/noencoder.h5
index add52e3..6b973cd 100644
Binary files a/test/noencoder.h5 and b/test/noencoder.h5 differ
diff --git a/test/ntypes.c b/test/ntypes.c
index a4ae4cf..bb6c973 100644
--- a/test/ntypes.c
+++ b/test/ntypes.c
@@ -2188,7 +2188,7 @@ test_refer_dtype(hid_t file)
         TEST_ERROR;
 
     /* Open datatype object */
-    if((tid1 = H5Rdereference(dataset, H5R_OBJECT, rbuf)) < 0)
+    if((tid1 = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, rbuf)) < 0)
         TEST_ERROR;
 
     /* Verify correct datatype */
@@ -2373,7 +2373,7 @@ test_refer_dtype2(hid_t file)
         TEST_ERROR;
 
     /* Try to open objects */
-    if((dset2 = H5Rdereference(dset1, H5R_DATASET_REGION, &rbuf)) < 0)
+    if((dset2 = H5Rdereference2(dset1, H5P_DEFAULT, H5R_DATASET_REGION, &rbuf)) < 0)
         TEST_ERROR;
 
     /* Check what H5Rget_obj_type2 function returns */
diff --git a/test/objcopy.c b/test/objcopy.c
index 19e4a58..4c10602 100644
--- a/test/objcopy.c
+++ b/test/objcopy.c
@@ -28,7 +28,7 @@
  * This file needs to access private information from the H5S package.
  * This file also needs to access the dataspace testing code.
  */
-#define H5S_PACKAGE
+#define H5S_FRIEND		/*suppress error about including H5Spkg	  */
 #define H5S_TESTING
 #include "H5Spkg.h"		/* Dataspaces 				*/
 
@@ -36,11 +36,17 @@
  * This file needs to access private information from the H5P package.
  * This file also needs to access the property list testing code.
  */
-#define H5P_PACKAGE
+#define H5P_FRIEND		/*suppress error about including H5Ppkg	  */
 #define H5P_TESTING
 #include "H5Ppkg.h"		/* Property Lists 			*/
 
-#include "H5Dprivate.h"         /* Datasets (for EFL property name)     */
+/*
+ * This file needs to access private information from the H5D package.
+ * This file also needs to access the dataset testing code.
+ */
+#define H5D_FRIEND		/*suppress error about including H5Dpkg	  */
+#define H5D_TESTING
+#include "H5Dpkg.h"		/* Datasets     			*/
 
 
 const char *FILENAME[] = {
@@ -77,7 +83,13 @@ const char *FILENAME[] = {
 #define NAME_DATASET_SIMPLE3    "dataset_simple_another_copy"
 #define NAME_DATASET_COMPOUND 	"dataset_compound"
 #define NAME_DATASET_CHUNKED 	"dataset_chunked"
+#define NAME_DATASET_CHUNKED_SINGLE 	"dataset_chunked_single"
 #define NAME_DATASET_CHUNKED2 	"dataset_chunked2"
+#define NAME_DATASET_CHUNKED2_SINGLE 	"dataset_chunked2_single"
+#define NAME_DATASET_CHUNKED3 	"dataset_chunked3"
+#define NAME_DATASET_CHUNKED3_SINGLE 	"dataset_chunked3_single"
+#define NAME_DATASET_CHUNKED4 	"dataset_chunked4"
+#define NAME_DATASET_CHUNKED4_SINGLE 	"dataset_chunked4_single"
 #define NAME_DATASET_COMPACT 	"dataset_compact"
 #define NAME_DATASET_EXTERNAL 	"dataset_ext"
 #define NAME_DATASET_NAMED_DTYPE 	"dataset_named_dtype"
@@ -85,7 +97,9 @@ const char *FILENAME[] = {
 #define NAME_DATASET_MULTI_OHDR 	"dataset_multi_ohdr"
 #define NAME_DATASET_MULTI_OHDR2 	"dataset_multi_ohdr2"
 #define NAME_DATASET_VL 	"dataset_vl"
+#define NAME_DATASET_VL2 	"dataset_vl2"
 #define NAME_DATASET_VL_VL 	"dataset_vl_vl"
+#define NAME_DATASET_VL_VL2 	"dataset_vl_vl2"
 #define NAME_DATASET_CMPD_VL 	"dataset_cmpd_vl"
 #define NAME_DATASET_SUB_SUB 	"/g0/g00/g000/dataset_simple"
 #define NAME_GROUP_UNCOPIED 	"/uncopied"
@@ -121,12 +135,17 @@ const char *FILENAME[] = {
 #define ATTR_NAME_LEN 80
 #define DIM_SIZE_1 12
 #define DIM_SIZE_2  6
+#define MAX_DIM_SIZE_1	100
+#define MAX_DIM_SIZE_2	80
 #define CHUNK_SIZE_1 5          /* Not an even fraction of dimension sizes, so we test copying partial chunks */
 #define CHUNK_SIZE_2 5
 #define NUM_SUB_GROUPS  20
 #define NUM_WIDE_LOOP_GROUPS  10
 #define NUM_DATASETS  10
 
+#define COPY_OPEN_OBJ_NAME     "CopyOpenObj"
+#define COPY_OPEN_OBJ_SIZE      sizeof(hbool_t)
+
 char src_obj_full_name[215];  /* the full path + name of the object to be copied */
 
 unsigned num_attributes_g;         /* Number of attributes created */
@@ -147,6 +166,8 @@ static int
 compare_datasets(hid_t did, hid_t did2, hid_t pid, const void *wbuf);
 static int
 compare_groups(hid_t gid, hid_t gid2, hid_t pid, int depth, unsigned copy_flags);
+static int 
+compare_idx_type(hid_t fapl, hid_t did, H5D_chunk_index_t new_type, H5D_chunk_index_t old_type);
 
 

 /*-------------------------------------------------------------------------
@@ -1019,8 +1040,8 @@ compare_data(hid_t parent1, hid_t parent2, hid_t pid, hid_t tid, size_t nelmts,
                 if(obj1_type != obj2_type) TEST_ERROR
 
                 /* Open referenced objects */
-                if((obj1_id = H5Rdereference(parent1, H5R_OBJECT, ref_buf1)) < 0) TEST_ERROR
-                if((obj2_id = H5Rdereference(parent2, H5R_OBJECT, ref_buf2)) < 0) TEST_ERROR
+                if((obj1_id = H5Rdereference2(parent1, H5P_DEFAULT, H5R_OBJECT, ref_buf1)) < 0) TEST_ERROR
+                if((obj2_id = H5Rdereference2(parent2, H5P_DEFAULT, H5R_OBJECT, ref_buf2)) < 0) TEST_ERROR
 
                 /* break the infinite loop when the ref_object points to itself */
                 if(obj_owner > 0) {
@@ -1077,8 +1098,8 @@ compare_data(hid_t parent1, hid_t parent2, hid_t pid, hid_t tid, size_t nelmts,
                 if(obj1_type != obj2_type) TEST_ERROR
 
                 /* Open referenced objects */
-                if((obj1_id = H5Rdereference(parent1, H5R_DATASET_REGION, ref_buf1)) < 0) TEST_ERROR
-                if((obj2_id = H5Rdereference(parent2, H5R_DATASET_REGION, ref_buf2)) < 0) TEST_ERROR
+                if((obj1_id = H5Rdereference2(parent1, H5P_DEFAULT, H5R_DATASET_REGION, ref_buf1)) < 0) TEST_ERROR
+                if((obj2_id = H5Rdereference2(parent2, H5P_DEFAULT, H5R_DATASET_REGION, ref_buf2)) < 0) TEST_ERROR
 
                 /* break the infinite loop when the ref_object points to itself */
                 if(obj_owner > 0) {
@@ -1171,6 +1192,18 @@ compare_datasets(hid_t did, hid_t did2, hid_t pid, const void *wbuf)
     void *rbuf2 = NULL;                         /* Buffer for reading raw data */
     H5D_space_status_t space_status;            /* Dataset's raw data space status */
     H5D_space_status_t space_status2;           /* Dataset's raw data space status */
+    hbool_t copy_open_obj = FALSE;              /* Indicate if we are copying open objects */
+
+    /* Retrieve the private "copy open object" property from the property list, if it's non-DEFAULT */
+    if(pid != H5P_DEFAULT) {
+        htri_t copy_open_obj_exists;
+
+        if((copy_open_obj_exists = H5Pexist(pid, COPY_OPEN_OBJ_NAME)) < 0) TEST_ERROR
+        if(copy_open_obj_exists) {
+            if(H5Pget(pid, COPY_OPEN_OBJ_NAME, &copy_open_obj) < 0)
+                TEST_ERROR
+        } /* end if */
+    } /* end if */
 
     /* Check the datatypes are equal */
 
@@ -1243,20 +1276,22 @@ compare_datasets(hid_t did, hid_t did2, hid_t pid, const void *wbuf)
 
             if(offset1 != offset2) TEST_ERROR
             if(size1 != size2) TEST_ERROR
-            if(strcmp(name1, name2) != 0) TEST_ERROR
+            if(HDstrcmp(name1, name2) != 0) TEST_ERROR
         }
 
-        /* Remove external file information from the dcpls */
-        /* Remove default property causes memory leak
-        if(H5Premove(dcpl, H5D_CRT_EXT_FILE_LIST_NAME) < 0) TEST_ERROR
-        if(H5Premove(dcpl2, H5D_CRT_EXT_FILE_LIST_NAME) < 0) TEST_ERROR
-        */
-
-        /* reset external file information from the dcpls */
+        /* Reset external file information from the dcpls */
+        /* (Directly removing default property causes memory leak) */
         if (H5P_reset_external_file_test(dcpl) < 0) TEST_ERROR
         if (H5P_reset_external_file_test(dcpl2) < 0) TEST_ERROR
     }
 
+    /* Check for copying open objects */
+    if(copy_open_obj) {
+        /* Reset layout information from the dcpls */
+        if(H5P_reset_layout_test(dcpl) < 0) TEST_ERROR
+        if(H5P_reset_layout_test(dcpl2) < 0) TEST_ERROR
+    } /* end if */
+
     /* Compare the rest of the dataset creation property lists */
     if(H5Pequal(dcpl, dcpl2) != TRUE) TEST_ERROR
 
@@ -1516,6 +1551,47 @@ error:
 
 

 /*-------------------------------------------------------------------------
+ * Function:    compare_idx_type
+ *
+ * Purpose:     If using new format, the index array type should be NEW_TYPE
+ *		If not, the index array type should be OLD_TYPE
+ *
+ * Return:	TRUE if the index type retrieved for the dataset DID is 
+ *			as expected
+ *	        FALSE if not
+ *
+ * Programmer:  Vailin Choi; August 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static int 
+compare_idx_type(hid_t fapl, hid_t did, H5D_chunk_index_t new_type, H5D_chunk_index_t old_type)
+{
+    H5D_chunk_index_t idx_type; /* Dataset chunk index type */
+    H5F_libver_t low;           /* File format low bound */
+
+    /* Get the chunk index type */
+    if(H5D__layout_idx_type_test(did, &idx_type) < 0) 
+	FAIL_STACK_ERROR
+
+    /* Check if we are using the latest version of the format */
+    if(H5Pget_libver_bounds(fapl, &low, NULL) < 0) 
+	FAIL_STACK_ERROR
+
+    /* Verify index type */
+    if(low == H5F_LIBVER_LATEST) {
+	if(idx_type != new_type)
+	    TEST_ERROR
+    } else if(idx_type != old_type) 
+	TEST_ERROR
+
+    return TRUE;
+error:
+    return FALSE;
+} /* compare_idx_type() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    test_copy_named_datatype
  *
  * Purpose:     Create name datatype in SRC file and copy it to DST file
@@ -2315,7 +2391,7 @@ test_copy_dataset_compound(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t
 #endif /* H5_CLEAR_MEMORY */
     for(i = 0; i < DIM_SIZE_1; i++) {
         buf[i].a = i;
-        buf[i].d = 1.0F / (i + 1);
+        buf[i].d = (double)1.0F / (double)(i + 1);
     } /* end for */
 
     /* Initialize the filenames */
@@ -2447,9 +2523,9 @@ test_copy_dataset_chunked(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t
 
     /* set initial data values */
     for(i = 0; i < DIM_SIZE_1; i++) {
-        buf1d[i] = (float)(i / 2.0F);
+        buf1d[i] = (float)i / 2.0F;
         for(j = 0; j < DIM_SIZE_2; j++)
-            buf2d[i][j] = (float)(i + (j / 100.0F));
+            buf2d[i][j] = (float)i + ((float)j / 100.0F);
     } /* end for */
 
     /* Initialize the filenames */
@@ -2491,6 +2567,36 @@ test_copy_dataset_chunked(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t
     /* close the dataset */
     if(H5Dclose(did) < 0) TEST_ERROR
 
+    /* 
+     * Create 1-D dataset: chunked, non-filterd, with data
+     *			   dims=max dims=chunk dims
+     *			   H5D_ALLOC_TIME_INC (default)
+     */
+    /* create 1-D dataspace */
+    if((sid = H5Screate_simple(1, dim1d, dim1d)) < 0) TEST_ERROR
+
+    /* create and set chunk plist */
+    if((pid = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
+    if(H5Pset_chunk(pid, 1, dim1d) < 0) TEST_ERROR
+
+    /* create dataset */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED_SINGLE, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* close chunk plist */
+    if(H5Pclose(pid) < 0) TEST_ERROR
+
+    /* write data into file */
+    if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf1d) < 0) TEST_ERROR
+
+    /* close dataspace */
+    if(H5Sclose(sid) < 0) TEST_ERROR
+
+    /* attach attributes to the dataset */
+    if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
+
+    /* close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
     /* Set 2-D dataspace dimensions */
     dim2d[0] = DIM_SIZE_1;
     dim2d[1] = DIM_SIZE_2;
@@ -2505,21 +2611,116 @@ test_copy_dataset_chunked(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t
     /* create dataset */
     if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED2, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
 
+    /* write data into file */
+    if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf2d) < 0) TEST_ERROR
+
+    /* attach attributes to the dataset */
+    if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
+
+    /* close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+
+    /* Set allocation time to early */
+    if(H5Pset_alloc_time(pid, H5D_ALLOC_TIME_EARLY) < 0) TEST_ERROR
+
+    /* create dataset */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED3, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+
     /* close chunk plist */
     if(H5Pclose(pid) < 0) TEST_ERROR
 
+
+    /* write data into file */
+    if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf2d) < 0) TEST_ERROR
+
+    /* close dataspace */
+    if(H5Sclose(sid) < 0) TEST_ERROR
+
+    /* attach attributes to the dataset */
+    if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
+
+    /* close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+    /* 
+     * Create 2-D dataset: chunked, non-filterd, with data, dims=chunk dims,
+     *			   H5D_ALLOC_TIME_INC (default)
+     */
+
+    /* create 2-D dataspace */
+    if((sid = H5Screate_simple(2, dim2d, NULL)) < 0) TEST_ERROR
+
+    /* create and set chunk plist to be the same as dims2d */
+    if((pid = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
+    if(H5Pset_chunk(pid, 2, dim2d) < 0) TEST_ERROR
+
+    /* create dataset */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED2_SINGLE, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* write data into file */
+    if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf2d) < 0) TEST_ERROR
+
+    /* attach attributes to the dataset */
+    if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
+
+    /* close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+    /* 
+     * Create 2-D dataset: chunked, non-filterd, with data, dims=chunk dims,
+     *			   H5D_ALLOC_TIME_EARLY
+     */
+    if(H5Pset_alloc_time(pid, H5D_ALLOC_TIME_EARLY) < 0) TEST_ERROR
+
+    /* create dataset */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED3_SINGLE, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+
     /* write data into file */
     if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf2d) < 0) TEST_ERROR
 
+    /* attach attributes to the dataset */
+    if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
+
+    /* close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
     /* close dataspace */
     if(H5Sclose(sid) < 0) TEST_ERROR
 
+    /* close chunk plist */
+    if(H5Pclose(pid) < 0) TEST_ERROR
+
+    /* 
+     * Create 2-D dataset: chunked, non-filterd, with data, dims=max dims=chunk dims,
+     *			   H5D_ALLOC_TIME_LATE
+     */
+    /* create 2-D dataspace */
+    if((sid = H5Screate_simple(2, dim2d, dim2d)) < 0) TEST_ERROR
+
+    /* create and set chunk plist to be the same as dims2d */
+    if((pid = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
+    if(H5Pset_chunk(pid, 2, dim2d) < 0) TEST_ERROR
+    if(H5Pset_alloc_time(pid, H5D_ALLOC_TIME_LATE) < 0) TEST_ERROR
+
+    /* create dataset */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED4_SINGLE, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* write data into file */
+    if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf2d) < 0) TEST_ERROR
+
     /* attach attributes to the dataset */
     if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
 
     /* close the dataset */
     if(H5Dclose(did) < 0) TEST_ERROR
 
+    /* close dataspace */
+    if(H5Sclose(sid) < 0) TEST_ERROR
+
+    /* close chunk plist */
+    if(H5Pclose(pid) < 0) TEST_ERROR
+
     /* close the SRC file */
     if(H5Fclose(fid_src) < 0) TEST_ERROR
 
@@ -2536,6 +2737,12 @@ test_copy_dataset_chunked(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t
     /* copy the datasets from SRC to DST */
     if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED, fid_dst, NAME_DATASET_CHUNKED, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
     if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED2, fid_dst, NAME_DATASET_CHUNKED2, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+    if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED3, fid_dst, NAME_DATASET_CHUNKED3, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+
+    if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED_SINGLE, fid_dst, NAME_DATASET_CHUNKED_SINGLE, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+    if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED2_SINGLE, fid_dst, NAME_DATASET_CHUNKED2_SINGLE, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+    if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED3_SINGLE, fid_dst, NAME_DATASET_CHUNKED3_SINGLE, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+    if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED4_SINGLE, fid_dst, NAME_DATASET_CHUNKED4_SINGLE, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
 
     /* open the dataset for copy */
     if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED, H5P_DEFAULT)) < 0) TEST_ERROR
@@ -2543,6 +2750,30 @@ test_copy_dataset_chunked(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t
     /* open the 1-D destination dataset */
     if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED, H5P_DEFAULT)) < 0) TEST_ERROR
 
+    /* Check if the array index type is correct */
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_EARRAY, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
+    /* Check if the datasets are equal */
+    if(compare_datasets(did, did2, H5P_DEFAULT, buf1d) != TRUE) TEST_ERROR
+
+    /* close the destination dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* close the source dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+
+    /* open the dataset for copy */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* open the 1-D destination dataset */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* Check if the array index type is correct */
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_SINGLE, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
     /* Check if the datasets are equal */
     if(compare_datasets(did, did2, H5P_DEFAULT, buf1d) != TRUE) TEST_ERROR
 
@@ -2558,6 +2789,87 @@ test_copy_dataset_chunked(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t
     /* open the destination dataset */
     if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED2, H5P_DEFAULT)) < 0) TEST_ERROR
 
+    /* Check if the array index type is correct */
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_FARRAY, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
+    /* Check if the datasets are equal */
+    if(compare_datasets(did, did2, H5P_DEFAULT, buf2d) != TRUE) TEST_ERROR
+
+    /* close the destination dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* close the source dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+
+    /* open the 2-D dataset for copy */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED3, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* open the destination dataset */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED3, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* Check if the array index type is correct */
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_NONE, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
+    /* Check if the datasets are equal */
+    if(compare_datasets(did, did2, H5P_DEFAULT, buf2d) != TRUE) TEST_ERROR
+
+    /* close the destination dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* close the source dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+    /* open the 2-D dataset for copy */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED2_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* open the destination dataset */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED2_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* Check if the array index type is correct */
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_SINGLE, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
+    /* Check if the datasets are equal */
+    if(compare_datasets(did, did2, H5P_DEFAULT, buf2d) != TRUE) TEST_ERROR
+
+    /* close the destination dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* close the source dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+    /* open the 2-D dataset for copy */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED3_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* open the destination dataset */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED3_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* Check if the array index type is correct */
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_SINGLE, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
+    /* Check if the datasets are equal */
+    if(compare_datasets(did, did2, H5P_DEFAULT, buf2d) != TRUE) TEST_ERROR
+
+    /* close the destination dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* close the source dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+    /* open the 2-D dataset for copy */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED4_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* open the destination dataset */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED4_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* Check if the array index type is correct */
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_SINGLE, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
     /* Check if the datasets are equal */
     if(compare_datasets(did, did2, H5P_DEFAULT, buf2d) != TRUE) TEST_ERROR
 
@@ -2656,6 +2968,36 @@ test_copy_dataset_chunked_empty(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl,
     /* close the dataset */
     if(H5Dclose(did) < 0) TEST_ERROR
 
+    /* 
+     * create 1-D dataset: chunked, empty, non-filtered,
+     *			   dims=max dims=chunk dims, H5D_ALLOC_TIME_INC(default)
+     */
+
+    /* Set 1-D dataspace dimensions */
+    dim1d[0] = DIM_SIZE_1;
+
+    /* create 1-D dataspace */
+    if((sid = H5Screate_simple(1, dim1d, dim1d)) < 0) TEST_ERROR
+
+    /* create and set chunk plist */
+    if((pid = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
+    if(H5Pset_chunk(pid, 1, dim1d) < 0) TEST_ERROR
+
+    /* create dataset */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED_SINGLE, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* close chunk plist */
+    if(H5Pclose(pid) < 0) TEST_ERROR
+
+    /* close dataspace */
+    if(H5Sclose(sid) < 0) TEST_ERROR
+
+    /* attach attributes to the dataset */
+    if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
+
+    /* close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
     /* Set 2-D dataspace dimensions */
     dim2d[0] = DIM_SIZE_1;
     dim2d[1] = DIM_SIZE_2;
@@ -2670,6 +3012,19 @@ test_copy_dataset_chunked_empty(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl,
     /* create dataset */
     if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED2, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
 
+    /* attach attributes to the dataset */
+    if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
+
+    /* close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+
+    /* Set allocation time to early */
+    if(H5Pset_alloc_time(pid, H5D_ALLOC_TIME_EARLY) < 0) TEST_ERROR
+
+    /* create dataset */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED3, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+
     /* close chunk plist */
     if(H5Pclose(pid) < 0) TEST_ERROR
 
@@ -2682,29 +3037,120 @@ test_copy_dataset_chunked_empty(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl,
     /* close the dataset */
     if(H5Dclose(did) < 0) TEST_ERROR
 
-    /* close the SRC file */
-    if(H5Fclose(fid_src) < 0) TEST_ERROR
 
+    /* 
+     * create 2-D dataset: chunked, empty, non-filtered,
+     *			   dims=chunk dims, H5D_ALLOC_TIME_INC (default)
+     */
 
-    /* open the source file with read-only */
-    if((fid_src = H5Fopen(src_filename, H5F_ACC_RDONLY, src_fapl)) < 0) TEST_ERROR
-
-    /* create destination file */
-    if((fid_dst = H5Fcreate(dst_filename, H5F_ACC_TRUNC, fcpl_dst, dst_fapl)) < 0) TEST_ERROR
+    /* Set 2-D dataspace dimensions */
+    dim2d[0] = DIM_SIZE_1;
+    dim2d[1] = DIM_SIZE_2;
+
+    /* create 2-D dataspace */
+    if((sid = H5Screate_simple(2, dim2d, NULL)) < 0) TEST_ERROR
+
+    /* create and set chunk plist */
+    if((pid = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
+    if(H5Pset_chunk(pid, 2, dim2d) < 0) TEST_ERROR
+
+    /* create dataset */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED2_SINGLE, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* attach attributes to the dataset */
+    if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
+
+    /* close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+    /* 
+     * create 2-D dataset: chunked, empty, non-filtered, dims=chunk dims
+     *			   H5D_ALLOC_TIME_EARLY
+     */
+    /* Set allocation time to early */
+    if(H5Pset_alloc_time(pid, H5D_ALLOC_TIME_EARLY) < 0) TEST_ERROR
+
+    /* create dataset */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED3_SINGLE, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* close chunk plist */
+    if(H5Pclose(pid) < 0) TEST_ERROR
+
+    /* close dataspace */
+    if(H5Sclose(sid) < 0) TEST_ERROR
+
+    /* attach attributes to the dataset */
+    if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
+
+    /* close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+    /* 
+     * create 2-D dataset: chunked, empty, non-filtered, 
+     *			   dims=max dims=chunk dims, H5D_ALLOC_TIME_LATE
+     */
+
+    /* Set 2-D dataspace dimensions */
+    dim2d[0] = DIM_SIZE_1;
+    dim2d[1] = DIM_SIZE_2;
+
+    /* create 2-D dataspace */
+    if((sid = H5Screate_simple(2, dim2d, dim2d)) < 0) TEST_ERROR
+
+    /* create and set chunk plist */
+    if((pid = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
+    if(H5Pset_chunk(pid, 2, dim2d) < 0) TEST_ERROR
+
+    /* Set allocation time to late */
+    if(H5Pset_alloc_time(pid, H5D_ALLOC_TIME_LATE) < 0) TEST_ERROR
+
+    /* create dataset */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED4_SINGLE, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* attach attributes to the dataset */
+    if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
+
+    /* close chunk plist */
+    if(H5Pclose(pid) < 0) TEST_ERROR
+
+    /* close dataspace */
+    if(H5Sclose(sid) < 0) TEST_ERROR
+
+    /* close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+    /* close the SRC file */
+    if(H5Fclose(fid_src) < 0) TEST_ERROR
+
+
+    /* open the source file with read-only */
+    if((fid_src = H5Fopen(src_filename, H5F_ACC_RDONLY, src_fapl)) < 0) TEST_ERROR
+
+    /* create destination file */
+    if((fid_dst = H5Fcreate(dst_filename, H5F_ACC_TRUNC, fcpl_dst, dst_fapl)) < 0) TEST_ERROR
 
     /* Create an uncopied object in destination file so that addresses in source and destination files aren't the same */
     if(H5Gclose(H5Gcreate2(fid_dst, NAME_GROUP_UNCOPIED, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
 
     /* copy the datasets from SRC to DST */
     if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED, fid_dst, NAME_DATASET_CHUNKED, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+    if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED_SINGLE, fid_dst, NAME_DATASET_CHUNKED_SINGLE, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
     if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED2, fid_dst, NAME_DATASET_CHUNKED2, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+    if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED2_SINGLE, fid_dst, NAME_DATASET_CHUNKED2_SINGLE, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+    if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED3, fid_dst, NAME_DATASET_CHUNKED3, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+    if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED3_SINGLE, fid_dst, NAME_DATASET_CHUNKED3_SINGLE, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+    if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED4_SINGLE, fid_dst, NAME_DATASET_CHUNKED4_SINGLE, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
 
-    /* open the dataset for copy */
+    /* open the dataset NAME_DATASET_CHUNKED in SRC file */
     if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED, H5P_DEFAULT)) < 0) TEST_ERROR
 
-    /* open the destination dataset */
+    /* open the copied dataset NAME_DATASET_CHUNKED at destination */
     if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED, H5P_DEFAULT)) < 0) TEST_ERROR
 
+    /* Check if the array index type is correct */
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_EARRAY, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
     /* Check if the datasets are equal */
     if(compare_datasets(did, did2, H5P_DEFAULT, NULL) != TRUE) TEST_ERROR
 
@@ -2714,12 +3160,113 @@ test_copy_dataset_chunked_empty(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl,
     /* close the source dataset */
     if(H5Dclose(did) < 0) TEST_ERROR
 
-    /* open the dataset for copy */
+    /* open the dataset NAME_DATASET_CHUNKED_SINGLE in SRC file */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* open the copied dataset NAME_DATASET_CHUNKED_SINGLE at destination */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* Check if the array index type is correct */
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_SINGLE, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
+    /* Check if the datasets are equal */
+    if(compare_datasets(did, did2, H5P_DEFAULT, NULL) != TRUE) TEST_ERROR
+
+    /* close the destination dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* close the source dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+    /* open the dataset NAME_DATASET_CHUNKED2 in SRC file */
     if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED2, H5P_DEFAULT)) < 0) TEST_ERROR
 
-    /* open the destination dataset */
+    /* open the copied dataset NAME_DATASET_CHUNKED2 at destination */
     if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED2, H5P_DEFAULT)) < 0) TEST_ERROR
 
+    /* Check if the array index type is correct */
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_FARRAY, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
+    /* Check if the datasets are equal */
+    if(compare_datasets(did, did2, H5P_DEFAULT, NULL) != TRUE) TEST_ERROR
+
+    /* close the destination dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* close the source dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+    /* open the dataset "NAME_DATASET_CHUNKED2_SINGLE in SRC file */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED2_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* open the copied dataset NAME_DATASET_CHUNKED2_SINGLE at destination */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED2_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* Check if the array index type is correct */
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_SINGLE, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
+    /* Check if the datasets are equal */
+    if(compare_datasets(did, did2, H5P_DEFAULT, NULL) != TRUE) TEST_ERROR
+
+    /* close the destination dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* close the source dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+
+    /* open the dataset NAME_DATASET_CHUNKED3 in SRC file */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED3, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* open the copied dataset NAME_DATASET_CHUNKED3 at destinaion */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED3, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* Check if the array index type is correct */
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_NONE, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
+    /* Check if the datasets are equal */
+    if(compare_datasets(did, did2, H5P_DEFAULT, NULL) != TRUE) TEST_ERROR
+
+    /* close the destination dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* close the source dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+
+    /* open the dataset NAME_DATASET_CHUNKED3_SINGLE in SRC file */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED3_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* open the copied dataset NAME_DATASET_CHUNKED3_SINGLE at destination */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED3_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* Check if the array index type is correct */
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_SINGLE, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
+    /* Check if the datasets are equal */
+    if(compare_datasets(did, did2, H5P_DEFAULT, NULL) != TRUE) TEST_ERROR
+
+    /* close the destination dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* close the source dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+    /* open the dataset NAME_DATASET_CHUNKED4_SINGLE in SRC file */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED4_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* open the copied dataset NAME_DATASET_CHUNKED4_SINGLE at destination */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED4_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* Check if the array index type is correct */
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_SINGLE, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
     /* Check if the datasets are equal */
     if(compare_datasets(did, did2, H5P_DEFAULT, NULL) != TRUE) TEST_ERROR
 
@@ -2786,92 +3333,463 @@ test_copy_dataset_chunked_sparse(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl,
     char src_filename[NAME_BUF_SIZE];
     char dst_filename[NAME_BUF_SIZE];
 
-    TESTING("H5Ocopy(): sparse dataset");
+    TESTING("H5Ocopy(): sparse dataset");
+
+    /* set initial data values */
+    for(i = 0; i < DIM_SIZE_1; i++) {
+        buf1d[i] = (float)i / 10.0F;
+        for(j = 0; j < DIM_SIZE_2; j++)
+            buf2d[i][j] = (float)i + ((float)j / 100.0F);
+    } /* end for */
+
+    /* Initialize the filenames */
+    h5_fixname(FILENAME[0], src_fapl, src_filename, sizeof src_filename);
+    h5_fixname(FILENAME[1], dst_fapl, dst_filename, sizeof dst_filename);
+
+    /* Reset file address checking info */
+    addr_reset();
+
+    /* create source file */
+    if((fid_src = H5Fcreate(src_filename, H5F_ACC_TRUNC, fcpl_src, src_fapl)) < 0) TEST_ERROR
+
+    /* Set 1-D dataspace dimensions */
+    dim1d[0]=DIM_SIZE_1;
+    max_dim1d[0]=H5S_UNLIMITED;
+
+    /* create 1-D dataspace */
+    if((sid = H5Screate_simple(1, dim1d, max_dim1d)) < 0) TEST_ERROR
+
+    /* create and set chunk plist */
+    if((pid = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
+    if(H5Pset_chunk(pid, 1, chunk_dim1d) < 0) TEST_ERROR
+
+    /* create dataset */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* write data into file */
+    if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf1d) < 0) TEST_ERROR
+
+    /* close dataspace */
+    if(H5Sclose(sid) < 0) TEST_ERROR
+
+    /* Set extended dataset dimensions */
+    new_dim1d[0] = DIM_SIZE_1 * 2;
+
+    /* Extend dataset's dimensions */
+    if(H5Dset_extent(did, new_dim1d) < 0) TEST_ERROR
+
+    /* attach attributes to the dataset */
+    if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
+
+    /* close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+
+    /* Change 1-D dataspace dimensions */
+    dim1d[0] = DIM_SIZE_1;
+    max_dim1d[0] = MAX_DIM_SIZE_1;
+
+    /* create 1-D dataspace */
+    if((sid = H5Screate_simple(1, dim1d, max_dim1d)) < 0) TEST_ERROR
+
+    /* Set allocation time to early */
+    if(H5Pset_alloc_time(pid, H5D_ALLOC_TIME_EARLY) < 0) TEST_ERROR
+
+    /* create dataset */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED3, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* close chunk plist */
+    if(H5Pclose(pid) < 0) TEST_ERROR
+
+    /* write data into file */
+    if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf1d) < 0) TEST_ERROR
+
+    /* close dataspace */
+    if(H5Sclose(sid) < 0) TEST_ERROR
+
+    /* Set extended dataset dimensions */
+    new_dim1d[0] = DIM_SIZE_1 * 2;
+
+    /* Extend dataset's dimensions */
+    if(H5Dset_extent(did, new_dim1d) < 0) TEST_ERROR
+
+    /* attach attributes to the dataset */
+    if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
+
+    /* close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+
+    /* Set 2-D dataspace dimensions */
+    dim2d[0]=DIM_SIZE_1;
+    dim2d[1]=DIM_SIZE_2;
+    max_dim2d[0]=H5S_UNLIMITED;
+    max_dim2d[1]=H5S_UNLIMITED;
+
+    /* create 2-D dataspace */
+    if((sid = H5Screate_simple(2, dim2d, max_dim2d)) < 0) TEST_ERROR
+
+    /* create and set chunk plist */
+    if((pid = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
+    if(H5Pset_chunk(pid, 2, chunk_dim2d) < 0) TEST_ERROR
+
+    /* create dataset */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED2, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* write data into file */
+    if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf2d) < 0) TEST_ERROR
+
+    /* close dataspace */
+    if(H5Sclose(sid) < 0) TEST_ERROR
+
+    /* Set extended dataset dimensions */
+    new_dim2d[0] = DIM_SIZE_1 * 2;
+    new_dim2d[1] = DIM_SIZE_2 * 2;
+
+    /* Extend dataset's dimensions */
+    if(H5Dset_extent(did, new_dim2d) < 0) TEST_ERROR
+
+    /* attach attributes to the dataset */
+    if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
+
+    /* close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+
+    /* Change 2-D dataspace dimensions */
+    dim2d[0] = DIM_SIZE_1;
+    dim2d[1] = DIM_SIZE_2;
+    max_dim2d[0] = MAX_DIM_SIZE_1;
+    max_dim2d[1] = MAX_DIM_SIZE_2;
+
+    /* create 2-D dataspace */
+    if((sid = H5Screate_simple(2, dim2d, max_dim2d)) < 0) TEST_ERROR
+
+    /* Set allocation time to early */
+    if(H5Pset_alloc_time(pid, H5D_ALLOC_TIME_EARLY) < 0) TEST_ERROR
+
+    /* create dataset */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED4, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* close chunk plist */
+    if(H5Pclose(pid) < 0) TEST_ERROR
+
+    /* write data into file */
+    if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf2d) < 0) TEST_ERROR
+
+    /* close dataspace */
+    if(H5Sclose(sid) < 0) TEST_ERROR
+
+    /* Set extended dataset dimensions */
+    new_dim2d[0] = DIM_SIZE_1 * 2;
+    new_dim2d[1] = DIM_SIZE_2 * 2;
+
+    /* Extend dataset's dimensions */
+    if(H5Dset_extent(did, new_dim2d) < 0) TEST_ERROR
+
+    /* attach attributes to the dataset */
+    if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
+
+    /* close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+
+    /* close the SRC file */
+    if(H5Fclose(fid_src) < 0) TEST_ERROR
+
+
+    /* open the source file with read-only */
+    if((fid_src = H5Fopen(src_filename, H5F_ACC_RDONLY, src_fapl)) < 0) TEST_ERROR
+
+    /* create destination file */
+    if((fid_dst = H5Fcreate(dst_filename, H5F_ACC_TRUNC, fcpl_dst, dst_fapl)) < 0) TEST_ERROR
+
+    /* Create an uncopied object in destination file so that addresses in source and destination files aren't the same */
+    if(H5Gclose(H5Gcreate2(fid_dst, NAME_GROUP_UNCOPIED, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* copy the datasets from SRC to DST */
+    if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED, fid_dst, NAME_DATASET_CHUNKED, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+    if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED2, fid_dst, NAME_DATASET_CHUNKED2, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+    if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED3, fid_dst, NAME_DATASET_CHUNKED3, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+    if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED4, fid_dst, NAME_DATASET_CHUNKED4, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+
+    /* open the dataset for copy */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* open the destination dataset */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* Check if the array index type is correct */
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_EARRAY, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
+    /* Check if the datasets are equal */
+    if(compare_datasets(did, did2, H5P_DEFAULT, NULL) != TRUE) TEST_ERROR
+
+    /* close the destination dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* close the source dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+
+    /* open the dataset for copy */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED2, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* open the destination dataset */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED2, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* Check if the array index type is correct */
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_BT2, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
+    /* Check if the datasets are equal */
+    if(compare_datasets(did, did2, H5P_DEFAULT, NULL) != TRUE) TEST_ERROR
+
+    /* close the destination dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* close the source dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+
+    /* open the dataset for copy */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED3, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* open the destination dataset */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED3, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* Check if the array index type is correct */
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_NONE, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
+    /* Check if the datasets are equal */
+    if(compare_datasets(did, did2, H5P_DEFAULT, NULL) != TRUE) TEST_ERROR
+
+    /* close the destination dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* close the source dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+
+    /* open the dataset for copy */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED4, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* open the destination dataset */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED4, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* Check if the array index type is correct */
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_NONE, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
+    /* Check if the datasets are equal */
+    if(compare_datasets(did, did2, H5P_DEFAULT, NULL) != TRUE) TEST_ERROR
+
+    /* close the destination dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* close the source dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+
+    /* close the SRC file */
+    if(H5Fclose(fid_src) < 0) TEST_ERROR
+
+    /* close the DST file */
+    if(H5Fclose(fid_dst) < 0) TEST_ERROR
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+    	H5Dclose(did2);
+    	H5Dclose(did);
+    	H5Pclose(pid);
+    	H5Sclose(sid);
+    	H5Fclose(fid_dst);
+    	H5Fclose(fid_src);
+    } H5E_END_TRY;
+    return 1;
+} /* end test_copy_dataset_chunked_sparse */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    test_copy_dataset_compressed
+ *
+ * Purpose:     Create a compressed, chunked dataset in SRC file and copy it to DST file
+ *
+ * Return:      Success:        0
+ *              Failure:        number of errors
+ *
+ * Programmer:  Quincey Koziol
+ *              Monday, October 31, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_copy_dataset_compressed(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t dst_fapl)
+{
+#ifdef H5_HAVE_FILTER_DEFLATE
+    hid_t fid_src = -1, fid_dst = -1;           /* File IDs */
+    hid_t sid = -1;                             /* Dataspace ID */
+    hid_t pid = -1;                             /* Dataset creation property list ID */
+    hid_t did = -1, did2 = -1;                  /* Dataset IDs */
+    hsize_t dim2d[2];                           /* Dataset dimensions */
+    hsize_t chunk_dim2d[2] ={CHUNK_SIZE_1, CHUNK_SIZE_2};             /* Chunk dimensions */
+    float buf[DIM_SIZE_1][DIM_SIZE_2];          /* Buffer for writing data */
+    int i, j;                                   /* Local index variables */
+    char src_filename[NAME_BUF_SIZE];
+    char dst_filename[NAME_BUF_SIZE];
+#endif /* H5_HAVE_FILTER_DEFLATE */
+
+    TESTING("H5Ocopy(): compressed dataset");
+
+#ifndef H5_HAVE_FILTER_DEFLATE
+    SKIPPED();
+    puts("    Deflation filter not available");
+#else /* H5_HAVE_FILTER_DEFLATE */
+    /* set initial data values */
+    for (i=0; i<DIM_SIZE_1; i++)
+        for (j=0; j<DIM_SIZE_2; j++)
+            buf[i][j] = 100.0F;         /* Something easy to compress */
+
+    /* Initialize the filenames */
+    h5_fixname(FILENAME[0], src_fapl, src_filename, sizeof src_filename);
+    h5_fixname(FILENAME[1], dst_fapl, dst_filename, sizeof dst_filename);
+
+    /* Reset file address checking info */
+    addr_reset();
+
+    /* create source file */
+    if((fid_src = H5Fcreate(src_filename, H5F_ACC_TRUNC, fcpl_src, src_fapl)) < 0) TEST_ERROR
+
+    /* Set dataspace dimensions */
+    dim2d[0] = DIM_SIZE_1;
+    dim2d[1] = DIM_SIZE_2;
+
+    /* create dataspace */
+    if((sid = H5Screate_simple(2, dim2d, NULL)) < 0) TEST_ERROR
+
+    /* create and set comp & chunk plist */
+    if((pid = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
+    if(H5Pset_chunk(pid, 2, chunk_dim2d) < 0) TEST_ERROR
+    if(H5Pset_deflate(pid, 9) < 0) TEST_ERROR
+
+    /* create dataset */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* write data into file */
+    if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) TEST_ERROR
+
+    /* attach attributes to the dataset */
+    if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
+
+    /* close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
 
-    /* set initial data values */
-    for(i = 0; i < DIM_SIZE_1; i++) {
-        buf1d[i] = (float)(i / 10.0F);
-        for(j = 0; j < DIM_SIZE_2; j++)
-            buf2d[i][j] = (float)(i + (j / 100.0F));
-    } /* end for */
+    /* Set allocation time to early */
+    if(H5Pset_alloc_time(pid, H5D_ALLOC_TIME_EARLY) < 0) TEST_ERROR
 
-    /* Initialize the filenames */
-    h5_fixname(FILENAME[0], src_fapl, src_filename, sizeof src_filename);
-    h5_fixname(FILENAME[1], dst_fapl, dst_filename, sizeof dst_filename);
+    /* create dataset */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED2, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
 
-    /* Reset file address checking info */
-    addr_reset();
+    /* close chunk plist */
+    if(H5Pclose(pid) < 0) TEST_ERROR
 
-    /* create source file */
-    if((fid_src = H5Fcreate(src_filename, H5F_ACC_TRUNC, fcpl_src, src_fapl)) < 0) TEST_ERROR
+    /* write data into file */
+    if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) TEST_ERROR
 
-    /* Set 1-D dataspace dimensions */
-    dim1d[0]=DIM_SIZE_1;
-    max_dim1d[0]=H5S_UNLIMITED;
+    /* close dataspace */
+    if(H5Sclose(sid) < 0) TEST_ERROR
 
-    /* create 1-D dataspace */
-    if((sid = H5Screate_simple(1, dim1d, max_dim1d)) < 0) TEST_ERROR
+    /* attach attributes to the dataset */
+    if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
 
-    /* create and set chunk plist */
+    /* close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+    /* 
+     * create 2-D dataset: chunked, filtered, with data
+     *			   dims=max dims=chunk dims, H5D_ALLOC_TIME_INC(default)
+     */
+    /* create dataspace */
+    if((sid = H5Screate_simple(2, dim2d, dim2d)) < 0) TEST_ERROR
+
+    /* create and set comp & chunk plist */
     if((pid = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
-    if(H5Pset_chunk(pid, 1, chunk_dim1d) < 0) TEST_ERROR
+    if(H5Pset_chunk(pid, 2, dim2d) < 0) TEST_ERROR
+    if(H5Pset_deflate(pid, 9) < 0) TEST_ERROR
 
     /* create dataset */
-    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED2_SINGLE, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* write data into file */
+    if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) TEST_ERROR
+
+    /* attach attributes to the dataset */
+    if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
+
+    /* close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+    /* 
+     * create 2-D dataset: chunked, filtered, with data
+     *			   dims=chunk dims, H5D_ALLOC_TIME_EARLY
+     */
+    /* create dataspace */
+    if((sid = H5Screate_simple(2, dim2d, NULL)) < 0) TEST_ERROR
+
+    /* Set allocation time to early */
+    if(H5Pset_alloc_time(pid, H5D_ALLOC_TIME_EARLY) < 0) TEST_ERROR
+
+    /* create dataset */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED3_SINGLE, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
 
     /* close chunk plist */
     if(H5Pclose(pid) < 0) TEST_ERROR
 
     /* write data into file */
-    if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf1d) < 0) TEST_ERROR
+    if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) TEST_ERROR
 
     /* close dataspace */
     if(H5Sclose(sid) < 0) TEST_ERROR
 
-    /* Set extended dataset dimensions */
-    new_dim1d[0] = DIM_SIZE_1 * 2;
-
-    /* Extend dataset's dimensions */
-    if(H5Dset_extent(did, new_dim1d) < 0) TEST_ERROR
-
     /* attach attributes to the dataset */
     if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
 
     /* close the dataset */
     if(H5Dclose(did) < 0) TEST_ERROR
 
-    /* Set 2-D dataspace dimensions */
-    dim2d[0]=DIM_SIZE_1;
-    dim2d[1]=DIM_SIZE_2;
-    max_dim2d[0]=H5S_UNLIMITED;
-    max_dim2d[1]=H5S_UNLIMITED;
-
-    /* create 2-D dataspace */
-    if((sid = H5Screate_simple(2, dim2d, max_dim2d)) < 0) TEST_ERROR
+    /* 
+     * create 2-D dataset: chunked, filtered, with data
+     *			   dims=chunk dims, H5D_ALLOC_TIME_LATE
+     */
+    /* create dataspace */
+    if((sid = H5Screate_simple(2, dim2d, NULL)) < 0) TEST_ERROR
 
-    /* create and set chunk plist */
+    /* create and set comp & chunk plist */
     if((pid = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
-    if(H5Pset_chunk(pid, 2, chunk_dim2d) < 0) TEST_ERROR
+    if(H5Pset_chunk(pid, 2, dim2d) < 0) TEST_ERROR
+    if(H5Pset_deflate(pid, 9) < 0) TEST_ERROR
+
+    /* Set allocation time to late */
+    if(H5Pset_alloc_time(pid, H5D_ALLOC_TIME_LATE) < 0) TEST_ERROR
 
     /* create dataset */
-    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED2, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED4_SINGLE, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
 
     /* close chunk plist */
     if(H5Pclose(pid) < 0) TEST_ERROR
 
     /* write data into file */
-    if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf2d) < 0) TEST_ERROR
+    if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) TEST_ERROR
 
     /* close dataspace */
     if(H5Sclose(sid) < 0) TEST_ERROR
 
-    /* Set extended dataset dimensions */
-    new_dim2d[0] = DIM_SIZE_1 * 2;
-    new_dim2d[1] = DIM_SIZE_2 * 2;
-
-    /* Extend dataset's dimensions */
-    if(H5Dset_extent(did, new_dim2d) < 0) TEST_ERROR
-
     /* attach attributes to the dataset */
     if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
 
@@ -2891,9 +3809,19 @@ test_copy_dataset_chunked_sparse(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl,
     /* Create an uncopied object in destination file so that addresses in source and destination files aren't the same */
     if(H5Gclose(H5Gcreate2(fid_dst, NAME_GROUP_UNCOPIED, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
 
-    /* copy the datasets from SRC to DST */
+    /* copy the dataset from SRC to DST */
     if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED, fid_dst, NAME_DATASET_CHUNKED, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
     if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED2, fid_dst, NAME_DATASET_CHUNKED2, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+    if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED2_SINGLE, fid_dst, NAME_DATASET_CHUNKED2_SINGLE, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+    if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED3_SINGLE, fid_dst, NAME_DATASET_CHUNKED3_SINGLE, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+    if(H5Ocopy(fid_src, NAME_DATASET_CHUNKED4_SINGLE, fid_dst, NAME_DATASET_CHUNKED4_SINGLE, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+
+    if(H5Fclose(fid_dst) < 0) TEST_ERROR
+    if(H5Fclose(fid_src) < 0) TEST_ERROR
+
+    /* Re-open the source and destination files for verification */
+    if((fid_src = H5Fopen(src_filename, H5F_ACC_RDONLY, src_fapl)) < 0) TEST_ERROR
+    if((fid_dst = H5Fopen(dst_filename, H5F_ACC_RDONLY, dst_fapl)) < 0) TEST_ERROR
 
     /* open the dataset for copy */
     if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED, H5P_DEFAULT)) < 0) TEST_ERROR
@@ -2901,6 +3829,9 @@ test_copy_dataset_chunked_sparse(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl,
     /* open the destination dataset */
     if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED, H5P_DEFAULT)) < 0) TEST_ERROR
 
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_FARRAY, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
     /* Check if the datasets are equal */
     if(compare_datasets(did, did2, H5P_DEFAULT, NULL) != TRUE) TEST_ERROR
 
@@ -2910,12 +3841,70 @@ test_copy_dataset_chunked_sparse(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl,
     /* close the source dataset */
     if(H5Dclose(did) < 0) TEST_ERROR
 
+
     /* open the dataset for copy */
     if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED2, H5P_DEFAULT)) < 0) TEST_ERROR
 
     /* open the destination dataset */
     if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED2, H5P_DEFAULT)) < 0) TEST_ERROR
 
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_FARRAY, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
+    /* Check if the datasets are equal */
+    if(compare_datasets(did, did2, H5P_DEFAULT, NULL) != TRUE) TEST_ERROR
+
+    /* close the destination dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* close the source dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+    /* open the dataset NAME_DATASET_CHUNKED2_SINGLE at source */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED2_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* open the copied dataset NAME_DATASET_CHUNKED2_SINGLE at destination */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED2_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_SINGLE, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
+    /* Check if the datasets are equal */
+    if(compare_datasets(did, did2, H5P_DEFAULT, NULL) != TRUE) TEST_ERROR
+
+    /* close the destination dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* close the source dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+    /* open the dataset NAME_DATASET_CHUNKED3_SINGLE at source */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED3_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* open the copied dataset NAME_DATASET_CHUNKED3_SINGLE at destination */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED3_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_SINGLE, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
+    /* Check if the datasets are equal */
+    if(compare_datasets(did, did2, H5P_DEFAULT, NULL) != TRUE) TEST_ERROR
+
+    /* close the destination dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* close the source dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+    /* open the dataset NAME_DATASET_CHUNKED4_SINGLE at source */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_CHUNKED4_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* open the copied dataset NAME_DATASET_CHUNKED4_SINGLE at destination */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED4_SINGLE, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_SINGLE, H5D_CHUNK_IDX_BTREE) != TRUE)
+	TEST_ERROR
+
     /* Check if the datasets are equal */
     if(compare_datasets(did, did2, H5P_DEFAULT, NULL) != TRUE) TEST_ERROR
 
@@ -2932,8 +3921,10 @@ test_copy_dataset_chunked_sparse(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl,
     if(H5Fclose(fid_dst) < 0) TEST_ERROR
 
     PASSED();
+#endif /* H5_HAVE_FILTER_DEFLATE */
     return 0;
 
+#ifdef H5_HAVE_FILTER_DEFLATE
 error:
     H5E_BEGIN_TRY {
     	H5Dclose(did2);
@@ -2944,24 +3935,28 @@ error:
     	H5Fclose(fid_src);
     } H5E_END_TRY;
     return 1;
-} /* end test_copy_dataset_chunked_sparse */
+#endif /* H5_HAVE_FILTER_DEFLATE */
+} /* end test_copy_dataset_compressed */
 
 

 /*-------------------------------------------------------------------------
- * Function:    test_copy_dataset_compressed
+ * Function:    test_copy_dataset_no_edge_filt
  *
  * Purpose:     Create a compressed, chunked dataset in SRC file and copy it to DST file
  *
  * Return:      Success:        0
  *              Failure:        number of errors
  *
- * Programmer:  Quincey Koziol
- *              Monday, October 31, 2005
+ * Programmer:  Neil Fortner
+ *              Tuesday, May 11, 2010
+ *              Mostly copied from test_copy_dataset_compressed, by
+ *              Quincey Koziol
  *
  *-------------------------------------------------------------------------
  */
 static int
-test_copy_dataset_compressed(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t dst_fapl)
+test_copy_dataset_no_edge_filt(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl,
+    hid_t dst_fapl)
 {
 #ifdef H5_HAVE_FILTER_DEFLATE
     hid_t fid_src = -1, fid_dst = -1;           /* File IDs */
@@ -2976,7 +3971,7 @@ test_copy_dataset_compressed(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid
     char dst_filename[NAME_BUF_SIZE];
 #endif /* H5_HAVE_FILTER_DEFLATE */
 
-    TESTING("H5Ocopy(): compressed dataset");
+    TESTING("H5Ocopy(): compressed dataset with no edge filters");
 
 #ifndef H5_HAVE_FILTER_DEFLATE
     SKIPPED();
@@ -3004,10 +3999,11 @@ test_copy_dataset_compressed(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid
     /* create dataspace */
     if((sid = H5Screate_simple(2, dim2d, NULL)) < 0) TEST_ERROR
 
-    /* create and set comp & chunk plist */
+    /* create and set comp & chunk plist, and disable partial chunk filters */
     if((pid = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
     if(H5Pset_chunk(pid, 2, chunk_dim2d) < 0) TEST_ERROR
     if(H5Pset_deflate(pid, 9) < 0) TEST_ERROR
+    if(H5Pset_chunk_opts(pid, H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS) < 0) TEST_ERROR
 
     /* create dataset */
     if((did = H5Dcreate2(fid_src, NAME_DATASET_CHUNKED, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
@@ -3049,6 +4045,10 @@ test_copy_dataset_compressed(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid
     /* open the destination dataset */
     if((did2 = H5Dopen2(fid_dst, NAME_DATASET_CHUNKED, H5P_DEFAULT)) < 0) TEST_ERROR
 
+    /* H5Pset_chunk_opts() will set layout version to 4 which will use latest indexing available */
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_FARRAY, H5D_CHUNK_IDX_FARRAY) != TRUE)
+        TEST_ERROR
+
     /* Check if the datasets are equal */
     if(compare_datasets(did, did2, H5P_DEFAULT, NULL) != TRUE) TEST_ERROR
 
@@ -3071,16 +4071,16 @@ test_copy_dataset_compressed(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid
 #ifdef H5_HAVE_FILTER_DEFLATE
 error:
     H5E_BEGIN_TRY {
-    	H5Dclose(did2);
-    	H5Dclose(did);
-    	H5Pclose(pid);
-    	H5Sclose(sid);
-    	H5Fclose(fid_dst);
-    	H5Fclose(fid_src);
+        H5Dclose(did2);
+        H5Dclose(did);
+        H5Pclose(pid);
+        H5Sclose(sid);
+        H5Fclose(fid_dst);
+        H5Fclose(fid_src);
     } H5E_END_TRY;
     return 1;
 #endif /* H5_HAVE_FILTER_DEFLATE */
-} /* end test_copy_dataset_compressed */
+} /* end test_copy_dataset_no_edge_filt */
 
 

 /*-------------------------------------------------------------------------
@@ -3114,7 +4114,7 @@ test_copy_dataset_compact(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t
     /* set initial data values */
     for (i=0; i<DIM_SIZE_1; i++)
         for (j=0; j<DIM_SIZE_2; j++)
-            buf[i][j] = (float)(i+j/100.0F);
+            buf[i][j] = (float)i + (float)j / 100.0F;
 
     /* Initialize the filenames */
     h5_fixname(FILENAME[0], src_fapl, src_filename, sizeof src_filename);
@@ -4203,6 +5203,19 @@ test_copy_dataset_chunked_vl(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid
     /* create dataset at SRC file */
     if((did = H5Dcreate2(fid_src, NAME_DATASET_VL, tid, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
 
+    /* write data into file */
+    if(H5Dwrite(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) TEST_ERROR
+
+    /* close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+
+    /* Set allocation time to early */
+    if(H5Pset_alloc_time(pid, H5D_ALLOC_TIME_EARLY) < 0) TEST_ERROR
+
+    /* create dataset at SRC file */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_VL2, tid, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+
     /* close chunk plist */
     if(H5Pclose(pid) < 0) TEST_ERROR
 
@@ -4212,6 +5225,7 @@ test_copy_dataset_chunked_vl(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid
     /* close the dataset */
     if(H5Dclose(did) < 0) TEST_ERROR
 
+
     /* close the SRC file */
     if(H5Fclose(fid_src) < 0) TEST_ERROR
 
@@ -4227,6 +5241,7 @@ test_copy_dataset_chunked_vl(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid
 
     /* copy the dataset from SRC to DST */
     if(H5Ocopy(fid_src, NAME_DATASET_VL, fid_dst, NAME_DATASET_VL, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+    if(H5Ocopy(fid_src, NAME_DATASET_VL2, fid_dst, NAME_DATASET_VL2, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
 
     /* open the dataset for copy */
     if((did = H5Dopen2(fid_src, NAME_DATASET_VL, H5P_DEFAULT)) < 0) TEST_ERROR
@@ -4234,6 +5249,28 @@ test_copy_dataset_chunked_vl(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid
     /* open the destination dataset */
     if((did2 = H5Dopen2(fid_dst, NAME_DATASET_VL, H5P_DEFAULT)) < 0) TEST_ERROR
 
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_FARRAY, H5D_CHUNK_IDX_BTREE) != TRUE)
+        TEST_ERROR
+
+    /* Check if the datasets are equal */
+    if(compare_datasets(did, did2, H5P_DEFAULT, buf) != TRUE) TEST_ERROR
+
+    /* close the destination dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* close the source dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+
+    /* open the dataset for copy */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_VL2, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* open the destination dataset */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_VL2, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_NONE, H5D_CHUNK_IDX_BTREE) != TRUE)
+        TEST_ERROR
+
     /* Check if the datasets are equal */
     if(compare_datasets(did, did2, H5P_DEFAULT, buf) != TRUE) TEST_ERROR
 
@@ -4243,6 +5280,7 @@ test_copy_dataset_chunked_vl(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid
     /* close the source dataset */
     if(H5Dclose(did) < 0) TEST_ERROR
 
+
     /* close the SRC file */
     if(H5Fclose(fid_src) < 0) TEST_ERROR
 
@@ -6278,19 +7316,11 @@ test_copy_old_layout(hid_t fcpl_dst, hid_t fapl)
 {
     hid_t fid_src = -1, fid_dst = -1;           /* File IDs */
     hid_t did = -1, did2 = -1;                  /* Dataset IDs */
-    char *srcdir = HDgetenv("srcdir");  /* Where the src code is located */
-    char src_filename[NAME_BUF_SIZE] = "";
+    const char *src_filename = H5_get_srcdir_filename(FILE_OLD_LAYOUT); /* Corrected test file name */
     char dst_filename[NAME_BUF_SIZE];
 
     TESTING("H5Ocopy(): dataset with old layout format");
 
-    /* Generate correct name for source file by prepending the source path */
-    if(srcdir && ((HDstrlen(srcdir) + HDstrlen(FILE_OLD_LAYOUT) + 1) < sizeof(src_filename))) {
-        HDstrcpy(src_filename, srcdir);
-        HDstrcat(src_filename, "/");
-    } /* end if */
-    HDstrcat(src_filename, FILE_OLD_LAYOUT);
-
     /* Initialize the destination filename */
     h5_fixname(FILENAME[1], fapl, dst_filename, sizeof dst_filename);
 
@@ -7257,7 +8287,7 @@ static int
 test_copy_dataset_chunked_vl_vl(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t dst_fapl)
 {
     hid_t fid_src = -1, fid_dst = -1;           /* File IDs */
-    hid_t tid = -1, tid2=-1;       /* Datatype ID */
+    hid_t tid = -1, tid2=-1;       		/* Datatype ID */
     hid_t sid = -1;                             /* Dataspace ID */
     hid_t pid = -1;                             /* Dataset creation property list ID */
     hid_t did = -1, did2 = -1;                  /* Dataset IDs */
@@ -7313,7 +8343,7 @@ test_copy_dataset_chunked_vl_vl(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl,
     /* create nested VL datatype */
     if((tid2 = H5Tvlen_create(tid)) < 0) TEST_ERROR
 
-     /* create and set chunk plist */
+    /* create and set chunk plist */
     if((pid = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
     if(H5Pset_chunk(pid, 1, chunk_dim1d) < 0) TEST_ERROR
 
@@ -7323,12 +8353,26 @@ test_copy_dataset_chunked_vl_vl(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl,
     /* write data into file */
     if(H5Dwrite(did, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) TEST_ERROR
 
-    /* close compact plist */
+    /* close the dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+
+    /* Set allocation time to early */
+    if(H5Pset_alloc_time(pid, H5D_ALLOC_TIME_EARLY) < 0) TEST_ERROR
+
+    /* create dataset at SRC file */
+    if((did = H5Dcreate2(fid_src, NAME_DATASET_VL_VL2, tid2, sid, H5P_DEFAULT, pid, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* write data into file */
+    if(H5Dwrite(did, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) TEST_ERROR
+
+    /* close plist */
     if(H5Pclose(pid) < 0) TEST_ERROR
 
     /* close the dataset */
     if(H5Dclose(did) < 0) TEST_ERROR
 
+
     /* close the SRC file */
     if(H5Fclose(fid_src) < 0) TEST_ERROR
 
@@ -7343,6 +8387,7 @@ test_copy_dataset_chunked_vl_vl(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl,
 
     /* copy the dataset from SRC to DST */
     if(H5Ocopy(fid_src, NAME_DATASET_VL_VL, fid_dst, NAME_DATASET_VL_VL, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
+    if(H5Ocopy(fid_src, NAME_DATASET_VL_VL2, fid_dst, NAME_DATASET_VL_VL2, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
 
     /* open the dataset for copy */
     if((did = H5Dopen2(fid_src, NAME_DATASET_VL_VL, H5P_DEFAULT)) < 0) TEST_ERROR
@@ -7350,6 +8395,28 @@ test_copy_dataset_chunked_vl_vl(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl,
     /* open the destination dataset */
     if((did2 = H5Dopen2(fid_dst, NAME_DATASET_VL_VL, H5P_DEFAULT)) < 0) TEST_ERROR
 
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_FARRAY, H5D_CHUNK_IDX_BTREE) != TRUE)
+        TEST_ERROR
+
+    /* Check if the datasets are equal */
+    if(compare_datasets(did, did2, H5P_DEFAULT, buf) != TRUE) TEST_ERROR
+
+    /* close the destination dataset */
+    if(H5Dclose(did2) < 0) TEST_ERROR
+
+    /* close the source dataset */
+    if(H5Dclose(did) < 0) TEST_ERROR
+
+
+    /* open the dataset for copy */
+    if((did = H5Dopen2(fid_src, NAME_DATASET_VL_VL2, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    /* open the destination dataset */
+    if((did2 = H5Dopen2(fid_dst, NAME_DATASET_VL_VL2, H5P_DEFAULT)) < 0) TEST_ERROR
+
+    if(compare_idx_type(src_fapl, did2, H5D_CHUNK_IDX_NONE, H5D_CHUNK_IDX_BTREE) != TRUE)
+        TEST_ERROR
+
     /* Check if the datasets are equal */
     if(compare_datasets(did, did2, H5P_DEFAULT, buf) != TRUE) TEST_ERROR
 
@@ -7359,6 +8426,7 @@ test_copy_dataset_chunked_vl_vl(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl,
     /* close the source dataset */
     if(H5Dclose(did) < 0) TEST_ERROR
 
+
     /* close the SRC file */
     if(H5Fclose(fid_src) < 0) TEST_ERROR
 
@@ -7594,12 +8662,12 @@ test_copy_dataset_contig_cmpd_vl(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl,
 
     /* set initial data values */
     for(i = 0; i < DIM_SIZE_1; i++) {
-        buf[i].a = i * (i - 1);
+        buf[i].a = (int)(i * (i - 1));
         buf[i].b.len = i+1;
         buf[i].b.p = (int *)HDmalloc(buf[i].b.len * sizeof(int));
         for(j = 0; j < buf[i].b.len; j++)
             ((int *)buf[i].b.p)[j] = (int)(i * 10 + j);
-        buf[i].c = 1.0F / (i + 1.0F);
+        buf[i].c = 1.0F / ((float)i + 1.0F);
     } /* end for */
 
     /* Initialize the filenames */
@@ -7733,12 +8801,12 @@ test_copy_dataset_chunked_cmpd_vl(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl
 
     /* set initial data values */
     for(i = 0; i < DIM_SIZE_1; i++) {
-        buf[i].a = i * (i - 1);
+        buf[i].a = (int)(i * (i - 1));
         buf[i].b.len = i+1;
         buf[i].b.p = (int *)HDmalloc(buf[i].b.len * sizeof(int));
         for(j = 0; j < buf[i].b.len; j++)
             ((int *)buf[i].b.p)[j] = (int)(i * 10 + j);
-        buf[i].c = 1.0F / (i + 1.0F);
+        buf[i].c = 1.0F / ((float)i + 1.0F);
     } /* end for */
 
     /* Initialize the filenames */
@@ -7878,12 +8946,12 @@ test_copy_dataset_compact_cmpd_vl(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl
 
     /* set initial data values */
     for(i = 0; i < DIM_SIZE_1; i++) {
-        buf[i].a = i * (i - 1);
+        buf[i].a = (int)(i * (i - 1));
         buf[i].b.len = i+1;
         buf[i].b.p = (int *)HDmalloc(buf[i].b.len * sizeof(int));
         for(j = 0; j < buf[i].b.len; j++)
             ((int *)buf[i].b.p)[j] = (int)(i * 10 + j);
-        buf[i].c = 1.0F / (i + 1.0F);
+        buf[i].c = 1.0F / ((float)i + 1.0F);
     } /* end for */
 
     /* Initialize the filenames */
@@ -11880,9 +12948,11 @@ test_copy_dataset_open(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t dst
     hid_t tid = -1;                             /* Datatype ID */
     hid_t did = -1, did2 = -1;                  /* Dataset IDs */
     hid_t gid = -1, gid2 = -1;                  /* Group IDs */
+    hid_t ocpl = -1;                            /* Object copy property list ID */
     int buf[DIM_SIZE_1][DIM_SIZE_2];            /* Buffer for writing data */
     int newbuf[DIM_SIZE_1][DIM_SIZE_2];		/* Buffer for writing data */
     hsize_t dim2d[2];                           /* Dataset dimensions */
+    hbool_t copy_open_obj = TRUE;               /* Property to indicate we are copying open objects */
     int i, j;                                   /* local index variables */
     char src_filename[NAME_BUF_SIZE];
     char dst_filename[NAME_BUF_SIZE];
@@ -11931,6 +13001,18 @@ test_copy_dataset_open(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t dst
     /* attach attributes to the dataset */
     if(test_copy_attach_attributes(did, H5T_NATIVE_INT) < 0) TEST_ERROR
 
+
+    /* Create object copy property list, for passing private property to
+     *  dataset comparison routine
+     */
+    /* Create the object copy plist */
+    if((ocpl = H5Pcreate(H5P_OBJECT_COPY)) < 0) TEST_ERROR
+
+    /* Set the private property */
+    if(H5Pinsert2(ocpl, COPY_OPEN_OBJ_NAME, COPY_OPEN_OBJ_SIZE, &copy_open_obj, NULL, NULL, NULL, NULL, NULL, NULL) < 0) TEST_ERROR
+
+
+
     /* 
      * Test case 1 
      */
@@ -11945,7 +13027,7 @@ test_copy_dataset_open(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t dst
     if((did2 = H5Dopen2(fid_src, NAME_DATASET_SIMPLE2, H5P_DEFAULT)) < 0) TEST_ERROR
 
     /* Check if the datasets are equal */
-    if(compare_datasets(did, did2, H5P_DEFAULT, buf) != TRUE) TEST_ERROR
+    if(compare_datasets(did, did2, ocpl, buf) != TRUE) TEST_ERROR
 
     /* close the copied dataset */
     if(H5Dclose(did2) < 0) TEST_ERROR
@@ -11960,7 +13042,7 @@ test_copy_dataset_open(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t dst
     if((did2 = H5Dopen2(fid_dst, NAME_DATASET_SIMPLE, H5P_DEFAULT)) < 0) TEST_ERROR
 
     /* Check if the datasets are equal */
-    if(compare_datasets(did, did2, H5P_DEFAULT, buf) != TRUE) TEST_ERROR
+    if(compare_datasets(did, did2, ocpl, buf) != TRUE) TEST_ERROR
 
     /* close the copied dataset in DST file */
     if(H5Dclose(did2) < 0) TEST_ERROR
@@ -11987,7 +13069,7 @@ test_copy_dataset_open(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t dst
     if((did2 = H5Dopen2(fid_src, "NEW_DATASET", H5P_DEFAULT)) < 0) TEST_ERROR
 
     /* Check if the datasets are equal */
-    if(compare_datasets(did, did2, H5P_DEFAULT, newbuf) != TRUE) TEST_ERROR
+    if(compare_datasets(did, did2, ocpl, newbuf) != TRUE) TEST_ERROR
 
     /* close the copied dataset in SRC file */
     if(H5Dclose(did2) < 0) TEST_ERROR
@@ -12001,7 +13083,7 @@ test_copy_dataset_open(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t dst
     if((did2 = H5Dopen2(fid_dst, "NEW_DATASET", H5P_DEFAULT)) < 0) TEST_ERROR
 
     /* Check if the datasets are equal */
-    if(compare_datasets(did, did2, H5P_DEFAULT, newbuf) != TRUE) TEST_ERROR
+    if(compare_datasets(did, did2, ocpl, newbuf) != TRUE) TEST_ERROR
 
     /* close the copied dataset in DST file */
     if(H5Dclose(did2) < 0) TEST_ERROR
@@ -12041,7 +13123,7 @@ test_copy_dataset_open(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t dst
     if((did2 = H5Dopen2(fid_src, NAME_DATASET_NAMED_DTYPE2, H5P_DEFAULT)) < 0) TEST_ERROR
 
     /* Check if the datasets are equal */
-    if(compare_datasets(did, did2, H5P_DEFAULT, buf) != TRUE) TEST_ERROR
+    if(compare_datasets(did, did2, ocpl, buf) != TRUE) TEST_ERROR
 
     /* close the copied dataset in SRC file */
     if(H5Dclose(did2) < 0) TEST_ERROR
@@ -12056,7 +13138,7 @@ test_copy_dataset_open(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t dst
     if((did2 = H5Dopen2(fid_dst, NAME_DATASET_NAMED_DTYPE2, H5P_DEFAULT)) < 0) TEST_ERROR
 
     /* Check if the datasets are equal */
-    if(compare_datasets(did, did2, H5P_DEFAULT, buf) != TRUE) TEST_ERROR
+    if(compare_datasets(did, did2, ocpl, buf) != TRUE) TEST_ERROR
 
     /* close the copied dataset in DST file */
     if(H5Dclose(did2) < 0) TEST_ERROR
@@ -12091,7 +13173,7 @@ test_copy_dataset_open(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t dst
     if((gid2 = H5Gopen2(fid_src, "COPIED_GROUP", H5P_DEFAULT)) < 0) TEST_ERROR
 
     /* Check if the groups are equal */
-    if(compare_groups(gid, gid2, H5P_DEFAULT, -1, 0) != TRUE) TEST_ERROR
+    if(compare_groups(gid, gid2, ocpl, -1, 0) != TRUE) TEST_ERROR
 
     /* close the DST dataset */
     if(H5Gclose(gid2) < 0) TEST_ERROR
@@ -12106,7 +13188,7 @@ test_copy_dataset_open(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t dst
     if((gid2 = H5Gopen2(fid_dst, "COPIED_GROUP", H5P_DEFAULT)) < 0) TEST_ERROR
 
     /* Check if the groups are equal */
-    if(compare_groups(gid, gid2, H5P_DEFAULT, -1, 0) != TRUE) TEST_ERROR
+    if(compare_groups(gid, gid2, ocpl, -1, 0) != TRUE) TEST_ERROR
 
     /* close the group in DST file */
     if(H5Gclose(gid2) < 0) TEST_ERROR
@@ -12120,6 +13202,9 @@ test_copy_dataset_open(hid_t fcpl_src, hid_t fcpl_dst, hid_t src_fapl, hid_t dst
     /* close dataspace */
     if(H5Sclose(sid) < 0) TEST_ERROR
 
+    /* close the object copy property list */
+    if(H5Pclose(ocpl) < 0) TEST_ERROR
+
     /* close the SRC file */
     if(H5Fclose(fid_src) < 0) TEST_ERROR
 
@@ -12136,6 +13221,7 @@ error:
     	H5Sclose(sid);
     	H5Gclose(gid);
     	H5Gclose(gid2);
+        H5Pclose(ocpl);
     	H5Fclose(fid_dst);
     	H5Fclose(fid_src);
     } H5E_END_TRY;
@@ -12272,6 +13358,7 @@ main(void)
         nerrors += test_copy_dataset_chunked_empty(fcpl_src, fcpl_dst, src_fapl, dst_fapl);
         nerrors += test_copy_dataset_chunked_sparse(fcpl_src, fcpl_dst, src_fapl, dst_fapl);
         nerrors += test_copy_dataset_compressed(fcpl_src, fcpl_dst, src_fapl, dst_fapl);
+        nerrors += test_copy_dataset_no_edge_filt(fcpl_src, fcpl_dst, src_fapl, dst_fapl);
         nerrors += test_copy_dataset_compact(fcpl_src, fcpl_dst, src_fapl, dst_fapl);
         nerrors += test_copy_dataset_multi_ohdr_chunks(fcpl_src, fcpl_dst, src_fapl, dst_fapl);
         nerrors += test_copy_dataset_attr_named_dtype(fcpl_src, fcpl_dst, src_fapl, dst_fapl);
@@ -12320,11 +13407,10 @@ main(void)
                     H5O_COPY_WITHOUT_ATTR_FLAG | H5O_COPY_PRESERVE_NULL_FLAG,
                     TRUE, "H5Ocopy(): preserve NULL messages");
         nerrors += test_copy_dataset_open(fcpl_src, fcpl_dst, src_fapl, dst_fapl);
-
         /* Tests that do not use attributes and do not need to be tested
          * multiple times for different attribute configurations */
         if(configuration < CONFIG_DENSE) {
-            hbool_t reopen;
+            unsigned reopen;
 
             nerrors += test_copy_named_datatype(fcpl_src, fcpl_dst, src_fapl, dst_fapl);
             nerrors += test_copy_named_datatype_vl(fcpl_src, fcpl_dst, src_fapl, dst_fapl);
@@ -12376,8 +13462,7 @@ main(void)
             nerrors += test_copy_old_layout(fcpl_dst, dst_fapl);
             nerrors += test_copy_null_ref(fcpl_src, fcpl_dst, src_fapl, dst_fapl);
             nerrors += test_copy_iterate(fcpl_src, fcpl_dst, src_fapl, dst_fapl);
-        }
-
+        } /* end if */
 /* TODO: not implemented
         nerrors += test_copy_mount(src_fapl);
 */
diff --git a/test/ohdr.c b/test/ohdr.c
index 1b324a9..295d149 100644
--- a/test/ohdr.c
+++ b/test/ohdr.c
@@ -24,14 +24,14 @@
  * This file needs to access private datatypes from the H5O package.
  * This file also needs to access the object header testing code.
  */
-#define H5O_PACKAGE
+#define H5O_FRIEND		/*suppress error about including H5Opkg	  */
 #define H5O_TESTING
 #include "H5Opkg.h"
 
 /*
  * This file needs to access private datatypes from the H5G package.
  */
-#define H5G_PACKAGE
+#define H5G_FRIEND		/*suppress error about including H5Gpkg	  */
 #include "H5Gpkg.h"
 
 const char *FILENAME[] = {
@@ -45,6 +45,11 @@ const char *FILENAME[] = {
  */
 #define FILE_BOGUS "tbogus.h5"
 
+/*  */
+#define FILE_OHDR_SWMR "ohdr_swmr.h5"
+#define DSET_NAME "COMPACT_DSET"
+#define OBJ_VERSION_LATEST 2
+
 /*
  *  Verify that messages are moved forward into a "continuation message":
  *	Create an object header with several continuation chunks
@@ -74,6 +79,11 @@ test_cont(char *filename, hid_t fapl)
     /* Create the file to operate on */
     if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
     if(NULL == (f = (H5F_t *)H5I_object(file))) FAIL_STACK_ERROR
+    if (H5AC_ignore_tags(f) < 0) {
+	H5_FAILED();
+	H5Eprint2(H5E_DEFAULT, stdout);
+	goto error;
+    }
 
     if(H5O_create(f, H5P_DATASET_XFER_DEFAULT, (size_t)H5O_MIN_SIZE, (size_t)0, H5P_GROUP_CREATE_DEFAULT, &oh_locA/*out*/) < 0)
             FAIL_STACK_ERROR
@@ -197,13 +207,15 @@ test_ohdr_cache(char *filename, hid_t fapl)
 	FAIL_STACK_ERROR
     if(NULL == (f = (H5F_t *)H5I_object(file)))
         FAIL_STACK_ERROR
+    if(H5AC_ignore_tags(f) < 0)
+        FAIL_STACK_ERROR
 
     /* Create object (local heap) that occupies most of cache */
     if(H5HL_create(f, my_dxpl, (31 * 1024), &lheap_addr) < 0)
         FAIL_STACK_ERROR
 
     /* Protect local heap (which actually pins it in the cache) */
-    if(NULL == (lheap = H5HL_protect(f, my_dxpl, lheap_addr, H5AC_READ)))
+    if(NULL == (lheap = H5HL_protect(f, my_dxpl, lheap_addr, H5AC__READ_ONLY_FLAG)))
         FAIL_STACK_ERROR
 
     /* Create an object header */
@@ -223,7 +235,7 @@ test_ohdr_cache(char *filename, hid_t fapl)
         FAIL_STACK_ERROR
 
     /* Protect local heap (which actually pins it in the cache) */
-    if(NULL == (lheap2 = H5HL_protect(f, my_dxpl, lheap_addr2, H5AC_READ)))
+    if(NULL == (lheap2 = H5HL_protect(f, my_dxpl, lheap_addr2, H5AC__READ_ONLY_FLAG)))
         FAIL_STACK_ERROR
 
     /* Unprotect local heap (which actually unpins it from the cache) */
@@ -240,7 +252,7 @@ test_ohdr_cache(char *filename, hid_t fapl)
         FAIL_STACK_ERROR
 
     /* Protect local heap (which actually pins it in the cache) */
-    if(NULL == (lheap3 = H5HL_protect(f, my_dxpl, lheap_addr3, H5AC_READ)))
+    if(NULL == (lheap3 = H5HL_protect(f, my_dxpl, lheap_addr3, H5AC__READ_ONLY_FLAG)))
         FAIL_STACK_ERROR
 
     /* Unprotect local heap (which actually unpins it from the cache) */
@@ -288,6 +300,150 @@ error:
     return -1;
 } /* test_ohdr_cache() */
 
+/*
+ *  To exercise the coding for the re-read of the object header for SWMR access.
+ *  When the object header is read in H5O_load() of H5Ocache.c, the library initially reads
+ *  512 bytes for decoding, then reads the remaining bytes later if the object header is
+ *  greater than 512 bytes.  For SWMR access, the read should be done all at one time.
+ */
+static herr_t
+test_ohdr_swmr(hbool_t new_format)
+{
+    hid_t fid = -1;			    /* File ID */
+    hid_t fapl = -1;			/* File access property list */
+    hid_t did = -1;			    /* Dataset ID */
+    hid_t sid = -1;             /* Dataspace ID */
+    hid_t plist = -1;			/* Dataset creation property list */
+    size_t compact_size = 1024;	/* The size of compact dataset */
+    int *wbuf = NULL;			/* Buffer for writing */
+    hsize_t dims[1];			/* Dimension sizes */
+    size_t u;		            /* Iterator */
+    int n;                      /* Data variable */
+    H5O_info_t obj_info;		/* Information for the object */
+
+    if(new_format) {
+	    TESTING("exercise the coding for the re-read of the object header for SWMR access: latest-format");
+    } else {
+	    TESTING("exercise the coding for the re-read of the object header for SWMR access: non-latest-format");
+    } /* end if */
+
+    /* File access property list */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Create the file with/without latest format: ensure version 2 object header for SWMR */
+    if(new_format)  {
+        /* Set to use latest library format */
+        if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+            FAIL_STACK_ERROR
+
+        if((fid = H5Fcreate(FILE_OHDR_SWMR, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+        } else {
+        if((fid = H5Fcreate(FILE_OHDR_SWMR, H5F_ACC_TRUNC|H5F_ACC_SWMR_WRITE, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Initialize data */
+    wbuf = (int *)HDcalloc(compact_size, sizeof(int));
+    n = 0;
+    for(u = 0; u < compact_size; u++)
+	    wbuf[u] = n++;
+
+    /* Create a small data space for compact dataset */
+    dims[0] = (hsize_t)compact_size;
+    if((sid = H5Screate_simple(1, dims, NULL)) < 0)
+	    FAIL_STACK_ERROR
+    
+    /* Create property list for compact dataset creation */
+    if((plist = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+	    FAIL_STACK_ERROR
+
+    /* Set the layout for the compact dataset */
+    if(H5Pset_layout(plist, H5D_COMPACT) < 0)
+	    FAIL_STACK_ERROR
+
+    /* Create a compact dataset */
+    if((did = H5Dcreate2(fid, DSET_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, plist, H5P_DEFAULT)) < 0)
+	    FAIL_STACK_ERROR
+	
+    /* Write to the compact dataset */
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf) < 0)
+	    FAIL_STACK_ERROR
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0)
+	    FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+	    FAIL_STACK_ERROR
+
+    /* Open the file for SWMR write with/without latest format */
+    if((fid = H5Fopen(FILE_OHDR_SWMR, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl)) < 0)
+	    FAIL_STACK_ERROR
+
+    /* Open the compact dataset */
+    if((did = H5Dopen2(fid, DSET_NAME, H5P_DEFAULT)) < 0)
+	    FAIL_STACK_ERROR
+
+    /* Get the object information */
+    if(H5Oget_info(did, &obj_info) < 0)
+	    FAIL_STACK_ERROR
+
+    if(obj_info.hdr.version != OBJ_VERSION_LATEST)
+	    FAIL_STACK_ERROR
+
+    /* The size of object header should be greater than the speculative read size of 512 */
+    /* This will exercise the coding for the re-read of the object header for SWMR access */
+    if(obj_info.hdr.space.total < 512)
+	    TEST_ERROR;
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0)
+	    FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+	    FAIL_STACK_ERROR
+	
+    /* Close the dataspace */
+    if(H5Sclose(sid) < 0)
+	    FAIL_STACK_ERROR
+
+    /* Close the dataset creation property list */
+    if(H5Pclose(plist) < 0)
+	    FAIL_STACK_ERROR
+
+    /* Close the file access property list */
+    if(H5Pclose(fapl) < 0)
+	    FAIL_STACK_ERROR
+
+    /* Remove the test file */
+    if(HDremove(FILE_OHDR_SWMR) < 0)
+	    FAIL_STACK_ERROR
+
+    /* Free the buffer */
+    HDfree(wbuf);
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Fclose(fid);
+	    H5Dclose(did);
+	    H5Sclose(sid);
+	    H5Pclose(plist);
+	    H5Pclose(fapl);
+	    HDremove(FILE_OHDR_SWMR);
+        HDfree(wbuf);
+    } H5E_END_TRY;
+
+    return -1;
+} /* test_ohdr_swmr() */
+
 

 /*-------------------------------------------------------------------------
  * Function:	main
@@ -314,7 +470,7 @@ main(void)
     time_t	time_new, ro;
     int         chunkno;                /* Chunk index for message */
     int		i;                      /* Local index variable */
-    hbool_t     b;                      /* Index for "new format" loop */
+    unsigned    b;                      /* Index for "new format" loop */
     herr_t      ret;                    /* Generic return value */
 
     /* Reset library */
@@ -343,6 +499,11 @@ main(void)
             TEST_ERROR
         if(NULL == (f = (H5F_t *)H5I_object(file)))
             FAIL_STACK_ERROR
+        if (H5AC_ignore_tags(f) < 0) {
+	    H5_FAILED();
+	    H5Eprint2(H5E_DEFAULT, stdout);
+	    goto error;
+        }
 
 
         /*
@@ -439,6 +600,8 @@ main(void)
             FAIL_STACK_ERROR
         if(NULL == (f = (H5F_t *)H5I_object(file)))
             FAIL_STACK_ERROR
+        if (H5AC_ignore_tags(f) < 0)
+            FAIL_STACK_ERROR
         oh_loc.file = f;
         if(H5O_open(&oh_loc) < 0)
             FAIL_STACK_ERROR
@@ -651,26 +814,15 @@ main(void)
         PASSED();
 
 
-        /* Test reading datasets with undefined object header messages */
+        /* Test reading datasets with undefined object header messages
+         * and the various "fail/mark if unknown" object header message flags
+         */
         HDputs("Accessing objects with unknown header messages:");
         {
             hid_t file2;                    /* File ID for 'bogus' object file */
             hid_t sid;                      /* Dataspace ID */
             hid_t aid;                      /* Attribute ID */
-            char testpath[512] = "";
-            char testfile[512] = "";
-            char *srcdir = HDgetenv("srcdir");
-
-            /* Build path to all test files */
-            if(srcdir && ((HDstrlen(srcdir) + 2) < sizeof(testpath))) {
-                HDstrcpy(testpath, srcdir);
-                HDstrcat(testpath, "/");
-            } /* end if */
-
-            /* Build path to test file */
-            if(srcdir && ((HDstrlen(testpath) + HDstrlen(FILE_BOGUS) + 1) < sizeof(testfile)))
-                HDstrcpy(testfile, testpath);
-            HDstrcat(testfile, FILE_BOGUS);
+            const char *testfile = H5_get_srcdir_filename(FILE_BOGUS);
 
             TESTING("object with unknown header message and no flags set");
 
@@ -686,7 +838,7 @@ main(void)
 
             PASSED();
 
-            TESTING("object with unknown header message & 'fail if unknown and open for write' flag set");
+            TESTING("object in r/o file with unknown header message & 'fail if unknown and open for write' flag set");
 
             /* Open the dataset with the unknown header message, and "fail if unknown and open for write" flag */
             if((dset = H5Dopen2(file2, "/Dataset2", H5P_DEFAULT)) < 0)
@@ -696,10 +848,23 @@ main(void)
 
             PASSED();
 
+            TESTING("object in r/o file with unknown header message & 'fail if unknown always' flag set");
+
+            /* Attempt to open the dataset with the unknown header message, and "fail if unknown always" flag */
+            H5E_BEGIN_TRY {
+                dset = H5Dopen2(file2, "/Dataset3", H5P_DEFAULT);
+            } H5E_END_TRY;
+            if(dset >= 0) {
+                H5Dclose(dset);
+                TEST_ERROR
+            } /* end if */
+
+            PASSED();
+
             TESTING("object with unknown header message & 'mark if unknown' flag set");
 
             /* Copy object with "mark if unknown" flag on message into file that can be modified */
-            if(H5Ocopy(file2, "/Dataset3", file, "/Dataset3", H5P_DEFAULT, H5P_DEFAULT) < 0)
+            if(H5Ocopy(file2, "/Dataset4", file, "/Dataset4", H5P_DEFAULT, H5P_DEFAULT) < 0)
                 TEST_ERROR
 
             /* Close the file we created (to flush changes to file) */
@@ -711,7 +876,7 @@ main(void)
                 TEST_ERROR
 
             /* Open the dataset with the "mark if unknown" message */
-            if((dset = H5Dopen2(file, "/Dataset3", H5P_DEFAULT)) < 0)
+            if((dset = H5Dopen2(file, "/Dataset4", H5P_DEFAULT)) < 0)
                 TEST_ERROR
 
             /* Check that the "unknown" message was _NOT_ marked */
@@ -731,7 +896,7 @@ main(void)
                 TEST_ERROR
 
             /* Open the dataset with the "mark if unknown" message */
-            if((dset = H5Dopen2(file, "/Dataset3", H5P_DEFAULT)) < 0)
+            if((dset = H5Dopen2(file, "/Dataset4", H5P_DEFAULT)) < 0)
                 TEST_ERROR
 
             /* Create data space */
@@ -763,7 +928,7 @@ main(void)
                 TEST_ERROR
 
             /* Re-open the dataset with the "mark if unknown" message */
-            if((dset = H5Dopen2(file, "/Dataset3", H5P_DEFAULT)) < 0)
+            if((dset = H5Dopen2(file, "/Dataset4", H5P_DEFAULT)) < 0)
                 TEST_ERROR
 
             /* Check that the "unknown" message was marked */
@@ -780,11 +945,13 @@ main(void)
 
             PASSED();
 
+            TESTING("object with unknown header message & 'fail if unknown and open for write' flag set");
+
             /* Open the file with objects that have unknown header messages (generated with gen_bogus.c) with RW intent this time */
             if((file2 = H5Fopen(testfile, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
                 TEST_ERROR
 
-            TESTING("object with unknown header message & 'fail if unknown and open for write' flag set");
+            TESTING("object in r/w file with unknown header message & 'fail if unknown and open for write' flag set");
 
             /* Attempt to open the dataset with the unknown header message, and "fail if unknown and open for write" flag */
             H5E_BEGIN_TRY {
@@ -795,6 +962,19 @@ main(void)
                 TEST_ERROR
             } /* end if */
 
+            PASSED();
+
+            TESTING("object in r/w file with unknown header message & 'fail if unknown always' flag set");
+
+            /* Attempt to open the dataset with the unknown header message, and "fail if unknown always" flag */
+            H5E_BEGIN_TRY {
+                dset = H5Dopen2(file2, "/Dataset3", H5P_DEFAULT);
+            } H5E_END_TRY;
+            if(dset >= 0) {
+                H5Dclose(dset);
+                TEST_ERROR
+            } /* end if */
+
             /* Close the file with the bogus objects */
             if(H5Fclose(file2) < 0)
                 TEST_ERROR
@@ -806,17 +986,21 @@ main(void)
         if(H5Fclose(file) < 0)
             TEST_ERROR
 
-	/* Test object header creation metadata cache issues */
-	if(test_ohdr_cache(filename, fapl) < 0)
+	    /* Test object header creation metadata cache issues */
+	    if(test_ohdr_cache(filename, fapl) < 0)
             TEST_ERROR
     } /* end for */
 
     /* Verify symbol table messages are cached */
     if(h5_verify_cached_stabs(FILENAME, fapl) < 0) TEST_ERROR
 
+    /* A test to exercise the re-read of the object header for SWMR access */
+    if(test_ohdr_swmr(TRUE) < 0) TEST_ERROR
+    if(test_ohdr_swmr(FALSE) < 0) TEST_ERROR
+
     puts("All object header tests passed.");
     h5_cleanup(FILENAME, fapl);
-    return(0);
+    return 0;
 
 error:
     puts("*** TESTS FAILED ***");
@@ -824,6 +1008,6 @@ error:
         H5Fclose(file);
     } H5E_END_TRY;
 
-    return(1);
+    return 1;
 } /* end main() */
 
diff --git a/test/plugin.c b/test/plugin.c
index 74a8f4b..a3082d2 100644
--- a/test/plugin.c
+++ b/test/plugin.c
@@ -26,7 +26,7 @@
 /*
  * This file needs to access private datatypes from the H5Z package.
  */
-#define H5Z_PACKAGE
+#define H5Z_FRIEND
 #include "H5Zpkg.h"
 
 /* Filters for HDF5 internal test */
@@ -710,7 +710,7 @@ main(void)
 {
     char		filename[FILENAME_BUF_SIZE];
     hid_t		file, fapl, fapl2;
-    hbool_t new_format;
+    unsigned new_format;
     int mdc_nelmts;
     size_t rdcc_nelmts;
     size_t rdcc_nbytes;
@@ -768,6 +768,9 @@ main(void)
     if(H5Pclose(fapl2) < 0) TEST_ERROR
     if(H5Pclose(fapl) < 0) TEST_ERROR
    
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     puts("\nTesting reading data with with dynamic plugin filters:");
 
     /* Close the library so that all loaded plugin libraries are unloaded */
@@ -784,6 +787,9 @@ main(void)
     /* Open the groups with filters */
     nerrors += (test_groups_with_filters(file) < 0	? 1 : 0);
 
+    /* Restore the default error handler (set in h5_reset()) */
+    h5_restore_err();
+
     /* Close the library so that all loaded plugin libraries are unloaded */
     h5_reset();
     fapl = h5_fileaccess();
diff --git a/test/pool.c b/test/pool.c
index 916d45e..83c862b 100644
--- a/test/pool.c
+++ b/test/pool.c
@@ -22,7 +22,7 @@
  * This file needs to access private datatypes from the H5MP package.
  * This file also needs to access the memory pool testing code.
  */
-#define H5MP_PACKAGE
+#define H5MP_FRIEND		/*suppress error about including H5MPpkg	  */
 #define H5MP_TESTING
 #include "H5MPpkg.h"		/* Memory Pools				*/
 
diff --git a/test/set_extent.c b/test/set_extent.c
index f6c3766..8942f3f 100644
--- a/test/set_extent.c
+++ b/test/set_extent.c
@@ -49,8 +49,9 @@ const char *FILENAME[] = {
 #define CONFIG_COMPRESS         0x01u
 #define CONFIG_FILL             0x02u
 #define CONFIG_EARLY_ALLOC      0x04u
+#define CONFIG_UNFILT_EDGE      0x08u
 #define CONFIG_ALL              (CONFIG_COMPRESS + CONFIG_FILL                 \
-                                + CONFIG_EARLY_ALLOC)
+                                + CONFIG_EARLY_ALLOC + CONFIG_UNFILT_EDGE)
 #define FILL_VALUE -1
 #define DO_RANKS_PRINT_CONFIG(TEST) {                                          \
     printf("  Config:\n");                                                     \
@@ -59,6 +60,8 @@ const char *FILENAME[] = {
     printf("   Fill value: %s\n", (do_fillvalue ? "yes" : "no"));              \
     printf("   Early allocation: %s\n", (config & CONFIG_EARLY_ALLOC ? "yes"   \
             : "no"));                                                          \
+    printf("   Edge chunk filters: %s\n", (config & CONFIG_UNFILT_EDGE         \
+            ? "disabled" : "enabled"));                                        \
 } /* end DO_RANKS_PRINT_CONFIG */
 
 #define RANK1 1
@@ -81,26 +84,46 @@ const char *FILENAME[] = {
     test_random_rank4_dump(NDIM_SETS, dim_log, cdims, J, K, L, M);             \
     goto error;                                                                \
 } /* end RAND4_FAIL_DUMP */
+#define RAND4_VL_NITER 40
+#define RAND4_VL_SPARSE_SWITCH 5
 
-static int do_ranks( hid_t fapl );
+typedef enum rank4_index_t {
+    RANK4_INDEX_BTREE = 0,      /* Use b-tree (1/2) as chunk index */
+    RANK4_INDEX_FARRAY,         /* Use fixed array as chunk index */
+    RANK4_INDEX_EARRAY,         /* Use extensible array as chunk index */
+    RANK4_NINDICES,             /* Must be last */
+} rank4_index_t;
+
+static int do_ranks( hid_t fapl, hbool_t new_format );
 static int do_layouts( hid_t fapl );
 
 static int test_rank1( hid_t fapl,
                        hid_t dcpl,
                        hbool_t do_fill_value,
+                       hbool_t disable_edge_filters,
                        hbool_t set_istore_k);
 static int test_rank2( hid_t fapl,
                        hid_t dcpl,
                        hbool_t do_fill_value,
+                       hbool_t disable_edge_filters,
                        hbool_t set_istore_k);
 static int test_rank3( hid_t fapl,
                        hid_t dcpl,
                        hbool_t do_fill_value,
+                       hbool_t disable_edge_filters,
                        hbool_t set_istore_k);
 static int test_random_rank4( hid_t fapl,
                               hid_t dcpl,
                               hbool_t do_fillvalue,
-                              hbool_t do_sparse);
+                              hbool_t disable_edge_filters,
+                              hbool_t do_sparse,
+                              rank4_index_t index_type);
+static int test_random_rank4_vl( hid_t fapl,
+                                 hid_t dcpl,
+                                 hbool_t do_fillvalue,
+                                 hbool_t disable_edge_filters,
+                                 hbool_t do_sparse,
+                                 rank4_index_t index_type);
 
 static int test_external( hid_t fapl );
 static int test_layouts( H5D_layout_t layout, hid_t fapl );
@@ -116,8 +139,8 @@ int main( void )
 {
     hid_t fapl;                 /* file access property list */
     hid_t fapl2;                /* file access property list w/latest format set */
-    hbool_t new_format;         /* Whether to use the latest file format */
-    hbool_t chunk_cache;        /* Whether to enable chunk caching */
+    unsigned new_format;         /* Whether to use the latest file format */
+    unsigned chunk_cache;        /* Whether to enable chunk caching */
     int	  nerrors = 0;
 
     /* Initialize random number seed */
@@ -174,7 +197,7 @@ int main( void )
                         H5F_LIBVER_LATEST) < 0) TEST_ERROR
 
             /* Tests which use chunked datasets */
-            nerrors += do_ranks( my_fapl ) < 0 ? 1 : 0;
+            nerrors += do_ranks( my_fapl, new_format ) < 0 ? 1 : 0;
         } /* end for */
 
         /* Tests which do not use chunked datasets */
@@ -211,10 +234,12 @@ error:
 * test with several ranks
 *-------------------------------------------------------------------------
 */
-static int do_ranks( hid_t fapl )
+static int do_ranks( hid_t fapl, hbool_t new_format )
 {
 
-    hbool_t     do_fillvalue = 0;
+    hbool_t     do_fillvalue = FALSE;
+    hbool_t     disable_edge_filters = FALSE;
+    rank4_index_t index_type;
     hid_t       dcpl = -1;
     int         fillvalue = FILL_VALUE;
     unsigned    config;
@@ -250,6 +275,11 @@ static int do_ranks( hid_t fapl )
             if(H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY) < 0)
                 TEST_ERROR
 
+        if(config & CONFIG_UNFILT_EDGE)
+            disable_edge_filters = TRUE;
+        else
+            disable_edge_filters = FALSE;
+
         /* Run tests */
         if(do_fillvalue) {
             unsigned ifset;
@@ -264,25 +294,25 @@ static int do_ranks( hid_t fapl )
                     if(H5Pset_fill_time(dcpl, H5D_FILL_TIME_ALLOC) < 0)
                         TEST_ERROR
 
-                if(test_rank1(fapl, dcpl, do_fillvalue, FALSE) < 0) {
+                if(test_rank1(fapl, dcpl, do_fillvalue, disable_edge_filters, FALSE) < 0) {
                     DO_RANKS_PRINT_CONFIG("Rank 1")
                     printf("   Fill time: %s\n", (ifset ? "H5D_FILL_TIME_IFSET"
                             : "H5D_FILL_TIME_ALLOC"));
                     goto error;
                 } /* end if */
-                if(test_rank2(fapl, dcpl, do_fillvalue, FALSE) < 0) {
+                if(test_rank2(fapl, dcpl, do_fillvalue, disable_edge_filters, FALSE) < 0) {
                     DO_RANKS_PRINT_CONFIG("Rank 2")
                     printf("   Fill time: %s\n", (ifset ? "H5D_FILL_TIME_IFSET"
                             : "H5D_FILL_TIME_ALLOC"));
                     goto error;
                 } /* end if */
-                if(test_rank3(fapl, dcpl, do_fillvalue, FALSE) < 0) {
+                if(test_rank3(fapl, dcpl, do_fillvalue, disable_edge_filters, FALSE) < 0) {
                     DO_RANKS_PRINT_CONFIG("Rank 3")
                     printf("   Fill time: %s\n", (ifset ? "H5D_FILL_TIME_IFSET"
                             : "H5D_FILL_TIME_ALLOC"));
                     goto error;
                 } /* end if */
-                if(test_rank2(fapl, dcpl, do_fillvalue, TRUE) < 0) {
+                if(test_rank2(fapl, dcpl, do_fillvalue, disable_edge_filters, TRUE) < 0) {
                     DO_RANKS_PRINT_CONFIG("Rank 2 with non-default indexed storage B-tree")
                     printf("   Fill time: %s\n", (ifset ? "H5D_FILL_TIME_IFSET"
                             : "H5D_FILL_TIME_ALLOC"));
@@ -296,19 +326,19 @@ static int do_ranks( hid_t fapl )
             if(H5Pset_fill_time(dcpl, H5D_FILL_TIME_ALLOC) < 0)
                 TEST_ERROR
 
-            if(test_rank1(fapl, dcpl, do_fillvalue, FALSE) < 0) {
+            if(test_rank1(fapl, dcpl, do_fillvalue, disable_edge_filters, FALSE) < 0) {
                 DO_RANKS_PRINT_CONFIG("Rank 1")
                 goto error;
             } /* end if */
-            if(test_rank2(fapl, dcpl, do_fillvalue, FALSE) < 0) {
+            if(test_rank2(fapl, dcpl, do_fillvalue, disable_edge_filters, FALSE) < 0) {
                 DO_RANKS_PRINT_CONFIG("Rank 2")
                 goto error;
             } /* end if */
-            if(test_rank3(fapl, dcpl, do_fillvalue, FALSE) < 0) {
+            if(test_rank3(fapl, dcpl, do_fillvalue, disable_edge_filters, FALSE) < 0) {
                 DO_RANKS_PRINT_CONFIG("Rank 3")
                 goto error;
             } /* end if */
-            if(test_rank2(fapl, dcpl, do_fillvalue, TRUE) < 0) {
+            if(test_rank2(fapl, dcpl, do_fillvalue, disable_edge_filters, TRUE) < 0) {
                 DO_RANKS_PRINT_CONFIG("Rank 2 with non-default indexed storage B-tree")
                 goto error;
             } /* end if */
@@ -319,17 +349,55 @@ static int do_ranks( hid_t fapl )
         if(H5Pset_fill_time(dcpl, H5D_FILL_TIME_IFSET) < 0)
             TEST_ERROR
 
-        if(test_random_rank4(fapl, dcpl, do_fillvalue, FALSE) < 0) {
-            DO_RANKS_PRINT_CONFIG("Randomized rank 4")
-            goto error;
-        } /* end if */
+        /* Iterate over different index types, but only if using the new format
+         */
+        for(index_type = RANK4_INDEX_BTREE; index_type < RANK4_NINDICES;
+                index_type++) {
+            /* Standard test */
+            if(test_random_rank4(fapl, dcpl, do_fillvalue, disable_edge_filters,
+                    FALSE, index_type) < 0) {
+                DO_RANKS_PRINT_CONFIG("Randomized rank 4")
+                printf("   Index: %s\n", index_type == RANK4_INDEX_BTREE
+                        ? "btree" : (index_type == RANK4_INDEX_FARRAY ? "farray"
+                        : "earray"));
+                goto error;
+            } /* end if */
 
-        if(!(config & CONFIG_EARLY_ALLOC))
-            if(test_random_rank4(fapl, dcpl, do_fillvalue, TRUE) < 0) {
-                DO_RANKS_PRINT_CONFIG("Randomized rank 4 with sparse allocation")
+            /* VL test */
+            if(test_random_rank4_vl(fapl, dcpl, do_fillvalue,
+                    disable_edge_filters, FALSE, index_type) < 0) {
+                DO_RANKS_PRINT_CONFIG("Randomized rank 4 variable length")
+                printf("   Index: %s\n", index_type == RANK4_INDEX_BTREE
+                        ? "btree" : (index_type == RANK4_INDEX_FARRAY ? "farray"
+                        : "earray"));
                 goto error;
             } /* end if */
 
+            /* Sparse allocation test (regular and VL) */
+            if(!(config & CONFIG_EARLY_ALLOC)) {
+                if(test_random_rank4(fapl, dcpl, do_fillvalue,
+                        disable_edge_filters, TRUE, index_type) < 0) {
+                    DO_RANKS_PRINT_CONFIG("Randomized rank 4 with sparse allocation")
+                    printf("   Index: %s\n", index_type == RANK4_INDEX_BTREE
+                            ? "btree" : (index_type == RANK4_INDEX_FARRAY
+                            ? "farray" : "earray"));
+                    goto error;
+                } /* end if */
+                if(test_random_rank4_vl(fapl, dcpl, do_fillvalue,
+                        disable_edge_filters, TRUE, index_type) < 0) {
+                    DO_RANKS_PRINT_CONFIG("Randomized rank 4 variable length with sparse allocation")
+                    printf("   Index: %s\n", index_type == RANK4_INDEX_BTREE
+                            ? "btree" : (index_type == RANK4_INDEX_FARRAY
+                            ? "farray" : "earray"));
+                    goto error;
+                } /* end if */
+            } /* end if */
+
+            /* Break out if using the old format */
+            if(!new_format)
+                break;
+        } /* end for */
+
         /* Close dcpl */
         if(H5Pclose(dcpl) < 0)
             TEST_ERROR
@@ -379,6 +447,7 @@ error:
 static int test_rank1( hid_t fapl,
                        hid_t dcpl,
                        hbool_t do_fill_value,
+                       hbool_t disable_edge_filters,
                        hbool_t set_istore_k)
 {
 
@@ -460,6 +529,9 @@ static int test_rank1( hid_t fapl,
     {
         TEST_ERROR
     }
+    if(disable_edge_filters)
+        if(H5Pset_chunk_opts(my_dcpl, H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS) < 0)
+            TEST_ERROR
 
     /*-------------------------------------------------------------------------
     * create, write dataset
@@ -885,6 +957,7 @@ error:
 static int test_rank2( hid_t fapl,
                        hid_t dcpl,
                        hbool_t do_fill_value,
+                       hbool_t disable_edge_filters,
                        hbool_t set_istore_k)
 {
 
@@ -965,6 +1038,9 @@ static int test_rank2( hid_t fapl,
     {
         TEST_ERROR
     }
+    if(disable_edge_filters)
+        if(H5Pset_chunk_opts(my_dcpl, H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS) < 0)
+            TEST_ERROR
 
     /*-------------------------------------------------------------------------
     * Procedure 1
@@ -1500,6 +1576,7 @@ error:
 static int test_rank3( hid_t fapl,
                        hid_t dcpl,
                        hbool_t do_fill_value,
+                       hbool_t disable_edge_filters,
                        hbool_t set_istore_k)
 {
 
@@ -1586,6 +1663,9 @@ static int test_rank3( hid_t fapl,
     {
         TEST_ERROR
     }
+    if(disable_edge_filters)
+        if(H5Pset_chunk_opts(my_dcpl, H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS) < 0)
+            TEST_ERROR
 
     /*-------------------------------------------------------------------------
     * create, write array
@@ -2660,14 +2740,16 @@ error:
  *-------------------------------------------------------------------------
  */
 static int test_random_rank4( hid_t fapl, hid_t dcpl, hbool_t do_fillvalue,
-    hbool_t do_sparse )
+        hbool_t disable_edge_filters, hbool_t do_sparse,
+        rank4_index_t index_type )
 {
     hid_t       file = -1;
     hid_t       dset = -1;
     hid_t       fspace = -1;
     hid_t       mspace = -1;
     hid_t       my_dcpl = -1;
-    hsize_t     dims[4];                        /* Dataset's dimensions */
+    hsize_t     dims[4] = {10, 10, 10, 10};     /* Dataset's dimensions */
+    hsize_t     max_dims[4] = {10, 10, 10, 10}; /* Maximum dimensions */
     hsize_t     old_dims[4];                    /* Old dataset dimensions */
     hsize_t     min_unwritten_dims[4];          /* Minimum dimensions since last write */
     hsize_t     *valid_dims = old_dims;         /* Dimensions of region still containing written data */
@@ -2679,31 +2761,54 @@ static int test_random_rank4( hid_t fapl, hid_t dcpl, hbool_t do_fillvalue,
     static hsize_t dim_log[RAND4_NITER+1][4];   /* Log of dataset dimensions */
     hbool_t     zero_dim = FALSE;               /* Whether a dimension is 0 */
     hbool_t     writing = TRUE;                 /* Whether we're writing to the dset */
+    unsigned    scalar_iter;                    /* Iteration to shrink dset to 1x1x1x1 */
     volatile unsigned i, j, k, l, m;            /* Local indices */
     char        filename[NAME_BUF_SIZE];
 
+    /*!FIXME Skip the test if a fixed array index is requested, as resizing
+     * fixed arrays is broken now.  Extensible arrays are also broken.  Remove
+     * these lines as appropriate when these problems are fixed. */
+    /* Fixed Array index type is now fixed */
+    if(index_type == RANK4_INDEX_EARRAY)
+        return 0;
+
     /* create a new file */
     h5_fixname(FILENAME[4], fapl, filename, sizeof filename);
     if ((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
         TEST_ERROR
 
+    /* Set maximum dimensions as appropriate for index type */
+    if(index_type == RANK4_INDEX_BTREE)
+        for(i=0; i<4; i++)
+            max_dims[i] = H5S_UNLIMITED;
+    else if(index_type == RANK4_INDEX_EARRAY)
+        max_dims[1] = H5S_UNLIMITED;
+
     /* Generate random chunk dimensions, 2-4 */
     for(i=0; i<4; i++)
         cdims[i] = (hsize_t)((HDrandom() % 3) + 2);
 
-    /* Generate initial dataset size, 1-10 */
+    /* Pick iteration to shrink dataset to 1x1x1x1 */
+    scalar_iter = (unsigned)(HDrandom() % RAND4_NITER);
+
+    /* Generate initial dataset size, 1-10, unless using fixed array index or
+     * scalar_iter is 0 */
     for(i=0; i<4; i++) {
-        dims[i] = (hsize_t)((HDrandom() % 10) + 1);
+        dims[i] = (hsize_t)(index_type != RANK4_INDEX_FARRAY
+                ? (0 == scalar_iter ? 1 : ((HDrandom() % 10) + 1)) : 10);
         dim_log[0][i] = dims[i];
     } /* end for */
 
     /* Create dataset */
-    if((fspace = H5Screate_simple(4, dims, mdims)) < 0)
+    if((fspace = H5Screate_simple(4, dims, max_dims)) < 0)
         TEST_ERROR
     if((my_dcpl = H5Pcopy(dcpl)) < 0)
         TEST_ERROR
     if(H5Pset_chunk(my_dcpl, 4, cdims) < 0)
         TEST_ERROR
+    if(disable_edge_filters)
+        if(H5Pset_chunk_opts(my_dcpl, H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS) < 0)
+            TEST_ERROR
     if((dset = H5Dcreate2(file, "dset", H5T_NATIVE_INT, fspace, H5P_DEFAULT,
             my_dcpl, H5P_DEFAULT)) < 0)
         TEST_ERROR
@@ -2734,11 +2839,13 @@ static int test_random_rank4( hid_t fapl, hid_t dcpl, hbool_t do_fillvalue,
                 RAND4_FAIL_DUMP(i+1, -1, -1, -1, -1)
         } /* end if */
 
-        /* Generate new dataset size, 0-10 (0 much less likely) */
+        /* Generate new dataset size, 0-10 (0 much less likely).  If i is
+         * scalar_iter, set all dims to 1. */
         zero_dim = FALSE;
         for(j=0; j<4; j++) {
             old_dims[j] = dims[j];
-            if((dims[j] = (hsize_t)(HDrandom() % 11)) == 0)
+            if((dims[j] = (hsize_t)(i == scalar_iter ? 1 : (HDrandom() % 11)))
+                    == 0)
                 if((dims[j] = (hsize_t)(HDrandom() % 11)) == 0)
                     zero_dim = TRUE;
             dim_log[i+1][j] = dims[j];
@@ -2825,6 +2932,289 @@ error:
     return -1;
 } /* end test_random_rank4 */
 
+/*-------------------------------------------------------------------------
+ * Function:    test_random_rank4_vl
+ *
+ * Purpose:     Test expanding and shrinking a rank 4 dataset with
+ *              variable length data in a randomized fashion.  Verifies
+ *              that data is preserved (and filled, if do_fillvalue is
+ *              true) as expected.
+ *
+ * Return:      Success:        0
+ *              Failure:        -1
+ *
+ * Programmer:  Neil Fortner
+ *              Tueday, June 29, 2010
+ *
+ *-------------------------------------------------------------------------
+ */
+static int test_random_rank4_vl( hid_t fapl, hid_t dcpl, hbool_t do_fillvalue,
+        hbool_t disable_edge_filters, hbool_t do_sparse,
+        rank4_index_t index_type )
+{
+    hid_t       file = -1;
+    hid_t       dset = -1;
+    hid_t       type = -1;
+    hid_t       fspace = -1;
+    hid_t       mspace = -1;
+    hid_t       my_dcpl = -1;
+    hsize_t     dims[4] = {10, 10, 10, 10};     /* Dataset's dimensions */
+    hsize_t     max_dims[4] = {10, 10, 10, 10}; /* Maximum dimensions */
+    hsize_t     old_dims[4];                    /* Old dataset dimensions */
+    hsize_t     min_unwritten_dims[4];          /* Minimum dimensions since last write */
+    hsize_t     *valid_dims = old_dims;         /* Dimensions of region still containing written data */
+    hsize_t     cdims[4];                       /* Chunk dimensions */
+    const hsize_t mdims[4] = {10, 10, 10, 10};  /* Memory buffer dimensions */
+    const hsize_t start[4] = {0, 0, 0, 0};      /* Start for hyperslab operations on memory */
+    static hvl_t rbuf[10][10][10][10];          /* Read buffer */
+    static hvl_t wbuf[10][10][10][10];          /* Write buffer */
+    static hsize_t dim_log[RAND4_NITER+1][4];   /* Log of dataset dimensions */
+    hbool_t     zero_dim = FALSE;               /* Whether a dimension is 0 */
+    hbool_t     writing = TRUE;                 /* Whether we're writing to the dset */
+    hvl_t       fill_value;                     /* Fill value */
+    unsigned    scalar_iter;                    /* Iteration to shrink dset to 1x1x1x1 */
+    volatile unsigned i, j, k, l, m;            /* Local indices */
+    char        filename[NAME_BUF_SIZE];
+
+    /*!FIXME Skip the test if a fixed array index is requested, as resizing
+     * fixed arrays is broken now.  Extensible arrays are also broken.  Remove
+     * these lines as appropriate when these problems are fixed. */
+    if(index_type == RANK4_INDEX_FARRAY || index_type == RANK4_INDEX_EARRAY)
+        return 0;
+
+    /* Initialize fill value buffers so they aren't freed in case of an error */
+    fill_value.len = 0;
+    fill_value.p = NULL;
+    for(i=0; i<dims[0]; i++)
+        for(j=0; j<dims[1]; j++)
+            for(k=0; k<dims[2]; k++)
+                for(l=0; l<dims[3]; l++) {
+                    rbuf[i][j][k][l].len = 0;
+                    rbuf[i][j][k][l].p = NULL;
+                    wbuf[i][j][k][l].len = 0;
+                    wbuf[i][j][k][l].p = NULL;
+                } /* end for */
+
+    /* Allocate space for VL write buffers, since these never need to be
+     * reallocated */
+    for(i=0; i<dims[0]; i++)
+        for(j=0; j<dims[1]; j++)
+            for(k=0; k<dims[2]; k++)
+                for(l=0; l<dims[3]; l++) {
+                    wbuf[i][j][k][l].len = 2;
+                    if(NULL == (wbuf[i][j][k][l].p = HDmalloc(2 * sizeof(int))))
+                        TEST_ERROR;
+                } /* end for */
+
+    /* create a new file */
+    h5_fixname(FILENAME[4], fapl, filename, sizeof filename);
+    if ((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create VL type */
+    if((type = H5Tvlen_create(H5T_NATIVE_INT)) < 0)
+        TEST_ERROR
+
+    /* Set maximum dimensions as appropriate for index type */
+    if(index_type == RANK4_INDEX_BTREE)
+        for(i=0; i<4; i++)
+            max_dims[i] = H5S_UNLIMITED;
+    else if(index_type == RANK4_INDEX_EARRAY)
+        max_dims[1] = H5S_UNLIMITED;
+
+    /* Generate random chunk dimensions, 2-4 */
+    for(i=0; i<4; i++)
+        cdims[i] = (hsize_t)((HDrandom() % 3) + 2);
+
+    /* Pick iteration to shrink dataset to 1x1x1x1 */
+    scalar_iter = (unsigned)(HDrandom() % RAND4_NITER);
+
+    /* Generate initial dataset size, 1-10, unless using fixed array index or
+     * scalar_iter is 0 */
+    for(i=0; i<4; i++) {
+        dims[i] = (hsize_t)(index_type != RANK4_INDEX_FARRAY
+                ? (0 == scalar_iter ? 1 : ((HDrandom() % 10) + 1)) : 10);
+        dim_log[0][i] = dims[i];
+    } /* end for */
+
+    /* Make a copy of the dcpl */
+    if((my_dcpl = H5Pcopy(dcpl)) < 0)
+        TEST_ERROR
+
+    /* Create VL fill value, if requested */
+    if(do_fillvalue) {
+        fill_value.len = 2;
+        if(NULL == (fill_value.p = HDmalloc(2 * sizeof(int))))
+            TEST_ERROR
+        ((int *)fill_value.p)[0] = 1;
+        ((int *)fill_value.p)[1] = 2;
+        if(H5Pset_fill_value(my_dcpl, type, &fill_value) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Create dataset */
+    if((fspace = H5Screate_simple(4, dims, max_dims)) < 0)
+        TEST_ERROR
+    if(H5Pset_chunk(my_dcpl, 4, cdims) < 0)
+        TEST_ERROR
+    if(disable_edge_filters)
+        if(H5Pset_chunk_opts(my_dcpl, H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS) < 0)
+            TEST_ERROR
+    if((dset = H5Dcreate2(file, "dset", type, fspace, H5P_DEFAULT, my_dcpl,
+            H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if(H5Sclose(fspace) < 0)
+        TEST_ERROR
+
+    /* Create memory space, and set initial selection */
+    if((mspace = H5Screate_simple(4, mdims, NULL)) < 0)
+        TEST_ERROR
+    if(H5Sselect_hyperslab(mspace, H5S_SELECT_SET, start, NULL, dims, NULL)
+            < 0)
+        TEST_ERROR
+
+    /* Main loop */
+    for(i=0; i<RAND4_VL_NITER; i++) {
+
+        /* Generate random write buffer */
+        if(writing && !zero_dim) {
+            for(j=0; j<dims[0]; j++)
+                for(k=0; k<dims[1]; k++)
+                    for(l=0; l<dims[2]; l++)
+                        for(m=0; m<dims[3]; m++) {
+                            ((int *)wbuf[j][k][l][m].p)[0] = HDrandom();
+                            ((int *)wbuf[j][k][l][m].p)[1] = HDrandom();
+                        } /* end for */
+
+            /* Write data */
+            if(H5Dwrite(dset, type, mspace, H5S_ALL, H5P_DEFAULT, wbuf) < 0)
+                RAND4_FAIL_DUMP(i+1, -1, -1, -1, -1)
+        } /* end if */
+
+        /* Generate new dataset size, 0-10 (0 much less likely).  If i is
+         * scalar_iter, set all dims to 1.  */
+        zero_dim = FALSE;
+        for(j=0; j<4; j++) {
+            old_dims[j] = dims[j];
+            if((dims[j] = (hsize_t)(i == scalar_iter ? 1 : (HDrandom() % 11)))
+                    == 0)
+                if((dims[j] = (hsize_t)(HDrandom() % 11)) == 0)
+                    zero_dim = TRUE;
+            dim_log[i+1][j] = dims[j];
+        } /* end for */
+
+        /* If writing is disabled, update min_unwritten_dims */
+        if(!writing)
+            for(j=0; j<4; j++)
+                if(old_dims[j] < min_unwritten_dims[j])
+                    min_unwritten_dims[j] = old_dims[j];
+
+        /* Resize dataset */
+        if(H5Dset_extent(dset, dims) < 0)
+            RAND4_FAIL_DUMP(i+2, -1, -1, -1, -1)
+
+        if(!zero_dim) {
+            /* Read data from resized dataset */
+            if(H5Sselect_hyperslab(mspace, H5S_SELECT_SET, start, NULL, dims,
+                    NULL) < 0)
+                RAND4_FAIL_DUMP(i+2, -1, -1, -1, -1)
+            if(H5Dread(dset, type, mspace, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+                RAND4_FAIL_DUMP(i+2, -1, -1, -1, -1)
+
+            /* Verify correctness of read data */
+            if(do_fillvalue) {
+                for(j=0; j<dims[0]; j++)
+                    for(k=0; k<dims[1]; k++)
+                        for(l=0; l<dims[2]; l++)
+                            for(m=0; m<dims[3]; m++)
+                                if(j >= valid_dims[0] || k >= valid_dims[1]
+                                        || l >= valid_dims[2]
+                                        || m >= valid_dims[3]) {
+                                    if(((int *)fill_value.p)[0]
+                                            != ((int *)rbuf[j][k][l][m].p)[0]
+                                            || ((int *)fill_value.p)[1]
+                                            != ((int *)rbuf[j][k][l][m].p)[1])
+                                        RAND4_FAIL_DUMP(i+2, (int)j, (int)k, (int)l, (int)m)
+                                } /* end if */
+                                else
+                                    if(((int *)wbuf[j][k][l][m].p)[0]
+                                            != ((int *)rbuf[j][k][l][m].p)[0]
+                                            || ((int *)wbuf[j][k][l][m].p)[1]
+                                            != ((int *)rbuf[j][k][l][m].p)[1])
+                                        RAND4_FAIL_DUMP(i+2, (int)j, (int)k, (int)l, (int)m)
+            } /* end if */
+            else {
+                for(j=0; j<MIN(dims[0],valid_dims[0]); j++)
+                    for(k=0; k<MIN(dims[1],valid_dims[1]); k++)
+                        for(l=0; l<MIN(dims[2],valid_dims[2]); l++)
+                            for(m=0; m<MIN(dims[3],valid_dims[3]); m++)
+                                if(((int *)wbuf[j][k][l][m].p)[0]
+                                            != ((int *)rbuf[j][k][l][m].p)[0]
+                                            || ((int *)wbuf[j][k][l][m].p)[1]
+                                            != ((int *)rbuf[j][k][l][m].p)[1])
+                                    RAND4_FAIL_DUMP(i+2, (int)j, (int)k, (int)l, (int)m)
+            } /* end else */
+
+            /* Free read buffer */
+            if(H5Dvlen_reclaim(type, mspace, H5P_DEFAULT, rbuf) < 0)
+                TEST_ERROR
+        } /* end if */
+
+        /* Handle the switch between writing and not writing */
+        if(do_sparse && !(i % RAND4_VL_SPARSE_SWITCH)) {
+            writing = !writing;
+            if(!writing) {
+                for(j=0; j<4; j++)
+                    min_unwritten_dims[j] = old_dims[j];
+                valid_dims = min_unwritten_dims;
+            } /* end if */
+            else
+                valid_dims = old_dims;
+        } /* end if */
+    } /* end for */
+
+    /* Close */
+    if(H5Sselect_all(mspace) < 0)
+        TEST_ERROR
+    if(H5Dvlen_reclaim(type, mspace, H5P_DEFAULT, wbuf) < 0)
+        TEST_ERROR
+    free(fill_value.p);
+    if(H5Sclose(mspace) < 0)
+        TEST_ERROR
+    if(H5Pclose(my_dcpl) < 0)
+        TEST_ERROR
+    if(H5Dclose(dset) < 0)
+        TEST_ERROR
+    if(H5Tclose(type) < 0)
+        TEST_ERROR
+    if(H5Fclose(file) < 0)
+        TEST_ERROR
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        for(i=0; i<dims[0]; i++)
+            for(j=0; j<dims[1]; j++)
+                for(k=0; k<dims[2]; k++)
+                    for(l=0; l<dims[3]; l++) {
+                        if(rbuf[i][j][k][l].p)
+                            HDfree(rbuf[i][j][k][l].p);
+                        if(wbuf[i][j][k][l].p)
+                            HDfree(wbuf[i][j][k][l].p);
+                    } /* end for */
+        if(fill_value.p)
+            HDfree(fill_value.p);
+        H5Sclose(fspace);
+        H5Sclose(mspace);
+        H5Pclose(dcpl);
+        H5Dclose(dset);
+        H5Tclose(type);
+        H5Fclose(file);
+    } H5E_END_TRY
+    return -1;
+} /* end test_random_rank4_vl */
+
 /*
  * test_random_rank4_dump: Dump debugging info from test_random_rank4 to screen
  * after failure.
diff --git a/test/stab.c b/test/stab.c
index 95e9722..f81bb5f 100644
--- a/test/stab.c
+++ b/test/stab.c
@@ -18,7 +18,7 @@
  *              Tuesday, November 24, 1998
  */
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+#define H5G_FRIEND		/*suppress error about including H5Gpkg	  */
 
 /* Define this macro to indicate that the testing APIs should be available */
 #define H5G_TESTING
@@ -1166,7 +1166,7 @@ int
 main(void)
 {
     hid_t	fapl, fapl2;    /* File access property list IDs */
-    hbool_t new_format;     /* Whether to use the new format or not */
+    unsigned new_format;    /* Whether to use the new format or not */
     int	nerrors = 0;
 
     /* Reset library */
diff --git a/test/swmr.c b/test/swmr.c
new file mode 100644
index 0000000..1599acd
--- /dev/null
+++ b/test/swmr.c
@@ -0,0 +1,6785 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/***********************************************************
+*
+* Test program:  swmr
+*
+*   To test new public routines from SWMR project:
+*       H5Pget/set_metadata_read_attempts()
+*       H5Fget_metadata_read_retry_info()
+*       H5Fstart_swmr_write()
+*       H5Pget/set_object_flush_cb()
+*       H5Pget/set_append_flush()
+*
+*************************************************************/
+
+#include "hdf5.h"
+#include "h5test.h"
+#include "H5Iprivate.h"
+
+/*
+ * This file needs to access private information from the H5F package.
+ * This file also needs to access the file testing code.
+ */
+#define H5F_FRIEND      /*suppress error about including H5Fpkg   */
+#define H5F_TESTING
+#include "H5Fpkg.h"     /* File access              */
+
+#define H5D_FRIEND              /*suppress error about including H5FDpkg          */
+#define H5D_TESTING
+#include "H5Dpkg.h"
+
+/* This file needs to access the file driver testing code */
+#define H5FD_FRIEND     /*suppress error about including H5FDpkg      */
+#define H5FD_TESTING
+#include "H5FDpkg.h"    /* File drivers             */
+
+
+const char *FILENAME[] = {
+    "swmr0",        /* 0 */
+    "swmr1",        /* 1 */
+    NULL
+};
+
+
+#define NAME_BUF_SIZE   1024        /* Length of file name */
+
+/* Tests for H5Pget/set_metadata_read_attempts(), H5Fget_metadata_read_retry_info */
+static int test_metadata_read_attempts(hid_t in_fapl);
+static int test_metadata_read_retry_info(hid_t in_fapl);
+
+/* Tests for H5Fstart_swmr_write() */
+static int test_start_swmr_write(hid_t in_fapl, hbool_t new_format);
+static int test_err_start_swmr_write(hid_t in_fapl, hbool_t new_format);
+static int test_start_swmr_write_concur(hid_t in_fapl, hbool_t new_format);
+
+/* Tests for H5Pget/set_object_flush_cb() */
+static herr_t flush_cb(hid_t obj_id, void *_udata);
+static int test_object_flush_cb(hid_t in_fapl);
+
+/* Tests for H5Pget/set_append_flush() */
+static herr_t append_cb(hid_t dset_id, hsize_t *cur_dims, void *_udata);
+static herr_t append_cb2(hid_t dset_id, hsize_t *cur_dims, void *_udata);
+static int test_append_flush_generic(void);
+static int test_append_flush_dataset_chunked(hid_t in_fapl);
+static int test_append_flush_dataset_fixed(hid_t in_fapl);
+static int test_append_flush_dataset_multiple(hid_t in_fapl);
+
+/* Tests for file open flags/SWMR flags: single process access */
+static int test_file_lock_same(hid_t fapl);              
+static int test_file_lock_swmr_same(hid_t fapl);         
+
+/* Tests for file open flags/SWMR flags: concurrent process access */
+static int test_file_lock_concur(hid_t fapl);            
+static int test_file_lock_swmr_concur(hid_t fapl);       
+
+/* Tests for SWMR VFD flag */
+static int test_swmr_vfd_flag(void);
+
+/* Tests for H5Drefresh: concurrent access */
+static int test_refresh_concur(hid_t in_fapl, hbool_t new_format);
+
+/* Tests for multiple opens of files and datasets with H5Drefresh() & H5Fstart_swmr_write(): same process */
+static int test_multiple_same(hid_t in_fapl, hbool_t new_format);
+
+/*
+ * Tests for H5Pget/set_metadata_read_attemps(), H5Fget_metadata_read_retry_info()
+ */
+
+/*
+ *  test_metadata_read_attempts(): 
+ *
+ *  Checks the following two public routines work as specified:
+ *  H5Pset_metadata_read_attempts() 
+ *  H5Pget_metadata_read_attempts() 
+ */
+static int
+test_metadata_read_attempts(hid_t in_fapl)
+{
+    hid_t fapl;             /* File access property list */
+    hid_t file_fapl;            /* The file's access property list */
+    hid_t fid, fid1, fid2;          /* File IDs */
+    unsigned attempts;          /* The # of read attempts */
+    char filename[NAME_BUF_SIZE];       /* File name */
+    herr_t ret;                 /* Generic return value */
+
+    /* Output message about test being performed */
+    TESTING("H5Pget/set_metadata_read_attempts()");
+
+    /* Get a copy of the parameter fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
+
+    /* 
+     * Set A:
+     *  Tests on verifying the # of read attempts when:
+     *    --setting/getting read attempts from a 
+     *      file access property list.
+     */
+    /* Get # of read attempts -- should be the default: 1 */
+    if(H5Pget_metadata_read_attempts(fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != 1)
+        TEST_ERROR
+
+    /* Set the # of read attempts to 0--should fail */
+    H5E_BEGIN_TRY {
+        ret = H5Pset_metadata_read_attempts(fapl, 0);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Set the # of read attempts to a # > 0--should succeed */
+    if(H5Pset_metadata_read_attempts(fapl, 9) < 0)
+        TEST_ERROR
+
+    /* Retrieve the # of read attempts -- should be 9 */
+    if(H5Pget_metadata_read_attempts(fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != 9)
+        TEST_ERROR
+
+    /* Set the # of read attempts to the default for non-SWMR access: H5F_METADATA_READ_ATTEMPTS --should succeed */
+    if(H5Pset_metadata_read_attempts(fapl, H5F_METADATA_READ_ATTEMPTS) < 0)
+        TEST_ERROR
+
+    /* Retrieve the # of read attempts -- should be H5F_METADATA_READ_ATTEMPTS */
+    if(H5Pget_metadata_read_attempts(fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != H5F_METADATA_READ_ATTEMPTS)
+        TEST_ERROR
+
+    /* Set the # of read attempts to the default for SWMR access: H5F_SWMR_METADATA_READ_ATEMPTS --should succeed */
+    if(H5Pset_metadata_read_attempts(fapl, H5F_SWMR_METADATA_READ_ATTEMPTS) < 0)
+        TEST_ERROR
+
+    /* Retrieve the # of read attempts -- should be H5F_SWMR_METADATA_READ_ATTEMPTS */
+    if(H5Pget_metadata_read_attempts(fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != H5F_SWMR_METADATA_READ_ATTEMPTS)
+        TEST_ERROR
+
+    /* Close the property list */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Set B:
+     *  Tests on verifying read attempts when:
+     *    --create a file with non-SWMR access
+     *    --opening files with SWMR access 
+     *    --using default or non-default file access property list
+     */
+    /* Test 1 */
+    /* Create a file with non-SWMR access and default fapl */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get file's fapl */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts from file's fapl -- should be H5F_METADATA_READ_ATTEMPTS */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != H5F_METADATA_READ_ATTEMPTS)
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file's fapl */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test 2 */
+    /* Get a copy of the parameter fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set to use latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the file with SWMR access and default read attempts */
+    if((fid = H5Fopen(filename, (H5F_ACC_RDONLY | H5F_ACC_SWMR_READ), fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close fapl */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get file's fapl */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts from file's fapl -- should be H5F_SWMR_METADATA_READ_ATTEMPTS */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != H5F_SWMR_METADATA_READ_ATTEMPTS)
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file's fapl */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test 3 */
+    /* Get a copy of the parameter fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set to use latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set the # of read attempts */
+    if(H5Pset_metadata_read_attempts(fapl, 9) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the file with SWMR access and fapl (non-default & set to 9) */
+    if((fid = H5Fopen(filename, (H5F_ACC_RDONLY | H5F_ACC_SWMR_READ), fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close fapl */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get file's fapl */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts from file's fapl -- should be 9 */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != 9)
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+    FAIL_STACK_ERROR
+
+    /* Close file's fapl */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test 4 */
+    /* Get a copy of the parameter fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set to use latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set the # of read attempts */
+    if(H5Pset_metadata_read_attempts(fapl, 1) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the file with SWMR access and fapl (non-default & set to 1) */
+    if((fid = H5Fopen(filename, (H5F_ACC_RDONLY | H5F_ACC_SWMR_READ), fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close fapl */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get file's fapl */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts from file fapl -- should be 1 */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != 1)
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file's fapl */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test 5 */
+    /* Get a copy of the parameter fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set to use latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the file with SWMR_READ and fapl (non-default read attempts but unset) */
+    if((fid = H5Fopen(filename, (H5F_ACC_RDONLY | H5F_ACC_SWMR_READ), fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close fapl */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get file's fapl */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts from file's fapl -- should be H5F_SWMR_METADATA_READ_ATTEMPTS */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != H5F_SWMR_METADATA_READ_ATTEMPTS)
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file's fapl */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Set C:
+     *  Tests on verifying read attempts when:
+     *    --create a file with SWMR access
+     *    --opening files with non-SWMR access 
+     *    --using default or non-default file access property list
+     */
+    /* Test 1 */
+    /* Get a copy of the parameter fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set to use latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create a file with non-SWMR access and default read attempts */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC|H5F_ACC_SWMR_WRITE, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close fapl */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get file's fapl */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts from file's fapl -- should be H5F_SWMR_METADATA_READ_ATTEMPTS */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != H5F_SWMR_METADATA_READ_ATTEMPTS)
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file's fapl */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test 2 */
+    /* Open the file with non-SWMR access and default fapl */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get file's fapl */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts from file's fapl -- should be H5F_METADATA_READ_ATTEMPTS */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != H5F_METADATA_READ_ATTEMPTS)
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file's fapl */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test 3 */
+    /* Get a copy of the parameter fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set the # of read attempts */
+    if(H5Pset_metadata_read_attempts(fapl, 9) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the file with non-SWMR access and fapl (non-default & set to 9) */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close fapl */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get file's fapl */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts from file's fapl -- should be H5F_METADATA_READ_ATTEMPTS */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != H5F_METADATA_READ_ATTEMPTS)
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file's fapl */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test 4 */
+    /* Get a copy of the parameter fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set the # of read attempts */
+    if(H5Pset_metadata_read_attempts(fapl, 1) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the file with non-SWMR access and fapl (non-default & set to 1) */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close fapl */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get file's fapl */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts from file fapl -- should be 1 */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != 1)
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file's fapl */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Test 5 */
+    /* Get a copy of the parameter fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the file with non-SWMR_READ and fapl (non-default but unset) */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close fapl */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get file's fapl */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts from file's fapl -- should be H5F_METADATA_READ_ATTEMPTS */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != H5F_METADATA_READ_ATTEMPTS)
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file's fapl */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a copy of the parameter fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set to use latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set the # of read attempts */
+    if(H5Pset_metadata_read_attempts(fapl, 9) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create a file */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC|H5F_ACC_SWMR_WRITE, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close fapl */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open file again with non-SWMR access and default fapl */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get file's fapl */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts from file fapl -- should be H5F_METADATA_READ_ATTEMPTS */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != H5F_METADATA_READ_ATTEMPTS)
+        TEST_ERROR
+
+    /* Close the file's fapl */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a copy of the parameter fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set to use latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open file again with SWMR access and default read attempts */
+    if((fid = H5Fopen(filename, H5F_ACC_SWMR_READ, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close fapl */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get file's fapl */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts from file fapl -- should be H5F_SWMR_METADATA_READ_ATTEMPTS */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != H5F_SWMR_METADATA_READ_ATTEMPTS)
+        TEST_ERROR
+
+    /* Close the file's fapl */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Set D:
+     *  Tests on verifying read attempts when:
+     *    --create with non-SWMR access
+     *    --opening files with SWMR access 
+     *    --H5reopen the files
+     */
+
+    /* Create a file */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a copy of the parameter fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set to use latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open file again with SWMR access and default read attempts */
+    if((fid1 = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set the # of read attempts */
+    if(H5Pset_metadata_read_attempts(fapl, 9) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open file again with SWMR access and fapl (non-default & set to 9) */
+    if((fid2 = H5Fopen(filename, (H5F_ACC_RDONLY | H5F_ACC_SWMR_READ), fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close fapl */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Re-open fid1 */
+    if((fid = H5Freopen(fid1)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get file's fapl */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts from file fapl -- should be H5F_SWMR_METADATA_READ_ATTEMPTS */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != H5F_SWMR_METADATA_READ_ATTEMPTS)
+        TEST_ERROR
+
+    /* Close the file's fapl */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Re-open fid2 */
+    if((fid = H5Freopen(fid2)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get file's fapl */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts from file fapl -- should be H5F_SWMR_METADATA_READ_ATTEMPTS, not 9 */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != H5F_SWMR_METADATA_READ_ATTEMPTS)
+        TEST_ERROR
+
+    /* Close the file's fapl */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close all the files */
+    if(H5Fclose(fid1) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid2) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Set E:
+     *  Tests on verifying read attempts when:
+     *    --create with SWMR access
+     *    --opening files with non-SWMR access 
+     *    --H5reopen the files
+     */
+
+    /* Get a copy of the parameter fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set to use latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create a file */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC|H5F_ACC_SWMR_WRITE, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close fapl */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open file again with non-SWMR access and default fapl */
+    if((fid1 = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a copy of the parameter fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set the # of read attempts */
+    if(H5Pset_metadata_read_attempts(fapl, 9) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open file again with non-SWMR access and fapl (non-default & set to 9) */
+    if((fid2 = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close fapl */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Re-open fid1 */
+    if((fid = H5Freopen(fid1)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get file's fapl */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts from file fapl -- should be H5F_METADATA_READ_ATTEMPTS */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != H5F_METADATA_READ_ATTEMPTS)
+        TEST_ERROR
+
+    /* Close the file's fapl */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Re-open fid2 */
+    if((fid = H5Freopen(fid2)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get file's fapl */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts from file fapl -- should be H5F_METADATA_READ_ATTEMPTS */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+    if(attempts != H5F_METADATA_READ_ATTEMPTS)
+        TEST_ERROR
+
+    /* Close the file's fapl */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close all the files */
+    if(H5Fclose(fid1) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid2) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+        H5Pclose(file_fapl);
+        H5Fclose(fid);
+        H5Fclose(fid1);
+        H5Fclose(fid2);
+    } H5E_END_TRY;
+
+    return -1;
+
+
+} /* test_metadata_read_attempts() */
+
+/*
+ *  test_metadata_read_retry_info(): 
+ *
+ *  Checks whether the public routine H5Fget_metadata_read_retry_info 
+ *  works as specified.
+ *
+ */
+static int
+test_metadata_read_retry_info(hid_t in_fapl)
+{
+    hid_t fapl, new_fapl;       /* File access property list */
+    hid_t fid, fid1;            /* File IDs */
+    H5F_retry_info_t info, info1;   /* The collection of metadata retries */
+    H5F_t *f = NULL, *f1 = NULL;    /* Internal file object pointers */
+    unsigned i, j, n;           /* Local index variables */
+    hid_t did1, did2;           /* Dataset IDs */
+    hid_t sid;              /* Dataspace ID */
+    hid_t dcpl;             /* Dataset creation property list */
+    hsize_t dims[2] = {6, 10};      /* Dataset dimensions */
+    char filename[NAME_BUF_SIZE];       /* File name */
+    int buf[6][10], chkbuf1[6][10], chkbuf2[6][10];     /* Buffers for data */
+    hsize_t max_dims_1un[2] = {H5S_UNLIMITED, H5S_UNLIMITED};   /* Dataset maximum dimensions */
+    hsize_t max_dims_2un[2] = {500, H5S_UNLIMITED};         /* Dataset maximum dimensions */
+    hsize_t chunk_dims[2] = {2, 2};                 /* Chunk dimensions */
+
+    /* Output message about test being performed */
+    TESTING("H5Fset_metadata_read_retry_info()");
+
+    /* Get a copy of the parameter in_fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
+
+    /* Set to use latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create a file without SWMR access */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create a chunked dataset with 1 unlimited dimension: extensible array indexing will be used */
+    if((sid = H5Screate_simple(2, dims, max_dims_1un)) < 0)
+        FAIL_STACK_ERROR
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0)
+        FAIL_STACK_ERROR
+    if((did1 = H5Dcreate2(fid, "DSET_1UNLIM", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create a chunked dataset with 2 unlimited dimension: v2 Btree indexing will be used */
+    if((sid = H5Screate_simple(2, dims, max_dims_2un)) < 0)
+        FAIL_STACK_ERROR
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0)
+        FAIL_STACK_ERROR
+    if((did2 = H5Dcreate2(fid, "DSET_2UNLIM", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Initialize buffer data */
+    for(i = n = 0; i < 6; i++)
+        for(j = 0; j < 10; j++)
+              buf[i][j] = (int)n++;
+
+    /* Write to the 2 datasets */
+    if(H5Dwrite(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+        FAIL_STACK_ERROR
+    if(H5Dwrite(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Closing */
+    if(H5Dclose(did1) < 0)
+        FAIL_STACK_ERROR
+    if(H5Dclose(did2) < 0)
+        FAIL_STACK_ERROR
+    if(H5Sclose(sid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pclose(dcpl) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /*
+     *  Case 1: tests on nbins
+     */
+    /*
+     * Open a file without SWMR access, default # of read attempts--
+     *   info.nbins should be 0
+     *   info.retries should all be NULL
+     */
+    /* Open the file without SWMR access */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the dataset */
+    if((did1 = H5Dopen2(fid, "DSET_1UNLIM", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    if(H5Dread(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, chkbuf1) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the dataset */
+    if((did2 = H5Dopen2(fid, "DSET_2UNLIM", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+    if(H5Dread(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, chkbuf2) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve retries information */
+    if(H5Fget_metadata_read_retry_info(fid, &info) < 0)
+        FAIL_STACK_ERROR
+
+    /* Should be 0 */
+    if(info.nbins != 0)
+        TEST_ERROR
+
+    /* Should be all NULL */
+    for(i = 0; i < H5F_NUM_METADATA_READ_RETRY_TYPES; i++)
+        if(info.retries[i] != NULL)
+            TEST_ERROR
+
+    /* Closing */
+    if(H5Dclose(did1) < 0)
+        FAIL_STACK_ERROR
+    if(H5Dclose(did2) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+
+    /*
+     * Open a file with SWMR access, default # of read attempts--
+     *   info.nbins should be 2
+     *   info.retries should all be NULL
+     */
+    /* Open the file with SWMR access */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve retries information */
+    if(H5Fget_metadata_read_retry_info(fid, &info) < 0)
+        FAIL_STACK_ERROR
+
+    /* Should be 2 */
+    if(info.nbins != 2)
+        TEST_ERROR
+
+    /* Should be all NULL */
+    for(i = 0; i < H5F_NUM_METADATA_READ_RETRY_TYPES; i++)
+        if(info.retries[i] != NULL)
+            TEST_ERROR
+
+    /* Closing */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /*
+     * Open a file with SWMR access, # of read_attempts is 10:
+     *   info.nbins should be 1
+     *   info.retries should all be NULL
+     */
+    if((new_fapl = H5Pcopy(fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    if(H5Pset_metadata_read_attempts(new_fapl, 10) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the file with SWMR access */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, new_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve retry information */
+    if(H5Fget_metadata_read_retry_info(fid, &info) < 0)
+        FAIL_STACK_ERROR
+
+    /* Should be 1 */
+    if(info.nbins != 1)
+        TEST_ERROR
+
+    /* Should be all NULL */
+    for(i = 0; i < H5F_NUM_METADATA_READ_RETRY_TYPES; i++)
+        if(info.retries[i] != NULL)
+            TEST_ERROR
+
+    /* Closing */
+    if(H5Pclose(new_fapl) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /*
+     * Open a file with SWMR access, # of read attempts is 101:
+     *   info.nbins should be 3
+     *   info.retries should all be NULL
+     */
+    if((new_fapl = H5Pcopy(fapl)) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_metadata_read_attempts(new_fapl, 101) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the file with SWMR access */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, new_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve retry information */
+    if(H5Fget_metadata_read_retry_info(fid, &info) < 0)
+        FAIL_STACK_ERROR
+
+    /* Should be 3 */
+    if(info.nbins != 3)
+        TEST_ERROR
+
+    /* Should be all NULL */
+    for(i = 0; i < H5F_NUM_METADATA_READ_RETRY_TYPES; i++)
+        if(info.retries[i] != NULL)
+            TEST_ERROR
+
+    /* Closing */
+    if(H5Pclose(new_fapl) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /*
+     * Open a file with SWMR access, # of read_attempts is 10000:
+     *   info.nbins should be 4
+     *   info.retries should all be NULL
+     */
+    if((new_fapl = H5Pcopy(fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    if(H5Pset_metadata_read_attempts(new_fapl, 10000) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the file with SWMR access */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, new_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve retry information */
+    if(H5Fget_metadata_read_retry_info(fid, &info) < 0)
+        FAIL_STACK_ERROR
+
+    /* Should be 4 */
+    if(info.nbins != 4)
+        TEST_ERROR
+
+    /* Should be all NULL */
+    for(i = 0; i < H5F_NUM_METADATA_READ_RETRY_TYPES; i++)
+        if(info.retries[i] != NULL)
+            TEST_ERROR
+
+    /* Closing */
+    if(H5Pclose(new_fapl) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /*
+     * Open a file with SWMR access, # of read_attempts is 1:
+     *   info.nbins should be 0
+     *   info.retries should all be NULL
+     */
+    if((new_fapl = H5Pcopy(fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    if(H5Pset_metadata_read_attempts(new_fapl, 1) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the file with SWMR access */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, new_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve retry information */
+    if(H5Fget_metadata_read_retry_info(fid, &info) < 0)
+        FAIL_STACK_ERROR
+
+    /* Should be 0 */
+    if(info.nbins != 0)
+        TEST_ERROR
+
+    /* Should be all NULL */
+    for(i = 0; i < H5F_NUM_METADATA_READ_RETRY_TYPES; i++)
+        if(info.retries[i] != NULL)
+            TEST_ERROR
+
+    /* Closing */
+    if(H5Pclose(new_fapl) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+
+    /* 
+     * Case 2: tests on retries info
+     */
+
+    /* Open the file with SWMR access */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the dataset */
+    if((did1 = H5Dopen2(fid, "DSET_1UNLIM", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Read data from the dataset */
+    if(H5Dread(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, chkbuf1) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the dataset */
+    if((did2 = H5Dopen2(fid, "DSET_2UNLIM", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Read data from the dataset */
+    if(H5Dread(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, chkbuf2) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve retry information */
+    if(H5Fget_metadata_read_retry_info(fid, &info) < 0)
+        FAIL_STACK_ERROR
+
+    /* Should be 2 */
+    if(info.nbins != 2)
+        TEST_ERROR
+
+    /* Should be all NULL */
+    for(i = 0; i < H5F_NUM_METADATA_READ_RETRY_TYPES; i++)
+        if(info.retries[i] != NULL)
+            TEST_ERROR
+
+    /* Get a pointer to the internal file object */
+    if((f = (H5F_t *)H5I_object(fid)) == NULL)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Increment 1st set of retries for metadata items:
+     *   a) v2 B-tree leaf node--retries[4][1]
+     *   b) Extensive array data block--retries[15][1]
+     *   c) File's superblock--retries[20][0]
+     */
+
+    /* v2 B-tree leaf node: log retry 99 for 500 times */
+    for(i = 0; i < 500; i++) {
+        if(H5F_track_metadata_read_retries(f, H5AC_BT2_LEAF_ID, 99) < 0)
+            FAIL_STACK_ERROR
+    }
+
+    /* Extensive array data block: log retry 10 for 1000 times */
+    for(i = 0; i < 1000; i++)
+        if(H5F_track_metadata_read_retries(f, H5AC_EARRAY_DBLOCK_ID, 10) < 0)
+            FAIL_STACK_ERROR
+
+    /* File's superblock: log retry 1 for 1 time */
+    if(H5F_track_metadata_read_retries(f, H5AC_SUPERBLOCK_ID, 1) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the collection of metadata read retries */
+    if(H5Fget_metadata_read_retry_info(fid, &info) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify retries for v2 B-tree leaf node */
+    if(info.retries[4][0] != 0)
+        TEST_ERROR
+    if(info.retries[4][1] != 500)
+        TEST_ERROR
+
+    /* Verify retries for extensive array data block */
+    if(info.retries[15][0] != 0)
+        TEST_ERROR
+    if(info.retries[15][1] != 1000)
+        TEST_ERROR
+
+    /* Verify retries for file's superblock */
+    if(info.retries[20][0] != 1)
+        TEST_ERROR
+    if(info.retries[20][1] != 0)
+        TEST_ERROR
+
+    /* Free memory for info.retries */
+    for(i = 0; i < H5F_NUM_METADATA_READ_RETRY_TYPES; i++)  {
+        if(info.retries[i] != NULL)
+            HDfree(info.retries[i]);
+    }
+
+    /* 
+     * Increment 2nd set of retries for metadata items:
+     *   a) Object header--retries[0][0]
+     *   b) Extensive array datablock--retries[15][0]
+     *   c) Fixed array header--retries[17][1]
+     *   d) File's superblock--retries[20][0]
+     */
+
+    /* Object header: log retry 5 for 5 times */
+    for(i = 0; i < 5; i++) {
+        if(H5F_track_metadata_read_retries(f, H5AC_OHDR_ID, 5) < 0)
+            TEST_ERROR
+    }
+
+    /* Extensive array data block: log retry 4 for 1 time */
+    if(H5F_track_metadata_read_retries(f, H5AC_EARRAY_DBLOCK_ID, 4) < 0)
+        TEST_ERROR
+
+    /* Fixed array header : log retry 50 for 10000 times */
+    for(i = 0; i < 10000; i++) {
+        if(H5F_track_metadata_read_retries(f, H5AC_FARRAY_HDR_ID, 50) < 0)
+            TEST_ERROR
+    }
+
+    /* File's superblock: log retry 1 for 1 more time */
+    if(H5F_track_metadata_read_retries(f, H5AC_SUPERBLOCK_ID, 1) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the collection of metadata read retries */
+    if(H5Fget_metadata_read_retry_info(fid, &info) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Verify info has both previous + current retries information:
+     */
+    for(i = 0; i < H5F_NUM_METADATA_READ_RETRY_TYPES; i++) {
+        switch(i) {
+            case 0: /* Object header */
+                if(info.retries[i][0] != 5)
+                    TEST_ERROR
+                if(info.retries[i][1] != 0)
+                    TEST_ERROR
+                break;
+
+            case 4: /* v2 B-tree leaf node */
+                if(info.retries[i][0] != 0)
+                    TEST_ERROR
+                if(info.retries[i][1] != 500)
+                    TEST_ERROR
+                break;
+    
+            case 15: /* Extensive array data block */
+                if(info.retries[i][0] != 1)
+                    TEST_ERROR
+                if(info.retries[i][1] != 1000)
+                    TEST_ERROR
+                break;
+
+            case 17: /* Fixed array header */
+                if(info.retries[i][0] != 0)
+                    TEST_ERROR
+                if(info.retries[i][1] != 10000)
+                    TEST_ERROR
+                break;
+
+            case 20: /* File's superblock */
+                if(info.retries[i][0] != 2)
+                    TEST_ERROR
+                if(info.retries[i][1] != 0)
+                    TEST_ERROR
+                break;
+
+            default:
+                if(info.retries[i] != NULL)
+                    TEST_ERROR
+                break;
+        }
+    }
+
+    /* Free memory for info.retries */
+    for(i = 0; i < H5F_NUM_METADATA_READ_RETRY_TYPES; i++)
+        if(info.retries[i] != NULL)
+            HDfree(info.retries[i]);
+
+    /* Closing */
+    if(H5Dclose(did1) < 0)
+        FAIL_STACK_ERROR
+    if(H5Dclose(did2) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a copy of the file access property list */
+    if((new_fapl = H5Pcopy(fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set the number of metadata read attempts to 101 */
+    if(H5Pset_metadata_read_attempts(new_fapl, 101) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the file with SWMR access */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, new_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if((f = (H5F_t *)H5I_object(fid)) == NULL)
+        FAIL_STACK_ERROR
+
+    /* File's superblock: log retry 1 for 1 time */
+    if(H5F_track_metadata_read_retries(f, H5AC_SUPERBLOCK_ID, 1) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the collection of metadata read retries */
+    if(H5Fget_metadata_read_retry_info(fid, &info) < 0)
+        FAIL_STACK_ERROR
+
+    /* Should be 3 */
+    if(info.nbins != 3)
+        TEST_ERROR
+
+    /* Verify retries info */
+    for(i = 0; i < H5F_NUM_METADATA_READ_RETRY_TYPES; i++) {
+        switch(i) {
+            case 20: /* File's superblock */
+                if(info.retries[i][0] != 1)
+                    TEST_ERROR
+                if(info.retries[i][1] != 0)
+                    TEST_ERROR
+                if(info.retries[i][2] != 0)
+                    TEST_ERROR
+                break;
+
+            default:
+                if(info.retries[i] != NULL)
+                    TEST_ERROR
+                break;
+        }
+    }
+
+    /* Free memory */
+    for(i = 0; i < H5F_NUM_METADATA_READ_RETRY_TYPES; i++)
+        if(info.retries[i] != NULL)
+            HDfree(info.retries[i]);
+
+    /* Closing */
+    if(H5Pclose(new_fapl) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /*
+     * Case 3: Tests on retrieving the collection of retries
+     *         when H5Fopen and H5Freopen the same file.
+     */
+
+    /*
+     * Open a file without SWMR access, default # of read attempts--
+     * H5Freopen the same file--
+     * Both files should:
+     *   nbins should be 0
+     *   retries should all be NULL
+     */
+    /* Open the file without SWMR access */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Re-open fid */
+    if((fid1 = H5Freopen(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve retries information for fid */
+    if(H5Fget_metadata_read_retry_info(fid, &info) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve retries information for fid1*/
+    if(H5Fget_metadata_read_retry_info(fid1, &info1)< 0)
+        FAIL_STACK_ERROR
+
+    /* Should be 0 */
+    if(info.nbins != 0)
+        TEST_ERROR
+    if(info1.nbins != 0)
+        TEST_ERROR
+
+    /* Should be all NULL */
+    for(i = 0; i < H5F_NUM_METADATA_READ_RETRY_TYPES; i++) {
+        if(info.retries[i] != NULL)
+            TEST_ERROR
+        if(info1.retries[i] != NULL)
+            TEST_ERROR
+    }
+
+    /* Closing */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid1) < 0)
+        FAIL_STACK_ERROR
+
+    /*
+     * Open a file with SWMR access, default # of read attempts:
+     *   --increment retries for metadata item: fixed array data block page (retries[19][0]) 
+     * H5Freopen the same file:
+     *   --increment retries for metadata item: free-space sections (retries[9][1])--
+     */
+    /* Open the file with SWMR access */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object for fid */
+    if((f = (H5F_t *)H5I_object(fid)) == NULL)
+        FAIL_STACK_ERROR
+
+    /* Re-open fid */
+    if((fid1 = H5Freopen(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object for fid1 */
+    if((f1 = (H5F_t *)H5I_object(fid1)) == NULL)
+        FAIL_STACK_ERROR
+
+    /* For fid: fixed array data block page--log retry 9 for 500 times */
+    for(i = 0; i < 500; i++) {
+        if(H5F_track_metadata_read_retries(f, H5AC_FARRAY_DBLK_PAGE_ID, 9) < 0)
+            FAIL_STACK_ERROR
+    }
+
+    /* For fid1: free-space sections--log retry 99 for 1000 times */
+    for(i = 0; i < 1000; i++) {
+        if(H5F_track_metadata_read_retries(f1, H5AC_FSPACE_SINFO_ID, 99) < 0)
+            FAIL_STACK_ERROR
+    }
+
+    /* Retrieve the collection of metadata read retries for fid */
+    if(H5Fget_metadata_read_retry_info(fid, &info) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the collection of metadata read retries for fid1 */
+    if(H5Fget_metadata_read_retry_info(fid1, &info1) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify nbins for fid & fid1: should be 2 */
+    if(info.nbins != 2)
+        TEST_ERROR
+    if(info1.nbins != 2)
+        TEST_ERROR
+
+    /* Verify retries for fid: fixed array data block page */
+    if(info.retries[19][0] != 500)
+        TEST_ERROR
+    if(info.retries[19][1] != 0)
+        TEST_ERROR
+
+    /* Verify retries for fid: free-space sections */
+    /* (Since file was re-opened) */
+    if(info.retries[9][0] != 0)
+        TEST_ERROR
+    if(info.retries[9][1] != 1000)
+        TEST_ERROR
+
+    /* Verify retries for fid1: free-space sections */
+    if(info1.retries[9][0] != 0)
+        TEST_ERROR
+    if(info1.retries[9][1] != 1000)
+        TEST_ERROR
+
+    /* Verify retries for fid1: fixed array data block page */
+    /* (Since file was re-opened) */
+    if(info1.retries[19][0] != 500)
+        TEST_ERROR
+    if(info1.retries[19][1] != 0)
+        TEST_ERROR
+
+    /* Free memory for info.retries and info1.retries */
+    for(i = 0; i < H5F_NUM_METADATA_READ_RETRY_TYPES; i++) {
+        if(info.retries[i] != NULL)
+            HDfree(info.retries[i]);
+        if(info1.retries[i] != NULL)
+            HDfree(info1.retries[i]);
+    } /* end for */
+
+    /* Closing */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid1) < 0)
+        FAIL_STACK_ERROR
+
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+        H5Pclose(new_fapl);
+        H5Dclose(did1);
+        H5Dclose(did2);
+        H5Sclose(sid);
+        H5Pclose(dcpl);
+        H5Fclose(fid);
+        H5Fclose(fid1);
+    } H5E_END_TRY;
+
+    return -1;
+
+} /* test_metadata_read_retry_info() */
+
+
+
+/*
+ * Tests for H5Fstart_swmr_write()
+ */
+
+/*
+ *  test_start_swmr_write():
+ *
+ *  Verify SWMR writing is enabled via H5Fstart_swmr_write():
+ *  Mainly test for file created with SWMR_WRITE + with/without latest format: 
+ *  --file will have v3 superblock and all latest version support enabled
+ *
+ *  (A) Creating a file
+ *      Create a file with SWMR_WRITE + non-latest-format
+ *      Create a chunked dataset "dataset1" in the file -- should be using latest chunk indexing
+ *      Should fail to enable SWMR as the file is already in SWMR writing mode
+ *      Close the file
+ *
+ *  (B) Opening a file
+ *      Open the file with write + non-latest-format
+ *      --file has v3 superblock and all latest version support enabled
+ *      Open dataset "dataset1" 3 times--keep it open
+ *	Write to "dataset1"
+ *	Create a group in the file
+ *      Create a chunked dataset "dataset2" in the group--should be using latest chunk indexing--keep it open
+ *      Should succeed in enabling SWMR
+ *	Should succeed in reading from multiple opens of "dataset1"
+ *      Close multiple opens of "dataset1" 
+ *	Close "dataset2"
+ *      Create "dataset3"--should be using latest chunk indexing 
+ *      Close "dataset3"
+ *      Close the group and file
+ */
+static int
+test_start_swmr_write(hid_t in_fapl, hbool_t new_format)
+{
+    hid_t fid = -1;             /* File ID */
+    hid_t fapl = -1;                /* File access property */
+    hid_t gid = -1;             /* Group ID */
+    hid_t dcpl = -1;                /* Dataset creation property */
+    hid_t file_fapl = -1;           /* File access property for the file */
+    hid_t did1 = -1, did2 = -1, did3 = -1;  /* Dataset IDs */
+    hid_t did1_a = -1, did1_b = -1;
+    hid_t sid1 = -1, sid2 = -1, sid3 = -1;  /* Dataspace IDs */
+    hsize_t dim[1] = {1};           /* Dimension sizes */
+    hsize_t max_dim[1] = {H5S_UNLIMITED};   /* Maximum dimension sizes */
+    hsize_t chunk_dim[1] = {2};         /* Chunk dimension sizes */
+    hsize_t dim2[2] = {5, 10};          /* Dimension sizes */
+    hsize_t max_dim2[2] = {H5S_UNLIMITED, H5S_UNLIMITED};   /* Maximum dimension sizes */
+    hsize_t chunk_dim2[2] = {2, 7};     /* Chunk dimension sizes */
+    H5D_chunk_index_t idx_type;         /* Dataset chunk index type */
+    int wdata = 99;             /* Data to write */
+    int rdata;                  /* Data read */
+    unsigned attempts;              /* The retrieved # of read attempts */
+    char filename[NAME_BUF_SIZE];       /* File name */
+    herr_t ret;                             /* Return value */
+
+
+    /* Get a copy of the parameter fapl (non-latest-format) */
+    if((fapl = H5Pcopy(in_fapl)) < 0) 
+        FAIL_STACK_ERROR
+
+    if(new_format) {
+        TESTING("H5Fstart_swmr_write() when creating/opening a file with latest format");
+
+    /* Set to use the latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+    } else {
+        TESTING("H5Fstart_swmr_write() when creating/opening a file without latest format");
+    } /* end if */
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
+
+    /* 
+     * Case A: when creating a file 
+     */
+
+    /* Create the file with SWMR write + non-latest-format */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC | (new_format ? 0 : H5F_ACC_SWMR_WRITE), H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get the file's access_property list */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts from the file's fapl */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+
+    /* Should be 100 */
+    if(attempts != (new_format ? H5F_METADATA_READ_ATTEMPTS : H5F_SWMR_METADATA_READ_ATTEMPTS))
+        TEST_ERROR;
+
+    /* Close the property list */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create "dataset1" */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) 
+        FAIL_STACK_ERROR
+    if(H5Pset_chunk(dcpl, 1, chunk_dim) < 0) 
+        FAIL_STACK_ERROR
+    if((sid1 = H5Screate_simple(1, dim, max_dim)) < 0) 
+        FAIL_STACK_ERROR;
+    if((did1 = H5Dcreate2(fid, "dataset1", H5T_NATIVE_INT, sid1, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) 
+        FAIL_STACK_ERROR;
+
+    /* Get the chunk index type */
+    if(H5D__layout_idx_type_test(did1, &idx_type) < 0) 
+        FAIL_STACK_ERROR;
+    if(idx_type != H5D_CHUNK_IDX_EARRAY)
+        FAIL_PUTS_ERROR("should be using extensible array as index");
+
+    /* Write to the dataset */
+    if(H5Dwrite(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &wdata) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Should fail to enable SWMR for non-latest-format */
+    /* Should succeed in enabling SWMR for latest format */
+    H5E_BEGIN_TRY {
+        ret = H5Fstart_swmr_write(fid);
+    } H5E_END_TRY;
+    if(new_format) {
+        if(ret < 0) TEST_ERROR  
+    } else if(ret >= 0)
+        TEST_ERROR
+
+    /* Read from the dataset */
+    if(H5Dread(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Verify the data is correct */
+    if(wdata != rdata)
+        TEST_ERROR
+
+    /* Close "dataset1", dataspace, dataset creation property list */
+    if(H5Dclose(did1) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Sclose(sid1) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(dcpl) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Get the file's access_property list */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+
+    /* Should be 100 */
+    if(attempts != H5F_SWMR_METADATA_READ_ATTEMPTS)
+        TEST_ERROR;
+
+    /* Close the file access property list */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR;
+
+    /* 
+     * Case B: when opening a file 
+     */
+
+    /* Open the file again with write + non-latest-format */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Get the file's access_property list */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+
+    /* Should be 1 */
+    if(attempts != H5F_METADATA_READ_ATTEMPTS)
+        TEST_ERROR;
+
+    /* Close the property list */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR;
+
+    /* open "dataset1", keep it open */
+    if((did1 = H5Dopen2(fid, "dataset1", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* open "dataset1" second time */
+    if((did1_a = H5Dopen2(fid, "dataset1", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* open "dataset1" third time */
+    if((did1_b = H5Dopen2(fid, "dataset1", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Write to "dataset1" */
+    wdata = 88;
+    if(H5Dwrite(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &wdata) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Create a group */
+    if((gid = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create "dataset2" in the group, keep it open */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) 
+        FAIL_STACK_ERROR
+    if(H5Pset_chunk(dcpl, 2, chunk_dim2) < 0) 
+        FAIL_STACK_ERROR
+    if((sid2 = H5Screate_simple(2, dim2, max_dim2)) < 0) 
+        FAIL_STACK_ERROR;
+    if((did2 = H5Dcreate2(gid, "dataset2", H5T_NATIVE_INT, sid2, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) 
+        FAIL_STACK_ERROR;
+
+    /* Get the chunk index type for "dataset2" */
+    if(H5D__layout_idx_type_test(did2, &idx_type) < 0) 
+        FAIL_STACK_ERROR;
+    if(idx_type != H5D_CHUNK_IDX_BT2)
+        FAIL_PUTS_ERROR("should be using v2 B-tree chunk indexing");
+
+    /* Should succeed in enabling SWMR writing */
+    if(H5Fstart_swmr_write(fid) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Get the file's access_property list */
+    if((file_fapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the # of read attempts */
+    if(H5Pget_metadata_read_attempts(file_fapl, &attempts) < 0)
+        FAIL_STACK_ERROR
+
+    /* Should be 100 */
+    if(attempts != H5F_SWMR_METADATA_READ_ATTEMPTS)
+        TEST_ERROR;
+
+    /* Close the property list */
+    if(H5Pclose(file_fapl) < 0)
+        FAIL_STACK_ERROR;
+
+    rdata = 0;
+    /* Read from "dataset1" via did1_b (multiple opens) */
+    if(H5Dread(did1_b, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata) < 0)
+        FAIL_STACK_ERROR;
+    if(wdata != rdata)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did1_b) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Read from "dataset1" */
+    rdata = 0;
+    if(H5Dread(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata) < 0)
+        FAIL_STACK_ERROR;
+    if(wdata != rdata)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did1) < 0)
+        FAIL_STACK_ERROR;
+
+    rdata = 0;
+    /* Read from "dataset1" via did1_a (multiple opens) */
+    if(H5Dread(did1_a, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata) < 0)
+        FAIL_STACK_ERROR;
+    if(wdata != rdata)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did1_a) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close "dataset2", dataspace, dataset creation property list */
+    if(H5Dclose(did2) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Sclose(sid2) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(dcpl) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Create "dataset3" */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) 
+        FAIL_STACK_ERROR
+    if(H5Pset_chunk(dcpl, 2, chunk_dim2) < 0) 
+        FAIL_STACK_ERROR
+    if((sid3 = H5Screate_simple(2, dim2, max_dim2)) < 0) 
+        FAIL_STACK_ERROR;
+    if((did3 = H5Dcreate2(fid, "dataset3", H5T_NATIVE_INT, sid3, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) 
+        FAIL_STACK_ERROR;
+
+    /* Get the chunk index type for "dataset3" */
+    if(H5D__layout_idx_type_test(did3, &idx_type) < 0) 
+        FAIL_STACK_ERROR;
+    if(idx_type != H5D_CHUNK_IDX_BT2)
+        FAIL_PUTS_ERROR("should be using v2 B-tree as index");
+
+    /* Close "dataset3", dataspace, dataset creation property list */
+    if(H5Dclose(did3) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Sclose(sid3) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(dcpl) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the group */
+    if(H5Gclose(gid) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the file access property list */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR;
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Fclose(fid);
+        H5Pclose(fapl);
+        H5Pclose(file_fapl);
+        H5Gclose(gid);
+        H5Pclose(dcpl);
+        H5Dclose(did1);
+        H5Dclose(did1_a);
+        H5Dclose(did1_b);
+        H5Dclose(did2);
+        H5Dclose(did3);
+        H5Sclose(sid1);
+        H5Sclose(sid2);
+        H5Sclose(sid3);
+    } H5E_END_TRY;
+
+    return -1;
+} /* test_start_swmr_write() */
+
+/*
+ *  test_err_start_swmr_write():
+ *
+ *  Verify failure conditions in enabling SWMR writing mode via H5Fstart_swmr_write():
+ *  (A) When creating a file:
+ *      (1) Create a file with SWMR write + with/without latest format
+ *      --fail to enable SWMR because the file is already in SWMR writing mode
+ *      If (latest-format):
+ *      (2a) Create a file with write + latest format and with opened named datatype
+ *      --fail to enable SWMR because there are opened datatype
+ *      If !(latest-format):
+ *      (2b) Create a file with write + non-latest-format
+ *              --fail to enable SWMR because superblock version is not at least 3
+ *
+ *  (B) When opening a file which is created with write + latest format:
+ *      (1) Open the file with SWMR write + with/without latest format
+ *      --fail to enable SWMR because the file is already in SWMR writing mode
+ *      (2) Open the file with read only + with/without latest format
+ *      --fail to enable SWMR because the file is not opened with write
+ *      (3) Open the file with SWMR read only + with/without latest format
+ *      --fail to enable SWMR because the file is not opened with write
+ *      (4) Open the file with write + with/without latest format and with opened named datatype/attribute
+ *      --fail to enable SWMR because there are opened datatype/attribute
+ *
+ *  (C) When doing multiple opens for a file:
+ *      Create a file with (a) write + latest format or (b) SMWR write + non-latest-format
+ *      Close the file
+ *      (1) --Open the file with write + with/without latest format
+ *      --Enable SWMR writing mode twice 
+ *      --First time succeed, second time fail
+ *      --Close the file
+        (2) --Open the file with write + with/without latest format
+ *      --Succeed to enable SWMR writing mode
+ *      --Reopen the same file
+ *          --fail to enable SWMR writing mode for the reopened file
+ *      --Close the file
+        (3) --Open the file with write + with/without latest format
+ *      --Open the same file again
+ *          --succeed to enable SWMR for the first opened file
+ *          --fail to enable SWMR for the second opened file
+ *      --Close the file
+ *
+ *  (D) (!new_format): When opening a file which is created with write + non-latest-format:
+ *          (1) Open the file with SWMR write+latest format
+ *              --fail to open due to superblock version not 3
+ *          (2) Open the file with SWMR write+non-latest-format
+ *              --fail to open due to superblock version not 3
+
+ *          (3) Open the file with write+latest format
+ *              --fail to enable SWMR due to superblock version not 3
+ *          (4) Open the file with write+non-latest-format
+ *              --fail to enable SWMR due to superblock version not 3
+ */
+static int
+test_err_start_swmr_write(hid_t in_fapl, hbool_t new_format)
+{
+    hid_t fid = -1;         /* File ID */
+    hid_t fid2 = -1;            /* File ID */
+    hid_t fapl = -1;            /* A copy of file access property */
+    hid_t new_fapl = -1;        /* A copy of file access property */
+    hid_t gid = -1;         /* Group ID */
+    hid_t did = -1;         /* Dataset ID */
+    hid_t sid = -1;         /* Dataspace ID */
+    hid_t aid = -1;         /* Attribute ID */
+    hid_t tid = -1;         /* Datatype ID */
+    hid_t bad_fid = -1;     /* Test fid (should never represent a real ID) */
+    herr_t ret;             /* Return value */
+    char filename[NAME_BUF_SIZE];   /* File name */
+    
+    /* Create a copy of the input parameter in_fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0) 
+        FAIL_STACK_ERROR
+
+    if((new_fapl = H5Pcopy(in_fapl)) < 0) 
+        FAIL_STACK_ERROR
+    /* Set to use the latest library format */
+    if(H5Pset_libver_bounds(new_fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+    if(new_format) {
+        TESTING("H5Fstart_swmr_write() on failure conditions for latest format");
+
+    if((fapl = H5Pcopy(new_fapl)) < 0) 
+        FAIL_STACK_ERROR
+    } else {
+        TESTING("H5Fstart_swmr_write() on failure conditions for without latest format");
+    }
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
+
+
+    /* 
+     * (A) When creating a file:
+     */
+
+    /* Case 1 */
+
+    /* Create the file with SWMR_WRITE + with/without latest format */
+    fid = H5Fcreate(filename, H5F_ACC_TRUNC|H5F_ACC_SWMR_WRITE, H5P_DEFAULT, fapl);
+
+    /* Should fail to enable SWMR writing when the file is already in SWMR writing mode */
+    H5E_BEGIN_TRY {
+        ret = H5Fstart_swmr_write(fid);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Case 2 */
+
+    if(new_format) {
+
+        /* Create the file with write + latest format */
+        if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Create and commit a named datatype */
+        if((tid = H5Tcopy(H5T_NATIVE_INT)) < 0)
+            FAIL_STACK_ERROR;
+        if(H5Tcommit2(fid, "TID", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0)
+            FAIL_STACK_ERROR;
+
+        /* Should fail to enable SWMR writing when there is an opened named datatype */
+        H5E_BEGIN_TRY {
+            ret = H5Fstart_swmr_write(fid);
+        } H5E_END_TRY;
+        if(ret >= 0)
+            TEST_ERROR
+
+        /* Close the datatype */
+        if(H5Tclose(tid) < 0)
+            FAIL_STACK_ERROR;
+
+        /* Should succeed in enabling SWMR writing */
+        if(H5Fstart_swmr_write(fid) < 0)
+            TEST_ERROR;
+
+        /* Close the file */
+        if(H5Fclose(fid) < 0)
+            FAIL_STACK_ERROR;
+
+    } else {
+
+        /* Create a file with write + non-latest-format */
+        if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+
+        /* Should fail to enable SWMR writing because the file's superblock version is not at least 3 */
+        H5E_BEGIN_TRY {
+            ret = H5Fstart_swmr_write(fid);
+        } H5E_END_TRY;
+        if(ret >= 0)
+            TEST_ERROR
+
+        if(H5Fclose(fid) < 0)
+            FAIL_STACK_ERROR;
+    } /* end if */
+
+    /* 
+     * (B) When opening a file which is created with the latest format
+     */
+
+    /* Create a file with write + latest format */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, new_fapl)) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR;
+    
+    /* Case 1 */
+
+    /* Open the file with SWMR write + with/without latest format */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Should fail to enable SWMR writing when the file is already in SWMR writing mode */
+    H5E_BEGIN_TRY {
+        ret = H5Fstart_swmr_write(fid);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Case 2 */
+
+    /* Open the file with read only access + with/without latest format */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Should fail to enable SWMR writing when the file is opened with read only access */
+    H5E_BEGIN_TRY {
+        ret = H5Fstart_swmr_write(fid);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Case 3 */
+
+    /* Open the file file with SWMR read access + with/without latest format */
+    if((fid = H5Fopen(filename, H5F_ACC_SWMR_READ, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Should fail to enable SWMR writing when the file is opened with SWMR read access only */
+    H5E_BEGIN_TRY {
+        ret = H5Fstart_swmr_write(fid);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Case 4 */
+
+    /* Open the file with write + with/without latest format */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Create and commit a named datatype */
+    if((tid = H5Tcopy(H5T_NATIVE_INT)) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Tcommit2(fid, "TID", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Create dataspace */
+    if((sid = H5Screate(H5S_SCALAR)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Attach an attribute to the named datatype */
+    if((aid = H5Acreate2(tid, "attr", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Should fail to enable SWMR writing when there are opened named datatype and attribute */
+    H5E_BEGIN_TRY {
+        ret = H5Fstart_swmr_write(fid);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Close the datatype */
+    if(H5Tclose(tid) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Still fail to enable SWMR writing when the attribute is still opened */
+    H5E_BEGIN_TRY {
+        ret = H5Fstart_swmr_write(fid);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Close the attribute */
+    if(H5Aclose(aid) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Should succeed in enabling SWMR writing */
+    if(H5Fstart_swmr_write(fid) < 0)
+        TEST_ERROR;
+
+    /* Close the dataspace */
+    if(H5Sclose(sid) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR;
+
+
+    /* 
+     * (C) Failure cases for multiple opens 
+     */
+
+    /* Case 1 */
+
+    /* Create a file with write + with/without latest format */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC | (new_format ? 0 : H5F_ACC_SWMR_WRITE), H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR;
+    
+    /* Open the file with write + with/without latest format */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Should succeed in enabling SWMR writing mode */
+    if(H5Fstart_swmr_write(fid) < 0)
+        TEST_ERROR
+
+    /* Should fail for a second call to enable SWMR writing mode */
+    H5E_BEGIN_TRY {
+        ret = H5Fstart_swmr_write(fid);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR;
+
+
+    /* Case 2 */
+
+    /* Open the file with write + with/without latest format */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Should succeed in enabling SWMR writing mode */
+    if(H5Fstart_swmr_write(fid) < 0)
+        TEST_ERROR
+
+    /* Re-open the same file */
+    if((fid2 = H5Freopen(fid)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Should fail to enable SWMR writing mode for fid2 */
+    H5E_BEGIN_TRY {
+        ret = H5Fstart_swmr_write(fid2);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Close the files */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Fclose(fid2) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Case 3 */
+
+    /* Open the file with write + with/without latest format */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Open the same file */
+    if((fid2 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Should succeed in enabling SWMR writing for fid */
+    if(H5Fstart_swmr_write(fid) < 0)
+        TEST_ERROR
+
+    /* Should fail to enable SWMR writing for fid2 */
+    H5E_BEGIN_TRY {
+        ret = H5Fstart_swmr_write(fid2);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Close the files */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Fclose(fid2) < 0)
+        FAIL_STACK_ERROR;
+
+    if(!new_format) {
+
+        /*
+         * (D) When opening a file which is created without the latest format:
+         */
+
+         /* Create a file with write + without latest format */
+        if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            FAIL_STACK_ERROR;
+        if(H5Fclose(fid) < 0)
+            FAIL_STACK_ERROR;
+
+        /* Case 1 */
+
+        /* Should fail to open the file with SWMR write + latest format due to superblock version not at least 3 */
+        H5E_BEGIN_TRY {
+            bad_fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, new_fapl);
+        } H5E_END_TRY;
+        if(bad_fid >= 0)
+            TEST_ERROR
+
+        /* Case 2 */
+
+        /* Should fail to open the file with SWMR write + non-latest-format due to superblock version not at least 3 */
+        H5E_BEGIN_TRY {
+            bad_fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl);
+        } H5E_END_TRY;
+        if(bad_fid >= 0)
+            TEST_ERROR
+
+        /* Case 3 */
+
+        /* Open the file with write + latest format */
+        if((fid = H5Fopen(filename, H5F_ACC_RDWR, new_fapl)) < 0)
+            FAIL_STACK_ERROR;
+
+        /* Should fail to enable SWMR writing due to superblock version not at least 3 */
+        H5E_BEGIN_TRY {
+            ret = H5Fstart_swmr_write(fid);
+        } H5E_END_TRY;
+        if(ret >= 0)
+            TEST_ERROR
+
+        if(H5Fclose(fid) < 0)
+            FAIL_STACK_ERROR;
+
+
+        /* Case 4 */
+
+        /* Open the file with write + non-latest-format */
+        if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+            FAIL_STACK_ERROR;
+
+        /* Should fail to enable SWMR writing because the file's superblock version is not at least 3 */
+        H5E_BEGIN_TRY {
+            ret = H5Fstart_swmr_write(fid);
+        } H5E_END_TRY;
+        if(ret >= 0)
+            TEST_ERROR
+
+        if(H5Fclose(fid) < 0)
+            FAIL_STACK_ERROR;
+
+    } /* not new */
+
+    /* Close the file access property list */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(new_fapl) < 0)
+        FAIL_STACK_ERROR;
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Sclose(sid);
+        H5Gclose(gid);
+        H5Dclose(did);
+        H5Fclose(fid);
+        H5Fclose(fid2);
+        H5Pclose(fapl);
+        H5Pclose(new_fapl);
+        /* bad_fid should only represent a read ID in the error case.
+         * It never needs to be closed in the normal case.
+         */
+        H5Fclose(bad_fid);
+    } H5E_END_TRY;
+
+    return -1;
+} /* test_err_start_swmr_write() */
+
+/*
+ * test_start_swmr_write_concur():
+ *
+ * The "new_format" parameter indicates whether to create the file with latest format or not.
+ *  To have SWMR support, can use either one of the following in creating a file:
+ *  (a) Create the file with write + latest format:
+ *      --result in v3 superblock with latest chunk indexing types
+ *  (b) Create the file with SWMR write + non-latest-format:
+ *      --result in v3 superblock with latest chunk indexing types
+ *  Create a chunked dataset with 1 extendible dimension in the file
+ *
+ * Verify concurrent access for H5Fstart_swmr_write()--
+ *  (1) Parent: open a file with write access
+ *      Child: concurrent open of the file with read & SWMR read (fail)
+ *  (2) Parent: open a file with write access; enable SWMR writing mode
+ *      Child: open the file 2 times with read & SWMR read (succeed)
+ *	       open the dataset 2 times with the 2 file opens
+ *	       verify data read from multiple opens of the dataset is correct
+ *  (3) Parent: open a file with write access; enable SWMR writing mode
+ *      Child: Concurrent open of the file with read only (fail)
+ *  (4) Parent: open a file with write access; enable SWMR writing mode
+ *      Child: concurrent open of the file with write access (fail)
+ *  (5) Parent: open a file with write access; enable SWMR writing mode
+ *      Child: concurrent open of the file with write and SWMR write access (fail)
+ */
+#if !(defined(H5_HAVE_FORK) && defined(H5_HAVE_WAITPID))
+
+static int
+test_start_swmr_write_concur(hid_t H5_ATTR_UNUSED in_fapl, hbool_t H5_ATTR_UNUSED new_format)
+{
+    SKIPPED();
+    HDputs("    Test skipped due to fork or waitpid not defined.");
+    return 0;
+} /* test_start_swmr_write_concur() */
+
+#else /* defined(H5_HAVE_FORK && defined(H5_HAVE_WAITPID) */
+
+static int
+test_start_swmr_write_concur(hid_t in_fapl, hbool_t new_format)
+{
+    hid_t fid = -1, fid1 = -1, fid2 = -1;	/* File IDs */
+    hid_t fapl;             /* File access property list */
+    pid_t childpid=0;           /* Child process ID */
+    pid_t tmppid;           /* Child process ID returned by waitpid */
+    int child_status;           /* Status passed to waitpid */
+    int child_wait_option=0;        /* Options passed to waitpid */
+    int child_exit_val;         /* Exit status of the child */
+    char filename[NAME_BUF_SIZE];   /* File name */
+
+    hid_t did = -1, did1 = -1, did2 = -1, did3 = -1;
+    hid_t sid = -1;
+    hid_t dcpl = -1;
+    hsize_t chunk_dims[1] = {1};
+    hsize_t maxdims[1] = {H5S_UNLIMITED};
+    hsize_t dims[1] = {1};
+    int wdata = 0;
+
+    int out_pdf[2];
+    int in_pdf[2];
+    int notify = 0;
+
+    /* Output message about test being performed */
+    if(new_format) {
+        TESTING("H5Fstart_swmr_write()--concurrent access for latest format");
+    } else {
+        TESTING("H5Fstart_swmr_write()--concurrent access for non-latest-format");
+    } /* end if */
+
+    if((fapl = H5Pcopy(in_fapl)) < 0) 
+        FAIL_STACK_ERROR
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
+
+    if(new_format) {
+        /* Set to use the latest library format */
+        if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+            FAIL_STACK_ERROR
+
+        /* Create the test file */
+        if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            FAIL_STACK_ERROR
+    } else {
+        /* Create the test file without latest format but with SWMR write */
+        if((fid = H5Fcreate(filename, H5F_ACC_TRUNC|H5F_ACC_SWMR_WRITE, H5P_DEFAULT, fapl)) < 0)
+            FAIL_STACK_ERROR
+    } /* end if */
+
+     /* Create a chunked dataset with 1 extendible dimension */
+    if((sid = H5Screate_simple(1, dims, maxdims)) < 0)
+        FAIL_STACK_ERROR;
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_chunk(dcpl, 1, chunk_dims) < 0)
+        FAIL_STACK_ERROR;
+    if((did = H5Dcreate2(fid, "dataset", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0)
+        FAIL_STACK_ERROR
+    if(H5Sclose(sid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create 1 pipe */
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     *  Case (1):
+     *  Verify concurrent file open with H5F_ACC_RDONLY|H5F_ACC_SWMR_READ 
+     *  will fail without H5Fstart_swmr_write() 
+     */
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+	int child_notify = 0;
+
+	/* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Should fail */
+        H5E_BEGIN_TRY {
+            /* Open the test file */
+            fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl);
+        } H5E_END_TRY;
+        if(fid >= 0)
+            HDexit(EXIT_FAILURE);
+
+	/* Close the pipe */
+        if(HDclose(out_pdf[0]) < 0)
+	    HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_SUCCESS);
+    }
+
+    /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if((tmppid = HDwaitpid(childpid, &child_status, child_wait_option)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check exit status of child process */
+    if(WIFEXITED(child_status)) {
+        if((child_exit_val = WEXITSTATUS(child_status)) != 0)
+            TEST_ERROR
+    } else  /* child process terminated abnormally */
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     *  Case (2):
+     *  Verify concurrent file open with H5F_ACC_RDONLY|H5F_ACC_SWMR_READ 
+     *  will succeed with H5Fstart_swmr_write() 
+     */
+
+    /* Create 2 pipes */
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+    if(HDpipe(in_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+        hid_t child_fid1 = -1, child_fid2;    /* File IDs */
+        hid_t child_did1 = -1, child_did2 = -1;    /* Dataset IDs */
+	int child_notify = 0;
+	int rdata = 0;
+	
+        /* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+	/* close unused read end for in_pdf */
+        if(HDclose(in_pdf[0]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Should succeed in opening the test file 2 times */
+        if((child_fid1 = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl)) < 0)
+            HDexit(EXIT_FAILURE);
+        if((child_fid2 = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl)) < 0)
+            HDexit(EXIT_FAILURE);
+
+	/* open "dataset" 2 times */
+	if((child_did1 = H5Dopen2(child_fid1, "dataset", H5P_DEFAULT)) < 0)
+            HDexit(EXIT_FAILURE);
+	if((child_did2 = H5Dopen2(child_fid2, "dataset", H5P_DEFAULT)) < 0)
+            HDexit(EXIT_FAILURE);
+
+	/* Read from "dataset" via child_did1 */
+	rdata = 0;
+	if(H5Dread(child_did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata) < 0)
+            HDexit(EXIT_FAILURE);
+	if(rdata != 88)
+            HDexit(EXIT_FAILURE);
+
+	/* Notify parent process */
+        child_notify = 2;
+	if(HDwrite(in_pdf[1], &child_notify, sizeof(int)) < 0)
+	    HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 3) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+	/* Refresh "dataset" via child_did2 */
+	if(H5Drefresh(child_did2) < 0)
+            HDexit(EXIT_FAILURE);
+
+	/* Read from "dataset" child_did2 */
+	rdata = 0;
+	if(H5Dread(child_did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata) < 0)
+            HDexit(EXIT_FAILURE);
+	if(rdata != 99)
+            HDexit(EXIT_FAILURE);
+
+	/* Read from "dataset" child_did1 */
+	rdata = 0;
+	if(H5Dread(child_did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata) < 0)
+            HDexit(EXIT_FAILURE);
+	if(rdata != 99)
+            HDexit(EXIT_FAILURE);
+
+	/* Close the dataset */
+	if(H5Dclose(child_did1))
+            HDexit(EXIT_FAILURE);
+	if(H5Dclose(child_did2))
+            HDexit(EXIT_FAILURE);
+
+	/* Close the file */
+        if(H5Fclose(child_fid1) < 0)
+            HDexit(EXIT_FAILURE);
+        if(H5Fclose(child_fid2) < 0)
+            HDexit(EXIT_FAILURE);
+
+	/* Close the pipe */
+        if(HDclose(out_pdf[0]) < 0)
+	    HDexit(EXIT_FAILURE);
+	if(HDclose(in_pdf[1]) < 0)
+	    HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_SUCCESS);
+    }
+
+    /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+    /* Close unused write end for in_pdf */
+    if(HDclose(in_pdf[1]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file */
+    if((fid1 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+    if((fid2 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* open "dataset", keep it open */
+    if((did1 = H5Dopen2(fid1, "dataset", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+    if((did2 = H5Dopen2(fid2, "dataset", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+    if((did3 = H5Dopen2(fid1, "dataset", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+
+     /* Write to "dataset" */
+    wdata = 88;
+    if(H5Dwrite(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &wdata) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Flush to disk */
+    if(H5Fflush(fid1, H5F_SCOPE_LOCAL) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Enable SWMR writing mode */
+    if(H5Fstart_swmr_write(fid1) < 0)
+        TEST_ERROR
+
+    /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for notification from child process */
+    while(notify != 2) {
+        if(HDread(in_pdf[0], &notify, sizeof(int)) < 0)
+            FAIL_STACK_ERROR;
+    }
+
+     /* Write to "dataset" */
+    wdata = 99;
+    if(H5Dwrite(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &wdata) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Flush to disk */
+    if(H5Fflush(fid1, H5F_SCOPE_LOCAL) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Notify child process */
+    notify = 3;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the dataset */
+    if(H5Dclose(did1) < 0)
+        FAIL_STACK_ERROR
+    if(H5Dclose(did2) < 0)
+        FAIL_STACK_ERROR
+    if(H5Dclose(did3) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the pipes */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+    if(HDclose(in_pdf[0]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if((tmppid = HDwaitpid(childpid, &child_status, child_wait_option)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check exit status of child process */
+    if(WIFEXITED(child_status)) {
+        if((child_exit_val = WEXITSTATUS(child_status)) != 0)
+            TEST_ERROR
+    } else  /* Child process terminated abnormally */
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid1) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid2) < 0)
+        FAIL_STACK_ERROR
+
+
+    /* 
+     *  Case (3):
+     *  Verify concurrent file open with H5F_ACC_RDONLY
+     *  will fail with H5Fstart_swmr_write() 
+     */
+    /* Create 1 pipe */
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+	int child_notify = 0;
+
+	/* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Should fail in opening the test file */
+        H5E_BEGIN_TRY {
+            fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl);
+        } H5E_END_TRY;
+        if(fid >= 0)
+            HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_SUCCESS);
+    } /* end if */
+
+    /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Enable SWMR writing mode */
+    if(H5Fstart_swmr_write(fid) < 0)
+        TEST_ERROR
+
+    /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if((tmppid = HDwaitpid(childpid, &child_status, child_wait_option)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check exit status of child process */
+    if(WIFEXITED(child_status)) {
+        if((child_exit_val = WEXITSTATUS(child_status)) != 0)
+            TEST_ERROR
+    } else  /* Child process terminated abnormally */
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     *  Case (4):
+     *  Verify concurrent file open with H5F_ACC_RDWR
+     *  will fail with H5Fstart_swmr_write() 
+     */
+
+    /* Create 1 pipe */
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+	 int child_notify = 0;
+
+	/* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Should fail in opening the test file */
+        H5E_BEGIN_TRY {
+            fid = H5Fopen(filename, H5F_ACC_RDWR, fapl);
+        } H5E_END_TRY;
+        if(fid >= 0)
+            HDexit(EXIT_FAILURE);
+
+	/* Close the pipe */
+	if(HDclose(out_pdf[0]) < 0)
+	    HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_SUCCESS);
+    } /* end if */
+
+    /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Enable SWMR writing mode */
+    if(H5Fstart_swmr_write(fid) < 0)
+        TEST_ERROR
+
+    /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Wait for child process to complete */
+    if((tmppid = HDwaitpid(childpid, &child_status, child_wait_option)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check exit status of child process */
+    if(WIFEXITED(child_status)) {
+        if((child_exit_val = WEXITSTATUS(child_status)) != 0)
+            TEST_ERROR
+    } else  /* Child process terminated abnormally */
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     *  Case (5):
+     *  Verify concurrent file open with H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE
+     *  will fail with H5Fstart_swmr_write() 
+     */
+
+    /* Create 1 pipe */
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+	int child_notify = 0;
+
+	/* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Should fail in opening the test file */
+        H5E_BEGIN_TRY {
+            fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl);
+        } H5E_END_TRY;
+        if(fid >= 0)
+            HDexit(EXIT_FAILURE);
+
+	/* Close the pipe */
+        if(HDclose(out_pdf[0]) < 0)
+	    HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_SUCCESS);
+    }
+
+    /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Enable SWMR writing mode */
+    if(H5Fstart_swmr_write(fid) < 0)
+        TEST_ERROR
+
+    /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if((tmppid = HDwaitpid(childpid, &child_status, child_wait_option)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check exit status of child process */
+    if(WIFEXITED(child_status)) {
+        if((child_exit_val = WEXITSTATUS(child_status)) != 0)
+            TEST_ERROR
+    } else  /* Child process terminated abnormally */
+        TEST_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the property list */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Sclose(sid);
+        H5Pclose(dcpl);
+        H5Pclose(fapl);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+
+    return -1;
+
+} /* test_start_swmr_write_concur() */
+#endif /* !(defined(H5_HAVE_FORK) && defined(H5_HAVE_WAITPID)) */
+
+/*
+ * Tests for H5Pset/get_object_flush_cb() 
+ */
+
+/* The callback function for object flush property */
+static herr_t 
+flush_cb(hid_t H5_ATTR_UNUSED obj_id, void *_udata)
+{
+    unsigned *flush_ct = (unsigned*)_udata;
+    ++(*flush_ct);
+    return 0;
+}
+
+/*
+ * test_object_flush_cb()
+ *  
+ * Verify the public routines H5Pget/set_object_flush_cb() work as specified:
+ *  1) To verify the failure condition in setting object flush property
+ *  2) To verify the object flush property values retrieved from a default 
+ *     file access property list.
+ *  3) To verify the object flush property values retrieved from a non-default
+ *     file access property list.
+ *  4) To verify the object flush property values retrieved from a default
+ *     file access property list of a file
+ *  5) To verify the object flush property values retrieved from a non-default
+ *     file access property list of a file
+ *     To verify the object flush callback is invoked when doing H5Oflush(),
+ *     H5Dflush(), H5Gflush() and H5Tflush().
+ */
+static int
+test_object_flush_cb(hid_t in_fapl)
+{
+    hid_t fapl = -1;            /* A copy of file access property list */
+    hid_t ffapl = -1;           /* A file's file access property list */
+    hid_t fid = -1;         /* File ID */
+    hid_t gid = -1;         /* Group ID */
+    hid_t did1 = -1, did2 = -1;     /* Dataset IDs */
+    hid_t sid = -1;         /* Dataspace ID */
+    hsize_t dims[2] = {5, 10};      /* Dataset dimension sizes */
+    int buf[50];            /* Data buffer */
+    H5F_flush_cb_t ret_cb;      /* The callback function set in object flush property */
+    void *ret_ct;           /* The user data set in object flush property */
+    unsigned flush_ct = 0;      /* The user data for object flush property */
+    char filename[NAME_BUF_SIZE];   /* File name */
+    int i;              /* Local index variable */
+    herr_t ret;                 /* Generic return value */
+
+    TESTING("H5Pget/set_obj_flush_cb()");
+    
+    /*
+     * Case (1) 
+     *  To verify the failure condition in setting object flush property
+     */
+    /* Should fail if the callback function is not defined but user data is defined */
+    H5E_BEGIN_TRY {
+        ret = H5Pset_object_flush_cb(fapl, NULL, &flush_ct);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /*
+     * Case (2)
+     *  To verify the object flush property values retrieved from a
+     *  default file access property list.
+     */
+
+    /* Create a copy of file access property list */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve object flush property values for the default file access property list */
+    if(H5Pget_object_flush_cb(fapl, &ret_cb, &ret_ct) < 0)
+        TEST_ERROR
+    /* Should be null */
+    if(ret_cb != NULL || ret_ct != NULL)
+        TEST_ERROR
+
+    /*
+     * Case (3)
+     *  To verify the object flush property values retrieved from a
+     *  non-default file access property list.
+     */
+    /* Set the object flush property */
+    if(H5Pset_object_flush_cb(fapl, flush_cb, &flush_ct) < 0)
+        TEST_ERROR
+
+    /* Increment the counter */
+    ++flush_ct;
+
+    /* Retrieve object flush property values for the non-default file access property list */
+    if(H5Pget_object_flush_cb(fapl, &ret_cb, &ret_ct) < 0)
+        TEST_ERROR
+
+    /* Verify expected values */
+    if(ret_cb != flush_cb || *(unsigned *)ret_ct != 1)
+        TEST_ERROR
+
+    /* Close the property list */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR;
+
+    /*
+     * Case (4)
+     *  To verify the object flush property values retrieved from a
+     *  default file access property list of a file
+     */
+
+    /* Reset values */
+    flush_ct = 0;
+    ret_cb = NULL;
+    ret_ct = NULL;
+
+    /* Make a copy of the input parameter in_fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0) 
+        FAIL_STACK_ERROR
+
+    /* Set to use the latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
+
+    /* Create the test file: without setting object flush property in fapl */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get the file's file access property list */
+    if((ffapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Retrieve the object flush property values */
+    if(H5Pget_object_flush_cb(ffapl, &ret_cb, &ret_ct) < 0)
+        TEST_ERROR
+
+    /* Verify expected values */
+    if(ret_cb != NULL || ret_ct != NULL)
+        TEST_ERROR
+
+    /* Closing */
+    if(H5Pclose(ffapl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR;
+
+    /*
+     * Cases (5)
+     *  To verify the object flush property values retrieved from a non-default
+     *  file access property list of a file.
+     *  To verify the object flush callback is invoked when doing H5Oflush(),
+     *  H5Dflush(), H5Gflush() and H5Tflush().
+     */
+    /* Reset values */
+    flush_ct = 0;
+    ret_cb = NULL;
+    ret_ct = NULL;
+
+    /* Set the object flush property */
+    if(H5Pset_object_flush_cb(fapl, flush_cb, &flush_ct) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file: with object flush property setting in fapl */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Create a dataset */
+    if((sid = H5Screate_simple(2, dims, dims)) < 0) 
+        FAIL_STACK_ERROR;
+
+    /* Create a dataset */
+    if((did1 = H5Dcreate2(fid, "dataset1", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) 
+        FAIL_STACK_ERROR
+
+    /* Initialize data buffer */
+    for(i = 0; i < 50; i++)
+    buf[i] = i + 1;
+
+    /* Write to the dataset */
+    if(H5Dwrite(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Flush the dataset object */
+    if(H5Oflush(did1) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Get the file's file access property list */
+    if((ffapl = H5Fget_access_plist(fid)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Retrieve the object flush property values */
+    if(H5Pget_object_flush_cb(ffapl, &ret_cb, &ret_ct) < 0)
+        TEST_ERROR
+
+    /* Verify expected values */
+    if(ret_cb != flush_cb || *(unsigned *)ret_ct != 1)
+        TEST_ERROR
+
+    /* Create a group */
+    if((gid = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) 
+        FAIL_STACK_ERROR
+
+    /* Flush the group */
+    if(H5Gflush(gid) < 0)
+        TEST_ERROR
+
+    /* Retrieve the object flush property values */
+    if(H5Pget_object_flush_cb(ffapl, &ret_cb, &ret_ct) < 0)
+        TEST_ERROR
+
+    /* Verify expected values */
+    if(ret_cb != flush_cb || *(unsigned *)ret_ct != 2)
+        TEST_ERROR
+
+    /* Create a dataset */
+    if((did2 = H5Dcreate2(gid, "dataset2", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) 
+        FAIL_STACK_ERROR
+
+    /* Flush the dataset */
+    if(H5Dflush(did2) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Retrieve the object flush property values */
+    if(H5Pget_object_flush_cb(ffapl, &ret_cb, &ret_ct) < 0)
+        TEST_ERROR
+
+    /* Verify expected values */
+    if(ret_cb != flush_cb || *(unsigned *)ret_ct != 3)
+        TEST_ERROR
+
+    /* Closing */
+    if(H5Sclose(sid) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did1) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did2) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Gclose(gid) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(ffapl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR;
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+        H5Pclose(ffapl);
+        H5Sclose(sid);
+        H5Dclose(did1);
+        H5Dclose(did2);
+        H5Gclose(gid);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+
+    return -1;
+} /* test_object_flush_cb() */
+
+/*
+ * Tests for H5Pset/get_append_flush() 
+ */
+
+
+/* The callback function for append flush property */
+static herr_t
+append_cb(hid_t H5_ATTR_UNUSED dset_id, hsize_t H5_ATTR_UNUSED *cur_dims, void *_udata)
+{
+    unsigned *count = (unsigned *)_udata;
+    ++(*count++);
+    return 0;
+} /* append_cb() */
+
+
+/* The callback function for append flush property */
+static herr_t
+append_cb2(hid_t H5_ATTR_UNUSED dset_id, hsize_t H5_ATTR_UNUSED *cur_dims, void *_udata)
+{
+    unsigned *count = (unsigned *)_udata;
+    ++(*count++);
+    return 0;
+} /* append_cb2() */
+
+
+
+/*
+ * test_append_flush_generic()
+ *
+ * Verify H5Pget/set_append_flush() work as specified for a generic dataset
+ * access property list:
+ *  1) To verify the append flush property values retrieved from a default
+ *     access property list.
+ *      -- zero boundary, null callback function, null user data
+ *  2) To verify the failure conditions in setting append flush property:
+ *      -- an invalid dataset rank: <= 0, > H5S_MAX_RANK
+ *      -- undefined callback but defined user data
+ *      -- no boundary specified
+ *      -- invalid boundary size: H5S_UNLIMITED, negative value
+ *  3) To verify the append flush property values retrieved from a non-default
+ *     access property list.
+ *      -- the set callback function, the set user data
+ *      -- the # of boundary sizes retrieved does not exceed MIN(input ndims, the ndims set)
+ */
+static int
+test_append_flush_generic(void)
+{
+    hid_t dapl = -1;            /* A copy of dataset access property */
+    hsize_t boundary[3];        /* The boundary for append flush property */
+    unsigned count = 0;         /* The user data for append flush property */
+    hsize_t ret_boundary[3];        /* The boundary set in append flush property */
+    H5D_append_cb_t ret_cb;     /* The callback function set in append flush property */
+    unsigned *ret_count;        /* The user data set in append flush property */
+    herr_t ret;             /* The return value */
+
+    TESTING("H5Fget/set_append_flush() for a generic dataset access property list");
+
+
+    /* 
+     * Case (1)
+     *  To verify the retrieved append flush property values:
+     *      -- zero boundary, null callback function, null user data
+     */
+
+    /* Create a copy of dataset access property list */
+    if((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0) 
+        FAIL_STACK_ERROR
+
+    /* Retrieve the append flush property values */
+    if(H5Pget_append_flush(dapl, 2, ret_boundary, &ret_cb, (void **)&ret_count) < 0)
+        FAIL_STACK_ERROR
+
+    /* Verify expected values */
+    if(ret_boundary[0] != 0 || ret_boundary[1] != 0)
+        TEST_ERROR;
+    if(ret_cb != NULL || ret_count != NULL)
+        TEST_ERROR
+
+    /* Close the property list */
+    if(H5Pclose(dapl) < 0)
+        FAIL_STACK_ERROR;
+
+    /* 
+     * Case (2)
+     *  To verify the failure conditions in setting append flush property:
+     *  -- an invalid dataset rank: <= 0, > H5S_MAX_RANK
+     *  -- no boundary specified
+     *  -- undefined callback but defined user data
+     *  -- invalid boundary size: H5S_UNLIMITED, negative value
+     */
+
+    /* Create a copy of dataset access property list */
+    if((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Invalid dataset rank: zero value */
+    H5E_BEGIN_TRY {
+        ret = H5Pset_append_flush(dapl, 0, NULL, NULL, &count);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Invalid dataset rank: > H5S_MAX_RANK */
+    H5E_BEGIN_TRY {
+        ret = H5Pset_append_flush(dapl, H5S_MAX_RANK+1, NULL, NULL, &count);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* No boundary specified */
+    H5E_BEGIN_TRY {
+        ret = H5Pset_append_flush(dapl, 2, NULL, NULL, &count);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Set up a valid boundary */
+    boundary[0] = 1;
+    boundary[1] = 1;
+
+    /* Undefined callback function but defined user data */
+    H5E_BEGIN_TRY {
+        ret = H5Pset_append_flush(dapl, 2, boundary, NULL, &count);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Invalid boundary size: negative value */
+    boundary[0] = (hsize_t)-1;
+    boundary[1] = 1;
+    H5E_BEGIN_TRY {
+        ret = H5Pset_append_flush(dapl, 2, boundary, append_cb, &count);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Invalid boundary size: H5S_UNLIMITED */
+    boundary[0] = 1;
+    boundary[1] = H5S_UNLIMITED;
+    H5E_BEGIN_TRY {
+        ret = H5Pset_append_flush(dapl, 2, boundary, append_cb, &count);
+    } H5E_END_TRY;
+    if(ret >= 0)
+        TEST_ERROR
+    
+    /*
+     * Case (3)
+     *  To verify the append flush property values retrieved from a non-default
+     *  access property list:
+     *      -- the set callback function, the set user data
+     *      -- the # of boundary sizes retrieved does not exceed MIN(input ndims, the ndims set)
+     */
+    boundary[0] = boundary[1] = 1;
+    boundary[2] = 0;
+    count = 1;
+    if(H5Pset_append_flush(dapl, 2, boundary, append_cb, &count) < 0)
+        FAIL_STACK_ERROR;
+    ++count;
+
+    /* Verify expected values: with boundary rank > set boundary rank */
+    if(H5Pget_append_flush(dapl, 3, ret_boundary, &ret_cb, (void **)&ret_count) < 0)
+        TEST_ERROR
+    if(ret_boundary[0] != 1 || ret_boundary[1] != 1 || boundary[2] != 0)
+        TEST_ERROR;
+    if(ret_cb == NULL || ret_count == NULL || *ret_count != 2)
+        TEST_ERROR
+
+    /* Verify expected values: with boundary rank < set boundary rank */
+    HDmemset(ret_boundary, 0, sizeof(ret_boundary));
+    if(H5Pget_append_flush(dapl, 1, ret_boundary, NULL, NULL) < 0)
+        TEST_ERROR
+    if(ret_boundary[0] != 1 || ret_boundary[1] != 0 || boundary[2] != 0)
+        TEST_ERROR;
+
+    /* Closing */
+    if(H5Pclose(dapl) < 0)
+        FAIL_STACK_ERROR;
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(dapl);
+    } H5E_END_TRY;
+
+    return -1;
+} /* test_append_flush_generic() */
+
+/*
+ * test_append_flush_dataset_chunked()
+ *
+ * Verify H5Pget/set_append_flush() work as specified for a chunked dataset's
+ * access property list:
+ *  1) To verify the append flush property values retrieved from a default
+ *     access property list:
+ *     -- zero boundary, null callback function, null user data
+ *      2) To verify failure in creating dataset when:
+ *     -- the rank set in append flush property is not the same as the dataset's rank
+ *     -- boundary (non-zero) is set for a non-extendible dimension
+ *      3) To verify the append flush property values retrieved from a non-default
+ *     access property list:
+ *     -- the set callback function, the set user data
+ *     -- the # of boundary sizes retrieved does not exceed MIN(input ndims, the ndims set)
+ */
+static int
+test_append_flush_dataset_chunked(hid_t in_fapl)
+{
+    hid_t fid = -1;         /* file ID */
+    hid_t fapl = -1;            /* A copy of file access property */
+    hid_t did1 = -1, did2 = -1;     /* The datset ID */
+    hid_t sid = -1;         /* The dataspace ID */
+    hid_t dcpl = -1;            /* A copy of dataset creation property */
+    hid_t dapl = -1;            /* A copy of dataset access property */
+    hid_t ddapl = -1;           /* The dataset access property of the opened dataset */
+
+    hsize_t boundary[3];        /* Boundary size */
+    unsigned count = 0;         /* User data */
+
+    hsize_t ret_boundary[3];        /* Boundary size set in the append flush property */
+    H5D_append_cb_t ret_cb;     /* The callback function set in the append flush property */
+    unsigned *ret_count;        /* The user data set in the append flush property */
+
+    char filename[NAME_BUF_SIZE];   /* file name */
+
+    hsize_t dims[2] = {100, 0};         /* The dataset dimension sizes */
+    hsize_t maxdims[2] = {100, H5S_UNLIMITED};  /* The dataset maximum dimension sizes */
+    hsize_t chunk_dims[2] = {5,2};      /* The chunk dimesion sizes */
+
+    TESTING("H5Fget/set_append_flush() for a chunked dataset's access property list");
+
+    /* 
+     *  Case (1)--
+     *  For a chunked dataset's access property list:
+     *  --to verify the append flush property values retrieved from a default access
+     *    a default access property list is:
+     *      zero rank, zero boundary, null callback function, null user data
+     */
+
+    /* Get a copy of the input parameter in_fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0) 
+        FAIL_STACK_ERROR
+
+    /* Set to use the latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
+
+    /* Create the test file to work on */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create a chunked dataset with 1 extendible dimension */
+    if((sid = H5Screate_simple(2, dims, maxdims)) < 0) 
+        FAIL_STACK_ERROR;
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) 
+        FAIL_STACK_ERROR
+    if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0)
+        FAIL_STACK_ERROR;
+    if((did1 = H5Dcreate2(fid, "dataset1", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) 
+        TEST_ERROR
+
+    /* Get the dataset's access property list */
+    if((ddapl = H5Dget_access_plist(did1)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the append flush property values */
+    if(H5Pget_append_flush(ddapl, 3, ret_boundary, &ret_cb, (void **)&ret_count) < 0)
+        TEST_ERROR
+    
+    /* Verify expected values */
+    if(ret_boundary[0] != 0 || ret_boundary[1] != 0 || ret_boundary[2] != 0)
+        TEST_ERROR;
+    if(ret_cb != NULL || ret_count != NULL) 
+        TEST_ERROR
+
+    /* Close the dataset's access property list */
+    if(H5Pclose(ddapl) < 0)
+        FAIL_STACK_ERROR;
+
+    /* 
+     *  Case (2)--
+     *  For a chunked dataset's access property list:
+     *  --to verify failure in creating the dataset when:
+     *      --the rank set in append flush property is not the same as the dataset's rank
+     *      -- boundary (non-zero) is set for a non-extendible dimension
+     *  --to verify failure in opening the dataset
+     *      -- boundary (non-zero) is set for a non-extendible dimension
+     */
+    /* Create a copy of dataset access property list */
+    if((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0) 
+        FAIL_STACK_ERROR
+
+    /* Set boundary dimension rank > the rank of dataset to be created */
+    HDmemset(boundary, 0, sizeof(boundary));
+    if(H5Pset_append_flush(dapl, 3, boundary, NULL, NULL) < 0)
+        FAIL_STACK_ERROR
+
+    /* Should fail to Create the dataset */
+    H5E_BEGIN_TRY {
+        did2 = H5Dcreate2(fid, "dataset2", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, dapl);
+    } H5E_END_TRY;
+    if(did2 >= 0)
+        TEST_ERROR
+
+    /* Set boundary for a non-extendible dimension */
+    boundary[0] = boundary[1] = 1;
+    if(H5Pset_append_flush(dapl, 2, boundary, NULL, NULL) < 0)
+        FAIL_STACK_ERROR
+
+    /* Should fail to create the dataset */
+    H5E_BEGIN_TRY {
+        did2 = H5Dcreate2(fid, "dataset2", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, dapl);
+    } H5E_END_TRY;
+    if(did2 >= 0)
+        TEST_ERROR
+
+    /* Create and close the dataset */
+    if((did2 = H5Dcreate2(fid, "dataset2", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did2) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Should fail to open the dataset */
+    H5E_BEGIN_TRY {
+    did2 = H5Dopen2(fid, "dataset2", dapl);
+    } H5E_END_TRY;
+    if(did2 >= 0)
+        TEST_ERROR
+
+    /* 
+     *  Case (3)--
+     *  For a chunked dataset's access property list:
+     *  --To verify the append flush property values retrieved from a non-default
+     *    access property list:
+     *      -- the set callback function, the set user data
+     *      -- the # of boundary sizes retrieved does not exceed MIN(input ndims, the ndims set)
+     */
+     
+    boundary[0] = 0;
+    boundary[1] = 1;
+    if(H5Pset_append_flush(dapl, 2, boundary, append_cb, &count) < 0)
+        FAIL_STACK_ERROR
+    if((did2 = H5Dopen2(fid, "dataset2", dapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get the dataset's access property list */
+    if((ddapl = H5Dget_access_plist(did2)) < 0)
+        FAIL_STACK_ERROR
+
+    HDmemset(ret_boundary, 0, sizeof(ret_boundary));
+    ret_cb = NULL;
+    ret_count = NULL;
+    /* Retrieve the append flush property values */
+    if(H5Pget_append_flush(ddapl, 3, ret_boundary, &ret_cb, (void **)&ret_count) < 0)
+        TEST_ERROR
+
+    /* Verify expected values */
+    if(ret_cb != append_cb || ret_count != &count)
+        TEST_ERROR
+    if(ret_boundary[0] != 0 || ret_boundary[1] != 1 || ret_boundary[2] != 0)
+        TEST_ERROR
+
+    HDmemset(ret_boundary, 0, sizeof(ret_boundary));
+    /* Retrieve the append flush property values */
+    if(H5Pget_append_flush(ddapl, 1, ret_boundary, NULL, NULL) < 0)
+        TEST_ERROR
+    if(ret_boundary[0] != 0 || ret_boundary[1] != 0 || ret_boundary[2] != 0)
+        TEST_ERROR
+
+    /* Closing */
+    if(H5Pclose(ddapl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(dapl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(dcpl) < 0)
+        FAIL_STACK_ERROR;
+
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did1) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did2) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Sclose(sid) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR;
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Pclose(dapl);
+        H5Pclose(ddapl);
+        H5Dclose(did1);
+        H5Dclose(did2);
+        H5Pclose(fapl);
+        H5Sclose(sid);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+
+    return -1;
+} /* test_append_flush_dataset_chunked() */
+
+/*
+ * test_append_flush_dataset_fixed():
+ *
+ * Verify H5Pget/set_append_flush() work as specified for a
+ * non-chunked (fixed size) dataset's access property list:
+ *  (1) To verify success in creating the dataset--whatever is set for the append flush property setting
+ *  (2) To verify that default append flush property values are retrieved for both 
+ *      default or non-default access property list:
+ *      -- zero boundary, null callback function, null user data
+ */
+static int
+test_append_flush_dataset_fixed(hid_t in_fapl)
+{
+    hid_t fid = -1;         /* file ID */
+    hid_t fapl = -1;            /* A copy of file access property */
+    hid_t did1 = -1, did2 = -1;     /* The datset ID */
+    hid_t sid = -1;         /* The dataspace ID */
+    hid_t dapl = -1;            /* A copy of dataset access property */
+    hid_t ddapl = -1;           /* The dataset access property of the opened dataset */
+
+    hsize_t boundary[3];        /* Boundary size */
+    unsigned count = 0;         /* User data */
+
+    hsize_t ret_boundary[3];        /* Boundary size set in the append flush property */
+    H5D_append_cb_t ret_cb;     /* The callback function set in the append flush property */
+    unsigned *ret_count;        /* The user data set in the append flush property */
+
+    char filename[NAME_BUF_SIZE];   /* file name */
+
+    hsize_t dims[1] = {100};
+
+    TESTING("H5Fget/set_append_flush() for a non-chunked dataset's access property list");
+
+    /* 
+     *  Case (1)--
+     *  For a non-chunked dataset's access property list:
+     *  --to verify the append flush property values retrieved from
+     *    a default access property list is:
+     *      zero boundary, null callback function, null user data
+     */
+
+    /* Get a copy of the input parameter in_fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0) 
+        FAIL_STACK_ERROR
+
+    /* Set to use the latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
+
+    /* Create the test file to work on */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create a dataset */
+    if((sid = H5Screate_simple(1, dims, dims)) < 0) 
+        FAIL_STACK_ERROR;
+    if((did1 = H5Dcreate2(fid, "dataset1", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) 
+        TEST_ERROR
+
+    /* Get the dataset's access property list */
+    if((ddapl = H5Dget_access_plist(did1)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the append flush property values */
+    if(H5Pget_append_flush(ddapl, 3, ret_boundary, &ret_cb, (void **)&ret_count) < 0)
+        TEST_ERROR
+    
+    /* Verify expected values */
+    if(ret_boundary[0] != 0 || ret_boundary[1] != 0 || ret_boundary[2] != 0)
+        TEST_ERROR;
+    if(ret_cb != NULL || ret_count != NULL) 
+        TEST_ERROR
+
+    /* Close the dataset's access property list */
+    if(H5Pclose(ddapl) < 0)
+        FAIL_STACK_ERROR;
+
+    /* 
+     *  Case (2)--
+     *  For a non-chunked dataset's access property list:
+     *  --to verify success in creating and opening the dataset even when append flush property 
+     *    is setup with error conditions:
+     *      --the rank set in append flush property is not the same as the dataset's rank
+     *      --boundary is set
+     *  --to verify the append flush property values are:
+     *      zero boundary, null callback function, null user data
+     */
+    /* Create a copy of dataset access property list */
+    if((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0) 
+        FAIL_STACK_ERROR
+
+    boundary[0] = 1;
+    boundary[1] = boundary[2] = 0;
+    if(H5Pset_append_flush(dapl, 3, boundary, append_cb, &count) < 0)
+        FAIL_STACK_ERROR
+
+    /* Should succeed to create the dataset: append flush property has no effect */
+    if((did2 = H5Dcreate2(fid, "dataset2", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, dapl)) < 0)
+        TEST_ERROR
+
+    /* Get the dataset's access property list */
+    if((ddapl = H5Dget_access_plist(did2)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the append flush property values */
+    if(H5Pget_append_flush(ddapl, 3, ret_boundary, &ret_cb, (void **)&ret_count) < 0)
+        TEST_ERROR
+
+    /* Verify expected values */
+    if(ret_cb != NULL || ret_count != NULL)
+        TEST_ERROR
+    if(ret_boundary[0] != 0 || ret_boundary[1] != 0 || ret_boundary[2] != 0)
+        TEST_ERROR
+
+    /* Closing */
+    if(H5Pclose(ddapl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did2) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Should succeed in opening the dataset: append flush property has no effect */
+    if((did2 = H5Dopen2(fid, "dataset2", dapl)) < 0)
+        TEST_ERROR
+
+    /* Get the dataset's access property list */
+    if((ddapl = H5Dget_access_plist(did2)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the append flush property values */
+    if(H5Pget_append_flush(ddapl, 3, ret_boundary, &ret_cb, (void **)&ret_count) < 0)
+        TEST_ERROR
+
+    /* Verify expected values */
+    if(ret_cb != NULL || ret_count != NULL)
+        TEST_ERROR
+    if(ret_boundary[0] != 0 || ret_boundary[1] != 0 || ret_boundary[2] != 0)
+        TEST_ERROR
+
+    if(H5Dclose(did2) < 0)
+        FAIL_STACK_ERROR
+    /* 
+     *  Case (3)--
+     *  For a non-chunked dataset's access property list:
+     *  --To verify the append flush property values retrieved from a non-default
+     *    access property list:
+     *      zero boundary, null callback function, null user data
+     */
+     
+    HDmemset(boundary, 0, sizeof(boundary));
+    if(H5Pset_append_flush(dapl, 1, boundary, append_cb, &count) < 0)
+        FAIL_STACK_ERROR
+    if((did2 = H5Dopen2(fid, "dataset2", dapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get the dataset's access property list */
+    if((ddapl = H5Dget_access_plist(did2)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the append flush property values */
+    if(H5Pget_append_flush(ddapl, 1, ret_boundary, &ret_cb, (void **)&ret_count) < 0)
+        TEST_ERROR
+
+    /* Verify expected values */
+    if(ret_cb != NULL || ret_count != NULL)
+        TEST_ERROR
+    if(ret_boundary[0] != 0 || ret_boundary[1] != 0 || ret_boundary[2] != 0)
+        TEST_ERROR
+
+    /* Closing */
+    if(H5Pclose(ddapl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(dapl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did1) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did2) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Sclose(sid) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR;
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(dapl);
+        H5Pclose(ddapl);
+        H5Dclose(did1);
+        H5Dclose(did2);
+        H5Pclose(fapl);
+        H5Sclose(sid);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+
+    return -1;
+} /* test_append_flush_dataset_fixed() */
+
+/*
+ * test_append_flush_multiple()
+ *
+ * Verify H5Pget/set_append_flush() work as specified for multiple opens
+ * of a dataset:
+ *  (1) did1 = H5Dcreate(...dapl1...)
+ *      did2 = H5Dopen2(...dapl2)
+ *      H5Pget_append_flush(did1...)
+ *      H5Pget_append_flush(did2...) 
+ *      -- should return append flush property values set in dapl1
+ *  (2) H5Dcreate(...H5P_DEFAULT...)
+ *      H5Dclose()
+ *      did1 = H5Dopen2(...dapl1)
+ *      did2 = H5Dopen2(..dapl2) 
+ *      H5Pget_append_flush(did1, ...)
+ *      H5Pget_append_flush(did2, ...)
+ *      -- should return append flush property values set in dapl1
+ *  NOTE: 
+ *    FOR NOW: return the append flush property values of the create or the very first open
+ *    LATER ON: should REJECT subsequent dataset open if append flush property values differ
+ */
+static int
+test_append_flush_dataset_multiple(hid_t in_fapl)
+{
+    hid_t fid = -1;         /* file ID */
+    hid_t fapl = -1;            /* A copy of file access property */
+    hid_t did1 = -1, did2 = -1;     /* The datset ID */
+    hid_t sid = -1;         /* The dataspace ID */
+    hid_t dcpl = -1;            /* A copy of dataset creation property */
+    hid_t dapl1 = -1;           /* A copy of dataset access property */
+    hid_t dapl2 = -1;           /* A copy of dataset access property */
+    hid_t ddapl = -1;           /* The dataset access property of the opened dataset */
+
+    hsize_t boundary1[3];       /* Boundary size */
+    hsize_t boundary2[3];       /* Boundary size */
+    unsigned count1 = 0;        /* User data */
+    unsigned count2 = 0;        /* User data */
+
+    hsize_t ret_boundary[3];        /* Boundary size set in the append flush property */
+    H5D_append_cb_t ret_cb;     /* The callback function set in the append flush property */
+    unsigned *ret_count;        /* The user data set in the append flush property */
+
+    char filename[NAME_BUF_SIZE];   /* file name */
+
+    hsize_t dims[2] = {0, 0};                   /* The dataset dimension sizes */
+    hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED};    /* The dataset maximum dimension sizes */
+    hsize_t chunk_dims[2] = {5,2};              /* The chunk dimesion sizes */
+
+    TESTING("H5Fget/set_append_flush() for multiple opens of a chunked dataset");
+
+    /* 
+     *  Case (1) 
+     *  For a chunked dataset's access property list:
+     *      did1 = H5Dcreate(...dapl1...)
+     *          did2 = H5Dopen2(...dapl2)
+     *          H5Pget_append_flush(did1...)
+     *          H5Pget_append_flush(did2...) 
+     *      -- should return append flush property values set in dapl1
+     */
+
+    /* Create a copy of dataset access property list */
+    if((dapl1 = H5Pcreate(H5P_DATASET_ACCESS)) < 0) 
+        FAIL_STACK_ERROR
+    if((dapl2 = H5Pcreate(H5P_DATASET_ACCESS)) < 0) 
+        FAIL_STACK_ERROR
+
+    boundary1[0] = 0;
+    boundary1[1] = 1;
+    count1 = 0;
+    if(H5Pset_append_flush(dapl1, 2, boundary1, append_cb, &count1) < 0)
+        FAIL_STACK_ERROR
+    boundary2[0] = 1;
+    boundary2[1] = 0;
+    count2 = 0;
+    if(H5Pset_append_flush(dapl2, 2, boundary2, append_cb2, &count2) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a copy of the input parameter in_fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0) 
+        FAIL_STACK_ERROR
+
+    /* Set to use the latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
+
+    /* Create the test file to work on */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create a chunked dataset with 2 extendible dimensions */
+    if((sid = H5Screate_simple(2, dims, maxdims)) < 0) 
+        FAIL_STACK_ERROR;
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) 
+        FAIL_STACK_ERROR
+    if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0)
+        FAIL_STACK_ERROR;
+    if((did1 = H5Dcreate2(fid, "dataset1", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, dapl1)) < 0) 
+        FAIL_STACK_ERROR;
+
+    /* Open the dataset */
+    if((did2 = H5Dopen2(fid, "dataset1", dapl2)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Get the dataset's access property list for did1 */
+    if((ddapl = H5Dget_access_plist(did1)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the append flush property values */
+    if(H5Pget_append_flush(ddapl, 3, ret_boundary, &ret_cb, (void **)&ret_count) < 0)
+        TEST_ERROR
+    
+    /* Verify expected values: should be the setting in dapl1 */
+    if(ret_boundary[0] != 0 || ret_boundary[1] != 1 || ret_boundary[2] != 0)
+        TEST_ERROR;
+    if(ret_cb != append_cb || ret_count != &count1) 
+        TEST_ERROR
+
+    /* Close the dataset's access property list */
+    if(H5Pclose(ddapl) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Get the dataset's access property list for did2 */
+    if((ddapl = H5Dget_access_plist(did2)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the append flush property values */
+    if(H5Pget_append_flush(ddapl, 3, ret_boundary, &ret_cb, (void **)&ret_count) < 0)
+        TEST_ERROR
+    
+    /* Verify expected values: should be the setting in dapl1 */
+    if(ret_boundary[0] != 0 || ret_boundary[1] != 1 || ret_boundary[2] != 0)
+        TEST_ERROR;
+    if(ret_cb != append_cb || ret_count != &count1) 
+        TEST_ERROR
+
+    /* Close the dataset's access property list */
+    if(H5Pclose(ddapl) < 0)
+        FAIL_STACK_ERROR;
+    H5Dclose(did1);
+    H5Dclose(did2);
+
+    /* 
+     * Case (2) 
+     *  For a chunked dataset's access property list:
+     *      H5Dcreate(...H5P_DEFAULT...)
+     *          H5Dclose()
+     *          did1 = H5Dopen2(...dapl1)
+     *          did2 = H5Dopen2(..dapl2) 
+     *          H5Pget_append_flush(did1, ...)
+     *          H5Pget_append_flush(did2, ...)
+     *      -- should return append flush property values set in dapl1
+     */
+    if((did1 = H5Dcreate2(fid, "dataset2", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0) 
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did1) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Open the dataset with append flush setting in dapl2 */
+    if((did1 = H5Dopen2(fid, "dataset2", dapl2)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Open the dataset with append flush setting in dapl1 */
+    if((did2 = H5Dopen2(fid, "dataset2", dapl1)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Get the dataset's access property list for did1 */
+    if((ddapl = H5Dget_access_plist(did1)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the append flush property values */
+    if(H5Pget_append_flush(ddapl, 3, ret_boundary, &ret_cb, (void **)&ret_count) < 0)
+        TEST_ERROR
+    
+    /* Verify expected values: should be the setting in dapl2 */
+    if(ret_boundary[0] != 1 || ret_boundary[1] != 0 || ret_boundary[2] != 0)
+        TEST_ERROR;
+    if(ret_cb != append_cb2 || ret_count != &count2) 
+        TEST_ERROR
+
+    /* Close the access property list */
+    if(H5Pclose(ddapl) < 0)
+        FAIL_STACK_ERROR;
+
+
+    /* Get the dataset's access property list for did2 */
+    if((ddapl = H5Dget_access_plist(did2)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Retrieve the append flush property values */
+    if(H5Pget_append_flush(ddapl, 3, ret_boundary, &ret_cb, (void **)&ret_count) < 0)
+        TEST_ERROR
+    
+    /* Verify expected values: should be the setting in dapl2 */
+    if(ret_boundary[0] != 1 || ret_boundary[1] != 0 || ret_boundary[2] != 0)
+        TEST_ERROR;
+    if(ret_cb != append_cb2 || ret_count != &count2) 
+        TEST_ERROR
+
+    /* Closing */
+    if(H5Pclose(ddapl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(dapl2) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(dapl1) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(dcpl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did1) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did2) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Sclose(sid) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR;
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Pclose(dapl1);
+        H5Pclose(dapl2);
+        H5Pclose(ddapl);
+        H5Dclose(did1);
+        H5Dclose(did2);
+        H5Pclose(fapl);
+        H5Sclose(sid);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+
+    return -1;
+} /* test_append_flush_dataset_multiple() */
+
+
+
+/****************************************************************
+**
+**  test_file_lock_same():
+**    With the implementation of file locking, this test checks file
+**    open with different combinations of flags.
+**    This is for single process access.
+**
+*****************************************************************/
+static int
+test_file_lock_same(hid_t in_fapl)
+{
+    hid_t fid = -1, fid2 = -1;          /* File IDs */
+    hid_t fapl = -1;                /* File access property list */
+    unsigned intent;            /* File access flags */
+    char filename[NAME_BUF_SIZE];       /* file name */
+
+    /* Output message about test being performed */
+    TESTING("File open with different combinations of flags--single process access");
+
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[1], fapl, filename, sizeof(filename));
+
+    /* 
+     * Case 1: 1) RDWR 2) RDWR : should succeed 
+     */
+    /* Create file */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+    FAIL_STACK_ERROR
+
+    /* Get and check file intent */
+    if(H5Fget_intent(fid, &intent) < 0)
+    FAIL_STACK_ERROR
+
+    if(intent != H5F_ACC_RDWR)
+    TEST_ERROR
+
+    /* Open the same file with RDWR */
+    if((fid2 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+    FAIL_STACK_ERROR
+
+    /* Get and check the intent */
+    if(H5Fget_intent(fid2, &intent) < 0)
+    FAIL_STACK_ERROR
+    if(intent != H5F_ACC_RDWR) 
+    TEST_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid) < 0)
+    FAIL_STACK_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid2) < 0)
+    FAIL_STACK_ERROR
+
+    /* 
+     * Case 2: 1) RDWR 2) RDONLY : should succeed 
+     */
+    /* Open file with RDWR */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+    FAIL_STACK_ERROR
+
+    /* Get and check the intent */
+    if(H5Fget_intent(fid, &intent) < 0)
+    FAIL_STACK_ERROR
+    if(intent != H5F_ACC_RDWR)
+    TEST_ERROR
+
+    /* Open file with RDONLY */
+    if((fid2 = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+    FAIL_STACK_ERROR
+
+    /* Get and check the intent: should get intent from 1st open */
+    if(H5Fget_intent(fid2, &intent) < 0)
+    FAIL_STACK_ERROR
+    if(intent != H5F_ACC_RDWR)
+    TEST_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid) < 0)
+    FAIL_STACK_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid2) < 0)
+    FAIL_STACK_ERROR
+
+    /* 
+     * Case 3: 1) RDONLY 2) RDWR : should fail 
+     */
+    /* Open file with RDONLY */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+    FAIL_STACK_ERROR
+
+    /* Get and check the intent */
+    if(H5Fget_intent(fid, &intent) < 0)
+    FAIL_STACK_ERROR
+    if(intent != H5F_ACC_RDONLY)
+    TEST_ERROR
+
+    /* Open file with RDWR should fail */
+    H5E_BEGIN_TRY {
+        fid2 = H5Fopen(filename, H5F_ACC_RDWR, fapl);
+    } H5E_END_TRY;
+    if(fid2 >= 0)
+    TEST_ERROR
+
+    /* Close first file */
+    if(H5Fclose(fid) < 0)
+    FAIL_STACK_ERROR
+
+    /* 
+     * Case 4: 1) RDONLY 2) RDONLY : should succeed 
+     */
+    /* Open file with RDONLY */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+    FAIL_STACK_ERROR
+
+    /* Get and check the intent */
+    if(H5Fget_intent(fid, &intent) < 0)
+    FAIL_STACK_ERROR
+    if(intent != H5F_ACC_RDONLY) 
+    TEST_ERROR
+
+    /* Open file with RDONLY */
+    if((fid2 = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+    FAIL_STACK_ERROR
+
+    /* Get and check the intent */
+    if(H5Fget_intent(fid2, &intent) < 0)
+    FAIL_STACK_ERROR
+    if(intent != H5F_ACC_RDONLY)
+    TEST_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid) < 0)
+    FAIL_STACK_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid2) < 0)
+    FAIL_STACK_ERROR
+
+    /* Close the property list */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+    H5Pclose(fapl);
+    H5Fclose(fid);
+    H5Fclose(fid2);
+    } H5E_END_TRY;
+
+    return -1;
+} /* end test_file_lock_same() */
+
+/****************************************************************
+**
+**  test_file_lock_swmr_same():
+**    With the implementation of file locking, this test checks file
+**    open with different combinations of flags + SWMR flags.
+**    This is for single process access.
+**
+*****************************************************************/
+static int
+test_file_lock_swmr_same(hid_t in_fapl)
+{
+    hid_t fid, fid2;    /* File IDs */
+    hid_t fapl;     /* File access property list */
+    char filename[NAME_BUF_SIZE];       /* file name */
+
+    /* Output message about test being performed */
+    TESTING("File open with different combinations of flags + SWMR flags--single process access");
+
+    /* Get a copy of the parameter in_fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[1], fapl, filename, sizeof(filename));
+
+    /* Set to use latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create a file */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+    
+    /* Close file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Cases a, b, c, d: H5Fopen failure cases 
+     */
+
+    /* 
+     * Case a: RDWR|SWRM_READ : should fail  
+     */
+    H5E_BEGIN_TRY {
+    fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_READ, fapl);
+    } H5E_END_TRY;
+    if(fid >= 0)
+    TEST_ERROR
+
+    /* 
+     * Case b: RDWR|SWMM_WRTE|SWMR_READ : should fail 
+     */
+    H5E_BEGIN_TRY {
+    fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE|H5F_ACC_SWMR_READ, fapl);
+    } H5E_END_TRY;
+    if(fid >= 0)
+    TEST_ERROR
+
+    /* 
+     * Case c: RDONLY|SWMM_WRITE : should fail 
+     */
+    H5E_BEGIN_TRY {
+    fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_WRITE, fapl);
+    } H5E_END_TRY;
+    if(fid >= 0)
+    TEST_ERROR
+
+    /* 
+     * Case d: RDONLY|SWMM_WRITE|SWMR_READ : should fail 
+     */
+    H5E_BEGIN_TRY {
+    fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_WRITE|H5F_ACC_SWMR_READ, fapl);
+    } H5E_END_TRY;
+    if(fid >= 0)
+    TEST_ERROR
+
+    /* 
+     * Cases 1 - 12: combinations of different flags for 1st and 2nd opens 
+     */
+
+    /* 
+     * Case 1: 1) RDWR 2) RDWR|SWMR_WRITE : should fail 
+     */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    H5E_BEGIN_TRY {
+    fid2 = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl);
+    } H5E_END_TRY;
+    if(fid2 >= 0)
+    TEST_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 2: 1) RDWR 2) RDONLY|SWMR_READ : should succeed 
+     */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
+    TEST_ERROR
+    if((fid2 = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl)) < 0)
+    TEST_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid2) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 3: 1) RDWR|SWMR_WRITE 2)RDWR : should succeed 
+     */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl)) < 0)
+        FAIL_STACK_ERROR
+    if((fid2 = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid2) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 4: 1) RDWR|SWMR_WRITE 2) RDWR|SWMR_WRITE : should succeed 
+     */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl)) < 0)
+        FAIL_STACK_ERROR
+    if((fid2 = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid2) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 5: 1) RDWR|SWMR_WRITE 2) RDONLY|SWMR_READ : should succeed 
+     */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl)) < 0)
+        FAIL_STACK_ERROR
+    if((fid2 = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid2) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 6: 1) RDWR|SWMR_WRITE 2) RDONLY : should succeed 
+     */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl)) < 0)
+        FAIL_STACK_ERROR
+    if((fid2 = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid2) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 7: 1) RDONLY|SWMR_READ 2)RDWR : should fail 
+     */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    H5E_BEGIN_TRY {
+    fid2 = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT);
+    } H5E_END_TRY;
+    if(fid2 >= 0)
+    TEST_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 8: 1) RDONLY|SWMR_READ 2) RDWR|SWMR_WRITE : should fail 
+     */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    H5E_BEGIN_TRY {
+    fid2 = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl);
+    } H5E_END_TRY;
+    if(fid2 >= 0)
+    TEST_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 9: 1) RDONLY|SWMR_READ 2) RDONLY|SWMR_READ : should succeed 
+     */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl)) < 0)
+        FAIL_STACK_ERROR
+    if((fid2 = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid2) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 10: 1) RDONLY|SWMR_READ 2) RDONLY : should succeed 
+     */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl)) < 0)
+        TEST_ERROR
+    if((fid2 = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid2) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 11: 1) RDONLY 2) RDWR|SWMR_WRITE: should fail 
+     */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    H5E_BEGIN_TRY {
+    fid2 = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl);
+    } H5E_END_TRY;
+    if(fid2 >= 0)
+    TEST_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 12: 1) RDONLY 2) RDONLY|SWMR_READ : should fail 
+     */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    H5E_BEGIN_TRY {
+    fid2 = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl);
+    } H5E_END_TRY;
+    if(fid2 >=0 )
+    TEST_ERROR
+
+    /* Close file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the property list */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+    H5Pclose(fapl);
+    H5Fclose(fid);
+    H5Fclose(fid2);
+    } H5E_END_TRY;
+
+    return -1;
+} /* end test_file_lock_swmr_same() */
+
+
+/****************************************************************
+**
+**  test_file_lock_concur():
+**    With the implementation of file locking, this test checks file
+**    open with different combinations of flags.
+**    This is for concurrent access.
+**
+*****************************************************************/
+#if !(defined(H5_HAVE_FORK) && defined(H5_HAVE_WAITPID) && defined(H5_HAVE_FLOCK))
+
+static int
+test_file_lock_concur(hid_t H5_ATTR_UNUSED in_fapl)
+{
+    /* Output message about test being performed */
+    TESTING("File open with different combinations of flags--concurrent access");
+	SKIPPED();
+    HDputs("    Test skipped due to fork, waitpid, or flock not defined.");
+    return 0;
+
+} /* end test_file_lock_concur() */
+
+#else
+    
+static int
+test_file_lock_concur(hid_t in_fapl)
+{
+    hid_t fid = -1;             /* File ID */
+    hid_t fapl = -1;                    /* File access property list */
+    char filename[NAME_BUF_SIZE];       /* file name */
+    pid_t childpid=0;           /* Child process ID */
+    int child_status;           /* Status passed to waitpid */
+    int child_wait_option=0;        /* Options passed to waitpid */
+    int out_pdf[2];
+    int notify = 0;
+
+    /* Output message about test being performed */
+    TESTING("File open with different combinations of flags--concurrent access");
+
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[1], fapl, filename, sizeof(filename));
+  
+    /* Create the test file */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 1: 1) RDWR 2) RDWR : should fail
+     */
+
+    /* Create 1 pipe */
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+        hid_t child_fid;    /* File ID */
+	int child_notify = 0;
+
+        /* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Open the test file */
+        H5E_BEGIN_TRY {
+            child_fid = H5Fopen(filename, H5F_ACC_RDWR, fapl);
+        } H5E_END_TRY;
+
+        /* Should fail */
+        if(child_fid == FAIL) 
+            HDexit(EXIT_SUCCESS);
+
+	/* Close the pipe */
+        if(HDclose(out_pdf[0]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_FAILURE);
+    }
+
+    /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if(HDwaitpid(childpid, &child_status, child_wait_option) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check if child terminated normally */
+    if(WIFEXITED(child_status)) {
+	/* Check exit status of the child */
+	if(WEXITSTATUS(child_status) != 0)
+	    TEST_ERROR
+    } else
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 2: 1) RDWR 2) RDONLY : should fail
+     */
+    /* Create 1 pipe */
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+        hid_t child_fid;    /* File ID */
+	int child_notify = 0;
+
+        /* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Opens the test file */
+        H5E_BEGIN_TRY {
+            child_fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl);
+        } H5E_END_TRY;
+
+        /* Should fail */
+        if(child_fid == FAIL) 
+            HDexit(EXIT_SUCCESS);
+
+	/* Close the pipe */
+        if(HDclose(out_pdf[0]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_FAILURE);
+    }
+
+    /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Opens the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if(HDwaitpid(childpid, &child_status, child_wait_option) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check if child terminated normally */
+    if(WIFEXITED(child_status)) {
+        /* Check exit status of the child */
+        if(WEXITSTATUS(child_status) != 0)
+            TEST_ERROR
+    } else
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 3: 1) RDONLY 2) RDWR : should fail
+     */
+
+    /* Create 1 pipe */
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+        hid_t child_fid;    /* File ID */
+	int child_notify = 0;
+
+        /* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Opens the test file */
+        H5E_BEGIN_TRY {
+            child_fid = H5Fopen(filename, H5F_ACC_RDWR, fapl);
+        } H5E_END_TRY;
+
+        /* Should fail */
+        if(child_fid == FAIL)
+            HDexit(EXIT_SUCCESS);
+
+	/* Close the pipe */
+        if(HDclose(out_pdf[0]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_FAILURE);
+    } /* end if */
+
+       /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Opens the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+        FAIL_STACK_ERROR
+    
+    /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if(HDwaitpid(childpid, &child_status, child_wait_option) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check if child terminated normally */
+    if(WIFEXITED(child_status)) {
+        /* Check exit status of the child */
+        if(WEXITSTATUS(child_status) != 0)
+            TEST_ERROR
+    } else
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 4: 1) RDONLY 2) RDONLY : should succeed
+     */
+
+    /* Create 1 pipe */
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+        hid_t child_fid;    /* File ID */
+	int child_notify = 0;
+
+        /* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Opens the test file */
+        H5E_BEGIN_TRY {
+            child_fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl);
+        } H5E_END_TRY;
+
+        /* Should succeed */
+        if(child_fid >= 0) {
+            /* Close the file */
+            if(H5Fclose(child_fid) < 0)
+		HDexit(EXIT_FAILURE);
+
+	    /* Close the pipe */
+	    if(HDclose(out_pdf[0]) < 0)
+		HDexit(EXIT_FAILURE);
+
+            HDexit(EXIT_SUCCESS);
+        } /* end if */
+        
+        HDexit(EXIT_FAILURE);
+    } /* end if */
+
+    /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if(HDwaitpid(childpid, &child_status, child_wait_option) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check if child terminated normally */
+    if(WIFEXITED(child_status)) {
+        /* Check exit status of the child */
+        if(WEXITSTATUS(child_status) != 0)
+            TEST_ERROR
+    } else
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the property list */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+
+    return -1;
+
+} /* end test_file_lock_concur() */
+
+#endif /* !(defined(H5_HAVE_FORK) && defined(H5_HAVE_WAITPID) && defined(H5_HAVE_FLOCK)) */
+
+/****************************************************************
+**
+**  test_file_lock_swmr_concur(): low-level file test routine.
+**    With the implementation of file locking, this test checks file
+**    open with different combinations of flags + SWMR flags.
+**    This is for concurrent access.
+**
+*****************************************************************/
+#if !(defined(H5_HAVE_FORK) && defined(H5_HAVE_WAITPID))
+
+static int
+test_file_lock_swmr_concur(hid_t H5_ATTR_UNUSED in_fapl)
+{
+    /* Output message about test being performed */
+    TESTING("File open with different combintations of flags + SWMR flags--concurrent access");
+    SKIPPED();
+    HDputs("    Test skipped due to fork or waitpid not defined.");
+    return 0;
+
+} /* end test_file_lock_swmr_concur() */
+
+#else
+
+static int
+test_file_lock_swmr_concur(hid_t in_fapl)
+{
+    hid_t fid;              /* File ID */
+    hid_t fapl;             /* File access property list */
+    char filename[NAME_BUF_SIZE];       /* file name */
+    pid_t childpid=0;           /* Child process ID */
+    int child_status;           /* Status passed to waitpid */
+    int child_wait_option=0;        /* Options passed to waitpid */
+    int out_pdf[2];
+    int notify = 0;
+
+    /* Output message about test being performed */
+    TESTING("File open with different combintations of flags + SWMR flags--concurrent access");
+
+    if((fapl = H5Pcopy(in_fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[1], fapl, filename, sizeof(filename));
+
+    /* Set to use latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create the test file */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 1: 1) RDWR 2) RDWR|SWMR_WRITE : should fail
+     */
+
+    /* Create 1 pipe */
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+        hid_t child_fid;    /* File ID */
+	int child_notify = 0;
+
+        /* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Open the test file */
+        H5E_BEGIN_TRY {
+            child_fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl);
+        } H5E_END_TRY;
+
+        /* Should fail */
+        if(child_fid == FAIL) 
+            HDexit(EXIT_SUCCESS);
+
+	/* Close the pipe */
+        if(HDclose(out_pdf[0]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_FAILURE);
+    }
+
+    /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if(HDwaitpid(childpid, &child_status, child_wait_option) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check if child terminated normally */
+    if(WIFEXITED(child_status)) {
+        /* Check exit status of the child */
+        if(WEXITSTATUS(child_status) != 0)
+            TEST_ERROR
+    } else
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 2: 1) RDWR 2) RDONLY|SWMR_READ: should fail
+     */
+
+    /* Create 1 pipe */
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+	FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+        hid_t child_fid;    /* File ID */
+	int child_notify = 0;
+
+	 /* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Open the test file */
+        H5E_BEGIN_TRY {
+            child_fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl);
+        } H5E_END_TRY;
+
+        /* Should fail */
+        if(child_fid == FAIL) 
+            HDexit(EXIT_SUCCESS);
+
+	/* Close the pipe */
+        if(HDclose(out_pdf[0]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_FAILURE);
+    }
+
+    /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
+    FAIL_STACK_ERROR
+
+    /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if(HDwaitpid(childpid, &child_status, child_wait_option) < 0)
+	FAIL_STACK_ERROR
+
+    /* Check if child terminated normally */
+    if(WIFEXITED(child_status)) {
+        /* Check exit status of the child */
+        if(WEXITSTATUS(child_status) != 0)
+            TEST_ERROR
+    } else
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 3: 1) RDWR|SWMR_WRITE 2) RDWR : should fail
+     */
+
+    /* Create 1 pipe */
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+        hid_t child_fid;    /* File ID */
+	int child_notify = 0;
+
+        /* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Open the test file */
+        H5E_BEGIN_TRY {
+            child_fid = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT);
+        } H5E_END_TRY;
+
+        /* Should fail */
+        if(child_fid == FAIL) 
+            HDexit(EXIT_SUCCESS);
+    
+	/* Close the pipe */
+        if(HDclose(out_pdf[0]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_FAILURE);
+    }
+
+    /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+     /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if(HDwaitpid(childpid, &child_status, child_wait_option) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check if child terminated normally */
+    if(WIFEXITED(child_status)) {
+        /* Check exit status of the child */
+        if(WEXITSTATUS(child_status) != 0)
+            TEST_ERROR
+    } else
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 4: 1) RDWR|SWMR_WRITE 2) RDWR|SWMR_WRITE : should fail
+     */
+
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+    FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+        hid_t child_fid;    /* File ID */
+	int child_notify = 0;
+
+        /* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Open the test file */
+        H5E_BEGIN_TRY {
+            child_fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl);
+        } H5E_END_TRY;
+
+        /* Should fail */
+        if(child_fid == FAIL) 
+            HDexit(EXIT_SUCCESS);
+
+	/* Close the pipe */
+        if(HDclose(out_pdf[0]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_FAILURE);
+    }
+
+    /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if(HDwaitpid(childpid, &child_status, child_wait_option) < 0)
+    FAIL_STACK_ERROR
+
+    /* Check if child terminated normally */
+    if(WIFEXITED(child_status)) {
+        /* Check exit status of the child */
+        if(WEXITSTATUS(child_status) != 0)
+            TEST_ERROR
+    } else
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 5: 1) RDWR|SWMR_WRITE 2) RDONLY|SWMR_READ : should succeed
+     */
+
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+	FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+        hid_t child_fid;    /* File ID */
+	int child_notify = 0;
+
+        /* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Open the test file */
+        H5E_BEGIN_TRY {
+            child_fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl);
+        } H5E_END_TRY;
+
+        /* Should succeed */
+        if(child_fid >= 0) {
+            if(H5Fclose(child_fid) < 0)
+                FAIL_STACK_ERROR
+            HDexit(EXIT_SUCCESS);
+        }
+
+	/* Close the pipe */
+        if(HDclose(out_pdf[0]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_FAILURE);
+    }
+
+    /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl)) < 0)
+	FAIL_STACK_ERROR
+
+    /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if(HDwaitpid(childpid, &child_status, child_wait_option) < 0)
+    FAIL_STACK_ERROR
+
+    /* Check if child terminated normally */
+    if(WIFEXITED(child_status)) {
+        /* Check exit status of the child */
+        if(WEXITSTATUS(child_status) != 0)
+            TEST_ERROR
+    } else
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 6: 1) RDWR|SWMR_WRITE 2) RDONLY : should fail
+     */
+
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+        hid_t child_fid;    /* File ID */
+	int child_notify = 0;
+
+        /* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Open the test file */
+        H5E_BEGIN_TRY {
+            child_fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT);
+        } H5E_END_TRY;
+
+        /* Should fail */
+        if(child_fid == FAIL) 
+            HDexit(EXIT_SUCCESS);
+
+	/* Close the pipe */
+        if(HDclose(out_pdf[0]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_FAILURE);
+    }
+
+    /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+     /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if(HDwaitpid(childpid, &child_status, child_wait_option) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check if child terminated normally */
+    if(WIFEXITED(child_status)) {
+        /* Check exit status of the child */
+        if(WEXITSTATUS(child_status) != 0)
+            TEST_ERROR
+    } else
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 7: 1) RDONLY|SWMR_READ 2) RDWR : should fail
+     */
+
+    /* Create 1 pipe */
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+        hid_t child_fid;    /* File ID */
+	int child_notify = 0;
+
+        /* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Open the test file */
+        H5E_BEGIN_TRY {
+            child_fid = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT);
+        } H5E_END_TRY;
+
+        /* Should fail */
+        if(child_fid == FAIL) 
+            HDexit(EXIT_SUCCESS);
+
+	 /* Close the pipe */
+        if(HDclose(out_pdf[0]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_FAILURE);
+    }
+
+    /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+     /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if(HDwaitpid(childpid, &child_status, child_wait_option) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check if child terminated normally */
+    if(WIFEXITED(child_status)) {
+        /* Check exit status of the child */
+        if(WEXITSTATUS(child_status) != 0)
+            TEST_ERROR
+    } else
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 8: 1) RDONLY|SWMR_READ 2) RDWR|SWMR_WRITE : should fail
+     */
+
+    /* Create 1 pipe */
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+        hid_t child_fid;    /* File ID */
+	int child_notify = 0;
+
+        /* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Open the test file */
+        H5E_BEGIN_TRY {
+            child_fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl);
+        } H5E_END_TRY;
+
+        /* Should fail */
+        if(child_fid == FAIL) 
+            HDexit(EXIT_SUCCESS);
+	
+        /* Close the pipe */
+        if(HDclose(out_pdf[0]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_FAILURE);
+    }
+
+    /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if(HDwaitpid(childpid, &child_status, child_wait_option) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check if child terminated normally */
+    if(WIFEXITED(child_status)) {
+        /* Check exit status of the child */
+        if(WEXITSTATUS(child_status) != 0)
+            TEST_ERROR
+    } else
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 9: 1) RDONLY|SWMR_READ 2) RDONLY|SWMR_READ : should succeed
+     */
+
+    /* Create 1 pipe */
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+        hid_t child_fid;    /* File ID */
+	int child_notify = 0;
+
+        /* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Open the test file */
+        H5E_BEGIN_TRY {
+            child_fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl);
+        } H5E_END_TRY;
+
+        /* Should succeed */
+        if(child_fid >= 0) {
+            if(H5Fclose(child_fid) < 0)
+                FAIL_STACK_ERROR
+            HDexit(EXIT_SUCCESS);
+        }
+
+        /* Close the pipe */
+        if(HDclose(out_pdf[0]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_FAILURE);
+    }
+
+    /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if(HDwaitpid(childpid, &child_status, child_wait_option) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check if child terminated normally */
+    if(WIFEXITED(child_status)) {
+        /* Check exit status of the child */
+        if(WEXITSTATUS(child_status) != 0)
+            TEST_ERROR
+    } else
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 10: 1) RDONLY|SWMR_READ 2) RDONLY : should succeed
+     */
+
+    /* Create 1 pipe */
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+        hid_t child_fid;    /* File ID */
+	int child_notify = 0;
+
+        /* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Open the test file */
+        if((child_fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+            FAIL_STACK_ERROR
+
+        /* Should succeed */
+        if(child_fid >= 0) {
+            if(H5Fclose(child_fid) < 0)
+                FAIL_STACK_ERROR
+            HDexit(EXIT_SUCCESS);
+        }
+
+	/* Close the pipe */
+        if(HDclose(out_pdf[0]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_FAILURE);
+    }
+
+    /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+     /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if(HDwaitpid(childpid, &child_status, child_wait_option) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check if child terminated normally */
+    if(WIFEXITED(child_status)) {
+        /* Check exit status of the child */
+        if(WEXITSTATUS(child_status) != 0)
+            TEST_ERROR
+    } else
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 11: 1) RDONLY 2) RDWR|SWMR_WRITE : should fail
+     */
+
+    /* Create 1 pipe */
+    if(HDpipe(out_pdf) < 0)
+	FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+        hid_t child_fid;    /* File ID */
+	int child_notify = 0;
+
+        /* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Open the test file */
+        H5E_BEGIN_TRY {
+            child_fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl);
+        } H5E_END_TRY;
+
+        /* Should fail */
+        if(child_fid == FAIL) 
+            HDexit(EXIT_SUCCESS);
+
+	/* Close the pipe */
+        if(HDclose(out_pdf[0]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_FAILURE);
+    }
+
+    /* Close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if(HDwaitpid(childpid, &child_status, child_wait_option) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check if child terminated normally */
+    if(WIFEXITED(child_status)) {
+        /* Check exit status of the child */
+        if(WEXITSTATUS(child_status) != 0)
+            TEST_ERROR
+    } else
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* 
+     * Case 12: 1) RDONLY 2) RDONLY|SWMR_READ : should succeed
+     */
+
+    /* Create 1 pipe */
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+        hid_t child_fid;    /* File ID */
+	int child_notify = 0;
+
+        /* Close unused write end for out_pdf */
+        if(HDclose(out_pdf[1]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        /* Wait for notification from parent process */
+        while(child_notify != 1) {
+            if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+                HDexit(EXIT_FAILURE);
+        }
+
+        /* Open the test file */
+        H5E_BEGIN_TRY {
+            child_fid = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl);
+        } H5E_END_TRY;
+
+        /* Should succeed */
+        if(child_fid >= 0) {
+            if(H5Fclose(child_fid) < 0)
+                FAIL_STACK_ERROR
+            HDexit(EXIT_SUCCESS);
+        }
+
+        /* Close the pipe */
+        if(HDclose(out_pdf[0]) < 0)
+            HDexit(EXIT_FAILURE);
+
+        HDexit(EXIT_FAILURE);
+    }
+
+    /* close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+	
+    /* Close the pipe */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if(HDwaitpid(childpid, &child_status, child_wait_option) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check if child terminated normally */
+    if(WIFEXITED(child_status)) {
+        /* Check exit status of the child */
+        if(WEXITSTATUS(child_status) != 0)
+            TEST_ERROR
+    } else
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the property list */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+
+    return -1;
+
+} /* end test_file_lock_swmr_concur() */
+
+#endif /* !(defined(H5_HAVE_FORK && defined(H5_HAVE_WAITPID)) */
+
+static int
+test_swmr_vfd_flag(void)
+{
+    hid_t fid = -1;         /* file ID */
+    hid_t sec2_fapl = -1;   /* fapl ID of a VFD that supports SWMR writes (sec2) */
+    hid_t bad_fapl = -1;    /* fapl ID of a VFD that does not support SWMR writes (stdio) */
+    char filename[NAME_BUF_SIZE];   /* file name */
+    
+    TESTING("SWMR-enabled VFD flag functionality");
+
+    /* Attempt to open a file using a SWMR-compatible VFD. */
+
+    if((sec2_fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pset_fapl_sec2(sec2_fapl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pset_libver_bounds(sec2_fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+    h5_fixname(FILENAME[0], sec2_fapl, filename, sizeof(filename));
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC | H5F_ACC_SWMR_WRITE, H5P_DEFAULT, sec2_fapl)) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Attempt to open a file using a non-SWMR-compatible VFD. */
+
+    if((bad_fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pset_fapl_stdio(bad_fapl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pset_libver_bounds(bad_fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+    fid = -1;
+    h5_fixname(FILENAME[0], bad_fapl, filename, sizeof(filename));
+    H5E_BEGIN_TRY {
+        fid = H5Fcreate(filename, H5F_ACC_TRUNC | H5F_ACC_SWMR_WRITE, H5P_DEFAULT, bad_fapl);
+    } H5E_END_TRY;
+    if(fid >= 0)
+        TEST_ERROR;
+
+    if(H5Pclose(sec2_fapl) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Pclose(bad_fapl) < 0)
+        FAIL_STACK_ERROR;
+
+    PASSED();
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(sec2_fapl);
+        H5Pclose(bad_fapl);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+
+    return -1;
+} /* test_swmr_vfd_flag() */
+
+#ifdef OUT
+/* 
+ * This exposes a bug for H5Orefresh while handling opened objects for H5Fstart_swmr_write().
+ * The boolean to skip file truncation test when reading in superblock will fix the problem.
+ * Will work to move that to test/flushrefresh.c later.
+ */
+static int
+test_bug_refresh(hid_t in_fapl)
+{
+    hid_t fid = -1;         /* File ID */
+    hid_t fapl;
+    H5F_t *f;
+    hid_t gid1, gid2, gid3, gid4, gid5, gid6, gid7, gid8, gid9;
+    char filename[NAME_BUF_SIZE];   /* File name */
+
+    /* Create a copy of the input parameter in_fapl */
+    if((fapl = H5Pcopy(in_fapl)) < 0) 
+        FAIL_STACK_ERROR
+
+    /* Set to use the latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        FAIL_STACK_ERROR
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
+
+    TESTING("H5Orefresh failure conditions");
+
+    /* Create a file with the latest format */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Get a pointer to the internal file object */
+    if(NULL == (f = (H5F_t *)H5I_object(fid)))
+        FAIL_STACK_ERROR
+
+    /* Create groups: compact to dense storage */
+    if((gid1 = H5Gcreate2(fid, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+    if((gid2 = H5Gcreate2(fid, "group2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+    if((gid3 = H5Gcreate2(fid, "group3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+    if((gid4 = H5Gcreate2(fid, "group4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+    if((gid5 = H5Gcreate2(fid, "group5", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+    if((gid6 = H5Gcreate2(fid, "group6", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+    if((gid7 = H5Gcreate2(fid, "group7", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+    if((gid8 = H5Gcreate2(fid, "group8", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+    if((gid9 = H5Gcreate2(fid, "group9", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+
+    if (H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+        TEST_ERROR 
+
+    if(H5Grefresh(gid1) < 0) TEST_ERROR
+    if(H5Grefresh(gid2) < 0) TEST_ERROR
+    if(H5Grefresh(gid3) < 0) TEST_ERROR
+    if(H5Grefresh(gid4) < 0) TEST_ERROR
+    if(H5Grefresh(gid5) < 0) TEST_ERROR
+    if(H5Grefresh(gid6) < 0) TEST_ERROR
+    if(H5Grefresh(gid7) < 0) TEST_ERROR
+    if(H5Grefresh(gid8) < 0) TEST_ERROR
+    if(H5Grefresh(gid9) < 0) TEST_ERROR
+
+    H5Gclose(gid1);
+    H5Gclose(gid2);
+    H5Gclose(gid3);
+    H5Gclose(gid4);
+    H5Gclose(gid5);
+    H5Gclose(gid6);
+    H5Gclose(gid7);
+    H5Gclose(gid8);
+    H5Gclose(gid9);
+    H5Pclose(fapl);
+    H5Fclose(fid);
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Gclose(gid1);
+        H5Gclose(gid2);
+        H5Gclose(gid3);
+        H5Gclose(gid4);
+        H5Gclose(gid5);
+        H5Gclose(gid6);
+        H5Gclose(gid7);
+        H5Gclose(gid8);
+        H5Gclose(gid9);
+        H5Pclose(fapl);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+
+    return -1;
+} /* test_bug_refresh() */
+#endif /* OUT */
+
+/*
+ * test_refresh_concur():
+ *
+ * The "new_format" parameter indicates whether to create the file with latest format or not.
+ *  To have SWMR support, can use either one of the following in creating a file:
+ *  (a) Create the file with write + latest format:
+ *      --result in v3 superblock with latest chunk indexing types
+ *  (b) Create the file with SWMR write + non-latest-format:
+ *      --result in v3 superblock with latest chunk indexing types
+ *
+ * Verify H5Drefresh() works correctly with concurrent access:
+ *      Parent process:
+ *              (1) Open the test file, write to the dataset
+ *              (2) Notify child process #A
+ *              (3) Wait for notification from child process #B
+ *              (4) Extend the dataset, write to the dataset, flush the file
+ *              (5) Notify child process #C
+ *      Child process:
+ *              (1) Wait for notification from parent process #A
+ *              (2) Open the file 2 times
+ *              (3) Open the dataset 2 times with the 2 files
+ *              (4) Verify the dataset's dimension and data read are correct
+ *              (5) Notify parent process #B
+ *              (6) Wait for notification from parent process #C
+ *              (7) Refresh the dataset
+ *              (8) Verify the dataset's dimension and data are correct 
+ */
+#if !(defined(H5_HAVE_FORK) && defined(H5_HAVE_WAITPID))
+
+static int
+test_refresh_concur(hid_t H5_ATTR_UNUSED in_fapl, hbool_t H5_ATTR_UNUSED new_format)
+{
+    SKIPPED();
+    HDputs("    Test skipped due to fork or waitpid not defined.");
+    return 0;
+} /* test_refresh_concur() */
+
+#else /* defined(H5_HAVE_FORK && defined(H5_HAVE_WAITPID) */
+
+static int
+test_refresh_concur(hid_t in_fapl, hbool_t new_format)
+{
+    hid_t fid;              /* File ID */
+    hid_t fapl;             /* File access property list */
+    pid_t childpid=0;           /* Child process ID */
+    pid_t tmppid;           /* Child process ID returned by waitpid */
+    int child_status;           /* Status passed to waitpid */
+    int child_wait_option=0;        /* Options passed to waitpid */
+    int child_exit_val;         /* Exit status of the child */
+    char filename[NAME_BUF_SIZE];   /* File name */
+
+    hid_t did = -1;
+    hid_t sid = -1;
+    hid_t dcpl = -1;
+    hsize_t chunk_dims[1] = {1};
+    hsize_t maxdims[1] = {H5S_UNLIMITED};
+    hsize_t dims[1] = { 1 };
+    hsize_t new_dims[1] = {2};
+
+    int out_pdf[2];
+    int in_pdf[2];
+    int notify = 0;
+    int wbuf[2];
+
+    /* Output message about test being performed */
+    if(new_format) {
+        TESTING("H5Drefresh()--concurrent access for latest format");
+    } else {
+        TESTING("H5Drefresh()--concurrent access for non-latest-format");
+    } /* end if */
+
+
+    if((fapl = H5Pcopy(in_fapl)) < 0) 
+        FAIL_STACK_ERROR
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
+
+    if(new_format) {
+        /* Set to use the latest library format */
+        if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+            FAIL_STACK_ERROR
+
+        /* Create the test file */
+        if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            FAIL_STACK_ERROR
+    } else {
+        /* Create the test file without latest format but with SWMR write */
+        if((fid = H5Fcreate(filename, H5F_ACC_TRUNC|H5F_ACC_SWMR_WRITE, H5P_DEFAULT, fapl)) < 0)
+            FAIL_STACK_ERROR
+    } /* end if */
+
+    /* Create a chunked dataset with 1 extendible dimension */
+    if((sid = H5Screate_simple(1, dims, maxdims)) < 0)
+        FAIL_STACK_ERROR;
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_chunk(dcpl, 1, chunk_dims) < 0)
+        FAIL_STACK_ERROR;
+    if((did = H5Dcreate2(fid, "dataset", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Closing */
+    if(H5Dclose(did) < 0)
+        FAIL_STACK_ERROR
+    if(H5Sclose(sid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pclose(dcpl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Create 2 pipes */
+    if(HDpipe(out_pdf) < 0)
+        FAIL_STACK_ERROR
+    if(HDpipe(in_pdf) < 0)
+        FAIL_STACK_ERROR
+
+    /* Fork child process */
+    if((childpid = HDfork()) < 0)
+        FAIL_STACK_ERROR
+
+    if(childpid == 0) { /* Child process */
+        hid_t child_fid1 = -1;    /* File ID */
+        hid_t child_fid2 = -1;    /* File ID */
+	hid_t child_did1 = -1, child_did2 = -1;
+	hid_t child_sid = -1;
+	hsize_t tdims[1];
+	int rbuf[2] = {0, 0};
+	int child_notify = 0;
+
+	/* Close unused write end for out_pdf */
+	if(HDclose(out_pdf[1]) < 0)
+	    HDexit(EXIT_FAILURE);
+
+	/* close unused read end for in_pdf */
+	if(HDclose(in_pdf[0]) < 0)
+	    HDexit(EXIT_FAILURE);
+
+	/* Wait for notification from parent process */
+	while(child_notify != 1) {
+	    if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+		HDexit(EXIT_FAILURE);
+	}
+	    
+	/* Open the file 2 times */
+	if((child_fid1 = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl)) < 0)
+	    HDexit(EXIT_FAILURE);
+
+	if((child_fid2 = H5Fopen(filename, H5F_ACC_RDONLY|H5F_ACC_SWMR_READ, fapl)) < 0)
+	    HDexit(EXIT_FAILURE);
+
+	/* Open the dataset 2 times */
+	if((child_did1 = H5Dopen2(child_fid1, "dataset", H5P_DEFAULT)) < 0)
+	    HDexit(EXIT_FAILURE);
+	if((child_did2 = H5Dopen2(child_fid2, "dataset", H5P_DEFAULT)) < 0)
+	    HDexit(EXIT_FAILURE);
+
+	/* Get the dataset's dataspace via did1 */
+	if((child_sid = H5Dget_space(child_did1)) < 0)
+	    HDexit(EXIT_FAILURE);
+	if(H5Sget_simple_extent_dims(child_sid, tdims, NULL) < 0)
+	    HDexit(EXIT_FAILURE);
+	if(tdims[0] != 1)
+	    HDexit(EXIT_FAILURE);
+
+	/* Read from the dataset via did2 */
+	if(H5Dread(child_did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+	    HDexit(EXIT_FAILURE);
+
+	/* Verify the data is correct */
+	if(rbuf[0] != 99)
+	    HDexit(EXIT_FAILURE);
+
+	/* Notify parent process */
+	child_notify = 2;
+	if(HDwrite(in_pdf[1], &child_notify, sizeof(int)) < 0)
+	    HDexit(EXIT_FAILURE);
+
+	/* Wait for notification from parent process */
+	while(child_notify != 3) {
+	    if(HDread(out_pdf[0], &child_notify, sizeof(int)) < 0)
+		HDexit(EXIT_FAILURE);
+	}
+
+	/* Refresh dataset via did1 */
+	if(H5Drefresh(child_did1) < 0)
+	    HDexit(EXIT_FAILURE);
+
+	/* Get the dataset's dataspace and verify */
+	if((child_sid = H5Dget_space(child_did1)) < 0)
+	    HDexit(EXIT_FAILURE);
+	if(H5Sget_simple_extent_dims(child_sid, tdims, NULL) < 0)
+	    HDexit(EXIT_FAILURE);
+
+	if(tdims[0] != 2)
+	    HDexit(EXIT_FAILURE);
+
+	/* Read from the dataset */
+	if(H5Dread(child_did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf) < 0)
+	    HDexit(EXIT_FAILURE);
+
+	/* Verify the data is correct */
+	if(rbuf[0] != 100 || rbuf[1] != 100)
+	    HDexit(EXIT_FAILURE);
+
+	/* Close the 2 datasets */
+	if(H5Dclose(child_did1) < 0)
+	    HDexit(EXIT_FAILURE);
+	if(H5Dclose(child_did2) < 0)
+	    HDexit(EXIT_FAILURE);
+
+	/* Close the 2 files */
+	if(H5Fclose(child_fid1) < 0)
+	    HDexit(EXIT_FAILURE);
+	if(H5Fclose(child_fid2) < 0)
+	    HDexit(EXIT_FAILURE);
+	     	    
+	/* Close the pipes */
+	if(HDclose(out_pdf[0]) < 0)
+	    HDexit(EXIT_FAILURE);
+	if(HDclose(in_pdf[1]) < 0)
+	    HDexit(EXIT_FAILURE);
+
+	HDexit(EXIT_SUCCESS);
+    }
+
+    /* Close unused read end for out_pdf */
+    if(HDclose(out_pdf[0]) < 0)
+        FAIL_STACK_ERROR
+    /* Close unused write end for in_pdf */
+    if(HDclose(in_pdf[1]) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the test file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the dataset */
+    if((did = H5Dopen2(fid, "dataset", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Write to the dataset */
+    wbuf[0] = wbuf[1] = 99;
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Flush to disk */
+    if(H5Fflush(fid, H5F_SCOPE_LOCAL) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Notify child process */
+    notify = 1;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+
+    /* Wait for notification from child process */
+    while(notify != 2) {
+	if(HDread(in_pdf[0], &notify, sizeof(int)) < 0)
+	    FAIL_STACK_ERROR;
+    }
+
+    /* Extend the dataset */
+    if(H5Dset_extent(did, new_dims) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Write to the dataset */
+    wbuf[0] = wbuf[1] = 100;
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Flush to disk */
+    if(H5Fflush(fid, H5F_SCOPE_LOCAL) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Notify child process */
+    notify = 3;
+    if(HDwrite(out_pdf[1], &notify, sizeof(int)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close the pipes */
+    if(HDclose(out_pdf[1]) < 0)
+        FAIL_STACK_ERROR;
+    if(HDclose(in_pdf[0]) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Wait for child process to complete */
+    if((tmppid = HDwaitpid(childpid, &child_status, child_wait_option)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Check exit status of child process */
+    if(WIFEXITED(child_status)) {
+        if((child_exit_val = WEXITSTATUS(child_status)) != 0)
+            TEST_ERROR
+    } else  /* Child process terminated abnormally */
+        TEST_ERROR
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the property list */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Dclose(did);
+        H5Sclose(sid);
+        H5Pclose(dcpl);
+        H5Pclose(fapl);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+
+    return -1;
+
+} /* test_refresh_concur() */
+#endif /* !(defined(H5_HAVE_FORK) && defined(H5_HAVE_WAITPID)) */
+
+/*
+ * test_multiple_same():
+ *
+ * The "new_format" parameter indicates whether to create the file with latest format or not.
+ *  To have SWMR support, can use either one of the following in creating a file:
+ *  (a) Create the file with write + latest format:
+ *      --result in v3 superblock with latest chunk indexing types
+ *  (b) Create the file with SWMR write + non-latest-format:
+ *      --result in v3 superblock with latest chunk indexing types
+ *
+ * Verify that H5Drefresh() and H5Fstart_swmr_write() work properly with multiple
+ * opens of files and datasets.
+ */
+static int
+test_multiple_same(hid_t in_fapl, hbool_t new_format)
+{
+    hid_t fid = -1, fid1 = -1, fid2 = -1, fid3 = -1;              /* File IDs */
+    hid_t fapl;             /* File access property list */
+    char filename[NAME_BUF_SIZE];   /* File name */
+    hid_t did = -1, did1 = -1, did2 = -1, did3 = -1;
+    hid_t sid = -1;
+    hid_t dcpl = -1;
+    hsize_t chunk_dims[2] = {1, 2};
+    hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED};
+    hsize_t dims[2] = {1, 1};
+    int rbuf = 0;
+    int wbuf = 0;
+
+    /* Output message about test being performed */
+    if(new_format) {
+        TESTING("multiple--single process access for latest format");
+    } else {
+        TESTING("multiple--single process access for non-latest-format");
+    } /* end if */
+
+
+    if((fapl = H5Pcopy(in_fapl)) < 0) 
+        FAIL_STACK_ERROR
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
+
+    if(new_format) {
+        /* Set to use the latest library format */
+        if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+            FAIL_STACK_ERROR
+
+        /* Create the test file */
+        if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            FAIL_STACK_ERROR
+    } else {
+        /* Create the test file without latest format but with SWMR write */
+        if((fid = H5Fcreate(filename, H5F_ACC_TRUNC|H5F_ACC_SWMR_WRITE, H5P_DEFAULT, fapl)) < 0)
+            FAIL_STACK_ERROR
+    } /* end if */
+
+    /* Create a chunked dataset with 1 extendible dimension */
+    if((sid = H5Screate_simple(2, dims, maxdims)) < 0)
+        FAIL_STACK_ERROR;
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0)
+        FAIL_STACK_ERROR;
+    if((did = H5Dcreate2(fid, "dataset", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Closing */
+    if(H5Dclose(did) < 0)
+        FAIL_STACK_ERROR
+    if(H5Sclose(sid) < 0)
+        FAIL_STACK_ERROR
+    if(H5Pclose(dcpl) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0)
+        FAIL_STACK_ERROR
+
+    /* Case 1 */
+
+    /* Open the file 3 times: SWMR-write, read-write, read-only */
+    if((fid1 = H5Fopen(filename, H5F_ACC_RDWR|H5F_ACC_SWMR_WRITE, fapl)) < 0)
+        FAIL_STACK_ERROR
+    if((fid2 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+    if((fid3 = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the dataset 3 times with fid1, fid2, fid3 */
+    if((did1 = H5Dopen2(fid1, "dataset", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+    if((did2 = H5Dopen2(fid2, "dataset", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+    if((did3 = H5Dopen2(fid3, "dataset", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+
+    /* Write to the dataset via did1 */
+    wbuf = 88;
+    if(H5Dwrite(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &wbuf) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Refresh via did2 */
+    if(H5Drefresh(did2) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Read from the dataset via did2 */
+    rbuf = 0;
+    if(H5Dread(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rbuf) < 0)
+        FAIL_STACK_ERROR;
+    /* Verify the data is correct */
+    if(rbuf != 88)
+        FAIL_STACK_ERROR;
+
+    /* Write to the dataset via did3 */
+    wbuf = 99;
+    if(H5Dwrite(did3, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &wbuf) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Refresh via did1 */
+    if(H5Drefresh(did1) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Read from the dataset via did1 */
+    rbuf = 0;
+    if(H5Dread(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rbuf) < 0)
+        FAIL_STACK_ERROR;
+    /* Verify the data is correct */
+    if(rbuf != 99)
+        FAIL_STACK_ERROR;
+
+    /* Close datasets */
+    if(H5Dclose(did1) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did2) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did3) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close files */
+    if(H5Fclose(fid1) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid2) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid3) < 0)
+        FAIL_STACK_ERROR
+
+    /* Case 2 */
+
+    /* Open the file 3 times: read-write, read-only, read-write */
+    if((fid1 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+    if((fid2 = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+        FAIL_STACK_ERROR
+    if((fid3 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the dataset 3 times with fid1, fid2, fid3 */
+    if((did1 = H5Dopen2(fid1, "dataset", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+    if((did2 = H5Dopen2(fid2, "dataset", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+    if((did3 = H5Dopen2(fid3, "dataset", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Write to the dataset via did1 */
+    wbuf = 88;
+    if(H5Dwrite(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &wbuf) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Refresh via did2 */
+    if(H5Drefresh(did2) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Read from dataset via did2 */
+    rbuf = 0;
+    if(H5Dread(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rbuf) < 0)
+        FAIL_STACK_ERROR;
+    if(rbuf != wbuf)
+        FAIL_STACK_ERROR;
+
+    /* Write to dataset via did3 */
+    wbuf = 99;
+    if(H5Dwrite(did3, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &wbuf) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Enable SWMR write */
+    if(H5Fstart_swmr_write(fid1) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Read from dataset via did1 and verify data is correct */
+    rbuf = 0;
+    if(H5Dread(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rbuf) < 0)
+        FAIL_STACK_ERROR;
+    if(rbuf != wbuf)
+        FAIL_STACK_ERROR;
+
+    /* Write to dataset via did2 */
+    wbuf = 100;
+    if(H5Dwrite(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &wbuf) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Refresh dataset via did3 */
+    if(H5Drefresh(did3) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Read from dataset via did3 and verify data is correct */
+    rbuf = 0;
+    if(H5Dread(did3, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rbuf) < 0)
+        FAIL_STACK_ERROR;
+    if(rbuf != wbuf)
+        FAIL_STACK_ERROR;
+
+    /* Close datasets */
+    if(H5Dclose(did1) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did2) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Dclose(did3) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close files */
+    if(H5Fclose(fid1) < 0)
+        FAIL_STACK_ERROR
+    if(H5Fclose(fid2) < 0)
+        FAIL_STACK_ERROR;
+    if(H5Fclose(fid3) < 0)
+        FAIL_STACK_ERROR
+
+    /* Case 3 */
+
+    /* Open the file 3 times: read-write, read-only, read-only */
+    if((fid1 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        FAIL_STACK_ERROR
+    if((fid2 = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+        FAIL_STACK_ERROR
+    if((fid3 = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Open the dataset 3 times with fid1, fid2, fid3 */
+    if((did1 = H5Dopen2(fid1, "dataset", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+    if((did2 = H5Dopen2(fid2, "dataset", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+    if((did3 = H5Dopen2(fid3, "dataset", H5P_DEFAULT)) < 0)
+        FAIL_STACK_ERROR
+
+    /* Write to the dataset via did1 */
+    wbuf = 88;
+    if(H5Dwrite(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &wbuf) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Refresh dataset via did2 */
+    if(H5Drefresh(did2) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Read from dataset via did2 and verify data is correct */
+    rbuf = 0;
+    if(H5Dread(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rbuf) < 0)
+        FAIL_STACK_ERROR;
+    if(rbuf != wbuf)
+        FAIL_STACK_ERROR;
+
+    /* Close dataset via did2 */
+    if(H5Dclose(did2) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close file via fid2 */
+    if(H5Fclose(fid2) < 0)
+        FAIL_STACK_ERROR
+
+    /* Write to dataset via did3 */
+    wbuf = 99;
+    if(H5Dwrite(did3, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &wbuf) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close dataset via did3 */
+    if(H5Dclose(did3) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close file via fid3 */
+    if(H5Fclose(fid3) < 0)
+        FAIL_STACK_ERROR
+
+    /* Enable SWMR writing */
+    if(H5Fstart_swmr_write(fid1) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Read from dataset via did1 and verify data is correct */
+    rbuf = 0;
+    if(H5Dread(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rbuf) < 0)
+        FAIL_STACK_ERROR;
+    if(rbuf != wbuf)
+        FAIL_STACK_ERROR;
+
+    /* Close dataset via did1 */
+    if(H5Dclose(did1) < 0)
+        FAIL_STACK_ERROR;
+
+    /* Close file via fid1 */
+    if(H5Fclose(fid1) < 0)
+        FAIL_STACK_ERROR
+
+    /* Close the property list */
+    if(H5Pclose(fapl) < 0)
+        FAIL_STACK_ERROR
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Dclose(did);
+        H5Dclose(did1);
+        H5Dclose(did2);
+        H5Dclose(did3);
+        H5Sclose(sid);
+        H5Pclose(dcpl);
+        H5Pclose(fapl);
+        H5Fclose(fid);
+        H5Fclose(fid1);
+        H5Fclose(fid2);
+        H5Fclose(fid3);
+    } H5E_END_TRY;
+
+    return -1;
+
+} /* test_multiple_same() */
+
+/****************************************************************
+**
+**  Tests for new public routines introduced from the SWMR project.
+**
+****************************************************************/
+int
+main(void)
+{
+    int nerrors = 0;    /* The # of errors */
+    hid_t fapl = -1;    /* File access property list ID */
+    char *driver = NULL;    /* VFD string (from env variable) */
+
+    /* Skip this test if SWMR I/O is not supported for the VFD specified
+     * by the environment variable.
+     */
+    driver = HDgetenv("HDF5_DRIVER");
+    if(!H5FD_supports_swmr_test(driver)) {
+        printf("This VFD does not support SWMR I/O\n");
+        return EXIT_SUCCESS;
+    }
+
+    /* Set up */
+    h5_reset();
+
+    /* Get file access property list */
+    fapl = h5_fileaccess();
+
+#ifdef OUT
+    nerrors += test_bug_refresh(fapl);
+#endif
+    nerrors += test_refresh_concur(fapl, TRUE);
+    nerrors += test_refresh_concur(fapl, FALSE);
+    nerrors += test_multiple_same(fapl, TRUE);
+    nerrors += test_multiple_same(fapl, FALSE);
+
+    /* Tests on H5Pget/set_metadata_read_attempts() and H5Fget_metadata_read_retry_info() */
+    nerrors += test_metadata_read_attempts(fapl);
+    nerrors += test_metadata_read_retry_info(fapl);
+
+    /* Tests on H5Fstart_swmr_write() */
+    /* 
+     * Modify the following routines to test for files:
+     *   H5Fcreate(write, latest format) or  H5Fcreate(SWMR write, non-latest-format) 
+     *   --both result in v3 superblock and latest version suppport
+     */
+    nerrors += test_start_swmr_write(fapl, TRUE);
+    nerrors += test_start_swmr_write(fapl, FALSE);
+    nerrors += test_err_start_swmr_write(fapl, TRUE);
+    nerrors += test_err_start_swmr_write(fapl, FALSE);
+    nerrors += test_start_swmr_write_concur(fapl, TRUE);
+    nerrors += test_start_swmr_write_concur(fapl, FALSE);
+
+    /* Tests for H5Pget/set_object_flush_cb() */
+    nerrors += test_object_flush_cb(fapl);
+
+    /* Tests on H5Pget/set_append_flush() */
+    nerrors += test_append_flush_generic();
+    nerrors += test_append_flush_dataset_chunked(fapl);
+    nerrors += test_append_flush_dataset_fixed(fapl);
+    nerrors += test_append_flush_dataset_multiple(fapl);
+
+    /* 
+     * Tests for:
+     *   file open flags--single process access
+     *   file open flags--concurrent access
+     */
+    nerrors += test_file_lock_same(fapl);              
+    nerrors += test_file_lock_concur(fapl);            
+    /* 
+     * Tests for:
+     *   file open flags+SWMR flags--single process access
+     *   file open flags+SWMR flags--concurrent access 
+     *
+     * Modify the following 2 routines to test for files:
+     *   H5Fcreate(write, latest format) or  H5Fcreate(SWMR write, non-latest-format) 
+     *   --both result in v3 superblock and latest version suppport
+     */
+    nerrors += test_file_lock_swmr_same(fapl);         
+    nerrors += test_file_lock_swmr_concur(fapl);       
+
+    /* Tests SWMR VFD compatibility flag.
+     * Only needs to run when the VFD is the default (sec2).
+     */
+    if(NULL == driver || !HDstrcmp(driver, "") || !HDstrcmp(driver, "sec2"))
+        nerrors += test_swmr_vfd_flag();
+    
+    if(nerrors)
+	goto error;
+
+    printf("All tests passed.\n");
+
+    h5_cleanup(FILENAME, fapl);
+
+    return 0;
+
+error:
+    nerrors = MAX(1, nerrors);
+    printf("***** %d SWMR TEST%s FAILED! *****\n",
+        nerrors, 1 == nerrors ? "" : "S");
+    return 1;
+
+} /* main() */
+
diff --git a/test/swmr_addrem_writer.c b/test/swmr_addrem_writer.c
new file mode 100644
index 0000000..8ce3f6c
--- /dev/null
+++ b/test/swmr_addrem_writer.c
@@ -0,0 +1,458 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     swmr_addrem_writer.c
+ *
+ * Purpose:     Adds and removes data to a randomly selected subset of the
+ *              datasets in the SWMR test file.
+ *
+ *              This program is intended to run concurrently with the
+ *              swmr_reader program.  It is also run AFTER a sequential
+ *              (not concurrent!) invoking of swmr_writer so the writer
+ *              can dump a bunch of data into the datasets.  Otherwise,
+ *              there wouldn't be much to shrink :)
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/***********/
+/* Headers */
+/***********/
+
+#include <assert.h>
+#include <sys/time.h>
+
+#include "swmr_common.h"
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* The maximum # of records to add/remove from the dataset in one step */
+#define MAX_SIZE_CHANGE     10
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static hid_t open_skeleton(const char *filename, unsigned verbose);
+static int addrem_records(hid_t fid, unsigned verbose, unsigned long nops,
+    unsigned long flush_count);
+static void usage(void);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    open_skeleton
+ *
+ * Purpose:     Opens the SWMR HDF5 file and datasets.
+ *
+ * Parameters:  const char *filename
+ *              The filename of the SWMR HDF5 file to open
+ *
+ *              unsigned verbose
+ *              Whether or not to emit verbose console messages
+ *
+ * Return:      Success:    The file ID of the opened SWMR file
+ *                          The dataset IDs are stored in a global array
+ *
+ *              Failure:    -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static hid_t
+open_skeleton(const char *filename, unsigned verbose)
+{
+    hid_t fid;          /* File ID for new HDF5 file */
+    hid_t fapl;         /* File access property list */
+    hid_t sid;          /* Dataspace ID */
+    hsize_t dim[2];     /* Dataspace dimension */
+    unsigned u, v;      /* Local index variable */
+
+    assert(filename);
+
+    /* Create file access property list */
+    if((fapl = h5_fileaccess()) < 0)
+        return -1;
+
+    /* Set to use the latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        return -1;
+
+#ifdef QAK
+    /* Increase the initial size of the metadata cache */
+    {
+        H5AC_cache_config_t mdc_config;
+
+        mdc_config.version = H5AC__CURR_CACHE_CONFIG_VERSION;
+        H5Pget_mdc_config(fapl, &mdc_config);
+        fprintf(stderr, "mdc_config.initial_size = %lu\n", (unsigned long)mdc_config.initial_size);
+        fprintf(stderr, "mdc_config.epoch_length = %lu\n", (unsigned long)mdc_config.epoch_length);
+        mdc_config.set_initial_size = 1;
+        mdc_config.initial_size = 16 * 1024 * 1024;
+        /* mdc_config.epoch_length = 5000; */
+        H5Pset_mdc_config(fapl, &mdc_config);
+    }
+#endif /* QAK */
+
+#ifdef QAK
+    H5Pset_fapl_log(fapl, "append.log", H5FD_LOG_ALL, (size_t)(512 * 1024 * 1024));
+#endif /* QAK */
+
+    /* Open the file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR | H5F_ACC_SWMR_WRITE, fapl)) < 0)
+        return -1;
+
+    /* Close file access property list */
+    if(H5Pclose(fapl) < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Opening datasets\n");
+
+    /* Open the datasets */
+    for(u = 0; u < NLEVELS; u++)
+        for(v = 0; v < symbol_count[u]; v++) {
+            if((symbol_info[u][v].dsid = H5Dopen2(fid, symbol_info[u][v].name, H5P_DEFAULT)) < 0)
+                return -1;
+            if((sid = H5Dget_space(symbol_info[u][v].dsid)) < 0)
+                return -1;
+            if(2 != H5Sget_simple_extent_ndims(sid))
+                return -1;
+            if(H5Sget_simple_extent_dims(sid, dim, NULL) < 0)
+                return -1;
+            symbol_info[u][v].nrecords = dim[1];
+        } /* end for */
+
+    return fid;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    addrem_records
+ *
+ * Purpose:     Adds/removes a specified number of records to random datasets
+ *              to the SWMR test file.
+ *
+ * Parameters:  hid_t fid
+ *              The file ID of the SWMR HDF5 file
+ *
+ *              unsigned verbose
+ *              Whether or not to emit verbose console messages
+ *
+ *              unsigned long nops
+ *              # of records to read/write in the datasets
+ *
+ *              unsigned long flush_count
+ *              # of records to write before flushing the file to disk
+ *
+ * Return:      Success:    0
+ *              Failure:    -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+addrem_records(hid_t fid, unsigned verbose, unsigned long nops, unsigned long flush_count)
+{
+    hid_t tid;                          /* Datatype ID for records */
+    hid_t mem_sid;                      /* Memory dataspace ID */
+    hsize_t start[2] = {0, 0}, count[2] = {1, 1}; /* Hyperslab selection values */
+    hsize_t dim[2] = {1, 0};            /* Dataspace dimensions */
+    symbol_t buf[MAX_SIZE_CHANGE];      /* Write buffer */
+    H5AC_cache_config_t mdc_config_orig; /* Original metadata cache configuration */
+    H5AC_cache_config_t mdc_config_cork; /* Corked metadata cache configuration */
+    unsigned long op_to_flush;          /* # of operations before flush */
+    unsigned long u, v;                 /* Local index variables */
+
+    assert(fid > 0);
+
+    /* Reset the buffer */
+    memset(&buf, 0, sizeof(buf));
+
+    /* Create a dataspace for the record to add */
+    if((mem_sid = H5Screate_simple(2, count, NULL)) < 0)
+        return -1;
+
+    /* Create datatype for appending records */
+    if((tid = create_symbol_datatype()) < 0)
+        return -1;
+
+    /* Get the current metadata cache configuration, and set up the corked
+     * configuration */
+    mdc_config_orig.version = H5AC__CURR_CACHE_CONFIG_VERSION;
+    if(H5Fget_mdc_config(fid, &mdc_config_orig) < 0)
+        return -1;
+    memcpy(&mdc_config_cork, &mdc_config_orig, sizeof(mdc_config_cork));
+    mdc_config_cork.evictions_enabled = FALSE;
+    mdc_config_cork.incr_mode = H5C_incr__off;
+    mdc_config_cork.flash_incr_mode = H5C_flash_incr__off;
+    mdc_config_cork.decr_mode = H5C_decr__off;
+
+    /* Add and remove records to random datasets, according to frequency
+     * distribution */
+    op_to_flush = flush_count;
+    for(u=0; u<nops; u++) {
+        symbol_info_t *symbol;  /* Symbol to write record to */
+        hid_t file_sid;         /* Dataset's space ID */
+
+        /* Get a random dataset, according to the symbol distribution */
+        symbol = choose_dataset();
+
+        /* Decide whether to shrink or expand, and by how much */
+        count[1] = (hsize_t)random() % (MAX_SIZE_CHANGE * 2) + 1;
+
+        if(count[1] > MAX_SIZE_CHANGE) {
+            /* Add records */
+            count[1] -= MAX_SIZE_CHANGE;
+
+            /* Set the buffer's IDs (equal to its position) */
+            for(v=0; v<count[1]; v++)
+                buf[v].rec_id = (uint64_t)symbol->nrecords + (uint64_t)v;
+
+            /* Set the memory space to the correct size */
+            if(H5Sset_extent_simple(mem_sid, 2, count, NULL) < 0)
+                return -1;
+
+            /* Get the coordinates to write */
+            start[1] = symbol->nrecords;
+
+            /* Cork the metadata cache, to prevent the object header from being
+             * flushed before the data has been written */
+            /*if(H5Fset_mdc_config(fid, &mdc_config_cork) < 0)
+                return(-1);*/
+
+             /* Extend the dataset's dataspace to hold the new record */
+            symbol->nrecords+= count[1];
+            dim[1] = symbol->nrecords;
+            if(H5Dset_extent(symbol->dsid, dim) < 0)
+                return -1;
+
+            /* Get the dataset's dataspace */
+            if((file_sid = H5Dget_space(symbol->dsid)) < 0)
+                return -1;
+
+            /* Choose the last record in the dataset */
+            if(H5Sselect_hyperslab(file_sid, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+                return -1;
+
+            /* Write record to the dataset */
+            if(H5Dwrite(symbol->dsid, tid, mem_sid, file_sid, H5P_DEFAULT, &buf) < 0)
+                return -1;
+
+            /* Uncork the metadata cache */
+            /*if(H5Fset_mdc_config(fid, &mdc_config_orig) < 0)
+                return -1;*/
+
+            /* Close the dataset's dataspace */
+            if(H5Sclose(file_sid) < 0)
+                return -1;
+        } /* end if */
+        else {
+            /* Shrink the dataset's dataspace */
+            if(count[1] > symbol->nrecords)
+                symbol->nrecords = 0;
+            else
+                symbol->nrecords -= count[1];
+            dim[1] = symbol->nrecords;
+            if(H5Dset_extent(symbol->dsid, dim) < 0)
+                return -1;
+        } /* end else */
+
+        /* Check for flushing file */
+        if(flush_count > 0) {
+            /* Decrement count of records to write before flushing */
+            op_to_flush--;
+
+            /* Check for counter being reached */
+            if(0 == op_to_flush) {
+                /* Flush contents of file */
+                if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+                    return -1;
+
+                /* Reset flush counter */
+                op_to_flush = flush_count;
+            } /* end if */
+        } /* end if */
+    } /* end for */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Closing datasets\n");
+
+    /* Close the datasets */
+    for(u = 0; u < NLEVELS; u++)
+        for(v = 0; v < symbol_count[u]; v++)
+            if(H5Dclose(symbol_info[u][v].dsid) < 0)
+                return -1;
+
+    return 0;
+}
+
+static void
+usage(void)
+{
+    printf("\n");
+    printf("Usage error!\n");
+    printf("\n");
+    printf("Usage: swmr_addrem_writer [-q] [-f <# of operations between flushing\n");
+    printf("    file contents>] [-r <random seed>] <# of operations>\n");
+    printf("\n");
+    printf("<# of operations between flushing file contents> should be 0 (for\n");
+    printf("no flushing) or between 1 and (<# of operations> - 1).\n");
+    printf("\n");
+    printf("<# of operations> must be specified.\n");
+    printf("\n");
+    printf("Defaults to verbose (no '-q' given), flushing every 1000 operations\n");
+    printf("('-f 1000'), and will generate a random seed (no -r given).\n");
+    printf("\n");
+    exit(1);
+}
+
+int main(int argc, const char *argv[])
+{
+    hid_t fid;                  /* File ID for file opened */
+    long nops = 0;              /* # of times to grow or shrink the dataset */
+    long flush_count = 1000;    /* # of records to write between flushing file */
+    unsigned verbose = 1;       /* Whether to emit some informational messages */
+    unsigned use_seed = 0;      /* Set to 1 if a seed was set on the command line */
+    unsigned random_seed = 0;   /* Random # seed */
+    unsigned u;                 /* Local index variable */
+    int temp;
+
+    /* Parse command line options */
+    if(argc < 2)
+        usage();
+    if(argc > 1) {
+        u = 1;
+        while(u < (unsigned)argc) {
+            if(argv[u][0] == '-') {
+                switch(argv[u][1]) {
+                    /* # of records to write between flushing file */
+                    case 'f':
+                        flush_count = atol(argv[u + 1]);
+                        if(flush_count < 0)
+                            usage();
+                        u += 2;
+                        break;
+
+                    /* Be quiet */
+                    case 'q':
+                        verbose = 0;
+                        u++;
+                        break;
+                    
+                    /* Random # seed */
+                    case 'r':
+                        use_seed = 1;
+                        temp = atoi(argv[u + 1]);
+                        if(temp < 0)
+                            usage();
+                        else
+                            random_seed = (unsigned)temp;
+                        u += 2;
+                        break;
+
+                    default:
+                        usage();
+                        break;
+                } /* end switch */
+            } /* end if */
+            else {
+                /* Get the number of records to append */
+                nops = atol(argv[u]);
+                if(nops <= 0)
+                    usage();
+
+                u++;
+            } /* end else */
+        } /* end while */
+    } /* end if */
+    if(nops <= 0)
+        usage();
+    if(flush_count >= nops)
+        usage();
+
+    /* Emit informational message */
+    if(verbose) {
+        fprintf(stderr, "Parameters:\n");
+        fprintf(stderr, "\t# of operations between flushes = %ld\n", flush_count);
+        fprintf(stderr, "\t# of operations = %ld\n", nops);
+    } /* end if */
+
+    /* Set the random seed */
+    if(0 == use_seed) {
+        struct timeval t;
+        gettimeofday(&t, NULL);
+        random_seed = (unsigned)(t.tv_usec);
+    } /* end if */
+    srandom(random_seed);
+    /* ALWAYS emit the random seed for possible debugging */
+    fprintf(stderr, "Using writer random seed: %u\n", random_seed);
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Generating symbol names\n");
+
+    /* Generate dataset names */
+    if(generate_symbols() < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Opening skeleton file: %s\n", FILENAME);
+
+    /* Open file skeleton */
+    if((fid = open_skeleton(FILENAME, verbose)) < 0) {
+        fprintf(stderr, "Error opening skeleton file!\n");
+        exit(1);
+    } /* end if */
+
+    /* Send a message to indicate "H5Fopen" is complete--releasing the file lock */
+    h5_send_message(WRITER_MESSAGE);
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Adding and removing records\n");
+
+    /* Grow and shrink datasets */
+    if(addrem_records(fid, verbose, (unsigned long)nops, (unsigned long)flush_count) < 0) {
+        fprintf(stderr, "Error adding and removing records from datasets!\n");
+        exit(1);
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Releasing symbols\n");
+
+    /* Clean up the symbols */
+    if(shutdown_symbols() < 0) {
+        fprintf(stderr, "Error releasing symbols!\n");
+        exit(1);
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Closing objects\n");
+
+    /* Close objects opened */
+    if(H5Fclose(fid) < 0) {
+        fprintf(stderr, "Error closing file!\n");
+        exit(1);
+    } /* end if */
+
+    return 0;
+}
diff --git a/test/swmr_check_compat_vfd.c b/test/swmr_check_compat_vfd.c
new file mode 100644
index 0000000..87b87c4
--- /dev/null
+++ b/test/swmr_check_compat_vfd.c
@@ -0,0 +1,59 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Purpose:     This is a small program that checks if the HDF5_DRIVER
+ *              environment variable is set to a value that supports SWMR.
+ *              
+ *              It is intended for use in shell scripts.
+ */
+
+#include <stdlib.h>
+
+#include "H5private.h"
+
+/* This file needs to access the file driver testing code */
+#define H5FD_FRIEND		/*suppress error about including H5FDpkg	  */
+#define H5FD_TESTING
+#include "H5FDpkg.h"	/* File drivers	 			*/
+
+

+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Purpose:     Inspects the HDF5_DRIVER environment variable, which
+ *              determines the VFD that the test harness will use with
+ *              the majority of the tests.
+ *
+ * Return:      VFD supports SWMR:          EXIT_SUCCESS
+ *
+ *              VFD does not support SWMR
+ *              or failure:                 EXIT_FAILURE
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(void)
+{
+    char *driver = NULL;
+
+    driver = HDgetenv("HDF5_DRIVER");
+
+    if(H5FD_supports_swmr_test(driver))
+        return EXIT_SUCCESS;
+    else
+        return EXIT_FAILURE;
+
+} /* end main() */
+
diff --git a/test/swmr_common.c b/test/swmr_common.c
new file mode 100644
index 0000000..30e1b3e
--- /dev/null
+++ b/test/swmr_common.c
@@ -0,0 +1,292 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     swmr_common.c
+ *
+ * Purpose:     Utility functions for the SWMR test code.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/***********/
+/* Headers */
+/***********/
+
+#include <assert.h>
+
+#include "swmr_common.h"
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+/* The SWMR data arrays:
+ *
+ * The code uses a 2-D jagged array of datasets.  The first dimension is called
+ * the 'level' and there are five of them.
+ *
+ * #define NLEVELS         5
+ *
+ * The second dimension is the 'count' and there are quite a few datasets per
+ * 'level'.
+ *
+ * unsigned symbol_count[NLEVELS] = {100, 200, 400, 800, 1600};
+ *
+ * These datasets are created when the skeleton is generated and are initially
+ * empty.  Each dataset has no upper bound on size (H5S_UNLIMITED).  They
+ * are of compound type, with two members: an integer ID and an opaque
+ * 'data part'.  The data part is not used by the SWMR testing.
+ *
+ * The SWMR testing will then randomly add and/or remove entries
+ * from these datasets.  The selection of the level is skewed by a mapping
+ * table which preferentially hammers on the lower levels with their smaller
+ * number of datasets.
+ *
+ * static unsigned symbol_mapping[NMAPPING] = {0, 0, 0, 0, 1, 1, 2, 3, 4};
+ *
+ * The information about each dataset (name, hid_t, etc.) is stored in a
+ * separate array.
+ *
+ * symbol_info_t *symbol_info[NLEVELS];
+ */
+
+/* An array of dataset levels, used to select the level for a SWMR operation
+ * Note that this preferentially selects the lower levels with their smaller
+ * number of datasets.
+ */
+static unsigned symbol_mapping[NMAPPING] = {0, 0, 0, 0, 1, 1, 2, 3, 4};
+
+/* The number of datasets at each level */
+unsigned symbol_count[NLEVELS] = {100, 200, 400, 800, 1600};
+
+/* Array of dataset information entries (1 per dataset) */
+symbol_info_t *symbol_info[NLEVELS];
+
+

+/*-------------------------------------------------------------------------
+ * Function:    choose_dataset
+ *
+ * Purpose:     Selects a random dataset in the SWMR file
+ *
+ * Parameters:  N/A
+ *
+ * Return:      Success:    A pointer to information about a dataset.
+ *              Failure:    Can't fail
+ *
+ *-------------------------------------------------------------------------
+ */
+symbol_info_t *
+choose_dataset(void)
+{
+    unsigned level;             /* The level of the dataset */
+    unsigned offset;            /* The "offset" of the dataset at that level */
+
+    /* Determine level of dataset */
+    level = symbol_mapping[random() % NMAPPING];
+
+    /* Determine the offset of the level */
+    offset = random() % symbol_count[level];
+
+    return &symbol_info[level][offset];
+} /* end choose_dataset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    create_symbol_datatype
+ *
+ * Purpose:     Create's the HDF5 datatype used for elements in the SWMR
+ *              testing datasets.
+ *
+ * Parameters:  N/A
+ *
+ * Return:      Success:    An HDF5 type ID
+ *              Failure:    -1
+ *
+ *-------------------------------------------------------------------------
+ */
+hid_t
+create_symbol_datatype(void)
+{
+    hid_t sym_type_id;          /* Datatype ID for symbol */
+    hid_t opaq_type_id;         /* Datatype ID for opaque part of record */
+
+    /* Create opaque datatype to represent other information for this record */
+    if((opaq_type_id = H5Tcreate(H5T_OPAQUE, (size_t)DTYPE_SIZE)) < 0)
+        return -1;
+
+    /* Create compound datatype for symbol */
+    if((sym_type_id = H5Tcreate(H5T_COMPOUND, sizeof(symbol_t))) < 0)
+        return -1;
+
+    /* Insert fields in symbol datatype */
+    if(H5Tinsert(sym_type_id, "rec_id", HOFFSET(symbol_t, rec_id), H5T_NATIVE_UINT64) < 0)
+        return -1;
+    if(H5Tinsert(sym_type_id, "info", HOFFSET(symbol_t, info), opaq_type_id) < 0)
+        return -1;
+
+    /* Close opaque datatype */
+    if(H5Tclose(opaq_type_id) < 0)
+        return -1;
+
+    return sym_type_id;
+} /* end create_symbol_datatype() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    generate_name
+ *
+ * Purpose:     Generates a SWMR testing dataset name given a level and
+ *              count.
+ *              The name is in the format <name>-<level> (%u-%04u).
+ *
+ * Parameters:  char *name_buf
+ *              Buffer for the created name.  Must be pre-allocated.
+ *              Since the name is formulaic, this isn't considered an issue.
+ *
+ *              unsigned level
+ *              The dataset's level
+ *
+ *              unsigned count
+ *              The dataset's count
+ *
+ * Return:      Success:    0
+ *                          
+ *              Failure:    Can't fail
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+generate_name(char *name_buf, unsigned level, unsigned count)
+{
+    assert(name_buf);
+    
+    sprintf(name_buf, "%u-%04u", level, count);
+
+    return 0;
+} /* end generate_name() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    generate_symbols
+ *
+ * Purpose:     Initializes the global dataset infomration arrays.
+ *
+ * Parameters:  N/A
+ *
+ * Return:      Success:    0
+ *              Failure:    Can't fail
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+generate_symbols(void)
+{
+    unsigned u, v;      /* Local index variables */
+
+    for(u = 0; u < NLEVELS; u++) {
+        symbol_info[u] = (symbol_info_t *)malloc(symbol_count[u] * sizeof(symbol_info_t));
+        for(v = 0; v < symbol_count[u]; v++) {
+            char name_buf[64];
+
+            generate_name(name_buf, u, v);
+            symbol_info[u][v].name = (char *)malloc(strlen(name_buf) + 1);
+            strcpy(symbol_info[u][v].name, name_buf);
+            symbol_info[u][v].dsid = -1;
+            symbol_info[u][v].nrecords = 0;
+        } /* end for */
+    } /* end for */
+
+    return 0;
+} /* end generate_symbols() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    shutdown_symbols
+ *
+ * Purpose:     Cleans up the global dataset information arrays.
+ *
+ * Parameters:  N/A
+ *
+ * Return:      Success:    0
+ *              Failure:    Can't fail
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+shutdown_symbols(void)
+{
+    unsigned u, v;      /* Local index variables */
+
+    /* Clean up the symbols */
+    for(u = 0; u < NLEVELS; u++) {
+        for(v = 0; v < symbol_count[u]; v++)
+            free(symbol_info[u][v].name);
+        free(symbol_info[u]);
+    } /* end for */
+
+    return 0;
+} /* end shutdown_symbols() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    print_metadata_retries_info
+ *
+ * Purpose:     To retrieve and print the collection of metadata retries for the file.
+ *
+ * Parameters:  fid: the currently opened file identifier
+ *
+ * Return:      Success:    0
+ *              Failure:    negative
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+print_metadata_retries_info(hid_t fid)
+{
+    H5F_retry_info_t info;
+    unsigned i;
+
+    /* Retrieve the collection of retries */
+    if(H5Fget_metadata_read_retry_info(fid, &info) < 0)
+	return (-1);
+
+    /* Print information for each non-NULL retries[i] */
+    for(i = 0; i < H5F_NUM_METADATA_READ_RETRY_TYPES; i++) {
+        unsigned power;
+        unsigned j;
+
+	if(NULL == info.retries[i])
+	    continue;
+
+	fprintf(stderr, "Metadata read retries for item %u:\n", i);
+	power = 1;
+	for(j = 0; j < info.nbins; j++) {
+	    if(info.retries[i][j])
+		fprintf(stderr, "\t# of retries for %u - %u retries: %u\n", 
+		       power, (power * 10) - 1, info.retries[i][j]);
+	    power *= 10;
+	} /* end for */
+    } /* end for */
+
+    /* Free memory for each non-NULL retries[i] */
+    for(i = 0; i < H5F_NUM_METADATA_READ_RETRY_TYPES; i++)
+        if(info.retries[i] != NULL)
+            free(info.retries[i]);
+
+    return 0;
+} /* print_metadata_retries_info() */
+
diff --git a/test/swmr_common.h b/test/swmr_common.h
new file mode 100644
index 0000000..1778f8e
--- /dev/null
+++ b/test/swmr_common.h
@@ -0,0 +1,78 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef _SWMR_COMMON_H
+#define _SWMR_COMMON_H
+
+/* Headers needed */
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+
+#include "hdf5.h"
+#include "h5test.h"
+
+/**********/
+/* Macros */
+/**********/
+
+#define NLEVELS         5   /* # of datasets in the SWMR test file */
+
+#define NMAPPING        9   
+
+#define FILENAME        "swmr_data.h5"  /* SWMR test file name */
+#define DTYPE_SIZE      150             /* Data size in opaque type */
+
+/* The message sent by writer that the file open is done--releasing the file lock */
+#define WRITER_MESSAGE "SWMR_WRITER_MESSAGE"
+
+/************/
+/* Typedefs */
+/************/
+
+/* Information about a symbol/dataset */
+typedef struct {
+    char *name;         /* Dataset name for symbol */
+    hid_t dsid;         /* Dataset ID for symbol */
+    hsize_t nrecords;   /* Number of records for the symbol */
+} symbol_info_t;
+
+/* A symbol's record */
+typedef struct {
+    uint64_t rec_id;    /* ID for this record (unique in symbol) */
+    uint8_t info[DTYPE_SIZE];   /* "Other" information for this record */
+} symbol_t;
+
+/********************/
+/* Global Variables */
+/********************/
+extern symbol_info_t *symbol_info[NLEVELS];
+extern unsigned symbol_count[NLEVELS];
+
+/**************/
+/* Prototypes */
+/**************/
+symbol_info_t * choose_dataset(void);
+hid_t create_symbol_datatype(void);
+int generate_name(char *name_buf, unsigned level, unsigned count);
+int generate_symbols(void);
+int shutdown_symbols(void);
+int print_metadata_retries_info(hid_t fid);
+
+#endif /* _SWMR_COMMON_H */
+
diff --git a/test/swmr_generator.c b/test/swmr_generator.c
new file mode 100644
index 0000000..bbc1e18
--- /dev/null
+++ b/test/swmr_generator.c
@@ -0,0 +1,355 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     swmr_generator.c
+ *
+ * Purpose:     Functions for building and setting up the SWMR test file
+ *              and datasets.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/***********/
+/* Headers */
+/***********/
+
+#include <assert.h>
+#include <sys/time.h>
+
+#include "swmr_common.h"
+
+/****************/
+/* Local Macros */
+/****************/
+
+#define CHUNK_SIZE      50      /* Chunk size for created datasets */
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static int gen_skeleton(const char *filename, unsigned verbose,
+    unsigned swmr_write, int comp_level, const char *index_type,
+    unsigned random_seed);
+static void usage(void);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    gen_skeleton
+ *
+ * Purpose:     Creates the HDF5 file and datasets which will be used in
+ *              the SWMR testing.
+ *
+ * Parameters:  const char *filename
+ *              The SWMR test file's name.
+ *
+ *              unsigned verbose
+ *              Whether verbose console output is desired.
+ *
+ *              int comp_level
+ *              The zlib compression level to use. -1 = no compression.
+ *
+ *              const char *index_type
+ *              The chunk index type (b1 | b2 | ea | fa)
+ *
+ *              unsigned random_seed
+ *              The random seed to store in the file.  The sparse tests use
+ *              this value.
+ *
+ * Return:      Success:    0
+ *                          
+ *              Failure:    Can't fail
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+gen_skeleton(const char *filename, unsigned verbose, unsigned swmr_write,
+    int comp_level, const char *index_type, unsigned random_seed)
+{
+    hid_t fid;          /* File ID for new HDF5 file */
+    hid_t fcpl;         /* File creation property list */
+    hid_t fapl;         /* File access property list */
+    hid_t dcpl;         /* Dataset creation property list */
+    hid_t tid;          /* Datatype for dataset elements */
+    hid_t sid;          /* Dataspace ID */
+    hid_t aid;          /* Attribute ID */
+    hsize_t dims[2] = {1, 0}; /* Dataset starting dimensions */
+    hsize_t max_dims[2] = {1, H5S_UNLIMITED}; /* Dataset maximum dimensions */
+    hsize_t chunk_dims[2] = {1, CHUNK_SIZE}; /* Chunk dimensions */
+#ifdef FILLVAL_WORKS
+    symbol_t fillval;   /* Dataset fill value */
+#endif /* FILLVAL_WORKS */
+    unsigned u, v;      /* Local index variable */
+
+    assert(filename);
+    assert(index_type);
+
+    /* Create file access property list */
+    if((fapl = h5_fileaccess()) < 0)
+        return -1;
+
+    /* Can create a file for SWMR support with: (a) (write+latest-format) or (b) (SWMR write+non-latest-format) */
+    if(!swmr_write) {
+	if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+	    return -1;
+    }
+
+    /* There are two chunk indexes tested here.
+     * With one unlimited dimension, we get the extensible array index
+     * type, with two unlimited dimensions, we get a v-2 B-tree.
+     */
+    if(!strcmp(index_type, "b2"))
+        max_dims[0] = H5S_UNLIMITED;
+
+#ifdef QAK
+    /* Increase the initial size of the metadata cache */
+    {
+        H5AC_cache_config_t mdc_config;
+
+        mdc_config.version = H5AC__CURR_CACHE_CONFIG_VERSION;
+        H5Pget_mdc_config(fapl, &mdc_config);
+        fprintf(stderr, "mdc_config.initial_size = %lu\n", (unsigned long)mdc_config.initial_size);
+        fprintf(stderr, "mdc_config.epoch_length = %lu\n", (unsigned long)mdc_config.epoch_length);
+        mdc_config.set_initial_size = 1;
+        mdc_config.initial_size = 16 * 1024 * 1024;
+        /* mdc_config.epoch_length = 5000; */
+        H5Pset_mdc_config(fapl, &mdc_config);
+    }
+#endif /* QAK */
+
+#ifdef QAK
+    H5Pset_small_data_block_size(fapl, (hsize_t)(50 * CHUNK_SIZE * DTYPE_SIZE));
+#endif /* QAK */
+
+#ifdef QAK
+    H5Pset_fapl_log(fapl, "append.log", H5FD_LOG_ALL, (size_t)(512 * 1024 * 1024));
+#endif /* QAK */
+
+    /* Create file creation property list */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        return -1;
+
+#ifdef QAK
+    H5Pset_link_phase_change(fcpl, 0, 0);
+#endif /* QAK */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Creating file\n");
+
+    /* Create the file */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC | (swmr_write ? H5F_ACC_SWMR_WRITE : 0), fcpl, fapl)) < 0)
+        return -1;
+
+    /* Close file creation property list */
+    if(H5Pclose(fcpl) < 0)
+        return -1;
+
+    /* Close file access property list */
+    if(H5Pclose(fapl) < 0)
+        return -1;
+
+    /* Create attribute with (shared) random number seed - for sparse test */
+    if((sid = H5Screate(H5S_SCALAR)) < 0)
+        return -1;
+    if((aid = H5Acreate2(fid, "seed", H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        return -1;
+    if(H5Awrite(aid, H5T_NATIVE_UINT, &random_seed) < 0)
+        return -1;
+    if(H5Sclose(sid) < 0)
+        return -1;
+
+    /* Create datatype for creating datasets */
+    if((tid = create_symbol_datatype()) < 0)
+        return -1;
+
+    /* Create dataspace for creating datasets */
+    if((sid = H5Screate_simple(2, dims, max_dims)) < 0)
+        return -1;
+
+    /* Create dataset creation property list */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        return -1;
+    if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0)
+        return -1;
+    if(comp_level >= 0) {
+        if(H5Pset_deflate(dcpl, (unsigned)comp_level) < 0)
+            return -1;
+    } /* end if */
+#ifdef FILLVAL_WORKS
+    /* Currently fill values do not work because they can bump the dataspace
+     * message to the second object header chunk.  We should enable the fillval
+     * here when this is fixed.  -NAF 8/11/11 */
+    memset(&fillval, 0, sizeof(fillval));
+    fillval.rec_id = (uint64_t)ULLONG_MAX;
+    if(H5Pset_fill_value(dcpl, tid, &fillval) < 0)
+        return -1;
+#endif /* FILLVAL_WORKS */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Creating datasets\n");
+
+    /* Create the datasets */
+    for(u = 0; u < NLEVELS; u++)
+        for(v = 0; v < symbol_count[u]; v++) {
+            hid_t dsid;         /* Dataset ID */
+            char name_buf[64];
+
+            generate_name(name_buf, u, v);
+            if((dsid = H5Dcreate2(fid, name_buf, tid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+                return -1;
+
+            if(H5Dclose(dsid) < 0)
+                return -1;
+        } /* end for */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Closing objects\n");
+
+    /* Close everythign */
+    if(H5Pclose(dcpl) < 0)
+        return -1;
+    if(H5Sclose(sid) < 0)
+        return -1;
+    if(H5Tclose(tid) < 0)
+        return -1;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    return 0;
+} /* end gen_skeleton() */
+
+static void
+usage(void)
+{
+    printf("\n");
+    printf("Usage error!\n");
+    printf("\n");
+    printf("Usage: swmr_generator [-q] [-s] [-c <deflate compression level>]\n");
+    printf("    [-i <index type>] [-r <random seed>]\n");
+    printf("\n");
+    printf("NOTE: The random seed option is only used by the sparse test.  Other\n");
+    printf("      tests specify the random seed as a reader/writer option.\n");
+    printf("\n");
+    printf("<deflate compression level> should be -1 (for no compression) or 0-9\n");
+    printf("\n");
+    printf("<index type> should be b2 or ea\n");
+    printf("\n");
+    printf("Defaults to verbose (no '-q' given), no SWMR_WRITE mode (no '-s' given) no\n");
+    printf("compression ('-c -1'), v1 b-tree indexing (-i b1), and will generate a random\n");
+    printf("seed (no -r given).\n");
+    printf("\n");
+    exit(1);
+} /* end usage() */
+
+int main(int argc, const char *argv[])
+{
+    int comp_level = -1;            /* Compression level (-1 is no compression) */
+    unsigned verbose = 1;           /* Whether to emit some informational messages */
+    unsigned swmr_write = 0;        /* Whether to create file with SWMR_WRITE access */
+    const char *index_type = "b1";  /* Chunk index type */
+    unsigned use_seed = 0;          /* Set to 1 if a seed was set on the command line */
+    unsigned random_seed = 0;       /* Random # seed */
+    unsigned u;                     /* Local index variables */
+    int temp;
+
+    /* Parse command line options */
+    if(argc > 1) {
+        u = 1;
+        while(u < (unsigned)argc) {
+            if(argv[u][0] == '-') {
+                switch(argv[u][1]) {
+                    /* Compress dataset chunks */
+                    case 'c':
+                        comp_level = atoi(argv[u + 1]);
+                        if(comp_level < -1 || comp_level > 9)
+                            usage();
+                        u += 2;
+                        break;
+
+                    /* Chunk index type */
+                    case 'i':
+                        index_type = argv[u + 1];
+                        if(strcmp(index_type, "ea")
+                                && strcmp(index_type, "b2"))
+                            usage();
+                        u += 2;
+                        break;
+
+                    /* Random # seed */
+                    case 'r':
+                        use_seed = 1;
+                        temp = atoi(argv[u + 1]);
+                        if(temp < 0)
+                            usage();
+                        else
+                            random_seed = (unsigned)temp;
+                        u += 2;
+                        break;
+
+                    /* Be quiet */
+                    case 'q':
+                        verbose = 0;
+                        u++;
+                        break;
+
+                    /* Run with SWMR_WRITE */
+                    case 's':
+                        swmr_write = 1;
+                        u++;
+                        break;
+
+                    default:
+                        usage();
+                        break;
+                } /* end switch */
+            } /* end if */
+        } /* end while */
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose) {
+        fprintf(stderr, "Parameters:\n");
+        fprintf(stderr, "\tswmr writes %s\n", swmr_write ? "on" : "off");
+        fprintf(stderr, "\tcompression level = %d\n", comp_level);
+        fprintf(stderr, "\tindex type = %s\n", index_type);
+    } /* end if */
+    
+    /* Set the random seed */
+    if(0 == use_seed) {
+        struct timeval t;
+        gettimeofday(&t, NULL);
+        random_seed = (unsigned)(t.tv_usec);
+    } /* end if */
+    srandom(random_seed);
+    /* ALWAYS emit the random seed for possible debugging */
+    fprintf(stderr, "Using generator random seed (used in sparse test only): %u\n", random_seed);
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Generating skeleton file: %s\n", FILENAME);
+
+    /* Generate file skeleton */
+    if(gen_skeleton(FILENAME, verbose, swmr_write, comp_level, index_type, random_seed) < 0) {
+        fprintf(stderr, "Error generating skeleton file!\n");
+        exit(1);
+    } /* end if */
+
+    return 0;
+}
diff --git a/test/swmr_reader.c b/test/swmr_reader.c
new file mode 100644
index 0000000..f7b7e96
--- /dev/null
+++ b/test/swmr_reader.c
@@ -0,0 +1,509 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     swmr_reader.c
+ *
+ * Purpose:     Reads data from a randomly selected subset of the datasets
+ *              in the SWMR test file.
+ *
+ *              This program is intended to run concurrently with the
+ *              swmr_writer program.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/***********/
+/* Headers */
+/***********/
+
+#include <assert.h>
+#include <unistd.h>
+#include <sys/time.h>
+
+#include "swmr_common.h"
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static int check_dataset(hid_t fid, unsigned verbose, const char *sym_name,
+    symbol_t *record, hid_t rec_sid);
+static int read_records(const char *filename, unsigned verbose, unsigned long nseconds,
+    unsigned poll_time, unsigned ncommon, unsigned nrandom);
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+static hid_t symbol_tid = -1;   /* The type ID for the SWMR datasets */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_dataset
+ *
+ * Purpose:     For a given dataset, checks to make sure that the stated
+ *              and actual sizes are the same.  If they are not, then
+ *              we have an inconsistent dataset due to a SWMR error.
+ *
+ * Parameters:  hid_t fid
+ *              The SWMR test file's ID.
+ *
+ *              unsigned verbose
+ *              Whether verbose console output is desired.
+ *
+ *              const char *sym_name
+ *              The name of the dataset from which to read.
+ *
+ *              symbol_t *record
+ *              Memory for the record.  Must be pre-allocated.
+ *
+ *              hid_t rec_sid
+ *              The memory dataspace for access.  It's always the same so
+ *              there is no need to re-create it every time this function
+ *              is called.
+ *
+ * Return:      Success:    0
+ *              Failure:    -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+check_dataset(hid_t fid, unsigned verbose, const char *sym_name, symbol_t *record,
+    hid_t rec_sid)
+{
+    hid_t dsid;                 /* Dataset ID */
+    hid_t file_sid;             /* Dataset's space ID */
+    hssize_t snpoints;          /* Number of elements in dataset */
+    hsize_t start[2] = {0, 0}, count[2] = {1, 1};   /* Hyperslab selection values */
+
+    assert(fid >= 0);
+    assert(sym_name);
+    assert(record);
+    assert(rec_sid >= 0);
+
+    /* Open dataset for symbol */
+    if((dsid = H5Dopen2(fid, sym_name, H5P_DEFAULT)) < 0)
+        return -1;
+
+    /* Get the dataset's dataspace */
+    if((file_sid = H5Dget_space(dsid)) < 0)
+        return -1;
+
+    /* Get the number of elements (= records, for 1-D datasets) */
+    if((snpoints = H5Sget_simple_extent_npoints(file_sid)) < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Symbol = '%s', # of records = %lld\n", sym_name, (long long)snpoints);
+
+    /* Check if there are records for symbol */
+    if(snpoints > 0) {
+        /* Choose the last record in the dataset */
+        start[1] = (hsize_t)(snpoints - 1);
+        if(H5Sselect_hyperslab(file_sid, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+            return -1;
+
+        /* Read record from dataset */
+        record->rec_id = (uint64_t)ULLONG_MAX;
+        if(H5Dread(dsid, symbol_tid, rec_sid, file_sid, H5P_DEFAULT, record) < 0)
+            return -1;
+
+        /* Verify record value */
+        if(record->rec_id != start[1]) {
+            fprintf(stderr, "*** ERROR ***\n");
+            fprintf(stderr, "Incorrect record value!\n");
+            fprintf(stderr, "Symbol = '%s', # of records = %lld, record->rec_id = %llu\n", sym_name, (long long)snpoints, (unsigned long long)record->rec_id);
+            return -1;
+        } /* end if */
+    } /* end if */
+
+    /* Close the dataset's dataspace */
+    if(H5Sclose(file_sid) < 0)
+        return -1;
+
+    /* Close dataset for symbol */
+    if(H5Dclose(dsid) < 0)
+        return -1;
+
+    return 0;
+} /* end check_dataset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    read_records
+ *
+ * Purpose:     For a given dataset, checks to make sure that the stated
+ *              and actual sizes are the same.  If they are not, then
+ *              we have an inconsistent dataset due to a SWMR error.
+ *
+ *              The "common" datasets are a random selection from among
+ *              the level 0 datasets.  The "random" datasets are a random
+ *              selection from among all the file's datasets.  This scheme
+ *              ensures that the level 0 datasets are interrogated vigorously.
+ *
+ * Parameters:  const char *filename
+ *              The SWMR test file's name.
+ *
+ *              unsigned verbose
+ *              Whether verbose console output is desired.
+ *
+ *              unsigned long nseconds
+ *              The amount of time to read records (ns).
+ *
+ *              unsigned poll_time
+ *              The amount of time to sleep (s).
+ *
+ *              unsigned ncommon
+ *              The number of common/non-random datasets that will be opened.
+ *
+ *              unsigned nrandom
+ *              The number of random datasets that will be opened.
+ *
+ * Return:      Success:    0
+ *              Failure:    -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+read_records(const char *filename, unsigned verbose, unsigned long nseconds,
+    unsigned poll_time, unsigned ncommon, unsigned nrandom)
+{
+    time_t start_time;          /* Starting time */
+    time_t curr_time;           /* Current time */
+    symbol_info_t **sym_com = NULL;     /* Pointers to array of common dataset IDs */
+    symbol_info_t **sym_rand = NULL;    /* Pointers to array of random dataset IDs */
+    hid_t mem_sid;              /* Memory dataspace ID */
+    hid_t fid;                  /* SWMR test file ID */
+    hid_t fapl;                 /* file access property list */
+    symbol_t record;            /* The record to read from the dataset */
+    unsigned v;                 /* Local index variable */
+
+    assert(filename);
+    assert(nseconds != 0);
+    assert(poll_time != 0);
+
+    /* Reset the record */
+    /* (record's 'info' field might need to change for each record read, also) */
+    memset(&record, 0, sizeof(record));
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Choosing datasets\n");
+
+    /* Allocate space for 'common' datasets, if any */
+    if(ncommon > 0) {
+        /* Allocate array to hold pointers to symbols for common datasets */
+        if(NULL == (sym_com = (symbol_info_t **)malloc(sizeof(symbol_info_t *) * ncommon)))
+            return -1;
+
+        /* Open the common datasets */
+        for(v = 0; v < ncommon; v++) {
+            unsigned offset;                /* Offset of symbol to use */
+
+            /* Determine the offset of the symbol, within level 0 symbols */
+            /* (level 0 symbols are the most common symbols) */
+            offset = (unsigned)(random() % symbol_count[0]);
+            sym_com[v] = &symbol_info[0][offset];
+
+            /* Emit informational message */
+            if(verbose)
+                fprintf(stderr, "Common symbol #%u = '%s'\n", v, symbol_info[0][offset].name);
+        } /* end for */
+    } /* end if */
+
+    /* Allocate space for 'random' datasets, if any */
+    if(nrandom > 0) {
+        /* Allocate array to hold pointers to symbols for random datasets */
+        if(NULL == (sym_rand = (symbol_info_t **)malloc(sizeof(symbol_info_t *) * nrandom)))
+            return -1;
+
+        /* Determine the random datasets */
+        for(v = 0; v < nrandom; v++) {
+            symbol_info_t *sym;         /* Symbol to use */
+
+            /* Determine the symbol, within all symbols */
+            if(NULL == (sym = choose_dataset()))
+                return -1;
+            sym_rand[v] = sym;
+
+            /* Emit informational message */
+            if(verbose)
+                fprintf(stderr, "Random symbol #%u = '%s'\n", v, sym->name);
+        } /* end for */
+    } /* end if */
+
+    /* Create a dataspace for the record to read */
+    if((mem_sid = H5Screate(H5S_SCALAR)) < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Reading records\n");
+
+    /* Get the starting time */
+    start_time = time(NULL);
+    curr_time = start_time;
+
+    /* Create file access property list */
+    if((fapl = h5_fileaccess()) < 0)
+        return -1;
+
+    /* Loop over reading records until [at least] the correct # of seconds have passed */
+    while(curr_time < (time_t)(start_time + (time_t)nseconds)) {
+
+        /* Emit informational message */
+        if(verbose)
+            fprintf(stderr, "Opening file: %s\n", filename);
+
+        /* Open the file */
+        if((fid = H5Fopen(filename, H5F_ACC_RDONLY | H5F_ACC_SWMR_READ, fapl)) < 0)
+            return -1;
+
+        /* Check 'common' datasets, if any */
+        if(ncommon > 0) {
+            /* Emit informational message */
+            if(verbose)
+                fprintf(stderr, "Checking common symbols\n");
+
+            /* Iterate over common datasets */
+            for(v = 0; v < ncommon; v++) {
+                /* Check common dataset */
+                if(check_dataset(fid, verbose, sym_com[v]->name, &record, mem_sid) < 0)
+                    return -1;
+                memset(&record, 0, sizeof(record));
+            } /* end for */
+        } /* end if */
+
+        /* Check 'random' datasets, if any */
+        if(nrandom > 0) {
+            /* Emit informational message */
+            if(verbose)
+                fprintf(stderr, "Checking random symbols\n");
+
+            /* Iterate over random datasets */
+            for(v = 0; v < nrandom; v++) {
+                /* Check random dataset */
+                if(check_dataset(fid, verbose, sym_rand[v]->name, &record, mem_sid) < 0)
+                    return -1;
+                memset(&record, 0, sizeof(record));
+            } /* end for */
+        } /* end if */
+
+        /* Emit informational message */
+        if(verbose)
+            fprintf(stderr, "Closing file\n");
+            
+        /* Close the file */
+        if(H5Fclose(fid) < 0)
+            return -1;
+
+        /* Sleep for the appropriate # of seconds */
+        sleep(poll_time);
+
+        /* Retrieve the current time */
+        curr_time = time(NULL);
+    } /* end while */
+
+    /* Close the memory dataspace */
+    if(H5Sclose(mem_sid) < 0)
+        return -1;
+
+    /* Close the fapl */
+    if(H5Pclose(fapl) < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Closing datasets\n");
+
+    /* Close 'random' datasets, if any */
+    if(nrandom > 0) {
+        /* Release array holding dataset ID's for random datasets */
+        free(sym_rand);
+    } /* end if */
+
+    /* Close 'common' datasets, if any */
+    if(ncommon > 0) {
+        /* Release array holding dataset ID's for common datasets */
+        free(sym_com);
+    } /* end if */
+
+    return 0;
+} /* end read_records() */
+
+static void
+usage(void)
+{
+    printf("\n");
+    printf("Usage error!\n");
+    printf("\n");
+    printf("Usage: swmr_reader [-q] [-s <# of seconds to sleep between polling>]\n");
+    printf("    [-h <# of common symbols to poll>] [-l <# of random symbols to poll>]\n");
+    printf("    [-r <random seed>] <# of seconds to test>\n");
+    printf("\n");
+    printf("<# of seconds to test> must be specified.\n");
+    printf("\n");
+    printf("Defaults to verbose (no '-q' given), 1 second between polling ('-s 1'),\n");
+    printf("5 common symbols to poll ('-h 5'), 10 random symbols to poll ('-l 10'),\n");
+    printf("and will generate a random seed (no -r given).\n");
+    printf("\n");
+    exit(1);
+}
+
+int main(int argc, const char *argv[])
+{
+    long nseconds = 0;      /* # of seconds to test */
+    int poll_time = 1;      /* # of seconds between polling */
+    int ncommon = 5;        /* # of common symbols to poll */
+    int nrandom = 10;       /* # of random symbols to poll */
+    unsigned verbose = 1;   /* Whether to emit some informational messages */
+    unsigned use_seed = 0;  /* Set to 1 if a seed was set on the command line */
+    unsigned random_seed = 0;   /* Random # seed */
+    unsigned u;             /* Local index variables */
+    int temp;
+
+    /* Parse command line options */
+    if(argc < 2)
+        usage();
+    if(argc > 1) {
+        u = 1;
+        while(u < (unsigned)argc) {
+            if(argv[u][0] == '-') {
+                switch(argv[u][1]) {
+                    /* # of common symbols to poll */
+                    case 'h':
+                        ncommon = atoi(argv[u + 1]);
+                        if(ncommon < 0)
+                            usage();
+                        u += 2;
+                        break;
+
+                    /* # of random symbols to poll */
+                    case 'l':
+                        nrandom = atoi(argv[u + 1]);
+                        if(nrandom < 0)
+                            usage();
+                        u += 2;
+                        break;
+
+                    /* Be quiet */
+                    case 'q':
+                        verbose = 0;
+                        u++;
+                        break;
+
+                    /* Random # seed */
+                    case 'r':
+                        use_seed = 1;
+                        temp = atoi(argv[u + 1]);
+                        if(temp < 0)
+                            usage();
+                        else
+                            random_seed = (unsigned)temp;
+                        u += 2;
+                        break;
+
+                    /* # of seconds between polling */
+                    case 's':
+                        poll_time = atoi(argv[u + 1]);
+                        if(poll_time < 0)
+                            usage();
+                        u += 2;
+                        break;
+
+                    default:
+                        usage();
+                        break;
+                } /* end switch */
+            } /* end if */
+            else {
+                /* Get the number of records to append */
+                nseconds = atol(argv[u]);
+                if(nseconds <= 0)
+                    usage();
+
+                u++;
+            } /* end else */
+        } /* end while */
+    } /* end if */
+    if(nseconds <= 0)
+        usage();
+    if(poll_time >= nseconds)
+        usage();
+
+    /* Emit informational message */
+    if(verbose) {
+        fprintf(stderr, "Parameters:\n");
+        fprintf(stderr, "\t# of seconds between polling = %d\n", poll_time);
+        fprintf(stderr, "\t# of common symbols to poll = %d\n", ncommon);
+        fprintf(stderr, "\t# of random symbols to poll = %d\n", nrandom);
+        fprintf(stderr, "\t# of seconds to test = %ld\n", nseconds);
+    } /* end if */
+
+    /* Set the random seed */
+    if(0 == use_seed) {
+        struct timeval t;
+        gettimeofday(&t, NULL);
+        random_seed = (unsigned)(t.tv_usec);
+    } /* end if */
+    srandom(random_seed);
+    /* ALWAYS emit the random seed for possible debugging */
+    fprintf(stderr, "Using reader random seed: %u\n", random_seed);
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Generating symbol names\n");
+
+    /* Generate dataset names */
+    if(generate_symbols() < 0) {
+        fprintf(stderr, "Error generating symbol names!\n");
+        exit(1);
+    } /* end if */
+
+    /* Create datatype for creating datasets */
+    if((symbol_tid = create_symbol_datatype()) < 0)
+        return -1;
+
+    /* Reading records from datasets */
+    if(read_records(FILENAME, verbose, (unsigned long)nseconds, (unsigned)poll_time, (unsigned)ncommon, (unsigned)nrandom) < 0) {
+        fprintf(stderr, "Error reading records from datasets!\n");
+        exit(1);
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Releasing symbols\n");
+
+    /* Clean up the symbols */
+    if(shutdown_symbols() < 0) {
+        fprintf(stderr, "Error releasing symbols!\n");
+        exit(1);
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Closing objects\n");
+
+    /* Close objects created */
+    if(H5Tclose(symbol_tid) < 0) {
+        fprintf(stderr, "Error closing symbol datatype!\n");
+        exit(1);
+    } /* end if */
+
+    return 0;
+}
diff --git a/test/swmr_remove_reader.c b/test/swmr_remove_reader.c
new file mode 100644
index 0000000..76c44fa
--- /dev/null
+++ b/test/swmr_remove_reader.c
@@ -0,0 +1,522 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     swmr_remove_reader.c
+ *
+ * Purpose:     Reads data from a randomly selected subset of the datasets
+ *              in the SWMR test file.  Unlike the regular reader, these
+ *              datasets will be shrinking.
+ *
+ *              This program is intended to run concurrently with the
+ *              swmr_remove_writer program.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/***********/
+/* Headers */
+/***********/
+
+#include <assert.h>
+#include <unistd.h>
+#include <sys/time.h>
+
+#include "swmr_common.h"
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+static hid_t symbol_tid = -1;
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static int check_dataset(hid_t fid, unsigned verbose, const char *sym_name,
+    symbol_t *record, hid_t rec_sid);
+static int read_records(const char *filename, unsigned verbose, unsigned long nseconds,
+    unsigned poll_time, unsigned ncommon, unsigned nrandom);
+static void usage(void);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_dataset
+ *
+ * Purpose:     For a given dataset, checks to make sure that the stated
+ *              and actual sizes are the same.  If they are not, then
+ *              we have an inconsistent dataset due to a SWMR error.
+ *
+ * Parameters:  hid_t fid
+ *              The SWMR test file's ID.
+ *
+ *              unsigned verbose
+ *              Whether verbose console output is desired.
+ *
+ *              const char *sym_name
+ *              The name of the dataset from which to read.
+ *
+ *              symbol_t *record
+ *              Memory for the record.  Must be pre-allocated.
+ *
+ *              hid_t rec_sid
+ *              The memory dataspace for access.  It's always the same so
+ *              there is no need to re-create it every time this function
+ *              is called.
+ *
+ * Return:      Success:    0
+ *              Failure:    -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+check_dataset(hid_t fid, unsigned verbose, const char *sym_name, symbol_t *record,
+    hid_t rec_sid)
+{
+    hid_t dsid;                 /* Dataset ID */
+    hid_t file_sid;             /* Dataset's space ID */
+    hssize_t snpoints;          /* Number of elements in dataset */
+    hsize_t start[2] = {0, 0}, count[2] = {1, 1}; /* Hyperslab selection values */
+
+    assert(fid >= 0);
+    assert(sym_name);
+    assert(record);
+    assert(rec_sid >= 0);
+
+    /* Open dataset for symbol */
+    if((dsid = H5Dopen2(fid, sym_name, H5P_DEFAULT)) < 0)
+        return -1;
+
+    /* Get the dataset's dataspace */
+    if((file_sid = H5Dget_space(dsid)) < 0)
+        return -1;
+
+    /* Get the number of elements (= records, for 1-D datasets) */
+    if((snpoints = H5Sget_simple_extent_npoints(file_sid)) < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Symbol = '%s', # of records = %lld\n", sym_name, (long long)snpoints);
+
+    /* Check if there are records for symbol */
+    if(snpoints > 0) {
+        /* Choose a random record in the dataset, choosing the last record half
+         * the time */
+        start[1] = (hsize_t)(random() % (snpoints * 2));
+        if(start[1] > (hsize_t)(snpoints - 1))
+            start[1] = (hsize_t)(snpoints - 1);
+        if(H5Sselect_hyperslab(file_sid, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+            return -1;
+
+        /* Read record from dataset */
+#ifdef FILLVAL_WORKS
+        /* When shrinking the dataset, we cannot guarantee that the buffer will
+         * even be touched, unless there is a fill value.  Since fill values do
+         * not work with SWMR currently (see note in swmr_generator.c), we
+         * simply initialize rec_id to 0. */
+        record->rec_id = (uint64_t)ULLONG_MAX - 1;
+#else /* FILLVAL_WORKS */
+        record->rec_id = (uint64_t)0;
+#endif /* FILLVAL_WORKS */
+        if(H5Dread(dsid, symbol_tid, rec_sid, file_sid, H5P_DEFAULT, record) < 0)
+            return -1;
+
+        /* Verify record value - note that it may be the fill value, because the
+         * chunk may be deleted before the object header has the updated
+         * dimensions */
+        if(record->rec_id != start[1] && record->rec_id != (uint64_t)0) {
+            fprintf(stderr, "*** ERROR ***\n");
+            fprintf(stderr, "Incorrect record value!\n");
+            fprintf(stderr, "Symbol = '%s', # of records = %lld, record->rec_id = %llx\n", sym_name, (long long)snpoints, (unsigned long long)record->rec_id);
+            return -1;
+        } /* end if */
+    } /* end if */
+
+    /* Close the dataset's dataspace */
+    if(H5Sclose(file_sid) < 0)
+        return -1;
+
+    /* Close dataset for symbol */
+    if(H5Dclose(dsid) < 0)
+        return -1;
+
+    return 0;
+} /* end check_dataset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    read_records
+ *
+ * Purpose:     For a given dataset, checks to make sure that the stated
+ *              and actual sizes are the same.  If they are not, then
+ *              we have an inconsistent dataset due to a SWMR error.
+ *
+ *              The "common" datasets are a random selection from among
+ *              the level 0 datasets.  The "random" datasets are a random
+ *              selection from among all the file's datasets.  This scheme
+ *              ensures that the level 0 datasets are interrogated vigorously.
+ *
+ * Parameters:  const char *filename
+ *              The SWMR test file's name.
+ *
+ *              unsigned verbose
+ *              Whether verbose console output is desired.
+ *
+ *              unsigned long nseconds
+ *              The amount of time to read records (ns).
+ *
+ *              unsigned poll_time
+ *              The amount of time to sleep (s).
+ *
+ *              unsigned ncommon
+ *              The number of common/non-random datasets that will be opened.
+ *
+ *              unsigned nrandom
+ *              The number of random datasets that will be opened.
+ *
+ * Return:      Success:    0
+ *              Failure:    -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+read_records(const char *filename, unsigned verbose, unsigned long nseconds,
+    unsigned poll_time, unsigned ncommon, unsigned nrandom)
+{
+    time_t start_time;          /* Starting time */
+    time_t curr_time;           /* Current time */
+    symbol_info_t **sym_com = NULL;     /* Pointers to array of common dataset IDs */
+    symbol_info_t **sym_rand = NULL;    /* Pointers to array of random dataset IDs */
+    hid_t mem_sid;              /* Memory dataspace ID */
+    hid_t fid;                  /* SWMR test file ID */
+    hid_t fapl;                 /* File access property list */
+    symbol_t record;            /* The record to add to the dataset */
+    unsigned v;                 /* Local index variable */
+
+    assert(filename);
+    assert(nseconds != 0);
+    assert(poll_time != 0);
+
+    /* Reset the record */
+    /* (record's 'info' field might need to change for each record written, also) */
+    memset(&record, 0, sizeof(record));
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Choosing datasets\n");
+
+    /* Allocate space for 'common' datasets, if any */
+    if(ncommon > 0) {
+        /* Allocate array to hold pointers to symbols for common datasets */
+        if(NULL == (sym_com = (symbol_info_t **)malloc(sizeof(symbol_info_t *) * ncommon)))
+            return -1;
+
+        /* Open the common datasets */
+        for(v = 0; v < ncommon; v++) {
+            unsigned offset;                /* Offset of symbol to use */
+
+            /* Determine the offset of the symbol, within level 0 symbols */
+            /* (level 0 symbols are the most common symbols) */
+            offset = (unsigned)(random() % symbol_count[0]);
+            sym_com[v] = &symbol_info[0][offset];
+
+            /* Emit informational message */
+            if(verbose)
+                fprintf(stderr, "Common symbol #%u = '%s'\n", v, symbol_info[0][offset].name);
+        } /* end for */
+    } /* end if */
+
+    /* Allocate space for 'random' datasets, if any */
+    if(nrandom > 0) {
+        /* Allocate array to hold pointers to symbols for random datasets */
+        if(NULL == (sym_rand = (symbol_info_t **)malloc(sizeof(symbol_info_t *) * nrandom)))
+            return -1;
+
+        /* Determine the random datasets */
+        for(v = 0; v < nrandom; v++) {
+            symbol_info_t *sym;         /* Symbol to use */
+
+            /* Determine the symbol, within all symbols */
+            if(NULL == (sym = choose_dataset()))
+                return -1;
+            sym_rand[v] = sym;
+
+            /* Emit informational message */
+            if(verbose)
+                fprintf(stderr, "Random symbol #%u = '%s'\n", v, sym->name);
+        } /* end for */
+    } /* end if */
+
+    /* Create a dataspace for the record to read */
+    if((mem_sid = H5Screate(H5S_SCALAR)) < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Reading records\n");
+
+    /* Get the starting time */
+    start_time = time(NULL);
+    curr_time = start_time;
+
+    /* Create file access property list */
+    if((fapl = h5_fileaccess()) < 0)
+        return -1;
+
+    /* Loop over reading records until [at least] the correct # of seconds have passed */
+    while(curr_time < (time_t)(start_time + (time_t)nseconds)) {
+
+        /* Emit informational message */
+        if(verbose)
+             fprintf(stderr, "Opening file: %s\n", filename);
+
+        /* Open the file */
+        if((fid = H5Fopen(filename, H5F_ACC_RDONLY | H5F_ACC_SWMR_READ, fapl)) < 0)
+            return -1;
+
+        /* Check 'common' datasets, if any */
+        if(ncommon > 0) {
+            /* Emit informational message */
+            if(verbose)
+                fprintf(stderr, "Checking common symbols\n");
+
+            /* Iterate over common datasets */
+            for(v = 0; v < ncommon; v++) {
+                /* Check common dataset */
+                if(check_dataset(fid, verbose, sym_com[v]->name, &record, mem_sid) < 0)
+                    return -1;
+                memset(&record, 0, sizeof(record));
+            } /* end for */
+        } /* end if */
+
+        /* Check 'random' datasets, if any */
+        if(nrandom > 0) {
+            /* Emit informational message */
+            if(verbose)
+                fprintf(stderr, "Checking random symbols\n");
+
+            /* Iterate over random datasets */
+            for(v = 0; v < nrandom; v++) {
+                /* Check random dataset */
+                if(check_dataset(fid, verbose, sym_rand[v]->name, &record, mem_sid) < 0)
+                    return -1;
+                memset(&record, 0, sizeof(record));
+            } /* end for */
+        } /* end if */
+
+        /* Emit informational message */
+        if(verbose)
+            fprintf(stderr, "Closing file\n");
+
+        /* Close the file */
+        if(H5Fclose(fid) < 0)
+            return -1;
+
+        /* Sleep for the appropriate # of seconds */
+        sleep(poll_time);
+
+        /* Retrieve the current time */
+        curr_time = time(NULL);
+    } /* end while */
+
+    /* Close the fapl */
+    if(H5Pclose(fapl) < 0)
+        return -1;
+
+    /* Close the memory dataspace */
+    if(H5Sclose(mem_sid) < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Closing datasets\n");
+
+    /* Close 'random' datasets, if any */
+    if(nrandom > 0) {
+        /* Release array holding dataset ID's for random datasets */
+        free(sym_rand);
+    } /* end if */
+
+    /* Close 'common' datasets, if any */
+    if(ncommon > 0) {
+        /* Release array holding dataset ID's for common datasets */
+        free(sym_com);
+    } /* end if */
+
+    return 0;
+} /* end read_records() */
+
+static void
+usage(void)
+{
+    printf("\n");
+    printf("Usage error!\n");
+    printf("\n");
+    printf("Usage: swmr_remove_reader [-q] [-s <# of seconds to sleep between\n");
+    printf("    polling>] [-h <# of common symbols to poll>] [-l <# of random symbols\n");
+    printf("    to poll>] [-r <random seed>] <# of seconds to test>\n");
+    printf("\n");
+    printf("Defaults to verbose (no '-q' given), 1 second between polling ('-s 1'),\n");
+    printf("5 common symbols to poll ('-h 5'), 10 random symbols to poll ('-l 10'),\n");
+    printf("and will generate a random seed (no -r given).\n");
+    printf("\n");
+    exit(1);
+} 
+
+int main(int argc, const char *argv[])
+{
+    long nseconds = 0;      /* # of seconds to test */
+    int poll_time = 1;      /* # of seconds between polling */
+    int ncommon = 5;        /* # of common symbols to poll */
+    int nrandom = 10;       /* # of random symbols to poll */
+    unsigned verbose = 1;   /* Whether to emit some informational messages */
+    unsigned use_seed = 0;  /* Set to 1 if a seed was set on the command line */
+    unsigned random_seed = 0;   /* Random # seed */
+    unsigned u;             /* Local index variables */
+    int temp;
+
+    /* Parse command line options */
+    if(argc < 2)
+        usage();
+    if(argc > 1) {
+        u = 1;
+        while(u < (unsigned)argc) {
+            if(argv[u][0] == '-') {
+                switch(argv[u][1]) {
+                    /* # of common symbols to poll */
+                    case 'h':
+                        ncommon = atoi(argv[u + 1]);
+                        if(ncommon < 0)
+                            usage();
+                        u += 2;
+                        break;
+
+                    /* # of random symbols to poll */
+                    case 'l':
+                        nrandom = atoi(argv[u + 1]);
+                        if(nrandom < 0)
+                            usage();
+                        u += 2;
+                        break;
+
+                    /* Be quiet */
+                    case 'q':
+                        verbose = 0;
+                        u++;
+                        break;
+
+                    /* Random # seed */
+                    case 'r':
+                        use_seed = 1;
+                        temp = atoi(argv[u + 1]);
+                        if(temp < 0)
+                            usage();
+                        else
+                            random_seed = (unsigned)temp;
+                        u += 2;
+                        break;
+
+                    /* # of seconds between polling */
+                    case 's':
+                        poll_time = atoi(argv[u + 1]);
+                        if(poll_time < 0)
+                            usage();
+                        u += 2;
+                        break;
+
+                    default:
+                        usage();
+                        break;
+                } /* end switch */
+            } /* end if */
+            else {
+                /* Get the number of records to append */
+                nseconds = atol(argv[u]);
+                if(nseconds <= 0)
+                    usage();
+
+                u++;
+            } /* end else */
+        } /* end while */
+    } /* end if */
+    if(nseconds <= 0)
+        usage();
+    if(poll_time >= nseconds)
+        usage();
+
+    /* Emit informational message */
+    if(verbose) {
+        fprintf(stderr, "Parameters:\n");
+        fprintf(stderr, "\t# of seconds between polling = %d\n", poll_time);
+        fprintf(stderr, "\t# of common symbols to poll = %d\n", ncommon);
+        fprintf(stderr, "\t# of random symbols to poll = %d\n", nrandom);
+        fprintf(stderr, "\t# of seconds to test = %ld\n", nseconds);
+    } /* end if */
+
+    /* Set the random seed */
+    if(0 == use_seed) {
+        struct timeval t;
+        gettimeofday(&t, NULL);
+        random_seed = (unsigned)(t.tv_usec);
+    } /* end if */
+    srandom(random_seed);
+    /* ALWAYS emit the random seed for possible debugging */
+    fprintf(stderr, "Using reader random seed: %u\n", random_seed);
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Generating symbol names\n");
+
+    /* Generate dataset names */
+    if(generate_symbols() < 0) {
+        fprintf(stderr, "Error generating symbol names!\n");
+        exit(1);
+    } /* end if */
+
+    /* Create datatype for creating datasets */
+    if((symbol_tid = create_symbol_datatype()) < 0)
+        return -1;
+
+    /* Reading records from datasets */
+    if(read_records(FILENAME, verbose, (unsigned long)nseconds, (unsigned)poll_time, (unsigned)ncommon, (unsigned)nrandom) < 0) {
+        fprintf(stderr, "Error reading records from datasets!\n");
+        exit(1);
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Releasing symbols\n");
+
+    /* Clean up the symbols */
+    if(shutdown_symbols() < 0) {
+        fprintf(stderr, "Error releasing symbols!\n");
+        exit(1);
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Closing objects\n");
+
+    /* Close objects created */
+    if(H5Tclose(symbol_tid) < 0) {
+        fprintf(stderr, "Error closing symbol datatype!\n");
+        exit(1);
+    } /* end if */
+
+    return 0;
+}
diff --git a/test/swmr_remove_writer.c b/test/swmr_remove_writer.c
new file mode 100644
index 0000000..a4f030c
--- /dev/null
+++ b/test/swmr_remove_writer.c
@@ -0,0 +1,383 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     swmr_remove_writer.c
+ *
+ * Purpose:     Removes data from a randomly selected subset of the datasets
+ *              in the SWMR test file.
+ *
+ *              This program is intended to run concurrently with the
+ *              swmr_remove_reader program.  It is also run AFTER a sequential
+ *              (not concurrent!) invoking of swmr_writer so the writer
+ *              can dump a bunch of data into the datasets.  Otherwise,
+ *              there wouldn't be much to shrink :)
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/***********/
+/* Headers */
+/***********/
+
+#include <assert.h>
+#include <sys/time.h>
+
+#include "swmr_common.h"
+
+/****************/
+/* Local Macros */
+/****************/
+
+/* The maximum number of records to remove in one step */
+#define MAX_REMOVE_SIZE     10
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static hid_t open_skeleton(const char *filename, unsigned verbose, unsigned old);
+static int remove_records(hid_t fid, unsigned verbose, unsigned long nshrinks,
+    unsigned long flush_count);
+static void usage(void);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    open_skeleton
+ *
+ * Purpose:     Opens the SWMR HDF5 file and datasets.
+ *
+ * Parameters:  const char *filename
+ *              The filename of the SWMR HDF5 file to open
+ *
+ *              unsigned verbose
+ *              Whether or not to emit verbose console messages
+ *
+ * Return:      Success:    The file ID of the opened SWMR file
+ *                          The dataset IDs are stored in a global array
+ *
+ *              Failure:    -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static hid_t
+open_skeleton(const char *filename, unsigned verbose, unsigned old)
+{
+    hid_t fid;          /* File ID for new HDF5 file */
+    hid_t fapl;         /* File access property list */
+    hid_t sid;          /* Dataspace ID */
+    hsize_t dim[2];     /* Dataspace dimensions */
+    unsigned u, v;      /* Local index variable */
+
+    assert(filename);
+
+    /* Create file access property list */
+    if((fapl = h5_fileaccess()) < 0)
+        return -1;
+
+    if(!old) {
+	/* Set to use the latest library format */
+	if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+	    return -1;
+    }
+
+#ifdef QAK
+/* Increase the initial size of the metadata cache */
+    {
+        H5AC_cache_config_t mdc_config;
+
+        mdc_config.version = H5AC__CURR_CACHE_CONFIG_VERSION;
+        H5Pget_mdc_config(fapl, &mdc_config);
+        fprintf(stderr, "mdc_config.initial_size = %lu\n", (unsigned long)mdc_config.initial_size);
+        fprintf(stderr, "mdc_config.epoch_length = %lu\n", (unsigned long)mdc_config.epoch_length);
+        mdc_config.set_initial_size = 1;
+        mdc_config.initial_size = 16 * 1024 * 1024;
+        /* mdc_config.epoch_length = 5000; */
+        H5Pset_mdc_config(fapl, &mdc_config);
+    }
+#endif /* QAK */
+
+#ifdef QAK
+    H5Pset_fapl_log(fapl, "append.log", H5FD_LOG_ALL, (size_t)(512 * 1024 * 1024));
+#endif /* QAK */
+
+    /* Open the file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR | H5F_ACC_SWMR_WRITE, fapl)) < 0)
+        return -1;
+
+    /* Close file access property list */
+    if(H5Pclose(fapl) < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Opening datasets\n");
+
+    /* Open the datasets */
+    for(u = 0; u < NLEVELS; u++)
+        for(v = 0; v < symbol_count[u]; v++) {
+            if((symbol_info[u][v].dsid = H5Dopen2(fid, symbol_info[u][v].name, H5P_DEFAULT)) < 0)
+                return -1;
+            if((sid = H5Dget_space(symbol_info[u][v].dsid)) < 0)
+                return -1;
+            if(2 != H5Sget_simple_extent_ndims(sid))
+                return -1;
+            if(H5Sget_simple_extent_dims(sid, dim, NULL) < 0)
+                return -1;
+            symbol_info[u][v].nrecords = dim[1];
+        } /* end for */
+
+    return fid;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    remove_records
+ *
+ * Purpose:     Removes a specified number of records from random datasets in
+ *              the SWMR test file.
+ *
+ * Parameters:  hid_t fid
+ *              The file ID of the SWMR HDF5 file
+ *
+ *              unsigned verbose
+ *              Whether or not to emit verbose console messages
+ *
+ *              unsigned long nshrinks
+ *              # of records to remove from the datasets
+ *
+ *              unsigned long flush_count
+ *              # of records to write before flushing the file to disk
+ *
+ * Return:      Success:    0
+ *              Failure:    -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+remove_records(hid_t fid, unsigned verbose, unsigned long nshrinks, unsigned long flush_count)
+{
+    unsigned long shrink_to_flush;      /* # of removals before flush */
+    hsize_t dim[2] = {1,0};             /* Dataspace dimensions */
+    unsigned long u, v;                 /* Local index variables */
+
+    assert(fid >= 0);
+
+    /* Remove records from random datasets, according to frequency distribution */
+    shrink_to_flush = flush_count;
+    for(u = 0; u < nshrinks; u++) {
+        symbol_info_t *symbol;  /* Symbol to remove record from */
+        hsize_t remove_size;    /* Size to reduce dataset dimension by */
+
+        /* Get a random dataset, according to the symbol distribution */
+        symbol = choose_dataset();
+
+        /* Shrink the dataset's dataspace */
+        remove_size = (hsize_t)random() % MAX_REMOVE_SIZE + 1;
+        if(remove_size > symbol->nrecords)
+            symbol->nrecords = 0;
+        else
+            symbol->nrecords -= remove_size;
+            dim[1] = symbol->nrecords;
+        if(H5Dset_extent(symbol->dsid, dim) < 0)
+            return -1;
+
+        /* Check for flushing file */
+        if(flush_count > 0) {
+            /* Decrement count of records to write before flushing */
+            shrink_to_flush--;
+
+            /* Check for counter being reached */
+            if(0 == shrink_to_flush) {
+                /* Flush contents of file */
+                if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+                    return -1;
+
+                /* Reset flush counter */
+                shrink_to_flush = flush_count;
+            } /* end if */
+        } /* end if */
+    } /* end for */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Closing datasets\n");
+
+    /* Close the datasets */
+    for(u = 0; u < NLEVELS; u++)
+        for(v = 0; v < symbol_count[u]; v++)
+            if(H5Dclose(symbol_info[u][v].dsid) < 0)
+                return -1;
+
+    return 0;
+}
+
+static void
+usage(void)
+{
+    printf("\n");
+    printf("Usage error!\n");
+    printf("\n");
+    printf("Usage: swmr_remove_writer [-q] [-o] [-f <# of shrinks between flushing\n");
+    printf("    file contents>] [-r <random seed>] <# of shrinks>\n");
+    printf("\n");
+    printf("<# of shrinks between flushing file contents> should be 0 (for no\n");
+    printf("flushing) or between 1 and (<# of shrinks> - 1)\n");
+    printf("\n");
+    printf("Defaults to verbose (no '-q' given), latest format when opening file (no '-o' given),\n");
+    printf("flushing every 1000 shrinks ('-f 1000'), and will generate a random seed (no -r given).\n");
+    printf("\n");
+    exit(1);
+}
+
+int main(int argc, const char *argv[])
+{
+    hid_t fid;                  /* File ID for file opened */
+    long nshrinks = 0;          /* # of times to shrink the dataset */
+    long flush_count = 1000;    /* # of records to write between flushing file */
+    unsigned verbose = 1;       /* Whether to emit some informational messages */
+    unsigned old = 0;       	/* Whether to use non-latest-format when opening file */
+    unsigned use_seed = 0;      /* Set to 1 if a seed was set on the command line */
+    unsigned random_seed = 0;   /* Random # seed */
+    unsigned u;                 /* Local index variable */
+    int temp;
+
+    /* Parse command line options */
+    if(argc < 2)
+        usage();
+    if(argc > 1) {
+        u = 1;
+        while(u < (unsigned)argc) {
+            if(argv[u][0] == '-') {
+                switch(argv[u][1]) {
+                    /* # of records to write between flushing file */
+                    case 'f':
+                        flush_count = atol(argv[u + 1]);
+                        if(flush_count < 0)
+                            usage();
+                        u += 2;
+                        break;
+
+                    /* Be quiet */
+                    case 'q':
+                        verbose = 0;
+                        u++;
+                        break;
+                    
+                    /* Random # seed */
+                    case 'r':
+                        use_seed = 1;
+                        temp = atoi(argv[u + 1]);
+                        random_seed = (unsigned)temp;
+                        u += 2;
+                        break;
+
+		    /* Use non-latest-format when opening file */
+                    case 'o':
+			old = 1;
+			u++;
+			break;
+
+                    default:
+                        usage();
+                        break;
+                } /* end switch */
+            } /* end if */
+            else {
+                /* Get the number of records to append */
+                nshrinks = atol(argv[u]);
+                if(nshrinks <= 0)
+                    usage();
+
+                u++;
+            } /* end else */
+        } /* end while */
+    } /* end if */
+    if(nshrinks <= 0)
+        usage();
+    if(flush_count >= nshrinks)
+        usage();
+
+    /* Emit informational message */
+    if(verbose) {
+        fprintf(stderr, "Parameters:\n");
+        fprintf(stderr, "\t# of shrinks between flushes = %ld\n", flush_count);
+        fprintf(stderr, "\t# of shrinks = %ld\n", nshrinks);
+    } /* end if */
+
+    /* Set the random seed */
+    if(0 == use_seed) {
+        struct timeval t;
+        gettimeofday(&t, NULL);
+        random_seed = (unsigned)(t.tv_usec);
+    } /* end if */
+    srandom(random_seed);
+    /* ALWAYS emit the random seed for possible debugging */
+    fprintf(stderr, "Using writer random seed: %u\n", random_seed);
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Generating symbol names\n");
+
+    /* Generate dataset names */
+    if(generate_symbols() < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Opening skeleton file: %s\n", FILENAME);
+
+    /* Open file skeleton */
+    if((fid = open_skeleton(FILENAME, verbose, old)) < 0) {
+        fprintf(stderr, "Error opening skeleton file!\n");
+        exit(1);
+    } /* end if */
+
+    /* Send a message to indicate "H5Fopen" is complete--releasing the file lock */
+    h5_send_message(WRITER_MESSAGE);
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Removing records\n");
+
+    /* Remove records from datasets */
+    if(remove_records(fid, verbose, (unsigned long)nshrinks, (unsigned long)flush_count) < 0) {
+        fprintf(stderr, "Error removing records from datasets!\n");
+        exit(1);
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Releasing symbols\n");
+
+    /* Clean up the symbols */
+    if(shutdown_symbols() < 0) {
+        fprintf(stderr, "Error releasing symbols!\n");
+        exit(1);
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Closing objects\n");
+
+    /* Close objects opened */
+    if(H5Fclose(fid) < 0) {
+        fprintf(stderr, "Error closing file!\n");
+        exit(1);
+    } /* end if */
+
+    return 0;
+}
diff --git a/test/swmr_sparse_reader.c b/test/swmr_sparse_reader.c
new file mode 100644
index 0000000..c7841a9
--- /dev/null
+++ b/test/swmr_sparse_reader.c
@@ -0,0 +1,451 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     swmr_sparse_reader.c
+ *
+ * Purpose:     Reads data from a randomly selected subset of the datasets
+ *              in the SWMR test file.  Unlike the regular reader, these
+ *              datasets will be shrinking.
+ *
+ *              This program is intended to run concurrently with the
+ *              swmr_sparse_writer program.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/***********/
+/* Headers */
+/***********/
+
+#include <assert.h>
+#include "swmr_common.h"
+
+#include <unistd.h>
+
+/****************/
+/* Local Macros */
+/****************/
+
+#define TIMEOUT 300
+
+/*******************/
+/* Local Variables */
+/*******************/
+
+static hid_t symbol_tid = (-1);
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static int check_dataset(hid_t fid, unsigned verbose, const symbol_info_t *symbol,
+    symbol_t *record, hid_t rec_sid);
+static int read_records(const char *filename, unsigned verbose, unsigned long nrecords,
+    unsigned poll_time, unsigned reopen_count);
+static void usage(void);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    check_dataset
+ *
+ * Purpose:     For a given dataset, checks to make sure that the stated
+ *              and actual sizes are the same.  If they are not, then
+ *              we have an inconsistent dataset due to a SWMR error.
+ *
+ * Parameters:  hid_t fid
+ *              The SWMR test file's ID.
+ *
+ *              unsigned verbose
+ *              Whether verbose console output is desired.
+ *
+ *              const symbol_info_t *symbol
+ *              The dataset from which to read (the ID is in the struct).
+ *              Must be pre-allocated.
+ *
+ *              symbol_t *record
+ *              Memory for the record.  Must be pre-allocated.
+ *
+ *              hid_t rec_sid
+ *              The memory dataspace for access.  It's always the same so
+ *              there is no need to re-create it every time this function
+ *              is called.
+ *
+ * Return:      Success:    0
+ *              Failure:    -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+check_dataset(hid_t fid, unsigned verbose, const symbol_info_t *symbol, symbol_t *record,
+    hid_t rec_sid)
+{
+    hid_t dsid;                 /* Dataset ID */
+    hid_t file_sid;             /* Dataset's space ID */
+    hsize_t start[2] = {0, 0};  /* Hyperslab selection values */
+    hsize_t count[2] = {1, 1};  /* Hyperslab selection values */
+
+    assert(fid >= 0);
+    assert(symbol);
+    assert(record);
+    assert(rec_sid >= 0);
+
+    /* Open dataset for symbol */
+    if((dsid = H5Dopen2(fid, symbol->name, H5P_DEFAULT)) < 0)
+        return -1;
+
+    /* Get the dataset's dataspace */
+    if((file_sid = H5Dget_space(dsid)) < 0)
+        return -1;
+
+    /* Choose the random record in the dataset (will be the same as chosen by
+     * the writer) */
+    start[1] = (hsize_t)random() % symbol->nrecords;
+    if(H5Sselect_hyperslab(file_sid, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Symbol = '%s', location = %lld\n", symbol->name, (long long)start);
+
+    /* Read record from dataset */
+    record->rec_id = (uint64_t)ULLONG_MAX;
+    if(H5Dread(dsid, symbol_tid, rec_sid, file_sid, H5P_DEFAULT, record) < 0)
+        return -1;
+
+    /* Verify record value */
+    if(record->rec_id != start[1]) {
+        fprintf(stderr, "*** ERROR ***\n");
+        fprintf(stderr, "Incorrect record value!\n");
+        fprintf(stderr, "Symbol = '%s', location = %lld, record->rec_id = %llu\n", symbol->name, (long long)start, (unsigned long long)record->rec_id);
+        return(-1);
+    } /* end if */
+
+    /* Close the dataset's dataspace */
+    if(H5Sclose(file_sid) < 0)
+        return -1;
+
+    /* Close dataset for symbol */
+    if(H5Dclose(dsid) < 0)
+        return -1;
+
+    return 0;
+} /* end check_dataset() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    read_records
+ *
+ * Purpose:     For a given dataset, checks to make sure that the stated
+ *              and actual sizes are the same.  If they are not, then
+ *              we have an inconsistent dataset due to a SWMR error.
+ *
+ * Parameters:  const char *filename
+ *              The SWMR test file's name.
+ *
+ *              unsigned verbose
+ *              Whether verbose console output is desired.
+ *
+ *              unsigned long nrecords
+ *              The total number of records to read.
+ *
+ *              unsigned poll_time
+ *              The amount of time to sleep (s).
+ *
+ *              unsigned reopen_count
+ *              
+ *
+ * Return:      Success:    0
+ *              Failure:    -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+read_records(const char *filename, unsigned verbose, unsigned long nrecords,
+    unsigned poll_time, unsigned reopen_count)
+{
+    hid_t fid;                  /* File ID */
+    hid_t aid;                  /* Attribute ID */
+    time_t start_time;          /* Starting time */
+    hid_t mem_sid;              /* Memory dataspace ID */
+    symbol_t record;            /* The record to add to the dataset */
+    unsigned seed;              /* Seed for random number generator */
+    unsigned iter_to_reopen = reopen_count; /* # of iterations until reopen */
+    unsigned long u;            /* Local index variable */
+    hid_t fapl;
+
+    assert(filename);
+    assert(poll_time != 0);
+    
+    /* Create file access property list */
+    if((fapl = h5_fileaccess()) < 0)
+        return -1;
+
+    H5Pset_fclose_degree(fapl, H5F_CLOSE_SEMI);
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Opening file: %s\n", filename);
+
+    /* Open the file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDONLY | H5F_ACC_SWMR_READ, fapl)) < 0)
+        return -1;
+
+    /* Seed the random number generator with the attribute in the file */
+    if((aid = H5Aopen(fid, "seed", H5P_DEFAULT)) < 0)
+        return -1;
+    if(H5Aread(aid, H5T_NATIVE_UINT, &seed) < 0)
+        return -1;
+    if(H5Aclose(aid) < 0)
+        return -1;
+    srandom(seed);
+
+    /* Reset the record */
+    /* (record's 'info' field might need to change for each record written, also) */
+    memset(&record, 0, sizeof(record));
+
+    /* Create a dataspace for the record to read */
+    if((mem_sid = H5Screate(H5S_SCALAR)) < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Reading records\n");
+
+    /* Get the starting time */
+    start_time = time(NULL);
+
+    /* Read records */
+    for(u = 0; u < nrecords; u++) {
+        symbol_info_t *symbol = NULL;   /* Symbol (dataset) */
+        htri_t attr_exists;             /* Whether the sequence number attribute exists */
+        unsigned long file_u;           /* Attribute sequence number (writer's "u") */
+
+        /* Get a random dataset, according to the symbol distribution */
+        symbol = choose_dataset();
+
+        /* Fill in "nrecords" field.  Note that this depends on the writer
+         * using the same algorithm and "nrecords" */
+        symbol->nrecords = nrecords / 5;
+
+        /* Wait until we can read the dataset */
+        do {
+            /* Check if sequence attribute exists */
+            if((attr_exists = H5Aexists_by_name(fid, symbol->name, "seq", H5P_DEFAULT)) < 0)
+                return -1;
+
+            if(attr_exists) {
+                /* Read sequence number attribute */
+                if((aid = H5Aopen_by_name(fid, symbol->name, "seq", H5P_DEFAULT, H5P_DEFAULT)) < 0)
+                    return -1;
+                if(H5Aread(aid, H5T_NATIVE_ULONG, &file_u) < 0)
+                    return -1;
+                if(H5Aclose(aid) < 0)
+                    return -1;
+
+                /* Check if sequence number is at least u - if so, this should
+                 * guarantee that this record has been written */
+                if(file_u >= u)
+                    break;
+            } /* end if */
+
+            /* Check for timeout */
+            if(time(NULL) >= (time_t)(start_time + (time_t)TIMEOUT)) {
+                fprintf(stderr, "Reader timed out\n");
+                return -1;
+            } /* end if */
+
+            /* Pause */
+            sleep(poll_time);
+
+	    /* Retrieve and print the collection of metadata read retries */
+	    if(print_metadata_retries_info(fid) < 0)
+		fprintf(stderr, "Warning: could not obtain metadata retries info\n");
+
+            /* Reopen the file */
+            if(H5Fclose(fid) < 0)
+                return -1;
+            if((fid = H5Fopen(filename, H5F_ACC_RDONLY | H5F_ACC_SWMR_READ, fapl)) < 0)
+                return -1;
+            iter_to_reopen = reopen_count;
+        } while(1);
+
+        /* Emit informational message */
+        if(verbose)
+            fprintf(stderr, "Checking dataset %lu\n", u);
+
+        /* Check dataset */
+        if(check_dataset(fid, verbose, symbol, &record, mem_sid) < 0)
+            return -1;
+        memset(&record, 0, sizeof(record));
+
+        /* Check for reopen */
+        iter_to_reopen--;
+        if(iter_to_reopen == 0) {
+            /* Emit informational message */
+            if(verbose)
+                fprintf(stderr, "Reopening file: %s\n", filename);
+
+	    /* Retrieve and print the collection of metadata read retries */
+	    if(print_metadata_retries_info(fid) < 0)
+		fprintf(stderr, "Warning: could not obtain metadata retries info\n");
+
+            /* Reopen the file */
+            if(H5Fclose(fid) < 0)
+                return -1;
+            if((fid = H5Fopen(filename, H5F_ACC_RDONLY | H5F_ACC_SWMR_READ, fapl)) < 0)
+                return -1;
+            iter_to_reopen = reopen_count;
+        } /* end if */
+    } /* end while */
+
+    /* Retrieve and print the collection of metadata read retries */
+    if(print_metadata_retries_info(fid) < 0)
+	fprintf(stderr, "Warning: could not obtain metadata retries info\n");
+
+    /* Close file */
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    /* Close the memory dataspace */
+    if(H5Sclose(mem_sid) < 0)
+        return -1;
+
+    return 0;
+} /* end read_records() */
+
+static void
+usage(void)
+{
+    printf("\n");
+    printf("Usage error!\n");
+    printf("\n");
+    printf("Usage: swmr_sparse_reader [-q] [-s <# of seconds to wait for writer>]\n");
+    printf("    [-n <# of reads between reopens>] <# of records>\n");
+    printf("\n");
+    printf("Defaults to verbose (no '-q' given), 1 second wait ('-s 1') and 1 read\n");
+    printf("between reopens ('-r 1')\n");
+    printf("\n");
+    printf("Note that the # of records *must* be the same as that supplied to\n");
+    printf("swmr_sparse_writer\n");
+    printf("\n");
+    exit(1);
+} /* end usage() */
+
+int main(int argc, const char *argv[])
+{
+    long nrecords = 0;      /* # of records to read */
+    int poll_time = 1;      /* # of seconds to sleep when waiting for writer */
+    int reopen_count = 1;   /* # of reads between reopens */
+    unsigned verbose = 1;   /* Whether to emit some informational messages */
+    unsigned u;             /* Local index variables */
+
+    /* Parse command line options */
+    if(argc < 2)
+        usage();
+    if(argc > 1) {
+        u = 1;
+        while(u < (unsigned)argc) {
+            if(argv[u][0] == '-') {
+                switch(argv[u][1]) {
+                    /* # of reads between reopens */
+                    case 'n':
+                        reopen_count = atoi(argv[u + 1]);
+                        if(reopen_count < 0)
+                            usage();
+                        u += 2;
+                        break;
+
+                    /* Be quiet */
+                    case 'q':
+                        verbose = 0;
+                        u++;
+                        break;
+
+                    /* # of seconds between polling */
+                    case 's':
+                        poll_time = atoi(argv[u + 1]);
+                        if(poll_time < 0)
+                            usage();
+                        u += 2;
+                        break;
+
+                    default:
+                        usage();
+                        break;
+                } /* end switch */
+            } /* end if */
+            else {
+                /* Get the number of records to read */
+                nrecords = atol(argv[u]);
+                if(nrecords <= 0)
+                    usage();
+
+                u++;
+            } /* end else */
+        } /* end while */
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose) {
+        fprintf(stderr, "Parameters:\n");
+        fprintf(stderr, "\t# of seconds between polling = %d\n", poll_time);
+        fprintf(stderr, "\t# of reads between reopens = %d\n", reopen_count);
+        fprintf(stderr, "\t# of records to read = %ld\n", nrecords);
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Generating symbol names\n");
+
+    /* Generate dataset names */
+    if(generate_symbols() < 0) {
+        fprintf(stderr, "Error generating symbol names!\n");
+        exit(1);
+    } /* end if */
+
+    /* Create datatype for creating datasets */
+    if((symbol_tid = create_symbol_datatype()) < 0)
+        return -1;
+
+    /* Reading records from datasets */
+    if(read_records(FILENAME, verbose, (unsigned long) nrecords, (unsigned)poll_time, (unsigned)reopen_count) < 0) {
+        fprintf(stderr, "Error reading records from datasets!\n");
+        exit(1);
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Releasing symbols\n");
+
+    /* Clean up the symbols */
+    if(shutdown_symbols() < 0) {
+        fprintf(stderr, "Error releasing symbols!\n");
+        exit(1);
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Closing objects\n");
+
+    /* Close objects created */
+    if(H5Tclose(symbol_tid) < 0) {
+        fprintf(stderr, "Error closing symbol datatype!\n");
+        exit(1);
+    } /* end if */
+
+    return 0;
+}
diff --git a/test/swmr_sparse_writer.c b/test/swmr_sparse_writer.c
new file mode 100644
index 0000000..e752cb3
--- /dev/null
+++ b/test/swmr_sparse_writer.c
@@ -0,0 +1,460 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+ /*-------------------------------------------------------------------------
+ *
+ * Created:     swmr_sparse_writer.c
+ *
+ * Purpose:     Writes data to a randomly selected subset of the datasets
+ *              in the SWMR test file.
+ *
+ *              This program is intended to run concurrently with the
+ *              swmr_sparse_reader program.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/***********/
+/* Headers */
+/***********/
+
+#include <assert.h>
+
+#include "swmr_common.h"
+
+/****************/
+/* Local Macros */
+/****************/
+
+#ifdef OUT
+#define BUSY_WAIT 100000
+#endif /* OUT */
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static hid_t open_skeleton(const char *filename, unsigned verbose);
+static int add_records(hid_t fid, unsigned verbose, unsigned long nrecords,
+    unsigned long flush_count);
+static void usage(void);
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    open_skeleton
+ *
+ * Purpose:     Opens the SWMR HDF5 file and datasets.
+ *
+ * Parameters:  const char *filename
+ *              The filename of the SWMR HDF5 file to open
+ *
+ *              unsigned verbose
+ *              Whether or not to emit verbose console messages
+ *
+ * Return:      Success:    The file ID of the opened SWMR file
+ *                          The dataset IDs are stored in a global array
+ *
+ *              Failure:    -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static hid_t
+open_skeleton(const char *filename, unsigned verbose)
+{
+    hid_t fid;          /* File ID for new HDF5 file */
+    hid_t fapl;         /* File access property list */
+    hid_t aid;          /* Attribute ID */
+    unsigned seed;      /* Seed for random number generator */
+    unsigned u, v;      /* Local index variable */
+
+    assert(filename);
+
+    /* Create file access property list */
+    if((fapl = h5_fileaccess()) < 0)
+        return -1;
+
+    /* Set to use the latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        return -1;
+
+#ifdef QAK
+    /* Increase the initial size of the metadata cache */
+    {
+        H5AC_cache_config_t mdc_config;
+
+        mdc_config.version = H5AC__CURR_CACHE_CONFIG_VERSION;
+        H5Pget_mdc_config(fapl, &mdc_config);
+        fprintf(stderr, "mdc_config.initial_size = %lu\n", (unsigned long)mdc_config.initial_size);
+        fprintf(stderr,"mdc_config.epoch_length = %lu\n", (unsigned long)mdc_config.epoch_length);
+        mdc_config.set_initial_size = 1;
+        mdc_config.initial_size = 16 * 1024 * 1024;
+        /* mdc_config.epoch_length = 5000; */
+        H5Pset_mdc_config(fapl, &mdc_config);
+    }
+#endif /* QAK */
+
+#ifdef QAK
+    H5Pset_fapl_log(fapl, "append.log", H5FD_LOG_ALL, (size_t)(512 * 1024 * 1024));
+#endif /* QAK */
+
+    /* Open the file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR | H5F_ACC_SWMR_WRITE, fapl)) < 0)
+        return -1;
+
+    /* Close file access property list */
+    if(H5Pclose(fapl) < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Opening datasets\n");
+
+    /* Seed the random number generator with the attribute in the file */
+    if((aid = H5Aopen(fid, "seed", H5P_DEFAULT)) < 0)
+        return -1;
+    if(H5Aread(aid, H5T_NATIVE_UINT, &seed) < 0)
+        return -1;
+    if(H5Aclose(aid) < 0)
+        return -1;
+    srandom(seed);
+
+    /* Open the datasets */
+    for(u = 0; u < NLEVELS; u++)
+        for(v = 0; v < symbol_count[u]; v++) {
+            if((symbol_info[u][v].dsid = H5Dopen2(fid, symbol_info[u][v].name, H5P_DEFAULT)) < 0)
+                return(-1);
+            symbol_info[u][v].nrecords = 0;
+        } /* end for */
+
+    return fid;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    add_records
+ *
+ * Purpose:     Writes a specified number of records to random datasets in
+ *              the SWMR test file.
+ *
+ * Parameters:  hid_t fid
+ *              The file ID of the SWMR HDF5 file
+ *
+ *              unsigned verbose
+ *              Whether or not to emit verbose console messages
+ *
+ *              unsigned long nrecords
+ *              # of records to write to the datasets
+ *
+ *              unsigned long flush_count
+ *              # of records to write before flushing the file to disk
+ *
+ * Return:      Success:    0
+ *              Failure:    -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+add_records(hid_t fid, unsigned verbose, unsigned long nrecords, unsigned long flush_count)
+{
+    hid_t tid;                          /* Datatype ID for records */
+    hid_t mem_sid;                      /* Memory dataspace ID */
+    hsize_t start[2] = {0, 0};          /* Hyperslab selection values */
+    hsize_t count[2] = {1, 1};          /* Hyperslab selection values */
+    symbol_t record;                    /* The record to add to the dataset */
+    H5AC_cache_config_t mdc_config_orig; /* Original metadata cache configuration */
+    H5AC_cache_config_t mdc_config_cork; /* Corked metadata cache configuration */
+    unsigned long rec_to_flush;         /* # of records left to write before flush */
+    volatile int dummy;                 /* Dummy varialbe for busy sleep */
+    hsize_t dim[2] = {1,0};             /* Dataspace dimensions */
+    unsigned long u, v;                 /* Local index variables */
+
+    assert(fid >= 0);
+
+    /* Reset the record */
+    /* (record's 'info' field might need to change for each record written, also) */
+    memset(&record, 0, sizeof(record));
+
+    /* Create a dataspace for the record to add */
+    if((mem_sid = H5Screate(H5S_SCALAR)) < 0)
+        return -1;
+
+    /* Create datatype for appending records */
+    if((tid = create_symbol_datatype()) < 0)
+        return -1;
+
+    /* Get the current metadata cache configuration, and set up the corked
+     * configuration */
+    mdc_config_orig.version = H5AC__CURR_CACHE_CONFIG_VERSION;
+    if(H5Fget_mdc_config(fid, &mdc_config_orig) < 0)
+        return -1;
+    memcpy(&mdc_config_cork, &mdc_config_orig, sizeof(mdc_config_cork));
+    mdc_config_cork.evictions_enabled = FALSE;
+    mdc_config_cork.incr_mode = H5C_incr__off;
+    mdc_config_cork.flash_incr_mode = H5C_flash_incr__off;
+    mdc_config_cork.decr_mode = H5C_decr__off;
+
+    /* Add records to random datasets, according to frequency distribution */
+    rec_to_flush = flush_count;
+    for(u = 0; u < nrecords; u++) {
+        symbol_info_t *symbol;  /* Symbol to write record to */
+        hid_t file_sid;         /* Dataset's space ID */
+        hid_t aid;              /* Attribute ID */
+
+        /* Get a random dataset, according to the symbol distribution */
+        symbol = choose_dataset();
+
+        /* Cork the metadata cache, to prevent the object header from being
+         * flushed before the data has been written */
+        /*if(H5Fset_mdc_config(fid, &mdc_config_cork) < 0)
+            return(-1);*/
+
+        /* If this is the first time the dataset has been opened, extend it and
+         * add the sequence attribute */
+        if(symbol->nrecords == 0) {
+            symbol->nrecords = nrecords / 5;
+            dim[1] = symbol->nrecords;
+
+            if(H5Dset_extent(symbol->dsid, dim) < 0)
+                return -1;
+
+            if((file_sid = H5Screate(H5S_SCALAR)) < 0)
+                return -1;
+            if((aid = H5Acreate2(symbol->dsid, "seq", H5T_NATIVE_ULONG, file_sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+                return -1;
+            if(H5Sclose(file_sid) < 0)
+                return -1;
+        } /* end if */
+        else if((aid = H5Aopen(symbol->dsid, "seq", H5P_DEFAULT)) < 0)
+            return -1;
+
+        /* Get the coordinate to write */
+        start[1] = (hsize_t)random() % symbol->nrecords;
+
+        /* Set the record's ID (equal to its position) */
+        record.rec_id = start[1];
+
+        /* Get the dataset's dataspace */
+        if((file_sid = H5Dget_space(symbol->dsid)) < 0)
+            return -1;
+
+        /* Choose a random record in the dataset */
+        if(H5Sselect_hyperslab(file_sid, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+            return -1;
+
+        /* Write record to the dataset */
+        if(H5Dwrite(symbol->dsid, tid, mem_sid, file_sid, H5P_DEFAULT, &record) < 0)
+            return -1;
+
+        /* Write the sequence number attribute.  Since we synchronize the random
+         * number seed, the readers will always generate the same sequence of
+         * randomly chosen datasets and offsets.  Therefore, and because of the
+         * flush dependencies on the object header, the reader will be
+         * guaranteed to see the written data if the sequence attribute is >=u.
+         */
+        if(H5Awrite(aid, H5T_NATIVE_ULONG, &u) < 0)
+            return -1;
+
+        /* Close the attribute */
+        if(H5Aclose(aid) < 0)
+            return -1;
+
+        /* Uncork the metadata cache */
+        /*if(H5Fset_mdc_config(fid, &mdc_config_orig) < 0)
+            return(-1);*/
+
+        /* Close the dataset's dataspace */
+        if(H5Sclose(file_sid) < 0)
+            return -1;
+
+        /* Check for flushing file */
+        if(flush_count > 0) {
+            /* Decrement count of records to write before flushing */
+            rec_to_flush--;
+
+            /* Check for counter being reached */
+            if(0 == rec_to_flush) {
+                /* Flush contents of file */
+                if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+                    return -1;
+
+                /* Reset flush counter */
+                rec_to_flush = flush_count;
+            } /* end if */
+        } /* end if */
+
+#ifdef OUT
+        /* Busy wait, to let readers catch up */
+        /* If this is removed, also remove the BUSY_WAIT symbol
+         * at the top of the file.
+         */
+        dummy = 0;
+        for(v=0; v<BUSY_WAIT; v++)
+            dummy++;
+        if((unsigned long)dummy != v)
+            return -1;
+#endif /* OUT */
+
+    } /* end for */
+
+    /* Close the memory dataspace */
+    if(H5Sclose(mem_sid) < 0)
+        return -1;
+
+    /* Close the datatype */
+    if(H5Tclose(tid) < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Closing datasets\n");
+
+    /* Close the datasets */
+    for(u = 0; u < NLEVELS; u++)
+        for(v = 0; v < symbol_count[u]; v++)
+            if(H5Dclose(symbol_info[u][v].dsid) < 0)
+                return -1;
+
+    return 0;
+}
+
+static void
+usage(void)
+{
+    printf("\n");
+    printf("Usage error!\n");
+    printf("\n");
+    printf("Usage: swmr_sparse_writer [-q] [-f <# of records to write between\n");
+    printf("    flushing file contents>] <# of records>\n");
+    printf("\n");
+    printf("<# of records to write between flushing file contents> should be 0\n");
+    printf("(for no flushing) or between 1 and (<# of records> - 1)\n");
+    printf("\n");
+    printf("Defaults to verbose (no '-q' given) and flushing every 1000 records\n");
+    printf("('-f 1000')\n");
+    printf("\n");
+    exit(1);
+}
+
+int main(int argc, const char *argv[])
+{
+    hid_t fid;                  /* File ID for file opened */
+    long nrecords = 0;          /* # of records to append */
+    long flush_count = 1000;    /* # of records to write between flushing file */
+    unsigned verbose = 1;       /* Whether to emit some informational messages */
+    unsigned u;                 /* Local index variable */
+
+    /* Parse command line options */
+    if(argc < 2)
+        usage();
+    if(argc > 1) {
+        u = 1;
+        while(u < (unsigned)argc) {
+            if(argv[u][0] == '-') {
+                switch(argv[u][1]) {
+                    /* # of records to write between flushing file */
+                    case 'f':
+                        flush_count = atol(argv[u + 1]);
+                        if(flush_count < 0)
+                            usage();
+                        u += 2;
+                        break;
+
+                    /* Be quiet */
+                    case 'q':
+                        verbose = 0;
+                        u++;
+                        break;
+
+                    default:
+                        usage();
+                        break;
+                } /* end switch */
+            } /* end if */
+            else {
+                /* Get the number of records to append */
+                nrecords = atol(argv[u]);
+                if(nrecords <= 0)
+                    usage();
+
+                u++;
+            } /* end else */
+        } /* end while */
+    } /* end if */
+    if(nrecords <= 0)
+        usage();
+    if(flush_count >= nrecords)
+        usage();
+
+    /* Emit informational message */
+    if(verbose) {
+        fprintf(stderr, "Parameters:\n");
+        fprintf(stderr, "\t# of records between flushes = %ld\n", flush_count);
+        fprintf(stderr, "\t# of records to write = %ld\n", nrecords);
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Generating symbol names\n");
+
+    /* Generate dataset names */
+    if(generate_symbols() < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Opening skeleton file: %s\n", FILENAME);
+
+    /* Open file skeleton */
+    if((fid = open_skeleton(FILENAME, verbose)) < 0) {
+        fprintf(stderr, "Error opening skeleton file!\n");
+        exit(1);
+    } /* end if */
+
+    /* Send a message to indicate "H5Fopen" is complete--releasing the file lock */
+    h5_send_message(WRITER_MESSAGE);
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Adding records\n");
+
+    /* Append records to datasets */
+    if(add_records(fid, verbose, (unsigned long)nrecords, (unsigned long)flush_count) < 0) {
+        fprintf(stderr, "Error appending records to datasets!\n");
+        exit(1);
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Releasing symbols\n");
+
+    /* Clean up the symbols */
+    if(shutdown_symbols() < 0) {
+        fprintf(stderr, "Error releasing symbols!\n");
+        exit(1);
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Closing objects\n");
+
+    /* Close objects opened */
+    if(H5Fclose(fid) < 0) {
+        fprintf(stderr, "Error closing file!\n");
+        exit(1);
+    } /* end if */
+
+    return 0;
+}
diff --git a/test/swmr_start_write.c b/test/swmr_start_write.c
new file mode 100644
index 0000000..0069bc7
--- /dev/null
+++ b/test/swmr_start_write.c
@@ -0,0 +1,739 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     swmr_start_write.c
+ *
+ * Purpose:     This program enables SWMR writing mode via H5Fstart_swmr_write().
+ *		It writes data to a randomly selected subset of the datasets
+ *              in the SWMR test file; and it is intended to run concurrently
+ *              with the swmr_reader program.
+ *
+ * NOTE: The routines in this program are basically copied and modified from
+ *	 swmr*.c.
+ *-------------------------------------------------------------------------
+ */
+
+/***********/
+/* Headers */
+/***********/
+
+#include <assert.h>
+#include <sys/time.h>
+
+#include "swmr_common.h"
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static hid_t create_file(const char *filename, unsigned verbose,
+    const char *index_type, unsigned random_seed);
+static int create_datasets(hid_t fid, int comp_level, unsigned verbose);
+static int create_close_datasets(hid_t fid, int comp_level, unsigned verbose);
+static int open_datasets(hid_t fid, unsigned verbose);
+static hid_t open_file(const char *filename, unsigned verbose);
+
+static int add_records(hid_t fid, unsigned verbose, unsigned long nrecords,
+    unsigned long flush_count);
+static void usage(void);
+
+#define CHUNK_SIZE      50      /* Chunk size for created datasets */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    create_file
+ *
+ * Purpose:     Creates the HDF5 file (without SWMR access) which
+ *              which will be used for testing H5Fstart_swmr_write().
+ *
+ * Parameters:  
+ *		filename: The SWMR test file's name.
+ *              verbose: whether verbose console output is desired.
+ *              index_type: The chunk index type (b1 | b2 | ea | fa)
+ *		random_seed: The random seed to store in the file.  
+ *			     The sparse tests use this value.
+ *	
+ * Return:      Success:    the file ID
+ *              Failure:     -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static hid_t
+create_file(const char *filename, unsigned verbose,
+    const char *index_type, unsigned random_seed)
+{
+    hid_t fid;          /* File ID for new HDF5 file */
+    hid_t fcpl;         /* File creation property list */
+    hid_t fapl;         /* File access property list */
+    hid_t sid;          /* Dataspace ID */
+    hid_t aid;          /* Attribute ID */
+    hsize_t max_dims[2] = {1, H5S_UNLIMITED}; /* Dataset maximum dimensions */
+#ifdef FILLVAL_WORKS
+    symbol_t fillval;   /* Dataset fill value */
+#endif /* FILLVAL_WORKS */
+
+    assert(filename);
+    assert(index_type);
+
+    /* Create file access property list */
+    if((fapl = h5_fileaccess()) < 0)
+        return -1;
+
+    /* We ALWAYS select the latest file format for SWMR */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        return -1;
+
+    /* There are two chunk indexes tested here.
+     * With one unlimited dimension, we get the extensible array index
+     * type, with two unlimited dimensions, we get a v-2 B-tree.
+     */
+    if(!strcmp(index_type, "b2"))
+        max_dims[0] = H5S_UNLIMITED;
+
+    /* Create file creation property list */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Creating file without SWMR access\n");
+
+    /* Create the file */
+    if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
+        return -1;
+
+    /* Close file creation property list */
+    if(H5Pclose(fcpl) < 0)
+        return -1;
+
+    /* Close file access property list */
+    if(H5Pclose(fapl) < 0)
+        return -1;
+
+    /* Create attribute with (shared) random number seed - for sparse test */
+    if((sid = H5Screate(H5S_SCALAR)) < 0)
+        return -1;
+    if((aid = H5Acreate2(fid, "seed", H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        return -1;
+    if(H5Awrite(aid, H5T_NATIVE_UINT, &random_seed) < 0)
+        return -1;
+    if(H5Sclose(sid) < 0)
+        return -1;
+    if(H5Aclose(aid) < 0)
+        return -1;
+
+    return fid;
+} /* end create_file() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    create_datasets
+ *
+ * Purpose:     Create datasets (and keep them opened) which will be used for testing 
+ *		H5Fstart_swmr_write().
+ *
+ * Parameters:  
+ *		fid: file ID for the SWMR test file
+ *              comp_level: the compresssion level
+ *              verbose: whether verbose console output is desired.
+ *
+ * Return:      Success:    0
+ *              Failure:    -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+create_datasets(hid_t fid, int comp_level, unsigned verbose)
+{
+    hid_t dcpl;         /* Dataset creation property list */
+    hid_t tid;          /* Datatype for dataset elements */
+    hid_t sid;          /* Dataspace ID */
+    hsize_t dims[2] = {1, 0}; /* Dataset starting dimensions */
+    hsize_t max_dims[2] = {1, H5S_UNLIMITED}; /* Dataset maximum dimensions */
+    hsize_t chunk_dims[2] = {1, CHUNK_SIZE}; /* Chunk dimensions */
+    unsigned u, v;      /* Local index variable */
+
+    /* Create datatype for creating datasets */
+    if((tid = create_symbol_datatype()) < 0)
+        return -1;
+
+    /* Create dataspace for creating datasets */
+    if((sid = H5Screate_simple(2, dims, max_dims)) < 0)
+        return -1;
+
+    /* Create dataset creation property list */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        return -1;
+    if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0)
+        return -1;
+    if(comp_level >= 0) {
+        if(H5Pset_deflate(dcpl, (unsigned)comp_level) < 0)
+            return -1;
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Creating datasets\n");
+
+    /* Create the datasets */
+    for(u = 0; u < NLEVELS; u++)
+        for(v = 0; v < symbol_count[u]; v++) {
+
+            if((symbol_info[u][v].dsid = H5Dcreate2(fid, symbol_info[u][v].name, tid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+                return -1;
+            symbol_info[u][v].nrecords = 0;
+
+        } /* end for */
+
+    return 0;
+} /* create_datasets() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    create_close_datasets
+ *
+ * Purpose:     Create and close datasets which will be used for testing 
+ *		H5Fstart_swmr_write().
+ *
+ * Parameters:  
+ *		fid: file ID for the SWMR test file
+ *              comp_level: the compresssion level
+ *              verbose: whether verbose console output is desired.
+ *
+ * Return:      Success:    0
+ *              Failure:    -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+create_close_datasets(hid_t fid, int comp_level, unsigned verbose)
+{
+    hid_t dcpl;         /* Dataset creation property list */
+    hid_t tid;          /* Datatype for dataset elements */
+    hid_t sid;          /* Dataspace ID */
+    hsize_t dims[2] = {1, 0}; /* Dataset starting dimensions */
+    hsize_t max_dims[2] = {1, H5S_UNLIMITED}; /* Dataset maximum dimensions */
+    hsize_t chunk_dims[2] = {1, CHUNK_SIZE}; /* Chunk dimensions */
+    unsigned u, v;      /* Local index variable */
+
+    /* Create datatype for creating datasets */
+    if((tid = create_symbol_datatype()) < 0)
+        return -1;
+
+    /* Create dataspace for creating datasets */
+    if((sid = H5Screate_simple(2, dims, max_dims)) < 0)
+        return -1;
+
+    /* Create dataset creation property list */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        return -1;
+    if(H5Pset_chunk(dcpl, 2, chunk_dims) < 0)
+        return -1;
+    if(comp_level >= 0) {
+        if(H5Pset_deflate(dcpl, (unsigned)comp_level) < 0)
+            return -1;
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Creating datasets\n");
+
+    /* Create the datasets */
+    for(u = 0; u < NLEVELS; u++)
+        for(v = 0; v < symbol_count[u]; v++) {
+            hid_t dsid;         /* Dataset ID */
+            char name_buf[64];
+
+            generate_name(name_buf, u, v);
+            if((dsid = H5Dcreate2(fid, name_buf, tid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+                return -1;
+
+            if(H5Dclose(dsid) < 0)
+                return -1;
+        } /* end for */
+
+    /* Closing */
+    if(H5Pclose(dcpl) < 0)
+        return -1;
+    if(H5Sclose(sid) < 0)
+        return -1;
+    if(H5Tclose(tid) < 0)
+        return -1;
+
+    return 0;
+} /* create_close_datasets() */
+
+
+/*-------------------------------------------------------------------------
+ * Function:    open_file
+ *
+ * Purpose:     Opens the HDF5 test file without SWMR access.
+ *
+ * Parameters:  
+ *		filename: The filename of the HDF5 file to open
+ *              verbose: whether or not to emit verbose console messages
+ *
+ * Return:      Success: The file ID of the opened SWMR file
+ *              Failure: -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static hid_t
+open_file(const char *filename, unsigned verbose)
+{
+    hid_t fid;          /* File ID for new HDF5 file */
+    hid_t fapl;         /* File access property list */
+
+    assert(filename);
+
+    /* Create file access property list */
+    if((fapl = h5_fileaccess()) < 0)
+        return -1;
+
+    /* Set to use the latest library format */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Opening the file without SWMR access: %s\n", filename);
+
+    /* Open the file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        return -1;
+
+    /* Close file access property list */
+    if(H5Pclose(fapl) < 0)
+        return -1;
+
+    return fid;
+} /* Open file() */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:    open_datasets
+ *
+ * Purpose:     Opens the datasets.
+ *
+ * Parameters:  
+*		filename: the filename of the SWMR HDF5 file to open
+ *              verbose: whether or not to emit verbose console messages
+ *
+ * Return:      Success: 0
+ *              Failure: -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+open_datasets(hid_t fid, unsigned verbose)
+{
+    unsigned u, v;      /* Local index variable */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Opening datasets\n");
+
+    /* Open the datasets */
+    for(u = 0; u < NLEVELS; u++)
+        for(v = 0; v < symbol_count[u]; v++) {
+            if((symbol_info[u][v].dsid = H5Dopen2(fid, symbol_info[u][v].name, H5P_DEFAULT)) < 0)
+                return -1;
+            symbol_info[u][v].nrecords = 0;
+        } /* end for */
+
+    return 0;
+} /* open_datasets() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    add_records
+ *
+ * Purpose:     Writes a specified number of records to random datasets in
+ *              the SWMR test file.
+ *
+ * Parameters:  
+*		fid: The file ID of the SWMR HDF5 file
+ *              verbose: Whether or not to emit verbose console messages
+ *              nrecords: # of records to write to the datasets
+ *              flush_count: # of records to write before flushing the file to disk
+ *
+ * Return:      Success: 0
+ *              Failure: -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+add_records(hid_t fid, unsigned verbose, unsigned long nrecords, unsigned long flush_count)
+{
+    hid_t tid;                              /* Datatype ID for records */
+    hid_t mem_sid;                          /* Memory dataspace ID */
+    hsize_t start[2] = {0, 0}, count[2] = {1, 1}; /* Hyperslab selection values */
+    hsize_t dim[2] = {1, 0};                /* Dataspace dimensions */
+    symbol_t record;                        /* The record to add to the dataset */
+    H5AC_cache_config_t mdc_config_orig;    /* Original metadata cache configuration */
+    H5AC_cache_config_t mdc_config_cork;    /* Corked metadata cache configuration */
+    unsigned long rec_to_flush;             /* # of records left to write before flush */
+    unsigned long u, v;                     /* Local index variables */
+
+    assert(fid >= 0);
+
+    /* Reset the record */
+    /* (record's 'info' field might need to change for each record written, also) */
+    memset(&record, 0, sizeof(record));
+
+    /* Create a dataspace for the record to add */
+    if((mem_sid = H5Screate(H5S_SCALAR)) < 0)
+        return -1;
+
+    /* Create datatype for appending records */
+    if((tid = create_symbol_datatype()) < 0)
+        return -1;
+
+    /* Get the current metadata cache configuration, and set up the corked
+     * configuration */
+    mdc_config_orig.version = H5AC__CURR_CACHE_CONFIG_VERSION;
+    if(H5Fget_mdc_config(fid, &mdc_config_orig) < 0)
+        return -1;
+    memcpy(&mdc_config_cork, &mdc_config_orig, sizeof(mdc_config_cork));
+    mdc_config_cork.evictions_enabled = FALSE;
+    mdc_config_cork.incr_mode = H5C_incr__off;
+    mdc_config_cork.flash_incr_mode = H5C_flash_incr__off;
+    mdc_config_cork.decr_mode = H5C_decr__off;
+
+    /* Add records to random datasets, according to frequency distribution */
+    rec_to_flush = flush_count;
+    for(u = 0; u < nrecords; u++) {
+        symbol_info_t *symbol;  /* Symbol to write record to */
+        hid_t file_sid;         /* Dataset's space ID */
+
+        /* Get a random dataset, according to the symbol distribution */
+        symbol = choose_dataset();
+
+        /* Set the record's ID (equal to its position) */
+        record.rec_id = symbol->nrecords;
+
+        /* Get the coordinate to write */
+        start[1] = symbol->nrecords;
+
+        /* Extend the dataset's dataspace to hold the new record */
+        symbol->nrecords++;
+        dim[1] = symbol->nrecords;
+        if(H5Dset_extent(symbol->dsid, dim) < 0)
+            return -1;
+
+        /* Get the dataset's dataspace */
+        if((file_sid = H5Dget_space(symbol->dsid)) < 0)
+            return -1;
+
+        /* Choose the last record in the dataset */
+        if(H5Sselect_hyperslab(file_sid, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+            return -1;
+
+        /* Write record to the dataset */
+        if(H5Dwrite(symbol->dsid, tid, mem_sid, file_sid, H5P_DEFAULT, &record) < 0)
+            return -1;
+
+        /* Close the dataset's dataspace */
+        if(H5Sclose(file_sid) < 0)
+            return -1;
+
+        /* Check for flushing file */
+        if(flush_count > 0) {
+            /* Decrement count of records to write before flushing */
+            rec_to_flush--;
+
+            /* Check for counter being reached */
+            if(0 == rec_to_flush) {
+                /* Flush contents of file */
+                if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+                    return -1;
+
+                /* Reset flush counter */
+                rec_to_flush = flush_count;
+            } /* end if */
+        } /* end if */
+    } /* end for */
+
+    /* Close the memory dataspace */
+    if(H5Sclose(mem_sid) < 0)
+        return -1;
+
+    /* Close the datatype */
+    if(H5Tclose(tid) < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Closing datasets\n");
+
+    /* Close the datasets */
+    for(u = 0; u < NLEVELS; u++)
+        for(v = 0; v < symbol_count[u]; v++)
+            if(H5Dclose(symbol_info[u][v].dsid) < 0)
+                return -1;
+
+    return 0;
+} /* add_records() */
+
+static void
+usage(void)
+{
+    printf("\n");
+    printf("Usage error!\n");
+    printf("\n");
+    printf("Usage: swmr_start_write [-f <# of records to write between flushing file contents>]\n");
+    printf("    [-i <index type>] [-c <deflate compression level>]\n");
+    printf("    [-r <random seed>] [-q] <# of records>\n");
+    printf("\n");
+    printf("<# of records to write between flushing file contents> should be 0\n");
+    printf("(for no flushing) or between 1 and (<# of records> - 1).\n");
+    printf("\n");
+    printf("<index type> should be b2 or ea\n");
+    printf("\n");
+    printf("<deflate compression level> should be -1 (for no compression) or 0-9\n");
+    printf("\n");
+    printf("<# of records> must be specified.\n");
+    printf("\n");
+    printf("Defaults to flushing every 10000 records ('-f 10000'),\n");
+    printf("v1 b-tree indexing (-i b1), compression ('-c -1'),\n");
+    printf("will generate a random seed (no -r given), and verbose (no '-q' given)\n");
+    printf("\n");
+    exit(1);
+} /* usage() */
+
+/*
+ * Can test with different scenarios as below:
+ *	1) create_file(), create_datasets(), H5Fstart_swmr_write(), add_records(), H5Fclose().
+ *	2) create_file(), create_close_datasets(), open_datasets(), H5Fstart_swmr_write(), add_records(), H5Fclose().
+ *	3) create_file(), create_close_datasets(), H5Fclose(),
+ *	   open_file(), open_dataset(), H5Fstart_swmr_write(), add_records(), H5Fclose().
+ */
+int main(int argc, const char *argv[])
+{
+    hid_t fid;                  	/* File ID for file opened */
+    long nrecords = 0;          	/* # of records to append */
+    long flush_count = 10000;   	/* # of records to write between flushing file */
+    unsigned verbose = 1;       	/* Whether to emit some informational messages */
+    unsigned use_seed = 0;      	/* Set to 1 if a seed was set on the command line */
+    unsigned random_seed = 0;   	/* Random # seed */
+    int comp_level = -1;		/* Compression level (-1 is no compression) */
+    const char *index_type = "b1";	/* Chunk index type */
+    unsigned u;                 	/* Local index variable */
+    int temp;				/* Temporary variable */
+
+    /* Parse command line options */
+    if(argc < 2)
+        usage();
+    if(argc > 1) {
+        u = 1;
+        while(u < (unsigned)argc) {
+            if(argv[u][0] == '-') {
+                switch(argv[u][1]) {
+		    /* Compress dataset chunks */
+                    case 'c':
+                        comp_level = atoi(argv[u + 1]);
+                        if(comp_level < -1 || comp_level > 9)
+                            usage();
+                        u += 2;
+                        break;
+
+                    /* Chunk index type */
+                    case 'i':
+                        index_type = argv[u + 1];
+                        if(strcmp(index_type, "ea")
+                                && strcmp(index_type, "b2"))
+                            usage();
+                        u += 2;
+                        break;
+
+                    /* # of records to write between flushing file */
+                    case 'f':
+                        flush_count = atol(argv[u + 1]);
+                        if(flush_count < 0)
+                            usage();
+                        u += 2;
+                        break;
+
+                    /* Be quiet */
+                    case 'q':
+                        verbose = 0;
+                        u++;
+                        break;
+                    
+                    /* Random # seed */
+                    case 'r':
+                        use_seed = 1;
+                        temp = atoi(argv[u + 1]);
+                        if(temp < 0)
+                            usage();
+                        else
+                            random_seed = (unsigned)temp;
+                        u += 2;
+                        break;
+
+                    default:
+                        usage();
+                        break;
+                } /* end switch */
+            } /* end if */
+            else {
+                /* Get the number of records to append */
+                nrecords = atol(argv[u]);
+                if(nrecords <= 0)
+                    usage();
+
+                u++;
+            } /* end else */
+        } /* end while */
+    } /* end if */
+
+    if(nrecords <= 0)
+        usage();
+    if(flush_count >= nrecords)
+        usage();
+
+    /* Emit informational message */
+    if(verbose) {
+        fprintf(stderr, "Parameters:\n");
+        fprintf(stderr, "\tindex type = %s\n", index_type);
+        fprintf(stderr, "\tcompression level = %d\n", comp_level);
+        fprintf(stderr, "\t# of records between flushes = %ld\n", flush_count);
+        fprintf(stderr, "\t# of records to write = %ld\n", nrecords);
+    } /* end if */
+
+    /* Set the random seed */
+    if(0 == use_seed) {
+        struct timeval t;
+        gettimeofday(&t, NULL);
+        random_seed = (unsigned)(t.tv_usec);
+    } /* end if */
+    srandom(random_seed);
+    /* ALWAYS emit the random seed for possible debugging */
+    fprintf(stderr, "Using writer random seed: %u\n", random_seed);
+
+    /* Create the test file */
+    if((fid = create_file(FILENAME, verbose, index_type, random_seed)) < 0) {
+        fprintf(stderr, "Error creating the file...\n");
+        exit(1);
+    }
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Generating symbol names\n");
+
+    /* Generate dataset names */
+    if(generate_symbols() < 0)
+        return -1;
+
+    /* Create the datasets in the file */
+    if(create_datasets(fid, comp_level, verbose) < 0) {
+        fprintf(stderr, "Error creating datasets...\n");
+        exit(1);
+    }
+
+    /* Enable SWMR writing mode */
+    if(H5Fstart_swmr_write(fid) < 0) {
+        fprintf(stderr, "Error starting SWMR writing mode...\n");
+        exit(1);
+    }
+
+#ifdef OUT
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Creating and closing datasets: %s\n", FILENAME);
+
+    /* Create and close the datasets in the file */
+    if(create_close_datasets(fid, comp_level, verbose) < 0) {
+        fprintf(stderr, "Error creating datasets...\n");
+        exit(1);
+    }
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0) {
+        fprintf(stderr, "Error closing file!\n");
+        exit(1);
+    } /* end if */
+
+    /* Open the file */
+    if((fid = open_file(FILENAME, verbose)) < 0) {
+        fprintf(stderr, "Error opening the file...\n");
+        exit(1);
+    }
+
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Generating symbol names\n");
+
+    /* Generate dataset names */
+    if(generate_symbols() < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Opening datasets: %s\n", FILENAME);
+
+    /* Open the file's datasets */
+    if(open_datasets(fid, verbose) < 0) {
+        fprintf(stderr, "Error opening datasets...\n");
+        exit(1);
+    } /* end if */
+
+
+    /* Enable SWMR writing mode */
+    if(H5Fstart_swmr_write(fid) < 0) {
+        fprintf(stderr, "Error starting SWMR writing mode...\n");
+        exit(1);
+    }
+#endif
+
+    /* Send a message to indicate "H5Fopen" is complete--releasing the file lock */
+    h5_send_message(WRITER_MESSAGE);
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Adding records\n");
+
+    /* Append records to datasets */
+    if(add_records(fid, verbose, (unsigned long)nrecords, (unsigned long)flush_count) < 0) {
+        fprintf(stderr, "Error appending records to datasets!\n");
+        exit(1);
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Releasing symbols\n");
+
+    /* Clean up the symbols */
+    if(shutdown_symbols() < 0) {
+        fprintf(stderr, "Error releasing symbols!\n");
+        exit(1);
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Closing the file\n");
+
+    /* Close objects opened */
+    if(H5Fclose(fid) < 0) {
+        fprintf(stderr, "Error closing file!\n");
+        exit(1);
+    } /* end if */
+
+    return 0;
+} /* main() */
diff --git a/test/swmr_writer.c b/test/swmr_writer.c
new file mode 100644
index 0000000..4ab6287
--- /dev/null
+++ b/test/swmr_writer.c
@@ -0,0 +1,431 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*-------------------------------------------------------------------------
+ *
+ * Created:     swmr_writer.c
+ *
+ * Purpose:     Writes data to a randomly selected subset of the datasets
+ *              in the SWMR test file.
+ *
+ *              This program is intended to run concurrently with the
+ *              swmr_reader program.
+ *
+ *-------------------------------------------------------------------------
+ */
+
+/***********/
+/* Headers */
+/***********/
+
+#include <assert.h>
+#include <sys/time.h>
+
+#include "swmr_common.h"
+
+/********************/
+/* Local Prototypes */
+/********************/
+
+static hid_t open_skeleton(const char *filename, unsigned verbose, unsigned old);
+static int add_records(hid_t fid, unsigned verbose, unsigned long nrecords,
+    unsigned long flush_count);
+static void usage(void);
+
+

+/*-------------------------------------------------------------------------
+ * Function:    open_skeleton
+ *
+ * Purpose:     Opens the SWMR HDF5 file and datasets.
+ *
+ * Parameters:  const char *filename
+ *              The filename of the SWMR HDF5 file to open
+ *
+ *              unsigned verbose
+ *              Whether or not to emit verbose console messages
+ *
+ * Return:      Success:    The file ID of the opened SWMR file
+ *                          The dataset IDs are stored in a global array
+ *
+ *              Failure:    -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static hid_t
+open_skeleton(const char *filename, unsigned verbose, unsigned old)
+{
+    hid_t fid;          /* File ID for new HDF5 file */
+    hid_t fapl;         /* File access property list */
+    unsigned u, v;      /* Local index variable */
+
+    assert(filename);
+
+    /* Create file access property list */
+    if((fapl = h5_fileaccess()) < 0)
+        return -1;
+
+    if(!old) {
+	/* Set to use the latest library format */
+	if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+	    return -1;
+    }
+
+#ifdef QAK
+    /* Increase the initial size of the metadata cache */
+    {
+        H5AC_cache_config_t mdc_config;
+
+        mdc_config.version = H5AC__CURR_CACHE_CONFIG_VERSION;
+        H5Pget_mdc_config(fapl, &mdc_config);
+        fprintf(stderr, "mdc_config.initial_size = %lu\n", (unsigned long)mdc_config.initial_size);
+        fprintf(stderr, "mdc_config.epoch_length = %lu\n", (unsigned long)mdc_config.epoch_length);
+        mdc_config.set_initial_size = 1;
+        mdc_config.initial_size = 16 * 1024 * 1024;
+        /* mdc_config.epoch_length = 5000; */
+        H5Pset_mdc_config(fapl, &mdc_config);
+    }
+#endif /* QAK */
+
+#ifdef QAK
+    H5Pset_fapl_log(fapl, "append.log", H5FD_LOG_ALL, (size_t)(512 * 1024 * 1024));
+#endif /* QAK */
+
+    /* Open the file */
+    if((fid = H5Fopen(filename, H5F_ACC_RDWR | H5F_ACC_SWMR_WRITE, fapl)) < 0)
+        return -1;
+
+    /* Close file access property list */
+    if(H5Pclose(fapl) < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Opening datasets\n");
+
+    /* Open the datasets */
+    for(u = 0; u < NLEVELS; u++)
+        for(v = 0; v < symbol_count[u]; v++) {
+            if((symbol_info[u][v].dsid = H5Dopen2(fid, symbol_info[u][v].name, H5P_DEFAULT)) < 0)
+                return -1;
+            symbol_info[u][v].nrecords = 0;
+        } /* end for */
+
+    return fid;
+}
+
+

+/*-------------------------------------------------------------------------
+ * Function:    add_records
+ *
+ * Purpose:     Writes a specified number of records to random datasets in
+ *              the SWMR test file.
+ *
+ * Parameters:  hid_t fid
+ *              The file ID of the SWMR HDF5 file
+ *
+ *              unsigned verbose
+ *              Whether or not to emit verbose console messages
+ *
+ *              unsigned long nrecords
+ *              # of records to write to the datasets
+ *
+ *              unsigned long flush_count
+ *              # of records to write before flushing the file to disk
+ *
+ * Return:      Success:    0
+ *              Failure:    -1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+add_records(hid_t fid, unsigned verbose, unsigned long nrecords, unsigned long flush_count)
+{
+    hid_t tid;                              /* Datatype ID for records */
+    hid_t mem_sid;                          /* Memory dataspace ID */
+    hsize_t start[2] = {0, 0}, count[2] = {1, 1}; /* Hyperslab selection values */
+    hsize_t dim[2] = {1, 0};                /* Dataspace dimensions */
+    symbol_t record;                        /* The record to add to the dataset */
+    H5AC_cache_config_t mdc_config_orig;    /* Original metadata cache configuration */
+    H5AC_cache_config_t mdc_config_cork;    /* Corked metadata cache configuration */
+    unsigned long rec_to_flush;             /* # of records left to write before flush */
+    unsigned long u, v;                     /* Local index variables */
+
+    assert(fid >= 0);
+
+    /* Reset the record */
+    /* (record's 'info' field might need to change for each record written, also) */
+    memset(&record, 0, sizeof(record));
+
+    /* Create a dataspace for the record to add */
+    if((mem_sid = H5Screate(H5S_SCALAR)) < 0)
+        return -1;
+
+    /* Create datatype for appending records */
+    if((tid = create_symbol_datatype()) < 0)
+        return -1;
+
+    /* Get the current metadata cache configuration, and set up the corked
+     * configuration */
+    mdc_config_orig.version = H5AC__CURR_CACHE_CONFIG_VERSION;
+    if(H5Fget_mdc_config(fid, &mdc_config_orig) < 0)
+        return -1;
+    memcpy(&mdc_config_cork, &mdc_config_orig, sizeof(mdc_config_cork));
+    mdc_config_cork.evictions_enabled = FALSE;
+    mdc_config_cork.incr_mode = H5C_incr__off;
+    mdc_config_cork.flash_incr_mode = H5C_flash_incr__off;
+    mdc_config_cork.decr_mode = H5C_decr__off;
+
+    /* Add records to random datasets, according to frequency distribution */
+    rec_to_flush = flush_count;
+    for(u = 0; u < nrecords; u++) {
+        symbol_info_t *symbol;  /* Symbol to write record to */
+        hid_t file_sid;         /* Dataset's space ID */
+
+        /* Get a random dataset, according to the symbol distribution */
+        symbol = choose_dataset();
+
+        /* Set the record's ID (equal to its position) */
+        record.rec_id = symbol->nrecords;
+
+        /* Get the coordinate to write */
+        start[1] = symbol->nrecords;
+
+        /* Cork the metadata cache, to prevent the object header from being
+         * flushed before the data has been written */
+        /*if(H5Fset_mdc_config(fid, &mdc_config_cork) < 0)
+            return(-1);*/
+
+        /* Extend the dataset's dataspace to hold the new record */
+        symbol->nrecords++;
+        dim[1] = symbol->nrecords;
+        if(H5Dset_extent(symbol->dsid, dim) < 0)
+            return -1;
+
+        /* Get the dataset's dataspace */
+        if((file_sid = H5Dget_space(symbol->dsid)) < 0)
+            return -1;
+
+        /* Choose the last record in the dataset */
+        if(H5Sselect_hyperslab(file_sid, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+            return -1;
+
+        /* Write record to the dataset */
+        if(H5Dwrite(symbol->dsid, tid, mem_sid, file_sid, H5P_DEFAULT, &record) < 0)
+            return -1;
+
+        /* Uncork the metadata cache */
+        /*if(H5Fset_mdc_config(fid, &mdc_config_orig) < 0)
+            return -1;*/
+
+        /* Close the dataset's dataspace */
+        if(H5Sclose(file_sid) < 0)
+            return -1;
+
+        /* Check for flushing file */
+        if(flush_count > 0) {
+            /* Decrement count of records to write before flushing */
+            rec_to_flush--;
+
+            /* Check for counter being reached */
+            if(0 == rec_to_flush) {
+                /* Flush contents of file */
+                if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+                    return -1;
+
+                /* Reset flush counter */
+                rec_to_flush = flush_count;
+            } /* end if */
+        } /* end if */
+    } /* end for */
+
+    /* Close the memory dataspace */
+    if(H5Sclose(mem_sid) < 0)
+        return -1;
+
+    /* Close the datatype */
+    if(H5Tclose(tid) < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Closing datasets\n");
+
+    /* Close the datasets */
+    for(u = 0; u < NLEVELS; u++)
+        for(v = 0; v < symbol_count[u]; v++)
+            if(H5Dclose(symbol_info[u][v].dsid) < 0)
+                return -1;
+
+    return 0;
+}
+
+static void
+usage(void)
+{
+    printf("\n");
+    printf("Usage error!\n");
+    printf("\n");
+    printf("Usage: swmr_writer [-q] [-o] [-f <# of records to write between flushing\n");
+    printf("    file contents>] [-r <random seed>] <# of records>\n");
+    printf("\n");
+    printf("<# of records to write between flushing file contents> should be 0\n");
+    printf("(for no flushing) or between 1 and (<# of records> - 1).\n");
+    printf("\n");
+    printf("<# of records> must be specified.\n");
+    printf("\n");
+    printf("Defaults to verbose (no '-q' given), latest format when opening file (no '-o' given),\n");
+    printf("flushing every 10000 records ('-f 10000'), and will generate a random seed (no -r given).\n");
+    printf("\n");
+    exit(1);
+}
+
+int main(int argc, const char *argv[])
+{
+    hid_t fid;                  /* File ID for file opened */
+    long nrecords = 0;          /* # of records to append */
+    long flush_count = 10000;   /* # of records to write between flushing file */
+    unsigned verbose = 1;       /* Whether to emit some informational messages */
+    unsigned old = 0;       	/* Whether to use non-latest-format when opening file */
+    unsigned use_seed = 0;      /* Set to 1 if a seed was set on the command line */
+    unsigned random_seed = 0;   /* Random # seed */
+    unsigned u;                 /* Local index variable */
+    int temp;
+
+    /* Parse command line options */
+    if(argc < 2)
+        usage();
+    if(argc > 1) {
+        u = 1;
+        while(u < (unsigned)argc) {
+            if(argv[u][0] == '-') {
+                switch(argv[u][1]) {
+                    /* # of records to write between flushing file */
+                    case 'f':
+                        flush_count = atol(argv[u + 1]);
+                        if(flush_count < 0)
+                            usage();
+                        u += 2;
+                        break;
+
+                    /* Be quiet */
+                    case 'q':
+                        verbose = 0;
+                        u++;
+                        break;
+                    
+                    /* Random # seed */
+                    case 'r':
+                        use_seed = 1;
+                        temp = atoi(argv[u + 1]);
+                        random_seed = (unsigned)temp;
+                        u += 2;
+                        break;
+
+		    /* Use non-latest-format when opening file */
+                    case 'o':
+                        old = 1;
+                        u++;
+                        break;
+
+                    default:
+                        usage();
+                        break;
+                } /* end switch */
+            } /* end if */
+            else {
+                /* Get the number of records to append */
+                nrecords = atol(argv[u]);
+                if(nrecords <= 0)
+                    usage();
+
+                u++;
+            } /* end else */
+        } /* end while */
+    } /* end if */
+    if(nrecords <= 0)
+        usage();
+    if(flush_count >= nrecords)
+        usage();
+
+    /* Emit informational message */
+    if(verbose) {
+        fprintf(stderr, "Parameters:\n");
+        fprintf(stderr, "\t# of records between flushes = %ld\n", flush_count);
+        fprintf(stderr, "\t# of records to write = %ld\n", nrecords);
+    } /* end if */
+
+    /* Set the random seed */
+    if(0 == use_seed) {
+        struct timeval t;
+        gettimeofday(&t, NULL);
+        random_seed = (unsigned)(t.tv_usec);
+    } /* end if */
+    srandom(random_seed);
+    /* ALWAYS emit the random seed for possible debugging */
+    fprintf(stderr, "Using writer random seed: %u\n", random_seed);
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Generating symbol names\n");
+
+    /* Generate dataset names */
+    if(generate_symbols() < 0)
+        return -1;
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Opening skeleton file: %s\n", FILENAME);
+
+    /* Open file skeleton */
+    if((fid = open_skeleton(FILENAME, verbose, old)) < 0) {
+        fprintf(stderr, "Error opening skeleton file!\n");
+        exit(1);
+    } /* end if */
+
+    /* Send a message to indicate "H5Fopen" is complete--releasing the file lock */
+    h5_send_message(WRITER_MESSAGE);
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Adding records\n");
+
+    /* Append records to datasets */
+    if(add_records(fid, verbose, (unsigned long)nrecords, (unsigned long)flush_count) < 0) {
+        fprintf(stderr, "Error appending records to datasets!\n");
+        exit(1);
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Releasing symbols\n");
+
+    /* Clean up the symbols */
+    if(shutdown_symbols() < 0) {
+        fprintf(stderr, "Error releasing symbols!\n");
+        exit(1);
+    } /* end if */
+
+    /* Emit informational message */
+    if(verbose)
+        fprintf(stderr, "Closing objects\n");
+
+    /* Close objects opened */
+    if(H5Fclose(fid) < 0) {
+        fprintf(stderr, "Error closing file!\n");
+        exit(1);
+    } /* end if */
+
+    return 0;
+}
diff --git a/test/tarray.c b/test/tarray.c
index c86d3bd..9c79f41 100644
--- a/test/tarray.c
+++ b/test/tarray.c
@@ -685,8 +685,8 @@ test_array_compound_atomic(void)
                 TestErrPrintf("Array data information doesn't match!, wdata[%d][%d].i=%d, rdata[%d][%d].i=%d\n", (int)i, (int)j, (int)wdata[i][j].i, (int)i, (int)j, (int)rdata[i][j].i);
                 continue;
             } /* end if */
-            if(!FLT_ABS_EQUAL(wdata[i][j].f, rdata[i][j].f)) {
-                TestErrPrintf("Array data information doesn't match!, wdata[%d][%d].f=%f, rdata[%d][%d].f=%f\n", (int)i, (int)j, wdata[i][j].f, (int)i, (int)j, rdata[i][j].f);
+            if(!H5_FLT_ABS_EQUAL(wdata[i][j].f, rdata[i][j].f)) {
+                TestErrPrintf("Array data information doesn't match!, wdata[%d][%d].f=%f, rdata[%d][%d].f=%f\n", (int)i, (int)j, (double)wdata[i][j].f, (int)i, (int)j, (double)rdata[i][j].f);
                 continue;
             } /* end if */
         } /* end for */
@@ -928,8 +928,8 @@ test_array_compound_array(void)
                 continue;
             } /* end if */
             for(k=0; k<ARRAY1_DIM1; k++)
-                if(!FLT_ABS_EQUAL(wdata[i][j].f[k],rdata[i][j].f[k])) {
-                    TestErrPrintf("Array data information doesn't match!, wdata[%d][%d].f[%d]=%f, rdata[%d][%d].f[%d]=%f\n",(int)i,(int)j,(int)k,wdata[i][j].f[k],(int)i,(int)j,(int)k,rdata[i][j].f[k]);
+                if(!H5_FLT_ABS_EQUAL(wdata[i][j].f[k],rdata[i][j].f[k])) {
+                    TestErrPrintf("Array data information doesn't match!, wdata[%d][%d].f[%d]=%f, rdata[%d][%d].f[%d]=%f\n",(int)i,(int)j,(int)k,(double)wdata[i][j].f[k],(int)i,(int)j,(int)k,(double)rdata[i][j].f[k]);
                     continue;
                 } /* end if */
         } /* end for */
@@ -1618,12 +1618,12 @@ test_array_bkg(void)
                 TestErrPrintf("Field a data doesn't match, cf[%d].a[%d]=%d, cfr[%d].a[%d]=%d\n",(int)i,(int)j,(int)cf[i].a[j],(int)i,(int)j,(int)cfr[i].a[j]);
                 continue;
             }
-            if(!FLT_ABS_EQUAL(cf[i].b[j],cfr[i].b[j])) {
-                TestErrPrintf("Field b data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n",(int)i,(int)j,(float)cf[i].b[j],(int)i,(int)j,(float)cfr[i].b[j]);
+            if(!H5_FLT_ABS_EQUAL(cf[i].b[j],cfr[i].b[j])) {
+                TestErrPrintf("Field b data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n",(int)i,(int)j,(double)cf[i].b[j],(int)i,(int)j,(double)cfr[i].b[j]);
                 continue;
             }
-            if(!DBL_ABS_EQUAL(cf[i].c[j],cfr[i].c[j])) {
-                TestErrPrintf("Field c data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n",(int)i,(int)j,(float)cf[i].c[j],(int)i,(int)j,(float)cfr[i].c[j]);
+            if(!H5_DBL_ABS_EQUAL(cf[i].c[j],cfr[i].c[j])) {
+                TestErrPrintf("Field c data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n",(int)i,(int)j,(double)cf[i].c[j],(int)i,(int)j,(double)cfr[i].c[j]);
                 continue;
             }
         }
@@ -1685,8 +1685,8 @@ test_array_bkg(void)
 
     for (i=0; i< LENGTH; i++)
         for (j = 0; j < ALEN; j++)
-            if(!FLT_ABS_EQUAL(fld[i].b[j],fldr[i].b[j])) {
-                TestErrPrintf("Field data doesn't match, fld[%d].b[%d]=%f, fldr[%d].b[%d]=%f\n",(int)i,(int)j,(float)fld[i].b[j],(int)i,(int)j,(float)fldr[i].b[j]);
+            if(!H5_FLT_ABS_EQUAL(fld[i].b[j],fldr[i].b[j])) {
+                TestErrPrintf("Field data doesn't match, fld[%d].b[%d]=%f, fldr[%d].b[%d]=%f\n",(int)i,(int)j,(double)fld[i].b[j],(int)i,(int)j,(double)fldr[i].b[j]);
                 continue;
             }
 
@@ -1711,12 +1711,12 @@ test_array_bkg(void)
                 TestErrPrintf("Field a data doesn't match, cf[%d].a[%d]=%d, cfr[%d].a[%d]=%d\n",(int)i,(int)j,(int)cf[i].a[j],(int)i,(int)j,(int)cfr[i].a[j]);
                 continue;
             }
-            if(!FLT_ABS_EQUAL(cf[i].b[j],cfr[i].b[j])) {
-                TestErrPrintf("Field b data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n",(int)i,(int)j,(float)cf[i].b[j],(int)i,(int)j,(float)cfr[i].b[j]);
+            if(!H5_FLT_ABS_EQUAL(cf[i].b[j],cfr[i].b[j])) {
+                TestErrPrintf("Field b data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n",(int)i,(int)j,(double)cf[i].b[j],(int)i,(int)j,(double)cfr[i].b[j]);
                 continue;
             }
-            if(!DBL_ABS_EQUAL(cf[i].c[j],cfr[i].c[j])) {
-                TestErrPrintf("Field c data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n",(int)i,(int)j,(float)cf[i].c[j],(int)i,(int)j,(float)cfr[i].c[j]);
+            if(!H5_DBL_ABS_EQUAL(cf[i].c[j],cfr[i].c[j])) {
+                TestErrPrintf("Field c data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n",(int)i,(int)j,(double)cf[i].c[j],(int)i,(int)j,(double)cfr[i].c[j]);
                 continue;
             }
         }
@@ -1760,12 +1760,12 @@ test_array_bkg(void)
                 TestErrPrintf("Field a data doesn't match, cf[%d].a[%d]=%d, cfr[%d].a[%d]=%d\n",(int)i,(int)j,(int)cf[i].a[j],(int)i,(int)j,(int)cfr[i].a[j]);
                 continue;
             }
-            if(!FLT_ABS_EQUAL(cf[i].b[j],cfr[i].b[j])) {
-                TestErrPrintf("Field b data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n",(int)i,(int)j,(float)cf[i].b[j],(int)i,(int)j,(float)cfr[i].b[j]);
+            if(!H5_FLT_ABS_EQUAL(cf[i].b[j],cfr[i].b[j])) {
+                TestErrPrintf("Field b data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n",(int)i,(int)j,(double)cf[i].b[j],(int)i,(int)j,(double)cfr[i].b[j]);
                 continue;
             }
-            if(!DBL_ABS_EQUAL(cf[i].c[j],cfr[i].c[j])) {
-                TestErrPrintf("Field c data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n",(int)i,(int)j,(float)cf[i].c[j],(int)i,(int)j,(float)cfr[i].c[j]);
+            if(!H5_DBL_ABS_EQUAL(cf[i].c[j],cfr[i].c[j])) {
+                TestErrPrintf("Field c data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n",(int)i,(int)j,(double)cf[i].c[j],(int)i,(int)j,(double)cfr[i].c[j]);
                 continue;
             }
         }
@@ -1792,8 +1792,7 @@ test_array_bkg(void)
 static void
 test_compat(void)
 {
-    char testfile[512]="";          /* Character buffer for corrected test file name */
-    char *srcdir = getenv("srcdir");    /* Pointer to the directory the source code is located within */
+    const char *testfile = H5_get_srcdir_filename(TESTFILE); /* Corrected test file name */
     hid_t		fid1;		/* HDF5 File IDs		*/
     hid_t		dataset;	/* Dataset ID			*/
     hid_t		tid1;       /* Array Datatype ID			*/
@@ -1821,12 +1820,6 @@ test_compat(void)
      *  changed, follow the instructions in gen_old_array.c for regenerating
      *  the tarrold.h5 file.
      */
-    /* Generate the correct name for the test file, by prepending the source path */
-    if (srcdir && ((strlen(srcdir) + strlen(TESTFILE) + 1) < sizeof(testfile))) {
-        strcpy(testfile, srcdir);
-        strcat(testfile, "/");
-    }
-    strcat(testfile, TESTFILE);
 
     /* Open the testfile */
     fid1 = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT);
diff --git a/test/tarrold.h5 b/test/tarrold.h5
index 7747ce4..048838c 100644
Binary files a/test/tarrold.h5 and b/test/tarrold.h5 differ
diff --git a/test/tattr.c b/test/tattr.c
index f29551a..585246a 100644
--- a/test/tattr.c
+++ b/test/tattr.c
@@ -29,7 +29,7 @@
  * This file needs to access private information from the H5O package.
  * This file also needs to access the object header testing code.
  */
-#define H5O_PACKAGE
+#define H5O_FRIEND		/*suppress error about including H5Opkg	  */
 #define H5O_TESTING
 #include "H5Opkg.h"		/* Object headers 			*/
 
@@ -37,7 +37,7 @@
  * This file needs to access private information from the H5A package.
  * This file also needs to access the attribute testing code.
  */
-#define H5A_PACKAGE
+#define H5A_FRIEND		/*suppress error about including H5Apkg	  */
 #define H5A_TESTING
 #include "H5Apkg.h"		/* Attributes	 			*/
 
@@ -45,7 +45,7 @@
  * This file needs to access private information from the H5F package.
  * This file also needs to access the file testing code.
  */
-#define H5F_PACKAGE
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
 #define H5F_TESTING
 #include "H5Fpkg.h"		/* File access	 			*/
 
@@ -178,6 +178,7 @@ test_attr_basic_write(hid_t fapl)
     hsize_t		dims3[] = {ATTR2_DIM1,ATTR2_DIM2};
     int       read_data1[ATTR1_DIM1]={0}; /* Buffer for reading 1st attribute */
     int         i;
+    hid_t		ret_id;		/* Generic hid_t return value	*/
     herr_t		ret;		/* Generic return value		*/
 
     /* Output message about test being performed */
@@ -228,8 +229,8 @@ test_attr_basic_write(hid_t fapl)
     CHECK(attr, FAIL, "H5Acreate2");
 
     /* Try to create the same attribute again (should fail) */
-    ret = H5Acreate2(dataset, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT);
-    VERIFY(ret, FAIL, "H5Acreate2");
+    ret_id = H5Acreate2(dataset, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT);
+    VERIFY(ret_id, FAIL, "H5Acreate2");
 
     /* Write attribute information */
     ret = H5Awrite(attr, H5T_NATIVE_INT, attr_data1);
@@ -366,8 +367,8 @@ test_attr_basic_write(hid_t fapl)
     VERIFY(attr_size, (ATTR2_DIM1 * ATTR2_DIM2 * sizeof(int)), "H5Aget_storage_size");
 
     /* Try to create the same attribute again (should fail) */
-    ret = H5Acreate2(group, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT);
-    VERIFY(ret, FAIL, "H5Acreate2");
+    ret_id = H5Acreate2(group, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT);
+    VERIFY(ret_id, FAIL, "H5Acreate2");
 
     /* Write attribute information */
     ret = H5Awrite(attr, H5T_NATIVE_INT, attr_data2);
@@ -521,8 +522,8 @@ test_attr_flush(hid_t fapl)
     ret=H5Aread(att, H5T_NATIVE_DOUBLE, &rdata);
     CHECK(ret, FAIL, "H5Awrite");
 
-    if(!DBL_ABS_EQUAL(rdata,0.0F))
-        TestErrPrintf("attribute value wrong: rdata=%f, should be %f\n",rdata,0.0F);
+    if(!H5_DBL_ABS_EQUAL(rdata,0.0F))
+        TestErrPrintf("attribute value wrong: rdata=%f, should be %f\n",rdata,(double)0.0F);
 
     ret=H5Fflush(fil, H5F_SCOPE_GLOBAL);
     CHECK(ret, FAIL, "H5Fflush");
@@ -530,8 +531,8 @@ test_attr_flush(hid_t fapl)
     ret=H5Aread(att, H5T_NATIVE_DOUBLE, &rdata);
     CHECK(ret, FAIL, "H5Awrite");
 
-    if(!DBL_ABS_EQUAL(rdata,0.0F))
-        TestErrPrintf("attribute value wrong: rdata=%f, should be %f\n",rdata,0.0F);
+    if(!H5_DBL_ABS_EQUAL(rdata,0.0F))
+        TestErrPrintf("attribute value wrong: rdata=%f, should be %f\n",rdata,(double)0.0F);
 
     ret=H5Awrite(att, H5T_NATIVE_DOUBLE, &wdata);
     CHECK(ret, FAIL, "H5Awrite");
@@ -539,7 +540,7 @@ test_attr_flush(hid_t fapl)
     ret=H5Aread(att, H5T_NATIVE_DOUBLE, &rdata);
     CHECK(ret, FAIL, "H5Awrite");
 
-    if(!DBL_ABS_EQUAL(rdata,wdata))
+    if(!H5_DBL_ABS_EQUAL(rdata,wdata))
         TestErrPrintf("attribute value wrong: rdata=%f, should be %f\n",rdata,wdata);
 
     ret=H5Sclose(spc);
@@ -682,6 +683,7 @@ test_attr_compound_write(hid_t fapl)
     hid_t		attr;	    /* Attribute ID			*/
     hsize_t		dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3};
     hsize_t		dims2[] = {ATTR4_DIM1,ATTR4_DIM2};
+    hid_t		ret_id;		/* Generic hid_t return value	*/
     herr_t		ret;		/* Generic return value		*/
 
     /* Output message about test being performed */
@@ -725,8 +727,8 @@ test_attr_compound_write(hid_t fapl)
     CHECK(attr, FAIL, "H5Acreate2");
 
     /* Try to create the same attribute again (should fail) */
-    ret = H5Acreate2(dataset, ATTR4_NAME, tid1, sid2, H5P_DEFAULT, H5P_DEFAULT);
-    VERIFY(ret, FAIL, "H5Acreate2");
+    ret_id = H5Acreate2(dataset, ATTR4_NAME, tid1, sid2, H5P_DEFAULT, H5P_DEFAULT);
+    VERIFY(ret_id, FAIL, "H5Acreate2");
 
     /* Write complex attribute data */
     ret = H5Awrite(attr, tid1, attr_data4);
@@ -844,7 +846,7 @@ test_attr_compound_read(hid_t fapl)
     t_class = H5Tget_class(field);
     VERIFY(t_class, H5T_INTEGER, "H5Tget_class");
     order = H5Tget_order(field);
-    VERIFY(order, H5Tget_order(H5T_NATIVE_INT), "H5Tget_order");
+    VERIFY_TYPE(order, H5Tget_order(H5T_NATIVE_INT), H5T_order_t, "%d", "H5Tget_order");
     size = H5Tget_size(field);
     VERIFY(size, H5Tget_size(H5T_NATIVE_INT), "H5Tget_size");
     H5Tclose(field);
@@ -853,7 +855,7 @@ test_attr_compound_read(hid_t fapl)
     t_class = H5Tget_class(field);
     VERIFY(t_class, H5T_FLOAT, "H5Tget_class");
     order = H5Tget_order(field);
-    VERIFY(order, H5Tget_order(H5T_NATIVE_DOUBLE), "H5Tget_order");
+    VERIFY_TYPE(order, H5Tget_order(H5T_NATIVE_DOUBLE), H5T_order_t, "%d", "H5Tget_order");
     size = H5Tget_size(field);
     VERIFY(size, H5Tget_size(H5T_NATIVE_DOUBLE), "H5Tget_size");
     H5Tclose(field);
@@ -862,7 +864,7 @@ test_attr_compound_read(hid_t fapl)
     t_class = H5Tget_class(field);
     VERIFY(t_class, H5T_INTEGER, "H5Tget_class");
     order = H5Tget_order(field);
-    VERIFY(order, H5Tget_order(H5T_NATIVE_SCHAR), "H5Tget_order");
+    VERIFY_TYPE(order, H5Tget_order(H5T_NATIVE_SCHAR), H5T_order_t, "%d", "H5Tget_order");
     size = H5Tget_size(field);
     VERIFY(size, H5Tget_size(H5T_NATIVE_SCHAR), "H5Tget_size");
     H5Tclose(field);
@@ -917,6 +919,7 @@ test_attr_scalar_write(hid_t fapl)
     hid_t		sid1,sid2;	/* Dataspace ID			*/
     hid_t		attr;	    /* Attribute ID			*/
     hsize_t		dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3};
+    hid_t		ret_id;		/* Generic hid_t return value	*/
     herr_t		ret;		/* Generic return value		*/
 
     /* Output message about test being performed */
@@ -943,8 +946,8 @@ test_attr_scalar_write(hid_t fapl)
     CHECK(attr, FAIL, "H5Acreate2");
 
     /* Try to create the same attribute again (should fail) */
-    ret = H5Acreate2(dataset, ATTR5_NAME, H5T_NATIVE_FLOAT, sid2, H5P_DEFAULT, H5P_DEFAULT);
-    VERIFY(ret, FAIL, "H5Acreate2");
+    ret_id = H5Acreate2(dataset, ATTR5_NAME, H5T_NATIVE_FLOAT, sid2, H5P_DEFAULT, H5P_DEFAULT);
+    VERIFY(ret_id, FAIL, "H5Acreate2");
 
     /* Write attribute information */
     ret = H5Awrite(attr, H5T_NATIVE_FLOAT, &attr_data5);
@@ -1011,9 +1014,9 @@ test_attr_scalar_read(hid_t fapl)
     CHECK(ret, FAIL, "H5Aread");
 
     /* Verify the floating-poing value in this way to avoid compiler warning. */
-    if(!FLT_ABS_EQUAL(rdata, attr_data5))
+    if(!H5_FLT_ABS_EQUAL(rdata, attr_data5))
 	printf("*** UNEXPECTED VALUE from %s should be %f, but is %f at line %4d in %s\n",
-	    "H5Aread", attr_data5, rdata, (int)__LINE__, __FILE__);
+	    "H5Aread", (double)attr_data5, (double)rdata, (int)__LINE__, __FILE__);
 
     /* Get the attribute's dataspace */
     sid = H5Aget_space(attr);
@@ -1057,6 +1060,7 @@ test_attr_mult_write(hid_t fapl)
     hsize_t		dims2[] = {ATTR1_DIM1};
     hsize_t		dims3[] = {ATTR2_DIM1,ATTR2_DIM2};
     hsize_t		dims4[] = {ATTR3_DIM1,ATTR3_DIM2,ATTR3_DIM3};
+    hid_t		ret_id;		/* Generic hid_t return value	*/
     herr_t		ret;		/* Generic return value		*/
 
     /* Output message about test being performed */
@@ -1087,8 +1091,8 @@ test_attr_mult_write(hid_t fapl)
     CHECK(attr, FAIL, "H5Acreate2");
 
     /* Try to create the same attribute again (should fail) */
-    ret = H5Acreate2(dataset, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT);
-    VERIFY(ret, FAIL, "H5Acreate2");
+    ret_id = H5Acreate2(dataset, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT);
+    VERIFY(ret_id, FAIL, "H5Acreate2");
 
     /* Write 1st attribute data */
     ret = H5Awrite(attr, H5T_NATIVE_INT, attr_data1);
@@ -1111,8 +1115,8 @@ test_attr_mult_write(hid_t fapl)
     CHECK(attr, FAIL, "H5Acreate2");
 
     /* Try to create the same attribute again (should fail) */
-    ret = H5Acreate2(dataset, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT);
-    VERIFY(ret, FAIL, "H5Acreate2");
+    ret_id = H5Acreate2(dataset, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT);
+    VERIFY(ret_id, FAIL, "H5Acreate2");
 
     /* Write 2nd attribute information */
     ret = H5Awrite(attr, H5T_NATIVE_INT, attr_data2);
@@ -1135,8 +1139,8 @@ test_attr_mult_write(hid_t fapl)
     CHECK(attr, FAIL, "H5Acreate2");
 
     /* Try to create the same attribute again (should fail) */
-    ret = H5Acreate2(dataset, ATTR3_NAME, H5T_NATIVE_DOUBLE, sid2, H5P_DEFAULT, H5P_DEFAULT);
-    VERIFY(ret, FAIL, "H5Acreate2");
+    ret_id = H5Acreate2(dataset, ATTR3_NAME, H5T_NATIVE_DOUBLE, sid2, H5P_DEFAULT, H5P_DEFAULT);
+    VERIFY(ret_id, FAIL, "H5Acreate2");
 
     /* Write 3rd attribute information */
     ret = H5Awrite(attr, H5T_NATIVE_DOUBLE, attr_data3);
@@ -1225,7 +1229,7 @@ test_attr_mult_read(hid_t fapl)
     t_class = H5Tget_class(type);
     VERIFY(t_class, H5T_INTEGER, "H5Tget_class");
     order = H5Tget_order(type);
-    VERIFY(order, H5Tget_order(H5T_NATIVE_INT), "H5Tget_order");
+    VERIFY_TYPE(order, H5Tget_order(H5T_NATIVE_INT), H5T_order_t, "%d", "H5Tget_order");
     size = H5Tget_size(type);
     VERIFY(size, H5Tget_size(H5T_NATIVE_INT), "H5Tget_size");
     H5Tclose(type);
@@ -1280,7 +1284,7 @@ test_attr_mult_read(hid_t fapl)
     t_class = H5Tget_class(type);
     VERIFY(t_class, H5T_INTEGER, "H5Tget_class");
     order = H5Tget_order(type);
-    VERIFY(order, H5Tget_order(H5T_NATIVE_INT), "H5Tget_order");
+    VERIFY_TYPE(order, H5Tget_order(H5T_NATIVE_INT), H5T_order_t, "%d", "H5Tget_order");
     size = H5Tget_size(type);
     VERIFY(size, H5Tget_size(H5T_NATIVE_INT), "H5Tget_size");
     H5Tclose(type);
@@ -1338,7 +1342,7 @@ test_attr_mult_read(hid_t fapl)
     t_class = H5Tget_class(type);
     VERIFY(t_class, H5T_FLOAT, "H5Tget_class");
     order = H5Tget_order(type);
-    VERIFY(order, H5Tget_order(H5T_NATIVE_DOUBLE), "H5Tget_order");
+    VERIFY_TYPE(order, H5Tget_order(H5T_NATIVE_DOUBLE), H5T_order_t, "%d", "H5Tget_order");
     size = H5Tget_size(type);
     VERIFY(size, H5Tget_size(H5T_NATIVE_DOUBLE), "H5Tget_size");
     H5Tclose(type);
@@ -1351,7 +1355,7 @@ test_attr_mult_read(hid_t fapl)
     for(i = 0; i < ATTR3_DIM1; i++)
         for(j = 0; j < ATTR3_DIM2; j++)
             for(k = 0; k < ATTR3_DIM3; k++)
-                if(!DBL_ABS_EQUAL(attr_data3[i][j][k], read_data3[i][j][k]))
+                if(!H5_DBL_ABS_EQUAL(attr_data3[i][j][k], read_data3[i][j][k]))
                     TestErrPrintf("%d: attribute data different: attr_data3[%d][%d][%d]=%f, read_data3[%d][%d][%d]=%f\n", __LINE__, i, j, k, attr_data3[i][j][k], i, j, k, read_data3[i][j][k]);
 
     /* Verify Name */
@@ -5334,7 +5338,7 @@ test_attr_corder_delete(hid_t fcpl, hid_t fapl)
     hsize_t     nattrs;         /* Number of attributes on object */
     hsize_t     name_count;     /* # of records in name index */
     hsize_t     corder_count;   /* # of records in creation order index */
-    hbool_t     reopen_file;            /* Whether to re-open the file before deleting group */
+    unsigned     reopen_file;            /* Whether to re-open the file before deleting group */
     char	attrname[NAME_BUF_SIZE];        /* Name of attribute */
 #ifdef LATER
     h5_stat_size_t empty_size;  /* Size of empty file */
@@ -5683,7 +5687,7 @@ test_attr_info_by_idx(hbool_t new_format, hid_t fcpl, hid_t fapl)
     hsize_t     nattrs;         /* Number of attributes on object */
     hsize_t     name_count;     /* # of records in name index */
     hsize_t     corder_count;   /* # of records in creation order index */
-    hbool_t     use_index;      /* Use index on creation order values */
+    unsigned     use_index;     /* Use index on creation order values */
     char	attrname[NAME_BUF_SIZE];    /* Name of attribute */
     char        tmpname[NAME_BUF_SIZE];     /* Temporary attribute name */
     unsigned    curr_dset;      /* Current dataset to work on */
@@ -5895,7 +5899,7 @@ test_attr_delete_by_idx(hbool_t new_format, hid_t fcpl, hid_t fapl)
     hsize_t     corder_count;   /* # of records in creation order index */
     H5_index_t idx_type;        /* Type of index to operate on */
     H5_iter_order_t order;      /* Order within in the index */
-    hbool_t     use_index;      /* Use index on creation order values */
+    unsigned     use_index;     /* Use index on creation order values */
     char	attrname[NAME_BUF_SIZE];    /* Name of attribute */
     char        tmpname[NAME_BUF_SIZE];     /* Temporary attribute name */
     unsigned    curr_dset;      /* Current dataset to work on */
@@ -5915,9 +5919,9 @@ test_attr_delete_by_idx(hbool_t new_format, hid_t fcpl, hid_t fapl)
     CHECK(ret, FAIL, "H5Pget_attr_phase_change");
 
     /* Loop over operating on different indices on link fields */
-    for(idx_type = H5_INDEX_NAME; idx_type <=H5_INDEX_CRT_ORDER; idx_type++) {
+    for(idx_type = H5_INDEX_NAME; idx_type <= H5_INDEX_CRT_ORDER; H5_INC_ENUM(H5_index_t, idx_type)) {
         /* Loop over operating in different orders */
-        for(order = H5_ITER_INC; order <=H5_ITER_DEC; order++) {
+        for(order = H5_ITER_INC; order <= H5_ITER_DEC; H5_INC_ENUM(H5_iter_order_t, order)) {
             /* Loop over using index for creation order value */
             for(use_index = FALSE; use_index <= TRUE; use_index++) {
                 /* Print appropriate test message */
@@ -6838,7 +6842,7 @@ test_attr_iterate2(hbool_t new_format, hid_t fcpl, hid_t fapl)
     attr_iter_info_t iter_info; /* Iterator info */
     hbool_t     *visited = NULL;        /* Array of flags for visiting links */
     hsize_t     idx;            /* Start index for iteration */
-    hbool_t     use_index;      /* Use index on creation order values */
+    unsigned     use_index;     /* Use index on creation order values */
     const char *dsetname;       /* Name of dataset for attributes */
     char	attrname[NAME_BUF_SIZE];    /* Name of attribute */
     unsigned    curr_dset;      /* Current dataset to work on */
@@ -6864,9 +6868,9 @@ test_attr_iterate2(hbool_t new_format, hid_t fcpl, hid_t fapl)
     iter_info.visited = visited;
 
     /* Loop over operating on different indices on link fields */
-    for(idx_type = H5_INDEX_NAME; idx_type <=H5_INDEX_CRT_ORDER; idx_type++) {
+    for(idx_type = H5_INDEX_NAME; idx_type <= H5_INDEX_CRT_ORDER; H5_INC_ENUM(H5_index_t, idx_type)) {
         /* Loop over operating in different orders */
-        for(order = H5_ITER_INC; order <=H5_ITER_DEC; order++) {
+        for(order = H5_ITER_INC; order <= H5_ITER_DEC; H5_INC_ENUM(H5_iter_order_t, order)) {
             /* Loop over using index for creation order value */
             for(use_index = FALSE; use_index <= TRUE; use_index++) {
                 /* Print appropriate test message */
@@ -7199,10 +7203,11 @@ test_attr_open_by_idx(hbool_t new_format, hid_t fcpl, hid_t fapl)
     hsize_t     corder_count;   /* # of records in creation order index */
     H5_index_t idx_type;        /* Type of index to operate on */
     H5_iter_order_t order;      /* Order within in the index */
-    hbool_t     use_index;      /* Use index on creation order values */
+    unsigned     use_index;     /* Use index on creation order values */
     char	attrname[NAME_BUF_SIZE];    /* Name of attribute */
     unsigned    curr_dset;      /* Current dataset to work on */
     unsigned    u;              /* Local index variable */
+    hid_t	ret_id;		/* Generic hid_t return value	*/
     herr_t	ret;		/* Generic return value		*/
 
     /* Create dataspace for dataset & attributes */
@@ -7218,9 +7223,9 @@ test_attr_open_by_idx(hbool_t new_format, hid_t fcpl, hid_t fapl)
     CHECK(ret, FAIL, "H5Pget_attr_phase_change");
 
     /* Loop over operating on different indices on link fields */
-    for(idx_type = H5_INDEX_NAME; idx_type <=H5_INDEX_CRT_ORDER; idx_type++) {
+    for(idx_type = H5_INDEX_NAME; idx_type <= H5_INDEX_CRT_ORDER; H5_INC_ENUM(H5_index_t, idx_type)) {
         /* Loop over operating in different orders */
-        for(order = H5_ITER_INC; order <=H5_ITER_DEC; order++) {
+        for(order = H5_ITER_INC; order <= H5_ITER_DEC; H5_INC_ENUM(H5_iter_order_t, order)) {
             /* Loop over using index for creation order value */
             for(use_index = FALSE; use_index <= TRUE; use_index++) {
                 /* Print appropriate test message */
@@ -7297,8 +7302,8 @@ test_attr_open_by_idx(hbool_t new_format, hid_t fcpl, hid_t fapl)
                     VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test");
 
                     /* Check for opening an attribute on an object with no attributes */
-                    ret = H5Aopen_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT, H5P_DEFAULT);
-                    VERIFY(ret, FAIL, "H5Aopen_by_idx");
+                    ret_id = H5Aopen_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT, H5P_DEFAULT);
+                    VERIFY(ret_id, FAIL, "H5Aopen_by_idx");
 
                     /* Create attributes, up to limit of compact form */
                     for(u = 0; u < max_compact; u++) {
@@ -7330,8 +7335,8 @@ test_attr_open_by_idx(hbool_t new_format, hid_t fcpl, hid_t fapl)
                     VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test");
 
                     /* Check for out of bound opening an attribute on an object */
-                    ret = H5Aopen_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, H5P_DEFAULT, H5P_DEFAULT);
-                    VERIFY(ret, FAIL, "H5Aopen_by_idx");
+                    ret_id = H5Aopen_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, H5P_DEFAULT, H5P_DEFAULT);
+                    VERIFY(ret_id, FAIL, "H5Aopen_by_idx");
 
                     /* Test opening attributes by index stored compactly */
                     ret = attr_open_by_idx_check(my_dataset, idx_type, order, u);
@@ -7403,8 +7408,8 @@ test_attr_open_by_idx(hbool_t new_format, hid_t fcpl, hid_t fapl)
                     } /* end if */
 
                     /* Check for out of bound opening an attribute on an object */
-                    ret = H5Aopen_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, H5P_DEFAULT, H5P_DEFAULT);
-                    VERIFY(ret, FAIL, "H5Aopen_by_idx");
+                    ret_id = H5Aopen_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, H5P_DEFAULT, H5P_DEFAULT);
+                    VERIFY(ret_id, FAIL, "H5Aopen_by_idx");
 
                     /* Test opening attributes by index stored compactly */
                     ret = attr_open_by_idx_check(my_dataset, idx_type, order, u);
@@ -7544,11 +7549,12 @@ test_attr_open_by_name(hbool_t new_format, hid_t fcpl, hid_t fapl)
     hsize_t     nattrs;         /* Number of attributes on object */
     hsize_t     name_count;     /* # of records in name index */
     hsize_t     corder_count;   /* # of records in creation order index */
-    hbool_t     use_index;      /* Use index on creation order values */
+    unsigned    use_index;      /* Use index on creation order values */
     const char *dsetname;       /* Name of dataset for attributes */
     char	attrname[NAME_BUF_SIZE];    /* Name of attribute */
     unsigned    curr_dset;      /* Current dataset to work on */
     unsigned    u;              /* Local index variable */
+    hid_t	ret_id;		/* Generic hid_t return value	*/
     herr_t	ret;		/* Generic return value		*/
 
     /* Create dataspace for dataset & attributes */
@@ -7618,14 +7624,14 @@ test_attr_open_by_name(hbool_t new_format, hid_t fcpl, hid_t fapl)
             VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test");
 
             /* Check for opening a non-existant attribute on an object with no attributes */
-            ret = H5Aopen(my_dataset, "foo", H5P_DEFAULT);
-            VERIFY(ret, FAIL, "H5Aopen");
+            ret_id = H5Aopen(my_dataset, "foo", H5P_DEFAULT);
+            VERIFY(ret_id, FAIL, "H5Aopen");
 
-            ret = H5Aopen_by_name(my_dataset, ".", "foo", H5P_DEFAULT, H5P_DEFAULT);
-            VERIFY(ret, FAIL, "H5Aopen_by_name");
+            ret_id = H5Aopen_by_name(my_dataset, ".", "foo", H5P_DEFAULT, H5P_DEFAULT);
+            VERIFY(ret_id, FAIL, "H5Aopen_by_name");
 
-            ret = H5Aopen_by_name(fid, dsetname, "foo", H5P_DEFAULT, H5P_DEFAULT);
-            VERIFY(ret, FAIL, "H5Aopen_by_name");
+            ret_id = H5Aopen_by_name(fid, dsetname, "foo", H5P_DEFAULT, H5P_DEFAULT);
+            VERIFY(ret_id, FAIL, "H5Aopen_by_name");
 
             /* Create attributes, up to limit of compact form */
             for(u = 0; u < max_compact; u++) {
@@ -7657,14 +7663,14 @@ test_attr_open_by_name(hbool_t new_format, hid_t fcpl, hid_t fapl)
             VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test");
 
             /* Check for opening a non-existant attribute on an object with compact attribute storage */
-            ret = H5Aopen(my_dataset, "foo", H5P_DEFAULT);
-            VERIFY(ret, FAIL, "H5Aopen");
+            ret_id = H5Aopen(my_dataset, "foo", H5P_DEFAULT);
+            VERIFY(ret_id, FAIL, "H5Aopen");
 
-            ret = H5Aopen_by_name(my_dataset, ".", "foo", H5P_DEFAULT, H5P_DEFAULT);
-            VERIFY(ret, FAIL, "H5Aopen_by_name");
+            ret_id = H5Aopen_by_name(my_dataset, ".", "foo", H5P_DEFAULT, H5P_DEFAULT);
+            VERIFY(ret_id, FAIL, "H5Aopen_by_name");
 
-            ret = H5Aopen_by_name(fid, dsetname, "foo", H5P_DEFAULT, H5P_DEFAULT);
-            VERIFY(ret, FAIL, "H5Aopen_by_name");
+            ret_id = H5Aopen_by_name(fid, dsetname, "foo", H5P_DEFAULT, H5P_DEFAULT);
+            VERIFY(ret_id, FAIL, "H5Aopen_by_name");
 
             /* Test opening attributes stored compactly */
             ret = attr_open_check(fid, dsetname, my_dataset, u);
@@ -7739,14 +7745,14 @@ test_attr_open_by_name(hbool_t new_format, hid_t fcpl, hid_t fapl)
             } /* end if */
 
             /* Check for opening a non-existant attribute on an object with dense attribute storage */
-            ret = H5Aopen(my_dataset, "foo", H5P_DEFAULT);
-            VERIFY(ret, FAIL, "H5Aopen");
+            ret_id = H5Aopen(my_dataset, "foo", H5P_DEFAULT);
+            VERIFY(ret_id, FAIL, "H5Aopen");
 
-            ret = H5Aopen_by_name(my_dataset, ".", "foo", H5P_DEFAULT, H5P_DEFAULT);
-            VERIFY(ret, FAIL, "H5Aopen_by_name");
+            ret_id = H5Aopen_by_name(my_dataset, ".", "foo", H5P_DEFAULT, H5P_DEFAULT);
+            VERIFY(ret_id, FAIL, "H5Aopen_by_name");
 
-            ret = H5Aopen_by_name(fid, dsetname, "foo", H5P_DEFAULT, H5P_DEFAULT);
-            VERIFY(ret, FAIL, "H5Aopen_by_name");
+            ret_id = H5Aopen_by_name(fid, dsetname, "foo", H5P_DEFAULT, H5P_DEFAULT);
+            VERIFY(ret_id, FAIL, "H5Aopen_by_name");
 
             /* Test opening attributes stored compactly */
             ret = attr_open_check(fid, dsetname, my_dataset, u);
@@ -7798,7 +7804,7 @@ test_attr_create_by_name(hbool_t new_format, hid_t fcpl, hid_t fapl)
     hsize_t     nattrs;         /* Number of attributes on object */
     hsize_t     name_count;     /* # of records in name index */
     hsize_t     corder_count;   /* # of records in creation order index */
-    hbool_t     use_index;      /* Use index on creation order values */
+    unsigned    use_index;      /* Use index on creation order values */
     const char *dsetname;       /* Name of dataset for attributes */
     char	attrname[NAME_BUF_SIZE];    /* Name of attribute */
     unsigned    curr_dset;      /* Current dataset to work on */
@@ -10562,8 +10568,8 @@ test_attr(void)
 {
     hid_t	fapl = (-1), fapl2 = (-1);    /* File access property lists */
     hid_t	fcpl = (-1), fcpl2 = (-1);    /* File creation property lists */
-    hbool_t new_format;         /* Whether to use the new format or not */
-    hbool_t use_shared;         /* Whether to use shared attributes or not */
+    unsigned new_format;        /* Whether to use the new format or not */
+    unsigned use_shared;        /* Whether to use shared attributes or not */
     herr_t ret;                 /* Generic return value */
 
     /* Output message about test being performed */
diff --git a/test/tbogus.h5 b/test/tbogus.h5
index 5b1d85e..875fbd8 100644
Binary files a/test/tbogus.h5 and b/test/tbogus.h5 differ
diff --git a/test/test_filters_be.h5 b/test/test_filters_be.h5
index c4c127b..aadb372 100644
Binary files a/test/test_filters_be.h5 and b/test/test_filters_be.h5 differ
diff --git a/test/test_filters_le.h5 b/test/test_filters_le.h5
index ff8b846..c29fa0a 100644
Binary files a/test/test_filters_le.h5 and b/test/test_filters_le.h5 differ
diff --git a/test/test_plugin.sh.in b/test/test_plugin.sh.in
index a6d8c50..43e76c4 100644
--- a/test/test_plugin.sh.in
+++ b/test/test_plugin.sh.in
@@ -36,7 +36,7 @@ case $(uname) in
     *)
         PLUGIN_LIB1="$FROM_DIR/libdynlib1.* $FROM_DIR/libdynlib3.*"
         PLUGIN_LIB2="$FROM_DIR/libdynlib2.*"
-        ::
+        ;;
 esac
 PLUGIN_LIBDIR1=testdir1
 PLUGIN_LIBDIR2=testdir2
diff --git a/test/test_usecases.sh.in b/test/test_usecases.sh.in
new file mode 100644
index 0000000..b88aee7
--- /dev/null
+++ b/test/test_usecases.sh.in
@@ -0,0 +1,169 @@
+#! /bin/bash
+#
+# Copyright by The HDF Group.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+#
+# Tests the use cases of swmr features.
+#
+# Created:
+#   Albert Cheng, 2013/06/01.
+# Modified:
+#
+
+# This is work in progress.
+# For now, it shows how to run the test cases programs. It only verifies the
+# exit codes are okay (0).
+
+srcdir=@srcdir@
+
+# Check to see if the VFD specified by the HDF5_DRIVER environment variable
+# supports SWMR.
+./swmr_check_compat_vfd
+rc=$?
+if [[ $rc != 0 ]] ; then
+    echo
+    echo "The VFD specified by the HDF5_DRIVER environment variable"
+    echo "does not support SWMR"
+    echo
+    echo "SWMR use case tests skipped"
+    echo
+    exit 0
+fi
+
+# Define symbols
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_VALUE=$EXIT_SUCCESS	# Default all tests succeed
+RESULT_PASSED=" PASSED"
+RESULT_FAILED="*FAILED*"
+RESULT_SKIP="-SKIP-"
+USECASES_PROGRAMS="use_append_chunk use_append_mchunks"
+TESTNAME="Use Case"
+
+# Define variables
+nerrors=0
+verbose=yes
+
+# Source in the output filter function definitions.
+. $srcdir/../bin/output_filter.sh
+
+# Define functions
+# Print a line-line message left justified in a field of 72 characters.
+# Results can be " PASSED", "*FAILED*", "-SKIP-", up to 8 characters
+# wide.
+# SPACES should be at least 71 spaces. ($* + ' ' + 71 + 8 >= 80)
+#
+TESTING() {
+   SPACES="                                                                        "
+   echo "$* $SPACES" | cut -c1-72 | tr -d '\012'
+}
+
+# Run a test and print PASS or *FAIL*.  If a test fails then increment
+# the `nerrors' global variable and (if $verbose is set) display the
+# difference between the actual output and the expected output. The
+# expected output is given as the first argument to this function and
+# the actual output file is calculated by replacing the `.ddl' with
+# `.out'.  The actual output is not removed if $HDF5_NOCLEANUP has a
+# non-zero value.
+# ADD_H5_TEST
+TOOLTEST() {
+    program=$1
+    shift
+
+    actual="$program.out"
+    actual_err="$program.err"
+    actual_sav=${actual}-sav
+    actual_err_sav=${actual_err}-sav
+
+    # Run test.
+    TESTING $program $@
+    (
+      $RUNSERIAL ./$program "$@"
+    ) >$actual 2>$actual_err
+    exit_code=$?
+
+    # save actual and actual_err in case they are needed later.
+    cp $actual $actual_sav
+    STDOUT_FILTER $actual
+    cp $actual_err $actual_err_sav
+    STDERR_FILTER $actual_err
+    cat $actual_err >> $actual
+
+    if [ $exit_code -eq 0 ];then
+	echo "$RESULT_PASSED"
+    else
+	echo "$RESULT_FAILED"
+	nerrors="`expr $nerrors + 1`"
+	test yes = "$verbose" && sed 's/^/    /' < $actual
+    fi
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+	rm -f $actual $actual_err $actual_sav $actual_err_sav $actual_ext
+    fi
+}
+
+# run tests for H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled here temporary
+USECORK=use_disable_mdc_flushes
+for p in $USECORK; do
+    TOOLTEST $p
+    TOOLTEST $p -y 3
+    TOOLTEST $p -n 3000
+    TOOLTEST $p -n 5000
+done
+
+# run write order test here temporary
+WRITEORDER=twriteorder
+for p in $WRITEORDER; do
+    TOOLTEST $p
+    TOOLTEST $p -b 1000
+    TOOLTEST $p -p 3000
+    TOOLTEST $p -n 2000
+    TOOLTEST $p -l w
+    TOOLTEST $p -l r
+done
+
+# Report test results
+if test $nerrors -eq 0 ; then
+    echo "$WRITEORDER test passed."
+else
+    echo "$WRITEORDER test failed with $nerrors errors."
+    EXIT_VALUE=$EXIT_FAILURE
+    nerrors=0           # reset nerror for the regular tests below.
+fi
+
+# main body
+for p in $USECASES_PROGRAMS; do
+    TOOLTEST ./$p
+    TOOLTEST ./$p -z 256
+    tmpfile=/tmp/datatfile.$$
+    TOOLTEST ./$p -f $tmpfile; rm -f $tmpfile
+    TOOLTEST ./$p -l w
+    TOOLTEST ./$p -l r
+    # use case 1.9, testing with multi-planes chunks
+    TOOLTEST ./$p -z 256 -y 5	# 5 planes chunks
+    # cleanup temp datafile
+    if test -z "$HDF5_NOCLEANUP"; then
+	rm -f $p.h5
+    fi
+done
+
+
+# Report test results and exit
+if test $nerrors -eq 0 ; then
+    echo "All $TESTNAME tests passed."
+else
+    echo "$TESTNAME tests failed with $nerrors errors."
+    EXIT_VALUE=$EXIT_FAILURE
+fi
+
+exit $EXIT_VALUE
diff --git a/test/testfiles/plist_files/acpl_32be b/test/testfiles/plist_files/acpl_32be
new file mode 100644
index 0000000..ba342d9
Binary files /dev/null and b/test/testfiles/plist_files/acpl_32be differ
diff --git a/test/testfiles/plist_files/acpl_32le b/test/testfiles/plist_files/acpl_32le
new file mode 100644
index 0000000..ba342d9
Binary files /dev/null and b/test/testfiles/plist_files/acpl_32le differ
diff --git a/test/testfiles/plist_files/acpl_64be b/test/testfiles/plist_files/acpl_64be
new file mode 100644
index 0000000..ba342d9
Binary files /dev/null and b/test/testfiles/plist_files/acpl_64be differ
diff --git a/test/testfiles/plist_files/acpl_64le b/test/testfiles/plist_files/acpl_64le
new file mode 100644
index 0000000..ba342d9
Binary files /dev/null and b/test/testfiles/plist_files/acpl_64le differ
diff --git a/test/testfiles/plist_files/dapl_32be b/test/testfiles/plist_files/dapl_32be
new file mode 100644
index 0000000..4df4e7f
Binary files /dev/null and b/test/testfiles/plist_files/dapl_32be differ
diff --git a/test/testfiles/plist_files/dapl_32le b/test/testfiles/plist_files/dapl_32le
new file mode 100644
index 0000000..4df4e7f
Binary files /dev/null and b/test/testfiles/plist_files/dapl_32le differ
diff --git a/test/testfiles/plist_files/dapl_64be b/test/testfiles/plist_files/dapl_64be
new file mode 100644
index 0000000..4df4e7f
Binary files /dev/null and b/test/testfiles/plist_files/dapl_64be differ
diff --git a/test/testfiles/plist_files/dapl_64le b/test/testfiles/plist_files/dapl_64le
new file mode 100644
index 0000000..4df4e7f
Binary files /dev/null and b/test/testfiles/plist_files/dapl_64le differ
diff --git a/test/testfiles/plist_files/dcpl_32be b/test/testfiles/plist_files/dcpl_32be
new file mode 100644
index 0000000..667c67f
Binary files /dev/null and b/test/testfiles/plist_files/dcpl_32be differ
diff --git a/test/testfiles/plist_files/dcpl_32le b/test/testfiles/plist_files/dcpl_32le
new file mode 100644
index 0000000..667c67f
Binary files /dev/null and b/test/testfiles/plist_files/dcpl_32le differ
diff --git a/test/testfiles/plist_files/dcpl_64be b/test/testfiles/plist_files/dcpl_64be
new file mode 100644
index 0000000..667c67f
Binary files /dev/null and b/test/testfiles/plist_files/dcpl_64be differ
diff --git a/test/testfiles/plist_files/dcpl_64le b/test/testfiles/plist_files/dcpl_64le
new file mode 100644
index 0000000..667c67f
Binary files /dev/null and b/test/testfiles/plist_files/dcpl_64le differ
diff --git a/test/testfiles/plist_files/def_acpl_32be b/test/testfiles/plist_files/def_acpl_32be
new file mode 100644
index 0000000..efd8168
Binary files /dev/null and b/test/testfiles/plist_files/def_acpl_32be differ
diff --git a/test/testfiles/plist_files/def_acpl_32le b/test/testfiles/plist_files/def_acpl_32le
new file mode 100644
index 0000000..efd8168
Binary files /dev/null and b/test/testfiles/plist_files/def_acpl_32le differ
diff --git a/test/testfiles/plist_files/def_acpl_64be b/test/testfiles/plist_files/def_acpl_64be
new file mode 100644
index 0000000..efd8168
Binary files /dev/null and b/test/testfiles/plist_files/def_acpl_64be differ
diff --git a/test/testfiles/plist_files/def_acpl_64le b/test/testfiles/plist_files/def_acpl_64le
new file mode 100644
index 0000000..efd8168
Binary files /dev/null and b/test/testfiles/plist_files/def_acpl_64le differ
diff --git a/test/testfiles/plist_files/def_dapl_32be b/test/testfiles/plist_files/def_dapl_32be
new file mode 100644
index 0000000..c9b7ea9
Binary files /dev/null and b/test/testfiles/plist_files/def_dapl_32be differ
diff --git a/test/testfiles/plist_files/def_dapl_32le b/test/testfiles/plist_files/def_dapl_32le
new file mode 100644
index 0000000..c9b7ea9
Binary files /dev/null and b/test/testfiles/plist_files/def_dapl_32le differ
diff --git a/test/testfiles/plist_files/def_dapl_64be b/test/testfiles/plist_files/def_dapl_64be
new file mode 100644
index 0000000..c9b7ea9
Binary files /dev/null and b/test/testfiles/plist_files/def_dapl_64be differ
diff --git a/test/testfiles/plist_files/def_dapl_64le b/test/testfiles/plist_files/def_dapl_64le
new file mode 100644
index 0000000..c9b7ea9
Binary files /dev/null and b/test/testfiles/plist_files/def_dapl_64le differ
diff --git a/test/testfiles/plist_files/def_dcpl_32be b/test/testfiles/plist_files/def_dcpl_32be
new file mode 100644
index 0000000..01b233c
Binary files /dev/null and b/test/testfiles/plist_files/def_dcpl_32be differ
diff --git a/test/testfiles/plist_files/def_dcpl_32le b/test/testfiles/plist_files/def_dcpl_32le
new file mode 100644
index 0000000..01b233c
Binary files /dev/null and b/test/testfiles/plist_files/def_dcpl_32le differ
diff --git a/test/testfiles/plist_files/def_dcpl_64be b/test/testfiles/plist_files/def_dcpl_64be
new file mode 100644
index 0000000..01b233c
Binary files /dev/null and b/test/testfiles/plist_files/def_dcpl_64be differ
diff --git a/test/testfiles/plist_files/def_dcpl_64le b/test/testfiles/plist_files/def_dcpl_64le
new file mode 100644
index 0000000..01b233c
Binary files /dev/null and b/test/testfiles/plist_files/def_dcpl_64le differ
diff --git a/test/testfiles/plist_files/def_dxpl_32be b/test/testfiles/plist_files/def_dxpl_32be
new file mode 100644
index 0000000..b13f456
Binary files /dev/null and b/test/testfiles/plist_files/def_dxpl_32be differ
diff --git a/test/testfiles/plist_files/def_dxpl_32le b/test/testfiles/plist_files/def_dxpl_32le
new file mode 100644
index 0000000..b13f456
Binary files /dev/null and b/test/testfiles/plist_files/def_dxpl_32le differ
diff --git a/test/testfiles/plist_files/def_dxpl_64be b/test/testfiles/plist_files/def_dxpl_64be
new file mode 100644
index 0000000..b13f456
Binary files /dev/null and b/test/testfiles/plist_files/def_dxpl_64be differ
diff --git a/test/testfiles/plist_files/def_dxpl_64le b/test/testfiles/plist_files/def_dxpl_64le
new file mode 100644
index 0000000..b13f456
Binary files /dev/null and b/test/testfiles/plist_files/def_dxpl_64le differ
diff --git a/test/testfiles/plist_files/def_fapl_32be b/test/testfiles/plist_files/def_fapl_32be
new file mode 100644
index 0000000..6b6baee
Binary files /dev/null and b/test/testfiles/plist_files/def_fapl_32be differ
diff --git a/test/testfiles/plist_files/def_fapl_32le b/test/testfiles/plist_files/def_fapl_32le
new file mode 100644
index 0000000..6b6baee
Binary files /dev/null and b/test/testfiles/plist_files/def_fapl_32le differ
diff --git a/test/testfiles/plist_files/def_fapl_64be b/test/testfiles/plist_files/def_fapl_64be
new file mode 100644
index 0000000..6b6baee
Binary files /dev/null and b/test/testfiles/plist_files/def_fapl_64be differ
diff --git a/test/testfiles/plist_files/def_fapl_64le b/test/testfiles/plist_files/def_fapl_64le
new file mode 100644
index 0000000..6b6baee
Binary files /dev/null and b/test/testfiles/plist_files/def_fapl_64le differ
diff --git a/test/testfiles/plist_files/def_fcpl_32be b/test/testfiles/plist_files/def_fcpl_32be
new file mode 100644
index 0000000..38dec23
Binary files /dev/null and b/test/testfiles/plist_files/def_fcpl_32be differ
diff --git a/test/testfiles/plist_files/def_fcpl_32le b/test/testfiles/plist_files/def_fcpl_32le
new file mode 100644
index 0000000..38dec23
Binary files /dev/null and b/test/testfiles/plist_files/def_fcpl_32le differ
diff --git a/test/testfiles/plist_files/def_fcpl_64be b/test/testfiles/plist_files/def_fcpl_64be
new file mode 100644
index 0000000..38dec23
Binary files /dev/null and b/test/testfiles/plist_files/def_fcpl_64be differ
diff --git a/test/testfiles/plist_files/def_fcpl_64le b/test/testfiles/plist_files/def_fcpl_64le
new file mode 100644
index 0000000..38dec23
Binary files /dev/null and b/test/testfiles/plist_files/def_fcpl_64le differ
diff --git a/test/testfiles/plist_files/def_gcpl_32be b/test/testfiles/plist_files/def_gcpl_32be
new file mode 100644
index 0000000..2b5a0cc
Binary files /dev/null and b/test/testfiles/plist_files/def_gcpl_32be differ
diff --git a/test/testfiles/plist_files/def_gcpl_32le b/test/testfiles/plist_files/def_gcpl_32le
new file mode 100644
index 0000000..2b5a0cc
Binary files /dev/null and b/test/testfiles/plist_files/def_gcpl_32le differ
diff --git a/test/testfiles/plist_files/def_gcpl_64be b/test/testfiles/plist_files/def_gcpl_64be
new file mode 100644
index 0000000..2b5a0cc
Binary files /dev/null and b/test/testfiles/plist_files/def_gcpl_64be differ
diff --git a/test/testfiles/plist_files/def_gcpl_64le b/test/testfiles/plist_files/def_gcpl_64le
new file mode 100644
index 0000000..2b5a0cc
Binary files /dev/null and b/test/testfiles/plist_files/def_gcpl_64le differ
diff --git a/test/testfiles/plist_files/def_lapl_32be b/test/testfiles/plist_files/def_lapl_32be
new file mode 100644
index 0000000..9cc0e96
Binary files /dev/null and b/test/testfiles/plist_files/def_lapl_32be differ
diff --git a/test/testfiles/plist_files/def_lapl_32le b/test/testfiles/plist_files/def_lapl_32le
new file mode 100644
index 0000000..9cc0e96
Binary files /dev/null and b/test/testfiles/plist_files/def_lapl_32le differ
diff --git a/test/testfiles/plist_files/def_lapl_64be b/test/testfiles/plist_files/def_lapl_64be
new file mode 100644
index 0000000..9cc0e96
Binary files /dev/null and b/test/testfiles/plist_files/def_lapl_64be differ
diff --git a/test/testfiles/plist_files/def_lapl_64le b/test/testfiles/plist_files/def_lapl_64le
new file mode 100644
index 0000000..9cc0e96
Binary files /dev/null and b/test/testfiles/plist_files/def_lapl_64le differ
diff --git a/test/testfiles/plist_files/def_lcpl_32be b/test/testfiles/plist_files/def_lcpl_32be
new file mode 100644
index 0000000..a02d26b
Binary files /dev/null and b/test/testfiles/plist_files/def_lcpl_32be differ
diff --git a/test/testfiles/plist_files/def_lcpl_32le b/test/testfiles/plist_files/def_lcpl_32le
new file mode 100644
index 0000000..a02d26b
Binary files /dev/null and b/test/testfiles/plist_files/def_lcpl_32le differ
diff --git a/test/testfiles/plist_files/def_lcpl_64be b/test/testfiles/plist_files/def_lcpl_64be
new file mode 100644
index 0000000..a02d26b
Binary files /dev/null and b/test/testfiles/plist_files/def_lcpl_64be differ
diff --git a/test/testfiles/plist_files/def_lcpl_64le b/test/testfiles/plist_files/def_lcpl_64le
new file mode 100644
index 0000000..a02d26b
Binary files /dev/null and b/test/testfiles/plist_files/def_lcpl_64le differ
diff --git a/test/testfiles/plist_files/def_ocpl_32be b/test/testfiles/plist_files/def_ocpl_32be
new file mode 100644
index 0000000..73b5ae0
Binary files /dev/null and b/test/testfiles/plist_files/def_ocpl_32be differ
diff --git a/test/testfiles/plist_files/def_ocpl_32le b/test/testfiles/plist_files/def_ocpl_32le
new file mode 100644
index 0000000..73b5ae0
Binary files /dev/null and b/test/testfiles/plist_files/def_ocpl_32le differ
diff --git a/test/testfiles/plist_files/def_ocpl_64be b/test/testfiles/plist_files/def_ocpl_64be
new file mode 100644
index 0000000..73b5ae0
Binary files /dev/null and b/test/testfiles/plist_files/def_ocpl_64be differ
diff --git a/test/testfiles/plist_files/def_ocpl_64le b/test/testfiles/plist_files/def_ocpl_64le
new file mode 100644
index 0000000..73b5ae0
Binary files /dev/null and b/test/testfiles/plist_files/def_ocpl_64le differ
diff --git a/test/testfiles/plist_files/def_ocpypl_32be b/test/testfiles/plist_files/def_ocpypl_32be
new file mode 100644
index 0000000..1ce6360
Binary files /dev/null and b/test/testfiles/plist_files/def_ocpypl_32be differ
diff --git a/test/testfiles/plist_files/def_ocpypl_32le b/test/testfiles/plist_files/def_ocpypl_32le
new file mode 100644
index 0000000..1ce6360
Binary files /dev/null and b/test/testfiles/plist_files/def_ocpypl_32le differ
diff --git a/test/testfiles/plist_files/def_ocpypl_64be b/test/testfiles/plist_files/def_ocpypl_64be
new file mode 100644
index 0000000..1ce6360
Binary files /dev/null and b/test/testfiles/plist_files/def_ocpypl_64be differ
diff --git a/test/testfiles/plist_files/def_ocpypl_64le b/test/testfiles/plist_files/def_ocpypl_64le
new file mode 100644
index 0000000..1ce6360
Binary files /dev/null and b/test/testfiles/plist_files/def_ocpypl_64le differ
diff --git a/test/testfiles/plist_files/def_strcpl_32be b/test/testfiles/plist_files/def_strcpl_32be
new file mode 100644
index 0000000..986c591
Binary files /dev/null and b/test/testfiles/plist_files/def_strcpl_32be differ
diff --git a/test/testfiles/plist_files/def_strcpl_32le b/test/testfiles/plist_files/def_strcpl_32le
new file mode 100644
index 0000000..986c591
Binary files /dev/null and b/test/testfiles/plist_files/def_strcpl_32le differ
diff --git a/test/testfiles/plist_files/def_strcpl_64be b/test/testfiles/plist_files/def_strcpl_64be
new file mode 100644
index 0000000..986c591
Binary files /dev/null and b/test/testfiles/plist_files/def_strcpl_64be differ
diff --git a/test/testfiles/plist_files/def_strcpl_64le b/test/testfiles/plist_files/def_strcpl_64le
new file mode 100644
index 0000000..986c591
Binary files /dev/null and b/test/testfiles/plist_files/def_strcpl_64le differ
diff --git a/test/testfiles/plist_files/dxpl_32be b/test/testfiles/plist_files/dxpl_32be
new file mode 100644
index 0000000..5ff2ea0
Binary files /dev/null and b/test/testfiles/plist_files/dxpl_32be differ
diff --git a/test/testfiles/plist_files/dxpl_32le b/test/testfiles/plist_files/dxpl_32le
new file mode 100644
index 0000000..5ff2ea0
Binary files /dev/null and b/test/testfiles/plist_files/dxpl_32le differ
diff --git a/test/testfiles/plist_files/dxpl_64be b/test/testfiles/plist_files/dxpl_64be
new file mode 100644
index 0000000..5ff2ea0
Binary files /dev/null and b/test/testfiles/plist_files/dxpl_64be differ
diff --git a/test/testfiles/plist_files/dxpl_64le b/test/testfiles/plist_files/dxpl_64le
new file mode 100644
index 0000000..5ff2ea0
Binary files /dev/null and b/test/testfiles/plist_files/dxpl_64le differ
diff --git a/test/testfiles/plist_files/fapl_32be b/test/testfiles/plist_files/fapl_32be
new file mode 100644
index 0000000..65e2070
Binary files /dev/null and b/test/testfiles/plist_files/fapl_32be differ
diff --git a/test/testfiles/plist_files/fapl_32le b/test/testfiles/plist_files/fapl_32le
new file mode 100644
index 0000000..65e2070
Binary files /dev/null and b/test/testfiles/plist_files/fapl_32le differ
diff --git a/test/testfiles/plist_files/fapl_64be b/test/testfiles/plist_files/fapl_64be
new file mode 100644
index 0000000..65e2070
Binary files /dev/null and b/test/testfiles/plist_files/fapl_64be differ
diff --git a/test/testfiles/plist_files/fapl_64le b/test/testfiles/plist_files/fapl_64le
new file mode 100644
index 0000000..65e2070
Binary files /dev/null and b/test/testfiles/plist_files/fapl_64le differ
diff --git a/test/testfiles/plist_files/fcpl_32be b/test/testfiles/plist_files/fcpl_32be
new file mode 100644
index 0000000..ffa5242
Binary files /dev/null and b/test/testfiles/plist_files/fcpl_32be differ
diff --git a/test/testfiles/plist_files/fcpl_32le b/test/testfiles/plist_files/fcpl_32le
new file mode 100644
index 0000000..ffa5242
Binary files /dev/null and b/test/testfiles/plist_files/fcpl_32le differ
diff --git a/test/testfiles/plist_files/fcpl_64be b/test/testfiles/plist_files/fcpl_64be
new file mode 100644
index 0000000..ffa5242
Binary files /dev/null and b/test/testfiles/plist_files/fcpl_64be differ
diff --git a/test/testfiles/plist_files/fcpl_64le b/test/testfiles/plist_files/fcpl_64le
new file mode 100644
index 0000000..ffa5242
Binary files /dev/null and b/test/testfiles/plist_files/fcpl_64le differ
diff --git a/test/testfiles/plist_files/gcpl_32be b/test/testfiles/plist_files/gcpl_32be
new file mode 100644
index 0000000..1eec32c
Binary files /dev/null and b/test/testfiles/plist_files/gcpl_32be differ
diff --git a/test/testfiles/plist_files/gcpl_32le b/test/testfiles/plist_files/gcpl_32le
new file mode 100644
index 0000000..1eec32c
Binary files /dev/null and b/test/testfiles/plist_files/gcpl_32le differ
diff --git a/test/testfiles/plist_files/gcpl_64be b/test/testfiles/plist_files/gcpl_64be
new file mode 100644
index 0000000..1eec32c
Binary files /dev/null and b/test/testfiles/plist_files/gcpl_64be differ
diff --git a/test/testfiles/plist_files/gcpl_64le b/test/testfiles/plist_files/gcpl_64le
new file mode 100644
index 0000000..1eec32c
Binary files /dev/null and b/test/testfiles/plist_files/gcpl_64le differ
diff --git a/test/testfiles/plist_files/lapl_32be b/test/testfiles/plist_files/lapl_32be
new file mode 100644
index 0000000..e9f43e2
Binary files /dev/null and b/test/testfiles/plist_files/lapl_32be differ
diff --git a/test/testfiles/plist_files/lapl_32le b/test/testfiles/plist_files/lapl_32le
new file mode 100644
index 0000000..e9f43e2
Binary files /dev/null and b/test/testfiles/plist_files/lapl_32le differ
diff --git a/test/testfiles/plist_files/lapl_64be b/test/testfiles/plist_files/lapl_64be
new file mode 100644
index 0000000..e9f43e2
Binary files /dev/null and b/test/testfiles/plist_files/lapl_64be differ
diff --git a/test/testfiles/plist_files/lapl_64le b/test/testfiles/plist_files/lapl_64le
new file mode 100644
index 0000000..e9f43e2
Binary files /dev/null and b/test/testfiles/plist_files/lapl_64le differ
diff --git a/test/testfiles/plist_files/lcpl_32be b/test/testfiles/plist_files/lcpl_32be
new file mode 100644
index 0000000..4584e5c
Binary files /dev/null and b/test/testfiles/plist_files/lcpl_32be differ
diff --git a/test/testfiles/plist_files/lcpl_32le b/test/testfiles/plist_files/lcpl_32le
new file mode 100644
index 0000000..4584e5c
Binary files /dev/null and b/test/testfiles/plist_files/lcpl_32le differ
diff --git a/test/testfiles/plist_files/lcpl_64be b/test/testfiles/plist_files/lcpl_64be
new file mode 100644
index 0000000..4584e5c
Binary files /dev/null and b/test/testfiles/plist_files/lcpl_64be differ
diff --git a/test/testfiles/plist_files/lcpl_64le b/test/testfiles/plist_files/lcpl_64le
new file mode 100644
index 0000000..4584e5c
Binary files /dev/null and b/test/testfiles/plist_files/lcpl_64le differ
diff --git a/test/testfiles/plist_files/ocpl_32be b/test/testfiles/plist_files/ocpl_32be
new file mode 100644
index 0000000..bc46636
Binary files /dev/null and b/test/testfiles/plist_files/ocpl_32be differ
diff --git a/test/testfiles/plist_files/ocpl_32le b/test/testfiles/plist_files/ocpl_32le
new file mode 100644
index 0000000..bc46636
Binary files /dev/null and b/test/testfiles/plist_files/ocpl_32le differ
diff --git a/test/testfiles/plist_files/ocpl_64be b/test/testfiles/plist_files/ocpl_64be
new file mode 100644
index 0000000..bc46636
Binary files /dev/null and b/test/testfiles/plist_files/ocpl_64be differ
diff --git a/test/testfiles/plist_files/ocpl_64le b/test/testfiles/plist_files/ocpl_64le
new file mode 100644
index 0000000..bc46636
Binary files /dev/null and b/test/testfiles/plist_files/ocpl_64le differ
diff --git a/test/testfiles/plist_files/ocpypl_32be b/test/testfiles/plist_files/ocpypl_32be
new file mode 100644
index 0000000..a0d826d
Binary files /dev/null and b/test/testfiles/plist_files/ocpypl_32be differ
diff --git a/test/testfiles/plist_files/ocpypl_32le b/test/testfiles/plist_files/ocpypl_32le
new file mode 100644
index 0000000..a0d826d
Binary files /dev/null and b/test/testfiles/plist_files/ocpypl_32le differ
diff --git a/test/testfiles/plist_files/ocpypl_64be b/test/testfiles/plist_files/ocpypl_64be
new file mode 100644
index 0000000..a0d826d
Binary files /dev/null and b/test/testfiles/plist_files/ocpypl_64be differ
diff --git a/test/testfiles/plist_files/ocpypl_64le b/test/testfiles/plist_files/ocpypl_64le
new file mode 100644
index 0000000..a0d826d
Binary files /dev/null and b/test/testfiles/plist_files/ocpypl_64le differ
diff --git a/test/testfiles/plist_files/strcpl_32be b/test/testfiles/plist_files/strcpl_32be
new file mode 100644
index 0000000..4190a63
Binary files /dev/null and b/test/testfiles/plist_files/strcpl_32be differ
diff --git a/test/testfiles/plist_files/strcpl_32le b/test/testfiles/plist_files/strcpl_32le
new file mode 100644
index 0000000..4190a63
Binary files /dev/null and b/test/testfiles/plist_files/strcpl_32le differ
diff --git a/test/testfiles/plist_files/strcpl_64be b/test/testfiles/plist_files/strcpl_64be
new file mode 100644
index 0000000..4190a63
Binary files /dev/null and b/test/testfiles/plist_files/strcpl_64be differ
diff --git a/test/testfiles/plist_files/strcpl_64le b/test/testfiles/plist_files/strcpl_64le
new file mode 100644
index 0000000..4190a63
Binary files /dev/null and b/test/testfiles/plist_files/strcpl_64le differ
diff --git a/test/testflushrefresh.sh.in b/test/testflushrefresh.sh.in
new file mode 100644
index 0000000..e7593e3
--- /dev/null
+++ b/test/testflushrefresh.sh.in
@@ -0,0 +1,196 @@
+#! /bin/sh
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+#
+#
+# Test script for the flush/evict single objects feature.
+#
+# This test file doesn't actually perform any tests, rather, it acts
+# as a process manager for the 'flushrefresh' test file, which is where
+# the tests are actually housed. The reason this script exists is because
+# the verification of this feature needs to occur in separate processes
+# from the one in which the file is being manipulated in. (i.e., we have
+# a single writer process, and various reader processes spawning off
+# and doing the verification that individual objects are being 
+# correctly flushed).
+#
+# Programmer:
+#   Mike McGreevy
+#   Tuesday, July 20, 2010
+
+###############################################################################
+## test variables
+###############################################################################
+
+# Number of errors encountered during test run.
+nerrors=0
+
+# Set up a function to check the current time since the epoch - ideally, we'd
+# like to use Perl. If it wasn't detected by configure, then use date, though
+# this is less portable and might cause problems on machines that don't
+# recognize the +%s option (like Solaris).
+#
+# Note that PERL will resolve to true or false, not a path.
+PERL=@PERL@
+if test -n "$PERL"; then
+    TimeStamp()
+    {
+        time=`perl -e 'print int(time)'`
+        echo "$time"
+    }
+else
+    TimeStamp()
+    {
+        time=`date +%s`
+        echo "$time"
+    }
+fi
+
+###############################################################################
+## Main
+###############################################################################
+# The build (current) directory might be different than the source directory.
+if test -z "$srcdir"; then
+   srcdir=.
+fi
+
+# Check to see if the VFD specified by the HDF5_DRIVER environment variable
+# supports SWMR.
+./swmr_check_compat_vfd
+rc=$?
+if [ $rc -ne 0 ] ; then
+    echo
+    echo "The VFD specified by the HDF5_DRIVER environment variable"
+    echo "does not support SWMR."
+    echo
+    echo "flush/refresh tests skipped"
+    echo
+    exit 0
+fi
+
+# ========================
+# Launch the Test Program.
+# ========================
+./flushrefresh &
+pid_main=$!
+
+# =================================================
+# Set up/initialize some variables to be used later 
+# =================================================
+startsignal=flushrefresh_VERIFICATION_START
+endsignal=flushrefresh_VERIFICATION_DONE
+timeout_length=300
+timedout=0
+verification_done=0
+
+# =======================================
+# Run flush verification on test program.
+# =======================================
+
+until [ $verification_done -eq 1 ]; do
+   
+  # Wait for signal from test program that verification routine can run.
+  before=`TimeStamp`
+  until [ -s $startsignal ]; do
+    after=`TimeStamp`
+    timediff=`expr $after - $before`
+    if [ $timediff -gt $timeout_length ]; then   
+        nerrors=`expr $nerrors + 1`
+        timedout=1
+        break
+    fi
+  done
+
+  # Check to see if we timed out looking for the signal before continuing.
+  if [ $timedout -gt 0 ]; then
+    echo timed out waiting for signal from test program.
+    break
+  fi
+
+  # Read in test routine parameters from signal file, then delete signal file.
+  param1=`head -1 $startsignal`
+  param2=`tail -1 $startsignal`
+  rm $startsignal
+
+  # Check if we're done with verifications, otherwise run the specified verification.
+  if [ "$param1" = "VERIFICATION_DONE" ]; then
+    verification_done=1
+    echo "all flush verification complete" > $endsignal
+  else
+    ./flushrefresh $param1 $param2
+    echo "verification flush process done" > $endsignal
+  fi
+
+done
+
+# =========================================
+# Run refresh verification on test program.
+# =========================================
+if [ $timedout -eq 0 ]; then
+  until [ $verification_done -eq 2 ]; do
+
+    # Wait for signal from test program that verification routine can run.
+    before=`TimeStamp`
+    until [ -s $startsignal ]; do
+      after=`TimeStamp`
+      timediff=`expr $after - $before`
+      if [ $timediff -gt $timeout_length ]; then   
+          nerrors=`expr $nerrors + 1`
+          timedout=1
+          break
+      fi
+    done
+
+    # Check to see if we timed out looking for the signal before continuing.
+    if [ $timedout -gt 0 ]; then
+      echo timed out waiting for signal from test program.
+      break
+    fi
+
+    # Read in test routine parameter from signal file, then delete signal file.
+    param1=`head -n 1 $startsignal`
+    rm $startsignal
+
+    # Check if we're done with verifications, otherwise run the specified verification.
+    if [ "$param1" = "VERIFICATION_DONE" ]; then
+      verification_done=2
+      echo "all refresh verification complete" > $endsignal
+    else
+      ./flushrefresh $param1
+      echo "refresh verifiction process done" > $endsignal
+    fi
+
+  done
+fi
+
+# ============================================
+# Wait for main to finish up, and end testing.
+# ============================================
+wait $pid_main
+if test $? -ne 0; then
+    echo flushrefresh had error
+    nerrors=`expr $nerrors + 1`
+fi
+
+###############################################################################
+## Report and exit
+###############################################################################
+
+if test $nerrors -eq 0 ; then
+    echo "flush/refresh objects tests passed."
+    exit 0
+else
+    echo "flush/refresh objects tests failed with $nerrors errors."
+    exit 1
+fi
diff --git a/test/testframe.c b/test/testframe.c
index 6a878da..daa27c5 100644
--- a/test/testframe.c
+++ b/test/testframe.c
@@ -49,8 +49,6 @@ int TestVerbosity = VERBO_DEF;       /* Default Verbosity is Low */
 static int Summary = 0;		/* Show test summary. Default is no. */
 static int CleanUp = 1;		/* Do cleanup or not. Default is yes. */
 static int TestExpress = -1;	/* Do TestExpress or not. -1 means not set yet. */
-static H5E_auto_t	*PrintErrorStackFunc;
-static void		**PrintErrorStackData;
 static TestStruct Test[MAXNUMOFTESTS];
 static int    Index = 0;
 static const void *Test_parameters = NULL;
@@ -128,14 +126,12 @@ AddTest(const char *TheName, void (*TheCall) (void), void (*Cleanup) (void), con
  */
 void TestInit(const char *ProgName, void (*private_usage)(void), int (*private_parser)(int ac, char *av[]))
 {
-    /* Save error printing settings */
-    H5Eget_auto2(H5E_DEFAULT, PrintErrorStackFunc, PrintErrorStackData);
     /*
      * Turn off automatic error reporting since we do it ourselves.  Besides,
      * half the functions this test calls are private, so automatic error
      * reporting wouldn't do much good since it's triggered at the API layer.
      */
-    PrintErrorStackOff();
+    H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
 
     /*
      * Record the program name and private routines if provided.
@@ -217,6 +213,7 @@ void TestInfo(const char *ProgName)
  */
 void TestParseCmdLine(int argc, char *argv[])
 {
+    hbool_t skipped_all = FALSE;
     int ret_code;
 
     while (argv++, --argc > 0){
@@ -252,14 +249,20 @@ void TestParseCmdLine(int argc, char *argv[])
 	}
 	else if (((HDstrcmp(*argv, "-only") == 0) ||
 				    (HDstrcmp(*argv, "-o") == 0))) {
-	    if (argc > 0){
+	    if(argc > 0) {
 		int Loop;
+
 		--argc; ++argv;
+
 		/* Skip all tests, then activate only one. */
-		for (Loop = 0; Loop < Index; Loop++)
-		    Test[Loop].SkipFlag = 1;
+                if(!skipped_all) {
+                    for(Loop = 0; Loop < Index; Loop++)
+                        Test[Loop].SkipFlag = 1;
+                    skipped_all = TRUE;
+                } /* end if */
 		SetTest(*argv, ONLYTEST);
-	    }else{
+	    } /* end if */
+            else {
 		TestUsage();
 		exit(EXIT_FAILURE);
 	    }
@@ -552,6 +555,7 @@ TestErrPrintf(const char *format, ...)
 void SetTest(const char *testname, int action)
 {
     int Loop;
+
     switch (action){
 	case SKIPTEST:
 	    for (Loop = 0; Loop < Index; Loop++)
@@ -573,17 +577,12 @@ void SetTest(const char *testname, int action)
 	    break;
 	case ONLYTEST:
 	    for (Loop = 0; Loop < Index; Loop++) {
-		if (HDstrcmp(testname, Test[Loop].Name) != 0)
-		    Test[Loop].SkipFlag = 1;
-		else {
+		if (HDstrcmp(testname, Test[Loop].Name) == 0) {
 		    /* Found it. Set it to run. Break to skip the rest. */
 		    Test[Loop].SkipFlag = 0;
 		    break;
 		}
 	    }
-	    /* skip the rest */
-	    while (++Loop < Index)
-		Test[Loop].SkipFlag = 1;
 	    break;
 	default:
 	    /* error */
@@ -609,19 +608,3 @@ void TestAlarmOn(void)
     HDalarm((unsigned)alarm_sec);
 }
 
-

-/*
- * Enable error stack printing when errors occur.
- */
-void PrintErrorStackOn(void)
-{
-    H5Eset_auto2(H5E_DEFAULT, PrintErrorStackFunc, PrintErrorStackData);
-}
-
-/*
- * Disable error stack printing when errors occur.
- */
-void PrintErrorStackOff(void)
-{
-    H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
-}
diff --git a/test/testlinks_env.sh.in b/test/testlinks_env.sh.in
index 04dfa62..7120430 100644
--- a/test/testlinks_env.sh.in
+++ b/test/testlinks_env.sh.in
@@ -32,6 +32,7 @@ TEST_BIN=`pwd`/$TEST_NAME 	# The path of the test binary
 ENVCMD="env HDF5_EXT_PREFIX=.:tmp" 	# The environment variable & value
 #
 # Run the test
+echo "$ENVCMD $RUNSERIAL $TEST_BIN"
 $ENVCMD $RUNSERIAL $TEST_BIN
 exitcode=$?
 if [ $exitcode -eq 0 ]; then
diff --git a/test/testswmr.sh.in b/test/testswmr.sh.in
new file mode 100644
index 0000000..5165fd1
--- /dev/null
+++ b/test/testswmr.sh.in
@@ -0,0 +1,497 @@
+#! /bin/bash
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+#
+# Tests for the swmr feature.
+#
+# Created:
+#   Albert Cheng, 2009/07/22
+
+srcdir=@srcdir@
+
+###############################################################################
+## test parameters
+###############################################################################
+
+Nreaders=5              # number of readers to launch
+Nrdrs_spa=3             # number of sparse readers to launch
+Nrecords=200000         # number of records to write
+Nrecs_rem=40000         # number of times to shrink
+Nrecs_spa=20000         # number of records to write in the sparse test
+Nsecs_add=5             # number of seconds per read interval
+Nsecs_rem=3             # number of seconds per read interval
+Nsecs_addrem=8          # number of seconds per read interval
+nerrors=0
+
+###############################################################################
+## definitions for message file to coordinate test runs
+###############################################################################
+WRITER_MESSAGE=SWMR_WRITER_MESSAGE      # The message file created by writer that the open is complete
+                                        # This should be the same as the define in "./swmr_common.h"
+MESSAGE_TIMEOUT=300                     # Message timeout length in secs
+                                        # This should be the same as the define in "./h5test.h"
+
+###############################################################################
+## short hands and function definitions
+###############################################################################
+DPRINT=:                # Set to "echo Debug:" for debugging printing,
+                        # else ":" for noop.
+IFDEBUG=:               # Set to null to turn on debugging, else ":" for noop.
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Testing".
+#
+TESTING() {
+   SPACES="                                                               "
+   echo "Testing $* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+# To wait for the writer message file or till the maximum # of seconds is reached
+# $1 is the message file to wait for
+# This performs similar function as the routine h5_wait_message() in test/h5test.c
+WAIT_MESSAGE() {
+    message=$1                                  # Get the name of the message file to wait for
+    t0=`date +%s`                               # Get current time in seconds
+    difft=0                                     # Initialize the time difference
+    mexist=0                                    # Indicate whether the message file is found
+    while [ $difft -lt $MESSAGE_TIMEOUT ] ;     # Loop till message times out
+    do
+        t1=`date +%s`                           # Get current time in seconds
+        difft=`expr $t1 - $t0`                  # Calculate the time difference
+        if [ -e $message ]; then                # If message file is found:
+            mexist=1                            #       indicate the message file is found
+            rm $message                         #       remove the message file
+            break                               #       get out of the while loop
+        fi
+    done;
+    if test $mexist -eq 0; then
+        # Issue warning that the writer message file is not found, continue with launching the reader(s)
+        echo warning: $WRITER_MESSAGE is not found after waiting $MESSAGE_TIMEOUT seconds
+    else
+        echo $WRITER_MESSAGE is found
+    fi
+}
+
+###############################################################################
+## Main
+##
+## Modifications:
+##   Vailin Choi; July 2013
+##     Add waiting of message file before launching the reader(s).
+##     Due to the implementation of file locking, coordination
+##     is needed in file opening for the writer/reader tests
+##     to proceed as expected.
+##
+###############################################################################
+# The build (current) directory might be different than the source directory.
+if test -z "$srcdir"; then
+   srcdir=.
+fi
+
+# Check to see if the VFD specified by the HDF5_DRIVER environment variable
+# supports SWMR.
+./swmr_check_compat_vfd
+rc=$?
+if [ $rc -ne 0 ] ; then
+    echo
+    echo "The VFD specified by the HDF5_DRIVER environment variable"
+    echo "does not support SWMR."
+    echo
+    echo "SWMR acceptance tests skipped"
+    echo
+    exit 0
+fi
+
+# Parse options (none accepted at this time)
+while [ $# -gt 0 ]; do
+    case "$1" in
+    *)  # unknown option
+        echo "$0: Unknown option ($1)"
+        exit 1
+        ;;
+    esac
+done
+
+# Loop over index types
+for index_type in "-i ea" "-i b2" 
+do
+    # Try with and without compression
+    for compress in "" "-c 5"
+    do
+        echo
+        echo "###############################################################################"
+        echo "## Generator test"
+        echo "###############################################################################"
+        # Launch the Generator without SWMR_WRITE
+        echo launch the swmr_generator
+        ./swmr_generator $compress $index_type
+        if test $? -ne 0; then
+            echo generator had error
+            nerrors=`expr $nerrors + 1`
+        fi
+
+        # Launch the Generator with SWMR_WRITE
+        echo launch the swmr_generator with SWMR_WRITE
+        ./swmr_generator -s $compress $index_type
+        if test $? -ne 0; then
+            echo generator had error
+            nerrors=`expr $nerrors + 1`
+        fi
+
+        # Check for error and exit if one occured
+        $DPRINT nerrors=$nerrors
+        if test $nerrors -ne 0 ; then
+            echo "SWMR tests failed with $nerrors errors."
+            exit 1
+        fi
+
+        echo
+        echo "###############################################################################"
+        echo "## Use H5Fstart_swmr_write() to enable SWMR writing mode"
+        echo "###############################################################################"
+
+	# Remove any possible writer message file before launching writer
+        rm -f $WRITER_MESSAGE
+        #
+        # Launch the Writer
+        echo launch the swmr_start_writer
+        seed="" # Put -r <random seed> command here
+        ./swmr_start_write $compress $index_type $Nrecords $seed &
+        pid_writer=$!
+        $DPRINT pid_writer=$pid_writer
+	#
+        # Wait for message from writer process before starting reader(s)
+        WAIT_MESSAGE $WRITER_MESSAGE
+
+        #
+        # Launch the Readers
+        #declare -a seeds=(<seed1> <seed2> <seed3> ... )
+        echo launch $Nreaders swmr_readers
+        pid_readers=""
+        n=0
+        while [ $n -lt $Nreaders ]; do
+            #seed="-r ${seeds[$n]}"
+            seed=""
+            ./swmr_reader $Nsecs_add $seed &
+            pid_readers="$pid_readers $!"
+            n=`expr $n + 1`
+        done
+        $DPRINT pid_readers=$pid_readers
+        $IFDEBUG ps
+
+        # Collect exit code of the readers first because they usually finish
+        # before the writer.
+        for xpid in $pid_readers; do
+            $DPRINT checked reader $xpid
+            wait $xpid
+            if test $? -ne 0; then
+                echo reader had error
+                nerrors=`expr $nerrors + 1`
+            fi
+        done
+
+        # Collect exit code of the writer
+        $DPRINT checked writer $pid_writer
+        wait $pid_writer
+        if test $? -ne 0; then
+            echo writer had error
+            nerrors=`expr $nerrors + 1`
+        fi
+
+        # Check for error and exit if one occured
+        $DPRINT nerrors=$nerrors
+        if test $nerrors -ne 0 ; then
+            echo "SWMR tests failed with $nerrors errors."
+            exit 1
+        fi
+
+        echo
+        echo "###############################################################################"
+        echo "## Writer test - test expanding the dataset"
+        echo "###############################################################################"
+
+        # Launch the Generator
+        echo launch the swmr_generator
+        ./swmr_generator -s $compress $index_type
+        if test $? -ne 0; then
+            echo generator had error
+            nerrors=`expr $nerrors + 1`
+        fi
+	# Remove any possible writer message file before launching writer
+        rm -f $WRITER_MESSAGE
+        #
+        # Launch the Writer
+        echo launch the swmr_writer
+        seed="" # Put -r <random seed> command here
+        ./swmr_writer -o $Nrecords $seed &
+        pid_writer=$!
+        $DPRINT pid_writer=$pid_writer
+	#
+        # Wait for message from writer process before starting reader(s)
+        WAIT_MESSAGE $WRITER_MESSAGE
+        #
+        # Launch the Readers
+        #declare -a seeds=(<seed1> <seed2> <seed3> ... )
+        echo launch $Nreaders swmr_readers
+        pid_readers=""
+        n=0
+        while [ $n -lt $Nreaders ]; do
+            #seed="-r ${seeds[$n]}"
+            seed=""
+            ./swmr_reader $Nsecs_add $seed &
+            pid_readers="$pid_readers $!"
+            n=`expr $n + 1`
+        done
+        $DPRINT pid_readers=$pid_readers
+        $IFDEBUG ps
+
+        # Collect exit code of the readers first because they usually finish
+        # before the writer.
+        for xpid in $pid_readers; do
+            $DPRINT checked reader $xpid
+            wait $xpid
+            if test $? -ne 0; then
+                echo reader had error
+                nerrors=`expr $nerrors + 1`
+            fi
+        done
+
+        # Collect exit code of the writer
+        $DPRINT checked writer $pid_writer
+        wait $pid_writer
+        if test $? -ne 0; then
+            echo writer had error
+            nerrors=`expr $nerrors + 1`
+        fi
+
+        # Check for error and exit if one occured
+        $DPRINT nerrors=$nerrors
+        if test $nerrors -ne 0 ; then
+            echo "SWMR tests failed with $nerrors errors."
+            exit 1
+        fi
+
+        echo
+        echo "###############################################################################"
+        echo "## Remove test - test shrinking the dataset"
+        echo "###############################################################################"
+	#
+        # Remove any possible writer message file before launching writer
+        rm -f $WRITER_MESSAGE
+        # Launch the Remove Writer
+        echo launch the swmr_remove_writer
+        seed="" # Put -r <random seed> command here
+        ./swmr_remove_writer -o $Nrecs_rem $seed &
+        pid_writer=$!
+        $DPRINT pid_writer=$pid_writer
+	#
+        # Wait for message from writer process before starting reader(s)
+        WAIT_MESSAGE $WRITER_MESSAGE
+        #
+        # Launch the Remove Readers
+        #declare -a seeds=(<seed1> <seed2> <seed3> ... )
+        n=0
+        pid_readers=""
+        echo launch $Nreaders swmr_remove_readers
+        while [ $n -lt $Nreaders ]; do
+            #seed="-r ${seeds[$n]}"
+            seed=""
+            ./swmr_remove_reader $Nsecs_rem $seed &
+            pid_readers="$pid_readers $!"
+            n=`expr $n + 1`
+        done
+        $DPRINT pid_readers=$pid_readers
+        $IFDEBUG ps
+
+        # Collect exit code of the readers first because they usually finish
+        # before the writer.
+        for xpid in $pid_readers; do
+            $DPRINT checked reader $xpid
+            wait $xpid
+            if test $? -ne 0; then
+                echo reader had error
+                nerrors=`expr $nerrors + 1`
+            fi
+        done
+
+        # Collect exit code of the writer
+        $DPRINT checked writer $pid_writer
+        wait $pid_writer
+        if test $? -ne 0; then
+            echo writer had error
+            nerrors=`expr $nerrors + 1`
+        fi
+
+        # Check for error and exit if one occured
+        $DPRINT nerrors=$nerrors
+        if test $nerrors -ne 0 ; then
+            echo "SWMR tests failed with $nerrors errors."
+            exit 1
+        fi
+
+        echo
+        echo "###############################################################################"
+        echo "## Add/remove test - randomly grow or shrink the dataset"
+        echo "###############################################################################"
+
+        # Launch the Generator
+        echo launch the swmr_generator
+        ./swmr_generator $compress $index_type
+        if test $? -ne 0; then
+            echo generator had error
+            nerrors=`expr $nerrors + 1`
+        fi
+
+        # Launch the Writer (not in parallel - just to rebuild the datasets)
+        echo launch the swmr_writer
+        seed="" # Put -r <random seed> command here
+        ./swmr_writer $Nrecords $seed
+        if test $? -ne 0; then
+            echo writer had error
+            nerrors=`expr $nerrors + 1`
+        fi
+	#
+        # Remove any possible writer message file before launching writer
+        rm -f $WRITER_MESSAGE
+        #
+        # Launch the Add/Remove Writer
+        echo launch the swmr_addrem_writer
+        seed="" # Put -r <random seed> command here
+        ./swmr_addrem_writer $Nrecords $seed &
+        pid_writer=$!
+        $DPRINT pid_writer=$pid_writer
+	#
+        # Wait for message from writer process before starting reader(s)
+        WAIT_MESSAGE $WRITER_MESSAGE
+        #
+        # Launch the Add/Remove Readers
+        #declare -a seeds=(<seed1> <seed2> <seed3> ... )
+        n=0
+        pid_readers=""
+        echo launch $Nreaders swmr_remove_readers
+        while [ $n -lt $Nreaders ]; do
+            #seed="-r ${seeds[$n]}"
+            seed=""
+            ./swmr_remove_reader $Nsecs_addrem $seed &
+            pid_readers="$pid_readers $!"
+            n=`expr $n + 1`
+        done
+        $DPRINT pid_readers=$pid_readers
+        $IFDEBUG ps
+
+        # Collect exit code of the readers first because they usually finish
+        # before the writer.
+        for xpid in $pid_readers; do
+            $DPRINT checked reader $xpid
+            wait $xpid
+            if test $? -ne 0; then
+                echo reader had error
+                nerrors=`expr $nerrors + 1`
+            fi
+        done
+
+        # Collect exit code of the writer
+        $DPRINT checked writer $pid_writer
+        wait $pid_writer
+        if test $? -ne 0; then
+            echo writer had error
+            nerrors=`expr $nerrors + 1`
+        fi
+
+        # Check for error and exit if one occured
+        $DPRINT nerrors=$nerrors
+        if test $nerrors -ne 0 ; then
+            echo "SWMR tests failed with $nerrors errors."
+            exit 1
+        fi
+
+        echo
+        echo "###############################################################################"
+        echo "## Sparse writer test - test writing to random locations in the dataset"
+        echo "###############################################################################"
+
+        # Launch the Generator
+        # NOTE: Random seed is shared between readers and writers and is
+        #       created by the generator.
+        echo launch the swmr_generator
+        seed="" # Put -r <random seed> command here
+        ./swmr_generator $compress $index_type $seed
+        if test $? -ne 0; then
+            echo generator had error
+            nerrors=`expr $nerrors + 1`
+        fi
+	#
+        # Remove any possible writer message file before launching writer
+        rm -f $WRITER_MESSAGE
+        # Launch the Sparse writer
+        echo launch the swmr_sparse_writer
+        nice -n 20 ./swmr_sparse_writer $Nrecs_spa &
+        pid_writer=$!
+        $DPRINT pid_writer=$pid_writer
+	#
+        # Wait for message from writer process before starting reader(s)
+        WAIT_MESSAGE $WRITER_MESSAGE
+        #
+        # Launch the Sparse readers
+        n=0
+        pid_readers=""
+        echo launch $Nrdrs_spa swmr_sparse_readers
+        while [ $n -lt $Nrdrs_spa ]; do
+            # The sparse writer spits out a LOT of data so it's set to 'quiet'
+            ./swmr_sparse_reader -q $Nrecs_spa &
+            pid_readers="$pid_readers $!"
+            n=`expr $n + 1`
+        done
+        $DPRINT pid_readers=$pid_readers
+        $IFDEBUG ps
+
+        # Collect exit code of the writer
+        $DPRINT checked writer $pid_writer
+        wait $pid_writer
+        if test $? -ne 0; then
+            echo writer had error
+            nerrors=`expr $nerrors + 1`
+        fi
+
+        # Collect exit code of the readers
+        for xpid in $pid_readers; do
+            $DPRINT checked reader $xpid
+            wait $xpid
+            if test $? -ne 0; then
+                echo reader had error
+                nerrors=`expr $nerrors + 1`
+            fi
+        done
+
+        # Check for error and exit if one occured
+        $DPRINT nerrors=$nerrors
+        if test $nerrors -ne 0 ; then
+            echo "SWMR tests failed with $nerrors errors."
+            exit 1
+        fi
+    done
+done
+
+###############################################################################
+## Report and exit
+###############################################################################
+
+$DPRINT nerrors=$nerrors
+if test $nerrors -eq 0 ; then
+    echo "SWMR tests passed."
+    exit 0
+else
+    echo "SWMR tests failed with $nerrors errors."
+    exit 1
+fi
diff --git a/test/testvdsswmr.sh.in b/test/testvdsswmr.sh.in
new file mode 100644
index 0000000..d69b8c0
--- /dev/null
+++ b/test/testvdsswmr.sh.in
@@ -0,0 +1,199 @@
+#! /bin/bash
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+#
+# Tests for the swmr feature using virtual datasets.
+#
+# Created:
+#   Dana Robinson, November 2015
+
+srcdir=@srcdir@
+
+###############################################################################
+## test parameters
+###############################################################################
+
+Nwriters=6              # number of writers (1 per source dataset)
+Nreaders=5              # number of readers to launch
+nerrors=0
+
+###############################################################################
+## definitions for message file to coordinate test runs
+###############################################################################
+WRITER_MESSAGE=SWMR_WRITER_MESSAGE      # The message file created by writer that the open is complete
+                                        # This should be the same as the define in "./swmr_common.h"
+MESSAGE_TIMEOUT=300                     # Message timeout length in secs
+                                        # This should be the same as the define in "./h5test.h"
+
+###############################################################################
+## short hands and function definitions
+###############################################################################
+DPRINT=:                # Set to "echo Debug:" for debugging printing,
+                        # else ":" for noop.
+IFDEBUG=:               # Set to null to turn on debugging, else ":" for noop.
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Testing".
+#
+TESTING() {
+   SPACES="                                                               "
+   echo "Testing $* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+# To wait for the writer message file or till the maximum # of seconds is reached
+# $1 is the message file to wait for
+# This performs similar function as the routine h5_wait_message() in test/h5test.c
+WAIT_MESSAGE() {
+    message=$1                                  # Get the name of the message file to wait for
+    t0=`date +%s`                               # Get current time in seconds
+    difft=0                                     # Initialize the time difference
+    mexist=0                                    # Indicate whether the message file is found
+    while [ $difft -lt $MESSAGE_TIMEOUT ] ;     # Loop till message times out
+    do
+        t1=`date +%s`                           # Get current time in seconds
+        difft=`expr $t1 - $t0`                  # Calculate the time difference
+        if [ -e $message ]; then                # If message file is found:
+            mexist=1                            #       indicate the message file is found
+            rm $message                         #       remove the message file
+            break                               #       get out of the while loop
+        fi
+    done;
+    if test $mexist -eq 0; then
+        # Issue warning that the writer message file is not found, continue with launching the reader(s)
+        echo warning: $WRITER_MESSAGE is not found after waiting $MESSAGE_TIMEOUT seconds
+    else
+        echo $WRITER_MESSAGE is found
+    fi
+}
+
+###############################################################################
+## Main
+###############################################################################
+# The build (current) directory might be different than the source directory.
+if test -z "$srcdir"; then
+   srcdir=.
+fi
+
+# Check to see if the VFD specified by the HDF5_DRIVER environment variable
+# supports SWMR.
+./swmr_check_compat_vfd
+rc=$?
+if [ $rc -ne 0 ] ; then
+    echo
+    echo "The VFD specified by the HDF5_DRIVER environment variable"
+    echo "does not support SWMR."
+    echo
+    echo "SWMR acceptance tests skipped"
+    echo
+    exit 0
+fi
+
+# Parse options (none accepted at this time)
+while [ $# -gt 0 ]; do
+    case "$1" in
+    *)  # unknown option
+        echo "$0: Unknown option ($1)"
+        exit 1
+        ;;
+    esac
+done
+
+echo
+echo "###############################################################################"
+echo "## Basic VDS SWMR test - writing to a tiled plane"
+echo "###############################################################################"
+
+# Launch the file generator
+echo launch the generator
+./vds_swmr_gen
+if test $? -ne 0; then
+    echo generator had error
+    nerrors=`expr $nerrors + 1`
+fi
+
+# Check for error and exit if one occured
+$DPRINT nerrors=$nerrors
+if test $nerrors -ne 0 ; then
+    echo "VDS SWMR tests failed with $nerrors errors."
+    exit 1
+fi
+
+# Launch the writers
+echo "launch the $Nwriters SWMR VDS writers (1 per source)"
+pid_writers=""
+n=0
+while [ $n -lt $Nwriters ]; do
+    ./vds_swmr_writer $n &
+    pid_writers="$pid_writers $!"
+    n=`expr $n + 1`
+done
+$DPRINT pid_writers=$pid_writers
+$IFDEBUG ps
+
+# Sleep to ensure that the writers have started
+sleep 3
+
+# Launch the readers
+echo launch $Nreaders SWMR readers
+pid_readers=""
+n=0
+while [ $n -lt $Nreaders ]; do
+    ./vds_swmr_reader &
+    pid_readers="$pid_readers $!"
+    n=`expr $n + 1`
+done
+$DPRINT pid_readers=$pid_readers
+$IFDEBUG ps
+
+# Collect exit code of the writers
+for xpid in $pid_writers; do
+    $DPRINT checked writer $xpid
+    wait $xpid
+    if test $? -ne 0; then
+        echo writer had error
+        nerrors=`expr $nerrors + 1`
+    fi
+done
+
+# Collect exit code of the readers
+# (they usually finish after the writers)
+for xpid in $pid_readers; do
+    $DPRINT checked reader $xpid
+    wait $xpid
+    if test $? -ne 0; then
+        echo reader had error
+        nerrors=`expr $nerrors + 1`
+    fi
+done
+
+# Check for error and exit if one occured
+$DPRINT nerrors=$nerrors
+if test $nerrors -ne 0 ; then
+    echo "VDS SWMR tests failed with $nerrors errors."
+    exit 1
+fi
+
+###############################################################################
+## Report and exit
+###############################################################################
+
+$DPRINT nerrors=$nerrors
+if test $nerrors -eq 0 ; then
+    echo "VDS SWMR tests passed."
+    exit 0
+else
+    echo "VDS SWMR tests failed with $nerrors errors."
+    exit 1
+fi
+
diff --git a/test/tfile.c b/test/tfile.c
index 2e24791..399e29d 100644
--- a/test/tfile.c
+++ b/test/tfile.c
@@ -26,13 +26,14 @@
 #include "H5srcdir.h"
 
 #include "H5Bprivate.h"
+#include "H5Iprivate.h"
 #include "H5Pprivate.h"
 
 /*
  * This file needs to access private information from the H5F package.
  * This file also needs to access the file testing code.
  */
-#define H5F_PACKAGE
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
 #define H5F_TESTING
 #include "H5Fpkg.h"		/* File access	 			*/
 
@@ -99,14 +100,43 @@
 
 #define USERBLOCK_SIZE      ((hsize_t) 512)
 
+/* Declarations for test_filespace_*() */
+#define FILENAME_LEN    	1024		/* length of file name */
+#define CORE_INCREMENT  	1024		/* core file */
+#define FAMILY_SIZE     	1024		/* family file */
+#define DSETNAME 		"dset"		/* Name of dataset */
+#define NELMTS(X)               (sizeof(X)/sizeof(X[0]))	/* # of elements */
+#define READ_OLD_BUFSIZE	1024		/* Buffer for holding file data */
+#define FILE5			"tfile5.h5"	/* Test file */
+#define TEST_THRESHOLD10        10		/* Free space section threshold */
+
 /* Declaration for test_libver_macros2() */
-#define FILE5		"tfile5.h5"	/* Test file */
+#define FILE6			"tfile6.h5"	/* Test file */
 
 /* Declaration for test_get_obj_ids() */
-#define FILE6			"tfile6.h5"	/* Test file */
-#define NGROUPS			2
+#define FILE7			"tfile7.h5"	/* Test file */
+#define N_GROUPS			2
 #define NDSETS			4
 
+const char *OLD_FILENAME[] = {  /* Files created under 1.6 branch and 1.8 branch */
+    "filespace_1_6.h5",	/* 1.6 HDF5 file */
+    "filespace_1_8.h5"	/* 1.8 HDF5 file */
+};
+const char *FILESPACE_NAME[] = {
+    "tfilespace",
+    NULL
+};
+
+const char *FILENAME[] = {
+    "sec2_tfile",
+    "split_tfile",
+    "stdio_tfile",
+    "core_tfile",
+    "family_tfile",
+    NULL
+};
+
+
 static void
 create_objects(hid_t, hid_t, hid_t *, hid_t *, hid_t *, hid_t *);
 static void
@@ -114,6 +144,11 @@ test_obj_count_and_id(hid_t, hid_t, hid_t, hid_t, hid_t, hid_t);
 static void
 check_file_id(hid_t, hid_t);
 
+/* Helper routine used by test_rw_noupdate() */
+static int cal_chksum(const char *file, uint32_t *chksum);
+
+static void test_rw_noupdate(void);
+
 /****************************************************************
 **
 **  test_file_create(): Low-level file creation I/O test routine.
@@ -798,7 +833,9 @@ test_file_close(void)
             ret = H5Gclose(group_id3);
             CHECK(ret, FAIL, "H5Gclose");
 	    break;
-        default:
+
+    case H5F_CLOSE_DEFAULT:
+    default:
             CHECK(fc_degree, H5F_CLOSE_DEFAULT, "H5Pget_fclose_degree");
             break;
     }
@@ -931,7 +968,7 @@ create_objects(hid_t fid1, hid_t fid2, hid_t *ret_did, hid_t *ret_gid1,
 static void
 test_get_obj_ids(void)
 {
-    hid_t    fid, gid[NGROUPS], dset[NDSETS];
+    hid_t    fid, gid[N_GROUPS], dset[NDSETS];
     hid_t    filespace;
     hsize_t  file_dims[F2_RANK] = {F2_DIM0, F2_DIM1};
     ssize_t  oid_count, ret_count;
@@ -942,14 +979,14 @@ test_get_obj_ids(void)
     char gname[64], dname[64];
 
     /* Create a new file */
-    fid = H5Fcreate(FILE6, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    fid = H5Fcreate(FILE7, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
     CHECK(fid, FAIL, "H5Fcreate");
 
     filespace = H5Screate_simple(F2_RANK, file_dims,  NULL);
     CHECK(filespace, FAIL, "H5Screate_simple");
 
-    /* creates NGROUPS groups under the root group */
-    for(m = 0; m < NGROUPS; m++) {
+    /* creates N_GROUPS groups under the root group */
+    for(m = 0; m < N_GROUPS; m++) {
         sprintf(gname, "group%d", m);
         gid[m] = H5Gcreate2(fid, gname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
         CHECK(gid[m], FAIL, "H5Gcreate2");
@@ -962,10 +999,10 @@ test_get_obj_ids(void)
          CHECK(dset[n], FAIL, "H5Dcreate2");
     }
 
-    /* The number of opened objects should be NGROUPS + NDSETS + 1.  One is opened file. */
+    /* The number of opened objects should be N_GROUPS + NDSETS + 1.  One is opened file. */
     oid_count = H5Fget_obj_count(fid, H5F_OBJ_ALL);
     CHECK(oid_count, FAIL, "H5Fget_obj_count");
-    VERIFY(oid_count, (NGROUPS + NDSETS + 1), "H5Fget_obj_count");
+    VERIFY(oid_count, (N_GROUPS + NDSETS + 1), "H5Fget_obj_count");
 
     oid_list = (hid_t *)HDcalloc((size_t)oid_list_size, sizeof(hid_t));
     CHECK(oid_list, NULL, "HDcalloc");
@@ -986,11 +1023,11 @@ test_get_obj_ids(void)
         }
     }
 
-    /* The number of opened objects should be NGROUPS + 1 + 1.  The first one is opened file. The second one
+    /* The number of opened objects should be N_GROUPS + 1 + 1.  The first one is opened file. The second one
      * is the dataset ID left open from the previous around of H5Fget_obj_ids */
     oid_count = H5Fget_obj_count(fid, H5F_OBJ_ALL);
     CHECK(oid_count, FAIL, "H5Fget_obj_count");
-    VERIFY(oid_count, NGROUPS + 2, "H5Fget_obj_count");
+    VERIFY(oid_count, N_GROUPS + 2, "H5Fget_obj_count");
 
     /* Get the IDs of the left opend objects */ 
     ret_count = H5Fget_obj_ids(fid, H5F_OBJ_ALL, (size_t)oid_list_size, oid_list);
@@ -1012,7 +1049,7 @@ test_get_obj_ids(void)
 
     /* Reopen the file to check whether H5Fget_obj_count and H5Fget_obj_ids still works 
      * when the file is closed first */ 
-    fid = H5Fopen(FILE6, H5F_ACC_RDONLY, H5P_DEFAULT);
+    fid = H5Fopen(FILE7, H5F_ACC_RDONLY, H5P_DEFAULT);
     CHECK(fid, FAIL, "H5Fopen");
 
     /* Open NDSETS datasets under the root group */
@@ -1285,6 +1322,19 @@ test_obj_count_and_id(hid_t fid1, hid_t fid2, hid_t did, hid_t gid1,
                         VERIFY(oid_list[i], did, "H5Fget_obj_ids");
                         break;
 
+                    case H5I_UNINIT:
+                    case H5I_BADID:
+                    case H5I_DATATYPE:
+                    case H5I_DATASPACE:
+                    case H5I_ATTR:
+                    case H5I_REFERENCE:
+                    case H5I_VFL:
+                    case H5I_GENPROP_CLS:
+                    case H5I_GENPROP_LST:
+                    case H5I_ERROR_CLASS:
+                    case H5I_ERROR_MSG:
+                    case H5I_ERROR_STACK:
+                    case H5I_NTYPES:
                     default:
                         ERROR("H5Fget_obj_ids");
                 } /* end switch */
@@ -2274,93 +2324,101 @@ test_cached_stab_info(void)
     CHECK(ret, FAIL, "H5Fclose");
 } /* end test_cached_stab_info() */
 
+/*
+ * To calculate the checksum for a file.
+ * This is a helper routine for test_rw_noupdate().
+ */
+static int
+cal_chksum(const char *file, uint32_t *chksum)
+{
+    int curr_num_errs = GetTestNumErrs();       /* Retrieve the current # of errors */
+    int fdes = -1;                              /* File descriptor */
+    void *file_data = NULL;                     /* Copy of file data */
+    ssize_t bytes_read;                         /* # of bytes read */
+    h5_stat_t sb;                               /* Stat buffer for file */
+    herr_t ret;                                 /* Generic return value */
+
+    /* Open the file */
+    fdes = HDopen(file, O_RDONLY, 0);
+    CHECK(fdes, FAIL, "HDopen");
+
+    /* Retrieve the file's size */
+    ret = HDfstat(fdes, &sb);
+    CHECK(fdes, FAIL, "HDfstat");
+
+    /* Allocate space for the file data */
+    file_data = HDmalloc((size_t)sb.st_size);
+    CHECK(file_data, NULL, "HDmalloc");
+
+    if(file_data) {
+        /* Read file's data into memory */
+        bytes_read = HDread(fdes, file_data, (size_t)sb.st_size);
+        CHECK(bytes_read == sb.st_size, FALSE, "HDmalloc");
+
+        /* Calculate checksum */
+        *chksum = H5_checksum_lookup3(file_data, sizeof(file_data), 0);
+
+        /* Free memory */
+        HDfree(file_data);
+    }
+
+    /* Close the file */
+    ret = HDclose(fdes);
+    CHECK(ret, FAIL, "HDclose");
+
+    return((GetTestNumErrs() == curr_num_errs) ? 0 : -1);
+} /* cal_chksum() */
+
 /****************************************************************
 **
 **  test_rw_noupdate(): low-level file test routine.
 **      This test checks to ensure that opening and closing a file
 **      with read/write permissions does not write anything to the
 **      file if the file does not change.
+**	Due to the implementation of file locking (status_flags in 
+**	the superblock is used), this test is changed to use checksum 
+**	instead of timestamp to verify the file is not changed.
 **
-**  Programmer: Mike McGreevy
-**              mamcgree at hdfgroup.org
-**              June 29, 2009
+**  Programmer: Vailin Choi; July 2013
 **
 *****************************************************************/
 static void
 test_rw_noupdate(void)
 {
-    int fd;             /* File Descriptor */
-    h5_stat_t sb1, sb2; /* Info from 'stat' call */
-    double diff;        /* Difference in modification times */
     herr_t ret;         /* Generic return value */
+    hid_t fid;			/* File ID */
+    uint32_t chksum1, chksum2; 	/* Checksum value */
 
     /* Output message about test being performed */
     MESSAGE(5, ("Testing to verify that nothing is written if nothing is changed.\n"));
 
-    /* First make sure the stat function behaves as we expect - the modification time
-     * is the time that the file was modified last time. */
-    fd = HDopen(SFILE1, O_RDWR | O_CREAT | O_TRUNC, 0666);
-    CHECK(fd, FAIL, "HDopen");
-    ret = HDclose(fd);
-    CHECK(ret, FAIL, "HDclose");
-
-    /* Determine File's Initial Timestamp */
-    ret = HDstat(SFILE1, &sb1);
-    VERIFY(ret, 0, "HDstat");
-
-    /* Wait for 2 seconds */
-    /* (This ensures a system time difference between the two file accesses) */
-    HDsleep(2);
-
-    fd = HDopen(SFILE1, O_RDWR, 0666);
-    CHECK(fd, FAIL, "HDopen");
-    ret = HDclose(fd);
-    CHECK(ret, FAIL, "HDclose");
-
-    /* Determine File's New Timestamp */
-    ret = HDstat(SFILE1, &sb2);
-    VERIFY(ret, 0, "HDstat");
-
-    /* Get difference between timestamps */
-    diff = HDdifftime(sb2.st_mtime, sb1.st_mtime);
+    /* Create and Close a HDF5 File */
+    fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    CHECK(fid, FAIL, "H5Fcreate");
 
-    /* Check That Timestamps Are Equal */
-    if(diff > 0.0F) {
-        /* Output message about test being performed */
-        MESSAGE(1, ("Testing to verify that nothing is written if nothing is changed: This test is skipped on this system because the modification time from stat is the same as the last access time.\n"));
-    } /* end if */
-    else {
-        hid_t file_id;      /* HDF5 File ID */
+    /* Close the file */
+    ret = H5Fclose(fid);
+    CHECK(ret, FAIL, "H5Fclose");
 
-        /* Create and Close a HDF5 File */
-        file_id = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-        CHECK(file_id, FAIL, "H5Fcreate");
-        ret = H5Fclose(file_id);
-        CHECK(ret, FAIL, "H5Fclose");
+    /* Calculate checksum for the file */
+    ret = cal_chksum(FILE1, &chksum1);
+    CHECK(ret, FAIL, "HDopen");
 
-        /* Determine File's Initial Timestamp */
-        ret = HDstat(FILE1, &sb1);
-        VERIFY(ret, 0, "HDfstat");
+    /* Open and close File With Read/Write Permission */
+    fid = H5Fopen(FILE1, H5F_ACC_RDWR, H5P_DEFAULT);
+    CHECK(fid, FAIL, "H5Fopen");
 
-        /* Wait for 2 seconds */
-        /* (This ensures a system time difference between the two file accesses) */
-        HDsleep(2);
+    /* Close the file */
+    ret = H5Fclose(fid);
+    CHECK(ret, FAIL, "H5Fclose");
 
-        /* Open and Close File With Read/Write Permission */
-        file_id = H5Fopen(FILE1, H5F_ACC_RDWR, H5P_DEFAULT);
-        CHECK(file_id, FAIL, "H5Fopen");
-        ret = H5Fclose(file_id);
-        CHECK(ret, FAIL, "H5Fclose");
+    /* Calculate checksum for the file */
+    ret = cal_chksum(FILE1, &chksum2);
+    CHECK(ret, FAIL, "HDopen");
 
-        /* Determine File's New Timestamp */
-        ret = HDstat(FILE1, &sb2);
-        VERIFY(ret, 0, "HDstat");
+    /* The two checksums are the same, i.e. the file is not changed */
+    VERIFY(chksum1, chksum2, "Checksum");
 
-        /* Ensure That Timestamps Are Equal */
-        diff = HDdifftime(sb2.st_mtime, sb1.st_mtime);
-        ret = (diff > 0.0F);
-        VERIFY(ret, 0, "Timestamp");
-    } /* end else */
 } /* end test_rw_noupdate() */
 
 /****************************************************************
@@ -2715,6 +2773,535 @@ test_userblock_alignment(void)
 
 /****************************************************************
 **
+**  test_free_sections():
+**      This routine does the actual work of checking information for
+**	free space sections available in a file in various situations.
+**
+*****************************************************************/
+static void
+test_free_sections(hid_t fapl, char *fname)
+{
+    hid_t    file;      	/* File ID */
+    hid_t    fcpl;		/* File creation property list template */
+    hssize_t free_space;        /* Amount of free space in file */
+    hid_t    dspace;    	/* Dataspace ID */
+    hid_t    dset;      	/* Dataset ID */
+    hid_t    dcpl;      	/* Dataset creation property list */
+    unsigned u;         	/* Local index variable */
+    char     name[32];  	/* Dataset name */
+    hssize_t nsects;        	/* # of free-space sections */
+    hssize_t saved_nsects;   	/* saved copy for the # of free-space sections */
+    int	     i;			/* local index variable */
+    hsize_t  total;        	/* sum of the free-space section sizes */
+    hsize_t  last_size;        	/* size of last free-space section */
+    H5F_sect_info_t *sect_info;	/* array to hold the free-space information */
+    H5F_sect_info_t *saved_sect_info;	/* array to hold the free-space information */
+    herr_t   ret;		/* return value */
+
+    /* Create file-creation template */
+    fcpl = H5Pcreate(H5P_FILE_CREATE);
+    CHECK(fcpl, FAIL, "H5Pcreate");
+
+    /* Set file space strategy and free space section threshold */
+    ret = H5Pset_file_space(fcpl, H5F_FILE_SPACE_ALL_PERSIST, (hsize_t)0);
+    CHECK(ret, FAIL, "H5Pget_file_space");
+
+    /* Create the file */
+    file = H5Fcreate(fname, H5F_ACC_TRUNC, fcpl, fapl);
+    CHECK(file, FAIL, "H5Fcreate");
+
+    /* Close the FCPL */
+    ret = H5Pclose(fcpl);
+    CHECK(ret, FAIL, "H5Pclose");
+
+    /* Create dataspace for datasets */
+    dspace = H5Screate(H5S_SCALAR);
+    CHECK(dspace, FAIL, "H5Screate");
+
+    /* Create a dataset creation property list */
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+    CHECK(dcpl, FAIL, "H5Pcreate");
+
+    /* Set the space allocation time to early */
+    ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY);
+    CHECK(ret, FAIL, "H5Pset_alloc_time");
+
+    /* Create datasets in file */
+    for(u = 0; u < 10; u++) {
+        sprintf(name, "Dataset %u", u);
+        dset = H5Dcreate2(file, name, H5T_STD_U32LE, dspace, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+        CHECK(dset, FAIL, "H5Dcreate2");
+
+        ret = H5Dclose(dset);
+        CHECK(ret, FAIL, "H5Dclose");
+    } /* end for */
+
+    /* Close dataspace */
+    ret = H5Sclose(dspace);
+    CHECK(ret, FAIL, "H5Sclose");
+
+    /* Close dataset creation property list */
+    ret = H5Pclose(dcpl);
+    CHECK(ret, FAIL, "H5Pclose");
+
+    /* Delete odd-numbered datasets in file */
+    for(u = 0; u < 10; u++) {
+        sprintf(name, "Dataset %u", u);
+	if(u % 2) {
+	    ret = H5Ldelete(file, name, H5P_DEFAULT);
+	    CHECK(ret, FAIL, "H5Ldelete");
+	} /* end if */
+    } /* end for */
+
+    /* Close file */
+    ret = H5Fclose(file);
+    CHECK(ret, FAIL, "H5Fclose");
+
+    /* Re-open the file with read-only permission */
+    file = H5Fopen(fname, H5F_ACC_RDONLY, fapl);
+    CHECK_I(file, "H5Fopen");
+
+    /* Get the amount of free space in the file */
+    free_space = H5Fget_freespace(file);
+    CHECK(free_space, FAIL, "H5Fget_freespace");
+
+    /* Get the # of free-space sections in the file */
+    saved_nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)0, NULL);
+    CHECK(saved_nsects, FAIL, "H5Fget_free_sections");
+
+    /* Allocate storage for the free space section information */
+    saved_sect_info = (H5F_sect_info_t *)HDcalloc((size_t)saved_nsects, sizeof(H5F_sect_info_t));
+    CHECK(saved_sect_info, NULL, "HDcalloc");
+
+    /* Should return failure when nsects is 0 with a nonnull sect_info */
+    nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)0, saved_sect_info);
+    VERIFY(nsects, FAIL, "H5Fget_free_sections");
+
+    /* Verify the correct # of free-space sections */
+    nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)saved_nsects, saved_sect_info);
+    VERIFY(nsects, saved_nsects, "H5Fget_free_sections");
+
+    /* Verify the amount of free-space is correct */
+    total = 0;
+    for(i = 0; i < nsects; i++)
+	total += saved_sect_info[i].size;
+    VERIFY(free_space, total, "H5Fget_free_sections");
+
+    /* save the last section's size */
+    last_size = saved_sect_info[nsects-1].size;
+
+    /* Allocate storage for -1 free space section information */
+    sect_info = (H5F_sect_info_t *)HDcalloc((size_t)(saved_nsects - 1), sizeof(H5F_sect_info_t));
+    CHECK(sect_info, NULL, "HDcalloc");
+
+    /* Retrieve free space info for -1 sections */
+    nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)(saved_nsects - 1), sect_info);
+    VERIFY(nsects, saved_nsects, "H5Fget_free_sections");
+
+    /* Verify the amount of free-space is correct */
+    total = 0;
+    for(i = 0; i < (saved_nsects - 1); i++) {
+	VERIFY(sect_info[i].addr, saved_sect_info[i].addr, "H5Fget_free_sections");
+	VERIFY(sect_info[i].size, saved_sect_info[i].size, "H5Fget_free_sections");
+	total += sect_info[i].size;
+    }
+
+    VERIFY(((hsize_t)free_space - last_size), total, "H5Fget_free_sections");
+    HDfree(sect_info);
+
+    /* Allocate storage for +1 free space section information */
+    sect_info = (H5F_sect_info_t *)HDcalloc((size_t)(saved_nsects + 1), sizeof(H5F_sect_info_t));
+    CHECK(sect_info, NULL, "HDcalloc");
+
+    /* Retrieve free-space info for +1 sections */
+    nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)(saved_nsects + 1), sect_info);
+    VERIFY(nsects, saved_nsects, "H5Fget_free_sections");
+
+    /* Verify free-space info is correct */
+    total = 0;
+    for(i = 0; i < nsects; i++) {
+	VERIFY(sect_info[i].addr, saved_sect_info[i].addr, "H5Fget_free_sections");
+	VERIFY(sect_info[i].size, saved_sect_info[i].size, "H5Fget_free_sections");
+	total += sect_info[i].size;
+    }
+
+    VERIFY(sect_info[nsects].addr, 0, "H5Fget_free_sections");
+    VERIFY(sect_info[nsects].size, 0, "H5Fget_free_sections");
+    VERIFY(free_space, total, "H5Fget_free_sections");
+    HDfree(sect_info);
+
+    /* Verify that there is no free-space section for this type */
+    nsects = H5Fget_free_sections(file, H5FD_MEM_BTREE, (size_t)0, NULL);
+    VERIFY(nsects, 0, "H5Fget_free_sections");
+
+    /* Close file */
+    ret = H5Fclose(file);
+    CHECK(ret, FAIL, "H5Fclose");
+
+    HDfree(saved_sect_info);
+
+} /* end test_free_sections() */
+
+/****************************************************************
+**
+**  test_filespace_sects():
+**      This test checks free space section info for
+**	files created with sec2 and split drivers.
+**
+*****************************************************************/
+static void
+test_filespace_sects(void)
+{
+    hid_t	fapl_sec2;	/* File access property id with sec2 driver */
+    hid_t	fapl_split;	/* File access property id with split driver */
+    hid_t	fapl_core;	/* File access property id with core driver */
+    hid_t	fapl_stdio;	/* File access property id with stdio driver */
+    hid_t	fapl_family;	/* File access property id with family driver */
+    char        filename[FILENAME_LEN];	/* Filename to use */
+    herr_t   	ret;		/* Return value */
+
+    /* SEC2 */
+    MESSAGE(5, ("Testing File free space information for a sec2 file\n"));
+
+    fapl_sec2 = H5Pcreate(H5P_FILE_ACCESS);
+
+    ret = H5Pset_fapl_sec2(fapl_sec2);
+    CHECK(ret, FAIL, "H5Pset_fapl_sec2");
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[0], fapl_sec2, filename, sizeof(filename));
+
+    /* perform free space information test for file with sec2 driver */
+    test_free_sections(fapl_sec2, filename);
+
+    /* close fapl_sec2 and remove the file */
+    h5_clean_files(FILENAME, fapl_sec2);
+
+
+    /* SPLIT */
+    MESSAGE(5, ("Testing File free space information for a split file\n"));
+
+    fapl_split = H5Pcreate(H5P_FILE_ACCESS);
+    CHECK(fapl_split, FAIL, "h5_fileaccess");
+
+    ret = H5Pset_fapl_split(fapl_split, "-m.h5", H5P_DEFAULT, "-r.h5", H5P_DEFAULT);
+    CHECK(ret, FAIL, "H5Pset_fapl_split");
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[1], fapl_split, filename, sizeof(filename));
+
+    /* perform free space information test for file with split driver */
+    test_free_sections(fapl_split, filename);
+
+    /* close fapl and remove the file */
+    h5_clean_files(FILENAME, fapl_split);
+
+
+    /* STDIO */
+    MESSAGE(5, ("Testing File free space information for a stdio file\n"));
+
+    fapl_stdio = H5Pcreate(H5P_FILE_ACCESS);
+    CHECK(fapl_stdio, FAIL, "h5_fileaccess");
+
+    ret = H5Pset_fapl_stdio(fapl_stdio);
+    CHECK(ret, FAIL, "H5Pset_fapl_split");
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[2], fapl_stdio, filename, sizeof(filename));
+
+    /* perform free space information test for file with stdio driver */
+    test_free_sections(fapl_stdio, filename);
+
+    /* close fapl and remove the file */
+    h5_clean_files(FILENAME, fapl_stdio);
+
+
+    /* CORE */
+    MESSAGE(5, ("Testing File free space information for a core file\n"));
+
+    fapl_core = H5Pcreate(H5P_FILE_ACCESS);
+    CHECK(fapl_core, FAIL, "h5_fileaccess");
+
+    ret = H5Pset_fapl_core(fapl_core, (size_t)CORE_INCREMENT, TRUE);
+    CHECK(ret, FAIL, "H5Pset_fapl_core");
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[3], fapl_core, filename, sizeof(filename));
+
+    /* perform free space information test for file with core driver */
+    test_free_sections(fapl_core, filename);
+
+    /* close fapl_ and remove the file */
+    h5_clean_files(FILENAME, fapl_core);
+
+
+    /* FAMILY */
+    MESSAGE(5, ("Testing File free space information for a family file\n"));
+
+    fapl_family = H5Pcreate(H5P_FILE_ACCESS);
+    CHECK(fapl_family, FAIL, "h5_fileaccess");
+
+    ret = H5Pset_fapl_family(fapl_family, (hsize_t)FAMILY_SIZE, H5P_DEFAULT);
+    CHECK(ret, FAIL, "H5Pset_fapl_family");
+
+    /* Set the filename to use for this test (dependent on fapl) */
+    h5_fixname(FILENAME[4], fapl_family, filename, sizeof(filename));
+
+    /* perform free space information test for file with family driver */
+    test_free_sections(fapl_family, filename);
+
+    /* close fapl and remove the file */
+    h5_clean_files(FILENAME, fapl_family);
+
+} /* end test_filespace_sects() */
+
+/****************************************************************
+**
+**  test_filespace_info():
+**	Verify that the public routines H5Pget/set_file_space()
+**	retrieve and set the file space strategy and free space
+**	section threshold as specified.
+**
+****************************************************************/
+static void
+test_filespace_info(void)
+{
+    hid_t	fid1, fid2; 		/* HDF5 File IDs	*/
+    hid_t	fapl, new_fapl;		/* File access property */
+    hid_t	fcpl, fcpl1, fcpl2;	/* File creation property */
+    char        filename[FILENAME_LEN];	/* Filename to use */
+    H5F_file_space_type_t	strategy, fs_type, def_type;	/* File space handling strategy */
+    hsize_t	threshold, fs_size, def_size;			/* Free space section threshold */
+    unsigned 	new_format;	/* new format or old format */
+    herr_t	ret;			/* return value	*/
+
+    /* Output message about test being performed */
+    MESSAGE(5, ("Testing File Space Management public routines: H5Pget/set_file_space()\n"));
+
+    fapl = h5_fileaccess();
+    h5_fixname(FILESPACE_NAME[0], fapl, filename, sizeof filename);
+
+    new_fapl = H5Pcopy(fapl);
+    CHECK(new_fapl, FAIL, "H5Pcopy");
+
+    /* Set the "use the latest version of the format" bounds */
+    ret = H5Pset_libver_bounds(new_fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
+    CHECK(ret, FAIL, "H5Pset_libver_bounds");
+
+    /* Create file-creation template */
+    fcpl = H5Pcreate(H5P_FILE_CREATE);
+    CHECK(fcpl, FAIL, "H5Pcreate");
+
+    /* Get default file space information */
+    ret = H5Pget_file_space(fcpl, &def_type, &def_size);
+    CHECK(ret, FAIL, "H5Pget_file_space");
+
+    /* Test with old & new format groups */
+    for(new_format = FALSE; new_format <= TRUE; new_format++) {
+        hid_t my_fapl;
+
+        /* Set the FAPL for the type of format */
+        if(new_format) {
+	    MESSAGE(5, ("Testing with new group format\n"));
+            my_fapl = new_fapl;
+        } /* end if */
+        else {
+	    MESSAGE(5, ("Testing with old group format\n"));
+            my_fapl = fapl;
+        } /* end else */
+
+        /* Test with different sized free space section threshold */
+        for(fs_size = 0; fs_size <= TEST_THRESHOLD10; fs_size++) {
+
+            /* Test with different file space handling strategies */
+            for(fs_type = H5F_FILE_SPACE_DEFAULT; fs_type < H5F_FILE_SPACE_NTYPES; H5_INC_ENUM(H5F_file_space_type_t, fs_type)) {
+
+                /* Get a copy of the default file creation property */
+                fcpl1 = H5Pcopy(fcpl);
+                CHECK(fcpl1, FAIL, "H5Pcopy");
+
+                /* Set file space strategy and free space section threshold */
+                ret = H5Pset_file_space(fcpl1, fs_type, fs_size);
+                CHECK(ret, FAIL, "H5Pget_file_space");
+
+                /* Get the file space info from the creation property */
+                ret = H5Pget_file_space(fcpl1, &strategy, &threshold);
+                CHECK(ret, FAIL, "H5Pget_file_space");
+
+                /* A 0 value for strategy retains existing strategy in use */
+                VERIFY(strategy, (H5F_file_space_type_t)(fs_type ? fs_type : def_type), "H5Pget_file_space");
+                /* A 0 value for threshold retains existing threshold in use */
+                VERIFY(threshold, (hsize_t)(fs_size ? fs_size : def_size), "H5Pget_file_space");
+
+                /* Create the file with the specified file space info */
+                fid1 = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl1, my_fapl);
+                CHECK(fid1, FAIL, "H5Fcreate");
+
+                /* Close the file */
+                ret = H5Fclose(fid1);
+                CHECK(ret, FAIL, "H5Fclose");
+
+                /* Re-open the file */
+                fid2 = H5Fopen(filename, H5F_ACC_RDWR, my_fapl);
+                CHECK(fid2, FAIL, "H5Fopen");
+
+                /* Get the file's creation property */
+                fcpl2 = H5Fget_create_plist(fid2);
+                CHECK(fcpl2, FAIL, "H5Fget_create_plist");
+
+                strategy = H5F_FILE_SPACE_DEFAULT;
+                threshold = 0;
+
+                /* Get the file space info from the creation property list */
+                ret = H5Pget_file_space(fcpl2, &strategy, &threshold);
+                CHECK(ret, FAIL, "H5Pget_file_space");
+
+                VERIFY(strategy, (H5F_file_space_type_t)(fs_type ? fs_type : def_type), "H5Pget_file_space");
+                VERIFY(threshold, (hsize_t)(fs_size ? fs_size : def_size), "H5Pget_file_space");
+
+                /* Close the file */
+                ret = H5Fclose(fid2);
+                CHECK(ret, FAIL, "H5Fclose");
+
+                /* Release file-creation template */
+                ret = H5Pclose(fcpl1);
+                CHECK(ret, FAIL, "H5Pclose");
+                ret = H5Pclose(fcpl2);
+                CHECK(ret, FAIL, "H5Pclose");
+            } /* end for file space strategy type */
+        } /* end for free space threshold */
+
+        h5_clean_files(FILESPACE_NAME, my_fapl);
+
+    } /* end for new/old format */
+
+    /* Close the file creation property list */
+    ret = H5Pclose(fcpl);
+    CHECK(ret, FAIL, "H5Pclose");
+}  /* test_filespace_info() */
+
+/****************************************************************
+**
+**  test_filespace_compatible():
+**	Verify that the branch with file space management enhancement
+**	can open, read and modify 1.6 HDF5 file and 1.8 HDF5 file.
+**	Also verify the correct file space strategy/threshold in use
+**	and the amount of free space.
+**
+****************************************************************/
+static void
+test_filespace_compatible(void)
+{
+    int fd_old = (-1), fd_new = (-1);   /* File descriptors for copying data */
+    hid_t	fid;	/* File id */
+    hid_t	fcpl;	/* File creation property list template */
+    hid_t       did;	/* Dataset id */
+    int         check[100]; 	/* Temporary buffer for verifying dataset data */
+    int         rdbuf[100];	/* Temporary buffer for reading in dataset data */
+    uint8_t     buf[READ_OLD_BUFSIZE];	/* temporary buffer for reading */
+    ssize_t 	nread;  	/* Number of bytes read in */
+    unsigned    i, j;		    /* Local index variable */
+    hssize_t	free_space;	    /* Amount of free space in the file */
+    hsize_t	threshold;	    /* Free space section threshold */
+    H5F_file_space_type_t strategy; /* File space handling strategy */
+    herr_t	ret;		    /* Return value */
+
+    /* Output message about test being performed */
+    MESSAGE(5, ("Testing File space compatibility for 1.6 and 1.8 files\n"));
+
+    for(j = 0; j < NELMTS(OLD_FILENAME); j++) {
+        const char *filename = H5_get_srcdir_filename(OLD_FILENAME[j]); /* Corrected test file name */
+
+	/* Copy old file into test file */
+	fd_old = HDopen(filename, O_RDONLY, 0666);
+	CHECK(fd_old, FAIL, "HDopen");
+	fd_new = HDopen(FILE5, O_RDWR|O_CREAT|O_TRUNC, 0666);
+	CHECK(fd_new, FAIL, "HDopen");
+
+	/* Copy data */
+	while((nread = HDread(fd_old, buf, (size_t)READ_OLD_BUFSIZE)) > 0) {
+        ssize_t write_err = HDwrite(fd_new, buf, (size_t)nread);
+        CHECK(write_err, -1, "HDwrite");
+    } /* end while */
+
+	/* Close the files */
+	ret = HDclose(fd_old);
+	CHECK(ret, FAIL, "HDclose");
+	ret = HDclose(fd_new);
+	CHECK(ret, FAIL, "HDclose");
+
+	/* Open the test file */
+	fid = H5Fopen(FILE5, H5F_ACC_RDWR, H5P_DEFAULT);
+	CHECK(fid, FAIL, "H5Fopen");
+
+	/* There should not be any free space in the file */
+	free_space = H5Fget_freespace(fid);
+	CHECK(free_space, FAIL, "H5Fget_freespace");
+	VERIFY(free_space, (hssize_t)0, "H5Fget_freespace");
+
+	/* Get the file's file creation property list */
+	/* Retrieve the file space handling strategy and threshold */
+	fcpl = H5Fget_create_plist(fid);
+	CHECK(fcpl, FAIL, "H5Fget_create_plist");
+	ret = H5Pget_file_space(fcpl, &strategy, &threshold);
+	CHECK(ret, FAIL, "H5Pget_file_space");
+
+	/* File space handling strategy should be H5F_FILE_SPACE_ALL = 2 */
+	/* Free space section threshold should be 1 */
+	VERIFY(strategy, 2, "H5Pget_file_space");
+	VERIFY(threshold, 1, "H5Pget_file_space");
+
+	/* Generate raw data */
+	for(i = 0; i < 100; i++)
+	    check[i] = (int)i;
+
+	/* Open and read the dataset */
+	did = H5Dopen2(fid, DSETNAME, H5P_DEFAULT);
+	CHECK(did, FAIL, "H5Dopen");
+	ret = H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdbuf);
+	CHECK(ret, FAIL, "H5Dread");
+
+	/* Verify the data read is correct */
+	for(i = 0; i < 100; i++)
+	    VERIFY(rdbuf[i], check[i], "test_compatible");
+
+	/* Close the dataset */
+	ret = H5Dclose(did);
+	CHECK(ret, FAIL, "H5Dclose");
+
+	/* Remove the dataset */
+	ret = H5Ldelete(fid, DSETNAME, H5P_DEFAULT);
+	CHECK(ret, FAIL, "H5Ldelete");
+
+    /* Close the plist */
+    ret = H5Pclose(fcpl);
+    CHECK(ret, FAIL, "H5Pclose");
+
+    /* Close the file */
+    ret = H5Fclose(fid);
+    CHECK(ret, FAIL, "H5Fclose");
+
+	/* Re-Open the file */
+	fid = H5Fopen(FILE5, H5F_ACC_RDONLY, H5P_DEFAULT);
+	CHECK(fid, FAIL, "H5Fopen");
+
+	/* The dataset should not be there */
+	did = H5Dopen2(fid, DSETNAME, H5P_DEFAULT);
+	VERIFY(did, FAIL, "H5Dopen");
+
+	/* There should not be any free space in the file */
+	free_space = H5Fget_freespace(fid);
+	CHECK(free_space, FAIL, "H5Fget_freespace");
+	VERIFY(free_space, (hssize_t)0, "H5Fget_freespace");
+
+	/* Close the file */
+	ret = H5Fclose(fid);
+	CHECK(ret, FAIL, "H5Fclose");
+    } /* end for */
+} /* test_filespace_compatible */
+
+/****************************************************************
+**
 **  test_libver_bounds_real():
 **      Verify that a file created and modified with the
 **      specified libver bounds has the specified object header
@@ -2802,6 +3389,9 @@ test_libver_bounds_real(H5F_libver_t libver_create, unsigned oh_vers_create,
 
     ret = H5Fclose(file);
     CHECK(ret, FAIL, "H5Fclose");
+
+    ret = H5Pclose(fapl);
+    CHECK(ret, FAIL, "H5Pclose");
 } /* end test_libver_bounds_real() */
 
 /****************************************************************
@@ -2820,9 +3410,7 @@ test_libver_bounds(void)
 
     /* Run the tests */
     test_libver_bounds_real(H5F_LIBVER_EARLIEST, 1, H5F_LIBVER_LATEST, 2);
-    test_libver_bounds_real(H5F_LIBVER_EARLIEST, 1, H5F_LIBVER_18, 2);
-    test_libver_bounds_real(H5F_LIBVER_LATEST, 2, H5F_LIBVER_EARLIEST, 1);
-    test_libver_bounds_real(H5F_LIBVER_18, 2, H5F_LIBVER_EARLIEST, 1);
+    test_libver_bounds_real(H5F_LIBVER_LATEST, 2, H5F_LIBVER_EARLIEST, 2);
 } /* end test_libver_bounds() */
 
 /****************************************************************
@@ -2847,7 +3435,8 @@ test_libver_macros(void)
     VERIFY(H5_VERSION_GE(major-1,minor,release+1), TRUE, "H5_VERSION_GE");
     VERIFY(H5_VERSION_GE(major,minor-1,release), TRUE, "H5_VERSION_GE");
     VERIFY(H5_VERSION_GE(major,minor-1,release+1), TRUE, "H5_VERSION_GE");
-    VERIFY(H5_VERSION_GE(major,minor,release-1), TRUE, "H5_VERSION_GE");
+    if(H5_VERS_RELEASE > 0)
+        VERIFY(H5_VERSION_GE(major,minor,release-1), TRUE, "H5_VERSION_GE");
 
     VERIFY(H5_VERSION_GE(major+1,minor,release), FALSE, "H5_VERSION_GE");
     VERIFY(H5_VERSION_GE(major+1,minor-1,release), FALSE, "H5_VERSION_GE");
@@ -2869,7 +3458,8 @@ test_libver_macros(void)
     VERIFY(H5_VERSION_LE(major-1,minor+1,release+1), FALSE, "H5_VERSION_LE");
     VERIFY(H5_VERSION_LE(major,minor-1,release), FALSE, "H5_VERSION_LE");
     VERIFY(H5_VERSION_LE(major,minor-1,release+1), FALSE, "H5_VERSION_LE");
-    VERIFY(H5_VERSION_LE(major,minor,release-1), FALSE, "H5_VERSION_LE");
+    if(H5_VERS_RELEASE > 0)
+        VERIFY(H5_VERSION_LE(major,minor,release-1), FALSE, "H5_VERSION_LE");
 } /* test_libver_macros() */
 
 /****************************************************************
@@ -2893,7 +3483,7 @@ test_libver_macros2(void)
     /*
      * Create a file.
      */
-    file = H5Fcreate(FILE5, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    file = H5Fcreate(FILE6, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
     CHECK(file, FAIL, "H5Fcreate");
 
     /*
@@ -2938,6 +3528,147 @@ test_libver_macros2(void)
 
 /****************************************************************
 **
+**  test_deprec(): 
+**	Test deprecated functionality.
+**
+****************************************************************/
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+static void
+test_deprec(void)
+{
+    hid_t       file;           /* File IDs for old & new files */
+    hid_t       fcpl;           /* File creation property list */
+    unsigned    super;          /* Superblock version # */
+    unsigned    freelist;       /* Free list version # */
+    unsigned    stab;           /* Symbol table entry version # */
+    unsigned    shhdr;          /* Shared object header version # */
+    H5F_info1_t	finfo;		/* global information about file */
+    herr_t      ret;            /* Generic return value */
+
+    /* Output message about test being performed */
+    MESSAGE(5, ("Testing deprecated routines\n"));
+
+    /* Creating a file with the default file creation property list should
+     * create a version 0 superblock
+     */
+
+    /* Create file with default file creation property list */
+    file= H5Fcreate(FILE1, H5F_ACC_TRUNC , H5P_DEFAULT, H5P_DEFAULT);
+    CHECK(file, FAIL, "H5Fcreate");
+
+    /* Get the file's version information */
+    ret = H5Fget_info1(file, &finfo);
+    CHECK(ret, FAIL, "H5Fget_info1");
+    VERIFY(finfo.super_ext_size, 0,"H5Fget_info1");
+    VERIFY(finfo.sohm.hdr_size, 0,"H5Fget_info1");
+    VERIFY(finfo.sohm.msgs_info.index_size, 0,"H5Fget_info1");
+    VERIFY(finfo.sohm.msgs_info.heap_size, 0,"H5Fget_info1");
+
+    /* Get the file's dataset creation property list */
+    fcpl =  H5Fget_create_plist(file);
+    CHECK(fcpl, FAIL, "H5Fget_create_plist");
+
+    /* Get the file's version information */
+    ret=H5Pget_version(fcpl, &super, &freelist, &stab, &shhdr);
+    CHECK(ret, FAIL, "H5Pget_version");
+    VERIFY(super,0,"H5Pget_version");
+    VERIFY(freelist,0,"H5Pget_version");
+    VERIFY(stab,0,"H5Pget_version");
+    VERIFY(shhdr,0,"H5Pget_version");
+
+    /* Close FCPL */
+    ret=H5Pclose(fcpl);
+    CHECK(ret, FAIL, "H5Pclose");
+
+    /* Close file */
+    ret=H5Fclose(file);
+    CHECK(ret, FAIL, "H5Fclose");
+
+
+    /* Create a file creation property list */
+    fcpl = H5Pcreate(H5P_FILE_CREATE);
+    CHECK(fcpl, FAIL, "H5Pcreate");
+
+    /* Set a property in the FCPL that will push the superblock version up */
+    ret = H5Pset_file_space(fcpl, H5F_FILE_SPACE_VFD, (hsize_t)0);
+    CHECK(ret, FAIL, "H5Pset_file_space");
+
+    /* Creating a file with the non-default file creation property list should
+     * create a version 2 superblock
+     */
+
+    /* Create file with custom file creation property list */
+    file= H5Fcreate(FILE1, H5F_ACC_TRUNC , fcpl, H5P_DEFAULT);
+    CHECK(file, FAIL, "H5Fcreate");
+
+    /* Close FCPL */
+    ret=H5Pclose(fcpl);
+    CHECK(ret, FAIL, "H5Pclose");
+
+    /* Get the file's version information */
+    ret = H5Fget_info1(file, &finfo);
+    CHECK(ret, FAIL, "H5Fget_info1");
+    VERIFY(finfo.super_ext_size, 40,"H5Fget_info1");
+    VERIFY(finfo.sohm.hdr_size, 0,"H5Fget_info1");
+    VERIFY(finfo.sohm.msgs_info.index_size, 0,"H5Fget_info1");
+    VERIFY(finfo.sohm.msgs_info.heap_size, 0,"H5Fget_info1");
+
+    /* Get the file's dataset creation property list */
+    fcpl =  H5Fget_create_plist(file);
+    CHECK(fcpl, FAIL, "H5Fget_create_plist");
+
+    /* Get the file's version information */
+    ret=H5Pget_version(fcpl, &super, &freelist, &stab, &shhdr);
+    CHECK(ret, FAIL, "H5Pget_version");
+    VERIFY(super,2,"H5Pget_version");
+    VERIFY(freelist,0,"H5Pget_version");
+    VERIFY(stab,0,"H5Pget_version");
+    VERIFY(shhdr,0,"H5Pget_version");
+
+    /* Close FCPL */
+    ret=H5Pclose(fcpl);
+    CHECK(ret, FAIL, "H5Pclose");
+
+    /* Close file */
+    ret=H5Fclose(file);
+    CHECK(ret, FAIL, "H5Fclose");
+
+    /* Re-open the file */
+    file = H5Fopen(FILE1, H5F_ACC_RDONLY, H5P_DEFAULT);
+    CHECK(file, FAIL, "H5Fcreate");
+
+    /* Get the file's version information */
+    ret = H5Fget_info1(file, &finfo);
+    CHECK(ret, FAIL, "H5Fget_info1");
+    VERIFY(finfo.super_ext_size, 40,"H5Fget_info1");
+    VERIFY(finfo.sohm.hdr_size, 0,"H5Fget_info1");
+    VERIFY(finfo.sohm.msgs_info.index_size, 0,"H5Fget_info1");
+    VERIFY(finfo.sohm.msgs_info.heap_size, 0,"H5Fget_info1");
+
+    /* Get the file's creation property list */
+    fcpl =  H5Fget_create_plist(file);
+    CHECK(fcpl, FAIL, "H5Fget_create_plist");
+
+    /* Get the file's version information */
+    ret=H5Pget_version(fcpl, &super, &freelist, &stab, &shhdr);
+    CHECK(ret, FAIL, "H5Pget_version");
+    VERIFY(super,2,"H5Pget_version");
+    VERIFY(freelist,0,"H5Pget_version");
+    VERIFY(stab,0,"H5Pget_version");
+    VERIFY(shhdr,0,"H5Pget_version");
+
+    /* Close FCPL */
+    ret=H5Pclose(fcpl);
+    CHECK(ret, FAIL, "H5Pclose");
+
+    /* Close file */
+    ret=H5Fclose(file);
+    CHECK(ret, FAIL, "H5Fclose");
+} /* test_deprec */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
+
+/****************************************************************
+**
 **  test_file(): Main low-level file I/O test routine.
 **
 ****************************************************************/
@@ -2967,9 +3698,23 @@ test_file(void)
     test_cached_stab_info();    /* Tests that files are created with cached stab info in the superblock */
     test_rw_noupdate();         /* Test to ensure that RW permissions don't write the file unless dirtied */
     test_userblock_alignment(); /* Tests that files created with a userblock and alignment interact properly */
+    test_filespace_sects();     /* Test file free space section information */
+    test_filespace_info();	/* Test file creation public routines:H5Pget/set_file_space */
+    test_filespace_compatible();/* Test compatibility for file space management */
     test_libver_bounds();       /* Test compatibility for file space management */
     test_libver_macros();       /* Test the macros for library version comparison */
-    test_libver_macros2();      /* Show the use of the macros for library version comparison */
+    test_libver_macros2();      /* Test the macros for library version comparison */
+    /*
+     * The two tests: test_swmr_write() and test_swmr_read() are removed.
+     * They are covered by the following tests in swmr.c:
+     *	 test_file_lock_same();
+     *	 test_file_lock_swmr_same();
+     *	 test_file_lock_concur(); 
+     * 	 test_file_lock_swmr_concur();
+     */
+#ifndef H5_NO_DEPRECATED_SYMBOLS
+    test_deprec();              /* Test deprecated routines */
+#endif /* H5_NO_DEPRECATED_SYMBOLS */
 } /* test_file() */
 
 

@@ -2995,5 +3740,6 @@ cleanup_file(void)
     HDremove(FILE2);
     HDremove(FILE3);
     HDremove(FILE4);
+    HDremove(FILE5);
 }
 
diff --git a/test/tgenprop.c b/test/tgenprop.c
index 9e97bec..c4f3a3f 100644
--- a/test/tgenprop.c
+++ b/test/tgenprop.c
@@ -21,7 +21,7 @@
 *
 *************************************************************/
 
-#define H5P_PACKAGE		/*suppress error about including H5Ppkg	  */
+#define H5P_FRIEND		/*suppress error about including H5Ppkg	  */
 
 /* Define this macro to indicate that the testing APIs should be available */
 #define H5P_TESTING
@@ -61,6 +61,18 @@ double          prop4_def=1.41F;   /* Property 4 default value */
 #define PROP4_SIZE      sizeof(prop4_def)
 #define PROP4_DEF_VALUE (&prop4_def)
 
+/* Structs used during iteration */
+typedef struct iter_data_t {
+    int     iter_count;
+    char    **names;
+} iter_data_t;
+
+typedef struct count_data_t {
+    int     count;
+    hid_t   id;
+} count_data_t;
+
+
 /****************************************************************
 **
 **  test_genprop_basic_class(): Test basic generic property list code.
@@ -284,17 +296,12 @@ test_genprop_basic_class_prop(void)
 **
 ****************************************************************/
 static int
-test_genprop_iter1(hid_t id, const char *name, void *iter_data)
+test_genprop_iter1(hid_t H5_ATTR_UNUSED id, const char *name,
+    void *iter_data)
 {
-    struct {                /* Struct for iterations */
-        int iter_count;
-        const char **names;
-    } *iter_struct = iter_data;
-
-    /* Shut compiler up */
-    id = id;
+    iter_data_t *idata = (iter_data_t *)iter_data;
 
-    return(HDstrcmp(name,iter_struct->names[iter_struct->iter_count++]));
+    return HDstrcmp(name,idata->names[idata->iter_count++]);
 }
 
 /****************************************************************
@@ -373,43 +380,34 @@ test_genprop_class_iter(void)
 static herr_t
 test_genprop_cls_crt_cb1(hid_t list_id, void *create_data)
 {
-    struct {                /* Struct for iterations */
-        int count;
-        hid_t id;
-    } *count_struct=create_data;
+    count_data_t *cdata = (count_data_t *)create_data;
 
-    count_struct->count++;
-    count_struct->id=list_id;
+    cdata->count++;
+    cdata->id = list_id;
 
-    return(SUCCEED);
+    return SUCCEED;
 }
 
 static herr_t
 test_genprop_cls_cpy_cb1(hid_t new_list_id, hid_t H5_ATTR_UNUSED old_list_id, void *copy_data)
 {
-    struct {                /* Struct for iterations */
-        int count;
-        hid_t id;
-    } *count_struct=copy_data;
+    count_data_t *cdata = (count_data_t *)copy_data;
 
-    count_struct->count++;
-    count_struct->id=new_list_id;
+    cdata->count++;
+    cdata->id = new_list_id;
 
-    return(SUCCEED);
+    return SUCCEED;
 }
 
 static herr_t
 test_genprop_cls_cls_cb1(hid_t list_id, void *create_data)
 {
-    struct {                /* Struct for iterations */
-        int count;
-        hid_t id;
-    } *count_struct=create_data;
+    count_data_t *cdata = (count_data_t *)create_data;
 
-    count_struct->count++;
-    count_struct->id=list_id;
+    cdata->count++;
+    cdata->id = list_id;
 
-    return(SUCCEED);
+    return SUCCEED;
 }
 
 /****************************************************************
@@ -681,9 +679,9 @@ test_genprop_basic_list(void)
     ret = H5Pget(lid1, PROP2_NAME,&prop2_value);
     CHECK_I(ret, "H5Pget");
     /* Verify the floating-poing value in this way to avoid compiler warning. */
-    if(!FLT_ABS_EQUAL(prop2_value,*PROP2_DEF_VALUE))
+    if(!H5_FLT_ABS_EQUAL(prop2_value,*PROP2_DEF_VALUE))
 	printf("*** UNEXPECTED VALUE from %s should be %f, but is %f at line %4d in %s\n",
-	    "H5Pget", *PROP2_DEF_VALUE, prop2_value, (int)__LINE__, __FILE__);
+	    "H5Pget", (double)*PROP2_DEF_VALUE, (double)prop2_value, (int)__LINE__, __FILE__);
 
 
     /* Close list */
@@ -773,9 +771,9 @@ test_genprop_basic_list_prop(void)
     ret = H5Pget(lid1, PROP2_NAME,&prop2_value);
     CHECK_I(ret, "H5Pget");
     /* Verify the floating-poing value in this way to avoid compiler warning. */
-    if(!FLT_ABS_EQUAL(prop2_value,*PROP2_DEF_VALUE))
+    if(!H5_FLT_ABS_EQUAL(prop2_value,*PROP2_DEF_VALUE))
 	printf("*** UNEXPECTED VALUE from %s should be %f, but is %f at line %4d in %s\n",
-	    "H5Pget", *PROP2_DEF_VALUE, prop2_value, (int)__LINE__, __FILE__);
+	    "H5Pget", (double)*PROP2_DEF_VALUE, (double)prop2_value, (int)__LINE__, __FILE__);
 
 
     /* Check values of temporary properties (set with regular values) */
@@ -786,7 +784,7 @@ test_genprop_basic_list_prop(void)
     ret = H5Pget(lid1, PROP4_NAME,&prop4_value);
     CHECK_I(ret, "H5Pget");
     /* Verify the floating-poing value in this way to avoid compiler warning. */
-    if(!FLT_ABS_EQUAL(prop4_value,*PROP4_DEF_VALUE))
+    if(!H5_FLT_ABS_EQUAL(prop4_value,(double)*PROP4_DEF_VALUE))
 	printf("*** UNEXPECTED VALUE from %s should be %f, but is %f at line %4d in %s\n",
 	    "H5Pget", *PROP4_DEF_VALUE, prop4_value, (int)__LINE__, __FILE__);
 
@@ -823,7 +821,7 @@ test_genprop_basic_list_prop(void)
     ret = H5Pget(lid1, PROP4_NAME,&prop4_value);
     CHECK_I(ret, "H5Pget");
     /* Verify the floating-poing value in this way to avoid compiler warning. */
-    if(!FLT_ABS_EQUAL(prop4_value,*PROP4_DEF_VALUE))
+    if(!H5_FLT_ABS_EQUAL(prop4_value,*PROP4_DEF_VALUE))
 	printf("*** UNEXPECTED VALUE from %s should be %f, but is %f at line %4d in %s\n",
 	    "H5Pget", *PROP4_DEF_VALUE, prop4_value, (int)__LINE__, __FILE__);
 
@@ -843,17 +841,12 @@ test_genprop_basic_list_prop(void)
 **
 ****************************************************************/
 static int
-test_genprop_iter2(hid_t id, const char *name, void *iter_data)
+test_genprop_iter2(hid_t H5_ATTR_UNUSED id, const char *name,
+    void *iter_data)
 {
-    struct {                /* Struct for iterations */
-        int iter_count;
-        const char **names;
-    } *iter_struct=iter_data;
-
-    /* Shut compiler up */
-    id=id;
+    iter_data_t *idata = (iter_data_t *)iter_data;
 
-    return(HDstrcmp(name,iter_struct->names[iter_struct->iter_count++]));
+    return HDstrcmp(name,idata->names[idata->iter_count++]);
 }
 
 /****************************************************************
@@ -995,15 +988,12 @@ prop_cb_info prop3_cb_info;     /* Callback statistics for property #3 */
 static herr_t
 test_genprop_cls_cpy_cb2(hid_t new_list_id, hid_t H5_ATTR_UNUSED old_list_id, void *create_data)
 {
-    struct {                /* Struct for iterations */
-        int count;
-        hid_t id;
-    } *count_struct=create_data;
+    count_data_t *cdata = (count_data_t *)create_data;
 
-    count_struct->count++;
-    count_struct->id=new_list_id;
+    cdata->count++;
+    cdata->id = new_list_id;
 
-    return(SUCCEED);
+    return SUCCEED;
 }
 
 /****************************************************************
@@ -1213,9 +1203,9 @@ test_genprop_list_callback(void)
     lid1 = H5Pcreate(cid1);
     CHECK_I(lid1, "H5Pcreate");
 
-    /* The compare callback should have been called once on property 1 (to check
-     * if the create callback modified the value) */
-    VERIFY(prop1_cb_info.cmp_count, 1, "H5Pcreate");
+    /* The compare callback should not have been called once on property 1, as
+     *  the property is always copied */
+    VERIFY(prop1_cb_info.cmp_count, 0, "H5Pcreate");
     /* The compare callback should not have been called on property 3, as there
      * is no create callback */
     VERIFY(prop3_cb_info.cmp_count, 0, "H5Pcreate");
@@ -1231,15 +1221,14 @@ test_genprop_list_callback(void)
     ret = H5Pget(lid1, PROP1_NAME,&prop1_value);
     CHECK_I(ret, "H5Pget");
     VERIFY(prop1_value, *PROP1_DEF_VALUE, "H5Pget");
-    /* The compare callback should have been called once (to check if the get
-     * callback modified the value) */
-    VERIFY(prop1_cb_info.cmp_count, 2, "H5Pget");
+    /* The compare callback should not have been called */
+    VERIFY(prop1_cb_info.cmp_count, 0, "H5Pget");
     ret = H5Pget(lid1, PROP2_NAME,&prop2_value);
     CHECK_I(ret, "H5Pget");
     /* Verify the floating-poing value in this way to avoid compiler warning. */
-    if(!FLT_ABS_EQUAL(prop2_value,*PROP2_DEF_VALUE))
+    if(!H5_FLT_ABS_EQUAL(prop2_value,*PROP2_DEF_VALUE))
 	printf("*** UNEXPECTED VALUE from %s should be %f, but is %f at line %4d in %s\n",
-	    "H5Pget", *PROP2_DEF_VALUE, prop2_value, (int)__LINE__, __FILE__);
+	    "H5Pget", (double)*PROP2_DEF_VALUE, (double)prop2_value, (int)__LINE__, __FILE__);
 
     /* Check values of temporary properties (set with regular values) */
     ret = H5Pget(lid1, PROP3_NAME,&prop3_value);
@@ -1252,7 +1241,7 @@ test_genprop_list_callback(void)
     ret = H5Pget(lid1, PROP4_NAME,&prop4_value);
     CHECK_I(ret, "H5Pget");
     /* Verify the floating-poing value in this way to avoid compiler warning. */
-    if(!FLT_ABS_EQUAL(prop4_value,*PROP4_DEF_VALUE))
+    if(!H5_FLT_ABS_EQUAL(prop4_value,(double)*PROP4_DEF_VALUE))
 	printf("*** UNEXPECTED VALUE from %s should be %f, but is %f at line %4d in %s\n",
 	    "H5Pget", *PROP4_DEF_VALUE, prop4_value, (int)__LINE__, __FILE__);
 
@@ -1276,17 +1265,15 @@ test_genprop_list_callback(void)
     if(HDmemcmp(prop1_cb_info.set_value,&prop1_new_value, PROP1_SIZE)!=0)
         TestErrPrintf("Property #1 value doesn't match!, line=%d\n",__LINE__);
 
-    /* The compare callback should have been called once (to check if the new
-     * value needed to be copied onto the property list) */
-    VERIFY(prop1_cb_info.cmp_count, 3, "H5Pset");
+    /* The compare callback should not have been called  */
+    VERIFY(prop1_cb_info.cmp_count, 0, "H5Pset");
 
     /* Set value of property #3 to different value */
     ret = H5Pset(lid1, PROP3_NAME,prop3_new_value);
     CHECK_I(ret, "H5Pset");
 
-    /* The compare callback should have been called once (to check if the new
-     * value needed to be copied onto the property list) */
-    VERIFY(prop3_cb_info.cmp_count, 1, "H5Pset");
+    /* The compare callback should not have been called */
+    VERIFY(prop3_cb_info.cmp_count, 0, "H5Pset");
 
     /* Check new value of tracked properties */
     ret = H5Pget(lid1, PROP1_NAME,&prop1_value);
@@ -1333,8 +1320,8 @@ test_genprop_list_callback(void)
     VERIFY(ret, 1, "H5Pequal");
 
     /* Verify compare callback information for properties tracked */
-    VERIFY(prop1_cb_info.cmp_count, 4, "H5Pequal");
-    VERIFY(prop3_cb_info.cmp_count, 2, "H5Pequal");
+    VERIFY(prop1_cb_info.cmp_count, 1, "H5Pequal");
+    VERIFY(prop3_cb_info.cmp_count, 1, "H5Pequal");
 
     /* Close first list */
     ret = H5Pclose(lid1);
diff --git a/test/th5o.c b/test/th5o.c
index 40844fa..3be5d12 100644
--- a/test/th5o.c
+++ b/test/th5o.c
@@ -164,7 +164,7 @@ test_h5o_close(void)
     /* Create the group and close it with H5Oclose */
     grp = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
     CHECK(grp, FAIL, "H5Gcreate2");
-    VERIFY(H5Iget_type(grp), H5I_GROUP, "H5Iget_type");
+    VERIFY_TYPE(H5Iget_type(grp), H5I_GROUP, H5I_type_t, "%d", "H5Iget_type");
     ret = H5Oclose(grp);
     CHECK(ret, FAIL, "H5Oclose");
 
@@ -776,7 +776,7 @@ test_h5o_link(void)
     hid_t lcpl_id=-1;
     hsize_t dims[2] = {TEST6_DIM1, TEST6_DIM2};
     htri_t committed;           /* Whether the named datatype is committed */
-    hbool_t new_format;         /* Whether to use the new format or not */
+    unsigned new_format;        /* Whether to use the new format or not */
     int wdata[TEST6_DIM1][TEST6_DIM2];
     int rdata[TEST6_DIM1][TEST6_DIM2];
     int i, n, j;
@@ -1335,6 +1335,7 @@ test_h5o_getinfo_same_file(void)
 
 } /* test_h5o_getinfo_same_file() */
 
+
 

 /****************************************************************
 **
diff --git a/test/th5s.c b/test/th5s.c
index dcee25f..a478803 100644
--- a/test/th5s.c
+++ b/test/th5s.c
@@ -177,24 +177,18 @@ test_h5s_basic(void)
      * the instructions in space_overflow.c for regenerating the th5s.h5 file.
      */
     {
-    char testfile[512]="";
-    char *srcdir = HDgetenv("srcdir");
-    if (srcdir && ((HDstrlen(srcdir) + HDstrlen(TESTFILE) + 1) < sizeof(testfile))){
-	HDstrcpy(testfile, srcdir);
-	HDstrcat(testfile, "/");
-    }
-    HDstrcat(testfile, TESTFILE);
+    const char *testfile = H5_get_srcdir_filename(TESTFILE); /* Corrected test file name */
+
     fid1 = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT);
     CHECK_I(fid1, "H5Fopen");
     if (fid1 >= 0){
-	dset1 = H5Dopen2(fid1, "dset", H5P_DEFAULT);
-	VERIFY(dset1, FAIL, "H5Dopen2");
-	ret = H5Fclose(fid1);
-	CHECK_I(ret, "H5Fclose");
+        dset1 = H5Dopen2(fid1, "dset", H5P_DEFAULT);
+        VERIFY(dset1, FAIL, "H5Dopen2");
+        ret = H5Fclose(fid1);
+        CHECK_I(ret, "H5Fclose");
     }
     else
-	printf("***cannot open the pre-created H5S_MAX_RANK test file (%s)\n",
-	    testfile);
+        printf("***cannot open the pre-created H5S_MAX_RANK test file (%s)\n", testfile);
     }
 
     /* Verify that incorrect dimensions don't work */
@@ -571,7 +565,7 @@ test_h5s_zero_dim(void)
                 wdata_real[i][j][k] = i + j + k;
 
     /* Test with different space allocation times */
-    for(alloc_time = H5D_ALLOC_TIME_EARLY; alloc_time <= H5D_ALLOC_TIME_INCR; alloc_time++) {
+    for(alloc_time = H5D_ALLOC_TIME_EARLY; alloc_time <= H5D_ALLOC_TIME_INCR; H5_INC_ENUM(H5D_alloc_time_t, alloc_time)) {
 
         /* Make sure we can create the space with the dimension size 0 (starting from v1.8.7).
          * The dimension doesn't need to be unlimited. */
@@ -1177,6 +1171,7 @@ test_h5s_encode(void)
     H5S_sel_type        sel_type;
     H5S_class_t         space_type;
     hssize_t            nblocks;
+    hid_t		ret_id;		/* Generic hid_t return value	*/
     herr_t		ret;		/* Generic return value		*/
 
     /* Output message about test being performed */
@@ -1201,9 +1196,9 @@ test_h5s_encode(void)
 
     /* Try decoding bogus buffer */
     H5E_BEGIN_TRY {
-	ret = H5Sdecode(sbuf);
+	ret_id = H5Sdecode(sbuf);
     } H5E_END_TRY;
-    VERIFY(ret, FAIL, "H5Sdecode");
+    VERIFY(ret_id, FAIL, "H5Sdecode");
 
     ret = H5Sencode(sid1, sbuf, &sbuf_size);
     CHECK(ret, FAIL, "H5Sencode");
@@ -1586,7 +1581,7 @@ test_h5s_compound_scalar_read(void)
     if(HDmemcmp(&space4_data,&rdata,sizeof(struct space4_struct))) {
         printf("scalar data different: space4_data.c1=%c, read_data4.c1=%c\n",space4_data.c1,rdata.c1);
         printf("scalar data different: space4_data.u=%u, read_data4.u=%u\n",space4_data.u,rdata.u);
-        printf("scalar data different: space4_data.f=%f, read_data4.f=%f\n",space4_data.f,rdata.f);
+        printf("scalar data different: space4_data.f=%f, read_data4.f=%f\n",(double)space4_data.f,(double)rdata.f);
         TestErrPrintf("scalar data different: space4_data.c1=%c, read_data4.c1=%c\n",space4_data.c1,rdata.c2);
      } /* end if */
 
@@ -1688,8 +1683,8 @@ test_h5s_chunk(void)
     for(i=0; i<50000; i++) {
         for(j=0; j<3; j++) {
             /* Check if the two values are within 0.001% range. */
-            if(!DBL_REL_EQUAL(chunk_data_dbl[i][j], chunk_data_flt[i][j], 0.00001F))
-                TestErrPrintf("%u: chunk_data_dbl[%d][%d]=%e, chunk_data_flt[%d][%d]=%e\n", (unsigned)__LINE__, i, j, chunk_data_dbl[i][j], i, j, chunk_data_flt[i][j]);
+            if(!H5_DBL_REL_EQUAL(chunk_data_dbl[i][j], chunk_data_flt[i][j], 0.00001F))
+                TestErrPrintf("%u: chunk_data_dbl[%d][%d]=%e, chunk_data_flt[%d][%d]=%e\n", (unsigned)__LINE__, i, j, chunk_data_dbl[i][j], i, j, (double)chunk_data_flt[i][j]);
         } /* end for */
     } /* end for */
 } /* test_h5s_chunk() */
diff --git a/test/th5s.h5 b/test/th5s.h5
index 7a0bfb3..bc2b666 100644
Binary files a/test/th5s.h5 and b/test/th5s.h5 differ
diff --git a/test/tid.c b/test/tid.c
index 087d9f3..6570b1c 100644
--- a/test/tid.c
+++ b/test/tid.c
@@ -19,7 +19,7 @@
 #include "hdf5.h"
 
 	/* Include H5Ipkg.h to calculate max number of groups */
-#define H5I_PACKAGE
+#define H5I_FRIEND		/*suppress error about including H5Ipkg	  */
 #include "H5Ipkg.h"
 
 	/* Test basic functionality of registering and deleting types and IDs */
@@ -336,8 +336,8 @@ out:
 static int test_is_valid(void)
 {
     hid_t   dtype;      /* datatype id */
-    int     nmembs1;    /* number of type memnbers */
-    int     nmembs2;
+    int64_t nmembs1;    /* number of type memnbers */
+    int64_t nmembs2;
     htri_t  tri_ret;    /* htri_t return value */
     herr_t  ret;        /* return value */
 
@@ -533,136 +533,6 @@ out:
 	return -1;
 }
 
-/* 'Fake' free routine for ID wrapping test */
-static herr_t fake_free(void *obj)
-{
-    /* Shut compilers up */
-    obj = obj;
-
-    return(0);
-}
-
-	/* Test boundary cases with lots of IDs */
-
-/* Type IDs range from 0 to ID_MASK before wrapping around.  The code will assign */
-/* IDs in sequential order until ID_MASK IDs have been given out. */
-/* This test will allocate IDs up to ID_MASK, ensure that IDs wrap around */
-/* to low values successfully, then ensure that deleting types frees up their IDs. */
-/* NOTE: this test depends on the implementation of IDs, so may break */
-/*		if the implementation changes. */
-static int test_id_wrap(void)
-{
-    H5I_type_t testType;    /* ID class for testing */
-    hid_t *id_array;    /* Array of IDs allocated */
-    hid_t test_id;      /* Test ID */
-    void *obj;          /* Object pointer returned for ID */
-    unsigned u;         /* Local index variable */
-    hsize_t nids;       /* Number of IDs registered for type */
-    herr_t status;      /* Status from routine */
-
-    /* Allocate array for storing IDs */
-    id_array = (hid_t *)HDmalloc((ID_MASK + 1) * sizeof(hid_t));
-    CHECK(id_array, NULL, "HDmalloc");
-
-    /* Register type for testing */
-    testType = H5Iregister_type((size_t)8, 0, (H5I_free_t)fake_free);
-    CHECK(testType, H5I_BADID, "H5Iregister_type");
-    if(testType == H5I_BADID)
-        goto out;
-
-    /* Get IDs, up to the maximum possible */
-    for(u = 0; u <= ID_MASK; u++) {
-        id_array[u] = H5Iregister(testType, &id_array[u]);
-        CHECK(id_array[u], FAIL, "H5Iregister");
-        if(id_array[u] < 0)
-            goto out;
-        if(u > 0) {
-            /* IDs should be returned in increasing order */
-            /* (Since application-registered IDs don't reuse ID values) */
-            if(id_array[u] < id_array[u - 1])
-                goto out;
-
-            /* Release the previous ID in the array */
-            obj = H5Iremove_verify(id_array[u - 1], testType);
-            CHECK(obj, NULL, "H5Iremove_verify");
-            if(NULL == obj)
-                goto out;
-            VERIFY(obj, &id_array[u - 1], "H5Iremove_verify");
-            if(&id_array[u - 1] != obj)
-                goto out;
-        } /* end if */
-
-        /* Verify number of registered IDs */
-        /* (Should stay at 1) */
-        status = H5Inmembers(testType, &nids);
-        CHECK(status, FAIL, "H5Inmembers");
-        if(status < 0)
-            goto out;
-        VERIFY(nids, 1, "H5Inmembers");
-        if(nids != 1)
-            goto out;
-    } /* end for */
-
-    /* Register another object, will wraparound */
-    test_id = H5Iregister(testType, &id_array[0]);
-    CHECK(test_id, FAIL, "H5Iregister");
-    if(test_id < 0)
-        goto out;
-    VERIFY(test_id, id_array[0], "H5Iregister");
-    if(id_array[0] != test_id)
-        goto out;
-
-    /* Verify number of registered IDs */
-    /* (Should be 2 now) */
-    status = H5Inmembers(testType, &nids);
-    CHECK(status, FAIL, "H5Inmembers");
-    if(status < 0)
-        goto out;
-    VERIFY(nids, 2, "H5Inmembers");
-    if(nids != 2)
-        goto out;
-
-    /* Release the first ID in the array */
-    obj = H5Iremove_verify(id_array[0], testType);
-    CHECK(obj, NULL, "H5Iremove_verify");
-    if(NULL == obj)
-        goto out;
-    VERIFY(obj, &id_array[0], "H5Iremove_verify");
-    if(&id_array[0] != obj)
-        goto out;
-
-    /* Release the last ID in the array */
-    obj = H5Iremove_verify(id_array[ID_MASK], testType);
-    CHECK(obj, NULL, "H5Iremove_verify");
-    if(NULL == obj)
-        goto out;
-    VERIFY(obj, &id_array[ID_MASK], "H5Iremove_verify");
-    if(&id_array[ID_MASK] != obj)
-        goto out;
-
-    /* Verify number of registered IDs */
-    /* (Should be 0 now) */
-    status = H5Inmembers(testType, &nids);
-    CHECK(status, FAIL, "H5Inmembers");
-    if(status < 0)
-        goto out;
-    VERIFY(nids, 0, "H5Inmembers");
-    if(nids != 0)
-        goto out;
-
-    status = H5Idestroy_type(testType);
-    CHECK(status, FAIL, "H5Idestroy_type");
-    if(status < 0)
-        goto out;
-
-    HDfree(id_array);
-
-    return(0);
-
-out:
-    return(-1);
-}
-
     /* Test removing ids in callback for H5Iclear_type */
 
 /* There was a rare bug where, if an id free callback being called by
@@ -868,6 +738,6 @@ void test_ids(void)
 	if (test_is_valid() < 0) TestErrPrintf("H5Iis_valid test failed\n");
 	if (test_get_type() < 0) TestErrPrintf("H5Iget_type test failed\n");
 	if (test_id_type_list() < 0) TestErrPrintf("ID type list test failed\n");
-	if (test_id_wrap() < 0) TestErrPrintf("ID wraparound test failed\n");
 	if (test_remove_clear_type() < 0) TestErrPrintf("ID remove during H5Iclear_type test failed\n");
+
 }
diff --git a/test/titerate.c b/test/titerate.c
index fff13f1..20a3940 100644
--- a/test/titerate.c
+++ b/test/titerate.c
@@ -704,7 +704,7 @@ static void test_grp_memb_funcs(hid_t fapl)
     char dataset_name[NAMELEN];  /* dataset name */
     ssize_t name_len;       /* Length of object's name */
     H5G_info_t ginfo;       /* Buffer for querying object's info */
-    herr_t ret;		    /* Generic return value */
+    herr_t ret = SUCCEED;	/* Generic return value */
 
     /* Output message about test being performed */
     MESSAGE(5, ("Testing Group Member Information Functionality\n"));
@@ -919,7 +919,7 @@ void
 test_iterate(void)
 {
     hid_t fapl, fapl2;          /* File access property lists */
-    hbool_t new_format;         /* Whether to use the new format or not */
+    unsigned new_format;        /* Whether to use the new format or not */
     herr_t ret;		        /* Generic return value */
 
     /* Output message about test being performed */
diff --git a/test/tlayouto.h5 b/test/tlayouto.h5
index a038e68..3322020 100644
Binary files a/test/tlayouto.h5 and b/test/tlayouto.h5 differ
diff --git a/test/tmisc.c b/test/tmisc.c
index 5b4bdb3..1298f6b 100644
--- a/test/tmisc.c
+++ b/test/tmisc.c
@@ -23,7 +23,7 @@
 *
 *************************************************************/
 
-#define H5D_PACKAGE    /*suppress error about including H5Dpkg    */
+#define H5D_FRIEND		/*suppress error about including H5Dpkg	  */
 
 /* Define this macro to indicate that the testing APIs should be available */
 #define H5D_TESTING
@@ -713,7 +713,7 @@ create_struct3(void)
     misc5_struct3_hndl *str3hndl;       /* New 'struct3' created */
     herr_t ret;                         /* For error checking */
 
-    str3hndl = HDmalloc(sizeof(misc5_struct3_hndl));
+    str3hndl = (misc5_struct3_hndl *)HDmalloc(sizeof(misc5_struct3_hndl));
     CHECK(str3hndl,NULL,"malloc");
 
     str3hndl->st3h_base = H5Tcreate(H5T_COMPOUND, sizeof(misc5_struct3));
@@ -722,10 +722,10 @@ create_struct3(void)
     ret = H5Tinsert(str3hndl->st3h_base, "st3_el1", HOFFSET( misc5_struct3, st3_el1), H5T_NATIVE_INT);
     CHECK(ret,FAIL,"H5Tinsert");
 
-    str3hndl->st3h_id=H5Tvlen_create(str3hndl->st3h_base);
+    str3hndl->st3h_id = H5Tvlen_create(str3hndl->st3h_base);
     CHECK(str3hndl->st3h_id,FAIL,"H5Tvlen_create");
 
-    return(str3hndl);
+    return str3hndl;
 }
 
 static void
@@ -733,10 +733,10 @@ delete_struct3(misc5_struct3_hndl *str3hndl)
 {
     herr_t ret;                         /* For error checking */
 
-    ret=H5Tclose(str3hndl->st3h_id);
+    ret = H5Tclose(str3hndl->st3h_id);
     CHECK(ret,FAIL,"H5Tclose");
 
-    ret=H5Tclose(str3hndl->st3h_base);
+    ret = H5Tclose(str3hndl->st3h_base);
     CHECK(ret,FAIL,"H5Tclose");
 
     HDfree(str3hndl);
@@ -756,7 +756,7 @@ create_struct2(void)
     misc5_struct2_hndl *str2hndl;       /* New 'struct2' created */
     herr_t ret;                         /* For error checking */
 
-    str2hndl = HDmalloc(sizeof(misc5_struct2_hndl));
+    str2hndl = (misc5_struct2_hndl *)HDmalloc(sizeof(misc5_struct2_hndl));
     CHECK(str2hndl, NULL, "malloc");
 
     str2hndl->st2h_base = H5Tcreate(H5T_COMPOUND, sizeof(misc5_struct2));
@@ -765,16 +765,16 @@ create_struct2(void)
     ret = H5Tinsert(str2hndl->st2h_base, "st2_el1", HOFFSET(misc5_struct2, st2_el1), H5T_NATIVE_INT);
     CHECK(ret, FAIL, "H5Tinsert");
 
-    str2hndl->st2h_st3hndl=create_struct3();
+    str2hndl->st2h_st3hndl = create_struct3();
     CHECK(str2hndl->st2h_st3hndl,NULL,"create_struct3");
 
-    ret=H5Tinsert(str2hndl->st2h_base, "st2_el2", HOFFSET(misc5_struct2, st2_el2), str2hndl->st2h_st3hndl->st3h_id);
+    ret = H5Tinsert(str2hndl->st2h_base, "st2_el2", HOFFSET(misc5_struct2, st2_el2), str2hndl->st2h_st3hndl->st3h_id);
     CHECK(ret,FAIL,"H5Tinsert");
 
-    str2hndl->st2h_id= H5Tvlen_create(str2hndl->st2h_base);
+    str2hndl->st2h_id = H5Tvlen_create(str2hndl->st2h_base);
     CHECK(str2hndl->st2h_id,FAIL,"H5Tvlen_create");
 
-    return(str2hndl);
+    return str2hndl;
 }
 
 static void
@@ -798,10 +798,10 @@ set_struct2(misc5_struct2 *buf)
 {
     unsigned i;         /* Local index variable */
 
-    buf->st2_el1=MISC5_DBGELVAL2;
-    buf->st2_el2.len=MISC5_DBGNELM3;
+    buf->st2_el1 = MISC5_DBGELVAL2;
+    buf->st2_el2.len = MISC5_DBGNELM3;
 
-    buf->st2_el2.p=HDmalloc((buf->st2_el2.len)*sizeof(misc5_struct3));
+    buf->st2_el2.p = HDmalloc((buf->st2_el2.len)*sizeof(misc5_struct3));
     CHECK(buf->st2_el2.p,NULL,"malloc");
 
     for(i=0; i<(buf->st2_el2.len); i++)
@@ -822,7 +822,7 @@ create_struct1(void)
     misc5_struct1_hndl *str1hndl;       /* New 'struct1' created */
     herr_t ret;                         /* For error checking */
 
-    str1hndl = HDmalloc(sizeof(misc5_struct1_hndl));
+    str1hndl = (misc5_struct1_hndl *)HDmalloc(sizeof(misc5_struct1_hndl));
     CHECK(str1hndl, NULL, "malloc");
 
     str1hndl->st1h_base = H5Tcreate(H5T_COMPOUND, sizeof(misc5_struct1));
@@ -834,13 +834,13 @@ create_struct1(void)
     str1hndl->st1h_st2hndl=create_struct2();
     CHECK(str1hndl->st1h_st2hndl,NULL,"create_struct2");
 
-    ret=H5Tinsert(str1hndl->st1h_base, "st1_el2", HOFFSET(misc5_struct1, st1_el2), str1hndl->st1h_st2hndl->st2h_id);
+    ret = H5Tinsert(str1hndl->st1h_base, "st1_el2", HOFFSET(misc5_struct1, st1_el2), str1hndl->st1h_st2hndl->st2h_id);
     CHECK(ret,FAIL,"H5Tinsert");
 
-    str1hndl->st1h_id=H5Tvlen_create(str1hndl->st1h_base);
+    str1hndl->st1h_id = H5Tvlen_create(str1hndl->st1h_base);
     CHECK(str1hndl->st1h_id,FAIL,"H5Tvlen_create");
 
-    return(str1hndl);
+    return str1hndl;
 }
 
 static void
@@ -848,12 +848,12 @@ delete_struct1(misc5_struct1_hndl *str1hndl)
 {
     herr_t ret;                         /* For error checking */
 
-    ret=H5Tclose(str1hndl->st1h_id);
+    ret = H5Tclose(str1hndl->st1h_id);
     CHECK(ret,FAIL,"H5Tclose");
 
     delete_struct2(str1hndl->st1h_st2hndl);
 
-    ret=H5Tclose(str1hndl->st1h_base);
+    ret = H5Tclose(str1hndl->st1h_base);
     CHECK(ret,FAIL,"H5Tclose");
 
     HDfree(str1hndl);
@@ -1243,10 +1243,10 @@ test_misc8(void)
     MESSAGE(5, ("Testing dataset storage sizes\n"));
 
     /* Allocate space for the data to write & read */
-    wdata=HDmalloc(sizeof(int)*MISC8_DIM0*MISC8_DIM1);
+    wdata = (int *)HDmalloc(sizeof(int) * MISC8_DIM0 * MISC8_DIM1);
     CHECK(wdata,NULL,"malloc");
 #ifdef VERIFY_DATA
-    rdata=HDmalloc(sizeof(int)*MISC8_DIM0*MISC8_DIM1);
+    rdata = (int *)HDmalloc(sizeof(int) * MISC8_DIM0 * MISC8_DIM1);
     CHECK(rdata,NULL,"malloc");
 #endif /* VERIFY_DATA */
 
@@ -1254,7 +1254,7 @@ test_misc8(void)
     tdata=wdata;
     for(u=0; u<MISC8_DIM0; u++)
         for(v=0; v<MISC8_DIM1; v++)
-            *tdata++=((u*MISC8_DIM1)+v)%13;
+            *tdata++ = (int)(((u * MISC8_DIM1) + v) % 13);
 
     /* Create a file acccess property list */
     fapl = H5Pcreate(H5P_FILE_ACCESS);
@@ -1310,7 +1310,7 @@ test_misc8(void)
     /* Check the storage size */
     storage_size = H5Dget_storage_size(did);
     CHECK(storage_size, 0, "H5Dget_storage_size");
-    VERIFY(storage_size, MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT), "H5Dget_storage_size");
+    VERIFY(storage_size, (hsize_t)(MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT)), "H5Dget_storage_size");
 
     /* Close dataset ID */
     ret = H5Dclose(did);
@@ -1336,7 +1336,7 @@ test_misc8(void)
     /* Check the storage size after data is written */
     storage_size = H5Dget_storage_size(did);
     CHECK(storage_size, 0, "H5Dget_storage_size");
-    VERIFY(storage_size, MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT), "H5Dget_storage_size");
+    VERIFY(storage_size, (hsize_t)(MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT)), "H5Dget_storage_size");
 
     /* Close dataset ID */
     ret = H5Dclose(did);
@@ -1361,7 +1361,7 @@ test_misc8(void)
     /* Check the storage size after data is written */
     storage_size = H5Dget_storage_size(did);
     CHECK(storage_size, 0, "H5Dget_storage_size");
-    VERIFY(storage_size, MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT), "H5Dget_storage_size");
+    VERIFY(storage_size, (hsize_t)(MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT)), "H5Dget_storage_size");
 
     /* Close dataset ID */
     ret = H5Dclose(did);
@@ -1405,7 +1405,7 @@ test_misc8(void)
     /* Check the storage size */
     storage_size = H5Dget_storage_size(did);
     CHECK(storage_size, 0, "H5Dget_storage_size");
-    VERIFY(storage_size, MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT), "H5Dget_storage_size");
+    VERIFY(storage_size, (hsize_t)(MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT)), "H5Dget_storage_size");
 
     /* Close dataset ID */
     ret = H5Dclose(did);
@@ -1432,7 +1432,7 @@ test_misc8(void)
     /* Check the storage size after data is written */
     storage_size = H5Dget_storage_size(did);
     CHECK(storage_size, 0, "H5Dget_storage_size");
-    VERIFY(storage_size, MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT), "H5Dget_storage_size");
+    VERIFY(storage_size, (hsize_t)(MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT)), "H5Dget_storage_size");
 
     /* Close dataset ID */
     ret = H5Dclose(did);
@@ -1462,7 +1462,7 @@ test_misc8(void)
     /* Check the storage size after data is written */
     storage_size = H5Dget_storage_size(did);
     CHECK(storage_size, 0, "H5Dget_storage_size");
-    VERIFY(storage_size, MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT), "H5Dget_storage_size");
+    VERIFY(storage_size, (hsize_t)(MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT)), "H5Dget_storage_size");
 
     /* Close dataset ID */
     ret = H5Dclose(did);
@@ -1486,7 +1486,7 @@ test_misc8(void)
 
     /* Check the storage size after only four chunks are written */
     storage_size = H5Dget_storage_size(did);
-    VERIFY(storage_size, 4 * MISC8_CHUNK_DIM0 * MISC8_CHUNK_DIM1 * H5Tget_size(H5T_NATIVE_INT), "H5Dget_storage_size");
+    VERIFY(storage_size, (hsize_t)(4 * MISC8_CHUNK_DIM0 * MISC8_CHUNK_DIM1 * H5Tget_size(H5T_NATIVE_INT)), "H5Dget_storage_size");
 
     /* Write entire dataset */
     ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
@@ -1509,7 +1509,7 @@ test_misc8(void)
     /* Check the storage size after data is written */
     storage_size = H5Dget_storage_size(did);
     CHECK(storage_size, 0, "H5Dget_storage_size");
-    VERIFY(storage_size, MISC8_DIM0*MISC8_DIM1*H5Tget_size(H5T_NATIVE_INT), "H5Dget_storage_size");
+    VERIFY(storage_size, (hsize_t)(MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT)), "H5Dget_storage_size");
 
     /* Close dataset ID */
     ret = H5Dclose(did);
@@ -1736,20 +1736,12 @@ test_misc10(void)
     hid_t       dataset, dataset_new;   /* Dataset IDs for old & new datasets */
     hid_t       dcpl;           /* Dataset creation property list */
     hid_t       space, type;    /* Old dataset's dataspace & datatype */
-    char testfile[512]="";          /* Character buffer for corrected test file name */
-    char *srcdir = HDgetenv("srcdir");    /* Pointer to the directory the source code is located within */
+    const char *testfile = H5_get_srcdir_filename(MISC10_FILE_OLD); /* Corrected test file name */
     herr_t      ret;
 
     /* Output message about test being performed */
     MESSAGE(5, ("Testing using old dataset creation property list\n"));
 
-    /* Generate the correct name for the test file, by prepending the source path */
-    if(srcdir && ((HDstrlen(srcdir) + HDstrlen(MISC10_FILE_OLD) + 1) < sizeof(testfile))) {
-        HDstrcpy(testfile, srcdir);
-        HDstrcat(testfile, "/");
-    }
-    HDstrcat(testfile, MISC10_FILE_OLD);
-
     /*
      * Open the old file and the dataset and get old settings.
      */
@@ -1815,11 +1807,10 @@ test_misc11(void)
     unsigned    sym_ik;         /* Symbol table B-tree initial 'K' value */
     unsigned    istore_ik;      /* Indexed storage B-tree initial 'K' value */
     unsigned    sym_lk;         /* Symbol table B-tree leaf 'K' value */
-    unsigned 	super;          /* Superblock version # */
-    unsigned 	freelist;       /* Free list version # */
-    unsigned 	stab;           /* Symbol table entry version # */
-    unsigned 	shhdr;          /* Shared object header version # */
     unsigned 	nindexes;       /* Shared message number of indexes */
+    H5F_info2_t finfo;          /* global information about file */
+    H5F_file_space_type_t strategy;  /* File/free space strategy */
+    hsize_t  	threshold;      /* Free-space section threshold */
     herr_t      ret;            /* Generic return value */
 
     /* Output message about test being performed */
@@ -1833,21 +1824,12 @@ test_misc11(void)
     file= H5Fcreate(MISC11_FILE, H5F_ACC_TRUNC , H5P_DEFAULT, H5P_DEFAULT);
     CHECK(file, FAIL, "H5Fcreate");
 
-    /* Get the file's dataset creation property list */
-    fcpl =  H5Fget_create_plist(file);
-    CHECK(fcpl, FAIL, "H5Fget_create_plist");
-
     /* Get the file's version information */
-    ret=H5Pget_version(fcpl, &super, &freelist, &stab, &shhdr);
-    CHECK(ret, FAIL, "H5Pget_version");
-    VERIFY(super,0,"H5Pget_version");
-    VERIFY(freelist,0,"H5Pget_version");
-    VERIFY(stab,0,"H5Pget_version");
-    VERIFY(shhdr,0,"H5Pget_version");
-
-    /* Close FCPL */
-    ret=H5Pclose(fcpl);
-    CHECK(ret, FAIL, "H5Pclose");
+    ret = H5Fget_info2(file, &finfo);
+    CHECK(ret, FAIL, "H5Fget_info2");
+    VERIFY(finfo.super.version, 0,"H5Fget_info2");
+    VERIFY(finfo.free.version, 0,"H5Fget_info2");
+    VERIFY(finfo.sohm.version, 0,"H5Fget_info2");
 
     /* Close file */
     ret=H5Fclose(file);
@@ -1886,6 +1868,9 @@ test_misc11(void)
     ret=H5Pset_shared_mesg_nindexes(fcpl,MISC11_NINDEXES);
     CHECK(ret, FAIL, "H5Pset_shared_mesg");
 
+    ret = H5Pset_file_space(fcpl, H5F_FILE_SPACE_VFD, (hsize_t)0);
+    CHECK(ret, FAIL, "H5Pset_file_space");
+
     /* Creating a file with the non-default file creation property list should
      * create a version 1 superblock
      */
@@ -1898,21 +1883,12 @@ test_misc11(void)
     ret=H5Pclose(fcpl);
     CHECK(ret, FAIL, "H5Pclose");
 
-    /* Get the file's dataset creation property list */
-    fcpl =  H5Fget_create_plist(file);
-    CHECK(fcpl, FAIL, "H5Fget_create_plist");
-
     /* Get the file's version information */
-    ret=H5Pget_version(fcpl, &super, &freelist, &stab, &shhdr);
-    CHECK(ret, FAIL, "H5Pget_version");
-    VERIFY(super,2,"H5Pget_version");
-    VERIFY(freelist,0,"H5Pget_version");
-    VERIFY(stab,0,"H5Pget_version");
-    VERIFY(shhdr,0,"H5Pget_version");
-
-    /* Close FCPL */
-    ret=H5Pclose(fcpl);
-    CHECK(ret, FAIL, "H5Pclose");
+    ret = H5Fget_info2(file, &finfo);
+    CHECK(ret, FAIL, "H5Fget_info2");
+    VERIFY(finfo.super.version, 2,"H5Fget_info2");
+    VERIFY(finfo.free.version, 0,"H5Fget_info2");
+    VERIFY(finfo.sohm.version, 0,"H5Fget_info2");
 
     /* Close file */
     ret=H5Fclose(file);
@@ -1927,12 +1903,11 @@ test_misc11(void)
     CHECK(fcpl, FAIL, "H5Fget_create_plist");
 
     /* Get the file's version information */
-    ret=H5Pget_version(fcpl, &super, &freelist, &stab, &shhdr);
-    CHECK(ret, FAIL, "H5Pget_version");
-    VERIFY(super,2,"H5Pget_version");
-    VERIFY(freelist,0,"H5Pget_version");
-    VERIFY(stab,0,"H5Pget_version");
-    VERIFY(shhdr,0,"H5Pget_version");
+    ret = H5Fget_info2(file, &finfo);
+    CHECK(ret, FAIL, "H5Fget_info2");
+    VERIFY(finfo.super.version, 2,"H5Fget_info2");
+    VERIFY(finfo.free.version, 0,"H5Fget_info2");
+    VERIFY(finfo.sohm.version, 0,"H5Fget_info2");
 
     /* Retrieve all the property values & check them */
     ret=H5Pget_userblock(fcpl,&userblock);
@@ -1957,6 +1932,11 @@ test_misc11(void)
     CHECK(ret, FAIL, "H5Pget_shared_mesg_nindexes");
     VERIFY(nindexes, MISC11_NINDEXES, "H5Pget_shared_mesg_nindexes");
 
+    ret = H5Pget_file_space(fcpl, &strategy, &threshold);
+    CHECK(ret, FAIL, "H5Pget_file_space");
+    VERIFY(strategy, 4, "H5Pget_file_space");
+    VERIFY(threshold, 1, "H5Pget_file_space");
+
     /* Close file */
     ret=H5Fclose(file);
     CHECK(ret, FAIL, "H5Fclose");
@@ -2506,7 +2486,7 @@ test_misc14(void)
     /* Check data from first dataset */
     ret = H5Dread(Dataset1, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata);
     CHECK(ret, FAIL, "H5Dread");
-    if(!DBL_ABS_EQUAL(rdata, data1))
+    if(!H5_DBL_ABS_EQUAL(rdata, data1))
         TestErrPrintf("Error on line %d: data1!=rdata\n",__LINE__);
 
     /* Unlink second dataset */
@@ -2520,7 +2500,7 @@ test_misc14(void)
     /* Verify the data from dataset #1 */
     ret = H5Dread(Dataset1, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata);
     CHECK(ret, FAIL, "H5Dread");
-    if(!DBL_ABS_EQUAL(rdata,data1))
+    if(!H5_DBL_ABS_EQUAL(rdata,data1))
         TestErrPrintf("Error on line %d: data1!=rdata\n",__LINE__);
 
     /* Close first dataset */
@@ -2554,7 +2534,7 @@ test_misc14(void)
     /* Check data from second dataset */
     ret = H5Dread(Dataset2, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata);
     CHECK(ret, FAIL, "H5Dread");
-    if(!DBL_ABS_EQUAL(rdata,data2))
+    if(!H5_DBL_ABS_EQUAL(rdata,data2))
         TestErrPrintf("Error on line %d: data2!=rdata\n",__LINE__);
 
     /* Unlink first dataset */
@@ -2568,7 +2548,7 @@ test_misc14(void)
     /* Verify the data from dataset #2 */
     ret = H5Dread(Dataset2, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata);
     CHECK(ret, FAIL, "H5Dread");
-    if(!DBL_ABS_EQUAL(rdata,data2))
+    if(!H5_DBL_ABS_EQUAL(rdata,data2))
         TestErrPrintf("Error on line %d: data2!=rdata\n",__LINE__);
 
     /* Close second dataset */
@@ -2609,13 +2589,13 @@ test_misc14(void)
     /* Check data from first dataset */
     ret = H5Dread(Dataset1, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata);
     CHECK(ret, FAIL, "H5Dread");
-    if(!DBL_ABS_EQUAL(rdata,data1))
+    if(!H5_DBL_ABS_EQUAL(rdata,data1))
         TestErrPrintf("Error on line %d: data1!=rdata\n",__LINE__);
 
     /* Check data from third dataset */
     ret = H5Dread(Dataset3, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata);
     CHECK(ret, FAIL, "H5Dread");
-    if(!DBL_ABS_EQUAL(rdata,data3))
+    if(!H5_DBL_ABS_EQUAL(rdata,data3))
         TestErrPrintf("Error on line %d: data3!=rdata\n",__LINE__);
 
     /* Unlink second dataset */
@@ -2629,13 +2609,13 @@ test_misc14(void)
     /* Verify the data from dataset #1 */
     ret = H5Dread(Dataset1, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata);
     CHECK(ret, FAIL, "H5Dread");
-    if(!DBL_ABS_EQUAL(rdata,data1))
+    if(!H5_DBL_ABS_EQUAL(rdata,data1))
         TestErrPrintf("Error on line %d: data1!=rdata\n",__LINE__);
 
     /* Verify the data from dataset #3 */
     ret = H5Dread(Dataset3, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata);
     CHECK(ret, FAIL, "H5Dread");
-    if(!DBL_ABS_EQUAL(rdata,data3))
+    if(!H5_DBL_ABS_EQUAL(rdata,data3))
         TestErrPrintf("Error on line %d: data3!=rdata\n",__LINE__);
 
     /* Close first dataset */
@@ -2721,8 +2701,7 @@ test_misc16(void)
 {
     hid_t file;         /* File ID */
     herr_t ret;         /* Generic return value */
-    const char wdata[MISC16_SPACE_DIM][MISC16_STR_SIZE] =
-                        {"1234567", "1234567\0", "12345678", {NULL}};
+    char wdata[MISC16_SPACE_DIM][MISC16_STR_SIZE];
     char rdata[MISC16_SPACE_DIM][MISC16_STR_SIZE];  /* Information read in */
     hid_t		dataset;	/* Dataset ID			*/
     hid_t		sid;       /* Dataspace ID			*/
@@ -2730,6 +2709,13 @@ test_misc16(void)
     hsize_t		dims[] = {MISC16_SPACE_DIM};
     int                 i;
 
+    /* Initialize the data */
+    /* (Note that these are supposed to stress the code, so are a little weird) */
+    HDmemcpy(wdata[0], "1234567", MISC16_STR_SIZE);
+    HDmemcpy(wdata[1], "1234567\0", MISC16_STR_SIZE);
+    HDmemcpy(wdata[2], "12345678", MISC16_STR_SIZE);
+    HDmemcpy(wdata[3], "\0\0\0\0\0\0\0\0", MISC16_STR_SIZE);
+
     /* Create the file */
     file = H5Fcreate(MISC16_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
     CHECK(file, FAIL, "H5Fcreate");
@@ -2763,11 +2749,11 @@ test_misc16(void)
     /* Compare data read in */
     for(i = 0; i < MISC16_SPACE_DIM; i++) {
         if(HDstrlen(wdata[i]) != HDstrlen(rdata[i])) {
-            TestErrPrintf("VL data length don't match!, strlen(wdata[%d])=%d, strlen(rdata[%d])=%d\n",(int)i,(int)strlen(wdata[i]),(int)i,(int)strlen(rdata[i]));
+            TestErrPrintf("Line %u: VL data length don't match!, strlen(wdata[%d])=%d, strlen(rdata[%d])=%d\n",(unsigned)__LINE__, (int)i,(int)strlen(wdata[i]),(int)i,(int)strlen(rdata[i]));
             continue;
         } /* end if */
         if(HDstrcmp(wdata[i], rdata[i]) != 0 ) {
-            TestErrPrintf("VL data values don't match!, wdata[%d]=%s, rdata[%d]=%s\n",(int)i,wdata[i],(int)i,rdata[i]);
+            TestErrPrintf("Line %u: VL data values don't match!, wdata[%d]=%s, rdata[%d]=%s\n",(unsigned)__LINE__, (int)i,wdata[i],(int)i,rdata[i]);
             continue;
         } /* end if */
     } /* end for */
@@ -2800,8 +2786,7 @@ test_misc17(void)
 {
     hid_t file;         /* File ID */
     herr_t ret;         /* Generic return value */
-    const char wdata[MISC17_SPACE_DIM1][MISC17_SPACE_DIM2] =
-                        {"1234567", "1234567\0", "12345678", {NULL}};
+    char wdata[MISC17_SPACE_DIM1][MISC17_SPACE_DIM2];
     char rdata[MISC17_SPACE_DIM1][MISC17_SPACE_DIM2];  /* Information read in */
     hid_t		dataset;	/* Dataset ID			*/
     hid_t		sid;       /* Dataspace ID			*/
@@ -2809,6 +2794,13 @@ test_misc17(void)
     hsize_t		dims[] = {MISC17_SPACE_DIM1, MISC17_SPACE_DIM2};
     int                 i;
 
+    /* Initialize the data */
+    /* (Note that these are supposed to stress the code, so are a little weird) */
+    HDmemcpy(wdata[0], "1234567", MISC17_SPACE_DIM2);
+    HDmemcpy(wdata[1], "1234567\0", MISC17_SPACE_DIM2);
+    HDmemcpy(wdata[2], "12345678", MISC17_SPACE_DIM2);
+    HDmemcpy(wdata[3], "\0\0\0\0\0\0\0\0", MISC17_SPACE_DIM2);
+
     /* Create the file */
     file = H5Fcreate(MISC17_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
     CHECK(file, FAIL, "H5Fcreate");
@@ -2839,11 +2831,11 @@ test_misc17(void)
     /* Compare data in the way of strings. */
     for(i = 0; i < MISC17_SPACE_DIM1; i++) {
         if(HDstrlen(wdata[i]) != HDstrlen(rdata[i])) {
-            TestErrPrintf("VL data length don't match!, strlen(wdata[%d])=%d, strlen(rdata[%d])=%d\n",(int)i,(int)strlen(wdata[i]),(int)i,(int)strlen(rdata[i]));
+            TestErrPrintf("Line %u: VL data length don't match!, strlen(wdata[%d])=%d, strlen(rdata[%d])=%d\n",(unsigned)__LINE__, (int)i,(int)strlen(wdata[i]),(int)i,(int)strlen(rdata[i]));
             continue;
         } /* end if */
         if(HDstrcmp(wdata[i], rdata[i]) != 0 ) {
-            TestErrPrintf("VL data values don't match!, wdata[%d]=%s, rdata[%d]=%s\n",(int)i,wdata[i],(int)i,rdata[i]);
+            TestErrPrintf("Line %u: VL data values don't match!, wdata[%d]=%s, rdata[%d]=%s\n",(unsigned)__LINE__, (int)i,wdata[i],(int)i,rdata[i]);
             continue;
         } /* end if */
     } /* end for */
@@ -3424,8 +3416,7 @@ test_misc20(void)
     hsize_t small_dims[MISC20_SPACE_RANK]={MISC20_SPACE2_DIM0,MISC20_SPACE2_DIM1};      /* Small dimensions */
     unsigned version;   /* Version of storage layout info */
     hsize_t contig_size;        /* Size of contiguous storage size from layout into */
-    char testfile[512]="";          /* Character buffer for corrected test file name */
-    char *srcdir = HDgetenv("srcdir");    /* Pointer to the directory the source code is located within */
+    const char *testfile = H5_get_srcdir_filename(MISC20_FILE_OLD); /* Corrected test file name */
     herr_t ret;         /* Generic return value */
 
     /* Output message about test being performed */
@@ -3539,13 +3530,6 @@ test_misc20(void)
 
     /* Verify that the storage size is computed correctly for older versions of layout info */
 
-    /* Generate the correct name for the test file, by prepending the source path */
-    if(srcdir && ((HDstrlen(srcdir) + HDstrlen(MISC20_FILE_OLD) + 1) < sizeof(testfile))) {
-        HDstrcpy(testfile, srcdir);
-        HDstrcat(testfile, "/");
-    }
-    HDstrcat(testfile, MISC20_FILE_OLD);
-
     /*
      * Open the old file and the dataset and get old settings.
      */
@@ -3810,6 +3794,7 @@ test_misc23(void)
     char        objname[MISC23_NAME_BUF_SIZE];  /* Name of object */
     H5O_info_t  oinfo;
     htri_t      tri_status;
+    ssize_t     namelen;
     herr_t      status;
 
     /* Output message about test being performed */
@@ -3879,8 +3864,8 @@ test_misc23(void)
     CHECK(tmp_id, FAIL, "H5Gcreate2");
 
     /* Query that the name of the new group is correct */
-    status = H5Iget_name(tmp_id, objname, (size_t)MISC23_NAME_BUF_SIZE);
-    CHECK(status, FAIL, "H5Iget_name");
+    namelen = H5Iget_name(tmp_id, objname, (size_t)MISC23_NAME_BUF_SIZE);
+    CHECK(namelen, FAIL, "H5Iget_name");
     VERIFY_STR(objname, "/A/B01/grp", "H5Iget_name");
 
     status = H5Gclose(tmp_id);
@@ -4665,20 +4650,12 @@ test_misc25b(void)
 {
     hid_t fid;          /* File ID */
     hid_t gid;          /* Group ID */
-    char testfile[512]="";
-    char *srcdir = HDgetenv("srcdir");
+    const char *testfile = H5_get_srcdir_filename(MISC25B_FILE); /* Corrected test file name */
     herr_t      ret;            /* Generic return value */
 
     /* Output message about test being performed */
     MESSAGE(5, ("Exercise null object header message bug\n"));
 
-    /* Build the name of the file, with the source directory */
-    if (srcdir && ((HDstrlen(srcdir) + HDstrlen(MISC25B_FILE) + 1) < sizeof(testfile))){
-		HDstrcpy(testfile, srcdir);
-		HDstrcat(testfile, "/");
-    }
-    HDstrcat(testfile, MISC25B_FILE);
-
     /* Open file */
     fid = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT);
     CHECK(fid, FAIL, "H5Fopen");
@@ -4930,20 +4907,12 @@ test_misc27(void)
 {
     hid_t fid;          /* File ID */
     hid_t gid;          /* Group ID */
-    char testfile[512]="";          /* Character buffer for corrected test file name */
-    char *srcdir = HDgetenv("srcdir");    /* Pointer to the directory the source code is located within */
+    const char *testfile = H5_get_srcdir_filename(MISC27_FILE); /* Corrected test file name */
     herr_t ret;         /* Generic return value */
 
     /* Output message about test being performed */
     MESSAGE(5, ("Corrupt object header handling\n"));
 
-    /* Generate the correct name for the test file, by prepending the source path */
-    if(srcdir && ((HDstrlen(srcdir) + HDstrlen(MISC27_FILE) + 1) < sizeof(testfile))) {
-        HDstrcpy(testfile, srcdir);
-        HDstrcat(testfile, "/");
-    }
-    HDstrcat(testfile, MISC27_FILE);
-
     /* Open the file */
     fid = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT);
     CHECK(fid, FAIL, "H5Fopen");
@@ -5035,7 +5004,7 @@ test_misc28(void)
 
     /* Initialize write buffer */
     for(i=0; i<MISC28_SIZE; i++)
-        buf[i] = i;
+        buf[i] = (char)i;
 
     /* Create memory dataspace and selection in file dataspace */
     sidm = H5Screate_simple(1, mdims, NULL);
@@ -5056,7 +5025,7 @@ test_misc28(void)
 
     /* Initialize write buffer */
     for(i=0; i<MISC28_SIZE; i++)
-        buf[i] = MISC28_SIZE - 1 - i;
+        buf[i] = (char)(MISC28_SIZE - 1 - i);
 
     /* Select new hyperslab */
     start[1] = 1;
@@ -5207,7 +5176,7 @@ static void
 test_misc30(void)
 {
     hsize_t file_size[] = {0, 0};       /* Sizes of file created */
-    hbool_t get_info;                   /* Whether to perform the get info call */
+    unsigned get_info;                  /* Whether to perform the get info call */
 
     /* Output message about test being performed */
     MESSAGE(5, ("Local heap dropping free block info\n"));
diff --git a/test/tmtimen.h5 b/test/tmtimen.h5
index 96e5fb3..007a6b6 100644
Binary files a/test/tmtimen.h5 and b/test/tmtimen.h5 differ
diff --git a/test/tmtimeo.h5 b/test/tmtimeo.h5
index 8cacf4a..c9dfcc4 100644
Binary files a/test/tmtimeo.h5 and b/test/tmtimeo.h5 differ
diff --git a/test/trefer.c b/test/trefer.c
index 93c7dd4..cb0f44e 100644
--- a/test/trefer.c
+++ b/test/trefer.c
@@ -75,6 +75,7 @@ test_reference_params(void)
     hid_t       group;      /* Group ID             */
     hid_t       sid1;       /* Dataspace ID         */
     hid_t       tid1;       /* Datatype ID          */
+    hid_t       dapl_id;    /* Dataset access property list */
     hsize_t     dims1[] = {SPACE1_DIM1};
     hobj_ref_t *wbuf,       /* buffer to write to disk */
                *rbuf,       /* buffer read from disk */
@@ -82,6 +83,7 @@ test_reference_params(void)
     unsigned   *tu32;       /* Temporary pointer to uint32 data */
     int         i;          /* counting variables */
     const char *write_comment = "Foo!"; /* Comments for group */
+    hid_t	ret_id;		/* Generic hid_t return value	*/
     herr_t      ret;        /* Generic return value     */
     size_t      name_size;  /* Size of reference name */
 
@@ -101,6 +103,10 @@ test_reference_params(void)
     sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
     CHECK(sid1, FAIL, "H5Screate_simple");
 
+    /* Create dataset access property list */
+    dapl_id = H5Pcreate(H5P_DATASET_ACCESS);
+    CHECK(dapl_id, FAIL, "H5Pcreate");
+    
     /* Create a group */
     group = H5Gcreate2(fid1, "Group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
     CHECK(group, FAIL, "H5Gcreate2");
@@ -179,12 +185,14 @@ test_reference_params(void)
     VERIFY(ret, FAIL, "H5Rcreate space");
 
     /* Test parameters to H5Rdereference */
-    dset2 = H5Rdereference((hid_t)-1, H5R_OBJECT, &rbuf[0]);
-    VERIFY(dset2, FAIL, "H5Rdereference loc_id");
-    dset2 = H5Rdereference(dataset, H5R_OBJECT, NULL);
-    VERIFY(dset2, FAIL, "H5Rdereference ref");
-    dset2 = H5Rdereference(dataset, H5R_MAXTYPE, &rbuf[0]);
-    VERIFY(dset2, FAIL, "H5Rdereference type");
+    dset2 = H5Rdereference2((hid_t)-1, H5P_DEFAULT, H5R_OBJECT, &rbuf[0]);
+    VERIFY(dset2, FAIL, "H5Rdereference2 loc_id");
+    dset2 = H5Rdereference2(dataset, (hid_t)-1, H5R_OBJECT, &rbuf[0]);
+    VERIFY(dset2, FAIL, "H5Rdereference2 oapl_id");
+    dset2 = H5Rdereference2(dataset, dapl_id, H5R_OBJECT, NULL);
+    VERIFY(dset2, FAIL, "H5Rdereference2 ref");
+    dset2 = H5Rdereference2(dataset, dapl_id, H5R_MAXTYPE, &rbuf[0]);
+    VERIFY(dset2, FAIL, "H5Rdereference2 type");
 
     /* Test parameters to H5Rget_obj_type2 */
     ret = H5Rget_obj_type2((hid_t)-1, H5R_OBJECT, &rbuf[0], NULL);
@@ -203,17 +211,21 @@ test_reference_params(void)
     VERIFY(name_size, FAIL, "H5Rget_name type");
 
     /* Test parameters to H5Rget_region */
-    ret = H5Rget_region((hid_t)-1, H5R_OBJECT, &rbuf[0]);
-    VERIFY(ret, FAIL, "H5Rget_region loc_id");
-    ret = H5Rget_region(fid1, H5R_OBJECT, NULL);
-    VERIFY(ret, FAIL, "H5Rget_region ref");
-    ret = H5Rget_region(fid1, H5R_OBJECT, &rbuf[0]);
-    VERIFY(ret, FAIL, "H5Rget_region type");
+    ret_id = H5Rget_region((hid_t)-1, H5R_OBJECT, &rbuf[0]);
+    VERIFY(ret_id, FAIL, "H5Rget_region loc_id");
+    ret_id = H5Rget_region(fid1, H5R_OBJECT, NULL);
+    VERIFY(ret_id, FAIL, "H5Rget_region ref");
+    ret_id = H5Rget_region(fid1, H5R_OBJECT, &rbuf[0]);
+    VERIFY(ret_id, FAIL, "H5Rget_region type");
 
     /* Close disk dataspace */
     ret = H5Sclose(sid1);
     CHECK(ret, FAIL, "H5Sclose");
 
+    /* Close dataset access property list */
+    ret = H5Pclose(dapl_id);
+    CHECK(ret, FAIL, "H5Pclose");
+
     /* Close Dataset */
     ret = H5Dclose(dataset);
     CHECK(ret, FAIL, "H5Dclose");
@@ -244,6 +256,7 @@ test_reference_obj(void)
     hid_t		sid1;       /* Dataspace ID			*/
     hid_t		tid1;       /* Datatype ID			*/
     hsize_t		dims1[] = {SPACE1_DIM1};
+    hid_t               dapl_id;    /* Dataset access property list */
     hobj_ref_t          *wbuf,      /* buffer to write to disk */
                         *rbuf,      /* buffer read from disk */
                         *tbuf;      /* temp. buffer read from disk */
@@ -271,6 +284,10 @@ test_reference_obj(void)
     sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
     CHECK(sid1, FAIL, "H5Screate_simple");
 
+    /* Create dataset access property list */
+    dapl_id = H5Pcreate(H5P_DATASET_ACCESS);
+    CHECK(dapl_id, FAIL, "H5Pcreate");
+ 
     /* Create a group */
     group = H5Gcreate2(fid1, "Group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
     CHECK(group, FAIL, "H5Gcreate2");
@@ -389,8 +406,8 @@ test_reference_obj(void)
     CHECK(ret, FAIL, "H5Dread");
 
     /* Open dataset object */
-    dset2 = H5Rdereference(dataset, H5R_OBJECT, &rbuf[0]);
-    CHECK(dset2, FAIL, "H5Rdereference");
+    dset2 = H5Rdereference2(dataset, dapl_id, H5R_OBJECT, &rbuf[0]);
+    CHECK(dset2, FAIL, "H5Rdereference2");
 
     /* Check information in referenced dataset */
     sid1 = H5Dget_space(dset2);
@@ -410,9 +427,9 @@ test_reference_obj(void)
     ret = H5Dclose(dset2);
     CHECK(ret, FAIL, "H5Dclose");
 
-    /* Open group object */
-    group = H5Rdereference(dataset, H5R_OBJECT, &rbuf[2]);
-    CHECK(group, FAIL, "H5Rdereference");
+    /* Open group object.  GAPL isn't supported yet.  But it's harmless to pass in */
+    group = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &rbuf[2]);
+    CHECK(group, FAIL, "H5Rdereference2");
 
     /* Get group's comment */
     ret = H5Oget_comment(group, read_comment, (size_t)10);
@@ -426,9 +443,9 @@ test_reference_obj(void)
     ret = H5Gclose(group);
     CHECK(ret, FAIL, "H5Gclose");
 
-    /* Open datatype object */
-    tid1 = H5Rdereference(dataset, H5R_OBJECT, &rbuf[3]);
-    CHECK(tid1, FAIL, "H5Rdereference");
+    /* Open datatype object. TAPL isn't supported yet.  But it's harmless to pass in */
+    tid1 = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &rbuf[3]);
+    CHECK(tid1, FAIL, "H5Rdereference2");
 
     /* Verify correct datatype */
     {
@@ -457,6 +474,10 @@ test_reference_obj(void)
     ret = H5Dclose(dataset);
     CHECK(ret, FAIL, "H5Dclose");
 
+    /* Close dataset access property list */
+    ret = H5Pclose(dapl_id);
+    CHECK(ret, FAIL, "H5Pclose");
+
     /* Close file */
     ret = H5Fclose(fid1);
     CHECK(ret, FAIL, "H5Fclose");
@@ -481,6 +502,7 @@ test_reference_region(void)
                 dset2;		/* Dereferenced dataset ID */
     hid_t	sid1,		/* Dataspace ID	#1		*/
                 sid2;		/* Dataspace ID	#2		*/
+    hid_t       dapl_id;        /* Dataset access property list */
     hsize_t	dims1[] = {SPACE1_DIM1},
             	dims2[] = {SPACE2_DIM1, SPACE2_DIM2};
     hsize_t	start[SPACE2_RANK];     /* Starting location of hyperslab */
@@ -499,6 +521,8 @@ test_reference_region(void)
     uint8_t    *tu8;        /* Temporary pointer to uint8 data */
     H5O_type_t  obj_type;       /* Type of object */
     int        i, j;           /* counting variables */
+    hssize_t    hssize_ret;     /* hssize_t return value */
+    htri_t      tri_ret;        /* htri_t return value */
     herr_t	ret;		/* Generic return value		*/
     haddr_t     addr = HADDR_UNDEF; /* test for undefined reference */
     hid_t dset_NA;   /* Dataset id for undefined reference */
@@ -524,6 +548,10 @@ test_reference_region(void)
     sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL);
     CHECK(sid2, FAIL, "H5Screate_simple");
 
+    /* Create dataset access property list */
+    dapl_id = H5Pcreate(H5P_DATASET_ACCESS);
+    CHECK(dapl_id, FAIL, "H5Pcreate");
+ 
     /* Create a dataset */
     dset2 = H5Dcreate2(fid1, "Dataset2", H5T_STD_U8LE, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
     CHECK(dset2, FAIL, "H5Dcreate2");
@@ -588,6 +616,24 @@ test_reference_region(void)
     ret = H5Rcreate(&wbuf[1], fid1, "/Dataset2", H5R_DATASET_REGION, sid2);
     CHECK(ret, FAIL, "H5Rcreate");
 
+    /* Select unlimited hyperslab for third reference */
+    start[0] = 1; start[1] = 8;
+    stride[0] = 4; stride[1] = 1;
+    count[0] = H5S_UNLIMITED; count[1] = 1;
+    block[0] = 2; block[1] = 2;
+    ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block);
+    CHECK(ret, FAIL, "H5Sselect_hyperslab");
+
+    hssize_ret = H5Sget_select_npoints(sid2);
+    VERIFY(hssize_ret, (hssize_t)H5S_UNLIMITED, "H5Sget_select_npoints");
+
+    /* Store third dataset region */
+    ret = H5Rcreate(&wbuf[2], fid1, "/Dataset2", H5R_DATASET_REGION, sid2);
+    CHECK(ret, FAIL, "H5Rcreate");
+    ret = H5Rget_obj_type2(dset1, H5R_DATASET_REGION, &wbuf[0], &obj_type);
+    CHECK(ret, FAIL, "H5Rget_obj_type2");
+    VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type2");
+
     /* Write selection to disk */
     ret = H5Dwrite(dset1, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf);
     CHECK(ret, FAIL, "H5Dwrite");
@@ -653,15 +699,15 @@ test_reference_region(void)
      * Dereference an undefined reference (should fail)
      */
     H5E_BEGIN_TRY {
-      dset2 = H5Rdereference(dset_NA, H5R_DATASET_REGION, &rdata_NA[0]);
+      dset2 = H5Rdereference2(dset_NA, H5P_DEFAULT, H5R_DATASET_REGION, &rdata_NA[0]);
     } H5E_END_TRY;                                  
-    VERIFY(dset2, FAIL, "H5Rdereference"); 
+    VERIFY(dset2, FAIL, "H5Rdereference2"); 
 
     /* Close and release resources. */
     ret = H5Dclose(dset_NA);
     CHECK(ret, FAIL, "H5Dclose");
 
-    /* This close should fail since H5Rdereference never created 
+    /* This close should fail since H5Rdereference2 never created 
      * the id of the referenced object. */
     H5E_BEGIN_TRY {
       ret = H5Dclose(dset2);
@@ -681,12 +727,12 @@ test_reference_region(void)
     CHECK(ret, FAIL, "H5Dread");
 
     /* Try to read an unaddressed dataset */
-    dset2 = H5Rdereference(dset1, H5R_DATASET_REGION, &addr);
-    VERIFY(dset2, FAIL, "H5Rdereference haddr_undef");
+    dset2 = H5Rdereference2(dset1, dapl_id, H5R_DATASET_REGION, &addr);
+    VERIFY(dset2, FAIL, "H5Rdereference2 haddr_undef");
 
     /* Try to open objects */
-    dset2 = H5Rdereference(dset1, H5R_DATASET_REGION, &rbuf[0]);
-    CHECK(dset2, FAIL, "H5Rdereference");
+    dset2 = H5Rdereference2(dset1, dapl_id, H5R_DATASET_REGION, &rbuf[0]);
+    CHECK(dset2, FAIL, "H5Rdereference2");
 
     /* Check what H5Rget_obj_type2 function returns */
     ret = H5Rget_obj_type2(dset1, H5R_DATASET_REGION, &rbuf[0], &obj_type);
@@ -779,6 +825,31 @@ test_reference_region(void)
     ret = H5Sclose(sid2);
     CHECK(ret, FAIL, "H5Sclose");
 
+    /* Get the unlimited selection */
+    sid2 = H5Rget_region(dset1, H5R_DATASET_REGION, &rbuf[2]);
+    CHECK(sid2, FAIL, "H5Rget_region");
+
+    /* Verify correct hyperslab selected */
+    hssize_ret = H5Sget_select_npoints(sid2);
+    VERIFY(hssize_ret, (hssize_t)H5S_UNLIMITED, "H5Sget_select_npoints");
+    tri_ret = H5Sis_regular_hyperslab(sid2);
+    CHECK(tri_ret, FAIL, "H5Sis_regular_hyperslab");
+    VERIFY(tri_ret, TRUE, "H5Sis_regular_hyperslab Result");
+    ret = H5Sget_regular_hyperslab(sid2, start, stride, count, block);
+    CHECK(ret, FAIL, "H5Sget_regular_hyperslab");
+    VERIFY(start[0], (hsize_t)1, "Hyperslab Coordinates");
+    VERIFY(start[1], (hsize_t)8, "Hyperslab Coordinates");
+    VERIFY(stride[0], (hsize_t)4, "Hyperslab Coordinates");
+    VERIFY(stride[1], (hsize_t)1, "Hyperslab Coordinates");
+    VERIFY(count[0], H5S_UNLIMITED, "Hyperslab Coordinates");
+    VERIFY(count[1], (hsize_t)1, "Hyperslab Coordinates");
+    VERIFY(block[0], (hsize_t)2, "Hyperslab Coordinates");
+    VERIFY(block[1], (hsize_t)2, "Hyperslab Coordinates");
+
+    /* Close region space */
+    ret = H5Sclose(sid2);
+    CHECK(ret, FAIL, "H5Sclose");
+
     /* Close first space */
     ret = H5Sclose(sid1);
     CHECK(ret, FAIL, "H5Sclose");
@@ -799,6 +870,10 @@ test_reference_region(void)
     ret = H5Dclose(dset1);
     CHECK(ret, FAIL, "H5Dclose");
 
+    /* Close dataset access property list */
+    ret = H5Pclose(dapl_id);
+    CHECK(ret, FAIL, "H5Pclose");
+
     /* Close file */
     ret = H5Fclose(fid1);
     CHECK(ret, FAIL, "H5Fclose");
@@ -824,6 +899,7 @@ test_reference_region_1D(void)
                 dset3;          /* Dereferenced dataset ID */
     hid_t	sid1,           /* Dataspace ID	#1		*/
                 sid3;           /* Dataspace ID	#3		*/
+    hid_t       dapl_id;        /* Dataset access property list */
     hsize_t	dims1[] = {SPACE1_DIM1},
             	dims3[] = {SPACE3_DIM1};
     hsize_t	start[SPACE3_RANK];     /* Starting location of hyperslab */
@@ -860,6 +936,10 @@ test_reference_region_1D(void)
     sid3 = H5Screate_simple(SPACE3_RANK, dims3, NULL);
     CHECK(sid3, FAIL, "H5Screate_simple");
 
+    /* Create dataset access property list */
+    dapl_id = H5Pcreate(H5P_DATASET_ACCESS);
+    CHECK(dapl_id, FAIL, "H5Pcreate");
+ 
     /* Create a dataset */
     dset3 = H5Dcreate2(fid1, "Dataset2", H5T_STD_U8LE, sid3, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
     CHECK(dset3, FAIL, "H5Dcreate2");
@@ -957,8 +1037,8 @@ test_reference_region_1D(void)
     CHECK(ret, FAIL, "H5Dread");
 
     /* Try to open objects */
-    dset3 = H5Rdereference(dset1, H5R_DATASET_REGION, &rbuf[0]);
-    CHECK(dset3, FAIL, "H5Rdereference");
+    dset3 = H5Rdereference2(dset1, dapl_id, H5R_DATASET_REGION, &rbuf[0]);
+    CHECK(dset3, FAIL, "H5Rdereference2");
 
     /* Check what H5Rget_obj_type2 function returns */
     ret = H5Rget_obj_type2(dset1, H5R_DATASET_REGION, &rbuf[0], &obj_type);
@@ -1075,6 +1155,10 @@ test_reference_region_1D(void)
     ret = H5Dclose(dset1);
     CHECK(ret, FAIL, "H5Dclose");
 
+    /* Close dataset access property list */
+    ret = H5Pclose(dapl_id);
+    CHECK(ret, FAIL, "H5Pclose");
+
     /* Close file */
     ret = H5Fclose(fid1);
     CHECK(ret, FAIL, "H5Fclose");
@@ -1160,8 +1244,8 @@ test_reference_obj_deleted(void)
     CHECK(ret, FAIL, "H5Dopen2");
 
     /* Open undefined reference */
-    dset2 = H5Rdereference(dataset, H5R_OBJECT, &addr);
-    VERIFY(dset2, FAIL, "H5Rdereference");
+    dset2 = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &addr);
+    VERIFY(dset2, FAIL, "H5Rdereference2");
 
     /* Read selection from disk */
     HDmemset(&oref, 0, sizeof(hobj_ref_t));
@@ -1169,13 +1253,13 @@ test_reference_obj_deleted(void)
     CHECK(ret, FAIL, "H5Dread");
 
     /* Open deleted dataset object */
-    dset2 = H5Rdereference(dataset, H5R_OBJECT, &oref);
-    VERIFY(dset2, FAIL, "H5Rdereference");
+    dset2 = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &oref);
+    VERIFY(dset2, FAIL, "H5Rdereference2");
 
     /* Open nonsense reference */
     HDmemset(&oref, 0, sizeof(hobj_ref_t));
-    dset2 = H5Rdereference(dataset, H5R_OBJECT, &oref);
-    VERIFY(dset2, FAIL, "H5Rdereference");
+    dset2 = H5Rdereference2(dataset, H5P_DEFAULT, H5R_OBJECT, &oref);
+    VERIFY(dset2, FAIL, "H5Rdereference2");
 
     /* Close Dataset */
     ret = H5Dclose(dataset);
@@ -1313,8 +1397,8 @@ test_reference_group(void)
     CHECK(ret, FAIL, "H5Dread");
 
     /* Dereference to get the group */
-    gid = H5Rdereference(did, H5R_OBJECT, &rref);
-    CHECK(gid, FAIL, "H5Rdereference");
+    gid = H5Rdereference2(did, H5P_DEFAULT, H5R_OBJECT, &rref);
+    CHECK(gid, FAIL, "H5Rdereference2");
 
     /* Iterate through objects in dereferenced group */
     ret = H5Literate(gid, H5_INDEX_NAME, H5_ITER_INC, NULL, test_deref_iter_op, &count);
@@ -1361,11 +1445,11 @@ static void
 test_reference_compat(void)
 {
     hid_t	fid1;		/* HDF5 File IDs		*/
-    hid_t	dataset;	/* Dataset ID			*/
-    hid_t	group;          /* Group ID                     */
+    hid_t	dataset, dset2;	/* Dataset ID			*/
+    hid_t	group, group2;  /* Group ID                     */
     hid_t	sid1,           /* Dataspace IDs		*/
                 sid2;
-    hid_t	tid1;           /* Datatype ID			*/
+    hid_t	tid1, tid2;     /* Datatype ID			*/
     hsize_t	dims1[] = {SPACE1_DIM1},
             	dims2[] = {SPACE2_DIM1, SPACE2_DIM2};
     hsize_t	start[SPACE2_RANK];     /* Starting location of hyperslab */
@@ -1560,6 +1644,32 @@ test_reference_compat(void)
     CHECK(obj_type, H5G_UNKNOWN, "H5Rget_obj_type1");
     VERIFY(obj_type, H5G_TYPE, "H5Rget_obj_type1");
 
+
+    /* Make sure the referenced objects can be opened */
+    dset2 = H5Rdereference1(dataset, H5R_OBJECT, &rbuf_obj[0]);
+    CHECK(dset2, FAIL, "H5Rdereference1");
+
+    ret = H5Dclose(dset2);
+    CHECK(ret, FAIL, "H5Dclose");
+
+    dset2 = H5Rdereference1(dataset, H5R_OBJECT, &rbuf_obj[1]);
+    CHECK(dset2, FAIL, "H5Rdereference1");
+
+    ret = H5Dclose(dset2);
+    CHECK(ret, FAIL, "H5Dclose");
+
+    group2 = H5Rdereference1(dataset, H5R_OBJECT, &rbuf_obj[2]);
+    CHECK(group2, FAIL, "H5Rdereference1");
+
+    ret = H5Gclose(group2);
+    CHECK(ret, FAIL, "H5Gclose");
+
+    tid2 = H5Rdereference1(dataset, H5R_OBJECT, &rbuf_obj[3]);
+    CHECK(tid2, FAIL, "H5Rdereference1");
+
+    ret = H5Tclose(tid2);
+    CHECK(ret, FAIL, "H5Tclose");
+
     /* Close Dataset */
     ret = H5Dclose(dataset);
     CHECK(ret, FAIL, "H5Dclose");
@@ -1588,6 +1698,19 @@ test_reference_compat(void)
     obj_type = H5Rget_obj_type1(dataset, H5R_DATASET_REGION, &rbuf_reg[3]);
     VERIFY(obj_type, H5G_UNKNOWN, "H5Rget_obj_type1");
 
+    /* Make sure the referenced objects can be opened */
+    dset2 = H5Rdereference1(dataset, H5R_DATASET_REGION, &rbuf_reg[0]);
+    CHECK(dset2, FAIL, "H5Rdereference1");
+
+    ret = H5Dclose(dset2);
+    CHECK(ret, FAIL, "H5Dclose");
+
+    dset2 = H5Rdereference1(dataset, H5R_DATASET_REGION, &rbuf_reg[1]);
+    CHECK(dset2, FAIL, "H5Rdereference1");
+
+    ret = H5Dclose(dset2);
+    CHECK(ret, FAIL, "H5Dclose");
+
     /* Close Dataset */
     ret = H5Dclose(dataset);
     CHECK(ret, FAIL, "H5Dclose");
diff --git a/test/tselect.c b/test/tselect.c
index 704a2d3..670406d 100644
--- a/test/tselect.c
+++ b/test/tselect.c
@@ -21,7 +21,7 @@
 *
 *************************************************************/
 
-#define H5S_PACKAGE		/*suppress error about including H5Spkg	  */
+#define H5S_FRIEND		/*suppress error about including H5Spkg	  */
 
 /* Define this macro to indicate that the testing APIs should be available */
 #define H5S_TESTING
@@ -162,6 +162,12 @@
 /* #defines for shape same / different rank tests */
 #define SS_DR_MAX_RANK		5
 
+/* Information for regular hyperslab query test */
+#define SPACE13_RANK	3
+#define SPACE13_DIM1    50
+#define SPACE13_DIM2    50
+#define SPACE13_DIM3    50
+#define SPACE13_NPOINTS 4
 
 
 /* Location comparison function */
@@ -1640,8 +1646,8 @@ verify_select_hyper_contig_dr__run_test(const uint16_t *cube_buf,
                         /* Advance to next element */
                         cube_ptr++;
                         expected_value++;
-                        s++;
-                        m++;
+                        s++;       
+                        m++;       
                     } while((cube_rank > 0) && (m < edge_size));
                     l++;
                 } while((cube_rank > 1) && (l < edge_size));
@@ -1658,10 +1664,10 @@ verify_select_hyper_contig_dr__run_test(const uint16_t *cube_buf,
 

 /****************************************************************
 **
-**  test_select_hyper_contig_dr__run_test(): Test H5S (dataspace)
-**	selection code with contiguous source and target having
+**  test_select_hyper_contig_dr__run_test(): Test H5S (dataspace) 
+**	selection code with contiguous source and target having 
 **	different ranks but the same shape.  We have already
-**	tested H5S_shape_same in isolation, so now we try to do
+**	tested H5S_shape_same in isolation, so now we try to do 
 **	I/O.
 **
 ****************************************************************/
@@ -1765,13 +1771,13 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
     CHECK(file_large_cube_sid, FAIL, "H5Screate_simple");
 
     /* if chunk edge size is greater than zero, set up the small and
-     * large data set creation property lists to specify chunked
+     * large data set creation property lists to specify chunked 
      * datasets.
      */
     if(chunk_edge_size > 0) {
         hsize_t		chunk_dims[SS_DR_MAX_RANK];     /* Chunk dimensions */
 
-        chunk_dims[0] = chunk_dims[1] =
+        chunk_dims[0] = chunk_dims[1] = 
 		chunk_dims[2] = chunk_dims[3] = chunk_dims[4] = (hsize_t)chunk_edge_size;
 
         small_cube_dcpl_id = H5Pcreate(H5P_DATASET_CREATE);
@@ -1795,7 +1801,7 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
     } /* end if */
 
     /* create the small cube dataset */
-    small_cube_dataset = H5Dcreate2(fid1, "small_cube_dataset", dset_type,
+    small_cube_dataset = H5Dcreate2(fid1, "small_cube_dataset", dset_type, 
             small_cube_sid, H5P_DEFAULT, small_cube_dcpl_id, H5P_DEFAULT);
     CHECK(small_cube_dataset, FAIL, "H5Dcreate2");
 
@@ -1806,7 +1812,7 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
     } /* end if */
 
     /* create the large cube dataset */
-    large_cube_dataset = H5Dcreate2(fid1, "large_cube_dataset", dset_type,
+    large_cube_dataset = H5Dcreate2(fid1, "large_cube_dataset", dset_type, 
             file_large_cube_sid, H5P_DEFAULT, large_cube_dcpl_id, H5P_DEFAULT);
     CHECK(large_cube_dataset, FAIL, "H5Dcreate2");
 
@@ -1818,16 +1824,16 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
 
 
     /* write initial data to the on disk datasets */
-    ret = H5Dwrite(small_cube_dataset, H5T_NATIVE_UINT16, small_cube_sid,
+    ret = H5Dwrite(small_cube_dataset, H5T_NATIVE_UINT16, small_cube_sid, 
             small_cube_sid, xfer_plist, cube_buf);
     CHECK(ret, FAIL, "H5Dwrite");
 
-    ret = H5Dwrite(large_cube_dataset, H5T_NATIVE_UINT16, mem_large_cube_sid,
+    ret = H5Dwrite(large_cube_dataset, H5T_NATIVE_UINT16, mem_large_cube_sid, 
             file_large_cube_sid, xfer_plist, cube_buf);
     CHECK(ret, FAIL, "H5Dwrite");
 
     /* read initial data from disk and verify that it is as expected. */
-    ret = H5Dread(small_cube_dataset, H5T_NATIVE_UINT16, small_cube_sid,
+    ret = H5Dread(small_cube_dataset, H5T_NATIVE_UINT16, small_cube_sid, 
         small_cube_sid, xfer_plist, small_cube_buf_1);
     CHECK(ret, FAIL, "H5Dread");
 
@@ -1835,7 +1841,7 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
     verify_select_hyper_contig_dr__run_test(small_cube_buf_1, small_cube_size,
         edge_size, small_rank);
 
-    ret = H5Dread(large_cube_dataset, H5T_NATIVE_UINT16, mem_large_cube_sid,
+    ret = H5Dread(large_cube_dataset, H5T_NATIVE_UINT16, mem_large_cube_sid, 
         file_large_cube_sid, xfer_plist, large_cube_buf_1);
     CHECK(ret, FAIL, "H5Dread");
 
@@ -1848,12 +1854,12 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
      * of different rank that H5S_select_shape_same() views as being of the
      * same shape.
      *
-     * Start by reading small_rank-D slice from the on disk large cube, and
-     * verifying that the data read is correct.  Verify that H5S_select_shape_same()
+     * Start by reading small_rank-D slice from the on disk large cube, and 
+     * verifying that the data read is correct.  Verify that H5S_select_shape_same() 
      * returns true on the memory and file selections.
      */
 
-
+    
     /* set up start, stride, count, and block -- note that we will
      * change start[] so as to read slices of the large cube.
      */
@@ -1885,18 +1891,18 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
                     start[3] = (hsize_t)x;
                     start[4] = (hsize_t)0;
 
-                    ret = H5Sselect_hyperslab(file_large_cube_sid,
+                    ret = H5Sselect_hyperslab(file_large_cube_sid, 
                                               H5S_SELECT_SET,
-                                              start_ptr,
-                                              stride_ptr,
-                                              count_ptr,
+                                              start_ptr, 
+                                              stride_ptr, 
+                                              count_ptr, 
                                               block_ptr);
                     CHECK(ret, FAIL, "H5Sselect_hyperslab");
 
-                    /* verify that H5S_select_shape_same() reports the two
+                    /* verify that H5S_select_shape_same() reports the two 
                      * selections as having the same shape.
                      */
-                    check = H5S_select_shape_same_test(small_cube_sid,
+                    check = H5S_select_shape_same_test(small_cube_sid, 
                                                        file_large_cube_sid);
                     VERIFY(check, TRUE, "H5S_select_shape_same_test");
 
@@ -1933,7 +1939,7 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
         } while((large_rank >= 4) && (small_rank <= 3) && (v < edge_size));
         u++;
     } while((large_rank >= 5) && (small_rank <= 4) && (u < edge_size));
-
+        
 
     /* similarly, read the on disk small cube into slices through the in memory
      * large cube, and verify that the correct data (and only the correct data)
@@ -1961,19 +1967,19 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
                     start[3] = (hsize_t)x;
                     start[4] = (hsize_t)0;
 
-                    ret = H5Sselect_hyperslab(mem_large_cube_sid,
+                    ret = H5Sselect_hyperslab(mem_large_cube_sid, 
                                               H5S_SELECT_SET,
-                                              start_ptr,
-                                              stride_ptr,
-                                              count_ptr,
+                                              start_ptr, 
+                                              stride_ptr, 
+                                              count_ptr, 
                                               block_ptr);
                     CHECK(ret, FAIL, "H5Sselect_hyperslab");
 
 
-                    /* verify that H5S_select_shape_same() reports the two
+                    /* verify that H5S_select_shape_same() reports the two 
                      * selections as having the same shape.
                      */
-                    check = H5S_select_shape_same_test(small_cube_sid,
+                    check = H5S_select_shape_same_test(small_cube_sid, 
                                                        mem_large_cube_sid);
                     VERIFY(check, TRUE, "H5S_select_shape_same_test");
 
@@ -1988,7 +1994,7 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
                     CHECK(ret, FAIL, "H5Dread");
 
 
-                    /* verify that the expected data and only the
+                    /* verify that the expected data and only the 
                      * expected data was read.
                      */
                     start_index = (u * edge_size * edge_size * edge_size * edge_size) +
@@ -2024,7 +2030,7 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
 
                     /* Zero out the buffer for the next pass */
                     HDmemset(large_cube_buf_1 + start_index, 0, small_cube_size * sizeof(uint16_t));
-
+                    
                     x++;
                 } while((large_rank >= 2) && (small_rank <= 1) && (x < edge_size));
                 w++;
@@ -2035,16 +2041,16 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
     } while((large_rank >= 5) && (small_rank <= 4) && (u < edge_size));
 
 
-    /* now we go in the opposite direction, verifying that we can write
-     * from memory to file using selections of different rank that
+    /* now we go in the opposite direction, verifying that we can write 
+     * from memory to file using selections of different rank that 
      * H5S_select_shape_same() views as being of the same shape.
      *
-     * Start by writing small_rank D slices from the in memory large cube, to
+     * Start by writing small_rank D slices from the in memory large cube, to 
      * the the on disk small cube dataset.  After each write, read the small
      * cube dataset back from disk, and verify that it contains the expected
-     * data. Verify that H5S_select_shape_same() returns true on the
+     * data. Verify that H5S_select_shape_same() returns true on the 
      * memory and file selections.
-     */
+     */ 
 
     u = 0;
     do {
@@ -2060,15 +2066,15 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
                      */
 
                     /* zero out the on disk small cube */
-                    ret = H5Dwrite(small_cube_dataset,
-                                   H5T_NATIVE_UINT16,
-                                   small_cube_sid,
-                                   small_cube_sid,
-                                   xfer_plist,
+                    ret = H5Dwrite(small_cube_dataset, 
+                                   H5T_NATIVE_UINT16, 
+                                   small_cube_sid, 
+                                   small_cube_sid, 
+                                   xfer_plist, 
                                    zero_buf);
                     CHECK(ret, FAIL, "H5Dwrite");
 
-                    /* select the portion of the in memory large cube from which we
+                    /* select the portion of the in memory large cube from which we 
                      * are going to write data.
                      */
                     start[0] = (hsize_t)u;
@@ -2077,40 +2083,40 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
                     start[3] = (hsize_t)x;
                     start[4] = (hsize_t)0;
 
-                    ret = H5Sselect_hyperslab(mem_large_cube_sid,
+                    ret = H5Sselect_hyperslab(mem_large_cube_sid, 
                                               H5S_SELECT_SET,
-                                              start_ptr,
-                                              stride_ptr,
-                                              count_ptr,
+                                              start_ptr, 
+                                              stride_ptr, 
+                                              count_ptr, 
                                               block_ptr);
                     CHECK(ret, FAIL, "H5Sselect_hyperslab");
 
 
-                    /* verify that H5S_select_shape_same() reports the in
-                     * memory slice through the cube selection and the
+                    /* verify that H5S_select_shape_same() reports the in 
+                     * memory slice through the cube selection and the 
                      * on disk full small cube selections as having the same shape.
                      */
-                    check = H5S_select_shape_same_test(small_cube_sid,
+                    check = H5S_select_shape_same_test(small_cube_sid, 
                                                        mem_large_cube_sid);
                     VERIFY(check, TRUE, "H5S_select_shape_same_test");
 
 
 	            /* write the slice from the in memory large cube to the on disk small cube */
-                    ret = H5Dwrite(small_cube_dataset,
-                                   H5T_NATIVE_UINT16,
-                                   mem_large_cube_sid,
-                                   small_cube_sid,
-                                   xfer_plist,
+                    ret = H5Dwrite(small_cube_dataset, 
+                                   H5T_NATIVE_UINT16, 
+                                   mem_large_cube_sid, 
+                                   small_cube_sid, 
+                                   xfer_plist, 
                                    cube_buf);
                     CHECK(ret, FAIL, "H5Dwrite");
 
 
                     /* read the on disk small cube into memory */
-                    ret = H5Dread(small_cube_dataset,
+                    ret = H5Dread(small_cube_dataset, 
                                   H5T_NATIVE_UINT16,
                                   small_cube_sid,
-                                  small_cube_sid,
-                                  xfer_plist,
+                                  small_cube_sid, 
+                                  xfer_plist, 
                                   small_cube_buf_1);
                     CHECK(ret, FAIL, "H5Dread");
 
@@ -2130,7 +2136,7 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
                     } /* end for */
                     if(mis_match )
                         TestErrPrintf("small cube data don't match! Line=%d\n",__LINE__);
-
+                    
                     x++;
                 } while((large_rank >= 2) && (small_rank <= 1) && (x < edge_size));
                 w++;
@@ -2141,10 +2147,10 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
     } while((large_rank >= 5) && (small_rank <= 4) && (u < edge_size));
 
 
-    /* Now write the contents of the in memory small cube to slices of
+    /* Now write the contents of the in memory small cube to slices of 
      * the on disk cube.  After each write, read the on disk cube
-     * into memeory, and verify that it contains the expected
-     * data.  Verify that H5S_select_shape_same() returns true on
+     * into memeory, and verify that it contains the expected 
+     * data.  Verify that H5S_select_shape_same() returns true on 
      * the memory and file selections.
      */
 
@@ -2169,16 +2175,16 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
                      */
 
                     /* zero out the on disk cube */
-                    ret = H5Dwrite(large_cube_dataset,
-                                   H5T_NATIVE_USHORT,
-                                   mem_large_cube_sid,
-                                   file_large_cube_sid,
-                                   xfer_plist,
+                    ret = H5Dwrite(large_cube_dataset, 
+                                   H5T_NATIVE_USHORT, 
+                                   mem_large_cube_sid, 
+                                   file_large_cube_sid, 
+                                   xfer_plist, 
                                    zero_buf);
                     CHECK(ret, FAIL, "H5Dwrite");
 
 
-                    /* select the portion of the in memory large cube to which we
+                    /* select the portion of the in memory large cube to which we 
                      * are going to write data.
                      */
                     start[0] = (hsize_t)u;
@@ -2187,31 +2193,31 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
                     start[3] = (hsize_t)x;
                     start[4] = (hsize_t)0;
 
-                    ret = H5Sselect_hyperslab(file_large_cube_sid,
+                    ret = H5Sselect_hyperslab(file_large_cube_sid, 
                                               H5S_SELECT_SET,
-                                              start_ptr,
-                                              stride_ptr,
-                                              count_ptr,
+                                              start_ptr, 
+                                              stride_ptr, 
+                                              count_ptr, 
                                               block_ptr);
                     CHECK(ret, FAIL, "H5Sselect_hyperslab");
 
 
-                    /* verify that H5S_select_shape_same() reports the in
-                     * memory full selection of the small cube and the
-                     * on disk slice through the large cube selection
+                    /* verify that H5S_select_shape_same() reports the in 
+                     * memory full selection of the small cube and the 
+                     * on disk slice through the large cube selection 
                      * as having the same shape.
                      */
-                    check = H5S_select_shape_same_test(small_cube_sid,
+                    check = H5S_select_shape_same_test(small_cube_sid, 
                                                        file_large_cube_sid);
                     VERIFY(check, TRUE, "H5S_select_shape_same_test");
 
 
 	            /* write the cube from memory to the target slice of the disk cube */
-                    ret = H5Dwrite(large_cube_dataset,
-                                   H5T_NATIVE_UINT16,
-                                   small_cube_sid,
-                                   file_large_cube_sid,
-                                   xfer_plist,
+                    ret = H5Dwrite(large_cube_dataset, 
+                                   H5T_NATIVE_UINT16, 
+                                   small_cube_sid, 
+                                   file_large_cube_sid, 
+                                   xfer_plist, 
                                    cube_buf);
                     CHECK(ret, FAIL, "H5Dwrite");
 
@@ -2220,16 +2226,16 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
                     ret = H5Sselect_all(file_large_cube_sid);
                     CHECK(ret, FAIL, "H5Sselect_all");
 
-                    ret = H5Dread(large_cube_dataset,
+                    ret = H5Dread(large_cube_dataset, 
                                   H5T_NATIVE_UINT16,
                                   mem_large_cube_sid,
-                                  file_large_cube_sid,
-                                  xfer_plist,
+                                  file_large_cube_sid, 
+                                  xfer_plist, 
                                   large_cube_buf_1);
                     CHECK(ret, FAIL, "H5Dread");
 
 
-                    /* verify that the expected data and only the
+                    /* verify that the expected data and only the 
                      * expected data was read.
                      */
                     start_index = (u * edge_size * edge_size * edge_size * edge_size) +
@@ -2262,7 +2268,7 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
                     } /* end for */
                     if(mis_match)
                         TestErrPrintf("large cube written from small cube has bad data! Line=%d\n", __LINE__);
-
+                    
                     x++;
                 } while((large_rank >= 2) && (small_rank <= 1) && (x < edge_size));
                 w++;
@@ -2305,10 +2311,10 @@ test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf,
 

 /****************************************************************
 **
-**  test_select_hyper_contig_dr(): Test H5S (dataspace)
-**	selection code with contiguous source and target having
+**  test_select_hyper_contig_dr(): Test H5S (dataspace) 
+**	selection code with contiguous source and target having 
 **	different ranks but the same shape.  We have already
-**	tested H5S_shape_same in isolation, so now we try to do
+**	tested H5S_shape_same in isolation, so now we try to do 
 **	I/O.
 **
 ****************************************************************/
@@ -2373,12 +2379,12 @@ test_select_hyper_contig_dr(hid_t dset_type, hid_t xfer_plist)
 

 /****************************************************************
 **
-**  test_select_hyper_checker_board_dr__select_checker_board():
-**	Given an n-cube data space with each edge of length
+**  test_select_hyper_checker_board_dr__select_checker_board():  
+**	Given an n-cube data space with each edge of length 
 **	edge_size, and a checker_edge_size either select a checker
 **	board selection of the entire cube(if sel_rank == n),
 **	or select a checker board selection of a
-**	sel_rank dimensional slice through n-cube parallel to the
+**	sel_rank dimensional slice through n-cube parallel to the 
 **      sel_rank fastest changing indices, with origin (in the
 **	higher indices) as indicated by the start array.
 **
@@ -2434,7 +2440,7 @@ test_select_hyper_checker_board_dr__select_checker_board(hid_t tgt_n_cube_sid,
         offset_count++;
 
     /* Now set up the stride and block arrays, and portions of the start
-     * and count arrays that will not be altered during the selection of
+     * and count arrays that will not be altered during the selection of 
      * the checker board.
      */
     u = 0;
@@ -2463,7 +2469,7 @@ test_select_hyper_checker_board_dr__select_checker_board(hid_t tgt_n_cube_sid,
 
         u++;
     } /* end while */
-
+   
     i = 0;
     do {
         if(0 >= sel_offset) {
@@ -2478,7 +2484,7 @@ test_select_hyper_checker_board_dr__select_checker_board(hid_t tgt_n_cube_sid,
         } /* end if */
 
         j = 0;
-        do {
+        do { 
             if(1 >= sel_offset) {
                 if(j == 0 ) {
                     start[1] = 0;
@@ -2531,22 +2537,22 @@ test_select_hyper_checker_board_dr__select_checker_board(hid_t tgt_n_cube_sid,
 
                         if(((i + j + k + l + m) % 2) == 0) {
                             if(first_selection) {
-                                first_selection = FALSE;
+                                first_selection = FALSE; 
 
-                                ret = H5Sselect_hyperslab(tgt_n_cube_sid,
+                                ret = H5Sselect_hyperslab(tgt_n_cube_sid, 
                                         H5S_SELECT_SET,
-                                        &(start[n_cube_offset]),
-                                        &(stride[n_cube_offset]),
-                                        &(count[n_cube_offset]),
+                                        &(start[n_cube_offset]), 
+                                        &(stride[n_cube_offset]), 
+                                        &(count[n_cube_offset]), 
                                         &(block[n_cube_offset]));
                                 CHECK(ret, FAIL, "H5Sselect_hyperslab");
                             } /* end if */
                             else {
-                                ret = H5Sselect_hyperslab(tgt_n_cube_sid,
+                                ret = H5Sselect_hyperslab(tgt_n_cube_sid, 
                                         H5S_SELECT_OR,
-                                        &(start[n_cube_offset]),
-                                        &(stride[n_cube_offset]),
-                                        &(count[n_cube_offset]),
+                                        &(start[n_cube_offset]), 
+                                        &(stride[n_cube_offset]), 
+                                        &(count[n_cube_offset]), 
                                         &(block[n_cube_offset]));
                                 CHECK(ret, FAIL, "H5Sselect_hyperslab");
                             } /* end else */
@@ -2584,21 +2590,21 @@ test_select_hyper_checker_board_dr__select_checker_board(hid_t tgt_n_cube_sid,
 

 /****************************************************************
 **
-**  test_select_hyper_checker_board_dr__verify_data():
+**  test_select_hyper_checker_board_dr__verify_data(): 
 **
-**	Examine the supplied buffer to see if it contains the
-**	expected data.  Return TRUE if it does, and FALSE
+**	Examine the supplied buffer to see if it contains the 
+**	expected data.  Return TRUE if it does, and FALSE 
 **      otherwise.
 **
 **	The supplied buffer is presumed to contain the results
-**	of read or writing a checkerboard selection of an
+**	of read or writing a checkerboard selection of an 
 **	n-cube, or a checkerboard selection of an m (1 <= m < n)
-**	dimensional slice through an n-cube parallel to the
-**      fastest changing indices.
+**	dimensional slice through an n-cube parallel to the 
+**      fastest changing indices.  
 **
 **	It is further presumed that the buffer was zeroed before
-**	the read, and that the n-cube was initialize with the
-**      natural numbers listed in order from the origin along
+**	the read, and that the n-cube was initialize with the 
+**      natural numbers listed in order from the origin along 
 **      the fastest changing axis.
 **
 **      Thus for a 10x10x10 3-cube, the value stored in location
@@ -2607,19 +2613,19 @@ test_select_hyper_checker_board_dr__select_checker_board(hid_t tgt_n_cube_sid,
 **
 **		(10 * 10 * x) + (10 * y) + z
 **
-**	Thus, if the buffer contains the result of reading a
+**	Thus, if the buffer contains the result of reading a 
 **	checker board selection of a 10x10x10 3-cube, location
 **	(x, y, z) will contain zero if it is not in a checker,
 **	and 100x + 10y + z if (x, y, z) is in a checker.
 **
-**	If the buffer contains the result of reading a 3
+**	If the buffer contains the result of reading a 3 
 **	dimensional slice (parallel to the three fastest changing
-**	indices) through an n cube (n > 3), then the expected
+**	indices) through an n cube (n > 3), then the expected 
 **	values in the buffer will be the same, save that we will
-**	add a constant determined by the origin of the 3-cube
+**	add a constant determined by the origin of the 3-cube 
 **	in the n-cube.
 **
-**	Finally, the function presumes that the first element
+**	Finally, the function presumes that the first element 
 **	of the buffer resides either at the origin of either
 **	a selected or an unselected checker.
 **
@@ -2679,7 +2685,7 @@ test_select_hyper_checker_board_dr__verify_data(uint16_t * buf_ptr,
                 l = 0;
                 y = 0;
                 start_in_checker[3] = start_in_checker[2];
-                do {
+                do { 
                     if(y >= checker_edge_size) {
                         start_in_checker[3] = ! start_in_checker[3];
                         y = 0;
@@ -2693,7 +2699,7 @@ test_select_hyper_checker_board_dr__verify_data(uint16_t * buf_ptr,
                             in_checker = ! in_checker;
                             z = 0;
                         } /* end if */
-
+         
                         if(in_checker) {
                             if(*val_ptr != expected_value)
                                 good_data = FALSE;
@@ -2702,10 +2708,10 @@ test_select_hyper_checker_board_dr__verify_data(uint16_t * buf_ptr,
                             if(*val_ptr != 0)
                                 good_data = FALSE;
                         } /* end else */
-
+ 
                         val_ptr++;
                         expected_value++;
-
+ 
                         m++;
                         z++;
                     } while((rank >= (test_max_rank - 4)) && (m < edge_size));
@@ -2728,10 +2734,10 @@ test_select_hyper_checker_board_dr__verify_data(uint16_t * buf_ptr,
 

 /****************************************************************
 **
-**  test_select_hyper_checker_board_dr__run_test(): Test H5S
-**      (dataspace) selection code with checker board source and
-**	target selections having different ranks but the same
-**	shape.  We have already tested H5S_shape_same in
+**  test_select_hyper_checker_board_dr__run_test(): Test H5S 
+**      (dataspace) selection code with checker board source and 
+**	target selections having different ranks but the same 
+**	shape.  We have already tested H5S_shape_same in 
 **	isolation, so now we try to do I/O.
 **
 ****************************************************************/
@@ -2856,11 +2862,11 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
 
 
     /* if chunk edge size is greater than zero, set up the small and
-     * large data set creation property lists to specify chunked
+     * large data set creation property lists to specify chunked 
      * datasets.
      */
     if(chunk_edge_size > 0) {
-        chunk_dims[0] = chunk_dims[1] =
+        chunk_dims[0] = chunk_dims[1] = 
 		chunk_dims[2] = chunk_dims[3] = chunk_dims[4] = chunk_edge_size;
 
         small_cube_dcpl_id = H5Pcreate(H5P_DATASET_CREATE);
@@ -2885,7 +2891,7 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
 
 
     /* create the small cube dataset */
-    small_cube_dataset = H5Dcreate2(fid, "small_cube_dataset", dset_type,
+    small_cube_dataset = H5Dcreate2(fid, "small_cube_dataset", dset_type, 
             file_small_cube_sid, H5P_DEFAULT, small_cube_dcpl_id, H5P_DEFAULT);
     CHECK(small_cube_dataset, FAIL, "H5Dcreate2");
 
@@ -2896,7 +2902,7 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
     } /* end if */
 
     /* create the large cube dataset */
-    large_cube_dataset = H5Dcreate2(fid, "large_cube_dataset", dset_type,
+    large_cube_dataset = H5Dcreate2(fid, "large_cube_dataset", dset_type, 
             file_large_cube_sid, H5P_DEFAULT, large_cube_dcpl_id, H5P_DEFAULT);
     CHECK(large_cube_dataset, FAIL, "H5Dcreate2");
 
@@ -2908,17 +2914,17 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
 
 
     /* write initial data to the on disk datasets */
-    ret = H5Dwrite(small_cube_dataset, H5T_NATIVE_UINT16, full_small_cube_sid,
+    ret = H5Dwrite(small_cube_dataset, H5T_NATIVE_UINT16, full_small_cube_sid, 
             full_small_cube_sid, xfer_plist, cube_buf);
     CHECK(ret, FAIL, "H5Dwrite");
 
-    ret = H5Dwrite(large_cube_dataset, H5T_NATIVE_UINT16, full_large_cube_sid,
+    ret = H5Dwrite(large_cube_dataset, H5T_NATIVE_UINT16, full_large_cube_sid, 
             full_large_cube_sid, xfer_plist, cube_buf);
     CHECK(ret, FAIL, "H5Dwrite");
 
 
     /* read initial small cube data from disk and verify that it is as expected. */
-    ret = H5Dread(small_cube_dataset, H5T_NATIVE_UINT16, full_small_cube_sid,
+    ret = H5Dread(small_cube_dataset, H5T_NATIVE_UINT16, full_small_cube_sid, 
             full_small_cube_sid, xfer_plist, small_cube_buf_1);
     CHECK(ret, FAIL, "H5Dread");
 
@@ -2927,7 +2933,7 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
         edge_size, small_rank);
 
     /* read initial large cube data from disk and verify that it is as expected. */
-    ret = H5Dread(large_cube_dataset, H5T_NATIVE_UINT16, full_large_cube_sid,
+    ret = H5Dread(large_cube_dataset, H5T_NATIVE_UINT16, full_large_cube_sid, 
             full_large_cube_sid, xfer_plist, large_cube_buf_1);
     CHECK(ret, FAIL, "H5Dread");
 
@@ -2940,11 +2946,11 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
      * of different rank that H5S_select_shape_same() views as being of the
      * same shape.
      *
-     * Start by reading small_rank-D slice from the on disk large cube, and
-     * verifying that the data read is correct.  Verify that H5S_select_shape_same()
+     * Start by reading small_rank-D slice from the on disk large cube, and 
+     * verifying that the data read is correct.  Verify that H5S_select_shape_same() 
      * returns true on the memory and file selections.
      *
-     * The first step is to set up the needed checker board selection in the
+     * The first step is to set up the needed checker board selection in the 
      * in memory small small cube
      */
 
@@ -2957,8 +2963,8 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
                                                              small_rank,
                                                              sel_start);
 
-    /* now read slices from the large, on-disk cube into the small cube.
-     * Note how we adjust sel_start only in the dimensions peculiar to the
+    /* now read slices from the large, on-disk cube into the small cube. 
+     * Note how we adjust sel_start only in the dimensions peculiar to the 
      * large cube.
      */
 
@@ -3003,10 +3009,10 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
                       sel_start
                     );
 
-                    /* verify that H5S_select_shape_same() reports the two
+                    /* verify that H5S_select_shape_same() reports the two 
                      * selections as having the same shape.
                      */
-                    check = H5S_select_shape_same_test(mem_small_cube_sid,
+                    check = H5S_select_shape_same_test(mem_small_cube_sid, 
                                                        file_large_cube_sid);
                     VERIFY(check, TRUE, "H5S_select_shape_same_test");
 
@@ -3041,18 +3047,18 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
                         TestErrPrintf("small cube read from largecube has bad data! Line=%d\n",__LINE__);
 
                     x++;
-                } while((large_rank >= (test_max_rank - 3)) &&
+                } while((large_rank >= (test_max_rank - 3)) && 
                         (small_rank <= (test_max_rank - 4)) && (x < edge_size));
                 w++;
-            } while((large_rank >= (test_max_rank - 2)) &&
+            } while((large_rank >= (test_max_rank - 2)) && 
                     (small_rank <= (test_max_rank - 3)) && (w < edge_size));
             v++;
-        } while((large_rank >= (test_max_rank - 1)) &&
+        } while((large_rank >= (test_max_rank - 1)) && 
                 (small_rank <= (test_max_rank - 2)) && (v < edge_size));
         u++;
-    } while((large_rank >= test_max_rank) &&
+    } while((large_rank >= test_max_rank) && 
             (small_rank <= (test_max_rank - 1)) && (u < edge_size));
-
+        
 
     /* similarly, read the on disk small cube into slices through the in memory
      * large cube, and verify that the correct data (and only the correct data)
@@ -3110,10 +3116,10 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
                       sel_start
                     );
 
-                    /* verify that H5S_select_shape_same() reports the two
+                    /* verify that H5S_select_shape_same() reports the two 
                      * selections as having the same shape.
                      */
-                    check = H5S_select_shape_same_test(file_small_cube_sid,
+                    check = H5S_select_shape_same_test(file_small_cube_sid, 
                                                        mem_large_cube_sid);
                     VERIFY(check, TRUE, "H5S_select_shape_same_test");
 
@@ -3131,7 +3137,7 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
                     CHECK(ret, FAIL, "H5Dread");
 
 
-                    /* verify that the expected data and only the
+                    /* verify that the expected data and only the 
                      * expected data was read.
                      */
                     data_ok = TRUE;
@@ -3179,29 +3185,29 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
                         TestErrPrintf("large cube read from small cube has bad data! Line=%d\n",__LINE__);
 
                     x++;
-                } while((large_rank >= (test_max_rank - 3)) &&
+                } while((large_rank >= (test_max_rank - 3)) && 
                         (small_rank <= (test_max_rank - 4)) && (x < edge_size));
                 w++;
-            } while((large_rank >= (test_max_rank - 2)) &&
+            } while((large_rank >= (test_max_rank - 2)) && 
                     (small_rank <= (test_max_rank - 3)) && (w < edge_size));
             v++;
-        } while((large_rank >= (test_max_rank - 1)) &&
+        } while((large_rank >= (test_max_rank - 1)) && 
                 (small_rank <= (test_max_rank - 2)) && (v < edge_size));
         u++;
-    } while((large_rank >= test_max_rank) &&
+    } while((large_rank >= test_max_rank) && 
             (small_rank <= (test_max_rank - 1)) && (u < edge_size));
 
 
-    /* now we go in the opposite direction, verifying that we can write
-     * from memory to file using selections of different rank that
+    /* now we go in the opposite direction, verifying that we can write 
+     * from memory to file using selections of different rank that 
      * H5S_select_shape_same() views as being of the same shape.
      *
-     * Start by writing small_rank D slices from the in memory large cube, to
+     * Start by writing small_rank D slices from the in memory large cube, to 
      * the the on disk small cube dataset.  After each write, read the small
      * cube dataset back from disk, and verify that it contains the expected
-     * data. Verify that H5S_select_shape_same() returns true on the
+     * data. Verify that H5S_select_shape_same() returns true on the 
      * memory and file selections.
-     */
+     */ 
 
     /* select a checker board in the file small cube dataspace */
     sel_start[0] = sel_start[1] = sel_start[2] = sel_start[3] = sel_start[4] = 0;
@@ -3233,11 +3239,11 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
                         sel_start[3] = x;
 
                     /* zero out the on disk small cube */
-                    ret = H5Dwrite(small_cube_dataset,
-                                   H5T_NATIVE_UINT16,
-                                   full_small_cube_sid,
-                                   full_small_cube_sid,
-                                   xfer_plist,
+                    ret = H5Dwrite(small_cube_dataset, 
+                                   H5T_NATIVE_UINT16, 
+                                   full_small_cube_sid, 
+                                   full_small_cube_sid, 
+                                   xfer_plist, 
                                    zero_buf);
                     CHECK(ret, FAIL, "H5Dwrite");
 
@@ -3263,22 +3269,22 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
                       sel_start
                     );
 
-                    /* verify that H5S_select_shape_same() reports the two
+                    /* verify that H5S_select_shape_same() reports the two 
                      * selections as having the same shape.
                      */
-                    check = H5S_select_shape_same_test(file_small_cube_sid,
+                    check = H5S_select_shape_same_test(file_small_cube_sid, 
                                                        mem_large_cube_sid);
                     VERIFY(check, TRUE, "H5S_select_shape_same_test");
 
 
-	            /* write the slice from the in memory large cube to the
-                     * on disk small cube
+	            /* write the slice from the in memory large cube to the 
+                     * on disk small cube 
                      */
-                    ret = H5Dwrite(small_cube_dataset,
-                                   H5T_NATIVE_UINT16,
-                                   mem_large_cube_sid,
-                                   file_small_cube_sid,
-                                   xfer_plist,
+                    ret = H5Dwrite(small_cube_dataset, 
+                                   H5T_NATIVE_UINT16, 
+                                   mem_large_cube_sid, 
+                                   file_small_cube_sid, 
+                                   xfer_plist, 
                                    cube_buf);
                     CHECK(ret, FAIL, "H5Dwrite");
 
@@ -3287,11 +3293,11 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
                     HDmemset(small_cube_buf_1, 0, sizeof(*small_cube_buf_1) * small_cube_size);
 
                     /* read the on disk small cube into memory */
-                    ret = H5Dread(small_cube_dataset,
+                    ret = H5Dread(small_cube_dataset, 
                                   H5T_NATIVE_UINT16,
                                   full_small_cube_sid,
-                                  full_small_cube_sid,
-                                  xfer_plist,
+                                  full_small_cube_sid, 
+                                  xfer_plist, 
                                   small_cube_buf_1);
                     CHECK(ret, FAIL, "H5Dread");
 
@@ -3314,24 +3320,24 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
                         TestErrPrintf("small cube read from largecube has bad data! Line=%d\n",__LINE__);
 
                     x++;
-                } while((large_rank >= (test_max_rank - 3)) &&
+                } while((large_rank >= (test_max_rank - 3)) && 
                         (small_rank <= (test_max_rank - 4)) && (x < edge_size));
                 w++;
-            } while((large_rank >= (test_max_rank - 2)) &&
+            } while((large_rank >= (test_max_rank - 2)) && 
                     (small_rank <= (test_max_rank - 3)) && (w < edge_size));
             v++;
-        } while((large_rank >= (test_max_rank - 1)) &&
+        } while((large_rank >= (test_max_rank - 1)) && 
                 (small_rank <= (test_max_rank - 2)) && (v < edge_size));
         u++;
-    } while((large_rank >= test_max_rank) &&
+    } while((large_rank >= test_max_rank) && 
             (small_rank <= (test_max_rank - 1)) && (u < edge_size));
 
 
-    /* Now write checker board selections of the entries in memory
-     * small cube to slices of the on disk cube.  After each write,
-     * read the on disk large cube * into memeory, and verify that
-     * it contains the expected * data.  Verify that
-     * H5S_select_shape_same() returns true on the memory and file
+    /* Now write checker board selections of the entries in memory 
+     * small cube to slices of the on disk cube.  After each write, 
+     * read the on disk large cube * into memeory, and verify that 
+     * it contains the expected * data.  Verify that 
+     * H5S_select_shape_same() returns true on the memory and file 
      * selections.
      */
 
@@ -3365,11 +3371,11 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
                         sel_start[3] = x;
 
                     /* zero out the on disk cube */
-                    ret = H5Dwrite(large_cube_dataset,
-                                   H5T_NATIVE_USHORT,
-                                   full_large_cube_sid,
-                                   full_large_cube_sid,
-                                   xfer_plist,
+                    ret = H5Dwrite(large_cube_dataset, 
+                                   H5T_NATIVE_USHORT, 
+                                   full_large_cube_sid, 
+                                   full_large_cube_sid, 
+                                   xfer_plist, 
                                    zero_buf);
                     CHECK(ret, FAIL, "H5Dwrite");
 
@@ -3395,10 +3401,10 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
                       sel_start
                     );
 
-                    /* verify that H5S_select_shape_same() reports the two
+                    /* verify that H5S_select_shape_same() reports the two 
                      * selections as having the same shape.
                      */
-                    check = H5S_select_shape_same_test(file_large_cube_sid,
+                    check = H5S_select_shape_same_test(file_large_cube_sid, 
                                                        mem_small_cube_sid);
                     VERIFY(check, TRUE, "H5S_select_shape_same_test");
 
@@ -3407,11 +3413,11 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
                      * small cube to a slice through the on disk large
                      * cube.
                      */
-                    ret = H5Dwrite(large_cube_dataset,
-                                   H5T_NATIVE_UINT16,
-                                   mem_small_cube_sid,
-                                   file_large_cube_sid,
-                                   xfer_plist,
+                    ret = H5Dwrite(large_cube_dataset, 
+                                   H5T_NATIVE_UINT16, 
+                                   mem_small_cube_sid, 
+                                   file_large_cube_sid, 
+                                   xfer_plist, 
                                    cube_buf);
                     CHECK(ret, FAIL, "H5Dwrite");
 
@@ -3420,16 +3426,16 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
                     HDmemset(large_cube_buf_1, 0, sizeof(*large_cube_buf_1) * large_cube_size);
 
                     /* read the on disk large cube into memory */
-                    ret = H5Dread(large_cube_dataset,
+                    ret = H5Dread(large_cube_dataset, 
                                   H5T_NATIVE_UINT16,
                                   full_large_cube_sid,
-                                  full_large_cube_sid,
-                                  xfer_plist,
+                                  full_large_cube_sid, 
+                                  xfer_plist, 
                                   large_cube_buf_1);
                     CHECK(ret, FAIL, "H5Dread");
 
 
-                    /* verify that the expected data and only the
+                    /* verify that the expected data and only the 
                      * expected data was written to the on disk large
                      * cube.
                      */
@@ -3479,18 +3485,18 @@ test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_
                         TestErrPrintf("large cube written from small cube has bad data! Line=%d\n",__LINE__);
 
                     x++;
-                } while((large_rank >= (test_max_rank - 3)) &&
+                } while((large_rank >= (test_max_rank - 3)) && 
                         (small_rank <= (test_max_rank - 4)) && (x < edge_size));
                 w++;
-            } while((large_rank >= (test_max_rank - 2)) &&
+            } while((large_rank >= (test_max_rank - 2)) && 
                     (small_rank <= (test_max_rank - 3)) && (w < edge_size));
             v++;
-        } while((large_rank >= (test_max_rank - 1)) &&
+        } while((large_rank >= (test_max_rank - 1)) && 
                 (small_rank <= (test_max_rank - 2)) && (v < edge_size));
         u++;
-    } while((large_rank >= test_max_rank) &&
+    } while((large_rank >= test_max_rank) && 
             (small_rank <= (test_max_rank - 1)) && (u < edge_size));
-
+                    
 
     /* Close memory dataspaces */
     ret = H5Sclose(full_small_cube_sid);
@@ -12344,7 +12350,7 @@ test_space_rebuild(void)
     ret = H5Sselect_hyperslab(sid_reg_ori5,H5S_SELECT_SET,start5,stride5,count5,block5);
     CHECK(ret, FAIL, "H5Sselect_hyperslab");
 
-    /* Build up five dimensional regular selection with H5_SELECT_OR, inside HDF5,
+    /* Build up four dimensional regular selection with H5_SELECT_OR, inside HDF5,
        it will be treated as an irregular selection. */
     start5[4]  = 1;
     count5[4]  = 1;
@@ -12494,7 +12500,6 @@ test_space_rebuild(void)
        CHECK(ret,FAIL,"H5S_hyper_rebuild");
     }/* No need to do shape comparision */
 
-    /* Add more selections to make it regular again */
     start5[3]  = 5;
     count5[3]  = 1;
     stride5[3] = 4;
@@ -13070,6 +13075,594 @@ test_select_bounds(void)
 
 /****************************************************************
 **
+**  test_hyper_regular(): Tests query operations on regular hyperslabs
+**
+****************************************************************/
+static void
+test_hyper_regular(void)
+{
+    hid_t sid;          /* Dataspace ID */
+    const hsize_t dims[SPACE13_RANK] = {SPACE13_DIM1, SPACE13_DIM2, SPACE13_DIM3};    /* Dataspace dimensions */
+    hsize_t coord[SPACE13_NPOINTS][SPACE13_RANK]; /* Coordinates for point selection */
+    hsize_t start[SPACE13_RANK];        /* The start of the hyperslab */
+    hsize_t stride[SPACE13_RANK];       /* The stride between block starts for the hyperslab */
+    hsize_t count[SPACE13_RANK];        /* The number of blocks for the hyperslab */
+    hsize_t block[SPACE13_RANK];        /* The size of each block for the hyperslab */
+    hsize_t t_start[SPACE13_RANK];      /* Temporary start of the hyperslab */
+    hsize_t t_count[SPACE13_RANK];      /* Temporary number of blocks for the hyperslab */
+    hsize_t q_start[SPACE13_RANK];      /* The queried start of the hyperslab */
+    hsize_t q_stride[SPACE13_RANK];     /* The queried stride between block starts for the hyperslab */
+    hsize_t q_count[SPACE13_RANK];      /* The queried number of blocks for the hyperslab */
+    hsize_t q_block[SPACE13_RANK];      /* The queried size of each block for the hyperslab */
+    htri_t is_regular;                  /* Whether a hyperslab selection is regular */
+    unsigned u;                         /* Local index variable */
+    herr_t ret;                         /* Generic return value */
+
+    /* Output message about test being performed */
+    MESSAGE(6, ("Testing queries on regular hyperslabs\n"));
+
+    /* Create dataspace */
+    sid = H5Screate_simple(SPACE13_RANK, dims, NULL);
+    CHECK(sid, FAIL, "H5Screate_simple");
+
+    /* Query if 'all' selection is regular hyperslab (should fail) */
+    H5E_BEGIN_TRY {
+        is_regular = H5Sis_regular_hyperslab(sid);
+    } H5E_END_TRY;                                  
+    VERIFY(is_regular, FAIL, "H5Sis_regular_hyperslab");     
+
+    /* Query regular hyperslab selection info (should fail) */
+    H5E_BEGIN_TRY {
+        ret = H5Sget_regular_hyperslab(sid, q_start, q_stride, q_count, q_block);
+    } H5E_END_TRY;                                  
+    VERIFY(ret, FAIL, "H5Sget_regular_hyperslab");     
+
+    /* Set 'none' selection */
+    ret = H5Sselect_none(sid);
+    CHECK(ret, FAIL, "H5Sselect_none");
+
+    /* Query if 'none' selection is regular hyperslab (should fail) */
+    H5E_BEGIN_TRY {
+        is_regular = H5Sis_regular_hyperslab(sid);
+    } H5E_END_TRY;                                  
+    VERIFY(is_regular, FAIL, "H5Sis_regular_hyperslab");     
+
+    /* Query regular hyperslab selection info (should fail) */
+    H5E_BEGIN_TRY {
+        ret = H5Sget_regular_hyperslab(sid, q_start, q_stride, q_count, q_block);
+    } H5E_END_TRY;                                  
+    VERIFY(ret, FAIL, "H5Sget_regular_hyperslab");     
+
+    /* Set point selection */
+    coord[0][0] =  3; coord[0][1] =  3; coord[0][2] = 3;
+    coord[1][0] =  3; coord[1][1] = 48; coord[1][2] = 48;
+    coord[2][0] = 48; coord[2][1] =  3; coord[2][2] = 3;
+    coord[3][0] = 48; coord[3][1] = 48; coord[3][2] = 48;
+    ret = H5Sselect_elements(sid, H5S_SELECT_SET, (size_t)SPACE13_NPOINTS, (const hsize_t *)coord);
+    CHECK(ret, FAIL, "H5Sselect_elements");
+
+    /* Query if 'point' selection is regular hyperslab (should fail) */
+    H5E_BEGIN_TRY {
+        is_regular = H5Sis_regular_hyperslab(sid);
+    } H5E_END_TRY;                                  
+    VERIFY(is_regular, FAIL, "H5Sis_regular_hyperslab");     
+
+    /* Query regular hyperslab selection info (should fail) */
+    H5E_BEGIN_TRY {
+        ret = H5Sget_regular_hyperslab(sid, q_start, q_stride, q_count, q_block);
+    } H5E_END_TRY;                                  
+    VERIFY(ret, FAIL, "H5Sget_regular_hyperslab");     
+
+    /* Set "regular" hyperslab selection */
+    start[0]  = 2; start[1]  = 2; start[2]  = 2;
+    stride[0] = 5; stride[1] = 5; stride[2] = 5;
+    count[0]  = 3; count[1]  = 3; count[2]  = 3;
+    block[0]  = 4; block[1]  = 4; block[2]  = 4;
+    ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block);
+    CHECK(ret, FAIL, "H5Sselect_hyperslab");
+
+    /* Query if 'hyperslab' selection is regular hyperslab (should be TRUE) */
+    is_regular = H5Sis_regular_hyperslab(sid);
+    VERIFY(is_regular, TRUE, "H5Sis_regular_hyperslab");     
+
+    /* Retrieve the hyperslab parameters */
+    ret = H5Sget_regular_hyperslab(sid, q_start, q_stride, q_count, q_block);
+    CHECK(ret, FAIL, "H5Sget_regular_hyperslab");
+
+    /* Verify the hyperslab parameters */
+    for(u = 0; u < SPACE13_RANK; u++) {
+        if(start[u] != q_start[u])
+            ERROR("H5Sget_regular_hyperslab, start");
+        if(stride[u] != q_stride[u])
+            ERROR("H5Sget_regular_hyperslab, stride");
+        if(count[u] != q_count[u])
+            ERROR("H5Sget_regular_hyperslab, count");
+        if(block[u] != q_block[u])
+            ERROR("H5Sget_regular_hyperslab, block");
+    } /* end for */
+
+    /* 'OR' in another point */
+    t_start[0]  = 0; t_start[1]  = 0; t_start[2]  = 0;
+    t_count[0]  = 1; t_count[1]  = 1; t_count[2]  = 1;
+    ret = H5Sselect_hyperslab(sid, H5S_SELECT_OR, t_start, NULL, t_count, NULL);
+    CHECK(ret, FAIL, "H5Sselect_hyperslab");
+
+    /* Query if 'hyperslab' selection is regular hyperslab (should be FALSE) */
+    is_regular = H5Sis_regular_hyperslab(sid);
+    VERIFY(is_regular, FALSE, "H5Sis_regular_hyperslab");     
+
+    /* Query regular hyperslab selection info (should fail) */
+    H5E_BEGIN_TRY {
+        ret = H5Sget_regular_hyperslab(sid, q_start, q_stride, q_count, q_block);
+    } H5E_END_TRY;                                  
+    VERIFY(ret, FAIL, "H5Sget_regular_hyperslab");     
+
+    /* 'XOR' in the point again, to remove it, which should make it regular again */
+    t_start[0]  = 0; t_start[1]  = 0; t_start[2]  = 0;
+    t_count[0]  = 1; t_count[1]  = 1; t_count[2]  = 1;
+    ret = H5Sselect_hyperslab(sid, H5S_SELECT_XOR, t_start, NULL, t_count, NULL);
+    CHECK(ret, FAIL, "H5Sselect_hyperslab");
+
+    /* Query if 'hyperslab' selection is regular hyperslab (should be TRUE) */
+    is_regular = H5Sis_regular_hyperslab(sid);
+    VERIFY(is_regular, TRUE, "H5Sis_regular_hyperslab");     
+
+    /* Retrieve the hyperslab parameters */
+    ret = H5Sget_regular_hyperslab(sid, q_start, q_stride, q_count, q_block);
+    CHECK(ret, FAIL, "H5Sget_regular_hyperslab");
+
+    /* Verify the hyperslab parameters */
+    for(u = 0; u < SPACE13_RANK; u++) {
+        if(start[u] != q_start[u])
+            ERROR("H5Sget_regular_hyperslab, start");
+        if(stride[u] != q_stride[u])
+            ERROR("H5Sget_regular_hyperslab, stride");
+        if(count[u] != q_count[u])
+            ERROR("H5Sget_regular_hyperslab, count");
+        if(block[u] != q_block[u])
+            ERROR("H5Sget_regular_hyperslab, block");
+    } /* end for */
+
+    /* Close the dataspace */
+    ret = H5Sclose(sid);
+    CHECK(ret, FAIL, "H5Sclose");
+}   /* test_hyper_regular() */
+
+/****************************************************************
+**
+**  test_hyper_unlim(): Tests unlimited hyperslab selections
+**
+****************************************************************/
+static void
+test_hyper_unlim_check(hid_t sid, hsize_t *dims, hssize_t enpoints,
+    hssize_t enblocks, hsize_t *eblock1, hsize_t *eblock2)
+{
+    hid_t       lim_sid;
+    hsize_t     start[3];
+    H5S_sel_type sel_type;
+    hssize_t    npoints;
+    hssize_t    nblocks;
+    hsize_t     blocklist[12];
+    herr_t      ret;
+
+    HDassert(enblocks <= 2);
+
+    /* Copy sid to lim_sid */
+    lim_sid = H5Scopy(sid);
+    CHECK(lim_sid, FAIL, "H5Scopy");
+
+    /* "And" lim_sid with dims to create limited selection */
+    HDmemset(start, 0, sizeof(start));
+    ret = H5Sselect_hyperslab(lim_sid, H5S_SELECT_AND, start, NULL, dims, NULL);
+    CHECK(ret, FAIL, "H5Sselect_hyperslab");
+
+    /* Check number of elements */
+    npoints = H5Sget_select_npoints(lim_sid);
+    CHECK(npoints, FAIL, "H5Sget_select_npoints");
+    VERIFY(npoints, enpoints, "H5Sget_select_npoints");
+
+    /* Get selection type */
+    sel_type = H5Sget_select_type(lim_sid);
+    CHECK(sel_type, H5S_SEL_ERROR, "H5Sget_select_type");
+
+    /* Only examine blocks for hyperslab selection */
+    if(sel_type == H5S_SEL_HYPERSLABS) {
+        /* Get number of blocks */
+        nblocks = H5Sget_select_hyper_nblocks(lim_sid);
+        CHECK(nblocks, FAIL, "H5Sget_select_hyper_nblocks");
+        VERIFY(nblocks, enblocks, "H5Sget_select_hyper_nblocks");
+
+        if(nblocks > 0) {
+            /* Get blocklist */
+            ret = H5Sget_select_hyper_blocklist(lim_sid, (hsize_t)0, (hsize_t)nblocks, blocklist);
+            CHECK(ret, FAIL, "H5Sget_select_hyper_blocklist");
+
+            /* Verify blocklist */
+            if(nblocks == (hssize_t)1) {
+                if(HDmemcmp(blocklist, eblock1, 6 * sizeof(eblock1[0])))
+                    ERROR("H5Sget_select_hyper_blocklist");
+            } /* end if */
+            else {
+                HDassert(nblocks == (hssize_t)2);
+                if(HDmemcmp(blocklist, eblock1, 6 * sizeof(eblock1[0]))) {
+                    if(HDmemcmp(blocklist, eblock2, 6 * sizeof(eblock2[0])))
+                        ERROR("H5Sget_select_hyper_blocklist");
+                    if(HDmemcmp(&blocklist[6], eblock1, 6 * sizeof(eblock1[0])))
+                        ERROR("H5Sget_select_hyper_blocklist");
+                } /* end if */
+                else
+                    if(HDmemcmp(&blocklist[6], eblock2, 6 * sizeof(eblock2[0])))
+                        ERROR("H5Sget_select_hyper_blocklist");
+            } /* end else */
+        } /* end if */
+    } /* end if */
+    else
+        if(sel_type != H5S_SEL_NONE)
+            ERROR("H5Sget_select_type");
+
+    /* Close the limited dataspace */
+    ret = H5Sclose(lim_sid);
+    CHECK(ret, FAIL, "H5Sclose");
+} /* end test_hyper_unlim_check() */
+
+static void
+test_hyper_unlim(void)
+{
+    hid_t       sid;
+    hsize_t     dims[3] = {4, 4, 7};
+    hsize_t     mdims[3] = {4, H5S_UNLIMITED, 7};
+    hsize_t     start[3] = {1, 2, 1};
+    hsize_t     stride[3] = {1, 1, 3};
+    hsize_t     count[3] = {1, 1, 2};
+    hsize_t     block[3] = {2, H5S_UNLIMITED, 2};
+    hsize_t     start2[3];
+    hsize_t     count2[3];
+    hsize_t     eblock1[6] = {1, 2, 1, 2, 3, 2};
+    hsize_t     eblock2[6] = {1, 2, 4, 2, 3, 5};
+    hssize_t    offset[3] = {0, -1, 0};
+    hssize_t    ssize_out;
+    herr_t      ret;
+
+    /* Output message about test being performed */
+    MESSAGE(6, ("Testing unlimited hyperslab selections\n"));
+
+    /* Create dataspace */
+    sid = H5Screate_simple(3, dims, mdims);
+    CHECK(sid, FAIL, "H5Screate_simple");
+
+    /* Select unlimited hyperslab */
+    ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block);
+    CHECK(ret, FAIL, "H5Sselect_hyperslab");
+
+    /* Check with unlimited dimension clipped to 4 */
+    test_hyper_unlim_check(sid, dims, (hssize_t)16, (hssize_t)2, eblock1, eblock2);
+
+    /* Check with unlimited dimension clipped to 3 */
+    dims[1] = 3;
+    eblock1[4] = 2;
+    eblock2[4] = 2;
+    test_hyper_unlim_check(sid, dims, (hssize_t)8, (hssize_t)2, eblock1, eblock2);
+
+    /* Check with unlimited dimension clipped to 2 */
+    dims[1] = 2;
+    test_hyper_unlim_check(sid, dims, (hssize_t)0, (hssize_t)0, eblock1, eblock2);
+
+    /* Check with unlimited dimension clipped to 1 */
+    dims[1] = 1;
+    test_hyper_unlim_check(sid, dims, (hssize_t)0, (hssize_t)0, eblock1, eblock2);
+
+    /* Check with unlimited dimension clipped to 7 */
+    dims[1] = 7;
+    eblock1[4] = 6;
+    eblock2[4] = 6;
+    test_hyper_unlim_check(sid, dims, (hssize_t)40, (hssize_t)2, eblock1, eblock2);
+
+    /* Set offset of selection */
+    ret = H5Soffset_simple(sid, offset);
+    CHECK(ret, FAIL, "H5Soffset_simple");
+
+    /* Check with adjusted offset (should not affect result) */
+    test_hyper_unlim_check(sid, dims, (hssize_t)40, (hssize_t)2, eblock1, eblock2);
+
+    /* Reset offset of selection */
+    offset[1] = (hssize_t)0;
+    ret = H5Soffset_simple(sid, offset);
+    CHECK(ret, FAIL, "H5Soffset_simple");
+
+    /*
+     * Now try with multiple blocks in unlimited dimension
+     */
+    stride[1] = 3;
+    stride[2] = 1;
+    count[1] = H5S_UNLIMITED;
+    count[2] = 1;
+    block[1] = 2;
+
+    /* Select unlimited hyperslab */
+    ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block);
+    CHECK(ret, FAIL, "H5Sselect_hyperslab");
+
+    /* Check with new selection */
+    eblock1[1] = 2;
+    eblock1[4] = 3;
+    eblock2[1] = 5;
+    eblock2[2] = 1;
+    eblock2[4] = 6;
+    eblock2[5] = 2;
+    test_hyper_unlim_check(sid, dims, (hssize_t)16, (hssize_t)2, eblock1, eblock2);
+
+    /* Check with unlimited dimension clipped to 3 */
+    dims[1] = 3;
+    eblock1[4] = 2;
+    test_hyper_unlim_check(sid, dims, (hssize_t)4, (hssize_t)1, eblock1, eblock2);
+
+    /* Check with unlimited dimension clipped to 4 */
+    dims[1] = 4;
+    eblock1[4] = 3;
+    test_hyper_unlim_check(sid, dims, (hssize_t)8, (hssize_t)1, eblock1, eblock2);
+
+    /* Check with unlimited dimension clipped to 5 */
+    dims[1] = 5;
+    eblock1[4] = 3;
+    test_hyper_unlim_check(sid, dims, (hssize_t)8, (hssize_t)1, eblock1, eblock2);
+
+    /* Check with unlimited dimension clipped to 6 */
+    dims[1] = 6;
+    eblock1[4] = 3;
+    eblock2[4] = 5;
+    test_hyper_unlim_check(sid, dims, (hssize_t)12, (hssize_t)2, eblock1, eblock2);
+
+    /* Set offset of selection */
+    offset[1] = (hssize_t)-1;
+    ret = H5Soffset_simple(sid, offset);
+    CHECK(ret, FAIL, "H5Soffset_simple");
+
+    /* Check with adjusted offset (should not affect result) */
+    test_hyper_unlim_check(sid, dims, (hssize_t)12, (hssize_t)2, eblock1, eblock2);
+
+    /* Set offset of selection */
+    offset[1] = (hssize_t)3;
+    ret = H5Soffset_simple(sid, offset);
+    CHECK(ret, FAIL, "H5Soffset_simple");
+
+    /* Check with adjusted offset (should not affect result) */
+    test_hyper_unlim_check(sid, dims, (hssize_t)12, (hssize_t)2, eblock1, eblock2);
+
+    /* Reset offset of selection */
+    offset[1] = (hssize_t)0;
+    ret = H5Soffset_simple(sid, offset);
+    CHECK(ret, FAIL, "H5Soffset_simple");
+
+    /*
+     * Now try invalid operations
+     */
+    H5E_BEGIN_TRY {
+        /* Try multiple unlimited dimensions */
+        start[0] = 1;
+        start[1] = 2;
+        start[2] = 1;
+        stride[0] = 1;
+        stride[1] = 3;
+        stride[2] = 3;
+        count[0] = 1;
+        count[1] = H5S_UNLIMITED;
+        count[2] = H5S_UNLIMITED;
+        block[0] = 2;
+        block[1] = 2;
+        block[2] = 2;
+        ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block);
+        VERIFY(ret, FAIL, "H5Sselect_hyperslab");
+
+        /* Try unlimited count and block */
+        count[2] = 2;
+        block[1] = H5S_UNLIMITED;
+        ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block);
+        VERIFY(ret, FAIL, "H5Sselect_hyperslab");
+    } H5E_END_TRY
+
+    /* Try operations with two unlimited selections */
+    block[1] = 2;
+    ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block);
+        CHECK(ret, FAIL, "H5Sselect_hyperslab");
+    H5E_BEGIN_TRY {
+        ret = H5Sselect_hyperslab(sid, H5S_SELECT_OR, start, NULL, count, NULL);
+        VERIFY(ret, FAIL, "H5Sselect_hyperslab");
+        ret = H5Sselect_hyperslab(sid, H5S_SELECT_AND, start, NULL, count, NULL);
+        VERIFY(ret, FAIL, "H5Sselect_hyperslab");
+        ret = H5Sselect_hyperslab(sid, H5S_SELECT_XOR, start, NULL, count, NULL);
+        VERIFY(ret, FAIL, "H5Sselect_hyperslab");
+        ret = H5Sselect_hyperslab(sid, H5S_SELECT_NOTB, start, NULL, count, NULL);
+        VERIFY(ret, FAIL, "H5Sselect_hyperslab");
+        ret = H5Sselect_hyperslab(sid, H5S_SELECT_NOTA, start, NULL, count, NULL);
+        VERIFY(ret, FAIL, "H5Sselect_hyperslab");
+    } H5E_END_TRY
+
+    /* Try invalid combination operations */
+    H5E_BEGIN_TRY {
+        ret = H5Sselect_hyperslab(sid, H5S_SELECT_OR, start, NULL, block, NULL);
+        VERIFY(ret, FAIL, "H5Sselect_hyperslab");
+        ret = H5Sselect_hyperslab(sid, H5S_SELECT_XOR, start, NULL, block, NULL);
+        VERIFY(ret, FAIL, "H5Sselect_hyperslab");
+        ret = H5Sselect_hyperslab(sid, H5S_SELECT_NOTB, start, NULL, block, NULL);
+        VERIFY(ret, FAIL, "H5Sselect_hyperslab");
+    } H5E_END_TRY
+    ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, NULL, block, NULL);
+    CHECK(ret, FAIL, "H5Sselect_hyperslab");
+    H5E_BEGIN_TRY {
+        ret = H5Sselect_hyperslab(sid, H5S_SELECT_OR, start, stride, count, block);
+        VERIFY(ret, FAIL, "H5Sselect_hyperslab");
+        ret = H5Sselect_hyperslab(sid, H5S_SELECT_XOR, start, stride, count, block);
+        VERIFY(ret, FAIL, "H5Sselect_hyperslab");
+        ret = H5Sselect_hyperslab(sid, H5S_SELECT_NOTA, start, stride, count, block);
+        VERIFY(ret, FAIL, "H5Sselect_hyperslab");
+    } H5E_END_TRY
+
+    /*
+     * Now test valid combination operations
+     */
+    /* unlim AND non-unlim */
+    count[0] = 1;
+    count[1] = H5S_UNLIMITED;
+    count[2] = 2;
+    block[0] = 2;
+    block[1] = 2;
+    block[2] = 2;
+    ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block);
+    CHECK(ret, FAIL, "H5Sselect_hyperslab");
+    start2[0] = 2;
+    start2[1] = 2;
+    start2[2] = 0;
+    count2[0] = 5;
+    count2[1] = 4;
+    count2[2] = 2;
+    ret = H5Sselect_hyperslab(sid, H5S_SELECT_AND, start2, NULL, count2, NULL);
+    CHECK(ret, FAIL, "H5Sselect_hyperslab");
+    eblock1[0] = 2;
+    eblock1[3] = 2;
+    eblock1[1] = 2;
+    eblock1[4] = 3;
+    eblock1[2] = 1;
+    eblock1[5] = 1;
+    eblock2[0] = 2;
+    eblock2[3] = 2;
+    eblock2[1] = 5;
+    eblock2[4] = 5;
+    eblock2[2] = 1;
+    eblock2[5] = 1;
+    dims[0] = 50;
+    dims[1] = 50;
+    dims[2] = 50;
+    test_hyper_unlim_check(sid, dims, (hssize_t)3, (hssize_t)2, eblock1, eblock2);
+
+    /* unlim NOTA non-unlim */
+    count[0] = 1;
+    count[1] = H5S_UNLIMITED;
+    count[2] = 2;
+    block[0] = 2;
+    block[1] = 2;
+    block[2] = 2;
+    ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block);
+    CHECK(ret, FAIL, "H5Sselect_hyperslab");
+    start2[0] = 1;
+    start2[1] = 5;
+    start2[2] = 2;
+    count2[0] = 2;
+    count2[1] = 2;
+    count2[2] = 6;
+    ret = H5Sselect_hyperslab(sid, H5S_SELECT_NOTA, start2, NULL, count2, NULL);
+    CHECK(ret, FAIL, "H5Sselect_hyperslab");
+    eblock1[0] = 1;
+    eblock1[3] = 2;
+    eblock1[1] = 5;
+    eblock1[4] = 6;
+    eblock1[2] = 3;
+    eblock1[5] = 3;
+    eblock2[0] = 1;
+    eblock2[3] = 2;
+    eblock2[1] = 5;
+    eblock2[4] = 6;
+    eblock2[2] = 6;
+    eblock2[5] = 7;
+    dims[0] = 50;
+    dims[1] = 50;
+    dims[2] = 50;
+    test_hyper_unlim_check(sid, dims, (hssize_t)12, (hssize_t)2, eblock1, eblock2);
+
+    /* non-unlim AND unlim */
+    start2[0] = 2;
+    start2[1] = 2;
+    start2[2] = 0;
+    count2[0] = 5;
+    count2[1] = 4;
+    count2[2] = 2;
+    ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start2, NULL, count2, NULL);
+    CHECK(ret, FAIL, "H5Sselect_hyperslab");
+    count[0] = 1;
+    count[1] = H5S_UNLIMITED;
+    count[2] = 2;
+    block[0] = 2;
+    block[1] = 2;
+    block[2] = 2;
+    ret = H5Sselect_hyperslab(sid, H5S_SELECT_AND, start, stride, count, block);
+    CHECK(ret, FAIL, "H5Sselect_hyperslab");
+    eblock1[0] = 2;
+    eblock1[3] = 2;
+    eblock1[1] = 2;
+    eblock1[4] = 3;
+    eblock1[2] = 1;
+    eblock1[5] = 1;
+    eblock2[0] = 2;
+    eblock2[3] = 2;
+    eblock2[1] = 5;
+    eblock2[4] = 5;
+    eblock2[2] = 1;
+    eblock2[5] = 1;
+    dims[0] = 50;
+    dims[1] = 50;
+    dims[2] = 50;
+    test_hyper_unlim_check(sid, dims, (hssize_t)3, (hssize_t)2, eblock1, eblock2);
+
+    /* non-unlim NOTB unlim */
+    start2[0] = 1;
+    start2[1] = 5;
+    start2[2] = 2;
+    count2[0] = 2;
+    count2[1] = 2;
+    count2[2] = 6;
+    ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start2, NULL, count2, NULL);
+    CHECK(ret, FAIL, "H5Sselect_hyperslab");
+    count[0] = 1;
+    count[1] = H5S_UNLIMITED;
+    count[2] = 2;
+    block[0] = 2;
+    block[1] = 2;
+    block[2] = 2;
+    ret = H5Sselect_hyperslab(sid, H5S_SELECT_NOTB, start, stride, count, block);
+    CHECK(ret, FAIL, "H5Sselect_hyperslab");
+    eblock1[0] = 1;
+    eblock1[3] = 2;
+    eblock1[1] = 5;
+    eblock1[4] = 6;
+    eblock1[2] = 3;
+    eblock1[5] = 3;
+    eblock2[0] = 1;
+    eblock2[3] = 2;
+    eblock2[1] = 5;
+    eblock2[4] = 6;
+    eblock2[2] = 6;
+    eblock2[5] = 7;
+    dims[0] = 50;
+    dims[1] = 50;
+    dims[2] = 50;
+    test_hyper_unlim_check(sid, dims, (hssize_t)12, (hssize_t)2, eblock1, eblock2);
+
+    /* Test H5Sget_select_npoints() */
+    ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block);
+    CHECK(ret, FAIL, "H5Sselect_hyperslab");
+    ssize_out = H5Sget_select_npoints(sid);
+    VERIFY(ssize_out, (hssize_t)H5S_UNLIMITED, "H5Sget_select_npoints");
+
+    /* Test H5Sget_select_hyper_nblocks() */
+    ssize_out = H5Sget_select_hyper_nblocks(sid);
+    VERIFY(ssize_out, (hssize_t)H5S_UNLIMITED, "H5Sget_select_hyper_nblocks");
+
+    /* Test H5Sget_select_bounds() */
+    ret = H5Sget_select_bounds(sid, start2, count2);
+    CHECK(ret, FAIL, "H5Sget_select_bounds");
+    VERIFY(start2[0], start[0], "H5Sget_select_bounds");
+    VERIFY(start2[1], start[1], "H5Sget_select_bounds");
+    VERIFY(start2[2], start[2], "H5Sget_select_bounds");
+    VERIFY(count2[0], start[0] + (stride[0] * (count[0] - (hsize_t)1)) + block[0] - (hsize_t)1, "H5Sget_select_bounds");
+    VERIFY(count2[1], H5S_UNLIMITED, "H5Sget_select_bounds");
+    VERIFY(count2[2], start[2] + (stride[2] * (count[2] - (hsize_t)1)) + block[2] - (hsize_t)1, "H5Sget_select_bounds");
+
+    /* Close the dataspace */
+    ret = H5Sclose(sid);
+    CHECK(ret, FAIL, "H5Sclose");
+} /* end test_hyper_unlim() */
+
+/****************************************************************
+**
 **  test_select(): Main H5S selection testing routine.
 **
 ****************************************************************/
@@ -13229,6 +13822,12 @@ test_select(void)
     /* Test selection bounds with & without offsets */
     test_select_bounds();
 
+    /* Test 'regular' hyperslab query routines */
+    test_hyper_regular();
+
+    /* Test unlimited hyperslab selections */
+    test_hyper_unlim();
+
 }   /* test_select() */
 
 

diff --git a/test/tsohm.c b/test/tsohm.c
index d51a166..b3ffac7 100644
--- a/test/tsohm.c
+++ b/test/tsohm.c
@@ -27,7 +27,7 @@
  * This file needs to access private information from the H5F package.
  * This file also needs to access the file testing code.
  */
-#define H5F_PACKAGE
+#define H5F_FRIEND		/*suppress error about including H5Fpkg	  */
 #define H5F_TESTING
 #include "H5Fpkg.h"		/* File access	 			*/
 
@@ -1279,7 +1279,7 @@ static void size2_verify_plist1(hid_t plist)
     CHECK_I(ret, "H5Pget_fill_value");
 
     ret = memcmp(&fill1, &fill1_correct, sizeof(fill1_correct));
-    VERIFY(ret, 0, memcmp);
+    VERIFY(ret, 0, "memcmp");
 
     ret = H5Tclose(dtype1_id);
     CHECK_I(ret, "H5Tclose");
@@ -1350,7 +1350,7 @@ static void size2_verify_plist2(hid_t plist)
     CHECK_I(ret, "H5Pget_fill_value");
 
     ret = HDmemcmp(&fill2, &fill2_correct, (size_t)DTYPE2_SIZE);
-    VERIFY(ret, 0, memcmp);
+    VERIFY(ret, 0, "memcmp");
 
     ret = H5Tclose(dtype2_id);
     CHECK_I(ret, "H5Tclose");
@@ -2469,11 +2469,11 @@ static void test_sohm_size2(int close_reopen)
      * this happens because it's hard to predict exactly how much space this
      * will take.
      */
-     if((mult_index_med.attrs2 - mult_index_med.attrs1) !=
-            (list_index_med.attrs2 - list_index_med.attrs1))
+     if((mult_index_med.attrs2 - mult_index_med.attrs1) >
+            (list_index_med.attrs2 - list_index_med.attrs1) * OVERHEAD_ALLOWED)
         VERIFY(0, 1, "h5_get_file_size");
-     if((mult_index_btree.attrs2 - mult_index_btree.attrs1) !=
-            (btree_index.attrs2 - btree_index.attrs1))
+     if((mult_index_btree.attrs2 - mult_index_btree.attrs1) >
+            (btree_index.attrs2 - btree_index.attrs1) * OVERHEAD_ALLOWED)
         VERIFY(0, 1, "h5_get_file_size");
 
     /* The final file size for both of the multiple index files should be
@@ -3884,7 +3884,7 @@ test_sohm_external_dtype(void)
     CHECK_I(dset1_tid, "H5Dget_type");
 
     /* Allocate space and initialize data */
-    orig = (s1_t*)malloc(NX * NY * sizeof(s1_t));
+    orig = (s1_t*)HDmalloc(NX * NY * sizeof(s1_t));
     for(i=0; i<NX*NY; i++) {
         s_ptr = (s1_t*)orig + i;
         s_ptr->a = i*3 + 1;
@@ -3963,7 +3963,7 @@ test_sohm_external_dtype(void)
     ret = H5Fclose(file2);
     CHECK_I(ret, "H5Fclose");
 
-    free(orig);
+    HDfree(orig);
 }
 
 

diff --git a/test/ttst.c b/test/ttst.c
index 4ffe4cd..b869b63 100644
--- a/test/ttst.c
+++ b/test/ttst.c
@@ -95,13 +95,13 @@ test_tst_init(void)
     } /* end for */
 
     /* Allocate space for the array of unique words */
-    uniq_words=HDmalloc(sizeof(char *)*num_uniq_words);
+    uniq_words = (char **)HDmalloc(sizeof(char *)*num_uniq_words);
 
     /* Allocate space for the array of randomized order unique words also */
-    rand_uniq_words=HDmalloc(sizeof(char *)*num_uniq_words);
+    rand_uniq_words = (char **)HDmalloc(sizeof(char *)*num_uniq_words);
 
     /* Allocate space for the array of sorted order unique words also */
-    sort_uniq_words=HDmalloc(sizeof(char *)*num_uniq_words);
+    sort_uniq_words = (char **)HDmalloc(sizeof(char *)*num_uniq_words);
 
     /* Insert unique words from test set into unique word set */
     w=0;
diff --git a/test/tunicode.c b/test/tunicode.c
index 6781fe8..93c00c5 100644
--- a/test/tunicode.c
+++ b/test/tunicode.c
@@ -463,8 +463,8 @@ void test_objnames(hid_t fid, const char* string)
   CHECK(ret, FAIL, "H5Dread");
 
   /* Ensure that we can open named datatype using object reference */
-  type_id = H5Rdereference(dset_id, H5R_OBJECT, &obj_ref);
-  CHECK(type_id, FAIL, "H5Rdereference");
+  type_id = H5Rdereference2(dset_id, H5P_DEFAULT, H5R_OBJECT, &obj_ref);
+  CHECK(type_id, FAIL, "H5Rdereference2");
   ret = H5Tcommitted(type_id);
   VERIFY(ret, 1, "H5Tcommitted");
 
diff --git a/test/tvltypes.c b/test/tvltypes.c
index 2928e57..b7bbaee 100644
--- a/test/tvltypes.c
+++ b/test/tvltypes.c
@@ -798,7 +798,7 @@ test_vltypes_vlen_compound(void)
                 TestErrPrintf("VL data values don't match!, wdata[%d].p[%d].i=%d, rdata[%d].p[%d].i=%d\n",(int)i,(int)j, (int)((s1 *)wdata[i].p)[j].i, (int)i,(int)j, (int)((s1 *)rdata[i].p)[j].i);
                 continue;
             } /* end if */
-            if(!FLT_ABS_EQUAL(((s1 *)wdata[i].p)[j].f,((s1 *)rdata[i].p)[j].f)) {
+            if(!H5_FLT_ABS_EQUAL(((s1 *)wdata[i].p)[j].f,((s1 *)rdata[i].p)[j].f)) {
                 TestErrPrintf("VL data values don't match!, wdata[%d].p[%d].f=%f, rdata[%d].p[%d].f=%f\n",(int)i,(int)j, (double)((s1 *)wdata[i].p)[j].f, (int)i,(int)j, (double)((s1 *)rdata[i].p)[j].f);
                 continue;
             } /* end if */
@@ -943,7 +943,7 @@ rewrite_vltypes_vlen_compound(void)
                 TestErrPrintf("VL data values don't match!, wdata[%d].p[%d].i=%d, rdata[%d].p[%d].i=%d\n",(int)i,(int)j, (int)((s1 *)wdata[i].p)[j].i, (int)i,(int)j, (int)((s1 *)rdata[i].p)[j].i);
                 continue;
             } /* end if */
-            if(!FLT_ABS_EQUAL(((s1 *)wdata[i].p)[j].f,((s1 *)rdata[i].p)[j].f)) {
+            if(!H5_FLT_ABS_EQUAL(((s1 *)wdata[i].p)[j].f,((s1 *)rdata[i].p)[j].f)) {
                 TestErrPrintf("VL data values don't match!, wdata[%d].p[%d].f=%f, rdata[%d].p[%d].f=%f\n",(int)i,(int)j, (double)((s1 *)wdata[i].p)[j].f, (int)i,(int)j, (double)((s1 *)rdata[i].p)[j].f);
                 continue;
             } /* end if */
@@ -1021,7 +1021,7 @@ test_vltypes_compound_vlen_vlen(void)
         wdata[i].f=(float)((i*20)/3.0F);
         wdata[i].v.p=HDmalloc((i+L1_INCM)*sizeof(hvl_t));
         wdata[i].v.len=i+L1_INCM;
-        for(t1=(wdata[i].v).p,j=0; j<(i+L1_INCM); j++, t1++) {
+        for(t1=(hvl_t *)((wdata[i].v).p),j=0; j<(i+L1_INCM); j++, t1++) {
             t1->p=HDmalloc((j+L2_INCM)*sizeof(unsigned int));
             t1->len=j+L2_INCM;
             for(k=0; k<j+L2_INCM; k++)
@@ -1092,7 +1092,7 @@ test_vltypes_compound_vlen_vlen(void)
             TestErrPrintf("Integer components don't match!, wdata[%d].i=%d, rdata[%d].i=%d\n",(int)i,(int)wdata[i].i,(int)i,(int)rdata[i].i);
             continue;
         } /* end if */
-        if(!FLT_ABS_EQUAL(wdata[i].f,rdata[i].f)) {
+        if(!H5_FLT_ABS_EQUAL(wdata[i].f,rdata[i].f)) {
             TestErrPrintf("Float components don't match!, wdata[%d].f=%f, rdata[%d].f=%f\n",(int)i,(double)wdata[i].f,(int)i,(double)rdata[i].f);
             continue;
         } /* end if */
@@ -1102,7 +1102,7 @@ test_vltypes_compound_vlen_vlen(void)
             continue;
         } /* end if */
 
-        for(t1=wdata[i].v.p, t2=rdata[i].v.p, j=0; j<rdata[i].v.len; j++, t1++, t2++) {
+        for(t1=(hvl_t *)(wdata[i].v.p), t2=(hvl_t *)(rdata[i].v.p), j=0; j<rdata[i].v.len; j++, t1++, t2++) {
             if(t1->len != t2->len) {
                 TestErrPrintf("%d: VL data length don't match!, i=%d, j=%d, t1->len=%d, t2->len=%d\n",__LINE__,(int)i,(int)j,(int)t1->len,(int)t2->len);
                 continue;
@@ -1161,13 +1161,13 @@ static void
 test_vltypes_compound_vlstr(void)
 {
     typedef enum {
-	red,
-	blue,
-	green
+        red,
+        blue,
+        green
     } e1;
     typedef struct {
         char *string;
-	e1   color;
+        e1   color;
     } s2;
     typedef struct {                    /* Struct that the compound type are composed of */
         hvl_t v;
@@ -1199,12 +1199,12 @@ test_vltypes_compound_vlstr(void)
     for(i=0; i<SPACE1_DIM1; i++) {
         wdata[i].v.p=(s2*)HDmalloc((i+L3_INCM)*sizeof(s2));
         wdata[i].v.len=i+L3_INCM;
-        for(t1=(wdata[i].v).p, j=0; j<(i+L3_INCM); j++, t1++) {
-	    strcat(str, "m");
-	    t1->string = (char*)HDmalloc(strlen(str)*sizeof(char)+1);
+        for(t1=(s2 *)((wdata[i].v).p), j=0; j<(i+L3_INCM); j++, t1++) {
+            strcat(str, "m");
+            t1->string = (char*)HDmalloc(strlen(str)*sizeof(char)+1);
             strcpy(t1->string, str);
-	    /*t1->color = red;*/
-	    t1->color = blue;
+            /*t1->color = red;*/
+            t1->color = blue;
         }
     } /* end for */
 
@@ -1342,7 +1342,7 @@ test_vltypes_compound_vlstr(void)
             continue;
         } /* end if */
 
-        for(t1=wdata[i].v.p, t2=rdata[i].v.p, j=0; j<rdata[i].v.len; j++, t1++, t2++) {
+        for(t1=(s2 *)(wdata[i].v.p), t2=(s2 *)(rdata[i].v.p), j=0; j<rdata[i].v.len; j++, t1++, t2++) {
                 if( strcmp(t1->string, t2->string) ) {
                     TestErrPrintf("VL data values don't match!, t1->string=%s, t2->string=%s\n",t1->string, t2->string);
                     continue;
@@ -1400,7 +1400,7 @@ test_vltypes_compound_vlstr(void)
             continue;
         } /* end if */
 
-        for(t1=wdata2[i].v.p, t2=rdata2[i].v.p, j=0; j<rdata2[i].v.len; j++, t1++, t2++) {
+        for(t1=(s2 *)(wdata2[i].v.p), t2=(s2 *)(rdata2[i].v.p), j=0; j<rdata2[i].v.len; j++, t1++, t2++) {
                 if( strcmp(t1->string, t2->string) ) {
                     TestErrPrintf("VL data values don't match!, t1->string=%s, t2->string=%s\n",t1->string, t2->string);
                     continue;
@@ -1546,7 +1546,7 @@ test_vltypes_compound_vlen_atomic(void)
             TestErrPrintf("Integer components don't match!, wdata[%d].i=%d, rdata[%d].i=%d\n",(int)i,(int)wdata[i].i,(int)i,(int)rdata[i].i);
             continue;
         } /* end if */
-        if(!FLT_ABS_EQUAL(wdata[i].f,rdata[i].f)) {
+        if(!H5_FLT_ABS_EQUAL(wdata[i].f,rdata[i].f)) {
             TestErrPrintf("Float components don't match!, wdata[%d].f=%f, rdata[%d].f=%f\n",(int)i,(double)wdata[i].f,(int)i,(double)rdata[i].f);
             continue;
         } /* end if */
@@ -1595,8 +1595,8 @@ test_vltypes_compound_vlen_atomic(void)
 
     /* Check data read in */
     for(i = 0; i < SPACE1_DIM1; i++)
-        if(rdata[i].i != 0 || !FLT_ABS_EQUAL(rdata[i].f, 0.0F) || rdata[i].v.len != 0 || rdata[i].v.p != NULL)
-            TestErrPrintf("VL doesn't match!, rdata[%d].i=%d, rdata[%d].f=%f, rdata[%d].v.len=%u, rdata[%d].v.p=%p\n",(int)i,rdata[i].i,(int)i,rdata[i].f,(int)i,(unsigned)rdata[i].v.len,(int)i,rdata[i].v.p);
+        if(rdata[i].i != 0 || !H5_FLT_ABS_EQUAL(rdata[i].f, 0.0F) || rdata[i].v.len != 0 || rdata[i].v.p != NULL)
+            TestErrPrintf("VL doesn't match!, rdata[%d].i=%d, rdata[%d].f=%f, rdata[%d].v.len=%u, rdata[%d].v.p=%p\n",(int)i,rdata[i].i,(int)i,(double)rdata[i].f,(int)i,(unsigned)rdata[i].v.len,(int)i,rdata[i].v.p);
 
     /* Write dataset to disk */
     ret = H5Dwrite(dataset, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata);
@@ -1612,7 +1612,7 @@ test_vltypes_compound_vlen_atomic(void)
             TestErrPrintf("Integer components don't match!, wdata[%d].i=%d, rdata[%d].i=%d\n",(int)i,(int)wdata[i].i,(int)i,(int)rdata[i].i);
             continue;
         } /* end if */
-        if(!FLT_ABS_EQUAL(wdata[i].f,rdata[i].f)) {
+        if(!H5_FLT_ABS_EQUAL(wdata[i].f,rdata[i].f)) {
             TestErrPrintf("Float components don't match!, wdata[%d].f=%f, rdata[%d].f=%f\n",(int)i,(double)wdata[i].f,(int)i,(double)rdata[i].f);
             continue;
         } /* end if */
@@ -1764,7 +1764,7 @@ rewrite_vltypes_compound_vlen_atomic(void)
             TestErrPrintf("Integer components don't match!, wdata[%d].i=%d, rdata[%d].i=%d\n",(int)i,(int)wdata[i].i,(int)i,(int)rdata[i].i);
             continue;
         } /* end if */
-        if(!FLT_ABS_EQUAL(wdata[i].f,rdata[i].f)) {
+        if(!H5_FLT_ABS_EQUAL(wdata[i].f,rdata[i].f)) {
             TestErrPrintf("Float components don't match!, wdata[%d].f=%f, rdata[%d].f=%f\n",(int)i,(double)wdata[i].f,(int)i,(double)rdata[i].f);
             continue;
         } /* end if */
@@ -1871,7 +1871,7 @@ test_vltypes_vlen_vlen_atomic(void)
             return;
         } /* end if */
         wdata[i].len=i+1;
-        for(t1=wdata[i].p,j=0; j<(i+1); j++, t1++) {
+        for(t1=(hvl_t *)(wdata[i].p),j=0; j<(i+1); j++, t1++) {
             t1->p=HDmalloc((j+1)*sizeof(unsigned int));
             if(t1->p==NULL) {
                 TestErrPrintf("Cannot allocate memory for VL data! i=%u, j=%u\n",i,j);
@@ -1977,7 +1977,7 @@ test_vltypes_vlen_vlen_atomic(void)
             TestErrPrintf("%d: VL data length don't match!, wdata[%d].len=%d, rdata[%d].len=%d\n",__LINE__,(int)i,(int)wdata[i].len,(int)i,(int)rdata[i].len);
             continue;
         } /* end if */
-        for(t1=wdata[i].p, t2=rdata[i].p, j=0; j<rdata[i].len; j++, t1++, t2++) {
+        for(t1=(hvl_t *)wdata[i].p, t2=(hvl_t *)(rdata[i].p), j=0; j<rdata[i].len; j++, t1++, t2++) {
             if(t1->len!=t2->len) {
                 TestErrPrintf("%d: VL data length don't match!, i=%d, j=%d, t1->len=%d, t2->len=%d\n",__LINE__,(int)i,(int)j,(int)t1->len,(int)t2->len);
                 continue;
@@ -2062,7 +2062,7 @@ rewrite_longer_vltypes_vlen_vlen_atomic(void)
             return;
         } /* end if */
         wdata[i].len = i + increment;
-        for(t1 = wdata[i].p, j = 0; j < (i + increment); j++, t1++) {
+        for(t1 = (hvl_t *)(wdata[i].p), j = 0; j < (i + increment); j++, t1++) {
             t1->p = HDmalloc((j + 1) * sizeof(unsigned int));
             if(t1->p == NULL) {
                 TestErrPrintf("Cannot allocate memory for VL data! i=%u, j=%u\n", i, j);
@@ -2157,7 +2157,7 @@ rewrite_longer_vltypes_vlen_vlen_atomic(void)
             TestErrPrintf("%d: VL data length don't match!, wdata[%d].len=%d, rdata[%d].len=%d\n",__LINE__,(int)i,(int)wdata[i].len,(int)i,(int)rdata[i].len);
             continue;
         } /* end if */
-        for(t1=wdata[i].p, t2=rdata[i].p, j=0; j<rdata[i].len; j++, t1++, t2++) {
+        for(t1=(hvl_t *)(wdata[i].p), t2=(hvl_t *)(rdata[i].p), j=0; j<rdata[i].len; j++, t1++, t2++) {
             if(t1->len!=t2->len) {
                 TestErrPrintf("%d: VL data length don't match!, i=%d, j=%d, t1->len=%d, t2->len=%d\n",__LINE__,(int)i,(int)j,(int)t1->len,(int)t2->len);
                 continue;
@@ -2238,7 +2238,7 @@ rewrite_shorter_vltypes_vlen_vlen_atomic(void)
             return;
         } /* end if */
         wdata[i].len=i+increment;
-        for(t1=wdata[i].p,j=0; j<(i+increment); j++, t1++) {
+        for(t1=(hvl_t *)(wdata[i].p),j=0; j<(i+increment); j++, t1++) {
             t1->p=HDmalloc((j+1)*sizeof(unsigned int));
             if(t1->p==NULL) {
                 TestErrPrintf("Cannot allocate memory for VL data! i=%u, j=%u\n",i,j);
@@ -2333,7 +2333,7 @@ rewrite_shorter_vltypes_vlen_vlen_atomic(void)
             TestErrPrintf("%d: VL data length don't match!, wdata[%d].len=%d, rdata[%d].len=%d\n",__LINE__,(int)i,(int)wdata[i].len,(int)i,(int)rdata[i].len);
             continue;
         } /* end if */
-        for(t1=wdata[i].p, t2=rdata[i].p, j=0; j<rdata[i].len; j++, t1++, t2++) {
+        for(t1=(hvl_t *)(wdata[i].p), t2=(hvl_t *)(rdata[i].p), j=0; j<rdata[i].len; j++, t1++, t2++) {
             if(t1->len!=t2->len) {
                 TestErrPrintf("%d: VL data length don't match!, i=%d, j=%d, t1->len=%d, t2->len=%d\n",__LINE__,(int)i,(int)j,(int)t1->len,(int)t2->len);
                 continue;
@@ -2496,7 +2496,7 @@ test_vltypes_fill_value(void)
 
 
     /* Allocate space for the buffer to read data */
-    rbuf = HDmalloc(SPACE4_DIM_LARGE * sizeof(dtype1_struct));
+    rbuf = (dtype1_struct *)HDmalloc(SPACE4_DIM_LARGE * sizeof(dtype1_struct));
     CHECK(rbuf, NULL, "HDmalloc");
 
 
@@ -2538,7 +2538,7 @@ test_vltypes_fill_value(void)
     CHECK(file_id, FAIL, "H5Fcreate");
 
     /* Create datasets with different storage layouts */
-    for(layout = H5D_COMPACT; layout <= H5D_CHUNKED; layout++) {
+    for(layout = H5D_COMPACT; layout <= H5D_CHUNKED; H5_INC_ENUM(H5D_layout_t, layout)) {
         unsigned compress_loop;         /* # of times to run loop, for testing compressed chunked dataset */
         unsigned test_loop;             /* Loop over datasets */
 
@@ -2597,6 +2597,8 @@ test_vltypes_fill_value(void)
                     }
                     break;
 
+                case H5D_LAYOUT_ERROR:
+                case H5D_NLAYOUTS:
                 default:
                     assert(0 && "Unknown layout type!");
                     break;
@@ -2648,7 +2650,7 @@ test_vltypes_fill_value(void)
     CHECK(file_id, FAIL, "H5Fopen");
 
     /* Read empty datasets with different storage layouts */
-    for(layout = H5D_COMPACT; layout <= H5D_CHUNKED; layout++) {
+    for(layout = H5D_COMPACT; layout <= H5D_CHUNKED; H5_INC_ENUM(H5D_layout_t, layout)) {
         unsigned compress_loop;         /* # of times to run loop, for testing compressed chunked dataset */
         unsigned test_loop;             /* Loop over datasets */
 
@@ -2698,6 +2700,8 @@ test_vltypes_fill_value(void)
                     dset_elmts = SPACE4_DIM_LARGE;
                     break;
 
+                case H5D_LAYOUT_ERROR:
+                case H5D_NLAYOUTS:
                 default:
                     assert(0 && "Unknown layout type!");
                     break;
@@ -2843,7 +2847,7 @@ test_vltypes_fill_value(void)
     CHECK(file_id, FAIL, "H5Fopen");
 
     /* Write one element & fill values to  datasets with different storage layouts */
-    for(layout = H5D_COMPACT; layout <= H5D_CHUNKED; layout++) {
+    for(layout = H5D_COMPACT; layout <= H5D_CHUNKED; H5_INC_ENUM(H5D_layout_t, layout)) {
         unsigned compress_loop;         /* # of times to run loop, for testing compressed chunked dataset */
         unsigned test_loop;             /* Loop over datasets */
 
@@ -2893,6 +2897,8 @@ test_vltypes_fill_value(void)
                     dset_elmts = SPACE4_DIM_LARGE;
                     break;
 
+                case H5D_LAYOUT_ERROR:
+                case H5D_NLAYOUTS:
                 default:
                     assert(0 && "Unknown layout type!");
                     break;
diff --git a/test/twriteorder.c b/test/twriteorder.c
new file mode 100644
index 0000000..0dd768c
--- /dev/null
+++ b/test/twriteorder.c
@@ -0,0 +1,438 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/***********************************************************
+*
+* Test program: twriteorder
+*
+* Test to verify that the write order is strictly consistent.
+* The SWMR feature requires that the order of write is strictly consistent.
+* "Strict consistency in computer science is the most stringent consistency
+* model.  It says that a read operation has to return the result of the
+* latest write operation which occurred on that data item."--
+* (http://en.wikipedia.org/wiki/Linearizability#Definition_of_linearizability).
+* This is also an alternative form of what POSIX write require that after a
+* write operation has returned success, all reads issued afterward should
+* get the same data the write has written.
+*
+* Created: Albert Cheng, 2013/8/28.
+* Modified:
+*************************************************************/
+
+/***********************************************************
+*
+* Algorithm
+*
+* The test simulates what SWMR does by writing chained blocks and see if
+* they can be read back correctly.
+* There is a writer process and multiple read processes.
+* The file is divided into 2KB partitions. Then writer writes 1 chained
+* block, each of 1KB big, in each partition after the first partition.
+* Each chained block has this structure:
+* Byte 0-3: offset address of its child block. The last child uses 0 as NULL.
+* Byte 4-1023: some artificial data.
+* The child block address of Block 1 is NULL (0).
+* The child block address of Block 2 is the offset address of Block 1.
+* The child block address of Block n is the offset address of Block n-1.
+* After all n blocks are written, the offset address of Block n is written
+* to the offset 0 of the first partition.
+* Therefore, by the time the offset address of Block n is written to this
+* position, all n chain-linked blocks have been written.
+*
+* The other reader processes will try to read the address value at the
+* offset 0. The value is initially NULL(0). When it changes to non-zero,
+* it signifies the writer process has written all the chain-link blocks
+* and they are ready for the reader processes to access.
+*
+* If the system, in which the writer and reader processes run, the readers
+* will always get all chain-linked blocks correctly. If the order of write
+* is not maintained, some reader processes may found unexpect block data.
+*
+*************************************************************/
+
+#include "h5test.h"
+
+#define DATAFILE   "twriteorder.dat"
+/* #define READERS_MAX	10 */	/* max number of readers */
+#define BLOCKSIZE_DFT   1024	/* 1KB */
+#define PARTITION_DFT	2048	/* 2KB */
+#define NLINKEDBLOCKS_DFT 512	/* default 512 */
+#define SIZE_BLKADDR	4	/* expected sizeof blkaddr */
+#define Hgoto_error(val)	{ret_value=val; goto done;}
+
+/* type declarations */
+typedef enum part_t {
+    UC_READWRITE	=0,	/* both writer and reader */
+    UC_WRITER,			/* writer only */
+    UC_READER			/* reader only */
+} part_t;
+
+/* prototypes */
+int create_wo_file(void);
+int write_wo_file(void);
+int read_wo_file(void);
+void usage(const char *prog);
+int setup_parameters(int argc, char * const argv[]);
+int parse_option(int argc, char * const argv[]);
+
+/* Global Variable definitions */
+const char *progname_g="twriteorder";	/* program name */
+int	write_fd_g;
+int	blocksize_g, part_size_g, nlinkedblock_g;
+part_t  launch_g;
+
+/* Function definitions */
+
+/* Show help page */
+void
+usage(const char *prog)
+{
+    fprintf(stderr, "usage: %s [OPTIONS]\n", prog);
+    fprintf(stderr, "  OPTIONS\n");
+    fprintf(stderr, "     -h            Print a usage message and exit\n");
+    fprintf(stderr, "     -l w|r        launch writer or reader only. [default: launch both]\n");
+    fprintf(stderr, "     -b N          Block size [default: %d]\n", BLOCKSIZE_DFT);
+    fprintf(stderr, "     -p N          Partition size [default: %d]\n", PARTITION_DFT);
+    fprintf(stderr, "     -n N          Number of linked blocks [default: %d]\n", NLINKEDBLOCKS_DFT);
+    fprintf(stderr, "     where N is an integer value\n");
+    fprintf(stderr, "\n");
+}
+
+/* Setup test parameters by parsing command line options.
+ * Setup default values if not set by options. */
+int
+parse_option(int argc, char * const argv[])
+{
+    int ret_value=0;
+    int c;
+    /* command line options: See function usage for a description */
+    const char *cmd_options = "hb:l:n:p:";
+
+    /* suppress getopt from printing error */
+    opterr = 0;
+
+    while (1){
+	c = getopt (argc, argv, cmd_options);
+	if (-1 == c)
+	    break;
+	switch (c) {
+	  case 'h':
+	    usage(progname_g);
+	    exit(0);
+	    break;
+	  case 'b':	/* number of planes to write/read */
+	    if ((blocksize_g = atoi(optarg)) <= 0){
+		fprintf(stderr, "bad blocksize %s, must be a positive integer\n", optarg);
+		usage(progname_g);
+		Hgoto_error(-1);
+	    };
+	    break;
+	  case 'n':	/* number of planes to write/read */
+	    if ((nlinkedblock_g = atoi(optarg)) < 2){
+		fprintf(stderr, "bad number of linked blocks %s, must be greater than 1.\n", optarg);
+		usage(progname_g);
+		Hgoto_error(-1);
+	    };
+	    break;
+	  case 'p':	/* number of planes to write/read */
+	    if ((part_size_g = atoi(optarg)) <= 0){
+		fprintf(stderr, "bad partition size %s, must be a positive integer\n", optarg);
+		usage(progname_g);
+		Hgoto_error(-1);
+	    };
+	    break;
+	  case 'l':	/* launch reader or writer only */
+	    switch (*optarg) {
+	      case 'r':	/* reader only */
+		launch_g = UC_READER;
+		break;
+	      case 'w': /* writer only */
+		launch_g = UC_WRITER;
+		break;
+	      default:
+		fprintf(stderr, "launch value(%c) should be w or r only.\n", *optarg);
+		usage(progname_g);
+		Hgoto_error(-1);
+		break;
+	    }
+	    printf("launch = %d\n", launch_g);
+	    break;
+	  case '?':
+	    fprintf(stderr, "getopt returned '%c'.\n", c);
+	    usage(progname_g);
+	    Hgoto_error(-1);
+	  default:
+	    fprintf(stderr, "getopt returned unexpected value.\n");
+	    fprintf(stderr, "Unexpected value is %d\n", c);
+	    Hgoto_error(-1);
+	}
+    }
+
+    /* verify partition size must be >= blocksize */
+    if (part_size_g < blocksize_g ){
+	fprintf(stderr, "Blocksize %d should not be bigger than partition size %d\n",
+	    blocksize_g, part_size_g);
+	Hgoto_error(-1);                                                                  
+    }
+
+done:
+    /* All done. */
+    return(ret_value);
+}
+
+/* Setup parameters for the test case.
+ * Return: 0 succeed; -1 fail.
+ */
+int setup_parameters(int argc, char * const argv[])
+{
+    /* test case defaults */
+    blocksize_g = BLOCKSIZE_DFT;
+    part_size_g = PARTITION_DFT;
+    nlinkedblock_g = NLINKEDBLOCKS_DFT;
+    launch_g = UC_READWRITE;
+
+    /* parse options */
+    if (parse_option(argc, argv) < 0){
+	return(-1);
+    }
+
+    /* show parameters and return */
+    printf("blocksize = %ld\n", (long)blocksize_g);
+    printf("part_size = %ld\n", (long)part_size_g);
+    printf("nlinkedblock = %ld\n", (long)nlinkedblock_g);
+    printf("launch = %d\n", launch_g);
+    return(0);
+}
+
+/* Create the test file with initial "empty" file, that is,
+ * partition 0 has a null (0) address.
+ *
+ * Return: 0 succeed; -1 fail.
+ */
+int create_wo_file(void)
+{
+    int    blkaddr=0;	/* blkaddress of next linked block */
+    int	   ret_code;
+
+    /* Create the data file */
+    if ((write_fd_g = HDopen(DATAFILE, O_RDWR|O_TRUNC|O_CREAT, 0664)) < 0) {
+	printf("WRITER: error from open\n");
+	return -1;
+    }
+    blkaddr=0;
+    /* write it to partition 0 */
+    if ((ret_code=HDwrite(write_fd_g, &blkaddr, (size_t)SIZE_BLKADDR)) != SIZE_BLKADDR){
+	printf("blkaddr write failed\n");
+	return -1;
+    }
+
+    /* File initialized, return success */
+    return 0;
+}
+
+int write_wo_file(void)
+{
+    int blkaddr;
+    int blkaddr_old=0;
+    int i;
+    char buffer[BLOCKSIZE_DFT];
+    int  ret_code;
+    
+
+    /* write block 1, 2, ... */
+    for (i=1; i<nlinkedblock_g; i++){
+	/* calculate where to write this block */
+	blkaddr = i*part_size_g + i;
+	/* store old block address in byte 0-3 */
+	HDmemcpy(&buffer[0], &blkaddr_old, sizeof(blkaddr_old));
+	/* fill the rest with the lowest byte of i */
+	HDmemset(&buffer[4], i & 0xff, (size_t) (BLOCKSIZE_DFT-4));
+	/* write the block */
+#ifdef DEBUG
+	printf("writing block at %d\n", blkaddr);
+#endif
+	HDlseek(write_fd_g, (HDoff_t)blkaddr, SEEK_SET);
+	if ((ret_code=HDwrite(write_fd_g, buffer, (size_t)blocksize_g)) != blocksize_g){
+	    printf("blkaddr write failed in partition %d\n", i);
+	    return -1;
+	}
+	blkaddr_old = blkaddr;
+    }
+    /* write the last blkaddr in partition 0 */
+    HDlseek(write_fd_g, (HDoff_t)0, SEEK_SET);
+    if ((ret_code=HDwrite(write_fd_g, &blkaddr_old, (size_t)sizeof(blkaddr_old))) != sizeof(blkaddr_old)){
+	printf("blkaddr write failed in partition %d\n", 0);
+	return -1;
+    }
+
+    /* all writes done. return succeess. */
+    printf("wrote %d blocks\n", nlinkedblock_g);
+    return 0;
+}
+
+int read_wo_file(void)
+{
+    int read_fd;
+    int blkaddr=0;
+    int ret_code;
+    int linkedblocks_read=0;
+    char buffer[BLOCKSIZE_DFT];
+
+    /* Open the data file */
+    if ((read_fd = HDopen(DATAFILE, O_RDONLY, 0)) < 0) {
+	printf("READER: error from open\n");
+	return -1;
+    }
+    /* keep reading the initial block address until it is non-zero before proceeding. */
+    while (blkaddr == 0){
+	HDlseek(read_fd, (HDoff_t)0, SEEK_SET);
+	if ((ret_code=HDread(read_fd, &blkaddr, (size_t)sizeof(blkaddr))) != sizeof(blkaddr)){
+	    printf("blkaddr read failed in partition %d\n", 0);
+	    return -1;
+	}
+    }
+    linkedblocks_read++;
+
+    /* got a non-zero blkaddr. Proceed down the linked blocks. */
+#ifdef DEBUG
+    printf("got initial block address=%d\n", blkaddr);
+#endif
+    while (blkaddr != 0){
+	HDlseek(read_fd, (HDoff_t)blkaddr, SEEK_SET);
+	if ((ret_code=HDread(read_fd, buffer, (size_t)blocksize_g)) != blocksize_g){
+	    printf("blkaddr read failed in partition %d\n", 0);
+	    return -1;
+	}
+	linkedblocks_read++;
+	/* retrieve the block address in byte 0-3 */
+	HDmemcpy(&blkaddr, &buffer[0], sizeof(blkaddr));
+#ifdef DEBUG
+	printf("got next block address=%d\n", blkaddr);
+#endif
+    }
+
+    printf("read %d blocks\n", linkedblocks_read);
+    return 0;
+}
+
+
+/* Overall Algorithm: 
+ * Parse options from user;
+ * Generate/pre-created the test file needed and close it;
+ * fork: child processes become the reader processes;
+ *       while parent process continues as the writer process;
+ * both run till ending conditions are met.
+ */
+int
+main(int argc, char *argv[])
+{
+    /*pid_t childpid[READERS_MAX];
+    int child_ret_value[READERS_MAX];*/
+    pid_t childpid=0;
+    int child_ret_value;
+    pid_t mypid, tmppid;
+    int	child_status;
+    int child_wait_option=0;
+    int ret_value = 0;
+
+    /* initialization */
+    if (setup_parameters(argc, argv) < 0){
+	Hgoto_error(1);
+    }
+
+    /* ==============================================================*/
+    /* UC_READWRITE: create datafile, launch both reader and writer. */
+    /* UC_WRITER:    create datafile, skip reader, launch writer.    */
+    /* UC_READER:    skip create, launch reader, exit.               */
+    /* ==============================================================*/
+    /* ============*/
+    /* Create file */
+    /* ============*/
+    if (launch_g != UC_READER){
+	printf("Creating skeleton data file for test...\n");
+	if (create_wo_file() < 0){
+	    fprintf(stderr, "***encounter error\n");
+	    Hgoto_error(1);
+	}else
+	    printf("File created.\n");
+    }
+    /* flush output before possible fork */
+    HDfflush(stdout);
+
+    if (launch_g==UC_READWRITE){
+	/* fork process */
+	if((childpid = fork()) < 0) {
+	    perror("fork");
+	    Hgoto_error(1);
+	};
+    };
+    mypid = getpid();
+
+    /* ============= */
+    /* launch reader */
+    /* ============= */
+    if (launch_g != UC_WRITER){
+	/* child process launch the reader */
+	if(0 == childpid) {
+	    printf("%d: launch reader process\n", mypid);
+	    if (read_wo_file() < 0){
+		fprintf(stderr, "read_wo_file encountered error\n");
+		exit(1);
+	    }
+	    /* Reader is done. Clean up by removing the data file */
+	    HDremove(DATAFILE);
+	    exit(0);
+	}
+    }
+
+    /* ============= */
+    /* launch writer */
+    /* ============= */
+    /* this process continues to launch the writer */
+    printf("%d: continue as the writer process\n", mypid);
+    if (write_wo_file() < 0){
+	fprintf(stderr, "write_wo_file encountered error\n");
+	Hgoto_error(1);
+    }
+
+    /* ================================================ */
+    /* If readwrite, collect exit code of child process */
+    /* ================================================ */
+    if (launch_g == UC_READWRITE){
+	if ((tmppid = waitpid(childpid, &child_status, child_wait_option)) < 0){
+	    perror("waitpid");
+	    Hgoto_error(1);
+	}
+	if (WIFEXITED(child_status)){
+	    if ((child_ret_value=WEXITSTATUS(child_status)) != 0){
+		printf("%d: child process exited with non-zero code (%d)\n",
+		    mypid, child_ret_value);
+		Hgoto_error(2);
+	    }
+	} else {
+	    printf("%d: child process terminated abnormally\n", mypid);
+	    Hgoto_error(2);
+	}
+    }
+    
+done:
+    /* Print result and exit */
+    if (ret_value != 0){
+	printf("Error(s) encountered\n");
+    }else{
+	printf("All passed\n");
+    }
+
+    return(ret_value);
+}
diff --git a/test/unlink.c b/test/unlink.c
index 993a7ec..7169365 100644
--- a/test/unlink.c
+++ b/test/unlink.c
@@ -20,7 +20,7 @@
  * Purpose:	Test unlinking operations.
  */
 
-#define H5G_PACKAGE		/*suppress error about including H5Gpkg	  */
+#define H5G_FRIEND		/*suppress error about including H5Gpkg	  */
 
 /* Define this macro to indicate that the testing APIs should be available */
 #define H5G_TESTING
@@ -2443,7 +2443,7 @@ main(void)
     hid_t	fapl, fapl2, file;
     int	nerrors = 0;
     char	filename[1024];
-    hbool_t new_format;
+    unsigned new_format;
 
     /* Metadata cache parameters */
     int mdc_nelmts;
diff --git a/test/use.h b/test/use.h
new file mode 100644
index 0000000..45b4a49
--- /dev/null
+++ b/test/use.h
@@ -0,0 +1,69 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Use Case Header file: common definitions for use cases tests.
+ */
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "h5test.h"
+
+/* Macro definitions */
+#define Hgoto_error(val)	{ret_value=val; goto done;}
+#define Hgoto_done		{goto done;}
+#define Chunksize_DFT		256	/* chunksize default */
+#define ErrorReportMax		10	/* max number of errors reported */
+/* these two definitions must match each other */
+#define UC_DATATYPE		H5T_NATIVE_SHORT    /* use case HDF5 data type */
+#define UC_CTYPE		short		    /* use case C data type */
+#define UC_RANK			3		    /* use case dataset rank */
+
+/* Name of message file that is sent by the writer */
+#define WRITER_MESSAGE          "USE_WRITER_MESSAGE"
+
+/* type declarations */
+typedef enum part_t {
+    UC_READWRITE	=0,	/* both writer and reader */
+    UC_WRITER,			/* writer only */
+    UC_READER			/* reader only */
+} part_t;
+typedef struct options_t {
+    int chunksize;		/* chunks are chunksize^2 planes	*/
+    int chunkplanes;		/* number of planes per chunk, default 1 */
+    hsize_t chunkdims[UC_RANK]; /* chunk dims is (chunkplan, chunksize, chunksize) */
+    hsize_t dims[UC_RANK];      /* dataset initial dims */
+    hsize_t max_dims[UC_RANK];  /* dataset max dims */
+    hsize_t nplanes;		/* number of planes to write, default proportional to chunksize */
+    char *filename;		/* use case data filename		*/
+    part_t launch;		/* launch writer, reader or both	*/
+    int use_swmr;               /* use swmr open (1) or not 		*/
+    int iterations;		/* iterations, default 1		*/
+} options_t;
+
+/* global variables declarations */
+extern options_t UC_opts;	/* Use Case Options */
+extern const char *progname_g;	/* Program name */
+
+/* prototype declarations */
+int parse_option(int argc, char * const argv[]);
+int setup_parameters(int argc, char * const argv[]);
+void show_parameters(void);
+void usage(const char *prog);
+int create_uc_file(void);
+int write_uc_file(hbool_t tosend);
+int read_uc_file(hbool_t towait);
diff --git a/test/use_append_chunk.c b/test/use_append_chunk.c
new file mode 100644
index 0000000..a3219c2
--- /dev/null
+++ b/test/use_append_chunk.c
@@ -0,0 +1,214 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Use Case 1.7	Appending a single chunk
+ * Description:
+ *     Appending a single chunk of raw data to a dataset along an unlimited
+ *     dimension within a pre-created file and reading the new data back.
+ * Goal:
+ *     Read data appended by the Writer to a pre-existing dataset in a
+ *     file. The dataset has one or more unlimited dimensions. The data is
+ *     appended by a hyperslab that is contained in one chunk (for example,
+ *     appending 2-dim planes along the slowest changing dimension in the
+ *     3-dim dataset).
+ * Level:
+ *     User Level
+ * Guarantees:
+ *     o	Readers will see the modified dimension sizes after the Writer
+ * 	finishes HDF5 metadata updates and issues H5Fflush or H5Oflush calls.
+ *     o	Readers will see newly appended data after the Writer finishes
+ * 	the flush operation.
+ * 
+ * Preconditions:
+ *     o	Readers are not allowed to modify the file.  o	 All datasets
+ * 	that are modified by the Writer exist when the Writer opens the file.
+ *     o	All datasets that are modified by the Writer exist when a Reader
+ * 	opens the file.  o	 Data is written by a hyperslab contained in
+ * 	one chunk.
+ * 
+ * Main Success Scenario:
+ *     1.	An application creates a file with required objects (groups,
+ * 	datasets, and attributes).
+ *     2.	The Writer application opens the file and datasets in the file
+ * 	and starts adding data along the unlimited dimension using a hyperslab
+ * 	selection that corresponds to an HDF5 chunk.
+ *     3.	A Reader opens the file and a dataset in a file, and queries
+ * 	the sizes of the dataset; if the extent of the dataset has changed,
+ * 	reads the appended data back.
+ * 
+ * Discussion points:
+ *     1.	Since the new data is written to the file, and metadata update
+ * 	operation of adding pointer to the newly written chunk is atomic and
+ * 	happens after the chunk is on the disk, only two things may happen
+ * 	to the Reader:
+ * 	    o	The Reader will not see new data.
+ * 	    o	The Reader will see all new data written by Writer.
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Created: Albert Cheng, 2013/5/28.
+ * Modified:
+ */
+
+#include "use.h"
+
+/* Global Variable definitions */
+options_t UC_opts;	/* Use Case Options */
+const char *progname_g="use_append_chunk";	/* program name */
+
+/* Setup parameters for the use case.
+ * Return: 0 succeed; -1 fail.
+ */
+int setup_parameters(int argc, char * const argv[])
+{
+    /* use case defaults */
+    HDmemset(&UC_opts, 0, sizeof(options_t));
+    UC_opts.chunksize = Chunksize_DFT;
+    UC_opts.use_swmr = 1;	/* use swmr open */
+    UC_opts.iterations = 1;
+    UC_opts.chunkplanes = 1;
+
+    /* parse options */
+    if (parse_option(argc, argv) < 0){
+	return(-1);
+    }
+    /* set chunk dims */
+    UC_opts.chunkdims[0] = UC_opts.chunkplanes;
+    UC_opts.chunkdims[1]=UC_opts.chunkdims[2]=UC_opts.chunksize;
+
+    /* set dataset initial and max dims */
+    UC_opts.dims[0] = 0;
+    UC_opts.max_dims[0] = H5S_UNLIMITED;
+    UC_opts.dims[1] = UC_opts.dims[2] = UC_opts.max_dims[1]=UC_opts.max_dims[2]=UC_opts.chunksize;
+
+    /* set nplanes */
+    if (UC_opts.nplanes == 0)
+        UC_opts.nplanes = UC_opts.chunksize;
+
+    /* show parameters and return */
+    show_parameters();
+    return(0);
+}
+
+
+/* Overall Algorithm: 
+ * Parse options from user;
+ * Generate/pre-created test files needed and close it;
+ * fork: child process becomes the reader process;
+ *       while parent process continues as the writer process;
+ * both run till ending conditions are met.
+ */
+int
+main(int argc, char *argv[])
+{
+    pid_t childpid=0;
+    pid_t mypid, tmppid;
+    int	child_status;
+    int child_wait_option=0;
+    int ret_value = 0;
+    int child_ret_value;
+    hbool_t send_wait = 0;
+
+    /* initialization */
+    if (setup_parameters(argc, argv) < 0){
+	Hgoto_error(1);
+    }
+
+    /* Determine the need to send/wait message file*/
+    if(UC_opts.launch == UC_READWRITE) {
+        HDunlink(WRITER_MESSAGE);
+        send_wait = 1;
+    }
+
+    /* ==============================================================*/
+    /* UC_READWRITE: create datafile, launch both reader and writer. */
+    /* UC_WRITER:    create datafile, skip reader, launch writer.    */
+    /* UC_READER:    skip create, launch reader, exit.               */
+    /* ==============================================================*/
+    /* ============*/
+    /* Create file */
+    /* ============*/
+    if (UC_opts.launch != UC_READER){
+	printf("Creating skeleton data file for test...\n");
+	if (create_uc_file() < 0){
+	    fprintf(stderr, "***encounter error\n");
+	    Hgoto_error(1);
+	}else
+	    printf("File created.\n");
+    }
+
+    if (UC_opts.launch==UC_READWRITE){
+	/* fork process */
+	if((childpid = fork()) < 0) {
+	    perror("fork");
+	    Hgoto_error(1);
+	};
+    };
+    mypid = getpid();
+
+    /* ============= */
+    /* launch reader */
+    /* ============= */
+    if (UC_opts.launch != UC_WRITER){
+	/* child process launch the reader */
+	if(0 == childpid) {
+	    printf("%d: launch reader process\n", mypid);
+	    if (read_uc_file(send_wait) < 0){
+		fprintf(stderr, "read_uc_file encountered error\n");
+		exit(1);
+	    }
+	    exit(0);
+	}
+    }
+
+    /* ============= */
+    /* launch writer */
+    /* ============= */
+    /* this process continues to launch the writer */
+    printf("%d: continue as the writer process\n", mypid);
+    if (write_uc_file(send_wait) < 0){
+	fprintf(stderr, "write_uc_file encountered error\n");
+	Hgoto_error(1);
+    }
+
+    /* ================================================ */
+    /* If readwrite, collect exit code of child process */
+    /* ================================================ */
+    if (UC_opts.launch == UC_READWRITE){
+	if ((tmppid = waitpid(childpid, &child_status, child_wait_option)) < 0){
+	    perror("waitpid");
+	    Hgoto_error(1);
+	}
+	if (WIFEXITED(child_status)){
+	    if ((child_ret_value=WEXITSTATUS(child_status)) != 0){
+		printf("%d: child process exited with non-zero code (%d)\n",
+		    mypid, child_ret_value);
+		Hgoto_error(2);
+	    }
+	} else {
+	    printf("%d: child process terminated abnormally\n", mypid);
+	    Hgoto_error(2);
+	}
+    }
+    
+done:
+    /* Print result and exit */
+    if (ret_value != 0){
+	printf("Error(s) encountered\n");
+    }else{
+	printf("All passed\n");
+    }
+
+    return(ret_value);
+}
diff --git a/test/use_append_mchunks.c b/test/use_append_mchunks.c
new file mode 100644
index 0000000..b19fe57
--- /dev/null
+++ b/test/use_append_mchunks.c
@@ -0,0 +1,207 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Use Case 1.8 Appending a hyperslab of multiple chunks.
+ * Description:
+ *     Appending a hyperslab that spans several chunks of a dataset with
+ *     unlimited dimensions within a pre-created file and reading the new
+ *     data back.
+ * Goal:
+ *     Read data appended by the Writer to a pre-existing dataset in a
+ *     file. The dataset has one or more unlimited dimensions. The data
+ *     is appended by a hyperslab that is contained in several chunks (for
+ *     example, appending 2-dim planes along the slowest changing dimension
+ *     in the 3-dim dataset and each plane is covered by 4 chunks).
+ * Level:
+ *     User Level
+ * Guarantees:
+ *   o Readers will see the modified dimension sizes after the Writer
+ *     finishes HDF5 metadata updates and issues H5Fflush or H5Oflush calls.
+ *   o Readers will see newly appended data after the Writer finishes
+ *     the flush operation.
+ * 
+ * Preconditions:
+ *   o Readers are not allowed to modify the file.
+ *   o All datasets that are modified by the Writer exist when the
+ *     Writer opens the file.
+ *   o All datasets that are modified by the Writer exist when a Reader
+ *     opens the file.
+ * 
+ * Main Success Scenario:
+ *  1. An application creates a file with required objects (groups,
+ *     datasets, and attributes).
+ *  2. The Writer opens the file and datasets in the file and starts
+ *     adding data using H5Dwrite call with a hyperslab selection that
+ *     spans several chunks.
+ *  3. A Reader opens the file and a dataset in a file; if the size of
+ *     the unlimited dimension has changed, reads the appended data back.
+ * 
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/* Created: Albert Cheng, 2013/6/1.
+ * Modified:
+ */
+
+#include "use.h"
+
+/* Global Variable definitions */
+options_t UC_opts;	/* Use Case Options */
+const char *progname_g="use_append_mchunks";	/* program name */
+
+/* Setup parameters for the use case.
+ * Return: 0 succeed; -1 fail.
+ */
+int setup_parameters(int argc, char * const argv[])
+{
+    /* use case defaults */
+    HDmemset(&UC_opts, 0, sizeof(options_t));
+    UC_opts.chunksize = Chunksize_DFT;
+    UC_opts.use_swmr = 1;	/* use swmr open */
+    UC_opts.iterations = 1;
+    UC_opts.chunkplanes = 1;
+
+    /* parse options */
+    if (parse_option(argc, argv) < 0){
+	return(-1);
+    }
+    /* set chunk dims */
+    UC_opts.chunkdims[0] = UC_opts.chunkplanes;
+    UC_opts.chunkdims[1]=UC_opts.chunkdims[2]=UC_opts.chunksize;
+
+    /* set dataset initial and max dims */
+    UC_opts.dims[0] = 0;
+    UC_opts.max_dims[0] = H5S_UNLIMITED;
+    UC_opts.dims[1] = UC_opts.dims[2] = UC_opts.max_dims[1]=UC_opts.max_dims[2]=2*UC_opts.chunksize;
+
+    /* set nplanes */
+    if (UC_opts.nplanes == 0)
+        UC_opts.nplanes = 2*UC_opts.chunksize;
+
+    /* show parameters and return */
+    show_parameters();
+    return(0);
+}
+
+
+/* Overall Algorithm: 
+ * Parse options from user;
+ * Generate/pre-created test files needed and close it;
+ * fork: child process becomes the reader process;
+ *       while parent process continues as the writer process;
+ * both run till ending conditions are met.
+ */
+int
+main(int argc, char *argv[])
+{
+    pid_t childpid=0;
+    pid_t mypid, tmppid;
+    int	child_status;
+    int child_wait_option=0;
+    int ret_value = 0;
+    int child_ret_value;
+    hbool_t send_wait = 0;
+
+    /* initialization */
+    if (setup_parameters(argc, argv) < 0){
+	Hgoto_error(1);
+    }
+
+    /* Determine the need to send/wait message file*/
+    if(UC_opts.launch == UC_READWRITE) {
+        HDunlink(WRITER_MESSAGE);
+        send_wait = 1;
+    }
+
+    /* ==============================================================*/
+    /* UC_READWRITE: create datafile, launch both reader and writer. */
+    /* UC_WRITER:    create datafile, skip reader, launch writer.    */
+    /* UC_READER:    skip create, launch reader, exit.               */
+    /* ==============================================================*/
+    /* ============*/
+    /* Create file */
+    /* ============*/
+    if (UC_opts.launch != UC_READER){
+	printf("Creating skeleton data file for test...\n");
+	if (create_uc_file() < 0){
+	    fprintf(stderr, "***encounter error\n");
+	    Hgoto_error(1);
+	}else
+	    printf("File created.\n");
+    }
+
+    if (UC_opts.launch==UC_READWRITE){
+	/* fork process */
+	if((childpid = fork()) < 0) {
+	    perror("fork");
+	    Hgoto_error(1);
+	};
+    };
+    mypid = getpid();
+
+    /* ============= */
+    /* launch reader */
+    /* ============= */
+    if (UC_opts.launch != UC_WRITER){
+	/* child process launch the reader */
+	if(0 == childpid) {
+	    printf("%d: launch reader process\n", mypid);
+	    if (read_uc_file(send_wait) < 0){
+		fprintf(stderr, "read_uc_file encountered error\n");
+		exit(1);
+	    }
+	    exit(0);
+	}
+    }
+
+    /* ============= */
+    /* launch writer */
+    /* ============= */
+    /* this process continues to launch the writer */
+    printf("%d: continue as the writer process\n", mypid);
+    if (write_uc_file(send_wait) < 0){
+	fprintf(stderr, "write_uc_file encountered error\n");
+	Hgoto_error(1);
+    }
+
+    /* ================================================ */
+    /* If readwrite, collect exit code of child process */
+    /* ================================================ */
+    if (UC_opts.launch == UC_READWRITE){
+	if ((tmppid = waitpid(childpid, &child_status, child_wait_option)) < 0){
+	    perror("waitpid");
+	    Hgoto_error(1);
+	}
+	if (WIFEXITED(child_status)){
+	    if ((child_ret_value=WEXITSTATUS(child_status)) != 0){
+		printf("%d: child process exited with non-zero code (%d)\n",
+		    mypid, child_ret_value);
+		Hgoto_error(2);
+	    }
+	} else {
+	    printf("%d: child process terminated abnormally\n", mypid);
+	    Hgoto_error(2);
+	}
+    }
+    
+done:
+    /* Print result and exit */
+    if (ret_value != 0){
+	printf("Error(s) encountered\n");
+    }else{
+	printf("All passed\n");
+    }
+
+    return(ret_value);
+}
diff --git a/test/use_common.c b/test/use_common.c
new file mode 100644
index 0000000..905a8e9
--- /dev/null
+++ b/test/use_common.c
@@ -0,0 +1,631 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "use.h"
+
+#define H5D_FRIEND		/*suppress error about including H5Dpkg	  */
+#define H5D_TESTING
+#include "H5Dpkg.h"
+
+void
+usage(const char *prog)
+{
+    fprintf(stderr, "usage: %s [OPTIONS]\n", prog);
+    fprintf(stderr, "  OPTIONS\n");
+    fprintf(stderr, "     -h, --help            Print a usage message and exit\n");
+    fprintf(stderr, "     -f FN                 Test file name [default: %s.h5]\n", prog);
+    fprintf(stderr, "     -i N, --iteration=N   Number of iterations to repeat the whole thing. [default: 1]\n");
+    fprintf(stderr, "     -l w|r                launch writer or reader only. [default: launch both]\n");
+    fprintf(stderr, "     -n N, --nplanes=N     Number of planes to write/read. [default: 1000]\n");
+    fprintf(stderr, "     -s N, --swmr=N        Use SWMR mode (0: no, non-0: yes) default is yes\n");
+    fprintf(stderr, "     -z N, --chunksize=N   Chunk size [default: %d]\n", Chunksize_DFT);
+    fprintf(stderr, "     -y N, --chunkplanes=N Number of planes per chunk [default: 1]\n");
+    fprintf(stderr, "\n");
+}
+
+/* Setup Use Case parameters by parsing command line options.
+* Setup default values if not set by options. */
+int
+parse_option(int argc, char * const argv[])
+{
+    int ret_value=0;
+    int c;
+    /* command line options: See function usage for a description */
+    const char *nagg_options = "f:hi:l:n:s:y:z:";
+
+    /* suppress getopt from printing error */
+    opterr = 0;
+
+    while (1){
+	c = getopt (argc, argv, nagg_options);
+	if (-1 == c)
+	    break;
+	switch (c) {
+	  case 'h':
+	    usage(progname_g);
+	    exit(0);
+	    break;
+	  case 'f':	/* usecase data file name */
+	    UC_opts.filename = optarg;
+	    break;
+	  case 'i':	/* iterations */
+	    if ((UC_opts.iterations = atoi(optarg)) <= 0){
+		fprintf(stderr, "bad iterations number %s, must be a positive integer\n", optarg);
+		usage(progname_g);
+		Hgoto_error(-1);
+	    };
+	    break;
+	  case 'l':	/* launch reader or writer only */
+	    switch (*optarg) {
+	      case 'r':	/* reader only */
+		UC_opts.launch = UC_READER;
+		break;
+	      case 'w': /* writer only */
+		UC_opts.launch = UC_WRITER;
+		break;
+	      default:
+		fprintf(stderr, "launch value(%c) should be w or r only.\n", *optarg);
+		usage(progname_g);
+		Hgoto_error(-1);
+		break;
+	    }
+	    break;
+	  case 'n':	/* number of planes to write/read */
+	    if ((UC_opts.nplanes = atoi(optarg)) <= 0){
+		fprintf(stderr, "bad number of planes %s, must be a positive integer\n", optarg);
+		usage(progname_g);
+		Hgoto_error(-1);
+	    };
+	    break;
+	  case 's':	/* use swmr file open mode */
+	    if ((UC_opts.use_swmr = atoi(optarg)) < 0){
+		fprintf(stderr, "swmr value should be 0(no) or 1(yes)\n");
+		usage(progname_g);
+		Hgoto_error(-1);
+	    };
+	    break;
+	  case 'y':	/* Number of planes per chunk */
+	    if ((UC_opts.chunkplanes = atoi(optarg)) <= 0){
+		fprintf(stderr, "bad number of planes per chunk %s, must be a positive integer\n", optarg);
+		usage(progname_g);
+		Hgoto_error(-1);
+	    };
+	    break;
+	  case 'z':	/* size of chunk=(z,z) */
+	    if ((UC_opts.chunksize = atoi(optarg)) <= 0){
+		fprintf(stderr, "bad chunksize %s, must be a positive integer\n", optarg);
+		usage(progname_g);
+		Hgoto_error(-1);
+	    };
+	    break;
+	  case '?':
+	    fprintf(stderr, "getopt returned '%c'.\n", c);
+	    Hgoto_error(-1);
+	  default:
+	    fprintf(stderr, "getopt returned unexpected value.\n");
+	    fprintf(stderr, "Unexpected value is %d\n", c);
+	    Hgoto_error(-1);
+	}
+    }
+
+    /* set test file name if not given */
+    if (!UC_opts.filename){
+	/* default data file name is <progname>.h5 */
+	if ((UC_opts.filename=(char*)HDmalloc(HDstrlen(progname_g)+4))==NULL) {
+	    fprintf(stderr, "malloc: failed\n");
+	    Hgoto_error(-1);
+	};
+	HDstrcpy(UC_opts.filename, progname_g);
+	HDstrcat(UC_opts.filename, ".h5");
+    }
+
+done:
+    /* All done. */
+    return(ret_value);
+}
+
+/* Show parameters used for this use case */
+void show_parameters(void){
+    printf("===Parameters used:===\n");
+    printf("chunk dims=(%llu, %llu, %llu)\n", (unsigned long long)UC_opts.chunkdims[0], 
+        (unsigned long long)UC_opts.chunkdims[1], (unsigned long long)UC_opts.chunkdims[2]);
+    printf("dataset max dims=(%llu, %llu, %llu)\n", (unsigned long long)UC_opts.max_dims[0], 
+        (unsigned long long)UC_opts.max_dims[1], (unsigned long long)UC_opts.max_dims[2]);
+    printf("number of planes to write=%llu\n", (unsigned long long)UC_opts.nplanes);
+    printf("using SWMR mode=%s\n", UC_opts.use_swmr ? "yes(1)" : "no(0)");
+    printf("data filename=%s\n", UC_opts.filename);
+    printf("launch part=");
+	switch (UC_opts.launch){
+	case UC_READWRITE:
+	    printf("Reader/Writer\n");
+	    break;
+	case UC_WRITER:
+	    printf("Writer\n");
+	    break;
+	case UC_READER:
+	    printf("Reader\n");
+	    break;
+	default:
+	    /* should not happen */
+	    printf("Illegal part(%d)\n", UC_opts.launch);
+	};
+    printf("number of iterations=%d (not used yet)\n", UC_opts.iterations);
+    printf("===Parameters shown===\n");
+}
+
+/* Create the skeleton use case file for testing.
+ * It has one 3d dataset using chunked storage.
+ * The dataset is (unlimited, chunksize, chunksize).
+ * Dataset type is 2 bytes integer.
+ * It starts out "empty", i.e., first dimension is 0.
+ *
+ * Return: 0 succeed; -1 fail.
+ */
+int create_uc_file(void)
+{
+    hsize_t dims[3];		/* Dataset starting dimensions */
+    hid_t fid;          /* File ID for new HDF5 file */
+    hid_t dcpl;         /* Dataset creation property list */
+    hid_t sid;          /* Dataspace ID */
+    hid_t dsid;         /* Dataset ID */
+    hid_t fapl;         /* File access property list */
+    H5D_chunk_index_t idx_type; /* Chunk index type */
+
+    /* Create the file */
+    if((fapl = h5_fileaccess()) < 0)
+        return -1;
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        return -1;
+    if((fid = H5Fcreate(UC_opts.filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        return -1;
+
+    /* Set up dimension sizes */
+    dims[0] = 0;
+    dims[1] = dims[2] = UC_opts.max_dims[1];
+
+    /* Create dataspace for creating datasets */
+    if((sid = H5Screate_simple(3, dims, UC_opts.max_dims)) < 0)
+        return -1;
+
+    /* Create dataset creation property list */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        return -1;
+    if(H5Pset_chunk(dcpl, 3, UC_opts.chunkdims) < 0)
+        return -1;
+
+    /* create dataset of progname */
+    if((dsid = H5Dcreate2(fid, progname_g, UC_DATATYPE, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	return -1;
+
+    /* Check that the chunk index type is not version 1 B-tree.
+     * Version 1 B-trees are not supported under SWMR.
+     */
+    if(H5D__layout_idx_type_test(dsid, &idx_type) < 0)
+        return -1;
+    if(idx_type == H5D_CHUNK_IDX_BTREE) {
+        fprintf(stderr, "ERROR: Chunk index is version 1 B-tree: aborting.\n");
+        return -1;
+    }
+
+    /* Close everything */
+    if(H5Dclose(dsid) < 0)
+	return -1;
+    if(H5Pclose(fapl) < 0)
+        return -1;
+    if(H5Pclose(dcpl) < 0)
+        return -1;
+    if(H5Sclose(sid) < 0)
+        return -1;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    return 0;
+}
+
+/* Append planes, each of (1,2*chunksize,2*chunksize) to the dataset.
+ * In other words, 4 chunks are appended to the dataset at a time.
+ * Fill each plan with the plane number and then write it at the nth plane.
+ * Increase the plane number and repeat till the end of dataset, when it
+ * reaches chunksize long. End product is a (2*chunksize)^3 cube.
+ *
+ * Return: 0 succeed; -1 fail.
+ */
+int write_uc_file(hbool_t tosend)
+{
+    hid_t	fid;          /* File ID for new HDF5 file */
+    hid_t	dsid;         /* dataset ID */
+    hid_t       fapl;         /* File access property list */
+    hid_t	dcpl;         /* Dataset creation property list */
+    char	*name;
+    UC_CTYPE	*buffer, *bufptr;	/* data buffer */
+    hsize_t	cz=UC_opts.chunksize;		/* Chunk size */
+    hid_t	f_sid;	    /* dataset file space id */
+    hid_t	m_sid;	    /* memory space id */
+    int		rank;	    /* rank */
+    hsize_t 	chunk_dims[3];	/* Chunk dimensions */
+    hsize_t	dims[3];    /* Dataspace dimensions */
+    hsize_t	memdims[3]; /* Memory space dimensions */
+    hsize_t	start[3] = {0,0,0}, count[3];    /* Hyperslab selection values */
+    hsize_t     i, j, k;
+
+    name = UC_opts.filename;
+
+    /* Open the file */
+    if((fapl = h5_fileaccess()) < 0)
+        return -1;
+    if(UC_opts.use_swmr)
+        if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+            return -1;
+    if((fid = H5Fopen(name, H5F_ACC_RDWR | (UC_opts.use_swmr ? H5F_ACC_SWMR_WRITE : 0), fapl)) < 0){
+	fprintf(stderr, "H5Fopen failed\n");
+        return -1;
+    }
+
+    if(tosend)
+        /* Send a message that H5Fopen is complete--releasing the file lock */
+        h5_send_message(WRITER_MESSAGE);
+
+    /* Open the dataset of the program name */
+    if((dsid = H5Dopen2(fid, progname_g, H5P_DEFAULT)) < 0){
+	fprintf(stderr, "H5Dopen2 failed\n");
+	return -1;
+    }
+
+    /* Find chunksize used */
+    if ((dcpl = H5Dget_create_plist(dsid)) < 0){
+	fprintf(stderr, "H5Dget_create_plist failed\n");
+	return -1;
+    }
+    if (H5D_CHUNKED != H5Pget_layout(dcpl)){
+	fprintf(stderr, "storage layout is not chunked\n");
+	return -1;
+    }
+    if ((rank = H5Pget_chunk(dcpl, 3, chunk_dims)) != 3){
+	fprintf(stderr, "storage rank is not 3\n");
+	return -1;
+    }
+
+    /* verify chunk_dims against set paramenters */
+    if (chunk_dims[0]!=UC_opts.chunkdims[0] || chunk_dims[1] != cz || chunk_dims[2] != cz){
+	fprintf(stderr, "chunk size is not as expected. Got dims=(%llu,%llu,%llu)\n",
+	    (unsigned long long)chunk_dims[0], (unsigned long long)chunk_dims[1], 
+            (unsigned long long)chunk_dims[2]);
+	return -1;
+    }
+
+    /* allocate space for data buffer 1 X dims[1] X dims[2] of UC_CTYPE */
+    memdims[0]=1;
+    memdims[1] = UC_opts.dims[1];
+    memdims[2] = UC_opts.dims[2];
+    if ((buffer=(UC_CTYPE*)HDmalloc((size_t)memdims[1]*(size_t)memdims[2]*sizeof(UC_CTYPE)))==NULL) {
+	fprintf(stderr, "malloc: failed\n");
+	return -1;
+    };
+
+    /*
+     * Get dataset rank and dimension.
+     */
+    f_sid = H5Dget_space(dsid);    /* Get filespace handle first. */
+    rank  = H5Sget_simple_extent_ndims(f_sid);
+    if (rank != UC_RANK){
+	fprintf(stderr, "rank(%d) of dataset does not match\n", rank);
+	return -1;
+    }
+    if (H5Sget_simple_extent_dims(f_sid, dims, NULL) < 0){
+	fprintf(stderr, "H5Sget_simple_extent_dims got error\n");
+	return -1;
+    }
+    printf("dataset rank %d, dimensions %llu x %llu x %llu\n",
+	   rank, (unsigned long long)(dims[0]), (unsigned long long)(dims[1]), 
+           (unsigned long long)(dims[2]));
+    /* verify that file space dims are as expected and are consistent with memory space dims */
+    if (dims[0] != 0 || dims[1] != memdims[1] || dims[2] != memdims[2]){
+	fprintf(stderr, "dataset is not empty. Got dims=(%llu,%llu,%llu)\n",
+	    (unsigned long long)dims[0], (unsigned long long)dims[1], 
+            (unsigned long long)dims[2]);
+	return -1;
+    }
+    
+    /* setup mem-space for buffer */
+    if ((m_sid=H5Screate_simple(rank, memdims, NULL))<0){
+	fprintf(stderr, "H5Screate_simple for memory failed\n");
+	return -1;
+    };
+
+    /* write planes */
+    count[0]=1;
+    count[1]=dims[1];
+    count[2]=dims[2];
+    for (i=0; i<UC_opts.nplanes; i++){
+	/* fill buffer with value i+1 */
+	bufptr = buffer;
+	for (j=0; j<dims[1]; j++)
+	    for (k=0; k<dims[2]; k++)
+		*bufptr++ = i;
+
+	/* extend the dataset by one for new plane */
+	dims[0]=i+1;
+        if(H5Dset_extent(dsid, dims) < 0){
+	    fprintf(stderr, "H5Dset_extent failed\n");
+            return -1;
+	}
+
+        /* Get the dataset's dataspace */
+        if((f_sid = H5Dget_space(dsid)) < 0){
+	    fprintf(stderr, "H5Dset_extent failed\n");
+            return -1;
+	}
+
+	start[0]=i;
+        /* Choose the next plane to write */
+        if(H5Sselect_hyperslab(f_sid, H5S_SELECT_SET, start, NULL, count, NULL) < 0){
+	    fprintf(stderr, "Failed H5Sselect_hyperslab\n");
+            return -1;
+	}
+
+        /* Write plane to the dataset */
+        if(H5Dwrite(dsid, UC_DATATYPE, m_sid, f_sid, H5P_DEFAULT, buffer) < 0){
+	    fprintf(stderr, "Failed H5Dwrite\n");
+            return -1;
+	}
+	/* flush file to make the just written plane available. */
+#if 0
+	if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+#else
+	if(H5Dflush(dsid) < 0)
+#endif
+	{
+	    fprintf(stderr, "Failed to H5Fflush file\n");
+	    return -1;
+	}
+    }
+
+    /* Done writing. Free/Close all resources including data file */
+    HDfree(buffer);
+    if (H5Dclose(dsid) < 0){
+	fprintf(stderr, "Failed to close datasete\n");
+	return -1;
+    }
+    if (H5Sclose(m_sid) < 0){
+	fprintf(stderr, "Failed to close memory space\n");
+	return -1;
+    }
+    if (H5Sclose(f_sid) < 0){
+	fprintf(stderr, "Failed to close file space\n");
+	return -1;
+    }
+    if (H5Pclose(fapl) < 0){
+	fprintf(stderr, "Failed to property list\n");
+	return -1;
+    }
+    if (H5Fclose(fid) < 0){
+	fprintf(stderr, "Failed to close file id\n");
+	return -1;
+    }
+
+    return 0;
+}
+
+
+/* Read planes from the dataset.
+ * It expects the dataset is being changed (growing).
+ * It checks the unlimited dimension (1st one). When it increases,
+ * it will read in the new planes, one by one, and verify the data correctness.
+ * (The nth plan should contain all "n".)
+ * When the unlimited dimension grows to the chunksize (it becomes a cube),
+ * that is the expected end of data, the reader exits.
+ *
+ * Return: 0 succeed; -1 fail.
+ */
+int read_uc_file(hbool_t towait)
+{
+    hid_t   fapl;         /* file access property list ID */
+    hid_t	fid;          /* File ID for new HDF5 file */
+    hid_t	dsid;         /* dataset ID */
+    char	*name;
+    UC_CTYPE	*buffer, *bufptr;	/* read data buffer */
+    hid_t	f_sid;	    /* dataset file space id */
+    hid_t	m_sid;	    /* memory space id */
+    int		rank;	    /* rank */
+    hsize_t	dims[3];    /* Dataspace dimensions */
+    hsize_t	memdims[3]; /* Memory space dimensions */
+    hsize_t     nplane=0, nplane_old=0;	/* nth plane, last nth plane */
+    hsize_t	start[3] = {0,0,0}, count[3];    /* Hyperslab selection values */
+    hsize_t	j, k;
+    int		nreadererr=0;
+    int		nerrs;
+    int		nonewplane;
+
+    /* Before reading, wait for the message that H5Fopen is complete--file lock is released */
+    if(towait && h5_wait_message(WRITER_MESSAGE) < 0) {
+        fprintf(stderr, "Cannot find writer message file...failed\n");
+        return -1;
+    }
+
+    name = UC_opts.filename;
+
+    /* Open the file */
+    if((fapl = h5_fileaccess()) < 0)
+        return -1;
+    if((fid = H5Fopen(name, H5F_ACC_RDONLY | (UC_opts.use_swmr ? H5F_ACC_SWMR_READ : 0), fapl)) < 0){
+	fprintf(stderr, "H5Fopen failed\n");
+        return -1;
+    }
+    if (H5Pclose(fapl) < 0){
+	    fprintf(stderr, "Failed to property list\n");
+	    return -1;
+    }
+
+
+    /* Open the dataset of the program name */
+    if((dsid = H5Dopen2(fid, progname_g, H5P_DEFAULT)) < 0){
+	fprintf(stderr, "H5Dopen2 failed\n");
+	return -1;
+    }
+
+    /* allocate space for data buffer 1 X dims[1] X dims[2] of UC_CTYPE */
+    memdims[0]=1;
+    memdims[1] = UC_opts.dims[1];
+    memdims[2] = UC_opts.dims[2];
+    if ((buffer=(UC_CTYPE*)HDmalloc((size_t)memdims[1]*(size_t)memdims[2]*sizeof(UC_CTYPE)))==NULL) {
+	fprintf(stderr, "malloc: failed\n");
+	return -1;
+    };
+
+    /*
+     * Get dataset rank and dimension.
+     * Verify dimension is as expected (unlimited,2*chunksize,2*chunksize).
+     */
+    f_sid = H5Dget_space(dsid);    /* Get filespace handle first. */
+    rank  = H5Sget_simple_extent_ndims(f_sid);
+    if (rank != UC_RANK){
+	fprintf(stderr, "rank(%d) of dataset does not match\n", rank);
+	return -1;
+    }
+    if (H5Sget_simple_extent_dims(f_sid, dims, NULL) < 0){
+	fprintf(stderr, "H5Sget_simple_extent_dims got error\n");
+	return -1;
+    }
+    printf("dataset rank %d, dimensions %llu x %llu x %llu\n",
+	   rank, (unsigned long long)(dims[0]), (unsigned long long)(dims[1]),
+           (unsigned long long)(dims[2]));
+    /* verify that file space dims are as expected and are consistent with memory space dims */
+    if (dims[1] != memdims[1] || dims[2] != memdims[2]){
+	fprintf(stderr, "dataset dimension is not as expected. Got dims=(%llu,%llu,%llu)\n",
+	    (unsigned long long)dims[0], (unsigned long long)dims[1],
+            (unsigned long long)dims[2]);
+	fprintf(stderr, "But memdims=(%llu,%llu,%llu)\n",
+	    (unsigned long long)memdims[0], (unsigned long long)memdims[1], 
+            (unsigned long long)memdims[2]);
+	return -1;
+    }
+    
+    /* setup mem-space for buffer */
+    if ((m_sid=H5Screate_simple(rank, memdims, NULL))<0){
+	fprintf(stderr, "H5Screate_simple for memory failed\n");
+	return -1;
+    };
+
+    /* Read 1 plane at a time whenever the dataset grows larger
+     * (along dim[0]) */
+    count[0]=1;
+    count[1]=dims[1];
+    count[2]=dims[2];
+    /* quit when all nplanes  have been read */
+    nonewplane=0;
+    while (nplane_old < UC_opts.nplanes ){
+	/* print progress message according to if new planes are availalbe */
+	if (nplane_old < dims[0]) {
+	    if (nonewplane){
+		/* end the previous message */
+		printf("\n");
+		nonewplane=0;
+	    }
+	    printf("reading planes %llu to %llu\n", (unsigned long long)nplane_old, 
+                (unsigned long long)dims[0]);
+	}else{
+	    if (nonewplane){
+		printf(".");
+		if (nonewplane>=30){
+		    fprintf(stderr, "waited too long for new plane, quit.\n");
+		    return -1;
+		}
+	    }else{
+		/* print mesg only the first time; dots still no new plane */
+		printf("no new planes to read ");
+	    }
+	    nonewplane++;
+	    /* pause for a second */
+	    sleep(1);
+	}
+	for (nplane=nplane_old; nplane < dims[0]; nplane++){
+	    /* read planes between last old nplanes and current extent */
+	    /* Get the dataset's dataspace */
+	    if((f_sid = H5Dget_space(dsid)) < 0){
+		fprintf(stderr, "H5Dget_space failed\n");
+		return -1;
+	    }
+
+	    start[0]=nplane;
+	    /* Choose the next plane to read */
+	    if(H5Sselect_hyperslab(f_sid, H5S_SELECT_SET, start, NULL, count, NULL) < 0){
+		fprintf(stderr, "H5Sselect_hyperslab failed\n");
+		return -1;
+	    }
+
+	    /* Read the plane from the dataset */
+	    if(H5Dread(dsid, UC_DATATYPE, m_sid, f_sid, H5P_DEFAULT, buffer) < 0){
+		fprintf(stderr, "H5Dread failed\n");
+		return -1;
+	    }
+
+	    /* compare read data with expected data value which is nplane */
+	    bufptr = buffer;
+	    nerrs=0;
+	    for (j=0; j<dims[1]; j++){
+		for (k=0; k<dims[2]; k++){
+		    if ((hsize_t)*bufptr++ != nplane){
+			if (++nerrs < ErrorReportMax){
+			    fprintf(stderr,
+				"found error %llu plane(%llu,%llu), expected %llu, got %d\n",
+				(unsigned long long)nplane, (unsigned long long)j, 
+                                (unsigned long long)k, (unsigned long long)nplane, (int)*(bufptr-1));
+			}
+		    }
+		}
+	    }
+	    if (nerrs){
+		nreadererr++;
+		fprintf(stderr, "found %d unexpected values in plane %llu\n", nerrs, 
+                    (unsigned long long)nplane);
+	    }
+	}
+	/* Have read all current planes */
+	nplane_old=dims[0];
+
+	/* check if dataset has grown since last time */
+#if 0
+	/* close dsid and file, then reopen them */
+	if (H5Dclose(dsid) < 0){
+	    fprintf(stderr, "H5Dclose failed\n");
+	    return -1;
+	}
+	if (H5Fclose(fid) < 0){
+	    fprintf(stderr, "H5Fclose failed\n");
+	    return -1;
+	}
+	if((fid = H5Fopen(name, H5F_ACC_RDONLY | (UC_opts.use_swmr ? H5F_ACC_SWMR_READ : 0), H5P_DEFAULT)) < 0){
+	    fprintf(stderr, "H5Fopen failed\n");
+	    return -1;
+	}
+	if((dsid = H5Dopen2(fid, progname_g, H5P_DEFAULT)) < 0){
+	    fprintf(stderr, "H5Dopen2 failed\n");
+	    return -1;
+	}
+#else
+	H5Drefresh(dsid);
+#endif
+	f_sid = H5Dget_space(dsid);    /* Get filespace handle first. */
+	if (H5Sget_simple_extent_dims(f_sid, dims, NULL) < 0){
+	    fprintf(stderr, "H5Sget_simple_extent_dims got error\n");
+	    return -1;
+	}
+    }
+
+    if (nreadererr)
+	return -1;
+    else
+	return 0;
+}
+
diff --git a/test/use_disable_mdc_flushes.c b/test/use_disable_mdc_flushes.c
new file mode 100644
index 0000000..5fd013f
--- /dev/null
+++ b/test/use_disable_mdc_flushes.c
@@ -0,0 +1,531 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * This is copied from use_append_chunk.c with modifications to show
+ * the usage of H5Odisable_mdc_flushes/H5Oenable_mdc_flushes/H5Oare_mdc_flushes_disabled public routines.
+ */
+
+#include "h5test.h"
+
+#define H5D_FRIEND		/*suppress error about including H5Dpkg	  */
+#define H5D_TESTING
+#include "H5Dpkg.h"
+
+/* Global Variable definitions */
+const char *progname_g="use_disable_mdc_flushes";	/* program name */
+
+/* these two definitions must match each other */
+#define UC_DATATYPE             H5T_NATIVE_SHORT    /* use case HDF5 data type */
+#define UC_CTYPE                short               /* use case C data type */
+#define UC_RANK                 3                   /* use case dataset rank */
+#define Chunksize_DFT           256     /* chunksize default */
+#define Hgoto_error(val)        {ret_value=val; goto done;}
+
+
+char *filename_g;
+hsize_t nplanes_g;
+int use_swmr_g;
+int chunkplanes_g;
+int chunksize_g;
+hsize_t dims_g[UC_RANK];
+hsize_t max_dims_g[UC_RANK];
+hsize_t chunkdims_g[UC_RANK];
+
+static void usage(const char *prog);
+static int parse_option(int argc, char * const argv[]);
+static void show_parameters(void);
+static int create_file(void);
+static int setup_parameters(int argc, char * const argv[]);
+
+/*
+ * Note: Long options are not yet implemented.
+ *
+ * usage: use_disable_mdc_flushes [OPTIONS]
+ * OPTIONS
+ *  -h, --help 		  Print a usage message and exit
+ *  -f FN                 Test file name [default: use_disable_mdc_flushes.h5]
+ *  -n N, --nplanes=N     Number of planes to write. [default: 1000]
+ *  -s N, --swmr=N        Use SWMR mode (0: no, non-0: yes) default is yes
+ *  -z N, --chunksize=N   Chunk size [default: 256]
+ *  -y N, --chunkplanes=N Number of planes per chunk [default: 1]
+ */
+static void
+usage(const char *prog)
+{
+    fprintf(stderr, "usage: %s [OPTIONS]\n", prog);
+    fprintf(stderr, "  OPTIONS\n");
+    fprintf(stderr, "     -h          Print a usage message and exit\n");
+    fprintf(stderr, "     -f FN       Test file name [default: %s.h5]\n", prog);
+    fprintf(stderr, "     -n N        Number of planes to write. [default: 1000]\n");
+    fprintf(stderr, "     -s N        Use SWMR mode (0: no, non-0: yes) default is yes\n");
+    fprintf(stderr, "     -z N        Chunk size [default: %d]\n", Chunksize_DFT);
+    fprintf(stderr, "     -y N        Number of planes per chunk [default: 1]\n");
+    fprintf(stderr, "\n");
+} /* usage() */
+
+
+/* 
+ * Setup Use Case parameters by parsing command line options.
+ * Setup default values if not set by options. */
+static int
+parse_option(int argc, char * const argv[])
+{
+    int ret_value=0;
+    int c;
+    /* command line options: See function usage for a description */
+    const char *cmd_options = "f:hn:s:y:z:";
+
+    /* suppress getopt from printing error */
+    opterr = 0;
+
+    while (1){
+	c = getopt (argc, argv, cmd_options);
+	if (-1 == c)
+	    break;
+	switch (c) {
+	  case 'h':
+	    usage(progname_g);
+	    exit(0);
+	    break;
+	  case 'f':	/* usecase data file name */
+	    filename_g = optarg;
+	    break;
+	  case 'n':	/* number of planes to write/read */
+	    if ((nplanes_g = atoi(optarg)) <= 0){
+		fprintf(stderr, "bad number of planes %s, must be a positive integer\n", optarg);
+		usage(progname_g);
+		Hgoto_error(-1);
+	    };
+	    break;
+	  case 's':	/* use swmr file open mode */
+	    if ((use_swmr_g = atoi(optarg)) < 0){
+		fprintf(stderr, "swmr value should be 0(no) or 1(yes)\n");
+		usage(progname_g);
+		Hgoto_error(-1);
+	    };
+	    break;
+	  case 'y':	/* Number of planes per chunk */
+	    if ((chunkplanes_g = atoi(optarg)) <= 0){
+		fprintf(stderr, "bad number of planes per chunk %s, must be a positive integer\n", optarg);
+		usage(progname_g);
+		Hgoto_error(-1);
+	    };
+	    break;
+	  case 'z':	/* size of chunk=(z,z) */
+	    if ((chunksize_g = atoi(optarg)) <= 0){
+		fprintf(stderr, "bad chunksize %s, must be a positive integer\n", optarg);
+		usage(progname_g);
+		Hgoto_error(-1);
+	    };
+	    break;
+	  case '?':
+	    fprintf(stderr, "getopt returned '%c'.\n", c);
+	    Hgoto_error(-1);
+	  default:
+	    fprintf(stderr, "getopt returned unexpected value.\n");
+	    fprintf(stderr, "Unexpected value is %d\n", c);
+	    Hgoto_error(-1);
+	}
+    }
+
+    /* set test file name if not given */
+    if (!filename_g){
+	/* default data file name is <progname>.h5 */
+	if ((filename_g = (char*)HDmalloc(HDstrlen(progname_g)+4))==NULL) {
+	    fprintf(stderr, "malloc: failed\n");
+	    Hgoto_error(-1);
+	};
+	HDstrcpy(filename_g, progname_g);
+	HDstrcat(filename_g, ".h5");
+    }
+
+done:
+    /* All done. */
+    return(ret_value);
+} /* parse_option() */
+
+/* Show parameters used for this use case */
+static void 
+show_parameters(void)
+{
+    printf("===Parameters used:===\n");
+    printf("chunk dims=(%llu, %llu, %llu)\n", (unsigned long long)chunkdims_g[0], 
+        (unsigned long long)chunkdims_g[1], (unsigned long long)chunkdims_g[2]);
+    printf("dataset max dims=(%llu, %llu, %llu)\n", (unsigned long long)max_dims_g[0], 
+        (unsigned long long)max_dims_g[1], (unsigned long long)max_dims_g[2]);
+    printf("number of planes to write=%llu\n", (unsigned long long)nplanes_g);
+    printf("using SWMR mode=%s\n", use_swmr_g ? "yes(1)" : "no(0)");
+    printf("data filename=%s\n", filename_g);
+    printf("===Parameters shown===\n");
+} /* show_parameters() */
+
+/* 
+ * Setup parameters for the use case.
+ * Return: 0 succeed; -1 fail.
+ */
+static int 
+setup_parameters(int argc, char * const argv[])
+{
+    /* use case defaults */
+    chunksize_g = Chunksize_DFT;
+    use_swmr_g = 1;	/* use swmr open */
+    chunkplanes_g = 1;
+
+    /* parse options */
+    if (parse_option(argc, argv) < 0){
+	return(-1);
+    }
+    /* set chunk dims */
+    chunkdims_g[0] = chunkplanes_g;
+    chunkdims_g[1]= chunkdims_g[2] = chunksize_g;
+
+    /* set dataset initial and max dims */
+    dims_g[0] = 0;
+    max_dims_g[0] = H5S_UNLIMITED;
+    dims_g[1] = dims_g[2] = max_dims_g[1] = max_dims_g[2] = chunksize_g;
+
+    /* set nplanes */
+    if (nplanes_g == 0)
+        nplanes_g = chunksize_g;
+
+    /* show parameters and return */
+    show_parameters();
+    return(0);
+} /* setup_parameters() */
+
+/* 
+ * Create the skeleton use case file for testing.
+ * It has one 3d dataset using chunked storage.
+ * The dataset is (unlimited, chunksize, chunksize).
+ * Dataset type is 2 bytes integer.
+ * It starts out "empty", i.e., first dimension is 0.
+ *
+ * Return: 0 succeed; -1 fail.
+ */
+static int 
+create_file(void)
+{
+    hsize_t dims[3];		/* Dataset starting dimensions */
+    hid_t fid;          /* File ID for new HDF5 file */
+    hid_t dcpl;         /* Dataset creation property list */
+    hid_t sid;          /* Dataspace ID */
+    hid_t dsid;         /* Dataset ID */
+    hid_t fapl;         /* File access property list */
+    H5D_chunk_index_t idx_type; /* Chunk index type */
+
+    /* Create the file */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        return -1;
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        return -1;
+    if((fid = H5Fcreate(filename_g, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        return -1;
+
+    /* Set up dimension sizes */
+    dims[0] = 0;
+    dims[1] = dims[2] = max_dims_g[1];
+
+    /* Create dataspace for creating datasets */
+    if((sid = H5Screate_simple(3, dims, max_dims_g)) < 0)
+        return -1;
+
+    /* Create dataset creation property list */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        return -1;
+    if(H5Pset_chunk(dcpl, 3, chunkdims_g) < 0)
+        return -1;
+
+    /* create dataset of progname */
+    if((dsid = H5Dcreate2(fid, progname_g, UC_DATATYPE, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	return -1;
+
+    /* Check that the chunk index type is not version 1 B-tree.
+     * Version 1 B-trees are not supported under SWMR.
+     */
+    if(H5D__layout_idx_type_test(dsid, &idx_type) < 0)
+        return -1;
+    if(idx_type == H5D_CHUNK_IDX_BTREE) {
+        fprintf(stderr, "ERROR: Chunk index is version 1 B-tree: aborting.\n");
+        return -1;
+    }
+
+    /* Close everything */
+    if(H5Dclose(dsid) < 0)
+	return -1;
+    if(H5Pclose(fapl) < 0)
+        return -1;
+    if(H5Pclose(dcpl) < 0)
+        return -1;
+    if(H5Sclose(sid) < 0)
+        return -1;
+    if(H5Fclose(fid) < 0)
+        return -1;
+
+    return 0;
+} /* create_file() */
+
+/* 
+ * Append planes, each of (1,2*chunksize,2*chunksize) to the dataset.
+ * In other words, 4 chunks are appended to the dataset at a time.
+ * Fill each plane with the plane number and then write it at the nth plane.
+ * Increase the plane number and repeat till the end of dataset, when it
+ * reaches chunksize long. End product is a (2*chunksize)^3 cube.
+ *
+ * Return: 0 succeed; -1 fail.
+ */
+static int 
+write_file(void)
+{
+    hid_t	fid;          	/* File ID for new HDF5 file */
+    hid_t	dsid;         	/* dataset ID */
+    hid_t       fapl;         	/* File access property list */
+    hid_t	dcpl;      	/* Dataset creation property list */
+    char	*name;
+    UC_CTYPE	*buffer, *bufptr;	/* data buffer */
+    hsize_t	cz=chunksize_g;		/* Chunk size */
+    hid_t	f_sid;	    	/* dataset file space id */
+    hid_t	m_sid;	    	/* memory space id */
+    int		rank;	    	/* rank */
+    hsize_t 	chunk_dims[3];	/* Chunk dimensions */
+    hsize_t	dims[3];    	/* Dataspace dimensions */
+    hsize_t	memdims[3]; 	/* Memory space dimensions */
+    hsize_t	start[3] = {0,0,0}, count[3];    /* Hyperslab selection values */
+    hbool_t 	disabled;   	/* Object's disabled status */	
+    hsize_t     i, j, k;
+
+    name = filename_g;
+
+    /* Open the file */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        return -1;
+    if(use_swmr_g)
+        if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+            return -1;
+    if((fid = H5Fopen(name, H5F_ACC_RDWR | (use_swmr_g ? H5F_ACC_SWMR_WRITE : 0), fapl)) < 0){
+	fprintf(stderr, "H5Fopen failed\n");
+        return -1;
+    }
+
+    /* Open the dataset of the program name */
+    if((dsid = H5Dopen2(fid, progname_g, H5P_DEFAULT)) < 0){
+	fprintf(stderr, "H5Dopen2 failed\n");
+	return -1;
+    }
+
+    /* Disabled mdc flushed for the dataset */
+    if(H5Odisable_mdc_flushes(dsid) < 0) {
+	fprintf(stderr, "H5Odisable_mdc_flushes failed\n");
+	return -1;
+    }
+
+    /* Get mdc disabled status of the dataset */
+    if(H5Oare_mdc_flushes_disabled(dsid, &disabled) < 0) {
+	fprintf(stderr, "H5Oare_mdc_flushes_disabled failed\n");
+	return -1;
+    } else if(disabled)
+	printf("Dataset has disabled mdc flushes.\n");
+    else
+	printf("Dataset should have disabled its mdc flushes.\n");
+
+    /* Find chunksize used */
+    if ((dcpl = H5Dget_create_plist(dsid)) < 0){
+	fprintf(stderr, "H5Dget_create_plist failed\n");
+	return -1;
+    }
+    if (H5D_CHUNKED != H5Pget_layout(dcpl)){
+	fprintf(stderr, "storage layout is not chunked\n");
+	return -1;
+    }
+    if ((rank = H5Pget_chunk(dcpl, 3, chunk_dims)) != 3){
+	fprintf(stderr, "storage rank is not 3\n");
+	return -1;
+    }
+
+    /* verify chunk_dims against set paramenters */
+    if (chunk_dims[0]!= chunkdims_g[0] || chunk_dims[1] != cz || chunk_dims[2] != cz){
+	fprintf(stderr, "chunk size is not as expected. Got dims=(%llu,%llu,%llu)\n",
+	    (unsigned long long)chunk_dims[0], (unsigned long long)chunk_dims[1], 
+            (unsigned long long)chunk_dims[2]);
+	return -1;
+    }
+
+    /* allocate space for data buffer 1 X dims[1] X dims[2] of UC_CTYPE */
+    memdims[0]=1;
+    memdims[1] = dims_g[1];
+    memdims[2] = dims_g[2];
+    if ((buffer=(UC_CTYPE*)HDmalloc((size_t)memdims[1]*(size_t)memdims[2]*sizeof(UC_CTYPE)))==NULL) {
+	fprintf(stderr, "malloc: failed\n");
+	return -1;
+    };
+
+    /*
+     * Get dataset rank and dimension.
+     */
+    f_sid = H5Dget_space(dsid);    /* Get filespace handle first. */
+    rank  = H5Sget_simple_extent_ndims(f_sid);
+    if (rank != UC_RANK){
+	fprintf(stderr, "rank(%d) of dataset does not match\n", rank);
+	return -1;
+    }
+    if (H5Sget_simple_extent_dims(f_sid, dims, NULL) < 0){
+	fprintf(stderr, "H5Sget_simple_extent_dims got error\n");
+	return -1;
+    }
+    printf("dataset rank %d, dimensions %llu x %llu x %llu\n",
+	   rank, (unsigned long long)(dims[0]), (unsigned long long)(dims[1]), 
+           (unsigned long long)(dims[2]));
+    /* verify that file space dims are as expected and are consistent with memory space dims */
+    if (dims[0] != 0 || dims[1] != memdims[1] || dims[2] != memdims[2]){
+	fprintf(stderr, "dataset is not empty. Got dims=(%llu,%llu,%llu)\n",
+	    (unsigned long long)dims[0], (unsigned long long)dims[1], 
+            (unsigned long long)dims[2]);
+	return -1;
+    }
+    
+    /* setup mem-space for buffer */
+    if ((m_sid=H5Screate_simple(rank, memdims, NULL))<0){
+	fprintf(stderr, "H5Screate_simple for memory failed\n");
+	return -1;
+    };
+
+    /* write planes */
+    count[0]=1;
+    count[1]=dims[1];
+    count[2]=dims[2];
+    for (i=0; i<nplanes_g; i++){
+	/* fill buffer with value i+1 */
+	bufptr = buffer;
+	for (j=0; j<dims[1]; j++)
+	    for (k=0; k<dims[2]; k++)
+		*bufptr++ = i;
+
+	/* extend the dataset by one for new plane */
+	dims[0]=i+1;
+        if(H5Dset_extent(dsid, dims) < 0){
+	    fprintf(stderr, "H5Dset_extent failed\n");
+            return -1;
+	}
+
+        /* Get the dataset's dataspace */
+        if((f_sid = H5Dget_space(dsid)) < 0){
+	    fprintf(stderr, "H5Dset_extent failed\n");
+            return -1;
+	}
+
+	start[0]=i;
+        /* Choose the next plane to write */
+        if(H5Sselect_hyperslab(f_sid, H5S_SELECT_SET, start, NULL, count, NULL) < 0){
+	    fprintf(stderr, "Failed H5Sselect_hyperslab\n");
+            return -1;
+	}
+
+        /* Write plane to the dataset */
+        if(H5Dwrite(dsid, UC_DATATYPE, m_sid, f_sid, H5P_DEFAULT, buffer) < 0){
+	    fprintf(stderr, "Failed H5Dwrite\n");
+            return -1;
+	}
+
+	/* Flush the dataset for every "chunkplanes_g" planes */
+	if(!((i + 1) % (hsize_t)chunkplanes_g)) {
+	    if(H5Dflush(dsid) < 0) {
+		fprintf(stderr, "Failed to H5Dflush dataset\n");
+		return -1;
+	    }
+	}
+    }
+
+    if(H5Dflush(dsid) < 0) {
+	fprintf(stderr, "Failed to H5Dflush dataset\n");
+	return -1;
+    }
+
+    /* Enable mdc flushes for the dataset */
+    /* Closing the dataset later will enable mdc flushes automatically if this is not done */
+    if(disabled)
+	if(H5Oenable_mdc_flushes(dsid) < 0) {
+	    fprintf(stderr, "Failed to H5Oenable_mdc_flushes\n");
+	    return -1;
+	}
+
+    /* Done writing. Free/Close all resources including data file */
+    HDfree(buffer);
+
+    if(H5Dclose(dsid) < 0){
+	fprintf(stderr, "Failed to close datasete\n");
+	return -1;
+    }
+    if(H5Sclose(m_sid) < 0){
+	fprintf(stderr, "Failed to close memory space\n");
+	return -1;
+    }
+    if(H5Sclose(f_sid) < 0){
+	fprintf(stderr, "Failed to close file space\n");
+	return -1;
+    }
+    if(H5Pclose(fapl) < 0){
+	fprintf(stderr, "Failed to property list\n");
+	return -1;
+    }
+    if(H5Fclose(fid) < 0){
+	fprintf(stderr, "Failed to close file id\n");
+	return -1;
+    }
+
+    return 0;
+} /* write_file() */
+
+
+
+/* Overall Algorithm: 
+ * Parse options from user;
+ * Generate/pre-created test files needed and close it;
+ * Write to the file.
+ */
+int
+main(int argc, char *argv[])
+{
+    int ret_value = 0;
+
+    /* initialization */
+    if (setup_parameters(argc, argv) < 0){
+	Hgoto_error(1);
+    }
+
+    /* ============*/
+    /* Create file */
+    /* ============*/
+    printf("Creating skeleton data file for testing H5Odisable_mdc_flushes()...\n");
+    if (create_file() < 0){
+	fprintf(stderr, "***encounter error\n");
+	Hgoto_error(1);
+    }else
+	printf("File created.\n");
+
+    printf("writing to the file\n");
+    if (write_file() < 0){
+	fprintf(stderr, "write_file encountered error\n");
+	Hgoto_error(1);
+    }
+
+done:
+    /* Print result and exit */
+    if (ret_value != 0){
+	printf("Error(s) encountered\n");
+    }else{
+	printf("All passed\n");
+    }
+
+    return(ret_value);
+}
diff --git a/test/vds.c b/test/vds.c
new file mode 100644
index 0000000..eff01c1
--- /dev/null
+++ b/test/vds.c
@@ -0,0 +1,11150 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Neil Fortner <nfortne2 at hdfgroup.org>
+ *              Monday, February 16, 2015
+ *
+ * Purpose:     Tests datasets with virtual layout.
+ */
+#include "h5test.h"
+#include "H5srcdir.h"
+#include "H5Dprivate.h" /* For H5D_VIRTUAL_DEF_LIST_SIZE */
+
+typedef enum {
+    TEST_API_BASIC,
+    TEST_API_COPY_PLIST,
+    TEST_API_ENCDEC_PLIST,
+    TEST_API_CREATE_DSET,
+    TEST_API_REOPEN_DSET,
+    TEST_API_REOPEN_FILE,
+    TEST_API_NTESTS
+} test_api_config_t;
+
+const char *FILENAME[] = {
+    "vds_virt_0",
+    "vds_virt_1",
+    "vds_src_0",
+    "vds_src_1",
+    "vds%%_src",
+    NULL
+};
+
+/* I/O test config flags */
+#define TEST_IO_CLOSE_SRC       0x01u
+#define TEST_IO_DIFFERENT_FILE  0x02u
+#define TEST_IO_REOPEN_VIRT     0x04u
+#define TEST_IO_NTESTS          0x08u
+
+#define LIST_DOUBLE_SIZE (H5D_VIRTUAL_DEF_LIST_SIZE + 1)
+
+#define FILENAME_BUF_SIZE       1024
+
+

+/*-------------------------------------------------------------------------
+ * Function:    vds_select_equal
+ *
+ * Purpose:     Helper function to check if the selections in the two
+ *              provided dataspaces are the same.
+ *
+ * Return:      Success:        0
+ *
+ *              Failure:        -1
+ *
+ * Programmer:  Neil Fortner
+ *              Monday, March 2, 2015
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static htri_t
+vds_select_equal(hid_t space1, hid_t space2)
+{
+    H5S_sel_type    type1;
+    H5S_sel_type    type2;
+    hsize_t         *buf1 = NULL;
+    hsize_t         *buf2 = NULL;
+    size_t          i;
+    htri_t          ret_value = TRUE;
+
+    /* Get and compare selection types */
+    if((type1 = H5Sget_select_type(space1)) < 0)
+        TEST_ERROR
+    if((type2 = H5Sget_select_type(space2)) < 0)
+        TEST_ERROR
+    if(type1 != type2)
+        return FALSE;
+
+    /* Check selection type */
+    switch(type1) {
+        case H5S_SEL_NONE:
+        case H5S_SEL_ALL:
+            break;
+
+        case H5S_SEL_POINTS:
+            {
+                int         rank1;
+                int         rank2;
+                hssize_t    npoints1;
+                hssize_t    npoints2;
+
+                /* Get and compare rank */
+                if((rank1 = H5Sget_simple_extent_ndims(space1)) < 0)
+                    TEST_ERROR
+                if((rank2 = H5Sget_simple_extent_ndims(space2)) < 0)
+                    TEST_ERROR
+                if(rank1 != rank2)
+                    return FALSE;
+
+                /* Get and compare number of points */
+                if((npoints1 = H5Sget_select_elem_npoints(space1)) < 0)
+                    TEST_ERROR
+                if((npoints2 = H5Sget_select_elem_npoints(space2)) < 0)
+                    TEST_ERROR
+                if(npoints1 != npoints2)
+                    return FALSE;
+
+                /* Allocate point lists.  Do not return directly afer
+                 * allocating, to make sure buffers are freed. */
+                if(NULL == (buf1 = (hsize_t *)HDmalloc((size_t)rank1 * (size_t)npoints1 * sizeof(hsize_t))))
+                    TEST_ERROR
+                if(NULL == (buf2 = (hsize_t *)HDmalloc((size_t)rank1 * (size_t)npoints1 * sizeof(hsize_t))))
+                    TEST_ERROR
+
+                /* Get and compare point lists */
+                if(H5Sget_select_elem_pointlist(space1, (hsize_t)0, (hsize_t)npoints1, buf1) < 0)
+                    TEST_ERROR
+                if(H5Sget_select_elem_pointlist(space2, (hsize_t)0, (hsize_t)npoints1, buf2) < 0)
+                    TEST_ERROR
+                for(i = 0; i < ((size_t)rank1 * (size_t)npoints1); i++)
+                    if(buf1[i] != buf2[i]) {
+                        ret_value = FALSE;
+                        break;
+                    } /* end if */
+
+                /* Free buffers */
+                HDfree(buf1);
+                buf1 = NULL;
+                HDfree(buf2);
+                buf2 = NULL;
+            } /* end block */
+
+            break;
+
+        case H5S_SEL_HYPERSLABS:
+            {
+                int         rank1;
+                int         rank2;
+                hssize_t    nblocks1;
+                hssize_t    nblocks2;
+
+                /* Get and compare rank */
+                if((rank1 = H5Sget_simple_extent_ndims(space1)) < 0)
+                    TEST_ERROR
+                if((rank2 = H5Sget_simple_extent_ndims(space2)) < 0)
+                    TEST_ERROR
+                if(rank1 != rank2)
+                    return FALSE;
+
+                /* Get and compare number of blocks */
+                if((nblocks1 = H5Sget_select_hyper_nblocks(space1)) < 0)
+                    TEST_ERROR
+                if((nblocks2 = H5Sget_select_hyper_nblocks(space2)) < 0)
+                    TEST_ERROR
+                if(nblocks1 != nblocks2)
+                    return FALSE;
+
+                /* Allocate block lists.  Do not return directly afer
+                 * allocating, to make sure buffers are freed. */
+                if(NULL == (buf1 = (hsize_t *)HDmalloc((size_t)2 * (size_t)rank1 * (size_t)nblocks1 * sizeof(*buf1))))
+                    TEST_ERROR
+                if(NULL == (buf2 = (hsize_t *)HDmalloc((size_t)2 * (size_t)rank1 * (size_t)nblocks1 * sizeof(*buf2))))
+                    TEST_ERROR
+
+                /* Get and compare block lists */
+                if(H5Sget_select_hyper_blocklist(space1, (hsize_t)0, (hsize_t)nblocks1, buf1) < 0)
+                    TEST_ERROR
+                if(H5Sget_select_hyper_blocklist(space2, (hsize_t)0, (hsize_t)nblocks1, buf2) < 0)
+                    TEST_ERROR
+                for(i = 0; i < ((size_t)2 * (size_t)rank1 * (size_t)nblocks1); i++)
+                    if(buf1[i] != buf2[i]) {
+                        ret_value = FALSE;
+                        break;
+                    } /* end if */
+
+                /* Free buffers */
+                HDfree(buf1);
+                buf1 = NULL;
+                HDfree(buf2);
+                buf2 = NULL;
+            } /* end block */
+
+            break;
+
+        case H5S_SEL_ERROR:
+        case H5S_SEL_N:
+        default:
+            TEST_ERROR
+    } /* end switch */
+
+    return ret_value;
+
+error:
+    if(buf1)
+        HDfree(buf1);
+    if(buf2)
+        HDfree(buf2);
+
+    return -1;
+} /* end vds_select_equal() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    vds_check_mapping
+ *
+ * Purpose:     Helper function to check if the ith virtual mapping in the
+ *              provided dcpl is the same as that described by the other
+ *              parameters.
+ *
+ * Return:      Success:        0
+ *
+ *              Failure:        -1
+ *
+ * Programmer:  Neil Fortner
+ *              Monday, March 2, 2015
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+vds_check_mapping(hid_t dcpl, size_t i, hid_t vspace, hid_t srcspace,
+    const char *filename, const char *dsetname)
+{
+    hid_t       space_out = -1;
+    char        name_out[32];
+    htri_t      tri_ret;
+    ssize_t     str_len;
+
+    HDassert(dcpl >= 0);
+    HDassert(vspace >= 0);
+    HDassert(srcspace >= 0);
+    HDassert(filename);
+    HDassert(dsetname);
+
+    /* Check vspace */
+    if((space_out = H5Pget_virtual_vspace(dcpl, i)) < 0)
+        TEST_ERROR
+    if((tri_ret = H5Sextent_equal(space_out, vspace)) < 0)
+        TEST_ERROR
+    if(!tri_ret)
+        TEST_ERROR
+    if((tri_ret = vds_select_equal(space_out, vspace)) < 0)
+        TEST_ERROR
+    if(!tri_ret)
+        TEST_ERROR
+    if(H5Sclose(space_out) < 0)
+        TEST_ERROR
+    space_out = -1;
+
+    /* Check srcspace */
+    if((space_out = H5Pget_virtual_srcspace(dcpl, i)) < 0)
+        TEST_ERROR
+    if((tri_ret = vds_select_equal(space_out, srcspace)) < 0)
+        TEST_ERROR
+    if(!tri_ret)
+        TEST_ERROR
+    if(H5Sclose(space_out) < 0)
+        TEST_ERROR
+    space_out = -1;
+
+    /* Check filename */
+    if((str_len = H5Pget_virtual_filename(dcpl, i, NULL, (size_t)0)) < 0)
+        TEST_ERROR
+    if((size_t)str_len != HDstrlen(filename))
+        TEST_ERROR
+    HDassert((size_t)str_len < sizeof(name_out));
+    if((str_len = H5Pget_virtual_filename(dcpl, i, name_out, sizeof(name_out))) < 0)
+        TEST_ERROR
+    if((size_t)str_len != HDstrlen(filename))
+        TEST_ERROR
+    if(HDstrncmp(name_out, filename, (size_t)str_len + 1) != 0)
+        TEST_ERROR
+
+    /* Check dsetname */
+    if((str_len = H5Pget_virtual_dsetname(dcpl, i, NULL, (size_t)0)) < 0)
+        TEST_ERROR
+    if((size_t)str_len != HDstrlen(dsetname))
+        TEST_ERROR
+    HDassert((size_t)str_len < sizeof(name_out));
+    if((str_len = H5Pget_virtual_dsetname(dcpl, i, name_out, sizeof(name_out))) < 0)
+        TEST_ERROR
+    if((size_t)str_len != HDstrlen(dsetname))
+        TEST_ERROR
+    if(HDstrncmp(name_out, dsetname, (size_t)str_len + 1) != 0)
+        TEST_ERROR
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        if(space_out >= 0)
+            (void)H5Sclose(space_out);
+    } H5E_END_TRY
+
+    return -1;
+} /* end vds_check_mapping() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    test_api_get_ex_dcpl
+ *
+ * Purpose:     Tests API functions related to virtual datasets.
+ *
+ * Return:      Success:        0
+ *
+ *              Failure:        number of errors
+ *
+ * Programmer:  Neil Fortner
+ *              Monday, February 16, 2015
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+/* Helper function to get DCPL for examination depending on config */
+static int
+test_api_get_ex_dcpl(test_api_config_t config, hid_t fapl, hid_t dcpl,
+    hid_t *ex_dcpl, hid_t vspace, char *filename, hsize_t exp_meta_size)
+{
+    hid_t       file = -1;      /* File */
+    hid_t       dset = -1;      /* Virtual dataset */
+    void        *plist_buf = NULL; /* Serialized property list buffer */
+    H5O_info_t  oinfo;          /* Object info struct */
+    htri_t      tri_ret;
+
+    HDassert((config >= TEST_API_BASIC) && (config < TEST_API_NTESTS));
+    HDassert(fapl >= 0);
+    HDassert(dcpl >= 0);
+    HDassert(ex_dcpl);
+    HDassert(*ex_dcpl < 0);
+    HDassert(vspace >= 0);
+    HDassert(filename);
+
+    /* Take different action depending on test configuration */
+    if(config >= TEST_API_CREATE_DSET) {
+        /* Create file and dataset */
+        if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+        if((dset = H5Dcreate2(file, "vdset", H5T_NATIVE_INT, vspace, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+            TEST_ERROR
+
+        /* Reopen dataset if requested */
+        if(config >= TEST_API_REOPEN_DSET) {
+            /* Close dataset */
+            if(H5Dclose(dset) < 0)
+                TEST_ERROR
+            dset = -1;
+
+            /* Reopen file if requested */
+            if(config == TEST_API_REOPEN_FILE) {
+                if(H5Fclose(file) < 0)
+                    TEST_ERROR
+                file = -1;
+                if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+                    TEST_ERROR
+            } /* end if */
+
+            /* Open dataset */
+            if((dset = H5Dopen2(file, "vdset", H5P_DEFAULT)) < 0)
+                TEST_ERROR
+        } /* end if */
+
+        /* Get DCPL from dataset */
+        if((*ex_dcpl = H5Dget_create_plist(dset)) < 0)
+            TEST_ERROR
+
+        /* Test H5Dget_offset() (just returns HADDR_UNDEF) */
+        if(HADDR_UNDEF != H5Dget_offset(dset))
+            TEST_ERROR
+
+        /* Test H5Oget_info returns correct metadata size */
+        if(H5Oget_info(dset, &oinfo) < 0)
+            TEST_ERROR
+        if(oinfo.meta_size.obj.index_size != (hsize_t)0)
+            TEST_ERROR
+        if(config == TEST_API_REOPEN_FILE) {
+            if(oinfo.meta_size.obj.heap_size != exp_meta_size) {
+                printf("VDS metadata size: %llu Expected: %llu\n", (long long unsigned)oinfo.meta_size.obj.heap_size, (long long unsigned)exp_meta_size);
+                TEST_ERROR
+            } /* end if */
+        } /* end if */
+        else
+            if((oinfo.meta_size.obj.heap_size != exp_meta_size)
+                    && (oinfo.meta_size.obj.heap_size != (hsize_t)0))
+                TEST_ERROR
+        if(oinfo.meta_size.attr.index_size != (hsize_t)0)
+            TEST_ERROR
+        if(oinfo.meta_size.attr.index_size != (hsize_t)0)
+            TEST_ERROR
+
+        /* Close dataset */
+        if(H5Dclose(dset) < 0)
+            TEST_ERROR
+        dset = -1;
+
+        /* Delete dataset */
+        if(H5Ldelete(file, "vdset", H5P_DEFAULT) < 0)
+            TEST_ERROR
+
+        /* Close file */
+        if(H5Fclose(file) < 0)
+            TEST_ERROR
+        file = -1;
+    } /* end if */
+    else if(config == TEST_API_COPY_PLIST) {
+        /* Copy property list */
+        if((*ex_dcpl = H5Pcopy(dcpl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    else if(config == TEST_API_ENCDEC_PLIST) {
+        size_t plist_buf_size;
+
+        /* Encode property list to plist_buf */
+        if(H5Pencode(dcpl, NULL, &plist_buf_size) < 0)
+            TEST_ERROR
+        if(NULL == (plist_buf = HDmalloc(plist_buf_size)))
+            TEST_ERROR
+        if(H5Pencode(dcpl, plist_buf, &plist_buf_size) < 0)
+            TEST_ERROR
+
+        /* Decode serialized property list to *ex_dcpl */
+        if((*ex_dcpl = H5Pdecode(plist_buf)) < 0)
+            TEST_ERROR
+
+        /* Free plist_buf */
+        HDfree(plist_buf);
+        plist_buf = NULL;
+    } /* end if */
+    else {
+        /* Simply copy the id to ex_dcpl and increment the ref count so ex_dcpl
+         * can be closed */
+        if(H5Iinc_ref(dcpl) < 0)
+            TEST_ERROR
+        *ex_dcpl = dcpl;
+    } /* end else */
+
+    /* Verify examination DCPL is equal to original DCPL.  Do not compare the
+     * plist to itselt, and do not do the comparison if we reopened the file,
+     * because in that case the extent of the source dset will not be corrent.
+     */
+    if((*ex_dcpl != dcpl) && (config != TEST_API_REOPEN_FILE)) {
+        if((tri_ret = H5Pequal(dcpl, *ex_dcpl)) < 0)
+            TEST_ERROR
+        if(!tri_ret)
+            TEST_ERROR
+    } /* end if */
+
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        if(file >= 0)
+            (void)H5Fclose(file);
+        if(dset >= 0)
+            (void)H5Dclose(dset);
+    } H5E_END_TRY;
+    if(plist_buf)
+        HDfree(plist_buf);
+
+    return -1;
+} /* end test_api_get_ex_dcpl() */
+
+/* Main test function */
+static int
+test_api(test_api_config_t config, hid_t fapl)
+{
+    char        filename[FILENAME_BUF_SIZE];
+    hid_t       dcpl = -1;      /* Dataset creation property list */
+    hid_t       ex_dcpl = -1;   /* Temporary dcpl for examination */
+    hid_t       srcspace[4] = {-1, -1, -1, -1}; /* Source dataspaces */
+    hid_t       vspace[LIST_DOUBLE_SIZE]; /* Virtual dset dataspaces */
+    const char  *src_file[4] = {"src_file1", "src_file2.", "src_file3..", "src_file4..."}; /* Source file names (different lengths) */
+    const char  *src_dset[4] = {"src_dset1....", "src_dset2.....", "src_dset3......", "src_dset4......."}; /* Source dataset names (different lengths) */
+    char        tmp_filename[32];
+    char        tmp_dsetname[32];
+    hsize_t     dims[2] = {10, 20}; /* Data space current size */
+    hsize_t     start[2];       /* Hyperslab start */
+    hsize_t     stride[2];      /* Hyperslab stride */
+    hsize_t     count[2];       /* Hyperslab count */
+    hsize_t     block[2];       /* Hyperslab block */
+    hsize_t     coord[10];      /* Point selection array */
+    size_t      size_out;
+    herr_t      ret;
+    unsigned    i;
+
+    /* Initialize vspace */
+    for(i = 0; i < (unsigned)(sizeof(vspace) / sizeof(vspace[0])); i++)
+        vspace[i] = -1;
+
+    switch(config) {
+        case TEST_API_BASIC:
+            TESTING("virtual dataset API functions")
+            break;
+        case TEST_API_COPY_PLIST:
+            TESTING("virtual dataset API functions with copied plists")
+            break;
+        case TEST_API_ENCDEC_PLIST:
+            TESTING("virtual dataset API functions with encoded and decoded plists")
+            break;
+        case TEST_API_CREATE_DSET:
+            TESTING("virtual dataset create")
+            break;
+        case TEST_API_REOPEN_DSET:
+            TESTING("virtual dataset create with reopened dataset")
+            break;
+        case TEST_API_REOPEN_FILE:
+            TESTING("virtual dataset create with reopened file")
+            break;
+        case TEST_API_NTESTS:
+        default:
+            TEST_ERROR
+    } /* end switch */
+
+    h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
+
+    /* Create DCPL */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        TEST_ERROR
+
+
+    /*
+     * Test 1: All - all selection
+     */
+    /* Create source dataspace */
+    if((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspace */
+    if((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Select all (should not be necessary, but just to be sure) */
+    if(H5Sselect_all(srcspace[0]) < 0)
+        TEST_ERROR
+    if(H5Sselect_all(vspace[0]) < 0)
+        TEST_ERROR
+
+    /* Add virtual layout mapping */
+    if(H5Pset_virtual(dcpl, vspace[0], src_file[0], src_dset[0], srcspace[0]) < 0)
+        TEST_ERROR
+
+    /* Get examination DCPL */
+    if(test_api_get_ex_dcpl(config, fapl, dcpl, &ex_dcpl, vspace[0], filename, (hsize_t)69) < 0)
+        TEST_ERROR
+
+    /* Test H5Pget_virtual_count */
+    if(H5Pget_virtual_count(ex_dcpl, &size_out) < 0)
+        TEST_ERROR
+    if(size_out != (size_t)1)
+        TEST_ERROR
+
+    /* Check that the mapping in the DCPL is correct */
+    if(vds_check_mapping(ex_dcpl, (size_t)0, vspace[0], srcspace[0], src_file[0], src_dset[0]) < 0)
+        TEST_ERROR
+
+    /* Close */
+    if(H5Sclose(srcspace[0]) < 0)
+        TEST_ERROR
+    srcspace[0] = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+    if(H5Pclose(ex_dcpl) < 0)
+        TEST_ERROR
+    ex_dcpl = -1;
+
+
+    /*
+     * Test 2: Hyper - hyper selection
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create source dataspace */
+    if((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspace */
+    if((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Select regular hyperslab in source space */
+    start[0] = 2;
+    start[1] = 1;
+    stride[0] = 3;
+    stride[1] = 5;
+    count[0] = 2;
+    count[1] = 3;
+    block[0] = 2;
+    block[1] = 4;
+    if(H5Sselect_hyperslab(srcspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+
+    /* Select composite hyperslab in virtual space */
+    count[0] = 1;
+    count[1] = 1;
+    block[0] = 5;
+    block[1] = 6;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, count, block) < 0)
+        TEST_ERROR
+    start[0] = 7;
+    start[1] = 0;
+    block[0] = 1;
+    block[1] = 18;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_OR, start, NULL, count, block) < 0)
+        TEST_ERROR
+
+    /* Add virtual layout mapping */
+    if(H5Pset_virtual(dcpl, vspace[0], src_file[0], src_dset[0], srcspace[0]) < 0)
+        TEST_ERROR
+
+    /* Get examination DCPL */
+    if(test_api_get_ex_dcpl(config, fapl, dcpl, &ex_dcpl, vspace[0], filename, (hsize_t)213) < 0)
+        TEST_ERROR
+
+    /* Test H5Pget_virtual_count */
+    if(H5Pget_virtual_count(ex_dcpl, &size_out) < 0)
+        TEST_ERROR
+    if(size_out != (size_t)1)
+        TEST_ERROR
+
+    /* Check that the mapping in the DCPL is correct */
+    if(vds_check_mapping(ex_dcpl, (size_t)0, vspace[0], srcspace[0], src_file[0], src_dset[0]) < 0)
+        TEST_ERROR
+
+    /* Close */
+    if(H5Sclose(srcspace[0]) < 0)
+        TEST_ERROR
+    srcspace[0] = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+    if(H5Pclose(ex_dcpl) < 0)
+        TEST_ERROR
+    ex_dcpl = -1;
+
+
+#ifdef VDS_POINT_SELECTIONS /* VDS does not currently support point selections */
+    /*
+     * Test 3: Point - point selection
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create source dataspace */
+    if((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspace */
+    if((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Select points in source space */
+    coord[0] = 5;
+    coord[1] = 15;
+    coord[2] = 7;
+    coord[3] = 19;
+    coord[4] = 8;
+    coord[5] = 0;
+    coord[6] = 2;
+    coord[7] = 14;
+    coord[8] = 8;
+    coord[9] = 18;
+    if(H5Sselect_elements(srcspace[0], H5S_SELECT_SET, (size_t)5, coord) < 0)
+        TEST_ERROR
+
+    /* Select points in virtual space */
+    coord[0] = 3;
+    coord[1] = 12;
+    coord[2] = 7;
+    coord[3] = 11;
+    coord[4] = 4;
+    coord[5] = 9;
+    coord[6] = 7;
+    coord[7] = 11;
+    coord[8] = 5;
+    coord[9] = 5;
+    if(H5Sselect_elements(vspace[0], H5S_SELECT_SET, (size_t)5, coord) < 0)
+        TEST_ERROR
+
+    /* Add virtual layout mapping */
+    if(H5Pset_virtual(dcpl, vspace[0], src_file[0], src_dset[0], srcspace[0]) < 0)
+        TEST_ERROR
+
+    /* Get examination DCPL */
+    if(test_api_get_ex_dcpl(config, fapl, dcpl, &ex_dcpl, vspace[0], filename, (hsize_t)0) < 0)
+        TEST_ERROR
+
+    /* Test H5Pget_virtual_count */
+    if(H5Pget_virtual_count(ex_dcpl, &size_out) < 0)
+        TEST_ERROR
+    if(size_out != (size_t)1)
+        TEST_ERROR
+
+    /* Check that the mapping in the DCPL is correct */
+    if(vds_check_mapping(ex_dcpl, (size_t)0, vspace[0], srcspace[0], src_file[0], src_dset[0]) < 0)
+        TEST_ERROR
+
+    /* Close */
+    if(H5Sclose(srcspace[0]) < 0)
+        TEST_ERROR
+    srcspace[0] = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+    if(H5Pclose(ex_dcpl) < 0)
+        TEST_ERROR
+    ex_dcpl = -1;
+
+
+    /*
+     * Test 4: Point - hyper selection
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create source dataspace */
+    if((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspace */
+    if((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Select hyperslab in source space */
+    start[0] = 2;
+    start[1] = 7;
+    count[0] = 1;
+    count[1] = 1;
+    block[0] = 1;
+    block[1] = 5;
+    if(H5Sselect_hyperslab(srcspace[0], H5S_SELECT_SET, start, NULL, count, block) < 0)
+        TEST_ERROR
+
+    /* Select points in virtual space */
+    coord[0] = 1;
+    coord[1] = 1;
+    coord[2] = 4;
+    coord[3] = 17;
+    coord[4] = 3;
+    coord[5] = 9;
+    coord[6] = 5;
+    coord[7] = 13;
+    coord[8] = 7;
+    coord[9] = 16;
+    if(H5Sselect_elements(vspace[0], H5S_SELECT_SET, (size_t)5, coord) < 0)
+        TEST_ERROR
+
+    /* Add virtual layout mapping */
+    if(H5Pset_virtual(dcpl, vspace[0], src_file[0], src_dset[0], srcspace[0]) < 0)
+        TEST_ERROR
+
+    /* Get examination DCPL */
+    if(test_api_get_ex_dcpl(config, fapl, dcpl, &ex_dcpl, vspace[0], filename, (hsize_t)0) < 0)
+        TEST_ERROR
+
+    /* Test H5Pget_virtual_count */
+    if(H5Pget_virtual_count(ex_dcpl, &size_out) < 0)
+        TEST_ERROR
+    if(size_out != (size_t)1)
+        TEST_ERROR
+
+    /* Check that the mapping in the DCPL is correct */
+    if(vds_check_mapping(ex_dcpl, (size_t)0, vspace[0], srcspace[0], src_file[0], src_dset[0]) < 0)
+        TEST_ERROR
+
+    /* Close */
+    if(H5Sclose(srcspace[0]) < 0)
+        TEST_ERROR
+    srcspace[0] = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+    if(H5Pclose(ex_dcpl) < 0)
+        TEST_ERROR
+    ex_dcpl = -1;
+
+
+    /*
+     * Test 5: All previous mappings together
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create dataspaces */
+    for(i = 0; i < 4; i++) {
+        /* Create source dataspace */
+        if((srcspace[i] = H5Screate_simple(2, dims, NULL)) < 0)
+            TEST_ERROR
+
+        /* Create virtual dataspace */
+        if((vspace[i] = H5Screate_simple(2, dims, NULL)) < 0)
+            TEST_ERROR
+    } /* end for */
+
+    /* Select all (should not be necessary, but just to be sure) */
+    if(H5Sselect_all(srcspace[0]) < 0)
+        TEST_ERROR
+    if(H5Sselect_all(vspace[0]) < 0)
+        TEST_ERROR
+
+    /* Select regular hyperslab in source space */
+    start[0] = 2;
+    start[1] = 1;
+    stride[0] = 3;
+    stride[1] = 5;
+    count[0] = 2;
+    count[1] = 3;
+    block[0] = 2;
+    block[1] = 4;
+    if(H5Sselect_hyperslab(srcspace[1], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+
+    /* Select composite hyperslab in virtual space */
+    count[0] = 1;
+    count[1] = 1;
+    block[0] = 5;
+    block[1] = 6;
+    if(H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, NULL, count, block) < 0)
+        TEST_ERROR
+    start[0] = 7;
+    start[1] = 0;
+    block[0] = 1;
+    block[1] = 18;
+    if(H5Sselect_hyperslab(vspace[1], H5S_SELECT_OR, start, NULL, count, block) < 0)
+        TEST_ERROR
+
+    /* Select points in source space */
+    coord[0] = 5;
+    coord[1] = 15;
+    coord[2] = 7;
+    coord[3] = 19;
+    coord[4] = 8;
+    coord[5] = 0;
+    coord[6] = 2;
+    coord[7] = 14;
+    coord[8] = 8;
+    coord[9] = 18;
+    if(H5Sselect_elements(srcspace[2], H5S_SELECT_SET, (size_t)5, coord) < 0)
+        TEST_ERROR
+
+    /* Select points in virtual space */
+    coord[0] = 3;
+    coord[1] = 12;
+    coord[2] = 7;
+    coord[3] = 11;
+    coord[4] = 4;
+    coord[5] = 9;
+    coord[6] = 7;
+    coord[7] = 11;
+    coord[8] = 5;
+    coord[9] = 5;
+    if(H5Sselect_elements(vspace[2], H5S_SELECT_SET, (size_t)5, coord) < 0)
+        TEST_ERROR
+
+    /* Select hyperslab in source space */
+    start[0] = 2;
+    start[1] = 7;
+    count[0] = 1;
+    count[1] = 1;
+    block[0] = 1;
+    block[1] = 5;
+    if(H5Sselect_hyperslab(srcspace[3], H5S_SELECT_SET, start, NULL, count, block) < 0)
+        TEST_ERROR
+
+    /* Select points in virtual space */
+    coord[0] = 1;
+    coord[1] = 1;
+    coord[2] = 4;
+    coord[3] = 17;
+    coord[4] = 3;
+    coord[5] = 9;
+    coord[6] = 5;
+    coord[7] = 13;
+    coord[8] = 7;
+    coord[9] = 16;
+    if(H5Sselect_elements(vspace[3], H5S_SELECT_SET, (size_t)5, coord) < 0)
+        TEST_ERROR
+
+    /* Add virtual layout mappings */
+    for(i = 0; i < 4; i++)
+        if(H5Pset_virtual(dcpl, vspace[i], src_file[i], src_dset[i], srcspace[i]) < 0)
+            TEST_ERROR
+
+    /* Get examination DCPL */
+    if(test_api_get_ex_dcpl(config, fapl, dcpl, &ex_dcpl, vspace[0], filename, (hsize_t)0) < 0)
+        TEST_ERROR
+
+    /* Test H5Pget_virtual_count */
+    if(H5Pget_virtual_count(ex_dcpl, &size_out) < 0)
+        TEST_ERROR
+    if(size_out != (size_t)4)
+        TEST_ERROR
+
+    /* Check that the mappings in the DCPL are correct */
+    for(i = 0; i < 4; i++)
+        if(vds_check_mapping(ex_dcpl, (size_t)i, vspace[i], srcspace[i], src_file[i], src_dset[i]) < 0)
+            TEST_ERROR
+
+    /* Close */
+    for(i = 0; i < 4; i++) {
+        if(H5Sclose(srcspace[i]) < 0)
+            TEST_ERROR
+        srcspace[i] = -1;
+        if(H5Sclose(vspace[i]) < 0)
+            TEST_ERROR
+        vspace[i] = -1;
+    } /* end for */
+    if(H5Pclose(ex_dcpl) < 0)
+        TEST_ERROR
+    ex_dcpl = -1;
+
+#else /* VDS_POINT_SELECTIONS */
+
+    /*
+     * Test 3: Verify point selections fail
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create source dataspace */
+    if((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspace */
+    if((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Select points in source space */
+    coord[0] = 5;
+    coord[1] = 15;
+    coord[2] = 7;
+    coord[3] = 19;
+    coord[4] = 8;
+    coord[5] = 0;
+    coord[6] = 2;
+    coord[7] = 14;
+    coord[8] = 8;
+    coord[9] = 18;
+    if(H5Sselect_elements(srcspace[0], H5S_SELECT_SET, (size_t)5, coord) < 0)
+        TEST_ERROR
+
+    /* Select points in virtual space */
+    coord[0] = 3;
+    coord[1] = 12;
+    coord[2] = 7;
+    coord[3] = 11;
+    coord[4] = 4;
+    coord[5] = 9;
+    coord[6] = 7;
+    coord[7] = 11;
+    coord[8] = 5;
+    coord[9] = 5;
+    if(H5Sselect_elements(vspace[0], H5S_SELECT_SET, (size_t)5, coord) < 0)
+        TEST_ERROR
+
+    /* Attempt to add virtual layout mapping */
+    H5E_BEGIN_TRY {
+        ret = H5Pset_virtual(dcpl, vspace[0], src_file[0], src_dset[0], srcspace[0]);
+    } H5E_END_TRY
+    if(ret >= 0)
+        TEST_ERROR
+#endif /* VDS_POINT_SELECTIONS */
+
+
+    /*
+     * Test 6: Enough Selections to trigger doubling of mapping list
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create source dataspace */
+    dims[0] = 1;
+    if((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Select all in source space (should not be necessary, but just to be sure) */
+    if(H5Sselect_all(srcspace[0]) < 0)
+        TEST_ERROR
+
+    /* Init virtual space extent */
+    dims[0] = LIST_DOUBLE_SIZE;
+
+    /* Init hyperslab values */
+    start[0] = 0;
+    start[1] = 0;
+    count[0] = 1;
+    count[1] = 1;
+    block[0] = 1;
+    block[1] = 20;
+
+    /* Build virtual layout */
+    for(i = 0; i < LIST_DOUBLE_SIZE; i++) {
+        /* Create virtual dataspace */
+        if((vspace[i] = H5Screate_simple(2, dims, NULL)) < 0)
+            TEST_ERROR
+
+        /* Select row in virual dataspace */
+        start[0] = (hsize_t)i;
+        if(H5Sselect_hyperslab(vspace[i], H5S_SELECT_SET, start, NULL, count, block) < 0)
+            TEST_ERROR
+
+        /* Create file and dataset names */
+        (void)HDsnprintf(tmp_filename, sizeof(tmp_filename), "src_file%u", i);
+        tmp_filename[sizeof(tmp_filename) - 1] = '\0';
+        (void)HDsnprintf(tmp_dsetname, sizeof(tmp_dsetname), "src_dset%u", i);
+        tmp_dsetname[sizeof(tmp_dsetname) - 1] = '\0';
+
+        /* Add virtual layout mapping */
+        if(H5Pset_virtual(dcpl, vspace[i], tmp_filename, tmp_dsetname, srcspace[0]) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get examination DCPL */
+    if(test_api_get_ex_dcpl(config, fapl, dcpl, &ex_dcpl, vspace[0], filename, (hsize_t)697) < 0)
+        TEST_ERROR
+
+    /* Test H5Pget_virtual_count */
+    if(H5Pget_virtual_count(ex_dcpl, &size_out) < 0)
+        TEST_ERROR
+    if(size_out != (size_t)LIST_DOUBLE_SIZE)
+        TEST_ERROR
+
+    /* Verify virtual layout */
+    for(i = 0; i < LIST_DOUBLE_SIZE; i++) {
+        /* Generate source file name */
+        (void)HDsnprintf(tmp_filename, sizeof(tmp_filename), "src_file%u", i);
+        tmp_filename[sizeof(tmp_filename) - 1] = '\0';
+
+        /* Generate source dset name */
+        (void)HDsnprintf(tmp_dsetname, sizeof(tmp_dsetname), "src_dset%u", i);
+        tmp_dsetname[sizeof(tmp_dsetname) - 1] = '\0';
+
+        /* Check that the mapping in the DCPL is correct */
+        if(vds_check_mapping(ex_dcpl, (size_t)i, vspace[i], srcspace[0], tmp_filename, tmp_dsetname) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Close */
+    if(H5Sclose(srcspace[0]) < 0)
+        TEST_ERROR
+    srcspace[0] = -1;
+    for(i = 0; i < LIST_DOUBLE_SIZE; i++) {
+        if(H5Sclose(vspace[i]) < 0)
+            TEST_ERROR
+        vspace[i] = -1;
+    } /* end for */
+    if(H5Pclose(ex_dcpl) < 0)
+        TEST_ERROR
+    ex_dcpl = -1;
+
+
+    /*
+     * Test 7: Empty VDS
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspace */
+    if((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Select all (should not be necessary, but just to be sure) */
+    if(H5Sselect_all(vspace[0]) < 0)
+        TEST_ERROR
+
+    /* Get examination DCPL */
+    if(test_api_get_ex_dcpl(config, fapl, dcpl, &ex_dcpl, vspace[0], filename, (hsize_t)0) < 0)
+        TEST_ERROR
+
+    /* Test H5Pget_virtual_count */
+    if(H5Pget_virtual_count(ex_dcpl, &size_out) < 0)
+        TEST_ERROR
+    if(size_out != (size_t)0)
+        TEST_ERROR
+
+    /* Close */
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+    if(H5Pclose(ex_dcpl) < 0)
+        TEST_ERROR
+    ex_dcpl = -1;
+
+
+    /* Close */
+    if(H5Pclose(dcpl) < 0)
+        TEST_ERROR
+    dcpl = -1;
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        for(i = 0; i < (sizeof(srcspace) / sizeof(srcspace[0])); i++) {
+            if(srcspace[i] >= 0)
+                (void)H5Sclose(srcspace[i]);
+        } /* end for */
+        for(i = 0; i < (sizeof(vspace) / sizeof(vspace[0])); i++) {
+            if(vspace[i] >= 0)
+                (void)H5Sclose(vspace[i]);
+        } /* end for */
+        if(dcpl >= 0)
+            (void)H5Pclose(dcpl);
+        if(ex_dcpl >= 0)
+            (void)H5Pclose(ex_dcpl);
+    } H5E_END_TRY;
+
+     return 1;
+} /* end test_api() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    test_basic_io
+ *
+ * Purpose:     Tests VDS I/O without unlimited selections or
+ *              pattern-matching file/dataset strings
+ *
+ * Return:      Success:        0
+ *
+ *              Failure:        number of errors
+ *
+ * Programmer:  Neil Fortner
+ *              Tuesday, March 3, 2015
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_basic_io(unsigned config, hid_t fapl)
+{
+    char        srcfilename[FILENAME_BUF_SIZE];
+    char        srcfilename_map[FILENAME_BUF_SIZE];
+    char        vfilename[FILENAME_BUF_SIZE];
+    char        vfilename2[FILENAME_BUF_SIZE];
+    char        srcfilenamepct[FILENAME_BUF_SIZE];
+    char        srcfilenamepct_map[FILENAME_BUF_SIZE];
+    const char *srcfilenamepct_map_orig = "vds%%%%_src";
+    hid_t       srcfile[4] = {-1, -1, -1, -1}; /* Files with source dsets */
+    hid_t       vfile = -1;     /* File with virtual dset */
+    hid_t       vfile2 = -1;    /* File with copied virtual dset */
+    hid_t       dcpl = -1;      /* Dataset creation property list */
+    hid_t       srcspace[4] = {-1, -1, -1, -1}; /* Source dataspaces */
+    hid_t       vspace[4] = {-1, -1, -1, -1}; /* Virtual dset dataspaces */
+    hid_t       memspace = -1;  /* Memory dataspace */
+    hid_t       srcdset[4] = {-1, -1, -1, -1}; /* Source datsets */
+    hid_t       vdset = -1;     /* Virtual dataset */
+    hsize_t     dims[4] = {10, 26, 0, 0}; /* Data space current size */
+    hsize_t     start[4];       /* Hyperslab start */
+    hsize_t     stride[4];      /* Hyperslab stride */
+    hsize_t     count[4];       /* Hyperslab count */
+    hsize_t     block[4];       /* Hyperslab block */
+    hssize_t    offset[2] = {0, 0}; /* Selection offset */
+    int         buf[10][26];    /* Write and expected read buffer */
+    int         rbuf[10][26];   /* Read buffer */
+    int         rbuf99[9][9];   /* 9x9 Read buffer */
+    int         evbuf[10][26];  /* Expected VDS "buffer" */
+    int         erbuf[10][26];  /* Expected read buffer */
+    int         fill = -1;      /* Fill value */
+    herr_t      ret;            /* Generic return value */
+    int         i, j;
+
+    TESTING("basic virtual dataset I/O")
+
+    h5_fixname(FILENAME[0], fapl, vfilename, sizeof vfilename);
+    h5_fixname(FILENAME[1], fapl, vfilename2, sizeof vfilename2);
+    h5_fixname(FILENAME[2], fapl, srcfilename, sizeof srcfilename);
+    h5_fixname_printf(FILENAME[2], fapl, srcfilename_map, sizeof srcfilename_map);
+    h5_fixname(FILENAME[4], fapl, srcfilenamepct, sizeof srcfilenamepct);
+    h5_fixname_printf(srcfilenamepct_map_orig, fapl, srcfilenamepct_map, sizeof srcfilenamepct_map);
+
+    /* Create DCPL */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        TEST_ERROR
+
+    /* Set fill value */
+    if(H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fill) < 0)
+        TEST_ERROR
+
+    /*
+     * Test 1: All - all selection
+     */
+    /* Create source dataspace */
+    if((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspace */
+    if((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Select all (should not be necessary, but just to be sure) */
+    if(H5Sselect_all(srcspace[0]) < 0)
+        TEST_ERROR
+    if(H5Sselect_all(vspace[0]) < 0)
+        TEST_ERROR
+
+    /* Add virtual layout mapping */
+    if(H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset", srcspace[0]) < 0)
+        TEST_ERROR
+
+    /* Create virtual file */
+    if((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create source file if requested */
+    if(config & TEST_IO_DIFFERENT_FILE) {
+        if((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    else {
+        srcfile[0] = vfile;
+        if(H5Iinc_ref(srcfile[0]) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Create source dataset */
+    if((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataset */
+    if((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Populate write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] = (i * (int)(sizeof(buf[0]) / sizeof(buf[0][0]))) + j;
+
+    /* Write data directly to source dataset */
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Close srcdset and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Read data through virtual dataset */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+    if(H5Dread(vdset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if(rbuf[i][j] != buf[i][j])
+                TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
+
+    /* Write data through virtual dataset */
+    if(H5Dwrite(vdset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Reopen srcdset and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDONLY, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[0] = H5Dopen2(srcfile[0], "src_dset", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Read data directly from source dataset */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+    if(H5Dread(srcdset[0], H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if(rbuf[i][j] != buf[i][j])
+                TEST_ERROR
+
+    /* Close */
+    if(H5Dclose(srcdset[0]) < 0)
+        TEST_ERROR
+    srcdset[0] = -1;
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    vdset = -1;
+    if(H5Fclose(srcfile[0]) < 0)
+        TEST_ERROR
+    srcfile[0] = -1;
+    if(H5Fclose(vfile) < 0)
+        TEST_ERROR
+    vfile = -1;
+    if(H5Sclose(srcspace[0]) < 0)
+        TEST_ERROR
+    srcspace[0] = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+
+
+    /*
+     * Test 2: 2 Source datasets, hyperslab virtual mappings, '%' in source
+     * dataset name, also test H5Ocopy()
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspaces */
+    if((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+    if((vspace[1] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Create source dataspace */
+    dims[1] = 13;
+    if((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Select all in source space (should not be necessary, but just to be sure)
+     */
+    if(H5Sselect_all(srcspace[0]) < 0)
+        TEST_ERROR
+
+    /* Select hyperslabs in virtual spaces */
+    start[0] = 0;
+    start[1] = 0;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+    start[1] = 13;
+    if(H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Add virtual layout mappings */
+    if(H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "%%src_dset1", srcspace[0]) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset2%%", srcspace[0]) < 0)
+        TEST_ERROR
+
+    /* Reset dims */
+    dims[1] = 26;
+
+    /* Create virtual file */
+    if((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create source file if requested */
+    if(config & TEST_IO_DIFFERENT_FILE) {
+        if((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    else {
+        srcfile[0] = vfile;
+        if(H5Iinc_ref(srcfile[0]) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Create source datasets */
+    if((srcdset[0] = H5Dcreate2(srcfile[0], "%src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2%", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataset */
+    if((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Populate write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] = (i * (int)(sizeof(buf[0]) / sizeof(buf[0][0]))) + j;
+
+    /* Write data directly to source datasets */
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, vspace[1], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Close srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Read data through virtual dataset */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+    if(H5Dread(vdset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if(rbuf[i][j] != buf[i][j])
+                TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
+
+    /* Write data through virtual dataset */
+    if(H5Dwrite(vdset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Reopen srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[0] = H5Dopen2(srcfile[0], "%src_dset1", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+        if((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2%", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Read data directly from source datasets */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+    if(H5Dread(srcdset[0], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+    if(H5Dread(srcdset[1], H5T_NATIVE_INT, vspace[1], H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if(rbuf[i][j] != buf[i][j])
+                TEST_ERROR
+
+    /* Test H5Ocopy() to same file */
+    /* Copy virtual dataset */
+    if(H5Ocopy(vfile, "v_dset", vfile, "v_dset2", H5P_DEFAULT, H5P_DEFAULT) < 0)
+        TEST_ERROR
+
+    /* Close v_dset */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    vdset = -1;
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
+
+    /* Write data directly to source datasets */
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, vspace[1], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Close srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Open v_dset2 */
+    if((vdset = H5Dopen2(vfile, "v_dset2", H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Read data through copied virtual dataset */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+    if(H5Dread(vdset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if(rbuf[i][j] != buf[i][j])
+                TEST_ERROR
+
+    /* Reopen srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[0] = H5Dopen2(srcfile[0], "%src_dset1", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+        if((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2%", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Only copy to a different file if the source datasets are in a different
+     * file */
+    if(config & TEST_IO_DIFFERENT_FILE) {
+        /* Close v_dset2 */
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+
+        /* Create file to copy virtual dataset to */
+        if((vfile2 = H5Fcreate(vfilename2, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+
+        /* Copy virtual dataset */
+        if(H5Ocopy(vfile, "v_dset", vfile2, "v_dset3", H5P_DEFAULT, H5P_DEFAULT) < 0)
+            TEST_ERROR
+
+        /* Adjust write buffer */
+        for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+            for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+                buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
+
+        /* Write data directly to source datasets */
+        if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+            TEST_ERROR
+        if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, vspace[1], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+            TEST_ERROR
+
+        /* Close srcdsets and srcfile if config option specified */
+        if(config & TEST_IO_CLOSE_SRC) {
+            if(H5Dclose(srcdset[0]) < 0)
+                TEST_ERROR
+            srcdset[0] = -1;
+            if(H5Dclose(srcdset[1]) < 0)
+                TEST_ERROR
+            srcdset[1] = -1;
+
+            if(config & TEST_IO_DIFFERENT_FILE) {
+                if(H5Fclose(srcfile[0]) < 0)
+                    TEST_ERROR
+                srcfile[0] = -1;
+            } /* end if */
+        } /* end if */
+
+        /* Reopen copied virtual file if config option specified */
+        if(config & TEST_IO_REOPEN_VIRT) {
+            if(H5Fclose(vfile2) < 0)
+                TEST_ERROR
+            vfile2 = -1;
+            if((vfile2 = H5Fopen(vfilename2, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+        } /* end if */
+
+        /* Open v_dset3 */
+        if((vdset = H5Dopen2(vfile2, "v_dset3", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+
+        /* Read data through copied virtual dataset */
+        HDmemset(rbuf[0], 0, sizeof(rbuf));
+        if(H5Dread(vdset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+            TEST_ERROR
+
+        /* Verify read data */
+        for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+            for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+                if(rbuf[i][j] != buf[i][j])
+                    TEST_ERROR
+
+        /* Reopen srcdsets and srcfile if config option specified */
+        if(config & TEST_IO_CLOSE_SRC) {
+            if(config & TEST_IO_DIFFERENT_FILE)
+                if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDONLY, fapl)) < 0)
+                    TEST_ERROR
+            if((srcdset[0] = H5Dopen2(srcfile[0], "%src_dset1", H5P_DEFAULT)) < 0)
+                TEST_ERROR
+            if((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2%", H5P_DEFAULT)) < 0)
+                TEST_ERROR
+        } /* end if */
+
+        /* Close copied virtual file */
+        if(H5Fclose(vfile2) < 0)
+            TEST_ERROR
+        vfile2 = -1;
+    } /* end if */
+
+    /* Close */
+    if(H5Dclose(srcdset[0]) < 0)
+        TEST_ERROR
+    srcdset[0] = -1;
+    if(H5Dclose(srcdset[1]) < 0)
+        TEST_ERROR
+    srcdset[1] = -1;
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    vdset = -1;
+    if(H5Fclose(srcfile[0]) < 0)
+        TEST_ERROR
+    srcfile[0] = -1;
+    if(H5Fclose(vfile) < 0)
+        TEST_ERROR
+    vfile = -1;
+    if(H5Sclose(srcspace[0]) < 0)
+        TEST_ERROR
+    srcspace[0] = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+    if(H5Sclose(vspace[1]) < 0)
+        TEST_ERROR
+    vspace[1] = -1;
+
+
+    /*
+     * Test 3: 2 Source datasets, hyperslab virtual mappings with offsets
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspaces */
+    if((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Create source dataspace */
+    dims[1] = 13;
+    if((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Select all in source space (should not be necessary, but just to be sure)
+     */
+    if(H5Sselect_all(srcspace[0]) < 0)
+        TEST_ERROR
+
+    /* Select hyperslabs in virtual spaces */
+    start[0] = 0;
+    start[1] = 3;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Add virtual layout mappings */
+    offset[1] = -3;
+    if(H5Soffset_simple(vspace[0], offset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "%%src_dset1", srcspace[0]) < 0)
+        TEST_ERROR
+    offset[1] = 10;
+    if(H5Soffset_simple(vspace[0], offset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset2%%", srcspace[0]) < 0)
+        TEST_ERROR
+
+    /* Reset dims */
+    dims[1] = 26;
+
+    /* Create virtual file */
+    if((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create source file if requested */
+    if(config & TEST_IO_DIFFERENT_FILE) {
+        if((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    else {
+        srcfile[0] = vfile;
+        if(H5Iinc_ref(srcfile[0]) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Create source datasets */
+    if((srcdset[0] = H5Dcreate2(srcfile[0], "%src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2%", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataset */
+    if((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Populate write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] = (i * (int)(sizeof(buf[0]) / sizeof(buf[0][0]))) + j;
+
+    /* Write data directly to source datasets */
+    offset[1] = -3;
+    if(H5Soffset_simple(vspace[0], offset) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+    offset[1] = 10;
+    if(H5Soffset_simple(vspace[0], offset) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Close srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Read data through virtual dataset */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+    if(H5Dread(vdset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if(rbuf[i][j] != buf[i][j])
+                TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
+
+    /* Write data through virtual dataset */
+    if(H5Dwrite(vdset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Reopen srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDONLY, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[0] = H5Dopen2(srcfile[0], "%src_dset1", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+        if((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2%", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Read data directly from source datasets */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+    offset[1] = -3;
+    if(H5Soffset_simple(vspace[0], offset) < 0)
+        TEST_ERROR
+    if(H5Dread(srcdset[0], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+    offset[1] = 10;
+    if(H5Soffset_simple(vspace[0], offset) < 0)
+        TEST_ERROR
+    if(H5Dread(srcdset[1], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if(rbuf[i][j] != buf[i][j])
+                TEST_ERROR
+
+    /* Close */
+    if(H5Dclose(srcdset[0]) < 0)
+        TEST_ERROR
+    srcdset[0] = -1;
+    if(H5Dclose(srcdset[1]) < 0)
+        TEST_ERROR
+    srcdset[1] = -1;
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    vdset = -1;
+    if(H5Fclose(srcfile[0]) < 0)
+        TEST_ERROR
+    srcfile[0] = -1;
+    if(H5Fclose(vfile) < 0)
+        TEST_ERROR
+    vfile = -1;
+    if(H5Sclose(srcspace[0]) < 0)
+        TEST_ERROR
+    srcspace[0] = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+
+
+    /*
+     * Test 4: 2 Source datasets, hyperslab virtual mappings on one mapping at a
+     * time, '%' in source file name
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspaces */
+    if((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+    if((vspace[1] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Create source dataspace */
+    dims[1] = 13;
+    if((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Select all in source space (should not be necessary, but just to be sure)
+     */
+    if(H5Sselect_all(srcspace[0]) < 0)
+        TEST_ERROR
+
+    /* Select hyperslabs in virtual spaces */
+    start[0] = 0;
+    start[1] = 0;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+    start[1] = 13;
+    if(H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Add virtual layout mappings */
+    if(H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilenamepct_map : ".", "src_dset1", srcspace[0]) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilenamepct_map : ".", "src_dset2", srcspace[0]) < 0)
+        TEST_ERROR
+
+    /* Reset dims */
+    dims[1] = 26;
+
+    /* Create virtual file */
+    if((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create source file if requested */
+    if(config & TEST_IO_DIFFERENT_FILE) {
+        if((srcfile[0] = H5Fcreate(srcfilenamepct, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    else {
+        srcfile[0] = vfile;
+        if(H5Iinc_ref(srcfile[0]) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Create source datasets */
+    if((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataset */
+    if((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Populate write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] = (i * (int)(sizeof(buf[0]) / sizeof(buf[0][0]))) + j;
+
+    /* Write data directly to source datasets */
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, vspace[1], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Close srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Read first source dataset through virtual dataset */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+    if(H5Dread(vdset, H5T_NATIVE_INT, vspace[0], vspace[0], H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if(rbuf[i][j] != (j < (int)(sizeof(buf[0]) / sizeof(buf[0][0]) / 2)
+                    ? buf[i][j] : 0))
+                TEST_ERROR
+
+    /* Read second source dataset through virtual dataset */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+    if(H5Dread(vdset, H5T_NATIVE_INT, vspace[1], vspace[1], H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if(rbuf[i][j] != (j < (int)(sizeof(buf[0]) / sizeof(buf[0][0]) / 2)
+                    ? 0 : buf[i][j]))
+                TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
+
+    /* Write first source dataset through virtual dataset */
+    if(H5Dwrite(vdset, H5T_NATIVE_INT, vspace[0], vspace[0], H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
+
+    /* Write second source dataset through virtual dataset */
+    if(H5Dwrite(vdset, H5T_NATIVE_INT, vspace[1], vspace[1], H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Reopen srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilenamepct, H5F_ACC_RDONLY, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[0] = H5Dopen2(srcfile[0], "src_dset1", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+        if((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Read data directly from source datasets */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+    if(H5Dread(srcdset[0], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+    if(H5Dread(srcdset[1], H5T_NATIVE_INT, vspace[1], H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if(rbuf[i][j] != (j < (int)(sizeof(buf[0]) / sizeof(buf[0][0]) / 2)
+                    ? (buf[i][j] - (int)(sizeof(buf) / sizeof(buf[0][0])))
+                    : buf[i][j]))
+                TEST_ERROR
+
+    /* Close */
+    if(H5Dclose(srcdset[0]) < 0)
+        TEST_ERROR
+    srcdset[0] = -1;
+    if(H5Dclose(srcdset[1]) < 0)
+        TEST_ERROR
+    srcdset[1] = -1;
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    vdset = -1;
+    if(H5Fclose(srcfile[0]) < 0)
+        TEST_ERROR
+    srcfile[0] = -1;
+    if(H5Fclose(vfile) < 0)
+        TEST_ERROR
+    vfile = -1;
+    if(H5Sclose(srcspace[0]) < 0)
+        TEST_ERROR
+    srcspace[0] = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+    if(H5Sclose(vspace[1]) < 0)
+        TEST_ERROR
+    vspace[1] = -1;
+
+
+    /*
+     * Test 5: 2 Source datasets, hyperslab virtual mappings and selections
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspaces */
+    if((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+    if((vspace[1] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Create source dataspaces */
+    if((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+    if((srcspace[1] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Select hyperslabs in source space */
+    start[0] = 0;
+    start[1] = 0;
+    count[0] = 10;
+    count[1] = 13;
+    if(H5Sselect_hyperslab(srcspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    start[1] = 13;
+    if(H5Sselect_hyperslab(srcspace[1], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+
+    /* Select hyperslabs in virtual spaces */
+    start[0] = 0;
+    start[1] = 0;
+    count[0] = 5;
+    count[1] = 26;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    start[0] = 5;
+    if(H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+
+    /* Add virtual layout mappings */
+    if(H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset1", srcspace[0]) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset2", srcspace[1]) < 0)
+        TEST_ERROR
+
+    /* Create virtual file */
+    if((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create source file if requested */
+    if(config & TEST_IO_DIFFERENT_FILE) {
+        if((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    else {
+        srcfile[0] = vfile;
+        if(H5Iinc_ref(srcfile[0]) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Create source datasets */
+    if((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2", H5T_NATIVE_INT, srcspace[1], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataset */
+    if((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Populate write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] = (i * (int)(sizeof(buf[0]) / sizeof(buf[0][0]))) + j;
+
+    /* Write data directly to source datasets */
+    /* Write first dataset */
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update evbuf */
+    for(i = 0; i < 5; i++) {
+        for(j = 0; j < 13; j++)
+            evbuf[i][j] = buf[2 * i][j];
+        for(/* j = 13 */; j < 26; j++)
+            evbuf[i][j] = buf[2 * i + 1][j - 13];
+    } /* end for */
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
+
+    /* Write second dataset */
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update evbuf */
+    for(i = 0; i < 5; i++) {
+        for(j = 0; j < 13; j++)
+            evbuf[i + 5][j] = buf[2 * i][j + 13];
+        for(/* j = 13 */; j < 26; j++)
+            evbuf[i + 5][j] = buf[2 * i + 1][j];
+    } /* end for */
+
+    /* Close srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Read data through virtual dataset by hyperslab */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Read first slice */
+    if(H5Dread(vdset, H5T_NATIVE_INT, vspace[0], srcspace[0], H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 5; i++) {
+        for(j = 0; j < 13; j++)
+            erbuf[i][j] = evbuf[2 * i][j];
+        for(/* j = 13 */; j < 26; j++)
+            erbuf[i][j] = evbuf[2 * i + 1][j - 13];
+    } /* end for */
+
+    /* Read second slice */
+    if(H5Dread(vdset, H5T_NATIVE_INT, vspace[1], srcspace[1], H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 5; i++) {
+        for(j = 0; j < 13; j++)
+            erbuf[i + 5][j] = evbuf[2 * i][j + 13];
+        for(/* j = 13 */; j < 26; j++)
+            erbuf[i + 5][j] = evbuf[2 * i + 1][j];
+    } /* end for */
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if(rbuf[i][j] != erbuf[i][j])
+                TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
+
+    /* Write data through virtual dataset */
+    /* Write first slice */
+    if(H5Dwrite(vdset, H5T_NATIVE_INT, vspace[0], srcspace[0], H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update evbuf */
+    for(i = 0; i < 5; i++) {
+        for(j = 0; j < 13; j++)
+            evbuf[2 * i][j] = buf[i][j];
+        for(/* j = 13 */; j < 26; j++)
+            evbuf[2 * i + 1][j - 13] = buf[i][j];
+    } /* end for */
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
+
+    /* Write second slice */
+    if(H5Dwrite(vdset, H5T_NATIVE_INT, vspace[1], srcspace[1], H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update evbuf */
+    for(i = 0; i < 5; i++) {
+        for(j = 0; j < 13; j++)
+            evbuf[2 * i][j + 13] = buf[i + 5][j];
+        for(/* j = 13 */; j < 26; j++)
+            evbuf[2 * i + 1][j] = buf[i + 5][j];
+    } /* end for */
+
+    /* Reopen srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDONLY, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[0] = H5Dopen2(srcfile[0], "src_dset1", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+        if((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Read data directly from source datasets */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Read first dataset */
+    if(H5Dread(srcdset[0], H5T_NATIVE_INT, srcspace[0], srcspace[0], H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 5; i++) {
+        for(j = 0; j < 13; j++)
+            erbuf[2 * i][j] = evbuf[i][j];
+        for(/* j = 13 */; j < 26; j++)
+            erbuf[2 * i + 1][j - 13] = evbuf[i][j];
+    } /* end for */
+
+    /* Read second dataset */
+    if(H5Dread(srcdset[1], H5T_NATIVE_INT, srcspace[1], srcspace[1], H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 5; i++) {
+        for(j = 0; j < 13; j++)
+            erbuf[2 * i][j + 13] = evbuf[i + 5][j];
+        for(/* j = 13 */; j < 26; j++)
+            erbuf[2 * i + 1][j] = evbuf[i + 5][j];
+    } /* end for */
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if(rbuf[i][j] != erbuf[i][j])
+                TEST_ERROR
+
+    /* Close */
+    if(H5Dclose(srcdset[0]) < 0)
+        TEST_ERROR
+    srcdset[0] = -1;
+    if(H5Dclose(srcdset[1]) < 0)
+        TEST_ERROR
+    srcdset[1] = -1;
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    vdset = -1;
+    if(H5Fclose(srcfile[0]) < 0)
+        TEST_ERROR
+    srcfile[0] = -1;
+    if(H5Fclose(vfile) < 0)
+        TEST_ERROR
+    vfile = -1;
+    if(H5Sclose(srcspace[0]) < 0)
+        TEST_ERROR
+    srcspace[0] = -1;
+    if(H5Sclose(srcspace[1]) < 0)
+        TEST_ERROR
+    srcspace[1] = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+    if(H5Sclose(vspace[1]) < 0)
+        TEST_ERROR
+    vspace[1] = -1;
+
+
+    /*
+     * Test 6: 2 Source datasets, checkerboard/stripe pattern to trigger
+     * sequence list refresh internally
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create memory dataspace */
+    if((memspace = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspaces */
+    dims[1] = 52;
+    if((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+    if((vspace[1] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Create source dataspace and file space for second operation (srcspace[1])
+     */
+    if((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+    if((srcspace[1] = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Reset dims */
+    dims[1] = 26;
+
+    /* Select hyperslabs (stripe) in source space and file space for second
+     * operation (srcspace[1]) */
+    start[0] = 0;
+    start[1] = 0;
+    stride[0] = 1;
+    stride[1] = 2;
+    count[0] = 1;
+    count[1] = 26;
+    block[0] = 10;
+    block[1] = 1;
+    if(H5Sselect_hyperslab(srcspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+    start[1] = 1;
+    if(H5Sselect_hyperslab(srcspace[1], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+
+    /* Select hyperslabs (checkerboard) in virtual spaces */
+    start[0] = 0;
+    start[1] = 0;
+    stride[0] = 2;
+    stride[1] = 2;
+    count[0] = 5;
+    count[1] = 26;
+    block[0] = 1;
+    block[1] = 1;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+    start[0] = 1;
+    start[1] = 1;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_OR, start, stride, count, block) < 0)
+        TEST_ERROR
+    start[0] = 0;
+    if(H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+    start[0] = 1;
+    start[1] = 0;
+    if(H5Sselect_hyperslab(vspace[1], H5S_SELECT_OR, start, stride, count, block) < 0)
+        TEST_ERROR
+
+    /* Add virtual layout mappings */
+    if(H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset1", srcspace[0]) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset2", srcspace[0]) < 0)
+        TEST_ERROR
+
+    /* Create virtual file */
+    if((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create source file if requested */
+    if(config & TEST_IO_DIFFERENT_FILE) {
+        if((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    else {
+        srcfile[0] = vfile;
+        if(H5Iinc_ref(srcfile[0]) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Create source datasets */
+    if((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataset */
+    if((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Populate write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] = (i * (int)(sizeof(buf[0]) / sizeof(buf[0][0]))) + j;
+
+    /* Write data directly to source datasets */
+    /* Write first dataset */
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, srcspace[0], H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i += 2)
+        for(j = 0; j < 26; j++)
+            erbuf[i][j] = buf[i][j];
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
+
+    /* Write second dataset */
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, srcspace[0], H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 1; i < 10; i += 2)
+        for(j = 0; j < 26; j++)
+            erbuf[i][j] = buf[i][j];
+
+    /* Close srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Read data through virtual dataset by hyperslab */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Read first stripe pattern */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, srcspace[0], H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if(rbuf[i][j] != erbuf[i][j])
+                TEST_ERROR
+
+    /* Read second stripe pattern */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, srcspace[1], H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i += 2)
+        for(j = 0; j < 26; j++) {
+            erbuf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
+            erbuf[i + 1][j] -= (int)(sizeof(buf) / sizeof(buf[0][0]));
+        } /* end for */
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if(rbuf[i][j] != erbuf[i][j])
+                TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
+
+    /* Write data through virtual dataset */
+    /* Write first slice */
+    if(H5Dwrite(vdset, H5T_NATIVE_INT, memspace, srcspace[0], H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i += 2)
+        for(j = 0; j < 26; j++)
+            erbuf[i][j] = buf[i][j];
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
+
+    /* Write second slice */
+    if(H5Dwrite(vdset, H5T_NATIVE_INT, memspace, srcspace[1], H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 1; i < 10; i += 2)
+        for(j = 0; j < 26; j++)
+            erbuf[i][j] = buf[i][j];
+
+    /* Reopen srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDONLY, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[0] = H5Dopen2(srcfile[0], "src_dset1", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+        if((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Read data directly from source datasets */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Read first dataset */
+    if(H5Dread(srcdset[0], H5T_NATIVE_INT, memspace, srcspace[0], H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if(rbuf[i][j] != erbuf[i][j])
+                TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i += 2)
+        for(j = 0; j < 26; j++) {
+            erbuf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
+            erbuf[i + 1][j] -= (int)(sizeof(buf) / sizeof(buf[0][0]));
+        } /* end for */
+
+    /* Read second dataset */
+    if(H5Dread(srcdset[1], H5T_NATIVE_INT, memspace, srcspace[0], H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if(rbuf[i][j] != erbuf[i][j])
+                TEST_ERROR
+
+    /* Close */
+    if(H5Dclose(srcdset[0]) < 0)
+        TEST_ERROR
+    srcdset[0] = -1;
+    if(H5Dclose(srcdset[1]) < 0)
+        TEST_ERROR
+    srcdset[1] = -1;
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    vdset = -1;
+    if(H5Fclose(srcfile[0]) < 0)
+        TEST_ERROR
+    srcfile[0] = -1;
+    if(H5Fclose(vfile) < 0)
+        TEST_ERROR
+    vfile = -1;
+    if(H5Sclose(srcspace[0]) < 0)
+        TEST_ERROR
+    srcspace[0] = -1;
+    if(H5Sclose(srcspace[1]) < 0)
+        TEST_ERROR
+    srcspace[1] = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+    if(H5Sclose(vspace[1]) < 0)
+        TEST_ERROR
+    vspace[1] = -1;
+    if(H5Sclose(memspace) < 0)
+        TEST_ERROR
+    memspace = -1;
+
+
+    /*
+     * Test 7: 1 Source dataset, two mappings, 4 dimensional virtual dataset
+     * and 3 dimensional source dataset
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create memory dataspace */
+    if((memspace = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspaces */
+    dims[0] = 3;
+    dims[1] = 3;
+    dims[2] = 3;
+    dims[3] = 3;
+    if((vspace[0] = H5Screate_simple(4, dims, NULL)) < 0)
+        TEST_ERROR
+    if((vspace[1] = H5Screate_simple(4, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Create source dataspaces */
+    dims[0] = 2;
+    dims[1] = 4;
+    dims[2] = 4;
+    if((srcspace[0] = H5Screate_simple(3, dims, NULL)) < 0)
+        TEST_ERROR
+    if((srcspace[1] = H5Screate_simple(3, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Reset dims */
+    dims[0] = 10;
+    dims[1] = 26;
+
+    /* Select hyperslabs (stripes) in source spaces */
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 0;
+    stride[0] = 1;
+    stride[1] = 2;
+    stride[2] = 1;
+    count[0] = 1;
+    count[1] = 2;
+    count[2] = 1;
+    block[0] = 2;
+    block[1] = 1;
+    block[2] = 4;
+    if(H5Sselect_hyperslab(srcspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+    start[1] = 1;
+    if(H5Sselect_hyperslab(srcspace[1], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+
+    /* Select hyperslabs (corners) in first virtual space */
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 0;
+    start[3] = 0;
+    stride[0] = 2;
+    stride[1] = 2;
+    stride[2] = 2;
+    stride[3] = 2;
+    count[0] = 2;
+    count[1] = 2;
+    count[2] = 2;
+    count[3] = 2;
+    block[0] = 1;
+    block[1] = 1;
+    block[2] = 1;
+    block[3] = 1;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+
+    /* Select hyperslabs ("+" pattern) in second virtual space */
+    start[0] = 1;
+    start[1] = 1;
+    start[2] = 0;
+    start[3] = 0;
+    stride[0] = 2;
+    stride[1] = 2;
+    stride[2] = 2;
+    stride[3] = 2;
+    count[0] = 1;
+    count[1] = 1;
+    count[2] = 2;
+    count[3] = 2;
+    block[0] = 1;
+    block[1] = 1;
+    block[2] = 1;
+    block[3] = 1;
+    if(H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+    start[1] = 0;
+    start[2] = 1;
+    count[1] = 2;
+    count[2] = 1;
+    if(H5Sselect_hyperslab(vspace[1], H5S_SELECT_OR, start, stride, count, block) < 0)
+        TEST_ERROR
+    start[0] = 0;
+    start[1] = 1;
+    count[0] = 2;
+    count[1] = 1;
+    if(H5Sselect_hyperslab(vspace[1], H5S_SELECT_OR, start, stride, count, block) < 0)
+        TEST_ERROR
+    start[0] = 1;
+    count[0] = 1;
+    if(H5Sselect_hyperslab(vspace[1], H5S_SELECT_OR, start, stride, count, block) < 0)
+        TEST_ERROR
+    start[1] = 0;
+    start[3] = 1;
+    count[1] = 2;
+    count[3] = 1;
+    if(H5Sselect_hyperslab(vspace[1], H5S_SELECT_OR, start, stride, count, block) < 0)
+        TEST_ERROR
+
+    /* Add virtual layout mappings */
+    if(H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset1", srcspace[0]) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset1", srcspace[1]) < 0)
+        TEST_ERROR
+
+    /* Create virtual file */
+    if((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create source file if requested */
+    if(config & TEST_IO_DIFFERENT_FILE) {
+        if((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    else {
+        srcfile[0] = vfile;
+        if(H5Iinc_ref(srcfile[0]) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Create source dataset */
+    if((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataset */
+    if((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Populate write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] = (i * (int)(sizeof(buf[0]) / sizeof(buf[0][0]))) + j;
+
+    /* Select hyperslab in memory space */
+    start[0] = 0;
+    start[1] = 0;
+    count[0] = 2;
+    count[1] = 16;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL ,count, NULL) < 0)
+        TEST_ERROR
+
+    /* Write data directly to source dataset */
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR 
+
+    /* Close srcdset and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    start[0] = 0;
+    start[1] = 0;
+    count[0] = 9;
+    count[1] = 3;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL ,count, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset by hyperslab */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select stripe */
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 0;
+    start[3] = 0;
+    count[0] = 3;
+    count[1] = 3;
+    count[2] = 1;
+    count[3] = 3;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL ,count, NULL) < 0)
+        TEST_ERROR
+
+    /* Read first stripe pattern */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, vspace[0], H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    HDmemset(erbuf, 0, sizeof(erbuf));
+    for(i = 0; i < 9; i++)
+        for(j = 0; j < 3; j++)
+            erbuf[i][j] = fill;
+    erbuf[0][0] = buf[0][0];
+    erbuf[0][2] = buf[0][1];
+    erbuf[2][0] = buf[0][8];
+    erbuf[2][2] = buf[0][9];
+    erbuf[6][0] = buf[1][0];
+    erbuf[6][2] = buf[1][1];
+    erbuf[8][0] = buf[1][8];
+    erbuf[8][2] = buf[1][9];
+    erbuf[4][0] = buf[0][13];
+    erbuf[4][2] = buf[0][14];
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if(rbuf[i][j] != erbuf[i][j])
+                TEST_ERROR
+
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select stripe */
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 1;
+    start[3] = 0;
+    count[0] = 3;
+    count[1] = 3;
+    count[2] = 1;
+    count[3] = 3;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL ,count, NULL) < 0)
+        TEST_ERROR
+
+    /* Select hyperslab in memory space */
+    start[0] = 0;
+    start[1] = 3;
+    count[0] = 9;
+    count[1] = 3;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL ,count, NULL) < 0)
+        TEST_ERROR
+
+    /* Read second stripe pattern */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, vspace[0], H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 9; i++)
+        for(j = 3; j < 6; j++)
+            erbuf[i][j] = fill;
+    erbuf[1][3] = buf[0][4];
+    erbuf[1][5] = buf[0][5];
+    erbuf[3][3] = buf[0][6];
+    erbuf[3][4] = buf[0][7];
+    erbuf[3][5] = buf[0][12];
+    erbuf[4][3] = buf[0][15];
+    erbuf[4][5] = buf[1][4];
+    erbuf[5][3] = buf[1][7];
+    erbuf[5][4] = buf[1][12];
+    erbuf[5][5] = buf[1][13];
+    erbuf[7][3] = buf[1][14];
+    erbuf[7][5] = buf[1][15];
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if((j >= 3) && (j < 6)) {
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select stripe */
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 2;
+    start[3] = 0;
+    count[0] = 3;
+    count[1] = 3;
+    count[2] = 1;
+    count[3] = 3;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL ,count, NULL) < 0)
+        TEST_ERROR
+
+    /* Select hyperslab in memory space */
+    start[0] = 0;
+    start[1] = 6;
+    count[0] = 9;
+    count[1] = 3;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL ,count, NULL) < 0)
+        TEST_ERROR
+
+    /* Read third stripe pattern */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, vspace[0], H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 9; i++)
+        for(j = 6; j < 9; j++)
+            erbuf[i][j] = fill;
+    erbuf[0][6] = buf[0][2];
+    erbuf[0][8] = buf[0][3];
+    erbuf[2][6] = buf[0][10];
+    erbuf[2][8] = buf[0][11];
+    erbuf[6][6] = buf[1][2];
+    erbuf[6][8] = buf[1][3];
+    erbuf[8][6] = buf[1][10];
+    erbuf[8][8] = buf[1][11];
+    erbuf[4][6] = buf[1][5];
+    erbuf[4][8] = buf[1][6];
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if((j >= 6) && (j < 9)) {
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+
+    /* Now read entire VDS */
+    /* Set memory space extent to 9x9, select all in order to reach part of the
+     * code in H5S_select_subtract() */
+    dims[0] = 9;
+    dims[1] = 9;
+    if(H5Sset_extent_simple(memspace, 2, dims, NULL) < 0)
+        TEST_ERROR
+    if(H5Sselect_all(memspace) < 0)
+        TEST_ERROR
+
+    /* Read third stripe pattern */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf99[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(rbuf99) / sizeof(rbuf99[0])); i++)
+        for(j = 0; j < (int)(sizeof(rbuf99[0]) / sizeof(rbuf99[0][0])); j++)
+            if(rbuf99[i][j] != erbuf[i][j])
+                TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
+
+    /* Write data through virtual dataset by hyperslab */
+    /* Select stripe (only select mapped elements) */
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 0;
+    start[3] = 0;
+    stride[0] = 2;
+    stride[1] = 2;
+    stride[2] = 1;
+    stride[3] = 2;
+    count[0] = 2;
+    count[1] = 2;
+    count[2] = 1;
+    count[3] = 2;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride ,count, NULL) < 0)
+        TEST_ERROR
+    start[0] = 1;
+    start[1] = 1;
+    start[2] = 0;
+    start[3] = 0;
+    stride[0] = 1;
+    stride[1] = 1;
+    stride[2] = 1;
+    stride[3] = 2;
+    count[0] = 1;
+    count[1] = 1;
+    count[2] = 1;
+    count[3] = 2;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_OR, start, stride ,count, NULL) < 0)
+        TEST_ERROR
+
+    /* Reset extent of memspace, select hyperslab */
+    dims[0] = 10;
+    dims[1] = 26;
+    if(H5Sset_extent_simple(memspace, 2, dims, NULL) < 0)
+        TEST_ERROR
+    start[0] = 0;
+    start[1] = 0;
+    count[0] = 1;
+    count[1] = 10;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL ,count, NULL) < 0)
+        TEST_ERROR
+
+    /* Write data through virtual dataset by hyperslab */
+    /* Write first stripe pattern */
+    if(H5Dwrite(vdset, H5T_NATIVE_INT, memspace, vspace[0], H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    HDmemset(erbuf, 0, sizeof(erbuf));
+    erbuf[0][0] = buf[0][0];
+    erbuf[0][1] = buf[0][1];
+    erbuf[0][8] = buf[0][2];
+    erbuf[0][9] = buf[0][3];
+    erbuf[1][0] = buf[0][6];
+    erbuf[1][1] = buf[0][7];
+    erbuf[1][8] = buf[0][8];
+    erbuf[1][9] = buf[0][9];
+    erbuf[0][13] = buf[0][4];
+    erbuf[0][14] = buf[0][5];
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
+
+    /* Select stripe (only select mapped elements) */
+    start[0] = 0;
+    start[1] = 1;
+    start[2] = 1;
+    start[3] = 0;
+    stride[0] = 1;
+    stride[1] = 1;
+    stride[2] = 1;
+    stride[3] = 2;
+    count[0] = 3;
+    count[1] = 1;
+    count[2] = 1;
+    count[3] = 2;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride ,count, NULL) < 0)
+        TEST_ERROR
+    start[0] = 1;
+    start[1] = 0;
+    start[2] = 1;
+    start[3] = 0;
+    stride[0] = 1;
+    stride[1] = 2;
+    stride[2] = 1;
+    stride[3] = 1;
+    count[0] = 1;
+    count[1] = 2;
+    count[2] = 1;
+    count[3] = 3;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_OR, start, stride ,count, NULL) < 0)
+        TEST_ERROR
+
+    /* Select hyperslab in memory space */
+    start[0] = 0;
+    start[1] = 0;
+    count[0] = 1;
+    count[1] = 12;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL ,count, NULL) < 0)
+        TEST_ERROR
+
+    /* Write second slice */
+    if(H5Dwrite(vdset, H5T_NATIVE_INT, memspace, vspace[0], H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    erbuf[0][4] = buf[0][0];
+    erbuf[0][5] = buf[0][1];
+    erbuf[0][6] = buf[0][2];
+    erbuf[0][7] = buf[0][3];
+    erbuf[0][12] = buf[0][4];
+    erbuf[0][15] = buf[0][5];
+    erbuf[1][4] = buf[0][6];
+    erbuf[1][7] = buf[0][7];
+    erbuf[1][12] = buf[0][8];
+    erbuf[1][13] = buf[0][9];
+    erbuf[1][14] = buf[0][10];
+    erbuf[1][15] = buf[0][11];
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
+
+    /* Select stripe (only select mapped elements) */
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 2;
+    start[3] = 0;
+    stride[0] = 2;
+    stride[1] = 2;
+    stride[2] = 1;
+    stride[3] = 2;
+    count[0] = 2;
+    count[1] = 2;
+    count[2] = 1;
+    count[3] = 2;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride ,count, NULL) < 0)
+        TEST_ERROR
+    start[0] = 1;
+    start[1] = 1;
+    start[2] = 2;
+    start[3] = 0;
+    stride[0] = 1;
+    stride[1] = 1;
+    stride[2] = 1;
+    stride[3] = 2;
+    count[0] = 1;
+    count[1] = 1;
+    count[2] = 1;
+    count[3] = 2;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_OR, start, stride ,count, NULL) < 0)
+        TEST_ERROR
+
+    /* Select hyperslab in memory space */
+    start[0] = 0;
+    start[1] = 0;
+    count[0] = 1;
+    count[1] = 10;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL ,count, NULL) < 0)
+        TEST_ERROR
+
+    /* Write third slice */
+    if(H5Dwrite(vdset, H5T_NATIVE_INT, memspace, vspace[0], H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    erbuf[0][2] = buf[0][0];
+    erbuf[0][3] = buf[0][1];
+    erbuf[0][10] = buf[0][2];
+    erbuf[0][11] = buf[0][3];
+    erbuf[1][2] = buf[0][6];
+    erbuf[1][3] = buf[0][7];
+    erbuf[1][10] = buf[0][8];
+    erbuf[1][11] = buf[0][9];
+    erbuf[1][5] = buf[0][4];
+    erbuf[1][6] = buf[0][5];
+
+    /* Reopen srcdset and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDONLY, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[0] = H5Dopen2(srcfile[0], "src_dset1", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Read data directly from source dataset */
+    /* Select hyperslab in memory space */
+    start[0] = 0;
+    start[1] = 0;
+    count[0] = 2;
+    count[1] = 16;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL ,count, NULL) < 0)
+        TEST_ERROR
+
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Read dataset */
+    if(H5Dread(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
+        for(j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
+            if(rbuf[i][j] != erbuf[i][j])
+                TEST_ERROR
+
+    /* Now try writing to whole VDS (should fail due to unmapped elements) */
+    count[0] = 9;
+    count[1] = 9;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    H5E_BEGIN_TRY {
+        ret = H5Dwrite(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]);
+    } H5E_END_TRY
+    if(ret >= 0)
+        TEST_ERROR
+
+    /* Close */
+    if(H5Dclose(srcdset[0]) < 0)
+        TEST_ERROR
+    srcdset[0] = -1;
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    vdset = -1;
+    if(H5Fclose(srcfile[0]) < 0)
+        TEST_ERROR
+    srcfile[0] = -1;
+    if(H5Fclose(vfile) < 0)
+        TEST_ERROR
+    vfile = -1;
+    if(H5Sclose(srcspace[0]) < 0)
+        TEST_ERROR
+    srcspace[0] = -1;
+    if(H5Sclose(srcspace[1]) < 0)
+        TEST_ERROR
+    srcspace[1] = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+    if(H5Sclose(vspace[1]) < 0)
+        TEST_ERROR
+    vspace[1] = -1;
+    if(H5Sclose(memspace) < 0)
+        TEST_ERROR
+    memspace = -1;
+
+
+    /* Close */
+    if(H5Pclose(dcpl) < 0)
+        TEST_ERROR
+    dcpl = -1;
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        for(i = 0; i < (int)(sizeof(srcdset) / sizeof(srcdset[0])); i++) {
+            if(srcdset[i] >= 0)
+                (void)H5Dclose(srcdset[i]);
+        } /* end for */
+        if(vdset >= 0)
+            (void)H5Dclose(vdset);
+        for(i = 0; i < (int)(sizeof(srcfile) / sizeof(srcfile[0])); i++) {
+            if(srcfile[i] >= 0)
+                (void)H5Fclose(srcfile[i]);
+        } /* end for */
+        if(vfile >= 0)
+            (void)H5Fclose(vfile);
+        if(vfile2 >= 0)
+            (void)H5Fclose(vfile2);
+        for(i = 0; i < (int)(sizeof(srcspace) / sizeof(srcspace[0])); i++) {
+            if(srcspace[i] >= 0)
+                (void)H5Sclose(srcspace[i]);
+        } /* end for */
+        for(i = 0; i < (int)(sizeof(vspace) / sizeof(vspace[0])); i++) {
+            if(vspace[i] >= 0)
+                (void)H5Sclose(vspace[i]);
+        } /* end for */
+        if(memspace >= 0)
+            (void)H5Sclose(memspace);
+        if(dcpl >= 0)
+            (void)H5Pclose(dcpl);
+    } H5E_END_TRY;
+
+     return 1;
+} /* end test_basic_io() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    test_unlim
+ *
+ * Purpose:     Tests VDS with unlimited selections
+ *
+ * Return:      Success:        0
+ *
+ *              Failure:        number of errors
+ *
+ * Programmer:  Neil Fortner
+ *              Thursday, April 30, 2015
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_unlim(unsigned config, hid_t fapl)
+{
+    char        srcfilename[FILENAME_BUF_SIZE];
+    char        srcfilename_map[FILENAME_BUF_SIZE];
+    char        vfilename[FILENAME_BUF_SIZE];
+    hid_t       srcfile[4] = {-1, -1, -1, -1}; /* Files with source dsets */
+    hid_t       vfile = -1;     /* File with virtual dset */
+    hid_t       dcpl = -1;      /* Dataset creation property list */
+    hid_t       srcdcpl = -1;   /* DCPL for source dset */
+    hid_t       dapl = -1;      /* Dataset access property list */
+    hid_t       srcspace[4] = {-1, -1, -1, -1}; /* Source dataspaces */
+    hid_t       vspace[4] = {-1, -1, -1, -1}; /* Virtual dset dataspaces */
+    hid_t       memspace = -1;  /* Memory dataspace */
+    hid_t       filespace = -1; /* File dataspace */
+    hid_t       srcdset[4] = {-1, -1, -1, -1}; /* Source datsets */
+    hid_t       vdset = -1;     /* Virtual dataset */
+    hsize_t     dims[2] = {10, 10}; /* Data space current size */
+    hsize_t     mdims[2] = {10, 20}; /* Data space maximum size */
+    hsize_t     cdims[2] = {4, 4}; /* Chunk dimensions */
+    hsize_t     start[4];       /* Hyperslab start */
+    hsize_t     stride[4];      /* Hyperslab stride */
+    hsize_t     count[4];       /* Hyperslab count */
+    hsize_t     block[4];       /* Hyperslab block */
+    int         buf[10][20];    /* Write and expected read buffer */
+    int         rbuf[10][20];   /* Read buffer */
+    int         erbuf[10][20];  /* Expected read buffer */
+    int         ndims;          /* Number of dimensions */
+    int         fill = -1;      /* Fill value */
+    H5D_vds_view_t virtual_view; /* Virtual view property */
+    int         i, j;
+
+    TESTING("virtual dataset I/O with unlimited selections")
+
+    h5_fixname(FILENAME[0], fapl, vfilename, sizeof vfilename);
+    h5_fixname(FILENAME[2], fapl, srcfilename, sizeof srcfilename);
+    h5_fixname_printf(FILENAME[2], fapl, srcfilename_map, sizeof srcfilename_map);
+
+    /* Create DCPLs */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        TEST_ERROR
+    if((srcdcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        TEST_ERROR
+
+    /* Set fill value */
+    if(H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fill) < 0)
+        TEST_ERROR
+
+    /* Set chunk dimensions */
+    if(H5Pset_chunk(srcdcpl, 2, cdims) < 0)
+        TEST_ERROR
+
+    /* Create DAPL */
+    if((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
+        TEST_ERROR
+
+    /* Create memory space */
+    if((memspace = H5Screate_simple(2, mdims, NULL)) < 0)
+        TEST_ERROR
+
+
+    /*
+     * Test 1: 2 Source datasets, single unlimited hyperslab virtual mappings
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspaces */
+    if((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+    if((vspace[1] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+
+    /* Create source dataspace */
+    dims[0] = 5;
+    mdims[0] = 5;
+    if((srcspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+    mdims[0] = 10;
+
+    /* Select hyperslab in source space */
+    start[0] = 0;
+    start[1] = 0;
+    count[0] = 5;
+    count[1] = H5S_UNLIMITED;
+    if(H5Sselect_hyperslab(srcspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+
+    /* Select hyperslabs in virtual spaces */
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    start[0] = 5;
+    if(H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+
+    /* Add virtual layout mappings */
+    if(H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset1", srcspace[0]) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset2", srcspace[0]) < 0)
+        TEST_ERROR
+
+    /* Create virtual file */
+    if((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create source file if requested */
+    if(config & TEST_IO_DIFFERENT_FILE) {
+        if((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    else {
+        srcfile[0] = vfile;
+        if(H5Iinc_ref(srcfile[0]) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Create source datasets */
+    if((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, srcdcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, srcdcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataset */
+    if((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
+        TEST_ERROR
+
+    /* Populate write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] = (i * (int)mdims[1]) + j;
+
+    /* Initialize erbuf */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            erbuf[i][j] = fill;
+
+    /* Write data directly to source datasets */
+    /* Select hyperslab in memory */
+    start[0] = 0;
+    count[1] = 10;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+
+    /* Write first dataset */
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 5; i++)
+        for(j = 0; j < 10; j++)
+            erbuf[i][j] = buf[i][j];
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write second dataset */
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 5; i++)
+        for(j = 0; j < 10; j++)
+            erbuf[i + 5][j] = buf[i][j];
+
+    /* Close srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 10)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    start[0] = 0;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Test H5Pget_virtual_view() */
+    if(H5Pget_virtual_view(dapl, &virtual_view) < 0)
+        TEST_ERROR
+    if(virtual_view != H5D_VDS_LAST_AVAILABLE)
+        TEST_ERROR
+
+    /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
+     * as well if config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Test H5Pget_virtual_view() */
+    if(H5Pget_virtual_view(dapl, &virtual_view) < 0)
+        TEST_ERROR
+    if(virtual_view != H5D_VDS_FIRST_MISSING)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 10)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reopen srcdset[0] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[0] = H5Dopen2(srcfile[0], "src_dset1", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Extend srcdset[0] */
+    dims[0] = 5;
+    dims[1] = 15;
+    if(H5Dset_extent(srcdset[0], dims) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to new area of srcdset */
+    count[1] = 5;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    if((filespace = H5Dget_space(srcdset[0])) < 0)
+        TEST_ERROR
+    start[1] = 10;
+    if(H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Close srcdset[0] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions.  Note that since we are using
+     * H5D_VDS_FIRST_MISSING and we only extended one source dataset the
+     * dimensions will not have changed. */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 10)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    start[1] = 0;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close VDS and reopen with view set to H5D_VDS_LAST_AVAILABLE, reopen file
+     * as well if config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Update erbuf to reflect new data that is now visible due to the change to
+     * H5D_VDS_LAST_AVAILABLE */
+    for(i = 0; i < 5; i++)
+        for(j = 0; j < 5; j++)
+            erbuf[i][j + 10] = buf[i][j];
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 15)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    start[1] = 0;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reopen srcdset[1] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Extend srcdset[1] */
+    dims[0] = 5;
+    dims[1] = 20;
+    if(H5Dset_extent(srcdset[1], dims) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to new area of srcdset */
+    count[1] = 10;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    if((filespace = H5Dget_space(srcdset[1])) < 0)
+        TEST_ERROR
+    start[1] = 10;
+    if(H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 5; i++)
+        for(j = 0; j < 10; j++)
+            erbuf[i + 5][j + 10] = buf[i][j];
+
+    /* Close srcdset[1] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 20)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    start[1] = 0;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            if(rbuf[i][j] != erbuf[i][j])
+                TEST_ERROR
+
+    /* Now just read middle 2 rows */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+    start[0] = 4;
+    count[0] = 2;
+    count[1] = 20;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, memspace, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data - algorithmically check for only 2 middle rows being
+     * read so we don't have to wipe out erbuf and then restore it afterwards */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            if((i == 4) || (i == 5)) {
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+
+    /* Now test reopening virtual dataset without calling H5Dget_space, if
+     * REOPEN_VIRT flag set */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+
+        /* Read data through virtual dataset */
+        /* Reset rbuf */
+        HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+        /* Select hyperslab in memory space */
+        start[0] = 0;
+        start[1] = 0;
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+            TEST_ERROR
+
+        /* Read data */
+        if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+            TEST_ERROR
+
+        /* Verify read data */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++)
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+
+        /* Now try setting extent manually */
+        /* Shrink to 18 */
+        dims[1] = 18;
+        if(H5Dset_extent(vdset, dims) < 0)
+            TEST_ERROR
+
+        /* Read data through virtual dataset */
+        /* Reset rbuf */
+        HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+        /* Select hyperslab in memory space */
+        start[0] = 0;
+        start[1] = 0;
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+            TEST_ERROR
+
+        /* Read data */
+        if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+            TEST_ERROR
+
+        /* Verify read data */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++) {
+                if(j >= (int)dims[1]) {
+                    if(rbuf[i][j] != 0)
+                        TEST_ERROR
+                } /* end if */
+                else
+                    if(rbuf[i][j] != erbuf[i][j])
+                        TEST_ERROR
+            } /* end for */
+
+        /* Shrink to 15 */
+        dims[1] = 15;
+        if(H5Dset_extent(vdset, dims) < 0)
+            TEST_ERROR
+
+        /* Read data through virtual dataset */
+        /* Reset rbuf */
+        HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+        /* Select hyperslab in memory space */
+        start[0] = 0;
+        start[1] = 0;
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+            TEST_ERROR
+
+        /* Read data */
+        if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+            TEST_ERROR
+
+        /* Verify read data */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++) {
+                if(j >= (int)dims[1]) {
+                    if(rbuf[i][j] != 0)
+                        TEST_ERROR
+                } /* end if */
+                else
+                    if(rbuf[i][j] != erbuf[i][j])
+                        TEST_ERROR
+            } /* end for */
+    } /* end if */
+
+    /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
+     * as well if config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 15)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    start[0] = 0;
+    start[1] = 0;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Now test reopening virtual dataset without calling H5Dget_space, if
+     * REOPEN_VIRT flag set */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+
+        /* Read data through virtual dataset */
+        /* Reset rbuf */
+        HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+        /* Select hyperslab in memory space */
+        start[1] = 0;
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+            TEST_ERROR
+
+        /* Read data */
+        if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+            TEST_ERROR
+
+        /* Verify read data */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++) {
+                if(j >= (int)dims[1]) {
+                    if(rbuf[i][j] != 0)
+                        TEST_ERROR
+                } /* end if */
+                else
+                    if(rbuf[i][j] != erbuf[i][j])
+                        TEST_ERROR
+            } /* end for */
+
+        /* Now try setting extent manually */
+        /* Grow to 18 */
+        dims[1] = 18;
+        if(H5Dset_extent(vdset, dims) < 0)
+            TEST_ERROR
+
+        /* Read data through virtual dataset */
+        /* Reset rbuf */
+        HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+        /* Select hyperslab in memory space */
+        start[0] = 0;
+        start[1] = 0;
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+            TEST_ERROR
+
+        /* Read data */
+        if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+            TEST_ERROR
+
+        /* Verify read data */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++) {
+                if(j >= (int)dims[1]) {
+                    if(rbuf[i][j] != 0)
+                        TEST_ERROR
+                } /* end if */
+                else
+                    if(rbuf[i][j] != erbuf[i][j])
+                        TEST_ERROR
+            } /* end for */
+
+        /* Grow to 20 */
+        dims[1] = 20;
+        if(H5Dset_extent(vdset, dims) < 0)
+            TEST_ERROR
+
+        /* Read data through virtual dataset */
+        /* Reset rbuf */
+        HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+        /* Select hyperslab in memory space */
+        start[0] = 0;
+        start[1] = 0;
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+            TEST_ERROR
+
+        /* Read data */
+        if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+            TEST_ERROR
+
+        /* Verify read data */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++)
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+    } /* end if */
+
+    /* Close */
+    if(!(config & TEST_IO_CLOSE_SRC)) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+        if(H5Fclose(srcfile[0]) < 0)
+            TEST_ERROR
+        srcfile[0] = -1;
+    } /* end if */
+    else if(!(config & TEST_IO_DIFFERENT_FILE)) {
+        if(H5Fclose(srcfile[0]) < 0)
+            TEST_ERROR
+        srcfile[0] = -1;
+    } /* end if */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    vdset = -1;
+    if(H5Fclose(vfile) < 0)
+        TEST_ERROR
+    vfile = -1;
+    if(H5Sclose(srcspace[0]) < 0)
+        TEST_ERROR
+    srcspace[0] = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+    if(H5Sclose(vspace[1]) < 0)
+        TEST_ERROR
+    vspace[1] = -1;
+
+
+    /*
+     * Test 2: 2 Source datasets, interleaved slices, single element wide
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspaces */
+    dims[0] = 10;
+    dims[1] = 10;
+    if((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+    if((vspace[1] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+
+    /* Create source dataspace */
+    dims[1] = 5;
+    mdims[1] = 10;
+    if((srcspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+    mdims[1] = 20;
+
+    /* Select hyperslab in source space */
+    start[0] = 0;
+    start[1] = 0;
+    count[0] = 10;
+    count[1] = H5S_UNLIMITED;
+    if(H5Sselect_hyperslab(srcspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+
+    /* Select hyperslabs in virtual spaces */
+    stride[0] = 1;
+    stride[1] = 2;
+    count[0] = 1;
+    count[1] = H5S_UNLIMITED;
+    block[0] = 10;
+    block[1] = 1;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+    start[1] = 1;
+    if(H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+    start[1] = 0;
+
+    /* Add virtual layout mappings */
+    if(H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset1", srcspace[0]) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset2", srcspace[0]) < 0)
+        TEST_ERROR
+
+    /* Create virtual file */
+    if((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create source file if requested */
+    if(config & TEST_IO_DIFFERENT_FILE) {
+        if((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    else {
+        srcfile[0] = vfile;
+        if(H5Iinc_ref(srcfile[0]) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Create source datasets */
+    if((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, srcdcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, srcdcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataset */
+    if((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
+        TEST_ERROR
+
+    /* Populate write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] = (i * (int)mdims[1]) + j;
+
+    /* Initialize erbuf */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            erbuf[i][j] = fill;
+
+    /* Write data directly to source datasets */
+    /* Select hyperslab in memory */
+    count[0] = 10;
+    count[1] = 5;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+
+    /* Write first dataset */
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 5; j++)
+            erbuf[i][2 * j] = buf[i][j];
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write second dataset */
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 5; j++)
+            erbuf[i][(2 * j) + 1] = buf[i][j];
+
+    /* Close srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 10)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
+     * as well if config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 10)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reopen srcdset[0] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[0] = H5Dopen2(srcfile[0], "src_dset1", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Extend srcdset[0] */
+    dims[1] = 7;
+    if(H5Dset_extent(srcdset[0], dims) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to new area of srcdset */
+    count[1] = 2;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    if((filespace = H5Dget_space(srcdset[0])) < 0)
+        TEST_ERROR
+    start[1] = 5;
+    if(H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    start[1] = 0;
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Update erbuf to reflect only new data that is now visible under
+     * H5D_VDS_FIRST_MISSING (first slice) */
+    for(i = 0; i < 10; i++)
+        erbuf[i][10] = buf[i][0];
+
+    /* Close srcdset[0] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions.  Note that since we are using
+     * H5D_VDS_FIRST_MISSING and we only extended one source dataset the
+     * dimension will only have changed to add one more slice. */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 11)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close VDS and reopen with view set to H5D_VDS_LAST_AVAILABLE, reopen file
+     * as well if config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Update erbuf to reflect new data that is now visible due to the change to
+     * H5D_VDS_LAST_AVAILABLE (second new slice) */
+    for(i = 0; i < 10; i++)
+            erbuf[i][12] = buf[i][1];
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 13)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reopen srcdset[1] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Extend srcdset[1] */
+    dims[1] = 10;
+    if(H5Dset_extent(srcdset[1], dims) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to new area of srcdset */
+    count[1] = 5;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    if((filespace = H5Dget_space(srcdset[1])) < 0)
+        TEST_ERROR
+    start[1] = 5;
+    if(H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    start[1] = 0;
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 5; j++)
+            erbuf[i][(2 * j) + 11] = buf[i][j];
+
+    /* Close srcdset[1] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 20)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            if(rbuf[i][j] != erbuf[i][j])
+                TEST_ERROR
+
+    /* Now just read middle 2 rows */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+    start[0] = 4;
+    count[0] = 2;
+    count[1] = 20;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    start[0] = 0;
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, memspace, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data - algorithmically check for only 2 middle rows being
+     * read so we don't have to wipe out erbuf and then restore it afterwards */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            if((i == 4) || (i == 5)) {
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+
+    /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
+     * as well if config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Update erbuf to reflect new data that is no longer visible due to the
+     * change to H5D_VDS_FIRST_MISSING */
+    for(i = 0; i < 10; i++)
+        for(j = 15; j < 20; j += 2)
+            erbuf[i][j] = fill;
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 14)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close */
+    if(!(config & TEST_IO_CLOSE_SRC)) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+        if(H5Fclose(srcfile[0]) < 0)
+            TEST_ERROR
+        srcfile[0] = -1;
+    } /* end if */
+    else if(!(config & TEST_IO_DIFFERENT_FILE)) {
+        if(H5Fclose(srcfile[0]) < 0)
+            TEST_ERROR
+        srcfile[0] = -1;
+    } /* end if */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    vdset = -1;
+    if(H5Fclose(vfile) < 0)
+        TEST_ERROR
+    vfile = -1;
+    if(H5Sclose(srcspace[0]) < 0)
+        TEST_ERROR
+    srcspace[0] = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+    if(H5Sclose(vspace[1]) < 0)
+        TEST_ERROR
+    vspace[1] = -1;
+
+
+    /*
+     * Test 3: 3 Source datasets, interleaved slices, two elements wide
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspaces */
+    dims[0] = 10;
+    dims[1] = 10;
+    if((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+    if((vspace[1] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+    if((vspace[2] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+
+    /* Create source dataspaces */
+    dims[1] = 4;
+    mdims[1] = 8;
+    if((srcspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+    dims[1] = 4;
+    mdims[1] = 6;
+    if((srcspace[1] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+    dims[1] = 2;
+    mdims[1] = 6;
+    if((srcspace[2] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+    mdims[1] = 20;
+
+    /* Select hyperslab in source spaces */
+    start[0] = 0;
+    start[1] = 0;
+    count[0] = 10;
+    count[1] = H5S_UNLIMITED;
+    if(H5Sselect_hyperslab(srcspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    if(H5Sselect_hyperslab(srcspace[1], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    if(H5Sselect_hyperslab(srcspace[2], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+
+    /* Select hyperslabs in virtual spaces */
+    stride[0] = 1;
+    stride[1] = 6;
+    count[0] = 1;
+    count[1] = H5S_UNLIMITED;
+    block[0] = 10;
+    block[1] = 2;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+    start[1] = 2;
+    if(H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+    start[1] = 4;
+    if(H5Sselect_hyperslab(vspace[2], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+    start[1] = 0;
+
+    /* Add virtual layout mappings */
+    if(H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset1", srcspace[0]) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset2", srcspace[1]) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual(dcpl, vspace[2], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset3", srcspace[2]) < 0)
+        TEST_ERROR
+
+    /* Create virtual file */
+    if((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create source file if requested */
+    if(config & TEST_IO_DIFFERENT_FILE) {
+        if((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    else {
+        srcfile[0] = vfile;
+        if(H5Iinc_ref(srcfile[0]) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Create source datasets */
+    if((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, srcdcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2", H5T_NATIVE_INT, srcspace[1], H5P_DEFAULT, srcdcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if((srcdset[2] = H5Dcreate2(srcfile[0], "src_dset3", H5T_NATIVE_INT, srcspace[2], H5P_DEFAULT, srcdcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataset */
+    if((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
+        TEST_ERROR
+
+    /* Populate write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] = (i * (int)mdims[1]) + j;
+
+    /* Initialize erbuf */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            erbuf[i][j] = fill;
+
+    /* Write data directly to source datasets */
+    /* Select hyperslab in memory */
+    count[0] = 10;
+    count[1] = 4;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+
+    /* Write first dataset */
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 2; j++) {
+            erbuf[i][6 * j] = buf[i][2 * j];
+            erbuf[i][(6 * j) + 1] = buf[i][(2 * j) + 1];
+        } /* end for */
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write second dataset */
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 2; j++) {
+            erbuf[i][(6 * j) + 2] = buf[i][2 * j];
+            erbuf[i][(6 * j) + 3] = buf[i][(2 * j) + 1];
+        } /* end for */
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Select hyperslab in memory */
+    count[0] = 10;
+    count[1] = 2;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+
+    /* Write third dataset */
+    if(H5Dwrite(srcdset[2], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++) {
+        erbuf[i][4] = buf[i][0];
+        erbuf[i][5] = buf[i][1];
+    } /* end for */
+
+    /* Close srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+        if(H5Dclose(srcdset[2]) < 0)
+            TEST_ERROR
+        srcdset[2] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 10)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
+     * as well if config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 10)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reopen srcdset[0] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[0] = H5Dopen2(srcfile[0], "src_dset1", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Extend srcdset[0] */
+    dims[1] = 7;
+    if(H5Dset_extent(srcdset[0], dims) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to new area of srcdset */
+    count[1] = 3;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    if((filespace = H5Dget_space(srcdset[0])) < 0)
+        TEST_ERROR
+    start[1] = 4;
+    if(H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    start[1] = 0;
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Close srcdset[0] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions.  Note that since we are using
+     * H5D_VDS_FIRST_MISSING the size will not have changed. */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 10)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close VDS and reopen with view set to H5D_VDS_LAST_AVAILABLE, reopen file
+     * as well if config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Update erbuf to reflect new data that is now visible due to the change to
+     * H5D_VDS_LAST_AVAILABLE */
+    for(i = 0; i < 10; i++) {
+        erbuf[i][12] = buf[i][0];
+        erbuf[i][13] = buf[i][1];
+        erbuf[i][18] = buf[i][2];
+    } /* end for */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 19)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reopen srcdset[2] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[2] = H5Dopen2(srcfile[0], "src_dset3", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Extend srcdset[2] */
+    dims[1] = 5;
+    if(H5Dset_extent(srcdset[2], dims) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to new area of srcdset */
+    count[1] = 3;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    if((filespace = H5Dget_space(srcdset[2])) < 0)
+        TEST_ERROR
+    start[1] = 2;
+    if(H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    start[1] = 0;
+    if(H5Dwrite(srcdset[2], H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++) {
+        erbuf[i][10] = buf[i][0];
+        erbuf[i][11] = buf[i][1];
+        erbuf[i][16] = buf[i][2];
+    } /* end for */
+
+    /* Close srcdset[2] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[2]) < 0)
+            TEST_ERROR
+        srcdset[2] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions.  Note that the dimensions will not have
+     * changed. */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 19)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
+     * as well if config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 14)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reopen srcdset[1] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Extend srcdset[1] */
+    dims[1] = 6;
+    if(H5Dset_extent(srcdset[1], dims) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to new area of srcdset */
+    count[1] = 2;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    if((filespace = H5Dget_space(srcdset[1])) < 0)
+        TEST_ERROR
+    start[1] = 4;
+    if(H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    start[1] = 0;
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++) {
+        erbuf[i][14] = buf[i][0];
+        erbuf[i][15] = buf[i][1];
+    } /* end for */
+
+    /* Close srcdset[1] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 17)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close VDS and reopen with view set to H5D_VDS_LAST_AVAILABLE, reopen file
+     * as well if config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 19)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Now just read middle 2 rows */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+    start[0] = 4;
+    count[0] = 2;
+    count[1] = 19;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    if(H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    start[0] = 0;
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Verify read data - algorithmically check for only 2 middle rows being
+     * read */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else if((i == 4) || (i == 5)) {
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+
+    /* Close */
+    if(!(config & TEST_IO_CLOSE_SRC)) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+        if(H5Dclose(srcdset[2]) < 0)
+            TEST_ERROR
+        srcdset[2] = -1;
+        if(H5Fclose(srcfile[0]) < 0)
+            TEST_ERROR
+        srcfile[0] = -1;
+    } /* end if */
+    else if(!(config & TEST_IO_DIFFERENT_FILE)) {
+        if(H5Fclose(srcfile[0]) < 0)
+            TEST_ERROR
+        srcfile[0] = -1;
+    } /* end if */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    vdset = -1;
+    if(H5Fclose(vfile) < 0)
+        TEST_ERROR
+    vfile = -1;
+    if(H5Sclose(srcspace[0]) < 0)
+        TEST_ERROR
+    srcspace[0] = -1;
+    if(H5Sclose(srcspace[1]) < 0)
+        TEST_ERROR
+    srcspace[1] = -1;
+    if(H5Sclose(srcspace[2]) < 0)
+        TEST_ERROR
+    srcspace[2] = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+    if(H5Sclose(vspace[1]) < 0)
+        TEST_ERROR
+    vspace[1] = -1;
+
+
+    /*
+     * Test 4: 2 Source datasets, offset starts
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspaces */
+    if((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+    if((vspace[1] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+
+    /* Create source dataspaces */
+    dims[0] = 5;
+    dims[1] = 0;
+    mdims[0] = 5;
+    if((srcspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+    dims[1] = 5;
+    if((srcspace[1] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+    mdims[0] = 10;
+
+    /* Select hyperslab in source spaces */
+    start[0] = 0;
+    start[1] = 0;
+    count[0] = 5;
+    count[1] = H5S_UNLIMITED;
+    if(H5Sselect_hyperslab(srcspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    if(H5Sselect_hyperslab(srcspace[1], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+
+    /* Select hyperslabs in virtual spaces */
+    start[1] = 10;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    start[0] = 5;
+    start[1] = 0;
+    if(H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+
+    /* Add virtual layout mappings */
+    if(H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset1", srcspace[0]) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset2", srcspace[1]) < 0)
+        TEST_ERROR
+
+    /* Create virtual file */
+    if((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create source file if requested */
+    if(config & TEST_IO_DIFFERENT_FILE) {
+        if((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    else {
+        srcfile[0] = vfile;
+        if(H5Iinc_ref(srcfile[0]) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Create source datasets */
+    if((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, srcdcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2", H5T_NATIVE_INT, srcspace[1], H5P_DEFAULT, srcdcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataset */
+    if((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
+        TEST_ERROR
+
+    /* Populate write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] = (i * (int)mdims[1]) + j;
+
+    /* Initialize erbuf */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            erbuf[i][j] = fill;
+
+    /* Write data directly to second source dataset */
+    /* Select hyperslab in memory */
+    start[0] = 0;
+    start[1] = 0;
+    count[0] = 5;
+    count[1] = 5;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+
+    /* Write second dataset */
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 5; i++)
+        for(j = 0; j < 5; j++)
+            erbuf[i + 5][j] = buf[i][j];
+
+    /* Close srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 5)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    start[0] = 0;
+    start[1] = 0;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
+     * as well if config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 5)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reopen srcdset[0] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[0] = H5Dopen2(srcfile[0], "src_dset1", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Extend srcdset[0] */
+    dims[0] = 5;
+    dims[1] = 5;
+    if(H5Dset_extent(srcdset[0], dims) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to srcdset[0] */
+    start[0] = 0;
+    start[1] = 0;
+    count[0] = 5;
+    count[1] = 5;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 5; i++)
+        for(j = 0; j < 5; j++)
+            erbuf[i][j + 10] = buf[i][j];
+
+    /* Close srcdset[0] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 5)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    start[0] = 0;
+    start[1] = 0;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close VDS and reopen with view set to H5D_VDS_LAST_AVAILABLE, reopen file
+     * as well if config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 15)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    start[0] = 0;
+    start[1] = 0;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close */
+    if(!(config & TEST_IO_CLOSE_SRC)) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+        if(H5Fclose(srcfile[0]) < 0)
+            TEST_ERROR
+        srcfile[0] = -1;
+    } /* end if */
+    else if(!(config & TEST_IO_DIFFERENT_FILE)) {
+        if(H5Fclose(srcfile[0]) < 0)
+            TEST_ERROR
+        srcfile[0] = -1;
+    } /* end if */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    vdset = -1;
+    if(H5Fclose(vfile) < 0)
+        TEST_ERROR
+    vfile = -1;
+    if(H5Sclose(srcspace[0]) < 0)
+        TEST_ERROR
+    srcspace[0] = -1;
+    if(H5Sclose(srcspace[1]) < 0)
+        TEST_ERROR
+    srcspace[1] = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+    if(H5Sclose(vspace[1]) < 0)
+        TEST_ERROR
+    vspace[1] = -1;
+
+
+    /* Close */
+    if(H5Pclose(dcpl) < 0)
+        TEST_ERROR
+    dcpl = -1;
+    if(H5Pclose(srcdcpl) < 0)
+        TEST_ERROR
+    dcpl = -1;
+    if(H5Pclose(dapl) < 0)
+        TEST_ERROR
+    dapl = -1;
+    if(H5Sclose(memspace) < 0)
+        TEST_ERROR
+    memspace = -1;
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        for(i = 0; i < (int)(sizeof(srcdset) / sizeof(srcdset[0])); i++) {
+            if(srcdset[i] >= 0)
+                (void)H5Dclose(srcdset[i]);
+        } /* end for */
+        if(vdset >= 0)
+            (void)H5Dclose(vdset);
+        for(i = 0; i < (int)(sizeof(srcfile) / sizeof(srcfile[0])); i++) {
+            if(srcfile[i] >= 0)
+                (void)H5Fclose(srcfile[i]);
+        } /* end for */
+        if(vfile >= 0)
+            (void)H5Fclose(vfile);
+        for(i = 0; i < (int)(sizeof(srcspace) / sizeof(srcspace[0])); i++) {
+            if(srcspace[i] >= 0)
+                (void)H5Sclose(srcspace[i]);
+        } /* end for */
+        for(i = 0; i < (int)(sizeof(vspace) / sizeof(vspace[0])); i++) {
+            if(vspace[i] >= 0)
+                (void)H5Sclose(vspace[i]);
+        } /* end for */
+        if(filespace >= 0)
+            (void)H5Sclose(filespace);
+        if(memspace >= 0)
+            (void)H5Sclose(memspace);
+        if(dcpl >= 0)
+            (void)H5Pclose(dcpl);
+        if(srcdcpl >= 0)
+            (void)H5Pclose(srcdcpl);
+        if(dapl >= 0)
+            (void)H5Pclose(dapl);
+    } H5E_END_TRY;
+
+     return 1;
+} /* end test_unlim() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    test_printf
+ *
+ * Purpose:     Tests VDS with unlimited selections and printf style
+ *              source dataset resolution
+ *
+ * Return:      Success:        0
+ *
+ *              Failure:        number of errors
+ *
+ * Programmer:  Neil Fortner
+ *              Tuesday, May 26, 2015
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_printf(unsigned config, hid_t fapl)
+{
+    char        srcfilename[FILENAME_BUF_SIZE];
+    char        srcfilename_map[FILENAME_BUF_SIZE];
+    char        srcfilename2[FILENAME_BUF_SIZE];
+    char        srcfilename2_map[FILENAME_BUF_SIZE];
+    char        vfilename[FILENAME_BUF_SIZE];
+    char        printf_srcfilename_map[FILENAME_BUF_SIZE];
+    const char *printf_srcfilename_map_orig = "vds_src_%b";
+    char        srcfilenamepct[FILENAME_BUF_SIZE];
+    char        srcfilenamepct_map[FILENAME_BUF_SIZE];
+    const char *srcfilenamepct_map_orig = "vds%%%%_src";
+    hid_t       srcfile[4] = {-1, -1, -1, -1}; /* Files with source dsets */
+    hid_t       vfile = -1;     /* File with virtual dset */
+    hid_t       dcpl = -1;      /* Dataset creation property list */
+    hid_t       dapl = -1;      /* Dataset access property list */
+    hid_t       srcspace = -1;  /* Source dataspace */
+    hid_t       vspace[2] = {-1, -1}; /* Virtual dset dataspaces */
+    hid_t       memspace = -1;  /* Memory dataspace */
+    hid_t       filespace = -1; /* File dataspace */
+    hid_t       srcdset[6] = {-1, -1, -1, -1, -1, -1}; /* Source datsets */
+    hid_t       vdset = -1;     /* Virtual dataset */
+    hsize_t     dims[2] = {10, 0}; /* Data space current size */
+    hsize_t     mdims[2] = {10, 20}; /* Data space maximum size */
+    hsize_t     start[2] = {0, 0}; /* Hyperslab start */
+    hsize_t     stride[2];      /* Hyperslab stride */
+    hsize_t     count[2];       /* Hyperslab count */
+    hsize_t     block[2];       /* Hyperslab block */
+    int         buf[10][20];    /* Write and expected read buffer */
+    int         rbuf[10][20];   /* Read buffer */
+    int         erbuf[10][20];  /* Expected read buffer */
+    int         ndims;          /* Number of dimensions */
+    int         fill = -1;      /* Fill value */
+    hsize_t     gap_size;       /* Gap size property */
+    int         i, j;
+
+    TESTING("virtual dataset I/O with printf source")
+
+    h5_fixname(FILENAME[0], fapl, vfilename, sizeof vfilename);
+    h5_fixname(FILENAME[2], fapl, srcfilename, sizeof srcfilename);
+    h5_fixname_printf(FILENAME[2], fapl, srcfilename_map, sizeof srcfilename_map);
+    h5_fixname(FILENAME[3], fapl, srcfilename2, sizeof srcfilename2);
+    h5_fixname_printf(FILENAME[2], fapl, srcfilename2_map, sizeof srcfilename2_map);
+    h5_fixname_printf(printf_srcfilename_map_orig, fapl, printf_srcfilename_map, sizeof printf_srcfilename_map);
+    h5_fixname(FILENAME[4], fapl, srcfilenamepct, sizeof srcfilenamepct);
+    h5_fixname_printf(srcfilenamepct_map_orig, fapl, srcfilenamepct_map, sizeof srcfilenamepct_map);
+
+    /* Create DCPL */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        TEST_ERROR
+
+    /* Set fill value */
+    if(H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fill) < 0)
+        TEST_ERROR
+
+    /* Create DAPL */
+    if((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
+        TEST_ERROR
+
+    /* Create memory space */
+    if((memspace = H5Screate_simple(2, mdims, NULL)) < 0)
+        TEST_ERROR
+
+
+    /*
+     * Test 1: 1 Source dataset mapping, 10x5 blocks
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspace */
+    if((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+
+    /* Create source dataspace */
+    dims[1] = 5;
+    if((srcspace = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Select hyperslabs in virtual space */
+    stride[0] = 1;
+    stride[1] = 5;
+    count[0] = 1;
+    count[1] = H5S_UNLIMITED;
+    block[0] = 10;
+    block[1] = 5;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+
+    /* Add virtual layout mapping */
+    if(H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset%b", srcspace) < 0)
+        TEST_ERROR
+
+    /* Create virtual file */
+    if((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create source file if requested */
+    if(config & TEST_IO_DIFFERENT_FILE) {
+        if((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    else {
+        srcfile[0] = vfile;
+        if(H5Iinc_ref(srcfile[0]) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Create virtual dataset */
+    if((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
+        TEST_ERROR
+
+    /* Close srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC)
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 0)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Reopen srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC)
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+
+    /* Create 2 source datasets */
+    if((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset0", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Populate write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] = (i * (int)mdims[1]) + j;
+
+    /* Initialize erbuf */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            erbuf[i][j] = fill;
+
+    /* Write to srcdset[0] */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 5; j++)
+            erbuf[i][j] = buf[i][j];
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to srcdset[1] */
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 5; j++)
+            erbuf[i][j + 5] = buf[i][j];
+
+    /* Close srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 10)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reopen srcfile if config option specified */
+    if((config & TEST_IO_CLOSE_SRC) && (config & TEST_IO_DIFFERENT_FILE))
+        if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+
+    /* Create 3rd source dataset */
+    if((srcdset[2] = H5Dcreate2(srcfile[0], "src_dset2", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to srcdset[2] */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[2], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 5; j++)
+            erbuf[i][j + 10] = buf[i][j];
+
+    /* Close srcdset[2] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[2]) < 0)
+            TEST_ERROR
+        srcdset[2] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 15)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Now try with different selections */
+    count[0] = 10;
+    for(start[1] = (hsize_t)0; start[1] < (hsize_t)5; start[1]++)
+        for(count[1] = (hsize_t)1; count[1] < (hsize_t)11; count[1]++) {
+            /* Reset rbuf */
+            HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+            /* Select hyperslab in memory space */
+            if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+                TEST_ERROR
+
+            /* Select hyperslab in file space */
+            if(H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+                TEST_ERROR
+
+            /* Read data */
+            if(H5Dread(vdset, H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, rbuf[0]) < 0)
+                TEST_ERROR
+
+            /* Verify read data */
+            for(i = 0; i < (int)mdims[0]; i++)
+                for(j = 0; j < (int)mdims[1]; j++) {
+                    if((j < (int)start[1]) || (j >= (int)(start[1] + count[1]))) {
+                        if(rbuf[i][j] != 0)
+                            TEST_ERROR
+                    } /* end if */
+                    else
+                        if(rbuf[i][j] != erbuf[i][j])
+                            TEST_ERROR
+                } /* end for */
+        } /* end for */
+    start[1] = 0;
+
+    /* Now try writing through VDS */
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Select hyperslab in file space */
+    if(H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write data through VDS */
+    if(H5Dwrite(vdset, H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Reopen srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[0] = H5Dopen2(srcfile[0], "src_dset0", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+        if((srcdset[1] = H5Dopen2(srcfile[0], "src_dset1", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+        if((srcdset[2] = H5Dopen2(srcfile[0], "src_dset2", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Read srcdset[0] */
+    count[0] = 10;
+    count[1] = 5;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    if(H5Dread(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 5; j++)
+            if(rbuf[i][j] != buf[i][j])
+                TEST_ERROR
+
+    /* Read srcdset[1] */
+    if(H5Dread(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 5; j++)
+            if(rbuf[i][j] != buf[i][j + 5])
+                TEST_ERROR
+
+    /* Read srcdset[2] */
+    if(H5Dread(srcdset[2], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < 10; i++)
+        for(j = 0; j < 5; j++)
+            if(rbuf[i][j] != buf[i][j + 10])
+                TEST_ERROR
+
+    /* Close */
+    if(H5Dclose(srcdset[0]) < 0)
+        TEST_ERROR
+    srcdset[0] = -1;
+    if(H5Dclose(srcdset[1]) < 0)
+        TEST_ERROR
+    srcdset[1] = -1;
+    if(H5Dclose(srcdset[2]) < 0)
+        TEST_ERROR
+    srcdset[2] = -1;
+    if(H5Fclose(srcfile[0]) < 0)
+        TEST_ERROR
+    srcfile[0] = -1;
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    vdset = -1;
+    if(H5Fclose(vfile) < 0)
+        TEST_ERROR
+    vfile = -1;
+    if(H5Sclose(srcspace) < 0)
+        TEST_ERROR
+    srcspace = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+
+
+    /*
+     * Test 2: 1 Source dataset mapping, 10x1 blocks, test printf gap setting,
+     * '%' in source file name
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspaces */
+    if((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+
+    /* Create source dataspace */
+    dims[1] = 1;
+    if((srcspace = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Select hyperslabs in virtual space */
+    stride[0] = 1;
+    stride[1] = 1;
+    count[0] = 1;
+    count[1] = H5S_UNLIMITED;
+    block[0] = 10;
+    block[1] = 1;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+
+    /* Add virtual layout mapping */
+    if(H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilenamepct_map : ".", "src_dset%b", srcspace) < 0)
+        TEST_ERROR
+
+    /* Create virtual file */
+    if((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create source file if requested */
+    if(config & TEST_IO_DIFFERENT_FILE) {
+        if((srcfile[0] = H5Fcreate(srcfilenamepct, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    else {
+        srcfile[0] = vfile;
+        if(H5Iinc_ref(srcfile[0]) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Create virtual dataset */
+    if((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
+        TEST_ERROR
+
+    /* Close srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC)
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 0)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Reopen srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC)
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilenamepct, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+
+    /* Create source datasets in a pattern with increasing gaps:
+     * XX-X--X---X----X */
+    if((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset0", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if((srcdset[2] = H5Dcreate2(srcfile[0], "src_dset3", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if((srcdset[3] = H5Dcreate2(srcfile[0], "src_dset6", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if((srcdset[4] = H5Dcreate2(srcfile[0], "src_dset10", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if((srcdset[5] = H5Dcreate2(srcfile[0], "src_dset15", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Populate write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] = (i * (int)mdims[1]) + j;
+
+    /* Initialize erbuf */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            erbuf[i][j] = fill;
+
+    /* Write to srcdset[0] */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++)
+        erbuf[i][0] = buf[i][0];
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to srcdset[1] */
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++)
+        erbuf[i][1] = buf[i][0];
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to srcdset[2] */
+    if(H5Dwrite(srcdset[2], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++)
+        erbuf[i][3] = buf[i][0];
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to srcdset[3] */
+    if(H5Dwrite(srcdset[3], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++)
+        erbuf[i][6] = buf[i][0];
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to srcdset[4] */
+    if(H5Dwrite(srcdset[4], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++)
+        erbuf[i][10] = buf[i][0];
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to srcdset[5] */
+    if(H5Dwrite(srcdset[5], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++)
+        erbuf[i][15] = buf[i][0];
+
+    /* Close srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        for(i = 0; i < 6; i++) {
+            if(H5Dclose(srcdset[i]) < 0)
+                TEST_ERROR
+            srcdset[i] = -1;
+        } /* end for */
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 2)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Test H5Pget_virtual_printf_gap() */
+    if(H5Pget_virtual_printf_gap(dapl, &gap_size) < 0)
+        TEST_ERROR
+    if(gap_size != (hsize_t)0)
+        TEST_ERROR
+
+    /* Close VDS and reopen with printf gap set to 1, reopen file as well if
+     * config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_printf_gap(dapl, (hsize_t)1) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Test H5Pget_virtual_printf_gap() */
+    if(H5Pget_virtual_printf_gap(dapl, &gap_size) < 0)
+        TEST_ERROR
+    if(gap_size != (hsize_t)1)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 4)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close VDS and reopen with printf gap set to 2, reopen file as well if
+     * config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_printf_gap(dapl, (hsize_t)2) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 7)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close VDS and reopen with printf gap set to 3, reopen file as well if
+     * config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_printf_gap(dapl, (hsize_t)3) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 11)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close VDS and reopen with printf gap set to 4, reopen file as well if
+     * config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_printf_gap(dapl, (hsize_t)4) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 16)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
+     * as well if config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 2)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reset dapl */
+    if(H5Pset_virtual_printf_gap(dapl, (hsize_t)0) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
+        TEST_ERROR
+
+    /* Close */
+    if(!(config & TEST_IO_CLOSE_SRC)) {
+        for(i = 0; i < 6; i++) {
+            if(H5Dclose(srcdset[i]) < 0)
+                TEST_ERROR
+            srcdset[i] = -1;
+        } /* end for */
+        if(H5Fclose(srcfile[0]) < 0)
+            TEST_ERROR
+        srcfile[0] = -1;
+    } /* end if */
+    else if(!(config & TEST_IO_DIFFERENT_FILE)) {
+        if(H5Fclose(srcfile[0]) < 0)
+            TEST_ERROR
+        srcfile[0] = -1;
+    } /* end if */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    vdset = -1;
+    if(H5Fclose(vfile) < 0)
+        TEST_ERROR
+    vfile = -1;
+    if(H5Sclose(srcspace) < 0)
+        TEST_ERROR
+    srcspace = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+
+
+    /* Next 2 tests are always run with a different source file, so only run if
+     * that config option is set (so they're not run twice with the same
+     * configuration) */
+    if(config & TEST_IO_DIFFERENT_FILE) {
+        /*
+         * Test 3: 1 Source dataset mapping, 10x5 blocks, printf source file
+         */
+        /* Clean up files so the source files do not exist yet */
+        H5Iinc_ref(fapl);       /* Prevent FAPL from being closed */
+        h5_clean_files(FILENAME, fapl);
+
+        /* Clear virtual layout in DCPL */
+        if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+            TEST_ERROR
+
+        /* Create virtual dataspaces */
+        if((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
+            TEST_ERROR
+
+        /* Create source dataspace */
+        dims[1] = 5;
+        if((srcspace = H5Screate_simple(2, dims, NULL)) < 0)
+            TEST_ERROR
+
+        /* Select hyperslabs in virtual space */
+        stride[0] = 1;
+        stride[1] = 5;
+        count[0] = 1;
+        count[1] = H5S_UNLIMITED;
+        block[0] = 10;
+        block[1] = 5;
+        if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
+            TEST_ERROR
+
+        /* Add virtual layout mapping */
+        if(H5Pset_virtual(dcpl, vspace[0], printf_srcfilename_map, "src_dset", srcspace) < 0)
+            TEST_ERROR
+
+        /* Create virtual file */
+        if((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+
+        /* Create virtual dataset */
+        if((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
+            TEST_ERROR
+
+        /* Reopen virtual dataset and file if config option specified */
+        if(config & TEST_IO_REOPEN_VIRT) {
+            if(H5Dclose(vdset) < 0)
+                TEST_ERROR
+            vdset = -1;
+            if(H5Fclose(vfile) < 0)
+                TEST_ERROR
+            vfile = -1;
+            if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+            if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+                TEST_ERROR
+        } /* end if */
+
+        /* Get VDS space */
+        if((filespace = H5Dget_space(vdset)) < 0)
+            TEST_ERROR
+
+        /* Get VDS space dimensions */
+        if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+            TEST_ERROR
+        if(ndims != 2)
+            TEST_ERROR
+        if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+            TEST_ERROR
+        if(dims[0] != 10)
+            TEST_ERROR
+        if(dims[1] != 0)
+            TEST_ERROR
+        if(mdims[0] != 10)
+            TEST_ERROR
+        if(mdims[1] != 20)
+            TEST_ERROR
+
+        /* Close filespace */
+        if(H5Sclose(filespace) < 0)
+            TEST_ERROR
+
+        /* Create 2 source files, one source dataset */
+        if((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+        if((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            TEST_ERROR
+        if((srcfile[1] = H5Fcreate(srcfilename2, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+
+        /* Populate write buffer */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++)
+                buf[i][j] = (i * (int)mdims[1]) + j;
+
+        /* Initialize erbuf */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++)
+                erbuf[i][j] = fill;
+
+        /* Write to srcdset[0] */
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+            TEST_ERROR
+        if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+            TEST_ERROR
+
+        /* Update erbuf */
+        for(i = 0; i < 10; i++)
+            for(j = 0; j < 5; j++)
+                erbuf[i][j] = buf[i][j];
+
+        /* Close srcdset and srcfiles if config option specified */
+        if(config & TEST_IO_CLOSE_SRC) {
+            if(H5Dclose(srcdset[0]) < 0)
+                TEST_ERROR
+            srcdset[0] = -1;
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+            if(H5Fclose(srcfile[1]) < 0)
+                TEST_ERROR
+            srcfile[1] = -1;
+        } /* end if */
+
+        /* Reopen virtual dataset and file if config option specified */
+        if(config & TEST_IO_REOPEN_VIRT) {
+            if(H5Dclose(vdset) < 0)
+                TEST_ERROR
+            vdset = -1;
+            if(H5Fclose(vfile) < 0)
+                TEST_ERROR
+            vfile = -1;
+            if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+            if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+                TEST_ERROR
+        } /* end if */
+
+        /* Get VDS space */
+        if((filespace = H5Dget_space(vdset)) < 0)
+            TEST_ERROR
+
+        /* Get VDS space dimensions */
+        if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+            TEST_ERROR
+        if(ndims != 2)
+            TEST_ERROR
+        if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+            TEST_ERROR
+        if(dims[0] != 10)
+            TEST_ERROR
+        if(dims[1] != 5)
+            TEST_ERROR
+        if(mdims[0] != 10)
+            TEST_ERROR
+        if(mdims[1] != 20)
+            TEST_ERROR
+
+        /* Close filespace */
+        if(H5Sclose(filespace) < 0)
+            TEST_ERROR
+
+        /* Read data through virtual dataset */
+        /* Reset rbuf */
+        HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+        /* Select hyperslab in memory space */
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+            TEST_ERROR
+
+        /* Read data */
+        if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+            TEST_ERROR
+
+        /* Verify read data */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++) {
+                if(j >= (int)dims[1]) {
+                    if(rbuf[i][j] != 0)
+                        TEST_ERROR
+                } /* end if */
+                else
+                    if(rbuf[i][j] != erbuf[i][j])
+                        TEST_ERROR
+            } /* end for */
+
+        /* Reopen srcfile[1] if config option specified */
+        if(config & TEST_IO_CLOSE_SRC)
+            if((srcfile[1] = H5Fopen(srcfilename2, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+
+        /* Create 2nd source dataset */
+        if((srcdset[1] = H5Dcreate2(srcfile[1], "src_dset", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            TEST_ERROR
+
+        /* Adjust write buffer */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++)
+                buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+        /* Write to srcdset[1] */
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+            TEST_ERROR
+        if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+            TEST_ERROR
+
+        /* Update erbuf */
+        for(i = 0; i < 10; i++)
+            for(j = 0; j < 5; j++)
+                erbuf[i][j + 5] = buf[i][j];
+
+        /* Close srcdset[1] and srcfile[1] if config option specified */
+        if(config & TEST_IO_CLOSE_SRC) {
+            if(H5Dclose(srcdset[1]) < 0)
+                TEST_ERROR
+            srcdset[1] = -1;
+            if(H5Fclose(srcfile[1]) < 0)
+                TEST_ERROR
+            srcfile[1] = -1;
+        } /* end if */
+
+        /* Reopen virtual dataset and file if config option specified */
+        if(config & TEST_IO_REOPEN_VIRT) {
+            if(H5Dclose(vdset) < 0)
+                TEST_ERROR
+            vdset = -1;
+            if(H5Fclose(vfile) < 0)
+                TEST_ERROR
+            vfile = -1;
+            if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+            if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+                TEST_ERROR
+        } /* end if */
+
+        /* Get VDS space */
+        if((filespace = H5Dget_space(vdset)) < 0)
+            TEST_ERROR
+
+        /* Get VDS space dimensions */
+        if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+            TEST_ERROR
+        if(ndims != 2)
+            TEST_ERROR
+        if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+            TEST_ERROR
+        if(dims[0] != 10)
+            TEST_ERROR
+        if(dims[1] != 10)
+            TEST_ERROR
+        if(mdims[0] != 10)
+            TEST_ERROR
+        if(mdims[1] != 20)
+            TEST_ERROR
+
+        /* Close filespace */
+        if(H5Sclose(filespace) < 0)
+            TEST_ERROR
+
+        /* Read data through virtual dataset */
+        /* Reset rbuf */
+        HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+        /* Select hyperslab in memory space */
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+            TEST_ERROR
+
+        /* Read data */
+        if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+            TEST_ERROR
+
+        /* Verify read data */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++) {
+                if(j >= (int)dims[1]) {
+                    if(rbuf[i][j] != 0)
+                        TEST_ERROR
+                } /* end if */
+                else
+                    if(rbuf[i][j] != erbuf[i][j])
+                        TEST_ERROR
+            } /* end for */
+
+        /* Close */
+        if(!(config & TEST_IO_CLOSE_SRC)) {
+            if(H5Dclose(srcdset[0]) < 0)
+                TEST_ERROR
+            srcdset[0] = -1;
+            if(H5Dclose(srcdset[1]) < 0)
+                TEST_ERROR
+            srcdset[1] = -1;
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+            if(H5Fclose(srcfile[1]) < 0)
+                TEST_ERROR
+            srcfile[1] = -1;
+        } /* end if */
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if(H5Sclose(srcspace) < 0)
+            TEST_ERROR
+        srcspace = -1;
+        if(H5Sclose(vspace[0]) < 0)
+            TEST_ERROR
+        vspace[0] = -1;
+
+
+        /*
+         * Test 4: 1 Source dataset mapping, 10x5 blocks, printf source file and
+         * source dset, extra %%s in source dataset name
+         */
+        /* Clean up files so the source files do not exist yet */
+        H5Iinc_ref(fapl);       /* Prevent FAPL from being closed */
+        h5_clean_files(FILENAME, fapl);
+
+        /* Clear virtual layout in DCPL */
+        if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+            TEST_ERROR
+
+        /* Create virtual dataspaces */
+        if((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
+            TEST_ERROR
+
+        /* Create source dataspace */
+        dims[1] = 5;
+        if((srcspace = H5Screate_simple(2, dims, NULL)) < 0)
+            TEST_ERROR
+
+        /* Select hyperslabs in virtual space */
+        stride[0] = 1;
+        stride[1] = 5;
+        count[0] = 1;
+        count[1] = H5S_UNLIMITED;
+        block[0] = 10;
+        block[1] = 5;
+        if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
+            TEST_ERROR
+
+        /* Add virtual layout mapping */
+        if(H5Pset_virtual(dcpl, vspace[0], printf_srcfilename_map, "%%src%%_dset%%%b", srcspace) < 0)
+            TEST_ERROR
+
+        /* Create virtual file */
+        if((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+
+        /* Create virtual dataset */
+        if((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
+            TEST_ERROR
+
+        /* Reopen virtual dataset and file if config option specified */
+        if(config & TEST_IO_REOPEN_VIRT) {
+            if(H5Dclose(vdset) < 0)
+                TEST_ERROR
+            vdset = -1;
+            if(H5Fclose(vfile) < 0)
+                TEST_ERROR
+            vfile = -1;
+            if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+            if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+                TEST_ERROR
+        } /* end if */
+
+        /* Get VDS space */
+        if((filespace = H5Dget_space(vdset)) < 0)
+            TEST_ERROR
+
+        /* Get VDS space dimensions */
+        if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+            TEST_ERROR
+        if(ndims != 2)
+            TEST_ERROR
+        if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+            TEST_ERROR
+        if(dims[0] != 10)
+            TEST_ERROR
+        if(dims[1] != 0)
+            TEST_ERROR
+        if(mdims[0] != 10)
+            TEST_ERROR
+        if(mdims[1] != 20)
+            TEST_ERROR
+
+        /* Close filespace */
+        if(H5Sclose(filespace) < 0)
+            TEST_ERROR
+
+        /* Create 2 source files, one source dataset */
+        if((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+        if((srcdset[0] = H5Dcreate2(srcfile[0], "%src%_dset%0", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            TEST_ERROR
+        if((srcfile[1] = H5Fcreate(srcfilename2, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+
+        /* Populate write buffer */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++)
+                buf[i][j] = (i * (int)mdims[1]) + j;
+
+        /* Initialize erbuf */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++)
+                erbuf[i][j] = fill;
+
+        /* Write to srcdset[0] */
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+            TEST_ERROR
+        if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+            TEST_ERROR
+
+        /* Update erbuf */
+        for(i = 0; i < 10; i++)
+            for(j = 0; j < 5; j++)
+                erbuf[i][j] = buf[i][j];
+
+        /* Close srcdset and srcfiles if config option specified */
+        if(config & TEST_IO_CLOSE_SRC) {
+            if(H5Dclose(srcdset[0]) < 0)
+                TEST_ERROR
+            srcdset[0] = -1;
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+            if(H5Fclose(srcfile[1]) < 0)
+                TEST_ERROR
+            srcfile[1] = -1;
+        } /* end if */
+
+        /* Reopen virtual dataset and file if config option specified */
+        if(config & TEST_IO_REOPEN_VIRT) {
+            if(H5Dclose(vdset) < 0)
+                TEST_ERROR
+            vdset = -1;
+            if(H5Fclose(vfile) < 0)
+                TEST_ERROR
+            vfile = -1;
+            if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+            if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+                TEST_ERROR
+        } /* end if */
+
+        /* Get VDS space */
+        if((filespace = H5Dget_space(vdset)) < 0)
+            TEST_ERROR
+
+        /* Get VDS space dimensions */
+        if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+            TEST_ERROR
+        if(ndims != 2)
+            TEST_ERROR
+        if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+            TEST_ERROR
+        if(dims[0] != 10)
+            TEST_ERROR
+        if(dims[1] != 5)
+            TEST_ERROR
+        if(mdims[0] != 10)
+            TEST_ERROR
+        if(mdims[1] != 20)
+            TEST_ERROR
+
+        /* Close filespace */
+        if(H5Sclose(filespace) < 0)
+            TEST_ERROR
+
+        /* Read data through virtual dataset */
+        /* Reset rbuf */
+        HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+        /* Select hyperslab in memory space */
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+            TEST_ERROR
+
+        /* Read data */
+        if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+            TEST_ERROR
+
+        /* Verify read data */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++) {
+                if(j >= (int)dims[1]) {
+                    if(rbuf[i][j] != 0)
+                        TEST_ERROR
+                } /* end if */
+                else
+                    if(rbuf[i][j] != erbuf[i][j])
+                        TEST_ERROR
+            } /* end for */
+
+        /* Reopen srcfile[1] if config option specified */
+        if(config & TEST_IO_CLOSE_SRC)
+            if((srcfile[1] = H5Fopen(srcfilename2, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+
+        /* Create 2nd source dataset */
+        if((srcdset[1] = H5Dcreate2(srcfile[1], "%src%_dset%1", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            TEST_ERROR
+
+        /* Adjust write buffer */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++)
+                buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+        /* Write to srcdset[1] */
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+            TEST_ERROR
+        if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+            TEST_ERROR
+
+        /* Update erbuf */
+        for(i = 0; i < 10; i++)
+            for(j = 0; j < 5; j++)
+                erbuf[i][j + 5] = buf[i][j];
+
+        /* Close srcdset[1] and srcfile[1] if config option specified */
+        if(config & TEST_IO_CLOSE_SRC) {
+            if(H5Dclose(srcdset[1]) < 0)
+                TEST_ERROR
+            srcdset[1] = -1;
+            if(H5Fclose(srcfile[1]) < 0)
+                TEST_ERROR
+            srcfile[1] = -1;
+        } /* end if */
+
+        /* Reopen virtual dataset and file if config option specified */
+        if(config & TEST_IO_REOPEN_VIRT) {
+            if(H5Dclose(vdset) < 0)
+                TEST_ERROR
+            vdset = -1;
+            if(H5Fclose(vfile) < 0)
+                TEST_ERROR
+            vfile = -1;
+            if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+            if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+                TEST_ERROR
+        } /* end if */
+
+        /* Get VDS space */
+        if((filespace = H5Dget_space(vdset)) < 0)
+            TEST_ERROR
+
+        /* Get VDS space dimensions */
+        if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+            TEST_ERROR
+        if(ndims != 2)
+            TEST_ERROR
+        if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+            TEST_ERROR
+        if(dims[0] != 10)
+            TEST_ERROR
+        if(dims[1] != 10)
+            TEST_ERROR
+        if(mdims[0] != 10)
+            TEST_ERROR
+        if(mdims[1] != 20)
+            TEST_ERROR
+
+        /* Close filespace */
+        if(H5Sclose(filespace) < 0)
+            TEST_ERROR
+
+        /* Read data through virtual dataset */
+        /* Reset rbuf */
+        HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+        /* Select hyperslab in memory space */
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+            TEST_ERROR
+
+        /* Read data */
+        if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+            TEST_ERROR
+
+        /* Verify read data */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++) {
+                if(j >= (int)dims[1]) {
+                    if(rbuf[i][j] != 0)
+                        TEST_ERROR
+                } /* end if */
+                else
+                    if(rbuf[i][j] != erbuf[i][j])
+                        TEST_ERROR
+            } /* end for */
+
+        /* Close */
+        if(!(config & TEST_IO_CLOSE_SRC)) {
+            if(H5Dclose(srcdset[0]) < 0)
+                TEST_ERROR
+            srcdset[0] = -1;
+            if(H5Dclose(srcdset[1]) < 0)
+                TEST_ERROR
+            srcdset[1] = -1;
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+            if(H5Fclose(srcfile[1]) < 0)
+                TEST_ERROR
+            srcfile[1] = -1;
+        } /* end if */
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if(H5Sclose(srcspace) < 0)
+            TEST_ERROR
+        srcspace = -1;
+        if(H5Sclose(vspace[0]) < 0)
+            TEST_ERROR
+        vspace[0] = -1;
+    } /* end if */
+
+
+    /*
+     * Test 5: 2 Source mappings, interleaved slices, single element wide,
+     * hyperslab selection in source, extra %%s in source dataset names
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspaces */
+    dims[0] = 10;
+    dims[1] = 10;
+    if((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+    if((vspace[1] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+
+    /* Create source dataspace (2 elements wide) */
+    dims[1] = 2;
+    if((srcspace = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Select hyperslab in source space */
+    count[0] = 10;
+    count[1] = 1;
+    if(H5Sselect_hyperslab(srcspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+
+    /* Select hyperslabs in virtual spaces */
+    stride[0] = 1;
+    stride[1] = 2;
+    count[0] = 1;
+    count[1] = H5S_UNLIMITED;
+    block[0] = 10;
+    block[1] = 1;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+    start[1] = 1;
+    if(H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+    start[1] = 0;
+
+    /* Add virtual layout mappings */
+    if(H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "%bsrc_dset_a%b%%", srcspace) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset_b%b%%%%", srcspace) < 0)
+        TEST_ERROR
+
+    /* Create virtual file */
+    if((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create source file if requested */
+    if(config & TEST_IO_DIFFERENT_FILE) {
+        if((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    else {
+        srcfile[0] = vfile;
+        if(H5Iinc_ref(srcfile[0]) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Create virtual dataset */
+    if((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
+        TEST_ERROR
+
+    /* Close srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC)
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 0)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Reopen srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC)
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+
+    /* Create 2 source datasets */
+    if((srcdset[0] = H5Dcreate2(srcfile[0], "0src_dset_a0%", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset_b0%%", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Populate write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] = (i * (int)mdims[1]) + j;
+
+    /* Initialize erbuf */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            erbuf[i][j] = fill;
+
+    /* Write to srcdset[0] */
+    block[0] = 10;
+    block[1] = 2;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++)
+        erbuf[i][0] = buf[i][0];
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to srcdset[1] */
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++)
+        erbuf[i][1] = buf[i][0];
+
+    /* Close srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 2)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reopen srcfile if config option specified */
+    if((config & TEST_IO_CLOSE_SRC) && (config & TEST_IO_DIFFERENT_FILE))
+        if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+
+    /* Create 3rd source dataset */
+    if((srcdset[2] = H5Dcreate2(srcfile[0], "src_dset_b1%%", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to srcdset[2] */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[2], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++)
+        erbuf[i][3] = buf[i][0];
+
+    /* Close srcdset[2] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[2]) < 0)
+            TEST_ERROR
+        srcdset[2] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 4)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
+     * as well if config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions.  Make sure that the 4th slice is no longer
+     * visible due to the change to H5D_VDS_FIRST_MISSING. */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 2)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reopen srcfile if config option specified */
+    if((config & TEST_IO_CLOSE_SRC) && (config & TEST_IO_DIFFERENT_FILE))
+        if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+
+    /* Create 4th source dataset */
+    if((srcdset[3] = H5Dcreate2(srcfile[0], "2src_dset_a2%", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to srcdset[3] */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[3], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++)
+        erbuf[i][4] = buf[i][0];
+
+    /* Close srcdset[3] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[3]) < 0)
+            TEST_ERROR
+        srcdset[3] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 2)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close VDS and reopen with view set to H5D_VDS_LAST_AVAILABLE, reopen file
+     * as well if config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions.  Make sure that the 4th slice is now visible
+     * due to the change to H5D_VDS_LAST_AVAILABLE. */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 4)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close VDS and reopen with printf_gap set to 1, reopen file as well if
+     * config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_printf_gap(dapl, (hsize_t)1) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions.  Make sure that the 6th slice is now visible
+     * due to the change to printf_gap. */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 5)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reset dapl */
+    if(H5Pset_virtual_printf_gap(dapl, (hsize_t)0) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
+        TEST_ERROR
+
+    /* Close */
+    if(!(config & TEST_IO_CLOSE_SRC)) {
+        for(i = 0; i < 4; i++) {
+            if(H5Dclose(srcdset[i]) < 0)
+                TEST_ERROR
+            srcdset[i] = -1;
+        } /* end for */
+        if(H5Fclose(srcfile[0]) < 0)
+            TEST_ERROR
+        srcfile[0] = -1;
+    } /* end if */
+    else if(!(config & TEST_IO_DIFFERENT_FILE)) {
+        if(H5Fclose(srcfile[0]) < 0)
+            TEST_ERROR
+        srcfile[0] = -1;
+    } /* end if */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    vdset = -1;
+    if(H5Fclose(vfile) < 0)
+        TEST_ERROR
+    vfile = -1;
+    if(H5Sclose(srcspace) < 0)
+        TEST_ERROR
+    srcspace = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+    if(H5Sclose(vspace[1]) < 0)
+        TEST_ERROR
+    vspace[1] = -1;
+
+
+    /*
+     * Test 6: 2 Source mappings, side-by-side, 5x5 and 5x10 blocks
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspaces */
+    dims[0] = 10;
+    dims[1] = 10;
+    if((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+    if((vspace[1] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+
+    /* Create source dataspace (1 dimensional) */
+    dims[0] = 50;
+    if((srcspace = H5Screate_simple(1, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Select hyperslab in source space */
+    count[0] = 25;
+    if(H5Sselect_hyperslab(srcspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+
+    /* Select hyperslabs in virtual spaces */
+    stride[0] = 1;
+    stride[1] = 5;
+    count[0] = 1;
+    count[1] = H5S_UNLIMITED;
+    block[0] = 5;
+    block[1] = 5;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+    start[0] = 5;
+    stride[1] = 10;
+    block[1] = 10;
+    if(H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+    start[0] = 0;
+
+    /* Add virtual layout mappings (select ALL in source space for second
+     * mapping) */
+    if(H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset_a%b", srcspace) < 0)
+        TEST_ERROR
+    if(H5Sselect_all(srcspace) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset_b%b", srcspace) < 0)
+        TEST_ERROR
+
+    /* Create virtual file */
+    if((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create source file if requested */
+    if(config & TEST_IO_DIFFERENT_FILE) {
+        if((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    else {
+        srcfile[0] = vfile;
+        if(H5Iinc_ref(srcfile[0]) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Create virtual dataset */
+    if((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
+        TEST_ERROR
+
+    /* Close srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC)
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 0)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Reopen srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC)
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+
+    /* Create 2 source datasets */
+    if((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset_a0", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset_b0", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Populate write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] = (i * (int)mdims[1]) + j;
+
+    /* Initialize erbuf */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            erbuf[i][j] = fill;
+
+    /* Write to srcdset[0] */
+    block[0] = 5;
+    block[1] = 5;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    count[0] = 25;
+    if(H5Sselect_hyperslab(srcspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, srcspace, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 5; i++)
+        for(j = 0; j < 5; j++)
+            erbuf[i][j] = buf[i][j];
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to srcdset[1] */
+    block[1] = 10;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    if(H5Sselect_all(srcspace) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, srcspace, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 5; i++)
+        for(j = 0; j < 10; j++)
+            erbuf[i + 5][j] = buf[i][j];
+
+    /* Close srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 10)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
+     * as well if config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions.  Make sure that the 4th slice is no longer
+     * visible due to the change to H5D_VDS_FIRST_MISSING. */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 5)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reopen srcfile if config option specified */
+    if((config & TEST_IO_CLOSE_SRC) && (config & TEST_IO_DIFFERENT_FILE))
+        if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+
+    /* Create 3rd source dataset */
+    if((srcdset[2] = H5Dcreate2(srcfile[0], "src_dset_a1", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to srcdset[2] */
+    block[1] = 5;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    if(H5Sselect_hyperslab(srcspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[2], H5T_NATIVE_INT, memspace, srcspace, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 5; i++)
+        for(j = 0; j < 5; j++)
+            erbuf[i][j + 5] = buf[i][j];
+
+    /* Close srcdset[2] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[2]) < 0)
+            TEST_ERROR
+        srcdset[2] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 10)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close VDS and reopen with view set to H5D_VDS_LAST_AVAILABLE, reopen file
+     * as well if config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions.  There should be no change. */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 10)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reopen srcfile if config option specified */
+    if((config & TEST_IO_CLOSE_SRC) && (config & TEST_IO_DIFFERENT_FILE))
+        if((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+
+    /* Create 4th source dataset */
+    if((srcdset[3] = H5Dcreate2(srcfile[0], "src_dset_a2", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to srcdset[3] */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[3], H5T_NATIVE_INT, memspace, srcspace, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 5; i++)
+        for(j = 0; j < 5; j++)
+            erbuf[i][j + 10] = buf[i][j];
+
+    /* Close srcdset[3] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[3]) < 0)
+            TEST_ERROR
+        srcdset[3] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 15)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Now test reopening virtual dataset without calling H5Dget_space, if
+     * REOPEN_VIRT flag set */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+
+        /* Read data through virtual dataset */
+        /* Reset rbuf */
+        HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+        /* Select hyperslab in memory space */
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+            TEST_ERROR
+
+        /* Read data */
+        if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+            TEST_ERROR
+
+        /* Verify read data */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++) {
+                if(j >= (int)dims[1]) {
+                    if(rbuf[i][j] != 0)
+                        TEST_ERROR
+                } /* end if */
+                else
+                    if(rbuf[i][j] != erbuf[i][j])
+                        TEST_ERROR
+            } /* end for */
+
+        /* Now try setting extent manually */
+        /* Shrink to 12 */
+        dims[1] = 12;
+        if(H5Dset_extent(vdset, dims) < 0)
+            TEST_ERROR
+
+        /* Read data through virtual dataset */
+        /* Reset rbuf */
+        HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+        /* Select hyperslab in memory space */
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+            TEST_ERROR
+
+        /* Read data */
+        if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+            TEST_ERROR
+
+        /* Verify read data */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++) {
+                if(j >= (int)dims[1]) {
+                    if(rbuf[i][j] != 0)
+                        TEST_ERROR
+                } /* end if */
+                else
+                    if(rbuf[i][j] != erbuf[i][j])
+                        TEST_ERROR
+            } /* end for */
+
+        /* Shrink to 10 */
+        dims[1] = 12;
+        if(H5Dset_extent(vdset, dims) < 0)
+            TEST_ERROR
+
+        /* Read data through virtual dataset */
+        /* Reset rbuf */
+        HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+        /* Select hyperslab in memory space */
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+            TEST_ERROR
+
+        /* Read data */
+        if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+            TEST_ERROR
+
+        /* Verify read data */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++) {
+                if(j >= (int)dims[1]) {
+                    if(rbuf[i][j] != 0)
+                        TEST_ERROR
+                } /* end if */
+                else
+                    if(rbuf[i][j] != erbuf[i][j])
+                        TEST_ERROR
+            } /* end for */
+    } /* end if */
+
+    /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
+     * as well if config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 10)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Now test reopening virtual dataset without calling H5Dget_space, if
+     * REOPEN_VIRT flag set */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+
+        /* Read data through virtual dataset */
+        /* Reset rbuf */
+        HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+        /* Select hyperslab in memory space */
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+            TEST_ERROR
+
+        /* Read data */
+        if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+            TEST_ERROR
+
+        /* Verify read data */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++) {
+                if(j >= (int)dims[1]) {
+                    if(rbuf[i][j] != 0)
+                        TEST_ERROR
+                } /* end if */
+                else
+                    if(rbuf[i][j] != erbuf[i][j])
+                        TEST_ERROR
+            } /* end for */
+
+        /* Now try setting extent manually */
+        /* Grow to 12 */
+        dims[1] = 12;
+        if(H5Dset_extent(vdset, dims) < 0)
+            TEST_ERROR
+
+        /* Read data through virtual dataset */
+        /* Reset rbuf */
+        HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+        /* Select hyperslab in memory space */
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+            TEST_ERROR
+
+        /* Read data */
+        if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+            TEST_ERROR
+
+        /* Verify read data */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++) {
+                if(j >= (int)dims[1]) {
+                    if(rbuf[i][j] != 0)
+                        TEST_ERROR
+                } /* end if */
+                else
+                    if(rbuf[i][j] != erbuf[i][j])
+                        TEST_ERROR
+            } /* end for */
+
+        /* Grow to 15 */
+        dims[1] = 15;
+        if(H5Dset_extent(vdset, dims) < 0)
+            TEST_ERROR
+
+        /* Read data through virtual dataset */
+        /* Reset rbuf */
+        HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+        /* Select hyperslab in memory space */
+        if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+            TEST_ERROR
+
+        /* Read data */
+        if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+            TEST_ERROR
+
+        /* Verify read data */
+        for(i = 0; i < (int)mdims[0]; i++)
+            for(j = 0; j < (int)mdims[1]; j++) {
+                if(j >= (int)dims[1]) {
+                    if(rbuf[i][j] != 0)
+                        TEST_ERROR
+                } /* end if */
+                else
+                    if(rbuf[i][j] != erbuf[i][j])
+                        TEST_ERROR
+            } /* end for */
+    } /* end if */
+
+    /* Reset dapl */
+    if(H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
+        TEST_ERROR
+
+    /* Close */
+    if(!(config & TEST_IO_CLOSE_SRC)) {
+        for(i = 0; i < 4; i++) {
+            if(H5Dclose(srcdset[i]) < 0)
+                TEST_ERROR
+            srcdset[i] = -1;
+        } /* end for */
+        if(H5Fclose(srcfile[0]) < 0)
+            TEST_ERROR
+        srcfile[0] = -1;
+    } /* end if */
+    else if(!(config & TEST_IO_DIFFERENT_FILE)) {
+        if(H5Fclose(srcfile[0]) < 0)
+            TEST_ERROR
+        srcfile[0] = -1;
+    } /* end if */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    vdset = -1;
+    if(H5Fclose(vfile) < 0)
+        TEST_ERROR
+    vfile = -1;
+    if(H5Sclose(srcspace) < 0)
+        TEST_ERROR
+    srcspace = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+    if(H5Sclose(vspace[1]) < 0)
+        TEST_ERROR
+    vspace[1] = -1;
+
+
+    /*
+     * Test 7: 1 Source dataset mapping, 10x1 blocks, test reallocating sub_dset
+     * array
+     */
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create virtual dataspaces */
+    if((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+
+    /* Create source dataspace */
+    dims[1] = 1;
+    if((srcspace = H5Screate_simple(2, dims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Select hyperslabs in virtual space */
+    stride[0] = 1;
+    stride[1] = 1;
+    count[0] = 1;
+    count[1] = H5S_UNLIMITED;
+    block[0] = 10;
+    block[1] = 1;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+
+    /* Add virtual layout mapping */
+    if(H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilenamepct_map : ".", "src_dset%b", srcspace) < 0)
+        TEST_ERROR
+
+    /* Create virtual file */
+    if((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create source file if requested */
+    if(config & TEST_IO_DIFFERENT_FILE) {
+        if((srcfile[0] = H5Fcreate(srcfilenamepct, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    else {
+        srcfile[0] = vfile;
+        if(H5Iinc_ref(srcfile[0]) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Create virtual dataset */
+    if((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
+        TEST_ERROR
+
+    /* Close srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC)
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 0)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Reopen srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC)
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile[0] = H5Fopen(srcfilenamepct, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+
+    /* Create 1 source dataset */
+    if((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset0", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Populate write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] = (i * (int)mdims[1]) + j;
+
+    /* Initialize erbuf */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            erbuf[i][j] = fill;
+
+    /* Write to srcdset[0] */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 10; i++)
+        erbuf[i][0] = buf[i][0];
+
+    /* Close srcdset[0] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile[0]) < 0)
+                TEST_ERROR
+            srcfile[0] = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 1)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Close VDS and reopen with printf gap set to 127, reopen file as well if
+     * config option specified */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual_printf_gap(dapl, (hsize_t)127) < 0)
+        TEST_ERROR
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    if((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 1)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 20)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reset dapl */
+    if(H5Pset_virtual_printf_gap(dapl, (hsize_t)0) < 0)
+        TEST_ERROR
+
+    /* Close */
+    if(!(config & TEST_IO_CLOSE_SRC)) {
+        if(H5Dclose(srcdset[0]) < 0)
+            TEST_ERROR
+        srcdset[0] = -1;
+        if(H5Fclose(srcfile[0]) < 0)
+            TEST_ERROR
+        srcfile[0] = -1;
+    } /* end if */
+    else if(!(config & TEST_IO_DIFFERENT_FILE)) {
+        if(H5Fclose(srcfile[0]) < 0)
+            TEST_ERROR
+        srcfile[0] = -1;
+    } /* end if */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    vdset = -1;
+    if(H5Fclose(vfile) < 0)
+        TEST_ERROR
+    vfile = -1;
+    if(H5Sclose(srcspace) < 0)
+        TEST_ERROR
+    srcspace = -1;
+    if(H5Sclose(vspace[0]) < 0)
+        TEST_ERROR
+    vspace[0] = -1;
+
+
+    /* Close */
+    if(H5Pclose(dcpl) < 0)
+        TEST_ERROR
+    dcpl = -1;
+    if(H5Pclose(dapl) < 0)
+        TEST_ERROR
+    dapl = -1;
+    if(H5Sclose(memspace) < 0)
+        TEST_ERROR
+    memspace = -1;
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        for(i = 0; i < (int)(sizeof(srcdset) / sizeof(srcdset[0])); i++) {
+            if(srcdset[i] >= 0)
+                (void)H5Dclose(srcdset[i]);
+        } /* end for */
+        if(vdset >= 0)
+            (void)H5Dclose(vdset);
+        for(i = 0; i < (int)(sizeof(srcfile) / sizeof(srcfile[0])); i++) {
+            if(srcfile[i] >= 0)
+                (void)H5Fclose(srcfile[i]);
+        } /* end for */
+        if(vfile >=  0)
+            (void)H5Fclose(vfile);
+        if(srcspace >= 0)
+            (void)H5Sclose(srcspace);
+        for(i = 0; i < (int)(sizeof(vspace) / sizeof(vspace[0])); i++) {
+            if(vspace[i] >= 0)
+                (void)H5Sclose(vspace[i]);
+        } /* end for */
+        if(filespace >= 0)
+            (void)H5Sclose(filespace);
+        if(memspace >= 0)
+            (void)H5Sclose(memspace);
+        if(dcpl >= 0)
+            (void)H5Pclose(dcpl);
+        if(dapl >= 0)
+            (void)H5Pclose(dapl);
+    } H5E_END_TRY;
+
+     return 1;
+} /* end test_printf() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    test_all
+ *
+ * Purpose:     Tests fixed, unlimited, and printf selections in the same
+ *              VDS
+ *
+ * Return:      Success:        0
+ *
+ *              Failure:        number of errors
+ *
+ * Programmer:  Neil Fortner
+ *              Friday, August 14, 2015
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_all(unsigned config, hid_t fapl)
+{
+    char        vfilename[FILENAME_BUF_SIZE];
+    char        srcfilename[FILENAME_BUF_SIZE];
+    char        srcfilename_map[FILENAME_BUF_SIZE];
+    hid_t       srcfile = -1;   /* File with source dsets */
+    hid_t       vfile = -1;     /* File with virtual dset */
+    hid_t       dcpl = -1;      /* Dataset creation property list */
+    hid_t       srcdcpl = -1;   /* DCPL for source dset */
+    hid_t       srcspace[3] = {-1, -1, -1};  /* Source dataspaces */
+    hid_t       vspace[3] = {-1, -1, -1}; /* Virtual dset dataspaces */
+    hid_t       memspace = -1;  /* Memory dataspace */
+    hid_t       filespace = -1; /* File dataspace */
+    hid_t       srcdset[5] = {-1, -1, -1, -1, -1}; /* Source datsets */
+    hid_t       vdset = -1;     /* Virtual dataset */
+    hsize_t     dims[2] = {6, 6}; /* Data space current size */
+    hsize_t     mdims[2] = {10, 10}; /* Data space maximum size */
+    hsize_t     cdims[2] = {2, 2}; /* Chunk dimensions */
+    hsize_t     start[2];       /* Hyperslab start */
+    hsize_t     stride[2];      /* Hyperslab stride */
+    hsize_t     count[2];       /* Hyperslab count */
+    hsize_t     block[2];       /* Hyperslab block */
+    int         buf[10][10];    /* Write and expected read buffer */
+    int         rbuf[10][10];   /* Read buffer */
+    int         erbuf[10][10];  /* Expected read buffer */
+    int         ndims;          /* Number of dimensions */
+    int         fill = -1;      /* Fill value */
+    int         i, j;
+
+    TESTING("virtual dataset I/O with mixed selection types")
+
+    h5_fixname(FILENAME[0], fapl, vfilename, sizeof vfilename);
+    h5_fixname(FILENAME[2], fapl, srcfilename, sizeof srcfilename);
+    h5_fixname_printf(FILENAME[2], fapl, srcfilename_map, sizeof srcfilename_map);
+
+    /* Create DCPLs */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        TEST_ERROR
+    if((srcdcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        TEST_ERROR
+
+    /* Set fill value */
+    if(H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fill) < 0)
+        TEST_ERROR
+
+    /* Set chunk dimensions */
+    if(H5Pset_chunk(srcdcpl, 2, cdims) < 0)
+        TEST_ERROR
+
+    /* Create memory space */
+    if((memspace = H5Screate_simple(2, mdims, NULL)) < 0)
+        TEST_ERROR
+
+    /* Clear virtual layout in DCPL */
+    if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+        TEST_ERROR
+
+    /* Create fixed mapping */
+    if((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+    start[0] = 3;
+    start[1] = 3;
+    count[0] = 3;
+    count[1] = 3;
+    if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
+        TEST_ERROR
+    if((srcspace[0] = H5Screate_simple(2, count, NULL)) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset_fixed", srcspace[0]) < 0)
+        TEST_ERROR
+
+    /* Create unlimited mapping */
+    if((vspace[1] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+    start[0] = 3;
+    start[1] = 0;
+    count[0] = 1;
+    count[1] = 1;
+    block[0] = H5S_UNLIMITED;
+    block[1] = 3;
+    if(H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, NULL, count, block) < 0)
+        TEST_ERROR
+    dims[0] = 0;
+    dims[1] = 3;
+    if((srcspace[1] = H5Screate_simple(2, dims, block)) < 0)
+        TEST_ERROR
+    start[0] = 0;
+    if(H5Sselect_hyperslab(srcspace[1], H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset_unlim", srcspace[1]) < 0)
+        TEST_ERROR
+
+    /* Create printf mapping */
+    if((vspace[2] = H5Screate_simple(2, dims, mdims)) < 0)
+        TEST_ERROR
+    start[0] = 0;
+    start[1] = 2;
+    stride[0] = 1;
+    stride[1] = 3;
+    count[0] = 1;
+    count[1] = H5S_UNLIMITED;
+    block[0] = 3;
+    block[1] = 2;
+    if(H5Sselect_hyperslab(vspace[2], H5S_SELECT_SET, start, stride, count, block) < 0)
+        TEST_ERROR
+    if((srcspace[2] = H5Screate_simple(2, block, NULL)) < 0)
+        TEST_ERROR
+    if(H5Pset_virtual(dcpl, vspace[2], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset_printf_%b", srcspace[2]) < 0)
+        TEST_ERROR
+
+    /* Create virtual file */
+    if((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        TEST_ERROR
+
+    /* Create source file if requested */
+    if(config & TEST_IO_DIFFERENT_FILE) {
+        if((srcfile = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+            TEST_ERROR
+    } /* end if */
+    else {
+        srcfile = vfile;
+        if(H5Iinc_ref(srcfile) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Create virtual dataset */
+    if((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Close srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC)
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile) < 0)
+                TEST_ERROR
+            srcfile = -1;
+        } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 6)
+        TEST_ERROR
+    if(dims[1] != 6)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 10)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Reopen srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC)
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+
+    /* Create fixed source dataset */
+    if((srcdset[0] = H5Dcreate2(srcfile, "src_dset_fixed", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, srcdcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Create unlimited source_dataset */
+    if((srcdset[1] = H5Dcreate2(srcfile, "src_dset_unlim", H5T_NATIVE_INT, srcspace[1], H5P_DEFAULT, srcdcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Populate write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] = (i * (int)mdims[1]) + j;
+
+    /* Initialize erbuf */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            erbuf[i][j] = fill;
+
+    /* Write to srcdset[0] */
+    start[0] = 0;
+    start[1] = 0;
+    block[0] = 3;
+    block[1] = 3;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 3; i++)
+        for(j = 0; j < 3; j++)
+            erbuf[i + 3][j + 3] = buf[i][j];
+
+    /* Close srcdsets and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        for(i = 0; i < 2; i++) {
+            if(H5Dclose(srcdset[i]) < 0)
+                TEST_ERROR
+            srcdset[i] = -1;
+        } /* end for */
+
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile) < 0)
+                TEST_ERROR
+            srcfile = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 6)
+        TEST_ERROR
+    if(dims[1] != 6)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 10)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    start[0] = 0;
+    start[1] = 0;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if((i >= (int)dims[0]) || (j >= (int)dims[1])) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reopen srcdset[1] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[1] = H5Dopen2(srcfile, "src_dset_unlim", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Extend srcdset[1] */
+    dims[0] = 2;
+    dims[1] = 3;
+    if(H5Dset_extent(srcdset[1], dims) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to srcdset[1] */
+    start[0] = 0;
+    start[1] = 0;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 2; i++)
+        for(j = 0; j < 3; j++)
+            erbuf[i + 3][j] = buf[i][j];
+
+    /* Close srcdset[1] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile) < 0)
+                TEST_ERROR
+            srcfile = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 6)
+        TEST_ERROR
+    if(dims[1] != 6)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 10)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    start[0] = 0;
+    start[1] = 0;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if((i >= (int)dims[0]) || (j >= (int)dims[1])) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reopen srcfile if config option specified */
+    if((config & TEST_IO_CLOSE_SRC) && (config & TEST_IO_DIFFERENT_FILE))
+        if((srcfile = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+
+    /* Create first printf source dataset */
+    if((srcdset[2] = H5Dcreate2(srcfile, "src_dset_printf_0", H5T_NATIVE_INT, srcspace[2], H5P_DEFAULT, srcdcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to srcdset[2] */
+    start[0] = 0;
+    start[1] = 0;
+    block[0] = 3;
+    block[1] = 2;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[2], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 3; i++)
+        for(j = 0; j < 2; j++)
+            erbuf[i][j + 2] = buf[i][j];
+
+    /* Close srcdset[2] srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[2]) < 0)
+            TEST_ERROR
+        srcdset[2] = -1;
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile) < 0)
+                TEST_ERROR
+            srcfile = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 6)
+        TEST_ERROR
+    if(dims[1] != 6)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 10)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    start[0] = 0;
+    start[1] = 0;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if((i >= (int)dims[0]) || (j >= (int)dims[1])) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reopen srcdset[1] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[1] = H5Dopen2(srcfile, "src_dset_unlim", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Extend srcdset[1] */
+    dims[0] = 3;
+    dims[1] = 3;
+    if(H5Dset_extent(srcdset[1], dims) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to new area of srcdset[1] */
+    start[0] = 0;
+    start[1] = 0;
+    block[0] = 1;
+    block[1] = 3;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    if((filespace = H5Dget_space(srcdset[1])) < 0)
+        TEST_ERROR
+    start[0] = 2;
+    start[1] = 0;
+    if(H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 3; i++)
+        erbuf[5][i] = buf[0][i];
+
+    /* Close srcdset[1] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile) < 0)
+                TEST_ERROR
+            srcfile = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 6)
+        TEST_ERROR
+    if(dims[1] != 6)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 10)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    start[0] = 0;
+    start[1] = 0;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if((i >= (int)dims[0]) || (j >= (int)dims[1])) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reopen srcfile if config option specified */
+    if((config & TEST_IO_CLOSE_SRC) && (config & TEST_IO_DIFFERENT_FILE))
+        if((srcfile = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+
+    /* Create second printf source dataset, this time without using srcdcpl */
+    if((srcdset[3] = H5Dcreate2(srcfile, "src_dset_printf_1", H5T_NATIVE_INT, srcspace[2], H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to srcdset[3] */
+    start[0] = 0;
+    start[1] = 0;
+    block[0] = 3;
+    block[1] = 2;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[3], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 3; i++)
+        for(j = 0; j < 2; j++)
+            erbuf[i][j + 5] = buf[i][j];
+
+    /* Close srcdset[3] srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[3]) < 0)
+            TEST_ERROR
+        srcdset[3] = -1;
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile) < 0)
+                TEST_ERROR
+            srcfile = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 6)
+        TEST_ERROR
+    if(dims[1] != 7)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 10)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    start[0] = 0;
+    start[1] = 0;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if((i >= (int)dims[0]) || (j >= (int)dims[1])) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reopen srcdset[1] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(config & TEST_IO_DIFFERENT_FILE)
+            if((srcfile = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+                TEST_ERROR
+        if((srcdset[1] = H5Dopen2(srcfile, "src_dset_unlim", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Extend srcdset[1] */
+    dims[0] = 7;
+    dims[1] = 3;
+    if(H5Dset_extent(srcdset[1], dims) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to new area of srcdset[1] */
+    start[0] = 0;
+    start[1] = 0;
+    block[0] = 4;
+    block[1] = 3;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    if((filespace = H5Dget_space(srcdset[1])) < 0)
+        TEST_ERROR
+    start[0] = 3;
+    start[1] = 0;
+    if(H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 4; i++)
+        for(j = 0; j < 3; j++)
+            erbuf[i + 6][j] = buf[i][j];
+
+    /* Close srcdset[1] and srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[1]) < 0)
+            TEST_ERROR
+        srcdset[1] = -1;
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile) < 0)
+                TEST_ERROR
+            srcfile = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 7)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 10)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    start[0] = 0;
+    start[1] = 0;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++) {
+            if(j >= (int)dims[1]) {
+                if(rbuf[i][j] != 0)
+                    TEST_ERROR
+            } /* end if */
+            else
+                if(rbuf[i][j] != erbuf[i][j])
+                    TEST_ERROR
+        } /* end for */
+
+    /* Reopen srcfile if config option specified */
+    if((config & TEST_IO_CLOSE_SRC) && (config & TEST_IO_DIFFERENT_FILE))
+        if((srcfile = H5Fopen(srcfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+
+    /* Create third printf source dataset */
+    if((srcdset[4] = H5Dcreate2(srcfile, "src_dset_printf_2", H5T_NATIVE_INT, srcspace[2], H5P_DEFAULT, srcdcpl, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Adjust write buffer */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            buf[i][j] += (int)mdims[0] * (int)mdims[1];
+
+    /* Write to srcdset[4] */
+    start[0] = 0;
+    start[1] = 0;
+    block[0] = 3;
+    block[1] = 2;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
+        TEST_ERROR
+    if(H5Dwrite(srcdset[4], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
+        TEST_ERROR
+
+    /* Update erbuf */
+    for(i = 0; i < 3; i++)
+        for(j = 0; j < 2; j++)
+            erbuf[i][j + 8] = buf[i][j];
+
+    /* Close srcdset[4] srcfile if config option specified */
+    if(config & TEST_IO_CLOSE_SRC) {
+        if(H5Dclose(srcdset[4]) < 0)
+            TEST_ERROR
+        srcdset[4] = -1;
+        if(config & TEST_IO_DIFFERENT_FILE) {
+            if(H5Fclose(srcfile) < 0)
+                TEST_ERROR
+            srcfile = -1;
+        } /* end if */
+    } /* end if */
+
+    /* Reopen virtual dataset and file if config option specified */
+    if(config & TEST_IO_REOPEN_VIRT) {
+        if(H5Dclose(vdset) < 0)
+            TEST_ERROR
+        vdset = -1;
+        if(H5Fclose(vfile) < 0)
+            TEST_ERROR
+        vfile = -1;
+        if((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, fapl)) < 0)
+            TEST_ERROR
+        if((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
+            TEST_ERROR
+    } /* end if */
+
+    /* Get VDS space */
+    if((filespace = H5Dget_space(vdset)) < 0)
+        TEST_ERROR
+
+    /* Get VDS space dimensions */
+    if((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
+        TEST_ERROR
+    if(ndims != 2)
+        TEST_ERROR
+    if(H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
+        TEST_ERROR
+    if(dims[0] != 10)
+        TEST_ERROR
+    if(dims[1] != 10)
+        TEST_ERROR
+    if(mdims[0] != 10)
+        TEST_ERROR
+    if(mdims[1] != 10)
+        TEST_ERROR
+
+    /* Close filespace */
+    if(H5Sclose(filespace) < 0)
+        TEST_ERROR
+
+    /* Read data through virtual dataset */
+    /* Reset rbuf */
+    HDmemset(rbuf[0], 0, sizeof(rbuf));
+
+    /* Select hyperslab in memory space */
+    start[0] = 0;
+    start[1] = 0;
+    if(H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
+        TEST_ERROR
+
+    /* Read data */
+    if(H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
+        TEST_ERROR
+
+    /* Verify read data */
+    for(i = 0; i < (int)mdims[0]; i++)
+        for(j = 0; j < (int)mdims[1]; j++)
+            if(rbuf[i][j] != erbuf[i][j])
+                TEST_ERROR
+
+    /* Close */
+    if(!(config & TEST_IO_CLOSE_SRC)) {
+        for(i = 0; i < 5; i++) {
+            if(H5Dclose(srcdset[i]) < 0)
+                TEST_ERROR
+            srcdset[i] = -1;
+        } /* end for */
+        if(H5Fclose(srcfile) < 0)
+            TEST_ERROR
+        srcfile = -1;
+    } /* end if */
+    else if(!(config & TEST_IO_DIFFERENT_FILE)) {
+        if(H5Fclose(srcfile) < 0)
+            TEST_ERROR
+        srcfile = -1;
+    } /* end if */
+    if(H5Dclose(vdset) < 0)
+        TEST_ERROR
+    vdset = -1;
+    if(H5Fclose(vfile) < 0)
+        TEST_ERROR
+    vfile = -1;
+    for(i = 0; i < (int)(sizeof(srcspace) / sizeof(srcspace[0])); i++) {
+        if(H5Sclose(srcspace[i]) < 0)
+            TEST_ERROR
+        srcspace[i] = -1;
+    } /* end for */
+    for(i = 0; i < (int)(sizeof(vspace) / sizeof(vspace[0])); i++) {
+        if(H5Sclose(vspace[i]) < 0)
+            TEST_ERROR
+        vspace[i] = -1;
+    } /* end for */
+    if(H5Pclose(dcpl) < 0)
+        TEST_ERROR
+    dcpl = -1;
+    if(H5Pclose(srcdcpl) < 0)
+        TEST_ERROR
+    srcdcpl = -1;
+    if(H5Sclose(memspace) < 0)
+        TEST_ERROR
+    memspace = -1;
+
+    PASSED();
+    return 0;
+
+error:
+    H5E_BEGIN_TRY {
+        for(i = 0; i < (int)(sizeof(srcdset) / sizeof(srcdset[0])); i++) {
+            if(srcdset[i] >= 0)
+                (void)H5Dclose(srcdset[i]);
+        } /* end for */
+        if(vdset >= 0)
+            (void)H5Dclose(vdset);
+        if(srcfile >= 0)
+            (void)H5Fclose(srcfile);
+        if(vfile >=  0)
+            (void)H5Fclose(vfile);
+        for(i = 0; i < (int)(sizeof(srcspace) / sizeof(srcspace[0])); i++) {
+            if(srcspace[i] >= 0)
+                (void)H5Sclose(srcspace[i]);
+        } /* end for */
+        for(i = 0; i < (int)(sizeof(vspace) / sizeof(vspace[0])); i++) {
+            if(vspace[i] >= 0)
+                (void)H5Sclose(vspace[i]);
+        } /* end for */
+        if(filespace >= 0)
+            (void)H5Sclose(filespace);
+        if(memspace >= 0)
+            (void)H5Sclose(memspace);
+        if(dcpl >= 0)
+            (void)H5Pclose(dcpl);
+        if(srcdcpl >= 0)
+            (void)H5Pclose(srcdcpl);
+    } H5E_END_TRY;
+
+     return 1;
+} /* end test_all() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    main
+ *
+ * Purpose:     Tests datasets with virtual layout
+ *
+ * Return:      Success:        exit(0)
+ *
+ *              Failure:        exit(1)
+ *
+ * Programmer:  Neil Fortner
+ *              Tuesday, February 17, 2015
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(void)
+{
+    char filename[FILENAME_BUF_SIZE];
+    hid_t fapl;
+    int test_api_config;
+    unsigned bit_config;
+    int nerrors = 0;
+
+    /* Testing setup */
+    h5_reset();
+    fapl = h5_fileaccess();
+
+    h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
+
+    for(test_api_config = (int)TEST_API_BASIC; test_api_config < (int)TEST_API_NTESTS; test_api_config++)
+        nerrors += test_api((test_api_config_t)test_api_config, fapl);
+    for(bit_config = 0; bit_config < TEST_IO_NTESTS; bit_config++) {
+        printf("Config: %s%s%s\n", bit_config & TEST_IO_CLOSE_SRC ? "closed source dataset, " : "", bit_config & TEST_IO_DIFFERENT_FILE ? "different source file" : "same source file", bit_config & TEST_IO_REOPEN_VIRT ? ", reopen virtual file" : "");
+        nerrors += test_basic_io(bit_config, fapl);
+        nerrors += test_unlim(bit_config, fapl);
+        nerrors += test_printf(bit_config, fapl);
+        nerrors += test_all(bit_config, fapl);
+    } /* end for */
+
+    /* Verify symbol table messages are cached */
+    nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
+
+    if(nerrors)
+        goto error;
+    printf("All virtual dataset tests passed.\n");
+    h5_cleanup(FILENAME, fapl);
+
+    return 0;
+
+error:
+    nerrors = MAX(1, nerrors);
+    printf("***** %d VIRTUAL DATASET TEST%s FAILED! *****\n",
+            nerrors, 1 == nerrors ? "" : "S");
+    return 1;
+} /* end main() */
+
diff --git a/test/vds_swmr.h b/test/vds_swmr.h
new file mode 100644
index 0000000..c043fd6
--- /dev/null
+++ b/test/vds_swmr.h
@@ -0,0 +1,165 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef VDS_SWMR_H
+#define VDS_SWMR_H
+
+#include <hdf5.h>
+
+/* virtual dataset <---> source dataset mapping and sizes
+
+   *****************  --+
+   *       A       *    K
+   *****************  --+
+   *               *    |
+   *       B       *    N
+   *               *    |
+   *****************  --+
+   *       C       *
+   *****************
+   *               *
+   *       D       *
+   *               *
+   *****************
+   *       E       *
+   *****************
+   *               *
+   *       F       *
+   *               *
+   *****************
+
+   |               |
+   +-------M-------+
+
+
+        dim[0]
+       /
+      /
+     /
+    -----> dim[2]
+    |
+    |
+    |
+   dim[1]
+
+
+   NOTE: This use case also checks for varying numbers of written planes.
+         Dataset A contains the full number of planes and each successive
+         dataset contains one fewer plane, down to the last dataset, which
+         contains zero planes. Each dataset is set to have an (unlimited
+         dimension) extent equal to the number of planes written, so the
+         "empty" regions will contain the VDS fill value.
+*/
+
+
+/* All datasets are 3D */
+#define RANK                3
+
+/* Lengths of string identifiers (file, dataset names, etc.) */
+#define NAME_LEN            32
+
+/* Compression level */
+#define COMPRESSION_LEVEL   7
+
+/* Number of source files */
+#define N_SOURCES      6
+
+/* Dataset dimensions */
+#define SM_HEIGHT      2   /* K */
+#define LG_HEIGHT      4   /* N */
+#define SM_LG_HEIGHT   6   /* SM_HEIGHT + LG_HEIGHT */
+#define FULL_HEIGHT    18  /* (3 * K) + (3 * N) */
+#define HALF_HEIGHT    9
+#define WIDTH          8   /* M */
+#define HALF_WIDTH     4
+
+/* Max number of planes in the dataset */
+#define N_MAX_PLANES   H5S_UNLIMITED
+
+/* Number of planes each writer will write */
+#define N_PLANES_TO_WRITE   25
+
+/* Dataset datatypes */
+#define SOURCE_DATATYPE    H5T_STD_I32LE
+#define VDS_DATATYPE       H5T_STD_I32LE
+
+/* Starting size of datasets, both source and VDS */
+static hsize_t DIMS[N_SOURCES][RANK] = {
+    {0, SM_HEIGHT, WIDTH},
+    {0, LG_HEIGHT, WIDTH},
+    {0, SM_HEIGHT, WIDTH},
+    {0, LG_HEIGHT, WIDTH},
+    {0, SM_HEIGHT, WIDTH},
+    {0, LG_HEIGHT, WIDTH}
+};
+static hsize_t VDS_DIMS[RANK] = {0, FULL_HEIGHT, WIDTH};
+
+/* Maximum size of datasets, both source and VDS.
+ * NOTE: Theoretical (i.e.: H5S_UNLIMITED), not the actual max
+ * number of planes written out by the writers before they stop.
+ * That number is specified separately.
+ */
+static hsize_t MAX_DIMS[N_SOURCES][RANK] = {
+    {N_MAX_PLANES, SM_HEIGHT, WIDTH},
+    {N_MAX_PLANES, LG_HEIGHT, WIDTH},
+    {N_MAX_PLANES, SM_HEIGHT, WIDTH},
+    {N_MAX_PLANES, LG_HEIGHT, WIDTH},
+    {N_MAX_PLANES, SM_HEIGHT, WIDTH},
+    {N_MAX_PLANES, LG_HEIGHT, WIDTH}
+};
+static hsize_t VDS_MAX_DIMS[RANK] = {N_MAX_PLANES, FULL_HEIGHT, WIDTH};
+
+/* Planes */
+static hsize_t PLANES[N_SOURCES][RANK] = {
+    {1, SM_HEIGHT, WIDTH},
+    {1, LG_HEIGHT, WIDTH},
+    {1, SM_HEIGHT, WIDTH},
+    {1, LG_HEIGHT, WIDTH},
+    {1, SM_HEIGHT, WIDTH},
+    {1, LG_HEIGHT, WIDTH}
+};
+static hsize_t VDS_PLANE[RANK] = {1, FULL_HEIGHT, WIDTH};
+
+/* File names for source datasets */
+static char FILE_NAMES[N_SOURCES][NAME_LEN] = {
+    {"vds_swmr_src_a.h5"},
+    {"vds_swmr_src_b.h5"},
+    {"vds_swmr_src_c.h5"},
+    {"vds_swmr_src_d.h5"},
+    {"vds_swmr_src_e.h5"},
+    {"vds_swmr_src_f.h5"}
+};
+
+/* VDS file name */
+static char VDS_FILE_NAME[NAME_LEN] = "vds_swmr.h5";
+
+/* Dataset names */
+static char SOURCE_DSET_NAME[NAME_LEN] = "source_dset";
+static char SOURCE_DSET_PATH[NAME_LEN] = "/source_dset";
+static char VDS_DSET_NAME[NAME_LEN]    = "vds_dset";
+
+/* Fill values */
+static int32_t FILL_VALUES[N_SOURCES] = {
+    -1,
+    -2,
+    -3,
+    -4,
+    -5,
+    -6
+};
+static int32_t VDS_FILL_VALUE = -9;
+
+#endif /* VDS_SWMR_H */
+
diff --git a/test/vds_swmr_gen.c b/test/vds_swmr_gen.c
new file mode 100644
index 0000000..1706844
--- /dev/null
+++ b/test/vds_swmr_gen.c
@@ -0,0 +1,178 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "h5test.h"
+#include "vds_swmr.h"
+
+int
+main(int argc, char *argv[])
+{
+    hid_t faplid        = -1;   /* file access property list ID (all files) */
+
+    hid_t src_sid       = -1;   /* source dataset's dataspace ID            */
+    hid_t src_dcplid    = -1;   /* source dataset property list ID          */
+
+    hid_t vds_sid       = -1;   /* VDS dataspace ID                         */
+    hid_t vds_dcplid    = -1;   /* VDS dataset property list ID             */
+
+    hid_t fid           = -1;   /* HDF5 file ID                             */
+    hid_t did           = -1;   /* dataset ID                               */
+
+    hsize_t start[RANK];        /* starting point for hyperslab             */
+    int map_start       = -1;   /* starting point in the VDS map            */
+
+    int i;                      /* iterator                         */
+
+
+    /* Start by creating the virtual dataset (VDS) dataspace and creation
+     * property list. The individual source datasets are then created
+     * and the VDS map (stored in the VDS property list) is updated.
+     */
+
+    /* Create VDS dcpl */
+    if((vds_dcplid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        TEST_ERROR
+    if(H5Pset_fill_value(vds_dcplid, VDS_DATATYPE,
+                &VDS_FILL_VALUE) < 0)
+        TEST_ERROR
+
+    /* Create VDS dataspace */
+    if((vds_sid = H5Screate_simple(RANK, VDS_DIMS,
+                    VDS_MAX_DIMS)) < 0)
+        TEST_ERROR
+
+    /************************************
+     * Create source files and datasets *
+     ************************************/
+
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 0;
+    map_start = 0;
+
+    /* All SWMR files need to use the latest file format */
+    if((faplid = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        TEST_ERROR
+    if(H5Pset_libver_bounds(faplid, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        TEST_ERROR
+
+    for(i = 0; i < N_SOURCES; i++) {
+
+        /* source dataset dcpl */
+        if((src_dcplid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+            TEST_ERROR
+        if(H5Pset_chunk(src_dcplid, RANK, PLANES[i]) < 0)
+            TEST_ERROR
+        if(H5Pset_fill_value(src_dcplid, SOURCE_DATATYPE,
+                    &FILL_VALUES[i]) < 0)
+            TEST_ERROR
+
+        /* Use a mix of compressed and uncompressed datasets */
+        if(0 != i % 2)
+            if(H5Pset_deflate(src_dcplid, COMPRESSION_LEVEL) < 0)
+                TEST_ERROR
+
+        /* Create source file, dataspace, and dataset */
+        if((fid = H5Fcreate(FILE_NAMES[i], H5F_ACC_TRUNC,
+                        H5P_DEFAULT, faplid)) < 0)
+            TEST_ERROR
+        if((src_sid = H5Screate_simple(RANK, DIMS[i],
+                        MAX_DIMS[i])) < 0)
+            TEST_ERROR
+        if((did = H5Dcreate2(fid, SOURCE_DSET_NAME,
+                        SOURCE_DATATYPE, src_sid,
+                        H5P_DEFAULT, src_dcplid, H5P_DEFAULT)) < 0)
+            TEST_ERROR
+
+        /* set up hyperslabs for source and destination datasets */
+        start[1] = 0;
+        if(H5Sselect_hyperslab(src_sid, H5S_SELECT_SET, start, NULL,
+                    MAX_DIMS[i], NULL) < 0)
+            TEST_ERROR
+        start[1] = map_start;
+        if(H5Sselect_hyperslab(vds_sid, H5S_SELECT_SET, start, NULL,
+                    MAX_DIMS[i], NULL) < 0)
+            TEST_ERROR
+        map_start += PLANES[i][1];
+
+        /* Add VDS mapping */
+        if(H5Pset_virtual(vds_dcplid, vds_sid, FILE_NAMES[i],
+                    SOURCE_DSET_PATH, src_sid) < 0)
+            TEST_ERROR
+
+        /* close */
+        if(H5Sclose(src_sid) < 0)
+            TEST_ERROR
+        if(H5Pclose(src_dcplid) < 0)
+            TEST_ERROR
+        if(H5Dclose(did) < 0)
+            TEST_ERROR
+        if(H5Fclose(fid) < 0)
+            TEST_ERROR
+
+    } /* end for */
+
+
+    /*******************
+     * Create VDS file *
+     *******************/
+
+    /* file */
+    if((fid = H5Fcreate(VDS_FILE_NAME, H5F_ACC_TRUNC,
+                    H5P_DEFAULT, faplid)) < 0)
+        TEST_ERROR
+
+    /* dataset */
+    if((did = H5Dcreate2(fid, VDS_DSET_NAME, VDS_DATATYPE, vds_sid,
+                    H5P_DEFAULT, vds_dcplid, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* close */
+    if(H5Pclose(faplid) < 0)
+        TEST_ERROR
+    if(H5Pclose(vds_dcplid) < 0)
+        TEST_ERROR
+    if(H5Sclose(vds_sid) < 0)
+        TEST_ERROR
+    if(H5Dclose(did) < 0)
+        TEST_ERROR
+    if(H5Fclose(fid) < 0)
+        TEST_ERROR
+
+    return EXIT_SUCCESS;
+
+error:
+
+    H5E_BEGIN_TRY {
+        if(faplid >= 0)
+            (void)H5Pclose(faplid);
+        if(src_sid >= 0)
+            (void)H5Sclose(src_sid);
+        if(src_dcplid >= 0)
+            (void)H5Pclose(src_dcplid);
+        if(vds_sid >= 0)
+            (void)H5Sclose(vds_sid);
+        if(vds_dcplid >= 0)
+            (void)H5Pclose(vds_dcplid);
+        if(fid >= 0)
+            (void)H5Fclose(fid);
+        if(did >= 0)
+            (void)H5Dclose(did);
+    } H5E_END_TRY
+
+    return EXIT_FAILURE;
+
+} /* end main */
+
diff --git a/test/vds_swmr_reader.c b/test/vds_swmr_reader.c
new file mode 100644
index 0000000..34cb3eb
--- /dev/null
+++ b/test/vds_swmr_reader.c
@@ -0,0 +1,144 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "h5test.h"
+#include "vds_swmr.h"
+
+int
+main(int argc, char *argv[])
+{
+    hid_t fid           = -1;   /* HDF5 file ID                     */
+    hid_t did           = -1;   /* dataset ID                       */
+    hid_t msid          = -1;   /* memory dataspace ID              */
+    hid_t fsid          = -1;   /* file dataspace ID                */
+
+    hsize_t start[RANK];        /* hyperslab start point            */
+
+    int n_elements      = 0;    /* size of buffer (elements)        */
+    size_t size         = 0;    /* size of buffer (bytes)           */
+    int *buffer         = NULL; /* data buffer                      */
+
+    int n_dims          = -1;   /* # dimensions in dataset          */
+    hsize_t dims[RANK];         /* current size of dataset          */
+    hsize_t max_dims[RANK];     /* max size of dataset              */
+
+    hbool_t has_errors  = FALSE;/* if the read data contains errors */
+
+    int i;                      /* iterator                         */
+
+
+    /* Open the VDS file and dataset */
+    if((fid = H5Fopen(VDS_FILE_NAME, H5F_ACC_RDONLY | H5F_ACC_SWMR_READ, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+    if((did = H5Dopen2(fid, VDS_DSET_NAME, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+    /* Create the read buffer */
+    n_elements = VDS_PLANE[1] * VDS_PLANE[2];
+    size = n_elements * sizeof(int);
+    if(NULL == (buffer = (int *)HDmalloc(size)))
+        TEST_ERROR
+
+    /* Create memory dataspace */
+    if((msid = H5Screate_simple(RANK, VDS_PLANE, NULL)) < 0)
+        TEST_ERROR
+
+    /* Read data until the dataset is full (via the writer) */
+    do {
+
+        /* Refresh metadata */
+        if(H5Drefresh(did) < 0)
+            TEST_ERROR
+
+        /* Get the dataset dimensions */
+        if((fsid = H5Dget_space(did)) < 0)
+            TEST_ERROR
+        if(H5Sget_simple_extent_dims(fsid, dims, max_dims) < 0)
+            TEST_ERROR
+
+        /* Check the reported size of the VDS */
+        if((n_dims = H5Sget_simple_extent_ndims(fsid)) < 0)
+            TEST_ERROR
+        if(n_dims != RANK)
+            TEST_ERROR
+        if(H5Sget_simple_extent_dims(fsid, dims, max_dims) < 0)
+            TEST_ERROR
+        /* NOTE: Don't care what dims[0] is. */
+        if(dims[1] != FULL_HEIGHT)
+            TEST_ERROR
+        if(dims[2] != WIDTH)
+            TEST_ERROR
+        if(max_dims[0] != H5S_UNLIMITED)
+            TEST_ERROR
+        if(max_dims[1] != FULL_HEIGHT)
+            TEST_ERROR
+        if(max_dims[2] != WIDTH)
+            TEST_ERROR
+
+        /* Continue if there's nothing to read */
+        if(0 == dims[0]) {
+            if(H5Sclose(fsid) < 0)
+                TEST_ERROR
+            continue;
+        }
+
+        /* Read a plane from the VDS */
+        /* At this time, we just make sure we can read planes without errors. */
+        start[0] = dims[0] - 1;
+        start[1] = 0;
+        start[2] = 0;
+        if(H5Sselect_hyperslab(fsid, H5S_SELECT_SET, start, NULL, VDS_PLANE, NULL) < 0)
+            TEST_ERROR
+        if(H5Dread(did, H5T_NATIVE_INT, msid, fsid, H5P_DEFAULT, buffer) < 0)
+            TEST_ERROR
+
+        if(H5Sclose(fsid) < 0)
+            TEST_ERROR
+
+    } while (dims[0] < N_PLANES_TO_WRITE);
+
+    /* Close file and dataset */
+    if(H5Sclose(msid) < 0)
+        TEST_ERROR
+    if(H5Dclose(did) < 0)
+        TEST_ERROR
+    if(H5Fclose(fid) < 0)
+        TEST_ERROR
+
+    HDfree(buffer);
+
+    HDfprintf(stderr, "SWMR reader exited successfully\n");
+    return EXIT_SUCCESS;
+
+error:
+
+    H5E_BEGIN_TRY {
+        if(fid >= 0)
+            (void)H5Fclose(fid);
+        if(did >= 0)
+            (void)H5Dclose(did);
+        if(msid >= 0)
+            (void)H5Sclose(msid);
+        if(fsid >= 0)
+            (void)H5Sclose(fsid);
+        if(buffer != NULL)
+            free(buffer);
+    } H5E_END_TRY
+
+    HDfprintf(stderr, "ERROR: SWMR reader exited with errors\n");
+    return EXIT_FAILURE;
+
+} /* end main */
+
diff --git a/test/vds_swmr_writer.c b/test/vds_swmr_writer.c
new file mode 100644
index 0000000..fa1d1a0
--- /dev/null
+++ b/test/vds_swmr_writer.c
@@ -0,0 +1,159 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+#include "h5test.h"
+#include "vds_swmr.h"
+
+int
+main(int argc, char *argv[])
+{
+    int file_number     = -1;   /* Source file number               */
+
+    hid_t fid           = -1;   /* HDF5 file ID                     */
+    hid_t faplid        = -1;   /* file access property list ID                */
+    hid_t did           = -1;   /* dataset ID                       */
+    hid_t msid          = -1;   /* memory dataspace ID              */
+    hid_t fsid          = -1;   /* file dataspace ID                */
+
+    hsize_t extent[RANK];       /* dataset extents                  */
+    hsize_t start[RANK];        /* hyperslab start point            */
+
+    int *buffer         = NULL; /* data buffer                      */
+    int value           = -1;   /* value written to datasets        */
+
+    hsize_t n_elements  = 0;    /* number of elements in a plane    */
+
+    hsize_t i;                  /* iterator                         */
+    hsize_t j;                  /* iterator                         */
+
+
+    /******************************
+     * Fill a source dataset file *
+     ******************************/
+
+    /* The file number is passed on the command line.
+     * This is an integer index into the FILE_NAMES array. 
+     */
+    if(argc != 2) {
+        HDfprintf(stderr, "ERROR: Must pass the source file number on the command line.\n");
+        return EXIT_FAILURE;
+    }
+
+    file_number = atoi(argv[1]);
+    if(file_number < 0 || file_number >= N_SOURCES)
+        TEST_ERROR
+
+    /* Open the source file and dataset */
+    /* All SWMR files need to use the latest file format */
+    if((faplid = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+        TEST_ERROR
+    if(H5Pset_libver_bounds(faplid, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+        TEST_ERROR
+    if((fid = H5Fopen(FILE_NAMES[file_number], H5F_ACC_RDWR | H5F_ACC_SWMR_WRITE, faplid)) < 0)
+        TEST_ERROR
+    if((did = H5Dopen2(fid, SOURCE_DSET_PATH, H5P_DEFAULT)) < 0)
+        TEST_ERROR
+
+
+    /* Create a data buffer that represents a plane */
+    n_elements = PLANES[file_number][1] * PLANES[file_number][2];
+    if(NULL == (buffer = (int *)HDmalloc(n_elements * sizeof(int))))
+        TEST_ERROR
+
+    /* Create the memory dataspace */
+    if((msid = H5Screate_simple(RANK, PLANES[file_number], NULL)) < 0)
+        TEST_ERROR
+
+    /* Write planes to the dataset */
+    for(i = 0; i < N_PLANES_TO_WRITE; i++) {
+
+        unsigned delay;     /* Time interval between plane writes */
+
+        /* Set the dataset's extent. This is inefficient but that's ok here. */
+        extent[0] = i + 1;
+        extent[1] = PLANES[file_number][1];
+        extent[2] = PLANES[file_number][2];
+        if(H5Dset_extent(did, extent) < 0)
+            TEST_ERROR
+
+        /* Get the file dataspace */
+        if((fsid = H5Dget_space(did)) < 0)
+            TEST_ERROR
+
+        /* Each plane is filled with the plane number as a data value. */
+        value = (((int)i + 1) * 10) + (int)i;
+        for(j = 0; j < n_elements; j++)
+           buffer[j] = value;
+
+        /* Set up the hyperslab for writing. */
+        start[0] = i;
+        start[1] = 0;
+        start[2] = 0;
+        if(H5Sselect_hyperslab(fsid, H5S_SELECT_SET, start, NULL, PLANES[file_number], NULL) < 0)
+            TEST_ERROR
+
+        /* Write the plane to the dataset. */
+        if(H5Dwrite(did, H5T_NATIVE_INT, msid, fsid, H5P_DEFAULT, buffer) < 0)
+            TEST_ERROR
+
+        /* Wait one second between writing planes */
+        delay = time(0) + 1;
+        while(time(0) < delay)
+            ;
+
+        /* Flush */
+        if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+            TEST_ERROR
+
+    } /* end for */
+
+    if(H5Pclose(faplid) < 0)
+        TEST_ERROR
+    if(H5Sclose(msid) < 0)
+        TEST_ERROR
+    if(H5Sclose(fsid) < 0)
+        TEST_ERROR
+    if(H5Dclose(did) < 0)
+        TEST_ERROR
+    if(H5Fclose(fid) < 0)
+        TEST_ERROR
+    HDfree(buffer);
+
+    HDfprintf(stderr, "SWMR writer exited successfully\n");
+    return EXIT_SUCCESS;
+
+error:
+
+    H5E_BEGIN_TRY {
+        if(fid >= 0)
+            (void)H5Fclose(fid);
+        if(faplid >= 0)
+            (void)H5Pclose(faplid);
+        if(did >= 0)
+            (void)H5Dclose(did);
+        if(msid >= 0)
+            (void)H5Sclose(msid);
+        if(fsid >= 0)
+            (void)H5Sclose(fsid);
+        if(buffer != NULL)
+            HDfree(buffer);
+    } H5E_END_TRY
+
+    HDfprintf(stderr, "ERROR: SWMR writer exited with errors\n");
+    return EXIT_FAILURE;
+
+} /* end main */
+
diff --git a/test/vfd.c b/test/vfd.c
index 4ece2ba..708474c 100644
--- a/test/vfd.c
+++ b/test/vfd.c
@@ -80,15 +80,17 @@ const char *FILENAME[] = {
 static herr_t
 test_sec2(void)
 {
-  hid_t        file            = -1;
-  hid_t        fapl            = -1;
-  hid_t        access_fapl     = -1;
+    hid_t        file            = -1;
+    hid_t        fapl            = -1;
+    hid_t        access_fapl     = -1;
     char         filename[1024];
     int          *fhandle        = NULL;
     hsize_t      file_size       = 0;
 
     TESTING("SEC2 file driver");
 
+    h5_reset();
+
     /* Set property list and file name for SEC2 driver. */
     fapl = h5_fileaccess();
     if(H5Pset_fapl_sec2(fapl) < 0)
@@ -141,107 +143,103 @@ error:
     return -1;
 }
 
-
 

 /*-------------------------------------------------------------------------
- * Function:    test_direct
+ * Function:    test_core
  *
- * Purpose:     Tests the file handle interface for DIRECT I/O driver
+ * Purpose:     Tests the file handle interface for CORE driver
  *
  * Return:      Success:        0
  *              Failure:        -1
  *
  * Programmer:  Raymond Lu
- *              Wednesday, 20 September 2006
+ *              Tuesday, Sept 24, 2002
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-test_direct(void)
+test_core(void)
 {
-#ifdef H5_HAVE_DIRECT
     hid_t       file=(-1), fapl, access_fapl = -1;
-    hid_t  dset1=-1, dset2=-1, space1=-1, space2=-1;
     char        filename[1024];
-    int         *fhandle=NULL;
+    void        *fhandle=NULL;
     hsize_t     file_size;
-    hsize_t  dims1[2], dims2[1];
-    size_t  mbound;
-    size_t  fbsize;
-    size_t  cbsize;
+    hbool_t     use_write_tracking;
+    size_t      write_tracking_page_size;
     int    *points = NULL, *check = NULL, *p1, *p2;
-    int    wdata2[DSET2_DIM] = {11,12,13,14};
-    int    rdata2[DSET2_DIM];
+    hid_t  dset1=-1, space1=-1;
+    hsize_t  dims1[2];
     int    i, j, n;
-#endif /*H5_HAVE_DIRECT*/
 
-    TESTING("DIRECT I/O file driver");
+    TESTING("CORE file driver");
 
-#ifndef H5_HAVE_DIRECT
-    SKIPPED();
-    return 0;
-#else /*H5_HAVE_DIRECT*/
+    h5_reset();
 
-    /* Set property list and file name for Direct driver.  Set memory alignment boundary
-     * and file block size to 512 which is the minimum for Linux 2.6. */
+    /* Set property list and file name for CORE driver */
     fapl = h5_fileaccess();
-    if(H5Pset_fapl_direct(fapl, MBOUNDARY, FBSIZE, CBSIZE) < 0)
-        TEST_ERROR;
-    h5_fixname(FILENAME[5], fapl, filename, sizeof filename);
-
-    /* Verify the file access properties */
-    if(H5Pget_fapl_direct(fapl, &mbound, &fbsize, &cbsize) < 0)
+    if(H5Pset_fapl_core(fapl, (size_t)CORE_INCREMENT, TRUE) < 0)
         TEST_ERROR;
-    if(mbound != MBOUNDARY || fbsize != FBSIZE || cbsize != CBSIZE)
+    if(H5Pset_core_write_tracking(fapl, TRUE, CORE_PAGE_SIZE) < 0)
         TEST_ERROR;
+    h5_fixname(FILENAME[1], fapl, filename, sizeof filename);
 
-    if(H5Pset_alignment(fapl, (hsize_t)THRESHOLD, (hsize_t)FBSIZE) < 0)
+    if((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
         TEST_ERROR;
 
-    H5E_BEGIN_TRY {
-        file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
-    } H5E_END_TRY;
-    if(file<0) {
-        H5Pclose (fapl);
-        SKIPPED();
-        printf("  Probably the file system doesn't support Direct I/O\n");
-        return 0;
-    }
-
     /* Retrieve the access property list... */
     if ((access_fapl = H5Fget_access_plist(file)) < 0)
         TEST_ERROR;
 
     /* Check that the driver is correct */
-    if(H5FD_DIRECT != H5Pget_driver(access_fapl))
+    if(H5FD_CORE != H5Pget_driver(access_fapl))
+        TEST_ERROR;
+
+    /* Check that the backing store write tracking info was saved */
+    if(H5Pget_core_write_tracking(fapl, &use_write_tracking, &write_tracking_page_size) < 0)
+        TEST_ERROR;
+    if(TRUE != use_write_tracking)
+        TEST_ERROR;
+    if(CORE_PAGE_SIZE != write_tracking_page_size)
         TEST_ERROR;
 
     /* ...and close the property list */
     if (H5Pclose(access_fapl) < 0)
         TEST_ERROR;
 
-    /* Check file handle API */
-    if(H5Fget_vfd_handle(file, H5P_DEFAULT, (void **)&fhandle) < 0)
-        TEST_ERROR;
-    if(*fhandle<0)
+    if(H5Fget_vfd_handle(file, H5P_DEFAULT, &fhandle) < 0)
         TEST_ERROR;
+    if(fhandle==NULL)
+    {
+        printf("fhandle==NULL\n");
+               TEST_ERROR;
+    }
 
     /* Check file size API */
     if(H5Fget_filesize(file, &file_size) < 0)
         TEST_ERROR;
 
-    /* There is no guarantee of the number of metadata allocations, but it's
-     * 4 currently and the size of the file should be between 3 & 4 file buffer
-     * sizes..
+    /* There is no garantee the size of metadata in file is constant.
+     * Just try to check if it's reasonable.  Why is this 4KB?
      */
-    if(file_size < (FBSIZE * 3) || file_size >= (FBSIZE * 4))
+    if(file_size<2*KB || file_size>6*KB)
         TEST_ERROR;
 
-    /* Allocate aligned memory for data set 1. For data set 1, everything is aligned including
-     * memory address, size of data, and file address. */
-    if(0 != HDposix_memalign(&points, (size_t)FBSIZE, (size_t)(DSET1_DIM1 * DSET1_DIM2 * sizeof(int))))
+    if(H5Fclose(file) < 0)
         TEST_ERROR;
-    if(0 != HDposix_memalign(&check, (size_t)FBSIZE, (size_t)(DSET1_DIM1 * DSET1_DIM2 * sizeof(int))))
+
+
+    /* Open the file with backing store off for read and write.
+     * Changes won't be saved in file. */
+    if(H5Pset_fapl_core(fapl, (size_t)CORE_INCREMENT, FALSE) < 0)
+        TEST_ERROR;
+
+    if((file=H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        TEST_ERROR;
+
+    /* Allocate memory for data set. */
+    if(NULL == (points = (int *)HDmalloc(DSET1_DIM1 * DSET1_DIM2 * sizeof(int))))
+        TEST_ERROR;
+    if(NULL == (check = (int *)HDmalloc(DSET1_DIM1 * DSET1_DIM2 * sizeof(int))))
         TEST_ERROR;
 
     /* Initialize the dset1 */
@@ -284,47 +282,70 @@ test_direct(void)
                 printf("    Read different values than written in data set 1.\n");
                 printf("    At index %d,%d\n", i, j);
                 TEST_ERROR;
-              } /* end if */
+            } /* end if */
 
-    /* Create the data space2. For data set 2, memory address and data size are not aligned. */
-    dims2[0] = DSET2_DIM;
-    if((space2 = H5Screate_simple(1, dims2, NULL)) < 0)
+    if(H5Dclose(dset1) < 0)
         TEST_ERROR;
 
-    /* Create the dset2 */
-    if((dset2 = H5Dcreate2(file, DSET2_NAME, H5T_NATIVE_INT, space2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+    if(H5Fclose(file) < 0)
+        TEST_ERROR;
+
+    /* Open the file with backing store on for read and write.
+     * Changes will be saved in file. */
+    if(H5Pset_fapl_core(fapl, (size_t)CORE_INCREMENT, TRUE) < 0)
+        TEST_ERROR;
+
+    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+        TEST_ERROR;
+
+    /* Create the dset1 */
+    if((dset1 = H5Dcreate2(file, DSET1_NAME, H5T_NATIVE_INT, space1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
         TEST_ERROR;
 
     /* Write the data to the dset1 */
-    if(H5Dwrite(dset2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata2) < 0)
+    if(H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, points) < 0)
         TEST_ERROR;
 
-    if(H5Dclose(dset2) < 0)
+    if(H5Dclose(dset1) < 0)
         TEST_ERROR;
 
-    if((dset2 = H5Dopen2(file, DSET2_NAME, H5P_DEFAULT)) < 0)
+    if((dset1 = H5Dopen2(file, DSET1_NAME, H5P_DEFAULT)) < 0)
+        TEST_ERROR;
+
+    /* Reallocate memory for reading buffer. */
+    HDassert(check);
+    HDfree(check);
+    if(NULL == (check = (int *)HDmalloc(DSET1_DIM1 * DSET1_DIM2 * sizeof(int))))
         TEST_ERROR;
 
     /* Read the data back from dset1 */
-    if(H5Dread(dset2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata2) < 0)
+    if(H5Dread(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, check) < 0)
         TEST_ERROR;
 
     /* Check that the values read are the same as the values written */
-    for(i = 0; i < DSET2_DIM; i++)
-        if(wdata2[i] != rdata2[i]) {
-            H5_FAILED();
-            printf("    Read different values than written in data set 2.\n");
-            printf("    At index %d\n", i);
-            TEST_ERROR;
-        } /* end if */
+    p1 = points;
+    p2 = check;
+    for(i = 0; i < DSET1_DIM1; i++)
+        for(j = 0; j < DSET1_DIM2; j++)
+            if(*p1++ != *p2++) {
+                H5_FAILED();
+                printf("    Read different values than written in data set 1.\n");
+                printf("    At index %d,%d\n", i, j);
+                TEST_ERROR;
+            } /* end if */
 
-    if(H5Sclose(space1) < 0)
+    /* Check file size API */
+    if(H5Fget_filesize(file, &file_size) < 0)
         TEST_ERROR;
-    if(H5Dclose(dset1) < 0)
+
+    /* There is no garantee the size of metadata in file is constant.
+     * Just try to check if it's reasonable. */
+    if(file_size<64*KB || file_size>256*KB)
         TEST_ERROR;
-    if(H5Sclose(space2) < 0)
+
+    if(H5Sclose(space1) < 0)
         TEST_ERROR;
-    if(H5Dclose(dset2) < 0)
+    if(H5Dclose(dset1) < 0)
         TEST_ERROR;
     if(H5Fclose(file) < 0)
         TEST_ERROR;
@@ -334,16 +355,13 @@ test_direct(void)
     HDfree(check);
 
     h5_cleanup(FILENAME, fapl);
+
     PASSED();
     return 0;
 
 error:
     H5E_BEGIN_TRY {
         H5Pclose(fapl);
-        H5Sclose(space1);
-        H5Dclose(dset1);
-        H5Sclose(space2);
-        H5Dclose(dset2);
         H5Fclose(file);
     } H5E_END_TRY;
 
@@ -353,104 +371,110 @@ error:
         HDfree(check);
 
     return -1;
-#endif /*H5_HAVE_DIRECT*/
 }
 
 

 /*-------------------------------------------------------------------------
- * Function:    test_core
+ * Function:    test_direct
  *
- * Purpose:     Tests the file handle interface for CORE driver
+ * Purpose:     Tests the file handle interface for DIRECT I/O driver
  *
  * Return:      Success:        0
  *              Failure:        -1
  *
  * Programmer:  Raymond Lu
- *              Tuesday, Sept 24, 2002
+ *              Wednesday, 20 September 2006
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-test_core(void)
+test_direct(void)
 {
+#ifdef H5_HAVE_DIRECT
     hid_t       file=(-1), fapl, access_fapl = -1;
+    hid_t  dset1=-1, dset2=-1, space1=-1, space2=-1;
     char        filename[1024];
-    void        *fhandle=NULL;
+    int         *fhandle=NULL;
     hsize_t     file_size;
-    hbool_t     use_write_tracking;
-    size_t      write_tracking_page_size;
+    hsize_t  dims1[2], dims2[1];
+    size_t  mbound;
+    size_t  fbsize;
+    size_t  cbsize;
     int    *points = NULL, *check = NULL, *p1, *p2;
-    hid_t  dset1=-1, space1=-1;
-    hsize_t  dims1[2];
+    int    wdata2[DSET2_DIM] = {11,12,13,14};
+    int    rdata2[DSET2_DIM];
     int    i, j, n;
+#endif /*H5_HAVE_DIRECT*/
 
-    TESTING("CORE file driver");
+    TESTING("DIRECT I/O file driver");
 
-    /* Set property list and file name for CORE driver */
+#ifndef H5_HAVE_DIRECT
+    SKIPPED();
+    return 0;
+#else /*H5_HAVE_DIRECT*/
+
+    h5_reset();
+
+    /* Set property list and file name for Direct driver.  Set memory alignment boundary
+     * and file block size to 512 which is the minimum for Linux 2.6. */
     fapl = h5_fileaccess();
-    if(H5Pset_fapl_core(fapl, (size_t)CORE_INCREMENT, TRUE) < 0)
+    if(H5Pset_fapl_direct(fapl, MBOUNDARY, FBSIZE, CBSIZE) < 0)
         TEST_ERROR;
-    if(H5Pset_core_write_tracking(fapl, TRUE, CORE_PAGE_SIZE) < 0)
+    h5_fixname(FILENAME[5], fapl, filename, sizeof filename);
+
+    /* Verify the file access properties */
+    if(H5Pget_fapl_direct(fapl, &mbound, &fbsize, &cbsize) < 0)
+        TEST_ERROR;
+    if(mbound != MBOUNDARY || fbsize != FBSIZE || cbsize != CBSIZE)
         TEST_ERROR;
-    h5_fixname(FILENAME[1], fapl, filename, sizeof filename);
 
-    if((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+    if(H5Pset_alignment(fapl, (hsize_t)THRESHOLD, (hsize_t)FBSIZE) < 0)
         TEST_ERROR;
 
+    H5E_BEGIN_TRY {
+        file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
+    } H5E_END_TRY;
+    if(file<0) {
+        H5Pclose (fapl);
+        SKIPPED();
+        printf("  Probably the file system doesn't support Direct I/O\n");
+        return 0;
+    }
+
     /* Retrieve the access property list... */
     if ((access_fapl = H5Fget_access_plist(file)) < 0)
         TEST_ERROR;
 
     /* Check that the driver is correct */
-    if(H5FD_CORE != H5Pget_driver(access_fapl))
-        TEST_ERROR;
-
-    /* Check that the backing store write tracking info was saved */
-    if(H5Pget_core_write_tracking(fapl, &use_write_tracking, &write_tracking_page_size) < 0)
-        TEST_ERROR;
-    if(TRUE != use_write_tracking)
-        TEST_ERROR;
-    if(CORE_PAGE_SIZE != write_tracking_page_size)
+    if(H5FD_DIRECT != H5Pget_driver(access_fapl))
         TEST_ERROR;
 
     /* ...and close the property list */
     if (H5Pclose(access_fapl) < 0)
         TEST_ERROR;
 
-    if(H5Fget_vfd_handle(file, H5P_DEFAULT, &fhandle) < 0)
+    /* Check file handle API */
+    if(H5Fget_vfd_handle(file, H5P_DEFAULT, (void **)&fhandle) < 0)
+        TEST_ERROR;
+    if(*fhandle<0)
         TEST_ERROR;
-    if(fhandle==NULL)
-    {
-        printf("fhandle==NULL\n");
-               TEST_ERROR;
-    }
 
     /* Check file size API */
     if(H5Fget_filesize(file, &file_size) < 0)
         TEST_ERROR;
 
-    /* There is no garantee the size of metadata in file is constant.
-     * Just try to check if it's reasonable.  Why is this 4KB?
+    /* There is no guarantee of the number of metadata allocations, but it's
+     * 4 currently and the size of the file should be between 3 & 4 file buffer
+     * sizes..
      */
-    if(file_size<2*KB || file_size>6*KB)
-        TEST_ERROR;
-
-    if(H5Fclose(file) < 0)
-        TEST_ERROR;
-
-
-    /* Open the file with backing store off for read and write.
-     * Changes won't be saved in file. */
-    if(H5Pset_fapl_core(fapl, (size_t)CORE_INCREMENT, FALSE) < 0)
-        TEST_ERROR;
-
-    if((file=H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+    if(file_size < (FBSIZE * 3) || file_size >= (FBSIZE * 4))
         TEST_ERROR;
 
-    /* Allocate memory for data set. */
-    if(NULL == (points = (int *)HDmalloc(DSET1_DIM1 * DSET1_DIM2 * sizeof(int))))
+    /* Allocate aligned memory for data set 1. For data set 1, everything is aligned including
+     * memory address, size of data, and file address. */
+    if(0 != HDposix_memalign(&points, (size_t)FBSIZE, (size_t)(DSET1_DIM1 * DSET1_DIM2 * sizeof(int))))
         TEST_ERROR;
-    if(NULL == (check = (int *)HDmalloc(DSET1_DIM1 * DSET1_DIM2 * sizeof(int))))
+    if(0 != HDposix_memalign(&check, (size_t)FBSIZE, (size_t)(DSET1_DIM1 * DSET1_DIM2 * sizeof(int))))
         TEST_ERROR;
 
     /* Initialize the dset1 */
@@ -493,71 +517,48 @@ test_core(void)
                 printf("    Read different values than written in data set 1.\n");
                 printf("    At index %d,%d\n", i, j);
                 TEST_ERROR;
-            } /* end if */
-
-    if(H5Dclose(dset1) < 0)
-        TEST_ERROR;
-
-    if(H5Fclose(file) < 0)
-        TEST_ERROR;
-
-    /* Open the file with backing store on for read and write.
-     * Changes will be saved in file. */
-    if(H5Pset_fapl_core(fapl, (size_t)CORE_INCREMENT, TRUE) < 0)
-        TEST_ERROR;
+              } /* end if */
 
-    if((file = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0)
+    /* Create the data space2. For data set 2, memory address and data size are not aligned. */
+    dims2[0] = DSET2_DIM;
+    if((space2 = H5Screate_simple(1, dims2, NULL)) < 0)
         TEST_ERROR;
 
-    /* Create the dset1 */
-    if((dset1 = H5Dcreate2(file, DSET1_NAME, H5T_NATIVE_INT, space1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+    /* Create the dset2 */
+    if((dset2 = H5Dcreate2(file, DSET2_NAME, H5T_NATIVE_INT, space2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
         TEST_ERROR;
 
     /* Write the data to the dset1 */
-    if(H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, points) < 0)
-        TEST_ERROR;
-
-    if(H5Dclose(dset1) < 0)
+    if(H5Dwrite(dset2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata2) < 0)
         TEST_ERROR;
 
-    if((dset1 = H5Dopen2(file, DSET1_NAME, H5P_DEFAULT)) < 0)
+    if(H5Dclose(dset2) < 0)
         TEST_ERROR;
 
-    /* Reallocate memory for reading buffer. */
-    HDassert(check);
-    HDfree(check);
-    if(NULL == (check = (int *)HDmalloc(DSET1_DIM1 * DSET1_DIM2 * sizeof(int))))
+    if((dset2 = H5Dopen2(file, DSET2_NAME, H5P_DEFAULT)) < 0)
         TEST_ERROR;
 
     /* Read the data back from dset1 */
-    if(H5Dread(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, check) < 0)
+    if(H5Dread(dset2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata2) < 0)
         TEST_ERROR;
 
     /* Check that the values read are the same as the values written */
-    p1 = points;
-    p2 = check;
-    for(i = 0; i < DSET1_DIM1; i++)
-        for(j = 0; j < DSET1_DIM2; j++)
-            if(*p1++ != *p2++) {
-                H5_FAILED();
-                printf("    Read different values than written in data set 1.\n");
-                printf("    At index %d,%d\n", i, j);
-                TEST_ERROR;
-            } /* end if */
-
-    /* Check file size API */
-    if(H5Fget_filesize(file, &file_size) < 0)
-        TEST_ERROR;
-
-    /* There is no garantee the size of metadata in file is constant.
-     * Just try to check if it's reasonable. */
-    if(file_size<64*KB || file_size>256*KB)
-        TEST_ERROR;
+    for(i = 0; i < DSET2_DIM; i++)
+        if(wdata2[i] != rdata2[i]) {
+            H5_FAILED();
+            printf("    Read different values than written in data set 2.\n");
+            printf("    At index %d\n", i);
+            TEST_ERROR;
+        } /* end if */
 
     if(H5Sclose(space1) < 0)
         TEST_ERROR;
     if(H5Dclose(dset1) < 0)
         TEST_ERROR;
+    if(H5Sclose(space2) < 0)
+        TEST_ERROR;
+    if(H5Dclose(dset2) < 0)
+        TEST_ERROR;
     if(H5Fclose(file) < 0)
         TEST_ERROR;
     HDassert(points);
@@ -566,13 +567,16 @@ test_core(void)
     HDfree(check);
 
     h5_cleanup(FILENAME, fapl);
-
     PASSED();
     return 0;
 
 error:
     H5E_BEGIN_TRY {
         H5Pclose(fapl);
+        H5Sclose(space1);
+        H5Dclose(dset1);
+        H5Sclose(space2);
+        H5Dclose(dset2);
         H5Fclose(file);
     } H5E_END_TRY;
 
@@ -582,6 +586,7 @@ error:
         HDfree(check);
 
     return -1;
+#endif /*H5_HAVE_DIRECT*/
 }
 
 

@@ -685,6 +690,8 @@ test_family(void)
 
     TESTING("FAMILY file driver");
 
+    h5_reset();
+
     /* Set property list and file name for FAMILY driver */
     fapl = h5_fileaccess();
 
@@ -846,6 +853,8 @@ test_family_compat(void)
 
     TESTING("FAMILY file driver backward compatibility");
 
+    h5_reset();
+
     /* Set property list and file name for FAMILY driver */
     fapl = h5_fileaccess();
 
@@ -982,6 +991,9 @@ test_multi(void)
     int         buf[MULTI_SIZE][MULTI_SIZE];
 
     TESTING("MULTI file driver");
+
+    h5_reset();
+
     /* Set file access property list for MULTI driver */
     fapl = h5_fileaccess();
 
@@ -1194,6 +1206,8 @@ test_multi_compat(void)
 
     TESTING("MULTI file driver backward compatibility");
 
+    h5_reset();
+
     /* Set file access property list for MULTI driver */
     fapl = h5_fileaccess();
 
@@ -1349,6 +1363,8 @@ test_log(void)
 
     TESTING("LOG file driver");
 
+    h5_reset();
+
     /* Set property list and file name for log driver. */
     fapl = h5_fileaccess();
     if(H5Pset_fapl_log(fapl, LOG_FILENAME, flags, buf_size) < 0)
@@ -1428,6 +1444,8 @@ test_stdio(void)
 
     TESTING("STDIO file driver");
 
+    h5_reset();
+
     /* Set property list and file name for STDIO driver. */
     fapl = h5_fileaccess();
     if(H5Pset_fapl_stdio(fapl) < 0)
@@ -1518,6 +1536,8 @@ test_windows(void)
 
 #else /* H5_HAVE_WINDOWS */
 
+    h5_reset();
+
     /* Set property list and file name for WINDOWS driver. */
     fapl = h5_fileaccess();
     if(H5Pset_fapl_windows(fapl) < 0)
@@ -1592,25 +1612,23 @@ main(void)
 {
     int nerrors = 0;
 
-    h5_reset();
-
     printf("Testing basic Virtual File Driver functionality.\n");
 
     nerrors += test_sec2() < 0           ? 1 : 0;
     nerrors += test_core() < 0           ? 1 : 0;
+    nerrors += test_direct() < 0         ? 1 : 0;
     nerrors += test_family() < 0         ? 1 : 0;
     nerrors += test_family_compat() < 0  ? 1 : 0;
     nerrors += test_multi() < 0          ? 1 : 0;
     nerrors += test_multi_compat() < 0   ? 1 : 0;
-    nerrors += test_direct() < 0         ? 1 : 0;
     nerrors += test_log() < 0            ? 1 : 0;
     nerrors += test_stdio() < 0          ? 1 : 0;
     nerrors += test_windows() < 0        ? 1 : 0;
 
     if(nerrors) {
-  printf("***** %d Virtual File Driver TEST%s FAILED! *****\n",
-    nerrors, nerrors > 1 ? "S" : "");
-  return 1;
+        printf("***** %d Virtual File Driver TEST%s FAILED! *****\n",
+            nerrors, nerrors > 1 ? "S" : "");
+        return 1;
     }
 
     printf("All Virtual File Driver tests passed.\n");
diff --git a/testpar/CMakeLists.txt b/testpar/CMakeLists.txt
index 05f74dc..634afe3 100644
--- a/testpar/CMakeLists.txt
+++ b/testpar/CMakeLists.txt
@@ -23,6 +23,7 @@ set (testphdf5_SRCS
     ${HDF5_TEST_PAR_SOURCE_DIR}/t_span_tree.c
     ${HDF5_TEST_PAR_SOURCE_DIR}/t_chunk_alloc.c
     ${HDF5_TEST_PAR_SOURCE_DIR}/t_filter_read.c
+    ${HDF5_TEST_PAR_SOURCE_DIR}/t_prop.c
 )
 
 #-- Adding test for testhdf5
diff --git a/testpar/Makefile.am b/testpar/Makefile.am
index b190ce8..4fe0ba8 100644
--- a/testpar/Makefile.am
+++ b/testpar/Makefile.am
@@ -30,7 +30,8 @@ TEST_PROG_PARA=t_mpi testphdf5 t_cache t_pflush1 t_pflush2 t_pshutdown t_prestar
 check_PROGRAMS = $(TEST_PROG_PARA)
 
 testphdf5_SOURCES=testphdf5.c t_dset.c t_file.c t_file_image.c t_mdset.c \
-	t_ph5basic.c t_coll_chunk.c t_span_tree.c t_chunk_alloc.c t_filter_read.c
+	t_ph5basic.c t_coll_chunk.c t_span_tree.c t_chunk_alloc.c t_filter_read.c \
+	t_prop.c
 
 # The tests all depend on the hdf5 library and the test library
 LDADD = $(LIBH5TEST) $(LIBHDF5)
diff --git a/testpar/Makefile.in b/testpar/Makefile.in
index 8b6c54c..94e1b6c 100644
--- a/testpar/Makefile.in
+++ b/testpar/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -31,7 +31,17 @@
 # hdf5 Parallel Library Test Makefile(.in)
 #
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -94,21 +104,21 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(top_srcdir)/bin/depcomp $(top_srcdir)/bin/test-driver \
-	COPYING
 check_PROGRAMS = $(am__EXEEXT_1)
 TESTS =
 subdir = testpar
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 am__EXEEXT_1 = t_mpi$(EXEEXT) testphdf5$(EXEEXT) t_cache$(EXEEXT) \
@@ -154,7 +164,7 @@ am_testphdf5_OBJECTS = testphdf5.$(OBJEXT) t_dset.$(OBJEXT) \
 	t_file.$(OBJEXT) t_file_image.$(OBJEXT) t_mdset.$(OBJEXT) \
 	t_ph5basic.$(OBJEXT) t_coll_chunk.$(OBJEXT) \
 	t_span_tree.$(OBJEXT) t_chunk_alloc.$(OBJEXT) \
-	t_filter_read.$(OBJEXT)
+	t_filter_read.$(OBJEXT) t_prop.$(OBJEXT)
 testphdf5_OBJECTS = $(am_testphdf5_OBJECTS)
 testphdf5_LDADD = $(LDADD)
 testphdf5_DEPENDENCIES = $(LIBH5TEST) $(LIBHDF5)
@@ -170,7 +180,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -420,6 +430,9 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/depcomp \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am COPYING
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -437,7 +450,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -482,14 +494,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -499,13 +519,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -547,9 +566,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -700,7 +730,8 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 MPItest.h5 \
 #
 TEST_PROG_PARA = t_mpi testphdf5 t_cache t_pflush1 t_pflush2 t_pshutdown t_prestart t_init_term t_shapesame
 testphdf5_SOURCES = testphdf5.c t_dset.c t_file.c t_file_image.c t_mdset.c \
-	t_ph5basic.c t_coll_chunk.c t_span_tree.c t_chunk_alloc.c t_filter_read.c
+	t_ph5basic.c t_coll_chunk.c t_span_tree.c t_chunk_alloc.c t_filter_read.c \
+	t_prop.c
 
 
 # The tests all depend on the hdf5 library and the test library
@@ -741,7 +772,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign testpar/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign testpar/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -750,7 +780,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -826,6 +856,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/t_pflush2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/t_ph5basic.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/t_prestart.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/t_prop.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/t_pshutdown.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/t_shapesame.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/t_span_tree.Po at am__quote@
@@ -940,7 +971,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1211,6 +1242,8 @@ uninstall-am:
 	mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/testpar/t_cache.c b/testpar/t_cache.c
index 04e4cc4..8965cb4 100644
--- a/testpar/t_cache.c
+++ b/testpar/t_cache.c
@@ -20,31 +20,24 @@
 
 #include "h5test.h"
 #include "testpar.h"
-#include "H5Iprivate.h"
-#include "H5ACprivate.h"
-
-#define H5C_PACKAGE             /*suppress error about including H5Cpkg   */
-
-#include "H5Cpkg.h"
 
-#define H5AC_PACKAGE            /*suppress error about including H5ACpkg  */
+#define H5AC_FRIEND		/*suppress error about including H5ACpkg  */
+#define H5C_FRIEND		/*suppress error about including H5Cpkg   */
+#define H5F_FRIEND		/*suppress error about including H5Fpkg   */
 
 #include "H5ACpkg.h"
+#include "H5Cpkg.h"
+#include "H5Fpkg.h"
+#include "H5Iprivate.h"
+#include "H5MFprivate.h"
 
-#define H5F_PACKAGE             /*suppress error about including H5Fpkg   */
 
-#include "H5Fpkg.h"
+#define BASE_ADDR               (haddr_t)1024
 
 
 int     	nerrors = 0;
 int		failures = 0;
 hbool_t		verbose = TRUE; /* used to control error messages */
-#if 0
-/* So far we haven't needed this, but that may change.
- * Keep it around for now
- */
-hid_t noblock_dxpl_id=(-1);
-#endif
 
 #define NFILENAME 2
 #define PARATESTFILE filenames[0]
@@ -54,6 +47,14 @@ const char *FILENAME[NFILENAME]={"CacheTestDummy", NULL};
 #endif  /* !PATH_MAX */
 char    filenames[NFILENAME][PATH_MAX];
 hid_t   fapl;                           /* file access property list */
+haddr_t max_addr = 0;			/* used to store the end of
+					 * the address space used by
+					 * the data array (see below).
+					 */
+hbool_t callbacks_verbose = FALSE;	/* flag used to control whether
+					 * the callback functions are in
+					 * verbose mode.
+					 */
 
 
 int		world_mpi_size = -1;
@@ -137,11 +138,11 @@ int total_writes           = 0;
  *		processes, and thus cannot be marked as dirty unless they
  *		happen to overlap some collective operation.
  *
- *	cleared: Boolean flag that is set to true whenever the entry is
- *		dirty, and is cleared via a call to clear_datum().
+ *      cleared: Boolean flag that is set to true whenever the entry is
+ *              dirty, and is cleared via a call to datum_clear().
  *
- *	flushed: Boolean flag that is set to true whenever the entry is
- *		dirty, and is flushed via a call to flush_datum().
+ *      flushed: Boolean flag that is set to true whenever the entry is
+ *              dirty, and is flushed by the metadata cache.
  *
  *	reads:  Integer field used to maintain a count of the number of 
  *		times this entry has been read from the server since 
@@ -154,6 +155,12 @@ int total_writes           = 0;
  *	index:	Index of this instance of datum in the data_index[] array
  *		discussed below.
  *
+ *	aux_ptr: Pointer to the instance of H5AC_aux_t associated with the
+ *		instance of the metadata cache within which this entry
+ *		resides.  This field was added to allow us to pass this 
+ *		value to the notify callback from the serialize callback. 
+ *		It should be NULL when not in use.
+ *
  *****************************************************************************/
 
 struct datum
@@ -169,10 +176,11 @@ struct datum
     hbool_t		global_pinned;
     hbool_t		local_pinned;
     hbool_t		cleared;
-    hbool_t		flushed;
+    hbool_t             flushed;
     int			reads;
     int			writes;
     int			index;
+    struct H5AC_aux_t * aux_ptr;
 };
 
 /*****************************************************************************
@@ -381,27 +389,68 @@ static hbool_t serve_rw_count_reset_request(struct mssg_t * mssg_ptr);
 
 /* call back functions & related data structures */
 
-static herr_t clear_datum(H5F_t * f, void *  thing, hbool_t dest);
-static herr_t destroy_datum(H5F_t H5_ATTR_UNUSED * f, void * thing);
-static herr_t flush_datum(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, hbool_t dest, haddr_t addr,
-                   void *thing);
-static void * load_datum(H5F_t H5_ATTR_UNUSED *f, hid_t H5_ATTR_UNUSED dxpl_id, haddr_t addr,
-                  void H5_ATTR_UNUSED *udata);
-static herr_t size_datum(H5F_t H5_ATTR_UNUSED * f, void * thing, size_t * size_ptr);
+static herr_t datum_get_load_size(const void *image_ptr, 
+				  const void *udata_ptr,
+                                  size_t *image_len_ptr,
+                                  size_t *actual_len_ptr);
+
+static void * datum_deserialize(const void * image_ptr,
+                                size_t len,
+                                void * udata_ptr,
+                                hbool_t * dirty_ptr);
+
+static herr_t datum_image_len(void *thing,
+                              size_t *image_len_ptr,
+                              hbool_t *compressed_ptr,
+                              size_t *compressed_len_ptr);
+
+static herr_t datum_serialize(const H5F_t *f,
+                              void *image_ptr,
+                              size_t len,
+                              void *thing_ptr);
+
+static herr_t datum_notify(H5C_notify_action_t action, void *thing);
+
+static herr_t datum_free_icr(void * thing);
+
+static herr_t datum_clear(H5F_t * f, void *  thing, hbool_t about_to_destroy);
 
 #define DATUM_ENTRY_TYPE	H5AC_TEST_ID
 
 #define NUMBER_OF_ENTRY_TYPES	1
 
+
+/* Note the use of the H5AC__CLASS_SKIP_READS and H5AC__CLASS_SKIP_WRITES
+ * flags.  As a result of these flags, the metadata cache does no file I/O
+ * on metadata of the datum type.
+ *
+ * Instead, this test uses a server process to keep track of who has 
+ * written and read what, and to verify that there are no messages from
+ * the past / future.
+ *
+ * In the callbacks for the version 2 cache, this activity was hidden in 
+ * the load and flush callbacks.  However, now we handle this function in
+ * notify callbacks for the after load and after flush events.
+ *
+ *					     JRM -- 1/13/15
+ */
 const H5C_class_t types[NUMBER_OF_ENTRY_TYPES] =
 {
   {
-    DATUM_ENTRY_TYPE,
-    (H5C_load_func_t)load_datum,
-    (H5C_flush_func_t)flush_datum,
-    (H5C_dest_func_t)destroy_datum,
-    (H5C_clear_func_t)clear_datum,
-    (H5C_size_func_t)size_datum
+    /* id            */ DATUM_ENTRY_TYPE,
+    /* name          */ "datum",
+    /* mem_type      */ H5FD_MEM_DEFAULT,
+    /* flags         */ H5AC__CLASS_SKIP_READS | H5AC__CLASS_SKIP_WRITES,
+    /* get_load_size */ (H5AC_get_load_size_func_t)datum_get_load_size,
+    /* verify_chksum */ NULL,
+    /* deserialize   */ (H5AC_deserialize_func_t)datum_deserialize,
+    /* image_len     */ (H5AC_image_len_func_t)datum_image_len,
+    /* pre_serialize */ (H5AC_pre_serialize_func_t)NULL,
+    /* serialize     */ (H5AC_serialize_func_t)datum_serialize,
+    /* notify        */ (H5AC_notify_func_t)datum_notify,
+    /* free_icr      */ (H5AC_free_icr_func_t)datum_free_icr,
+    /* clear         */ (H5AC_clear_func_t)datum_clear,
+    /* fsf_size      */ (H5AC_get_fsf_size_t)NULL,
   }
 };
 
@@ -436,7 +485,7 @@ static hbool_t setup_cache_for_test(hid_t * fid_ptr,
                              H5C_t ** cache_ptr_ptr, 
                              int metadata_write_strategy);
 static void setup_rand(void);
-static hbool_t take_down_cache(hid_t fid);
+static hbool_t take_down_cache(hid_t fid, H5C_t * cache_ptr);
 static hbool_t verify_entry_reads(haddr_t addr, int expected_entry_reads);
 static hbool_t verify_entry_writes(haddr_t addr, int expected_entry_writes);
 static hbool_t verify_total_reads(int expected_total_reads);
@@ -465,20 +514,20 @@ static hbool_t trace_file_check(int metadata_write_strategy);
 #ifdef NOT_USED
 /*****************************************************************************
  *
- * Function:	print_stats()
+ * Function:    print_stats()
  *
- * Purpose:	Print the rudementary stats maintained by t_cache.
+ * Purpose:     Print the rudementary stats maintained by t_cache.
  *
- * 		This is a debugging function, which will not normally
- * 		be run as part of t_cache.
+ *              This is a debugging function, which will not normally
+ *              be run as part of t_cache.
  *
- * Return:	void
+ * Return:      void
  *
- * Programmer:	JRM -- 4/17/06
+ * Programmer:  JRM -- 4/17/06
  *
  * Modifications:
  *
- *		None.
+ *              None.
  *
  *****************************************************************************/
 
@@ -486,16 +535,16 @@ static void
 print_stats(void)
 {
     HDfprintf(stdout,
-	      "%d: datum clears / pinned clears / destroys = %ld / %ld / %ld\n",
+              "%d: datum clears / pinned clears / destroys = %ld / %ld / %ld\n",
               world_mpi_rank, datum_clears, datum_pinned_clears,
-	      datum_destroys );
+              datum_destroys );
     HDfprintf(stdout,
-	      "%d: datum flushes / pinned flushes / loads  = %ld / %ld / %ld\n",
+              "%d: datum flushes / pinned flushes / loads  = %ld / %ld / %ld\n",
               world_mpi_rank, datum_flushes, datum_pinned_flushes,
-	      datum_loads );
+              datum_loads );
     HDfprintf(stdout,
-	      "%d: pins: global / global dirty / local = %ld / %ld / %ld\n",
-	      world_mpi_rank, global_pins, global_dirty_pins, local_pins);
+              "%d: pins: global / global dirty / local = %ld / %ld / %ld\n",
+              world_mpi_rank, global_pins, global_dirty_pins, local_pins);
     HDfflush(stdout);
 
     return;
@@ -503,6 +552,7 @@ print_stats(void)
 } /* print_stats() */
 #endif /* NOT_USED */
 
+
 /*****************************************************************************
  *
  * Function:	reset_stats()
@@ -563,7 +613,6 @@ reset_stats(void)
 static hbool_t
 set_up_file_communicator(void)
 {
-    const char * fcn_name = "set_up_file_communicator()";
     hbool_t success = TRUE;
     int mpi_result;
     int num_excluded_ranks;
@@ -582,7 +631,7 @@ set_up_file_communicator(void)
 	    if ( verbose ) {
                 fprintf(stdout,
                         "%d:%s: MPI_Comm_group() failed with error %d.\n",
-                        world_mpi_rank, fcn_name, mpi_result);
+                        world_mpi_rank, FUNC, mpi_result);
             }
         }
     }
@@ -601,7 +650,7 @@ set_up_file_communicator(void)
             if ( verbose ) {
                 fprintf(stdout,
                         "%d:%s: MPI_Group_excl() failed with error %d.\n",
-                        world_mpi_rank, fcn_name, mpi_result);
+                        world_mpi_rank, FUNC, mpi_result);
             }
         }
     }
@@ -618,7 +667,7 @@ set_up_file_communicator(void)
             if ( verbose ) {
                 fprintf(stdout,
                         "%d:%s: MPI_Comm_create() failed with error %d.\n",
-                        world_mpi_rank, fcn_name, mpi_result);
+                        world_mpi_rank, FUNC, mpi_result);
             }
 
         } else {
@@ -632,7 +681,7 @@ set_up_file_communicator(void)
                     if ( verbose ) {
                         fprintf(stdout,
                                 "%d:%s: file_mpi_comm == MPI_COMM_NULL.\n",
-                                world_mpi_rank, fcn_name);
+                                world_mpi_rank, FUNC);
                     }
                 }
             } else {
@@ -646,7 +695,7 @@ set_up_file_communicator(void)
                     if ( verbose ) {
                         fprintf(stdout,
                                 "%d:%s: file_mpi_comm != MPI_COMM_NULL.\n",
-                                world_mpi_rank, fcn_name);
+                                world_mpi_rank, FUNC);
                     }
                 }
             }
@@ -664,7 +713,7 @@ set_up_file_communicator(void)
             if ( verbose ) {
                 fprintf(stdout,
                         "%d:%s: MPI_Comm_size() failed with error %d.\n",
-                        world_mpi_rank, fcn_name, mpi_result);
+                        world_mpi_rank, FUNC, mpi_result);
             }
         }
     }
@@ -680,7 +729,7 @@ set_up_file_communicator(void)
             if ( verbose ) {
                 fprintf(stdout,
                         "%d:%s: MPI_Comm_rank() failed with error %d.\n",
-                        world_mpi_rank, fcn_name, mpi_result);
+                        world_mpi_rank, FUNC, mpi_result);
             }
         }
     }
@@ -711,7 +760,6 @@ set_up_file_communicator(void)
 static int
 addr_to_datum_index(haddr_t base_addr)
 {
-    /* const char * fcn_name = "addr_to_datum_index()"; */
     int top = NUM_DATA_ENTRIES - 1;
     int bottom = 0;
     int middle = (NUM_DATA_ENTRIES - 1) / 2;
@@ -759,7 +807,6 @@ addr_to_datum_index(haddr_t base_addr)
 static void
 init_data(void)
 {
-    /* const char * fcn_name = "init_data()"; */
     /* The set of address offsets is chosen so as to avoid allowing the
      * base addresses to fall in a pattern of that will annoy the hash
      * table, and to give a good range of entry sizes.
@@ -774,7 +821,7 @@ init_data(void)
                                       1974, 3194, 5168, 8362, 13539};
     int i;
     int j = 0;
-    haddr_t addr = 512;
+    haddr_t addr = BASE_ADDR;
 
     /* this must hold so moves don't change entry size. */
     HDassert( (NUM_DATA_ENTRIES / 2) % 20 == 0 );
@@ -792,10 +839,11 @@ init_data(void)
 	data[i].global_pinned = FALSE;
 	data[i].local_pinned  = FALSE;
 	data[i].cleared       = FALSE;
-	data[i].flushed       = FALSE;
+        data[i].flushed       = FALSE;
         data[i].reads         = 0;
         data[i].writes        = 0;
 	data[i].index         = i;
+	data[i].aux_ptr       = NULL;
 
         data_index[i]         = i;
 
@@ -805,6 +853,9 @@ init_data(void)
         j = (j + 1) % num_addr_offsets;
     }
 
+    /* save the end of the address space used by the data array */
+    max_addr = addr;
+
     return;
 
 } /* init_data() */
@@ -837,7 +888,6 @@ init_data(void)
 static int
 do_express_test(void)
 {
-    const char * fcn_name = "do_express_test()";
     int express_test;
     int max_express_test;
     int result;
@@ -857,7 +907,7 @@ do_express_test(void)
         max_express_test = -1;
         if ( verbose ) {
             HDfprintf(stdout, "%d:%s: MPI_Allreduce() failed.\n",
-                      world_mpi_rank, fcn_name );
+                      world_mpi_rank, FUNC );
         }
     }
 
@@ -882,16 +932,10 @@ do_express_test(void)
  *
  * Programmer:	JRM -- 5/10/06
  *
- * Modifications:
- *
- *		None.
- *
  *****************************************************************************/
-
 static void
 do_sync(void)
 {
-    const char * fcn_name = "do_sync()";
 
     struct mssg_t mssg;
 
@@ -913,7 +957,7 @@ do_sync(void)
 	    nerrors++;
 	    if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: send_mssg() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -925,7 +969,7 @@ do_sync(void)
             nerrors++;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
 	} else if ( ( mssg.req != SYNC_ACK_CODE ) ||
                     ( mssg.src != world_server_mpi_rank ) ||
@@ -935,7 +979,7 @@ do_sync(void)
             nerrors++;
 	    if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: Bad data in sync ack.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
 	}
     }
@@ -959,16 +1003,10 @@ do_sync(void)
  *
  * Programmer:	JRM -- 1/3/06
  *
- * Modifications:
- *
- *		None.
- *
  *****************************************************************************/
-
 static int
 get_max_nerrors(void)
 {
-    const char * fcn_name = "get_max_nerrors()";
     int max_nerrors;
     int result;
 
@@ -985,7 +1023,7 @@ get_max_nerrors(void)
         max_nerrors = -1;
         if ( verbose ) {
             HDfprintf(stdout, "%d:%s: MPI_Allreduce() failed.\n",
-                      world_mpi_rank, fcn_name );
+                      world_mpi_rank, FUNC );
         }
     }
 
@@ -1024,7 +1062,6 @@ static hbool_t
 recv_mssg(struct mssg_t *mssg_ptr,
 	  int mssg_tag_offset)
 {
-    const char * fcn_name = "recv_mssg()";
     hbool_t success = TRUE;
     int mssg_tag = CACHE_TEST_TAG;
     int result;
@@ -1038,7 +1075,7 @@ recv_mssg(struct mssg_t *mssg_ptr,
         success = FALSE;
         if ( verbose ) {
             HDfprintf(stdout, "%d:%s: bad param(s) on entry.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
     } else {
 
@@ -1056,7 +1093,7 @@ recv_mssg(struct mssg_t *mssg_ptr,
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: MPI_Recv() failed.\n",
-                          world_mpi_rank, fcn_name );
+                          world_mpi_rank, FUNC );
             }
         } else if ( mssg_ptr->magic != MSSG_MAGIC ) {
 
@@ -1064,7 +1101,7 @@ recv_mssg(struct mssg_t *mssg_ptr,
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: invalid magic.\n", world_mpi_rank,
-                          fcn_name);
+                          FUNC);
             }
         } else if ( mssg_ptr->src != status.MPI_SOURCE ) {
 
@@ -1073,7 +1110,7 @@ recv_mssg(struct mssg_t *mssg_ptr,
             if ( verbose ) {
                 HDfprintf(stdout,
                           "%d:%s: mssg_ptr->src != status.MPI_SOURCE.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -1104,12 +1141,10 @@ recv_mssg(struct mssg_t *mssg_ptr,
  *		Added the add_req_to_tag parameter and supporting code.
  *
  *****************************************************************************/
-
 static hbool_t
 send_mssg(struct mssg_t *mssg_ptr,
 	  hbool_t add_req_to_tag)
 {
-    const char * fcn_name = "send_mssg()";
     hbool_t success = TRUE;
     int mssg_tag = CACHE_TEST_TAG;
     int result;
@@ -1128,7 +1163,7 @@ send_mssg(struct mssg_t *mssg_ptr,
         success = FALSE;
         if ( verbose ) {
             HDfprintf(stdout, "%d:%s: Invalid mssg on entry.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
     }
 
@@ -1150,7 +1185,7 @@ send_mssg(struct mssg_t *mssg_ptr,
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: MPI_Send() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -1177,7 +1212,6 @@ send_mssg(struct mssg_t *mssg_ptr,
 static hbool_t
 setup_derived_types(void)
 {
-    const char * fcn_name = "setup_derived_types()";
     hbool_t success = TRUE;
     int i;
     int result;
@@ -1203,7 +1237,7 @@ setup_derived_types(void)
         success = FALSE;
         if ( verbose ) {
             HDfprintf(stdout, "%d:%s: MPI_Address() call failed.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
 
     } else {
@@ -1225,7 +1259,7 @@ setup_derived_types(void)
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: MPI_Type_struct() call failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -1240,7 +1274,7 @@ setup_derived_types(void)
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: MPI_Type_commit() call failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -1249,7 +1283,7 @@ setup_derived_types(void)
 
 } /* setup_derived_types */
 
-
+

 /*****************************************************************************
  *
  * Function:	takedown_derived_types()
@@ -1263,16 +1297,10 @@ setup_derived_types(void)
  *
  * Programmer:	JRM -- 12/22/05
  *
- * Modifications:
- *
- *		None.
- *
  *****************************************************************************/
-
 static hbool_t
 takedown_derived_types(void)
 {
-    const char * fcn_name = "takedown_derived_types()";
     hbool_t success = TRUE;
     int result;
 
@@ -1284,7 +1312,7 @@ takedown_derived_types(void)
         success = FALSE;
         if ( verbose ) {
             HDfprintf(stdout, "%d:%s: MPI_Type_free() call failed.\n",
-            world_mpi_rank, fcn_name);
+            world_mpi_rank, FUNC);
         }
     }
 
@@ -1310,16 +1338,10 @@ takedown_derived_types(void)
  *
  * Programmer:	JRM -- 5/5/10
  *
- * Modifications:
- *
- *		None.
- *
  *****************************************************************************/
-
 static hbool_t
 reset_server_counters(void)
 {
-    const char * fcn_name = "reset_server_counters()";
     hbool_t success = TRUE;
     int i;
     long actual_total_reads = 0;
@@ -1346,7 +1368,7 @@ reset_server_counters(void)
         nerrors++;
         if ( verbose ) {
             HDfprintf(stdout, "%d:%s: actual/total reads mismatch (%ld/%ld).\n",
-                      world_mpi_rank, fcn_name, 
+                      world_mpi_rank, FUNC, 
                       actual_total_reads, total_reads);
         }
     }
@@ -1357,7 +1379,7 @@ reset_server_counters(void)
         nerrors++;
         if ( verbose ) {
             HDfprintf(stdout, "%d:%s: actual/total writes mismatch (%ld/%ld).\n",
-                      world_mpi_rank, fcn_name, 
+                      world_mpi_rank, FUNC, 
                       actual_total_writes, total_writes);
         }
     }
@@ -1393,11 +1415,9 @@ reset_server_counters(void)
  *		Updated for sync message.
  *
  *****************************************************************************/
-
 static hbool_t
 server_main(void)
 {
-    const char * fcn_name = "server_main()";
     hbool_t done = FALSE;
     hbool_t success = TRUE;
     int done_count = 0;
@@ -1409,7 +1429,7 @@ server_main(void)
         success = FALSE;
         if ( verbose ) {
             HDfprintf(stdout, "%d:%s: This isn't the server process?!?!?\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
     }
 
@@ -1429,7 +1449,7 @@ server_main(void)
 		case WRITE_REQ_ACK_CODE:
                     success = FALSE;
                     if(verbose)
-                        HDfprintf(stdout, "%s: Received write ack?!?.\n", fcn_name);
+                        HDfprintf(stdout, "%s: Received write ack?!?.\n", FUNC);
 		    break;
 
 		case READ_REQ_CODE:
@@ -1439,7 +1459,7 @@ server_main(void)
 		case READ_REQ_REPLY_CODE:
                     success = FALSE;
                     if(verbose)
-                        HDfprintf(stdout, "%s: Received read req reply?!?.\n", fcn_name);
+                        HDfprintf(stdout, "%s: Received read req reply?!?.\n", FUNC);
 		    break;
 
 		case SYNC_REQ_CODE:
@@ -1449,7 +1469,7 @@ server_main(void)
 		case SYNC_ACK_CODE:
                     success = FALSE;
                     if(verbose)
-                        HDfprintf(stdout, "%s: Received sync ack?!?.\n", fcn_name);
+                        HDfprintf(stdout, "%s: Received sync ack?!?.\n", FUNC);
 		    break;
 
 		case REQ_TTL_WRITES_CODE:
@@ -1459,7 +1479,7 @@ server_main(void)
 		case REQ_TTL_WRITES_RPLY_CODE:
                     success = FALSE;
                     if(verbose)
-                        HDfprintf(stdout, "%s: Received total writes reply?!?.\n", fcn_name);
+                        HDfprintf(stdout, "%s: Received total writes reply?!?.\n", FUNC);
 		    break;
 
 		case REQ_TTL_READS_CODE:
@@ -1469,7 +1489,7 @@ server_main(void)
 		case REQ_TTL_READS_RPLY_CODE:
                     success = FALSE;
                     if(verbose)
-                        HDfprintf(stdout, "%s: Received total reads reply?!?.\n", fcn_name);
+                        HDfprintf(stdout, "%s: Received total reads reply?!?.\n", FUNC);
 		    break;
 
 		case REQ_ENTRY_WRITES_CODE:
@@ -1479,7 +1499,7 @@ server_main(void)
 		case REQ_ENTRY_WRITES_RPLY_CODE:
                     success = FALSE;
                     if(verbose)
-                        HDfprintf(stdout, "%s: Received entry writes reply?!?.\n", fcn_name);
+                        HDfprintf(stdout, "%s: Received entry writes reply?!?.\n", FUNC);
 		    break;
 
 		case REQ_ENTRY_READS_CODE:
@@ -1489,7 +1509,7 @@ server_main(void)
 		case REQ_ENTRY_READS_RPLY_CODE:
                     success = FALSE;
                     if(verbose)
-                        HDfprintf(stdout, "%s: Received entry reads reply?!?.\n", fcn_name);
+                        HDfprintf(stdout, "%s: Received entry reads reply?!?.\n", FUNC);
 		    break;
 
 		case REQ_RW_COUNT_RESET_CODE:
@@ -1499,7 +1519,7 @@ server_main(void)
 		case REQ_RW_COUNT_RESET_RPLY_CODE:
                     success = FALSE;
                     if(verbose)
-                        HDfprintf(stdout, "%s: Received RW count reset reply?!?.\n", fcn_name);
+                        HDfprintf(stdout, "%s: Received RW count reset reply?!?.\n", FUNC);
 		    break;
 
 		case DONE_REQ_CODE:
@@ -1512,7 +1532,7 @@ server_main(void)
                     nerrors++;
                     success = FALSE;
                     if(verbose)
-		        HDfprintf(stdout, "%d:%s: Unknown request code.\n", world_mpi_rank, fcn_name);
+		        HDfprintf(stdout, "%d:%s: Unknown request code.\n", world_mpi_rank, FUNC);
 		    break;
             }
         }
@@ -1544,7 +1564,6 @@ server_main(void)
 static hbool_t
 serve_read_request(struct mssg_t * mssg_ptr)
 {
-    const char * fcn_name = "serve_read_request()";
     hbool_t report_mssg = FALSE;
     hbool_t success = TRUE;
     int target_index;
@@ -1559,7 +1578,7 @@ serve_read_request(struct mssg_t * mssg_ptr)
         success = FALSE;
         if ( verbose ) {
             HDfprintf(stdout, "%d:%s: Bad mssg on entry.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
     }
 
@@ -1574,7 +1593,7 @@ serve_read_request(struct mssg_t * mssg_ptr)
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: addr lookup failed for %a.\n",
-                          world_mpi_rank, fcn_name, target_addr);
+                          world_mpi_rank, FUNC, target_addr);
             }
         } else if ( data[target_index].len != mssg_ptr->len ) {
 
@@ -1583,7 +1602,7 @@ serve_read_request(struct mssg_t * mssg_ptr)
             if ( verbose ) {
                 HDfprintf(stdout,
                           "%d:%s: data[i].len = %Zu != mssg->len = %d.\n",
-                           world_mpi_rank, fcn_name,
+                           world_mpi_rank, FUNC,
                            data[target_index].len, mssg_ptr->len);
             }
         } else if ( ! (data[target_index].valid) ) {
@@ -1592,11 +1611,11 @@ serve_read_request(struct mssg_t * mssg_ptr)
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout,
-               "%d:%s: proc %d read invalid entry. idx/base_addr = %d/0x%llx.\n",
-                        world_mpi_rank, fcn_name,
-                        mssg_ptr->src,
+                  "%d:%s: proc %d read invalid entry. idx/base_addr = %d/%a.\n",
+                         world_mpi_rank, FUNC,
+                         mssg_ptr->src,
 			target_index,
-			(long long)(data[target_index].base_addr));
+			data[target_index].base_addr);
             }
         } else {
 
@@ -1647,7 +1666,7 @@ serve_read_request(struct mssg_t * mssg_ptr)
 
 } /* serve_read_request() */
 
-
+

 /*****************************************************************************
  *
  * Function:	serve_sync_request()
@@ -1668,16 +1687,10 @@ serve_read_request(struct mssg_t * mssg_ptr)
  *
  * Programmer:	JRM -- 5/10/06
  *
- * Modifications:
- *
- *		None.
- *
  *****************************************************************************/
-
 static hbool_t
 serve_sync_request(struct mssg_t * mssg_ptr)
 {
-    const char * fcn_name = "serve_sync_request()";
     hbool_t report_mssg = FALSE;
     hbool_t success = TRUE;
     struct mssg_t reply;
@@ -1690,7 +1703,7 @@ serve_sync_request(struct mssg_t * mssg_ptr)
         success = FALSE;
         if ( verbose ) {
             HDfprintf(stdout, "%d:%s: Bad mssg on entry.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
     }
 
@@ -1752,7 +1765,6 @@ serve_sync_request(struct mssg_t * mssg_ptr)
 static hbool_t
 serve_write_request(struct mssg_t * mssg_ptr)
 {
-    const char * fcn_name = "serve_write_request()";
     hbool_t report_mssg = FALSE;
     hbool_t success = TRUE;
     int target_index;
@@ -1770,7 +1782,7 @@ serve_write_request(struct mssg_t * mssg_ptr)
         success = FALSE;
         if ( verbose ) {
             HDfprintf(stdout, "%d:%s: Bad mssg on entry.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
     }
 
@@ -1785,7 +1797,7 @@ serve_write_request(struct mssg_t * mssg_ptr)
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: addr lookup failed for %a.\n",
-                          world_mpi_rank, fcn_name, target_addr);
+                          world_mpi_rank, FUNC, target_addr);
             }
         } else if ( data[target_index].len != mssg_ptr->len ) {
 
@@ -1794,7 +1806,7 @@ serve_write_request(struct mssg_t * mssg_ptr)
             if ( verbose ) {
                 HDfprintf(stdout,
                           "%d:%s: data[i].len = %Zu != mssg->len = %d.\n",
-                          world_mpi_rank, fcn_name,
+                          world_mpi_rank, FUNC,
                           data[target_index].len, mssg_ptr->len);
             }
         }
@@ -1811,7 +1823,7 @@ serve_write_request(struct mssg_t * mssg_ptr)
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: new ver = %d <= old ver = %d.\n",
-                          world_mpi_rank, fcn_name,
+                          world_mpi_rank, FUNC,
                           new_ver_num, data[target_index].ver);
             }
         }
@@ -1895,7 +1907,6 @@ serve_write_request(struct mssg_t * mssg_ptr)
 static hbool_t
 serve_total_writes_request(struct mssg_t * mssg_ptr)
 {
-    const char * fcn_name = "serve_total_writes_request()";
     hbool_t report_mssg = FALSE;
     hbool_t success = TRUE;
     struct mssg_t reply;
@@ -1908,7 +1919,7 @@ serve_total_writes_request(struct mssg_t * mssg_ptr)
         success = FALSE;
         if ( verbose ) {
             HDfprintf(stdout, "%d:%s: Bad mssg on entry.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
     }
 
@@ -1975,7 +1986,6 @@ serve_total_writes_request(struct mssg_t * mssg_ptr)
 static hbool_t
 serve_total_reads_request(struct mssg_t * mssg_ptr)
 {
-    const char * fcn_name = "serve_total_reads_request()";
     hbool_t report_mssg = FALSE;
     hbool_t success = TRUE;
     struct mssg_t reply;
@@ -1988,7 +1998,7 @@ serve_total_reads_request(struct mssg_t * mssg_ptr)
         success = FALSE;
         if ( verbose ) {
             HDfprintf(stdout, "%d:%s: Bad mssg on entry.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
     }
 
@@ -2055,7 +2065,6 @@ serve_total_reads_request(struct mssg_t * mssg_ptr)
 static hbool_t
 serve_entry_writes_request(struct mssg_t * mssg_ptr)
 {
-    const char * fcn_name = "serve_entry_writes_request()";
     hbool_t report_mssg = FALSE;
     hbool_t success = TRUE;
     int target_index;
@@ -2070,7 +2079,7 @@ serve_entry_writes_request(struct mssg_t * mssg_ptr)
         success = FALSE;
         if ( verbose ) {
             HDfprintf(stdout, "%d:%s: Bad mssg on entry.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
     }
 
@@ -2085,7 +2094,7 @@ serve_entry_writes_request(struct mssg_t * mssg_ptr)
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: addr lookup failed for %a.\n",
-                          world_mpi_rank, fcn_name, target_addr);
+                          world_mpi_rank, FUNC, target_addr);
             }
         } else {
 
@@ -2153,7 +2162,6 @@ serve_entry_writes_request(struct mssg_t * mssg_ptr)
 static hbool_t
 serve_entry_reads_request(struct mssg_t * mssg_ptr)
 {
-    const char * fcn_name = "serve_entry_reads_request()";
     hbool_t report_mssg = FALSE;
     hbool_t success = TRUE;
     int target_index;
@@ -2168,7 +2176,7 @@ serve_entry_reads_request(struct mssg_t * mssg_ptr)
         success = FALSE;
         if ( verbose ) {
             HDfprintf(stdout, "%d:%s: Bad mssg on entry.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
     }
 
@@ -2183,7 +2191,7 @@ serve_entry_reads_request(struct mssg_t * mssg_ptr)
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: addr lookup failed for %a.\n",
-                          world_mpi_rank, fcn_name, target_addr);
+                          world_mpi_rank, FUNC, target_addr);
             }
         } else {
 
@@ -2250,7 +2258,6 @@ serve_entry_reads_request(struct mssg_t * mssg_ptr)
 static hbool_t
 serve_rw_count_reset_request(struct mssg_t * mssg_ptr)
 {
-    const char * fcn_name = "serve_rw_count_reset_request()";
     hbool_t report_mssg = FALSE;
     hbool_t success = TRUE;
     struct mssg_t reply;
@@ -2263,7 +2270,7 @@ serve_rw_count_reset_request(struct mssg_t * mssg_ptr)
         success = FALSE;
         if ( verbose ) {
             HDfprintf(stdout, "%d:%s: Bad mssg on entry.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
     }
 
@@ -2317,92 +2324,140 @@ serve_rw_count_reset_request(struct mssg_t * mssg_ptr)
 
 

 /*-------------------------------------------------------------------------
- * Function:    clear_datum
+ * Function:	datum_get_load_size
  *
- * Purpose:     Mark the datum as clean and destroy it if requested.
- *		Do not write it to the server, or increment the version.
+ * Purpose:	Query the image size for an entry before deserializing it
  *
- * Return:      SUCCEED
+ * Return:	SUCCEED
  *
- * Programmer:  John Mainzer
- *              12/29/05
+ * Programmer:	Quincey Koziol
+ *              5/18/10
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-clear_datum(H5F_t * f,
-            void *  thing,
-            hbool_t dest)
+datum_get_load_size(const void *image_ptr, const void *udata_ptr,
+                  size_t *image_len_ptr, size_t *actual_len_ptr)
 {
+    haddr_t addr = *(haddr_t *)udata_ptr;
     int idx;
     struct datum * entry_ptr;
 
-    HDassert( thing );
-
-    entry_ptr = (struct datum *)thing;
+    HDassert( udata_ptr );
+    HDassert( image_len_ptr );
 
-    idx = addr_to_datum_index(entry_ptr->base_addr);
+    idx = addr_to_datum_index(addr);
 
     HDassert( idx >= 0 );
     HDassert( idx < NUM_DATA_ENTRIES );
     HDassert( idx < virt_num_data_entries );
-    HDassert( &(data[idx]) == entry_ptr );
 
-    HDassert( entry_ptr->header.addr == entry_ptr->base_addr );
-    HDassert( ( entry_ptr->header.size == entry_ptr->len ) ||
-	      ( entry_ptr->header.size == entry_ptr->local_len ) );
+    entry_ptr = &(data[idx]);
 
-    HDassert( entry_ptr->header.is_dirty == entry_ptr->dirty );
+    HDassert( addr == entry_ptr->base_addr );
+    HDassert( ! entry_ptr->global_pinned );
+    HDassert( ! entry_ptr->local_pinned );
 
-    if ( entry_ptr->header.is_dirty ) {
+    if ( callbacks_verbose ) {
 
-        entry_ptr->cleared = TRUE;
+        HDfprintf(stdout,
+	  "%d: get_load_size() idx = %d, addr = %ld, len = %d.\n",
+              world_mpi_rank, idx, (long)addr, (int)entry_ptr->local_len);
+	fflush(stdout);
     }
 
-    entry_ptr->header.is_dirty = FALSE;
-    entry_ptr->dirty = FALSE;
+    /* Set image length size */
+    *image_len_ptr = entry_ptr->local_len;
 
-    if ( dest ) {
+    return(SUCCEED);
+} /* get_load_size() */
 
-        destroy_datum(f, thing);
+

+/*-------------------------------------------------------------------------
+ * Function:	datum_deserialize
+ *
+ * Purpose:	deserialize the entry.
+ *
+ * Return:	void * (pointer to the in core representation of the entry)
+ *
+ * Programmer:	John Mainzer
+ *              9/20/07
+ *
+ *-------------------------------------------------------------------------
+ */
+static void *
+datum_deserialize(const void * image_ptr,
+                  H5_ATTR_UNUSED size_t len,
+                  void * udata_ptr,
+                  hbool_t * dirty_ptr)
+{
+    haddr_t addr = *(haddr_t *)udata_ptr;
+    hbool_t success = TRUE;
+    int idx;
+    struct datum * entry_ptr = NULL;
+
+    HDassert( image_ptr != NULL );
+
+    idx = addr_to_datum_index(addr);
+
+    HDassert( idx >= 0 );
+    HDassert( idx < NUM_DATA_ENTRIES );
+    HDassert( idx < virt_num_data_entries );
+
+    entry_ptr = &(data[idx]);
+
+    HDassert( addr == entry_ptr->base_addr );
+    HDassert( ! entry_ptr->global_pinned );
+    HDassert( ! entry_ptr->local_pinned );
+
+    HDassert( dirty_ptr );
+
+    if ( callbacks_verbose ) {
 
+        HDfprintf(stdout,
+	  "%d: deserialize() idx = %d, addr = %ld, len = %d, is_dirty = %d.\n",
+	  world_mpi_rank, idx, (long)addr, (int)len,
+	  (int)(entry_ptr->header.is_dirty));
+	fflush(stdout);
     }
 
-    datum_clears++;
+    *dirty_ptr = FALSE;
 
-    if ( entry_ptr->header.is_pinned ) {
+    if ( ! success ) {
+
+        entry_ptr = NULL;
 
-        datum_pinned_clears++;
-	HDassert( entry_ptr->global_pinned || entry_ptr->local_pinned );
     }
 
-    return(SUCCEED);
+    return(entry_ptr);
 
-} /* clear_datum() */
+} /* deserialize() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    destroy_datum()
+ * Function:	datum_image_len
  *
- * Purpose:     Destroy the entry.  At present, this means do nothing other
- *		than verify that the entry is clean.  In particular, do not
- *		write it to the server process.
+ * Purpose:	Return the real (and possibly reduced) length of the image.
+ * 		The helper functions verify that the correct version of
+ * 		deserialize is being called, and then call deserialize
+ * 		proper.
  *
- * Return:      SUCCEED
+ * Return:	SUCCEED
  *
- * Programmer:  John Mainzer
- *              12/29/05
+ * Programmer:	John Mainzer
+ *              9/19/07
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-destroy_datum(H5F_t H5_ATTR_UNUSED * f,
-              void *         thing)
+datum_image_len(void *thing, size_t *image_len,
+    hbool_t H5_ATTR_UNUSED *compressed_ptr, size_t H5_ATTR_UNUSED *compressed_len_ptr)
 {
     int idx;
     struct datum * entry_ptr;
 
     HDassert( thing );
+    HDassert( image_len );
 
     entry_ptr = (struct datum *)thing;
 
@@ -2412,56 +2467,53 @@ destroy_datum(H5F_t H5_ATTR_UNUSED * f,
     HDassert( idx < NUM_DATA_ENTRIES );
     HDassert( idx < virt_num_data_entries );
     HDassert( &(data[idx]) == entry_ptr );
+    HDassert( entry_ptr->local_len > 0 );
+    HDassert( entry_ptr->local_len <= entry_ptr->len );
 
-    HDassert( entry_ptr->header.addr == entry_ptr->base_addr );
-    HDassert( ( entry_ptr->header.size == entry_ptr->len ) ||
-	      ( entry_ptr->header.size == entry_ptr->local_len ) );
+    if(callbacks_verbose) {
+        HDfprintf(stdout,
+		  "%d: image_len() idx = %d, addr = %ld, len = %d.\n",
+		  world_mpi_rank, idx, (long)(entry_ptr->base_addr),
+		  (int)(entry_ptr->local_len));
+	fflush(stdout);
+    }
 
-    HDassert( !(entry_ptr->dirty) );
-    HDassert( !(entry_ptr->header.is_dirty) );
-    HDassert( !(entry_ptr->global_pinned) );
-    HDassert( !(entry_ptr->local_pinned) );
-    HDassert( !(entry_ptr->header.is_pinned) );
+    HDassert( entry_ptr->header.addr == entry_ptr->base_addr );
 
-    datum_destroys++;
+    *image_len = entry_ptr->local_len;
 
     return(SUCCEED);
-
-} /* destroy_datum() */
+} /* datum_image_len() */
 
 

 /*-------------------------------------------------------------------------
- * Function:    flush_datum
+ * Function:	datum_serialize
  *
- * Purpose:     Flush the entry to the server process and mark it as clean.
- *		Then destroy the entry if requested.
+ * Purpose:	Serialize the supplied entry.
  *
- * Return:      SUCCEED if successful, and FAIL otherwise.
+ * Return:	SUCCEED if successful, FAIL otherwise.
  *
- * Programmer:  John Mainzer
- *              12/29/05
+ * Programmer:	John Mainzer
+ *              10/30/07
  *
  *-------------------------------------------------------------------------
  */
 static herr_t
-flush_datum(H5F_t *f,
-            hid_t H5_ATTR_UNUSED dxpl_id,
-            hbool_t dest,
-            haddr_t H5_ATTR_UNUSED addr,
-            void *thing)
+datum_serialize(const H5F_t *f,
+                void *image_ptr,
+                size_t len,
+                void *thing_ptr)
 {
-    const char * fcn_name = "flush_datum()";
-    hbool_t was_dirty = FALSE;
     herr_t ret_value = SUCCEED;
     int idx;
     struct datum * entry_ptr;
-    struct mssg_t mssg;
     H5C_t * cache_ptr;
     struct H5AC_aux_t * aux_ptr;
 
-    HDassert( thing );
+    HDassert( thing_ptr );
+    HDassert( image_ptr );
 
-    entry_ptr = (struct datum *)thing;
+    entry_ptr = (struct datum *)thing_ptr;
 
     HDassert( f );
     HDassert( f->shared );
@@ -2474,7 +2526,11 @@ flush_datum(H5F_t *f,
 
     aux_ptr = (H5AC_aux_t *)(f->shared->cache->aux_ptr);
 
+    HDassert( aux_ptr );
     HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+    HDassert( entry_ptr->aux_ptr == NULL );
+
+    entry_ptr->aux_ptr = aux_ptr;
 
     idx = addr_to_datum_index(entry_ptr->base_addr);
 
@@ -2483,38 +2539,111 @@ flush_datum(H5F_t *f,
     HDassert( idx < virt_num_data_entries );
     HDassert( &(data[idx]) == entry_ptr );
 
+    if ( callbacks_verbose ) {
+
+        HDfprintf(stdout,
+		  "%d: serialize() idx = %d, addr = %ld, len = %d.\n",
+		  world_mpi_rank, idx, (long)entry_ptr->header.addr, (int)len);
+	fflush(stdout);
+    }
+
     HDassert( entry_ptr->header.addr == entry_ptr->base_addr );
     HDassert( ( entry_ptr->header.size == entry_ptr->len ) ||
               ( entry_ptr->header.size == entry_ptr->local_len ) );
 
     HDassert( entry_ptr->header.is_dirty == entry_ptr->dirty );
 
-    if ( ( file_mpi_rank != 0 ) && 
-         ( entry_ptr->dirty ) &&
-         ( aux_ptr->metadata_write_strategy == 
-           H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY ) ) {
+    datum_flushes++;
+
+    if ( entry_ptr->header.is_pinned ) {
+
+        datum_pinned_flushes++;
+        HDassert( entry_ptr->global_pinned || entry_ptr->local_pinned );
+    }
+
+    return(ret_value);
+
+} /* datum_serialize() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	datum_notify
+ *
+ * Purpose:	Do the communication with the server we used to do in the 
+ *		flush and load callbacks in the version 2 cache.
+ *
+ * Return:	SUCCEED
+ *
+ * Programmer:	John Mainzer
+ *              1/12/15
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+datum_notify(H5C_notify_action_t action, void *thing)
+{
+    hbool_t was_dirty = FALSE;
+    herr_t ret_value = SUCCEED;
+    struct datum * entry_ptr;
+    struct H5AC_aux_t * aux_ptr;
+    struct mssg_t mssg;
+    int idx;
+
+    HDassert( thing );
+
+    entry_ptr = (struct datum *)thing;
+
+    idx = addr_to_datum_index(entry_ptr->base_addr);
+
+    HDassert( idx >= 0 );
+    HDassert( idx < NUM_DATA_ENTRIES );
+    HDassert( idx < virt_num_data_entries );
+    HDassert( &(data[idx]) == entry_ptr );
+
+    if ( callbacks_verbose ) {
 
-        ret_value = FAIL;
         HDfprintf(stdout,
-                  "%d:%s: Flushed dirty entry from non-zero file process.",
-                  world_mpi_rank, fcn_name);
+                  "%d: notify() action = %d, idx = %d, addr = %ld.\n",
+                  world_mpi_rank, (int) action, idx, 
+                  (long)entry_ptr->header.addr);
+        fflush(stdout);
     }
 
-    if ( ret_value == SUCCEED ) {
+    HDassert( entry_ptr->header.addr == entry_ptr->base_addr );
+    HDassert( ( entry_ptr->header.size == entry_ptr->len ) ||
+              ( entry_ptr->header.size == entry_ptr->local_len ) );
+
+    switch ( action )
+    {
+        case H5AC_NOTIFY_ACTION_AFTER_INSERT:
+            if ( callbacks_verbose ) {
+
+                HDfprintf(stdout,
+                      "%d: notify() action = insert, idx = %d, addr = %ld.\n",
+                      world_mpi_rank, idx, (long)entry_ptr->header.addr);
+                fflush(stdout);
+            }
+            /* do nothing */
+            break;
 
-        if ( entry_ptr->header.is_dirty ) {
+        case H5AC_NOTIFY_ACTION_AFTER_LOAD:
+            if ( callbacks_verbose ) {
 
-	    was_dirty = TRUE; /* so we will receive the ack if requested */
+                HDfprintf(stdout,
+                      "%d: notify() action = load, idx = %d, addr = %ld.\n",
+                      world_mpi_rank, idx, (long)entry_ptr->header.addr);
+                fflush(stdout);
+            }
 
-            /* compose the message */
-            mssg.req       = WRITE_REQ_CODE;
+            /* compose the read message */
+            mssg.req       = READ_REQ_CODE;
             mssg.src       = world_mpi_rank;
             mssg.dest      = world_server_mpi_rank;
             mssg.mssg_num  = -1; /* set by send function */
             mssg.base_addr = entry_ptr->base_addr;
             mssg.len       = entry_ptr->len;
-            mssg.ver       = entry_ptr->ver;
-            mssg.count     = 0;
+            mssg.ver       = 0; /* bogus -- should be corrected by server */
+            mssg.count     = 0; /* not used */
             mssg.magic     = MSSG_MAGIC;
 
             if ( ! send_mssg(&mssg, FALSE) ) {
@@ -2523,265 +2652,320 @@ flush_datum(H5F_t *f,
                 ret_value = FAIL;
                 if ( verbose ) {
                     HDfprintf(stdout, "%d:%s: send_mssg() failed.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
-            else
-            {
-                entry_ptr->header.is_dirty = FALSE;
-                entry_ptr->dirty = FALSE;
-                entry_ptr->flushed = TRUE;
+
+            if ( ret_value == SUCCEED ) {
+
+                if ( ! recv_mssg(&mssg, READ_REQ_REPLY_CODE) ) {
+
+                    nerrors++;
+                    ret_value = FAIL;
+                    if ( verbose ) {
+                        HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n",
+                                  world_mpi_rank, FUNC);
+                    }
+                }
             }
-        }
-    }
 
-#if DO_WRITE_REQ_ACK
+            if ( ret_value == SUCCEED ) {
 
-    if ( ( ret_value == SUCCEED ) && ( was_dirty ) ) {
+                if ( ( mssg.req != READ_REQ_REPLY_CODE ) ||
+                     ( mssg.src != world_server_mpi_rank ) ||
+                     ( mssg.dest != world_mpi_rank ) ||
+                     ( mssg.base_addr != entry_ptr->base_addr ) ||
+                     ( mssg.len != entry_ptr->len ) ||
+                     ( mssg.ver < entry_ptr->ver ) ||
+                     ( mssg.magic != MSSG_MAGIC ) ) {
 
-        if ( ! recv_mssg(&mssg, WRITE_REQ_ACK_CODE) ) {
+                    nerrors++;
+                    ret_value = FAIL;
+                    if ( verbose ) {
+                        HDfprintf(stdout,
+                                  "%d:%s: Bad data in read req reply.\n",
+                                  world_mpi_rank, FUNC);
+                    }
 
-            nerrors++;
-            ret_value = FAIL;
-            if ( verbose ) {
-                HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n",
-                          world_mpi_rank, fcn_name);
-            }
-        } else if ( ( mssg.req != WRITE_REQ_ACK_CODE ) ||
-                    ( mssg.src != world_server_mpi_rank ) ||
-                    ( mssg.dest != world_mpi_rank ) ||
-                    ( mssg.base_addr != entry_ptr->base_addr ) ||
-                    ( mssg.len != entry_ptr->len ) ||
-                    ( mssg.ver != entry_ptr->ver ) ||
-                    ( mssg.magic != MSSG_MAGIC ) ) {
+#if 0 /* This has been useful debugging code -- keep it for now. */
+	            if ( mssg.req != READ_REQ_REPLY_CODE ) {
 
-            nerrors++;
-            ret_value = FAIL;
-            if ( verbose ) {
-                HDfprintf(stdout, "%d:%s: Bad data in write req ack.\n",
-                          world_mpi_rank, fcn_name);
-            }
-        }
-    }
+		        HDfprintf(stdout, 
+                                  "%d:%s: mssg.req != READ_REQ_REPLY_CODE.\n",
+			          world_mpi_rank, FUNC);
+		        HDfprintf(stdout, "%d:%s: mssg.req = %d.\n",
+			           world_mpi_rank, FUNC, (int)(mssg.req));
+	            }
 
-#endif /* DO_WRITE_REQ_ACK */
+	            if ( mssg.src != world_server_mpi_rank ) {
 
-    if ( ret_value == SUCCEED ) {
+		        HDfprintf(stdout, 
+                                 "%d:%s: mssg.src != world_server_mpi_rank.\n",
+			         world_mpi_rank, FUNC);
+	            }
 
-        if ( dest ) {
+	            if ( mssg.dest != world_mpi_rank ) {
 
-            ret_value = destroy_datum(f, thing);
-        }
-    }
+		        HDfprintf(stdout, 
+                                  "%d:%s: mssg.dest != world_mpi_rank.\n",
+			          world_mpi_rank, FUNC);
+                    }
 
-    datum_flushes++;
+	            if ( mssg.base_addr != entry_ptr->base_addr ) {
+
+		        HDfprintf(stdout,
+		 	    "%d:%s: mssg.base_addr != entry_ptr->base_addr.\n",
+			    world_mpi_rank, FUNC);
+		        HDfprintf(stdout, "%d:%s: mssg.base_addr = %a.\n",
+			          world_mpi_rank, FUNC, mssg.base_addr);
+		        HDfprintf(stdout, 
+                                  "%d:%s: entry_ptr->base_addr = %a.\n",
+			           world_mpi_rank, FUNC, 
+                                   entry_ptr->base_addr);
+                    }
 
-    if ( entry_ptr->header.is_pinned ) {
+	            if ( mssg.len != entry_ptr->len ) {
 
-        datum_pinned_flushes++;
-        HDassert( entry_ptr->global_pinned || entry_ptr->local_pinned );
-    }
+		        HDfprintf(stdout, 
+                                  "%d:%s: mssg.len != entry_ptr->len.\n",
+			          world_mpi_rank, FUNC);
+		        HDfprintf(stdout, "%d:%s: mssg.len = %a.\n",
+			          world_mpi_rank, FUNC, mssg.len);
+                    }
 
-    return(ret_value);
+	            if ( mssg.ver < entry_ptr->ver ) {
 
-} /* flush_datum() */
+		        HDfprintf(stdout, 
+                                  "%d:%s: mssg.ver < entry_ptr->ver.\n",
+			          world_mpi_rank, FUNC);
+                    }
 
-/*-------------------------------------------------------------------------
- * Function:    load_datum
- *
- * Purpose:     Read the requested entry from the server and mark it as
- *              clean.
- *
- * Return:      SUCCEED if successful, FAIL otherwise.
- *
- * Programmer:  John Mainzer
- *              12/29/05
- *
- * Modifications:
- *
- *-------------------------------------------------------------------------
- */
+	            if ( mssg.magic != MSSG_MAGIC ) {
 
-static void *
-load_datum(H5F_t H5_ATTR_UNUSED *f,
-           hid_t H5_ATTR_UNUSED dxpl_id,
-           haddr_t addr,
-           void H5_ATTR_UNUSED *udata)
-{
-    const char * fcn_name = "load_datum()";
-    hbool_t success = TRUE;
-    int idx;
-    struct datum * entry_ptr = NULL;
-    struct mssg_t mssg;
+		        HDfprintf(stdout, "%d:%s: mssg.magic != MSSG_MAGIC.\n",
+			          world_mpi_rank, FUNC);
+                     }
+#endif /* JRM */
 
-    idx = addr_to_datum_index(addr);
+                } else {
 
-    HDassert( idx >= 0 );
-    HDassert( idx < NUM_DATA_ENTRIES );
-    HDassert( idx < virt_num_data_entries );
+                    entry_ptr->ver = mssg.ver;
+                    entry_ptr->dirty = FALSE;
+                    datum_loads++;
+                }
+            }
+            break;
 
-    entry_ptr = &(data[idx]);
+	case H5C_NOTIFY_ACTION_AFTER_FLUSH:
+            if ( callbacks_verbose ) {
 
-    HDassert( addr == entry_ptr->base_addr );
-    HDassert( ! entry_ptr->global_pinned );
-    HDassert( ! entry_ptr->local_pinned );
+                HDfprintf(stdout,
+                      "%d: notify() action = flush, idx = %d, addr = %ld.\n",
+                      world_mpi_rank, idx, (long)entry_ptr->header.addr);
+                fflush(stdout);
+            }
 
-    /* compose the read message */
-    mssg.req       = READ_REQ_CODE;
-    mssg.src       = world_mpi_rank;
-    mssg.dest      = world_server_mpi_rank;
-    mssg.mssg_num  = -1; /* set by send function */
-    mssg.base_addr = entry_ptr->base_addr;
-    mssg.len       = entry_ptr->len;
-    mssg.ver       = 0; /* bogus -- should be corrected by server */
-    mssg.count     = 0; /* not used */
-    mssg.magic     = MSSG_MAGIC;
+            HDassert( entry_ptr->aux_ptr );
+            HDassert( entry_ptr->aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC );
+            aux_ptr = entry_ptr->aux_ptr;
+            entry_ptr->aux_ptr = NULL;
 
-    if ( ! send_mssg(&mssg, FALSE) ) {
+	    HDassert(entry_ptr->header.is_dirty); /* JRM */
 
-        nerrors++;
-        success = FALSE;
-        if ( verbose ) {
-            HDfprintf(stdout, "%d:%s: send_mssg() failed.\n",
-                      world_mpi_rank, fcn_name);
-        }
-    }
+            if ( ( file_mpi_rank != 0 ) && 
+                 ( entry_ptr->dirty ) &&
+                 ( aux_ptr->metadata_write_strategy == 
+                   H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY ) ) {
 
-    if ( success ) {
+                ret_value = FAIL;
+                HDfprintf(stdout,
+                     "%d:%s: Flushed dirty entry from non-zero file process.",
+                     world_mpi_rank, FUNC);
+            }
 
-        if ( ! recv_mssg(&mssg, READ_REQ_REPLY_CODE) ) {
+            if ( ret_value == SUCCEED ) {
 
-            nerrors++;
-            success = FALSE;
-            if ( verbose ) {
-                HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n",
-                          world_mpi_rank, fcn_name);
+                if ( entry_ptr->header.is_dirty ) {
+
+	            was_dirty = TRUE; /* so we will receive the ack 
+                                       * if requested 
+                                       */
+
+                    /* compose the message */
+                    mssg.req       = WRITE_REQ_CODE;
+                    mssg.src       = world_mpi_rank;
+                    mssg.dest      = world_server_mpi_rank;
+                    mssg.mssg_num  = -1; /* set by send function */
+                    mssg.base_addr = entry_ptr->base_addr;
+                    mssg.len       = entry_ptr->len;
+                    mssg.ver       = entry_ptr->ver;
+                    mssg.count     = 0;
+                    mssg.magic     = MSSG_MAGIC;
+
+                    if ( ! send_mssg(&mssg, FALSE) ) {
+
+                        nerrors++;
+                        ret_value = FAIL;
+                        if ( verbose ) {
+                            HDfprintf(stdout, "%d:%s: send_mssg() failed.\n",
+                                      world_mpi_rank, FUNC);
+                        }
+                    }
+                    else
+                    {
+                        entry_ptr->dirty = FALSE;
+			entry_ptr->flushed = TRUE;
+                    }
+                }
             }
-        }
-    }
 
-    if ( success ) {
+#if DO_WRITE_REQ_ACK
 
-        if ( ( mssg.req != READ_REQ_REPLY_CODE ) ||
-             ( mssg.src != world_server_mpi_rank ) ||
-             ( mssg.dest != world_mpi_rank ) ||
-             ( mssg.base_addr != entry_ptr->base_addr ) ||
-             ( mssg.len != entry_ptr->len ) ||
-             ( mssg.ver < entry_ptr->ver ) ||
-             ( mssg.magic != MSSG_MAGIC ) ) {
+            if ( ( ret_value == SUCCEED ) && ( was_dirty ) ) {
 
-            nerrors++;
-            success = FALSE;
-            if ( verbose ) {
-                HDfprintf(stdout, "%d:%s: Bad data in read req reply.\n",
-                          world_mpi_rank, fcn_name);
+                if ( ! recv_mssg(&mssg, WRITE_REQ_ACK_CODE) ) {
+
+                    nerrors++;
+                    ret_value = FAIL;
+                    if ( verbose ) {
+                        HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n",
+                                  world_mpi_rank, FUNC);
+                    }
+                } else if ( ( mssg.req != WRITE_REQ_ACK_CODE ) ||
+                            ( mssg.src != world_server_mpi_rank ) ||
+                            ( mssg.dest != world_mpi_rank ) ||
+                            ( mssg.base_addr != entry_ptr->base_addr ) ||
+                            ( mssg.len != entry_ptr->len ) ||
+                            ( mssg.ver != entry_ptr->ver ) ||
+                            ( mssg.magic != MSSG_MAGIC ) ) {
+
+                    nerrors++;
+                    ret_value = FAIL;
+                    if ( verbose ) {
+                        HDfprintf(stdout, 
+                                  "%d:%s: Bad data in write req ack.\n",
+                                  world_mpi_rank, FUNC);
+                    }
+                }
             }
-#if 0 /* This has been useful debugging code -- keep it for now. */
-	    if ( mssg.req != READ_REQ_REPLY_CODE ) {
 
-		HDfprintf(stdout, "%d:%s: mssg.req != READ_REQ_REPLY_CODE.\n",
-			  world_mpi_rank, fcn_name);
-		HDfprintf(stdout, "%d:%s: mssg.req = %d.\n",
-			  world_mpi_rank, fcn_name, (int)(mssg.req));
-	    }
+#endif /* DO_WRITE_REQ_ACK */
 
-	    if ( mssg.src != world_server_mpi_rank ) {
+            datum_flushes++;
 
-		HDfprintf(stdout, "%d:%s: mssg.src != world_server_mpi_rank.\n",
-			  world_mpi_rank, fcn_name);
-	    }
+            if ( entry_ptr->header.is_pinned ) {
+
+                datum_pinned_flushes++;
+                HDassert(entry_ptr->global_pinned || entry_ptr->local_pinned);
+            }
+	    break;
 
-	    if ( mssg.dest != world_mpi_rank ) {
+        case H5AC_NOTIFY_ACTION_BEFORE_EVICT:
+            if ( callbacks_verbose ) {
 
-		HDfprintf(stdout, "%d:%s: mssg.dest != world_mpi_rank.\n",
-			  world_mpi_rank, fcn_name);
+                HDfprintf(stdout,
+                      "%d: notify() action = evict, idx = %d, addr = %ld.\n",
+                      world_mpi_rank, idx, (long)entry_ptr->header.addr);
+                fflush(stdout);
             }
 
-	    if ( mssg.base_addr != entry_ptr->base_addr ) {
+            /* do nothing */
+            break;
 
-		HDfprintf(stdout,
-			  "%d:%s: mssg.base_addr != entry_ptr->base_addr.\n",
-			  world_mpi_rank, fcn_name);
-		HDfprintf(stdout, "%d:%s: mssg.base_addr = %a.\n",
-			  world_mpi_rank, fcn_name, mssg.base_addr);
-		HDfprintf(stdout, "%d:%s: entry_ptr->base_addr = %a.\n",
-			  world_mpi_rank, fcn_name, entry_ptr->base_addr);
+	default:
+            nerrors++;
+            ret_value = FAIL;
+            if ( verbose ) {
+                HDfprintf(stdout, "%d:%s: Unknown notify action.\n",
+                          world_mpi_rank, FUNC);
             }
+	    break;
+    }
+
+    return(ret_value);
 
-	    if ( mssg.len != entry_ptr->len ) {
+} /* datum_notify() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:	datum_free_icr
+ *
+ * Purpose:	Nominally, this callback is supposed to free the
+ * 		in core representation of the entry.
+ *
+ * 		In the context of this test bed, we use it to do
+ * 		do all the processing we used to do on a destroy.
+ *
+ * Return:	SUCCEED
+ *
+ * Programmer:	John Mainzer
+ *              9/19/07
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+datum_free_icr(void * thing)
+{
+    int idx;
+    struct datum * entry_ptr;
 
-		HDfprintf(stdout, "%d:%s: mssg.len != entry_ptr->len.\n",
-			  world_mpi_rank, fcn_name);
-		HDfprintf(stdout, "%d:%s: mssg.len = %a.\n",
-			  world_mpi_rank, fcn_name, mssg.len);
-            }
+    HDassert( thing );
 
-	    if ( mssg.ver < entry_ptr->ver ) {
+    entry_ptr = (struct datum *)thing;
 
-		HDfprintf(stdout, "%d:%s: mssg.ver < entry_ptr->ver.\n",
-			  world_mpi_rank, fcn_name);
-            }
+    idx = addr_to_datum_index(entry_ptr->base_addr);
 
-	    if ( mssg.magic != MSSG_MAGIC ) {
+    HDassert( idx >= 0 );
+    HDassert( idx < NUM_DATA_ENTRIES );
+    HDassert( idx < virt_num_data_entries );
+    HDassert( &(data[idx]) == entry_ptr );
 
-		HDfprintf(stdout, "%d:%s: mssg.magic != MSSG_MAGIC.\n",
-			  world_mpi_rank, fcn_name);
-            }
-#endif /* JRM */
-        } else {
+    if ( callbacks_verbose ) {
 
-            entry_ptr->ver = mssg.ver;
-            entry_ptr->header.is_dirty = FALSE;
-            entry_ptr->dirty = FALSE;
-        }
+        HDfprintf(stdout,
+	  "%d: free_icr() idx = %d, dirty = %d.\n",
+		  world_mpi_rank, idx, (int)(entry_ptr->dirty));
+	fflush(stdout);
     }
 
-    if ( ! success ) {
-
-        entry_ptr = NULL;
-
-    }
+    HDassert( entry_ptr->header.addr == entry_ptr->base_addr );
+    HDassert( ( entry_ptr->header.size == entry_ptr->len ) ||
+              ( entry_ptr->header.size == entry_ptr->local_len ) );
 
-    datum_loads++;
+    HDassert( !(entry_ptr->header.is_dirty) );
+    HDassert( !(entry_ptr->global_pinned) );
+    HDassert( !(entry_ptr->local_pinned) );
+    HDassert( !(entry_ptr->header.is_pinned) );
 
-    return(entry_ptr);
+    datum_destroys++;
 
-} /* load_datum() */
+    return(SUCCEED);
+} /* datum_free_icr() */
 
+

 /*-------------------------------------------------------------------------
- * Function:    size_datum
+ * Function:    datum_clear
  *
- * Purpose:     Get the size of the specified entry.  Just look at the
- *		local copy, as size can't change.
+ * Purpose:     Mark the datum as clean.
+ *
+ *              Do not write it to the server, or increment the version.
  *
  * Return:      SUCCEED
  *
  * Programmer:  John Mainzer
- *              6/10/04
- *
- * Modifications:
- *
- * 		JRM -- 7/11/06
- * 		Modified function to return the local_len field instead
- * 		of the len field.  These two fields usually contain the
- * 		same value, but if the size of an entry is changed, we
- * 		store the altered size in local_len without changing
- * 		len.  Note that local_len must be positive, and may
- * 		not exceed len.
+ *              12/29/05
  *
  *-------------------------------------------------------------------------
  */
-
 static herr_t
-size_datum(H5F_t H5_ATTR_UNUSED *  f,
-           void *   thing,
-           size_t * size_ptr)
+datum_clear(H5F_t H5_ATTR_UNUSED * f,
+            void *  thing,
+            hbool_t H5_ATTR_UNUSED about_to_destroy)
 {
     int idx;
     struct datum * entry_ptr;
 
     HDassert( thing );
-    HDassert( size_ptr );
 
     entry_ptr = (struct datum *)thing;
 
@@ -2791,18 +2975,30 @@ size_datum(H5F_t H5_ATTR_UNUSED *  f,
     HDassert( idx < NUM_DATA_ENTRIES );
     HDassert( idx < virt_num_data_entries );
     HDassert( &(data[idx]) == entry_ptr );
-    HDassert( entry_ptr->local_len > 0 );
-    HDassert( entry_ptr->local_len <= entry_ptr->len );
 
     HDassert( entry_ptr->header.addr == entry_ptr->base_addr );
+    HDassert( ( entry_ptr->header.size == entry_ptr->len ) ||
+              ( entry_ptr->header.size == entry_ptr->local_len ) );
 
-    *size_ptr = entry_ptr->local_len;
+    HDassert( ( entry_ptr->dirty ) ||
+              ( entry_ptr->header.is_dirty == entry_ptr->dirty ) );
 
-    return(SUCCEED);
+    entry_ptr->cleared = TRUE;
+    entry_ptr->dirty = FALSE;
 
-} /* size_datum() */
+    datum_clears++;
+
+    if ( entry_ptr->header.is_pinned ) {
+
+        datum_pinned_clears++;
+        HDassert( entry_ptr->global_pinned || entry_ptr->local_pinned );
+    }
+
+    return(SUCCEED);
 
+} /* datum_clear() */
 
+

 /*****************************************************************************/
 /************************** test utility functions ***************************/
 /*****************************************************************************/
@@ -2820,17 +3016,11 @@ size_datum(H5F_t H5_ATTR_UNUSED *  f,
  * Programmer:  John Mainzer
  *              07/11/06
  *
- * Modifications:
- *
- *              None.
- *
  *****************************************************************************/
-
 static void
 expunge_entry(H5F_t * file_ptr,
               int32_t idx)
 {
-    const char * fcn_name = "expunge_entry()";
     hbool_t in_cache;
     herr_t result;
     struct datum * entry_ptr;
@@ -2845,6 +3035,8 @@ expunge_entry(H5F_t * file_ptr,
     HDassert( !(entry_ptr->global_pinned) );
     HDassert( !(entry_ptr->local_pinned) );
 
+    entry_ptr->dirty = FALSE;
+
     if ( nerrors == 0 ) {
 
         result = H5AC_expunge_entry(file_ptr, (hid_t)-1, &(types[0]),
@@ -2855,7 +3047,7 @@ expunge_entry(H5F_t * file_ptr,
             nerrors++;
             if ( verbose ) {
 	        HDfprintf(stdout, "%d:%s: Error in H5AC_expunge_entry().\n",
-	                  world_mpi_rank, fcn_name);
+	                  world_mpi_rank, FUNC);
             }
         }
 
@@ -2863,21 +3055,21 @@ expunge_entry(H5F_t * file_ptr,
 	HDassert( ! ((entry_ptr->header).is_dirty) );
 
 	result = H5C_get_entry_status(file_ptr, entry_ptr->base_addr,
-				      NULL, &in_cache, NULL, NULL, NULL);
+				      NULL, &in_cache, NULL, NULL, NULL, NULL, NULL, NULL);
 
 	if ( result < 0 ) {
 
             nerrors++;
             if ( verbose ) {
 	        HDfprintf(stdout, "%d:%s: Error in H5C_get_entry_status().\n",
-	                  world_mpi_rank, fcn_name);
+	                  world_mpi_rank, FUNC);
             }
         } else if ( in_cache ) {
 
             nerrors++;
             if ( verbose ) {
 	        HDfprintf(stdout, "%d:%s: Expunged entry still in cache?!?\n",
-	                  world_mpi_rank, fcn_name);
+	                  world_mpi_rank, FUNC);
             }
         }
     }
@@ -2886,7 +3078,7 @@ expunge_entry(H5F_t * file_ptr,
 
 } /* expunge_entry() */
 
-
+

 /*****************************************************************************
  * Function:    insert_entry()
  *
@@ -2908,14 +3100,12 @@ expunge_entry(H5F_t * file_ptr,
  *              any pins must be global pins.
  *
  *****************************************************************************/
-
 static void
 insert_entry(H5C_t * cache_ptr,
              H5F_t * file_ptr,
              int32_t idx,
              unsigned int flags)
 {
-    const char * fcn_name = "insert_entry()";
     hbool_t insert_pinned;
     herr_t result;
     struct datum * entry_ptr;
@@ -2937,7 +3127,7 @@ insert_entry(H5C_t * cache_ptr,
         entry_ptr->dirty = TRUE;
 
         result = H5AC_insert_entry(file_ptr, H5P_DATASET_XFER_DEFAULT, &(types[0]),
-               entry_ptr->base_addr, (void *)(&(entry_ptr->header)), flags);
+                entry_ptr->base_addr, (void *)(&(entry_ptr->header)), flags);
 
         if ( ( result < 0 ) ||
              ( entry_ptr->header.type != &(types[0]) ) ||
@@ -2947,7 +3137,7 @@ insert_entry(H5C_t * cache_ptr,
             nerrors++;
             if ( verbose ) {
 	        HDfprintf(stdout, "%d:%s: Error in H5AC_insert_entry().\n",
-	                  world_mpi_rank, fcn_name);
+	                  world_mpi_rank, FUNC);
             }
         }
 
@@ -2970,7 +3160,7 @@ insert_entry(H5C_t * cache_ptr,
                 nerrors++;
                 if ( verbose ) {
 	            HDfprintf(stdout, "%d:%s: data[%d].header.is_dirty = %d.\n",
-	                      world_mpi_rank, fcn_name, idx,
+	                      world_mpi_rank, FUNC, idx,
                               (int)(data[idx].header.is_dirty));
 		}
             }
@@ -2997,7 +3187,7 @@ insert_entry(H5C_t * cache_ptr,
 
 } /* insert_entry() */
 
-
+

 /*****************************************************************************
  * Function:    local_pin_and_unpin_random_entries()
  *
@@ -3011,10 +3201,7 @@ insert_entry(H5C_t * cache_ptr,
  * Programmer:  John Mainzer
  *              4/12/06
  *
- * Modifications:
- *
  *****************************************************************************/
-
 static void
 local_pin_and_unpin_random_entries(H5F_t * file_ptr,
                                    int min_idx,
@@ -3022,7 +3209,6 @@ local_pin_and_unpin_random_entries(H5F_t * file_ptr,
 				   int min_count,
 				   int max_count)
 {
-    /* const char * fcn_name = "local_pin_and_unpin_random_entries()"; */
 
     if ( nerrors == 0 ) {
 
@@ -3091,7 +3277,6 @@ local_pin_random_entry(H5F_t * file_ptr,
                        int min_idx,
                        int max_idx)
 {
-    /* const char * fcn_name = "local_pin_random_entry()"; */
     int idx;
 
     if ( nerrors == 0 ) {
@@ -3117,7 +3302,7 @@ local_pin_random_entry(H5F_t * file_ptr,
 
 } /* local_pin_random_entry() */
 
-
+

 /*****************************************************************************
  * Function:    local_unpin_all_entries()
  *
@@ -3130,15 +3315,11 @@ local_pin_random_entry(H5F_t * file_ptr,
  * Programmer:  John Mainzer
  *              4/12/06
  *
- * Modifications:
- *
  *****************************************************************************/
-
 static void
 local_unpin_all_entries(H5F_t * file_ptr,
 			hbool_t via_unprotect)
 {
-    /* const char * fcn_name = "local_unpin_all_entries()"; */
 
     if ( nerrors == 0 ) {
 
@@ -3159,7 +3340,7 @@ local_unpin_all_entries(H5F_t * file_ptr,
 
 } /* local_unpin_all_entries() */
 
-
+

 /*****************************************************************************
  * Function:    local_unpin_next_pinned_entry()
  *
@@ -3175,16 +3356,12 @@ local_unpin_all_entries(H5F_t * file_ptr,
  * Programmer:  John Mainzer
  *              4/12/06
  *
- * Modifications:
- *
  *****************************************************************************/
-
 static int
 local_unpin_next_pinned_entry(H5F_t * file_ptr,
                               int start_idx,
 			      hbool_t via_unprotect)
 {
-    /* const char * fcn_name = "local_unpin_next_pinned_entry()"; */
     int i = 0;
     int idx = -1;
 
@@ -3221,7 +3398,7 @@ local_unpin_next_pinned_entry(H5F_t * file_ptr,
 
 } /* local_unpin_next_pinned_entry() */
 
-
+

 /*****************************************************************************
  * Function:    lock_and_unlock_random_entries()
  *
@@ -3236,10 +3413,7 @@ local_unpin_next_pinned_entry(H5F_t * file_ptr,
  * Programmer:  John Mainzer
  *              1/12/06
  *
- * Modifications:
- *
  *****************************************************************************/
-
 static void
 lock_and_unlock_random_entries(H5F_t * file_ptr,
                                int min_idx,
@@ -3247,7 +3421,6 @@ lock_and_unlock_random_entries(H5F_t * file_ptr,
                                int min_count,
                                int max_count)
 {
-    /* const char * fcn_name = "lock_and_unlock_random_entries()"; */
     int count;
     int i;
 
@@ -3272,7 +3445,7 @@ lock_and_unlock_random_entries(H5F_t * file_ptr,
 
 } /* lock_and_unlock_random_entries() */
 
-
+

 /*****************************************************************************
  * Function:    lock_and_unlock_random_entry()
  *
@@ -3286,16 +3459,12 @@ lock_and_unlock_random_entries(H5F_t * file_ptr,
  * Programmer:  John Mainzer
  *              1/4/06
  *
- * Modifications:
- *
  *****************************************************************************/
-
 static void
 lock_and_unlock_random_entry(H5F_t * file_ptr,
                              int min_idx,
                              int max_idx)
 {
-    /* const char * fcn_name = "lock_and_unlock_random_entry()"; */
     int idx;
 
     if ( nerrors == 0 ) {
@@ -3319,7 +3488,7 @@ lock_and_unlock_random_entry(H5F_t * file_ptr,
 
 } /* lock_and_unlock_random_entry() */
 
-
+

 /*****************************************************************************
  * Function:    lock_entry()
  *
@@ -3339,12 +3508,10 @@ lock_and_unlock_random_entry(H5F_t * file_ptr,
  * 		datum.
  *
  *****************************************************************************/
-
 static void
 lock_entry(H5F_t * file_ptr,
            int32_t idx)
 {
-    const char * fcn_name = "lock_entry()";
     struct datum * entry_ptr;
     H5C_cache_entry_t * cache_entry_ptr;
 
@@ -3357,8 +3524,11 @@ lock_entry(H5F_t * file_ptr,
 
 	HDassert( ! (entry_ptr->locked) );
 
-        cache_entry_ptr = (H5C_cache_entry_t *)H5AC_protect(file_ptr, -1, &(types[0]),
-                entry_ptr->base_addr, NULL, H5AC_WRITE);
+        cache_entry_ptr = (H5C_cache_entry_t *)H5AC_protect(file_ptr, 
+                                        H5P_DATASET_XFER_DEFAULT,
+                                        &(types[0]), entry_ptr->base_addr,
+                                        &entry_ptr->base_addr, 
+                                        H5AC__NO_FLAGS_SET);
 
         if ( ( cache_entry_ptr != (void *)(&(entry_ptr->header)) ) ||
              ( entry_ptr->header.type != &(types[0]) ) ||
@@ -3369,7 +3539,7 @@ lock_entry(H5F_t * file_ptr,
             nerrors++;
             if ( verbose ) {
 		HDfprintf(stdout, "%d:%s: error in H5AC_protect().\n",
-	                  world_mpi_rank, fcn_name);
+	                  world_mpi_rank, FUNC);
             }
         } else {
 
@@ -3398,11 +3568,9 @@ lock_entry(H5F_t * file_ptr,
  *              4/14/06
  *
  *****************************************************************************/
-
 static void
 mark_entry_dirty(int32_t idx)
 {
-    const char * fcn_name = "mark_entry_dirty()";
     herr_t result;
     struct datum * entry_ptr;
 
@@ -3427,7 +3595,7 @@ mark_entry_dirty(int32_t idx)
             if ( verbose ) {
 	        HDfprintf(stdout,
                           "%d:%s: error in H5AC_mark_entry_dirty().\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
 	else if ( ! ( entry_ptr->locked ) )
@@ -3440,7 +3608,7 @@ mark_entry_dirty(int32_t idx)
 
 } /* mark_entry_dirty() */
 
-
+

 /*****************************************************************************
  * Function:    pin_entry()
  *
@@ -3453,17 +3621,13 @@ mark_entry_dirty(int32_t idx)
  * Programmer:  John Mainzer
  *              4/11/06
  *
- * Modifications:
- *
  *****************************************************************************/
-
 static void
 pin_entry(H5F_t * file_ptr,
           int32_t idx,
 	  hbool_t global,
 	  hbool_t dirty)
 {
-    /* const char * fcn_name = "pin_entry()"; */
     unsigned int flags = H5AC__PIN_ENTRY_FLAG;
     struct datum * entry_ptr;
 
@@ -3510,8 +3674,8 @@ pin_entry(H5F_t * file_ptr,
 
 } /* pin_entry() */
 
-
 #ifdef H5_METADATA_TRACE_FILE
+

 /*****************************************************************************
  * Function:    pin_protected_entry()
  *
@@ -3525,17 +3689,11 @@ pin_entry(H5F_t * file_ptr,
  * Programmer:  John Mainzer
  *              01/04/06
  *
- * Modifications:
- *
- *              None.
- *
  *****************************************************************************/
-
 static void
 pin_protected_entry(int32_t idx,
 		    hbool_t global)
 {
-    const char * fcn_name = "pin_protected_entry()";
     herr_t result;
     struct datum * entry_ptr;
 
@@ -3561,7 +3719,7 @@ pin_protected_entry(int32_t idx,
             if ( verbose ) {
 	        HDfprintf(stdout,
 			  "%d:%s: Error in H5AC_pin_protected entry().\n",
-	                  world_mpi_rank, fcn_name);
+	                  world_mpi_rank, FUNC);
             }
         }
 
@@ -3609,7 +3767,6 @@ move_entry(H5F_t * file_ptr,
            int32_t old_idx,
            int32_t new_idx)
 {
-    const char   * fcn_name = "move_entry()";
     herr_t         result;
     int		   tmp;
     size_t	   tmp_len;
@@ -3672,7 +3829,7 @@ move_entry(H5F_t * file_ptr,
             nerrors++;
             if ( verbose ) {
 		HDfprintf(stdout, "%d:%s: H5AC_move_entry() failed.\n",
-	                  world_mpi_rank, fcn_name);
+	                  world_mpi_rank, FUNC);
             }
 
         } else {
@@ -3699,7 +3856,7 @@ move_entry(H5F_t * file_ptr,
                     if ( verbose ) {
 	                HDfprintf(stdout, 
                                   "%d:%s: data[%d].header.is_dirty = %d.\n",
-	                          world_mpi_rank, fcn_name, new_idx,
+	                          world_mpi_rank, FUNC, new_idx,
                                   (int)(data[new_idx].header.is_dirty));
 		    }
                 }
@@ -3730,7 +3887,6 @@ move_entry(H5F_t * file_ptr,
 static hbool_t
 reset_server_counts(void)
 {
-    const char * fcn_name = "reset_server_counts()";
     hbool_t success = TRUE; /* will set to FALSE if appropriate. */
     struct mssg_t mssg;
 
@@ -3753,7 +3909,7 @@ reset_server_counts(void)
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: send_mssg() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -3766,7 +3922,7 @@ reset_server_counts(void)
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         } else if ( ( mssg.req != REQ_RW_COUNT_RESET_RPLY_CODE ) ||
                     ( mssg.src != world_server_mpi_rank ) ||
@@ -3782,7 +3938,7 @@ reset_server_counts(void)
             if ( verbose ) {
                 HDfprintf(stdout, 
                           "%d:%s: Bad data in req r/w counter reset reply.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -3791,7 +3947,7 @@ reset_server_counts(void)
 
 } /* reset_server_counts() */
 
-
+

 /*****************************************************************************
  * Function:    resize_entry()
  *
@@ -3806,17 +3962,11 @@ reset_server_counts(void)
  * Programmer:  John Mainzer
  *              7/11/06
  *
- * Modifications:
- *
- *              None
- *
  *****************************************************************************/
-
 static void
 resize_entry(int32_t idx,
 	     size_t  new_size)
 {
-    const char   * fcn_name = "resize_entry()";
     herr_t         result;
     struct datum * entry_ptr;
 
@@ -3843,7 +3993,7 @@ resize_entry(int32_t idx,
             nerrors++;
             if ( verbose ) {
 		HDfprintf(stdout, "%d:%s: H5AC_resize_entry() failed.\n",
-	                  world_mpi_rank, fcn_name);
+	                  world_mpi_rank, FUNC);
             }
 
         } else {
@@ -3891,7 +4041,6 @@ setup_cache_for_test(hid_t * fid_ptr,
                      H5C_t ** cache_ptr_ptr,
                      int metadata_write_strategy)
 {
-    const char * fcn_name = "setup_cache_for_test()";
     hbool_t success = FALSE; /* will set to TRUE if appropriate. */
     hbool_t enable_rpt_fcn = FALSE;
     hid_t fid = -1;
@@ -3899,6 +4048,7 @@ setup_cache_for_test(hid_t * fid_ptr,
     H5AC_cache_config_t test_config;
     H5F_t * file_ptr = NULL;
     H5C_t * cache_ptr = NULL;
+    haddr_t actual_base_addr;
 
     HDassert ( fid_ptr != NULL );
     HDassert ( file_ptr_ptr != NULL );
@@ -3910,13 +4060,13 @@ setup_cache_for_test(hid_t * fid_ptr,
         nerrors++;
         if ( verbose ) {
 	    HDfprintf(stdout, "%d:%s: H5Fcreate() failed.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
     } else if ( H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0 ) {
         nerrors++;
         if ( verbose ) {
 	    HDfprintf(stdout, "%d:%s: H5Fflush() failed.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
     } else {
         file_ptr = (H5F_t *)H5I_object_verify(fid, H5I_FILE);
@@ -3926,7 +4076,7 @@ setup_cache_for_test(hid_t * fid_ptr,
         nerrors++;
         if ( verbose ) {
 	    HDfprintf(stdout, "%d:%s: Can't get file_ptr.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
     } else {
         cache_ptr = file_ptr->shared->cache;
@@ -3936,15 +4086,16 @@ setup_cache_for_test(hid_t * fid_ptr,
         nerrors++;
         if ( verbose ) {
 	    HDfprintf(stdout, "%d:%s: Can't get cache_ptr.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
     } else if ( cache_ptr->magic != H5C__H5C_T_MAGIC ) {
         nerrors++;
         if ( verbose ) {
 	    HDfprintf(stdout, "%d:%s: Bad cache_ptr magic.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
     } else {
+        cache_ptr->ignore_tags = TRUE;
         *fid_ptr = fid;
         *file_ptr_ptr = file_ptr;
         *cache_ptr_ptr = cache_ptr;
@@ -3961,7 +4112,7 @@ setup_cache_for_test(hid_t * fid_ptr,
 
 	    HDfprintf(stdout,
                       "%d:%s: H5AC_get_cache_auto_resize_config(1) failed.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
 
         } else {
 
@@ -3973,12 +4124,12 @@ setup_cache_for_test(hid_t * fid_ptr,
 
 	        HDfprintf(stdout,
                          "%d:%s: H5AC_set_cache_auto_resize_config() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
 
             } else if ( enable_rpt_fcn ) {
 
                 HDfprintf(stdout, "%d:%s: rpt_fcn enabled.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -3995,7 +4146,7 @@ setup_cache_for_test(hid_t * fid_ptr,
             nerrors++;
             if ( verbose ) {
 	        HDfprintf(stdout, "%d:%s: cache_ptr->aux_ptr == NULL.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         } else if ( ((H5AC_aux_t *)(cache_ptr->aux_ptr))->magic != 
                     H5AC__H5AC_AUX_T_MAGIC ) {
@@ -4004,7 +4155,7 @@ setup_cache_for_test(hid_t * fid_ptr,
             if ( verbose ) {
 	        HDfprintf(stdout, 
                 "%d:%s: cache_ptr->aux_ptr->magic != H5AC__H5AC_AUX_T_MAGIC.\n",
-                world_mpi_rank, fcn_name);
+                world_mpi_rank, FUNC);
             }
         } else if( ((H5AC_aux_t *)(cache_ptr->aux_ptr))->metadata_write_strategy
                    != metadata_write_strategy ) {
@@ -4013,7 +4164,7 @@ setup_cache_for_test(hid_t * fid_ptr,
             if ( verbose ) {
 	        HDfprintf(stdout, 
                     "%d:%s: bad cache_ptr->aux_ptr->metadata_write_strategy\n",
-                    world_mpi_rank, fcn_name);
+                    world_mpi_rank, FUNC);
             }
         }
     }
@@ -4031,7 +4182,7 @@ setup_cache_for_test(hid_t * fid_ptr,
 
 	    HDfprintf(stdout,
                       "%d:%s: H5AC_get_cache_auto_resize_config(2) failed.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
 
         } else if ( test_config.metadata_write_strategy != 
                     metadata_write_strategy ) {
@@ -4042,23 +4193,71 @@ setup_cache_for_test(hid_t * fid_ptr,
 
                 HDfprintf(stdout, 
                           "%d:%s: unexpected metadata_write_strategy.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
+            }
+        }
+    }
+
+    /* allocate space for test entries -- do this before we set the 
+     * sync point done callback as it will dirty the superblock, requiring
+     * another flush.  If the sync point done callback is set, this will
+     * cause a spurious failure.
+     */
+    if ( success ) { /* allocate space for test entries */
+
+        actual_base_addr = H5MF_alloc(file_ptr, H5FD_MEM_DEFAULT, H5P_DATASET_XFER_DEFAULT,
+                                      (hsize_t)(max_addr + BASE_ADDR));
+
+        if ( actual_base_addr == HADDR_UNDEF ) {
+
+            success = FALSE;
+	    nerrors++;
+
+            if ( verbose ) {
+	        HDfprintf(stdout, "%d:%s: H5MF_alloc() failed.\n",
+                          world_mpi_rank, FUNC);
+            }
+
+        } else if ( actual_base_addr > BASE_ADDR ) {
+
+            /* If this happens, must increase BASE_ADDR so that the
+             * actual_base_addr is <= BASE_ADDR.  This should only happen
+             * if the size of the superblock is increase.
+             */
+            success = FALSE;
+	    nerrors++;
+
+            if ( verbose ) {
+	        HDfprintf(stdout, "%d:%s: actual_base_addr > BASE_ADDR.\n",
+                          world_mpi_rank, FUNC);
             }
         }
     }
 
 
+    /* flush the file again -- space allocation dirtied superblock */
+    if ( success ) {
+
+        if ( H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0 ) {
+            nerrors++;
+            if ( verbose ) {
+	        HDfprintf(stdout, "%d:%s: second H5Fflush() failed.\n",
+                          world_mpi_rank, FUNC);
+            }
+        }
+    }
+
 #if DO_SYNC_AFTER_WRITE
 
     if ( success ) {
 
-	if ( H5AC_set_write_done_callback(cache_ptr, do_sync) != SUCCEED ) {
+	if ( H5AC__set_write_done_callback(cache_ptr, do_sync) != SUCCEED ) {
 
             nerrors++;
             if ( verbose ) {
 	        HDfprintf(stdout,
 			  "%d:%s: H5C_set_write_done_callback failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
 	}
     }
@@ -4067,14 +4266,13 @@ setup_cache_for_test(hid_t * fid_ptr,
 
     if ( success ) {
 
-	if ( H5AC_set_sync_point_done_callback(cache_ptr, verify_writes) != 
-             SUCCEED ) {
+	if ( H5AC__set_sync_point_done_callback(cache_ptr, verify_writes) != SUCCEED ) {
 
             nerrors++;
             if ( verbose ) {
 	        HDfprintf(stdout,
-			  "%d:%s: H5AC_set_sync_point_done_callback failed.\n",
-                          world_mpi_rank, fcn_name);
+			  "%d:%s: H5AC__set_sync_point_done_callback failed.\n",
+                          world_mpi_rank, FUNC);
             }
 	}
     }
@@ -4115,7 +4313,6 @@ static void
 verify_writes(int num_writes,
 	      haddr_t * written_entries_tbl)
 {
-    const char * fcn_name = "verify_writes()";
     const hbool_t report = FALSE;
     hbool_t proceed = TRUE;
     int i = 0;
@@ -4136,7 +4333,7 @@ verify_writes(int num_writes,
             nerrors++;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: barrier 1 failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -4163,7 +4360,7 @@ verify_writes(int num_writes,
             nerrors++;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: barrier 2 failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -4179,12 +4376,12 @@ verify_writes(int num_writes,
         if ( proceed ) {
 
             HDfprintf(stdout, "%d:%s: verified %d writes.\n",
-                      world_mpi_rank, fcn_name, num_writes);
+                      world_mpi_rank, FUNC, num_writes);
 
         } else {
 
             HDfprintf(stdout, "%d:%s: FAILED to verify %d writes.\n",
-                      world_mpi_rank, fcn_name, num_writes);
+                      world_mpi_rank, FUNC, num_writes);
 
         }
     }
@@ -4203,7 +4400,7 @@ verify_writes(int num_writes,
             nerrors++;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: barrier 3 failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -4212,7 +4409,7 @@ verify_writes(int num_writes,
 
 } /* verify_writes() */
 
-
+

 /*****************************************************************************
  *
  * Function:	setup_rand()
@@ -4232,14 +4429,12 @@ verify_writes(int num_writes,
  *		Modified function to facilitate setting predefined seeds.
  *
  *****************************************************************************/
-
 static void
 setup_rand(void)
 {
-    const char * fcn_name = "setup_rand()";
     hbool_t use_predefined_seeds = FALSE;
     int num_predefined_seeds = 3;
-    unsigned predefined_seeds[3] = {33402, 33505, 33422};
+    unsigned predefined_seeds[3] = {18669, 89925, 12577};
     unsigned seed;
     struct timeval tv;
 
@@ -4251,7 +4446,7 @@ setup_rand(void)
 
             seed = predefined_seeds[world_mpi_rank];
 	    HDfprintf(stdout, "%d:%s: predefined_seed = %d.\n",
-                      world_mpi_rank, fcn_name, seed);
+                      world_mpi_rank, FUNC, seed);
 	    fflush(stdout);
             HDsrand(seed);
 
@@ -4262,13 +4457,13 @@ setup_rand(void)
             nerrors++;
             if ( verbose ) {
 	        HDfprintf(stdout, "%d:%s: gettimeofday() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         } else {
             seed = (unsigned)tv.tv_usec;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: seed = %d.\n",
-                          world_mpi_rank, fcn_name, seed);
+                          world_mpi_rank, FUNC, seed);
                 fflush(stdout);
             }
             HDsrand(seed);
@@ -4279,7 +4474,7 @@ setup_rand(void)
 
 } /* setup_rand() */
 
-
+

 /*****************************************************************************
  *
  * Function:	take_down_cache()
@@ -4295,43 +4490,79 @@ setup_rand(void)
  *
  * Programmer:	JRM -- 1/4/06
  *
- * Modifications:
- *
- *		None.
- *
  *****************************************************************************/
-
 static hbool_t
-take_down_cache(hid_t fid)
+take_down_cache(hid_t fid, H5C_t * cache_ptr)
 {
-    const char * fcn_name = "take_down_cache()";
-    hbool_t success = FALSE; /* will set to TRUE if appropriate. */
+    hbool_t success = TRUE; /* will set to FALSE if appropriate. */
 
-    /* close the file and delete it */
-    if ( H5Fclose(fid) < 0  ) {
+    /* flush the file -- this should write out any remaining test 
+     * entries in the cache.
+     */
+    if ( ( success ) && ( H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0 ) ) {
 
+        success = FALSE;
         nerrors++;
         if ( verbose ) {
-            HDfprintf(stdout, "%d:%s: H5Fclose() failed.\n",
-                      world_mpi_rank, fcn_name);
+            HDfprintf(stdout, "%d:%s: H5Fflush() failed.\n",
+                      world_mpi_rank, FUNC);
         }
+    }
 
-    } else if ( world_mpi_rank == world_server_mpi_rank ) {
+    /* Now reset the sync point done callback.  Must do this as with 
+     * the SWMR mods, the cache will do additional I/O on file close
+     * un-related to the test entries, and thereby corrupt our counts
+     * of entry writes.
+     */
+    if ( success ) {
 
-        if ( HDremove(filenames[0]) < 0 ) {
+        if ( H5AC__set_sync_point_done_callback(cache_ptr, NULL) != SUCCEED ) {
 
+            success = FALSE;
             nerrors++;
             if ( verbose ) {
-                HDfprintf(stdout, "%d:%s: HDremove() failed.\n",
-                          world_mpi_rank, fcn_name);
+                HDfprintf(stdout,
+                          "%d:%s: H5AC__set_sync_point_done_callback failed.\n",
+                          world_mpi_rank, FUNC);
             }
-        } else {
+        }
+
 
-	    success = TRUE;
+    }
+
+    /* close the file */
+    if ( ( success ) && ( H5Fclose(fid) < 0 ) ) {
+
+        success = FALSE;
+        nerrors++;
+        if ( verbose ) {
+            HDfprintf(stdout, "%d:%s: H5Fclose() failed.\n",
+                      world_mpi_rank, FUNC);
         }
-    } else {
 
-        success = TRUE;
+    } 
+
+    if ( success ) {
+
+        if ( world_mpi_rank == world_server_mpi_rank ) {
+
+            if ( HDremove(filenames[0]) < 0 ) {
+
+                success = FALSE;
+                nerrors++;
+                if ( verbose ) {
+                    HDfprintf(stdout, "%d:%s: HDremove() failed.\n",
+                              world_mpi_rank, FUNC);
+                }
+            }
+        } else {
+
+	    /* verify that there have been no further writes of test 
+             * entries during the close
+             */
+            success = verify_total_writes(0);
+ 
+        }
     }
 
     return(success);
@@ -4363,7 +4594,6 @@ static hbool_t
 verify_entry_reads(haddr_t addr,
                    int expected_entry_reads)
 {
-    const char * fcn_name = "verify_entry_reads()";
     hbool_t success = TRUE;
     int reported_entry_reads;
     struct mssg_t mssg;
@@ -4387,7 +4617,7 @@ verify_entry_reads(haddr_t addr,
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: send_mssg() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -4400,7 +4630,7 @@ verify_entry_reads(haddr_t addr,
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -4419,7 +4649,7 @@ verify_entry_reads(haddr_t addr,
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: Bad data in req entry reads reply.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         } else {
 
@@ -4436,7 +4666,7 @@ verify_entry_reads(haddr_t addr,
             if ( verbose ) {
                 HDfprintf(stdout, 
                     "%d:%s: rep/exp entry 0x%llx reads mismatch (%ld/%ld).\n",
-                    world_mpi_rank, fcn_name, (long long)addr,
+                    world_mpi_rank, FUNC, (long long)addr,
                     reported_entry_reads, expected_entry_reads);
             }
         } 
@@ -4471,7 +4701,6 @@ static hbool_t
 verify_entry_writes(haddr_t addr,
                     int expected_entry_writes)
 {
-    const char * fcn_name = "verify_entry_writes()";
     hbool_t success = TRUE;
     int reported_entry_writes;
     struct mssg_t mssg;
@@ -4495,7 +4724,7 @@ verify_entry_writes(haddr_t addr,
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: send_mssg() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -4508,7 +4737,7 @@ verify_entry_writes(haddr_t addr,
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -4527,7 +4756,7 @@ verify_entry_writes(haddr_t addr,
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: Bad data in req entry writes reply.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         } else {
 
@@ -4544,7 +4773,7 @@ verify_entry_writes(haddr_t addr,
             if ( verbose ) {
                 HDfprintf(stdout, 
                     "%d:%s: rep/exp entry 0x%llx writes mismatch (%ld/%ld).\n",
-                    world_mpi_rank, fcn_name, (long long)addr,
+                    world_mpi_rank, FUNC, (long long)addr,
                     reported_entry_writes, expected_entry_writes);
             }
         } 
@@ -4577,7 +4806,6 @@ verify_entry_writes(haddr_t addr,
 static hbool_t
 verify_total_reads(int expected_total_reads)
 {
-    const char * fcn_name = "verify_total_reads()";
     hbool_t success = TRUE; /* will set to FALSE if appropriate. */
     long reported_total_reads;
     struct mssg_t mssg;
@@ -4601,7 +4829,7 @@ verify_total_reads(int expected_total_reads)
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: send_mssg() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -4614,7 +4842,7 @@ verify_total_reads(int expected_total_reads)
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         } else if ( ( mssg.req != REQ_TTL_READS_RPLY_CODE ) ||
                     ( mssg.src != world_server_mpi_rank ) ||
@@ -4628,7 +4856,7 @@ verify_total_reads(int expected_total_reads)
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: Bad data in req total reads reply.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         } else {
 
@@ -4645,7 +4873,7 @@ verify_total_reads(int expected_total_reads)
             if ( verbose ) {
                 HDfprintf(stdout, 
                     "%d:%s: reported/expected total reads mismatch (%ld/%ld).\n",
-                    world_mpi_rank, fcn_name, 
+                    world_mpi_rank, FUNC, 
                     reported_total_reads, expected_total_reads);
 
             }
@@ -4679,7 +4907,6 @@ verify_total_reads(int expected_total_reads)
 static hbool_t
 verify_total_writes(int expected_total_writes)
 {
-    const char * fcn_name = "verify_total_writes()";
     hbool_t success = TRUE; /* will set to FALSE if appropriate. */
     long reported_total_writes;
     struct mssg_t mssg;
@@ -4703,7 +4930,7 @@ verify_total_writes(int expected_total_writes)
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: send_mssg() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -4716,7 +4943,7 @@ verify_total_writes(int expected_total_writes)
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         } else if ( ( mssg.req != REQ_TTL_WRITES_RPLY_CODE ) ||
                     ( mssg.src != world_server_mpi_rank ) ||
@@ -4730,7 +4957,7 @@ verify_total_writes(int expected_total_writes)
             success = FALSE;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: Bad data in req total reads reply.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         } else {
 
@@ -4747,7 +4974,7 @@ verify_total_writes(int expected_total_writes)
             if ( verbose ) {
                 HDfprintf(stdout, 
                    "%d:%s: reported/expected total writes mismatch (%ld/%ld).\n",
-                   world_mpi_rank, fcn_name, 
+                   world_mpi_rank, FUNC, 
                    reported_total_writes, expected_total_writes);
             }
         }
@@ -4757,7 +4984,7 @@ verify_total_writes(int expected_total_writes)
 
 } /* verify_total_writes() */
 
-
+

 /*****************************************************************************
  * Function:    unlock_entry()
  *
@@ -4776,13 +5003,11 @@ verify_total_writes(int expected_total_writes)
  * 		Updated for the new local_len field in datum.
  *
  *****************************************************************************/
-
-void
+static void
 unlock_entry(H5F_t * file_ptr,
              int32_t idx,
              unsigned int flags)
 {
-    const char * fcn_name = "unlock_entry()";
     herr_t dirtied;
     herr_t result;
     struct datum * entry_ptr;
@@ -4816,8 +5041,8 @@ unlock_entry(H5F_t * file_ptr,
 
             nerrors++;
             if ( verbose ) {
-                HDfprintf(stdout, "%d:%s: error in H5C_unprotect().\n",
-                          world_mpi_rank, fcn_name);
+                HDfprintf(stdout, "%d:%s: error in H5AC_unprotect().\n",
+                          world_mpi_rank, FUNC);
             }
         } else {
 
@@ -4844,7 +5069,7 @@ unlock_entry(H5F_t * file_ptr,
 
 } /* unlock_entry() */
 
-
+

 /*****************************************************************************
  * Function:    unpin_entry()
  *
@@ -4863,7 +5088,6 @@ unlock_entry(H5F_t * file_ptr,
  * 		Added assertion that entry is pinned on entry.
  *
  *****************************************************************************/
-
 static void
 unpin_entry(H5F_t * file_ptr,
             int32_t idx,
@@ -4871,7 +5095,6 @@ unpin_entry(H5F_t * file_ptr,
             hbool_t dirty,
             hbool_t via_unprotect)
 {
-    const char * fcn_name = "unpin_entry()";
     herr_t result;
     unsigned int flags = H5AC__UNPIN_ENTRY_FLAG;
     struct datum * entry_ptr;
@@ -4916,7 +5139,7 @@ unpin_entry(H5F_t * file_ptr,
                 nerrors++;
                 if ( verbose ) {
                     HDfprintf(stdout, "%d:%s: error in H5AC_unpin_entry().\n",
-	                      world_mpi_rank, fcn_name);
+	                      world_mpi_rank, FUNC);
                 }
 	    }
 	}
@@ -4960,7 +5183,6 @@ unpin_entry(H5F_t * file_ptr,
 static hbool_t
 server_smoke_check(void)
 {
-    const char * fcn_name = "server_smoke_check()";
     hbool_t success = TRUE;
     int max_nerrors;
     struct mssg_t mssg;
@@ -4982,7 +5204,7 @@ server_smoke_check(void)
             nerrors++;
             if ( verbose ) {
 		HDfprintf(stdout, "%d:%s: server_main() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -5004,7 +5226,7 @@ server_smoke_check(void)
             nerrors++;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: send_mssg() failed on write.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
 
@@ -5020,7 +5242,7 @@ server_smoke_check(void)
                 nerrors++;
                 if ( verbose ) {
                     HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
         }
@@ -5040,7 +5262,7 @@ server_smoke_check(void)
                 nerrors++;
                 if ( verbose ) {
                     HDfprintf(stdout, "%d:%s: Bad data in write req ack.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
         }
@@ -5056,7 +5278,7 @@ server_smoke_check(void)
             nerrors++;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: barrier 1 failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
 
@@ -5089,7 +5311,7 @@ server_smoke_check(void)
             if ( verbose ) {
 
                 HDfprintf(stdout, "%d:%s: barrier 2 failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
 
@@ -5113,7 +5335,7 @@ server_smoke_check(void)
                 nerrors++;
                 if ( verbose ) {
                     HDfprintf(stdout, "%d:%s: send_mssg() failed on write.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
         }
@@ -5128,7 +5350,7 @@ server_smoke_check(void)
                 nerrors++;
                 if ( verbose ) {
                     HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
         }
@@ -5148,7 +5370,7 @@ server_smoke_check(void)
                 nerrors++;
                 if ( verbose ) {
                     HDfprintf(stdout, "%d:%s: Bad data in read req reply.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
         }
@@ -5160,7 +5382,7 @@ server_smoke_check(void)
             nerrors++;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: barrier 3 failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
 
@@ -5192,7 +5414,7 @@ server_smoke_check(void)
             if ( verbose ) {
 
                 HDfprintf(stdout, "%d:%s: barrier 4 failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
 
@@ -5209,7 +5431,7 @@ server_smoke_check(void)
             if ( verbose ) {
 
                 HDfprintf(stdout, "%d:%s: barrier 5 failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
 
@@ -5241,7 +5463,7 @@ server_smoke_check(void)
             if ( verbose ) {
 
                 HDfprintf(stdout, "%d:%s: barrier 6 failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
 
@@ -5265,7 +5487,7 @@ server_smoke_check(void)
                 nerrors++;
                 if ( verbose ) {
                     HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
         }
@@ -5309,7 +5531,6 @@ server_smoke_check(void)
 static hbool_t
 smoke_check_1(int metadata_write_strategy)
 {
-    const char * fcn_name = "smoke_check_1()";
     hbool_t success = TRUE;
     int i;
     int max_nerrors;
@@ -5351,7 +5572,7 @@ smoke_check_1(int metadata_write_strategy)
             nerrors++;
             if ( verbose ) {
 		HDfprintf(stdout, "%d:%s: server_main() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -5365,7 +5586,7 @@ smoke_check_1(int metadata_write_strategy)
             cache_ptr = NULL;
             if ( verbose ) {
 		HDfprintf(stdout, "%d:%s: setup_cache_for_test() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
 
@@ -5398,12 +5619,12 @@ smoke_check_1(int metadata_write_strategy)
 
         if ( fid >= 0 ) {
 
-            if ( ! take_down_cache(fid) ) {
+            if ( ! take_down_cache(fid, cache_ptr) ) {
 
                 nerrors++;
                 if ( verbose ) {
 		    HDfprintf(stdout, "%d:%s: take_down_cache() failed.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
         }
@@ -5438,7 +5659,7 @@ smoke_check_1(int metadata_write_strategy)
                 nerrors++;
                 if ( verbose ) {
                     HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
         }
@@ -5485,7 +5706,6 @@ smoke_check_1(int metadata_write_strategy)
 static hbool_t
 smoke_check_2(int metadata_write_strategy)
 {
-    const char * fcn_name = "smoke_check_2()";
     hbool_t success = TRUE;
     int i;
     int max_nerrors;
@@ -5527,7 +5747,7 @@ smoke_check_2(int metadata_write_strategy)
             nerrors++;
             if ( verbose ) {
 		HDfprintf(stdout, "%d:%s: server_main() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -5541,7 +5761,7 @@ smoke_check_2(int metadata_write_strategy)
             cache_ptr = NULL;
             if ( verbose ) {
 		HDfprintf(stdout, "%d:%s: setup_cache_for_test() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
 
@@ -5621,12 +5841,12 @@ smoke_check_2(int metadata_write_strategy)
 
         if ( fid >= 0 ) {
 
-            if ( ! take_down_cache(fid) ) {
+            if ( ! take_down_cache(fid, cache_ptr) ) {
 
                 nerrors++;
                 if ( verbose ) {
 		    HDfprintf(stdout, "%d:%s: take_down_cache() failed.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
         }
@@ -5661,7 +5881,7 @@ smoke_check_2(int metadata_write_strategy)
                 nerrors++;
                 if ( verbose ) {
                     HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
         }
@@ -5711,10 +5931,7 @@ smoke_check_2(int metadata_write_strategy)
 static hbool_t
 smoke_check_3(int metadata_write_strategy)
 {
-    const char * fcn_name = "smoke_check_3()";
     hbool_t success = TRUE;
-    hbool_t verbose = FALSE;
-    int cp = 0;
     int i;
     int max_nerrors;
     int min_count;
@@ -5747,36 +5964,24 @@ smoke_check_3(int metadata_write_strategy)
 	    break;
     }
 
-    /* 0 */
-    if ( verbose ) { HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++); }
-
     nerrors = 0;
     init_data();
     reset_stats();
 
     if ( world_mpi_rank == world_server_mpi_rank ) {
 
-        /* 1 */
-        if ( verbose ) {HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);}
-
 	if ( ! server_main() ) {
 
             /* some error occured in the server -- report failure */
             nerrors++;
             if ( verbose ) {
 		HDfprintf(stdout, "%d:%s: server_main() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
-
-        /* 2 */
-        if ( verbose ) {HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);}
     }
     else /* run the clients */
     {
-        /* 1 */
-        if ( verbose ) {HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);}
-
         if ( ! setup_cache_for_test(&fid, &file_ptr, &cache_ptr,
                                     metadata_write_strategy) ) {
 
@@ -5785,13 +5990,10 @@ smoke_check_3(int metadata_write_strategy)
             cache_ptr = NULL;
             if ( verbose ) {
 		HDfprintf(stdout, "%d:%s: setup_cache_for_test() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
 
-        /* 2 */
-        if ( verbose ) {HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);}
-
         min_count = 100 / ((file_mpi_rank + 1) * (file_mpi_rank + 1));
         max_count = min_count + 50;
 
@@ -5806,9 +6008,6 @@ smoke_check_3(int metadata_write_strategy)
             }
         }
 
-        /* 3 */
-        if ( verbose ) {HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);}
-
 
         min_count = 100 / ((file_mpi_rank + 2) * (file_mpi_rank + 2));
         max_count = min_count + 50;
@@ -5848,9 +6047,6 @@ smoke_check_3(int metadata_write_strategy)
 
 	}
 
-        /* 4 */
-        if ( verbose ) {HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);}
-
 
 	/* flush the file to be sure that we have no problems flushing
 	 * pinned entries
@@ -5859,13 +6055,10 @@ smoke_check_3(int metadata_write_strategy)
             nerrors++;
             if ( verbose ) {
 	        HDfprintf(stdout, "%d:%s: H5Fflush() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
 
-        /* 5 */
-        if ( verbose ) {HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);}
-
 
         min_idx = 0;
         max_idx = ((virt_num_data_entries / 10) /
@@ -5900,9 +6093,6 @@ smoke_check_3(int metadata_write_strategy)
 	    }
         }
 
-        /* 6 */
-        if ( verbose ) {HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);}
-
         min_idx = 0;
         max_idx = ((virt_num_data_entries / 10) /
                    ((file_mpi_rank + 3) * (file_mpi_rank + 3))) - 1;
@@ -5919,9 +6109,6 @@ smoke_check_3(int metadata_write_strategy)
                                            min_idx, max_idx, 0, 100);
         }
 
-        /* 7 */
-        if ( verbose ) {HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);}
-
         /* we can't move pinned entries, so release any local pins now. */
         local_unpin_all_entries(file_ptr, FALSE);
 
@@ -5939,9 +6126,6 @@ smoke_check_3(int metadata_write_strategy)
                                            min_count, max_count);
         }
 
-        /* 8 */
-        if ( verbose ) {HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);}
-
         /* ...and then move them back. */
         for ( i = (virt_num_data_entries / 2) - 1; i >= 0; i-- )
         {
@@ -5953,9 +6137,6 @@ smoke_check_3(int metadata_write_strategy)
                                            min_count, max_count);
         }
 
-        /* 9 */
-        if ( verbose ) {HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);}
-
         /* finally, do some dirty lock/unlocks while we give the cache
          * a chance t reduce its size.
          */
@@ -5978,27 +6159,21 @@ smoke_check_3(int metadata_write_strategy)
             }
         }
 
-        /* 10 */
-        if ( verbose ) {HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);}
-
         /* release any local pins before we take down the cache. */
         local_unpin_all_entries(file_ptr, FALSE);
 
         if ( fid >= 0 ) {
 
-            if ( ! take_down_cache(fid) ) {
+            if ( ! take_down_cache(fid, cache_ptr) ) {
 
                 nerrors++;
                 if ( verbose ) {
 		    HDfprintf(stdout, "%d:%s: take_down_cache() failed.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
         }
 
-        /* 11 */
-        if ( verbose ) {HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);}
-
         /* verify that all instances of datum are back where the started
          * and are clean.
          */
@@ -6030,13 +6205,10 @@ smoke_check_3(int metadata_write_strategy)
                 nerrors++;
                 if ( verbose ) {
                     HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
         }
-
-        /* 12 */
-        if ( verbose ) {HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);}
     }
 
     max_nerrors = get_max_nerrors();
@@ -6083,7 +6255,6 @@ smoke_check_3(int metadata_write_strategy)
 static hbool_t
 smoke_check_4(int metadata_write_strategy)
 {
-    const char * fcn_name = "smoke_check_4()";
     hbool_t success = TRUE;
     int i;
     int max_nerrors;
@@ -6129,7 +6300,7 @@ smoke_check_4(int metadata_write_strategy)
             nerrors++;
             if ( verbose ) {
 		HDfprintf(stdout, "%d:%s: server_main() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -6143,7 +6314,7 @@ smoke_check_4(int metadata_write_strategy)
             cache_ptr = NULL;
             if ( verbose ) {
 		HDfprintf(stdout, "%d:%s: setup_cache_for_test() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
 
@@ -6219,7 +6390,7 @@ smoke_check_4(int metadata_write_strategy)
             nerrors++;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: H5Fflush() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
 
@@ -6310,12 +6481,12 @@ smoke_check_4(int metadata_write_strategy)
 
         if ( fid >= 0 ) {
 
-            if ( ! take_down_cache(fid) ) {
+            if ( ! take_down_cache(fid, cache_ptr) ) {
 
                 nerrors++;
                 if ( verbose ) {
 		    HDfprintf(stdout, "%d:%s: take_down_cache() failed.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
         }
@@ -6351,7 +6522,7 @@ smoke_check_4(int metadata_write_strategy)
                 nerrors++;
                 if ( verbose ) {
                     HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
         }
@@ -6396,10 +6567,7 @@ smoke_check_4(int metadata_write_strategy)
 static hbool_t
 smoke_check_5(int metadata_write_strategy)
 {
-    const char * fcn_name = "smoke_check_5()";
     hbool_t success = TRUE;
-    hbool_t verbose = FALSE;
-    int cp = 0;
     int i;
     int max_nerrors;
     hid_t fid = -1;
@@ -6429,43 +6597,25 @@ smoke_check_5(int metadata_write_strategy)
     }
 
 
-    /* 0 */
-    if ( verbose ) { HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++); }
-
     nerrors = 0;
     init_data();
     reset_stats();
 
     if ( world_mpi_rank == world_server_mpi_rank ) {
 
-        /* 1 */
-        if ( verbose ) {
-	    HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);
-        }
-
 	if ( ! server_main() ) {
 
             /* some error occured in the server -- report failure */
             nerrors++;
             if ( verbose ) {
 		HDfprintf(stdout, "%d:%s: server_main() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
-
-        /* 2 */
-        if ( verbose ) {
-	    HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);
-        }
     }
     else /* run the clients */
     {
 
-        /* 1 */
-        if ( verbose ) {
-	    HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);
-        }
-
         if ( ! setup_cache_for_test(&fid, &file_ptr, &cache_ptr,
                                     metadata_write_strategy) ) {
 
@@ -6474,39 +6624,24 @@ smoke_check_5(int metadata_write_strategy)
             cache_ptr = NULL;
             if ( verbose ) {
 		HDfprintf(stdout, "%d:%s: setup_cache_for_test() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
 
-        /* 2 */
-        if ( verbose ) {
-	    HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);
-        }
-
         for ( i = 0; i < (virt_num_data_entries / 2); i++ )
         {
             insert_entry(cache_ptr, file_ptr, i, H5AC__NO_FLAGS_SET);
         }
 
-        /* 3 */
-        if ( verbose ) {
-	    HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);
-        }
-
 	/* flush the file so we can lock known clean entries. */
         if ( H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0 ) {
             nerrors++;
             if ( verbose ) {
 	        HDfprintf(stdout, "%d:%s: H5Fflush() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
 
-        /* 4 */
-        if ( verbose ) {
-	    HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);
-        }
-
         for ( i = 0; i < (virt_num_data_entries / 4); i++ )
         {
 	    lock_entry(file_ptr, i);
@@ -6530,11 +6665,6 @@ smoke_check_5(int metadata_write_strategy)
 	    }
         }
 
-        /* 5 */
-        if ( verbose ) {
-	    HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);
-        }
-
         for ( i = (virt_num_data_entries / 2) - 1;
               i >= (virt_num_data_entries / 4);
 	      i-- )
@@ -6559,28 +6689,18 @@ smoke_check_5(int metadata_write_strategy)
 	    unpin_entry(file_ptr, i, TRUE, FALSE, FALSE);
         }
 
-        /* 6 */
-        if ( verbose ) {
-	    HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);
-        }
-
         if ( fid >= 0 ) {
 
-            if ( ! take_down_cache(fid) ) {
+            if ( ! take_down_cache(fid, cache_ptr) ) {
 
                 nerrors++;
                 if ( verbose ) {
 		    HDfprintf(stdout, "%d:%s: take_down_cache() failed.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
         }
 
-        /* 7 */
-        if ( verbose ) {
-	    HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);
-        }
-
         /* verify that all instance of datum are back where the started
          * and are clean.
          */
@@ -6591,11 +6711,6 @@ smoke_check_5(int metadata_write_strategy)
             HDassert( ! (data[i].dirty) );
         }
 
-        /* 8 */
-        if ( verbose ) {
-	    HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);
-        }
-
         /* compose the done message */
         mssg.req       = DONE_REQ_CODE;
         mssg.src       = world_mpi_rank;
@@ -6616,15 +6731,10 @@ smoke_check_5(int metadata_write_strategy)
                 nerrors++;
                 if ( verbose ) {
                     HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
         }
-
-        /* 9 */
-        if ( verbose ) {
-	    HDfprintf(stderr, "%d: cp = %d\n", world_mpi_rank, cp++);
-        }
     }
 
     max_nerrors = get_max_nerrors();
@@ -6695,33 +6805,32 @@ trace_file_check(int metadata_write_strategy)
 
 #ifdef H5_METADATA_TRACE_FILE
 
-    const char * fcn_name = "trace_file_check()";
     const char *((* expected_output)[]) = NULL;
     const char * expected_output_0[] =
     {
       "### HDF5 metadata cache trace file version 1 ###\n",
       "H5AC_set_cache_auto_resize_config 1 0 1 0 \"t_cache_trace.txt\" 1 0 2097152 0.300000 33554432 1048576 50000 1 0.900000 2.000000 1 1.000000 0.250000 1 4194304 3 0.999000 0.900000 1 1048576 3 1 0.100000 262144 0 0\n",
-      "H5AC_insert_entry 0x200 25 0x0 2 0\n",
-      "H5AC_insert_entry 0x202 25 0x0 2 0\n",
-      "H5AC_insert_entry 0x204 25 0x0 4 0\n",
-      "H5AC_insert_entry 0x208 25 0x0 6 0\n",
-      "H5AC_protect 0x200 25 H5AC_WRITE 2 1\n",
-      "H5AC_mark_entry_dirty 0x200 0\n",
-      "H5AC_unprotect 0x200 25 0 0 0\n",
-      "H5AC_protect 0x202 25 H5AC_WRITE 2 1\n",
-      "H5AC_pin_protected_entry 0x202 0\n",
-      "H5AC_unprotect 0x202 25 0 0 0\n",
-      "H5AC_unpin_entry 0x202 0\n",
-      "H5AC_expunge_entry 0x202 25 0\n",
-      "H5AC_protect 0x204 25 H5AC_WRITE 4 1\n",
-      "H5AC_pin_protected_entry 0x204 0\n",
-      "H5AC_unprotect 0x204 25 0 0 0\n",
-      "H5AC_mark_entry_dirty 0x204 0 0 0\n",
-      "H5AC_resize_entry 0x204 2 0\n",
-      "H5AC_resize_entry 0x204 4 0\n",
-      "H5AC_unpin_entry 0x204 0\n",
-      "H5AC_move_entry 0x200 0x8c65 25 0\n",
-      "H5AC_move_entry 0x8c65 0x200 25 0\n",
+      "H5AC_insert_entry 0x400 27 0x0 2 0\n",
+      "H5AC_insert_entry 0x402 27 0x0 2 0\n",
+      "H5AC_insert_entry 0x404 27 0x0 4 0\n",
+      "H5AC_insert_entry 0x408 27 0x0 6 0\n",
+      "H5AC_protect 0x400 27 0x0 2 1\n",
+      "H5AC_mark_entry_dirty 0x400 0\n",
+      "H5AC_unprotect 0x400 27 0x0 0\n",
+      "H5AC_protect 0x402 27 0x0 2 1\n",
+      "H5AC_pin_protected_entry 0x402 0\n",
+      "H5AC_unprotect 0x402 27 0x0 0\n",
+      "H5AC_unpin_entry 0x402 0\n",
+      "H5AC_expunge_entry 0x402 27 0\n",
+      "H5AC_protect 0x404 27 0x0 4 1\n",
+      "H5AC_pin_protected_entry 0x404 0\n",
+      "H5AC_unprotect 0x404 27 0x0 0\n",
+      "H5AC_mark_entry_dirty 0x404 0\n",
+      "H5AC_resize_entry 0x404 2 0\n",
+      "H5AC_resize_entry 0x404 4 0\n",
+      "H5AC_unpin_entry 0x404 0\n",
+      "H5AC_move_entry 0x400 0x8e65 27 0\n",
+      "H5AC_move_entry 0x8e65 0x400 27 0\n",
       "H5AC_flush 0\n",
       NULL
     };
@@ -6729,27 +6838,27 @@ trace_file_check(int metadata_write_strategy)
     {
       "### HDF5 metadata cache trace file version 1 ###\n",
       "H5AC_set_cache_auto_resize_config 1 0 1 0 \"t_cache_trace.txt\" 1 0 2097152 0.300000 33554432 1048576 50000 1 0.900000 2.000000 1 1.000000 0.250000 1 4194304 3 0.999000 0.900000 1 1048576 3 1 0.100000 262144 1 0\n",
-      "H5AC_insert_entry 0x200 25 0x0 2 0\n",
-      "H5AC_insert_entry 0x202 25 0x0 2 0\n",
-      "H5AC_insert_entry 0x204 25 0x0 4 0\n",
-      "H5AC_insert_entry 0x208 25 0x0 6 0\n",
-      "H5AC_protect 0x200 25 H5AC_WRITE 2 1\n",
-      "H5AC_mark_entry_dirty 0x200 0\n",
-      "H5AC_unprotect 0x200 25 0 0 0\n",
-      "H5AC_protect 0x202 25 H5AC_WRITE 2 1\n",
-      "H5AC_pin_protected_entry 0x202 0\n",
-      "H5AC_unprotect 0x202 25 0 0 0\n",
-      "H5AC_unpin_entry 0x202 0\n",
-      "H5AC_expunge_entry 0x202 25 0\n",
-      "H5AC_protect 0x204 25 H5AC_WRITE 4 1\n",
-      "H5AC_pin_protected_entry 0x204 0\n",
-      "H5AC_unprotect 0x204 25 0 0 0\n",
-      "H5AC_mark_entry_dirty 0x204 0 0 0\n",
-      "H5AC_resize_pinned_entry 0x204 2 0\n",
-      "H5AC_resize_pinned_entry 0x204 4 0\n",
-      "H5AC_unpin_entry 0x204 0\n",
-      "H5AC_move_entry 0x200 0x8c65 25 0\n",
-      "H5AC_move_entry 0x8c65 0x200 25 0\n",
+      "H5AC_insert_entry 0x400 27 0x0 2 0\n",
+      "H5AC_insert_entry 0x402 27 0x0 2 0\n",
+      "H5AC_insert_entry 0x404 27 0x0 4 0\n",
+      "H5AC_insert_entry 0x408 27 0x0 6 0\n",
+      "H5AC_protect 0x400 27 0x0 2 1\n",
+      "H5AC_mark_entry_dirty 0x400 0\n",
+      "H5AC_unprotect 0x400 27 0x0 0\n",
+      "H5AC_protect 0x402 27 0x0 2 1\n",
+      "H5AC_pin_protected_entry 0x402 0\n",
+      "H5AC_unprotect 0x402 27 0x0 0\n",
+      "H5AC_unpin_entry 0x402 0\n",
+      "H5AC_expunge_entry 0x402 27 0\n",
+      "H5AC_protect 0x404 27 0x0 4 1\n",
+      "H5AC_pin_protected_entry 0x404 0\n",
+      "H5AC_unprotect 0x404 27 0x0 0\n",
+      "H5AC_mark_entry_dirty 0x404 0\n",
+      "H5AC_resize_entry 0x404 2 0\n",
+      "H5AC_resize_entry 0x404 4 0\n",
+      "H5AC_unpin_entry 0x404 0\n",
+      "H5AC_move_entry 0x400 0x8e65 27 0\n",
+      "H5AC_move_entry 0x8e65 0x400 27 0\n",
       "H5AC_flush 0\n",
       NULL
     };
@@ -6818,7 +6927,7 @@ trace_file_check(int metadata_write_strategy)
             nerrors++;
             if ( verbose ) {
 		HDfprintf(stdout, "%d:%s: server_main() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
@@ -6833,7 +6942,7 @@ trace_file_check(int metadata_write_strategy)
             cache_ptr = NULL;
             if ( verbose ) {
 		HDfprintf(stdout, "%d:%s: setup_cache_for_test() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
 
@@ -6847,7 +6956,7 @@ trace_file_check(int metadata_write_strategy)
 		nerrors++;
 	        HDfprintf(stdout,
                         "%d:%s: H5AC_get_cache_auto_resize_config() failed.\n",
-                        world_mpi_rank, fcn_name);
+                        world_mpi_rank, FUNC);
 
             } else {
 
@@ -6860,7 +6969,7 @@ trace_file_check(int metadata_write_strategy)
 		    nerrors++;
 	            HDfprintf(stdout,
                          "%d:%s: H5AC_set_cache_auto_resize_config() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
                 }
             }
         }
@@ -6896,7 +7005,7 @@ trace_file_check(int metadata_write_strategy)
             nerrors++;
             if ( verbose ) {
 	        HDfprintf(stdout, "%d:%s: H5Fflush() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
 
@@ -6910,7 +7019,7 @@ trace_file_check(int metadata_write_strategy)
 		nerrors++;
 	        HDfprintf(stdout,
                         "%d:%s: H5AC_get_cache_auto_resize_config() failed.\n",
-                        world_mpi_rank, fcn_name);
+                        world_mpi_rank, FUNC);
 
             } else {
 
@@ -6924,19 +7033,19 @@ trace_file_check(int metadata_write_strategy)
 		    nerrors++;
 	            HDfprintf(stdout,
                         "%d:%s: H5AC_set_cache_auto_resize_config() failed.\n",
-                        world_mpi_rank, fcn_name);
+                        world_mpi_rank, FUNC);
                 }
             }
         }
 
         if ( fid >= 0 ) {
 
-            if ( ! take_down_cache(fid) ) {
+            if ( ! take_down_cache(fid, cache_ptr) ) {
 
                 nerrors++;
                 if ( verbose ) {
 		    HDfprintf(stdout, "%d:%s: take_down_cache() failed.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
         }
@@ -6971,7 +7080,7 @@ trace_file_check(int metadata_write_strategy)
                 nerrors++;
                 if ( verbose ) {
                     HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
         }
@@ -6986,7 +7095,7 @@ trace_file_check(int metadata_write_strategy)
                 nerrors++;
                 if ( verbose ) {
                     HDfprintf(stdout, "%d:%s: HDfopen failed.\n",
-                              world_mpi_rank, fcn_name);
+                              world_mpi_rank, FUNC);
                 }
             }
 	}
@@ -7023,12 +7132,12 @@ trace_file_check(int metadata_write_strategy)
                 if ( verbose ) {
                     HDfprintf(stdout,
 			      "%d:%s: Unexpected data in trace file line %d.\n",
-                              world_mpi_rank, fcn_name, i);
+                              world_mpi_rank, FUNC, i);
 		    HDfprintf(stdout, "%d:%s: expected = \"%s\" %d\n",
-			       world_mpi_rank, fcn_name, (*expected_output)[i],
+			       world_mpi_rank, FUNC, (*expected_output)[i],
 			       expected_line_len);
 		    HDfprintf(stdout, "%d:%s: actual   = \"%s\" %d\n",
-			       world_mpi_rank, fcn_name, buffer,
+			       world_mpi_rank, FUNC, buffer,
 			       actual_line_len);
                 }
 	    } else {
@@ -7078,7 +7187,7 @@ trace_file_check(int metadata_write_strategy)
 
 } /* trace_file_check() */
 
-
+

 /*****************************************************************************
  *
  * Function:	main()
@@ -7091,16 +7200,10 @@ trace_file_check(int metadata_write_strategy)
  *
  * Programmer:	JRM -- 12/23/05
  *
- * Modifications:
- *
- *		None.
- *
  *****************************************************************************/
-
 int
 main(int argc, char **argv)
 {
-    const char * fcn_name = "main()";
     int express_test;
     unsigned u;
     int mpi_size;
@@ -7122,7 +7225,8 @@ main(int argc, char **argv)
      * calls.  By then, MPI calls may not work.
      */
     if (H5dont_atexit() < 0){
-	printf("Failed to turn off atexit processing. Continue.\n", mpi_rank);
+	printf("%d:Failed to turn off atexit processing. Continue.\n", 
+               mpi_rank);
     };
     H5open();
 
@@ -7178,7 +7282,7 @@ main(int argc, char **argv)
         nerrors++;
 	if ( verbose ) {
 	    HDfprintf(stdout, "%d:%s: H5Pcreate() failed 1.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
     }
 
@@ -7187,7 +7291,7 @@ main(int argc, char **argv)
         nerrors++;
         if ( verbose ) {
             HDfprintf(stdout, "%d:%s: H5Pset_fapl_mpio() failed 1.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
     }
 
@@ -7200,7 +7304,7 @@ main(int argc, char **argv)
             nerrors++;
             if ( verbose ) {
                 HDfprintf(stdout, "%d:%s: h5_fixname() failed.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
             break;
         }
@@ -7211,7 +7315,7 @@ main(int argc, char **argv)
         nerrors++;
 	if ( verbose ) {
 	    HDfprintf(stdout, "%d:%s: H5Pclose() failed.\n",
-                      world_mpi_rank, fcn_name);
+                      world_mpi_rank, FUNC);
         }
     }
 
@@ -7223,7 +7327,7 @@ main(int argc, char **argv)
 	    nerrors++;
 	    if ( verbose ) {
 	        HDfprintf(stdout, "%d:%s: H5Pcreate() failed 2.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
 
@@ -7232,7 +7336,7 @@ main(int argc, char **argv)
             nerrors++;
 	    if ( verbose ) {
 	        HDfprintf(stdout, "%d:%s: H5Pset_fapl_mpio() failed 2.\n",
-                          world_mpi_rank, fcn_name);
+                          world_mpi_rank, FUNC);
             }
         }
     }
diff --git a/testpar/t_chunk_alloc.c b/testpar/t_chunk_alloc.c
index c0eab29..05fd2fc 100644
--- a/testpar/t_chunk_alloc.c
+++ b/testpar/t_chunk_alloc.c
@@ -22,22 +22,22 @@
  */
 
 #include "testphdf5.h"
-static int  mpi_size, mpi_rank;
+static int	mpi_size, mpi_rank;
 
 #define DSET_NAME "ExtendibleArray"
-#define CHUNK_SIZE  1000    /* #elements per chunk */
-#define CHUNK_FACTOR  200     /* default dataset size in terms of chunks */
+#define CHUNK_SIZE	1000		/* #elements per chunk */
+#define CHUNK_FACTOR	200     /* default dataset size in terms of chunks */
 #define CLOSE           1
 #define NO_CLOSE        0
 
 static MPI_Offset
 get_filesize(const char *filename)
 {
-    int    mpierr;
-    MPI_File  fd;
-    MPI_Offset  filesize;
+    int		mpierr;
+    MPI_File	fd;
+    MPI_Offset	filesize;
 
-    mpierr = MPI_File_open(MPI_COMM_SELF, (char*)filename, MPI_MODE_RDONLY,
+    mpierr = MPI_File_open(MPI_COMM_SELF, filename, MPI_MODE_RDONLY,
 	MPI_INFO_NULL, &fd);
     VRFY((mpierr == MPI_SUCCESS), "");
 
@@ -87,44 +87,44 @@ create_chunked_dataset(const char *filename, int chunk_factor, write_type write_
     long         nchunks;
     herr_t       hrc;
 
-    MPI_Offset  filesize,      /* actual file size */
-    est_filesize;      /* estimated file size */
+    MPI_Offset  filesize,	    /* actual file size */
+		est_filesize;	    /* estimated file size */
 
     /* set up MPI parameters */
     MPI_Comm_size(MPI_COMM_WORLD,&mpi_size);
     MPI_Comm_rank(MPI_COMM_WORLD,&mpi_rank);
 
     /* Only MAINPROCESS should create the file.  Others just wait. */
-    if (MAINPROCESS) {
+    if (MAINPROCESS){
         nchunks=chunk_factor*mpi_size;
-        dims[0]=nchunks*CHUNK_SIZE;
-        /* Create the data space with unlimited dimensions. */
-        dataspace = H5Screate_simple (1, dims, maxdims);
-        VRFY((dataspace >= 0), "");
+	dims[0]=nchunks*CHUNK_SIZE;
+	/* Create the data space with unlimited dimensions. */
+	dataspace = H5Screate_simple (1, dims, maxdims);
+	VRFY((dataspace >= 0), "");
 
-        memspace = H5Screate_simple(1, chunk_dims, NULL);
-        VRFY((memspace >= 0), "");
+	memspace = H5Screate_simple(1, chunk_dims, NULL);
+	VRFY((memspace >= 0), "");
 
 	/* Create a new file. If file exists its contents will be overwritten. */
 	file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT,
-                            H5P_DEFAULT);
+		    H5P_DEFAULT);
 	VRFY((file_id >= 0), "H5Fcreate");
 
-        /* Modify dataset creation properties, i.e. enable chunking  */
-        cparms = H5Pcreate(H5P_DATASET_CREATE);
-        VRFY((cparms >= 0), "");
+	/* Modify dataset creation properties, i.e. enable chunking  */
+	cparms = H5Pcreate(H5P_DATASET_CREATE);
+	VRFY((cparms >= 0), "");
 
-        hrc = H5Pset_alloc_time(cparms, H5D_ALLOC_TIME_EARLY);
-        VRFY((hrc >= 0), "");
+	hrc = H5Pset_alloc_time(cparms, H5D_ALLOC_TIME_EARLY);
+	VRFY((hrc >= 0), "");
 
-        hrc = H5Pset_chunk(cparms, 1, chunk_dims);
-        VRFY((hrc >= 0), "");
+	hrc = H5Pset_chunk(cparms, 1, chunk_dims);
+	VRFY((hrc >= 0), "");
 
-        /* Create a new dataset within the file using cparms creation properties. */
-        dataset = H5Dcreate2(file_id, DSET_NAME, H5T_NATIVE_UCHAR, dataspace, H5P_DEFAULT, cparms, H5P_DEFAULT);
-        VRFY((dataset >= 0), "");
+	/* Create a new dataset within the file using cparms creation properties. */
+	dataset = H5Dcreate2(file_id, DSET_NAME, H5T_NATIVE_UCHAR, dataspace, H5P_DEFAULT, cparms, H5P_DEFAULT);
+	VRFY((dataset >= 0), "");
 
-        if(write_pattern == sec_last) {
+	if(write_pattern == sec_last) {
             HDmemset(buffer, 100, CHUNK_SIZE);
 
             count[0] = 1;
@@ -133,35 +133,35 @@ create_chunked_dataset(const char *filename, int chunk_factor, write_type write_
             offset[0] = (nchunks-2)*chunk_dims[0];
 
             hrc = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, offset, stride, count, block);
-            VRFY((hrc >= 0), "");
+                VRFY((hrc >= 0), "");
 
             /* Write sec_last chunk */
             hrc = H5Dwrite(dataset, H5T_NATIVE_UCHAR, memspace, dataspace, H5P_DEFAULT, buffer);
             VRFY((hrc >= 0), "H5Dwrite");
         } /* end if */
 
-        /* Close resources */
-        hrc = H5Dclose (dataset);
-        VRFY((hrc >= 0), "");
-        dataset = -1;
+	/* Close resources */
+	hrc = H5Dclose (dataset);
+	VRFY((hrc >= 0), "");
+	dataset = -1;
 
-        hrc = H5Sclose (dataspace);
-        VRFY((hrc >= 0), "");
+	hrc = H5Sclose (dataspace);
+	VRFY((hrc >= 0), "");
 
-        hrc = H5Sclose (memspace);
-        VRFY((hrc >= 0), "");
+	hrc = H5Sclose (memspace);
+	VRFY((hrc >= 0), "");
 
-        hrc = H5Pclose (cparms);
-        VRFY((hrc >= 0), "");
+	hrc = H5Pclose (cparms);
+	VRFY((hrc >= 0), "");
 
-        hrc = H5Fclose (file_id);
-        VRFY((hrc >= 0), "");
-        file_id = -1;
+	hrc = H5Fclose (file_id);
+	VRFY((hrc >= 0), "");
+	file_id = -1;
 
-        /* verify file size */
-        filesize = get_filesize(filename);
-        est_filesize = nchunks * CHUNK_SIZE * sizeof(unsigned char);
-        VRFY((filesize >= est_filesize), "file size check");
+	/* verify file size */
+	filesize = get_filesize(filename);
+	est_filesize = nchunks * CHUNK_SIZE * sizeof(unsigned char);
+	VRFY((filesize >= est_filesize), "file size check");
 
     }
 
@@ -202,8 +202,8 @@ parallel_access_dataset(const char *filename, int chunk_factor, access_type acti
     int         i;
     long        nchunks;
     /* MPI Gubbins */
-    MPI_Offset  filesize,      /* actual file size */
-    est_filesize;      /* estimated file size */
+    MPI_Offset  filesize,	    /* actual file size */
+		est_filesize;	    /* estimated file size */
 
     /* Initialize MPI */
     MPI_Comm_size(MPI_COMM_WORLD,&mpi_size);
@@ -243,19 +243,19 @@ parallel_access_dataset(const char *filename, int chunk_factor, access_type acti
         /* all chunks are written by all the processes in an interleaved way*/
         case write_all:
 
-      memset(buffer, mpi_rank+1, CHUNK_SIZE);
-      count[0] = 1;
-      stride[0] = 1;
-      block[0] = chunk_dims[0];
+	    memset(buffer, mpi_rank+1, CHUNK_SIZE);
+	    count[0] = 1;
+	    stride[0] = 1;
+	    block[0] = chunk_dims[0];
             for (i=0; i<nchunks/mpi_size; i++){
-        offset[0] = (i*mpi_size+mpi_rank)*chunk_dims[0];
+		    offset[0] = (i*mpi_size+mpi_rank)*chunk_dims[0];
 
-        hrc = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, offset, stride, count, block);
-        VRFY((hrc >= 0), "");
+		    hrc = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, offset, stride, count, block);
+		    VRFY((hrc >= 0), "");
 
-        /* Write the buffer out */
-        hrc = H5Dwrite(*dataset, H5T_NATIVE_UCHAR, memspace, dataspace, H5P_DEFAULT, buffer);
-        VRFY((hrc >= 0), "H5Dwrite");
+		    /* Write the buffer out */
+		    hrc = H5Dwrite(*dataset, H5T_NATIVE_UCHAR, memspace, dataspace, H5P_DEFAULT, buffer);
+		    VRFY((hrc >= 0), "H5Dwrite");
             }
 
             break;
@@ -275,8 +275,9 @@ parallel_access_dataset(const char *filename, int chunk_factor, access_type acti
 
         /* only opens the *dataset */
         case open_only:
-
             break;
+        default:
+            HDassert(0);
     }
 
     /* Close up */
@@ -319,7 +320,8 @@ parallel_access_dataset(const char *filename, int chunk_factor, access_type acti
  *    interleaved pattern.
  */
 static void
-verify_data(const char *filename, int chunk_factor, write_type write_pattern, int close, hid_t *file_id, hid_t *dataset)
+verify_data(const char *filename, int chunk_factor, write_type write_pattern, int vclose, 
+            hid_t *file_id, hid_t *dataset)
 {
     /* HDF5 gubbins */
     hid_t    dataspace, memspace;     /* HDF5 file identifier */
@@ -334,7 +336,7 @@ verify_data(const char *filename, int chunk_factor, write_type write_pattern, in
     /* Variables used in reading data back */
     char         buffer[CHUNK_SIZE];
     int         value, i;
-    int         index;
+    int         index_l;
     long        nchunks;
     /* Initialize MPI */
     MPI_Comm_size(MPI_COMM_WORLD,&mpi_size);
@@ -372,8 +374,8 @@ verify_data(const char *filename, int chunk_factor, write_type write_pattern, in
     stride[0] = 1;
     block[0] = chunk_dims[0];
     for (i=0; i<nchunks; i++){
-  /* reset buffer values */
-  memset(buffer, -1, CHUNK_SIZE);
+	/* reset buffer values */
+	memset(buffer, -1, CHUNK_SIZE);
 
         offset[0] = i*chunk_dims[0];
 
@@ -385,37 +387,40 @@ verify_data(const char *filename, int chunk_factor, write_type write_pattern, in
         VRFY((hrc >= 0), "H5Dread");
 
         /* set expected value according the write pattern */
-  switch (write_pattern) {
-      case all:
-    value = i%mpi_size + 1;
-    break;
-      case none:
-    value = 0;
-    break;
+	switch (write_pattern) {
+	    case all:
+		value = i%mpi_size + 1;
+		break;
+	    case none:
+		value = 0;
+		break;
             case sec_last:
-    if (i==nchunks-2)
-        value = 100;
-    else
-        value = 0;
-  }
+		if (i==nchunks-2)
+		    value = 100;
+		else
+		    value = 0;
+                break;
+            default:
+                HDassert(0);
+	}
 
         /* verify content of the chunk */
-        for (index = 0; index < CHUNK_SIZE; index++)
-            VRFY((buffer[index] == value), "data verification");
+        for (index_l = 0; index_l < CHUNK_SIZE; index_l++)
+            VRFY((buffer[index_l] == value), "data verification");
     }
 
     hrc = H5Sclose (dataspace);
-  VRFY((hrc >= 0), "");
+	VRFY((hrc >= 0), "");
 
-  hrc = H5Sclose (memspace);
-  VRFY((hrc >= 0), "");
+	hrc = H5Sclose (memspace);
+	VRFY((hrc >= 0), "");
 
     /* Can close some plists */
     hrc = H5Pclose(access_plist);
     VRFY((hrc >= 0), "");
 
     /* Close up */
-    if (close){
+    if (vclose){
         hrc = H5Dclose(*dataset);
         VRFY((hrc >= 0), "");
         *dataset = -1;
@@ -464,9 +469,9 @@ test_chunk_alloc(void)
     MPI_Comm_size(MPI_COMM_WORLD,&mpi_size);
     MPI_Comm_rank(MPI_COMM_WORLD,&mpi_rank);
 
-    filename = GetTestParameters();
+    filename = (const char*)GetTestParameters();
     if (VERBOSE_MED)
-  printf("Extend Chunked allocation test on file %s\n", filename);
+	printf("Extend Chunked allocation test on file %s\n", filename);
 
     /* Case 1 */
     /* Create chunked dataset without writing anything.*/
diff --git a/testpar/t_dset.c b/testpar/t_dset.c
index ae022fb..d7d27b6 100644
--- a/testpar/t_dset.c
+++ b/testpar/t_dset.c
@@ -2515,6 +2515,8 @@ compress_readAll(void)
     int rank=1;                 /* Dataspace rank */
     hsize_t dim=dim0;           /* Dataspace dimensions */
     unsigned u;                 /* Local index variable */
+    unsigned    chunk_opts;         /* Chunk options */
+    unsigned    disable_partial_chunk_filters; /* Whether filters are disabled on partial chunks */
     DATATYPE *data_read = NULL;	/* data buffer */
     DATATYPE *data_orig = NULL; /* expected data buffer */
     const char *filename;
@@ -2541,116 +2543,132 @@ compress_readAll(void)
     for(u=0; u<dim;u++)
         data_orig[u]=u;
 
-    /* Process zero creates the file with a compressed, chunked dataset */
-    if(mpi_rank==0) {
-        hsize_t chunk_dim;           /* Chunk dimensions */
-
-        /* Create the file */
-        fid = H5Fcreate(h5_rmprefix(filename), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-        VRFY((fid > 0), "H5Fcreate succeeded");
-
-        /* Create property list for chunking and compression */
-        dcpl = H5Pcreate(H5P_DATASET_CREATE);
-        VRFY((dcpl > 0), "H5Pcreate succeeded");
-
-        ret = H5Pset_layout(dcpl, H5D_CHUNKED);
-        VRFY((ret >= 0), "H5Pset_layout succeeded");
-
-        /* Use eight chunks */
-        chunk_dim = dim / 8;
-        ret = H5Pset_chunk(dcpl, rank, &chunk_dim);
-        VRFY((ret >= 0), "H5Pset_chunk succeeded");
+    /* Run test both with and without filters disabled on partial chunks */
+    for(disable_partial_chunk_filters = 0; disable_partial_chunk_filters <= 1;
+            disable_partial_chunk_filters++) {
+        /* Process zero creates the file with a compressed, chunked dataset */
+        if(mpi_rank==0) {
+            hsize_t chunk_dim;           /* Chunk dimensions */
+
+            /* Create the file */
+            fid = H5Fcreate(h5_rmprefix(filename), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+            VRFY((fid > 0), "H5Fcreate succeeded");
+
+            /* Create property list for chunking and compression */
+            dcpl = H5Pcreate(H5P_DATASET_CREATE);
+            VRFY((dcpl > 0), "H5Pcreate succeeded");
+
+            ret = H5Pset_layout(dcpl, H5D_CHUNKED);
+            VRFY((ret >= 0), "H5Pset_layout succeeded");
+
+            /* Use eight chunks */
+            chunk_dim = dim / 8;
+            ret = H5Pset_chunk(dcpl, rank, &chunk_dim);
+            VRFY((ret >= 0), "H5Pset_chunk succeeded");
+
+            /* Set chunk options appropriately */
+            if(disable_partial_chunk_filters) {
+                ret = H5Pget_chunk_opts(dcpl, &chunk_opts);
+                VRFY((ret>=0),"H5Pget_chunk_opts succeeded");
+
+                chunk_opts |= H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS;
+
+                ret = H5Pset_chunk_opts(dcpl, chunk_opts);
+                VRFY((ret>=0),"H5Pset_chunk_opts succeeded");
+            } /* end if */
+
+            ret = H5Pset_deflate(dcpl, 9);
+            VRFY((ret >= 0), "H5Pset_deflate succeeded");
+
+            /* Create dataspace */
+            dataspace = H5Screate_simple(rank, &dim, NULL);
+            VRFY((dataspace > 0), "H5Screate_simple succeeded");
+
+            /* Create dataset */
+            dataset = H5Dcreate2(fid, "compressed_data", H5T_NATIVE_INT, dataspace, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+            VRFY((dataset > 0), "H5Dcreate2 succeeded");
+
+            /* Write compressed data */
+            ret = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data_orig);
+            VRFY((ret >= 0), "H5Dwrite succeeded");
+
+            /* Close objects */
+            ret = H5Pclose(dcpl);
+            VRFY((ret >= 0), "H5Pclose succeeded");
+            ret = H5Sclose(dataspace);
+            VRFY((ret >= 0), "H5Sclose succeeded");
+            ret = H5Dclose(dataset);
+            VRFY((ret >= 0), "H5Dclose succeeded");
+            ret = H5Fclose(fid);
+            VRFY((ret >= 0), "H5Fclose succeeded");
+        }
 
-        ret = H5Pset_deflate(dcpl, 9);
-        VRFY((ret >= 0), "H5Pset_deflate succeeded");
+        /* Wait for file to be created */
+        MPI_Barrier(comm);
 
-        /* Create dataspace */
-        dataspace = H5Screate_simple(rank, &dim, NULL);
-        VRFY((dataspace > 0), "H5Screate_simple succeeded");
+        /* -------------------
+        * OPEN AN HDF5 FILE
+        * -------------------*/
 
-        /* Create dataset */
-        dataset = H5Dcreate2(fid, "compressed_data", H5T_NATIVE_INT, dataspace, H5P_DEFAULT, dcpl, H5P_DEFAULT);
-        VRFY((dataset > 0), "H5Dcreate2 succeeded");
+        /* setup file access template */
+        acc_tpl = create_faccess_plist(comm, info, facc_type);
+        VRFY((acc_tpl >= 0), "");
 
-        /* Write compressed data */
-        ret = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data_orig);
-        VRFY((ret >= 0), "H5Dwrite succeeded");
+        /* open the file collectively */
+        fid=H5Fopen(filename,H5F_ACC_RDWR,acc_tpl);
+        VRFY((fid > 0), "H5Fopen succeeded");
 
-        /* Close objects */
-        ret = H5Pclose(dcpl);
+        /* Release file-access template */
+        ret = H5Pclose(acc_tpl);
         VRFY((ret >= 0), "H5Pclose succeeded");
-        ret = H5Sclose(dataspace);
-        VRFY((ret >= 0), "H5Sclose succeeded");
-        ret = H5Dclose(dataset);
-        VRFY((ret >= 0), "H5Dclose succeeded");
-        ret = H5Fclose(fid);
-        VRFY((ret >= 0), "H5Fclose succeeded");
-    }
-
-    /* Wait for file to be created */
-    MPI_Barrier(comm);
-
-    /* -------------------
-     * OPEN AN HDF5 FILE
-     * -------------------*/
-
-    /* setup file access template */
-    acc_tpl = create_faccess_plist(comm, info, facc_type);
-    VRFY((acc_tpl >= 0), "");
-
-    /* open the file collectively */
-    fid=H5Fopen(filename,H5F_ACC_RDWR,acc_tpl);
-    VRFY((fid > 0), "H5Fopen succeeded");
-
-    /* Release file-access template */
-    ret = H5Pclose(acc_tpl);
-    VRFY((ret >= 0), "H5Pclose succeeded");
 
 
-    /* Open dataset with compressed chunks */
-    dataset = H5Dopen2(fid, "compressed_data", H5P_DEFAULT);
-    VRFY((dataset > 0), "H5Dopen2 succeeded");
+        /* Open dataset with compressed chunks */
+        dataset = H5Dopen2(fid, "compressed_data", H5P_DEFAULT);
+        VRFY((dataset >= 0), "H5Dopen2 succeeded");
 
-    /* Try reading & writing data */
-    if(dataset>0) {
-        /* Create dataset transfer property list */
-        xfer_plist = H5Pcreate(H5P_DATASET_XFER);
-        VRFY((xfer_plist > 0), "H5Pcreate succeeded");
+        /* Try reading & writing data */
+        if(dataset>=0) {
+            /* Create dataset transfer property list */
+            xfer_plist = H5Pcreate(H5P_DATASET_XFER);
+            VRFY((xfer_plist > 0), "H5Pcreate succeeded");
 
-        ret = H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
-        VRFY((ret >= 0), "H5Pset_dxpl_mpio succeeded");
-        if(dxfer_coll_type == DXFER_INDEPENDENT_IO) {
-          ret = H5Pset_dxpl_mpio_collective_opt(xfer_plist,H5FD_MPIO_INDIVIDUAL_IO);
-          VRFY((ret>= 0),"set independent IO collectively succeeded");
-        }
+            ret = H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE);
+            VRFY((ret >= 0), "H5Pset_dxpl_mpio succeeded");
+            if(dxfer_coll_type == DXFER_INDEPENDENT_IO) {
+            ret = H5Pset_dxpl_mpio_collective_opt(xfer_plist,H5FD_MPIO_INDIVIDUAL_IO);
+            VRFY((ret>= 0),"set independent IO collectively succeeded");
+            }
 
 
-        /* Try reading the data */
-        ret = H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, xfer_plist, data_read);
-        VRFY((ret >= 0), "H5Pset_dxpl_mpio succeeded");
+            /* Try reading the data */
+            ret = H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, xfer_plist, data_read);
+            VRFY((ret >= 0), "H5Pset_dxpl_mpio succeeded");
 
-        /* Verify data read */
-        for(u=0; u<dim; u++)
-            if(data_orig[u]!=data_read[u]) {
-                printf("Line #%d: written!=retrieved: data_orig[%u]=%d, data_read[%u]=%d\n",__LINE__,
-                    (unsigned)u,data_orig[u],(unsigned)u,data_read[u]);
-                nerrors++;
-            }
+            /* Verify data read */
+            for(u=0; u<dim; u++)
+                if(data_orig[u]!=data_read[u]) {
+                    printf("Line #%d: written!=retrieved: data_orig[%u]=%d, data_read[%u]=%d\n",__LINE__,
+                        (unsigned)u,data_orig[u],(unsigned)u,data_read[u]);
+                    nerrors++;
+                }
 
-        /* Writing to the compressed, chunked dataset in parallel should fail */
-        H5E_BEGIN_TRY {
-            ret = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, xfer_plist, data_read);
-        } H5E_END_TRY;
-        VRFY((ret < 0), "H5Dwrite failed");
+            /* Writing to the compressed, chunked dataset in parallel should fail */
+            H5E_BEGIN_TRY {
+                ret = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, xfer_plist, data_read);
+            } H5E_END_TRY;
+            VRFY((ret < 0), "H5Dwrite failed");
 
-        ret = H5Pclose(xfer_plist);
-        VRFY((ret >= 0), "H5Pclose succeeded");
-        ret = H5Dclose(dataset);
-        VRFY((ret >= 0), "H5Dclose succeeded");
-    } /* end if */
+            ret = H5Pclose(xfer_plist);
+            VRFY((ret >= 0), "H5Pclose succeeded");
+            ret = H5Dclose(dataset);
+            VRFY((ret >= 0), "H5Dclose succeeded");
+        } /* end if */
 
-    ret = H5Fclose(fid);
-    VRFY((ret >= 0), "H5Fclose succeeded");
+        /* Close file */
+        ret = H5Fclose(fid);
+        VRFY((ret >= 0), "H5Fclose succeeded");
+    } /* end for */
 
     /* release data buffers */
     if(data_read) HDfree(data_read);
@@ -4134,16 +4152,20 @@ dataset_atomicity(void)
     MPI_Barrier (comm);
 
     /* make sure setting atomicity fails on a serial file ID */
-    /* open the file collectively */
-    fid=H5Fopen(filename,H5F_ACC_RDWR,H5P_DEFAULT);
-    VRFY((fid >= 0), "H5Fopen succeeed");
+    /* file locking allows only one file open (serial) for writing */
+    if(MAINPROCESS){
+	fid=H5Fopen(filename,H5F_ACC_RDWR,H5P_DEFAULT);
+	VRFY((fid >= 0), "H5Fopen succeeed");
+    }
 
     /* should fail */
     ret = H5Fset_mpi_atomicity (fid , TRUE);
     VRFY((ret == FAIL), "H5Fset_mpi_atomicity failed");
 
-    ret = H5Fclose(fid);
-    VRFY((ret >= 0), "H5Fclose succeeded");
+    if(MAINPROCESS){
+	ret = H5Fclose(fid);
+	VRFY((ret >= 0), "H5Fclose succeeded");
+    }
 
     MPI_Barrier (comm);
 
diff --git a/testpar/t_file_image.c b/testpar/t_file_image.c
index a2246b6..96e65d5 100644
--- a/testpar/t_file_image.c
+++ b/testpar/t_file_image.c
@@ -240,10 +240,10 @@ file_image_daisy_chain_test(void)
             if(vector_ptr[i] != i)
                 vector_ok = FALSE;
         VRFY((vector_ok), "verified received vector.");
- 
-        HDfree(vector_ptr);
-        vector_ptr = NULL;
 
+    HDfree(vector_ptr);
+    vector_ptr = NULL;
+ 
 	/* 7) closes the core file and exit. */
 
         err = H5Sclose(space_id);
diff --git a/testpar/t_filter_read.c b/testpar/t_filter_read.c
index 5e1cd04..14f37be 100644
--- a/testpar/t_filter_read.c
+++ b/testpar/t_filter_read.c
@@ -213,6 +213,8 @@ test_filter_read(void)
     hid_t	dc;                 /* HDF5 IDs */
     const hsize_t chunk_size[2] = {CHUNK_DIM1, CHUNK_DIM2};  /* Chunk dimensions */
     hsize_t     null_size;          /* Size of dataset without filters */
+    unsigned    chunk_opts;         /* Chunk options */
+    unsigned    disable_partial_chunk_filters; /* Whether filters are disabled on partial chunks */
     herr_t      hrc;
     const char *filename;
     hsize_t     fletcher32_size;       /* Size of dataset with Fletcher32 checksum */
@@ -254,81 +256,111 @@ test_filter_read(void)
     hrc = H5Pclose (dc);
     VRFY(hrc>=0,"H5Pclose");
 
-    /*----------------------------------------------------------
-     * STEP 1: Test Fletcher32 Checksum by itself.
-     *----------------------------------------------------------
-     */
-
-    dc = H5Pcreate(H5P_DATASET_CREATE);
-    VRFY(dc>=0,"H5Pset_filter");
+    /* Run steps 1-3 both with and without filters disabled on partial chunks */
+    for(disable_partial_chunk_filters = 0; disable_partial_chunk_filters <= 1;
+            disable_partial_chunk_filters++) {
+        /* Set chunk options appropriately */
+        dc = H5Pcreate(H5P_DATASET_CREATE);
+        VRFY(dc>=0,"H5Pcreate");
 
-    hrc = H5Pset_chunk (dc, 2, chunk_size);
-    VRFY(hrc>=0,"H5Pset_filter");
+        hrc = H5Pset_chunk (dc, 2, chunk_size);
+        VRFY(hrc>=0,"H5Pset_filter");
 
-    hrc = H5Pset_filter (dc,H5Z_FILTER_FLETCHER32,0,0,NULL);
-    VRFY(hrc>=0,"H5Pset_filter");
+        hrc = H5Pget_chunk_opts(dc, &chunk_opts);
+        VRFY(hrc>=0,"H5Pget_chunk_opts");
 
-    filter_read_internal(filename,dc,&fletcher32_size);
-    VRFY(fletcher32_size > null_size,"Size after checksumming is incorrect.");
+        if(disable_partial_chunk_filters)
+            chunk_opts |= H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS;
 
-    /* Clean up objects used for this test */
-    hrc = H5Pclose (dc);
-    VRFY(hrc>=0, "H5Pclose");
+        hrc = H5Pclose (dc);
+        VRFY(hrc>=0,"H5Pclose");
 
+        /*----------------------------------------------------------
+        * STEP 1: Test Fletcher32 Checksum by itself.
+        *----------------------------------------------------------
+        */
+#ifdef H5_HAVE_FILTER_FLETCHER32
 
-    /*----------------------------------------------------------
-     * STEP 2: Test deflation by itself.
-     *----------------------------------------------------------
-     */
-#ifdef H5_HAVE_FILTER_DEFLATE
+        dc = H5Pcreate(H5P_DATASET_CREATE);
+        VRFY(dc>=0,"H5Pset_filter");
 
-    dc = H5Pcreate(H5P_DATASET_CREATE);
-    VRFY(dc>=0, "H5Pcreate");
+        hrc = H5Pset_chunk (dc, 2, chunk_size);
+        VRFY(hrc>=0,"H5Pset_filter");
 
-    hrc = H5Pset_chunk (dc, 2, chunk_size);
-    VRFY(hrc>=0, "H5Pset_chunk");
+        hrc = H5Pset_chunk_opts (dc, chunk_opts);
+        VRFY(hrc>=0,"H5Pset_chunk_opts");
 
-    hrc = H5Pset_deflate (dc, 6);
-    VRFY(hrc>=0, "H5Pset_deflate");
+        hrc = H5Pset_filter (dc,H5Z_FILTER_FLETCHER32,0,0,NULL);
+        VRFY(hrc>=0,"H5Pset_filter");
 
-    filter_read_internal(filename,dc,&deflate_size);
+        filter_read_internal(filename,dc,&fletcher32_size);
+        VRFY(fletcher32_size > null_size,"Size after checksumming is incorrect.");
 
-    /* Clean up objects used for this test */
-    hrc = H5Pclose (dc);
-    VRFY(hrc>=0, "H5Pclose");
+        /* Clean up objects used for this test */
+        hrc = H5Pclose (dc);
+        VRFY(hrc>=0, "H5Pclose");
 
-#endif /* H5_HAVE_FILTER_DEFLATE */
+#endif /* H5_HAVE_FILTER_FLETCHER32 */
 
+        /*----------------------------------------------------------
+        * STEP 2: Test deflation by itself.
+        *----------------------------------------------------------
+        */
+#ifdef H5_HAVE_FILTER_DEFLATE
 
-    /*----------------------------------------------------------
-     * STEP 3: Test szip compression by itself.
-     *----------------------------------------------------------
-     */
-#ifdef H5_HAVE_FILTER_SZIP
-    if(h5_szip_can_encode() == 1) {
         dc = H5Pcreate(H5P_DATASET_CREATE);
         VRFY(dc>=0, "H5Pcreate");
 
         hrc = H5Pset_chunk (dc, 2, chunk_size);
         VRFY(hrc>=0, "H5Pset_chunk");
 
-	hrc = H5Pset_szip(dc, szip_options_mask, szip_pixels_per_block);
-        VRFY(hrc>=0, "H5Pset_szip");
+        hrc = H5Pset_chunk_opts (dc, chunk_opts);
+        VRFY(hrc>=0,"H5Pset_chunk_opts");
 
-	filter_read_internal(filename,dc,&szip_size);
+        hrc = H5Pset_deflate (dc, 6);
+        VRFY(hrc>=0, "H5Pset_deflate");
+
+        filter_read_internal(filename,dc,&deflate_size);
 
         /* Clean up objects used for this test */
         hrc = H5Pclose (dc);
         VRFY(hrc>=0, "H5Pclose");
-    }
+
+#endif /* H5_HAVE_FILTER_DEFLATE */
+
+        /*----------------------------------------------------------
+        * STEP 3: Test szip compression by itself.
+        *----------------------------------------------------------
+        */
+#ifdef H5_HAVE_FILTER_SZIP
+        if(h5_szip_can_encode() == 1) {
+            dc = H5Pcreate(H5P_DATASET_CREATE);
+            VRFY(dc>=0, "H5Pcreate");
+
+            hrc = H5Pset_chunk (dc, 2, chunk_size);
+            VRFY(hrc>=0, "H5Pset_chunk");
+
+            hrc = H5Pset_chunk_opts (dc, chunk_opts);
+            VRFY(hrc>=0,"H5Pset_chunk_opts");
+
+            hrc = H5Pset_szip(dc, szip_options_mask, szip_pixels_per_block);
+            VRFY(hrc>=0, "H5Pset_szip");
+
+            filter_read_internal(filename,dc,&szip_size);
+
+            /* Clean up objects used for this test */
+            hrc = H5Pclose (dc);
+            VRFY(hrc>=0, "H5Pclose");
+        }
 #endif /* H5_HAVE_FILTER_SZIP */
+    } /* end for */
 
 
     /*----------------------------------------------------------
      * STEP 4: Test shuffling by itself.
      *----------------------------------------------------------
      */
-
+#ifdef H5_HAVE_FILTER_SHUFFLE
     dc = H5Pcreate(H5P_DATASET_CREATE);
     VRFY(dc>=0, "H5Pcreate");
 
@@ -345,12 +377,13 @@ test_filter_read(void)
     hrc = H5Pclose (dc);
     VRFY(hrc>=0, "H5Pclose");
 
+#endif /* H5_HAVE_FILTER_SHUFFLE */
 
     /*----------------------------------------------------------
      * STEP 5: Test shuffle + deflate + checksum in any order.
      *----------------------------------------------------------
      */
-#ifdef H5_HAVE_FILTER_DEFLATE
+#if defined H5_HAVE_FILTER_DEFLATE && defined H5_HAVE_FILTER_SHUFFLE && defined H5_HAVE_FILTER_FLETCHER32
     /* Testing shuffle+deflate+checksum filters (checksum first) */
     dc = H5Pcreate(H5P_DATASET_CREATE);
     VRFY(dc>=0, "H5Pcreate");
@@ -395,13 +428,13 @@ test_filter_read(void)
     hrc = H5Pclose (dc);
     VRFY(hrc>=0, "H5Pclose");
 
-#endif /* H5_HAVE_FILTER_DEFLATE */
+#endif /* H5_HAVE_FILTER_DEFLATE && H5_HAVE_FILTER_SHUFFLE && H5_HAVE_FILTER_FLETCHER32 */
 
     /*----------------------------------------------------------
      * STEP 6: Test shuffle + szip + checksum in any order.
      *----------------------------------------------------------
      */
-#ifdef H5_HAVE_FILTER_SZIP
+#if defined H5_HAVE_FILTER_SZIP && defined H5_HAVE_FILTER_SHUFFLE && defined H5_HAVE_FILTER_FLETCHER32
 
     /* Testing shuffle+szip(with encoder)+checksum filters(checksum first) */
     dc = H5Pcreate(H5P_DATASET_CREATE);
@@ -453,6 +486,6 @@ test_filter_read(void)
         VRFY(hrc>=0, "H5Pclose");
     }
 
-#endif /* H5_HAVE_FILTER_SZIP */
+#endif /* H5_HAVE_FILTER_SZIP && H5_HAVE_FILTER_SHUFFLE && H5_HAVE_FILTER_FLETCHER32 */
 }
 
diff --git a/testpar/t_mpi.c b/testpar/t_mpi.c
index 7bd2f58..c234257 100644
--- a/testpar/t_mpi.c
+++ b/testpar/t_mpi.c
@@ -281,7 +281,7 @@ test_mpio_gb_file(char *filename)
 	printf("Skipped GB file range test "
 		"because MPI_Offset cannot support it\n");
     }else{
-	buf = HDmalloc(MB);
+	buf = (char *)HDmalloc(MB);
 	VRFY((buf!=NULL), "malloc succeed");
 
 	/* open a new file. Remove it first in case it exists. */
@@ -626,7 +626,7 @@ Test Whether the Displacement of MPI derived datatype
 and this platform.
 
 1. Details for the test:
-1) Create two derived datatypes with MPI_Type_hindexed:
+1) Create two derived datatypes with MPI_Type_create_hindexed:
         datatype1:
 	count = 1, blocklens = 1, offsets = 0,
 	base type = MPI_BYTE(essentially a char)
@@ -635,7 +635,7 @@ and this platform.
 	base type = MPI_BYTE
 
 2) Using these two derived datatypes,
-   Build another derived datatype with MPI_Type_struct:
+   Build another derived datatype with MPI_Type_create_struct:
         advtype: derived from datatype1 and datatype2
         advtype:
 	count = 2, blocklens[0] = 1, blocklens[1]=1,
@@ -678,10 +678,9 @@ static int test_mpio_derived_dtype(char *filename) {
     int  mpi_err_strlen;
     int  mpi_err;
     int  i;
-    int  nerrors = 0;		/* number of errors */
     MPI_Datatype  etype,filetype;
     MPI_Datatype  adv_filetype,bas_filetype[2];
-    MPI_Datatype  etypenew, filetypenew;
+    MPI_Datatype  filetypenew;
     MPI_Offset    disp;
     MPI_Status    Status;
     MPI_Aint      adv_disp[2];
@@ -717,7 +716,7 @@ static int test_mpio_derived_dtype(char *filename) {
     blocklens[0] = 1;
     offsets[0]   = 0;
 
-    if((mpi_err= MPI_Type_hindexed(count,blocklens,offsets,MPI_BYTE,&filetype))
+    if((mpi_err= MPI_Type_create_hindexed(count,blocklens,offsets,MPI_BYTE,&filetype))
        != MPI_SUCCESS){
       	MPI_Error_string(mpi_err, mpi_err_str, &mpi_err_strlen);
 	printf("MPI_Type_contiguous failed (%s)\n", mpi_err_str);
@@ -733,7 +732,7 @@ static int test_mpio_derived_dtype(char *filename) {
     count = 1;
     blocklens[0]=1;
     offsets[0] = 1;
-    if((mpi_err= MPI_Type_hindexed(count,blocklens,offsets,MPI_BYTE,&filetypenew))
+    if((mpi_err= MPI_Type_create_hindexed(count,blocklens,offsets,MPI_BYTE,&filetypenew))
        != MPI_SUCCESS){
       	MPI_Error_string(mpi_err, mpi_err_str, &mpi_err_strlen);
 	printf("MPI_Type_contiguous failed (%s)\n", mpi_err_str);
@@ -754,10 +753,10 @@ static int test_mpio_derived_dtype(char *filename) {
     bas_filetype[0]  = filetype;
     bas_filetype[1]  = filetypenew;
 
-    if((mpi_err= MPI_Type_struct(outcount,adv_blocklens,adv_disp,bas_filetype,&adv_filetype))
+    if((mpi_err= MPI_Type_create_struct(outcount,adv_blocklens,adv_disp,bas_filetype,&adv_filetype))
        != MPI_SUCCESS){
       	MPI_Error_string(mpi_err, mpi_err_str, &mpi_err_strlen);
-	printf("MPI_Type_struct failed (%s)\n", mpi_err_str);
+	printf("MPI_Type_create_struct failed (%s)\n", mpi_err_str);
 	return 1;
     }
     if((mpi_err=MPI_Type_commit(&adv_filetype))!=MPI_SUCCESS){
@@ -844,7 +843,7 @@ has no contribution to IO. To properly test this case, at least FOUR
 processes are needed.
 
 1. Details for the test:
-1) Create one derived datatype with MPI_Type_hindexed:
+1) Create one derived datatype with MPI_Type_create_hindexed:
 
 2) Choosing at least two processes to contribute none for IO with
    the buf size inside MPI_Write_at_all to 0.
@@ -900,7 +899,7 @@ test_mpio_special_collective(char *filename)
     offsets[1] = (mpi_size+mpi_rank)*count;
 
     if(count !=0) {
-        if((mpi_err = MPI_Type_hindexed(2,
+        if((mpi_err = MPI_Type_create_hindexed(2,
                                         blocklens,
                                         offsets,
                                         etype,
@@ -916,7 +915,7 @@ test_mpio_special_collective(char *filename)
             return 1;
         } /* end if */
 
-        if((mpi_err = MPI_Type_hindexed(2,
+        if((mpi_err = MPI_Type_create_hindexed(2,
                                         blocklens,
                                         offsets,
                                         etype,
@@ -1100,7 +1099,7 @@ main(int argc, char **argv)
      * calls.  By then, MPI calls may not work.
      */
     if (H5dont_atexit() < 0){
-	printf("Failed to turn off atexit processing. Continue.\n", mpi_rank);
+	printf("Failed to turn off atexit processing. Continue.\n");
     };
     H5open();
     if (parse_options(argc, argv) != 0){
@@ -1236,7 +1235,7 @@ finish:
     /* turn off alarm */
     ALARM_OFF;
 
-    h5_cleanup(FILENAME, fapl);
+    h5_clean_files(FILENAME, fapl);
     H5close();
 
     /* MPI_Finalize must be called AFTER H5close which may use MPI calls */
diff --git a/testpar/t_pflush2.c b/testpar/t_pflush2.c
index 3b46afd..f9f8459 100644
--- a/testpar/t_pflush2.c
+++ b/testpar/t_pflush2.c
@@ -137,9 +137,7 @@ error:
 int
 main(int argc, char* argv[])
 {
-    hid_t fapl1, fapl2;
     H5E_auto2_t func;
-
     char	name[1024];
     const char *envval = NULL;
 
@@ -151,13 +149,6 @@ main(int argc, char* argv[])
     MPI_Comm_size(comm, &mpi_size);
     MPI_Comm_rank(comm, &mpi_rank);
 
-    fapl1 = H5Pcreate(H5P_FILE_ACCESS);
-    H5Pset_fapl_mpio(fapl1, comm, info);
-
-    fapl2 = H5Pcreate(H5P_FILE_ACCESS);
-    H5Pset_fapl_mpio(fapl2, comm, info);
-
-
     if(mpi_rank == 0)
 	TESTING("H5Fflush (part2 with flush)");
 
@@ -166,6 +157,14 @@ main(int argc, char* argv[])
     if (envval == NULL)
         envval = "nomatch";
     if (HDstrcmp(envval, "core") && HDstrcmp(envval, "split")) {
+        hid_t fapl1, fapl2;
+
+        fapl1 = H5Pcreate(H5P_FILE_ACCESS);
+        H5Pset_fapl_mpio(fapl1, comm, info);
+
+        fapl2 = H5Pcreate(H5P_FILE_ACCESS);
+        H5Pset_fapl_mpio(fapl2, comm, info);
+
 	/* Check the case where the file was flushed */
 	h5_fixname(FILENAME[0], fapl1, name, sizeof name);
 	if(check_file(name, fapl1))
@@ -201,8 +200,8 @@ main(int argc, char* argv[])
 	H5Eset_auto2(H5E_DEFAULT, func, NULL);
 
 
-	h5_cleanup(&FILENAME[0], fapl1);
-	h5_cleanup(&FILENAME[1], fapl2);
+	h5_clean_files(&FILENAME[0], fapl1);
+	h5_clean_files(&FILENAME[1], fapl2);
     }
     else
     {
@@ -217,6 +216,3 @@ main(int argc, char* argv[])
         return 1;
 }
 
-
-
-
diff --git a/testpar/t_prop.c b/testpar/t_prop.c
new file mode 100644
index 0000000..2cc0f5e
--- /dev/null
+++ b/testpar/t_prop.c
@@ -0,0 +1,462 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Parallel tests for encoding/decoding plists sent between processes
+ */
+
+#include "testphdf5.h"
+#include "H5ACprivate.h"
+#include "H5Pprivate.h"
+
+static int
+test_encode_decode(hid_t orig_pl, int mpi_rank, int recv_proc)
+{
+    MPI_Request req[2];
+    MPI_Status status;
+    hid_t pl;                   /* Decoded property list */
+    size_t buf_size = 0;
+    void *sbuf = NULL;
+    herr_t ret;         	/* Generic return value */
+
+    if(mpi_rank == 0) {
+        int send_size = 0;
+
+        /* first call to encode returns only the size of the buffer needed */
+        ret = H5Pencode(orig_pl, NULL, &buf_size);
+        VRFY((ret >= 0), "H5Pencode succeeded");
+
+        sbuf = (uint8_t *)HDmalloc(buf_size);
+
+        ret = H5Pencode(orig_pl, sbuf, &buf_size);
+        VRFY((ret >= 0), "H5Pencode succeeded");
+
+        /* this is a temp fix to send this size_t */
+        send_size = (int)buf_size;
+
+        MPI_Isend(&send_size, 1, MPI_INT, recv_proc, 123, MPI_COMM_WORLD, &req[0]);
+        MPI_Isend(sbuf, send_size, MPI_BYTE, recv_proc, 124, MPI_COMM_WORLD, &req[1]);
+    } /* end if */
+
+    if(mpi_rank == recv_proc) {
+        int recv_size;
+        void *rbuf;
+
+        MPI_Recv(&recv_size, 1, MPI_INT, 0, 123, MPI_COMM_WORLD, &status);
+        buf_size = recv_size;
+        rbuf = (uint8_t *)HDmalloc(buf_size);
+        MPI_Recv(rbuf, recv_size, MPI_BYTE, 0, 124, MPI_COMM_WORLD, &status);
+
+        pl = H5Pdecode(rbuf);
+        VRFY((pl >= 0), "H5Pdecode succeeded");
+
+        VRFY(H5Pequal(orig_pl, pl), "Property List Equal Succeeded");
+
+        ret = H5Pclose(pl);
+        VRFY((ret >= 0), "H5Pclose succeeded");
+
+        if(NULL != rbuf)
+            HDfree(rbuf);
+    } /* end if */
+
+    if(0 == mpi_rank)
+        MPI_Waitall(2, req, MPI_STATUSES_IGNORE);
+
+    if(NULL != sbuf)
+        HDfree(sbuf);
+
+    MPI_Barrier(MPI_COMM_WORLD);
+    return(0);
+}
+
+void
+test_plist_ed(void)
+{
+    hid_t dcpl;	       	/* dataset create prop. list */
+    hid_t dapl;	       	/* dataset access prop. list */
+    hid_t dxpl;	       	/* dataset transfer prop. list */
+    hid_t gcpl;	       	/* group create prop. list */
+    hid_t lcpl;	       	/* link create prop. list */
+    hid_t lapl;	       	/* link access prop. list */
+    hid_t ocpypl;	/* object copy prop. list */
+    hid_t ocpl;	        /* object create prop. list */
+    hid_t fapl;	       	/* file access prop. list */
+    hid_t fcpl;	       	/* file create prop. list */
+    hid_t strcpl;	/* string create prop. list */
+    hid_t acpl;	       	/* attribute create prop. list */
+
+    int mpi_size, mpi_rank, recv_proc;
+
+    hsize_t chunk_size = 16384;	/* chunk size */ 
+    double fill = 2.7f;         /* Fill value */
+    size_t nslots = 521*2;
+    size_t nbytes = 1048576 * 10;
+    double w0 = 0.5f;
+    unsigned max_compact;
+    unsigned min_dense;
+    hsize_t max_size[1]; /*data space maximum size */
+    const char* c_to_f = "x+32";
+    H5AC_cache_config_t my_cache_config = {
+        H5AC__CURR_CACHE_CONFIG_VERSION,
+        TRUE,
+        FALSE,
+        FALSE,
+        "temp",
+        TRUE,
+        FALSE,
+        ( 2 * 2048 * 1024),
+        0.3f,
+        (64 * 1024 * 1024),
+        (4 * 1024 * 1024),
+        60000,
+        H5C_incr__threshold,
+        0.8f,
+        3.0f,
+        TRUE,
+        (8 * 1024 * 1024),
+        H5C_flash_incr__add_space,
+        2.0f,
+        0.25f,
+        H5C_decr__age_out_with_threshold,
+        0.997f,
+        0.8f,
+        TRUE,
+        (3 * 1024 * 1024),
+        3,
+        FALSE,
+        0.2f,
+        (256 * 2048),
+        H5AC__DEFAULT_METADATA_WRITE_STRATEGY};
+
+    herr_t ret;         	/* Generic return value */
+
+    if(VERBOSE_MED)
+	printf("Encode/Decode DCPLs\n");
+
+    /* set up MPI parameters */
+    MPI_Comm_size(MPI_COMM_WORLD, &mpi_size);
+    MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
+
+    if(mpi_size == 1)
+        recv_proc = 0;
+    else
+        recv_proc = 1;
+
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+    VRFY((dcpl >= 0), "H5Pcreate succeeded");
+
+    ret = H5Pset_chunk(dcpl, 1, &chunk_size);
+    VRFY((ret >= 0), "H5Pset_chunk succeeded");
+
+    ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_LATE);
+    VRFY((ret >= 0), "H5Pset_alloc_time succeeded");
+
+    ret = H5Pset_fill_value(dcpl, H5T_NATIVE_DOUBLE, &fill);
+    VRFY((ret>=0), "set fill-value succeeded");
+
+    max_size[0] = 100;
+    ret = H5Pset_external(dcpl, "ext1.data", (off_t)0, 
+                          (hsize_t)(max_size[0] * sizeof(int)/4));
+    VRFY((ret>=0), "set external succeeded");
+    ret = H5Pset_external(dcpl, "ext2.data", (off_t)0, 
+                          (hsize_t)(max_size[0] * sizeof(int)/4));
+    VRFY((ret>=0), "set external succeeded");
+    ret = H5Pset_external(dcpl, "ext3.data", (off_t)0, 
+                          (hsize_t)(max_size[0] * sizeof(int)/4));
+    VRFY((ret>=0), "set external succeeded");
+    ret = H5Pset_external(dcpl, "ext4.data", (off_t)0, 
+                          (hsize_t)(max_size[0] * sizeof(int)/4));
+    VRFY((ret>=0), "set external succeeded");
+
+    ret = test_encode_decode(dcpl, mpi_rank, recv_proc);
+    VRFY((ret >= 0), "test_encode_decode succeeded");
+
+    ret = H5Pclose(dcpl);
+    VRFY((ret >= 0), "H5Pclose succeeded");
+
+
+    /******* ENCODE/DECODE DAPLS *****/
+    dapl = H5Pcreate(H5P_DATASET_ACCESS);
+    VRFY((dapl >= 0), "H5Pcreate succeeded");
+
+    ret = H5Pset_chunk_cache(dapl, nslots, nbytes, w0);
+    VRFY((ret >= 0), "H5Pset_chunk_cache succeeded");
+
+    ret = test_encode_decode(dapl, mpi_rank, recv_proc);
+    VRFY((ret >= 0), "test_encode_decode succeeded");
+
+    ret = H5Pclose(dapl);
+    VRFY((ret >= 0), "H5Pclose succeeded");
+
+
+    /******* ENCODE/DECODE OCPLS *****/
+    ocpl = H5Pcreate(H5P_OBJECT_CREATE);
+    VRFY((ocpl >= 0), "H5Pcreate succeeded");
+
+    ret = H5Pset_attr_creation_order(ocpl, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED));
+    VRFY((ret >= 0), "H5Pset_attr_creation_order succeeded");
+
+    ret = H5Pset_attr_phase_change(ocpl, 110, 105);
+    VRFY((ret >= 0), "H5Pset_attr_phase_change succeeded");
+
+    ret = H5Pset_filter(ocpl, H5Z_FILTER_FLETCHER32, 0, (size_t)0, NULL);
+    VRFY((ret >= 0), "H5Pset_filter succeeded");
+
+    ret = test_encode_decode(ocpl, mpi_rank, recv_proc);
+    VRFY((ret >= 0), "test_encode_decode succeeded");
+
+    ret = H5Pclose(ocpl);
+    VRFY((ret >= 0), "H5Pclose succeeded");
+
+
+    /******* ENCODE/DECODE DXPLS *****/
+    dxpl = H5Pcreate(H5P_DATASET_XFER);
+    VRFY((dxpl >= 0), "H5Pcreate succeeded");
+
+    ret = H5Pset_btree_ratios(dxpl, 0.2f, 0.6f, 0.2f);
+    VRFY((ret >= 0), "H5Pset_btree_ratios succeeded");
+
+    ret = H5Pset_hyper_vector_size(dxpl, 5);
+    VRFY((ret >= 0), "H5Pset_hyper_vector_size succeeded");
+
+    ret = H5Pset_dxpl_mpio(dxpl, H5FD_MPIO_COLLECTIVE);
+    VRFY((ret >= 0), "H5Pset_dxpl_mpio succeeded");
+
+    ret = H5Pset_dxpl_mpio_collective_opt(dxpl, H5FD_MPIO_INDIVIDUAL_IO);
+    VRFY((ret >= 0), "H5Pset_dxpl_mpio_collective_opt succeeded");
+
+    ret = H5Pset_dxpl_mpio_chunk_opt(dxpl, H5FD_MPIO_CHUNK_MULTI_IO);
+    VRFY((ret >= 0), "H5Pset_dxpl_mpio_chunk_opt succeeded");
+
+    ret = H5Pset_dxpl_mpio_chunk_opt_ratio(dxpl, 30);
+    VRFY((ret >= 0), "H5Pset_dxpl_mpio_chunk_opt_ratio succeeded");
+
+    ret = H5Pset_dxpl_mpio_chunk_opt_num(dxpl, 40);
+    VRFY((ret >= 0), "H5Pset_dxpl_mpio_chunk_opt_num succeeded");
+
+    ret = H5Pset_edc_check(dxpl, H5Z_DISABLE_EDC);
+    VRFY((ret >= 0), "H5Pset_edc_check succeeded");
+
+    ret = H5Pset_data_transform(dxpl, c_to_f);
+    VRFY((ret >= 0), "H5Pset_data_transform succeeded");
+
+    ret = test_encode_decode(dxpl, mpi_rank, recv_proc);
+    VRFY((ret >= 0), "test_encode_decode succeeded");
+
+    ret = H5Pclose(dxpl);
+    VRFY((ret >= 0), "H5Pclose succeeded");
+
+
+    /******* ENCODE/DECODE GCPLS *****/
+    gcpl = H5Pcreate(H5P_GROUP_CREATE);
+    VRFY((gcpl >= 0), "H5Pcreate succeeded");
+
+    ret = H5Pset_local_heap_size_hint(gcpl, 256);
+    VRFY((ret >= 0), "H5Pset_local_heap_size_hint succeeded");
+
+    ret = H5Pset_link_phase_change(gcpl, 2, 2);
+    VRFY((ret >= 0), "H5Pset_link_phase_change succeeded");
+
+    /* Query the group creation properties */
+    ret = H5Pget_link_phase_change(gcpl, &max_compact, &min_dense);
+    VRFY((ret >= 0), "H5Pget_est_link_info succeeded");
+
+    ret = H5Pset_est_link_info(gcpl, 3, 9);
+    VRFY((ret >= 0), "H5Pset_est_link_info succeeded");
+
+    ret = H5Pset_link_creation_order(gcpl, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED));
+    VRFY((ret >= 0), "H5Pset_link_creation_order succeeded");
+
+    ret = test_encode_decode(gcpl, mpi_rank, recv_proc);
+    VRFY((ret >= 0), "test_encode_decode succeeded");
+
+    ret = H5Pclose(gcpl);
+    VRFY((ret >= 0), "H5Pclose succeeded");
+
+
+    /******* ENCODE/DECODE LCPLS *****/
+    lcpl = H5Pcreate(H5P_LINK_CREATE);
+    VRFY((lcpl >= 0), "H5Pcreate succeeded");
+
+    ret= H5Pset_create_intermediate_group(lcpl, TRUE);
+    VRFY((ret >= 0), "H5Pset_create_intermediate_group succeeded");
+
+    ret = test_encode_decode(lcpl, mpi_rank, recv_proc);
+    VRFY((ret >= 0), "test_encode_decode succeeded");
+
+    ret = H5Pclose(lcpl);
+    VRFY((ret >= 0), "H5Pclose succeeded");
+
+
+    /******* ENCODE/DECODE LAPLS *****/
+    lapl = H5Pcreate(H5P_LINK_ACCESS);
+    VRFY((lapl >= 0), "H5Pcreate succeeded");
+
+    ret = H5Pset_nlinks(lapl, (size_t)134);
+    VRFY((ret >= 0), "H5Pset_nlinks succeeded");
+
+    ret = H5Pset_elink_acc_flags(lapl, H5F_ACC_RDONLY);
+    VRFY((ret >= 0), "H5Pset_elink_acc_flags succeeded");
+
+    ret = H5Pset_elink_prefix(lapl, "/tmpasodiasod");
+    VRFY((ret >= 0), "H5Pset_nlinks succeeded");
+
+    /* Create FAPL for the elink FAPL */
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+    VRFY((fapl >= 0), "H5Pcreate succeeded");
+    ret = H5Pset_alignment(fapl, 2, 1024);
+    VRFY((ret >= 0), "H5Pset_alignment succeeded");
+
+    ret = H5Pset_elink_fapl(lapl, fapl);
+    VRFY((ret >= 0), "H5Pset_elink_fapl succeeded");
+
+    /* Close the elink's FAPL */
+    ret = H5Pclose(fapl);
+    VRFY((ret >= 0), "H5Pclose succeeded");
+
+    ret = test_encode_decode(lapl, mpi_rank, recv_proc);
+    VRFY((ret >= 0), "test_encode_decode succeeded");
+
+    ret = H5Pclose(lapl);
+    VRFY((ret >= 0), "H5Pclose succeeded");
+
+
+    /******* ENCODE/DECODE OCPYPLS *****/
+    ocpypl = H5Pcreate(H5P_OBJECT_COPY);
+    VRFY((ocpypl >= 0), "H5Pcreate succeeded");
+
+    ret = H5Pset_copy_object(ocpypl, H5O_COPY_EXPAND_EXT_LINK_FLAG);
+    VRFY((ret >= 0), "H5Pset_copy_object succeeded");
+
+    ret = H5Padd_merge_committed_dtype_path(ocpypl, "foo");
+    VRFY((ret >= 0), "H5Padd_merge_committed_dtype_path succeeded");
+
+    ret = H5Padd_merge_committed_dtype_path(ocpypl, "bar");
+    VRFY((ret >= 0), "H5Padd_merge_committed_dtype_path succeeded");
+
+    ret = test_encode_decode(ocpypl, mpi_rank, recv_proc);
+    VRFY((ret >= 0), "test_encode_decode succeeded");
+
+    ret = H5Pclose(ocpypl);
+    VRFY((ret >= 0), "H5Pclose succeeded");
+
+
+    /******* ENCODE/DECODE FAPLS *****/
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+    VRFY((fapl >= 0), "H5Pcreate succeeded");
+
+    ret = H5Pset_family_offset(fapl, 1024);
+    VRFY((ret >= 0), "H5Pset_family_offset succeeded");
+
+    ret = H5Pset_meta_block_size(fapl, 2098452);
+    VRFY((ret >= 0), "H5Pset_meta_block_size succeeded");
+
+    ret = H5Pset_sieve_buf_size(fapl, 1048576);
+    VRFY((ret >= 0), "H5Pset_sieve_buf_size succeeded");
+
+    ret = H5Pset_alignment(fapl, 2, 1024);
+    VRFY((ret >= 0), "H5Pset_alignment succeeded");
+
+    ret = H5Pset_cache(fapl, 1024, 128, 10485760, 0.3f);
+    VRFY((ret >= 0), "H5Pset_cache succeeded");
+
+    ret = H5Pset_elink_file_cache_size(fapl, 10485760);
+    VRFY((ret >= 0), "H5Pset_elink_file_cache_size succeeded");
+
+    ret = H5Pset_gc_references(fapl, 1);
+    VRFY((ret >= 0), "H5Pset_gc_references succeeded");
+
+    ret = H5Pset_small_data_block_size(fapl, 2048);
+    VRFY((ret >= 0), "H5Pset_small_data_block_size succeeded");
+
+    ret = H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
+    VRFY((ret >= 0), "H5Pset_libver_bounds succeeded");
+
+    ret = H5Pset_fclose_degree(fapl, H5F_CLOSE_WEAK);
+    VRFY((ret >= 0), "H5Pset_fclose_degree succeeded");
+
+    ret = H5Pset_multi_type(fapl, H5FD_MEM_GHEAP);
+    VRFY((ret >= 0), "H5Pset_multi_type succeeded");
+
+    ret = H5Pset_mdc_config(fapl, &my_cache_config);
+    VRFY((ret >= 0), "H5Pset_mdc_config succeeded");
+
+    ret = test_encode_decode(fapl, mpi_rank, recv_proc);
+    VRFY((ret >= 0), "test_encode_decode succeeded");
+
+    ret = H5Pclose(fapl);
+    VRFY((ret >= 0), "H5Pclose succeeded");
+
+
+    /******* ENCODE/DECODE FCPLS *****/
+    fcpl = H5Pcreate(H5P_FILE_CREATE);
+    VRFY((fcpl >= 0), "H5Pcreate succeeded");
+
+    ret = H5Pset_userblock(fcpl, 1024);
+    VRFY((ret >= 0), "H5Pset_userblock succeeded");
+
+    ret = H5Pset_istore_k(fcpl, 3);
+    VRFY((ret >= 0), "H5Pset_istore_k succeeded");
+
+    ret = H5Pset_sym_k(fcpl, 4, 5);
+    VRFY((ret >= 0), "H5Pset_sym_k succeeded");
+
+    ret = H5Pset_shared_mesg_nindexes(fcpl, 8);
+    VRFY((ret >= 0), "H5Pset_shared_mesg_nindexes succeeded");
+
+    ret = H5Pset_shared_mesg_index(fcpl, 1,  H5O_SHMESG_SDSPACE_FLAG, 32);
+    VRFY((ret >= 0), "H5Pset_shared_mesg_index succeeded");
+
+    ret = H5Pset_shared_mesg_phase_change(fcpl, 60, 20);
+    VRFY((ret >= 0), "H5Pset_shared_mesg_phase_change succeeded");
+
+    ret = H5Pset_sizes(fcpl, 8, 4);
+    VRFY((ret >= 0), "H5Pset_sizes succeeded");
+
+    ret = test_encode_decode(fcpl, mpi_rank, recv_proc);
+    VRFY((ret >= 0), "test_encode_decode succeeded");
+
+    ret = H5Pclose(fcpl);
+    VRFY((ret >= 0), "H5Pclose succeeded");
+
+
+    /******* ENCODE/DECODE STRCPLS *****/
+    strcpl = H5Pcreate(H5P_STRING_CREATE);
+    VRFY((strcpl >= 0), "H5Pcreate succeeded");
+
+    ret = H5Pset_char_encoding(strcpl, H5T_CSET_UTF8);
+    VRFY((ret >= 0), "H5Pset_char_encoding succeeded");
+
+    ret = test_encode_decode(strcpl, mpi_rank, recv_proc);
+    VRFY((ret >= 0), "test_encode_decode succeeded");
+
+    ret = H5Pclose(strcpl);
+    VRFY((ret >= 0), "H5Pclose succeeded");
+
+
+    /******* ENCODE/DECODE ACPLS *****/
+    acpl = H5Pcreate(H5P_ATTRIBUTE_CREATE);
+    VRFY((acpl >= 0), "H5Pcreate succeeded");
+
+    ret = H5Pset_char_encoding(acpl, H5T_CSET_UTF8);
+    VRFY((ret >= 0), "H5Pset_char_encoding succeeded");
+
+    ret = test_encode_decode(acpl, mpi_rank, recv_proc);
+    VRFY((ret >= 0), "test_encode_decode succeeded");
+
+    ret = H5Pclose(acpl);
+    VRFY((ret >= 0), "H5Pclose succeeded");
+}
+
diff --git a/testpar/t_shapesame.c b/testpar/t_shapesame.c
index 9088470..8722ee2 100644
--- a/testpar/t_shapesame.c
+++ b/testpar/t_shapesame.c
@@ -18,7 +18,7 @@
    same shape by H5Sselect_shape_same().
  */
 
-#define H5S_PACKAGE             /*suppress error about including H5Spkg   */
+#define H5S_FRIEND             /*suppress error about including H5Spkg   */
 
 /* Define this macro to indicate that the testing APIs should be available */
 #define H5S_TESTING
@@ -5123,7 +5123,7 @@ int main(int argc, char **argv)
         TestSummary();
 
     /* Clean up test files */
-    h5_cleanup(FILENAME, fapl);
+    h5_clean_files(FILENAME, fapl);
 
     nerrors += GetTestNumErrs();
 
@@ -5148,3 +5148,4 @@ int main(int argc, char **argv)
     /* cannot just return (nerrors) because exit code is limited to 1byte */
     return(nerrors!=0);
 }
+
diff --git a/testpar/testphdf5.c b/testpar/testphdf5.c
index 7992e80..f1ec507 100644
--- a/testpar/testphdf5.c
+++ b/testpar/testphdf5.c
@@ -370,7 +370,7 @@ int main(int argc, char **argv)
     AddTest("selnone", none_selection_chunk, NULL,
             "chunked dataset with none-selection", PARATESTFILE);
     AddTest("calloc", test_chunk_alloc, NULL,
-	    "parallel extend Chunked allocation on serial file", PARATESTFILE);
+            "parallel extend Chunked allocation on serial file", PARATESTFILE);
     AddTest("fltread", test_filter_read, NULL,
 	    "parallel read of dataset written serially with filters", PARATESTFILE);
 
@@ -507,6 +507,9 @@ int main(int argc, char **argv)
             "test cause for broken collective io",
             PARATESTFILE);
 
+    AddTest("edpl", test_plist_ed, NULL,
+	    "encode/decode Property Lists", NULL);
+
     if((mpi_size < 2) && MAINPROCESS) {
         printf("File Image Ops daisy chain test needs at least 2 processes.\n");
         printf("File Image Ops daisy chain test will be skipped \n");
@@ -560,7 +563,7 @@ int main(int argc, char **argv)
         TestSummary();
 
     /* Clean up test files */
-    h5_cleanup(FILENAME, fapl);
+    h5_clean_files(FILENAME, fapl);
 
     nerrors += GetTestNumErrs();
 
diff --git a/testpar/testphdf5.h b/testpar/testphdf5.h
index efd3424..3597b17 100644
--- a/testpar/testphdf5.h
+++ b/testpar/testphdf5.h
@@ -236,6 +236,7 @@ extern int facc_type;				/*Test file access type */
 extern int dxfer_coll_type;
 
 /* Test program prototypes */
+void test_plist_ed(void);
 void zero_dim_dset(void);
 void multiple_dset_write(void);
 void multiple_group_write(void);
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 095cc30..bffc14d 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -24,7 +24,6 @@ include $(top_srcdir)/config/commence.am
 CONFIG=ordered
 
 # All subdirectories
-SUBDIRS=lib h5diff h5ls h5dump misc h5import h5repack h5jam h5copy h5stat \
-    perform
+SUBDIRS=lib h5diff h5ls h5dump misc h5import h5repack h5jam h5copy h5stat h5format_convert perform
 
 include $(top_srcdir)/config/conclude.am
diff --git a/tools/Makefile.in b/tools/Makefile.in
index 974e6b4..7d93525 100644
--- a/tools/Makefile.in
+++ b/tools/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -31,7 +31,17 @@
 # Tools HDF5 Makefile(.in)
 #
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -94,19 +104,20 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(top_srcdir)/bin/test-driver COPYING
 TESTS =
 subdir = tools
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 AM_V_P = $(am__v_P_ at AM_V@)
@@ -363,6 +374,9 @@ am__set_b = \
       b='$*';; \
   esac
 DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am COPYING
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 am__relativize = \
   dir0=`pwd`; \
@@ -404,7 +418,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -449,14 +462,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -466,13 +487,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -514,9 +534,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -657,9 +688,7 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2
 CONFIG = ordered
 
 # All subdirectories
-SUBDIRS = lib h5diff h5ls h5dump misc h5import h5repack h5jam h5copy h5stat \
-    perform
-
+SUBDIRS = lib h5diff h5ls h5dump misc h5import h5repack h5jam h5copy h5stat h5format_convert perform
 
 # Automake needs to be taught how to build lib, progs, and tests targets.
 # These will be filled in automatically for the most part (e.g.,
@@ -696,7 +725,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign tools/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -705,7 +733,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -851,7 +879,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1143,6 +1171,8 @@ uninstall-am:
 	mostlyclean-libtool mostlyclean-local pdf pdf-am ps ps-am \
 	recheck tags tags-am uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/tools/h5copy/Makefile.in b/tools/h5copy/Makefile.in
index e128cfe..a1d6395 100644
--- a/tools/h5copy/Makefile.in
+++ b/tools/h5copy/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -32,7 +32,17 @@
 #
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -95,22 +105,22 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/testh5copy.sh.in $(top_srcdir)/bin/depcomp \
-	$(top_srcdir)/bin/test-driver
 bin_PROGRAMS = h5copy$(EXEEXT)
 check_PROGRAMS = $(am__EXEEXT_1)
 TESTS = $(am__EXEEXT_1) $(TEST_SCRIPT)
 subdir = tools/h5copy
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES = testh5copy.sh
 CONFIG_CLEAN_VPATH_FILES =
 am__installdirs = "$(DESTDIR)$(bindir)"
@@ -143,7 +153,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -393,6 +403,10 @@ am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
 TEST_LOGS = $(am__test_logs2:.sh.log=.log)
 SH_LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
 SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/testh5copy.sh.in \
+	$(top_srcdir)/bin/depcomp $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -412,7 +426,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -457,14 +470,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -474,13 +495,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -522,9 +542,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -716,7 +747,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/h5copy/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign tools/h5copy/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -725,7 +755,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -922,7 +952,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1205,6 +1235,8 @@ uninstall-am: uninstall-binPROGRAMS
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am \
 	uninstall-binPROGRAMS
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/tools/h5copy/h5copy.c b/tools/h5copy/h5copy.c
index b5965ba..278cd3e 100644
--- a/tools/h5copy/h5copy.c
+++ b/tools/h5copy/h5copy.c
@@ -475,7 +475,7 @@ main (int argc, const char *argv[])
 
     /* free link info path */
     if (linkinfo.trg_path)
-        HDfree((char*)linkinfo.trg_path);
+        HDfree(linkinfo.trg_path);
 
     /* close propertis */
     if(H5Pclose(ocpl_id)<0)
@@ -496,7 +496,7 @@ error:
 
     /* free link info path */
     if (linkinfo.trg_path)
-        HDfree((char*)linkinfo.trg_path);
+        HDfree(linkinfo.trg_path);
 
  H5E_BEGIN_TRY {
     H5Pclose(ocpl_id);
diff --git a/tools/h5copy/h5copygentest.c b/tools/h5copy/h5copygentest.c
index 49204f5..45d4e16 100644
--- a/tools/h5copy/h5copygentest.c
+++ b/tools/h5copy/h5copygentest.c
@@ -22,6 +22,7 @@
 
 /* HDF file names */
 #define HDF_FILE1                "h5copytst.h5"
+#define HDF_FILE1_NEW            "h5copytst_new.h5"
 #define HDF_FILE2                "h5copy_ref.h5"
 #define HDF_EXT_SRC_FILE         "h5copy_extlinks_src.h5"
 #define HDF_EXT_TRG_FILE         "h5copy_extlinks_trg.h5"
@@ -644,20 +645,41 @@ out:
  *------------------------------------------------------------------------*/
 static void Test_Obj_Copy(void)
 {
-    hid_t fid=0;
+    hid_t fid = (-1);		/* File id */
+    hid_t fapl_new = (-1);	/* File access property id */
+    unsigned new_format;		/* New format or old format */
 
-    /* Create source file */
-    fid = H5Fcreate(HDF_FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
-    if (fid < 0)
-    {
-        fprintf(stderr, "Error: %s> H5Fcreate failed.\n", HDF_FILE1);
+    if((fapl_new = H5Pcreate(H5P_FILE_ACCESS)) < 0) {
+        fprintf(stderr, "Error: H5Pcreate failed.\n");
         goto out;
     }
+    if(H5Pset_libver_bounds(fapl_new, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0) {
+        fprintf(stderr, "Error: H5Pset_libver_bounds failed.\n");
+        goto out;
+    }
+
+    /* Test with old & new format groups */
+    for(new_format = FALSE; new_format <= TRUE; new_format++) {
+    
+        /* Set the FAPL for the type of format */
+        /* Create source file */
+        if(new_format)
+	    fid = H5Fcreate(HDF_FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_new);
+	else
+	    fid = H5Fcreate(HDF_FILE1_NEW, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+        if(fid < 0) {
+            fprintf(stderr, "Error: H5Fcreate failed.\n");
+            goto out;
+        }
+
+        gent_datasets(fid);
+        gent_empty_group(fid);
+        gent_nested_datasets(fid);
+        gent_nested_group(fid);
 
-    gent_datasets(fid);
-    gent_empty_group(fid);
-    gent_nested_datasets(fid);
-    gent_nested_group(fid);
+        H5Fclose(fid);
+        fid = (-1);
+    } /* end for */
 
 out:
     /*-----------------------------------------------------------------------
@@ -665,6 +687,8 @@ out:
     *------------------------------------------------------------------------*/
     if(fid > 0)
         H5Fclose(fid);
+    if(fapl_new > 0)
+        H5Pclose(fapl_new);
 }
 
 /*-------------------------------------------------------------------------
diff --git a/tools/h5copy/testfiles/h5copytst.h5 b/tools/h5copy/testfiles/h5copytst.h5
index f407f82..0f10410 100644
Binary files a/tools/h5copy/testfiles/h5copytst.h5 and b/tools/h5copy/testfiles/h5copytst.h5 differ
diff --git a/tools/h5copy/testfiles/h5copytst_new.h5 b/tools/h5copy/testfiles/h5copytst_new.h5
new file mode 100644
index 0000000..57e1805
Binary files /dev/null and b/tools/h5copy/testfiles/h5copytst_new.h5 differ
diff --git a/tools/h5copy/testfiles/h5copytst_new.out.ls b/tools/h5copy/testfiles/h5copytst_new.out.ls
new file mode 100644
index 0000000..9df6b2e
--- /dev/null
+++ b/tools/h5copy/testfiles/h5copytst_new.out.ls
@@ -0,0 +1,502 @@
+#############################
+Expected output for 'h5ls ../testfiles/h5copytst_new.out.h5'
+#############################
+Opened "../testfiles/h5copytst_new.out.h5" with sec2 driver.
+/                        Group
+    Location:  1:96
+    Links:     1
+/A                       Group
+    Location:  1:65602
+    Links:     1
+/A/B1                    Group
+    Location:  1:66306
+    Links:     1
+/A/B1/simple             Dataset {6/6}
+    Location:  1:65509
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/A/B2                    Group
+    Location:  1:69807
+    Links:     1
+/A/B2/simple2            Dataset {6/6}
+    Location:  1:69714
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/C                       Group
+    Location:  1:72980
+    Links:     1
+/C/D                     Group
+    Location:  1:73684
+    Links:     1
+/C/D/simple              Dataset {6/6}
+    Location:  1:72887
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/E                       Group
+    Location:  1:76217
+    Links:     1
+/E/F                     Group
+    Location:  1:76921
+    Links:     1
+/E/F/grp_dsets           Group
+    Location:  1:75044
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+/E/F/grp_dsets/chunk     Dataset {6/6}
+    Location:  1:76014
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Chunks:    {2} 8 bytes
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/E/F/grp_dsets/compact   Dataset {6/6}
+    Location:  1:75367
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/E/F/grp_dsets/compound  Dataset {2/2}
+    Location:  1:75470
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      struct {
+                   "str1"             +0    20-byte null-terminated ASCII string
+                   "str2"             +20   20-byte null-terminated ASCII string
+               } 40 bytes
+/E/F/grp_dsets/compressed Dataset {6/6}
+    Location:  1:75683
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Chunks:    {2} 8 bytes
+    Storage:   <details removed for portability>
+    Filter-0:  deflate-1 OPT {1}
+    Type:      32-bit little-endian integer
+/E/F/grp_dsets/named_vl  Dataset {2/2}
+    Location:  1:75853
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      shared-1:75793 variable length of
+                   32-bit little-endian integer
+/E/F/grp_dsets/nested_vl Dataset {2/2}
+    Location:  1:76108
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      variable length of
+                   variable length of
+                       32-bit little-endian integer
+/E/F/grp_dsets/simple    Dataset {6/6}
+    Location:  1:75274
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/E/F/grp_dsets/vl        Type
+    Location:  1:75793
+    Links:     2
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Type:      shared-1:75793 variable length of
+                   32-bit little-endian integer
+/G                       Group
+    Location:  1:85688
+    Links:     1
+/G/H                     Group
+    Location:  1:86392
+    Links:     1
+/G/H/grp_nested          Group
+    Location:  1:84436
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+/G/H/grp_nested/grp_dsets Group
+    Location:  1:84515
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+/G/H/grp_nested/grp_dsets/chunk Dataset {6/6}
+    Location:  1:85485
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Chunks:    {2} 8 bytes
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/G/H/grp_nested/grp_dsets/compact Dataset {6/6}
+    Location:  1:84838
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/G/H/grp_nested/grp_dsets/compound Dataset {2/2}
+    Location:  1:84941
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      struct {
+                   "str1"             +0    20-byte null-terminated ASCII string
+                   "str2"             +20   20-byte null-terminated ASCII string
+               } 40 bytes
+/G/H/grp_nested/grp_dsets/compressed Dataset {6/6}
+    Location:  1:85154
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Chunks:    {2} 8 bytes
+    Storage:   <details removed for portability>
+    Filter-0:  deflate-1 OPT {1}
+    Type:      32-bit little-endian integer
+/G/H/grp_nested/grp_dsets/named_vl Dataset {2/2}
+    Location:  1:85324
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      shared-1:85264 variable length of
+                   32-bit little-endian integer
+/G/H/grp_nested/grp_dsets/nested_vl Dataset {2/2}
+    Location:  1:85579
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      variable length of
+                   variable length of
+                       32-bit little-endian integer
+/G/H/grp_nested/grp_dsets/simple Dataset {6/6}
+    Location:  1:84745
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/G/H/grp_nested/grp_dsets/vl Type
+    Location:  1:85264
+    Links:     2
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Type:      shared-1:85264 variable length of
+                   32-bit little-endian integer
+/chunk                   Dataset {6/6}
+    Location:  1:2238
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Chunks:    {2} 8 bytes
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/compact                 Dataset {6/6}
+    Location:  1:4240
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/compound                Dataset {2/2}
+    Location:  1:6391
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      struct {
+                   "str1"             +0    20-byte null-terminated ASCII string
+                   "str2"             +20   20-byte null-terminated ASCII string
+               } 40 bytes
+/compressed              Dataset {6/6}
+    Location:  1:6604
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Chunks:    {2} 8 bytes
+    Storage:   <details removed for portability>
+    Filter-0:  deflate-1 OPT {1}
+    Type:      32-bit little-endian integer
+/grp_dsets               Group
+    Location:  1:27748
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+/grp_dsets/chunk         Dataset {6/6}
+    Location:  1:28718
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Chunks:    {2} 8 bytes
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_dsets/compact       Dataset {6/6}
+    Location:  1:28071
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_dsets/compound      Dataset {2/2}
+    Location:  1:28174
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      struct {
+                   "str1"             +0    20-byte null-terminated ASCII string
+                   "str2"             +20   20-byte null-terminated ASCII string
+               } 40 bytes
+/grp_dsets/compressed    Dataset {6/6}
+    Location:  1:28387
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Chunks:    {2} 8 bytes
+    Storage:   <details removed for portability>
+    Filter-0:  deflate-1 OPT {1}
+    Type:      32-bit little-endian integer
+/grp_dsets/named_vl      Dataset {2/2}
+    Location:  1:28557
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      shared-1:28497 variable length of
+                   32-bit little-endian integer
+/grp_dsets/nested_vl     Dataset {2/2}
+    Location:  1:28812
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      variable length of
+                   variable length of
+                       32-bit little-endian integer
+/grp_dsets/simple        Dataset {6/6}
+    Location:  1:27978
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_dsets/simple_group  Dataset {6/6}
+    Location:  1:46180
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_dsets/vl            Type
+    Location:  1:28497
+    Links:     2
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Type:      shared-1:28497 variable length of
+                   32-bit little-endian integer
+/grp_empty               Group
+    Location:  1:27693
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+/grp_nested              Group
+    Location:  1:35940
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+/grp_nested/grp_dsets    Group
+    Location:  1:36019
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+/grp_nested/grp_dsets/chunk Dataset {6/6}
+    Location:  1:36989
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Chunks:    {2} 8 bytes
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_nested/grp_dsets/compact Dataset {6/6}
+    Location:  1:36342
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_nested/grp_dsets/compound Dataset {2/2}
+    Location:  1:36445
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      struct {
+                   "str1"             +0    20-byte null-terminated ASCII string
+                   "str2"             +20   20-byte null-terminated ASCII string
+               } 40 bytes
+/grp_nested/grp_dsets/compressed Dataset {6/6}
+    Location:  1:36658
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Chunks:    {2} 8 bytes
+    Storage:   <details removed for portability>
+    Filter-0:  deflate-1 OPT {1}
+    Type:      32-bit little-endian integer
+/grp_nested/grp_dsets/named_vl Dataset {2/2}
+    Location:  1:36828
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      shared-1:36768 variable length of
+                   32-bit little-endian integer
+/grp_nested/grp_dsets/nested_vl Dataset {2/2}
+    Location:  1:37083
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      variable length of
+                   variable length of
+                       32-bit little-endian integer
+/grp_nested/grp_dsets/simple Dataset {6/6}
+    Location:  1:36249
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_nested/grp_dsets/vl Type
+    Location:  1:36768
+    Links:     2
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Type:      shared-1:36768 variable length of
+                   32-bit little-endian integer
+/grp_rename              Group
+    Location:  1:47077
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+/grp_rename/chunk        Dataset {6/6}
+    Location:  1:48047
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Chunks:    {2} 8 bytes
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_rename/compact      Dataset {6/6}
+    Location:  1:47400
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_rename/compound     Dataset {2/2}
+    Location:  1:47503
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      struct {
+                   "str1"             +0    20-byte null-terminated ASCII string
+                   "str2"             +20   20-byte null-terminated ASCII string
+               } 40 bytes
+/grp_rename/compressed   Dataset {6/6}
+    Location:  1:47716
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Chunks:    {2} 8 bytes
+    Storage:   <details removed for portability>
+    Filter-0:  deflate-1 OPT {1}
+    Type:      32-bit little-endian integer
+/grp_rename/grp_dsets    Group
+    Location:  1:55269
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+/grp_rename/grp_dsets/chunk Dataset {6/6}
+    Location:  1:56239
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Chunks:    {2} 8 bytes
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_rename/grp_dsets/compact Dataset {6/6}
+    Location:  1:55592
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_rename/grp_dsets/compound Dataset {2/2}
+    Location:  1:55695
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      struct {
+                   "str1"             +0    20-byte null-terminated ASCII string
+                   "str2"             +20   20-byte null-terminated ASCII string
+               } 40 bytes
+/grp_rename/grp_dsets/compressed Dataset {6/6}
+    Location:  1:55908
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Chunks:    {2} 8 bytes
+    Storage:   <details removed for portability>
+    Filter-0:  deflate-1 OPT {1}
+    Type:      32-bit little-endian integer
+/grp_rename/grp_dsets/named_vl Dataset {2/2}
+    Location:  1:56078
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      shared-1:56018 variable length of
+                   32-bit little-endian integer
+/grp_rename/grp_dsets/nested_vl Dataset {2/2}
+    Location:  1:56333
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      variable length of
+                   variable length of
+                       32-bit little-endian integer
+/grp_rename/grp_dsets/simple Dataset {6/6}
+    Location:  1:55499
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_rename/grp_dsets/vl Type
+    Location:  1:56018
+    Links:     2
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Type:      shared-1:56018 variable length of
+                   32-bit little-endian integer
+/grp_rename/named_vl     Dataset {2/2}
+    Location:  1:47886
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      shared-1:47826 variable length of
+                   32-bit little-endian integer
+/grp_rename/nested_vl    Dataset {2/2}
+    Location:  1:48141
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      variable length of
+                   variable length of
+                       32-bit little-endian integer
+/grp_rename/simple       Dataset {6/6}
+    Location:  1:47307
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/grp_rename/vl           Type
+    Location:  1:47826
+    Links:     2
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Type:      shared-1:47826 variable length of
+                   32-bit little-endian integer
+/named_vl                Dataset {2/2}
+    Location:  1:8657
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      shared-1:8606 variable length of
+                   32-bit little-endian integer
+/nested_vl               Dataset {2/2}
+    Location:  1:22942
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      variable length of
+                   variable length of
+                       32-bit little-endian integer
+/rename                  Dataset {2/2}
+    Location:  1:27240
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      struct {
+                   "str1"             +0    20-byte null-terminated ASCII string
+                   "str2"             +20   20-byte null-terminated ASCII string
+               } 40 bytes
+/simple                  Dataset {6/6}
+    Location:  1:800
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
+/simple_top              Dataset {6/6}
+    Location:  1:25099
+    Links:     1
+    Modified:  XXXX-XX-XX XX:XX:XX XXX
+    Storage:   <details removed for portability>
+    Type:      32-bit little-endian integer
diff --git a/tools/h5diff/CMakeTests.cmake b/tools/h5diff/CMakeTests.cmake
index 16854a9..0595edd 100644
--- a/tools/h5diff/CMakeTests.cmake
+++ b/tools/h5diff/CMakeTests.cmake
@@ -50,6 +50,30 @@
       ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/compounds_array_vlen2.h5
       ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/non_comparables1.h5
       ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/non_comparables2.h5
+      # tools/testfiles/vds
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/1_a.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/1_b.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/1_c.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/1_d.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/1_e.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/1_f.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/1_vds.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/2_a.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/2_b.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/2_c.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/2_d.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/2_e.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/2_vds.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/3_1_vds.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/3_2_vds.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/4_0.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/4_1.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/4_2.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/4_vds.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/5_a.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/5_b.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/5_c.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/5_vds.h5
   )
 
   set (LIST_OTHER_TEST_FILES
@@ -231,6 +255,9 @@
       ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_710.txt
       ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_80.txt
       ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_90.txt
+      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_v1.txt
+      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_v2.txt
+      ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/testfiles/h5diff_v3.txt
   )
 
   # Make testfiles dir under build dir
@@ -447,6 +474,13 @@
   # attrs with verbose option level
   set (ATTR_VERBOSE_LEVEL_FILE1 h5diff_attr_v_level1.h5)
   set (ATTR_VERBOSE_LEVEL_FILE2 h5diff_attr_v_level2.h5)
+# VDS tests
+  set (FILEV1 1_vds.h5)
+  set (FILEV2 2_vds.h5)
+  set (FILEV3_1 3_1_vds.h5)
+  set (FILEV3_2 3_2_vds.h5)
+  set (FILEV4 4_vds.h5)
+  set (FILEV5 5_vds.h5)
 
   if (HDF5_ENABLE_USING_MEMCHECKER)
     # Remove any output file left over from previous test run
@@ -800,6 +834,12 @@
           h5diff_80.out.err
           h5diff_90.out
           h5diff_90.out.err
+          h5diff_v1.out
+          h5diff_v1.out.err
+          h5diff_v2.out
+          h5diff_v2.out.err
+          h5diff_v3.out
+          h5diff_v3.out.err
     )
     set_tests_properties (H5DIFF-clearall-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
     if (NOT "${last_test}" STREQUAL "")
@@ -1375,3 +1415,9 @@ ADD_H5_TEST (h5diff_643 1 -v -d 5 --use-system-epsilon ${FILE1} ${FILE2} /g1/dse
 ADD_H5_TEST (h5diff_644 1 -v --use-system-epsilon -d 5 ${FILE1} ${FILE2} /g1/dset3 /g1/dset4)
 ADD_H5_TEST (h5diff_645 1 -v -p 0.05 --use-system-epsilon ${FILE1} ${FILE2} /g1/dset3 /g1/dset4)
 ADD_H5_TEST (h5diff_646 1 -v --use-system-epsilon -p 0.05 ${FILE1} ${FILE2} /g1/dset3 /g1/dset4)
+
+# VDS
+ADD_H5_TEST (h5diff_v1 0 -v ${FILEV1} ${FILEV2})
+ADD_H5_TEST (h5diff_v2 0 -r ${FILEV1} ${FILEV2})
+ADD_H5_TEST (h5diff_v3 0 -c ${FILEV1} ${FILEV2})
+
diff --git a/tools/h5diff/Makefile.in b/tools/h5diff/Makefile.in
index c95967d..403b54b 100644
--- a/tools/h5diff/Makefile.in
+++ b/tools/h5diff/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -32,7 +32,17 @@
 #
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -95,22 +105,22 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/testh5diff.sh.in $(srcdir)/testph5diff.sh.in \
-	$(top_srcdir)/bin/depcomp $(top_srcdir)/bin/test-driver
 bin_PROGRAMS = h5diff$(EXEEXT) $(am__EXEEXT_1)
 check_PROGRAMS = $(am__EXEEXT_2)
 TESTS = $(am__EXEEXT_2) $(TEST_SCRIPT)
 subdir = tools/h5diff
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES = testh5diff.sh testph5diff.sh
 CONFIG_CLEAN_VPATH_FILES =
 @BUILD_PARALLEL_CONDITIONAL_TRUE at am__EXEEXT_1 = ph5diff$(EXEEXT)
@@ -148,7 +158,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -400,6 +410,10 @@ am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
 TEST_LOGS = $(am__test_logs2:.sh.log=.log)
 SH_LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
 SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/testh5diff.sh.in \
+	$(srcdir)/testph5diff.sh.in $(top_srcdir)/bin/depcomp \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -419,7 +433,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -464,14 +477,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -481,13 +502,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -529,9 +549,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -732,7 +763,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/h5diff/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign tools/h5diff/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -741,7 +771,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -946,7 +976,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1229,6 +1259,8 @@ uninstall-am: uninstall-binPROGRAMS
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am \
 	uninstall-binPROGRAMS
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/tools/h5diff/h5diffgentest.c b/tools/h5diff/h5diffgentest.c
index cfaffe6..937bd32 100644
--- a/tools/h5diff/h5diffgentest.c
+++ b/tools/h5diff/h5diffgentest.c
@@ -62,6 +62,8 @@ hsize_t H5TOOLS_MALLOCSIZE = (128 * 1024 * 1024);
 #define FILE18   "h5diff_ext2softlink_trg.h5"
 #define FILE19   "h5diff_dset_zero_dim_size1.h5"
 #define FILE20   "h5diff_dset_zero_dim_size2.h5"
+#define FILE21   "h5diff_dset_idx1.h5"
+#define FILE22   "h5diff_dset_idx2.h5"
 #define DANGLE_LINK_FILE1   "h5diff_danglelinks1.h5"
 #define DANGLE_LINK_FILE2   "h5diff_danglelinks2.h5"
 #define GRP_RECURSE_FILE1   "h5diff_grp_recurse1.h5"
@@ -165,6 +167,7 @@ static void gen_datareg(hid_t fid,int make_diffs);
 /* utilities */
 static int write_attr(hid_t loc_id,int rank,hsize_t *dims,const char *name,hid_t tid,void *buf);
 static int write_dset(hid_t loc_id,int rank,hsize_t *dims,const char *name,hid_t tid,void *buf);
+static int gen_dataset_idx(const char *file, int format);
 
 
 /*-------------------------------------------------------------------------
@@ -211,6 +214,15 @@ int main(void)
     test_special_datasets(FILE19,0);
     test_special_datasets(FILE20,1);
 
+    /* 
+     * Generate 2 files: FILE21 with old format; FILE22 with new format
+     * 	Create 2 datasets in each file:
+     *  	One dataset: chunked layout, w/o filters, fixed dimension
+     *  	One dataset: chunked layout,  w/ filters, fixed dimension
+     */
+    gen_dataset_idx(FILE21, 0);
+    gen_dataset_idx(FILE22, 1);
+
     test_dangle_links(DANGLE_LINK_FILE1, DANGLE_LINK_FILE2);
 
     test_group_recurse(GRP_RECURSE_FILE1, GRP_RECURSE_FILE2);
@@ -1014,14 +1026,14 @@ int test_attributes(const char *file,
 static int test_attributes_verbose_level(const char *fname1, const char *fname2)
 {
     herr_t  status = SUCCEED;
-    hid_t   fid1, fid2;
-    hid_t   f1_gid, f2_gid;
-    hid_t   f1_gid2, f2_gid2;
-    hid_t   f1_gid3, f2_gid3;
-    hid_t   f1_gid4, f2_gid4;
-    hid_t   f1_did, f2_did;
-    hid_t   f1_sid, f2_sid;
-    hid_t   f1_tid, f2_tid;
+    hid_t   fid1    = -1,   fid2 = -1;
+    hid_t   f1_gid  = -1,   f2_gid = -1;
+    hid_t   f1_gid2 = -1,   f2_gid2 = -1;
+    hid_t   f1_gid3 = -1,   f2_gid3 = -1;
+    hid_t   f1_gid4 = -1,   f2_gid4 = -1;
+    hid_t   f1_did  = -1,   f2_did = -1;
+    hid_t   f1_sid  = -1,   f2_sid = -1;
+    hid_t   f1_tid  = -1,   f2_tid = -1;
     /* dset */
     hsize_t dset_dims[1]={3};
     int dset_data[3] = {0,1,2};
@@ -1252,9 +1264,9 @@ out:
     /*-----------------------------------------------------------------------
     * Close
     *-----------------------------------------------------------------------*/
-    if(fid1)
+    if(fid1 > 0)
         H5Fclose(fid1);
-    if(fid2)
+    if(fid2 > 0)
         H5Fclose(fid2);
     if(f1_gid > 0)
         H5Gclose(f1_gid);
@@ -1276,13 +1288,13 @@ out:
         H5Dclose(f1_did);
     if(f2_did > 0)
         H5Dclose(f2_did);
-    if(f1_sid >0)
+    if(f1_sid > 0)
         H5Sclose(f1_sid);
-    if(f2_sid >0)
+    if(f2_sid > 0)
         H5Sclose(f2_sid);
-    if(f1_tid >0)
+    if(f1_tid > 0)
         H5Tclose(f1_tid);
-    if(f2_tid >0)
+    if(f2_tid > 0)
         H5Tclose(f2_tid);
 
     return status;
@@ -2105,6 +2117,95 @@ out:
 }
 
 /*-------------------------------------------------------------------------
+* Function: gen_dataset_idx
+*
+* Purpose: Create a file with either the new or old format
+*	   Create two datasets in the file: 
+*		one dataset: fixed dimension, chunked layout, w/o filters
+*		one dataset: fixed dimension, chunked layout, w/ filters
+*
+*-------------------------------------------------------------------------
+*/
+static
+int gen_dataset_idx(const char *file, int format)
+{
+    hid_t   fid;		/* file id */
+    hid_t   did, did2;		/* dataset id */
+    hid_t   sid;		/* space id */
+    hid_t   fapl;		/* file access property id */
+    hid_t   dcpl;		/* dataset creation property id */
+    hsize_t dims[1] = {10};	/* dataset dimension */
+    hsize_t c_dims[1] = {2};	/* chunk dimension */
+    herr_t  status;		/* return status */
+    int     buf[10];		/* data buffer */
+    int	    i;			/* local index variable */
+
+    /* Get a copy of the file aaccess property */
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+
+    /* Set the "use the latest format" bounds for creating objects in the file */
+    if(format) {
+	status = H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
+	assert(status >= 0);
+    }
+
+    /* Create a file  */
+    if((fid = H5Fcreate(file, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+        return -1;
+
+    /* Create data */
+    for(i = 0; i < 10; i++)
+	buf[i] = i;
+
+    /* Set chunk */
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+    status = H5Pset_chunk(dcpl, 1, c_dims);
+    assert(status >= 0);
+
+    /* Create a 1D dataset */
+    sid = H5Screate_simple(1, dims, NULL);
+    did  = H5Dcreate2(fid, "dset", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+    
+    /* Write to the dataset */
+    status = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+    assert(status >= 0);
+
+#if defined (H5_HAVE_FILTER_DEFLATE)
+    /* set deflate data */
+    status = H5Pset_deflate(dcpl, 9);
+    assert(status >= 0);
+
+    /* Create and write the dataset */
+    did2  = H5Dcreate2(fid, "dset_filter", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+    status = H5Dwrite(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
+    assert(status >= 0);
+
+    /* Close the dataset */
+    status = H5Dclose(did2);
+    assert(status >= 0);
+
+#endif
+
+    /* closing: dataspace, dataset, file */
+    status = H5Sclose(sid);
+    assert(status >= 0);
+
+    status = H5Dclose(did);
+    assert(status >= 0);
+
+    status = H5Fclose(fid);
+    assert(status >= 0);
+
+    status = H5Pclose(dcpl);
+    assert(status >= 0);
+
+    status = H5Pclose(fapl);
+    assert(status >= 0);
+
+    return status;
+}
+
+/*-------------------------------------------------------------------------
 *
 * Purpose: Create test files to compare dangling links in various way
 *
@@ -2797,15 +2898,18 @@ out:
 #define GRP_R_DSETNAME2 "dset2"
 static int test_group_recurse2(void)
 {
-    hid_t       fileid1;
-    hid_t       grp1=0, grp2;
-    hid_t       grp3=0;
-    hid_t       grp4=0;
-    hid_t       dset1, dset2;
-    hid_t       datatype, dataspace;   /* handles */
-    hid_t       fileid2;
-    hid_t       fileid3;
-    hid_t       fileid4;
+    hid_t       fileid1     = -1;
+    hid_t       grp1        = -1;
+    hid_t       grp2        = -1;
+    hid_t       grp3        = -1;
+    hid_t       grp4        = -1;
+    hid_t       dset1       = -1;
+    hid_t       dset2       = -1;
+    hid_t       datatype    = -1;
+    hid_t       dataspace   = -1;
+    hid_t       fileid2     = -1;
+    hid_t       fileid3     = -1;
+    hid_t       fileid4     = -1;
     hsize_t     dimsf[2];              /* dataset dimensions */
     herr_t      status=0;
     int data1[4][2] = {{0,0},{1,1},{2,2},{3,3}};
@@ -3098,12 +3202,18 @@ out:
     /*
      * Close/release resources.
      */
-    H5Sclose(dataspace);
-    H5Tclose(datatype);
-    H5Fclose(fileid1);
-    H5Fclose(fileid2);
-    H5Fclose(fileid3);
-    H5Fclose(fileid4);
+    if(dataspace > 0)
+        H5Sclose(dataspace);
+    if(datatype > 0)
+        H5Tclose(datatype);
+    if(fileid1 > 0)
+        H5Fclose(fileid1);
+    if(fileid2 > 0)
+        H5Fclose(fileid2);
+    if(fileid3 > 0)
+        H5Fclose(fileid3);
+    if(fileid4 > 0)
+        H5Fclose(fileid4);
 
     return status;
 }
@@ -3506,8 +3616,8 @@ static int test_comp_vlen_strings(const char *fname1, const char *grp_name, int
 {
     int i;
 
-    hid_t    fid1;      /* file id */
-    hid_t    gid;
+    hid_t    fid1   = -1;      /* file id */
+    hid_t    gid    = -1;
 
     /* compound1 datatype */
     typedef struct comp1_t
@@ -4153,60 +4263,60 @@ out:
    /*-----------------------------------------------------------------------
     * Close
     *-----------------------------------------------------------------------*/
-    if(fid1)
+    if(fid1 > 0)
         H5Fclose(fid1);
-    if(gid)
+    if(gid > 0)
         H5Gclose(gid);
     /* vlen string */
-    if(tid_vlen_str)
+    if(tid_vlen_str > 0)
         H5Tclose(tid_vlen_str);
-    if(sid_vlen_str)
+    if(sid_vlen_str > 0)
         H5Sclose(sid_vlen_str);
     /* fixed len string */
-    if(tid_fixlen_str)
+    if(tid_fixlen_str > 0)
         H5Tclose(tid_fixlen_str);
-    if(sid_fixlen_str)
+    if(sid_fixlen_str > 0)
         H5Sclose(sid_fixlen_str);
     /* vlen string array */
-    if(tid_vlen_str_array_pre)
+    if(tid_vlen_str_array_pre > 0)
         H5Tclose(tid_vlen_str_array_pre);
-    if(tid_vlen_str_array)
+    if(tid_vlen_str_array > 0)
         H5Tclose(tid_vlen_str_array);
-    if(sid_vlen_str_array)
+    if(sid_vlen_str_array > 0)
         H5Sclose(sid_vlen_str_array);
     /* fixed len string array */
-    if(tid_fixlen_str_array_pre)
+    if(tid_fixlen_str_array_pre > 0)
         H5Tclose(tid_fixlen_str_array_pre);
-    if(tid_fixlen_str_array)
+    if(tid_fixlen_str_array > 0)
         H5Tclose(tid_fixlen_str_array);
-    if(sid_fixlen_str_array)
+    if(sid_fixlen_str_array > 0)
         H5Sclose(sid_fixlen_str_array);
     /* compound */
-    if(tid1_comp)
+    if(tid1_comp > 0)
         H5Tclose(tid1_comp);
-    if(tid2_comp)
+    if(tid2_comp > 0)
         H5Tclose(tid2_comp);
-    if(tid3_comp)
+    if(tid3_comp > 0)
         H5Tclose(tid3_comp);
-    if(tid4_comp)
+    if(tid4_comp > 0)
         H5Tclose(tid4_comp);
-    if(tid5_comp)
+    if(tid5_comp > 0)
         H5Tclose(tid5_comp);
-    if(tid6_comp)
+    if(tid6_comp > 0)
         H5Tclose(tid6_comp);
-    if(tid7_comp)
+    if(tid7_comp > 0)
         H5Tclose(tid7_comp);
-    if(tid8_comp)
+    if(tid8_comp > 0)
         H5Tclose(tid8_comp);
-    if(tid9_comp)
+    if(tid9_comp > 0)
         H5Tclose(tid9_comp);
-    if(did_comp)
+    if(did_comp > 0)
         H5Dclose(did_comp);
-    if(sid_comp)
+    if(sid_comp > 0)
         H5Sclose(sid_comp);
 
     return status;
-}
+} /* end test_comp_vlen_strings() */
 
 
 /*-------------------------------------------------------------------------
@@ -5023,10 +5133,10 @@ static void test_data_nocomparables (const char * fname, int make_diffs)
 
 
     /* attr2 - non-compatible : same rank, different dimention */
-    write_attr(did2,1, attr2_dim_ptr,"attr2", H5T_NATIVE_INT, data3);
+    write_attr(did2,1,(hsize_t *)attr2_dim_ptr,"attr2", H5T_NATIVE_INT, data3);
 
     /* attr3 - non-compatible : different rank */
-    write_attr(did2, rank_attr,attr3_dim_ptr,"attr3", H5T_NATIVE_INT, attr_data_ptr3);
+    write_attr(did2, rank_attr,(hsize_t *)attr3_dim_ptr,"attr3", H5T_NATIVE_INT, attr_data_ptr3);
 
     /* attr4 - compatible : different data values */
     write_attr(did2,1,dims1_1,"attr4", H5T_NATIVE_INT, attr_data_ptr4);
@@ -6551,7 +6661,7 @@ void write_dset_in(hid_t loc_id,
 
         /* allocate and initialize array data to write */
         size = ( H5TOOLS_MALLOCSIZE / sizeof(double) + 1 ) * sizeof(double);
-        dbuf = HDmalloc( size );
+        dbuf = (double *)HDmalloc( size );
 
         for( j = 0; j < H5TOOLS_MALLOCSIZE / sizeof(double) + 1; j++)
             dbuf[j] = j;
@@ -7018,10 +7128,10 @@ void gen_datareg(hid_t fid,
     int             i;
 
     /* allocate the buffer for write the references */
-    rbuf = HDcalloc((size_t)2, sizeof(hdset_reg_ref_t));
+    rbuf = (hdset_reg_ref_t *)HDcalloc((size_t)2, sizeof(hdset_reg_ref_t));
 
     /* allocate the buffer for write the data dataset */
-    buf = HDmalloc(10 * 10 * sizeof(int));
+    buf = (int *)HDmalloc(10 * 10 * sizeof(int));
 
     for(i = 0; i < 10 * 10; i++)
         buf[i] = i;
diff --git a/tools/h5diff/testfiles/h5diff_19.txt b/tools/h5diff/testfiles/h5diff_19.txt
new file mode 100644
index 0000000..1155d55
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_19.txt
@@ -0,0 +1,26 @@
+
+file1     file2
+---------------------------------------
+    x      x    /              
+    x           /g1            
+    x           /g1/d1         
+    x           /g1/d2         
+    x           /g1/dset1      
+    x           /g1/dset10     
+    x           /g1/dset3      
+    x           /g1/dset5      
+    x           /g1/dset6      
+    x           /g1/dset7      
+    x           /g1/dset8      
+    x           /g1/dset9      
+    x           /g1/fp1        
+    x           /g1/fp15       
+    x           /g1/fp16       
+    x           /g1/fp17       
+    x           /g1/fp18       
+    x           /g1/fp2        
+    x           /g1/ld         
+
+group  : </> and </>
+0 differences found
+EXIT CODE: 1
diff --git a/tools/h5diff/testfiles/h5diff_attr1.h5 b/tools/h5diff/testfiles/h5diff_attr1.h5
index 5004f13..c44066b 100644
Binary files a/tools/h5diff/testfiles/h5diff_attr1.h5 and b/tools/h5diff/testfiles/h5diff_attr1.h5 differ
diff --git a/tools/h5diff/testfiles/h5diff_attr2.h5 b/tools/h5diff/testfiles/h5diff_attr2.h5
index 92a91c0..5de3303 100644
Binary files a/tools/h5diff/testfiles/h5diff_attr2.h5 and b/tools/h5diff/testfiles/h5diff_attr2.h5 differ
diff --git a/tools/h5diff/testfiles/h5diff_basic2.h5 b/tools/h5diff/testfiles/h5diff_basic2.h5
index f3d6be8..c0795b6 100644
Binary files a/tools/h5diff/testfiles/h5diff_basic2.h5 and b/tools/h5diff/testfiles/h5diff_basic2.h5 differ
diff --git a/tools/h5diff/testfiles/h5diff_dset1.h5 b/tools/h5diff/testfiles/h5diff_dset1.h5
index 240e55c..123e141 100644
Binary files a/tools/h5diff/testfiles/h5diff_dset1.h5 and b/tools/h5diff/testfiles/h5diff_dset1.h5 differ
diff --git a/tools/h5diff/testfiles/h5diff_dset2.h5 b/tools/h5diff/testfiles/h5diff_dset2.h5
index 10d8599..3ae6993 100644
Binary files a/tools/h5diff/testfiles/h5diff_dset2.h5 and b/tools/h5diff/testfiles/h5diff_dset2.h5 differ
diff --git a/tools/h5diff/testfiles/h5diff_dset_idx1.h5 b/tools/h5diff/testfiles/h5diff_dset_idx1.h5
new file mode 100644
index 0000000..3252303
Binary files /dev/null and b/tools/h5diff/testfiles/h5diff_dset_idx1.h5 differ
diff --git a/tools/h5diff/testfiles/h5diff_dset_idx2.h5 b/tools/h5diff/testfiles/h5diff_dset_idx2.h5
new file mode 100644
index 0000000..db7584d
Binary files /dev/null and b/tools/h5diff/testfiles/h5diff_dset_idx2.h5 differ
diff --git a/tools/h5diff/testfiles/h5diff_hyper1.h5 b/tools/h5diff/testfiles/h5diff_hyper1.h5
index 1eb71f4..1fd47e1 100644
Binary files a/tools/h5diff/testfiles/h5diff_hyper1.h5 and b/tools/h5diff/testfiles/h5diff_hyper1.h5 differ
diff --git a/tools/h5diff/testfiles/h5diff_hyper2.h5 b/tools/h5diff/testfiles/h5diff_hyper2.h5
index c2c47ca..ad2f468 100644
Binary files a/tools/h5diff/testfiles/h5diff_hyper2.h5 and b/tools/h5diff/testfiles/h5diff_hyper2.h5 differ
diff --git a/tools/h5diff/testfiles/h5diff_idx.txt b/tools/h5diff/testfiles/h5diff_idx.txt
new file mode 100644
index 0000000..754d3ea
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_idx.txt
@@ -0,0 +1,14 @@
+
+file1     file2
+---------------------------------------
+    x      x    /              
+    x      x    /dset          
+    x      x    /dset_filter   
+
+group  : </> and </>
+0 differences found
+dataset: </dset> and </dset>
+0 differences found
+dataset: </dset_filter> and </dset_filter>
+0 differences found
+EXIT CODE: 0
diff --git a/tools/h5diff/testfiles/h5diff_types.h5 b/tools/h5diff/testfiles/h5diff_types.h5
index 6456e58..c835069 100644
Binary files a/tools/h5diff/testfiles/h5diff_types.h5 and b/tools/h5diff/testfiles/h5diff_types.h5 differ
diff --git a/tools/h5diff/testfiles/h5diff_v1.txt b/tools/h5diff/testfiles/h5diff_v1.txt
new file mode 100644
index 0000000..31a3eae
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_v1.txt
@@ -0,0 +1,18 @@
+
+file1     file2
+---------------------------------------
+    x      x    /              
+    x      x    /vds_dset      
+
+group  : </> and </>
+0 differences found
+dataset: </vds_dset> and </vds_dset>
+Not comparable: </vds_dset> or </vds_dset> is an empty dataset
+Not comparable: </vds_dset> has rank 3, dimensions [5x18x8], max dimensions [18446744073709551615x18x8]
+and </vds_dset> has rank 3, dimensions [6x8x14], max dimensions [18446744073709551615x8x14]
+0 differences found
+--------------------------------
+Some objects are not comparable
+--------------------------------
+Use -c for a list of objects without details of differences.
+EXIT CODE: 0
diff --git a/tools/h5diff/testfiles/h5diff_v2.txt b/tools/h5diff/testfiles/h5diff_v2.txt
new file mode 100644
index 0000000..aa327b1
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_v2.txt
@@ -0,0 +1,7 @@
+dataset: </vds_dset> and </vds_dset>
+0 differences found
+--------------------------------
+Some objects are not comparable
+--------------------------------
+Use -c for a list of objects.
+EXIT CODE: 0
diff --git a/tools/h5diff/testfiles/h5diff_v3.txt b/tools/h5diff/testfiles/h5diff_v3.txt
new file mode 100644
index 0000000..8c5d2a2
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_v3.txt
@@ -0,0 +1,4 @@
+Not comparable: </vds_dset> or </vds_dset> is an empty dataset
+Not comparable: </vds_dset> has rank 3, dimensions [5x18x8], max dimensions [18446744073709551615x18x8]
+and </vds_dset> has rank 3, dimensions [6x8x14], max dimensions [18446744073709551615x8x14]
+EXIT CODE: 0
diff --git a/tools/h5diff/testfiles/tmptest.he5 b/tools/h5diff/testfiles/tmptest.he5
index edcfcd2..7dedfc1 100644
Binary files a/tools/h5diff/testfiles/tmptest.he5 and b/tools/h5diff/testfiles/tmptest.he5 differ
diff --git a/tools/h5diff/testfiles/tmptest2.he5 b/tools/h5diff/testfiles/tmptest2.he5
index a6ab02b..0ce63dc 100644
Binary files a/tools/h5diff/testfiles/tmptest2.he5 and b/tools/h5diff/testfiles/tmptest2.he5 differ
diff --git a/tools/h5diff/testh5diff.sh.in b/tools/h5diff/testh5diff.sh.in
index 3be0b80..fec6035 100644
--- a/tools/h5diff/testh5diff.sh.in
+++ b/tools/h5diff/testh5diff.sh.in
@@ -120,6 +120,29 @@ $SRC_H5DIFF_TESTFILES/h5diff_attr_v_level2.h5
 $SRC_H5DIFF_TESTFILES/h5diff_enum_invalid_values.h5
 $SRC_H5DIFF_TESTFILES/non_comparables1.h5
 $SRC_H5DIFF_TESTFILES/non_comparables2.h5
+$SRC_TOOLS_TESTFILES/vds/1_a.h5
+$SRC_TOOLS_TESTFILES/vds/1_b.h5
+$SRC_TOOLS_TESTFILES/vds/1_c.h5
+$SRC_TOOLS_TESTFILES/vds/1_d.h5
+$SRC_TOOLS_TESTFILES/vds/1_e.h5
+$SRC_TOOLS_TESTFILES/vds/1_f.h5
+$SRC_TOOLS_TESTFILES/vds/1_vds.h5
+$SRC_TOOLS_TESTFILES/vds/2_a.h5
+$SRC_TOOLS_TESTFILES/vds/2_b.h5
+$SRC_TOOLS_TESTFILES/vds/2_c.h5
+$SRC_TOOLS_TESTFILES/vds/2_d.h5
+$SRC_TOOLS_TESTFILES/vds/2_e.h5
+$SRC_TOOLS_TESTFILES/vds/2_vds.h5
+$SRC_TOOLS_TESTFILES/vds/3_1_vds.h5
+$SRC_TOOLS_TESTFILES/vds/3_2_vds.h5
+$SRC_TOOLS_TESTFILES/vds/4_0.h5
+$SRC_TOOLS_TESTFILES/vds/4_1.h5
+$SRC_TOOLS_TESTFILES/vds/4_2.h5
+$SRC_TOOLS_TESTFILES/vds/4_vds.h5
+$SRC_TOOLS_TESTFILES/vds/5_a.h5
+$SRC_TOOLS_TESTFILES/vds/5_b.h5
+$SRC_TOOLS_TESTFILES/vds/5_c.h5
+$SRC_TOOLS_TESTFILES/vds/5_vds.h5
 "
 
 LIST_OTHER_TEST_FILES="
@@ -331,10 +354,10 @@ COPY_TESTFILES_TO_TESTDIR()
             INODE_SDIR=`$LS -i -d $SDIR | $AWK -F' ' '{print $1}'`
             INODE_DDIR=`$LS -i -d $TESTDIR | $AWK -F' ' '{print $1}'`
             if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then
-    	        $CP -f $tstfile $TESTDIR
+              $CP -f $tstfile $TESTDIR
                 if [ $? -ne 0 ]; then
                     echo "Error: FAILED to copy $tstfile ."
-                
+
                     # Comment out this to CREATE expected file
                     exit $EXIT_FAILURE
                 fi
@@ -442,9 +465,9 @@ TOOLTEST() {
     cp $actual_err $actual_err_sav
     STDERR_FILTER $actual_err
     cat $actual_err >> $actual
-    # don't add exit code check in pmode, as it causes failure. (exit code 
+    # don't add exit code check in pmode, as it causes failure. (exit code
     # is from mpirun not tool)
-    # if any problem occurs relate to an exit code, it will be caught in 
+    # if any problem occurs relate to an exit code, it will be caught in
     # serial mode, so the test is fullfilled.
     if test $h5haveexitcode = 'yes' -a -z "$pmode"; then
       echo "EXIT CODE: $EXIT_CODE" >> $actual
@@ -462,7 +485,7 @@ TOOLTEST() {
         nerrors="`expr $nerrors + 1`"
         test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
     else
-	    # parallel mode output are often of different ordering from serial
+        # parallel mode output are often of different ordering from serial
         # output.  If the sorted expected and actual files compare the same,
         # it is safe to assume the actual output match the expected file.
         expect_sorted=expect_sorted
@@ -493,24 +516,24 @@ TOOLTEST() {
 
     # Clean up output file
     if test -z "$HDF5_NOCLEANUP"; then
-	    rm -f $actual $actual_err $actual_sav $actual_err_sav
-    	rm -f $actual_sorted $expect_sorted
+      rm -f $actual $actual_err $actual_sav $actual_err_sav
+      rm -f $actual_sorted $expect_sorted
     fi
 }
 
 
 # Print a "SKIP" message
 SKIP() {
-	 TESTING $H5DIFF $@
-	  echo  " -SKIP-"
+   TESTING $H5DIFF $@
+    echo  " -SKIP-"
 }
 
 
 
 ##############################################################################
-# The tests 
+# The tests
 # To avoid the printing of the complete full path of the test file, that hides
-# all the other parameters for long paths, the printing of the command line 
+# all the other parameters for long paths, the printing of the command line
 # is done first in
 # TESTING with the name only of the test file $TOOL, not its full path $TESTFILE
 ##############################################################################
@@ -525,13 +548,13 @@ COPY_TESTFILES_TO_TESTDIR
 TOOLTEST h5diff_10.txt -h
 
 # 1.1 normal mode
-TOOLTEST h5diff_11.txt  h5diff_basic1.h5 h5diff_basic2.h5 
+TOOLTEST h5diff_11.txt  h5diff_basic1.h5 h5diff_basic2.h5
 
 # 1.2 normal mode with objects
 TOOLTEST h5diff_12.txt  h5diff_basic1.h5 h5diff_basic2.h5  g1/dset1 g1/dset2
 
 # 1.3 report mode
-TOOLTEST h5diff_13.txt -r h5diff_basic1.h5 h5diff_basic2.h5 
+TOOLTEST h5diff_13.txt -r h5diff_basic1.h5 h5diff_basic2.h5
 
 # 1.4 report  mode with objects
 TOOLTEST h5diff_14.txt  -r h5diff_basic1.h5 h5diff_basic2.h5 g1/dset1 g1/dset2
@@ -549,7 +572,7 @@ TOOLTEST h5diff_16_2.txt --verbose --relative=0.02 h5diff_basic1.h5 h5diff_basic
 TOOLTEST h5diff_16_3.txt -v -p 0.02 h5diff_basic1.h5 h5diff_basic1.h5 g1/dset9 g1/dset10
 
 # 1.7 verbose mode
-TOOLTEST h5diff_17.txt -v h5diff_basic1.h5 h5diff_basic2.h5   
+TOOLTEST h5diff_17.txt -v h5diff_basic1.h5 h5diff_basic2.h5
 
 # 1.7 test 32-bit INFINITY
 TOOLTEST h5diff_171.txt -v h5diff_basic1.h5 h5diff_basic1.h5 /g1/fp19 /g1/fp19_COPY
@@ -557,8 +580,8 @@ TOOLTEST h5diff_171.txt -v h5diff_basic1.h5 h5diff_basic1.h5 /g1/fp19 /g1/fp19_C
 # 1.7 test 64-bit INFINITY
 TOOLTEST h5diff_172.txt -v h5diff_basic1.h5 h5diff_basic1.h5 /g1/fp20 /g1/fp20_COPY
 
-# 1.8 quiet mode 
-TOOLTEST h5diff_18.txt -q h5diff_basic1.h5 h5diff_basic2.h5 
+# 1.8 quiet mode
+TOOLTEST h5diff_18.txt -q h5diff_basic1.h5 h5diff_basic2.h5
 
 # 1.8 -v and -q
 TOOLTEST h5diff_18_1.txt -v -q h5diff_basic1.h5 h5diff_basic2.h5
@@ -588,7 +611,7 @@ TOOLTEST h5diff_23.txt -v h5diff_types.h5 h5diff_types.h5 g1 g1
 TOOLTEST h5diff_24.txt -v h5diff_types.h5 h5diff_types.h5 t1 t1
 
 # 2.5
-TOOLTEST h5diff_25.txt -v h5diff_types.h5 h5diff_types.h5 l1 l1 
+TOOLTEST h5diff_25.txt -v h5diff_types.h5 h5diff_types.h5 l1 l1
 
 # 2.6
 TOOLTEST h5diff_26.txt -v h5diff_types.h5 h5diff_types.h5 g1 g2
@@ -642,7 +665,7 @@ TOOLTEST h5diff_57.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset7a dset7b
 # 5.8 (region reference)
 TOOLTEST h5diff_58.txt -v h5diff_dset1.h5 h5diff_dset2.h5 refreg
 
-# test for both dset and attr with same type but with different size 
+# test for both dset and attr with same type but with different size
 # ( HDDFV-7942 )
 TOOLTEST h5diff_59.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset11a dset11b
 
@@ -652,14 +675,14 @@ TOOLTEST h5diff_59.txt -v h5diff_dtypes.h5 h5diff_dtypes.h5 dset11a dset11b
 
 
 # 6.0: Check if the command line number of arguments is less than 3
-TOOLTEST h5diff_600.txt h5diff_basic1.h5 
+TOOLTEST h5diff_600.txt h5diff_basic1.h5
 
-# 6.1: Check if non-exist object name is specified 
+# 6.1: Check if non-exist object name is specified
 TOOLTEST h5diff_601.txt h5diff_basic1.h5 h5diff_basic1.h5 nono_obj
 
 
 # ##############################################################################
-# # -d 
+# # -d
 # ##############################################################################
 
 
@@ -678,7 +701,7 @@ TOOLTEST h5diff_606.txt -d 0x1 h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dse
 # 6.7: string
 TOOLTEST h5diff_607.txt -d "1" h5diff_basic1.h5 h5diff_basic2.h5 g1/dset3 g1/dset4
 
-# 6.8: use system epsilon 
+# 6.8: use system epsilon
 TOOLTEST h5diff_608.txt --use-system-epsilon h5diff_basic1.h5 h5diff_basic2.h5  g1/dset3 g1/dset4
 
 # 6.9: number larger than biggest difference
@@ -762,7 +785,7 @@ TOOLTEST h5diff_631.txt -v --use-system-epsilon h5diff_basic1.h5 h5diff_basic1.h
 # ##############################################################################
 # 7.  attributes
 # ##############################################################################
-TOOLTEST h5diff_70.txt -v h5diff_attr1.h5 h5diff_attr2.h5 
+TOOLTEST h5diff_70.txt -v h5diff_attr1.h5 h5diff_attr2.h5
 # temporary test to verify HDF5-8625
 TOOLTEST h5diff_tmp1.txt tmptest2.he5 tmptest.he5
 # temporary test to verify HDF5-8639
@@ -772,10 +795,10 @@ TOOLTEST h5diff_tmp2.txt tmpSingleSiteBethe.output.h5 tmpSingleSiteBethe.referen
 #  attrs with verbose option level
 # ##################################################
 
-TOOLTEST h5diff_700.txt -v1 h5diff_attr1.h5 h5diff_attr2.h5 
-TOOLTEST h5diff_701.txt -v2 h5diff_attr1.h5 h5diff_attr2.h5 
-TOOLTEST h5diff_702.txt --verbose=1 h5diff_attr1.h5 h5diff_attr2.h5 
-TOOLTEST h5diff_703.txt --verbose=2 h5diff_attr1.h5 h5diff_attr2.h5 
+TOOLTEST h5diff_700.txt -v1 h5diff_attr1.h5 h5diff_attr2.h5
+TOOLTEST h5diff_701.txt -v2 h5diff_attr1.h5 h5diff_attr2.h5
+TOOLTEST h5diff_702.txt --verbose=1 h5diff_attr1.h5 h5diff_attr2.h5
+TOOLTEST h5diff_703.txt --verbose=2 h5diff_attr1.h5 h5diff_attr2.h5
 
 # same attr number , all same attr name
 TOOLTEST h5diff_704.txt -v2 h5diff_attr_v_level1.h5 h5diff_attr_v_level2.h5 /g
@@ -789,7 +812,7 @@ TOOLTEST h5diff_706.txt -v2 h5diff_attr_v_level1.h5 h5diff_attr_v_level2.h5 /nty
 # different attr number , same attr name (intersected)
 TOOLTEST h5diff_707.txt -v2 h5diff_attr_v_level1.h5 h5diff_attr_v_level2.h5 /g2
 
-# different attr number , all different attr name 
+# different attr number , all different attr name
 TOOLTEST h5diff_708.txt -v2 h5diff_attr_v_level1.h5 h5diff_attr_v_level2.h5 /g3
 
 # when no attributes exist in both objects
@@ -801,32 +824,32 @@ TOOLTEST h5diff_710.txt -v2 h5diff_attr_v_level1.h5 h5diff_attr_v_level2.h5
 # ##############################################################################
 # 8.  all dataset datatypes
 # ##############################################################################
-TOOLTEST h5diff_80.txt -v h5diff_dset1.h5 h5diff_dset2.h5 
+TOOLTEST h5diff_80.txt -v h5diff_dset1.h5 h5diff_dset2.h5
 
 # 9. compare a file with itself
 TOOLTEST h5diff_90.txt -v h5diff_basic2.h5 h5diff_basic2.h5
 
 # 10. read by hyperslab, print indexes
-TOOLTEST h5diff_100.txt -v h5diff_hyper1.h5 h5diff_hyper2.h5 
+TOOLTEST h5diff_100.txt -v h5diff_hyper1.h5 h5diff_hyper2.h5
 
 # 11. floating point comparison
 # double value
-TOOLTEST h5diff_101.txt -v h5diff_basic1.h5 h5diff_basic1.h5 g1/d1  g1/d2 
+TOOLTEST h5diff_101.txt -v h5diff_basic1.h5 h5diff_basic1.h5 g1/d1  g1/d2
 
 # float value
-TOOLTEST h5diff_102.txt -v h5diff_basic1.h5 h5diff_basic1.h5 g1/fp1 g1/fp2 
+TOOLTEST h5diff_102.txt -v h5diff_basic1.h5 h5diff_basic1.h5 g1/fp1 g1/fp2
 
-# with --use-system-epsilon for double value 
-TOOLTEST h5diff_103.txt -v --use-system-epsilon h5diff_basic1.h5 h5diff_basic1.h5 g1/d1  g1/d2 
+# with --use-system-epsilon for double value
+TOOLTEST h5diff_103.txt -v --use-system-epsilon h5diff_basic1.h5 h5diff_basic1.h5 g1/d1  g1/d2
 
 # with --use-system-epsilon for float value
-TOOLTEST h5diff_104.txt -v --use-system-epsilon h5diff_basic1.h5 h5diff_basic1.h5 g1/fp1 g1/fp2 
+TOOLTEST h5diff_104.txt -v --use-system-epsilon h5diff_basic1.h5 h5diff_basic1.h5 g1/fp1 g1/fp2
 
 
 # not comparable -c flag
-TOOLTEST h5diff_200.txt h5diff_basic2.h5 h5diff_basic2.h5 g2/dset1  g2/dset2 
+TOOLTEST h5diff_200.txt h5diff_basic2.h5 h5diff_basic2.h5 g2/dset1  g2/dset2
 
-TOOLTEST h5diff_201.txt -c h5diff_basic2.h5 h5diff_basic2.h5 g2/dset1  g2/dset2 
+TOOLTEST h5diff_201.txt -c h5diff_basic2.h5 h5diff_basic2.h5 g2/dset1  g2/dset2
 
 TOOLTEST h5diff_202.txt -c h5diff_basic2.h5 h5diff_basic2.h5 g2/dset2  g2/dset3
 
@@ -842,9 +865,9 @@ TOOLTEST h5diff_206.txt -c h5diff_basic2.h5 h5diff_basic2.h5 g2/dset7  g2/dset8
 TOOLTEST h5diff_207.txt -c h5diff_basic2.h5 h5diff_basic2.h5 g2/dset8  g2/dset9
 
 # not comparable in dataspace of zero dimension size
-TOOLTEST h5diff_208.txt -c h5diff_dset_zero_dim_size1.h5 h5diff_dset_zero_dim_size2.h5 
+TOOLTEST h5diff_208.txt -c h5diff_dset_zero_dim_size1.h5 h5diff_dset_zero_dim_size2.h5
 
-# non-comparable dataset with comparable attribute, and other comparable datasets. 
+# non-comparable dataset with comparable attribute, and other comparable datasets.
 # Also test non-compatible attributes with different type, dimention, rank.
 # All the comparables should display differences.
 TOOLTEST h5diff_220.txt -c non_comparables1.h5 non_comparables2.h5 /g1
@@ -862,7 +885,7 @@ TOOLTEST h5diff_222.txt -c non_comparables1.h5 non_comparables2.h5
 TOOLTEST h5diff_223.txt -c non_comparables1.h5 non_comparables2.h5 /diffobjtypes
 # swap files
 TOOLTEST h5diff_224.txt -c non_comparables2.h5 non_comparables1.h5 /diffobjtypes
-    
+
 # ##############################################################################
 # # Links compare without --follow-symlinks nor --no-dangling-links
 # ##############################################################################
@@ -958,28 +981,28 @@ TOOLTEST h5diff_425.txt --follow-symlinks -v h5diff_ext2softlink_src.h5 h5diff_e
 TOOLTEST h5diff_450.txt  --follow-symlinks -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5
 
 # dangling links --follow-symlinks and --no-dangling-links (FILE to FILE)
-TOOLTEST h5diff_451.txt  --follow-symlinks -v --no-dangling-links  h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 
+TOOLTEST h5diff_451.txt  --follow-symlinks -v --no-dangling-links  h5diff_danglelinks1.h5 h5diff_danglelinks2.h5
 
 # try --no-dangling-links without --follow-symlinks options
 TOOLTEST h5diff_452.txt  --no-dangling-links  h5diff_softlinks.h5 h5diff_softlinks.h5
 
 # dangling link found for soft links (FILE to FILE)
-TOOLTEST h5diff_453.txt  --follow-symlinks -v --no-dangling-links  h5diff_softlinks.h5 h5diff_softlinks.h5  
+TOOLTEST h5diff_453.txt  --follow-symlinks -v --no-dangling-links  h5diff_softlinks.h5 h5diff_softlinks.h5
 
 # dangling link found for soft links (obj to obj)
-TOOLTEST h5diff_454.txt  --follow-symlinks -v --no-dangling-links  h5diff_softlinks.h5 h5diff_softlinks.h5 /softlink_dset2 /softlink_noexist 
+TOOLTEST h5diff_454.txt  --follow-symlinks -v --no-dangling-links  h5diff_softlinks.h5 h5diff_softlinks.h5 /softlink_dset2 /softlink_noexist
 
 # dangling link found for soft links (obj to obj) Both dangle links
-TOOLTEST h5diff_455.txt  --follow-symlinks -v --no-dangling-links  h5diff_softlinks.h5 h5diff_softlinks.h5 /softlink_noexist /softlink_noexist 
+TOOLTEST h5diff_455.txt  --follow-symlinks -v --no-dangling-links  h5diff_softlinks.h5 h5diff_softlinks.h5 /softlink_noexist /softlink_noexist
 
 # dangling link found for ext links (FILE to FILE)
-TOOLTEST h5diff_456.txt  --follow-symlinks -v --no-dangling-links  h5diff_extlink_src.h5 h5diff_extlink_src.h5 
+TOOLTEST h5diff_456.txt  --follow-symlinks -v --no-dangling-links  h5diff_extlink_src.h5 h5diff_extlink_src.h5
 
 # dangling link found for ext links (obj to obj). target file exist
-TOOLTEST h5diff_457.txt  --follow-symlinks -v --no-dangling-links  h5diff_extlink_src.h5 h5diff_extlink_src.h5 /ext_link_dset1 /ext_link_noexist1 
+TOOLTEST h5diff_457.txt  --follow-symlinks -v --no-dangling-links  h5diff_extlink_src.h5 h5diff_extlink_src.h5 /ext_link_dset1 /ext_link_noexist1
 
 # dangling link found for ext links (obj to obj). target file NOT exist
-TOOLTEST h5diff_458.txt  --follow-symlinks -v --no-dangling-links  h5diff_extlink_src.h5 h5diff_extlink_src.h5 /ext_link_dset1 /ext_link_noexist2  
+TOOLTEST h5diff_458.txt  --follow-symlinks -v --no-dangling-links  h5diff_extlink_src.h5 h5diff_extlink_src.h5 /ext_link_dset1 /ext_link_noexist2
 
 # dangling link found for ext links (obj to obj). Both dangle links
 TOOLTEST h5diff_459.txt  --follow-symlinks -v --no-dangling-links  h5diff_extlink_src.h5 h5diff_extlink_src.h5 /ext_link_noexist1 /ext_link_noexist2
@@ -993,14 +1016,14 @@ TOOLTEST h5diff_466.txt -v --follow-symlinks h5diff_danglelinks1.h5 h5diff_dangl
 # soft link  vs. soft dangling
 TOOLTEST h5diff_467.txt -v --follow-symlinks h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /soft_link2
 # ext dangling vs. ext dangling
-TOOLTEST h5diff_468.txt -v --follow-symlinks h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /ext_link4 
+TOOLTEST h5diff_468.txt -v --follow-symlinks h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /ext_link4
 # ext link vs. ext dangling
 TOOLTEST h5diff_469.txt -v --follow-symlinks h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /ext_link2
 
 #----------------------------------------
-# dangling links without follow symlink 
+# dangling links without follow symlink
 # (HDFFV-7998)
-# test - soft dangle links (same and different paths), 
+# test - soft dangle links (same and different paths),
 #      - external dangle links (same and different paths)
 TOOLTEST h5diff_471.txt -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5
 TOOLTEST h5diff_472.txt -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /soft_link1
@@ -1011,7 +1034,7 @@ TOOLTEST h5diff_475.txt -v h5diff_danglelinks1.h5 h5diff_danglelinks2.h5 /ext_li
 # ##############################################################################
 # # test for group diff recursivly
 # ##############################################################################
-# root 
+# root
 TOOLTEST h5diff_500.txt -v h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 / /
 TOOLTEST h5diff_501.txt -v --follow-symlinks h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 / /
 
@@ -1045,7 +1068,7 @@ TOOLTEST h5diff_513.txt -v h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /slink_
 TOOLTEST h5diff_514.txt -v --follow-symlinks h5diff_grp_recurse1.h5 h5diff_grp_recurse2.h5 /slink_grp10 /slink_grp11
 
 ###############################################################################
-# Test for group recursive diff via multi-linked external links 
+# Test for group recursive diff via multi-linked external links
 # With follow-symlinks, file h5diff_grp_recurse_ext1.h5 and h5diff_grp_recurse_ext2-1.h5 should
 # be same with the external links.
 ###############################################################################
@@ -1068,7 +1091,7 @@ TOOLTEST h5diff_480.txt -v --exclude-path /group1/dset3 h5diff_exclude1-1.h5 h5d
 TOOLTEST h5diff_481.txt -v h5diff_exclude1-1.h5 h5diff_exclude1-2.h5
 
 #
-# Different structure, different names. 
+# Different structure, different names.
 #
 # Exclude all the different objects. Expect return - same
 TOOLTEST h5diff_482.txt -v --exclude-path "/group1" --exclude-path "/dset1" h5diff_exclude2-1.h5 h5diff_exclude2-2.h5
@@ -1099,9 +1122,9 @@ TOOLTEST h5diff_530.txt -v  h5diff_comp_vl_strs.h5 h5diff_comp_vl_strs.h5 /group
 TOOLTEST h5diff_540.txt -v compounds_array_vlen1.h5 compounds_array_vlen2.h5
 
 # ##############################################################################
-# # Test mutually exclusive options 
+# # Test mutually exclusive options
 # ##############################################################################
-# Test with -d , -p and --use-system-epsilon. 
+# Test with -d , -p and --use-system-epsilon.
 TOOLTEST h5diff_640.txt -v -d 5 -p 0.05 --use-system-epsilon h5diff_basic1.h5 h5diff_basic2.h5 /g1/dset3 /g1/dset4
 TOOLTEST h5diff_641.txt -v -d 5 -p 0.05 h5diff_basic1.h5 h5diff_basic2.h5 /g1/dset3 /g1/dset4
 TOOLTEST h5diff_642.txt -v -p 0.05 -d 5 h5diff_basic1.h5 h5diff_basic2.h5 /g1/dset3 /g1/dset4
@@ -1110,6 +1133,13 @@ TOOLTEST h5diff_644.txt -v --use-system-epsilon -d 5 h5diff_basic1.h5 h5diff_bas
 TOOLTEST h5diff_645.txt -v -p 0.05 --use-system-epsilon h5diff_basic1.h5 h5diff_basic2.h5 /g1/dset3 /g1/dset4
 TOOLTEST h5diff_646.txt -v --use-system-epsilon -p 0.05 h5diff_basic1.h5 h5diff_basic2.h5 /g1/dset3 /g1/dset4
 
+# ##############################################################################
+# VDS tests
+# ##############################################################################
+TOOLTEST h5diff_v1.txt -v 1_vds.h5 2_vds.h5
+TOOLTEST h5diff_v2.txt -r 1_vds.h5 2_vds.h5
+TOOLTEST h5diff_v3.txt -c 1_vds.h5 2_vds.h5
+
 
 # ##############################################################################
 # # END
diff --git a/tools/h5dump/CMakeLists.txt b/tools/h5dump/CMakeLists.txt
index 47ba7a8..be08e2a 100644
--- a/tools/h5dump/CMakeLists.txt
+++ b/tools/h5dump/CMakeLists.txt
@@ -39,6 +39,8 @@ if (BUILD_TESTING)
 
   include (CMakeTestsPBITS.cmake)
 
+  include (CMakeTestsVDS.cmake)
+
   include (CMakeTestsXML.cmake)
 endif (BUILD_TESTING)
 
diff --git a/tools/h5dump/CMakeTests.cmake b/tools/h5dump/CMakeTests.cmake
index 49a5acd..00ec760 100644
--- a/tools/h5dump/CMakeTests.cmake
+++ b/tools/h5dump/CMakeTests.cmake
@@ -10,6 +10,7 @@
   # --------------------------------------------------------------------
   set (HDF5_REFERENCE_FILES
       ${HDF5_TOOLS_SRC_DIR}/testfiles/charsets.ddl
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/file_space.ddl
       ${HDF5_TOOLS_SRC_DIR}/testfiles/filter_fail.ddl
       ${HDF5_TOOLS_SRC_DIR}/testfiles/packedbits.ddl
       ${HDF5_TOOLS_SRC_DIR}/testfiles/tall-1.ddl
@@ -185,6 +186,7 @@
   )
   set (HDF5_REFERENCE_TEST_FILES
       ${HDF5_TOOLS_SRC_DIR}/testfiles/charsets.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/file_space.h5
       ${HDF5_TOOLS_SRC_DIR}/testfiles/filter_fail.h5
       ${HDF5_TOOLS_SRC_DIR}/testfiles/packedbits.h5
       ${HDF5_TOOLS_SRC_DIR}/testfiles/taindices.h5
@@ -732,6 +734,8 @@
           h5dump-help.out
           charsets.out
           charsets.out.err
+          file_space.out
+          file_space.out.err
           filter_fail.out
           filter_fail.out.err
           packedbits.out
@@ -1240,6 +1244,7 @@
   ADD_H5_TEST (tboot2 0 --enable-error-stack -B tfcontents2.h5)
   ADD_H5_TEST (tboot2A 0 --enable-error-stack --boot-block tfcontents2.h5)
   ADD_H5_TEST (tboot2B 0 --enable-error-stack --superblock tfcontents2.h5)
+  ADD_H5_TEST (file_space 0 --enable-error-stack -B file_space.h5)
 
   # test -p with a non existing dataset
   ADD_H5ERR_MASK_TEST (tperror 1 --enable-error-stack -p -d bogus tfcontents1.h5)
diff --git a/tools/h5dump/CMakeTestsVDS.cmake b/tools/h5dump/CMakeTestsVDS.cmake
new file mode 100644
index 0000000..58287fa
--- /dev/null
+++ b/tools/h5dump/CMakeTestsVDS.cmake
@@ -0,0 +1,238 @@
+
+##############################################################################
+##############################################################################
+###           T E S T I N G                                                ###
+##############################################################################
+##############################################################################
+
+  # --------------------------------------------------------------------
+  # VDS
+  # --------------------------------------------------------------------
+  #-- Copy all the HDF5 files from the test directory into the source directory
+  set (HDF5_REFERENCE_VDS
+      tvds-1.ddl
+      tvds-2.ddl
+      tvds-3_1.ddl
+      tvds-3_2.ddl
+      tvds-4.ddl
+      tvds-5.ddl
+      tvds_layout-1.ddl
+      tvds_layout-2.ddl
+      tvds_layout-3_1.ddl
+      tvds_layout-3_2.ddl
+      tvds_layout-4.ddl
+      tvds_layout-5.ddl
+  )
+  set (HDF5_REFERENCE_TEST_VDS
+      1_a.h5
+      1_b.h5
+      1_c.h5
+      1_d.h5
+      1_e.h5
+      1_f.h5
+      1_vds.h5
+      2_a.h5
+      2_b.h5
+      2_c.h5
+      2_d.h5
+      2_e.h5
+      2_vds.h5
+      3_1_vds.h5
+      3_2_vds.h5
+      4_0.h5
+      4_1.h5
+      4_2.h5
+      4_vds.h5
+      5_a.h5
+      5_b.h5
+      5_c.h5
+      5_vds.h5
+  )
+  set (HDF5_ERROR_REFERENCE_VDS
+  )
+
+  foreach (vds_h5_file ${HDF5_REFERENCE_TEST_VDS})
+    GET_FILENAME_COMPONENT(fname "${vds_h5_file}" NAME)
+    set (dest "${PROJECT_BINARY_DIR}/testfiles/vds/${fname}")
+    #message (STATUS " Copying ${vds_h5_file}")
+    add_custom_command (
+        TARGET     h5dump
+        POST_BUILD
+        COMMAND    ${CMAKE_COMMAND}
+        ARGS       -E copy_if_different ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/${vds_h5_file} ${dest}
+    )
+  endforeach (vds_h5_file ${HDF5_REFERENCE_TEST_VDS})
+
+
+  foreach (ddl_vds ${HDF5_REFERENCE_VDS})
+    GET_FILENAME_COMPONENT(fname "${ddl_vds}" NAME)
+    set (ddldest "${PROJECT_BINARY_DIR}/testfiles/vds/${fname}")
+    #message (STATUS " Copying ${ddl_vds}")
+    add_custom_command (
+        TARGET     h5dump
+        POST_BUILD
+        COMMAND    ${CMAKE_COMMAND}
+        ARGS       -E copy_if_different ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/${ddl_vds} ${ddldest}
+    )
+  endforeach (ddl_vds ${HDF5_REFERENCE_VDS})
+
+  foreach (ddl_vds ${HDF5_ERROR_REFERENCE_VDS})
+    GET_FILENAME_COMPONENT(fname "${ddl_vds}" NAME)
+    set (ddldest "${PROJECT_BINARY_DIR}/testfiles/vds/${fname}")
+    #message (STATUS " Copying ${ddl_vds}")
+    add_custom_command (
+        TARGET     h5dump
+        POST_BUILD
+        COMMAND    ${CMAKE_COMMAND}
+        ARGS       -E copy_if_different ${PROJECT_SOURCE_DIR}/errfiles/${ddl_vds} ${ddldest}
+    )
+  endforeach (ddl_vds ${HDF5_ERROR_REFERENCE_VDS})
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S  M A C R O S                               ###
+##############################################################################
+##############################################################################
+
+  MACRO (ADD_H5_VDS_TEST resultfile resultcode)
+    # If using memchecker add tests without using scripts
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME H5DUMP-${resultfile} COMMAND $<TARGET_FILE:h5dump> ${ARGN})
+      set_tests_properties (H5DUMP-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfilesvds")
+      if (NOT ${resultcode} STREQUAL "0")
+        set_tests_properties (H5DUMP-${resultfile} PROPERTIES WILL_FAIL "true")
+      endif (NOT ${resultcode} STREQUAL "0")
+      if (NOT "${last_vds_test}" STREQUAL "")
+        set_tests_properties (H5DUMP-${resultfile} PROPERTIES DEPENDS ${last_VDS_test})
+      endif (NOT "${last_vds_test}" STREQUAL "")
+    else (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5DUMP-${resultfile}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove ${resultfile}.out ${resultfile}.out.err
+      )
+      set_tests_properties (H5DUMP-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/vds")
+      add_test (
+          NAME H5DUMP-${resultfile}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+              -D "TEST_ARGS:STRING=${ARGN}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles/vds"
+              -D "TEST_OUTPUT=${resultfile}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=${resultfile}.ddl"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5DUMP-${resultfile} PROPERTIES DEPENDS "H5DUMP-${resultfile}-clear-objects")
+    endif (HDF5_ENABLE_USING_MEMCHECKER)
+  ENDMACRO (ADD_H5_VDS_TEST file)
+
+  MACRO (ADD_H5_VDS_LAYOUT resultfile resultcode)
+    # If using memchecker add tests without using scripts
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME H5DUMP-${resultfile} COMMAND $<TARGET_FILE:h5dump> -p ${ARGN})
+      set_tests_properties (H5DUMP-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfilesvds")
+      if (NOT ${resultcode} STREQUAL "0")
+        set_tests_properties (H5DUMP-${resultfile} PROPERTIES WILL_FAIL "true")
+      endif (NOT ${resultcode} STREQUAL "0")
+      if (NOT "${last_vds_test}" STREQUAL "")
+        set_tests_properties (H5DUMP-${resultfile} PROPERTIES DEPENDS ${last_VDS_test})
+      endif (NOT "${last_vds_test}" STREQUAL "")
+    else (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5DUMP-${resultfile}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove ${resultfile}.out ${resultfile}.out.err
+      )
+      set_tests_properties (H5DUMP-${resultfile}-clear-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/vds")
+      add_test (
+          NAME H5DUMP-${resultfile}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
+              -D "TEST_ARGS:STRING=-p;${ARGN}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles/vds"
+              -D "TEST_OUTPUT=${resultfile}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=${resultfile}.ddl"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5DUMP-${resultfile} PROPERTIES DEPENDS "H5DUMP-${resultfile}-clear-objects")
+    endif (HDF5_ENABLE_USING_MEMCHECKER)
+  ENDMACRO (ADD_H5_VDS_LAYOUT file)
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S                                            ###
+##############################################################################
+##############################################################################
+
+  if (HDF5_ENABLE_USING_MEMCHECKER)
+    # Remove any output file left over from previous test run
+    add_test (
+      NAME H5DUMP_VDS-clearall-objects
+      COMMAND    ${CMAKE_COMMAND}
+          -E remove
+          tvds-1.out
+          tvds-1.out.err
+          tvds-2.out
+          tvds-2.out.err
+          tvds-3_1.out
+          tvds-3_1.out.err
+          tvds-3_2.out
+          tvds-3_2.out.err
+          tvds-4.out
+          tvds-4.out.err
+          tvds-5.out
+          tvds-5.out.err
+          tvds_layout-1.out
+          tvds_layout-1.out.err
+          tvds_layout-2.out
+          tvds_layout-2.out.err
+          tvds_layout-3_1.out
+          tvds_layout-3_1.out.err
+          tvds_layout-3_2.out
+          tvds_layout-3_2.out.err
+          tvds_layout-4.out
+          tvds_layout-4.out.err
+          tvds_layout-5.out
+          tvds_layout-5.out.err
+    )
+    set_tests_properties (H5DUMP_VDS-clearall-objects PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/vds")
+    if (NOT "${last_vds_test}" STREQUAL "")
+      set_tests_properties (H5DUMP_VDS-clearall-objects PROPERTIES DEPENDS ${last_vds_test})
+    endif (NOT "${last_vds_test}" STREQUAL "")
+    set (last_VDS_test "H5DUMP_VDS-clearall-objects")
+  endif (HDF5_ENABLE_USING_MEMCHECKER)
+
+# See which filters are usable (and skip tests for filters we
+# don't have).  Do this by searching H5pubconf.h to see which
+# filters are defined.
+
+# detect whether the encoder is present.
+  if (H5_HAVE_FILTER_DEFLATE)
+    set (USE_FILTER_DEFLATE "true")
+  endif (H5_HAVE_FILTER_DEFLATE)
+
+  if (H5_HAVE_FILTER_SZIP)
+    set (USE_FILTER_SZIP "true")
+  endif (H5_HAVE_FILTER_SZIP)
+
+  # Data read
+  if (USE_FILTER_DEFLATE)
+    ADD_H5_VDS_TEST (tvds-1 0 --enable-error-stack 1_vds.h5)
+    ADD_H5_VDS_TEST (tvds-2 0 --enable-error-stack 2_vds.h5)
+    ADD_H5_VDS_TEST (tvds-3_1 0 --enable-error-stack 3_1_vds.h5)
+    ADD_H5_VDS_TEST (tvds-3_2 0 --enable-error-stack 3_2_vds.h5)
+    ADD_H5_VDS_TEST (tvds-4 0 --enable-error-stack 4_vds.h5)
+    ADD_H5_VDS_TEST (tvds-5 0 --enable-error-stack 5_vds.h5)
+  endif (USE_FILTER_DEFLATE)
+
+  # Layout read
+  if (USE_FILTER_DEFLATE)
+    ADD_H5_VDS_LAYOUT (tvds_layout-1 0 --enable-error-stack 1_vds.h5)
+    ADD_H5_VDS_LAYOUT (tvds_layout-2 0 --enable-error-stack 2_vds.h5)
+    ADD_H5_VDS_LAYOUT (tvds_layout-3_1 0 --enable-error-stack 3_1_vds.h5)
+    ADD_H5_VDS_LAYOUT (tvds_layout-3_2 0 --enable-error-stack 3_2_vds.h5)
+    ADD_H5_VDS_LAYOUT (tvds_layout-4 0 --enable-error-stack 4_vds.h5)
+    ADD_H5_VDS_LAYOUT (tvds_layout-5 0 --enable-error-stack 5_vds.h5)
+  endif (USE_FILTER_DEFLATE)
diff --git a/tools/h5dump/Makefile.am b/tools/h5dump/Makefile.am
index cee4801..93ba195 100644
--- a/tools/h5dump/Makefile.am
+++ b/tools/h5dump/Makefile.am
@@ -25,7 +25,7 @@ AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/tools/lib
 
 # Test programs and scripts
 TEST_PROG=h5dumpgentest
-TEST_SCRIPT=testh5dump.sh testh5dumppbits.sh testh5dumpxml.sh
+TEST_SCRIPT=testh5dump.sh testh5dumppbits.sh testh5dumpvds.sh testh5dumpxml.sh
 
 check_PROGRAMS=$(TEST_PROG) binread
 check_SCRIPTS=$(TEST_SCRIPT)
diff --git a/tools/h5dump/Makefile.in b/tools/h5dump/Makefile.in
index 7371adf..032686c 100644
--- a/tools/h5dump/Makefile.in
+++ b/tools/h5dump/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -32,7 +32,17 @@
 #
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -95,24 +105,24 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/testh5dump.sh.in $(srcdir)/testh5dumppbits.sh.in \
-	$(srcdir)/testh5dumpxml.sh.in $(top_srcdir)/bin/depcomp \
-	$(top_srcdir)/bin/test-driver
 check_PROGRAMS = $(am__EXEEXT_1) binread$(EXEEXT)
 bin_PROGRAMS = h5dump$(EXEEXT)
 TESTS = $(am__EXEEXT_1) $(TEST_SCRIPT)
 subdir = tools/h5dump
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
-CONFIG_CLEAN_FILES = testh5dump.sh testh5dumppbits.sh testh5dumpxml.sh
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
+CONFIG_CLEAN_FILES = testh5dump.sh testh5dumppbits.sh testh5dumpvds.sh \
+	testh5dumpxml.sh
 CONFIG_CLEAN_VPATH_FILES =
 am__installdirs = "$(DESTDIR)$(bindir)"
 am__EXEEXT_1 = h5dumpgentest$(EXEEXT)
@@ -149,7 +159,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -399,6 +409,11 @@ am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
 TEST_LOGS = $(am__test_logs2:.sh.log=.log)
 SH_LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
 SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/testh5dump.sh.in \
+	$(srcdir)/testh5dumppbits.sh.in $(srcdir)/testh5dumpvds.sh.in \
+	$(srcdir)/testh5dumpxml.sh.in $(top_srcdir)/bin/depcomp \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -418,7 +433,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -463,14 +477,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -480,13 +502,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -528,9 +549,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -674,7 +706,7 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.h5 *.bin
 
 # Test programs and scripts
 TEST_PROG = h5dumpgentest
-TEST_SCRIPT = testh5dump.sh testh5dumppbits.sh testh5dumpxml.sh
+TEST_SCRIPT = testh5dump.sh testh5dumppbits.sh testh5dumpvds.sh testh5dumpxml.sh
 check_SCRIPTS = $(TEST_SCRIPT)
 SCRIPT_DEPEND = h5dump$(EXEEXT)
 
@@ -723,7 +755,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/h5dump/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign tools/h5dump/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -732,7 +763,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -746,6 +777,8 @@ testh5dump.sh: $(top_builddir)/config.status $(srcdir)/testh5dump.sh.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 testh5dumppbits.sh: $(top_builddir)/config.status $(srcdir)/testh5dumppbits.sh.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+testh5dumpvds.sh: $(top_builddir)/config.status $(srcdir)/testh5dumpvds.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 testh5dumpxml.sh: $(top_builddir)/config.status $(srcdir)/testh5dumpxml.sh.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 install-binPROGRAMS: $(bin_PROGRAMS)
@@ -940,7 +973,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1224,6 +1257,8 @@ uninstall-am: uninstall-binPROGRAMS
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am \
 	uninstall-binPROGRAMS
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/tools/h5dump/errfiles/tall-1.err b/tools/h5dump/errfiles/tall-1.err
index ba691d0..ab9dbe3 100644
--- a/tools/h5dump/errfiles/tall-1.err
+++ b/tools/h5dump/errfiles/tall-1.err
@@ -1,9 +1,9 @@
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
   #000: (file name) line (number) in H5Oopen(): unable to open object
-    major: Symbol table
+    major: Object header
     minor: Can't open object
   #001: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #002: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
diff --git a/tools/h5dump/errfiles/tall-2A.err b/tools/h5dump/errfiles/tall-2A.err
index ba691d0..ab9dbe3 100644
--- a/tools/h5dump/errfiles/tall-2A.err
+++ b/tools/h5dump/errfiles/tall-2A.err
@@ -1,9 +1,9 @@
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
   #000: (file name) line (number) in H5Oopen(): unable to open object
-    major: Symbol table
+    major: Object header
     minor: Can't open object
   #001: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #002: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
diff --git a/tools/h5dump/errfiles/tall-2A0.err b/tools/h5dump/errfiles/tall-2A0.err
index ba691d0..ab9dbe3 100644
--- a/tools/h5dump/errfiles/tall-2A0.err
+++ b/tools/h5dump/errfiles/tall-2A0.err
@@ -1,9 +1,9 @@
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
   #000: (file name) line (number) in H5Oopen(): unable to open object
-    major: Symbol table
+    major: Object header
     minor: Can't open object
   #001: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #002: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
diff --git a/tools/h5dump/errfiles/tall-2B.err b/tools/h5dump/errfiles/tall-2B.err
index ba691d0..ab9dbe3 100644
--- a/tools/h5dump/errfiles/tall-2B.err
+++ b/tools/h5dump/errfiles/tall-2B.err
@@ -1,9 +1,9 @@
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
   #000: (file name) line (number) in H5Oopen(): unable to open object
-    major: Symbol table
+    major: Object header
     minor: Can't open object
   #001: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #002: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
diff --git a/tools/h5dump/errfiles/tarray1_big.err b/tools/h5dump/errfiles/tarray1_big.err
index d5cd435..7a0fd7b 100644
--- a/tools/h5dump/errfiles/tarray1_big.err
+++ b/tools/h5dump/errfiles/tarray1_big.err
@@ -1,19 +1,19 @@
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
-  #000: (file name) line (number) in H5Rdereference(): unable to dereference object
+  #000: (file name) line (number) in H5Rdereference2(): unable to dereference object
     major: References
     minor: Unable to initialize object
   #001: (file name) line (number) in H5R_dereference(): Undefined reference pointer
     major: Invalid arguments to routine
     minor: Bad value
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
-  #000: (file name) line (number) in H5Rdereference(): unable to dereference object
+  #000: (file name) line (number) in H5Rdereference2(): unable to dereference object
     major: References
     minor: Unable to initialize object
   #001: (file name) line (number) in H5R_dereference(): Undefined reference pointer
     major: Invalid arguments to routine
     minor: Bad value
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
-  #000: (file name) line (number) in H5Rdereference(): unable to dereference object
+  #000: (file name) line (number) in H5Rdereference2(): unable to dereference object
     major: References
     minor: Unable to initialize object
   #001: (file name) line (number) in H5R_dereference(): Undefined reference pointer
diff --git a/tools/h5dump/errfiles/tattrregR.err b/tools/h5dump/errfiles/tattrregR.err
index c5aa5ba..9449a6d 100644
--- a/tools/h5dump/errfiles/tattrregR.err
+++ b/tools/h5dump/errfiles/tattrregR.err
@@ -1,12 +1,12 @@
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
-  #000: (file name) line (number) in H5Rdereference(): unable to dereference object
+  #000: (file name) line (number) in H5Rdereference2(): unable to dereference object
     major: References
     minor: Unable to initialize object
   #001: (file name) line (number) in H5R_dereference(): Undefined reference pointer
     major: Invalid arguments to routine
     minor: Bad value
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
-  #000: (file name) line (number) in H5Rdereference(): unable to dereference object
+  #000: (file name) line (number) in H5Rdereference2(): unable to dereference object
     major: References
     minor: Unable to initialize object
   #001: (file name) line (number) in H5R_dereference(): Undefined reference pointer
diff --git a/tools/h5dump/errfiles/tdataregR.err b/tools/h5dump/errfiles/tdataregR.err
index c5aa5ba..9449a6d 100644
--- a/tools/h5dump/errfiles/tdataregR.err
+++ b/tools/h5dump/errfiles/tdataregR.err
@@ -1,12 +1,12 @@
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
-  #000: (file name) line (number) in H5Rdereference(): unable to dereference object
+  #000: (file name) line (number) in H5Rdereference2(): unable to dereference object
     major: References
     minor: Unable to initialize object
   #001: (file name) line (number) in H5R_dereference(): Undefined reference pointer
     major: Invalid arguments to routine
     minor: Bad value
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
-  #000: (file name) line (number) in H5Rdereference(): unable to dereference object
+  #000: (file name) line (number) in H5Rdereference2(): unable to dereference object
     major: References
     minor: Unable to initialize object
   #001: (file name) line (number) in H5R_dereference(): Undefined reference pointer
diff --git a/tools/h5dump/errfiles/tdset-2.err b/tools/h5dump/errfiles/tdset-2.err
index d9b92f3..775351e 100644
--- a/tools/h5dump/errfiles/tdset-2.err
+++ b/tools/h5dump/errfiles/tdset-2.err
@@ -1,17 +1,20 @@
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
-  #000: (file name) line (number) in H5Dopen2(): not found
+  #000: (file name) line (number) in H5Dopen2(): unable to open dataset
+    major: Dataset
+    minor: Can't open object
+  #001: (file name) line (number) in H5D__open_name(): not found
     major: Dataset
     minor: Object not found
-  #001: (file name) line (number) in H5G_loc_find(): can't find object
+  #002: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
     minor: Object not found
-  #002: (file name) line (number) in H5G_traverse(): internal path traversal failed
+  #003: (file name) line (number) in H5G_traverse(): internal path traversal failed
     major: Symbol table
     minor: Object not found
-  #003: (file name) line (number) in H5G_traverse_real(): traversal operator failed
+  #004: (file name) line (number) in H5G_traverse_real(): traversal operator failed
     major: Symbol table
     minor: Callback failed
-  #004: (file name) line (number) in H5G_loc_find_cb(): object 'dset3' doesn't exist
+  #005: (file name) line (number) in H5G_loc_find_cb(): object 'dset3' doesn't exist
     major: Symbol table
     minor: Object not found
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
diff --git a/tools/h5dump/errfiles/textlink.err b/tools/h5dump/errfiles/textlink.err
index 03c0550..95556db 100644
--- a/tools/h5dump/errfiles/textlink.err
+++ b/tools/h5dump/errfiles/textlink.err
@@ -1,9 +1,9 @@
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
   #000: (file name) line (number) in H5Oopen(): unable to open object
-    major: Symbol table
+    major: Object header
     minor: Can't open object
   #001: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #002: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
@@ -25,10 +25,10 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
     minor: Unable to open file
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
   #000: (file name) line (number) in H5Oopen(): unable to open object
-    major: Symbol table
+    major: Object header
     minor: Can't open object
   #001: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #002: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
diff --git a/tools/h5dump/errfiles/textlinkfar.err b/tools/h5dump/errfiles/textlinkfar.err
index 969e17c..5aa7f87 100644
--- a/tools/h5dump/errfiles/textlinkfar.err
+++ b/tools/h5dump/errfiles/textlinkfar.err
@@ -1,9 +1,9 @@
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
   #000: (file name) line (number) in H5Oopen(): unable to open object
-    major: Symbol table
+    major: Object header
     minor: Can't open object
   #001: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #002: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
@@ -24,7 +24,7 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
     major: Symbol table
     minor: Can't open object
   #008: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #009: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
@@ -67,7 +67,7 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
     major: Symbol table
     minor: Can't open object
   #006: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #007: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
@@ -88,7 +88,7 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
     major: Symbol table
     minor: Can't open object
   #013: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #014: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
@@ -109,7 +109,7 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
     major: Symbol table
     minor: Can't open object
   #020: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #021: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
@@ -130,7 +130,7 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
     major: Symbol table
     minor: Can't open object
   #027: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #028: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
@@ -164,7 +164,7 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
     major: Symbol table
     minor: Can't open object
   #006: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #007: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
@@ -185,7 +185,7 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
     major: Symbol table
     minor: Can't open object
   #013: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #014: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
@@ -206,7 +206,7 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
     major: Symbol table
     minor: Can't open object
   #020: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #021: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
@@ -227,7 +227,7 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
     major: Symbol table
     minor: Can't open object
   #027: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #028: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
diff --git a/tools/h5dump/errfiles/textlinksrc.err b/tools/h5dump/errfiles/textlinksrc.err
index 969e17c..5aa7f87 100644
--- a/tools/h5dump/errfiles/textlinksrc.err
+++ b/tools/h5dump/errfiles/textlinksrc.err
@@ -1,9 +1,9 @@
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
   #000: (file name) line (number) in H5Oopen(): unable to open object
-    major: Symbol table
+    major: Object header
     minor: Can't open object
   #001: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #002: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
@@ -24,7 +24,7 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
     major: Symbol table
     minor: Can't open object
   #008: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #009: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
@@ -67,7 +67,7 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
     major: Symbol table
     minor: Can't open object
   #006: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #007: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
@@ -88,7 +88,7 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
     major: Symbol table
     minor: Can't open object
   #013: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #014: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
@@ -109,7 +109,7 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
     major: Symbol table
     minor: Can't open object
   #020: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #021: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
@@ -130,7 +130,7 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
     major: Symbol table
     minor: Can't open object
   #027: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #028: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
@@ -164,7 +164,7 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
     major: Symbol table
     minor: Can't open object
   #006: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #007: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
@@ -185,7 +185,7 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
     major: Symbol table
     minor: Can't open object
   #013: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #014: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
@@ -206,7 +206,7 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
     major: Symbol table
     minor: Can't open object
   #020: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #021: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
@@ -227,7 +227,7 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
     major: Symbol table
     minor: Can't open object
   #027: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #028: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
diff --git a/tools/h5dump/errfiles/torderlinks1.err b/tools/h5dump/errfiles/torderlinks1.err
index 780c7e6..e665f03 100644
--- a/tools/h5dump/errfiles/torderlinks1.err
+++ b/tools/h5dump/errfiles/torderlinks1.err
@@ -1,9 +1,9 @@
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
   #000: (file name) line (number) in H5Oopen(): unable to open object
-    major: Symbol table
+    major: Object header
     minor: Can't open object
   #001: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #002: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
diff --git a/tools/h5dump/errfiles/torderlinks2.err b/tools/h5dump/errfiles/torderlinks2.err
index 780c7e6..e665f03 100644
--- a/tools/h5dump/errfiles/torderlinks2.err
+++ b/tools/h5dump/errfiles/torderlinks2.err
@@ -1,9 +1,9 @@
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
   #000: (file name) line (number) in H5Oopen(): unable to open object
-    major: Symbol table
+    major: Object header
     minor: Can't open object
   #001: (file name) line (number) in H5O_open_name(): object not found
-    major: Symbol table
+    major: Object header
     minor: Object not found
   #002: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
diff --git a/tools/h5dump/errfiles/tperror.err b/tools/h5dump/errfiles/tperror.err
index 19a7a73..29f9e7f 100644
--- a/tools/h5dump/errfiles/tperror.err
+++ b/tools/h5dump/errfiles/tperror.err
@@ -1,17 +1,20 @@
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
-  #000: (file name) line (number) in H5Dopen2(): not found
+  #000: (file name) line (number) in H5Dopen2(): unable to open dataset
+    major: Dataset
+    minor: Can't open object
+  #001: (file name) line (number) in H5D__open_name(): not found
     major: Dataset
     minor: Object not found
-  #001: (file name) line (number) in H5G_loc_find(): can't find object
+  #002: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
     minor: Object not found
-  #002: (file name) line (number) in H5G_traverse(): internal path traversal failed
+  #003: (file name) line (number) in H5G_traverse(): internal path traversal failed
     major: Symbol table
     minor: Object not found
-  #003: (file name) line (number) in H5G_traverse_real(): traversal operator failed
+  #004: (file name) line (number) in H5G_traverse_real(): traversal operator failed
     major: Symbol table
     minor: Callback failed
-  #004: (file name) line (number) in H5G_loc_find_cb(): object 'bogus' doesn't exist
+  #005: (file name) line (number) in H5G_loc_find_cb(): object 'bogus' doesn't exist
     major: Symbol table
     minor: Object not found
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
diff --git a/tools/h5dump/errfiles/tslink-D.err b/tools/h5dump/errfiles/tslink-D.err
index b98e324..924e9cf 100644
--- a/tools/h5dump/errfiles/tslink-D.err
+++ b/tools/h5dump/errfiles/tslink-D.err
@@ -1,25 +1,28 @@
 HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs):
-  #000: (file name) line (number) in H5Dopen2(): not found
+  #000: (file name) line (number) in H5Dopen2(): unable to open dataset
+    major: Dataset
+    minor: Can't open object
+  #001: (file name) line (number) in H5D__open_name(): not found
     major: Dataset
     minor: Object not found
-  #001: (file name) line (number) in H5G_loc_find(): can't find object
+  #002: (file name) line (number) in H5G_loc_find(): can't find object
     major: Symbol table
     minor: Object not found
-  #002: (file name) line (number) in H5G_traverse(): internal path traversal failed
+  #003: (file name) line (number) in H5G_traverse(): internal path traversal failed
     major: Symbol table
     minor: Object not found
-  #003: (file name) line (number) in H5G_traverse_real(): special link traversal failed
+  #004: (file name) line (number) in H5G_traverse_real(): special link traversal failed
     major: Links
     minor: Link traversal failure
-  #004: (file name) line (number) in H5G__traverse_special(): symbolic link traversal failed
+  #005: (file name) line (number) in H5G__traverse_special(): symbolic link traversal failed
     major: Links
     minor: Link traversal failure
-  #005: (file name) line (number) in H5G_traverse_slink(): unable to follow symbolic link
+  #006: (file name) line (number) in H5G_traverse_slink(): unable to follow symbolic link
     major: Symbol table
     minor: Object not found
-  #006: (file name) line (number) in H5G_traverse_real(): traversal operator failed
+  #007: (file name) line (number) in H5G_traverse_real(): traversal operator failed
     major: Symbol table
     minor: Callback failed
-  #007: (file name) line (number) in H5G_traverse_slink_cb(): component not found
+  #008: (file name) line (number) in H5G_traverse_slink_cb(): component not found
     major: Symbol table
     minor: Object not found
diff --git a/tools/h5dump/h5dump.c b/tools/h5dump/h5dump.c
index 3c60bb0..68889c9 100644
--- a/tools/h5dump/h5dump.c
+++ b/tools/h5dump/h5dump.c
@@ -389,10 +389,10 @@ table_list_add(hid_t oid, unsigned long file_no)
 
     /* Allocate space if necessary */
     if(table_list.nused == table_list.nalloc) {
-        void        *tmp_ptr;
+        h5dump_table_items_t    *tmp_ptr;
 
         table_list.nalloc = MAX(1, table_list.nalloc * 2);
-        if(NULL == (tmp_ptr = HDrealloc(table_list.tables, table_list.nalloc * sizeof(table_list.tables[0]))))
+        if(NULL == (tmp_ptr = (h5dump_table_items_t *)HDrealloc(table_list.tables, table_list.nalloc * sizeof(table_list.tables[0]))))
             return -1;
         table_list.tables = tmp_ptr;
     } /* end if */
diff --git a/tools/h5dump/h5dump.h b/tools/h5dump/h5dump.h
index 7bfead7..2b1fb04 100644
--- a/tools/h5dump/h5dump.h
+++ b/tools/h5dump/h5dump.h
@@ -38,16 +38,17 @@ typedef struct dump_functions_t {
 } dump_functions;
 
 /* List of table structures.  There is one table structure for each file */
+typedef struct h5dump_table_items_t {
+    unsigned long   fileno;         /* File number that these tables refer to */
+    hid_t           oid;            /* ID of an object in this file, held open so fileno is consistent */
+    table_t         *group_table;   /* Table of groups */
+    table_t         *dset_table;    /* Table of datasets */
+    table_t         *type_table;    /* Table of datatypes */
+} h5dump_table_items_t;
 typedef struct h5dump_table_list_t {
-    size_t      nalloc;
-    size_t      nused;
-    struct {
-        unsigned long   fileno;         /* File number that these tables refer to */
-        hid_t           oid;            /* ID of an object in this file, held open so fileno is consistent */
-        table_t         *group_table;   /* Table of groups */
-        table_t         *dset_table;    /* Table of datasets */
-        table_t         *type_table;    /* Table of datatypes */
-    } *tables;
+    size_t                  nalloc;
+    size_t                  nused;
+    h5dump_table_items_t    *tables;
 } h5dump_table_list_t;
 
 h5dump_table_list_t  table_list = {0, 0, NULL};
diff --git a/tools/h5dump/h5dump_ddl.c b/tools/h5dump/h5dump_ddl.c
index 43d397c..fd50710 100644
--- a/tools/h5dump/h5dump_ddl.c
+++ b/tools/h5dump/h5dump_ddl.c
@@ -377,6 +377,8 @@ dump_all_cb(hid_t group, const char *name, const H5L_info_t *linfo, void H5_ATTR
             }
             break;
 
+        case H5O_TYPE_UNKNOWN:
+        case H5O_TYPE_NTYPES:
         default:
             error_msg("unknown object \"%s\"\n", name);
             h5tools_setstatus(EXIT_FAILURE);
@@ -509,6 +511,11 @@ dump_all_cb(hid_t group, const char *name, const H5L_info_t *linfo, void H5_ATTR
             HDfree(targbuf);
             break;
 
+        case H5L_TYPE_ERROR:
+        case H5L_TYPE_MAX:
+            HDassert(0);
+            /* fall through */
+        case H5L_TYPE_HARD:
         default:
             ctx.need_prefix = TRUE;
             h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
@@ -1054,7 +1061,10 @@ dump_dataset(hid_t did, const char *name, struct subset_t *sset)
                 }
                 break;
 
+            case H5T_NO_CLASS:
+            case H5T_NCLASSES:
             default:
+                HDassert(0);
                 break;
             } /* end switch */
         } /* for(i=0;i<data_loop;i++) */
@@ -1154,10 +1164,9 @@ dump_fcpl(hid_t fid)
     hsize_t  userblock; /* userblock size retrieved from FCPL */
     size_t   off_size;  /* size of offsets in the file */
     size_t   len_size;  /* size of lengths in the file */
-    unsigned super;     /* superblock version # */
-    unsigned freelist;  /* free list version # */
-    unsigned stab;      /* symbol table entry version # */
-    unsigned shhdr;     /* shared object header version # */
+    H5F_file_space_type_t  fs_strategy;  /* file space strategy */
+    hsize_t  fs_threshold;    /* free-space section threshold */
+    H5F_info2_t finfo;  /* file information */
 #ifdef SHOW_FILE_DRIVER
     hid_t    fapl;      /* file access property list ID */
     hid_t    fdriver;   /* file driver */
@@ -1168,11 +1177,12 @@ dump_fcpl(hid_t fid)
     unsigned istore_ik; /* indexed storage B-tree internal 'K' value */
 
     fcpl=H5Fget_create_plist(fid);
-    H5Pget_version(fcpl, &super, &freelist, &stab, &shhdr);
+    H5Fget_info2(fid, &finfo);
     H5Pget_userblock(fcpl,&userblock);
     H5Pget_sizes(fcpl,&off_size,&len_size);
     H5Pget_sym_k(fcpl,&sym_ik,&sym_lk);
     H5Pget_istore_k(fcpl,&istore_ik);
+    H5Pget_file_space(fcpl, &fs_strategy, &fs_threshold);
     H5Pclose(fcpl);
 #ifdef SHOW_FILE_DRIVER
     fapl=h5_fileaccess();
@@ -1186,13 +1196,13 @@ dump_fcpl(hid_t fid)
     */
     PRINTSTREAM(rawoutstream, "\n%s %s\n",SUPER_BLOCK, BEGIN);
     indentation(dump_indent + COL);
-    PRINTSTREAM(rawoutstream, "%s %u\n","SUPERBLOCK_VERSION", super);
+    PRINTSTREAM(rawoutstream, "%s %u\n","SUPERBLOCK_VERSION", finfo.super.version);
     indentation(dump_indent + COL);
-    PRINTSTREAM(rawoutstream, "%s %u\n","FREELIST_VERSION", freelist);
+    PRINTSTREAM(rawoutstream, "%s %u\n","FREELIST_VERSION", finfo.free.version);
     indentation(dump_indent + COL);
-    PRINTSTREAM(rawoutstream, "%s %u\n","SYMBOLTABLE_VERSION", stab);
+    PRINTSTREAM(rawoutstream, "%s %u\n","SYMBOLTABLE_VERSION", 0);  /* Retain this for backward compatibility, for now (QAK) */
     indentation(dump_indent + COL);
-    PRINTSTREAM(rawoutstream, "%s %u\n","OBJECTHEADER_VERSION", shhdr);
+    PRINTSTREAM(rawoutstream, "%s %u\n","OBJECTHEADER_VERSION", finfo.sohm.version);
     indentation(dump_indent + COL);
     PRINTSTREAM(rawoutstream,"%s %zu\n","OFFSET_SIZE", off_size);
     indentation(dump_indent + COL);
@@ -1232,6 +1242,20 @@ dump_fcpl(hid_t fid)
     indentation(dump_indent + COL);
     PRINTSTREAM(rawoutstream, "%s %u\n","ISTORE_K", istore_ik);
 
+    indentation(dump_indent + COL);
+    if(fs_strategy == H5F_FILE_SPACE_ALL_PERSIST) {
+        PRINTSTREAM(rawoutstream, "%s %s\n", "FILE_SPACE_STRATEGY", "H5F_FILE_SPACE_ALL_PERSIST");
+    } else if(fs_strategy == H5F_FILE_SPACE_ALL) {
+        PRINTSTREAM(rawoutstream, "%s %s\n", "FILE_SPACE_STRATEGY", "H5F_FILE_SPACE_ALL");
+    } else if(fs_strategy == H5F_FILE_SPACE_AGGR_VFD) {
+        PRINTSTREAM(rawoutstream, "%s %s\n", "FILE_SPACE_STRATEGY", "H5F_FILE_SPACE_AGGR_VFD");
+    } else if(fs_strategy == H5F_FILE_SPACE_VFD) {
+        PRINTSTREAM(rawoutstream, "%s %s\n", "FILE_SPACE_STRATEGY", "H5F_FILE_SPACE_VFD");
+    } else
+        PRINTSTREAM(rawoutstream, "%s %s\n", "FILE_SPACE_STRATEGY", "Unknown strategy");
+    indentation(dump_indent + COL);
+    PRINTSTREAM(rawoutstream, "%s %Hu\n","FREE_SPACE_THRESHOLD", fs_threshold);
+
     /*-------------------------------------------------------------------------
     * USER_BLOCK
     *-------------------------------------------------------------------------
@@ -1269,9 +1293,8 @@ dump_fcontents(hid_t fid)
         unsigned u;
 
         for (u = 0; u < type_table->nobjs; u++) {
-            if (!type_table->objs[u].recorded) {
+            if (!type_table->objs[u].recorded)
                 PRINTSTREAM(rawoutstream, " %-10s /#"H5_PRINTF_HADDR_FMT"\n", "datatype", type_table->objs[u].objno);
-            }
         }
     }
 
@@ -1495,10 +1518,10 @@ handle_paths(hid_t fid, const char *path_name, void H5_ATTR_UNUSED * data, int H
 void
 handle_attributes(hid_t fid, const char *attr, void H5_ATTR_UNUSED * data, int H5_ATTR_UNUSED pe, const char H5_ATTR_UNUSED *display_name)
 {
-    hid_t  oid = -1;
-    hid_t  attr_id = -1;
-    char *obj_name;
-    char *attr_name;
+    hid_t  oid          = -1;
+    hid_t  attr_id      = -1;
+    char *obj_name      = NULL;
+    char *attr_name     = NULL;
     int j;
     h5tools_str_t buffer;          /* string into which to render   */
     h5tools_context_t ctx;            /* print context  */
@@ -1915,6 +1938,11 @@ handle_links(hid_t fid, const char *links, void H5_ATTR_UNUSED * data, int H5_AT
             end_obj(h5tools_dump_header_format->extlinkend, h5tools_dump_header_format->extlinkblockend);
             break;
 
+        case H5L_TYPE_ERROR:
+        case H5L_TYPE_MAX:
+            HDassert(0);
+            /* fall through */
+        case H5L_TYPE_HARD:
         default:
             begin_obj(h5tools_dump_header_format->udlinkbegin, links, h5tools_dump_header_format->udlinkblockbegin);
             PRINTVALSTREAM(rawoutstream, "\n");
@@ -2082,6 +2110,8 @@ dump_extlink(hid_t group, const char *linkname, const char *objname)
             case H5O_TYPE_NAMED_DATATYPE:
                 handle_datatypes(group, linkname, NULL, 0, objname);
                 break;
+            case H5O_TYPE_UNKNOWN:
+            case H5O_TYPE_NTYPES:
             default:
                 h5tools_setstatus(EXIT_FAILURE);
         }
diff --git a/tools/h5dump/h5dump_ddl.h b/tools/h5dump/h5dump_ddl.h
index 6cd9181..2b3f61e 100644
--- a/tools/h5dump/h5dump_ddl.h
+++ b/tools/h5dump/h5dump_ddl.h
@@ -34,6 +34,10 @@ void      dump_fcontents(hid_t fid);
 /* callback function used by H5Aiterate2() */
 herr_t    dump_attr_cb(hid_t loc_id, const char *attr_name, const H5A_info_t *info, void *_op_data);
 
+/* other iteration functions */
+void link_iteration(hid_t gid, unsigned crt_order_flags);
+void attr_iteration(hid_t gid, unsigned attr_crt_order_flags);
+
 void handle_paths(hid_t fid, const char *path_name, void *data, int pe, const char *display_name);
 void handle_datasets(hid_t fid, const char *dset, void *data, int pe, const char *display_name);
 void handle_attributes(hid_t fid, const char *attr, void H5_ATTR_UNUSED * data, int H5_ATTR_UNUSED pe, const char H5_ATTR_UNUSED *display_name);
diff --git a/tools/h5dump/h5dump_defines.h b/tools/h5dump/h5dump_defines.h
index f1c4451..2be2dcc 100644
--- a/tools/h5dump/h5dump_defines.h
+++ b/tools/h5dump/h5dump_defines.h
@@ -23,26 +23,25 @@
 #define COL             3
 
 /* Macros for displaying objects */
-#define begin_obj(obj,name,begin)                                                \
-    do {                                                                         \
-        if ((name)) {                                                            \
+#define begin_obj(obj,name,begin)                                           \
+    do {                                                                    \
+        if ((name)) {                                                       \
             PRINTSTREAM(rawoutstream, "%s \"%s\" %s", (obj), (name), (begin));   \
-        } else {                                                                 \
-            PRINTSTREAM(rawoutstream, "%s %s", (obj), (begin));                  \
-        }                                                                        \
+        }                                                                   \
+        else {                                                              \
+            PRINTSTREAM(rawoutstream, "%s %s", (obj), (begin));             \
+        }                                                                   \
     } while(0);
 
-#define end_obj(obj,end)                               \
-    do {                                               \
-        if(HDstrlen(end)) {                            \
-            PRINTSTREAM(rawoutstream, "%s", end);      \
-            if(HDstrlen(obj)) {                        \
-                PRINTVALSTREAM(rawoutstream, " ");     \
-            }                                          \
-        }                                              \
-        if(HDstrlen(obj)) {                            \
-            PRINTSTREAM(rawoutstream, "%s", obj);      \
-        }                                              \
+#define end_obj(obj,end)                                                    \
+    do {                                                                    \
+        if(HDstrlen(end)) {                                                 \
+            PRINTSTREAM(rawoutstream, "%s", end);                           \
+            if(HDstrlen(obj))                                               \
+                PRINTVALSTREAM(rawoutstream, " ");                          \
+        }                                                                   \
+        if(HDstrlen(obj))                                                   \
+            PRINTSTREAM(rawoutstream, "%s", obj);                           \
     } while(0);
 
 
diff --git a/tools/h5dump/h5dump_xml.c b/tools/h5dump/h5dump_xml.c
index 353a0c3..00f894b 100644
--- a/tools/h5dump/h5dump_xml.c
+++ b/tools/h5dump/h5dump_xml.c
@@ -69,6 +69,7 @@ static h5tool_format_t         xml_dataformat = {
     "",             /*cmpd_pre */
     "",             /*cmpd_suf */
     "",             /*cmpd_end */
+    "",             /*cmpd_listv */
 
     " ",            /*vlen_sep */
     " ",            /*vlen_pre */
@@ -359,6 +360,8 @@ xml_dump_all_cb(hid_t group, const char *name, const H5L_info_t *linfo, void H5_
             }
             break;
 
+        case H5O_TYPE_UNKNOWN:
+        case H5O_TYPE_NTYPES:
         default:
             error_msg("unknown object \"%s\"\n", name);
             h5tools_setstatus(EXIT_FAILURE);
@@ -521,42 +524,48 @@ xml_dump_all_cb(hid_t group, const char *name, const H5L_info_t *linfo, void H5_
             HDfree(targbuf);
             break;
 
+        case H5L_TYPE_ERROR:
+        case H5L_TYPE_MAX:
+            HDassert(0);
+            /* fall through */
+        case H5L_TYPE_HARD:
         default:
-        {
-            char linkxid[100];
-            char parentxid[100];
-            char *t_name = xml_escape_the_name(name);
-            char *t_prefix = xml_escape_the_name(HDstrcmp(prefix,"") ? prefix : "/");
-            char *t_obj_path = xml_escape_the_name(obj_path);
+            {
+                char linkxid[100];
+                char parentxid[100];
+                char *t_name = xml_escape_the_name(name);
+                char *t_prefix = xml_escape_the_name(HDstrcmp(prefix,"") ? prefix : "/");
+                char *t_obj_path = xml_escape_the_name(obj_path);
 
-            /* Create OBJ-XIDs for the parent and object */
-            xml_name_to_XID(t_obj_path, linkxid, (int)sizeof(linkxid), 1);
-            xml_name_to_XID(prefix, parentxid, (int)sizeof(parentxid), 1);
+                /* Create OBJ-XIDs for the parent and object */
+                xml_name_to_XID(t_obj_path, linkxid, (int)sizeof(linkxid), 1);
+                xml_name_to_XID(prefix, parentxid, (int)sizeof(parentxid), 1);
 
-            ctx.need_prefix = TRUE;
-            h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
+                ctx.need_prefix = TRUE;
+                h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
 
-            /* Render the element */
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "<%sUserDefined LinkName=\"%s\" "
-                    "OBJ-XID=\"%s\" "
-                    "H5SourcePath=\"%s\" "
-                    "LinkClass=\"%d\"  "
-                    "Parents=\"%s\" H5ParentPaths=\"%s\" />",
-                    xmlnsprefix,
-                    t_name,             /* LinkName */
-                    linkxid,            /* OBJ-XID */
-                    t_obj_path,         /* H5SourcePath */
-                    linfo->type,        /* LinkClass */
-                    parentxid,          /* Parents */
-                    t_prefix);          /* H5ParentPaths */
-            h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
-            
-            HDfree(t_prefix);
-            HDfree(t_name);
-            HDfree(t_obj_path);
-        }
+                /* Render the element */
+                h5tools_str_reset(&buffer);
+                h5tools_str_append(&buffer, "<%sUserDefined LinkName=\"%s\" "
+                        "OBJ-XID=\"%s\" "
+                        "H5SourcePath=\"%s\" "
+                        "LinkClass=\"%d\"  "
+                        "Parents=\"%s\" H5ParentPaths=\"%s\" />",
+                        xmlnsprefix,
+                        t_name,             /* LinkName */
+                        linkxid,            /* OBJ-XID */
+                        t_obj_path,         /* H5SourcePath */
+                        linfo->type,        /* LinkClass */
+                        parentxid,          /* Parents */
+                        t_prefix);          /* H5ParentPaths */
+                h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
+                
+                HDfree(t_prefix);
+                HDfree(t_name);
+                HDfree(t_obj_path);
+            }
         break;
+
         } /* end switch */
     } /* end else */
 
@@ -969,29 +978,36 @@ xml_print_datatype(hid_t type, unsigned in_group)
             h5tools_str_reset(&buffer);
             h5tools_str_append(&buffer, "<%sIntegerType ByteOrder=\"",xmlnsprefix);
             switch (ord) {
-            case H5T_ORDER_LE:
-                h5tools_str_append(&buffer, "LE");
-                break;
-            case H5T_ORDER_BE:
-                h5tools_str_append(&buffer, "BE");
-                break;
-            case H5T_ORDER_VAX:
-            default:
-                h5tools_str_append(&buffer, "ERROR_UNKNOWN");
-            }
+                case H5T_ORDER_LE:
+                    h5tools_str_append(&buffer, "LE");
+                    break;
+                case H5T_ORDER_BE:
+                    h5tools_str_append(&buffer, "BE");
+                    break;
+                case H5T_ORDER_VAX:
+                case H5T_ORDER_MIXED:
+                case H5T_ORDER_NONE:
+                case H5T_ORDER_ERROR:
+                default:
+                    h5tools_str_append(&buffer, "ERROR_UNKNOWN");
+                    break;
+            } /* end switch */
             
             h5tools_str_append(&buffer, "\" Sign=\"");
             
             switch (sgn) {
-            case H5T_SGN_NONE:
-                h5tools_str_append(&buffer, "false");
-                break;
-            case H5T_SGN_2:
-                h5tools_str_append(&buffer, "true");
-                break;
-            default:
-                h5tools_str_append(&buffer, "ERROR_UNKNOWN");
-            }
+                case H5T_SGN_NONE:
+                    h5tools_str_append(&buffer, "false");
+                    break;
+                case H5T_SGN_2:
+                    h5tools_str_append(&buffer, "true");
+                    break;
+                case H5T_SGN_ERROR:
+                case H5T_NSGN:
+                default:
+                    h5tools_str_append(&buffer, "ERROR_UNKNOWN");
+                    break;
+            } /* end switch */
             
             h5tools_str_append(&buffer, "\" Size=\"");
             sz = H5Tget_size(type);
@@ -1033,18 +1049,21 @@ xml_print_datatype(hid_t type, unsigned in_group)
             h5tools_str_append(&buffer, "<%sFloatType ByteOrder=\"",xmlnsprefix);
             
             switch (ord) {
-            case H5T_ORDER_LE:
-                h5tools_str_append(&buffer, "LE");
-                break;
-            case H5T_ORDER_BE:
-                h5tools_str_append(&buffer, "BE");
-                break;
-            case H5T_ORDER_VAX:
-                h5tools_str_append(&buffer, "VAX");
-                break;
-            default:
-                h5tools_str_append(&buffer, "ERROR_UNKNOWN");
-            }
+                case H5T_ORDER_LE:
+                    h5tools_str_append(&buffer, "LE");
+                    break;
+                case H5T_ORDER_BE:
+                    h5tools_str_append(&buffer, "BE");
+                    break;
+                case H5T_ORDER_VAX:
+                    h5tools_str_append(&buffer, "VAX");
+                    break;
+                case H5T_ORDER_MIXED:
+                case H5T_ORDER_NONE:
+                case H5T_ORDER_ERROR:
+                default:
+                    h5tools_str_append(&buffer, "ERROR_UNKNOWN");
+            } /* end switch */
             
             h5tools_str_append(&buffer, "\" Size=\"");
             sz = H5Tget_size(type);
@@ -1172,16 +1191,19 @@ xml_print_datatype(hid_t type, unsigned in_group)
             h5tools_str_append(&buffer, "<%sBitfieldType ByteOrder=\"",xmlnsprefix);
             
             switch (ord) {
-            case H5T_ORDER_LE:
-                h5tools_str_append(&buffer, "LE");
-                break;
-            case H5T_ORDER_BE:
-                h5tools_str_append(&buffer, "BE");
-                break;
-            case H5T_ORDER_VAX:
-            default:
-                h5tools_str_append(&buffer, "ERROR_UNKNOWN");
-            }
+                case H5T_ORDER_LE:
+                    h5tools_str_append(&buffer, "LE");
+                    break;
+                case H5T_ORDER_BE:
+                    h5tools_str_append(&buffer, "BE");
+                    break;
+                case H5T_ORDER_VAX:
+                case H5T_ORDER_MIXED:
+                case H5T_ORDER_NONE:
+                case H5T_ORDER_ERROR:
+                default:
+                    h5tools_str_append(&buffer, "ERROR_UNKNOWN");
+            } /* end switch */
             
             size = H5Tget_size(type);
             h5tools_str_append(&buffer, "\" Size=\"%lu\"/>", (unsigned long)size);
@@ -1516,6 +1538,10 @@ xml_print_datatype(hid_t type, unsigned in_group)
             H5Tclose(super);
             break;
 
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+            HDassert(0);
+            /* fall through */
         default:
             ctx.need_prefix = TRUE;
             h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
@@ -1813,6 +1839,7 @@ xml_dump_dataspace(hid_t space)
        break;
 #endif /* TMP */
 
+    case H5S_NULL:
     case H5S_NO_CLASS:
     default:
         ctx.need_prefix = TRUE;
@@ -2246,6 +2273,10 @@ xml_dump_attr(hid_t attr, const char *attr_name, const H5A_info_t H5_ATTR_UNUSED
 
                 dump_function_table->dump_data_function(attr_id, ATTRIBUTE_DATA, NULL, 0);
                 break;
+            case H5T_NO_CLASS:
+            case H5T_NCLASSES:
+                HDassert(0);
+                /* fall through */
             default:
                 ctx.need_prefix = TRUE;
                 h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
@@ -2938,9 +2969,9 @@ static int
 xml_print_refs(hid_t did, int source)
 {
     herr_t      e;
-    hid_t       type;
-    hid_t       space;
-    hssize_t    ssiz;
+    hid_t       type    = -1;
+    hid_t       space   = -1;
+    hssize_t    ssiz    = -1;
     hsize_t     i;
     size_t      tsiz;
     hobj_ref_t *refbuf = NULL;
@@ -3095,11 +3126,11 @@ static int
 xml_print_strs(hid_t did, int source)
 {
     herr_t      e;
-    hid_t       type;
-    hid_t       space;
-    hssize_t    ssiz;
+    hid_t       type    = -1;
+    hid_t       space   = -1;
+    hssize_t    ssiz    = -1;
     htri_t      is_vlstr = FALSE;
-    size_t      tsiz;
+    size_t      tsiz    = 0;
     size_t      i;
     size_t      str_size = 0;
     char       *bp = NULL;
@@ -3563,7 +3594,7 @@ xml_dump_fill_value(hid_t dcpl, hid_t type)
 
             /* Render the element */
             h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "\"%f\"", *(float *) buf);
+            h5tools_str_append(&buffer, "\"%f\"", (double)*(float *)buf);
             h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
 
             ctx.need_prefix = TRUE;
@@ -3701,6 +3732,12 @@ xml_dump_fill_value(hid_t dcpl, hid_t type)
             h5tools_str_append(&buffer, "<%sNoData />", xmlnsprefix);
             h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
             break;
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+            HDassert(0);
+            /* fall through */
+        case H5T_STRING:
+        case H5T_REFERENCE:
         default:
             ctx.need_prefix = TRUE;
             h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
@@ -4004,37 +4041,43 @@ xml_dump_dataset(hid_t did, const char *name, struct subset_t H5_ATTR_UNUSED * s
     H5Pget_fill_time(dcpl, &ft);
     h5tools_str_append(&buffer, "FillTime=\"");
     switch (ft) {
-    case H5D_FILL_TIME_ALLOC:
-        h5tools_str_append(&buffer, "FillOnAlloc");
-        break;
-    case H5D_FILL_TIME_NEVER:
-        h5tools_str_append(&buffer, "FillNever");
-        break;
-    case H5D_FILL_TIME_IFSET:
-        h5tools_str_append(&buffer, "FillIfSet");
-        break;
-    default:
-        h5tools_str_append(&buffer, "?");
-        break;
-    }
+        case H5D_FILL_TIME_ALLOC:
+            h5tools_str_append(&buffer, "FillOnAlloc");
+            break;
+        case H5D_FILL_TIME_NEVER:
+            h5tools_str_append(&buffer, "FillNever");
+            break;
+        case H5D_FILL_TIME_IFSET:
+            h5tools_str_append(&buffer, "FillIfSet");
+            break;
+        case H5D_FILL_TIME_ERROR:
+            HDassert(0);
+            /* fall through */
+        default:
+            h5tools_str_append(&buffer, "?");
+            break;
+    } /* end switch */
     h5tools_str_append(&buffer, "\" ");
     H5Pget_alloc_time(dcpl, &at);
     h5tools_str_append(&buffer, "AllocationTime=\"");
     switch (at) {
-    case H5D_ALLOC_TIME_EARLY:
-        h5tools_str_append(&buffer, "Early");
-        break;
-    case H5D_ALLOC_TIME_INCR:
-        h5tools_str_append(&buffer, "Incremental");
-        break;
-    case H5D_ALLOC_TIME_LATE:
-        h5tools_str_append(&buffer, "Late");
-        break;
-    case H5D_ALLOC_TIME_DEFAULT:
-    default:
-        h5tools_str_append(&buffer, "?");
-        break;
-    }
+        case H5D_ALLOC_TIME_EARLY:
+            h5tools_str_append(&buffer, "Early");
+            break;
+        case H5D_ALLOC_TIME_INCR:
+            h5tools_str_append(&buffer, "Incremental");
+            break;
+        case H5D_ALLOC_TIME_LATE:
+            h5tools_str_append(&buffer, "Late");
+            break;
+        case H5D_ALLOC_TIME_DEFAULT:
+        case H5D_ALLOC_TIME_ERROR:
+            HDassert(0);
+            /* fall through */
+        default:
+            h5tools_str_append(&buffer, "?");
+            break;
+    } /* end switch */
     h5tools_str_append(&buffer, "\"");
     h5tools_str_append(&buffer, ">");
     h5tools_render_element(rawoutstream, outputformat, &ctx, &buffer, &curr_pos, (size_t)outputformat->line_ncols, (hsize_t)0, (hsize_t)0);
@@ -4255,6 +4298,11 @@ xml_dump_dataset(hid_t did, const char *name, struct subset_t H5_ATTR_UNUSED * s
             ctx.indent_level--;
             dump_indent -= COL;
             break;
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+            HDassert(0);
+            /* fall through */
+
         default:
             ctx.need_prefix = TRUE;
             h5tools_simple_prefix(rawoutstream, outputformat, &ctx, (hsize_t)0, 0);
diff --git a/tools/h5dump/h5dumpgentest.c b/tools/h5dump/h5dumpgentest.c
index 785b1e6..0eeaec5 100644
--- a/tools/h5dump/h5dumpgentest.c
+++ b/tools/h5dump/h5dumpgentest.c
@@ -93,11 +93,12 @@
 #define FILE61  "textlinksrc.h5"
 #define FILE62  "textlinktar.h5"
 #define FILE63  "textlinkfar.h5"
-#define FILE64  "tarray8.h5"
-#define FILE65  "tattrreg.h5"
+#define FILE64  "tattrreg.h5"
+#define FILE65  "file_space.h5"
 #define FILE66  "packedbits.h5"
 #define FILE67  "zerodim.h5"
 #define FILE68  "charsets.h5"
+#define FILE68a "tdset_idx.h5"
 #define FILE69  "tattrintsize.h5"
 #define FILE70  "tcmpdintsize.h5"
 #define FILE71  "tcmpdattrintsize.h5"
@@ -227,6 +228,10 @@ typedef struct s1_t {
 #define ARRAY3_DIM1 6
 #define ARRAY3_DIM2 3
 
+/* VL string datatype name */
+/* TODO remove complier error not used, remove the link when everything is OK */
+/* #define VLSTR_TYPE      "vl_string_type" */
+
 /* "File 41" macros */
 /* Name of dataset to create in datafile                              */
 #define F41_DATASETNAME   "CompoundComplex"
@@ -256,11 +261,16 @@ typedef struct s1_t {
 #define F51_MAX_NAME_LEN    ((64*1024)+1024)
 
 /* "File 64" macros */
+#define F64_FILE            "tarray8.h5"
 #define F64_DATASET         "DS1"
 #define F64_DIM0            1
 #define F64_ARRAY_BUF_LEN   (4*1024)
 #define F64_DIM1            (F64_ARRAY_BUF_LEN / sizeof(int) + 1)
 
+/* File 65 macros */
+#define STRATEGY  H5F_FILE_SPACE_AGGR_VFD  /* File space handling strategy */
+#define THRESHOLD10   10          /* Free space section threshold */
+
 /* "FILE66" macros and for FILE69 */
 #define F66_XDIM	    8
 #define F66_DATASETU08        "DU08BITS"
@@ -277,6 +287,16 @@ typedef struct s1_t {
 #define F66_YDIM64      64
 #define F66_DUMMYDBL	    "DummyDBL"
 
+/* Declarations for gent_dataset_idx() for "FILE68a" */
+#define F68a_DSET_FIXED		"dset_fixed"
+#define F68a_DSET_FIXED_FILTER	"dset_filter"
+#define F68a_DSET_BTREE		"dset_btree"
+#define F68a_DIM200		200
+#define F68a_DIM100		100
+#define F68a_DIM20		20
+#define F68a_DIM10		10
+#define F68a_CHUNK		5
+
 /* "FILE70" macros and for FILE71 */
 /* Name of dataset to create in datafile   */
 #define F70_DATASETNAME   "CompoundIntSize"
@@ -3422,7 +3442,7 @@ static void gent_array8(void)
     /*
      * Create a new file using the default properties.
      */
-    file = H5Fcreate (FILE64, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+    file = H5Fcreate (F64_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
 
     /*
      * Create array datatypes for file and memory.
@@ -6977,6 +6997,117 @@ gent_extlinks(void)
 }
 
 /*-------------------------------------------------------------------------
+ * Function:    gent_fs_strategy_threshold
+ *
+ * Purpose:     Generate a file with non-default file space strategy and
+ *    non-default free-space section threshold.
+ *-------------------------------------------------------------------------
+ */
+static void
+gent_fs_strategy_threshold(void)
+{
+    hid_t    fid;  /* File id */
+    hid_t    fcpl;  /* File creation property */
+
+    /* Create file-creation template */
+    fcpl = H5Pcreate(H5P_FILE_CREATE);
+
+    /* Set file space information */
+    H5Pset_file_space(fcpl, STRATEGY, (hsize_t)THRESHOLD10);
+
+    /* Create the file with the specified strategy and threshold */
+    fid = H5Fcreate(FILE65, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT);
+
+    /* close */
+    H5Fclose(fid);
+    H5Pclose(fcpl);
+}
+
+/*
+ * Create a file with new format:
+ * Create one dataset with (set_chunk, fixed dims, null max. dims) 
+ *	so that Fixed Array indexing will be used.
+ * Create one dataset with (set_chunk, fixed dims, null max. dims, filter) 
+ *	so that Fixed Array indexing will be used.
+ * Create one dataset with (set_chunk, fixed dims, fixed max. dims)
+ *	so that Fixed Array indexing will be used.
+ * 
+ * Modifications:
+ *	Fixed Array indexing will be used for chunked dataset
+ *	with fixed max. dims setting.
+ *
+ */
+static void
+gent_dataset_idx(void)
+{
+    hid_t fid, space, dcpl, fapl;
+    hsize_t dims[2];
+    hsize_t maxdims[2];
+    int buf[20][10];
+    int i, j, ret;
+
+    /* Get a copy of the file aaccess property */
+    fapl = H5Pcreate(H5P_FILE_ACCESS);
+
+    /* Set the "use the latest version of the format" bounds for creating objects in the file */
+    ret = H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
+    assert(ret >= 0);
+
+    fid = H5Fcreate(FILE68a, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
+    dcpl = H5Pcreate(H5P_DATASET_CREATE);
+
+    dims[0] = F68a_CHUNK;
+    dims[1] = F68a_CHUNK;
+
+    /* set chunk */
+    ret = H5Pset_chunk(dcpl, RANK, dims);
+    assert(ret >= 0);
+
+    /* dataset with fixed dimensions */
+    dims[0] = F68a_DIM20; 
+    dims[1] = F68a_DIM10;
+    space = H5Screate_simple(RANK, dims, NULL);
+
+    for(i = 0; i < F68a_DIM20; i++)
+         for(j = 0; j < F68a_DIM10; j++)
+              buf[i][j] = j;
+
+    ret = make_dset(fid, F68a_DSET_FIXED, space, H5T_NATIVE_INT, dcpl, buf);
+    assert(ret >= 0);
+    H5Sclose(space);
+
+    /* dataset with non-fixed dimensions */
+    maxdims[0] = F68a_DIM200; 
+    maxdims[1] = F68a_DIM100;
+    space = H5Screate_simple(RANK, dims, maxdims);
+
+    ret = make_dset(fid, F68a_DSET_BTREE, space, H5T_NATIVE_INT, dcpl, buf);
+    assert(ret >= 0);
+    H5Sclose(space);
+
+#if defined (H5_HAVE_FILTER_DEFLATE)
+
+    /* dataset with fixed dimensions and filters */
+    /* remove the filters from the dcpl */
+    ret = H5Premove_filter(dcpl, H5Z_FILTER_ALL);
+    assert(ret >= 0);
+
+    /* set deflate data */
+    ret = H5Pset_deflate(dcpl, 9);
+    assert(ret >= 0);
+
+    space = H5Screate_simple(RANK, dims, NULL);
+    ret = make_dset(fid, F68a_DSET_FIXED_FILTER, space, H5T_NATIVE_INT, dcpl, buf);
+    assert(ret >= 0);
+
+    H5Sclose(space);
+#endif
+
+    H5Pclose(dcpl);
+    H5Fclose(fid);
+}
+
+/*-------------------------------------------------------------------------
  * Function:    gent_packedbits
  *
  * Purpose:     Generate a file to be used in the h5dump packed bits tests.
@@ -7014,9 +7145,8 @@ gent_packedbits(void)
     valu8bits = (uint8_t) ~0u;  /* all 1s */
     for(i = 0; i < dims[0]; i++){
         dsetu8[i][0] = valu8bits;
-        for(j = 1; j < dims[1]; j++) {
+        for(j = 1; j < dims[1]; j++)
             dsetu8[i][j] = dsetu8[i][j-1] << 1;
-        }
         valu8bits <<= 1;
     }
 
@@ -7032,9 +7162,8 @@ gent_packedbits(void)
     valu16bits = (uint16_t) ~0u;	/* all 1s */
     for(i = 0; i < dims[0]; i++){
         dsetu16[i][0] = valu16bits;
-        for(j = 1; j < dims[1]; j++) {
+        for(j = 1; j < dims[1]; j++)
             dsetu16[i][j] = dsetu16[i][j-1] << 1;
-        }
         valu16bits <<= 1;
     }
 
@@ -7050,9 +7179,8 @@ gent_packedbits(void)
     valu32bits = (uint32_t) ~0u;	/* all 1s */
     for(i = 0; i < dims[0]; i++){
         dsetu32[i][0] = valu32bits;
-        for(j = 1; j < dims[1]; j++) {
+        for(j = 1; j < dims[1]; j++)
             dsetu32[i][j] = dsetu32[i][j-1] << 1;
-        }
         valu32bits <<= 1;
     }
 
@@ -7068,9 +7196,8 @@ gent_packedbits(void)
     valu64bits = (uint64_t) ~0Lu;    /* all 1s */
     for(i = 0; i < dims[0]; i++){
         dsetu64[i][0] = valu64bits;
-        for(j = 1; j < dims[1]; j++) {
+        for(j = 1; j < dims[1]; j++)
             dsetu64[i][j] = dsetu64[i][j-1] << 1;
-        }
         valu64bits <<= 1;
     }
 
@@ -7086,9 +7213,8 @@ gent_packedbits(void)
     val8bits = (int8_t) ~0;	/* all 1s */
     for(i = 0; i < dims[0]; i++){
         dset8[i][0] = val8bits;
-        for(j = 1; j < dims[1]; j++) {
+        for(j = 1; j < dims[1]; j++)
             dset8[i][j] = dset8[i][j-1] << 1;
-        }
         val8bits <<= 1;
     }
 
@@ -7104,9 +7230,8 @@ gent_packedbits(void)
     val16bits = (int16_t) ~0;	/* all 1s */
     for(i = 0; i < dims[0]; i++){
         dset16[i][0] = val16bits;
-        for(j = 1; j < dims[1]; j++) {
+        for(j = 1; j < dims[1]; j++)
             dset16[i][j] = dset16[i][j-1] << 1;
-        }
         val16bits <<= 1;
     }
 
@@ -7122,9 +7247,8 @@ gent_packedbits(void)
     val32bits = (int32_t) ~0;	/* all 1s */
     for(i = 0; i < dims[0]; i++){
         dset32[i][0] = val32bits;
-        for(j = 1; j < dims[1]; j++) {
+        for(j = 1; j < dims[1]; j++)
             dset32[i][j] = dset32[i][j-1] << 1;
-        }
         val32bits <<= 1;
     }
 
@@ -7140,9 +7264,8 @@ gent_packedbits(void)
     val64bits = (int64_t) ~0L;   /* all 1s */
     for(i = 0; i < dims[0]; i++){
         dset64[i][0] = val64bits;
-        for(j = 1; j < dims[1]; j++) {
+        for(j = 1; j < dims[1]; j++)
             dset64[i][j] = dset64[i][j-1] << 1;
-        }
         val64bits <<= 1;
     }
 
@@ -9757,7 +9880,9 @@ int main(void)
     gent_attr_creation_order();
     gent_fpformat();
     gent_extlinks();
+    gent_fs_strategy_threshold();
     gent_packedbits();
+    gent_dataset_idx();
     gent_attr_intsize();
     gent_charsets();
     gent_compound_intsizes();
diff --git a/tools/h5dump/testh5dump.sh.in b/tools/h5dump/testh5dump.sh.in
index 49c947d..95f8091 100644
--- a/tools/h5dump/testh5dump.sh.in
+++ b/tools/h5dump/testh5dump.sh.in
@@ -78,6 +78,7 @@ test -d $TESTDIR || mkdir -p $TESTDIR
 # --------------------------------------------------------------------
 LIST_HDF5_TEST_FILES="
 $SRC_H5DUMP_TESTFILES/charsets.h5
+$SRC_H5DUMP_TESTFILES/file_space.h5
 $SRC_H5DUMP_TESTFILES/filter_fail.h5
 $SRC_H5DUMP_TESTFILES/packedbits.h5
 $SRC_H5DUMP_TESTFILES/taindices.h5
@@ -173,6 +174,7 @@ $SRC_H5DUMP_TESTFILES/tvms.h5
 
 LIST_OTHER_TEST_FILES="
 $SRC_H5DUMP_TESTFILES/charsets.ddl
+$SRC_H5DUMP_TESTFILES/file_space.ddl
 $SRC_H5DUMP_TESTFILES/filter_fail.ddl
 $SRC_H5DUMP_TESTFILES/packedbits.ddl
 $SRC_H5DUMP_TESTFILES/tall-1.ddl
@@ -1115,6 +1117,7 @@ TOOLTEST tboot1.ddl --enable-error-stack -H -B -d dset tfcontents1.h5
 TOOLTEST tboot2.ddl --enable-error-stack -B tfcontents2.h5
 TOOLTEST tboot2A.ddl --enable-error-stack --boot-block tfcontents2.h5
 TOOLTEST tboot2B.ddl --enable-error-stack --superblock tfcontents2.h5
+TOOLTEST file_space.ddl --enable-error-stack -B file_space.h5
 
 # test -p with a non existing dataset
 TOOLTEST4 tperror.ddl --enable-error-stack -p -d bogus tfcontents1.h5
diff --git a/tools/h5dump/testh5dumpvds.sh.in b/tools/h5dump/testh5dumpvds.sh.in
new file mode 100644
index 0000000..b15606f
--- /dev/null
+++ b/tools/h5dump/testh5dumpvds.sh.in
@@ -0,0 +1,505 @@
+#! /bin/sh
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+#
+# Tests for the h5dump tool with vds type files
+
+srcdir=@srcdir@
+
+# Determine which filters are available
+USE_FILTER_SZIP="@USE_FILTER_SZIP@"
+USE_FILTER_DEFLATE="@USE_FILTER_DEFLATE@"
+
+TESTNAME=h5dump
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+DUMPER=h5dump                     # The tool name
+DUMPER_BIN=`pwd`/$DUMPER          # The path of the tool binary
+
+H5DIFF=../h5diff/h5diff           # The h5diff tool name
+H5DIFF_BIN=`pwd`/$H5DIFF          # The path of the h5diff  tool binary
+
+H5IMPORT=../h5import/h5import     # The h5import tool name
+H5IMPORT_BIN=`pwd`/$H5IMPORT      # The path of the h5import  tool binary
+
+RM='rm -rf'
+CMP='cmp -s'
+DIFF='diff -c'
+CP='cp'
+DIRNAME='dirname'
+LS='ls'
+AWK='awk'
+
+nerrors=0
+verbose=yes
+
+# source dirs
+SRC_TOOLS="$srcdir/../"
+
+SRC_TOOLS_TESTFILES="$SRC_TOOLS/testfiles"
+# testfiles source dirs for tools
+SRC_H5LS_TESTFILES="$SRC_TOOLS_TESTFILES"
+SRC_H5DUMP_TESTFILES="$SRC_TOOLS_TESTFILES"
+SRC_H5DUMP_ERRORFILES="$srcdir/errfiles"
+SRC_H5DIFF_TESTFILES="$SRC_TOOLS/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/h5import/testfiles"
+
+TEST_P_DIR=./testfiles
+TESTDIR=./testfiles/vds
+test -d $TEST_P_DIR || mkdir -p $TEST_P_DIR
+test -d $TESTDIR || mkdir -p $TESTDIR
+
+######################################################################
+# test files
+# --------------------------------------------------------------------
+# All the test files copy from source directory to test directory
+# NOTE: Keep this framework to add/remove test files.
+#       Any test files from other tools can be used in this framework.
+#       This list are also used for checking exist.
+#       Comment '#' without space can be used.
+# --------------------------------------------------------------------
+LIST_HDF5_TEST_FILES="
+$SRC_H5DUMP_TESTFILES/vds/1_a.h5
+$SRC_H5DUMP_TESTFILES/vds/1_b.h5
+$SRC_H5DUMP_TESTFILES/vds/1_c.h5
+$SRC_H5DUMP_TESTFILES/vds/1_d.h5
+$SRC_H5DUMP_TESTFILES/vds/1_e.h5
+$SRC_H5DUMP_TESTFILES/vds/1_f.h5
+$SRC_H5DUMP_TESTFILES/vds/1_vds.h5
+$SRC_H5DUMP_TESTFILES/vds/2_a.h5
+$SRC_H5DUMP_TESTFILES/vds/2_b.h5
+$SRC_H5DUMP_TESTFILES/vds/2_c.h5
+$SRC_H5DUMP_TESTFILES/vds/2_d.h5
+$SRC_H5DUMP_TESTFILES/vds/2_e.h5
+$SRC_H5DUMP_TESTFILES/vds/2_vds.h5
+$SRC_H5DUMP_TESTFILES/vds/3_1_vds.h5
+$SRC_H5DUMP_TESTFILES/vds/3_2_vds.h5
+$SRC_H5DUMP_TESTFILES/vds/4_0.h5
+$SRC_H5DUMP_TESTFILES/vds/4_1.h5
+$SRC_H5DUMP_TESTFILES/vds/4_2.h5
+$SRC_H5DUMP_TESTFILES/vds/4_vds.h5
+$SRC_H5DUMP_TESTFILES/vds/5_a.h5
+$SRC_H5DUMP_TESTFILES/vds/5_b.h5
+$SRC_H5DUMP_TESTFILES/vds/5_c.h5
+$SRC_H5DUMP_TESTFILES/vds/5_vds.h5
+"
+
+LIST_OTHER_TEST_FILES="
+$SRC_H5DUMP_TESTFILES/vds/tvds-1.ddl
+$SRC_H5DUMP_TESTFILES/vds/tvds-2.ddl
+$SRC_H5DUMP_TESTFILES/vds/tvds-3_1.ddl
+$SRC_H5DUMP_TESTFILES/vds/tvds-3_2.ddl
+$SRC_H5DUMP_TESTFILES/vds/tvds-4.ddl
+$SRC_H5DUMP_TESTFILES/vds/tvds-5.ddl
+$SRC_H5DUMP_TESTFILES/vds/tvds_layout-1.ddl
+$SRC_H5DUMP_TESTFILES/vds/tvds_layout-2.ddl
+$SRC_H5DUMP_TESTFILES/vds/tvds_layout-3_1.ddl
+$SRC_H5DUMP_TESTFILES/vds/tvds_layout-3_2.ddl
+$SRC_H5DUMP_TESTFILES/vds/tvds_layout-4.ddl
+$SRC_H5DUMP_TESTFILES/vds/tvds_layout-5.ddl
+"
+
+LIST_ERROR_TEST_FILES="
+"
+
+#
+# copy test files and expected output files from source dirs to test dir
+#
+COPY_TESTFILES="$LIST_HDF5_TEST_FILES $LIST_OTHER_TEST_FILES $LIST_ERROR_TEST_FILES"
+
+COPY_TESTFILES_TO_TESTDIR()
+{
+    # copy test files. Used -f to make sure get a new copy
+    for tstfile in $COPY_TESTFILES
+    do
+        # ignore '#' comment
+        echo $tstfile | tr -d ' ' | grep '^#' > /dev/null
+        RET=$?
+        if [ $RET -eq 1 ]; then
+            # skip cp if srcdir is same as destdir
+            # this occurs when build/test performed in source dir and
+            # make cp fail
+            SDIR=`$DIRNAME $tstfile`
+            INODE_SDIR=`$LS -i -d $SDIR | $AWK -F' ' '{print $1}'`
+            INODE_DDIR=`$LS -i -d $TESTDIR | $AWK -F' ' '{print $1}'`
+            if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then
+              $CP -f $tstfile $TESTDIR
+                if [ $? -ne 0 ]; then
+                    echo "Error: FAILED to copy $tstfile ."
+
+                    # Comment out this to CREATE expected file
+                    exit $EXIT_FAILURE
+                fi
+            fi
+        fi
+    done
+}
+
+CLEAN_TESTFILES_AND_TESTDIR()
+{
+    # skip rm if srcdir is same as destdir
+    # this occurs when build/test performed in source dir and
+    # make cp fail
+    SDIR=`$DIRNAME $tstfile`
+    INODE_SDIR=`$LS -i -d $SDIR | $AWK -F' ' '{print $1}'`
+    INODE_DDIR=`$LS -i -d $TESTDIR | $AWK -F' ' '{print $1}'`
+    if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then
+        $RM $TESTDIR
+    fi
+}
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Testing".
+#
+TESTING() {
+   SPACES="                                                               "
+   echo "Testing $* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+# Source in the output filter function definitions.
+. $srcdir/../../bin/output_filter.sh
+
+# Run a test and print PASS or *FAIL*.  If a test fails then increment
+# the `nerrors' global variable and (if $verbose is set) display the
+# difference between the actual output and the expected output. The
+# expected output is given as the first argument to this function and
+# the actual output file is calculated by replacing the `.ddl' with
+# `.out'.  The actual output is not removed if $HDF5_NOCLEANUP has a
+# non-zero value.
+#
+TOOLTEST() {
+    expect="$TESTDIR/$1"
+    actual="$TESTDIR/`basename $1 .ddl`.out"
+    actual_err="$TESTDIR/`basename $1 .ddl`.err"
+    actual_sav=${actual}-sav
+    actual_err_sav=${actual_err}-sav
+    shift
+
+    # Run test.
+    TESTING $DUMPER $@
+    (
+    cd $TESTDIR
+      $RUNSERIAL $DUMPER_BIN "$@"
+    ) >$actual 2>$actual_err
+
+    # save actual and actual_err in case they are needed later.
+    cp $actual $actual_sav
+    STDOUT_FILTER $actual
+    cp $actual_err $actual_err_sav
+    STDERR_FILTER $actual_err
+    cat $actual_err >> $actual
+
+  if [ ! -f $expect ]; then
+    # Create the expect file if it doesn't yet exist.
+     echo " CREATED"
+     cp $actual $expect
+    elif $CMP $expect $actual; then
+     echo " PASSED"
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.ddl) differs from actual result (*.out)"
+   nerrors="`expr $nerrors + 1`"
+   test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    fi
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+   rm -f $actual $actual_err $actual_sav $actual_err_sav $actual_ext
+    fi
+
+}
+
+
+# same as TOOLTEST1 but compares generated file to expected output
+#                   and compares the generated data file to the expected data file
+# used for the binary tests that expect a full path in -o without -b
+TOOLTEST2() {
+
+    expectdata="$TESTDIR/$1"
+    expect="$TESTDIR/`basename $1 .exp`.ddl"
+    actualdata="$TESTDIR/`basename $1 .exp`.txt"
+    actual="$TESTDIR/`basename $1 .exp`.out"
+    actual_err="$TESTDIR/`basename $1 .exp`.err"
+    shift
+
+    # Run test.
+    TESTING $DUMPER $@
+    (
+      cd $TESTDIR
+      $RUNSERIAL $DUMPER_BIN "$@"
+    ) >$actual 2>$actual_err
+    cat $actual_err >> $actual
+
+    if [ ! -f $expect ]; then
+    # Create the expect file if it doesn't yet exist.
+     echo " CREATED"
+     cp $actual $expect
+    elif $CMP $expect $actual; then
+      if [ ! -f $expectdata ]; then
+      # Create the expect data file if it doesn't yet exist.
+        echo " CREATED"
+        cp $actualdata $expectdata
+      elif $CMP $expectdata $actualdata; then
+        echo " PASSED"
+      else
+        echo "*FAILED*"
+        echo "    Expected datafile (*.exp) differs from actual datafile (*.txt)"
+        nerrors="`expr $nerrors + 1`"
+        test yes = "$verbose" && $DIFF $expectdata $actualdata |sed 's/^/    /'
+      fi
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.ddl) differs from actual result (*.out)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    fi
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+     rm -f $actual $actualdata $actual_err
+    fi
+
+}
+
+# same as TOOLTEST but filters error stack outp
+# Extract file name, line number, version and thread IDs because they may be different
+TOOLTEST3() {
+
+    expect="$TESTDIR/$1"
+    actual="$TESTDIR/`basename $1 .ddl`.out"
+    actual_err="$TESTDIR/`basename $1 .ddl`.err"
+    actual_ext="$TESTDIR/`basename $1 .ddl`.ext"
+    actual_sav=${actual}-sav
+    actual_err_sav=${actual_err}-sav
+    shift
+
+    # Run test.
+    TESTING $DUMPER $@
+    (
+      cd $TESTDIR
+      $RUNSERIAL $DUMPER_BIN "$@"
+    ) >$actual 2>$actual_err
+
+    # save actual and actual_err in case they are needed later.
+    cp $actual $actual_sav
+    STDOUT_FILTER $actual
+    cp $actual_err $actual_err_sav
+    STDERR_FILTER $actual_err
+
+    # Extract file name, line number, version and thread IDs because they may be different
+    sed -e 's/thread [0-9]*/thread (IDs)/' -e 's/: .*\.c /: (file name) /' \
+        -e 's/line [0-9]*/line (number)/' \
+        -e 's/v[1-9]*\.[0-9]*\./version (number)\./' \
+        -e 's/[1-9]*\.[0-9]*\.[0-9]*[^)]*/version (number)/' \
+        -e 's/H5Eget_auto[1-2]*/H5Eget_auto(1 or 2)/' \
+        -e 's/H5Eset_auto[1-2]*/H5Eset_auto(1 or 2)/' \
+     $actual_err > $actual_ext
+    cat $actual_ext >> $actual
+
+    if [ ! -f $expect ]; then
+    # Create the expect file if it doesn't yet exist.
+     echo " CREATED"
+     cp $actual $expect
+    elif $CMP $expect $actual; then
+     echo " PASSED"
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.ddl) differs from actual result (*.out)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    fi
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+   rm -f $actual $actual_err $actual_sav $actual_err_sav
+    fi
+
+}
+
+# same as TOOLTEST3 but filters error stack output and compares to an error file
+# Extract file name, line number, version and thread IDs because they may be different
+TOOLTEST4() {
+
+    expect="$TESTDIR/$1"
+    expect_err="$TESTDIR/`basename $1 .ddl`.err"
+    actual="$TESTDIR/`basename $1 .ddl`.out"
+    actual_err="$TESTDIR/`basename $1 .ddl`.oerr"
+    actual_ext="$TESTDIR/`basename $1 .ddl`.ext"
+    actual_sav=${actual}-sav
+    actual_err_sav=${actual_err}-sav
+    shift
+
+    # Run test.
+    TESTING $DUMPER $@
+    (
+      cd $TESTDIR
+      $RUNSERIAL $DUMPER_BIN "$@"
+    ) >$actual 2>$actual_err
+
+    # save actual and actual_err in case they are needed later.
+    cp $actual $actual_sav
+    STDOUT_FILTER $actual
+    cp $actual_err $actual_err_sav
+    STDERR_FILTER $actual_err
+
+    # Extract file name, line number, version and thread IDs because they may be different
+    sed -e 's/thread [0-9]*/thread (IDs)/' -e 's/: .*\.c /: (file name) /' \
+        -e 's/line [0-9]*/line (number)/' \
+        -e 's/v[1-9]*\.[0-9]*\./version (number)\./' \
+        -e 's/[1-9]*\.[0-9]*\.[0-9]*[^)]*/version (number)/' \
+        -e 's/H5Eget_auto[1-2]*/H5Eget_auto(1 or 2)/' \
+        -e 's/H5Eset_auto[1-2]*/H5Eset_auto(1 or 2)/' \
+     $actual_err > $actual_ext
+    #cat $actual_ext >> $actual
+
+    if [ ! -f $expect ]; then
+    # Create the expect file if it doesn't yet exist.
+     echo " CREATED"
+     cp $actual $expect
+    elif $CMP $expect $actual; then
+     if $CMP $expect_err $actual_ext; then
+      echo " PASSED"
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.err) differs from actual result (*.oerr)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && $DIFF $expect_err $actual_ext |sed 's/^/    /'
+    fi
+    else
+     echo "*FAILED*"
+     echo "    Expected result (*.ddl) differs from actual result (*.out)"
+     nerrors="`expr $nerrors + 1`"
+     test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    fi
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+   rm -f $actual $actual_err $actual_sav $actual_err_sav
+    fi
+
+}
+
+# Print a "SKIP" message
+SKIP() {
+   TESTING $DUMPER $@
+    echo  " -SKIP-"
+}
+
+# Print a line-line message left justified in a field of 70 characters
+#
+PRINT_H5DIFF() {
+ SPACES="                                                               "
+ echo " Running h5diff $* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+
+# Call the h5diff tool
+#
+DIFFTEST()
+{
+    PRINT_H5DIFF  $@
+    (
+  cd $TESTDIR
+  $RUNSERIAL $H5DIFF_BIN "$@" -q
+    )
+    RET=$?
+    if [ $RET != 0 ] ; then
+         echo "*FAILED*"
+         nerrors="`expr $nerrors + 1`"
+    else
+         echo " PASSED"
+    fi
+
+}
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Verifying".
+#
+PRINT_H5IMPORT() {
+ SPACES="                                                               "
+ echo " Running h5import $* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+# Call the h5import tool
+#
+IMPORTTEST()
+{
+    # remove the output hdf5 file if it exists
+    hdf5_file="$TESTDIR/$5"
+    if [ -f $hdf5_file ]; then
+     rm -f $hdf5_file
+    fi
+
+    PRINT_H5IMPORT  $@
+    (
+  cd $TESTDIR
+  $RUNSERIAL $H5IMPORT_BIN "$@"
+    )
+    RET=$?
+    if [ $RET != 0 ] ; then
+         echo "*FAILED*"
+         nerrors="`expr $nerrors + 1`"
+    else
+         echo " PASSED"
+    fi
+
+}
+
+
+##############################################################################
+##############################################################################
+###        T H E   T E S T S                                            ###
+##############################################################################
+##############################################################################
+# prepare for test
+COPY_TESTFILES_TO_TESTDIR
+
+####### test for dataset vds ######
+
+  # Data read
+if test $USE_FILTER_DEFLATE = "yes" ; then
+    TOOLTEST tvds-1.ddl --enable-error-stack 1_vds.h5
+    TOOLTEST tvds-2.ddl --enable-error-stack 2_vds.h5
+    TOOLTEST tvds-3_1.ddl --enable-error-stack 3_1_vds.h5
+    TOOLTEST tvds-3_2.ddl --enable-error-stack 3_2_vds.h5
+    TOOLTEST tvds-4.ddl --enable-error-stack 4_vds.h5
+    TOOLTEST tvds-5.ddl --enable-error-stack 5_vds.h5
+fi
+
+  # Layout read
+if test $USE_FILTER_DEFLATE = "yes" ; then
+    TOOLTEST tvds_layout-1.ddl -p --enable-error-stack 1_vds.h5
+    TOOLTEST tvds_layout-2.ddl -p --enable-error-stack 2_vds.h5
+    TOOLTEST tvds_layout-3_1.ddl -p --enable-error-stack 3_1_vds.h5
+    TOOLTEST tvds_layout-3_2.ddl -p --enable-error-stack 3_2_vds.h5
+    TOOLTEST tvds_layout-4.ddl -p --enable-error-stack 4_vds.h5
+    TOOLTEST tvds_layout-5.ddl -p --enable-error-stack 5_vds.h5
+fi
+
+# Clean up temporary files/directories
+CLEAN_TESTFILES_AND_TESTDIR
+
+# Report test results and exit
+if test $nerrors -eq 0 ; then
+    echo "All $TESTNAME tests passed."
+    exit $EXIT_SUCCESS
+else
+    echo "$TESTNAME tests failed with $nerrors errors."
+    exit $EXIT_FAILURE
+fi
diff --git a/tools/h5format_convert/Makefile.am b/tools/h5format_convert/Makefile.am
new file mode 100644
index 0000000..d3aef7d
--- /dev/null
+++ b/tools/h5format_convert/Makefile.am
@@ -0,0 +1,49 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+##
+## Makefile.am
+## Run automake to generate a Makefile.in from this file.
+#
+# HDF5 Library Makefile(.in)
+#
+
+include $(top_srcdir)/config/commence.am
+
+# Include src directory
+AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/tools/lib
+
+#test script and program
+TEST_PROG=h5fc_gentest
+TEST_SCRIPT=testh5fc.sh
+
+check_PROGRAMS=$(TEST_PROG) h5fc_chk_idx
+check_SCRIPTS=$(TEST_SCRIPT)
+SCRIPT_DEPEND=h5format_convert$(EXEEXT)
+
+# These are our main targets, the tools
+bin_PROGRAMS=h5format_convert
+
+# Add h5format_convert specific linker flags here
+h5format_convert_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# Tell automake to clean h5redeploy script
+CHECK_CLEANFILES+=*.h5
+
+# These were generated by configure.  Remove them only when distclean.
+DISTCLEANFILES=testh5fc.sh
+
+# All programs rely on hdf5 library and h5tools library
+LDADD=$(LIBH5TOOLS) $(LIBHDF5)
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/h5format_convert/Makefile.in b/tools/h5format_convert/Makefile.in
new file mode 100644
index 0000000..ec06514
--- /dev/null
+++ b/tools/h5format_convert/Makefile.in
@@ -0,0 +1,1459 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+#
+# HDF5 Library Makefile(.in)
+#
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = $(am__EXEEXT_1) h5fc_chk_idx$(EXEEXT)
+bin_PROGRAMS = h5format_convert$(EXEEXT)
+TESTS = $(am__EXEEXT_1) $(TEST_SCRIPT)
+subdir = tools/h5format_convert
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
+CONFIG_CLEAN_FILES = testh5fc.sh
+CONFIG_CLEAN_VPATH_FILES =
+am__installdirs = "$(DESTDIR)$(bindir)"
+am__EXEEXT_1 = h5fc_gentest$(EXEEXT)
+PROGRAMS = $(bin_PROGRAMS)
+h5fc_chk_idx_SOURCES = h5fc_chk_idx.c
+h5fc_chk_idx_OBJECTS = h5fc_chk_idx.$(OBJEXT)
+h5fc_chk_idx_LDADD = $(LDADD)
+h5fc_chk_idx_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+h5fc_gentest_SOURCES = h5fc_gentest.c
+h5fc_gentest_OBJECTS = h5fc_gentest.$(OBJEXT)
+h5fc_gentest_LDADD = $(LDADD)
+h5fc_gentest_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
+h5format_convert_SOURCES = h5format_convert.c
+h5format_convert_OBJECTS = h5format_convert.$(OBJEXT)
+h5format_convert_LDADD = $(LDADD)
+h5format_convert_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
+h5format_convert_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(AM_CFLAGS) $(CFLAGS) $(h5format_convert_LDFLAGS) $(LDFLAGS) \
+	-o $@
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
+depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = h5fc_chk_idx.c h5fc_gentest.c h5format_convert.c
+DIST_SOURCES = h5fc_chk_idx.c h5fc_gentest.c h5format_convert.c
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.sh.log=.log)
+SH_LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
+SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/testh5fc.sh.in \
+	$(top_srcdir)/bin/depcomp $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
+AMTAR = @AMTAR@
+
+# H5_CFLAGS holds flags that should be used when building hdf5,
+# but which should not be exported to h5cc for building other programs.
+# AM_CFLAGS is an automake construct which should be used by Makefiles 
+# instead of CFLAGS, as CFLAGS is reserved solely for the user to define.
+# This applies to FCFLAGS, CXXFLAGS, CPPFLAGS, and LDFLAGS as well.
+AM_CFLAGS = @AM_CFLAGS@ @H5_CFLAGS@
+
+# Include src directory
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@ -I$(top_srcdir)/src \
+	-I$(top_srcdir)/tools/lib
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+CLEARFILEBUF = @CLEARFILEBUF@
+CODESTACK = @CODESTACK@
+CONFIG_DATE = @CONFIG_DATE@
+CONFIG_MODE = @CONFIG_MODE@
+CONFIG_USER = @CONFIG_USER@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CXX_VERSION = @CXX_VERSION@
+CYGPATH_W = @CYGPATH_W@
+DEBUG_PKG = @DEBUG_PKG@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DIRECT_VFD = @DIRECT_VFD@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXTERNAL_FILTERS = @EXTERNAL_FILTERS@
+
+# Make sure that these variables are exported to the Makefiles
+F9XMODEXT = @F9XMODEXT@
+F9XMODFLAG = @F9XMODFLAG@
+F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FCLIBS = @FCLIBS@
+FC_VERSION = @FC_VERSION@
+FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
+FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
+GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
+H5_CFLAGS = @H5_CFLAGS@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_LDFLAGS = @H5_LDFLAGS@
+H5_VERSION = @H5_VERSION@
+HADDR_T = @HADDR_T@
+HAVE_DMALLOC = @HAVE_DMALLOC@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
+HAVE_PTHREAD = @HAVE_PTHREAD@
+HDF5_HL = @HDF5_HL@
+HDF5_INTERFACES = @HDF5_INTERFACES@
+HDF_CXX = @HDF_CXX@
+HDF_FORTRAN = @HDF_FORTRAN@
+HID_T = @HID_T@
+HL = @HL@
+HL_FOR = @HL_FOR@
+HSIZE_T = @HSIZE_T@
+HSSIZE_T = @HSSIZE_T@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTRUMENT = @INSTRUMENT@
+INSTRUMENT_LIBRARY = @INSTRUMENT_LIBRARY@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LL_PATH = @LL_PATH@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_STATIC_EXEC = @LT_STATIC_EXEC@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+ROOT = @ROOT@
+RUNPARALLEL = @RUNPARALLEL@
+RUNSERIAL = @RUNSERIAL@
+R_INTEGER = @R_INTEGER@
+R_LARGE = @R_LARGE@
+SEARCH = @SEARCH@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIZE_T = @SIZE_T@
+STATIC_EXEC = @STATIC_EXEC@
+STATIC_SHARED = @STATIC_SHARED@
+STRICT_FORMAT_CHECKS = @STRICT_FORMAT_CHECKS@
+STRIP = @STRIP@
+TESTPARALLEL = @TESTPARALLEL@
+THREADSAFE = @THREADSAFE@
+TIME = @TIME@
+TR = @TR@
+TRACE_API = @TRACE_API@
+UNAME_INFO = @UNAME_INFO@
+USE_FILTER_DEFLATE = @USE_FILTER_DEFLATE@
+USE_FILTER_SZIP = @USE_FILTER_SZIP@
+USINGMEMCHECKER = @USINGMEMCHECKER@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+
+# Install directories that automake doesn't know about
+docdir = $(exec_prefix)/doc
+dvidir = @dvidir@
+enable_shared = @enable_shared@
+enable_static = @enable_static@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# Shell commands used in Makefiles
+RM = rm -f
+CP = cp
+
+# Some machines need a command to run executables; this is that command
+# so that our tests will run.
+# We use RUNEXEC instead of RUNSERIAL directly because it may be that
+# some tests need to be run with a different command.  Older versions
+# of the makefiles used the command
+# $(LIBTOOL) --mode=execute
+# in some directories, for instance.
+RUNEXEC = $(RUNSERIAL)
+
+# Libraries to link to while building
+LIBHDF5 = $(top_builddir)/src/libhdf5.la
+LIBH5TEST = $(top_builddir)/test/libh5test.la
+LIBH5F = $(top_builddir)/fortran/src/libhdf5_fortran.la
+LIBH5FTEST = $(top_builddir)/fortran/test/libh5test_fortran.la
+LIBH5CPP = $(top_builddir)/c++/src/libhdf5_cpp.la
+LIBH5TOOLS = $(top_builddir)/tools/lib/libh5tools.la
+LIBH5_HL = $(top_builddir)/hl/src/libhdf5_hl.la
+LIBH5F_HL = $(top_builddir)/hl/fortran/src/libhdf5hl_fortran.la
+LIBH5CPP_HL = $(top_builddir)/hl/c++/src/libhdf5_hl_cpp.la
+
+# Note that in svn revision 19400 the '/' after DESTDIR in H5* variables below  
+# has been removed. According to the official description of DESTDIR by Gnu at 
+# http://www.gnu.org/prep/standards/html_node/DESTDIR.html, DESTDIR is 
+# prepended to the normal and complete install path that it precedes for the 
+# purpose of installing in a temporary directory which is useful for building 
+# rpms and other packages.  The '/' after ${DESTDIR} will be followed by another 
+# '/' at the beginning of the normal install path.  When DESTDIR is empty the  
+# path then begins with '//', which is incorrect and causes problems at least for 
+# Cygwin.   
+
+# Scripts used to build examples
+# If only shared libraries have been installed, have h5cc build examples with
+# shared libraries instead of static libraries
+H5CC = ${DESTDIR}$(bindir)/h5cc
+H5CC_PP = ${DESTDIR}$(bindir)/h5pcc
+H5FC = ${DESTDIR}$(bindir)/h5fc
+H5FC_PP = ${DESTDIR}$(bindir)/h5pfc
+H5CPP = ${DESTDIR}$(bindir)/h5c++
+ACLOCAL_AMFLAGS = "-I m4"
+
+# The trace script; this is used on source files from the C library to
+# insert tracing macros.
+TRACE = perl $(top_srcdir)/bin/trace
+
+# .chkexe files are used to mark tests that have run successfully.
+# .chklog files are output from those tests.
+# *.clog and *.clog2 are from the MPE option.
+
+# Tell automake to clean h5redeploy script
+CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.h5
+
+#test script and program
+TEST_PROG = h5fc_gentest
+TEST_SCRIPT = testh5fc.sh
+check_SCRIPTS = $(TEST_SCRIPT)
+SCRIPT_DEPEND = h5format_convert$(EXEEXT)
+
+# Add h5format_convert specific linker flags here
+h5format_convert_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+
+# These were generated by configure.  Remove them only when distclean.
+DISTCLEANFILES = testh5fc.sh
+
+# All programs rely on hdf5 library and h5tools library
+LDADD = $(LIBH5TOOLS) $(LIBHDF5)
+
+# Automake needs to be taught how to build lib, progs, and tests targets.
+# These will be filled in automatically for the most part (e.g.,
+# lib_LIBRARIES are built for lib target), but EXTRA_LIB, EXTRA_PROG, and
+# EXTRA_TEST variables are supplied to allow the user to force targets to
+# be built at certain times. 
+LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
+      $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
+
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+TEST_EXTENSIONS = .sh
+SH_LOG_COMPILER = $(SHELL)
+AM_SH_LOG_FLAGS = 
+TEST_PROG_CHKEXE = $(TEST_PROG:=.chkexe_)
+TEST_PROG_PARA_CHKEXE = $(TEST_PROG_PARA:=.chkexe_)
+TEST_SCRIPT_CHKSH = $(TEST_SCRIPT:=.chkexe_)
+TEST_SCRIPT_PARA_CHKSH = $(TEST_SCRIPT_PARA:=.chkexe_)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .log .o .obj .sh .sh$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/h5format_convert/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/h5format_convert/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+testh5fc.sh: $(top_builddir)/config.status $(srcdir)/testh5fc.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-binPROGRAMS: $(bin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-binPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+	@list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+h5fc_chk_idx$(EXEEXT): $(h5fc_chk_idx_OBJECTS) $(h5fc_chk_idx_DEPENDENCIES) $(EXTRA_h5fc_chk_idx_DEPENDENCIES) 
+	@rm -f h5fc_chk_idx$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(h5fc_chk_idx_OBJECTS) $(h5fc_chk_idx_LDADD) $(LIBS)
+
+h5fc_gentest$(EXEEXT): $(h5fc_gentest_OBJECTS) $(h5fc_gentest_DEPENDENCIES) $(EXTRA_h5fc_gentest_DEPENDENCIES) 
+	@rm -f h5fc_gentest$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(h5fc_gentest_OBJECTS) $(h5fc_gentest_LDADD) $(LIBS)
+
+h5format_convert$(EXEEXT): $(h5format_convert_OBJECTS) $(h5format_convert_DEPENDENCIES) $(EXTRA_h5format_convert_DEPENDENCIES) 
+	@rm -f h5format_convert$(EXEEXT)
+	$(AM_V_CCLD)$(h5format_convert_LINK) $(h5format_convert_OBJECTS) $(h5format_convert_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5fc_chk_idx.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5fc_gentest.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5format_convert.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	elif test -n "$$redo_logs"; then \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+recheck: all $(check_PROGRAMS) $(check_SCRIPTS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+h5fc_gentest.log: h5fc_gentest$(EXEEXT)
+	@p='h5fc_gentest$(EXEEXT)'; \
+	b='h5fc_gentest'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.sh.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(SH_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_SH_LOG_DRIVER_FLAGS) $(SH_LOG_DRIVER_FLAGS) -- $(SH_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.sh$(EXEEXT).log:
+ at am__EXEEXT_TRUE@	@p='$<'; \
+ at am__EXEEXT_TRUE@	$(am__set_b); \
+ at am__EXEEXT_TRUE@	$(am__check_pre) $(SH_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_SH_LOG_DRIVER_FLAGS) $(SH_LOG_DRIVER_FLAGS) -- $(SH_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(check_SCRIPTS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(PROGRAMS) all-local
+installdirs:
+	for dir in "$(DESTDIR)$(bindir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
+	clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool mostlyclean-local
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-binPROGRAMS
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am all-local check check-TESTS \
+	check-am clean clean-binPROGRAMS clean-checkPROGRAMS \
+	clean-generic clean-libtool cscopelist-am ctags ctags-am \
+	distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-binPROGRAMS \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \
+	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am \
+	uninstall-binPROGRAMS
+
+.PRECIOUS: Makefile
+
+
+# List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
+# This tells the Makefiles that these targets are not files to be built but
+# commands that should be executed even if a file with the same name already
+# exists.
+.PHONY: build-check-clean build-check-p build-check-s build-lib build-progs \
+        build-tests check-clean check-install check-p check-s check-vfd \
+        install-doc lib progs tests uninstall-doc _exec_check-s _test help
+
+help:
+	@$(top_srcdir)/bin/makehelp
+
+# lib/progs/tests targets recurse into subdirectories. build-* targets
+# build files in this directory.
+build-lib: $(LIB)
+build-progs: $(LIB) $(PROGS)
+build-tests: $(LIB) $(PROGS) $(chk_TESTS)
+
+# General rule for recursive building targets.
+# BUILT_SOURCES contain targets that need to be built before anything else
+# in the directory (e.g., for Fortran type detection)
+lib progs tests check-s check-p :: $(BUILT_SOURCES)
+	@$(MAKE) $(AM_MAKEFLAGS) build-$@ || exit 1;
+	@for d in X $(SUBDIRS); do                                             \
+	    if test $$d != X && test $$d != .; then                           \
+	        (set -x; cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1;     \
+	    fi;                                                               \
+	done
+
+# General rule for recursive cleaning targets.  Like the rule above,
+# but doesn't require building BUILT_SOURCES.
+check-clean ::
+	@$(MAKE) $(AM_MAKEFLAGS) build-$@ || exit 1;
+	@for d in X $(SUBDIRS); do                                             \
+	    if test $$d != X && test $$d != .; then                           \
+	        (set -x; cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1;     \
+	    fi;                                                               \
+	done
+
+# Tell Automake to build tests when the user types `make all' (this is
+# not its default behavior).  Also build EXTRA_LIB and EXTRA_PROG since
+# Automake won't build them automatically, either.
+all-local: $(EXTRA_LIB) $(EXTRA_PROG) $(chk_TESTS)
+
+# make install-doc doesn't do anything outside of doc directory, but
+# Makefiles should recognize it.
+# UPDATE: docs no longer reside in this build tree, so this target
+# is depreciated.
+install-doc uninstall-doc:
+	@echo "Nothing to be done."
+
+# clean up files generated by tests so they can be re-run.
+build-check-clean:
+	$(RM) -rf $(CHECK_CLEANFILES)
+
+# run check-clean whenever mostlyclean is run
+mostlyclean-local: build-check-clean
+
+# check-install is just a synonym for installcheck
+check-install: installcheck
+
+# Run each test in order, passing $(TEST_FLAGS) to the program.
+# Since tests are done in a shell loop, "make -i" does apply inside it.
+# Set HDF5_Make_Ignore to a non-blank string to ignore errors inside the loop.
+# The timestamps give a rough idea how much time the tests use.
+#
+# Note that targets in chk_TESTS (defined above) will be built when the user
+# types 'make tests' or 'make check', but only programs in TEST_PROG,
+# TEST_PROG_PARA, or TEST_SCRIPT will actually be executed.
+check-TESTS: test
+
+test _test:
+	@$(MAKE) build-check-s
+	@$(MAKE) build-check-p
+
+# Actual execution of check-s.
+build-check-s: $(LIB) $(PROGS) $(chk_TESTS)
+	@if test -n "$(TEST_PROG)$(TEST_SCRIPT)"; then      \
+	   echo "===Serial tests in `echo ${PWD} | sed -e s:.*/::` begin `date`==="; \
+	fi
+	@$(MAKE) $(AM_MAKEFLAGS) _exec_check-s
+	@if test -n "$(TEST_PROG)$(TEST_SCRIPT)"; then      \
+	    echo "===Serial tests in `echo ${PWD} | sed -e s:.*/::` ended `date`===";\
+	fi
+
+_exec_check-s: $(TEST_PROG_CHKEXE) $(TEST_SCRIPT_CHKSH)
+
+# The dummy.chkexe here prevents the target from being
+# empty if there are no tests in the current directory.
+# $${log} is the log file.
+# $${tname} is the name of test.
+$(TEST_PROG_CHKEXE) $(TEST_PROG_PARA_CHKEXE) dummy.chkexe_:
+	@if test "X$@" != "X.chkexe_" && test "X$@" != "Xdummy.chkexe_"; then \
+	   tname=$(@:.chkexe_=)$(EXEEXT);\
+	   log=$(@:.chkexe_=.chklog); \
+	   echo "============================"; \
+	   if $(top_srcdir)/bin/newer $(@:.chkexe_=.chkexe) $${tname}; then \
+	      echo "No need to test $${tname} again."; \
+	   else \
+	      echo "============================" > $${log}; \
+	      if test "X$(FORTRAN_API)" = "Xyes"; then \
+	         echo "Fortran API: Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \
+	         echo "Fortran API: $(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      elif test "X$(CXX_API)" = "Xyes"; then \
+	         echo "C++ API: Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \
+	         echo "C++ API: $(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log};\
+	      else \
+	         echo "Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \
+	         echo "$(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      fi; \
+	      echo "============================" >> $${log}; \
+	      srcdir="$(srcdir)" \
+	         $(TIME) $(RUNEXEC) ./$${tname} $(TEST_FLAGS) >> $${log} 2>&1 \
+	         && touch $(@:.chkexe_=.chkexe) || \
+	         (test $$HDF5_Make_Ignore && echo "*** Error ignored") || \
+	         (cat $${log} && false) || exit 1; \
+	      echo "" >> $${log}; \
+	      echo "Finished testing $${tname} $(TEST_FLAGS)" >> $${log}; \
+	      echo "============================" >> $${log}; \
+	      echo "Finished testing $${tname} $(TEST_FLAGS)"; \
+	      cat $${log}; \
+	   fi; \
+	fi
+
+# The dummysh.chkexe here prevents the target from being
+# empty if there are no tests in the current directory.
+# $${log} is the log file.
+# $${tname} is the name of test.
+$(TEST_SCRIPT_CHKSH) $(TEST_SCRIPT_PARA_CHKSH) dummysh.chkexe_:
+	@if test "X$@" != "X.chkexe_" && test "X$@" != "Xdummysh.chkexe_"; then \
+	   cmd=$(@:.chkexe_=);\
+	   tname=`basename $$cmd`;\
+	   chkname=`basename $(@:.chkexe_=.chkexe)`;\
+	   log=`basename $(@:.chkexe_=.chklog)`; \
+	   echo "============================"; \
+	   if $(top_srcdir)/bin/newer $${chkname} $$cmd $(SCRIPT_DEPEND); then \
+	      echo "No need to test $${tname} again."; \
+	   else \
+	      echo "============================" > $${log}; \
+	      if test "X$(FORTRAN_API)" = "Xyes"; then \
+	         echo "Fortran API: Testing $${tname} $(TEST_FLAGS)"; \
+	         echo "Fortran API: $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      elif test "X$(CXX_API)" = "Xyes"; then \
+	         echo "C++ API: Testing $${tname} $(TEST_FLAGS)"; \
+	         echo "C++ API: $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      else \
+	         echo "Testing $${tname} $(TEST_FLAGS)"; \
+	         echo "$${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      fi; \
+	      echo "============================" >> $${log}; \
+	      RUNSERIAL="$(RUNSERIAL)" RUNPARALLEL="$(RUNPARALLEL)"           \
+	      srcdir="$(srcdir)" \
+	         $(TIME) $(SHELL) $$cmd $(TEST_FLAGS) >> $${log} 2>&1 \
+	         && touch $${chkname} || \
+	         (test $$HDF5_Make_Ignore && echo "*** Error ignored") || \
+	         (cat $${log} && false) || exit 1; \
+	      echo "" >> $${log}; \
+	      echo "Finished testing $${tname} $(TEST_FLAGS)" >> $${log}; \
+	      echo "============================" >> $${log}; \
+	      echo "Finished testing $${tname} $(TEST_FLAGS)"; \
+	      cat $${log}; \
+	   fi; \
+	   echo "============================"; \
+	fi
+
+# Actual execution of check-p.
+build-check-p: $(LIB) $(PROGS) $(chk_TESTS)
+	@if test -n "$(TEST_PROG_PARA)$(TEST_SCRIPT_PARA)"; then      \
+	   echo "===Parallel tests in `echo ${PWD} | sed -e s:.*/::` begin `date`==="; \
+	fi
+	@if test -n "$(TEST_PROG_PARA)"; then                                \
+	    echo "**** Hint ****";                                            \
+	    echo "Parallel test files reside in the current directory"        \
+	         "by default.";                                               \
+	    echo "Set HDF5_PARAPREFIX to use another directory. E.g.,";       \
+	    echo "    HDF5_PARAPREFIX=/PFS/user/me";                          \
+	    echo "    export HDF5_PARAPREFIX";                                \
+	    echo "    make check";                                            \
+	    echo "**** end of Hint ****";                                     \
+	fi
+	@for test in $(TEST_PROG_PARA) dummy; do                             \
+	   if test $$test != dummy; then                                      \
+	      $(MAKE) $(AM_MAKEFLAGS) $$test.chkexe_ \
+	      RUNEXEC="$(RUNPARALLEL)" || exit 1; \
+	   fi;                                                                \
+	done
+	@for test in $(TEST_SCRIPT_PARA) dummy; do                           \
+	  if test $$test != dummy; then                                      \
+	    $(MAKE) $(AM_MAKEFLAGS) $$test.chkexe_ || exit 1; \
+	  fi;                                                                 \
+	done
+	@if test -n "$(TEST_PROG_PARA)$(TEST_SCRIPT_PARA)"; then      \
+	    echo "===Parallel tests in `echo ${PWD} | sed -e s:.*/::` ended `date`===";\
+	fi
+
+# Run test with different Virtual File Driver
+check-vfd: $(LIB) $(PROGS) $(chk_TESTS)
+	@for vfd in $(VFD_LIST) dummy; do                                     \
+	    if test $$vfd != dummy; then                                      \
+	        echo "============================";                          \
+	        echo "Testing Virtual File Driver $$vfd";                     \
+	        echo "============================";                          \
+	        $(MAKE) $(AM_MAKEFLAGS) check-clean || exit 1;                \
+	        HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1;    \
+	    fi;                                                               \
+	done
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tools/h5format_convert/h5fc_chk_idx.c b/tools/h5format_convert/h5fc_chk_idx.c
new file mode 100644
index 0000000..3114379
--- /dev/null
+++ b/tools/h5format_convert/h5fc_chk_idx.c
@@ -0,0 +1,101 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * A program to verify that the chunk indexing type of a dataset in a file
+ * is version 1 B-tree.  
+ * This is to support the testing of the tool "h5format_convert".
+ */
+
+#include "hdf5.h"
+#include "H5private.h"
+#include "h5tools.h"
+
+static void usage(void);
+
+static void
+usage(void)
+{
+    HDfprintf(stdout, "Usage: h5fc_chk_idx file_name dataset_pathname\n");
+} /* usage() */
+
+/*-------------------------------------------------------------------------
+ * Function:	main
+ *
+ * Purpose:	To check that the chunk indexing type for the dataset in 
+ *		the file is version 1 B-tree.
+ *
+ * Return:	0 -- the indexing type is version 1 B-tree
+ *		1 -- otherwise
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(int argc, char *argv[])
+{
+    char *fname = NULL;
+    char *dname = NULL;
+    hid_t fid = -1;
+    hid_t did = -1;
+    H5D_chunk_index_t idx_type;
+
+    /* h5fc_chk_idx fname dname */
+    if(argc != 3) {
+	usage();
+	exit(EXIT_FAILURE);
+    }
+
+    /* Duplicate the file name  & dataset name */
+    fname = strdup(argv[1]);
+    dname = strdup(argv[2]);
+
+    /* Try opening the file */
+    if((fid = h5tools_fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, (size_t)0)) < 0) {
+	HDfprintf(stderr, "h5fc_chk_idx: unable to open the file\n");
+	return EXIT_FAILURE;
+    }
+
+    /* Open the dataset */
+    if((did = H5Dopen2(fid, dname, H5P_DEFAULT)) < 0) {
+	HDfprintf(stderr, "h5fc_chk_idx: unable to open the dataset\n");
+	exit(EXIT_FAILURE);
+    }
+
+    /* Get the dataset's chunk indexing type */
+    if(H5Dget_chunk_index_type(did, &idx_type) < 0) {
+	HDfprintf(stderr, "h5fc_chk_idx: unable to get chunk index type for the dataset\n");
+	exit(EXIT_FAILURE);
+    }
+
+    /* Close the dataset */
+    if(H5Dclose(did) < 0) {
+	HDfprintf(stderr, "h5fc_chk_idx: unable to close the dataset\n");
+	exit(EXIT_FAILURE);
+    }
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0) {
+	HDfprintf(stderr, "h5fc_chk_idx_type: cannot close the file\n");
+	return EXIT_FAILURE;
+    }
+
+    /* Return success when the chunk indexing type is version 1 B-tree */
+    if(idx_type == H5D_CHUNK_IDX_BTREE) 
+	return(EXIT_SUCCESS);
+    else {
+	HDfprintf(stderr, "Error: chunk indexing type is %d\n", idx_type);
+	return(EXIT_FAILURE);
+    }
+} /* main() */
diff --git a/tools/h5format_convert/h5fc_gentest.c b/tools/h5format_convert/h5fc_gentest.c
new file mode 100644
index 0000000..4dcc286
--- /dev/null
+++ b/tools/h5format_convert/h5fc_gentest.c
@@ -0,0 +1,635 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Generate the binary hdf5 files for the h5format_convert tests.
+ * Usage: just execute the program without any arguments will
+ * generate all the binary hdf5 files 
+ *
+ * If you regenerate the test files (e.g., changing some code,
+ * trying it on a new platform, ...), you need to verify the correctness
+ * of the expected output and update the corresponding *.ddl files.
+ */
+#include "hdf5.h"
+
+#define GROUP			"GROUP"
+
+#define OLD_V1_FILE		"h5fc_v1.h5"
+#define DSET_NON_CHUNKED	"DSET_NON_CHUNKED"
+#define DSET_BT1		"DSET_BT1"
+#define DSET_NDATA_BT1		"DSET_NDATA_BT1"
+
+#define LATEST_V3_FILE		"h5fc_latest_v3.h5"
+#define DSET_EA			"DSET_EA"
+#define DSET_NDATA_EA		"DSET_NDATA_EA"
+#define DSET_BT2		"DSET_BT2"
+#define DSET_NDATA_BT2		"DSET_NDATA_BT2"
+#define DSET_FA			"DSET_FA"
+#define DSET_NDATA_FA		"DSET_NDATA_FA"
+#define DSET_NONE		"DSET_NONE"
+#define DSET_NDATA_NONE		"DSET_NDATA_NONE"
+
+#define NON_V3_FILE		"h5fc_non_v3.h5"
+
+#define EDGE_V3_FILE		"h5fc_edge_v3.h5"
+#define DSET_EDGE		"DSET_EDGE"
+
+/*
+ * Function: gen_old() 
+ *
+ * Create an old format file with:
+ *	1) 1 non-chunked dataset
+ *	2) 2 chunked datasets with version 1 B-tree chunk indexing type: with/without data
+ */
+static void
+gen_old(const char *fname)
+{
+    hid_t	fid = -1;	 	/* file id */
+    hid_t	fcpl = -1;	 	
+    hid_t	gid = -1;	 	/* group id */
+    hid_t   	sid = -1;	 	/* space id */
+    hid_t	dcpl = -1;	 	/* dataset creation property id */
+    hid_t	did1 = -1, did2 = -1;	/* dataset id */
+    hsize_t 	dims1[1] = {10};     	/* dataset dimension */
+    hsize_t 	dims2[2] = {4, 6};     	/* dataset dimension */
+    hsize_t 	c_dims[2] = {2, 3};    	/* chunk dimension */
+    int		i;		    	/* local index variable */
+    int     	buf[24];            	/* data buffer */
+
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+        goto error;
+
+    if(H5Pset_istore_k(fcpl, 64) < 0)
+        goto error;
+
+    /* Create file */
+    if((fid = H5Fcreate(fname, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Create a group */
+    if((gid = H5Gcreate2(fid, GROUP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	goto error;
+
+
+    /* 
+     * Create a non-chunked dataset 
+     */
+
+    /* Create dataspace */
+    if((sid = H5Screate_simple(1, dims1, NULL)) < 0)
+	goto error;
+
+    /* Create the dataset */
+    if((did1  = H5Dcreate2(fid, DSET_NON_CHUNKED, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Closing */
+    if(H5Sclose(sid) < 0)
+	goto error;
+    if(H5Dclose(did1) < 0)
+	goto error;
+
+    /* 
+     * Create two chunked datasets with version 1 B-tree chunk indexing type
+     * (one with data, one without data)
+     */
+
+    /* Create data */
+    for(i = 0; i < 24; i++)
+	buf[i] = i;
+
+    /* Set chunk */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+	goto error;
+    if(H5Pset_chunk(dcpl, 2, c_dims) < 0)
+	goto error;
+
+    /* Create dataspace */
+    if((sid = H5Screate_simple(2, dims2, NULL)) < 0)
+	goto error;
+
+    /* Create the 2 datasets */
+    if((did1 = H5Dcreate2(fid, DSET_NDATA_BT1, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	goto error;
+
+    if((did2 = H5Dcreate2(gid, DSET_BT1, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	goto error;
+    
+    /* Write to one dataset */
+    if(H5Dwrite(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+	goto error;
+
+    /* Closing */
+    if(H5Pclose(dcpl) < 0)
+	goto error;
+    if(H5Sclose(sid) < 0)
+	goto error;
+    if(H5Dclose(did1) < 0)
+	goto error;
+    if(H5Dclose(did2) < 0)
+	goto error;
+
+    if(H5Gclose(gid) < 0)
+	goto error;
+    if(H5Fclose(fid) < 0)
+	goto error;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+        H5Dclose(did1);
+        H5Dclose(did2);
+        H5Gclose(gid);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+
+} /* gen_old() */
+
+/*
+ * Function: gen_latest() 
+ *
+ * Create a file with write+latest-format--this will result in v3 superblock+latest version support:
+ *	1) 2 chunked datasets with extensible array chunk indexing type (with/without data)
+ *	2) 2 chunked datasets with version 2 B-tree chunk indexing type (with/without data)
+ *	3) 2 chunked datasets with fixed array chunk indexing type (with/without data)
+ *	4) 2 chunked datasets with implicit array chunk indexing type (with/without data)
+ */
+static void
+gen_latest(const char *fname)
+{
+    hid_t	fid = -1;	 	/* file id */
+    hid_t	fapl = -1;	       	/* file access property list */
+    hid_t	gid = -1;	       	/* group id */
+    hid_t   	sid = -1;       	/* space id */
+    hid_t	dcpl = -1;	    	/* dataset creation property id */
+    hid_t	did1 = -1, did2 = -1;	/* dataset id */
+    hsize_t 	dims2[2] = {4, 6};     	/* dataset dimension */
+    hsize_t	max_dims[2];		/* maximum dataset dimension */
+    hsize_t 	c_dims[2] = {2, 3};    	/* chunk dimension */
+    int		i;		    	/* local index variable */
+    int     	buf[24];            	/* data buffer */
+
+    /* Create a new format file */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+	goto error;
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+	goto error;
+
+    if((fid = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+	goto error;
+
+    /* Create a group */
+    if((gid = H5Gcreate2(fid, GROUP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Set chunk */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+	goto error;
+    if(H5Pset_chunk(dcpl, 2, c_dims) < 0)
+	goto error;
+
+    /* 
+     * Create 2 chunked datasets with extensible array chunk indexing type 
+     * (one with data; one without data)
+     */
+
+    /* Create dataspace */
+    max_dims[0] = 10;
+    max_dims[1] = H5S_UNLIMITED;
+    if((sid = H5Screate_simple(2, dims2, max_dims)) < 0)
+	goto error;
+
+    /* Create the 2 datasets */
+    if((did1  = H5Dcreate2(gid, DSET_NDATA_EA, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	goto error;
+
+    if((did2  = H5Dcreate2(fid, DSET_EA, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Create data */
+    for(i = 0; i < 24; i++)
+	buf[i] = i;
+
+    /* Write to one dataset */
+    if(H5Dwrite(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+	goto error;
+
+    /* Closing */
+    if(H5Sclose(sid) < 0)
+	goto error;
+    if(H5Dclose(did1) < 0)
+	goto error;
+    if(H5Dclose(did2) < 0)
+	goto error;
+
+
+    /* 
+     * Create 2 chunked datasets with version 2 B-tree chunk indexing type 
+     * (one with data; one without data)
+     */
+
+    /* Create dataspace */
+    max_dims[0] = 10;
+    max_dims[0] = H5S_UNLIMITED;
+    max_dims[1] = H5S_UNLIMITED;
+    if((sid = H5Screate_simple(2, dims2, max_dims)) < 0)
+	goto error;
+
+    /* Create the 2 datasets */
+    if((did1  = H5Dcreate2(fid, DSET_NDATA_BT2, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	goto error;
+
+    if((did2  = H5Dcreate2(gid, DSET_BT2, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Write to one dataset */
+    if(H5Dwrite(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+	goto error;
+
+    /* Closing */
+    if(H5Sclose(sid) < 0)
+	goto error;
+    if(H5Dclose(did1) < 0)
+	goto error;
+    if(H5Dclose(did2) < 0)
+	goto error;
+
+    /*
+     * Create 2 chunked datasets with fixed array chunk indexing type 
+     * (one with data; one without data)
+     */
+
+    /* Create dataspace */
+    max_dims[0] = 20;
+    max_dims[1] = 10;
+    if((sid = H5Screate_simple(2, dims2, max_dims)) < 0)
+	goto error;
+
+    /* Create the datasets */
+    if((did1  = H5Dcreate2(fid, DSET_FA, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	goto error;
+
+    if((did2  = H5Dcreate2(gid, DSET_NDATA_FA, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Write to the dataset */
+    if(H5Dwrite(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+	goto error;
+
+    /* Closing */
+    if(H5Sclose(sid) < 0)
+	goto error;
+    if(H5Dclose(did1) < 0)
+	goto error;
+    if(H5Dclose(did2) < 0)
+	goto error;
+
+
+    /* 
+     * Create 2 chunked datasets with implicit chunk indexing type 
+     * (one with data; one without data)
+     */
+
+    /* Create dataspace */
+    if((sid = H5Screate_simple(2, dims2, NULL)) < 0)
+	goto error;
+
+    /* Set early allocation */
+    if(H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY) < 0)
+	goto error;
+
+    /* Create the 2 datasets */
+    if((did1  = H5Dcreate2(fid, DSET_NONE, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	goto error;
+
+    if((did2  = H5Dcreate2(gid, DSET_NDATA_NONE, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Write to one dataset */
+    if(H5Dwrite(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+	goto error;
+
+    /* Closing */
+    if(H5Dclose(did1) < 0)
+	goto error;
+    if(H5Dclose(did2) < 0)
+	goto error;
+    if(H5Sclose(sid) < 0)
+	goto error;
+
+    if(H5Pclose(dcpl) < 0)
+	goto error;
+    if(H5Gclose(gid) < 0)
+	goto error;
+    if(H5Fclose(fid) < 0)
+	goto error;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+        H5Dclose(did1);
+        H5Dclose(did2);
+        H5Gclose(gid);
+        H5Fclose(fid);
+        H5Pclose(fapl);
+    } H5E_END_TRY;
+
+} /* gen_latest() */
+
+/*
+ * Function: gen_non() 
+ *
+ * Create a file with SWMR write+non-latest-format--this will result in v3 superbock+latest version support:
+ *	1) 1 chunked dataset with extensible array chunk indexing type (without data)
+ *	2) 1 chunked dataset with version 2 B-tree chunk indexing type (with data)
+ * Re-open the file with write+non-latest-format and create:
+ *	3) 1 chunked dataset with version 2 B-tree chunk indexing type (without data)
+ * 	4) 1 chunked dataset with extensible array indexing type (with data)
+ *	5) 1 non-chunked dataset
+ */
+static void
+gen_non(const char *fname)
+{
+    hid_t	fid = -1;		/* file id */
+    hid_t	gid = -1;		/* group id */
+    hid_t   	sid = -1;       	/* space id */
+    hid_t	dcpl = -1;		/* dataset creation property id */
+    hid_t	did1 = -1, did2 = -1;	/* dataset id */
+    hsize_t 	dims1[1] = {10};     	/* dataset dimension */
+    hsize_t 	dims2[2] = {4, 6};     	/* dataset dimension */
+    hsize_t	max_dims[2];		/* maximum dataset dimension */
+    hsize_t 	c_dims[2] = {2, 3};    	/* chunk dimension */
+    int		i;		    	/* local index variable */
+    int     	buf[24];            	/* data buffer */
+
+    /* Create a new file with SWMR_WRITE + non-latest-format */
+    if((fid = H5Fcreate(fname, H5F_ACC_TRUNC|H5F_ACC_SWMR_WRITE, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Create a group */
+    if((gid = H5Gcreate2(fid, GROUP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Create data */
+    for(i = 0; i < 24; i++)
+	buf[i] = i;
+
+    /* Set chunk */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+	goto error;
+    if(H5Pset_chunk(dcpl, 2, c_dims) < 0)
+	goto error;
+
+    /* 
+     * Create a chunked dataset with extensible array chunk indexing type  (without data)
+     */
+
+    /* Create dataspace */
+    max_dims[0] = 10;
+    max_dims[1] = H5S_UNLIMITED;
+    if((sid = H5Screate_simple(2, dims2, max_dims)) < 0)
+	goto error;
+
+    /* Create the dataset */
+    if((did1  = H5Dcreate2(fid, DSET_NDATA_EA, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Closing */
+    if(H5Sclose(sid) < 0)
+	goto error;
+    if(H5Dclose(did1) < 0)
+	goto error;
+
+    /* 
+     * Create a chunked dataset with version 2 B-tree chunk indexing type (with data)
+     */
+
+    /* Create dataspace */
+    max_dims[0] = 10;
+    max_dims[0] = H5S_UNLIMITED;
+    max_dims[1] = H5S_UNLIMITED;
+    if((sid = H5Screate_simple(2, dims2, max_dims)) < 0)
+	goto error;
+
+    /* Create the dataset */
+    if((did1  = H5Dcreate2(gid, DSET_BT2, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Write to the dataset */
+    if(H5Dwrite(did1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+	goto error;
+
+    /* Closing */
+    if(H5Sclose(sid) < 0)
+	goto error;
+    if(H5Dclose(did1) < 0)
+	goto error;
+    if(H5Pclose(dcpl) < 0)
+	goto error;
+    if(H5Gclose(gid) < 0)
+	goto error;
+    if(H5Fclose(fid) < 0)
+	goto error;
+
+    /* Re-open the file with old format */
+    if((fid = H5Fopen(fname, H5F_ACC_RDWR, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Open the group */
+    if((gid = H5Gopen2(fid, GROUP, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /*
+     * Create a dataset with version 2 B-btree chunk indexing type (without data)
+     */
+
+    /* Set chunk */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+	goto error;
+    if(H5Pset_chunk(dcpl, 2, c_dims) < 0)
+	goto error;
+
+    /* Create dataspace */
+    max_dims[0] = H5S_UNLIMITED;
+    max_dims[1] = H5S_UNLIMITED;
+    if((sid = H5Screate_simple(2, dims2, max_dims)) < 0)
+	goto error;
+
+    /* Create the dataset */
+    if((did1 = H5Dcreate2(fid, DSET_NDATA_BT2, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Close the dataspace */
+    if(H5Sclose(sid) < 0)
+	goto error;
+
+    /*
+     * Create a dataset with version extensible array chunk indexing type (with data) in the group
+     */
+
+    /* Create dataspace */
+    max_dims[0] = 10;
+    max_dims[1] = H5S_UNLIMITED;
+    if((sid = H5Screate_simple(2, dims2, max_dims)) < 0)
+	goto error;
+
+    /* Create the dataset */
+    if((did2 = H5Dcreate2(gid, DSET_EA, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Write to the dataset */
+    if(H5Dwrite(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+	goto error;
+
+    /* Closing */
+    if(H5Sclose(sid) < 0)
+	goto error;
+    if(H5Dclose(did1) < 0)
+	goto error;
+    if(H5Dclose(did2) < 0)
+	goto error;
+
+    /* 
+     * Create a non-chunked dataset in the group
+     */
+
+    /* Create dataspace */
+    if((sid = H5Screate_simple(1, dims1, NULL)) < 0)
+	goto error;
+
+    /* Create the dataset */
+    if((did1  = H5Dcreate2(gid, DSET_NON_CHUNKED, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0)
+	goto error;
+
+    /* Closing */
+    if(H5Sclose(sid) < 0)
+	goto error;
+    if(H5Dclose(did1) < 0)
+	goto error;
+
+    if(H5Gclose(gid) < 0)
+	goto error;
+    if(H5Fclose(fid) < 0)
+	goto error;
+    if(H5Pclose(dcpl) < 0)
+	goto error;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+        H5Dclose(did1);
+        H5Dclose(did2);
+        H5Gclose(gid);
+        H5Fclose(fid);
+    } H5E_END_TRY;
+
+} /* gen_non() */
+
+/*
+ * Function: gen_edge() 
+ *
+ * Create a file with write+latest-format--this will result in v3 superblock+latest version support:
+ *	A dataset: chunked, filtered, H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS enabled
+ *	(i.e. the dataset does not filter partial edge chunks)
+ */
+static void
+gen_edge(const char *fname)
+{
+    hid_t	fid = -1;	    	/* file id */
+    hid_t	fapl = -1;	       	/* file access property list */
+    hid_t   	sid = -1;       	/* dataspace id */
+    hid_t	dcpl = -1;	    	/* dataset creation property id */
+    hid_t	did = -1;		/* dataset id */
+    hsize_t 	dims2[2] = {12, 6};	/* Dataset dimensions */
+    hsize_t 	c_dims[2] = {5, 5};	/* Chunk dimensions */
+    float 	buf[12][6];            	/* Buffer for writing data */
+    int		i, j;		    	/* local index variable */
+
+    /* Create a new format file */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+	goto error;
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+	goto error;
+    if((fid = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+	goto error;
+
+    /* Set chunk, filter, no-filter-edge-chunk */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+	goto error;
+    if(H5Pset_chunk(dcpl, 2, c_dims) < 0)
+	goto error;
+    if(H5Pset_deflate(dcpl, 9) < 0)
+        goto error;
+    if(H5Pset_chunk_opts(dcpl, H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS) < 0)
+        goto error;
+
+    /* Create dataspace */
+    if((sid = H5Screate_simple(2, dims2, NULL)) < 0)
+        goto error;
+
+    /* Create the dataset */
+    if((did = H5Dcreate2(fid, DSET_EDGE, H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+        goto error;
+
+    /* Create data */
+    for (i = 0; i< 12; i++)
+        for (j = 0; j< 6; j++)
+            buf[i][j] = 100.0F;
+
+    /* Write to the dataset */
+    if(H5Dwrite(did, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+	goto error;
+
+    /* Closing */
+    if(H5Pclose(dcpl) < 0)
+	goto error;
+    if(H5Sclose(sid) < 0)
+	goto error;
+    if(H5Dclose(did) < 0)
+	goto error;
+    if(H5Pclose(fapl) < 0)
+	goto error;
+    if(H5Fclose(fid) < 0)
+	goto error;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+        H5Dclose(did);
+        H5Fclose(fid);
+        H5Pclose(fapl);
+    } H5E_END_TRY;
+
+} /* gen_edge() */
+
+int main(void)
+{
+    /* Generate an old format file with v1 superbock */
+    gen_old(OLD_V1_FILE);
+
+    /* Generate a latest-format file with v3 superblock */
+    gen_latest(LATEST_V3_FILE);
+
+    /* Generate a non-latest-format file with v3 superblock */
+    gen_non(NON_V3_FILE);
+
+    /* Generate a new format file with a no-filter-edge-chunk dataset for testing */
+    gen_edge(EDGE_V3_FILE);
+    return 0;
+}
diff --git a/tools/h5format_convert/h5format_convert.c b/tools/h5format_convert/h5format_convert.c
new file mode 100644
index 0000000..7686acc
--- /dev/null
+++ b/tools/h5format_convert/h5format_convert.c
@@ -0,0 +1,438 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  Vailin Choi; Feb 2015
+ */
+
+
+/*
+ * We include the private header file so we can get to the uniform
+ * programming environment it declares.  
+ * HDF5 API functions (except for H5G_basename())
+ */
+#include "H5private.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+#include "h5trav.h"
+
+/* Name of tool */
+#define PROGRAMNAME "h5format_convert"
+
+static char *fname_g = NULL;
+static char *dname_g = NULL;
+static int dset_g = FALSE;
+static int noop_g = FALSE;
+static int verbose_g = 0;
+
+/*
+ * Command-line options: The user can specify short or long-named
+ * parameters.
+ */
+static const char *s_opts = "hVvd:n";
+static struct long_options l_opts[] = {
+        { "help", no_arg, 'h' },
+	{ "hel", no_arg, 'h'},
+	{ "he", no_arg, 'h'},
+        { "version", no_arg, 'V' },
+	{ "version", no_arg, 'V' },
+	{ "versio", no_arg, 'V' },
+	{ "versi", no_arg, 'V' },
+	{ "vers", no_arg, 'V' },
+        { "verbose", no_arg, 'v' },
+        { "verbos", no_arg, 'v' },
+        { "verbo", no_arg, 'v' },
+        { "verb", no_arg, 'v' },
+        { "dname", require_arg, 'd' },
+        { "dnam", require_arg, 'd' },
+        { "dna", require_arg, 'd' },
+        { "dn", require_arg, 'd' },
+        { "noop", no_arg, 'n' },
+        { "noo", no_arg, 'n' },
+        { "no", no_arg, 'n' },
+        { NULL, 0, '\0' }
+};
+
+

+/*-------------------------------------------------------------------------
+ * Function: usage
+ *
+ * Purpose: print usage
+ *
+ * Return: void
+ *
+ *-------------------------------------------------------------------------
+ */
+static void usage(const char *prog) 
+{
+	printf("usage: %s [OPTIONS] file_name\n", prog);
+	printf("  OPTIONS\n");
+	printf("   -h, --help				Print a usage message and exit\n");
+	printf("   -V, --version			Print version number and exit\n");
+	printf("   -v, --verbose			Turn on verbose mode\n");
+	printf("   -d dname, --dname=dataset_name	Pathname for the dataset\n");
+	printf("   -n, --noop				Perform all the steps except the actual conversion\n");
+	printf("\n");
+	printf("Examples of use:\n");
+	printf("\n");
+	printf("h5format_convert -d /group/dataset file_name\n");
+	printf("  Convert the chunk indexing type to version 1 B-tree\n");
+	printf("  for the chunked dataset </group/dataset> in the HDF5 file <file_name>.\n");
+	printf("\n");
+	printf("h5format_convert file_name\n");
+	printf("  Convert the chunk indexing type to version 1 B-tree\n");
+	printf("  for all the chunked datasets in the HDF5 file <file_name>.\n");
+	printf("\n");
+	printf("h5format_convert -n -d /group/dataset file_name\n");
+	printf("  Go through all the steps except the actual conversion when \n");
+	printf("  converting the chunked dataset </group/dataset> in the HDF5 file <file_name>.\n");
+} /* usage() */
+
+/*-------------------------------------------------------------------------
+ * Function: parse_command_line
+ *
+ * Purpose: parse command line input
+ *
+ * Return: Success: 0
+ *  	   Failure: 1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+parse_command_line(int argc, const char **argv) 
+{
+    int opt;
+
+     /* no arguments */
+    if (argc == 1) {
+        usage(h5tools_getprogname());
+	h5tools_setstatus(EXIT_FAILURE);
+        goto error;
+    }
+
+    /* parse command line options */
+    while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF) {
+	switch((char) opt) {
+	    case 'h':
+		usage(h5tools_getprogname());
+		h5tools_setstatus(EXIT_SUCCESS);
+		goto error;
+
+	    case 'V':
+		print_version(h5tools_getprogname());
+		h5tools_setstatus(EXIT_SUCCESS);
+		goto error;
+
+	    case 'v':
+		verbose_g = TRUE;
+		break;
+
+	    case 'd': /* -d dname */
+		if(opt_arg != NULL && *opt_arg)
+		/* if(opt_arg != NULL)*/
+		    dname_g = HDstrdup(opt_arg);
+		if(dname_g == NULL) {
+		    h5tools_setstatus(EXIT_FAILURE);
+		    error_msg("No dataset name\n", opt_arg);
+		    usage(h5tools_getprogname());
+		    goto error;
+		}
+		dset_g = TRUE;
+		break;
+
+	    case 'n': /* -n */
+		noop_g = TRUE;
+		break;
+
+	    default:
+		h5tools_setstatus(EXIT_FAILURE);
+		usage(h5tools_getprogname());
+		goto error;
+		break;
+	} /* switch */
+    } /* while */
+
+    if (argc <= opt_ind) {
+        error_msg("missing file name\n");
+        usage(h5tools_getprogname());
+	h5tools_setstatus(EXIT_FAILURE);
+        goto error;
+    }
+
+    fname_g = HDstrdup(argv[opt_ind]);
+
+    return(0);
+
+error:
+    return(-1); ;
+} /* parse_command_line() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: leave
+ *
+ * Purpose: Close HDF5
+ *
+ * Return: Does not return
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+leave(int ret)
+{
+    h5tools_close();
+
+    HDexit(ret);
+} /* leave() */
+
+/*-------------------------------------------------------------------------
+ * Function: convert()
+ *
+ * Purpose: To change the chunk indexing type for the dataset to version 1 B-tree.
+ *	    -- the dataset has to be chunked
+ *	    -- the dataset's chunk indexing type is not already version 1 B-tree.
+ *	    If the above conditions are not fulfilled, the tool will not perform
+ *	    the conversion but will exit with success.
+ *
+ * Return: Success: 0
+ *  	   Failure: 1
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+convert(hid_t fid, const char *dname)
+{
+    hid_t dcpl = -1;
+    hid_t did = -1;
+    H5D_layout_t layout_type;
+    H5D_chunk_index_t idx_type;
+
+    /* Open the dataset */
+    if((did = H5Dopen2(fid, dname, H5P_DEFAULT)) < 0) {
+	error_msg("unable to open dataset \"%s\"\n", dname);
+	h5tools_setstatus(EXIT_FAILURE);
+	goto error;
+
+    } else if(verbose_g)
+	printf("Open the dataset\n");
+
+    /* Get the dataset's creation property list */
+    if((dcpl = H5Dget_create_plist(did)) < 0) {
+	error_msg("unable to get the dataset creation property list\n");
+	h5tools_setstatus(EXIT_FAILURE);
+	goto error;
+    }
+
+    /* Get the dataset's layout */
+    if((layout_type = H5Pget_layout(dcpl)) < 0) {
+	error_msg("unable to get the dataset layout type\n");
+	h5tools_setstatus(EXIT_FAILURE);
+	goto error;
+
+    } else if(verbose_g)
+	printf("Retrieve the dataset's layout\n");
+
+    /* No further action if not a chunked dataset */
+    if(layout_type != H5D_CHUNKED) {
+	if(verbose_g)
+	    printf("Dataset is not chunked: no further action\n");
+	h5tools_setstatus(EXIT_SUCCESS);
+	goto done;
+
+    } else if(verbose_g)
+	printf("Verify the dataset is a chunked dataset\n");
+
+    /* Get the dataset's chunk indexing type */
+    if(H5Dget_chunk_index_type(did, &idx_type) < 0) {
+	error_msg("unable to get the chunk indexing type for \"%s\"\n", dname);
+	h5tools_setstatus(EXIT_FAILURE);
+	goto error;
+
+    } else if(verbose_g)
+	printf("Retrieve the dataset's chunk indexing type\n");
+
+    /* No further action if the chunk indexing type is already version 1 B-tree */
+    if(idx_type == H5D_CHUNK_IDX_BTREE) {
+	if(verbose_g)
+	    printf("Chunk indexing type is already version 1 B-tree: no further action\n");
+	h5tools_setstatus(EXIT_SUCCESS);
+	goto done;
+
+    } else if (verbose_g)
+	printf("Verify the dataset's chunk indexing type is not version 1 B-tree\n");
+
+    /* No further action if it is a noop */
+    if(noop_g) {
+	if(verbose_g)
+	    printf("Not converting the dataset\n");
+	h5tools_setstatus(EXIT_SUCCESS);
+	goto done;
+    }
+
+    if(verbose_g)
+	printf("Converting the dataset...\n");
+
+    /* Convert the dataset's chunk indexing type to version 1 B-tree */
+    if(H5Dformat_convert(did) < 0) {
+	error_msg("unable to convert chunk indexing for \"%s\"\n", dname);
+	h5tools_setstatus(EXIT_FAILURE);
+	goto error;
+
+    } else if(verbose_g)
+	printf("Done\n");
+
+done:
+    /* Close the dataset */
+    if(H5Dclose(did) < 0) {
+        error_msg("unable to close dataset \"%s\"\n", dname);
+        h5tools_setstatus(EXIT_FAILURE);
+	goto error;
+    } else if(verbose_g)
+	printf("Close the dataset\n");
+    
+    /* Close the dataset creation property list */
+    if(H5Pclose(dcpl) < 0) {
+        error_msg("unable to close dataset creation property list\n");
+        h5tools_setstatus(EXIT_FAILURE);
+	goto error;
+    } else if(verbose_g)
+	printf("Close the dataset creation property list\n");
+
+    return(0);
+
+error:
+    if(verbose_g)
+	printf("Error encountered\n");
+
+    H5E_BEGIN_TRY {
+        H5Pclose(dcpl);
+        H5Dclose(did);
+    } H5E_END_TRY;
+
+     return(-1);
+
+} /* convert() */
+
+/*-------------------------------------------------------------------------
+ * Function: convert_dsets_cb()
+ *
+ * Purpose:  The callback routine from the traversal to convert the
+ *	     chunk indexing type of the dataset object.
+ *
+ * Return: Success: 0
+ *  	   Failure: 1
+ *-------------------------------------------------------------------------
+ */
+static int
+convert_dsets_cb(const char *path, const H5O_info_t *oi, const char *already_visited, void *_fid)
+{
+    hid_t fid = *(hid_t *)_fid;
+
+    /* If the object has already been seen then just return */
+    if(NULL == already_visited) {
+
+        if(oi->type == H5O_TYPE_DATASET) {
+	    if(verbose_g)
+		printf("Going to process dataset:%s...\n", path);
+	    if(convert(fid, path) < 0)
+		goto error;
+	}
+
+    } /* end if */
+
+    return 0;
+
+error:
+    return -1;
+
+} /* end convert_dsets_cb() */
+
+

+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ * Purpose: To convert the chunk indexing type of a dataset in a file to
+ *	    version 1 B-tree.
+ *
+ * Return: Success: 0
+ *  	   Failure: 1
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(int argc, const char *argv[])
+{
+    H5E_auto2_t func;
+    void *edata;
+    hid_t fid = -1;
+
+    h5tools_setprogname(PROGRAMNAME);
+    h5tools_setstatus(EXIT_SUCCESS);
+
+    /* Disable error reporting */
+    H5Eget_auto2(H5E_DEFAULT, &func, &edata);
+    H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
+
+    /* Initialize h5tools lib */
+    h5tools_init();
+
+    /* Parse command line options */
+    if(parse_command_line(argc, argv) < 0)
+	goto done;
+    else if(verbose_g)
+	printf("Process command line options\n");
+
+    if(noop_g && verbose_g)
+	printf("It is noop...\n");
+
+    /* Open the HDF5 file */
+    if((fid = h5tools_fopen(fname_g, H5F_ACC_RDWR, H5P_DEFAULT, NULL, NULL, 0)) < 0) {
+	error_msg("unable to open file \"%s\"\n", fname_g);
+	h5tools_setstatus(EXIT_FAILURE);
+	goto done;
+    } else if(verbose_g)
+	printf("Open the file %s\n", fname_g);
+
+    if(dset_g) { /* Convert a specified dataset in the file */
+	if(verbose_g)
+	    printf("Going to process dataset: %s...\n", dname_g);
+	if(convert(fid, dname_g) < 0)
+	    goto done;
+    } else { /* Convert all datasets in the file */
+	if(verbose_g)
+	    printf("Processing all datasets in the file...\n");
+	if(h5trav_visit(fid, "/", TRUE, TRUE, convert_dsets_cb, NULL, &fid) < 0)
+	    goto done;
+    }
+
+done:
+    /* Close the file */
+    if(fid >= 0) {
+	if(H5Fclose(fid) < 0) {
+	    error_msg("unable to close file \"%s\"\n", fname_g);
+	    h5tools_setstatus(EXIT_FAILURE);
+	} else if(verbose_g)
+	    printf("Close the file\n");
+    } 
+
+    if(fname_g)
+	HDfree(fname_g);
+    if(dname_g)
+	HDfree(dname_g);
+    
+    H5Eset_auto2(H5E_DEFAULT, func, edata);
+    leave(h5tools_getstatus());
+
+} /* end main() */
diff --git a/tools/h5format_convert/testfiles/h5fc_d_file.ddl b/tools/h5format_convert/testfiles/h5fc_d_file.ddl
new file mode 100644
index 0000000..3641a4f
--- /dev/null
+++ b/tools/h5format_convert/testfiles/h5fc_d_file.ddl
@@ -0,0 +1,22 @@
+usage: h5format_convert [OPTIONS] file_name
+  OPTIONS
+   -h, --help				Print a usage message and exit
+   -V, --version			Print version number and exit
+   -v, --verbose			Turn on verbose mode
+   -d dname, --dname=dataset_name	Pathname for the dataset
+   -n, --noop				Perform all the steps except the actual conversion
+
+Examples of use:
+
+h5format_convert -d /group/dataset file_name
+  Convert the chunk indexing type to version 1 B-tree
+  for the chunked dataset </group/dataset> in the HDF5 file <file_name>.
+
+h5format_convert file_name
+  Convert the chunk indexing type to version 1 B-tree
+  for all the chunked datasets in the HDF5 file <file_name>.
+
+h5format_convert -n -d /group/dataset file_name
+  Go through all the steps except the actual conversion when 
+  converting the chunked dataset </group/dataset> in the HDF5 file <file_name>.
+h5format_convert error: missing file name
diff --git a/tools/h5format_convert/testfiles/h5fc_dname.ddl b/tools/h5format_convert/testfiles/h5fc_dname.ddl
new file mode 100644
index 0000000..c391764
--- /dev/null
+++ b/tools/h5format_convert/testfiles/h5fc_dname.ddl
@@ -0,0 +1,22 @@
+usage: h5format_convert [OPTIONS] file_name
+  OPTIONS
+   -h, --help				Print a usage message and exit
+   -V, --version			Print version number and exit
+   -v, --verbose			Turn on verbose mode
+   -d dname, --dname=dataset_name	Pathname for the dataset
+   -n, --noop				Perform all the steps except the actual conversion
+
+Examples of use:
+
+h5format_convert -d /group/dataset file_name
+  Convert the chunk indexing type to version 1 B-tree
+  for the chunked dataset </group/dataset> in the HDF5 file <file_name>.
+
+h5format_convert file_name
+  Convert the chunk indexing type to version 1 B-tree
+  for all the chunked datasets in the HDF5 file <file_name>.
+
+h5format_convert -n -d /group/dataset file_name
+  Go through all the steps except the actual conversion when 
+  converting the chunked dataset </group/dataset> in the HDF5 file <file_name>.
+h5format_convert error: No dataset name
diff --git a/tools/h5format_convert/testfiles/h5fc_edge_v3.h5 b/tools/h5format_convert/testfiles/h5fc_edge_v3.h5
new file mode 100644
index 0000000..debeda4
Binary files /dev/null and b/tools/h5format_convert/testfiles/h5fc_edge_v3.h5 differ
diff --git a/tools/h5format_convert/testfiles/h5fc_help.ddl b/tools/h5format_convert/testfiles/h5fc_help.ddl
new file mode 100644
index 0000000..9081ab8
--- /dev/null
+++ b/tools/h5format_convert/testfiles/h5fc_help.ddl
@@ -0,0 +1,21 @@
+usage: h5format_convert [OPTIONS] file_name
+  OPTIONS
+   -h, --help				Print a usage message and exit
+   -V, --version			Print version number and exit
+   -v, --verbose			Turn on verbose mode
+   -d dname, --dname=dataset_name	Pathname for the dataset
+   -n, --noop				Perform all the steps except the actual conversion
+
+Examples of use:
+
+h5format_convert -d /group/dataset file_name
+  Convert the chunk indexing type to version 1 B-tree
+  for the chunked dataset </group/dataset> in the HDF5 file <file_name>.
+
+h5format_convert file_name
+  Convert the chunk indexing type to version 1 B-tree
+  for all the chunked datasets in the HDF5 file <file_name>.
+
+h5format_convert -n -d /group/dataset file_name
+  Go through all the steps except the actual conversion when 
+  converting the chunked dataset </group/dataset> in the HDF5 file <file_name>.
diff --git a/tools/h5format_convert/testfiles/h5fc_latest_v3.h5 b/tools/h5format_convert/testfiles/h5fc_latest_v3.h5
new file mode 100644
index 0000000..f7de743
Binary files /dev/null and b/tools/h5format_convert/testfiles/h5fc_latest_v3.h5 differ
diff --git a/tools/h5format_convert/testfiles/h5fc_non_v3.h5 b/tools/h5format_convert/testfiles/h5fc_non_v3.h5
new file mode 100644
index 0000000..b1bffa8
Binary files /dev/null and b/tools/h5format_convert/testfiles/h5fc_non_v3.h5 differ
diff --git a/tools/h5format_convert/testfiles/h5fc_nonexistdset_file.ddl b/tools/h5format_convert/testfiles/h5fc_nonexistdset_file.ddl
new file mode 100644
index 0000000..39450c0
--- /dev/null
+++ b/tools/h5format_convert/testfiles/h5fc_nonexistdset_file.ddl
@@ -0,0 +1 @@
+h5format_convert error: unable to open dataset "nonexist"
diff --git a/tools/h5format_convert/testfiles/h5fc_nonexistfile.ddl b/tools/h5format_convert/testfiles/h5fc_nonexistfile.ddl
new file mode 100644
index 0000000..706ea9d
--- /dev/null
+++ b/tools/h5format_convert/testfiles/h5fc_nonexistfile.ddl
@@ -0,0 +1 @@
+h5format_convert error: unable to open file "nonexist.h5"
diff --git a/tools/h5format_convert/testfiles/h5fc_nooption.ddl b/tools/h5format_convert/testfiles/h5fc_nooption.ddl
new file mode 100644
index 0000000..9081ab8
--- /dev/null
+++ b/tools/h5format_convert/testfiles/h5fc_nooption.ddl
@@ -0,0 +1,21 @@
+usage: h5format_convert [OPTIONS] file_name
+  OPTIONS
+   -h, --help				Print a usage message and exit
+   -V, --version			Print version number and exit
+   -v, --verbose			Turn on verbose mode
+   -d dname, --dname=dataset_name	Pathname for the dataset
+   -n, --noop				Perform all the steps except the actual conversion
+
+Examples of use:
+
+h5format_convert -d /group/dataset file_name
+  Convert the chunk indexing type to version 1 B-tree
+  for the chunked dataset </group/dataset> in the HDF5 file <file_name>.
+
+h5format_convert file_name
+  Convert the chunk indexing type to version 1 B-tree
+  for all the chunked datasets in the HDF5 file <file_name>.
+
+h5format_convert -n -d /group/dataset file_name
+  Go through all the steps except the actual conversion when 
+  converting the chunked dataset </group/dataset> in the HDF5 file <file_name>.
diff --git a/tools/h5format_convert/testfiles/h5fc_v1.h5 b/tools/h5format_convert/testfiles/h5fc_v1.h5
new file mode 100644
index 0000000..d3d66f8
Binary files /dev/null and b/tools/h5format_convert/testfiles/h5fc_v1.h5 differ
diff --git a/tools/h5format_convert/testfiles/h5fc_v_all.ddl b/tools/h5format_convert/testfiles/h5fc_v_all.ddl
new file mode 100644
index 0000000..3f474fe
--- /dev/null
+++ b/tools/h5format_convert/testfiles/h5fc_v_all.ddl
@@ -0,0 +1,26 @@
+Process command line options
+Open the file tmp.h5
+Processing all datasets in the file...
+Going to process dataset:/DSET_NDATA_BT1...
+Open the dataset
+Retrieve the dataset's layout
+Verify the dataset is a chunked dataset
+Retrieve the dataset's chunk indexing type
+Chunk indexing type is already version 1 B-tree: no further action
+Close the dataset
+Close the dataset creation property list
+Going to process dataset:/DSET_NON_CHUNKED...
+Open the dataset
+Retrieve the dataset's layout
+Dataset is not chunked: no further action
+Close the dataset
+Close the dataset creation property list
+Going to process dataset:/GROUP/DSET_BT1...
+Open the dataset
+Retrieve the dataset's layout
+Verify the dataset is a chunked dataset
+Retrieve the dataset's chunk indexing type
+Chunk indexing type is already version 1 B-tree: no further action
+Close the dataset
+Close the dataset creation property list
+Close the file
diff --git a/tools/h5format_convert/testfiles/h5fc_v_bt1.ddl b/tools/h5format_convert/testfiles/h5fc_v_bt1.ddl
new file mode 100644
index 0000000..abb0a89
--- /dev/null
+++ b/tools/h5format_convert/testfiles/h5fc_v_bt1.ddl
@@ -0,0 +1,11 @@
+Process command line options
+Open the file tmp.h5
+Going to process dataset: /GROUP/DSET_BT1...
+Open the dataset
+Retrieve the dataset's layout
+Verify the dataset is a chunked dataset
+Retrieve the dataset's chunk indexing type
+Chunk indexing type is already version 1 B-tree: no further action
+Close the dataset
+Close the dataset creation property list
+Close the file
diff --git a/tools/h5format_convert/testfiles/h5fc_v_n_1d.ddl b/tools/h5format_convert/testfiles/h5fc_v_n_1d.ddl
new file mode 100644
index 0000000..a26dc66
--- /dev/null
+++ b/tools/h5format_convert/testfiles/h5fc_v_n_1d.ddl
@@ -0,0 +1,13 @@
+Process command line options
+It is noop...
+Open the file tmp.h5
+Going to process dataset: /DSET_EA...
+Open the dataset
+Retrieve the dataset's layout
+Verify the dataset is a chunked dataset
+Retrieve the dataset's chunk indexing type
+Verify the dataset's chunk indexing type is not version 1 B-tree
+Not converting the dataset
+Close the dataset
+Close the dataset creation property list
+Close the file
diff --git a/tools/h5format_convert/testfiles/h5fc_v_n_all.ddl b/tools/h5format_convert/testfiles/h5fc_v_n_all.ddl
new file mode 100644
index 0000000..76c70ee
--- /dev/null
+++ b/tools/h5format_convert/testfiles/h5fc_v_n_all.ddl
@@ -0,0 +1,47 @@
+Process command line options
+It is noop...
+Open the file tmp.h5
+Processing all datasets in the file...
+Going to process dataset:/DSET_NDATA_BT2...
+Open the dataset
+Retrieve the dataset's layout
+Verify the dataset is a chunked dataset
+Retrieve the dataset's chunk indexing type
+Verify the dataset's chunk indexing type is not version 1 B-tree
+Not converting the dataset
+Close the dataset
+Close the dataset creation property list
+Going to process dataset:/DSET_NDATA_EA...
+Open the dataset
+Retrieve the dataset's layout
+Verify the dataset is a chunked dataset
+Retrieve the dataset's chunk indexing type
+Verify the dataset's chunk indexing type is not version 1 B-tree
+Not converting the dataset
+Close the dataset
+Close the dataset creation property list
+Going to process dataset:/GROUP/DSET_BT2...
+Open the dataset
+Retrieve the dataset's layout
+Verify the dataset is a chunked dataset
+Retrieve the dataset's chunk indexing type
+Verify the dataset's chunk indexing type is not version 1 B-tree
+Not converting the dataset
+Close the dataset
+Close the dataset creation property list
+Going to process dataset:/GROUP/DSET_EA...
+Open the dataset
+Retrieve the dataset's layout
+Verify the dataset is a chunked dataset
+Retrieve the dataset's chunk indexing type
+Verify the dataset's chunk indexing type is not version 1 B-tree
+Not converting the dataset
+Close the dataset
+Close the dataset creation property list
+Going to process dataset:/GROUP/DSET_NON_CHUNKED...
+Open the dataset
+Retrieve the dataset's layout
+Dataset is not chunked: no further action
+Close the dataset
+Close the dataset creation property list
+Close the file
diff --git a/tools/h5format_convert/testfiles/h5fc_v_ndata_bt1.ddl b/tools/h5format_convert/testfiles/h5fc_v_ndata_bt1.ddl
new file mode 100644
index 0000000..86081f3
--- /dev/null
+++ b/tools/h5format_convert/testfiles/h5fc_v_ndata_bt1.ddl
@@ -0,0 +1,12 @@
+Process command line options
+It is noop...
+Open the file tmp.h5
+Going to process dataset: /DSET_NDATA_BT1...
+Open the dataset
+Retrieve the dataset's layout
+Verify the dataset is a chunked dataset
+Retrieve the dataset's chunk indexing type
+Chunk indexing type is already version 1 B-tree: no further action
+Close the dataset
+Close the dataset creation property list
+Close the file
diff --git a/tools/h5format_convert/testfiles/h5fc_v_non_chunked.ddl b/tools/h5format_convert/testfiles/h5fc_v_non_chunked.ddl
new file mode 100644
index 0000000..baba0e4
--- /dev/null
+++ b/tools/h5format_convert/testfiles/h5fc_v_non_chunked.ddl
@@ -0,0 +1,9 @@
+Process command line options
+Open the file tmp.h5
+Going to process dataset: /DSET_NON_CHUNKED...
+Open the dataset
+Retrieve the dataset's layout
+Dataset is not chunked: no further action
+Close the dataset
+Close the dataset creation property list
+Close the file
diff --git a/tools/h5format_convert/testh5fc.sh.in b/tools/h5format_convert/testh5fc.sh.in
new file mode 100644
index 0000000..dc5aa48
--- /dev/null
+++ b/tools/h5format_convert/testh5fc.sh.in
@@ -0,0 +1,400 @@
+#! /bin/sh
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+#
+# Tests for the h5format_convert tool
+#
+#
+
+srcdir=@srcdir@
+
+# Determine which filters are available
+USE_FILTER_SZIP="@USE_FILTER_SZIP@"
+USE_FILTER_DEFLATE="@USE_FILTER_DEFLATE@"
+USE_FILTER_SHUFFLE="@USE_FILTER_SHUFFLE@"
+USE_FILTER_FLETCHER32="@USE_FILTER_FLETCHER32@"
+USE_FILTER_NBIT="@USE_FILTER_NBIT@"
+USE_FILTER_SCALEOFFSET="@USE_FILTER_SCALEOFFSET@"
+
+TESTNAME=h5format_convert
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+FORMCONV=h5format_convert       # The tool name
+FORMCONV_BIN=`pwd`/$FORMCONV    # The path of the tool binary
+
+CHK_IDX=h5fc_chk_idx		# The program name
+CHK_IDX_BIN=`pwd`/$CHK_IDX    	# The program to verify the chunk indexing type is v1 B-tree
+
+RM='rm -rf'
+CMP='cmp -s'
+DIFF='diff -c'
+CP='cp'
+DIRNAME='dirname'
+LS='ls'
+AWK='awk'
+
+nerrors=0
+verbose=yes
+
+# source dirs
+SRC_TOOLS="$srcdir/.."
+SRC_TOOLS_TESTFILES="$SRC_TOOLS/testfiles"
+
+# testfiles source dirs for tools
+SRC_H5LS_TESTFILES="$SRC_TOOLS_TESTFILES"
+SRC_H5DUMP_TESTFILES="$SRC_TOOLS_TESTFILES"
+SRC_H5DIFF_TESTFILES="$SRC_TOOLS/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/h5import/testfiles"
+SRC_H5FORMCONV_TESTFILES="$SRC_TOOLS/h5format_convert/testfiles"
+
+TESTDIR=./testfiles
+test -d $TESTDIR || mkdir $TESTDIR
+
+# Copy the testfile to a temporary file for testing as h5format_convert is changing the file in place
+TMPFILE=tmp.h5
+
+######################################################################
+# test files
+# --------------------------------------------------------------------
+# All the test files copy from source directory to test directory
+# NOTE: Keep this framework to add/remove test files.
+#       Any test files from other tools can be used in this framework.
+#       This list are also used for checking exist.
+#       Comment '#' without space can be used.
+# --------------------------------------------------------------------
+LIST_HDF5_TEST_FILES="
+$SRC_H5FORMCONV_TESTFILES/h5fc_v1.h5
+$SRC_H5FORMCONV_TESTFILES/h5fc_latest_v3.h5
+$SRC_H5FORMCONV_TESTFILES/h5fc_non_v3.h5
+$SRC_H5FORMCONV_TESTFILES/h5fc_edge_v3.h5
+"
+
+LIST_OTHER_TEST_FILES="
+$SRC_H5FORMCONV_TESTFILES/h5fc_help.ddl
+$SRC_H5FORMCONV_TESTFILES/h5fc_nooption.ddl
+$SRC_H5FORMCONV_TESTFILES/h5fc_nonexistfile.ddl
+$SRC_H5FORMCONV_TESTFILES/h5fc_d_file.ddl
+$SRC_H5FORMCONV_TESTFILES/h5fc_dname.ddl
+$SRC_H5FORMCONV_TESTFILES/h5fc_nonexistdset_file.ddl
+$SRC_H5FORMCONV_TESTFILES/h5fc_v_non_chunked.ddl
+$SRC_H5FORMCONV_TESTFILES/h5fc_v_bt1.ddl
+$SRC_H5FORMCONV_TESTFILES/h5fc_v_ndata_bt1.ddl
+$SRC_H5FORMCONV_TESTFILES/h5fc_v_all.ddl
+$SRC_H5FORMCONV_TESTFILES/h5fc_v_n_1d.ddl
+$SRC_H5FORMCONV_TESTFILES/h5fc_v_n_all.ddl
+"
+
+#
+# copy test files and expected output files from source dirs to test dir
+#
+COPY_TESTFILES="$LIST_HDF5_TEST_FILES $LIST_OTHER_TEST_FILES"
+
+COPY_TESTFILES_TO_TESTDIR()
+{
+    # copy test files. Used -f to make sure get a new copy
+    for tstfile in $COPY_TESTFILES
+    do
+        # ignore '#' comment
+        echo $tstfile | tr -d ' ' | grep '^#' > /dev/null
+        RET=$?
+        if [ $RET -eq 1 ]; then
+            # skip cp if srcdir is same as destdir
+            # this occurs when build/test performed in source dir and
+            # make cp fail
+            SDIR=`$DIRNAME $tstfile`
+            INODE_SDIR=`$LS -i -d $SDIR | $AWK -F' ' '{print $1}'`
+            INODE_DDIR=`$LS -i -d $TESTDIR | $AWK -F' ' '{print $1}'`
+            if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then
+    	        $CP -f $tstfile $TESTDIR
+                if [ $? -ne 0 ]; then
+                    echo "Error: FAILED to copy $tstfile ."
+                
+                    # Comment out this to CREATE expected file
+                    exit $EXIT_FAILURE
+                fi
+            fi
+        fi
+    done
+}
+
+CLEAN_TESTFILES_AND_TESTDIR()
+{
+    # skip rm if srcdir is same as destdir
+    # this occurs when build/test performed in source dir and
+    # make cp fail
+    SDIR=`$DIRNAME $tstfile`
+    INODE_SDIR=`$LS -i -d $SDIR | $AWK -F' ' '{print $1}'`
+    INODE_DDIR=`$LS -i -d $TESTDIR | $AWK -F' ' '{print $1}'`
+    if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then
+        $RM $TESTDIR
+    else
+	$RM $TESTDIR/$TMPFILE
+    fi
+}
+
+# Print a line-line message left justified in a field of 80 characters
+# beginning with the word "Testing".
+#
+TESTING() {
+   SPACES="                                                               "
+   echo "Testing $* $SPACES" | cut -c1-80 | tr -d '\012'
+}
+
+# Run a test and print PASS or *FAIL*.  If a test fails then increment
+# the `nerrors' global variable and (if $verbose is set) display the
+# difference between the actual output and the expected output. The
+# expected output is given as the first argument to this function and
+# the actual output file is calculated by replacing the `.ddl' with
+# `.out'.  The actual output is not removed if $HDF5_NOCLEANUP has a
+# non-zero value.
+#
+# $1: expected output
+# $2: the test file name 
+#	--fname might be empty or fname does not exist
+#	--fname is copied to a temporary file for testing
+# $3 to at most $6--options to the tool such as:
+# 	-d dname or --dname=dname 
+# 	-v or --verbose
+# 	-n or --noop
+TOOLTEST_OUT() {
+    # Prepare expected and actual output
+    expect="$TESTDIR/$1"
+    actual="$TESTDIR/`basename $1 .ddl`.out"
+    actual_err="$TESTDIR/`basename $1 .ddl`.err"
+    actual_sav=${actual}-sav
+    actual_err_sav=${actual_err}-sav
+
+    # Prepare the test file
+    $RM $TESTDIR/$TMPFILE
+    TFILE=$2
+    if [ ! -z "$2" ] && [ -e $TESTDIR/$2 ] ; then
+	$CP $TESTDIR/$2 $TESTDIR/$TMPFILE
+	TFILE=$TMPFILE
+    fi
+
+    # Run test.
+    TESTING $FORMCONV $3 $4 $5 $6 $2
+    (
+	cd $TESTDIR
+	$RUNSERIAL $FORMCONV_BIN $3 $4 $5 $6 $TFILE
+    ) >$actual 2>$actual_err
+    cp $actual $actual_sav
+    cp $actual_err $actual_err_sav
+    cat $actual_err >> $actual
+
+    # Compare output
+    if $CMP $expect $actual; then
+	echo " PASSED"
+    else
+	echo "*FAILED*"
+	echo "    Expected result (*.ddl) differs from actual result (*.out)"
+	nerrors="`expr $nerrors + 1`"
+	test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    fi
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+	$RM $actual $actual_err
+	$RM $actual $actual_err $actual_sav $actual_err_sav
+    fi
+}
+
+# To check that the tool exits success, no output 
+# Assume all short options
+# $1 is the test file name 
+#	--fname exists
+#	--fname is copied to a temporary file for testing
+# $2 to at most $4--options to the tool such as:
+# 	-d dname
+# 	-n
+TOOLTEST() {
+    TESTING $FORMCONV $2 $3 $4 $1
+    $RM $TESTDIR/$TMPFILE
+    $CP $TESTDIR/$1 $TESTDIR/$TMPFILE
+    $RUNSERIAL $FORMCONV_BIN $2 $3 $4 $TESTDIR/$TMPFILE
+    exitcode=$?
+    if [ $exitcode -ne 0 ]; then
+	echo "*FAILED*"
+	echo "    The tool exits failure"
+	nerrors="`expr $nerrors + 1`"
+    else
+	echo " PASSED"
+    fi
+}
+
+CHECKING() {
+   SPACES="                                                               "
+   echo "Verifying $* $SPACES" | cut -c1-80 | tr -d '\012'
+}
+
+# $1 dataset name
+# Assume $TESTDIR/$TMPFILE is the converted test file
+IDX_CHECK() {
+    CHECKING $1
+    $RUNSERIAL $CHK_IDX_BIN $TESTDIR/$TMPFILE $1
+    ret=$?
+    if [ $ret -eq 0 ]; then
+	echo " PASSED"
+    else
+	echo "*FAILED*"
+	echo "    The chunk indexing type is not correct"
+	nerrors="`expr $nerrors + 1`"
+    fi
+}
+
+# Print a "SKIP" message
+SKIP() {
+    TESTING $STAT $@
+    echo  " -SKIP-"
+}
+  
+
+
+##############################################################################
+##############################################################################
+###			  T H E   T E S T S                                ###
+##############################################################################
+##############################################################################
+# prepare for test
+COPY_TESTFILES_TO_TESTDIR
+#
+#
+#
+# h5format_convert --help
+# h5format_convert (no options)
+# h5format_convert nonexist.h5  (no options, file does not exist)
+TOOLTEST_OUT h5fc_help.ddl '' --help
+TOOLTEST_OUT h5fc_nooption.ddl ''
+TOOLTEST_OUT h5fc_nonexistfile.ddl nonexist.h5
+#
+#
+# h5format_convert -d h5fc_v1.h5 (just -d option, file exists)
+# h5format_convert --dname h5fc_v1.h5 (just --dname option, file exists)
+# h5format_convert --dname (just --dname option)
+# h5format_convert --dname=nonexist h5fc_v1.h5 (dataset does not exist, file exists)
+TOOLTEST_OUT h5fc_d_file.ddl h5fc_v1.h5 -d
+TOOLTEST_OUT h5fc_d_file.ddl h5fc_v1.h5 --dname
+TOOLTEST_OUT h5fc_dname.ddl '' --dname
+TOOLTEST_OUT h5fc_nonexistdset_file.ddl h5fc_v1.h5 --dname=nonexist
+#
+#
+#
+# h5format_convert -d /DSET_NON_CHUNKED -v h5fc_v1.h5 (verbose, non-chunked dataset)
+# h5format_convert -d /GROUP/DSET_BT1 --verbose h5fc_v1.h5 (verbose, bt1 dataset)
+# h5format_convert -d /DSET_NDATA_BT1 -v -n h5fc_v1.h5 (verbose, noop, bt1+nodata dataset)
+# h5format_convert -v h5fc_v1.h5 (verbose, all datasets)
+TOOLTEST_OUT h5fc_v_non_chunked.ddl h5fc_v1.h5 -d /DSET_NON_CHUNKED -v
+TOOLTEST_OUT h5fc_v_bt1.ddl h5fc_v1.h5 -d /GROUP/DSET_BT1 --verbose
+TOOLTEST_OUT h5fc_v_ndata_bt1.ddl h5fc_v1.h5 -d /DSET_NDATA_BT1 -v -n
+TOOLTEST_OUT h5fc_v_all.ddl h5fc_v1.h5 -v
+#
+#
+#
+# h5format_convert -d /DSET_EA -v -n h5fc_latest_v3.h5 (verbose, noop, one ea dataset)
+# h5format_convert -v -n h5fc_non_v3.h5 (verbose, noop, all datasets)
+TOOLTEST_OUT h5fc_v_n_1d.ddl h5fc_latest_v3.h5 -d /DSET_EA -v -n
+TOOLTEST_OUT h5fc_v_n_all.ddl h5fc_non_v3.h5 -v -n
+#
+#
+#
+# No output from tests
+# 1) Use the tool to convert the dataset
+# 2) Verify the chunk indexing type is correct
+# h5format_convert -d /DSET_EA h5fc_latest_v3.h5
+# h5format_convert -d /GROUP/DSET_NDATA_EA h5fc_latest_v3.h5
+# h5format_convert -d /GROUP/DSET_BT2 h5fc_latest_v3.h5
+# h5format_convert -d /DSET_NDATA_BT2 h5fc_latest_v3.h5
+# h5format_convert -d /DSET_FA h5fc_latest_v3.h5
+# h5format_convert -d /GROUP/DSET_FA h5fc_latest_v3.h5
+# h5format_convert -d /DSET_NONE h5fc_latest_v3.h5
+# h5format_convert -d /GROUP/DSET_NONE h5fc_latest_v3.h5
+TOOLTEST h5fc_latest_v3.h5 -d /DSET_EA
+IDX_CHECK /DSET_EA
+#
+TOOLTEST h5fc_latest_v3.h5 -d /GROUP/DSET_NDATA_EA
+IDX_CHECK /GROUP/DSET_NDATA_EA
+#
+TOOLTEST h5fc_latest_v3.h5 -d /GROUP/DSET_BT2
+IDX_CHECK /GROUP/DSET_BT2
+#
+TOOLTEST h5fc_latest_v3.h5 -d /DSET_NDATA_BT2
+IDX_CHECK /DSET_NDATA_BT2
+#
+TOOLTEST h5fc_latest_v3.h5 -d /DSET_FA
+IDX_CHECK /DSET_FA
+#
+TOOLTEST h5fc_latest_v3.h5 -d /GROUP/DSET_NDATA_FA
+IDX_CHECK /GROUP/DSET_NDATA_FA
+#
+TOOLTEST h5fc_latest_v3.h5 -d /DSET_NONE
+IDX_CHECK /DSET_NONE
+#
+TOOLTEST h5fc_latest_v3.h5 -d /GROUP/DSET_NDATA_NONE
+IDX_CHECK /GROUP/DSET_NDATA_NONE
+#
+#
+#
+# No output from tests: just check exit code
+# h5format_convert -d /DSET_NDATA_BT1 h5fc_v1.h5 (v1-btree dataset)
+# h5format_convert -d /GROUP/DSET_NON_CHUNKED h5fc_non_v3.h5 (non-chunked dataset)
+TOOLTEST h5fc_v1.h5 -d /DSET_NDATA_BT1
+TOOLTEST h5fc_non_v3.h5 -d /GROUP/DSET_NON_CHUNKED
+#
+#
+#
+# No output from tests: just check exit code
+# h5format_convert -d /GROUP/DSET_BT2 -n h5fc_non_v3.h5 (noop, one dataset)
+# h5format_convert -n h5fc_non_v3.h5 (noop, all datasets)
+TOOLTEST h5fc_non_v3.h5 -d /GROUP/DSET_BT2 -n
+TOOLTEST h5fc_non_v3.h5 -n
+#
+#
+#
+# No output from tests: just check exit code
+# h5format_convert h5fc_non_v3.h5
+# 1) convert all datasets 
+# 2) verify indexing types
+TOOLTEST h5fc_non_v3.h5
+IDX_CHECK /DSET_NDATA_EA
+IDX_CHECK /DSET_NDATA_BT2
+IDX_CHECK /GROUP/DSET_BT2
+IDX_CHECK /GROUP/DSET_EA
+#
+#
+#
+# No output from test: just check exit code
+# h5format_convert h5fc_edge_v3.h5
+# 1) convert the chunked dataset (filter, no-filter-edge-chunk)
+# 2) verify the indexing type
+TOOLTEST h5fc_edge_v3.h5
+IDX_CHECK /DSET_EDGE
+#
+#
+#
+# Clean up temporary files/directories
+CLEAN_TESTFILES_AND_TESTDIR
+
+if test $nerrors -eq 0 ; then
+    echo "All $TESTNAME tests passed."
+    exit $EXIT_SUCCESS
+else
+    echo "$TESTNAME tests failed with $nerrors errors."
+    exit $EXIT_FAILURE
+fi
+
diff --git a/tools/h5import/Makefile.in b/tools/h5import/Makefile.in
index 0778fc2..fadfc0a 100644
--- a/tools/h5import/Makefile.in
+++ b/tools/h5import/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -32,7 +32,17 @@
 #
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -95,22 +105,22 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/h5importtestutil.sh.in $(top_srcdir)/bin/depcomp \
-	$(top_srcdir)/bin/test-driver
 check_PROGRAMS = $(am__EXEEXT_1)
 bin_PROGRAMS = h5import$(EXEEXT)
 TESTS = $(am__EXEEXT_1) $(TEST_SCRIPT)
 subdir = tools/h5import
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES = h5importtestutil.sh
 CONFIG_CLEAN_VPATH_FILES =
 am__installdirs = "$(DESTDIR)$(bindir)"
@@ -143,7 +153,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -393,6 +403,10 @@ am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
 TEST_LOGS = $(am__test_logs2:.sh.log=.log)
 SH_LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
 SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in \
+	$(srcdir)/h5importtestutil.sh.in $(top_srcdir)/bin/depcomp \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -412,7 +426,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -457,14 +470,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -474,13 +495,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -522,9 +542,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -712,7 +743,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/h5import/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign tools/h5import/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -721,7 +751,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -918,7 +948,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1201,6 +1231,8 @@ uninstall-am: uninstall-binPROGRAMS
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am \
 	uninstall-binPROGRAMS
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/tools/h5import/h5import.c b/tools/h5import/h5import.c
index 96fb6f9..9617df3 100644
--- a/tools/h5import/h5import.c
+++ b/tools/h5import/h5import.c
@@ -265,7 +265,7 @@ err:
 static int gtoken(char *s)
 {
     size_t      len;
-    int         token;
+    int         token = ERR;
 
     const char *err1 = "Illegal argument: %s.\n";
 
@@ -995,16 +995,16 @@ out:
  */
 static int processStrHDFData(FILE *strm, struct Input *in, hid_t file_id)
 {
-    hid_t   group_id;
-    hid_t   dset_id;
-    hid_t   space_id;
-    hid_t   mspace_id;
-    hid_t   type_id;
-    hid_t   handle;
-    char   *str1 = NULL;
-    char   *str2 = NULL;
-    char   *str3 = NULL;
-    char    str[1024] = "";
+    hid_t   group_id    = -1;
+    hid_t   dset_id     = -1;
+    hid_t   space_id    = -1;
+    hid_t   mspace_id   = -1;
+    hid_t   type_id     = -1;
+    hid_t   handle      = -1;
+    char   *str1        = NULL;
+    char   *str2        = NULL;
+    char   *str3        = NULL;
+    char    str[1024]   = "";
     int     j;
     hsize_t     line;
 
diff --git a/tools/h5import/testfiles/binfp64.h5 b/tools/h5import/testfiles/binfp64.h5
index 80e3a8a..5426edb 100644
Binary files a/tools/h5import/testfiles/binfp64.h5 and b/tools/h5import/testfiles/binfp64.h5 differ
diff --git a/tools/h5import/testfiles/binin16.h5 b/tools/h5import/testfiles/binin16.h5
index 0825bbc..6d89c63 100644
Binary files a/tools/h5import/testfiles/binin16.h5 and b/tools/h5import/testfiles/binin16.h5 differ
diff --git a/tools/h5import/testfiles/binin32.h5 b/tools/h5import/testfiles/binin32.h5
index fd8faa9..61cc507 100644
Binary files a/tools/h5import/testfiles/binin32.h5 and b/tools/h5import/testfiles/binin32.h5 differ
diff --git a/tools/h5import/testfiles/binin8.h5 b/tools/h5import/testfiles/binin8.h5
index a1d1a37..efd3ae0 100644
Binary files a/tools/h5import/testfiles/binin8.h5 and b/tools/h5import/testfiles/binin8.h5 differ
diff --git a/tools/h5import/testfiles/binuin16.h5 b/tools/h5import/testfiles/binuin16.h5
index c486c89..1af804c 100644
Binary files a/tools/h5import/testfiles/binuin16.h5 and b/tools/h5import/testfiles/binuin16.h5 differ
diff --git a/tools/h5import/testfiles/binuin32.h5 b/tools/h5import/testfiles/binuin32.h5
index 41699d7..e7d12d9 100644
Binary files a/tools/h5import/testfiles/binuin32.h5 and b/tools/h5import/testfiles/binuin32.h5 differ
diff --git a/tools/h5import/testfiles/txtfp32.h5 b/tools/h5import/testfiles/txtfp32.h5
index f74e003..bd41f06 100644
Binary files a/tools/h5import/testfiles/txtfp32.h5 and b/tools/h5import/testfiles/txtfp32.h5 differ
diff --git a/tools/h5import/testfiles/txtfp64.h5 b/tools/h5import/testfiles/txtfp64.h5
index b6ba4f5..41c4e9e 100644
Binary files a/tools/h5import/testfiles/txtfp64.h5 and b/tools/h5import/testfiles/txtfp64.h5 differ
diff --git a/tools/h5import/testfiles/txtin16.h5 b/tools/h5import/testfiles/txtin16.h5
index dc6c1ea..5089c97 100644
Binary files a/tools/h5import/testfiles/txtin16.h5 and b/tools/h5import/testfiles/txtin16.h5 differ
diff --git a/tools/h5import/testfiles/txtin32.h5 b/tools/h5import/testfiles/txtin32.h5
index 350333c..8d547cf 100644
Binary files a/tools/h5import/testfiles/txtin32.h5 and b/tools/h5import/testfiles/txtin32.h5 differ
diff --git a/tools/h5import/testfiles/txtin8.h5 b/tools/h5import/testfiles/txtin8.h5
index 42e7727..61b7165 100644
Binary files a/tools/h5import/testfiles/txtin8.h5 and b/tools/h5import/testfiles/txtin8.h5 differ
diff --git a/tools/h5import/testfiles/txtuin16.h5 b/tools/h5import/testfiles/txtuin16.h5
index 9ee166a..c43b875 100644
Binary files a/tools/h5import/testfiles/txtuin16.h5 and b/tools/h5import/testfiles/txtuin16.h5 differ
diff --git a/tools/h5import/testfiles/txtuin32.h5 b/tools/h5import/testfiles/txtuin32.h5
index 1a4dda5..aec3b0f 100644
Binary files a/tools/h5import/testfiles/txtuin32.h5 and b/tools/h5import/testfiles/txtuin32.h5 differ
diff --git a/tools/h5jam/Makefile.in b/tools/h5jam/Makefile.in
index ed8151f..d03753d 100644
--- a/tools/h5jam/Makefile.in
+++ b/tools/h5jam/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -32,7 +32,17 @@
 #
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -95,22 +105,22 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/testh5jam.sh.in $(top_srcdir)/bin/depcomp \
-	$(top_srcdir)/bin/test-driver
 bin_PROGRAMS = h5jam$(EXEEXT) h5unjam$(EXEEXT)
 check_PROGRAMS = tellub$(EXEEXT) h5jamgentest$(EXEEXT) getub$(EXEEXT)
 TESTS = $(TEST_SCRIPT)
 subdir = tools/h5jam
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES = testh5jam.sh
 CONFIG_CLEAN_VPATH_FILES =
 am__installdirs = "$(DESTDIR)$(bindir)"
@@ -157,7 +167,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -405,6 +415,10 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/testh5jam.sh.in \
+	$(top_srcdir)/bin/depcomp $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -424,7 +438,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -469,14 +482,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -486,13 +507,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -534,9 +554,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -725,7 +756,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/h5jam/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign tools/h5jam/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -734,7 +764,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -946,7 +976,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1223,6 +1253,8 @@ uninstall-am: uninstall-binPROGRAMS
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am \
 	uninstall-binPROGRAMS
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/tools/h5jam/getub.c b/tools/h5jam/getub.c
index 776eaeb..4e02e6b 100644
--- a/tools/h5jam/getub.c
+++ b/tools/h5jam/getub.c
@@ -13,21 +13,14 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-#include <stdio.h>
-#include <fcntl.h>
-
-#ifdef H5_HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
 #include "H5private.h"
 #include "h5tools.h"
 #include "h5tools_utils.h"
 
-void parse_command_line (int argc, const char *argv[]);
+void parse_command_line(int argc, const char *argv[]);
 
 /* Name of tool */
-#define PROGRAMNAME "getub"
+#define PROGRAM_NAME "getub"
 char *nbytes = NULL;
 
 static const char *s_opts = "c:";  /* add more later ? */
@@ -42,19 +35,14 @@ static struct long_options l_opts[] = {
  * Purpose:     Print the usage message
  *
  * Return:      void
- *
- * Programmer:
- *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 static void
 usage (const char *prog)
 {
-  fflush (stdout);
-  fprintf (stdout, "usage: %s -c nb file] \n", prog);
-  fprintf (stdout, "           print first 'nb' byts of file to stdoug.\n");
+    HDfflush(stdout);
+    HDfprintf(stdout, "usage: %s -c nb file] \n", prog);
+    HDfprintf(stdout, "           print first 'nb' byts of file to stdoug.\n");
 }
 
 /*-------------------------------------------------------------------------
@@ -65,112 +53,105 @@ usage (const char *prog)
  * Return:      Success:
  *
  *              Failure:    Exits program with EXIT_FAILURE value.
- *
- * Programmer:
- *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
-
 void
-parse_command_line (int argc, const char *argv[])
+parse_command_line(int argc, const char *argv[])
 {
-  int opt;
-
-  /* parse command line options */
-  while ((opt = get_option (argc, argv, s_opts, l_opts)) != EOF)
-    {
-      switch ((char) opt)
-      {
-      case 'c':
-        nbytes = HDstrdup (opt_arg);
-        break;
-      case '?':
-      default:
-        usage (h5tools_getprogname());
-        exit (EXIT_FAILURE);
-      }
-    }
-
-  if (argc <= opt_ind)
-    {
+    int opt;
+
+    /* parse command line options */
+    while((opt = get_option (argc, argv, s_opts, l_opts)) != EOF) {
+        switch((char) opt) {
+        case 'c':
+            nbytes = HDstrdup(opt_arg);
+            break;
+        case '?':
+        default:
+            usage(h5tools_getprogname());
+            HDexit(EXIT_FAILURE);
+        } /* end switch */
+    } /* end while */
+
+    if(argc <= opt_ind) {
       error_msg("missing file name\n");
-      usage (h5tools_getprogname());
-      exit (EXIT_FAILURE);
-    }
-}
+      usage(h5tools_getprogname());
+      HDexit(EXIT_FAILURE);
+    } /* end if */
+} /* end parse_command_line() */
 
 int
-main (int argc, const char *argv[])
+main(int argc, const char *argv[])
 {
-  int fd;
-  unsigned int size;
-  char *filename;
-  long res;
-  char *buf;
-
-  h5tools_setprogname(PROGRAMNAME);
-  h5tools_setstatus(EXIT_SUCCESS);
-
-  /* Initialize h5tools lib */
-  h5tools_init();
-
-  parse_command_line (argc, argv);
-
-  if (nbytes == NULL)
-    {
-      /* missing arg */
-      error_msg("missing size\n");
-      usage (h5tools_getprogname());
-      exit (EXIT_FAILURE);
-    }
-  if (argc <= (opt_ind))
-    {
-      error_msg("missing file name\n");
-      usage (h5tools_getprogname());
-      exit (EXIT_FAILURE);
-    }
-  filename = HDstrdup (argv[opt_ind]);
-
-  size = 0;
-  res = sscanf (nbytes, "%u", &size);
-  if (res == EOF)
-    {
+    int fd = -1;
+    unsigned size;
+    char *filename = NULL;
+    long res;
+    char *buf = NULL;
+
+    h5tools_setprogname(PROGRAM_NAME);
+    h5tools_setstatus(EXIT_SUCCESS);
+
+    /* Initialize h5tools lib */
+    h5tools_init();
+
+    parse_command_line(argc, argv);
+
+    if(NULL == nbytes) {
+        /* missing arg */
+        error_msg("missing size\n");
+        usage(h5tools_getprogname());
+        goto error;
+    } /* end if */
+
+    if(argc <= (opt_ind)) {
+        error_msg("missing file name\n");
+        usage(h5tools_getprogname());
+        goto error;
+    } /* end if */
+
+    filename = HDstrdup(argv[opt_ind]);
+
+    size = 0;
+    if(EOF == (res = sscanf(nbytes, "%u", &size))) {
       /* fail */
       error_msg("missing file name\n");
-      usage (h5tools_getprogname());
-      exit (EXIT_FAILURE);
-    }
-
-  fd = HDopen (filename, O_RDONLY, 0);
-  if (fd < 0)
-    {
-      error_msg("can't open file %s\n", filename);
-      exit (EXIT_FAILURE);
-    }
-
-  buf = (char *)HDmalloc ((unsigned)(size + 1));
-  if (buf == NULL)
-    {
-      HDclose (fd);
-      exit (EXIT_FAILURE);
-    }
-
-  res = HDread (fd, buf, (unsigned)size);
-
-  if (res < (long)size)
-    {
-      if (buf)
-  HDfree (buf);
-      HDclose (fd);
-      exit (EXIT_FAILURE);
-    }
-
-  HDwrite (1, buf, (unsigned)size);
-
-  if (buf)
-    HDfree (buf);
-  HDclose (fd);
-  return (EXIT_SUCCESS);
-}
+      usage(h5tools_getprogname());
+      goto error;
+    } /* end if */
+
+    if((fd = HDopen(filename, O_RDONLY, 0)) < 0) {
+        error_msg("can't open file %s\n", filename);
+        goto error;
+    } /* end if */
+
+    if(NULL == (buf = (char *)HDmalloc((unsigned)(size + 1)))) {
+        error_msg("can't allocate buffer \n");
+        goto error;
+    } /* end if */
+
+    res = HDread(fd, buf, (unsigned)size);
+    if(res < (long)size) {
+        error_msg("Bad read \n");
+        goto error;
+    } /* end if */
+
+    if(HDwrite(1, buf, (unsigned)size) < 0) {
+        error_msg("Bad write \n");
+        goto error;
+    } /* end if */
+
+    /* close things and exit */
+    HDfree(buf);
+    HDclose(fd);
+
+    return EXIT_SUCCESS;
+
+error:
+    if(buf)
+        HDfree(buf);
+    if(fd > -1)
+        HDclose(fd);
+    return EXIT_FAILURE;
+} /* end main() */
+
diff --git a/tools/h5jam/h5jam.c b/tools/h5jam/h5jam.c
index ab38f65..4509734 100644
--- a/tools/h5jam/h5jam.c
+++ b/tools/h5jam/h5jam.c
@@ -21,9 +21,6 @@
 /* Name of tool */
 #define PROGRAMNAME "h5jam"
 
-#define TRUE 1
-#define FALSE 0
-
 hsize_t write_pad (int, hsize_t);
 hsize_t compute_user_block_size (hsize_t);
 hsize_t copy_some_to_file (int, int, hsize_t, hsize_t, ssize_t);
@@ -421,109 +418,88 @@ main (int argc, const char *argv[])
  * Return:      Success:    last byte written in the output.
  *              Failure:    Exits program with EXIT_FAILURE value.
  *
- * Programmer:
- *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 hsize_t
-copy_some_to_file (int infid, int outfid, hsize_t startin, hsize_t startout,
+copy_some_to_file(int infid, int outfid, hsize_t startin, hsize_t startout,
        ssize_t limit)
 {
-  char buf[1024];
-  h5_stat_t sbuf;
-  int res;
-  ssize_t tot = 0;
-  ssize_t howmuch = 0;
-  ssize_t nchars = -1;
-/* used in assertion check
-  ssize_t ncw = -1;
-*/
-  ssize_t to;
-  ssize_t from;
-  ssize_t toend;
-  ssize_t fromend;
-
-  if(startin > startout) {
-      /* this case is prohibited */
-      error_msg("copy_some_to_file: panic: startin > startout?\n");
-      exit (EXIT_FAILURE);
-    }
-
-  if(limit < 0) {
-      res = HDfstat(infid, &sbuf);
-      if(res < 0) {
-    error_msg("Can't stat file \n");
-    exit (EXIT_FAILURE);
-  }
-
-      howmuch = (ssize_t)sbuf.st_size;
-    }
-  else
-      howmuch = limit;
-
-  if(howmuch == 0)
-      return 0;
-
-  /* assert (howmuch > 0) */
-
-  toend = (ssize_t) startout + howmuch;
-  fromend = (ssize_t) startin + howmuch;
-
-  if (howmuch > 512)
-    {
-      to = toend - 512;
-      from = fromend - 512;
-    }
-  else
-    {
-      to = toend - howmuch;
-      from = fromend - howmuch;
-    }
-
-  while (howmuch > 0)
-    {
-      HDlseek (outfid, (off_t) to, SEEK_SET);
-      HDlseek (infid, (off_t) from, SEEK_SET);
-
-      if (howmuch > 512)
-  {
-    nchars = HDread (infid, buf, (unsigned) 512);
-  }
-      else
-  {
-    nchars = HDread (infid, buf, (unsigned)howmuch);
-  }
-
-      if (nchars <= 0)
-  {
-    printf ("huh? \n");
-    exit (EXIT_FAILURE);
-  }
-      /*ncw = */ HDwrite (outfid, buf, (unsigned) nchars);
-
-      /* assert (ncw == nchars) */
-
-      tot += nchars;
-      howmuch -= nchars;
-      if (howmuch > 512)
-  {
-    to -= nchars;
-    from -= nchars;
-  }
-      else
-  {
-    to -= howmuch;
-    from -= howmuch;
-  }
-    }
+    char buf[1024];
+    h5_stat_t sbuf;
+    int res;
+    ssize_t tot = 0;
+    ssize_t howmuch = 0;
+    ssize_t nchars = -1;
+    ssize_t to;
+    ssize_t from;
+    ssize_t toend;
+    ssize_t fromend;
+
+    if(startin > startout) {
+        /* this case is prohibited */
+        error_msg("copy_some_to_file: panic: startin > startout?\n");
+        exit (EXIT_FAILURE);
+    } /* end if */
+
+    if(limit < 0) {
+        res = HDfstat(infid, &sbuf);
+        if(res < 0) {
+            error_msg("Can't stat file \n");
+            HDexit(EXIT_FAILURE);
+        } /* end if */
+
+        howmuch = (ssize_t)sbuf.st_size;
+    } else {
+        howmuch = limit;
+    } /* end if */
+
+    if(0 == howmuch)
+        return 0;
+
+    toend = (ssize_t) startout + howmuch;
+    fromend = (ssize_t) startin + howmuch;
+
+    if (howmuch > 512) {
+        to = toend - 512;
+        from = fromend - 512;
+    } else {
+        to = toend - howmuch;
+        from = fromend - howmuch;
+    } /* end if */
+
+    while (howmuch > 0) {
+        HDlseek(outfid, (off_t) to, SEEK_SET);
+        HDlseek(infid, (off_t) from, SEEK_SET);
+
+        if (howmuch > 512) {
+            nchars = HDread(infid, buf, (unsigned) 512);
+        } else {
+            nchars = HDread(infid, buf, (unsigned)howmuch);
+        } /* end if */
+
+        if (nchars <= 0) {
+            error_msg("Read error \n");
+            HDexit(EXIT_FAILURE);
+        } /* end if */
+
+        if(HDwrite (outfid, buf, (unsigned) nchars) < 0) {
+            error_msg("Write error \n");
+            HDexit(EXIT_FAILURE);
+        }
 
-  /* assert howmuch == 0 */
-  /* assert tot == limit */
+        tot += nchars;
+        howmuch -= nchars;
+        if(howmuch > 512) {
+            to -= nchars;
+            from -= nchars;
+        } else {
+            to -= howmuch;
+            from -= howmuch;
+        } /* end if */
+    } /* end while */
 
-  return ((hsize_t) tot + (hsize_t) startout);
-}
+    return (hsize_t)tot + (hsize_t)startout;
+} /* end copy_some_to_file() */
 
 
 /*-------------------------------------------------------------------------
@@ -539,28 +515,21 @@ copy_some_to_file (int infid, int outfid, hsize_t startin, hsize_t startout,
  *
  * Return:      Success:    last byte written in the output.
  *              Failure:    Exits program with EXIT_FAILURE value.
- *
- * Programmer:
- *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
-hsize_t
-compute_user_block_size (hsize_t ublock_size)
+H5_ATTR_CONST hsize_t
+compute_user_block_size(hsize_t ublock_size)
 {
-  hsize_t where = 512;
+    hsize_t where = 512;
 
-  if (ublock_size == 0)
-    return 0;
+    if(0 == ublock_size)
+        return 0;
 
-  while (where < ublock_size)
-    {
-      where *= 2;
-    }
+    while(where < ublock_size)
+        where *= 2;
 
-  return (where);
-}
+    return where;
+} /* end compute_user_block_size() */
 
 /*
  *  Write zeroes to fill the file from 'where' to 512, 1024, etc. bytes.
diff --git a/tools/h5jam/h5jamgentest.c b/tools/h5jam/h5jamgentest.c
index 5f24566..d3166b5 100644
--- a/tools/h5jam/h5jamgentest.c
+++ b/tools/h5jam/h5jamgentest.c
@@ -89,12 +89,6 @@ typedef struct s1_t {
 } s1_t;
 
 
-/* 1-D array datatype */
-#define ARRAY1_RANK 1
-
-/* 2-D array datatype */
-#define ARRAY3_DIM2 3
-
 /* A UD link traversal function.  Shouldn't actually be called. */
 static hid_t UD_traverse(const char H5_ATTR_UNUSED * link_name, hid_t H5_ATTR_UNUSED cur_group,
     const void H5_ATTR_UNUSED * udata, size_t H5_ATTR_UNUSED udata_size, hid_t H5_ATTR_UNUSED lapl_id)
@@ -308,7 +302,7 @@ create_textfile(const char *name, size_t size)
 
     fd = HDcreat(name,0777);
     HDassert(fd >= 0);
-    buf = HDcalloc(size, (size_t)1);
+    buf = (char *)HDcalloc(size, (size_t)1);
     HDassert(buf);
 
     /* fill buf with pattern */
diff --git a/tools/h5jam/h5unjam.c b/tools/h5jam/h5unjam.c
index 40358c6..8e4eac4 100644
--- a/tools/h5jam/h5unjam.c
+++ b/tools/h5jam/h5unjam.c
@@ -21,8 +21,6 @@
 /* Name of tool */
 #define PROGRAMNAME "h5unjam"
 
-#define TRUE 1
-#define FALSE 0
 #define COPY_BUF_SIZE 1024
 
 hsize_t write_pad( int , hsize_t );
diff --git a/tools/h5ls/CMakeLists.txt b/tools/h5ls/CMakeLists.txt
index 4e96db2..6e7f00c 100644
--- a/tools/h5ls/CMakeLists.txt
+++ b/tools/h5ls/CMakeLists.txt
@@ -23,6 +23,8 @@ if (BUILD_TESTING)
 
   include (CMakeTests.cmake)
 
+  include (CMakeTestsVDS.cmake)
+
 endif (BUILD_TESTING)
 
 ##############################################################################
diff --git a/tools/h5ls/CMakeTestsVDS.cmake b/tools/h5ls/CMakeTestsVDS.cmake
new file mode 100644
index 0000000..1ef3f20
--- /dev/null
+++ b/tools/h5ls/CMakeTestsVDS.cmake
@@ -0,0 +1,149 @@
+
+##############################################################################
+##############################################################################
+###           T E S T I N G                                                ###
+##############################################################################
+##############################################################################
+
+  # --------------------------------------------------------------------
+  # Copy all the test files from source directory to test directory
+  # --------------------------------------------------------------------
+  set (LIST_HDF5_TEST_FILES
+      1_a.h5
+      1_b.h5
+      1_c.h5
+      1_d.h5
+      1_e.h5
+      1_f.h5
+      1_vds.h5
+      2_a.h5
+      2_b.h5
+      2_c.h5
+      2_d.h5
+      2_e.h5
+      2_vds.h5
+      3_1_vds.h5
+      3_2_vds.h5
+      4_0.h5
+      4_1.h5
+      4_2.h5
+      4_vds.h5
+      5_a.h5
+      5_b.h5
+      5_c.h5
+      5_vds.h5
+  )
+
+  set (LIST_OTHER_TEST_FILES
+      tvds-1.ls
+      tvds-2.ls
+      tvds-3_1.ls
+      tvds-3_2.ls
+      tvds-4.ls
+      tvds-5.ls
+  )
+
+  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles")
+
+  # copy the list of test files
+  foreach (listfiles ${LIST_HDF5_TEST_FILES} ${LIST_OTHER_TEST_FILES})
+    GET_FILENAME_COMPONENT(fname "${listfiles}" NAME)
+    set (dest "${PROJECT_BINARY_DIR}/testfiles/vds/${fname}")
+    #message (STATUS " Copying ${listfiles} to ${dest}")
+    add_custom_command (
+        TARGET     h5ls
+        POST_BUILD
+        COMMAND    ${CMAKE_COMMAND}
+        ARGS       -E copy_if_different ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/${listfiles} ${dest}
+    )
+  endforeach (listfiles ${LIST_HDF5_TEST_FILES} ${LIST_OTHER_TEST_FILES})
+
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S  M A C R O S                               ###
+##############################################################################
+##############################################################################
+
+  MACRO (ADD_H5_VDS_TEST resultfile resultcode)
+    # If using memchecker add tests without using scripts
+    if (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (NAME H5LS-${resultfile} COMMAND $<TARGET_FILE:h5ls> ${ARGN})
+      set_tests_properties (H5LS-${resultfile} PROPERTIES WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles/vds")
+      if (${resultcode} STREQUAL "1")
+        set_tests_properties (H5LS-${resultfile} PROPERTIES WILL_FAIL "true")
+      endif (${resultcode} STREQUAL "1")
+      if (NOT "${last_test}" STREQUAL "")
+        set_tests_properties (H5LS-${resultfile} PROPERTIES DEPENDS ${last_test})
+      endif (NOT "${last_test}" STREQUAL "")
+    else (HDF5_ENABLE_USING_MEMCHECKER)
+      add_test (
+          NAME H5LS-${resultfile}-clear-objects
+          COMMAND    ${CMAKE_COMMAND}
+              -E remove ./testfiles/${resultfile}.out ./testfiles/vds/${resultfile}.out.err
+      )
+      add_test (
+          NAME H5LS-${resultfile}
+          COMMAND "${CMAKE_COMMAND}"
+              -D "TEST_PROGRAM=$<TARGET_FILE:h5ls>"
+              -D "TEST_ARGS=${ARGN}"
+              -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles/vds"
+              -D "TEST_OUTPUT=${resultfile}.out"
+              -D "TEST_EXPECT=${resultcode}"
+              -D "TEST_REFERENCE=${resultfile}.ls"
+              -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
+      )
+      set_tests_properties (H5LS-${resultfile} PROPERTIES DEPENDS "H5LS_VDS-${resultfile}-clear-objects")
+    endif (HDF5_ENABLE_USING_MEMCHECKER)
+  ENDMACRO (ADD_H5_VDS_TEST file)
+
+##############################################################################
+##############################################################################
+###           T H E   T E S T S                                            ###
+##############################################################################
+##############################################################################
+
+  if (HDF5_ENABLE_USING_MEMCHECKER)
+    # Remove any output file left over from previous test run
+    add_test (
+      NAME H5LS_VDS-clearall-objects
+      COMMAND    ${CMAKE_COMMAND}
+          -E remove
+          tvds-1.out
+          tvds-1.out.err
+          tvds-2.out
+          tvds-2.out.err
+          tvds-3_1.out
+          tvds-3_1.out.err
+          tvds-3_2.out
+          tvds-3_2.out.err
+          tvds-4.out
+          tvds-4.out.err
+          tvds-5.out
+          tvds-5.out.err
+          tvds_layout-1.out
+          tvds_layout-1.out.err
+          tvds_layout-2.out
+          tvds_layout-2.out.err
+          tvds_layout-3_1.out
+          tvds_layout-3_1.out.err
+          tvds_layout-3_2.out
+          tvds_layout-3_2.out.err
+          tvds_layout-4.out
+          tvds_layout-4.out.err
+          tvds_layout-5.out
+          tvds_layout-5.out.err
+    )
+    if (NOT "${last_test}" STREQUAL "")
+      set_tests_properties (H5LS_VDS-clearall-objects PROPERTIES DEPENDS ${last_test})
+    endif (NOT "${last_test}" STREQUAL "")
+    set (last_test "H5LS_VDS-clearall-objects")
+  endif (HDF5_ENABLE_USING_MEMCHECKER)
+
+  ADD_H5_VDS_TEST (tvds-1 0 -w80 -v -S 1_vds.h5)
+  ADD_H5_VDS_TEST (tvds-2 0 -w80 -v -S 2_vds.h5)
+  ADD_H5_VDS_TEST (tvds-3_1 0 -w80 -v -S 3_1_vds.h5)
+  ADD_H5_VDS_TEST (tvds-3_2 0 -w80 -v -S 3_2_vds.h5)
+  ADD_H5_VDS_TEST (tvds-4 0 -w80 -v -S 4_vds.h5)
+  ADD_H5_VDS_TEST (tvds-5 0 -w80 -v -S 5_vds.h5)
+
diff --git a/tools/h5ls/Makefile.am b/tools/h5ls/Makefile.am
index 408ce93..54a06f1 100644
--- a/tools/h5ls/Makefile.am
+++ b/tools/h5ls/Makefile.am
@@ -24,7 +24,7 @@ include $(top_srcdir)/config/commence.am
 AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/tools/lib
 
 # Test programs and scripts
-TEST_SCRIPT=testh5ls.sh
+TEST_SCRIPT=testh5ls.sh testh5lsvds.sh
 check_SCRIPTS=$(TEST_SCRIPT)
 SCRIPT_DEPEND=h5ls$(EXEEXT)
 
diff --git a/tools/h5ls/Makefile.in b/tools/h5ls/Makefile.in
index c77784e..f9fe56f 100644
--- a/tools/h5ls/Makefile.in
+++ b/tools/h5ls/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -32,7 +32,17 @@
 #
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -95,22 +105,22 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/testh5ls.sh.in $(top_srcdir)/bin/depcomp \
-	$(top_srcdir)/bin/test-driver
 bin_PROGRAMS = h5ls$(EXEEXT)
 TESTS = $(TEST_SCRIPT)
 subdir = tools/h5ls
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
-CONFIG_CLEAN_FILES = testh5ls.sh
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
+CONFIG_CLEAN_FILES = testh5ls.sh testh5lsvds.sh
 CONFIG_CLEAN_VPATH_FILES =
 am__installdirs = "$(DESTDIR)$(bindir)"
 PROGRAMS = $(bin_PROGRAMS)
@@ -137,7 +147,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -385,6 +395,10 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/testh5ls.sh.in \
+	$(srcdir)/testh5lsvds.sh.in $(top_srcdir)/bin/depcomp \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -404,7 +418,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -449,14 +462,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -466,13 +487,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -514,9 +534,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -656,7 +687,7 @@ TRACE = perl $(top_srcdir)/bin/trace
 CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2
 
 # Test programs and scripts
-TEST_SCRIPT = testh5ls.sh
+TEST_SCRIPT = testh5ls.sh testh5lsvds.sh
 check_SCRIPTS = $(TEST_SCRIPT)
 SCRIPT_DEPEND = h5ls$(EXEEXT)
 
@@ -701,7 +732,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/h5ls/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign tools/h5ls/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -710,7 +740,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -722,6 +752,8 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 $(am__aclocal_m4_deps):
 testh5ls.sh: $(top_builddir)/config.status $(srcdir)/testh5ls.sh.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+testh5lsvds.sh: $(top_builddir)/config.status $(srcdir)/testh5lsvds.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 install-binPROGRAMS: $(bin_PROGRAMS)
 	@$(NORMAL_INSTALL)
 	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
@@ -893,7 +925,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1167,6 +1199,8 @@ uninstall-am: uninstall-binPROGRAMS
 	mostlyclean-local pdf pdf-am ps ps-am recheck tags tags-am \
 	uninstall uninstall-am uninstall-binPROGRAMS
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/tools/h5ls/h5ls.c b/tools/h5ls/h5ls.c
index 708e9de..c962e80 100644
--- a/tools/h5ls/h5ls.c
+++ b/tools/h5ls/h5ls.c
@@ -70,6 +70,7 @@ static h5tool_format_t         ls_dataformat = {
         "{", /*cmpd_pre */
         "}", /*cmpd_suf */
         "", /*cmpd_end */
+        NULL, /* cmpd_listv */
 
         ",", /*vlen_sep */
         "(", /*vlen_pre */
@@ -387,7 +388,7 @@ print_obj_name(h5tools_str_t *buffer, const iter_t *iter, const char *oname,
  *-------------------------------------------------------------------------
  */
 static hbool_t
-print_native_type(h5tools_str_t *buffer, hid_t type, int H5_ATTR_UNUSED ind)
+print_native_type(h5tools_str_t *buffer, hid_t type, int ind)
 {
     if(!simple_output_g) {
         if (H5Tequal(type, H5T_NATIVE_SCHAR)==TRUE) {
@@ -509,7 +510,7 @@ print_native_type(h5tools_str_t *buffer, hid_t type, int H5_ATTR_UNUSED ind)
  *-------------------------------------------------------------------------
  */
 static hbool_t
-print_ieee_type(h5tools_str_t *buffer, hid_t type, int H5_ATTR_UNUSED ind)
+print_ieee_type(h5tools_str_t *buffer, hid_t type, int ind)
 {
     if (H5Tequal(type, H5T_IEEE_F32BE)==TRUE) {
         h5tools_str_append(buffer, "IEEE 32-bit big-endian float");
@@ -1759,7 +1760,6 @@ dataset_list2(hid_t dset, const char H5_ATTR_UNUSED *name)
     size_t      cd_nelmts;      /* filter client number of values */
     size_t      cd_num;         /* filter client data counter */
     char        f_name[256];    /* filter/file name */
-    char        dset_name[256];    /* filter/file name */
     char        s[64];          /* temporary string buffer */
     off_t       f_offset;       /* offset in external file */
     hsize_t     f_size;         /* bytes used in external file */
@@ -1847,7 +1847,39 @@ dataset_list2(hid_t dset, const char H5_ATTR_UNUSED *name)
                     h5tools_str_append(&buffer, "\n");
                 } /* end if */
                 break;
+
+            case H5D_VIRTUAL:
+                {
+                    char dset_name[256];        /* Dataset name */
+                    size_t vmaps;
+
+                    H5Pget_virtual_count(dcpl, &vmaps);
+
+                    if (vmaps) {
+                        size_t next;
+                        ssize_t ssize_out;
+
+                        h5tools_str_append(&buffer, "    %-10s {%ld} Source {\n", "Maps:", vmaps);
+                        for (next = 0; next < (unsigned) vmaps; next++) {
+                            ssize_out = H5Pget_virtual_filename(dcpl, next, NULL, 0);
+                            H5Pget_virtual_filename(dcpl, next, f_name, sizeof(f_name));
+                            ssize_out = H5Pget_virtual_dsetname(dcpl, next, NULL, 0);
+                            H5Pget_virtual_dsetname(dcpl, next, dset_name, sizeof(dset_name));
+                            h5tools_str_append(&buffer, "    %-10s        ", " ");
+                            print_string(&buffer, f_name, TRUE);
+                            h5tools_str_append(&buffer, "   ");
+                            print_string(&buffer, dset_name, TRUE);
+                            h5tools_str_append(&buffer, "\n");
+                        }
+                        h5tools_str_append(&buffer, "     %-10s}\n", " ");
+                    }
+                }
+                break;
+
+            case H5D_LAYOUT_ERROR:
+            case H5D_NLAYOUTS:
             default:
+                HDassert(0);
                 break;
         }
         /* Print total raw storage size */
@@ -2794,9 +2826,8 @@ main(int argc, const char *argv[])
             file = h5tools_fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT, preferred_driver, drivername, sizeof drivername);
 
             if(file >= 0) {
-                if(verbose_g) {
+                if(verbose_g)
                     PRINTSTREAM(rawoutstream, "Opened \"%s\" with %s driver.\n", fname, drivername);
-                }
                 break; /*success*/
             } /* end if */
 
diff --git a/tools/h5ls/testh5ls.sh.in b/tools/h5ls/testh5ls.sh.in
index bf40bfa..68b317c 100644
--- a/tools/h5ls/testh5ls.sh.in
+++ b/tools/h5ls/testh5ls.sh.in
@@ -88,6 +88,7 @@ $SRC_H5LS_TESTFILES/tsoftlinks.h5
 $SRC_H5LS_TESTFILES/tstr.h5
 $SRC_H5LS_TESTFILES/tudlink.h5
 $SRC_H5LS_TESTFILES/tvldtypes1.h5
+$SRC_H5LS_TESTFILES/tdset_idx.h5
 "
 
 LIST_OTHER_TEST_FILES="
@@ -147,6 +148,7 @@ $SRC_H5LS_TESTFILES/tudlink-1.ls
 $SRC_H5LS_TESTFILES/tvldtypes1.ls
 $SRC_H5LS_TESTFILES/tvldtypes2le.ls
 $SRC_H5LS_TESTFILES/tvldtypes2be.ls
+$SRC_H5LS_TESTFILES/tdset_idx.ls
 "
 
 
@@ -418,6 +420,9 @@ else
  TOOLTEST tdataregbe.ls 0 -v tdatareg.h5
 fi 
 
+# test for file with datasets that use Fixed Array chunk indices
+echo "***skip testing tdset_idx.h5"
+#TOOLTEST tdset_idx.ls 0 -w80 -d tdset_idx.h5
 # Clean up temporary files/directories
 CLEAN_TESTFILES_AND_TESTDIR
 
diff --git a/tools/h5ls/testh5lsvds.sh.in b/tools/h5ls/testh5lsvds.sh.in
new file mode 100644
index 0000000..d194992
--- /dev/null
+++ b/tools/h5ls/testh5lsvds.sh.in
@@ -0,0 +1,258 @@
+#! /bin/sh
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+#
+# Tests for the h5ls tool
+
+srcdir=@srcdir@
+
+TESTNAME=h5ls
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+H5LS=h5ls               # The tool name
+H5LS_BIN=`pwd`/$H5LS    # The path of the tool binary
+
+RM='rm -rf'
+CMP='cmp -s'
+DIFF='diff -c'
+CP='cp'
+NLINES=20          # Max. lines of output to display if test fails
+DIRNAME='dirname'
+LS='ls'
+AWK='awk'
+
+WORDS_BIGENDIAN="@WORDS_BIGENDIAN@"
+
+nerrors=0
+verbose=yes
+h5haveexitcode=yes      # default is yes
+
+# source dirs
+SRC_TOOLS="$srcdir/.."
+SRC_TOOLS_TESTFILES="$SRC_TOOLS/testfiles"
+
+# testfiles source dirs for tools
+SRC_H5LS_TESTFILES="$SRC_TOOLS_TESTFILES"
+SRC_H5DUMP_TESTFILES="$SRC_TOOLS_TESTFILES"
+SRC_H5DIFF_TESTFILES="$SRC_TOOLS/h5diff/testfiles"
+SRC_H5COPY_TESTFILES="$SRC_TOOLS/h5copy/testfiles"
+SRC_H5REPACK_TESTFILES="$SRC_TOOLS/h5repack/testfiles"
+SRC_H5JAM_TESTFILES="$SRC_TOOLS/h5jam/testfiles"
+SRC_H5STAT_TESTFILES="$SRC_TOOLS/h5stat/testfiles"
+SRC_H5IMPORT_TESTFILES="$SRC_TOOLS/h5import/testfiles"
+
+TEST_P_DIR=./testfiles
+TESTDIR=./testfiles/vds
+test -d $TEST_P_DIR || mkdir -p $TEST_P_DIR
+test -d $TESTDIR || mkdir $TESTDIR
+
+######################################################################
+# test files
+# --------------------------------------------------------------------
+# All the test files copy from source directory to test directory
+# NOTE: Keep this framework to add/remove test files.
+#       Any test files from other tools can be used in this framework.
+#       This list are also used for checking exist.
+#       Comment '#' without space can be used.
+# --------------------------------------------------------------------
+LIST_HDF5_TEST_FILES="
+$SRC_H5LS_TESTFILES/vds/1_a.h5
+$SRC_H5LS_TESTFILES/vds/1_b.h5
+$SRC_H5LS_TESTFILES/vds/1_c.h5
+$SRC_H5LS_TESTFILES/vds/1_d.h5
+$SRC_H5LS_TESTFILES/vds/1_e.h5
+$SRC_H5LS_TESTFILES/vds/1_f.h5
+$SRC_H5LS_TESTFILES/vds/1_vds.h5
+$SRC_H5LS_TESTFILES/vds/2_a.h5
+$SRC_H5LS_TESTFILES/vds/2_b.h5
+$SRC_H5LS_TESTFILES/vds/2_c.h5
+$SRC_H5LS_TESTFILES/vds/2_d.h5
+$SRC_H5LS_TESTFILES/vds/2_e.h5
+$SRC_H5LS_TESTFILES/vds/2_vds.h5
+$SRC_H5LS_TESTFILES/vds/3_1_vds.h5
+$SRC_H5LS_TESTFILES/vds/3_2_vds.h5
+$SRC_H5LS_TESTFILES/vds/4_0.h5
+$SRC_H5LS_TESTFILES/vds/4_1.h5
+$SRC_H5LS_TESTFILES/vds/4_2.h5
+$SRC_H5LS_TESTFILES/vds/4_vds.h5
+$SRC_H5LS_TESTFILES/vds/5_a.h5
+$SRC_H5LS_TESTFILES/vds/5_b.h5
+$SRC_H5LS_TESTFILES/vds/5_c.h5
+$SRC_H5LS_TESTFILES/vds/5_vds.h5
+"
+
+LIST_OTHER_TEST_FILES="
+$SRC_H5LS_TESTFILES/vds/tvds-1.ls
+$SRC_H5LS_TESTFILES/vds/tvds-2.ls
+$SRC_H5LS_TESTFILES/vds/tvds-3_1.ls
+$SRC_H5LS_TESTFILES/vds/tvds-3_2.ls
+$SRC_H5LS_TESTFILES/vds/tvds-4.ls
+$SRC_H5LS_TESTFILES/vds/tvds-5.ls
+"
+
+
+# RUNSERIAL is used. Check if it can return exit code from executalbe correctly.
+if [ -n "$RUNSERIAL_NOEXITCODE" ]; then
+    echo "***Warning*** Serial Exit Code is not passed back to shell corretly."
+    echo "***Warning*** Exit code checking is skipped."
+    h5haveexitcode=no
+fi
+
+#
+# copy test files and expected output files from source dirs to test dir
+#
+COPY_TESTFILES="$LIST_HDF5_TEST_FILES $LIST_OTHER_TEST_FILES"
+
+COPY_TESTFILES_TO_TESTDIR()
+{
+    # copy test files. Used -f to make sure get a new copy
+    for tstfile in $COPY_TESTFILES
+    do
+        # ignore '#' comment
+        echo $tstfile | tr -d ' ' | grep '^#' > /dev/null
+        RET=$?
+        if [ $RET -eq 1 ]; then
+            # skip cp if srcdir is same as destdir
+            # this occurs when build/test performed in source dir and
+            # make cp fail
+            SDIR=`$DIRNAME $tstfile`
+            INODE_SDIR=`$LS -i -d $SDIR | $AWK -F' ' '{print $1}'`
+            INODE_DDIR=`$LS -i -d $TESTDIR | $AWK -F' ' '{print $1}'`
+            if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then
+              $CP -f $tstfile $TESTDIR
+                if [ $? -ne 0 ]; then
+                    echo "Error: FAILED to copy $tstfile ."
+
+                    # Comment out this to CREATE expected file
+                    exit $EXIT_FAILURE
+                fi
+            fi
+        fi
+    done
+}
+
+CLEAN_TESTFILES_AND_TESTDIR()
+{
+    # skip rm if srcdir is same as destdir
+    # this occurs when build/test performed in source dir and
+    # make cp fail
+    SDIR=`$DIRNAME $tstfile`
+    INODE_SDIR=`$LS -i -d $SDIR | $AWK -F' ' '{print $1}'`
+    INODE_DDIR=`$LS -i -d $TESTDIR | $AWK -F' ' '{print $1}'`
+    if [ "$INODE_SDIR" != "$INODE_DDIR" ]; then
+        $RM $TESTDIR
+    fi
+}
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Testing".
+TESTING() {
+    SPACES="                                                               "
+    echo "Testing $* $SPACES" |cut -c1-70 |tr -d '\012'
+}
+
+# Source in the output filter function definitions.
+. $srcdir/../../bin/output_filter.sh
+
+# Run a test and print PASS or *FAIL*. For now, if h5ls can complete
+# with exit status 0, consider it pass. If a test fails then increment
+# the `nerrors' global variable and (if $verbose is set) display up to $NLINS
+# lines of the actual output from the tool test.  The actual output is not
+# removed if $HDF5_NOCLEANUP has a non-zero value.
+# Arguemnts:
+# $1 -- actual output filename to use
+# $2 and on -- argument for the h5ls tool
+TOOLTEST() {
+    expect="$TESTDIR/$1"
+    actual="$TESTDIR/`basename $1 .ls`.out"
+    actual_err="$TESTDIR/`basename $1 .ls`.err"
+    actual_sav=${actual}-sav
+    actual_err_sav=${actual_err}-sav
+    shift
+    retvalexpect=$1
+    shift
+
+    # Run test.
+    # Stderr is included in stdout so that the diff can detect
+    # any unexpected output from that stream too.
+    TESTING $H5LS $@
+    (
+  cd $TESTDIR
+        $RUNSERIAL $H5LS_BIN "$@"
+    ) >$actual 2>$actual_err
+
+    exitcode=$?
+    # save actual and actual_err in case they are needed later.
+    cp $actual $actual_sav
+    STDOUT_FILTER $actual
+    cp $actual_err $actual_err_sav
+    STDERR_FILTER $actual_err
+    cat $actual_err >> $actual
+    if [ $h5haveexitcode = 'yes' -a $exitcode -ne $retvalexpect ]; then
+  echo "*FAILED*"
+  nerrors="`expr $nerrors + 1`"
+  if [ yes = "$verbose" ]; then
+      echo "test returned with exit code $exitcode"
+      echo "test output: (up to $NLINES lines)"
+      head -$NLINES $actual
+      echo "***end of test output***"
+      echo ""
+  fi
+    elif [ ! -f $expect ]; then
+  # Create the expect file if it doesn't yet exist.
+        echo " CREATED"
+        cp $actual $expect
+    elif $CMP $expect $actual; then
+        echo " PASSED"
+    else
+        echo "*FAILED*"
+  echo "    Expected result differs from actual result"
+  nerrors="`expr $nerrors + 1`"
+  test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/    /'
+    fi
+
+    # Clean up output file
+    if test -z "$HDF5_NOCLEANUP"; then
+  rm -f $actual $actual_err $actual_sav $actual_err_sav
+    fi
+}
+
+##############################################################################
+##############################################################################
+###			  T H E   T E S T S                                ###
+##############################################################################
+##############################################################################
+# prepare for test
+COPY_TESTFILES_TO_TESTDIR
+
+####### test for dataset vds ######
+
+TOOLTEST tvds-1.ls 0 -w80 -v -S 1_vds.h5
+TOOLTEST tvds-2.ls 0 -w80 -v -S 2_vds.h5
+TOOLTEST tvds-3_1.ls 0 -w80 -v -S 3_1_vds.h5
+TOOLTEST tvds-3_2.ls 0 -w80 -v -S 3_2_vds.h5
+TOOLTEST tvds-4.ls 0 -w80 -v -S 4_vds.h5
+TOOLTEST tvds-5.ls 0 -w80 -v -S 5_vds.h5
+
+# Clean up temporary files/directories
+CLEAN_TESTFILES_AND_TESTDIR
+
+if test $nerrors -eq 0 ; then
+    echo "All $TESTNAME tests passed."
+    exit $EXIT_SUCCESS
+else
+    echo "$TESTNAME tests failed with $nerrors errors."
+    exit $EXIT_FAILURE
+fi
diff --git a/tools/h5repack/CMakeLists.txt b/tools/h5repack/CMakeLists.txt
index bfc1713..7631ae8 100644
--- a/tools/h5repack/CMakeLists.txt
+++ b/tools/h5repack/CMakeLists.txt
@@ -58,7 +58,9 @@ if (BUILD_TESTING)
   target_link_libraries (${HDF5_TOOL_PLUGIN_LIB_TARGET} ${HDF5_TEST_LIB_TARGET})
   H5_SET_LIB_OPTIONS (
       ${HDF5_TOOL_PLUGIN_LIB_TARGET} ${HDF5_TOOL_PLUGIN_LIB_NAME}
-      SHARED ${HDF5_PACKAGE_SOVERSION}
+      SHARED
+      HDF5_TOOL_PLUGIN_LIB_NAME_RELEASE
+      HDF5_TOOL_PLUGIN_LIB_NAME_DEBUG
   )
 
   # make plugins dir
@@ -70,13 +72,13 @@ if (BUILD_TESTING)
       TARGET     ${HDF5_TOOL_PLUGIN_LIB_TARGET}
       POST_BUILD
       COMMAND    ${CMAKE_COMMAND}
-      ARGS       -E copy_if_different
+      ARGS       -E copy_if_different 
           "$<TARGET_FILE:${HDF5_TOOL_PLUGIN_LIB_TARGET}>"
           "${CMAKE_BINARY_DIR}/plugins/$<TARGET_FILE_NAME:${HDF5_TOOL_PLUGIN_LIB_TARGET}>"
   )
 
   include (CMakeTests.cmake)
-
+  
 endif (BUILD_TESTING)
 
 ##############################################################################
diff --git a/tools/h5repack/CMakeTests.cmake b/tools/h5repack/CMakeTests.cmake
index dee97ed..8aee98f 100644
--- a/tools/h5repack/CMakeTests.cmake
+++ b/tools/h5repack/CMakeTests.cmake
@@ -14,14 +14,14 @@
         multi
         family
     )
-  
+
     if (DIRECT_VFD)
       set (VFD_LIST ${VFD_LIST} direct)
     endif (DIRECT_VFD)
 
     MACRO (ADD_VFD_TEST vfdname resultcode)
       add_test (
-        NAME H5REPACK-VFD-${vfdname}-h5repacktest 
+        NAME H5REPACK-VFD-${vfdname}-h5repacktest
         COMMAND "${CMAKE_COMMAND}"
             -D "TEST_PROGRAM=$<TARGET_FILE:h5repacktest>"
             -D "TEST_ARGS:STRING="
@@ -37,7 +37,7 @@
       set (last_test "H5REPACK-VFD-${vfdname}-h5repacktest")
     ENDMACRO (ADD_VFD_TEST)
   endif (HDF5_TEST_VFD)
-    
+
   # --------------------------------------------------------------------
   # Copy all the HDF5 files from the source directory into the test directory
   # --------------------------------------------------------------------
@@ -77,6 +77,30 @@
       ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00008.h5
       ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00009.h5
       ${HDF5_TOOLS_SRC_DIR}/testfiles/tfamily00010.h5
+      # tools/testfiles/vds
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/1_a.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/1_b.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/1_c.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/1_d.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/1_e.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/1_f.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/1_vds.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/2_a.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/2_b.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/2_c.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/2_d.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/2_e.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/2_vds.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/3_1_vds.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/3_2_vds.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/4_0.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/4_1.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/4_2.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/4_vds.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/5_a.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/5_b.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/5_c.h5
+      ${HDF5_TOOLS_SRC_DIR}/testfiles/vds/5_vds.h5
   )
 
   set (LIST_OTHER_TEST_FILES
@@ -143,14 +167,14 @@
   ENDMACRO (ADD_HELP_TEST)
 
   MACRO (ADD_H5_TEST_OLD testname testtype testfile)
-    if (${testtype} STREQUAL "SKIP")
+    if ("${testtype}" STREQUAL "SKIP")
       if (NOT HDF5_ENABLE_USING_MEMCHECKER)
         add_test (
             NAME H5REPACK_OLD-${testname}-SKIPPED
             COMMAND ${CMAKE_COMMAND} -E echo "SKIP ${ARGN} -i ${PROJECT_BINARY_DIR}/testfiles/${testfile} -o ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${testfile}"
         )
       endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-    else (${testtype} STREQUAL "SKIP")
+    else ("${testtype}" STREQUAL "SKIP")
       add_test (
           NAME H5REPACK_OLD-${testname}
           COMMAND $<TARGET_FILE:h5repack> ${ARGN} -i ${PROJECT_BINARY_DIR}/testfiles/${testfile} -o ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${testfile}
@@ -163,18 +187,18 @@
           COMMAND $<TARGET_FILE:h5diff> ${PROJECT_BINARY_DIR}/testfiles/${testfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${testfile}
       )
       set_tests_properties (H5REPACK_OLD-${testname}_DFF PROPERTIES DEPENDS H5REPACK_OLD-${testname})
-    endif (${testtype} STREQUAL "SKIP")
+    endif ("${testtype}" STREQUAL "SKIP")
   ENDMACRO (ADD_H5_TEST_OLD)
 
   MACRO (ADD_H5_TEST testname testtype testfile)
-    if (${testtype} STREQUAL "SKIP")
+    if ("${testtype}" STREQUAL "SKIP")
       if (NOT HDF5_ENABLE_USING_MEMCHECKER)
         add_test (
             NAME H5REPACK-${testname}-SKIPPED
             COMMAND ${CMAKE_COMMAND} -E echo "SKIP ${ARGN} ${PROJECT_BINARY_DIR}/testfiles/${testfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${testfile}"
         )
       endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-    else (${testtype} STREQUAL "SKIP")
+    else ("${testtype}" STREQUAL "SKIP")
       add_test (
           NAME H5REPACK-${testname}
           COMMAND $<TARGET_FILE:h5repack> ${ARGN} ${PROJECT_BINARY_DIR}/testfiles/${testfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${testfile}
@@ -187,18 +211,18 @@
           COMMAND $<TARGET_FILE:h5diff> ${PROJECT_BINARY_DIR}/testfiles/${testfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${testfile}
       )
       set_tests_properties (H5REPACK-${testname}_DFF PROPERTIES DEPENDS H5REPACK-${testname})
-    endif (${testtype} STREQUAL "SKIP")
+    endif ("${testtype}" STREQUAL "SKIP")
   ENDMACRO (ADD_H5_TEST)
 
   MACRO (ADD_H5_CMP_TEST testname testfilter testtype resultcode resultfile)
-    if (${testtype} STREQUAL "SKIP")
+    if ("${testtype}" STREQUAL "SKIP")
       if (NOT HDF5_ENABLE_USING_MEMCHECKER)
         add_test (
             NAME H5REPACK_CMP-${testname}-SKIPPED
             COMMAND ${CMAKE_COMMAND} -E echo "SKIP ${ARGN} ${PROJECT_BINARY_DIR}/testfiles/${resultfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${resultfile}"
         )
       endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-    else (${testtype} STREQUAL "SKIP")
+    else ("${testtype}" STREQUAL "SKIP")
       # If using memchecker add tests without using scripts
       if (HDF5_ENABLE_USING_MEMCHECKER)
         add_test (
@@ -221,18 +245,18 @@
       if (NOT "${last_test}" STREQUAL "")
         set_tests_properties (H5REPACK_CMP-${testname} PROPERTIES DEPENDS ${last_test})
       endif (NOT "${last_test}" STREQUAL "")
-    endif (${testtype} STREQUAL "SKIP")
+    endif ("${testtype}" STREQUAL "SKIP")
   ENDMACRO (ADD_H5_CMP_TEST)
 
   MACRO (ADD_H5_DMP_TEST testname testtype resultcode resultfile)
-    if (${testtype} STREQUAL "SKIP")
+    if ("${testtype}" STREQUAL "SKIP")
       if (NOT HDF5_ENABLE_USING_MEMCHECKER)
         add_test (
             NAME H5REPACK_DMP-${testname}-SKIPPED
             COMMAND ${CMAKE_COMMAND} -E echo "SKIP ${ARGN} ${PROJECT_BINARY_DIR}/testfiles/${resultfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${resultfile}"
         )
       endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-    else (${testtype} STREQUAL "SKIP")
+    else ("${testtype}" STREQUAL "SKIP")
       # If using memchecker add tests without using scripts
       add_test (
           NAME H5REPACK_DMP-${testname}
@@ -254,18 +278,18 @@
         )
         set_tests_properties (H5REPACK_DMP-h5dump-${testname} PROPERTIES DEPENDS "H5REPACK_DMP-${testname}")
       endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-    endif (${testtype} STREQUAL "SKIP")
+    endif ("${testtype}" STREQUAL "SKIP")
   ENDMACRO (ADD_H5_DMP_TEST)
 
   MACRO (ADD_H5_VERIFY_TEST testname testtype resultcode testfile testdset testfilter)
-    if (${testtype} STREQUAL "SKIP")
+    if ("${testtype}" STREQUAL "SKIP")
       if (NOT HDF5_ENABLE_USING_MEMCHECKER)
         add_test (
             NAME H5REPACK_VERIFY_LAYOUT-${testname}-SKIPPED
             COMMAND ${CMAKE_COMMAND} -E echo "SKIP -d ${testdset} -pH ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${resultfile}"
         )
       endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-    else (${testtype} STREQUAL "SKIP")
+    else ("${testtype}" STREQUAL "SKIP")
       if (NOT HDF5_ENABLE_USING_MEMCHECKER)
         add_test (
             NAME H5REPACK_VERIFY_LAYOUT-${testname}
@@ -279,7 +303,7 @@
             COMMAND $<TARGET_FILE:h5diff> ${PROJECT_BINARY_DIR}/testfiles/${testfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${testfile}
         )
         set_tests_properties (H5REPACK_VERIFY_LAYOUT-${testname}_DFF PROPERTIES DEPENDS H5REPACK_VERIFY_LAYOUT-${testname})
-        if (${resultcode} STREQUAL "0")
+        if ("${resultcode}" STREQUAL "0")
           add_test (
               NAME H5REPACK_VERIFY_LAYOUT-${testname}_DMP
               COMMAND "${CMAKE_COMMAND}"
@@ -293,16 +317,16 @@
                   -P "${HDF_RESOURCES_EXT_DIR}/grepTest.cmake"
           )
           set_tests_properties (H5REPACK_VERIFY_LAYOUT-${testname}_DMP PROPERTIES DEPENDS H5REPACK_VERIFY_LAYOUT-${testname}_DFF)
-        else (${resultcode} STREQUAL "0")
-          if (${testfilter} STREQUAL "CHUNKED")
+        else ("${resultcode}" STREQUAL "0")
+          if ("${testfilter}" STREQUAL "CHUNKED")
             set (nottestfilter "(CONTIGUOUS|COMPACT)")
-          endif (${testfilter} STREQUAL "CHUNKED")
-          if (${testfilter} STREQUAL "CONTIGUOUS")
+          endif ("${testfilter}" STREQUAL "CHUNKED")
+          if ("${testfilter}" STREQUAL "CONTIGUOUS")
             set (nottestfilter "(CHUNK|COMPACT)")
-          endif (${testfilter} STREQUAL "CONTIGUOUS")
-          if (${testfilter} STREQUAL "COMPACT")
+          endif ("${testfilter}" STREQUAL "CONTIGUOUS")
+          if ("${testfilter}" STREQUAL "COMPACT")
             set (nottestfilter "(CONTIGUOUS|CHUNK)")
-          endif (${testfilter} STREQUAL "COMPACT")
+          endif ("${testfilter}" STREQUAL "COMPACT")
           add_test (
               NAME H5REPACK_VERIFY_LAYOUT-${testname}_DMP
               COMMAND "${CMAKE_COMMAND}"
@@ -316,9 +340,9 @@
                   -P "${HDF_RESOURCES_EXT_DIR}/grepTest.cmake"
           )
           set_tests_properties (H5REPACK_VERIFY_LAYOUT-${testname}_DMP PROPERTIES DEPENDS H5REPACK_VERIFY_LAYOUT-${testname}_DFF)
-        endif (${resultcode} STREQUAL "0")
+        endif ("${resultcode}" STREQUAL "0")
       endif (NOT HDF5_ENABLE_USING_MEMCHECKER)
-    endif (${testtype} STREQUAL "SKIP")
+    endif ("${testtype}" STREQUAL "SKIP")
   ENDMACRO (ADD_H5_VERIFY_TEST)
 
   MACRO (ADD_H5_TEST_META testname testfile)
@@ -346,7 +370,7 @@
       add_test (
           NAME H5REPACK_UD-${testname}-clearall-objects
           COMMAND    ${CMAKE_COMMAND}
-              -E remove 
+              -E remove
               testfiles/out-${testname}.${resultfile}
               testfiles/${testname}.${resultfile}.out
               testfiles/${testname}.${resultfile}.out.err
@@ -392,7 +416,7 @@
 ##############################################################################
 
   # --------------------------------------------------------------------
-  # test file names 
+  # test file names
   # --------------------------------------------------------------------
   set (INFO_FILE testfiles/h5repack.info)
 
@@ -415,12 +439,18 @@
   set (FILE18 h5repack_layout2.h5)
   set (FILE_REF h5repack_refs.h5)
   set (FILE_ATTR_REF h5repack_attr_refs.h5)
-  
+  set (FILEV1 1_vds.h5)
+  set (FILEV2 2_vds.h5)
+  set (FILEV3_1 3_1_vds.h5)
+  set (FILEV3_2 3_2_vds.h5)
+  set (FILEV4 4_vds.h5)
+  set (FILEV5 5_vds.h5)
+
   # Remove any output file left over from previous test run
   add_test (
       NAME H5REPACK-clearall-objects
       COMMAND    ${CMAKE_COMMAND}
-          -E remove 
+          -E remove
          ./testfiles/h5dump-help.out
          ./testfiles/h5repack_filters.h5-gzip_verbose_filters.out
          ./testfiles/h5repack_filters.h5-gzip_verbose_filters.out.err
@@ -555,12 +585,41 @@
          ./testfiles/out-meta_short_N.meta_short.h5
          ./testfiles/out-meta_long_M.meta_long.h5
          ./testfiles/out-meta_long_N.meta_long.h5
-         # from the h5repacktst
+         ./testfiles/1_vds.h5-vds_dset_compa-v.out
+         ./testfiles/1_vds.h5-vds_dset_compa-v.out.err
+         ./testfiles/1_vds.h5-vds_dset_conti-v.out
+         ./testfiles/1_vds.h5-vds_dset_conti-v.out.err
+         ./testfiles/2_vds.h5-vds_null_compa-v.out
+         ./testfiles/2_vds.h5-vds_null_compa-v.out.err
+         ./testfiles/2_vds.h5-vds_null_conti-v.out
+         ./testfiles/2_vds.h5-vds_null_conti-v.out.err
+         ./testfiles/4_vds.h5-vds_compa-v.out
+         ./testfiles/4_vds.h5-vds_compa-v.out.err
+         ./testfiles/4_vds.h5-vds_compa_compa-v.out
+         ./testfiles/4_vds.h5-vds_compa_compa-v.out.err
+         ./testfiles/4_vds.h5-vds_compa_conti-v.out
+         ./testfiles/4_vds.h5-vds_compa_conti-v.out.err
+         ./testfiles/4_vds.h5-vds_conti-v.out
+         ./testfiles/4_vds.h5-vds_conti-v.out.err
+         ./testfiles/4_vds.h5-vds_conti_compa-v.out
+         ./testfiles/4_vds.h5-vds_conti_compa-v.out.err
+         ./testfiles/4_vds.h5-vds_conti_conti-v.out
+         ./testfiles/4_vds.h5-vds_conti_conti-v.out.err
+         ./testfiles/out-vds_compa.4_vds.h5
+         ./testfiles/out-vds_compa_compa.4_vds.h5
+         ./testfiles/out-vds_compa_conti.4_vds.h5
+         ./testfiles/out-vds_conti.4_vds.h5
+         ./testfiles/out-vds_conti_compa.4_vds.h5
+         ./testfiles/out-vds_conti_conti.4_vds.h5
+         ./testfiles/out-vds_dset_compa.1_vds.h5
+         ./testfiles/out-vds_dset_conti.1_vds.h5
+         ./testfiles/out-vds_null_compa.2_vds.h5
+         ./testfiles/out-vds_null_conti.2_vds.h5
          h5repack_attr.h5
          h5repack_attr_out.h5
          h5repack_attr_refs.h5
          h5repack_big.h5
-         h5repack_deflate.h5 
+         h5repack_deflate.h5
          h5repack_deflate_out.h5
          h5repack_early2.h5
          h5repack_early.h5
@@ -588,7 +647,7 @@
          h5repack_refs.h5
          h5repack_shuffle.h5
          h5repack_shuffle_out.h5
-         h5repack_soffset.h5 
+         h5repack_soffset.h5
          h5repack_soffset_out.h5
          h5repack_szip.h5
          h5repack_szip_out.h5
@@ -628,14 +687,14 @@
 # Each run generates "<file>.out.h5" and the tool h5diff is used to
 # compare the input and output files
 #
-# the tests are the same as the program h5repacktst, but run from the CLI 
+# the tests are the same as the program h5repacktst, but run from the CLI
 #
 
 # See which filters are usable (and skip tests for filters we
 # don't have).  Do this by searching H5pubconf.h to see which
 # filters are defined.
 
-# detect whether the encoder is present. 
+# detect whether the encoder is present.
   set (USE_FILTER_SZIP_ENCODER "no")
   if (HDF5_ENABLE_SZIP_ENCODING)
     set (USE_FILTER_SZIP_ENCODER ${testh5repack_detect_szip})
@@ -649,7 +708,7 @@
     set (USE_FILTER_SZIP "true")
   endif (H5_HAVE_FILTER_SZIP)
 
-# copy files (these files have no filters) 
+# copy files (these files have no filters)
   ADD_H5_TEST (fill "TEST" ${FILE0})
   ADD_H5_TEST (objs "TEST" ${FILE1})
   ADD_H5_TEST (attr "TEST" ${FILE2})
@@ -666,8 +725,8 @@
     set (TESTTYPE "SKIP")
   endif (NOT USE_FILTER_DEFLATE)
   ADD_H5_TEST (gzip_individual ${TESTTYPE} ${arg})
-  
-# gzip for all 
+
+# gzip for all
   set (arg ${FILE4} -f GZIP=1)
   set (TESTTYPE "TEST")
   if (NOT USE_FILTER_DEFLATE)
@@ -681,7 +740,7 @@
   if (NOT USE_FILTER_SZIP_ENCODER OR NOT USE_FILTER_SZIP)
     set (TESTTYPE "SKIP")
   endif (NOT USE_FILTER_SZIP_ENCODER OR NOT USE_FILTER_SZIP)
-  ADD_H5_TEST (szip_individual ${TESTTYPE} ${arg}) 
+  ADD_H5_TEST (szip_individual ${TESTTYPE} ${arg})
 
 # szip for all
   set (arg ${FILE4} -f SZIP=8,NN)
@@ -689,16 +748,16 @@
   if (NOT USE_FILTER_SZIP_ENCODER OR NOT USE_FILTER_SZIP)
     set (TESTTYPE "SKIP")
   endif (NOT USE_FILTER_SZIP_ENCODER OR NOT USE_FILTER_SZIP)
-  ADD_H5_TEST (szip_all ${TESTTYPE} ${arg}) 
+  ADD_H5_TEST (szip_all ${TESTTYPE} ${arg})
 
 # shuffle with individual object
   set (arg ${FILE4} -f dset2:SHUF  -l dset2:CHUNK=20x10)
-  ADD_H5_TEST (shuffle_individual "TEST" ${arg}) 
+  ADD_H5_TEST (shuffle_individual "TEST" ${arg})
 
 # shuffle for all
   set (arg ${FILE4} -f SHUF)
   ADD_H5_TEST (shuffle_all "TEST" ${arg})
-  
+
 # fletcher32  with individual object
   set (arg ${FILE4} -f dset2:FLET  -l dset2:CHUNK=20x10)
   ADD_H5_TEST (fletcher_individual "TEST" ${arg})
@@ -722,7 +781,7 @@
     set (TESTTYPE "SKIP")
   endif (NOT USE_FILTER_DEFLATE)
   ADD_H5_CMP_TEST (gzip_verbose_filters "O?...ing file[^\n]+\n" ${TESTTYPE} 0 ${arg})
-  
+
 ###########################################################
 # the following tests assume the input files have filters
 ###########################################################
@@ -734,7 +793,7 @@
     set (TESTTYPE "SKIP")
   endif (NOT USE_FILTER_SZIP_ENCODER OR NOT USE_FILTER_SZIP)
   ADD_H5_TEST (szip_copy ${TESTTYPE} ${arg})
-  
+
 # szip remove
   set (arg ${FILE7} --filter=dset_szip:NONE)
   set (TESTTYPE "TEST")
@@ -742,7 +801,7 @@
     set (TESTTYPE "SKIP")
   endif (NOT USE_FILTER_SZIP_ENCODER OR NOT USE_FILTER_SZIP)
   ADD_H5_TEST (szip_remove ${TESTTYPE} ${arg})
-  
+
 # deflate copy
   set (arg ${FILE8})
   set (TESTTYPE "TEST")
@@ -758,7 +817,7 @@
     set (TESTTYPE "SKIP")
   endif (NOT USE_FILTER_DEFLATE)
   ADD_H5_TEST (deflate_remove ${TESTTYPE} ${arg})
-    
+
 # shuffle copy
   set (arg ${FILE9})
   ADD_H5_TEST (shuffle_copy "TEST" ${arg})
@@ -813,14 +872,14 @@
   if (NOT USE_FILTER_SZIP_ENCODER OR NOT USE_FILTER_SZIP OR NOT USE_FILTER_DEFLATE)
     set (TESTTYPE "SKIP")
   endif (NOT USE_FILTER_SZIP_ENCODER OR NOT USE_FILTER_SZIP OR NOT USE_FILTER_DEFLATE)
-  ADD_H5_TEST (deflate_convert ${TESTTYPE} ${arg}) 
+  ADD_H5_TEST (deflate_convert ${TESTTYPE} ${arg})
 
   set (arg ${FILE7} -f dset_szip:GZIP=1)
   set (TESTTYPE "TEST")
   if (NOT USE_FILTER_SZIP OR NOT USE_FILTER_SZIP_ENCODER OR NOT USE_FILTER_DEFLATE)
     set (TESTTYPE "SKIP")
   endif (NOT USE_FILTER_SZIP OR NOT USE_FILTER_SZIP_ENCODER OR NOT USE_FILTER_DEFLATE)
-  ADD_H5_TEST (szip_convert ${TESTTYPE} ${arg}) 
+  ADD_H5_TEST (szip_convert ${TESTTYPE} ${arg})
 
 #limit
   set (arg ${FILE4} -f GZIP=1 -m 1024)
@@ -836,7 +895,7 @@
   if (NOT USE_FILTER_DEFLATE)
     set (TESTTYPE "SKIP")
   endif (NOT USE_FILTER_DEFLATE)
-  ADD_H5_TEST (deflate_file ${TESTTYPE} ${arg}) 
+  ADD_H5_TEST (deflate_file ${TESTTYPE} ${arg})
 
 #########################################################
 # layout options (these files have no filters)
@@ -865,18 +924,18 @@
   ADD_H5_VERIFY_TEST (contig_small_compa "TEST" 0 ${FILE18} contig_small COMPACT -l contig_small:COMPA)
   ADD_H5_VERIFY_TEST (contig_small_fixed_compa "TEST" 0 ${FILE18} chunked_small_fixed COMPACT -l chunked_small_fixed:COMPA)
 
-#--------------------------------------------------------------------------- 
-# Test file contains chunked datasets (need multiple dsets) with 
+#---------------------------------------------------------------------------
+# Test file contains chunked datasets (need multiple dsets) with
 # unlimited max dims.   (HDFFV-7933)
 # Use first dset to test.
 #---------------------------------------------------------------------------
 # chunk to chunk - specify chunk dim bigger than any current dim
   ADD_H5_VERIFY_TEST (chunk2chunk "TEST" 0 h5repack_layout3.h5 chunk_unlimit1 CHUNK -l chunk_unlimit1:CHUNK=100x300)
 
-# chunk to contiguous 
+# chunk to contiguous
   ADD_H5_VERIFY_TEST (chunk2conti "TEST" 0 h5repack_layout3.h5 chunk_unlimit1 CONTI -l chunk_unlimit1:CONTI)
 
-# chunk to compact - convert big dataset (should be > 64k) for this purpose, 
+# chunk to compact - convert big dataset (should be > 64k) for this purpose,
 # should remain as original layout (chunk)
   ADD_H5_VERIFY_TEST (chunk2compa "TEST" 0 h5repack_layout3.h5 chunk_unlimit1 CHUNK -l chunk_unlimit1:COMPA)
 
@@ -884,7 +943,7 @@
 # Test -f for some specific cases. Chunked dataset with unlimited max dims.
 # (HDFFV-8012)
 #--------------------------------------------------------------------------
-# - should not fail 
+# - should not fail
 # - should not change max dims from unlimit
 
 # chunk dim is bigger than dataset dim. ( dset size < 64k )
@@ -900,13 +959,13 @@
   ADD_H5_TEST (error4 "TEST" h5repack_layout3.h5 -f NONE)
 
 #--------------------------------------------------------------------------
-# Test base: Convert CHUNK to CONTI for a chunked dataset with small dataset 
+# Test base: Convert CHUNK to CONTI for a chunked dataset with small dataset
 # (dset size < 64K) and with unlimited max dims on a condition as follow.
 # (HDFFV-8214)
 #--------------------------------------------------------------------------
 # chunk dim is bigger than dataset dim. should succeed.
   ADD_H5_VERIFY_TEST (ckdim_biger "TEST" 0 h5repack_layout3.h5 chunk_unlimit2 CONTI -l chunk_unlimit2:CONTI)
-# chunk dim is smaller than dataset dim. should succeed.  
+# chunk dim is smaller than dataset dim. should succeed.
   ADD_H5_VERIFY_TEST (ckdim_smaller "TEST" 0 h5repack_layout3.h5 chunk_unlimit3 CONTI -l chunk_unlimit3:CONTI)
 
 
@@ -975,11 +1034,11 @@
   ADD_H5_TEST (bug1814 "TEST" ${FILE_REF})
 
 # test attribute with various references (bug1797 / HDFFV-5932)
-# the references in attribute of compund or vlen datatype 
+# the references in attribute of compund or vlen datatype
   ADD_H5_TEST (HDFFV-5932 "TEST" ${FILE_ATTR_REF})
 
-# Add test for memory leak in attirbute. This test is verified by CTEST.   
-# 1. leak from vlen string  
+# Add test for memory leak in attirbute. This test is verified by CTEST.
+# 1. leak from vlen string
 # 2. leak from compound type without reference member
 # (HDFFV-7840, )
 # Note: this test is experimental for sharing test file among tools
@@ -989,6 +1048,26 @@
   ADD_H5_TEST_META (meta_short h5repack_layout.h5 -M 8192)
   ADD_H5_TEST_META (meta_long h5repack_layout.h5 --metadata_block_size=8192)
 
+# VDS tests
+
+#########################################################
+# layout options
+#########################################################
+  ADD_H5_VERIFY_TEST (vds_dset_conti "TEST" 0 ${FILEV1} vds_dset CONTIGUOUS -l vds_dset:CONTI)
+  ADD_H5_VERIFY_TEST (vds_null_conti "TEST" 1 ${FILEV2} null CONTIGUOUS -l CONTI)
+  ADD_H5_VERIFY_TEST (vds_dset_compa "TEST" 0 ${FILEV1} vds_dset COMPACT -l vds_dset:COMPA)
+  ADD_H5_VERIFY_TEST (vds_null_compa "TEST" 1 ${FILEV2} null COMPACT -l COMPA)
+
+################################################################
+# layout conversions
+###############################################################
+  ADD_H5_VERIFY_TEST (vds_compa_conti "TEST" 0 ${FILEV4} vds_dset CONTIGUOUS -l vds_dset:CONTI)
+  ADD_H5_VERIFY_TEST (vds_compa_compa "TEST" 0 ${FILEV4} vds_dset COMPACT -l vds_dset:COMPA)
+  ADD_H5_VERIFY_TEST (vds_conti_compa "TEST" 0 ${FILEV4} vds_dset COMPACT -l vds_dset:COMPA)
+  ADD_H5_VERIFY_TEST (vds_conti_conti "TEST" 0 ${FILEV4} vds_dset CONTIGUOUS -l vds_dset:CONTI)
+  ADD_H5_VERIFY_TEST (vds_compa "TEST" 0 ${FILEV4} vds_dset COMPACT -l vds_dset:COMPA)
+  ADD_H5_VERIFY_TEST (vds_conti "TEST" 0 ${FILEV4} vds_dset CONTIGUOUS -l vds_dset:CONTI)
+
 ##############################################################################
 ###    P L U G I N  T E S T S
 ##############################################################################
diff --git a/tools/h5repack/Makefile.in b/tools/h5repack/Makefile.in
index 6d1bfd6..402acb7 100644
--- a/tools/h5repack/Makefile.in
+++ b/tools/h5repack/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -33,7 +33,17 @@
 
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -96,11 +106,6 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/h5repack.sh.in $(srcdir)/h5repack_plugin.sh.in \
-	$(top_srcdir)/bin/depcomp $(top_srcdir)/bin/test-driver
 noinst_PROGRAMS = testh5repack_detect_szip$(EXEEXT)
 @HAVE_SHARED_CONDITIONAL_TRUE@@USE_PLUGINS_CONDITIONAL_TRUE at am__append_1 = h5repack_plugin.sh
 check_PROGRAMS = $(am__EXEEXT_1)
@@ -109,11 +114,16 @@ TESTS = $(am__EXEEXT_1) $(TEST_SCRIPT)
 subdir = tools/h5repack
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES = h5repack.sh h5repack_plugin.sh
 CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
@@ -192,7 +202,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -417,6 +427,10 @@ am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
 TEST_LOGS = $(am__test_logs2:.sh.log=.log)
 SH_LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
 SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/h5repack.sh.in \
+	$(srcdir)/h5repack_plugin.sh.in $(top_srcdir)/bin/depcomp \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -436,7 +450,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -481,14 +494,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -498,13 +519,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -546,9 +566,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -750,7 +781,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/h5repack/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign tools/h5repack/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -759,7 +789,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -1018,7 +1048,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1309,6 +1339,8 @@ uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES
 	recheck tags tags-am uninstall uninstall-am \
 	uninstall-binPROGRAMS uninstall-libLTLIBRARIES
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/tools/h5repack/dynlib_rpk.c b/tools/h5repack/dynlib_rpk.c
index 1ccc33a..6e8a7b6 100644
--- a/tools/h5repack/dynlib_rpk.c
+++ b/tools/h5repack/dynlib_rpk.c
@@ -24,6 +24,18 @@
 
 #define H5Z_FILTER_DYNLIB1      257
 
+/* gcc attribute support from H5private.h */
+#ifdef __cplusplus
+#   define H5_ATTR_CONST        /*void*/
+#else /* __cplusplus */
+#if defined(H5_HAVE_ATTRIBUTE) && !defined(__SUNPRO_C)
+#   define H5_ATTR_CONST        __attribute__((const))
+#else
+#   define H5_ATTR_CONST        /*void*/
+#endif
+#endif /* __cplusplus */
+
+
 static size_t H5Z_filter_dynlib1(unsigned int flags, size_t cd_nelmts,
                 const unsigned int *cd_values, size_t nbytes, size_t *buf_size, void **buf);
 
@@ -38,8 +50,8 @@ const H5Z_class2_t H5Z_DYNLIB1[1] = {{
     (H5Z_func_t)H5Z_filter_dynlib1,    /* The actual filter function	*/
 }};
 
-H5PL_type_t   H5PLget_plugin_type(void) {return H5PL_TYPE_FILTER;}
-const void    *H5PLget_plugin_info(void) {return H5Z_DYNLIB1;}
+H5_ATTR_CONST H5PL_type_t H5PLget_plugin_type(void) {return H5PL_TYPE_FILTER;}
+H5_ATTR_CONST const void *H5PLget_plugin_info(void) {return H5Z_DYNLIB1;}
 
 /*-------------------------------------------------------------------------
  * Function:	H5Z_filter_dynlib1
diff --git a/tools/h5repack/h5repack.c b/tools/h5repack/h5repack.c
index a195f6c..286d7f0 100644
--- a/tools/h5repack/h5repack.c
+++ b/tools/h5repack/h5repack.c
@@ -77,13 +77,14 @@ int h5repack(const char* infile, const char* outfile, pack_opt_t *options) {
  *
  *-------------------------------------------------------------------------
  */
-
-int h5repack_init(pack_opt_t *options, int verbose) {
+int h5repack_init(pack_opt_t *options, int verbose, hbool_t latest,
+		H5F_file_space_type_t strategy, hsize_t threshold) {
 	int k, n;
 
 	HDmemset(options, 0, sizeof(pack_opt_t));
 	options->min_comp = 0;
 	options->verbose = verbose;
+    	options->latest = latest;
 	options->layout_g = H5D_LAYOUT_ERROR;
 
 	for (n = 0; n < H5_REPACK_MAX_NFILTERS; n++) {
@@ -93,6 +94,9 @@ int h5repack_init(pack_opt_t *options, int verbose) {
 			options->filter_g[n].cd_values[k] = 0;
 	}
 
+	options->fs_strategy = strategy;
+	options->fs_threshold = threshold;
+
 	return (options_table_init(&(options->op_tbl)));
 }
 
@@ -333,7 +337,7 @@ done:
  */
 int named_datatype_free(named_dt_t **named_dt_head_p, int ignore_err) {
 	named_dt_t *dt = *named_dt_head_p;
-	hid_t ret_value = -1;
+	int ret_value = -1;
 
 	while (dt) {
 		/* Pop the datatype off the stack and free it */
diff --git a/tools/h5repack/h5repack.h b/tools/h5repack/h5repack.h
index 250121e..329be1f 100644
--- a/tools/h5repack/h5repack.h
+++ b/tools/h5repack/h5repack.h
@@ -105,7 +105,7 @@ typedef struct {
  int             verbose;     /*verbose mode */
  hsize_t         min_comp;    /*minimum size to compress, in bytes */
  int             use_native;  /*use a native type in write */
- int             latest;      /*pack file with the latest file format */
+ hbool_t         latest;      /*pack file with the latest file format */
  int             grp_compact; /* Set the maximum number of links to store as header messages in the group */
  int             grp_indexed; /* Set the minimum number of links to store in the indexed format */
  int             msg_size[8]; /* Minimum size of shared messages: dataspace,
@@ -115,6 +115,8 @@ typedef struct {
  hsize_t         meta_block_size;  /* metadata aggregation block size (for H5Pset_meta_block_size) */
  hsize_t         threshold;        /* alignment threshold for H5Pset_alignment */
  hsize_t         alignment ;       /* alignment for H5Pset_alignment */
+ H5F_file_space_type_t fs_strategy;     /* File space handling strategy */
+ hsize_t         fs_threshold;      	/* Free space section threshold */
 } pack_opt_t;
 
 
@@ -136,9 +138,10 @@ extern "C" {
 int h5repack(const char* infile, const char* outfile, pack_opt_t *options);
 int h5repack_addfilter(const char* str, pack_opt_t *options);
 int h5repack_addlayout(const char* str, pack_opt_t *options);
-int h5repack_init(pack_opt_t *options, int verbose);
+int h5repack_init(pack_opt_t *options, int verbose, hbool_t latest,
+    H5F_file_space_type_t strategy, hsize_t threshold);
 int h5repack_end(pack_opt_t *options);
-int h5repack_verify(const char *out_fname, pack_opt_t *options);
+int h5repack_verify(const char *in_fname, const char *out_fname, pack_opt_t *options);
 int h5repack_cmp_pl(const char *fname1, const char *fname2);
 
 /* Note: The below copy_named_datatype(), named_datatype_free(), copy_attr() 
diff --git a/tools/h5repack/h5repack.sh.in b/tools/h5repack/h5repack.sh.in
index 4a32491..24298d0 100644
--- a/tools/h5repack/h5repack.sh.in
+++ b/tools/h5repack/h5repack.sh.in
@@ -18,7 +18,7 @@
 # Modification:
 #  Pedro Vicente Nunes, 11/15/2006
 #  Added $FILEN variables for file names
-#   
+#
 
 srcdir=@srcdir@
 
@@ -32,7 +32,7 @@ EXIT_FAILURE=1
 H5REPACK=h5repack               # The tool name
 H5REPACK_BIN=`pwd`/$H5REPACK    # The path of the tool binary
 
-H5DIFF=../h5diff/h5diff         # The h5diff tool name 
+H5DIFF=../h5diff/h5diff         # The h5diff tool name
 H5DIFF_BIN=`pwd`/$H5DIFF        # The path of the h5diff tool binary
 
 H5DUMP=../h5dump/h5dump         # The h5dump tool name
@@ -45,8 +45,8 @@ DIRNAME='dirname'
 LS='ls'
 AWK='awk'
 
-H5DETECTSZIP=testh5repack_detect_szip              
-H5DETECTSZIP_BIN=`pwd`/$H5DETECTSZIP    
+H5DETECTSZIP=testh5repack_detect_szip
+H5DETECTSZIP_BIN=`pwd`/$H5DETECTSZIP
 
 
 nerrors=0
@@ -113,6 +113,29 @@ $SRC_TOOLS_TESTFILES/tfamily00007.h5
 $SRC_TOOLS_TESTFILES/tfamily00008.h5
 $SRC_TOOLS_TESTFILES/tfamily00009.h5
 $SRC_TOOLS_TESTFILES/tfamily00010.h5
+$SRC_TOOLS_TESTFILES/vds/1_a.h5
+$SRC_TOOLS_TESTFILES/vds/1_b.h5
+$SRC_TOOLS_TESTFILES/vds/1_c.h5
+$SRC_TOOLS_TESTFILES/vds/1_d.h5
+$SRC_TOOLS_TESTFILES/vds/1_e.h5
+$SRC_TOOLS_TESTFILES/vds/1_f.h5
+$SRC_TOOLS_TESTFILES/vds/1_vds.h5
+$SRC_TOOLS_TESTFILES/vds/2_a.h5
+$SRC_TOOLS_TESTFILES/vds/2_b.h5
+$SRC_TOOLS_TESTFILES/vds/2_c.h5
+$SRC_TOOLS_TESTFILES/vds/2_d.h5
+$SRC_TOOLS_TESTFILES/vds/2_e.h5
+$SRC_TOOLS_TESTFILES/vds/2_vds.h5
+$SRC_TOOLS_TESTFILES/vds/3_1_vds.h5
+$SRC_TOOLS_TESTFILES/vds/3_2_vds.h5
+$SRC_TOOLS_TESTFILES/vds/4_0.h5
+$SRC_TOOLS_TESTFILES/vds/4_1.h5
+$SRC_TOOLS_TESTFILES/vds/4_2.h5
+$SRC_TOOLS_TESTFILES/vds/4_vds.h5
+$SRC_TOOLS_TESTFILES/vds/5_a.h5
+$SRC_TOOLS_TESTFILES/vds/5_b.h5
+$SRC_TOOLS_TESTFILES/vds/5_c.h5
+$SRC_TOOLS_TESTFILES/vds/5_vds.h5
 "
 
 LIST_OTHER_TEST_FILES="
@@ -151,7 +174,7 @@ COPY_TESTFILES_TO_TESTDIR()
     	        $CP -f $tstfile $TESTDIR
                 if [ $? -ne 0 ]; then
                     echo "Error: FAILED to copy $tstfile ."
-                
+
                     # Comment out this to CREATE expected file
                     exit $EXIT_FAILURE
                 fi
@@ -203,12 +226,12 @@ SKIP() {
 
 # Call the h5diff tool
 #
-DIFFTEST() 
+DIFFTEST()
 {
     VERIFY h5diff output $@
     (
         cd $TESTDIR
-        $RUNSERIAL $H5DIFF_BIN -q  "$@" 
+        $RUNSERIAL $H5DIFF_BIN -q  "$@"
     )
     RET=$?
     if [ $RET != 0 ] ; then
@@ -217,7 +240,7 @@ DIFFTEST()
     else
          echo " PASSED"
     fi
-        
+
 }
 
 # Call h5repack
@@ -225,7 +248,7 @@ DIFFTEST()
 
 
 # call TOOLTEST_MAIN and delete $output file
-TOOLTEST() 
+TOOLTEST()
 {
     echo $@
     infile=$2
@@ -251,7 +274,7 @@ TOOLTEST()
 }
 
 #------------------------------------------
-# Verifying layouts of a dataset 
+# Verifying layouts of a dataset
 VERIFY_LAYOUT_DSET()
 {
     layoutfile=layout-$1.$2
@@ -263,9 +286,9 @@ VERIFY_LAYOUT_DSET()
     shift
     shift
     shift
-   
+
     TESTING  $H5REPACK $@
-    ( 
+    (
         cd $TESTDIR
         $RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
     )
@@ -277,7 +300,7 @@ VERIFY_LAYOUT_DSET()
         echo " PASSED"
         DIFFTEST $infile $outfile
     fi
-    
+
     #---------------------------------
     # check the layout from a dataset
     VERIFY  "a dataset layout"
@@ -309,9 +332,9 @@ VERIFY_LAYOUT_ALL()
     shift
     shift
     shift
-    
+
     TESTING  $H5REPACK $@
-    ( 
+    (
         cd $TESTDIR
         $RUNSERIAL $H5REPACK_BIN "$@" $infile $outfile
     )
@@ -323,8 +346,8 @@ VERIFY_LAYOUT_ALL()
         echo " PASSED"
         DIFFTEST $infile $outfile
     fi
-    
-    
+
+
     #---------------------------------
     # check the layout from a dataset
     # check if the other layouts still exsit
@@ -351,7 +374,7 @@ VERIFY_LAYOUT_ALL()
                     echo " PASSED"
                 fi
             fi
-        else    
+        else
             # if COMPACT
             if [ $expectlayout = "COMPACT" ]; then
                 TESTING $H5DUMP_BIN -pH $outfile
@@ -403,7 +426,7 @@ VERIFY_LAYOUT_ALL()
 
 # same as TOOLTEST, but it uses the old syntax -i input_file -o output_file
 #
-TOOLTEST0() 
+TOOLTEST0()
 {
     infile=$2
     outfile=out-$1.$2
@@ -431,7 +454,7 @@ TOOLTEST0()
 # same as TOOLTEST, but it uses without -i -o options
 # used to test the family driver, where these files reside
 #
-TOOLTEST1() 
+TOOLTEST1()
 {
     infile=$2
     outfile=out-$1.$2
@@ -454,11 +477,11 @@ TOOLTEST1()
     fi
     rm -f $outfile
 }
-          
+
 # This is same as TOOLTEST() with comparing display output
 # from -v option
 #
-TOOLTESTV() 
+TOOLTESTV()
 {
     expect="$TESTDIR/$2.tst"
     actual="$TESTDIR/`basename $2 .ddl`.out"
@@ -468,7 +491,7 @@ TOOLTESTV()
     outfile=out-$1.$2
     shift
     shift
-    
+
     # Run test.
     TESTING $H5REPACK $@
     (
@@ -497,15 +520,15 @@ TOOLTESTV()
      nerrors="`expr $nerrors + 1`"
      test yes = "$verbose" && diff -c $expect $actual |sed 's/^/    /'
     fi
-    
+
    rm -f $actual $actual_err
    rm -f $outfile
 }
-          
+
 # This is same as TOOLTESTV() with comparing h5dump output
 # from -pH option
 #
-TOOLTEST_DUMP() 
+TOOLTEST_DUMP()
 {
     infile=$2
     outfile=out-$1.$2
@@ -515,7 +538,7 @@ TOOLTEST_DUMP()
 
     shift
     shift
-    
+
     # Run test.
     TESTING $H5REPACK $@
     (
@@ -531,12 +554,12 @@ TOOLTEST_DUMP()
      VERIFY h5dump output $@
      (
         cd $TESTDIR
-        $RUNSERIAL $H5DUMP_BIN -pH $outfile 
+        $RUNSERIAL $H5DUMP_BIN -pH $outfile
      ) >$actual 2>$actual_err
      cat $actual_err >> $actual
 
      RET=$?
-          
+
     fi
 
     if cmp -s $expect $actual; then
@@ -547,7 +570,7 @@ TOOLTEST_DUMP()
      nerrors="`expr $nerrors + 1`"
      test yes = "$verbose" && diff -c $expect $actual |sed 's/^/    /'
     fi
-    
+
    rm -f $actual $actual_err
    rm -f $outfile
 }
@@ -618,7 +641,7 @@ TOOLTEST_META()
 	echo "*FAILED*"
         nerrors="`expr $nerrors + 1`"
     fi
-    
+
     rm -f $outfile
 }
 # ADD_HELP_TEST
@@ -648,7 +671,7 @@ TOOLTEST_HELP() {
       echo "    Expected output (*.txt) differs from actual output (*.out)"
       nerrors="`expr $nerrors + 1`"
     fi
-    
+
     # Clean up output file
     if test -z "$HDF5_NOCLEANUP"; then
      rm -f $actual $actual_err
@@ -674,28 +697,28 @@ STDOUT_FILTER() {
 # Each run generates "<file>.out.h5" and the tool h5diff is used to
 # compare the input and output files
 #
-# the tests are the same as the program h5repacktst, but run from the CLI 
+# the tests are the same as the program h5repacktst, but run from the CLI
 #
 
 # See which filters are usable (and skip tests for filters we
 # don't have).  Do this by searching H5pubconf.h to see which
 # filters are defined.
 
-# detect whether the encoder is present. 
+# detect whether the encoder is present.
 USE_FILTER_SZIP_ENCODER="no";
 if test $USE_FILTER_SZIP = "yes"; then
 USE_FILTER_SZIP_ENCODER=`$RUNSERIAL $H5DETECTSZIP_BIN`
 fi
 
 ##############################################################################
-###			  T H E   T E S T S                               
+###			  T H E   T E S T S
 ##############################################################################
 # prepare for test
 COPY_TESTFILES_TO_TESTDIR
 
 TOOLTEST_HELP h5repack-help.txt -h
 
-# copy files (these files have no filters) 
+# copy files (these files have no filters)
 TOOLTEST fill h5repack_fill.h5
 TOOLTEST objs h5repack_objs.h5
 TOOLTEST attr h5repack_attr.h5
@@ -719,8 +742,8 @@ if test  $USE_FILTER_DEFLATE != "yes" ; then
 else
  TOOLTEST gzip_individual $arg
 fi
-  
-# gzip for all 
+
+# gzip for all
 arg="h5repack_layout.h5 -f GZIP=1"
 if test  $USE_FILTER_DEFLATE != "yes" ; then
  SKIP $arg
@@ -733,7 +756,7 @@ arg="h5repack_layout.h5 -f dset2:SZIP=8,EC  -l dset2:CHUNK=20x10"
 if test $USE_FILTER_SZIP_ENCODER != "yes" -o $USE_FILTER_SZIP != "yes" ; then
  SKIP $arg
 else
- TOOLTEST szip_individual $arg 
+ TOOLTEST szip_individual $arg
 fi
 
 # szip for all
@@ -741,18 +764,18 @@ arg="h5repack_layout.h5 -f SZIP=8,NN"
 if test $USE_FILTER_SZIP_ENCODER != "yes" -o $USE_FILTER_SZIP != "yes" ; then
  SKIP $arg
 else
- TOOLTEST szip_all $arg 
+ TOOLTEST szip_all $arg
 fi
 
 # shuffle with individual object
 arg="h5repack_layout.h5 -f dset2:SHUF  -l dset2:CHUNK=20x10"
-TOOLTEST shuffle_individual $arg 
-  
+TOOLTEST shuffle_individual $arg
+
 
 # shuffle for all
 arg="h5repack_layout.h5 -f SHUF"
 TOOLTEST shuffle_all $arg
-  
+
 # fletcher32  with individual object
 arg="h5repack_layout.h5 -f dset2:FLET  -l dset2:CHUNK=20x10"
 TOOLTEST fletcher_individual $arg
@@ -777,7 +800,7 @@ else
  # compare output
  TOOLTESTV gzip_verbose_filters $arg
 fi
-  
+
 ###########################################################
 # the following tests assume the input files have filters
 ###########################################################
@@ -789,7 +812,7 @@ if test $USE_FILTER_SZIP_ENCODER != "yes" -o $USE_FILTER_SZIP != "yes" ; then
 else
  TOOLTEST szip_copy $arg
 fi
-  
+
 # szip remove
 arg="h5repack_szip.h5 --filter=dset_szip:NONE"
 if test $USE_FILTER_SZIP_ENCODER != "yes" -o $USE_FILTER_SZIP != "yes" ; then
@@ -797,7 +820,7 @@ if test $USE_FILTER_SZIP_ENCODER != "yes" -o $USE_FILTER_SZIP != "yes" ; then
 else
  TOOLTEST szip_remove $arg
 fi
-  
+
 # deflate copy
 arg="h5repack_deflate.h5"
 if test $USE_FILTER_DEFLATE != "yes" ; then
@@ -813,7 +836,7 @@ if test $USE_FILTER_DEFLATE != "yes" ; then
 else
  TOOLTEST deflate_remove $arg
 fi
-    
+
 # shuffle copy
 arg="h5repack_shuffle.h5"
 TOOLTEST shuffle_copy $arg
@@ -868,14 +891,14 @@ arg="h5repack_deflate.h5 -f dset_deflate:SZIP=8,NN"
 if test $USE_FILTER_SZIP_ENCODER != "yes" -o $USE_FILTER_SZIP != "yes" -o $USE_FILTER_DEFLATE != "yes" ; then
  SKIP $arg
 else
- TOOLTEST deflate_convert $arg 
+ TOOLTEST deflate_convert $arg
 fi
 
 arg="h5repack_szip.h5 -f dset_szip:GZIP=1"
 if test $USE_FILTER_SZIP != "yes" -o $USE_FILTER_SZIP_ENCODER != "yes"  -o $USE_FILTER_DEFLATE != "yes" ; then
  SKIP $arg
 else
- TOOLTEST szip_convert $arg 
+ TOOLTEST szip_convert $arg
 fi
 
 
@@ -890,9 +913,9 @@ fi
 #file
 arg="h5repack_layout.h5 -e h5repack.info"
 if test $USE_FILTER_DEFLATE != "yes" ; then
- SKIP $arg 
+ SKIP $arg
 else
- TOOLTEST deflate_file $arg 
+ TOOLTEST deflate_file $arg
 fi
 
 #########################################################
@@ -937,18 +960,18 @@ VERIFY_LAYOUT_DSET contig_small_compa h5repack_layout2.h5 contig_small COMPACT -
 
 VERIFY_LAYOUT_DSET contig_small_fixed_compa h5repack_layout2.h5 chunked_small_fixed COMPACT -l chunked_small_fixed:COMPA
 
-#--------------------------------------------------------------------------- 
-# Test file contains chunked datasets (need multiple dsets) with 
+#---------------------------------------------------------------------------
+# Test file contains chunked datasets (need multiple dsets) with
 # unlimited max dims.   (HDFFV-7933)
 # Use first dset to test.
 #---------------------------------------------------------------------------
 # chunk to chunk - specify chunk dim bigger than any current dim
 VERIFY_LAYOUT_DSET chunk2chunk h5repack_layout3.h5 chunk_unlimit1 CHUNK -l chunk_unlimit1:CHUNK=100x300
 
-# chunk to contiguous 
+# chunk to contiguous
 VERIFY_LAYOUT_DSET chunk2conti h5repack_layout3.h5 chunk_unlimit1 CONTI -l chunk_unlimit1:CONTI
 
-# chunk to compact - convert big dataset (should be > 64k) for this purpose, 
+# chunk to compact - convert big dataset (should be > 64k) for this purpose,
 # should remain as original layout (chunk)
 VERIFY_LAYOUT_DSET chunk2compa h5repack_layout3.h5 chunk_unlimit1 CHUNK -l chunk_unlimit1:COMPA
 
@@ -956,7 +979,7 @@ VERIFY_LAYOUT_DSET chunk2compa h5repack_layout3.h5 chunk_unlimit1 CHUNK -l chunk
 # Test -f for some specific cases. Chunked dataset with unlimited max dims.
 # (HDFFV-8012)
 #--------------------------------------------------------------------------
-# - should not fail 
+# - should not fail
 # - should not change max dims from unlimit
 
 # chunk dim is bigger than dataset dim. ( dset size < 64k )
@@ -972,14 +995,14 @@ VERIFY_LAYOUT_DSET error3 h5repack_layout3.h5 chunk_unlimit3 H5S_UNLIMITED -f ch
 TOOLTEST error4 h5repack_layout3.h5 -f NONE
 
 #--------------------------------------------------------------------------
-# Test base: Convert CHUNK to CONTI for a chunked dataset with small dataset 
+# Test base: Convert CHUNK to CONTI for a chunked dataset with small dataset
 # (dset size < 64K) and with unlimited max dims on a condition as follow.
 # (HDFFV-8214)
 #--------------------------------------------------------------------------
 
 # chunk dim is bigger than dataset dim. should succeed.
 VERIFY_LAYOUT_DSET ckdim_biger h5repack_layout3.h5 chunk_unlimit2 CONTI -l chunk_unlimit2:CONTI
-# chunk dim is smaller than dataset dim. should succeed.  
+# chunk dim is smaller than dataset dim. should succeed.
 VERIFY_LAYOUT_DSET ckdim_smaller h5repack_layout3.h5 chunk_unlimit3 CONTI -l chunk_unlimit3:CONTI
 
 
@@ -1022,7 +1045,7 @@ if test $USE_FILTER_DEFLATE != "yes" ; then
  SKIP $arg
 else
  TOOLTEST0 old_style_layout_short_switches $arg
-fi 
+fi
 
 # add a userblock to file
 arg="h5repack_objs.h5 -u ublock.bin -b 2048"
@@ -1049,20 +1072,40 @@ TOOLTEST1 family tfamily%05d.h5
 TOOLTEST bug1814 h5repack_refs.h5
 
 # test attribute with various references (bug1797 / HDFFV-5932)
-# the references in attribute of compund or vlen datatype 
-TOOLTEST HDFFV-5932 h5repack_attr_refs.h5 
+# the references in attribute of compund or vlen datatype
+TOOLTEST HDFFV-5932 h5repack_attr_refs.h5
 
-# Add test for memory leak in attirbute. This test is verified by CTEST.   
-# 1. leak from vlen string  
+# Add test for memory leak in attirbute. This test is verified by CTEST.
+# 1. leak from vlen string
 # 2. leak from compound type without reference member
 # (HDFFV-7840, )
 # Note: this test is experimental for sharing test file among tools
 TOOLTEST HDFFV-7840 h5diff_attr1.h5
 
-# tests for metadata block size option 
+# tests for metadata block size option
 TOOLTEST_META meta_short h5repack_layout.h5 -M 8192
 TOOLTEST_META meta_long h5repack_layout.h5 --metadata_block_size=8192
 
+# VDS tests
+
+#########################################################
+# layout options
+#########################################################
+VERIFY_LAYOUT_DSET vds_dset_conti 1_vds.h5 vds_dset CONTIGUOUS -l vds_dset:CONTI
+VERIFY_LAYOUT_ALL vds_null_conti 2_vds.h5 CONTIGUOUS -l CONTI
+VERIFY_LAYOUT_DSET vds_dset_compa 1_vds.h5 vds_dset COMPACT -l vds_dset:COMPA
+VERIFY_LAYOUT_ALL vds_null_compa 2_vds.h5 COMPACT -l COMPA
+
+################################################################
+# layout conversions
+###############################################################
+VERIFY_LAYOUT_DSET vds_compa_conti 4_vds.h5 vds_dset CONTIGUOUS -l vds_dset:CONTI
+VERIFY_LAYOUT_DSET vds_compa_compa 4_vds.h5 vds_dset COMPACT -l vds_dset:COMPA
+VERIFY_LAYOUT_DSET vds_conti_compa 4_vds.h5 vds_dset COMPACT -l vds_dset:COMPA
+VERIFY_LAYOUT_DSET vds_conti_conti 4_vds.h5 vds_dset CONTIGUOUS -l vds_dset:CONTI
+VERIFY_LAYOUT_DSET vds_compa 4_vds.h5 vds_dset COMPACT -l vds_dset:COMPA
+VERIFY_LAYOUT_DSET vds_conti 4_vds.h5 vds_dset CONTIGUOUS -l vds_dset:CONTI
+
 # Clean up temporary files/directories
 CLEAN_TESTFILES_AND_TESTDIR
 
diff --git a/tools/h5repack/h5repack_copy.c b/tools/h5repack/h5repack_copy.c
index 1963750..1171ab8 100644
--- a/tools/h5repack/h5repack_copy.c
+++ b/tools/h5repack/h5repack_copy.c
@@ -68,7 +68,7 @@ static herr_t walk_error_callback(unsigned n, const H5E_error2_t *err_desc, void
 /* get the major number from the error stack. */
 static herr_t walk_error_callback(H5_ATTR_UNUSED unsigned n, const H5E_error2_t *err_desc, void *udata) {
 	if (err_desc)
-		*((int *) udata) = err_desc->maj_num;
+		*((hid_t *) udata) = err_desc->maj_num;
 
 	return 0;
 }
@@ -129,6 +129,20 @@ int copy_objects(const char* fnamein, const char* fnameout, pack_opt_t *options)
 			goto out;
 		}
 
+		if (!options->fs_strategy) {
+			if (H5Pget_file_space(fcpl_in, &options->fs_strategy, NULL) < 0) {
+				error_msg("failed to retrieve file space strategy\n");
+				goto out;
+			}
+		}
+
+		if (!options->fs_threshold) {
+			if (H5Pget_file_space(fcpl_in, NULL, &options->fs_threshold) < 0) {
+				error_msg("failed to retrieve file space threshold\n");
+				goto out;
+			}
+		}
+
 		if (H5Pclose(fcpl_in) < 0) {
 			error_msg("failed to close property list\n");
 			goto out;
@@ -289,6 +303,25 @@ int copy_objects(const char* fnamein, const char* fnameout, pack_opt_t *options)
 		}
 	}
 
+	/*-------------------------------------------------------------------------
+	 * set free-space strategy options
+	 *-------------------------------------------------------------------------
+	 */
+
+	/* either use the FCPL already created or create a new one */
+	if (fcpl == H5P_DEFAULT) {
+		/* create a file creation property list */
+		if ((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0) {
+			error_msg("fail to create a file creation property list\n");
+			goto out;
+		}
+	}
+
+	/* set file space strategy and free space threshold */
+	if (H5Pset_file_space(fcpl, options->fs_strategy, options->fs_threshold) < 0) {
+		error_msg("failed to set file space strategy & threshold \n");
+		goto out;
+	}
 
 	/*-------------------------------------------------------------------------
 	 * create the output file
diff --git a/tools/h5repack/h5repack_main.c b/tools/h5repack/h5repack_main.c
index f3fd469..708c173 100644
--- a/tools/h5repack/h5repack_main.c
+++ b/tools/h5repack/h5repack_main.c
@@ -33,7 +33,7 @@ const char *outfile = NULL;
  * Command-line options: The user can specify short or long-named
  * parameters.
  */
-static const char *s_opts = "hVvf:l:m:e:nLc:d:s:u:b:M:t:a:i:o:";
+static const char *s_opts = "hVvf:l:m:e:nLc:d:s:u:b:M:t:a:i:o:S:T:";
 static struct long_options l_opts[] = {
 	{ "help", no_arg, 'h' },
 	{ "version", no_arg, 'V' },
@@ -54,6 +54,8 @@ static struct long_options l_opts[] = {
 	{ "alignment", require_arg, 'a' },
 	{ "infile", require_arg, 'i' }, /* -i for backward compability */
 	{ "outfile", require_arg, 'o' }, /* -o for backward compability */
+	{ "fs_strategy", require_arg, 'S' },
+	{ "fs_threshold", require_arg, 'T' },
 	{ NULL, 0, '\0' }
 };
 
@@ -88,6 +90,8 @@ static void usage(const char *prog) {
 	printf("   -a A, --alignment=A     Alignment value for H5Pset_alignment\n");
 	printf("   -f FILT, --filter=FILT  Filter type\n");
 	printf("   -l LAYT, --layout=LAYT  Layout type\n");
+	printf("   -S FS_STRGY, --fs_strategy=FS_STRGY  File space management strategy\n");
+	printf("   -T FS_THRD, --fs_threshold=FS_THRD   Free-space section threshold\n");
 	printf("\n");
 	printf("    M - is an integer greater than 1, size of dataset in bytes (default is 0) \n");
 	printf("    E - is a filename.\n");
@@ -100,6 +104,19 @@ static void usage(const char *prog) {
 	printf("    F - is the shared object header message type, any of <dspace|dtype|fill|\n");
 	printf("        pline|attr>. If F is not specified, S applies to all messages\n");
 	printf("\n");
+	printf("    FS_STRGY is the file space management strategy to use for the output file.\n");
+	printf("             It is a string as listed below:\n");
+	printf("        ALL_PERSIST - Use persistent free-space managers, aggregators and virtual file driver\n");
+	printf("                      for file space allocation\n");
+	printf("        ALL - Use non-persistent free-space managers, aggregators and virtual file driver\n");
+	printf("              for file space allocation\n");
+	printf("        AGGR_VFD - Use aggregators and virtual file driver for file space allocation\n");
+	printf("        VFD - Use virtual file driver for file space allocation\n");
+	printf("\n");
+	printf("    FS_THRD is the free-space section threshold to use for the output file.\n");
+	printf("            It is the minimum size (in bytes) of free-space sections to be tracked\n");
+	printf("            by the the library's free-space managers.\n");
+	printf("\n");
 	printf("    FILT - is a string with the format:\n");
 	printf("\n");
 	printf("      <list of objects>:<name of filter>=<filter parameters>\n");
@@ -176,6 +193,7 @@ static void usage(const char *prog) {
 	printf("\n");
 }
 
+
 /*-------------------------------------------------------------------------
  * Function:    leave
  *
@@ -343,7 +361,7 @@ int parse_command_line(int argc, const char **argv, pack_opt_t* options) {
 			has_i_o = 1;
 			break;
 
-			/* -o for backward compability */
+		/* -o for backward compability */
 		case 'o':
 			outfile = opt_arg;
 			has_i_o = 1;
@@ -406,19 +424,19 @@ int parse_command_line(int argc, const char **argv, pack_opt_t* options) {
 			break;
 
 		case 'L':
-			options->latest = 1;
+			options->latest = TRUE;
 			break;
 
 		case 'c':
 			options->grp_compact = HDatoi( opt_arg );
 			if (options->grp_compact > 0)
-				options->latest = 1; /* must use latest format */
+				options->latest = TRUE; /* must use latest format */
 			break;
 
 		case 'd':
 			options->grp_indexed = HDatoi( opt_arg );
 			if (options->grp_indexed > 0)
-				options->latest = 1; /* must use latest format */
+				options->latest = TRUE; /* must use latest format */
 			break;
 
 		case 's':
@@ -426,7 +444,7 @@ int parse_command_line(int argc, const char **argv, pack_opt_t* options) {
 				int idx = 0;
 				int ssize = 0;
 				char *msgPtr = HDstrchr( opt_arg, ':');
-				options->latest = 1; /* must use latest format */
+				options->latest = TRUE; /* must use latest format */
 				if (msgPtr == NULL) {
 					ssize = HDatoi( opt_arg );
 					for (idx = 0; idx < 5; idx++)
@@ -482,6 +500,32 @@ int parse_command_line(int argc, const char **argv, pack_opt_t* options) {
 			}
 			break;
 
+		case 'S':
+			{
+				char strategy[MAX_NC_NAME];
+
+				HDstrcpy(strategy, opt_arg);
+				if (!HDstrcmp(strategy, "ALL_PERSIST"))
+					options->fs_strategy = H5F_FILE_SPACE_ALL_PERSIST;
+				else if (!HDstrcmp(strategy, "ALL"))
+					options->fs_strategy = H5F_FILE_SPACE_ALL;
+				else if (!HDstrcmp(strategy, "AGGR_VFD"))
+					options->fs_strategy = H5F_FILE_SPACE_AGGR_VFD;
+				else if (!HDstrcmp(strategy, "VFD"))
+					options->fs_strategy = H5F_FILE_SPACE_VFD;
+				else {
+					error_msg("invalid file space management strategy\n", opt_arg);
+					h5tools_setstatus(EXIT_FAILURE);
+					ret_value = -1;
+					goto done;
+				}
+			}
+			break;
+
+		case 'T':
+			options->fs_threshold = (hsize_t) HDatol( opt_arg );
+			break;
+
 		default:
 			break;
 		} /* switch */
@@ -536,7 +580,7 @@ int main(int argc, const char **argv) {
 	}
 
 	/* initialize options  */
-	h5repack_init(&options, 0);
+	h5repack_init(&options, 0, FALSE, H5F_FILE_SPACE_DEFAULT, (hsize_t) 0);
 
 	if (parse_command_line(argc, argv, &options) < 0)
 		goto done;
diff --git a/tools/h5repack/h5repack_refs.c b/tools/h5repack/h5repack_refs.c
index 2b39249..3f99704 100644
--- a/tools/h5repack/h5repack_refs.c
+++ b/tools/h5repack/h5repack_refs.c
@@ -180,7 +180,7 @@ int do_copy_refobjs(hid_t fidin,
                             } /* end if */
                             for(u = 0; u < nelmts; u++) {
                                 H5E_BEGIN_TRY {
-                                    if((refobj_id = H5Rdereference(dset_in, H5R_OBJECT, &buf[u])) < 0)
+                                    if((refobj_id = H5Rdereference2(dset_in, H5P_DEFAULT, H5R_OBJECT, &buf[u])) < 0)
                                         continue;
                                 } H5E_END_TRY;
 
@@ -262,7 +262,7 @@ int do_copy_refobjs(hid_t fidin,
 
                             for(u = 0; u < nelmts; u++) {
                                 H5E_BEGIN_TRY {
-                                    if((refobj_id = H5Rdereference(dset_in, H5R_DATASET_REGION, &buf[u])) < 0)
+                                    if((refobj_id = H5Rdereference2(dset_in, H5P_DEFAULT, H5R_DATASET_REGION, &buf[u])) < 0)
                                         continue;
                                 } H5E_END_TRY;
 
@@ -849,7 +849,7 @@ static herr_t update_ref_value(hid_t obj_id, H5R_type_t ref_type, void *ref_in,
 	const char* ref_obj_name;
 	hid_t space_id=-1, ref_obj_id=-1;
 
-    ref_obj_id = H5Rdereference(obj_id, ref_type, ref_in);
+    ref_obj_id = H5Rdereference2(obj_id, H5P_DEFAULT, ref_type, ref_in);
     if (ref_obj_id<0)
        goto done;
 
diff --git a/tools/h5repack/h5repack_verify.c b/tools/h5repack/h5repack_verify.c
index cec9c86..52423f1 100644
--- a/tools/h5repack/h5repack_verify.c
+++ b/tools/h5repack/h5repack_verify.c
@@ -49,16 +49,21 @@ static int verify_filters(hid_t pid, hid_t tid, int nfilters, filter_info_t *fil
  */
 
 int
-h5repack_verify(const char *out_fname, pack_opt_t *options)
+h5repack_verify(const char *in_fname, const char *out_fname, pack_opt_t *options)
 {
-    hid_t        fidout; /* file ID for output file*/
-    hid_t        did;    /* dataset ID */
-    hid_t        pid;    /* dataset creation property list ID */
-    hid_t        sid;    /* space ID */
-    hid_t        tid;    /* type ID */
+    hid_t        fidin      = -1;	/* file ID for input file*/
+    hid_t        fidout     = -1;   /* file ID for output file*/
+    hid_t        did        = -1;   /* dataset ID */
+    hid_t        pid        = -1;   /* dataset creation property list ID */
+    hid_t        sid        = -1;   /* space ID */
+    hid_t        tid        = -1;   /* type ID */
     unsigned int i;
     trav_table_t *travt = NULL;
     int          ok = 1;
+    hid_t       fcpl_in     = -1;   /* file creation property for input file */
+    hid_t   	fcpl_out    = -1;   /* file creation property for output file */
+    H5F_file_space_type_t in_strat, out_strat;	/* file space handling strategy for in/output file */
+    hsize_t	in_thresh, out_thresh;		/* free space section threshold for in/output file */
 
     /* open the output file */
     if((fidout = H5Fopen(out_fname, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0 )
@@ -195,10 +200,81 @@ h5repack_verify(const char *out_fname, pack_opt_t *options)
     }
 
    /*-------------------------------------------------------------------------
-    * close
+    * Verify that file space strategy and free space threshold
+    * are set as expected
     *-------------------------------------------------------------------------
     */
 
+    /* open the input file */
+    if((fidin = H5Fopen(in_fname, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0 )
+	goto error;
+
+    /* Get file creation property list for input file */
+    if((fcpl_in = H5Fget_create_plist(fidin)) < 0) {
+	error_msg("failed to retrieve file creation property list\n");
+	goto error;
+    }
+
+    /* Get file space management info for input file */
+    if(H5Pget_file_space(fcpl_in, &in_strat, &in_thresh) < 0) {
+	error_msg("failed to retrieve file space strategy & threshold\n");
+	goto error;
+    }
+
+    /* Output file is already opened */
+    /* Get file creation property list for output file */
+    if((fcpl_out = H5Fget_create_plist(fidout)) < 0) {
+	error_msg("failed to retrieve file creation property list\n");
+	goto error;
+    }
+
+    /* Get file space management info for output file */
+    if(H5Pget_file_space(fcpl_out, &out_strat, &out_thresh) < 0) {
+	error_msg("failed to retrieve file space strategy & threshold\n");
+	goto error;
+    }
+
+    /*
+     * If the strategy option is not set,
+     * file space handling strategy should be the same for both
+     * input & output files.
+     * If the strategy option is set,
+     * the output file's file space handling strategy should be the same
+     * as what is set via the strategy option
+     */
+    if(!options->fs_strategy && out_strat != in_strat) {
+	error_msg("file space strategy not set as unexpected\n");
+	goto error;
+
+    } else if(options->fs_strategy && out_strat!= options->fs_strategy)  {
+	error_msg("file space strategy not set as unexpectec\n");
+	goto error;
+    }
+
+    /*
+     * If the threshold option is not set,
+     * the free space section threshold should be the same for both
+     * input & output files.
+     * If the threshold option is set,
+     * the output file's free space section threshold should be the same
+     * as what is set via the threshold option.
+     */
+    if(!options->fs_threshold && out_thresh != in_thresh) {
+	error_msg("free space threshold not set as unexpected\n");
+	goto error;
+
+    } else if(options->fs_threshold && out_thresh != options->fs_threshold) {
+	error_msg("free space threshold not set as unexpectec\n");
+	goto error;
+    }
+
+    /* Closing */
+    if (H5Pclose(fcpl_in) < 0)
+	goto error;
+    if (H5Pclose(fcpl_out) < 0)
+	goto error;
+    if (H5Fclose(fidin) < 0)
+	goto error;
     if (H5Fclose(fidout) < 0)
 	goto error;
 
@@ -206,9 +282,12 @@ h5repack_verify(const char *out_fname, pack_opt_t *options)
 
 error:
     H5E_BEGIN_TRY {
+        H5Pclose(fcpl_in);
+        H5Pclose(fcpl_out);
         H5Pclose(pid);
         H5Sclose(sid);
         H5Dclose(did);
+        H5Fclose(fidin);
         H5Fclose(fidout);
         if (travt)
             trav_table_free(travt);
diff --git a/tools/h5repack/h5repacktst.c b/tools/h5repack/h5repacktst.c
index f49e587..030b052 100644
--- a/tools/h5repack/h5repacktst.c
+++ b/tools/h5repack/h5repacktst.c
@@ -170,6 +170,8 @@ int main (void)
 {
     pack_opt_t  pack_options;
     diff_opt_t  diff_options;
+    hsize_t  fs_size = 0;  /* free space section threshold */
+    H5F_file_space_type_t fs_type = H5F_FILE_SPACE_DEFAULT;  /* file space handling strategy */
     h5_stat_t		file_stat;
     h5_stat_size_t	fsize1, fsize2;	/* file sizes */
 #if defined (H5_HAVE_FILTER_SZIP)
@@ -210,13 +212,15 @@ int main (void)
     */
 
     TESTING("    copy of datasets (fill values)");
-    if (h5repack_init (&pack_options, 0) < 0)
+
+    /* fs_type = 0; fs_size = 0 */
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack(FNAME0,FNAME0OUT,&pack_options) < 0)
         GOERROR;
     if (h5diff(FNAME0,FNAME0OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME0OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME0, FNAME0OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_cmp_pl(FNAME0,FNAME0OUT)<=0)
         GOERROR;
@@ -230,13 +234,13 @@ int main (void)
     *-------------------------------------------------------------------------
     */
     TESTING("    copy of datasets (all datatypes)");
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack(FNAME1,FNAME1OUT,&pack_options) < 0)
         GOERROR;
     if (h5diff(FNAME1,FNAME1OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME1OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME1, FNAME1OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_cmp_pl(FNAME1,FNAME1OUT)<=0)
         GOERROR;
@@ -250,13 +254,13 @@ int main (void)
     *-------------------------------------------------------------------------
     */
     TESTING("    copy of datasets (attributes)");
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack(FNAME2,FNAME2OUT,&pack_options) < 0)
         GOERROR;
     if (h5diff(FNAME2,FNAME2OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME2OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME2, FNAME2OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_cmp_pl(FNAME2,FNAME2OUT)<=0)
         GOERROR;
@@ -269,13 +273,13 @@ int main (void)
     *-------------------------------------------------------------------------
     */
     TESTING("    copy of datasets (hardlinks)");
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack(FNAME3,FNAME3OUT,&pack_options) < 0)
         GOERROR;
     if (h5diff(FNAME3,FNAME3OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME3OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME3, FNAME3OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_cmp_pl(FNAME3,FNAME3OUT)<=0)
         GOERROR;
@@ -289,13 +293,13 @@ int main (void)
     *-------------------------------------------------------------------------
     */
     TESTING("    copy of allocation early file");
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack(FNAME5,FNAME5OUT,&pack_options) < 0)
         GOERROR;
     if (h5diff(FNAME5,FNAME5OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME5OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME5, FNAME5OUT, &pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -310,7 +314,7 @@ int main (void)
     * deflate
     *-------------------------------------------------------------------------
     */
-    TESTING("    adding deflate filter");
+    TESTING("    adding deflate filter (old_format)");
 
 #ifdef H5_HAVE_FILTER_DEFLATE
 
@@ -319,7 +323,7 @@ int main (void)
     *-------------------------------------------------------------------------
     */
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addfilter("dset1:GZIP=9",&pack_options) < 0)
         GOERROR;
@@ -329,7 +333,34 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT, &pack_options) <= 0)
+    if (h5repack_verify(FNAME4, FNAME4OUT, &pack_options) <= 0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+    PASSED();
+#else
+    SKIPPED();
+#endif
+
+    TESTING("    adding deflate filter (new format)");
+#ifdef H5_HAVE_FILTER_DEFLATE
+    /*-------------------------------------------------------------------------
+    * test an individual object option
+    * 	For new format, "dset1" should be using Fixed Array indexing
+    *-------------------------------------------------------------------------
+    */
+
+    if (h5repack_init (&pack_options, 0, TRUE, fs_type, fs_size) < 0)
+        GOERROR;
+    if (h5repack_addfilter("dset1:GZIP=9",&pack_options) < 0)
+        GOERROR;
+    if (h5repack_addlayout("dset1:CHUNK=20x10",&pack_options) < 0)
+        GOERROR;
+    if (h5repack(FNAME4,FNAME4OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME4, FNAME4OUT, &pack_options) <= 0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -347,7 +378,7 @@ int main (void)
 
 #ifdef H5_HAVE_FILTER_DEFLATE
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addfilter("GZIP=1",&pack_options) < 0)
         GOERROR;
@@ -357,7 +388,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -385,7 +416,7 @@ int main (void)
     */
 
     if (szip_can_encode) {
-        if (h5repack_init (&pack_options, 0) < 0)
+        if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
             GOERROR;
         if (h5repack_addfilter("dset2:SZIP=8,EC",&pack_options) < 0)
             GOERROR;
@@ -395,7 +426,7 @@ int main (void)
             GOERROR;
         if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
             GOERROR;
-        if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+        if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
             GOERROR;
         if (h5repack_end (&pack_options) < 0)
             GOERROR;
@@ -417,7 +448,7 @@ int main (void)
 
 #if defined (H5_HAVE_FILTER_SZIP)
     if (szip_can_encode) {
-        if (h5repack_init (&pack_options, 0) < 0)
+        if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
             GOERROR;
         if (h5repack_addfilter("SZIP=8,NN",&pack_options) < 0)
             GOERROR;
@@ -425,7 +456,7 @@ int main (void)
             GOERROR;
         if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
             GOERROR;
-        if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+        if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
             GOERROR;
         if (h5repack_end (&pack_options) < 0)
             GOERROR;
@@ -446,7 +477,7 @@ int main (void)
     *-------------------------------------------------------------------------
     */
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addfilter("dset1:SHUF",&pack_options) < 0)
         GOERROR;
@@ -456,7 +487,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -470,7 +501,8 @@ int main (void)
 
     TESTING("    addding shuffle filter to all");
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    /* fs_type = H5F_FILE_SPACE_ALL_PERSIST; fs_size = 1 */
+    if (h5repack_init (&pack_options, 0, FALSE, H5_INC_ENUM(H5F_file_space_type_t, fs_type), ++fs_size) < 0)
         GOERROR;
     if (h5repack_addfilter("SHUF",&pack_options) < 0)
         GOERROR;
@@ -480,7 +512,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -495,7 +527,7 @@ int main (void)
     *-------------------------------------------------------------------------
     */
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addfilter("dset1:FLET",&pack_options) < 0)
         GOERROR;
@@ -505,7 +537,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -520,7 +552,7 @@ int main (void)
 
     TESTING("    adding checksum filter to all");
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addfilter("FLET",&pack_options) < 0)
         GOERROR;
@@ -530,7 +562,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -545,7 +577,7 @@ int main (void)
     *-------------------------------------------------------------------------
     */
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addlayout("dset1:CHUNK 20x10",&pack_options) < 0)
         GOERROR;
@@ -570,7 +602,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -578,14 +610,14 @@ int main (void)
     PASSED();
 
 
-    TESTING("    adding layout chunked");
+    TESTING("    adding layout chunked (old format)");
 
     /*-------------------------------------------------------------------------
     * test an individual object option
     *-------------------------------------------------------------------------
     */
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addlayout("dset1:CHUNK=20x10",&pack_options) < 0)
         GOERROR;
@@ -593,7 +625,29 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT, &pack_options) <= 0)
+    if (h5repack_verify(FNAME4, FNAME4OUT, &pack_options )<= 0)
+        GOERROR;
+    if (h5repack_end (&pack_options) < 0)
+        GOERROR;
+    PASSED();
+
+    TESTING("    adding layout chunked (new format)");
+
+    /*-------------------------------------------------------------------------
+    * test an individual object option
+    * 	For new format, "dset1" should be using Fixed Array indexing
+    *-------------------------------------------------------------------------
+    */
+
+    if (h5repack_init (&pack_options, 0, TRUE, fs_type, fs_size) < 0)
+        GOERROR;
+    if (h5repack_addlayout("dset1:CHUNK=20x10",&pack_options) < 0)
+        GOERROR;
+    if (h5repack(FNAME4,FNAME4OUT,&pack_options) < 0)
+        GOERROR;
+    if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
+        GOERROR;
+    if (h5repack_verify(FNAME4, FNAME4OUT, &pack_options )<= 0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -605,7 +659,7 @@ int main (void)
     */
     TESTING("    adding layout chunked to all");
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addlayout("CHUNK=20x10",&pack_options) < 0)
         GOERROR;
@@ -613,7 +667,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -626,7 +680,7 @@ int main (void)
     * test an individual object option
     *-------------------------------------------------------------------------
     */
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addlayout("dset1:CONTI",&pack_options) < 0)
         GOERROR;
@@ -634,7 +688,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -647,7 +701,7 @@ int main (void)
     * test all objects option
     *-------------------------------------------------------------------------
     */
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addlayout("CONTI",&pack_options) < 0)
         GOERROR;
@@ -655,7 +709,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -664,7 +718,7 @@ int main (void)
     * do the same test for a file with filters (chunked)
     *-------------------------------------------------------------------------
     */
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addlayout("CONTI",&pack_options) < 0)
         GOERROR;
@@ -672,7 +726,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME8,FNAME8OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME8OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME8, FNAME8OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -686,7 +740,7 @@ int main (void)
     *-------------------------------------------------------------------------
     */
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addlayout("dset1:COMPA",&pack_options) < 0)
         GOERROR;
@@ -694,7 +748,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -707,7 +761,8 @@ int main (void)
     *-------------------------------------------------------------------------
     */
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    /* fs_type = H5F_FILE_SPACE_ALL; fs_size = 2 */
+    if (h5repack_init (&pack_options, 0, FALSE, H5_INC_ENUM(H5F_file_space_type_t, fs_type), ++fs_size) < 0)
         GOERROR;
     if (h5repack_addlayout("COMPA",&pack_options) < 0)
         GOERROR;
@@ -715,7 +770,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -729,7 +784,7 @@ int main (void)
     * layout compact to contiguous conversion
     *-------------------------------------------------------------------------
     */
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addlayout("dset_compact:CONTI",&pack_options) < 0)
         GOERROR;
@@ -737,7 +792,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -749,7 +804,7 @@ int main (void)
     * layout compact to chunk conversion
     *-------------------------------------------------------------------------
     */
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addlayout("dset_compact:CHUNK=2x5",&pack_options) < 0)
         GOERROR;
@@ -757,7 +812,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -769,7 +824,7 @@ int main (void)
     * layout compact to compact conversion
     *-------------------------------------------------------------------------
     */
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addlayout("dset_compact:COMPA",&pack_options) < 0)
         GOERROR;
@@ -777,7 +832,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -788,7 +843,7 @@ int main (void)
     * layout contiguous to compact conversion
     *-------------------------------------------------------------------------
     */
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addlayout("dset_contiguous:COMPA",&pack_options) < 0)
         GOERROR;
@@ -796,7 +851,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -807,7 +862,7 @@ int main (void)
     * layout contiguous to chunk conversion
     *-------------------------------------------------------------------------
     */
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addlayout("dset_contiguous:CHUNK=3x6",&pack_options) < 0)
         GOERROR;
@@ -815,7 +870,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -827,7 +882,7 @@ int main (void)
     * layout contiguous to contiguous conversion
     *-------------------------------------------------------------------------
     */
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addlayout("dset_contiguous:CONTI",&pack_options) < 0)
         GOERROR;
@@ -835,7 +890,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -846,7 +901,7 @@ int main (void)
     * layout chunked to compact conversion
     *-------------------------------------------------------------------------
     */
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addlayout("dset_chunk:COMPA",&pack_options) < 0)
         GOERROR;
@@ -854,7 +909,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -866,7 +921,7 @@ int main (void)
     * layout chunked to contiguous conversion
     *-------------------------------------------------------------------------
     */
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addlayout("dset_chunk:CONTI",&pack_options) < 0)
         GOERROR;
@@ -874,7 +929,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -885,7 +940,7 @@ int main (void)
     * layout chunked to chunked conversion
     *-------------------------------------------------------------------------
     */
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addlayout("dset_chunk:CHUNK=18x13",&pack_options) < 0)
         GOERROR;
@@ -893,7 +948,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME4,FNAME4OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME4OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME4, FNAME4OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -915,13 +970,14 @@ int main (void)
 
 #if defined (H5_HAVE_FILTER_SZIP)
     if (szip_can_encode) {
-        if (h5repack_init (&pack_options, 0) < 0)
+  /* fs_type = H5F_FILE_SPACE_AGGR_VFD; fs_size = 3 */
+        if (h5repack_init (&pack_options, 0, FALSE, H5_INC_ENUM(H5F_file_space_type_t, fs_type), ++fs_size) < 0)
             GOERROR;
         if (h5repack(FNAME7,FNAME7OUT,&pack_options) < 0)
             GOERROR;
         if (h5diff(FNAME7,FNAME7OUT,NULL,NULL,&diff_options) >0)
             GOERROR;
-        if (h5repack_verify(FNAME7OUT,&pack_options)<=0)
+        if (h5repack_verify(FNAME7, FNAME7OUT,&pack_options)<=0)
             GOERROR;
         if (h5repack_cmp_pl(FNAME7,FNAME7OUT)<=0)
             GOERROR;
@@ -940,7 +996,7 @@ int main (void)
 
 #if defined (H5_HAVE_FILTER_SZIP)
     if (szip_can_encode) {
-        if (h5repack_init (&pack_options, 0) < 0)
+        if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
             GOERROR;
         if (h5repack_addfilter("dset_szip:NONE",&pack_options) < 0)
             GOERROR;
@@ -948,7 +1004,7 @@ int main (void)
             GOERROR;
         if (h5diff(FNAME7,FNAME7OUT,NULL,NULL,&diff_options) >0)
             GOERROR;
-        if (h5repack_verify(FNAME7OUT,&pack_options)<=0)
+        if (h5repack_verify(FNAME7, FNAME7OUT,&pack_options)<=0)
             GOERROR;
         if (h5repack_end (&pack_options) < 0)
             GOERROR;
@@ -965,13 +1021,13 @@ int main (void)
     TESTING("    copy of deflate filter");
 
 #ifdef H5_HAVE_FILTER_DEFLATE
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack(FNAME8,FNAME8OUT,&pack_options) < 0)
         GOERROR;
     if (h5diff(FNAME8,FNAME8OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME8OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME8, FNAME8OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -985,7 +1041,7 @@ int main (void)
     TESTING("    removing deflate filter");
 
 #ifdef H5_HAVE_FILTER_DEFLATE
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, ++fs_size) < 0)
         GOERROR;
     if (h5repack_addfilter("dset_deflate:NONE",&pack_options) < 0)
         GOERROR;
@@ -993,7 +1049,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME8,FNAME8OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME8OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME8, FNAME8OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -1007,13 +1063,13 @@ int main (void)
 
     TESTING("    copy of shuffle filter");
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack(FNAME9,FNAME9OUT,&pack_options) < 0)
         GOERROR;
     if (h5diff(FNAME9,FNAME9OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME9OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME9, FNAME9OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -1023,7 +1079,7 @@ int main (void)
 
     TESTING("    removing shuffle filter");
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addfilter("dset_shuffle:NONE",&pack_options) < 0)
         GOERROR;
@@ -1031,7 +1087,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME9,FNAME9OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME9OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME9, FNAME9OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -1041,13 +1097,13 @@ int main (void)
 
     TESTING("    copy of fletcher filter");
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack(FNAME10,FNAME10OUT,&pack_options) < 0)
         GOERROR;
     if (h5diff(FNAME10,FNAME10OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME10OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME10, FNAME10OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -1057,7 +1113,7 @@ int main (void)
 
     TESTING("    removing fletcher filter");
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addfilter("dset_fletcher32:NONE",&pack_options) < 0)
         GOERROR;
@@ -1065,7 +1121,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME10,FNAME10OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME10OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME10, FNAME10OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -1075,13 +1131,13 @@ int main (void)
 
     TESTING("    copy of nbit filter");
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack(FNAME12,FNAME12OUT,&pack_options) < 0)
         GOERROR;
     if (h5diff(FNAME12,FNAME12OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME12OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME12, FNAME12OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -1091,7 +1147,7 @@ int main (void)
 
     TESTING("    removing nbit filter");
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addfilter("dset_nbit:NONE",&pack_options) < 0)
         GOERROR;
@@ -1099,7 +1155,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME12,FNAME12OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME12OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME12, FNAME12OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -1109,7 +1165,7 @@ int main (void)
 
     TESTING("    adding nbit filter");
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addfilter("dset_int31:NBIT",&pack_options) < 0)
         GOERROR;
@@ -1117,7 +1173,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME12,FNAME12OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME12OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME12, FNAME12OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -1127,13 +1183,13 @@ int main (void)
 
     TESTING("    copy of scaleoffset filter");
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack(FNAME13,FNAME13OUT,&pack_options) < 0)
         GOERROR;
     if (h5diff(FNAME13,FNAME13OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME13OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME13, FNAME13OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -1143,7 +1199,7 @@ int main (void)
 
     TESTING("    removing scaleoffset filter");
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addfilter("dset_scaleoffset:NONE",&pack_options) < 0)
         GOERROR;
@@ -1151,7 +1207,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME13,FNAME13OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME13OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME13, FNAME13OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -1161,7 +1217,7 @@ int main (void)
 
     TESTING("    adding scaleoffset filter");
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addfilter("dset_none:SOFF=31,IN",&pack_options) < 0)
         GOERROR;
@@ -1169,7 +1225,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME13,FNAME13OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME13OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME13, FNAME13OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -1193,7 +1249,8 @@ int main (void)
 #if defined (H5_HAVE_FILTER_SZIP) && defined (H5_HAVE_FILTER_DEFLATE)
 
     if (szip_can_encode) {
-        if (h5repack_init (&pack_options, 0) < 0)
+  /* fs_type = H5F_FILE_SPACE_VFD; fs_size = 4 */
+        if (h5repack_init (&pack_options, 0, FALSE, H5_INC_ENUM(H5F_file_space_type_t, fs_type), ++fs_size) < 0)
             GOERROR;
         if (h5repack_addfilter("dset_deflate:SZIP=8,NN",&pack_options) < 0)
             GOERROR;
@@ -1201,7 +1258,7 @@ int main (void)
             GOERROR;
         if (h5diff(FNAME11,FNAME11OUT,NULL,NULL,&diff_options) >0)
             GOERROR;
-        if (h5repack_verify(FNAME11OUT,&pack_options)<=0)
+        if (h5repack_verify(FNAME11, FNAME11OUT,&pack_options)<=0)
             GOERROR;
         if (h5repack_end (&pack_options) < 0)
             GOERROR;
@@ -1219,7 +1276,7 @@ int main (void)
 #if defined (H5_HAVE_FILTER_SZIP) && defined (H5_HAVE_FILTER_DEFLATE)
 
     if (szip_can_encode) {
-        if (h5repack_init (&pack_options, 0) < 0)
+        if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
             GOERROR;
         if (h5repack_addfilter("dset_szip:GZIP=1",&pack_options) < 0)
             GOERROR;
@@ -1227,7 +1284,7 @@ int main (void)
             GOERROR;
         if (h5diff(FNAME11,FNAME11OUT,NULL,NULL,&diff_options) >0)
             GOERROR;
-        if (h5repack_verify(FNAME11OUT,&pack_options)<=0)
+        if (h5repack_verify(FNAME11, FNAME11OUT,&pack_options)<=0)
             GOERROR;
         if (h5repack_end (&pack_options) < 0)
             GOERROR;
@@ -1250,7 +1307,7 @@ int main (void)
 
 #if defined (H5_HAVE_FILTER_SZIP) && defined (H5_HAVE_FILTER_DEFLATE)
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addfilter("NONE",&pack_options) < 0)
         GOERROR;
@@ -1258,7 +1315,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME11,FNAME11OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME11OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME11, FNAME11OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -1273,13 +1330,14 @@ int main (void)
     *-------------------------------------------------------------------------
     */
     TESTING("    big file");
-    if (h5repack_init (&pack_options, 0) < 0)
+
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack(FNAME14,FNAME14OUT,&pack_options) < 0)
         GOERROR;
     if (h5diff(FNAME14,FNAME14OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME14OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME14, FNAME14OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -1290,13 +1348,13 @@ int main (void)
     *-------------------------------------------------------------------------
     */
     TESTING("    external datasets");
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack(FNAME15,FNAME15OUT,&pack_options) < 0)
         GOERROR;
     if (h5diff(FNAME15,FNAME15OUT,NULL,NULL,&diff_options) > 0)
         GOERROR;
-    if (h5repack_verify(FNAME15OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME15, FNAME15OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -1307,13 +1365,13 @@ int main (void)
     *-------------------------------------------------------------------------
     */
     TESTING("    file with userblock");
-    if(h5repack_init(&pack_options, 0) < 0)
+    if(h5repack_init(&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if(h5repack(FNAME16, FNAME16OUT, &pack_options) < 0)
         GOERROR;
     if(h5diff(FNAME16, FNAME16OUT, NULL, NULL, &diff_options) > 0)
         GOERROR;
-    if(h5repack_verify(FNAME16OUT, &pack_options) <= 0)
+    if(h5repack_verify(FNAME16, FNAME16OUT, &pack_options) <= 0)
         GOERROR;
     if(verify_userblock(FNAME16OUT) < 0)
         GOERROR;
@@ -1326,7 +1384,7 @@ int main (void)
     *-------------------------------------------------------------------------
     */
     TESTING("    latest file format options");
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     pack_options.latest=1;
     pack_options.grp_compact=10;
@@ -1340,7 +1398,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME1,FNAME1OUT,NULL,NULL,&diff_options) > 0)
         GOERROR;
-    if (h5repack_verify(FNAME1OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME1, FNAME1OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -1356,7 +1414,7 @@ int main (void)
 
 #if defined (H5_HAVE_FILTER_DEFLATE)
 
-    if (h5repack_init (&pack_options, 0) < 0)
+    if (h5repack_init (&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
     if (h5repack_addfilter("GZIP=1",&pack_options) < 0)
         GOERROR;
@@ -1366,7 +1424,7 @@ int main (void)
         GOERROR;
     if (h5diff(FNAME11,FNAME11OUT,NULL,NULL,&diff_options) >0)
         GOERROR;
-    if (h5repack_verify(FNAME11OUT,&pack_options)<=0)
+    if (h5repack_verify(FNAME11, FNAME11OUT,&pack_options)<=0)
         GOERROR;
     if (h5repack_end (&pack_options) < 0)
         GOERROR;
@@ -1385,7 +1443,7 @@ int main (void)
 
 #ifdef H5_HAVE_FILTER_DEFLATE
 
-    if(h5repack_init(&pack_options, 0) < 0)
+    if(h5repack_init(&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
 
     /* add the options for a user block size and user block filename */
@@ -1396,7 +1454,7 @@ int main (void)
         GOERROR;
     if(h5diff(FNAME8, FNAME8OUT, NULL, NULL, &diff_options) > 0)
         GOERROR;
-    if(h5repack_verify(FNAME8OUT, &pack_options) <= 0)
+    if(h5repack_verify(FNAME8, FNAME8OUT, &pack_options) <= 0)
         GOERROR;
     if(verify_userblock(FNAME8OUT) < 0)
         GOERROR;
@@ -1418,7 +1476,7 @@ int main (void)
 
 #ifdef H5_HAVE_FILTER_DEFLATE
 
-    if(h5repack_init(&pack_options, 0) < 0)
+    if(h5repack_init(&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
 
     /* add the options for aligment */
@@ -1429,7 +1487,7 @@ int main (void)
         GOERROR;
     if(h5diff(FNAME8, FNAME8OUT, NULL, NULL, &diff_options) > 0)
         GOERROR;
-    if(h5repack_verify(FNAME8OUT, &pack_options) <= 0)
+    if(h5repack_verify(FNAME8, FNAME8OUT, &pack_options) <= 0)
         GOERROR;
 
     /* verify aligment */
@@ -1472,14 +1530,14 @@ int main (void)
     */
     TESTING("    file with committed datatypes");
 
-    if(h5repack_init(&pack_options, 0) < 0)
+    if(h5repack_init(&pack_options, 0, FALSE, fs_type, fs_size) < 0)
         GOERROR;
 
     if(h5repack(FNAME17, FNAME17OUT, &pack_options) < 0)
         GOERROR;
     if(h5diff(FNAME17, FNAME17OUT, NULL, NULL, &diff_options) > 0)
         GOERROR;
-    if(h5repack_verify(FNAME17OUT, &pack_options) <= 0)
+    if(h5repack_verify(FNAME17, FNAME17OUT, &pack_options) <= 0)
         GOERROR;
     if(h5repack_end(&pack_options) < 0)
         GOERROR;
@@ -1491,13 +1549,15 @@ int main (void)
     * test --metadata_block_size option
     * Also verify that output file using the metadata_block_size option is
     * larger than the output file one not using it.
+    * FNAME4 is used because it is the same as the test file used for the
+    * shell script version of this test (h5repack.sh).
     *-------------------------------------------------------------------------
     */
     TESTING("    metadata block size option");
     /* First run without metadata option. No need to verify the correctness */
     /* since this has been verified by earlier tests. Just record the file */
     /* size of the output file. */
-    if(h5repack_init(&pack_options, 0) < 0)
+    if(h5repack_init(&pack_options, 0, FALSE, H5F_FILE_SPACE_DEFAULT, (hsize_t)0) < 0)
         GOERROR;
     if(h5repack(FNAME4, FNAME4OUT, &pack_options) < 0)
         GOERROR;
@@ -1508,14 +1568,14 @@ int main (void)
         GOERROR;
 
     /* run it again with metadata option */
-    if(h5repack_init(&pack_options, 0) < 0)
+    if(h5repack_init(&pack_options, 0, FALSE, H5F_FILE_SPACE_DEFAULT, (hsize_t)0) < 0)
         GOERROR;
     pack_options.meta_block_size = 8192;
     if(h5repack(FNAME4, FNAME4OUT, &pack_options) < 0)
         GOERROR;
     if(h5diff(FNAME4, FNAME4OUT, NULL, NULL, &diff_options) > 0)
         GOERROR;
-    if(h5repack_verify(FNAME4OUT, &pack_options) <= 0)
+    if(h5repack_verify(FNAME4, FNAME4OUT, &pack_options) <= 0)
         GOERROR;
     /* record the file size of the output file */
     if(HDstat(FNAME4OUT, &file_stat) < 0)
@@ -1536,10 +1596,8 @@ int main (void)
     {
         hid_t       fapl;
 
-        /* setup */
-        h5_reset();
         fapl = h5_fileaccess();
-        h5_cleanup(H5REPACK_FILENAMES, fapl);
+        h5_clean_files(H5REPACK_FILENAMES, fapl);
 
     }
 
diff --git a/tools/h5repack/testfiles/h5repack-help.txt b/tools/h5repack/testfiles/h5repack-help.txt
index ba58bc6..c70b031 100644
--- a/tools/h5repack/testfiles/h5repack-help.txt
+++ b/tools/h5repack/testfiles/h5repack-help.txt
@@ -19,6 +19,8 @@ usage: h5repack [OPTIONS] file1 file2
    -a A, --alignment=A     Alignment value for H5Pset_alignment
    -f FILT, --filter=FILT  Filter type
    -l LAYT, --layout=LAYT  Layout type
+   -S FS_STRGY, --fs_strategy=FS_STRGY  File space management strategy
+   -T FS_THRD, --fs_threshold=FS_THRD   Free-space section threshold
 
     M - is an integer greater than 1, size of dataset in bytes (default is 0) 
     E - is a filename.
@@ -31,6 +33,19 @@ usage: h5repack [OPTIONS] file1 file2
     F - is the shared object header message type, any of <dspace|dtype|fill|
         pline|attr>. If F is not specified, S applies to all messages
 
+    FS_STRGY is the file space management strategy to use for the output file.
+             It is a string as listed below:
+        ALL_PERSIST - Use persistent free-space managers, aggregators and virtual file driver
+                      for file space allocation
+        ALL - Use non-persistent free-space managers, aggregators and virtual file driver
+              for file space allocation
+        AGGR_VFD - Use aggregators and virtual file driver for file space allocation
+        VFD - Use virtual file driver for file space allocation
+
+    FS_THRD is the free-space section threshold to use for the output file.
+            It is the minimum size (in bytes) of free-space sections to be tracked
+            by the the library's free-space managers.
+
     FILT - is a string with the format:
 
       <list of objects>:<name of filter>=<filter parameters>
diff --git a/tools/h5repack/testfiles/h5repack_attr.h5 b/tools/h5repack/testfiles/h5repack_attr.h5
index fe066db..3bc4906 100644
Binary files a/tools/h5repack/testfiles/h5repack_attr.h5 and b/tools/h5repack/testfiles/h5repack_attr.h5 differ
diff --git a/tools/h5repack/testfiles/h5repack_deflate.h5 b/tools/h5repack/testfiles/h5repack_deflate.h5
index 3a4b86d..86d66c0 100644
Binary files a/tools/h5repack/testfiles/h5repack_deflate.h5 and b/tools/h5repack/testfiles/h5repack_deflate.h5 differ
diff --git a/tools/h5repack/testfiles/h5repack_early.h5 b/tools/h5repack/testfiles/h5repack_early.h5
index 9b92890..0394bef 100644
Binary files a/tools/h5repack/testfiles/h5repack_early.h5 and b/tools/h5repack/testfiles/h5repack_early.h5 differ
diff --git a/tools/h5repack/testfiles/h5repack_fill.h5 b/tools/h5repack/testfiles/h5repack_fill.h5
index 21516cb..81c32d5 100644
Binary files a/tools/h5repack/testfiles/h5repack_fill.h5 and b/tools/h5repack/testfiles/h5repack_fill.h5 differ
diff --git a/tools/h5repack/testfiles/h5repack_filters.h5 b/tools/h5repack/testfiles/h5repack_filters.h5
index 042b8db..0600adb 100644
Binary files a/tools/h5repack/testfiles/h5repack_filters.h5 and b/tools/h5repack/testfiles/h5repack_filters.h5 differ
diff --git a/tools/h5repack/testfiles/h5repack_fletcher.h5 b/tools/h5repack/testfiles/h5repack_fletcher.h5
index 2f137b0..e4e2c05 100644
Binary files a/tools/h5repack/testfiles/h5repack_fletcher.h5 and b/tools/h5repack/testfiles/h5repack_fletcher.h5 differ
diff --git a/tools/h5repack/testfiles/h5repack_hlink.h5 b/tools/h5repack/testfiles/h5repack_hlink.h5
index 3d22728..b00f9a2 100644
Binary files a/tools/h5repack/testfiles/h5repack_hlink.h5 and b/tools/h5repack/testfiles/h5repack_hlink.h5 differ
diff --git a/tools/h5repack/testfiles/h5repack_layouto.h5 b/tools/h5repack/testfiles/h5repack_layouto.h5
index a038e68..3322020 100644
Binary files a/tools/h5repack/testfiles/h5repack_layouto.h5 and b/tools/h5repack/testfiles/h5repack_layouto.h5 differ
diff --git a/tools/h5repack/testfiles/h5repack_nbit.h5 b/tools/h5repack/testfiles/h5repack_nbit.h5
index 3ada112..c678f1c 100644
Binary files a/tools/h5repack/testfiles/h5repack_nbit.h5 and b/tools/h5repack/testfiles/h5repack_nbit.h5 differ
diff --git a/tools/h5repack/testfiles/h5repack_shuffle.h5 b/tools/h5repack/testfiles/h5repack_shuffle.h5
index d13cca7..6520193 100644
Binary files a/tools/h5repack/testfiles/h5repack_shuffle.h5 and b/tools/h5repack/testfiles/h5repack_shuffle.h5 differ
diff --git a/tools/h5repack/testfiles/h5repack_soffset.h5 b/tools/h5repack/testfiles/h5repack_soffset.h5
index 89ee99a..a9457d3 100644
Binary files a/tools/h5repack/testfiles/h5repack_soffset.h5 and b/tools/h5repack/testfiles/h5repack_soffset.h5 differ
diff --git a/tools/h5repack/testfiles/h5repack_szip.h5 b/tools/h5repack/testfiles/h5repack_szip.h5
index b16d169..5eab9f8 100644
Binary files a/tools/h5repack/testfiles/h5repack_szip.h5 and b/tools/h5repack/testfiles/h5repack_szip.h5 differ
diff --git a/tools/h5stat/Makefile.in b/tools/h5stat/Makefile.in
index 1bbefe9..67de66c 100644
--- a/tools/h5stat/Makefile.in
+++ b/tools/h5stat/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -33,7 +33,17 @@
 
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -96,22 +106,22 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/testh5stat.sh.in $(top_srcdir)/bin/depcomp \
-	$(top_srcdir)/bin/test-driver
 check_PROGRAMS = $(am__EXEEXT_1)
 bin_PROGRAMS = h5stat$(EXEEXT)
 TESTS = $(am__EXEEXT_1) $(TEST_SCRIPT)
 subdir = tools/h5stat
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES = testh5stat.sh
 CONFIG_CLEAN_VPATH_FILES =
 am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"
@@ -172,7 +182,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -395,6 +405,10 @@ am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
 TEST_LOGS = $(am__test_logs2:.sh.log=.log)
 SH_LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
 SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/testh5stat.sh.in \
+	$(top_srcdir)/bin/depcomp $(top_srcdir)/bin/test-driver \
+	$(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -414,7 +428,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -459,14 +472,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -476,13 +497,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -524,9 +544,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -724,7 +755,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/h5stat/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign tools/h5stat/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -733,7 +763,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -965,7 +995,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1251,6 +1281,8 @@ uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS
 	uninstall uninstall-am uninstall-binPROGRAMS \
 	uninstall-binSCRIPTS
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/tools/h5stat/h5stat.c b/tools/h5stat/h5stat.c
index 4cdb816..a331014 100644
--- a/tools/h5stat/h5stat.c
+++ b/tools/h5stat/h5stat.c
@@ -32,11 +32,21 @@
 #define DEF_SIZE_SMALL_DSETS        	10
 #define DEF_SIZE_SMALL_ATTRS  		10
 
+#define SIZE_SMALL_SECTS        	10
+
 #define  H5_NFILTERS_IMPL        8     /* Number of currently implemented filters + one to
                                           accommodate for user-define filters + one
                                           to accomodate datasets whithout any filters */
 
-
+/* File space management strategies: see H5Fpublic.h for declarations */
+const char *FS_STRATEGY_NAME[] = {
+    "unknown",
+    "H5F_FILE_SPACE_ALL_PERSIST",
+    "H5F_FILE_SPACE_ALL",
+    "H5F_FILE_SPACE_AGGR_VFD",
+    "H5F_FILE_SPACE_VFD",
+    NULL
+};
 
 /* Datatype statistics for datasets */
 typedef struct dtype_info_t {
@@ -93,8 +103,16 @@ typedef struct iter_t {
     hsize_t SM_hdr_storage_size;        /* header size for SOHM table (1.8) */
     hsize_t SM_index_storage_size;      /* index (btree & list) size for SOHM table (1.8) */
     hsize_t SM_heap_storage_size;       /* fractal heap size for SOHM table (1.8) */
+    hsize_t super_size;                 /* superblock size */
     hsize_t super_ext_size;             /* superblock extension size */
     hsize_t ublk_size;                  /* user block size (if exists) */
+    H5F_file_space_type_t fs_strategy;  /* File space management strategy */
+    hsize_t fs_threshold;               /* Free-space section threshold */
+    hsize_t free_space;                 /* amount of freespace in the file */
+    hsize_t free_hdr;                   /* size of free space manager metadata in the file */
+    unsigned long num_small_sects[SIZE_SMALL_SECTS];   /* Size of small free-space sections */
+    unsigned sect_nbins;                /* Number of bins for free-space section sizes */
+    unsigned long *sect_bins;           /* Pointer to array of bins for free-space section sizes */
     hsize_t datasets_index_storage_size;/* meta size for chunked dataset's indexing type */
     hsize_t datasets_heap_storage_size; /* heap size for dataset with external storage */
     unsigned long nexternal;            /* Number of external files for a dataset */
@@ -110,6 +128,7 @@ static int        display_group = FALSE;    /* display groups information */
 static int        display_dset = FALSE;     /* display datasets information */
 static int        display_dset_dtype_meta = FALSE;  /* display datasets' datatype information */
 static int        display_attr = FALSE;     /* display attributes information */
+static int        display_free_sections = FALSE;    /* display free space information */
 static int        display_summary = FALSE;  /* display summary of file space information */
 
 static int        display_file_metadata = FALSE;    /* display file space info for file's metadata */
@@ -129,7 +148,7 @@ struct handler_t {
     char **obj;
 };
 
-static const char *s_opts ="Aa:Ddm:FfhGgl:STO:V";
+static const char *s_opts ="Aa:Ddm:FfhGgl:sSTO:V";
 /* e.g. "filemetadata" has to precede "file"; "groupmetadata" has to precede "group" etc. */
 static struct long_options l_opts[] = {
     {"help", no_arg, 'h'},
@@ -214,6 +233,14 @@ static struct long_options l_opts[] = {
     { "numa", require_arg, 'a' },
     { "num", require_arg, 'a' },
     { "nu", require_arg, 'a' },
+    { "freespace", no_arg, 's' },
+    { "freespac", no_arg, 's' },
+    { "freespa", no_arg, 's' },
+    { "freesp", no_arg, 's' },
+    { "frees", no_arg, 's' },
+    { "free", no_arg, 's' },
+    { "fre", no_arg, 's' },
+    { "fr", no_arg, 's' },
     { "summary", no_arg, 'S' },
     { "summar", no_arg, 'S' },
     { "summa", no_arg, 'S' },
@@ -266,6 +293,7 @@ static void usage(const char *prog)
      HDfprintf(stdout, "     -a N, --numattrs=N    Set the threshold for the # of attributes when printing\n");
      HDfprintf(stdout, "                           information for small # of attributes.  N is an integer greater\n");
      HDfprintf(stdout, "                           than 0.  The default threshold is 10.\n");
+     HDfprintf(stdout, "     -s, --freespace       Print free space information\n");
      HDfprintf(stdout, "     -S, --summary         Print summary of file space information\n");
 }
 
@@ -282,7 +310,7 @@ static void usage(const char *prog)
  *
  *-------------------------------------------------------------------------
  */
-static unsigned
+H5_ATTR_CONST static unsigned
 ceil_log10(unsigned long x)
 {
     unsigned long pow10 = 1;
@@ -293,7 +321,7 @@ ceil_log10(unsigned long x)
         ret++;
     } /* end while */
 
-    return(ret);
+    return ret;
 } /* ceil_log10() */
 
 

@@ -740,6 +768,66 @@ lnk_stats(const char H5_ATTR_UNUSED *path, const H5L_info_t *li, void *_iter)
     return 0;
 } /* end lnk_stats() */
 
+/*-------------------------------------------------------------------------
+ * Function: freespace_stats
+ *
+ * Purpose: Gather statistics for free space sections in the file
+ *
+ * Return: Success: 0
+ *       Failure: -1
+ *
+ * Programmer:  Vailin Choi; July 7th, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+freespace_stats(hid_t fid, iter_t *iter)
+{
+    H5F_sect_info_t *sect_info = NULL;    /* Free space sections */
+    ssize_t   nsects;                   /* Number of free space sections */
+    size_t   u;                        /* Local index variable */
+
+    /* Query section information */
+    if((nsects = H5Fget_free_sections(fid, H5FD_MEM_DEFAULT, 0, NULL)) < 0)
+        return(FAIL);
+    else if(nsects) {
+        if(NULL == (sect_info = (H5F_sect_info_t *)HDcalloc((size_t)nsects, sizeof(H5F_sect_info_t))))
+            return(FAIL);
+        nsects = H5Fget_free_sections(fid, H5FD_MEM_DEFAULT, (size_t)nsects, sect_info);
+        HDassert(nsects);
+    } /* end else-if */
+
+    for(u = 0; u < (size_t)nsects; u++) {
+        unsigned   bin;       /* "bin" the number of objects falls in */
+
+        if(sect_info[u].size < SIZE_SMALL_SECTS)
+            (iter->num_small_sects[(size_t)sect_info[u].size])++;
+
+        /* Add section size to proper bin */
+        bin = ceil_log10((unsigned long)sect_info[u].size);
+        if(bin >= iter->sect_nbins) {
+            /* Allocate more storage for section info */
+            iter->sect_bins = (unsigned long *)HDrealloc(iter->sect_bins, (bin + 1) * sizeof(unsigned long));
+            HDassert(iter->sect_bins);
+
+            /* Initialize counts for intermediate bins */
+            while(iter->sect_nbins < bin)
+                iter->sect_bins[iter->sect_nbins++] = 0;
+            iter->sect_nbins++;
+
+            /* Initialize count for this bin */
+            iter->sect_bins[bin] = 1;
+        } /* end if */
+        else
+            (iter->sect_bins[bin])++;
+    } /* end for */
+
+    if(sect_info)
+        HDfree(sect_info);
+
+    return 0;
+} /* end freespace_stats() */
+
 

 /*-------------------------------------------------------------------------
  * Function: hand_free
@@ -882,6 +970,11 @@ parse_command_line(int argc, const char *argv[], struct handler_t **hand_ret)
 
                 break;
 
+            case 's':
+                display_all = FALSE;
+                display_free_sections = TRUE;
+                break;
+
             case 'S':
                 display_all = FALSE;
                 display_summary = TRUE;
@@ -996,6 +1089,11 @@ iter_free(iter_t *iter)
         iter->small_dset_dims = NULL;
     } /* end if */
 
+    /* Clear array of bins for free-space section sizes */
+    if(iter->sect_bins) {
+        HDfree(iter->sect_bins);
+        iter->sect_bins = NULL;
+    } /* end if */
 } /* end iter_free() */
 
 

@@ -1049,6 +1147,7 @@ static herr_t
 print_file_metadata(const iter_t *iter)
 {
     HDfprintf(stdout, "File space information for file metadata (in bytes):\n");
+    HDfprintf(stdout, "\tSuperblock: %Hu\n", iter->super_size);
     HDfprintf(stdout, "\tSuperblock extension: %Hu\n", iter->super_ext_size);
     HDfprintf(stdout, "\tUser block: %Hu\n", iter->ublk_size);
 
@@ -1082,6 +1181,10 @@ print_file_metadata(const iter_t *iter)
     HDfprintf(stdout, "\t\tB-tree/List: %Hu\n", iter->SM_index_storage_size);
     HDfprintf(stdout, "\t\tHeap: %Hu\n", iter->SM_heap_storage_size);
 
+    HDfprintf(stdout, "\tFree-space managers:\n");
+    HDfprintf(stdout, "\t\tHeader: %Hu\n", iter->free_hdr);
+    HDfprintf(stdout, "\t\tAmount of free space: %Hu\n", iter->free_space);
+
     return 0;
 } /* print_file_metadata() */
 
@@ -1239,8 +1342,8 @@ print_dataset_info(const iter_t *iter)
 
         printf("Dataset layout information:\n");
         for(u = 0; u < H5D_NLAYOUTS; u++)
-        printf("\tDataset layout counts[%s]: %lu\n", (u == 0 ? "COMPACT" :
-                (u == 1 ? "CONTIG" : "CHUNKED")), iter->dset_layouts[u]);
+        printf("\tDataset layout counts[%s]: %lu\n", (u == H5D_COMPACT ? "COMPACT" :
+                (u == H5D_CONTIGUOUS ? "CONTIG" : (u == H5D_CHUNKED ? "CHUNKED" : "VIRTUAL"))), iter->dset_layouts[u]);
         printf("\tNumber of external files : %lu\n", iter->nexternal);
 
         printf("Dataset filters information:\n");
@@ -1379,6 +1482,55 @@ print_attr_info(const iter_t *iter)
 
 

 /*-------------------------------------------------------------------------
+ * Function: print_freespace_info
+ *
+ * Purpose: Prints information about free space in the file
+ *
+ * Return: Success: 0
+ *
+ * Failure: Never fails
+ *
+ * Programmer: Vailin Choi; July 7th, 2009
+ *
+ *-------------------------------------------------------------------------
+ */
+static herr_t
+print_freespace_info(const iter_t *iter)
+{
+    unsigned long power;        /* Temporary "power" for bins */
+    unsigned long total;        /* Total count for various statistics */
+    unsigned u;                 /* Local index variable */
+
+    HDfprintf(stdout, "Free-space section threshold: %Hu bytes\n", iter->fs_threshold);
+    printf("Small size free-space sections (< %u bytes):\n", (unsigned)SIZE_SMALL_SECTS);
+    total = 0;
+    for(u = 0; u < SIZE_SMALL_SECTS; u++) {
+        if(iter->num_small_sects[u] > 0) {
+            printf("\t# of sections of size %u: %lu\n", u, iter->num_small_sects[u]);
+            total += iter->num_small_sects[u];
+        } /* end if */
+    } /* end for */
+    printf("\tTotal # of small size sections: %lu\n", total);
+
+    printf("Free-space section bins:\n");
+
+    total = 0;
+    power = 1;
+    for(u = 1; u < iter->sect_nbins; u++) {
+        if(iter->sect_bins[u] > 0) {
+           printf("\t# of sections of size %lu - %lu: %lu\n", power, (power * 10) - 1,
+                    iter->sect_bins[u]);
+           total += iter->sect_bins[u];
+        } /* end if */
+        power *= 10;
+    } /* end for */
+    printf("\tTotal # of sections: %lu\n", total);
+
+    return 0;
+} /* print_freespace_info() */
+
+

+/*-------------------------------------------------------------------------
  * Function: print_storage_summary
  *
  * Purpose: Prints file space information for the file
@@ -1396,10 +1548,12 @@ print_storage_summary(const iter_t *iter)
 {
     hsize_t total_meta = 0;
     hsize_t unaccount = 0;
+    double  percent = 0.0f;
 
+    HDfprintf(stdout, "File space management strategy: %s\n", FS_STRATEGY_NAME[iter->fs_strategy]);
     printf("Summary of file space information:\n");
     total_meta =
-            iter->super_ext_size + iter->ublk_size +
+            iter->super_size + iter->super_ext_size + iter->ublk_size +
             iter->group_ohdr_info.total_size +
             iter->dset_ohdr_info.total_size +
             iter->dtype_ohdr_info.total_size +
@@ -1411,21 +1565,26 @@ print_storage_summary(const iter_t *iter)
             iter->datasets_heap_storage_size +
             iter->SM_hdr_storage_size +
             iter->SM_index_storage_size +
-            iter->SM_heap_storage_size;
+            iter->SM_heap_storage_size +
+            iter->free_hdr;
 
     HDfprintf(stdout, "  File metadata: %Hu bytes\n", total_meta);
     HDfprintf(stdout, "  Raw data: %Hu bytes\n", iter->dset_storage_size);
 
-    if(iter->filesize < (total_meta + iter->dset_storage_size)) {
-        unaccount = (total_meta + iter->dset_storage_size ) - iter->filesize;
+    percent = ((double)iter->free_space / (double)iter->filesize) * (double)100.0f;
+    HDfprintf(stdout, "  Amount/Percent of tracked free space: %Hu bytes/%3.1f%\n",
+                iter->free_space, percent);
+
+    if(iter->filesize < (total_meta + iter->dset_storage_size + iter->free_space)) {
+        unaccount = (total_meta + iter->dset_storage_size + iter->free_space) - iter->filesize;
         HDfprintf(stdout, "  ??? File has %Hu more bytes accounted for than its size! ???\n", unaccount);
     }
     else {
-        unaccount = iter->filesize - (total_meta + iter->dset_storage_size);
+        unaccount = iter->filesize - (total_meta + iter->dset_storage_size + iter->free_space);
         HDfprintf(stdout, "  Unaccounted space: %Hu bytes\n", unaccount);
     }
 
-    HDfprintf(stdout, "Total space: %Hu bytes\n", total_meta + iter->dset_storage_size + unaccount);
+    HDfprintf(stdout, "Total space: %Hu bytes\n", total_meta + iter->dset_storage_size + iter->free_space + unaccount);
 
     if(iter->nexternal)
         HDfprintf(stdout, "External raw data: %Hu bytes\n", iter->dset_external_storage_size);
@@ -1457,6 +1616,7 @@ print_file_statistics(const iter_t *iter)
         display_dset = TRUE;
         display_dset_dtype_meta = TRUE;
         display_attr = TRUE;
+        display_free_sections = TRUE;
         display_summary = TRUE;
 
         display_file_metadata = TRUE;
@@ -1475,6 +1635,7 @@ print_file_statistics(const iter_t *iter)
     if(!display_all && display_dset_metadata)   print_dset_metadata(iter);
 
     if(display_attr)            print_attr_info(iter);
+    if(display_free_sections)   print_freespace_info(iter);
     if(display_summary)         print_storage_summary(iter);
 } /* print_file_statistics() */
 
@@ -1564,7 +1725,7 @@ main(int argc, const char *argv[])
     /* Check for filename given */
     if(fname) {
         hid_t               fcpl;
-        H5F_info_t          finfo;
+        H5F_info2_t         finfo;
 
         printf("Filename: %s\n", fname);
 
@@ -1583,13 +1744,16 @@ main(int argc, const char *argv[])
         HDassert(iter.filesize != 0);
 
         /* Get storge info for file-level structures */
-        if(H5Fget_info(fid, &finfo) < 0)
+        if(H5Fget_info2(fid, &finfo) < 0)
             warn_msg("Unable to retrieve file info\n");
         else {
-            iter.super_ext_size = finfo.super_ext_size;
+            iter.super_size = finfo.super.super_size;
+            iter.super_ext_size = finfo.super.super_ext_size;
             iter.SM_hdr_storage_size = finfo.sohm.hdr_size;
             iter.SM_index_storage_size = finfo.sohm.msgs_info.index_size;
             iter.SM_heap_storage_size = finfo.sohm.msgs_info.heap_size;
+            iter.free_space = finfo.free.tot_space;
+            iter.free_hdr = finfo.free.meta_size;
         } /* end else */
 
 	iter.num_small_groups = (unsigned long *)HDcalloc((size_t)sgroups_threshold, sizeof(unsigned long));
@@ -1608,6 +1772,14 @@ main(int argc, const char *argv[])
         if(H5Pget_userblock(fcpl, &iter.ublk_size) < 0)
             warn_msg("Unable to retrieve userblock size\n");
 
+        if(H5Pget_file_space(fcpl, &iter.fs_strategy, &iter.fs_threshold) < 0)
+            warn_msg("Unable to retrieve file space information\n");
+        HDassert(iter.fs_strategy != 0 && iter.fs_strategy < H5F_FILE_SPACE_NTYPES);
+
+        /* get information for free-space sections */
+        if(freespace_stats(fid, &iter) < 0)
+            warn_msg("Unable to retrieve freespace info\n");
+
         /* Walk the objects or all file */
         if(display_object) {
             unsigned u;
diff --git a/tools/h5stat/h5stat_gentest.c b/tools/h5stat/h5stat_gentest.c
index 80cc9e0..02bd136 100644
--- a/tools/h5stat/h5stat_gentest.c
+++ b/tools/h5stat/h5stat_gentest.c
@@ -32,6 +32,11 @@
 #define NUM_GRPS 	35000
 #define NUM_ATTRS	100
 
+/* Declarations for gen_idx_file() */
+#define IDX_FILE 	"h5stat_idx.h5"
+#define DSET		"dset"
+#define DSET_FILTER	"dset_filter"
+
 /* For gen_threshold_file() */
 #define THRESHOLD_FILE 		"h5stat_threshold.h5"
 #define THRES_ATTR_NAME		"attr"
@@ -43,18 +48,18 @@
 /*
  * Generate HDF5 file with latest format with
  * NUM_GRPS groups and NUM_ATTRS attributes for the dataset
- *
  */
 static void 
 gen_newgrat_file(const char *fname)
 {
-    hid_t fapl; 	/* File access property */
-    hid_t fid;		/* File id */
-    hid_t gid;		/* Group id */
-    hid_t tid;		/* Datatype id */
-    hid_t sid; 		/* Dataspace id */
-    hid_t attr_id; 	/* Attribute id */
-    hid_t did;		/* Dataset id */
+    hid_t fcpl          = -1;   /* File creation property */
+    hid_t fapl          = -1;   /* File access property */
+    hid_t fid           = -1;   /* File id */
+    hid_t gid           = -1;   /* Group id */
+    hid_t tid           = -1;   /* Datatype id */
+    hid_t sid           = -1;   /* Dataspace id */
+    hid_t attr_id       = -1;   /* Attribute id */
+    hid_t did           = -1;   /* Dataset id */
     char name[30];	/* Group name */
     char attrname[30];	/* Attribute name */
     int  i;		/* Local index variable */
@@ -67,8 +72,16 @@ gen_newgrat_file(const char *fname)
     if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
 	goto error;
 
-     /* Create dataset */
-    if((fid = H5Fcreate(NEWGRAT_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+    /* Get a copy of file creation property list */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+	goto error;
+
+    /* Set file space handling strategy */
+    if(H5Pset_file_space(fcpl, H5F_FILE_SPACE_ALL_PERSIST, (hsize_t)0) < 0)
+	goto error;
+
+     /* Create file */
+    if((fid = H5Fcreate(fname, H5F_ACC_TRUNC, fcpl, fapl)) < 0)
 	goto error;
 
     /* Create NUM_GRPS groups in the root group */
@@ -102,27 +115,33 @@ gen_newgrat_file(const char *fname)
     } /* end for */
 
     /* Close dataset, dataspace, datatype, file */
-    if(H5Dclose(did) < 0)
+    if(H5Pclose(fapl) < 0)
 	goto error;
-    if(H5Sclose(sid) < 0)
+    if(H5Pclose(fcpl) < 0)
+	goto error;
+    if(H5Dclose(did) < 0)
 	goto error;
     if(H5Tclose(tid) < 0)
 	goto error;
+    if(H5Sclose(sid) < 0)
+	goto error;
     if(H5Fclose(fid) < 0)
 	goto error;
 
 error:
     H5E_BEGIN_TRY {
+	H5Pclose(fapl);
+	H5Pclose(fcpl);
 	H5Aclose(attr_id);
-        H5Dclose(did);
         H5Tclose(tid);
         H5Sclose(sid);
         H5Gclose(gid);
+        H5Dclose(did);
         H5Fclose(fid);
     } H5E_END_TRY;
-
 } /* gen_newgrat_file() */
 
+
 /*
  * Generate an HDF5 file with groups, datasets, attributes for testing the options:
  *	-l N (--links=N): Set the threshold for # of links when printing information for small groups.
@@ -322,11 +341,110 @@ error:
 
 } /* gen_threshold_file() */
 
+/*
+ * Function: gen_idx_file
+ *
+ * Purpose: Create a file with datasets that use Fixed Array indexing:
+ *   	one dataset: fixed dimension, chunked layout, w/o filters
+ *     	one dataset: fixed dimension, chunked layout, w/ filters
+ *
+ */
+static void 
+gen_idx_file(const char *fname)
+{
+    hid_t	fapl = -1;		    /* file access property id */
+    hid_t	fid = -1;	            /* file id */
+    hid_t   	sid = -1;	            /* space id */
+    hid_t	dcpl = -1;	    	    /* dataset creation property id */
+    hid_t	did = -1, did2 = -1;	    /* dataset id */
+    hsize_t 	dims[1] = {10};     /* dataset dimension */
+    hsize_t 	c_dims[1] = {2};    /* chunk dimension */
+    int		i;		    /* local index variable */
+    int     	buf[10];            /* data buffer */
+
+    /* Get a copy of the file access property */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+	goto error;
+
+    /* Set the "use the latest format" bounds for creating objects in the file */
+    if(H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+	goto error;
+
+    /* Create file */
+    if((fid = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+	goto error;
+
+    /* Create data */
+    for(i = 0; i < 10; i++)
+	buf[i] = i;
+
+    /* Set chunk */
+    if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+	goto error;
+
+    if(H5Pset_chunk(dcpl, 1, c_dims) < 0)
+	goto error;
+
+    /* Create a 1D dataset */
+    if((sid = H5Screate_simple(1, dims, NULL)) < 0)
+	goto error;
+    if((did  = H5Dcreate2(fid, DSET, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	goto error;
+    
+    /* Write to the dataset */
+    if(H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+	goto error;
+
+#if defined (H5_HAVE_FILTER_DEFLATE)
+    /* set deflate data */
+    if(H5Pset_deflate(dcpl, 9) < 0)
+	goto error;
+
+    /* Create and write the dataset */
+    if((did2  = H5Dcreate2(fid, DSET_FILTER, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+	goto error;
+    if(H5Dwrite(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0)
+	goto error;
+
+    /* Close the dataset */
+    if(H5Dclose(did2) < 0)
+	goto error;
+#endif
+
+    /* closing: dataspace, dataset, file */
+    if(H5Pclose(fapl) < 0)
+	goto error;
+    if(H5Pclose(dcpl) < 0)
+	goto error;
+    if(H5Sclose(sid) < 0)
+	goto error;
+    if(H5Dclose(did) < 0)
+	goto error;
+    if(H5Fclose(fid) < 0)
+	goto error;
+
+error:
+    H5E_BEGIN_TRY {
+        H5Pclose(fapl);
+        H5Pclose(dcpl);
+        H5Sclose(sid);
+        H5Dclose(did);
+        H5Fclose(fid);
+#if defined (H5_HAVE_FILTER_DEFLATE)
+        H5Dclose(did2);
+#endif
+    } H5E_END_TRY;
+
+} /* gen_idx_file() */
+
 int main(void)
 {
     gen_newgrat_file(NEWGRAT_FILE);
     gen_threshold_file(THRESHOLD_FILE);
 
+    /* Generate an HDF file to test for datasets with Fixed Array indexing */
+    gen_idx_file(IDX_FILE);
+
     return 0;
 }
 
diff --git a/tools/h5stat/testfiles/h5stat_dims1.ddl b/tools/h5stat/testfiles/h5stat_dims1.ddl
index c285ea4..07b2900 100644
--- a/tools/h5stat/testfiles/h5stat_dims1.ddl
+++ b/tools/h5stat/testfiles/h5stat_dims1.ddl
@@ -31,6 +31,7 @@ Dataset layout information:
 	Dataset layout counts[COMPACT]: 0
 	Dataset layout counts[CONTIG]: 23
 	Dataset layout counts[CHUNKED]: 0
+	Dataset layout counts[VIRTUAL]: 0
 	Number of external files : 0
 Dataset filters information:
 	Number of datasets with:
diff --git a/tools/h5stat/testfiles/h5stat_dims2.ddl b/tools/h5stat/testfiles/h5stat_dims2.ddl
index 769749e..dbccd05 100644
--- a/tools/h5stat/testfiles/h5stat_dims2.ddl
+++ b/tools/h5stat/testfiles/h5stat_dims2.ddl
@@ -22,6 +22,7 @@ Dataset layout information:
 	Dataset layout counts[COMPACT]: 0
 	Dataset layout counts[CONTIG]: 23
 	Dataset layout counts[CHUNKED]: 0
+	Dataset layout counts[VIRTUAL]: 0
 	Number of external files : 0
 Dataset filters information:
 	Number of datasets with:
diff --git a/tools/h5stat/testfiles/h5stat_filters-F.ddl b/tools/h5stat/testfiles/h5stat_filters-F.ddl
index 5555460..d44445b 100644
--- a/tools/h5stat/testfiles/h5stat_filters-F.ddl
+++ b/tools/h5stat/testfiles/h5stat_filters-F.ddl
@@ -1,5 +1,6 @@
 Filename: h5stat_filters.h5
 File space information for file metadata (in bytes):
+	Superblock: 96
 	Superblock extension: 0
 	User block: 0
 	Object headers: (total/unused)
@@ -20,3 +21,6 @@ File space information for file metadata (in bytes):
 		Header: 0
 		B-tree/List: 0
 		Heap: 0
+	Free-space managers:
+		Header: 0
+		Amount of free space: 0
diff --git a/tools/h5stat/testfiles/h5stat_filters-d.ddl b/tools/h5stat/testfiles/h5stat_filters-d.ddl
index 2e0bd64..6e6dd61 100644
--- a/tools/h5stat/testfiles/h5stat_filters-d.ddl
+++ b/tools/h5stat/testfiles/h5stat_filters-d.ddl
@@ -18,6 +18,7 @@ Dataset layout information:
 	Dataset layout counts[COMPACT]: 1
 	Dataset layout counts[CONTIG]: 2
 	Dataset layout counts[CHUNKED]: 12
+	Dataset layout counts[VIRTUAL]: 0
 	Number of external files : 2
 Dataset filters information:
 	Number of datasets with:
diff --git a/tools/h5stat/testfiles/h5stat_filters-dT.ddl b/tools/h5stat/testfiles/h5stat_filters-dT.ddl
index 9ef3e82..b14ca9f 100644
--- a/tools/h5stat/testfiles/h5stat_filters-dT.ddl
+++ b/tools/h5stat/testfiles/h5stat_filters-dT.ddl
@@ -18,6 +18,7 @@ Dataset layout information:
 	Dataset layout counts[COMPACT]: 1
 	Dataset layout counts[CONTIG]: 2
 	Dataset layout counts[CHUNKED]: 12
+	Dataset layout counts[VIRTUAL]: 0
 	Number of external files : 2
 Dataset filters information:
 	Number of datasets with:
diff --git a/tools/h5stat/testfiles/h5stat_filters.ddl b/tools/h5stat/testfiles/h5stat_filters.ddl
index 0317767..1a4fd72 100644
--- a/tools/h5stat/testfiles/h5stat_filters.ddl
+++ b/tools/h5stat/testfiles/h5stat_filters.ddl
@@ -8,6 +8,7 @@ File information
 	Max. # of links to object: 1
 	Max. # of objects in group: 16
 File space information for file metadata (in bytes):
+	Superblock: 96
 	Superblock extension: 0
 	User block: 0
 	Object headers: (total/unused)
@@ -28,6 +29,9 @@ File space information for file metadata (in bytes):
 		Header: 0
 		B-tree/List: 0
 		Heap: 0
+	Free-space managers:
+		Header: 0
+		Amount of free space: 0
 Small groups (with 0 to 9 links):
 	Total # of small groups: 0
 Group bins:
@@ -52,6 +56,7 @@ Dataset layout information:
 	Dataset layout counts[COMPACT]: 1
 	Dataset layout counts[CONTIG]: 2
 	Dataset layout counts[CHUNKED]: 12
+	Dataset layout counts[VIRTUAL]: 0
 	Number of external files : 2
 Dataset filters information:
 	Number of datasets with:
@@ -77,9 +82,16 @@ Small # of attributes (objects with 1 to 10 attributes):
 Attribute bins:
 	Total # of objects with attributes: 0
 	Max. # of attributes to objects: 0
+Free-space section threshold: 1 bytes
+Small size free-space sections (< 10 bytes):
+	Total # of small size sections: 0
+Free-space section bins:
+	Total # of sections: 0
+File space management strategy: H5F_FILE_SPACE_ALL
 Summary of file space information:
-  File metadata: 37216 bytes
+  File metadata: 37312 bytes
   Raw data: 8659 bytes
-  Unaccounted space: 397 bytes
+  Amount/Percent of tracked free space: 0 bytes/0.0%
+  Unaccounted space: 301 bytes
 Total space: 46272 bytes
 External raw data: 400 bytes
diff --git a/tools/h5stat/testfiles/h5stat_filters.h5 b/tools/h5stat/testfiles/h5stat_filters.h5
index 5b5f4bb..cbd4467 100644
Binary files a/tools/h5stat/testfiles/h5stat_filters.h5 and b/tools/h5stat/testfiles/h5stat_filters.h5 differ
diff --git a/tools/h5stat/testfiles/h5stat_help1.ddl b/tools/h5stat/testfiles/h5stat_help1.ddl
index 4c61425..d2a8715 100644
--- a/tools/h5stat/testfiles/h5stat_help1.ddl
+++ b/tools/h5stat/testfiles/h5stat_help1.ddl
@@ -20,4 +20,5 @@ Usage: h5stat [OPTIONS] file
      -a N, --numattrs=N    Set the threshold for the # of attributes when printing
                            information for small # of attributes.  N is an integer greater
                            than 0.  The default threshold is 10.
+     -s, --freespace       Print free space information
      -S, --summary         Print summary of file space information
diff --git a/tools/h5stat/testfiles/h5stat_help2.ddl b/tools/h5stat/testfiles/h5stat_help2.ddl
index 4c61425..d2a8715 100644
--- a/tools/h5stat/testfiles/h5stat_help2.ddl
+++ b/tools/h5stat/testfiles/h5stat_help2.ddl
@@ -20,4 +20,5 @@ Usage: h5stat [OPTIONS] file
      -a N, --numattrs=N    Set the threshold for the # of attributes when printing
                            information for small # of attributes.  N is an integer greater
                            than 0.  The default threshold is 10.
+     -s, --freespace       Print free space information
      -S, --summary         Print summary of file space information
diff --git a/tools/h5stat/testfiles/h5stat_idx.ddl b/tools/h5stat/testfiles/h5stat_idx.ddl
new file mode 100644
index 0000000..b26f1a4
--- /dev/null
+++ b/tools/h5stat/testfiles/h5stat_idx.ddl
@@ -0,0 +1,93 @@
+Filename: h5stat_idx.h5
+File information
+	# of unique groups: 1
+	# of unique datasets: 2
+	# of unique named datatypes: 0
+	# of unique links: 0
+	# of unique other: 0
+	Max. # of links to object: 1
+	Max. # of objects in group: 2
+File space information for file metadata (in bytes):
+	Superblock: 48
+	Superblock extension: 0
+	User block: 0
+	Object headers: (total/unused)
+		Groups: 147/47
+		Datasets(exclude compact data): 568/362
+		Datatypes: 0/0
+	Groups:
+		B-tree/List: 0
+		Heap: 0
+	Attributes:
+		B-tree/List: 0
+		Heap: 0
+	Chunked datasets:
+		Index: 202
+	Datasets:
+		Heap: 0
+	Shared Messages:
+		Header: 0
+		B-tree/List: 0
+		Heap: 0
+	Free-space managers:
+		Header: 0
+		Amount of free space: 0
+Small groups (with 0 to 9 links):
+	# of groups with 2 link(s): 1
+	Total # of small groups: 1
+Group bins:
+	# of groups with 1 - 9 links: 1
+	Total # of groups: 1
+Dataset dimension information:
+	Max. rank of datasets: 1
+	Dataset ranks:
+		# of dataset with rank 1: 2
+1-D Dataset information:
+	Max. dimension size of 1-D datasets: 10
+	Small 1-D datasets (with dimension sizes 0 to 9):
+		Total # of small datasets: 0
+	1-D Dataset dimension bins:
+		# of datasets with dimension size 10 - 99: 2
+		Total # of datasets: 2
+Dataset storage information:
+	Total raw data size: 110
+	Total external raw data size: 0
+Dataset layout information:
+	Dataset layout counts[COMPACT]: 0
+	Dataset layout counts[CONTIG]: 0
+	Dataset layout counts[CHUNKED]: 2
+	Dataset layout counts[VIRTUAL]: 0
+	Number of external files : 0
+Dataset filters information:
+	Number of datasets with:
+		NO filter: 1
+		GZIP filter: 1
+		SHUFFLE filter: 0
+		FLETCHER32 filter: 0
+		SZIP filter: 0
+		NBIT filter: 0
+		SCALEOFFSET filter: 0
+		USER-DEFINED filter: 0
+Dataset datatype information:
+	# of unique datatypes used by datasets: 1
+	Dataset datatype #0:
+		Count (total/named) = (2/0)
+		Size (desc./elmt) = (14/4)
+	Total dataset datatype count: 2
+Small # of attributes (objects with 1 to 10 attributes):
+	Total # of objects with small # of attributes: 0
+Attribute bins:
+	Total # of objects with attributes: 0
+	Max. # of attributes to objects: 0
+Free-space section threshold: 1 bytes
+Small size free-space sections (< 10 bytes):
+	Total # of small size sections: 0
+Free-space section bins:
+	Total # of sections: 0
+File space management strategy: H5F_FILE_SPACE_ALL
+Summary of file space information:
+  File metadata: 965 bytes
+  Raw data: 110 bytes
+  Amount/Percent of tracked free space: 0 bytes/0.0%
+  Unaccounted space: 1131 bytes
+Total space: 2206 bytes
diff --git a/tools/h5stat/testfiles/h5stat_idx.h5 b/tools/h5stat/testfiles/h5stat_idx.h5
new file mode 100644
index 0000000..303d1f8
Binary files /dev/null and b/tools/h5stat/testfiles/h5stat_idx.h5 differ
diff --git a/tools/h5stat/testfiles/h5stat_links2.ddl b/tools/h5stat/testfiles/h5stat_links2.ddl
index de84bce..4622884 100644
--- a/tools/h5stat/testfiles/h5stat_links2.ddl
+++ b/tools/h5stat/testfiles/h5stat_links2.ddl
@@ -8,6 +8,7 @@ File information
 	Max. # of links to object: 1
 	Max. # of objects in group: 10
 File space information for file metadata (in bytes):
+	Superblock: 96
 	Superblock extension: 0
 	User block: 0
 	Object headers: (total/unused)
@@ -28,6 +29,9 @@ File space information for file metadata (in bytes):
 		Header: 0
 		B-tree/List: 0
 		Heap: 0
+	Free-space managers:
+		Header: 0
+		Amount of free space: 0
 Small groups (with 0 to 7 links):
 	# of groups with 0 link(s): 1
 	# of groups with 7 link(s): 1
@@ -60,6 +64,7 @@ Dataset layout information:
 	Dataset layout counts[COMPACT]: 0
 	Dataset layout counts[CONTIG]: 23
 	Dataset layout counts[CHUNKED]: 0
+	Dataset layout counts[VIRTUAL]: 0
 	Number of external files : 0
 Dataset filters information:
 	Number of datasets with:
@@ -86,8 +91,15 @@ Attribute bins:
 	# of objects with 10 - 99 attributes: 3
 	Total # of objects with attributes: 5
 	Max. # of attributes to objects: 25
+Free-space section threshold: 1 bytes
+Small size free-space sections (< 10 bytes):
+	Total # of small size sections: 0
+Free-space section bins:
+	Total # of sections: 0
+File space management strategy: H5F_FILE_SPACE_ALL
 Summary of file space information:
-  File metadata: 16032 bytes
+  File metadata: 16128 bytes
   Raw data: 0 bytes
-  Unaccounted space: 280 bytes
+  Amount/Percent of tracked free space: 0 bytes/0.0%
+  Unaccounted space: 184 bytes
 Total space: 16312 bytes
diff --git a/tools/h5stat/testfiles/h5stat_newgrat.ddl b/tools/h5stat/testfiles/h5stat_newgrat.ddl
index 9b17e17..e305f58 100644
--- a/tools/h5stat/testfiles/h5stat_newgrat.ddl
+++ b/tools/h5stat/testfiles/h5stat_newgrat.ddl
@@ -8,7 +8,8 @@ File information
 	Max. # of links to object: 1
 	Max. # of objects in group: 35001
 File space information for file metadata (in bytes):
-	Superblock extension: 0
+	Superblock: 48
+	Superblock extension: 119
 	User block: 0
 	Object headers: (total/unused)
 		Groups: 5145147/3220092
@@ -28,6 +29,9 @@ File space information for file metadata (in bytes):
 		Header: 0
 		B-tree/List: 0
 		Heap: 0
+	Free-space managers:
+		Header: 180
+		Amount of free space: 132
 Small groups (with 0 to 9 links):
 	# of groups with 0 link(s): 35000
 	Total # of small groups: 35000
@@ -50,6 +54,7 @@ Dataset layout information:
 	Dataset layout counts[COMPACT]: 0
 	Dataset layout counts[CONTIG]: 1
 	Dataset layout counts[CHUNKED]: 0
+	Dataset layout counts[VIRTUAL]: 0
 	Number of external files : 0
 Dataset filters information:
 	Number of datasets with:
@@ -73,8 +78,18 @@ Attribute bins:
 	# of objects with 100 - 999 attributes: 1
 	Total # of objects with attributes: 1
 	Max. # of attributes to objects: 100
+Free-space section threshold: 1 bytes
+Small size free-space sections (< 10 bytes):
+	# of sections of size 1: 1
+	Total # of small size sections: 1
+Free-space section bins:
+	# of sections of size 1 - 9: 1
+	# of sections of size 10 - 99: 4
+	Total # of sections: 5
+File space management strategy: H5F_FILE_SPACE_ALL_PERSIST
 Summary of file space information:
-  File metadata: 6361689 bytes
+  File metadata: 6362036 bytes
   Raw data: 0 bytes
-  Unaccounted space: 6202 bytes
-Total space: 6367891 bytes
+  Amount/Percent of tracked free space: 132 bytes/0.0%
+  Unaccounted space: 0 bytes
+Total space: 6362168 bytes
diff --git a/tools/h5stat/testfiles/h5stat_newgrat.h5 b/tools/h5stat/testfiles/h5stat_newgrat.h5
index fc8433d..c919b71 100644
Binary files a/tools/h5stat/testfiles/h5stat_newgrat.h5 and b/tools/h5stat/testfiles/h5stat_newgrat.h5 differ
diff --git a/tools/h5stat/testfiles/h5stat_nofile.ddl b/tools/h5stat/testfiles/h5stat_nofile.ddl
index 22cff9b..d8a8b2c 100644
--- a/tools/h5stat/testfiles/h5stat_nofile.ddl
+++ b/tools/h5stat/testfiles/h5stat_nofile.ddl
@@ -20,5 +20,6 @@ Usage: h5stat [OPTIONS] file
      -a N, --numattrs=N    Set the threshold for the # of attributes when printing
                            information for small # of attributes.  N is an integer greater
                            than 0.  The default threshold is 10.
+     -s, --freespace       Print free space information
      -S, --summary         Print summary of file space information
 h5stat error: missing file name
diff --git a/tools/h5stat/testfiles/h5stat_numattrs1.ddl b/tools/h5stat/testfiles/h5stat_numattrs1.ddl
index 9954c7c..fb5568d 100644
--- a/tools/h5stat/testfiles/h5stat_numattrs1.ddl
+++ b/tools/h5stat/testfiles/h5stat_numattrs1.ddl
@@ -8,8 +8,10 @@ Attribute bins:
 	# of objects with 10 - 99 attributes: 3
 	Total # of objects with attributes: 5
 	Max. # of attributes to objects: 25
+File space management strategy: H5F_FILE_SPACE_ALL
 Summary of file space information:
-  File metadata: 16032 bytes
+  File metadata: 16128 bytes
   Raw data: 0 bytes
-  Unaccounted space: 280 bytes
+  Amount/Percent of tracked free space: 0 bytes/0.0%
+  Unaccounted space: 184 bytes
 Total space: 16312 bytes
diff --git a/tools/h5stat/testfiles/h5stat_numattrs2.ddl b/tools/h5stat/testfiles/h5stat_numattrs2.ddl
index d518f0e..ccb23c1 100644
--- a/tools/h5stat/testfiles/h5stat_numattrs2.ddl
+++ b/tools/h5stat/testfiles/h5stat_numattrs2.ddl
@@ -8,6 +8,7 @@ File information
 	Max. # of links to object: 1
 	Max. # of objects in group: 10
 File space information for file metadata (in bytes):
+	Superblock: 96
 	Superblock extension: 0
 	User block: 0
 	Object headers: (total/unused)
@@ -28,6 +29,9 @@ File space information for file metadata (in bytes):
 		Header: 0
 		B-tree/List: 0
 		Heap: 0
+	Free-space managers:
+		Header: 0
+		Amount of free space: 0
 Small groups (with 0 to 9 links):
 	# of groups with 0 link(s): 1
 	# of groups with 7 link(s): 1
@@ -61,6 +65,7 @@ Dataset layout information:
 	Dataset layout counts[COMPACT]: 0
 	Dataset layout counts[CONTIG]: 23
 	Dataset layout counts[CHUNKED]: 0
+	Dataset layout counts[VIRTUAL]: 0
 	Number of external files : 0
 Dataset filters information:
 	Number of datasets with:
@@ -86,8 +91,15 @@ Attribute bins:
 	# of objects with 10 - 99 attributes: 3
 	Total # of objects with attributes: 5
 	Max. # of attributes to objects: 25
+Free-space section threshold: 1 bytes
+Small size free-space sections (< 10 bytes):
+	Total # of small size sections: 0
+Free-space section bins:
+	Total # of sections: 0
+File space management strategy: H5F_FILE_SPACE_ALL
 Summary of file space information:
-  File metadata: 16032 bytes
+  File metadata: 16128 bytes
   Raw data: 0 bytes
-  Unaccounted space: 280 bytes
+  Amount/Percent of tracked free space: 0 bytes/0.0%
+  Unaccounted space: 184 bytes
 Total space: 16312 bytes
diff --git a/tools/h5stat/testfiles/h5stat_threshold.h5 b/tools/h5stat/testfiles/h5stat_threshold.h5
index ae9fff6..9f7c8c8 100644
Binary files a/tools/h5stat/testfiles/h5stat_threshold.h5 and b/tools/h5stat/testfiles/h5stat_threshold.h5 differ
diff --git a/tools/h5stat/testfiles/h5stat_tsohm.ddl b/tools/h5stat/testfiles/h5stat_tsohm.ddl
index 84e3e42..4cf33fc 100644
--- a/tools/h5stat/testfiles/h5stat_tsohm.ddl
+++ b/tools/h5stat/testfiles/h5stat_tsohm.ddl
@@ -8,6 +8,7 @@ File information
 	Max. # of links to object: 1
 	Max. # of objects in group: 3
 File space information for file metadata (in bytes):
+	Superblock: 48
 	Superblock extension: 40
 	User block: 0
 	Object headers: (total/unused)
@@ -28,6 +29,9 @@ File space information for file metadata (in bytes):
 		Header: 38
 		B-tree/List: 550
 		Heap: 1279
+	Free-space managers:
+		Header: 0
+		Amount of free space: 0
 Small groups (with 0 to 9 links):
 	# of groups with 3 link(s): 1
 	Total # of small groups: 1
@@ -49,6 +53,7 @@ Dataset layout information:
 	Dataset layout counts[COMPACT]: 0
 	Dataset layout counts[CONTIG]: 0
 	Dataset layout counts[CHUNKED]: 3
+	Dataset layout counts[VIRTUAL]: 0
 	Number of external files : 0
 Dataset filters information:
 	Number of datasets with:
@@ -71,8 +76,15 @@ Small # of attributes (objects with 1 to 10 attributes):
 Attribute bins:
 	Total # of objects with attributes: 0
 	Max. # of attributes to objects: 0
+Free-space section threshold: 1 bytes
+Small size free-space sections (< 10 bytes):
+	Total # of small size sections: 0
+Free-space section bins:
+	Total # of sections: 0
+File space management strategy: H5F_FILE_SPACE_ALL
 Summary of file space information:
-  File metadata: 3802 bytes
+  File metadata: 3850 bytes
   Raw data: 0 bytes
-  Unaccounted space: 48 bytes
+  Amount/Percent of tracked free space: 0 bytes/0.0%
+  Unaccounted space: 0 bytes
 Total space: 3850 bytes
diff --git a/tools/h5stat/testh5stat.sh.in b/tools/h5stat/testh5stat.sh.in
index 4d698da..b48f327 100644
--- a/tools/h5stat/testh5stat.sh.in
+++ b/tools/h5stat/testh5stat.sh.in
@@ -74,6 +74,7 @@ LIST_HDF5_TEST_FILES="
 $SRC_H5STAT_TESTFILES/h5stat_filters.h5
 $SRC_H5STAT_TESTFILES/h5stat_tsohm.h5
 $SRC_H5STAT_TESTFILES/h5stat_newgrat.h5
+$SRC_H5STAT_TESTFILES/h5stat_idx.h5
 $SRC_H5STAT_TESTFILES/h5stat_threshold.h5
 "
 
@@ -94,6 +95,7 @@ $SRC_H5STAT_TESTFILES/h5stat_tsohm.ddl
 $SRC_H5STAT_TESTFILES/h5stat_newgrat.ddl
 $SRC_H5STAT_TESTFILES/h5stat_newgrat-UG.ddl
 $SRC_H5STAT_TESTFILES/h5stat_newgrat-UA.ddl
+$SRC_H5STAT_TESTFILES/h5stat_idx.ddl
 $SRC_H5STAT_TESTFILES/h5stat_err1_links.ddl
 $SRC_H5STAT_TESTFILES/h5stat_links1.ddl
 $SRC_H5STAT_TESTFILES/h5stat_links2.ddl
@@ -259,6 +261,8 @@ TOOLTEST h5stat_tsohm.ddl h5stat_tsohm.h5
 TOOLTEST h5stat_newgrat.ddl h5stat_newgrat.h5
 TOOLTEST h5stat_newgrat-UG.ddl -G h5stat_newgrat.h5
 TOOLTEST h5stat_newgrat-UA.ddl -A h5stat_newgrat.h5
+# h5stat_idx.h5 is generated by h5stat_gentest.c
+TOOLTEST h5stat_idx.ddl h5stat_idx.h5
 #
 # Tests for -l (--links) option on h5stat_threshold.h5: 
 # 	-l 0 (incorrect threshold value)
diff --git a/tools/lib/CMakeLists.txt b/tools/lib/CMakeLists.txt
index ce1ad34..38c84a2 100644
--- a/tools/lib/CMakeLists.txt
+++ b/tools/lib/CMakeLists.txt
@@ -41,8 +41,13 @@ add_library (${HDF5_TOOLS_LIB_TARGET} STATIC ${H5_TOOLS_LIB_SRCS} ${H5_TOOLS_LIB
 TARGET_C_PROPERTIES (${HDF5_TOOLS_LIB_TARGET} STATIC " " " ")
 target_link_libraries (${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
 set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_TOOLS_LIB_TARGET}")
-H5_SET_LIB_OPTIONS (${HDF5_TOOLS_LIB_TARGET} ${HDF5_TOOLS_LIB_NAME} STATIC)
-set_target_properties (${HDF5_TOOLS_LIB_TARGET} PROPERTIES
+H5_SET_LIB_OPTIONS (
+    ${HDF5_TOOLS_LIB_TARGET} ${HDF5_TOOLS_LIB_NAME}
+    STATIC
+    HDF5_TOOLS_LIB_NAME_RELEASE
+    HDF5_TOOLS_LIB_NAME_DEBUG
+)
+set_target_properties (${HDF5_TOOLS_LIB_TARGET} PROPERTIES 
     FOLDER libraries/tools
     INTERFACE_INCLUDE_DIRECTORIES "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>"
 )
@@ -54,8 +59,13 @@ if (BUILD_SHARED_LIBS)
   TARGET_C_PROPERTIES (${HDF5_TOOLS_LIBSH_TARGET} SHARED " " " ")
   target_link_libraries (${HDF5_TOOLS_LIBSH_TARGET} ${HDF5_LIBSH_TARGET})
   set_global_variable (HDF5_LIBRARIES_TO_EXPORT "${HDF5_LIBRARIES_TO_EXPORT};${HDF5_TOOLS_LIBSH_TARGET}")
-  H5_SET_LIB_OPTIONS (${HDF5_TOOLS_LIBSH_TARGET} ${HDF5_TOOLS_LIB_NAME} SHARED ${HDF5_TOOLS_PACKAGE_SOVERSION})
-  set_target_properties (${HDF5_TOOLS_LIBSH_TARGET} PROPERTIES
+  H5_SET_LIB_OPTIONS (
+      ${HDF5_TOOLS_LIBSH_TARGET} ${HDF5_TOOLS_LIB_NAME}
+      SHARED
+      HDF5_TOOLS_LIB_NAME_RELEASE
+      HDF5_TOOLS_LIB_NAME_DEBUG
+  )
+  set_target_properties (${HDF5_TOOLS_LIBSH_TARGET} PROPERTIES 
       FOLDER libraries/tools
       COMPILE_DEFINITIONS "H5_BUILT_AS_DYNAMIC_LIB"
       INTERFACE_INCLUDE_DIRECTORIES "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/include>"
diff --git a/tools/lib/Makefile.in b/tools/lib/Makefile.in
index 0b531b3..6d4c2fb 100644
--- a/tools/lib/Makefile.in
+++ b/tools/lib/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -32,7 +32,17 @@
 #
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -95,20 +105,21 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(top_srcdir)/bin/depcomp $(top_srcdir)/bin/test-driver
 check_PROGRAMS = $(am__EXEEXT_1)
 TESTS = $(am__EXEEXT_1)
 subdir = tools/lib
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 LTLIBRARIES = $(noinst_LTLIBRARIES)
@@ -135,7 +146,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -383,6 +394,9 @@ am__set_b = \
     *) \
       b='$*';; \
   esac
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/depcomp \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -401,7 +415,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -446,14 +459,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -463,13 +484,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -511,9 +531,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -701,7 +732,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/lib/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign tools/lib/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -710,7 +740,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -874,7 +904,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1146,6 +1176,8 @@ uninstall-am:
 	mostlyclean-local pdf pdf-am ps ps-am recheck tags tags-am \
 	uninstall uninstall-am
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/tools/lib/h5diff.c b/tools/lib/h5diff.c
index 2eb66f9..46dcf6f 100644
--- a/tools/lib/h5diff.c
+++ b/tools/lib/h5diff.c
@@ -311,6 +311,7 @@ static void build_match_list (const char *objname1, trav_info_t *info1, const ch
     trav_table_t *table;
     size_t  idx;
 
+    h5difftrace("build_match_list start\n");
     /* init */
     trav_table_init( &table );
 
@@ -415,6 +416,7 @@ static void build_match_list (const char *objname1, trav_info_t *info1, const ch
     free_exclude_path_list (options);
 
     *table_out = table;
+    h5difftrace("build_match_list finish\n");
 }
 
 
@@ -547,7 +549,7 @@ static herr_t trav_grp_symlinks(const char *path, const H5L_info_t *linfo,
 
 done:    
     if (lnk_info.trg_path)
-        HDfree((char *)lnk_info.trg_path);
+        HDfree(lnk_info.trg_path);
     return 0;
 }    
 
@@ -592,8 +594,8 @@ hsize_t h5diff(const char *fname1,
     trav_info_t  *info1_grp = NULL;
     trav_info_t  *info2_grp = NULL;
     /* local pointer */
-    trav_info_t  *info1_lp;
-    trav_info_t  *info2_lp;
+    trav_info_t  *info1_lp = NULL;
+    trav_info_t  *info2_lp = NULL;
     /* link info from specified object */
     H5L_info_t src_linfo1;
     H5L_info_t src_linfo2;
@@ -603,6 +605,7 @@ hsize_t h5diff(const char *fname1,
     /* list for common objects */
     trav_table_t *match_list = NULL;
 
+    h5difftrace("h5diff start\n");
     /* init filenames */
     HDmemset(filenames, 0, MAX_FILENAME * 2);
     /* init link info struct */
@@ -651,6 +654,7 @@ hsize_t h5diff(const char *fname1,
     trav_info_init(fname1, file1_id, &info1_obj);
     trav_info_init(fname2, file2_id, &info2_obj);
 
+    h5difftrace("trav_info_init initialized\n");
     /* if any object is specified */
     if (objname1)
     {
@@ -689,6 +693,7 @@ hsize_t h5diff(const char *fname1,
         /*----------------------------------------------------------
          * check if obj1 is root, group, single object or symlink
          */
+        h5difftrace("h5diff check if obj1 is root, group, single object or symlink\n");
         if(!HDstrcmp(obj1fullname, "/"))
         {
             obj1type = H5TRAV_TYPE_GROUP;
@@ -748,6 +753,7 @@ hsize_t h5diff(const char *fname1,
         /*----------------------------------------------------------
          * check if obj2 is root, group, single object or symlink
          */
+        h5difftrace("h5diff check if obj2 is root, group, single object or symlink\n");
         if(!HDstrcmp(obj2fullname, "/"))
         {
             obj2type = H5TRAV_TYPE_GROUP;
@@ -807,6 +813,7 @@ hsize_t h5diff(const char *fname1,
     /* if no object specified */
     else
     {
+        h5difftrace("h5diff no object specified\n");
         /* set root group */
         obj1fullname = (char*)HDstrdup("/");
         obj1type = H5TRAV_TYPE_GROUP;
@@ -831,9 +838,11 @@ hsize_t h5diff(const char *fname1,
         /*-------------------------------
          * check symbolic link (object1)
          */
+        h5difftrace("h5diff check symbolic link (object1)\n");
         /* dangling link */
         if (l_ret1 == 0)
         {
+            h5difftrace("h5diff ... dangling link\n");
             if (options->no_dangle_links)
             {
                 /* treat dangling link is error */
@@ -863,22 +872,26 @@ hsize_t h5diff(const char *fname1,
         else if(l_ret1 != 2) /* symbolic link */
         {
             obj1type = (h5trav_type_t)trg_linfo1.trg_type;
+            h5difftrace("h5diff ... ... trg_linfo1.trg_type == H5L_TYPE_HARD\n");
             if (info1_lp != NULL) {
                 size_t idx = info1_lp->nused - 1;
 
+                h5difftrace("h5diff ... ... ... info1_obj not null\n");
                 info1_lp->paths[idx].type = (h5trav_type_t)trg_linfo1.trg_type;
                 info1_lp->paths[idx].objno = trg_linfo1.objno;
                 info1_lp->paths[idx].fileno = trg_linfo1.fileno;
             }
+            h5difftrace("h5diff check symbolic link (object1) finished\n");
         }
 
         /*-------------------------------
          * check symbolic link (object2)
          */
-
+        h5difftrace("h5diff check symbolic link (object2)\n");
         /* dangling link */
         if (l_ret2 == 0)
         {
+            h5difftrace("h5diff ... dangling link\n");
             if (options->no_dangle_links)
             {
                 /* treat dangling link is error */
@@ -911,10 +924,12 @@ hsize_t h5diff(const char *fname1,
             if (info2_lp != NULL) {
                 size_t idx = info2_lp->nused - 1;
 
+                h5difftrace("h5diff ... ... ... info2_obj not null\n");
                 info2_lp->paths[idx].type = (h5trav_type_t)trg_linfo2.trg_type;
                 info2_lp->paths[idx].objno = trg_linfo2.objno;
                 info2_lp->paths[idx].fileno = trg_linfo2.fileno;
             }
+            h5difftrace("h5diff check symbolic link (object1) finished\n");
         }
     } /* end of if follow symlinks */
 
@@ -927,6 +942,7 @@ hsize_t h5diff(const char *fname1,
 
     if(!(options->m_verbose || options->m_report))
     {
+        h5difftrace("h5diff NOT (options->m_verbose || options->m_report)\n");
         /* if no danglink links */
         if ( l_ret1 > 0 && l_ret2 > 0 )
             if (h5tools_is_obj_same(file1_id, obj1fullname, file2_id, obj2fullname)!=0)
@@ -936,6 +952,7 @@ hsize_t h5diff(const char *fname1,
     both_objs_grp = (obj1type == H5TRAV_TYPE_GROUP && obj2type == H5TRAV_TYPE_GROUP);
     if (both_objs_grp)
     {
+        h5difftrace("h5diff both_objs_grp TRUE\n");
         /*
          * traverse group1
          */
@@ -1047,9 +1064,9 @@ out:
 
     /* free link info buffer */
     if (trg_linfo1.trg_path)
-        HDfree((char *)trg_linfo1.trg_path);
+        HDfree(trg_linfo1.trg_path);
     if (trg_linfo2.trg_path)
-        HDfree((char *)trg_linfo2.trg_path);
+        HDfree(trg_linfo2.trg_path);
 
     /* close */
     H5E_BEGIN_TRY
@@ -1057,6 +1074,7 @@ out:
         H5Fclose(file1_id);
         H5Fclose(file2_id);
     } H5E_END_TRY;
+    h5difftrace("h5diff finish\n");
 
     return nfound;
 }
@@ -1104,6 +1122,7 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
     size_t idx2 = 0;
 
 
+    h5difftrace("diff_match start\n");
     /* 
      * if not root, prepare object name to be pre-appended to group path to
      * make full path
@@ -1210,6 +1229,7 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
             {
                 int workerFound = 0;
 
+                h5difftrace("Beginning of big else block\n");
                 /* We're in parallel mode */
                 /* Since the data type of diff value is hsize_t which can
                 * be arbitary large such that there is no MPI type that
@@ -1380,6 +1400,7 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
                 HDfree(obj2_fullpath);
         } /* end if */
     } /* end for */
+    h5difftrace("done with for loop\n");
 
 #ifdef H5_HAVE_PARALLEL
     if(g_Parallel)
@@ -1466,6 +1487,7 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
         /* Print any final data waiting in our queue */
         print_incoming_data();
     } /* end if */
+    h5difftrace("done with if block\n");
 
     HDfree(workerTasks);
     }
@@ -1474,6 +1496,7 @@ hsize_t diff_match(hid_t file1_id, const char *grp1, trav_info_t *info1,
     /* free table */
     if (table)
         trav_table_free(table);
+    h5difftrace("diff_match finish\n");
 
     return nfound;
 }
@@ -1529,6 +1552,8 @@ hsize_t diff(hid_t file1_id,
     h5tool_link_info_t linkinfo1;
     h5tool_link_info_t linkinfo2;
 
+    h5difftrace("diff start\n");
+
     /*init link info struct */
     HDmemset(&linkinfo1,0,sizeof(h5tool_link_info_t));
     HDmemset(&linkinfo2,0,sizeof(h5tool_link_info_t));
@@ -1628,6 +1653,7 @@ hsize_t diff(hid_t file1_id,
      */
      if (argdata->is_same_trgobj)
      {
+        h5difftrace("argdata->is_same_trgobj\n");
         is_hard_link = (object_type == H5TRAV_TYPE_DATASET ||
                         object_type == H5TRAV_TYPE_NAMED_DATATYPE ||
                         object_type == H5TRAV_TYPE_GROUP);
@@ -1879,9 +1905,9 @@ hsize_t diff(hid_t file1_id,
 
     /* free link info buffer */
     if (linkinfo1.trg_path)
-        HDfree((char *)linkinfo1.trg_path);
+        HDfree(linkinfo1.trg_path);
     if (linkinfo2.trg_path)
-        HDfree((char *)linkinfo2.trg_path);
+        HDfree(linkinfo2.trg_path);
 
     return nfound;
 
@@ -1922,9 +1948,9 @@ out2:
 
     /* free link info buffer */
     if (linkinfo1.trg_path)
-        HDfree((char *)linkinfo1.trg_path);
+        HDfree(linkinfo1.trg_path);
     if (linkinfo2.trg_path)
-        HDfree((char *)linkinfo2.trg_path);
+        HDfree(linkinfo2.trg_path);
 
     /* close */
     /* disable error reporting */
@@ -1935,6 +1961,7 @@ out2:
         H5Tclose(grp2_id);
         /* enable error reporting */
     } H5E_END_TRY;
+    h5difftrace("diff finish\n");
 
     return nfound;
 }
diff --git a/tools/lib/h5diff_array.c b/tools/lib/h5diff_array.c
index 1ee9054..d592528 100644
--- a/tools/lib/h5diff_array.c
+++ b/tools/lib/h5diff_array.c
@@ -102,29 +102,29 @@
 
 static hbool_t not_comparable;
 
-#define PER(A,B) {                                   \
-    per = -1;                                        \
-    not_comparable = FALSE;                          \
-    both_zero = FALSE;                               \
-    if(0 == (A) && 0 == (B))                         \
-        both_zero = TRUE;                            \
-    if(0 != (A))                                     \
-        per = (double)ABS((double)((B) - (A)) / (double)(A)); \
-    else                                             \
-        not_comparable = TRUE;                       \
+#define PER(A,B) {                                                      \
+    per = -1;                                                           \
+    not_comparable = FALSE;                                             \
+    both_zero = FALSE;                                                  \
+    if(H5_DBL_ABS_EQUAL(0,A) && H5_DBL_ABS_EQUAL(0,B))                  \
+        both_zero = TRUE;                                               \
+    if(!H5_DBL_ABS_EQUAL(0,A))                                          \
+        per = (double)ABS((double)((B) - (A)) / (double)(A));           \
+    else                                                                \
+        not_comparable = TRUE;                                          \
 }
 
 
-#define PER_UNSIGN(TYPE,A,B) {                       \
-    per = -1;                                        \
-    not_comparable = FALSE;                          \
-    both_zero = FALSE;                               \
-    if((A) == 0 && (B) == 0)                         \
-        both_zero = TRUE;                            \
-    if((A) != 0)                                     \
-        per = ABS((double)((TYPE)((B) - (A))) / (double)(A)) ; \
-    else                                             \
-        not_comparable = TRUE;                       \
+#define PER_UNSIGN(TYPE,A,B) {                                          \
+    per = -1;                                                           \
+    not_comparable = FALSE;                                             \
+    both_zero = FALSE;                                                  \
+    if(H5_DBL_ABS_EQUAL(0,A) && H5_DBL_ABS_EQUAL(0,B))                  \
+        both_zero = TRUE;                                               \
+    if(!H5_DBL_ABS_EQUAL(0,A))                                          \
+        per = ABS((double)((TYPE)((B) - (A))) / (double)(A)) ;          \
+    else                                                                \
+        not_comparable = TRUE;                                          \
 }
 
 
@@ -403,6 +403,7 @@ hsize_t diff_array( void *_mem1,
     mcomp_t       members;
     H5T_class_t   type_class;
 
+    h5difftrace("diff_array start\n");
     /* get the size. */
     size = H5Tget_size( m_type );
     type_class = H5Tget_class(m_type);
@@ -520,6 +521,7 @@ hsize_t diff_array( void *_mem1,
         } /* i */
         close_member_types(&members);
     } /* switch */
+    h5difftrace("diff_array finish\n");
 
     return nfound;
 }
@@ -599,6 +601,7 @@ static hsize_t diff_datum(void       *_mem1,
     double        per;
     hbool_t       both_zero;
 
+    h5difftrace("diff_datum start\n");
     type_size = H5Tget_size( m_type );
     type_class = H5Tget_class(m_type);
 
@@ -936,9 +939,9 @@ static hsize_t diff_datum(void       *_mem1,
                 hid_t  region1_id;
                 hid_t  region2_id;
 
-                if ((obj1_id = H5Rdereference(container1_id, H5R_DATASET_REGION, _mem1))<0)
+                if ((obj1_id = H5Rdereference2(container1_id, H5P_DEFAULT, H5R_DATASET_REGION, _mem1))<0)
                     ret= -1;
-                if ((obj2_id = H5Rdereference(container2_id, H5R_DATASET_REGION, _mem2))<0)
+                if ((obj2_id = H5Rdereference2(container2_id, H5P_DEFAULT, H5R_DATASET_REGION, _mem2))<0)
                     ret= -1;
                 if ((region1_id = H5Rget_region(container1_id, H5R_DATASET_REGION, _mem1))<0)
                     ret= -1;
@@ -987,9 +990,9 @@ static hsize_t diff_datum(void       *_mem1,
                     return 0;
                 }
 
-                if((obj1_id = H5Rdereference(container1_id, H5R_OBJECT, _mem1)) < 0)
+                if((obj1_id = H5Rdereference2(container1_id, H5P_DEFAULT, H5R_OBJECT, _mem1)) < 0)
                     ret = -1;
-                if((obj2_id = H5Rdereference(container2_id, H5R_OBJECT, _mem2)) < 0)
+                if((obj2_id = H5Rdereference2(container2_id, H5P_DEFAULT, H5R_OBJECT, _mem2)) < 0)
                     ret = -1;
                 if(ret == -1) {
                     options->err_stat = 1;
@@ -2713,6 +2716,7 @@ static hsize_t diff_datum(void       *_mem1,
     break; /* H5T_FLOAT class */
 
  } /* switch */
+    h5difftrace("diff_datum finish\n");
 
  return nfound;
 }
@@ -2999,6 +3003,7 @@ hsize_t character_compare(char *mem1,
 
     HDmemcpy(&temp1_uchar, mem1, sizeof(unsigned char));
     HDmemcpy(&temp2_uchar, mem2, sizeof(unsigned char));
+    h5difftrace("character_compare start\n");
 
     if (temp1_uchar != temp2_uchar)
     {
@@ -3013,6 +3018,7 @@ hsize_t character_compare(char *mem1,
         }
         nfound++;
     }
+    h5difftrace("character_compare finish\n");
 
     return nfound;
 }
@@ -3049,6 +3055,7 @@ static hsize_t character_compare_opt(unsigned char *mem1,
     HDmemcpy(&temp1_uchar, mem1, sizeof(unsigned char));
     HDmemcpy(&temp2_uchar, mem2, sizeof(unsigned char));
 
+    h5difftrace("character_compare_opt start\n");
     /* -d and !-p */
 
     if (options->d && !options->p)
@@ -3104,6 +3111,7 @@ static hsize_t character_compare_opt(unsigned char *mem1,
         }
         nfound++;
     }
+    h5difftrace("character_compare_opt finish\n");
 
     return nfound;
 
@@ -3142,6 +3150,7 @@ static hsize_t diff_float(unsigned char *mem1,
     hbool_t     isnan1 = FALSE;
     hbool_t     isnan2 = FALSE;
 
+    h5difftrace("diff_float start\n");
 
  /*-------------------------------------------------------------------------
   * -d and !-p
@@ -3379,6 +3388,7 @@ static hsize_t diff_float(unsigned char *mem1,
 
 
     }
+    h5difftrace("diff_float finish\n");
 
     return nfound;
 }
@@ -3416,6 +3426,7 @@ static hsize_t diff_double(unsigned char *mem1,
     hbool_t     isnan1 = FALSE;
     hbool_t     isnan2 = FALSE;
 
+    h5difftrace("diff_double start\n");
  /*-------------------------------------------------------------------------
   * -d and !-p
   *-------------------------------------------------------------------------
@@ -3656,6 +3667,7 @@ static hsize_t diff_double(unsigned char *mem1,
 
 
     }
+    h5difftrace("diff_double finish\n");
 
     return nfound;
 }
@@ -3698,6 +3710,7 @@ static hsize_t diff_ldouble(unsigned char *mem1,
     hbool_t     isnan1 = FALSE;
     hbool_t     isnan2 = FALSE;
 
+    h5difftrace("diff_ldouble start\n");
 
  /*-------------------------------------------------------------------------
   * -d and !-p
@@ -3939,6 +3952,7 @@ static hsize_t diff_ldouble(unsigned char *mem1,
 
 
     }
+    h5difftrace("diff_ldouble finish\n");
 
     return nfound;
 }
@@ -3979,6 +3993,7 @@ static hsize_t diff_schar(unsigned char *mem1,
  double      per;
  hbool_t     both_zero;
 
+ h5difftrace("diff_schar start\n");
 
  /* -d and !-p */
  if (options->d && !options->p)
@@ -4120,6 +4135,7 @@ static hsize_t diff_schar(unsigned char *mem1,
      } /* nelmts */
 
  }
+ h5difftrace("diff_schar finish\n");
 
  return nfound;
 }
@@ -4156,6 +4172,7 @@ static hsize_t diff_uchar(unsigned char *mem1,
  double        per;
  hbool_t       both_zero;
 
+ h5difftrace("diff_uchar start\n");
 
  /* -d and !-p */
  if (options->d && !options->p)
@@ -4298,6 +4315,7 @@ static hsize_t diff_uchar(unsigned char *mem1,
      } /* nelmts */
 
  }
+ h5difftrace("diff_uchar finish\n");
 
  return nfound;
 }
@@ -4332,6 +4350,7 @@ static hsize_t diff_short(unsigned char *mem1,
  double        per;
  hbool_t       both_zero;
 
+ h5difftrace("diff_short start\n");
  /* -d and !-p */
  if (options->d && !options->p)
  {
@@ -4475,6 +4494,7 @@ static hsize_t diff_short(unsigned char *mem1,
      } /* nelmts */
 
  }
+ h5difftrace("diff_short finish\n");
 
  return nfound;
 }
@@ -4510,6 +4530,7 @@ static hsize_t diff_ushort(unsigned char *mem1,
  double         per;
  hbool_t        both_zero;
 
+ h5difftrace("diff_ushort start\n");
  /* -d and !-p */
  if (options->d && !options->p)
  {
@@ -4653,6 +4674,7 @@ static hsize_t diff_ushort(unsigned char *mem1,
      } /* nelmts */
 
  }
+ h5difftrace("diff_ushort finish\n");
 
  return nfound;
 }
@@ -4689,6 +4711,7 @@ static hsize_t diff_int(unsigned char *mem1,
  double        per;
  hbool_t       both_zero;
 
+ h5difftrace("diff_int start\n");
  /* -d and !-p */
  if (options->d && !options->p)
  {
@@ -4832,6 +4855,7 @@ static hsize_t diff_int(unsigned char *mem1,
      } /* nelmts */
 
  }
+ h5difftrace("diff_int finish\n");
 
  return nfound;
 }
@@ -4868,6 +4892,7 @@ static hsize_t diff_uint(unsigned char *mem1,
  double         per;
  hbool_t        both_zero;
 
+ h5difftrace("diff_uint start\n");
  /* -d and !-p */
  if (options->d && !options->p)
  {
@@ -5009,6 +5034,7 @@ static hsize_t diff_uint(unsigned char *mem1,
      } /* nelmts */
 
  }
+ h5difftrace("diff_uint finish\n");
 
  return nfound;
 }
@@ -5045,6 +5071,7 @@ static hsize_t diff_long(unsigned char *mem1,
  double        per;
  hbool_t       both_zero;
 
+ h5difftrace("diff_long start\n");
  /* -d and !-p */
  if (options->d && !options->p)
  {
@@ -5191,6 +5218,7 @@ static hsize_t diff_long(unsigned char *mem1,
      } /* nelmts */
 
  }
+ h5difftrace("diff_long finish\n");
 
  return nfound;
 }
@@ -5228,6 +5256,7 @@ static hsize_t diff_ulong(unsigned char *mem1,
  double         per;
  hbool_t        both_zero;
 
+ h5difftrace("diff_ulong start\n");
 
  /* -d and !-p */
  if (options->d && !options->p)
@@ -5375,6 +5404,7 @@ static hsize_t diff_ulong(unsigned char *mem1,
      } /* nelmts */
 
  }
+ h5difftrace("diff_ulong finish\n");
 
  return nfound;
 }
@@ -5411,6 +5441,7 @@ static hsize_t diff_llong(unsigned char *mem1,
  double        per;
  hbool_t       both_zero;
 
+ h5difftrace("diff_llong start\n");
  /* -d and !-p */
  if (options->d && !options->p)
  {
@@ -5548,6 +5579,7 @@ static hsize_t diff_llong(unsigned char *mem1,
      } /* nelmts */
 
  }
+ h5difftrace("diff_llong finish\n");
 
  return nfound;
 }
@@ -5585,6 +5617,7 @@ static hsize_t diff_ullong(unsigned char *mem1,
  double              per;
  hbool_t             both_zero;
 
+ h5difftrace("diff_ullong start\n");
  /* -d and !-p */
  if (options->d && !options->p)
  {
@@ -5726,6 +5759,7 @@ static hsize_t diff_ullong(unsigned char *mem1,
      } /* nelmts */
 
  }
+ h5difftrace("diff_ullong finish\n");
 
  return nfound;
 }
@@ -5752,6 +5786,7 @@ int ull2float(unsigned long long ull_value, float *f_value)
  size_t         src_size;
  size_t         dst_size;
 
+ h5difftrace("ull2float start\n");
  if((dxpl_id = H5Pcreate(H5P_DATASET_XFER))<0)
   goto error;
 
@@ -5771,6 +5806,7 @@ int ull2float(unsigned long long ull_value, float *f_value)
 
  if(buf)
      HDfree(buf);
+ h5difftrace("ull2float finish\n");
 
  return 0;
 
@@ -5780,6 +5816,7 @@ error:
  } H5E_END_TRY;
  if(buf)
      HDfree(buf);
+ h5difftrace("ull2float errored\n");
 
  return -1;
 }
@@ -5799,6 +5836,7 @@ error:
 static
 hbool_t equal_double(double value, double expected, diff_opt_t *options)
 {
+    h5difftrace("equal_double start\n");
     if ( options->do_nans )
     {
 
@@ -5835,6 +5873,7 @@ hbool_t equal_double(double value, double expected, diff_opt_t *options)
         if ( ABS( (value-expected) ) < DBL_EPSILON)
             return TRUE;
     }
+    h5difftrace("equal_double finish\n");
 
     return FALSE;
 }
@@ -5852,6 +5891,7 @@ hbool_t equal_double(double value, double expected, diff_opt_t *options)
 static
 hbool_t equal_ldouble(long double value, long double expected, diff_opt_t *options)
 {
+    h5difftrace("equal_ldouble start\n");
     if ( options->do_nans )
     {
 
@@ -5888,6 +5928,7 @@ hbool_t equal_ldouble(long double value, long double expected, diff_opt_t *optio
         if ( ABS( (value-expected) ) < DBL_EPSILON)
             return TRUE;
     }
+    h5difftrace("equal_ldouble finish\n");
 
     return FALSE;
 }
@@ -5909,6 +5950,7 @@ hbool_t equal_ldouble(long double value, long double expected, diff_opt_t *optio
 static
 hbool_t equal_float(float value, float expected, diff_opt_t *options)
 {
+    h5difftrace("equal_float start\n");
     if ( options->do_nans )
     {
 
@@ -5945,6 +5987,7 @@ hbool_t equal_float(float value, float expected, diff_opt_t *options)
         if ( ABS( (value-expected) ) < FLT_EPSILON)
             return TRUE;
     }
+    h5difftrace("equal_float finish\n");
 
     return FALSE;
 
@@ -5974,6 +6017,7 @@ my_isnan(dtype_t type, void *val)
     hbool_t retval = FALSE;
     char s[256];
 
+    h5difftrace("my_isnan start\n");
     if (FLT_FLOAT==type)
     {
         float x;
@@ -6046,6 +6090,7 @@ my_isnan(dtype_t type, void *val)
         }
     }
 
+    h5difftrace("my_isnan finish\n");
 
     return retval;
 }
diff --git a/tools/lib/h5diff_attr.c b/tools/lib/h5diff_attr.c
index 6474082..190343b 100644
--- a/tools/lib/h5diff_attr.c
+++ b/tools/lib/h5diff_attr.c
@@ -334,8 +334,8 @@ hsize_t diff_attr(hid_t loc1_id,
     size_t     msize2;          /* memory size of memory type */
     void       *buf1=NULL;      /* data buffer */
     void       *buf2=NULL;      /* data buffer */
-    int	       buf1hasdata=0;	/* buffer has data */
-    int	       buf2hasdata=0;	/* buffer has data */
+    hbool_t    buf1hasdata=FALSE;	/* buffer has data */
+    hbool_t    buf2hasdata=FALSE;	/* buffer has data */
     hsize_t    nelmts1;         /* number of elements in dataset */
     int        rank1;           /* rank of dataset */
     int        rank2;           /* rank of dataset */
@@ -472,12 +472,12 @@ hsize_t diff_attr(hid_t loc1_id,
 	    parallel_print("Failed reading attribute1 %s/%s\n", path1, name1);
 	    goto error;
 	}else
-	    buf1hasdata = 1;
+	    buf1hasdata = TRUE;
         if(H5Aread(attr2_id,mtype2_id,buf2) < 0){
 	    parallel_print("Failed reading attribute2 %s/%s\n", path2, name2);
 	    goto error;
 	}else
-	    buf2hasdata = 1;
+	    buf2hasdata = TRUE;
 
         /* format output string */
         HDsnprintf(np1, sizeof(np1), "%s of <%s>", name1, path1);
diff --git a/tools/lib/h5diff_dset.c b/tools/lib/h5diff_dset.c
index 157978d..b8dd0e8 100644
--- a/tools/lib/h5diff_dset.c
+++ b/tools/lib/h5diff_dset.c
@@ -218,6 +218,7 @@ hsize_t diff_datasetid( hid_t did1,
     int        i;
     unsigned int  vl_data = 0;         /*contains VL datatypes */
 
+    h5difftrace("diff_datasetid start\n");
     /* Get the dataspace handle */
     if ( (sid1 = H5Dget_space(did1)) < 0 )
         goto error;
@@ -263,6 +264,7 @@ hsize_t diff_datasetid( hid_t did1,
     * check for empty datasets
     *-------------------------------------------------------------------------
     */
+    h5difftrace("check for empty datasets\n");
 
     storage_size1=H5Dget_storage_size(did1);
     storage_size2=H5Dget_storage_size(did2);
@@ -300,6 +302,7 @@ hsize_t diff_datasetid( hid_t did1,
     * memory type and sizes
     *-------------------------------------------------------------------------
     */
+    h5difftrace("check for memory type and sizes\n");
     if ((m_tid1=h5tools_get_native_type(f_tid1)) < 0)
         goto error;
 
@@ -315,10 +318,12 @@ hsize_t diff_datasetid( hid_t did1,
     */
     if (can_compare)
     {
+        h5difftrace("can_compare for sign\n");
         sign1=H5Tget_sign(m_tid1);
         sign2=H5Tget_sign(m_tid2);
         if ( sign1 != sign2 )
         {
+            h5difftrace("sign1 != sign2\n");
             if ((options->m_verbose||options->m_list_not_cmp) && obj1_name && obj2_name)
             {
                 parallel_print("Not comparable: <%s> has sign %s ", obj1_name, get_sign(sign1));
@@ -341,6 +346,7 @@ hsize_t diff_datasetid( hid_t did1,
     */
     if(can_compare) /* it is possible to compare */
     {
+        h5difftrace("can_compare attempt\n");
 
         /*-----------------------------------------------------------------
         * get number of elements
@@ -360,6 +366,7 @@ hsize_t diff_datasetid( hid_t did1,
         * "upgrade" the smaller memory size
         *------------------------------------------------------------------
         */
+        h5difftrace("upgrade the smaller memory size?\n");
 
         if (FAIL == match_up_memsize (f_tid1, f_tid2,
                                       &m_tid1, &m_tid2, 
@@ -384,6 +391,7 @@ hsize_t diff_datasetid( hid_t did1,
         } /* end if */
 
         if(buf1 != NULL && buf2 != NULL) {
+            h5difftrace("buf1 != NULL && buf2 != NULL\n");
             if(H5Dread(did1, m_tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf1) < 0)
                 goto error;
             if(H5Dread(did2, m_tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf2) < 0)
@@ -504,6 +512,7 @@ hsize_t diff_datasetid( hid_t did1,
      * close
      *-------------------------------------------------------------------------
      */
+    h5difftrace("compare attributes?\n");
 
     /* free */
     if(buf1 != NULL) {
@@ -531,6 +540,7 @@ hsize_t diff_datasetid( hid_t did1,
         H5Tclose(m_tid1);
         H5Tclose(m_tid2);
     } H5E_END_TRY;
+    h5difftrace("diff_datasetid finish\n");
 
     return nfound;
 
@@ -581,6 +591,7 @@ error:
         H5Tclose(m_tid2);
         /* enable error reporting */
     } H5E_END_TRY;
+    h5difftrace("diff_datasetid errored\n");
 
     return nfound;
 }
@@ -676,31 +687,30 @@ int diff_can_type( hid_t       f_tid1, /* file data type */
     HDassert(tclass1==tclass2);
     switch (tclass1)
     {
-    case H5T_INTEGER:
-    case H5T_FLOAT:
-    case H5T_COMPOUND:
-    case H5T_STRING:
-    case H5T_ARRAY:
-    case H5T_BITFIELD:
-    case H5T_OPAQUE:
-    case H5T_ENUM:
-    case H5T_VLEN:
-    case H5T_REFERENCE:
-
-        break;
-
-    default: /*H5T_TIME */
-
+        case H5T_TIME:
+            if ( (options->m_verbose||options->m_list_not_cmp) && obj1_name && obj2_name) {
+                parallel_print("Not comparable: <%s> and <%s> are of class %s\n",
+                    obj1_name,obj2_name,get_class(tclass2) );
+            } /* end if */
+            can_compare = 0;
+            options->not_cmp = 1;
+            return can_compare;
 
-        if ( (options->m_verbose||options->m_list_not_cmp) && obj1_name && obj2_name)
-        {
-            parallel_print("Not comparable: <%s> and <%s> are of class %s\n",
-                obj1_name,obj2_name,get_class(tclass2) );
-        }
-        can_compare = 0;
-        options->not_cmp = 1;
-        return can_compare;
-    }
+        case H5T_INTEGER:
+        case H5T_FLOAT:
+        case H5T_COMPOUND:
+        case H5T_STRING:
+        case H5T_ARRAY:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_ENUM:
+        case H5T_VLEN:
+        case H5T_REFERENCE:
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+        default:
+            break;
+    } /* end switch */
 
     /*-------------------------------------------------------------------------
     * check for equal file datatype; warning only
diff --git a/tools/lib/h5diff_util.c b/tools/lib/h5diff_util.c
index aefd641..14fbcaa 100644
--- a/tools/lib/h5diff_util.c
+++ b/tools/lib/h5diff_util.c
@@ -78,8 +78,6 @@ void print_type(hid_t type)
 {
     switch (H5Tget_class(type))
     {
-    default:
-        return;
     case H5T_INTEGER:
         if (H5Tequal(type, H5T_STD_I8BE)) {
             parallel_print("H5T_STD_I8BE");
@@ -160,7 +158,21 @@ void print_type(hid_t type)
         }
         break;
 
-    }/*switch*/
+    case H5T_TIME:
+    case H5T_STRING:
+    case H5T_BITFIELD:
+    case H5T_OPAQUE:
+    case H5T_COMPOUND:
+    case H5T_REFERENCE:
+    case H5T_ENUM:
+    case H5T_VLEN:
+    case H5T_ARRAY:
+    case H5T_NO_CLASS:
+    case H5T_NCLASSES:
+    default:
+        return;
+
+    } /* end switch */
 }
 
 /*-------------------------------------------------------------------------
@@ -219,6 +231,7 @@ get_type(h5trav_type_t type)
             return("H5G_LINK");
         case H5TRAV_TYPE_UDLINK:
             return("H5G_UDLINK");
+        case H5TRAV_TYPE_UNKNOWN:
         default:
             return("unknown type");
     }
@@ -242,13 +255,18 @@ get_sign(H5T_sign_t sign)
 {
     switch (sign)
     {
-    default:
-        return("H5T_SGN_ERROR");
-    case H5T_SGN_NONE:
-        return("H5T_SGN_NONE");
-    case H5T_SGN_2:
-        return("H5T_SGN_2");
-    }
+        case H5T_SGN_NONE:
+            return "H5T_SGN_NONE";
+        case H5T_SGN_2:
+            return "H5T_SGN_2";
+        case H5T_SGN_ERROR:
+            return "H5T_SGN_ERROR";
+        case H5T_NSGN:
+            return "H5T_NSGN";
+        default:
+            HDassert(0);
+            return "unknown sign value";
+    } /* end switch */
 }
 
 
@@ -268,8 +286,6 @@ get_class(H5T_class_t tclass)
 {
     switch (tclass)
     {
-    default:
-        return("Invalid class");
     case H5T_TIME:
         return("H5T_TIME");
     case H5T_INTEGER:
@@ -292,8 +308,13 @@ get_class(H5T_class_t tclass)
         return("H5T_VLEN");
     case H5T_ARRAY:
         return("H5T_ARRAY");
-    }
-}
+    case H5T_NO_CLASS:
+    case H5T_NCLASSES:
+    default:
+        HDassert(0);
+        return("Invalid class");
+    } /* end switch */
+} /* end get_class() */
 
 /*-------------------------------------------------------------------------
  * Function: print_found
diff --git a/tools/lib/h5tools.c b/tools/lib/h5tools.c
index 1284924..19d71bb 100644
--- a/tools/lib/h5tools.c
+++ b/tools/lib/h5tools.c
@@ -1476,7 +1476,7 @@ render_bin_output(FILE *stream, hid_t container, hid_t tid, void *_mem,  hsize_t
 
                         for (block_index = 0; block_index < block_nelmts; block_index++) {
                             mem = ((unsigned char*)_mem) + block_index * size;
-                            region_id = H5Rdereference(container, H5R_DATASET_REGION, mem);
+                            region_id = H5Rdereference2(container, H5P_DEFAULT, H5R_DATASET_REGION, mem);
                             if (region_id >= 0) {
                                 region_space = H5Rget_region(container, H5R_DATASET_REGION, mem);
                                 if (region_space >= 0) {
@@ -1498,14 +1498,24 @@ render_bin_output(FILE *stream, hid_t container, hid_t tid, void *_mem,  hsize_t
                 }
             }
             break;
-        default:
+
+        case H5T_TIME:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
             for (block_index = 0; block_index < block_nelmts; block_index++) {
                 mem = ((unsigned char*)_mem) + block_index * size;
                 if (size != HDfwrite(mem, sizeof(char), size, stream))
                     H5E_THROW(FAIL, H5E_tools_min_id_g, "fwrite failed");
-            }
+            } /* end for */
             break;
-    }
+
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+        default:
+            /* Badness */
+            H5E_THROW(FAIL, H5E_tools_min_id_g, "bad type class");
+            break;
+    } /* end switch */
 
 CATCH
     return ret_value;
@@ -1631,8 +1641,8 @@ render_bin_output_region_blocks(hid_t region_space, hid_t region_id,
     hsize_t      alloc_size;
     hsize_t     *ptdata;
     int          ndims;
-    hid_t        dtype;
-    hid_t        type_id;
+    hid_t        dtype = -1;
+    hid_t        type_id = -1;
 
     if((snblocks = H5Sget_select_hyper_nblocks(region_space)) <= 0)
         H5E_THROW(FALSE, H5E_tools_min_id_g, "H5Sget_select_hyper_nblocks failed");
@@ -1662,10 +1672,10 @@ render_bin_output_region_blocks(hid_t region_space, hid_t region_id,
  done:
     HDfree(ptdata);
 
-    if(H5Tclose(type_id) < 0)
+    if(type_id > 0 && H5Tclose(type_id) < 0)
         HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
 
-    if(H5Tclose(dtype) < 0)
+    if(dtype > 0 && H5Tclose(dtype) < 0)
         HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
 
     H5_LEAVE(TRUE)
@@ -1755,8 +1765,8 @@ render_bin_output_region_points(hid_t region_space, hid_t region_id,
     HERR_INIT(hbool_t, TRUE)
     hssize_t npoints;
     int      ndims;
-    hid_t    dtype;
-    hid_t    type_id;
+    hid_t    dtype = -1;
+    hid_t    type_id = -1;
 
     if((npoints = H5Sget_select_elem_npoints(region_space)) <= 0)
         H5E_THROW(FALSE, H5E_tools_min_id_g, "H5Sget_select_elem_npoints failed");
@@ -1775,10 +1785,10 @@ render_bin_output_region_points(hid_t region_space, hid_t region_id,
             stream, container, ndims, type_id, npoints);
 
  done:
-    if(H5Tclose(type_id) < 0)
+    if(type_id > 0 && H5Tclose(type_id) < 0)
         HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
 
-    if(H5Tclose(dtype) < 0)
+    if(dtype > 0 && H5Tclose(dtype) < 0)
         HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
 
     H5_LEAVE(ret_value)
diff --git a/tools/lib/h5tools.h b/tools/lib/h5tools.h
index 5c08f33..a7f28e5 100644
--- a/tools/lib/h5tools.h
+++ b/tools/lib/h5tools.h
@@ -37,10 +37,10 @@
 #define H5TOOLS_DUMP_MAX_RANK     H5S_MAX_RANK
 
 /* Stream macros */
-#define FLUSHSTREAM(S)           {if(S != NULL) HDfflush(S);}
-#define PRINTSTREAM(S, F, ...)   {if(S != NULL) HDfprintf(S, F, __VA_ARGS__);}
-#define PRINTVALSTREAM(S, V)   {if(S != NULL) HDfprintf(S, V);}
-#define PUTSTREAM(X,S)          {if(S != NULL) HDfputs(X, S);}
+#define FLUSHSTREAM(S)           if(S != NULL) HDfflush(S)
+#define PRINTSTREAM(S, F, ...)   if(S != NULL) HDfprintf(S, F, __VA_ARGS__)
+#define PRINTVALSTREAM(S, V)   if(S != NULL) HDfprintf(S, V)
+#define PUTSTREAM(X,S)          if(S != NULL) HDfputs(X, S);
 
 /*
  * Strings for output - these were duplicated from the h5dump.h
@@ -81,7 +81,7 @@
 #define FLETCHER32      "CHECKSUM FLETCHER32"
 #define SZIP            "COMPRESSION SZIP"
 #define NBIT            "COMPRESSION NBIT"
-#define SCALEOFFSET            "COMPRESSION SCALEOFFSET"
+#define SCALEOFFSET     "COMPRESSION SCALEOFFSET"
 #define SCALEOFFSET_MINBIT            "MIN BITS"
 #define STORAGE_LAYOUT  "STORAGE_LAYOUT"
 #define CONTIGUOUS      "CONTIGUOUS"
@@ -93,6 +93,16 @@
 #define PACKED_BITS     "PACKED_BITS"
 #define PACKED_OFFSET   "OFFSET"
 #define PACKED_LENGTH   "LENGTH"
+#define VDS_VIRTUAL     "VIRTUAL"
+#define VDS_MAPPING     "MAPPING"
+#define VDS_SOURCE      "SOURCE"
+#define VDS_REG_HYPERSLAB   "SELECTION REGULAR_HYPERSLAB"
+#define VDS_IRR_HYPERSLAB   "SELECTION IRREGULAR_HYPERSLAB"
+#define VDS_POINT       "POINT"
+#define VDS_SRC_FILE    "FILE"
+#define VDS_SRC_DATASET "DATASET"
+#define VDS_NONE        "SELECTION NONE"
+#define VDS_ALL         "SELECTION ALL"
 
 #define BEGIN           "{"
 #define END             "}"
@@ -182,8 +192,21 @@ typedef struct h5tools_dump_header_t {
     const char *dataspacedimbegin;
     const char *dataspacedimend;
 
+    const char *virtualselectionbegin;
+    const char *virtualselectionend;
+    const char *virtualselectionblockbegin;
+    const char *virtualselectionblockend;
+    const char *virtualfilenamebegin;
+    const char *virtualfilenameend;
+    const char *virtualdatasetnamebegin;
+    const char *virtualdatasetnameend;
+
 } h5tools_dump_header_t;
 
+/* Forward declaration (see declaration in h5tools_str.c) */
+struct H5LD_memb_t;
+
+
 /*
  * Information about how to format output.
  */
@@ -319,12 +342,16 @@ typedef struct h5tool_format_t {
      *
      *   end:       a string to print after we reach the last element of
      *              each compound type. prints out before the suf.
+     *
+     *   listv:    h5watch: vector containing info about the list of compound fields to be printed.
      */
     const char  *cmpd_name;
     const char  *cmpd_sep;
     const char  *cmpd_pre;
     const char  *cmpd_suf;
     const char  *cmpd_end;
+    const struct H5LD_memb_t **cmpd_listv;
+
 
     /*
      * Fields associated with vlen data types.
@@ -491,12 +518,13 @@ typedef struct h5tools_context_t {
     hsize_t size_last_dim;                   /*the size of the last dimension,
                                               *needed so we can break after each
                                               *row */
-    int  indent_level;                 /*the number of times we need some
+    int  indent_level;                /*the number of times we need some
                                        *extra indentation */
     int  default_indent_level;        /*this is used when the indent level gets changed */
     hsize_t acc[H5S_MAX_RANK];        /* accumulator position */
     hsize_t pos[H5S_MAX_RANK];        /* matrix position */
     hsize_t sm_pos;                   /* current stripmine element position */
+    struct H5LD_memb_t **cmpd_listv;  /* h5watch: vector containing info about the list of compound fields to be printed */
 } h5tools_context_t;
 
 typedef struct subset_d {
@@ -574,8 +602,12 @@ H5TOOLS_DLL void    h5tools_region_simple_prefix(FILE *stream, const h5tool_form
                             h5tools_context_t *ctx, hsize_t elmtno, hsize_t *ptdata, int secnum);
 
 H5TOOLS_DLL int     render_bin_output(FILE *stream, hid_t container, hid_t tid, void *_mem, hsize_t nelmts);
+H5TOOLS_DLL int     render_bin_output_region_data_blocks(hid_t region_id, FILE *stream,
+                            hid_t container, int ndims, hid_t type_id, hssize_t nblocks, hsize_t *ptdata);
 H5TOOLS_DLL hbool_t render_bin_output_region_blocks(hid_t region_space, hid_t region_id,
                              FILE *stream, hid_t container);
+H5TOOLS_DLL int     render_bin_output_region_data_points(hid_t region_space, hid_t region_id,
+                            FILE* stream, hid_t container, int ndims, hid_t type_id, hssize_t npoints);
 H5TOOLS_DLL hbool_t render_bin_output_region_points(hid_t region_space, hid_t region_id,
                              FILE *stream, hid_t container);
 
diff --git a/tools/lib/h5tools_dump.c b/tools/lib/h5tools_dump.c
index a05d5ce..39cfbeb 100644
--- a/tools/lib/h5tools_dump.c
+++ b/tools/lib/h5tools_dump.c
@@ -61,6 +61,7 @@ NULL, /*fmt_ullong */
 "{", /*cmpd_pre */
 "}", /*cmpd_suf */
 "\n", /*cmpd_end */
+NULL, /* cmpd_listv */
 
 ", ", /*vlen_sep */
 "(", /*vlen_pre */
@@ -179,6 +180,15 @@ BLOCK, /*blockbegin */
 "", /*dataspacedescriptionend */
 "(", /*dataspacedimbegin */
 ")", /*dataspacedimend */
+
+"", /*virtualselectionbegin */
+"", /*virtualselectionend */
+"{", /*virtualselectionblockbegin */
+"}", /*virtualselectionblockend */
+"\"", /*virtualfilenamebeginbegin */
+"\"", /*virtualfilenamebeginend */
+"\"", /*virtualdatasetnamebegin */
+"\"", /*virtualdtatasetnameend */
 };
 
 const h5tools_dump_header_t* h5tools_dump_header_format;
@@ -216,6 +226,13 @@ void h5tools_print_dims(h5tools_str_t *buffer, hsize_t *s, int dims);
 void h5tools_dump_subsetting_header(FILE *stream, const h5tool_format_t *info,
         h5tools_context_t *ctx, struct subset_t *sset, int dims);
 
+static void h5tools_print_virtual_selection(hid_t vspace,
+        FILE *stream, const h5tool_format_t *info,
+        h5tools_context_t *ctx/*in,out*/,
+        h5tools_str_t *buffer/*string into which to render */,
+        hsize_t *curr_pos/*total data element position*/,
+        size_t ncols);
+
 void
 h5tools_dump_init(void)
 {
@@ -308,7 +325,7 @@ h5tools_dump_simple_data(FILE *stream, const h5tool_format_t *info, hid_t contai
                 char ref_name[1024];
 
                 /* region data */
-                region_id = H5Rdereference(container, H5R_DATASET_REGION, memref);
+                region_id = H5Rdereference2(container, H5P_DEFAULT, H5R_DATASET_REGION, memref);
                 if (region_id >= 0) {
                     region_space = H5Rget_region(container, H5R_DATASET_REGION, memref);
                     if (region_space >= 0) {
@@ -368,7 +385,7 @@ h5tools_dump_simple_data(FILE *stream, const h5tool_format_t *info, hid_t contai
                 }
 
                 ctx->need_prefix = TRUE;
-                
+
                 if(FALSE == dimension_break)
                     elmt_counter = 0;
             } /* end for (i = 0; i < nelmts... */
@@ -803,14 +820,15 @@ h5tools_print_region_data_points(hid_t region_space, hid_t region_id,
     HDassert(cur_ctx);
     HDassert(buffer);
     HDassert(ptdata);
+    HDassert(ndims > 0);
 
     HDmemset(&ctx, 0, sizeof(ctx));
     /* Allocate space for the dimension array */
-    if((dims1 = (hsize_t *) HDmalloc(sizeof(hsize_t) * ndims)) == NULL)
+    if((dims1 = (hsize_t *) HDmalloc(sizeof(hsize_t) * (size_t)ndims)) == NULL)
         HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "Could not allocate buffer for dims");
 
     dims1[0] = npoints;
-    
+
     /* Create dataspace for reading buffer */
     if((mem_space = H5Screate_simple(1, dims1, NULL)) < 0)
         HGOTO_ERROR(FAIL, H5E_tools_min_id_g, "H5Screate_simple failed");
@@ -926,8 +944,8 @@ h5tools_dump_region_data_points(hid_t region_space, hid_t region_id,
     hsize_t *ptdata;
     int      ndims;
     hssize_t indx;
-    hid_t    dtype;
-    hid_t    type_id;
+    hid_t    dtype = -1;
+    hid_t    type_id = -1;
 
     HDassert(info);
     HDassert(ctx);
@@ -1048,10 +1066,10 @@ h5tools_dump_region_data_points(hid_t region_space, hid_t region_id,
  done:
     HDfree(ptdata);
 
-    if(H5Tclose(type_id) < 0)
+    if(type_id > 0 && H5Tclose(type_id) < 0)
         HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
 
-    if(H5Tclose(dtype) < 0)
+    if(dtype > 0 && H5Tclose(dtype) < 0)
         HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
 
     ctx->need_prefix = TRUE;
@@ -1248,7 +1266,7 @@ h5tools_print_simple_subset(FILE *stream, const h5tool_format_t *info, h5tools_c
                 H5Dvlen_reclaim(p_type, sm_space, H5P_DEFAULT, sm_buf);
 
             if(H5Sclose(sm_space) < 0)
-                H5E_THROW(H5E_tools_g, H5E_tools_min_id_g, "H5Sclose failed");
+                H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Sclose failed");
             if(sm_buf)
                 HDfree(sm_buf);
             sm_buf = NULL;
@@ -1457,7 +1475,7 @@ h5tools_dump_simple_subset(FILE *stream, const h5tool_format_t *info, h5tools_co
 
     if((f_space = H5Dget_space(dset)) < 0)
         H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Dget_space failed");
-    
+
     if((sndims = H5Sget_simple_extent_ndims(f_space)) < 0)
         H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Sget_simple_extent_ndims failed");
     ctx->ndims = (unsigned)sndims;
@@ -1471,11 +1489,14 @@ h5tools_dump_simple_subset(FILE *stream, const h5tool_format_t *info, h5tools_co
         H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Sget_simple_extent_dims failed");
     ctx->size_last_dim = total_size[ctx->ndims - 1];
 
+    /* Set the compound datatype field list for display */
+    ctx->cmpd_listv = info->cmpd_listv;
+
     h5tools_display_simple_subset(stream, info, ctx, dset, p_type, sset, f_space, total_size);
 
 CATCH
     if(f_space >= 0 && H5Sclose(f_space) < 0)
-        H5E_THROW(H5E_tools_g, H5E_tools_min_id_g, "H5Sclose failed");
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Sclose failed");
 
     return ret_value;
 }
@@ -1655,9 +1676,9 @@ CATCH
 
 done:
     if(sm_space >= 0 && H5Sclose(sm_space) < 0)
-        H5E_THROW(H5E_tools_g, H5E_tools_min_id_g, "H5Sclose failed");
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Sclose failed");
     if(f_space >= 0 && H5Sclose(f_space) < 0)
-        H5E_THROW(H5E_tools_g, H5E_tools_min_id_g, "H5Sclose failed");
+        H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Sclose failed");
 
     return ret_value;
 }
@@ -1743,7 +1764,7 @@ CATCH
  *-------------------------------------------------------------------------
  */
 int
-h5tools_dump_dset(FILE *stream, const h5tool_format_t *info, h5tools_context_t *ctx, 
+h5tools_dump_dset(FILE *stream, const h5tool_format_t *info, h5tools_context_t *ctx,
         hid_t dset, struct subset_t *sset)
 {
     hid_t     f_space = -1;
@@ -1819,7 +1840,7 @@ done:
  *-------------------------------------------------------------------------
  */
 int
-h5tools_dump_mem(FILE *stream, const h5tool_format_t *info, h5tools_context_t *ctx, 
+h5tools_dump_mem(FILE *stream, const h5tool_format_t *info, h5tools_context_t *ctx,
                 hid_t obj_id, hid_t type, hid_t space, void *mem)
 {
     HERR_INIT(int, SUCCEED)
@@ -1898,18 +1919,18 @@ h5tools_print_datatype(FILE *stream, h5tools_str_t *buffer, const h5tool_format_
             }
             else
                 h5tools_str_append(buffer, "\"%s\"", obj->objname);
-        } 
+        }
         else {
             error_msg("unknown committed type.\n");
             h5tools_setstatus(EXIT_FAILURE);
         }
 
         return ret_value;
-    } 
-    
+    }
+
     if (info->line_ncols > 0)
         ncols = info->line_ncols;
-    
+
     switch (type_class) {
     case H5T_INTEGER:
         if (H5Tequal(type, H5T_STD_I8BE) == TRUE) {
@@ -2231,7 +2252,7 @@ h5tools_print_datatype(FILE *stream, h5tools_str_t *buffer, const h5tool_format_
                 HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tset_order failed");
         } /* end if */
         else if(order == H5T_ORDER_BE) {
-            if(H5Tset_order(str_type, H5T_ORDER_BE) < 0) 
+            if(H5Tset_order(str_type, H5T_ORDER_BE) < 0)
                 HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tset_order failed");
         } /* end if */
 
@@ -2262,7 +2283,7 @@ h5tools_print_datatype(FILE *stream, h5tools_str_t *buffer, const h5tool_format_
                 HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tset_order failed");
         } /* end if */
         else if(order == H5T_ORDER_BE) {
-            if(H5Tset_order(str_type, H5T_ORDER_BE) < 0) 
+            if(H5Tset_order(str_type, H5T_ORDER_BE) < 0)
                 HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tset_order failed");
         } /* end if */
 
@@ -2336,9 +2357,9 @@ h5tools_print_datatype(FILE *stream, h5tools_str_t *buffer, const h5tool_format_
            h5tools_str_reset(buffer);
            h5tools_str_append(buffer, "OPAQUE_TAG \"%s\";", ttag);
            h5tools_render_element(stream, info, ctx, buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
-           
+
            H5free_memory(ttag);
-        } 
+        }
         ctx->indent_level--;
 
         ctx->need_prefix = TRUE;
@@ -2352,7 +2373,7 @@ h5tools_print_datatype(FILE *stream, h5tools_str_t *buffer, const h5tool_format_
         if((snmembers = H5Tget_nmembers(type)) < 0)
             H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Tget_nmembers failed");
         nmembers = (unsigned)snmembers;
-        
+
         h5tools_str_append(buffer, "H5T_COMPOUND %s", h5tools_dump_header_format->structblockbegin);
         h5tools_render_element(stream, info, ctx, buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
 
@@ -2407,7 +2428,7 @@ h5tools_print_datatype(FILE *stream, h5tools_str_t *buffer, const h5tool_format_
 
         h5tools_str_reset(buffer);
         h5tools_print_datatype(stream, buffer, info, ctx, super, TRUE);
-        
+
         if(H5Tclose(super) < 0)
             HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
 
@@ -2468,7 +2489,7 @@ h5tools_print_datatype(FILE *stream, h5tools_str_t *buffer, const h5tool_format_
             /* Close array base type */
             if(H5Tclose(super) < 0)
                 HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tclose failed");
-       }
+        }
         else
             HERROR(H5E_tools_g, H5E_tools_min_id_g, "H5Tget_super failed");
 
@@ -2476,6 +2497,8 @@ h5tools_print_datatype(FILE *stream, h5tools_str_t *buffer, const h5tool_format_
 
         break;
 
+    case H5T_NO_CLASS:
+    case H5T_NCLASSES:
     default:
         h5tools_str_append(buffer, "unknown datatype");
         break;
@@ -2595,7 +2618,7 @@ h5tools_print_enum(FILE *stream, h5tools_str_t *buffer, const h5tool_format_t *i
 
     if (info->line_ncols > 0)
         ncols = info->line_ncols;
-    
+
     if((snmembs = H5Tget_nmembers(type)) < 0)
         H5E_THROW(FAIL, H5E_tools_min_id_g, "H5Tget_nmembers failed");
     nmembs = (unsigned)snmembs;
@@ -2735,7 +2758,7 @@ h5tools_dump_datatype(FILE *stream, const h5tool_format_t *info,
         ncols = info->line_ncols;
 
     ctx->need_prefix = TRUE;
-    
+
     h5tools_str_reset(&buffer);
     h5tools_str_append(&buffer, "%s %s ",
                         h5tools_dump_header_format->datatypebegin,
@@ -2757,7 +2780,7 @@ h5tools_dump_datatype(FILE *stream, const h5tool_format_t *info,
 /*-------------------------------------------------------------------------
  * Function:    dump_dataspace
  *
- * Purpose:     Dump the dataspace. 
+ * Purpose:     Dump the dataspace.
  *
  * Return:      void
  *
@@ -2783,7 +2806,7 @@ h5tools_dump_dataspace(FILE *stream, const h5tool_format_t *info,
         ncols = info->line_ncols;
 
     ctx->need_prefix = TRUE;
-    
+
     h5tools_str_reset(&buffer);
     h5tools_str_append(&buffer, "%s ",
                         h5tools_dump_header_format->dataspacebegin);
@@ -2833,7 +2856,7 @@ h5tools_dump_oid(FILE *stream, const h5tool_format_t *info,
 
     ctx->need_prefix = TRUE;
     h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-    
+
     h5tools_str_reset(&buffer);
     h5tools_str_append(&buffer, "%s %s %d %s", OBJID, BEGIN, oid, END);
     h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
@@ -2841,6 +2864,78 @@ h5tools_dump_oid(FILE *stream, const h5tool_format_t *info,
     h5tools_str_close(&buffer);
 }
 
+/*-------------------------------------------------------------------------
+ * Function:    print_virtual_selection
+ *
+ * Purpose:     Print the virtual dataset selection.
+ *
+ * Return:      void
+ *-------------------------------------------------------------------------
+ */
+static void
+h5tools_print_virtual_selection(hid_t vspace, 
+        FILE *stream, const h5tool_format_t *info,
+        h5tools_context_t *ctx/*in,out*/,
+        h5tools_str_t *buffer/*string into which to render */,
+        hsize_t *curr_pos/*total data element position*/,
+        size_t ncols)
+{
+    switch(H5Sget_select_type(vspace)) {
+        case H5S_SEL_NONE:    /* Nothing selected         */
+            ctx->need_prefix = TRUE;
+            h5tools_simple_prefix(stream, info, ctx, *curr_pos, 0);
+
+            h5tools_str_reset(buffer);
+            h5tools_str_append(buffer, "%s", VDS_NONE);
+            break;
+        case H5S_SEL_POINTS:    /* Sequence of points selected  */
+            h5tools_str_reset(buffer);
+            h5tools_str_append(buffer, "%s %s ", VDS_POINT, h5tools_dump_header_format->virtualselectionblockbegin);
+            h5tools_str_dump_space_points(buffer, vspace, info);
+            h5tools_str_append(buffer, " %s", h5tools_dump_header_format->virtualselectionblockend);
+            break;
+        case H5S_SEL_HYPERSLABS:    /* "New-style" hyperslab selection defined  */
+            ctx->need_prefix = TRUE;
+            h5tools_simple_prefix(stream, info, ctx, *curr_pos, 0);
+
+            h5tools_str_reset(buffer);
+            if (H5Sis_regular_hyperslab(vspace)) {
+                h5tools_str_append(buffer, "%s %s ", VDS_REG_HYPERSLAB, h5tools_dump_header_format->virtualselectionblockbegin);
+                h5tools_render_element(stream, info, ctx, buffer, curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+
+                h5tools_str_reset(buffer);
+                h5tools_str_dump_space_slabs(buffer, vspace, info, ctx);
+            }
+            else {
+                h5tools_str_append(buffer, "%s %s ", VDS_IRR_HYPERSLAB, h5tools_dump_header_format->virtualselectionblockbegin);
+                h5tools_render_element(stream, info, ctx, buffer, curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+                ctx->indent_level++;
+                ctx->need_prefix = TRUE;
+                h5tools_simple_prefix(stream, info, ctx, *curr_pos, 0);
+
+                h5tools_str_reset(buffer);
+                h5tools_str_dump_space_blocks(buffer, vspace, info);
+                ctx->indent_level--;
+            }
+            h5tools_render_element(stream, info, ctx, buffer, curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+            ctx->need_prefix = TRUE;
+            h5tools_simple_prefix(stream, info, ctx, *curr_pos, 0);
+
+            h5tools_str_reset(buffer);
+            h5tools_str_append(buffer, "%s", h5tools_dump_header_format->virtualselectionblockend);
+            break;
+        case H5S_SEL_ALL:    /* Entire extent selected   */
+            ctx->need_prefix = TRUE;
+            h5tools_simple_prefix(stream, info, ctx, *curr_pos, 0);
+
+            h5tools_str_reset(buffer);
+            h5tools_str_append(buffer, "%s", VDS_ALL);
+            break;
+        default:
+            h5tools_str_append(buffer, "Unknown Selection");
+    }
+    h5tools_render_element(stream, info, ctx, buffer, curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+}
 
 /*-------------------------------------------------------------------------
  * Function:    dump_fill_value
@@ -2848,11 +2943,6 @@ h5tools_dump_oid(FILE *stream, const h5tool_format_t *info,
  * Purpose:     prints the fill value
  *
  * Return:      void
- *
- * Programmer:  pvn
- *
- * Modifications:
- *
  *-------------------------------------------------------------------------
  */
 void
@@ -2883,15 +2973,11 @@ h5tools_print_fill_value(h5tools_str_t *buffer/*in,out*/, const h5tool_format_t
  * Purpose:     prints several dataset create property list properties
  *
  * Return:      void
- *
- * Modifications: pvn, March 28, 2008
- *   Add a COMPRESSION ratio information for cases when filters are present
- *
  *-------------------------------------------------------------------------
  */
 void
 h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
-        h5tools_context_t *ctx, hid_t dcpl_id,hid_t type_id, hid_t obj_id)
+        h5tools_context_t *ctx, hid_t dcpl_id, hid_t type_id, hid_t obj_id)
 {
     int              nfilters;       /* number of filters */
     int              rank;           /* rank */
@@ -2905,16 +2991,17 @@ h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
     H5D_fill_value_t fvstatus;
     H5D_alloc_time_t at;
     H5D_fill_time_t  ft;
-    size_t        ncols = 80;      /* available output width        */
+    H5D_layout_t     stl;
+    size_t           ncols = 80;      /* available output width        */
     size_t           cd_nelmts;      /* filter client number of values */
     off_t            offset;         /* offset of external file     */
     char             f_name[256];    /* filter name */
-    char             name[256];      /* external file name       */
+    char             name[256];      /* external or virtual file name       */
     hsize_t          chsize[64];     /* chunk size in elements */
     hsize_t          size;           /* size of external file   */
     hsize_t          storage_size;
-    hsize_t       curr_pos = 0;        /* total data element position   */
-    h5tools_str_t buffer;          /* string into which to render   */
+    hsize_t          curr_pos = 0;        /* total data element position   */
+    h5tools_str_t    buffer;          /* string into which to render   */
 
     /* setup */
     HDmemset(&buffer, 0, sizeof(h5tools_str_t));
@@ -2931,228 +3018,304 @@ h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
     */
     ctx->need_prefix = TRUE;
     h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-    
+
     h5tools_str_reset(&buffer);
     h5tools_str_append(&buffer, "%s %s", STORAGE_LAYOUT, BEGIN);
     h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
 
-    if(H5D_CHUNKED == H5Pget_layout(dcpl_id)) {
-        ctx->indent_level++;
+    stl = H5Pget_layout(dcpl_id);
+    switch (stl) {
+        case H5D_CHUNKED:
+            ctx->indent_level++;
+            ctx->need_prefix = TRUE;
+            h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
 
-        ctx->need_prefix = TRUE;
-        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-        
-        h5tools_str_reset(&buffer);
-        h5tools_str_append(&buffer, "%s ", CHUNKED);
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "%s ", CHUNKED);
 
-        rank = H5Pget_chunk(dcpl_id,(int)NELMTS(chsize),chsize);
-        h5tools_str_append(&buffer, "%s " HSIZE_T_FORMAT, h5tools_dump_header_format->dataspacedimbegin, chsize[0]);
-        for(i = 1; i < rank; i++)
-            h5tools_str_append(&buffer, ", " HSIZE_T_FORMAT, chsize[i]);
-        h5tools_str_append(&buffer, " %s", h5tools_dump_header_format->dataspacedimend);
-        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+            rank = H5Pget_chunk(dcpl_id, (int) NELMTS(chsize), chsize);
+            h5tools_str_append(&buffer, "%s " HSIZE_T_FORMAT, h5tools_dump_header_format->dataspacedimbegin, chsize[0]);
+            for(i = 1; i < rank; i++)
+                h5tools_str_append(&buffer, ", " HSIZE_T_FORMAT, chsize[i]);
+            h5tools_str_append(&buffer, " %s", h5tools_dump_header_format->dataspacedimend);
+            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
 
-        ctx->need_prefix = TRUE;
-        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-        
-        h5tools_str_reset(&buffer);
+            ctx->need_prefix = TRUE;
+            h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
 
-       /* if there are filters, print a compression ratio */
-        if(nfilters) {
-            hsize_t     dims[H5S_MAX_RANK];
-            hsize_t     nelmts = 1;
-            double      ratio = 0;
-            int         ok = 0;
-            
-            hid_t       tid = H5Dget_type(obj_id);
-            hid_t       sid = H5Dget_space(obj_id);
-            size_t      datum_size = H5Tget_size(tid);
-            int         ndims = H5Sget_simple_extent_dims(sid, dims, NULL);
-
-            /* only print the compression ratio for these filters */
-            for(i = 0; i < nfilters && !ok; i++) {
-                cd_nelmts = NELMTS(cd_values);
-                filtn = H5Pget_filter2(dcpl_id, (unsigned)i, &filt_flags, &cd_nelmts,
-                                       cd_values, sizeof(f_name), f_name, NULL);
-				ok = (filtn>=0);
-				
-			    /* this following code will not show compression ratio for 
-				   user defined filter. For example, see HDFFV-8344 --xcao at hdfgroup.org
-                switch(filtn) {
-                case H5Z_FILTER_DEFLATE:
-                case H5Z_FILTER_SZIP:
-                case H5Z_FILTER_NBIT:
-                case H5Z_FILTER_SCALEOFFSET:
-                    ok = 1;
-                    break;
+            h5tools_str_reset(&buffer);
+
+            /* if there are filters, print a compression ratio */
+            if (nfilters) {
+                hsize_t dims[H5S_MAX_RANK];
+                hsize_t nelmts = 1;
+                double ratio = 0;
+                int ok = 0;
+
+                hid_t tid = H5Dget_type(obj_id);
+                hid_t sid = H5Dget_space(obj_id);
+                size_t datum_size = H5Tget_size(tid);
+                int ndims = H5Sget_simple_extent_dims(sid, dims, NULL);
+
+                /* only print the compression ratio for these filters */
+                for (i = 0; i < nfilters && !ok; i++) {
+                    cd_nelmts = NELMTS(cd_values);
+                    filtn = H5Pget_filter2(dcpl_id, (unsigned) i, &filt_flags, &cd_nelmts, cd_values, sizeof(f_name),
+                            f_name, NULL);
+                    ok = (filtn >= 0);
                 }
-				*/
-            }
 
-            if(ndims && ok) {
-                hsize_t uncomp_size;
+                if(ndims && ok) {
+                    hsize_t uncomp_size;
 
-                for(i = 0; i < ndims; i++) {
-                    nelmts *= dims[i];
-                }
-                uncomp_size = nelmts * datum_size;
+                    for(i = 0; i < ndims; i++) {
+                        nelmts *= dims[i];
+                    }
+                    uncomp_size = nelmts * datum_size;
+
+                    /* compression ratio = uncompressed size /  compressed size */
+
+                    if(storage_size != 0)
+                        ratio = (double) uncomp_size / (double) storage_size;
 
-                /* compression ratio = uncompressed size /  compressed size */
+                    h5tools_str_append(&buffer, "SIZE " HSIZE_T_FORMAT" (%.3f:1 COMPRESSION)", storage_size, ratio);
 
-                if(storage_size != 0)
-                    ratio = (double) uncomp_size / (double) storage_size;
+                }
+                else
+                    h5tools_str_append(&buffer, "SIZE " HSIZE_T_FORMAT, storage_size);
 
-                h5tools_str_append(&buffer, "SIZE " HSIZE_T_FORMAT" (%.3f:1 COMPRESSION)", storage_size, ratio);
+                H5Sclose(sid);
+                H5Tclose(tid);
 
             }
-            else
+            else {
                 h5tools_str_append(&buffer, "SIZE " HSIZE_T_FORMAT, storage_size);
+            }
+            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+            ctx->indent_level--;
+            break;
+        case H5D_COMPACT:
+            ctx->indent_level++;
+            ctx->need_prefix = TRUE;
+            h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
 
-            H5Sclose(sid);
-            H5Tclose(tid);
+            h5tools_str_reset(&buffer);
+            h5tools_str_append(&buffer, "%s", COMPACT);
+            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
 
-        }
-        else {
+            ctx->need_prefix = TRUE;
+            h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+            h5tools_str_reset(&buffer);
             h5tools_str_append(&buffer, "SIZE " HSIZE_T_FORMAT, storage_size);
-        }
-        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+            ctx->indent_level--;
+            break;
+        case H5D_CONTIGUOUS:
+            {
+                int next;
+
+                next = H5Pget_external_count(dcpl_id);
+
+                /*-------------------------------------------------------------------------
+                 * EXTERNAL_FILE
+                 *-------------------------------------------------------------------------
+                 */
+                ctx->indent_level++;
+                if (next) {
+                    ctx->need_prefix = TRUE;
+                    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
 
-        ctx->indent_level--;
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "%s", CONTIGUOUS);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
 
-        ctx->need_prefix = TRUE;
-        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-        
-        h5tools_str_reset(&buffer);
-        h5tools_str_append(&buffer, "%s",END);
-        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
-    }
-    else if(H5D_COMPACT == H5Pget_layout(dcpl_id)) {
-        ctx->indent_level++;
+                    ctx->need_prefix = TRUE;
+                    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
 
-        ctx->need_prefix = TRUE;
-        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-        
-        h5tools_str_reset(&buffer);
-        h5tools_str_append(&buffer, "%s", COMPACT);
-        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "%s %s", EXTERNAL, BEGIN);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
 
-        ctx->need_prefix = TRUE;
-        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-        
-        h5tools_str_reset(&buffer);
-        h5tools_str_append(&buffer, "SIZE " HSIZE_T_FORMAT, storage_size);
-        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                    ctx->indent_level++;
+                    for (j = 0; j < (unsigned) next; j++) {
+                        H5Pget_external(dcpl_id, j, sizeof(name), name, &offset, &size);
 
-        ctx->indent_level--;
+                        ctx->need_prefix = TRUE;
+                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
 
-        ctx->need_prefix = TRUE;
-        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-        
-        h5tools_str_reset(&buffer);
-        h5tools_str_append(&buffer, "%s",END);
-        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
-    }
-    else if(H5D_CONTIGUOUS == H5Pget_layout(dcpl_id)) {
-        int              next;
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "FILENAME %s SIZE " HSIZE_T_FORMAT, name, size);
+                        h5tools_str_append(&buffer, " OFFSET %ld", offset);
+                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+                    }
+                    ctx->indent_level--;
 
-        next = H5Pget_external_count(dcpl_id);
+                    ctx->need_prefix = TRUE;
+                    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
 
-        /*-------------------------------------------------------------------------
-        * EXTERNAL_FILE
-        *-------------------------------------------------------------------------
-        */
-        if(next) {
-            ctx->indent_level++;
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "%s", END);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+                }
+                else {
+                    haddr_t ioffset;
 
-            ctx->need_prefix = TRUE;
-            h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-            
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "%s", CONTIGUOUS);
-            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                    ctx->need_prefix = TRUE;
+                    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
 
-            ctx->need_prefix = TRUE;
-            h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-            
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "%s %s", EXTERNAL, BEGIN);
-            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "%s", CONTIGUOUS);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
 
-            ctx->indent_level++;
-            for(j = 0; j < (unsigned)next; j++) {
-                H5Pget_external(dcpl_id, j, sizeof(name), name, &offset, &size);
+                    ctx->need_prefix = TRUE;
+                    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
 
-                ctx->need_prefix = TRUE;
-                h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-                
-                h5tools_str_reset(&buffer);
-                h5tools_str_append(&buffer, "FILENAME %s SIZE " HSIZE_T_FORMAT, name, size);
-                h5tools_str_append(&buffer, " OFFSET %ld", offset);
-                h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer,"SIZE " HSIZE_T_FORMAT, storage_size);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+
+                    ctx->need_prefix = TRUE;
+                    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                    h5tools_str_reset(&buffer);
+                    ioffset = H5Dget_offset(obj_id);
+                    h5tools_str_append(&buffer, "OFFSET "H5_PRINTF_HADDR_FMT, ioffset);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+                }
+                ctx->indent_level--;
             }
-            ctx->indent_level--;
+            break;
 
-            ctx->need_prefix = TRUE;
-            h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-            
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "%s",END);
-            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+        case H5D_VIRTUAL:
+            {
+                char dsetname[256];     /* virtual datset name       */
+                size_t vmaps;
 
-            ctx->indent_level--;
+                H5Pget_virtual_count(dcpl_id, &vmaps);
 
-            ctx->need_prefix = TRUE;
-            h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-            
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "%s",END);
-            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
-        }
-        else {
-            haddr_t          ioffset;
+                if (vmaps) {
+                    size_t next;
+                    ssize_t ssize_out;
 
-            ctx->indent_level++;
+                    ctx->indent_level++;
+                    for (next = 0; next < (unsigned) vmaps; next++) {
+                        hid_t virtual_vspace = H5Pget_virtual_vspace(dcpl_id, next);
+                        hid_t virtual_srcspace = H5Pget_virtual_srcspace(dcpl_id, next);
 
-            ctx->need_prefix = TRUE;
-            h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-            
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "%s", CONTIGUOUS);
-            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                        ctx->need_prefix = TRUE;
+                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
 
-            ctx->need_prefix = TRUE;
-            h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-            
-            h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer,"SIZE " HSIZE_T_FORMAT, storage_size);
-            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "%s %ld %s ", VDS_MAPPING, next, BEGIN);
+                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
 
-            ctx->need_prefix = TRUE;
-            h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-            
-            h5tools_str_reset(&buffer);
-            ioffset = H5Dget_offset(obj_id);
-            h5tools_str_append(&buffer,"OFFSET "H5_PRINTF_HADDR_FMT, ioffset);
-            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                        ctx->indent_level++;
 
-            ctx->indent_level--;
+                        ctx->need_prefix = TRUE;
+                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
 
-            ctx->need_prefix = TRUE;
-            h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-            
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "%s %s", VDS_VIRTUAL, BEGIN);
+                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+
+                        ctx->indent_level++;
+
+                        h5tools_print_virtual_selection(virtual_vspace, stream, info, ctx, &buffer, &curr_pos, (size_t) ncols);
+
+                        ctx->indent_level--;
+
+                        ctx->need_prefix = TRUE;
+                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "%s", END);
+                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+
+                        ctx->need_prefix = TRUE;
+                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "%s %s", VDS_SOURCE, BEGIN);
+                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+
+                        ctx->indent_level++;
+
+                        ssize_out = H5Pget_virtual_filename(dcpl_id, next, NULL, 0);
+                        HDassert(ssize_out > 0);
+                        HDassert((size_t)ssize_out < sizeof(name));
+                        H5Pget_virtual_filename(dcpl_id, next, name, sizeof(name));
+                        ssize_out = H5Pget_virtual_dsetname(dcpl_id, next, NULL, 0);
+                        HDassert(ssize_out > 0);
+                        HDassert((size_t)ssize_out < sizeof(name));
+                        H5Pget_virtual_dsetname(dcpl_id, next, dsetname, sizeof(dsetname));
+
+                        ctx->need_prefix = TRUE;
+                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "%s %s", VDS_SRC_FILE, h5tools_dump_header_format->virtualfilenamebegin);
+                        h5tools_str_append(&buffer, "%s", name);
+                        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->virtualfilenameend);
+                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+
+                        ctx->need_prefix = TRUE;
+                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "%s %s", VDS_SRC_DATASET, h5tools_dump_header_format->virtualdatasetnamebegin);
+                        h5tools_str_append(&buffer, "%s", dsetname);
+                        h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->virtualdatasetnameend);
+                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+
+                        h5tools_print_virtual_selection(virtual_srcspace, stream, info, ctx, &buffer, &curr_pos, (size_t) ncols);
+
+                        ctx->indent_level--;
+
+                        ctx->need_prefix = TRUE;
+                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "%s", END);
+                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+
+                        ctx->indent_level--;
+
+                        ctx->need_prefix = TRUE;
+                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                        h5tools_str_reset(&buffer);
+                        h5tools_str_append(&buffer, "%s", END);
+                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+                    }
+                    ctx->indent_level--;
+                }
+            }
+            break;
+
+        case H5D_LAYOUT_ERROR:
+        case H5D_NLAYOUTS:
+        default:
             h5tools_str_reset(&buffer);
-            h5tools_str_append(&buffer, "%s",END);
-            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
-        }
-    }
-   /*-------------------------------------------------------------------------
+            h5tools_str_append(&buffer, "%s", "Unknown layout");
+            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t) ncols, (hsize_t) 0, (hsize_t) 0);
+    }/*switch*/
+
+    ctx->need_prefix = TRUE;
+    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+    h5tools_str_reset(&buffer);
+    h5tools_str_append(&buffer, "%s", END);
+    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+    /*-------------------------------------------------------------------------
     * FILTERS
     *-------------------------------------------------------------------------
     */
 
     ctx->need_prefix = TRUE;
     h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-    
+
     h5tools_str_reset(&buffer);
     h5tools_str_append(&buffer, "%s %s", FILTERS, BEGIN);
     h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
@@ -3164,13 +3327,13 @@ h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
             cd_nelmts = NELMTS(cd_values);
             filtn = H5Pget_filter2(dcpl_id, (unsigned)i, &filt_flags, &cd_nelmts,
                 cd_values, sizeof(f_name), f_name, NULL);
-				
-			if (filtn<0)
-			    continue; /* nothing to print for invalid filter */
+
+            if(filtn < 0)
+                continue; /* nothing to print for invalid filter */
 
             ctx->need_prefix = TRUE;
             h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-            
+
             h5tools_str_reset(&buffer);
             switch(filtn) {
                 case H5Z_FILTER_DEFLATE:
@@ -3186,70 +3349,68 @@ h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
                     h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
                     break;
                 case H5Z_FILTER_SZIP:
-                    {
-                        szip_options_mask = cd_values[0];;
-                        szip_pixels_per_block = cd_values[1];
+                    szip_options_mask = cd_values[0];;
+                    szip_pixels_per_block = cd_values[1];
 
-                        h5tools_str_append(&buffer, "%s %s",SZIP, BEGIN);
-                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                    h5tools_str_append(&buffer, "%s %s", SZIP, BEGIN);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
 
-                        ctx->indent_level++;
+                    ctx->indent_level++;
 
-                        ctx->need_prefix = TRUE;
-                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-                        
-                        h5tools_str_reset(&buffer);
-                        h5tools_str_append(&buffer, "PIXELS_PER_BLOCK %d", szip_pixels_per_block);
-                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                    ctx->need_prefix = TRUE;
+                    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
 
-                        ctx->need_prefix = TRUE;
-                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-                        
-                        h5tools_str_reset(&buffer);
-                        if(szip_options_mask & H5_SZIP_CHIP_OPTION_MASK)
-                            h5tools_str_append(&buffer, "MODE %s", "HARDWARE");
-                        else if(szip_options_mask & H5_SZIP_ALLOW_K13_OPTION_MASK)
-                            h5tools_str_append(&buffer, "MODE %s", "K13");
-                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "PIXELS_PER_BLOCK %d", szip_pixels_per_block);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
 
-                        ctx->need_prefix = TRUE;
-                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-                        
-                        h5tools_str_reset(&buffer);
-                        if(szip_options_mask & H5_SZIP_EC_OPTION_MASK)
-                            h5tools_str_append(&buffer, "CODING %s", "ENTROPY");
-                        else if(szip_options_mask & H5_SZIP_NN_OPTION_MASK)
-                            h5tools_str_append(&buffer, "CODING %s", "NEAREST NEIGHBOUR");
-                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                    ctx->need_prefix = TRUE;
+                    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
 
-                        ctx->need_prefix = TRUE;
-                        h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-                        
-                        h5tools_str_reset(&buffer);
-                        if(szip_options_mask & H5_SZIP_LSB_OPTION_MASK)
-                            h5tools_str_append(&buffer, "BYTE_ORDER %s", "LSB");
-                        else if(szip_options_mask & H5_SZIP_MSB_OPTION_MASK)
-                            h5tools_str_append(&buffer, "BYTE_ORDER %s", "MSB");
-                        h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+                    h5tools_str_reset(&buffer);
+                    if(szip_options_mask & H5_SZIP_CHIP_OPTION_MASK)
+                        h5tools_str_append(&buffer, "MODE %s", "HARDWARE");
+                    else if(szip_options_mask & H5_SZIP_ALLOW_K13_OPTION_MASK)
+                        h5tools_str_append(&buffer, "MODE %s", "K13");
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
 
-                        if(szip_options_mask & H5_SZIP_RAW_OPTION_MASK) {
-                            ctx->need_prefix = TRUE;
-                            h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-                            
-                            h5tools_str_reset(&buffer);
-                            h5tools_str_append(&buffer, "HEADER %s", "RAW");
-                            h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
-                        }
+                    ctx->need_prefix = TRUE;
+                    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
 
-                        ctx->indent_level--;
+                    h5tools_str_reset(&buffer);
+                    if(szip_options_mask & H5_SZIP_EC_OPTION_MASK)
+                        h5tools_str_append(&buffer, "CODING %s", "ENTROPY");
+                    else if(szip_options_mask & H5_SZIP_NN_OPTION_MASK)
+                        h5tools_str_append(&buffer, "CODING %s", "NEAREST NEIGHBOUR");
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
 
+                    ctx->need_prefix = TRUE;
+                    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                    h5tools_str_reset(&buffer);
+                    if(szip_options_mask & H5_SZIP_LSB_OPTION_MASK)
+                        h5tools_str_append(&buffer, "BYTE_ORDER %s", "LSB");
+                    else if(szip_options_mask & H5_SZIP_MSB_OPTION_MASK)
+                        h5tools_str_append(&buffer, "BYTE_ORDER %s", "MSB");
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
+
+                    if(szip_options_mask & H5_SZIP_RAW_OPTION_MASK) {
                         ctx->need_prefix = TRUE;
                         h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-                        
+
                         h5tools_str_reset(&buffer);
-                        h5tools_str_append(&buffer, "%s",END);
+                        h5tools_str_append(&buffer, "HEADER %s", "RAW");
                         h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
                     }
+
+                    ctx->indent_level--;
+
+                    ctx->need_prefix = TRUE;
+                    h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
+
+                    h5tools_str_reset(&buffer);
+                    h5tools_str_append(&buffer, "%s", END);
+                    h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
                     break;
                 case H5Z_FILTER_NBIT:
                     h5tools_str_append(&buffer, "%s", NBIT);
@@ -3260,12 +3421,6 @@ h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
                     h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
                     break;
                 default:
-                    /* filter do not have to be avaiable for showing registered filter info.
-					   see HDFFV-8346 for details. --xcao at hdfgroup.org
-                    if(H5Zfilter_avail(filtn))
-                        h5tools_str_append(&buffer, "%s %s", "USER_REGISTERED_FILTER", BEGIN);
-                    else
-					*/
                     h5tools_str_append(&buffer, "%s %s", "USER_DEFINED_FILTER", BEGIN);
                     h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
 
@@ -3273,15 +3428,15 @@ h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
 
                     ctx->need_prefix = TRUE;
                     h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-                    
+
                     h5tools_str_reset(&buffer);
                     h5tools_str_append(&buffer, "FILTER_ID %d", filtn);
                     h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
-                    
+
                     if(f_name[0] != '\0') {
                         ctx->need_prefix = TRUE;
                         h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-                        
+
                         h5tools_str_reset(&buffer);
                         h5tools_str_append(&buffer, "COMMENT %s", f_name);
                         h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
@@ -3289,7 +3444,7 @@ h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
                     if (cd_nelmts) {
                         ctx->need_prefix = TRUE;
                         h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-                        
+
                         h5tools_str_reset(&buffer);
                         h5tools_str_append(&buffer, "%s %s ","PARAMS", BEGIN);
                         for (j=0; j<cd_nelmts; j++)
@@ -3301,7 +3456,7 @@ h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
 
                     ctx->need_prefix = TRUE;
                     h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-                    
+
                     h5tools_str_reset(&buffer);
                     h5tools_str_append(&buffer, "%s",END);
                     h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
@@ -3313,7 +3468,7 @@ h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
 
         ctx->need_prefix = TRUE;
         h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-        
+
         h5tools_str_reset(&buffer);
         h5tools_str_append(&buffer, "NONE");
         h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
@@ -3322,7 +3477,7 @@ h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
 
     ctx->need_prefix = TRUE;
     h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-    
+
     h5tools_str_reset(&buffer);
     h5tools_str_append(&buffer, "%s",END);
     h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
@@ -3333,7 +3488,7 @@ h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
     */
     ctx->need_prefix = TRUE;
     h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-    
+
     h5tools_str_reset(&buffer);
     h5tools_str_append(&buffer, "%s %s", FILLVALUE, BEGIN);
     h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
@@ -3342,10 +3497,10 @@ h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
 
     ctx->need_prefix = TRUE;
     h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-    
+
     h5tools_str_reset(&buffer);
     h5tools_str_append(&buffer, "FILL_TIME ");
-    
+
     H5Pget_fill_time(dcpl_id, &ft);
     switch(ft) {
         case H5D_FILL_TIME_ALLOC:
@@ -3357,6 +3512,7 @@ h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
         case H5D_FILL_TIME_IFSET:
             h5tools_str_append(&buffer, "%s", "H5D_FILL_TIME_IFSET");
             break;
+        case H5D_FILL_TIME_ERROR:
         default:
             HDassert(0);
             break;
@@ -3365,7 +3521,7 @@ h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
 
     ctx->need_prefix = TRUE;
     h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-    
+
     h5tools_str_reset(&buffer);
     h5tools_str_append(&buffer, "%s ", "VALUE ");
     H5Pfill_value_defined(dcpl_id, &fvstatus);
@@ -3381,7 +3537,7 @@ h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
 
     ctx->need_prefix = TRUE;
     h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-        
+
     h5tools_str_reset(&buffer);
     h5tools_str_append(&buffer, "%s", END);
     h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
@@ -3392,7 +3548,7 @@ h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
     */
     ctx->need_prefix = TRUE;
     h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-    
+
     h5tools_str_reset(&buffer);
     h5tools_str_append(&buffer, "ALLOCATION_TIME %s", BEGIN);
     h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
@@ -3401,7 +3557,7 @@ h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
 
     ctx->need_prefix = TRUE;
     h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-    
+
     h5tools_str_reset(&buffer);
     H5Pget_alloc_time(dcpl_id, &at);
     switch(at) {
@@ -3414,6 +3570,8 @@ h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
         case H5D_ALLOC_TIME_LATE:
             h5tools_str_append(&buffer, "%s", "H5D_ALLOC_TIME_LATE");
             break;
+        case H5D_ALLOC_TIME_ERROR:
+        case H5D_ALLOC_TIME_DEFAULT:
         default:
             HDassert(0);
             break;
@@ -3424,7 +3582,7 @@ h5tools_dump_dcpl(FILE *stream, const h5tool_format_t *info,
 
     ctx->need_prefix = TRUE;
     h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-    
+
     h5tools_str_reset(&buffer);
     h5tools_str_append(&buffer, "%s", END);
     h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
@@ -3474,7 +3632,7 @@ h5tools_dump_comment(FILE *stream, const h5tool_format_t *info,
                 comment[cmt_bufsize] = '\0'; /* necessary because null char is not returned */
 
                 ctx->need_prefix = TRUE;
-                
+
                 h5tools_str_reset(&buffer);
                 h5tools_str_append(&buffer, "COMMENT \"%s\"", comment);
                 h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
@@ -3489,7 +3647,7 @@ h5tools_dump_comment(FILE *stream, const h5tool_format_t *info,
 /*-------------------------------------------------------------------------
  * Function:    dump_attribute
  *
- * Purpose:     Dump the attribute. 
+ * Purpose:     Dump the attribute.
  *
  * Return:      void
  *
@@ -3498,7 +3656,7 @@ h5tools_dump_comment(FILE *stream, const h5tool_format_t *info,
  */
 void
 h5tools_dump_attribute(FILE *stream, const h5tool_format_t *info,
-        h5tools_context_t *ctx, const char *attr_name, hid_t attr_id, 
+        h5tools_context_t *ctx, const char *attr_name, hid_t attr_id,
         int display_index, int display_char)
 {
     h5tools_str_t buffer;          /* string into which to render   */
@@ -3517,7 +3675,7 @@ h5tools_dump_attribute(FILE *stream, const h5tool_format_t *info,
 
     ctx->need_prefix = TRUE;
     h5tools_simple_prefix(stream, info, ctx, curr_pos, 0);
-    
+
     h5tools_str_reset(&buffer);
     h5tools_str_append(&buffer, "%s \"%s\" %s",
             h5tools_dump_header_format->attributebegin, attr_name,
@@ -3526,7 +3684,7 @@ h5tools_dump_attribute(FILE *stream, const h5tool_format_t *info,
 
     if(attr_id < 0) {
         error_msg("unable to open attribute \"%s\"\n", attr_name);
-    } 
+    }
     else {
         hid_t type, space;
 
@@ -3553,7 +3711,7 @@ h5tools_dump_attribute(FILE *stream, const h5tool_format_t *info,
 
     ctx->need_prefix = TRUE;
     h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
-    
+
     h5tools_str_reset(&buffer);
 
     if (HDstrlen(h5tools_dump_header_format->attributeblockend)) {
@@ -3609,36 +3767,36 @@ void
 h5tools_print_packed_bits(h5tools_str_t *buffer, hid_t type)
 {
     int     packed_bits_size = 0;
-    
+
     hid_t n_type = h5tools_get_native_type(type);
     if(H5Tget_class(n_type)==H5T_INTEGER) {
         if(H5Tequal(n_type, H5T_NATIVE_SCHAR) == TRUE) {
             packed_bits_size = 8 * sizeof(char);
-        } 
+        }
         else if(H5Tequal(n_type, H5T_NATIVE_UCHAR) == TRUE) {
             packed_bits_size = 8 * sizeof(unsigned char);
-        } 
+        }
         else if(H5Tequal(n_type, H5T_NATIVE_SHORT) == TRUE) {
             packed_bits_size = 8 * sizeof(short);
-        } 
+        }
         else if(H5Tequal(n_type, H5T_NATIVE_USHORT) == TRUE) {
             packed_bits_size = 8 * sizeof(unsigned short);
-        } 
+        }
         else if(H5Tequal(n_type, H5T_NATIVE_INT) == TRUE) {
             packed_bits_size = 8 * sizeof(int);
-        } 
+        }
         else if(H5Tequal(n_type, H5T_NATIVE_UINT) == TRUE) {
             packed_bits_size = 8 * sizeof(unsigned int);
-        } 
+        }
         else if(H5Tequal(n_type, H5T_NATIVE_LONG) == TRUE) {
             packed_bits_size = 8 * sizeof(long);
-        } 
+        }
         else if(H5Tequal(n_type, H5T_NATIVE_ULONG) == TRUE) {
             packed_bits_size = 8 * sizeof(unsigned long);
-        } 
+        }
         else if(H5Tequal(n_type, H5T_NATIVE_LLONG) == TRUE) {
             packed_bits_size = 8 * sizeof(long long);
-        } 
+        }
         else if(H5Tequal(n_type, H5T_NATIVE_ULLONG) == TRUE) {
             packed_bits_size = 8 * sizeof(unsigned long long);
         }
@@ -3679,25 +3837,25 @@ h5tools_dump_subsetting_header(FILE *stream, const h5tool_format_t *info,
     HDmemset(&buffer, 0, sizeof(h5tools_str_t));
     if (info->line_ncols > 0)
         ncols = info->line_ncols;
-   
+
     ctx->need_prefix = TRUE;
     h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
-    
+
     h5tools_str_reset(&buffer);
     h5tools_str_append(&buffer, "%s %s", h5tools_dump_header_format->subsettingbegin, h5tools_dump_header_format->subsettingblockbegin);
     h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
 
     ctx->indent_level++;
-    
+
     ctx->need_prefix = TRUE;
     h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
-    
+
     h5tools_str_reset(&buffer);
     h5tools_str_append(&buffer, "%s %s ", h5tools_dump_header_format->startbegin, h5tools_dump_header_format->startblockbegin);
     h5tools_print_dims(&buffer, sset->start.data, dims);
     h5tools_str_append(&buffer, "%s %s", h5tools_dump_header_format->startend, h5tools_dump_header_format->startblockend);
     h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
-    
+
     ctx->need_prefix = TRUE;
     h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
 
@@ -3706,7 +3864,7 @@ h5tools_dump_subsetting_header(FILE *stream, const h5tool_format_t *info,
     h5tools_print_dims(&buffer, sset->stride.data, dims);
     h5tools_str_append(&buffer, "%s %s", h5tools_dump_header_format->strideend, h5tools_dump_header_format->strideblockend);
     h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
-    
+
     ctx->need_prefix = TRUE;
     h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
 
@@ -3720,7 +3878,7 @@ h5tools_dump_subsetting_header(FILE *stream, const h5tool_format_t *info,
 
     h5tools_str_append(&buffer, "%s %s", h5tools_dump_header_format->countend, h5tools_dump_header_format->countblockend);
     h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
-    
+
     ctx->need_prefix = TRUE;
     h5tools_simple_prefix(stream, info, ctx, (hsize_t)0, 0);
 
@@ -3734,7 +3892,7 @@ h5tools_dump_subsetting_header(FILE *stream, const h5tool_format_t *info,
 
     h5tools_str_append(&buffer, "%s %s", h5tools_dump_header_format->blockend, h5tools_dump_header_format->blockblockend);
     h5tools_render_element(stream, info, ctx, &buffer, &curr_pos, (size_t)ncols, (hsize_t)0, (hsize_t)0);
-    
+
     ctx->indent_level--;
 
     h5tools_str_close(&buffer);
@@ -3751,7 +3909,7 @@ h5tools_dump_subsetting_header(FILE *stream, const h5tool_format_t *info,
  */
 void
 h5tools_dump_data(FILE *stream, const h5tool_format_t *info,
-        h5tools_context_t *ctx, hid_t obj_id, int obj_data, struct subset_t *sset, 
+        h5tools_context_t *ctx, hid_t obj_id, int obj_data, struct subset_t *sset,
         int display_index, int display_char)
 {
     H5S_class_t space_type;
@@ -3814,10 +3972,10 @@ h5tools_dump_data(FILE *stream, const h5tool_format_t *info,
 
         h5tools_dump_subsetting_header(stream, &outputformat, ctx, sset, H5Sget_simple_extent_ndims(f_space));
         H5Sclose(f_space);
-        
+
         ctx->indent_level++;
     }
-    
+
     ctx->need_prefix = TRUE;
     h5tools_str_reset(&buffer);
     h5tools_str_append(&buffer, "%s %s", h5tools_dump_header_format->databegin, h5tools_dump_header_format->datablockbegin);
@@ -3843,7 +4001,7 @@ h5tools_dump_data(FILE *stream, const h5tool_format_t *info,
             datactx.indent_level++;
             datactx.need_prefix = TRUE;
             h5tools_simple_prefix(stream, info, &datactx, (hsize_t)0, 0);
-            
+
             string_dataformat = *info;
             string_dataformat.idx_fmt = "\"";
             string_dataformat.line_multi_new = 1;
@@ -3911,7 +4069,7 @@ h5tools_dump_data(FILE *stream, const h5tool_format_t *info,
                         datactx.indent_level++;
                         datactx.need_prefix = TRUE;
                         h5tools_simple_prefix(stream, info, &datactx, (hsize_t)0, 0);
-                        
+
                         string_dataformat = *info;
                         string_dataformat.idx_fmt = "\"";
                         string_dataformat.line_multi_new = 1;
@@ -3938,7 +4096,7 @@ h5tools_dump_data(FILE *stream, const h5tool_format_t *info,
                     H5Dvlen_reclaim(p_type, space, H5P_DEFAULT, buf);
 
                 HDfree(buf);
-            } 
+            }
             else
                 status = SUCCEED;
 
@@ -3968,10 +4126,10 @@ h5tools_dump_data(FILE *stream, const h5tool_format_t *info,
 
     if (sset && obj_data) {
         ctx->indent_level--;
-     
+
         ctx->need_prefix = TRUE;
         h5tools_simple_prefix(stream, &outputformat, ctx, (hsize_t)0, 0);
-        
+
         h5tools_str_reset(&buffer);
         if(HDstrlen(h5tools_dump_header_format->subsettingblockend)) {
             h5tools_str_append(&buffer, "%s", h5tools_dump_header_format->subsettingblockend);
diff --git a/tools/lib/h5tools_error.h b/tools/lib/h5tools_error.h
index ae549fd..749157e 100644
--- a/tools/lib/h5tools_error.h
+++ b/tools/lib/h5tools_error.h
@@ -98,7 +98,7 @@ H5TOOLS_DLLVAR hid_t H5E_tools_min_id_g;
  * to the `catch_except' label, if we're not already past it.
  */
 #define H5E_THROW(fail_value, min_id, str) {        \
-    HERROR(H5E_tools_g, min_id, str);                 \
+    H5Epush2(H5tools_ERR_STACK_g, __FILE__, FUNC, __LINE__, H5tools_ERR_CLS_g, H5E_tools_g, min_id, str);     \
     H5_LEAVE(fail_value)                            \
 }
 
diff --git a/tools/lib/h5tools_ref.c b/tools/lib/h5tools_ref.c
index 3a4183b..60666f1 100644
--- a/tools/lib/h5tools_ref.c
+++ b/tools/lib/h5tools_ref.c
@@ -65,7 +65,7 @@ free_ref_path_info(void *item, void H5_ATTR_UNUSED *key, void H5_ATTR_UNUSED *op
 {
     ref_path_node_t *node = (ref_path_node_t *)item;
 
-    HDfree((void *)node->path);
+    HDfree(node->path);
     HDfree(node);
 
     return(0);
@@ -218,7 +218,7 @@ ref_path_table_put(const char *path, haddr_t objno)
     HDassert(ref_path_table);
     HDassert(path);
 
-    if((new_node = HDmalloc(sizeof(ref_path_node_t))) == NULL)
+    if((new_node = (ref_path_node_t *)HDmalloc(sizeof(ref_path_node_t))) == NULL)
         return(-1);
 
     new_node->objno = objno;
@@ -300,7 +300,7 @@ lookup_ref_path(haddr_t ref)
     if(ref_path_table == NULL)
         init_ref_path_table();
 
-    node = H5SL_search(ref_path_table, &ref);
+    node = (ref_path_node_t *)H5SL_search(ref_path_table, &ref);
 
     return(node ? node->path : NULL);
 }
diff --git a/tools/lib/h5tools_str.c b/tools/lib/h5tools_str.c
index 1142424..5477f91 100644
--- a/tools/lib/h5tools_str.c
+++ b/tools/lib/h5tools_str.c
@@ -29,6 +29,15 @@
 #include "h5tools_ref.h"
 #include "h5tools_str.h"        /*function prototypes       */
 
+/* Copied from hl/src/H5LDprivate.h */
+/* Info about the list of comma-separated compound fields */
+typedef struct H5LD_memb_t {
+   size_t tot_offset;
+   size_t last_tsize;
+   hid_t last_tid;
+   char **names;
+} H5LD_memb_t;
+
 /*
  * If REPEAT_VERBOSE is defined then character strings will be printed so
  * that repeated character sequences like "AAAAAAAAAA" are displayed as
@@ -267,6 +276,9 @@ h5tools_str_fmt(h5tools_str_t *str/*in,out*/, size_t start, const char *fmt)
 {
     char _temp[1024], *temp = _temp;
 
+    HDassert(str);
+    HDassert(fmt);
+
     /* If the format string is simply "%s" then don't bother doing anything */
     if (!HDstrcmp(fmt, "%s"))
         return str->s;
@@ -413,9 +425,9 @@ h5tools_str_region_prefix(h5tools_str_t *str, const h5tool_format_t *info,
 }
 
 /*-------------------------------------------------------------------------
- * Function:    h5tools_str_dump_region_blocks
+ * Function:    h5tools_str_dump_space_slabs
  *
- * Purpose: Prints information about a dataspace region by appending
+ * Purpose: Prints information about a dataspace selection by appending
  *          the information to the specified string.
  *
  * Return:  none
@@ -426,19 +438,85 @@ h5tools_str_region_prefix(h5tools_str_t *str, const h5tool_format_t *info,
  *-------------------------------------------------------------------------
  */
 void
-h5tools_str_dump_region_blocks(h5tools_str_t *str, hid_t region,
+h5tools_str_dump_space_slabs(h5tools_str_t *str, hid_t rspace,
+        const h5tool_format_t *info, h5tools_context_t *ctx)
+{
+    hsize_t   start[H5S_MAX_RANK];
+    hsize_t   stride[H5S_MAX_RANK];
+    hsize_t   count[H5S_MAX_RANK];
+    hsize_t   block[H5S_MAX_RANK];
+    int       j;
+    int       ndims = H5Sget_simple_extent_ndims(rspace);
+
+    H5Sget_regular_hyperslab(rspace, start, stride, count, block);
+
+    /* Print hyperslab information */
+
+    /* Start coordinates */
+    h5tools_str_append(str, "%s%s ", info->line_indent, START);
+    for (j = 0; j < ndims; j++)
+        h5tools_str_append(str, "%s" HSIZE_T_FORMAT, j ? "," : "(", start[j]);
+    h5tools_str_append(str, ")");
+    h5tools_str_append(str, "%s", "\n");
+    h5tools_str_indent(str, info, ctx);
+
+    /* Stride coordinates */
+    h5tools_str_append(str, "%s ", STRIDE);
+    for (j = 0; j < ndims; j++)
+        h5tools_str_append(str, "%s" HSIZE_T_FORMAT, j ? "," : "(", stride[j]);
+    h5tools_str_append(str, ")");
+    h5tools_str_append(str, "%s", "\n");
+    h5tools_str_indent(str, info, ctx);
+
+    /* Count coordinates */
+    h5tools_str_append(str, "%s ", COUNT);
+    for (j = 0; j < ndims; j++) {
+        if(count[j] == H5S_UNLIMITED)
+            h5tools_str_append(str, "%s%s", j ? "," : "(","H5S_UNLIMITED");
+        else
+            h5tools_str_append(str, "%s" HSIZE_T_FORMAT, j ? "," : "(", count[j]);
+    }
+    h5tools_str_append(str, ")");
+    h5tools_str_append(str, "%s", "\n");
+    h5tools_str_indent(str, info, ctx);
+
+    /* Block coordinates */
+    h5tools_str_append(str, "%s ", BLOCK);
+    for (j = 0; j < ndims; j++) {
+        if(block[j] == H5S_UNLIMITED)
+            h5tools_str_append(str, "%s%s", j ? "," : "(","H5S_UNLIMITED");
+        else
+            h5tools_str_append(str, "%s" HSIZE_T_FORMAT, j ? "," : "(", block[j]);
+    }
+    h5tools_str_append(str, ")");
+}
+
+/*-------------------------------------------------------------------------
+ * Function:    h5tools_str_dump_space_blocks
+ *
+ * Purpose: Prints information about a dataspace selection by appending
+ *          the information to the specified string.
+ *
+ * Return:  none
+ *
+ * In/Out:
+ *      h5tools_str_t     *str
+ *-------------------------------------------------------------------------
+ */
+void
+h5tools_str_dump_space_blocks(h5tools_str_t *str, hid_t rspace,
         const h5tool_format_t *info)
 {
     hssize_t   nblocks;
     hsize_t    alloc_size;
     hsize_t   *ptdata;
-    int        ndims = H5Sget_simple_extent_ndims(region);
+    int        ndims = H5Sget_simple_extent_ndims(rspace);
 
     /*
-     * This function fails if the region does not have blocks.
+     * This function fails if the rspace does not have blocks.
      */
     H5E_BEGIN_TRY {
-        nblocks = H5Sget_select_hyper_nblocks(region);
+        nblocks = H5Sget_select_hyper_nblocks(rspace);
     } H5E_END_TRY;
 
     /* Print block information */
@@ -449,13 +527,12 @@ h5tools_str_dump_region_blocks(h5tools_str_t *str, hid_t region,
         HDassert(alloc_size == (hsize_t) ((size_t) alloc_size)); /*check for overflow*/
         ptdata = (hsize_t *)HDmalloc((size_t) alloc_size);
         H5_CHECK_OVERFLOW(nblocks, hssize_t, hsize_t);
-        H5Sget_select_hyper_blocklist(region, (hsize_t)0, (hsize_t)nblocks, ptdata);
+        H5Sget_select_hyper_blocklist(rspace, (hsize_t)0, (hsize_t)nblocks, ptdata);
 
         for (i = 0; i < nblocks; i++) {
             int j;
 
-            h5tools_str_append(str, info->dset_blockformat_pre, i ? "," OPTIONAL_LINE_BREAK " " : "",
-                               (unsigned long)i);
+            h5tools_str_append(str, info->dset_blockformat_pre, i ? "," OPTIONAL_LINE_BREAK " " : "", (unsigned long)i);
 
             /* Start coordinates and opposite corner */
             for (j = 0; j < ndims; j++)
@@ -474,32 +551,31 @@ h5tools_str_dump_region_blocks(h5tools_str_t *str, hid_t region,
 }
 
 /*-------------------------------------------------------------------------
- * Function:    h5tools_str_dump_region_points
+ * Function:    h5tools_str_dump_space_points
  *
- * Purpose: Prints information about a dataspace region by appending
+ * Purpose: Prints information about a dataspace selection by appending
  *          the information to the specified string.
  *
  * Return:  none
  *
  * In/Out:
- *      h5tools_context_t *ctx
  *      h5tools_str_t     *str
  *-------------------------------------------------------------------------
  */
 void
-h5tools_str_dump_region_points(h5tools_str_t *str, hid_t region,
+h5tools_str_dump_space_points(h5tools_str_t *str, hid_t rspace,
         const h5tool_format_t *info)
 {
     hssize_t   npoints;
     hsize_t    alloc_size;
     hsize_t   *ptdata;
-    int        ndims = H5Sget_simple_extent_ndims(region);
+    int        ndims = H5Sget_simple_extent_ndims(rspace);
 
     /*
-     * This function fails if the region does not have points.
+     * This function fails if the rspace does not have points.
      */
     H5E_BEGIN_TRY {
-        npoints = H5Sget_select_elem_npoints(region);
+        npoints = H5Sget_select_elem_npoints(rspace);
     } H5E_END_TRY;
 
     /* Print point information */
@@ -510,7 +586,7 @@ h5tools_str_dump_region_points(h5tools_str_t *str, hid_t region,
         HDassert(alloc_size == (hsize_t) ((size_t) alloc_size)); /*check for overflow*/
         ptdata = (hsize_t *)HDmalloc((size_t) alloc_size);
         H5_CHECK_OVERFLOW(npoints, hssize_t, hsize_t);
-        H5Sget_select_elem_pointlist(region, (hsize_t)0, (hsize_t)npoints, ptdata);
+        H5Sget_select_elem_pointlist(rspace, (hsize_t)0, (hsize_t)npoints, ptdata);
 
         for (i = 0; i < npoints; i++) {
             int j;
@@ -667,6 +743,9 @@ h5tools_str_indent(h5tools_str_t *str, const h5tool_format_t *info,
  *  PVN, 28 March 2006
  *  added H5T_NATIVE_LDOUBLE case
  *
+ *  Vailin Choi; August 2010
+ *	Modified to handle printing of selected compound fields for h5watch.
+ *
  *  Raymond Lu, 2011-09-01
  *  CLANG compiler complained about the line (about 800):
  *    tempint = (tempint >> packed_data_offset) & packed_data_mask;
@@ -737,7 +816,7 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                     float tempfloat;
 
                     HDmemcpy(&tempfloat, vp, sizeof(float));
-                    h5tools_str_append(str, OPT(info->fmt_float, "%g"), tempfloat);
+                    h5tools_str_append(str, OPT(info->fmt_float, "%g"), (double)tempfloat);
                 }
                 else if (sizeof(double) == nsize) {
                     /* if (H5Tequal(type, H5T_NATIVE_DOUBLE)) */
@@ -965,7 +1044,57 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                 } /* end if (sizeof(long long) == nsize) */
                 break;
             case H5T_COMPOUND:
-                {
+                if(ctx->cmpd_listv) { /* there is <list_of_fields> */
+                    int save_indent_level;  	/* The indentation level */
+                    size_t curr_field;          /* Current field to display */
+                    int i = 0, x = 0; 		/* Local index variable */
+                    H5LD_memb_t **listv;  	/* Vector of information for <list_of_fields> */
+
+                    listv = ctx->cmpd_listv;	    
+                    ctx->cmpd_listv = NULL;
+
+                    h5tools_str_append(str, "%s", OPT(info->cmpd_pre, "{"));
+
+                    /* 
+                     * Go through the vector containing info about the comma-separated list of
+                     * compound fields and then members in each field: 
+                     *	   put in "{", "}", ",", member name and value accordingly.
+                     */
+                    save_indent_level = ctx->indent_level;
+                    for(curr_field = 0; listv[curr_field] != NULL; curr_field++) {
+                        if (curr_field)
+                            h5tools_str_append(str, "%s", OPT(info->cmpd_sep, ", "OPTIONAL_LINE_BREAK));
+                        else 
+                            h5tools_str_append(str, "%s", OPT(info->cmpd_end, ""));
+
+                        if(info->arr_linebreak)
+                            h5tools_str_indent(str, info, ctx);
+                        
+                        /* Process members of each field */
+                        for(i = 0; listv[curr_field]->names[i] != NULL; i++) {
+                            h5tools_str_append(str, OPT(info->cmpd_name, ""), listv[curr_field]->names[i]);
+                            if(i) {
+                                ctx->indent_level++;
+                                h5tools_str_append(str, "%s", OPT(info->cmpd_pre, "{"));
+                            }
+                        }
+                        h5tools_str_sprint(str, info, container, listv[curr_field]->last_tid, cp_vp + listv[curr_field]->tot_offset, ctx);
+                        if(ctx->indent_level > 0)
+                            for(x = ctx->indent_level; x > 0; x--)
+                                h5tools_str_append(str, "%s", OPT(info->cmpd_suf, "}"));
+                        ctx->indent_level = save_indent_level;
+                    }
+
+
+                    if(info->arr_linebreak) {
+                        h5tools_str_append(str, "%s", OPT(info->cmpd_end, ""));
+                        h5tools_str_indent(str, info, ctx);
+                    }
+                    h5tools_str_append(str, "%s", OPT(info->cmpd_suf, "}"));
+
+                    ctx->cmpd_listv = info->cmpd_listv;
+
+                } else {
                     unsigned j;
 
                     nmembs = H5Tget_nmembers(type);
@@ -1041,7 +1170,7 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                             H5O_info_t oi;
                             const char *path;
 
-                        obj = H5Rdereference(container, H5R_OBJECT, vp);
+                            obj = H5Rdereference2(container, H5P_DEFAULT, H5R_OBJECT, vp);
                             H5Oget_info(obj, &oi);
 
                             /* Print object type and close object */
@@ -1058,6 +1187,8 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                                     h5tools_str_append(str, H5_TOOLS_DATATYPE);
                                     break;
 
+                                case H5O_TYPE_UNKNOWN:
+                                case H5O_TYPE_NTYPES:
                                 default:
                                     h5tools_str_append(str, "%u-", (unsigned) oi.type);
                                     break;
@@ -1187,7 +1318,9 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                 }
                 break;
 
-            default:
+            case H5T_TIME:
+            case H5T_BITFIELD:
+            case H5T_OPAQUE:
                 {
                     /* All other types get printed as hexadecimal */
                     size_t i;
@@ -1200,6 +1333,12 @@ h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info, hid_t contai
                     }
                 }
                 break;
+
+            case H5T_NO_CLASS:
+            case H5T_NCLASSES:
+            default:
+                h5tools_str_append(str, "invalid datatype");
+                break;
         } /* end switch */
     }
     return h5tools_str_fmt(str, start, OPT(info->elmt_fmt, "%s"));
@@ -1222,7 +1361,7 @@ h5tools_str_sprint_region(h5tools_str_t *str, const h5tool_format_t *info,
     char    ref_name[1024];
     H5S_sel_type region_type;
 
-    obj = H5Rdereference(container, H5R_DATASET_REGION, vp);
+    obj = H5Rdereference2(container, H5P_DEFAULT, H5R_DATASET_REGION, vp);
     if (obj >= 0) {
         region = H5Rget_region(container, H5R_DATASET_REGION, vp);
         if (region >= 0) {
@@ -1234,9 +1373,9 @@ h5tools_str_sprint_region(h5tools_str_t *str, const h5tool_format_t *info,
 
             region_type = H5Sget_select_type(region);
             if(region_type==H5S_SEL_POINTS)
-                h5tools_str_dump_region_points(str, region, info);
+                h5tools_str_dump_space_points(str, region, info);
             else
-                h5tools_str_dump_region_blocks(str, region, info);
+                h5tools_str_dump_space_blocks(str, region, info);
 
             h5tools_str_append(str, "}");
 
@@ -1388,17 +1527,16 @@ h5tools_str_replace ( const char *string, const char *substr, const char *replac
 	char *head = NULL;
      
 	if ( substr == NULL || replacement == NULL ) 
-		return HDstrdup (string);
-		
+	    return HDstrdup (string);
 	newstr = HDstrdup (string);
 	head = newstr;
 	while ( (tok = HDstrstr ( head, substr ))){
 		oldstr = newstr;
-		newstr = HDmalloc ( HDstrlen ( oldstr ) - HDstrlen ( substr ) + HDstrlen ( replacement ) + 1 );
+		newstr = (char *)HDmalloc( HDstrlen( oldstr ) - HDstrlen( substr ) + HDstrlen( replacement ) + 1 );
 
         if ( newstr == NULL ){
-			HDfree (oldstr);
-			return NULL;
+	    HDfree (oldstr);
+	    return NULL;
         }
         HDmemcpy ( newstr, oldstr, tok - oldstr );
         HDmemcpy ( newstr + (tok - oldstr), replacement, HDstrlen ( replacement ) );
diff --git a/tools/lib/h5tools_str.h b/tools/lib/h5tools_str.h
index 38697c6..6173b89 100644
--- a/tools/lib/h5tools_str.h
+++ b/tools/lib/h5tools_str.h
@@ -40,8 +40,9 @@ H5TOOLS_DLL char    *h5tools_str_prefix(h5tools_str_t *str, const h5tool_format_
 H5TOOLS_DLL char    *h5tools_str_region_prefix(h5tools_str_t *str, const h5tool_format_t *info,
                                    hsize_t elmtno, hsize_t *ptdata, unsigned ndims, 
                                    hsize_t max_idx[], h5tools_context_t *ctx);
-H5TOOLS_DLL void     h5tools_str_dump_region_blocks(h5tools_str_t *, hid_t, const h5tool_format_t *);
-H5TOOLS_DLL void     h5tools_str_dump_region_points(h5tools_str_t *, hid_t, const h5tool_format_t *);
+H5TOOLS_DLL void     h5tools_str_dump_space_slabs(h5tools_str_t *, hid_t, const h5tool_format_t *, h5tools_context_t *ctx);
+H5TOOLS_DLL void     h5tools_str_dump_space_blocks(h5tools_str_t *, hid_t, const h5tool_format_t *);
+H5TOOLS_DLL void     h5tools_str_dump_space_points(h5tools_str_t *, hid_t, const h5tool_format_t *);
 H5TOOLS_DLL void     h5tools_str_sprint_region(h5tools_str_t *str, const h5tool_format_t *info, hid_t container,
                                    void *vp);
 H5TOOLS_DLL char    *h5tools_str_sprint(h5tools_str_t *str, const h5tool_format_t *info,
diff --git a/tools/lib/h5tools_type.c b/tools/lib/h5tools_type.c
index d68d3c5..8a56d29 100644
--- a/tools/lib/h5tools_type.c
+++ b/tools/lib/h5tools_type.c
@@ -13,6 +13,7 @@
  * access to either file, you may request a copy from help at hdfgroup.org.     *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
+#include "H5private.h"
 #include "h5tools.h"
 
 /*-------------------------------------------------------------------------
@@ -75,54 +76,54 @@ h5tools_get_little_endian_type(hid_t tid)
     size       = H5Tget_size(tid);
     sign       = H5Tget_sign(tid);
 
-    switch( type_class )
-    {
-    case H5T_INTEGER:
-    {
-        if ( size == 1 && sign == H5T_SGN_2)
-            p_type=H5Tcopy(H5T_STD_I8LE);
-        else if ( size == 2 && sign == H5T_SGN_2)
-            p_type=H5Tcopy(H5T_STD_I16LE);
-        else if ( size == 4 && sign == H5T_SGN_2)
-            p_type=H5Tcopy(H5T_STD_I32LE);
-        else if ( size == 8 && sign == H5T_SGN_2)
-            p_type=H5Tcopy(H5T_STD_I64LE);
-        else if ( size == 1 && sign == H5T_SGN_NONE)
-            p_type=H5Tcopy(H5T_STD_U8LE);
-        else if ( size == 2 && sign == H5T_SGN_NONE)
-            p_type=H5Tcopy(H5T_STD_U16LE);
-        else if ( size == 4 && sign == H5T_SGN_NONE)
-            p_type=H5Tcopy(H5T_STD_U32LE);
-        else if ( size == 8 && sign == H5T_SGN_NONE)
-            p_type=H5Tcopy(H5T_STD_U64LE);
-    }
-    break;
-
-    case H5T_FLOAT:
-        if ( size == 4)
-            p_type=H5Tcopy(H5T_IEEE_F32LE);
-        else if ( size == 8)
-            p_type=H5Tcopy(H5T_IEEE_F64LE);
-        break;
-
-    case H5T_TIME:
-    case H5T_BITFIELD:
-    case H5T_OPAQUE:
-    case H5T_STRING:
-    case H5T_COMPOUND:
-    case H5T_REFERENCE:
-    case H5T_ENUM:
-    case H5T_VLEN:
-    case H5T_ARRAY:
-        break;
-
-    default:
-        break;
-
-    }
-
-    return(p_type);
-}
+    switch(type_class) {
+        case H5T_INTEGER:
+            if ( size == 1 && sign == H5T_SGN_2)
+                p_type=H5Tcopy(H5T_STD_I8LE);
+            else if ( size == 2 && sign == H5T_SGN_2)
+                p_type=H5Tcopy(H5T_STD_I16LE);
+            else if ( size == 4 && sign == H5T_SGN_2)
+                p_type=H5Tcopy(H5T_STD_I32LE);
+            else if ( size == 8 && sign == H5T_SGN_2)
+                p_type=H5Tcopy(H5T_STD_I64LE);
+            else if ( size == 1 && sign == H5T_SGN_NONE)
+                p_type=H5Tcopy(H5T_STD_U8LE);
+            else if ( size == 2 && sign == H5T_SGN_NONE)
+                p_type=H5Tcopy(H5T_STD_U16LE);
+            else if ( size == 4 && sign == H5T_SGN_NONE)
+                p_type=H5Tcopy(H5T_STD_U32LE);
+            else if ( size == 8 && sign == H5T_SGN_NONE)
+                p_type=H5Tcopy(H5T_STD_U64LE);
+            break;
+
+        case H5T_FLOAT:
+            if ( size == 4)
+                p_type=H5Tcopy(H5T_IEEE_F32LE);
+            else if ( size == 8)
+                p_type=H5Tcopy(H5T_IEEE_F64LE);
+            break;
+
+        case H5T_TIME:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_STRING:
+        case H5T_COMPOUND:
+        case H5T_REFERENCE:
+        case H5T_ENUM:
+        case H5T_VLEN:
+        case H5T_ARRAY:
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+        default:
+            HDassert(0);
+            break;
+
+    } /* end switch */
+
+    return p_type;
+} /* end h5tools_get_little_endian_type() */
 
 
 /*-------------------------------------------------------------------------
@@ -152,53 +153,51 @@ h5tools_get_big_endian_type(hid_t tid)
     size       = H5Tget_size(tid);
     sign       = H5Tget_sign(tid);
 
-    switch( type_class )
-    {
-    case H5T_INTEGER:
-    {
-        if ( size == 1 && sign == H5T_SGN_2)
-            p_type=H5Tcopy(H5T_STD_I8BE);
-        else if ( size == 2 && sign == H5T_SGN_2)
-            p_type=H5Tcopy(H5T_STD_I16BE);
-        else if ( size == 4 && sign == H5T_SGN_2)
-            p_type=H5Tcopy(H5T_STD_I32BE);
-        else if ( size == 8 && sign == H5T_SGN_2)
-            p_type=H5Tcopy(H5T_STD_I64BE);
-        else if ( size == 1 && sign == H5T_SGN_NONE)
-            p_type=H5Tcopy(H5T_STD_U8BE);
-        else if ( size == 2 && sign == H5T_SGN_NONE)
-            p_type=H5Tcopy(H5T_STD_U16BE);
-        else if ( size == 4 && sign == H5T_SGN_NONE)
-            p_type=H5Tcopy(H5T_STD_U32BE);
-        else if ( size == 8 && sign == H5T_SGN_NONE)
-            p_type=H5Tcopy(H5T_STD_U64BE);
-    }
-    break;
-
-    case H5T_FLOAT:
-        if ( size == 4)
-            p_type=H5Tcopy(H5T_IEEE_F32BE);
-        else if ( size == 8)
-            p_type=H5Tcopy(H5T_IEEE_F64BE);
-        break;
-
-    case H5T_TIME:
-    case H5T_BITFIELD:
-    case H5T_OPAQUE:
-    case H5T_STRING:
-    case H5T_COMPOUND:
-    case H5T_REFERENCE:
-    case H5T_ENUM:
-    case H5T_VLEN:
-    case H5T_ARRAY:
-        break;
-
-    default:
-        break;
-
-    }
-
-
-    return(p_type);
-}
+    switch(type_class) {
+        case H5T_INTEGER:
+            if ( size == 1 && sign == H5T_SGN_2)
+                p_type=H5Tcopy(H5T_STD_I8BE);
+            else if ( size == 2 && sign == H5T_SGN_2)
+                p_type=H5Tcopy(H5T_STD_I16BE);
+            else if ( size == 4 && sign == H5T_SGN_2)
+                p_type=H5Tcopy(H5T_STD_I32BE);
+            else if ( size == 8 && sign == H5T_SGN_2)
+                p_type=H5Tcopy(H5T_STD_I64BE);
+            else if ( size == 1 && sign == H5T_SGN_NONE)
+                p_type=H5Tcopy(H5T_STD_U8BE);
+            else if ( size == 2 && sign == H5T_SGN_NONE)
+                p_type=H5Tcopy(H5T_STD_U16BE);
+            else if ( size == 4 && sign == H5T_SGN_NONE)
+                p_type=H5Tcopy(H5T_STD_U32BE);
+            else if ( size == 8 && sign == H5T_SGN_NONE)
+                p_type=H5Tcopy(H5T_STD_U64BE);
+            break;
+
+        case H5T_FLOAT:
+            if ( size == 4)
+                p_type=H5Tcopy(H5T_IEEE_F32BE);
+            else if ( size == 8)
+                p_type=H5Tcopy(H5T_IEEE_F64BE);
+            break;
+
+        case H5T_TIME:
+        case H5T_BITFIELD:
+        case H5T_OPAQUE:
+        case H5T_STRING:
+        case H5T_COMPOUND:
+        case H5T_REFERENCE:
+        case H5T_ENUM:
+        case H5T_VLEN:
+        case H5T_ARRAY:
+            break;
+
+        case H5T_NO_CLASS:
+        case H5T_NCLASSES:
+        default:
+            HDassert(0);
+            break;
+    } /* end switch */
+
+    return p_type;
+} /* end h5tools_get_big_endian_type() */
 
diff --git a/tools/lib/h5tools_utils.c b/tools/lib/h5tools_utils.c
index 572090b..a09a003 100644
--- a/tools/lib/h5tools_utils.c
+++ b/tools/lib/h5tools_utils.c
@@ -482,11 +482,10 @@ dump_table(char* tablename, table_t *table)
     unsigned u;
 
     PRINTSTREAM(rawoutstream,"%s: # of entries = %d\n", tablename,table->nobjs);
-    for (u = 0; u < table->nobjs; u++) {
+    for (u = 0; u < table->nobjs; u++)
         PRINTSTREAM(rawoutstream,"%a %s %d %d\n", table->objs[u].objno,
            table->objs[u].objname,
            table->objs[u].displayed, table->objs[u].recorded);
-    }
 }
 
 

@@ -613,7 +612,10 @@ find_objs_cb(const char *name, const H5O_info_t *oinfo, const char *already_seen
             } /* end if */
             break;
 
+        case H5O_TYPE_UNKNOWN:
+        case H5O_TYPE_NTYPES:
         default:
+            HDassert(0);
             break;
     } /* end switch */
 
diff --git a/tools/lib/io_timer.c b/tools/lib/io_timer.c
index b8d44de..b85133d 100644
--- a/tools/lib/io_timer.c
+++ b/tools/lib/io_timer.c
@@ -169,6 +169,10 @@ set_time(io_time_t *pt, timer_type t, int start_stop)
 		pt->total_time[HDF5_FILE_READ_CLOSE] += pt->mpi_timer[t] - pt->mpi_timer[HDF5_FINE_READ_FIXED_DIMS];
 	}
 	break;
+#else
+    case MPI_CLOCK:
+	    HDfprintf(stderr, "MPI clock set in serial library\n");
+	    return NULL;
 #endif /* H5_HAVE_PARALLEL */
     case SYS_CLOCK:
             if (start_stop == TSTART) {
@@ -197,11 +201,11 @@ set_time(io_time_t *pt, timer_type t, int start_stop)
 
             }
 	break;
+
     default:
-	HDfprintf(stderr, "Unknown time clock type (%d)\n", pt->type);
-	return (NULL);
-	break;
-    }
+	    HDfprintf(stderr, "Unknown time clock type (%d)\n", pt->type);
+	    return NULL;
+    } /* end switch */
 
 #if 0
     /* this does not belong here. Need fix in h5perf code when set_time() is called. -AKC- */
diff --git a/tools/misc/CMakeLists.txt b/tools/misc/CMakeLists.txt
index d53cdc8..088dbdf 100644
--- a/tools/misc/CMakeLists.txt
+++ b/tools/misc/CMakeLists.txt
@@ -52,6 +52,9 @@ if (BUILD_TESTING)
     target_link_libraries (h5repart_gentest ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
     set_target_properties (h5repart_gentest PROPERTIES FOLDER generator/tools)
     #add_test (NAME h5repart_gentest COMMAND $<TARGET_FILE:h5repart_gentest>)
+
+    add_subdirectory (${HDF5_TOOLS_MISC_SOURCE_DIR}/vds)
+
   endif (HDF5_BUILD_GENERATORS)
 
   add_executable (h5repart_test ${HDF5_TOOLS_MISC_SOURCE_DIR}/repart_test.c)
diff --git a/tools/misc/Makefile.am b/tools/misc/Makefile.am
index 882f8f2..bde6805 100644
--- a/tools/misc/Makefile.am
+++ b/tools/misc/Makefile.am
@@ -20,25 +20,31 @@
 
 include $(top_srcdir)/config/commence.am
 
+SUBDIRS=vds
+
 # Include src directory
 AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/tools/lib
 
-#test script and program
+#test scripts and programs
 TEST_PROG=h5repart_gentest talign
-TEST_SCRIPT=testh5repart.sh testh5mkgrp.sh
+TEST_SCRIPT=testh5repart.sh testh5mkgrp.sh testh5clear.sh
+
 
-check_PROGRAMS=$(TEST_PROG) repart_test
+check_PROGRAMS=$(TEST_PROG) repart_test clear_open_chk
 check_SCRIPTS=$(TEST_SCRIPT)
-SCRIPT_DEPEND=h5repart$(EXEEXT) h5mkgrp$(EXEEXT)
+SCRIPT_DEPEND=h5repart$(EXEEXT) h5mkgrp$(EXEEXT) h5clear$(EXEEXT)
+
 
 # These are our main targets, the tools
-bin_PROGRAMS=h5debug h5repart h5mkgrp
+bin_PROGRAMS=h5debug h5repart h5mkgrp h5clear
 bin_SCRIPTS=h5redeploy
+noinst_PROGRAMS=h5clear_gentest
 
 # Add h5debug, h5repart, and h5mkgrp specific linker flags here
 h5debug_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
 h5repart_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
 h5mkgrp_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+h5clear_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
 
 # Tell automake to clean h5redeploy script
 CLEANFILES=h5redeploy
@@ -49,7 +55,7 @@ CLEANFILES=h5redeploy
 CHECK_CLEANFILES+=*.h5 ../testfiles/fst_family*.h5 ../testfiles/scd_family*.h5
 
 # These were generated by configure.  Remove them only when distclean.
-DISTCLEANFILES=h5cc testh5repart.sh
+DISTCLEANFILES=h5cc testh5repart.sh testh5clear.sh
 
 # All programs rely on hdf5 library and h5tools library
 LDADD=$(LIBH5TOOLS) $(LIBHDF5)
diff --git a/tools/misc/Makefile.in b/tools/misc/Makefile.in
index 1b8e0eb..9cb0305 100644
--- a/tools/misc/Makefile.in
+++ b/tools/misc/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -33,7 +33,17 @@
 
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -96,36 +106,54 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(srcdir)/h5cc.in $(srcdir)/testh5mkgrp.sh.in \
-	$(srcdir)/testh5repart.sh.in $(top_srcdir)/bin/depcomp \
-	$(top_srcdir)/bin/test-driver
-check_PROGRAMS = $(am__EXEEXT_1) repart_test$(EXEEXT)
-bin_PROGRAMS = h5debug$(EXEEXT) h5repart$(EXEEXT) h5mkgrp$(EXEEXT)
+check_PROGRAMS = $(am__EXEEXT_1) repart_test$(EXEEXT) \
+	clear_open_chk$(EXEEXT)
+bin_PROGRAMS = h5debug$(EXEEXT) h5repart$(EXEEXT) h5mkgrp$(EXEEXT) \
+	h5clear$(EXEEXT)
+noinst_PROGRAMS = h5clear_gentest$(EXEEXT)
 TESTS = $(am__EXEEXT_1) $(TEST_SCRIPT)
 subdir = tools/misc
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
-CONFIG_CLEAN_FILES = h5cc testh5mkgrp.sh testh5repart.sh
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
+CONFIG_CLEAN_FILES = h5cc testh5clear.sh testh5mkgrp.sh \
+	testh5repart.sh
 CONFIG_CLEAN_VPATH_FILES =
 am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"
 am__EXEEXT_1 = h5repart_gentest$(EXEEXT) talign$(EXEEXT)
-PROGRAMS = $(bin_PROGRAMS)
-h5debug_SOURCES = h5debug.c
-h5debug_OBJECTS = h5debug.$(OBJEXT)
-h5debug_LDADD = $(LDADD)
-h5debug_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
+PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
+clear_open_chk_SOURCES = clear_open_chk.c
+clear_open_chk_OBJECTS = clear_open_chk.$(OBJEXT)
+clear_open_chk_LDADD = $(LDADD)
+clear_open_chk_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
 AM_V_lt = $(am__v_lt_ at AM_V@)
 am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
+h5clear_SOURCES = h5clear.c
+h5clear_OBJECTS = h5clear.$(OBJEXT)
+h5clear_LDADD = $(LDADD)
+h5clear_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
+h5clear_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(h5clear_LDFLAGS) $(LDFLAGS) -o $@
+h5clear_gentest_SOURCES = h5clear_gentest.c
+h5clear_gentest_OBJECTS = h5clear_gentest.$(OBJEXT)
+h5clear_gentest_LDADD = $(LDADD)
+h5clear_gentest_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
+h5debug_SOURCES = h5debug.c
+h5debug_OBJECTS = h5debug.$(OBJEXT)
+h5debug_LDADD = $(LDADD)
+h5debug_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
 h5debug_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
 	$(h5debug_LDFLAGS) $(LDFLAGS) -o $@
@@ -195,7 +223,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -217,15 +245,31 @@ AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = h5debug.c h5mkgrp.c h5repart.c h5repart_gentest.c \
-	repart_test.c talign.c
-DIST_SOURCES = h5debug.c h5mkgrp.c h5repart.c h5repart_gentest.c \
-	repart_test.c talign.c
+SOURCES = clear_open_chk.c h5clear.c h5clear_gentest.c h5debug.c \
+	h5mkgrp.c h5repart.c h5repart_gentest.c repart_test.c talign.c
+DIST_SOURCES = clear_open_chk.c h5clear.c h5clear_gentest.c h5debug.c \
+	h5mkgrp.c h5repart.c h5repart_gentest.c repart_test.c talign.c
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+	ctags-recursive dvi-recursive html-recursive info-recursive \
+	install-data-recursive install-dvi-recursive \
+	install-exec-recursive install-html-recursive \
+	install-info-recursive install-pdf-recursive \
+	install-ps-recursive install-recursive installcheck-recursive \
+	installdirs-recursive pdf-recursive ps-recursive \
+	tags-recursive uninstall-recursive
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive	\
+  distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+  $(RECURSIVE_TARGETS) \
+  $(RECURSIVE_CLEAN_TARGETS) \
+  $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+	check recheck distdir
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 # Read a list of newline-separated strings from the standard input,
 # and print each of them once, without duplicates.  Input order is
@@ -401,7 +445,6 @@ am__set_TESTS_bases = \
   bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
   bases=`echo $$bases`
 RECHECK_LOGS = $(TEST_LOGS)
-AM_RECURSIVE_TARGETS = check recheck
 TEST_SUITE_LOG = test-suite.log
 LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
 LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
@@ -420,7 +463,38 @@ am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
 TEST_LOGS = $(am__test_logs2:.sh.log=.log)
 SH_LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
 SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS)
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/h5cc.in \
+	$(srcdir)/testh5clear.sh.in $(srcdir)/testh5mkgrp.sh.in \
+	$(srcdir)/testh5repart.sh.in $(top_srcdir)/bin/depcomp \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+  dir0=`pwd`; \
+  sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+  sed_rest='s,^[^/]*/*,,'; \
+  sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+  sed_butlast='s,/*[^/]*$$,,'; \
+  while test -n "$$dir1"; do \
+    first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+    if test "$$first" != "."; then \
+      if test "$$first" = ".."; then \
+        dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+        dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+      else \
+        first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+        if test "$$first2" = "$$first"; then \
+          dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+        else \
+          dir2="../$$dir2"; \
+        fi; \
+        dir0="$$dir0"/"$$first"; \
+      fi; \
+    fi; \
+    dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+  done; \
+  reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
 AMTAR = @AMTAR@
@@ -439,7 +513,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -484,14 +557,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -501,13 +582,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -549,9 +629,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -694,24 +785,26 @@ TRACE = perl $(top_srcdir)/bin/trace
 # and scd_family*.h5 were created by setting the HDF5_NOCLEANUP variable.
 CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.h5 \
 	../testfiles/fst_family*.h5 ../testfiles/scd_family*.h5
+SUBDIRS = vds
 
-#test script and program
+#test scripts and programs
 TEST_PROG = h5repart_gentest talign
-TEST_SCRIPT = testh5repart.sh testh5mkgrp.sh
+TEST_SCRIPT = testh5repart.sh testh5mkgrp.sh testh5clear.sh
 check_SCRIPTS = $(TEST_SCRIPT)
-SCRIPT_DEPEND = h5repart$(EXEEXT) h5mkgrp$(EXEEXT)
+SCRIPT_DEPEND = h5repart$(EXEEXT) h5mkgrp$(EXEEXT) h5clear$(EXEEXT)
 bin_SCRIPTS = h5redeploy
 
 # Add h5debug, h5repart, and h5mkgrp specific linker flags here
 h5debug_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
 h5repart_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
 h5mkgrp_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
+h5clear_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
 
 # Tell automake to clean h5redeploy script
 CLEANFILES = h5redeploy
 
 # These were generated by configure.  Remove them only when distclean.
-DISTCLEANFILES = h5cc testh5repart.sh
+DISTCLEANFILES = h5cc testh5repart.sh testh5clear.sh
 
 # All programs rely on hdf5 library and h5tools library
 LDADD = $(LIBH5TOOLS) $(LIBHDF5)
@@ -740,7 +833,7 @@ TEST_PROG_CHKEXE = $(TEST_PROG:=.chkexe_)
 TEST_PROG_PARA_CHKEXE = $(TEST_PROG_PARA:=.chkexe_)
 TEST_SCRIPT_CHKSH = $(TEST_SCRIPT:=.chkexe_)
 TEST_SCRIPT_PARA_CHKSH = $(TEST_SCRIPT_PARA:=.chkexe_)
-all: all-am
+all: all-recursive
 
 .SUFFIXES:
 .SUFFIXES: .c .lo .log .o .obj .sh .sh$(EXEEXT) .trs
@@ -756,7 +849,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/misc/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign tools/misc/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -765,7 +857,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -777,6 +869,8 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 $(am__aclocal_m4_deps):
 h5cc: $(top_builddir)/config.status $(srcdir)/h5cc.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+testh5clear.sh: $(top_builddir)/config.status $(srcdir)/testh5clear.sh.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 testh5mkgrp.sh: $(top_builddir)/config.status $(srcdir)/testh5mkgrp.sh.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 testh5repart.sh: $(top_builddir)/config.status $(srcdir)/testh5repart.sh.in
@@ -840,6 +934,27 @@ clean-checkPROGRAMS:
 	echo " rm -f" $$list; \
 	rm -f $$list
 
+clean-noinstPROGRAMS:
+	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+clear_open_chk$(EXEEXT): $(clear_open_chk_OBJECTS) $(clear_open_chk_DEPENDENCIES) $(EXTRA_clear_open_chk_DEPENDENCIES) 
+	@rm -f clear_open_chk$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(clear_open_chk_OBJECTS) $(clear_open_chk_LDADD) $(LIBS)
+
+h5clear$(EXEEXT): $(h5clear_OBJECTS) $(h5clear_DEPENDENCIES) $(EXTRA_h5clear_DEPENDENCIES) 
+	@rm -f h5clear$(EXEEXT)
+	$(AM_V_CCLD)$(h5clear_LINK) $(h5clear_OBJECTS) $(h5clear_LDADD) $(LIBS)
+
+h5clear_gentest$(EXEEXT): $(h5clear_gentest_OBJECTS) $(h5clear_gentest_DEPENDENCIES) $(EXTRA_h5clear_gentest_DEPENDENCIES) 
+	@rm -f h5clear_gentest$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(h5clear_gentest_OBJECTS) $(h5clear_gentest_LDADD) $(LIBS)
+
 h5debug$(EXEEXT): $(h5debug_OBJECTS) $(h5debug_DEPENDENCIES) $(EXTRA_h5debug_DEPENDENCIES) 
 	@rm -f h5debug$(EXEEXT)
 	$(AM_V_CCLD)$(h5debug_LINK) $(h5debug_OBJECTS) $(h5debug_LDADD) $(LIBS)
@@ -905,6 +1020,9 @@ mostlyclean-compile:
 distclean-compile:
 	-rm -f *.tab.c
 
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/clear_open_chk.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5clear.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5clear_gentest.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5debug.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5mkgrp.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/h5repart.Po at am__quote@
@@ -939,14 +1057,61 @@ mostlyclean-libtool:
 clean-libtool:
 	-rm -rf .libs _libs
 
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+#     (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+	@fail=; \
+	if $(am__make_keepgoing); then \
+	  failcom='fail=yes'; \
+	else \
+	  failcom='exit 1'; \
+	fi; \
+	dot_seen=no; \
+	target=`echo $@ | sed s/-recursive//`; \
+	case "$@" in \
+	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+	  *) list='$(SUBDIRS)' ;; \
+	esac; \
+	for subdir in $$list; do \
+	  echo "Making $$target in $$subdir"; \
+	  if test "$$subdir" = "."; then \
+	    dot_seen=yes; \
+	    local_target="$$target-am"; \
+	  else \
+	    local_target="$$target"; \
+	  fi; \
+	  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+	  || eval $$failcom; \
+	done; \
+	if test "$$dot_seen" = "no"; then \
+	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+	fi; test -z "$$fail"
+
 ID: $(am__tagged_files)
 	$(am__define_uniq_tagged_files); mkid -fID $$unique
-tags: tags-am
+tags: tags-recursive
 TAGS: tags
 
 tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
 	set x; \
 	here=`pwd`; \
+	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+	  include_option=--etags-include; \
+	  empty_fix=.; \
+	else \
+	  include_option=--include; \
+	  empty_fix=; \
+	fi; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    test ! -f $$subdir/TAGS || \
+	      set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+	  fi; \
+	done; \
 	$(am__define_uniq_tagged_files); \
 	shift; \
 	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
@@ -959,7 +1124,7 @@ tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
 	      $$unique; \
 	  fi; \
 	fi
-ctags: ctags-am
+ctags: ctags-recursive
 
 CTAGS: ctags
 ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
@@ -972,7 +1137,7 @@ GTAGS:
 	here=`$(am__cd) $(top_builddir) && pwd` \
 	  && $(am__cd) $(top_srcdir) \
 	  && gtags -i $(GTAGS_ARGS) "$$here"
-cscopelist: cscopelist-am
+cscopelist: cscopelist-recursive
 
 cscopelist-am: $(am__tagged_files)
 	list='$(am__tagged_files)'; \
@@ -1021,7 +1186,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1180,24 +1345,50 @@ distdir: $(DISTFILES)
 	    || exit 1; \
 	  fi; \
 	done
+	@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+	  if test "$$subdir" = .; then :; else \
+	    $(am__make_dryrun) \
+	      || test -d "$(distdir)/$$subdir" \
+	      || $(MKDIR_P) "$(distdir)/$$subdir" \
+	      || exit 1; \
+	    dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+	    $(am__relativize); \
+	    new_distdir=$$reldir; \
+	    dir1=$$subdir; dir2="$(top_distdir)"; \
+	    $(am__relativize); \
+	    new_top_distdir=$$reldir; \
+	    echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+	    echo "     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+	    ($(am__cd) $$subdir && \
+	      $(MAKE) $(AM_MAKEFLAGS) \
+	        top_distdir="$$new_top_distdir" \
+	        distdir="$$new_distdir" \
+		am__remove_distdir=: \
+		am__skip_length_check=: \
+		am__skip_mode_fix=: \
+	        distdir) \
+	      || exit 1; \
+	  fi; \
+	done
 check-am: all-am
 	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(check_SCRIPTS)
 	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
-check: check-am
+check: check-recursive
 all-am: Makefile $(PROGRAMS) $(SCRIPTS) all-local
-installdirs:
+installdirs: installdirs-recursive
+installdirs-am:
 	for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"; do \
 	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
 
 install-am: all-am
 	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
 
-installcheck: installcheck-am
+installcheck: installcheck-recursive
 install-strip:
 	if test -z '$(STRIP)'; then \
 	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
@@ -1224,98 +1415,101 @@ distclean-generic:
 maintainer-clean-generic:
 	@echo "This command is intended for maintainers to use"
 	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
+clean: clean-recursive
 
 clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
-	clean-libtool mostlyclean-am
+	clean-libtool clean-noinstPROGRAMS mostlyclean-am
 
-distclean: distclean-am
+distclean: distclean-recursive
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
 	distclean-tags
 
-dvi: dvi-am
+dvi: dvi-recursive
 
 dvi-am:
 
-html: html-am
+html: html-recursive
 
 html-am:
 
-info: info-am
+info: info-recursive
 
 info-am:
 
 install-data-am:
 
-install-dvi: install-dvi-am
+install-dvi: install-dvi-recursive
 
 install-dvi-am:
 
 install-exec-am: install-binPROGRAMS install-binSCRIPTS \
 	install-exec-local
 
-install-html: install-html-am
+install-html: install-html-recursive
 
 install-html-am:
 
-install-info: install-info-am
+install-info: install-info-recursive
 
 install-info-am:
 
 install-man:
 
-install-pdf: install-pdf-am
+install-pdf: install-pdf-recursive
 
 install-pdf-am:
 
-install-ps: install-ps-am
+install-ps: install-ps-recursive
 
 install-ps-am:
 
 installcheck-am:
 
-maintainer-clean: maintainer-clean-am
+maintainer-clean: maintainer-clean-recursive
 	-rm -rf ./$(DEPDIR)
 	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
-mostlyclean: mostlyclean-am
+mostlyclean: mostlyclean-recursive
 
 mostlyclean-am: mostlyclean-compile mostlyclean-generic \
 	mostlyclean-libtool mostlyclean-local
 
-pdf: pdf-am
+pdf: pdf-recursive
 
 pdf-am:
 
-ps: ps-am
+ps: ps-recursive
 
 ps-am:
 
 uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
 	uninstall-local
 
-.MAKE: check-am install-am install-strip
-
-.PHONY: CTAGS GTAGS TAGS all all-am all-local check check-TESTS \
-	check-am clean clean-binPROGRAMS clean-checkPROGRAMS \
-	clean-generic clean-libtool cscopelist-am ctags ctags-am \
-	distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-binPROGRAMS \
-	install-binSCRIPTS install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-exec-local \
-	install-html install-html-am install-info install-info-am \
-	install-man install-pdf install-pdf-am install-ps \
-	install-ps-am install-strip installcheck installcheck-am \
-	installdirs maintainer-clean maintainer-clean-generic \
+.MAKE: $(am__recursive_targets) check-am install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \
+	check check-TESTS check-am clean clean-binPROGRAMS \
+	clean-checkPROGRAMS clean-generic clean-libtool \
+	clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \
+	distclean-compile distclean-generic distclean-libtool \
+	distclean-tags distdir dvi dvi-am html html-am info info-am \
+	install install-am install-binPROGRAMS install-binSCRIPTS \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-exec-local install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	installdirs-am maintainer-clean maintainer-clean-generic \
 	mostlyclean mostlyclean-compile mostlyclean-generic \
 	mostlyclean-libtool mostlyclean-local pdf pdf-am ps ps-am \
 	recheck tags tags-am uninstall uninstall-am \
 	uninstall-binPROGRAMS uninstall-binSCRIPTS uninstall-local
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/tools/misc/clear_open_chk.c b/tools/misc/clear_open_chk.c
new file mode 100644
index 0000000..f3e6ba3
--- /dev/null
+++ b/tools/misc/clear_open_chk.c
@@ -0,0 +1,72 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#include "hdf5.h"
+#include "H5private.h"
+#include "h5tools.h"
+
+static void usage(void);
+
+static void
+usage(void)
+{
+    HDfprintf(stdout, "\n");
+    HDfprintf(stdout, "Usage error!\n");
+    HDfprintf(stdout, "Usage: clear_open_chk filename\n");
+} /* usage() */
+
+/*-------------------------------------------------------------------------
+ * Function:	main
+ *
+ * Purpose:	To open the file which has zero or nonzero status_flags in 
+ *		the superblock.
+ *
+ * Return:	0 on success
+ *		1 on failure
+ *
+ * Programmer:	Vailin Choi; July 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(int argc, char *argv[])
+{
+    char *fname;	/* The HDF5 file name */
+    hid_t fid;		/* File ID */
+
+    /* Check the # of arguments */
+    if(argc != 2) {
+	usage();
+	return(EXIT_FAILURE);
+    }
+
+    /* Get the file name */
+    fname = HDstrdup(argv[1]);
+
+    /* Try opening the file */
+    if((fid = h5tools_fopen(fname, H5F_ACC_RDONLY, H5P_DEFAULT, NULL, NULL, (size_t)0)) < 0) {
+	HDfprintf(stderr, "clear_open_chk: unable to open the file\n");
+	return EXIT_FAILURE;
+    }
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0) {
+	HDfprintf(stderr, "clear_open_chk: cannot close the file\n");
+	return EXIT_FAILURE;
+    }
+
+    /* Return success */
+    return EXIT_SUCCESS;
+
+} /* main() */
diff --git a/tools/misc/h5clear.c b/tools/misc/h5clear.c
new file mode 100644
index 0000000..0be4f8f
--- /dev/null
+++ b/tools/misc/h5clear.c
@@ -0,0 +1,137 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Programmer:  
+ *
+ * Purpose:	
+ */
+
+#include "hdf5.h"
+#include "H5private.h"
+#include "h5tools.h"
+#include "h5tools_utils.h"
+
+/* Name of tool */
+#define PROGRAMNAME 	"h5clear"
+
+/* Make this private property (defined in H5Fprivate.h) available to h5clear. */
+#define H5F_ACS_CLEAR_STATUS_FLAGS_NAME            "clear_status_flags"
+
+/*-------------------------------------------------------------------------
+ * Function:    leave
+ *
+ * Purpose:     Close the tools library and exit
+ *
+ * Return:   	Does not return
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+leave(int ret)
+{
+    h5tools_close();
+    HDexit(ret);
+
+} /* leave() */
+
+/*-------------------------------------------------------------------------
+ * Function: 	usage
+ *
+ * Purpose: 	Prints a usage message
+ *
+ * Return: 	void
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+usage(void)
+{
+    HDfprintf(stdout, "usage: h5clear filename\n");
+
+} /* usage() */
+
+
+

+/*-------------------------------------------------------------------------
+ * Function:	main
+ *
+ * Purpose:	
+ *
+ * Return:	Success:
+ *		Failure:
+ *
+ * Programmer:	
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main (int argc, char *argv[])
+{
+    char *fname;		/* File name */
+    hbool_t clear = TRUE;  	/* To clear the status_flags in the file's superblock */
+    hid_t fapl = -1;   		/* File access property list */
+    hid_t fid = -1;		/* File ID */
+
+    h5tools_setprogname(PROGRAMNAME);
+    h5tools_setstatus(EXIT_SUCCESS);
+    
+    /* Disable the HDF5 library's error reporting */
+    H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
+
+    /* initialize h5tools lib */
+    h5tools_init();
+
+    /* Check for the # of arguments */
+    if(argc != 2) {
+        usage();
+        leave(EXIT_FAILURE);
+    }
+
+    /* Duplicate the file name */
+    fname = HDstrdup(argv[opt_ind]);
+
+    /* Get a copy of the file access property list */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) {
+        error_msg("H5Pcreate\n");
+        exit(EXIT_FAILURE);
+    }
+
+    /* Set to clear the status_flags in the file's superblock */
+    /* This is a private property used by h5clear only */
+    if(H5Pset(fapl, H5F_ACS_CLEAR_STATUS_FLAGS_NAME, &clear) < 0) {
+	error_msg("H5Pset\n");
+	exit(EXIT_FAILURE);
+    }
+
+    if((fid = h5tools_fopen(fname, H5F_ACC_RDWR, fapl, NULL, NULL, (size_t)0)) < 0) {
+	error_msg("h5tools_fopen\n");
+	exit(EXIT_FAILURE);
+    }
+
+    /* Close the file */
+    if(H5Fclose(fid) < 0) {
+	error_msg("H5Fclose\n");
+	exit(EXIT_FAILURE);
+    }
+
+    /* CLose the property list */
+    if(H5Pclose(fapl) < 0) {
+	error_msg("H5Pclose\n");
+	exit(EXIT_FAILURE);
+    }
+
+    return EXIT_SUCCESS;
+} /* main() */
diff --git a/tools/misc/h5clear_gentest.c b/tools/misc/h5clear_gentest.c
new file mode 100644
index 0000000..0f20c35
--- /dev/null
+++ b/tools/misc/h5clear_gentest.c
@@ -0,0 +1,174 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+#include "hdf5.h"
+#include "H5private.h"
+
+/* The HDF5 test files */
+const char *FILENAME[] = {
+    "h5clear_sec2_v3.h5",		/* 0 -- sec2 file with superblock version 3 */
+    "h5clear_log_v3.h5",		/* 1 -- log file with superblock veresion 3 */
+    "h5clear_sec2_v0.h5",		/* 2 -- sec2 file with superblock version 0 */
+    "h5clear_sec2_v2.h5"		/* 3 -- sec2 file with superblock version 2 */
+};
+
+#define KB 		1024U
+
+/*-------------------------------------------------------------------------
+ * Function:	main
+ *
+ * Purpose:	To create HDF5 files with non-zero status_flags in the superblock
+ *		via flushing and exiting without closing the library.
+ *
+ *		Due to file locking, status_flags in the superblock will be 
+ *		nonzero after H5Fcreate.  The library will clear status_flags
+ *		on file closing.  This program, after "H5Fcreate" the files,
+ *		exits without going through library closing. Thus, status_flags
+ *		for these files are not cleared.
+ *		The library will check consistency of status_flags when opening
+ *		a file with superblock >= v3 and will return error accordingly.
+ *		The library will not check status_flags when opening a file 
+ *		with < v3 superblock.
+ *
+ *		These files are used by "h5clear" to see if the tool clears
+ *		status_flags properly so users can open the files afterwards.
+ *
+ * Return:	Success:	0
+ *		Failure:	1
+ *
+ * Programmer:	Vailin Choi; July 2013
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main(void)
+{
+    hid_t fid;			/* File ID */
+    hid_t fcpl;			/* File creation property list */
+    hid_t fapl, new_fapl;	/* File access property lists */
+    char fname[512];		/* File name */
+    unsigned new_format;		/* To use latest library format or not */
+
+    /* Create a copy of the file access property list */
+    if((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0)
+	goto error;
+
+    /* Copy the file access property list */
+    if((new_fapl = H5Pcopy(fapl)) < 0)
+	goto error;
+    /* Set to latest library format */
+    if(H5Pset_libver_bounds(new_fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0)
+	goto error;
+
+    /* Files created within this for loop will have v3 superblock and nonzero status_flags */
+    for(new_format = FALSE; new_format <= TRUE; new_format++) {
+	hid_t fapl2, my_fapl;	/* File access property lists */
+
+	/* Set to use the appropriate file access property list */
+	if(new_format)
+	    fapl2 = new_fapl;
+	else
+	    fapl2 = fapl;
+	/*
+	 * Create a sec2 file
+	 */
+	if((my_fapl = H5Pcopy(fapl2)) < 0)
+	    goto error;
+	/* Create the file */
+	sprintf(fname, "%s%s", new_format? "latest_":"", FILENAME[0]);
+	if((fid = H5Fcreate(fname, H5F_ACC_TRUNC | (new_format ? 0 : H5F_ACC_SWMR_WRITE), H5P_DEFAULT, my_fapl)) < 0) 
+	    goto error;
+
+	/* Flush the file */
+	if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+	    goto error;
+    
+	/* Close the property list */
+	if(H5Pclose(my_fapl) < 0)
+	    goto error;
+
+	/*
+	 * Create a log file
+	 */
+	/* Create a copy of file access property list */
+	if((my_fapl = H5Pcopy(fapl2)) < 0)
+	    goto error;
+
+	/* Setup the fapl for the log driver */
+	if(H5Pset_fapl_log(my_fapl, "append.log", (unsigned long long)H5FD_LOG_ALL, (size_t)(4 * KB)) < 0)
+	    goto error;
+
+	/* Create the file */
+	sprintf(fname, "%s%s", new_format? "latest_":"", FILENAME[1]);
+	if((fid = H5Fcreate(fname, H5F_ACC_TRUNC | (new_format ? 0 : H5F_ACC_SWMR_WRITE), H5P_DEFAULT, my_fapl)) < 0) 
+	    goto error;
+
+	/* Flush the file */
+	if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+	    goto error;
+
+	/* Close the property list */
+	if(H5Pclose(my_fapl) < 0)
+	    goto error;
+
+    } /* end for */
+
+    /* 
+     * Create a sec2 file with v0 superblock but nonzero status_flags
+     */
+    if((fid = H5Fcreate(FILENAME[2], H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) 
+	goto error;
+
+    /* Flush the file */
+    if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+	goto error;
+
+
+    /* 
+     * Create a sec2 file with v2 superblock but nonzero status_flags
+     */
+    if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0)
+	goto error;
+    if(H5Pset_shared_mesg_nindexes(fcpl, 1) < 0)
+        goto error;
+    if(H5Pset_shared_mesg_index(fcpl, 0, H5O_SHMESG_DTYPE_FLAG, 50) < 0)
+        goto error;
+
+    if((fid = H5Fcreate(FILENAME[3], H5F_ACC_TRUNC, fcpl, fapl)) < 0) 
+	goto error;
+
+    /* Flush the file */
+    if(H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0)
+	goto error;
+
+    
+    /* Close the property lists */
+    if(H5Pclose(fapl) < 0)
+	goto error;
+    if(H5Pclose(new_fapl) < 0)
+	goto error;
+    if(H5Pclose(fcpl) < 0)
+	goto error;
+
+    fflush(stdout);
+    fflush(stderr);
+
+    /* Not going through library closing by calling _exit(0) with success */
+    HD_exit(0);
+
+error:
+
+    /* Exit with failure */
+    HD_exit(1);
+}
diff --git a/tools/misc/h5debug.c b/tools/misc/h5debug.c
index 9c9153a..aac14db 100644
--- a/tools/misc/h5debug.c
+++ b/tools/misc/h5debug.c
@@ -23,21 +23,27 @@
  *
  *-------------------------------------------------------------------------
  */
-#define H5A_PACKAGE     /*suppress error about including H5Apkg  */
-#define H5B2_PACKAGE    /*suppress error about including H5B2pkg */
-#define H5B2_TESTING    /*suppress warning about H5B2 testing funcs*/
-#define H5D_PACKAGE     /*suppress error about including H5Dpkg  */
-#define H5F_PACKAGE     /*suppress error about including H5Fpkg  */
-#define H5G_PACKAGE     /*suppress error about including H5Gpkg  */
-#define H5HF_PACKAGE    /*suppress error about including H5HFpkg */
-#define H5O_PACKAGE     /*suppress error about including H5Opkg  */
-#define H5SM_PACKAGE    /*suppress error about including H5SMpkg */
+#define H5A_FRIEND		/*suppress error about including H5Apkg  */
+#define H5B2_FRIEND		/*suppress error about including H5B2pkg */
+#define H5B2_TESTING		/*suppress warning about H5B2 testing funcs*/
+#define H5D_FRIEND		/*suppress error about including H5Dpkg  */
+#define H5EA_FRIEND		/*suppress error about including H5EApkg */
+#define H5EA_TESTING		/*suppress warning about H5EA testing funcs*/
+#define H5FA_FRIEND		/*suppress error about including H5FApkg */
+#define H5FA_TESTING		/*suppress warning about H5FA testing funcs*/
+#define H5F_FRIEND		/*suppress error about including H5Fpkg  */
+#define H5G_FRIEND		/*suppress error about including H5Gpkg  */
+#define H5HF_FRIEND		/*suppress error about including H5HFpkg */
+#define H5O_FRIEND		/*suppress error about including H5Opkg  */
+#define H5SM_FRIEND		/*suppress error about including H5SMpkg */
 
 #include "H5private.h"  /* Generic Functions    */
 #include "H5Apkg.h"     /* Attributes           */
 #include "H5B2pkg.h"    /* v2 B-trees           */
 #include "H5Dpkg.h"     /* Datasets             */
 #include "H5Eprivate.h" /* Error handling       */
+#include "H5EApkg.h"    /* Extensible Arrays    */
+#include "H5FApkg.h"    /* Fixed Arrays         */
 #include "H5Fpkg.h"     /* File access          */
 #include "H5FSprivate.h" /* Free space manager  */
 #include "H5Gpkg.h"     /* Groups               */
@@ -50,22 +56,21 @@
 /* File drivers */
 #include "H5FDfamily.h"
 
-#define INDENT  3
 #define VCOL    50
 
 

 /*-------------------------------------------------------------------------
  * Function:    get_H5B2_class
  *
- * Purpose:	Determine the v2 B-tree class from the buffer read in.
+ * Purpose:  Determine the v2 B-tree class from the buffer read in.
  *              B-trees are debugged through the B-tree subclass.  The subclass
  *              identifier is two bytes after the B-tree signature.
  *
- * Return:	Non-NULL on success/NULL on failure
+ * Return:  Non-NULL on success/NULL on failure
  *
- * Programmer:	Quincey Koziol
- *		koziol at hdfgroup.org
- *		Sep 11 2008
+ * Programmer:  Quincey Koziol
+ *    koziol at hdfgroup.org
+ *    Sep 11 2008
  *
  *-------------------------------------------------------------------------
  */
@@ -116,8 +121,17 @@ get_H5B2_class(const uint8_t *sig)
             cls = H5A_BT2_CORDER;
             break;
 
+        case H5B2_CDSET_ID:
+            cls = H5D_BT2;
+            break;
+
+        case H5B2_CDSET_FILT_ID:
+            cls = H5D_BT2_FILT;
+            break;
+
+        case H5B2_NUM_BTREE_ID:
         default:
-            HDfprintf(stderr, "Unknown B-tree subtype %u\n", (unsigned)(subtype));
+            HDfprintf(stderr, "Unknown v2 B-tree subtype %u\n", (unsigned)(subtype));
             HDexit(4);
     } /* end switch */
 
@@ -126,6 +140,94 @@ get_H5B2_class(const uint8_t *sig)
 
 

 /*-------------------------------------------------------------------------
+ * Function:    get_H5EA_class
+ *
+ * Purpose:  Determine the extensible array class from the buffer read in.
+ *              Extensible arrays are debugged through the array subclass.
+ *              The subclass identifier is two bytes after the signature.
+ *
+ * Return:  Non-NULL on success/NULL on failure
+ *
+ * Programmer:  Quincey Koziol
+ *    koziol at hdfgroup.org
+ *    Sep 11 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static const H5EA_class_t *
+get_H5EA_class(const uint8_t *sig)
+{
+    H5EA_cls_id_t clsid = (H5EA_cls_id_t)sig[H5_SIZEOF_MAGIC + 1];
+    const H5EA_class_t *cls;
+
+    switch(clsid) {
+        case H5EA_CLS_TEST_ID:
+            cls = H5EA_CLS_TEST;
+            break;
+
+        case H5EA_CLS_CHUNK_ID:
+            cls = H5EA_CLS_CHUNK;
+            break;
+
+        case H5EA_CLS_FILT_CHUNK_ID:
+            cls = H5EA_CLS_FILT_CHUNK;
+            break;
+
+        case H5EA_NUM_CLS_ID:
+        default:
+            HDfprintf(stderr, "Unknown extensible array class %u\n", (unsigned)(clsid));
+            HDexit(4);
+    } /* end switch */
+
+    return(cls);
+} /* end get_H5EA_class() */
+
+

+/*-------------------------------------------------------------------------
+ * Function:    get_H5FA_class
+ *
+ * Purpose:  Determine the fixed array class from the buffer read in.
+ *              Extensible arrays are debugged through the array subclass.
+ *              The subclass identifier is two bytes after the signature.
+ *
+ * Return:  Non-NULL on success/NULL on failure
+ *
+ * Programmer:  Quincey Koziol
+ *    koziol at hdfgroup.org
+ *    Sep 11 2008
+ *
+ *-------------------------------------------------------------------------
+ */
+static const H5FA_class_t *
+get_H5FA_class(const uint8_t *sig)
+{
+    H5FA_cls_id_t clsid = (H5FA_cls_id_t)sig[H5_SIZEOF_MAGIC + 1];
+    const H5FA_class_t *cls;
+
+    switch(clsid) {
+        case H5FA_CLS_TEST_ID:
+            cls = H5FA_CLS_TEST;
+            break;
+
+        case H5FA_CLS_CHUNK_ID:
+            cls = H5FA_CLS_CHUNK;
+            break;
+
+        case H5FA_CLS_FILT_CHUNK_ID:
+            cls = H5FA_CLS_FILT_CHUNK;
+            break;
+
+        case H5FA_NUM_CLS_ID: 
+        default:
+            HDfprintf(stderr, "Unknown fixed array class %u\n", (unsigned)(clsid));
+            HDexit(4);
+    } /* end switch */
+
+    return(cls);
+} /* end get_H5FA_class() */
+
+

+/*-------------------------------------------------------------------------
  * Function:    main
  *
  * Usage:       debug FILENAME [OFFSET]
@@ -143,7 +245,7 @@ get_H5B2_class(const uint8_t *sig)
 int
 main(int argc, char *argv[])
 {
-    hid_t	fid, fapl, dxpl;
+    hid_t  fid, fapl, dxpl;
     H5F_t       *f;
     haddr_t     addr = 0, extra = 0, extra2 = 0, extra3 = 0, extra4 = 0;
     uint8_t     sig[H5F_SIGNATURE_LEN];
@@ -186,6 +288,12 @@ main(int argc, char *argv[])
         HDexit(2);
     } /* end if */
 
+    /* Ignore metadata tags while using h5debug */
+    if(H5AC_ignore_tags(f) < 0) {
+        HDfprintf(stderr, "cannot ignore metadata tags\n");
+        HDexit(1);
+    }
+
     /*
      * Parse command arguments.
      */
@@ -248,6 +356,7 @@ main(int argc, char *argv[])
          */
         H5B_subid_t subtype = (H5B_subid_t)sig[H5_SIZEOF_MAGIC];
         unsigned    ndims;
+        uint32_t    dim[H5O_LAYOUT_NDIMS];
 
         switch(subtype) {
             case H5B_SNODE_ID:
@@ -256,6 +365,7 @@ main(int argc, char *argv[])
                     HDfprintf(stderr, "\nWarning: Providing the group's local heap address will give more information\n");
                     HDfprintf(stderr, "B-tree symbol table node usage:\n");
                     HDfprintf(stderr, "\th5debug <filename> <B-tree node address> <address of local heap>\n\n");
+                    HDexit(4);
                 } /* end if */
 
                 status = H5G_node_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, extra);
@@ -266,16 +376,42 @@ main(int argc, char *argv[])
                 if(extra == 0) {
                     HDfprintf(stderr, "ERROR: Need number of dimensions of chunk in order to dump chunk B-tree node\n");
                     HDfprintf(stderr, "B-tree chunked storage node usage:\n");
-                    HDfprintf(stderr, "\th5debug <filename> <B-tree node address> <# of dimensions>\n");
+                    HDfprintf(stderr, "\th5debug <filename> <B-tree node address> <# of dimensions> <slowest chunk dim>...<fastest chunk dim>\n");
                     HDexit(4);
                 } /* end if */
 
+                /* Build array of chunk dimensions */
                 ndims = (unsigned)extra;
-                status = H5D_btree_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, ndims);
+                dim[0] = (uint32_t)extra2;
+                if(ndims > 1)
+                    dim[1] = (uint32_t)extra3;
+                if(ndims > 2)
+                    dim[2] = (uint32_t)extra4;
+
+                /* Check for dimension error */
+                if(ndims > 3) {
+                    HDfprintf(stderr, "ERROR: Only 3 dimensions support currently (fix h5debug)\n");
+                    HDfprintf(stderr, "B-tree chunked storage node usage:\n");
+                    HDfprintf(stderr, "\th5debug <filename> <B-tree node address> <# of dimensions> <slowest chunk dim>...<fastest chunk dim>\n");
+                    HDexit(4);
+                } /* end for */
+                for(u = 0; u < ndims; u++)
+                    if(0 == dim[u]) {
+                        HDfprintf(stderr, "ERROR: Chunk dimensions should be >0\n");
+                        HDfprintf(stderr, "B-tree chunked storage node usage:\n");
+                        HDfprintf(stderr, "\th5debug <filename> <B-tree node address> <# of dimensions> <slowest chunk dim>...<fastest chunk dim>\n");
+                        HDexit(4);
+                    } /* end if */
+
+                /* Set the last dimension (the element size) to zero */
+                dim[ndims] = 0;
+
+                status = H5D_btree_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, ndims, dim);
                 break;
 
+            case H5B_NUM_BTREE_ID:
             default:
-                HDfprintf(stderr, "Unknown B-tree subtype %u\n", (unsigned)(subtype));
+                HDfprintf(stderr, "Unknown v1 B-tree subtype %u\n", (unsigned)(subtype));
                 HDexit(4);
         }
 
@@ -286,7 +422,14 @@ main(int argc, char *argv[])
         const H5B2_class_t *cls = get_H5B2_class(sig);
         HDassert(cls);
 
-        status = H5B2_hdr_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, cls, (haddr_t)extra);
+	if((cls == H5D_BT2 || cls == H5D_BT2_FILT) && extra == 0) {
+            fprintf(stderr, "ERROR: Need v2 B-tree header address and object header address containing the layout message in order to dump header\n");
+            fprintf(stderr, "v2 B-tree hdr usage:\n");
+            fprintf(stderr, "\th5debug <filename> <v2 B-tree header address> <object header address>\n");
+            HDexit(4);
+	}
+
+        status = H5B2__hdr_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, cls, (haddr_t)extra);
 
     } else if(!HDmemcmp(sig, H5B2_INT_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
         /*
@@ -296,7 +439,16 @@ main(int argc, char *argv[])
         HDassert(cls);
 
         /* Check for enough valid parameters */
-        if(extra == 0 || extra2 == 0 || extra3 == 0) {
+	if((cls == H5D_BT2 || cls == H5D_BT2_FILT) &&
+	   (extra == 0 || extra2 == 0 || extra3 == 0 || extra4 == 0)) {
+
+            fprintf(stderr, "ERROR: Need v2 B-tree header address, the node's number of records, depth, and object header address containing the layout message in order to dump internal node\n");
+            fprintf(stderr, "NOTE: Leaf nodes are depth 0, the internal nodes above them are depth 1, etc.\n");
+            fprintf(stderr, "v2 B-tree internal node usage:\n");
+            fprintf(stderr, "\th5debug <filename> <internal node address> <v2 B-tree header address> <number of records> <depth> <object header address>\n");
+            HDexit(4);
+
+        } else if(extra == 0 || extra2 == 0 || extra3 == 0) {
             HDfprintf(stderr, "ERROR: Need v2 B-tree header address and the node's number of records and depth in order to dump internal node\n");
             HDfprintf(stderr, "NOTE: Leaf nodes are depth 0, the internal nodes above them are depth 1, etc.\n");
             HDfprintf(stderr, "v2 B-tree internal node usage:\n");
@@ -304,7 +456,7 @@ main(int argc, char *argv[])
             HDexit(4);
         } /* end if */
 
-        status = H5B2_int_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, cls, extra, (unsigned)extra2, (unsigned)extra3, (haddr_t)extra4);
+        status = H5B2__int_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, cls, extra, (unsigned)extra2, (unsigned)extra3, (haddr_t)extra4);
 
     } else if(!HDmemcmp(sig, H5B2_LEAF_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
         /*
@@ -314,14 +466,22 @@ main(int argc, char *argv[])
         HDassert(cls);
 
         /* Check for enough valid parameters */
-        if(extra == 0 || extra2 == 0) {
+	if((cls == H5D_BT2 || cls == H5D_BT2_FILT) &&
+	   (extra == 0 || extra2 == 0 || extra3 == 0 )) {
+
+            fprintf(stderr, "ERROR: Need v2 B-tree header address, number of records, and object header address containing the layout message in order to dump leaf node\n");
+            fprintf(stderr, "v2 B-tree leaf node usage:\n");
+            fprintf(stderr, "\th5debug <filename> <leaf node address> <v2 B-tree header address> <number of records> <object header address>\n");
+            HDexit(4);
+
+        } else if(extra == 0 || extra2 == 0) {
             HDfprintf(stderr, "ERROR: Need v2 B-tree header address and number of records in order to dump leaf node\n");
             HDfprintf(stderr, "v2 B-tree leaf node usage:\n");
             HDfprintf(stderr, "\th5debug <filename> <leaf node address> <v2 B-tree header address> <number of records>\n");
             HDexit(4);
         } /* end if */
 
-        status = H5B2_leaf_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, cls, extra, (unsigned)extra2, (haddr_t)extra3);
+        status = H5B2__leaf_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, cls, extra, (unsigned)extra2, (haddr_t)extra3);
 
     } else if(!HDmemcmp(sig, H5HF_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
         /*
@@ -394,14 +554,116 @@ main(int argc, char *argv[])
          */
 
         /* Check for enough valid parameters */
-        if(extra2 == 0) {
-            HDfprintf(stderr, "ERROR: Need list format version and number of messages in order to shared message list\n");
+        if(extra == 0) {
+            HDfprintf(stderr, "ERROR: Need shared message header address in order to shared message list\n");
             HDfprintf(stderr, "Shared message list usage:\n");
-            HDfprintf(stderr, "\th5debug <filename> <shared message list address> <list format version> <number of mesages in list>\n");
+            HDfprintf(stderr, "\th5debug <filename> <shared message list address> <shared message header address>\n");
+            HDexit(4);
+        } /* end if */
+
+        status = H5SM_list_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, (haddr_t)extra);
+
+    } else if(!HDmemcmp(sig, H5EA_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /*
+         * Debug an extensible aray header.
+         */
+        const H5EA_class_t *cls = get_H5EA_class(sig);
+        HDassert(cls);
+
+        /* Check for enough valid parameters */
+        if(extra == 0) {
+            HDfprintf(stderr, "ERROR: Need object header address containing the layout message in order to dump header\n");
+            HDfprintf(stderr, "Extensible array header block usage:\n");
+            HDfprintf(stderr, "\th5debug <filename> <Extensible Array header address> <object header address>\n");
+            HDexit(4);
+        } /* end if */
+
+        status = H5EA__hdr_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, cls, extra);
+
+    } else if(!HDmemcmp(sig, H5EA_IBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /*
+         * Debug an extensible aray index block.
+         */
+        const H5EA_class_t *cls = get_H5EA_class(sig);
+        HDassert(cls);
+
+        /* Check for enough valid parameters */
+        if(extra == 0 || extra2 == 0) {
+            HDfprintf(stderr, "ERROR: Need extensible array header address and object header address containing the layout message in order to dump index block\n");
+            HDfprintf(stderr, "Extensible array index block usage:\n");
+            HDfprintf(stderr, "\th5debug <filename> <index block address> <array header address> <object header address\n");
+            HDexit(4);
+        } /* end if */
+
+        status = H5EA__iblock_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, cls, extra, extra2);
+
+    } else if(!HDmemcmp(sig, H5EA_SBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /*
+         * Debug an extensible aray super block.
+         */
+        const H5EA_class_t *cls = get_H5EA_class(sig);
+        HDassert(cls);
+
+        /* Check for enough valid parameters */
+        if(extra == 0 || extra2 == 0 || extra3 == 0) {
+            HDfprintf(stderr, "ERROR: Need extensible array header address, super block index and object header address containing the layout message in order to dump super block\n");
+            HDfprintf(stderr, "Extensible array super block usage:\n");
+            HDfprintf(stderr, "\th5debug <filename> <super block address> <array header address> <super block index> <object header address>\n");
+            HDexit(4);
+        } /* end if */
+
+        status = H5EA__sblock_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, cls, extra, (unsigned)extra2, extra3);
+
+    } else if(!HDmemcmp(sig, H5EA_DBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /*
+         * Debug an extensible aray data block.
+         */
+        const H5EA_class_t *cls = get_H5EA_class(sig);
+        HDassert(cls);
+
+        /* Check for enough valid parameters */
+        if(extra == 0 || extra2 == 0 || extra3 == 0) {
+            HDfprintf(stderr, "ERROR: Need extensible array header address, # of elements in data block and object header address containing the layout message in order to dump data block\n");
+            HDfprintf(stderr, "Extensible array data block usage:\n");
+            HDfprintf(stderr, "\th5debug <filename> <data block address> <array header address> <# of elements in data block> <object header address\n");
+            HDexit(4);
+        } /* end if */
+
+        status = H5EA__dblock_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, cls, extra, (size_t)extra2, extra3);
+
+    } else if(!HDmemcmp(sig, H5FA_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /*
+         * Debug a fixed array header.
+         */
+        const H5FA_class_t *cls = get_H5FA_class(sig);
+        HDassert(cls);
+
+        /* Check for enough valid parameters */
+        if(extra == 0) {
+            HDfprintf(stderr, "ERROR: Need object header address containing the layout message in order to dump header\n");
+            HDfprintf(stderr, "Fixed array header block usage:\n");
+            HDfprintf(stderr, "\th5debug <filename> <Fixed Array header address> <object header address>\n");
+            HDexit(4);
+        } /* end if */
+
+        status = H5FA__hdr_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, cls, extra);
+
+    } else if(!HDmemcmp(sig, H5FA_DBLOCK_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
+        /*
+         * Debug a fixed array data block.
+         */
+        const H5FA_class_t *cls = get_H5FA_class(sig);
+        HDassert(cls);
+
+        /* Check for enough valid parameters */
+        if(extra == 0 || extra2 == 0) {
+            HDfprintf(stderr, "ERROR: Need fixed array header address and object header address containing the layout message in order to dump data block\n");
+            HDfprintf(stderr, "fixed array data block usage:\n");
+            HDfprintf(stderr, "\th5debug <filename> <data block address> <array header address> <object header address>\n");
             HDexit(4);
         } /* end if */
 
-        status = H5SM_list_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, (unsigned) extra, (size_t) extra2);
+        status = H5FA__dblock_debug(f, H5P_DATASET_XFER_DEFAULT, addr, stdout, 0, VCOL, cls, extra, extra2);
 
     } else if(!HDmemcmp(sig, H5O_HDR_MAGIC, (size_t)H5_SIZEOF_MAGIC)) {
         /*
diff --git a/tools/misc/h5mkgrp.c b/tools/misc/h5mkgrp.c
index 8dee706..1c1bba1 100644
--- a/tools/misc/h5mkgrp.c
+++ b/tools/misc/h5mkgrp.c
@@ -181,7 +181,7 @@ parse_command_line(int argc, const char *argv[], param_t *parms)
 
     /* Allocate space for the group name pointers */
     parms->ngroups = (argc - opt_ind);
-    parms->groups = HDmalloc(parms->ngroups * sizeof(char *));
+    parms->groups = (char **)HDmalloc(parms->ngroups * sizeof(char *));
 
     /* Retrieve the group names */
     curr_group = 0;
diff --git a/tools/misc/h5perf_gentest.c b/tools/misc/h5perf_gentest.c
new file mode 100644
index 0000000..50c18c1
--- /dev/null
+++ b/tools/misc/h5perf_gentest.c
@@ -0,0 +1,598 @@
+/*****************************************************************************
+  This test generates attributes, groups, and datasets of many types. It 
+  creates a large number of attributes, groups, and datasets by specifying 
+  -a, -g, -d options respectively. Using "-h" option to see details.
+
+  Programmer:  Peter Cao <xcao at hdfgroup.org>, Jan. 2013
+ ****************************************************************************/
+
+#include "hdf5.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#define FNAME       "test_perf.h5"
+#define NGROUPS     20
+#define NDSETS      20
+#define NATTRS      20
+#define DIM0        40
+#define NROWS       100
+#define NTYPES      9
+#define MAXVLEN     10
+#define FIXED_LEN   8
+
+typedef enum { SOLID=0, LIQUID, GAS, PLASMA } phase_t;                                  
+
+typedef struct {
+    int                 i;
+    unsigned long long  l;
+    float               f;
+    double              d;
+    char                s[FIXED_LEN];
+    phase_t             e;
+    float               f_array[FIXED_LEN];
+    hvl_t               i_vlen;
+    char                *s_vlen;
+} test_comp_t;    
+
+typedef struct {
+    int     zipcode;
+    char    *city;
+} zipcode_t;                               
+
+int add_attrs(hid_t oid, int idx);
+int add_attr(hid_t oid, const char *name, hid_t tid, hid_t sid, void *buf) ;
+herr_t create_perf_test_file(const char *fname, int ngrps, int ndsets, 
+       int nattrs, hsize_t nrows, hsize_t dim0, hsize_t chunk, int vlen, 
+	   int compressed, int latest);
+
+int main (int argc, char *argv[])
+{
+    char fname[32];
+    int i, ngrps=NGROUPS, ndsets=NDSETS, nattrs=NATTRS, dim0=DIM0, 
+	    chunk=DIM0/10+1, nrows=NROWS, vlen=MAXVLEN, l=0, z=0;
+
+    memset(fname, 0, 32);
+    for (i=1; i<argc; i++) {
+        if (strcmp(argv[i], "-f")==0)
+            strcpy(fname, argv[i+1]);
+        else if (strcmp(argv[i], "-g")==0)
+            ngrps = atoi(argv[i+1]);
+        else if (strcmp(argv[i], "-d")==0)
+            ndsets = atoi(argv[i+1]);
+        else if (strcmp(argv[i], "-a")==0)
+            nattrs = atoi(argv[i+1]);
+        else if (strcmp(argv[i], "-r")==0)
+            nrows = atoi(argv[i+1]);
+        else if (strcmp(argv[i], "-s")==0)
+            dim0 = atoi(argv[i+1]);
+        else if (strcmp(argv[i], "-c")==0)
+            chunk = atoi(argv[i+1]);
+        else if (strcmp(argv[i], "-v")==0)
+            vlen = atoi(argv[i+1]);
+        else if (strcmp(argv[i], "-l")==0)
+            l = 1;
+        else if (strcmp(argv[i], "-z")==0)
+            z = 1; 
+        else if (strcmp(argv[i], "-h")==0) {
+            printf("\nOPTONS:\n");
+            printf("\t-f F:\tname of the test file (default: %s).\n", FNAME);
+            printf("\t-g N:\tnumber of top level groups (default: %d).\n", NGROUPS);
+            printf("\t-d N:\tnumber of datasets (default: %d).\n", NDSETS);
+            printf("\t-a N:\tnumber of attributes (default: %d).\n", NATTRS);
+            printf("\t-r N:\tnumber of rows in the large compound dataset (default: %d).\n", NROWS);
+            printf("\t-s N:\tsize of dim0 in datasets (default: %d).\n", DIM0);
+            printf("\t-c N:\tchunk size of dim0 (default: %d).\n", (DIM0/10+1));
+            printf("\t-v N:\tmax vlen size (default: %d).\n", MAXVLEN);
+            printf("\t-l:\tuse latest format (default: no).\n");
+            printf("\t-z:\tuse gzip compression (default: no).\n");
+            printf("\t-h:\tthis help information.\n");
+            printf("Example:\n");
+            printf("\t./a.out -f test.h5 -g 10000 -d 5000 -a 500 -r 10000 -s 200 -c 20 -v 40 -l -z\n\n");
+            exit(0);
+        }
+    }
+	
+    if (strlen(fname)<=0)
+        sprintf(fname, FNAME);
+
+	create_perf_test_file(fname, ngrps, ndsets, nattrs, (hsize_t)nrows, 
+	                     (hsize_t)dim0, (hsize_t)chunk, vlen, z, l);
+    
+    return 0;
+}
+
+/*****************************************************************************
+  This function generates attributes, groups, and datasets of many types. 
+
+  Parameters:
+            fname:	file_name.
+            ngrps:	number of top level groups.
+            ndsets:	number of datasets.
+            attrs:	number of attributes.
+            nrow:	number of rows in a dataset.
+            chunk:	chunk size (single number).
+            vlen:	max vlen size.
+            comp:	use latest format.
+            latest:	use gzip comnpression.
+			
+  Return:  Non-negative on success/Negative on failure
+  
+  Programmer:  Peter Cao <xcao at hdfgroup.org>, Jan. 2013
+ ****************************************************************************/
+herr_t create_perf_test_file(const char *fname, int ngrps, int ndsets, 
+       int nattrs, hsize_t nrows, hsize_t dim0, hsize_t chunk, int vlen, 
+	   int compressed, int latest)
+{
+    int         i, j, k;
+    hid_t       fid, sid_null, sid_scalar, sid_1d, sid_2d, did, aid, sid_2, sid_large, 
+	            fapl=H5P_DEFAULT, dcpl=H5P_DEFAULT, gid1, gid2, cmp_tid, tid_str, 
+				tid_enum, tid_array_f, tid_vlen_i, tid_vlen_s;
+    char        name[32], tmp_name1[32], tmp_name2[32], tmp_name3[32];
+    hsize_t     dims[1]={dim0}, dims2d[2]={dim0, (dim0/4+1)}, dims_array[1]={FIXED_LEN}, 
+	            dim1[1]={2};
+    char        *enum_names[4] = {"SOLID", "LIQUID", "GAS", "PLASMA"};
+    test_comp_t *buf_comp=NULL, *buf_comp_large=NULL;
+    int         *buf_int=NULL;
+    float       (*buf_float_a)[FIXED_LEN]=NULL;
+    double      **buf_double2d=NULL;
+    hvl_t       *buf_vlen_i=NULL;
+	char        (*buf_str)[FIXED_LEN];
+	char        **buf_vlen_s=NULL;
+	hobj_ref_t  buf_ref[2];
+	hdset_reg_ref_t buf_reg_ref[2];
+    size_t      offset, len;
+    herr_t      status;
+    char        *names[NTYPES] = { "int", "ulong", "float", "double", "fixed string", 
+	            "enum", "fixed float array", "vlen int array", "vlen strings"};
+    hid_t       types[NTYPES] = { H5T_NATIVE_INT, H5T_NATIVE_UINT64, H5T_NATIVE_FLOAT, 
+                H5T_NATIVE_DOUBLE, tid_str, tid_enum, tid_array_f, tid_vlen_i, tid_vlen_s};
+	hsize_t     coords[4][2] = { {0,  1}, {3, 5}, {1,  0}, {2,  4}}, start=0, stride=1, count=1;
+	
+	if (nrows < NROWS) nrows = NROWS; 
+    if (ngrps<NGROUPS) ngrps=NGROUPS;
+	if (ndsets<NDSETS) ndsets=NDSETS;
+	if (nattrs<NATTRS) nattrs=NATTRS;
+	if (dim0<DIM0) dim0=DIM0;
+    if (chunk>dim0) chunk=dim0/4;
+    if (chunk<1) chunk = 1;
+	if (vlen<1) vlen = MAXVLEN;
+
+    /* create fixed string datatype */                                   
+    types[4] = tid_str =  H5Tcopy (H5T_C_S1);
+    H5Tset_size (tid_str, FIXED_LEN);
+
+    /* create enum datatype */
+    types[5] = tid_enum = H5Tenum_create(H5T_NATIVE_INT);
+    for (i = (int) SOLID; i <= (int) PLASMA; i++) {
+        phase_t val = (phase_t) i;
+        status = H5Tenum_insert (tid_enum, enum_names[i], &val);
+    }
+
+    /* create float array datatype */
+    types[6] = tid_array_f = H5Tarray_create (H5T_NATIVE_FLOAT, 1, dims_array);
+ 
+    /* create variable length integer datatypes */
+    types[7] = tid_vlen_i = H5Tvlen_create (H5T_NATIVE_INT);
+    	
+    /* create variable length string datatype */
+    types[8] = tid_vlen_s =  H5Tcopy (H5T_C_S1);
+    H5Tset_size (tid_vlen_s, H5T_VARIABLE);
+                   
+    /* create compound datatypes */    
+    cmp_tid = H5Tcreate (H5T_COMPOUND, sizeof (test_comp_t));
+    offset = 0;
+    for (i=0; i<NTYPES-2; i++) {
+        H5Tinsert(cmp_tid, names[i], offset, types[i]);
+        offset += H5Tget_size(types[i]);
+    }
+
+	H5Tinsert(cmp_tid, names[7], offset, types[7]);
+	offset += sizeof (hvl_t);
+	H5Tinsert(cmp_tid, names[8], offset, types[8]);
+
+	/* create dataspace */
+    sid_1d = H5Screate_simple (1, dims, NULL);
+    sid_2d = H5Screate_simple (2, dims2d, NULL);
+    sid_2 = H5Screate_simple  (1, dim1, NULL);
+	sid_large = H5Screate_simple  (1, &nrows, NULL);
+    sid_null = H5Screate (H5S_NULL);	
+	sid_scalar = H5Screate (H5S_SCALAR);
+	
+	/* create fid access property */
+	fapl = H5Pcreate (H5P_FILE_ACCESS);
+    H5Pset_libver_bounds (fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
+
+	/* create dataset creation property */
+    dcpl = H5Pcreate (H5P_DATASET_CREATE);
+
+	/* set dataset chunk */
+    if (chunk>0) {
+        H5Pset_chunk (dcpl, 1, &chunk);
+    }
+
+	/* set dataset compression */
+    if (compressed) {
+        if (chunk<=0) {
+            chunk = dim0/10+1;;
+            H5Pset_chunk (dcpl, 1, &chunk);
+        }
+        H5Pset_shuffle (dcpl);
+        H5Pset_deflate (dcpl, 6);
+    }	
+
+	/* allocate buffers */
+    buf_comp   = (test_comp_t *)calloc(dim0, sizeof(test_comp_t));
+    buf_comp_large   = (test_comp_t *)calloc(nrows, sizeof(test_comp_t));
+    buf_int    = (int *)calloc(dim0, sizeof(int));
+    buf_float_a  = malloc(dim0*sizeof(*buf_float_a));
+	buf_vlen_i = (hvl_t *)calloc(dim0, sizeof (hvl_t));
+    buf_vlen_s = (char **)calloc(dim0, sizeof(char *));
+	buf_str    =  malloc(dim0*sizeof (*buf_str));
+
+	/* allocate array of doulbe pointers */
+	buf_double2d  = (double **)calloc(dims2d[0],sizeof(double *));
+	/* allocate a contigous chunk of memory for the data */
+	buf_double2d[0] = (double *)calloc( dims2d[0]*dims2d[1],sizeof(double) );
+	/* assign memory city to pointer array */
+	for (i=1; i <dims2d[0]; i++) buf_double2d[i] = buf_double2d[0]+i*dims2d[1];
+
+	/* fill buffer values */
+	len = 1;
+    for (i=0; i<dims[0]; i++) {
+        buf_comp[i].i = buf_int[i] = i-2147483648;
+        buf_comp[i].l = 0xffffffffffffffff-i;
+        buf_comp[i].f = 1.0/(i+1.0);
+        buf_comp[i].d = 987654321.0*i+1.0/(i+1.0);
+        buf_comp[i].e = (phase_t) (i % (int) (PLASMA + 1));
+		
+		for (j=0; j<FIXED_LEN; j++) {
+		    buf_comp[i].f_array[j] = buf_float_a[i][j] = i*100+j;
+			buf_str[i][j] = 'a' + (i%26);
+		}
+		buf_str[i][FIXED_LEN-1] = 0;
+        strcpy(buf_comp[i].s, buf_str[i]);
+		
+		len = (1-cos(i/8.0))/2*vlen+1;
+		if (!i) len = vlen;
+		buf_vlen_i[i].len = len;
+		buf_vlen_i[i].p = (int *)calloc(len, sizeof(int));
+		for (j=0; j<len; j++) ((int*)(buf_vlen_i[i].p))[j] = i*100+j;
+		buf_comp[i].i_vlen = buf_vlen_i[i];
+		
+		buf_vlen_s[i] = (char *)calloc(len, sizeof(char));
+		for (j=0; j<len-1; j++)
+		    buf_vlen_s[i][j] = j%26+'A';
+		buf_comp[i].s_vlen = buf_vlen_s[i];
+		
+		for (j=0; j<dims2d[1]; j++)
+		    buf_double2d[i][j] = i+j/10000.0;
+    }
+
+    for (i=0; i<nrows; i++) {
+        buf_comp_large[i].i = i-2147483648;
+        buf_comp_large[i].l = 0xffffffffffffffff-i;
+        buf_comp_large[i].f = 1.0/(i+1.0);
+        buf_comp_large[i].d = 987654321.0*i+1.0/(i+1.0);
+        buf_comp_large[i].e = (phase_t) (i % (int) (PLASMA + 1));
+        for (j=0; j<FIXED_LEN-1; j++) {
+            buf_comp_large[i].f_array[j] = i*100+j;
+            buf_comp_large[i].s[j] = 'a' + (i%26);
+        }
+		len = i%vlen+1;
+        buf_comp_large[i].i_vlen.len = len;
+        buf_comp_large[i].i_vlen.p = (int *)calloc(len, sizeof(int));
+        for (j=0; j<len; j++) ((int*)(buf_comp_large[i].i_vlen.p))[j] = i*100+j;
+        buf_comp_large[i].s_vlen = (char *)calloc(i+2, sizeof(char));
+        for (j=0; j<i+1; j++) (buf_comp_large[i].s_vlen)[j] = j%26+'A';
+    }
+	
+	/* create file */
+    if (latest)
+        fid = H5Fcreate (fname, H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
+    else
+        fid = H5Fcreate (fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+	add_attrs(fid, 0);
+
+	sprintf(name, "a cmp ds of %d rows", nrows);
+	did = H5Dcreate (fid, name, cmp_tid, sid_large, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+	H5Dwrite (did, cmp_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_comp_large);
+	add_attrs(did, 0); 
+	H5Dclose(did);
+
+	// /* add attributes*/
+    gid1 = H5Gcreate (fid, "attributes", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+	if (nattrs<1) nattrs = 1;
+	i=0;
+	while (i<nattrs) i += add_attrs(gid1, i);
+	H5Gclose(gid1);
+		
+	/* add many sub groups to a group*/
+    gid1 = H5Gcreate (fid, "groups", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+	add_attrs(gid1, 0);
+    for (i=0; i<ngrps; i++) {
+	    /* create sub groups */
+        sprintf(name, "g%02d", i);
+        gid2 = H5Gcreate (gid1, name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+		if (i<10) add_attrs(gid2, 0);
+		H5Gclose(gid2);
+	}
+	H5Gclose(gid1);
+
+	/* add many datasets to a group */
+	gid1 = H5Gcreate (fid, "datasets", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+	add_attrs(gid1, 0);
+    for (j=0; j<ndsets; j+=12) {
+		/* 1 add a null dataset */
+		sprintf(name, "%05d null dataset", j);
+        did = H5Dcreate (gid1, name, H5T_STD_I32LE, sid_null, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+		if (!j) add_attrs(did, j); 
+        H5Dclose(did);	
+
+		/* 2 add scalar int point */
+	    sprintf(name, "%05d scalar int point", j);
+        did = H5Dcreate (gid1, name, H5T_NATIVE_INT, sid_scalar, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+        H5Dwrite (did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &j);		
+		if (!j) add_attrs(did, j); 
+		H5Dclose(did);		
+		
+		/* 3 scalar vlen string */
+	    sprintf(name, "%05d scalar vlen string", j);
+        did = H5Dcreate (gid1, name, tid_vlen_s, sid_scalar, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+        H5Dwrite (did, tid_vlen_s, H5S_ALL, H5S_ALL, H5P_DEFAULT, &buf_vlen_s[0]);		
+		if (!j) add_attrs(did, j); 
+		H5Dclose(did);			
+	
+	    /* 4 add fixed-length float array */
+		sprintf(name, "%05d fixed-length float array", j);
+		did = H5Dcreate (gid1, name, tid_array_f, sid_1d, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+		H5Dwrite (did, tid_array_f, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_float_a);
+		if (!j) add_attrs(did, j); 
+		H5Dclose(did);
+	
+		/* 5 add fixed-length strings */
+		sprintf(name, "%05d fixed-length strings", j);
+		did = H5Dcreate (gid1, name, tid_str, sid_1d, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+		H5Dwrite (did, tid_str, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_str);
+		if (!j) add_attrs(did, j); 
+		H5Dclose(did);
+		
+		/* 6 add compound data */
+	    sprintf(name, "%05d compund data", j);
+	    did = H5Dcreate (gid1, name, cmp_tid, sid_1d, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+	    H5Dwrite (did, cmp_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_comp);
+		if (!j) add_attrs(did, j); 
+		H5Dclose(did);
+
+		/* 7 add 2D double */
+	    sprintf(name, "%05d 2D double", j);
+		strcpy (tmp_name1, name);
+	    did = H5Dcreate (gid1, name, H5T_NATIVE_DOUBLE, sid_2d, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+	    H5Dwrite (did, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_double2d[0]);
+		if (!j) add_attrs(did, j); 
+		H5Dclose(did);
+		
+		/* 8 add 1D int array */
+	    sprintf(name, "%05d 1D int array", j);
+        did = H5Dcreate (gid1, name, H5T_NATIVE_INT, sid_1d, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+        H5Dwrite (did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_int);		
+		if (!j) add_attrs(did, j); 
+		H5Dclose(did);
+		
+		/* 9 add vlen int array */
+	    sprintf(name, "%05d vlen int array", j);
+		strcpy (tmp_name2, name);
+        did = H5Dcreate (gid1, name, tid_vlen_i, sid_1d, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+        H5Dwrite (did, tid_vlen_i, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_vlen_i);		
+		if (!j) add_attrs(did, j); 
+		H5Dclose(did);	
+
+		/* 10 add vlen strings */
+	    sprintf(name, "%05d vlen strings", j);
+		strcpy (tmp_name3, name);
+        did = H5Dcreate (gid1, name, tid_vlen_s, sid_1d, H5P_DEFAULT, dcpl, H5P_DEFAULT);
+        H5Dwrite (did, tid_vlen_s, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_vlen_s);		
+		if (!j) add_attrs(did, j); 
+		H5Dclose(did);	
+		
+		/* 11 add object refs */
+		H5Rcreate(&buf_ref[0],gid1, ".", H5R_OBJECT, (hid_t)-1); 
+		H5Rcreate(&buf_ref[1],gid1, tmp_name3, H5R_OBJECT, (hid_t)-1); 
+	    sprintf(name, "%05d obj refs", j);
+        did = H5Dcreate (gid1, name, H5T_STD_REF_OBJ, sid_2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+        H5Dwrite (did, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_ref);		
+		if (!j) add_attrs(did, j); 
+		H5Dclose(did);
+
+		/* 12 add region refs */
+		H5Sselect_elements (sid_2d, H5S_SELECT_SET, 4, coords[0]);
+		H5Rcreate(&buf_reg_ref[0],gid1, tmp_name1, H5R_DATASET_REGION, sid_2d); 
+		H5Sselect_none(sid_2d);
+		count = dims[0]/2+1;
+		H5Sselect_hyperslab (sid_1d, H5S_SELECT_SET, &start, &stride, &count,NULL);
+		H5Rcreate(&buf_reg_ref[1],gid1, tmp_name2, H5R_DATASET_REGION, sid_1d); 
+		H5Sselect_none(sid_1d);
+	    sprintf(name, "%05d region refs", j);
+        did = H5Dcreate (gid1, name, H5T_STD_REF_DSETREG, sid_2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+        H5Dwrite (did, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_reg_ref);		
+		if (!j) add_attrs(did, j); 
+		H5Dclose(did);
+	}
+	H5Gclose(gid1);			
+	
+    H5Tclose (tid_array_f);
+    H5Tclose (tid_vlen_i);
+    H5Tclose (tid_vlen_s);
+    H5Tclose (tid_enum);
+    H5Tclose (tid_str);
+    H5Tclose (cmp_tid);
+    H5Pclose (dcpl);
+    H5Pclose (fapl);
+    H5Sclose (sid_1d);
+    H5Sclose (sid_2d);
+    H5Sclose (sid_2);
+    H5Sclose (sid_large);
+    H5Sclose (sid_null);
+    H5Sclose (sid_scalar);
+    H5Fclose (fid);
+
+    for (i=0; i<dims[0]; i++) {
+		if (buf_vlen_i[i].p) free(buf_vlen_i[i].p);
+		if (buf_vlen_s[i]) free(buf_vlen_s[i]);
+	}
+
+    for (i=0; i<nrows; i++) {
+	    if (buf_comp_large[i].i_vlen.p)  free(buf_comp_large[i].i_vlen.p);
+		if (buf_comp_large[i].s_vlen) free(buf_comp_large[i].s_vlen);
+	}
+	
+    free (buf_comp);
+    free (buf_comp_large);
+    free (buf_int);
+    free (buf_float_a);
+    free (buf_double2d[0]);
+    free (buf_double2d);
+	free (buf_str);
+    free(buf_vlen_i);
+    free(buf_vlen_s);
+
+    return 0;
+}
+
+/* add a single attribute */
+int add_attr(hid_t oid, const char *name, hid_t tid, hid_t sid, void *buf) 
+{
+    hid_t aid;
+
+    aid = H5Acreate (oid, name, tid, sid, H5P_DEFAULT, H5P_DEFAULT);
+	if (aid <0)
+	return 0;
+	
+    H5Awrite(aid, tid, buf); 
+
+    H5Aclose(aid);
+	
+	return 1;
+}
+
+/* 
+    adds different types of attributes to an object.
+	
+	returns the number of attributes added to the objects.
+ */
+int add_attrs(hid_t oid, int idx) 
+{
+    char name[32];
+    int i0, i1, i2, j, nattrs=0;
+	hid_t aid, tid, tid1, sid;
+    hvl_t               i_vlen[4];
+	hobj_ref_t          ref;
+	zipcode_t            cmp_data[4];
+    unsigned int        i = 0xffffffff;
+    long long           l = -2147483647;
+    float               f = 123456789.987654321;
+    double              d = 987654321.123456789;
+    char                *s[7] = {"Parting", "is such", "sweeter", "sorrow."};
+    float               f_array[4] = {1.0, 2.22, 3.333, 4.444};
+    char                *s_vlen[4] = {"Parting", "is such", "sweet", "sorrow."};
+	hsize_t             dims1[1]={1}, dims2[1]={4}, dims3[2]={3,5};
+	int                 int3d[4][3][5];
+	 size_t             offset = 0;
+	
+	for (i0=0; i0<4; i0++) {
+	    i_vlen[i0].len = (i0+1);
+		i_vlen[i0].p = (int *)calloc(i_vlen[i0].len, sizeof(int));
+		for (j=0; j<i_vlen[i0].len; j++)
+		    ((int *)i_vlen[i0].p)[j] = i0*100+j;
+	    for (i1=0; i1<3; i1++) {
+	        for (i2=0; i2<5; i2++)
+	            int3d[i0][i1][i2] = i0*i1-i1*i2+i0*i2;
+		}
+    }
+
+	cmp_data[0].zipcode = 01001;
+    cmp_data[0].city = "Agawam, Massachusetts";
+    cmp_data[1].zipcode = 99950;
+    cmp_data[1].city = "Ketchikan, Alaska";
+    cmp_data[2].zipcode = 00501;
+    cmp_data[2].city = "Holtsville, New York";
+    cmp_data[3].zipcode = 61820;
+    cmp_data[3].city = "Champaign, Illinois";
+	
+	/* 1 scalar point */
+	sid = H5Screate (H5S_SCALAR);
+	sprintf(name, "%05d scalar int", idx);
+    nattrs += add_attr(oid, name, H5T_NATIVE_UINT, sid, &i);	
+	sprintf(name, "%05d scalar ulong", idx);
+    nattrs += add_attr(oid, name, H5T_NATIVE_INT64, sid, &l);	
+	sprintf(name, "%05d scalar str", idx);
+	tid =  H5Tcopy (H5T_C_S1);
+    H5Tset_size (tid, H5T_VARIABLE);
+    nattrs += add_attr(oid, name, tid, sid, &s[2]);	
+	H5Tclose(tid);
+	H5Sclose(sid);
+
+	/* 4 single point */
+	sid = H5Screate_simple (1, dims1, NULL);
+    H5Rcreate(&ref, oid, ".", H5R_OBJECT, (hid_t)-1);
+	sprintf(name, "%05d single float", idx);
+    nattrs += add_attr(oid, name, H5T_NATIVE_FLOAT, sid, &f);	
+	sprintf(name, "%05d single double", idx);
+    nattrs += add_attr(oid, name, H5T_NATIVE_DOUBLE, sid, &d);	
+	sprintf(name, "%05d single obj_ref", idx);
+    nattrs += add_attr(oid, name, H5T_STD_REF_OBJ, sid, &ref);	
+	H5Sclose(sid);
+	
+	/* 7 fixed length 1D array */
+	sid = H5Screate_simple (1, dims1, NULL);
+	tid = H5Tarray_create (H5T_NATIVE_FLOAT, 1, dims2);
+	sprintf(name, "%05d array float", idx);
+    nattrs += add_attr(oid, name, tid, sid, &f_array[0]);
+	H5Tclose(tid);
+	tid =  H5Tcopy (H5T_C_S1);
+    H5Tset_size (tid, strlen(s[0])+1);	
+	tid1 = H5Tarray_create (tid, 1, dims2);
+	sprintf(name, "%05d array str", idx);
+    nattrs += add_attr(oid, name, tid1, sid, s);	
+	H5Tclose(tid1);	
+	H5Tclose(tid);	
+	H5Sclose(sid);
+
+	/* 9 fixed length 2D int arrays */
+	sid = H5Screate_simple (1, dims2, NULL);
+	tid = H5Tarray_create (H5T_NATIVE_INT, 2, dims3);
+	sprintf(name, "%05d array int 2D", idx);
+    nattrs += add_attr(oid, name, tid, sid, int3d[0][0]);
+	H5Tclose(tid);
+	H5Sclose(sid);
+	
+	/* 10 variable length arrays */
+	sid = H5Screate_simple (1, dims2, NULL);
+	tid = H5Tcopy (H5T_C_S1);
+	H5Tset_size (tid, H5T_VARIABLE);
+	sprintf(name, "%05d vlen strings", idx);
+    nattrs += add_attr(oid, name, tid, sid, s_vlen);
+	H5Tclose(tid);	
+	tid = H5Tvlen_create (H5T_NATIVE_INT);;
+	sprintf(name, "%05d vlen int array", idx);
+    nattrs += add_attr(oid, name, tid, sid, i_vlen);
+	H5Tclose(tid);
+	H5Sclose(sid);
+
+	/* 12 compound data */
+	sid = H5Screate_simple (1, dims2, NULL);
+	tid = H5Tcreate (H5T_COMPOUND, sizeof (zipcode_t));
+	tid1 = H5Tcopy (H5T_C_S1);
+	H5Tset_size (tid1, H5T_VARIABLE);	
+    H5Tinsert (tid, "zip code", 0, H5T_NATIVE_INT); offset += sizeof(H5T_NATIVE_INT);
+    H5Tinsert (tid, "City", offset, tid1); offset += sizeof(char *);
+	sprintf(name, "%05d compound data", idx);
+    nattrs += add_attr(oid, name, tid, sid, cmp_data);
+	H5Tclose(tid1);	
+	H5Tclose(tid);	
+	H5Sclose(sid);
+
+	for (i0=0; i0<4; i0++) 
+	    free(i_vlen[i0].p);
+		
+	return nattrs;
+}
diff --git a/tools/misc/h5repart.c b/tools/misc/h5repart.c
index ffd52e8..37d505a 100644
--- a/tools/misc/h5repart.c
+++ b/tools/misc/h5repart.c
@@ -200,21 +200,21 @@ main (int argc, char *argv[])
 
     int		verbose=FALSE;		/*display file names?		*/
 
-    const char	*src_gen_name;		/*general source name		*/
-    char	src_name[NAMELEN];	/*source member name		*/
+    const char	*src_gen_name;  /*general source name		*/
+    char	*src_name=NULL;	    /*source member name		*/
 
     int		src_is_family;		/*is source name a family name?	*/
     int		src_membno=0;		/*source member number		*/
 
-    const char	*dst_gen_name;		/*general destination name	*/
-    char	dst_name[NAMELEN];	/*destination member name	*/
+    const char	*dst_gen_name;	/*general destination name	*/
+    char	*dst_name=NULL;	    /*destination member name	*/
     int		dst_is_family;		/*is dst name a family name?	*/
     int		dst_membno=0;		/*destination member number	*/
 
     off_t	left_overs=0;		/*amount of zeros left over	*/
     off_t	src_offset=0;		/*offset in source member	*/
     off_t	dst_offset=0;		/*offset in destination member	*/
-    off_t	src_size;		/*source logical member size	*/
+    off_t	src_size;           /*source logical member size	*/
     off_t	src_act_size;		/*source actual member size	*/
     off_t	dst_size=1 GB;		/*destination logical memb size	*/
     hid_t       fapl;                   /*file access property list     */
@@ -232,24 +232,30 @@ main (int argc, char *argv[])
      * Parse switches.
      */
     while (argno<argc && '-'==argv[argno][0]) {
-	if (!strcmp (argv[argno], "-v")) {
-	    verbose = TRUE;
-	    argno++;
-	} else if (!strcmp(argv[argno], "-V")) {
-	    printf("This is %s version %u.%u release %u\n",
-		   prog_name, H5_VERS_MAJOR, H5_VERS_MINOR, H5_VERS_RELEASE);
-	    exit(EXIT_SUCCESS);
+        if (!strcmp (argv[argno], "-v")) {
+            verbose = TRUE;
+            argno++;
+        } else if (!strcmp(argv[argno], "-V")) {
+            printf("This is %s version %u.%u release %u\n",
+                prog_name, H5_VERS_MAJOR, H5_VERS_MINOR, H5_VERS_RELEASE);
+            exit(EXIT_SUCCESS);
         } else if (!strcmp (argv[argno], "-family_to_sec2")) {
-	    family_to_sec2 = TRUE;
-	    argno++;
-	} else if ('b'==argv[argno][1]) {
-	    blk_size = get_size (prog_name, &argno, argc, argv);
-	} else if ('m'==argv[argno][1]) {
-	    dst_size = get_size (prog_name, &argno, argc, argv);
-	} else {
-	    usage (prog_name);
-	}
-    }
+            family_to_sec2 = TRUE;
+            argno++;
+        } else if ('b'==argv[argno][1]) {
+            blk_size = get_size (prog_name, &argno, argc, argv);
+        } else if ('m'==argv[argno][1]) {
+            dst_size = get_size (prog_name, &argno, argc, argv);
+        } else {
+            usage (prog_name);
+        } /* end if */
+    } /* end while */
+
+    /* allocate names */
+    if(NULL == (src_name = HDcalloc((size_t)NAMELEN, sizeof(char))))
+        exit(EXIT_FAILURE);
+    if(NULL == (dst_name = HDcalloc((size_t)NAMELEN, sizeof(char))))
+        exit(EXIT_FAILURE);
 
     /*
      * Get the name for the source file and open the first member.  The size
@@ -261,13 +267,13 @@ main (int argc, char *argv[])
     src_is_family = strcmp (src_name, src_gen_name);
 
     if ((src=HDopen(src_name, O_RDONLY,0))<0) {
-	perror (src_name);
-	exit (EXIT_FAILURE);
+        perror (src_name);
+        exit (EXIT_FAILURE);
     }
 
     if (HDfstat(src, &sb)<0) {
-	perror ("fstat");
-	exit (EXIT_FAILURE);
+        perror ("fstat");
+        exit (EXIT_FAILURE);
     }
     src_size = src_act_size = sb.st_size;
     if (verbose) fprintf (stderr, "< %s\n", src_name);
@@ -290,7 +296,7 @@ main (int argc, char *argv[])
     if (argno<argc) usage (prog_name);
 
     /* Now the real work, split the file */
-    buf = HDmalloc (blk_size);
+    buf = (char *)HDmalloc(blk_size);
     while (src_offset<src_size) {
 
 	/* Read a block.  The amount to read is the minimum of:
@@ -485,19 +491,22 @@ main (int argc, char *argv[])
     H5E_BEGIN_TRY {
         file=H5Fopen(dst_gen_name, H5F_ACC_RDWR, fapl);
     } H5E_END_TRY;
+
     if(file>=0) {
         if(H5Fclose(file)<0) {
             perror ("H5Fclose");
             exit (EXIT_FAILURE);
-        }
-    }
+        } /* end if */
+    } /* end if */
 
     if(H5Pclose(fapl)<0) {
         perror ("H5Pclose");
         exit (EXIT_FAILURE);
-    }
+    } /* end if */
 
     /* Free resources and return */
-    HDfree (buf);
+    HDfree(src_name);
+    HDfree(dst_name);
+    HDfree(buf);
     return EXIT_SUCCESS;
-}
+} /* end main */
diff --git a/tools/misc/talign.c b/tools/misc/talign.c
index 2d0a9d1..be373e7 100644
--- a/tools/misc/talign.c
+++ b/tools/misc/talign.c
@@ -37,11 +37,11 @@ const char *setname = "align";
 
 int main(void)
 {
-    hid_t fil,spc,set;
-    hid_t cs6, cmp, fix;
-    hid_t cmp1, cmp2, cmp3;
-    hid_t plist;
-    hid_t array_dt;
+    hid_t fil=-1, spc=-1, set=-1;
+    hid_t cs6=-1, cmp=-1, fix=-1;
+    hid_t cmp1=-1, cmp2=-1, cmp3=-1;
+    hid_t plist=-1;
+    hid_t array_dt=-1;
 
     hsize_t dim[2];
     hsize_t cdim[4];
@@ -49,7 +49,7 @@ int main(void)
     char string5[5];
     float fok[2] = {1234.0f, 2341.0f};
     float fnok[2] = {5678.0f, 6785.0f};
-    float *fptr;
+    float *fptr = NULL;
 
     char *data = NULL;
 
@@ -137,13 +137,16 @@ int main(void)
 
     H5Dread(set, fix, spc, H5S_ALL, H5P_DEFAULT, data);
     fptr = (float *)(data + H5Tget_member_offset(fix, 1));
+    H5Dclose(set);
 
 out:
     if(error < 0) {
         result = 1;
         puts("*FAILED - HDF5 library error*");
-    } else if(fok[0] != fptr[0] || fok[1] != fptr[1]
-                    || fnok[0] != fptr[2] || fnok[1] != fptr[3]) {
+    } else if(!(H5_FLT_ABS_EQUAL(fok[0],  fptr[0]))
+           || !(H5_FLT_ABS_EQUAL(fok[1],  fptr[1]))
+           || !(H5_FLT_ABS_EQUAL(fnok[0], fptr[2]))
+           || !(H5_FLT_ABS_EQUAL(fnok[1], fptr[3]))) {
         char *mname;
 
         result = 1;
@@ -194,7 +197,9 @@ out:
     if(data)
         HDfree(data);
     H5Sclose(spc);
+    H5Tclose(cs6);
     H5Tclose(cmp);
+    H5Tclose(fix);
     H5Tclose(cmp1);
     H5Tclose(cmp2);
     H5Tclose(cmp3);
diff --git a/tools/misc/testh5clear.sh.in b/tools/misc/testh5clear.sh.in
new file mode 100644
index 0000000..aeac03e
--- /dev/null
+++ b/tools/misc/testh5clear.sh.in
@@ -0,0 +1,130 @@
+#! /bin/sh
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+#
+# Tests for the h5clear tool
+#
+srcdir=@srcdir@
+TESTNAME=h5clear
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+H5CLEAR=h5clear
+H5CLEAR_BIN=`pwd`/$H5CLEAR    	# The path of the tool binary
+
+GENTEST=h5clear_gentest         # Generate test files
+GENTEST_BIN=`pwd`/$GENTEST	# The path to the binary
+
+OPENCHK=clear_open_chk		# Try opening the test file
+OPENCHK_BIN=`pwd`/$OPENCHK	# The path to the binary
+
+SUCCEED=0
+FAIL=1
+
+nerrors=0
+verbose=yes
+
+# Print a line-line message left justified in a field of 70 characters
+# beginning with the word "Testing".
+#
+TESTING() {
+   SPACES="                                                               "
+   echo "Testing $* $SPACES" | cut -c1-70 | tr -d '\012'
+}
+
+# (1) Use "h5clear" to clear the status_flags in the test file
+# (2) Open the test file via "clear_open_chk"
+# $1 is the filename for testing
+TOOLTEST() {
+    TESTING $H5CLEAR $1
+    fname=$1
+    # Use "h5clear" to clear the status_flags in the test file
+    $RUNSERIAL $H5CLEAR_BIN $fname
+    if test $? -ne $SUCCEED; then
+	echo ".....$H5CLEAR: should succeed"
+	nerrors=`expr $nerrors + 1`
+    else
+	# Open the test file via "clear_open_chk"
+	$OPENCHK_BIN $fname
+	if test $? -ne $SUCCEED; then
+	    echo "......$OPENCHK: should succeed"
+	    nerrors=`expr $nerrors + 1`
+	else
+	    echo "PASSED"
+	fi
+    fi
+}
+
+
+
+# Use "clear_open_chk" to check if the file open succeeds or fails
+# $1 is the filename to open
+# $2 is the expected return from "clear_open_chk"
+OPENCHK() {
+    fname=$1
+    expected=$2
+    #
+    $OPENCHK_BIN $fname 2>/dev/null
+    actual=$?
+    if test $actual -ne $expected; then
+       echo "Unexpected return from $OPENCHK"
+       nerrors=`expr $nerrors + 1`
+    fi
+}
+
+##############################################################################
+##############################################################################
+###			  T H E   T E S T S                                ###
+##############################################################################
+##############################################################################
+#
+$GENTEST_BIN				# Create HDF5 test files
+if test $? -ne 0; then			# Error returned from generating test files
+    echo "$GENTEST: .....fail in generating test files"
+    nerrors=`expr $nerrors + 1`
+else
+    # Initial file open fails
+    # After "h5clear" the file, the subsequent file open succeeds
+    OPENCHK h5clear_sec2_v3.h5 $FAIL	
+    TOOLTEST h5clear_sec2_v3.h5		
+    #
+    OPENCHK h5clear_log_v3.h5 $FAIL	
+    TOOLTEST h5clear_log_v3.h5 
+    #
+    OPENCHK latest_h5clear_sec2_v3.h5 $FAIL
+    TOOLTEST latest_h5clear_sec2_v3.h5
+    #
+    OPENCHK latest_h5clear_log_v3.h5 $FAIL	
+    TOOLTEST latest_h5clear_log_v3.h5
+fi
+#
+#
+# File open succeeds because the library does not check status_flags for file with < v3 superblock
+OPENCHK h5clear_sec2_v0.h5 $SUCCEED
+TOOLTEST h5clear_sec2_v0.h5
+OPENCHK h5clear_sec2_v2.h5 $SUCCEED
+TOOLTEST h5clear_sec2_v2.h5
+#
+# Clean up test files
+if test -z "$HDF5_NOCLEANUP"; then
+   rm -f h5clear_*.h5 latest_h5clear*.h5
+fi
+
+if test $nerrors -eq 0 ; then
+    echo "All $TESTNAME tests passed."
+    exit $EXIT_SUCCESS
+else
+    echo "$TESTNAME tests failed with $nerrors error(s)."
+    exit $EXIT_FAILURE
+fi
diff --git a/tools/misc/vds/CMakeLists.txt b/tools/misc/vds/CMakeLists.txt
new file mode 100644
index 0000000..dcf883c
--- /dev/null
+++ b/tools/misc/vds/CMakeLists.txt
@@ -0,0 +1,28 @@
+cmake_minimum_required (VERSION 3.1.0)
+PROJECT (HDF5_TOOLS_MISC_VDS)
+
+#-----------------------------------------------------------------------------
+# Setup include Directories
+#-----------------------------------------------------------------------------
+INCLUDE_DIRECTORIES (${HDF5_TOOLS_SRC_DIR}/lib)
+
+MACRO (ADD_H5_GENERATOR genfile)
+  add_executable (${genfile} ${HDF5_TOOLS_MISC_VDS_SOURCE_DIR}/${genfile}.c)
+  TARGET_NAMING (${genfile} STATIC)
+  TARGET_C_PROPERTIES (${genfile} STATIC " " " ")
+  target_link_libraries (${genfile} ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
+  set_target_properties (${genfile} PROPERTIES FOLDER generator/tools)
+ENDMACRO (ADD_H5_GENERATOR genfile)
+
+# generator executables
+set (H5_GENERATORS
+    UC_1_one_dim_gen
+    UC_2_two_dims_gen
+    UC_3_gaps_gen
+    UC_4_printf_gen
+    UC_5_stride_gen
+)
+
+foreach (gen ${H5_GENERATORS})
+  ADD_H5_GENERATOR (${gen})
+endforeach (gen ${H5_GENERATORS})
diff --git a/tools/misc/vds/Makefile.am b/tools/misc/vds/Makefile.am
new file mode 100644
index 0000000..f1ef80c
--- /dev/null
+++ b/tools/misc/vds/Makefile.am
@@ -0,0 +1,38 @@
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+##
+## Makefile.am
+## Run automake to generate a Makefile.in from this file.
+#
+# HDF5 Library Makefile(.in)
+#
+
+include $(top_srcdir)/config/commence.am
+
+# Include src directory
+AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/tools/lib
+
+#test scripts and programs
+TEST_PROG=UC_1_one_dim_gen UC_2_two_dims_gen UC_3_gaps_gen UC_4_printf_gen \
+    UC_5_stride_gen
+
+check_PROGRAMS=$(TEST_PROG)
+
+# Temporary files.
+CHECK_CLEANFILES+=*.h5
+
+# All programs rely on hdf5 library and h5tools library
+LDADD=$(LIBH5TOOLS) $(LIBHDF5)
+
+include $(top_srcdir)/config/conclude.am
diff --git a/tools/misc/vds/Makefile.in b/tools/misc/vds/Makefile.in
new file mode 100644
index 0000000..c51b3d8
--- /dev/null
+++ b/tools/misc/vds/Makefile.in
@@ -0,0 +1,1436 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+ at SET_MAKE@
+
+#
+# Copyright by The HDF Group.
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5.  The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html.  COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page.  It can also be found at
+# http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have
+# access to either file, you may request a copy from help at hdfgroup.org.
+#
+# HDF5 Library Makefile(.in)
+#
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = $(am__EXEEXT_1)
+TESTS = $(am__EXEEXT_1)
+subdir = tools/misc/vds
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__EXEEXT_1 = UC_1_one_dim_gen$(EXEEXT) UC_2_two_dims_gen$(EXEEXT) \
+	UC_3_gaps_gen$(EXEEXT) UC_4_printf_gen$(EXEEXT) \
+	UC_5_stride_gen$(EXEEXT)
+UC_1_one_dim_gen_SOURCES = UC_1_one_dim_gen.c
+UC_1_one_dim_gen_OBJECTS = UC_1_one_dim_gen.$(OBJEXT)
+UC_1_one_dim_gen_LDADD = $(LDADD)
+UC_1_one_dim_gen_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+UC_2_two_dims_gen_SOURCES = UC_2_two_dims_gen.c
+UC_2_two_dims_gen_OBJECTS = UC_2_two_dims_gen.$(OBJEXT)
+UC_2_two_dims_gen_LDADD = $(LDADD)
+UC_2_two_dims_gen_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
+UC_3_gaps_gen_SOURCES = UC_3_gaps_gen.c
+UC_3_gaps_gen_OBJECTS = UC_3_gaps_gen.$(OBJEXT)
+UC_3_gaps_gen_LDADD = $(LDADD)
+UC_3_gaps_gen_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
+UC_4_printf_gen_SOURCES = UC_4_printf_gen.c
+UC_4_printf_gen_OBJECTS = UC_4_printf_gen.$(OBJEXT)
+UC_4_printf_gen_LDADD = $(LDADD)
+UC_4_printf_gen_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
+UC_5_stride_gen_SOURCES = UC_5_stride_gen.c
+UC_5_stride_gen_OBJECTS = UC_5_stride_gen.$(OBJEXT)
+UC_5_stride_gen_LDADD = $(LDADD)
+UC_5_stride_gen_DEPENDENCIES = $(LIBH5TOOLS) $(LIBHDF5)
+AM_V_P = $(am__v_P_ at AM_V@)
+am__v_P_ = $(am__v_P_ at AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_ at AM_V@)
+am__v_GEN_ = $(am__v_GEN_ at AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_ at AM_V@)
+am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
+depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_ at AM_V@)
+am__v_CC_ = $(am__v_CC_ at AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = UC_1_one_dim_gen.c UC_2_two_dims_gen.c UC_3_gaps_gen.c \
+	UC_4_printf_gen.c UC_5_stride_gen.c
+DIST_SOURCES = UC_1_one_dim_gen.c UC_2_two_dims_gen.c UC_3_gaps_gen.c \
+	UC_4_printf_gen.c UC_5_stride_gen.c
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors_dummy = \
+  mgn= red= grn= lgn= blu= brg= std=; \
+  am__color_tests=no
+am__tty_colors = { \
+  $(am__tty_colors_dummy); \
+  if test "X$(AM_COLOR_TESTS)" = Xno; then \
+    am__color_tests=no; \
+  elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+    am__color_tests=yes; \
+  elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+    am__color_tests=yes; \
+  fi; \
+  if test $$am__color_tests = yes; then \
+    red=''; \
+    grn=''; \
+    lgn=''; \
+    blu=''; \
+    mgn=''; \
+    brg=''; \
+    std=''; \
+  fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__recheck_rx = ^[ 	]*:recheck:[ 	]*
+am__global_test_result_rx = ^[ 	]*:global-test-result:[ 	]*
+am__copy_in_global_log_rx = ^[ 	]*:copy-in-global-log:[ 	]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+  recheck = 1; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+        { \
+          if ((getline line2 < ($$0 ".log")) < 0) \
+	    recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+        { \
+          recheck = 0; \
+          break; \
+        } \
+      else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+        { \
+          break; \
+        } \
+    }; \
+  if (recheck) \
+    print $$0; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+  print "fatal: making $@: " msg | "cat >&2"; \
+  exit 1; \
+} \
+function rst_section(header) \
+{ \
+  print header; \
+  len = length(header); \
+  for (i = 1; i <= len; i = i + 1) \
+    printf "="; \
+  printf "\n\n"; \
+} \
+{ \
+  copy_in_global_log = 1; \
+  global_test_result = "RUN"; \
+  while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+    { \
+      if (rc < 0) \
+         fatal("failed to read from " $$0 ".trs"); \
+      if (line ~ /$(am__global_test_result_rx)/) \
+        { \
+          sub("$(am__global_test_result_rx)", "", line); \
+          sub("[ 	]*$$", "", line); \
+          global_test_result = line; \
+        } \
+      else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+        copy_in_global_log = 0; \
+    }; \
+  if (copy_in_global_log) \
+    { \
+      rst_section(global_test_result ": " $$0); \
+      while ((rc = (getline line < ($$0 ".log"))) != 0) \
+      { \
+        if (rc < 0) \
+          fatal("failed to read from " $$0 ".log"); \
+        print line; \
+      }; \
+      printf "\n"; \
+    }; \
+  close ($$0 ".trs"); \
+  close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/   &   /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this.  Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+  --color-tests "$$am__color_tests" \
+  --enable-hard-errors "$$am__enable_hard_errors" \
+  --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test.  Creates the
+# directory for the log if needed.  Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log.  Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT.  Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup);					\
+$(am__vpath_adj_setup) $(am__vpath_adj)			\
+$(am__tty_colors);					\
+srcdir=$(srcdir); export srcdir;			\
+case "$@" in						\
+  */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;;	\
+    *) am__odir=.;; 					\
+esac;							\
+test "x$$am__odir" = x"." || test -d "$$am__odir" 	\
+  || $(MKDIR_P) "$$am__odir" || exit $$?;		\
+if test -f "./$$f"; then dir=./;			\
+elif test -f "$$f"; then dir=;				\
+else dir="$(srcdir)/"; fi;				\
+tst=$$dir$$f; log='$@'; 				\
+if test -n '$(DISABLE_HARD_ERRORS)'; then		\
+  am__enable_hard_errors=no; 				\
+else							\
+  am__enable_hard_errors=yes; 				\
+fi; 							\
+case " $(XFAIL_TESTS) " in				\
+  *[\ \	]$$f[\ \	]* | *[\ \	]$$dir$$f[\ \	]*) \
+    am__expect_failure=yes;;				\
+  *)							\
+    am__expect_failure=no;;				\
+esac; 							\
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed).  The result is saved in the shell variable
+# '$bases'.  This honors runtime overriding of TESTS and TEST_LOGS.  Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+  bases='$(TEST_LOGS)'; \
+  bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+  bases=`echo $$bases`
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+  case '$@' in \
+    */*) \
+      case '$*' in \
+        */*) b='$*';; \
+          *) b=`echo '$@' | sed 's/\.log$$//'`; \
+       esac;; \
+    *) \
+      b='$*';; \
+  esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
+TEST_LOGS = $(am__test_logs2:.sh.log=.log)
+SH_LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
+SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/depcomp \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
+AMTAR = @AMTAR@
+
+# H5_CFLAGS holds flags that should be used when building hdf5,
+# but which should not be exported to h5cc for building other programs.
+# AM_CFLAGS is an automake construct which should be used by Makefiles 
+# instead of CFLAGS, as CFLAGS is reserved solely for the user to define.
+# This applies to FCFLAGS, CXXFLAGS, CPPFLAGS, and LDFLAGS as well.
+AM_CFLAGS = @AM_CFLAGS@ @H5_CFLAGS@
+
+# Include src directory
+AM_CPPFLAGS = @AM_CPPFLAGS@ @H5_CPPFLAGS@ -I$(top_srcdir)/src \
+	-I$(top_srcdir)/tools/lib
+AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
+AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BYTESEX = @BYTESEX@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CC_VERSION = @CC_VERSION@
+CFLAGS = @CFLAGS@
+CLEARFILEBUF = @CLEARFILEBUF@
+CODESTACK = @CODESTACK@
+CONFIG_DATE = @CONFIG_DATE@
+CONFIG_MODE = @CONFIG_MODE@
+CONFIG_USER = @CONFIG_USER@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CXX_VERSION = @CXX_VERSION@
+CYGPATH_W = @CYGPATH_W@
+DEBUG_PKG = @DEBUG_PKG@
+DEFAULT_API_VERSION = @DEFAULT_API_VERSION@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_SYMBOLS = @DEPRECATED_SYMBOLS@
+DIRECT_VFD = @DIRECT_VFD@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+EXTERNAL_FILTERS = @EXTERNAL_FILTERS@
+
+# Make sure that these variables are exported to the Makefiles
+F9XMODEXT = @F9XMODEXT@
+F9XMODFLAG = @F9XMODFLAG@
+F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
+FC = @FC@
+FCFLAGS = @FCFLAGS@
+FCFLAGS_f90 = @FCFLAGS_f90@
+FCLIBS = @FCLIBS@
+FC_VERSION = @FC_VERSION@
+FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
+FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
+GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
+H5_CFLAGS = @H5_CFLAGS@
+H5_CPPFLAGS = @H5_CPPFLAGS@
+H5_CXXFLAGS = @H5_CXXFLAGS@
+H5_FCFLAGS = @H5_FCFLAGS@
+H5_FORTRAN_SHARED = @H5_FORTRAN_SHARED@
+H5_LDFLAGS = @H5_LDFLAGS@
+H5_VERSION = @H5_VERSION@
+HADDR_T = @HADDR_T@
+HAVE_DMALLOC = @HAVE_DMALLOC@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
+HAVE_PTHREAD = @HAVE_PTHREAD@
+HDF5_HL = @HDF5_HL@
+HDF5_INTERFACES = @HDF5_INTERFACES@
+HDF_CXX = @HDF_CXX@
+HDF_FORTRAN = @HDF_FORTRAN@
+HID_T = @HID_T@
+HL = @HL@
+HL_FOR = @HL_FOR@
+HSIZE_T = @HSIZE_T@
+HSSIZE_T = @HSSIZE_T@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INSTRUMENT = @INSTRUMENT@
+INSTRUMENT_LIBRARY = @INSTRUMENT_LIBRARY@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LL_PATH = @LL_PATH@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+LT_STATIC_EXEC = @LT_STATIC_EXEC@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+MPE = @MPE@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJECT_NAMELEN_DEFAULT_F = @OBJECT_NAMELEN_DEFAULT_F@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
+PARALLEL = @PARALLEL@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+ROOT = @ROOT@
+RUNPARALLEL = @RUNPARALLEL@
+RUNSERIAL = @RUNSERIAL@
+R_INTEGER = @R_INTEGER@
+R_LARGE = @R_LARGE@
+SEARCH = @SEARCH@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SIZE_T = @SIZE_T@
+STATIC_EXEC = @STATIC_EXEC@
+STATIC_SHARED = @STATIC_SHARED@
+STRICT_FORMAT_CHECKS = @STRICT_FORMAT_CHECKS@
+STRIP = @STRIP@
+TESTPARALLEL = @TESTPARALLEL@
+THREADSAFE = @THREADSAFE@
+TIME = @TIME@
+TR = @TR@
+TRACE_API = @TRACE_API@
+UNAME_INFO = @UNAME_INFO@
+USE_FILTER_DEFLATE = @USE_FILTER_DEFLATE@
+USE_FILTER_SZIP = @USE_FILTER_SZIP@
+USINGMEMCHECKER = @USINGMEMCHECKER@
+VERSION = @VERSION@
+WORDS_BIGENDIAN = @WORDS_BIGENDIAN@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_FC = @ac_ct_FC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+
+# Install directories that automake doesn't know about
+docdir = $(exec_prefix)/doc
+dvidir = @dvidir@
+enable_shared = @enable_shared@
+enable_static = @enable_static@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# Shell commands used in Makefiles
+RM = rm -f
+CP = cp
+
+# Some machines need a command to run executables; this is that command
+# so that our tests will run.
+# We use RUNEXEC instead of RUNSERIAL directly because it may be that
+# some tests need to be run with a different command.  Older versions
+# of the makefiles used the command
+# $(LIBTOOL) --mode=execute
+# in some directories, for instance.
+RUNEXEC = $(RUNSERIAL)
+
+# Libraries to link to while building
+LIBHDF5 = $(top_builddir)/src/libhdf5.la
+LIBH5TEST = $(top_builddir)/test/libh5test.la
+LIBH5F = $(top_builddir)/fortran/src/libhdf5_fortran.la
+LIBH5FTEST = $(top_builddir)/fortran/test/libh5test_fortran.la
+LIBH5CPP = $(top_builddir)/c++/src/libhdf5_cpp.la
+LIBH5TOOLS = $(top_builddir)/tools/lib/libh5tools.la
+LIBH5_HL = $(top_builddir)/hl/src/libhdf5_hl.la
+LIBH5F_HL = $(top_builddir)/hl/fortran/src/libhdf5hl_fortran.la
+LIBH5CPP_HL = $(top_builddir)/hl/c++/src/libhdf5_hl_cpp.la
+
+# Note that in svn revision 19400 the '/' after DESTDIR in H5* variables below  
+# has been removed. According to the official description of DESTDIR by Gnu at 
+# http://www.gnu.org/prep/standards/html_node/DESTDIR.html, DESTDIR is 
+# prepended to the normal and complete install path that it precedes for the 
+# purpose of installing in a temporary directory which is useful for building 
+# rpms and other packages.  The '/' after ${DESTDIR} will be followed by another 
+# '/' at the beginning of the normal install path.  When DESTDIR is empty the  
+# path then begins with '//', which is incorrect and causes problems at least for 
+# Cygwin.   
+
+# Scripts used to build examples
+# If only shared libraries have been installed, have h5cc build examples with
+# shared libraries instead of static libraries
+H5CC = ${DESTDIR}$(bindir)/h5cc
+H5CC_PP = ${DESTDIR}$(bindir)/h5pcc
+H5FC = ${DESTDIR}$(bindir)/h5fc
+H5FC_PP = ${DESTDIR}$(bindir)/h5pfc
+H5CPP = ${DESTDIR}$(bindir)/h5c++
+ACLOCAL_AMFLAGS = "-I m4"
+
+# The trace script; this is used on source files from the C library to
+# insert tracing macros.
+TRACE = perl $(top_srcdir)/bin/trace
+
+# .chkexe files are used to mark tests that have run successfully.
+# .chklog files are output from those tests.
+# *.clog and *.clog2 are from the MPE option.
+
+# Temporary files.
+CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 *.h5
+
+#test scripts and programs
+TEST_PROG = UC_1_one_dim_gen UC_2_two_dims_gen UC_3_gaps_gen UC_4_printf_gen \
+    UC_5_stride_gen
+
+
+# All programs rely on hdf5 library and h5tools library
+LDADD = $(LIBH5TOOLS) $(LIBHDF5)
+
+# Automake needs to be taught how to build lib, progs, and tests targets.
+# These will be filled in automatically for the most part (e.g.,
+# lib_LIBRARIES are built for lib target), but EXTRA_LIB, EXTRA_PROG, and
+# EXTRA_TEST variables are supplied to allow the user to force targets to
+# be built at certain times. 
+LIB = $(lib_LIBRARIES) $(lib_LTLIBRARIES) $(noinst_LIBRARIES)                 \
+      $(noinst_LTLIBRARIES) $(check_LIBRARIES) $(check_LTLIBRARIES) $(EXTRA_LIB)
+
+PROGS = $(bin_PROGRAMS) $(bin_SCRIPTS) $(noinst_PROGRAMS) $(noinst_SCRIPTS)   \
+        $(EXTRA_PROG)
+
+chk_TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(EXTRA_TEST) 
+TEST_EXTENSIONS = .sh
+SH_LOG_COMPILER = $(SHELL)
+AM_SH_LOG_FLAGS = 
+TEST_PROG_CHKEXE = $(TEST_PROG:=.chkexe_)
+TEST_PROG_PARA_CHKEXE = $(TEST_PROG_PARA:=.chkexe_)
+TEST_SCRIPT_CHKSH = $(TEST_SCRIPT:=.chkexe_)
+TEST_SCRIPT_PARA_CHKSH = $(TEST_SCRIPT_PARA:=.chkexe_)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .log .o .obj .sh .sh$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/misc/vds/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign tools/misc/vds/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+
+UC_1_one_dim_gen$(EXEEXT): $(UC_1_one_dim_gen_OBJECTS) $(UC_1_one_dim_gen_DEPENDENCIES) $(EXTRA_UC_1_one_dim_gen_DEPENDENCIES) 
+	@rm -f UC_1_one_dim_gen$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(UC_1_one_dim_gen_OBJECTS) $(UC_1_one_dim_gen_LDADD) $(LIBS)
+
+UC_2_two_dims_gen$(EXEEXT): $(UC_2_two_dims_gen_OBJECTS) $(UC_2_two_dims_gen_DEPENDENCIES) $(EXTRA_UC_2_two_dims_gen_DEPENDENCIES) 
+	@rm -f UC_2_two_dims_gen$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(UC_2_two_dims_gen_OBJECTS) $(UC_2_two_dims_gen_LDADD) $(LIBS)
+
+UC_3_gaps_gen$(EXEEXT): $(UC_3_gaps_gen_OBJECTS) $(UC_3_gaps_gen_DEPENDENCIES) $(EXTRA_UC_3_gaps_gen_DEPENDENCIES) 
+	@rm -f UC_3_gaps_gen$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(UC_3_gaps_gen_OBJECTS) $(UC_3_gaps_gen_LDADD) $(LIBS)
+
+UC_4_printf_gen$(EXEEXT): $(UC_4_printf_gen_OBJECTS) $(UC_4_printf_gen_DEPENDENCIES) $(EXTRA_UC_4_printf_gen_DEPENDENCIES) 
+	@rm -f UC_4_printf_gen$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(UC_4_printf_gen_OBJECTS) $(UC_4_printf_gen_LDADD) $(LIBS)
+
+UC_5_stride_gen$(EXEEXT): $(UC_5_stride_gen_OBJECTS) $(UC_5_stride_gen_DEPENDENCIES) $(EXTRA_UC_5_stride_gen_DEPENDENCIES) 
+	@rm -f UC_5_stride_gen$(EXEEXT)
+	$(AM_V_CCLD)$(LINK) $(UC_5_stride_gen_OBJECTS) $(UC_5_stride_gen_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/UC_1_one_dim_gen.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/UC_2_two_dims_gen.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/UC_3_gaps_gen.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/UC_4_printf_gen.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/UC_5_stride_gen.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'.  Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+	rm -f $< $@
+	$(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+	@:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+	@$(am__set_TESTS_bases); \
+	am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+	redo_bases=`for i in $$bases; do \
+	              am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+	            done`; \
+	if test -n "$$redo_bases"; then \
+	  redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+	  redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+	  if $(am__make_dryrun); then :; else \
+	    rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+	  fi; \
+	fi; \
+	if test -n "$$am__remaking_logs"; then \
+	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+	       "recursion detected" >&2; \
+	elif test -n "$$redo_logs"; then \
+	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+	fi; \
+	if $(am__make_dryrun); then :; else \
+	  st=0;  \
+	  errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+	  for i in $$redo_bases; do \
+	    test -f $$i.trs && test -r $$i.trs \
+	      || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+	    test -f $$i.log && test -r $$i.log \
+	      || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+	  done; \
+	  test $$st -eq 0 || exit 1; \
+	fi
+	@$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+	ws='[ 	]'; \
+	results=`for b in $$bases; do echo $$b.trs; done`; \
+	test -n "$$results" || results=/dev/null; \
+	all=`  grep "^$$ws*:test-result:"           $$results | wc -l`; \
+	pass=` grep "^$$ws*:test-result:$$ws*PASS"  $$results | wc -l`; \
+	fail=` grep "^$$ws*:test-result:$$ws*FAIL"  $$results | wc -l`; \
+	skip=` grep "^$$ws*:test-result:$$ws*SKIP"  $$results | wc -l`; \
+	xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+	xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+	error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+	if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+	  success=true; \
+	else \
+	  success=false; \
+	fi; \
+	br='==================='; br=$$br$$br$$br$$br; \
+	result_count () \
+	{ \
+	    if test x"$$1" = x"--maybe-color"; then \
+	      maybe_colorize=yes; \
+	    elif test x"$$1" = x"--no-color"; then \
+	      maybe_colorize=no; \
+	    else \
+	      echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+	    fi; \
+	    shift; \
+	    desc=$$1 count=$$2; \
+	    if test $$maybe_colorize = yes && test $$count -gt 0; then \
+	      color_start=$$3 color_end=$$std; \
+	    else \
+	      color_start= color_end=; \
+	    fi; \
+	    echo "$${color_start}# $$desc $$count$${color_end}"; \
+	}; \
+	create_testsuite_report () \
+	{ \
+	  result_count $$1 "TOTAL:" $$all   "$$brg"; \
+	  result_count $$1 "PASS: " $$pass  "$$grn"; \
+	  result_count $$1 "SKIP: " $$skip  "$$blu"; \
+	  result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+	  result_count $$1 "FAIL: " $$fail  "$$red"; \
+	  result_count $$1 "XPASS:" $$xpass "$$red"; \
+	  result_count $$1 "ERROR:" $$error "$$mgn"; \
+	}; \
+	{								\
+	  echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" |	\
+	    $(am__rst_title);						\
+	  create_testsuite_report --no-color;				\
+	  echo;								\
+	  echo ".. contents:: :depth: 2";				\
+	  echo;								\
+	  for b in $$bases; do echo $$b; done				\
+	    | $(am__create_global_log);					\
+	} >$(TEST_SUITE_LOG).tmp || exit 1;				\
+	mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG);			\
+	if $$success; then						\
+	  col="$$grn";							\
+	 else								\
+	  col="$$red";							\
+	  test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG);		\
+	fi;								\
+	echo "$${col}$$br$${std}"; 					\
+	echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}";	\
+	echo "$${col}$$br$${std}"; 					\
+	create_testsuite_report --maybe-color;				\
+	echo "$$col$$br$$std";						\
+	if $$success; then :; else					\
+	  echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}";		\
+	  if test -n "$(PACKAGE_BUGREPORT)"; then			\
+	    echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}";	\
+	  fi;								\
+	  echo "$$col$$br$$std";					\
+	fi;								\
+	$$success || exit 1
+recheck: all $(check_PROGRAMS)
+	@test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+	@set +e; $(am__set_TESTS_bases); \
+	bases=`for i in $$bases; do echo $$i; done \
+	         | $(am__list_recheck_tests)` || exit 1; \
+	log_list=`for i in $$bases; do echo $$i.log; done`; \
+	log_list=`echo $$log_list`; \
+	$(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+	        am__force_recheck=am--force-recheck \
+	        TEST_LOGS="$$log_list"; \
+	exit $$?
+UC_1_one_dim_gen.log: UC_1_one_dim_gen$(EXEEXT)
+	@p='UC_1_one_dim_gen$(EXEEXT)'; \
+	b='UC_1_one_dim_gen'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+UC_2_two_dims_gen.log: UC_2_two_dims_gen$(EXEEXT)
+	@p='UC_2_two_dims_gen$(EXEEXT)'; \
+	b='UC_2_two_dims_gen'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+UC_3_gaps_gen.log: UC_3_gaps_gen$(EXEEXT)
+	@p='UC_3_gaps_gen$(EXEEXT)'; \
+	b='UC_3_gaps_gen'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+UC_4_printf_gen.log: UC_4_printf_gen$(EXEEXT)
+	@p='UC_4_printf_gen$(EXEEXT)'; \
+	b='UC_4_printf_gen'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+UC_5_stride_gen.log: UC_5_stride_gen$(EXEEXT)
+	@p='UC_5_stride_gen$(EXEEXT)'; \
+	b='UC_5_stride_gen'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+.sh.log:
+	@p='$<'; \
+	$(am__set_b); \
+	$(am__check_pre) $(SH_LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_SH_LOG_DRIVER_FLAGS) $(SH_LOG_DRIVER_FLAGS) -- $(SH_LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+ at am__EXEEXT_TRUE@.sh$(EXEEXT).log:
+ at am__EXEEXT_TRUE@	@p='$<'; \
+ at am__EXEEXT_TRUE@	$(am__set_b); \
+ at am__EXEEXT_TRUE@	$(am__check_pre) $(SH_LOG_DRIVER) --test-name "$$f" \
+ at am__EXEEXT_TRUE@	--log-file $$b.log --trs-file $$b.trs \
+ at am__EXEEXT_TRUE@	$(am__common_driver_flags) $(AM_SH_LOG_DRIVER_FLAGS) $(SH_LOG_DRIVER_FLAGS) -- $(SH_LOG_COMPILE) \
+ at am__EXEEXT_TRUE@	"$$tst" $(AM_TESTS_FD_REDIRECT)
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile all-local
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+	-test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+	-test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+	-test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool mostlyclean-local
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am all-local check check-TESTS \
+	check-am clean clean-checkPROGRAMS clean-generic clean-libtool \
+	cscopelist-am ctags ctags-am distclean distclean-compile \
+	distclean-generic distclean-libtool distclean-tags distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-dvi install-dvi-am \
+	install-exec install-exec-am install-html install-html-am \
+	install-info install-info-am install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	installcheck installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \
+	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
+# This tells the Makefiles that these targets are not files to be built but
+# commands that should be executed even if a file with the same name already
+# exists.
+.PHONY: build-check-clean build-check-p build-check-s build-lib build-progs \
+        build-tests check-clean check-install check-p check-s check-vfd \
+        install-doc lib progs tests uninstall-doc _exec_check-s _test help
+
+help:
+	@$(top_srcdir)/bin/makehelp
+
+# lib/progs/tests targets recurse into subdirectories. build-* targets
+# build files in this directory.
+build-lib: $(LIB)
+build-progs: $(LIB) $(PROGS)
+build-tests: $(LIB) $(PROGS) $(chk_TESTS)
+
+# General rule for recursive building targets.
+# BUILT_SOURCES contain targets that need to be built before anything else
+# in the directory (e.g., for Fortran type detection)
+lib progs tests check-s check-p :: $(BUILT_SOURCES)
+	@$(MAKE) $(AM_MAKEFLAGS) build-$@ || exit 1;
+	@for d in X $(SUBDIRS); do                                             \
+	    if test $$d != X && test $$d != .; then                           \
+	        (set -x; cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1;     \
+	    fi;                                                               \
+	done
+
+# General rule for recursive cleaning targets.  Like the rule above,
+# but doesn't require building BUILT_SOURCES.
+check-clean ::
+	@$(MAKE) $(AM_MAKEFLAGS) build-$@ || exit 1;
+	@for d in X $(SUBDIRS); do                                             \
+	    if test $$d != X && test $$d != .; then                           \
+	        (set -x; cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1;     \
+	    fi;                                                               \
+	done
+
+# Tell Automake to build tests when the user types `make all' (this is
+# not its default behavior).  Also build EXTRA_LIB and EXTRA_PROG since
+# Automake won't build them automatically, either.
+all-local: $(EXTRA_LIB) $(EXTRA_PROG) $(chk_TESTS)
+
+# make install-doc doesn't do anything outside of doc directory, but
+# Makefiles should recognize it.
+# UPDATE: docs no longer reside in this build tree, so this target
+# is depreciated.
+install-doc uninstall-doc:
+	@echo "Nothing to be done."
+
+# clean up files generated by tests so they can be re-run.
+build-check-clean:
+	$(RM) -rf $(CHECK_CLEANFILES)
+
+# run check-clean whenever mostlyclean is run
+mostlyclean-local: build-check-clean
+
+# check-install is just a synonym for installcheck
+check-install: installcheck
+
+# Run each test in order, passing $(TEST_FLAGS) to the program.
+# Since tests are done in a shell loop, "make -i" does apply inside it.
+# Set HDF5_Make_Ignore to a non-blank string to ignore errors inside the loop.
+# The timestamps give a rough idea how much time the tests use.
+#
+# Note that targets in chk_TESTS (defined above) will be built when the user
+# types 'make tests' or 'make check', but only programs in TEST_PROG,
+# TEST_PROG_PARA, or TEST_SCRIPT will actually be executed.
+check-TESTS: test
+
+test _test:
+	@$(MAKE) build-check-s
+	@$(MAKE) build-check-p
+
+# Actual execution of check-s.
+build-check-s: $(LIB) $(PROGS) $(chk_TESTS)
+	@if test -n "$(TEST_PROG)$(TEST_SCRIPT)"; then      \
+	   echo "===Serial tests in `echo ${PWD} | sed -e s:.*/::` begin `date`==="; \
+	fi
+	@$(MAKE) $(AM_MAKEFLAGS) _exec_check-s
+	@if test -n "$(TEST_PROG)$(TEST_SCRIPT)"; then      \
+	    echo "===Serial tests in `echo ${PWD} | sed -e s:.*/::` ended `date`===";\
+	fi
+
+_exec_check-s: $(TEST_PROG_CHKEXE) $(TEST_SCRIPT_CHKSH)
+
+# The dummy.chkexe here prevents the target from being
+# empty if there are no tests in the current directory.
+# $${log} is the log file.
+# $${tname} is the name of test.
+$(TEST_PROG_CHKEXE) $(TEST_PROG_PARA_CHKEXE) dummy.chkexe_:
+	@if test "X$@" != "X.chkexe_" && test "X$@" != "Xdummy.chkexe_"; then \
+	   tname=$(@:.chkexe_=)$(EXEEXT);\
+	   log=$(@:.chkexe_=.chklog); \
+	   echo "============================"; \
+	   if $(top_srcdir)/bin/newer $(@:.chkexe_=.chkexe) $${tname}; then \
+	      echo "No need to test $${tname} again."; \
+	   else \
+	      echo "============================" > $${log}; \
+	      if test "X$(FORTRAN_API)" = "Xyes"; then \
+	         echo "Fortran API: Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \
+	         echo "Fortran API: $(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      elif test "X$(CXX_API)" = "Xyes"; then \
+	         echo "C++ API: Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \
+	         echo "C++ API: $(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log};\
+	      else \
+	         echo "Testing $(HDF5_DRIVER) $${tname} $(TEST_FLAGS)"; \
+	         echo "$(HDF5_DRIVER) $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      fi; \
+	      echo "============================" >> $${log}; \
+	      srcdir="$(srcdir)" \
+	         $(TIME) $(RUNEXEC) ./$${tname} $(TEST_FLAGS) >> $${log} 2>&1 \
+	         && touch $(@:.chkexe_=.chkexe) || \
+	         (test $$HDF5_Make_Ignore && echo "*** Error ignored") || \
+	         (cat $${log} && false) || exit 1; \
+	      echo "" >> $${log}; \
+	      echo "Finished testing $${tname} $(TEST_FLAGS)" >> $${log}; \
+	      echo "============================" >> $${log}; \
+	      echo "Finished testing $${tname} $(TEST_FLAGS)"; \
+	      cat $${log}; \
+	   fi; \
+	fi
+
+# The dummysh.chkexe here prevents the target from being
+# empty if there are no tests in the current directory.
+# $${log} is the log file.
+# $${tname} is the name of test.
+$(TEST_SCRIPT_CHKSH) $(TEST_SCRIPT_PARA_CHKSH) dummysh.chkexe_:
+	@if test "X$@" != "X.chkexe_" && test "X$@" != "Xdummysh.chkexe_"; then \
+	   cmd=$(@:.chkexe_=);\
+	   tname=`basename $$cmd`;\
+	   chkname=`basename $(@:.chkexe_=.chkexe)`;\
+	   log=`basename $(@:.chkexe_=.chklog)`; \
+	   echo "============================"; \
+	   if $(top_srcdir)/bin/newer $${chkname} $$cmd $(SCRIPT_DEPEND); then \
+	      echo "No need to test $${tname} again."; \
+	   else \
+	      echo "============================" > $${log}; \
+	      if test "X$(FORTRAN_API)" = "Xyes"; then \
+	         echo "Fortran API: Testing $${tname} $(TEST_FLAGS)"; \
+	         echo "Fortran API: $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      elif test "X$(CXX_API)" = "Xyes"; then \
+	         echo "C++ API: Testing $${tname} $(TEST_FLAGS)"; \
+	         echo "C++ API: $${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      else \
+	         echo "Testing $${tname} $(TEST_FLAGS)"; \
+	         echo "$${tname} $(TEST_FLAGS) Test Log" >> $${log}; \
+	      fi; \
+	      echo "============================" >> $${log}; \
+	      RUNSERIAL="$(RUNSERIAL)" RUNPARALLEL="$(RUNPARALLEL)"           \
+	      srcdir="$(srcdir)" \
+	         $(TIME) $(SHELL) $$cmd $(TEST_FLAGS) >> $${log} 2>&1 \
+	         && touch $${chkname} || \
+	         (test $$HDF5_Make_Ignore && echo "*** Error ignored") || \
+	         (cat $${log} && false) || exit 1; \
+	      echo "" >> $${log}; \
+	      echo "Finished testing $${tname} $(TEST_FLAGS)" >> $${log}; \
+	      echo "============================" >> $${log}; \
+	      echo "Finished testing $${tname} $(TEST_FLAGS)"; \
+	      cat $${log}; \
+	   fi; \
+	   echo "============================"; \
+	fi
+
+# Actual execution of check-p.
+build-check-p: $(LIB) $(PROGS) $(chk_TESTS)
+	@if test -n "$(TEST_PROG_PARA)$(TEST_SCRIPT_PARA)"; then      \
+	   echo "===Parallel tests in `echo ${PWD} | sed -e s:.*/::` begin `date`==="; \
+	fi
+	@if test -n "$(TEST_PROG_PARA)"; then                                \
+	    echo "**** Hint ****";                                            \
+	    echo "Parallel test files reside in the current directory"        \
+	         "by default.";                                               \
+	    echo "Set HDF5_PARAPREFIX to use another directory. E.g.,";       \
+	    echo "    HDF5_PARAPREFIX=/PFS/user/me";                          \
+	    echo "    export HDF5_PARAPREFIX";                                \
+	    echo "    make check";                                            \
+	    echo "**** end of Hint ****";                                     \
+	fi
+	@for test in $(TEST_PROG_PARA) dummy; do                             \
+	   if test $$test != dummy; then                                      \
+	      $(MAKE) $(AM_MAKEFLAGS) $$test.chkexe_ \
+	      RUNEXEC="$(RUNPARALLEL)" || exit 1; \
+	   fi;                                                                \
+	done
+	@for test in $(TEST_SCRIPT_PARA) dummy; do                           \
+	  if test $$test != dummy; then                                      \
+	    $(MAKE) $(AM_MAKEFLAGS) $$test.chkexe_ || exit 1; \
+	  fi;                                                                 \
+	done
+	@if test -n "$(TEST_PROG_PARA)$(TEST_SCRIPT_PARA)"; then      \
+	    echo "===Parallel tests in `echo ${PWD} | sed -e s:.*/::` ended `date`===";\
+	fi
+
+# Run test with different Virtual File Driver
+check-vfd: $(LIB) $(PROGS) $(chk_TESTS)
+	@for vfd in $(VFD_LIST) dummy; do                                     \
+	    if test $$vfd != dummy; then                                      \
+	        echo "============================";                          \
+	        echo "Testing Virtual File Driver $$vfd";                     \
+	        echo "============================";                          \
+	        $(MAKE) $(AM_MAKEFLAGS) check-clean || exit 1;                \
+	        HDF5_DRIVER=$$vfd $(MAKE) $(AM_MAKEFLAGS) check || exit 1;    \
+	    fi;                                                               \
+	done
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tools/misc/vds/UC_1.h b/tools/misc/vds/UC_1.h
new file mode 100644
index 0000000..24299d4
--- /dev/null
+++ b/tools/misc/vds/UC_1.h
@@ -0,0 +1,150 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef UC_1_H
+#define UC_1_H
+
+#include "hdf5.h"
+
+#include "UC_common.h"
+
+/*
+ * Definitions for VDS use case 1
+ *
+ * Datasets have a single unlimited dimension and two fixed dimensions. They
+ * are mapped along a single dimension in the VDS with no gaps between them.
+ */
+
+/* virtual dataset <---> source dataset mapping and sizes
+
+   *****************  --+
+   *       A       *    K
+   *****************  --+
+   *               *    |
+   *       B       *    N
+   *               *    |
+   *****************  --+
+   *       C       *
+   *****************
+   *               *
+   *       D       *
+   *               *
+   *****************
+   *       E       *
+   *****************
+   *               *
+   *       F       *
+   *               *
+   *****************
+
+   |               |
+   +-------M-------+
+ 
+
+        dim[0]
+       /
+      /
+     /
+    -----> dim[2]
+    |
+    |
+    |
+   dim[1]
+
+  */
+
+
+#define UC_1_N_SOURCES      6
+
+/* Dataset dimensions */
+#define UC_1_SM_HEIGHT      2   /* K */
+#define UC_1_LG_HEIGHT      4   /* N */
+#define UC_1_SM_LG_HEIGHT   6   /* SM_HEIGHT + LG_HEIGHT */
+#define UC_1_FULL_HEIGHT    18  /* (3 * K) + (3 * N) */
+#define UC_1_HALF_HEIGHT    9
+#define UC_1_WIDTH          8   /* M */
+#define UC_1_HALF_WIDTH     4
+
+#define UC_1_N_MAX_PLANES   H5S_UNLIMITED   /* max number of planes         */
+#define UC_1_N_TEST_PLANES  5               /* number of planes we write    */
+
+/* Dataset datatypes */
+#define UC_1_SOURCE_DATATYPE    H5T_STD_I32LE
+#define UC_1_VDS_DATATYPE       H5T_STD_I32LE
+
+/* Starting size of datasets, both source and VDS */
+static hsize_t UC_1_DIMS[UC_1_N_SOURCES][RANK] = {
+    {0, UC_1_SM_HEIGHT, UC_1_WIDTH},
+    {0, UC_1_LG_HEIGHT, UC_1_WIDTH},
+    {0, UC_1_SM_HEIGHT, UC_1_WIDTH},
+    {0, UC_1_LG_HEIGHT, UC_1_WIDTH},
+    {0, UC_1_SM_HEIGHT, UC_1_WIDTH},
+    {0, UC_1_LG_HEIGHT, UC_1_WIDTH}
+};
+static hsize_t UC_1_VDS_DIMS[RANK] = {0, UC_1_FULL_HEIGHT, UC_1_WIDTH};
+
+/* Maximum size of datasets, both source and VDS */
+static hsize_t UC_1_MAX_DIMS[UC_1_N_SOURCES][RANK] = {
+    {UC_1_N_MAX_PLANES, UC_1_SM_HEIGHT, UC_1_WIDTH},
+    {UC_1_N_MAX_PLANES, UC_1_LG_HEIGHT, UC_1_WIDTH},
+    {UC_1_N_MAX_PLANES, UC_1_SM_HEIGHT, UC_1_WIDTH},
+    {UC_1_N_MAX_PLANES, UC_1_LG_HEIGHT, UC_1_WIDTH},
+    {UC_1_N_MAX_PLANES, UC_1_SM_HEIGHT, UC_1_WIDTH},
+    {UC_1_N_MAX_PLANES, UC_1_LG_HEIGHT, UC_1_WIDTH}
+};
+static hsize_t UC_1_VDS_MAX_DIMS[RANK] = {UC_1_N_MAX_PLANES, UC_1_FULL_HEIGHT, UC_1_WIDTH};
+
+/* Planes */
+static hsize_t UC_1_PLANES[UC_1_N_SOURCES][RANK] = {
+    {1, UC_1_SM_HEIGHT, UC_1_WIDTH},
+    {1, UC_1_LG_HEIGHT, UC_1_WIDTH},
+    {1, UC_1_SM_HEIGHT, UC_1_WIDTH},
+    {1, UC_1_LG_HEIGHT, UC_1_WIDTH},
+    {1, UC_1_SM_HEIGHT, UC_1_WIDTH},
+    {1, UC_1_LG_HEIGHT, UC_1_WIDTH}
+};
+static hsize_t UC_1_VDS_PLANE[RANK] = {1, UC_1_FULL_HEIGHT, UC_1_WIDTH};
+
+/* File names for source datasets */
+static char UC_1_FILE_NAMES[UC_1_N_SOURCES][NAME_LEN] = {
+    {"1_a.h5"},
+    {"1_b.h5"},
+    {"1_c.h5"},
+    {"1_d.h5"},
+    {"1_e.h5"},
+    {"1_f.h5"}
+};
+
+/* VDS file name */
+static char UC_1_VDS_FILE_NAME[NAME_LEN] = "1_vds.h5";
+    
+/* Dataset names */
+static char UC_1_SOURCE_DSET_NAME[NAME_LEN] = "source_dset";
+static char UC_1_SOURCE_DSET_PATH[NAME_LEN] = "/source_dset";
+static char UC_1_VDS_DSET_NAME[NAME_LEN]    = "vds_dset";
+
+/* Fill values */
+static int UC_1_FILL_VALUES[UC_1_N_SOURCES] = {
+    -1,
+    -2,
+    -3,
+    -4,
+    -5,
+    -6
+};
+static int UC_1_VDS_FILL_VALUE = -9;
+
+#endif /* UC_1_H */
+
diff --git a/tools/misc/vds/UC_1_one_dim_gen.c b/tools/misc/vds/UC_1_one_dim_gen.c
new file mode 100644
index 0000000..ee56622
--- /dev/null
+++ b/tools/misc/vds/UC_1_one_dim_gen.c
@@ -0,0 +1,239 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * File/dataset generator for VDS use case 1
+ *
+ * See the header file for a description.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "hdf5.h"
+
+#include "UC_common.h"
+#include "UC_1.h"
+
+
+int
+main(void)
+{
+    hid_t src_sid       = -1;   /* source dataset's dataspace ID            */
+    hid_t src_dcplid    = -1;   /* source dataset property list ID          */
+
+    hid_t vds_sid       = -1;   /* VDS dataspace ID                         */
+    hid_t vds_dcplid    = -1;   /* VDS dataset property list ID             */
+
+    hid_t fid           = -1;   /* HDF5 file ID                             */
+    hid_t did           = -1;   /* dataset ID                               */
+    hid_t msid          = -1;   /* memory dataspace ID                      */
+    hid_t fsid          = -1;   /* file dataspace ID                        */
+
+    hsize_t extent[RANK];       /* dataset extents                          */
+    hsize_t start[RANK];        /* starting point for hyperslab             */
+    int map_start       = -1;   /* starting point in the VDS map            */
+
+    int *buffer         = NULL; /* data buffer                              */
+    hsize_t count       = 0;    /* number of elements in a plane            */
+    int n_planes        = -1;   /* number of planes to write                */
+    int value           = -1;   /* value written to datasets                */
+
+    int i;                      /* iterator                                 */
+    int j;                      /* iterator                                 */
+    int k;                      /* iterator                                 */
+
+
+    /* Start by creating the virtual dataset (VDS) dataspace and creation
+     * property list. The individual source datasets are then created
+     * and the VDS map (stored in the VDS property list) is updated.
+     */
+
+    /* Create VDS dcpl */
+    if((vds_dcplid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        UC_ERROR
+    if(H5Pset_fill_value(vds_dcplid, UC_1_VDS_DATATYPE,
+                &UC_1_VDS_FILL_VALUE) < 0)
+        UC_ERROR
+
+    /* Create VDS dataspace */
+    if((vds_sid = H5Screate_simple(RANK, UC_1_VDS_DIMS,
+                    UC_1_VDS_MAX_DIMS)) < 0)
+        UC_ERROR
+
+    /************************************
+     * Create source files and datasets *
+     ************************************/
+
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 0;
+    map_start = 0;
+
+    for(i = 0; i < UC_1_N_SOURCES; i++) {
+
+        /* Create source dataset dcpl */
+        if((src_dcplid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+            UC_ERROR
+        if(H5Pset_chunk(src_dcplid, RANK, UC_1_PLANES[i]) < 0)
+            UC_ERROR
+        if(H5Pset_fill_value(src_dcplid, UC_1_SOURCE_DATATYPE,
+                    &UC_1_FILL_VALUES[i]) < 0)
+            UC_ERROR
+        if(0 != i % 2)
+            if(H5Pset_deflate(src_dcplid, COMPRESSION_LEVEL) < 0)
+                UC_ERROR
+
+        /* Create source file, dataspace, and dataset */
+        if((fid = H5Fcreate(UC_1_FILE_NAMES[i], H5F_ACC_TRUNC,
+                        H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            UC_ERROR
+        if((src_sid = H5Screate_simple(RANK, UC_1_DIMS[i],
+                        UC_1_MAX_DIMS[i])) < 0)
+            UC_ERROR
+        if((did = H5Dcreate2(fid, UC_1_SOURCE_DSET_NAME,
+                        UC_1_SOURCE_DATATYPE, src_sid,
+                        H5P_DEFAULT, src_dcplid, H5P_DEFAULT)) < 0)
+            UC_ERROR
+
+        /* Set the dataset's extent (will eventually vary with i) */
+        extent[0] = UC_1_N_TEST_PLANES;
+        extent[1] = UC_1_PLANES[i][1];
+        extent[2] = UC_1_PLANES[i][2];
+        if(H5Dset_extent(did, extent) < 0)
+            UC_ERROR
+
+        /* Create a data buffer that represents a plane */
+        count = UC_1_PLANES[i][1] * UC_1_PLANES[i][2];
+        if(NULL == (buffer = (int *)malloc(count * sizeof(int))))
+            UC_ERROR
+
+        /* Create the memory dataspace */
+        if((msid = H5Screate_simple(RANK, UC_1_PLANES[i], NULL)) < 0)
+            UC_ERROR
+
+        /* Get the file dataspace */
+        if((fsid = H5Dget_space(did)) < 0)
+            UC_ERROR
+
+        /* Write planes to the dataset, number will eventually vary with i */
+        n_planes = UC_1_N_TEST_PLANES;
+        for(j = 0; j < n_planes; j++) {
+
+            value = ((i + 1) * 10) + j;
+            for(k = 0; k < count; k++)
+               buffer[k] = value; 
+
+            start[0] = j;
+            start[1] = 0;
+            start[2] = 0;
+            if(H5Sselect_hyperslab(fsid, H5S_SELECT_SET, start, NULL, UC_1_PLANES[i], NULL) < 0)
+                UC_ERROR
+            if(H5Dwrite(did, H5T_NATIVE_INT, msid, fsid, H5P_DEFAULT, buffer) < 0)
+                UC_ERROR
+
+        } /* end for */
+
+        /* set up hyperslabs for source and destination datasets */
+        start[0] = 0;
+        start[1] = 0;
+        start[2] = 0;
+        if(H5Sselect_hyperslab(src_sid, H5S_SELECT_SET, start, NULL,
+                    UC_1_MAX_DIMS[i], NULL) < 0)
+            UC_ERROR
+        start[0] = 0;
+        start[1] = map_start;
+        start[2] = 0;
+        if(H5Sselect_hyperslab(vds_sid, H5S_SELECT_SET, start, NULL,
+                    UC_1_MAX_DIMS[i], NULL) < 0)
+            UC_ERROR
+        map_start += UC_1_PLANES[i][1];
+
+        /* Add VDS mapping */
+        if(H5Pset_virtual(vds_dcplid, vds_sid, UC_1_FILE_NAMES[i],
+                    UC_1_SOURCE_DSET_PATH, src_sid) < 0)
+            UC_ERROR
+
+        /* close */
+        if(H5Sclose(src_sid) < 0)
+            UC_ERROR
+        if(H5Pclose(src_dcplid) < 0)
+            UC_ERROR
+        if(H5Sclose(msid) < 0)
+            UC_ERROR
+        if(H5Sclose(fsid) < 0)
+            UC_ERROR
+        if(H5Dclose(did) < 0)
+            UC_ERROR
+        if(H5Fclose(fid) < 0)
+            UC_ERROR
+        free(buffer);
+
+    } /* end for */
+
+
+    /*******************
+     * Create VDS file *
+     *******************/
+
+    /* file */
+    if((fid = H5Fcreate(UC_1_VDS_FILE_NAME, H5F_ACC_TRUNC,
+                    H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        UC_ERROR
+
+    /* dataset */
+    if((did = H5Dcreate2(fid, UC_1_VDS_DSET_NAME, UC_1_VDS_DATATYPE, vds_sid,
+                    H5P_DEFAULT, vds_dcplid, H5P_DEFAULT)) < 0)
+        UC_ERROR
+
+    /* close */
+    if(H5Pclose(vds_dcplid) < 0)
+        UC_ERROR
+    if(H5Sclose(vds_sid) < 0)
+        UC_ERROR
+    if(H5Dclose(did) < 0)
+        UC_ERROR
+    if(H5Fclose(fid) < 0)
+        UC_ERROR
+
+    return EXIT_SUCCESS;
+
+error:
+
+    H5E_BEGIN_TRY {
+        if(src_sid >= 0)
+            (void)H5Sclose(src_sid);
+        if(src_dcplid >= 0)
+            (void)H5Pclose(src_dcplid);
+        if(vds_sid >= 0)
+            (void)H5Sclose(vds_sid);
+        if(vds_dcplid >= 0)
+            (void)H5Pclose(vds_dcplid);
+        if(fid >= 0)
+            (void)H5Fclose(fid);
+        if(did >= 0)
+            (void)H5Dclose(did);
+        if(msid >= 0)
+            (void)H5Sclose(msid);
+        if(fsid >= 0)
+            (void)H5Sclose(fsid);
+        if(buffer != NULL)
+            free(buffer);
+    } H5E_END_TRY
+
+    return EXIT_FAILURE;
+
+} /* end main */
+
diff --git a/tools/misc/vds/UC_2.h b/tools/misc/vds/UC_2.h
new file mode 100644
index 0000000..8b9f19a
--- /dev/null
+++ b/tools/misc/vds/UC_2.h
@@ -0,0 +1,151 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef UC_2_H
+#define UC_2_H
+
+#include "hdf5.h"
+
+/*
+ * Definitions for VDS use case 2
+ *
+ * Datasets have a single unlimited dimension and two fixed dimensions. They
+ * are mapped along two dimensions in the VDS with no gaps between them.
+ */
+
+/* virtual dataset <---> source dataset mapping and sizes
+
+   **********************************
+   *       A       *                *
+   *****************        D       *
+   *               *                *
+   *       B       *                *
+   *               ******************
+   *****************        E       *
+   *       C       *                *
+   **********************************
+
+
+        dim[0]
+       /
+      /
+     /
+    -----> dim[2]
+    |
+    |
+    |
+   dim[1]
+ 
+ */
+
+#define UC_2_N_SOURCES      5
+
+/* Dataset dimensions */
+#define UC_2_A_HEIGHT       2
+#define UC_2_B_HEIGHT       4
+#define UC_2_AB_HEIGHT      6   /* For hyperslab start position */
+#define UC_2_C_HEIGHT       2
+#define UC_2_D_HEIGHT       5
+#define UC_2_E_HEIGHT       3
+#define UC_2_FULL_HEIGHT    8  /* A+B+C and D+E */
+#define UC_2_WIDTH          7
+#define UC_2_FULL_WIDTH     14 /* 2*width */
+
+#define UC_2_N_PLANES_IN_SERIES 3   /* number of planes in a series of sub-images */
+#define UC_2_N_MAX_PLANES       H5S_UNLIMITED   /* max number of planes */
+#define UC_2_N_TEST_PLANES      6   /* number of planes we write */
+
+/* Dataset datatypes */
+#define UC_2_SOURCE_DATATYPE    H5T_STD_I32LE
+#define UC_2_VDS_DATATYPE       H5T_STD_I32LE
+
+/* Starting size of datasets, both source and VDS */
+static hsize_t UC_2_DIMS[UC_2_N_SOURCES][RANK] = {
+    {0, UC_2_A_HEIGHT, UC_2_WIDTH},
+    {0, UC_2_B_HEIGHT, UC_2_WIDTH},
+    {0, UC_2_C_HEIGHT, UC_2_WIDTH},
+    {0, UC_2_D_HEIGHT, UC_2_WIDTH},
+    {0, UC_2_E_HEIGHT, UC_2_WIDTH}
+};
+static hsize_t UC_2_VDS_DIMS[RANK]  = {0, UC_2_FULL_HEIGHT, UC_2_FULL_WIDTH};
+
+/* Maximum size of datasets, both source and VDS */
+static hsize_t UC_2_MAX_DIMS[UC_2_N_SOURCES][RANK] = {
+    {UC_2_N_MAX_PLANES, UC_2_A_HEIGHT, UC_2_WIDTH},
+    {UC_2_N_MAX_PLANES, UC_2_B_HEIGHT, UC_2_WIDTH},
+    {UC_2_N_MAX_PLANES, UC_2_C_HEIGHT, UC_2_WIDTH},
+    {UC_2_N_MAX_PLANES, UC_2_D_HEIGHT, UC_2_WIDTH},
+    {UC_2_N_MAX_PLANES, UC_2_E_HEIGHT, UC_2_WIDTH}
+};
+static hsize_t UC_2_VDS_MAX_DIMS[RANK]  = {UC_2_N_MAX_PLANES, UC_2_FULL_HEIGHT, UC_2_FULL_WIDTH};
+
+/* Positions of source datasets in the VDS */
+static hsize_t UC_2_POSITIONS[UC_2_N_SOURCES][RANK] = {
+    /* A */ {0, 0,              0},
+    /* B */ {0, UC_2_A_HEIGHT,  0},
+    /* C */ {0, UC_2_AB_HEIGHT, 0},
+    /* D */ {0, 0,              UC_2_WIDTH},
+    /* E */ {0, UC_2_D_HEIGHT,  UC_2_WIDTH}
+};
+
+/* Planes */
+static hsize_t UC_2_PLANES[UC_2_N_SOURCES][RANK] = {
+    {1, UC_2_A_HEIGHT, UC_2_WIDTH},
+    {1, UC_2_B_HEIGHT, UC_2_WIDTH},
+    {1, UC_2_C_HEIGHT, UC_2_WIDTH},
+    {1, UC_2_D_HEIGHT, UC_2_WIDTH},
+    {1, UC_2_E_HEIGHT, UC_2_WIDTH}
+};
+static hsize_t UC_2_VDS_SUB_IMAGE[RANK] = {1, UC_2_FULL_HEIGHT, UC_2_WIDTH};
+static hsize_t UC_2_VDS_PLANE[RANK]     = {1, UC_2_FULL_HEIGHT, UC_2_FULL_WIDTH};
+
+/* Chunk dimensions */
+static hsize_t UC_2_CHUNK_DIMS[UC_2_N_SOURCES][RANK] = {
+    {UC_2_N_PLANES_IN_SERIES, UC_2_A_HEIGHT, UC_2_WIDTH},
+    {UC_2_N_PLANES_IN_SERIES, UC_2_B_HEIGHT, UC_2_WIDTH},
+    {UC_2_N_PLANES_IN_SERIES, UC_2_C_HEIGHT, UC_2_WIDTH},
+    {UC_2_N_PLANES_IN_SERIES, UC_2_D_HEIGHT, UC_2_WIDTH},
+    {UC_2_N_PLANES_IN_SERIES, UC_2_E_HEIGHT, UC_2_WIDTH}
+};
+
+/* File names for source datasets */
+static char UC_2_FILE_NAMES[UC_2_N_SOURCES][NAME_LEN] = {
+    {"2_a.h5"},
+    {"2_b.h5"},
+    {"2_c.h5"},
+    {"2_d.h5"},
+    {"2_e.h5"}
+};
+
+/* VDS file name */
+#define UC_2_VDS_FILE_NAME    "2_vds.h5"
+    
+/* Dataset names */
+#define UC_2_SOURCE_DSET_NAME   "source_dset"
+#define UC_2_SOURCE_DSET_PATH   "/source_dset"
+#define UC_2_VDS_DSET_NAME      "vds_dset"
+
+/* Fill values */
+static int UC_2_FILL_VALUES[UC_2_N_SOURCES] = {
+    -1,
+    -2,
+    -3,
+    -4,
+    -5
+};
+static int UC_2_VDS_FILL_VALUE      = -9;
+
+#endif /* UC_2_H */
+
diff --git a/tools/misc/vds/UC_2_two_dims_gen.c b/tools/misc/vds/UC_2_two_dims_gen.c
new file mode 100644
index 0000000..c3dfa65
--- /dev/null
+++ b/tools/misc/vds/UC_2_two_dims_gen.c
@@ -0,0 +1,230 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * File/dataset generator for VDS use case 2
+ *
+ * See the header file for a description.
+ */
+
+
+#include <stdlib.h>
+
+#include "hdf5.h"
+
+#include "UC_common.h"
+#include "UC_2.h"
+
+int
+main(void)
+{
+    hid_t src_sid       = -1;   /* source dataset's dataspace ID            */
+    hid_t src_dcplid    = -1;   /* source dataset property list ID          */
+
+    hid_t vds_sid       = -1;   /* VDS dataspace ID                         */
+    hid_t vds_dcplid    = -1;   /* VDS dataset property list ID             */
+
+    hid_t fid           = -1;   /* HDF5 file ID                             */
+    hid_t did           = -1;   /* dataset ID                               */
+    hid_t msid          = -1;   /* memory dataspace ID                      */
+    hid_t fsid          = -1;   /* file dataspace ID                        */
+
+    hsize_t start[RANK];        /* starting point for hyperslab             */
+    hsize_t extent[RANK];       /* dataset extents                          */
+
+    int *buffer         = NULL; /* data buffer                              */
+    int value           = -1;   /* value written to datasets                */
+    hsize_t count       = 0;    /* number of elements in a plane            */
+    int n_planes        = -1;   /* number of planes to write                */
+
+    int i;                      /* iterator                                 */
+    int j;                      /* iterator                                 */
+    int k;                      /* iterator                                 */
+
+
+    /* Start by creating the virtual dataset (VDS) dataspace and creation
+     * property list. The individual source datasets are then created
+     * and the VDS map (stored in the VDS property list) is updated.
+     */
+
+    /* Create VDS dcpl */
+    if((vds_dcplid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        UC_ERROR
+    if(H5Pset_fill_value(vds_dcplid, UC_2_VDS_DATATYPE,
+                &UC_2_VDS_FILL_VALUE) < 0)
+        UC_ERROR
+
+    /* Create VDS dataspace */
+    if((vds_sid = H5Screate_simple(RANK, UC_2_VDS_DIMS,
+                    UC_2_VDS_MAX_DIMS)) < 0)
+        UC_ERROR
+
+    /************************************
+     * Create source files and datasets *
+     ************************************/
+
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 0;
+
+    for(i = 0; i < UC_2_N_SOURCES; i++) {
+
+        /* source dataset dcpl */
+        if((src_dcplid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+            UC_ERROR
+        if(H5Pset_chunk(src_dcplid, RANK, UC_2_CHUNK_DIMS[i]) < 0)
+            UC_ERROR
+        if(H5Pset_fill_value(src_dcplid, UC_2_SOURCE_DATATYPE,
+                    &UC_2_FILL_VALUES[i]) < 0)
+            UC_ERROR
+        if(H5Pset_deflate(src_dcplid, COMPRESSION_LEVEL) < 0)
+            UC_ERROR
+
+        /* Create source file, dataspace, and dataset */
+        if((fid = H5Fcreate(UC_2_FILE_NAMES[i], H5F_ACC_TRUNC,
+                        H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            UC_ERROR
+        if((src_sid = H5Screate_simple(RANK, UC_2_DIMS[i],
+                        UC_2_MAX_DIMS[i])) < 0)
+            UC_ERROR
+        if((did = H5Dcreate2(fid, UC_2_SOURCE_DSET_NAME,
+                        UC_2_SOURCE_DATATYPE, src_sid,
+                        H5P_DEFAULT, src_dcplid, H5P_DEFAULT)) < 0)
+            UC_ERROR
+
+        /* Set the dataset's extent (will eventually vary with i) */
+        extent[0] = UC_2_N_TEST_PLANES;
+        extent[1] = UC_2_PLANES[i][1];
+        extent[2] = UC_2_PLANES[i][2];
+        if(H5Dset_extent(did, extent) < 0)
+            UC_ERROR
+
+        /* Create a data buffer that represents a plane */
+        count = UC_2_PLANES[i][1] * UC_2_PLANES[i][2];
+        if(NULL == (buffer = (int *)malloc(count * sizeof(int))))
+            UC_ERROR
+
+        /* Create the memory dataspace */
+        if((msid = H5Screate_simple(RANK, UC_2_PLANES[i], NULL)) < 0)
+            UC_ERROR
+
+        /* Get the file dataspace */
+        if((fsid = H5Dget_space(did)) < 0)
+            UC_ERROR
+
+        /* Write planes to the dataset, number will eventually vary with i */
+        n_planes = UC_2_N_TEST_PLANES;
+        for(j = 0; j < n_planes; j++) {
+
+            value = ((i + 1) * 10) + j;
+            for(k = 0; k < count; k++)
+               buffer[k] = value; 
+
+            start[0] = j;
+            start[1] = 0;
+            start[2] = 0;
+            if(H5Sselect_hyperslab(fsid, H5S_SELECT_SET, start, NULL, UC_2_PLANES[i], NULL) < 0)
+                UC_ERROR
+            if(H5Dwrite(did, H5T_NATIVE_INT, msid, fsid, H5P_DEFAULT, buffer) < 0)
+                UC_ERROR
+
+        } /* end for */
+
+        /* set up hyperslabs for source and destination datasets */
+        start[0] = 0;
+        start[1] = 0;
+        start[2] = 0;
+        if(H5Sselect_hyperslab(src_sid, H5S_SELECT_SET, start, NULL,
+                    UC_2_MAX_DIMS[i], NULL) < 0)
+            UC_ERROR
+        if(H5Sselect_hyperslab(vds_sid, H5S_SELECT_SET, UC_2_POSITIONS[i], NULL,
+                    UC_2_MAX_DIMS[i], NULL) < 0)
+            UC_ERROR
+
+        /* Add VDS mapping */
+        if(H5Pset_virtual(vds_dcplid, vds_sid, UC_2_FILE_NAMES[i],
+                    UC_2_SOURCE_DSET_PATH, src_sid) < 0)
+            UC_ERROR
+
+        /* close */
+        if(H5Sclose(msid) < 0)
+            UC_ERROR
+        if(H5Sclose(fsid) < 0)
+            UC_ERROR
+        if(H5Sclose(src_sid) < 0)
+            UC_ERROR
+        if(H5Pclose(src_dcplid) < 0)
+            UC_ERROR
+        if(H5Dclose(did) < 0)
+            UC_ERROR
+        if(H5Fclose(fid) < 0)
+            UC_ERROR
+        free(buffer);
+
+    } /* end for */
+
+    /*******************************
+     * Create VDS file and dataset *
+     *******************************/
+
+    /* file */
+    if((fid = H5Fcreate(UC_2_VDS_FILE_NAME, H5F_ACC_TRUNC,
+                    H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        UC_ERROR
+
+    /* dataset */
+    if((did = H5Dcreate2(fid, UC_2_VDS_DSET_NAME, UC_2_VDS_DATATYPE, vds_sid,
+                    H5P_DEFAULT, vds_dcplid, H5P_DEFAULT)) < 0)
+        UC_ERROR
+
+    /* close */
+    if(H5Pclose(vds_dcplid) < 0)
+        UC_ERROR
+    if(H5Sclose(vds_sid) < 0)
+        UC_ERROR
+    if(H5Dclose(did) < 0)
+        UC_ERROR
+    if(H5Fclose(fid) < 0)
+        UC_ERROR
+
+    return EXIT_SUCCESS;
+
+error:
+
+    H5E_BEGIN_TRY {
+        if(src_sid >= 0)
+            (void)H5Sclose(src_sid);
+        if(src_dcplid >= 0)
+            (void)H5Pclose(src_dcplid);
+        if(vds_sid >= 0)
+            (void)H5Sclose(vds_sid);
+        if(vds_dcplid >= 0)
+            (void)H5Pclose(vds_dcplid);
+        if(fid >= 0)
+            (void)H5Fclose(fid);
+        if(did >= 0)
+            (void)H5Dclose(did);
+        if(msid >= 0)
+            (void)H5Sclose(msid);
+        if(fsid >= 0)
+            (void)H5Sclose(fsid);
+        if(buffer != NULL)
+            free(buffer);
+    } H5E_END_TRY
+
+    return EXIT_FAILURE;
+
+} /* end main() */
+
diff --git a/tools/misc/vds/UC_3.h b/tools/misc/vds/UC_3.h
new file mode 100644
index 0000000..a27c3cf
--- /dev/null
+++ b/tools/misc/vds/UC_3.h
@@ -0,0 +1,78 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef UC_3_H
+#define UC_3_H
+
+#include "hdf5.h"
+
+#include "UC_1.h"
+#include "UC_2.h"
+
+/*
+ * Definitions for VDS use case 3
+ *
+ * Datasets have a single unlimited dimension and one or two fixed
+ * dimensions (they are reused from use cases 1 and 2). In this use case,
+ * the datasets are mapped in the VDS with gaps between them.
+ */
+
+/* VDS dimensions
+ * Height and width are large enough to encompass the
+ * mapped source datasets with gaps.
+ */
+#define UC_31_VDS_HEIGHT    25  /* full height + 7 (gaps of 1)  */
+#define UC_31_VDS_WIDTH     8   /* full width + 0 (no gaps)     */
+#define UC_32_VDS_HEIGHT    13  /* full height + 5              */
+#define UC_32_VDS_WIDTH     19  /* full width + 5               */
+#define UC_31_GAP           1
+
+/* VDS datatypes */
+#define UC_31_VDS_DATATYPE       H5T_STD_I32LE
+#define UC_32_VDS_DATATYPE       H5T_STD_I32LE
+
+/* Starting size of virtual datasets */
+static hsize_t UC_31_VDS_DIMS[RANK]  = {0, UC_31_VDS_HEIGHT, UC_31_VDS_WIDTH};
+static hsize_t UC_32_VDS_DIMS[RANK]  = {0, UC_32_VDS_HEIGHT, UC_32_VDS_WIDTH};
+
+/* Maximum size of virtual datasets */
+static hsize_t UC_31_VDS_MAX_DIMS[RANK]  = {UC_1_N_MAX_PLANES, UC_31_VDS_HEIGHT, UC_31_VDS_WIDTH};
+static hsize_t UC_32_VDS_MAX_DIMS[RANK]  = {UC_2_N_MAX_PLANES, UC_32_VDS_HEIGHT, UC_32_VDS_WIDTH};
+
+/* Positions of mapped source datasets */
+static hsize_t UC_32_POSITIONS[UC_2_N_SOURCES][RANK] = {
+    /* A */ {0,  1,  1},
+    /* B */ {0,  4,  0},
+    /* C */ {0, 11,  4},
+    /* D */ {0,  1,  9},
+    /* E */ {0,  8, 12}
+};
+
+/* Planes */
+static hsize_t UC_31_VDS_PLANE[RANK]    = {1, UC_31_VDS_HEIGHT, UC_31_VDS_WIDTH};
+static hsize_t UC_32_VDS_PLANE[RANK]    = {1, UC_32_VDS_HEIGHT, UC_32_VDS_WIDTH};
+
+/* VDS file names */
+#define UC_31_VDS_FILE_NAME     "3_1_vds.h5"
+#define UC_32_VDS_FILE_NAME     "3_2_vds.h5"
+
+/* Dataset name */
+#define UC_3_VDS_DSET_NAME      "vds_dset"
+
+/* Fill value */
+static int UC_3_VDS_FILL_VALUE      = -9;
+
+#endif /* UC_3_H */
+
diff --git a/tools/misc/vds/UC_3_gaps_gen.c b/tools/misc/vds/UC_3_gaps_gen.c
new file mode 100644
index 0000000..7cb208b
--- /dev/null
+++ b/tools/misc/vds/UC_3_gaps_gen.c
@@ -0,0 +1,255 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * File/dataset generator for VDS use case 3
+ *
+ * See the header file for a description.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <hdf5.h>
+
+#include "UC_common.h"
+#include "UC_3.h"
+
+/* Create the VDS that uses use case 1 files */
+static herr_t
+create_3_1_vds(void)
+{
+    hid_t src_sid       = -1;   /* source dataset's dataspace ID            */
+    hid_t vds_sid       = -1;   /* VDS dataspace ID                         */
+    hid_t vds_dcplid    = -1;   /* VDS dataset property list ID             */
+
+    hid_t fid           = -1;   /* HDF5 file ID                             */
+    hid_t did           = -1;   /* dataset ID                               */
+
+    hsize_t start[RANK];        /* source starting point for hyperslab      */
+    hsize_t position[RANK];     /* vds mapping positions                    */
+
+    int i;                      /* iterator                                 */
+
+    /* Create VDS dcpl */
+    if((vds_dcplid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        UC_ERROR
+    if(H5Pset_fill_value(vds_dcplid, UC_31_VDS_DATATYPE,
+                &UC_3_VDS_FILL_VALUE) < 0)
+        UC_ERROR
+
+    /* Create VDS dataspace */
+    if((vds_sid = H5Screate_simple(RANK, UC_31_VDS_DIMS,
+                    UC_31_VDS_MAX_DIMS)) < 0)
+        UC_ERROR
+
+    /* Set starting positions */
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 0;
+
+    position[0] = 0;
+    position[1] = UC_31_GAP;
+    position[2] = 0;
+
+    /******************************
+     * Create source-VDS mappings *
+     ******************************/
+    for(i = 0; i < UC_1_N_SOURCES; i++) {
+
+        if((src_sid = H5Screate_simple(RANK, UC_1_DIMS[i],
+                    UC_1_MAX_DIMS[i])) < 0)
+        UC_ERROR
+
+        /* set up hyperslabs for source and destination datasets */
+        if(H5Sselect_hyperslab(src_sid, H5S_SELECT_SET, start, NULL,
+                    UC_1_MAX_DIMS[i], NULL) < 0)
+            UC_ERROR
+        if(H5Sselect_hyperslab(vds_sid, H5S_SELECT_SET, position,
+                    NULL, UC_1_MAX_DIMS[i], NULL) < 0)
+            UC_ERROR
+        position[1] += UC_1_DIMS[i][1] + UC_31_GAP;
+
+        /* Add VDS mapping */
+        if(H5Pset_virtual(vds_dcplid, vds_sid, UC_1_FILE_NAMES[i],
+                    UC_1_SOURCE_DSET_PATH, src_sid) < 0)
+            UC_ERROR
+        if(H5Sclose(src_sid) < 0)
+            UC_ERROR
+
+    } /* end for */
+
+    /*******************************
+     * Create VDS file and dataset *
+     *******************************/
+
+    /* file */
+    if((fid = H5Fcreate(UC_31_VDS_FILE_NAME, H5F_ACC_TRUNC,
+                    H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        UC_ERROR
+
+    /* dataset */
+    if((did = H5Dcreate2(fid, UC_3_VDS_DSET_NAME, UC_31_VDS_DATATYPE, vds_sid,
+                    H5P_DEFAULT, vds_dcplid, H5P_DEFAULT)) < 0)
+        UC_ERROR
+
+    /* close */
+    if(H5Pclose(vds_dcplid) < 0)
+        UC_ERROR
+    if(H5Sclose(vds_sid) < 0)
+        UC_ERROR
+    if(H5Dclose(did) < 0)
+        UC_ERROR
+    if(H5Fclose(fid) < 0)
+        UC_ERROR
+
+    return 0;
+
+error:
+
+    H5E_BEGIN_TRY {
+        if(vds_sid >= 0)
+            (void)H5Sclose(vds_sid);
+        if(vds_dcplid >= 0)
+            (void)H5Pclose(vds_dcplid);
+        if(fid >= 0)
+            (void)H5Fclose(fid);
+        if(did >= 0)
+            (void)H5Dclose(did);
+    } H5E_END_TRY
+
+    return -1;
+
+} /* end create_3_1_vds() */
+
+/* Create the VDS that uses use case 2 files */
+static herr_t
+create_3_2_vds(void)
+{
+    hid_t src_sid       = -1;   /* source dataset's dataspace ID            */
+    hid_t vds_sid       = -1;   /* VDS dataspace ID                         */
+    hid_t vds_dcplid    = -1;   /* VDS dataset property list ID             */
+
+    hid_t fid           = -1;   /* HDF5 file ID                             */
+    hid_t did           = -1;   /* dataset ID                               */
+
+    hsize_t start[RANK];        /* source starting point for hyperslab      */
+
+    int i;                      /* iterator                                 */
+
+    /* Create VDS dcpl */
+    if((vds_dcplid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        UC_ERROR
+    if(H5Pset_fill_value(vds_dcplid, UC_32_VDS_DATATYPE,
+                &UC_3_VDS_FILL_VALUE) < 0)
+        UC_ERROR
+
+    /* Create VDS dataspace */
+    if((vds_sid = H5Screate_simple(RANK, UC_32_VDS_DIMS,
+                    UC_32_VDS_MAX_DIMS)) < 0)
+        UC_ERROR
+
+    /* Set starting positions */
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 0;
+
+    /******************************
+     * Create source-VDS mappings *
+     ******************************/
+    for(i = 0; i < UC_2_N_SOURCES; i++) {
+
+        if((src_sid = H5Screate_simple(RANK, UC_2_DIMS[i],
+                    UC_2_MAX_DIMS[i])) < 0)
+        UC_ERROR
+
+        /* set up hyperslabs for source and destination datasets */
+        if(H5Sselect_hyperslab(src_sid, H5S_SELECT_SET, start, NULL,
+                    UC_2_MAX_DIMS[i], NULL) < 0)
+            UC_ERROR
+        if(H5Sselect_hyperslab(vds_sid, H5S_SELECT_SET, UC_32_POSITIONS[i],
+                    NULL, UC_2_MAX_DIMS[i], NULL) < 0)
+            UC_ERROR
+
+        /* Add VDS mapping */
+        if(H5Pset_virtual(vds_dcplid, vds_sid, UC_2_FILE_NAMES[i],
+                    UC_2_SOURCE_DSET_PATH, src_sid) < 0)
+            UC_ERROR
+        if(H5Sclose(src_sid) < 0)
+            UC_ERROR
+
+    } /* end for */
+
+    /*******************************
+     * Create VDS file and dataset *
+     *******************************/
+
+    /* file */
+    if((fid = H5Fcreate(UC_32_VDS_FILE_NAME, H5F_ACC_TRUNC,
+                    H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        UC_ERROR
+
+    /* dataset */
+    if((did = H5Dcreate2(fid, UC_3_VDS_DSET_NAME, UC_32_VDS_DATATYPE, vds_sid,
+                    H5P_DEFAULT, vds_dcplid, H5P_DEFAULT)) < 0)
+        UC_ERROR
+
+    /* close */
+    if(H5Pclose(vds_dcplid) < 0)
+        UC_ERROR
+    if(H5Sclose(vds_sid) < 0)
+        UC_ERROR
+    if(H5Dclose(did) < 0)
+        UC_ERROR
+    if(H5Fclose(fid) < 0)
+        UC_ERROR
+
+    return 0;
+
+error:
+
+    H5E_BEGIN_TRY {
+        if(vds_sid >= 0)
+            (void)H5Sclose(vds_sid);
+        if(vds_dcplid >= 0)
+            (void)H5Pclose(vds_dcplid);
+        if(fid >= 0)
+            (void)H5Fclose(fid);
+        if(did >= 0)
+            (void)H5Dclose(did);
+    } H5E_END_TRY
+
+    return -1;
+
+} /* end create_3_2_vds() */
+
+int
+main(void)
+{
+
+    if(create_3_1_vds() < 0)
+        UC_ERROR
+
+    if(create_3_2_vds() < 0)
+        UC_ERROR
+
+    return EXIT_SUCCESS;
+
+error:
+
+    return EXIT_FAILURE;
+
+} /* end main() */
+
diff --git a/tools/misc/vds/UC_4.h b/tools/misc/vds/UC_4.h
new file mode 100644
index 0000000..bfcafed
--- /dev/null
+++ b/tools/misc/vds/UC_4.h
@@ -0,0 +1,86 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef UC_4_H
+#define UC_4_H
+
+#include "hdf5.h"
+
+#include "UC_common.h"
+
+/*
+ * Definitions for VDS use case 4
+ *
+ * Source datasets have three fixed dimensions. In this use case, the
+ * datasets are mapped consecutively in the VDS along a single dimension with
+ * no gaps between them. Datasets are automatically loaded using a
+ * printf-like format string for the file name.
+ */
+
+/* virtual dataset <---> source dataset mapping and sizes */
+
+#define UC_4_N_SOURCES      3
+
+/* Dataset dimensions */
+#define UC_4_SRC_PLANES     3
+#define UC_4_HEIGHT         4
+#define UC_4_WIDTH          4
+
+/* max number of planes for VDS (sources are finite) */
+#define UC_4_VDS_MAX_PLANES   H5S_UNLIMITED
+#define UC_4_N_TEST_PLANES    9                 /* number of planes in the VDS */
+
+/* Dataset datatypes */
+#define UC_4_SOURCE_DATATYPE    H5T_STD_I32LE
+#define UC_4_VDS_DATATYPE       H5T_STD_I32LE
+
+/* Starting size of datasets, both source and VDS */
+static hsize_t UC_4_SOURCE_DIMS[RANK] = {0, UC_4_HEIGHT, UC_4_WIDTH};
+static hsize_t UC_4_VDS_DIMS[RANK] = {0, UC_4_HEIGHT, UC_4_WIDTH};
+
+/* Max size of datasets, both source and VDS */
+static hsize_t UC_4_SOURCE_MAX_DIMS[RANK] = {UC_4_SRC_PLANES, UC_4_HEIGHT, UC_4_WIDTH};
+static hsize_t UC_4_VDS_MAX_DIMS[RANK] = {UC_4_VDS_MAX_PLANES, UC_4_HEIGHT, UC_4_WIDTH};
+
+/* Planes (both source and VDS) */
+static hsize_t UC_4_PLANE[RANK] = {1, UC_4_HEIGHT, UC_4_WIDTH};
+
+/* File names for source datasets */
+static char UC_4_FILE_NAMES[UC_4_N_SOURCES][NAME_LEN] = {
+    {"4_0.h5"},
+    {"4_1.h5"},
+    {"4_2.h5"}
+};
+static char UC_4_MAPPING_FILE_NAME[NAME_LEN] = "4_%b.h5";
+
+/* VDS file name */
+static char UC_4_VDS_FILE_NAME[NAME_LEN] = "4_vds.h5";
+
+/* Dataset names */
+static char UC_4_SOURCE_DSET_NAME[NAME_LEN] = "source_dset";
+static char UC_4_SOURCE_DSET_PATH[NAME_LEN] = "/source_dset";
+static char UC_4_VDS_DSET_NAME[NAME_LEN]    = "vds_dset";
+
+/* Fill values */
+static int UC_4_FILL_VALUES[UC_4_N_SOURCES] = {
+    -1,
+    -2,
+    -3
+};
+static int UC_4_VDS_FILL_VALUE = -9;
+
+#endif /* UC_4_H */
+
+
diff --git a/tools/misc/vds/UC_4_printf_gen.c b/tools/misc/vds/UC_4_printf_gen.c
new file mode 100644
index 0000000..c0bb6b5
--- /dev/null
+++ b/tools/misc/vds/UC_4_printf_gen.c
@@ -0,0 +1,219 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * File/dataset generator for VDS use case 4
+ *
+ * See the header file for a description.
+ */
+
+#include <stdlib.h>
+
+#include <hdf5.h>
+
+#include "UC_common.h"
+#include "UC_4.h"
+
+int
+main(void)
+{
+    hid_t src_sid       = -1;   /* source dataset's dataspace ID            */
+    hid_t src_dcplid    = -1;   /* source dataset property list ID          */
+
+    hid_t vds_sid       = -1;   /* VDS dataspace ID                         */
+    hid_t vds_dcplid    = -1;   /* VDS dataset property list ID             */
+
+    hid_t fid           = -1;   /* HDF5 file ID                             */
+    hid_t did           = -1;   /* dataset ID                               */
+    hid_t msid          = -1;   /* memory dataspace ID                      */
+    hid_t fsid          = -1;   /* file dataspace ID                        */
+
+    /* Hyperslab arrays */
+    hsize_t start[RANK] = {0, 0, 0};
+    hsize_t count[RANK] = {H5S_UNLIMITED, 1, 1};
+
+    int *buffer         = NULL; /* data buffer                              */
+    int value           = -1;   /* value written to datasets                */
+
+    hsize_t n           = 0;    /* number of elements in a plane            */
+
+    int i;                      /* iterator                                 */
+    int j;                      /* iterator                                 */
+    int k;                      /* iterator                                 */
+
+    /************************************
+     * Create source files and datasets *
+     ************************************/
+
+    /* Create source dataspace ID */
+    if((src_sid = H5Screate_simple(RANK, UC_4_SOURCE_DIMS,
+                    UC_4_SOURCE_MAX_DIMS)) < 0)
+        UC_ERROR
+    if(H5Sselect_hyperslab(src_sid, H5S_SELECT_SET, start, NULL,
+                UC_4_SOURCE_MAX_DIMS, NULL) < 0)
+        UC_ERROR
+
+    /* Create source files and datasets */
+    for(i = 0; i < UC_4_N_SOURCES; i++) {
+
+        /* source dataset dcpl */
+        if((src_dcplid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+            UC_ERROR
+        if(H5Pset_chunk(src_dcplid, RANK, UC_4_PLANE) < 0)
+            UC_ERROR
+        if(H5Pset_fill_value(src_dcplid, UC_4_SOURCE_DATATYPE,
+                    &UC_4_FILL_VALUES[i]) < 0)
+            UC_ERROR
+        if(H5Pset_deflate(src_dcplid, COMPRESSION_LEVEL) < 0)
+            UC_ERROR
+
+        /* Create source file and dataset */
+        if((fid = H5Fcreate(UC_4_FILE_NAMES[i], H5F_ACC_TRUNC,
+                        H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            UC_ERROR
+        if((did = H5Dcreate2(fid, UC_4_SOURCE_DSET_NAME,
+                        UC_4_SOURCE_DATATYPE, src_sid,
+                        H5P_DEFAULT, src_dcplid, H5P_DEFAULT)) < 0)
+            UC_ERROR
+
+        /* Set the dataset's extent */
+        if(H5Dset_extent(did, UC_4_SOURCE_MAX_DIMS) < 0)
+            UC_ERROR
+
+        /* Create a data buffer that represents a plane */
+        n = UC_4_PLANE[1] * UC_4_PLANE[2];
+        if(NULL == (buffer = (int *)malloc(n * sizeof(int))))
+            UC_ERROR
+
+        /* Create the memory dataspace */
+        if((msid = H5Screate_simple(RANK, UC_4_PLANE, NULL)) < 0)
+            UC_ERROR
+
+        /* Get the file dataspace */
+        if((fsid = H5Dget_space(did)) < 0)
+            UC_ERROR
+
+        /* Write planes to the dataset */
+        for(j = 0; j < UC_4_SRC_PLANES; j++) {
+
+            value = ((i + 1) * 10) + j;
+            for(k = 0; k < n; k++)
+               buffer[k] = value;
+
+            start[0] = j;
+            start[1] = 0;
+            start[2] = 0;
+            if(H5Sselect_hyperslab(fsid, H5S_SELECT_SET, start, NULL, UC_4_PLANE, NULL) < 0)
+                UC_ERROR
+            if(H5Dwrite(did, H5T_NATIVE_INT, msid, fsid, H5P_DEFAULT, buffer) < 0)
+                UC_ERROR
+
+        } /* end for */
+
+        /* close */
+        if(H5Sclose(msid) < 0)
+            UC_ERROR
+        if(H5Sclose(fsid) < 0)
+            UC_ERROR
+        if(H5Pclose(src_dcplid) < 0)
+            UC_ERROR
+        if(H5Dclose(did) < 0)
+            UC_ERROR
+        if(H5Fclose(fid) < 0)
+            UC_ERROR
+        free(buffer);
+
+    } /* end for */
+
+    /*******************
+     * Create VDS file *
+     *******************/
+
+    /* Create file */
+    if((fid = H5Fcreate(UC_4_VDS_FILE_NAME, H5F_ACC_TRUNC,
+                    H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        UC_ERROR
+
+    /* Create VDS dcpl */
+    if((vds_dcplid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        UC_ERROR
+    if(H5Pset_fill_value(vds_dcplid, UC_4_VDS_DATATYPE,
+                &UC_4_VDS_FILL_VALUE) < 0)
+        UC_ERROR
+
+    /* Create VDS dataspace */
+    if((vds_sid = H5Screate_simple(RANK, UC_4_VDS_DIMS,
+                    UC_4_VDS_MAX_DIMS)) < 0)
+        UC_ERROR
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 0;
+    if(H5Sselect_hyperslab(vds_sid, H5S_SELECT_SET, start,
+                UC_4_SOURCE_MAX_DIMS, count, UC_4_SOURCE_MAX_DIMS) < 0)
+        UC_ERROR
+
+    /* Add VDS mapping - The mapped file name uses a printf-like
+     * naming scheme that automatically maps new files.
+     */
+    if(H5Pset_virtual(vds_dcplid, vds_sid, UC_4_MAPPING_FILE_NAME,
+                UC_4_SOURCE_DSET_PATH, src_sid) < 0)
+        UC_ERROR
+
+    /* Create dataset */
+    if((did = H5Dcreate2(fid, UC_4_VDS_DSET_NAME, UC_4_VDS_DATATYPE, vds_sid,
+                    H5P_DEFAULT, vds_dcplid, H5P_DEFAULT)) < 0)
+        UC_ERROR
+
+    /* close */
+    if(H5Sclose(src_sid) < 0)
+        UC_ERROR
+    if(H5Pclose(vds_dcplid) < 0)
+        UC_ERROR
+    if(H5Sclose(vds_sid) < 0)
+        UC_ERROR
+    if(H5Dclose(did) < 0)
+        UC_ERROR
+    if(H5Fclose(fid) < 0)
+        UC_ERROR
+
+    return EXIT_SUCCESS;
+
+error:
+
+    H5E_BEGIN_TRY {
+        if(src_sid >= 0)
+            (void)H5Sclose(src_sid);
+        if(src_dcplid >= 0)
+            (void)H5Pclose(src_dcplid);
+        if(vds_sid >= 0)
+            (void)H5Sclose(vds_sid);
+        if(vds_dcplid >= 0)
+            (void)H5Pclose(vds_dcplid);
+        if(fid >= 0)
+            (void)H5Fclose(fid);
+        if(did >= 0)
+            (void)H5Dclose(did);
+        if(msid >= 0)
+            (void)H5Sclose(msid);
+        if(fsid >= 0)
+            (void)H5Sclose(fsid);
+        if(buffer != NULL)
+            free(buffer);
+    } H5E_END_TRY
+
+    return EXIT_FAILURE;
+
+} /* end main() */
+
diff --git a/tools/misc/vds/UC_5.h b/tools/misc/vds/UC_5.h
new file mode 100644
index 0000000..96b2af3
--- /dev/null
+++ b/tools/misc/vds/UC_5.h
@@ -0,0 +1,83 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef UC_5_H
+#define UC_5_H
+
+#include <hdf5.h>
+
+#include "UC_common.h"
+
+/*
+ * Definitions for VDS use case 5
+ *
+ * Source datasets have one unlimited dimension and two fixed dimensions. In
+ * this use case, the datasets are mapped in the VDS so that alternating
+ * planes in the source are interleaved in the VDS.
+ */
+
+/* virtual dataset <---> source dataset mapping and sizes */
+
+#define UC_5_N_SOURCES      3
+
+/* Dataset dimensions */
+#define UC_5_SRC_PLANES     3
+#define UC_5_HEIGHT         4
+#define UC_5_WIDTH          4
+
+/* max number of planes for datasets */
+#define UC_5_MAX_PLANES     H5S_UNLIMITED
+#define UC_5_N_TEST_PLANES  9               /* number of planes in VDS */
+
+/* Dataset datatypes */
+#define UC_5_SOURCE_DATATYPE    H5T_STD_I32LE
+#define UC_5_VDS_DATATYPE       H5T_STD_I32LE
+
+/* Starting size of datasets, both source and VDS */
+static hsize_t UC_5_SOURCE_DIMS[RANK] = {0, UC_5_HEIGHT, UC_5_WIDTH};
+static hsize_t UC_5_VDS_DIMS[RANK]    = {0, UC_5_HEIGHT, UC_5_WIDTH};
+
+/* Max size of datasets, both source and VDS */
+static hsize_t UC_5_SOURCE_MAX_DIMS[RANK] = {UC_5_MAX_PLANES, UC_5_HEIGHT, UC_5_WIDTH};
+static hsize_t UC_5_VDS_MAX_DIMS[RANK]    = {UC_5_MAX_PLANES, UC_5_HEIGHT, UC_5_WIDTH};
+
+/* Planes (both source and VDS) */
+static hsize_t UC_5_PLANE[RANK] = {1, UC_5_HEIGHT, UC_5_WIDTH};
+
+/* File names for source datasets */
+static char UC_5_FILE_NAMES[UC_5_N_SOURCES][NAME_LEN] = {
+    {"5_a.h5"},
+    {"5_b.h5"},
+    {"5_c.h5"}
+};
+
+/* VDS file name */
+static char UC_5_VDS_FILE_NAME[NAME_LEN] = "5_vds.h5";
+
+/* Dataset names */
+static char UC_5_SOURCE_DSET_NAME[NAME_LEN] = "source_dset";
+static char UC_5_SOURCE_DSET_PATH[NAME_LEN] = "/source_dset";
+static char UC_5_VDS_DSET_NAME[NAME_LEN]    = "vds_dset";
+
+/* Fill values */
+static int UC_5_FILL_VALUES[UC_5_N_SOURCES] = {
+    -1,
+    -2,
+    -3
+};
+static int UC_5_VDS_FILL_VALUE = -9;
+
+#endif /* UC_5_H */
+
diff --git a/tools/misc/vds/UC_5_stride_gen.c b/tools/misc/vds/UC_5_stride_gen.c
new file mode 100644
index 0000000..9fa4908
--- /dev/null
+++ b/tools/misc/vds/UC_5_stride_gen.c
@@ -0,0 +1,243 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * File/dataset generator for VDS use case 5
+ *
+ * See the header file for a description.
+ */
+
+#include <stdlib.h>
+
+#include <hdf5.h>
+
+#include "UC_common.h"
+#include "UC_5.h"
+
+int
+main(void)
+{
+    hid_t src_sid       = -1;   /* source dataset's dataspace ID            */
+    hid_t src_dcplid    = -1;   /* source dataset property list ID          */
+
+    hid_t vds_sid       = -1;   /* VDS dataspace ID                         */
+    hid_t vds_dcplid    = -1;   /* VDS dataset property list ID             */
+
+    hid_t fid           = -1;   /* HDF5 file ID                             */
+    hid_t did           = -1;   /* dataset ID                               */
+    hid_t msid          = -1;   /* memory dataspace ID                      */
+    hid_t fsid          = -1;   /* file dataspace ID                        */
+
+    hsize_t extent[RANK];       /* source dataset extents                   */
+    hsize_t start[RANK];        /* starting point for hyperslab             */
+    hsize_t stride[RANK];       /* hypserslab stride                        */
+    hsize_t count[RANK];        /* hypserslab count                         */
+    int map_start       = -1;   /* starting point in the VDS map            */
+
+    int *buffer         = NULL; /* data buffer                              */
+    int value           = -1;   /* value written to datasets                */
+
+    hsize_t n           = 0;    /* number of elements in a plane            */
+
+    int i;                      /* iterator                                 */
+    int j;                      /* iterator                                 */
+    int k;                      /* iterator                                 */
+
+    /* Start by creating the virtual dataset (VDS) dataspace and creation
+     * property list. The individual source datasets are then created
+     * and the VDS map (stored in the VDS property list) is updated.
+     */
+
+    /* Create VDS dcpl */
+    if((vds_dcplid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+        UC_ERROR
+    if(H5Pset_fill_value(vds_dcplid, UC_5_VDS_DATATYPE,
+                &UC_5_VDS_FILL_VALUE) < 0)
+        UC_ERROR
+
+    /* Create VDS dataspace */
+    if((vds_sid = H5Screate_simple(RANK, UC_5_VDS_DIMS,
+                    UC_5_VDS_MAX_DIMS)) < 0)
+        UC_ERROR
+
+    /*********************************
+     * Map source files and datasets *
+     *********************************/
+
+    /* Hyperslab array setup */
+    start[0] = 0;
+    start[1] = 0;
+    start[2] = 0;
+    map_start = 0;
+
+    stride[0] = UC_5_N_SOURCES;
+    stride[1] = 1;
+    stride[2] = 1;
+
+    count[0] = H5S_UNLIMITED;
+    count[1] = 1;
+    count[2] = 1;
+
+    extent[0] = UC_5_SRC_PLANES;
+    extent[1] = UC_5_HEIGHT;
+    extent[2] = UC_5_WIDTH;
+
+    for(i = 0; i < UC_5_N_SOURCES; i++) {
+
+        /* source dataset dcpl */
+        if((src_dcplid = H5Pcreate(H5P_DATASET_CREATE)) < 0)
+            UC_ERROR
+        if(H5Pset_chunk(src_dcplid, RANK, UC_5_PLANE) < 0)
+            UC_ERROR
+        if(H5Pset_fill_value(src_dcplid, UC_5_SOURCE_DATATYPE,
+                    &UC_5_FILL_VALUES[i]) < 0)
+            UC_ERROR
+        if(H5Pset_deflate(src_dcplid, COMPRESSION_LEVEL) < 0)
+            UC_ERROR
+
+        /* Create source file, dataspace, and dataset */
+        if((fid = H5Fcreate(UC_5_FILE_NAMES[i], H5F_ACC_TRUNC,
+                        H5P_DEFAULT, H5P_DEFAULT)) < 0)
+            UC_ERROR
+        if((src_sid = H5Screate_simple(RANK, UC_5_SOURCE_DIMS,
+                        UC_5_SOURCE_MAX_DIMS)) < 0)
+            UC_ERROR
+        if((did = H5Dcreate2(fid, UC_5_SOURCE_DSET_NAME,
+                        UC_5_SOURCE_DATATYPE, src_sid,
+                        H5P_DEFAULT, src_dcplid, H5P_DEFAULT)) < 0)
+            UC_ERROR
+
+        /* Set the dataset's extent */
+        if(H5Dset_extent(did, extent) < 0)
+            UC_ERROR
+
+        /* Create a data buffer that represents a plane */
+        n = UC_5_PLANE[1] * UC_5_PLANE[2];
+        if(NULL == (buffer = (int *)malloc(n * sizeof(int))))
+            UC_ERROR
+
+        /* Create the memory dataspace */
+        if((msid = H5Screate_simple(RANK, UC_5_PLANE, NULL)) < 0)
+            UC_ERROR
+
+        /* Get the file dataspace */
+        if((fsid = H5Dget_space(did)) < 0)
+            UC_ERROR
+
+        /* Write planes to the dataset */
+        for(j = 0; j < UC_5_SRC_PLANES; j++) {
+
+            value = ((i + 1) * 10) + j;
+            for(k = 0; k < n; k++)
+               buffer[k] = value;
+
+            start[0] = j;
+            start[1] = 0;
+            start[2] = 0;
+            if(H5Sselect_hyperslab(fsid, H5S_SELECT_SET, start, NULL, UC_5_PLANE, NULL) < 0)
+                UC_ERROR
+            if(H5Dwrite(did, H5T_NATIVE_INT, msid, fsid, H5P_DEFAULT, buffer) < 0)
+                UC_ERROR
+
+        } /* end for */
+
+        /* set up hyperslabs for source and destination datasets */
+        start[0] = 0;
+        start[1] = 0;
+        start[2] = 0;
+        if(H5Sselect_hyperslab(src_sid, H5S_SELECT_SET, start, NULL,
+                    UC_5_SOURCE_MAX_DIMS, NULL) < 0)
+            UC_ERROR
+        start[0] = map_start;
+        if(H5Sselect_hyperslab(vds_sid, H5S_SELECT_SET, start, stride,
+                    count, UC_5_PLANE) < 0)
+            UC_ERROR
+        map_start += 1;
+
+        /* Add VDS mapping */
+        if(H5Pset_virtual(vds_dcplid, vds_sid, UC_5_FILE_NAMES[i],
+                    UC_5_SOURCE_DSET_PATH, src_sid) < 0)
+            UC_ERROR
+
+        /* close */
+        if(H5Sclose(msid) < 0)
+            UC_ERROR
+        if(H5Sclose(fsid) < 0)
+            UC_ERROR
+        if(H5Sclose(src_sid) < 0)
+            UC_ERROR
+        if(H5Pclose(src_dcplid) < 0)
+            UC_ERROR
+        if(H5Dclose(did) < 0)
+            UC_ERROR
+        if(H5Fclose(fid) < 0)
+            UC_ERROR
+        free(buffer);
+
+    } /* end for */
+
+    /*******************
+     * Create VDS file *
+     *******************/
+
+    /* file */
+    if((fid = H5Fcreate(UC_5_VDS_FILE_NAME, H5F_ACC_TRUNC,
+                    H5P_DEFAULT, H5P_DEFAULT)) < 0)
+        UC_ERROR
+
+    /* dataset */
+    if((did = H5Dcreate2(fid, UC_5_VDS_DSET_NAME, UC_5_VDS_DATATYPE, vds_sid,
+                    H5P_DEFAULT, vds_dcplid, H5P_DEFAULT)) < 0)
+        UC_ERROR
+
+    /* close */
+    if(H5Pclose(vds_dcplid) < 0)
+        UC_ERROR
+    if(H5Sclose(vds_sid) < 0)
+        UC_ERROR
+    if(H5Dclose(did) < 0)
+        UC_ERROR
+    if(H5Fclose(fid) < 0)
+        UC_ERROR
+
+    return EXIT_SUCCESS;
+
+error:
+
+    H5E_BEGIN_TRY {
+        if(src_sid >= 0)
+            (void)H5Sclose(src_sid);
+        if(src_dcplid >= 0)
+            (void)H5Pclose(src_dcplid);
+        if(vds_sid >= 0)
+            (void)H5Sclose(vds_sid);
+        if(vds_dcplid >= 0)
+            (void)H5Pclose(vds_dcplid);
+        if(fid >= 0)
+            (void)H5Fclose(fid);
+        if(did >= 0)
+            (void)H5Dclose(did);
+        if(msid >= 0)
+            (void)H5Sclose(msid);
+        if(fsid >= 0)
+            (void)H5Sclose(fsid);
+        if(buffer != NULL)
+            free(buffer);
+    } H5E_END_TRY
+
+    return EXIT_FAILURE;
+
+} /* end main() */
+
diff --git a/tools/misc/vds/UC_common.h b/tools/misc/vds/UC_common.h
new file mode 100644
index 0000000..0e61016
--- /dev/null
+++ b/tools/misc/vds/UC_common.h
@@ -0,0 +1,41 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group.                                               *
+ * Copyright by the Board of Trustees of the University of Illinois.         *
+ * All rights reserved.                                                      *
+ *                                                                           *
+ * This file is part of HDF5.  The full HDF5 copyright notice, including     *
+ * terms governing use, modification, and redistribution, is contained in    *
+ * the files COPYING and Copyright.html.  COPYING can be found at the root   *
+ * of the source code distribution tree; Copyright.html can be found at the  *
+ * root level of an installed copy of the electronic HDF5 document set and   *
+ * is linked from the top-level documents page.  It can also be found at     *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
+ * access to either file, you may request a copy from help at hdfgroup.org.     *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#ifndef USE_CASE_COMMON_H
+#define USE_CASE_COMMON_H
+
+/******************************************
+ * Symbols used across multiple use cases *
+ ******************************************/
+
+/* All datasets are 3D */
+#define RANK                3
+
+/* Lengths of string identifiers (file, dataset names, etc.) */
+#define NAME_LEN            32
+
+/* Compression level */
+#define COMPRESSION_LEVEL   7
+
+/* Booleans */
+#define TRUE 1
+#define FALSE 0
+
+/* Testing macros */
+#define AT()        printf ("   at %s:%d in %s()...\n", __FILE__, __LINE__, __func__);
+#define UC_ERROR    {puts("*ERROR*"); fflush(stdout); AT(); goto error;}
+
+#endif /* USE_CASE_COMMON_H */
+
diff --git a/tools/perform/Makefile.in b/tools/perform/Makefile.in
index 325bc4d..4dddb29 100644
--- a/tools/perform/Makefile.in
+++ b/tools/perform/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.14.1 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -32,7 +32,17 @@
 #
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -95,11 +105,6 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-DIST_COMMON = $(top_srcdir)/config/commence.am \
-	$(top_srcdir)/config/conclude.am $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/bin/mkinstalldirs \
-	$(top_srcdir)/bin/depcomp $(top_srcdir)/bin/test-driver \
-	COPYING
 @BUILD_PARALLEL_CONDITIONAL_FALSE at bin_PROGRAMS =  \
 @BUILD_PARALLEL_CONDITIONAL_FALSE@	h5perf_serial$(EXEEXT)
 @BUILD_PARALLEL_CONDITIONAL_TRUE at bin_PROGRAMS =  \
@@ -112,11 +117,16 @@ TESTS = $(am__EXEEXT_3)
 subdir = tools/perform
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/aclocal_cxx.m4 \
-	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/aclocal_fc.m4 $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-mkinstalldirs = $(SHELL) $(top_srcdir)/bin/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/src/H5config.h
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/src/H5config.h \
+	$(top_builddir)/fortran/src/H5config_f.inc
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 am__installdirs = "$(DESTDIR)$(bindir)"
@@ -171,7 +181,7 @@ AM_V_at = $(am__v_at_ at AM_V@)
 am__v_at_ = $(am__v_at_ at AM_DEFAULT_V@)
 am__v_at_0 = @
 am__v_at_1 = 
-DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/src -I$(top_builddir)/fortran/src
 depcomp = $(SHELL) $(top_srcdir)/bin/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
@@ -426,6 +436,9 @@ am__test_logs2 = $(am__test_logs1:@EXEEXT at .log=.log)
 TEST_LOGS = $(am__test_logs2:.sh.log=.log)
 SH_LOG_DRIVER = $(SHELL) $(top_srcdir)/bin/test-driver
 SH_LOG_COMPILE = $(SH_LOG_COMPILER) $(AM_SH_LOG_FLAGS) $(SH_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/depcomp \
+	$(top_srcdir)/bin/test-driver $(top_srcdir)/config/commence.am \
+	$(top_srcdir)/config/conclude.am COPYING
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ADD_PARALLEL_FILES = @ADD_PARALLEL_FILES@
@@ -443,7 +456,6 @@ AM_CXXFLAGS = @AM_CXXFLAGS@ @H5_CXXFLAGS@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
 AM_FCFLAGS = @AM_FCFLAGS@ @H5_FCFLAGS@
 AM_LDFLAGS = @AM_LDFLAGS@ @H5_LDFLAGS@
-AM_MAKEFLAGS = @AM_MAKEFLAGS@
 AR = @AR@
 AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
@@ -488,14 +500,22 @@ F9XMODEXT = @F9XMODEXT@
 F9XMODFLAG = @F9XMODFLAG@
 F9XSUFFIXFLAG = @F9XSUFFIXFLAG@
 FC = @FC@
-FC2003 = @FC2003@
 FCFLAGS = @FCFLAGS@
 FCFLAGS_f90 = @FCFLAGS_f90@
 FCLIBS = @FCLIBS@
 FC_VERSION = @FC_VERSION@
 FGREP = @FGREP@
+FORTRAN_C_LONG_DOUBLE_IS_UNIQUE = @FORTRAN_C_LONG_DOUBLE_IS_UNIQUE@
+FORTRAN_HAVE_C_LONG_DOUBLE = @FORTRAN_HAVE_C_LONG_DOUBLE@
+FORTRAN_SIZEOF_LONG_DOUBLE = @FORTRAN_SIZEOF_LONG_DOUBLE@
 FSEARCH_DIRS = @FSEARCH_DIRS@
+Fortran_COMPILER_ID = @Fortran_COMPILER_ID@
 GREP = @GREP@
+H5CONFIG_F_IKIND = @H5CONFIG_F_IKIND@
+H5CONFIG_F_NUM_IKIND = @H5CONFIG_F_NUM_IKIND@
+H5CONFIG_F_NUM_RKIND = @H5CONFIG_F_NUM_RKIND@
+H5CONFIG_F_RKIND = @H5CONFIG_F_RKIND@
+H5CONFIG_F_RKIND_SIZEOF = @H5CONFIG_F_RKIND_SIZEOF@
 H5_CFLAGS = @H5_CFLAGS@
 H5_CPPFLAGS = @H5_CPPFLAGS@
 H5_CXXFLAGS = @H5_CXXFLAGS@
@@ -505,13 +525,12 @@ H5_LDFLAGS = @H5_LDFLAGS@
 H5_VERSION = @H5_VERSION@
 HADDR_T = @HADDR_T@
 HAVE_DMALLOC = @HAVE_DMALLOC@
-HAVE_FORTRAN_2003 = @HAVE_FORTRAN_2003@
+HAVE_Fortran_INTEGER_SIZEOF_16 = @HAVE_Fortran_INTEGER_SIZEOF_16@
 HAVE_PTHREAD = @HAVE_PTHREAD@
 HDF5_HL = @HDF5_HL@
 HDF5_INTERFACES = @HDF5_INTERFACES@
 HDF_CXX = @HDF_CXX@
 HDF_FORTRAN = @HDF_FORTRAN@
-HDF_FORTRAN2003 = @HDF_FORTRAN2003@
 HID_T = @HID_T@
 HL = @HL@
 HL_FOR = @HL_FOR@
@@ -553,9 +572,20 @@ PACKAGE_STRING = @PACKAGE_STRING@
 PACKAGE_TARNAME = @PACKAGE_TARNAME@
 PACKAGE_URL = @PACKAGE_URL@
 PACKAGE_VERSION = @PACKAGE_VERSION@
+PAC_C_MAX_REAL_PRECISION = @PAC_C_MAX_REAL_PRECISION@
+PAC_FC_ALL_INTEGER_KINDS = @PAC_FC_ALL_INTEGER_KINDS@
+PAC_FC_ALL_INTEGER_KINDS_SIZEOF = @PAC_FC_ALL_INTEGER_KINDS_SIZEOF@
+PAC_FC_ALL_REAL_KINDS = @PAC_FC_ALL_REAL_KINDS@
+PAC_FC_ALL_REAL_KINDS_SIZEOF = @PAC_FC_ALL_REAL_KINDS_SIZEOF@
+PAC_FC_MAX_REAL_PRECISION = @PAC_FC_MAX_REAL_PRECISION@
+PAC_FORTRAN_NATIVE_DOUBLE_KIND = @PAC_FORTRAN_NATIVE_DOUBLE_KIND@
+PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF = @PAC_FORTRAN_NATIVE_DOUBLE_SIZEOF@
+PAC_FORTRAN_NATIVE_INTEGER_KIND = @PAC_FORTRAN_NATIVE_INTEGER_KIND@
+PAC_FORTRAN_NATIVE_INTEGER_SIZEOF = @PAC_FORTRAN_NATIVE_INTEGER_SIZEOF@
+PAC_FORTRAN_NATIVE_REAL_KIND = @PAC_FORTRAN_NATIVE_REAL_KIND@
+PAC_FORTRAN_NATIVE_REAL_SIZEOF = @PAC_FORTRAN_NATIVE_REAL_SIZEOF@
 PARALLEL = @PARALLEL@
 PATH_SEPARATOR = @PATH_SEPARATOR@
-PERL = @PERL@
 RANLIB = @RANLIB@
 ROOT = @ROOT@
 RUNPARALLEL = @RUNPARALLEL@
@@ -763,7 +793,6 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/perform/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign tools/perform/Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -772,7 +801,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am:
+$(top_srcdir)/config/commence.am $(top_srcdir)/config/conclude.am $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
@@ -999,7 +1028,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -1318,6 +1347,8 @@ uninstall-am: uninstall-binPROGRAMS
 	pdf-am ps ps-am recheck tags tags-am uninstall uninstall-am \
 	uninstall-binPROGRAMS
 
+.PRECIOUS: Makefile
+
 
 # List all build rules defined by HDF5 Makefiles as "PHONY" targets here.
 # This tells the Makefiles that these targets are not files to be built but
diff --git a/tools/perform/chunk.c b/tools/perform/chunk.c
index 74bcc46..0ea16e8 100644
--- a/tools/perform/chunk.c
+++ b/tools/perform/chunk.c
@@ -163,7 +163,7 @@ create_dataset (void)
     assert(dset>=0);
 
     /* The data */
-    buf = calloc(1, SQUARE (DS_SIZE*CH_SIZE));
+    buf = (signed char *)calloc(1, SQUARE (DS_SIZE*CH_SIZE));
     H5Dwrite(dset, H5T_NATIVE_SCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf);
     free(buf);
 
@@ -194,7 +194,7 @@ static double
 test_rowmaj (int op, size_t cache_size, size_t io_size)
 {
     hid_t	file, dset, mem_space, file_space;
-    signed char	*buf = calloc (1, (size_t)(SQUARE(io_size)));
+    signed char	*buf = (signed char *)calloc (1, (size_t)(SQUARE(io_size)));
     hsize_t	i, j, hs_size[2];
     hsize_t	hs_offset[2];
     int		mdc_nelmts;
@@ -273,7 +273,7 @@ test_diag (int op, size_t cache_size, size_t io_size, size_t offset)
     hsize_t	i, hs_size[2];
     hsize_t	nio = 0;
     hsize_t	hs_offset[2];
-    signed char	*buf = calloc (1, (size_t)(SQUARE (io_size)));
+    signed char	*buf = (signed char *)calloc(1, (size_t)(SQUARE (io_size)));
     int		mdc_nelmts;
     size_t	rdcc_nelmts;
     double	w0;
diff --git a/tools/perform/overhead.c b/tools/perform/overhead.c
index 0288ffa..feabd3a 100644
--- a/tools/perform/overhead.c
+++ b/tools/perform/overhead.c
@@ -224,7 +224,7 @@ test(fill_t fill_style, const double splits[],
     if ((fd=HDopen(FILE_NAME_1, O_RDONLY, 0666)) < 0) goto error;
 
     if(FILL_RANDOM==fill_style) 
-        had = calloc((size_t)cur_size[0], sizeof(int));
+        had = (int *)calloc((size_t)cur_size[0], sizeof(int));
     
     for (i=1; i<=cur_size[0]; i++) {
 
diff --git a/tools/perform/perf_meta.c b/tools/perform/perf_meta.c
index b52871e..2c3a19c 100644
--- a/tools/perform/perf_meta.c
+++ b/tools/perform/perf_meta.c
@@ -821,7 +821,7 @@ main(int argc, char **argv)
     if (H5Sclose(space) < 0) goto error;
     if (H5Sclose(small_space) < 0) goto error;
 
-    h5_cleanup(FILENAME, fapl);
+    h5_clean_files(FILENAME, fapl);
 
 #ifdef H5_HAVE_PARALLEL
     if(facc_type == FACC_MPIO)
diff --git a/tools/perform/pio_perf.c b/tools/perform/pio_perf.c
index 4db2249..509513b 100644
--- a/tools/perform/pio_perf.c
+++ b/tools/perform/pio_perf.c
@@ -1673,60 +1673,8 @@ usage(const char *prog)
         printf("  HDF5_MPI_INFO    MPI INFO object key=value separated by ;\n");
         printf("  HDF5_PARAPREFIX  Paralllel data files prefix\n");
         fflush(stdout);
-    }
-}
-
-void debug_start_stop_time(io_time_t *pt, timer_type t, int start_stop)
-{
-#if 1
-        if (pio_debug_level >= 4) {
-            const char *msg;
-            int myrank;
-
-            MPI_Comm_rank(pio_comm_g, &myrank);
-
-            switch (t) {
-            case HDF5_FILE_OPENCLOSE:
-                msg = "File Open/Close";
-                break;
-            case HDF5_DATASET_CREATE:
-                msg = "Dataset Create";
-                break;
-            case HDF5_MPI_WRITE:
-                msg = "MPI Write";
-                break;
-            case HDF5_MPI_READ:
-                msg = "MPI Read";
-                break;
-            case HDF5_FINE_WRITE_FIXED_DIMS:
-                msg = "Fine Write";
-                break;
-            case HDF5_FINE_READ_FIXED_DIMS:
-                msg = "Fine Read";
-                break;
-            case HDF5_GROSS_WRITE_FIXED_DIMS:
-                msg = "Gross Write";
-                break;
-            case HDF5_GROSS_READ_FIXED_DIMS:
-                msg = "Gross Read";
-                break;
-            case HDF5_RAW_WRITE_FIXED_DIMS:
-                msg = "Raw Write";
-                break;
-            case HDF5_RAW_READ_FIXED_DIMS:
-                msg = "Raw Read";
-                break;
-            default:
-                msg = "Unknown Timer";
-                break;
-            }
-
-            fprintf(output, "    Proc %d: %s %s: %.2f\n", myrank, msg,
-                    (start_stop == TSTART ? "Start" : "Stop"),
-                    pt->total_time[t]);
-        }
-#endif
-} /* debug_start_stop_time */
+    } /* end if */
+} /* end usage() */
 
 #else /* H5_HAVE_PARALLEL */
 
@@ -1736,13 +1684,12 @@ void debug_start_stop_time(io_time_t *pt, timer_type t, int start_stop)
  *              parallel stuff.
  * Return:      EXIT_SUCCESS
  * Programmer:  Bill Wendling, 14. November 2001
- * Modifications:
  */
 int
 main(void)
 {
     printf("No parallel IO performance because parallel is not configured\n");
     return EXIT_SUCCESS;
-}
+} /* end main */
 
 #endif /* !H5_HAVE_PARALLEL */
diff --git a/tools/perform/pio_standalone.h b/tools/perform/pio_standalone.h
index 584a057..762a564 100644
--- a/tools/perform/pio_standalone.h
+++ b/tools/perform/pio_standalone.h
@@ -105,10 +105,10 @@ typedef off_t                   h5_stat_size_t;
  * HDF Boolean type.
  */
 #ifndef FALSE
-#   define FALSE 0
+#   define FALSE false
 #endif
 #ifndef TRUE
-#   define TRUE 1
+#   define TRUE true
 #endif
 
 
diff --git a/tools/perform/sio_engine.c b/tools/perform/sio_engine.c
index 3b28ea7..5622810 100644
--- a/tools/perform/sio_engine.c
+++ b/tools/perform/sio_engine.c
@@ -181,7 +181,7 @@ do_sio(parameters param)
     }
 
     /* Allocate transfer buffer */
-    if ((buffer = malloc(linear_buf_size)) == NULL){
+    if ((buffer = (char *)malloc(linear_buf_size)) == NULL){
         HDfprintf(stderr, "malloc for transfer buffer size (%zu) failed\n", linear_buf_size);
         GOTOERROR(FAIL);
     }
diff --git a/tools/perform/sio_perf.c b/tools/perform/sio_perf.c
index 7d75a2d..a69e929 100644
--- a/tools/perform/sio_perf.c
+++ b/tools/perform/sio_perf.c
@@ -481,16 +481,16 @@ run_test(iotype iot, parameters parms, struct options *opts)
 
     /* allocate space for tables minmax and that it is sufficient */
     /* to initialize all elements to zeros by calloc.             */
-    write_sys_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax));
-    write_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax));
-    write_gross_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax));
-    write_raw_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax));
+    write_sys_mm_table = (minmax *)calloc((size_t)parms.num_iters , sizeof(minmax));
+    write_mm_table = (minmax *)calloc((size_t)parms.num_iters , sizeof(minmax));
+    write_gross_mm_table = (minmax *)calloc((size_t)parms.num_iters , sizeof(minmax));
+    write_raw_mm_table = (minmax *)calloc((size_t)parms.num_iters , sizeof(minmax));
 
     if (!parms.h5_write_only) {
-        read_sys_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax));
-        read_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax));
-        read_gross_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax));
-        read_raw_mm_table = calloc((size_t)parms.num_iters , sizeof(minmax));
+        read_sys_mm_table = (minmax *)calloc((size_t)parms.num_iters , sizeof(minmax));
+        read_mm_table = (minmax *)calloc((size_t)parms.num_iters , sizeof(minmax));
+        read_gross_mm_table = (minmax *)calloc((size_t)parms.num_iters , sizeof(minmax));
+        read_raw_mm_table = (minmax *)calloc((size_t)parms.num_iters , sizeof(minmax));
     }
 
     /* Do IO iteration times, collecting statistics each time */
@@ -1405,52 +1405,5 @@ usage(const char *prog)
         printf("      HDF5_PREFIX      Data file prefix\n");
         printf("\n");
         fflush(stdout);
-}
-
-void debug_start_stop_time(io_time_t *pt, timer_type t, int start_stop)
-{
-        if (sio_debug_level >= 4) {
-            const char *msg;
-
-            switch (t) {
-            case HDF5_FILE_OPENCLOSE:
-                msg = "File Open/Close";
-                break;
-            case HDF5_DATASET_CREATE:
-                msg = "Dataset Create";
-                break;
-            case HDF5_MPI_WRITE:
-                msg = "MPI Write";
-                break;
-            case HDF5_MPI_READ:
-                msg = "MPI Read";
-                break;
-            case HDF5_FINE_WRITE_FIXED_DIMS:
-                msg = "Fine Write";
-                break;
-            case HDF5_FINE_READ_FIXED_DIMS:
-                msg = "Fine Read";
-                break;
-            case HDF5_GROSS_WRITE_FIXED_DIMS:
-                msg = "Gross Write";
-                break;
-            case HDF5_GROSS_READ_FIXED_DIMS:
-                msg = "Gross Read";
-                break;
-            case HDF5_RAW_WRITE_FIXED_DIMS:
-                msg = "Raw Write";
-                break;
-            case HDF5_RAW_READ_FIXED_DIMS:
-                msg = "Raw Read";
-                break;
-            default:
-                msg = "Unknown Timer";
-                break;
-            }
-
-            fprintf(output, "    %s %s: %.2f\n", msg,
-                    (start_stop == TSTART ? "Start" : "Stop"),
-                    pt->total_time[t]);
-        }
-} /* debug_start_stop_time */
+} /* end usage() */
 
diff --git a/tools/perform/sio_standalone.h b/tools/perform/sio_standalone.h
index 8f52eba..547a9ee 100644
--- a/tools/perform/sio_standalone.h
+++ b/tools/perform/sio_standalone.h
@@ -471,10 +471,10 @@ extern char *strdup(const char *s);
  * HDF Boolean type.
  */
 #ifndef FALSE
-#   define FALSE 0
+#   define FALSE false
 #endif
 #ifndef TRUE
-#   define TRUE 1
+#   define TRUE true
 #endif
 
 /** From h5test.h **/
diff --git a/tools/testfiles/family_file00000.h5 b/tools/testfiles/family_file00000.h5
index 88f75ca..d86fb96 100644
Binary files a/tools/testfiles/family_file00000.h5 and b/tools/testfiles/family_file00000.h5 differ
diff --git a/tools/testfiles/file_space.ddl b/tools/testfiles/file_space.ddl
new file mode 100644
index 0000000..bed5349
--- /dev/null
+++ b/tools/testfiles/file_space.ddl
@@ -0,0 +1,20 @@
+HDF5 "file_space.h5" {
+SUPER_BLOCK {
+   SUPERBLOCK_VERSION 2
+   FREELIST_VERSION 0
+   SYMBOLTABLE_VERSION 0
+   OBJECTHEADER_VERSION 0
+   OFFSET_SIZE 8
+   LENGTH_SIZE 8
+   BTREE_RANK 16
+   BTREE_LEAF 4
+   ISTORE_K 32
+   FILE_SPACE_STRATEGY H5F_FILE_SPACE_AGGR_VFD
+   FREE_SPACE_THRESHOLD 10
+   USER_BLOCK {
+      USERBLOCK_SIZE 0
+   }
+}
+GROUP "/" {
+}
+}
diff --git a/tools/testfiles/file_space.h5 b/tools/testfiles/file_space.h5
new file mode 100644
index 0000000..425d0c2
Binary files /dev/null and b/tools/testfiles/file_space.h5 differ
diff --git a/tools/testfiles/taindices.h5 b/tools/testfiles/taindices.h5
index f7e2c1a..c0e5a68 100644
Binary files a/tools/testfiles/taindices.h5 and b/tools/testfiles/taindices.h5 differ
diff --git a/tools/testfiles/tarray1.h5 b/tools/testfiles/tarray1.h5
index 90371f2..b39d966 100644
Binary files a/tools/testfiles/tarray1.h5 and b/tools/testfiles/tarray1.h5 differ
diff --git a/tools/testfiles/tarray2.h5 b/tools/testfiles/tarray2.h5
index e2e53e8..4c0b105 100644
Binary files a/tools/testfiles/tarray2.h5 and b/tools/testfiles/tarray2.h5 differ
diff --git a/tools/testfiles/tarray3.h5 b/tools/testfiles/tarray3.h5
index 580d846..dbc6031 100644
Binary files a/tools/testfiles/tarray3.h5 and b/tools/testfiles/tarray3.h5 differ
diff --git a/tools/testfiles/tarray4.h5 b/tools/testfiles/tarray4.h5
index b34efb8..142822b 100644
Binary files a/tools/testfiles/tarray4.h5 and b/tools/testfiles/tarray4.h5 differ
diff --git a/tools/testfiles/tarray5.h5 b/tools/testfiles/tarray5.h5
index 55ebf46..e597e3b 100644
Binary files a/tools/testfiles/tarray5.h5 and b/tools/testfiles/tarray5.h5 differ
diff --git a/tools/testfiles/tarray6.h5 b/tools/testfiles/tarray6.h5
index b4af19b..d5ad021 100644
Binary files a/tools/testfiles/tarray6.h5 and b/tools/testfiles/tarray6.h5 differ
diff --git a/tools/testfiles/tarray7.h5 b/tools/testfiles/tarray7.h5
index 74089ea..a744ed5 100644
Binary files a/tools/testfiles/tarray7.h5 and b/tools/testfiles/tarray7.h5 differ
diff --git a/tools/testfiles/tattr.h5 b/tools/testfiles/tattr.h5
index d61def5..bceb228 100644
Binary files a/tools/testfiles/tattr.h5 and b/tools/testfiles/tattr.h5 differ
diff --git a/tools/testfiles/tattr2.h5 b/tools/testfiles/tattr2.h5
index c40f3f7..f062399 100644
Binary files a/tools/testfiles/tattr2.h5 and b/tools/testfiles/tattr2.h5 differ
diff --git a/tools/testfiles/tbigdims.h5 b/tools/testfiles/tbigdims.h5
index c54c2c3..50bf2fd 100644
Binary files a/tools/testfiles/tbigdims.h5 and b/tools/testfiles/tbigdims.h5 differ
diff --git a/tools/testfiles/tbitfields.h5 b/tools/testfiles/tbitfields.h5
index 11087f0..b1b7751 100644
Binary files a/tools/testfiles/tbitfields.h5 and b/tools/testfiles/tbitfields.h5 differ
diff --git a/tools/testfiles/tboot1.ddl b/tools/testfiles/tboot1.ddl
index 2140743..4758948 100644
--- a/tools/testfiles/tboot1.ddl
+++ b/tools/testfiles/tboot1.ddl
@@ -9,6 +9,8 @@ SUPER_BLOCK {
    BTREE_RANK 16
    BTREE_LEAF 4
    ISTORE_K 32
+   FILE_SPACE_STRATEGY H5F_FILE_SPACE_ALL
+   FREE_SPACE_THRESHOLD 1
    USER_BLOCK {
       USERBLOCK_SIZE 0
    }
diff --git a/tools/testfiles/tboot2.ddl b/tools/testfiles/tboot2.ddl
index 4b77b44..d83b92b 100644
--- a/tools/testfiles/tboot2.ddl
+++ b/tools/testfiles/tboot2.ddl
@@ -9,6 +9,8 @@ SUPER_BLOCK {
    BTREE_RANK 16
    BTREE_LEAF 4
    ISTORE_K 32
+   FILE_SPACE_STRATEGY H5F_FILE_SPACE_ALL
+   FREE_SPACE_THRESHOLD 1
    USER_BLOCK {
       USERBLOCK_SIZE 0
    }
diff --git a/tools/testfiles/tboot2A.ddl b/tools/testfiles/tboot2A.ddl
index 4b77b44..d83b92b 100644
--- a/tools/testfiles/tboot2A.ddl
+++ b/tools/testfiles/tboot2A.ddl
@@ -9,6 +9,8 @@ SUPER_BLOCK {
    BTREE_RANK 16
    BTREE_LEAF 4
    ISTORE_K 32
+   FILE_SPACE_STRATEGY H5F_FILE_SPACE_ALL
+   FREE_SPACE_THRESHOLD 1
    USER_BLOCK {
       USERBLOCK_SIZE 0
    }
diff --git a/tools/testfiles/tboot2B.ddl b/tools/testfiles/tboot2B.ddl
index 4b77b44..d83b92b 100644
--- a/tools/testfiles/tboot2B.ddl
+++ b/tools/testfiles/tboot2B.ddl
@@ -9,6 +9,8 @@ SUPER_BLOCK {
    BTREE_RANK 16
    BTREE_LEAF 4
    ISTORE_K 32
+   FILE_SPACE_STRATEGY H5F_FILE_SPACE_ALL
+   FREE_SPACE_THRESHOLD 1
    USER_BLOCK {
       USERBLOCK_SIZE 0
    }
diff --git a/tools/testfiles/tchar.h5 b/tools/testfiles/tchar.h5
index 4d23ea9..0391772 100644
Binary files a/tools/testfiles/tchar.h5 and b/tools/testfiles/tchar.h5 differ
diff --git a/tools/testfiles/tcompound.h5 b/tools/testfiles/tcompound.h5
index d1ec650..edef9d3 100644
Binary files a/tools/testfiles/tcompound.h5 and b/tools/testfiles/tcompound.h5 differ
diff --git a/tools/testfiles/tcompound2.h5 b/tools/testfiles/tcompound2.h5
index 98e80bd..482f9fd 100644
Binary files a/tools/testfiles/tcompound2.h5 and b/tools/testfiles/tcompound2.h5 differ
diff --git a/tools/testfiles/tcompound_complex.h5 b/tools/testfiles/tcompound_complex.h5
index 5c6274f..a0c90eb 100644
Binary files a/tools/testfiles/tcompound_complex.h5 and b/tools/testfiles/tcompound_complex.h5 differ
diff --git a/tools/testfiles/tdatareg.h5 b/tools/testfiles/tdatareg.h5
index 62a889f..631d6b0 100644
Binary files a/tools/testfiles/tdatareg.h5 and b/tools/testfiles/tdatareg.h5 differ
diff --git a/tools/testfiles/tdset.h5 b/tools/testfiles/tdset.h5
index 71dcb91..ae19cf4 100644
Binary files a/tools/testfiles/tdset.h5 and b/tools/testfiles/tdset.h5 differ
diff --git a/tools/testfiles/tdset2.h5 b/tools/testfiles/tdset2.h5
index 5e17cfd..f3e555b 100644
Binary files a/tools/testfiles/tdset2.h5 and b/tools/testfiles/tdset2.h5 differ
diff --git a/tools/testfiles/tdset_idx.ddl b/tools/testfiles/tdset_idx.ddl
new file mode 100644
index 0000000..65d9f44
--- /dev/null
+++ b/tools/testfiles/tdset_idx.ddl
@@ -0,0 +1,61 @@
+#############################
+Expected output for 'h5dump -p -H tdset_idx.h5'
+#############################
+HDF5 "tdset_idx.h5" {
+GROUP "/" {
+   DATASET "dset_btree" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 20, 10 ) / ( 200, 100 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 5, 5 )
+         SIZE 800
+       }
+      FILTERS {
+         NONE
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  0      
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset_filter" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 20, 10 ) / ( 20, 10 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 5, 5 )
+         SIZE 200 (4.000:1 COMPRESSION)
+       }
+      FILTERS {
+         COMPRESSION DEFLATE { LEVEL 9 }
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  0      
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+   DATASET "dset_fixed" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 20, 10 ) / ( 20, 10 ) }
+      STORAGE_LAYOUT {
+         CHUNKED ( 5, 5 )
+         SIZE 800
+       }
+      FILTERS {
+         NONE
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  0      
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+   }
+}
+}
diff --git a/tools/testfiles/tdset_idx.h5 b/tools/testfiles/tdset_idx.h5
new file mode 100644
index 0000000..314de9b
Binary files /dev/null and b/tools/testfiles/tdset_idx.h5 differ
diff --git a/tools/testfiles/tdset_idx.ls b/tools/testfiles/tdset_idx.ls
new file mode 100644
index 0000000..daa14b2
--- /dev/null
+++ b/tools/testfiles/tdset_idx.ls
@@ -0,0 +1,36 @@
+dset_btree               Dataset {20/200, 10/100}
+    Data:
+        (0,0) 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1,
+        (2,2) 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3,
+        (4,4) 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5,
+        (6,6) 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7,
+        (8,8) 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+        (11,0) 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1,
+        (13,2) 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3,
+        (15,4) 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5,
+        (17,6) 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7,
+        (19,8) 8, 9
+dset_filter              Dataset {20, 10}
+    Data:
+        (0,0) 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1,
+        (2,2) 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3,
+        (4,4) 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5,
+        (6,6) 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7,
+        (8,8) 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+        (11,0) 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1,
+        (13,2) 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3,
+        (15,4) 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5,
+        (17,6) 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7,
+        (19,8) 8, 9
+dset_fixed               Dataset {20, 10}
+    Data:
+        (0,0) 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1,
+        (2,2) 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3,
+        (4,4) 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5,
+        (6,6) 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7,
+        (8,8) 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+        (11,0) 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1,
+        (13,2) 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3,
+        (15,4) 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5,
+        (17,6) 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7,
+        (19,8) 8, 9
diff --git a/tools/testfiles/tempty.h5 b/tools/testfiles/tempty.h5
index d7d903f..f6d6b7a 100644
Binary files a/tools/testfiles/tempty.h5 and b/tools/testfiles/tempty.h5 differ
diff --git a/tools/testfiles/tenum.h5 b/tools/testfiles/tenum.h5
index b1300d8..5521fc4 100644
Binary files a/tools/testfiles/tenum.h5 and b/tools/testfiles/tenum.h5 differ
diff --git a/tools/testfiles/tfamily00000.h5 b/tools/testfiles/tfamily00000.h5
index a130bfd..70f6dcf 100644
Binary files a/tools/testfiles/tfamily00000.h5 and b/tools/testfiles/tfamily00000.h5 differ
diff --git a/tools/testfiles/tfcontents2.h5 b/tools/testfiles/tfcontents2.h5
index 1df0779..1514e28 100644
Binary files a/tools/testfiles/tfcontents2.h5 and b/tools/testfiles/tfcontents2.h5 differ
diff --git a/tools/testfiles/tfilters.h5 b/tools/testfiles/tfilters.h5
index d5f13d9..7c33e55 100644
Binary files a/tools/testfiles/tfilters.h5 and b/tools/testfiles/tfilters.h5 differ
diff --git a/tools/testfiles/tfvalues.h5 b/tools/testfiles/tfvalues.h5
index a6af958..c238f44 100644
Binary files a/tools/testfiles/tfvalues.h5 and b/tools/testfiles/tfvalues.h5 differ
diff --git a/tools/testfiles/tgroup.h5 b/tools/testfiles/tgroup.h5
index 565fb67..7c5cd63 100644
Binary files a/tools/testfiles/tgroup.h5 and b/tools/testfiles/tgroup.h5 differ
diff --git a/tools/testfiles/thlink.h5 b/tools/testfiles/thlink.h5
index 6e0e7e1..0ad92d1 100644
Binary files a/tools/testfiles/thlink.h5 and b/tools/testfiles/thlink.h5 differ
diff --git a/tools/testfiles/thyperslab.h5 b/tools/testfiles/thyperslab.h5
index a730aa3..dc2c0db 100644
Binary files a/tools/testfiles/thyperslab.h5 and b/tools/testfiles/thyperslab.h5 differ
diff --git a/tools/testfiles/tlarge_objname.h5 b/tools/testfiles/tlarge_objname.h5
index 707d7b6..9e26283 100644
Binary files a/tools/testfiles/tlarge_objname.h5 and b/tools/testfiles/tlarge_objname.h5 differ
diff --git a/tools/testfiles/tlonglinks.h5 b/tools/testfiles/tlonglinks.h5
index f54e5f5..6c2cab4 100644
Binary files a/tools/testfiles/tlonglinks.h5 and b/tools/testfiles/tlonglinks.h5 differ
diff --git a/tools/testfiles/tloop.h5 b/tools/testfiles/tloop.h5
index d7a2f47..e54f91c 100644
Binary files a/tools/testfiles/tloop.h5 and b/tools/testfiles/tloop.h5 differ
diff --git a/tools/testfiles/tloop2.h5 b/tools/testfiles/tloop2.h5
index 995bfab..60d7ed2 100644
Binary files a/tools/testfiles/tloop2.h5 and b/tools/testfiles/tloop2.h5 differ
diff --git a/tools/testfiles/tmulti-s.h5 b/tools/testfiles/tmulti-s.h5
index 3feae49..bc2fafb 100644
Binary files a/tools/testfiles/tmulti-s.h5 and b/tools/testfiles/tmulti-s.h5 differ
diff --git a/tools/testfiles/tname-amp.h5 b/tools/testfiles/tname-amp.h5
index 27ab521..82f6316 100644
Binary files a/tools/testfiles/tname-amp.h5 and b/tools/testfiles/tname-amp.h5 differ
diff --git a/tools/testfiles/tname-apos.h5 b/tools/testfiles/tname-apos.h5
index 42d0fc3..9b49159 100644
Binary files a/tools/testfiles/tname-apos.h5 and b/tools/testfiles/tname-apos.h5 differ
diff --git a/tools/testfiles/tname-gt.h5 b/tools/testfiles/tname-gt.h5
index fabd154..1d2795e 100644
Binary files a/tools/testfiles/tname-gt.h5 and b/tools/testfiles/tname-gt.h5 differ
diff --git a/tools/testfiles/tname-lt.h5 b/tools/testfiles/tname-lt.h5
index 6b13375..e3dafe0 100644
Binary files a/tools/testfiles/tname-lt.h5 and b/tools/testfiles/tname-lt.h5 differ
diff --git a/tools/testfiles/tname-quot.h5 b/tools/testfiles/tname-quot.h5
index eb8d6cc..fd9e862 100644
Binary files a/tools/testfiles/tname-quot.h5 and b/tools/testfiles/tname-quot.h5 differ
diff --git a/tools/testfiles/tname-sp.h5 b/tools/testfiles/tname-sp.h5
index 0201efd..514eb8d 100644
Binary files a/tools/testfiles/tname-sp.h5 and b/tools/testfiles/tname-sp.h5 differ
diff --git a/tools/testfiles/tnestedcomp.h5 b/tools/testfiles/tnestedcomp.h5
index b777ee3..2912310 100644
Binary files a/tools/testfiles/tnestedcomp.h5 and b/tools/testfiles/tnestedcomp.h5 differ
diff --git a/tools/testfiles/tnodata.h5 b/tools/testfiles/tnodata.h5
index 8e0a89d..1e537f1 100644
Binary files a/tools/testfiles/tnodata.h5 and b/tools/testfiles/tnodata.h5 differ
diff --git a/tools/testfiles/tnullspace.h5 b/tools/testfiles/tnullspace.h5
index b5dac5d..d405061 100644
Binary files a/tools/testfiles/tnullspace.h5 and b/tools/testfiles/tnullspace.h5 differ
diff --git a/tools/testfiles/tobjref.h5 b/tools/testfiles/tobjref.h5
index ef42ff3..ecf3827 100644
Binary files a/tools/testfiles/tobjref.h5 and b/tools/testfiles/tobjref.h5 differ
diff --git a/tools/testfiles/topaque.h5 b/tools/testfiles/topaque.h5
index d56b594..669f4b7 100644
Binary files a/tools/testfiles/topaque.h5 and b/tools/testfiles/topaque.h5 differ
diff --git a/tools/testfiles/tref-escapes-at.h5 b/tools/testfiles/tref-escapes-at.h5
index 641513c..e3f0d6b 100644
Binary files a/tools/testfiles/tref-escapes-at.h5 and b/tools/testfiles/tref-escapes-at.h5 differ
diff --git a/tools/testfiles/tref-escapes.h5 b/tools/testfiles/tref-escapes.h5
index 6c7638b..766a840 100644
Binary files a/tools/testfiles/tref-escapes.h5 and b/tools/testfiles/tref-escapes.h5 differ
diff --git a/tools/testfiles/tref.h5 b/tools/testfiles/tref.h5
index 73b4be5..3a9899a 100644
Binary files a/tools/testfiles/tref.h5 and b/tools/testfiles/tref.h5 differ
diff --git a/tools/testfiles/tsaf.h5 b/tools/testfiles/tsaf.h5
index c84c5b6..75237ba 100644
Binary files a/tools/testfiles/tsaf.h5 and b/tools/testfiles/tsaf.h5 differ
diff --git a/tools/testfiles/tslink.h5 b/tools/testfiles/tslink.h5
index 753b62d..ab80d8f 100644
Binary files a/tools/testfiles/tslink.h5 and b/tools/testfiles/tslink.h5 differ
diff --git a/tools/testfiles/tsplit_file-m.h5 b/tools/testfiles/tsplit_file-m.h5
index a6eef73..d431c70 100644
Binary files a/tools/testfiles/tsplit_file-m.h5 and b/tools/testfiles/tsplit_file-m.h5 differ
diff --git a/tools/testfiles/tstr.h5 b/tools/testfiles/tstr.h5
index af5384f..ae6a012 100644
Binary files a/tools/testfiles/tstr.h5 and b/tools/testfiles/tstr.h5 differ
diff --git a/tools/testfiles/tstr2.h5 b/tools/testfiles/tstr2.h5
index d3b1588..b7d4802 100644
Binary files a/tools/testfiles/tstr2.h5 and b/tools/testfiles/tstr2.h5 differ
diff --git a/tools/testfiles/tstr3.h5 b/tools/testfiles/tstr3.h5
index 9f9112f..727dec5 100644
Binary files a/tools/testfiles/tstr3.h5 and b/tools/testfiles/tstr3.h5 differ
diff --git a/tools/testfiles/tstring-at.h5 b/tools/testfiles/tstring-at.h5
index aa17960..a477ee5 100644
Binary files a/tools/testfiles/tstring-at.h5 and b/tools/testfiles/tstring-at.h5 differ
diff --git a/tools/testfiles/tstring.h5 b/tools/testfiles/tstring.h5
index 667fe78..914a464 100644
Binary files a/tools/testfiles/tstring.h5 and b/tools/testfiles/tstring.h5 differ
diff --git a/tools/testfiles/tvldtypes1.h5 b/tools/testfiles/tvldtypes1.h5
index b5b2bd7..423dae8 100644
Binary files a/tools/testfiles/tvldtypes1.h5 and b/tools/testfiles/tvldtypes1.h5 differ
diff --git a/tools/testfiles/tvldtypes2.h5 b/tools/testfiles/tvldtypes2.h5
index 65bf63f..86ba20d 100644
Binary files a/tools/testfiles/tvldtypes2.h5 and b/tools/testfiles/tvldtypes2.h5 differ
diff --git a/tools/testfiles/tvldtypes3.h5 b/tools/testfiles/tvldtypes3.h5
index dd4aca7..66fd1d2 100644
Binary files a/tools/testfiles/tvldtypes3.h5 and b/tools/testfiles/tvldtypes3.h5 differ
diff --git a/tools/testfiles/tvldtypes4.h5 b/tools/testfiles/tvldtypes4.h5
index 70dc73e..016ad55 100644
Binary files a/tools/testfiles/tvldtypes4.h5 and b/tools/testfiles/tvldtypes4.h5 differ
diff --git a/tools/testfiles/tvldtypes5.h5 b/tools/testfiles/tvldtypes5.h5
index 776c020..71b924f 100644
Binary files a/tools/testfiles/tvldtypes5.h5 and b/tools/testfiles/tvldtypes5.h5 differ
diff --git a/tools/testfiles/tvms.h5 b/tools/testfiles/tvms.h5
index 9c243ff..d3b0b7c 100644
Binary files a/tools/testfiles/tvms.h5 and b/tools/testfiles/tvms.h5 differ
diff --git a/tools/testfiles/vds/1_a.h5 b/tools/testfiles/vds/1_a.h5
new file mode 100644
index 0000000..953d33d
Binary files /dev/null and b/tools/testfiles/vds/1_a.h5 differ
diff --git a/tools/testfiles/vds/1_b.h5 b/tools/testfiles/vds/1_b.h5
new file mode 100644
index 0000000..6ba95e6
Binary files /dev/null and b/tools/testfiles/vds/1_b.h5 differ
diff --git a/tools/testfiles/vds/1_c.h5 b/tools/testfiles/vds/1_c.h5
new file mode 100644
index 0000000..4bcebbd
Binary files /dev/null and b/tools/testfiles/vds/1_c.h5 differ
diff --git a/tools/testfiles/vds/1_d.h5 b/tools/testfiles/vds/1_d.h5
new file mode 100644
index 0000000..9c2d795
Binary files /dev/null and b/tools/testfiles/vds/1_d.h5 differ
diff --git a/tools/testfiles/vds/1_e.h5 b/tools/testfiles/vds/1_e.h5
new file mode 100644
index 0000000..4f7aa7b
Binary files /dev/null and b/tools/testfiles/vds/1_e.h5 differ
diff --git a/tools/testfiles/vds/1_f.h5 b/tools/testfiles/vds/1_f.h5
new file mode 100644
index 0000000..62e86bc
Binary files /dev/null and b/tools/testfiles/vds/1_f.h5 differ
diff --git a/tools/testfiles/vds/1_vds.h5 b/tools/testfiles/vds/1_vds.h5
new file mode 100644
index 0000000..707a37f
Binary files /dev/null and b/tools/testfiles/vds/1_vds.h5 differ
diff --git a/tools/testfiles/vds/2_a.h5 b/tools/testfiles/vds/2_a.h5
new file mode 100644
index 0000000..5227e9e
Binary files /dev/null and b/tools/testfiles/vds/2_a.h5 differ
diff --git a/tools/testfiles/vds/2_b.h5 b/tools/testfiles/vds/2_b.h5
new file mode 100644
index 0000000..34723a3
Binary files /dev/null and b/tools/testfiles/vds/2_b.h5 differ
diff --git a/tools/testfiles/vds/2_c.h5 b/tools/testfiles/vds/2_c.h5
new file mode 100644
index 0000000..d2252fc
Binary files /dev/null and b/tools/testfiles/vds/2_c.h5 differ
diff --git a/tools/testfiles/vds/2_d.h5 b/tools/testfiles/vds/2_d.h5
new file mode 100644
index 0000000..6880c2e
Binary files /dev/null and b/tools/testfiles/vds/2_d.h5 differ
diff --git a/tools/testfiles/vds/2_e.h5 b/tools/testfiles/vds/2_e.h5
new file mode 100644
index 0000000..81ffacc
Binary files /dev/null and b/tools/testfiles/vds/2_e.h5 differ
diff --git a/tools/testfiles/vds/2_vds.h5 b/tools/testfiles/vds/2_vds.h5
new file mode 100644
index 0000000..cbef59c
Binary files /dev/null and b/tools/testfiles/vds/2_vds.h5 differ
diff --git a/tools/testfiles/vds/3_1_vds.h5 b/tools/testfiles/vds/3_1_vds.h5
new file mode 100644
index 0000000..e66e4c7
Binary files /dev/null and b/tools/testfiles/vds/3_1_vds.h5 differ
diff --git a/tools/testfiles/vds/3_2_vds.h5 b/tools/testfiles/vds/3_2_vds.h5
new file mode 100644
index 0000000..a19dab5
Binary files /dev/null and b/tools/testfiles/vds/3_2_vds.h5 differ
diff --git a/tools/testfiles/vds/4_0.h5 b/tools/testfiles/vds/4_0.h5
new file mode 100644
index 0000000..5e71d20
Binary files /dev/null and b/tools/testfiles/vds/4_0.h5 differ
diff --git a/tools/testfiles/vds/4_1.h5 b/tools/testfiles/vds/4_1.h5
new file mode 100644
index 0000000..edad46e
Binary files /dev/null and b/tools/testfiles/vds/4_1.h5 differ
diff --git a/tools/testfiles/vds/4_2.h5 b/tools/testfiles/vds/4_2.h5
new file mode 100644
index 0000000..a82b012
Binary files /dev/null and b/tools/testfiles/vds/4_2.h5 differ
diff --git a/tools/testfiles/vds/4_vds.h5 b/tools/testfiles/vds/4_vds.h5
new file mode 100644
index 0000000..64c2288
Binary files /dev/null and b/tools/testfiles/vds/4_vds.h5 differ
diff --git a/tools/testfiles/vds/5_a.h5 b/tools/testfiles/vds/5_a.h5
new file mode 100644
index 0000000..e8ea552
Binary files /dev/null and b/tools/testfiles/vds/5_a.h5 differ
diff --git a/tools/testfiles/vds/5_b.h5 b/tools/testfiles/vds/5_b.h5
new file mode 100644
index 0000000..6da7cf5
Binary files /dev/null and b/tools/testfiles/vds/5_b.h5 differ
diff --git a/tools/testfiles/vds/5_c.h5 b/tools/testfiles/vds/5_c.h5
new file mode 100644
index 0000000..3e3bc61
Binary files /dev/null and b/tools/testfiles/vds/5_c.h5 differ
diff --git a/tools/testfiles/vds/5_vds.h5 b/tools/testfiles/vds/5_vds.h5
new file mode 100644
index 0000000..379485e
Binary files /dev/null and b/tools/testfiles/vds/5_vds.h5 differ
diff --git a/tools/testfiles/vds/tvds-1.ddl b/tools/testfiles/vds/tvds-1.ddl
new file mode 100644
index 0000000..47fd413
--- /dev/null
+++ b/tools/testfiles/vds/tvds-1.ddl
@@ -0,0 +1,100 @@
+HDF5 "1_vds.h5" {
+GROUP "/" {
+   DATASET "vds_dset" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 5, 18, 8 ) / ( H5S_UNLIMITED, 18, 8 ) }
+      DATA {
+      (0,0,0): 10, 10, 10, 10, 10, 10, 10, 10,
+      (0,1,0): 10, 10, 10, 10, 10, 10, 10, 10,
+      (0,2,0): 20, 20, 20, 20, 20, 20, 20, 20,
+      (0,3,0): 20, 20, 20, 20, 20, 20, 20, 20,
+      (0,4,0): 20, 20, 20, 20, 20, 20, 20, 20,
+      (0,5,0): 20, 20, 20, 20, 20, 20, 20, 20,
+      (0,6,0): 30, 30, 30, 30, 30, 30, 30, 30,
+      (0,7,0): 30, 30, 30, 30, 30, 30, 30, 30,
+      (0,8,0): 40, 40, 40, 40, 40, 40, 40, 40,
+      (0,9,0): 40, 40, 40, 40, 40, 40, 40, 40,
+      (0,10,0): 40, 40, 40, 40, 40, 40, 40, 40,
+      (0,11,0): 40, 40, 40, 40, 40, 40, 40, 40,
+      (0,12,0): 50, 50, 50, 50, 50, 50, 50, 50,
+      (0,13,0): 50, 50, 50, 50, 50, 50, 50, 50,
+      (0,14,0): 60, 60, 60, 60, 60, 60, 60, 60,
+      (0,15,0): 60, 60, 60, 60, 60, 60, 60, 60,
+      (0,16,0): 60, 60, 60, 60, 60, 60, 60, 60,
+      (0,17,0): 60, 60, 60, 60, 60, 60, 60, 60,
+      (1,0,0): 11, 11, 11, 11, 11, 11, 11, 11,
+      (1,1,0): 11, 11, 11, 11, 11, 11, 11, 11,
+      (1,2,0): 21, 21, 21, 21, 21, 21, 21, 21,
+      (1,3,0): 21, 21, 21, 21, 21, 21, 21, 21,
+      (1,4,0): 21, 21, 21, 21, 21, 21, 21, 21,
+      (1,5,0): 21, 21, 21, 21, 21, 21, 21, 21,
+      (1,6,0): 31, 31, 31, 31, 31, 31, 31, 31,
+      (1,7,0): 31, 31, 31, 31, 31, 31, 31, 31,
+      (1,8,0): 41, 41, 41, 41, 41, 41, 41, 41,
+      (1,9,0): 41, 41, 41, 41, 41, 41, 41, 41,
+      (1,10,0): 41, 41, 41, 41, 41, 41, 41, 41,
+      (1,11,0): 41, 41, 41, 41, 41, 41, 41, 41,
+      (1,12,0): 51, 51, 51, 51, 51, 51, 51, 51,
+      (1,13,0): 51, 51, 51, 51, 51, 51, 51, 51,
+      (1,14,0): 61, 61, 61, 61, 61, 61, 61, 61,
+      (1,15,0): 61, 61, 61, 61, 61, 61, 61, 61,
+      (1,16,0): 61, 61, 61, 61, 61, 61, 61, 61,
+      (1,17,0): 61, 61, 61, 61, 61, 61, 61, 61,
+      (2,0,0): 12, 12, 12, 12, 12, 12, 12, 12,
+      (2,1,0): 12, 12, 12, 12, 12, 12, 12, 12,
+      (2,2,0): 22, 22, 22, 22, 22, 22, 22, 22,
+      (2,3,0): 22, 22, 22, 22, 22, 22, 22, 22,
+      (2,4,0): 22, 22, 22, 22, 22, 22, 22, 22,
+      (2,5,0): 22, 22, 22, 22, 22, 22, 22, 22,
+      (2,6,0): 32, 32, 32, 32, 32, 32, 32, 32,
+      (2,7,0): 32, 32, 32, 32, 32, 32, 32, 32,
+      (2,8,0): 42, 42, 42, 42, 42, 42, 42, 42,
+      (2,9,0): 42, 42, 42, 42, 42, 42, 42, 42,
+      (2,10,0): 42, 42, 42, 42, 42, 42, 42, 42,
+      (2,11,0): 42, 42, 42, 42, 42, 42, 42, 42,
+      (2,12,0): 52, 52, 52, 52, 52, 52, 52, 52,
+      (2,13,0): 52, 52, 52, 52, 52, 52, 52, 52,
+      (2,14,0): 62, 62, 62, 62, 62, 62, 62, 62,
+      (2,15,0): 62, 62, 62, 62, 62, 62, 62, 62,
+      (2,16,0): 62, 62, 62, 62, 62, 62, 62, 62,
+      (2,17,0): 62, 62, 62, 62, 62, 62, 62, 62,
+      (3,0,0): 13, 13, 13, 13, 13, 13, 13, 13,
+      (3,1,0): 13, 13, 13, 13, 13, 13, 13, 13,
+      (3,2,0): 23, 23, 23, 23, 23, 23, 23, 23,
+      (3,3,0): 23, 23, 23, 23, 23, 23, 23, 23,
+      (3,4,0): 23, 23, 23, 23, 23, 23, 23, 23,
+      (3,5,0): 23, 23, 23, 23, 23, 23, 23, 23,
+      (3,6,0): 33, 33, 33, 33, 33, 33, 33, 33,
+      (3,7,0): 33, 33, 33, 33, 33, 33, 33, 33,
+      (3,8,0): 43, 43, 43, 43, 43, 43, 43, 43,
+      (3,9,0): 43, 43, 43, 43, 43, 43, 43, 43,
+      (3,10,0): 43, 43, 43, 43, 43, 43, 43, 43,
+      (3,11,0): 43, 43, 43, 43, 43, 43, 43, 43,
+      (3,12,0): 53, 53, 53, 53, 53, 53, 53, 53,
+      (3,13,0): 53, 53, 53, 53, 53, 53, 53, 53,
+      (3,14,0): 63, 63, 63, 63, 63, 63, 63, 63,
+      (3,15,0): 63, 63, 63, 63, 63, 63, 63, 63,
+      (3,16,0): 63, 63, 63, 63, 63, 63, 63, 63,
+      (3,17,0): 63, 63, 63, 63, 63, 63, 63, 63,
+      (4,0,0): 14, 14, 14, 14, 14, 14, 14, 14,
+      (4,1,0): 14, 14, 14, 14, 14, 14, 14, 14,
+      (4,2,0): 24, 24, 24, 24, 24, 24, 24, 24,
+      (4,3,0): 24, 24, 24, 24, 24, 24, 24, 24,
+      (4,4,0): 24, 24, 24, 24, 24, 24, 24, 24,
+      (4,5,0): 24, 24, 24, 24, 24, 24, 24, 24,
+      (4,6,0): 34, 34, 34, 34, 34, 34, 34, 34,
+      (4,7,0): 34, 34, 34, 34, 34, 34, 34, 34,
+      (4,8,0): 44, 44, 44, 44, 44, 44, 44, 44,
+      (4,9,0): 44, 44, 44, 44, 44, 44, 44, 44,
+      (4,10,0): 44, 44, 44, 44, 44, 44, 44, 44,
+      (4,11,0): 44, 44, 44, 44, 44, 44, 44, 44,
+      (4,12,0): 54, 54, 54, 54, 54, 54, 54, 54,
+      (4,13,0): 54, 54, 54, 54, 54, 54, 54, 54,
+      (4,14,0): 64, 64, 64, 64, 64, 64, 64, 64,
+      (4,15,0): 64, 64, 64, 64, 64, 64, 64, 64,
+      (4,16,0): 64, 64, 64, 64, 64, 64, 64, 64,
+      (4,17,0): 64, 64, 64, 64, 64, 64, 64, 64
+      }
+   }
+}
+}
diff --git a/tools/testfiles/vds/tvds-1.ls b/tools/testfiles/vds/tvds-1.ls
new file mode 100644
index 0000000..61c9e46
--- /dev/null
+++ b/tools/testfiles/vds/tvds-1.ls
@@ -0,0 +1,14 @@
+Opened "1_vds.h5" with sec2 driver.
+vds_dset                 Dataset {5/Inf, 18/18, 8/8}
+    Location:  1:800
+    Links:     1
+    Maps:      {6} Source {
+                      1_a.h5   /source_dset
+                      1_b.h5   /source_dset
+                      1_c.h5   /source_dset
+                      1_d.h5   /source_dset
+                      1_e.h5   /source_dset
+                      1_f.h5   /source_dset
+               }
+    Storage:   2880 logical bytes, 0 allocated bytes
+    Type:      32-bit little-endian integer
diff --git a/tools/testfiles/vds/tvds-2.ddl b/tools/testfiles/vds/tvds-2.ddl
new file mode 100644
index 0000000..5f2ae16
--- /dev/null
+++ b/tools/testfiles/vds/tvds-2.ddl
@@ -0,0 +1,58 @@
+HDF5 "2_vds.h5" {
+GROUP "/" {
+   DATASET "vds_dset" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 6, 8, 14 ) / ( H5S_UNLIMITED, 8, 14 ) }
+      DATA {
+      (0,0,0): 10, 10, 10, 10, 10, 10, 10, 40, 40, 40, 40, 40, 40, 40,
+      (0,1,0): 10, 10, 10, 10, 10, 10, 10, 40, 40, 40, 40, 40, 40, 40,
+      (0,2,0): 20, 20, 20, 20, 20, 20, 20, 40, 40, 40, 40, 40, 40, 40,
+      (0,3,0): 20, 20, 20, 20, 20, 20, 20, 40, 40, 40, 40, 40, 40, 40,
+      (0,4,0): 20, 20, 20, 20, 20, 20, 20, 40, 40, 40, 40, 40, 40, 40,
+      (0,5,0): 20, 20, 20, 20, 20, 20, 20, 50, 50, 50, 50, 50, 50, 50,
+      (0,6,0): 30, 30, 30, 30, 30, 30, 30, 50, 50, 50, 50, 50, 50, 50,
+      (0,7,0): 30, 30, 30, 30, 30, 30, 30, 50, 50, 50, 50, 50, 50, 50,
+      (1,0,0): 11, 11, 11, 11, 11, 11, 11, 41, 41, 41, 41, 41, 41, 41,
+      (1,1,0): 11, 11, 11, 11, 11, 11, 11, 41, 41, 41, 41, 41, 41, 41,
+      (1,2,0): 21, 21, 21, 21, 21, 21, 21, 41, 41, 41, 41, 41, 41, 41,
+      (1,3,0): 21, 21, 21, 21, 21, 21, 21, 41, 41, 41, 41, 41, 41, 41,
+      (1,4,0): 21, 21, 21, 21, 21, 21, 21, 41, 41, 41, 41, 41, 41, 41,
+      (1,5,0): 21, 21, 21, 21, 21, 21, 21, 51, 51, 51, 51, 51, 51, 51,
+      (1,6,0): 31, 31, 31, 31, 31, 31, 31, 51, 51, 51, 51, 51, 51, 51,
+      (1,7,0): 31, 31, 31, 31, 31, 31, 31, 51, 51, 51, 51, 51, 51, 51,
+      (2,0,0): 12, 12, 12, 12, 12, 12, 12, 42, 42, 42, 42, 42, 42, 42,
+      (2,1,0): 12, 12, 12, 12, 12, 12, 12, 42, 42, 42, 42, 42, 42, 42,
+      (2,2,0): 22, 22, 22, 22, 22, 22, 22, 42, 42, 42, 42, 42, 42, 42,
+      (2,3,0): 22, 22, 22, 22, 22, 22, 22, 42, 42, 42, 42, 42, 42, 42,
+      (2,4,0): 22, 22, 22, 22, 22, 22, 22, 42, 42, 42, 42, 42, 42, 42,
+      (2,5,0): 22, 22, 22, 22, 22, 22, 22, 52, 52, 52, 52, 52, 52, 52,
+      (2,6,0): 32, 32, 32, 32, 32, 32, 32, 52, 52, 52, 52, 52, 52, 52,
+      (2,7,0): 32, 32, 32, 32, 32, 32, 32, 52, 52, 52, 52, 52, 52, 52,
+      (3,0,0): 13, 13, 13, 13, 13, 13, 13, 43, 43, 43, 43, 43, 43, 43,
+      (3,1,0): 13, 13, 13, 13, 13, 13, 13, 43, 43, 43, 43, 43, 43, 43,
+      (3,2,0): 23, 23, 23, 23, 23, 23, 23, 43, 43, 43, 43, 43, 43, 43,
+      (3,3,0): 23, 23, 23, 23, 23, 23, 23, 43, 43, 43, 43, 43, 43, 43,
+      (3,4,0): 23, 23, 23, 23, 23, 23, 23, 43, 43, 43, 43, 43, 43, 43,
+      (3,5,0): 23, 23, 23, 23, 23, 23, 23, 53, 53, 53, 53, 53, 53, 53,
+      (3,6,0): 33, 33, 33, 33, 33, 33, 33, 53, 53, 53, 53, 53, 53, 53,
+      (3,7,0): 33, 33, 33, 33, 33, 33, 33, 53, 53, 53, 53, 53, 53, 53,
+      (4,0,0): 14, 14, 14, 14, 14, 14, 14, 44, 44, 44, 44, 44, 44, 44,
+      (4,1,0): 14, 14, 14, 14, 14, 14, 14, 44, 44, 44, 44, 44, 44, 44,
+      (4,2,0): 24, 24, 24, 24, 24, 24, 24, 44, 44, 44, 44, 44, 44, 44,
+      (4,3,0): 24, 24, 24, 24, 24, 24, 24, 44, 44, 44, 44, 44, 44, 44,
+      (4,4,0): 24, 24, 24, 24, 24, 24, 24, 44, 44, 44, 44, 44, 44, 44,
+      (4,5,0): 24, 24, 24, 24, 24, 24, 24, 54, 54, 54, 54, 54, 54, 54,
+      (4,6,0): 34, 34, 34, 34, 34, 34, 34, 54, 54, 54, 54, 54, 54, 54,
+      (4,7,0): 34, 34, 34, 34, 34, 34, 34, 54, 54, 54, 54, 54, 54, 54,
+      (5,0,0): 15, 15, 15, 15, 15, 15, 15, 45, 45, 45, 45, 45, 45, 45,
+      (5,1,0): 15, 15, 15, 15, 15, 15, 15, 45, 45, 45, 45, 45, 45, 45,
+      (5,2,0): 25, 25, 25, 25, 25, 25, 25, 45, 45, 45, 45, 45, 45, 45,
+      (5,3,0): 25, 25, 25, 25, 25, 25, 25, 45, 45, 45, 45, 45, 45, 45,
+      (5,4,0): 25, 25, 25, 25, 25, 25, 25, 45, 45, 45, 45, 45, 45, 45,
+      (5,5,0): 25, 25, 25, 25, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55,
+      (5,6,0): 35, 35, 35, 35, 35, 35, 35, 55, 55, 55, 55, 55, 55, 55,
+      (5,7,0): 35, 35, 35, 35, 35, 35, 35, 55, 55, 55, 55, 55, 55, 55
+      }
+   }
+}
+}
diff --git a/tools/testfiles/vds/tvds-2.ls b/tools/testfiles/vds/tvds-2.ls
new file mode 100644
index 0000000..49fe05f
--- /dev/null
+++ b/tools/testfiles/vds/tvds-2.ls
@@ -0,0 +1,13 @@
+Opened "2_vds.h5" with sec2 driver.
+vds_dset                 Dataset {6/Inf, 8/8, 14/14}
+    Location:  1:800
+    Links:     1
+    Maps:      {5} Source {
+                      2_a.h5   /source_dset
+                      2_b.h5   /source_dset
+                      2_c.h5   /source_dset
+                      2_d.h5   /source_dset
+                      2_e.h5   /source_dset
+               }
+    Storage:   2688 logical bytes, 0 allocated bytes
+    Type:      32-bit little-endian integer
diff --git a/tools/testfiles/vds/tvds-3_1.ddl b/tools/testfiles/vds/tvds-3_1.ddl
new file mode 100644
index 0000000..7d7d8b6
--- /dev/null
+++ b/tools/testfiles/vds/tvds-3_1.ddl
@@ -0,0 +1,135 @@
+HDF5 "3_1_vds.h5" {
+GROUP "/" {
+   DATASET "vds_dset" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 5, 25, 8 ) / ( H5S_UNLIMITED, 25, 8 ) }
+      DATA {
+      (0,0,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (0,1,0): 10, 10, 10, 10, 10, 10, 10, 10,
+      (0,2,0): 10, 10, 10, 10, 10, 10, 10, 10,
+      (0,3,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (0,4,0): 20, 20, 20, 20, 20, 20, 20, 20,
+      (0,5,0): 20, 20, 20, 20, 20, 20, 20, 20,
+      (0,6,0): 20, 20, 20, 20, 20, 20, 20, 20,
+      (0,7,0): 20, 20, 20, 20, 20, 20, 20, 20,
+      (0,8,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (0,9,0): 30, 30, 30, 30, 30, 30, 30, 30,
+      (0,10,0): 30, 30, 30, 30, 30, 30, 30, 30,
+      (0,11,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (0,12,0): 40, 40, 40, 40, 40, 40, 40, 40,
+      (0,13,0): 40, 40, 40, 40, 40, 40, 40, 40,
+      (0,14,0): 40, 40, 40, 40, 40, 40, 40, 40,
+      (0,15,0): 40, 40, 40, 40, 40, 40, 40, 40,
+      (0,16,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (0,17,0): 50, 50, 50, 50, 50, 50, 50, 50,
+      (0,18,0): 50, 50, 50, 50, 50, 50, 50, 50,
+      (0,19,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (0,20,0): 60, 60, 60, 60, 60, 60, 60, 60,
+      (0,21,0): 60, 60, 60, 60, 60, 60, 60, 60,
+      (0,22,0): 60, 60, 60, 60, 60, 60, 60, 60,
+      (0,23,0): 60, 60, 60, 60, 60, 60, 60, 60,
+      (0,24,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,0,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,1,0): 11, 11, 11, 11, 11, 11, 11, 11,
+      (1,2,0): 11, 11, 11, 11, 11, 11, 11, 11,
+      (1,3,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,4,0): 21, 21, 21, 21, 21, 21, 21, 21,
+      (1,5,0): 21, 21, 21, 21, 21, 21, 21, 21,
+      (1,6,0): 21, 21, 21, 21, 21, 21, 21, 21,
+      (1,7,0): 21, 21, 21, 21, 21, 21, 21, 21,
+      (1,8,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,9,0): 31, 31, 31, 31, 31, 31, 31, 31,
+      (1,10,0): 31, 31, 31, 31, 31, 31, 31, 31,
+      (1,11,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,12,0): 41, 41, 41, 41, 41, 41, 41, 41,
+      (1,13,0): 41, 41, 41, 41, 41, 41, 41, 41,
+      (1,14,0): 41, 41, 41, 41, 41, 41, 41, 41,
+      (1,15,0): 41, 41, 41, 41, 41, 41, 41, 41,
+      (1,16,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,17,0): 51, 51, 51, 51, 51, 51, 51, 51,
+      (1,18,0): 51, 51, 51, 51, 51, 51, 51, 51,
+      (1,19,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,20,0): 61, 61, 61, 61, 61, 61, 61, 61,
+      (1,21,0): 61, 61, 61, 61, 61, 61, 61, 61,
+      (1,22,0): 61, 61, 61, 61, 61, 61, 61, 61,
+      (1,23,0): 61, 61, 61, 61, 61, 61, 61, 61,
+      (1,24,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,0,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,1,0): 12, 12, 12, 12, 12, 12, 12, 12,
+      (2,2,0): 12, 12, 12, 12, 12, 12, 12, 12,
+      (2,3,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,4,0): 22, 22, 22, 22, 22, 22, 22, 22,
+      (2,5,0): 22, 22, 22, 22, 22, 22, 22, 22,
+      (2,6,0): 22, 22, 22, 22, 22, 22, 22, 22,
+      (2,7,0): 22, 22, 22, 22, 22, 22, 22, 22,
+      (2,8,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,9,0): 32, 32, 32, 32, 32, 32, 32, 32,
+      (2,10,0): 32, 32, 32, 32, 32, 32, 32, 32,
+      (2,11,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,12,0): 42, 42, 42, 42, 42, 42, 42, 42,
+      (2,13,0): 42, 42, 42, 42, 42, 42, 42, 42,
+      (2,14,0): 42, 42, 42, 42, 42, 42, 42, 42,
+      (2,15,0): 42, 42, 42, 42, 42, 42, 42, 42,
+      (2,16,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,17,0): 52, 52, 52, 52, 52, 52, 52, 52,
+      (2,18,0): 52, 52, 52, 52, 52, 52, 52, 52,
+      (2,19,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,20,0): 62, 62, 62, 62, 62, 62, 62, 62,
+      (2,21,0): 62, 62, 62, 62, 62, 62, 62, 62,
+      (2,22,0): 62, 62, 62, 62, 62, 62, 62, 62,
+      (2,23,0): 62, 62, 62, 62, 62, 62, 62, 62,
+      (2,24,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,0,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,1,0): 13, 13, 13, 13, 13, 13, 13, 13,
+      (3,2,0): 13, 13, 13, 13, 13, 13, 13, 13,
+      (3,3,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,4,0): 23, 23, 23, 23, 23, 23, 23, 23,
+      (3,5,0): 23, 23, 23, 23, 23, 23, 23, 23,
+      (3,6,0): 23, 23, 23, 23, 23, 23, 23, 23,
+      (3,7,0): 23, 23, 23, 23, 23, 23, 23, 23,
+      (3,8,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,9,0): 33, 33, 33, 33, 33, 33, 33, 33,
+      (3,10,0): 33, 33, 33, 33, 33, 33, 33, 33,
+      (3,11,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,12,0): 43, 43, 43, 43, 43, 43, 43, 43,
+      (3,13,0): 43, 43, 43, 43, 43, 43, 43, 43,
+      (3,14,0): 43, 43, 43, 43, 43, 43, 43, 43,
+      (3,15,0): 43, 43, 43, 43, 43, 43, 43, 43,
+      (3,16,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,17,0): 53, 53, 53, 53, 53, 53, 53, 53,
+      (3,18,0): 53, 53, 53, 53, 53, 53, 53, 53,
+      (3,19,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,20,0): 63, 63, 63, 63, 63, 63, 63, 63,
+      (3,21,0): 63, 63, 63, 63, 63, 63, 63, 63,
+      (3,22,0): 63, 63, 63, 63, 63, 63, 63, 63,
+      (3,23,0): 63, 63, 63, 63, 63, 63, 63, 63,
+      (3,24,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,0,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,1,0): 14, 14, 14, 14, 14, 14, 14, 14,
+      (4,2,0): 14, 14, 14, 14, 14, 14, 14, 14,
+      (4,3,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,4,0): 24, 24, 24, 24, 24, 24, 24, 24,
+      (4,5,0): 24, 24, 24, 24, 24, 24, 24, 24,
+      (4,6,0): 24, 24, 24, 24, 24, 24, 24, 24,
+      (4,7,0): 24, 24, 24, 24, 24, 24, 24, 24,
+      (4,8,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,9,0): 34, 34, 34, 34, 34, 34, 34, 34,
+      (4,10,0): 34, 34, 34, 34, 34, 34, 34, 34,
+      (4,11,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,12,0): 44, 44, 44, 44, 44, 44, 44, 44,
+      (4,13,0): 44, 44, 44, 44, 44, 44, 44, 44,
+      (4,14,0): 44, 44, 44, 44, 44, 44, 44, 44,
+      (4,15,0): 44, 44, 44, 44, 44, 44, 44, 44,
+      (4,16,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,17,0): 54, 54, 54, 54, 54, 54, 54, 54,
+      (4,18,0): 54, 54, 54, 54, 54, 54, 54, 54,
+      (4,19,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,20,0): 64, 64, 64, 64, 64, 64, 64, 64,
+      (4,21,0): 64, 64, 64, 64, 64, 64, 64, 64,
+      (4,22,0): 64, 64, 64, 64, 64, 64, 64, 64,
+      (4,23,0): 64, 64, 64, 64, 64, 64, 64, 64,
+      (4,24,0): -9, -9, -9, -9, -9, -9, -9, -9
+      }
+   }
+}
+}
diff --git a/tools/testfiles/vds/tvds-3_1.ls b/tools/testfiles/vds/tvds-3_1.ls
new file mode 100644
index 0000000..fe24002
--- /dev/null
+++ b/tools/testfiles/vds/tvds-3_1.ls
@@ -0,0 +1,14 @@
+Opened "3_1_vds.h5" with sec2 driver.
+vds_dset                 Dataset {5/Inf, 25/25, 8/8}
+    Location:  1:800
+    Links:     1
+    Maps:      {6} Source {
+                      1_a.h5   /source_dset
+                      1_b.h5   /source_dset
+                      1_c.h5   /source_dset
+                      1_d.h5   /source_dset
+                      1_e.h5   /source_dset
+                      1_f.h5   /source_dset
+               }
+    Storage:   4000 logical bytes, 0 allocated bytes
+    Type:      32-bit little-endian integer
diff --git a/tools/testfiles/vds/tvds-3_2.ddl b/tools/testfiles/vds/tvds-3_2.ddl
new file mode 100644
index 0000000..baec6f0
--- /dev/null
+++ b/tools/testfiles/vds/tvds-3_2.ddl
@@ -0,0 +1,166 @@
+HDF5 "3_2_vds.h5" {
+GROUP "/" {
+   DATASET "vds_dset" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 6, 13, 19 ) / ( H5S_UNLIMITED, 13, 19 ) }
+      DATA {
+      (0,0,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9,
+      (0,0,15): -9, -9, -9, -9,
+      (0,1,0): -9, 10, 10, 10, 10, 10, 10, 10, -9, 40, 40, 40, 40, 40, 40,
+      (0,1,15): 40, -9, -9, -9,
+      (0,2,0): -9, 10, 10, 10, 10, 10, 10, 10, -9, 40, 40, 40, 40, 40, 40,
+      (0,2,15): 40, -9, -9, -9,
+      (0,3,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, 40, 40, 40, 40, 40, 40,
+      (0,3,15): 40, -9, -9, -9,
+      (0,4,0): 20, 20, 20, 20, 20, 20, 20, -9, -9, 40, 40, 40, 40, 40, 40,
+      (0,4,15): 40, -9, -9, -9,
+      (0,5,0): 20, 20, 20, 20, 20, 20, 20, -9, -9, 40, 40, 40, 40, 40, 40,
+      (0,5,15): 40, -9, -9, -9,
+      (0,6,0): 20, 20, 20, 20, 20, 20, 20, -9, -9, -9, -9, -9, -9, -9, -9,
+      (0,6,15): -9, -9, -9, -9,
+      (0,7,0): 20, 20, 20, 20, 20, 20, 20, -9, -9, -9, -9, -9, -9, -9, -9,
+      (0,7,15): -9, -9, -9, -9,
+      (0,8,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 50, 50, 50,
+      (0,8,15): 50, 50, 50, 50,
+      (0,9,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 50, 50, 50,
+      (0,9,15): 50, 50, 50, 50,
+      (0,10,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 50, 50, 50,
+      (0,10,15): 50, 50, 50, 50,
+      (0,11,0): -9, -9, -9, -9, 30, 30, 30, 30, 30, 30, 30, -9, -9, -9, -9,
+      (0,11,15): -9, -9, -9, -9,
+      (0,12,0): -9, -9, -9, -9, 30, 30, 30, 30, 30, 30, 30, -9, -9, -9, -9,
+      (0,12,15): -9, -9, -9, -9,
+      (1,0,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,0,15): -9, -9, -9, -9,
+      (1,1,0): -9, 11, 11, 11, 11, 11, 11, 11, -9, 41, 41, 41, 41, 41, 41,
+      (1,1,15): 41, -9, -9, -9,
+      (1,2,0): -9, 11, 11, 11, 11, 11, 11, 11, -9, 41, 41, 41, 41, 41, 41,
+      (1,2,15): 41, -9, -9, -9,
+      (1,3,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, 41, 41, 41, 41, 41, 41,
+      (1,3,15): 41, -9, -9, -9,
+      (1,4,0): 21, 21, 21, 21, 21, 21, 21, -9, -9, 41, 41, 41, 41, 41, 41,
+      (1,4,15): 41, -9, -9, -9,
+      (1,5,0): 21, 21, 21, 21, 21, 21, 21, -9, -9, 41, 41, 41, 41, 41, 41,
+      (1,5,15): 41, -9, -9, -9,
+      (1,6,0): 21, 21, 21, 21, 21, 21, 21, -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,6,15): -9, -9, -9, -9,
+      (1,7,0): 21, 21, 21, 21, 21, 21, 21, -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,7,15): -9, -9, -9, -9,
+      (1,8,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 51, 51, 51,
+      (1,8,15): 51, 51, 51, 51,
+      (1,9,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 51, 51, 51,
+      (1,9,15): 51, 51, 51, 51,
+      (1,10,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 51, 51, 51,
+      (1,10,15): 51, 51, 51, 51,
+      (1,11,0): -9, -9, -9, -9, 31, 31, 31, 31, 31, 31, 31, -9, -9, -9, -9,
+      (1,11,15): -9, -9, -9, -9,
+      (1,12,0): -9, -9, -9, -9, 31, 31, 31, 31, 31, 31, 31, -9, -9, -9, -9,
+      (1,12,15): -9, -9, -9, -9,
+      (2,0,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,0,15): -9, -9, -9, -9,
+      (2,1,0): -9, 12, 12, 12, 12, 12, 12, 12, -9, 42, 42, 42, 42, 42, 42,
+      (2,1,15): 42, -9, -9, -9,
+      (2,2,0): -9, 12, 12, 12, 12, 12, 12, 12, -9, 42, 42, 42, 42, 42, 42,
+      (2,2,15): 42, -9, -9, -9,
+      (2,3,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, 42, 42, 42, 42, 42, 42,
+      (2,3,15): 42, -9, -9, -9,
+      (2,4,0): 22, 22, 22, 22, 22, 22, 22, -9, -9, 42, 42, 42, 42, 42, 42,
+      (2,4,15): 42, -9, -9, -9,
+      (2,5,0): 22, 22, 22, 22, 22, 22, 22, -9, -9, 42, 42, 42, 42, 42, 42,
+      (2,5,15): 42, -9, -9, -9,
+      (2,6,0): 22, 22, 22, 22, 22, 22, 22, -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,6,15): -9, -9, -9, -9,
+      (2,7,0): 22, 22, 22, 22, 22, 22, 22, -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,7,15): -9, -9, -9, -9,
+      (2,8,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 52, 52, 52,
+      (2,8,15): 52, 52, 52, 52,
+      (2,9,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 52, 52, 52,
+      (2,9,15): 52, 52, 52, 52,
+      (2,10,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 52, 52, 52,
+      (2,10,15): 52, 52, 52, 52,
+      (2,11,0): -9, -9, -9, -9, 32, 32, 32, 32, 32, 32, 32, -9, -9, -9, -9,
+      (2,11,15): -9, -9, -9, -9,
+      (2,12,0): -9, -9, -9, -9, 32, 32, 32, 32, 32, 32, 32, -9, -9, -9, -9,
+      (2,12,15): -9, -9, -9, -9,
+      (3,0,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,0,15): -9, -9, -9, -9,
+      (3,1,0): -9, 13, 13, 13, 13, 13, 13, 13, -9, 43, 43, 43, 43, 43, 43,
+      (3,1,15): 43, -9, -9, -9,
+      (3,2,0): -9, 13, 13, 13, 13, 13, 13, 13, -9, 43, 43, 43, 43, 43, 43,
+      (3,2,15): 43, -9, -9, -9,
+      (3,3,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, 43, 43, 43, 43, 43, 43,
+      (3,3,15): 43, -9, -9, -9,
+      (3,4,0): 23, 23, 23, 23, 23, 23, 23, -9, -9, 43, 43, 43, 43, 43, 43,
+      (3,4,15): 43, -9, -9, -9,
+      (3,5,0): 23, 23, 23, 23, 23, 23, 23, -9, -9, 43, 43, 43, 43, 43, 43,
+      (3,5,15): 43, -9, -9, -9,
+      (3,6,0): 23, 23, 23, 23, 23, 23, 23, -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,6,15): -9, -9, -9, -9,
+      (3,7,0): 23, 23, 23, 23, 23, 23, 23, -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,7,15): -9, -9, -9, -9,
+      (3,8,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 53, 53, 53,
+      (3,8,15): 53, 53, 53, 53,
+      (3,9,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 53, 53, 53,
+      (3,9,15): 53, 53, 53, 53,
+      (3,10,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 53, 53, 53,
+      (3,10,15): 53, 53, 53, 53,
+      (3,11,0): -9, -9, -9, -9, 33, 33, 33, 33, 33, 33, 33, -9, -9, -9, -9,
+      (3,11,15): -9, -9, -9, -9,
+      (3,12,0): -9, -9, -9, -9, 33, 33, 33, 33, 33, 33, 33, -9, -9, -9, -9,
+      (3,12,15): -9, -9, -9, -9,
+      (4,0,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,0,15): -9, -9, -9, -9,
+      (4,1,0): -9, 14, 14, 14, 14, 14, 14, 14, -9, 44, 44, 44, 44, 44, 44,
+      (4,1,15): 44, -9, -9, -9,
+      (4,2,0): -9, 14, 14, 14, 14, 14, 14, 14, -9, 44, 44, 44, 44, 44, 44,
+      (4,2,15): 44, -9, -9, -9,
+      (4,3,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, 44, 44, 44, 44, 44, 44,
+      (4,3,15): 44, -9, -9, -9,
+      (4,4,0): 24, 24, 24, 24, 24, 24, 24, -9, -9, 44, 44, 44, 44, 44, 44,
+      (4,4,15): 44, -9, -9, -9,
+      (4,5,0): 24, 24, 24, 24, 24, 24, 24, -9, -9, 44, 44, 44, 44, 44, 44,
+      (4,5,15): 44, -9, -9, -9,
+      (4,6,0): 24, 24, 24, 24, 24, 24, 24, -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,6,15): -9, -9, -9, -9,
+      (4,7,0): 24, 24, 24, 24, 24, 24, 24, -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,7,15): -9, -9, -9, -9,
+      (4,8,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 54, 54, 54,
+      (4,8,15): 54, 54, 54, 54,
+      (4,9,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 54, 54, 54,
+      (4,9,15): 54, 54, 54, 54,
+      (4,10,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 54, 54, 54,
+      (4,10,15): 54, 54, 54, 54,
+      (4,11,0): -9, -9, -9, -9, 34, 34, 34, 34, 34, 34, 34, -9, -9, -9, -9,
+      (4,11,15): -9, -9, -9, -9,
+      (4,12,0): -9, -9, -9, -9, 34, 34, 34, 34, 34, 34, 34, -9, -9, -9, -9,
+      (4,12,15): -9, -9, -9, -9,
+      (5,0,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9,
+      (5,0,15): -9, -9, -9, -9,
+      (5,1,0): -9, 15, 15, 15, 15, 15, 15, 15, -9, 45, 45, 45, 45, 45, 45,
+      (5,1,15): 45, -9, -9, -9,
+      (5,2,0): -9, 15, 15, 15, 15, 15, 15, 15, -9, 45, 45, 45, 45, 45, 45,
+      (5,2,15): 45, -9, -9, -9,
+      (5,3,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, 45, 45, 45, 45, 45, 45,
+      (5,3,15): 45, -9, -9, -9,
+      (5,4,0): 25, 25, 25, 25, 25, 25, 25, -9, -9, 45, 45, 45, 45, 45, 45,
+      (5,4,15): 45, -9, -9, -9,
+      (5,5,0): 25, 25, 25, 25, 25, 25, 25, -9, -9, 45, 45, 45, 45, 45, 45,
+      (5,5,15): 45, -9, -9, -9,
+      (5,6,0): 25, 25, 25, 25, 25, 25, 25, -9, -9, -9, -9, -9, -9, -9, -9,
+      (5,6,15): -9, -9, -9, -9,
+      (5,7,0): 25, 25, 25, 25, 25, 25, 25, -9, -9, -9, -9, -9, -9, -9, -9,
+      (5,7,15): -9, -9, -9, -9,
+      (5,8,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 55, 55, 55,
+      (5,8,15): 55, 55, 55, 55,
+      (5,9,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 55, 55, 55,
+      (5,9,15): 55, 55, 55, 55,
+      (5,10,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 55, 55, 55,
+      (5,10,15): 55, 55, 55, 55,
+      (5,11,0): -9, -9, -9, -9, 35, 35, 35, 35, 35, 35, 35, -9, -9, -9, -9,
+      (5,11,15): -9, -9, -9, -9,
+      (5,12,0): -9, -9, -9, -9, 35, 35, 35, 35, 35, 35, 35, -9, -9, -9, -9,
+      (5,12,15): -9, -9, -9, -9
+      }
+   }
+}
+}
diff --git a/tools/testfiles/vds/tvds-3_2.ls b/tools/testfiles/vds/tvds-3_2.ls
new file mode 100644
index 0000000..a4ad84f
--- /dev/null
+++ b/tools/testfiles/vds/tvds-3_2.ls
@@ -0,0 +1,13 @@
+Opened "3_2_vds.h5" with sec2 driver.
+vds_dset                 Dataset {6/Inf, 13/13, 19/19}
+    Location:  1:800
+    Links:     1
+    Maps:      {5} Source {
+                      2_a.h5   /source_dset
+                      2_b.h5   /source_dset
+                      2_c.h5   /source_dset
+                      2_d.h5   /source_dset
+                      2_e.h5   /source_dset
+               }
+    Storage:   5928 logical bytes, 0 allocated bytes
+    Type:      32-bit little-endian integer
diff --git a/tools/testfiles/vds/tvds-4.ddl b/tools/testfiles/vds/tvds-4.ddl
new file mode 100644
index 0000000..1832724
--- /dev/null
+++ b/tools/testfiles/vds/tvds-4.ddl
@@ -0,0 +1,46 @@
+HDF5 "4_vds.h5" {
+GROUP "/" {
+   DATASET "vds_dset" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 9, 4, 4 ) / ( H5S_UNLIMITED, 4, 4 ) }
+      DATA {
+      (0,0,0): 10, 10, 10, 10,
+      (0,1,0): 10, 10, 10, 10,
+      (0,2,0): 10, 10, 10, 10,
+      (0,3,0): 10, 10, 10, 10,
+      (1,0,0): 11, 11, 11, 11,
+      (1,1,0): 11, 11, 11, 11,
+      (1,2,0): 11, 11, 11, 11,
+      (1,3,0): 11, 11, 11, 11,
+      (2,0,0): 12, 12, 12, 12,
+      (2,1,0): 12, 12, 12, 12,
+      (2,2,0): 12, 12, 12, 12,
+      (2,3,0): 12, 12, 12, 12,
+      (3,0,0): 20, 20, 20, 20,
+      (3,1,0): 20, 20, 20, 20,
+      (3,2,0): 20, 20, 20, 20,
+      (3,3,0): 20, 20, 20, 20,
+      (4,0,0): 21, 21, 21, 21,
+      (4,1,0): 21, 21, 21, 21,
+      (4,2,0): 21, 21, 21, 21,
+      (4,3,0): 21, 21, 21, 21,
+      (5,0,0): 22, 22, 22, 22,
+      (5,1,0): 22, 22, 22, 22,
+      (5,2,0): 22, 22, 22, 22,
+      (5,3,0): 22, 22, 22, 22,
+      (6,0,0): 30, 30, 30, 30,
+      (6,1,0): 30, 30, 30, 30,
+      (6,2,0): 30, 30, 30, 30,
+      (6,3,0): 30, 30, 30, 30,
+      (7,0,0): 31, 31, 31, 31,
+      (7,1,0): 31, 31, 31, 31,
+      (7,2,0): 31, 31, 31, 31,
+      (7,3,0): 31, 31, 31, 31,
+      (8,0,0): 32, 32, 32, 32,
+      (8,1,0): 32, 32, 32, 32,
+      (8,2,0): 32, 32, 32, 32,
+      (8,3,0): 32, 32, 32, 32
+      }
+   }
+}
+}
diff --git a/tools/testfiles/vds/tvds-4.ls b/tools/testfiles/vds/tvds-4.ls
new file mode 100644
index 0000000..176529b
--- /dev/null
+++ b/tools/testfiles/vds/tvds-4.ls
@@ -0,0 +1,9 @@
+Opened "4_vds.h5" with sec2 driver.
+vds_dset                 Dataset {9/Inf, 4/4, 4/4}
+    Location:  1:800
+    Links:     1
+    Maps:      {1} Source {
+                      4_%b.h5   /source_dset
+               }
+    Storage:   576 logical bytes, 0 allocated bytes
+    Type:      32-bit little-endian integer
diff --git a/tools/testfiles/vds/tvds-5.ddl b/tools/testfiles/vds/tvds-5.ddl
new file mode 100644
index 0000000..f59017b
--- /dev/null
+++ b/tools/testfiles/vds/tvds-5.ddl
@@ -0,0 +1,46 @@
+HDF5 "5_vds.h5" {
+GROUP "/" {
+   DATASET "vds_dset" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 9, 4, 4 ) / ( H5S_UNLIMITED, 4, 4 ) }
+      DATA {
+      (0,0,0): 10, 10, 10, 10,
+      (0,1,0): 10, 10, 10, 10,
+      (0,2,0): 10, 10, 10, 10,
+      (0,3,0): 10, 10, 10, 10,
+      (1,0,0): 20, 20, 20, 20,
+      (1,1,0): 20, 20, 20, 20,
+      (1,2,0): 20, 20, 20, 20,
+      (1,3,0): 20, 20, 20, 20,
+      (2,0,0): 30, 30, 30, 30,
+      (2,1,0): 30, 30, 30, 30,
+      (2,2,0): 30, 30, 30, 30,
+      (2,3,0): 30, 30, 30, 30,
+      (3,0,0): 11, 11, 11, 11,
+      (3,1,0): 11, 11, 11, 11,
+      (3,2,0): 11, 11, 11, 11,
+      (3,3,0): 11, 11, 11, 11,
+      (4,0,0): 21, 21, 21, 21,
+      (4,1,0): 21, 21, 21, 21,
+      (4,2,0): 21, 21, 21, 21,
+      (4,3,0): 21, 21, 21, 21,
+      (5,0,0): 31, 31, 31, 31,
+      (5,1,0): 31, 31, 31, 31,
+      (5,2,0): 31, 31, 31, 31,
+      (5,3,0): 31, 31, 31, 31,
+      (6,0,0): 12, 12, 12, 12,
+      (6,1,0): 12, 12, 12, 12,
+      (6,2,0): 12, 12, 12, 12,
+      (6,3,0): 12, 12, 12, 12,
+      (7,0,0): 22, 22, 22, 22,
+      (7,1,0): 22, 22, 22, 22,
+      (7,2,0): 22, 22, 22, 22,
+      (7,3,0): 22, 22, 22, 22,
+      (8,0,0): 32, 32, 32, 32,
+      (8,1,0): 32, 32, 32, 32,
+      (8,2,0): 32, 32, 32, 32,
+      (8,3,0): 32, 32, 32, 32
+      }
+   }
+}
+}
diff --git a/tools/testfiles/vds/tvds-5.ls b/tools/testfiles/vds/tvds-5.ls
new file mode 100644
index 0000000..5f98e84
--- /dev/null
+++ b/tools/testfiles/vds/tvds-5.ls
@@ -0,0 +1,11 @@
+Opened "5_vds.h5" with sec2 driver.
+vds_dset                 Dataset {9/Inf, 4/4, 4/4}
+    Location:  1:800
+    Links:     1
+    Maps:      {3} Source {
+                      5_a.h5   /source_dset
+                      5_b.h5   /source_dset
+                      5_c.h5   /source_dset
+               }
+    Storage:   576 logical bytes, 0 allocated bytes
+    Type:      32-bit little-endian integer
diff --git a/tools/testfiles/vds/tvds_layout-1.ddl b/tools/testfiles/vds/tvds_layout-1.ddl
new file mode 100644
index 0000000..5d8a62c
--- /dev/null
+++ b/tools/testfiles/vds/tvds_layout-1.ddl
@@ -0,0 +1,232 @@
+HDF5 "1_vds.h5" {
+GROUP "/" {
+   DATASET "vds_dset" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 5, 18, 8 ) / ( H5S_UNLIMITED, 18, 8 ) }
+      STORAGE_LAYOUT {
+         MAPPING 0 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,8)
+               }
+            }
+            SOURCE {
+               FILE "1_a.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,8)
+               }
+            }
+         }
+         MAPPING 1 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,2,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,4,8)
+               }
+            }
+            SOURCE {
+               FILE "1_b.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,4,8)
+               }
+            }
+         }
+         MAPPING 2 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,6,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,8)
+               }
+            }
+            SOURCE {
+               FILE "1_c.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,8)
+               }
+            }
+         }
+         MAPPING 3 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,8,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,4,8)
+               }
+            }
+            SOURCE {
+               FILE "1_d.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,4,8)
+               }
+            }
+         }
+         MAPPING 4 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,12,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,8)
+               }
+            }
+            SOURCE {
+               FILE "1_e.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,8)
+               }
+            }
+         }
+         MAPPING 5 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,14,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,4,8)
+               }
+            }
+            SOURCE {
+               FILE "1_f.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,4,8)
+               }
+            }
+         }
+      }
+      FILTERS {
+         NONE
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  -9
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+      DATA {
+      (0,0,0): 10, 10, 10, 10, 10, 10, 10, 10,
+      (0,1,0): 10, 10, 10, 10, 10, 10, 10, 10,
+      (0,2,0): 20, 20, 20, 20, 20, 20, 20, 20,
+      (0,3,0): 20, 20, 20, 20, 20, 20, 20, 20,
+      (0,4,0): 20, 20, 20, 20, 20, 20, 20, 20,
+      (0,5,0): 20, 20, 20, 20, 20, 20, 20, 20,
+      (0,6,0): 30, 30, 30, 30, 30, 30, 30, 30,
+      (0,7,0): 30, 30, 30, 30, 30, 30, 30, 30,
+      (0,8,0): 40, 40, 40, 40, 40, 40, 40, 40,
+      (0,9,0): 40, 40, 40, 40, 40, 40, 40, 40,
+      (0,10,0): 40, 40, 40, 40, 40, 40, 40, 40,
+      (0,11,0): 40, 40, 40, 40, 40, 40, 40, 40,
+      (0,12,0): 50, 50, 50, 50, 50, 50, 50, 50,
+      (0,13,0): 50, 50, 50, 50, 50, 50, 50, 50,
+      (0,14,0): 60, 60, 60, 60, 60, 60, 60, 60,
+      (0,15,0): 60, 60, 60, 60, 60, 60, 60, 60,
+      (0,16,0): 60, 60, 60, 60, 60, 60, 60, 60,
+      (0,17,0): 60, 60, 60, 60, 60, 60, 60, 60,
+      (1,0,0): 11, 11, 11, 11, 11, 11, 11, 11,
+      (1,1,0): 11, 11, 11, 11, 11, 11, 11, 11,
+      (1,2,0): 21, 21, 21, 21, 21, 21, 21, 21,
+      (1,3,0): 21, 21, 21, 21, 21, 21, 21, 21,
+      (1,4,0): 21, 21, 21, 21, 21, 21, 21, 21,
+      (1,5,0): 21, 21, 21, 21, 21, 21, 21, 21,
+      (1,6,0): 31, 31, 31, 31, 31, 31, 31, 31,
+      (1,7,0): 31, 31, 31, 31, 31, 31, 31, 31,
+      (1,8,0): 41, 41, 41, 41, 41, 41, 41, 41,
+      (1,9,0): 41, 41, 41, 41, 41, 41, 41, 41,
+      (1,10,0): 41, 41, 41, 41, 41, 41, 41, 41,
+      (1,11,0): 41, 41, 41, 41, 41, 41, 41, 41,
+      (1,12,0): 51, 51, 51, 51, 51, 51, 51, 51,
+      (1,13,0): 51, 51, 51, 51, 51, 51, 51, 51,
+      (1,14,0): 61, 61, 61, 61, 61, 61, 61, 61,
+      (1,15,0): 61, 61, 61, 61, 61, 61, 61, 61,
+      (1,16,0): 61, 61, 61, 61, 61, 61, 61, 61,
+      (1,17,0): 61, 61, 61, 61, 61, 61, 61, 61,
+      (2,0,0): 12, 12, 12, 12, 12, 12, 12, 12,
+      (2,1,0): 12, 12, 12, 12, 12, 12, 12, 12,
+      (2,2,0): 22, 22, 22, 22, 22, 22, 22, 22,
+      (2,3,0): 22, 22, 22, 22, 22, 22, 22, 22,
+      (2,4,0): 22, 22, 22, 22, 22, 22, 22, 22,
+      (2,5,0): 22, 22, 22, 22, 22, 22, 22, 22,
+      (2,6,0): 32, 32, 32, 32, 32, 32, 32, 32,
+      (2,7,0): 32, 32, 32, 32, 32, 32, 32, 32,
+      (2,8,0): 42, 42, 42, 42, 42, 42, 42, 42,
+      (2,9,0): 42, 42, 42, 42, 42, 42, 42, 42,
+      (2,10,0): 42, 42, 42, 42, 42, 42, 42, 42,
+      (2,11,0): 42, 42, 42, 42, 42, 42, 42, 42,
+      (2,12,0): 52, 52, 52, 52, 52, 52, 52, 52,
+      (2,13,0): 52, 52, 52, 52, 52, 52, 52, 52,
+      (2,14,0): 62, 62, 62, 62, 62, 62, 62, 62,
+      (2,15,0): 62, 62, 62, 62, 62, 62, 62, 62,
+      (2,16,0): 62, 62, 62, 62, 62, 62, 62, 62,
+      (2,17,0): 62, 62, 62, 62, 62, 62, 62, 62,
+      (3,0,0): 13, 13, 13, 13, 13, 13, 13, 13,
+      (3,1,0): 13, 13, 13, 13, 13, 13, 13, 13,
+      (3,2,0): 23, 23, 23, 23, 23, 23, 23, 23,
+      (3,3,0): 23, 23, 23, 23, 23, 23, 23, 23,
+      (3,4,0): 23, 23, 23, 23, 23, 23, 23, 23,
+      (3,5,0): 23, 23, 23, 23, 23, 23, 23, 23,
+      (3,6,0): 33, 33, 33, 33, 33, 33, 33, 33,
+      (3,7,0): 33, 33, 33, 33, 33, 33, 33, 33,
+      (3,8,0): 43, 43, 43, 43, 43, 43, 43, 43,
+      (3,9,0): 43, 43, 43, 43, 43, 43, 43, 43,
+      (3,10,0): 43, 43, 43, 43, 43, 43, 43, 43,
+      (3,11,0): 43, 43, 43, 43, 43, 43, 43, 43,
+      (3,12,0): 53, 53, 53, 53, 53, 53, 53, 53,
+      (3,13,0): 53, 53, 53, 53, 53, 53, 53, 53,
+      (3,14,0): 63, 63, 63, 63, 63, 63, 63, 63,
+      (3,15,0): 63, 63, 63, 63, 63, 63, 63, 63,
+      (3,16,0): 63, 63, 63, 63, 63, 63, 63, 63,
+      (3,17,0): 63, 63, 63, 63, 63, 63, 63, 63,
+      (4,0,0): 14, 14, 14, 14, 14, 14, 14, 14,
+      (4,1,0): 14, 14, 14, 14, 14, 14, 14, 14,
+      (4,2,0): 24, 24, 24, 24, 24, 24, 24, 24,
+      (4,3,0): 24, 24, 24, 24, 24, 24, 24, 24,
+      (4,4,0): 24, 24, 24, 24, 24, 24, 24, 24,
+      (4,5,0): 24, 24, 24, 24, 24, 24, 24, 24,
+      (4,6,0): 34, 34, 34, 34, 34, 34, 34, 34,
+      (4,7,0): 34, 34, 34, 34, 34, 34, 34, 34,
+      (4,8,0): 44, 44, 44, 44, 44, 44, 44, 44,
+      (4,9,0): 44, 44, 44, 44, 44, 44, 44, 44,
+      (4,10,0): 44, 44, 44, 44, 44, 44, 44, 44,
+      (4,11,0): 44, 44, 44, 44, 44, 44, 44, 44,
+      (4,12,0): 54, 54, 54, 54, 54, 54, 54, 54,
+      (4,13,0): 54, 54, 54, 54, 54, 54, 54, 54,
+      (4,14,0): 64, 64, 64, 64, 64, 64, 64, 64,
+      (4,15,0): 64, 64, 64, 64, 64, 64, 64, 64,
+      (4,16,0): 64, 64, 64, 64, 64, 64, 64, 64,
+      (4,17,0): 64, 64, 64, 64, 64, 64, 64, 64
+      }
+   }
+}
+}
diff --git a/tools/testfiles/vds/tvds_layout-2.ddl b/tools/testfiles/vds/tvds_layout-2.ddl
new file mode 100644
index 0000000..af6b718
--- /dev/null
+++ b/tools/testfiles/vds/tvds_layout-2.ddl
@@ -0,0 +1,170 @@
+HDF5 "2_vds.h5" {
+GROUP "/" {
+   DATASET "vds_dset" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 6, 8, 14 ) / ( H5S_UNLIMITED, 8, 14 ) }
+      STORAGE_LAYOUT {
+         MAPPING 0 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,7)
+               }
+            }
+            SOURCE {
+               FILE "2_a.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,7)
+               }
+            }
+         }
+         MAPPING 1 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,2,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,4,7)
+               }
+            }
+            SOURCE {
+               FILE "2_b.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,4,7)
+               }
+            }
+         }
+         MAPPING 2 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,6,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,7)
+               }
+            }
+            SOURCE {
+               FILE "2_c.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,7)
+               }
+            }
+         }
+         MAPPING 3 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,7)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,5,7)
+               }
+            }
+            SOURCE {
+               FILE "2_d.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,5,7)
+               }
+            }
+         }
+         MAPPING 4 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,5,7)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,3,7)
+               }
+            }
+            SOURCE {
+               FILE "2_e.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,3,7)
+               }
+            }
+         }
+      }
+      FILTERS {
+         NONE
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  -9
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+      DATA {
+      (0,0,0): 10, 10, 10, 10, 10, 10, 10, 40, 40, 40, 40, 40, 40, 40,
+      (0,1,0): 10, 10, 10, 10, 10, 10, 10, 40, 40, 40, 40, 40, 40, 40,
+      (0,2,0): 20, 20, 20, 20, 20, 20, 20, 40, 40, 40, 40, 40, 40, 40,
+      (0,3,0): 20, 20, 20, 20, 20, 20, 20, 40, 40, 40, 40, 40, 40, 40,
+      (0,4,0): 20, 20, 20, 20, 20, 20, 20, 40, 40, 40, 40, 40, 40, 40,
+      (0,5,0): 20, 20, 20, 20, 20, 20, 20, 50, 50, 50, 50, 50, 50, 50,
+      (0,6,0): 30, 30, 30, 30, 30, 30, 30, 50, 50, 50, 50, 50, 50, 50,
+      (0,7,0): 30, 30, 30, 30, 30, 30, 30, 50, 50, 50, 50, 50, 50, 50,
+      (1,0,0): 11, 11, 11, 11, 11, 11, 11, 41, 41, 41, 41, 41, 41, 41,
+      (1,1,0): 11, 11, 11, 11, 11, 11, 11, 41, 41, 41, 41, 41, 41, 41,
+      (1,2,0): 21, 21, 21, 21, 21, 21, 21, 41, 41, 41, 41, 41, 41, 41,
+      (1,3,0): 21, 21, 21, 21, 21, 21, 21, 41, 41, 41, 41, 41, 41, 41,
+      (1,4,0): 21, 21, 21, 21, 21, 21, 21, 41, 41, 41, 41, 41, 41, 41,
+      (1,5,0): 21, 21, 21, 21, 21, 21, 21, 51, 51, 51, 51, 51, 51, 51,
+      (1,6,0): 31, 31, 31, 31, 31, 31, 31, 51, 51, 51, 51, 51, 51, 51,
+      (1,7,0): 31, 31, 31, 31, 31, 31, 31, 51, 51, 51, 51, 51, 51, 51,
+      (2,0,0): 12, 12, 12, 12, 12, 12, 12, 42, 42, 42, 42, 42, 42, 42,
+      (2,1,0): 12, 12, 12, 12, 12, 12, 12, 42, 42, 42, 42, 42, 42, 42,
+      (2,2,0): 22, 22, 22, 22, 22, 22, 22, 42, 42, 42, 42, 42, 42, 42,
+      (2,3,0): 22, 22, 22, 22, 22, 22, 22, 42, 42, 42, 42, 42, 42, 42,
+      (2,4,0): 22, 22, 22, 22, 22, 22, 22, 42, 42, 42, 42, 42, 42, 42,
+      (2,5,0): 22, 22, 22, 22, 22, 22, 22, 52, 52, 52, 52, 52, 52, 52,
+      (2,6,0): 32, 32, 32, 32, 32, 32, 32, 52, 52, 52, 52, 52, 52, 52,
+      (2,7,0): 32, 32, 32, 32, 32, 32, 32, 52, 52, 52, 52, 52, 52, 52,
+      (3,0,0): 13, 13, 13, 13, 13, 13, 13, 43, 43, 43, 43, 43, 43, 43,
+      (3,1,0): 13, 13, 13, 13, 13, 13, 13, 43, 43, 43, 43, 43, 43, 43,
+      (3,2,0): 23, 23, 23, 23, 23, 23, 23, 43, 43, 43, 43, 43, 43, 43,
+      (3,3,0): 23, 23, 23, 23, 23, 23, 23, 43, 43, 43, 43, 43, 43, 43,
+      (3,4,0): 23, 23, 23, 23, 23, 23, 23, 43, 43, 43, 43, 43, 43, 43,
+      (3,5,0): 23, 23, 23, 23, 23, 23, 23, 53, 53, 53, 53, 53, 53, 53,
+      (3,6,0): 33, 33, 33, 33, 33, 33, 33, 53, 53, 53, 53, 53, 53, 53,
+      (3,7,0): 33, 33, 33, 33, 33, 33, 33, 53, 53, 53, 53, 53, 53, 53,
+      (4,0,0): 14, 14, 14, 14, 14, 14, 14, 44, 44, 44, 44, 44, 44, 44,
+      (4,1,0): 14, 14, 14, 14, 14, 14, 14, 44, 44, 44, 44, 44, 44, 44,
+      (4,2,0): 24, 24, 24, 24, 24, 24, 24, 44, 44, 44, 44, 44, 44, 44,
+      (4,3,0): 24, 24, 24, 24, 24, 24, 24, 44, 44, 44, 44, 44, 44, 44,
+      (4,4,0): 24, 24, 24, 24, 24, 24, 24, 44, 44, 44, 44, 44, 44, 44,
+      (4,5,0): 24, 24, 24, 24, 24, 24, 24, 54, 54, 54, 54, 54, 54, 54,
+      (4,6,0): 34, 34, 34, 34, 34, 34, 34, 54, 54, 54, 54, 54, 54, 54,
+      (4,7,0): 34, 34, 34, 34, 34, 34, 34, 54, 54, 54, 54, 54, 54, 54,
+      (5,0,0): 15, 15, 15, 15, 15, 15, 15, 45, 45, 45, 45, 45, 45, 45,
+      (5,1,0): 15, 15, 15, 15, 15, 15, 15, 45, 45, 45, 45, 45, 45, 45,
+      (5,2,0): 25, 25, 25, 25, 25, 25, 25, 45, 45, 45, 45, 45, 45, 45,
+      (5,3,0): 25, 25, 25, 25, 25, 25, 25, 45, 45, 45, 45, 45, 45, 45,
+      (5,4,0): 25, 25, 25, 25, 25, 25, 25, 45, 45, 45, 45, 45, 45, 45,
+      (5,5,0): 25, 25, 25, 25, 25, 25, 25, 55, 55, 55, 55, 55, 55, 55,
+      (5,6,0): 35, 35, 35, 35, 35, 35, 35, 55, 55, 55, 55, 55, 55, 55,
+      (5,7,0): 35, 35, 35, 35, 35, 35, 35, 55, 55, 55, 55, 55, 55, 55
+      }
+   }
+}
+}
diff --git a/tools/testfiles/vds/tvds_layout-3_1.ddl b/tools/testfiles/vds/tvds_layout-3_1.ddl
new file mode 100644
index 0000000..968327d
--- /dev/null
+++ b/tools/testfiles/vds/tvds_layout-3_1.ddl
@@ -0,0 +1,267 @@
+HDF5 "3_1_vds.h5" {
+GROUP "/" {
+   DATASET "vds_dset" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 5, 25, 8 ) / ( H5S_UNLIMITED, 25, 8 ) }
+      STORAGE_LAYOUT {
+         MAPPING 0 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,1,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,8)
+               }
+            }
+            SOURCE {
+               FILE "1_a.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,8)
+               }
+            }
+         }
+         MAPPING 1 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,4,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,4,8)
+               }
+            }
+            SOURCE {
+               FILE "1_b.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,4,8)
+               }
+            }
+         }
+         MAPPING 2 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,9,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,8)
+               }
+            }
+            SOURCE {
+               FILE "1_c.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,8)
+               }
+            }
+         }
+         MAPPING 3 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,12,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,4,8)
+               }
+            }
+            SOURCE {
+               FILE "1_d.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,4,8)
+               }
+            }
+         }
+         MAPPING 4 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,17,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,8)
+               }
+            }
+            SOURCE {
+               FILE "1_e.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,8)
+               }
+            }
+         }
+         MAPPING 5 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,20,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,4,8)
+               }
+            }
+            SOURCE {
+               FILE "1_f.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,4,8)
+               }
+            }
+         }
+      }
+      FILTERS {
+         NONE
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  -9
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+      DATA {
+      (0,0,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (0,1,0): 10, 10, 10, 10, 10, 10, 10, 10,
+      (0,2,0): 10, 10, 10, 10, 10, 10, 10, 10,
+      (0,3,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (0,4,0): 20, 20, 20, 20, 20, 20, 20, 20,
+      (0,5,0): 20, 20, 20, 20, 20, 20, 20, 20,
+      (0,6,0): 20, 20, 20, 20, 20, 20, 20, 20,
+      (0,7,0): 20, 20, 20, 20, 20, 20, 20, 20,
+      (0,8,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (0,9,0): 30, 30, 30, 30, 30, 30, 30, 30,
+      (0,10,0): 30, 30, 30, 30, 30, 30, 30, 30,
+      (0,11,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (0,12,0): 40, 40, 40, 40, 40, 40, 40, 40,
+      (0,13,0): 40, 40, 40, 40, 40, 40, 40, 40,
+      (0,14,0): 40, 40, 40, 40, 40, 40, 40, 40,
+      (0,15,0): 40, 40, 40, 40, 40, 40, 40, 40,
+      (0,16,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (0,17,0): 50, 50, 50, 50, 50, 50, 50, 50,
+      (0,18,0): 50, 50, 50, 50, 50, 50, 50, 50,
+      (0,19,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (0,20,0): 60, 60, 60, 60, 60, 60, 60, 60,
+      (0,21,0): 60, 60, 60, 60, 60, 60, 60, 60,
+      (0,22,0): 60, 60, 60, 60, 60, 60, 60, 60,
+      (0,23,0): 60, 60, 60, 60, 60, 60, 60, 60,
+      (0,24,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,0,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,1,0): 11, 11, 11, 11, 11, 11, 11, 11,
+      (1,2,0): 11, 11, 11, 11, 11, 11, 11, 11,
+      (1,3,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,4,0): 21, 21, 21, 21, 21, 21, 21, 21,
+      (1,5,0): 21, 21, 21, 21, 21, 21, 21, 21,
+      (1,6,0): 21, 21, 21, 21, 21, 21, 21, 21,
+      (1,7,0): 21, 21, 21, 21, 21, 21, 21, 21,
+      (1,8,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,9,0): 31, 31, 31, 31, 31, 31, 31, 31,
+      (1,10,0): 31, 31, 31, 31, 31, 31, 31, 31,
+      (1,11,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,12,0): 41, 41, 41, 41, 41, 41, 41, 41,
+      (1,13,0): 41, 41, 41, 41, 41, 41, 41, 41,
+      (1,14,0): 41, 41, 41, 41, 41, 41, 41, 41,
+      (1,15,0): 41, 41, 41, 41, 41, 41, 41, 41,
+      (1,16,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,17,0): 51, 51, 51, 51, 51, 51, 51, 51,
+      (1,18,0): 51, 51, 51, 51, 51, 51, 51, 51,
+      (1,19,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,20,0): 61, 61, 61, 61, 61, 61, 61, 61,
+      (1,21,0): 61, 61, 61, 61, 61, 61, 61, 61,
+      (1,22,0): 61, 61, 61, 61, 61, 61, 61, 61,
+      (1,23,0): 61, 61, 61, 61, 61, 61, 61, 61,
+      (1,24,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,0,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,1,0): 12, 12, 12, 12, 12, 12, 12, 12,
+      (2,2,0): 12, 12, 12, 12, 12, 12, 12, 12,
+      (2,3,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,4,0): 22, 22, 22, 22, 22, 22, 22, 22,
+      (2,5,0): 22, 22, 22, 22, 22, 22, 22, 22,
+      (2,6,0): 22, 22, 22, 22, 22, 22, 22, 22,
+      (2,7,0): 22, 22, 22, 22, 22, 22, 22, 22,
+      (2,8,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,9,0): 32, 32, 32, 32, 32, 32, 32, 32,
+      (2,10,0): 32, 32, 32, 32, 32, 32, 32, 32,
+      (2,11,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,12,0): 42, 42, 42, 42, 42, 42, 42, 42,
+      (2,13,0): 42, 42, 42, 42, 42, 42, 42, 42,
+      (2,14,0): 42, 42, 42, 42, 42, 42, 42, 42,
+      (2,15,0): 42, 42, 42, 42, 42, 42, 42, 42,
+      (2,16,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,17,0): 52, 52, 52, 52, 52, 52, 52, 52,
+      (2,18,0): 52, 52, 52, 52, 52, 52, 52, 52,
+      (2,19,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,20,0): 62, 62, 62, 62, 62, 62, 62, 62,
+      (2,21,0): 62, 62, 62, 62, 62, 62, 62, 62,
+      (2,22,0): 62, 62, 62, 62, 62, 62, 62, 62,
+      (2,23,0): 62, 62, 62, 62, 62, 62, 62, 62,
+      (2,24,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,0,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,1,0): 13, 13, 13, 13, 13, 13, 13, 13,
+      (3,2,0): 13, 13, 13, 13, 13, 13, 13, 13,
+      (3,3,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,4,0): 23, 23, 23, 23, 23, 23, 23, 23,
+      (3,5,0): 23, 23, 23, 23, 23, 23, 23, 23,
+      (3,6,0): 23, 23, 23, 23, 23, 23, 23, 23,
+      (3,7,0): 23, 23, 23, 23, 23, 23, 23, 23,
+      (3,8,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,9,0): 33, 33, 33, 33, 33, 33, 33, 33,
+      (3,10,0): 33, 33, 33, 33, 33, 33, 33, 33,
+      (3,11,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,12,0): 43, 43, 43, 43, 43, 43, 43, 43,
+      (3,13,0): 43, 43, 43, 43, 43, 43, 43, 43,
+      (3,14,0): 43, 43, 43, 43, 43, 43, 43, 43,
+      (3,15,0): 43, 43, 43, 43, 43, 43, 43, 43,
+      (3,16,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,17,0): 53, 53, 53, 53, 53, 53, 53, 53,
+      (3,18,0): 53, 53, 53, 53, 53, 53, 53, 53,
+      (3,19,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,20,0): 63, 63, 63, 63, 63, 63, 63, 63,
+      (3,21,0): 63, 63, 63, 63, 63, 63, 63, 63,
+      (3,22,0): 63, 63, 63, 63, 63, 63, 63, 63,
+      (3,23,0): 63, 63, 63, 63, 63, 63, 63, 63,
+      (3,24,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,0,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,1,0): 14, 14, 14, 14, 14, 14, 14, 14,
+      (4,2,0): 14, 14, 14, 14, 14, 14, 14, 14,
+      (4,3,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,4,0): 24, 24, 24, 24, 24, 24, 24, 24,
+      (4,5,0): 24, 24, 24, 24, 24, 24, 24, 24,
+      (4,6,0): 24, 24, 24, 24, 24, 24, 24, 24,
+      (4,7,0): 24, 24, 24, 24, 24, 24, 24, 24,
+      (4,8,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,9,0): 34, 34, 34, 34, 34, 34, 34, 34,
+      (4,10,0): 34, 34, 34, 34, 34, 34, 34, 34,
+      (4,11,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,12,0): 44, 44, 44, 44, 44, 44, 44, 44,
+      (4,13,0): 44, 44, 44, 44, 44, 44, 44, 44,
+      (4,14,0): 44, 44, 44, 44, 44, 44, 44, 44,
+      (4,15,0): 44, 44, 44, 44, 44, 44, 44, 44,
+      (4,16,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,17,0): 54, 54, 54, 54, 54, 54, 54, 54,
+      (4,18,0): 54, 54, 54, 54, 54, 54, 54, 54,
+      (4,19,0): -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,20,0): 64, 64, 64, 64, 64, 64, 64, 64,
+      (4,21,0): 64, 64, 64, 64, 64, 64, 64, 64,
+      (4,22,0): 64, 64, 64, 64, 64, 64, 64, 64,
+      (4,23,0): 64, 64, 64, 64, 64, 64, 64, 64,
+      (4,24,0): -9, -9, -9, -9, -9, -9, -9, -9
+      }
+   }
+}
+}
diff --git a/tools/testfiles/vds/tvds_layout-3_2.ddl b/tools/testfiles/vds/tvds_layout-3_2.ddl
new file mode 100644
index 0000000..7e14ec2
--- /dev/null
+++ b/tools/testfiles/vds/tvds_layout-3_2.ddl
@@ -0,0 +1,278 @@
+HDF5 "3_2_vds.h5" {
+GROUP "/" {
+   DATASET "vds_dset" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 6, 13, 19 ) / ( H5S_UNLIMITED, 13, 19 ) }
+      STORAGE_LAYOUT {
+         MAPPING 0 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,1,1)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,7)
+               }
+            }
+            SOURCE {
+               FILE "2_a.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,7)
+               }
+            }
+         }
+         MAPPING 1 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,4,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,4,7)
+               }
+            }
+            SOURCE {
+               FILE "2_b.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,4,7)
+               }
+            }
+         }
+         MAPPING 2 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,11,4)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,7)
+               }
+            }
+            SOURCE {
+               FILE "2_c.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,2,7)
+               }
+            }
+         }
+         MAPPING 3 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,1,9)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,5,7)
+               }
+            }
+            SOURCE {
+               FILE "2_d.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,5,7)
+               }
+            }
+         }
+         MAPPING 4 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,8,12)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,3,7)
+               }
+            }
+            SOURCE {
+               FILE "2_e.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,3,7)
+               }
+            }
+         }
+      }
+      FILTERS {
+         NONE
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  -9
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+      DATA {
+      (0,0,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9,
+      (0,0,15): -9, -9, -9, -9,
+      (0,1,0): -9, 10, 10, 10, 10, 10, 10, 10, -9, 40, 40, 40, 40, 40, 40,
+      (0,1,15): 40, -9, -9, -9,
+      (0,2,0): -9, 10, 10, 10, 10, 10, 10, 10, -9, 40, 40, 40, 40, 40, 40,
+      (0,2,15): 40, -9, -9, -9,
+      (0,3,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, 40, 40, 40, 40, 40, 40,
+      (0,3,15): 40, -9, -9, -9,
+      (0,4,0): 20, 20, 20, 20, 20, 20, 20, -9, -9, 40, 40, 40, 40, 40, 40,
+      (0,4,15): 40, -9, -9, -9,
+      (0,5,0): 20, 20, 20, 20, 20, 20, 20, -9, -9, 40, 40, 40, 40, 40, 40,
+      (0,5,15): 40, -9, -9, -9,
+      (0,6,0): 20, 20, 20, 20, 20, 20, 20, -9, -9, -9, -9, -9, -9, -9, -9,
+      (0,6,15): -9, -9, -9, -9,
+      (0,7,0): 20, 20, 20, 20, 20, 20, 20, -9, -9, -9, -9, -9, -9, -9, -9,
+      (0,7,15): -9, -9, -9, -9,
+      (0,8,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 50, 50, 50,
+      (0,8,15): 50, 50, 50, 50,
+      (0,9,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 50, 50, 50,
+      (0,9,15): 50, 50, 50, 50,
+      (0,10,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 50, 50, 50,
+      (0,10,15): 50, 50, 50, 50,
+      (0,11,0): -9, -9, -9, -9, 30, 30, 30, 30, 30, 30, 30, -9, -9, -9, -9,
+      (0,11,15): -9, -9, -9, -9,
+      (0,12,0): -9, -9, -9, -9, 30, 30, 30, 30, 30, 30, 30, -9, -9, -9, -9,
+      (0,12,15): -9, -9, -9, -9,
+      (1,0,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,0,15): -9, -9, -9, -9,
+      (1,1,0): -9, 11, 11, 11, 11, 11, 11, 11, -9, 41, 41, 41, 41, 41, 41,
+      (1,1,15): 41, -9, -9, -9,
+      (1,2,0): -9, 11, 11, 11, 11, 11, 11, 11, -9, 41, 41, 41, 41, 41, 41,
+      (1,2,15): 41, -9, -9, -9,
+      (1,3,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, 41, 41, 41, 41, 41, 41,
+      (1,3,15): 41, -9, -9, -9,
+      (1,4,0): 21, 21, 21, 21, 21, 21, 21, -9, -9, 41, 41, 41, 41, 41, 41,
+      (1,4,15): 41, -9, -9, -9,
+      (1,5,0): 21, 21, 21, 21, 21, 21, 21, -9, -9, 41, 41, 41, 41, 41, 41,
+      (1,5,15): 41, -9, -9, -9,
+      (1,6,0): 21, 21, 21, 21, 21, 21, 21, -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,6,15): -9, -9, -9, -9,
+      (1,7,0): 21, 21, 21, 21, 21, 21, 21, -9, -9, -9, -9, -9, -9, -9, -9,
+      (1,7,15): -9, -9, -9, -9,
+      (1,8,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 51, 51, 51,
+      (1,8,15): 51, 51, 51, 51,
+      (1,9,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 51, 51, 51,
+      (1,9,15): 51, 51, 51, 51,
+      (1,10,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 51, 51, 51,
+      (1,10,15): 51, 51, 51, 51,
+      (1,11,0): -9, -9, -9, -9, 31, 31, 31, 31, 31, 31, 31, -9, -9, -9, -9,
+      (1,11,15): -9, -9, -9, -9,
+      (1,12,0): -9, -9, -9, -9, 31, 31, 31, 31, 31, 31, 31, -9, -9, -9, -9,
+      (1,12,15): -9, -9, -9, -9,
+      (2,0,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,0,15): -9, -9, -9, -9,
+      (2,1,0): -9, 12, 12, 12, 12, 12, 12, 12, -9, 42, 42, 42, 42, 42, 42,
+      (2,1,15): 42, -9, -9, -9,
+      (2,2,0): -9, 12, 12, 12, 12, 12, 12, 12, -9, 42, 42, 42, 42, 42, 42,
+      (2,2,15): 42, -9, -9, -9,
+      (2,3,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, 42, 42, 42, 42, 42, 42,
+      (2,3,15): 42, -9, -9, -9,
+      (2,4,0): 22, 22, 22, 22, 22, 22, 22, -9, -9, 42, 42, 42, 42, 42, 42,
+      (2,4,15): 42, -9, -9, -9,
+      (2,5,0): 22, 22, 22, 22, 22, 22, 22, -9, -9, 42, 42, 42, 42, 42, 42,
+      (2,5,15): 42, -9, -9, -9,
+      (2,6,0): 22, 22, 22, 22, 22, 22, 22, -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,6,15): -9, -9, -9, -9,
+      (2,7,0): 22, 22, 22, 22, 22, 22, 22, -9, -9, -9, -9, -9, -9, -9, -9,
+      (2,7,15): -9, -9, -9, -9,
+      (2,8,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 52, 52, 52,
+      (2,8,15): 52, 52, 52, 52,
+      (2,9,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 52, 52, 52,
+      (2,9,15): 52, 52, 52, 52,
+      (2,10,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 52, 52, 52,
+      (2,10,15): 52, 52, 52, 52,
+      (2,11,0): -9, -9, -9, -9, 32, 32, 32, 32, 32, 32, 32, -9, -9, -9, -9,
+      (2,11,15): -9, -9, -9, -9,
+      (2,12,0): -9, -9, -9, -9, 32, 32, 32, 32, 32, 32, 32, -9, -9, -9, -9,
+      (2,12,15): -9, -9, -9, -9,
+      (3,0,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,0,15): -9, -9, -9, -9,
+      (3,1,0): -9, 13, 13, 13, 13, 13, 13, 13, -9, 43, 43, 43, 43, 43, 43,
+      (3,1,15): 43, -9, -9, -9,
+      (3,2,0): -9, 13, 13, 13, 13, 13, 13, 13, -9, 43, 43, 43, 43, 43, 43,
+      (3,2,15): 43, -9, -9, -9,
+      (3,3,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, 43, 43, 43, 43, 43, 43,
+      (3,3,15): 43, -9, -9, -9,
+      (3,4,0): 23, 23, 23, 23, 23, 23, 23, -9, -9, 43, 43, 43, 43, 43, 43,
+      (3,4,15): 43, -9, -9, -9,
+      (3,5,0): 23, 23, 23, 23, 23, 23, 23, -9, -9, 43, 43, 43, 43, 43, 43,
+      (3,5,15): 43, -9, -9, -9,
+      (3,6,0): 23, 23, 23, 23, 23, 23, 23, -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,6,15): -9, -9, -9, -9,
+      (3,7,0): 23, 23, 23, 23, 23, 23, 23, -9, -9, -9, -9, -9, -9, -9, -9,
+      (3,7,15): -9, -9, -9, -9,
+      (3,8,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 53, 53, 53,
+      (3,8,15): 53, 53, 53, 53,
+      (3,9,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 53, 53, 53,
+      (3,9,15): 53, 53, 53, 53,
+      (3,10,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 53, 53, 53,
+      (3,10,15): 53, 53, 53, 53,
+      (3,11,0): -9, -9, -9, -9, 33, 33, 33, 33, 33, 33, 33, -9, -9, -9, -9,
+      (3,11,15): -9, -9, -9, -9,
+      (3,12,0): -9, -9, -9, -9, 33, 33, 33, 33, 33, 33, 33, -9, -9, -9, -9,
+      (3,12,15): -9, -9, -9, -9,
+      (4,0,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,0,15): -9, -9, -9, -9,
+      (4,1,0): -9, 14, 14, 14, 14, 14, 14, 14, -9, 44, 44, 44, 44, 44, 44,
+      (4,1,15): 44, -9, -9, -9,
+      (4,2,0): -9, 14, 14, 14, 14, 14, 14, 14, -9, 44, 44, 44, 44, 44, 44,
+      (4,2,15): 44, -9, -9, -9,
+      (4,3,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, 44, 44, 44, 44, 44, 44,
+      (4,3,15): 44, -9, -9, -9,
+      (4,4,0): 24, 24, 24, 24, 24, 24, 24, -9, -9, 44, 44, 44, 44, 44, 44,
+      (4,4,15): 44, -9, -9, -9,
+      (4,5,0): 24, 24, 24, 24, 24, 24, 24, -9, -9, 44, 44, 44, 44, 44, 44,
+      (4,5,15): 44, -9, -9, -9,
+      (4,6,0): 24, 24, 24, 24, 24, 24, 24, -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,6,15): -9, -9, -9, -9,
+      (4,7,0): 24, 24, 24, 24, 24, 24, 24, -9, -9, -9, -9, -9, -9, -9, -9,
+      (4,7,15): -9, -9, -9, -9,
+      (4,8,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 54, 54, 54,
+      (4,8,15): 54, 54, 54, 54,
+      (4,9,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 54, 54, 54,
+      (4,9,15): 54, 54, 54, 54,
+      (4,10,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 54, 54, 54,
+      (4,10,15): 54, 54, 54, 54,
+      (4,11,0): -9, -9, -9, -9, 34, 34, 34, 34, 34, 34, 34, -9, -9, -9, -9,
+      (4,11,15): -9, -9, -9, -9,
+      (4,12,0): -9, -9, -9, -9, 34, 34, 34, 34, 34, 34, 34, -9, -9, -9, -9,
+      (4,12,15): -9, -9, -9, -9,
+      (5,0,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9,
+      (5,0,15): -9, -9, -9, -9,
+      (5,1,0): -9, 15, 15, 15, 15, 15, 15, 15, -9, 45, 45, 45, 45, 45, 45,
+      (5,1,15): 45, -9, -9, -9,
+      (5,2,0): -9, 15, 15, 15, 15, 15, 15, 15, -9, 45, 45, 45, 45, 45, 45,
+      (5,2,15): 45, -9, -9, -9,
+      (5,3,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, 45, 45, 45, 45, 45, 45,
+      (5,3,15): 45, -9, -9, -9,
+      (5,4,0): 25, 25, 25, 25, 25, 25, 25, -9, -9, 45, 45, 45, 45, 45, 45,
+      (5,4,15): 45, -9, -9, -9,
+      (5,5,0): 25, 25, 25, 25, 25, 25, 25, -9, -9, 45, 45, 45, 45, 45, 45,
+      (5,5,15): 45, -9, -9, -9,
+      (5,6,0): 25, 25, 25, 25, 25, 25, 25, -9, -9, -9, -9, -9, -9, -9, -9,
+      (5,6,15): -9, -9, -9, -9,
+      (5,7,0): 25, 25, 25, 25, 25, 25, 25, -9, -9, -9, -9, -9, -9, -9, -9,
+      (5,7,15): -9, -9, -9, -9,
+      (5,8,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 55, 55, 55,
+      (5,8,15): 55, 55, 55, 55,
+      (5,9,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 55, 55, 55,
+      (5,9,15): 55, 55, 55, 55,
+      (5,10,0): -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, 55, 55, 55,
+      (5,10,15): 55, 55, 55, 55,
+      (5,11,0): -9, -9, -9, -9, 35, 35, 35, 35, 35, 35, 35, -9, -9, -9, -9,
+      (5,11,15): -9, -9, -9, -9,
+      (5,12,0): -9, -9, -9, -9, 35, 35, 35, 35, 35, 35, 35, -9, -9, -9, -9,
+      (5,12,15): -9, -9, -9, -9
+      }
+   }
+}
+}
diff --git a/tools/testfiles/vds/tvds_layout-4.ddl b/tools/testfiles/vds/tvds_layout-4.ddl
new file mode 100644
index 0000000..018644e
--- /dev/null
+++ b/tools/testfiles/vds/tvds_layout-4.ddl
@@ -0,0 +1,78 @@
+HDF5 "4_vds.h5" {
+GROUP "/" {
+   DATASET "vds_dset" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 9, 4, 4 ) / ( H5S_UNLIMITED, 4, 4 ) }
+      STORAGE_LAYOUT {
+         MAPPING 0 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (3,1,1)
+                  COUNT (H5S_UNLIMITED,1,1)
+                  BLOCK (3,4,4)
+               }
+            }
+            SOURCE {
+               FILE "4_%b.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (3,4,4)
+               }
+            }
+         }
+      }
+      FILTERS {
+         NONE
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  -9
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+      DATA {
+      (0,0,0): 10, 10, 10, 10,
+      (0,1,0): 10, 10, 10, 10,
+      (0,2,0): 10, 10, 10, 10,
+      (0,3,0): 10, 10, 10, 10,
+      (1,0,0): 11, 11, 11, 11,
+      (1,1,0): 11, 11, 11, 11,
+      (1,2,0): 11, 11, 11, 11,
+      (1,3,0): 11, 11, 11, 11,
+      (2,0,0): 12, 12, 12, 12,
+      (2,1,0): 12, 12, 12, 12,
+      (2,2,0): 12, 12, 12, 12,
+      (2,3,0): 12, 12, 12, 12,
+      (3,0,0): 20, 20, 20, 20,
+      (3,1,0): 20, 20, 20, 20,
+      (3,2,0): 20, 20, 20, 20,
+      (3,3,0): 20, 20, 20, 20,
+      (4,0,0): 21, 21, 21, 21,
+      (4,1,0): 21, 21, 21, 21,
+      (4,2,0): 21, 21, 21, 21,
+      (4,3,0): 21, 21, 21, 21,
+      (5,0,0): 22, 22, 22, 22,
+      (5,1,0): 22, 22, 22, 22,
+      (5,2,0): 22, 22, 22, 22,
+      (5,3,0): 22, 22, 22, 22,
+      (6,0,0): 30, 30, 30, 30,
+      (6,1,0): 30, 30, 30, 30,
+      (6,2,0): 30, 30, 30, 30,
+      (6,3,0): 30, 30, 30, 30,
+      (7,0,0): 31, 31, 31, 31,
+      (7,1,0): 31, 31, 31, 31,
+      (7,2,0): 31, 31, 31, 31,
+      (7,3,0): 31, 31, 31, 31,
+      (8,0,0): 32, 32, 32, 32,
+      (8,1,0): 32, 32, 32, 32,
+      (8,2,0): 32, 32, 32, 32,
+      (8,3,0): 32, 32, 32, 32
+      }
+   }
+}
+}
diff --git a/tools/testfiles/vds/tvds_layout-5.ddl b/tools/testfiles/vds/tvds_layout-5.ddl
new file mode 100644
index 0000000..b43629a
--- /dev/null
+++ b/tools/testfiles/vds/tvds_layout-5.ddl
@@ -0,0 +1,118 @@
+HDF5 "5_vds.h5" {
+GROUP "/" {
+   DATASET "vds_dset" {
+      DATATYPE  H5T_STD_I32LE
+      DATASPACE  SIMPLE { ( 9, 4, 4 ) / ( H5S_UNLIMITED, 4, 4 ) }
+      STORAGE_LAYOUT {
+         MAPPING 0 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (3,1,1)
+                  COUNT (H5S_UNLIMITED,1,1)
+                  BLOCK (1,4,4)
+               }
+            }
+            SOURCE {
+               FILE "5_a.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,4,4)
+               }
+            }
+         }
+         MAPPING 1 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (1,0,0)
+                  STRIDE (3,1,1)
+                  COUNT (H5S_UNLIMITED,1,1)
+                  BLOCK (1,4,4)
+               }
+            }
+            SOURCE {
+               FILE "5_b.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,4,4)
+               }
+            }
+         }
+         MAPPING 2 { 
+            VIRTUAL {
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (2,0,0)
+                  STRIDE (3,1,1)
+                  COUNT (H5S_UNLIMITED,1,1)
+                  BLOCK (1,4,4)
+               }
+            }
+            SOURCE {
+               FILE "5_c.h5"
+               DATASET "/source_dset"
+               SELECTION REGULAR_HYPERSLAB { 
+                  START (0,0,0)
+                  STRIDE (1,1,1)
+                  COUNT (1,1,1)
+                  BLOCK (H5S_UNLIMITED,4,4)
+               }
+            }
+         }
+      }
+      FILTERS {
+         NONE
+      }
+      FILLVALUE {
+         FILL_TIME H5D_FILL_TIME_IFSET
+         VALUE  -9
+      }
+      ALLOCATION_TIME {
+         H5D_ALLOC_TIME_INCR
+      }
+      DATA {
+      (0,0,0): 10, 10, 10, 10,
+      (0,1,0): 10, 10, 10, 10,
+      (0,2,0): 10, 10, 10, 10,
+      (0,3,0): 10, 10, 10, 10,
+      (1,0,0): 20, 20, 20, 20,
+      (1,1,0): 20, 20, 20, 20,
+      (1,2,0): 20, 20, 20, 20,
+      (1,3,0): 20, 20, 20, 20,
+      (2,0,0): 30, 30, 30, 30,
+      (2,1,0): 30, 30, 30, 30,
+      (2,2,0): 30, 30, 30, 30,
+      (2,3,0): 30, 30, 30, 30,
+      (3,0,0): 11, 11, 11, 11,
+      (3,1,0): 11, 11, 11, 11,
+      (3,2,0): 11, 11, 11, 11,
+      (3,3,0): 11, 11, 11, 11,
+      (4,0,0): 21, 21, 21, 21,
+      (4,1,0): 21, 21, 21, 21,
+      (4,2,0): 21, 21, 21, 21,
+      (4,3,0): 21, 21, 21, 21,
+      (5,0,0): 31, 31, 31, 31,
+      (5,1,0): 31, 31, 31, 31,
+      (5,2,0): 31, 31, 31, 31,
+      (5,3,0): 31, 31, 31, 31,
+      (6,0,0): 12, 12, 12, 12,
+      (6,1,0): 12, 12, 12, 12,
+      (6,2,0): 12, 12, 12, 12,
+      (6,3,0): 12, 12, 12, 12,
+      (7,0,0): 22, 22, 22, 22,
+      (7,1,0): 22, 22, 22, 22,
+      (7,2,0): 22, 22, 22, 22,
+      (7,3,0): 22, 22, 22, 22,
+      (8,0,0): 32, 32, 32, 32,
+      (8,1,0): 32, 32, 32, 32,
+      (8,2,0): 32, 32, 32, 32,
+      (8,3,0): 32, 32, 32, 32
+      }
+   }
+}
+}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/hdf5.git



More information about the Pkg-grass-devel mailing list